ZGlmZiAtLWdpdCBhL1NXLUJDTTY4NjIwXzJfMl8yXzIuemlwIGIvU1ctQkNNNjg2MjBfMl8yXzJfMi56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0NTAxOQotLS0gL2Rldi9udWxsCisrKyBiL1NXLUJDTTY4NjIwXzJfMl8yXzIuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLy5yZWxlYXNlX2J1aWxkIGIvYmFsX3JlbGVhc2UvLnJlbGVhc2VfYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLy5yZWxlYXNlX2J1aWxkCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL01ha2VmaWxlIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTBkZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9NYWtlZmlsZQpAQCAtMCwwICsxLDMwIEBACisjIFN3aXRjaCBTREsgZm9yIEtUMgorIworCitpZm5lcSAoIiQoVEVTVF9TV19VVElMX0xPT1BCQUNLKSIsICJ5IikKKworTU9EX05BTUUgPSBzd2l0Y2hfc2RrCitNT0RfVFlQRSA9IGxpYgorCitNT0RfSU5DX0RJUlMgID0gJChJTkdfU0RLX0RJUikvaW5jbHVkZQorTU9EX0lOQ19ESVJTICArPSAkKElOR19TREtfRElSKS9saWJzL3BoeW1vZC9pbmNsdWRlCitNT0RfTElCU19OT1JFQ19CRUZPUkUgPSAkKHNoZWxsIGNhdCAke0lOR19TREtfRElSfS8uYmNtX29ianMpCitNT0RfTElCUyAgPSAkKHNoZWxsIGNhdCAke0lOR19TREtfRElSfS8uYmNtX2xpYnMpCitNT0RfTElCU19OT1JFQ19BRlRFUiAgPSAkKHNoZWxsIGNhdCAke0lOR19TREtfRElSfS8uYmNtX2xkZmxhZ3MgfCBzZWQgLWUgJ3MvLXN0YXRpYyAvLycpIC1sdXRpbAorCisjIEJ1aWxkaW5nIHdpdGggbGlibmV0Y29uZiByZXF1aXJlcyBzcGVjaWFsIGNhcmUgYmVjYXVzZSBsaWJ4bWwgaW4gYmNtX3NkayBjb25mbGljdHMKKyMgd2l0aCBuZXdlciBsaWJ4bWwyCitpZmVxICgiJChOQ19BR0VOVCkiLCAibGlibmV0Y29uZiIpCisJTU9EX0xJQlMgOj0gJChzdWJzdCAtbHhtbCwsJChNT0RfTElCUykpCisKKwkjIFRoaXMgaXMgdHJpY2t5IGFnYWluLiBTREsgYnVpbGQgY2FuIGluY2x1ZGUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgeG1sX2FwaS5vCisJIyBidWlsdCBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuIFdlIG5lZWQgdG8gcGljayB0aGUgcmlnaHQgb25lLgorCV9hbGxfeG1sX2FwaSA6PSAkKHNoZWxsIGZpbmQgJChJTkdfU0RLX0RJUikgLW5hbWUgeG1sX2FwaS5vKQorCV9hcmNoIDo9ICQoc2hlbGwgZmlsZSAkKGZpcnN0d29yZCAkKE1PRF9MSUJTX05PUkVDX0JFRk9SRSkpIHwgYXdrICd7cHJpbnQgJCQ3fScpCisJX3htbF9hcGkgOj0gJChzaGVsbCBmb3IgYWEgaW4gJChfYWxsX3htbF9hcGkpOyBkbyBfdGVzdF9hcmNoPWBmaWxlICQkYWEgfCBhd2sgJ3twcmludCAkJDd9J2A7IGlmIFtbIFwiJChfYXJjaClcIiA9IFwiJCRfdGVzdF9hcmNoXCIgXV07IHRoZW4gZWNobyAkJGFhOyBmaTsgZG9uZSkgCisJCisJTU9EX0xJQlNfTk9SRUNfQUZURVIgKz0gJChfeG1sX2FwaSkgCitlbmRpZgorCisjIGVuZCBvZiBpZm5lcSAoIiQoVEVTVF9TV19VVElMX0xPT1BCQUNLKSIsICJ5IikKK2VuZGlmCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL01ha2VmaWxlLnNkayBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvTWFrZWZpbGUuc2RrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMTc3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL01ha2VmaWxlLnNkawpAQCAtMCwwICsxLDYwIEBACisjIElORyBTREsKKyMKKworaWZlcSAoIiQoQk9BUkQpIiwgIndyeCIpCisgICAgVEFSR0VUX0RJUiA/PSBzeXN0ZW1zL2xpbnV4L3VzZXIvd3J4LTNfNworZWxzZQorICAgIFRBUkdFVF9ESVIgPz0gc3lzdGVtcy9zaW0KKyAgICBleHBvcnQgQ09ORklHX1NXSVRDSF9SUEM9eQorZW5kaWYKKworZXhwb3J0IEJVSUxEX0lOR19BU19MSUI9MQorZXhwb3J0IFNESz0kKElOR19TREtfRElSKQorCitpZmVxICgiJChCT0FSRCkiLCAid3J4IikKKyAgICBDTURfUEFSTVM9cGxhdGZvcm09d3J4LTNfNyBibGRyb290X3N1ZmZpeD0vd3J4LTNfNyBrZXJuZWxfdmVyc2lvbj0zXzcgTElOVVhfTUFLRV9TSEFSRURfTElCPTAgU0hBUkVETElCVkVSPTEgV1JYXzY0QklUPTEKKyAgICAkKGluZm8gZXZhbHVhdGluZyAkKENNRF9QQVJNUykpIAorICAgICQoZm9yZWFjaCBfY21kLCQoQ01EX1BBUk1TKSwkKGV2YWwgZXhwb3J0ICQoX2NtZCkpKQorICAgIGluY2x1ZGUgJChJTkdfU0RLX0RJUikvc3lzdGVtcy9saW51eC91c2VyL2NvbW1vbi9NYWtlZmlsZQorICAgIEJDTV9MSUJTX0RFUFMgPSB1c2VyX2xpYnMgJChCTERESVIpL3NvY2RpYWcubyAkKEJMRERJUikvdmVyc2lvbi5vICQoUExBVEZPUk1fREVGSU5FU19PQkopICQoS0VSTkVMX0JERSkgJChVU0VSX0JERSkKKyAgICBNQUlOX0xJQiA6PSAkKEJMRERJUikvc29jZGlhZy5vICQoTUFJTl9MSUIpIAorICAgIENHTEFHUyArPSAkKEFSQ0hfRkxBR1MpCisKKyQoQkxERElSKS9zb2NkaWFnLm86OiAkKElOR19TREtfRElSKS9zeXN0ZW1zL2xpbnV4L3VzZXIvY29tbW9uL3NvY2RpYWcuYworCUBta2RpciAtcCAkKEJMRERJUikKKwkkKENDKSAtYyAtbyAkQCAkKENGTEFHUykgJDwKKworZWxzZQorCisgICAgaW5jbHVkZSAkKElOR19TREtfRElSKS8kKFRBUkdFVF9ESVIpL01ha2VmaWxlCisgCitpZmRlZiBEUFBfQ0hJUFMKKyQoTElCRElSKS9saWJjaGlwc2ltX3NpbS4kKGxpYmV4dCk6CisJbWFrZSAtQyAkKElOR19TREtfRElSKS8kKFRBUkdFVF9ESVIpL2RwcC9DaGlwU2ltCitlbmRpZgorCisgICAgQkNNX0xJQlNfREVQUyA9ICQoTUFJTl9MSUIpIF9iZGUgX2JjbV9saWJyYXJpZXMgJChCTERESVIpL3ZlcnNpb24ubyAkKFBMQVRGT1JNX0RFRklORVNfT0JKKSAkKEJDTV9MSUJTX0JMRCkKKworZW5kaWYKKworIyBJTkcgU0RLIGxpbmtzIHZlcnkgc3RyYW5nZS4gSW5zdGVhZCBvZiB1c2luZyAtbCwgYWxsIGxpYnJhcmllcyBhcmUgYWRkZWQgdG8gZXhlY3V0YWJsZSBhcyBvYmplY3RzCisjIGl0IGlzIGJldHRlciB0byBjb252ZXJ0IHRvIC1sIGRpcmVjdGl2ZXMKK0JDTV9MSUJfUEFUSCAJOj0gJChkaXIgJChmaXJzdHdvcmQgJChCQ01fTElCU19CTEQpKSkKK0JDTV9MSUJfTElTVCAJOj0gJChwYXRzdWJzdCBsaWIlLmEsLWwlLCQobm90ZGlyICQoQkNNX0xJQlNfQkxEKSkpCitFWFRSQV9DRkxBR1MgICAgKz0gLVduby1lcnJvcj11bnVzZWQtdmFsdWUgLVduby11bnVzZWQtYnV0LXNldC12YXJpYWJsZSAtV25vLWZvcm1hdC1zZWN1cml0eQorZXhwb3J0IEVYVFJBX0NGTEFHUyAKKworc2RrOiAkKElOR19TREtfRElSKS8uYmNtX2xpYnMKKwllY2hvICJkb25lOiBgbHMgJChJTkdfU0RLX0RJUikvJChUQVJHRVRfRElSKS9gIgorCQorJChJTkdfU0RLX0RJUikvLmJjbV9saWJzOiAkKEJDTV9MSUJTX0RFUFMpCisJZWNobyAiQnVpbGRpbmcgQkNNIFNESyAuLi4gJChUQVJHRVRfRElSKSIKKwlAZWNobyAkKE1BSU5fTElCKSAkKEJMRERJUikvdmVyc2lvbi5vICQoUExBVEZPUk1fREVGSU5FU19PQkopID4gJChJTkdfU0RLX0RJUikvLmJjbV9vYmpzCisJQGVjaG8gLUwkKEJDTV9MSUJfUEFUSCkgJChCQ01fTElCX0xJU1QpID4gJChJTkdfU0RLX0RJUikvLmJjbV9saWJzCisJQGVjaG8gJChMREZMQUdTKSA+ICQoSU5HX1NES19ESVIpLy5iY21fbGRmbGFncworCiskKEJMRERJUikvJS5vOjogJChJTkdfU0RLX0RJUikvJChUQVJHRVRfRElSKS8lLmMKKwlAbWtkaXIgLXAgJChCTERESVIpCisJJChDQykgLWMgLW8gJEAgJChDRkxBR1MpICQ8CisKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9tYWtlL01ha2UubG9jYWwuYWxsIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9tYWtlL01ha2UubG9jYWwuYWxsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmYTQ3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL21ha2UvTWFrZS5sb2NhbC5hbGwKQEAgLTAsMCArMSw1NzEgQEAKKyMgJElkOiBNYWtlLmxvY2FsLnRlbXBsYXRlLHYgMS4xODEgQnJvYWRjb20gU0RLICQKKyMgJENvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24uCisjIFRoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24KKyMgYW5kL29yIGl0cyBsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZAorIyBvciBkaXN0cmlidXRlZCBwdXJzdWFudCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwKKyMgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZCBiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20KKyMgKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4gYW4gQXV0aG9yaXplZAorIyBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKKyMgdG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kCisjIEJyb2FkY29tIGV4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUKKyMgYW5kIGFsbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRQorIyBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUgTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUKKyMgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkgQlJPQURDT00gQU5EIERJU0NPTlRJTlVFCisjIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLiAgCisjICAKKyMgRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyMgIAorIyAxLiAgICAgVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyMgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisjIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsCisjIGFuZCB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZgorIyBCcm9hZGNvbSBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisjICAKKyMgMi4gICAgIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMKKyMgUFJPVklERUQgIkFTIElTIiBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywKKyMgUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksCisjIE9SIE9USEVSV0lTRSwgV0lUSCBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWQorIyBESVNDTEFJTVMgQU5ZIEFORCBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksCisjIE5PTklORlJJTkdFTUVOVCwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywKKyMgQUNDVVJBQ1kgT1IgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IKKyMgQ09SUkVTUE9OREVOQ0UgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcKKyMgT1VUIE9GIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisjIAorIyAzLiAgICAgVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMCisjIEJST0FEQ09NIE9SIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwKKyMgSU5DSURFTlRBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIKKyMgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkKKyMgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCisjIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRgorIyBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRSBTT0ZUV0FSRSBJVFNFTEYgT1IgVVNEIDEuMDAsCisjIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUyBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcKKyMgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZIExJTUlURUQgUkVNRURZLiQKKyMKKworIyBVc2FnZSBmb3IgTWFrZS5sb2NhbC50ZW1wbGF0ZSBhbmQgTWFrZS5sb2NhbDoKKyMKKyMgTWFrZS5sb2NhbC50ZW1wbGF0ZSBpcyBjaGVja2VkIGludG8gdGhlIHRyZWUsIGJ1dCBNYWtlLmxvY2FsIGlzIG5ldmVyCisjIGNoZWNrZWQgaW4uICBDb3B5IE1ha2UubG9jYWwudGVtcGxhdGUgdG8gTWFrZS5sb2NhbCwgdGhlbiBjaGFuZ2UKKyMgTWFrZS5sb2NhbCB0byBzZWxlY3QgdGhlIGRlc2lyZWQgY29tcGlsYXRpb24gb3B0aW9ucyAobW9zdGx5IGRlYnVnZ2luZworIyBmZWF0dXJlcykuCisjCisjIE5vdGUgb24gQ0ZHRkxBR1MgdXNhZ2U6CisjCisjICAgQmVjYXVzZSBDRkdGTEFHUyBtYXkgYmUgdXNlZCB3aXRoIG90aGVyIHNvdXJjZSBwcmVwcm9jZXNzaW5nIHRvb2xzLAorIyAgIHBsZWFzZSBsaW1pdCB0aGUgdmFsdWVzIGFkZGVkIHRvIENGR0ZMQUdTIHRvIC1EIGRlZmluZXMuCisjCisjCisjIFRhYmxlIG9mIENvbnRlbnRzOgorIworIyAgICAgQ29tcGlsZXIgUmVsYXRlZCBPcHRpb25zCisjICAgICBCb290IGFuZCBEZWJ1ZyBSZWxhdGVkIE9wdGlvbnMKKyMgICAgIE9wZXJhdGlvbmFsIGFuZCBQb2xpY3kgT3B0aW9ucworIyAgICAgU3lzdGVtIE1hbmFnZW1lbnQgYW5kIE11bHRpcGxlIENQVSBPcHRpb25zCisjICAgICBTZWxlY3RpdmUgRGV2aWNlIFN1cHBvcnQgKFN3aXRjaGVzIGFuZCBQSFlzKQorIyAgICAgTWlzY2VsbGFuZW91cyBPcHRpb25zCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQ29tcGlsZXIgUmVsYXRlZCBPcHRpb25zCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQ29tcGlsaW5nIG91dCAjaWZkZWYgREVCVUcgY29kZSBzYXZlcyBhYm91dCAxLjMlIG9uIGV4ZWN1dGFibGUgc2l6ZS4KKyMgSXQgaXMgcmVjb21tZW5kZWQgdG8gbGVhdmUgZGVidWcgZW5hYmxlZCB3aGVuIGRldmVsb3BpbmcgYXBwbGljYXRpb25zLgorI0RFQlVHX0lGREVGUz1GQUxTRQorCisjIFNBTCByZXNvdXJjZSB1c2FnZSB0cmFja2luZyAjaWZkZWYgY29udHJvbAorIyBERUJVR19JRkRFRlMgc2hvdWxkIGFsc28gYmUgIFRSVUUgZm9yIHRoaXMgc3dpdGNoIHRvIHRha2UgZWZmZWN0LgorI0JDTV9SRVNPVVJDRV9VU0FHRV9QUk9GSUxFX0lGREVGUz1UUlVFCisKKyMgVW5jb21tZW50IHRvIGJ1aWxkIHdpdGhvdXQgZGVidWcgc3ltYm9scworI0RFQlVHX1NZTUJPTFM9RkFMU0UKKworIyBVbmNvbW1lbnQgdG8gYWRkIHByaXZhdGUgQ0ZMQUdTCisjREVCVUdfQ0ZMQUdTPQorCisjIFVuY29tbWVudCB0byB0dXJuIG9mZiB0aGUgb3B0aW1pemVyIHdoZW4gZGVidWdnaW5nIChyZWNvbW1lbmRlZCkKKyNERUJVR19PUFRJTUlaRT1GQUxTRQorCisjIENvbXBpbGluZyBvdXQgYXNzZXJ0KCkgc2F2ZXMgYWJvdXQgMS4xJSBvbiBleGVjdXRhYmxlIHNpemUsCisjIGhvd2V2ZXIgZG8gc28gaXMgVkVSWSBNVUNIIGRpc2NvdXJhZ2VkLgorI0RFQlVHX0FTU0VSVFM9RkFMU0UKKworIyBDb250cm9sbGluZyBHQ0MgLXBlZGFudGljIGZsYWcKKyNERUJVR19QRURBTlRJQz1UUlVFCisKKyMgY29tcGlsZXIuaCBvdmVycmlkZXMsIHRoZXNlIGRpc2FibGUgdmFyaW91cyBjb21waWxlcgorIyByZWxhdGVkIGZlYXR1cmVzIGV2ZW4gaWYgdGhlIGNvbXBpbGVyIG5vcm1hbGx5IHN1cHBvcnRzIHRoZW0KKworIyBEaXNhYmxlIHVzZSBvZiBsb25nIGxvbmcgZm9yIHVpbnQ2NAorI0NGR0ZMQUdTICs9IC1EQ09NUElMRVJfT1ZFUlJJREVfTk9fTE9OR0xPTkcKKworIyBEaXNhYmxlIHVzZSBvZiBkb3VibGVzCisjQ0ZHRkxBR1MgKz0gLURDT01QSUxFUl9PVkVSUklERV9OT19ET1VCTEUKKworIyBEaXNhYmxlIGlubGluaW5nIG9mIGZ1bmN0aW9ucworI0NGR0ZMQUdTICs9IC1EQ09NUElMRVJfT1ZFUlJJREVfTk9fSU5MSU5FCisKKyMgRGlzYWJsZSB1c2Ugb2YgY29uc3QKKyNDRkdGTEFHUyArPSAtRENPTVBJTEVSX09WRVJSSURFX05PX0NPTlNUCisKKyMgRGlzYWJsZSB1c2Ugb2Ygc3RhdGljIGZ1bmN0aW9ucworI0NGR0ZMQUdTICs9IC1EQ09NUElMRVJfT1ZFUlJJREVfTk9fU1RBVElDCisKKyMgRGlzYWJsZSBSUEMgZmxleGlibGUgKGxvbmcpIGJpdG1hcHMuCisjIFdhcm5pbmc6IERpc2FibGluZyB0aGlzIGNoYW5nZXMgdGhlIFJQQyB2ZXJzaW9uIHRvIDIgYW5kCisjIG1ha2VzIHN5c3RlbXMgcnVubmluZyB0aGlzIGNvZGUgaW5jb21wYXRpYmxlIHdpdGggc3lzdGVtcworIyBydW5uaW5nIHByZXZpb3VzIHZlcnNpb25zIG9mIEJDTSBSUEMgY29kZS4KKyNDRkdGTEFHUyArPSAtREJDTV9SUENfUEJNUF82NAorCisjCisjIERlZmluZSBpZiBsb25ncyBhcmUgNjQgYml0cyBvbiB5b3VyIGNvbXBpbGVyOworIyB0aGlzIGlzIHR5cGljYWxseSB0cnVlIE9OTFkgZm9yIDY0LWJpdCBwcm9jZXNzb3JzLgorI0NGR0ZMQUdTICs9IC1ETE9OR1NfQVJFXzY0QklUUworCisjCisjIERlZmluZSBpZiBwb2ludGVycyBhcmUgNjQgYml0cyBvbiB5b3VyIGNvbXBpbGVyOworIyB0aGlzIGlzIHR5cGljYWxseSB0cnVlIE9OTFkgZm9yIDY0LWJpdCBwcm9jZXNzb3JzLgorIyBOT1RFOiBUaGlzIHN1cHBvcnQgd29ya3MgT05MWSB1bmRlciBjb25kaXRpb25zIHdoZXJlIHRoZQorIyB1cHBlciAzMiBiaXRzIGZvciBBTEwgcG9pbnRlcnMgYXJlIFpFUk8uCisjQ0ZHRkxBR1MgKz0gLURQVFJTX0FSRV82NEJJVFMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEJvb3QgYW5kIERlYnVnIFJlbGF0ZWQgT3B0aW9ucworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERlZmluZSB0aGlzIHRvIGFkZCBkZWJ1ZyBjb2RlIGZvciBSWCBwb29sIGJ1ZmZlciB0cmFja2luZworI0NGR0ZMQUdTICs9IC1EQkNNX1JYUF9ERUJVRworCisjIEFsbG93IGRlYnVnZ2luZyBvZiBQQ0kgcmVhZHMvd3JpdGVzIChkZWJ1ZyArcGNpKQorI0NGR0ZMQUdTICs9IC1EU09DX1BDSV9ERUJVRworCisjIE1ha2UgZGVmYXVsdCBkZWJ1Z2dpbmcgc2V0dGluZ3MgYmUgMCAodmVyeSB2ZXJ5IHF1aWV0KQorI0NGR0ZMQUdTICs9IC1ETk9fREVCVUdfT1VUUFVUX0RFRkFVTFQKKworIyBEb24ndCB1c2UgdnhNZW1Qcm9iZQorI0NGR0ZMQUdTICs9IC1EVlhfTk9fTUVNX1BST0JFCisKKyMgQWxsb3cgZGVidWdnaW5nIG9mIE1lbW9yeSBBbGxvY2F0aW9uL0RlYWxsb2NhdGlvbiBsb2dnaW5nCisjQ0ZHRkxBR1MgKz0gLURNRU1MT0dfU1VQUE9SVAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE9wZXJhdGlvbmFsIGFuZCBQb2xpY3kgT3B0aW9ucworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFZMQU4gcG9saWN5IGNvbnRyb2w6CisjCU5PX0RFRkFVTFRfRVRIRVIJZG8gbm90IGluaXQgZXRoZXIgcG9ydHMgaW50byB2bGFuIDEKKyMJTk9fREVGQVVMVF9DUFUJCWRvIG5vdCBpbml0IGNwdSBwb3J0cyBpbnRvIHZsYW4gMQorIwlOT19ERUZBVUxUX1NQSV9TVUJQT1JUCWRvIG5vdCBpbml0IHNwaSBzdWJwb3J0cyBpbnRvIHZsYW4gMQorIwlOT19BVVRPX1NUQUNLCQlkbyBub3QgaW5pdCBzdGFjay9IRyBwb3J0cyBpbnRvIGNyZWF0ZWQgdmxhbnMKKyNDRkdGTEFHUyArPSAtREJDTV9WTEFOX05PX0RFRkFVTFRfRVRIRVIKKyNDRkdGTEFHUyArPSAtREJDTV9WTEFOX05PX0RFRkFVTFRfQ1BVCisjQ0ZHRkxBR1MgKz0gLURCQ01fVkxBTl9OT19ERUZBVUxUX1NQSV9TVUJQT1JUCisjQ0ZHRkxBR1MgKz0gLURCQ01fVkxBTl9OT19BVVRPX1NUQUNLCisKKyMgVkxBTiBtdWx0aWNhc3QgZmxvb2QgUG9saWN5IENvbnRyb2w6CisjIEJDTV9WTEFOX01DQVNUX0ZMT09EX0FMTCAgICAgIEZsb29kIGFsbCBtdWx0aWNhc3QgcGFja2V0cyB0byB0aGUgVkxBTgorIyBCQ01fVkxBTl9NQ0FTVF9GTE9PRF9VTktOT1dOICBGbG9vZCB1bmtub3duIG11bHRpY2FzdCBwYWNrZXRzIHRvIHRoZSB2bGFuCisjIEJDTV9WTEFOX01DQVNUX0ZMT09EX05PTkUgICAgIEZvcndhcmQgbXVsdGljYXN0IHBhY2tldHMgd2l0aCBrbm93bgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgdG8gdGhlIGFwcHJvcHJpYXRlIHBvcnRzLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcGFja2V0cyBkZXN0aW5lZCB0byBhbiB1bmtub3duIG11bHRpY2FzdAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGFyZSBkcm9wcGVkLgorI0NGR0ZMQUdTICs9IC1EQkNNX01DQVNUX0ZMT09EX0RFRkFVTFQ9QkNNX1ZMQU5fTUNBU1RfRkxPT0RfQUxMCisjQ0ZHRkxBR1MgKz0gLURCQ01fTUNBU1RfRkxPT0RfREVGQVVMVD1CQ01fVkxBTl9NQ0FTVF9GTE9PRF9VTktOT1dOCisjQ0ZHRkxBR1MgKz0gLURCQ01fTUNBU1RfRkxPT0RfREVGQVVMVD1CQ01fVkxBTl9NQ0FTVF9GTE9PRF9OT05FCisKKyNQb3J0IEVuYWJsZS9EaXNhYmxlIFBvbGljeSBjb250cm9sOgorIyAgICAgICBQT1JUX0RFRkFVTFRfRElTQUJMRSAgICAgICBkaXNhYmxlIHBvcnRzIGR1cmluZyBzd2l0Y2ggaW5pdGlhbGl6YXRpb24KKyNDRkdGTEFHUyArPSAtREJDTV9QT1JUX0RFRkFVTFRfRElTQUJMRQorCisjIHNhbCB0aHJlYWQgcHJpb3JpdHkgb3ZlcnJpZGUgKHRoaXMgdmFsdWUgdXNlZCBmb3IgYWxsIHRocmVhZHMgaWYgZGVmaW5lZCkKKyNDRkdGTEFHUyArPSAtRFNBTF9USFJFQURfUFJJT1JJVFk9MjU1CisKKyMgZGlzYWJsZSBwcmludGluZyBvZiB0aHJlYWQgbmFtZSBpbiBtZXNzYWdlcworI0NGR0ZMQUdTICs9IC1EU0FMX1RIUkVBRF9OQU1FX1BSSU5UX0RJU0FCTEUKKworIyBkaXNhYmxlIHJ1bnRpbWUgcmVhZGluZyBvZiBmbGFzaCBjb25maWcuYmNtIGZpbGUgKGV2ZW4gaWYgIU5PX0ZJTEVJTykKKyNDRkdGTEFHUyArPSAtRFNBTF9DT05GSUdfRklMRV9ESVNBQkxFCisKKyMgZGlzYWJsZSBhbGwgQXBwbGljYXRpb24gU0FMIGRlcGVuZGVuY2llcworI05PX1NBTF9BUFBMPTEKKworCisjIFByZXZlbnQgc2NoZWR1bGluZyBpbiBTUEwgbG9ja3Mgd2hlbiBpbnRlcnJ1cHQgY29kZSBpcyBydW4gYXMgYSB0aHJlYWQuCisjIFRoaXMgb3B0aW9uIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIGFsbCBsb2NrcyBhcmUgaW1wbGVtZW50ZWQgY29ycmVjdGx5LAorIyBob3dldmVyLCBzb21lIGxvY2tzIG1heSBzdGlsbCByZWx5IG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgc2NoZWR1bGluZyBkb2VzCisjIG5vdCBvY2N1ciB3aGVuIGludGVycnVwdHMgYXJlIGRpc2FibGVkLiBJZiB5b3UgZXhwZXJpZW5jZSBhbnkgbG9ja2luZworIyBwcm9ibGVtcyBpbiBlLmcuIExpbnV4IFVzZXIgTW9kZSwgdHJ5IGVuYWJsaW5nIHRoaXMgb3B0aW9uLgorIyBQbGVhc2Ugbm90ZSB0aGF0IHR1cm5pbmcgb24gdGhpcyBvcHRpb24gd2lsbCByZWR1Y2UgcGVyZm9ybWFuY2UgYnkgYW4KKyMgZXN0aW1hdGVkIDUgdG8gMTAgJS4KKyNDRkdGTEFHUyArPSAtRFNBTF9TUExfTk9fUFJFRU1QVAorCisjIGRpc2FibGUgbWFwcGluZyBvZiBoaWdpZyBjb3NxIHdoZW4gbWFwcGluZyBwcmlvcml0eSB0byBjb3NxCisjICh1c2UgaWRlbnRpdHkgbWFwcGluZyBpbnN0ZWFkIDogbWFwIHByaW8wLT5jb3MwLCBwcmlvMS0+Y29zMSwgLi4uICwgcHJpbzctPmNvczcpCisjQ0ZHRkxBR1MgKz0gLURCQ01fQ09TUV9ISUdJR19NQVBfRElTQUJMRQorCisjIEVuYWJsZSB1a2VybmVsIGRlYnVnZ2luZyBtb2R1bGUKKyNDRkdGTEFHUyArPSAtRFNPQ19VS0VSTkVMX0RFQlVHCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTeXN0ZW0gTWFuYWdlbWVudCBhbmQgTXVsdGlwbGUgQ1BVIE9wdGlvbnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUdXJuIG9uIEJDTVggaW5jbHVzaW9uCisjICAgICBJTkNMVURFX0JDTVggZm9yIGFueSBzdXBwb3J0CitJTkNMVURFX0JDTVg9MQorCisjIFRlbGVraW5lc2lzIHN1aXRlIGFwcGxpY2F0aW9ucyBmb3IgQ1BVIHRvIENQVSBjb21tdW5pY2F0aW9uIGFuZCBkaXNjb3ZlcnkKKyMgICAgIENQVURCOiAgICAgICAgIFNpbXBsZSBDUFUgZGF0YSBiYXNlIG1hbmFnZXIKKyMgICAgIENQVVRSQU5TOiAgICAgIENQVSB0byBDUFUgY29tbXVuaWNhdGlvbiBtZWNoYW5pc21zCisjICAgICBESVNDT1ZFUjogICAgICBTaW1wbGUgZGlzY292ZXJ5OyB3aWxsIGFsc28gaW5jbHVkZSBDUFVUUkFOUworIyAgICAgU1RLVEFTSzogICAgICAgU3RhY2sgbWFuYWdlciBhcHBsaWNhdGlvbgorIworI0NGR0ZMQUdTICs9IC1ESU5DTFVERV9MSUJfQ1BVREIKKyNDRkdGTEFHUyArPSAtRElOQ0xVREVfTElCX0NQVVRSQU5TCisjQ0ZHRkxBR1MgKz0gLURJTkNMVURFX0xJQl9ESVNDT1ZFUgorI0NGR0ZMQUdTICs9IC1ESU5DTFVERV9MSUJfU1RLVEFTSworCisjIE9wdGlvbiBmb3IgZGlzY292ZXJ5IHRvIHVzZSB0aGUgYXBwbGljYXRpb24tZGF0YSBmaWVsZCBpbiByb3V0aW5nCisjIHBhY2tldHMgZm9yIEJvYXJkLUlEIGFuZCBDUFUgYmFzZSBmbGFnIGluZm9ybWF0aW9uLgorI0NGR0ZMQUdTICs9IC1ERElTQ09WRVJfQVBQX0RBVEFfQk9BUkRJRAorCisjIE9wdGlvbmFsbHkgb3ZlcnJpZGUgbGlzdCBvZiBpbmNsdWRlZCBkaXNwYXRjaCBtb2R1bGVzCisjIE5vdGU6IGluY2x1ZGluZyBSUEMgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgVGVsZWtpbmVzaXMgc3VpdGUgbGlicworIyBFU1cgaXMgdGhlIGVudGVycHJpc2UgcGxhdGZvcm1zLgorIyBST0JPIGluY2x1ZGVzIHRoZSBtYW5hZ2VkIGRldmljZXMuCisjIFNCWCBpbmNsdWRlcyBBUEkgc3VwcG9ydCBmb3IgYmNtOTg4MDIwUVNLMjRYMgorI0RJU1BBVENIX0xJU1QgPSBSUEMgRVNXIEFTWU5DIFNCWAorCisjIERlZmluZSB0byBoYXZlIGVuZC10by1lbmQgZmxvdyBjb250cm9sIGVuYWJsZWQgb24gYm9hcmRzIHRoYXQKKyMgc3VwcG9ydCBpdAorI0NGR0ZMQUdTICs9IC1EQkNNX0JPQVJEX0FVVE9fRTJFCisKKyMgRGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gc3VwcG9ydCBwZXItQ1BVIHRyYW5zbWl0IHBvaW50ZXJzLgorIyBUaGlzIGFsbG93cyB0aGUgVFggc2V0dXAgYW5kIHNlbmQgZnVuY3Rpb25zIHRvIGJlIGRlZmluZWQgb24gYQorIyBwZXItQ1BVIGJhc2lzLCBhbGxvd2luZyBtaXhlZCBpbi1iYW5kIGFuZCBvdXQtb2YtYmFuZCBjb21tdW5pY2F0aW9uLgorI0NGR0ZMQUdTICs9IC1EQkNNX0MyQ19UUkFOU1BPUlRfU1dJVENISU5HCisKKyMgT3B0aW9ucyBmb3IgZmVhdHVyZSBsaXN0IChJTkNMVURFX1hYWCkKKyMgSWYgRkVBVFVSRV9MSVNUIGlzIGRlZmluZWQsIGl0IGlzIGEgbGlzdCBvZiBmZWF0dXJlcyB0byBpbmNsdWRlLgorIyBTZWUgTWFrZS5jb25maWcgZm9yIHRoZSBkZWZhdWx0IGZlYXR1cmUgbGlzdC4KKyMKKyMgQXZhbGlhYmxlIGZlYXR1cmVzOgorIworIyAgICAgQkNNWAorIyAgICAgQkNNWF9ESUFHCisjICAgICBDSEFTU0lTCisjICAgICBDVVNUT01FUgorIyAgICAgRFJJVkVSUworIyAgICAgRURJVExJTkUKKyMgICAgIEkyQworIyAgICAgTDMKKyMgICAgIE1FTV9TQ0FOCisjICAgICBBVFBUUkFOU19TT0NLRVQKKyMgICAgIFRFTE5FVAorIyAgICAgVEVTVAorIyAgICAgQUNMCisjICAgICBSQ1BVCisjICAgICBLTkVUIC0gTGludXggdXNlciBtb2RlIGtlcm5lbCBuZXR3b3JrIHN1cHBvcnQKKyMgICAgIEJDTV9TQUxfUFJPRklMRSAtIG1ha2UgYXZhaWxhYmxlIGFuIEFQSSB0byB0cmFjayBTQUwgdXNhZ2UuCisjICAgICBDSU5UIC0gSW5jbHVkZSB0aGUgQyBJbnRlcnByZXRlciBpbiB0aGUgZGlhZ25vc3RpYyBzaGVsbC4gCisjICAgICAgICAgICAgUGxlYXNlIG5vdGUgdGhpcyBjYW5ub3QgYmUgdXNlZCBpbiBMaW51eCBrZXJuZWwgbW9kZS4gCisjICAgICBDX1VOSVQgLSBJbmNsdWRlIHRoZSBDIHVuaXQgdGVzdGluZyBmcmFtZXdvcmsuICBJZiBDSU5UIGlzIGFsc28gaW5jbHVkZWQKKyMgICAgICAgICAgICAgIHRoZW4gaG9va3Mgd2lsbCBiZSBwcm92aWRlZCBmb3IgdXNlIGZyb20gaXQuCisjICAgICBQSFlfU1lNX0RCRyAtIFBIWSBHVUkgTURJTyByZWFkL3dyaXRlIHN1cHBvcnQuIFNvY2tldCBpbnRlcmZhY2UKKyMgICAgICAgICAgICAgICAgICAgdG8gUEhZIEdVSSBmb3IgU3ltYm9saWMgZGVidWdnaW5nLgorIyAgICAgQVBJTU9ERSAtIGNhbGwgU0RLIEFQSSBmdW5jdGlvbnMgZnJvbSBzaGVsbCwgcmVxdWlyZXMgQ0lOVAorIyAgICAgRFVORV9VSSAtIGR1bmUgbGVnYWN5IHVzZXIgaW50ZXJmYWNlLiBGb3IgZGVidWcgb25seS4gVGVzdGVkCisjICAgICAgICAgICAgICAgb24gbGludXgtdXNlci1ndG8tMi42IG9ubHkuCisjICAgICBLQlAgICAtICAgaW5jbHVkZSBubG0yKDExSykvbmxtMygxMkspIEtCUCBzdXBwb3J0CisjICAgICBCSEggICAtICAgSW5jbHVkZSBTdXBwb3J0IGZvciBCSEggQXBwbGljYXRpb24gKE1QTFMtVFAgT0FNIGJhc2VkIG9uIFkuMTczMSkgCisjICAgICAgICAgICAgICAgdXNpbmcgQlRFIG9uIHNlbGVjdCBkZXZpY2VzLgorIyAgICAgQVZTICAgLSBJbmNsdWRlIEFWUyBzdXBwb3J0CisjRkVBVFVSRV9MSVNUPUFUUFRSQU5TX1NPQ0tFVCBCQ01YX0RJQUcgTDMgSTJDIEJDTVggTUVNX1NDQU4gRURJVExJTkUgXAorIyAgICBDVVNUT01FUiBURUxORVQgRFJJVkVSUyBDSEFTU0lTIFRFU1QgQUNMIFJDUFUgQkNNX1NBTF9QUk9GSUxFIENJTlQgXAorIyAgICBQVFAgQ0VTIEZDTUFQIEJPQVJEIEtORVQgUkVHRVggTUFDU0VDIEFQSU1PREUgQkZEIEtCUCBBVlMKKworI0ZFQVRVUkVfTElTVD0gQVRQVFJBTlNfU09DS0VUIFBUUCBDSU5UIEwzIEkyQyBCQ01YIEJDTVhfRElBRyBNRU1fU0NBTiBFRElUTElORSBCQ01fU0FMX1BST0ZJTEUgQ1VTVE9NRVIgVEVTVCBDSEFTU0lTIE1TVFAgUkNQVSAgCisKKyMgQVJBRCArIEtUMgorRkVBVFVSRV9MSVNUPSBBVFBUUkFOU19TT0NLRVQgUFRQIENJTlQgTDMgSTJDIEJDTVggQkNNWF9ESUFHIE1FTV9TQ0FOIEVESVRMSU5FIEJDTV9TQUxfUFJPRklMRSBDVVNUT01FUiBURVNUIENIQVNTSVMgTVNUUCBSQ1BVICAgSU5UUiBCU0FGRSBURUxORVQgRFJJVkVSUyBEVU5FX1VJIAorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgICAgICAgICAgICBLQlAgc3VwcG9ydGVkIGRldmljZXMKKyMKKyNFbmFibGUgdGhpcyBmb3IgMTFLIGRldmljZSBzdXBwb3J0CisjS0JQX0RFVklDRSA9IEtCUF8xMUsKKyMKKyNFbmFibGUgdGhpcyBmb3IgMTJLIGRldmljZSBzdXBwb3J0CisjS0JQX0RFVklDRSA9IEtCUF9BTEcKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNlbGVjdGl2ZSBEZXZpY2UgU3VwcG9ydCAoU3dpdGNoZXMgYW5kIFBIWXMpCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTXVsdGlwbGUgQ2hpcCBTdXBwb3J0CisjCisjIEJ5IGRlZmF1bHQsIHRoZSBkcml2ZXIgc3VwcG9ydHMgYWxsIFN0cmF0YSBzd2l0Y2ggYW5kIGZhYnJpYyBjaGlwcworIyBpbmNsdWRlZCBpbiB0aGlzIHNvZnR3YXJlIHJlbGVhc2UuICBJdCBjaGVja3MgZGV2aWNlIElEcyBhdCBydW50aW1lCisjIHRvIHJ1biB0aGUgY29ycmVjdCBkcml2ZXIgbW9kdWxlcy4KKyMKKyMgVG8gc2F2ZSBzcGFjZSwgdGhlIGRyaXZlciBjYW4gYmUgY29tcGlsZWQgdG8gc3VwcG9ydCBqdXN0IGEgc3Vic2V0IG9mCisjIHRoZSBjaGlwcy4gIFRvIGRvIHRoaXMsIHVuY29tbWVudCB0aGUgbGluZSBmb3IgQkNNX1BUTF9TUFQgKHBhcnRpYWwKKyMgc3VwcG9ydCkgYW5kIHVuY29tbWVudCBvbmUgbGluZSBmb3IgZWFjaCBjaGlwIHRvIHN1cHBvcnQuCisjCisjIE5vdGUgdGhhdCB0aGVyZSBhcmUgYSBsb3QgbW9yZSBjaGlwcyB0aGFuIGRyaXZlcnMuCisjIEZvciBleGFtcGxlLCB0aGUgQkNNNTYxNSBkcml2ZXIgaXMgYWxzbyB1c2VkIGZvciBCQ001NjI1IGFuZCBCQ001NjQ1LgorIworCitCQ01fUFRMX1NQVCA9IDEKKworI0JDTV81Njc1X0EwID0gMQorI0JDTV81NjEwMl9BMCA9IDEKKyNCQ01fNTYxMTJfQTAgPSAxCisjQkNNXzU2MzA0X0IwID0gMQorI0JDTV81NjMxNF9BMCA9IDEKKyNCQ01fNTY1MDRfQTAgPSAxCisjQkNNXzU2NTA0X0IwID0gMQorI0JDTV81NjUxNF9BMCA9IDEKKyNCQ01fNTY2MjRfQTAgPSAxCisjQkNNXzU2NjI0X0IwID0gMQorI0JDTV81NjY4MF9BMCA9IDEKKyNCQ01fNTY2ODBfQjAgPSAxCisjQkNNXzU2NTgwX0EwID0gMQorI0JDTV81NjcwMF9BMCA9IDEKKyNCQ01fNTY4MDBfQTAgPSAxCisjQkNNXzU2MjE4X0EwID0gMQorI0JDTV81NjIyNF9BMCA9IDEKKyNCQ01fNTYyMjRfQjAgPSAxCisjQkNNXzU2NzI1X0EwID0gMQorI0JDTV81NjgyMF9BMCA9IDEKKyNCQ01fNTMzMTRfQTAgPSAxCisjQkNNXzUzMzI0X0EwID0gMQorI0JDTV81NjYzNF9BMCA9IDEKKyNCQ01fNTY2MzRfQjAgPSAxCisjQkNNXzU2NTI0X0EwID0gMQorI0JDTV81NjUyNF9CMCA9IDEKKyNCQ01fNTY2ODVfQTAgPSAxCisjQkNNXzU2Njg1X0IwID0gMQorI0JDTV81NjMzNF9BMCA9IDEKKyNCQ01fNTYzMzRfQjAgPSAxCisjQkNNXzU2ODQwX0EwID0gMQorI0JDTV81Njg0MF9CMCA9IDEKKyNCQ01fNTY4NTBfQTAgPSAxCisjQkNNXzU2MTQyX0EwID0gMQorI0JDTV81NjE1MF9BMCA9IDEKKyNCQ01fNTY4MzZfQTAgPSAxCisjQkNNXzU2NjQwX0EwID0gMQorQkNNXzU2NDQwX0EwID0gMQorQkNNXzU2NDQwX0IwID0gMQorQkNNXzU2NDUwX0EwID0gMQorQkNNXzU2NDUwX0IwID0gMQorQkNNXzU2NDUwX0IxID0gMQorI0JDTV81Njk2MF9BMCA9IDEKKyNCQ01fNTY4NjBfQTAgPSAxCisKKyNCQ01fNTMzOF9BMCA9IDEKKyNCQ01fNTM4MF9BMCA9IDEKKyNCQ01fNTMzOF9CMCA9IDEKKyNCQ01fNTMyNV9BMSA9IDEKKworI0JDTV81MzI0X0EwID0gMQorI0JDTV81Mzk2X0EwID0gMQorI0JDTV81Mzg5X0EwID0gMQorI0JDTV81Mzk4X0EwID0gMQorI0JDTV81MzI0X0ExID0gMQorI0JDTV81MzExNV9BMCA9IDEKKyNCQ01fNTMxMThfQTAgPSAxCisjQkNNXzUzMjgwX0EwID0gMQorI0JDTV81MzI4MF9CMCA9IDEKKyNCQ01fNTMxMDFfQTAgPSAxCisjQkNNXzUzMTI1X0EwID0gMQorI0JDTV81MzEyOF9BMCA9IDEKKyNCQ01fNTM2MDBfQTAgPSAxCisjQkNNXzg5NTAwX0EwID0gMQorCisjQkNNXzg4MDMwX0EwID0gMQorI0JDTV9RRTIwMDBfQTAgPSAxCisjQkNNX0JNRTMyMDBfQjAgPSAxCisjQkNNX0JNOTYwMF9BMCA9IDEKKyNCQ01fODgyMzBfQTAgPSAxCisjQkNNXzg4MjMwX0IwID0gMQorI0JDTV84ODIzMF9DMCA9IDEKKworIyBBUkFECitCQ01fODg2NDBfQTA9MQorQkNNXzg4NjUwX0EwPTEKK0JDTV84ODY1MF9CMD0xCitCQ01fODg2NjBfQTA9MQorCisjQkNNX1RLMzcxWF9BMCA9IDEKKworIyBPcHRpb25zIGZvciBtdWx0aXBsZSBQSFkgc3VwcG9ydAorIyBJZiBCQ01fUEhZX0xJU1QgaXMgZGVmaW5lZCwgaXQgaXMgYSBsaXN0IG9mIFBIWXMgdG8gaW5jbHVkZS4KKyMgVGhlIGRlZmF1bHQgaXMgdG8gaW5jbHVkZSBhbGwgb2YgdGhlbS4KKyMgSWYgbm9uZSBvZiB0aGVtIHNob3VsZCBiZSBpbmNsdWRlZCBzcGVjaWZ5IEJDTV9QSFlfTElTVD1FTVBUWQorI0JDTV9QSFlfTElTVD01MjJYIDU0WFggNTQ2NCA1NDIxUyA1NDgyIDU0NjE2IDU0NjgwIDU0NjgwRSA1MjY4MUUgNTQ4ODBFIDU0NjgyIDU0Njg0IDU0NjQwIDU0NjQwRSA1NDg4MCBTRVJERVMgU0lNVUwgODcwMyA4NzA1IDg3MDYgODA3MiA4MDQwIDg0ODEgODc1MCA4NzI5IDg0NzQwIDg0NzU2IDg0MzI4IEVNUFRZCisKKyMgT3B0aW9ucyBmb3IgQkNNNTMzOCA1MzgwCisjQ0ZHRkxBR1MgKz0gLURST0JPX09MRAorI1JPQk9fT0xEID0gMQorCisjIFN1cHBvcnQgZm9yIHBoeSBzaW11bGF0aW9uCisjQ0ZHRkxBR1MgKz0gLURJTkNMVURFX1BIWV9TSU1VTAorI0NGR0ZMQUdTICs9IC1EU0lNX0FMTF9QSFlTICAgICAgICAjIEFsbCBwaHlzIHVzZSBzaW11bGF0aW9uIGRyaXZlcgorI0NGR0ZMQUdTICs9IC1EU0lNX0NNSUNfTElOS19TVEFUICAjIEdldCBsaW5rIHN0YXR1cyBmcm9tIENNSUMgcmVnaXN0ZXIKKworIyBTdXBwb3J0IGZvciBCT0FSRCBsaWJyYXJ5CisjIGlmIEJPQVJEX0xJU1QgaXMgZGVmaW5lZCwgaXQgaXMgYSBsaXN0IG9mIEJvYXJkIGRyaXZlcnMgdG8gaW5jbHVkZS4KKyMgVGhlIGRlZmF1bHQgaXMgdG8gaW5jbHVkZSBhbGwgYm9hcmQgZHJpdmVycyBhcHByb3ByaWF0ZSBmb3IgdGhlIGRldmljZXMKKyMgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLiBJZiBub25lIG9mIHRoZW0gc2hvdWxkIGJlIGluY2x1ZGVkIHNwZWNpZnkKKyMgQk9BUkRfTElTVD1FTVBUWS4KKyNCT0FSRF9MSVNUPUdFTkVSSUMKKworIyBTdXBwb3J0IGZvciBldmVudCBsb2dnaW5nCisjQ0ZHRkxBR1MgKz0gLURJTkNMVURFX1NIQVJFRF9FVkxPRworCisjIFN1cHBvcnQgZm9yIEJDTSBBUEkgcG9ydCB0cmFuc2xhdGlvbgorI0NGR0ZMQUdTICs9IC1ESU5DTFVERV9CQ01fQVBJX1hMQVRFX1BPUlQKKworIyBTdXBwb3J0IGZvciBjYWxsYmFjayBlcnJvciBjaGVja3MgYW5kIGFib3J0IGluIHRyYXZlcnNlIGFwaSdzCisjQ0ZHRkxBR1MgKz0gLURCQ01fQ0JfQUJPUlRfT05fRVJSCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE1pc2MgT3B0aW9ucworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EU09DX01FTV9MM19ERUZJUF9XQVIKKworIyBDb21waWxlIG91dCBSZWdpc3Rlci9UYWJsZSBkZXNjcmlwdGl2ZSBzdHJpbmdzIHRvIGdlbmVyYXRlIGEKKyMgY29tcGFjdCBpbWFnZQorI0NGR0ZMQUdTICs9LURTT0NfTk9fTkFNRVMKKyNDRkdGTEFHUyArPS1EU09DX05PX0FMSUFTCisjQ0ZHRkxBR1MgKz0tRFNPQ19OT19ERVNDCisKKyMgUmVsb2FkL1dhcm1Cb290IFN1cHBvcnQKKyMKK0NGR0ZMQUdTICs9IC1EQkNNX1dBUk1fQk9PVF9TVVBQT1JUCisjCisjIE5lZWQgdGhpcyBmb3IgdmFsaWRhdGlvbiB1c2luZyBTT0Mgc2NyaXB0czsgV2lsbCBtb3ZlIHRvIHRjbCAKKyMgc29tZWRheQorQ0ZHRkxBR1MgKz0gLURCQ01fV0FSTV9CT09UX1NVUFBPUlRfU1dfRFVNUAorIworIyBBZGRzIGEgQ1JDIGNoZWNrIG9uIHNjYWNoZSBidWZmZXI6IENhbGN1bGF0ZSB3aGVuIHNhdmluZywKKyMgYW5kIHZlcmlmeSB3aGVuIGxvYWRpbmcuCisjIFdoZW4gZG9pbmcgSVNTVSwgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHZlcnNpb25zIHNob3VsZCBlaXRoZXIgaGF2ZQorIyB0aGlzIGZsYWcgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyNDRkdGTEFHUyArPSAtRFNDQUNIRV9DUkNfQ0hFQ0sKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBFbmFibGUgRWFzeSBSZWxvYWQgU3VwcG9ydAorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EQkNNX0VBU1lfUkVMT0FEX1NVUFBPUlQKKyMgRm9yIHZhbGlkYXRpb24gcHVycG9zZXMKKyNDRkdGTEFHUyArPSAtREJDTV9FQVNZX1JFTE9BRF9TVVBQT1JUX1NXX0RVTVAKKworIyBTb2Z0d2FyZSBUcnVuayBmYWlsb3ZlciBTdXBwb3J0CisjCisjQ0ZHRkxBR1MgKz0gLURCQ01fVFJVTktfRkFJTE9WRVJfU1VQUE9SVAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE92ZXJyaWRlIGRlZmF1bHQgVlhXT1JLUyB0aHJlYWQgb3B0aW9ucyB0byBtYWtlIHNldCAKKyMgVlhfVU5CUkVBS0FCTEUgZmxhZyBpbiB0YXNrIGNyZWF0aW9uLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EVlhfVEhSRUFEX09QVF9VTkJSRUFLQUJMRQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVXNlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIEJERSBpbnRlcnJ1cHQgdGhyZWFkLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EU0FMX0JERV9USFJFQURfUFJJT19ERUZBVUxUCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVXNlIGNhY2hlZCBETUEgbWVtb3J5IHdoZW4gbWFwcGluZyBrZXJuZWwgRE1BIG1lbW9yeSB0byB1c2VyCisjIG1vZGUuIFNob3VsZCBvbmx5IGJlIGVuYWJsZWQgb24gY2FjaGUtY29oZXJlbnQgcGxhdGZvcm1zLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EU0FMX0JERV9DQUNIRV9ETUFfTUVNCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVGFrZSB0aGUgc3BsIGxvY2sgdXBvbiBlbnRlcmluZyBhbiBJU1IKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtRFNBTF9TUExfTE9DS19PTl9JUlEKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTaWxlbnRseSBpZ25vcmUgTlVMTCBwb2ludGVyIGZyZWUgaW4gc2FsX2ZyZWUgQVBJCisjIERlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGFzc2VydCBpZiBhIE5VTEwgcG9pbnRlciBpcyBwYXNzZWQgdG8gc2FsX2ZyZWUKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtRFNBTF9GUkVFX05VTExfSUdOT1JFCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRW5hYmxlIFNCWCBNUExTIFRQIHN1cHBvcnQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtREJDTV9TQlhfTVBMU1RQX1NVUFBPUlQKKyNDRkdGTEFHUyArPSAtREJDTV9TQlhfQzFfTVBMU1RQX1NVUFBPUlQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZXN0cmljdCBTQlggQzIgRnRlIHJhbmdlIHRvIEMyJ3MgcmFuZ2UKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtREJDTV9TQlhfQzFfQzJfSU5URVJPUAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMgdGhlIFBDSSBwcm9iZSBmdW5jdGlvbiBza2lwcyBkZXZpY2UgMTIKKyMgYnkgZGVmYXVsdCB0byBwcmV2ZW50IGEgc3lzdGVtIGhhbmcgb24gY2VydGFpbiBwbGF0Zm9ybXMuCisjIFNldCB0aGlzIHZhbHVlIHRvIHplcm8gdG8gcHJvYmUgYWxsIFBDSSBkZXZpY2VzLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1ET1ZFUlJJREVfUENJX1NLSVBfREVWX01BU0s9MAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE92ZXJyaWRlIG1heCBkZXZpY2VzIHN1cHBvcnRlZCBieSBQTEkgQkRFCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURQTElfTUFYX0RFVklDRVMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUcmFjayBCQ00gQVBJIGNhbGxzIHRvIGF2b2lkIGRlaW5pdGlhbGl6YXRpb24gd2hpbGUgY2FsbHMgYWN0aXZlCisjIFRoaXMgd2lsbCBpbmN1ciBhIHNtYWxsIHRpbWUgcGVuYWx0eSBmb3IgZWFjaCBCQ00gQVBJIGNhbGwKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtREJDTV9DT05UUk9MX0FQSV9UUkFDS0lORworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE92ZXJyaWRlIGRlZmF1bHQgcmV0cnkgdGltZSBmb3IgZGV0YWNoIHRvIHdhaXQgZm9yIGV4ZWN1dGluZworIyBBUElzIHRvIGNvbXBsZXRlLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EQkNNX0RFVEFDSF9QT0xMX0lOVEVSVkFMX1VTRUNTX0RFRkFVTFQ9MTAwMDAwCisjQ0ZHRkxBR1MgKz0gLURCQ01fREVUQUNIX05VTV9SRVRSSUVTX0RFRkFVTFQ9MzAwMAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERpc2FibGUgdGhlIFJYIG1vZHVsZSBpbml0aWFsaXphdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EQkNNX1JYX0RJU0FCTEUKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBFbmFibGUgVFggY2FsbGJhY2sgaW4gaW50ZXJydXB0IHRocmVhZAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EVFhfQ0JfSU5UUgorCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL21ha2UvTWFrZS5sb2NhbC5hcmFkIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9tYWtlL01ha2UubG9jYWwuYXJhZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42N2MxMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9tYWtlL01ha2UubG9jYWwuYXJhZApAQCAtMCwwICsxLDU2NSBAQAorIyAkSWQ6IE1ha2UubG9jYWwudGVtcGxhdGUsdiAxLjE4MSBCcm9hZGNvbSBTREsgJAorIyAkQ29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyMgVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorIyBhbmQvb3IgaXRzIGxpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkCisjIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLAorIyB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkIGJldHdlZW4geW91IGFuZCBCcm9hZGNvbQorIyAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbiBhbiBBdXRob3JpemVkCisjIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAorIyB0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQKKyMgQnJvYWRjb20gZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZQorIyBhbmQgYWxsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFCisjIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRSBOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRQorIyBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWSBCUk9BRENPTSBBTkQgRElTQ09OVElOVUUKKyMgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuICAKKyMgIAorIyBFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIyAgCisjIDEuICAgICBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorIyBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyMgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwKKyMgYW5kIHRvIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mCisjIEJyb2FkY29tIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKyMgIAorIyAyLiAgICAgVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUworIyBQUk9WSURFRCAiQVMgSVMiIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLAorIyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwKKyMgT1IgT1RIRVJXSVNFLCBXSVRIIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZCisjIERJU0NMQUlNUyBBTlkgQU5EIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwKKyMgTk9OSU5GUklOR0VNRU5ULCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLAorIyBBQ0NVUkFDWSBPUiBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUgorIyBDT1JSRVNQT05ERU5DRSBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORworIyBPVVQgT0YgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyMgCisjIDMuICAgICBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwKKyMgQlJPQURDT00gT1IgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLAorIyBJTkNJREVOVEFMLCBTUEVDSUFMLCBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUgorIyBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWQorIyBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4gSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKKyMgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOyBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GCisjIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFIFNPRlRXQVJFIElUU0VMRiBPUiBVU0QgMS4wMCwKKyMgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORworIyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkgTElNSVRFRCBSRU1FRFkuJAorIworCisjIFVzYWdlIGZvciBNYWtlLmxvY2FsLnRlbXBsYXRlIGFuZCBNYWtlLmxvY2FsOgorIworIyBNYWtlLmxvY2FsLnRlbXBsYXRlIGlzIGNoZWNrZWQgaW50byB0aGUgdHJlZSwgYnV0IE1ha2UubG9jYWwgaXMgbmV2ZXIKKyMgY2hlY2tlZCBpbi4gIENvcHkgTWFrZS5sb2NhbC50ZW1wbGF0ZSB0byBNYWtlLmxvY2FsLCB0aGVuIGNoYW5nZQorIyBNYWtlLmxvY2FsIHRvIHNlbGVjdCB0aGUgZGVzaXJlZCBjb21waWxhdGlvbiBvcHRpb25zIChtb3N0bHkgZGVidWdnaW5nCisjIGZlYXR1cmVzKS4KKyMKKyMgTm90ZSBvbiBDRkdGTEFHUyB1c2FnZToKKyMKKyMgICBCZWNhdXNlIENGR0ZMQUdTIG1heSBiZSB1c2VkIHdpdGggb3RoZXIgc291cmNlIHByZXByb2Nlc3NpbmcgdG9vbHMsCisjICAgcGxlYXNlIGxpbWl0IHRoZSB2YWx1ZXMgYWRkZWQgdG8gQ0ZHRkxBR1MgdG8gLUQgZGVmaW5lcy4KKyMKKyMKKyMgVGFibGUgb2YgQ29udGVudHM6CisjCisjICAgICBDb21waWxlciBSZWxhdGVkIE9wdGlvbnMKKyMgICAgIEJvb3QgYW5kIERlYnVnIFJlbGF0ZWQgT3B0aW9ucworIyAgICAgT3BlcmF0aW9uYWwgYW5kIFBvbGljeSBPcHRpb25zCisjICAgICBTeXN0ZW0gTWFuYWdlbWVudCBhbmQgTXVsdGlwbGUgQ1BVIE9wdGlvbnMKKyMgICAgIFNlbGVjdGl2ZSBEZXZpY2UgU3VwcG9ydCAoU3dpdGNoZXMgYW5kIFBIWXMpCisjICAgICBNaXNjZWxsYW5lb3VzIE9wdGlvbnMKKyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDb21waWxlciBSZWxhdGVkIE9wdGlvbnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBDb21waWxpbmcgb3V0ICNpZmRlZiBERUJVRyBjb2RlIHNhdmVzIGFib3V0IDEuMyUgb24gZXhlY3V0YWJsZSBzaXplLgorIyBJdCBpcyByZWNvbW1lbmRlZCB0byBsZWF2ZSBkZWJ1ZyBlbmFibGVkIHdoZW4gZGV2ZWxvcGluZyBhcHBsaWNhdGlvbnMuCisjREVCVUdfSUZERUZTPUZBTFNFCisKKyMgU0FMIHJlc291cmNlIHVzYWdlIHRyYWNraW5nICNpZmRlZiBjb250cm9sCisjIERFQlVHX0lGREVGUyBzaG91bGQgYWxzbyBiZSAgVFJVRSBmb3IgdGhpcyBzd2l0Y2ggdG8gdGFrZSBlZmZlY3QuCisjQkNNX1JFU09VUkNFX1VTQUdFX1BST0ZJTEVfSUZERUZTPVRSVUUKKworIyBVbmNvbW1lbnQgdG8gYnVpbGQgd2l0aG91dCBkZWJ1ZyBzeW1ib2xzCisjREVCVUdfU1lNQk9MUz1GQUxTRQorCisjIFVuY29tbWVudCB0byBhZGQgcHJpdmF0ZSBDRkxBR1MKKyNERUJVR19DRkxBR1M9CisKKyMgVW5jb21tZW50IHRvIHR1cm4gb2ZmIHRoZSBvcHRpbWl6ZXIgd2hlbiBkZWJ1Z2dpbmcgKHJlY29tbWVuZGVkKQorI0RFQlVHX09QVElNSVpFPUZBTFNFCisKKyMgQ29tcGlsaW5nIG91dCBhc3NlcnQoKSBzYXZlcyBhYm91dCAxLjElIG9uIGV4ZWN1dGFibGUgc2l6ZSwKKyMgaG93ZXZlciBkbyBzbyBpcyBWRVJZIE1VQ0ggZGlzY291cmFnZWQuCisjREVCVUdfQVNTRVJUUz1GQUxTRQorCisjIENvbnRyb2xsaW5nIEdDQyAtcGVkYW50aWMgZmxhZworI0RFQlVHX1BFREFOVElDPVRSVUUKKworIyBjb21waWxlci5oIG92ZXJyaWRlcywgdGhlc2UgZGlzYWJsZSB2YXJpb3VzIGNvbXBpbGVyCisjIHJlbGF0ZWQgZmVhdHVyZXMgZXZlbiBpZiB0aGUgY29tcGlsZXIgbm9ybWFsbHkgc3VwcG9ydHMgdGhlbQorCisjIERpc2FibGUgdXNlIG9mIGxvbmcgbG9uZyBmb3IgdWludDY0CisjQ0ZHRkxBR1MgKz0gLURDT01QSUxFUl9PVkVSUklERV9OT19MT05HTE9ORworCisjIERpc2FibGUgdXNlIG9mIGRvdWJsZXMKKyNDRkdGTEFHUyArPSAtRENPTVBJTEVSX09WRVJSSURFX05PX0RPVUJMRQorCisjIERpc2FibGUgaW5saW5pbmcgb2YgZnVuY3Rpb25zCisjQ0ZHRkxBR1MgKz0gLURDT01QSUxFUl9PVkVSUklERV9OT19JTkxJTkUKKworIyBEaXNhYmxlIHVzZSBvZiBjb25zdAorI0NGR0ZMQUdTICs9IC1EQ09NUElMRVJfT1ZFUlJJREVfTk9fQ09OU1QKKworIyBEaXNhYmxlIHVzZSBvZiBzdGF0aWMgZnVuY3Rpb25zCisjQ0ZHRkxBR1MgKz0gLURDT01QSUxFUl9PVkVSUklERV9OT19TVEFUSUMKKworIyBEaXNhYmxlIFJQQyBmbGV4aWJsZSAobG9uZykgYml0bWFwcy4KKyMgV2FybmluZzogRGlzYWJsaW5nIHRoaXMgY2hhbmdlcyB0aGUgUlBDIHZlcnNpb24gdG8gMiBhbmQKKyMgbWFrZXMgc3lzdGVtcyBydW5uaW5nIHRoaXMgY29kZSBpbmNvbXBhdGlibGUgd2l0aCBzeXN0ZW1zCisjIHJ1bm5pbmcgcHJldmlvdXMgdmVyc2lvbnMgb2YgQkNNIFJQQyBjb2RlLgorI0NGR0ZMQUdTICs9IC1EQkNNX1JQQ19QQk1QXzY0CisKKyMKKyMgRGVmaW5lIGlmIGxvbmdzIGFyZSA2NCBiaXRzIG9uIHlvdXIgY29tcGlsZXI7CisjIHRoaXMgaXMgdHlwaWNhbGx5IHRydWUgT05MWSBmb3IgNjQtYml0IHByb2Nlc3NvcnMuCisjQ0ZHRkxBR1MgKz0gLURMT05HU19BUkVfNjRCSVRTCisKKyMKKyMgRGVmaW5lIGlmIHBvaW50ZXJzIGFyZSA2NCBiaXRzIG9uIHlvdXIgY29tcGlsZXI7CisjIHRoaXMgaXMgdHlwaWNhbGx5IHRydWUgT05MWSBmb3IgNjQtYml0IHByb2Nlc3NvcnMuCisjIE5PVEU6IFRoaXMgc3VwcG9ydCB3b3JrcyBPTkxZIHVuZGVyIGNvbmRpdGlvbnMgd2hlcmUgdGhlCisjIHVwcGVyIDMyIGJpdHMgZm9yIEFMTCBwb2ludGVycyBhcmUgWkVSTy4KKyNDRkdGTEFHUyArPSAtRFBUUlNfQVJFXzY0QklUUworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQm9vdCBhbmQgRGVidWcgUmVsYXRlZCBPcHRpb25zCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRGVmaW5lIHRoaXMgdG8gYWRkIGRlYnVnIGNvZGUgZm9yIFJYIHBvb2wgYnVmZmVyIHRyYWNraW5nCisjQ0ZHRkxBR1MgKz0gLURCQ01fUlhQX0RFQlVHCisKKyMgQWxsb3cgZGVidWdnaW5nIG9mIFBDSSByZWFkcy93cml0ZXMgKGRlYnVnICtwY2kpCisjQ0ZHRkxBR1MgKz0gLURTT0NfUENJX0RFQlVHCisKKyMgTWFrZSBkZWZhdWx0IGRlYnVnZ2luZyBzZXR0aW5ncyBiZSAwICh2ZXJ5IHZlcnkgcXVpZXQpCisjQ0ZHRkxBR1MgKz0gLUROT19ERUJVR19PVVRQVVRfREVGQVVMVAorCisjIERvbid0IHVzZSB2eE1lbVByb2JlCisjQ0ZHRkxBR1MgKz0gLURWWF9OT19NRU1fUFJPQkUKKworIyBBbGxvdyBkZWJ1Z2dpbmcgb2YgTWVtb3J5IEFsbG9jYXRpb24vRGVhbGxvY2F0aW9uIGxvZ2dpbmcKKyNDRkdGTEFHUyArPSAtRE1FTUxPR19TVVBQT1JUCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgT3BlcmF0aW9uYWwgYW5kIFBvbGljeSBPcHRpb25zCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVkxBTiBwb2xpY3kgY29udHJvbDoKKyMJTk9fREVGQVVMVF9FVEhFUglkbyBub3QgaW5pdCBldGhlciBwb3J0cyBpbnRvIHZsYW4gMQorIwlOT19ERUZBVUxUX0NQVQkJZG8gbm90IGluaXQgY3B1IHBvcnRzIGludG8gdmxhbiAxCisjCU5PX0RFRkFVTFRfU1BJX1NVQlBPUlQJZG8gbm90IGluaXQgc3BpIHN1YnBvcnRzIGludG8gdmxhbiAxCisjCU5PX0FVVE9fU1RBQ0sJCWRvIG5vdCBpbml0IHN0YWNrL0hHIHBvcnRzIGludG8gY3JlYXRlZCB2bGFucworI0NGR0ZMQUdTICs9IC1EQkNNX1ZMQU5fTk9fREVGQVVMVF9FVEhFUgorI0NGR0ZMQUdTICs9IC1EQkNNX1ZMQU5fTk9fREVGQVVMVF9DUFUKKyNDRkdGTEFHUyArPSAtREJDTV9WTEFOX05PX0RFRkFVTFRfU1BJX1NVQlBPUlQKKyNDRkdGTEFHUyArPSAtREJDTV9WTEFOX05PX0FVVE9fU1RBQ0sKKworIyBWTEFOIG11bHRpY2FzdCBmbG9vZCBQb2xpY3kgQ29udHJvbDoKKyMgQkNNX1ZMQU5fTUNBU1RfRkxPT0RfQUxMICAgICAgRmxvb2QgYWxsIG11bHRpY2FzdCBwYWNrZXRzIHRvIHRoZSBWTEFOCisjIEJDTV9WTEFOX01DQVNUX0ZMT09EX1VOS05PV04gIEZsb29kIHVua25vd24gbXVsdGljYXN0IHBhY2tldHMgdG8gdGhlIHZsYW4KKyMgQkNNX1ZMQU5fTUNBU1RfRkxPT0RfTk9ORSAgICAgRm9yd2FyZCBtdWx0aWNhc3QgcGFja2V0cyB3aXRoIGtub3duCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyB0byB0aGUgYXBwcm9wcmlhdGUgcG9ydHMuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBwYWNrZXRzIGRlc3RpbmVkIHRvIGFuIHVua25vd24gbXVsdGljYXN0CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgYXJlIGRyb3BwZWQuCisjQ0ZHRkxBR1MgKz0gLURCQ01fTUNBU1RfRkxPT0RfREVGQVVMVD1CQ01fVkxBTl9NQ0FTVF9GTE9PRF9BTEwKKyNDRkdGTEFHUyArPSAtREJDTV9NQ0FTVF9GTE9PRF9ERUZBVUxUPUJDTV9WTEFOX01DQVNUX0ZMT09EX1VOS05PV04KKyNDRkdGTEFHUyArPSAtREJDTV9NQ0FTVF9GTE9PRF9ERUZBVUxUPUJDTV9WTEFOX01DQVNUX0ZMT09EX05PTkUKKworI1BvcnQgRW5hYmxlL0Rpc2FibGUgUG9saWN5IGNvbnRyb2w6CisjICAgICAgIFBPUlRfREVGQVVMVF9ESVNBQkxFICAgICAgIGRpc2FibGUgcG9ydHMgZHVyaW5nIHN3aXRjaCBpbml0aWFsaXphdGlvbgorI0NGR0ZMQUdTICs9IC1EQkNNX1BPUlRfREVGQVVMVF9ESVNBQkxFCisKKyMgc2FsIHRocmVhZCBwcmlvcml0eSBvdmVycmlkZSAodGhpcyB2YWx1ZSB1c2VkIGZvciBhbGwgdGhyZWFkcyBpZiBkZWZpbmVkKQorI0NGR0ZMQUdTICs9IC1EU0FMX1RIUkVBRF9QUklPUklUWT0yNTUKKworIyBkaXNhYmxlIHByaW50aW5nIG9mIHRocmVhZCBuYW1lIGluIG1lc3NhZ2VzCisjQ0ZHRkxBR1MgKz0gLURTQUxfVEhSRUFEX05BTUVfUFJJTlRfRElTQUJMRQorCisjIGRpc2FibGUgcnVudGltZSByZWFkaW5nIG9mIGZsYXNoIGNvbmZpZy5iY20gZmlsZSAoZXZlbiBpZiAhTk9fRklMRUlPKQorI0NGR0ZMQUdTICs9IC1EU0FMX0NPTkZJR19GSUxFX0RJU0FCTEUKKworIyBkaXNhYmxlIGFsbCBBcHBsaWNhdGlvbiBTQUwgZGVwZW5kZW5jaWVzCisjTk9fU0FMX0FQUEw9MQorCisKKyMgUHJldmVudCBzY2hlZHVsaW5nIGluIFNQTCBsb2NrcyB3aGVuIGludGVycnVwdCBjb2RlIGlzIHJ1biBhcyBhIHRocmVhZC4KKyMgVGhpcyBvcHRpb24gc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgaWYgYWxsIGxvY2tzIGFyZSBpbXBsZW1lbnRlZCBjb3JyZWN0bHksCisjIGhvd2V2ZXIsIHNvbWUgbG9ja3MgbWF5IHN0aWxsIHJlbHkgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBzY2hlZHVsaW5nIGRvZXMKKyMgbm90IG9jY3VyIHdoZW4gaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuIElmIHlvdSBleHBlcmllbmNlIGFueSBsb2NraW5nCisjIHByb2JsZW1zIGluIGUuZy4gTGludXggVXNlciBNb2RlLCB0cnkgZW5hYmxpbmcgdGhpcyBvcHRpb24uCisjIFBsZWFzZSBub3RlIHRoYXQgdHVybmluZyBvbiB0aGlzIG9wdGlvbiB3aWxsIHJlZHVjZSBwZXJmb3JtYW5jZSBieSBhbgorIyBlc3RpbWF0ZWQgNSB0byAxMCAlLgorI0NGR0ZMQUdTICs9IC1EU0FMX1NQTF9OT19QUkVFTVBUCisKKyMgZGlzYWJsZSBtYXBwaW5nIG9mIGhpZ2lnIGNvc3Egd2hlbiBtYXBwaW5nIHByaW9yaXR5IHRvIGNvc3EKKyMgKHVzZSBpZGVudGl0eSBtYXBwaW5nIGluc3RlYWQgOiBtYXAgcHJpbzAtPmNvczAsIHByaW8xLT5jb3MxLCAuLi4gLCBwcmlvNy0+Y29zNykKKyNDRkdGTEFHUyArPSAtREJDTV9DT1NRX0hJR0lHX01BUF9ESVNBQkxFCisKKyMgRW5hYmxlIHVrZXJuZWwgZGVidWdnaW5nIG1vZHVsZQorI0NGR0ZMQUdTICs9IC1EU09DX1VLRVJORUxfREVCVUcKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFN5c3RlbSBNYW5hZ2VtZW50IGFuZCBNdWx0aXBsZSBDUFUgT3B0aW9ucworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFR1cm4gb24gQkNNWCBpbmNsdXNpb24KKyMgICAgIElOQ0xVREVfQkNNWCBmb3IgYW55IHN1cHBvcnQKKyNJTkNMVURFX0JDTVg9MQorCisjIFRlbGVraW5lc2lzIHN1aXRlIGFwcGxpY2F0aW9ucyBmb3IgQ1BVIHRvIENQVSBjb21tdW5pY2F0aW9uIGFuZCBkaXNjb3ZlcnkKKyMgICAgIENQVURCOiAgICAgICAgIFNpbXBsZSBDUFUgZGF0YSBiYXNlIG1hbmFnZXIKKyMgICAgIENQVVRSQU5TOiAgICAgIENQVSB0byBDUFUgY29tbXVuaWNhdGlvbiBtZWNoYW5pc21zCisjICAgICBESVNDT1ZFUjogICAgICBTaW1wbGUgZGlzY292ZXJ5OyB3aWxsIGFsc28gaW5jbHVkZSBDUFVUUkFOUworIyAgICAgU1RLVEFTSzogICAgICAgU3RhY2sgbWFuYWdlciBhcHBsaWNhdGlvbgorIworI0NGR0ZMQUdTICs9IC1ESU5DTFVERV9MSUJfQ1BVREIKKyNDRkdGTEFHUyArPSAtRElOQ0xVREVfTElCX0NQVVRSQU5TCisjQ0ZHRkxBR1MgKz0gLURJTkNMVURFX0xJQl9ESVNDT1ZFUgorI0NGR0ZMQUdTICs9IC1ESU5DTFVERV9MSUJfU1RLVEFTSworCisjIE9wdGlvbiBmb3IgZGlzY292ZXJ5IHRvIHVzZSB0aGUgYXBwbGljYXRpb24tZGF0YSBmaWVsZCBpbiByb3V0aW5nCisjIHBhY2tldHMgZm9yIEJvYXJkLUlEIGFuZCBDUFUgYmFzZSBmbGFnIGluZm9ybWF0aW9uLgorI0NGR0ZMQUdTICs9IC1ERElTQ09WRVJfQVBQX0RBVEFfQk9BUkRJRAorCisjIE9wdGlvbmFsbHkgb3ZlcnJpZGUgbGlzdCBvZiBpbmNsdWRlZCBkaXNwYXRjaCBtb2R1bGVzCisjIE5vdGU6IGluY2x1ZGluZyBSUEMgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgVGVsZWtpbmVzaXMgc3VpdGUgbGlicworIyBFU1cgaXMgdGhlIGVudGVycHJpc2UgcGxhdGZvcm1zLgorIyBST0JPIGluY2x1ZGVzIHRoZSBtYW5hZ2VkIGRldmljZXMuCisjIFNCWCBpbmNsdWRlcyBBUEkgc3VwcG9ydCBmb3IgYmNtOTg4MDIwUVNLMjRYMgorI0RJU1BBVENIX0xJU1QgPSBSUEMgRVNXIEFTWU5DIFNCWAorCisjIERlZmluZSB0byBoYXZlIGVuZC10by1lbmQgZmxvdyBjb250cm9sIGVuYWJsZWQgb24gYm9hcmRzIHRoYXQKKyMgc3VwcG9ydCBpdAorI0NGR0ZMQUdTICs9IC1EQkNNX0JPQVJEX0FVVE9fRTJFCisKKyMgRGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gc3VwcG9ydCBwZXItQ1BVIHRyYW5zbWl0IHBvaW50ZXJzLgorIyBUaGlzIGFsbG93cyB0aGUgVFggc2V0dXAgYW5kIHNlbmQgZnVuY3Rpb25zIHRvIGJlIGRlZmluZWQgb24gYQorIyBwZXItQ1BVIGJhc2lzLCBhbGxvd2luZyBtaXhlZCBpbi1iYW5kIGFuZCBvdXQtb2YtYmFuZCBjb21tdW5pY2F0aW9uLgorI0NGR0ZMQUdTICs9IC1EQkNNX0MyQ19UUkFOU1BPUlRfU1dJVENISU5HCisKKyMgT3B0aW9ucyBmb3IgZmVhdHVyZSBsaXN0IChJTkNMVURFX1hYWCkKKyMgSWYgRkVBVFVSRV9MSVNUIGlzIGRlZmluZWQsIGl0IGlzIGEgbGlzdCBvZiBmZWF0dXJlcyB0byBpbmNsdWRlLgorIyBTZWUgTWFrZS5jb25maWcgZm9yIHRoZSBkZWZhdWx0IGZlYXR1cmUgbGlzdC4KKyMKKyMgQXZhbGlhYmxlIGZlYXR1cmVzOgorIworIyAgICAgQkNNWAorIyAgICAgQkNNWF9ESUFHCisjICAgICBDSEFTU0lTCisjICAgICBDVVNUT01FUgorIyAgICAgRFJJVkVSUworIyAgICAgRURJVExJTkUKKyMgICAgIEkyQworIyAgICAgTDMKKyMgICAgIE1FTV9TQ0FOCisjICAgICBBVFBUUkFOU19TT0NLRVQKKyMgICAgIFRFTE5FVAorIyAgICAgVEVTVAorIyAgICAgQUNMCisjICAgICBSQ1BVCisjICAgICBLTkVUIC0gTGludXggdXNlciBtb2RlIGtlcm5lbCBuZXR3b3JrIHN1cHBvcnQKKyMgICAgIEJDTV9TQUxfUFJPRklMRSAtIG1ha2UgYXZhaWxhYmxlIGFuIEFQSSB0byB0cmFjayBTQUwgdXNhZ2UuCisjICAgICBDSU5UIC0gSW5jbHVkZSB0aGUgQyBJbnRlcnByZXRlciBpbiB0aGUgZGlhZ25vc3RpYyBzaGVsbC4gCisjICAgICAgICAgICAgUGxlYXNlIG5vdGUgdGhpcyBjYW5ub3QgYmUgdXNlZCBpbiBMaW51eCBrZXJuZWwgbW9kZS4gCisjICAgICBDX1VOSVQgLSBJbmNsdWRlIHRoZSBDIHVuaXQgdGVzdGluZyBmcmFtZXdvcmsuICBJZiBDSU5UIGlzIGFsc28gaW5jbHVkZWQKKyMgICAgICAgICAgICAgIHRoZW4gaG9va3Mgd2lsbCBiZSBwcm92aWRlZCBmb3IgdXNlIGZyb20gaXQuCisjICAgICBQSFlfU1lNX0RCRyAtIFBIWSBHVUkgTURJTyByZWFkL3dyaXRlIHN1cHBvcnQuIFNvY2tldCBpbnRlcmZhY2UKKyMgICAgICAgICAgICAgICAgICAgdG8gUEhZIEdVSSBmb3IgU3ltYm9saWMgZGVidWdnaW5nLgorIyAgICAgQVBJTU9ERSAtIGNhbGwgU0RLIEFQSSBmdW5jdGlvbnMgZnJvbSBzaGVsbCwgcmVxdWlyZXMgQ0lOVAorIyAgICAgRFVORV9VSSAtIGR1bmUgbGVnYWN5IHVzZXIgaW50ZXJmYWNlLiBGb3IgZGVidWcgb25seS4gVGVzdGVkCisjICAgICAgICAgICAgICAgb24gbGludXgtdXNlci1ndG8tMi42IG9ubHkuCisjICAgICBLQlAgICAtICAgaW5jbHVkZSBubG0yKDExSykvbmxtMygxMkspIEtCUCBzdXBwb3J0CisjICAgICBCSEggICAtICAgSW5jbHVkZSBTdXBwb3J0IGZvciBCSEggQXBwbGljYXRpb24gKE1QTFMtVFAgT0FNIGJhc2VkIG9uIFkuMTczMSkgCisjICAgICAgICAgICAgICAgdXNpbmcgQlRFIG9uIHNlbGVjdCBkZXZpY2VzLgorIyAgICAgQVZTICAgLSBJbmNsdWRlIEFWUyBzdXBwb3J0CisjRkVBVFVSRV9MSVNUPUFUUFRSQU5TX1NPQ0tFVCBCQ01YX0RJQUcgTDMgSTJDIEJDTVggTUVNX1NDQU4gRURJVExJTkUgXAorIyAgICBDVVNUT01FUiBURUxORVQgRFJJVkVSUyBDSEFTU0lTIFRFU1QgQUNMIFJDUFUgQkNNX1NBTF9QUk9GSUxFIENJTlQgXAorIyAgICBQVFAgQ0VTIEZDTUFQIEJPQVJEIEtORVQgUkVHRVggTUFDU0VDIEFQSU1PREUgQkZEIEtCUCBBVlMKKworRkVBVFVSRV9MSVNUPSBJTlRSIENJTlQgQlNBRkUgQVRQVFJBTlNfU09DS0VUIEwzIEkyQyBNRU1fU0NBTiBFRElUTElORSBURUxORVQgRFJJVkVSUyBDSEFTU0lTIFRFU1QgQkNNX1NBTF9QUk9GSUxFIFJDUFUgRFVORV9VSQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgICAgICAgICAgIEtCUCBzdXBwb3J0ZWQgZGV2aWNlcworIworI0VuYWJsZSB0aGlzIGZvciAxMUsgZGV2aWNlIHN1cHBvcnQKKyNLQlBfREVWSUNFID0gS0JQXzExSworIworI0VuYWJsZSB0aGlzIGZvciAxMksgZGV2aWNlIHN1cHBvcnQKKyNLQlBfREVWSUNFID0gS0JQX0FMRworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU2VsZWN0aXZlIERldmljZSBTdXBwb3J0IChTd2l0Y2hlcyBhbmQgUEhZcykKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBNdWx0aXBsZSBDaGlwIFN1cHBvcnQKKyMKKyMgQnkgZGVmYXVsdCwgdGhlIGRyaXZlciBzdXBwb3J0cyBhbGwgU3RyYXRhIHN3aXRjaCBhbmQgZmFicmljIGNoaXBzCisjIGluY2x1ZGVkIGluIHRoaXMgc29mdHdhcmUgcmVsZWFzZS4gIEl0IGNoZWNrcyBkZXZpY2UgSURzIGF0IHJ1bnRpbWUKKyMgdG8gcnVuIHRoZSBjb3JyZWN0IGRyaXZlciBtb2R1bGVzLgorIworIyBUbyBzYXZlIHNwYWNlLCB0aGUgZHJpdmVyIGNhbiBiZSBjb21waWxlZCB0byBzdXBwb3J0IGp1c3QgYSBzdWJzZXQgb2YKKyMgdGhlIGNoaXBzLiAgVG8gZG8gdGhpcywgdW5jb21tZW50IHRoZSBsaW5lIGZvciBCQ01fUFRMX1NQVCAocGFydGlhbAorIyBzdXBwb3J0KSBhbmQgdW5jb21tZW50IG9uZSBsaW5lIGZvciBlYWNoIGNoaXAgdG8gc3VwcG9ydC4KKyMKKyMgTm90ZSB0aGF0IHRoZXJlIGFyZSBhIGxvdCBtb3JlIGNoaXBzIHRoYW4gZHJpdmVycy4KKyMgRm9yIGV4YW1wbGUsIHRoZSBCQ001NjE1IGRyaXZlciBpcyBhbHNvIHVzZWQgZm9yIEJDTTU2MjUgYW5kIEJDTTU2NDUuCisjCisKK0JDTV9QVExfU1BUID0gMQorCisjQkNNXzU2NzVfQTAgPSAxCisjQkNNXzU2MTAyX0EwID0gMQorI0JDTV81NjExMl9BMCA9IDEKKyNCQ01fNTYzMDRfQjAgPSAxCisjQkNNXzU2MzE0X0EwID0gMQorI0JDTV81NjUwNF9BMCA9IDEKKyNCQ01fNTY1MDRfQjAgPSAxCisjQkNNXzU2NTE0X0EwID0gMQorI0JDTV81NjYyNF9BMCA9IDEKKyNCQ01fNTY2MjRfQjAgPSAxCisjQkNNXzU2NjgwX0EwID0gMQorI0JDTV81NjY4MF9CMCA9IDEKKyNCQ01fNTY1ODBfQTAgPSAxCisjQkNNXzU2NzAwX0EwID0gMQorI0JDTV81NjgwMF9BMCA9IDEKKyNCQ01fNTYyMThfQTAgPSAxCisjQkNNXzU2MjI0X0EwID0gMQorI0JDTV81NjIyNF9CMCA9IDEKKyNCQ01fNTY3MjVfQTAgPSAxCisjQkNNXzU2ODIwX0EwID0gMQorI0JDTV81MzMxNF9BMCA9IDEKKyNCQ01fNTMzMjRfQTAgPSAxCisjQkNNXzU2NjM0X0EwID0gMQorI0JDTV81NjYzNF9CMCA9IDEKKyNCQ01fNTY1MjRfQTAgPSAxCisjQkNNXzU2NTI0X0IwID0gMQorI0JDTV81NjY4NV9BMCA9IDEKKyNCQ01fNTY2ODVfQjAgPSAxCisjQkNNXzU2MzM0X0EwID0gMQorI0JDTV81NjMzNF9CMCA9IDEKKyNCQ01fNTY4NDBfQTAgPSAxCisjQkNNXzU2ODQwX0IwID0gMQorI0JDTV81Njg1MF9BMCA9IDEKKyNCQ01fNTYxNDJfQTAgPSAxCisjQkNNXzU2MTUwX0EwID0gMQorI0JDTV81NjgzNl9BMCA9IDEKKyNCQ01fNTY2NDBfQTAgPSAxCisjQkNNXzU2NDQwX0EwID0gMQorI0JDTV81NjQ0MF9CMCA9IDEKKyNCQ01fNTY0NTBfQTAgPSAxCisjQkNNXzU2OTYwX0EwID0gMQorI0JDTV81Njg2MF9BMCA9IDEKKworI0JDTV81MzM4X0EwID0gMQorI0JDTV81MzgwX0EwID0gMQorI0JDTV81MzM4X0IwID0gMQorI0JDTV81MzI1X0ExID0gMQorCisjQkNNXzUzMjRfQTAgPSAxCisjQkNNXzUzOTZfQTAgPSAxCisjQkNNXzUzODlfQTAgPSAxCisjQkNNXzUzOThfQTAgPSAxCisjQkNNXzUzMjRfQTEgPSAxCisjQkNNXzUzMTE1X0EwID0gMQorI0JDTV81MzExOF9BMCA9IDEKKyNCQ01fNTMyODBfQTAgPSAxCisjQkNNXzUzMjgwX0IwID0gMQorI0JDTV81MzEwMV9BMCA9IDEKKyNCQ01fNTMxMjVfQTAgPSAxCisjQkNNXzUzMTI4X0EwID0gMQorI0JDTV81MzYwMF9BMCA9IDEKKyNCQ01fODk1MDBfQTAgPSAxCisKKyNCQ01fODgwMzBfQTAgPSAxCisjQkNNX1FFMjAwMF9BMCA9IDEKKyNCQ01fQk1FMzIwMF9CMCA9IDEKKyNCQ01fQk05NjAwX0EwID0gMQorI0JDTV84ODIzMF9BMCA9IDEKKyNCQ01fODgyMzBfQjAgPSAxCisjQkNNXzg4MjMwX0MwID0gMQorQkNNXzg4NjQwX0EwPTEKK0JDTV84ODY1MF9BMD0xCitCQ01fODg2NTBfQjA9MQorQkNNXzg4NjYwX0EwPTEKKworI0JDTV9USzM3MVhfQTAgPSAxCisKKyMgT3B0aW9ucyBmb3IgbXVsdGlwbGUgUEhZIHN1cHBvcnQKKyMgSWYgQkNNX1BIWV9MSVNUIGlzIGRlZmluZWQsIGl0IGlzIGEgbGlzdCBvZiBQSFlzIHRvIGluY2x1ZGUuCisjIFRoZSBkZWZhdWx0IGlzIHRvIGluY2x1ZGUgYWxsIG9mIHRoZW0uCisjIElmIG5vbmUgb2YgdGhlbSBzaG91bGQgYmUgaW5jbHVkZWQgc3BlY2lmeSBCQ01fUEhZX0xJU1Q9RU1QVFkKKyNCQ01fUEhZX0xJU1Q9NTIyWCA1NFhYIDU0NjQgNTQyMVMgNTQ4MiA1NDYxNiA1NDY4MCA1NDY4MEUgNTI2ODFFIDU0ODgwRSA1NDY4MiA1NDY4NCA1NDY0MCA1NDY0MEUgNTQ4ODAgU0VSREVTIFNJTVVMIDg3MDMgODcwNSA4NzA2IDgwNzIgODA0MCA4NDgxIDg3NTAgODcyOSA4NDc0MCA4NDc1NiA4NDMyOCBFTVBUWQorCisjIE9wdGlvbnMgZm9yIEJDTTUzMzggNTM4MAorI0NGR0ZMQUdTICs9IC1EUk9CT19PTEQKKyNST0JPX09MRCA9IDEKKworIyBTdXBwb3J0IGZvciBwaHkgc2ltdWxhdGlvbgorI0NGR0ZMQUdTICs9IC1ESU5DTFVERV9QSFlfU0lNVUwKKyNDRkdGTEFHUyArPSAtRFNJTV9BTExfUEhZUyAgICAgICAgIyBBbGwgcGh5cyB1c2Ugc2ltdWxhdGlvbiBkcml2ZXIKKyNDRkdGTEFHUyArPSAtRFNJTV9DTUlDX0xJTktfU1RBVCAgIyBHZXQgbGluayBzdGF0dXMgZnJvbSBDTUlDIHJlZ2lzdGVyCisKKyMgU3VwcG9ydCBmb3IgQk9BUkQgbGlicmFyeQorIyBpZiBCT0FSRF9MSVNUIGlzIGRlZmluZWQsIGl0IGlzIGEgbGlzdCBvZiBCb2FyZCBkcml2ZXJzIHRvIGluY2x1ZGUuCisjIFRoZSBkZWZhdWx0IGlzIHRvIGluY2x1ZGUgYWxsIGJvYXJkIGRyaXZlcnMgYXBwcm9wcmlhdGUgZm9yIHRoZSBkZXZpY2VzCisjIGluY2x1ZGVkIGluIHRoZSBidWlsZC4gSWYgbm9uZSBvZiB0aGVtIHNob3VsZCBiZSBpbmNsdWRlZCBzcGVjaWZ5CisjIEJPQVJEX0xJU1Q9RU1QVFkuCisjQk9BUkRfTElTVD1HRU5FUklDCisKKyMgU3VwcG9ydCBmb3IgZXZlbnQgbG9nZ2luZworI0NGR0ZMQUdTICs9IC1ESU5DTFVERV9TSEFSRURfRVZMT0cKKworIyBTdXBwb3J0IGZvciBCQ00gQVBJIHBvcnQgdHJhbnNsYXRpb24KKyNDRkdGTEFHUyArPSAtRElOQ0xVREVfQkNNX0FQSV9YTEFURV9QT1JUCisKKyMgU3VwcG9ydCBmb3IgY2FsbGJhY2sgZXJyb3IgY2hlY2tzIGFuZCBhYm9ydCBpbiB0cmF2ZXJzZSBhcGkncworI0NGR0ZMQUdTICs9IC1EQkNNX0NCX0FCT1JUX09OX0VSUgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNaXNjIE9wdGlvbnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtRFNPQ19NRU1fTDNfREVGSVBfV0FSCisKKyMgQ29tcGlsZSBvdXQgUmVnaXN0ZXIvVGFibGUgZGVzY3JpcHRpdmUgc3RyaW5ncyB0byBnZW5lcmF0ZSBhCisjIGNvbXBhY3QgaW1hZ2UKKyNDRkdGTEFHUyArPS1EU09DX05PX05BTUVTCisjQ0ZHRkxBR1MgKz0tRFNPQ19OT19BTElBUworI0NGR0ZMQUdTICs9LURTT0NfTk9fREVTQworCisjIFJlbG9hZC9XYXJtQm9vdCBTdXBwb3J0CisjCitDRkdGTEFHUyArPSAtREJDTV9XQVJNX0JPT1RfU1VQUE9SVAorIworIyBOZWVkIHRoaXMgZm9yIHZhbGlkYXRpb24gdXNpbmcgU09DIHNjcmlwdHM7IFdpbGwgbW92ZSB0byB0Y2wgCisjIHNvbWVkYXkKK0NGR0ZMQUdTICs9IC1EQkNNX1dBUk1fQk9PVF9TVVBQT1JUX1NXX0RVTVAKKyMKKyMgQWRkcyBhIENSQyBjaGVjayBvbiBzY2FjaGUgYnVmZmVyOiBDYWxjdWxhdGUgd2hlbiBzYXZpbmcsCisjIGFuZCB2ZXJpZnkgd2hlbiBsb2FkaW5nLgorIyBXaGVuIGRvaW5nIElTU1UsIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiB2ZXJzaW9ucyBzaG91bGQgZWl0aGVyIGhhdmUKKyMgdGhpcyBmbGFnIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisjQ0ZHRkxBR1MgKz0gLURTQ0FDSEVfQ1JDX0NIRUNLCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRW5hYmxlIEVhc3kgUmVsb2FkIFN1cHBvcnQKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtREJDTV9FQVNZX1JFTE9BRF9TVVBQT1JUCisjIEZvciB2YWxpZGF0aW9uIHB1cnBvc2VzCisjQ0ZHRkxBR1MgKz0gLURCQ01fRUFTWV9SRUxPQURfU1VQUE9SVF9TV19EVU1QCisKKyMgU29mdHdhcmUgVHJ1bmsgZmFpbG92ZXIgU3VwcG9ydAorIworI0NGR0ZMQUdTICs9IC1EQkNNX1RSVU5LX0ZBSUxPVkVSX1NVUFBPUlQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBPdmVycmlkZSBkZWZhdWx0IFZYV09SS1MgdGhyZWFkIG9wdGlvbnMgdG8gbWFrZSBzZXQgCisjIFZYX1VOQlJFQUtBQkxFIGZsYWcgaW4gdGFzayBjcmVhdGlvbi4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtRFZYX1RIUkVBRF9PUFRfVU5CUkVBS0FCTEUKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFVzZSBkZWZhdWx0IHByaW9yaXR5IGZvciBCREUgaW50ZXJydXB0IHRocmVhZC4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtRFNBTF9CREVfVEhSRUFEX1BSSU9fREVGQVVMVAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFVzZSBjYWNoZWQgRE1BIG1lbW9yeSB3aGVuIG1hcHBpbmcga2VybmVsIERNQSBtZW1vcnkgdG8gdXNlcgorIyBtb2RlLiBTaG91bGQgb25seSBiZSBlbmFibGVkIG9uIGNhY2hlLWNvaGVyZW50IHBsYXRmb3Jtcy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtRFNBTF9CREVfQ0FDSEVfRE1BX01FTQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRha2UgdGhlIHNwbCBsb2NrIHVwb24gZW50ZXJpbmcgYW4gSVNSCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURTQUxfU1BMX0xPQ0tfT05fSVJRCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU2lsZW50bHkgaWdub3JlIE5VTEwgcG9pbnRlciBmcmVlIGluIHNhbF9mcmVlIEFQSQorIyBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBhc3NlcnQgaWYgYSBOVUxMIHBvaW50ZXIgaXMgcGFzc2VkIHRvIHNhbF9mcmVlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURTQUxfRlJFRV9OVUxMX0lHTk9SRQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEVuYWJsZSBTQlggTVBMUyBUUCBzdXBwb3J0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURCQ01fU0JYX01QTFNUUF9TVVBQT1JUCisjQ0ZHRkxBR1MgKz0gLURCQ01fU0JYX0MxX01QTFNUUF9TVVBQT1JUCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmVzdHJpY3QgU0JYIEMyIEZ0ZSByYW5nZSB0byBDMidzIHJhbmdlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURCQ01fU0JYX0MxX0MyX0lOVEVST1AKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBGb3IgaGlzdG9yaWNhbCByZWFzb25zIHRoZSBQQ0kgcHJvYmUgZnVuY3Rpb24gc2tpcHMgZGV2aWNlIDEyCisjIGJ5IGRlZmF1bHQgdG8gcHJldmVudCBhIHN5c3RlbSBoYW5nIG9uIGNlcnRhaW4gcGxhdGZvcm1zLgorIyBTZXQgdGhpcyB2YWx1ZSB0byB6ZXJvIHRvIHByb2JlIGFsbCBQQ0kgZGV2aWNlcy4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtRE9WRVJSSURFX1BDSV9TS0lQX0RFVl9NQVNLPTAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPdmVycmlkZSBtYXggZGV2aWNlcyBzdXBwb3J0ZWQgYnkgUExJIEJERQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EUExJX01BWF9ERVZJQ0VTCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVHJhY2sgQkNNIEFQSSBjYWxscyB0byBhdm9pZCBkZWluaXRpYWxpemF0aW9uIHdoaWxlIGNhbGxzIGFjdGl2ZQorIyBUaGlzIHdpbGwgaW5jdXIgYSBzbWFsbCB0aW1lIHBlbmFsdHkgZm9yIGVhY2ggQkNNIEFQSSBjYWxsCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURCQ01fQ09OVFJPTF9BUElfVFJBQ0tJTkcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPdmVycmlkZSBkZWZhdWx0IHJldHJ5IHRpbWUgZm9yIGRldGFjaCB0byB3YWl0IGZvciBleGVjdXRpbmcKKyMgQVBJcyB0byBjb21wbGV0ZS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtREJDTV9ERVRBQ0hfUE9MTF9JTlRFUlZBTF9VU0VDU19ERUZBVUxUPTEwMDAwMAorI0NGR0ZMQUdTICs9IC1EQkNNX0RFVEFDSF9OVU1fUkVUUklFU19ERUZBVUxUPTMwMDAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEaXNhYmxlIHRoZSBSWCBtb2R1bGUgaW5pdGlhbGl6YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtREJDTV9SWF9ESVNBQkxFCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRW5hYmxlIFRYIGNhbGxiYWNrIGluIGludGVycnVwdCB0aHJlYWQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtRFRYX0NCX0lOVFIKKworb3ZlcnJpZGUgU0JYX0NISVBTPQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9tYWtlL01ha2UubG9jYWwua3QyIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9tYWtlL01ha2UubG9jYWwua3QyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3ODc2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL21ha2UvTWFrZS5sb2NhbC5rdDIKQEAgLTAsMCArMSw1NjIgQEAKKyMgJElkOiBNYWtlLmxvY2FsLnRlbXBsYXRlLHYgMS4xODEgQnJvYWRjb20gU0RLICQKKyMgJENvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24uCisjIFRoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24KKyMgYW5kL29yIGl0cyBsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZAorIyBvciBkaXN0cmlidXRlZCBwdXJzdWFudCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwKKyMgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZCBiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20KKyMgKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4gYW4gQXV0aG9yaXplZAorIyBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKKyMgdG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kCisjIEJyb2FkY29tIGV4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUKKyMgYW5kIGFsbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRQorIyBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUgTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUKKyMgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkgQlJPQURDT00gQU5EIERJU0NPTlRJTlVFCisjIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLiAgCisjICAKKyMgRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyMgIAorIyAxLiAgICAgVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyMgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisjIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsCisjIGFuZCB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZgorIyBCcm9hZGNvbSBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisjICAKKyMgMi4gICAgIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMKKyMgUFJPVklERUQgIkFTIElTIiBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywKKyMgUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksCisjIE9SIE9USEVSV0lTRSwgV0lUSCBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWQorIyBESVNDTEFJTVMgQU5ZIEFORCBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksCisjIE5PTklORlJJTkdFTUVOVCwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywKKyMgQUNDVVJBQ1kgT1IgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IKKyMgQ09SUkVTUE9OREVOQ0UgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcKKyMgT1VUIE9GIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisjIAorIyAzLiAgICAgVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMCisjIEJST0FEQ09NIE9SIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwKKyMgSU5DSURFTlRBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIKKyMgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkKKyMgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCisjIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRgorIyBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRSBTT0ZUV0FSRSBJVFNFTEYgT1IgVVNEIDEuMDAsCisjIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUyBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcKKyMgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZIExJTUlURUQgUkVNRURZLiQKKyMKKworIyBVc2FnZSBmb3IgTWFrZS5sb2NhbC50ZW1wbGF0ZSBhbmQgTWFrZS5sb2NhbDoKKyMKKyMgTWFrZS5sb2NhbC50ZW1wbGF0ZSBpcyBjaGVja2VkIGludG8gdGhlIHRyZWUsIGJ1dCBNYWtlLmxvY2FsIGlzIG5ldmVyCisjIGNoZWNrZWQgaW4uICBDb3B5IE1ha2UubG9jYWwudGVtcGxhdGUgdG8gTWFrZS5sb2NhbCwgdGhlbiBjaGFuZ2UKKyMgTWFrZS5sb2NhbCB0byBzZWxlY3QgdGhlIGRlc2lyZWQgY29tcGlsYXRpb24gb3B0aW9ucyAobW9zdGx5IGRlYnVnZ2luZworIyBmZWF0dXJlcykuCisjCisjIE5vdGUgb24gQ0ZHRkxBR1MgdXNhZ2U6CisjCisjICAgQmVjYXVzZSBDRkdGTEFHUyBtYXkgYmUgdXNlZCB3aXRoIG90aGVyIHNvdXJjZSBwcmVwcm9jZXNzaW5nIHRvb2xzLAorIyAgIHBsZWFzZSBsaW1pdCB0aGUgdmFsdWVzIGFkZGVkIHRvIENGR0ZMQUdTIHRvIC1EIGRlZmluZXMuCisjCisjCisjIFRhYmxlIG9mIENvbnRlbnRzOgorIworIyAgICAgQ29tcGlsZXIgUmVsYXRlZCBPcHRpb25zCisjICAgICBCb290IGFuZCBEZWJ1ZyBSZWxhdGVkIE9wdGlvbnMKKyMgICAgIE9wZXJhdGlvbmFsIGFuZCBQb2xpY3kgT3B0aW9ucworIyAgICAgU3lzdGVtIE1hbmFnZW1lbnQgYW5kIE11bHRpcGxlIENQVSBPcHRpb25zCisjICAgICBTZWxlY3RpdmUgRGV2aWNlIFN1cHBvcnQgKFN3aXRjaGVzIGFuZCBQSFlzKQorIyAgICAgTWlzY2VsbGFuZW91cyBPcHRpb25zCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQ29tcGlsZXIgUmVsYXRlZCBPcHRpb25zCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQ29tcGlsaW5nIG91dCAjaWZkZWYgREVCVUcgY29kZSBzYXZlcyBhYm91dCAxLjMlIG9uIGV4ZWN1dGFibGUgc2l6ZS4KKyMgSXQgaXMgcmVjb21tZW5kZWQgdG8gbGVhdmUgZGVidWcgZW5hYmxlZCB3aGVuIGRldmVsb3BpbmcgYXBwbGljYXRpb25zLgorI0RFQlVHX0lGREVGUz1GQUxTRQorCisjIFNBTCByZXNvdXJjZSB1c2FnZSB0cmFja2luZyAjaWZkZWYgY29udHJvbAorIyBERUJVR19JRkRFRlMgc2hvdWxkIGFsc28gYmUgIFRSVUUgZm9yIHRoaXMgc3dpdGNoIHRvIHRha2UgZWZmZWN0LgorI0JDTV9SRVNPVVJDRV9VU0FHRV9QUk9GSUxFX0lGREVGUz1UUlVFCisKKyMgVW5jb21tZW50IHRvIGJ1aWxkIHdpdGhvdXQgZGVidWcgc3ltYm9scworI0RFQlVHX1NZTUJPTFM9RkFMU0UKKworIyBVbmNvbW1lbnQgdG8gYWRkIHByaXZhdGUgQ0ZMQUdTCisjREVCVUdfQ0ZMQUdTPQorCisjIFVuY29tbWVudCB0byB0dXJuIG9mZiB0aGUgb3B0aW1pemVyIHdoZW4gZGVidWdnaW5nIChyZWNvbW1lbmRlZCkKKyNERUJVR19PUFRJTUlaRT1GQUxTRQorCisjIENvbXBpbGluZyBvdXQgYXNzZXJ0KCkgc2F2ZXMgYWJvdXQgMS4xJSBvbiBleGVjdXRhYmxlIHNpemUsCisjIGhvd2V2ZXIgZG8gc28gaXMgVkVSWSBNVUNIIGRpc2NvdXJhZ2VkLgorI0RFQlVHX0FTU0VSVFM9RkFMU0UKKworIyBDb250cm9sbGluZyBHQ0MgLXBlZGFudGljIGZsYWcKKyNERUJVR19QRURBTlRJQz1UUlVFCisKKyMgY29tcGlsZXIuaCBvdmVycmlkZXMsIHRoZXNlIGRpc2FibGUgdmFyaW91cyBjb21waWxlcgorIyByZWxhdGVkIGZlYXR1cmVzIGV2ZW4gaWYgdGhlIGNvbXBpbGVyIG5vcm1hbGx5IHN1cHBvcnRzIHRoZW0KKworIyBEaXNhYmxlIHVzZSBvZiBsb25nIGxvbmcgZm9yIHVpbnQ2NAorI0NGR0ZMQUdTICs9IC1EQ09NUElMRVJfT1ZFUlJJREVfTk9fTE9OR0xPTkcKKworIyBEaXNhYmxlIHVzZSBvZiBkb3VibGVzCisjQ0ZHRkxBR1MgKz0gLURDT01QSUxFUl9PVkVSUklERV9OT19ET1VCTEUKKworIyBEaXNhYmxlIGlubGluaW5nIG9mIGZ1bmN0aW9ucworI0NGR0ZMQUdTICs9IC1EQ09NUElMRVJfT1ZFUlJJREVfTk9fSU5MSU5FCisKKyMgRGlzYWJsZSB1c2Ugb2YgY29uc3QKKyNDRkdGTEFHUyArPSAtRENPTVBJTEVSX09WRVJSSURFX05PX0NPTlNUCisKKyMgRGlzYWJsZSB1c2Ugb2Ygc3RhdGljIGZ1bmN0aW9ucworI0NGR0ZMQUdTICs9IC1EQ09NUElMRVJfT1ZFUlJJREVfTk9fU1RBVElDCisKKyMgRGlzYWJsZSBSUEMgZmxleGlibGUgKGxvbmcpIGJpdG1hcHMuCisjIFdhcm5pbmc6IERpc2FibGluZyB0aGlzIGNoYW5nZXMgdGhlIFJQQyB2ZXJzaW9uIHRvIDIgYW5kCisjIG1ha2VzIHN5c3RlbXMgcnVubmluZyB0aGlzIGNvZGUgaW5jb21wYXRpYmxlIHdpdGggc3lzdGVtcworIyBydW5uaW5nIHByZXZpb3VzIHZlcnNpb25zIG9mIEJDTSBSUEMgY29kZS4KKyNDRkdGTEFHUyArPSAtREJDTV9SUENfUEJNUF82NAorCisjCisjIERlZmluZSBpZiBsb25ncyBhcmUgNjQgYml0cyBvbiB5b3VyIGNvbXBpbGVyOworIyB0aGlzIGlzIHR5cGljYWxseSB0cnVlIE9OTFkgZm9yIDY0LWJpdCBwcm9jZXNzb3JzLgorI0NGR0ZMQUdTICs9IC1ETE9OR1NfQVJFXzY0QklUUworCisjCisjIERlZmluZSBpZiBwb2ludGVycyBhcmUgNjQgYml0cyBvbiB5b3VyIGNvbXBpbGVyOworIyB0aGlzIGlzIHR5cGljYWxseSB0cnVlIE9OTFkgZm9yIDY0LWJpdCBwcm9jZXNzb3JzLgorIyBOT1RFOiBUaGlzIHN1cHBvcnQgd29ya3MgT05MWSB1bmRlciBjb25kaXRpb25zIHdoZXJlIHRoZQorIyB1cHBlciAzMiBiaXRzIGZvciBBTEwgcG9pbnRlcnMgYXJlIFpFUk8uCisjQ0ZHRkxBR1MgKz0gLURQVFJTX0FSRV82NEJJVFMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEJvb3QgYW5kIERlYnVnIFJlbGF0ZWQgT3B0aW9ucworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIERlZmluZSB0aGlzIHRvIGFkZCBkZWJ1ZyBjb2RlIGZvciBSWCBwb29sIGJ1ZmZlciB0cmFja2luZworI0NGR0ZMQUdTICs9IC1EQkNNX1JYUF9ERUJVRworCisjIEFsbG93IGRlYnVnZ2luZyBvZiBQQ0kgcmVhZHMvd3JpdGVzIChkZWJ1ZyArcGNpKQorI0NGR0ZMQUdTICs9IC1EU09DX1BDSV9ERUJVRworCisjIE1ha2UgZGVmYXVsdCBkZWJ1Z2dpbmcgc2V0dGluZ3MgYmUgMCAodmVyeSB2ZXJ5IHF1aWV0KQorI0NGR0ZMQUdTICs9IC1ETk9fREVCVUdfT1VUUFVUX0RFRkFVTFQKKworIyBEb24ndCB1c2UgdnhNZW1Qcm9iZQorI0NGR0ZMQUdTICs9IC1EVlhfTk9fTUVNX1BST0JFCisKKyMgQWxsb3cgZGVidWdnaW5nIG9mIE1lbW9yeSBBbGxvY2F0aW9uL0RlYWxsb2NhdGlvbiBsb2dnaW5nCisjQ0ZHRkxBR1MgKz0gLURNRU1MT0dfU1VQUE9SVAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE9wZXJhdGlvbmFsIGFuZCBQb2xpY3kgT3B0aW9ucworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFZMQU4gcG9saWN5IGNvbnRyb2w6CisjCU5PX0RFRkFVTFRfRVRIRVIJZG8gbm90IGluaXQgZXRoZXIgcG9ydHMgaW50byB2bGFuIDEKKyMJTk9fREVGQVVMVF9DUFUJCWRvIG5vdCBpbml0IGNwdSBwb3J0cyBpbnRvIHZsYW4gMQorIwlOT19ERUZBVUxUX1NQSV9TVUJQT1JUCWRvIG5vdCBpbml0IHNwaSBzdWJwb3J0cyBpbnRvIHZsYW4gMQorIwlOT19BVVRPX1NUQUNLCQlkbyBub3QgaW5pdCBzdGFjay9IRyBwb3J0cyBpbnRvIGNyZWF0ZWQgdmxhbnMKKyNDRkdGTEFHUyArPSAtREJDTV9WTEFOX05PX0RFRkFVTFRfRVRIRVIKKyNDRkdGTEFHUyArPSAtREJDTV9WTEFOX05PX0RFRkFVTFRfQ1BVCisjQ0ZHRkxBR1MgKz0gLURCQ01fVkxBTl9OT19ERUZBVUxUX1NQSV9TVUJQT1JUCisjQ0ZHRkxBR1MgKz0gLURCQ01fVkxBTl9OT19BVVRPX1NUQUNLCisKKyMgVkxBTiBtdWx0aWNhc3QgZmxvb2QgUG9saWN5IENvbnRyb2w6CisjIEJDTV9WTEFOX01DQVNUX0ZMT09EX0FMTCAgICAgIEZsb29kIGFsbCBtdWx0aWNhc3QgcGFja2V0cyB0byB0aGUgVkxBTgorIyBCQ01fVkxBTl9NQ0FTVF9GTE9PRF9VTktOT1dOICBGbG9vZCB1bmtub3duIG11bHRpY2FzdCBwYWNrZXRzIHRvIHRoZSB2bGFuCisjIEJDTV9WTEFOX01DQVNUX0ZMT09EX05PTkUgICAgIEZvcndhcmQgbXVsdGljYXN0IHBhY2tldHMgd2l0aCBrbm93bgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgdG8gdGhlIGFwcHJvcHJpYXRlIHBvcnRzLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcGFja2V0cyBkZXN0aW5lZCB0byBhbiB1bmtub3duIG11bHRpY2FzdAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGFyZSBkcm9wcGVkLgorI0NGR0ZMQUdTICs9IC1EQkNNX01DQVNUX0ZMT09EX0RFRkFVTFQ9QkNNX1ZMQU5fTUNBU1RfRkxPT0RfQUxMCisjQ0ZHRkxBR1MgKz0gLURCQ01fTUNBU1RfRkxPT0RfREVGQVVMVD1CQ01fVkxBTl9NQ0FTVF9GTE9PRF9VTktOT1dOCisjQ0ZHRkxBR1MgKz0gLURCQ01fTUNBU1RfRkxPT0RfREVGQVVMVD1CQ01fVkxBTl9NQ0FTVF9GTE9PRF9OT05FCisKKyNQb3J0IEVuYWJsZS9EaXNhYmxlIFBvbGljeSBjb250cm9sOgorIyAgICAgICBQT1JUX0RFRkFVTFRfRElTQUJMRSAgICAgICBkaXNhYmxlIHBvcnRzIGR1cmluZyBzd2l0Y2ggaW5pdGlhbGl6YXRpb24KKyNDRkdGTEFHUyArPSAtREJDTV9QT1JUX0RFRkFVTFRfRElTQUJMRQorCisjIHNhbCB0aHJlYWQgcHJpb3JpdHkgb3ZlcnJpZGUgKHRoaXMgdmFsdWUgdXNlZCBmb3IgYWxsIHRocmVhZHMgaWYgZGVmaW5lZCkKKyNDRkdGTEFHUyArPSAtRFNBTF9USFJFQURfUFJJT1JJVFk9MjU1CisKKyMgZGlzYWJsZSBwcmludGluZyBvZiB0aHJlYWQgbmFtZSBpbiBtZXNzYWdlcworI0NGR0ZMQUdTICs9IC1EU0FMX1RIUkVBRF9OQU1FX1BSSU5UX0RJU0FCTEUKKworIyBkaXNhYmxlIHJ1bnRpbWUgcmVhZGluZyBvZiBmbGFzaCBjb25maWcuYmNtIGZpbGUgKGV2ZW4gaWYgIU5PX0ZJTEVJTykKKyNDRkdGTEFHUyArPSAtRFNBTF9DT05GSUdfRklMRV9ESVNBQkxFCisKKyMgZGlzYWJsZSBhbGwgQXBwbGljYXRpb24gU0FMIGRlcGVuZGVuY2llcworI05PX1NBTF9BUFBMPTEKKworCisjIFByZXZlbnQgc2NoZWR1bGluZyBpbiBTUEwgbG9ja3Mgd2hlbiBpbnRlcnJ1cHQgY29kZSBpcyBydW4gYXMgYSB0aHJlYWQuCisjIFRoaXMgb3B0aW9uIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIGFsbCBsb2NrcyBhcmUgaW1wbGVtZW50ZWQgY29ycmVjdGx5LAorIyBob3dldmVyLCBzb21lIGxvY2tzIG1heSBzdGlsbCByZWx5IG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgc2NoZWR1bGluZyBkb2VzCisjIG5vdCBvY2N1ciB3aGVuIGludGVycnVwdHMgYXJlIGRpc2FibGVkLiBJZiB5b3UgZXhwZXJpZW5jZSBhbnkgbG9ja2luZworIyBwcm9ibGVtcyBpbiBlLmcuIExpbnV4IFVzZXIgTW9kZSwgdHJ5IGVuYWJsaW5nIHRoaXMgb3B0aW9uLgorIyBQbGVhc2Ugbm90ZSB0aGF0IHR1cm5pbmcgb24gdGhpcyBvcHRpb24gd2lsbCByZWR1Y2UgcGVyZm9ybWFuY2UgYnkgYW4KKyMgZXN0aW1hdGVkIDUgdG8gMTAgJS4KKyNDRkdGTEFHUyArPSAtRFNBTF9TUExfTk9fUFJFRU1QVAorCisjIGRpc2FibGUgbWFwcGluZyBvZiBoaWdpZyBjb3NxIHdoZW4gbWFwcGluZyBwcmlvcml0eSB0byBjb3NxCisjICh1c2UgaWRlbnRpdHkgbWFwcGluZyBpbnN0ZWFkIDogbWFwIHByaW8wLT5jb3MwLCBwcmlvMS0+Y29zMSwgLi4uICwgcHJpbzctPmNvczcpCisjQ0ZHRkxBR1MgKz0gLURCQ01fQ09TUV9ISUdJR19NQVBfRElTQUJMRQorCisjIEVuYWJsZSB1a2VybmVsIGRlYnVnZ2luZyBtb2R1bGUKKyNDRkdGTEFHUyArPSAtRFNPQ19VS0VSTkVMX0RFQlVHCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTeXN0ZW0gTWFuYWdlbWVudCBhbmQgTXVsdGlwbGUgQ1BVIE9wdGlvbnMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUdXJuIG9uIEJDTVggaW5jbHVzaW9uCisjICAgICBJTkNMVURFX0JDTVggZm9yIGFueSBzdXBwb3J0CitJTkNMVURFX0JDTVg9MQorCisjIFRlbGVraW5lc2lzIHN1aXRlIGFwcGxpY2F0aW9ucyBmb3IgQ1BVIHRvIENQVSBjb21tdW5pY2F0aW9uIGFuZCBkaXNjb3ZlcnkKKyMgICAgIENQVURCOiAgICAgICAgIFNpbXBsZSBDUFUgZGF0YSBiYXNlIG1hbmFnZXIKKyMgICAgIENQVVRSQU5TOiAgICAgIENQVSB0byBDUFUgY29tbXVuaWNhdGlvbiBtZWNoYW5pc21zCisjICAgICBESVNDT1ZFUjogICAgICBTaW1wbGUgZGlzY292ZXJ5OyB3aWxsIGFsc28gaW5jbHVkZSBDUFVUUkFOUworIyAgICAgU1RLVEFTSzogICAgICAgU3RhY2sgbWFuYWdlciBhcHBsaWNhdGlvbgorIworI0NGR0ZMQUdTICs9IC1ESU5DTFVERV9MSUJfQ1BVREIKKyNDRkdGTEFHUyArPSAtRElOQ0xVREVfTElCX0NQVVRSQU5TCisjQ0ZHRkxBR1MgKz0gLURJTkNMVURFX0xJQl9ESVNDT1ZFUgorI0NGR0ZMQUdTICs9IC1ESU5DTFVERV9MSUJfU1RLVEFTSworCisjIE9wdGlvbiBmb3IgZGlzY292ZXJ5IHRvIHVzZSB0aGUgYXBwbGljYXRpb24tZGF0YSBmaWVsZCBpbiByb3V0aW5nCisjIHBhY2tldHMgZm9yIEJvYXJkLUlEIGFuZCBDUFUgYmFzZSBmbGFnIGluZm9ybWF0aW9uLgorI0NGR0ZMQUdTICs9IC1ERElTQ09WRVJfQVBQX0RBVEFfQk9BUkRJRAorCisjIE9wdGlvbmFsbHkgb3ZlcnJpZGUgbGlzdCBvZiBpbmNsdWRlZCBkaXNwYXRjaCBtb2R1bGVzCisjIE5vdGU6IGluY2x1ZGluZyBSUEMgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgVGVsZWtpbmVzaXMgc3VpdGUgbGlicworIyBFU1cgaXMgdGhlIGVudGVycHJpc2UgcGxhdGZvcm1zLgorIyBST0JPIGluY2x1ZGVzIHRoZSBtYW5hZ2VkIGRldmljZXMuCisjIFNCWCBpbmNsdWRlcyBBUEkgc3VwcG9ydCBmb3IgYmNtOTg4MDIwUVNLMjRYMgorI0RJU1BBVENIX0xJU1QgPSBSUEMgRVNXIEFTWU5DIFNCWAorCisjIERlZmluZSB0byBoYXZlIGVuZC10by1lbmQgZmxvdyBjb250cm9sIGVuYWJsZWQgb24gYm9hcmRzIHRoYXQKKyMgc3VwcG9ydCBpdAorI0NGR0ZMQUdTICs9IC1EQkNNX0JPQVJEX0FVVE9fRTJFCisKKyMgRGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gc3VwcG9ydCBwZXItQ1BVIHRyYW5zbWl0IHBvaW50ZXJzLgorIyBUaGlzIGFsbG93cyB0aGUgVFggc2V0dXAgYW5kIHNlbmQgZnVuY3Rpb25zIHRvIGJlIGRlZmluZWQgb24gYQorIyBwZXItQ1BVIGJhc2lzLCBhbGxvd2luZyBtaXhlZCBpbi1iYW5kIGFuZCBvdXQtb2YtYmFuZCBjb21tdW5pY2F0aW9uLgorI0NGR0ZMQUdTICs9IC1EQkNNX0MyQ19UUkFOU1BPUlRfU1dJVENISU5HCisKKyMgT3B0aW9ucyBmb3IgZmVhdHVyZSBsaXN0IChJTkNMVURFX1hYWCkKKyMgSWYgRkVBVFVSRV9MSVNUIGlzIGRlZmluZWQsIGl0IGlzIGEgbGlzdCBvZiBmZWF0dXJlcyB0byBpbmNsdWRlLgorIyBTZWUgTWFrZS5jb25maWcgZm9yIHRoZSBkZWZhdWx0IGZlYXR1cmUgbGlzdC4KKyMKKyMgQXZhbGlhYmxlIGZlYXR1cmVzOgorIworIyAgICAgQkNNWAorIyAgICAgQkNNWF9ESUFHCisjICAgICBDSEFTU0lTCisjICAgICBDVVNUT01FUgorIyAgICAgRFJJVkVSUworIyAgICAgRURJVExJTkUKKyMgICAgIEkyQworIyAgICAgTDMKKyMgICAgIE1FTV9TQ0FOCisjICAgICBBVFBUUkFOU19TT0NLRVQKKyMgICAgIFRFTE5FVAorIyAgICAgVEVTVAorIyAgICAgQUNMCisjICAgICBSQ1BVCisjICAgICBLTkVUIC0gTGludXggdXNlciBtb2RlIGtlcm5lbCBuZXR3b3JrIHN1cHBvcnQKKyMgICAgIEJDTV9TQUxfUFJPRklMRSAtIG1ha2UgYXZhaWxhYmxlIGFuIEFQSSB0byB0cmFjayBTQUwgdXNhZ2UuCisjICAgICBDSU5UIC0gSW5jbHVkZSB0aGUgQyBJbnRlcnByZXRlciBpbiB0aGUgZGlhZ25vc3RpYyBzaGVsbC4gCisjICAgICAgICAgICAgUGxlYXNlIG5vdGUgdGhpcyBjYW5ub3QgYmUgdXNlZCBpbiBMaW51eCBrZXJuZWwgbW9kZS4gCisjICAgICBDX1VOSVQgLSBJbmNsdWRlIHRoZSBDIHVuaXQgdGVzdGluZyBmcmFtZXdvcmsuICBJZiBDSU5UIGlzIGFsc28gaW5jbHVkZWQKKyMgICAgICAgICAgICAgIHRoZW4gaG9va3Mgd2lsbCBiZSBwcm92aWRlZCBmb3IgdXNlIGZyb20gaXQuCisjICAgICBQSFlfU1lNX0RCRyAtIFBIWSBHVUkgTURJTyByZWFkL3dyaXRlIHN1cHBvcnQuIFNvY2tldCBpbnRlcmZhY2UKKyMgICAgICAgICAgICAgICAgICAgdG8gUEhZIEdVSSBmb3IgU3ltYm9saWMgZGVidWdnaW5nLgorIyAgICAgQVBJTU9ERSAtIGNhbGwgU0RLIEFQSSBmdW5jdGlvbnMgZnJvbSBzaGVsbCwgcmVxdWlyZXMgQ0lOVAorIyAgICAgRFVORV9VSSAtIGR1bmUgbGVnYWN5IHVzZXIgaW50ZXJmYWNlLiBGb3IgZGVidWcgb25seS4gVGVzdGVkCisjICAgICAgICAgICAgICAgb24gbGludXgtdXNlci1ndG8tMi42IG9ubHkuCisjICAgICBLQlAgICAtICAgaW5jbHVkZSBubG0yKDExSykvbmxtMygxMkspIEtCUCBzdXBwb3J0CisjICAgICBCSEggICAtICAgSW5jbHVkZSBTdXBwb3J0IGZvciBCSEggQXBwbGljYXRpb24gKE1QTFMtVFAgT0FNIGJhc2VkIG9uIFkuMTczMSkgCisjICAgICAgICAgICAgICAgdXNpbmcgQlRFIG9uIHNlbGVjdCBkZXZpY2VzLgorIyAgICAgQVZTICAgLSBJbmNsdWRlIEFWUyBzdXBwb3J0CisjRkVBVFVSRV9MSVNUPUFUUFRSQU5TX1NPQ0tFVCBCQ01YX0RJQUcgTDMgSTJDIEJDTVggTUVNX1NDQU4gRURJVExJTkUgXAorIyAgICBDVVNUT01FUiBURUxORVQgRFJJVkVSUyBDSEFTU0lTIFRFU1QgQUNMIFJDUFUgQkNNX1NBTF9QUk9GSUxFIENJTlQgXAorIyAgICBQVFAgQ0VTIEZDTUFQIEJPQVJEIEtORVQgUkVHRVggTUFDU0VDIEFQSU1PREUgQkZEIEtCUCBBVlMKKworRkVBVFVSRV9MSVNUPSBBVFBUUkFOU19TT0NLRVQgUFRQIENJTlQgTDMgSTJDIEJDTVggQkNNWF9ESUFHIE1FTV9TQ0FOIEVESVRMSU5FIEJDTV9TQUxfUFJPRklMRSBDVVNUT01FUiBURVNUIENIQVNTSVMgTVNUUCBSQ1BVCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgICAgICAgICAgS0JQIHN1cHBvcnRlZCBkZXZpY2VzCisjCisjRW5hYmxlIHRoaXMgZm9yIDExSyBkZXZpY2Ugc3VwcG9ydAorI0tCUF9ERVZJQ0UgPSBLQlBfMTFLCisjCisjRW5hYmxlIHRoaXMgZm9yIDEySyBkZXZpY2Ugc3VwcG9ydAorI0tCUF9ERVZJQ0UgPSBLQlBfQUxHCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTZWxlY3RpdmUgRGV2aWNlIFN1cHBvcnQgKFN3aXRjaGVzIGFuZCBQSFlzKQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE11bHRpcGxlIENoaXAgU3VwcG9ydAorIworIyBCeSBkZWZhdWx0LCB0aGUgZHJpdmVyIHN1cHBvcnRzIGFsbCBTdHJhdGEgc3dpdGNoIGFuZCBmYWJyaWMgY2hpcHMKKyMgaW5jbHVkZWQgaW4gdGhpcyBzb2Z0d2FyZSByZWxlYXNlLiAgSXQgY2hlY2tzIGRldmljZSBJRHMgYXQgcnVudGltZQorIyB0byBydW4gdGhlIGNvcnJlY3QgZHJpdmVyIG1vZHVsZXMuCisjCisjIFRvIHNhdmUgc3BhY2UsIHRoZSBkcml2ZXIgY2FuIGJlIGNvbXBpbGVkIHRvIHN1cHBvcnQganVzdCBhIHN1YnNldCBvZgorIyB0aGUgY2hpcHMuICBUbyBkbyB0aGlzLCB1bmNvbW1lbnQgdGhlIGxpbmUgZm9yIEJDTV9QVExfU1BUIChwYXJ0aWFsCisjIHN1cHBvcnQpIGFuZCB1bmNvbW1lbnQgb25lIGxpbmUgZm9yIGVhY2ggY2hpcCB0byBzdXBwb3J0LgorIworIyBOb3RlIHRoYXQgdGhlcmUgYXJlIGEgbG90IG1vcmUgY2hpcHMgdGhhbiBkcml2ZXJzLgorIyBGb3IgZXhhbXBsZSwgdGhlIEJDTTU2MTUgZHJpdmVyIGlzIGFsc28gdXNlZCBmb3IgQkNNNTYyNSBhbmQgQkNNNTY0NS4KKyMKKworQkNNX1BUTF9TUFQgPSAxCisKKyNCQ01fNTY3NV9BMCA9IDEKKyNCQ01fNTYxMDJfQTAgPSAxCisjQkNNXzU2MTEyX0EwID0gMQorI0JDTV81NjMwNF9CMCA9IDEKKyNCQ01fNTYzMTRfQTAgPSAxCisjQkNNXzU2NTA0X0EwID0gMQorI0JDTV81NjUwNF9CMCA9IDEKKyNCQ01fNTY1MTRfQTAgPSAxCisjQkNNXzU2NjI0X0EwID0gMQorI0JDTV81NjYyNF9CMCA9IDEKKyNCQ01fNTY2ODBfQTAgPSAxCisjQkNNXzU2NjgwX0IwID0gMQorI0JDTV81NjU4MF9BMCA9IDEKKyNCQ01fNTY3MDBfQTAgPSAxCisjQkNNXzU2ODAwX0EwID0gMQorI0JDTV81NjIxOF9BMCA9IDEKKyNCQ01fNTYyMjRfQTAgPSAxCisjQkNNXzU2MjI0X0IwID0gMQorI0JDTV81NjcyNV9BMCA9IDEKKyNCQ01fNTY4MjBfQTAgPSAxCisjQkNNXzUzMzE0X0EwID0gMQorI0JDTV81MzMyNF9BMCA9IDEKKyNCQ01fNTY2MzRfQTAgPSAxCisjQkNNXzU2NjM0X0IwID0gMQorI0JDTV81NjUyNF9BMCA9IDEKKyNCQ01fNTY1MjRfQjAgPSAxCisjQkNNXzU2Njg1X0EwID0gMQorI0JDTV81NjY4NV9CMCA9IDEKKyNCQ01fNTYzMzRfQTAgPSAxCisjQkNNXzU2MzM0X0IwID0gMQorI0JDTV81Njg0MF9BMCA9IDEKKyNCQ01fNTY4NDBfQjAgPSAxCisjQkNNXzU2ODUwX0EwID0gMQorI0JDTV81NjE0Ml9BMCA9IDEKKyNCQ01fNTYxNTBfQTAgPSAxCisjQkNNXzU2ODM2X0EwID0gMQorI0JDTV81NjY0MF9BMCA9IDEKK0JDTV81NjQ0MF9BMCA9IDEKK0JDTV81NjQ0MF9CMCA9IDEKK0JDTV81NjQ1MF9BMCA9IDEKK0JDTV81NjQ1MF9CMCA9IDEKK0JDTV81NjQ1MF9CMSA9IDEKKyNCQ01fNTY5NjBfQTAgPSAxCisjQkNNXzU2ODYwX0EwID0gMQorCisjQkNNXzUzMzhfQTAgPSAxCisjQkNNXzUzODBfQTAgPSAxCisjQkNNXzUzMzhfQjAgPSAxCisjQkNNXzUzMjVfQTEgPSAxCisKKyNCQ01fNTMyNF9BMCA9IDEKKyNCQ01fNTM5Nl9BMCA9IDEKKyNCQ01fNTM4OV9BMCA9IDEKKyNCQ01fNTM5OF9BMCA9IDEKKyNCQ01fNTMyNF9BMSA9IDEKKyNCQ01fNTMxMTVfQTAgPSAxCisjQkNNXzUzMTE4X0EwID0gMQorI0JDTV81MzI4MF9BMCA9IDEKKyNCQ01fNTMyODBfQjAgPSAxCisjQkNNXzUzMTAxX0EwID0gMQorI0JDTV81MzEyNV9BMCA9IDEKKyNCQ01fNTMxMjhfQTAgPSAxCisjQkNNXzUzNjAwX0EwID0gMQorI0JDTV84OTUwMF9BMCA9IDEKKworI0JDTV84ODAzMF9BMCA9IDEKKyNCQ01fUUUyMDAwX0EwID0gMQorI0JDTV9CTUUzMjAwX0IwID0gMQorI0JDTV9CTTk2MDBfQTAgPSAxCisjQkNNXzg4MjMwX0EwID0gMQorI0JDTV84ODIzMF9CMCA9IDEKKyNCQ01fODgyMzBfQzAgPSAxCisKKyNCQ01fVEszNzFYX0EwID0gMQorCisjIE9wdGlvbnMgZm9yIG11bHRpcGxlIFBIWSBzdXBwb3J0CisjIElmIEJDTV9QSFlfTElTVCBpcyBkZWZpbmVkLCBpdCBpcyBhIGxpc3Qgb2YgUEhZcyB0byBpbmNsdWRlLgorIyBUaGUgZGVmYXVsdCBpcyB0byBpbmNsdWRlIGFsbCBvZiB0aGVtLgorIyBJZiBub25lIG9mIHRoZW0gc2hvdWxkIGJlIGluY2x1ZGVkIHNwZWNpZnkgQkNNX1BIWV9MSVNUPUVNUFRZCisjQkNNX1BIWV9MSVNUPTUyMlggNTRYWCA1NDY0IDU0MjFTIDU0ODIgNTQ2MTYgNTQ2ODAgNTQ2ODBFIDUyNjgxRSA1NDg4MEUgNTQ2ODIgNTQ2ODQgNTQ2NDAgNTQ2NDBFIDU0ODgwIFNFUkRFUyBTSU1VTCA4NzAzIDg3MDUgODcwNiA4MDcyIDgwNDAgODQ4MSA4NzUwIDg3MjkgODQ3NDAgODQ3NTYgODQzMjggRU1QVFkKKworIyBPcHRpb25zIGZvciBCQ001MzM4IDUzODAKKyNDRkdGTEFHUyArPSAtRFJPQk9fT0xECisjUk9CT19PTEQgPSAxCisKKyMgU3VwcG9ydCBmb3IgcGh5IHNpbXVsYXRpb24KKyNDRkdGTEFHUyArPSAtRElOQ0xVREVfUEhZX1NJTVVMCisjQ0ZHRkxBR1MgKz0gLURTSU1fQUxMX1BIWVMgICAgICAgICMgQWxsIHBoeXMgdXNlIHNpbXVsYXRpb24gZHJpdmVyCisjQ0ZHRkxBR1MgKz0gLURTSU1fQ01JQ19MSU5LX1NUQVQgICMgR2V0IGxpbmsgc3RhdHVzIGZyb20gQ01JQyByZWdpc3RlcgorCisjIFN1cHBvcnQgZm9yIEJPQVJEIGxpYnJhcnkKKyMgaWYgQk9BUkRfTElTVCBpcyBkZWZpbmVkLCBpdCBpcyBhIGxpc3Qgb2YgQm9hcmQgZHJpdmVycyB0byBpbmNsdWRlLgorIyBUaGUgZGVmYXVsdCBpcyB0byBpbmNsdWRlIGFsbCBib2FyZCBkcml2ZXJzIGFwcHJvcHJpYXRlIGZvciB0aGUgZGV2aWNlcworIyBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuIElmIG5vbmUgb2YgdGhlbSBzaG91bGQgYmUgaW5jbHVkZWQgc3BlY2lmeQorIyBCT0FSRF9MSVNUPUVNUFRZLgorI0JPQVJEX0xJU1Q9R0VORVJJQworCisjIFN1cHBvcnQgZm9yIGV2ZW50IGxvZ2dpbmcKKyNDRkdGTEFHUyArPSAtRElOQ0xVREVfU0hBUkVEX0VWTE9HCisKKyMgU3VwcG9ydCBmb3IgQkNNIEFQSSBwb3J0IHRyYW5zbGF0aW9uCisjQ0ZHRkxBR1MgKz0gLURJTkNMVURFX0JDTV9BUElfWExBVEVfUE9SVAorCisjIFN1cHBvcnQgZm9yIGNhbGxiYWNrIGVycm9yIGNoZWNrcyBhbmQgYWJvcnQgaW4gdHJhdmVyc2UgYXBpJ3MKKyNDRkdGTEFHUyArPSAtREJDTV9DQl9BQk9SVF9PTl9FUlIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgTWlzYyBPcHRpb25zCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURTT0NfTUVNX0wzX0RFRklQX1dBUgorCisjIENvbXBpbGUgb3V0IFJlZ2lzdGVyL1RhYmxlIGRlc2NyaXB0aXZlIHN0cmluZ3MgdG8gZ2VuZXJhdGUgYQorIyBjb21wYWN0IGltYWdlCisjQ0ZHRkxBR1MgKz0tRFNPQ19OT19OQU1FUworI0NGR0ZMQUdTICs9LURTT0NfTk9fQUxJQVMKKyNDRkdGTEFHUyArPS1EU09DX05PX0RFU0MKKworIyBSZWxvYWQvV2FybUJvb3QgU3VwcG9ydAorIworQ0ZHRkxBR1MgKz0gLURCQ01fV0FSTV9CT09UX1NVUFBPUlQKKyMKKyMgTmVlZCB0aGlzIGZvciB2YWxpZGF0aW9uIHVzaW5nIFNPQyBzY3JpcHRzOyBXaWxsIG1vdmUgdG8gdGNsIAorIyBzb21lZGF5CitDRkdGTEFHUyArPSAtREJDTV9XQVJNX0JPT1RfU1VQUE9SVF9TV19EVU1QCisjCisjIEFkZHMgYSBDUkMgY2hlY2sgb24gc2NhY2hlIGJ1ZmZlcjogQ2FsY3VsYXRlIHdoZW4gc2F2aW5nLAorIyBhbmQgdmVyaWZ5IHdoZW4gbG9hZGluZy4KKyMgV2hlbiBkb2luZyBJU1NVLCBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdmVyc2lvbnMgc2hvdWxkIGVpdGhlciBoYXZlCisjIHRoaXMgZmxhZyBlbmFibGVkIG9yIGRpc2FibGVkLgorI0NGR0ZMQUdTICs9IC1EU0NBQ0hFX0NSQ19DSEVDSworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEVuYWJsZSBFYXN5IFJlbG9hZCBTdXBwb3J0CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURCQ01fRUFTWV9SRUxPQURfU1VQUE9SVAorIyBGb3IgdmFsaWRhdGlvbiBwdXJwb3NlcworI0NGR0ZMQUdTICs9IC1EQkNNX0VBU1lfUkVMT0FEX1NVUFBPUlRfU1dfRFVNUAorCisjIFNvZnR3YXJlIFRydW5rIGZhaWxvdmVyIFN1cHBvcnQKKyMKKyNDRkdGTEFHUyArPSAtREJDTV9UUlVOS19GQUlMT1ZFUl9TVVBQT1JUCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgT3ZlcnJpZGUgZGVmYXVsdCBWWFdPUktTIHRocmVhZCBvcHRpb25zIHRvIG1ha2Ugc2V0IAorIyBWWF9VTkJSRUFLQUJMRSBmbGFnIGluIHRhc2sgY3JlYXRpb24uCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURWWF9USFJFQURfT1BUX1VOQlJFQUtBQkxFCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBVc2UgZGVmYXVsdCBwcmlvcml0eSBmb3IgQkRFIGludGVycnVwdCB0aHJlYWQuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURTQUxfQkRFX1RIUkVBRF9QUklPX0RFRkFVTFQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBVc2UgY2FjaGVkIERNQSBtZW1vcnkgd2hlbiBtYXBwaW5nIGtlcm5lbCBETUEgbWVtb3J5IHRvIHVzZXIKKyMgbW9kZS4gU2hvdWxkIG9ubHkgYmUgZW5hYmxlZCBvbiBjYWNoZS1jb2hlcmVudCBwbGF0Zm9ybXMuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURTQUxfQkRFX0NBQ0hFX0RNQV9NRU0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUYWtlIHRoZSBzcGwgbG9jayB1cG9uIGVudGVyaW5nIGFuIElTUgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EU0FMX1NQTF9MT0NLX09OX0lSUQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNpbGVudGx5IGlnbm9yZSBOVUxMIHBvaW50ZXIgZnJlZSBpbiBzYWxfZnJlZSBBUEkKKyMgRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gYXNzZXJ0IGlmIGEgTlVMTCBwb2ludGVyIGlzIHBhc3NlZCB0byBzYWxfZnJlZQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EU0FMX0ZSRUVfTlVMTF9JR05PUkUKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBFbmFibGUgU0JYIE1QTFMgVFAgc3VwcG9ydAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EQkNNX1NCWF9NUExTVFBfU1VQUE9SVAorI0NGR0ZMQUdTICs9IC1EQkNNX1NCWF9DMV9NUExTVFBfU1VQUE9SVAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJlc3RyaWN0IFNCWCBDMiBGdGUgcmFuZ2UgdG8gQzIncyByYW5nZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EQkNNX1NCWF9DMV9DMl9JTlRFUk9QCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGUgUENJIHByb2JlIGZ1bmN0aW9uIHNraXBzIGRldmljZSAxMgorIyBieSBkZWZhdWx0IHRvIHByZXZlbnQgYSBzeXN0ZW0gaGFuZyBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4KKyMgU2V0IHRoaXMgdmFsdWUgdG8gemVybyB0byBwcm9iZSBhbGwgUENJIGRldmljZXMuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURPVkVSUklERV9QQ0lfU0tJUF9ERVZfTUFTSz0wCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT3ZlcnJpZGUgbWF4IGRldmljZXMgc3VwcG9ydGVkIGJ5IFBMSSBCREUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNDRkdGTEFHUyArPSAtRFBMSV9NQVhfREVWSUNFUworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRyYWNrIEJDTSBBUEkgY2FsbHMgdG8gYXZvaWQgZGVpbml0aWFsaXphdGlvbiB3aGlsZSBjYWxscyBhY3RpdmUKKyMgVGhpcyB3aWxsIGluY3VyIGEgc21hbGwgdGltZSBwZW5hbHR5IGZvciBlYWNoIEJDTSBBUEkgY2FsbAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0NGR0ZMQUdTICs9IC1EQkNNX0NPTlRST0xfQVBJX1RSQUNLSU5HCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT3ZlcnJpZGUgZGVmYXVsdCByZXRyeSB0aW1lIGZvciBkZXRhY2ggdG8gd2FpdCBmb3IgZXhlY3V0aW5nCisjIEFQSXMgdG8gY29tcGxldGUuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURCQ01fREVUQUNIX1BPTExfSU5URVJWQUxfVVNFQ1NfREVGQVVMVD0xMDAwMDAKKyNDRkdGTEFHUyArPSAtREJDTV9ERVRBQ0hfTlVNX1JFVFJJRVNfREVGQVVMVD0zMDAwCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRGlzYWJsZSB0aGUgUlggbW9kdWxlIGluaXRpYWxpemF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURCQ01fUlhfRElTQUJMRQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEVuYWJsZSBUWCBjYWxsYmFjayBpbiBpbnRlcnJ1cHQgdGhyZWFkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjQ0ZHRkxBR1MgKz0gLURUWF9DQl9JTlRSCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvbWFrZS9NYWtlLmxvY2FsLnFheCBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvbWFrZS9NYWtlLmxvY2FsLnFheApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTQ3ZTFiCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9tYWtlL01ha2UubG9jYWwucWF4CkBAIC0wLDAgKzEsMjggQEAKK0ZFQVRVUkVfTElTVCA6PSBDSU5UIEwzIEkyQyBNRU1fU0NBTiBFRElUTElORSBURVNUIEJDTV9TQUxfUFJPRklMRSBDSEFTU0lTIFJDUFUgQVRQVFJBTlNfU09DS0VUIERVTkVfVUkgSU5UUiBBUElNT0RFIFBUUCAKKworREVCVUdfQ0ZMQUdTPS1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50CisKK0JDTV9QVExfU1BUPTEKKworQUxMX0RQUF9DSElQUyA9IDEKK0FMTF9ERkVfQ0hJUFMgPSAxCisKKyMgSW5jbHVkZXMgWE1MIGxpYnJhcnkgYW5kIGVuYWJsZXMgdXNlIG9mICJkaWFnIHBwIGR1bXAiIHV0aWxpdHkgZm9yIFBQIGltcG9ydC9leHBvcnQgZmFjaWxpdGllcyAKK0RBVEFJT19TVVBQT1JUID0gMQorS0VSTl9WRVI9My43LjEwCisKK0NGR0ZMQUdTICs9IC1EU1RBVElDPXN0YXRpYworQ0ZHRkxBR1MgKz0gLURCQ01fV0FSTV9CT09UX1NVUFBPUlQKK0NGR0ZMQUdTICs9IC1EQkNNX1dBUk1fQk9PVF9TVVBQT1JUX1NXX0RVTVAKK0NGR0ZMQUdTICs9IC1EQkNNX0VBU1lfUkVMT0FEX1dCX0NPTVBBVF9TVVBQT1JUCitDRkdGTEFHUyArPSAtREJDTV9DT05UUk9MX0FQSV9UUkFDS0lORworQ0ZHRkxBR1MgKz0gLURfX0RVTkVfTElOVVhfQkNNX0NQVV9QQ0lFX18KK0NGR0ZMQUdTICs9IC1EUEhZU19BRERSU19BUkVfNjRCSVRTIC1EU0FMX0JERV8zMkJJVF9VU0VSXzY0QklUX0tFUk5FTAorQ0ZHRkxBR1MgKz0gLURfU0lNUExFX01FTU9SWV9BTExPQ0FUSU9OXz0wIC1EVVNFX0xJTlVYX0JERV9NTUFQPTEKK0NGR0ZMQUdTICs9IC1EU0NBQ0hFX0NSQ19DSEVDSworCitDRkdGTEFHUyArPSAtREJST0FEQ09NX1NWSworCisKK1ZFTkRPUl9MSVNUPUNVU1RPTUVSNzggQlJPQURDT00gRE5YCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvbWFrZS9NYWtlLmxvY2FsLnFheF9zaW0gYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL21ha2UvTWFrZS5sb2NhbC5xYXhfc2ltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMmM0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL21ha2UvTWFrZS5sb2NhbC5xYXhfc2ltCkBAIC0wLDAgKzEsMzMgQEAKKyNGRUFUVVJFX0xJU1QgOj0gQ0lOVCBMMyBJMkMgQkNNWCBCQ01YX0RJQUcgTUVNX1NDQU4gRURJVExJTkUgVEVTVCBCQ01fU0FMX1BST0ZJTEUgQ1VTVE9NRVIgQ0hBU1NJUyBNU1RQIFJDUFUgQVRQVFJBTlNfU09DS0VUIERVTkVfVUkgSU5UUiBBUElNT0RFIFBUUCBLQlAKKworRkVBVFVSRV9MSVNUIDo9IENJTlQgTDMgSTJDIE1FTV9TQ0FOIEVESVRMSU5FIFRFU1QgQkNNX1NBTF9QUk9GSUxFIENVU1RPTUVSIENIQVNTSVMgUkNQVSBBVFBUUkFOU19TT0NLRVQgRFVORV9VSSBJTlRSIEFQSU1PREUgUFRQIAorCitERUJVR19DRkxBR1M9LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgCisKK0JDTV9QVExfU1BUPTEKKworQUxMX0RQUF9DSElQUyA9IDEKK0FMTF9ERkVfQ0hJUFMgPSAxCisKKyMgSW5jbHVkZXMgWE1MIGxpYnJhcnkgYW5kIGVuYWJsZXMgdXNlIG9mICJkaWFnIHBwIGR1bXAiIHV0aWxpdHkgZm9yIFBQIGltcG9ydC9leHBvcnQgZmFjaWxpdGllcyAKK0RBVEFJT19TVVBQT1JUID0gMQorS0VSTl9WRVI9My43LjEwCisKK0NGR0ZMQUdTICs9IC1EU1RBVElDPXN0YXRpYworQ0ZHRkxBR1MgKz0gLURCQ01fV0FSTV9CT09UX1NVUFBPUlQKK0NGR0ZMQUdTICs9IC1EQkNNX1dBUk1fQk9PVF9TVVBQT1JUX1NXX0RVTVAKK0NGR0ZMQUdTICs9IC1EQkNNX0VBU1lfUkVMT0FEX1dCX0NPTVBBVF9TVVBQT1JUCitDRkdGTEFHUyArPSAtREJDTV9DT05UUk9MX0FQSV9UUkFDS0lORworQ0ZHRkxBR1MgKz0gLURfX0RVTkVfTElOVVhfQkNNX0NQVV9QQ0lFX18KK0NGR0ZMQUdTICs9IC1EUEhZU19BRERSU19BUkVfNjRCSVRTIC1EU0FMX0JERV8zMkJJVF9VU0VSXzY0QklUX0tFUk5FTAorQ0ZHRkxBR1MgKz0gLURfU0lNUExFX01FTU9SWV9BTExPQ0FUSU9OXz0wIC1EVVNFX0xJTlVYX0JERV9NTUFQPTEKK0NGR0ZMQUdTICs9IC1EU0NBQ0hFX0NSQ19DSEVDSworCitDRkdGTEFHUyArPSAtREJST0FEQ09NX1NWSworCitDRkdGTEFHUyArPSAtV25vLWZvcm1hdC1zZWN1cml0eSAtV25vLXVudXNlZC1idXQtc2V0LXZhcmlhYmxlCisKKyNLQlBfREVWSUNFIDo9IEtCUF9BTEcKKworVkVORE9SX0xJU1Q9Q1VTVE9NRVI3OCBCUk9BRENPTSBETlgKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9tYWtlX2luZ19kaXIuc2ggYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL21ha2VfaW5nX2Rpci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZjE1YjgyCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9tYWtlX2luZ19kaXIuc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisjIHRoaXMgc2hlbGwgc2NyaXB0IGJ1aWxkIHRoZSBJTkcgU0RLIHdpdGggQkFMIHN3aXRjaCBhcHAgYXMgYSB0aHJlYWQKKyMgRXZlbnR1YWxseSB0aGlzIHNjcmlwdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgbWFrZSBmaWxlCisjc2V0IC14CitlY2hvICJQcmVwYXJpbmcgSU5HIFNESyAke0lOR19TREt9IHNvdXJjZSB0cmVlIGluICR7SU5HX1NES19ESVJ9IgorCisjIG1ha2luZyBidWlsZCBkaXJlY3RvcnkKK3JtIC1mciAke0lOR19TREtfRElSfQorbWtkaXIgLXAgJHtJTkdfU0RLX0RJUn0KK2NkICR7SU5HX1NES19ESVJ9Ly4uCisKKyN1bnRhciB0aGUgc2RrIHRneiBmaWxlCitlY2hvICJVbnRhcmluZyAke0lOR19TREt9LnRhci5neiIKK3RhciB6eGYgJHtJTkdfU0RLX1RPUF9ESVJ9LyR7SU5HX1NES30udGFyLmd6CisKKyNwYXRjaCBzZGsgd2l0aCBiYWwgbW9kaWZpY2F0aW9ucyAtIERPIE5PVCBjaGFuZ2UgdGhlIHBhdGNoIG9yZGVyCitlY2hvICJQYXRjaGluZyBTREsgJHtJTkdfU0RLfS50YXIuZ3ogd2l0aCBwYXRjaCBmaWxlICR7SU5HX1NES19QQVRDSH0iCitwYXRjaCAtcDAgPCAke0lOR19TREtfVE9QX0RJUn0vJHtJTkdfU0RLX1BBVENIfQorCisjbGluayBzd2l0Y2ggYXBwIC5oIGFuZCAuYyBmaWxlcworZWNobyAiTGluayBTd2l0Y2ggQXBwIFNvdXJjZSBmaWxlcyIKK2NkICR7SU5HX1NES19ESVJ9Citta2RpciAtcCBtYWtlLworCitpZiBbICIke1NXSVRDSH0iID0gInFheCIgXTsKK3RoZW4KKyAgICBsbiAtcyAke0lOR19TREtfVE9QX0RJUn0vbWFrZS9NYWtlLmxvY2FsLnFheCAgICBtYWtlL01ha2UubG9jYWwKK2Vsc2UKKyAgICBlY2hvICIgU1dJVENIID0gJHtTV0lUQ0h9IGlzIG5vdCBzcGVjaWZpZWQgb3Igc3VwcG9ydGVkIgorICAgIGV4aXQKK2ZpCisKK2VjaG8gIkRvbmUiCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2FyYWQvYXJhZC5zb2MgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2FyYWQvYXJhZC5zb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNThmZjAyOQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvYXJhZC9hcmFkLnNvYwpAQCAtMCwwICsxLDE1NiBAQAorIworIyAkSWQ6IGFyYWQuc29jLHYgMS45MCBCcm9hZGNvbSBTREsgJAorIworIyAkQ29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxNiBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyMgVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorIyBhbmQvb3IgaXRzIGxpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkCisjIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLAorIyB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkIGJldHdlZW4geW91IGFuZCBCcm9hZGNvbQorIyAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbiBhbiBBdXRob3JpemVkCisjIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAorIyB0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQKKyMgQnJvYWRjb20gZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZQorIyBhbmQgYWxsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFCisjIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRSBOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRQorIyBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWSBCUk9BRENPTSBBTkQgRElTQ09OVElOVUUKKyMgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuICAKKyMgIAorIyBFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIyAgCisjIDEuICAgICBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorIyBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyMgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwKKyMgYW5kIHRvIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mCisjIEJyb2FkY29tIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKyMgIAorIyAyLiAgICAgVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUworIyBQUk9WSURFRCAiQVMgSVMiIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLAorIyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwKKyMgT1IgT1RIRVJXSVNFLCBXSVRIIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZCisjIERJU0NMQUlNUyBBTlkgQU5EIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwKKyMgTk9OSU5GUklOR0VNRU5ULCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLAorIyBBQ0NVUkFDWSBPUiBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUgorIyBDT1JSRVNQT05ERU5DRSBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORworIyBPVVQgT0YgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyMgCisjIDMuICAgICBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwKKyMgQlJPQURDT00gT1IgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLAorIyBJTkNJREVOVEFMLCBTUEVDSUFMLCBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUgorIyBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWQorIyBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4gSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKKyMgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOyBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GCisjIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFIFNPRlRXQVJFIElUU0VMRiBPUiBVU0QgMS4wMCwKKyMgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORworIyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkgTElNSVRFRCBSRU1FRFkuJAorIworCisjIExvYWQgRFJBTSB0dW5pbmcgcHJvcGVydGllcyBmcm9tIGxvY2FsIEZpbGUuIFJjTG9hZCB3aWxsIG5vdCBmYWlsIGlmIGZpbGUgbm90IGZvdW5kLCBhbmQgd2lsbCBub3Qgc2hvdyBlcnJvcnMgb2YgbWlzc2luZyBmaWxlLgorc2V0IFJDRXJyb3I9b2ZmCitkZWJ1ZyBhcHBsIHNoZWxsIHdhcm4KK3JjbG9hZCAvaG9tZS9uZWdldi9iY204ODY1MF9kcmFtX3R1bmUuc29jCitkZWJ1ZyBhcHBsIHNoZWxsID0KK3NldCBSQ0Vycm9yPW9uCisKK2RlYnVnIGluZm8KK2RlYnVnIGFwcGwgcmNsb2FkIHdhcm4KK2RlYnVnIGFwcGwgc3ltdGFiIHdhcm4KK2RlYnVnIGJjbSByeCx0eCxsaW5rLGF0dGFjaCB3YXJuCitkZWJ1ZyBzb2MgdGVzdHMgd2FybgorZGVidWcgc29jIHJ4LHBoeSxzY2hhbixyZWcsc29jbWVtLGRtYSxtZW0sbWlpbSxtaWksaW50cixjb3VudGVyLGRkciB3YXJuCitkZWJ1ZyBzb2MgY29tbW9uIGVycgorZGVidWcgc3lzIHZlcmluZXQgd2FybgorCityY2xvYWQgYXJhZF9kcmFtLnNvYworCisjIFNldCBtb2RpZDoKKyMgSWYgZGlhZ19jaGFzc2lzIGlzIGVuYWJsZWQgKHR3byBsaW5lIGNhcmRzKSwgYW5kICdzbG90JyBpcyBkZWZpbmVkIChzbG90IGlzIGRlZmluZWQgb25seSB3aGVuCisjIHdvcmtpbmcgd2l0aG91dCBhIG1hbmFnZW1lbnQgY2FyZCkgLSBzZXQgbW9kaWQgdG8gYmUgMCBmb3Igc2xvdCAwLCBhbmQgMiBmb3Igc2xvdCAyCisjIE90aGVyd2lzZSAoc2luZ2xlIGxpbmUgY2FyZCwgb3IgbWFuYWdlbWVudCBjYXJkKSwgc2V0IG1vZGlkIHRvIGJlIDAgZm9yIHVuaXQgMCwgYW5kIDIgZm9yIHVuaXQgMgorIyBJZiBtb2R1bGVfaWQgaXMgc2V0LCB0aGVuIHNldCBtb2RpZCB0byBoYXZlIG1vZHVsZV9pZCB2YWx1ZQoraWYgJD9kaWFnX2NoYXNzaXMgJiYgJD9zbG90ICJcCisgIGxvY2FsIG1vZGlkICRzbG90IiBcCitlbHNlICJcCisgIGxvY2FsIG1vZGlkICR1bml0IgorZXhwciAkbW9kaWQ9PTE7IGlmICQ/ICJsb2NhbCBtb2RpZCAyIgorCitpZiAkP21vZHVsZV9pZCAiIFwKKyAgbG9jYWwgbW9kaWQgJG1vZHVsZV9pZCIKKworZWNobyAiJHVuaXQ6IG1vZGlkPSRtb2RpZCIKKworIyBTZXQgYmFzZV9tb2RpZDoKKyMgSWQgYmFzZV9tb2R1bGVfaWQgaXMgc2V0LCB0aGVuIHNldCBiYXNlX21vZGlkIHRvIGhhdmUgYmFzZV9tb2R1bGVfaWQgdmFsdWUuCisjIE90aGVyd2lzZSwgc2V0IGJhc2VfbW9kaWQgdG8gYmUgMC4KK2lmICQ/YmFzZV9tb2R1bGVfaWQgIiBcCisgIGxvY2FsIGJhc2VfbW9kaWQgJGJhc2VfbW9kdWxlX2lkIiBcCitlbHNlICIgXAorICBsb2NhbCBiYXNlX21vZGlkIDAiCisKK2V4cHIgJGJhc2VfbW9kaWQgPiAwCitpZiAkPyAiIFwKKyAgZWNobyAnJHVuaXQ6IGJhc2VfbW9kaWQ9JGJhc2VfbW9kaWQnIgorCisjIFNldCBub2ZfZGV2aWNlczoKKyMgSWYgZGlhZ19jaGFzc2lzIGlzIGVuYWJsZWQgKG1nbXQgY2FyZCkgLSBzZXQgbm9mX2RldmljZXMgdG8gYmUgMi4KKyMgT3RoZXJ3aXNlLCBzZXQgbm9mX2RldmljZXMgdG8gYmUgMS4KKyMgSWYgbl9kZXZpY2VzIGlzIHNldCwgdGhlbiBzZXQgbm9mX2RldmljZXMgdG8gaGF2ZSBuX2RldmljZXMgdmFsdWUuCitpZiAkP2RpYWdfY2hhc3NpcyAiIFwKKyAgbG9jYWwgbm9mX2RldmljZXMgMiIgXAorZWxzZSAiXAorICBsb2NhbCBub2ZfZGV2aWNlcyAxIgorCitpZiAkP25fZGV2aWNlcyAiIFwKKyAgbG9jYWwgbm9mX2RldmljZXMgJG5fZGV2aWNlcyIKKworZXhwciAkbm9mX2RldmljZXMgPiAxCitpZiAkPyAiIFwKKyAgZWNobyAnJHVuaXQ6IG5vZl9kZXZpY2VzPSRub2ZfZGV2aWNlcyciCisKK2lmICQ/bW5nX2NwdSAiIFwKKyAgZWNobyAnJHVuaXQ6bWFuYWdlbWVudCBjYXJkIC0gcG9sbGluZyBpcyBzZXQgb24nOyBcCisgIGNvbmZpZyBhZGQgcG9sbGVkX2lycV9tb2RlLkJDTTg4NjUwPTE7IFwKKyAgY29uZmlnIGFkZCBzY2hhbl9pbnRyX2VuYWJsZS5CQ004ODY1MD0wOyBcCisgIGNvbmZpZyBhZGQgdGRtYV9pbnRyX2VuYWJsZS5CQ004ODY1MD0wOyBcCisgIGNvbmZpZyBhZGQgdHNsYW1faW50cl9lbmFibGUuQkNNODg2NTA9MDsgXAorICBjb25maWcgYWRkIG1paW1faW50cl9lbmFibGUuQkNNODg2NTA9MDsgXAorICBjb25maWcgYWRkIHBvbGxlZF9pcnFfbW9kZS5CQ004ODc1MD0xOyBcCisgIGNvbmZpZyBhZGQgc2NoYW5faW50cl9lbmFibGUuQkNNODg3NTA9MDsgXAorICBjb25maWcgYWRkIHRkbWFfaW50cl9lbmFibGUuQkNNODg3NTA9MDsgXAorICBjb25maWcgYWRkIHRzbGFtX2ludHJfZW5hYmxlLkJDTTg4NzUwPTA7IFwKKyAgY29uZmlnIGFkZCBtaWltX2ludHJfZW5hYmxlLkJDTTg4NzUwPTA7ICIKKworI2RlZmF1bHQgdmFsdWVzIGluIGEgY2FzZSB3aGljaCB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBub3QgZXhpc3QKK2lmICEkP2RpYWdfY29zcV9kaXNhYmxlICJcCisgIGxvY2FsIGRpYWdfY29zcV9kaXNhYmxlIDAiCitpZiAhJD93YXJtYm9vdCAiXAorICBsb2NhbCB3YXJtYm9vdCAwIgoraWYgISQ/ZGlhZ19kaXNhYmxlICJcCisgIGxvY2FsIGRpYWdfZGlzYWJsZSAwIgoraWYgISQ/ZGlhZ19ub19hcHBsX3N0ayAiXAorICBsb2NhbCBkaWFnX25vX2FwcGxfc3RrIDAiCitpZiAhJD9kaWFnX25vX2l0bWhfcHJvZ19tb2RlICJcCisgIGxvY2FsIGRpYWdfbm9faXRtaF9wcm9nX21vZGUgMCIKK2lmICEkP2wyX21vZGUgIlwKKyAgbG9jYWwgbDJfbW9kZSAwIgorCitJTklUX0ROWCBNb2RJRD0kbW9kaWQgQmFzZU1vZElEPSRiYXNlX21vZGlkIE5vZkRldmljZXM9JG5vZl9kZXZpY2VzIENvc3FEaXNhYmxlPSRkaWFnX2Nvc3FfZGlzYWJsZSBOb0FwcGw9JGRpYWdfZGlzYWJsZSBXYXJtYm9vdD0kd2FybWJvb3QgTm9BcHBsU3RrPSRkaWFnX25vX2FwcGxfc3RrIE5vSXRtaFByb2dNb2RlPSRkaWFnX25vX2l0bWhfcHJvZ19tb2RlIEwyTW9kZT0kbDJfbW9kZQorCisjTEVEIHN1cHBvcnQgc2VjdGlvbiBzdGFydAorbG9jYWwgbGVkY29kZSAnMDIgMEQgNjcgMzEgNjcgMUMgMDIgMEUgNjcgMzEgNjcgMUMgMDIgMEYgNjcgMzFcCisgNjcgMUMgMDIgMTAgNjcgMzEgNjcgMUMgODYgRTAgM0EgMDggNjcgMzcgNzUgM0VcCisgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgM0UgMTYgRTAgQ0EgMDUgNzAgNDIgNzdcCisgM0UgNjcgMzcgNzUgM0UgNzcgNDIgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEVcCisgODcgNTcgMzIgMEYgODcgNTcnICNzZGs4ODY1MC5oZXgKKworIyBEb3dubG9hZCBMRUQgY29kZSBpbnRvIExFRCBwcm9jZXNzb3IgYW5kIGVuYWJsZSAoaWYgYXBwbGljYWJsZSkuCitpZiAkP2ZlYXR1cmVfbGVkX3Byb2MgJiYgJD9sZWRjb2RlICYmICEkP3NpbXVsYXRvciBcCisgICAgImxlZCBwcm9nICRsZWRjb2RlOyBcCisgICAgIGxlZCBhdXRvIG9uOyBsZWQgc3RhcnQiCisKKyMgSWYgbG9hZGluZyBtdWx0aXBsZSByYy5zb2MsIHVwb24gbG9hZGluZyB0aGUgbGFzdCB1bml0LCByZXN0YXJ0CisjIGFsbCBMRUQgcHJvY2Vzc29ycyBzbyBhbnkgY29tbW9uIGJsaW5raW5nIGlzIGluIHN5bmMuCisjIGlmICEiZXhwciAkP2ZlYXR1cmVfbGVkX3Byb2MgJiYgISQ/c2ltdWxhdG9yICYmICR1bml0ID09ICR1bml0cyAtIDEiIFwKKyMgICAgIio6bGVkIHN0b3A7ICo6bGVkIHN0YXJ0IgorI0xFRCBzdXBwb3J0IHNlY3Rpb24gZW5kCisKK2VjaG8gImFyYWQuc29jOiBEb25lLiIKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvYXJhZC9hcmFkX2RyYW0uc29jIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9hcmFkL2FyYWRfZHJhbS5zb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjUwZTE2NQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvYXJhZC9hcmFkX2RyYW0uc29jCkBAIC0wLDAgKzEsMjQyIEBACisjCisjICRJZDogYXJhZF9kcmFtLnNvYyx2IDEuMCBCcm9hZGNvbSBTREsgJAorIworIyAkQ29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxMiBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyMgVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorIyBhbmQvb3IgaXRzIGxpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkCisjIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLAorIyB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkIGJldHdlZW4geW91IGFuZCBCcm9hZGNvbQorIyAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbiBhbiBBdXRob3JpemVkCisjIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAorIyB0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQKKyMgQnJvYWRjb20gZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZQorIyBhbmQgYWxsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFCisjIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRSBOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRQorIyBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWSBCUk9BRENPTSBBTkQgRElTQ09OVElOVUUKKyMgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuICAKKyMgIAorIyBFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIyAgCisjIDEuICAgICBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorIyBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyMgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwKKyMgYW5kIHRvIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mCisjIEJyb2FkY29tIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKyMgIAorIyAyLiAgICAgVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUworIyBQUk9WSURFRCAiQVMgSVMiIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLAorIyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwKKyMgT1IgT1RIRVJXSVNFLCBXSVRIIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZCisjIERJU0NMQUlNUyBBTlkgQU5EIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwKKyMgTk9OSU5GUklOR0VNRU5ULCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLAorIyBBQ0NVUkFDWSBPUiBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUgorIyBDT1JSRVNQT05ERU5DRSBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORworIyBPVVQgT0YgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyMgCisjIDMuICAgICBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwKKyMgQlJPQURDT00gT1IgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLAorIyBJTkNJREVOVEFMLCBTUEVDSUFMLCBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUgorIyBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWQorIyBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4gSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKKyMgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOyBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GCisjIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFIFNPRlRXQVJFIElUU0VMRiBPUiBVU0QgMS4wMCwKKyMgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORworIyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkgTElNSVRFRCBSRU1FRFkuJAorIworCitpZiAkP2RyYW1fdHlwZV9ERFIzX0hZTklYX0g1VFEyRzYzQkZSX1RFQ184MDAgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2ZyZXE9ODAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTE2Mzg0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9qZWRlYz0yMTsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmQ9NzUwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NjA5MDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTMwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTEzMDkwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTEzMDkwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0xNjAwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTMzMDAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9ODsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9NDAwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTE7IFwKKyAgY29uZmlnIGFkZCBkZHIzX21lbV9ncmFkZT0weDExMTExMSIKKyAgICAKK2lmICQ/ZHJhbV90eXBlX0REUjNfSFlOSVhfSDVUUTJHNjNCRlJfVEVDXzkzMyAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fZnJlcT05MzM7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MTYzODQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2plZGVjPTI1OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZD02MDAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ2MDkwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xMzA5MDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTMwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTMwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTE2MDAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzMwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT05OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0zNTAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xMzsgXAorICBjb25maWcgYWRkIGRkcjNfbWVtX2dyYWRlPTB4MTMxMzEzIgorICAgCitpZiAkP2RyYW1fdHlwZV9ERFIzX0hZTklYX0g1VFEyRzYzQkZSX1RFQ18xMDY2ICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9mcmVxPTEwNjY7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MTYzODQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2plZGVjPTI5OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZD02MDAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ2MDkwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xMzA5MDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTMwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTMwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTE2MDAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzMwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT0xMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MzUwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTQ7IFwKKyAgY29uZmlnIGFkZCBkZHIzX21lbV9ncmFkZT0weDE0MTQxNCIKKworaWYgJD9kcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoyNTZNMTZfNEdCSVRfMTA2NiAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fZnJlcT0xMDY2OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTE2Mzg0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9qZWRlYz0yOTsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmQ9NjAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NjEzMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTMwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTEzMDkwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTEzMDkwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0yNjAwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTMzMDAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9MTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTM1MDAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTE0OyBcCisgIGNvbmZpZyBhZGQgZGRyM19tZW1fZ3JhZGU9MHgxNDE0MTQiCisgIAoraWYgJD9kcmFtX3R5cGVfRERSM19NSUNST05fTVQ0Mko2NE0xNkxBXzE1RV82NjcgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2ZyZXE9NjY3OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTgxOTI7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2plZGVjPTIxOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZD03NTAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ5NTAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xMzUwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTM1MDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTM1MDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTExMDAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzYwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT03OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz00NTAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT05OyBcCisgIGNvbmZpZyBhZGQgZGRyM19tZW1fZ3JhZGU9MHgwOTA5MDkiCisKK2lmICQ/ZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMTI4TTE2SEFfMTI1XzgwMCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fZnJlcT04MDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MTYzODQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2plZGVjPTIxOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZD03NTAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ2MDkwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xMzA5MDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTMwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTMwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTE2MDAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzMwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT04OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz00MDAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xMTsgXAorICBjb25maWcgYWRkIGRkcjNfbWVtX2dyYWRlPTB4MTExMTExIgorICAKK2lmICQ/ZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMTI4TTE2SEFfMTI1XzkzMyAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fZnJlcT05MzM7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MTYzODQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2plZGVjPTI1OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZD02MDAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ2MDkwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xMzA5MDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTMwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTMwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTE2MDAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzMwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT05OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0zNTAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xMzsgXAorICBjb25maWcgYWRkIGRkcjNfbWVtX2dyYWRlPTB4MTMxMzEzIgorICAKK2lmICQ/ZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMTI4TTE2SEFfMTI1XzEwNjYgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2ZyZXE9MTA2NjsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz0xNjM4NDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1famVkZWM9Mjk7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkPTYwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDYwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTEzMDkwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xMzA5MDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xMzA5MDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MTYwMDAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zMzAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTEwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0zNTAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xNDsgXAorICBjb25maWcgYWRkIGRkcjNfbWVtX2dyYWRlPTB4MTQxNDE0IgorICAKK2lmICQ/ZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEI0RzE2NDZCXzRHQklUXzEwNjYgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2ZyZXE9MTA2NjsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz0xNjM4NDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1famVkZWM9Mjk7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkPTYwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDYwOTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTEzMDkwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xMzA5MDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xMzA5MDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MjYwMDAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zMzAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTEwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0zNTAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xNDsgXAorICBjb25maWcgYWRkIGRkcjNfbWVtX2dyYWRlPTB4MTQxNDE0IgorICAKK2lmICQ/ZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZHXzgwMCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fZnJlcT04MDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9ODE5MjsgXAorICBjb25maWcgYWRkIGV4dF9yYW1famVkZWM9MjU7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkPTc1MDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDc5MTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTEzOTEwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xMzkxMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xMzkxMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MTEwMDAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zNDAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTg7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTQwMDAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTExOyBcCisgIGNvbmZpZyBhZGQgZGRyM19tZW1fZ3JhZGU9MHgxMTExMTEiCisgIAoraWYgJD9kcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjFHMTY0NkdfOTMzICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9mcmVxPTkzMzsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz04MTkyOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9qZWRlYz0yNTsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmQ9NjAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NzkxMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTM5MTA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTEzOTEwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTEzOTEwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0xMTAwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTM0MDAwOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9OTsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MzUwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTM7IFwKKyAgY29uZmlnIGFkZCBkZHIzX21lbV9ncmFkZT0weDEzMTMxMyIKKyAgCitpZiAkP2RyYW1fdHlwZV9ERFIzX0hZTklYX0g1VFEyRzYzQkZSX1RFQ184MDAgfHwgXAorICAgJD9kcmFtX3R5cGVfRERSM19IWU5JWF9INVRRMkc2M0JGUl9URUNfOTMzIHx8IFwKKyAgICQ/ZHJhbV90eXBlX0REUjNfSFlOSVhfSDVUUTJHNjNCRlJfVEVDXzEwNjYgfHwgXAorICAgJD9kcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoyNTZNMTZfNEdCSVRfMTA2NiB8fCBcCisgICAkP2RyYW1fdHlwZV9ERFIzX01JQ1JPTl9NVDQxSjEyOE0xNkhBXzEyNV84MDAgfHwgXAorICAgJD9kcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoxMjhNMTZIQV8xMjVfOTMzIHx8IFwKKyAgICQ/ZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMTI4TTE2SEFfMTI1XzEwNjYgfHwgXAorICAgJD9kcmFtX3R5cGVfRERSM19NSUNST05fTVQ0Mko2NE0xNkxBXzE1RV82NjcgfHwgXAorICAgJD9kcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjRHMTY0NkJfNEdCSVRfMTA2NiB8fCBcCisgICAkP2RyYW1fdHlwZV9ERFIzX1NBTVNVTkdfSzRCMUcxNjQ2R185MzMgfHwgXAorICAgJD9kcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjFHMTY0NkdfODAwICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUREUjM7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9MTAyNDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9ODsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fYXBfYml0X3Bvcz0xMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fYnVyc3Rfc2l6ZT0zMjsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MzkwMDAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNTAwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHI9NzUwMDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHA9NzUwMCIKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvYXJhZC9jb25maWcuYmNtIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9hcmFkL2NvbmZpZy5iY20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjYjliYQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvYXJhZC9jb25maWcuYmNtCkBAIC0wLDAgKzEsMTgzOCBAQAorIworIyAkSWQ6IGNvbmZpZy1zYW5kLmJjbSx2IDEuMTQwIDIwMTMvMDkvMjIgMTQ6Mjk6NDcgdG9tZXJtYSBFeHAgJAorIworIyAkQ29weXJpZ2h0OiAoYykgMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorIyBBbGwgUmlnaHRzIFJlc2VydmVkLiQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjY2ZnIGZvciBCQ004ODY0MCAoUGV0cmFCKSBhbmQgQkNNODg2NTAgKEFyYWQpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyB0ZW1wb3Jhcnkgc3VwcHJlc3NpbmcgdW5rbm93biBzb2MgcHJvcGVydGllcyB3YXJuaW5ncyAtIHRpbGwgYWRkaW5nIHRoZW0gdW5rbm93biB0byBwcm9wZXJ0eS5oL3Byb3BnZW4KKyMjIChuZWVkIHRvIGJlIHRoZSBmaXJzdCBzb2MgcHJvcGVydHkgaW4gdGhlIGZpbGUpLgorc3VwcHJlc3NfdW5rbm93bl9wcm9wX3dhcm5pbmdzPTEKKworIyMgTXVsdGkgZGV2aWNlIHN5c3RlbSAoTmVnZXYpOiAyIGRldmljZXMsIGZhYnJpYyBtb2RlIGlzIEZFLCBtb2QgaWQgaXMgc2xvdCBpZAorIyMgKFRvcCBsaW5lIGNhcmQgaXMgMCwgYnV0dG9uIGlzIDEpLgorI2RpYWdfY2hhc3Npcz0xCisKKyMjIERpc2FibGUgZGlhZyBpbml0IGFwcGxpY2F0aW9uLiBTaG91bGQgYmUgdXNlZCBpZiBvbmUgd2FudHMgdG8gcnVuIGhpcyBvd24KKyMjIGFwcGxpY2F0aW9uIGluc3RlYWQgb2YgdGhlIGRpYWcgaW5pdCBleGFtcGxlCisjZGlhZ19kaXNhYmxlPTEKKworIyMgU2tpcCBjb3NxIGNvbmZpZ3VyYXRpb24gaW4gZGlhZ19pbml0CisjZGlhZ19jb3NxX2Rpc2FibGU9MQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyNjZmcgZm9yIEJDTTg4NjUwIC0gQXJhZAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIERldmljZSBjb25maWd1cmF0aW9uICMjIworCisjIyBBY3RpdmF0ZSBFbXVsYXRpb24gcGFydGlhbCBpbml0LiBWYWx1ZXM6IDAgLSBOb3JtYWwsIDEgLSBFbXVsYXRpb24gLkRlZmF1bHQ6IDB4MC4KK2RpYWdfZW11bGF0b3JfcGFydGlhbF9pbml0LkJDTTg4NjUwPTAKKworIyMgR2VuZXJhbAorIyBTZXQgdGhlIEZBUCBEZXZpY2UgbW9kZQorIyBPcHRpb25zOiBQUCAvIFRNIC8gVERNX09QVElNSVpFRCAvIFRETV9TVEFOREFSRAorZmFwX2RldmljZV9tb2RlLkJDTTg4NjUwPVBQCisKKyMjIENyZWRpdCB3b3J0aCBzaXplIChCeXRlcykKK2NyZWRpdF9zaXplLkJDTTg4NjUwPTEwMjQKKworIyMgQ2xvY2sgY29uZmlndXJhdGlvbnMKKyMgQ29yZSBjbG9jayBzcGVlZCAoTUh6KS4gRGVmYXVsdDogNjAwIE1IegorY29yZV9jbG9ja19zcGVlZF9raHouQkNNODg2NTA9NjAwMDAwCisjIFN5c3RlbSByZWZlcmVuY2UgY2xvY2sgKE1IeikuIERlZmF1bHQ6IDYwMCBNSHoKK3N5c3RlbV9yZWZfY29yZV9jbG9ja19raHouQkNNODg2NTA9NjAwMDAwCisKKyMjIyBOZXR3b3JrIEludGVyZmFjZSBjb25maWd1cmF0aW9uICMjIworIyMgVXNlIG9mIHRoZSB1Y29kZV9wb3J0XzxMb2NhbC1Qb3J0LUlkPj08SW50ZXJmYWNlLXR5cGU+WzxJbnRlcmZhY2UtSWQ+XVsuPENoYW5uZWwtSWQ+XQorIyMgTG9jYWwgcG9ydCByYW5nZTogMCAtIDI1NS4KKyMjIEludGVyZmFjZSB0eXBlczogWEFVSS9SWEFVSS9TR01JSS9JTEtOLzEwR0Jhc2UtUi9YTEdFL0NHRS9DUFUKKworIyBNYXAgYmNtIGxvY2FsIHBvcnQgdG8gQ1BVWy5jaGFubmVsXSBpbnRlcmZhY2VzCit1Y29kZV9wb3J0XzE4MC5CQ004ODY1MD1DUFUuMAorCitwb25fYXBwbGljYXRpb25fc3VwcG9ydF9lbmFibGVkXzAuQkNNODg2NTA9VFJVRQorcG9uX2FwcGxpY2F0aW9uX3N1cHBvcnRfZW5hYmxlZF8xLkJDTTg4NjUwPVRSVUUKK3Bvbl9hcHBsaWNhdGlvbl9zdXBwb3J0X2VuYWJsZWRfMi5CQ004ODY1MD1UUlVFCitwb25fYXBwbGljYXRpb25fc3VwcG9ydF9lbmFibGVkXzMuQkNNODg2NTA9VFJVRQorI3Bvbl9hcHBsaWNhdGlvbl9zdXBwb3J0X2VuYWJsZWRfNC5CQ004ODY1MD1UUlVFCisjcG9uX2FwcGxpY2F0aW9uX3N1cHBvcnRfZW5hYmxlZF81LkJDTTg4NjUwPVRSVUUKKyNwb25fYXBwbGljYXRpb25fc3VwcG9ydF9lbmFibGVkXzYuQkNNODg2NTA9VFJVRQorI3Bvbl9hcHBsaWNhdGlvbl9zdXBwb3J0X2VuYWJsZWRfNy5CQ004ODY1MD1UUlVFCisKK3ZsYW5fbWF0Y2hfY3JpdGVyaWFfbW9kZT1QT05fUENQX0VUSEVSVFlQRQorCisjRmlybXdhcmUgbW9kZToKKyMgMD1ERUZBVUxUCisjIDE9U0ZQX09QVF9TUjQgICAgIC0gb3B0aWNhbCBzaG9ydCByYW5nZQorIyAyPVNGUF9EQUMgICAgICAgICAtIGRpcmVjdCBhdHRhY2ggY29wcGVyCisjIDM9WExBVUkgICAgICAgICAgIC0gNDBHIFhMQVVJIG1vZGUKKyMgND1GT1JDRV9PU0RGRSAgICAgLSBmb3JjZSBvdmVyIHNhbXBsZSBkaWdpdGFsIGZlZWRiYWNrIGVxdWFsaXphdGlvbgorIyA1PUZPUkNFX0JSREZFICAgICAtIGZvcmNlIGJhdWQgcmF0ZSBkaWdpdGFsIGZlZWRiYWNrIGVxdWFsaXphdGlvbgorIyA2PVNXX0NMNzIgICAgICAgICAtIHNvZnR3YXJlIGNsNzIgd2l0aCBBTiBvbgorIyA3PUNMNzJfV0lUSE9VVF9BTiAtIGNsNzIgd2l0aG91dCBBTgorI0ZvciBOZWdldjIgY2hhc3NpcyBlbmFibGUgREZFIGlzIHJlY29tbWVuZGVkCisKK3NlcmRlc19pZl90eXBlPTEwMjQKKworI3NlcmRlc19maXJtd2FyZV9tb2RlLkJDTTg4NjUwPTMKK3NlcmRlc19maXJtd2FyZV9tb2RlX2lsLkJDTTg4NjUwPTQKK3NlcmRlc19maXJtd2FyZV9tb2RlX3NmaS5CQ004ODY1MD0wCisKKyMKKyMgU2VyZGVzIGZpcm13YXJlIG1vZGUgZm9yIENoYW5uZWxpemVkIFBPTiBpbnRlcmZhY2VzCisjCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGUwLkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTEuQkNNODg2NTA9MAorI3NlcmRlc19maXJtd2FyZV9tb2RlX3hlMi5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGUzLkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTQuQkNNODg2NTA9MAorI3NlcmRlc19maXJtd2FyZV9tb2RlX3hlNS5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGU2LkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTcuQkNNODg2NTA9MAorI3NlcmRlc19maXJtd2FyZV9tb2RlX3hlOC5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGU5LkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTEwLkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTExLkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTEyLkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTEzLkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTE0LkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTE1LkJDTTg4NjUwPTAKKworIworIyBTZXJkZXMgZmlybXdhcmUgbW9kZSBmb3IgTk5JIGludGVyZmFjZXMKKyMKK3NlcmRlc19maXJtd2FyZV9tb2RlX3hlMTI4LkJDTTg4NjUwPTIKK3NlcmRlc19maXJtd2FyZV9tb2RlX3hlMTI5LkJDTTg4NjUwPTIKK3NlcmRlc19maXJtd2FyZV9tb2RlX3hlMTMwLkJDTTg4NjUwPTIKK3NlcmRlc19maXJtd2FyZV9tb2RlX3hlMTMxLkJDTTg4NjUwPTIKK3NlcmRlc19maXJtd2FyZV9tb2RlX3hlMC5CQ004ODY1MD0yCitzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTEuQkNNODg2NTA9Mgorc2VyZGVzX2Zpcm13YXJlX21vZGVfeGUyLkJDTTg4NjUwPTIKK3NlcmRlc19maXJtd2FyZV9tb2RlX3hlMy5CQ004ODY1MD0yCisKKyMKKyMgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIFBPTi1zaWRlIHBvcnRzIChjb25uZWN0ZWQgdG8gUGlvbmVlcikgdG8gMTIuNUcKKyMKKyNwb3J0X2luaXRfc3BlZWRfeGUwLkJDTTg4NjUwPTEyNTAwCisjcG9ydF9pbml0X3NwZWVkX3hlMS5CQ004ODY1MD0xMjUwMAorI0lMIyBjaGFuZ2UgeGUzLCB4ZTIgc3BlZWQgdG8gMi41RyBhbmQgMUcKK3BvcnRfaW5pdF9zcGVlZF94ZTIuQkNNODg2NTA9MjUwMAorcG9ydF9pbml0X3NwZWVkX3hlMy5CQ004ODY1MD0xMDAwCisjcG9ydF9pbml0X3NwZWVkX3hlNC5CQ004ODY1MD0xMjUwMAorI3BvcnRfaW5pdF9zcGVlZF94ZTUuQkNNODg2NTA9MTI1MDAKKyNwb3J0X2luaXRfc3BlZWRfeGU2LkJDTTg4NjUwPTEyNTAwCisjcG9ydF9pbml0X3NwZWVkX3hlNy5CQ004ODY1MD0xMjUwMAorI3BvcnRfaW5pdF9zcGVlZF94ZTguQkNNODg2NTA9MTI1MDAKKyNwb3J0X2luaXRfc3BlZWRfeGU5LkJDTTg4NjUwPTEyNTAwCisjcG9ydF9pbml0X3NwZWVkX3hlMTAuQkNNODg2NTA9MTI1MDAKKyNwb3J0X2luaXRfc3BlZWRfeGUxMS5CQ004ODY1MD0xMjUwMAorI3BvcnRfaW5pdF9zcGVlZF94ZTEyLkJDTTg4NjUwPTEyNTAwCisjcG9ydF9pbml0X3NwZWVkX3hlMTMuQkNNODg2NTA9MTI1MDAKKyNwb3J0X2luaXRfc3BlZWRfeGUxNC5CQ004ODY1MD0xMjUwMAorI3BvcnRfaW5pdF9zcGVlZF94ZTE1LkJDTTg4NjUwPTEyNTAwCisKKyMKKyMgU2V0IHRoZSBudW1iZXIgb2YgcHJpb3JpdGllcyBmb3IgdGhlIFBPTi1zaWRlIHBvcnRzIChjb25uZWN0ZWQgdG8KKyMgUGlvbmVlcikgdG8gJzInLgorIworcG9ydF9wcmlvcml0aWVzX3hlMC5CQ004ODY1MD0yCitwb3J0X3ByaW9yaXRpZXNfeGUxLkJDTTg4NjUwPTIKK3BvcnRfcHJpb3JpdGllc194ZTIuQkNNODg2NTA9MgorcG9ydF9wcmlvcml0aWVzX3hlMy5CQ004ODY1MD0yCisjcG9ydF9wcmlvcml0aWVzX3hlNC5CQ004ODY1MD0yCisjcG9ydF9wcmlvcml0aWVzX3hlNS5CQ004ODY1MD0yCisjcG9ydF9wcmlvcml0aWVzX3hlNi5CQ004ODY1MD0yCisjcG9ydF9wcmlvcml0aWVzX3hlNy5CQ004ODY1MD0yCisjcG9ydF9wcmlvcml0aWVzX3hlOC5CQ004ODY1MD0yCisjcG9ydF9wcmlvcml0aWVzX3hlOS5CQ004ODY1MD0yCisjcG9ydF9wcmlvcml0aWVzX3hlMTAuQkNNODg2NTA9MgorI3BvcnRfcHJpb3JpdGllc194ZTExLkJDTTg4NjUwPTIKKyNwb3J0X3ByaW9yaXRpZXNfeGUxMi5CQ004ODY1MD0yCisjcG9ydF9wcmlvcml0aWVzX3hlMTMuQkNNODg2NTA9MgorI3BvcnRfcHJpb3JpdGllc194ZTE0LkJDTTg4NjUwPTIKKyNwb3J0X3ByaW9yaXRpZXNfeGUxNS5CQ004ODY1MD0yCisKKyMKKyMgTWFwIGJjbSBsb2NhbCBwb3J0IHRvIE5ldHdvcmstSW50ZXJmYWNlWy5jaGFubmVsXSBpbnRlcmZhY2VzCisjCisjIFBPTiBJbnRlcmZhY2VzCisjCisKKyMKKyMgTm9uLWNoYW5uZWxpemVkIFBPTiBJbnRlcmZhY2VzCisjCisjIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGlmIHVzaW5nIG5vbi1jaGFubmVsaXplZCBQT04gaW50ZXJmYWNlcyB3aXRoCisjIFBpb25lZXIuCisjCisjdWNvZGVfcG9ydF8wLkJDTTg4NjUwPTEwR0Jhc2UtUjgKKyN1Y29kZV9wb3J0XzEuQkNNODg2NTA9MTBHQmFzZS1SOQorI3Vjb2RlX3BvcnRfMi5CQ004ODY1MD0xMEdCYXNlLVIxMAorI3Vjb2RlX3BvcnRfMy5CQ004ODY1MD0xMEdCYXNlLVIxMQorI3Vjb2RlX3BvcnRfNC5CQ004ODY1MD0xMEdCYXNlLVIxMgorI3Vjb2RlX3BvcnRfNS5CQ004ODY1MD0xMEdCYXNlLVIxMworI3Vjb2RlX3BvcnRfNi5CQ004ODY1MD0xMEdCYXNlLVIxNAorI3Vjb2RlX3BvcnRfNy5CQ004ODY1MD0xMEdCYXNlLVIxNQorCisjCisjIENoYW5uZWxpemVkIFBPTiBJbnRlcmZhY2VzCisjCisjIERlZmluZSB2aXJ0dWFsIHBvcnRzIGZvciB0aGUgMTBHIENoYW5uZWxzCisjCisjdWNvZGVfcG9ydF8wLkJDTTg4NjUwPTEwR0Jhc2UtUjguMAorI3Vjb2RlX3BvcnRfMS5CQ004ODY1MD0xMEdCYXNlLVI5LjAKKyN1Y29kZV9wb3J0XzIuQkNNODg2NTA9MTBHQmFzZS1SMTAuMAorI3Vjb2RlX3BvcnRfMy5CQ004ODY1MD0xMEdCYXNlLVIxMS4wCisjdWNvZGVfcG9ydF80LkJDTTg4NjUwPTEwR0Jhc2UtUjEyLjAKKyN1Y29kZV9wb3J0XzUuQkNNODg2NTA9MTBHQmFzZS1SMTMuMAorI3Vjb2RlX3BvcnRfNi5CQ004ODY1MD0xMEdCYXNlLVIxNC4wCisjdWNvZGVfcG9ydF83LkJDTTg4NjUwPTEwR0Jhc2UtUjE1LjAKKworIworIyBEZWZpbmUgdmlydHVhbCBwb3J0cyBmb3IgdGhlIDFHIENoYW5uZWxzCisjCisjdWNvZGVfcG9ydF84LkJDTTg4NjUwPTEwR0Jhc2UtUjguMQorI3Vjb2RlX3BvcnRfOS5CQ004ODY1MD0xMEdCYXNlLVI5LjEKKyN1Y29kZV9wb3J0XzEwLkJDTTg4NjUwPTEwR0Jhc2UtUjEwLjEKKyN1Y29kZV9wb3J0XzExLkJDTTg4NjUwPTEwR0Jhc2UtUjExLjEKKyN1Y29kZV9wb3J0XzEyLkJDTTg4NjUwPTEwR0Jhc2UtUjEyLjEKKyN1Y29kZV9wb3J0XzEzLkJDTTg4NjUwPTEwR0Jhc2UtUjEzLjEKKyN1Y29kZV9wb3J0XzE0LkJDTTg4NjUwPTEwR0Jhc2UtUjE0LjEKKyN1Y29kZV9wb3J0XzE1LkJDTTg4NjUwPTEwR0Jhc2UtUjE1LjEKKworIworIyBOTkkgSW50ZXJmYWNlcworIwordWNvZGVfcG9ydF8xMjguQkNNODg2NTA9MTBHQmFzZS1SMAordWNvZGVfcG9ydF8xMjkuQkNNODg2NTA9MTBHQmFzZS1SMQordWNvZGVfcG9ydF8xMzAuQkNNODg2NTA9MTBHQmFzZS1SMgordWNvZGVfcG9ydF8xMzEuQkNNODg2NTA9MTBHQmFzZS1SMwordWNvZGVfcG9ydF8wLkJDTTg4NjUwPTEwR0Jhc2UtUjQKK3Vjb2RlX3BvcnRfMS5CQ004ODY1MD0xMEdCYXNlLVI1Cit1Y29kZV9wb3J0XzIuQkNNODg2NTA9MTBHQmFzZS1SNgordWNvZGVfcG9ydF8zLkJDTTg4NjUwPTEwR0Jhc2UtUjcKKworI3Vjb2RlX3BvcnRfMjAwLkJDTTg4NjUwPUNQVS4xCisjdWNvZGVfcG9ydF8yMDEuQkNNODg2NTA9Q1BVLjIKKyN1Y29kZV9wb3J0XzIwMi5CQ004ODY1MD1DUFUuMworI3Vjb2RlX3BvcnRfMjAzLkJDTTg4NjUwPUNQVS40CisKKyM0MEcKKyN1Y29kZV9wb3J0XzEuQkNNODg2NTA9WExHRTAKKyN1Y29kZV9wb3J0XzIuQkNNODg2NTA9WExHRTEKKyN1Y29kZV9wb3J0XzMuQkNNODg2NTA9WExHRTIKKyN1Y29kZV9wb3J0XzQuQkNNODg2NTA9WExHRTMKKyN1Y29kZV9wb3J0XzUuQkNNODg2NTA9WExHRTQKKyN1Y29kZV9wb3J0XzYuQkNNODg2NTA9WExHRTUKKyN1Y29kZV9wb3J0XzcuQkNNODg2NTA9WExHRTYKKworI0lMS04gY29uZmlndXJhdGlvbiAtIGJhc2ljIGNvbmZpZworI3Vjb2RlX3BvcnRfMzEuQkNNODg2NTA9SUxLTjAKKyN1Y29kZV9wb3J0XzMyLkJDTTg4NjUwPUlMS04xCisjaWxrbl9udW1fbGFuZXNfMC5CQ004ODY1MD0xMgorI2lsa25fbnVtX2xhbmVzXzEuQkNNODg2NTA9MTIKKyNwb3J0X2luaXRfc3BlZWRfaWwuQkNNODg2NTA9MTAzMTIKKworCisjSUxLTiBwZXIgcG9ydCBjaGFubmVsIHN0YXQKKyNpbGtuX2NvdW50ZXJzX21vZGUuQkNNODg2NTA9UEFDS0VUX1BFUl9DSEFOTkVMCisKKyNJTEtOIGNvbmZpZ3VyYXRpb24gLSBhZHZhbmNlZAorI2lsa25fbWV0YWZyYW1lX3N5bmNfcGVyaW9kPTIwNDgKKyMgRW5hYmxlXERpc2FibGUgSUxLTiBzdGF0dXMgbWVzc2FnZSBzZW50IHRocm91Z2ggYW4gb3V0LW9mLWJhbmQgaW50ZXJmYWNlLgorIyBpbGtuX2ludGVyZmFjZV9zdGF0dXNfb29iX2lnbm9yZS5CQ004ODY1MD0xCisKKyMjSUxLTiByZXRyYW5zbWl0CisjaWxrbl9yZXRyYW5zbWl0X2VuYWJsZV9yeC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X2VuYWJsZV90eC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X2J1ZmZlcl9zaXplLkJDTTg4NjUwPTI1MAorI2lsa25fcmV0cmFuc21pdF9udW1fcmVxdWVzdHNfcmVzZW50LkJDTTg4NjUwPTE1CisjaWxrbl9yZXRyYW5zbWl0X251bV9zbl9yZXBldGl0aW9uc190eC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X251bV9zbl9yZXBldGl0aW9uc19yeC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X3J4X3RpbWVvdXRfd29yZHMuQkNNODg2NTA9MzgwMAorI2lsa25fcmV0cmFuc21pdF9yeF90aW1lb3V0X3NuLkJDTTg4NjUwPTI1MAorI2lsa25fcmV0cmFuc21pdF9yeF9pZ25vcmUuQkNNODg2NTA9ODAKKyNpbGtuX3JldHJhbnNtaXRfcnhfcmVzZXRfd2hlbl9lcnJvcl9lbmFibGUuQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9yeF93YXRjaGRvZy5CQ004ODY1MD0wCisjaWxrbl9yZXRyYW5zbWl0X3J4X3Jlc2V0X3doZW5fYWxsaWduZWRfZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTEKKyNpbGtuX3JldHJhbnNtaXRfcnhfcmVzZXRfd2hlbl9yZXRyeV9lcnJvcl9lbmFibGUuQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9yeF9yZXNldF93aGVuX3dyYXBfYWZ0ZXJfZGlzY19lcnJvcl9lbmFibGUuQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9yeF9yZXNldF93aGVuX3dyYXBfYmVmb3JlX2Rpc2NfZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTAKKyNpbGtuX3JldHJhbnNtaXRfcnhfcmVzZXRfd2hlbl90aW1vdXRfZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTAKKyNpbGtuX3JldHJhbnNtaXRfdHhfd2FpdF9mb3Jfc2VxX251bV9jaGFuZ2VfZW5hYmxlLkJDTTg4NjUwPTEKKyNpbGtuX3JldHJhbnNtaXRfdHhfaWdub3JlX3JlcXVlc3RzX3doZW5fZmlmb19hbG1vc3RfZW1wdHkuQkNNODg2NTA9MQorCisjdWNvZGVfcG9ydF80MC5CQ004ODY1MD1SQ1kuMAorI3Vjb2RlX3BvcnRfNDEuQkNNODg2NTA9UkNZLjEKKyN1Y29kZV9wb3J0XzQyLkJDTTg4NjUwPVJDWS4yCisKKyMjIENBVUkgQ29uZmlndXJhdGlvbgorI3Vjb2RlX3BvcnRfNDEuQkNNODg2NTA9Q0dFMAorI3Vjb2RlX3BvcnRfNDIuQkNNODg2NTA9Q0dFMQorY2F1aV9udW1fbGFuZXNfMC5CQ004ODY1MD0xMAorY2F1aV9udW1fbGFuZXNfMS5CQ004ODY1MD0xMAorI1JlcXVpcmVkIGZvciB3b3JraW5nIElYSUEgMTAwRyBwb3J0OgorbWxkX2xhbmVfc3dhcF9sYW5lMjBfY2UuQkNNODg2NTA9MAorbWxkX2xhbmVfc3dhcF9sYW5lMjFfY2UuQkNNODg2NTA9MQorbWxkX2xhbmVfc3dhcF9sYW5lMF9jZS5CQ004ODY1MD0yMAorbWxkX2xhbmVfc3dhcF9sYW5lMV9jZS5CQ004ODY1MD0yMQorCisjIFRoaXMgY29uZmlndXJlcyB0aGUgbGFuZSBwb2xhcml0eQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxLkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5Mi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTMuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHk0LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5NS5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTYuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHk3LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5OC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTkuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxMC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTExLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTIuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxMy5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTE0LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTUuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxNi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTE3LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTguQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxOS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTIwLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjEuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyMi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTIzLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjQuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyNS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTI2LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjcuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyOC5CQ004ODY1MD0wCisKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTIuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkzLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5NC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTUuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHk2LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5Ny5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTguQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHk5LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTAuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxMS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTEyLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTMuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxNC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTE1LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTYuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxNy5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTE4LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTkuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyMC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTIxLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjIuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyMy5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTI0LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjUuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyNi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTI3LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjguQkNNODg2NTA9MAorCit4Z3hzX3R4X2xhbmVfbWFwX3F1YWQwLkJDTTg4NjUwPTB4MzIxMAoreGd4c190eF9sYW5lX21hcF9xdWFkMS5CQ004ODY1MD0weDMyMTAKK3hneHNfdHhfbGFuZV9tYXBfcXVhZDIuQkNNODg2NTA9MHgzMjEwCit4Z3hzX3R4X2xhbmVfbWFwX3F1YWQzLkJDTTg4NjUwPTB4MzIxMAoreGd4c190eF9sYW5lX21hcF9xdWFkNC5CQ004ODY1MD0weDMyMTAKK3hneHNfdHhfbGFuZV9tYXBfcXVhZDUuQkNNODg2NTA9MHgzMjEwCit4Z3hzX3R4X2xhbmVfbWFwX3F1YWQ2LkJDTTg4NjUwPTB4MzIxMAorCit4Z3hzX3J4X2xhbmVfbWFwX3F1YWQwLkJDTTg4NjUwPTB4MzIxMAoreGd4c19yeF9sYW5lX21hcF9xdWFkMS5CQ004ODY1MD0weDMyMTAKK3hneHNfcnhfbGFuZV9tYXBfcXVhZDIuQkNNODg2NTA9MHgzMjEwCit4Z3hzX3J4X2xhbmVfbWFwX3F1YWQzLkJDTTg4NjUwPTB4MzIxMAoreGd4c19yeF9sYW5lX21hcF9xdWFkNC5CQ004ODY1MD0weDMyMTAKK3hneHNfcnhfbGFuZV9tYXBfcXVhZDUuQkNNODg2NTA9MHgzMjEwCit4Z3hzX3J4X2xhbmVfbWFwX3F1YWQ2LkJDTTg4NjUwPTB4MzIxMAorCisKKworI0hpZ2ggdm9sdGFnZSBkcml2ZXIgc3RyYXAuIElmIDAsIGNvbm5lY3RlZCB0byAxLjRWIHN1cHBseTsgaWYgMSwgY29ubmVjdGVkIHRvIDFWIG1vZGUuCisjZm9yIHNwZWNpZmljIHF1YWQgdXNlIHNyZF90eF9kcnZfaHZfZGlzYWJsZV9xdWFkX1ggd2hlcmUgWCBpcyAoRlNSRCBudW0gKiA0ICsgaW50ZXJuYWwgcXVhZCkKK3NyZF90eF9kcnZfaHZfZGlzYWJsZS5CQ004ODY1MD0xCisKKyNQb3J0IGluaXQgbW9kZQorI3BvcnRfaW5pdF9kdXBsZXg9MAorI3BvcnRfaW5pdF9hZHY9MAorI3BvcnRfaW5pdF9hdXRvbmVnPTAKKworCisjIFRoaXMgZGlzYWJsZXMgc2VyZGVzIGluaXRpYWxpemF0aW9uCisjIHBoeV9udWxsLkJDTTg4NjUwPTEKKworIyMgIE51bWJlciBvZiBJbnRlcm5hbCBwb3J0cworIyBFbmFibGUgdGhlIEVSUCBwb3J0LiBWYWx1ZXM6IDAgLyAxLgorbnVtX2VycF90bV9wb3J0cy5CQ004ODY1MD0xCisjIEVuYWJsZSB0aGUgT0xQIHBvcnQuIFZhbHVlczogMCAvIDEuCitudW1fb2xwX3RtX3BvcnRzLkJDTTg4NjUwPTEKKyMgRW5hYmxlIE9BTVAKK251bV9vYW1wX3BvcnRzLkJDTTg4NjUwPTAKKworIyMgRmlybXdhcmUgTG9hZCBNZXRob2QKK2xvYWRfZmlybXdhcmUuQkNNODg2NTA9MHgxMDIKKworIyMjIEhlYWRlcnMgY29uZmlndXJhdGlvbiAjIyMKKworIyMgVXNlIG9mIHRoZSB0bV9wb3J0X2hlYWRlcl90eXBlXzxMb2NhbC1Qb3J0LUlkPj08SGVhZGVyLXR5cGU+CisjIyBEZWZhdWx0IGhlYWRlciB0eXBlIGlzIGRlcml2ZWQgZnJvbSBmYXBfZGV2aWNlX21vZGU6IElmIGZhcF9kZXZpY2VfbW9kZSBpcworIyMgUFAsIGRlZmF1bHQgaGVhZGVyIHR5cGUgaXMgRVRILiBPdGhlcndpc2UsIGRlZnVhbHQgaGVhZGVyIHR5cGUgaXMgVE0uCisjIyBIZWFkZXIgdHlwZSBwZXIgcG9ydCBjYW4gYmUgb3ZlcnJpZGVuLgorIyMgQWxsIG9wdGlvbnM6IEVUSC9SQVcvVE0vUFJPRy9DUFUvU1RBQ0tJTkcvVERNL1RETV9SQVcvVURIX0VUSAorIyMgSW5qZWN0ZWQgaGVhZGVyIHR5cGVzOiBpZiBQVENILCBJTkpFQ1RFRCAobG9jYWwgUG9ydCBvZiB0eXBlIFRNKSBvciBJTkpFQ1RFRF9QUCAoUFApCisjIyAgICAgICAgICAgICAgICAgICAgICAgIGlmIFBUQ0gtMiwgSU5KRUNURURfMiAobG9jYWwgUG9ydCBvZiB0eXBlIFRNKSBvciBJTkpFQ1RFRF8yX1BQIChQUCkKKworIyBTZXQgQ1BVIHRvIHdvcmsgd2l0aCBUTSBoZWFkZXIgKElUTUgpCisjdG1fcG9ydF9oZWFkZXJfdHlwZV8wLkJDTTg4NjUwPVRNCisKK3RtX3BvcnRfaGVhZGVyX3R5cGVfaW5fMTgwLkJDTTg4NjUwPUlOSkVDVEVEXzIKK3RtX3BvcnRfaGVhZGVyX3R5cGVfb3V0XzE4MC5CQ004ODY1MD1DUFUKKwordG1fcG9ydF9oZWFkZXJfdHlwZV9pbl8yMDAuQkNNODg2NTA9SU5KRUNURURfMl9QUAordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjAwLkJDTTg4NjUwPUVUSAordG1fcG9ydF9oZWFkZXJfdHlwZV9pbl8yMDEuQkNNODg2NTA9SU5KRUNURURfMl9QUAordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjAxLkJDTTg4NjUwPUVUSAordG1fcG9ydF9oZWFkZXJfdHlwZV9pbl8yMDIuQkNNODg2NTA9SU5KRUNURURfMl9QUAordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjAyLkJDTTg4NjUwPUVUSAordG1fcG9ydF9oZWFkZXJfdHlwZV9pbl8yMDMuQkNNODg2NTA9SU5KRUNURURfMl9QUAordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjAzLkJDTTg4NjUwPUVUSAorCisjIyMgUGFyc2VyIENvbmZpZ3VyYXRpb24gIyMjCisjIFBhcnNlciBoYXMgNCBjdXN0b20gbWFjcm9zIHRoYXQgYXJlIGFsbG9jYXRlZCBkeW5hbWljYWxseSBhbmQKKyMgY29uZmlndXJlZCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhbmQgc29jIHByb3BlcnRpZXM6CisjIFRyaWxsICgxIG1hY3JvKSAtIHRyaWxsX21vZGUKKyMgRkNvRSAoMiBtYWNyb3MpIC0gYmNtODg2eHhfZmNvZV9zd2l0Y2hfbW9kZQorIyBWeExBTiAoMSBtYWNybykgLSBiY204ODZ4eF92eGxhbl9lbmFibGUKKyMgSVB2Ni1FeHRlbnNpb24taGVhZGVyICgyIG1hY3JvcykgLSBiY204ODZ4eF9pcHY2X2V4dF9oZHJfZW5hYmxlCisjIFVEUCAoMSBtYWNybykgLSBVRFAgcGFyc2luZyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIGFuZCBjYW4gYmUgCisjICBkaXNhYmxlZCB3aXRoIHNvYyBwcm9wZXJ0eSBjdXN0b21fZmVhdHVyZV91ZHBfcGFyc2VfZGlzYWJsZQorIyAgV2hlbiBkaXNhYmxpbmcgVURQIHBhcnNpbmcgVnhMQU4gYW5kIDE1ODhvVURQIGFyZSBhZmZlY3RlZAorCisjIEVuYWJsZSBJUHY2IEV4dGVuc2lvbiBIZWFkZXIsIDAgLSBkaXNhYmxlIChkZWZhdWx0KSwgMSAtIGVuYWJsZQorI2JjbTg4Nnh4X2lwdjZfZXh0X2hkcl9lbmFibGU9MQorCisjIERpc2FibGUgVURQIHBhcnNpbmcsIDAgLSBlbmFibGUgKGRlZmF1bHQpLCAxIC0gZGlzYWJsZQorI2N1c3RvbV9mZWF0dXJlX3VkcF9wYXJzZV9kaXNhYmxlPTEKKworI09BTVAgcG9ydAorI3RtX3BvcnRfaGVhZGVyX3R5cGVfb3V0XzIzMi5CQ004ODY1MD1DUFUKKworI01QTFMtVFAgY2hhbm5lbCB0eXBlcyBmb3IgT0FNL0JGRCAtIElmIE1QTFMtVFAgdXNlZCwgY2hhbm5lbCBzaG91bGQgYmUgc3BlY2lmaWVkCisjQXZhaWxhYmxlIHR5cGVzOiBtcGxzdHBfYmZkX2NvbnRyb2xfY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX3B3X2FjaF9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfZGxtX2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9pbG1fY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2RtX2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9pcHY0X2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9jY19jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfY3ZfY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX29uX2RlbWFuZF9jdl9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfcHdlX29hbV9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfaXB2Nl9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfZmF1bHRfb2FtX2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9nODExM19jaGFubmVsX3R5cGUKKyNtcGxzdHBfZzgxMTNfY2hhbm5lbF90eXBlPTB4ODkwMgorCisKKworIyBTZXQgdGhlIHJlY3ljbGluZyBwb3J0IHByb2Nlc3NpbmcgdG8gYmUgcmF3IChzdGF0aWMgZm9yd2FyZGluZykKK3RtX3BvcnRfaGVhZGVyX3R5cGVfcmN5LkJDTTg4NjUwPVJBVworCisjIyMgUkNQVQorIyBWYWxpZCBDUFUgbG9jYWwgcG9ydHMgb24gd2hpY2ggUkNQVSBwYWNrZXRzIGNhbiBiZSByZWNlaXZlZCBieSBzbGF2ZSBkZXZpY2UuCisjcmNwdV9yeF9wYm1wPTB4ZjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCisKKyN0bV9wb3J0X2hlYWRlcl90eXBlXzUxNC5CQ004ODY1MD1SQVcKKworIyMgSGVhZGVyIGV4dGVuc2lvbnMKKyMgU2V0IGlmIGFuIEZUTUggT3V0LUxJRiBleHRlbnNpb24gaXMgcHJlc2VudCB0byBVbmljYXN0IGFuZCBNdWx0aWNhc3QgcGFja2V0cworIyBPcHRpb25zOiBORVZFUiAvIElGX01DIChvbmx5IE11bHRpY2FzdCBwYWNrZXRzKSAvIEFMV0FZUworZmFicmljX2Z0bWhfb3V0bGlmX2V4dGVuc2lvbi5CQ004ODY1MD1JRl9NQworCisjIFNldCB0aGUgRlRNSCBMb2FkLUJhbGFuY2luZyBLZXkgZXh0ZW5zaW9uIG1vZGUKKyMgT3B0aW9ucyBmb3IgODg2NjA6IEVOQUJMRUQsIEZVTExfSEFTSAorIyBPcHRpb25zIGZvciA4ODY1MDogRU5BQkxFRAorIyBPcHRpb25zIGZvciA4ODY0MCBjb21wYXRpYmxlOiBESVNBQkxFRCAvIDhCX0xCX0tFWV84Ql9TVEFDS0lOR19ST1VURV9ISVNUT1JZIC8gMTZCX1NUQUNLSU5HX1JPVVRFX0hJU1RPUlkgLyAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBTkRCWV9NQ19MQiAoYXZhaWxhYmxlIG9ubHkgZm9yIEFyYWRQbHVzKQorIyBEZWZhdWx0OiBESVNBQkxFRAorc3lzdGVtX2Z0bWhfbG9hZF9iYWxhbmNpbmdfZXh0X21vZGUuQkNNODg2NTA9RElTQUJMRUQKKworIyBTZXQgaWYgYW4gT1RNSCBPdXQtTElGIChDVUQpIEV4dGVuc2lvbiBpcyBwcmVzZW50IHRvIFVuaWNhc3QgYW5kIE11bHRpY2FzdCBwYWNrZXRzCisjIE9wdGlvbnM6IE5FVkVSIC8gSUZfTUMgKG9ubHkgTXVsdGljYXN0IHBhY2tldHMpIC8gQUxXQVlTIC8gRE9VQkxFX1RBRyAodHdvIGhvcCBzY2hlZHVsaW5nKQorIyBEZWZhdWx0OiBORVZFUgorIyB0bV9wb3J0X290bWhfb3V0bGlmX2V4dF9tb2RlXzEzLkJDTTg4NjUwPU5FVkVSCisKKyMgU2V0IGlmIGFuIE9UTUggU291cmNlLVN5c3RlbS1Qb3J0IEV4dGVuc2lvbiBpcyBwcmVzZW50LgorIyBPcHRpb246IDAvMQorIyBEZWZhdWx0OiAwCisjIHRtX3BvcnRfb3RtaF9zcmNfZXh0X2VuYWJsZV8xMy5CQ004ODY1MD0wCisKKyNUcnVuayBoYXNoIGZvcm1hdCwgcmVsZXZhbnQgb25seSBmb3IgQXJhZFBsdXMuIFBvc3NpYmxlIHZhbHVlczogTk9STUFMIChkZWZhdWx0KSAvIElOVkVSVEVEIC8gRFVQTElDQVRFRC4KKyN0cnVua19oYXNoX2Zvcm1hdD1OT1JNQUwKKworIyMgU3RhY2tpbmcgQXBwbGljYXRpb24KKyNzdGFja2luZ19lbmFibGUuQkNNODg2NTA9MQorI2N1c3RvbV9mZWF0dXJlX3N0YW1wX3VjX2Rlc3RpbmF0aW9uLkJDTTg4NjUwPTEKKworIyMgU3lzdGVtIFJFRAorIyBTZXQgU3lzdGVtLVJlZCBmdW5jdGlvbmFsaXR5LgorI3N5c3RlbV9yZWRfZW5hYmxlLkJDTTg4NjUwPTEKKworIyBJbmRpY2F0ZSB0aGUgc2l6ZSAoQnl0ZXMpIG9mIGEgZmlyc3QgaGVhZGVyIHRvIHNraXAKKyMgYmVmb3JlIHRoZSBtYWpvciBoZWFkZXIgYXQgaW5ncmVzcyAoZS5nLiBFdGhlcm5ldCwgSVRNSCkKKyMgSXQgY2FuIGJlIHNldCBwZXIgcG9ydCBhbHNvCitmaXJzdF9oZWFkZXJfc2l6ZS5CQ004ODY1MD0wCisKKyMgSW5kaWNhdGUgdGhlIHNpemUgKEJ5dGVzKSBvZiB0aGUgUE1GIEV4dGVuc2lvbiBIZWFkZXJzCisjIHRvIHJlbW92ZSBmb3IgVE0gaGVhZGVyIHR5cGUgcG9ydHMgKGV4cGVjdGluZyBJVE1IKQorIyBTZXQgcGVyIHBvcnQKKyNwb3N0X2hlYWRlcnNfc2l6ZV8wLkJDTTg4NjUwPTQKKworIyBJbmRpY2F0ZSB0aGUgc2l6ZSAoQnl0ZXMpIG9mIHRoZSBVc2VyLUhlYWRlcnM6IGNvbmZpZ3VyYWJsZQorIyBoZWFkZXJzIGxvY2F0ZWQgaW4gdGhlIGZhYnJpYyBiZXR3ZWVuIGludGVybmFsIGhlYWRlcnMgYW5kCisjIEV0aGVybmV0LiBUaGVpciB2YWx1ZXMgYXJlIHNldCBieSBJbmdyZXNzIEZQLCBhbmQgY2FuIGJlIHVzZWQKKyMgYnkgRWdyZXNzIEZQIG9yIEVncmVzcyBFZGl0b3IuCisjIHVuaXRzOiBiaXRzLiA0IHZhbHVlcyBjYW4gYmUgc2V0OgorIyAwIC0gc2l6ZSBvZiB0aGUgMXN0IFVzZXItSGVhZGVyLCBmb3IgdGhlIEVncmVzcyBQTUYuIDBiIC8gOGIgLyAxNmIKKyMgMSAtIHNpemUgb2YgdGhlIDJuZCBVc2VyLUhlYWRlciwgZm9yIHRoZSBFZ3Jlc3MgUE1GLiAwYiAvIDhiIC8gMTZiCisjIFRoZSBzdW0gb2YgdGhlc2UgMiB2YWx1ZXMgc2hvdWxkIGJlIHVuZGVyIDE2YgorIyAyLCAzIC0gc2l6ZSBvZiB0aGUgMXN0LzJuZCBVc2VyLUhlYWRlciwgZm9yIHRoZSBFZ3Jlc3MgRWRpdG9yLgorIyAwYiAvIDhiIC8gMTZiIC8gMjRiIC8gMzJiCisjIEVhY2ggb2YgdGhlIGdsb2JhbCBVc2VyLUhlYWRlciBzaXplIG11c3QgYmUgdW5kZXIgMzIgYml0cywgYnV0IG5vdCAyNCBiaXRzLgorIyBUaGUgRWdyZXNzIEZQIGZpZWxkIGlzIGFsd2F5cyBhdCB0aGUgTVNCIG9mIHRoZSBVc2VyLUhlYWRlcgorIyBOb3QgYXZhaWxhYmxlIGZvciA4ODY1MC1BMC4KKyNmaWVsZF9jbGFzc19pZF9zaXplXzAuQkNNODg2NTA9OAorI2ZpZWxkX2NsYXNzX2lkX3NpemVfMS5CQ004ODY1MD0wCisjZmllbGRfY2xhc3NfaWRfc2l6ZV8yLkJDTTg4NjUwPTI0CisjZmllbGRfY2xhc3NfaWRfc2l6ZV8zLkJDTTg4NjUwPTAKKworCisjIyMgVHJ1bmsgLSBMQUcgY29uZmlndXJhdGlvbiAjIyMKKyMgU2V0IFNldCB0aGUgbnVtYmVyIG9mIExBR3M6IDEwMjQsIDUxMiwgMjU2LCAxMjggb3IgNjQKK251bWJlcl9vZl90cnVua3MuQkNNODg2NTA9MjU2CisKKyMjIyBTWU5DRSBjb25maWd1cmF0aW9uICMjIworIyMgU3luY2hyb25vdXMgRXRoZXJuZXQgU2lnbmFsIE1vZGUuCisjIyBPcHRpb25zOiBUV09fRElGRl9DTEssIFRXT19DTEtfQU5EX1ZBTElELiBEZWZhdWx0OiBUV09fQ0xLX0FORF9WQUxJRAorI3N5bmNfZXRoX21vZGUuQkNNODg2NTA9VFdPX0NMS19BTkRfVkFMSUQKKworIyMgQ2xvY2sgU291cmNlIChzaW5nbGUgU2VyRGVzKSBsYW5lIGluIHRoZSBzcGVjaWZpZWQgTklGIHBvcnQuCisjIyBVc2FnZTogc3luY19ldGhfY2xrX3RvX25pZl9pZF9jbGtfPGNsa19udW1iZXI+PTxzZXJkZXNfbnVtYmVyPgorI3N5bmNfZXRoX2Nsa190b19uaWZfaWRfY2xrXzAuQkNNODg2NTA9MQorI3N5bmNfZXRoX2Nsa190b19uaWZfaWRfY2xrXzEuQkNNODg2NTA9MQorCisjIyBDbG9jayBEaXZpZGVyIGZvciB0aGUgc2VsZWN0ZWQgcmVjb3ZlcmVkIGNsb2NrLiBWYWxpZCB2YWx1ZXM6IDEvMi80LiBEZWZhdWx0OiAxLgorIyMgVXNhZ2U6IHN5bmNfZXRoX2Nsa19kaXZpZGVyX2Nsa188Y2xrX251bWJlcj49PDEvMi80PgorI3N5bmNfZXRoX2Nsa19kaXZpZGVyX2Nsa18wLkJDTTg4NjUwPTEKKyNzeW5jX2V0aF9jbGtfZGl2aWRlcl9jbGtfMS5CQ004ODY1MD0xCisKKyMjIEVuYWJsZSB0aGUgYXV0b21hdGljIHNxdWVsY2ggZnVuY3Rpb24gZm9yIHRoZSByZWNvdmVyZWQgY2xvY2suIFZhbGlkIHZhbHVlczogMC8xLiBEZWZhdWx0OiAwLgorIyMgVXNhZ2U6IHN5bmNfZXRoX2Nsa19zcXVlbGNoX2VuYWJsZV9jbGtfPGNsa19udW1iZXI+PTwwLzE+Cisjc3luY19ldGhfY2xrX3NxdWVsY2hfZW5hYmxlX2Nsa18wLkJDTTg4NjUwPTAKKyNzeW5jX2V0aF9jbGtfc3F1ZWxjaF9lbmFibGVfY2xrXzEuQkNNODg2NTA9MAorCisjIyMgRUxLIGNvbmZpZ3VyYXRpb24gIyMjCisjIyBFeHRlcm5hbCBsb29rdXAgKFRDQU0pIERldmljZSB0eXBlIHNlbGVjdCwgSW5kaWNhdGUgdGhlIEV4dGVybmFsIGxvb2t1cCBEZXZpY2UgdHlwZS4KKyMgVmFsdWUgT3B0aW9uczogTk9ORS9OTDg4NjUwLiBEZWZhdWx0OiBOT05FLgorI2V4dF90Y2FtX2Rldl90eXBlPU5MODg2NTAKKworIyMgU2V0IEVMSyBGV0QgdGFibGUgU2l6ZS4KKyMgZm9ybWF0OiBleHRfeHh4X2Z3ZF90YWJsZV9zaXplLgorIyB3aGVyZSB4eHggcmVwbGFjZWQgYnkgRldEIG9wdGlvbnM6IGlwNF91Y19ycGYvaXA0X21jL2lwNl91Y19ycGYvaXA2L2lwNl9tYy90cmlsbF91Yy90cmlsbF9tYy9tcGxzL2NvdXBfbXBscworIyBWYWx1ZSBPcHRpb25zOiAoMCkgLSBFeHRlcm5hbCB0YWJsZSBkaXNhYmxlZCwgPjA6IG51bWJlciBvZiBlbnRyaWVzLiBEZWZhdWx0OiAwLgorI2V4dF9pcDRfdWNfcnBmX2Z3ZF90YWJsZV9zaXplPTgxOTIKKyNleHRfaXA0X21jX2Z3ZF90YWJsZV9zaXplPTgxOTIKKworIyMgU2V0IEVMSyBJUCBGV0QgdXNlIE5ldFJvdXRlICBBTEcuCisjIFZhbHVlIE9wdGlvbnM6IEFMR19MUE1fTFBNL0FMR19MUE1fTkVUUk9VVEUvQUxHX0xQTV9UQ0FNLiBEZWZhdWx0OiBBTEdfTFBNX1RDQU0uCisjZXh0X2Z3ZF9hbGdvcml0aG1fbHBtPUFMR19MUE1fVENBTQorCisjIyBTZXQgRUxLIGludGVyZmFjZSBtb2RlLgorIyBDaGFuZ2UgRUxLIGludGVyZmFjZSBjb25maWd1cmF0aW9uIHRvIHN1cHBvcnQgQ0FVSSBwb3J0LgorIyBWYWx1ZSBPcHRpb25zOiAwLzEuIDAgLSBOb3JtYWwgbW9kZSwgMSAgMiBDQVVJIHBvcnQgKyBFTEsgbW9kZS4gRGVmYXVsdDogMC4KKyNleHRfaW50ZXJmYWNlX21vZGU9MAorCisjIyMgQ29uZmlndXJlIE1ESU8gaW50ZXJmYWNlCisjIEV4dGVybmFsIE1ESU8gY2xvY2sgcmF0ZSBkaXZpc29yIC4gRGVmYXVsdDogMHgyNC4KKyNyYXRlX2V4dF9tZGlvX2Rpdmlzb3I9MHgzNgorIyBFeHRlcm5hbCBNRElPIGNsb2NrIHJhdGUgZGl2aXNvci4gRGVmYXVsdDogMHgxLgorI3JhdGVfZXh0X21kaW9fZGl2aWRlbmQ9MQorCisjIyMgVERNIC0gT1ROIGNvbmZpZ3VyYXRpb24gIyMjCisjZmFwX3RkbV9ieXBhc3MuQkNNODg2NTA9MAorCisjIEluZGljYXRlIGlmIGEgUGV0cmEtQiBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHRoZSBhY3R1YWwgZGV2aWNlCisjIEZvciBURE0vT1ROIGFwcGxpY2F0aW9ucywKKyMgc3lzdGVtX2lzX3BldHJhX2JfaW5fc3lzdGVtLkJDTTg4NjUwPTAKKyMjSW5kaWNhdGUgaWYgVERNIGNhbiBhcnJpdmUgdGhyb2doIHByaW1hcnkgcGlwZS4KKyNTaG91bGQgYmUgMSBmb3IgYSBTeXN0ZW0gd2l0aCBQZXRyYUIgdGhhdCBjb25uZWN0ZWQgdG8gZmFicmljIG92ZXIgcHJpbWFyeSBwaXBlLgorZmFicmljX3RkbV9vdmVyX3ByaW1hcnlfcGlwZS5CQ004ODY1MD0wCisKKyMjIyBGYWJyaWMgY29uZmlndXJhdGlvbiAjIyMKKyMwLUxGRUMgMS04YlwxMGIgMi1GRUMgMy1CRUMKK2JhY2twbGFuZV9zZXJkZXNfZW5jb2RpbmcuQkNNODg2NTA9MgorI1NGSSBzcGVlZCByYXRlCitwb3J0X2luaXRfc3BlZWRfc2ZpLkJDTTg4NjUwPTEwMzEyCisjQ0w3MgorI3BvcnRfaW5pdF9jbDcyX3NmaT0wCitmYWJyaWNfc2VnbWVudGF0aW9uX2VuYWJsZS5CQ004ODY1MD0xCisKKyMjIEZhYnJpYyB0cmFuc21pc3Npb24gbW9kZQorIyBTZXQgdGhlIENvbm5lY3QgbW9kZSB0byB0aGUgRmFicmljCisjIE9wdGlvbnM6IEZFIC0gcHJlc2VuY2Ugb2YgYSBGYWJyaWMgZGV2aWNlIChzaW5nbGUgc3RhZ2UpIC8gTVVMVF9TVEFHRV9GRSAtICBNdWx0aS1zdGFnZSAvCisjIFNJTkdMRV9GQVAgLSBzdGFuZC1hbG9uZSBkZXZpY2UgLyBNRVNIIC0gbWVzaCAvIEJBQ0syQkFDSyAtIDIgZGV2aWNlcyBpbiBNZXNoCitmYWJyaWNfY29ubmVjdF9tb2RlLkJDTTg4NjUwPVNJTkdMRV9GQVAKKyNmYWJyaWNfY29ubmVjdF9tb2RlLkJDTTg4NjUwPUZFCisKKyMjIENlbGwgZm9ybWF0IGNvbmZpZ3VyYXRpb24KKyMgSW5kaWNhdGUgaWYgdGhlIHRyYWZmaWMgY2FuIGJlIHNlbnQgaW4gZHVhbCBwaXBlCitpc19kdWFsX21vZGUuQkNNODg2NTA9MAorIyBJbmRpY2F0ZSB0aGUgZm9ybWF0IG9mIHRoZSBjZWxsOgorIyBBIFZDUzEyOCBjZWxsIGlzIHVzZWQgaWYgc3lzdGVtX2lzX3Zjc18xMjhfaW5fc3lzdGVtIG9yIHN5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0gaXMgVFJVRQorc3lzdGVtX2lzX3Zjc18xMjhfaW5fc3lzdGVtLkJDTTg4NjUwPTAKK3N5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0uQkNNODg2NTA9MAorCisjIyMgV1JFRCAjIyMKKworIyBTZXQgdGhlIG1heGltdW0gcGFja2V0IHNpemUgZm9yIFdSRUQgdGVzdHMuIDAgLSBtZWFucyBpZ25vcmUgbWF4IHBhY2tldCBzaXplLgorZGlzY2FyZF9tdHVfc2l6ZS5CQ004ODY1MD0wCisKKyMjIyBPQ0IgKE9uLUNoaXAgQnVmZmVyKSBjb25maWd1cmF0aW9uICMjIworIyBFbmFibGUgdGhlIE9DQgorIyBFbmFibGUgTU9ERVM6CisjICAgMC9GQUxTRSAgICAgICAgLS0+ICBPQ0JfRElTQUJMRUQgICAgIC0tPiBObyBPQ0IgdXNlCisjICAgMS9UUlVFICAgICAgICAgLS0+ICBPQ0JfRU5BQkxFRCAgICAgIC0tPiBMaWtlIGluIEFyYWQtQTAvQjAuIFNvbWUgcGFja2V0cyBtYXkgdXNlIGJvdGggRFJBTSBhbmQgT0NCIHJlc291cmNlcworIyAgIE9ORV9XQVlfQllQQVNTIC0tPiAgRGVwZW5kcyBvbiBudW1iZXIgb2YgcHJlc2VudCBkcmFtcyAoYXZhaWxhYmxlIG9ubHkgZm9yIEFyYWRQbHVzKToKKyMgICAgICAgICAgICAgICAgICAgICAgMCBkcmFtczogICAtIE9DQl9PTkxZCisjICAgICAgICAgICAgICAgICAgICAgIDEgZHJhbXM6ICAgLSBPQ0JfT05MWV8xX0RSQU0gICAgIC0tPiAgOiBPQ0Itb25seSB3aXRoIDEgRFJBTSBmb3IgdGhlIGZyZWUgcG9pbnRlcnMKKyMgICAgICAgICAgICAgICAgICAgICAgMi04IGRyYW1zOiAtIE9DQl9EUkFNX1NFUEFSQVRFICAgLS0+ICA6IE9DQiBhbmQgRFJBTSBjb2V4aXN0IHNlcGFyYXRlbHkKKyMgICBEZWZhdWx0OiBUUlVFLgorYmNtODg2eHhfb2NiX2VuYWJsZS5CQ004ODY1MD0xCisKKyMgT0NCIERhdGEgQnVmZmVyIHNpemUuIFBvc3NpYmxlIHZhbHVlczogMTI4LzI1Ni81MTIvMTAyNC4gRGVmYXVsdDogMjU2LgorYmNtODg2eHhfb2NiX2RhdGFidWZmZXJfc2l6ZS5CQ004ODY1MD0yNTYKKyMgUmVwYXJ0aXRpb24gYmV0d2VlbiBVbmljYXN0IGFuZCBGdWxsIE11bHRpY2FzdCBidWZmZXJzLgorIyAwOiA4MCUgVW5pY2FzdCBhbmQgMjAlIE11bHRpY2FzdCwgMTogVW5pY2FzdC1Pbmx5CitiY204ODZ4eF9vY2JfcmVwYXJ0aXRpb24uQkNNODg2NTA9MAorCisjIyMgUERNIGNvbmZpZ3VyYXRpb24gIyMjCisjIFNldCB0aGUgUERNIE1vZGUuCisjIDA6IHNpbXBsZSAoZGVmYXVsdCksIDE6IHJlZHVjZWQgKG1hbmRhdG9yeSBmb3IgTExGQy1WU1EsIFBGQy1WU1EsIG9yIFNULVZTUSkKK2JjbTg4Nnh4X3BkbV9tb2RlLkJDTTg4NjUwPTAKKworIyMjIE11bHRpY2FzdCBOdW1iZXIgb2YgREJ1ZmYgbW9kZSAjIyMKKyMgU2V0IElRTSBGTUMgYnVmZmVycy1yZXBsaWNhdGlvbiBzaXplcworIyBPcHRpb25zIGZvciA4ODY1MDogQVJBRF9JTklUX0ZNQ180S19SRVBfNjRLX0RCVUZGX01PREUvQVJBRF9JTklUX0ZNQ182NF9SRVBfMTI4S19EQlVGRl9NT0RFCisjIERlZmF1bHQ6IEFSQURfSU5JVF9GTUNfNEtfUkVQXzY0S19EQlVGRl9NT0RFCittdWx0aWNhc3RfbmJyX2Z1bGxfZGJ1ZmYuQkNNODg2NTA9QVJBRF9JTklUX0ZNQ180S19SRVBfNjRLX0RCVUZGX01PREUKKworIyMjIE11bHRpY2FzdCBjb25maWd1cmF0aW9uICMjIworIyBNdWx0aWNhc3QgZWdyZXNzIHZsYW4gbWVtYmVyc2hpcCByYW5nZS4gQnkgZGVmYXVsdDogMC00MDk1LgorZWdyZXNzX211bHRpY2FzdF9kaXJlY3RfYml0bWFwX21pbi5CQ004ODY1MD0wCitlZ3Jlc3NfbXVsdGljYXN0X2RpcmVjdF9iaXRtYXBfbWF4LkJDTTg4NjUwPTQwOTUKKworIyMjIFZPUSAtIEZsb3cgY29uZmlndXJhdGlvbiAjIyMKKworIyBTZXQgdGhlIFZPUSBtYXBwaW5nIG1vZGU6CisjIERJUkVDVDogTW9yZSB0aGFuIDRLIFN5c3RlbSBQb3J0cyBhcmUgc3VwcG9ydGVkLiBTeXN0ZW0tbGV2ZWwgV1JFRCBpcyBub3Qgc3VwcG9ydGVkLgorIyBJTkRJUkVDVDogc2ltaWxhciB0byBQZXRyYS1CLiBVcCB0byA0SyBTeXN0ZW0gUG9ydHMuCit2b3FfbWFwcGluZ19tb2RlLkJDTTg4NjUwPUlORElSRUNUCisKKyMgU2V0IHRoZSBCYXNlIFF1ZXVlIHRvIGJlIGFkZGVkIHRvIHRoZSBwYWNrZXQgZmxvdy1pZAorIyB3aGVuIHRoZSBGbG93LUlkIGlzIHNldCBleHBsaWNpdGVseSBlaXRoZXIgYnkgdGhlIElUTUgKKyMgb3IgYnkgdGhlIERlc3RpbmF0aW9uIHJlc29sdXRpb24gaW4gdGhlIFBhY2tldCBwcm9jZXNzaW5nCitmbG93X21hcHBpbmdfcXVldWVfYmFzZS5CQ004ODY1MD0wCisKKyMgU2V0IHRoZSBudW1iZXIgb2YgcHJpb3JpdGllcyBzdXBwb3J0ZWQgYXQgZWdyZXNzIHBlciBQb3J0CisjIE9wdGlvbnM6IDEgLyAyIC8gOAorcG9ydF9wcmlvcml0aWVzLkJDTTg4NjUwPTgKKworIyBTZXQgdGhlIHNoYXJlZCBtdWx0aWNhc3QgcmVzb3VyY2UgbW9kZTogU3RyaWN0IC8gRGlzY3JldGUKK2VncmVzc19zaGFyZWRfcmVzb3VyY2VzX21vZGUuQkNNODg2NTA9U3RyaWN0CisKKyMgRGVmaW5lIG91dGdvaW5nIHBvcnQgcmF0ZSBtb2RlIGluIGRhdGEgcmF0ZSBvciBwYWNrZXQgcmF0ZS4KKyMgT3B0aW9uczogREFUQSAvIFBBQ0tFVAorb3RtX3BvcnRfcGFja2V0X3JhdGUuQkNNODg2NTA9REFUQQorCisjIFNldCBQb3J0IGVncmVzcyByZWN5Y2xpbmcgc2NoZWR1bGVyIGNvbmZpZ3VyYXRpb24uCisjIDA6IFN0cmljdCBQcmlvcml0eSBTY2hlZHVsZXIsIDE6IFJvdW5kIFJvYmluIFNjaGVkdWxlcgorcG9ydF9lZ3Jlc3NfcmVjeWNsaW5nX3NjaGVkdWxlcl9jb25maWd1cmF0aW9uLkJDTTg4NjUwPTAKKworIyBTZXQgc3RhdGljYWxseSB0aGUgcmVnaW9uIG1vZGUgcGVyIHJlZ2lvbiBpZAorIyAwOiBxdWV1ZSBjb25uZWN0b3JzIG9ubHkgKEludGVyRGlnaXRhdGVkID0gRkFMU0UsIE9kZEV2ZW4gPSBUUlVFKQorIyAxOiBxdWV1ZSBjb25uZWN0b3JzLCBTRSAoSW50ZXJEaWdpdGF0ZWQgPVRSVUUsIE9kZEV2ZW4gPSBUUlVFKQorIyAyOiBxdWV1ZSBjb25uZWN0b3JzLCBTRSAoSW50ZXJEaWdpdGF0ZWQgPVRSVUUsIE9kZEV2ZW4gPSBGQUxTRSkKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNjUuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl82Ni5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzY3LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNjguQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl82OS5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzcwLkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzEuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83Mi5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzczLkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzQuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83NS5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzc2LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzcuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83OC5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzc5LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODAuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84MS5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzgyLkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODMuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84NC5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzg1LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODYuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84Ny5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzg4LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODkuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85MC5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzkxLkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTIuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85My5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzk0LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTUuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85Ni5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzk3LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTguQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85OS5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEwMC5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEwMS5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEwMi5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEwMy5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEwNC5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEwNS5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEwNi5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEwNy5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEwOC5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEwOS5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzExMC5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzExMS5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzExMi5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzExMy5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzExNC5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzExNS5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzExNi5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzExNy5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzExOC5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzExOS5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEyMC5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEyMS5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEyMi5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEyMy5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEyNC5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEyNS5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEyNi5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEyNy5CQ004ODY1MD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzEyOC5CQ004ODY1MD0yCisKKyNJTCMgQ29uZmlndXJlIG51bWJlciBvZiBzeW1tZXRyaWMgY29yZXMgZWFjaCByZWdpb24gc3VwcG9ydHMgIyMKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEuQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQuQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl82LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzcuQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fOC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl85LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzExLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzYwLkJDTTg4NjUwPTIKKworZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fY29yZTBfMi5CQ004ODY1MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl9jb3JlMF8zLkJDTTg4NjUwPTEKKworIyMjIEZsb3cgQ29udHJvbCBjb25maWd1cmF0aW9uICMjIworIyBTZXQgdGhlIEZsb3cgY29udHJvbCB0eXBlIHBlciBQb3J0LgorIyBPcHRpb25zOiBMTCAoTGluay1sZXZlbCkgLyBDQjIgKENsYXNzLUJhc2VkIC0gMiBjbGFzc2VzKSAvCisjIENCOCAoQ2xhc3MtQmFzZWQgLSA4IGNsYXNzZXMpCisjIGZsb3dfY29udHJvbF90eXBlLkJDTTg4NjUwPUxMCisKKyMjIE91dC1PZi1CYW5kIEZsb3cgY29udHJvbCBjb25maWd1cmF0aW9uCisjc3BuX0ZDX09PQl9UWVBFLCBzcG5fRkNfT09CX01PREUsIHNwbl9GQ19PT0JfQ0FMRU5ERVJfTEVOR1RILCBzcG5fRkNfT09CX0NBTEVOREVSX1JFUF9DT1VOVCwKKworIyMgU2V0IHZvbHRhZ2UgbW9kZSBmb3Igb29iIGludGVyZmFjZXMKKyNIU1RMXzEuNVYKKyMzLjNWCisjSFNUTF8xLjVWX1ZERE9fRElWXzIKK2V4dF92b2x0YWdlX21vZGVfb29iPTMuM1YKKworIyMgSW5iYW5kIEludGVybGFrZW4gY29uZmlndXJhdGlvbgorIyBzcG5fRkNfSU5CQU5EX0lOVExLTl9NT0RFLCBzcG5fRkNfSU5CQU5EX0lOVExLTl9DQUxFTkRFUl9MRU5HVEgsIHNwbl9GQ19JTkJBTkRfSU5UTEtOX0NBTEVOREVSX1JFUF9DT1VOVAorIyBzcG5fRkNfSU5CQU5EX0lOVExLTl9DQUxFTkRFUl9MTEZDX01PREUsIHNwbl9GQ19JTkJBTkRfSU5UTEtOX0xMRkNfTVVCX0VOQUJMRV9NQVNLCisKKyMjIyBNZXRlciBlbmdpbmUgY29uZmlndXJhdGlvbiAjIyMKKworIyBTcGVjaWZ5IG1ldGVyIG9wZXJhdGlvbiBtb2RlCisjIDMyIC0gVHdvIG1ldGVycyBwZXIgcGFja2V0ICgzMmsgdG90YWwpCisjIDY0IC0gT25lIG1ldGVyIHBlciBwYWNrZXQgKDY0ayB0b3RhbCkKKyMgT3B0aW9uczogMCwgMzIsIDY0Citwb2xpY2VyX2luZ3Jlc3NfY291bnQuQkNNODg2NTA9MzIKKworIyBGb3IgbWV0ZXJzIGluIGRvdWJsZSAzMmsgbW9kZSwgZGV0ZXJtaW5lIHRoZSBzaGFyaW5nIG1vZGUKKyMgT3B0aW9uczoKKyMgMCAtIE5PTkUgKG9ubHkgZm9yIDY0ayBtb2RlKQorIyAxIC0gU0VSSUFMIChvbmx5IGZvciAzMmsgbW9kZSkKKyMgMiAtIFBBUkFMTEVMIChvbmx5IGZvciAzMmsgbW9kZSkKK3BvbGljZXJfaW5ncmVzc19zaGFyaW5nX21vZGUuQkNNODg2NTA9MQorCisjIEFwcGxpZXMgb25seSB0byBBcmFkKyAoODg2NjApCisjIEZvciBtZXRlcnMgaW4gcGFyYWxsZWwgbW9kZSwgZGV0ZXJtaW5lIHRoZSBtYXBwaW5nCisjIE9wdGlvbnM6IEJFU1QsIFdPUlNUCisjIHBvbGljZXJfcmVzdWx0X3BhcmFsbGVsX2NvbG9yX21hcC5CQ004ODY1MD1XT1JTVAorCisjIEFwcGxpZXMgb25seSB0byBBcmFkKyAoODg2NjApCisjIEZvciBtZXRlcnMgaW4gcGFyYWxsZWwgbW9kZSwgZGV0ZXJtaW5lIGhvdyB0aGUgYnVja2V0cyBhcmUgY2hhbmdlZAorIyBPcHRpb25zOiBDT05TVEFOVCwgVFJBTlNQQVJFTlQsIERFRkVSUkVECisjIHBvbGljZXJfcmVzdWx0X3BhcmFsbGVsX2J1Y2tldF91cGRhdGUuQkNNODg2NTA9Q09OU1RBTlQKKworIyBBcHBsaWVzIG9ubHkgdG8gQXJhZCsgKDg4NjYwKQorIyBTZXQgdGhlIEV0aGVybmV0IHBvbGljZXIgdG8gd29yayBpbiBjb2xvciBibGluZCBtb2RlCisjIHJhdGVfY29sb3JfYmxpbmQuQkNNODg2NTA9MQorCisjIEwyIGxlYXJuIGxpbWl0IG1vZGUKKyMgT3B0aW9uczogVkxBTiwgVkxBTl9QT1JULCBUVU5ORUwgb3IgdGhlIG51bWVyaWMgZXF1aXZhbGVudCAwLTIuCisjIERlZmF1bHQ6IFZMQU4KKyMgbDJfbGVhcm5fbGltaXRfbW9kZSA9IFZMQU5fUE9SVAorCisjIEFwcGxpZXMgb25seSB0byBBcmFkKyAoODg2NjApCisjIERldGVybWluZXMgdGhlIEwyIGxlYXJuIGxpbWl0IHJhbmdlcyB3aGVuIGwyX2xlYXJuX2xpbWl0X21vZGUgaXMgc2V0IHRvIFZMQU5fUE9SVAorIyBUd28gcmFuZ2UgYmFzZXMgY2FuIGJlIHNlbGVjdGVkLCBlYWNoIG9mIDE2SyBzaXplLgorIyBPcHRpb25zOiAwLCAxNkssIDMySywgNDhLLgorIyBEZWZhdWx0OiAwICYgMTZLCisjIGwyX2xlYXJuX2xpZl9yYW5nZV9iYXNlXzAgPSAwCisjIGwyX2xlYXJuX2xpZl9yYW5nZV9iYXNlXzEgPSAxNksKKworIyMjIENvdW50ZXIgZW5naW5lIGNvbmZpZ3VyYXRpb24gIyMjCisKKyMgU2V0IHRoZSBDb3VudGVyIHNvdXJjZQorIyBPcHRpb25zOiBJTkdSRVNTX0ZJRUxEIC8gSU5HUkVTU19WT1EgLyBJTkdSRVNTX1ZTUQorIyBJTkdSRVNTX0NOTSAvIEVHUkVTU19GSUVMRCAvIEVHUkVTU19WU0kgLyBFR1JFU1NfT1VUX0xJRiAvIEVHUkVTU19UTSAocGVyIHF1ZXVlKSAvIEVHUkVTU19UTV9QT1JUIChwZXIgcG9ydCkKKyMgRUdSRVNTX1JFQ0VJVkVfVlNJIC8gRUdSRVNTX1JFQ0VJVkVfT1VUX0xJRiAvIEVHUkVTU19SRUNFSVZFX1RNIChwZXIgcXVldWUpIC8gRUdSRVNTX1JFQ0VJVkVfVE1fUE9SVCAocGVyIHBvcnQpCisjIElOR1JFU1NfT0FNIC8gRUdSRVNTX09BTQorIyAyIENvdW50ZXItUG9pbnRlcnMgY2FuIGJlIHNldCAod2l0aCBfMCBhbmQgXzEpIGZvcgorIyBJTkdSRVNTX0ZJRUxEIC8gRUdSRVNTX1ZTSSAvIEVHUkVTU19PVVRfTElGIC8gRUdSRVNTX1RNIC8gRUdSRVNTX1RNX1BPUlQKKyMgUmFuZ2UgZXh0ZW5zaW9uIGNhbiBiZSBzZXQgKHdpdGggX0xTQiBhbmQgX01TQikgZm9yCisjIElOR1JFU1NfRklFTEQgLyBFR1JFU1NfVlNJIC8gRUdSRVNTX09VVF9MSUYgLyBFR1JFU1NfVE0gLyBFR1JFU1NfVE1fUE9SVCAvRUdSRVNTX1JFQ0VJVkVfVlNJIC8KKyMgRUdSRVNTX1JFQ0VJVkVfT1VUX0xJRiAvIEVHUkVTU19SRUNFSVZFX1RNIC8gRUdSRVNTX1JFQ0VJVkVfVE1fUE9SVAorY291bnRlcl9lbmdpbmVfc291cmNlXzAuQkNNODg2NTA9SU5HUkVTU19GSUVMRAorY291bnRlcl9lbmdpbmVfc291cmNlXzEuQkNNODg2NTA9SU5HUkVTU19GSUVMRF8xCitjb3VudGVyX2VuZ2luZV9zb3VyY2VfMi5CQ004ODY1MD1JTkdSRVNTX1ZPUQorIyMjCisjIyMgIERNTAorIyMjCisjIyMgIEZvciBETUwgYXBwbGljYXRpb25zLCBjb3VudGVyIGVuZ2luZSAzIGlzIHVzZWQgZm9yIFZPUQorIyMjICBjb3VudGVycy4gVGhpcyBpbiBjb21iaW5hdGlvbiB3aXRoIGNvbmZpZ3VyaW5nIHRoZSBlbmdpbmVzIHVzZWQgZm9yCisjIyMgIFZPUXMgZm9yIEZXRF9EUk9QIGFsbG93cyBmb3IgY291bnRlcnMgZm9yIDMySyBWT1FzLgorIyMjCisjY291bnRlcl9lbmdpbmVfc291cmNlXzMuQkNNODg2NTA9RUdSRVNTX0ZJRUxECitjb3VudGVyX2VuZ2luZV9zb3VyY2VfMy5CQ004ODY1MD1JTkdSRVNTX1ZPUQorCisjIENvbmZpZ3VyZSB0aGUgc3RhdGlzdGljIGludGVyZmFjZSBlZ3Jlc3Mgc291cmNlCisjIE9wdGlvbnM6IEVHUkVTU19WU0kgLyBFR1JFU1NfT1VUX0xJRiAvIEVHUkVTU19UTSAvIEVHUkVTU19UTV9QT1JUICh0aGUgZGVmYXVsdCBpcyBUTSkKKyMgdmFsaWQganVzdCB3aGVuIHRoZXJlIGlzIG5vIGNvbmZsaWN0IHdpdGggdGhlIG90aGVyIGNvdW50ZXIgZW5naW5lcworI2NvdW50ZXJfZW5naW5lX3NvdXJjZV9zdGF0MC5CQ004ODY1MD1FR1JFU1NfVE0KKyNjb3VudGVyX2VuZ2luZV9zb3VyY2Vfc3RhdDEuQkNNODg2NTA9RUdSRVNTX1RNCisKKworIyBTZXQgdGhlIENvdW50ZXIgZW5naW5lIHJlc29sdXRpb24KKyMgU0lNUExFX0NPTE9SID0gZ3JlZW4sIG5vdCBncmVlbgorIyBTSU1QTEVfQ09MT1JfRldEID0gZndkIGdyZWVuLCBmd2Qgbm90IGdyZWVuIChCQ004ODY2MF9BMCBvbmx5KQorIyBTSU1QTEVfQ09MT1JfRFJPUCA9IGRyb3AgZ3JlZW4sIGRyb3Agbm90IGdyZWVuIChCQ004ODY2MF9BMCBvbmx5KQorIyBGV0RfRFJPUCA9IGZvcndhcmRlZCwgZHJvcHBlZAorIyBHUkVFTl9OT1RfR1JFRU4gPSBmd2QgZ3JuLCBkcm9wIGdybiwgZndkIG5vdCBncm4sIGRyb3Agbm90IGdybgorIyBGVUxMX0NPTE9SID0gZndkIGdybiwgZHJvcCBncm4sIGZ3ZCBub3QgZ3JuLCBkcm9wIHllbCwgZHJvcCByZWQKKyMgQUxMID0gcmVjZWl2ZWQKKyMgRldEID0gZm9yd2FyZGVkLCBEUk9QID0gZHJvcGVkIChub3Qgc3VwcG9ydGVkIGJ5IEFSQURfQTApCisjIENPTkZJR1VSQUJMRSA9IGRlZmluZWQgYnkgY291bnRlcl9lbmdpbmVfbWFwXyBTT0MgcHJvcGVydGllcyAoQkNNODg2NjBfQTAgb25seSkKK2NvdW50ZXJfZW5naW5lX3N0YXRpc3RpY3NfMC5CQ004ODY1MD1GVUxMX0NPTE9SCitjb3VudGVyX2VuZ2luZV9zdGF0aXN0aWNzXzEuQkNNODg2NTA9RlVMTF9DT0xPUgorIyMjCisjIyMgIERNTAorIyMjCisjIyMgIEZvciBETUwgYXBwbGljYXRpb25zLCBjb3VudGVyIGVuZ2luZSAzIGlzIHVzZWQgZm9yIFZPUQorIyMjICBjb3VudGVycy4gVGhpcyBpbiBjb21iaW5hdGlvbiB3aXRoIGNvbmZpZ3VyaW5nIHRoZSBlbmdpbmVzIHVzZWQgZm9yCisjIyMgIFZPUXMgZm9yIEZXRF9EUk9QIGFsbG93cyBmb3IgY291bnRlcnMgZm9yIDMySyBWT1FzLgorIyMjCisjY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18yLkJDTTg4NjUwPUZVTExfQ09MT1IKKyNjb3VudGVyX2VuZ2luZV9zdGF0aXN0aWNzXzMuQkNNODg2NTA9RlVMTF9DT0xPUgorY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18yLkJDTTg4NjUwPUZXRF9EUk9QCitjb3VudGVyX2VuZ2luZV9zdGF0aXN0aWNzXzMuQkNNODg2NTA9RldEX0RST1AKKworIyBTZXQgdGhlIENvdW50ZXIgZm9ybWF0CisjIE9wdGlvbnM6IFBBQ0tFVFNfQU5EX0JZVEVTIC8gUEFDS0VUUyAvIEJZVEVTCisjIC8gTUFYX1FVRVVFX1NJWkUgLyBQQUNLRVRTX0FORF9QQUNLRVRTKHN1cHBvcnRlZCBqdXN0IGluIEZXRF9EUk9QIHN0YXRpc3RpYyBpbiBCQ004ODY2MF9BMCkKKyMgSWYgbm90IFBBQ0tFVFNfQU5EX0JZVEVTIG9yIFBBQ0tFVFNfQU5EX1BBQ0tFVFMsIHRoZSBIVyBDb3VudGVyIHdpZHRoIGlzIDU5IGJpdHMsIHRodXMKKyMgbm8gYmFja2dyb3VuZCBTVyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkCitjb3VudGVyX2VuZ2luZV9mb3JtYXRfMC5CQ004ODY1MD1QQUNLRVRTX0FORF9CWVRFUworY291bnRlcl9lbmdpbmVfZm9ybWF0XzEuQkNNODg2NTA9UEFDS0VUU19BTkRfQllURVMKK2NvdW50ZXJfZW5naW5lX2Zvcm1hdF8yLkJDTTg4NjUwPVBBQ0tFVFNfQU5EX0JZVEVTCitjb3VudGVyX2VuZ2luZV9mb3JtYXRfMy5CQ004ODY1MD1QQUNLRVRTX0FORF9CWVRFUworCisjICNlbmFibGUvZGlzYWJsZSBjb3VudGVyIHByb2Nlc3NvciBiYWNrZ3JvdW5kIHRocmVhZCAoZGVmYXVsdDoxLWVuYWJsZSkKKyMgY291bnRlcl9lbmdpbmVfc2FtcGxpbmdfaW50ZXJ2YWw9MQorCisjIyMgQ29uZmlndXJhYmxlIG1vZGUgY29uZmlndXJhdGlvbiAoQkNNODg2NjBfQTAgb25seSkjIyMKKyMgY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18wLkJDTTg4NjYwX0EwPUNPTkZJR1VSQUJMRQorIyBjb3VudGVyX2VuZ2luZV9tYXBfZW5hYmxlXzAuQkNNODg2NjBfQTA9MQorIyBjb3VudGVyX2VuZ2luZV9tYXBfc2l6ZV8wLkJDTTg4NjYwX0EwPTQKKyMgY291bnRlcl9lbmdpbmVfbWFwX2Z3ZF9ncmVlbl9vZmZzZXRfMC5CQ004ODY2MF9BMD0wCisjIGNvdW50ZXJfZW5naW5lX21hcF9md2RfeWVsbG93X29mZnNldF8wLkJDTTg4NjYwX0EwPTEKKyMgY291bnRlcl9lbmdpbmVfbWFwX2Z3ZF9yZWRfb2Zmc2V0XzAuQkNNODg2NjBfQTA9MQorIyBjb3VudGVyX2VuZ2luZV9tYXBfZndkX2JsYWNrX29mZnNldF8wLkJDTTg4NjYwX0EwPTIKKyMgY291bnRlcl9lbmdpbmVfbWFwX2Ryb3BfZ3JlZW5fb2Zmc2V0XzAuQkNNODg2NjBfQTA9MworIyBjb3VudGVyX2VuZ2luZV9tYXBfZHJvcF95ZWxsb3dfb2Zmc2V0XzAuQkNNODg2NjBfQTA9MworIyBjb3VudGVyX2VuZ2luZV9tYXBfZHJvcF9yZWRfb2Zmc2V0XzAuQkNNODg2NjBfQTA9MworIyBjb3VudGVyX2VuZ2luZV9tYXBfZHJvcF9ibGFja19vZmZzZXRfMC5CQ004ODY2MF9BMD0zCisKKyMjIyBTdGF0aXN0aWMtUmVwb3J0IGNvbmZpZ3VyYXRpb24gIyMjCisjIEVuYWJsZSB0aGUgU3RhdGlzdGljLUludGVyZmFjZSBjb25maWd1cmF0aW9uCisjIHN0YXRfaWZfZW5hYmxlXzxwb3J0PiAtIG5vdCBzdXBwb3J0ZWQgYnkgQVJBRF9BMAorIyBzdGF0X2lmX2VuYWJsZS5CQ004ODY1MD0xCisKKyMgIyMgU3RhdGlzdGljLVJlcG9ydCBQcm9wZXJ0aWVzCisjICMgU2V0IHRoZSBTdGF0aXN0aWMtUmVwb3J0IG1vZGUKKyMgIyBPcHRpb25zOiBCSUxMSU5HIC8gQklMTElOR19RVUVVRV9OVU1CRVIgKG5vdCBzdXBwb3J0ZWQgYnkgQVJBRF9BMCkvIFFTSVpFCisjIHN0YXRfaWZfcmVwb3J0X21vZGUuQkNNODg2NTA9UVNJWkUKKyMgI0luZGljYXRlIGlmIGlkbGUgcmVwb3J0cyBtdXN0IGJlIHNlbnQKKyMgI3doZW4gdGhlIFN0YXRpc3RpYy1yZXBvcnQgcmF0ZSBpcyB0b28gbG93CisjIHN0YXRfaWZfaWRsZV9yZXBvcnRzX3ByZXNlbnQuQkNNODg2NTA9MAorIyAjIEluZGljYXRlIGlmIHRoZSByZXBvcnRlZCBwYWNrZXQgc2l6ZSBpcyB0aGUgb3JpZ2luYWwgcGFja2V0IHNpemUKKyMgc3RhdF9pZl9yZXBvcnRfb3JpZ2luYWxfcGt0X3NpemUuQkNNODg2NTA9MQorIyAjSWYgc2V0IHRoZW4gYSBzaW5nbGUgaW5ncmVzcy1iaWxsaW5nIHJlcG9ydCB3aWxsIGJlIGdlbmVyYXRlZAorIyAjZm9yIHRoZSB3aG9sZSBzZXQgb2YgdGhlIG11bHRpY2FzdCBjb3BpZXMKKyMgc3RhdF9pZl9yZXBvcnRfbXVsdGljYXN0X3NpbmdsZV9jb3B5PTEKKyMgIyMgU3RhdGlzdGljIFBhY2tldCBjb25maWd1cmF0aW9ucworIyAjIFNldCB0aGUgU3RhdGlzdGljIFBhY2tldCBzaXplIChCeXRlcykKKyMgIyBWYWxpZCB2YWx1ZWQ6IDY1Qi8xMjZCLzI0OEIvNDkyQiAoUXVldWUtU2l6ZSksIDY0Qi8xMjhCLzI1NkIvNTEyQi8xMDI0QiAoQmlsbGluZykKKyMgc3RhdF9pZl9wa3Rfc2l6ZT02NEIKKyMKKyMgIyMgU2NydWJiZXIgY29uZmlndXJhdGlvbgorIyAjIFNldCB0aGUgcmFuZ2Ugb2YgVk9RcyB0byBzY3J1Yi4gUmFuZ2U6IDAgLSA5NkstMS4KKyMgc3RhdF9pZl9zY3J1YmJlcl9xdWV1ZV9taW4uQkNNODg2NTA9MAorIyBzdGF0X2lmX3NjcnViYmVyX3F1ZXVlX21heC5CQ004ODY1MD0wCisjCisjICMgU2V0IHRoZSBzY3J1YmJlciByYXRlIHJhbmdlCisjICMgSWYgc2V0IHRvIDAgKGRlZmF1bHQpLCB0aGUgc2NydWJiZXIgaXMgZGlzYWJsZWQuIFVuaXRzOiBuYW5vc2Vjb25kcworIyBzdGF0X2lmX3NjcnViYmVyX3JhdGVfbWluLkJDTTg4NjUwPTAKKyMgc3RhdF9pZl9zY3J1YmJlcl9yYXRlX21heC5CQ004ODY1MD0wCisjCisjICMgU2V0IHRoZSB0aHJlc2hvbGRzICh0aHJlc2hfaWQgMCAtIDE1KSBkZWZpbmluZworIyAjIG9jY3VwYW5jeSByYW5nZSBwZXIgcmVzb3VyY2UgdHlwZToKKyMgIyBEUkFNIEJ1ZmZlcnMsIEJ1ZmZlciBkZXNjcmlwdG9ycywgQnVmZmVyIGRlc2NyaXB0b3JzIGJ1ZmZlcnMKKyMgc3RhdF9pZl9zY3J1YmJlcl9iZGJfdGguQkNNODg2NTA9MAorIyBzdGF0X2lmX3NjcnViYmVyX2J1ZmZlcl9kZXNjcl90aC5CQ004ODY1MD0wCisjIHN0YXRfaWZfdWNfZHJhbV9idWZmZXJfZGVzY3JfdGguQkNNODg2NTA9MAorIworIyAjUmVsZWN0aXZlIHJlcG9ydCBmb3IgcXVldWUgc2l6ZSBtb2RlIC0gbm90IHN1cHBvcnRlZCBieSBBUkFEX0EwCisjICNSZXBvcnRzIHdpbGwgYmUgY3JlYXRlZCBmb3IgcXVldWUgbnVtIHJhbmdlIChzdGF0X2lmX3NlbGVjdGl2ZV9yZXBvcnRfcXVldWVfbWluIC1zdGF0X2lmX3NlbGVjdGl2ZV9yZXBvcnRfcXVldWVfbWF4KQorIyAjRGVmYXVsdCAtIGFsbCByYW5nZQorIyBzdGF0X2lmX3NlbGVjdGl2ZV9yZXBvcnRfcXVldWVfbWluLkJDTTg4NjUwX0IwPTAKKyMgc3RhdF9pZl9zZWxlY3RpdmVfcmVwb3J0X3F1ZXVlX21heC5CQ004ODY1MF9CMD05ODMwMworCisjIyMgVHJhbnNhY3Rpb24gLSBETUEgY29uZmlndXJhdGlvbiAjIyMKKyMgVGltZSB0byB3YWl0IGZvciBTQ0hBTiBjaGFubmVsIHJlc3BvbnNlIChmcm9tIENNSUMpLiBVbml0czogbWljcm9zZWNvbmRzLgorCisjIFRPRE8KKyMjIyBDb3VudGVyIHRocmVhZHMgIyMjCisjIHNwbl9CQ01fU1RBVF9QQk1QLCBzcG5fQkNNX1NUQVRfSU5URVJWQUwsIHNwbl9CQ01fU1RBVF9GTEFHUworCisjIyMgSW50ZXJydXB0cyAjIyMKKyMjIFNldCBpbnRlcnJ1cHRzIGdsb2JhbCBwYXJhbWV0ZXJzLgorIyBPcHRpb25zOiAxIC0gUG9sbGluZyBpbnRlcnJ1cHQgbW9kZSwgMCAtIExpbmUvTVNJIGludGVycnVwdCBtb2RlLiBEZWZhdWx0OiAxLgorcG9sbGVkX2lycV9tb2RlLkJDTTg4NjUwPTAKKyMgIFNldCB0aGUgZGVsYXkgaW4gbWljcm9zZWNvbmQgYmV0d2VlbiB0aGUgcG9sbGluZywgcmVsZXZhbnQgb25seSB0byBQb2xsaW5nIG1vZGUuICBEZWZhdWx0OiAweDAuCitwb2xsZWRfaXJxX2RlbGF5LkJDTTg4NjUwPTUwMDAwCisKKyMjIENNSUMgaW50ZXJydXB0czoKKyMgRW5hYmxlOiBVc2UgaW50ZXJydXB0cyBjb21wbGV0aW9uIGluc3RlYWQgb2YgcG9sbGluZyBjb21wbGV0aW9uIGZvciB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMuCisjICAgICAgICAgT3B0aW9uczogMSAtIEVuYWJsZSwgMCAtIERpc2FibGUuIERlZmF1bHQ6IDAuCisjIFRpbWVvdXQ6IGRlbGF5IGluIE1pY3Jvc2Vjb25kIGJldHdlZW4gdGhlIHBvbGxpbmcsIHJlbGV2YW50IG9ubHkgdG8gUG9sbGluZyBjb21wbGV0aW9uIG1vZGUuCisjIFNDSEFOOgorI3NjaGFuX2ludHJfZW5hYmxlLjA9MQorc2NoYW5fdGltZW91dF91c2VjLkJDTTg4NjUwPTMwMDAwMAorIyBURE1BCit0ZG1hX2ludHJfZW5hYmxlLkJDTTg4NjUwPTEKK3RkbWFfdGltZW91dF91c2VjLkJDTTg4NjUwPTgwMDAwMDAwCisjIFRTTEFNCit0c2xhbV9pbnRyX2VuYWJsZS5CQ004ODY1MD0xCit0c2xhbV90aW1lb3V0X3VzZWMuQkNNODg2NTA9ODAwMDAwMDAKKyMgTUlJTQorI21paW1faW50cl9lbmFibGUuMD0xCittaWltX3RpbWVvdXRfdXNlYy4wPTMwMDAwMAorCisjIyMgRFJBTSBjb25maWd1cmF0aW9uICMjIworCisjIERSQU0gYnVmZmVyIChEYnVmZikgc2l6ZQorIyBBbGxvd2VkIHZhbHVlczogMjU2LzUxMi8xMDI0LzIwNDguCitleHRfcmFtX2RidWZmX3NpemUuQkNNODg2NTA9MTAyNAorCisjIE51bWJlciBvZiBleHRlcm5hbCBEUkFNcy4KKyMgQWxsb3dlZCB2YWx1ZXMgZm9yIDg4NjUwOiAwLzIvMy80LzYvOC4gQSB2YWx1ZSBvZiAwIGRpc2FibGVzIHRoZSBEUkFNLgorIyBBbGxvd2VkIHZhbHVlcyBmb3IgODg2NjA6IDAvMS8yLzMvNC82LzguIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyB0aGUgRFJBTS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHZhbHVlIG9mIDEgaXMgcGVybWl0dGVkIG9ubHkgaW4gT05FIFdBWSBCWVBBU1Mgb2NiIG1vZGUuCitleHRfcmFtX3ByZXNlbnQuQkNNODg2NTA9OAorCisjIyMgRHJhbSBUdW5pbmcgKFNobW9vKQorIyAyID0gVXNlIERyYW0gc2F2ZWQgY29uZmlnIFBhcmFtZXRlcnMsIGlmIG5vIFBhcmFtZXRlcnMgUGVyZm9ybSBTaG1vbyBvbiBpbml0LiBEZWZhdWx0IG9wdGlvbi4KKyMgMSA9IFBlcmZvcm0gU2htb28gb24gaW5pdC4KKyMgMCA9IFVzZSBEcmFtIHNhdmVkIGNvbmZpZyBQYXJhbWV0ZXJzLCBpZiBubyBQYXJhbWV0ZXJzIGRvIG5vdGhpbmcuCitkZHIzX2F1dG9fdHVuZS5CQ004ODY1MD0yCisKKyMjIyBFbmFibGUgQklTVAorIyBSdW4gRHJhbSBCSVNUIG9uIGluaXRpYWxpemF0aW9uLCBpZiBCSVNUIGZhaWwgdGhlIGluaXRpYWxpemF0aW9uIHdpbGwgZmFpbC4gRGVmdWx0OiAxLgorIyBiaXN0X2VuYWJsZV9kcmFtLkJDTTg4NjUwPTEKKworIyMjIEV4YW1wbGUgZm9yIERyYW0gU2F2ZWQgY29uZmlnIFBhcmFtZXRlcnMuCisjIyBUaGlzIGV4YW1wbGUgaXMgZm9yIGNpPTE0IChEcmFtPTcpLgorI2RkcjNfdHVuZV9hZGRyY19jaTE0PTB4MDAwMDAwYWUKKyNkZHIzX3R1bmVfd3JfZHFfd2wxX2NpMTQ9MHg5MjkyOTI5MiwweDkyOTI5MjkyLDB4OTI5MjkyOTIsMHg5MjkyOTI5MgorI2RkcjNfdHVuZV93cl9kcV93bDBfY2kxND0weDkzOTM5MzkzLDB4OTM5MzkzOTMsMHg5MjkyOTI5MiwweDkyOTI5MjkyCisjZGRyM190dW5lX3dyX2RxX2NpMTQ9MHg4MDgwODA4MAorI2RkcjNfdHVuZV92cmVmX2NpMTQ9MHgwMDAwMDdkZgorI2RkcjNfdHVuZV9yZF9kcXNfY2kxND0weDk2OTY5MTkxLDB4OTA5MDkxOTEKKyNkZHIzX3R1bmVfcmRfZHFfd2wxX3JuX2NpMTQ9MHg4MjgyODI4MiwweDgyODI4MjgyLDB4ODI4MjgyODIsMHg4MjgyODI4MgorI2RkcjNfdHVuZV9yZF9kcV93bDBfcm5fY2kxND0weDgyODI4MjgyLDB4ODI4MjgyODIsMHg4OTg5ODk4OSwweDg5ODk4OTg5CisjZGRyM190dW5lX3JkX2RxX3dsMV9ycF9jaTE0PTB4ODI4MjgyODIsMHg4MjgyODI4MiwweDgyODI4MjgyLDB4ODI4MjgyODIKKyNkZHIzX3R1bmVfcmRfZHFfd2wwX3JwX2NpMTQ9MHg4MjgyODI4MiwweDgyODI4MjgyLDB4ODk4OTg5ODksMHg4OTg5ODk4OQorI2RkcjNfdHVuZV9yZF9lbl9jaTE0PTB4MDA5ZDllOWQsMHgwMGEyYTNhMQorI2RkcjNfdHVuZV9yZF9kYXRhX2RseV9jaTE0PTB4MDAwMDA1MDUKKyAgIGRkcjNfdHVuZV9yZF9kcV93bDFfcnBfY2k4LjA9MHg4MjgyODI4MiwweDgyODI4MjgyLDB4OGI4YjhiOGIsMHg4YjhiOGI4YgorICAgIGRkcjNfdHVuZV93cl9kcV93bDBfY2k0LjA9MHg5MzkzOTM5MywweDkzOTM5MzkzLDB4OTI5MjkyOTIsMHg5MjkyOTI5MgorICAgIGRkcjNfdHVuZV92cmVmX2NpMTAuMD0weDAwMDAwNzllCisgICAgZGRyM190dW5lX3dyX2RxX3dsMV9jaTIuMD0weDkyOTI5MjkyLDB4OTI5MjkyOTIsMHg5MjkyOTI5MiwweDkyOTI5MjkyCisgICAgZGRyM190dW5lX3dyX2RxX2NpNi4wPTB4ODA4MDgwODAKKyAgICBkZHIzX3R1bmVfcmRfZHFfd2wwX3JuX2NpNi4wPTB4ODA4MDgwODAsMHg4MDgwODA4MCwweDhjOGM4YzhjLDB4OGM4YzhjOGMKKyAgICBkZHIzX3R1bmVfcmRfZHFfd2wxX3JwX2NpMTAuMD0weDgzODM4MzgzLDB4ODM4MzgzODMsMHg4NDg0ODQ4NCwweDg0ODQ4NDg0CisgICAgZGRyM190dW5lX3JkX2Rxc19jaTguMD0weDk2OTY5Nzk3LDB4OTQ5NDkwOTAKKyAgICBkZHIzX3R1bmVfdnJlZl9jaTYuMD0weDAwMDAwNzllCisgICAgZGRyM190dW5lX3JkX2RxX3dsMF9ycF9jaTE0LjA9MHg4MzgzODM4MywweDgzODM4MzgzLDB4ODM4MzgzODMsMHg4MzgzODM4MworICAgIGRkcjNfdHVuZV9yZF9lbl9jaTEwLjA9MHgwMDlmYTA5ZiwweDAwOWE5Yzk5CisgICAgZGRyM190dW5lX3JkX2RhdGFfZGx5X2NpNC4wPTB4MDAwMDA0MDQKKyAgICBkZHIzX3R1bmVfYWRkcmNfY2k4LjA9MHgwMDAwMDBhYgorICAgIGRkcjNfdHVuZV9yZF9kcV93bDBfcnBfY2kyLjA9MHg4MTgxODE4MSwweDgxODE4MTgxLDB4ODQ4NDg0ODQsMHg4NDg0ODQ4NAorICAgIGRkcjNfdHVuZV9yZF9kcXNfY2kxMC4wPTB4OTY5NjkwOTAsMHg5MDkwOTA5MAorICAgIGRkcjNfdHVuZV9yZF9lbl9jaTIuMD0weDAwOWM5YzljLDB4MDA5YTljOTgKKyAgICBkZHIzX3R1bmVfd3JfZHFfd2wwX2NpMTIuMD0weDkzOTM5MzkzLDB4OTM5MzkzOTMsMHg5MzkzOTM5MywweDkzOTM5MzkzCisgICAgZGRyM190dW5lX3JkX2RxX3dsMV9ybl9jaTQuMD0weDg0ODQ4NDg0LDB4ODQ4NDg0ODQsMHg4YzhjOGM4YywweDhjOGM4YzhjCisgICAgZGRyM190dW5lX2FkZHJjX2NpMTAuMD0weDAwMDAwMGFmCisgICAgZGRyM190dW5lX3dyX2RxX3dsMF9jaTYuMD0weDkwOTA5MDkwLDB4OTA5MDkwOTAsMHg5MzkzOTM5MywweDkzOTM5MzkzCisgICAgZGRyM190dW5lX3ZyZWZfY2kxMi4wPTB4MDAwMDA3OWUKKyAgICBkZHIzX3R1bmVfcmRfZHFfd2wwX3JuX2NpMTAuMD0weDgzODM4MzgzLDB4ODM4MzgzODMsMHg4YzhjOGM4YywweDhjOGM4YzhjCisgICAgZGRyM190dW5lX3dyX2RxX3dsMV9jaTQuMD0weDkzOTM5MzkzLDB4OTM5MzkzOTMsMHg5NDk0OTQ5NCwweDk0OTQ5NDk0CisgICAgZGRyM190dW5lX3dyX2RxX2NpOC4wPTB4ODA4MDgwODAKKyAgICBkZHIzX3R1bmVfcmRfZHFfd2wxX3JwX2NpMC4wPTB4ODM4MzgzODMsMHg4MzgzODM4MywweDg0ODQ4NDg0LDB4ODQ4NDg0ODQKKyAgICBkZHIzX3R1bmVfd3JfZHFfd2wxX2NpMTAuMD0weDk1OTU5NTk1LDB4OTU5NTk1OTUsMHg5NTk1OTU5NSwweDk1OTU5NTk1CisgICAgZGRyM190dW5lX3JkX2RxX3dsMF9ybl9jaTguMD0weDhhOGE4YThhLDB4OGE4YThhOGEsMHg4OTg5ODk4OSwweDg5ODk4OTg5CisgICAgZGRyM190dW5lX3JkX2RxX3dsMV9ycF9jaTEyLjA9MHg4NDg0ODQ4NCwweDg0ODQ4NDg0LDB4ODQ4NDg0ODQsMHg4NDg0ODQ4NAorICAgIGRkcjNfdHVuZV93cl9kcV9jaTEwLjA9MHg4MDgwODA4MAorICAgIGRkcjNfdHVuZV92cmVmX2NpOC4wPTB4MDAwMDA3ZGYKKyAgICBkZHIzX3R1bmVfcmRfZW5fY2kxMi4wPTB4MDA5YzljOWQsMHgwMGEwYTI5ZgorICAgIGRkcjNfdHVuZV9yZF9kYXRhX2RseV9jaTYuMD0weDAwMDAwNTA1CisgICAgZGRyM190dW5lX3JkX2RxX3dsMF9ycF9jaTQuMD0weDgzODM4MzgzLDB4ODM4MzgzODMsMHg4MTgxODE4MSwweDgxODE4MTgxCisgICAgZGRyM190dW5lX3JkX2Rxc19jaTEyLjA9MHg5MTkxOTI5MiwweDkyOTI5MzkzCisgICAgZGRyM190dW5lX3JkX2Rxc19jaTAuMD0weDk2OTY5MjkyLDB4OTE5MTkxOTEKKyAgICBkZHIzX3R1bmVfcmRfZW5fY2k0LjA9MHgwMDk3OTc5OCwweDAwOWM5ZTlhCisgICAgZGRyM190dW5lX3JkX2RhdGFfZGx5X2NpMTAuMD0weDAwMDAwNTA1CisgICAgZGRyM190dW5lX2FkZHJjX2NpMC4wPTB4MDAwMDAwYWQKKyAgICBkZHIzX3R1bmVfd3JfZHFfd2wwX2NpMTQuMD0weDk0OTQ5NDk0LDB4OTQ5NDk0OTQsMHg5MzkzOTM5MywweDkzOTM5MzkzCisgICAgZGRyM190dW5lX3JkX2RxX3dsMV9ybl9jaTYuMD0weDg5ODk4OTg5LDB4ODk4OTg5ODksMHg4YjhiOGI4YiwweDhiOGI4YjhiCisgICAgZGRyM190dW5lX2FkZHJjX2NpMTIuMD0weDAwMDAwMGIzCisgICAgZGRyM190dW5lX3dyX2RxX3dsMF9jaTguMD0weDkzOTM5MzkzLDB4OTM5MzkzOTMsMHg5MzkzOTM5MywweDkzOTM5MzkzCisgICAgZGRyM190dW5lX3ZyZWZfY2kxNC4wPTB4MDAwMDA3OWUKKyAgICBkZHIzX3R1bmVfcmRfZHFfd2wwX3JuX2NpMTIuMD0weDgzODM4MzgzLDB4ODM4MzgzODMsMHg4MzgzODM4MywweDgzODM4MzgzCisgICAgZGRyM190dW5lX3dyX2RxX3dsMV9jaTYuMD0weDk0OTQ5NDk0LDB4OTQ5NDk0OTQsMHg5NDk0OTQ5NCwweDk0OTQ5NDk0CisgICAgZGRyM190dW5lX3JkX2RxX3dsMV9ycF9jaTIuMD0weDgzODM4MzgzLDB4ODM4MzgzODMsMHg4OTg5ODk4OSwweDg5ODk4OTg5CisgICAgZGRyM190dW5lX3dyX2RxX3dsMV9jaTEyLjA9MHg5NDk0OTQ5NCwweDk0OTQ5NDk0LDB4OTQ5NDk0OTQsMHg5NDk0OTQ5NAorICAgIGRkcjNfdHVuZV9yZF9kcV93bDFfcnBfY2kxNC4wPTB4ODE4MTgxODEsMHg4MTgxODE4MSwweDgzODM4MzgzLDB4ODM4MzgzODMKKyAgICBkZHIzX3R1bmVfd3JfZHFfY2kxMi4wPTB4ODA4MDgwODAKKyAgICBkZHIzX3R1bmVfd3JfZHFfY2kwLjA9MHg4MDgwODA4MAorICAgIGRkcjNfdHVuZV9yZF9lbl9jaTE0LjA9MHgwMDlmOWY5ZiwweDAwYTJhNGExCisgICAgZGRyM190dW5lX3JkX2RxX3dsMF9ybl9jaTAuMD0weDgzODM4MzgzLDB4ODM4MzgzODMsMHg4OTg5ODk4OSwweDg5ODk4OTg5CisgICAgZGRyM190dW5lX3JkX2RhdGFfZGx5X2NpOC4wPTB4MDAwMDA1MDUKKyAgICBkZHIzX3R1bmVfcmRfZHFfd2wwX3JwX2NpNi4wPTB4ODA4MDgwODAsMHg4MDgwODA4MCwweDhjOGM4YzhjLDB4OGM4YzhjOGMKKyAgICBkZHIzX3R1bmVfcmRfZHFzX2NpMTQuMD0weDkxOTE5MjkyLDB4OTA5MDkwOTAKKyAgICBkZHIzX3R1bmVfcmRfZHFzX2NpMi4wPTB4OTA5MDhmOGYsMHg5NTk1OTA5MAorICAgIGRkcjNfdHVuZV9yZF9lbl9jaTYuMD0weDAwOWM5ZDliLDB4MDA5ZWEwOWQKKyAgICBkZHIzX3R1bmVfcmRfZGF0YV9kbHlfY2kxMi4wPTB4MDAwMDA1MDUKKyAgICBkZHIzX3R1bmVfdnJlZl9jaTAuMD0weDAwMDAwN2RmCisgICAgZGRyM190dW5lX2FkZHJjX2NpMi4wPTB4MDAwMDAwYWUKKyAgICBkZHIzX3R1bmVfcmRfZHFfd2wxX3JuX2NpOC4wPTB4ODI4MjgyODIsMHg4MjgyODI4MiwweDhiOGI4YjhiLDB4OGI4YjhiOGIKKyAgICBkZHIzX3R1bmVfYWRkcmNfY2kxNC4wPTB4MDAwMDAwYjAKKyAgICBkZHIzX3R1bmVfcmRfZHFfd2wxX3JuX2NpMTAuMD0weDgzODM4MzgzLDB4ODM4MzgzODMsMHg4NDg0ODQ4NCwweDg0ODQ4NDg0CisgICAgZGRyM190dW5lX3JkX2RxX3dsMF9ybl9jaTE0LjA9MHg4MzgzODM4MywweDgzODM4MzgzLDB4ODM4MzgzODMsMHg4MzgzODM4MworICAgIGRkcjNfdHVuZV93cl9kcV93bDFfY2k4LjA9MHg5MzkzOTM5MywweDkzOTM5MzkzLDB4OTQ5NDk0OTQsMHg5NDk0OTQ5NAorICAgIGRkcjNfdHVuZV9yZF9kcV93bDFfcnBfY2k0LjA9MHg4NDg0ODQ4NCwweDg0ODQ4NDg0LDB4OGM4YzhjOGMsMHg4YzhjOGM4YworICAgIGRkcjNfdHVuZV93cl9kcV93bDFfY2kxNC4wPTB4OTU5NTk1OTUsMHg5NTk1OTU5NSwweDk1OTU5NTk1LDB4OTU5NTk1OTUKKyAgICBkZHIzX3R1bmVfd3JfZHFfd2wwX2NpMC4wPTB4OTM5MzkzOTMsMHg5MzkzOTM5MywweDkyOTI5MjkyLDB4OTI5MjkyOTIKKyAgICBkZHIzX3R1bmVfd3JfZHFfY2kxNC4wPTB4ODA4MDgwODAKKyAgICBkZHIzX3R1bmVfd3JfZHFfY2kyLjA9MHg4MDgwODA4MAorICAgIGRkcjNfdHVuZV9yZF9kcV93bDBfcm5fY2kyLjA9MHg4MTgxODE4MSwweDgxODE4MTgxLDB4ODQ4NDg0ODQsMHg4NDg0ODQ4NAorICAgIGRkcjNfdHVuZV9yZF9kcV93bDBfcnBfY2k4LjA9MHg4YThhOGE4YSwweDhhOGE4YThhLDB4ODk4OTg5ODksMHg4OTg5ODk4OQorICAgIGRkcjNfdHVuZV9yZF9kcXNfY2k0LjA9MHg4ZjhmOTA5MCwweDk1OTU5MTkxCisgICAgZGRyM190dW5lX3JkX2VuX2NpOC4wPTB4MDBhMGEwYTAsMHgwMDliOWU5OQorICAgIGRkcjNfdHVuZV9yZF9kYXRhX2RseV9jaTE0LjA9MHgwMDAwMDUwNQorICAgIGRkcjNfdHVuZV92cmVmX2NpMi4wPTB4MDAwMDA3ZGYKKyAgICBkZHIzX3R1bmVfcmRfZHFfd2wwX3JwX2NpMTAuMD0weDgzODM4MzgzLDB4ODM4MzgzODMsMHg4YzhjOGM4YywweDhjOGM4YzhjCisgICAgZGRyM190dW5lX3JkX2RhdGFfZGx5X2NpMC4wPTB4MDAwMDA1MDUKKyAgICBkZHIzX3R1bmVfYWRkcmNfY2k0LjA9MHgwMDAwMDBhZgorICAgIGRkcjNfdHVuZV9yZF9kcV93bDFfcm5fY2kxMi4wPTB4ODQ4NDg0ODQsMHg4NDg0ODQ4NCwweDg0ODQ4NDg0LDB4ODQ4NDg0ODQKKyAgICBkZHIzX3R1bmVfcmRfZHFfd2wxX3JuX2NpMC4wPTB4ODM4MzgzODMsMHg4MzgzODM4MywweDg0ODQ4NDg0LDB4ODQ4NDg0ODQKKyAgICBkZHIzX3R1bmVfcmRfZHFfd2wxX3JwX2NpNi4wPTB4ODk4OTg5ODksMHg4OTg5ODk4OSwweDhiOGI4YjhiLDB4OGI4YjhiOGIKKyAgICBkZHIzX3R1bmVfd3JfZHFfd2wwX2NpMi4wPTB4OTI5MjkyOTIsMHg5MjkyOTI5MiwweDkyOTI5MjkyLDB4OTI5MjkyOTIKKyAgICBkZHIzX3R1bmVfd3JfZHFfd2wxX2NpMC4wPTB4OTI5MjkyOTIsMHg5MjkyOTI5MiwweDkyOTI5MjkyLDB4OTI5MjkyOTIKKyAgICBkZHIzX3R1bmVfd3JfZHFfY2k0LjA9MHg4MDgwODA4MAorICAgIGRkcjNfdHVuZV9yZF9kcV93bDBfcm5fY2k0LjA9MHg4MzgzODM4MywweDgzODM4MzgzLDB4ODE4MTgxODEsMHg4MTgxODE4MQorICAgIGRkcjNfdHVuZV9yZF9kcXNfY2k2LjA9MHg5NDk0OGY4ZiwweDkzOTM5MzkzCisgICAgZGRyM190dW5lX3ZyZWZfY2k0LjA9MHgwMDAwMDc5ZQorICAgIGRkcjNfdHVuZV9yZF9kcV93bDBfcnBfY2kxMi4wPTB4ODM4MzgzODMsMHg4MzgzODM4MywweDgzODM4MzgzLDB4ODM4MzgzODMKKyAgICBkZHIzX3R1bmVfcmRfZGF0YV9kbHlfY2kyLjA9MHgwMDAwMDQwNAorICAgIGRkcjNfdHVuZV9hZGRyY19jaTYuMD0weDAwMDAwMGFiCisgICAgZGRyM190dW5lX3JkX2RxX3dsMF9ycF9jaTAuMD0weDgzODM4MzgzLDB4ODM4MzgzODMsMHg4OTg5ODk4OSwweDg5ODk4OTg5CisgICAgZGRyM190dW5lX3JkX2RxX3dsMV9ybl9jaTE0LjA9MHg4MTgxODE4MSwweDgxODE4MTgxLDB4ODM4MzgzODMsMHg4MzgzODM4MworICAgIGRkcjNfdHVuZV9yZF9lbl9jaTAuMD0weDAwOWZhMDlmLDB4MDA5OTliOTgKKyAgICBkZHIzX3R1bmVfd3JfZHFfd2wwX2NpMTAuMD0weDk0OTQ5NDk0LDB4OTQ5NDk0OTQsMHg5Njk2OTY5NiwweDk2OTY5Njk2CisgICAgZGRyM190dW5lX3JkX2RxX3dsMV9ybl9jaTIuMD0weDgzODM4MzgzLDB4ODM4MzgzODMsMHg4OTg5ODk4OSwweDg5ODk4OTg5CisKKworIyBEcmFtIHR5cGU6IFNlbGVjdCBPTkxZIE9ORSBvZiB0aGUgZm9sbG93aW5nIERSQU0gdHlwZXMsIHRvIGNvbmZpZ3VyZSBhbGwgZHJhbSByZWxhdGVkIHBhcmFtZXRlcmVzIHBlciB0eXBlLgorIyBEcmFtIFR5cGUgZm9yIEFyYWQ6CitkcmFtX3R5cGVfRERSM19IWU5JWF9INVRRMkc2M0JGUl9URUNfMTA2Nj0xCisjZHJhbV90eXBlX0REUjNfSFlOSVhfSDVUUTJHNjNCRlJfVEVDXzkzMz0xCisjZHJhbV90eXBlX0REUjNfSFlOSVhfSDVUUTJHNjNCRlJfVEVDXzgwMD0xCisjZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMjU2TTE2XzRHQklUXzEwNjY9MQorI2RyYW1fdHlwZV9ERFIzX01JQ1JPTl9NVDQxSjEyOE0xNkhBXzEyNV8xMDY2PTEKKyNkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoxMjhNMTZIQV8xMjVfOTMzPTEKKyNkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoxMjhNMTZIQV8xMjVfODAwPTEKKyNkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0Mko2NE0xNkxBXzE1RV82Njc9MQorI2RyYW1fdHlwZV9ERFIzX1NBTVNVTkdfSzRCNEcxNjQ2Ql80R0JJVF8xMDY2PTEKKyNkcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjFHMTY0NkdfOTMzPTEKKyNkcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjFHMTY0NkdfODAwPTEKKworIyMjIFNldHRpbmcgZHJhbV90eXBlX0REUjNfSFlOSVhfSDVUUTJHNjNCRlJfVEVDXzEwNjYgUGFyYW1ldGVycyBhcyBEZWZhdWx0OgorIyMgQWxsIG90aGVyIGRyYW0gdHlwZXMgcGFyYW1ldGVyIHJlc2lkZXMgaW4gYXJhZC5zb2MuIGNob29zaW5nIGFub3RoZXIgRHJhbSBUeXBlIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLgorZXh0X3JhbV90X3JyZD02MDAwCitleHRfcmFtX2NvbHVtbnM9MTAyNAorZXh0X3JhbV9iYW5rcz04CitleHRfcmFtX2FwX2JpdF9wb3M9MTAKK2V4dF9yYW1fYnVyc3Rfc2l6ZT0zMgorZXh0X3JhbV90X3JlZj0zOTAwMDAwCitleHRfcmFtX3Rfd3I9MTUwMDAKK2V4dF9yYW1fdF93dHI9NzUwMAorZXh0X3JhbV90X3J0cD03NTAwCitleHRfcmFtX2ZyZXE9MTA2NgorZXh0X3JhbV9yb3dzPTE2Mzg0CitleHRfcmFtX2plZGVjPTI5CitleHRfcmFtX3RfcmM9NDYwOTAKK2V4dF9yYW1fdF9yY2RfcmQ9MTMwOTAKK2V4dF9yYW1fdF9yY2Rfd3I9MTMwOTAKK2V4dF9yYW1fdF9ycD0xMzA5MAorZXh0X3JhbV90X3JmYz0xNjAwMDAKK2V4dF9yYW1fdF9yYXM9MzMwMDAKK2V4dF9yYW1fY193cl9sYXRlbmN5PTEwCitleHRfcmFtX3RfZmF3PTM1MDAwCitleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTQKK2RkcjNfbWVtX2dyYWRlPTB4MTQxNDE0CisKKyMgRFJBTSBwcmUtY29uZmlndXJhdGlvbnMgYWNjb3JkaW5nIHRvIGNvbmZpZyB2YXJpYWJsZXMgd2hpY2ggZGVmaW5lcworIyBEcmFtIFR5cGUuIHN1cHBvcnRzIG9ubHkgRERSMzoKK2V4dF9yYW1fdHlwZS5CQ004ODY1MD1ERFIzCisKKyMgVG90YWwgRHJhbSBTaXplIChNQnl0ZXMpCisjIEZvciA4IGRyYW1zIGludGVyZmFjZXMsIDIgY2hhbm5lbCBlYWNoLCBFYWNoIGNoYW5uZWwgMkdiaXQgRHJhbS4gdGhlIHRvdGFsIERSQU0gc2l6ZSBpcyAzMkdCaXRzPTQwMDBNQnl0ZXMuCitleHRfcmFtX3RvdGFsX3NpemUuQkNNODg2NTA9NDAwMAorCisjIFRvdGFsIGJ1ZmZlciBzaXplIGFsbG9jYXRlZCBmb3IgVXNlciBidWZmZXIuIFVuaXRzOiBNYnl0ZXMuIERlZmF1bHQ6ICcweDAnLgorIyBTdXBwb3J0ZWQgc3VmZml4OgorIyAgICAgICBkcmFtIC0gdGhlIGJ1ZmZlciBzaXplIHdpbGwgYmUgc3VidHJhY3RlZCBmcm9tIHRoZSBEUkFNIHNpemUgYXZhaWxhYmxlIGZvciBwYWNrZXQgbWVtb3J5LgorI3VzZXJfYnVmZmVyX3NpemU9MAorI3VzZXJfYnVmZmVyX3NpemVfZHJhbT01MAorCisjIERSQU0gQ2xhbVNoZWxsIChpbnRlcmZhY2Ugc3dhcCBpdHMgSFcgUElOIHBhaXJzIGR1cmluZyBpbml0LiBOb3RlOiBPbmx5IG9uZSBvZiBEUkFNcyBjYW4gaGF2ZSBpdHMgUElOIHN3YXBwZWQpCisjIFZhbGlkIHZhbHVlczogMC8xCisjZHJhbTBfY2xhbXNoZWxsX2VuYWJsZS5CQ004ODY1MD0xCisjZHJhbTFfY2xhbXNoZWxsX2VuYWJsZS5CQ004ODY1MD0xCisKKyMgRFJBTSBtYXhpbXVtIG51bWJlciBvZiBjcmMgZXJyb3IgcGVyIGJ1ZmZlciwgYnVmZmVyIGRlbGV0ZWQgYnkgaW50ZXJydXB0IGFwcGxpY2F0aW9uLgorI2RyYW1fY3JjX2RlbF9idWZmZXJfbWF4X3JlY2xhaW1zPTAKKworIyMjIFdhcm1ib290ICMjIworIyMgU2NhY2hlIGluaXRpYWxpemF0aW9uIGZvciB3YXJtYm9vdCBwZXJzaXN0ZW50IHN0b3JhZ2UuCisjU2F2ZSB0aGUgd2FybSBib290IGRhdGEgaW4gYSBmaWxlLiBBbGxvd2VkIHZhbHVlczogMy4KKyNzdGFibGVfbG9jYXRpb24uQkNNODg2NTA9MworI1NldCB0aGUgd2FybSBib290IGRhdGEgZmlsZW5hbWUuCisjc3RhYmxlX2ZpbGVuYW1lLkJDTTg4NjUwPS4vd2FybWJvb3RfZGF0YQorI1NldCB0aGUgd2FybSBib290IGRhdGEgZmlsZSBzaXplIChBdCBsZWFzdCAxME1CIGZvciBQRVRSQS1CLCA0TUIgZm9yIEFSQUQpCisjc3RhYmxlX3NpemUuQkNNODg2NTA9MTAwMDAwMDAwMAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb25maWcgdmFyaWFibGUgYmVsb3cgYXJlIG9ubHkgYWNjZXNzZWQgZnJvbSBkdW5lLnNvYywgYW5kIGFyZSB1c2VkIHRvCisjIGNvbmZpZ3VyZSBCU1AgLyBleGFtcGxlIGFwcGxpY2F0aW9uIC8gZ3JvdXAgb2YgZm9ybWFsIGNvbmZpZyB2YXJpYWJsZXMuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMgSWYgc2V0LCBhbHdheXMgY29uZmlndXJlcyBzeW50aGVzaXplcnMsIGV2ZW4gaWYgdGhlIGNvbmZpZ3VyZWQgcmF0ZSBpcyBlcXVhbCB0bworIyMgdGhlaXIgbm9taW5hbCByYXRlLiBDYW4gYmUgZGlzYWJsZWQgdG8gc3BlZWR1cCBicmluZ3VwIHRpbWUgKGtlZXAgaW4gbWluZCB0aGF0IGlmCisjIyBkaXNhYmxlZCwgY2hhbmdpbmcgYSBzeW50IHRvIGEgbm9uLW5vbWluYWwgZnJlcSBhbmQgdGhhbiBiYWNrIHRvIG5vbWluYWwgd2lsbCBub3QKKyMjIHdvcmsKKyNzeW50X292ZXIuQkNNODg2NTA9MQorCisjIExvY2FsIHZhcmlhYmxlcyBmb3IgYm9hcmQgc3ludGhlc2l6ZXJzIGZyZXEuIEZhYnJpYywgY29tYm8gYW5kIG5pZiBhbHNvIGNvbmZpZ3VyZQorIyB0aGUgKl9yZWZfY2xvY2sgc29jIHByb3BlcnRpZXMgZm9yIHRoZXNlIGZyZXF1ZW5jaWVzLiBjb3JlLCBkZHIgYW5kIHBoeSBvbmx5CisjIGNvbmZpZ3VyZXMgdGhlIHN5bnRoZXNpemVyCitzeW50X2NvcmUuQkNNODg2NTA9MTAwMDAwMDAwCitzeW50X2Rkci5CQ004ODY1MD0xMjUwMDAwMDAKK3N5bnRfcGh5LkJDTTg4NjUwPTE1NjI1MDAwMAorc3ludGhfZHJhbV9mcmVxLkJDTTg4NjUwPTI1CisKKyNDb25maWd1cmUgdGhlIHJlZmVyZW5jZSBjbG9jayBmcmVxdWVuY2llcyBmb3IgTklGIGFuZCBGYWJyaWMgU2VyRGVzCisjIE9wdGlvbnM6ICAwIC0gMTI1TUhaLCAxIC0gMTU2LjI1TUh6CitzZXJkZXNfbmlmX2Nsa19mcmVxLkJDTTg4NjUwPTEKK3NlcmRlc19mYWJyaWNfY2xrX2ZyZXEuQkNNODg2NTA9MQorIyBJRUVFIDE1ODggLQorIyBjb25maWd1cmUgY2xvY2sgKGZvciAxNTg4IGRlYnVnLCB3aGVuIEJyb2Fkc3luYyBpcyBkaXNhYmxlZCk6CisjICBEUExMIG1vZGUvbG9jazogMCAtIGVjaSB0cyBwbGwgY2xrIGRpc2FibGVkLCAxIC0gY29uZmlndXJlIGVjaSB0cyBwbGwgY2xrCisjICBEUExMIHBoYXNlL2ZyZXEuIERlZmF1bHQgaW5pdGlhbDogbG8gPSAweDQwMDAwMDAwLCBoaSA9IDB4MTAwMDAwMDAuCisjcGh5XzE1ODhfZHBsbF9mcmVxdWVuY3lfbG9jay5CQ004ODY1MD0xCisjcGh5XzE1ODhfZHBsbF9waGFzZV9pbml0aWFsX2xvLkJDTTg4NjUwPTB4NDAwMDAwMDAKKyNwaHlfMTU4OF9kcGxsX3BoYXNlX2luaXRpYWxfaGkuQkNNODg2NTA9MHgxMDAwMDAwMAorIyBwb3J0IGV4dGVybmFsIE1BQworIyAgaW5kaWNhdGlvbiB3aGV0aGVyIGV4dGVybmFsIE1BQyBleGlzdHMgb3Igbm90LgorIyAgMDogMTU4OCBleHRlcm5hbCBNQUMgZG9lcyBub3QgZXhpc3QKKyMgIDE6IDE1ODggZXh0ZXJuYWwgTUFDIGV4aXN0cworIyAgdGhlIGV4dGVybmFsIE1BQyBzdWJzdHJhY3RzIHRoZSBSWCB0aW1lIGZyb20gdGhlIGNvcnJlY3Rpb24gZmllbGQKKyMgIGFuZCBhZGRzIHRoZSBUWCB0aW1lIHRvIHRoZSBjb3JyZWN0aW9uIGZpZWxkLgorI2V4dF8xNTg4X21hY19lbmFibGVfMTQuQkNNODg2NTA9MQorCisjIyBUcmlsbCBjb25maWd1cmF0aW9ucworIyBUcmlsbCBtb2RlOiAwIChkaXNhYmxlZCkgLyAxIChjb2Fyc2UtZ3JhaW5lZCkgLyAyIChmaW5lLWdyYWluZWQpCisjdHJpbGxfbW9kZS5CQ004ODY1MD0xCisKKyMgVHJpbGwgbXVsdGljYXN0IHBydW5uaW5nIG1vZGU6CisjIDA6IG5vIHBydW5uaW5nIC0gdnNpIGlzIG5vdCBwYXJ0IG9mIHRoZSBrZXkKKyMgMTogVlNJIHBydW5uaW5nOiBLZXkgaXMgZGlzdC10cmVlLGVzYWRpdC1iaXQsVlNJLgordHJpbGxfbWNfcHJ1bmVfbW9kZS5CQ004ODY1MD0wCisKKyMgRW5hYmxlIFNBIGF1dGhlbnRpY2F0aW9uCisjc2FfYXV0aF9lbmFibGVkPTEKKworIyBCcmlkZ2UgZGVmYXVsdCBsb2dpY2FsIGludGVyZmFjZXMgYWxsb2NhdGlvbiBJRFMKK2xvZ2ljYWxfcG9ydF9sMl9icmlkZ2UuQkNNODg2NTA9MAorbG9naWNhbF9wb3J0X2Ryb3AuQkNNODg2NTA9MQorCisjbG9naWNhbF9wb3J0X21pbV9pbi5CQ004ODY1MD0yCisjbG9naWNhbF9wb3J0X21pbV9vdXQuQkNNODg2NTA9NDA5NgorCisjIEVuYWJsZSBFVkIgYXBwbGljYXRpb24KKyNldmJfZW5hYmxlPTEKKworIyBFbmFibGUgRmxleGlibGUgUWluUSBhcHBsaWNhdGlvbgorI3ZsYW5fdHJhbnNsYXRpb25fbWF0Y2hfaXB2ND0xCisKKworIyBQcmVwZW5kIHRhZyB0byBiZSA0IGJ5dGVzIG9yIDggYnl0ZXMuIERlZmF1bHQ6IDRCLgorIyBBcHBsaWNhYmxlIG9ubHkgZnJvbSBBUkFEKworI3ByZXBlbmRfdGFnX2J5dGVzPTRCCisKKyMgVGhlIFByZXBlbmQgVGFnIGlzIGxvY2F0ZWQgYXQgKDEyICsgMipvZmZzZXQpIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQuCisjIFJhbmdlOiAwLTcuIERlZmF1bHQ6IDAKKyNwcmVwZW5kX3RhZ19vZmZzZXQ9MAorCisjIEVuYWJsZSBBUlAgKG5leHQgaG9wIG1hYyBleHRlbnNpb24pIGZlYXR1cmUKK2JjbTg4Nnh4X25leHRfaG9wX21hY19leHRlbnNpb25fZW5hYmxlLkJDTTg4NjUwPTAKKworIyBTZXQgVkxBTiB0cmFuc2xhdGUgbW9kZS4KKyMgMDogbm9ybWFsCisjIDE6IGFkdmFuY2VkIG1vZGUuIEVuYWJsZSB2bGFuIGVkaXQgc2V0dGluZ3Mgd2l0aCBlbmhhbmNlZCB1c2VyIGNvbnRyb2wKKyNiY204ODZ4eF92bGFuX3RyYW5zbGF0ZV9tb2RlPTAKKworIyBTZXQgTVBMUyB0ZXJtaW5hdGlvbiBkYXRhYmFzZSBtb2RlCisjIFNldCBNUExTIGRhdGFiYXNlcyBsb2NhdGlvbiBmb3IgZWFjaCBNUExTIG5hbWVzcGFjZSAoTDEsTDIsTDMpCisjYmNtODg2eHhfbXBsc190ZXJtaW5hdGlvbl9kYXRhYmFzZV9tb2RlPTAKKworIyBFbmFibGUgLCBEaXNhYmxlIE1QTFMgaW5kZXhlZC4KKyMgTVBMUyB0ZXJtaW5hdGlvbiB3aXRoIGtub3duIGxhYmVsIHN0YWNrIGxvY2F0aW9uLgorIyBNdXN0IGJlIGVuYWJsZWQgaW4gY2FzZSBkZXZpY2Ugc3VwcG9ydHMgbW9yZSB0aGFuIDIgTVBMUyBsYWJlbCB0ZXJtaW5hdGlvbnMgKEwxLEwyLEwzKQorI21wbHNfdGVybWluYXRpb25fbGFiZWxfaW5kZXhfZW5hYmxlPTEKKworIyBFbmFibGUgRmFzdFJlUm91dGUgbGFiZWxzIGluIGRldmljZS4KKyNmYXN0X3Jlcm91dGVfbGFiZWxzX2VuYWJsZT0wCisKKyMgRW5hYmxlIE1QTFMgQ29udGV4dCBzcGVjaWZpYy4gVXBzdHJlYW0gbGFiZWwgYXNzaWdubWVudCBpbiBkZXZpY2UuCisjbXBsc19jb250ZXh0X3NwZWNpZmljX2xhYmVsX2VuYWJsZT0wCisKKyMgTVBMUyBjb250ZXh0LgorIyBDYW4gYmUgZ2xvYmFsLCBwZXIgcG9ydCAsIHBlciBpbnRlcmZhY2Ugb3IgcGVyIHBvcnQsaW50ZXJmYWNlLgorI21wbHNfY29udGV4dD1nbG9iYWwKKworIyBNUExTIFRQIE1DIHJlc2VydmVkIG1hYyBhZGRyZXNzICgwMS0wMC01RS05MC0wMC0wMCkuCisjIElmIHNldCBkZXZpY2Ugd2lsbCBzdXBwb3J0IE15LU1BQyB0ZXJtaW5hdGlvbiBvZiByZXNlcnZlZCBNQyBFdGhlcm5ldAorI21wbHNfdHBfbXltYWNfcmVzZXJ2ZWRfYWRkcmVzcz0wCisKKyMgTVBMUyBFTEkgZW5hYmxlIGRpc2FibGUKK21wbHNfZW50cm9weV9sYWJlbF9pbmRpY2F0b3JfZW5hYmxlPTAKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyNjZmcgZm9yIEJDTTg4NjQwX0EwIC0gUGV0cmEKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2ZvcmNlX2Nsa19tX25fZGl2aXNvcnNfemVyb19uaWYwLkJDTTg4NjQwX0EwPTAKK2ZvcmNlX2Nsa19tX25fZGl2aXNvcnNfemVyb19mYWJyaWMwLkJDTTg4NjQwX0EwPTEKK2ZvcmNlX2Nsa19tX25fZGl2aXNvcnNfemVyb19jb21iMC5CQ004ODY0MF9BMD0wCisKK2NvbWJvX3JlZl9jbG9jay5CQ004ODY0MD0zMTI1MDAKKworbmlmX3JlZl9jbG9jay5CQ004ODY0MF9BMD0zMTI1MDAKKworIyBVc2UgdmFyaWFibGUgY2VsbCBzaXplCitzeXN0ZW1fY2VsbF9mb3JtYXQuQkNNODg2NDBfQTA9VkNTMTI4CisKKyMgQ29yZSBjbG9jayBzcGVlZCAoTUh6KQorY29yZV9jbG9ja19zcGVlZC5CQ004ODY0MF9BMD0zMDAKKworIyBNYXAgYmNtIGxvY2FsIHBvcnQgdG8gQ1BVL05JRiBpbnRlcmZhY2VzCit1Y29kZV9wb3J0XzAuQkNNODg2NDBfQTA9Q1BVLjAKK3Vjb2RlX3BvcnRfNzMuQkNNODg2NDBfQTA9Q1BVLjEKK3Vjb2RlX3BvcnRfNzQuQkNNODg2NDBfQTA9Q1BVLjIKK3Vjb2RlX3BvcnRfNzUuQkNNODg2NDBfQTA9Q1BVLjMKK3Vjb2RlX3BvcnRfNzYuQkNNODg2NDBfQTA9Q1BVLjQKK3Vjb2RlX3BvcnRfNzcuQkNNODg2NDBfQTA9Q1BVLjUKK3Vjb2RlX3BvcnRfNzguQkNNODg2NDBfQTA9Q1BVLjYKKworIyBJbnRlcmxha2VuIHBvcnRzIGJhc2ljIGNvbmZpZ3VyYXRpb24gKHRlbXBvcmFyeSkuCisjIFRoaXMgY29uZmlndXJhdGlvbiByZXBsYWNlcyB0aGUgYWJvdmUgWEFVSS9SWEFVSSBwb3J0cyBjb25maWcKKyMgVGhlIGZvbGxvd2luZyBQQiBkZXNpZ24gY29uc3RyYWludCBpcyBub3QgZW5mb3JjZWQgaW4gU1csIHNvIG11c3QgYmUgdGFrZW4KKyMgY2FyZSBvZiBoZXJlLCB3aGVuIG1hcHBpbmcgcG9ydHMgdG8gaW50ZXJmYWNlczoKKyMgICBJZiB1c2luZyBpbGtuMCwgcG9ydCAxIChpZiB1c2VkKSBtdXN0IGJlIG1hcHBlZCB0byBpbGtuMAorIyAgIElmIHVzaW5nIGlsa24xLCBwb3J0IDIgKGlmIHVzZWQpIG11c3QgYmUgbWFwcGVkIHRvIGlsa24xCisjICAgTm90ZSB0aGF0IGluIG91ciBkZWZhdWx0IG1hcHBpbmcsIHBvcnQgMiBpcyBtYXBwZWQgdG8gUlhBVUkgNiwgdGh1cyB3b24ndAorIyAgIHdvcmsuIElmIG9uZSB3YW50cyB0byB1c2UgZnJvbnQgcGFuZWwgcG9ydCAyIHdpdGggaWxrbjEsIGhlIHNob3VsZCBiZSBtYXAKKyMgICBSQVhVSTYgdG8gYSBwb3J0ICE9IDIuCisjaWxrbl9udW1fbGFuZXNfMC5CQ004ODY0MF9BMD0xMgorI3Vjb2RlX3BvcnRfMS5CQ004ODY0MF9BMD1JTEtOMC4wCisjdWNvZGVfcG9ydF8yLkJDTTg4NjQwX0EwPUlMS04wLjEKKyN1Y29kZV9wb3J0XzMuQkNNODg2NDBfQTA9SUxLTjAuMgorI2lsa25fbnVtX2xhbmVzXzEuQkNNODg2NDBfQTA9MTIKKyN1Y29kZV9wb3J0XzQuQkNNODg2NDBfQTA9UlhBVUk2CisjdWNvZGVfcG9ydF81LkJDTTg4NjQwX0EwPUlMS04xLjAKKyN1Y29kZV9wb3J0XzYuQkNNODg2NDBfQTA9SUxLTjEuMQorI3Vjb2RlX3BvcnRfNy5CQ004ODY0MF9BMD1JTEtOMS4yCisKKyMgRGVmYXVsdCBoZWFkZXIgdHlwZSBpcyBkZXJpdmVkIGZyb20gZmFwX2RldmljZV9tb2RlOiBJZiBmYXBfZGV2aWNlX21vZGUgaXMKKyMgUFAsIGRlZmF1bHQgaGVhZGVyIHR5cGUgaXMgRVRILiBPdGhlcndpc2UsIGRlZnVhbHQgaGVhZGVyIHR5cGUgaXMgVE0uCisjIEhlYWRlciB0eXBlIHBlciBwb3J0IGNhbiBiZSBvdmVycmlkZW4uCisjIEFsbCBvcHRpb25zOiBFVEgvUkFXL1RNL1BST0cvQ1BVL1NUQUNLSU5HL1RETS9URE1fUkFXL0lOSkVDVEVECisKKyMgU2V0IENQVSB0byB3b3JrIHdpdGggVE0gaGVhZGVyIChJVE1IKQorI3RtX3BvcnRfaGVhZGVyX3R5cGVfMC5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV9pbl8wLkJDTTg4NjQwX0EwPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8wLkJDTTg4NjQwX0EwPUNQVQordG1fcG9ydF9oZWFkZXJfdHlwZV83My5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83NC5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83NS5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83Ni5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83Ny5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83OC5CQ004ODY0MF9BMD1UTQorIyByZWN5Y2xpbmcgcG9ydAordG1fcG9ydF9oZWFkZXJfdHlwZV80MC5CQ004ODY0MF9BMD1SQVcKK3Vjb2RlX3BvcnRfNDAuQkNNODg2NDBfQTA9UkNZLjAKKworIyBFbmFibGUgRVJQIGFuZCBPTFAgcG9ydHMKK251bV9lcnBfdG1fcG9ydHMuQkNNODg2NDBfQTA9MQorbnVtX29scF90bV9wb3J0cy5CQ004ODY0MF9BMD0xCitudW1fcmVjeWNsZV90bV9wb3J0cy5CQ004ODY0MF9BMD0xCisKKyMgRHJhbSBjb25maWd1cmF0aW9uCisjIDYwMCBNaHoKK2V4dF9yYW1fcGxsX3IuQkNNODg2NDBfQTA9NAorZXh0X3JhbV9wbGxfZi5CQ004ODY0MF9BMD00NworZXh0X3JhbV9wbGxfcS5CQ004ODY0MF9BMD0xCitleHRfcmFtX2ZyZXEuQkNNODg2NDBfQTA9NjAwCisKKyMgRGJ1ZmYgc2l6ZQorIyBBbGxvd2VkIHZhbHVlczogMjU2LzUxMi8xMDI0LzIwNDguCitleHRfcmFtX2RidWZmX3NpemUuQkNNODg2NDBfQTA9MTAyNAorCisjIE51bWJlciBvZiBleHRlcm5hbCBEUkFNcy4KKyMgQWxsb3dlZCB2YWx1ZXMgZm9yIDg4eDR4OiAwLzIvMy80LzYuCisjIEFsbG93ZWQgdmFsdWVzIGZvciA4ODY1MDogMC8yLzMvNC82LzguCisjIGV4dF9yYW1fdG90YWxfc2l6ZSBiZWxvdyBhc3N1bWVkIHRoaXMgdmFsdWUgaXMgNiBmb3IgODh4NHggYW5kIDggZm9yCitleHRfcmFtX3ByZXNlbnQuQkNNODg2NDBfQTA9NgorCisjIERyYW0gdHlwZTogU2VsZWN0IE9OTFkgT05FIG9mIHRoZSBmb2xsb3dpbmcgRFJBTSB0eXBlcywgdG8gY29uZmlndXJlIGFsbCBkcmFtCisjIHJlbGF0ZWQgcGFyYW1ldGVyZXMgcGVyIHR5cGUuCisjIERyYW0gVHlwZSBmb3IgUGI6CitkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUo2NE0xNl8xNUUuQkNNODg2NDBfQTA9MQorI2RyYW1fdHlwZV9ERFIyX01JQ1JPTl9LNFQ1MTE2M1FFX1pDX0xGNy5CQ004ODY0MF9BMD0xCisjZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZFX0hDSzBfMTMzMy5CQ004ODY0MF9BMD0xCisjZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZFX0hDSzBfMTYwMC5CQ004ODY0MF9BMD0xCisjZHJhbV90eXBlX0dERFIzX1NBTVNVTkdfSzRKNTIzMjRRRS5CQ004ODY0MF9BMD0xCisjZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMTI4TTE2SEFfMTVFXzJHLkJDTTg4NjQwX0EwPTEKKworIyBRRFIgY29uZmlndXJhdGlvbgorIyBQYXJpdHkuIEFsbG93ZWQgdmFsdWVzOiBQQVJJVFkvRUNDLgorZXh0X3Fkcl9wcm90ZWN0aW9uX3R5cGUuQkNNODg2NDBfQTA9UEFSSVRZCitleHRfcWRyX3NpemVfbWJpdC5CQ004ODY0MF9BMD03MgorI1FEUiB0eXBlOiBRRFIvUURSMlAvUURSMy9OT05FLgorZXh0X3Fkcl90eXBlLkJDTTg4NjQwX0EwPVFEUgorCisjIFFEUiBjYW4gdXNlIHRoZSBjb3JlIGNsb2NrLCBvciB1c2luZyBpdCdzIG93biBwbGwuIEN1cnJlbnQgZXhhbXBsZSBpcyBmb3IgMjUwTUh6IHBsbCAoaWYgdXNlZCkuCisjIFFEUiB1c2luZyBvd24gcGxsIGNvbmZpZ3VyYXRpb24KKyNleHRfcWRyX3VzZV9jb3JlX2Nsb2NrX2ZyZXEuQkNNODg2NDBfQTA9MAorI2V4dF9xZHJfcGxsX20uQkNNODg2NDBfQTA9NAorI2V4dF9xZHJfcGxsX24uQkNNODg2NDBfQTA9NAorI2V4dF9xZHJfcGxsX3AuQkNNODg2NDBfQTA9MAorCisjIFFEUiB1c2luZyBjb3JlIGNsb2NrCitleHRfcWRyX3VzZV9jb3JlX2Nsb2NrX2ZyZXEuQkNNODg2NDBfQTA9MQorCisjQ29uZmlndXJlIE1ESU8uIElmIHBhcmFtZXRlciBpcyBub3QgZGVmaW5lZCwgTURJTyBpcyBkaXNhYmxlZC4KK21kaW9fY2xvY2tfZnJlcV9raHouQkNNODg2NDBfQTA9MTAwMAorCisjIFN0cmVhbWluZyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbgorc3RyZWFtaW5nX2lmX2VuYWJsZV90aW1lb3V0Y250LkJDTTg4NjQwX0EwPTEKK3N0cmVhbWluZ19pZl90aW1lb3V0X3ByZC5CQ004ODY0MF9BMD03MAorc3RyZWFtaW5nX2lmX3F1aWV0X21vZGUuQkNNODg2NDBfQTA9MAorc3RyZWFtaW5nX2lmX2Rpc2NhcmRfYmFkX3Bhcml0eS5CQ004ODY0MF9BMD0wCisKKyMgbWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgV1JFRCB0ZXN0cy4gMCAtIG1lYW5zIGlnbm9yZSBtYXggcGFja2V0IHNpemUuCitkaXNjYXJkX210dV9zaXplLkJDTTg4NjQwX0EwPTAKKworIyBtdWx0aWNhc3QgZWdyZXNzIHZsYW4gbWVtYmVyc2hpcCByYW5nZS4gQnkgZGVmYXVsdDogMC00MDk1LgorZWdyZXNzX211bHRpY2FzdF9kaXJlY3RfYml0bWFwX21pbi5CQ004ODY0MF9BMD0wCitlZ3Jlc3NfbXVsdGljYXN0X2RpcmVjdF9iaXRtYXBfbWF4LkJDTTg4NjQwX0EwPTQwOTUKKworIyBjb25maWd1cmUgZmxvdyBtYXBwaW5nIGJhc2UgdG8gMAorZmxvd19tYXBwaW5nX3F1ZXVlX2Jhc2UuQkNNODg2NDBfQTA9MAorCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzI1LkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMjYuQkNNODg2NDBfQTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8yNy5CQ004ODY0MF9BMD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzI4LkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMjkuQkNNODg2NDBfQTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zMC5CQ004ODY0MF9BMD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzMxLkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzIuQkNNODg2NDBfQTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zMy5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM0LkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzUuQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zNi5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM3LkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzguQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zOS5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQwLkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDEuQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80Mi5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQzLkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDQuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80NS5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQ2LkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDcuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80OC5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQ5LkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNTAuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl81MS5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzUyLkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNTMuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl81NC5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzU1LkJDTTg4NjQwX0EwPTIKKworIyBQb3dlciB1cCBzdGF0ZSAoRE9XTi9VUC9VUF9BTkRfUkVMT0NLKS4gQ2FuIGJlIGNvbmZpZ3VyZWQgcGVyIGxhbmUuCitwYl9zZXJkZXNfbGFuZV9wb3dlcl9zdGF0ZS5CQ004ODY0MF9BMD1VUF9BTkRfUkVMT0NLCisKKyMgU2VEZXMgbWVkaWEgdHlwZTogUHJlLWNvbmZpZ3VyYXRpb24gZm9yIHR4IHBhcmFtcywgYWNjb3JkaW5nIHRvCisjIG1lZGlhIHR5cGUuCisjIEFsbG93ZWQgdmFsdWVzOiBTSE9SVF9CQUNLUExBTkUvTE9OR19CQUNLUExBTkUvQ0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGUuQkNNODg2NDBfQTA9U0hPUlRfQkFDS1BMQU5FCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMjguQkNNODg2NDBfQTA9Q0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMjkuQkNNODg2NDBfQTA9Q0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMzAuQkNNODg2NDBfQTA9Q0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMzEuQkNNODg2NDBfQTA9Q0hJUDJDSElQCisKK3N5c3RlbV9pc19mZTE2MDBfaW5fc3lzdGVtLkJDTTg4NjQwX0EwPTAKKworIyBDb3VudGVyIGVuZ2luZSBjb25maWd1cmF0aW9uCitjb3VudGVyX2VuZ2luZV9zb3VyY2VfMS5CQ004ODY0MF9BMD0wCitjb3VudGVyX2VuZ2luZV9zdGF0aXN0aWNzXzEuQkNNODg2NDBfQTA9NAorY291bnRlcl9lbmdpbmVfc291cmNlXzIuQkNNODg2NDBfQTA9MQorY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18yLkJDTTg4NjQwX0EwPTQKKworIyBTdGF0aXN0aWMgUmVwb3J0aW5nCitzdGF0X2lmX2VuYWJsZT0wCisKKyMgQ2xvY2sgUGhhc2VzOiAwLzkwLzE4MC8yNzAKK3N0YXRfaWZfcGhhc2U9MAorCisjIFJhdGUgaW4gbm0KK3N0YXRfaWZfc3luY19yYXRlPTAKKworIyBUUlVFL0ZBTFNFCitzdGF0X2lmX3Bhcml0eV9lbmFibGU9RkFMU0UKKworIyBCSUxMSU5HL0ZBUDIwVgorc3RhdF9pZl9yZXBvcnRfbW9kZT1CSUxMSU5HCisKKyMgQmlsbGluZyBNb2RlCisjIEVHUl9RX05CL0NVRC9WU0lfVkxBTi9CT1RIX0xJRlMKK3N0YXRfaWZfcmVwb3J0X2JpbGxpbmdfbW9kZT1WU0lfVkxBTgorCisjIEZhcDIwViBNb2RlCisjIFFVRVVFL1BBQ0tFVAorc3RhdF9pZl9yZXBvcnRfZmFwMjB2X21vZGU9UVVFVUUKKworIyBRVUVVRV9OVU0vTUNfSUQgKG9ubHkgdmFsaWQgaW4gRmFwMjBWIFBBQ0tFVCBtb2RlKQorc3RhdF9pZl9yZXBvcnRfZmFwMjB2X2ZhYnJpY19tYz1RVUVVRV9OVU0KK3N0YXRfaWZfcmVwb3J0X2ZhcDIwdl9pbmdfbWM9UVVFVUVfTlVNCisKKyMgVFJVRS9GQUxTRSAob25seSB2YWxpZCBpbiBGYXAyMFYgUEFDS0VUIG1vZGUpCitzdGF0X2lmX3JlcG9ydF9mYXAyMHZfY25tX3JlcG9ydD1GQUxTRQorCisjIFRSVUUvRkFMU0UKK3N0YXRfaWZfcmVwb3J0X2ZhcDIwdl9jb3VudF9zbm9vcD1GQUxTRQorc3RhdF9pZl9yZXBvcnRfb3JpZ2luYWxfcGt0X3NpemU9RkFMU0UKK3N0YXRfaWZfcmVwb3J0X2ZhcDIwdl9zaW5nbGVfY29weV9yZXBvcnRlZD1GQUxTRQorCitzY2hhbl90aW1lb3V0X3VzZWMuQkNNODg2NDBfQTA9MzAwMDAwCisKKworcG9sbGVkX2lycV9tb2RlLkJDTTg4NjQwX0EwPTAKK3BvbGxlZF9pcnFfZGVsYXkuQkNNODg2NDBfQTA9MTAwMAorCisjIFNldCB0aGUgRlRNSCBMb2FkLUJhbGFuY2luZyBLZXkgZXh0ZW5zaW9uIG1vZGUKKyMgT3B0aW9ucyBmb3IgODg2NTA6IEVOQUJMRUQKKyMgT3B0aW9ucyBmb3IgODg2NDAgY29tcGF0aWJsZTogRElTQUJMRUQgLyA4Ql9MQl9LRVlfOEJfU1RBQ0tJTkdfUk9VVEVfSElTVE9SWSAvIDE2Ql9TVEFDS0lOR19ST1VURV9ISVNUT1JZCisjIERlZmF1bHQ6IERJU0FCTEVECitzeXN0ZW1fZnRtaF9sb2FkX2JhbGFuY2luZ19leHRfbW9kZS5CQ004ODY0MD1ESVNBQkxFRAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyNjZmcgZm9yIEJDTTg4NzUwCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmYWJyaWNfZGV2aWNlX21vZGUuQkNNODg3NTA9U0lOR0xFX1NUQUdFX0ZFMgorCitpc19kdWFsX21vZGUuQkNNODg3NTA9MAorc3lzdGVtX2lzX3Zjc18xMjhfaW5fc3lzdGVtLkJDTTg4NzUwPTAKKworc3lzdGVtX2lzX2R1YWxfbW9kZV9pbl9zeXN0ZW0uQkNNODg3NTA9MAorc3lzdGVtX2lzX3NpbmdsZV9tb2RlX2luX3N5c3RlbS5CQ004ODc1MD0xCisKK3N5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0uQkNNODg3NTA9MAorCitzeXN0ZW1fcmVmX2NvcmVfY2xvY2tfa2h6LkJDTTg4NzUwPTYwMDAwMAorCitmYWJyaWNfbWVyZ2VfY2VsbHMuQkNNODg3NTA9MAorZmFicmljX211bHRpY2FzdF9tb2RlLkJDTTg4NzUwPURJUkVDVAorZmFicmljX2xvYWRfYmFsYW5jaW5nX21vZGUuQkNNODg3NTA9Tk9STUFMX0xPQURfQkFMQU5DRQorZmFicmljX3RkbV9mcmFnbWVudC5CQ004ODc1MD0weDE4MAorIyNBbGxvd3Mgc2luZ2xlIHBpcGUgZGV2aWNlIHRvIHNlbmQgVERNIHRyYWZmaWMgb3ZlciB0aGUgZmFicmljIHByaW1hcnkgcGlwZSAtIGF2YWlsYWJsZSBmb3IgRmUxNjAwX0IwIG9ubHkKKyNjaGFuZ2UgIHZjczEyOF91bmljYXN0X3ByaW9yaXR5IHRvIGJlIGxvd2VyIHRoYW4gMiAtIHdoZW4gZW5hYmxpbmcKK2ZhYnJpY190ZG1fb3Zlcl9wcmltYXJ5X3BpcGUuQkNNODg3NTA9MAorZmFicmljX29wdGltaXplX3BhcnRpYWxfbGlua3MuQkNNODg3NTA9MAordmNzMTI4X3VuaWNhc3RfcHJpb3JpdHkuQkNNODg3NTA9MgorCitwb2xsZWRfaXJxX21vZGUuQkNNODg3NTA9MAorcG9sbGVkX2lycV9kZWxheS5CQ004ODc1MD0xMDAwCisKKyNTZWxlY3RzIGlmIHRvIHJ1biBNQklTVCAoTWVtb3J5IEJ1aWx0IEluIFNlbGYgVGVzdCkgb2YgaW50ZXJuYWwgbWVtb3J5ICh0YWJsZXMpIGR1cmluZyBzdGFydHVwLgorI1N1cHBvcnRlZCB2YWx1ZXM6IDA9ZG9uJ3QgcnVuLCAxPXJ1biwgMj1ydW4gd2l0aCBleHRyYSBsb2dzCisjYmlzdF9lbmFibGUuQkNNODg2NTA9MQorYmlzdF9lbmFibGUuQkNNODg3NTA9MQorI0hpZ2ggdm9sdGFnZSBkcml2ZXIgc3RyYXAuIElmIDAsIGNvbm5lY3RlZCB0byAxLjRWIHN1cHBseTsgaWYgMSwgY29ubmVjdGVkIHRvIDFWIG1vZGUuCisjZm9yIHNwZWNpZmljIHF1YWQgdXNlIHNyZF90eF9kcnZfaHZfZGlzYWJsZV9xdWFkX1ggd2hlcmUgWCBpcyAoRlNSRCBudW0gKiA0ICsgaW50ZXJuYWwgcXVhZCkKK3NyZF90eF9kcnZfaHZfZGlzYWJsZS5CQ004ODc1MD0wCitsb2FkX2Zpcm13YXJlLkJDTTg4NzUwPTIKKworIzAtTEZFQyAxLThiXDEwYiAyLUZFQyAzLUJFQworYmFja3BsYW5lX3NlcmRlc19lbmNvZGluZy5CQ004ODc1MD0yCisKKyNlbmFibGVcZGlzYWJsZSBDTDcyCitwb3J0X2luaXRfY2w3Mi5CQ004ODc1MD0wCisjQXZhbGlhYmxlIHNwZWVkcyBmb3IgQkNNODg3NTA6IDU3NTAsIDYyNTAsIDEwMzEyLCAxMTUwMCwgMTI1MDAKK3BvcnRfaW5pdF9zcGVlZC5CQ004ODc1MD0xMDMxMgorI0xDIFBMTCBpblxvdXQgMD0xMjVNSHogMT0xNTYuMjVNSHoKK3NlcmRlc19mYWJyaWNfY2xrX2ZyZXFfaW4uQkNNODg3NTA9MQorc2VyZGVzX2ZhYnJpY19jbGtfZnJlcV9vdXQuQkNNODg3NTA9MQorc2VyZGVzX21peGVkX3JhdGVfZW5hYmxlLkJDTTg4NzUwX0IwPTAKKworIyBWU0MxMjggb3IgVlNDMjU2CitmYWJyaWNfY2VsbF9mb3JtYXQuQkNNODg3NTA9VlNDMjU2CisKKyMgQ29yZSBjbG9jayBzcGVlZCAoTUh6KQorY29yZV9jbG9ja19zcGVlZF9raHouQkNNODg3NTA9NTMzMzMzCisKKyMjIENNSUMgaW50ZXJydXB0czoKKyMgRW5hYmxlOiBVc2UgaW50ZXJydXB0cyBjb21wbGV0aW9uIGluc3RlYWQgb2YgcG9sbGluZyBjb21wbGV0aW9uIGZvciB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMuCisjICAgICAgICAgT3B0aW9uczogMSAtIEVuYWJsZSwgMCAtIERpc2FibGUuIERlZmF1bHQ6IDAuCisjIFRpbWVvdXQ6IGRlbGF5IGluIE1pY3Jvc2Vjb25kIGJldHdlZW4gdGhlIHBvbGxpbmcsCisjIFNDSEFOOgorc2NoYW5faW50cl9lbmFibGUuQkNNODg3NTA9MAorc2NoYW5fdGltZW91dF91c2VjLkJDTTg4NzUwPTMwMDAwMAorIyBURE1BCit0ZG1hX2ludHJfZW5hYmxlLkJDTTg4NzUwPTAKK3RkbWFfdGltZW91dF91c2VjLkJDTTg4NzUwPTgwMDAwMDAwCisjIFRTTEFNCit0c2xhbV9pbnRyX2VuYWJsZS5CQ004ODc1MD0wCit0c2xhbV90aW1lb3V0X3VzZWMuQkNNODg3NTA9ODAwMDAwMDAKKyMgTUlJTQorbWlpbV9pbnRyX2VuYWJsZS5CQ004ODc1MD0wCittaWltX3RpbWVvdXRfdXNlYy5CQ004ODc1MD0zMDAwMDAKKworCisjI2luaXRpYWxpemF0aW9uIGZvciB3YXJtYm9vdAorc3RhYmxlX2xvY2F0aW9uLkJDTTg4NzUwPTMKK3N0YWJsZV9zaXplLkJDTTg4NzUwPTIwMDAwMAorc2NhY2hlX2ZpbGVuYW1lLkJDTTg4NzUwPWZlMTYwMF93YXJtYm9vdC5tZW0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbmZpZyB2YXJpYWJsZSBiZWxvdyBhcmUgb25seSBhY2Nlc3NlZCBmcm9tIGR1bmUuc29jLCBhbmQgYXJlIHVzZWQgdG8KKyMgY29uZmlndXJlIEJTUCAvIGV4YW1wbGUgYXBwbGljYXRpb24gLyBncm91cCBvZiBmb3JtYWwgY29uZmlnIHZhcmlhYmxlcy4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFN1cHBvcnQgKGFuZCBjb25maWd1cmUgb24gaW5pdCkgcGFja2V0IHByb2Nlc3NpbmcgZmVhdHVyZXMuCisjIElmIG5vdCBkZWZpbmVkIC0gb25seSB0cmFmZmljIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIGFyZSBlbmFibGVkLgorcGFja2V0X3Byb2Nlc3Npbmc9MQorCisjIyBQQ1AgKFBldHJhIENvLVByb2Nlc3NvcikgZmVhdHVyZXMKKyNwY3BfZWxrLkJDTTg4NjQwX0EwPTEKKyNwY3Bfb2FtLkJDTTg4NjQwX0EwPTEKKyNwY3BfZG1hLkJDTTg4NjQwX0EwPTEKKworIyMgU2V0L092ZXJyaWRlIFRETSByZWxhdGVkIGNvbmZpZyB2YXJpYWJsZXMKKyN0ZG0uQkNNODg2NDBfQTA9MQorCisjIElmIHNldCwgYWx3YXlzIGNvbmZpZ3VyZXMgc3ludGhlc2l6ZXJzLCBldmVuIGlmIHRoZSBjb25maWd1cmVkIHJhdGUgaXMKKyMgZXF1YWwgdG8KKyMgdGhlaXIgbm9taW5hbCByYXRlLiBDYW4gYmUgZGlzYWJsZWQgdG8gc3BlZWR1cCBicmluZ3VwIHRpbWUKKyMgKGtlZXAgaW4gbWluZCB0aGF0IGlmIGRpc2FibGVkLCBjaGFuZ2luZyBhIHN5bnQgdG8gYSBub24tbm9taW5hbCBmcmVxIGFuZAorIyB0aGFuIGJhY2sgdG8gbm9taW5hbCB3aWxsIG5vdCB3b3JrCisjc3ludF9vdmVyLkJDTTg4NjQwX0EwPTEKKworIyBMb2NhbCB2YXJpYWJsZXMgZm9yIGJvYXJkIHN5bnRoZXNpemVycyBmcmVxLiBGYWJyaWMsIGNvbWJvIGFuZCBuaWYgYWxzbyBjb25maWd1cmUKKyMgdGhlICpfcmVmX2Nsb2NrIHNvYyBwcm9wZXJ0aWVzIGZvciB0aGVzZSBmcmVxdWVuY2llcy4gY29yZSwgZGRyIGFuZCBwaHkgb25seQorIyBjb25maWd1cmVzIHRoZSBzeW50aGVzaXplcgorc3ludF9jb3JlLkJDTTg4NjQwX0EwPTEwMDAwMDAwMAorc3ludF9kZHIuQkNNODg2NDBfQTA9MTI1MDAwMDAwCitzeW50X3BoeS5CQ004ODY0MF9BMD0xNTYyNTAwMDAKKworIyMgU2NhY2hlIGluaXRpYWxpemF0aW9uIGZvciB3YXJtYm9vdCBwZXJzaXN0ZW50IHN0b3JhZ2UuCisjIyBWYWxpZCB2YWx1ZXM6IDI6IFN0b3JlIGluIGRyYW0uIDM6IFN0b3JlIGluIGEgZmlsZS4KK3N0YWJsZV9sb2NhdGlvbj0zCitzdGFibGVfZmlsZW5hbWU9Li93YXJtYm9vdF9kYXRhCitzdGFibGVfZmxhZ3M9MAorc3RhYmxlX3NpemU9MTAwMDAwMDAwMAorCisjIEJyaWRnZSBkZWZhdWx0IGxvZ2ljYWwgaW50ZXJmYWNlcyBhbGxvY2F0aW9uIElEUworbG9naWNhbF9wb3J0X2wyX2JyaWRnZS5CQ004ODY0MD0xCitsb2dpY2FsX3BvcnRfZHJvcC5CQ004ODY0MD0tMQorCisjbG9naWNhbF9wb3J0X21pbV9pbi5CQ004ODY0MD0yCisjbG9naWNhbF9wb3J0X21pbV9vdXQuQkNNODg2NDA9MworCisjIyBJUFY2IHR1bm5lbAorYmNtODg2eHhfaXB2Nl90dW5uZWxfZW5hYmxlPTEKKworIyMgSW5saWYgUHJvZmlsZSBNYW5hZ2VtZW50IE1vZGUgLSBRb1MgTDMgTDIgbWFya2luZyBtb2RlCisjCisjIEJDTTg4NjYwIE9OTFkKKyMKKyMgUW9TIEwzIEwyIG1hcmtpbmcgYWxsb3dzIGNoYW5naW5nIHRoZSBEU0NQIGFuZC9vciBFWFAgdmFsdWVzCisjIG9mIElQIGFuZC9vciBNUExTIHBhY2tldHMgYWNjb3JkaW5nIHRvIHRoZSBpbmNvbWluZyBwb3J0CisjIChvciBpbmxpZiksIGFuZCB0aGUgVHJhZmZpYyBDbGFzcy9Ecm9wIFByZWNlZGVuY2UuCisjCisjIFRoZSBpbmxpZiBwcm9maWxlIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgRFNDUC9FWFAgbWFya2luZy4KKyMgVGhpcyBTT0MgcHJvcGVydHkgY29udHJvbHMgd2hpY2ggbW9kZSBpcyB1c2VkIGZvciB0aGUgaW5saWYgcHJvZmlsZToKKyMgMTogQmFzaWMgbW9kZSAoMSBiaXQgb2YgdGhlIGlubGlmIHByb2ZpbGUgaXMgcmVzZXJ2ZWQgYW5kIGlzIHVzZWQgZm9yIHRoZSBEU0NQL0VYUCBtYXJraW5nKS4KKyMgMDogQWR2YW5jZWQgbW9kZSAodGhlIHVzZXIgY29udHJvbHMgd2hpY2ggaW5saWYgcHJvZmlsZSB2YWx1ZXMgcGVyZm9ybSBEU0NQL0VYUCBtYXJraW5nIGRpcmVjdGx5KS4KKyNiY204ODZ4eF9xb3NfbDNfbDJfbWFya2luZz0xCisKKyMjIFVuaWNhc3QgUlBGIG1vZGUgcGVyIFJJRgorIworIyBUaGlzIFNPQyBwcm9wZXJ0eSBhbGxvd3MgdGhlIHVzZXIgdG8gc2V0IHRoZSB1bmljYXN0IFJQRiBtb2RlIC0gbG9vc2UsIHN0cmljdCBvciBkaXNhYmxlZCAtIHBlciBSSUYuCisjIElmIGRpc2FibGVkLCB0aGUgdW5pY2FzdCBSUEYgbW9kZSBvZiBhIFJJRiBpcyBzZXQgZ2xvYmFsbHkuCisjIE9wdGlvbnM6IDAgLyAxCisKKyMgYmNtODg2eHhfbDNfaW5ncmVzc191cnBmX2VuYWJsZT0xCisKKyMjIEJPUyBoYW5kbGluZyBtb2RlCisjIEJDTTg4NjZYIE9OTFkKKyMKKyMgVGhlcmUgYXJlIHR3byB3YXlzIHRvIGhhbmRsZSBCT1MsIGNvbnRyb2xsZWQgYnkgYmNtODg2eHhfbXBsc190ZXJtaW5hdGlvbl9tb2RlOgorIyAwIC0gVXNlIEJPUyBhcyBrZXkgaW4gbG9va3VwLgorIyAxIC0gRG9uJ3QgdXNlIGl0IChleGNlcHQgZm9yIHJlc2VydmVkIGxhYmVscykuCisjCisjYmNtODg2eHhfbXBsc190ZXJtaW5hdGlvbl9rZXlfbW9kZT0wCisKKyMgQ29sb3IgcmVzb2x1dGlvbiBtb2RlIGFsbG93cyB0aGUgdXNlciB0byBoYXZlIG1vcmUgZGV0YWlsZWQgbWV0ZXJpbmcgY29sb3IgaW5mb3JtYXRpb24uCisjIEJDTTg4NjYwIE9OTFkKKyMKKyMgT3B0aW9uczogMC8xCisjIDA6IEEgcmVkIHJlc3VsdCBmcm9tIGJvdGggRXRoZXJuZXQgcG9saWNlciBhbmQgcG9saWNlciBpbXBsaWVzIERQPTMuCisjIDE6IEEgcmVkIHJlc3VsdCBmcm9tIHRoZSBwb2xpY2VyIGltcGxpZXMgdGhhdCBEUD0yLCB3aGlsZSBhIHJlZCByZXN1bHQgZnJvbSByYXRlIChFdGhlcm5ldCBwb2xpY2VyKSBpbXBsaWVzIERQPTMuCisjcG9saWNlcl9jb2xvcl9yZXNvbHV0aW9uX21vZGU9MQorCisjIyBJbmxpZiBQcm9maWxlIE1hbmFnZW1lbnQgTW9kZSAtIERpc2FibGUgU2FtZSBJbnRlcmZhY2UgRmlsdGVyCisjIEJDTTg4NjZYIE9OTFkKKyMKKyMgQ29udHJvbHMgd2hpY2ggbW9kZSBpcyB1c2VkIGZvciB0aGUgaW5saWYgcHJvZmlsZSBtYW5hZ2VtZW50LgorIyAxOiBCYXNpYyBtb2RlICgxIGJpdCBvZiB0aGUgaW5saWYgcHJvZmlsZSBpcyByZXNlcnZlZCBhbmQgaXMgdXNlZCBmb3IgdGhlIHNhbWUtaW50ZXJmYWNlIGZpbHRlcikuCisjIDA6IEFkdmFuY2VkIG1vZGUgKHRoZSB1c2VyIGNvbnRyb2xzIHdoaWNoIGlubGlmIHByb2ZpbGUgdmFsdWVzIGhhdmUgdGhlIHNhbWUtaW50ZXJmYWNlIGZpbHRlciBkaXNhYmxlZCBmb3IgdGhlbSkuCisjYmNtODg2eHhfbG9naWNhbF9pbnRlcmZhY2VfYnJpZGdlX2ZpbHRlcl9lbmFibGU9MQorCisjIyBEZWZhdWx0IEJsb2NrIEZvcndhcmRpbmcgU3RyZW5ndGgKKyMKKyMgQ29uZmlndXJlIHRoZSBkZWZhdWx0IGZvcndhcmRpbmcgc3RyZW5ndGggb2YgYmxvY2tzLgorIworIyBTT0MgUHJvcGVydGllczoKKyNibG9ja190cmFwX3N0cmVuZ3RoX3Z0dCAtIFZUVCBibG9jayBmb3J3YXJkaW5nIHN0cmVuZ3RoCisjYmxvY2tfdHJhcF9zdHJlbmd0aF9mbHAgLSBGTFAgYmxvY2sgZm9yd2FyZGluZyBzdHJlbmd0aAorI2Jsb2NrX3RyYXBfc3RyZW5ndGhfaGFzaCAtIFNMQiBibG9jayBmb3J3YXJkaW5nIHN0cmVuZ3RoIChCQ004ODY2WCBPTkxZKQorI2Jsb2NrX3RyYXBfc3RyZW5ndGhfcG1mXzAgLSBQTUYgMXN0IGxvb2t1cCBmb3J3YXJkaW5nIHN0cmVuZ3RoCisjYmxvY2tfdHJhcF9zdHJlbmd0aF9wbWZfMSAtIFBNRiAybmQgbG9va3VwIGZvcndhcmRpbmcgc3RyZW5ndGgKKyMKKyMgT3B0aW9uczogMC03CisKKyMjIFN0YXRlZnVsIExvYWQgQmFsYW5jaW5nCisjIEJDTTg4NjZYIE9OTFkKKyMKKyMgU3RhdGVmdWwgTG9hZCBCYWxhbmNpbmcgKFNMQikgYWxsb3dzIHRoZSBsb2FkIGJhbGFuY2luZyBvZiBFQ01QIGFuZCBMQUcKKyMgZ3JvdXBzIHRvIGJlY29tZSBzdGF0ZWZ1bC4KKyMgSW4gc3RhbmRhcmQgbG9hZCBiYWxhbmNpbmcsIHJlbW92aW5nIGEgbWVtYmVyIGZyb20gdGhlIEVDTVAvTEFHCisjIGdyb3VwIG1heSBhZmZlY3QgdGhlIHNlbGVjdGVkIG1lbWJlciwgc2luY2UgdGhlIGZvcm11bGEKKyMgZGVwZW5kcyBvbiBncm91cCBzaXplLgorIyBJbiBzdGF0ZWZ1bCBsb2FkIGJhbGFuY2luZyB0aGUgbWVtYmVyIGlzIHNlbGVjdGVkIG9uY2UgYW5kIHNhdmVkLgorIyBMYXRlciwgdGhlIG1lbWJlciBpcyBhbHdheXMgcmV0cmlldmVkLCBhbmQgZG9lcyBub3QgZGVwZW5kIG9uCisjIHRoZSBzaXplIG9mIHRoZSBMQUcvRUNNUCBncm91cC4KKyMKKyMgcmVzaWxpZW50X2hhc2hfZW5hYmxlIC0gRW5hYmxlL2Rpc2FibGUgU0xCLiBWYWx1ZXM6CisjIDEgLSBFbmFibGUgU0xCLgorIyAwIC0gRGlzYWJsZSBTTEIuCisjcmVzaWxpZW50X2hhc2hfZW5hYmxlPTEKKworCisjTWFrZSBBcmFkIFNPQyBwcm9wZXJ0aWVzIHdvcmsgZm9yIEFyYWQrLCBieSBtYXBwaW5nIHRoZSBCQ004ODY2MCBzdWZmaXggdG8gQkNNODg2NTAKK3NvY19mYW1pbHkuQkNNODg2NjA9QkNNODg2NTAKKyNNYWtlIEFyYWQgU09DIHByb3BlcnRpZXMgd29yayBmb3IgQXJkb24sIGJ5IG1hcHBpbmcgdGhlIEJDTTg4MjAyIHN1ZmZpeCB0byBCQ004ODY1MAorc29jX2ZhbWlseS5CQ004ODIwMj1CQ004ODY1MAorCisjIFVzZSBkaWZmZXJlbnQgbXltYWMgYWRkcmVzc2VzIGZvciBpcHY0IGFuZCBpcHY2IHdoZW4gdXNpbmcgdnJycCBmb3IgbXltYWMgdGVybWluYXRpb24uCisjbDNfdnJycF9pcHY2X2Rpc3RpbmN0PTEKKworIyBFbmFibGUgbXVsdGlwbGUgbXltYWMgdGVybWluYXRpb24gbW9kZS4gSW4gb3JkZXIgdG8gZW5hYmxlIGl0LCBhbHNvIHNldCAKKyMgbDNfdnJycF9pcHY2X2Rpc3RpbmN0PTAgYW5kIGwzX3ZycnBfbWF4X3ZpZD0wIHNpbmNlIHZycnAgYW5kCisjIG11bHRpcGxlIG15bWFjIG1vZGUgY2FuJ3QgY28gZXhpc3QuCisjbDNfbXVsdGlwbGVfbXltYWNfdGVybWluYXRpb25fZW5hYmxlPTEKKworIyBEaXN0aW5ndWlzaCBiZXR3ZWVuIGlwdjQgYW5kIGFsbCBvdGhlciBsMyBwcm90b2NvbHMgd2hlbiBtdWx0aXBsZSBteW1hYyB0ZXJtaW5hdGluZyAKKyNsM19tdWx0aXBsZV9teW1hY190ZXJtaW5hdGlvbl9tb2RlPTEKKworIyBVc3VhbGx5IHRoZSBmaW5hbCBEUCBnaXZlbiBieSB0aGUgbWV0ZXIgKG9yIHRoZSBJbi1EUCkgaXMgdW5jaGFuZ2VkLCBhbmQgY2FuIGJlIGZyb20gMC0zLgorIyBXaGVuIHRoaXMgU09DIHByb3BlcnR5IGlzIHNldCB0byAxLCB3aGVuIHRoZSBmaW5hbCBJTkdSRVNTIERQIGlzIDIsIGl0IGlzIG1hcHBlZCB0byAxIGluc3RlYWQsIAorIyBhbmQgdGh1cyBvbmx5IHRoZSB2YWx1ZXMgMC0xIGFuZCAzIGNhbiBiZSBvdXRwdXQuCisjIFRoaXMgaGFzIG5vIGVmZmVjdCB3aGVuIHBvbGljZXJfY29sb3JfcmVzb2x1dGlvbl9tb2RlPTEuCisjY3VzdG9tX2ZlYXR1cmVfYWx3YXlzX21hcF9yZXN1bHRfZHBfMl90b18xPTEKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIFdhcm1ib290ICYgU1cgU3RhdGUgIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK2hhX2h3X2pvdXJuYWxfc2l6ZT0xNTcyODY0MAoraGFfc3dfam91cm5hbF9zaXplPTE1NzI4NjQwCitoYV9jcmFzaF9yZWNvdmVyeT0xCisKKworIyBzdGFibGVfc2l6ZSAtIGEgc3RyaWN0IGJvdW5kIG9uIHRoZSBhcHBsaWNhdGlvbidzIGV4dGVybmFsIHN0b3JhZ2Ugc2l6ZQorc3RhYmxlX3NpemUuQkNNODg2NTA9MjgxMDAwMDAwCitzdGFibGVfc2l6ZT00MjAwMDAwMDAKKworIyBkZXRlcm1pbmUgdGhlIG1lbW9yeSBzaXplIHByZS1hbGxvY2F0ZWQgZm9yIHRoZSBTREsncyBTVyBTdGF0ZQorc3dfc3RhdGVfbWF4X3NpemUuQkNNODg2NTA9MTYwMDAwMDAwCitzd19zdGF0ZV9tYXhfc2l6ZT0zNTAwMDAwMDAKKworIyBzdGFibGUgbG9jYXRpb24KKyMjIHBhcnQgb2Ygc2NhY2hlIGluaXRpYWxpemF0aW9uIGZvciB3YXJtYm9vdCBwZXJzaXN0ZW50IHN0b3JhZ2UuCisjIyB2YWx1ZXM6IDEtMjpOb3QgVmFsaWQgZm9yIGRueCAzOiBTdG9yZSBpbiBhIGZpbGUgIDQ6IFVzZSBTaGFyZWQgTWVtLgorIyA0IGlzIHRoZSBwcmVmZmVyZWQgb3B0aW9uLCB1c2luZyAzIGZvciBBcmFkIGFuZCBGRSBpbiBvcmRlciB0byByZWdyZXNzIGJvdGggbW9kZXMuCisgc3RhYmxlX2xvY2F0aW9uLkJDTTg4NjUwPTMKKyBzdGFibGVfbG9jYXRpb24uQkNNODg2NjA9MworCisjCisjIEVuYWJsZSBMMyBTb3VyY2UgQmluZHMgZm9yIERQb0UgU0FWCisjCitsM19zb3VyY2VfYmluZF9tb2RlPUlQCitsM19zb3VyY2VfYmluZF9zdWJuZXRfbW9kZT1JUAoraXB2NF9udW1fdnJmcyA9IDQwOTYKKworIworIyBFbmFibGUgQVJQIGNoZWNraW5nIGZvciBMMyBTb3VyY2UgQmluZHMKKyMKKyMgVGhpcyBmZWF0dXJlIGlzIG5vdCBjdXJyZW50bHkgdXNlZC4KKyMKKyMgVmFsaWQgdmFsdWVzIGZvciBjdXN0b21fZmVhdHVyZV9sM19zb3VyY2VfYmluZF9hcnBfcmVsYXk6CisjICAgIDAgLSBkaXNhYmxlZAorIyAgICAxIC0gZG93bnN0cmVhbSBBUlAgY2hlY2tpbmcKKyMgICAgMiAtIHVwc3RyZWFtIEFSUCBjaGVja2luZworIyAgICAzIC0gYm90aCBkb3duc3RyZWFtIGFuZCB1cHN0cmVhbSBBUlAgY2hlY2tpbmcKKyMKKyNjdXN0b21fZmVhdHVyZV9sM19zb3VyY2VfYmluZF9hcnBfcmVsYXk9MgorCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2FyYWQvcmMuc29jIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9hcmFkL3JjLnNvYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMjAwM2EzCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9hcmFkL3JjLnNvYwpAQCAtMCwwICsxLDE4MTEgQEAKKyMgJElkOiByYy5zb2MsdiAxLjE5MiBCcm9hZGNvbSBTREsgJAorIyAkQ29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxNiBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyMgVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorIyBhbmQvb3IgaXRzIGxpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkCisjIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLAorIyB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkIGJldHdlZW4geW91IGFuZCBCcm9hZGNvbQorIyAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbiBhbiBBdXRob3JpemVkCisjIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAorIyB0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQKKyMgQnJvYWRjb20gZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZQorIyBhbmQgYWxsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFCisjIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRSBOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRQorIyBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWSBCUk9BRENPTSBBTkQgRElTQ09OVElOVUUKKyMgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuICAKKyMgIAorIyBFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIyAgCisjIDEuICAgICBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorIyBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyMgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwKKyMgYW5kIHRvIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mCisjIEJyb2FkY29tIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKyMgIAorIyAyLiAgICAgVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUworIyBQUk9WSURFRCAiQVMgSVMiIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLAorIyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwKKyMgT1IgT1RIRVJXSVNFLCBXSVRIIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZCisjIERJU0NMQUlNUyBBTlkgQU5EIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwKKyMgTk9OSU5GUklOR0VNRU5ULCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLAorIyBBQ0NVUkFDWSBPUiBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUgorIyBDT1JSRVNQT05ERU5DRSBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORworIyBPVVQgT0YgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyMgCisjIDMuICAgICBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwKKyMgQlJPQURDT00gT1IgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLAorIyBJTkNJREVOVEFMLCBTUEVDSUFMLCBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUgorIyBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWQorIyBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4gSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKKyMgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOyBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GCisjIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFIFNPRlRXQVJFIElUU0VMRiBPUiBVU0QgMS4wMCwKKyMgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORworIyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkgTElNSVRFRCBSRU1FRFkuJAorIworIyBJbml0aWFsaXphdGlvbiBSQyAocnVuIGNvbW1hbmRzKSBmaWxlCisjCisjICAgICAgIFRoZXNlIGFyZSBkZWZhdWx0IGNvbW1hbmRzIHRoYXQgYXJlIHJlYWQgYW5kIGV4ZWN1dGVkIGJ5IGRlZmF1bHQKKyMgICAgICAgd2hlbiBCQ00gYm9vdHMgdXAuICBUeXBpY2FsbHkgdGhpcyBmaWxlIGlzIGNhbGxlZCByYy5zb2MgYW5kIHJlc2lkZXMKKyMgICAgICAgaW4gdGhlIGZsYXNoIGZpbGVzeXN0ZW0sIE5WUkFNLCBvciBkaXNrLgorIworIyBCb2FyZCBDb25maWd1cmF0aW9uIFNldHRpbmcKKyMKKyMgICAgICAgVGhpcyBmaWxlIHVzZXMgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHRvIGtub3cgb24gd2hpY2ggYm9hcmQKKyMgICAgICAgaXQgaXMgcnVubmluZy4gIEN1cnJlbnRseSBvbmUgb2YgZm9sbG93aW5nIHNldHRpbmdzIG11c3QgYmUgbWFkZToKKyMKKyMgICAgICAgQkNNOTU2NzBLOCAgICAgICAgICBjb25maWcgYWRkIGhlcmM4PTEKKyMgICAgICAgQkNNOTU2OTBLMjQgICAgICAgICBjb25maWcgYWRkIGRyYWNvX2IyYj0xCisjICAgICAgIEJDTTk1NjkwSzI0UyAgICAgICAgY29uZmlnIGFkZCBkcmFjb19zdGs9MQorIyAgICAgICBCQ005NTY5MFIyNCAgICAgICAgIGNvbmZpZyBhZGQgZ2FsYWhhZD0xCisjICAgICAgIEJDTTk1NjkwUjI0UyAgICAgICAgY29uZmlnIGFkZCBtZXJsaW49MQorIyAgICAgICBCQ005NTY5MFI0OFMgICAgICAgIGNvbmZpZyBhZGQgbGFuY2Vsb3Q9MQorIyAgICAgICBCQ005NTY5MUsxMiAgICAgICAgIGNvbmZpZyBhZGQgZHJhY29fazEyPTEKKyMgICAgICAgV2hpdGUgS25pZ2h0ICAgICAgICBjb25maWcgYWRkIHdoaXRlX2tuaWdodD0xIChub3Qgc2hpcHBpbmcpCisjICAgICAgIEJsYWNrIEtuaWdodCAgICAgICAgY29uZmlnIGFkZCBibGFja19rbmlnaHQ9MSAobm90IHNoaXBwaW5nKQorIyAgICAgICBCQ005NTY3M0syUyAgICAgICAgIGNvbmZpZyBhZGQgdHdvbHlueD0xCisjICAgICAgIEJDTTk1NjczUjggICAgICAgICAgY29uZmlnIGFkZCBoZXJjdWx5bng9MQorIyAgICAgICBCQ005NTY3M1IyNFMgICAgICAgIGNvbmZpZyBhZGQgbHlueGFsaXR0bGU9MQorIyAgICAgICBCQ005NTY3M1I0OFMgICAgICAgIGNvbmZpZyBhZGQgbHlueGFsb3Q9MQorIyAgICAgICBCQ005NTY5NVAyNFNYXzEwICAgIGNvbmZpZyBhZGQgZ3VlbmV2ZXJlPTEKKyMgICAgICAgQkNNOTU2NTBLMjQgICAgICAgICBjb25maWcgYWRkIG1hZ251bT0xIChhdXRvbWF0aWMgZm9yIDU2NTBMKQorIyAgICAgICBCQ005NTY3NSAgICAgICAgICAgIGNvbmZpZyBhZGQgaGVyYzhfMTU9MQorIyAgICAgICBCQ005NTY1MFIyNCAgICAgICAgIGNvbmZpZyBhZGQgdHVjMjRfcmVmPTEKKyMgICAgICAgQkNNOTU2OTVQNDhMTSAgICAgICBjb25maWcgYWRkIGxtNDhwPTEKKyMgICAgICAgQkNNOTU2OTVQNDhMTS0xMCAgICBjb25maWcgYWRkIGxtNDhwX0I9MQorIyAgICAgICBCQ005NTY1MDRQNDhMTS0xMCAgIGNvbmZpZyBhZGQgbG00OHBfQz0xCisjICAgICAgIEJDTTk1NjUwNFA0OExNLTIwICAgY29uZmlnIGFkZCBsbTQ4cF9DPTEKKyMgICAgICAgQkNNOTU2NTA0UDQ4TE0tNTAgICBjb25maWcgYWRkIGxtNDhwX0Q9MQorIyAgICAgICBCQ005NTY1MDRQNDhQT0VSRUYgIGNvbmZpZyBhZGQgZmJwb2U9MQorIyAgICAgICBCQ005NTY1MDRQMjRSRUYgUDAgIGNvbmZpZyBhZGQgZmIyND0xCisjICAgICAgIEJDTTk1NjUwNFAyNCAgICBQMCAgY29uZmlnIGFkZCBmYjI0PTEKKyMgICAgICAgQkNNOTU2MTAyUDQ4ICAgICAgICBjb25maWcgYWRkIGZlbGl4NDg9MQorIyAgICAgICBCQ005NTMzMDBQMjRSRUYgICAgIGNvbmZpZyBhZGQgbWlyYWdlMjQ9MQorIyAgICAgICBCQ005NTY4MDBLMjBDICAgICAgIGNvbmZpZyBhZGQgYnJhZGxleV8xZz0xCisjICAgICAgIEJDTTk1NjcwMEsxNiAgICAgICAgY29uZmlnIGFkZCBodW12PTEKKyMgICAgICAgQkNNOTU2ODAwSzIwICAgICAgICBjb25maWcgYWRkIGJyYWRsZXk9MQorIyAgICAgICBCQ005NTY1ODBLMTYgICAgICAgIGNvbmZpZyBhZGQgZ29sZHdpbmc9MQorIyAgICAgICBCQ005NTYzMTRQMjRSRUYgICAgIGNvbmZpZyBhZGQgYmNtNTYzMTRwMjRyZWY9MQorIyAgICAgICBCQ005NTYwMjRQNDhSRUYgICAgIGNvbmZpZyBhZGQgQkNNOTU2MDI0UDQ4UkVGPTEKKyMgICAgICAgQkNNOTU2MjI0UDQ4UkVGICAgICBjb25maWcgYWRkIEJDTTk1NjIyNFA0OFJFRj0xCisjICAgICAgIEJDTTk1NjIyNFI1MFQgICAgICAgY29uZmlnIGFkZCBCQ005NTYyMjRSNTBUPTEKKyMgICAgICAgQkNNOTU2MDI0UjUwVCAgICAgICBjb25maWcgYWRkIEJDTTk1NjAyNFI1MFQ9MQorIyAgICAgICBCQ001NjgyMEsyNFhHICAgICAgIGNvbmZpZyBhZGQgQkNNNTY4MjBLMjRYRz0xCisjICAgICAgIEJDTTk1MzMxNFIyNEdTICAgICAgY29uZmlnIGFkZCBCQ005NTMzMTRSMjRHUz0xCisjICAgICAgIEJDTTk1MzMxNEsyNCAgICAgICAgY29uZmlnIGFkZCBCQ005NTMzMTRLMjQ9MQorIyAgICAgICBCQ005NTY4MjBSMjRYRyAgICAgIGNvbmZpZyBhZGQgQkNNOTU2ODIwUjI0WEc9MQorIyAgICAgICBCQ005NTYxNjBSICAgICAgICAgIGNvbmZpZyBhZGQgYmNtOTU2MTYwcj0xCisKK2lmICQ/QkNNNTYxNDZfQTAgXAorICAgICdsb2NhbCBCQ001NjE0NiAxJworCitpZiAkP0JDTTU2MTQ3X0EwIFwKKyAgICAnbG9jYWwgQkNNNTYxNDcgMScKKworCitpZiAkPzEgImVjaG8gcmM6IGFyZ3VtZW50cyBub3Qgc3VwcG9ydGVkOyBleGl0IgoraWYgISQ/dW5pdCAiZWNobyByYzogbm8gY3VycmVudCB1bml0OyBleGl0IgorCitlY2hvICJyYzogdW5pdCAkdW5pdCBkZXZpY2UgJGRldm5hbWUiCitsb2NhbCBxdWlldCBubworbG9jYWwgZWNobyBlY2hvCitsb2NhbCByY2RvbmUgXCRyYyR1bml0CitpZiAhImV4cHIgJHJjZG9uZSArIDAiICJsb2NhbCBlY2hvIG5vZWNobzsgbG9jYWwgcXVpZXQgeWVzIgorCisjIFNldCBjb252ZW5pZW5jZSBsb2NhbCB2YXJpYWJsZXMKKworIyBzaW11bGF0aW9uIHJlbGF0ZWQKKyNpZiAkP3BsaXNpbSBcCisjICAgICAgICJsb2NhbCBub19iY20gMSIKK2lmICQ/cXVpY2t0dXJuIHx8ICQ/cGxpc2ltIFwKKwkibG9jYWwgc2ltdWxhdG9yIDEiCisKKyMgYm9hcmQgcmVsYXRlZAoraWYgJD9nYWxhaGFkIFwKKwkibG9jYWwgZHJhY29fYjJiIDEiCitpZiAkP2JsYWNrX2tuaWdodCB8fCAkP3doaXRlX2tuaWdodCB8fCAkP21lcmxpbiBcCisJImxvY2FsIGRyYWNvX2hlcmM0IDEiCisKKyMgY2hpcCByZWxhdGVkCitpZiAkP1BFVFJBQl9BMCBcCisgICAgJ3JjbG9hZCBkdW5lLnNvYyA7IGV4aXQnCisKKyNpZiAkP1FVWF9BMCBcCisjICAgICdlY2hvIGJsYWJsYWJsYTtkZXIgMHg0MCA0IDsgZXhpdCcKKworaWYgJD9GTEFJUl9BMCBcCisgICAgJ2VjaG8gYmxhYmxhYmxhO2RlciAweDQwIDQgOyBleGl0JworCitpZiAkP0JDTTg4NzUwX0EwIHx8ICQ/QkNNODg3NTBfQjAgfHwgJD9CQ004ODc1M19BMCB8fCAkP0JDTTg4NzUzX0IwIHx8ICQ/QkNNODg3NTJfQTAgfHwgJD9CQ004ODc1Ml9CMCB8fCAgJD9CQ004ODc1NV9CMCB8fCAkP0JDTTg4NzU0X0EwIHx8ICQ/QkNNODg3NzBfQTEgfHwgJD9CQ004ODc3M19BMSB8fCAkP0JDTTg4Nzc0X0ExIHx8ICQ/QkNNODg3NzVfQTEgfHwgJD9CQ004ODc3Nl9BMSB8fCAkP0JDTTg4OTUwX0EwIHx8ICQ/QkNNODg5NTBfQTEgfHwgJD9CQ004ODk1M19BMSB8fCAkP0JDTTg4OTU0X0ExIHx8ICQ/QkNNODg5NTVfQTEgfHwgJD9CQ004ODk1Nl9BMSB8fCAkP0JDTTg4OTUyX0EwIHx8ICQ/QkNNODg5NTJfQTEgfHwgJD9CQ004ODc3Ml9BMSBcCisgICAgJ3JjbG9hZCBkZmUuc29jIDsgZXhpdCcKKworaWYgJD9BUkFEX0EwIHx8ICQ/QVJBRF9CMCB8fCAkP0FSQURfQjEgfHwgJD9BUkFEUExVU19BMCB8fCAkP0JDTTg4NjUwX0EwIHx8ICQ/QkNNODg2NTBfQjAgfHwgJD9CQ004ODY1MF9CMSB8fCAkP0JDTTg4NjUyX0EwIHx8ICQ/QkNNODg2NTJfQjAgfHwgJD9CQ004ODM1MF9CMSB8fCAkP0JDTTg4MzUxX0IxIHx8IFwKKyAgICQ/QkNNODg0NTBfQjEgfHwgJD9CQ004ODQ1MV9CMSB8fCAkP0JDTTg4NTUwX0IxIHx8ICQ/QkNNODg1NTFfQjEgfHwgJD9CQ004ODU1Ml9CMSB8fCAkP0JDTTg4NjUxX0IxIHx8ICQ/QkNNODg2NTRfQjEgfHwgJD9CQ004ODY2MF9BMCB8fCAkP0JDTTg4MzYwX0EwIHx8ICQ/QkNNODgzNjFfQTAgfHwgJD9CQ004ODM2M19BMCB8fFwKKyAgICQ/QkNNODg0NjBfQTAgfHwgJD9CQ004ODQ2MV9BMCB8fCAkP0JDTTg4NTYwX0EwIHx8ICQ/QkNNODg1NjFfQTAgfHwgJD9CQ004ODU2Ml9BMCB8fCAkP0JDTTg4NjYxX0EwIHx8ICQ/QkNNODg2NjRfQTAgIFwKKyAgICAncmNsb2FkIGFyYWQuc29jIDsgIHJjbG9hZCBycGMuc29jIDsgZXhpdCcKKworaWYgJD9CQ004ODg1MF9QMyBcCisgICAgJ2V4aXQnCisKK2lmICQ/UUFYX0EwIHx8ICQ/QkNNODg0NzBQX0EwIHx8ICQ/QkNNODg0NzBfQTAgfHwgJD9CQ004ODQ3ME1fQTAgfHwgJD9CQ004ODQ3MVBfQTAgfHwgJD9CQ004ODQ3MV9BMCB8fCAkP0JDTTg4NDcyX0EwIHx8IFwKKyAkP0JDTTg4NDczX0EwIHx8ICQ/QkNNODg0NzFEX0EwIHx8ICQ/QkNNODg0NzZQX0EwIHx8ICQ/QkNNODg0NzZfQTAgfHwgJD9CQ004ODQ3NkRfQTAgfHwgJD9CQ004ODQ3NlRfQTAgfHwgJD9CQ004ODQ3N19BMCAgXAorICAgICdzZXRlbnYgUUFYIDEnCisgICAgCitpZiAkP1FVWF9BMCB8fCAkP0JDTTg4MjcwX0EwIFwKKyAgICAnc2V0ZW52IFFVWCAxJworCitpZiAkP0pFUklDSE9fQTAgfHwgICQ/QkNNODg2NzBfQTAgfHwgJD9CQ004ODY3MV9BMCB8fCAkP0JDTTg4NjcxTV9BMCB8fCAkP0JDTTg4NjcyX0EwIHx8ICQ/QkNNODg2NzNfQTAgfHwgJD9CQ004ODY3NF9BMCB8fCAkP0JDTTg4Njc1X0EwIHx8ICQ/QkNNODg2NzVNX0EwIHx8ICQ/QkNNODg2NzZfQTAgfHwgJD9CQ004ODY3Nk1fQTAgfHwgJD9CQ004ODY3OF9BMCB8fCAkP0JDTTg4Njc5X0EwIHx8IFwKKyAgICQ/SkVSSUNIT19BMSB8fCAgJD9CQ004ODY3MF9BMSB8fCAkP0JDTTg4NjcxX0ExIHx8ICQ/QkNNODg2NzFNX0ExIHx8ICQ/QkNNODg2NzJfQTEgfHwgJD9CQ004ODY3M19BMSB8fCAkP0JDTTg4Njc0X0ExIHx8ICQ/QkNNODg2NzVfQTEgfHwgJD9CQ004ODY3NU1fQTEgfHwgJD9CQ004ODY3Nl9BMSB8fCAkP0JDTTg4Njc2TV9BMSB8fCAkP0JDTTg4Njc4X0ExIHx8ICQ/QkNNODg2NzlfQTEgfHwgXAorICAgJD9RTVhfQTAgICAgIHx8ICAkP0JDTTg4MzcwX0EwIHx8ICQ/QkNNODgzNzFfQTAgfHwgJD9CQ004ODM3MU1fQTAgfHwgJD9CQ004ODM3NV9BMCB8fCAkP0JDTTg4Mzc2X0EwIHx8ICQ/QkNNODgzNzZNX0EwIHx8ICQ/QkNNODgzNzdfQTAgfHwgJD9CQ004ODM3OF9BMCB8fCAkP0JDTTg4Mzc5X0EwIHx8IFwKKyAgICQ/UU1YX0ExICAgICB8fCAgJD9CQ004ODM3MF9BMSB8fCAkP0JDTTg4MzcxX0ExIHx8ICQ/QkNNODgzNzFNX0ExIHx8ICQ/QkNNODgzNzVfQTEgfHwgJD9CQ004ODM3Nl9BMSB8fCAkP0JDTTg4Mzc2TV9BMSB8fCAkP0JDTTg4Mzc3X0ExIHx8ICQ/QkNNODgzNzhfQTEgfHwgJD9CQ004ODM3OV9BMSB8fCBcCisgICAkP0pFUklDSE9fQjAgfHwgICQ/QkNNODg2NzBfQjAgfHwgJD9CQ004ODY3MV9CMCB8fCAkP0JDTTg4NjcxTV9CMCB8fCAkP0JDTTg4NjcyX0IwIHx8ICQ/QkNNODg2NzNfQjAgfHwgJD9CQ004ODY3NF9CMCB8fCAkP0JDTTg4Njc1X0IwIHx8ICQ/QkNNODg2NzVNX0IwIHx8ICQ/QkNNODg2NzZfQjAgfHwgJD9CQ004ODY3Nk1fQjAgfHwgJD9CQ004ODY3OF9CMCB8fCAkP0JDTTg4Njc5X0IwIHx8ICQ/QkNNODg2ODBfQTAgfHwgXAorICAgJD9RTVhfQjAgICAgIHx8ICAkP0JDTTg4MzcwX0IwIHx8ICQ/QkNNODgzNzFfQjAgfHwgJD9CQ004ODM3MU1fQjAgfHwgJD9CQ004ODM3NV9CMCB8fCAkP0JDTTg4Mzc2X0IwIHx8ICQ/QkNNODgzNzZNX0IwIHx8ICQ/QkNNODgzNzdfQjAgfHwgJD9CQ004ODM3OF9CMCB8fCAkP0JDTTg4Mzc5X0IwIHx8ICQ/QkNNODgzNzlfQTEgfHwgXAorICAgJD9KRVJQTFVTICAgIHx8ICAkP0JDTTg4NjgwX0EwIHx8ICAkP0JDTTg4NjgyX0EwIHx8ICQ/QkNNODg2ODNfQTAgfHwgICQ/QkNNODgzODFfQTAgfHwgJD9CQ004ODM4Ml9BMCB8fCAkP0JDTTg4Mzg1X0EwIHx8ICQ/QkNNODg2ODZfQTAgXAorICAgICdyY2xvYWQgamVyLnNvYyA7IGV4aXQnCisKK2lmICQ/UUFYIHx8ICQ/UVVYXAorICAgICdyY2xvYWQgcWF4LnNvYyA7IGV4aXQnCisKKworaWYgJD9CQ004ODIwMl9BMCB8fCAkP0FSRE9OX0EwIHx8ICQ/QkNNODgyMDJfQTEgfHwgJD9BUkRPTl9BMSB8fCAkP0JDTTg4MjAyX0EyIHx8ICQ/QVJET05fQTJcCisgICAgJ3JjbG9hZCBhdG1mLnNvYyA7IGV4aXQnCisKK2lmICQ/QUNQIFwKKyAgICAnZXhpdCcKKworaWYgJD9CQ004ODY5MF9BMFwKKyAgICAnZXhpdCcKKyAgICAgICAgCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHg1NjUwIiBcCisJImxvY2FsIG1hZ251bSAxIgoraWYgJD9kcmFjIHx8ICQ/ZHJhYzE1IFwKKwkibG9jYWwgZHJhY19hbnkgMSIKK2lmICQ/bHlueCB8fCAkP2x5bngxNSBcCisJImxvY2FsIGx5bnhfYW55IDEiCitpZiAkP3R1Y2FuYSB8fCAkP21hZ251bSBcCisJImxvY2FsIHR1Y2FuYV9hbnkgMSIKK2lmICQ/aGVyYyB8fCAkP2hlcmMxNSBcCisJImxvY2FsIGhlcmNfYW55IDEiCitpZiAkP2ZpcmVib2x0IHx8ICQ/ZmlyZWJvbHQyIHx8ICQ/aGVsaXggfHwgXAorICAgJD9mZWxpeCB8fCAkP2hlbGl4MTUgfHwgJD9mZWxpeDE1IHx8ICQ/cmFwdG9yIHx8ICQ/cmF2ZW4gfHwgJD9oYXdrZXllXAorCSJsb2NhbCBmaXJlYm9sdF9hbnkgMSIKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI1MDEiIFwKKwkibG9jYWwgZmlyZWJvbHRfMTB4NCAxIgoraWYgJD9lYXN5cmlkZXIgXAorCSJsb2NhbCBlYXN5cmlkZXJfYW55IDEiCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjAyIiBcCisJImxvY2FsIGVhc3lyaWRlcl8xeDEgMSIKK2lmICQ/YnJhZGxleSB8fCAkP2h1bXYgfHwgJD9nb2xkd2luZyBcCisJImxvY2FsIGJyYWRsZXlfYW55IDEiCitpZiAkP2RyYWNfYW55IHx8ICQ/bHlueF9hbnkgfHwgJD90dWNhbmFfYW55IFwKKwkibG9jYWwgeGdzMTJfc3dpdGNoIDEiCitpZiAkP2ZpcmVib2x0X2FueSB8fCAkP2Vhc3lyaWRlcl9hbnkgfHwgJD9icmFkbGV5X2FueSBcCisJImxvY2FsIHhnczNfc3dpdGNoIDEiCitpZiAkP3hnczEyX3N3aXRjaCB8fCAkP3hnczNfc3dpdGNoIFwKKwkibG9jYWwgeGdzX3N3aXRjaCAxIgoraWYgJD9oZXJjX2FueSBcCisJImxvY2FsIHhnc19mYWJyaWMgMSIKK2lmICQ/eGdzX2ZhYnJpYyB8fCAkP3hnc19zd2l0Y2ggXAorCSJsb2NhbCB4Z3MgMSIKK2lmICEkP3hncyBcCisJImxvY2FsIHN0cmF0YSAxIgoraWYgJD9zdHJhdGEgJiYgISQ/Z3NsIFwKKwkibG9jYWwgUEJNUF9BTEwgMHgwYmZmZmZmZiIKK2lmICQ/c3RyYXRhICYmICQ/Z3NsIFwKKwkibG9jYWwgUEJNUF9BTEwgMHgwODAwMDBmZiIKK2lmICQ/QkNNNTYyMTRfQTAgfHwgJD9CQ001NjAxNF9BMCB8fCAkP0JDTTU2MjE1X0EwIHx8IFwKKyAgICQ/QkNNNTYyMTRfQTEgfHwgJD9CQ001NjAxNF9BMSB8fCAkP0JDTTU2MjE1X0ExICYmIFwKKyAgICEkP0JDTTk1NjAyNFA0OFJFRiBcCisJImxvY2FsIHJhcDI0X3JlZiAxIgorCitpZiAkP0JDTTU2NTVfQTAgfHwgJD9CQ001NjU1X0IwIFwKKyAgICAgICAgImxvY2FsIHR1Y2FuYV9ub2hnIDEiCisKK2lmICQ/QkNNOTU2MDI0UDQ4UkVGIHx8ICQ/QkNNOTU2MjI0UDQ4UkVGIHx8ICQ/QkNNOTU2MDI0UjUwVCB8fCBcCisgICAkP0JDTTk1NjIyNFI1MFQgXAorICAgICAgICAibG9jYWwgcmF2ZW5fZWJfNDhwIDEiCisKK2lmICQ/QkNNOTUzMzE0UjI0R1MgXAorICAgICAgICAibG9jYWwgaGF3a2V5ZV9wMjQgMSIKKworaWYgJD9CQ005NTMzMTRLMjQgXAorICAgICAgICAibG9jYWwgaGF3a2V5ZV9rMjQgMSIKKworaWYgJD9maXJlYm9sdF9hbnkgJiYgJD9sbTQ4cCB8fCAkP2xtNDhwX0QgXAorICAgICAgICAiY29uZmlnIGFkZCBsbWZiNDg9MSIKKworIyBTZXQgc29mdHdhcmUncyB3YWl0IGZvciBTLUNoYW5uZWwgcmVzcG9uc2UgdG8gMyBzZWNvbmRzIGZvciBRdWlja1R1cm4KKyMgKFJlY29tbWVuZCBhdCBsZWFzdCAxMCBzZWNvbmRzIGlmIHRoZSBBUkwgaXMgMTAwJSBidXN5IHdpdGggaW5zZXJ0cy4pCitpZiAkP3F1aWNrdHVybgkic3RpbWVvdXQgMzAwMDAwMCIKK2lmICQ/cGxpc2ltCSJzdGltZW91dCA2MDAwMDAwMCIKKworIyBEaXJlY3QgcGh5IGxlZCBwcm9ncmFtbWluZzogNTQ2NCBhY3Rpdml0eSBsZWQgYmVjb21lcyBsaW5rL2FjdGl2aXR5CitpZiAkP2RyYWNfYW55ICYmICQ/bGFuY2Vsb3QgfHwgJD9seW54YWxvdCB8fCAkP2d1ZW5ldmVyZSBcCisJImNvbmZpZyBhZGQgcGh5X2xlZF9jdHJsPTB4MTgiCisKKyMgU2h1dGRvd24gdGhyZWFkcyBpZiBzeXN0ZW0gaXMgYWxyZWFkeSBydW5uaW5nCitpZiAkP3RyaXVtcGgzIFwKKwkiaWJvZFN5bmMgb2ZmIgorY291bnRlciBvZmYKK2xpbmtzY2FuIG9mZgoraWYgJD9mZWF0dXJlX2FybF9oYXNoZWQgJiYgISQ/c2ltdWxhdG9yIFwKKyAgICAgICAgImwybW9kZSBvZmYiCitpZiAkP2ZlYXR1cmVfY2VzICYmICQ/QkNNNTY0NDBfQTAgXAorICAgICAgICAiY2VzIG9mZiIKKworIyBUZXN0IG9uLWNoaXAgbWVtb3J5IGJlZm9yZSBpbml0aWFsaXppbmcKKyNpZiAhJD9zaW11bGF0b3IgImluaXQgc29jOyBiaXN0IGwzIGFybCBjYnAiCitpbml0IHNvYworCisjIEluaXRpYWxpemUgbWlzY2VsbGFuZW91cyBjaGlwIHJlZ2lzdGVycworaW5pdCBtaXNjCisKKyMgSW5pdGlhbGl6ZSBleHRlcm5hbCBUQ0FNIGlmIG5lY2Vzc2FyeQorIyBOT1RFIDogdGNhbSBpcyBpbml0aWFsaXplZCBkdXJpbmcgImluaXQgbWlzYyIgdW5sZXNzIAorIyAgICAgICAgdGNhbV9yZXNldF90b2dnbGUgPSAxIGlzIGNvbmZpZ3VyZWQKK2lmICJleHByICRyY2RvbmUgKyAwIiAmJiAhImV4cHIgJHRjYW1fcmVzZXRfdG9nZ2xlICsgMCIgXAorICAgICAgICAiZGlzcGF0Y2ggYXR0YWNoIDAgZXN3IDAiCitpZiAhImV4cHIgJHRjYW1fcmVzZXRfdG9nZ2xlICsgMCIgIm11eHNlbCAwOyBtdXhzZWwgMHg4MCIKK2lmICEiZXhwciAkdGNhbV9yZXNldF90b2dnbGUgKyAwIiAiaW5pdCB0Y2FtOyAkZWNobyByYzogVENBTSBpbml0aWFsaXplZCIKKworIyBJbml0aWFsaXplIHRoZSBTdHJhdGFTd2l0Y2ggTU1VIHJlZ2lzdGVycworaW5pdCBtbXUKK2lmICQ/a2F0YW5hMiBcCisgICBrdDJjb25maWcuc29jCisKKworIyBVbmNvbW1lbnQgdG8gdHVybiBvZmYgU2luZ2xlLUJpdCBFcnJvciByZXBvcnRpbmcgb24gNTY3MAorI2lmICQ/aGVyYyAibSBtbXVfaW50Y250bCBwcF9zYmVfZW49MCIKKworIyBJbml0aWFsaXplIENlbGwgRnJlZSBBZGRyZXNzIFBvb2wKKyMgTk9URTogdGhpcyBzaG91bGQgTk9UIGJlIGRvbmUgdW5sZXNzIGNoaXAgaXMga25vd24gdG8gaGF2ZSBiYWQgQ0ZBUAorIyBtZW1vcnkgZW50cmllcyB0aGF0IG5lZWQgdG8gYmUgbWFwcGVkIG91dC4KK2lmICQ/Y2ZhcF90ZXN0cyAiJGVjaG8gcmM6IEluaXRpYWxpemluZyBDRkFQOyBjZmFwaW5pdCIKKworJGVjaG8gcmM6IE1NVSBpbml0aWFsaXplZAorCisjCisjIExvYWQgdUtlcm5lbAorIworCisjIFBpY2sgZGVmYXVsdCBGVyBuYW1lcyBpZiBub3Qgc2V0IGFscmVhZHkgYnkgY29uZmlnCitpZiAhJD9md19jb3JlXzAgXAorICAgICdsb2NhbCBmd19jb3JlXzAgJHtmd19wcmVmaXh9XzBfYmZkX2JoaC5zcmVjOyBcCisgICAgIGlmICQ/Z3JleWhvdW5kIHx8ICQ/aHVycmljYW5lMiB8fCAkP2h1cnJpY2FuZTMgImxvY2FsIGZ3X2NvcmVfMCAke2Z3X3ByZWZpeH1fMF9wdHBmdWxsLnNyZWMiOyBcCisgICAgIGlmICQ/Y2FsYWRhbjMgImxvY2FsIGZ3X2NvcmVfMCAke2Z3X3ByZWZpeH1fMC5zcmVjIjsgXAorICAgICBpZiAkP2hlbGl4NCAmJiAhJD9mZWF0dXJlX2JoaCAibG9jYWwgZndfY29yZV8wICR7ZndfcHJlZml4fV8wX2JmZC5zcmVjIjsgXAorICAgICBpZiAkP2hlbGl4NCAmJiAkP2ZlYXR1cmVfYmhoICJsb2NhbCBmd19jb3JlXzAgJHtmd19wcmVmaXh9XzBfYmZkX2JoaC5zcmVjIjsgXAorICAgICBpZiAkP3RvbWFoYXdrICYmICEkP2ZlYXR1cmVfYmhoICJsb2NhbCBmd19jb3JlXzAgJHtmd19wcmVmaXh9XzBfYmZkLnNyZWMiOyBcCisgICAgIGlmICQ/dHJpZGVudDJwbHVzICYmICEkP2ZlYXR1cmVfYmhoICJsb2NhbCBmd19jb3JlXzAgJHtmd19wcmVmaXh9XzBfYmZkLnNyZWMiOyBcCisgICAgJworCitpZiAhJD9md19jb3JlXzEgXAorICAgJ2xvY2FsIGZ3X2NvcmVfMSAke2Z3X3ByZWZpeH1fMV9wdHBmdWxsLnNyZWM7IFwKKyAgICBpZiAkP2NhbGFkYW4zICJsb2NhbCBmd19jb3JlXzEgJHtmd19wcmVmaXh9XzFfYnMuc3JlYyI7IFwKKyAgICcKKworaWYgISQ/ZndfY29yZV8yIFwKKyAgICJsb2NhbCBmd19jb3JlXzIgJHtmd19wcmVmaXh9XzJfZXRoX2xtZG0uc3JlYyIKKworIyBMb2FkIHRoZSBmaXJtd2FyZXMKK2lmICQ/ZmVhdHVyZV9jbWljbSAmJiAhJD9yY3B1X29ubHkgJiYgISRpaG9zdF9tb2RlICYmICEkP2ZlYXR1cmVfaXByb2MgXAorICAgICJtY3Nsb2FkIDAgJHtmd19jb3JlXzB9IEluaXRNQ1M9dHJ1ZTsgXAorICAgICBtY3Nsb2FkIDEgJHtmd19jb3JlXzF9OyIKKworaWYgJD9odXJyaWNhbmUyIFwKKyAgICJtY3Nsb2FkIDAgJHtmd19jb3JlXzB9IEluaXRNQ1M9dHJ1ZTsiCisKK2lmICQ/ZmVhdHVyZV9pcHJvYyAmJiAhJD9odXJyaWNhbmUyICYmICEkP2h1cnJpY2FuZTMgJiYgISQ/cmNwdV9vbmx5ICYmICEkP2ZlYXR1cmVfdWNfbWhvc3QgJiYgISRpaG9zdF9tb2RlXAorICAgICJtY3Nsb2FkIDAgJHtmd19jb3JlXzB9IEluaXRNQ1M9dHJ1ZSBUd29TdGFnZT10cnVlIFR3b1N0YWdlQWRkcj0weDYwMDAwMDAwO1wKKyAgICAgbWNzbG9hZCAxICR7ZndfY29yZV8xfSBUd29TdGFnZT10cnVlIFR3b1N0YWdlQWRkcj0weDYwMDJjMDAwOyIKKworaWYgJD9mZWF0dXJlX2lwcm9jICYmICEkP3JjcHVfb25seSAmJiAkP2ZlYXR1cmVfdWNfbWhvc3QgJiYgJD9udW1fdWNzXAorICAgICdpZiAhImV4cHIgJG51bV91Y3MgPiAwIiAibWNzbG9hZCAwICR7ZndfY29yZV8wfSBJbml0TUNTPXRydWUiOyBcCisgICAgIGlmICEiZXhwciAkbnVtX3VjcyA+IDEiICJtY3Nsb2FkIDEgJHtmd19jb3JlXzF9IjsgXAorICAgICBpZiAhImV4cHIgJG51bV91Y3MgPiAyIiAibWNzbG9hZCAyICR7ZndfY29yZV8yfSI7JworCisjCisjIEluaXQgQ0xJIGFuZCBCQ00gQVBJCisjCisjIFRoaXMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSByYXcgcmVnaXN0ZXIgd3JpdGVzIHRvIGF2b2lkIGhhdmluZyBzdGF0ZQorIyBjbG9iYmVyZWQuICBOT1RFOiBUYWJsZXMgYXJlIGNsZWFyZWQgYnkgImluaXQgYmNtIiBiZWxvdy4gIElmCisjIHRhYmxlIG1vZGlmaWNhdGlvbnMgYXJlIHJlcXVpcmVkLCBwdXQgdGhlbSBhZnRlciAiaW5pdCBiY20iLiAgU29tZQorIyByZWdpc3RlcnMgbWlnaHQgYWxzbyBiZSBhZmZlY3RlZC4KKyMKKworaWYgISQ/bm9fYmNtIFwKKwkiaW5pdCBiY207IFwKKwkgJGVjaG8gcmM6IEJDTSBkcml2ZXIgaW5pdGlhbGl6ZWQiCisKK2lmICQ/bm9fYmNtIFwKKwkiJGVjaG8gcmM6ICoqKiBOT1QgaW5pdGlhbGl6aW5nIEJDTSBkcml2ZXIgKioqIgorCitpZiAkP25vX2JjbSAmJiAkP3N0cmF0YSBcCisgICAgJ3dyaXRlIHZ0YWJsZSAwIDEgVkxBTl9UQUc9MCxQT1JUX0JJVE1BUD0wLFVUX1BPUlRfQklUTUFQPTA7IFwKKyAgICAgaW5zZXJ0IHZ0YWJsZSBWTEFOX1RBRz0xLFBPUlRfQklUTUFQPSRQQk1QX0FMTCxVVF9QT1JUX0JJVE1BUD0kUEJNUF9BTEw7IFwKKyAgICAgbG9jYWwgcHYgXAorICAgICAgICAgVkxBTl9UQUc9MSxTUF9TVD0zLFBPUlRfQklUTUFQPSRQQk1QX0FMTCxVVF9QT1JUX0JJVE1BUD0kUEJNUF9BTEw7IFwKKwkgd3JpdGUgcHRhYmxlIDAgMzIgUFRZUEU9MDsgXAorCSBpZiAhJD9nc2wgIndyaXRlIHB0YWJsZSAwIDI0ICRwdixQVFlQRT0xIjsgXAorCSBpZiAhJD9nc2wgIndyaXRlIHB0YWJsZSAyNCAyICRwdixQVFlQRT0yIjsgXAorCSBpZiAkP2dzbCAgIndyaXRlIHB0YWJsZSAwIDggJHB2LFBUWVBFPTIiOyBcCisJIHdyaXRlIHB0YWJsZSAyNyAxICRwdixQVFlQRT0zOyBcCisgICAgIGxvY2FsIHB2JworCisjIFR1cm4gb24gbWlycm9yaW5nIG9mIGhhcmR3YXJlIEFSTCBvcGVyYXRpb25zIGludG8gc29mdHdhcmUgQVJMIHRhYmxlLgoraWYgJD9mZWF0dXJlX2FybF9zb3J0ZWQgXAorCSJhcmxtb2RlIGludHJfZG1hOyBcCisJICRlY2hvIHJjOiBBUkwgRE1BIHNoYWRvd2luZyBlbmFibGVkIgorCitpZiAkP2ZlYXR1cmVfYXJsX2hhc2hlZCAmJiAhJD9zaW11bGF0b3IgJiYgISQ/cmNwdV9vbmx5IFwKKwkibDJtb2RlIGludGVydmFsPTMwMDAwMDA7IFwKKwkgJGVjaG8gcmM6IEwyIFRhYmxlIHNoYWRvd2luZyBlbmFibGVkIgorCisjIElmIHJ1bm5pbmcgQkNNIGxpYnJhcnksIHN0YXJ0IGxpbmtzY2FuIHRhc2sgYW5kIHNldCBwb3J0IG1vZGVzCisKK2lmICEkP25vX2JjbSAmJiAhJD9yY3B1X29ubHkgXAorCSJsaW5rc2NhbiAyNTAwMDA7IFwKKwkgcG9ydCBmZSxnZSBsaW5rc2Nhbj1vbiBhdXRvbmVnPW9uIFwKKwkJc3BlZWQ9MCBmdWxsZHVwbGV4PXRydWUgdHhwYXVzZT10cnVlIHJ4cGF1c2U9dHJ1ZTsgXAorCSBwb3J0IHN0IGxpbmtzY2FuPW9uIHR4cGF1c2U9ZmFsc2UgcnhwYXVzZT1mYWxzZTsgXAorICAgICAgICAgcG9ydCB4ZSxjZSBsaW5rc2Nhbj1vbiBhdXRvbmVnPW9mZiBcCisgICAgICAgICAgICAgICAgc3BlZWQ9MCBmdWxsZHVwbGV4PXRydWUgdHhwYXVzZT10cnVlIHJ4cGF1c2U9dHJ1ZTsgXAorICAgICAgICAgcG9ydCBoZyBsaW5rc2Nhbj1vbiBmdWxsZHVwbGV4PXRydWUgdHhwYXVzZT1mYWxzZSByeHBhdXNlPWZhbHNlOyBcCisJICRlY2hvIHJjOiBQb3J0IG1vZGVzIGluaXRpYWxpemVkIgorCitpZiAhJD9ub19iY20gJiYgJD9yY3B1X29ubHkgXAorCSJsaW5rc2NhbiAyNTAwMDA7IFwKKwkgcG9ydCBlIGxpbmtzY2FuPW9uOyBcCisJIHBvcnQgc3QgbGlua3NjYW49b247IFwKKyAgICAgcG9ydCB4ZSBsaW5rc2Nhbj1vbjsgXAorCSAkZWNobyByYzogUG9ydCBtb2RlcyBpbml0aWFsaXplZCIKKworaWYgISQ/bm9fYmNtICYmICQ/c2hhZG93IFwKKyAgICAgInBvcnQgaWwgbGlua3NjYW49b247IFwKKwkgICRlY2hvIHJjOiBJbnRlcmxha2VuIFBvcnQgbW9kZSBpbml0aWFsaXplZCIKKworIyBTZWxlY3RpdmVseSByZS1lbmFibGUgQXV0byBOZWdvdGlhdGlvbiBiYXNlZCBvbiBjb25maWcgcG9ydF9mb3JjZV9hbl9saXN0LgorI2lmICQ/cG9ydF9mb3JjZV9hbl9saXN0IFwKKyMgICAgInBvcnQgJHBvcnRfZm9yY2VfYW5fbGlzdCBhdXRvbmVnPW9uIgorCisjIE5vIHNwYW5uaW5nIHRyZWUgaXMgcnVubmluZywgc28gcHV0IHBvcnRzIGFsbCBpbiB0aGUgZm9yd2FyZGluZyBzdGF0ZQorIyBzdHAgc3VwcG9ydCBub3QgYXZhaWxhYmxlIGZvciBzaGFkb3cgZGV2aWNlLgorCitpZiAhJD9ub19iY20gJiYgISQ/c2hhZG93IFwKKwkic3RnIHN0cCAxIGFsbCBmb3J3YXJkIgorCisjIFN0YXJ0IGNvdW50ZXIgdGFzayB1bmxlc3MgYWxyZWFkeSBzdGFydGVkIGJ5ICJpbml0IGJjbSIgYWJvdmUuCitpZiAkP3BsaXNpbSAibG9jYWwgZG1hIGZhbHNlIgoraWYgISQ/cGxpc2ltICJsb2NhbCBkbWEgdHJ1ZSIKK2lmICQ/ZGV2aWNlX2ViX3ZsaSAibG9jYWwgZG1hIGZhbHNlIgoraWYgJD9ub19iY20gJiYgISQ/cmNwdV9vbmx5XAorCSJjb3VudGVyIEludGVydmFsPTEwMDAgUGJtPWFsbCBEbWE9JGRtYTsgXAorCSAkZWNobyByYzogQ291bnRlciBjb2xsZWN0aW9uIGVuYWJsZWQiCitpZiAkP3JjcHVfb25seSBcCisJImNvdW50ZXIgSW50ZXJ2YWw9MjAwMDAwMCBQYm09YWxsIERtYT1mYWxzZTsgXAorCSAkZWNobyByYzogQ291bnRlciBjb2xsZWN0aW9uIGVuYWJsZWQiCisKKyMgUmVzeW5jaHJvbml6ZSB0aGUgc2F2ZWQgdmFsdWVzIGtlcHQgYnkgdGhlICdzaG93IGNvdW50ZXInIGNvbW1hbmQuCitpZiAhJD9zaW11bGF0b3IgXAorICAgICJjb3VudGVyIHN5bmMiCisKKyMgQnkgZGVmYXVsdCwgZHVtcCBkYXRhIG9mIHBhY2tldHMgdGhhdCBnbyB0byBDUFUuCitpZiAhJD90ZXN0aW5pdCBcCisJInB3IHJlcG9ydCArcmF3IgorCisjIERlZmF1bHQgTEVEIHByb2Nlc3NvciBwcm9ncmFtIGZvciB2YXJpb3VzIFNES3MgYW5kIHJlZmVyZW5jZSBkZXNpZ25zLgorIyBTb3VyY2UgY29kZSBjYW4gYmUgZm91bmQgaW4gJFNESy9sZWQvZXhhbXBsZXMuCisKK2lmICEkP3A0OCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIDdGIDY3IDJGIDY3IDZCIDA2IDdGIDgwIEQyIDFBIDc0IDAxIDEyIFwKKyA3RSA4NSAwNSBEMiAwRiA3MSAxOSA1MiAwMCAxMiA3RCA4NSAwNSBEMiAxRiA3MSBcCisgMjMgNTIgMDAgMTIgN0MgODUgMDUgRDIgMDUgNzEgMkQgNTIgMDAgM0EgNjggMzIgXAorIDAwIDk3IDc1IDNCIDEyIEEwIEZFIDdGIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDQ3IFwKKyAxMiBCQSBGRSA3RiAwMiAwQSA1MCAxMiBCQSBGRSA3RiA5NSA3NSA1OSA4NSAxMiBcCisgQTAgRkUgN0YgOTUgNzUgQTggODUgNzcgOUEgMTIgQTAgRkUgN0YgOTUgNzUgNjMgXAorIDg1IDc3IEExIDE2IDdDIERBIDAyIDcxIEExIDc3IEE4IDMyIDA1IDk3IDcxIDc2IFwKKyAwNiA3RCBEMiAwMSA3MSA5QSAwNiA3RiA2NyA5MyA3NSA5QSAzMiAwMiA5NyA3MSBcCisgOUEgMzIgMDMgOTcgNzEgQTggMzIgMDQgOTcgNzUgQTEgMDYgN0UgRDIgMDcgNzEgXAorIEExIDc3IEE4IDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IFwKKyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciCQkjIHNkazU2MDUuaGV4CisKK2lmICQ/cDQ4ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgN0YgNjcgNDMgNjcgM0MgNjcgMzUgNjcgMkYgMDYgN0YgODAgRDIgXAorIDE4IDc0IDAxIDI4IDYwIDdGIDY3IDlCIDY3IDg5IDY3IEJGIDY3IDgzIDY3IDNDIFwKKyA2NyA3MyA2NyA2OCA2NyA1RCAwNiA3RiA4MCBEMiAxQSA3NCAxMyAzQSA3MCA2NyBcCisgQUQgNzEgQzMgNzcgQkYgMzIgMDMgOTcgNzEgQzMgNzcgQkYgMzIgMDUgOTcgNzEgXAorIEMzIDc3IEJGIDEyIEJBIEZFIDdGIDMyIDAxIDk3IDc1IDRGIDAyIDA2IDUwIDMyIFwKKyAwMCA5NyA3NSA1NyAwMiAwNiA1MCA5NSA3NSBDMyA4NSA3NyBCRiA2NyBBRCA3NSBcCisgQkYgMzIgMDQgOTcgNzEgQzMgNzcgQkYgNjcgQUQgNzUgQkYgMzIgMDMgOTcgNzEgXAorIEMzIDc3IEJGIDY3IEFEIDc1IEJGIDMyIDAzIDk3IDcxIEJGIDMyIDA0IDk3IDcxIFwKKyBCRiA3NyBDMyA2NyBCNiA3MSBDMyA3NyBCRiAxMiBBMCBGRSA3RiAzMiAwMCA5NyBcCisgNzUgOTUgMDIgMDYgNTAgOTUgNzUgQzMgODUgNzcgQkYgMTIgQkEgRkUgN0YgMzIgXAorIDAxIDk3IDc1IEE3IDAyIDA2IDUwIDk1IDc1IEMzIDg1IDc3IEJGIDA2IDdGIDEyIFwKKyA4MCBGOCAxNSAxQSAwMCA1NyAwNiA3RiAxMiA4MCBGOCAxNSAxQSAwNyA1NyAzMiBcCisgMEYgODcgNTcgMzIgMEUgODcgNTcnIgkJCQkJIyBwNDguaGV4CisKK2lmICQ/aGVyYyAmJiAhJD9ibGFja19rbmlnaHQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMSA2NyAzNiAyOSAzMiAwOCBENyA4NyAzMiAwNyBENyA4NyAzMiAwMSBENyBcCisgODcgMzIgMDAgRDcgODcgODAgRDIgMDkgNzQgMDIgODYgN0YgMDYgN0YgQzIgMDcgXAorIDc0IDI0IDg2IDdFIDE2IDdFIENBIDA3IEUwIDE3IDBEIDEyIDA4IDk4IDI3IEQ3IFwKKyA4NyA5MSA3NCAyRCAzQSAyOCAxMCBEQSAwNyA3NSAzRSBGQSAwMiA1NyBFQSAwNiBcCisgNTcnIgkJCQkJCQkjIHNkazU2NzAuaGV4CisKK2lmICQ/aGVyYyAmJiAkP2JsYWNrX2tuaWdodCAibG9jYWwgbGVkY29kZSAnXAorIDJBIDAzIDMyIDA4IEQ3IDg3IDMyIDA3IEQ3IDg3IDMyIDAxIEQ3IDg3IDMyIDAwIFwKKyBENyA4NyAyQSAwNiAzMiAwOCBENyA4NyAzMiAwNyBENyA4NyAzMiAwMSBENyA4NyBcCisgMzIgMDAgRDcgODcgM0EgMDgnIgkJCQkJIyBrbmlnZ2V0LmhleAorCitpZiAkP2RyYWNfYW55ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgNEUgNjcgOEEgMDYgQzMgODAgRDIgMEMgNzQgMDEgMjggXAorIDYwIEMzIDMyIDAwIEQ3IDg3IDMyIDAxIEQ3IDg3IDMyIDA3IEQ3IDg3IDMyIDA4IFwKKyBENyA4NyAzMiAwRiA4NyAzMiAwRiA4NyAzMiAwRiA4NyAzMiAwRiA4NyAxMiBDMiBcCisgODUgMDUgRDIgMEYgNzEgMzggNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgNzEgNDIgXAorIDUyIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDRDIDUyIDAwIDNBIDM4IDMyIDAwIFwKKyA5NyA3NSA1QSAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA2NiAxMiBcCisgQUQgRkUgQzMgMDIgMEEgNTAgMTIgQUQgRkUgQzMgOTUgNzUgNzggODUgMTIgQTAgXAorIEZFIEMzIDk1IDc1IEMwIDg1IDc3IEI5IDEyIEEwIEZFIEMzIDk1IDc1IDgyIDg1IFwKKyA3NyBDNyAxNiBDMCBEQSAwMiA3MSBDNyA3NyBDMCAzMiAwNSA5NyA3MSA5QSAzMiBcCisgMDIgOTcgNzEgQjkgMDYgQzEgRDIgMDEgNzEgQjkgMDYgQzMgNjcgQjIgNzUgQjkgXAorIDMyIDAzIDk3IDcxIEMwIDMyIDA0IDk3IDc1IEM3IDA2IEMyIEQyIDA3IDcxIEM3IFwKKyA3NyBDMCAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyBcCisgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIgkJIyBzZGs1NjkwLmhleAorCitpZiAkP2RyYWNvX2sxMiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDBCIEEyIDAxIDI4IEEyIDAxIDYwIEMzIDY3IDMyIDY3IDZFIDA2IEMzIDkwIFwKKyA3NSAwMiAxMiBDMiA4NSAwNSBEMiAwRiA3MSAxQyA1MiAwMCAxMiBDMSA4NSAwNSBcCisgRDIgMUYgNzEgMjYgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgMzAgNTIgMDAgXAorIDNBIDMwIDMyIDAwIDk3IDc1IDNFIDEyIEEwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIFwKKyA5NyA3NSA0QSAxMiBBQyBGRSBDMyAwMiAwQSA1MCAxMiBBQyBGRSBDMyA5NSA3NSBcCisgNUMgODUgMTIgQTAgRkUgQzMgOTUgNzUgQTYgODUgNzcgOUYgMTIgQTAgRkUgQzMgXAorIDk1IDc1IDY2IDg1IDc3IEFEIDE2IEMwIERBIDAyIDcxIEFEIDc3IEE2IDMyIDA1IFwKKyA5NyA3MSA3RSAzMiAwMiA5NyA3MSA5RiAwNiBDMSBEMiAwMSA3MSA5RiAwNiBDMyBcCisgNjcgOTYgNzUgOUYgMzIgMDMgOTcgNzEgQTYgMzIgMDQgOTcgNzUgQUQgMDYgQzIgXAorIEQyIDA3IDcxIEFEIDc3IEE2IDEyIDgwIEEyIDAxIEY4IDE1IDFBIDAwIDU3IDMyIFwKKyAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyBcCisgMzIgMEUgODcgNTcnIgkJCQkJCSMgazEyLTU2OTAuaGV4CisKK2lmICQ/aGVyYyAmJiAkP3doaXRlX2tuaWdodCAibG9jYWwgbGVkY29kZSAnXAorIDJBIDAzIDY3IDBBIDJBIDA2IDY3IDBBIDNBIDA4IDMyIDA4IEQ3IDg3IDMyIDA3IFwKKyBENyA4NyAzMiAwMSBENyA4NyAzMiAwMCBENyA4NyA1NyciCQkJIyB3azU2NzAuaGV4CisKK2lmICQ/aGVyYyAmJiAkP21lcmxpbiAibG9jYWwgbGVkY29kZSAnXAorIDJBIDAzIDY3IDBBIDJBIDA2IDY3IDBBIDNBIDA4IDMyIDA4IEQ3IDg3IDMyIDAwIFwKKyBENyA4NyAzMiAwMSBENyA4NyAzMiAwNyBENyA4NyA1NyciCQkJIyBtZXJsaW41NjcwLmhleAorCitpZiAkP2hlcmMgJiYgJD9sYW5jZWxvdCAibG9jYWwgbGVkY29kZSAnXAorIDJBIDA1IDY3IDEyIDJBIDA2IDY3IDEyIDJBIDAzIDY3IDEyIDJBIDA0IDY3IDEyIFwKKyAzQSAxMCAzMiAwOCBENyA4NyAzMiAwMCBENyA4NyAzMiAwMSBENyA4NyAzMiAwNyBcCisgRDcgODcgNTcnIgkJCQkJCSMgbGFuY2Vsb3QuaGV4CisKK2lmICQ/eGdzX2ZhYnJpYyAmJiAkP2d1ZW5ldmVyZSAibG9jYWwgbGVkY29kZSAnXAorIDJBIDA0IDY3IDBBIDJBIDA1IDY3IDBBIDNBIDA0IDMyIDA3IEQ3IDg3IDMyIDAwIFwKKyAzMiAwMSBCNyBENyA4NyA1NyciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBndWVuZXZlcmU1NjcwLmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/d2hpdGVfa25pZ2h0ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgMmYgNjcgNkIgMDYgQzMgODAgRDIgMEMgNzQgMDEgMTIgXAorIEMyIDg1IDA1IEQyIDBGIDcxIDE5IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIFwKKyAyMyA1MiAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAyRCA1MiAwMCAzQSAzMCAzMiBcCisgMDAgOTcgNzUgM0IgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDcgXAorIDEyIEFDIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDU5IDg1IDEyIFwKKyBBMCBGRSBDMyA5NSA3NSBBOCA4NSA3NyA5QSAxMiBBMCBGRSBDMyA5NSA3NSA2MyBcCisgODUgNzcgQTEgMTYgQzAgREEgMDIgNzEgQTEgNzcgQTggMzIgMDUgOTcgNzEgN0IgXAorIDMyIDAyIDk3IDcxIDlBIDA2IEMxIEQyIDAxIDcxIDlBIDA2IEMzIDY3IDkzIDc1IFwKKyA5QSAzMiAwMyA5NyA3MSBBOCAzMiAwNCA5NyA3NSBBMSAwNiBDMiBEMiAwNyA3MSBcCisgQTEgNzcgQTggMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgXAorIDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIJCSMgd2s1NjkwLmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/bWVybGluICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgMkYgNjcgNkIgMDYgQzMgODAgRDIgMEMgNzQgMDEgMTIgXAorIEMyIDg1IDA1IEQyIDBGIDcxIDE5IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIFwKKyAyMyA1MiAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAyRCA1MiAwMCAzQSAzMCAzMiBcCisgMDAgOTcgNzUgM0IgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDcgXAorIDEyIEFDIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDU5IDg1IDEyIFwKKyBBMCBGRSBDMyA5NSA3NSBBOCA4NSA3NyA5QSAxMiBBMCBGRSBDMyA5NSA3NSA2MyBcCisgODUgNzcgQTEgMTYgQzAgREEgMDIgNzEgQTEgNzcgQTggMzIgMDUgOTcgNzEgN0IgXAorIDMyIDAyIDk3IDcxIDlBIDA2IEMxIEQyIDAxIDcxIDlBIDA2IEMzIDY3IDkzIDc1IFwKKyA5QSAzMiAwMyA5NyA3MSBBOCAzMiAwNCA5NyA3NSBBMSAwNiBDMiBEMiAwNyA3MSBcCisgQTEgNzcgQTggMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgXAorIDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3JyIJCSMgbWVybGluNTY5MC5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP2dhbGFoYWQgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBDMyA2NyAyRiA2NyA2QiAwNiBDMyA4MCBEMiAwQyA3NCAwMSAxMiBcCisgQzIgODUgMDUgRDIgMEYgNzEgMTkgNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgNzEgXAorIDIzIDUyIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDJEIDUyIDAwIDNBIDMwIDMyIFwKKyAwMCA5NyA3NSAzQiAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NyBcCisgMTIgQUMgRkUgQzMgMDIgMEEgNTAgMTIgQUMgRkUgQzMgOTUgNzUgNTkgODUgMTIgXAorIEEwIEZFIEMzIDk1IDc1IEE4IDg1IDc3IDlBIDEyIEEwIEZFIEMzIDk1IDc1IDYzIFwKKyA4NSA3NyBBMSAxNiBDMCBEQSAwMiA3MSBBMSA3NyBBOCAzMiAwNSA5NyA3MSA3QiBcCisgMzIgMDIgOTcgNzEgOUEgMDYgQzEgRDIgMDEgNzEgOUEgMDYgQzMgNjcgOTMgNzUgXAorIDlBIDMyIDAzIDk3IDcxIEE4IDMyIDA0IDk3IDc1IEExIDA2IEMyIEQyIDA3IDcxIFwKKyBBMSA3NyBBOCAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyBcCisgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcnIgkJIyBnYWxhaGFkLmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/bG0gImxvY2FsIGxlZGNvZGUgJ1wKK0UwIDI4IDYwIEMzIDY3IDJEIDA2IEMzIDgwIEQyIDBDIDc0IDAxIDEyIEMyIDg1IFwKKzA1IEQyIDBGIDcxIDE3IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIDIxIDUyIFwKKzAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDJCIDUyIDAwIDNBIDE4IDMyIDAwIDk3IFwKKzc1IDM5IDEyIEEwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDQ1IDEyIEFDIFwKK0ZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDVGIDg1IDEyIEEwIEZFIFwKK0MzIDk1IDcxIDVDIDE2IEMwIERBIDAyIDcxIEE2IDc3IEI0IDg1IDc3IDc3IDEyIFwKK0EwIEZFIEMzIDk1IDc1IDZGIDg1IDE2IEMwIERBIDAyIDcxIEE2IDc3IEFEIDE2IFwKK0MwIERBIDAyIDcxIEFEIDc3IEI0IDMyIDA1IDk3IDcxIDgyIDA2IEMxIEQyIDAxIFwKKzcxIEE2IDA2IEMzIDY3IDlGIDc1IEE2IDMyIDAyIDk3IDcxIEE2IDMyIDAzIDk3IFwKKzcxIEI0IDMyIDA0IDk3IDc1IEFEIDA2IEMyIEQyIDA3IDcxIEFEIDc3IEI0IDEyIFwKKzgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IFwKKzMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgICAgICAjIGxtNTY5MC5oZXgKKworaWYgJD90d29seW54ICJsb2NhbCBsZWRjb2RlICdcCisgMkEgMDEgNjcgMEEgMkEgMDAgNjcgMEEgM0EgMDggMzIgMDggRDcgODcgMzIgMDAgXAorIEQ3IDg3IDMyIDAxIEQ3IDg3IDMyIDA3IEQ3IDg3IDU3JyIgICAgICAgICAgICAgICAgICMgdHdvbHlueC5oZXgKKworaWYgJD9seW54X2FueSAmJiAkP2hlcmN1bHlueCB8fCAkP2x5bnhhbG90IHx8ICQ/bG0gfHwgJD9ndWVuZXZlcmUgXAorCSJsb2NhbCBsZWRjb2RlICdcCisxMiBDMCA4NSAwNSBEMiAwMyA3MSAwQSA1MiAwMCAyQSAwMCA2NyAxMCAzQSAwNCBcCiszMiAwOCBENyA4NyAwNiBDMCBEMiAwMSA3MSAyMiAzMiAwRiA4NyAzMiAwRiA4NyBcCis3NyAyQSAzMiAwMCBENyA4NyAzMiAwMSBENyA4NyAzMiAwNyBENyA4NyA1NyciICAgICAgIyBoZXJjdWx5bnguaGV4CisKK2lmICQ/dHVjYW5hICYmICEkP21hZ251bSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDY3IDIzIEQyIDE4IDc0IDAxIDAyIDIwIDY3IDIzIEQyIDM4IDc0IDA5IDAyIFwKKyAxOCA2NyAyMyBEMiAxQyA3NCAxMSBFOSAwMiA4MCA0NSA4MCA4MSBEQSAwRCA3NCBcCisgMUEgM0EgNjggMjggNjAgRTMgNjcgNEEgNjcgMzYgMDYgRTQgMzAgODcgMDYgRTUgXAorIDMwIDg3IDA2IEUzIDgwIDU3IDMyIDAwIDk3IDcxIDQ1IDMyIDAxIDk3IDcxIDQ1IFwKKyAwMiAwRiA2MCBFNSA1NyAwMiAwRSA2MCBFNSA1NyAwNiBFMyAxMiBBMCBGOCAxNSBcCisgMUEgMDAgNzUgNTkgMDIgMEUgNjAgRTQgNTcgMDIgMEYgNjAgRTQgNTcnIiAgICAgICAgIyBzZGs1NjY1LmhleAorCitpZiAkP21hZ251bSAmJiAhJD90dWMyNF9yZWYgJiYgISQ/QkNNNTY1MF9DMCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEZDIDY3IDVBIDY3IDlDIDA2IEZBIDY3IERBIDA2IEZCIDY3IERBIFwKKyAwNiBGQyA4MCBEMiAxQyA3NCAwMSAxMiBGRCA4NSAwNSBEMiAwRiA3MSAyMSA1MiBcCisgMDAgMTIgRkUgODUgMDUgRDIgMUYgNzEgMkIgNTIgMDAgMTIgRkYgODUgMDUgRDIgXAorIDA1IDcxIDM1IDUyIDAwIEU5IDA1IDk4IDk4IDk4IDk4IEMyIDBGIDYwIEY5IDA1IFwKKyA4OCA4OCA4OCA4OCBDMiBGMCBCNiBGOSA1MCA4MSBEQSAwQyA3NCAzNiBFOSAwMiBcCisgODAgNDUgODAgODEgREEgMEUgNzQgNTEgM0EgNzAgMzIgMDAgOTcgNzUgNjYgMTIgXAorIEMwIEZFIEZDIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDcyIDEyIERDIEZFIEZDIDAyIFwKKyAwQSA1MCAxMiBEQyBGRSBGQyA5NSA3NSA4NiA4NSAxMiBDMCBGRSBGQyA5NSAwMiBcCisgRkEgNzUgRDcgODUgNzcgRDEgMTIgQzAgRkUgRkMgOTUgNzUgOTIgODUgMDIgRkEgXAorIDc3IEQ0IDE2IEZGIERBIDAyIDAyIEZBIDcxIEQ0IDc3IEQ3IDMyIDA1IDk3IDcxIFwKKyBBOSAwNiBGRSBEMiAwMSAwMiBGQiA3MSBEMSAwNiBGQyA2NyBDQSAwMiBGQiA3NSBcCisgRDEgMzIgMDIgOTcgNzEgRDEgMzIgMDMgOTcgNzEgRDcgMzIgMDQgOTcgNzUgRDQgXAorIDA2IEZEIEQyIDA3IDAyIEZCIDcxIEQ0IDc3IEQ3IDEyIEEwIEY4IDE1IDFBIDAwIFwKKyA1NyA0MiAwMCA1NyA0MiAwMSA1NyA0MiAwMiA1NyBEMiAwMiA3NCBFMyAzMiAwRiBcCisgODcgNzcgRTYgMzIgMEUgODcgRDIgMDEgNzQgRUUgMzIgMEYgODcgNTcgMzIgMEUgXAorIDg3IDU3JyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2RrNTY2NS5oZXgKKworaWYgJD9tYWdudW0gJiYgISQ/dHVjMjRfcmVmICYmICQ/QkNNNTY1MF9DMCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDYwIEZCIEQyIDE4IDc1IDA5IEEyIDAxIDYwIEZDIDI4IDY3IDM3IDY3IDczIFwKKyAwNiBGQiA4MCBEMiAxQyA3NCAwMSAxMiBGRCA4NSAwNSBEMiAwRiA3MSAyMSA1MiBcCisgMDAgMTIgRkUgODUgMDUgRDIgMUYgNzEgMkIgNTIgMDAgMTIgRkYgODUgMDUgRDIgXAorIDA1IDcxIDM1IDUyIDAwIDNBIDcwIDMyIDAwIDk3IDc1IDQzIDEyIEMwIEZFIEZDIFwKKyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0RiAxMiBEQyBGRSBGQyAwMiAwQSA1MCAxMiBcCisgREMgRkUgRkMgOTUgNzUgNjEgODUgMTIgQzAgRkUgRkMgOTUgNzUgQjAgODUgNzcgXAorIEEyIDEyIEMwIEZFIEZDIDk1IDc1IDZCIDg1IDc3IEE5IDE2IEZGIERBIDAyIDcxIFwKKyBBOSA3NyBCMCAzMiAwNSA5NyA3MSA3RSAwNiBGRSBEMiAwMSA3MSBBMiAwNiBGQyBcCisgNjcgOUIgNzUgQTIgMzIgMDIgOTcgNzEgQTIgMzIgMDMgOTcgNzEgQjAgMzIgMDQgXAorIDk3IDc1IEE5IDA2IEZEIEQyIDA3IDcxIEE5IDc3IEIwIDEyIEEwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRiA4NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyBcCisgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1hZ251bV9zZGsuaGV4CisKK2lmICQ/dHVjMjRfcmVmICYmICQ/QkNNNTY1MF9DMCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDYwIEZCIEQyIDE4IDcxIDEwIDYwIEZDIDI4IDY3IEQwIDY3IEMwIDc3IDE5IFwKKyBBMiAwMSA2MCBGQyAyOCA2NyA0MCA2NyA3QyAwNiBGQiA4MCBEMiAxQyA3NCAwMSBcCisgMTIgRkQgODUgMDUgRDIgMEYgNzEgMkEgNTIgMDAgMTIgRkUgODUgMDUgRDIgMUYgXAorIDcxIDM0IDUyIDAwIDEyIEZGIDg1IDA1IEQyIDA1IDcxIDNFIDUyIDAwIDNBIDY4IFwKKyAzMiAwMCA5NyA3NSA0QyAxMiBDMCBGRSBGQyAwMiAwQSA1MCAzMiAwMSA5NyA3NSBcCisgNTggMTIgREMgRkUgRkMgMDIgMEEgNTAgMTIgREMgRkUgRkMgOTUgNzUgNkEgODUgXAorIDEyIEMwIEZFIEZDIDk1IDc1IEI5IDg1IDc3IEFCIDEyIEMwIEZFIEZDIDk1IDc1IFwKKyA3NCA4NSA3NyBCMiAxNiBGRiBEQSAwMiA3MSBCMiA3NyBCOSAzMiAwNSA5NyA3MSBcCisgODcgMDYgRkUgRDIgMDEgNzEgQUIgMDYgRkMgNjcgQTQgNzUgQUIgMzIgMDIgOTcgXAorIDcxIEFCIDMyIDAzIDk3IDcxIEI5IDMyIDA0IDk3IDc1IEIyIDA2IEZEIEQyIDA3IFwKKyA3MSBCMiA3NyBCOSAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyAzMiAwRiBcCisgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcgXAorIDAyIDBFIDMyIDAwIDk3IDcxIENEIDMyIDAxIDk3IDcxIENEIDgwIDMwIDg3IDU3IFwKKyAwNiBGQyAxMiBBMCBGOCAxNSAxQSAwMCAwMiAwRiA3NSBERCA5MCAzMCA4NyA1NyciICAjIG1hZ251bS5oZXgKKworaWYgJD90dWMyNF9yZWYgJiYgISQ/QkNNNTY1MF9DMCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEZDIEQyIDE4IDcxIDBFIDY3IEU5IDY3IEQ5IDc3IDFBIDY3IDVBIFwKKyA2NyA5QyAwNiBGQSA2NyBEMCAwNiBGQiA2NyBEMCAwNiBGQyA4MCBEMiAxQyA3NCBcCisgMDEgMTIgRkUgODUgMDUgRDIgMUYgNzEgMkIgNTIgMDAgMTIgRkYgODUgMDUgRDIgXAorIDA1IDcxIDM1IDUyIDAwIEU5IDA1IDk4IDk4IDk4IDk4IEMyIDBGIDYwIEY5IDA1IFwKKyA4OCA4OCA4OCA4OCBDMiBGMCBCNiBGOSA1MCA4MSBEQSAwQyA3NCAzNiBFOSAwMiBcCisgODAgNDUgODAgODEgREEgMEQgNzQgNTEgM0EgNjggMzIgMDAgOTcgNzUgNjYgMTIgXAorIEMwIEZFIEZDIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDcyIDEyIERDIEZFIEZDIDAyIFwKKyAwQSA1MCAxMiBEQyBGRSBGQyA5NSA3NSA4NiA4NSAxMiBDMCBGRSBGQyA5NSAwMiBcCisgRkEgNzUgQ0QgODUgNzcgQzcgMTIgQzAgRkUgRkMgOTUgNzUgOTIgODUgMDIgRkEgXAorIDc3IENBIDE2IEZGIERBIDAyIDAyIEZBIDcxIENBIDc3IENEIDMyIDA1IDk3IDcxIFwKKyBBOSAwNiBGRSBEMiAwMSAwMiBGQiA3MSBDNyAwNiBGQyA2NyBDMCAwMiBGQiA3NSBcCisgQzcgMzIgMDIgOTcgNzEgQzcgMzIgMDMgOTcgNzEgQ0QgMzIgMDQgOTcgNzUgQ0EgXAorIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDQyIEZGIDU3IDQyIEZFIDU3IDQyIEVGIDU3IFwKKyAzMCA4NyA5OCA5OCA5OCA5OCAzMCA4NyA1NyAwMiAwRSAzMiAwMCA5NyA3MSBFNiBcCisgMzIgMDEgOTcgNzEgRTYgODAgMzAgODcgNTcgMDYgRkMgMTIgQTAgRjggMTUgMUEgXAorIDAwIDAyIDBGIDc1IEY2IDkwIDMwIDg3IDU3JyIgICAgICAgICAgICAgICAgICAgICAgICMgdHVjMjRfcmVmLmhleAorCitpZiAkP2hlcmM4XzE1ICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDEgMjggMzIgMDggRDcgODcgMzIgMDcgRDcgODcgMzIgMDEgRDcgODcgMzIgXAorIDAwIEQ3IDg3IDgwIEQyIDA5IDc0IDAyIDg2IDdGIDA2IDdGIEMyIDA3IDc0IDIyIFwKKyA4NiA3RSAxNiA3RSBDQSAwNyBFMCAxNyAwRCAxMiAwOCA5OCAyNyBENyA4NyA5MSBcCisgNzQgMkIgM0EgMjgnIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZGs1Njc1LmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/bG0gImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBDMyA2NyAyRCAwNiBDMyA4MCBEMiAwQyA3NCAwMSAxMiBDMiA4NSBcCisgMDUgRDIgMEYgNzEgMTcgNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgNzEgMjEgNTIgXAorIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDJCIDUyIDAwIDNBIDE4IDMyIDAwIDk3IFwKKyA3NSAzOSAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NSAxMiBBQyBcCisgRkUgQzMgMDIgMEEgNTAgMTIgQUMgRkUgQzMgOTUgNzUgNUYgODUgMTIgQTAgRkUgXAorIEMzIDk1IDcxIDVDIDE2IEMwIERBIDAyIDcxIEE2IDc3IEI0IDg1IDc3IDc3IDEyIFwKKyBBMCBGRSBDMyA5NSA3NSA2RiA4NSAxNiBDMCBEQSAwMiA3MSBBNiA3NyBBRCAxNiBcCisgQzAgREEgMDIgNzEgQUQgNzcgQjQgMzIgMDUgOTcgNzEgODIgMDYgQzEgRDIgMDEgXAorIDcxIEE2IDA2IEMzIDY3IDlGIDc1IEE2IDMyIDAyIDk3IDcxIEE2IDMyIDAzIDk3IFwKKyA3MSBCNCAzMiAwNCA5NyA3NSBBRCAwNiBDMiBEMiAwNyA3MSBBRCA3NyBCNCAxMiBcCisgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgXAorIDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwJyIgICMgbG01NjkwLmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/bG00OHAgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBDMyA2NyA3QyAwNiBDMyA4MCAyOCA2MCBDMyA2NyA3QyA2NyA0MCBcCisgMDYgQzMgOTAgMjggNjAgQzMgNjcgNDAgMDYgQzMgODAgODAgRDIgMEMgNzQgMDEgXAorIDEyIEMyIDg1IDA1IEQyIDBGIDcxIDJBIDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIFwKKyA3MSAzNCA1MiAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAzRSA1MiAwMCAzQSAzMCBcCisgMzIgMDAgOTcgNzUgNEMgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgXAorIDU4IDEyIEFDIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDZBIDg1IFwKKyAxMiBBMCBGRSBDMyA5NSA3NSBCOSA4NSA3NyBBQiAxMiBBMCBGRSBDMyA5NSA3NSBcCisgNzQgODUgNzcgQjIgMTYgQzAgREEgMDIgNzEgQjIgNzcgQjkgMzIgMDUgOTcgNzEgXAorIDhDIDMyIDAyIDk3IDcxIEFCIDA2IEMxIEQyIDAxIDcxIEFCIDA2IEMzIDY3IEE0IFwKKyA3NSBBQiAzMiAwMyA5NyA3MSBCOSAzMiAwNCA5NyA3NSBCMiAwNiBDMiBEMiAwNyBcCisgNzEgQjIgNzcgQjkgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgXAorIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgICMgbG00OHA1Njk1LmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/bG00OHBfQiAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEMzIDY3IDc5IDA2IEMzIDY3IDNEIDA2IEMzIDgwIDI4IDYwIEMzIFwKKyA2NyAzRCAwNiBDMyA2NyA3OSAwNiBDMyA4MCBEMiAwQyA3NCAwMSAxMiBDMiA4NSBcCisgMDUgRDIgMEYgNzEgMjcgNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgNzEgMzEgNTIgXAorIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDNCIDUyIDAwIDNBIDMwIDMyIDAwIDk3IFwKKyA3NSA0OSAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA1NSAxMiBBQyBcCisgRkUgQzMgMDIgMEEgNTAgMTIgQUMgRkUgQzMgOTUgNzUgNjcgODUgMTIgQTAgRkUgXAorIEMzIDk1IDc1IEI2IDg1IDc3IEE4IDEyIEEwIEZFIEMzIDk1IDc1IDcxIDg1IDc3IFwKKyBBRiAxNiBDMCBEQSAwMiA3MSBBRiA3NyBCNiAzMiAwNSA5NyA3MSA4OSAzMiAwMiBcCisgOTcgNzEgQTggMDYgQzEgRDIgMDEgNzEgQTggMDYgQzMgNjcgQTEgNzUgQTggMzIgXAorIDAzIDk3IDcxIEI2IDMyIDA0IDk3IDc1IEFGIDA2IEMyIEQyIDA3IDcxIEFGIDc3IFwKKyBCNiAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiBcCisgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAgIyBsbTQ4cDU2OTVfMTAuaGV4CisKK2lmICQ/ZmlyZWJvbHRfYW55ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNTUgNjcgOTEgMDYgRTMgODAgMjggNjAgRTMgNjcgOTEgXAorIDY3IDU1IDA2IEUzIDgwIEQyIDE4IDc0IDAxIDI4IDYwIEUzIDY3IEI5IDc1IDI2IFwKKyA2NyBDRSA2NyA1NSA3NyAyRSAzMiAwRSA4NyAzMiAwOCA4NyA2NyBDMCAwNiBFMyBcCisgODAgRDIgMUMgNzQgMTkgMTIgRTIgODUgMDUgRDIgMEYgNzEgM0YgNTIgMDAgMTIgXAorIEUxIDg1IDA1IEQyIDFGIDcxIDQ5IDUyIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIFwKKyA1MyA1MiAwMCAzQSA3MCAzMiAwMCA5NyA3NSA2MSAxMiBBMCBGRSBFMyAwMiAwQSBcCisgNTAgMzIgMDEgOTcgNzUgNkQgMTIgQkMgRkUgRTMgMDIgMEEgNTAgMTIgQkMgRkUgXAorIEUzIDk1IDc1IDdGIDg1IDEyIEEwIEZFIEUzIDk1IDc1IENFIDg1IDc3IEMwIDEyIFwKKyBBMCBGRSBFMyA5NSA3NSA4OSA4NSA3NyBDNyAxNiBFMCBEQSAwMiA3MSBDNyA3NyBcCisgQ0UgMzIgMDUgOTcgNzEgQTEgMzIgMDIgOTcgNzEgQzAgMDYgRTEgRDIgMDEgNzEgXAorIEMwIDA2IEUzIDY3IEI5IDc1IEMwIDMyIDAzIDk3IDcxIENFIDMyIDA0IDk3IDc1IFwKKyBDNyAwNiBFMiBEMiAwNyA3MSBDNyA3NyBDRSAxMiA4MCBGOCAxNSAxQSAwMCA1NyBcCisgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgXAorIDg3IDMyIDBFIDg3IDU3JyIgICMgc2RrNTY1MDQuaGV4CisKKyNMZWQgcHJvZ3JhbSBmb3IgbmV3IHJldiBvZiBGQiBTREsgYW5kIFJlZiBkZXNpZ24KK2lmICQ/ZmlyZWJvbHRfYW55ICYmICEkP2ZiMjQgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyA0QiA2NyA4NyAwNiBFMyA4MCBEMiAxOCA3NCAwMSAyOCBcCisgNjAgRTMgNjcgQUYgNzUgMUMgNjcgQzQgNjcgNEIgNzcgMjQgMzIgMEUgODcgMzIgXAorIDA4IDg3IDY3IEI2IDA2IEUzIDgwIEQyIDFDIDc0IDBGIDEyIEUyIDg1IDA1IEQyIFwKKyAwRiA3MSAzNSA1MiAwMCAxMiBFMSA4NSAwNSBEMiAxRiA3MSAzRiA1MiAwMCAxMiBcCisgRTAgODUgMDUgRDIgMDUgNzEgNDkgNTIgMDAgM0EgNzAgMzIgMDAgOTcgNzUgNTcgXAorIDEyIEEwIEZFIEUzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDYzIDEyIEJDIEZFIEUzIFwKKyAwMiAwQSA1MCAxMiBCQyBGRSBFMyA5NSA3NSA3NSA4NSAxMiBBMCBGRSBFMyA5NSBcCisgNzUgQzQgODUgNzcgQjYgMTIgQTAgRkUgRTMgOTUgNzUgN0YgODUgNzcgQkQgMTYgXAorIEUwIERBIDAyIDcxIEJEIDc3IEM0IDMyIDA1IDk3IDcxIDk3IDMyIDAyIDk3IDcxIFwKKyBCNiAwNiBFMSBEMiAwMSA3MSBCNiAwNiBFMyA2NyBBRiA3NSBCNiAzMiAwMyA5NyBcCisgNzEgQzQgMzIgMDQgOTcgNzUgQkQgMDYgRTIgRDIgMDcgNzEgQkQgNzcgQzQgMTIgXAorIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IFwKKyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICMgc2RrNTY1MDRyZWYuaGV4CisKKyNPdmVycmlkZSBEZWZhdWx0IEZpcmVib2x0IExFRCBwcm9ncmFtIGZvciBMaW5lIE1vZHVsZQoraWYgJD9sbSAmJiAkP2ZpcmVib2x0X2FueSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDc5IDA2IEUzIDY3IDNEIDA2IEUzIDgwIDI4IDYwIEUzIFwKKyA2NyAzRCAwNiBFMyA2NyA3OSAwNiBFMyA4MCBEMiAxOCA3NCAwMSAxMiBFMiA4NSBcCisgMDUgRDIgMEYgNzEgMjcgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgMzEgNTIgXAorIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDNCIDUyIDAwIDNBIDYwIDMyIDAwIDk3IFwKKyA3NSA0OSAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA1NSAxMiBCQyBcCisgRkUgRTMgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgNjcgODUgMTIgQTAgRkUgXAorIEUzIDk1IDc1IEI2IDg1IDc3IEE4IDEyIEEwIEZFIEUzIDk1IDc1IDcxIDg1IDc3IFwKKyBBRiAxNiBFMCBEQSAwMiA3MSBBRiA3NyBCNiAzMiAwNSA5NyA3MSA4OSAzMiAwMiBcCisgOTcgNzEgQTggMDYgRTEgRDIgMDEgNzEgQTggMDYgRTMgNjcgQTEgNzUgQTggMzIgXAorIDAzIDk3IDcxIEI2IDMyIDA0IDk3IDc1IEFGIDA2IEUyIEQyIDA3IDcxIEFGIDc3IFwKKyBCNiAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiBcCisgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjIGxtNDhwNTY1MDQuaGV4CisKKyNPdmVycmlkZSBEZWZhdWx0IEZpcmVib2x0IExFRCBwcm9ncmFtIGZvciBMaW5lIE1vZHVsZSAtNTAgdmVyc2lvbgoraWYgJD9sbSAmJiAkP2xtNDhwX0QgJiYgJD9maXJlYm9sdF9hbnkgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyA2RCAwNiBFMyA2NyAzMSAwNiBFMyA4MCBEMiAxOCA3NCBcCisgMDEgMTIgRTIgODUgMDUgRDIgMEYgNzEgMUIgNTIgMDAgMTIgRTEgODUgMDUgRDIgXAorIDFGIDcxIDI1IDUyIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDJGIDUyIDAwIDNBIFwKKyA2MCAzMiAwMCA5NyA3NSAzRCAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyBcCisgNzUgNDkgMTIgQkMgRkUgRTMgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgNUIgXAorIDg1IDEyIEEwIEZFIEUzIDk1IDc1IEFBIDg1IDc3IDlDIDEyIEEwIEZFIEUzIDk1IFwKKyA3NSA2NSA4NSA3NyBBMyAxNiBFMCBEQSAwMiA3MSBBMyA3NyBBQSAzMiAwNSA5NyBcCisgNzEgN0QgMzIgMDIgOTcgNzEgOUMgMDYgRTEgRDIgMDEgNzEgOUMgMDYgRTMgNjcgXAorIDk1IDc1IDlDIDMyIDAzIDk3IDcxIEFBIDMyIDA0IDk3IDc1IEEzIDA2IEUyIEQyIFwKKyAwNyA3MSBBMyA3NyBBQSAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiBcCisgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgXAorIDU3JyIgIyBsbTQ4cDU2NTA0XzUwLmhleAorCitpZiAkP2xtICYmICQ/ZmlyZWJvbHRfMTB4NCAibG9jYWwgbGVkY29kZSAnXAorIDAyIDE4IDI4IDMyIDA3IDY3IDFFIDc1IDBBIEQ3IDg3IDMyIDAxIEQ3IDg3IDMyIFwKKyAwMCBENyA4NyAzMiAwOCBENyA4NyA4MCBEMiAxQyA3NCAwMiAzQSAwQyAxMiA4MCBcCisgRjggMTUgMUEgMDAgNTcgJyIgIyBsbTEycGN4NDU2NTAxLmhleAorCitpZiAkP2ZicG9lICYmICQ/ZmlyZWJvbHRfYW55ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgODUgNjcgNDkgMDYgRTMgODAgRDIgMTggNzQgMDEgMjggXAorIDYwIEUzIDY3IEFEIDc1IDFBIDY3IEMyIDc3IDIwIDMyIDBFIDg3IDMyIDA4IDg3IFwKKyA2NyA0OSAwNiBFMyA4MCBEMiAxQSA3NCAwRiAxMiBFMiA4NSAwNSBEMiAwRiA3MSBcCisgMzMgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgM0QgNTIgMDAgMTIgRTAgODUgXAorIDA1IEQyIDA1IDcxIDQ3IDUyIDAwIDNBIDY4IDMyIDAwIDk3IDc1IDU1IDEyIEEwIFwKKyBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA2MSAxMiBCQSBGRSBFMyAwMiAwQSBcCisgNTAgMTIgQkEgRkUgRTMgOTUgNzUgNzMgODUgMTIgQTAgRkUgRTMgOTUgNzUgQzIgXAorIDg1IDc3IEI0IDEyIEEwIEZFIEUzIDk1IDc1IDdEIDg1IDc3IEJCIDE2IEUwIERBIFwKKyAwMiA3MSBCQiA3NyBDMiAzMiAwNSA5NyA3MSA5NSAzMiAwMiA5NyA3MSBCNCAwNiBcCisgRTEgRDIgMDEgNzEgQjQgMDYgRTMgNjcgQUQgNzUgQjQgMzIgMDMgOTcgNzEgQzIgXAorIDMyIDA0IDk3IDc1IEJCIDA2IEUyIEQyIDA3IDcxIEJCIDc3IEMyIDEyIDgwIEY4IFwKKyAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiBcCisgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjIHBvZTQ4cDU2NTA0LmhleAorCisjT3ZlcnJpZGUgRGVmYXVsdCBGaXJlYm9sdCBMRUQgcHJvZ3JhbSBmb3IgZmVsaXgKK2lmICQ/ZmVsaXggfHwgJD9mZWxpeDE1ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNkIgNjcgQTcgMDYgRTMgODAgRDIgMTggNzQgMDEgMDIgXAorIDE4IDI4IDYwIEUzIDY3IDQ5IDAyIDE5IDI4IDYwIEUzIDY3IDQ5IDMyIDBFIDg3IFwKKyAzMiAwRSA4NyAzMiAwRSA4NyAzMiAwRSA4NyAxMiBFMiA4NSAwNSBEMiAwRiA3MSBcCisgMzMgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgM0QgNTIgMDAgMTIgRTAgODUgXAorIDA1IEQyIDA1IDcxIDQ3IDUyIDAwIDNBIDY4IDY3IENGIDc1IDUyIDMyIDBFIDg3IFwKKyA3NyA1NSAzMiAwRiA4NyAzMiAwMCA5NyA3NSA1RSAzMiAwRSA4NyA1NyAzMiAwMSBcCisgOTcgNzUgNjcgMzIgMEUgODcgNTcgMzIgMEYgODcgNTcgMzIgMDAgOTcgNzUgNzcgXAorIDEyIEEwIEZFIEUzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDgzIDEyIEJDIEZFIEUzIFwKKyAwMiAwQSA1MCAxMiBCQyBGRSBFMyA5NSA3NSA5NSA4NSAxMiBBMCBGRSBFMyA5NSBcCisgNzUgRTQgODUgNzcgRDYgMTIgQTAgRkUgRTMgOTUgNzUgOUYgODUgNzcgREQgMTYgXAorIEUwIERBIDAyIDcxIEREIDc3IEU0IDMyIDA1IDk3IDcxIEI3IDMyIDAyIDk3IDcxIFwKKyBENiAwNiBFMSBEMiAwMSA3MSBENiAwNiBFMyA2NyBDRiA3NSBENiAzMiAwMyA5NyBcCisgNzEgRTQgMzIgMDQgOTcgNzUgREQgMDYgRTIgRDIgMDcgNzEgREQgNzcgRTQgMTIgXAorIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IFwKKyAzMiAwRiA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyciICAjIHNkazU2MTAyLmhleAorCisjT3ZlcnJpZGUgRGVmYXVsdCBGZWxpeCBMRUQgcHJvZ3JhbSBmb3IgZmVsaXg0OAoraWYgJD9mZWxpeDQ4ICYmICQ/ZmVsaXggfHwgJD9mZWxpeDE1ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNkIgNjcgQTcgMDYgRTMgODAgRDIgMTggNzQgMDEgMDIgXAorIDE4IDI4IDYwIEUzIDY3IDQ5IDAyIDE5IDI4IDYwIEUzIDY3IDQ5IDMyIDBFIDg3IFwKKyAzMiAwRSA4NyAzMiAwRSA4NyAzMiAwRSA4NyAxMiBFMiA4NSAwNSBEMiAwRiA3MSBcCisgMzMgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgM0QgNTIgMDAgMTIgRTAgODUgXAorIDA1IEQyIDA1IDcxIDQ3IDUyIDAwIDNBIDY4IDY3IENGIDc1IDUyIDMyIDBFIDg3IFwKKyA3NyA1NSAzMiAwRiA4NyAzMiAwMCA5NyA3NSA1RSAzMiAwRSA4NyA1NyAzMiAwMSBcCisgOTcgNzUgNjcgMzIgMEUgODcgNTcgMzIgMEYgODcgNTcgMzIgMDAgOTcgNzUgNzcgXAorIDEyIEEwIEZFIEUzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDgzIDEyIEJDIEZFIEUzIFwKKyAwMiAwQSA1MCAxMiBCQyBGRSBFMyA5NSA3NSA5NSA4NSAxMiBBMCBGRSBFMyA5NSBcCisgNzUgRTQgODUgNzcgRDYgMTIgQTAgRkUgRTMgOTUgNzUgOUYgODUgNzcgREQgMTYgXAorIEUwIERBIDAyIDcxIEREIDc3IEU0IDMyIDA1IDk3IDcxIEI3IDMyIDAyIDk3IDcxIFwKKyBENiAwNiBFMSBEMiAwMSA3MSBENiAwNiBFMyA2NyBDRiA3NSBENiAzMiAwMyA5NyBcCisgNzEgRTQgMzIgMDQgOTcgNzUgREQgMDYgRTIgRDIgMDcgNzEgREQgNzcgRTQgMTIgXAorIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IFwKKyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICAjIGZlbGl4NDguaGV4CisKK2lmICQ/ZWFzeXJpZGVyX2FueSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDU5IDY3IDk1IDA2IEUzIDgwIDI4IDYwIEUzIDY3IDk1IFwKKyA2NyA1OSAwNiBFMyA4MCBEMiAwQyA3NCAwMSAyOCA2MCBFMyA2NyBCRCA3NSAyNiBcCisgNjcgRDIgNjcgNTkgNzcgMkUgMzIgMEUgODcgMzIgMDggODcgNjcgQzQgMDYgRTMgXAorIDgwIEQyIDBEIDc0IDE5IDEyIEUyIDg1IDA1IEQyIDBGIDcxIDNGIDUyIDAwIDEyIFwKKyBFMSA4NSAwNSBEMiAxRiA3MSA0OSA1MiAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSBcCisgNTMgNTIgMDAgNjcgQzQgNjcgQzQgM0EgMzggMzIgMDAgOTcgNzUgNjUgMTIgQTAgXAorIEZFIEUzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDcxIDEyIEFEIEZFIEUzIDAyIDBBIFwKKyA1MCAxMiBBRCBGRSBFMyA5NSA3NSA4MyA4NSAxMiBBMCBGRSBFMyA5NSA3NSBEMiBcCisgODUgNzcgQzQgMTIgQTAgRkUgRTMgOTUgNzUgOEQgODUgNzcgQ0IgMTYgRTAgREEgXAorIDAyIDcxIENCIDc3IEQyIDMyIDA1IDk3IDcxIEE1IDMyIDAyIDk3IDcxIEM0IDA2IFwKKyBFMSBEMiAwMSA3MSBDNCAwNiBFMyA2NyBCRCA3NSBDNCAzMiAwMyA5NyA3MSBEMiBcCisgMzIgMDQgOTcgNzUgQ0IgMDYgRTIgRDIgMDcgNzEgQ0IgNzcgRDIgMTIgODAgRjggXAorIDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IDMyIDBGIFwKKyA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICAgIyBzZGs1NjYwMS5oZXgKKworI092ZXJyaWRlIERlZmF1bHQgRWFzeXJpZGVyIExFRCBwcm9ncmFtIGZvciA1NjYwMgoraWYgJD9lYXN5cmlkZXJfMXgxICJsb2NhbCBsZWRjb2RlICdcCisgRTAgNjAgRTEgNjcgN0MgNjcgN0MgMDYgRTEgODAgRDIgMEMgNzQgMDEgMDIgMEMgXAorIDI4IDYwIEUxIDY3IDc1IDc1IDFEIDY3IDhBIDY3IDM5IDc3IDI1IDMyIDBFIDg3IFwKKyAzMiAwOCA4NyA2NyA3QyAwNiBFMSBEMiAwMCAwMiAwMCA3NCAxMCAxMiBFMCA4NSBcCisgMDUgRDIgMDUgNzEgMzcgNTIgMDAgM0EgMzggMzIgMDAgOTcgNzUgNDUgMTIgQTAgXAorIEZFIEUxIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDUxIDEyIEFEIEZFIEUxIDAyIDBBIFwKKyA1MCAxMiBBRCBGRSBFMSA5NSA3NSA2MyA4NSAxMiBBMCBGRSBFMSA5NSA3NSA4QSBcCisgODUgNzcgN0MgMTIgQTAgRkUgRTEgOTUgNzUgNkQgODUgNzcgODMgMTYgRTAgREEgXAorIDAyIDcxIDgzIDc3IDhBIDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIFwKKyAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyBcCisgNTcnIiAgICMgc2RrNTY2MDIuaGV4CisKKyNPdmVycmlkZSBEZWZhdWx0ICBMRUQgcHJvZ3JhbSBmb3IgNTMzMDAKK2lmICQ/bWlyYWdlMjQgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyA2QiA2NyAyRiAwNiBFMyA4MCBEMiAxOCA3NCAwMSAxMiBcCisgRTIgODUgMDUgRDIgMEYgNzEgMTkgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgXAorIDIzIDUyIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDJEIDUyIDAwIDNBIDMwIDMyIFwKKyAwMCA5NyA3NSAzQiAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NyBcCisgMTIgQkMgRkUgRTMgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgNTkgODUgMTIgXAorIEEwIEZFIEUzIDk1IDc1IEEyIDg1IDc3IDlBIDEyIEEwIEZFIEUzIDk1IDc1IDYzIFwKKyA4NSA3NyA5RSAxNiBFMCBEQSAwMiA3MSA5RSA3NyBBMiAzMiAwNSA5NyA3MSA3QiBcCisgMzIgMDIgOTcgNzEgOUEgMDYgRTEgRDIgMDEgNzEgOUEgMDYgRTMgNjcgOTMgNzUgXAorIDlBIDMyIDAzIDk3IDcxIEEyIDMyIDA0IDk3IDc1IDlFIDA2IEUyIEQyIDA3IDcxIFwKKyA5RSA3NyBBMiAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSBcCisgODcgNTcgMzIgMEUgODcgNTcnIiAgIyBzZGs1MzMwMC5oZXgKKworI092ZXJyaWRlIERlZmF1bHQgTEVEIHByb2dyYW0gZm9yIDU2MzE0CitpZiAkP2JjbTU2MzE0cDI0cmVmICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNzkgNjcgM0QgMDYgRTMgODAgRDIgMTggNzQgMDEgMjggXAorIDYwIEUzIDY3IDc5IDY3IEE4IDA2IEUzIDgwIEQyIDFDIDc0IDBGIDEyIEUyIDg1IFwKKyAwNSBEMiAwRiA3MSAyNyA1MiAwMCAxMiBFMSA4NSAwNSBEMiAxRiA3MSAzMSA1MiBcCisgMDAgMTIgRTAgODUgMDUgRDIgMDUgNzEgM0IgNTIgMDAgM0EgMzggMzIgMDAgOTcgXAorIDc1IDQ5IDEyIEEwIEZFIEUzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDU1IDEyIEJDIFwKKyBGRSBFMyAwMiAwQSA1MCAxMiBCQyBGRSBFMyA5NSA3NSA2NyA4NSAxMiBBMCBGRSBcCisgRTMgOTUgNzUgQjAgODUgNzcgQTggMTIgQTAgRkUgRTMgOTUgNzUgNzEgODUgNzcgXAorIEFDIDE2IEUwIERBIDAyIDcxIEFDIDc3IEIwIDMyIDA1IDk3IDcxIDg5IDMyIDAyIFwKKyA5NyA3MSBBOCAwNiBFMSBEMiAwMSA3MSBBOCAwNiBFMyA2NyBBMSA3NSBBOCAzMiBcCisgMDMgOTcgNzEgQjAgMzIgMDQgOTcgNzUgQUMgMDYgRTIgRDIgMDcgNzEgQUMgNzcgXAorIEIwIDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IFwKKyAzMiAwRSA4NyA1NyciICAjIGJjbTk1NjMxNHAyNHJlZi5oZXgKKworaWYgJD9icmFkbGV5ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRjIgNjcgMUIgMDYgRjIgODAgRDIgMTQgNzQgMDEgODYgRjMgMTIgXAorIEYwIDg1IDA1IEQyIDA1IDcxIDE5IDUyIDAwIDNBIDI4IDMyIDAwIDk3IDc1IDI3IFwKKyAxMiBBOCBGRSBGMiAwMiAwQSA1MCAzMiAwMSA5NyA3NSAzMyAxMiBCQyBGRSBGMiBcCisgMDIgMEEgNTAgMTIgQkMgRkUgRjIgOTUgNzUgNDUgODUgMTIgQTggRkUgRjIgOTUgXAorIDc1IDkxIDg1IDc3IDU3IDEyIEE4IEZFIEYyIDk1IDc1IDRGIDg1IDc3IDhBIDE2IFwKKyBGMCBEQSAwMiA3MSA4QSA3NyA5MSAwNiBGMiAxMiA5NCBGOCAxNSAwMiAwMiBDMSBcCisgNzQgNkUgMDIgMDQgQzEgNzQgNkUgMDIgMDggQzEgNzQgNkUgNzcgNzQgQzYgRjMgXAorIDc0IDkxIDc3IDhBIDA2IEYyIDY3IDdDIDc1IDgzIDc3IDkxIDEyIDgwIEY4IDE1IFwKKyAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyBcCisgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAgICAgIyBzZGs1NjgwMC5oZXgKKworaWYgJD9odW12ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRjIgNjcgMjEgMDYgRjIgODAgRDIgMDggNzQgMEYgRjIgMDIgRDIgXAorIDEyIDc0IDAxIDg2IEYzIDEyIEYwIDg1IDA1IEQyIDA1IDcxIDFGIDUyIDAwIDNBIFwKKyAyMCAzMiAwMCA5NyA3NSAyRCAxMiBBOCBGRSBGMiAwMiAwQSA1MCAzMiAwMSA5NyBcCisgNzUgMzkgMTIgQkEgRkUgRjIgMDIgMEEgNTAgMTIgQkEgRkUgRjIgOTUgNzUgNEIgXAorIDg1IDEyIEE4IEZFIEYyIDk1IDc1IDk3IDg1IDc3IDVEIDEyIEE4IEZFIEYyIDk1IFwKKyA3NSA1NSA4NSA3NyA5MCAxNiBGMCBEQSAwMiA3MSA5MCA3NyA5NyAwNiBGMiAxMiBcCisgOTQgRjggMTUgMDIgMDIgQzEgNzQgNzQgMDIgMDQgQzEgNzQgNzQgMDIgMDggQzEgXAorIDc0IDc0IDc3IDdBIEM2IEYzIDc0IDk3IDc3IDkwIDA2IEYyIDY3IDgyIDc1IDg5IFwKKyA3NyA5NyAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyBcCisgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjIHNkazU2NzAwLmhleAorCitpZiAkP2JyYWRsZXlfMWcgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyAyRiA2NyA2QiAwNiBFMyA4MCBEMiAxNCA3NCAwMSAxMiBcCisgRTIgODUgMDUgRDIgMEYgNzEgMTkgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgXAorIDIzIDUyIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDJEIDUyIDAwIDNBIDUwIDMyIFwKKyAwMCA5NyA3NSAzQiAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NyBcCisgMTIgQjQgRkUgRTMgMDIgMEEgNTAgMTIgQjQgRkUgRTMgOTUgNzUgNTkgODUgMTIgXAorIEEwIEZFIEUzIDk1IDc1IEE4IDg1IDc3IDlBIDEyIEEwIEZFIEUzIDk1IDc1IDYzIFwKKyA4NSA3NyBBMSAxNiBFMCBEQSAwMiA3MSBBMSA3NyBBOCAzMiAwNSA5NyA3MSA3QiBcCisgMzIgMDIgOTcgNzEgOUEgMDYgRTEgRDIgMDEgNzEgOUEgMDYgRTMgNjcgOTMgNzUgXAorIDlBIDMyIDAzIDk3IDcxIEE4IDMyIDA0IDk3IDc1IEExIDA2IEUyIEQyIDA3IDcxIFwKKyBBMSA3NyBBOCAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyBcCisgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcgJyIgICMgc2RrNTY4MDBjLmhleAorCitpZiAkP2dvbGR3aW5nICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRjMgRDIgMTAgNzUgMEUgNjcgM0IgNjcgOTQgNzcgMTIgNjcgOTQgXAorIDY3IDNCIDA2IEYzIDgwIEQyIDE0IDc0IDAxIDg2IEY0IDEyIEYyIDg1IDA1IEQyIFwKKyAwRiA3MSAyNSA1MiAwMCAxMiBGMSA4NSAwNSBEMiAxRiA3MSAyRiA1MiAwMCAxMiBcCisgRjAgODUgMDUgRDIgMDUgNzEgMzkgNTIgMDAgM0EgNTAgMzIgMDAgOTcgNzUgNDcgXAorIDEyIEE4IEZFIEYzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDUzIDEyIEJDIEZFIEYzIFwKKyAwMiAwQSA1MCAxMiBCQyBGRSBGMyA5NSA3NSA2NSA4NSAxMiBBOCBGRSBGMyA5NSBcCisgNzUgQzAgODUgNzcgNzcgMTIgQTggRkUgRjMgOTUgNzUgNkYgODUgNzcgQjkgMTYgXAorIEYwIERBIDAyIDcxIEI5IDc3IEMwIDA2IEYzIDEyIDk0IEY4IDE1IDAyIDAyIEMxIFwKKyA3NCA4RSAwMiAwNCBDMSA3NCA4RSAwMiAwOCBDMSA3NCA4RSA3NyBCMiBDNiBGNCBcCisgNzQgQzAgNzcgQjkgMDYgRjMgNjcgQUIgNzUgQjIgMzIgMDQgNzUgQjIgMzIgMDMgXAorIDk3IDcxIEMwIDA2IEYyIEQyIDA3IDcxIEI5IDc3IEMwIDEyIDgwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyBcCisgMzIgMEYgODcgMzIgMEUgODcgNTcgJyIgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2RrNTY1ODAuaGV4CisKK2lmICQ/aHVtdiAmJiAkP2xtICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDQgMjggRDIgMDggNzQgMEEgRjIgMDIgMjggMzIgMDcgNjcgMjkgNzUgMTEgXAorIEQ3IDg3IDYwIEU0IDY3IDMwIDA2IEU0IDYwIEU0IDY3IDRDIDA2IEU0IDMyIDA4IFwKKyBENyA4NyA4MCBEMiAxMiA3NCAwMiAzQSAzMCAxMiA4MCBGOCAxNSAxQSAwMCA1NyBcCisgMDYgRTQgMTIgOTQgRjggMTUgMDIgMTAgQzEgNzAgNDIgMTIgRDIgRkUgRTQgMDIgXAorIDBBIDUwIDEyIEQyIEZFIEU0IDk1IDc1IDZEIDg1IDc3IDY4IDA2IEU0IDEyIDk0IFwKKyBGOCAxNSAwMiAyMCBDMSA3MCA1RSAxMiBDMCBGRSBFNCAwMiAwQSA1MCAxMiBDMCBcCisgRkUgRTQgOTUgNzUgNkQgODUgNzcgNjggMzIgMEUgRDcgODcgNTcgMzIgMEYgRDcgXAorIDg3IDU3ICciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxtMTJwNTY4MDIuaGV4CisKKworaWYgJD9yYXB0b3IgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwNiAyOCA2MCBGRiA2NyA2NCA2NyA5MyAwNiBGRiA4MCBEMiAzNiA3NCAwMiBcCisgMDIgMDQgMjggNjAgRkYgNjcgQkIgNzUgMUUgMzIgMEUgODcgNzcgMjEgMzIgMEYgXAorIDg3IDY3IDdEIDA2IEZGIDgwIEQyIDA2IDc0IDEyIDAyIDAxIDI4IDYwIEZGIDY3IFwKKyBCQiA3NSAzOCAzMiAwRSA4NyA3NyAzQiAzMiAwRiA4NyA2NyA3RCAwNiBGRiA4MCBcCisgRDIgMDMgNzQgMkMgMTIgRkUgODUgMDUgRDIgMEYgNzEgNEUgNTIgMDAgMTIgRkQgXAorIDg1IDA1IEQyIDFGIDcxIDU4IDUyIDAwIDEyIEZDIDg1IDA1IEQyIDA1IDcxIDYyIFwKKyA1MiAwMCAzQSBDOCAzMiAwMSA5NyA3NSA3NiAzMiAwMCA5NyA3NSBDOSAxNiBGQyBcCisgREEgMDIgNzEgQzkgNzcgRDAgMzIgMDAgOTcgNzUgQzIgNzcgRDAgMzIgMDAgOTcgXAorIDc1IDg2IDMyIDBFIDg3IDU3IDMyIDAxIDk3IDc1IDhGIDMyIDBFIDg3IDU3IDMyIFwKKyAwRiA4NyA1NyAzMiAwNSA5NyA3MSBBMyAzMiAwMiA5NyA3MSBDMiAwNiBGRCBEMiBcCisgMDEgNzEgQzIgMDYgRkYgNjcgQkIgNzUgQzIgMzIgMDMgOTcgNzEgRDAgMzIgMDQgXAorIDk3IDc1IEM5IDA2IEZFIEQyIDA3IDcxIEM5IDc3IEQwIDEyIEEwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyBcCisgMzIgMEYgODcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjIHNkazU2MDE4LmhleAorCitpZiAkP3JhcHRvciAmJiAkP3JhcDI0X3JlZiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDA2IDYwIEUxIDY3IDQ4IDY3IDMxIDA2IEUxIDgwIEQyIDFFIDcxIDAyIDAyIFwKKyAwNSA2MCBFMSA2NyA0OCA2NyAzMSAwNiBFMSA5MCBEMiAwMyA3NCAxMSAwMiAwMiBcCisgNjAgRTEgNjcgNDggNjcgMzEgMDYgRTEgOTAgRDIgMDAgNzQgMjAgODYgRTAgM0EgXAorIDM4IDA2IEUxIDY3IDUwIDc1IDU3IDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDU3IFwKKyAxNiBFMCBDQSAwNSA3NCA1QiA3NyA1NyAwNiBFMSA2NyA1MCA3NSA1NyA3NyA1QiBcCisgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAnIiAjIHNkazU2MjE0LmhleAorCitpZiAkP3JhdmVuX2ViXzQ4cCAibG9jYWwgbGVkY29kZSAnXAorIDAyIDA2IDI4IDYwIEMzIDY3IDMwIDY3IDZDIDA2IEMzIDgwIEQyIDFFIDc0IDAyIFwKKyAxMiBDMiA4NSAwNSBEMiAwRiA3MSAxQSA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiBcCisgNzEgMjQgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgMkUgNTIgMDAgM0EgNjAgXAorIDMyIDAwIDk3IDc1IDNDIDEyIEMwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IFwKKyA0OCAxMiBFMCBGRSBDMyAwMiAwQSA1MCAxMiBFMCBGRSBDMyA5NSA3NSA1QSA4NSBcCisgMTIgQzAgRkUgQzMgOTUgNzUgQTkgODUgNzcgOUIgMTIgQzAgRkUgQzMgOTUgNzUgXAorIDY0IDg1IDc3IEEyIDE2IEMwIERBIDAyIDcxIEEyIDc3IEE5IDMyIDA1IDk3IDcxIFwKKyA3QyAzMiAwMiA5NyA3MSA5QiAwNiBDMSBEMiAwMSA3MSA5QiAwNiBDMyA2NyA5NCBcCisgNzUgOUIgMzIgMDMgOTcgNzEgQTkgMzIgMDQgOTcgNzUgQTIgMDYgQzIgRDIgMDcgXAorIDcxIEEyIDc3IEE5IDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIFwKKyA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICNiY205NTYwMjRwNDhyZWYuaGV4CisKK2lmICQ/QkNNOTU2MDI0UjUwVCAibG9jYWwgbGVkY29kZSAnXAorIDAyIDA2IDI4IDYwIEMzIDY3IDMwIDY3IDZDIDA2IEMzIDgwIEQyIDFFIDc0IDAyIFwKKyAxMiBDMiA4NSAwNSBEMiAwRiA3MSAxQSA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiBcCisgNzEgMjQgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgMkUgNTIgMDAgM0EgNjAgXAorIDMyIDAwIDk3IDc1IDNDIDEyIEMwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IFwKKyA0OCAxMiBFMCBGRSBDMyAwMiAwQSA1MCAxMiBFMCBGRSBDMyA5NSA3NSA1QSA4NSBcCisgMTIgQzAgRkUgQzMgOTUgNzUgQTkgODUgNzcgOUIgMTIgQzAgRkUgQzMgOTUgNzUgXAorIDY0IDg1IDc3IEEyIDE2IEMwIERBIDAyIDcxIEEyIDc3IEE5IDMyIDA1IDk3IDc1IFwKKyA3QyAzMiAwMiA5NyA3MSA5QiAwNiBDMSBEMiAwMSA3MSA5QiAwNiBDMyA2NyA5NCBcCisgNzUgOUIgMzIgMDMgOTcgNzEgQTkgMzIgMDQgOTcgNzUgQTIgMDYgQzIgRDIgMDcgXAorIDcxIEEyIDc3IEE5IDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIFwKKyA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICNiY205NTYwMjRyNTB0LmhleAorCitpZiAkP3Njb3JwaW9uIHx8ICQ/Y29ucXVlcm9yICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMTggMjggNjAgRTEgNjcgMTIgMDYgRTEgOTAgRDIgMDAgNzQgMDIgODYgRTAgXAorIDNBIDE4IDY3IDJEIDc1IDM0IDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDM4IDE2IFwKKyBFMCBDQSAwNSA3NCAzOCA3NyAzNCA2NyAyRCA3NSAzNCA3NyAzOCAxMiBBMCBGOCBcCisgMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgXAorIDAwIDAwIDAwJyIgI3NkazU2ODIwLmhleAorCitpZiAkP3Njb3JwaW9uICYmICQ/QkNNOTU2ODIwUjI0WEcgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMSAyOCA2NyBEMCAwMiAwMiAyOCA2NyBENiA2NyBEMCAwMiAwMSAyOCA2NyBcCisgRDYgMDIgMDQgMjggNjcgRDAgMDIgMDMgMjggNjcgRDYgNjcgRDAgMDIgMDQgMjggXAorIDY3IEQ2IDAyIDA1IDI4IDY3IEQwIDAyIDA2IDI4IDY3IEQ2IDY3IEQwIDAyIDA1IFwKKyAyOCA2NyBENiAwMiAwNyAyOCA2NyBEMCAwMiAwOCAyOCA2NyBENiA2NyBEMCAwMiBcCisgMDcgMjggNjcgRDYgMDIgMDkgMjggNjcgRDAgMDIgMEEgMjggNjcgRDYgNjcgRDAgXAorIDAyIDA5IDI4IDY3IEQ2IDAyIDBDIDI4IDY3IEQwIDAyIDBCIDI4IDY3IEQ2IDY3IFwKKyBEMCAwMiAwQyAyOCA2NyBENiAwMiAwRCAyOCA2NyBEMCAwMiAwRSAyOCA2NyBENiBcCisgNjcgRDAgMDIgMEQgMjggNjcgRDYgMDIgMEYgMjggNjcgRDAgMDIgMTAgMjggNjcgXAorIEQ2IDY3IEQwIDAyIDBGIDI4IDY3IEQ2IDAyIDExIDI4IDY3IEQwIDAyIDEyIDI4IFwKKyA2NyBENiA2NyBEMCAwMiAxMSAyOCA2NyBENiAwMiAxNCAyOCA2NyBEMCAwMiAxMyBcCisgMjggNjcgRDYgNjcgRDAgMDIgMTQgMjggNjcgRDYgMDIgMTUgMjggNjcgRDAgMDIgXAorIDE2IDI4IDY3IEQ2IDY3IEQwIDAyIDE1IDI4IDY3IEQ2IDAyIDE3IDI4IDY3IEQwIFwKKyAwMiAxOCAyOCA2NyBENiA2NyBEMCAwMiAxNyAyOCA2NyBENiA4NiBFMCAzQSAzMCBcCisgNjcgRjEgNzUgRjggNzcgRkMgNjcgRjEgNzUgRjggMjggMzIgMDAgMzIgMDEgQjcgXAorIDk3IDc1IEY4IDE2IEUwIENBIDA1IDc0IEZDIDc3IEY4IDY3IEYxIDc1IEY4IDc3IFwKKyBGQyAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyBcCisgJyIgI2JjbTk1NjgyMHIyNHhnLmhleAorCitpZiAkP3ZhbGt5cmllICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDIgNjcgQTkgNjcgOTQgMDIgMDMgNjcgQTkgNjcgOTQgMDIgMDUgNjcgQTkgXAorIDY3IDk0IDAyIDA0IDY3IEE5IDY3IDk0IDAyIDA2IDY3IEE5IDY3IDk0IDAyIDA3IFwKKyA2NyBBOSA2NyA5NCAwMiAxMiA2NyBBOSA2NyA5NCAwMiAxMyA2NyBBOSA2NyA5NCBcCisgMDIgMEUgNjcgQTkgNjcgOTQgMDIgMEYgNjcgQTkgNjcgOTQgMDIgMTEgNjcgQTkgXAorIDY3IDk0IDAyIDEwIDY3IEE5IDY3IDk0IDAyIDFBIDY3IEE5IDY3IDk0IDAyIDIwIFwKKyA2NyBBOSA2NyA5NCAwMiAyMSA2NyBBOSA2NyA5NCAwMiAyMiA2NyBBOSA2NyA5NCBcCisgMDIgMjMgNjcgQTkgNjcgOTQgMDIgMjQgNjcgQTkgNjcgOTQgMDIgMkYgNjcgQTkgXAorIDY3IDk0IDAyIDJFIDY3IEE5IDY3IDk0IDAyIDFCIDY3IEE5IDY3IDk0IDAyIDJCIFwKKyA2NyBBOSA2NyA5NCAwMiAyQyA2NyBBOSA2NyA5NCAwMiAyRCA2NyBBOSA2NyA5NCBcCisgODYgRTAgM0EgMzAgNjcgQUYgNzUgQjYgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgXAorIEI2IDE2IEUwIENBIDA1IDc0IEJBIDc3IEI2IDY3IEFGIDc1IEI2IDc3IEJBIDEyIFwKKyBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCBcCisgMDAnIiAjc2RrNTY2ODAuaGV4CisKK2lmICQ/dmFsa3lyaWUyICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMUUgNjcgQTkgNjcgOTQgMDIgMUYgNjcgQTkgNjcgOTQgMDIgMjEgNjcgQTkgXAorIDY3IDk0IDAyIDIwIDY3IEE5IDY3IDk0IDAyIDIyIDY3IEE5IDY3IDk0IDAyIDIzIFwKKyA2NyBBOSA2NyA5NCAwMiAyNCA2NyBBOSA2NyA5NCAwMiAyNSA2NyBBOSA2NyA5NCBcCisgMDIgMjYgNjcgQTkgNjcgOTQgMDIgMjcgNjcgQTkgNjcgOTQgMDIgMjkgNjcgQTkgXAorIDY3IDk0IDAyIDI4IDY3IEE5IDY3IDk0IDAyIDJBIDY3IEE5IDY3IDk0IDAyIDJCIFwKKyA2NyBBOSA2NyA5NCAwMiAyQyA2NyBBOSA2NyA5NCAwMiAyRCA2NyBBOSA2NyA5NCBcCisgMDIgMkUgNjcgQTkgNjcgOTQgMDIgMkYgNjcgQTkgNjcgOTQgMDIgMzEgNjcgQTkgXAorIDY3IDk0IDAyIDMwIDY3IEE5IDY3IDk0IDAyIDMyIDY3IEE5IDY3IDk0IDAyIDMzIFwKKyA2NyBBOSA2NyA5NCAwMiAzNCA2NyBBOSA2NyA5NCAwMiAzNSA2NyBBOSA2NyA5NCBcCisgODYgRTAgM0EgMzAgNjcgQUYgNzUgQjYgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgXAorIEI2IDE2IEUwIENBIDA1IDc0IEJBIDc3IEI2IDY3IEFGIDc1IEI2IDc3IEJBIDEyIFwKKyBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCBcCisgMDAnIiAjc2RrNTY2ODUuaGV4CisKK2lmICQ/aGF3a2V5ZV9wMjQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMSAyOCA2MCBFMyA2NyA0MyA2NyAxQyAwNiBFMyA4MCBEMiAxOSA3NCAwMiBcCisgMTIgRTAgODUgMDUgRDIgMDMgNzEgMUEgNTIgMDAgM0EgNjAgMzIgMDAgMzIgMDEgXAorIEI3IDk3IDc1IDJCIDEyIEU0IEZFIEUzIDAyIDAxIDUwIDEyIEU0IEZFIEUzIDk1IFwKKyA3NSAzQiA4NSAwNiBFMyA2NyA1NSA3NSA2QSA3NyA1QyAxNiBFMCBEQSAwMSA3MSBcCisgNkEgNzcgNUMgMDYgRTMgNjcgNTUgNzUgNkEgMzIgMDMgOTcgNzEgNUMgMzIgMDQgXAorIDk3IDc1IDZBIDc3IDYzIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIFwKKyAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyAzMiAwRiA4NyAzMiAwRiA4NyBcCisgNTcnIiAgI2JjbTk1MzMxNHAyNHJlZi5oZXgKKworaWYgJD9oYXdrZXllX2syNCAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAxIDI4IDYwIEUxIDY3IDNEIDY3IDFDIDA2IEUxIDgwIEQyIDE5IDc0IDAyIFwKKyAxMiBFMCA4NSAwNSBEMiAwNSA3MSAxQSA1MiAwMCAzQSAzMCAzMiAwMCAzMiAwMSBcCisgQjcgOTcgNzUgMkIgMTIgRTIgRkUgRTEgMDIgMEEgNTAgMTIgRTIgRkUgRTEgOTUgXAorIDc1IDM1IDg1IDc3IDUwIDE2IEUwIERBIDAyIDcxIDRDIDc3IDUwIDA2IEUxIDY3IFwKKyA0NSA3NSA1MCA3NyA0QyAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyA1NyBcCisgMzIgMEYgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjYmNtOTUzMzE0azI0LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjI0IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFDIDI4IDY3IDE4IDAyIDFEIDI4IDY3IDE4IDAyIDFFIDI4IDY3IDE4IDAyIFwKKyAxRiAyOCA2NyAxOCA4NiBFMCAzQSAwOCA2NyAzQiA3NSAyMCA2NyA0NiA3NyAyNCBcCisgNjcgNDIgNzcgNDIgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNDIgMTYgRTAgQ0EgXAorIDA1IDc0IDQ2IDc3IDQyIDY3IDNCIDc1IDQyIDc3IDQ2IDEyIEEwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjYyNC5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYyNiIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxQSAyOCA2NyAyMiAwMiAxQiAyOCA2NyAyMiAwMiAxQyAyOCA2NyAyMiAwMiBcCisgMUQgMjggNjcgMjIgMDIgMUUgMjggNjcgMjIgMDIgMUYgMjggNjcgMjIgODYgRTAgXAorIDNBIDA4IDY3IDNEIDc1IDQ0IDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDQ4IDE2IFwKKyBFMCBDQSAwNSA3NCA0OCA3NyA0NCA2NyAzRCA3NSA0NCA3NyA0OCAxMiBBMCBGOCBcCisgMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MjYuaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MjgiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDIgMjggNjcgMkMgMDIgMEUgMjggNjcgMkMgMDIgMUEgMjggNjcgMkMgMDIgXAorIDFCIDI4IDY3IDJDIDAyIDFDIDI4IDY3IDJDIDAyIDFEIDI4IDY3IDJDIDAyIDFFIFwKKyAyOCA2NyAyQyAwMiAxRiAyOCA2NyAyQyA4NiBFMCAzQSAwOCA2NyA0NyA3NSA0RSBcCisgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNTIgMTYgRTAgQ0EgMDUgNzQgNTIgNzcgXAorIDRFIDY3IDQ3IDc1IDRFIDc3IDUyIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIFwKKyA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjYyOC5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYyOSIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMiAyOCA2NyAyQyAwMiAwRSAyOCA2NyAyQyAwMiAxQSAyOCA2NyAyQyAwMiBcCisgMUIgMjggNjcgMkMgMDIgMUMgMjggNjcgMkMgMDIgMUQgMjggNjcgMkMgMDIgMUUgXAorIDI4IDY3IDJDIDAyIDFGIDI4IDY3IDJDIDg2IEUwIDNBIDA4IDY3IDQ3IDc1IDRFIFwKKyAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA1MiAxNiBFMCBDQSAwNSA3NCA1MiA3NyBcCisgNEUgNjcgNDcgNzUgNEUgNzcgNTIgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgXAorIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2NjI5LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjM0IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFBIDI4IDY3IDE4IDAyIDFCIDI4IDY3IDE4IDAyIDFDIDI4IDY3IDE4IDAyIFwKKyAxRCAyOCA2NyAxOCA4NiBFMCAzQSAwOCA2NyAzQiA3NSAyMCA2NyA0NiA3NyAyNCBcCisgNjcgNDIgNzcgNDIgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNDIgMTYgRTAgQ0EgXAorIDA1IDc0IDQ2IDc3IDQyIDY3IDNCIDc1IDQyIDc3IDQ2IDEyIEEwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjYzNC5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYzMCIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxQSAyOCA2NyAxOCAwMiAxQiAyOCA2NyAxOCAwMiAxQyAyOCA2NyAxOCAwMiBcCisgMUQgMjggNjcgMTggODYgRTAgM0EgMDggNjcgM0IgNzUgMjAgNjcgNDYgNzcgMjQgXAorIDY3IDQyIDc3IDQyIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDQyIDE2IEUwIENBIFwKKyAwNSA3NCA0NiA3NyA0MiA2NyAzQiA3NSA0MiA3NyA0NiAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MzQuaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MzYiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMkEgMjggNjcgMjIgMDIgMzIgMjggNjcgMjIgMDIgMUEgMjggNjcgMjIgMDIgXAorIDFCIDI4IDY3IDIyIDAyIDFDIDI4IDY3IDIyIDAyIDFEIDI4IDY3IDIyIDg2IEUwIFwKKyAzQSAwOCA2NyAzRCA3NSA0NCAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA0OCAxNiBcCisgRTAgQ0EgMDUgNzQgNDggNzcgNDQgNjcgM0QgNzUgNDQgNzcgNDggMTIgQTAgRjggXAorIDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwJyIgI3NkazU2NjM2LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjM4IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFFIDI4IDY3IDJDIDAyIDI2IDI4IDY3IDJDIDAyIDJBIDI4IDY3IDJDIDAyIFwKKyAzMiAyOCA2NyAyQyAwMiAxQSAyOCA2NyAyQyAwMiAxQiAyOCA2NyAyQyAwMiAxQyBcCisgMjggNjcgMkMgMDIgMUQgMjggNjcgMkMgODYgRTAgM0EgMDggNjcgNDcgNzUgNEUgXAorIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDUyIDE2IEUwIENBIDA1IDc0IDUyIDc3IFwKKyA0RSA2NyA0NyA3NSA0RSA3NyA1MiAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiBcCisgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MzguaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MzkiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMUUgMjggNjcgMkMgMDIgMjYgMjggNjcgMkMgMDIgMkEgMjggNjcgMkMgMDIgXAorIDMyIDI4IDY3IDJDIDAyIDFBIDI4IDY3IDJDIDAyIDFCIDI4IDY3IDJDIDAyIDFDIFwKKyAyOCA2NyAyQyAwMiAxRCAyOCA2NyAyQyA4NiBFMCAzQSAwOCA2NyA0NyA3NSA0RSBcCisgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNTIgMTYgRTAgQ0EgMDUgNzQgNTIgNzcgXAorIDRFIDY3IDQ3IDc1IDRFIDc3IDUyIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIFwKKyA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjYzOS5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjMzNCIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMiAyOCA2MCBFMSA2NyAzRCA2NyAxQyAwNiBFMSA4MCBEMiAxRSA3NCAwMiBcCisgMTIgRTAgODUgMDUgRDIgMDUgNzEgMUEgNTIgMDAgM0EgMzggMzIgMDAgMzIgMDEgXAorIEI3IDk3IDc1IDJCIDEyIEUyIEZFIEUxIDAyIDBBIDUwIDEyIEUyIEZFIEUxIDk1IFwKKyA3NSAzNSA4NSA3NyA0QyAxNiBFMCBEQSAwMiA3MSA1MCA3NyA0QyAwNiBFMSA2NyBcCisgNDUgNzUgNEMgNzcgNTAgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgXAorIDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2MzM0LmhleAorCitpZiAkP2Fwb2xsbyAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFFIDI4IDYwIEUwIDY3IDU4IDY3IDczIDA2IEUwIDgwIDI4IDYwIEUwIDY3IFwKKyA3MyA2NyA1OCAwNiBFMCA4MCBEMiAzNiA3NCAwMiAwMiAxQSAyOCA2MCBFMCA2NyBcCisgOUIgNzUgMjkgNjcgQjAgNjcgNTggNzcgMzEgMzIgMEUgODcgMzIgMDggODcgNjcgXAorIEEyIDA2IEUwIDgwIEQyIDFFIDc0IDFDIDEyIEUyIDg1IDA1IEQyIDBGIDcxIDQyIFwKKyA1MiAwMCAxMiBFMSA4NSAwNSBEMiAxRiA3MSA0QyA1MiAwMCAxMiBFMyA4NSAwNSBcCisgRDIgMDUgNzEgNTYgNTIgMDAgM0EgNzAgMzIgMDAgOTcgNzUgNjQgMzIgMDEgOTcgXAorIDcxIDZCIDc3IEIwIDMyIDAxIDk3IDcxIEE5IDc3IEEyIDE2IEUzIERBIDAyIDcxIFwKKyBBOSA3NyBCMCAzMiAwNSA5NyA3NSA4MyAzMiAwMiA5NyA3MSBBMiAwNiBFMSBEMiBcCisgMDEgNzEgQTIgMDYgRTAgNjcgOUIgNzUgQTIgMzIgMDMgOTcgNzEgQjAgMzIgMDQgXAorIDk3IDc1IEE5IDA2IEUyIEQyIDA3IDcxIEE5IDc3IEIwIDEyIEEwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyBcCisgMzIgMEYgODcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY1MjQuaGV4CisKK2lmICQ/dG9tYWhhd2sgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMCAyOCA2MCBFMSA2NyAyNSA2NyAxNCAwNiBFMSA4MCBEMiA0MCA3NCAwMiBcCisgODYgRTAgM0EgRkMgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgMzcgMTYgRTAgQ0EgXAorIDA1IDc0IDNFIDc3IDM3IDY3IDJCIDc1IDM3IDc3IDQ1IDEyIEEwIEY4IDE1IDFBIFwKKyAwMCA1NyAyOCAzMiAwNyA5NyA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRiBcCisgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMDAgMDAgMDAgMDAnIiAjc2RrNTY5NjAuaGV4CisKK2lmICQ/dHJpZGVudDJwbHVzICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDEgMjggNjAgRTEgNjcgMzEgNjcgMjAgMDYgRTEgODAgRDIgMzEgNzQgMDIgXAorIDg2IEUwIDNBIEMwIDY3IDM3IDc1IDFDIDY3IDUxIDc3IDIwIDY3IDQzIDc3IDQzIFwKKyAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA0MyAxNiBFMCBDQSAwNSA3NCA0QSA3NyBcCisgNDMgNjcgMzcgNzUgNDMgNzcgNTEgMTIgQTAgRjggMTUgMUEgMDAgNTcgMjggMzIgXAorIDA3IDk3IDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IFwKKyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1Njg2MC5oZXgKKworaWYgJD9hcGFjaGUgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMCA2NyAyNCA2NyAwRiA4MCBEMiAyNCA3NCAwMiA4NiBFMCAzQSBGOCA2NyBcCisgMzQgNzUgMTYgNzcgMUQgNTcgNjcgM0MgNzUgNjIgNzcgNDQgNTcgNjcgM0MgNzUgXAorIDRFIDc3IDU4IDU3IDY3IDJDIDc1IDYyIDc3IDcwIDA3IDU3IDA3IDEyIEEwIEY4IFwKKyAxNSAxQSAwMCA1NyAwNyAxMiBBMCBGOCAxNSAxQSAwNCA1NyAwNyAxMiBBMCBGOCBcCisgMTUgMUEgMDUgNTcgMTYgRTAgQ0EgMUUgNzQgNjkgNzcgNjIgMDcgNTcgMTYgRTAgXAorIENBIDFFIDc0IDcwIDc3IDYyIDA3IDU3IDE2IEUwIENBIDFFIDc0IDY5IDc3IDcwIFwKKyAwNyA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyBcCisgMzIgMEUgODcgMzIgMEYgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY1NjAuaGV4CisKK2lmICQ/Z2VuZXJpYzhsZWQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwNiBFMSBEMiA0MCA3MSAxMSBFMCA2MCBFMSAxNiBFMyBEQSAwMSA3MSAxNSA2MCBcCisgRTMgNjcgNUQgNzUgMkIgMTIgMDEgNjEgRTMgNjcgNzEgMjggNjcgMzIgODYgRTAgXAorIDE2IEUyIDgxIDYxIEUyIERBIDFFIDc1IDJCIDNBIDA4IEU5IDYxIEUyIDg2IEUxIFwKKyA3NyAwMCA2NyA1RCA3NSAzOCA3NyAzQyA2NyA2NCA3NyA2NCA2NyA0MSA2NyA0RiBcCisgNTcgMjggMzIgMDEgOTcgNzUgNjQgMTYgRTAgQ0EgMDUgNzQgNjggNzcgNjQgMjggXAorIDMyIDAwIDk3IDc1IDY0IDE2IEUwIENBIDA1IDc0IDY4IDc3IDY0IDEyIEEwIEY4IFwKKyAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwOSA3NSA2NCA3NyBcCisgNjggMTIgMDUgNjcgNkMgMTIgMDQgNjcgNkMgMTIgMDMgNjcgNkMgMTIgMDIgNjcgXAorIDZDIDEyIDAxIDY3IDZDIDEyIDAwIDY3IDZDIDU3IDAwIDAwIDAwIDAwIDAwIDAwJyIgI2dlbmVyaWM4bGVkLmhleAorCisjIERvd25sb2FkIExFRCBjb2RlIGludG8gTEVEIHByb2Nlc3NvciBhbmQgZW5hYmxlIChpZiBhcHBsaWNhYmxlKS4KKworaWYgJD9mZWF0dXJlX2xlZF9wcm9jICYmICQ/bGVkY29kZSAmJiAhJD9zaW11bGF0b3IgXAorCSJsZWQgcHJvZyAkbGVkY29kZTsgXAorCSBsZWQgYXV0byBvbjsgbGVkIHN0YXJ0IgorCisjIFNldHVwIEdyZXlob3VuZCBMRUQgcHJvY2Vzc29yCitpZiAkP2dyZXlob3VuZCBcCisgICAgInJjbG9hZCBnaF9sZWR1cC5zb2MiCisKKyMgU2V0dXAgSHVycmljYW5lMyBMRUQgcHJvY2Vzc29yCitpZiAkP2h1cnJpY2FuZTMgXAorICAgICJyY2xvYWQgaHIzX2xlZC5zb2MiCisKKyMgU2V0dXAgVG9tYWhhd2sgTEVEIHByb2Nlc3NvcgoraWYgJD90b21haGF3ayAmJiAhJD9zaW11bGF0b3IgXAorICAgICJsZWQgMSBwcm9nICRsZWRjb2RlOyBcCisgICAgIGxlZCAxIGF1dG8gb247IGxlZCAxIHN0YXJ0OyBcCisgICAgIGxlZCAyIHByb2cgJGxlZGNvZGU7IFwKKyAgICAgbGVkIDIgYXV0byBvbjsgbGVkIDIgc3RhcnQiCisKKyMgSWYgbG9hZGluZyBtdWx0aXBsZSByYy5zb2MsIHVwb24gbG9hZGluZyB0aGUgbGFzdCB1bml0LCByZXN0YXJ0CisjIGFsbCBMRUQgcHJvY2Vzc29ycyBzbyBhbnkgY29tbW9uIGJsaW5raW5nIGlzIGluIHN5bmMuCisKK2lmICEiZXhwciAkP2ZlYXR1cmVfbGVkX3Byb2MgJiYgISQ/c2ltdWxhdG9yICYmICR1bml0ID09ICR1bml0cyAtIDEiIFwKKwkiKjpsZWQgc3RvcDsgKjpsZWQgc3RhcnQiCisKKyMgUnVuIGNvdW50ZXIgRE1BIHRhc2sgNCB0aW1lcyBwZXIgc2Vjb25kIHRvIGFjaGlldmUgYmV0dGVyCisjIGN0cl94YXVpX2FjdGl2aXR5LgoraWYgJD9icmFkbGV5X2FueSBcCisgICAgICAgICJjdHIgaW50ZXJ2YWw9MjUwMDAwIgorCisjIEluaXRpYWxpemUgSGVyY3VsZXMgVUMgbW9kaWQgMCBlbnRyeSB0byBwb2ludCB0byB0aGUgQ1BVCitpZiAkP2hlcmNfYW55IFwKKwkidyB1YyAwIDEgMSIKKworIyBBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIDQ4LXBvcnQgaW4gU3RhY2tpbmcgbW9kZS4KKyMgT24gdGhlIDQ4LXBvcnQgcGxhdGZvcm0sIHJjLnNvYyBpcyBydW4gdHdpY2U7IG9uY2Ugb24gdW5pdCAwIGFuZAorIyB0aGVuIG9uY2Ugb24gdW5pdCAxLiAgVGhlIHR1cmJvIHBvcnQgb24gdW5pdCBOIGlzIGdlTi4KKyMgQWxsIHR1cmJvIHBvcnQgdHJhZmZpYyBtdXN0IGJlIHRhZ2dlZDsgc2VlIHZsYW4gYWRkIGJlbG93LgorIyBTZWUgJFNESy9kb2MvNDgtcG9ydC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gaW5jbHVkaW5nIGhvdworIyB0byBjb25maWd1cmUgSVBHIHZhbHVlcyBmb3IgbGluZSByYXRlIG9wZXJhdGlvbi4KKworaWYgJD9wNDggJiYgJD91bml0MCBcCisJImxvY2FsIHR1cmJvX3BvcnQgMDsgbG9jYWwgbXlfbW9kaWQgMTsiCisKK2lmICQ/cDQ4ICYmICQ/dW5pdDEgXAorCSJsb2NhbCB0dXJib19wb3J0IDE7IGxvY2FsIG15X21vZGlkIDI7IgorCitpZiAkP3A0OCBcCisJIm0gY29uZmlnIHN0X2lzX21pcnI9MCBzdF9tb2R1bGU9MSBzdF9tY250PTEgc3Rfc2ltcGxleD0wIHN0X2xpbms9MDsgXAorCSBtIGNvbmZpZy5nJHR1cmJvX3BvcnQgc3RfbGluaz0xOyBcCisJIG0gZ21hY2MyLmdlJHR1cmJvX3BvcnQgaXBndD04IG1jbGtmcT0xOyBcCisJIG0gZmVfbWF4ZiBtYXhmcj0xNTYwOyBcCisJIG0gbWF4ZnIgbWF4ZnI9MTU2ODsgXAorCSBtIGNvbmZpZzIgbXlfbW9kaWQ9JG15X21vZGlkOyBcCisJIHBvcnQgZ2UkdHVyYm9fcG9ydCBzcGVlZD0yNTAwOyBcCisJIHZsYW4gYWRkIDEgcGJtPWdlJHR1cmJvX3BvcnQgdWJtPW5vbmUiCisKK2lmICEkP25vX2JjbSAmJiAkP2RyYWNfYW55IFwKKyAgICJtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDE9MHhjIgoraWYgISQ/bm9fYmNtICYmICQ/bHlueF9hbnkgXAorICAgIm0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMT0weDEiCitpZiAhJD9ub19iY20gJiYgJD90dWNhbmEgXAorICAgInN0a21vZGUgbW9kaWQ9MDsiCitpZiAhJD9ub19iY20gJiYgJD90dWNhbmEgJiYgISQ/bWFnbnVtICYmICEkP3R1Y2FuYV9ub2hnIFwKKyAgICJtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDI9MHgzODsgXAorICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTAgcG9ydF9mb3JfbW9kMj0weDM4OyBcCisgICAgc3RrbW9kZSBtb2RpZD0wIgoraWYgISQ/bm9fYmNtICYmICQ/eGdzX3N3aXRjaCAmJiAhJD9yY3B1X29ubHlcCisgICAic3RrbW9kZSBtb2RpZD0wOyBcCisgICAgcyBDTUlDX0NPU19DVFJMX1JYIENIMF9DT1NfQk1QPTAsQ0gxX0NPU19CTVA9MHhmZiwgXAorICAgICAgICBDSDJfQ09TX0JNUD0wLENIM19DT1NfQk1QPTAiCisKKyMgQmFjay10by1iYWNrIERyYWNvIHNldHVwLgorCisjIERyYWNvIGNoaXBzIG11c3QgcnVuIGF0IDEyN01Iei4gU29tZSBvbGRlciB2ZXJzaW9ucworIyBhcmUgbm90IHNldCB0byB0aGlzIGZyZXF1ZW5jeS4KKworaWYgJD9kcmFjb19zdGsgJiYgJD91bml0MCBcCisgICAgImkyYyBwcm9iZSBxdWlldDsgYmIgY2xvY2sgUmVmMTI1IDEyNyIKKworIyBBcHBsaWVzIHRvIFNESyBCYXNlYm9hcmQgd2l0aCBlaXRoZXIgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgSGlnaWdzLAorIyBhcyB3ZWxsIGFzIHRoZSBHYWxhaGFkIHJlZmVyZW5jZSBkZXNpZ24uCisKK2lmICQ/ZHJhY29fYjJiICYmICQ/dW5pdDAgXAorICAgICJzdGttb2RlIG1vZGlkPTA7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0xMjsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0xMiIKKworaWYgISQ/c2ltdWxhdG9yICYmICQ/ZHJhY29fYjJiICYmICQ/dW5pdDAgXAorICAgICAiaTJjIHByb2JlIHF1aWV0OyBiYiBjbG9jayBSZWYxMjUgMTI3IgorCitpZiAkP2RyYWNvX2IyYiAmJiAkP3VuaXQxIFwKKyAgICAic3RrbW9kZSBtb2RpZD0xOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTA7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTAiCisKKyMgTWVybGluLCBXaGl0ZSBLbmlnaHQsIEJsYWNrIEtuaWdodCBzZXR1cC4KKyMJRHJhY28gdW5pdCAxIGlzIG9uIEhlcmMgcG9ydCA4CisjCURyYWNvIHVuaXQgMiBpcyBvbiBIZXJjIHBvcnQgMQorCitpZiAkP2RyYWNvX2hlcmM0ICYmICQ/dW5pdDAgXAorICAgICJ3IHVjLmhwaWM3IDAgMSAweDA7IFwKKyAgICAgdyB1Yy5ocGljNyAxIDEgMHgyOyBcCisgICAgIHcgdWMuaHBpYzAgMCAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzAgMSAxIDB4MCIKKworaWYgISQ/c2ltdWxhdG9yICYmICQ/ZHJhY29faGVyYzQgJiYgJD91bml0MCBcCisgICAgICJpMmMgcHJvYmUgcXVpZXQ7IGJiIGNsb2NrIFJlZjEyNSAxMjciCisKK2lmICQ/ZHJhY29faGVyYzQgJiYgJD91bml0MSBcCisgICAgInN0a21vZGUgbW9kaWQ9MDsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTEyOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTEyIgorCitpZiAkP2RyYWNvX2hlcmM0ICYmICQ/dW5pdDIgXAorICAgICJzdGttb2RlIG1vZGlkPTE7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MDsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MCIKKworIyBMYW5jZWxvdCBzZXR1cAorIyAoZW5hYmxlZCBieSBhZGRpbmcgdGhlIHByb3BlcnR5ICJsYW5jZWxvdD0xIikKKyMgTm90ZXM6CisjCURyYWNvIHVuaXQgMSBpcyBvbiBIZXJjIHBvcnQgNworIwlEcmFjbyB1bml0IDIgaXMgb24gSGVyYyBwb3J0IDgKKyMJRHJhY28gdW5pdCAzIGlzIG9uIEhlcmMgcG9ydCAxCisjCURyYWNvIHVuaXQgNCBpcyBvbiBIZXJjIHBvcnQgMgorCitpZiAkP2xhbmNlbG90ICYmICQ/dW5pdDAgXAorICAgICJ3IHVjLmhwaWM2IDAgMSAweDA7IFwKKyAgICAgdyB1Yy5ocGljNiAxIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljNiAyIDEgMHgyOyBcCisgICAgIHcgdWMuaHBpYzYgMyAxIDB4NDsgXAorICAgICB3IHVjLmhwaWM3IDAgMSAweDgwOyBcCisgICAgIHcgdWMuaHBpYzcgMSAxIDB4MDsgXAorICAgICB3IHVjLmhwaWM3IDIgMSAweDI7IFwKKyAgICAgdyB1Yy5ocGljNyAzIDEgMHg0OyBcCisgICAgIHcgdWMuaHBpYzAgMCAxIDB4ODA7IFwKKyAgICAgdyB1Yy5ocGljMCAxIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljMCAyIDEgMHgwOyBcCisgICAgIHcgdWMuaHBpYzAgMyAxIDB4NDsgXAorICAgICB3IHVjLmhwaWMxIDAgMSAweDgwOyBcCisgICAgIHcgdWMuaHBpYzEgMSAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzEgMiAxIDB4MjsgXAorICAgICB3IHVjLmhwaWMxIDMgMSAweDAiCisKK2lmICEkP3NpbXVsYXRvciAmJiAkP2xhbmNlbG90ICYmICQ/dW5pdDAgXAorICAgICAiaTJjIHByb2JlIHF1aWV0OyBiYiBjbG9jayBEcmFjb19Db3JlIDEyNyIKKworaWYgJD9sYW5jZWxvdCAmJiAkP3VuaXQxIFwKKyAgICAic3RrbW9kZSBtb2RpZD0wOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MTI7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MTIiCisKK2lmICQ/bGFuY2Vsb3QgJiYgJD91bml0MiBcCisgICAgInN0a21vZGUgbW9kaWQ9MTsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0wIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xMiBwb3J0X2Zvcl9tb2QzPTEyOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0wIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xMiBwb3J0X2Zvcl9tb2QzPTEyIgorCitpZiAkP2xhbmNlbG90ICYmICQ/dW5pdDMgXAorICAgICJzdGttb2RlIG1vZGlkPTI7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTAgcG9ydF9mb3JfbW9kMz0xMjsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTAgcG9ydF9mb3JfbW9kMz0xMiIKKworaWYgJD9sYW5jZWxvdCAmJiAkP3VuaXQ0IFwKKyAgICAic3RrbW9kZSBtb2RpZD0zOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xMiBwb3J0X2Zvcl9tb2QzPTA7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xMiBwb3J0X2Zvcl9tb2QzPTAiCisKKyMgTHlueCBTREsgKFR3b0x5bngpIHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgInR3b2x5bng9MSIpCisKK2lmICQ/dHdvbHlueCAmJiAkP3VuaXQwIFwKKyAgICAic3RrbW9kZSBtb2RpZD0wOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MTsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0xOyBcCisgICAgICIKKworaWYgJD90d29seW54ICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTE7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEgcG9ydF9mb3JfbW9kMT0wOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MSBwb3J0X2Zvcl9tb2QxPTA7IFwKKyAgICAgIgorIyBIZXJjdUx5bnggc2V0dXAKKyMgKGVuYWJsZWQgYnkgYWRkaW5nIHRoZSBwcm9wZXJ0eSAiaGVyY3VseW54PTEiKQorIyBOb3RlczoKKyMJTHlueCB1bml0IDEgaXMgb24gSGVyYyBwb3J0IDEKKyMJTHlueCB1bml0IDIgaXMgb24gSGVyYyBwb3J0IDIKKyMJTHlueCB1bml0IDMgaXMgb24gSGVyYyBwb3J0IDMKKyMJTHlueCB1bml0IDQgaXMgb24gSGVyYyBwb3J0IDQKKyMJTHlueCB1bml0IDUgaXMgb24gSGVyYyBwb3J0IDUKKyMJTHlueCB1bml0IDYgaXMgb24gSGVyYyBwb3J0IDYKKyMJTHlueCB1bml0IDcgaXMgb24gSGVyYyBwb3J0IDcKKyMJTHlueCB1bml0IDggaXMgb24gSGVyYyBwb3J0IDgKKworaWYgJD9oZXJjdWx5bnggJiYgJD91bml0MCBcCisgICAgIiBcCisgICAgIHcgdWMuaHBpYzAgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzAgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzAgMiAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzAgMyAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzAgNCAxIDB4MDIwOyBcCisgICAgIHcgdWMuaHBpYzAgNSAxIDB4MDQwOyBcCisgICAgIHcgdWMuaHBpYzAgNiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzAgNyAxIDB4MTAwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzEgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzEgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzEgMiAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzEgMyAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzEgNCAxIDB4MDIwOyBcCisgICAgIHcgdWMuaHBpYzEgNSAxIDB4MDQwOyBcCisgICAgIHcgdWMuaHBpYzEgNiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzEgNyAxIDB4MTAwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzIgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzIgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzIgMiAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzIgMyAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzIgNCAxIDB4MDIwOyBcCisgICAgIHcgdWMuaHBpYzIgNSAxIDB4MDQwOyBcCisgICAgIHcgdWMuaHBpYzIgNiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzIgNyAxIDB4MTAwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzMgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzMgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzMgMiAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzMgMyAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzMgNCAxIDB4MDIwOyBcCisgICAgIHcgdWMuaHBpYzMgNSAxIDB4MDQwOyBcCisgICAgIHcgdWMuaHBpYzMgNiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzMgNyAxIDB4MTAwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzQgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzQgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzQgMiAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzQgMyAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzQgNCAxIDB4MDIwOyBcCisgICAgIHcgdWMuaHBpYzQgNSAxIDB4MDQwOyBcCisgICAgIHcgdWMuaHBpYzQgNiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzQgNyAxIDB4MTAwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzUgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzUgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzUgMiAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzUgMyAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzUgNCAxIDB4MDIwOyBcCisgICAgIHcgdWMuaHBpYzUgNSAxIDB4MDQwOyBcCisgICAgIHcgdWMuaHBpYzUgNiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzUgNyAxIDB4MTAwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzYgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzYgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzYgMiAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzYgMyAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzYgNCAxIDB4MDIwOyBcCisgICAgIHcgdWMuaHBpYzYgNSAxIDB4MDQwOyBcCisgICAgIHcgdWMuaHBpYzYgNiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzYgNyAxIDB4MTAwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzcgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzcgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzcgMiAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzcgMyAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzcgNCAxIDB4MDIwOyBcCisgICAgIHcgdWMuaHBpYzcgNSAxIDB4MDQwOyBcCisgICAgIHcgdWMuaHBpYzcgNiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzcgNyAxIDB4MTAwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgICIKKworaWYgJD9oZXJjdWx5bnggJiYgJD9seW54X2FueSBcCisgICAgICJtIG1vZHBvcnRfN18wIFwKKyAgICAgcG9ydF9mb3JfbW9kMD0xIHBvcnRfZm9yX21vZDE9MSBcCisgICAgIHBvcnRfZm9yX21vZDI9MSBwb3J0X2Zvcl9tb2QzPTEgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEgcG9ydF9mb3JfbW9kNT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xIHBvcnRfZm9yX21vZDc9MTsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBcCisgICAgIHBvcnRfZm9yX21vZDA9MSBwb3J0X2Zvcl9tb2QxPTEgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEgcG9ydF9mb3JfbW9kMz0xIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xIHBvcnRfZm9yX21vZDU9MSBcCisgICAgIHBvcnRfZm9yX21vZDY9MSBwb3J0X2Zvcl9tb2Q3PTE7IFwKKyAgICAgIgorCitpZiAkP2hlcmN1bHlueCAmJiAkP3VuaXQxIFwKKyAgICAic3RrbW9kZSBtb2RpZD0wIgorCitpZiAkP2hlcmN1bHlueCAmJiAkP3VuaXQyIFwKKyAgICAic3RrbW9kZSBtb2RpZD0xIgorCitpZiAkP2hlcmN1bHlueCAmJiAkP3VuaXQzIFwKKyAgICAic3RrbW9kZSBtb2RpZD0yIgorCitpZiAkP2hlcmN1bHlueCAmJiAkP3VuaXQ0IFwKKyAgICAic3RrbW9kZSBtb2RpZD0zIgorCitpZiAkP2hlcmN1bHlueCAmJiAkP3VuaXQ1IFwKKyAgICAic3RrbW9kZSBtb2RpZD00IgorCitpZiAkP2hlcmN1bHlueCAmJiAkP3VuaXQ2IFwKKyAgICAic3RrbW9kZSBtb2RpZD01IgorCitpZiAkP2hlcmN1bHlueCAmJiAkP3VuaXQ3IFwKKyAgICAic3RrbW9kZSBtb2RpZD02IgorCitpZiAkP2hlcmN1bHlueCAmJiAkP3VuaXQ4IFwKKyAgICAic3RrbW9kZSBtb2RpZD03IgorCisjIEx5bnhhTG90IHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImx5bnhhbG90PTEiKQorIyBOb3RlczoKKyMJTHlueCB1bml0IDAgaXMgb24gSGVyYyBwb3J0IDMgKGhnMi9ocGljMikgKG1vZCAwKQorIwlMeW54IHVuaXQgMSBpcyBvbiBIZXJjIHBvcnQgNCAoaGczL2hwaWMzKSAobW9kIDEpCisjCUhpZ2lnIGNvbm4gMCBpcyBvbiBIZXJjIHBvcnQgNSAoaGc0L2hwaWM0KQorIwlIaWdpZyBjb25uIDEgaXMgb24gSGVyYyBwb3J0IDYgKGhnNS9ocGljNSkKKyMJRHJhY28gdW5pdCAzIGlzIG9uIEhlcmMgcG9ydCA3IChoZzYvaHBpYzYpIChtb2QgMikKKyMJRHJhY28gdW5pdCA0IGlzIG9uIEhlcmMgcG9ydCA4IChoZzcvaHBpYzcpIChtb2QgMykKKyMJRHJhY28gdW5pdCA1IGlzIG9uIEhlcmMgcG9ydCAxIChoZzAvaHBpYzApIChtb2QgNCkKKyMJRHJhY28gdW5pdCA2IGlzIG9uIEhlcmMgcG9ydCAyIChoZzEvaHBpYzEpIChtb2QgNSkKKworaWYgJD9seW54YWxvdCAmJiAkP3VuaXQyIFwKKyAgICAiIFwKKyAgICAgdyB1Yy5ocGljMCAwIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMCAxIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMCAyIDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMCAzIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljMCA0IDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMCA1IDEgMHgwMDQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljMSAwIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMSAxIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMSAyIDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMSAzIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljMSA0IDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMSA1IDEgMHgwMDQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljMiAwIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMiAxIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMiAyIDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMiAzIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljMiA0IDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMiA1IDEgMHgwMDQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljMyAwIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMyAxIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMyAyIDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMyAzIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljMyA0IDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMyA1IDEgMHgwMDQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNiAwIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljNiAxIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljNiAyIDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljNiAzIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljNiA0IDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNiA1IDEgMHgwMDQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNyAwIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljNyAxIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljNyAyIDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljNyAzIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljNyA0IDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNyA1IDEgMHgwMDQ7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgIgorCitpZiAkP2x5bnhhbG90ICYmICQ/bHlueF9hbnkgXAorICAgICAibSBtb2Rwb3J0XzdfMCBcCisgICAgIHBvcnRfZm9yX21vZDA9MSBwb3J0X2Zvcl9tb2QxPTEgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEgcG9ydF9mb3JfbW9kMz0xIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xIHBvcnRfZm9yX21vZDU9MSBcCisgICAgIHBvcnRfZm9yX21vZDY9MSBwb3J0X2Zvcl9tb2Q3PTE7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgXAorICAgICBwb3J0X2Zvcl9tb2QwPTEgcG9ydF9mb3JfbW9kMT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xIHBvcnRfZm9yX21vZDM9MSBcCisgICAgIHBvcnRfZm9yX21vZDQ9MSBwb3J0X2Zvcl9tb2Q1PTEgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEgcG9ydF9mb3JfbW9kNz0xOyBcCisgICAgICIKKworaWYgJD9seW54YWxvdCAmJiAkP2RyYWNfYW55IFwKKyAgICAibSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MTIgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEyIHBvcnRfZm9yX21vZDU9MTIgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEyIHBvcnRfZm9yX21vZDc9MTI7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xMiBwb3J0X2Zvcl9tb2QzPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xMiBwb3J0X2Zvcl9tb2Q1PTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xMiBwb3J0X2Zvcl9tb2Q3PTEyOyBcCisgICAgICIKKworaWYgJD9seW54YWxvdCAmJiAkP3VuaXQwIFwKKyAgICAic3RrbW9kZSBtb2RpZD0wIgorICAgICAKK2lmICQ/bHlueGFsb3QgJiYgJD91bml0MSBcCisgICAgInN0a21vZGUgbW9kaWQ9MSIKKworaWYgJD9seW54YWxvdCAmJiAkP3VuaXQzIFwKKyAgICAic3RrbW9kZSBtb2RpZD0yIgorCitpZiAkP2x5bnhhbG90ICYmICQ/dW5pdDQgXAorICAgICJzdGttb2RlIG1vZGlkPTMiCisKK2lmICQ/bHlueGFsb3QgJiYgJD91bml0NSBcCisgICAgInN0a21vZGUgbW9kaWQ9NCIKKworaWYgJD9seW54YWxvdCAmJiAkP3VuaXQ2IFwKKyAgICAic3RrbW9kZSBtb2RpZD01IgorCisjIGd1ZW5ldmVyZSBzZXR1cAorIyAoZW5hYmxlZCBieSBhZGRpbmcgdGhlIHByb3BlcnR5ICJndWVuZXZlcmU9MSIpCisjIE5vdGVzOgorIyAgICAgICBoZ1ggbWFwcGluZyBiYXNlZCBvbiBwYm1wX3ZhbGlkLjA9MHgxYjcKKyMJRHJhY28gdW5pdCAxIGlzIG9uIEhlcmMgcG9ydCAxIChoZzAvaHBpYzApIChtb2QgMCkKKyMJRHJhY28gdW5pdCAyIGlzIG9uIEhlcmMgcG9ydCAyIChoZzEvaHBpYzEpIChtb2QgMSkKKyMJTHlueCB1bml0IDMgaXMgb24gSGVyYyBwb3J0IDggKGhnNS9ocGljNykgKG1vZCAyKQorIwlMeW54IHVuaXQgNCBpcyBvbiBIZXJjIHBvcnQgNyAoaGc0L2hwaWM2KSAobW9kIDMpCisjCUhpZ2lnIGNvbm4gMCBpcyBvbiBIZXJjIHBvcnQgNCAoaGcyL2hwaWMzKQorIwlIaWdpZyBjb25uIDEgaXMgb24gSGVyYyBwb3J0IDUgKGhnMy9ocGljNCkKKyMgICAgICAgSGVyYyBwb3J0IDMgLSBVbnVzZWQgKGhwaWMyKQorIyAgICAgICBIZXJjIHBvcnQgNiAtIFVudXNlZCAoaHBpYzUpCitpZiAkP2d1ZW5ldmVyZSAmJiAkP3VuaXQwIFwKKyAgICAiIFwKKyAgICAgdyB1Yy5ocGljMCAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMCAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljMCAyIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljMCAzIDEgMHgwODA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljMSAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMSAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljMSAyIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljMSAzIDEgMHgwODA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNyAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNyAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljNyAyIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljNyAzIDEgMHgwODA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNiAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNiAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljNiAyIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljNiAzIDEgMHgwODA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgIgorCitpZiAkP2d1ZW5ldmVyZSAmJiAkP2x5bnhfYW55IFwKKyAgICAgIm0gbW9kcG9ydF83XzAgXAorICAgICBwb3J0X2Zvcl9tb2QwPTEgcG9ydF9mb3JfbW9kMT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xIHBvcnRfZm9yX21vZDM9MSBcCisgICAgIHBvcnRfZm9yX21vZDQ9MSBwb3J0X2Zvcl9tb2Q1PTEgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEgcG9ydF9mb3JfbW9kNz0xOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIFwKKyAgICAgcG9ydF9mb3JfbW9kMD0xIHBvcnRfZm9yX21vZDE9MSBcCisgICAgIHBvcnRfZm9yX21vZDI9MSBwb3J0X2Zvcl9tb2QzPTEgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEgcG9ydF9mb3JfbW9kNT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xIHBvcnRfZm9yX21vZDc9MTsgXAorICAgICAiCisKK2lmICQ/Z3VlbmV2ZXJlICYmICQ/ZHJhY19hbnkgXAorICAgICJtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMiBcCisgICAgIHBvcnRfZm9yX21vZDQ9MTIgcG9ydF9mb3JfbW9kNT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDY9MTIgcG9ydF9mb3JfbW9kNz0xMjsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MTIgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEyIHBvcnRfZm9yX21vZDU9MTIgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEyIHBvcnRfZm9yX21vZDc9MTI7IFwKKyAgICAgIgorCitpZiAkP2d1ZW5ldmVyZSAmJiAkP3VuaXQxIFwKKyAgICAic3RrbW9kZSBtb2RpZD0wIgorICAgICAKK2lmICQ/Z3VlbmV2ZXJlICYmICQ/dW5pdDIgXAorICAgICJzdGttb2RlIG1vZGlkPTEiCisKK2lmICQ/Z3VlbmV2ZXJlICYmICQ/dW5pdDMgXAorICAgICJzdGttb2RlIG1vZGlkPTIiCisKK2lmICQ/Z3VlbmV2ZXJlICYmICQ/dW5pdDQgXAorICAgICJzdGttb2RlIG1vZGlkPTMiCisgICAgIAorIyBmZWxpeDQ4IHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImZlbGl4NDg9MSIpCisjIE5vdGVzOgorIyAgICAgICBCQ001NjEwMiB1bml0LTAgaGlnaWcgcG9ydCAocG9ydCAyNikgaXMgY29ubmVjdGVkCisjICAgICAgIHRvIEJDTTU2MTAyIFVuaXQtMSBoaWdpZyBwb3J0IChwb3J0IDI2KQorIworCitpZiAkP2ZlbGl4NDggJiYgJD91bml0MCBcCisgICAgInN0a21vZGUgbW9kaWQ9MCA7IFwKKyAgICAgbSBJRUdSX1BPUlQgTVlfTU9ESUQ9MDsgXAorICAgICBtIFhQT1JUX0NPTkZJRyBNWV9NT0RJRD0wOyBcCisgICAgIHcgTU9EUE9SVF9NQVAgMSAxIEhJR0lHX1BPUlRfQklUTUFQPTB4NCA7IFwKKyAgICAgIgorCitpZiAkP2ZlbGl4NDggJiYgJD91bml0MSBcCisgICAgInN0a21vZGUgbW9kaWQ9MSA7IFwKKyAgICAgbSBJRUdSX1BPUlQgTVlfTU9ESUQ9MTsgXAorICAgICBtIFhQT1JUX0NPTkZJRyBNWV9NT0RJRD0xOyBcCisgICAgIHcgTU9EUE9SVF9NQVAgMCAxIEhJR0lHX1BPUlRfQklUTUFQPTB4NCA7IFwKKyAgICAgIgorIyBmYnBvZSBzZXR1cAorIyAoZW5hYmxlZCBieSBhZGRpbmcgdGhlIHByb3BlcnR5ICJmYnBvZT0xIikKKyMgTm90ZXM6CisjICAgICAgIEJDTTU2NTA0IHVuaXQtMCBoaWdpZyBwb3J0IChwb3J0IDI3LDI4KSBpcyBjb25uZWN0ZWQKKyMgICAgICAgdG8gQkNNNTY1MDQgVW5pdC0xIGhpZ2lnIHBvcnQgKHBvcnQgMjcsMjgpCisjCisKK2lmICQ/dW5pdDAgJiYgJD9maXJlYm9sdF9hbnkgJiYgJD9mYnBvZSAgICAgXAorICAic3RrbW9kZSBtb2RpZD0wOyAgICAgICAgICAgXAorICAgdyBtb2Rwb3J0X21hcCAxIDEgSElHSUdfUE9SVF9CSVRNQVA9MHg0OyBcCisgICBtIEhJR0lHX1RSVU5LX0dST1VQIEhJR0lHX1RSVU5LX1JUQUcxPTMgXAorICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDFfUE9SVDA9MiBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMT0zIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQxX1BPUlQyPTIgXAorICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDFfUE9SVDM9MzsgXAorICAgbSBISUdJR19UUlVOS19DT05UUk9MIEhJR0lHX1RSVU5LX0lEMj0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOSzI9MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQzPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LMz0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19CSVRNQVAxPTB4YyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSVZFX1BPUlRfQklUTUFQPTB4ZiIKKworaWYgJD91bml0MSAmJiAkP2ZpcmVib2x0X2FueSAmJiAkP2ZicG9lIFwKKyAgInN0a21vZGUgbW9kaWQ9MTsgXAorICAgdyBtb2Rwb3J0X21hcCAwIDEgSElHSUdfUE9SVF9CSVRNQVA9MHg0OyBcCisgICBtIEhJR0lHX1RSVU5LX0dST1VQIEhJR0lHX1RSVU5LX1JUQUcxPTMgXAorICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDFfUE9SVDA9MiBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMT0zIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQxX1BPUlQyPTIgXAorICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDFfUE9SVDM9MzsgXAorICAgbSBISUdJR19UUlVOS19DT05UUk9MIEhJR0lHX1RSVU5LX0lEMj0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOSzI9MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQzPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LMz0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19CSVRNQVAxPTB4YyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSVZFX1BPUlRfQklUTUFQPTB4ZiIKKworIyBEdWFsIFJhcHRvci9SYXZlbiBib2FyZHMKK2lmICQ/cmF2ZW5fZWJfNDhwIHx8ICQ/cmFwMjRfcmVmIFwKKyAgICAibG9jYWwgcmNwdV9zeXN0ZW0gMSIKK2lmICQ/dW5pdDAgJiYgJD9yY3B1X3N5c3RlbSBcCisgICAic3RrbW9kZSBtb2RpZD0wIgoraWYgJD91bml0MSAmJiAkP3JjcHVfc3lzdGVtIFwKKyAgICJzdGttb2RlIG1vZGlkPTEiCisKKyMgTE0gZmI0OCBwbGF0Zm9ybSBzZXR1cAorIyAoZW5hYmxlZCBieSBhZGRpbmcgdGhlIHByb3BlcnR5ICJsbTQ4cD0xIikKKyMKK2lmICQ/dW5pdDAgJiYgJD9maXJlYm9sdF9hbnkgJiYgJD9sbTQ4cCB8fCAkP2xtNDhwX0QgXAorICAgInN0a21vZGUgbW9kaWQ9MCIKKworaWYgJD91bml0MSAmJiAkP2ZpcmVib2x0X2FueSAmJiAkP2xtNDhwIHx8ICQ/bG00OHBfRCBcCisgICAic3RrbW9kZSBtb2RpZD0xIgorCisjIFNldCBGaXJlYm9sdCBQT0UgcG93ZXIgbGV2ZWwgMTcwKHRvdGFsKSAtIDExMChzd2l0Y2gpID0gNjAKK2lmICQ/ZmJwb2UgXAorICAgICAgICAibG9jYWwgcG9lcG93ZXIgNjAiCisKKyMgU2V0IERyYWNvMTUgUE9FIHBvd2VyIGxldmVsIDE3MCh0b3RhbCkgLSA4MChzd2l0Y2gpID0gOTAKK2lmICQ/ZHJhYzE1XAorICAgICAgICAibG9jYWwgcG9lcG93ZXIgOTAiCisKKyMgSHVycmljYW5lMyBCQ005NTYxNjBSIHNldHVwCisjIE5vdGVzOgorIyAgICAgICBCQ001NjE2MCB1bml0LTAgaGlnaWcgcG9ydCAocG9ydCAyOSwzMCkgaXMgY29ubmVjdGVkCisjICAgICAgIHRvIEJDTTU2MTYwIFVuaXQtMSBoaWdpZyBwb3J0IChwb3J0IDI2LDI3KQorIworCitpZiAkP2JjbTk1NjE2MHIgJiYgJD91bml0MCAgXAorICAic3RrbW9kZSBtb2RpZD0wOyBcCisgICB3IG1vZHBvcnRfbWFwIDEgMSBISUdJR19QT1JUX0JJVE1BUD0weDYwMDAwMDAwOyBcCisgICB0cnVuayBhZGQgaWQ9MTI4IHI9MyBwYm09aGcwLWhnMSIKKworaWYgJD9iY205NTYxNjByICYmICQ/dW5pdDEgIFwKKyAgInN0a21vZGUgbW9kaWQ9MTsgXAorICAgdyBtb2Rwb3J0X21hcCAwIDEgSElHSUdfUE9SVF9CSVRNQVA9MHhjMDAwMDAwOyBcCisgICB0cnVuayBhZGQgaWQ9MTI4IHI9MyBwYm09aGcwLWhnMSIKKworIyBpZiBlbmFibGVfcG9lIGlzIHNldCwgdGhlbiBlbmFibGUgdGhlIFBPRSBwcm9jZXNzb3IgZm9yCisjIGVpdGhlciBGaXJlYm9sdCBvciBEcmFjbzE1IHBsYXRmb3JtCitpZiAkP3VuaXQwICYmICQ/ZW5hYmxlX3BvZSAmJiAkP2ZicG9lIHx8ICQ/ZHJhYzE1IFwKKyAgICAgICAgIiRlY2hvIHJjOiBFbmFibGluZyBQT0UgLi4uOyBcCisgICAgICAgICBwb2VzZWwgcmVzZXQ7IFwKKyAgICAgICAgIGkyYyBwcm9iZSBxdWlldDsgXAorICAgICAgICAgeHBvZSB2ZXJib3NlIG9mZjsgXAorICAgICAgICAgeHBvZSBwb3dlciAkcG9lcG93ZXI7IFwKKyAgICAgICAgIHhwb2UgdmVyYm9zZSBvbjsgXAorICAgICAgICAgcG9lc2VsIGVuYWJsZSIKKworIyBtYXJrIHRoaXMgdW5pdCBzbyB0aGF0IHN1YnNlcXVlbnQgcmMgcnVucyBhcmUgcXVpZXQKK3NldGVudiByYyR1bml0IDEKKworaWYgJD9tYWNzZWMgJ1wKKyAgICBtYWNzZWMgc3luYzsgXAorICAgICRlY2hvICJyYzogTUFDU0VDIENMSSBFbmFibGVkIicKKworIyBjYWNoZSBhIGNvcHkgb2YgcmMuc29jIGluIG1lbW9yeQorcmNjYWNoZSBhZGRxIHJjLnNvYworCisjIHNldHVwIGNoYXNzaXMgaWYgcmVxdWVzdGVkCitpZiAhImV4cHIgJD9hdXRvY2hhc3NpczIgJiYgJHVuaXQgPT0gJHVuaXRzIC0gMSIgXAorICAgICJzZXRlbnYgY2hhc3NpczJfbm9fcmMgMTsgXAorICAgICByY2xvYWQgYzJzd2l0Y2guc29jOyBcCisgICAgIHNldGVudiBjaGFzc2lzMl9ub19yYzsgXAorICAgICIKKworIyBzdGFydCBzdGFja2luZyBpZiByZXF1ZXN0ZWQKK2lmICEiZXhwciAkP2F1dG9zdGFjayAmJiAkdW5pdCA9PSAkdW5pdHMgLSAxIiBcCisJInJjbG9hZCBzdGsuc29jIgorCitpZiAhImV4cHIgJD9hZWRldiArIDAiICYmICEiZXhwciAkdW5pdCA9PSAkdW5pdHMgLSAxIiBcCisgICAgICAgImFlZGV2IGluaXQiCisKKyMgaHVycmljYW5lIDQ4cCBGRSBwbGF0Zm9ybSBMRUQgc2V0dXAgZm9yIDU2MTQ2X0EwIGFuZCA1NjE0N19BMCBib2FyZAorIyAoZW5hYmxlZCBieSBhZGRpbmcgdGhlIHByb3BlcnR5ICJmZV9odV80OHA9MSIpCisjCitpZiAkP2ZlX2h1XzQ4cCAmJiAkP0JDTTU2MTQ2IHx8ICQ/QkNNNTYxNDcgXAorICAgICJwaHkgZmUwIDB4MWYgMHgwMDhiOyBcCisgICAgIHBoeSBmZTAgMHgxYSAweDNmMDk7XAorICAgICBwaHkgZmU4IDB4MWYgMHgwMDhiOyBcCisgICAgIHBoeSBmZTggMHgxYSAweDNmMDk7IFwKKyAgICAgcGh5IGZlMTYgMHgxZiAweDAwOGI7IFwKKyAgICAgcGh5IGZlMTYgMHgxYSAweDNmMDkiCisKKyMgZW5hYmxlIExFRCBtYXRyaXggbW9kZSBmb3IgUEhZNTQyOTIgb24gQkNNOTUzNDExSy9SCitpZiAkP2JjbTk1MzQxMSBcCisgICAgInJjbG9hZCBnaF9iY205NTM0MTF4LnNvYyIKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvYXJhZC9yZWFkbWUudHh0IGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9hcmFkL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlNTA4OQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvYXJhZC9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMTggQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGJjbSBmaWxlcyB0aGF0IGFyZSBuZWVkZWQgaW4gdGhlIFBpb25lZXIgc3ZrIGZpbGUgc3lzdGVtIGB0byBicmluZyB1cCAKK3RoZSBBcmFkIEJDTSBEaWFnIFNoZWxsLgorVXNlciBzaG91bGQgYWxzbyBjb3B5IHRoZSBiY20udXNlciBsaW51eC1rZXJuZWwtYmRlLmtvIGFuZCBsaW51eC11c2VyLWJkZS5rbworZnJvbSB0aGUgSmVua2lucyBCQUwgYmNtLXNkayBidWlsZCAoZm9yIFBQQykgb3IgcHJpdmF0ZSBiY21fc2RrIGJ1aWxkIHRvIHRoZSBzYW1lIFBpb25lZXIgc3ZrIGZpbGUgc3lzdGVtLgorISEhCisgICBEbyBub3QgZm9yZ2V0IHRvIGNoYW5nZSB0aGUgSVAgaW4gcnBjLnNvYyB0byBwb2ludCBpdCB0byB0aGUgQkFMX0NPUkUKKyEhIQorCitUaGUgY3VycmVudGx5IHN1cHBvcnRlZCBiY21fc2RrIHZlcnNpb24gaXMgNi41LjQKKy4KK3wtLSBjb25maWcuYmNtCit8LS0gYXJhZC5zb2MKK3wtLSBhcmFkX2RyYW0uc29jCit8LS0gcmMuc29jCitgLS0gcnBjLnNvYworIAorICAKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9hcmFkL3JwYy5zb2MgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2FyYWQvcnBjLnNvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2U0NWI0Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9hcmFkL3JwYy5zb2MKQEAgLTAsMCArMSwyMiBAQAorY3B1ZGIgbmV3ZGIKKworY3B1ZGIgYWRkIGtleT0weDEKKworY3B1ZGIgYWRkIGtleT0weDIgbG9jYWw9dAorCitjdHMgYXRwIHRyYW5zIHNvY2sgc2VydmVyIHN0YXJ0CisKK2N0cyBhdHAgY29zPTAgdmxhbj0xCisKK2N0ZSByZWcgbW9kZT1hdHAKKworY3RzIGF0cCB0cmFucyBzb2NrIGluc3QgZGs9MHgxIGRpcD0xMC4yNS44Ljc0CisKK3JwYyBub25leHRob3AKKworcnBjIHN0YXJ0CisKK2R1bmUgInNhbmQgdHJhcF90YXJnZXQgMTAuMjUuOC43NDo1MDAwMSIKKworZHVuZSAic2FuZCB0cmFwX3JlY2VpdmUgMTAuMjUuOC43NDo1MDAwMiIKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9iYWwvYmFsX2NvbmZpZy5pbmkgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2JhbC9iYWxfY29uZmlnLmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzljMGMzCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9iYWwvYmFsX2NvbmZpZy5pbmkKQEAgLTAsMCArMSwxNiBAQAorIyBNYXBsZSBJV0YgbW9kZSAiZGlyZWN0IiBvciAicGVyX2Zsb3ciCitpd2ZfbW9kZT1kaXJlY3QKKyMgU3lzdGVtIE5OSS9QT04gbWFwcGluZyB0YWJsZQorIyAJMDogS1QyCisjIAkxOiBTVkszCisjIAkyOiBBUkFEIChleHBlcmltZW50KQorIyAJMzogUXVtcmFuIChleHBlcmltZW50KQoraW50Zl9tYXB0YWJsZT0zCisjIFVEUCBwb3J0IHRoYXQgcmVjZWl2ZSB0aGUgc3dpdGNoIENQVV9UUkFQIHBhY2tldHMKK3RyYXBfdWRwX3BvcnQ9NTAwMDEKKyMgU3dpdGNoIFFPUyBzY2hlZHVsZXIgbW9kZQorIwkwOiBTUAorIwkxOiBXRlEKK2RzX3NjaGVkX21vZGU9MQorIyBVRFAgcG9ydCBvbiBzd2l0Y2ggdGhhdCByZWNlaXZlIHBhY2tldF9vdXQgcGFja2V0cworcGt0X3NlbmRfc3ZyX2xpc3Rlbl9wb3J0PTUwMDAyCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2JhbC9jb25maWcuYmNtIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9iYWwvY29uZmlnLmJjbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzllZTcyCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9iYWwvY29uZmlnLmJjbQpAQCAtMCwwICsxLDE3MTMgQEAKKyMKKyMgJElkOiBjb25maWctc2FuZC5iY20sdiAxLjE0MCAyMDEzLzA5LzIyIDE0OjI5OjQ3IHRvbWVybWEgRXhwICQKKyMKKyMgJENvcHlyaWdodDogKGMpIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjI2NmZyBmb3IgQkNNODg2NDAgKFBldHJhQikgYW5kIEJDTTg4NjUwIChBcmFkKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMgdGVtcG9yYXJ5IHN1cHByZXNzaW5nIHVua25vd24gc29jIHByb3BlcnRpZXMgd2FybmluZ3MgLSB0aWxsIGFkZGluZyB0aGVtIHVua25vd24gdG8gcHJvcGVydHkuaC9wcm9wZ2VuCisjIyAobmVlZCB0byBiZSB0aGUgZmlyc3Qgc29jIHByb3BlcnR5IGluIHRoZSBmaWxlKS4KK3N1cHByZXNzX3Vua25vd25fcHJvcF93YXJuaW5ncz0xCisKKyMjIE11bHRpIGRldmljZSBzeXN0ZW0gKE5lZ2V2KTogMiBkZXZpY2VzLCBmYWJyaWMgbW9kZSBpcyBGRSwgbW9kIGlkIGlzIHNsb3QgaWQKKyMjIChUb3AgbGluZSBjYXJkIGlzIDAsIGJ1dHRvbiBpcyAxKS4KKyNkaWFnX2NoYXNzaXM9MQorCisjIyBEaXNhYmxlIGRpYWcgaW5pdCBhcHBsaWNhdGlvbi4gU2hvdWxkIGJlIHVzZWQgaWYgb25lIHdhbnRzIHRvIHJ1biBoaXMgb3duCisjIyBhcHBsaWNhdGlvbiBpbnN0ZWFkIG9mIHRoZSBkaWFnIGluaXQgZXhhbXBsZQorI2RpYWdfZGlzYWJsZT0xCisKKyMjIFNraXAgY29zcSBjb25maWd1cmF0aW9uIGluIGRpYWdfaW5pdAorI2RpYWdfY29zcV9kaXNhYmxlPTEKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjY2ZnIGZvciBCQ004ODY1MCAtIEFyYWQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyBEZXZpY2UgY29uZmlndXJhdGlvbiAjIyMKKworIyMgQWN0aXZhdGUgRW11bGF0aW9uIHBhcnRpYWwgaW5pdC4gVmFsdWVzOiAwIC0gTm9ybWFsLCAxIC0gRW11bGF0aW9uIC5EZWZhdWx0OiAweDAuCitkaWFnX2VtdWxhdG9yX3BhcnRpYWxfaW5pdC5CQ004ODY1MD0wCisKKyMjIEdlbmVyYWwKKyMgU2V0IHRoZSBGQVAgRGV2aWNlIG1vZGUKKyMgT3B0aW9uczogUFAgLyBUTSAvIFRETV9PUFRJTUlaRUQgLyBURE1fU1RBTkRBUkQKK2ZhcF9kZXZpY2VfbW9kZS5CQ004ODY1MD1QUAorCisjIyBDcmVkaXQgd29ydGggc2l6ZSAoQnl0ZXMpCitjcmVkaXRfc2l6ZS5CQ004ODY1MD0xMDI0CisKKyMjIENsb2NrIGNvbmZpZ3VyYXRpb25zCisjIENvcmUgY2xvY2sgc3BlZWQgKE1IeikuIERlZmF1bHQ6IDYwMCBNSHoKK2NvcmVfY2xvY2tfc3BlZWRfa2h6LkJDTTg4NjUwPTYwMDAwMAorIyBTeXN0ZW0gcmVmZXJlbmNlIGNsb2NrIChNSHopLiBEZWZhdWx0OiA2MDAgTUh6CitzeXN0ZW1fcmVmX2NvcmVfY2xvY2tfa2h6LkJDTTg4NjUwPTYwMDAwMAorCisjIyMgTmV0d29yayBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiAjIyMKKyMjIFVzZSBvZiB0aGUgdWNvZGVfcG9ydF88TG9jYWwtUG9ydC1JZD49PEludGVyZmFjZS10eXBlPls8SW50ZXJmYWNlLUlkPl1bLjxDaGFubmVsLUlkPl0KKyMjIExvY2FsIHBvcnQgcmFuZ2U6IDAgLSAyNTUuCisjIyBJbnRlcmZhY2UgdHlwZXM6IFhBVUkvUlhBVUkvU0dNSUkvSUxLTi8xMEdCYXNlLVIvWExHRS9DR0UvQ1BVCisKKyMgTWFwIGJjbSBsb2NhbCBwb3J0IHRvIENQVVsuY2hhbm5lbF0gaW50ZXJmYWNlcwordWNvZGVfcG9ydF8xODAuQkNNODg2NTA9Q1BVLjAKKworcG9uX2FwcGxpY2F0aW9uX3N1cHBvcnRfZW5hYmxlZF8wLkJDTTg4NjUwPVRSVUUKK3Bvbl9hcHBsaWNhdGlvbl9zdXBwb3J0X2VuYWJsZWRfMS5CQ004ODY1MD1UUlVFCitwb25fYXBwbGljYXRpb25fc3VwcG9ydF9lbmFibGVkXzIuQkNNODg2NTA9VFJVRQorcG9uX2FwcGxpY2F0aW9uX3N1cHBvcnRfZW5hYmxlZF8zLkJDTTg4NjUwPVRSVUUKKyNwb25fYXBwbGljYXRpb25fc3VwcG9ydF9lbmFibGVkXzQuQkNNODg2NTA9VFJVRQorI3Bvbl9hcHBsaWNhdGlvbl9zdXBwb3J0X2VuYWJsZWRfNS5CQ004ODY1MD1UUlVFCisjcG9uX2FwcGxpY2F0aW9uX3N1cHBvcnRfZW5hYmxlZF82LkJDTTg4NjUwPVRSVUUKKyNwb25fYXBwbGljYXRpb25fc3VwcG9ydF9lbmFibGVkXzcuQkNNODg2NTA9VFJVRQorCit2bGFuX21hdGNoX2NyaXRlcmlhX21vZGU9UE9OX1BDUF9FVEhFUlRZUEUKKworI0Zpcm13YXJlIG1vZGU6CisjIDA9REVGQVVMVAorIyAxPVNGUF9PUFRfU1I0ICAgICAtIG9wdGljYWwgc2hvcnQgcmFuZ2UKKyMgMj1TRlBfREFDICAgICAgICAgLSBkaXJlY3QgYXR0YWNoIGNvcHBlcgorIyAzPVhMQVVJICAgICAgICAgICAtIDQwRyBYTEFVSSBtb2RlCisjIDQ9Rk9SQ0VfT1NERkUgICAgIC0gZm9yY2Ugb3ZlciBzYW1wbGUgZGlnaXRhbCBmZWVkYmFjayBlcXVhbGl6YXRpb24KKyMgNT1GT1JDRV9CUkRGRSAgICAgLSBmb3JjZSBiYXVkIHJhdGUgZGlnaXRhbCBmZWVkYmFjayBlcXVhbGl6YXRpb24KKyMgNj1TV19DTDcyICAgICAgICAgLSBzb2Z0d2FyZSBjbDcyIHdpdGggQU4gb24KKyMgNz1DTDcyX1dJVEhPVVRfQU4gLSBjbDcyIHdpdGhvdXQgQU4KKyNGb3IgTmVnZXYyIGNoYXNzaXMgZW5hYmxlIERGRSBpcyByZWNvbW1lbmRlZAorCitzZXJkZXNfaWZfdHlwZT0xMDI0CisKKyNzZXJkZXNfZmlybXdhcmVfbW9kZS5CQ004ODY1MD0zCitzZXJkZXNfZmlybXdhcmVfbW9kZV9pbC5CQ004ODY1MD00CitzZXJkZXNfZmlybXdhcmVfbW9kZV9zZmkuQkNNODg2NTA9MAorCisjCisjIFNlcmRlcyBmaXJtd2FyZSBtb2RlIGZvciBDaGFubmVsaXplZCBQT04gaW50ZXJmYWNlcworIworI3NlcmRlc19maXJtd2FyZV9tb2RlX3hlMC5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGUxLkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTIuQkNNODg2NTA9MAorI3NlcmRlc19maXJtd2FyZV9tb2RlX3hlMy5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGU0LkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTUuQkNNODg2NTA9MAorI3NlcmRlc19maXJtd2FyZV9tb2RlX3hlNi5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGU3LkJDTTg4NjUwPTAKKyNzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTguQkNNODg2NTA9MAorI3NlcmRlc19maXJtd2FyZV9tb2RlX3hlOS5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGUxMC5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGUxMS5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGUxMi5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGUxMy5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGUxNC5CQ004ODY1MD0wCisjc2VyZGVzX2Zpcm13YXJlX21vZGVfeGUxNS5CQ004ODY1MD0wCisKKyMKKyMgU2VyZGVzIGZpcm13YXJlIG1vZGUgZm9yIE5OSSBpbnRlcmZhY2VzCisjCitzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTEyOC5CQ004ODY1MD0yCitzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTEyOS5CQ004ODY1MD0yCitzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTEzMC5CQ004ODY1MD0yCitzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTEzMS5CQ004ODY1MD0yCitzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTAuQkNNODg2NTA9Mgorc2VyZGVzX2Zpcm13YXJlX21vZGVfeGUxLkJDTTg4NjUwPTIKK3NlcmRlc19maXJtd2FyZV9tb2RlX3hlMi5CQ004ODY1MD0yCitzZXJkZXNfZmlybXdhcmVfbW9kZV94ZTMuQkNNODg2NTA9MgorCisjCisjIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBQT04tc2lkZSBwb3J0cyAoY29ubmVjdGVkIHRvIFBpb25lZXIpIHRvIDEyLjVHCisjCisjcG9ydF9pbml0X3NwZWVkX3hlMC5CQ004ODY1MD0xMjUwMAorI3BvcnRfaW5pdF9zcGVlZF94ZTEuQkNNODg2NTA9MTI1MDAKKyNJTCMgY2hhbmdlIHhlMiwgeGUzIHNwZWVkIHRvIDFHCitwb3J0X2luaXRfc3BlZWRfeGUyLkJDTTg4NjUwPTEwMDAKK3BvcnRfaW5pdF9zcGVlZF94ZTMuQkNNODg2NTA9MTAwMAorI3BvcnRfaW5pdF9zcGVlZF94ZTQuQkNNODg2NTA9MTI1MDAKKyNwb3J0X2luaXRfc3BlZWRfeGU1LkJDTTg4NjUwPTEyNTAwCisjcG9ydF9pbml0X3NwZWVkX3hlNi5CQ004ODY1MD0xMjUwMAorI3BvcnRfaW5pdF9zcGVlZF94ZTcuQkNNODg2NTA9MTI1MDAKKyNwb3J0X2luaXRfc3BlZWRfeGU4LkJDTTg4NjUwPTEyNTAwCisjcG9ydF9pbml0X3NwZWVkX3hlOS5CQ004ODY1MD0xMjUwMAorI3BvcnRfaW5pdF9zcGVlZF94ZTEwLkJDTTg4NjUwPTEyNTAwCisjcG9ydF9pbml0X3NwZWVkX3hlMTEuQkNNODg2NTA9MTI1MDAKKyNwb3J0X2luaXRfc3BlZWRfeGUxMi5CQ004ODY1MD0xMjUwMAorI3BvcnRfaW5pdF9zcGVlZF94ZTEzLkJDTTg4NjUwPTEyNTAwCisjcG9ydF9pbml0X3NwZWVkX3hlMTQuQkNNODg2NTA9MTI1MDAKKyNwb3J0X2luaXRfc3BlZWRfeGUxNS5CQ004ODY1MD0xMjUwMAorCisjCisjIFNldCB0aGUgbnVtYmVyIG9mIHByaW9yaXRpZXMgZm9yIHRoZSBQT04tc2lkZSBwb3J0cyAoY29ubmVjdGVkIHRvCisjIFBpb25lZXIpIHRvICcyJy4KKyMKK3BvcnRfcHJpb3JpdGllc194ZTAuQkNNODg2NTA9MgorcG9ydF9wcmlvcml0aWVzX3hlMS5CQ004ODY1MD0yCitwb3J0X3ByaW9yaXRpZXNfeGUyLkJDTTg4NjUwPTIKK3BvcnRfcHJpb3JpdGllc194ZTMuQkNNODg2NTA9MgorI3BvcnRfcHJpb3JpdGllc194ZTQuQkNNODg2NTA9MgorI3BvcnRfcHJpb3JpdGllc194ZTUuQkNNODg2NTA9MgorI3BvcnRfcHJpb3JpdGllc194ZTYuQkNNODg2NTA9MgorI3BvcnRfcHJpb3JpdGllc194ZTcuQkNNODg2NTA9MgorI3BvcnRfcHJpb3JpdGllc194ZTguQkNNODg2NTA9MgorI3BvcnRfcHJpb3JpdGllc194ZTkuQkNNODg2NTA9MgorI3BvcnRfcHJpb3JpdGllc194ZTEwLkJDTTg4NjUwPTIKKyNwb3J0X3ByaW9yaXRpZXNfeGUxMS5CQ004ODY1MD0yCisjcG9ydF9wcmlvcml0aWVzX3hlMTIuQkNNODg2NTA9MgorI3BvcnRfcHJpb3JpdGllc194ZTEzLkJDTTg4NjUwPTIKKyNwb3J0X3ByaW9yaXRpZXNfeGUxNC5CQ004ODY1MD0yCisjcG9ydF9wcmlvcml0aWVzX3hlMTUuQkNNODg2NTA9MgorCisjCisjIE1hcCBiY20gbG9jYWwgcG9ydCB0byBOZXR3b3JrLUludGVyZmFjZVsuY2hhbm5lbF0gaW50ZXJmYWNlcworIworIyBQT04gSW50ZXJmYWNlcworIworCisjCisjIE5vbi1jaGFubmVsaXplZCBQT04gSW50ZXJmYWNlcworIworIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBpZiB1c2luZyBub24tY2hhbm5lbGl6ZWQgUE9OIGludGVyZmFjZXMgd2l0aAorIyBQaW9uZWVyLgorIworI3Vjb2RlX3BvcnRfMC5CQ004ODY1MD0xMEdCYXNlLVI4CisjdWNvZGVfcG9ydF8xLkJDTTg4NjUwPTEwR0Jhc2UtUjkKKyN1Y29kZV9wb3J0XzIuQkNNODg2NTA9MTBHQmFzZS1SMTAKKyN1Y29kZV9wb3J0XzMuQkNNODg2NTA9MTBHQmFzZS1SMTEKKyN1Y29kZV9wb3J0XzQuQkNNODg2NTA9MTBHQmFzZS1SMTIKKyN1Y29kZV9wb3J0XzUuQkNNODg2NTA9MTBHQmFzZS1SMTMKKyN1Y29kZV9wb3J0XzYuQkNNODg2NTA9MTBHQmFzZS1SMTQKKyN1Y29kZV9wb3J0XzcuQkNNODg2NTA9MTBHQmFzZS1SMTUKKworIworIyBDaGFubmVsaXplZCBQT04gSW50ZXJmYWNlcworIworIyBEZWZpbmUgdmlydHVhbCBwb3J0cyBmb3IgdGhlIDEwRyBDaGFubmVscworIworI3Vjb2RlX3BvcnRfMC5CQ004ODY1MD0xMEdCYXNlLVI4LjAKKyN1Y29kZV9wb3J0XzEuQkNNODg2NTA9MTBHQmFzZS1SOS4wCisjdWNvZGVfcG9ydF8yLkJDTTg4NjUwPTEwR0Jhc2UtUjEwLjAKKyN1Y29kZV9wb3J0XzMuQkNNODg2NTA9MTBHQmFzZS1SMTEuMAorI3Vjb2RlX3BvcnRfNC5CQ004ODY1MD0xMEdCYXNlLVIxMi4wCisjdWNvZGVfcG9ydF81LkJDTTg4NjUwPTEwR0Jhc2UtUjEzLjAKKyN1Y29kZV9wb3J0XzYuQkNNODg2NTA9MTBHQmFzZS1SMTQuMAorI3Vjb2RlX3BvcnRfNy5CQ004ODY1MD0xMEdCYXNlLVIxNS4wCisKKyMKKyMgRGVmaW5lIHZpcnR1YWwgcG9ydHMgZm9yIHRoZSAxRyBDaGFubmVscworIworI3Vjb2RlX3BvcnRfOC5CQ004ODY1MD0xMEdCYXNlLVI4LjEKKyN1Y29kZV9wb3J0XzkuQkNNODg2NTA9MTBHQmFzZS1SOS4xCisjdWNvZGVfcG9ydF8xMC5CQ004ODY1MD0xMEdCYXNlLVIxMC4xCisjdWNvZGVfcG9ydF8xMS5CQ004ODY1MD0xMEdCYXNlLVIxMS4xCisjdWNvZGVfcG9ydF8xMi5CQ004ODY1MD0xMEdCYXNlLVIxMi4xCisjdWNvZGVfcG9ydF8xMy5CQ004ODY1MD0xMEdCYXNlLVIxMy4xCisjdWNvZGVfcG9ydF8xNC5CQ004ODY1MD0xMEdCYXNlLVIxNC4xCisjdWNvZGVfcG9ydF8xNS5CQ004ODY1MD0xMEdCYXNlLVIxNS4xCisKKyMKKyMgTk5JIEludGVyZmFjZXMKKyMKK3Vjb2RlX3BvcnRfMTI4LkJDTTg4NjUwPTEwR0Jhc2UtUjAKK3Vjb2RlX3BvcnRfMTI5LkJDTTg4NjUwPTEwR0Jhc2UtUjEKK3Vjb2RlX3BvcnRfMTMwLkJDTTg4NjUwPTEwR0Jhc2UtUjIKK3Vjb2RlX3BvcnRfMTMxLkJDTTg4NjUwPTEwR0Jhc2UtUjMKK3Vjb2RlX3BvcnRfMC5CQ004ODY1MD0xMEdCYXNlLVI0Cit1Y29kZV9wb3J0XzEuQkNNODg2NTA9MTBHQmFzZS1SNQordWNvZGVfcG9ydF8yLkJDTTg4NjUwPTEwR0Jhc2UtUjYKK3Vjb2RlX3BvcnRfMy5CQ004ODY1MD0xMEdCYXNlLVI3CisKKyN1Y29kZV9wb3J0XzIwMC5CQ004ODY1MD1DUFUuMQorI3Vjb2RlX3BvcnRfMjAxLkJDTTg4NjUwPUNQVS4yCisjdWNvZGVfcG9ydF8yMDIuQkNNODg2NTA9Q1BVLjMKKyN1Y29kZV9wb3J0XzIwMy5CQ004ODY1MD1DUFUuNAorCisjNDBHCisjdWNvZGVfcG9ydF8xLkJDTTg4NjUwPVhMR0UwCisjdWNvZGVfcG9ydF8yLkJDTTg4NjUwPVhMR0UxCisjdWNvZGVfcG9ydF8zLkJDTTg4NjUwPVhMR0UyCisjdWNvZGVfcG9ydF80LkJDTTg4NjUwPVhMR0UzCisjdWNvZGVfcG9ydF81LkJDTTg4NjUwPVhMR0U0CisjdWNvZGVfcG9ydF82LkJDTTg4NjUwPVhMR0U1CisjdWNvZGVfcG9ydF83LkJDTTg4NjUwPVhMR0U2CisKKyNJTEtOIGNvbmZpZ3VyYXRpb24gLSBiYXNpYyBjb25maWcKKyN1Y29kZV9wb3J0XzMxLkJDTTg4NjUwPUlMS04wCisjdWNvZGVfcG9ydF8zMi5CQ004ODY1MD1JTEtOMQorI2lsa25fbnVtX2xhbmVzXzAuQkNNODg2NTA9MTIKKyNpbGtuX251bV9sYW5lc18xLkJDTTg4NjUwPTEyCisjcG9ydF9pbml0X3NwZWVkX2lsLkJDTTg4NjUwPTEwMzEyCisKKworI0lMS04gcGVyIHBvcnQgY2hhbm5lbCBzdGF0CisjaWxrbl9jb3VudGVyc19tb2RlLkJDTTg4NjUwPVBBQ0tFVF9QRVJfQ0hBTk5FTAorCisjSUxLTiBjb25maWd1cmF0aW9uIC0gYWR2YW5jZWQKKyNpbGtuX21ldGFmcmFtZV9zeW5jX3BlcmlvZD0yMDQ4CisjIEVuYWJsZVxEaXNhYmxlIElMS04gc3RhdHVzIG1lc3NhZ2Ugc2VudCB0aHJvdWdoIGFuIG91dC1vZi1iYW5kIGludGVyZmFjZS4KKyMgaWxrbl9pbnRlcmZhY2Vfc3RhdHVzX29vYl9pZ25vcmUuQkNNODg2NTA9MQorCisjI0lMS04gcmV0cmFuc21pdAorI2lsa25fcmV0cmFuc21pdF9lbmFibGVfcnguQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9lbmFibGVfdHguQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9idWZmZXJfc2l6ZS5CQ004ODY1MD0yNTAKKyNpbGtuX3JldHJhbnNtaXRfbnVtX3JlcXVlc3RzX3Jlc2VudC5CQ004ODY1MD0xNQorI2lsa25fcmV0cmFuc21pdF9udW1fc25fcmVwZXRpdGlvbnNfdHguQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9udW1fc25fcmVwZXRpdGlvbnNfcnguQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9yeF90aW1lb3V0X3dvcmRzLkJDTTg4NjUwPTM4MDAKKyNpbGtuX3JldHJhbnNtaXRfcnhfdGltZW91dF9zbi5CQ004ODY1MD0yNTAKKyNpbGtuX3JldHJhbnNtaXRfcnhfaWdub3JlLkJDTTg4NjUwPTgwCisjaWxrbl9yZXRyYW5zbWl0X3J4X3Jlc2V0X3doZW5fZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTEKKyNpbGtuX3JldHJhbnNtaXRfcnhfd2F0Y2hkb2cuQkNNODg2NTA9MAorI2lsa25fcmV0cmFuc21pdF9yeF9yZXNldF93aGVuX2FsbGlnbmVkX2Vycm9yX2VuYWJsZS5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X3J4X3Jlc2V0X3doZW5fcmV0cnlfZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTEKKyNpbGtuX3JldHJhbnNtaXRfcnhfcmVzZXRfd2hlbl93cmFwX2FmdGVyX2Rpc2NfZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTEKKyNpbGtuX3JldHJhbnNtaXRfcnhfcmVzZXRfd2hlbl93cmFwX2JlZm9yZV9kaXNjX2Vycm9yX2VuYWJsZS5CQ004ODY1MD0wCisjaWxrbl9yZXRyYW5zbWl0X3J4X3Jlc2V0X3doZW5fdGltb3V0X2Vycm9yX2VuYWJsZS5CQ004ODY1MD0wCisjaWxrbl9yZXRyYW5zbWl0X3R4X3dhaXRfZm9yX3NlcV9udW1fY2hhbmdlX2VuYWJsZS5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X3R4X2lnbm9yZV9yZXF1ZXN0c193aGVuX2ZpZm9fYWxtb3N0X2VtcHR5LkJDTTg4NjUwPTEKKworI3Vjb2RlX3BvcnRfNDAuQkNNODg2NTA9UkNZLjAKKyN1Y29kZV9wb3J0XzQxLkJDTTg4NjUwPVJDWS4xCisjdWNvZGVfcG9ydF80Mi5CQ004ODY1MD1SQ1kuMgorCisjIyBDQVVJIENvbmZpZ3VyYXRpb24KKyN1Y29kZV9wb3J0XzQxLkJDTTg4NjUwPUNHRTAKKyN1Y29kZV9wb3J0XzQyLkJDTTg4NjUwPUNHRTEKK2NhdWlfbnVtX2xhbmVzXzAuQkNNODg2NTA9MTAKK2NhdWlfbnVtX2xhbmVzXzEuQkNNODg2NTA9MTAKKyNSZXF1aXJlZCBmb3Igd29ya2luZyBJWElBIDEwMEcgcG9ydDoKK21sZF9sYW5lX3N3YXBfbGFuZTIwX2NlLkJDTTg4NjUwPTAKK21sZF9sYW5lX3N3YXBfbGFuZTIxX2NlLkJDTTg4NjUwPTEKK21sZF9sYW5lX3N3YXBfbGFuZTBfY2UuQkNNODg2NTA9MjAKK21sZF9sYW5lX3N3YXBfbGFuZTFfY2UuQkNNODg2NTA9MjEKKworIyBUaGlzIGNvbmZpZ3VyZXMgdGhlIGxhbmUgcG9sYXJpdHkKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MS5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTIuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkzLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5NC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTUuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHk2LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5Ny5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTguQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHk5LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTAuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxMS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTEyLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTMuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxNC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTE1LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTYuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxNy5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTE4LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTkuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyMC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTIxLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjIuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyMy5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTI0LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjUuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyNi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTI3LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjguQkNNODg2NTA9MAorCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTEuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5My5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTQuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHk1LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5Ni5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTcuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHk4LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5OS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTEwLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTEuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxMi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTEzLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTQuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxNS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTE2LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTcuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxOC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTE5LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjAuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyMS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTIyLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjMuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyNC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTI1LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjYuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyNy5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTI4LkJDTTg4NjUwPTAKKworeGd4c190eF9sYW5lX21hcF9xdWFkMC5CQ004ODY1MD0weDMyMTAKK3hneHNfdHhfbGFuZV9tYXBfcXVhZDEuQkNNODg2NTA9MHgzMjEwCit4Z3hzX3R4X2xhbmVfbWFwX3F1YWQyLkJDTTg4NjUwPTB4MzIxMAoreGd4c190eF9sYW5lX21hcF9xdWFkMy5CQ004ODY1MD0weDMyMTAKK3hneHNfdHhfbGFuZV9tYXBfcXVhZDQuQkNNODg2NTA9MHgzMjEwCit4Z3hzX3R4X2xhbmVfbWFwX3F1YWQ1LkJDTTg4NjUwPTB4MzIxMAoreGd4c190eF9sYW5lX21hcF9xdWFkNi5CQ004ODY1MD0weDMyMTAKKworeGd4c19yeF9sYW5lX21hcF9xdWFkMC5CQ004ODY1MD0weDMyMTAKK3hneHNfcnhfbGFuZV9tYXBfcXVhZDEuQkNNODg2NTA9MHgzMjEwCit4Z3hzX3J4X2xhbmVfbWFwX3F1YWQyLkJDTTg4NjUwPTB4MzIxMAoreGd4c19yeF9sYW5lX21hcF9xdWFkMy5CQ004ODY1MD0weDMyMTAKK3hneHNfcnhfbGFuZV9tYXBfcXVhZDQuQkNNODg2NTA9MHgzMjEwCit4Z3hzX3J4X2xhbmVfbWFwX3F1YWQ1LkJDTTg4NjUwPTB4MzIxMAoreGd4c19yeF9sYW5lX21hcF9xdWFkNi5CQ004ODY1MD0weDMyMTAKKworCisKKyNIaWdoIHZvbHRhZ2UgZHJpdmVyIHN0cmFwLiBJZiAwLCBjb25uZWN0ZWQgdG8gMS40ViBzdXBwbHk7IGlmIDEsIGNvbm5lY3RlZCB0byAxViBtb2RlLgorI2ZvciBzcGVjaWZpYyBxdWFkIHVzZSBzcmRfdHhfZHJ2X2h2X2Rpc2FibGVfcXVhZF9YIHdoZXJlIFggaXMgKEZTUkQgbnVtICogNCArIGludGVybmFsIHF1YWQpCitzcmRfdHhfZHJ2X2h2X2Rpc2FibGUuQkNNODg2NTA9MQorCisjUG9ydCBpbml0IG1vZGUKKyNwb3J0X2luaXRfZHVwbGV4PTAKKyNwb3J0X2luaXRfYWR2PTAKKyNwb3J0X2luaXRfYXV0b25lZz0wCisKKworIyBUaGlzIGRpc2FibGVzIHNlcmRlcyBpbml0aWFsaXphdGlvbgorIyBwaHlfbnVsbC5CQ004ODY1MD0xCisKKyMjICBOdW1iZXIgb2YgSW50ZXJuYWwgcG9ydHMKKyMgRW5hYmxlIHRoZSBFUlAgcG9ydC4gVmFsdWVzOiAwIC8gMS4KK251bV9lcnBfdG1fcG9ydHMuQkNNODg2NTA9MQorIyBFbmFibGUgdGhlIE9MUCBwb3J0LiBWYWx1ZXM6IDAgLyAxLgorbnVtX29scF90bV9wb3J0cy5CQ004ODY1MD0xCisjIEVuYWJsZSBPQU1QCitudW1fb2FtcF9wb3J0cy5CQ004ODY1MD0wCisKKyMjIEZpcm13YXJlIExvYWQgTWV0aG9kCitsb2FkX2Zpcm13YXJlLkJDTTg4NjUwPTB4MTAyCisKKyMjIyBIZWFkZXJzIGNvbmZpZ3VyYXRpb24gIyMjCisKKyMjIFVzZSBvZiB0aGUgdG1fcG9ydF9oZWFkZXJfdHlwZV88TG9jYWwtUG9ydC1JZD49PEhlYWRlci10eXBlPgorIyMgRGVmYXVsdCBoZWFkZXIgdHlwZSBpcyBkZXJpdmVkIGZyb20gZmFwX2RldmljZV9tb2RlOiBJZiBmYXBfZGV2aWNlX21vZGUgaXMKKyMjIFBQLCBkZWZhdWx0IGhlYWRlciB0eXBlIGlzIEVUSC4gT3RoZXJ3aXNlLCBkZWZ1YWx0IGhlYWRlciB0eXBlIGlzIFRNLgorIyMgSGVhZGVyIHR5cGUgcGVyIHBvcnQgY2FuIGJlIG92ZXJyaWRlbi4KKyMjIEFsbCBvcHRpb25zOiBFVEgvUkFXL1RNL1BST0cvQ1BVL1NUQUNLSU5HL1RETS9URE1fUkFXL1VESF9FVEgKKyMjIEluamVjdGVkIGhlYWRlciB0eXBlczogaWYgUFRDSCwgSU5KRUNURUQgKGxvY2FsIFBvcnQgb2YgdHlwZSBUTSkgb3IgSU5KRUNURURfUFAgKFBQKQorIyMgICAgICAgICAgICAgICAgICAgICAgICBpZiBQVENILTIsIElOSkVDVEVEXzIgKGxvY2FsIFBvcnQgb2YgdHlwZSBUTSkgb3IgSU5KRUNURURfMl9QUCAoUFApCisKKyMgU2V0IENQVSB0byB3b3JrIHdpdGggVE0gaGVhZGVyIChJVE1IKQorI3RtX3BvcnRfaGVhZGVyX3R5cGVfMC5CQ004ODY1MD1UTQorCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzE4MC5CQ004ODY1MD1JTkpFQ1RFRF8yCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8xODAuQkNNODg2NTA9Q1BVCisKK3RtX3BvcnRfaGVhZGVyX3R5cGVfaW5fMjAwLkJDTTg4NjUwPUlOSkVDVEVEXzJfUFAKK3RtX3BvcnRfaGVhZGVyX3R5cGVfb3V0XzIwMC5CQ004ODY1MD1FVEgKK3RtX3BvcnRfaGVhZGVyX3R5cGVfaW5fMjAxLkJDTTg4NjUwPUlOSkVDVEVEXzJfUFAKK3RtX3BvcnRfaGVhZGVyX3R5cGVfb3V0XzIwMS5CQ004ODY1MD1FVEgKK3RtX3BvcnRfaGVhZGVyX3R5cGVfaW5fMjAyLkJDTTg4NjUwPUlOSkVDVEVEXzJfUFAKK3RtX3BvcnRfaGVhZGVyX3R5cGVfb3V0XzIwMi5CQ004ODY1MD1FVEgKK3RtX3BvcnRfaGVhZGVyX3R5cGVfaW5fMjAzLkJDTTg4NjUwPUlOSkVDVEVEXzJfUFAKK3RtX3BvcnRfaGVhZGVyX3R5cGVfb3V0XzIwMy5CQ004ODY1MD1FVEgKKworIyMjIFBhcnNlciBDb25maWd1cmF0aW9uICMjIworIyBQYXJzZXIgaGFzIDQgY3VzdG9tIG1hY3JvcyB0aGF0IGFyZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgYW5kCisjIGNvbmZpZ3VyZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYW5kIHNvYyBwcm9wZXJ0aWVzOgorIyBUcmlsbCAoMSBtYWNybykgLSB0cmlsbF9tb2RlCisjIEZDb0UgKDIgbWFjcm9zKSAtIGJjbTg4Nnh4X2Zjb2Vfc3dpdGNoX21vZGUKKyMgVnhMQU4gKDEgbWFjcm8pIC0gYmNtODg2eHhfdnhsYW5fZW5hYmxlCisjIElQdjYtRXh0ZW5zaW9uLWhlYWRlciAoMiBtYWNyb3MpIC0gYmNtODg2eHhfaXB2Nl9leHRfaGRyX2VuYWJsZQorIyBVRFAgKDEgbWFjcm8pIC0gVURQIHBhcnNpbmcgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBhbmQgY2FuIGJlIAorIyAgZGlzYWJsZWQgd2l0aCBzb2MgcHJvcGVydHkgY3VzdG9tX2ZlYXR1cmVfdWRwX3BhcnNlX2Rpc2FibGUKKyMgIFdoZW4gZGlzYWJsaW5nIFVEUCBwYXJzaW5nIFZ4TEFOIGFuZCAxNTg4b1VEUCBhcmUgYWZmZWN0ZWQKKworIyBFbmFibGUgSVB2NiBFeHRlbnNpb24gSGVhZGVyLCAwIC0gZGlzYWJsZSAoZGVmYXVsdCksIDEgLSBlbmFibGUKKyNiY204ODZ4eF9pcHY2X2V4dF9oZHJfZW5hYmxlPTEKKworIyBEaXNhYmxlIFVEUCBwYXJzaW5nLCAwIC0gZW5hYmxlIChkZWZhdWx0KSwgMSAtIGRpc2FibGUKKyNjdXN0b21fZmVhdHVyZV91ZHBfcGFyc2VfZGlzYWJsZT0xCisKKyNPQU1QIHBvcnQKKyN0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMzIuQkNNODg2NTA9Q1BVCisKKyNNUExTLVRQIGNoYW5uZWwgdHlwZXMgZm9yIE9BTS9CRkQgLSBJZiBNUExTLVRQIHVzZWQsIGNoYW5uZWwgc2hvdWxkIGJlIHNwZWNpZmllZAorI0F2YWlsYWJsZSB0eXBlczogbXBsc3RwX2JmZF9jb250cm9sX2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9wd19hY2hfY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2RsbV9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfaWxtX2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9kbV9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfaXB2NF9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfY2NfY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2N2X2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9vbl9kZW1hbmRfY3ZfY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX3B3ZV9vYW1fY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2lwdjZfY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2ZhdWx0X29hbV9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfZzgxMTNfY2hhbm5lbF90eXBlCisjbXBsc3RwX2c4MTEzX2NoYW5uZWxfdHlwZT0weDg5MDIKKworCisKKyMgU2V0IHRoZSByZWN5Y2xpbmcgcG9ydCBwcm9jZXNzaW5nIHRvIGJlIHJhdyAoc3RhdGljIGZvcndhcmRpbmcpCit0bV9wb3J0X2hlYWRlcl90eXBlX3JjeS5CQ004ODY1MD1SQVcKKworIyMjIFJDUFUKKyMgVmFsaWQgQ1BVIGxvY2FsIHBvcnRzIG9uIHdoaWNoIFJDUFUgcGFja2V0cyBjYW4gYmUgcmVjZWl2ZWQgYnkgc2xhdmUgZGV2aWNlLgorI3JjcHVfcnhfcGJtcD0weGYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorCisjdG1fcG9ydF9oZWFkZXJfdHlwZV81MTQuQkNNODg2NTA9UkFXCisKKyMjIEhlYWRlciBleHRlbnNpb25zCisjIFNldCBpZiBhbiBGVE1IIE91dC1MSUYgZXh0ZW5zaW9uIGlzIHByZXNlbnQgdG8gVW5pY2FzdCBhbmQgTXVsdGljYXN0IHBhY2tldHMKKyMgT3B0aW9uczogTkVWRVIgLyBJRl9NQyAob25seSBNdWx0aWNhc3QgcGFja2V0cykgLyBBTFdBWVMKK2ZhYnJpY19mdG1oX291dGxpZl9leHRlbnNpb24uQkNNODg2NTA9SUZfTUMKKworIyBTZXQgdGhlIEZUTUggTG9hZC1CYWxhbmNpbmcgS2V5IGV4dGVuc2lvbiBtb2RlCisjIE9wdGlvbnMgZm9yIDg4NjYwOiBFTkFCTEVELCBGVUxMX0hBU0gKKyMgT3B0aW9ucyBmb3IgODg2NTA6IEVOQUJMRUQKKyMgT3B0aW9ucyBmb3IgODg2NDAgY29tcGF0aWJsZTogRElTQUJMRUQgLyA4Ql9MQl9LRVlfOEJfU1RBQ0tJTkdfUk9VVEVfSElTVE9SWSAvIDE2Ql9TVEFDS0lOR19ST1VURV9ISVNUT1JZIC8gU1RBTkRCWV9NQ19MQgorIyAgKGF2YWlsYWJsZSBvbmx5IGZvciBBcmFkUGx1cykKKyMgRGVmYXVsdDogRElTQUJMRUQKK3N5c3RlbV9mdG1oX2xvYWRfYmFsYW5jaW5nX2V4dF9tb2RlLkJDTTg4NjUwPURJU0FCTEVECisKKyMgU2V0IGlmIGFuIE9UTUggT3V0LUxJRiAoQ1VEKSBFeHRlbnNpb24gaXMgcHJlc2VudCB0byBVbmljYXN0IGFuZCBNdWx0aWNhc3QgcGFja2V0cworIyBPcHRpb25zOiBORVZFUiAvIElGX01DIChvbmx5IE11bHRpY2FzdCBwYWNrZXRzKSAvIEFMV0FZUyAvIERPVUJMRV9UQUcgKHR3byBob3Agc2NoZWR1bGluZykKKyMgRGVmYXVsdDogTkVWRVIKKyMgdG1fcG9ydF9vdG1oX291dGxpZl9leHRfbW9kZV8xMy5CQ004ODY1MD1ORVZFUgorCisjIFNldCBpZiBhbiBPVE1IIFNvdXJjZS1TeXN0ZW0tUG9ydCBFeHRlbnNpb24gaXMgcHJlc2VudC4KKyMgT3B0aW9uOiAwLzEKKyMgRGVmYXVsdDogMAorIyB0bV9wb3J0X290bWhfc3JjX2V4dF9lbmFibGVfMTMuQkNNODg2NTA9MAorCisjVHJ1bmsgaGFzaCBmb3JtYXQsIHJlbGV2YW50IG9ubHkgZm9yIEFyYWRQbHVzLiBQb3NzaWJsZSB2YWx1ZXM6IE5PUk1BTCAoZGVmYXVsdCkgLyBJTlZFUlRFRCAvIERVUExJQ0FURUQuCisjdHJ1bmtfaGFzaF9mb3JtYXQ9Tk9STUFMCisKKyMjIFN0YWNraW5nIEFwcGxpY2F0aW9uCisjc3RhY2tpbmdfZW5hYmxlLkJDTTg4NjUwPTEKKyNjdXN0b21fZmVhdHVyZV9zdGFtcF91Y19kZXN0aW5hdGlvbi5CQ004ODY1MD0xCisKKyMjIFN5c3RlbSBSRUQKKyMgU2V0IFN5c3RlbS1SZWQgZnVuY3Rpb25hbGl0eS4KKyNzeXN0ZW1fcmVkX2VuYWJsZS5CQ004ODY1MD0xCisKKyMgSW5kaWNhdGUgdGhlIHNpemUgKEJ5dGVzKSBvZiBhIGZpcnN0IGhlYWRlciB0byBza2lwCisjIGJlZm9yZSB0aGUgbWFqb3IgaGVhZGVyIGF0IGluZ3Jlc3MgKGUuZy4gRXRoZXJuZXQsIElUTUgpCisjIEl0IGNhbiBiZSBzZXQgcGVyIHBvcnQgYWxzbworZmlyc3RfaGVhZGVyX3NpemUuQkNNODg2NTA9MAorCisjIEluZGljYXRlIHRoZSBzaXplIChCeXRlcykgb2YgdGhlIFBNRiBFeHRlbnNpb24gSGVhZGVycworIyB0byByZW1vdmUgZm9yIFRNIGhlYWRlciB0eXBlIHBvcnRzIChleHBlY3RpbmcgSVRNSCkKKyMgU2V0IHBlciBwb3J0CisjcG9zdF9oZWFkZXJzX3NpemVfMC5CQ004ODY1MD00CisKKyMgSW5kaWNhdGUgdGhlIHNpemUgKEJ5dGVzKSBvZiB0aGUgVXNlci1IZWFkZXJzOiBjb25maWd1cmFibGUKKyMgaGVhZGVycyBsb2NhdGVkIGluIHRoZSBmYWJyaWMgYmV0d2VlbiBpbnRlcm5hbCBoZWFkZXJzIGFuZAorIyBFdGhlcm5ldC4gVGhlaXIgdmFsdWVzIGFyZSBzZXQgYnkgSW5ncmVzcyBGUCwgYW5kIGNhbiBiZSB1c2VkCisjIGJ5IEVncmVzcyBGUCBvciBFZ3Jlc3MgRWRpdG9yLgorIyB1bml0czogYml0cy4gNCB2YWx1ZXMgY2FuIGJlIHNldDoKKyMgMCAtIHNpemUgb2YgdGhlIDFzdCBVc2VyLUhlYWRlciwgZm9yIHRoZSBFZ3Jlc3MgUE1GLiAwYiAvIDhiIC8gMTZiCisjIDEgLSBzaXplIG9mIHRoZSAybmQgVXNlci1IZWFkZXIsIGZvciB0aGUgRWdyZXNzIFBNRi4gMGIgLyA4YiAvIDE2YgorIyBUaGUgc3VtIG9mIHRoZXNlIDIgdmFsdWVzIHNob3VsZCBiZSB1bmRlciAxNmIKKyMgMiwgMyAtIHNpemUgb2YgdGhlIDFzdC8ybmQgVXNlci1IZWFkZXIsIGZvciB0aGUgRWdyZXNzIEVkaXRvci4KKyMgMGIgLyA4YiAvIDE2YiAvIDI0YiAvIDMyYgorIyBFYWNoIG9mIHRoZSBnbG9iYWwgVXNlci1IZWFkZXIgc2l6ZSBtdXN0IGJlIHVuZGVyIDMyIGJpdHMsIGJ1dCBub3QgMjQgYml0cy4KKyMgVGhlIEVncmVzcyBGUCBmaWVsZCBpcyBhbHdheXMgYXQgdGhlIE1TQiBvZiB0aGUgVXNlci1IZWFkZXIKKyMgTm90IGF2YWlsYWJsZSBmb3IgODg2NTAtQTAuCisjZmllbGRfY2xhc3NfaWRfc2l6ZV8wLkJDTTg4NjUwPTgKKyNmaWVsZF9jbGFzc19pZF9zaXplXzEuQkNNODg2NTA9MAorI2ZpZWxkX2NsYXNzX2lkX3NpemVfMi5CQ004ODY1MD0yNAorI2ZpZWxkX2NsYXNzX2lkX3NpemVfMy5CQ004ODY1MD0wCisKKworIyMjIFRydW5rIC0gTEFHIGNvbmZpZ3VyYXRpb24gIyMjCisjIFNldCBTZXQgdGhlIG51bWJlciBvZiBMQUdzOiAxMDI0LCA1MTIsIDI1NiwgMTI4IG9yIDY0CitudW1iZXJfb2ZfdHJ1bmtzLkJDTTg4NjUwPTI1NgorCisjIyMgU1lOQ0UgY29uZmlndXJhdGlvbiAjIyMKKyMjIFN5bmNocm9ub3VzIEV0aGVybmV0IFNpZ25hbCBNb2RlLgorIyMgT3B0aW9uczogVFdPX0RJRkZfQ0xLLCBUV09fQ0xLX0FORF9WQUxJRC4gRGVmYXVsdDogVFdPX0NMS19BTkRfVkFMSUQKKyNzeW5jX2V0aF9tb2RlLkJDTTg4NjUwPVRXT19DTEtfQU5EX1ZBTElECisKKyMjIENsb2NrIFNvdXJjZSAoc2luZ2xlIFNlckRlcykgbGFuZSBpbiB0aGUgc3BlY2lmaWVkIE5JRiBwb3J0LgorIyMgVXNhZ2U6IHN5bmNfZXRoX2Nsa190b19uaWZfaWRfY2xrXzxjbGtfbnVtYmVyPj08c2VyZGVzX251bWJlcj4KKyNzeW5jX2V0aF9jbGtfdG9fbmlmX2lkX2Nsa18wLkJDTTg4NjUwPTEKKyNzeW5jX2V0aF9jbGtfdG9fbmlmX2lkX2Nsa18xLkJDTTg4NjUwPTEKKworIyMgQ2xvY2sgRGl2aWRlciBmb3IgdGhlIHNlbGVjdGVkIHJlY292ZXJlZCBjbG9jay4gVmFsaWQgdmFsdWVzOiAxLzIvNC4gRGVmYXVsdDogMS4KKyMjIFVzYWdlOiBzeW5jX2V0aF9jbGtfZGl2aWRlcl9jbGtfPGNsa19udW1iZXI+PTwxLzIvND4KKyNzeW5jX2V0aF9jbGtfZGl2aWRlcl9jbGtfMC5CQ004ODY1MD0xCisjc3luY19ldGhfY2xrX2RpdmlkZXJfY2xrXzEuQkNNODg2NTA9MQorCisjIyBFbmFibGUgdGhlIGF1dG9tYXRpYyBzcXVlbGNoIGZ1bmN0aW9uIGZvciB0aGUgcmVjb3ZlcmVkIGNsb2NrLiBWYWxpZCB2YWx1ZXM6IDAvMS4gRGVmYXVsdDogMC4KKyMjIFVzYWdlOiBzeW5jX2V0aF9jbGtfc3F1ZWxjaF9lbmFibGVfY2xrXzxjbGtfbnVtYmVyPj08MC8xPgorI3N5bmNfZXRoX2Nsa19zcXVlbGNoX2VuYWJsZV9jbGtfMC5CQ004ODY1MD0wCisjc3luY19ldGhfY2xrX3NxdWVsY2hfZW5hYmxlX2Nsa18xLkJDTTg4NjUwPTAKKworIyMjIEVMSyBjb25maWd1cmF0aW9uICMjIworIyMgRXh0ZXJuYWwgbG9va3VwIChUQ0FNKSBEZXZpY2UgdHlwZSBzZWxlY3QsIEluZGljYXRlIHRoZSBFeHRlcm5hbCBsb29rdXAgRGV2aWNlIHR5cGUuCisjIFZhbHVlIE9wdGlvbnM6IE5PTkUvTkw4ODY1MC4gRGVmYXVsdDogTk9ORS4KKyNleHRfdGNhbV9kZXZfdHlwZT1OTDg4NjUwCisKKyMjIFNldCBFTEsgRldEIHRhYmxlIFNpemUuCisjIGZvcm1hdDogZXh0X3h4eF9md2RfdGFibGVfc2l6ZS4KKyMgd2hlcmUgeHh4IHJlcGxhY2VkIGJ5IEZXRCBvcHRpb25zOiBpcDRfdWNfcnBmL2lwNF9tYy9pcDZfdWNfcnBmL2lwNi9pcDZfbWMvdHJpbGxfdWMvdHJpbGxfbWMvbXBscy9jb3VwX21wbHMKKyMgVmFsdWUgT3B0aW9uczogKDApIC0gRXh0ZXJuYWwgdGFibGUgZGlzYWJsZWQsID4wOiBudW1iZXIgb2YgZW50cmllcy4gRGVmYXVsdDogMC4KKyNleHRfaXA0X3VjX3JwZl9md2RfdGFibGVfc2l6ZT04MTkyCisjZXh0X2lwNF9tY19md2RfdGFibGVfc2l6ZT04MTkyCisKKyMjIFNldCBFTEsgSVAgRldEIHVzZSBOZXRSb3V0ZSAgQUxHLgorIyBWYWx1ZSBPcHRpb25zOiBBTEdfTFBNX0xQTS9BTEdfTFBNX05FVFJPVVRFL0FMR19MUE1fVENBTS4gRGVmYXVsdDogQUxHX0xQTV9UQ0FNLgorI2V4dF9md2RfYWxnb3JpdGhtX2xwbT1BTEdfTFBNX1RDQU0KKworIyMgU2V0IEVMSyBpbnRlcmZhY2UgbW9kZS4KKyMgQ2hhbmdlIEVMSyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiB0byBzdXBwb3J0IENBVUkgcG9ydC4KKyMgVmFsdWUgT3B0aW9uczogMC8xLiAwIC0gTm9ybWFsIG1vZGUsIDEgIDIgQ0FVSSBwb3J0ICsgRUxLIG1vZGUuIERlZmF1bHQ6IDAuCisjZXh0X2ludGVyZmFjZV9tb2RlPTAKKworIyMjIENvbmZpZ3VyZSBNRElPIGludGVyZmFjZQorIyBFeHRlcm5hbCBNRElPIGNsb2NrIHJhdGUgZGl2aXNvciAuIERlZmF1bHQ6IDB4MjQuCisjcmF0ZV9leHRfbWRpb19kaXZpc29yPTB4MzYKKyMgRXh0ZXJuYWwgTURJTyBjbG9jayByYXRlIGRpdmlzb3IuIERlZmF1bHQ6IDB4MS4KKyNyYXRlX2V4dF9tZGlvX2RpdmlkZW5kPTEKKworIyMjIFRETSAtIE9UTiBjb25maWd1cmF0aW9uICMjIworI2ZhcF90ZG1fYnlwYXNzLkJDTTg4NjUwPTAKKworIyBJbmRpY2F0ZSBpZiBhIFBldHJhLUIgZGV2aWNlIGlzIGNvbm5lY3RlZCB0byB0aGUgYWN0dWFsIGRldmljZQorIyBGb3IgVERNL09UTiBhcHBsaWNhdGlvbnMsCisjIHN5c3RlbV9pc19wZXRyYV9iX2luX3N5c3RlbS5CQ004ODY1MD0wCisjI0luZGljYXRlIGlmIFRETSBjYW4gYXJyaXZlIHRocm9naCBwcmltYXJ5IHBpcGUuCisjU2hvdWxkIGJlIDEgZm9yIGEgU3lzdGVtIHdpdGggUGV0cmFCIHRoYXQgY29ubmVjdGVkIHRvIGZhYnJpYyBvdmVyIHByaW1hcnkgcGlwZS4KK2ZhYnJpY190ZG1fb3Zlcl9wcmltYXJ5X3BpcGUuQkNNODg2NTA9MAorCisjIyMgRmFicmljIGNvbmZpZ3VyYXRpb24gIyMjCisjMC1MRkVDIDEtOGJcMTBiIDItRkVDIDMtQkVDCitiYWNrcGxhbmVfc2VyZGVzX2VuY29kaW5nLkJDTTg4NjUwPTIKKyNTRkkgc3BlZWQgcmF0ZQorcG9ydF9pbml0X3NwZWVkX3NmaS5CQ004ODY1MD0xMDMxMgorI0NMNzIKKyNwb3J0X2luaXRfY2w3Ml9zZmk9MAorZmFicmljX3NlZ21lbnRhdGlvbl9lbmFibGUuQkNNODg2NTA9MQorCisjIyBGYWJyaWMgdHJhbnNtaXNzaW9uIG1vZGUKKyMgU2V0IHRoZSBDb25uZWN0IG1vZGUgdG8gdGhlIEZhYnJpYworIyBPcHRpb25zOiBGRSAtIHByZXNlbmNlIG9mIGEgRmFicmljIGRldmljZSAoc2luZ2xlIHN0YWdlKSAvIE1VTFRfU1RBR0VfRkUgLSAgTXVsdGktc3RhZ2UgLworIyBTSU5HTEVfRkFQIC0gc3RhbmQtYWxvbmUgZGV2aWNlIC8gTUVTSCAtIG1lc2ggLyBCQUNLMkJBQ0sgLSAyIGRldmljZXMgaW4gTWVzaAorI2ZhYnJpY19jb25uZWN0X21vZGUuQkNNODg2NTA9U0lOR0xFX0ZBUAorZmFicmljX2Nvbm5lY3RfbW9kZS5CQ004ODY1MD1GRQorCisjIyBDZWxsIGZvcm1hdCBjb25maWd1cmF0aW9uCisjIEluZGljYXRlIGlmIHRoZSB0cmFmZmljIGNhbiBiZSBzZW50IGluIGR1YWwgcGlwZQoraXNfZHVhbF9tb2RlLkJDTTg4NjUwPTAKKyMgSW5kaWNhdGUgdGhlIGZvcm1hdCBvZiB0aGUgY2VsbDoKKyMgQSBWQ1MxMjggY2VsbCBpcyB1c2VkIGlmIHN5c3RlbV9pc192Y3NfMTI4X2luX3N5c3RlbSBvciBzeXN0ZW1faXNfZmU2MDBfaW5fc3lzdGVtIGlzIFRSVUUKK3N5c3RlbV9pc192Y3NfMTI4X2luX3N5c3RlbS5CQ004ODY1MD0wCitzeXN0ZW1faXNfZmU2MDBfaW5fc3lzdGVtLkJDTTg4NjUwPTAKKworIyMjIFdSRUQgIyMjCisKKyMgU2V0IHRoZSBtYXhpbXVtIHBhY2tldCBzaXplIGZvciBXUkVEIHRlc3RzLiAwIC0gbWVhbnMgaWdub3JlIG1heCBwYWNrZXQgc2l6ZS4KK2Rpc2NhcmRfbXR1X3NpemUuQkNNODg2NTA9MAorCisjIyMgT0NCIChPbi1DaGlwIEJ1ZmZlcikgY29uZmlndXJhdGlvbiAjIyMKKyMgRW5hYmxlIHRoZSBPQ0IKKyMgRW5hYmxlIE1PREVTOgorIyAgIDAvRkFMU0UgICAgICAgIC0tPiAgT0NCX0RJU0FCTEVEICAgICAtLT4gTm8gT0NCIHVzZQorIyAgIDEvVFJVRSAgICAgICAgIC0tPiAgT0NCX0VOQUJMRUQgICAgICAtLT4gTGlrZSBpbiBBcmFkLUEwL0IwLiBTb21lIHBhY2tldHMgbWF5IHVzZSBib3RoIERSQU0gYW5kIE9DQiByZXNvdXJjZXMKKyMgICBPTkVfV0FZX0JZUEFTUyAtLT4gIERlcGVuZHMgb24gbnVtYmVyIG9mIHByZXNlbnQgZHJhbXMgKGF2YWlsYWJsZSBvbmx5IGZvciBBcmFkUGx1cyk6CisjICAgICAgICAgICAgICAgICAgICAgIDAgZHJhbXM6ICAgLSBPQ0JfT05MWQorIyAgICAgICAgICAgICAgICAgICAgICAxIGRyYW1zOiAgIC0gT0NCX09OTFlfMV9EUkFNICAgICAtLT4gIDogT0NCLW9ubHkgd2l0aCAxIERSQU0gZm9yIHRoZSBmcmVlIHBvaW50ZXJzCisjICAgICAgICAgICAgICAgICAgICAgIDItOCBkcmFtczogLSBPQ0JfRFJBTV9TRVBBUkFURSAgIC0tPiAgOiBPQ0IgYW5kIERSQU0gY29leGlzdCBzZXBhcmF0ZWx5CisjICAgRGVmYXVsdDogVFJVRS4KK2JjbTg4Nnh4X29jYl9lbmFibGUuQkNNODg2NTA9MQorCisjIE9DQiBEYXRhIEJ1ZmZlciBzaXplLiBQb3NzaWJsZSB2YWx1ZXM6IDEyOC8yNTYvNTEyLzEwMjQuIERlZmF1bHQ6IDI1Ni4KK2JjbTg4Nnh4X29jYl9kYXRhYnVmZmVyX3NpemUuQkNNODg2NTA9MjU2CisjIFJlcGFydGl0aW9uIGJldHdlZW4gVW5pY2FzdCBhbmQgRnVsbCBNdWx0aWNhc3QgYnVmZmVycy4KKyMgMDogODAlIFVuaWNhc3QgYW5kIDIwJSBNdWx0aWNhc3QsIDE6IFVuaWNhc3QtT25seQorYmNtODg2eHhfb2NiX3JlcGFydGl0aW9uLkJDTTg4NjUwPTAKKworIyMjIFBETSBjb25maWd1cmF0aW9uICMjIworIyBTZXQgdGhlIFBETSBNb2RlLgorIyAwOiBzaW1wbGUgKGRlZmF1bHQpLCAxOiByZWR1Y2VkIChtYW5kYXRvcnkgZm9yIExMRkMtVlNRLCBQRkMtVlNRLCBvciBTVC1WU1EpCitiY204ODZ4eF9wZG1fbW9kZS5CQ004ODY1MD0wCisKKyMjIyBNdWx0aWNhc3QgTnVtYmVyIG9mIERCdWZmIG1vZGUgIyMjCisjIFNldCBJUU0gRk1DIGJ1ZmZlcnMtcmVwbGljYXRpb24gc2l6ZXMKKyMgT3B0aW9ucyBmb3IgODg2NTA6IEFSQURfSU5JVF9GTUNfNEtfUkVQXzY0S19EQlVGRl9NT0RFL0FSQURfSU5JVF9GTUNfNjRfUkVQXzEyOEtfREJVRkZfTU9ERQorIyBEZWZhdWx0OiBBUkFEX0lOSVRfRk1DXzRLX1JFUF82NEtfREJVRkZfTU9ERQorbXVsdGljYXN0X25icl9mdWxsX2RidWZmLkJDTTg4NjUwPUFSQURfSU5JVF9GTUNfNEtfUkVQXzY0S19EQlVGRl9NT0RFCisKKyMjIyBNdWx0aWNhc3QgY29uZmlndXJhdGlvbiAjIyMKKyMgTXVsdGljYXN0IGVncmVzcyB2bGFuIG1lbWJlcnNoaXAgcmFuZ2UuIEJ5IGRlZmF1bHQ6IDAtNDA5NS4KK2VncmVzc19tdWx0aWNhc3RfZGlyZWN0X2JpdG1hcF9taW4uQkNNODg2NTA9MAorZWdyZXNzX211bHRpY2FzdF9kaXJlY3RfYml0bWFwX21heC5CQ004ODY1MD00MDk1CisKKyMjIyBWT1EgLSBGbG93IGNvbmZpZ3VyYXRpb24gIyMjCisKKyMgU2V0IHRoZSBWT1EgbWFwcGluZyBtb2RlOgorIyBESVJFQ1Q6IE1vcmUgdGhhbiA0SyBTeXN0ZW0gUG9ydHMgYXJlIHN1cHBvcnRlZC4gU3lzdGVtLWxldmVsIFdSRUQgaXMgbm90IHN1cHBvcnRlZC4KKyMgSU5ESVJFQ1Q6IHNpbWlsYXIgdG8gUGV0cmEtQi4gVXAgdG8gNEsgU3lzdGVtIFBvcnRzLgordm9xX21hcHBpbmdfbW9kZS5CQ004ODY1MD1JTkRJUkVDVAorCisjIFNldCB0aGUgQmFzZSBRdWV1ZSB0byBiZSBhZGRlZCB0byB0aGUgcGFja2V0IGZsb3ctaWQKKyMgd2hlbiB0aGUgRmxvdy1JZCBpcyBzZXQgZXhwbGljaXRlbHkgZWl0aGVyIGJ5IHRoZSBJVE1ICisjIG9yIGJ5IHRoZSBEZXN0aW5hdGlvbiByZXNvbHV0aW9uIGluIHRoZSBQYWNrZXQgcHJvY2Vzc2luZworZmxvd19tYXBwaW5nX3F1ZXVlX2Jhc2UuQkNNODg2NTA9MAorCisjIFNldCB0aGUgbnVtYmVyIG9mIHByaW9yaXRpZXMgc3VwcG9ydGVkIGF0IGVncmVzcyBwZXIgUG9ydAorIyBPcHRpb25zOiAxIC8gMiAvIDgKK3BvcnRfcHJpb3JpdGllcy5CQ004ODY1MD04CisKKyMgU2V0IHRoZSBzaGFyZWQgbXVsdGljYXN0IHJlc291cmNlIG1vZGU6IFN0cmljdCAvIERpc2NyZXRlCitlZ3Jlc3Nfc2hhcmVkX3Jlc291cmNlc19tb2RlLkJDTTg4NjUwPVN0cmljdAorCisjIERlZmluZSBvdXRnb2luZyBwb3J0IHJhdGUgbW9kZSBpbiBkYXRhIHJhdGUgb3IgcGFja2V0IHJhdGUuCisjIE9wdGlvbnM6IERBVEEgLyBQQUNLRVQKK290bV9wb3J0X3BhY2tldF9yYXRlLkJDTTg4NjUwPURBVEEKKworIyBTZXQgUG9ydCBlZ3Jlc3MgcmVjeWNsaW5nIHNjaGVkdWxlciBjb25maWd1cmF0aW9uLgorIyAwOiBTdHJpY3QgUHJpb3JpdHkgU2NoZWR1bGVyLCAxOiBSb3VuZCBSb2JpbiBTY2hlZHVsZXIKK3BvcnRfZWdyZXNzX3JlY3ljbGluZ19zY2hlZHVsZXJfY29uZmlndXJhdGlvbi5CQ004ODY1MD0wCisKKyMgU2V0IHN0YXRpY2FsbHkgdGhlIHJlZ2lvbiBtb2RlIHBlciByZWdpb24gaWQKKyMgMDogcXVldWUgY29ubmVjdG9ycyBvbmx5IChJbnRlckRpZ2l0YXRlZCA9IEZBTFNFLCBPZGRFdmVuID0gVFJVRSkKKyMgMTogcXVldWUgY29ubmVjdG9ycywgU0UgKEludGVyRGlnaXRhdGVkID1UUlVFLCBPZGRFdmVuID0gVFJVRSkKKyMgMjogcXVldWUgY29ubmVjdG9ycywgU0UgKEludGVyRGlnaXRhdGVkID1UUlVFLCBPZGRFdmVuID0gRkFMU0UpCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzY1LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNjYuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl82Ny5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzY4LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNjkuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83MC5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzcxLkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzIuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83My5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzc0LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzUuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83Ni5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzc3LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzguQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83OS5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzgwLkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODEuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84Mi5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzgzLkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODQuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84NS5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzg2LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODcuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84OC5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzg5LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTAuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85MS5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzkyLkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTMuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85NC5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzk1LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTYuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85Ny5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzk4LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTkuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMDAuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMDEuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMDIuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMDMuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMDQuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMDUuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMDYuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMDcuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMDguQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMDkuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMTAuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMTEuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMTIuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMTMuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMTQuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMTUuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMTYuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMTcuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMTguQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMTkuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMjAuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMjEuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMjIuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMjMuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMjQuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMjUuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMjYuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMjcuQkNNODg2NTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xMjguQkNNODg2NTA9MgorCisjSUwjIENvbmZpZ3VyZSBudW1iZXIgb2Ygc3ltbWV0cmljIGNvcmVzIGVhY2ggcmVnaW9uIHN1cHBvcnRzICMjCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIuQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMy5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUuQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl83LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzguQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fOS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xMC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xMS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xMi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xMy5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xNC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xNS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xNi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xNy5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xOC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xOS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yMC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yMS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yMi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yMy5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yNC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yNS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yNi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yNy5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yOC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yOS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zMC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zMS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zMi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zMy5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zNC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zNS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zNi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zNy5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zOC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zOS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80MC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80MS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80Mi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80My5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80NC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80NS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80Ni5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80Ny5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80OC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80OS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81MC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81MS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81Mi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81My5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81NC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81NS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81Ni5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81Ny5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81OC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81OS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl82MC5CQ004ODY1MD0yCisjZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fY29yZTBfMi5CQ004ODY3NT0yCisKKyMjIyBGbG93IENvbnRyb2wgY29uZmlndXJhdGlvbiAjIyMKKyMgU2V0IHRoZSBGbG93IGNvbnRyb2wgdHlwZSBwZXIgUG9ydC4KKyMgT3B0aW9uczogTEwgKExpbmstbGV2ZWwpIC8gQ0IyIChDbGFzcy1CYXNlZCAtIDIgY2xhc3NlcykgLworIyBDQjggKENsYXNzLUJhc2VkIC0gOCBjbGFzc2VzKQorIyBmbG93X2NvbnRyb2xfdHlwZS5CQ004ODY1MD1MTAorCisjIyBPdXQtT2YtQmFuZCBGbG93IGNvbnRyb2wgY29uZmlndXJhdGlvbgorI3Nwbl9GQ19PT0JfVFlQRSwgc3BuX0ZDX09PQl9NT0RFLCBzcG5fRkNfT09CX0NBTEVOREVSX0xFTkdUSCwgc3BuX0ZDX09PQl9DQUxFTkRFUl9SRVBfQ09VTlQsCisKKyMjIFNldCB2b2x0YWdlIG1vZGUgZm9yIG9vYiBpbnRlcmZhY2VzCisjSFNUTF8xLjVWCisjMy4zVgorI0hTVExfMS41Vl9WRERPX0RJVl8yCitleHRfdm9sdGFnZV9tb2RlX29vYj0zLjNWCisKKyMjIEluYmFuZCBJbnRlcmxha2VuIGNvbmZpZ3VyYXRpb24KKyMgc3BuX0ZDX0lOQkFORF9JTlRMS05fTU9ERSwgc3BuX0ZDX0lOQkFORF9JTlRMS05fQ0FMRU5ERVJfTEVOR1RILCBzcG5fRkNfSU5CQU5EX0lOVExLTl9DQUxFTkRFUl9SRVBfQ09VTlQKKyMgc3BuX0ZDX0lOQkFORF9JTlRMS05fQ0FMRU5ERVJfTExGQ19NT0RFLCBzcG5fRkNfSU5CQU5EX0lOVExLTl9MTEZDX01VQl9FTkFCTEVfTUFTSworCisjIyMgTWV0ZXIgZW5naW5lIGNvbmZpZ3VyYXRpb24gIyMjCisKKyMgU3BlY2lmeSBtZXRlciBvcGVyYXRpb24gbW9kZQorIyAzMiAtIFR3byBtZXRlcnMgcGVyIHBhY2tldCAoMzJrIHRvdGFsKQorIyA2NCAtIE9uZSBtZXRlciBwZXIgcGFja2V0ICg2NGsgdG90YWwpCisjIE9wdGlvbnM6IDAsIDMyLCA2NAorcG9saWNlcl9pbmdyZXNzX2NvdW50LkJDTTg4NjUwPTMyCisKKyMgRm9yIG1ldGVycyBpbiBkb3VibGUgMzJrIG1vZGUsIGRldGVybWluZSB0aGUgc2hhcmluZyBtb2RlCisjIE9wdGlvbnM6CisjIDAgLSBOT05FIChvbmx5IGZvciA2NGsgbW9kZSkKKyMgMSAtIFNFUklBTCAob25seSBmb3IgMzJrIG1vZGUpCisjIDIgLSBQQVJBTExFTCAob25seSBmb3IgMzJrIG1vZGUpCitwb2xpY2VyX2luZ3Jlc3Nfc2hhcmluZ19tb2RlLkJDTTg4NjUwPTEKKworIyBBcHBsaWVzIG9ubHkgdG8gQXJhZCsgKDg4NjYwKQorIyBGb3IgbWV0ZXJzIGluIHBhcmFsbGVsIG1vZGUsIGRldGVybWluZSB0aGUgbWFwcGluZworIyBPcHRpb25zOiBCRVNULCBXT1JTVAorIyBwb2xpY2VyX3Jlc3VsdF9wYXJhbGxlbF9jb2xvcl9tYXAuQkNNODg2NTA9V09SU1QKKworIyBBcHBsaWVzIG9ubHkgdG8gQXJhZCsgKDg4NjYwKQorIyBGb3IgbWV0ZXJzIGluIHBhcmFsbGVsIG1vZGUsIGRldGVybWluZSBob3cgdGhlIGJ1Y2tldHMgYXJlIGNoYW5nZWQKKyMgT3B0aW9uczogQ09OU1RBTlQsIFRSQU5TUEFSRU5ULCBERUZFUlJFRAorIyBwb2xpY2VyX3Jlc3VsdF9wYXJhbGxlbF9idWNrZXRfdXBkYXRlLkJDTTg4NjUwPUNPTlNUQU5UCisKKyMgQXBwbGllcyBvbmx5IHRvIEFyYWQrICg4ODY2MCkKKyMgU2V0IHRoZSBFdGhlcm5ldCBwb2xpY2VyIHRvIHdvcmsgaW4gY29sb3IgYmxpbmQgbW9kZQorIyByYXRlX2NvbG9yX2JsaW5kLkJDTTg4NjUwPTEKKworIyBMMiBsZWFybiBsaW1pdCBtb2RlCisjIE9wdGlvbnM6IFZMQU4sIFZMQU5fUE9SVCwgVFVOTkVMIG9yIHRoZSBudW1lcmljIGVxdWl2YWxlbnQgMC0yLgorIyBEZWZhdWx0OiBWTEFOCisjIGwyX2xlYXJuX2xpbWl0X21vZGUgPSBWTEFOX1BPUlQKKworIyBBcHBsaWVzIG9ubHkgdG8gQXJhZCsgKDg4NjYwKQorIyBEZXRlcm1pbmVzIHRoZSBMMiBsZWFybiBsaW1pdCByYW5nZXMgd2hlbiBsMl9sZWFybl9saW1pdF9tb2RlIGlzIHNldCB0byBWTEFOX1BPUlQKKyMgVHdvIHJhbmdlIGJhc2VzIGNhbiBiZSBzZWxlY3RlZCwgZWFjaCBvZiAxNksgc2l6ZS4KKyMgT3B0aW9uczogMCwgMTZLLCAzMkssIDQ4Sy4KKyMgRGVmYXVsdDogMCAmIDE2SworIyBsMl9sZWFybl9saWZfcmFuZ2VfYmFzZV8wID0gMAorIyBsMl9sZWFybl9saWZfcmFuZ2VfYmFzZV8xID0gMTZLCisKKyMjIyBDb3VudGVyIGVuZ2luZSBjb25maWd1cmF0aW9uICMjIworCisjIFNldCB0aGUgQ291bnRlciBzb3VyY2UKKyMgT3B0aW9uczogSU5HUkVTU19GSUVMRCAvIElOR1JFU1NfVk9RIC8gSU5HUkVTU19WU1EKKyMgSU5HUkVTU19DTk0gLyBFR1JFU1NfRklFTEQgLyBFR1JFU1NfVlNJIC8gRUdSRVNTX09VVF9MSUYgLyBFR1JFU1NfVE0gKHBlciBxdWV1ZSkgLyBFR1JFU1NfVE1fUE9SVCAocGVyIHBvcnQpCisjIEVHUkVTU19SRUNFSVZFX1ZTSSAvIEVHUkVTU19SRUNFSVZFX09VVF9MSUYgLyBFR1JFU1NfUkVDRUlWRV9UTSAocGVyIHF1ZXVlKSAvIEVHUkVTU19SRUNFSVZFX1RNX1BPUlQgKHBlciBwb3J0KQorIyBJTkdSRVNTX09BTSAvIEVHUkVTU19PQU0KKyMgMiBDb3VudGVyLVBvaW50ZXJzIGNhbiBiZSBzZXQgKHdpdGggXzAgYW5kIF8xKSBmb3IKKyMgSU5HUkVTU19GSUVMRCAvIEVHUkVTU19WU0kgLyBFR1JFU1NfT1VUX0xJRiAvIEVHUkVTU19UTSAvIEVHUkVTU19UTV9QT1JUCisjIFJhbmdlIGV4dGVuc2lvbiBjYW4gYmUgc2V0ICh3aXRoIF9MU0IgYW5kIF9NU0IpIGZvcgorIyBJTkdSRVNTX0ZJRUxEIC8gRUdSRVNTX1ZTSSAvIEVHUkVTU19PVVRfTElGIC8gRUdSRVNTX1RNIC8gRUdSRVNTX1RNX1BPUlQgL0VHUkVTU19SRUNFSVZFX1ZTSSAvCisjIEVHUkVTU19SRUNFSVZFX09VVF9MSUYgLyBFR1JFU1NfUkVDRUlWRV9UTSAvIEVHUkVTU19SRUNFSVZFX1RNX1BPUlQKK2NvdW50ZXJfZW5naW5lX3NvdXJjZV8wLkJDTTg4NjUwPUlOR1JFU1NfRklFTEQKK2NvdW50ZXJfZW5naW5lX3NvdXJjZV8xLkJDTTg4NjUwPUlOR1JFU1NfRklFTERfMQorY291bnRlcl9lbmdpbmVfc291cmNlXzIuQkNNODg2NTA9SU5HUkVTU19WT1EKKyMjIworIyMjICBETUwKKyMjIworIyMjICBGb3IgRE1MIGFwcGxpY2F0aW9ucywgY291bnRlciBlbmdpbmUgMyBpcyB1c2VkIGZvciBWT1EKKyMjIyAgY291bnRlcnMuIFRoaXMgaW4gY29tYmluYXRpb24gd2l0aCBjb25maWd1cmluZyB0aGUgZW5naW5lcyB1c2VkIGZvcgorIyMjICBWT1FzIGZvciBGV0RfRFJPUCBhbGxvd3MgZm9yIGNvdW50ZXJzIGZvciAzMksgVk9Rcy4KKyMjIworI2NvdW50ZXJfZW5naW5lX3NvdXJjZV8zLkJDTTg4NjUwPUVHUkVTU19GSUVMRAorY291bnRlcl9lbmdpbmVfc291cmNlXzMuQkNNODg2NTA9SU5HUkVTU19WT1EKKworIyBDb25maWd1cmUgdGhlIHN0YXRpc3RpYyBpbnRlcmZhY2UgZWdyZXNzIHNvdXJjZQorIyBPcHRpb25zOiBFR1JFU1NfVlNJIC8gRUdSRVNTX09VVF9MSUYgLyBFR1JFU1NfVE0gLyBFR1JFU1NfVE1fUE9SVCAodGhlIGRlZmF1bHQgaXMgVE0pCisjIHZhbGlkIGp1c3Qgd2hlbiB0aGVyZSBpcyBubyBjb25mbGljdCB3aXRoIHRoZSBvdGhlciBjb3VudGVyIGVuZ2luZXMKKyNjb3VudGVyX2VuZ2luZV9zb3VyY2Vfc3RhdDAuQkNNODg2NTA9RUdSRVNTX1RNCisjY291bnRlcl9lbmdpbmVfc291cmNlX3N0YXQxLkJDTTg4NjUwPUVHUkVTU19UTQorCisKKyMgU2V0IHRoZSBDb3VudGVyIGVuZ2luZSByZXNvbHV0aW9uCisjIFNJTVBMRV9DT0xPUiA9IGdyZWVuLCBub3QgZ3JlZW4KKyMgU0lNUExFX0NPTE9SX0ZXRCA9IGZ3ZCBncmVlbiwgZndkIG5vdCBncmVlbiAoQkNNODg2NjBfQTAgb25seSkKKyMgU0lNUExFX0NPTE9SX0RST1AgPSBkcm9wIGdyZWVuLCBkcm9wIG5vdCBncmVlbiAoQkNNODg2NjBfQTAgb25seSkKKyMgRldEX0RST1AgPSBmb3J3YXJkZWQsIGRyb3BwZWQKKyMgR1JFRU5fTk9UX0dSRUVOID0gZndkIGdybiwgZHJvcCBncm4sIGZ3ZCBub3QgZ3JuLCBkcm9wIG5vdCBncm4KKyMgRlVMTF9DT0xPUiA9IGZ3ZCBncm4sIGRyb3AgZ3JuLCBmd2Qgbm90IGdybiwgZHJvcCB5ZWwsIGRyb3AgcmVkCisjIEFMTCA9IHJlY2VpdmVkCisjIEZXRCA9IGZvcndhcmRlZCwgRFJPUCA9IGRyb3BlZCAobm90IHN1cHBvcnRlZCBieSBBUkFEX0EwKQorIyBDT05GSUdVUkFCTEUgPSBkZWZpbmVkIGJ5IGNvdW50ZXJfZW5naW5lX21hcF8gU09DIHByb3BlcnRpZXMgKEJDTTg4NjYwX0EwIG9ubHkpCitjb3VudGVyX2VuZ2luZV9zdGF0aXN0aWNzXzAuQkNNODg2NTA9RlVMTF9DT0xPUgorY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18xLkJDTTg4NjUwPUZVTExfQ09MT1IKKyMjIworIyMjICBETUwKKyMjIworIyMjICBGb3IgRE1MIGFwcGxpY2F0aW9ucywgY291bnRlciBlbmdpbmUgMyBpcyB1c2VkIGZvciBWT1EKKyMjIyAgY291bnRlcnMuIFRoaXMgaW4gY29tYmluYXRpb24gd2l0aCBjb25maWd1cmluZyB0aGUgZW5naW5lcyB1c2VkIGZvcgorIyMjICBWT1FzIGZvciBGV0RfRFJPUCBhbGxvd3MgZm9yIGNvdW50ZXJzIGZvciAzMksgVk9Rcy4KKyMjIworI2NvdW50ZXJfZW5naW5lX3N0YXRpc3RpY3NfMi5CQ004ODY1MD1GVUxMX0NPTE9SCisjY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18zLkJDTTg4NjUwPUZVTExfQ09MT1IKK2NvdW50ZXJfZW5naW5lX3N0YXRpc3RpY3NfMi5CQ004ODY1MD1GV0RfRFJPUAorY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18zLkJDTTg4NjUwPUZXRF9EUk9QCisKKyMgU2V0IHRoZSBDb3VudGVyIGZvcm1hdAorIyBPcHRpb25zOiBQQUNLRVRTX0FORF9CWVRFUyAvIFBBQ0tFVFMgLyBCWVRFUworIyAvIE1BWF9RVUVVRV9TSVpFIC8gUEFDS0VUU19BTkRfUEFDS0VUUyhzdXBwb3J0ZWQganVzdCBpbiBGV0RfRFJPUCBzdGF0aXN0aWMgaW4gQkNNODg2NjBfQTApCisjIElmIG5vdCBQQUNLRVRTX0FORF9CWVRFUyBvciBQQUNLRVRTX0FORF9QQUNLRVRTLCB0aGUgSFcgQ291bnRlciB3aWR0aCBpcyA1OSBiaXRzLCB0aHVzCisjIG5vIGJhY2tncm91bmQgU1cgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZAorY291bnRlcl9lbmdpbmVfZm9ybWF0XzAuQkNNODg2NTA9UEFDS0VUU19BTkRfQllURVMKK2NvdW50ZXJfZW5naW5lX2Zvcm1hdF8xLkJDTTg4NjUwPVBBQ0tFVFNfQU5EX0JZVEVTCitjb3VudGVyX2VuZ2luZV9mb3JtYXRfMi5CQ004ODY1MD1QQUNLRVRTX0FORF9CWVRFUworY291bnRlcl9lbmdpbmVfZm9ybWF0XzMuQkNNODg2NTA9UEFDS0VUU19BTkRfQllURVMKKworIyAjZW5hYmxlL2Rpc2FibGUgY291bnRlciBwcm9jZXNzb3IgYmFja2dyb3VuZCB0aHJlYWQgKGRlZmF1bHQ6MS1lbmFibGUpCisjIGNvdW50ZXJfZW5naW5lX3NhbXBsaW5nX2ludGVydmFsPTEKKworIyMjIENvbmZpZ3VyYWJsZSBtb2RlIGNvbmZpZ3VyYXRpb24gKEJDTTg4NjYwX0EwIG9ubHkpIyMjCisjIGNvdW50ZXJfZW5naW5lX3N0YXRpc3RpY3NfMC5CQ004ODY2MF9BMD1DT05GSUdVUkFCTEUKKyMgY291bnRlcl9lbmdpbmVfbWFwX2VuYWJsZV8wLkJDTTg4NjYwX0EwPTEKKyMgY291bnRlcl9lbmdpbmVfbWFwX3NpemVfMC5CQ004ODY2MF9BMD00CisjIGNvdW50ZXJfZW5naW5lX21hcF9md2RfZ3JlZW5fb2Zmc2V0XzAuQkNNODg2NjBfQTA9MAorIyBjb3VudGVyX2VuZ2luZV9tYXBfZndkX3llbGxvd19vZmZzZXRfMC5CQ004ODY2MF9BMD0xCisjIGNvdW50ZXJfZW5naW5lX21hcF9md2RfcmVkX29mZnNldF8wLkJDTTg4NjYwX0EwPTEKKyMgY291bnRlcl9lbmdpbmVfbWFwX2Z3ZF9ibGFja19vZmZzZXRfMC5CQ004ODY2MF9BMD0yCisjIGNvdW50ZXJfZW5naW5lX21hcF9kcm9wX2dyZWVuX29mZnNldF8wLkJDTTg4NjYwX0EwPTMKKyMgY291bnRlcl9lbmdpbmVfbWFwX2Ryb3BfeWVsbG93X29mZnNldF8wLkJDTTg4NjYwX0EwPTMKKyMgY291bnRlcl9lbmdpbmVfbWFwX2Ryb3BfcmVkX29mZnNldF8wLkJDTTg4NjYwX0EwPTMKKyMgY291bnRlcl9lbmdpbmVfbWFwX2Ryb3BfYmxhY2tfb2Zmc2V0XzAuQkNNODg2NjBfQTA9MworCisjIyMgU3RhdGlzdGljLVJlcG9ydCBjb25maWd1cmF0aW9uICMjIworIyBFbmFibGUgdGhlIFN0YXRpc3RpYy1JbnRlcmZhY2UgY29uZmlndXJhdGlvbgorIyBzdGF0X2lmX2VuYWJsZV88cG9ydD4gLSBub3Qgc3VwcG9ydGVkIGJ5IEFSQURfQTAKKyMgc3RhdF9pZl9lbmFibGUuQkNNODg2NTA9MQorCisjICMjIFN0YXRpc3RpYy1SZXBvcnQgUHJvcGVydGllcworIyAjIFNldCB0aGUgU3RhdGlzdGljLVJlcG9ydCBtb2RlCisjICMgT3B0aW9uczogQklMTElORyAvIEJJTExJTkdfUVVFVUVfTlVNQkVSIChub3Qgc3VwcG9ydGVkIGJ5IEFSQURfQTApLyBRU0laRQorIyBzdGF0X2lmX3JlcG9ydF9tb2RlLkJDTTg4NjUwPVFTSVpFCisjICNJbmRpY2F0ZSBpZiBpZGxlIHJlcG9ydHMgbXVzdCBiZSBzZW50CisjICN3aGVuIHRoZSBTdGF0aXN0aWMtcmVwb3J0IHJhdGUgaXMgdG9vIGxvdworIyBzdGF0X2lmX2lkbGVfcmVwb3J0c19wcmVzZW50LkJDTTg4NjUwPTAKKyMgIyBJbmRpY2F0ZSBpZiB0aGUgcmVwb3J0ZWQgcGFja2V0IHNpemUgaXMgdGhlIG9yaWdpbmFsIHBhY2tldCBzaXplCisjIHN0YXRfaWZfcmVwb3J0X29yaWdpbmFsX3BrdF9zaXplLkJDTTg4NjUwPTEKKyMgI0lmIHNldCB0aGVuIGEgc2luZ2xlIGluZ3Jlc3MtYmlsbGluZyByZXBvcnQgd2lsbCBiZSBnZW5lcmF0ZWQKKyMgI2ZvciB0aGUgd2hvbGUgc2V0IG9mIHRoZSBtdWx0aWNhc3QgY29waWVzCisjIHN0YXRfaWZfcmVwb3J0X211bHRpY2FzdF9zaW5nbGVfY29weT0xCisjICMjIFN0YXRpc3RpYyBQYWNrZXQgY29uZmlndXJhdGlvbnMKKyMgIyBTZXQgdGhlIFN0YXRpc3RpYyBQYWNrZXQgc2l6ZSAoQnl0ZXMpCisjICMgVmFsaWQgdmFsdWVkOiA2NUIvMTI2Qi8yNDhCLzQ5MkIgKFF1ZXVlLVNpemUpLCA2NEIvMTI4Qi8yNTZCLzUxMkIvMTAyNEIgKEJpbGxpbmcpCisjIHN0YXRfaWZfcGt0X3NpemU9NjRCCisjCisjICMjIFNjcnViYmVyIGNvbmZpZ3VyYXRpb24KKyMgIyBTZXQgdGhlIHJhbmdlIG9mIFZPUXMgdG8gc2NydWIuIFJhbmdlOiAwIC0gOTZLLTEuCisjIHN0YXRfaWZfc2NydWJiZXJfcXVldWVfbWluLkJDTTg4NjUwPTAKKyMgc3RhdF9pZl9zY3J1YmJlcl9xdWV1ZV9tYXguQkNNODg2NTA9MAorIworIyAjIFNldCB0aGUgc2NydWJiZXIgcmF0ZSByYW5nZQorIyAjIElmIHNldCB0byAwIChkZWZhdWx0KSwgdGhlIHNjcnViYmVyIGlzIGRpc2FibGVkLiBVbml0czogbmFub3NlY29uZHMKKyMgc3RhdF9pZl9zY3J1YmJlcl9yYXRlX21pbi5CQ004ODY1MD0wCisjIHN0YXRfaWZfc2NydWJiZXJfcmF0ZV9tYXguQkNNODg2NTA9MAorIworIyAjIFNldCB0aGUgdGhyZXNob2xkcyAodGhyZXNoX2lkIDAgLSAxNSkgZGVmaW5pbmcKKyMgIyBvY2N1cGFuY3kgcmFuZ2UgcGVyIHJlc291cmNlIHR5cGU6CisjICMgRFJBTSBCdWZmZXJzLCBCdWZmZXIgZGVzY3JpcHRvcnMsIEJ1ZmZlciBkZXNjcmlwdG9ycyBidWZmZXJzCisjIHN0YXRfaWZfc2NydWJiZXJfYmRiX3RoLkJDTTg4NjUwPTAKKyMgc3RhdF9pZl9zY3J1YmJlcl9idWZmZXJfZGVzY3JfdGguQkNNODg2NTA9MAorIyBzdGF0X2lmX3VjX2RyYW1fYnVmZmVyX2Rlc2NyX3RoLkJDTTg4NjUwPTAKKyMKKyMgI1JlbGVjdGl2ZSByZXBvcnQgZm9yIHF1ZXVlIHNpemUgbW9kZSAtIG5vdCBzdXBwb3J0ZWQgYnkgQVJBRF9BMAorIyAjUmVwb3J0cyB3aWxsIGJlIGNyZWF0ZWQgZm9yIHF1ZXVlIG51bSByYW5nZSAoc3RhdF9pZl9zZWxlY3RpdmVfcmVwb3J0X3F1ZXVlX21pbiAtc3RhdF9pZl9zZWxlY3RpdmVfcmVwb3J0X3F1ZXVlX21heCkKKyMgI0RlZmF1bHQgLSBhbGwgcmFuZ2UKKyMgc3RhdF9pZl9zZWxlY3RpdmVfcmVwb3J0X3F1ZXVlX21pbi5CQ004ODY1MF9CMD0wCisjIHN0YXRfaWZfc2VsZWN0aXZlX3JlcG9ydF9xdWV1ZV9tYXguQkNNODg2NTBfQjA9OTgzMDMKKworIyMjIFRyYW5zYWN0aW9uIC0gRE1BIGNvbmZpZ3VyYXRpb24gIyMjCisjIFRpbWUgdG8gd2FpdCBmb3IgU0NIQU4gY2hhbm5lbCByZXNwb25zZSAoZnJvbSBDTUlDKS4gVW5pdHM6IG1pY3Jvc2Vjb25kcy4KKworIyBUT0RPCisjIyMgQ291bnRlciB0aHJlYWRzICMjIworIyBzcG5fQkNNX1NUQVRfUEJNUCwgc3BuX0JDTV9TVEFUX0lOVEVSVkFMLCBzcG5fQkNNX1NUQVRfRkxBR1MKKworIyMjIEludGVycnVwdHMgIyMjCisjIyBTZXQgaW50ZXJydXB0cyBnbG9iYWwgcGFyYW1ldGVycy4KKyMgT3B0aW9uczogMSAtIFBvbGxpbmcgaW50ZXJydXB0IG1vZGUsIDAgLSBMaW5lL01TSSBpbnRlcnJ1cHQgbW9kZS4gRGVmYXVsdDogMS4KK3BvbGxlZF9pcnFfbW9kZS5CQ004ODY1MD0wCisjICBTZXQgdGhlIGRlbGF5IGluIG1pY3Jvc2Vjb25kIGJldHdlZW4gdGhlIHBvbGxpbmcsIHJlbGV2YW50IG9ubHkgdG8gUG9sbGluZyBtb2RlLiAgRGVmYXVsdDogMHgwLgorcG9sbGVkX2lycV9kZWxheS5CQ004ODY1MD01MDAwMAorCisjIyBDTUlDIGludGVycnVwdHM6CisjIEVuYWJsZTogVXNlIGludGVycnVwdHMgY29tcGxldGlvbiBpbnN0ZWFkIG9mIHBvbGxpbmcgY29tcGxldGlvbiBmb3IgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zLgorIyAgICAgICAgIE9wdGlvbnM6IDEgLSBFbmFibGUsIDAgLSBEaXNhYmxlLiBEZWZhdWx0OiAwLgorIyBUaW1lb3V0OiBkZWxheSBpbiBNaWNyb3NlY29uZCBiZXR3ZWVuIHRoZSBwb2xsaW5nLCByZWxldmFudCBvbmx5IHRvIFBvbGxpbmcgY29tcGxldGlvbiBtb2RlLgorIyBTQ0hBTjoKKyNzY2hhbl9pbnRyX2VuYWJsZS4wPTEKK3NjaGFuX3RpbWVvdXRfdXNlYy5CQ004ODY1MD0zMDAwMDAKKyMgVERNQQordGRtYV9pbnRyX2VuYWJsZS5CQ004ODY1MD0xCit0ZG1hX3RpbWVvdXRfdXNlYy5CQ004ODY1MD04MDAwMDAwMAorIyBUU0xBTQordHNsYW1faW50cl9lbmFibGUuQkNNODg2NTA9MQordHNsYW1fdGltZW91dF91c2VjLkJDTTg4NjUwPTgwMDAwMDAwCisjIE1JSU0KKyNtaWltX2ludHJfZW5hYmxlLjA9MQorbWlpbV90aW1lb3V0X3VzZWMuMD0zMDAwMDAKKworIyMjIERSQU0gY29uZmlndXJhdGlvbiAjIyMKKworIyBEUkFNIGJ1ZmZlciAoRGJ1ZmYpIHNpemUKKyMgQWxsb3dlZCB2YWx1ZXM6IDI1Ni81MTIvMTAyNC8yMDQ4LgorZXh0X3JhbV9kYnVmZl9zaXplLkJDTTg4NjUwPTEwMjQKKworIyBOdW1iZXIgb2YgZXh0ZXJuYWwgRFJBTXMuCisjIEFsbG93ZWQgdmFsdWVzIGZvciA4ODY1MDogMC8yLzMvNC82LzguIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyB0aGUgRFJBTS4KKyMgQWxsb3dlZCB2YWx1ZXMgZm9yIDg4NjYwOiAwLzEvMi8zLzQvNi84LiBBIHZhbHVlIG9mIDAgZGlzYWJsZXMgdGhlIERSQU0uCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSB2YWx1ZSBvZiAxIGlzIHBlcm1pdHRlZCBvbmx5IGluIE9ORSBXQVkgQllQQVNTIG9jYiBtb2RlLgorZXh0X3JhbV9wcmVzZW50LkJDTTg4NjUwPTgKKworIyMjIERyYW0gVHVuaW5nIChTaG1vbykKKyMgMiA9IFVzZSBEcmFtIHNhdmVkIGNvbmZpZyBQYXJhbWV0ZXJzLCBpZiBubyBQYXJhbWV0ZXJzIFBlcmZvcm0gU2htb28gb24gaW5pdC4gRGVmYXVsdCBvcHRpb24uCisjIDEgPSBQZXJmb3JtIFNobW9vIG9uIGluaXQuCisjIDAgPSBVc2UgRHJhbSBzYXZlZCBjb25maWcgUGFyYW1ldGVycywgaWYgbm8gUGFyYW1ldGVycyBkbyBub3RoaW5nLgorZGRyM19hdXRvX3R1bmUuQkNNODg2NTA9MgorCisjIyMgRW5hYmxlIEJJU1QKKyMgUnVuIERyYW0gQklTVCBvbiBpbml0aWFsaXphdGlvbiwgaWYgQklTVCBmYWlsIHRoZSBpbml0aWFsaXphdGlvbiB3aWxsIGZhaWwuIERlZnVsdDogMS4KKyMgYmlzdF9lbmFibGVfZHJhbS5CQ004ODY1MD0xCisKKyMjIyBFeGFtcGxlIGZvciBEcmFtIFNhdmVkIGNvbmZpZyBQYXJhbWV0ZXJzLgorIyMgVGhpcyBleGFtcGxlIGlzIGZvciBjaT0xNCAoRHJhbT03KS4KKyNkZHIzX3R1bmVfYWRkcmNfY2kxND0weDAwMDAwMGFlCisjZGRyM190dW5lX3dyX2RxX3dsMV9jaTE0PTB4OTI5MjkyOTIsMHg5MjkyOTI5MiwweDkyOTI5MjkyLDB4OTI5MjkyOTIKKyNkZHIzX3R1bmVfd3JfZHFfd2wwX2NpMTQ9MHg5MzkzOTM5MywweDkzOTM5MzkzLDB4OTI5MjkyOTIsMHg5MjkyOTI5MgorI2RkcjNfdHVuZV93cl9kcV9jaTE0PTB4ODA4MDgwODAKKyNkZHIzX3R1bmVfdnJlZl9jaTE0PTB4MDAwMDA3ZGYKKyNkZHIzX3R1bmVfcmRfZHFzX2NpMTQ9MHg5Njk2OTE5MSwweDkwOTA5MTkxCisjZGRyM190dW5lX3JkX2RxX3dsMV9ybl9jaTE0PTB4ODI4MjgyODIsMHg4MjgyODI4MiwweDgyODI4MjgyLDB4ODI4MjgyODIKKyNkZHIzX3R1bmVfcmRfZHFfd2wwX3JuX2NpMTQ9MHg4MjgyODI4MiwweDgyODI4MjgyLDB4ODk4OTg5ODksMHg4OTg5ODk4OQorI2RkcjNfdHVuZV9yZF9kcV93bDFfcnBfY2kxND0weDgyODI4MjgyLDB4ODI4MjgyODIsMHg4MjgyODI4MiwweDgyODI4MjgyCisjZGRyM190dW5lX3JkX2RxX3dsMF9ycF9jaTE0PTB4ODI4MjgyODIsMHg4MjgyODI4MiwweDg5ODk4OTg5LDB4ODk4OTg5ODkKKyNkZHIzX3R1bmVfcmRfZW5fY2kxND0weDAwOWQ5ZTlkLDB4MDBhMmEzYTEKKyNkZHIzX3R1bmVfcmRfZGF0YV9kbHlfY2kxND0weDAwMDAwNTA1CisKKworIyBEcmFtIHR5cGU6IFNlbGVjdCBPTkxZIE9ORSBvZiB0aGUgZm9sbG93aW5nIERSQU0gdHlwZXMsIHRvIGNvbmZpZ3VyZSBhbGwgZHJhbSByZWxhdGVkIHBhcmFtZXRlcmVzIHBlciB0eXBlLgorIyBEcmFtIFR5cGUgZm9yIEFyYWQ6CitkcmFtX3R5cGVfRERSM19IWU5JWF9INVRRMkc2M0JGUl9URUNfMTA2Nj0xCisjZHJhbV90eXBlX0REUjNfSFlOSVhfSDVUUTJHNjNCRlJfVEVDXzkzMz0xCisjZHJhbV90eXBlX0REUjNfSFlOSVhfSDVUUTJHNjNCRlJfVEVDXzgwMD0xCisjZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMjU2TTE2XzRHQklUXzEwNjY9MQorI2RyYW1fdHlwZV9ERFIzX01JQ1JPTl9NVDQxSjEyOE0xNkhBXzEyNV8xMDY2PTEKKyNkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoxMjhNMTZIQV8xMjVfOTMzPTEKKyNkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoxMjhNMTZIQV8xMjVfODAwPTEKKyNkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0Mko2NE0xNkxBXzE1RV82Njc9MQorI2RyYW1fdHlwZV9ERFIzX1NBTVNVTkdfSzRCNEcxNjQ2Ql80R0JJVF8xMDY2PTEKKyNkcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjFHMTY0NkdfOTMzPTEKKyNkcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjFHMTY0NkdfODAwPTEKKworIyMjIFNldHRpbmcgZHJhbV90eXBlX0REUjNfSFlOSVhfSDVUUTJHNjNCRlJfVEVDXzEwNjYgUGFyYW1ldGVycyBhcyBEZWZhdWx0OgorIyMgQWxsIG90aGVyIGRyYW0gdHlwZXMgcGFyYW1ldGVyIHJlc2lkZXMgaW4gYXJhZC5zb2MuIGNob29zaW5nIGFub3RoZXIgRHJhbSBUeXBlIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLgorZXh0X3JhbV90X3JyZD02MDAwCitleHRfcmFtX2NvbHVtbnM9MTAyNAorZXh0X3JhbV9iYW5rcz04CitleHRfcmFtX2FwX2JpdF9wb3M9MTAKK2V4dF9yYW1fYnVyc3Rfc2l6ZT0zMgorZXh0X3JhbV90X3JlZj0zOTAwMDAwCitleHRfcmFtX3Rfd3I9MTUwMDAKK2V4dF9yYW1fdF93dHI9NzUwMAorZXh0X3JhbV90X3J0cD03NTAwCitleHRfcmFtX2ZyZXE9MTA2NgorZXh0X3JhbV9yb3dzPTE2Mzg0CitleHRfcmFtX2plZGVjPTI5CitleHRfcmFtX3RfcmM9NDYwOTAKK2V4dF9yYW1fdF9yY2RfcmQ9MTMwOTAKK2V4dF9yYW1fdF9yY2Rfd3I9MTMwOTAKK2V4dF9yYW1fdF9ycD0xMzA5MAorZXh0X3JhbV90X3JmYz0xNjAwMDAKK2V4dF9yYW1fdF9yYXM9MzMwMDAKK2V4dF9yYW1fY193cl9sYXRlbmN5PTEwCitleHRfcmFtX3RfZmF3PTM1MDAwCitleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTQKK2RkcjNfbWVtX2dyYWRlPTB4MTQxNDE0CisKKyMgRFJBTSBwcmUtY29uZmlndXJhdGlvbnMgYWNjb3JkaW5nIHRvIGNvbmZpZyB2YXJpYWJsZXMgd2hpY2ggZGVmaW5lcworIyBEcmFtIFR5cGUuIHN1cHBvcnRzIG9ubHkgRERSMzoKK2V4dF9yYW1fdHlwZS5CQ004ODY1MD1ERFIzCisKKyMgVG90YWwgRHJhbSBTaXplIChNQnl0ZXMpCisjIEZvciA4IGRyYW1zIGludGVyZmFjZXMsIDIgY2hhbm5lbCBlYWNoLCBFYWNoIGNoYW5uZWwgMkdiaXQgRHJhbS4gdGhlIHRvdGFsIERSQU0gc2l6ZSBpcyAzMkdCaXRzPTQwMDBNQnl0ZXMuCitleHRfcmFtX3RvdGFsX3NpemUuQkNNODg2NTA9NDAwMAorCisjIFRvdGFsIGJ1ZmZlciBzaXplIGFsbG9jYXRlZCBmb3IgVXNlciBidWZmZXIuIFVuaXRzOiBNYnl0ZXMuIERlZmF1bHQ6ICcweDAnLgorIyBTdXBwb3J0ZWQgc3VmZml4OgorIyAgICAgICBkcmFtIC0gdGhlIGJ1ZmZlciBzaXplIHdpbGwgYmUgc3VidHJhY3RlZCBmcm9tIHRoZSBEUkFNIHNpemUgYXZhaWxhYmxlIGZvciBwYWNrZXQgbWVtb3J5LgorI3VzZXJfYnVmZmVyX3NpemU9MAorI3VzZXJfYnVmZmVyX3NpemVfZHJhbT01MAorCisjIERSQU0gQ2xhbVNoZWxsIChpbnRlcmZhY2Ugc3dhcCBpdHMgSFcgUElOIHBhaXJzIGR1cmluZyBpbml0LiBOb3RlOiBPbmx5IG9uZSBvZiBEUkFNcyBjYW4gaGF2ZSBpdHMgUElOIHN3YXBwZWQpCisjIFZhbGlkIHZhbHVlczogMC8xCisjZHJhbTBfY2xhbXNoZWxsX2VuYWJsZS5CQ004ODY1MD0xCisjZHJhbTFfY2xhbXNoZWxsX2VuYWJsZS5CQ004ODY1MD0xCisKKyMgRFJBTSBtYXhpbXVtIG51bWJlciBvZiBjcmMgZXJyb3IgcGVyIGJ1ZmZlciwgYnVmZmVyIGRlbGV0ZWQgYnkgaW50ZXJydXB0IGFwcGxpY2F0aW9uLgorI2RyYW1fY3JjX2RlbF9idWZmZXJfbWF4X3JlY2xhaW1zPTAKKworIyMjIFdhcm1ib290ICMjIworIyMgU2NhY2hlIGluaXRpYWxpemF0aW9uIGZvciB3YXJtYm9vdCBwZXJzaXN0ZW50IHN0b3JhZ2UuCisjU2F2ZSB0aGUgd2FybSBib290IGRhdGEgaW4gYSBmaWxlLiBBbGxvd2VkIHZhbHVlczogMy4KKyNzdGFibGVfbG9jYXRpb24uQkNNODg2NTA9MworI1NldCB0aGUgd2FybSBib290IGRhdGEgZmlsZW5hbWUuCisjc3RhYmxlX2ZpbGVuYW1lLkJDTTg4NjUwPS4vd2FybWJvb3RfZGF0YQorI1NldCB0aGUgd2FybSBib290IGRhdGEgZmlsZSBzaXplIChBdCBsZWFzdCAxME1CIGZvciBQRVRSQS1CLCA0TUIgZm9yIEFSQUQpCisjc3RhYmxlX3NpemUuQkNNODg2NTA9MTAwMDAwMDAwMAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb25maWcgdmFyaWFibGUgYmVsb3cgYXJlIG9ubHkgYWNjZXNzZWQgZnJvbSBkdW5lLnNvYywgYW5kIGFyZSB1c2VkIHRvCisjIGNvbmZpZ3VyZSBCU1AgLyBleGFtcGxlIGFwcGxpY2F0aW9uIC8gZ3JvdXAgb2YgZm9ybWFsIGNvbmZpZyB2YXJpYWJsZXMuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMgSWYgc2V0LCBhbHdheXMgY29uZmlndXJlcyBzeW50aGVzaXplcnMsIGV2ZW4gaWYgdGhlIGNvbmZpZ3VyZWQgcmF0ZSBpcyBlcXVhbCB0bworIyMgdGhlaXIgbm9taW5hbCByYXRlLiBDYW4gYmUgZGlzYWJsZWQgdG8gc3BlZWR1cCBicmluZ3VwIHRpbWUgKGtlZXAgaW4gbWluZCB0aGF0IGlmCisjIyBkaXNhYmxlZCwgY2hhbmdpbmcgYSBzeW50IHRvIGEgbm9uLW5vbWluYWwgZnJlcSBhbmQgdGhhbiBiYWNrIHRvIG5vbWluYWwgd2lsbCBub3QKKyMjIHdvcmsKKyNzeW50X292ZXIuQkNNODg2NTA9MQorCisjIExvY2FsIHZhcmlhYmxlcyBmb3IgYm9hcmQgc3ludGhlc2l6ZXJzIGZyZXEuIEZhYnJpYywgY29tYm8gYW5kIG5pZiBhbHNvIGNvbmZpZ3VyZQorIyB0aGUgKl9yZWZfY2xvY2sgc29jIHByb3BlcnRpZXMgZm9yIHRoZXNlIGZyZXF1ZW5jaWVzLiBjb3JlLCBkZHIgYW5kIHBoeSBvbmx5CisjIGNvbmZpZ3VyZXMgdGhlIHN5bnRoZXNpemVyCitzeW50X2NvcmUuQkNNODg2NTA9MTAwMDAwMDAwCitzeW50X2Rkci5CQ004ODY1MD0xMjUwMDAwMDAKK3N5bnRfcGh5LkJDTTg4NjUwPTE1NjI1MDAwMAorc3ludGhfZHJhbV9mcmVxLkJDTTg4NjUwPTI1CisKKyNDb25maWd1cmUgdGhlIHJlZmVyZW5jZSBjbG9jayBmcmVxdWVuY2llcyBmb3IgTklGIGFuZCBGYWJyaWMgU2VyRGVzCisjIE9wdGlvbnM6ICAwIC0gMTI1TUhaLCAxIC0gMTU2LjI1TUh6CitzZXJkZXNfbmlmX2Nsa19mcmVxLkJDTTg4NjUwPTEKK3NlcmRlc19mYWJyaWNfY2xrX2ZyZXEuQkNNODg2NTA9MQorIyBJRUVFIDE1ODggLQorIyBjb25maWd1cmUgY2xvY2sgKGZvciAxNTg4IGRlYnVnLCB3aGVuIEJyb2Fkc3luYyBpcyBkaXNhYmxlZCk6CisjICBEUExMIG1vZGUvbG9jazogMCAtIGVjaSB0cyBwbGwgY2xrIGRpc2FibGVkLCAxIC0gY29uZmlndXJlIGVjaSB0cyBwbGwgY2xrCisjICBEUExMIHBoYXNlL2ZyZXEuIERlZmF1bHQgaW5pdGlhbDogbG8gPSAweDQwMDAwMDAwLCBoaSA9IDB4MTAwMDAwMDAuCisjcGh5XzE1ODhfZHBsbF9mcmVxdWVuY3lfbG9jay5CQ004ODY1MD0xCisjcGh5XzE1ODhfZHBsbF9waGFzZV9pbml0aWFsX2xvLkJDTTg4NjUwPTB4NDAwMDAwMDAKKyNwaHlfMTU4OF9kcGxsX3BoYXNlX2luaXRpYWxfaGkuQkNNODg2NTA9MHgxMDAwMDAwMAorIyBwb3J0IGV4dGVybmFsIE1BQworIyAgaW5kaWNhdGlvbiB3aGV0aGVyIGV4dGVybmFsIE1BQyBleGlzdHMgb3Igbm90LgorIyAgMDogMTU4OCBleHRlcm5hbCBNQUMgZG9lcyBub3QgZXhpc3QKKyMgIDE6IDE1ODggZXh0ZXJuYWwgTUFDIGV4aXN0cworIyAgdGhlIGV4dGVybmFsIE1BQyBzdWJzdHJhY3RzIHRoZSBSWCB0aW1lIGZyb20gdGhlIGNvcnJlY3Rpb24gZmllbGQKKyMgIGFuZCBhZGRzIHRoZSBUWCB0aW1lIHRvIHRoZSBjb3JyZWN0aW9uIGZpZWxkLgorI2V4dF8xNTg4X21hY19lbmFibGVfMTQuQkNNODg2NTA9MQorCisjIyBUcmlsbCBjb25maWd1cmF0aW9ucworIyBUcmlsbCBtb2RlOiAwIChkaXNhYmxlZCkgLyAxIChjb2Fyc2UtZ3JhaW5lZCkgLyAyIChmaW5lLWdyYWluZWQpCisjdHJpbGxfbW9kZS5CQ004ODY1MD0xCisKKyMgVHJpbGwgbXVsdGljYXN0IHBydW5uaW5nIG1vZGU6CisjIDA6IG5vIHBydW5uaW5nIC0gdnNpIGlzIG5vdCBwYXJ0IG9mIHRoZSBrZXkKKyMgMTogVlNJIHBydW5uaW5nOiBLZXkgaXMgZGlzdC10cmVlLGVzYWRpdC1iaXQsVlNJLgordHJpbGxfbWNfcHJ1bmVfbW9kZS5CQ004ODY1MD0wCisKKyMgRW5hYmxlIFNBIGF1dGhlbnRpY2F0aW9uCisjc2FfYXV0aF9lbmFibGVkPTEKKworIyBCcmlkZ2UgZGVmYXVsdCBsb2dpY2FsIGludGVyZmFjZXMgYWxsb2NhdGlvbiBJRFMKK2xvZ2ljYWxfcG9ydF9sMl9icmlkZ2UuQkNNODg2NTA9MAorbG9naWNhbF9wb3J0X2Ryb3AuQkNNODg2NTA9MQorCisjbG9naWNhbF9wb3J0X21pbV9pbi5CQ004ODY1MD0yCisjbG9naWNhbF9wb3J0X21pbV9vdXQuQkNNODg2NTA9NDA5NgorCisjIEVuYWJsZSBFVkIgYXBwbGljYXRpb24KKyNldmJfZW5hYmxlPTEKKworIyBFbmFibGUgRmxleGlibGUgUWluUSBhcHBsaWNhdGlvbgorI3ZsYW5fdHJhbnNsYXRpb25fbWF0Y2hfaXB2ND0xCisKKworIyBQcmVwZW5kIHRhZyB0byBiZSA0IGJ5dGVzIG9yIDggYnl0ZXMuIERlZmF1bHQ6IDRCLgorIyBBcHBsaWNhYmxlIG9ubHkgZnJvbSBBUkFEKworI3ByZXBlbmRfdGFnX2J5dGVzPTRCCisKKyMgVGhlIFByZXBlbmQgVGFnIGlzIGxvY2F0ZWQgYXQgKDEyICsgMipvZmZzZXQpIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQuCisjIFJhbmdlOiAwLTcuIERlZmF1bHQ6IDAKKyNwcmVwZW5kX3RhZ19vZmZzZXQ9MAorCisjIEVuYWJsZSBBUlAgKG5leHQgaG9wIG1hYyBleHRlbnNpb24pIGZlYXR1cmUKK2JjbTg4Nnh4X25leHRfaG9wX21hY19leHRlbnNpb25fZW5hYmxlLkJDTTg4NjUwPTAKKworIyBTZXQgVkxBTiB0cmFuc2xhdGUgbW9kZS4KKyMgMDogbm9ybWFsCisjIDE6IGFkdmFuY2VkIG1vZGUuIEVuYWJsZSB2bGFuIGVkaXQgc2V0dGluZ3Mgd2l0aCBlbmhhbmNlZCB1c2VyIGNvbnRyb2wKKyNiY204ODZ4eF92bGFuX3RyYW5zbGF0ZV9tb2RlPTAKKworIyBTZXQgTVBMUyB0ZXJtaW5hdGlvbiBkYXRhYmFzZSBtb2RlCisjIFNldCBNUExTIGRhdGFiYXNlcyBsb2NhdGlvbiBmb3IgZWFjaCBNUExTIG5hbWVzcGFjZSAoTDEsTDIsTDMpCisjYmNtODg2eHhfbXBsc190ZXJtaW5hdGlvbl9kYXRhYmFzZV9tb2RlPTAKKworIyBFbmFibGUgLCBEaXNhYmxlIE1QTFMgaW5kZXhlZC4KKyMgTVBMUyB0ZXJtaW5hdGlvbiB3aXRoIGtub3duIGxhYmVsIHN0YWNrIGxvY2F0aW9uLgorIyBNdXN0IGJlIGVuYWJsZWQgaW4gY2FzZSBkZXZpY2Ugc3VwcG9ydHMgbW9yZSB0aGFuIDIgTVBMUyBsYWJlbCB0ZXJtaW5hdGlvbnMgKEwxLEwyLEwzKQorI21wbHNfdGVybWluYXRpb25fbGFiZWxfaW5kZXhfZW5hYmxlPTEKKworIyBFbmFibGUgRmFzdFJlUm91dGUgbGFiZWxzIGluIGRldmljZS4KKyNmYXN0X3Jlcm91dGVfbGFiZWxzX2VuYWJsZT0wCisKKyMgRW5hYmxlIE1QTFMgQ29udGV4dCBzcGVjaWZpYy4gVXBzdHJlYW0gbGFiZWwgYXNzaWdubWVudCBpbiBkZXZpY2UuCisjbXBsc19jb250ZXh0X3NwZWNpZmljX2xhYmVsX2VuYWJsZT0wCisKKyMgTVBMUyBjb250ZXh0LgorIyBDYW4gYmUgZ2xvYmFsLCBwZXIgcG9ydCAsIHBlciBpbnRlcmZhY2Ugb3IgcGVyIHBvcnQsaW50ZXJmYWNlLgorI21wbHNfY29udGV4dD1nbG9iYWwKKworIyBNUExTIFRQIE1DIHJlc2VydmVkIG1hYyBhZGRyZXNzICgwMS0wMC01RS05MC0wMC0wMCkuCisjIElmIHNldCBkZXZpY2Ugd2lsbCBzdXBwb3J0IE15LU1BQyB0ZXJtaW5hdGlvbiBvZiByZXNlcnZlZCBNQyBFdGhlcm5ldAorI21wbHNfdHBfbXltYWNfcmVzZXJ2ZWRfYWRkcmVzcz0wCisKKyMgTVBMUyBFTEkgZW5hYmxlIGRpc2FibGUKK21wbHNfZW50cm9weV9sYWJlbF9pbmRpY2F0b3JfZW5hYmxlPTAKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyNjZmcgZm9yIEJDTTg4NjQwX0EwIC0gUGV0cmEKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2ZvcmNlX2Nsa19tX25fZGl2aXNvcnNfemVyb19uaWYwLkJDTTg4NjQwX0EwPTAKK2ZvcmNlX2Nsa19tX25fZGl2aXNvcnNfemVyb19mYWJyaWMwLkJDTTg4NjQwX0EwPTEKK2ZvcmNlX2Nsa19tX25fZGl2aXNvcnNfemVyb19jb21iMC5CQ004ODY0MF9BMD0wCisKK2NvbWJvX3JlZl9jbG9jay5CQ004ODY0MD0zMTI1MDAKKworbmlmX3JlZl9jbG9jay5CQ004ODY0MF9BMD0zMTI1MDAKKworIyBVc2UgdmFyaWFibGUgY2VsbCBzaXplCitzeXN0ZW1fY2VsbF9mb3JtYXQuQkNNODg2NDBfQTA9VkNTMTI4CisKKyMgQ29yZSBjbG9jayBzcGVlZCAoTUh6KQorY29yZV9jbG9ja19zcGVlZC5CQ004ODY0MF9BMD0zMDAKKworIyBNYXAgYmNtIGxvY2FsIHBvcnQgdG8gQ1BVL05JRiBpbnRlcmZhY2VzCit1Y29kZV9wb3J0XzAuQkNNODg2NDBfQTA9Q1BVLjAKK3Vjb2RlX3BvcnRfNzMuQkNNODg2NDBfQTA9Q1BVLjEKK3Vjb2RlX3BvcnRfNzQuQkNNODg2NDBfQTA9Q1BVLjIKK3Vjb2RlX3BvcnRfNzUuQkNNODg2NDBfQTA9Q1BVLjMKK3Vjb2RlX3BvcnRfNzYuQkNNODg2NDBfQTA9Q1BVLjQKK3Vjb2RlX3BvcnRfNzcuQkNNODg2NDBfQTA9Q1BVLjUKK3Vjb2RlX3BvcnRfNzguQkNNODg2NDBfQTA9Q1BVLjYKKworIyBJbnRlcmxha2VuIHBvcnRzIGJhc2ljIGNvbmZpZ3VyYXRpb24gKHRlbXBvcmFyeSkuCisjIFRoaXMgY29uZmlndXJhdGlvbiByZXBsYWNlcyB0aGUgYWJvdmUgWEFVSS9SWEFVSSBwb3J0cyBjb25maWcKKyMgVGhlIGZvbGxvd2luZyBQQiBkZXNpZ24gY29uc3RyYWludCBpcyBub3QgZW5mb3JjZWQgaW4gU1csIHNvIG11c3QgYmUgdGFrZW4KKyMgY2FyZSBvZiBoZXJlLCB3aGVuIG1hcHBpbmcgcG9ydHMgdG8gaW50ZXJmYWNlczoKKyMgICBJZiB1c2luZyBpbGtuMCwgcG9ydCAxIChpZiB1c2VkKSBtdXN0IGJlIG1hcHBlZCB0byBpbGtuMAorIyAgIElmIHVzaW5nIGlsa24xLCBwb3J0IDIgKGlmIHVzZWQpIG11c3QgYmUgbWFwcGVkIHRvIGlsa24xCisjICAgTm90ZSB0aGF0IGluIG91ciBkZWZhdWx0IG1hcHBpbmcsIHBvcnQgMiBpcyBtYXBwZWQgdG8gUlhBVUkgNiwgdGh1cyB3b24ndAorIyAgIHdvcmsuIElmIG9uZSB3YW50cyB0byB1c2UgZnJvbnQgcGFuZWwgcG9ydCAyIHdpdGggaWxrbjEsIGhlIHNob3VsZCBiZSBtYXAKKyMgICBSQVhVSTYgdG8gYSBwb3J0ICE9IDIuCisjaWxrbl9udW1fbGFuZXNfMC5CQ004ODY0MF9BMD0xMgorI3Vjb2RlX3BvcnRfMS5CQ004ODY0MF9BMD1JTEtOMC4wCisjdWNvZGVfcG9ydF8yLkJDTTg4NjQwX0EwPUlMS04wLjEKKyN1Y29kZV9wb3J0XzMuQkNNODg2NDBfQTA9SUxLTjAuMgorI2lsa25fbnVtX2xhbmVzXzEuQkNNODg2NDBfQTA9MTIKKyN1Y29kZV9wb3J0XzQuQkNNODg2NDBfQTA9UlhBVUk2CisjdWNvZGVfcG9ydF81LkJDTTg4NjQwX0EwPUlMS04xLjAKKyN1Y29kZV9wb3J0XzYuQkNNODg2NDBfQTA9SUxLTjEuMQorI3Vjb2RlX3BvcnRfNy5CQ004ODY0MF9BMD1JTEtOMS4yCisKKyMgRGVmYXVsdCBoZWFkZXIgdHlwZSBpcyBkZXJpdmVkIGZyb20gZmFwX2RldmljZV9tb2RlOiBJZiBmYXBfZGV2aWNlX21vZGUgaXMKKyMgUFAsIGRlZmF1bHQgaGVhZGVyIHR5cGUgaXMgRVRILiBPdGhlcndpc2UsIGRlZnVhbHQgaGVhZGVyIHR5cGUgaXMgVE0uCisjIEhlYWRlciB0eXBlIHBlciBwb3J0IGNhbiBiZSBvdmVycmlkZW4uCisjIEFsbCBvcHRpb25zOiBFVEgvUkFXL1RNL1BST0cvQ1BVL1NUQUNLSU5HL1RETS9URE1fUkFXL0lOSkVDVEVECisKKyMgU2V0IENQVSB0byB3b3JrIHdpdGggVE0gaGVhZGVyIChJVE1IKQorI3RtX3BvcnRfaGVhZGVyX3R5cGVfMC5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV9pbl8wLkJDTTg4NjQwX0EwPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8wLkJDTTg4NjQwX0EwPUNQVQordG1fcG9ydF9oZWFkZXJfdHlwZV83My5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83NC5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83NS5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83Ni5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83Ny5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83OC5CQ004ODY0MF9BMD1UTQorIyByZWN5Y2xpbmcgcG9ydAordG1fcG9ydF9oZWFkZXJfdHlwZV80MC5CQ004ODY0MF9BMD1SQVcKK3Vjb2RlX3BvcnRfNDAuQkNNODg2NDBfQTA9UkNZLjAKKworIyBFbmFibGUgRVJQIGFuZCBPTFAgcG9ydHMKK251bV9lcnBfdG1fcG9ydHMuQkNNODg2NDBfQTA9MQorbnVtX29scF90bV9wb3J0cy5CQ004ODY0MF9BMD0xCitudW1fcmVjeWNsZV90bV9wb3J0cy5CQ004ODY0MF9BMD0xCisKKyMgRHJhbSBjb25maWd1cmF0aW9uCisjIDYwMCBNaHoKK2V4dF9yYW1fcGxsX3IuQkNNODg2NDBfQTA9NAorZXh0X3JhbV9wbGxfZi5CQ004ODY0MF9BMD00NworZXh0X3JhbV9wbGxfcS5CQ004ODY0MF9BMD0xCitleHRfcmFtX2ZyZXEuQkNNODg2NDBfQTA9NjAwCisKKyMgRGJ1ZmYgc2l6ZQorIyBBbGxvd2VkIHZhbHVlczogMjU2LzUxMi8xMDI0LzIwNDguCitleHRfcmFtX2RidWZmX3NpemUuQkNNODg2NDBfQTA9MTAyNAorCisjIE51bWJlciBvZiBleHRlcm5hbCBEUkFNcy4KKyMgQWxsb3dlZCB2YWx1ZXMgZm9yIDg4eDR4OiAwLzIvMy80LzYuCisjIEFsbG93ZWQgdmFsdWVzIGZvciA4ODY1MDogMC8yLzMvNC82LzguCisjIGV4dF9yYW1fdG90YWxfc2l6ZSBiZWxvdyBhc3N1bWVkIHRoaXMgdmFsdWUgaXMgNiBmb3IgODh4NHggYW5kIDggZm9yCitleHRfcmFtX3ByZXNlbnQuQkNNODg2NDBfQTA9NgorCisjIERyYW0gdHlwZTogU2VsZWN0IE9OTFkgT05FIG9mIHRoZSBmb2xsb3dpbmcgRFJBTSB0eXBlcywgdG8gY29uZmlndXJlIGFsbCBkcmFtCisjIHJlbGF0ZWQgcGFyYW1ldGVyZXMgcGVyIHR5cGUuCisjIERyYW0gVHlwZSBmb3IgUGI6CitkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUo2NE0xNl8xNUUuQkNNODg2NDBfQTA9MQorI2RyYW1fdHlwZV9ERFIyX01JQ1JPTl9LNFQ1MTE2M1FFX1pDX0xGNy5CQ004ODY0MF9BMD0xCisjZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZFX0hDSzBfMTMzMy5CQ004ODY0MF9BMD0xCisjZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZFX0hDSzBfMTYwMC5CQ004ODY0MF9BMD0xCisjZHJhbV90eXBlX0dERFIzX1NBTVNVTkdfSzRKNTIzMjRRRS5CQ004ODY0MF9BMD0xCisjZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMTI4TTE2SEFfMTVFXzJHLkJDTTg4NjQwX0EwPTEKKworIyBRRFIgY29uZmlndXJhdGlvbgorIyBQYXJpdHkuIEFsbG93ZWQgdmFsdWVzOiBQQVJJVFkvRUNDLgorZXh0X3Fkcl9wcm90ZWN0aW9uX3R5cGUuQkNNODg2NDBfQTA9UEFSSVRZCitleHRfcWRyX3NpemVfbWJpdC5CQ004ODY0MF9BMD03MgorI1FEUiB0eXBlOiBRRFIvUURSMlAvUURSMy9OT05FLgorZXh0X3Fkcl90eXBlLkJDTTg4NjQwX0EwPVFEUgorCisjIFFEUiBjYW4gdXNlIHRoZSBjb3JlIGNsb2NrLCBvciB1c2luZyBpdCdzIG93biBwbGwuIEN1cnJlbnQgZXhhbXBsZSBpcyBmb3IgMjUwTUh6IHBsbCAoaWYgdXNlZCkuCisjIFFEUiB1c2luZyBvd24gcGxsIGNvbmZpZ3VyYXRpb24KKyNleHRfcWRyX3VzZV9jb3JlX2Nsb2NrX2ZyZXEuQkNNODg2NDBfQTA9MAorI2V4dF9xZHJfcGxsX20uQkNNODg2NDBfQTA9NAorI2V4dF9xZHJfcGxsX24uQkNNODg2NDBfQTA9NAorI2V4dF9xZHJfcGxsX3AuQkNNODg2NDBfQTA9MAorCisjIFFEUiB1c2luZyBjb3JlIGNsb2NrCitleHRfcWRyX3VzZV9jb3JlX2Nsb2NrX2ZyZXEuQkNNODg2NDBfQTA9MQorCisjQ29uZmlndXJlIE1ESU8uIElmIHBhcmFtZXRlciBpcyBub3QgZGVmaW5lZCwgTURJTyBpcyBkaXNhYmxlZC4KK21kaW9fY2xvY2tfZnJlcV9raHouQkNNODg2NDBfQTA9MTAwMAorCisjIFN0cmVhbWluZyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbgorc3RyZWFtaW5nX2lmX2VuYWJsZV90aW1lb3V0Y250LkJDTTg4NjQwX0EwPTEKK3N0cmVhbWluZ19pZl90aW1lb3V0X3ByZC5CQ004ODY0MF9BMD03MAorc3RyZWFtaW5nX2lmX3F1aWV0X21vZGUuQkNNODg2NDBfQTA9MAorc3RyZWFtaW5nX2lmX2Rpc2NhcmRfYmFkX3Bhcml0eS5CQ004ODY0MF9BMD0wCisKKyMgbWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgV1JFRCB0ZXN0cy4gMCAtIG1lYW5zIGlnbm9yZSBtYXggcGFja2V0IHNpemUuCitkaXNjYXJkX210dV9zaXplLkJDTTg4NjQwX0EwPTAKKworIyBtdWx0aWNhc3QgZWdyZXNzIHZsYW4gbWVtYmVyc2hpcCByYW5nZS4gQnkgZGVmYXVsdDogMC00MDk1LgorZWdyZXNzX211bHRpY2FzdF9kaXJlY3RfYml0bWFwX21pbi5CQ004ODY0MF9BMD0wCitlZ3Jlc3NfbXVsdGljYXN0X2RpcmVjdF9iaXRtYXBfbWF4LkJDTTg4NjQwX0EwPTQwOTUKKworIyBjb25maWd1cmUgZmxvdyBtYXBwaW5nIGJhc2UgdG8gMAorZmxvd19tYXBwaW5nX3F1ZXVlX2Jhc2UuQkNNODg2NDBfQTA9MAorCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzI1LkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMjYuQkNNODg2NDBfQTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8yNy5CQ004ODY0MF9BMD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzI4LkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMjkuQkNNODg2NDBfQTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zMC5CQ004ODY0MF9BMD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzMxLkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzIuQkNNODg2NDBfQTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zMy5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM0LkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzUuQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zNi5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM3LkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzguQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zOS5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQwLkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDEuQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80Mi5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQzLkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDQuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80NS5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQ2LkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDcuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80OC5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQ5LkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNTAuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl81MS5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzUyLkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNTMuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl81NC5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzU1LkJDTTg4NjQwX0EwPTIKKworIyBQb3dlciB1cCBzdGF0ZSAoRE9XTi9VUC9VUF9BTkRfUkVMT0NLKS4gQ2FuIGJlIGNvbmZpZ3VyZWQgcGVyIGxhbmUuCitwYl9zZXJkZXNfbGFuZV9wb3dlcl9zdGF0ZS5CQ004ODY0MF9BMD1VUF9BTkRfUkVMT0NLCisKKyMgU2VEZXMgbWVkaWEgdHlwZTogUHJlLWNvbmZpZ3VyYXRpb24gZm9yIHR4IHBhcmFtcywgYWNjb3JkaW5nIHRvCisjIG1lZGlhIHR5cGUuCisjIEFsbG93ZWQgdmFsdWVzOiBTSE9SVF9CQUNLUExBTkUvTE9OR19CQUNLUExBTkUvQ0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGUuQkNNODg2NDBfQTA9U0hPUlRfQkFDS1BMQU5FCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMjguQkNNODg2NDBfQTA9Q0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMjkuQkNNODg2NDBfQTA9Q0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMzAuQkNNODg2NDBfQTA9Q0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMzEuQkNNODg2NDBfQTA9Q0hJUDJDSElQCisKK3N5c3RlbV9pc19mZTE2MDBfaW5fc3lzdGVtLkJDTTg4NjQwX0EwPTAKKworIyBDb3VudGVyIGVuZ2luZSBjb25maWd1cmF0aW9uCitjb3VudGVyX2VuZ2luZV9zb3VyY2VfMS5CQ004ODY0MF9BMD0wCitjb3VudGVyX2VuZ2luZV9zdGF0aXN0aWNzXzEuQkNNODg2NDBfQTA9NAorY291bnRlcl9lbmdpbmVfc291cmNlXzIuQkNNODg2NDBfQTA9MQorY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18yLkJDTTg4NjQwX0EwPTQKKworIyBTdGF0aXN0aWMgUmVwb3J0aW5nCitzdGF0X2lmX2VuYWJsZT0wCisKKyMgQ2xvY2sgUGhhc2VzOiAwLzkwLzE4MC8yNzAKK3N0YXRfaWZfcGhhc2U9MAorCisjIFJhdGUgaW4gbm0KK3N0YXRfaWZfc3luY19yYXRlPTAKKworIyBUUlVFL0ZBTFNFCitzdGF0X2lmX3Bhcml0eV9lbmFibGU9RkFMU0UKKworIyBCSUxMSU5HL0ZBUDIwVgorc3RhdF9pZl9yZXBvcnRfbW9kZT1CSUxMSU5HCisKKyMgQmlsbGluZyBNb2RlCisjIEVHUl9RX05CL0NVRC9WU0lfVkxBTi9CT1RIX0xJRlMKK3N0YXRfaWZfcmVwb3J0X2JpbGxpbmdfbW9kZT1WU0lfVkxBTgorCisjIEZhcDIwViBNb2RlCisjIFFVRVVFL1BBQ0tFVAorc3RhdF9pZl9yZXBvcnRfZmFwMjB2X21vZGU9UVVFVUUKKworIyBRVUVVRV9OVU0vTUNfSUQgKG9ubHkgdmFsaWQgaW4gRmFwMjBWIFBBQ0tFVCBtb2RlKQorc3RhdF9pZl9yZXBvcnRfZmFwMjB2X2ZhYnJpY19tYz1RVUVVRV9OVU0KK3N0YXRfaWZfcmVwb3J0X2ZhcDIwdl9pbmdfbWM9UVVFVUVfTlVNCisKKyMgVFJVRS9GQUxTRSAob25seSB2YWxpZCBpbiBGYXAyMFYgUEFDS0VUIG1vZGUpCitzdGF0X2lmX3JlcG9ydF9mYXAyMHZfY25tX3JlcG9ydD1GQUxTRQorCisjIFRSVUUvRkFMU0UKK3N0YXRfaWZfcmVwb3J0X2ZhcDIwdl9jb3VudF9zbm9vcD1GQUxTRQorc3RhdF9pZl9yZXBvcnRfb3JpZ2luYWxfcGt0X3NpemU9RkFMU0UKK3N0YXRfaWZfcmVwb3J0X2ZhcDIwdl9zaW5nbGVfY29weV9yZXBvcnRlZD1GQUxTRQorCitzY2hhbl90aW1lb3V0X3VzZWMuQkNNODg2NDBfQTA9MzAwMDAwCisKKworcG9sbGVkX2lycV9tb2RlLkJDTTg4NjQwX0EwPTAKK3BvbGxlZF9pcnFfZGVsYXkuQkNNODg2NDBfQTA9MTAwMAorCisjIFNldCB0aGUgRlRNSCBMb2FkLUJhbGFuY2luZyBLZXkgZXh0ZW5zaW9uIG1vZGUKKyMgT3B0aW9ucyBmb3IgODg2NTA6IEVOQUJMRUQKKyMgT3B0aW9ucyBmb3IgODg2NDAgY29tcGF0aWJsZTogRElTQUJMRUQgLyA4Ql9MQl9LRVlfOEJfU1RBQ0tJTkdfUk9VVEVfSElTVE9SWSAvIDE2Ql9TVEFDS0lOR19ST1VURV9ISVNUT1JZCisjIERlZmF1bHQ6IERJU0FCTEVECitzeXN0ZW1fZnRtaF9sb2FkX2JhbGFuY2luZ19leHRfbW9kZS5CQ004ODY0MD1ESVNBQkxFRAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyNjZmcgZm9yIEJDTTg4NzUwCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmYWJyaWNfZGV2aWNlX21vZGUuQkNNODg3NTA9U0lOR0xFX1NUQUdFX0ZFMgorCitpc19kdWFsX21vZGUuQkNNODg3NTA9MAorc3lzdGVtX2lzX3Zjc18xMjhfaW5fc3lzdGVtLkJDTTg4NzUwPTAKKworc3lzdGVtX2lzX2R1YWxfbW9kZV9pbl9zeXN0ZW0uQkNNODg3NTA9MAorc3lzdGVtX2lzX3NpbmdsZV9tb2RlX2luX3N5c3RlbS5CQ004ODc1MD0xCisKK3N5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0uQkNNODg3NTA9MAorCitzeXN0ZW1fcmVmX2NvcmVfY2xvY2tfa2h6LkJDTTg4NzUwPTYwMDAwMAorCitmYWJyaWNfbWVyZ2VfY2VsbHMuQkNNODg3NTA9MAorZmFicmljX211bHRpY2FzdF9tb2RlLkJDTTg4NzUwPURJUkVDVAorZmFicmljX2xvYWRfYmFsYW5jaW5nX21vZGUuQkNNODg3NTA9Tk9STUFMX0xPQURfQkFMQU5DRQorZmFicmljX3RkbV9mcmFnbWVudC5CQ004ODc1MD0weDE4MAorIyNBbGxvd3Mgc2luZ2xlIHBpcGUgZGV2aWNlIHRvIHNlbmQgVERNIHRyYWZmaWMgb3ZlciB0aGUgZmFicmljIHByaW1hcnkgcGlwZSAtIGF2YWlsYWJsZSBmb3IgRmUxNjAwX0IwIG9ubHkKKyNjaGFuZ2UgIHZjczEyOF91bmljYXN0X3ByaW9yaXR5IHRvIGJlIGxvd2VyIHRoYW4gMiAtIHdoZW4gZW5hYmxpbmcKK2ZhYnJpY190ZG1fb3Zlcl9wcmltYXJ5X3BpcGUuQkNNODg3NTA9MAorZmFicmljX29wdGltaXplX3BhcnRpYWxfbGlua3MuQkNNODg3NTA9MAordmNzMTI4X3VuaWNhc3RfcHJpb3JpdHkuQkNNODg3NTA9MgorCitwb2xsZWRfaXJxX21vZGUuQkNNODg3NTA9MAorcG9sbGVkX2lycV9kZWxheS5CQ004ODc1MD0xMDAwCisKKyNTZWxlY3RzIGlmIHRvIHJ1biBNQklTVCAoTWVtb3J5IEJ1aWx0IEluIFNlbGYgVGVzdCkgb2YgaW50ZXJuYWwgbWVtb3J5ICh0YWJsZXMpIGR1cmluZyBzdGFydHVwLgorI1N1cHBvcnRlZCB2YWx1ZXM6IDA9ZG9uJ3QgcnVuLCAxPXJ1biwgMj1ydW4gd2l0aCBleHRyYSBsb2dzCisjYmlzdF9lbmFibGUuQkNNODg2NTA9MQorYmlzdF9lbmFibGUuQkNNODg3NTA9MQorI0hpZ2ggdm9sdGFnZSBkcml2ZXIgc3RyYXAuIElmIDAsIGNvbm5lY3RlZCB0byAxLjRWIHN1cHBseTsgaWYgMSwgY29ubmVjdGVkIHRvIDFWIG1vZGUuCisjZm9yIHNwZWNpZmljIHF1YWQgdXNlIHNyZF90eF9kcnZfaHZfZGlzYWJsZV9xdWFkX1ggd2hlcmUgWCBpcyAoRlNSRCBudW0gKiA0ICsgaW50ZXJuYWwgcXVhZCkKK3NyZF90eF9kcnZfaHZfZGlzYWJsZS5CQ004ODc1MD0wCitsb2FkX2Zpcm13YXJlLkJDTTg4NzUwPTIKKworIzAtTEZFQyAxLThiXDEwYiAyLUZFQyAzLUJFQworYmFja3BsYW5lX3NlcmRlc19lbmNvZGluZy5CQ004ODc1MD0yCisKKyNlbmFibGVcZGlzYWJsZSBDTDcyCitwb3J0X2luaXRfY2w3Mi5CQ004ODc1MD0wCisjQXZhbGlhYmxlIHNwZWVkcyBmb3IgQkNNODg3NTA6IDU3NTAsIDYyNTAsIDEwMzEyLCAxMTUwMCwgMTI1MDAKK3BvcnRfaW5pdF9zcGVlZC5CQ004ODc1MD0xMDMxMgorI0xDIFBMTCBpblxvdXQgMD0xMjVNSHogMT0xNTYuMjVNSHoKK3NlcmRlc19mYWJyaWNfY2xrX2ZyZXFfaW4uQkNNODg3NTA9MQorc2VyZGVzX2ZhYnJpY19jbGtfZnJlcV9vdXQuQkNNODg3NTA9MQorc2VyZGVzX21peGVkX3JhdGVfZW5hYmxlLkJDTTg4NzUwX0IwPTAKKworIyBWU0MxMjggb3IgVlNDMjU2CitmYWJyaWNfY2VsbF9mb3JtYXQuQkNNODg3NTA9VlNDMjU2CisKKyMgQ29yZSBjbG9jayBzcGVlZCAoTUh6KQorY29yZV9jbG9ja19zcGVlZF9raHouQkNNODg3NTA9NTMzMzMzCisKKyMjIENNSUMgaW50ZXJydXB0czoKKyMgRW5hYmxlOiBVc2UgaW50ZXJydXB0cyBjb21wbGV0aW9uIGluc3RlYWQgb2YgcG9sbGluZyBjb21wbGV0aW9uIGZvciB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMuCisjICAgICAgICAgT3B0aW9uczogMSAtIEVuYWJsZSwgMCAtIERpc2FibGUuIERlZmF1bHQ6IDAuCisjIFRpbWVvdXQ6IGRlbGF5IGluIE1pY3Jvc2Vjb25kIGJldHdlZW4gdGhlIHBvbGxpbmcsCisjIFNDSEFOOgorc2NoYW5faW50cl9lbmFibGUuQkNNODg3NTA9MAorc2NoYW5fdGltZW91dF91c2VjLkJDTTg4NzUwPTMwMDAwMAorIyBURE1BCit0ZG1hX2ludHJfZW5hYmxlLkJDTTg4NzUwPTAKK3RkbWFfdGltZW91dF91c2VjLkJDTTg4NzUwPTgwMDAwMDAwCisjIFRTTEFNCit0c2xhbV9pbnRyX2VuYWJsZS5CQ004ODc1MD0wCit0c2xhbV90aW1lb3V0X3VzZWMuQkNNODg3NTA9ODAwMDAwMDAKKyMgTUlJTQorbWlpbV9pbnRyX2VuYWJsZS5CQ004ODc1MD0wCittaWltX3RpbWVvdXRfdXNlYy5CQ004ODc1MD0zMDAwMDAKKworCisjI2luaXRpYWxpemF0aW9uIGZvciB3YXJtYm9vdAorc3RhYmxlX2xvY2F0aW9uLkJDTTg4NzUwPTMKK3N0YWJsZV9zaXplLkJDTTg4NzUwPTIwMDAwMAorc2NhY2hlX2ZpbGVuYW1lLkJDTTg4NzUwPWZlMTYwMF93YXJtYm9vdC5tZW0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbmZpZyB2YXJpYWJsZSBiZWxvdyBhcmUgb25seSBhY2Nlc3NlZCBmcm9tIGR1bmUuc29jLCBhbmQgYXJlIHVzZWQgdG8KKyMgY29uZmlndXJlIEJTUCAvIGV4YW1wbGUgYXBwbGljYXRpb24gLyBncm91cCBvZiBmb3JtYWwgY29uZmlnIHZhcmlhYmxlcy4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFN1cHBvcnQgKGFuZCBjb25maWd1cmUgb24gaW5pdCkgcGFja2V0IHByb2Nlc3NpbmcgZmVhdHVyZXMuCisjIElmIG5vdCBkZWZpbmVkIC0gb25seSB0cmFmZmljIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIGFyZSBlbmFibGVkLgorcGFja2V0X3Byb2Nlc3Npbmc9MQorCisjIyBQQ1AgKFBldHJhIENvLVByb2Nlc3NvcikgZmVhdHVyZXMKKyNwY3BfZWxrLkJDTTg4NjQwX0EwPTEKKyNwY3Bfb2FtLkJDTTg4NjQwX0EwPTEKKyNwY3BfZG1hLkJDTTg4NjQwX0EwPTEKKworIyMgU2V0L092ZXJyaWRlIFRETSByZWxhdGVkIGNvbmZpZyB2YXJpYWJsZXMKKyN0ZG0uQkNNODg2NDBfQTA9MQorCisjIElmIHNldCwgYWx3YXlzIGNvbmZpZ3VyZXMgc3ludGhlc2l6ZXJzLCBldmVuIGlmIHRoZSBjb25maWd1cmVkIHJhdGUgaXMKKyMgZXF1YWwgdG8KKyMgdGhlaXIgbm9taW5hbCByYXRlLiBDYW4gYmUgZGlzYWJsZWQgdG8gc3BlZWR1cCBicmluZ3VwIHRpbWUKKyMgKGtlZXAgaW4gbWluZCB0aGF0IGlmIGRpc2FibGVkLCBjaGFuZ2luZyBhIHN5bnQgdG8gYSBub24tbm9taW5hbCBmcmVxIGFuZAorIyB0aGFuIGJhY2sgdG8gbm9taW5hbCB3aWxsIG5vdCB3b3JrCisjc3ludF9vdmVyLkJDTTg4NjQwX0EwPTEKKworIyBMb2NhbCB2YXJpYWJsZXMgZm9yIGJvYXJkIHN5bnRoZXNpemVycyBmcmVxLiBGYWJyaWMsIGNvbWJvIGFuZCBuaWYgYWxzbyBjb25maWd1cmUKKyMgdGhlICpfcmVmX2Nsb2NrIHNvYyBwcm9wZXJ0aWVzIGZvciB0aGVzZSBmcmVxdWVuY2llcy4gY29yZSwgZGRyIGFuZCBwaHkgb25seQorIyBjb25maWd1cmVzIHRoZSBzeW50aGVzaXplcgorc3ludF9jb3JlLkJDTTg4NjQwX0EwPTEwMDAwMDAwMAorc3ludF9kZHIuQkNNODg2NDBfQTA9MTI1MDAwMDAwCitzeW50X3BoeS5CQ004ODY0MF9BMD0xNTYyNTAwMDAKKworIyMgU2NhY2hlIGluaXRpYWxpemF0aW9uIGZvciB3YXJtYm9vdCBwZXJzaXN0ZW50IHN0b3JhZ2UuCisjIyBWYWxpZCB2YWx1ZXM6IDI6IFN0b3JlIGluIGRyYW0uIDM6IFN0b3JlIGluIGEgZmlsZS4KK3N0YWJsZV9sb2NhdGlvbj0zCitzdGFibGVfZmlsZW5hbWU9Li93YXJtYm9vdF9kYXRhCitzdGFibGVfZmxhZ3M9MAorc3RhYmxlX3NpemU9MTAwMDAwMDAwMAorCisjIEJyaWRnZSBkZWZhdWx0IGxvZ2ljYWwgaW50ZXJmYWNlcyBhbGxvY2F0aW9uIElEUworbG9naWNhbF9wb3J0X2wyX2JyaWRnZS5CQ004ODY0MD0xCitsb2dpY2FsX3BvcnRfZHJvcC5CQ004ODY0MD0tMQorCisjbG9naWNhbF9wb3J0X21pbV9pbi5CQ004ODY0MD0yCisjbG9naWNhbF9wb3J0X21pbV9vdXQuQkNNODg2NDA9MworCisjIyBJUFY2IHR1bm5lbAorYmNtODg2eHhfaXB2Nl90dW5uZWxfZW5hYmxlPTEKKworIyMgSW5saWYgUHJvZmlsZSBNYW5hZ2VtZW50IE1vZGUgLSBRb1MgTDMgTDIgbWFya2luZyBtb2RlCisjCisjIEJDTTg4NjYwIE9OTFkKKyMKKyMgUW9TIEwzIEwyIG1hcmtpbmcgYWxsb3dzIGNoYW5naW5nIHRoZSBEU0NQIGFuZC9vciBFWFAgdmFsdWVzCisjIG9mIElQIGFuZC9vciBNUExTIHBhY2tldHMgYWNjb3JkaW5nIHRvIHRoZSBpbmNvbWluZyBwb3J0CisjIChvciBpbmxpZiksIGFuZCB0aGUgVHJhZmZpYyBDbGFzcy9Ecm9wIFByZWNlZGVuY2UuCisjCisjIFRoZSBpbmxpZiBwcm9maWxlIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgRFNDUC9FWFAgbWFya2luZy4KKyMgVGhpcyBTT0MgcHJvcGVydHkgY29udHJvbHMgd2hpY2ggbW9kZSBpcyB1c2VkIGZvciB0aGUgaW5saWYgcHJvZmlsZToKKyMgMTogQmFzaWMgbW9kZSAoMSBiaXQgb2YgdGhlIGlubGlmIHByb2ZpbGUgaXMgcmVzZXJ2ZWQgYW5kIGlzIHVzZWQgZm9yIHRoZSBEU0NQL0VYUCBtYXJraW5nKS4KKyMgMDogQWR2YW5jZWQgbW9kZSAodGhlIHVzZXIgY29udHJvbHMgd2hpY2ggaW5saWYgcHJvZmlsZSB2YWx1ZXMgcGVyZm9ybSBEU0NQL0VYUCBtYXJraW5nIGRpcmVjdGx5KS4KKyNiY204ODZ4eF9xb3NfbDNfbDJfbWFya2luZz0xCisKKyMjIFVuaWNhc3QgUlBGIG1vZGUgcGVyIFJJRgorIworIyBUaGlzIFNPQyBwcm9wZXJ0eSBhbGxvd3MgdGhlIHVzZXIgdG8gc2V0IHRoZSB1bmljYXN0IFJQRiBtb2RlIC0gbG9vc2UsIHN0cmljdCBvciBkaXNhYmxlZCAtIHBlciBSSUYuCisjIElmIGRpc2FibGVkLCB0aGUgdW5pY2FzdCBSUEYgbW9kZSBvZiBhIFJJRiBpcyBzZXQgZ2xvYmFsbHkuCisjIE9wdGlvbnM6IDAgLyAxCisKKyMgYmNtODg2eHhfbDNfaW5ncmVzc191cnBmX2VuYWJsZT0xCisKKyMjIEJPUyBoYW5kbGluZyBtb2RlCisjIEJDTTg4NjZYIE9OTFkKKyMKKyMgVGhlcmUgYXJlIHR3byB3YXlzIHRvIGhhbmRsZSBCT1MsIGNvbnRyb2xsZWQgYnkgYmNtODg2eHhfbXBsc190ZXJtaW5hdGlvbl9tb2RlOgorIyAwIC0gVXNlIEJPUyBhcyBrZXkgaW4gbG9va3VwLgorIyAxIC0gRG9uJ3QgdXNlIGl0IChleGNlcHQgZm9yIHJlc2VydmVkIGxhYmVscykuCisjCisjYmNtODg2eHhfbXBsc190ZXJtaW5hdGlvbl9rZXlfbW9kZT0wCisKKyMgQ29sb3IgcmVzb2x1dGlvbiBtb2RlIGFsbG93cyB0aGUgdXNlciB0byBoYXZlIG1vcmUgZGV0YWlsZWQgbWV0ZXJpbmcgY29sb3IgaW5mb3JtYXRpb24uCisjIEJDTTg4NjYwIE9OTFkKKyMKKyMgT3B0aW9uczogMC8xCisjIDA6IEEgcmVkIHJlc3VsdCBmcm9tIGJvdGggRXRoZXJuZXQgcG9saWNlciBhbmQgcG9saWNlciBpbXBsaWVzIERQPTMuCisjIDE6IEEgcmVkIHJlc3VsdCBmcm9tIHRoZSBwb2xpY2VyIGltcGxpZXMgdGhhdCBEUD0yLCB3aGlsZSBhIHJlZCByZXN1bHQgZnJvbSByYXRlIChFdGhlcm5ldCBwb2xpY2VyKSBpbXBsaWVzIERQPTMuCisjcG9saWNlcl9jb2xvcl9yZXNvbHV0aW9uX21vZGU9MQorCisjIyBJbmxpZiBQcm9maWxlIE1hbmFnZW1lbnQgTW9kZSAtIERpc2FibGUgU2FtZSBJbnRlcmZhY2UgRmlsdGVyCisjIEJDTTg4NjZYIE9OTFkKKyMKKyMgQ29udHJvbHMgd2hpY2ggbW9kZSBpcyB1c2VkIGZvciB0aGUgaW5saWYgcHJvZmlsZSBtYW5hZ2VtZW50LgorIyAxOiBCYXNpYyBtb2RlICgxIGJpdCBvZiB0aGUgaW5saWYgcHJvZmlsZSBpcyByZXNlcnZlZCBhbmQgaXMgdXNlZCBmb3IgdGhlIHNhbWUtaW50ZXJmYWNlIGZpbHRlcikuCisjIDA6IEFkdmFuY2VkIG1vZGUgKHRoZSB1c2VyIGNvbnRyb2xzIHdoaWNoIGlubGlmIHByb2ZpbGUgdmFsdWVzIGhhdmUgdGhlIHNhbWUtaW50ZXJmYWNlIGZpbHRlciBkaXNhYmxlZCBmb3IgdGhlbSkuCisjYmNtODg2eHhfbG9naWNhbF9pbnRlcmZhY2VfYnJpZGdlX2ZpbHRlcl9lbmFibGU9MQorCisjIyBEZWZhdWx0IEJsb2NrIEZvcndhcmRpbmcgU3RyZW5ndGgKKyMKKyMgQ29uZmlndXJlIHRoZSBkZWZhdWx0IGZvcndhcmRpbmcgc3RyZW5ndGggb2YgYmxvY2tzLgorIworIyBTT0MgUHJvcGVydGllczoKKyNibG9ja190cmFwX3N0cmVuZ3RoX3Z0dCAtIFZUVCBibG9jayBmb3J3YXJkaW5nIHN0cmVuZ3RoCisjYmxvY2tfdHJhcF9zdHJlbmd0aF9mbHAgLSBGTFAgYmxvY2sgZm9yd2FyZGluZyBzdHJlbmd0aAorI2Jsb2NrX3RyYXBfc3RyZW5ndGhfaGFzaCAtIFNMQiBibG9jayBmb3J3YXJkaW5nIHN0cmVuZ3RoIChCQ004ODY2WCBPTkxZKQorI2Jsb2NrX3RyYXBfc3RyZW5ndGhfcG1mXzAgLSBQTUYgMXN0IGxvb2t1cCBmb3J3YXJkaW5nIHN0cmVuZ3RoCisjYmxvY2tfdHJhcF9zdHJlbmd0aF9wbWZfMSAtIFBNRiAybmQgbG9va3VwIGZvcndhcmRpbmcgc3RyZW5ndGgKKyMKKyMgT3B0aW9uczogMC03CisKKyMjIFN0YXRlZnVsIExvYWQgQmFsYW5jaW5nCisjIEJDTTg4NjZYIE9OTFkKKyMKKyMgU3RhdGVmdWwgTG9hZCBCYWxhbmNpbmcgKFNMQikgYWxsb3dzIHRoZSBsb2FkIGJhbGFuY2luZyBvZiBFQ01QIGFuZCBMQUcKKyMgZ3JvdXBzIHRvIGJlY29tZSBzdGF0ZWZ1bC4KKyMgSW4gc3RhbmRhcmQgbG9hZCBiYWxhbmNpbmcsIHJlbW92aW5nIGEgbWVtYmVyIGZyb20gdGhlIEVDTVAvTEFHCisjIGdyb3VwIG1heSBhZmZlY3QgdGhlIHNlbGVjdGVkIG1lbWJlciwgc2luY2UgdGhlIGZvcm11bGEKKyMgZGVwZW5kcyBvbiBncm91cCBzaXplLgorIyBJbiBzdGF0ZWZ1bCBsb2FkIGJhbGFuY2luZyB0aGUgbWVtYmVyIGlzIHNlbGVjdGVkIG9uY2UgYW5kIHNhdmVkLgorIyBMYXRlciwgdGhlIG1lbWJlciBpcyBhbHdheXMgcmV0cmlldmVkLCBhbmQgZG9lcyBub3QgZGVwZW5kIG9uCisjIHRoZSBzaXplIG9mIHRoZSBMQUcvRUNNUCBncm91cC4KKyMKKyMgcmVzaWxpZW50X2hhc2hfZW5hYmxlIC0gRW5hYmxlL2Rpc2FibGUgU0xCLiBWYWx1ZXM6CisjIDEgLSBFbmFibGUgU0xCLgorIyAwIC0gRGlzYWJsZSBTTEIuCisjcmVzaWxpZW50X2hhc2hfZW5hYmxlPTEKKworCisjTWFrZSBBcmFkIFNPQyBwcm9wZXJ0aWVzIHdvcmsgZm9yIEFyYWQrLCBieSBtYXBwaW5nIHRoZSBCQ004ODY2MCBzdWZmaXggdG8gQkNNODg2NTAKK3NvY19mYW1pbHkuQkNNODg2NjA9QkNNODg2NTAKKyNNYWtlIEFyYWQgU09DIHByb3BlcnRpZXMgd29yayBmb3IgQXJkb24sIGJ5IG1hcHBpbmcgdGhlIEJDTTg4MjAyIHN1ZmZpeCB0byBCQ004ODY1MAorc29jX2ZhbWlseS5CQ004ODIwMj1CQ004ODY1MAorCisjIFVzZSBkaWZmZXJlbnQgbXltYWMgYWRkcmVzc2VzIGZvciBpcHY0IGFuZCBpcHY2IHdoZW4gdXNpbmcgdnJycCBmb3IgbXltYWMgdGVybWluYXRpb24uCisjbDNfdnJycF9pcHY2X2Rpc3RpbmN0PTEKKworIyBFbmFibGUgbXVsdGlwbGUgbXltYWMgdGVybWluYXRpb24gbW9kZS4gSW4gb3JkZXIgdG8gZW5hYmxlIGl0LCBhbHNvIHNldCBsM192cnJwX2lwdjZfZGlzdGluY3Q9MCBhbmQgCisjIGwzX3ZycnBfbWF4X3ZpZD0wIHNpbmNlIHZycnAgYW5kICBtdWx0aXBsZSBteW1hYyBtb2RlIGNhbid0IGNvIGV4aXN0LgorI2wzX211bHRpcGxlX215bWFjX3Rlcm1pbmF0aW9uX2VuYWJsZT0xCisKKyMgRGlzdGluZ3Vpc2ggYmV0d2VlbiBpcHY0IGFuZCBhbGwgb3RoZXIgbDMgcHJvdG9jb2xzIHdoZW4gbXVsdGlwbGUgbXltYWMgdGVybWluYXRpbmcgCisjbDNfbXVsdGlwbGVfbXltYWNfdGVybWluYXRpb25fbW9kZT0xCisKKyMgVXN1YWxseSB0aGUgZmluYWwgRFAgZ2l2ZW4gYnkgdGhlIG1ldGVyIChvciB0aGUgSW4tRFApIGlzIHVuY2hhbmdlZCwgYW5kIGNhbiBiZSBmcm9tIDAtMy4KKyMgV2hlbiB0aGlzIFNPQyBwcm9wZXJ0eSBpcyBzZXQgdG8gMSwgd2hlbiB0aGUgZmluYWwgSU5HUkVTUyBEUCBpcyAyLCBpdCBpcyBtYXBwZWQgdG8gMSBpbnN0ZWFkLCAKKyMgYW5kIHRodXMgb25seSB0aGUgdmFsdWVzIDAtMSBhbmQgMyBjYW4gYmUgb3V0cHV0LgorIyBUaGlzIGhhcyBubyBlZmZlY3Qgd2hlbiBwb2xpY2VyX2NvbG9yX3Jlc29sdXRpb25fbW9kZT0xLgorI2N1c3RvbV9mZWF0dXJlX2Fsd2F5c19tYXBfcmVzdWx0X2RwXzJfdG9fMT0xCisKKyMKKyMgRW5hYmxlIEwzIFNvdXJjZSBCaW5kcyBmb3IgRFBvRSBTQVYKKyMKK2wzX3NvdXJjZV9iaW5kX21vZGU9SVAKK2wzX3NvdXJjZV9iaW5kX3N1Ym5ldF9tb2RlPUlQCitpcHY0X251bV92cmZzID0gNDA5NgorCisjCisjIEVuYWJsZSBBUlAgY2hlY2tpbmcgZm9yIEwzIFNvdXJjZSBCaW5kcworIworIyBUaGlzIGZlYXR1cmUgaXMgbm90IGN1cnJlbnRseSB1c2VkLgorIworIyBWYWxpZCB2YWx1ZXMgZm9yIGN1c3RvbV9mZWF0dXJlX2wzX3NvdXJjZV9iaW5kX2FycF9yZWxheToKKyMgICAgMCAtIGRpc2FibGVkCisjICAgIDEgLSBkb3duc3RyZWFtIEFSUCBjaGVja2luZworIyAgICAyIC0gdXBzdHJlYW0gQVJQIGNoZWNraW5nCisjICAgIDMgLSBib3RoIGRvd25zdHJlYW0gYW5kIHVwc3RyZWFtIEFSUCBjaGVja2luZworIworI2N1c3RvbV9mZWF0dXJlX2wzX3NvdXJjZV9iaW5kX2FycF9yZWxheT0yCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2JhbC9yZWFkbWUudHh0IGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9iYWwvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWVhMzMwCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9iYWwvcmVhZG1lLnR4dApAQCAtMCwwICsxLDEyIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBiY20gZmlsZXMgdGhhdCBhcmUgbmVlZGVkIGluIHRoZSBCQUwgZmlsZSBzeXN0ZW0gdG8gYnJpbmcgdXAgCit0aGUgYmFsX2NvcmUgb3IgYmFsX29wX2FnZW50LgorRm9yIGJhbF9vcF9hZ2VudCwKK1VzZXIgc2hvdWxkIGFsc28gY29weSB0aGUgYmFsX2F1dG9zdGFydC5pbmkgZnJvbSBQNCBCQUwgYnJhbmNoIH5jdXIvc2NyaXB0cy8gdG8gdGhlIHNhbWUgQkFMIGZpbGUgc3lzdGVtLgorCitUaGUgY3VycmVudGx5IHN1cHBvcnRlZCBiY21fc2RrIHZlcnNpb24gaXMgNi41LjMKKy4KK3wtLSBiYWxfY29uZmlnLmluaQorfC0tIGNvbmZpZy5iY20KK2AtLSBycGMuc29jLnRlbXBsYXRlIAorICAKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9iYWwvcnBjLnNvYy50ZW1wbGF0ZSBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvYmFsL3JwYy5zb2MudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjExOTczMAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvYmFsL3JwYy5zb2MudGVtcGxhdGUKQEAgLTAsMCArMSwyNSBAQAorY3B1ZGIgbmV3ZGIKKworY3B1ZGIgYWRkIGtleT0weDEgbG9jYWw9dAorCitjcHVkYiBhZGQga2V5PTB4MgorCitjdHMgYXRwIHRyYW5zIHNvY2sgc2VydmVyIHN0YXJ0CisKK2N0cyBhdHAgY29zPTAgdmxhbj0xCisKK2N0ZSByZWcgbW9kZT1hdHAKKworIyBESVAgdG9rZW4gaXMgdG8gYmUgcmVwbGFjZWQgYnkgYW4gSVAgYWRkcmVzcyBzdXBwbGllZCBieSBhcHBsaWNhdGlvbidzIGNvbW1hbmQgbGluZSBvcHRpb24uIFBsZWFzZSBkbyBub3QgcmVtb3ZlIG9yIGNoYW5nZSB0aGlzIGxpbmUgLSBpdCBpcyBtYW5kYXRvcnkuCitjdHMgYXRwIHRyYW5zIHNvY2sgaW5zdCBkaz0weDIgZGlwPSRESVAkCisKK3JwYyBub25leHRob3AKKworcnBjIHN0YXJ0CisKK2Rpc3BhdGNoIGF0dGFjaCAyIGNsaWVudCAwIDB4MgorCitzbGVlcCAxCisKK2N0ZSBlY2hvIHN0cmluZz0iIT4gdHIgMTQxIiBtb2RlPWF0cCBkaz0weDIKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9rdDIvYmFsLnNvYyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMva3QyL2JhbC5zb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDIwOWQxMAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMva3QyL2JhbC5zb2MKQEAgLTAsMCArMSwyMCBAQAorcG9ydCB4ZTAseGUxLHhlMix4ZTMseGU0LHhlNSBsYW5lcyA0CisKK2NwdWRiIG5ld2RiCisKK2NwdWRiIGFkZCBrZXk9MHgxCisKK2NwdWRiIGFkZCBrZXk9MHgyIGxvY2FsPXQKKworY3RzIGF0cCB0cmFucyBzb2NrIHNlcnZlciBzdGFydAorCitjdHMgYXRwIGNvcz0wIHZsYW49MQorCitjdGUgcmVnIG1vZGU9YXRwCisKK2N0cyBhdHAgdHJhbnMgc29jayBpbnN0IGRrPTB4MSBkaXA9MTAuMjUuOC4yNQorCitycGMgbm9uZXh0aG9wCisKK3JwYyBzdGFydAorCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2t0Mi9iY20udXNlciBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMva3QyL2JjbS51c2VyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBlM2Q0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2t0Mi9iY20udXNlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2t0Mi9saW51eC1rZXJuZWwtYmRlLmtvIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9rdDIvbGludXgta2VybmVsLWJkZS5rbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MDMxZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9rdDIvbGludXgta2VybmVsLWJkZS5rbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2t0Mi9saW51eC11c2VyLWJkZS5rbyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMva3QyL2xpbnV4LXVzZXItYmRlLmtvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmNTRlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2t0Mi9saW51eC11c2VyLWJkZS5rbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2t0Mi9yYy5zb2MgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2t0Mi9yYy5zb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2JmOWNlNAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMva3QyL3JjLnNvYwpAQCAtMCwwICsxLDE2ODYgQEAKKyMgJElkOiByYy5zb2MgMS4xOTIgQnJvYWRjb20gU0RLICQKKyMgJENvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24uCisjIFRoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24KKyMgYW5kL29yIGl0cyBsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZAorIyBvciBkaXN0cmlidXRlZCBwdXJzdWFudCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwKKyMgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZCBiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20KKyMgKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4gYW4gQXV0aG9yaXplZAorIyBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKKyMgdG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kCisjIEJyb2FkY29tIGV4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUKKyMgYW5kIGFsbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRQorIyBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUgTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUKKyMgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkgQlJPQURDT00gQU5EIERJU0NPTlRJTlVFCisjIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLiAgCisjICAKKyMgRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyMgIAorIyAxLiAgICAgVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyMgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisjIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsCisjIGFuZCB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZgorIyBCcm9hZGNvbSBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisjICAKKyMgMi4gICAgIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMKKyMgUFJPVklERUQgIkFTIElTIiBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywKKyMgUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksCisjIE9SIE9USEVSV0lTRSwgV0lUSCBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWQorIyBESVNDTEFJTVMgQU5ZIEFORCBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksCisjIE5PTklORlJJTkdFTUVOVCwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywKKyMgQUNDVVJBQ1kgT1IgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IKKyMgQ09SUkVTUE9OREVOQ0UgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcKKyMgT1VUIE9GIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisjIAorIyAzLiAgICAgVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMCisjIEJST0FEQ09NIE9SIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwKKyMgSU5DSURFTlRBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIKKyMgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkKKyMgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCisjIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRgorIyBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRSBTT0ZUV0FSRSBJVFNFTEYgT1IgVVNEIDEuMDAsCisjIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUyBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcKKyMgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZIExJTUlURUQgUkVNRURZLiQKKyMKKyMgSW5pdGlhbGl6YXRpb24gUkMgKHJ1biBjb21tYW5kcykgZmlsZQorIworIyAgICAgICBUaGVzZSBhcmUgZGVmYXVsdCBjb21tYW5kcyB0aGF0IGFyZSByZWFkIGFuZCBleGVjdXRlZCBieSBkZWZhdWx0CisjICAgICAgIHdoZW4gQkNNIGJvb3RzIHVwLiAgVHlwaWNhbGx5IHRoaXMgZmlsZSBpcyBjYWxsZWQgcmMuc29jIGFuZCByZXNpZGVzCisjICAgICAgIGluIHRoZSBmbGFzaCBmaWxlc3lzdGVtLCBOVlJBTSwgb3IgZGlzay4KKyMKKyMgQm9hcmQgQ29uZmlndXJhdGlvbiBTZXR0aW5nCisjCisjICAgICAgIFRoaXMgZmlsZSB1c2VzIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB0byBrbm93IG9uIHdoaWNoIGJvYXJkCisjICAgICAgIGl0IGlzIHJ1bm5pbmcuICBDdXJyZW50bHkgb25lIG9mIGZvbGxvd2luZyBzZXR0aW5ncyBtdXN0IGJlIG1hZGU6CisjCisjICAgICAgIEJDTTk1NjcwSzggICAgICAgICAgY29uZmlnIGFkZCBoZXJjOD0xCisjICAgICAgIEJDTTk1NjkwSzI0ICAgICAgICAgY29uZmlnIGFkZCBkcmFjb19iMmI9MQorIyAgICAgICBCQ005NTY5MEsyNFMgICAgICAgIGNvbmZpZyBhZGQgZHJhY29fc3RrPTEKKyMgICAgICAgQkNNOTU2OTBSMjQgICAgICAgICBjb25maWcgYWRkIGdhbGFoYWQ9MQorIyAgICAgICBCQ005NTY5MFIyNFMgICAgICAgIGNvbmZpZyBhZGQgbWVybGluPTEKKyMgICAgICAgQkNNOTU2OTBSNDhTICAgICAgICBjb25maWcgYWRkIGxhbmNlbG90PTEKKyMgICAgICAgQkNNOTU2OTFLMTIgICAgICAgICBjb25maWcgYWRkIGRyYWNvX2sxMj0xCisjICAgICAgIFdoaXRlIEtuaWdodCAgICAgICAgY29uZmlnIGFkZCB3aGl0ZV9rbmlnaHQ9MSAobm90IHNoaXBwaW5nKQorIyAgICAgICBCbGFjayBLbmlnaHQgICAgICAgIGNvbmZpZyBhZGQgYmxhY2tfa25pZ2h0PTEgKG5vdCBzaGlwcGluZykKKyMgICAgICAgQkNNOTU2NzNLMlMgICAgICAgICBjb25maWcgYWRkIHR3b2x5bng9MQorIyAgICAgICBCQ005NTY3M1I4ICAgICAgICAgIGNvbmZpZyBhZGQgaGVyY3VseW54PTEKKyMgICAgICAgQkNNOTU2NzNSMjRTICAgICAgICBjb25maWcgYWRkIGx5bnhhbGl0dGxlPTEKKyMgICAgICAgQkNNOTU2NzNSNDhTICAgICAgICBjb25maWcgYWRkIGx5bnhhbG90PTEKKyMgICAgICAgQkNNOTU2OTVQMjRTWF8xMCAgICBjb25maWcgYWRkIGd1ZW5ldmVyZT0xCisjICAgICAgIEJDTTk1NjUwSzI0ICAgICAgICAgY29uZmlnIGFkZCBtYWdudW09MSAoYXV0b21hdGljIGZvciA1NjUwTCkKKyMgICAgICAgQkNNOTU2NzUgICAgICAgICAgICBjb25maWcgYWRkIGhlcmM4XzE1PTEKKyMgICAgICAgQkNNOTU2NTBSMjQgICAgICAgICBjb25maWcgYWRkIHR1YzI0X3JlZj0xCisjICAgICAgIEJDTTk1Njk1UDQ4TE0gICAgICAgY29uZmlnIGFkZCBsbTQ4cD0xCisjICAgICAgIEJDTTk1Njk1UDQ4TE0tMTAgICAgY29uZmlnIGFkZCBsbTQ4cF9CPTEKKyMgICAgICAgQkNNOTU2NTA0UDQ4TE0tMTAgICBjb25maWcgYWRkIGxtNDhwX0M9MQorIyAgICAgICBCQ005NTY1MDRQNDhMTS0yMCAgIGNvbmZpZyBhZGQgbG00OHBfQz0xCisjICAgICAgIEJDTTk1NjUwNFA0OExNLTUwICAgY29uZmlnIGFkZCBsbTQ4cF9EPTEKKyMgICAgICAgQkNNOTU2NTA0UDQ4UE9FUkVGICBjb25maWcgYWRkIGZicG9lPTEKKyMgICAgICAgQkNNOTU2NTA0UDI0UkVGIFAwICBjb25maWcgYWRkIGZiMjQ9MQorIyAgICAgICBCQ005NTY1MDRQMjQgICAgUDAgIGNvbmZpZyBhZGQgZmIyND0xCisjICAgICAgIEJDTTk1NjEwMlA0OCAgICAgICAgY29uZmlnIGFkZCBmZWxpeDQ4PTEKKyMgICAgICAgQkNNOTUzMzAwUDI0UkVGICAgICBjb25maWcgYWRkIG1pcmFnZTI0PTEKKyMgICAgICAgQkNNOTU2ODAwSzIwQyAgICAgICBjb25maWcgYWRkIGJyYWRsZXlfMWc9MQorIyAgICAgICBCQ005NTY3MDBLMTYgICAgICAgIGNvbmZpZyBhZGQgaHVtdj0xCisjICAgICAgIEJDTTk1NjgwMEsyMCAgICAgICAgY29uZmlnIGFkZCBicmFkbGV5PTEKKyMgICAgICAgQkNNOTU2NTgwSzE2ICAgICAgICBjb25maWcgYWRkIGdvbGR3aW5nPTEKKyMgICAgICAgQkNNOTU2MzE0UDI0UkVGICAgICBjb25maWcgYWRkIGJjbTU2MzE0cDI0cmVmPTEKKyMgICAgICAgQkNNOTU2MDI0UDQ4UkVGICAgICBjb25maWcgYWRkIEJDTTk1NjAyNFA0OFJFRj0xCisjICAgICAgIEJDTTk1NjIyNFA0OFJFRiAgICAgY29uZmlnIGFkZCBCQ005NTYyMjRQNDhSRUY9MQorIyAgICAgICBCQ005NTYyMjRSNTBUICAgICAgIGNvbmZpZyBhZGQgQkNNOTU2MjI0UjUwVD0xCisjICAgICAgIEJDTTk1NjAyNFI1MFQgICAgICAgY29uZmlnIGFkZCBCQ005NTYwMjRSNTBUPTEKKyMgICAgICAgQkNNNTY4MjBLMjRYRyAgICAgICBjb25maWcgYWRkIEJDTTU2ODIwSzI0WEc9MQorIyAgICAgICBCQ005NTMzMTRSMjRHUyAgICAgIGNvbmZpZyBhZGQgQkNNOTUzMzE0UjI0R1M9MQorIyAgICAgICBCQ005NTMzMTRLMjQgICAgICAgIGNvbmZpZyBhZGQgQkNNOTUzMzE0SzI0PTEKKyMgICAgICAgQkNNOTU2ODIwUjI0WEcgICAgICBjb25maWcgYWRkIEJDTTk1NjgyMFIyNFhHPTEKKworaWYgJD9CQ001NjE0Nl9BMCBcCisgICAgJ2xvY2FsIEJDTTU2MTQ2IDEnCisKK2lmICQ/QkNNNTYxNDdfQTAgXAorICAgICdsb2NhbCBCQ001NjE0NyAxJworCisKK2lmICQ/MSAiZWNobyByYzogYXJndW1lbnRzIG5vdCBzdXBwb3J0ZWQ7IGV4aXQiCitpZiAhJD91bml0ICJlY2hvIHJjOiBubyBjdXJyZW50IHVuaXQ7IGV4aXQiCisKK2VjaG8gInJjOiB1bml0ICR1bml0IGRldmljZSAkZGV2bmFtZSIKK2xvY2FsIHF1aWV0IG5vCitsb2NhbCBlY2hvIGVjaG8KK2xvY2FsIHJjZG9uZSBcJHJjJHVuaXQKK2lmICEiZXhwciAkcmNkb25lICsgMCIgImxvY2FsIGVjaG8gbm9lY2hvOyBsb2NhbCBxdWlldCB5ZXMiCisKKyMgU2V0IGNvbnZlbmllbmNlIGxvY2FsIHZhcmlhYmxlcworCisjIHNpbXVsYXRpb24gcmVsYXRlZAorI2lmICQ/cGxpc2ltIFwKKyMgICAgICAgImxvY2FsIG5vX2JjbSAxIgoraWYgJD9xdWlja3R1cm4gfHwgJD9wbGlzaW0gXAorCSJsb2NhbCBzaW11bGF0b3IgMSIKKworIyBib2FyZCByZWxhdGVkCitpZiAkP2dhbGFoYWQgXAorCSJsb2NhbCBkcmFjb19iMmIgMSIKK2lmICQ/YmxhY2tfa25pZ2h0IHx8ICQ/d2hpdGVfa25pZ2h0IHx8ICQ/bWVybGluIFwKKwkibG9jYWwgZHJhY29faGVyYzQgMSIKKworIyBjaGlwIHJlbGF0ZWQKK2lmICQ/UEVUUkFCX0EwIFwKKyAgICAncmNsb2FkIGR1bmUuc29jIDsgZXhpdCcKKworCitpZiAkP0JDTTg4NzUwX0EwIHx8ICQ/QkNNODg3NTBfQjAgfHwgJD9CQ004ODc1NV9CMCB8fCAkP0JDTTg4NzU0X0EwXAorICAgICdyY2xvYWQgZGZlLnNvYyA7IGV4aXQnCisKK2lmICQ/QVJBRF9BMCB8fCAkP0FSQURfQjAgfHwgJD9BUkFEX0IxIHx8ICQ/QkNNODg2NTBfQTAgfHwgJD9CQ004ODY1MF9CMCB8fCAkP0JDTTg4NjUwX0IxIHx8ICQ/QkNNODgzNTBfQjEgfHwgJD9CQ004ODM1MV9CMSB8fCBcCisgICAkP0JDTTg4NDUwX0IxIHx8ICQ/QkNNODg0NTFfQjEgfHwgJD9CQ004ODU1MF9CMSB8fCAkP0JDTTg4NTUxX0IxIHx8ICQ/QkNNODg1NTJfQjEgfHwgJD9CQ004ODY1MV9CMSB8fCAkP0JDTTg4NjU0X0IxIHx8ICQ/QVJBRFBMVVNfQTAgfHwgJD9CQ004ODM2MF9BMCB8fCAkP0JDTTg4MzYxX0EwIHx8IFwKKyAgICQ/QkNNODg0NjBfQTAgfHwgJD9CQ004ODQ2MV9BMCB8fCAkP0JDTTg4NTYwX0EwIHx8ICQ/QkNNODg1NjFfQTAgfHwgJD9CQ004ODU2Ml9BMCB8fCAkP0JDTTg4NjYxX0EwIHx8ICQ/QkNNODg2NjRfQTAgIFwKKyAgICAncmNsb2FkIGFyYWQuc29jIDsgZXhpdCcKKworaWYgJD9CQ004ODg1MF9QMyBcCisgICAgJ2V4aXQnCisKKworCisKKworCitpZiAkP0FDUCBcCisgICAgJ2V4aXQnCisgICAgICAgIAoraWYgISJleHByICRwY2lkZXYgKyAwID09IDB4NTY1MCIgXAorCSJsb2NhbCBtYWdudW0gMSIKK2lmICQ/ZHJhYyB8fCAkP2RyYWMxNSBcCisJImxvY2FsIGRyYWNfYW55IDEiCitpZiAkP2x5bnggfHwgJD9seW54MTUgXAorCSJsb2NhbCBseW54X2FueSAxIgoraWYgJD90dWNhbmEgfHwgJD9tYWdudW0gXAorCSJsb2NhbCB0dWNhbmFfYW55IDEiCitpZiAkP2hlcmMgfHwgJD9oZXJjMTUgXAorCSJsb2NhbCBoZXJjX2FueSAxIgoraWYgJD9maXJlYm9sdCB8fCAkP2ZpcmVib2x0MiB8fCAkP2hlbGl4IHx8IFwKKyAgICQ/ZmVsaXggfHwgJD9oZWxpeDE1IHx8ICQ/ZmVsaXgxNSB8fCAkP3JhcHRvciB8fCAkP3JhdmVuIHx8ICQ/aGF3a2V5ZVwKKwkibG9jYWwgZmlyZWJvbHRfYW55IDEiCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNTAxIiBcCisJImxvY2FsIGZpcmVib2x0XzEweDQgMSIKK2lmICQ/ZWFzeXJpZGVyIFwKKwkibG9jYWwgZWFzeXJpZGVyX2FueSAxIgoraWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYwMiIgXAorCSJsb2NhbCBlYXN5cmlkZXJfMXgxIDEiCitpZiAkP2JyYWRsZXkgfHwgJD9odW12IHx8ICQ/Z29sZHdpbmcgXAorCSJsb2NhbCBicmFkbGV5X2FueSAxIgoraWYgJD9kcmFjX2FueSB8fCAkP2x5bnhfYW55IHx8ICQ/dHVjYW5hX2FueSBcCisJImxvY2FsIHhnczEyX3N3aXRjaCAxIgoraWYgJD9maXJlYm9sdF9hbnkgfHwgJD9lYXN5cmlkZXJfYW55IHx8ICQ/YnJhZGxleV9hbnkgXAorCSJsb2NhbCB4Z3MzX3N3aXRjaCAxIgoraWYgJD94Z3MxMl9zd2l0Y2ggfHwgJD94Z3MzX3N3aXRjaCBcCisJImxvY2FsIHhnc19zd2l0Y2ggMSIKK2lmICQ/aGVyY19hbnkgXAorCSJsb2NhbCB4Z3NfZmFicmljIDEiCitpZiAkP3hnc19mYWJyaWMgfHwgJD94Z3Nfc3dpdGNoIFwKKwkibG9jYWwgeGdzIDEiCitpZiAhJD94Z3MgXAorCSJsb2NhbCBzdHJhdGEgMSIKK2lmICQ/c3RyYXRhICYmICEkP2dzbCBcCisJImxvY2FsIFBCTVBfQUxMIDB4MGJmZmZmZmYiCitpZiAkP3N0cmF0YSAmJiAkP2dzbCBcCisJImxvY2FsIFBCTVBfQUxMIDB4MDgwMDAwZmYiCitpZiAkP0JDTTU2MjE0X0EwIHx8ICQ/QkNNNTYwMTRfQTAgfHwgJD9CQ001NjIxNV9BMCB8fCBcCisgICAkP0JDTTU2MjE0X0ExIHx8ICQ/QkNNNTYwMTRfQTEgfHwgJD9CQ001NjIxNV9BMSAmJiBcCisgICAhJD9CQ005NTYwMjRQNDhSRUYgXAorCSJsb2NhbCByYXAyNF9yZWYgMSIKKworaWYgJD9CQ001NjU1X0EwIHx8ICQ/QkNNNTY1NV9CMCBcCisgICAgICAgICJsb2NhbCB0dWNhbmFfbm9oZyAxIgorCitpZiAkP0JDTTk1NjAyNFA0OFJFRiB8fCAkP0JDTTk1NjIyNFA0OFJFRiB8fCAkP0JDTTk1NjAyNFI1MFQgfHwgXAorICAgJD9CQ005NTYyMjRSNTBUIFwKKyAgICAgICAgImxvY2FsIHJhdmVuX2ViXzQ4cCAxIgorCitpZiAkP0JDTTk1MzMxNFIyNEdTIFwKKyAgICAgICAgImxvY2FsIGhhd2tleWVfcDI0IDEiCisKK2lmICQ/QkNNOTUzMzE0SzI0IFwKKyAgICAgICAgImxvY2FsIGhhd2tleWVfazI0IDEiCisKK2lmICQ/ZmlyZWJvbHRfYW55ICYmICQ/bG00OHAgfHwgJD9sbTQ4cF9EIFwKKyAgICAgICAgImNvbmZpZyBhZGQgbG1mYjQ4PTEiCisKKyMgU2V0IHNvZnR3YXJlJ3Mgd2FpdCBmb3IgUy1DaGFubmVsIHJlc3BvbnNlIHRvIDMgc2Vjb25kcyBmb3IgUXVpY2tUdXJuCisjIChSZWNvbW1lbmQgYXQgbGVhc3QgMTAgc2Vjb25kcyBpZiB0aGUgQVJMIGlzIDEwMCUgYnVzeSB3aXRoIGluc2VydHMuKQoraWYgJD9xdWlja3R1cm4JInN0aW1lb3V0IDMwMDAwMDAiCitpZiAkP3BsaXNpbQkic3RpbWVvdXQgNjAwMDAwMDAiCisKKyMgRGlyZWN0IHBoeSBsZWQgcHJvZ3JhbW1pbmc6IDU0NjQgYWN0aXZpdHkgbGVkIGJlY29tZXMgbGluay9hY3Rpdml0eQoraWYgJD9kcmFjX2FueSAmJiAkP2xhbmNlbG90IHx8ICQ/bHlueGFsb3QgfHwgJD9ndWVuZXZlcmUgXAorCSJjb25maWcgYWRkIHBoeV9sZWRfY3RybD0weDE4IgorCisjIFNodXRkb3duIHRocmVhZHMgaWYgc3lzdGVtIGlzIGFscmVhZHkgcnVubmluZworaWYgJD90cml1bXBoMyBcCisJImlib2RTeW5jIG9mZiIKK2NvdW50ZXIgb2ZmCitsaW5rc2NhbiBvZmYKK2lmICQ/ZmVhdHVyZV9hcmxfaGFzaGVkICYmICEkP3NpbXVsYXRvciBcCisgICAgICAgICJsMm1vZGUgb2ZmIgoraWYgJD9mZWF0dXJlX2NlcyAmJiAkP0JDTTU2NDQwX0EwIFwKKyAgICAgICAgImNlcyBvZmYiCisKKyMgVGVzdCBvbi1jaGlwIG1lbW9yeSBiZWZvcmUgaW5pdGlhbGl6aW5nCisjaWYgISQ/c2ltdWxhdG9yICJpbml0IHNvYzsgYmlzdCBsMyBhcmwgY2JwIgoraW5pdCBzb2MKKworIyBJbml0aWFsaXplIG1pc2NlbGxhbmVvdXMgY2hpcCByZWdpc3RlcnMKK2luaXQgbWlzYworCisjIEluaXRpYWxpemUgZXh0ZXJuYWwgVENBTSBpZiBuZWNlc3NhcnkKKyMgTk9URSA6IHRjYW0gaXMgaW5pdGlhbGl6ZWQgZHVyaW5nICJpbml0IG1pc2MiIHVubGVzcyAKKyMgICAgICAgIHRjYW1fcmVzZXRfdG9nZ2xlID0gMSBpcyBjb25maWd1cmVkCitpZiAiZXhwciAkcmNkb25lICsgMCIgJiYgISJleHByICR0Y2FtX3Jlc2V0X3RvZ2dsZSArIDAiIFwKKyAgICAgICAgImRpc3BhdGNoIGF0dGFjaCAwIGVzdyAwIgoraWYgISJleHByICR0Y2FtX3Jlc2V0X3RvZ2dsZSArIDAiICJtdXhzZWwgMDsgbXV4c2VsIDB4ODAiCitpZiAhImV4cHIgJHRjYW1fcmVzZXRfdG9nZ2xlICsgMCIgImluaXQgdGNhbTsgJGVjaG8gcmM6IFRDQU0gaW5pdGlhbGl6ZWQiCisKKyMgSW5pdGlhbGl6ZSB0aGUgU3RyYXRhU3dpdGNoIE1NVSByZWdpc3RlcnMKK2luaXQgbW11CisKKyMgVW5jb21tZW50IHRvIHR1cm4gb2ZmIFNpbmdsZS1CaXQgRXJyb3IgcmVwb3J0aW5nIG9uIDU2NzAKKyNpZiAkP2hlcmMgIm0gbW11X2ludGNudGwgcHBfc2JlX2VuPTAiCisKKyMgSW5pdGlhbGl6ZSBDZWxsIEZyZWUgQWRkcmVzcyBQb29sCisjIE5PVEU6IHRoaXMgc2hvdWxkIE5PVCBiZSBkb25lIHVubGVzcyBjaGlwIGlzIGtub3duIHRvIGhhdmUgYmFkIENGQVAKKyMgbWVtb3J5IGVudHJpZXMgdGhhdCBuZWVkIHRvIGJlIG1hcHBlZCBvdXQuCitpZiAkP2NmYXBfdGVzdHMgIiRlY2hvIHJjOiBJbml0aWFsaXppbmcgQ0ZBUDsgY2ZhcGluaXQiCisKKyRlY2hvIHJjOiBNTVUgaW5pdGlhbGl6ZWQKKworIworIyBMb2FkIHVLZXJuZWwKKyMKKworaWYgJD9mZWF0dXJlX2NtaWNtICYmICEkP3JjcHVfb25seSAmJiAhJGlob3N0X21vZGVcCisgICAgIm1jc2xvYWQgMCAke2RyaXZlcm5hbWV9XzAuc3JlYyBJbml0TUNTPXRydWU7IFwKKyAgICAgbWNzbG9hZCAxICR7ZHJpdmVybmFtZX1fMS5zcmVjOyIKKworIworIyBJbml0IENMSSBhbmQgQkNNIEFQSQorIworIyBUaGlzIG11c3QgYmUgZG9uZSBhZnRlciB0aGUgcmF3IHJlZ2lzdGVyIHdyaXRlcyB0byBhdm9pZCBoYXZpbmcgc3RhdGUKKyMgY2xvYmJlcmVkLiAgTk9URTogVGFibGVzIGFyZSBjbGVhcmVkIGJ5ICJpbml0IGJjbSIgYmVsb3cuICBJZgorIyB0YWJsZSBtb2RpZmljYXRpb25zIGFyZSByZXF1aXJlZCwgcHV0IHRoZW0gYWZ0ZXIgImluaXQgYmNtIi4gIFNvbWUKKyMgcmVnaXN0ZXJzIG1pZ2h0IGFsc28gYmUgYWZmZWN0ZWQuCisjCisKK2lmICEkP25vX2JjbSBcCisJImluaXQgYmNtOyBcCisJICRlY2hvIHJjOiBCQ00gZHJpdmVyIGluaXRpYWxpemVkIgorCitpZiAkP25vX2JjbSBcCisJIiRlY2hvIHJjOiAqKiogTk9UIGluaXRpYWxpemluZyBCQ00gZHJpdmVyICoqKiIKKworaWYgJD9ub19iY20gJiYgJD9zdHJhdGEgXAorICAgICd3cml0ZSB2dGFibGUgMCAxIFZMQU5fVEFHPTAsUE9SVF9CSVRNQVA9MCxVVF9QT1JUX0JJVE1BUD0wOyBcCisgICAgIGluc2VydCB2dGFibGUgVkxBTl9UQUc9MSxQT1JUX0JJVE1BUD0kUEJNUF9BTEwsVVRfUE9SVF9CSVRNQVA9JFBCTVBfQUxMOyBcCisgICAgIGxvY2FsIHB2IFwKKyAgICAgICAgIFZMQU5fVEFHPTEsU1BfU1Q9MyxQT1JUX0JJVE1BUD0kUEJNUF9BTEwsVVRfUE9SVF9CSVRNQVA9JFBCTVBfQUxMOyBcCisJIHdyaXRlIHB0YWJsZSAwIDMyIFBUWVBFPTA7IFwKKwkgaWYgISQ/Z3NsICJ3cml0ZSBwdGFibGUgMCAyNCAkcHYsUFRZUEU9MSI7IFwKKwkgaWYgISQ/Z3NsICJ3cml0ZSBwdGFibGUgMjQgMiAkcHYsUFRZUEU9MiI7IFwKKwkgaWYgJD9nc2wgICJ3cml0ZSBwdGFibGUgMCA4ICRwdixQVFlQRT0yIjsgXAorCSB3cml0ZSBwdGFibGUgMjcgMSAkcHYsUFRZUEU9MzsgXAorICAgICBsb2NhbCBwdicKKworIyBUdXJuIG9uIG1pcnJvcmluZyBvZiBoYXJkd2FyZSBBUkwgb3BlcmF0aW9ucyBpbnRvIHNvZnR3YXJlIEFSTCB0YWJsZS4KK2lmICQ/ZmVhdHVyZV9hcmxfc29ydGVkIFwKKwkiYXJsbW9kZSBpbnRyX2RtYTsgXAorCSAkZWNobyByYzogQVJMIERNQSBzaGFkb3dpbmcgZW5hYmxlZCIKKworaWYgJD9mZWF0dXJlX2FybF9oYXNoZWQgJiYgISQ/c2ltdWxhdG9yICYmICEkP3JjcHVfb25seSBcCisJImwybW9kZSBpbnRlcnZhbD0zMDAwMDAwOyBcCisJICRlY2hvIHJjOiBMMiBUYWJsZSBzaGFkb3dpbmcgZW5hYmxlZCIKKworIyBJZiBydW5uaW5nIEJDTSBsaWJyYXJ5LCBzdGFydCBsaW5rc2NhbiB0YXNrIGFuZCBzZXQgcG9ydCBtb2RlcworCitpZiAhJD9ub19iY20gJiYgISQ/cmNwdV9vbmx5IFwKKwkibGlua3NjYW4gMjUwMDAwOyBcCisJIHBvcnQgZmUsZ2UgbGlua3NjYW49b24gYXV0b25lZz1vbiBcCisJCXNwZWVkPTAgZnVsbGR1cGxleD10cnVlIHR4cGF1c2U9dHJ1ZSByeHBhdXNlPXRydWU7IFwKKwkgcG9ydCBzdCBsaW5rc2Nhbj1vbiB0eHBhdXNlPWZhbHNlIHJ4cGF1c2U9ZmFsc2U7IFwKKyAgICAgICAgIHBvcnQgeGUsY2UgbGlua3NjYW49b24gYXV0b25lZz1vZmYgXAorICAgICAgICAgICAgICAgIHNwZWVkPTAgZnVsbGR1cGxleD10cnVlIHR4cGF1c2U9dHJ1ZSByeHBhdXNlPXRydWU7IFwKKwkgJGVjaG8gcmM6IFBvcnQgbW9kZXMgaW5pdGlhbGl6ZWQiCisKK2lmICEkP25vX2JjbSAmJiAkP3JjcHVfb25seSBcCisJImxpbmtzY2FuIDI1MDAwMDsgXAorCSBwb3J0IGUgbGlua3NjYW49b247IFwKKwkgcG9ydCBzdCBsaW5rc2Nhbj1vbjsgXAorICAgICBwb3J0IHhlIGxpbmtzY2FuPW9uOyBcCisJICRlY2hvIHJjOiBQb3J0IG1vZGVzIGluaXRpYWxpemVkIgorCitpZiAhJD9ub19iY20gJiYgJD9zaGFkb3cgXAorICAgICAicG9ydCBpbCBsaW5rc2Nhbj1vbjsgXAorCSAgJGVjaG8gcmM6IEludGVybGFrZW4gUG9ydCBtb2RlIGluaXRpYWxpemVkIgorCisjIE5vIHNwYW5uaW5nIHRyZWUgaXMgcnVubmluZywgc28gcHV0IHBvcnRzIGFsbCBpbiB0aGUgZm9yd2FyZGluZyBzdGF0ZQorIyBzdHAgc3VwcG9ydCBub3QgYXZhaWxhYmxlIGZvciBzaGFkb3cgZGV2aWNlLgorCitpZiAhJD9ub19iY20gJiYgISQ/c2hhZG93IFwKKwkic3RnIHN0cCAxIGFsbCBmb3J3YXJkIgorCisjIFN0YXJ0IGNvdW50ZXIgdGFzayB1bmxlc3MgYWxyZWFkeSBzdGFydGVkIGJ5ICJpbml0IGJjbSIgYWJvdmUuCitpZiAkP3BsaXNpbSAibG9jYWwgZG1hIGZhbHNlIgoraWYgISQ/cGxpc2ltICJsb2NhbCBkbWEgdHJ1ZSIKK2lmICQ/ZGV2aWNlX2ViX3ZsaSAibG9jYWwgZG1hIGZhbHNlIgoraWYgJD9ub19iY20gJiYgISQ/cmNwdV9vbmx5XAorCSJjb3VudGVyIEludGVydmFsPTEwMDAgUGJtPWFsbCBEbWE9JGRtYTsgXAorCSAkZWNobyByYzogQ291bnRlciBjb2xsZWN0aW9uIGVuYWJsZWQiCitpZiAkP3JjcHVfb25seSBcCisJImNvdW50ZXIgSW50ZXJ2YWw9MjAwMDAwMCBQYm09YWxsIERtYT1mYWxzZTsgXAorCSAkZWNobyByYzogQ291bnRlciBjb2xsZWN0aW9uIGVuYWJsZWQiCisKKyMgUmVzeW5jaHJvbml6ZSB0aGUgc2F2ZWQgdmFsdWVzIGtlcHQgYnkgdGhlICdzaG93IGNvdW50ZXInIGNvbW1hbmQuCitpZiAhJD9zaW11bGF0b3IgXAorICAgICJjb3VudGVyIHN5bmMiCisKKyMgQnkgZGVmYXVsdCwgZHVtcCBkYXRhIG9mIHBhY2tldHMgdGhhdCBnbyB0byBDUFUuCitpZiAhJD90ZXN0aW5pdCBcCisJInB3IHJlcG9ydCArcmF3IgorCisjIERlZmF1bHQgTEVEIHByb2Nlc3NvciBwcm9ncmFtIGZvciB2YXJpb3VzIFNES3MgYW5kIHJlZmVyZW5jZSBkZXNpZ25zLgorIyBTb3VyY2UgY29kZSBjYW4gYmUgZm91bmQgaW4gJFNESy9sZWQvZXhhbXBsZXMuCisKK2lmICEkP3A0OCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIDdGIDY3IDJGIDY3IDZCIDA2IDdGIDgwIEQyIDFBIDc0IDAxIDEyIFwKKyA3RSA4NSAwNSBEMiAwRiA3MSAxOSA1MiAwMCAxMiA3RCA4NSAwNSBEMiAxRiA3MSBcCisgMjMgNTIgMDAgMTIgN0MgODUgMDUgRDIgMDUgNzEgMkQgNTIgMDAgM0EgNjggMzIgXAorIDAwIDk3IDc1IDNCIDEyIEEwIEZFIDdGIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDQ3IFwKKyAxMiBCQSBGRSA3RiAwMiAwQSA1MCAxMiBCQSBGRSA3RiA5NSA3NSA1OSA4NSAxMiBcCisgQTAgRkUgN0YgOTUgNzUgQTggODUgNzcgOUEgMTIgQTAgRkUgN0YgOTUgNzUgNjMgXAorIDg1IDc3IEExIDE2IDdDIERBIDAyIDcxIEExIDc3IEE4IDMyIDA1IDk3IDcxIDc2IFwKKyAwNiA3RCBEMiAwMSA3MSA5QSAwNiA3RiA2NyA5MyA3NSA5QSAzMiAwMiA5NyA3MSBcCisgOUEgMzIgMDMgOTcgNzEgQTggMzIgMDQgOTcgNzUgQTEgMDYgN0UgRDIgMDcgNzEgXAorIEExIDc3IEE4IDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IFwKKyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciCQkjIHNkazU2MDUuaGV4CisKK2lmICQ/cDQ4ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgN0YgNjcgNDMgNjcgM0MgNjcgMzUgNjcgMkYgMDYgN0YgODAgRDIgXAorIDE4IDc0IDAxIDI4IDYwIDdGIDY3IDlCIDY3IDg5IDY3IEJGIDY3IDgzIDY3IDNDIFwKKyA2NyA3MyA2NyA2OCA2NyA1RCAwNiA3RiA4MCBEMiAxQSA3NCAxMyAzQSA3MCA2NyBcCisgQUQgNzEgQzMgNzcgQkYgMzIgMDMgOTcgNzEgQzMgNzcgQkYgMzIgMDUgOTcgNzEgXAorIEMzIDc3IEJGIDEyIEJBIEZFIDdGIDMyIDAxIDk3IDc1IDRGIDAyIDA2IDUwIDMyIFwKKyAwMCA5NyA3NSA1NyAwMiAwNiA1MCA5NSA3NSBDMyA4NSA3NyBCRiA2NyBBRCA3NSBcCisgQkYgMzIgMDQgOTcgNzEgQzMgNzcgQkYgNjcgQUQgNzUgQkYgMzIgMDMgOTcgNzEgXAorIEMzIDc3IEJGIDY3IEFEIDc1IEJGIDMyIDAzIDk3IDcxIEJGIDMyIDA0IDk3IDcxIFwKKyBCRiA3NyBDMyA2NyBCNiA3MSBDMyA3NyBCRiAxMiBBMCBGRSA3RiAzMiAwMCA5NyBcCisgNzUgOTUgMDIgMDYgNTAgOTUgNzUgQzMgODUgNzcgQkYgMTIgQkEgRkUgN0YgMzIgXAorIDAxIDk3IDc1IEE3IDAyIDA2IDUwIDk1IDc1IEMzIDg1IDc3IEJGIDA2IDdGIDEyIFwKKyA4MCBGOCAxNSAxQSAwMCA1NyAwNiA3RiAxMiA4MCBGOCAxNSAxQSAwNyA1NyAzMiBcCisgMEYgODcgNTcgMzIgMEUgODcgNTcnIgkJCQkJIyBwNDguaGV4CisKK2lmICQ/aGVyYyAmJiAhJD9ibGFja19rbmlnaHQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMSA2NyAzNiAyOSAzMiAwOCBENyA4NyAzMiAwNyBENyA4NyAzMiAwMSBENyBcCisgODcgMzIgMDAgRDcgODcgODAgRDIgMDkgNzQgMDIgODYgN0YgMDYgN0YgQzIgMDcgXAorIDc0IDI0IDg2IDdFIDE2IDdFIENBIDA3IEUwIDE3IDBEIDEyIDA4IDk4IDI3IEQ3IFwKKyA4NyA5MSA3NCAyRCAzQSAyOCAxMCBEQSAwNyA3NSAzRSBGQSAwMiA1NyBFQSAwNiBcCisgNTcnIgkJCQkJCQkjIHNkazU2NzAuaGV4CisKK2lmICQ/aGVyYyAmJiAkP2JsYWNrX2tuaWdodCAibG9jYWwgbGVkY29kZSAnXAorIDJBIDAzIDMyIDA4IEQ3IDg3IDMyIDA3IEQ3IDg3IDMyIDAxIEQ3IDg3IDMyIDAwIFwKKyBENyA4NyAyQSAwNiAzMiAwOCBENyA4NyAzMiAwNyBENyA4NyAzMiAwMSBENyA4NyBcCisgMzIgMDAgRDcgODcgM0EgMDgnIgkJCQkJIyBrbmlnZ2V0LmhleAorCitpZiAkP2RyYWNfYW55ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgNEUgNjcgOEEgMDYgQzMgODAgRDIgMEMgNzQgMDEgMjggXAorIDYwIEMzIDMyIDAwIEQ3IDg3IDMyIDAxIEQ3IDg3IDMyIDA3IEQ3IDg3IDMyIDA4IFwKKyBENyA4NyAzMiAwRiA4NyAzMiAwRiA4NyAzMiAwRiA4NyAzMiAwRiA4NyAxMiBDMiBcCisgODUgMDUgRDIgMEYgNzEgMzggNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgNzEgNDIgXAorIDUyIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDRDIDUyIDAwIDNBIDM4IDMyIDAwIFwKKyA5NyA3NSA1QSAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA2NiAxMiBcCisgQUQgRkUgQzMgMDIgMEEgNTAgMTIgQUQgRkUgQzMgOTUgNzUgNzggODUgMTIgQTAgXAorIEZFIEMzIDk1IDc1IEMwIDg1IDc3IEI5IDEyIEEwIEZFIEMzIDk1IDc1IDgyIDg1IFwKKyA3NyBDNyAxNiBDMCBEQSAwMiA3MSBDNyA3NyBDMCAzMiAwNSA5NyA3MSA5QSAzMiBcCisgMDIgOTcgNzEgQjkgMDYgQzEgRDIgMDEgNzEgQjkgMDYgQzMgNjcgQjIgNzUgQjkgXAorIDMyIDAzIDk3IDcxIEMwIDMyIDA0IDk3IDc1IEM3IDA2IEMyIEQyIDA3IDcxIEM3IFwKKyA3NyBDMCAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyBcCisgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIgkJIyBzZGs1NjkwLmhleAorCitpZiAkP2RyYWNvX2sxMiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDBCIEEyIDAxIDI4IEEyIDAxIDYwIEMzIDY3IDMyIDY3IDZFIDA2IEMzIDkwIFwKKyA3NSAwMiAxMiBDMiA4NSAwNSBEMiAwRiA3MSAxQyA1MiAwMCAxMiBDMSA4NSAwNSBcCisgRDIgMUYgNzEgMjYgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgMzAgNTIgMDAgXAorIDNBIDMwIDMyIDAwIDk3IDc1IDNFIDEyIEEwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIFwKKyA5NyA3NSA0QSAxMiBBQyBGRSBDMyAwMiAwQSA1MCAxMiBBQyBGRSBDMyA5NSA3NSBcCisgNUMgODUgMTIgQTAgRkUgQzMgOTUgNzUgQTYgODUgNzcgOUYgMTIgQTAgRkUgQzMgXAorIDk1IDc1IDY2IDg1IDc3IEFEIDE2IEMwIERBIDAyIDcxIEFEIDc3IEE2IDMyIDA1IFwKKyA5NyA3MSA3RSAzMiAwMiA5NyA3MSA5RiAwNiBDMSBEMiAwMSA3MSA5RiAwNiBDMyBcCisgNjcgOTYgNzUgOUYgMzIgMDMgOTcgNzEgQTYgMzIgMDQgOTcgNzUgQUQgMDYgQzIgXAorIEQyIDA3IDcxIEFEIDc3IEE2IDEyIDgwIEEyIDAxIEY4IDE1IDFBIDAwIDU3IDMyIFwKKyAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyBcCisgMzIgMEUgODcgNTcnIgkJCQkJCSMgazEyLTU2OTAuaGV4CisKK2lmICQ/aGVyYyAmJiAkP3doaXRlX2tuaWdodCAibG9jYWwgbGVkY29kZSAnXAorIDJBIDAzIDY3IDBBIDJBIDA2IDY3IDBBIDNBIDA4IDMyIDA4IEQ3IDg3IDMyIDA3IFwKKyBENyA4NyAzMiAwMSBENyA4NyAzMiAwMCBENyA4NyA1NyciCQkJIyB3azU2NzAuaGV4CisKK2lmICQ/aGVyYyAmJiAkP21lcmxpbiAibG9jYWwgbGVkY29kZSAnXAorIDJBIDAzIDY3IDBBIDJBIDA2IDY3IDBBIDNBIDA4IDMyIDA4IEQ3IDg3IDMyIDAwIFwKKyBENyA4NyAzMiAwMSBENyA4NyAzMiAwNyBENyA4NyA1NyciCQkJIyBtZXJsaW41NjcwLmhleAorCitpZiAkP2hlcmMgJiYgJD9sYW5jZWxvdCAibG9jYWwgbGVkY29kZSAnXAorIDJBIDA1IDY3IDEyIDJBIDA2IDY3IDEyIDJBIDAzIDY3IDEyIDJBIDA0IDY3IDEyIFwKKyAzQSAxMCAzMiAwOCBENyA4NyAzMiAwMCBENyA4NyAzMiAwMSBENyA4NyAzMiAwNyBcCisgRDcgODcgNTcnIgkJCQkJCSMgbGFuY2Vsb3QuaGV4CisKK2lmICQ/eGdzX2ZhYnJpYyAmJiAkP2d1ZW5ldmVyZSAibG9jYWwgbGVkY29kZSAnXAorIDJBIDA0IDY3IDBBIDJBIDA1IDY3IDBBIDNBIDA0IDMyIDA3IEQ3IDg3IDMyIDAwIFwKKyAzMiAwMSBCNyBENyA4NyA1NyciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBndWVuZXZlcmU1NjcwLmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/d2hpdGVfa25pZ2h0ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgMmYgNjcgNkIgMDYgQzMgODAgRDIgMEMgNzQgMDEgMTIgXAorIEMyIDg1IDA1IEQyIDBGIDcxIDE5IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIFwKKyAyMyA1MiAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAyRCA1MiAwMCAzQSAzMCAzMiBcCisgMDAgOTcgNzUgM0IgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDcgXAorIDEyIEFDIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDU5IDg1IDEyIFwKKyBBMCBGRSBDMyA5NSA3NSBBOCA4NSA3NyA5QSAxMiBBMCBGRSBDMyA5NSA3NSA2MyBcCisgODUgNzcgQTEgMTYgQzAgREEgMDIgNzEgQTEgNzcgQTggMzIgMDUgOTcgNzEgN0IgXAorIDMyIDAyIDk3IDcxIDlBIDA2IEMxIEQyIDAxIDcxIDlBIDA2IEMzIDY3IDkzIDc1IFwKKyA5QSAzMiAwMyA5NyA3MSBBOCAzMiAwNCA5NyA3NSBBMSAwNiBDMiBEMiAwNyA3MSBcCisgQTEgNzcgQTggMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgXAorIDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIJCSMgd2s1NjkwLmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/bWVybGluICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgMkYgNjcgNkIgMDYgQzMgODAgRDIgMEMgNzQgMDEgMTIgXAorIEMyIDg1IDA1IEQyIDBGIDcxIDE5IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIFwKKyAyMyA1MiAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAyRCA1MiAwMCAzQSAzMCAzMiBcCisgMDAgOTcgNzUgM0IgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDcgXAorIDEyIEFDIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDU5IDg1IDEyIFwKKyBBMCBGRSBDMyA5NSA3NSBBOCA4NSA3NyA5QSAxMiBBMCBGRSBDMyA5NSA3NSA2MyBcCisgODUgNzcgQTEgMTYgQzAgREEgMDIgNzEgQTEgNzcgQTggMzIgMDUgOTcgNzEgN0IgXAorIDMyIDAyIDk3IDcxIDlBIDA2IEMxIEQyIDAxIDcxIDlBIDA2IEMzIDY3IDkzIDc1IFwKKyA5QSAzMiAwMyA5NyA3MSBBOCAzMiAwNCA5NyA3NSBBMSAwNiBDMiBEMiAwNyA3MSBcCisgQTEgNzcgQTggMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgXAorIDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3JyIJCSMgbWVybGluNTY5MC5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP2dhbGFoYWQgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBDMyA2NyAyRiA2NyA2QiAwNiBDMyA4MCBEMiAwQyA3NCAwMSAxMiBcCisgQzIgODUgMDUgRDIgMEYgNzEgMTkgNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgNzEgXAorIDIzIDUyIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDJEIDUyIDAwIDNBIDMwIDMyIFwKKyAwMCA5NyA3NSAzQiAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NyBcCisgMTIgQUMgRkUgQzMgMDIgMEEgNTAgMTIgQUMgRkUgQzMgOTUgNzUgNTkgODUgMTIgXAorIEEwIEZFIEMzIDk1IDc1IEE4IDg1IDc3IDlBIDEyIEEwIEZFIEMzIDk1IDc1IDYzIFwKKyA4NSA3NyBBMSAxNiBDMCBEQSAwMiA3MSBBMSA3NyBBOCAzMiAwNSA5NyA3MSA3QiBcCisgMzIgMDIgOTcgNzEgOUEgMDYgQzEgRDIgMDEgNzEgOUEgMDYgQzMgNjcgOTMgNzUgXAorIDlBIDMyIDAzIDk3IDcxIEE4IDMyIDA0IDk3IDc1IEExIDA2IEMyIEQyIDA3IDcxIFwKKyBBMSA3NyBBOCAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyBcCisgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcnIgkJIyBnYWxhaGFkLmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/bG0gImxvY2FsIGxlZGNvZGUgJ1wKK0UwIDI4IDYwIEMzIDY3IDJEIDA2IEMzIDgwIEQyIDBDIDc0IDAxIDEyIEMyIDg1IFwKKzA1IEQyIDBGIDcxIDE3IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIDIxIDUyIFwKKzAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDJCIDUyIDAwIDNBIDE4IDMyIDAwIDk3IFwKKzc1IDM5IDEyIEEwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDQ1IDEyIEFDIFwKK0ZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDVGIDg1IDEyIEEwIEZFIFwKK0MzIDk1IDcxIDVDIDE2IEMwIERBIDAyIDcxIEE2IDc3IEI0IDg1IDc3IDc3IDEyIFwKK0EwIEZFIEMzIDk1IDc1IDZGIDg1IDE2IEMwIERBIDAyIDcxIEE2IDc3IEFEIDE2IFwKK0MwIERBIDAyIDcxIEFEIDc3IEI0IDMyIDA1IDk3IDcxIDgyIDA2IEMxIEQyIDAxIFwKKzcxIEE2IDA2IEMzIDY3IDlGIDc1IEE2IDMyIDAyIDk3IDcxIEE2IDMyIDAzIDk3IFwKKzcxIEI0IDMyIDA0IDk3IDc1IEFEIDA2IEMyIEQyIDA3IDcxIEFEIDc3IEI0IDEyIFwKKzgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IFwKKzMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgICAgICAjIGxtNTY5MC5oZXgKKworaWYgJD90d29seW54ICJsb2NhbCBsZWRjb2RlICdcCisgMkEgMDEgNjcgMEEgMkEgMDAgNjcgMEEgM0EgMDggMzIgMDggRDcgODcgMzIgMDAgXAorIEQ3IDg3IDMyIDAxIEQ3IDg3IDMyIDA3IEQ3IDg3IDU3JyIgICAgICAgICAgICAgICAgICMgdHdvbHlueC5oZXgKKworaWYgJD9seW54X2FueSAmJiAkP2hlcmN1bHlueCB8fCAkP2x5bnhhbG90IHx8ICQ/bG0gfHwgJD9ndWVuZXZlcmUgXAorCSJsb2NhbCBsZWRjb2RlICdcCisxMiBDMCA4NSAwNSBEMiAwMyA3MSAwQSA1MiAwMCAyQSAwMCA2NyAxMCAzQSAwNCBcCiszMiAwOCBENyA4NyAwNiBDMCBEMiAwMSA3MSAyMiAzMiAwRiA4NyAzMiAwRiA4NyBcCis3NyAyQSAzMiAwMCBENyA4NyAzMiAwMSBENyA4NyAzMiAwNyBENyA4NyA1NyciICAgICAgIyBoZXJjdWx5bnguaGV4CisKK2lmICQ/dHVjYW5hICYmICEkP21hZ251bSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDY3IDIzIEQyIDE4IDc0IDAxIDAyIDIwIDY3IDIzIEQyIDM4IDc0IDA5IDAyIFwKKyAxOCA2NyAyMyBEMiAxQyA3NCAxMSBFOSAwMiA4MCA0NSA4MCA4MSBEQSAwRCA3NCBcCisgMUEgM0EgNjggMjggNjAgRTMgNjcgNEEgNjcgMzYgMDYgRTQgMzAgODcgMDYgRTUgXAorIDMwIDg3IDA2IEUzIDgwIDU3IDMyIDAwIDk3IDcxIDQ1IDMyIDAxIDk3IDcxIDQ1IFwKKyAwMiAwRiA2MCBFNSA1NyAwMiAwRSA2MCBFNSA1NyAwNiBFMyAxMiBBMCBGOCAxNSBcCisgMUEgMDAgNzUgNTkgMDIgMEUgNjAgRTQgNTcgMDIgMEYgNjAgRTQgNTcnIiAgICAgICAgIyBzZGs1NjY1LmhleAorCitpZiAkP21hZ251bSAmJiAhJD90dWMyNF9yZWYgJiYgISQ/QkNNNTY1MF9DMCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEZDIDY3IDVBIDY3IDlDIDA2IEZBIDY3IERBIDA2IEZCIDY3IERBIFwKKyAwNiBGQyA4MCBEMiAxQyA3NCAwMSAxMiBGRCA4NSAwNSBEMiAwRiA3MSAyMSA1MiBcCisgMDAgMTIgRkUgODUgMDUgRDIgMUYgNzEgMkIgNTIgMDAgMTIgRkYgODUgMDUgRDIgXAorIDA1IDcxIDM1IDUyIDAwIEU5IDA1IDk4IDk4IDk4IDk4IEMyIDBGIDYwIEY5IDA1IFwKKyA4OCA4OCA4OCA4OCBDMiBGMCBCNiBGOSA1MCA4MSBEQSAwQyA3NCAzNiBFOSAwMiBcCisgODAgNDUgODAgODEgREEgMEUgNzQgNTEgM0EgNzAgMzIgMDAgOTcgNzUgNjYgMTIgXAorIEMwIEZFIEZDIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDcyIDEyIERDIEZFIEZDIDAyIFwKKyAwQSA1MCAxMiBEQyBGRSBGQyA5NSA3NSA4NiA4NSAxMiBDMCBGRSBGQyA5NSAwMiBcCisgRkEgNzUgRDcgODUgNzcgRDEgMTIgQzAgRkUgRkMgOTUgNzUgOTIgODUgMDIgRkEgXAorIDc3IEQ0IDE2IEZGIERBIDAyIDAyIEZBIDcxIEQ0IDc3IEQ3IDMyIDA1IDk3IDcxIFwKKyBBOSAwNiBGRSBEMiAwMSAwMiBGQiA3MSBEMSAwNiBGQyA2NyBDQSAwMiBGQiA3NSBcCisgRDEgMzIgMDIgOTcgNzEgRDEgMzIgMDMgOTcgNzEgRDcgMzIgMDQgOTcgNzUgRDQgXAorIDA2IEZEIEQyIDA3IDAyIEZCIDcxIEQ0IDc3IEQ3IDEyIEEwIEY4IDE1IDFBIDAwIFwKKyA1NyA0MiAwMCA1NyA0MiAwMSA1NyA0MiAwMiA1NyBEMiAwMiA3NCBFMyAzMiAwRiBcCisgODcgNzcgRTYgMzIgMEUgODcgRDIgMDEgNzQgRUUgMzIgMEYgODcgNTcgMzIgMEUgXAorIDg3IDU3JyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2RrNTY2NS5oZXgKKworaWYgJD9tYWdudW0gJiYgISQ/dHVjMjRfcmVmICYmICQ/QkNNNTY1MF9DMCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDYwIEZCIEQyIDE4IDc1IDA5IEEyIDAxIDYwIEZDIDI4IDY3IDM3IDY3IDczIFwKKyAwNiBGQiA4MCBEMiAxQyA3NCAwMSAxMiBGRCA4NSAwNSBEMiAwRiA3MSAyMSA1MiBcCisgMDAgMTIgRkUgODUgMDUgRDIgMUYgNzEgMkIgNTIgMDAgMTIgRkYgODUgMDUgRDIgXAorIDA1IDcxIDM1IDUyIDAwIDNBIDcwIDMyIDAwIDk3IDc1IDQzIDEyIEMwIEZFIEZDIFwKKyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0RiAxMiBEQyBGRSBGQyAwMiAwQSA1MCAxMiBcCisgREMgRkUgRkMgOTUgNzUgNjEgODUgMTIgQzAgRkUgRkMgOTUgNzUgQjAgODUgNzcgXAorIEEyIDEyIEMwIEZFIEZDIDk1IDc1IDZCIDg1IDc3IEE5IDE2IEZGIERBIDAyIDcxIFwKKyBBOSA3NyBCMCAzMiAwNSA5NyA3MSA3RSAwNiBGRSBEMiAwMSA3MSBBMiAwNiBGQyBcCisgNjcgOUIgNzUgQTIgMzIgMDIgOTcgNzEgQTIgMzIgMDMgOTcgNzEgQjAgMzIgMDQgXAorIDk3IDc1IEE5IDA2IEZEIEQyIDA3IDcxIEE5IDc3IEIwIDEyIEEwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRiA4NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyBcCisgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1hZ251bV9zZGsuaGV4CisKK2lmICQ/dHVjMjRfcmVmICYmICQ/QkNNNTY1MF9DMCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDYwIEZCIEQyIDE4IDcxIDEwIDYwIEZDIDI4IDY3IEQwIDY3IEMwIDc3IDE5IFwKKyBBMiAwMSA2MCBGQyAyOCA2NyA0MCA2NyA3QyAwNiBGQiA4MCBEMiAxQyA3NCAwMSBcCisgMTIgRkQgODUgMDUgRDIgMEYgNzEgMkEgNTIgMDAgMTIgRkUgODUgMDUgRDIgMUYgXAorIDcxIDM0IDUyIDAwIDEyIEZGIDg1IDA1IEQyIDA1IDcxIDNFIDUyIDAwIDNBIDY4IFwKKyAzMiAwMCA5NyA3NSA0QyAxMiBDMCBGRSBGQyAwMiAwQSA1MCAzMiAwMSA5NyA3NSBcCisgNTggMTIgREMgRkUgRkMgMDIgMEEgNTAgMTIgREMgRkUgRkMgOTUgNzUgNkEgODUgXAorIDEyIEMwIEZFIEZDIDk1IDc1IEI5IDg1IDc3IEFCIDEyIEMwIEZFIEZDIDk1IDc1IFwKKyA3NCA4NSA3NyBCMiAxNiBGRiBEQSAwMiA3MSBCMiA3NyBCOSAzMiAwNSA5NyA3MSBcCisgODcgMDYgRkUgRDIgMDEgNzEgQUIgMDYgRkMgNjcgQTQgNzUgQUIgMzIgMDIgOTcgXAorIDcxIEFCIDMyIDAzIDk3IDcxIEI5IDMyIDA0IDk3IDc1IEIyIDA2IEZEIEQyIDA3IFwKKyA3MSBCMiA3NyBCOSAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyAzMiAwRiBcCisgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcgXAorIDAyIDBFIDMyIDAwIDk3IDcxIENEIDMyIDAxIDk3IDcxIENEIDgwIDMwIDg3IDU3IFwKKyAwNiBGQyAxMiBBMCBGOCAxNSAxQSAwMCAwMiAwRiA3NSBERCA5MCAzMCA4NyA1NyciICAjIG1hZ251bS5oZXgKKworaWYgJD90dWMyNF9yZWYgJiYgISQ/QkNNNTY1MF9DMCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEZDIEQyIDE4IDcxIDBFIDY3IEU5IDY3IEQ5IDc3IDFBIDY3IDVBIFwKKyA2NyA5QyAwNiBGQSA2NyBEMCAwNiBGQiA2NyBEMCAwNiBGQyA4MCBEMiAxQyA3NCBcCisgMDEgMTIgRkUgODUgMDUgRDIgMUYgNzEgMkIgNTIgMDAgMTIgRkYgODUgMDUgRDIgXAorIDA1IDcxIDM1IDUyIDAwIEU5IDA1IDk4IDk4IDk4IDk4IEMyIDBGIDYwIEY5IDA1IFwKKyA4OCA4OCA4OCA4OCBDMiBGMCBCNiBGOSA1MCA4MSBEQSAwQyA3NCAzNiBFOSAwMiBcCisgODAgNDUgODAgODEgREEgMEQgNzQgNTEgM0EgNjggMzIgMDAgOTcgNzUgNjYgMTIgXAorIEMwIEZFIEZDIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDcyIDEyIERDIEZFIEZDIDAyIFwKKyAwQSA1MCAxMiBEQyBGRSBGQyA5NSA3NSA4NiA4NSAxMiBDMCBGRSBGQyA5NSAwMiBcCisgRkEgNzUgQ0QgODUgNzcgQzcgMTIgQzAgRkUgRkMgOTUgNzUgOTIgODUgMDIgRkEgXAorIDc3IENBIDE2IEZGIERBIDAyIDAyIEZBIDcxIENBIDc3IENEIDMyIDA1IDk3IDcxIFwKKyBBOSAwNiBGRSBEMiAwMSAwMiBGQiA3MSBDNyAwNiBGQyA2NyBDMCAwMiBGQiA3NSBcCisgQzcgMzIgMDIgOTcgNzEgQzcgMzIgMDMgOTcgNzEgQ0QgMzIgMDQgOTcgNzUgQ0EgXAorIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDQyIEZGIDU3IDQyIEZFIDU3IDQyIEVGIDU3IFwKKyAzMCA4NyA5OCA5OCA5OCA5OCAzMCA4NyA1NyAwMiAwRSAzMiAwMCA5NyA3MSBFNiBcCisgMzIgMDEgOTcgNzEgRTYgODAgMzAgODcgNTcgMDYgRkMgMTIgQTAgRjggMTUgMUEgXAorIDAwIDAyIDBGIDc1IEY2IDkwIDMwIDg3IDU3JyIgICAgICAgICAgICAgICAgICAgICAgICMgdHVjMjRfcmVmLmhleAorCitpZiAkP2hlcmM4XzE1ICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDEgMjggMzIgMDggRDcgODcgMzIgMDcgRDcgODcgMzIgMDEgRDcgODcgMzIgXAorIDAwIEQ3IDg3IDgwIEQyIDA5IDc0IDAyIDg2IDdGIDA2IDdGIEMyIDA3IDc0IDIyIFwKKyA4NiA3RSAxNiA3RSBDQSAwNyBFMCAxNyAwRCAxMiAwOCA5OCAyNyBENyA4NyA5MSBcCisgNzQgMkIgM0EgMjgnIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZGs1Njc1LmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/bG0gImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBDMyA2NyAyRCAwNiBDMyA4MCBEMiAwQyA3NCAwMSAxMiBDMiA4NSBcCisgMDUgRDIgMEYgNzEgMTcgNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgNzEgMjEgNTIgXAorIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDJCIDUyIDAwIDNBIDE4IDMyIDAwIDk3IFwKKyA3NSAzOSAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NSAxMiBBQyBcCisgRkUgQzMgMDIgMEEgNTAgMTIgQUMgRkUgQzMgOTUgNzUgNUYgODUgMTIgQTAgRkUgXAorIEMzIDk1IDcxIDVDIDE2IEMwIERBIDAyIDcxIEE2IDc3IEI0IDg1IDc3IDc3IDEyIFwKKyBBMCBGRSBDMyA5NSA3NSA2RiA4NSAxNiBDMCBEQSAwMiA3MSBBNiA3NyBBRCAxNiBcCisgQzAgREEgMDIgNzEgQUQgNzcgQjQgMzIgMDUgOTcgNzEgODIgMDYgQzEgRDIgMDEgXAorIDcxIEE2IDA2IEMzIDY3IDlGIDc1IEE2IDMyIDAyIDk3IDcxIEE2IDMyIDAzIDk3IFwKKyA3MSBCNCAzMiAwNCA5NyA3NSBBRCAwNiBDMiBEMiAwNyA3MSBBRCA3NyBCNCAxMiBcCisgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgXAorIDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwJyIgICMgbG01NjkwLmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/bG00OHAgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBDMyA2NyA3QyAwNiBDMyA4MCAyOCA2MCBDMyA2NyA3QyA2NyA0MCBcCisgMDYgQzMgOTAgMjggNjAgQzMgNjcgNDAgMDYgQzMgODAgODAgRDIgMEMgNzQgMDEgXAorIDEyIEMyIDg1IDA1IEQyIDBGIDcxIDJBIDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIFwKKyA3MSAzNCA1MiAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAzRSA1MiAwMCAzQSAzMCBcCisgMzIgMDAgOTcgNzUgNEMgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgXAorIDU4IDEyIEFDIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDZBIDg1IFwKKyAxMiBBMCBGRSBDMyA5NSA3NSBCOSA4NSA3NyBBQiAxMiBBMCBGRSBDMyA5NSA3NSBcCisgNzQgODUgNzcgQjIgMTYgQzAgREEgMDIgNzEgQjIgNzcgQjkgMzIgMDUgOTcgNzEgXAorIDhDIDMyIDAyIDk3IDcxIEFCIDA2IEMxIEQyIDAxIDcxIEFCIDA2IEMzIDY3IEE0IFwKKyA3NSBBQiAzMiAwMyA5NyA3MSBCOSAzMiAwNCA5NyA3NSBCMiAwNiBDMiBEMiAwNyBcCisgNzEgQjIgNzcgQjkgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgXAorIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgICMgbG00OHA1Njk1LmhleAorCitpZiAkP2RyYWNfYW55ICYmICQ/bG00OHBfQiAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEMzIDY3IDc5IDA2IEMzIDY3IDNEIDA2IEMzIDgwIDI4IDYwIEMzIFwKKyA2NyAzRCAwNiBDMyA2NyA3OSAwNiBDMyA4MCBEMiAwQyA3NCAwMSAxMiBDMiA4NSBcCisgMDUgRDIgMEYgNzEgMjcgNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgNzEgMzEgNTIgXAorIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDNCIDUyIDAwIDNBIDMwIDMyIDAwIDk3IFwKKyA3NSA0OSAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA1NSAxMiBBQyBcCisgRkUgQzMgMDIgMEEgNTAgMTIgQUMgRkUgQzMgOTUgNzUgNjcgODUgMTIgQTAgRkUgXAorIEMzIDk1IDc1IEI2IDg1IDc3IEE4IDEyIEEwIEZFIEMzIDk1IDc1IDcxIDg1IDc3IFwKKyBBRiAxNiBDMCBEQSAwMiA3MSBBRiA3NyBCNiAzMiAwNSA5NyA3MSA4OSAzMiAwMiBcCisgOTcgNzEgQTggMDYgQzEgRDIgMDEgNzEgQTggMDYgQzMgNjcgQTEgNzUgQTggMzIgXAorIDAzIDk3IDcxIEI2IDMyIDA0IDk3IDc1IEFGIDA2IEMyIEQyIDA3IDcxIEFGIDc3IFwKKyBCNiAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiBcCisgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAgIyBsbTQ4cDU2OTVfMTAuaGV4CisKK2lmICQ/ZmlyZWJvbHRfYW55ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNTUgNjcgOTEgMDYgRTMgODAgMjggNjAgRTMgNjcgOTEgXAorIDY3IDU1IDA2IEUzIDgwIEQyIDE4IDc0IDAxIDI4IDYwIEUzIDY3IEI5IDc1IDI2IFwKKyA2NyBDRSA2NyA1NSA3NyAyRSAzMiAwRSA4NyAzMiAwOCA4NyA2NyBDMCAwNiBFMyBcCisgODAgRDIgMUMgNzQgMTkgMTIgRTIgODUgMDUgRDIgMEYgNzEgM0YgNTIgMDAgMTIgXAorIEUxIDg1IDA1IEQyIDFGIDcxIDQ5IDUyIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIFwKKyA1MyA1MiAwMCAzQSA3MCAzMiAwMCA5NyA3NSA2MSAxMiBBMCBGRSBFMyAwMiAwQSBcCisgNTAgMzIgMDEgOTcgNzUgNkQgMTIgQkMgRkUgRTMgMDIgMEEgNTAgMTIgQkMgRkUgXAorIEUzIDk1IDc1IDdGIDg1IDEyIEEwIEZFIEUzIDk1IDc1IENFIDg1IDc3IEMwIDEyIFwKKyBBMCBGRSBFMyA5NSA3NSA4OSA4NSA3NyBDNyAxNiBFMCBEQSAwMiA3MSBDNyA3NyBcCisgQ0UgMzIgMDUgOTcgNzEgQTEgMzIgMDIgOTcgNzEgQzAgMDYgRTEgRDIgMDEgNzEgXAorIEMwIDA2IEUzIDY3IEI5IDc1IEMwIDMyIDAzIDk3IDcxIENFIDMyIDA0IDk3IDc1IFwKKyBDNyAwNiBFMiBEMiAwNyA3MSBDNyA3NyBDRSAxMiA4MCBGOCAxNSAxQSAwMCA1NyBcCisgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgXAorIDg3IDMyIDBFIDg3IDU3JyIgICMgc2RrNTY1MDQuaGV4CisKKyNMZWQgcHJvZ3JhbSBmb3IgbmV3IHJldiBvZiBGQiBTREsgYW5kIFJlZiBkZXNpZ24KK2lmICQ/ZmlyZWJvbHRfYW55ICYmICEkP2ZiMjQgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyA0QiA2NyA4NyAwNiBFMyA4MCBEMiAxOCA3NCAwMSAyOCBcCisgNjAgRTMgNjcgQUYgNzUgMUMgNjcgQzQgNjcgNEIgNzcgMjQgMzIgMEUgODcgMzIgXAorIDA4IDg3IDY3IEI2IDA2IEUzIDgwIEQyIDFDIDc0IDBGIDEyIEUyIDg1IDA1IEQyIFwKKyAwRiA3MSAzNSA1MiAwMCAxMiBFMSA4NSAwNSBEMiAxRiA3MSAzRiA1MiAwMCAxMiBcCisgRTAgODUgMDUgRDIgMDUgNzEgNDkgNTIgMDAgM0EgNzAgMzIgMDAgOTcgNzUgNTcgXAorIDEyIEEwIEZFIEUzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDYzIDEyIEJDIEZFIEUzIFwKKyAwMiAwQSA1MCAxMiBCQyBGRSBFMyA5NSA3NSA3NSA4NSAxMiBBMCBGRSBFMyA5NSBcCisgNzUgQzQgODUgNzcgQjYgMTIgQTAgRkUgRTMgOTUgNzUgN0YgODUgNzcgQkQgMTYgXAorIEUwIERBIDAyIDcxIEJEIDc3IEM0IDMyIDA1IDk3IDcxIDk3IDMyIDAyIDk3IDcxIFwKKyBCNiAwNiBFMSBEMiAwMSA3MSBCNiAwNiBFMyA2NyBBRiA3NSBCNiAzMiAwMyA5NyBcCisgNzEgQzQgMzIgMDQgOTcgNzUgQkQgMDYgRTIgRDIgMDcgNzEgQkQgNzcgQzQgMTIgXAorIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IFwKKyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICMgc2RrNTY1MDRyZWYuaGV4CisKKyNPdmVycmlkZSBEZWZhdWx0IEZpcmVib2x0IExFRCBwcm9ncmFtIGZvciBMaW5lIE1vZHVsZQoraWYgJD9sbSAmJiAkP2ZpcmVib2x0X2FueSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDc5IDA2IEUzIDY3IDNEIDA2IEUzIDgwIDI4IDYwIEUzIFwKKyA2NyAzRCAwNiBFMyA2NyA3OSAwNiBFMyA4MCBEMiAxOCA3NCAwMSAxMiBFMiA4NSBcCisgMDUgRDIgMEYgNzEgMjcgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgMzEgNTIgXAorIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDNCIDUyIDAwIDNBIDYwIDMyIDAwIDk3IFwKKyA3NSA0OSAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA1NSAxMiBCQyBcCisgRkUgRTMgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgNjcgODUgMTIgQTAgRkUgXAorIEUzIDk1IDc1IEI2IDg1IDc3IEE4IDEyIEEwIEZFIEUzIDk1IDc1IDcxIDg1IDc3IFwKKyBBRiAxNiBFMCBEQSAwMiA3MSBBRiA3NyBCNiAzMiAwNSA5NyA3MSA4OSAzMiAwMiBcCisgOTcgNzEgQTggMDYgRTEgRDIgMDEgNzEgQTggMDYgRTMgNjcgQTEgNzUgQTggMzIgXAorIDAzIDk3IDcxIEI2IDMyIDA0IDk3IDc1IEFGIDA2IEUyIEQyIDA3IDcxIEFGIDc3IFwKKyBCNiAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiBcCisgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjIGxtNDhwNTY1MDQuaGV4CisKKyNPdmVycmlkZSBEZWZhdWx0IEZpcmVib2x0IExFRCBwcm9ncmFtIGZvciBMaW5lIE1vZHVsZSAtNTAgdmVyc2lvbgoraWYgJD9sbSAmJiAkP2xtNDhwX0QgJiYgJD9maXJlYm9sdF9hbnkgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyA2RCAwNiBFMyA2NyAzMSAwNiBFMyA4MCBEMiAxOCA3NCBcCisgMDEgMTIgRTIgODUgMDUgRDIgMEYgNzEgMUIgNTIgMDAgMTIgRTEgODUgMDUgRDIgXAorIDFGIDcxIDI1IDUyIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDJGIDUyIDAwIDNBIFwKKyA2MCAzMiAwMCA5NyA3NSAzRCAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyBcCisgNzUgNDkgMTIgQkMgRkUgRTMgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgNUIgXAorIDg1IDEyIEEwIEZFIEUzIDk1IDc1IEFBIDg1IDc3IDlDIDEyIEEwIEZFIEUzIDk1IFwKKyA3NSA2NSA4NSA3NyBBMyAxNiBFMCBEQSAwMiA3MSBBMyA3NyBBQSAzMiAwNSA5NyBcCisgNzEgN0QgMzIgMDIgOTcgNzEgOUMgMDYgRTEgRDIgMDEgNzEgOUMgMDYgRTMgNjcgXAorIDk1IDc1IDlDIDMyIDAzIDk3IDcxIEFBIDMyIDA0IDk3IDc1IEEzIDA2IEUyIEQyIFwKKyAwNyA3MSBBMyA3NyBBQSAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiBcCisgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgXAorIDU3JyIgIyBsbTQ4cDU2NTA0XzUwLmhleAorCitpZiAkP2xtICYmICQ/ZmlyZWJvbHRfMTB4NCAibG9jYWwgbGVkY29kZSAnXAorIDAyIDE4IDI4IDMyIDA3IDY3IDFFIDc1IDBBIEQ3IDg3IDMyIDAxIEQ3IDg3IDMyIFwKKyAwMCBENyA4NyAzMiAwOCBENyA4NyA4MCBEMiAxQyA3NCAwMiAzQSAwQyAxMiA4MCBcCisgRjggMTUgMUEgMDAgNTcgJyIgIyBsbTEycGN4NDU2NTAxLmhleAorCitpZiAkP2ZicG9lICYmICQ/ZmlyZWJvbHRfYW55ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgODUgNjcgNDkgMDYgRTMgODAgRDIgMTggNzQgMDEgMjggXAorIDYwIEUzIDY3IEFEIDc1IDFBIDY3IEMyIDc3IDIwIDMyIDBFIDg3IDMyIDA4IDg3IFwKKyA2NyA0OSAwNiBFMyA4MCBEMiAxQSA3NCAwRiAxMiBFMiA4NSAwNSBEMiAwRiA3MSBcCisgMzMgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgM0QgNTIgMDAgMTIgRTAgODUgXAorIDA1IEQyIDA1IDcxIDQ3IDUyIDAwIDNBIDY4IDMyIDAwIDk3IDc1IDU1IDEyIEEwIFwKKyBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA2MSAxMiBCQSBGRSBFMyAwMiAwQSBcCisgNTAgMTIgQkEgRkUgRTMgOTUgNzUgNzMgODUgMTIgQTAgRkUgRTMgOTUgNzUgQzIgXAorIDg1IDc3IEI0IDEyIEEwIEZFIEUzIDk1IDc1IDdEIDg1IDc3IEJCIDE2IEUwIERBIFwKKyAwMiA3MSBCQiA3NyBDMiAzMiAwNSA5NyA3MSA5NSAzMiAwMiA5NyA3MSBCNCAwNiBcCisgRTEgRDIgMDEgNzEgQjQgMDYgRTMgNjcgQUQgNzUgQjQgMzIgMDMgOTcgNzEgQzIgXAorIDMyIDA0IDk3IDc1IEJCIDA2IEUyIEQyIDA3IDcxIEJCIDc3IEMyIDEyIDgwIEY4IFwKKyAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiBcCisgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjIHBvZTQ4cDU2NTA0LmhleAorCisjT3ZlcnJpZGUgRGVmYXVsdCBGaXJlYm9sdCBMRUQgcHJvZ3JhbSBmb3IgZmVsaXgKK2lmICQ/ZmVsaXggfHwgJD9mZWxpeDE1ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNkIgNjcgQTcgMDYgRTMgODAgRDIgMTggNzQgMDEgMDIgXAorIDE4IDI4IDYwIEUzIDY3IDQ5IDAyIDE5IDI4IDYwIEUzIDY3IDQ5IDMyIDBFIDg3IFwKKyAzMiAwRSA4NyAzMiAwRSA4NyAzMiAwRSA4NyAxMiBFMiA4NSAwNSBEMiAwRiA3MSBcCisgMzMgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgM0QgNTIgMDAgMTIgRTAgODUgXAorIDA1IEQyIDA1IDcxIDQ3IDUyIDAwIDNBIDY4IDY3IENGIDc1IDUyIDMyIDBFIDg3IFwKKyA3NyA1NSAzMiAwRiA4NyAzMiAwMCA5NyA3NSA1RSAzMiAwRSA4NyA1NyAzMiAwMSBcCisgOTcgNzUgNjcgMzIgMEUgODcgNTcgMzIgMEYgODcgNTcgMzIgMDAgOTcgNzUgNzcgXAorIDEyIEEwIEZFIEUzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDgzIDEyIEJDIEZFIEUzIFwKKyAwMiAwQSA1MCAxMiBCQyBGRSBFMyA5NSA3NSA5NSA4NSAxMiBBMCBGRSBFMyA5NSBcCisgNzUgRTQgODUgNzcgRDYgMTIgQTAgRkUgRTMgOTUgNzUgOUYgODUgNzcgREQgMTYgXAorIEUwIERBIDAyIDcxIEREIDc3IEU0IDMyIDA1IDk3IDcxIEI3IDMyIDAyIDk3IDcxIFwKKyBENiAwNiBFMSBEMiAwMSA3MSBENiAwNiBFMyA2NyBDRiA3NSBENiAzMiAwMyA5NyBcCisgNzEgRTQgMzIgMDQgOTcgNzUgREQgMDYgRTIgRDIgMDcgNzEgREQgNzcgRTQgMTIgXAorIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IFwKKyAzMiAwRiA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyciICAjIHNkazU2MTAyLmhleAorCisjT3ZlcnJpZGUgRGVmYXVsdCBGZWxpeCBMRUQgcHJvZ3JhbSBmb3IgZmVsaXg0OAoraWYgJD9mZWxpeDQ4ICYmICQ/ZmVsaXggfHwgJD9mZWxpeDE1ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNkIgNjcgQTcgMDYgRTMgODAgRDIgMTggNzQgMDEgMDIgXAorIDE4IDI4IDYwIEUzIDY3IDQ5IDAyIDE5IDI4IDYwIEUzIDY3IDQ5IDMyIDBFIDg3IFwKKyAzMiAwRSA4NyAzMiAwRSA4NyAzMiAwRSA4NyAxMiBFMiA4NSAwNSBEMiAwRiA3MSBcCisgMzMgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgM0QgNTIgMDAgMTIgRTAgODUgXAorIDA1IEQyIDA1IDcxIDQ3IDUyIDAwIDNBIDY4IDY3IENGIDc1IDUyIDMyIDBFIDg3IFwKKyA3NyA1NSAzMiAwRiA4NyAzMiAwMCA5NyA3NSA1RSAzMiAwRSA4NyA1NyAzMiAwMSBcCisgOTcgNzUgNjcgMzIgMEUgODcgNTcgMzIgMEYgODcgNTcgMzIgMDAgOTcgNzUgNzcgXAorIDEyIEEwIEZFIEUzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDgzIDEyIEJDIEZFIEUzIFwKKyAwMiAwQSA1MCAxMiBCQyBGRSBFMyA5NSA3NSA5NSA4NSAxMiBBMCBGRSBFMyA5NSBcCisgNzUgRTQgODUgNzcgRDYgMTIgQTAgRkUgRTMgOTUgNzUgOUYgODUgNzcgREQgMTYgXAorIEUwIERBIDAyIDcxIEREIDc3IEU0IDMyIDA1IDk3IDcxIEI3IDMyIDAyIDk3IDcxIFwKKyBENiAwNiBFMSBEMiAwMSA3MSBENiAwNiBFMyA2NyBDRiA3NSBENiAzMiAwMyA5NyBcCisgNzEgRTQgMzIgMDQgOTcgNzUgREQgMDYgRTIgRDIgMDcgNzEgREQgNzcgRTQgMTIgXAorIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IFwKKyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICAjIGZlbGl4NDguaGV4CisKK2lmICQ/ZWFzeXJpZGVyX2FueSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDU5IDY3IDk1IDA2IEUzIDgwIDI4IDYwIEUzIDY3IDk1IFwKKyA2NyA1OSAwNiBFMyA4MCBEMiAwQyA3NCAwMSAyOCA2MCBFMyA2NyBCRCA3NSAyNiBcCisgNjcgRDIgNjcgNTkgNzcgMkUgMzIgMEUgODcgMzIgMDggODcgNjcgQzQgMDYgRTMgXAorIDgwIEQyIDBEIDc0IDE5IDEyIEUyIDg1IDA1IEQyIDBGIDcxIDNGIDUyIDAwIDEyIFwKKyBFMSA4NSAwNSBEMiAxRiA3MSA0OSA1MiAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSBcCisgNTMgNTIgMDAgNjcgQzQgNjcgQzQgM0EgMzggMzIgMDAgOTcgNzUgNjUgMTIgQTAgXAorIEZFIEUzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDcxIDEyIEFEIEZFIEUzIDAyIDBBIFwKKyA1MCAxMiBBRCBGRSBFMyA5NSA3NSA4MyA4NSAxMiBBMCBGRSBFMyA5NSA3NSBEMiBcCisgODUgNzcgQzQgMTIgQTAgRkUgRTMgOTUgNzUgOEQgODUgNzcgQ0IgMTYgRTAgREEgXAorIDAyIDcxIENCIDc3IEQyIDMyIDA1IDk3IDcxIEE1IDMyIDAyIDk3IDcxIEM0IDA2IFwKKyBFMSBEMiAwMSA3MSBDNCAwNiBFMyA2NyBCRCA3NSBDNCAzMiAwMyA5NyA3MSBEMiBcCisgMzIgMDQgOTcgNzUgQ0IgMDYgRTIgRDIgMDcgNzEgQ0IgNzcgRDIgMTIgODAgRjggXAorIDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IDMyIDBGIFwKKyA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICAgIyBzZGs1NjYwMS5oZXgKKworI092ZXJyaWRlIERlZmF1bHQgRWFzeXJpZGVyIExFRCBwcm9ncmFtIGZvciA1NjYwMgoraWYgJD9lYXN5cmlkZXJfMXgxICJsb2NhbCBsZWRjb2RlICdcCisgRTAgNjAgRTEgNjcgN0MgNjcgN0MgMDYgRTEgODAgRDIgMEMgNzQgMDEgMDIgMEMgXAorIDI4IDYwIEUxIDY3IDc1IDc1IDFEIDY3IDhBIDY3IDM5IDc3IDI1IDMyIDBFIDg3IFwKKyAzMiAwOCA4NyA2NyA3QyAwNiBFMSBEMiAwMCAwMiAwMCA3NCAxMCAxMiBFMCA4NSBcCisgMDUgRDIgMDUgNzEgMzcgNTIgMDAgM0EgMzggMzIgMDAgOTcgNzUgNDUgMTIgQTAgXAorIEZFIEUxIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDUxIDEyIEFEIEZFIEUxIDAyIDBBIFwKKyA1MCAxMiBBRCBGRSBFMSA5NSA3NSA2MyA4NSAxMiBBMCBGRSBFMSA5NSA3NSA4QSBcCisgODUgNzcgN0MgMTIgQTAgRkUgRTEgOTUgNzUgNkQgODUgNzcgODMgMTYgRTAgREEgXAorIDAyIDcxIDgzIDc3IDhBIDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIFwKKyAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyBcCisgNTcnIiAgICMgc2RrNTY2MDIuaGV4CisKKyNPdmVycmlkZSBEZWZhdWx0ICBMRUQgcHJvZ3JhbSBmb3IgNTMzMDAKK2lmICQ/bWlyYWdlMjQgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyA2QiA2NyAyRiAwNiBFMyA4MCBEMiAxOCA3NCAwMSAxMiBcCisgRTIgODUgMDUgRDIgMEYgNzEgMTkgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgXAorIDIzIDUyIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDJEIDUyIDAwIDNBIDMwIDMyIFwKKyAwMCA5NyA3NSAzQiAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NyBcCisgMTIgQkMgRkUgRTMgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgNTkgODUgMTIgXAorIEEwIEZFIEUzIDk1IDc1IEEyIDg1IDc3IDlBIDEyIEEwIEZFIEUzIDk1IDc1IDYzIFwKKyA4NSA3NyA5RSAxNiBFMCBEQSAwMiA3MSA5RSA3NyBBMiAzMiAwNSA5NyA3MSA3QiBcCisgMzIgMDIgOTcgNzEgOUEgMDYgRTEgRDIgMDEgNzEgOUEgMDYgRTMgNjcgOTMgNzUgXAorIDlBIDMyIDAzIDk3IDcxIEEyIDMyIDA0IDk3IDc1IDlFIDA2IEUyIEQyIDA3IDcxIFwKKyA5RSA3NyBBMiAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSBcCisgODcgNTcgMzIgMEUgODcgNTcnIiAgIyBzZGs1MzMwMC5oZXgKKworI092ZXJyaWRlIERlZmF1bHQgTEVEIHByb2dyYW0gZm9yIDU2MzE0CitpZiAkP2JjbTU2MzE0cDI0cmVmICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNzkgNjcgM0QgMDYgRTMgODAgRDIgMTggNzQgMDEgMjggXAorIDYwIEUzIDY3IDc5IDY3IEE4IDA2IEUzIDgwIEQyIDFDIDc0IDBGIDEyIEUyIDg1IFwKKyAwNSBEMiAwRiA3MSAyNyA1MiAwMCAxMiBFMSA4NSAwNSBEMiAxRiA3MSAzMSA1MiBcCisgMDAgMTIgRTAgODUgMDUgRDIgMDUgNzEgM0IgNTIgMDAgM0EgMzggMzIgMDAgOTcgXAorIDc1IDQ5IDEyIEEwIEZFIEUzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDU1IDEyIEJDIFwKKyBGRSBFMyAwMiAwQSA1MCAxMiBCQyBGRSBFMyA5NSA3NSA2NyA4NSAxMiBBMCBGRSBcCisgRTMgOTUgNzUgQjAgODUgNzcgQTggMTIgQTAgRkUgRTMgOTUgNzUgNzEgODUgNzcgXAorIEFDIDE2IEUwIERBIDAyIDcxIEFDIDc3IEIwIDMyIDA1IDk3IDcxIDg5IDMyIDAyIFwKKyA5NyA3MSBBOCAwNiBFMSBEMiAwMSA3MSBBOCAwNiBFMyA2NyBBMSA3NSBBOCAzMiBcCisgMDMgOTcgNzEgQjAgMzIgMDQgOTcgNzUgQUMgMDYgRTIgRDIgMDcgNzEgQUMgNzcgXAorIEIwIDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IFwKKyAzMiAwRSA4NyA1NyciICAjIGJjbTk1NjMxNHAyNHJlZi5oZXgKKworaWYgJD9icmFkbGV5ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRjIgNjcgMUIgMDYgRjIgODAgRDIgMTQgNzQgMDEgODYgRjMgMTIgXAorIEYwIDg1IDA1IEQyIDA1IDcxIDE5IDUyIDAwIDNBIDI4IDMyIDAwIDk3IDc1IDI3IFwKKyAxMiBBOCBGRSBGMiAwMiAwQSA1MCAzMiAwMSA5NyA3NSAzMyAxMiBCQyBGRSBGMiBcCisgMDIgMEEgNTAgMTIgQkMgRkUgRjIgOTUgNzUgNDUgODUgMTIgQTggRkUgRjIgOTUgXAorIDc1IDkxIDg1IDc3IDU3IDEyIEE4IEZFIEYyIDk1IDc1IDRGIDg1IDc3IDhBIDE2IFwKKyBGMCBEQSAwMiA3MSA4QSA3NyA5MSAwNiBGMiAxMiA5NCBGOCAxNSAwMiAwMiBDMSBcCisgNzQgNkUgMDIgMDQgQzEgNzQgNkUgMDIgMDggQzEgNzQgNkUgNzcgNzQgQzYgRjMgXAorIDc0IDkxIDc3IDhBIDA2IEYyIDY3IDdDIDc1IDgzIDc3IDkxIDEyIDgwIEY4IDE1IFwKKyAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyBcCisgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAgICAgIyBzZGs1NjgwMC5oZXgKKworaWYgJD9odW12ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRjIgNjcgMjEgMDYgRjIgODAgRDIgMDggNzQgMEYgRjIgMDIgRDIgXAorIDEyIDc0IDAxIDg2IEYzIDEyIEYwIDg1IDA1IEQyIDA1IDcxIDFGIDUyIDAwIDNBIFwKKyAyMCAzMiAwMCA5NyA3NSAyRCAxMiBBOCBGRSBGMiAwMiAwQSA1MCAzMiAwMSA5NyBcCisgNzUgMzkgMTIgQkEgRkUgRjIgMDIgMEEgNTAgMTIgQkEgRkUgRjIgOTUgNzUgNEIgXAorIDg1IDEyIEE4IEZFIEYyIDk1IDc1IDk3IDg1IDc3IDVEIDEyIEE4IEZFIEYyIDk1IFwKKyA3NSA1NSA4NSA3NyA5MCAxNiBGMCBEQSAwMiA3MSA5MCA3NyA5NyAwNiBGMiAxMiBcCisgOTQgRjggMTUgMDIgMDIgQzEgNzQgNzQgMDIgMDQgQzEgNzQgNzQgMDIgMDggQzEgXAorIDc0IDc0IDc3IDdBIEM2IEYzIDc0IDk3IDc3IDkwIDA2IEYyIDY3IDgyIDc1IDg5IFwKKyA3NyA5NyAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyBcCisgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjIHNkazU2NzAwLmhleAorCitpZiAkP2JyYWRsZXlfMWcgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyAyRiA2NyA2QiAwNiBFMyA4MCBEMiAxNCA3NCAwMSAxMiBcCisgRTIgODUgMDUgRDIgMEYgNzEgMTkgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgXAorIDIzIDUyIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDJEIDUyIDAwIDNBIDUwIDMyIFwKKyAwMCA5NyA3NSAzQiAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NyBcCisgMTIgQjQgRkUgRTMgMDIgMEEgNTAgMTIgQjQgRkUgRTMgOTUgNzUgNTkgODUgMTIgXAorIEEwIEZFIEUzIDk1IDc1IEE4IDg1IDc3IDlBIDEyIEEwIEZFIEUzIDk1IDc1IDYzIFwKKyA4NSA3NyBBMSAxNiBFMCBEQSAwMiA3MSBBMSA3NyBBOCAzMiAwNSA5NyA3MSA3QiBcCisgMzIgMDIgOTcgNzEgOUEgMDYgRTEgRDIgMDEgNzEgOUEgMDYgRTMgNjcgOTMgNzUgXAorIDlBIDMyIDAzIDk3IDcxIEE4IDMyIDA0IDk3IDc1IEExIDA2IEUyIEQyIDA3IDcxIFwKKyBBMSA3NyBBOCAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyBcCisgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcgJyIgICMgc2RrNTY4MDBjLmhleAorCitpZiAkP2dvbGR3aW5nICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRjMgRDIgMTAgNzUgMEUgNjcgM0IgNjcgOTQgNzcgMTIgNjcgOTQgXAorIDY3IDNCIDA2IEYzIDgwIEQyIDE0IDc0IDAxIDg2IEY0IDEyIEYyIDg1IDA1IEQyIFwKKyAwRiA3MSAyNSA1MiAwMCAxMiBGMSA4NSAwNSBEMiAxRiA3MSAyRiA1MiAwMCAxMiBcCisgRjAgODUgMDUgRDIgMDUgNzEgMzkgNTIgMDAgM0EgNTAgMzIgMDAgOTcgNzUgNDcgXAorIDEyIEE4IEZFIEYzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDUzIDEyIEJDIEZFIEYzIFwKKyAwMiAwQSA1MCAxMiBCQyBGRSBGMyA5NSA3NSA2NSA4NSAxMiBBOCBGRSBGMyA5NSBcCisgNzUgQzAgODUgNzcgNzcgMTIgQTggRkUgRjMgOTUgNzUgNkYgODUgNzcgQjkgMTYgXAorIEYwIERBIDAyIDcxIEI5IDc3IEMwIDA2IEYzIDEyIDk0IEY4IDE1IDAyIDAyIEMxIFwKKyA3NCA4RSAwMiAwNCBDMSA3NCA4RSAwMiAwOCBDMSA3NCA4RSA3NyBCMiBDNiBGNCBcCisgNzQgQzAgNzcgQjkgMDYgRjMgNjcgQUIgNzUgQjIgMzIgMDQgNzUgQjIgMzIgMDMgXAorIDk3IDcxIEMwIDA2IEYyIEQyIDA3IDcxIEI5IDc3IEMwIDEyIDgwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyBcCisgMzIgMEYgODcgMzIgMEUgODcgNTcgJyIgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2RrNTY1ODAuaGV4CisKK2lmICQ/aHVtdiAmJiAkP2xtICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDQgMjggRDIgMDggNzQgMEEgRjIgMDIgMjggMzIgMDcgNjcgMjkgNzUgMTEgXAorIEQ3IDg3IDYwIEU0IDY3IDMwIDA2IEU0IDYwIEU0IDY3IDRDIDA2IEU0IDMyIDA4IFwKKyBENyA4NyA4MCBEMiAxMiA3NCAwMiAzQSAzMCAxMiA4MCBGOCAxNSAxQSAwMCA1NyBcCisgMDYgRTQgMTIgOTQgRjggMTUgMDIgMTAgQzEgNzAgNDIgMTIgRDIgRkUgRTQgMDIgXAorIDBBIDUwIDEyIEQyIEZFIEU0IDk1IDc1IDZEIDg1IDc3IDY4IDA2IEU0IDEyIDk0IFwKKyBGOCAxNSAwMiAyMCBDMSA3MCA1RSAxMiBDMCBGRSBFNCAwMiAwQSA1MCAxMiBDMCBcCisgRkUgRTQgOTUgNzUgNkQgODUgNzcgNjggMzIgMEUgRDcgODcgNTcgMzIgMEYgRDcgXAorIDg3IDU3ICciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxtMTJwNTY4MDIuaGV4CisKKworaWYgJD9yYXB0b3IgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwNiAyOCA2MCBGRiA2NyA2NCA2NyA5MyAwNiBGRiA4MCBEMiAzNiA3NCAwMiBcCisgMDIgMDQgMjggNjAgRkYgNjcgQkIgNzUgMUUgMzIgMEUgODcgNzcgMjEgMzIgMEYgXAorIDg3IDY3IDdEIDA2IEZGIDgwIEQyIDA2IDc0IDEyIDAyIDAxIDI4IDYwIEZGIDY3IFwKKyBCQiA3NSAzOCAzMiAwRSA4NyA3NyAzQiAzMiAwRiA4NyA2NyA3RCAwNiBGRiA4MCBcCisgRDIgMDMgNzQgMkMgMTIgRkUgODUgMDUgRDIgMEYgNzEgNEUgNTIgMDAgMTIgRkQgXAorIDg1IDA1IEQyIDFGIDcxIDU4IDUyIDAwIDEyIEZDIDg1IDA1IEQyIDA1IDcxIDYyIFwKKyA1MiAwMCAzQSBDOCAzMiAwMSA5NyA3NSA3NiAzMiAwMCA5NyA3NSBDOSAxNiBGQyBcCisgREEgMDIgNzEgQzkgNzcgRDAgMzIgMDAgOTcgNzUgQzIgNzcgRDAgMzIgMDAgOTcgXAorIDc1IDg2IDMyIDBFIDg3IDU3IDMyIDAxIDk3IDc1IDhGIDMyIDBFIDg3IDU3IDMyIFwKKyAwRiA4NyA1NyAzMiAwNSA5NyA3MSBBMyAzMiAwMiA5NyA3MSBDMiAwNiBGRCBEMiBcCisgMDEgNzEgQzIgMDYgRkYgNjcgQkIgNzUgQzIgMzIgMDMgOTcgNzEgRDAgMzIgMDQgXAorIDk3IDc1IEM5IDA2IEZFIEQyIDA3IDcxIEM5IDc3IEQwIDEyIEEwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyBcCisgMzIgMEYgODcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjIHNkazU2MDE4LmhleAorCitpZiAkP3JhcHRvciAmJiAkP3JhcDI0X3JlZiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDA2IDYwIEUxIDY3IDQ4IDY3IDMxIDA2IEUxIDgwIEQyIDFFIDcxIDAyIDAyIFwKKyAwNSA2MCBFMSA2NyA0OCA2NyAzMSAwNiBFMSA5MCBEMiAwMyA3NCAxMSAwMiAwMiBcCisgNjAgRTEgNjcgNDggNjcgMzEgMDYgRTEgOTAgRDIgMDAgNzQgMjAgODYgRTAgM0EgXAorIDM4IDA2IEUxIDY3IDUwIDc1IDU3IDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDU3IFwKKyAxNiBFMCBDQSAwNSA3NCA1QiA3NyA1NyAwNiBFMSA2NyA1MCA3NSA1NyA3NyA1QiBcCisgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAnIiAjIHNkazU2MjE0LmhleAorCitpZiAkP3JhdmVuX2ViXzQ4cCAibG9jYWwgbGVkY29kZSAnXAorIDAyIDA2IDI4IDYwIEMzIDY3IDMwIDY3IDZDIDA2IEMzIDgwIEQyIDFFIDc0IDAyIFwKKyAxMiBDMiA4NSAwNSBEMiAwRiA3MSAxQSA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiBcCisgNzEgMjQgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgMkUgNTIgMDAgM0EgNjAgXAorIDMyIDAwIDk3IDc1IDNDIDEyIEMwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IFwKKyA0OCAxMiBFMCBGRSBDMyAwMiAwQSA1MCAxMiBFMCBGRSBDMyA5NSA3NSA1QSA4NSBcCisgMTIgQzAgRkUgQzMgOTUgNzUgQTkgODUgNzcgOUIgMTIgQzAgRkUgQzMgOTUgNzUgXAorIDY0IDg1IDc3IEEyIDE2IEMwIERBIDAyIDcxIEEyIDc3IEE5IDMyIDA1IDk3IDcxIFwKKyA3QyAzMiAwMiA5NyA3MSA5QiAwNiBDMSBEMiAwMSA3MSA5QiAwNiBDMyA2NyA5NCBcCisgNzUgOUIgMzIgMDMgOTcgNzEgQTkgMzIgMDQgOTcgNzUgQTIgMDYgQzIgRDIgMDcgXAorIDcxIEEyIDc3IEE5IDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIFwKKyA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICNiY205NTYwMjRwNDhyZWYuaGV4CisKK2lmICQ/QkNNOTU2MDI0UjUwVCAibG9jYWwgbGVkY29kZSAnXAorIDAyIDA2IDI4IDYwIEMzIDY3IDMwIDY3IDZDIDA2IEMzIDgwIEQyIDFFIDc0IDAyIFwKKyAxMiBDMiA4NSAwNSBEMiAwRiA3MSAxQSA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiBcCisgNzEgMjQgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgMkUgNTIgMDAgM0EgNjAgXAorIDMyIDAwIDk3IDc1IDNDIDEyIEMwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IFwKKyA0OCAxMiBFMCBGRSBDMyAwMiAwQSA1MCAxMiBFMCBGRSBDMyA5NSA3NSA1QSA4NSBcCisgMTIgQzAgRkUgQzMgOTUgNzUgQTkgODUgNzcgOUIgMTIgQzAgRkUgQzMgOTUgNzUgXAorIDY0IDg1IDc3IEEyIDE2IEMwIERBIDAyIDcxIEEyIDc3IEE5IDMyIDA1IDk3IDc1IFwKKyA3QyAzMiAwMiA5NyA3MSA5QiAwNiBDMSBEMiAwMSA3MSA5QiAwNiBDMyA2NyA5NCBcCisgNzUgOUIgMzIgMDMgOTcgNzEgQTkgMzIgMDQgOTcgNzUgQTIgMDYgQzIgRDIgMDcgXAorIDcxIEEyIDc3IEE5IDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIFwKKyA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICNiY205NTYwMjRyNTB0LmhleAorCitpZiAkP3Njb3JwaW9uIHx8ICQ/Y29ucXVlcm9yICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMTggMjggNjAgRTEgNjcgMTIgMDYgRTEgOTAgRDIgMDAgNzQgMDIgODYgRTAgXAorIDNBIDE4IDY3IDJEIDc1IDM0IDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDM4IDE2IFwKKyBFMCBDQSAwNSA3NCAzOCA3NyAzNCA2NyAyRCA3NSAzNCA3NyAzOCAxMiBBMCBGOCBcCisgMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgXAorIDAwIDAwIDAwJyIgI3NkazU2ODIwLmhleAorCitpZiAkP3Njb3JwaW9uICYmICQ/QkNNOTU2ODIwUjI0WEcgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMSAyOCA2NyBEMCAwMiAwMiAyOCA2NyBENiA2NyBEMCAwMiAwMSAyOCA2NyBcCisgRDYgMDIgMDQgMjggNjcgRDAgMDIgMDMgMjggNjcgRDYgNjcgRDAgMDIgMDQgMjggXAorIDY3IEQ2IDAyIDA1IDI4IDY3IEQwIDAyIDA2IDI4IDY3IEQ2IDY3IEQwIDAyIDA1IFwKKyAyOCA2NyBENiAwMiAwNyAyOCA2NyBEMCAwMiAwOCAyOCA2NyBENiA2NyBEMCAwMiBcCisgMDcgMjggNjcgRDYgMDIgMDkgMjggNjcgRDAgMDIgMEEgMjggNjcgRDYgNjcgRDAgXAorIDAyIDA5IDI4IDY3IEQ2IDAyIDBDIDI4IDY3IEQwIDAyIDBCIDI4IDY3IEQ2IDY3IFwKKyBEMCAwMiAwQyAyOCA2NyBENiAwMiAwRCAyOCA2NyBEMCAwMiAwRSAyOCA2NyBENiBcCisgNjcgRDAgMDIgMEQgMjggNjcgRDYgMDIgMEYgMjggNjcgRDAgMDIgMTAgMjggNjcgXAorIEQ2IDY3IEQwIDAyIDBGIDI4IDY3IEQ2IDAyIDExIDI4IDY3IEQwIDAyIDEyIDI4IFwKKyA2NyBENiA2NyBEMCAwMiAxMSAyOCA2NyBENiAwMiAxNCAyOCA2NyBEMCAwMiAxMyBcCisgMjggNjcgRDYgNjcgRDAgMDIgMTQgMjggNjcgRDYgMDIgMTUgMjggNjcgRDAgMDIgXAorIDE2IDI4IDY3IEQ2IDY3IEQwIDAyIDE1IDI4IDY3IEQ2IDAyIDE3IDI4IDY3IEQwIFwKKyAwMiAxOCAyOCA2NyBENiA2NyBEMCAwMiAxNyAyOCA2NyBENiA4NiBFMCAzQSAzMCBcCisgNjcgRjEgNzUgRjggNzcgRkMgNjcgRjEgNzUgRjggMjggMzIgMDAgMzIgMDEgQjcgXAorIDk3IDc1IEY4IDE2IEUwIENBIDA1IDc0IEZDIDc3IEY4IDY3IEYxIDc1IEY4IDc3IFwKKyBGQyAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyBcCisgJyIgI2JjbTk1NjgyMHIyNHhnLmhleAorCitpZiAkP3ZhbGt5cmllICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDIgNjcgQTkgNjcgOTQgMDIgMDMgNjcgQTkgNjcgOTQgMDIgMDUgNjcgQTkgXAorIDY3IDk0IDAyIDA0IDY3IEE5IDY3IDk0IDAyIDA2IDY3IEE5IDY3IDk0IDAyIDA3IFwKKyA2NyBBOSA2NyA5NCAwMiAxMiA2NyBBOSA2NyA5NCAwMiAxMyA2NyBBOSA2NyA5NCBcCisgMDIgMEUgNjcgQTkgNjcgOTQgMDIgMEYgNjcgQTkgNjcgOTQgMDIgMTEgNjcgQTkgXAorIDY3IDk0IDAyIDEwIDY3IEE5IDY3IDk0IDAyIDFBIDY3IEE5IDY3IDk0IDAyIDIwIFwKKyA2NyBBOSA2NyA5NCAwMiAyMSA2NyBBOSA2NyA5NCAwMiAyMiA2NyBBOSA2NyA5NCBcCisgMDIgMjMgNjcgQTkgNjcgOTQgMDIgMjQgNjcgQTkgNjcgOTQgMDIgMkYgNjcgQTkgXAorIDY3IDk0IDAyIDJFIDY3IEE5IDY3IDk0IDAyIDFCIDY3IEE5IDY3IDk0IDAyIDJCIFwKKyA2NyBBOSA2NyA5NCAwMiAyQyA2NyBBOSA2NyA5NCAwMiAyRCA2NyBBOSA2NyA5NCBcCisgODYgRTAgM0EgMzAgNjcgQUYgNzUgQjYgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgXAorIEI2IDE2IEUwIENBIDA1IDc0IEJBIDc3IEI2IDY3IEFGIDc1IEI2IDc3IEJBIDEyIFwKKyBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCBcCisgMDAnIiAjc2RrNTY2ODAuaGV4CisKK2lmICQ/dmFsa3lyaWUyICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMUUgNjcgQTkgNjcgOTQgMDIgMUYgNjcgQTkgNjcgOTQgMDIgMjEgNjcgQTkgXAorIDY3IDk0IDAyIDIwIDY3IEE5IDY3IDk0IDAyIDIyIDY3IEE5IDY3IDk0IDAyIDIzIFwKKyA2NyBBOSA2NyA5NCAwMiAyNCA2NyBBOSA2NyA5NCAwMiAyNSA2NyBBOSA2NyA5NCBcCisgMDIgMjYgNjcgQTkgNjcgOTQgMDIgMjcgNjcgQTkgNjcgOTQgMDIgMjkgNjcgQTkgXAorIDY3IDk0IDAyIDI4IDY3IEE5IDY3IDk0IDAyIDJBIDY3IEE5IDY3IDk0IDAyIDJCIFwKKyA2NyBBOSA2NyA5NCAwMiAyQyA2NyBBOSA2NyA5NCAwMiAyRCA2NyBBOSA2NyA5NCBcCisgMDIgMkUgNjcgQTkgNjcgOTQgMDIgMkYgNjcgQTkgNjcgOTQgMDIgMzEgNjcgQTkgXAorIDY3IDk0IDAyIDMwIDY3IEE5IDY3IDk0IDAyIDMyIDY3IEE5IDY3IDk0IDAyIDMzIFwKKyA2NyBBOSA2NyA5NCAwMiAzNCA2NyBBOSA2NyA5NCAwMiAzNSA2NyBBOSA2NyA5NCBcCisgODYgRTAgM0EgMzAgNjcgQUYgNzUgQjYgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgXAorIEI2IDE2IEUwIENBIDA1IDc0IEJBIDc3IEI2IDY3IEFGIDc1IEI2IDc3IEJBIDEyIFwKKyBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCBcCisgMDAnIiAjc2RrNTY2ODUuaGV4CisKK2lmICQ/aGF3a2V5ZV9wMjQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMSAyOCA2MCBFMyA2NyA0MyA2NyAxQyAwNiBFMyA4MCBEMiAxOSA3NCAwMiBcCisgMTIgRTAgODUgMDUgRDIgMDMgNzEgMUEgNTIgMDAgM0EgNjAgMzIgMDAgMzIgMDEgXAorIEI3IDk3IDc1IDJCIDEyIEU0IEZFIEUzIDAyIDAxIDUwIDEyIEU0IEZFIEUzIDk1IFwKKyA3NSAzQiA4NSAwNiBFMyA2NyA1NSA3NSA2QSA3NyA1QyAxNiBFMCBEQSAwMSA3MSBcCisgNkEgNzcgNUMgMDYgRTMgNjcgNTUgNzUgNkEgMzIgMDMgOTcgNzEgNUMgMzIgMDQgXAorIDk3IDc1IDZBIDc3IDYzIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIFwKKyAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyAzMiAwRiA4NyAzMiAwRiA4NyBcCisgNTcnIiAgI2JjbTk1MzMxNHAyNHJlZi5oZXgKKworaWYgJD9oYXdrZXllX2syNCAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAxIDI4IDYwIEUxIDY3IDNEIDY3IDFDIDA2IEUxIDgwIEQyIDE5IDc0IDAyIFwKKyAxMiBFMCA4NSAwNSBEMiAwNSA3MSAxQSA1MiAwMCAzQSAzMCAzMiAwMCAzMiAwMSBcCisgQjcgOTcgNzUgMkIgMTIgRTIgRkUgRTEgMDIgMEEgNTAgMTIgRTIgRkUgRTEgOTUgXAorIDc1IDM1IDg1IDc3IDUwIDE2IEUwIERBIDAyIDcxIDRDIDc3IDUwIDA2IEUxIDY3IFwKKyA0NSA3NSA1MCA3NyA0QyAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyA1NyBcCisgMzIgMEYgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjYmNtOTUzMzE0azI0LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjI0IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFDIDI4IDY3IDE4IDAyIDFEIDI4IDY3IDE4IDAyIDFFIDI4IDY3IDE4IDAyIFwKKyAxRiAyOCA2NyAxOCA4NiBFMCAzQSAwOCA2NyAzQiA3NSAyMCA2NyA0NiA3NyAyNCBcCisgNjcgNDIgNzcgNDIgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNDIgMTYgRTAgQ0EgXAorIDA1IDc0IDQ2IDc3IDQyIDY3IDNCIDc1IDQyIDc3IDQ2IDEyIEEwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjYyNC5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYyNiIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxQSAyOCA2NyAyMiAwMiAxQiAyOCA2NyAyMiAwMiAxQyAyOCA2NyAyMiAwMiBcCisgMUQgMjggNjcgMjIgMDIgMUUgMjggNjcgMjIgMDIgMUYgMjggNjcgMjIgODYgRTAgXAorIDNBIDA4IDY3IDNEIDc1IDQ0IDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDQ4IDE2IFwKKyBFMCBDQSAwNSA3NCA0OCA3NyA0NCA2NyAzRCA3NSA0NCA3NyA0OCAxMiBBMCBGOCBcCisgMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MjYuaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MjgiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDIgMjggNjcgMkMgMDIgMEUgMjggNjcgMkMgMDIgMUEgMjggNjcgMkMgMDIgXAorIDFCIDI4IDY3IDJDIDAyIDFDIDI4IDY3IDJDIDAyIDFEIDI4IDY3IDJDIDAyIDFFIFwKKyAyOCA2NyAyQyAwMiAxRiAyOCA2NyAyQyA4NiBFMCAzQSAwOCA2NyA0NyA3NSA0RSBcCisgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNTIgMTYgRTAgQ0EgMDUgNzQgNTIgNzcgXAorIDRFIDY3IDQ3IDc1IDRFIDc3IDUyIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIFwKKyA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjYyOC5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYyOSIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMiAyOCA2NyAyQyAwMiAwRSAyOCA2NyAyQyAwMiAxQSAyOCA2NyAyQyAwMiBcCisgMUIgMjggNjcgMkMgMDIgMUMgMjggNjcgMkMgMDIgMUQgMjggNjcgMkMgMDIgMUUgXAorIDI4IDY3IDJDIDAyIDFGIDI4IDY3IDJDIDg2IEUwIDNBIDA4IDY3IDQ3IDc1IDRFIFwKKyAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA1MiAxNiBFMCBDQSAwNSA3NCA1MiA3NyBcCisgNEUgNjcgNDcgNzUgNEUgNzcgNTIgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgXAorIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2NjI5LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjM0IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFBIDI4IDY3IDE4IDAyIDFCIDI4IDY3IDE4IDAyIDFDIDI4IDY3IDE4IDAyIFwKKyAxRCAyOCA2NyAxOCA4NiBFMCAzQSAwOCA2NyAzQiA3NSAyMCA2NyA0NiA3NyAyNCBcCisgNjcgNDIgNzcgNDIgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNDIgMTYgRTAgQ0EgXAorIDA1IDc0IDQ2IDc3IDQyIDY3IDNCIDc1IDQyIDc3IDQ2IDEyIEEwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjYzNC5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYzMCIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxQSAyOCA2NyAxOCAwMiAxQiAyOCA2NyAxOCAwMiAxQyAyOCA2NyAxOCAwMiBcCisgMUQgMjggNjcgMTggODYgRTAgM0EgMDggNjcgM0IgNzUgMjAgNjcgNDYgNzcgMjQgXAorIDY3IDQyIDc3IDQyIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDQyIDE2IEUwIENBIFwKKyAwNSA3NCA0NiA3NyA0MiA2NyAzQiA3NSA0MiA3NyA0NiAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MzQuaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MzYiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMkEgMjggNjcgMjIgMDIgMzIgMjggNjcgMjIgMDIgMUEgMjggNjcgMjIgMDIgXAorIDFCIDI4IDY3IDIyIDAyIDFDIDI4IDY3IDIyIDAyIDFEIDI4IDY3IDIyIDg2IEUwIFwKKyAzQSAwOCA2NyAzRCA3NSA0NCAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA0OCAxNiBcCisgRTAgQ0EgMDUgNzQgNDggNzcgNDQgNjcgM0QgNzUgNDQgNzcgNDggMTIgQTAgRjggXAorIDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwJyIgI3NkazU2NjM2LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjM4IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFFIDI4IDY3IDJDIDAyIDI2IDI4IDY3IDJDIDAyIDJBIDI4IDY3IDJDIDAyIFwKKyAzMiAyOCA2NyAyQyAwMiAxQSAyOCA2NyAyQyAwMiAxQiAyOCA2NyAyQyAwMiAxQyBcCisgMjggNjcgMkMgMDIgMUQgMjggNjcgMkMgODYgRTAgM0EgMDggNjcgNDcgNzUgNEUgXAorIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDUyIDE2IEUwIENBIDA1IDc0IDUyIDc3IFwKKyA0RSA2NyA0NyA3NSA0RSA3NyA1MiAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiBcCisgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MzguaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MzkiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMUUgMjggNjcgMkMgMDIgMjYgMjggNjcgMkMgMDIgMkEgMjggNjcgMkMgMDIgXAorIDMyIDI4IDY3IDJDIDAyIDFBIDI4IDY3IDJDIDAyIDFCIDI4IDY3IDJDIDAyIDFDIFwKKyAyOCA2NyAyQyAwMiAxRCAyOCA2NyAyQyA4NiBFMCAzQSAwOCA2NyA0NyA3NSA0RSBcCisgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNTIgMTYgRTAgQ0EgMDUgNzQgNTIgNzcgXAorIDRFIDY3IDQ3IDc1IDRFIDc3IDUyIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIFwKKyA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjYzOS5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjMzNCIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMiAyOCA2MCBFMSA2NyAzRCA2NyAxQyAwNiBFMSA4MCBEMiAxRSA3NCAwMiBcCisgMTIgRTAgODUgMDUgRDIgMDUgNzEgMUEgNTIgMDAgM0EgMzggMzIgMDAgMzIgMDEgXAorIEI3IDk3IDc1IDJCIDEyIEUyIEZFIEUxIDAyIDBBIDUwIDEyIEUyIEZFIEUxIDk1IFwKKyA3NSAzNSA4NSA3NyA0QyAxNiBFMCBEQSAwMiA3MSA1MCA3NyA0QyAwNiBFMSA2NyBcCisgNDUgNzUgNEMgNzcgNTAgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgXAorIDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2MzM0LmhleAorCitpZiAkP2Fwb2xsbyAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFFIDI4IDYwIEUwIDY3IDU4IDY3IDczIDA2IEUwIDgwIDI4IDYwIEUwIDY3IFwKKyA3MyA2NyA1OCAwNiBFMCA4MCBEMiAzNiA3NCAwMiAwMiAxQSAyOCA2MCBFMCA2NyBcCisgOUIgNzUgMjkgNjcgQjAgNjcgNTggNzcgMzEgMzIgMEUgODcgMzIgMDggODcgNjcgXAorIEEyIDA2IEUwIDgwIEQyIDFFIDc0IDFDIDEyIEUyIDg1IDA1IEQyIDBGIDcxIDQyIFwKKyA1MiAwMCAxMiBFMSA4NSAwNSBEMiAxRiA3MSA0QyA1MiAwMCAxMiBFMyA4NSAwNSBcCisgRDIgMDUgNzEgNTYgNTIgMDAgM0EgNzAgMzIgMDAgOTcgNzUgNjQgMzIgMDEgOTcgXAorIDcxIDZCIDc3IEIwIDMyIDAxIDk3IDcxIEE5IDc3IEEyIDE2IEUzIERBIDAyIDcxIFwKKyBBOSA3NyBCMCAzMiAwNSA5NyA3NSA4MyAzMiAwMiA5NyA3MSBBMiAwNiBFMSBEMiBcCisgMDEgNzEgQTIgMDYgRTAgNjcgOUIgNzUgQTIgMzIgMDMgOTcgNzEgQjAgMzIgMDQgXAorIDk3IDc1IEE5IDA2IEUyIEQyIDA3IDcxIEE5IDc3IEIwIDEyIEEwIEY4IDE1IDFBIFwKKyAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyBcCisgMzIgMEYgODcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY1MjQuaGV4CisKK2lmICQ/Z2VuZXJpYzhsZWQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwNiBFMSBEMiA0MCA3MSAxMSBFMCA2MCBFMSAxNiBFMyBEQSAwMSA3MSAxNSA2MCBcCisgRTMgNjcgNUQgNzUgMkIgMTIgMDEgNjEgRTMgNjcgNzEgMjggNjcgMzIgODYgRTAgXAorIDE2IEUyIDgxIDYxIEUyIERBIDFFIDc1IDJCIDNBIDA4IEU5IDYxIEUyIDg2IEUxIFwKKyA3NyAwMCA2NyA1RCA3NSAzOCA3NyAzQyA2NyA2NCA3NyA2NCA2NyA0MSA2NyA0RiBcCisgNTcgMjggMzIgMDEgOTcgNzUgNjQgMTYgRTAgQ0EgMDUgNzQgNjggNzcgNjQgMjggXAorIDMyIDAwIDk3IDc1IDY0IDE2IEUwIENBIDA1IDc0IDY4IDc3IDY0IDEyIEEwIEY4IFwKKyAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwOSA3NSA2NCA3NyBcCisgNjggMTIgMDUgNjcgNkMgMTIgMDQgNjcgNkMgMTIgMDMgNjcgNkMgMTIgMDIgNjcgXAorIDZDIDEyIDAxIDY3IDZDIDEyIDAwIDY3IDZDIDU3IDAwIDAwIDAwIDAwIDAwIDAwJyIgI2dlbmVyaWM4bGVkLmhleAorCisjIERvd25sb2FkIExFRCBjb2RlIGludG8gTEVEIHByb2Nlc3NvciBhbmQgZW5hYmxlIChpZiBhcHBsaWNhYmxlKS4KKworaWYgJD9mZWF0dXJlX2xlZF9wcm9jICYmICQ/bGVkY29kZSAmJiAhJD9zaW11bGF0b3IgXAorCSJsZWQgcHJvZyAkbGVkY29kZTsgXAorCSBsZWQgYXV0byBvbjsgbGVkIHN0YXJ0IgorCisjIElmIGxvYWRpbmcgbXVsdGlwbGUgcmMuc29jLCB1cG9uIGxvYWRpbmcgdGhlIGxhc3QgdW5pdCwgcmVzdGFydAorIyBhbGwgTEVEIHByb2Nlc3NvcnMgc28gYW55IGNvbW1vbiBibGlua2luZyBpcyBpbiBzeW5jLgorCitpZiAhImV4cHIgJD9mZWF0dXJlX2xlZF9wcm9jICYmICEkP3NpbXVsYXRvciAmJiAkdW5pdCA9PSAkdW5pdHMgLSAxIiBcCisJIio6bGVkIHN0b3A7ICo6bGVkIHN0YXJ0IgorCisjIFJ1biBjb3VudGVyIERNQSB0YXNrIDQgdGltZXMgcGVyIHNlY29uZCB0byBhY2hpZXZlIGJldHRlcgorIyBjdHJfeGF1aV9hY3Rpdml0eS4KK2lmICQ/YnJhZGxleV9hbnkgXAorICAgICAgICAiY3RyIGludGVydmFsPTI1MDAwMCIKKworIyBJbml0aWFsaXplIEhlcmN1bGVzIFVDIG1vZGlkIDAgZW50cnkgdG8gcG9pbnQgdG8gdGhlIENQVQoraWYgJD9oZXJjX2FueSBcCisJIncgdWMgMCAxIDEiCisKKyMgQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZvciA0OC1wb3J0IGluIFN0YWNraW5nIG1vZGUuCisjIE9uIHRoZSA0OC1wb3J0IHBsYXRmb3JtLCByYy5zb2MgaXMgcnVuIHR3aWNlOyBvbmNlIG9uIHVuaXQgMCBhbmQKKyMgdGhlbiBvbmNlIG9uIHVuaXQgMS4gIFRoZSB0dXJibyBwb3J0IG9uIHVuaXQgTiBpcyBnZU4uCisjIEFsbCB0dXJibyBwb3J0IHRyYWZmaWMgbXVzdCBiZSB0YWdnZWQ7IHNlZSB2bGFuIGFkZCBiZWxvdy4KKyMgU2VlICRTREsvZG9jLzQ4LXBvcnQudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uIGluY2x1ZGluZyBob3cKKyMgdG8gY29uZmlndXJlIElQRyB2YWx1ZXMgZm9yIGxpbmUgcmF0ZSBvcGVyYXRpb24uCisKK2lmICQ/cDQ4ICYmICQ/dW5pdDAgXAorCSJsb2NhbCB0dXJib19wb3J0IDA7IGxvY2FsIG15X21vZGlkIDE7IgorCitpZiAkP3A0OCAmJiAkP3VuaXQxIFwKKwkibG9jYWwgdHVyYm9fcG9ydCAxOyBsb2NhbCBteV9tb2RpZCAyOyIKKworaWYgJD9wNDggXAorCSJtIGNvbmZpZyBzdF9pc19taXJyPTAgc3RfbW9kdWxlPTEgc3RfbWNudD0xIHN0X3NpbXBsZXg9MCBzdF9saW5rPTA7IFwKKwkgbSBjb25maWcuZyR0dXJib19wb3J0IHN0X2xpbms9MTsgXAorCSBtIGdtYWNjMi5nZSR0dXJib19wb3J0IGlwZ3Q9OCBtY2xrZnE9MTsgXAorCSBtIGZlX21heGYgbWF4ZnI9MTU2MDsgXAorCSBtIG1heGZyIG1heGZyPTE1Njg7IFwKKwkgbSBjb25maWcyIG15X21vZGlkPSRteV9tb2RpZDsgXAorCSBwb3J0IGdlJHR1cmJvX3BvcnQgc3BlZWQ9MjUwMDsgXAorCSB2bGFuIGFkZCAxIHBibT1nZSR0dXJib19wb3J0IHVibT1ub25lIgorCitpZiAhJD9ub19iY20gJiYgJD9kcmFjX2FueSBcCisgICAibSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QxPTB4YyIKK2lmICEkP25vX2JjbSAmJiAkP2x5bnhfYW55IFwKKyAgICJtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDE9MHgxIgoraWYgISQ/bm9fYmNtICYmICQ/dHVjYW5hIFwKKyAgICJzdGttb2RlIG1vZGlkPTA7IgoraWYgISQ/bm9fYmNtICYmICQ/dHVjYW5hICYmICEkP21hZ251bSAmJiAhJD90dWNhbmFfbm9oZyBcCisgICAibSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QyPTB4Mzg7IFwKKyAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0wIHBvcnRfZm9yX21vZDI9MHgzODsgXAorICAgIHN0a21vZGUgbW9kaWQ9MCIKK2lmICEkP25vX2JjbSAmJiAkP3hnc19zd2l0Y2ggJiYgISQ/cmNwdV9vbmx5XAorICAgInN0a21vZGUgbW9kaWQ9MDsgXAorICAgIHMgQ01JQ19DT1NfQ1RSTF9SWCBDSDBfQ09TX0JNUD0wLENIMV9DT1NfQk1QPTB4ZmYsIFwKKyAgICAgICAgQ0gyX0NPU19CTVA9MCxDSDNfQ09TX0JNUD0wIgorCisjIEJhY2stdG8tYmFjayBEcmFjbyBzZXR1cC4KKworIyBEcmFjbyBjaGlwcyBtdXN0IHJ1biBhdCAxMjdNSHouIFNvbWUgb2xkZXIgdmVyc2lvbnMKKyMgYXJlIG5vdCBzZXQgdG8gdGhpcyBmcmVxdWVuY3kuCisKK2lmICQ/ZHJhY29fc3RrICYmICQ/dW5pdDAgXAorICAgICJpMmMgcHJvYmUgcXVpZXQ7IGJiIGNsb2NrIFJlZjEyNSAxMjciCisKKyMgQXBwbGllcyB0byBTREsgQmFzZWJvYXJkIHdpdGggZWl0aGVyIGludGVybmFsIG9yIGV4dGVybmFsIEhpZ2lncywKKyMgYXMgd2VsbCBhcyB0aGUgR2FsYWhhZCByZWZlcmVuY2UgZGVzaWduLgorCitpZiAkP2RyYWNvX2IyYiAmJiAkP3VuaXQwIFwKKyAgICAic3RrbW9kZSBtb2RpZD0wOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MTI7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MTIiCisKK2lmICEkP3NpbXVsYXRvciAmJiAkP2RyYWNvX2IyYiAmJiAkP3VuaXQwIFwKKyAgICAgImkyYyBwcm9iZSBxdWlldDsgYmIgY2xvY2sgUmVmMTI1IDEyNyIKKworaWYgJD9kcmFjb19iMmIgJiYgJD91bml0MSBcCisgICAgInN0a21vZGUgbW9kaWQ9MTsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0wOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0wIgorCisjIE1lcmxpbiwgV2hpdGUgS25pZ2h0LCBCbGFjayBLbmlnaHQgc2V0dXAuCisjCURyYWNvIHVuaXQgMSBpcyBvbiBIZXJjIHBvcnQgOAorIwlEcmFjbyB1bml0IDIgaXMgb24gSGVyYyBwb3J0IDEKKworaWYgJD9kcmFjb19oZXJjNCAmJiAkP3VuaXQwIFwKKyAgICAidyB1Yy5ocGljNyAwIDEgMHgwOyBcCisgICAgIHcgdWMuaHBpYzcgMSAxIDB4MjsgXAorICAgICB3IHVjLmhwaWMwIDAgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMwIDEgMSAweDAiCisKK2lmICEkP3NpbXVsYXRvciAmJiAkP2RyYWNvX2hlcmM0ICYmICQ/dW5pdDAgXAorICAgICAiaTJjIHByb2JlIHF1aWV0OyBiYiBjbG9jayBSZWYxMjUgMTI3IgorCitpZiAkP2RyYWNvX2hlcmM0ICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTA7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0xMjsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0xMiIKKworaWYgJD9kcmFjb19oZXJjNCAmJiAkP3VuaXQyIFwKKyAgICAic3RrbW9kZSBtb2RpZD0xOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTA7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTAiCisKKyMgTGFuY2Vsb3Qgc2V0dXAKKyMgKGVuYWJsZWQgYnkgYWRkaW5nIHRoZSBwcm9wZXJ0eSAibGFuY2Vsb3Q9MSIpCisjIE5vdGVzOgorIwlEcmFjbyB1bml0IDEgaXMgb24gSGVyYyBwb3J0IDcKKyMJRHJhY28gdW5pdCAyIGlzIG9uIEhlcmMgcG9ydCA4CisjCURyYWNvIHVuaXQgMyBpcyBvbiBIZXJjIHBvcnQgMQorIwlEcmFjbyB1bml0IDQgaXMgb24gSGVyYyBwb3J0IDIKKworaWYgJD9sYW5jZWxvdCAmJiAkP3VuaXQwIFwKKyAgICAidyB1Yy5ocGljNiAwIDEgMHgwOyBcCisgICAgIHcgdWMuaHBpYzYgMSAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzYgMiAxIDB4MjsgXAorICAgICB3IHVjLmhwaWM2IDMgMSAweDQ7IFwKKyAgICAgdyB1Yy5ocGljNyAwIDEgMHg4MDsgXAorICAgICB3IHVjLmhwaWM3IDEgMSAweDA7IFwKKyAgICAgdyB1Yy5ocGljNyAyIDEgMHgyOyBcCisgICAgIHcgdWMuaHBpYzcgMyAxIDB4NDsgXAorICAgICB3IHVjLmhwaWMwIDAgMSAweDgwOyBcCisgICAgIHcgdWMuaHBpYzAgMSAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzAgMiAxIDB4MDsgXAorICAgICB3IHVjLmhwaWMwIDMgMSAweDQ7IFwKKyAgICAgdyB1Yy5ocGljMSAwIDEgMHg4MDsgXAorICAgICB3IHVjLmhwaWMxIDEgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMxIDIgMSAweDI7IFwKKyAgICAgdyB1Yy5ocGljMSAzIDEgMHgwIgorCitpZiAhJD9zaW11bGF0b3IgJiYgJD9sYW5jZWxvdCAmJiAkP3VuaXQwIFwKKyAgICAgImkyYyBwcm9iZSBxdWlldDsgYmIgY2xvY2sgRHJhY29fQ29yZSAxMjciCisKK2lmICQ/bGFuY2Vsb3QgJiYgJD91bml0MSBcCisgICAgInN0a21vZGUgbW9kaWQ9MDsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xMiBwb3J0X2Zvcl9tb2QzPTEyOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xMiBwb3J0X2Zvcl9tb2QzPTEyIgorCitpZiAkP2xhbmNlbG90ICYmICQ/dW5pdDIgXAorICAgICJzdGttb2RlIG1vZGlkPTE7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MCBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMjsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MCBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMiIKKworaWYgJD9sYW5jZWxvdCAmJiAkP3VuaXQzIFwKKyAgICAic3RrbW9kZSBtb2RpZD0yOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0wIHBvcnRfZm9yX21vZDM9MTI7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0wIHBvcnRfZm9yX21vZDM9MTIiCisKK2lmICQ/bGFuY2Vsb3QgJiYgJD91bml0NCBcCisgICAgInN0a21vZGUgbW9kaWQ9MzsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0wOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0wIgorCisjIEx5bnggU0RLIChUd29MeW54KSBzZXR1cAorIyAoZW5hYmxlZCBieSBhZGRpbmcgdGhlIHByb3BlcnR5ICJ0d29seW54PTEiKQorCitpZiAkP3R3b2x5bnggJiYgJD91bml0MCBcCisgICAgInN0a21vZGUgbW9kaWQ9MDsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTE7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MTsgXAorICAgICAiCisKK2lmICQ/dHdvbHlueCAmJiAkP3VuaXQxIFwKKyAgICAic3RrbW9kZSBtb2RpZD0xOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xIHBvcnRfZm9yX21vZDE9MDsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEgcG9ydF9mb3JfbW9kMT0wOyBcCisgICAgICIKKyMgSGVyY3VMeW54IHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImhlcmN1bHlueD0xIikKKyMgTm90ZXM6CisjCUx5bnggdW5pdCAxIGlzIG9uIEhlcmMgcG9ydCAxCisjCUx5bnggdW5pdCAyIGlzIG9uIEhlcmMgcG9ydCAyCisjCUx5bnggdW5pdCAzIGlzIG9uIEhlcmMgcG9ydCAzCisjCUx5bnggdW5pdCA0IGlzIG9uIEhlcmMgcG9ydCA0CisjCUx5bnggdW5pdCA1IGlzIG9uIEhlcmMgcG9ydCA1CisjCUx5bnggdW5pdCA2IGlzIG9uIEhlcmMgcG9ydCA2CisjCUx5bnggdW5pdCA3IGlzIG9uIEhlcmMgcG9ydCA3CisjCUx5bnggdW5pdCA4IGlzIG9uIEhlcmMgcG9ydCA4CisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDAgXAorICAgICIgXAorICAgICB3IHVjLmhwaWMwIDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMwIDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWMwIDIgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMwIDMgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMwIDQgMSAweDAyMDsgXAorICAgICB3IHVjLmhwaWMwIDUgMSAweDA0MDsgXAorICAgICB3IHVjLmhwaWMwIDYgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMwIDcgMSAweDEwMDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWMxIDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMxIDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWMxIDIgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMxIDMgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMxIDQgMSAweDAyMDsgXAorICAgICB3IHVjLmhwaWMxIDUgMSAweDA0MDsgXAorICAgICB3IHVjLmhwaWMxIDYgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMxIDcgMSAweDEwMDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWMyIDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMyIDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWMyIDIgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMyIDMgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMyIDQgMSAweDAyMDsgXAorICAgICB3IHVjLmhwaWMyIDUgMSAweDA0MDsgXAorICAgICB3IHVjLmhwaWMyIDYgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMyIDcgMSAweDEwMDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWMzIDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMzIDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWMzIDIgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMzIDMgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMzIDQgMSAweDAyMDsgXAorICAgICB3IHVjLmhwaWMzIDUgMSAweDA0MDsgXAorICAgICB3IHVjLmhwaWMzIDYgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMzIDcgMSAweDEwMDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM0IDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM0IDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWM0IDIgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWM0IDMgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWM0IDQgMSAweDAyMDsgXAorICAgICB3IHVjLmhwaWM0IDUgMSAweDA0MDsgXAorICAgICB3IHVjLmhwaWM0IDYgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWM0IDcgMSAweDEwMDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM1IDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM1IDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWM1IDIgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWM1IDMgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWM1IDQgMSAweDAyMDsgXAorICAgICB3IHVjLmhwaWM1IDUgMSAweDA0MDsgXAorICAgICB3IHVjLmhwaWM1IDYgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWM1IDcgMSAweDEwMDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM2IDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM2IDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWM2IDIgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWM2IDMgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWM2IDQgMSAweDAyMDsgXAorICAgICB3IHVjLmhwaWM2IDUgMSAweDA0MDsgXAorICAgICB3IHVjLmhwaWM2IDYgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWM2IDcgMSAweDEwMDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM3IDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM3IDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWM3IDIgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWM3IDMgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWM3IDQgMSAweDAyMDsgXAorICAgICB3IHVjLmhwaWM3IDUgMSAweDA0MDsgXAorICAgICB3IHVjLmhwaWM3IDYgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWM3IDcgMSAweDEwMDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICAiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/bHlueF9hbnkgXAorICAgICAibSBtb2Rwb3J0XzdfMCBcCisgICAgIHBvcnRfZm9yX21vZDA9MSBwb3J0X2Zvcl9tb2QxPTEgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEgcG9ydF9mb3JfbW9kMz0xIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xIHBvcnRfZm9yX21vZDU9MSBcCisgICAgIHBvcnRfZm9yX21vZDY9MSBwb3J0X2Zvcl9tb2Q3PTE7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgXAorICAgICBwb3J0X2Zvcl9tb2QwPTEgcG9ydF9mb3JfbW9kMT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xIHBvcnRfZm9yX21vZDM9MSBcCisgICAgIHBvcnRfZm9yX21vZDQ9MSBwb3J0X2Zvcl9tb2Q1PTEgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEgcG9ydF9mb3JfbW9kNz0xOyBcCisgICAgICIKKworaWYgJD9oZXJjdWx5bnggJiYgJD91bml0MSBcCisgICAgInN0a21vZGUgbW9kaWQ9MCIKKworaWYgJD9oZXJjdWx5bnggJiYgJD91bml0MiBcCisgICAgInN0a21vZGUgbW9kaWQ9MSIKKworaWYgJD9oZXJjdWx5bnggJiYgJD91bml0MyBcCisgICAgInN0a21vZGUgbW9kaWQ9MiIKKworaWYgJD9oZXJjdWx5bnggJiYgJD91bml0NCBcCisgICAgInN0a21vZGUgbW9kaWQ9MyIKKworaWYgJD9oZXJjdWx5bnggJiYgJD91bml0NSBcCisgICAgInN0a21vZGUgbW9kaWQ9NCIKKworaWYgJD9oZXJjdWx5bnggJiYgJD91bml0NiBcCisgICAgInN0a21vZGUgbW9kaWQ9NSIKKworaWYgJD9oZXJjdWx5bnggJiYgJD91bml0NyBcCisgICAgInN0a21vZGUgbW9kaWQ9NiIKKworaWYgJD9oZXJjdWx5bnggJiYgJD91bml0OCBcCisgICAgInN0a21vZGUgbW9kaWQ9NyIKKworIyBMeW54YUxvdCBzZXR1cAorIyAoZW5hYmxlZCBieSBhZGRpbmcgdGhlIHByb3BlcnR5ICJseW54YWxvdD0xIikKKyMgTm90ZXM6CisjCUx5bnggdW5pdCAwIGlzIG9uIEhlcmMgcG9ydCAzIChoZzIvaHBpYzIpIChtb2QgMCkKKyMJTHlueCB1bml0IDEgaXMgb24gSGVyYyBwb3J0IDQgKGhnMy9ocGljMykgKG1vZCAxKQorIwlIaWdpZyBjb25uIDAgaXMgb24gSGVyYyBwb3J0IDUgKGhnNC9ocGljNCkKKyMJSGlnaWcgY29ubiAxIGlzIG9uIEhlcmMgcG9ydCA2IChoZzUvaHBpYzUpCisjCURyYWNvIHVuaXQgMyBpcyBvbiBIZXJjIHBvcnQgNyAoaGc2L2hwaWM2KSAobW9kIDIpCisjCURyYWNvIHVuaXQgNCBpcyBvbiBIZXJjIHBvcnQgOCAoaGc3L2hwaWM3KSAobW9kIDMpCisjCURyYWNvIHVuaXQgNSBpcyBvbiBIZXJjIHBvcnQgMSAoaGcwL2hwaWMwKSAobW9kIDQpCisjCURyYWNvIHVuaXQgNiBpcyBvbiBIZXJjIHBvcnQgMiAoaGcxL2hwaWMxKSAobW9kIDUpCisKK2lmICQ/bHlueGFsb3QgJiYgJD91bml0MiBcCisgICAgIiBcCisgICAgIHcgdWMuaHBpYzAgMCAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzAgMSAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzAgMiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzAgMyAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzAgNCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzAgNSAxIDB4MDA0OyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzEgMCAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzEgMSAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzEgMiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzEgMyAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzEgNCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzEgNSAxIDB4MDA0OyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzIgMCAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzIgMSAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzIgMiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzIgMyAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzIgNCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzIgNSAxIDB4MDA0OyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzMgMCAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzMgMSAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzMgMiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzMgMyAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzMgNCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzMgNSAxIDB4MDA0OyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzYgMCAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzYgMSAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzYgMiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzYgMyAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzYgNCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzYgNSAxIDB4MDA0OyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzcgMCAxIDB4MDA4OyBcCisgICAgIHcgdWMuaHBpYzcgMSAxIDB4MDEwOyBcCisgICAgIHcgdWMuaHBpYzcgMiAxIDB4MDgwOyBcCisgICAgIHcgdWMuaHBpYzcgMyAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzcgNCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzcgNSAxIDB4MDA0OyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgICIKKworaWYgJD9seW54YWxvdCAmJiAkP2x5bnhfYW55IFwKKyAgICAgIm0gbW9kcG9ydF83XzAgXAorICAgICBwb3J0X2Zvcl9tb2QwPTEgcG9ydF9mb3JfbW9kMT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xIHBvcnRfZm9yX21vZDM9MSBcCisgICAgIHBvcnRfZm9yX21vZDQ9MSBwb3J0X2Zvcl9tb2Q1PTEgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEgcG9ydF9mb3JfbW9kNz0xOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIFwKKyAgICAgcG9ydF9mb3JfbW9kMD0xIHBvcnRfZm9yX21vZDE9MSBcCisgICAgIHBvcnRfZm9yX21vZDI9MSBwb3J0X2Zvcl9tb2QzPTEgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEgcG9ydF9mb3JfbW9kNT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xIHBvcnRfZm9yX21vZDc9MTsgXAorICAgICAiCisKK2lmICQ/bHlueGFsb3QgJiYgJD9kcmFjX2FueSBcCisgICAgIm0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xMiBwb3J0X2Zvcl9tb2QzPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xMiBwb3J0X2Zvcl9tb2Q1PTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xMiBwb3J0X2Zvcl9tb2Q3PTEyOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMiBcCisgICAgIHBvcnRfZm9yX21vZDQ9MTIgcG9ydF9mb3JfbW9kNT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDY9MTIgcG9ydF9mb3JfbW9kNz0xMjsgXAorICAgICAiCisKK2lmICQ/bHlueGFsb3QgJiYgJD91bml0MCBcCisgICAgInN0a21vZGUgbW9kaWQ9MCIKKyAgICAgCitpZiAkP2x5bnhhbG90ICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTEiCisKK2lmICQ/bHlueGFsb3QgJiYgJD91bml0MyBcCisgICAgInN0a21vZGUgbW9kaWQ9MiIKKworaWYgJD9seW54YWxvdCAmJiAkP3VuaXQ0IFwKKyAgICAic3RrbW9kZSBtb2RpZD0zIgorCitpZiAkP2x5bnhhbG90ICYmICQ/dW5pdDUgXAorICAgICJzdGttb2RlIG1vZGlkPTQiCisKK2lmICQ/bHlueGFsb3QgJiYgJD91bml0NiBcCisgICAgInN0a21vZGUgbW9kaWQ9NSIKKworIyBndWVuZXZlcmUgc2V0dXAKKyMgKGVuYWJsZWQgYnkgYWRkaW5nIHRoZSBwcm9wZXJ0eSAiZ3VlbmV2ZXJlPTEiKQorIyBOb3RlczoKKyMgICAgICAgaGdYIG1hcHBpbmcgYmFzZWQgb24gcGJtcF92YWxpZC4wPTB4MWI3CisjCURyYWNvIHVuaXQgMSBpcyBvbiBIZXJjIHBvcnQgMSAoaGcwL2hwaWMwKSAobW9kIDApCisjCURyYWNvIHVuaXQgMiBpcyBvbiBIZXJjIHBvcnQgMiAoaGcxL2hwaWMxKSAobW9kIDEpCisjCUx5bnggdW5pdCAzIGlzIG9uIEhlcmMgcG9ydCA4IChoZzUvaHBpYzcpIChtb2QgMikKKyMJTHlueCB1bml0IDQgaXMgb24gSGVyYyBwb3J0IDcgKGhnNC9ocGljNikgKG1vZCAzKQorIwlIaWdpZyBjb25uIDAgaXMgb24gSGVyYyBwb3J0IDQgKGhnMi9ocGljMykKKyMJSGlnaWcgY29ubiAxIGlzIG9uIEhlcmMgcG9ydCA1IChoZzMvaHBpYzQpCisjICAgICAgIEhlcmMgcG9ydCAzIC0gVW51c2VkIChocGljMikKKyMgICAgICAgSGVyYyBwb3J0IDYgLSBVbnVzZWQgKGhwaWM1KQoraWYgJD9ndWVuZXZlcmUgJiYgJD91bml0MCBcCisgICAgIiBcCisgICAgIHcgdWMuaHBpYzAgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzAgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzAgMiAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzAgMyAxIDB4MDgwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzEgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzEgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzEgMiAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzEgMyAxIDB4MDgwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzcgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzcgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzcgMiAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzcgMyAxIDB4MDgwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgIHcgdWMuaHBpYzYgMCAxIDB4MDAyOyBcCisgICAgIHcgdWMuaHBpYzYgMSAxIDB4MDA0OyBcCisgICAgIHcgdWMuaHBpYzYgMiAxIDB4MTAwOyBcCisgICAgIHcgdWMuaHBpYzYgMyAxIDB4MDgwOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgOyBcCisgICAgICIKKworaWYgJD9ndWVuZXZlcmUgJiYgJD9seW54X2FueSBcCisgICAgICJtIG1vZHBvcnRfN18wIFwKKyAgICAgcG9ydF9mb3JfbW9kMD0xIHBvcnRfZm9yX21vZDE9MSBcCisgICAgIHBvcnRfZm9yX21vZDI9MSBwb3J0X2Zvcl9tb2QzPTEgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEgcG9ydF9mb3JfbW9kNT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xIHBvcnRfZm9yX21vZDc9MTsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBcCisgICAgIHBvcnRfZm9yX21vZDA9MSBwb3J0X2Zvcl9tb2QxPTEgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEgcG9ydF9mb3JfbW9kMz0xIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xIHBvcnRfZm9yX21vZDU9MSBcCisgICAgIHBvcnRfZm9yX21vZDY9MSBwb3J0X2Zvcl9tb2Q3PTE7IFwKKyAgICAgIgorCitpZiAkP2d1ZW5ldmVyZSAmJiAkP2RyYWNfYW55IFwKKyAgICAibSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MTIgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEyIHBvcnRfZm9yX21vZDU9MTIgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEyIHBvcnRfZm9yX21vZDc9MTI7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xMiBwb3J0X2Zvcl9tb2QzPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xMiBwb3J0X2Zvcl9tb2Q1PTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xMiBwb3J0X2Zvcl9tb2Q3PTEyOyBcCisgICAgICIKKworaWYgJD9ndWVuZXZlcmUgJiYgJD91bml0MSBcCisgICAgInN0a21vZGUgbW9kaWQ9MCIKKyAgICAgCitpZiAkP2d1ZW5ldmVyZSAmJiAkP3VuaXQyIFwKKyAgICAic3RrbW9kZSBtb2RpZD0xIgorCitpZiAkP2d1ZW5ldmVyZSAmJiAkP3VuaXQzIFwKKyAgICAic3RrbW9kZSBtb2RpZD0yIgorCitpZiAkP2d1ZW5ldmVyZSAmJiAkP3VuaXQ0IFwKKyAgICAic3RrbW9kZSBtb2RpZD0zIgorICAgICAKKyMgZmVsaXg0OCBzZXR1cAorIyAoZW5hYmxlZCBieSBhZGRpbmcgdGhlIHByb3BlcnR5ICJmZWxpeDQ4PTEiKQorIyBOb3RlczoKKyMgICAgICAgQkNNNTYxMDIgdW5pdC0wIGhpZ2lnIHBvcnQgKHBvcnQgMjYpIGlzIGNvbm5lY3RlZAorIyAgICAgICB0byBCQ001NjEwMiBVbml0LTEgaGlnaWcgcG9ydCAocG9ydCAyNikKKyMKKworaWYgJD9mZWxpeDQ4ICYmICQ/dW5pdDAgXAorICAgICJzdGttb2RlIG1vZGlkPTAgOyBcCisgICAgIG0gSUVHUl9QT1JUIE1ZX01PRElEPTA7IFwKKyAgICAgbSBYUE9SVF9DT05GSUcgTVlfTU9ESUQ9MDsgXAorICAgICB3IE1PRFBPUlRfTUFQIDEgMSBISUdJR19QT1JUX0JJVE1BUD0weDQgOyBcCisgICAgICIKKworaWYgJD9mZWxpeDQ4ICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTEgOyBcCisgICAgIG0gSUVHUl9QT1JUIE1ZX01PRElEPTE7IFwKKyAgICAgbSBYUE9SVF9DT05GSUcgTVlfTU9ESUQ9MTsgXAorICAgICB3IE1PRFBPUlRfTUFQIDAgMSBISUdJR19QT1JUX0JJVE1BUD0weDQgOyBcCisgICAgICIKKyMgZmJwb2Ugc2V0dXAKKyMgKGVuYWJsZWQgYnkgYWRkaW5nIHRoZSBwcm9wZXJ0eSAiZmJwb2U9MSIpCisjIE5vdGVzOgorIyAgICAgICBCQ001NjUwNCB1bml0LTAgaGlnaWcgcG9ydCAocG9ydCAyNywyOCkgaXMgY29ubmVjdGVkCisjICAgICAgIHRvIEJDTTU2NTA0IFVuaXQtMSBoaWdpZyBwb3J0IChwb3J0IDI3LDI4KQorIworCitpZiAkP3VuaXQwICYmICQ/ZmlyZWJvbHRfYW55ICYmICQ/ZmJwb2UgICAgIFwKKyAgInN0a21vZGUgbW9kaWQ9MDsgICAgICAgICAgIFwKKyAgIHcgbW9kcG9ydF9tYXAgMSAxIEhJR0lHX1BPUlRfQklUTUFQPTB4NDsgXAorICAgbSBISUdJR19UUlVOS19HUk9VUCBISUdJR19UUlVOS19SVEFHMT0zIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQxX1BPUlQwPTIgXAorICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDFfUE9SVDE9MyBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMj0yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQxX1BPUlQzPTM7IFwKKyAgIG0gSElHSUdfVFJVTktfQ09OVFJPTCBISUdJR19UUlVOS19JRDI9MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTksyPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMz0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOSzM9MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfQklUTUFQMT0weGMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElWRV9QT1JUX0JJVE1BUD0weGYiCisKK2lmICQ/dW5pdDEgJiYgJD9maXJlYm9sdF9hbnkgJiYgJD9mYnBvZSBcCisgICJzdGttb2RlIG1vZGlkPTE7IFwKKyAgIHcgbW9kcG9ydF9tYXAgMCAxIEhJR0lHX1BPUlRfQklUTUFQPTB4NDsgXAorICAgbSBISUdJR19UUlVOS19HUk9VUCBISUdJR19UUlVOS19SVEFHMT0zIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQxX1BPUlQwPTIgXAorICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDFfUE9SVDE9MyBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMj0yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQxX1BPUlQzPTM7IFwKKyAgIG0gSElHSUdfVFJVTktfQ09OVFJPTCBISUdJR19UUlVOS19JRDI9MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTksyPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMz0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOSzM9MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfQklUTUFQMT0weGMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElWRV9QT1JUX0JJVE1BUD0weGYiCisKKyMgRHVhbCBSYXB0b3IvUmF2ZW4gYm9hcmRzCitpZiAkP3JhdmVuX2ViXzQ4cCB8fCAkP3JhcDI0X3JlZiBcCisgICAgImxvY2FsIHJjcHVfc3lzdGVtIDEiCitpZiAkP3VuaXQwICYmICQ/cmNwdV9zeXN0ZW0gXAorICAgInN0a21vZGUgbW9kaWQ9MCIKK2lmICQ/dW5pdDEgJiYgJD9yY3B1X3N5c3RlbSBcCisgICAic3RrbW9kZSBtb2RpZD0xIgorCisjIExNIGZiNDggcGxhdGZvcm0gc2V0dXAKKyMgKGVuYWJsZWQgYnkgYWRkaW5nIHRoZSBwcm9wZXJ0eSAibG00OHA9MSIpCisjCitpZiAkP3VuaXQwICYmICQ/ZmlyZWJvbHRfYW55ICYmICQ/bG00OHAgfHwgJD9sbTQ4cF9EIFwKKyAgICJzdGttb2RlIG1vZGlkPTAiCisKK2lmICQ/dW5pdDEgJiYgJD9maXJlYm9sdF9hbnkgJiYgJD9sbTQ4cCB8fCAkP2xtNDhwX0QgXAorICAgInN0a21vZGUgbW9kaWQ9MSIKKworIyBTZXQgRmlyZWJvbHQgUE9FIHBvd2VyIGxldmVsIDE3MCh0b3RhbCkgLSAxMTAoc3dpdGNoKSA9IDYwCitpZiAkP2ZicG9lIFwKKyAgICAgICAgImxvY2FsIHBvZXBvd2VyIDYwIgorCisjIFNldCBEcmFjbzE1IFBPRSBwb3dlciBsZXZlbCAxNzAodG90YWwpIC0gODAoc3dpdGNoKSA9IDkwCitpZiAkP2RyYWMxNVwKKyAgICAgICAgImxvY2FsIHBvZXBvd2VyIDkwIgorCisjIGlmIGVuYWJsZV9wb2UgaXMgc2V0LCB0aGVuIGVuYWJsZSB0aGUgUE9FIHByb2Nlc3NvciBmb3IKKyMgZWl0aGVyIEZpcmVib2x0IG9yIERyYWNvMTUgcGxhdGZvcm0KK2lmICQ/dW5pdDAgJiYgJD9lbmFibGVfcG9lICYmICQ/ZmJwb2UgfHwgJD9kcmFjMTUgXAorICAgICAgICAiJGVjaG8gcmM6IEVuYWJsaW5nIFBPRSAuLi47IFwKKyAgICAgICAgIHBvZXNlbCByZXNldDsgXAorICAgICAgICAgaTJjIHByb2JlIHF1aWV0OyBcCisgICAgICAgICB4cG9lIHZlcmJvc2Ugb2ZmOyBcCisgICAgICAgICB4cG9lIHBvd2VyICRwb2Vwb3dlcjsgXAorICAgICAgICAgeHBvZSB2ZXJib3NlIG9uOyBcCisgICAgICAgICBwb2VzZWwgZW5hYmxlIgorCisjIG1hcmsgdGhpcyB1bml0IHNvIHRoYXQgc3Vic2VxdWVudCByYyBydW5zIGFyZSBxdWlldAorc2V0ZW52IHJjJHVuaXQgMQorCitpZiAkP21hY3NlYyAnXAorICAgIG1hY3NlYyBzeW5jOyBcCisgICAgJGVjaG8gInJjOiBNQUNTRUMgQ0xJIEVuYWJsZWQiJworCisjIGNhY2hlIGEgY29weSBvZiByYy5zb2MgaW4gbWVtb3J5CityY2NhY2hlIGFkZHEgcmMuc29jCisKKyMgc2V0dXAgY2hhc3NpcyBpZiByZXF1ZXN0ZWQKK2lmICEiZXhwciAkP2F1dG9jaGFzc2lzMiAmJiAkdW5pdCA9PSAkdW5pdHMgLSAxIiBcCisgICAgInNldGVudiBjaGFzc2lzMl9ub19yYyAxOyBcCisgICAgIHJjbG9hZCBjMnN3aXRjaC5zb2M7IFwKKyAgICAgc2V0ZW52IGNoYXNzaXMyX25vX3JjOyBcCisgICAgIgorCisjIHN0YXJ0IHN0YWNraW5nIGlmIHJlcXVlc3RlZAoraWYgISJleHByICQ/YXV0b3N0YWNrICYmICR1bml0ID09ICR1bml0cyAtIDEiIFwKKwkicmNsb2FkIHN0ay5zb2MiCisKK2lmICEiZXhwciAkP2FlZGV2ICsgMCIgJiYgISJleHByICR1bml0ID09ICR1bml0cyAtIDEiIFwKKyAgICAgICAiYWVkZXYgaW5pdCIKKworIyBodXJyaWNhbmUgNDhwIEZFIHBsYXRmb3JtIExFRCBzZXR1cCBmb3IgNTYxNDZfQTAgYW5kIDU2MTQ3X0EwIGJvYXJkCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImZlX2h1XzQ4cD0xIikKKyMKK2lmICQ/ZmVfaHVfNDhwICYmICQ/QkNNNTYxNDYgfHwgJD9CQ001NjE0NyBcCisgICAgInBoeSBmZTAgMHgxZiAweDAwOGI7IFwKKyAgICAgcGh5IGZlMCAweDFhIDB4M2YwOTtcCisgICAgIHBoeSBmZTggMHgxZiAweDAwOGI7IFwKKyAgICAgcGh5IGZlOCAweDFhIDB4M2YwOTsgXAorICAgICBwaHkgZmUxNiAweDFmIDB4MDA4YjsgXAorICAgICBwaHkgZmUxNiAweDFhIDB4M2YwOSIKKworcmNsb2FkIGJhbC5zb2MKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMva3QyL3JlYWRtZS50eHQgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2t0Mi9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjdkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL2t0Mi9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMTggQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGJjbSBmaWxlcyB0aGF0IGFyZSBuZWVkZWQgaW4gdGhlIEtUMiBzdmsgZmlsZSBzeXN0ZW0gdG8gYnJpbmcgdXAgCit0aGUgQkNNIERpYWcgU2hlbGwuCitVc2VyIGNhbiBhbHNvIGNvcHkgdGhlIGJjbS51c2VyIGxpbnV4LWtlcm5lbC1iZGUua28gYW5kIGxpbnV4LXVzZXItYmRlLmtvCitmcm9tIGEgcHJpdmF0ZSBiY21fc2RrIGJ1aWxkIHRvIHRoZSBzYW1lIEtUMiBzdmsgZmlsZSBzeXN0ZW0uCishISEKKyAgIERvIG5vdCBmb3JnZXQgdG8gY2hhbmdlIHRoZSBJUCBpbiBiYWwuc29jIHRvIHBvaW50IGl0IHRvIHRoZSBCQUxfQ09SRQorISEhCisKK1RoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGJjbV9zZGsgdmVyc2lvbiBpcyA2LjQuNAorLgorfC0tIGJhbC5zb2MKK3wtLSBiY20udXNlcgorfC0tIGxpbnV4LWtlcm5lbC1iZGUua28KK3wtLSBsaW51eC11c2VyLWJkZS5rbworfC0tIHJjLnNvYworIAorICAKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvYmNtODg0NzBfYm9hcmQuc29jIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvYmNtODg0NzBfYm9hcmQuc29jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI5NDQyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9iY204ODQ3MF9ib2FyZC5zb2MKQEAgLTAsMCArMSwyMTEgQEAKKyMgJElkOgorIyAkQ29weXJpZ2h0OiAoYykgMTk5OC0yMDAxIEJyb2FkY29tIENvcnAuCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJAorIworCisjIERyYW0gZHEgc3dhcHMgZm9yIEJDTTg4NDcwCisKKyNEcmFtIEhXIHByb3BlcnRpZXMKKworI1JYIHBvbGFyaXR5Citjb25maWcgYWRkIHBoeV9yeF9wb2xhcml0eV9mbGlwLkJDTTg4NDcwPTAKKworCisjVFggcG9sYXJpdHkKK2NvbmZpZyBhZGQgcGh5X3R4X3BvbGFyaXR5X2ZsaXAuQkNNODg0NzA9MAorCisjcnggbGFuZSBzd2FwCitjb25maWcgYWRkIHBoeV9yeF9sYW5lX21hcC5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3J4X2xhbmVfbWFwX3F1YWQwLkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfcnhfbGFuZV9tYXBfcXVhZDEuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV9yeF9sYW5lX21hcF9xdWFkMi5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3J4X2xhbmVfbWFwX3F1YWQzLkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfcnhfbGFuZV9tYXBfcXVhZDQuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV9yeF9sYW5lX21hcF9xdWFkNS5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3J4X2xhbmVfbWFwX3F1YWQ2LkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfcnhfbGFuZV9tYXBfcXVhZDcuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV9yeF9sYW5lX21hcF9xdWFkOC5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3J4X2xhbmVfbWFwX3F1YWQ5LkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfcnhfbGFuZV9tYXBfcXVhZDEwLkJDTTg4NDcwPTB4MzEyMAorY29uZmlnIGFkZCBwaHlfcnhfbGFuZV9tYXBfcXVhZDExLkJDTTg4NDcwPTB4MzIxMAorCisKKyN0eCBsYW5lIHN3YXAKK2NvbmZpZyBhZGQgcGh5X3R4X2xhbmVfbWFwLkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfdHhfbGFuZV9tYXBfcXVhZDAuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV90eF9sYW5lX21hcF9xdWFkMS5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3R4X2xhbmVfbWFwX3F1YWQyLkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfdHhfbGFuZV9tYXBfcXVhZDMuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV90eF9sYW5lX21hcF9xdWFkNC5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3R4X2xhbmVfbWFwX3F1YWQ1LkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfdHhfbGFuZV9tYXBfcXVhZDYuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV90eF9sYW5lX21hcF9xdWFkNy5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3R4X2xhbmVfbWFwX3F1YWQ4LkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfdHhfbGFuZV9tYXBfcXVhZDkuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV90eF9sYW5lX21hcF9xdWFkMTAuQkNNODg0NzA9MHgzMTIwCitjb25maWcgYWRkIHBoeV90eF9sYW5lX21hcF9xdWFkMTEuQkNNODg0NzA9MHgzMjEwCisKKyMgRHJhbSBkcSBzd2FwcyBmb3IgQkNNODg0NzAKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUwX2JpdDAuQkNNODg0NzA9MQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTBfYml0MS5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMF9iaXQyLkJDTTg4NDcwPTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUwX2JpdDMuQkNNODg0NzA9NAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTBfYml0NC5CQ004ODQ3MD0zCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMF9iaXQ1LkJDTTg4NDcwPTIKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUwX2JpdDYuQkNNODg0NzA9NgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTBfYml0Ny5CQ004ODQ3MD03Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMV9iaXQwLkJDTTg4NDcwPTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUxX2JpdDEuQkNNODg0NzA9MworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTFfYml0Mi5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMV9iaXQzLkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUxX2JpdDQuQkNNODg0NzA9NAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTFfYml0NS5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMV9iaXQ2LkJDTTg4NDcwPTYKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUxX2JpdDcuQkNNODg0NzA9MgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTJfYml0MC5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMl9iaXQxLkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUyX2JpdDIuQkNNODg0NzA9NworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTJfYml0My5CQ004ODQ3MD0zCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMl9iaXQ0LkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUyX2JpdDUuQkNNODg0NzA9MgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTJfYml0Ni5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMl9iaXQ3LkJDTTg4NDcwPTYKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUzX2JpdDAuQkNNODg0NzA9MworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTNfYml0MS5CQ004ODQ3MD0yCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlM19iaXQyLkJDTTg4NDcwPTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUzX2JpdDMuQkNNODg0NzA9NworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTNfYml0NC5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlM19iaXQ1LkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUzX2JpdDYuQkNNODg0NzA9NAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTNfYml0Ny5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMF9iaXQwLkJDTTg4NDcwPTYKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUwX2JpdDEuQkNNODg0NzA9NworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTBfYml0Mi5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMF9iaXQzLkJDTTg4NDcwPTMKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUwX2JpdDQuQkNNODg0NzA9MQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTBfYml0NS5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMF9iaXQ2LkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUwX2JpdDcuQkNNODg0NzA9MgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTFfYml0MC5CQ004ODQ3MD0zCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMV9iaXQxLkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUxX2JpdDIuQkNNODg0NzA9NQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTFfYml0My5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMV9iaXQ0LkJDTTg4NDcwPTAKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUxX2JpdDUuQkNNODg0NzA9MgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTFfYml0Ni5CQ004ODQ3MD03Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMV9iaXQ3LkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUyX2JpdDAuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTJfYml0MS5CQ004ODQ3MD0zCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMl9iaXQyLkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUyX2JpdDMuQkNNODg0NzA9NAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTJfYml0NC5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMl9iaXQ1LkJDTTg4NDcwPTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUyX2JpdDYuQkNNODg0NzA9NworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTJfYml0Ny5CQ004ODQ3MD0yCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlM19iaXQwLkJDTTg4NDcwPTIKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUzX2JpdDEuQkNNODg0NzA9NgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTNfYml0Mi5CQ004ODQ3MD0xCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlM19iaXQzLkJDTTg4NDcwPTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUzX2JpdDQuQkNNODg0NzA9NAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTNfYml0NS5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlM19iaXQ2LkJDTTg4NDcwPTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUzX2JpdDcuQkNNODg0NzA9MworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTBfYml0MC5CQ004ODQ3MD03Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMF9iaXQxLkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUwX2JpdDIuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTBfYml0My5CQ004ODQ3MD0yCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMF9iaXQ0LkJDTTg4NDcwPTMKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUwX2JpdDUuQkNNODg0NzA9MQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTBfYml0Ni5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMF9iaXQ3LkJDTTg4NDcwPTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUxX2JpdDAuQkNNODg0NzA9MgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTFfYml0MS5CQ004ODQ3MD00Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMV9iaXQyLkJDTTg4NDcwPTAKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUxX2JpdDMuQkNNODg0NzA9NgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTFfYml0NC5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMV9iaXQ1LkJDTTg4NDcwPTMKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUxX2JpdDYuQkNNODg0NzA9MQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTFfYml0Ny5CQ004ODQ3MD03Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMl9iaXQwLkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUyX2JpdDEuQkNNODg0NzA9NworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTJfYml0Mi5CQ004ODQ3MD0zCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMl9iaXQzLkJDTTg4NDcwPTYKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUyX2JpdDQuQkNNODg0NzA9NQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTJfYml0NS5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMl9iaXQ2LkJDTTg4NDcwPTIKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUyX2JpdDcuQkNNODg0NzA9NAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTNfYml0MC5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlM19iaXQxLkJDTTg4NDcwPTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUzX2JpdDIuQkNNODg0NzA9NAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTNfYml0My5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlM19iaXQ0LkJDTTg4NDcwPTIKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUzX2JpdDUuQkNNODg0NzA9NQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTNfYml0Ni5CQ004ODQ3MD0zCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlM19iaXQ3LkJDTTg4NDcwPTEKKworIyBEcmFtIGJhbmsgYWRkciBzd2FwcyBmb3IgQkNNODg0NzAKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQ3LkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQxMS5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTBfYml0MTMuQkNNODg0NzA9MTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQxNC5CQ004ODQ3MD0xNworY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0wX2JpdDUuQkNNODg0NzA9NgorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0wX2JpdDAuQkNNODg0NzA9NworY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0wX2JpdDguQkNNODg0NzA9OAorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0wX2JpdDEuQkNNODg0NzA9OQorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0wX2JpdDQuQkNNODg0NzA9MTAKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQxNi5CQ004ODQ3MD0xMQorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0wX2JpdDE1LkJDTTg4NDcwPTEyCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTBfYml0MTIuQkNNODg0NzA9MTMKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQ2LkJDTTg4NDcwPTAKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQyLkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQ5LkJDTTg4NDcwPTIKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQxMC5CQ004ODQ3MD0xNAorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0wX2JpdDE3LkJDTTg4NDcwPTE2Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0MTAuQkNNODg0NzA9NAorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0xX2JpdDE0LkJDTTg4NDcwPTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMV9iaXQ3LkJDTTg4NDcwPTE1Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0MTIuQkNNODg0NzA9MTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMV9iaXQ0LkJDTTg4NDcwPTYKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMV9iaXQ2LkJDTTg4NDcwPTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMV9iaXQ5LkJDTTg4NDcwPTgKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMV9iaXQxLkJDTTg4NDcwPTkKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMV9iaXQ1LkJDTTg4NDcwPTEwCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0MTEuQkNNODg0NzA9MTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMV9iaXQ4LkJDTTg4NDcwPTEyCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0MTMuQkNNODg0NzA9MTMKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMV9iaXQwLkJDTTg4NDcwPTAKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMV9iaXQxNS5CQ004ODQ3MD0xCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0Mi5CQ004ODQ3MD0yCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0MTcuQkNNODg0NzA9MTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMV9iaXQxNi5CQ004ODQ3MD0xNgorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0yX2JpdDE1LkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQ1LkJDTTg4NDcwPTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQxMS5CQ004ODQ3MD0xNQorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0yX2JpdDcuQkNNODg0NzA9MTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQxNy5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTJfYml0MC5CQ004ODQ3MD03Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTJfYml0MTYuQkNNODg0NzA9OAorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0yX2JpdDIuQkNNODg0NzA9OQorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0yX2JpdDEzLkJDTTg4NDcwPTEwCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTJfYml0OS5CQ004ODQ3MD0xMQorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0yX2JpdDEyLkJDTTg4NDcwPTEyCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTJfYml0Ni5CQ004ODQ3MD0xMworY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0yX2JpdDE0LkJDTTg4NDcwPTAKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQ4LkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQxLkJDTTg4NDcwPTIKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQ0LkJDTTg4NDcwPTE0Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTJfYml0MTAuQkNNODg0NzA9MTYKKworIyNEcmFtIEhXIHByb3BlcnRpZXMKK2NvbmZpZyBhZGQgZXh0X3JhbV9wcmVzZW50LkJDTTg4NDcwPTMKK2NvbmZpZyBhZGQgZHJhbV90eXBlX0REUjRfTUlDUk9OX1k0MDE2QUFCR19KRF9GXzRHQklUPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9mcmVxLkJDTTg4NDcwPTE2MDAKK2NvbmZpZyBhZGQgZXh0X3JhbV9hYmkuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX3dyaXRlX2RiaS5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fcmVhZF9kYmkuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX3dyaXRlX2NyYy5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fcmVhZF9jcmMuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX2NtZF9wYXJfbGF0ZW5jeS5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fdHlwZS5CQ004ODQ3MD1ERFI0Citjb25maWcgYWRkIGV4dF9yYW1fdG90YWxfc2l6ZS5CQ004ODQ3MD0zMDAwCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L2NvbWJvMjhfZHJhbS5zb2MgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9jb21ibzI4X2RyYW0uc29jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0N2MxZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9jb21ibzI4X2RyYW0uc29jCkBAIC0wLDAgKzEsNTYwIEBACisjCisjICRJZDogY29tYm8yOF9kcmFtLnNvYyx2IDEuMCAyMDE0LzA0LzI4IDE1OjUwOjAwIG5oZWZldHogRXhwICQKKyMKKyMgJENvcHlyaWdodDogKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4kCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIEdlbmVyYWwgTm90ZXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE91ciBjb250cm9sbGVyIHN1cHBvcnQgYm90aCBERFI0IGFuZCBHRERSNSwgd2UgbmVlZCB0byAibW9kaWZ5IiBleHRfcmFtX2NvbHVtbnMgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisjICAgRm9yIEREUjQsIG5lZWQgdG8gdXNlIGNvbHVtbiBudW1iZXIgYXMgaW4gRFJBTSBEYXRhIFNoZWV0LCBtZWFuaW5nIDEwMjQgaW4gZHJhbXMgc3VwcG9ydGVkLgorIyAgIEZvciBHRERSNSwgbmVlZCB0byBtdWx0aXBseSBudW1iZXIgaW4gRGF0YSBTaGVldCBieSA4IChyZXByZXNlbnRpbmcgdGhlIDMgYWRkcmVzcyBiaXRzLCB3aGljaCBhcmUgY29uc3RhbnQgMDAwIGluIEREUjQuKSwgbWVhbmluZyA1MTIgaW4gZHJhbXMgc3VwcG9ydGVkLgorCisKK2lmICQ/ZHJhbV90eXBlX0REUjRfU0FNU1VOR19LNEE0RzE2NVdEXzRHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUREUjQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTI2MDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ1MzIwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTEzMzIwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTEzMzIwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX2w9OGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfcz03YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zMjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTEzMzIwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MzAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz0xMGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfbD0xMGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz00YztcXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD0xMGM7XFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9NmM7XFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF96cWNzPTEyOGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfYWxlcnQ9MTMwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yc3Q9NTAwMDAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTM5MDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTEyYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTE3YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz0xMDI0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTMyNzY4OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz04OyIKKworaWYgJD9kcmFtX3R5cGVfRERSNF9NSUNST05fRURZNDAxNkFBQkdfRFJGUl80R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1ERFI0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0yNjAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NTMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xMzMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xMzMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9N2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzIwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xMzMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTMwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX3M9MTBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9MTBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX3M9NGM7XFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX2w9MTBjO1xcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9sPTZjO1xcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9zPTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfenFjcz0xMjhjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX2FsZXJ0PTEzMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnN0PTUwMDAwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0zOTAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xNmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0wO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9MTAyNDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz0zMjc2ODsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9ODsiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOb3RlOiBOb3QgZm9yIG5ldyBkZXNpZ24gbm90IHJlY29tbWVuZGVkIHRvIGJlIHVzZWQgYW5kIG5vdCBzdXBwb3J0ZWQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgJD9kcmFtX3R5cGVfRERSNF9NSUNST05fTVQ0MEEyNTZNMTZIQV8wODNFQV80R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1ERFI0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0yNjAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xNTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xNTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPTExYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9zPTljO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTMyMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNDkwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0zMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9zPTEyYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9sPTEyYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9zPTRjO1xcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPTEyYztcXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2RfbD04YztcXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3pxY3M9MTcwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY19hbGVydD0xMzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD01MDAwMDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MzkwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9MThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MjRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfYWw9MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTEwMjQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MzI3Njg7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTg7IgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTm90ZTogTm90IGZvciBuZXcgZGVzaWduIG5vdCByZWNvbW1lbmRlZCB0byBiZSB1c2VkIGFuZCBub3Qgc3VwcG9ydGVkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmICQ/ZHJhbV90eXBlX0REUjRfTUlDUk9OX01UNDBBNTEyTTE2XzhHQklUICJcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9RERSNDsgXAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0zNTAwMDA7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ1MzIwO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTMzMjA7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xMzMyMDtcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX2w9OGM7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9zPTdjO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzIwMDA7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE1MDAwO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MzAwMDA7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9zPTEwYztcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9MTBjO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz00YztcXAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPTEwYztcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9OGM7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9zPTRjO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF96cWNzPTEyOGM7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY19hbGVydD0xMzAwMDtcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnN0PTUwMDAwMDAwMDtcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTM5MDAwMDA7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9MTJjO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xNmM7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTA7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTEwMjQ7IFwKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz02NTUzNjsgXAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTEzMzIwO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9ODsiCisKK2lmICQ/ZHJhbV90eXBlX0REUjRfSFlOSVhfSDVBTjRHNk5NRlJfVkpDXzRHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUREUjQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTI2MDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ1MzIwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTEzMzIwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTEzMzIwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX2w9OGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfcz00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zMjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTEzMzIwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MzAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz03NTAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9NzUwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9zPTI1MDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD03NTAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9OGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3pxY3M9MTI4YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY19hbGVydD0xMzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY193cl9sYXRlbmN5PTEyYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD01MDAwMDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MzkwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9MTZjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MjBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfYWw9MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTEwMjQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MzI3Njg7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTg7IgorCitpZiAkP2RyYW1fdHlwZV9ERFI0X01JQ1JPTl9ZNDAxNkFBQkdfSkRfRl80R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1ERFI0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0yNjAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xNTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xNTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPTExYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9zPTljO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTMyMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNDkwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0zMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9zPTEyYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9sPTEyYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9zPTRjO1xcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPTEyYztcXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2RfbD04YztcXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3pxY3M9MTcwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY19hbGVydD0xMzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD01MDAwMDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MzkwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9MTZjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MjRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfYWw9MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTEwMjQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MzI3Njg7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTg7IgorCitpZiAkP2RyYW1fdHlwZV9HRERSNV9TQU1TVU5HX0s0RzIwMzI1RkRfMkdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9R0REUjU7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTc4MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDgwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTYwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD02MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9NjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zNDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE0MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTYwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MjQwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF8zMmF3PTE5MjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9zPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz04YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPTEwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9sPTNjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MTkwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9M2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0yMGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfcmRfbGF0ZW5jeT0zYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY193cl9sYXRlbmN5PTE0YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD0yMDAwMDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0xYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTUxMjsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz04MTkyOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz0xNjsiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOb3RlOiBOb3QgZm9yIG5ldyBkZXNpZ24gbm90IHJlY29tbWVuZGVkIHRvIGJlIHVzZWQgYW5kIG5vdCBzdXBwb3J0ZWQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgJD9kcmFtX3R5cGVfR0REUjVfU0FNU1VOR19LNEc0MTMyNUZDXzRHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUdERFI1OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0xMTAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00ODAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xNTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xNjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPTYwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfcz02MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTM0MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTQwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0yNDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90XzMyYXc9MTkyMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX3M9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfbD00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9zPThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX2w9MTBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9M2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz0yYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0xOTAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT0zYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTIwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY19yZF9sYXRlbmN5PTNjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX3dyX2xhdGVuY3k9MTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnN0PTIwMDAwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTFjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9NTEyOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTE2Mzg0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz0xNjsiCisKKyNpZiAkP2RyYW1fdHlwZV9HRERSNV9IWU5JWF9INUdRMkgyNEFGUl9SMENfMkdCSVQgIlwKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUdERFI1OyBcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MTIwMDAwO1wKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ4MDAwO1wKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xNDAwMDtcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTgwMDA7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX2w9OWM7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9OWM7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTMyMDAwO1wKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE2MDAwO1wKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE2MDAwO1wKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0zMDAwMDtcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF8zMmF3PTI0NTAwMDtcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz0yYztcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfbD0yYztcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz04YztcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD04YztcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2RfbD0zYztcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz0yYztcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MzkwMDAwMDtcCisjICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTNjO1wKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTE2YztcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfcmRfbGF0ZW5jeT0yYztcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfd3JfbGF0ZW5jeT0xMWM7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnN0PTIwMDAwMDAwMDtcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0xYztcCisjICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz01MTI7IFwKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTgxOTI7IFwKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz0xNjsiCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgRUxQSURBIEdERFI1CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmICQ/ZHJhbV90eXBlX0dERFI1X01JQ1JPTl9FRFc0MDMyQ0FCR180R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1HRERSNTsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9OTAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xMzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xNzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfcz01MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTI3MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTcwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xODAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0yMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90XzMyYXc9MTYwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX3M9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfbD0yYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9zPTdjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX2w9N2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2RfbD0zYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9zPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTE5MDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX3JkX2xhdGVuY3k9M2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfd3JfbGF0ZW5jeT0xMWM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yc3Q9MjAwMDAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfYWw9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz01MTI7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MTYzODQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTE2OyIKKworaWYgJD9kcmFtX3R5cGVfR0REUjVfSFlOSVhfSDVHQzRIMjRNRlJfVDJDXzRHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUdERFI1OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0xMjAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00ODAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xNDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xODAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPTljO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9OWM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzIwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xNjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE2MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTMwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfMzJhdz0yNDUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz0yYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9sPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX3M9OGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD04YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9sPTNjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MTkwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xOGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfcmRfbGF0ZW5jeT0yYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY193cl9sYXRlbmN5PTEzYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD0yMDAwMDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0xYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTUxMjsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz0xNjM4NDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9MTY7IgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOb3RlOiBGb3IgZXh0ZW5kZWQgZGV2aWNlcyBmb3IgZXhhbXBsZSBNaWNyb24gZHJhbV90eXBlX0REUjRfTUlDUk9OX01UNDBBMjU2TTE2SEFfMDgzRQorIyAgICAgICBwbGVhc2UgdXNlIG5vbmUgZXh0ZW5kZWQgcGFyYW1ldGVycyBmb3IgZXhhbXBsZSBkcmFtX3R5cGVfRERSNF9NSUNST05fTVQ0MEEyNTZNMTZIQV8wODMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZiAkP2RyYW1fdHlwZV9ERFI0X01JQ1JPTl9NVDQwQTI1Nk0xNkhBXzA4M180R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1ERFI0O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2ZyZXE9MTIwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0yNjAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NjE2MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xNDE2MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xNDE2MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9N2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzIwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xNDE2MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTMwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX3M9MTBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9MTBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX3M9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD0xMGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2RfbD02YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9zPTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfenFjcz0xMjhjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX2FsZXJ0PTEzMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnN0PTUwMDAwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0zOTAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0wO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9MTAyNDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTMyNzY4O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTg7XAorICBjb25maWcgZGVsZXRlIGV4dF9yYW1fY21kX3Bhcl9sYXRlbmN5KjtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jbWRfcGFyX2xhdGVuY3k9NTtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTE3YzsiCitleHByICRleHRfcmFtX3dyaXRlX2RiaSswID09IDEKK2lmICQ/ICYmICQ/ZHJhbV90eXBlX0REUjRfTUlDUk9OX01UNDBBMjU2TTE2SEFfMDgzXzRHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTIwYzsiCisKK2lmICQ/ZHJhbV90eXBlX0REUjRfTUlDUk9OX01UNDBBNTEyTTE2SEFfMDgzXzhHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUREUjQ7XAorICBjb25maWcgYWRkIGV4dF9yYW1fZnJlcT0xMjAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTM1MDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ2MTYwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTE0MTYwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTE0MTYwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX2w9OGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfcz03YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zMjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE0MTYwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MzAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz0xMGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfbD0xMGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPTEwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9sPTZjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF96cWNzPTEyOGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfYWxlcnQ9MTMwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yc3Q9NTAwMDAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTM5MDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTEyYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz0xMDI0O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9NjU1MzY7XAorICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9ODtcCisgIGNvbmZpZyBkZWxldGUgZXh0X3JhbV9jbWRfcGFyX2xhdGVuY3kqO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NtZF9wYXJfbGF0ZW5jeT01O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTdjOyIKK2V4cHIgJGV4dF9yYW1fd3JpdGVfZGJpKzAgPT0gMQoraWYgJD8gJiYgJD9kcmFtX3R5cGVfRERSNF9NSUNST05fTVQ0MEE1MTJNMTZIQV8wODNfOEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MjBjOyIKKworaWYgJD9kcmFtX3R5cGVfRERSNF9NSUNST05fTVQ0MEEyNTZNMTZHRV8wNjJfNEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9RERSNDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9mcmVxPTE2MDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MjYwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDcwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD0xMWM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfcz05YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zMjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTQ5MDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MzAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfbD0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPTEyYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9sPThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF96cWNzPTE3MGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfYWxlcnQ9MTMwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yc3Q9NTAwMDAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTM5MDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTE2YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz0xMDI0O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MzI3Njg7XAorICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9ODtcCisgIGNvbmZpZyBkZWxldGUgZXh0X3JhbV9jbWRfcGFyX2xhdGVuY3kqO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NtZF9wYXJfbGF0ZW5jeT04O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MjRjOyIKK2V4cHIgJGV4dF9yYW1fd3JpdGVfZGJpKzAgPT0gMQoraWYgJD8gJiYgJD9kcmFtX3R5cGVfRERSNF9NSUNST05fTVQ0MEEyNTZNMTZHRV8wNjJfNEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MjhjOyIKKworaWYgJD9kcmFtX3R5cGVfRERSNF9TQU1TVU5HX0s0QTRHMTY1V0VfNEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9RERSNDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9mcmVxPTEyMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MjYwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDYxNjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTQxNjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTQxNjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD04YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9zPTdjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTMyMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTQxNjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0zMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9zPTEwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9sPTEwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9zPTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX2w9MTBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9NmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3pxY3M9MTI4YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY19hbGVydD0xMzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD01MDAwMDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MzkwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9MTJjIDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz0xMDI0O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MzI3Njg7XAorICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9ODtcCisgIGNvbmZpZyBkZWxldGUgZXh0X3JhbV9jbWRfcGFyX2xhdGVuY3kqO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NtZF9wYXJfbGF0ZW5jeT01O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTdjOyIKK2V4cHIgJGV4dF9yYW1fd3JpdGVfZGJpKzAgPT0gMQoraWYgJD8gJiYgJD9kcmFtX3R5cGVfRERSNF9TQU1TVU5HX0s0QTRHMTY1V0VfNEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MjBjOyIKKworaWYgJD9kcmFtX3R5cGVfR0REUjVfTUlDUk9OX01UNTFLMjU2TTMySEZfNTBfOEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9R0REUjU7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MTEwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDQwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTIwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTcwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD01MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9NTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0yNzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE3MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTgwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MjAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF8zMmF3PTE2MDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9zPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz02YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPTZjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz0yYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0xOTAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY19yZF9sYXRlbmN5PTNjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX3dyX2xhdGVuY3k9MTFjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnN0PTIwMDAwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9MTAyNDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTE2Mzg0O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTE2O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTZjOyIKK2V4cHIgJGV4dF9yYW1fd3JpdGVfZGJpPT0xCitpZiAkPyAmJiAkP2RyYW1fdHlwZV9HRERSNV9NSUNST05fTVQ1MUsyNTZNMzJIRl81MF84R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xNmM7IgorCitpZiAkP2RyYW1fdHlwZV9HRERSNV9TQU1TVU5HX0s0RzQxMzI1RkVfSEMyOF80R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1HRERSNTtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0xMTAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00ODAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xNTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xNjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPTYwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfcz02MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTM0MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTQwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0yNDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90XzMyYXc9MTkyMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX3M9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfbD00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9zPTNjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX2w9OGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2RfbD0zYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9zPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTE5MDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTNjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX3JkX2xhdGVuY3k9M2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfd3JfbGF0ZW5jeT0xNGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yc3Q9MjAwMDAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfYWw9MWM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz01MTI7XAorICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz0xNjM4NDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz0xNjtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTE4YzsiCitleHByICRleHRfcmFtX3dyaXRlX2RiaSswID09IDEKK2lmICQ/ICYmICQ/ZHJhbV90eXBlX0dERFI1X1NBTVNVTkdfSzRHNDEzMjVGRV9IQzI4XzRHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTE5YzsiCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9jb25maWcuYmNtIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvY29uZmlnLmJjbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NjQ1ZGEzCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvY29uZmlnLmJjbQpAQCAtMCwwICsxLDI5MTAgQEAKKyMKKyMgJElkOiBjb25maWctc2FuZC5iY20sdiAxLjE0MCAyMDEzLzA5LzIyIDE0OjI5OjQ3IHRvbWVybWEgRXhwICQKKyMKKyMgJENvcHlyaWdodDogKGMpIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4kCisKKyNwY2lfb3ZlcnJpZGVfZGV2LjA9MHg4Mzc1CisKKyMgTm90ZTogY29tbWVudCBzaXplIGlzIHJlc3RyaWN0ZWQgdG8gMTI4IGNoYXJlY3RlcnMgcGVyIGxpbmUuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjI2NmZyBmb3IgQkNNODg2NDAgKFBldHJhQiksIEJDTTg4NjUwIChBcmFkKSBhbmQgQkNNODgyMDIgKEFyZG9uKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMgdGVtcG9yYXJ5IHN1cHByZXNzaW5nIHVua25vd24gc29jIHByb3BlcnRpZXMgd2FybmluZ3MgLSB0aWxsIGFkZGluZyB0aGVtIHVua25vd24gdG8gcHJvcGVydHkuaC9wcm9wZ2VuCisjIyAobmVlZCB0byBiZSB0aGUgZmlyc3Qgc29jIHByb3BlcnR5IGluIHRoZSBmaWxlKS4KK3N1cHByZXNzX3Vua25vd25fcHJvcF93YXJuaW5ncz0xCisKKworIyMgTXVsdGkgZGV2aWNlIHN5c3RlbSAoTmVnZXYpOiAyIGRldmljZXMsIGZhYnJpYyBtb2RlIGlzIEZFLCBtb2QgaWQgaXMgc2xvdCBpZAorIyMgKFRvcCBsaW5lIGNhcmQgaXMgMCwgYnV0dG9uIGlzIDEpLgorI2RpYWdfY2hhc3Npcz0xCisKKyMjIERpc2FibGUgZGlhZyBpbml0IGFwcGxpY2F0aW9uLiBTaG91bGQgYmUgdXNlZCBpZiBvbmUgd2FudHMgdG8gcnVuIGhpcyBvd24KKyMjIGFwcGxpY2F0aW9uIGluc3RlYWQgb2YgdGhlIGRpYWcgaW5pdCBleGFtcGxlCisjZGlhZ19kaXNhYmxlPTEKKworIyMgU2tpcCBjb3NxIGNvbmZpZ3VyYXRpb24gaW4gZGlhZ19pbml0CisjZGlhZ19jb3NxX2Rpc2FibGU9MQorIworCitzdGFja19lbmFibGUuQkNNODg2ODA9MQordGRtYV90aW1lb3V0X3VzZWMuQkNNODg2ODA9MzAwMDAwMAordHNsYW1fdGltZW91dF91c2VjLkJDTTg4NjgwPTMwMDAwMDAKK2RpYWdfZW11bGF0b3JfcGFydGlhbF9pbml0LkJDTTg4NjgwPTAKK3BoeV9zaW11bC5CQ004ODY4MD0wCisKKworIyMgU2tpcCBsMiBjb25maWd1cmF0aW9uIGluIGRpYWdfaW5pdAorI2RpYWdfbDJfZGlzYWJsZT0xCisKKyMjIEwyIG1vZGUgdG8gbG9hZCAwPURFRkFVTFQsIDE9SU5HUkVTU19ESVNULCAyPUlOR1JFU1NfQ0VOVCwgMz1FR1JFU1NfRElTVCwgND1FR1JFU1NfQ0VOVCwgNT1FR1JFU1NfSU5ERVBFTkRFTlQKKyMgICAgICAgICAgICAgICAgICA2PShJTkdSRVNTX0NFTlQgKyBMRUFSTl9DUFUpLCA3PShFR1JFU1NfQ0VOVCArIExFQVJOX0NQVSkKKyNsMl9tb2RlPTAKKworIyMgU2tpcCBzdGsgY29uZmlndXJhdGlvbiBpbiBkaWFnX2luaXQKKyNkaWFnX25vX2FwcGxfc3RrPTEKKworIyMgU2tpcCBpdG1oIHByb2dyYW1tYWJsZSBtb2RlIGNvbmZpZ3VyYXRpb24gaW4gZGlhZ19pbml0CisjZGlhZ19ub19pdG1oX3Byb2dfbW9kZT0xCisKKyMgSW5ncmVzcyBQTUYga2V5IGFsbG9jYXRpb24gb3B0aW1pemF0aW9uCitmaWVsZF9rZXlfYWxsb2NhdGlvbl9tc2JfYmFsYW5jZV9lbmFibGU9MQorCisjIyBTZXQgbW9kaWQgdmFsdWUuIFNob3VsZCBiZSB1c2VkIHdoZW4gcnVubmluZyBtdWx0aS1mYXAgc3lzdGVtLgorIyMgRWFjaCBmYXAgc2hvdWxkIGhhdmUgaXQncyB1bmlxdWUgbW9kaWQgdmFsdWUuIERlZmF1bHQgaXMgZGVzY3JpYmVkIGluIGRpYWdfY2hhc3Npcy4KKyNtb2R1bGVfaWQ9PG1vZGlkPgorCisjIyBTZXQgYmFzZV9tb2RpZCB2YWx1ZS4gRGVmYXVsdCBpcyAwLgorI2Jhc2VfbW9kdWxlX2lkPTxiYXNlX21vZGlkPgorCisjIyBTZXQgbm9mX2RldmljZXMgdmFsdWUuIFNob3VsZCBiZSBzZXQgd2hlbiB3b3JraW5nIG9uIG11bHRpLWZhcHMgc3lzdGVtLgorIyMgRGVmYXVsdCBpcyAxIHdoZW4gZGlhZ19jaGFzc2lzIGlzIG5vdCBlbmFibGVkLCBvciAyIHdoZW4gZGlhZ19jaGFzc2lzIGlzIGVuYWJsZWQuCisjbl9kZXZpY2VzPTxub2ZfZGV2aWNlcz4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjY2ZnIGZvciBCQ004ODY1MCAtIEFyYWQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyBEZXZpY2UgY29uZmlndXJhdGlvbiAjIyMKKworIyMgQWN0aXZhdGUgRW11bGF0aW9uIHBhcnRpYWwgaW5pdC4gVmFsdWVzOiAwIC0gTm9ybWFsLCAxIC0gRW11bGF0aW9uIC5EZWZhdWx0OiAweDAuCitkaWFnX2VtdWxhdG9yX3BhcnRpYWxfaW5pdC5CQ004ODY1MD0wCisjZGlhZ19lbXVsYXRvcl9wYXJ0aWFsX2luaXQuQkNNODgyNzA9MQorI2RpYWdfZW11bGF0b3JfcGFydGlhbF9pbml0LkJDTTg4NjgwPTEKKyNkaWFnX2VtdWxhdG9yX3BhcnRpYWxfaW5pdC5CQ004ODY3NT0yCisKKyNyZWFsIHBoeSBpc24ndCBjb25uZWN0ZWQgLSByZW1vdmUgb24gc2lsaWNvbiBhcnJpdmFsCisjcGh5X3NpbXVsLkJDTTg4Njc1PTEKKworIyMgR2VuZXJhbAorIyBTZXQgdGhlIEZBUCBEZXZpY2UgbW9kZQorIyBPcHRpb25zOiBQUCAvIFRNIC8gVERNX09QVElNSVpFRCAvIFRETV9TVEFOREFSRAorZmFwX2RldmljZV9tb2RlLkJDTTg4NjUwPVBQCisjCisjIEZJWE1FOiBTREstOTE4MzMKKyMgUFAgRml4ZWQgRm9sbG93ZWQgU0RLLTkxNjYyCisjCisKKyMgT3B0aW9uczogU1lNTUVUUklDIC8gQVNZTU1FVFJJQyAvIFNJTkdMRV9DT1JFCisjIEZvciBmYXN0ZXIgZW11bGF0aW9uLCB1c2UgU0lOR0xFX0NPUkUKK2RldmljZV9jb3JlX21vZGUuQkNNODg2NzU9U1lNTUVUUklDCitkZXZpY2VfY29yZV9tb2RlLkJDTTg4NjgwPVNZTU1FVFJJQworIyMgQ3JlZGl0IHdvcnRoIHNpemUgKEJ5dGVzKQorY3JlZGl0X3NpemUuQkNNODg2NTA9MTAyNAorCisjIyBLQlAgcmVjb3ZlcnkgLSBhbGxvdyBmb3IgcmVjb3Zlcnkgc2VxdWVuY2UgdG8gcnVuIGR1cmluZyBpbml0IGFuZCBzb2Z0IHJlc2V0IChvbmx5IGlmIG5lY2Vzc2FyeSkKK2N1c3RvbV9mZWF0dXJlX2ticF9yZWNvdmVyeV9lbmFibGU9MAorCisjIyBDbG9jayBjb25maWd1cmF0aW9ucworIyBDb3JlIGNsb2NrIHNwZWVkIChNSHopLiBEZWZhdWx0LSBCQ004ODY1MDogNjAwIE1IeiwgQkNNODg2NzU6IDcyMCBNSHoKK2NvcmVfY2xvY2tfc3BlZWRfa2h6LkJDTTg4NjUwPTYwMDAwMAorY29yZV9jbG9ja19zcGVlZF9raHouQkNNODg2NzU9NzIwMDAwCitjb3JlX2Nsb2NrX3NwZWVkX2toei5CQ004ODQ3MD02MDAwMDAKK2NvcmVfY2xvY2tfc3BlZWRfa2h6LkJDTTg4NjgwPTgzNzUwMAorY29yZV9jbG9ja19zcGVlZF9raHouQkNNODgyNzA9MjUwMDAwCisKKyMgU3lzdGVtIHJlZmVyZW5jZSBjbG9jayAoTUh6KS4gRGVmYXVsdC0gQkNNODg2NTA6IDYwMCBNSHosIEJDTTg4Njc1OiA4MDAgTUh6CitzeXN0ZW1fcmVmX2NvcmVfY2xvY2tfa2h6LkJDTTg4NjUwPTEyMDAwMDAKKworI2ZhYnJpYyBwY3AKK2ZhYnJpY19wY3BfZW5hYmxlLkJDTTg4Njc1PTEKKworI1VzaW5nIFRjYW0gaW5zdGVhZCBvZiB0aGUgS0FQUyBmb3IgdGhlIElQdjQgTUMgYW5kIElQVjYgTUMKKyMgMCAtIERvbid0IHVzZSBUQUNNCisjIDEgLSBVc2UgVENBTSBmb3IgSVBWNC82IE1DCisjIDIgLSBVc2UgVEFDTSBmb3IgSVBWNC82IE1DIGJ1dCBkb24ndCB1c2UgdGhlIFZSRiBmaWVsZCBhcyBhIHF1YWxpZmllciBmb3IgSVBWNCBNQyBlbnRyaWVzCisjY3VzdG9tX2ZlYXR1cmVfbDNfbWNfdXNlX3RjYW09MAorCisjZm9yIElQdjZVQzogdXNlIFRjYW0gaW5zdGVhZCBvZiBLQVBTCisjTm90ZSB0aGF0IGlmIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCB0aGUgSVBWNi1VQyBSUEYgd2lsbCBiZSBkaXNhYmxlZAorI2N1c3RvbV9mZWF0dXJlX2wzX2lwdjZfdWNfdXNlX3RjYW09MAorCisKKyNhbXMgcGxsIG92ZXJyaWRlIHZhbHVlIChvbmx5IGZvciBKZXJpY2hvIEEwL0ExKS0gcG9zc2libGUgdmFsdWVzOiAweDE5LCAweDFlLCAweDFmLiBEZWZhdWx0IHZhbHVlIDB4MWYKKyNjdXN0b21fZmVhdHVyZV9hbXNfcGxsX292ZXJyaWRlLkJDTTg4Njc1PTB4MWYKKworIyMjIE5ldHdvcmsgSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gIyMjCisjIyBVc2Ugb2YgdGhlIHVjb2RlX3BvcnRfPExvY2FsLVBvcnQtSWQ+PTxJbnRlcmZhY2UtdHlwZT5bPEludGVyZmFjZS1JZD5dWy48Q2hhbm5lbC1JZD5dCisjIyBMb2NhbCBwb3J0IHJhbmdlOiAwIC0gMjU1LgorIyMgSW50ZXJmYWNlIHR5cGVzOiBYQVVJL1JYQVVJL1NHTUlJL0lMS04vMTBHQmFzZS1SL1hMR0UvQ0dFL0NQVS9JR05PUkUKKworIyBNYXAgYmNtIGxvY2FsIHBvcnQgdG8gQ1BVWy5jaGFubmVsXSBpbnRlcmZhY2VzCit1Y29kZV9wb3J0XzAuQkNNODg2NTA9Q1BVLjAKKworIyBNYXAgYmNtIGxvY2FsIHBvcnQgdG8gTmV0d29yay1JbnRlcmZhY2VbLmNoYW5uZWxdIGludGVyZmFjZXMgLSBUQkQKK3Vjb2RlX3BvcnRfMTMyLkJDTTg4NjUwPTEwR0Jhc2UtUjMKK3Vjb2RlX3BvcnRfMTMxLkJDTTg4NjUwPTEwR0Jhc2UtUjIKK3Vjb2RlX3BvcnRfMTMwLkJDTTg4NjUwPTEwR0Jhc2UtUjEKK3Vjb2RlX3BvcnRfMTI5LkJDTTg4NjUwPTEwR0Jhc2UtUjAKK3Vjb2RlX3BvcnRfMTI4LkJDTTg4NjUwPTEwR0Jhc2UtUjQ2CisjdWNvZGVfcG9ydF8xMjguQkNNODg2NTA9R0U0NgorCit1Y29kZV9wb3J0XzYuQkNNODg2NTA9MTBHQmFzZS1SMjIKK3Vjb2RlX3BvcnRfNS5CQ004ODY1MD0xMEdCYXNlLVIyMwordWNvZGVfcG9ydF80LkJDTTg4NjUwPTEwR0Jhc2UtUjE2Cit1Y29kZV9wb3J0XzMuQkNNODg2NTA9MTBHQmFzZS1SMTcKK3Vjb2RlX3BvcnRfMi5CQ004ODY1MD0xMEdCYXNlLVI0NQordWNvZGVfcG9ydF8xLkJDTTg4NjUwPTEwR0Jhc2UtUjQ3CisKK2N1c3RvbV9mZWF0dXJlX25pZl9yZWNvdmVyeV9lbmFibGUuQkNNODg2NTA9MQorY3VzdG9tX2ZlYXR1cmVfbmlmX3JlY292ZXJ5X2l0ZXIuQkNNODg2NTA9NworY3VzdG9tX2ZlYXR1cmVfc2tpcF9iZWZvcmVfdHJhZmZpY192YWxpZGF0aW9uLkJDTTg4Njc1PTAKKyNjdXN0b21fZmVhdHVyZV9tYWNfZmlmb19zdGFydF90eF90aHJzLkJDTTg4Njc1PTkKKworI3JlZGlyZWN0IHBhY2tldHMgdGhhdCBhcmUgZGVzdGluZWQgdG8gaW52YWxpZCBxdWV1ZXMKK2ludmFsaWRfcXVldWVfcmVkaXJlY3Q9MAorCisjQ0xQMAorI3Vjb2RlX3BvcnRfMS5CQ004ODY3NT1YRTA6Y29yZV8wLjEKKyN1Y29kZV9wb3J0XzIuQkNNODg2NzU9WEUxOmNvcmVfMC4yCisjdWNvZGVfcG9ydF8zLkJDTTg4Njc1PVhFMjpjb3JlXzAuMworI3Vjb2RlX3BvcnRfNC5CQ004ODY3NT1YRTM6Y29yZV8wLjQKKyNDTFAxCisjdWNvZGVfcG9ydF81LkJDTTg4Njc1PVhFNDpjb3JlXzAuNQorI3Vjb2RlX3BvcnRfNi5CQ004ODY3NT1YRTU6Y29yZV8wLjYKKyN1Y29kZV9wb3J0XzcuQkNNODg2NzU9WEU2OmNvcmVfMC43CisjdWNvZGVfcG9ydF84LkJDTTg4Njc1PVhFNzpjb3JlXzAuOAorI0NMUDIKKyN1Y29kZV9wb3J0XzkuQkNNODg2NzU9WEU4OmNvcmVfMC45CisjdWNvZGVfcG9ydF8xMC5CQ004ODY3NT1YRTk6Y29yZV8wLjEwCisjdWNvZGVfcG9ydF8xMS5CQ004ODY3NT1YRTEwOmNvcmVfMC4xMQorI3Vjb2RlX3BvcnRfMTIuQkNNODg2NzU9WEUxMTpjb3JlXzAuMTIKKyNDTFAzCisjdWNvZGVfcG9ydF8xMy5CQ004ODY3NT1YRTEyOmNvcmVfMC4xMworI3Vjb2RlX3BvcnRfMTQuQkNNODg2NzU9WEUxMzpjb3JlXzAuMTQKKyN1Y29kZV9wb3J0XzE1LkJDTTg4Njc1PVhFMTQ6Y29yZV8wLjE1CisjdWNvZGVfcG9ydF8xNi5CQ004ODY3NT1YRTE1OmNvcmVfMC4xNgorI0NMUDQKKyN1Y29kZV9wb3J0XzE3LkJDTTg4Njc1PVhFMTY6Y29yZV8wLjE3CisjdWNvZGVfcG9ydF8xOC5CQ004ODY3NT1YRTE3OmNvcmVfMC4xOAorI3Vjb2RlX3BvcnRfMTkuQkNNODg2NzU9WEUxODpjb3JlXzAuMTkKKyN1Y29kZV9wb3J0XzIwLkJDTTg4Njc1PVhFMTk6Y29yZV8wLjIwCisjQ0xQNQorI3Vjb2RlX3BvcnRfMjEuQkNNODg2NzU9WEUyMDpjb3JlXzAuMjEKKyN1Y29kZV9wb3J0XzIyLkJDTTg4Njc1PVhFMjE6Y29yZV8wLjIyCisjdWNvZGVfcG9ydF8yMy5CQ004ODY3NT1YRTIyOmNvcmVfMC4yMworI3Vjb2RlX3BvcnRfMjQuQkNNODg2NzU9WEUyMzpjb3JlXzAuMjQKKyNYTFAwCisjdWNvZGVfcG9ydF8yNS5CQ004ODY3NT1YRTI0OmNvcmVfMC4yNQorI3Vjb2RlX3BvcnRfMjYuQkNNODg2NzU9WEUyNTpjb3JlXzAuMjYKKyN1Y29kZV9wb3J0XzI3LkJDTTg4Njc1PVhFMjY6Y29yZV8wLjI3CisjdWNvZGVfcG9ydF8yOC5CQ004ODY3NT1YRTI3OmNvcmVfMC4yOAorI1hMUDEKKyN1Y29kZV9wb3J0XzI5LkJDTTg4Njc1PVhFMjg6Y29yZV8wLjI5CisjdWNvZGVfcG9ydF8zMC5CQ004ODY3NT1YRTI5OmNvcmVfMC4zMAorI3Vjb2RlX3BvcnRfMzEuQkNNODg2NzU9WEUzMDpjb3JlXzAuMzEKKyN1Y29kZV9wb3J0XzMyLkJDTTg4Njc1PVhFMzE6Y29yZV8wLjMyCisjWExQMgorI3Vjb2RlX3BvcnRfMzMuQkNNODg2NzU9WEUzMjpjb3JlXzAuMzMKKyN1Y29kZV9wb3J0XzM0LkJDTTg4Njc1PVhFMzM6Y29yZV8wLjM0CisjdWNvZGVfcG9ydF8zNS5CQ004ODY3NT1YRTM0OmNvcmVfMC4zNQorI3Vjb2RlX3BvcnRfMzYuQkNNODg2NzU9WEUzNTpjb3JlXzAuMzYKKyNYTFAzCisjdWNvZGVfcG9ydF8zNy5CQ004ODY3NT1YRTM2OmNvcmVfMC4zNworI3Vjb2RlX3BvcnRfMzguQkNNODg2NzU9WEUzNzpjb3JlXzAuMzgKKyN1Y29kZV9wb3J0XzM5LkJDTTg4Njc1PVhFMzg6Y29yZV8wLjM5CisjdWNvZGVfcG9ydF80MC5CQ004ODY3NT1YRTM5OmNvcmVfMC40MAorI1hMUDQgKG5vdCBhcyBQTVEwKQorI3Vjb2RlX3BvcnRfNDEuQkNNODg2NzU9WEU0MDpjb3JlXzAuNDEKKyN1Y29kZV9wb3J0XzQyLkJDTTg4Njc1PVhFNDE6Y29yZV8wLjQyCisjdWNvZGVfcG9ydF80My5CQ004ODY3NT1YRTQyOmNvcmVfMC40MworI3Vjb2RlX3BvcnRfNDQuQkNNODg2NzU9WEU0Mzpjb3JlXzAuNDQKKyNYTFA1IChub3QgYXMgUE1RMSkKKyN1Y29kZV9wb3J0XzQ1LkJDTTg4Njc1PVhFNDQ6Y29yZV8wLjQ1CisjdWNvZGVfcG9ydF80Ni5CQ004ODY3NT1YRTQ1OmNvcmVfMC40NgorI3Vjb2RlX3BvcnRfNDcuQkNNODg2NzU9WEU0Njpjb3JlXzAuNDcKKyN1Y29kZV9wb3J0XzQ4LkJDTTg4Njc1PVhFNDc6Y29yZV8wLjQ4CisjWExQOQorI3Vjb2RlX3BvcnRfNDkuQkNNODg2NzU9WEU2MDpjb3JlXzAuNDkKKyN1Y29kZV9wb3J0XzUwLkJDTTg4Njc1PVhFNjE6Y29yZV8wLjUwCisjdWNvZGVfcG9ydF81MS5CQ004ODY3NT1YRTYyOmNvcmVfMC41MQorI3Vjb2RlX3BvcnRfNTIuQkNNODg2NzU9WEU2Mzpjb3JlXzAuNTIKKyNYTFAxMAorI3Vjb2RlX3BvcnRfNTMuQkNNODg2NzU9WEU2NDpjb3JlXzAuNTMKKyN1Y29kZV9wb3J0XzU0LkJDTTg4Njc1PVhFNjU6Y29yZV8wLjU0CisjdWNvZGVfcG9ydF81NS5CQ004ODY3NT1YRTY2OmNvcmVfMC41NQorI3Vjb2RlX3BvcnRfNTYuQkNNODg2NzU9WEU2Nzpjb3JlXzAuNTYKKyNYTFAxMSAobm90IGFzIFBNUTMpCisjdWNvZGVfcG9ydF81Ny5CQ004ODY3NT1YRTY4OmNvcmVfMC41NworI3Vjb2RlX3BvcnRfNTguQkNNODg2NzU9WEU2OTpjb3JlXzAuNTgKKyN1Y29kZV9wb3J0XzU5LkJDTTg4Njc1PVhFNzA6Y29yZV8wLjU5CisjdWNvZGVfcG9ydF82MC5CQ004ODY3NT1YRTcxOmNvcmVfMC42MAorCisKK3Vjb2RlX3BvcnRfMC5CQ004ODY3NT1DUFUuMDpjb3JlXzAuMAordWNvZGVfcG9ydF8wLkJDTTg4NjgwPUNQVS4wOmNvcmVfMC4wCit1Y29kZV9wb3J0XzIwMC5CQ004ODY3NT1DUFUuODpjb3JlXzEuMjAwCit1Y29kZV9wb3J0XzIwMC5CQ004ODY4MD1DUFUuODpjb3JlXzEuMjAwCit1Y29kZV9wb3J0XzIwMS5CQ004ODY3NT1DUFUuMTY6Y29yZV8wLjIwMQordWNvZGVfcG9ydF8yMDEuQkNNODg2ODA9Q1BVLjE2OmNvcmVfMC4yMDEKK3Vjb2RlX3BvcnRfMjAyLkJDTTg4Njc1PUNQVS4yNDpjb3JlXzEuMjAyCit1Y29kZV9wb3J0XzIwMi5CQ004ODY4MD1DUFUuMjQ6Y29yZV8xLjIwMgordWNvZGVfcG9ydF8yMDMuQkNNODg2NzU9Q1BVLjMyOmNvcmVfMC4yMDMKK3Vjb2RlX3BvcnRfMjAzLkJDTTg4NjgwPUNQVS4zMjpjb3JlXzAuMjAzCisKKyNkZWZhdWx0IHBvcnRzIGZvciBKZXJpY2hvIGFuZCBRTVgKK3Vjb2RlX3BvcnRfMS5CQ004ODY3NT1DR0UwOmNvcmVfMC4xCit1Y29kZV9wb3J0XzIuQkNNODg2NzU9SUxLTjE6Y29yZV8wLjIKK2lsa25fbGFuZXNfMS5CQ004ODY3NT0weGZmZjAwMAordWNvZGVfcG9ydF8zLkJDTTg4Njc1PUlMS04yOmNvcmVfMC4zCitpbGtuX2xhbmVzXzIuQkNNODg2NzU9MHhmZmYKK3Vjb2RlX3BvcnRfMTcuQkNNODg2NzU9Q0dFMTpjb3JlXzEuMTcKKworI2RlZmF1bHQgcG9ydHMgZm9yIEplcmljaG8KK3Vjb2RlX3BvcnRfMTMuQkNNODg2NzU9MTBHQmFzZS1SNjQ6Y29yZV8wLjEzCit1Y29kZV9wb3J0XzE0LkJDTTg4Njc1PTEwR0Jhc2UtUjY1OmNvcmVfMC4xNAordWNvZGVfcG9ydF8xNS5CQ004ODY3NT0xMEdCYXNlLVI2ODpjb3JlXzEuMTUKK3Vjb2RlX3BvcnRfMTYuQkNNODg2NzU9MTBHQmFzZS1SNjk6Y29yZV8xLjE2CisKKyNkZWZhdWx0IHBvcnRzIGZvciBKZXJpY2hvIFBsdXMKK3Vjb2RlX3BvcnRfMTMuQkNNODg2ODA9MTBHQmFzZS1SNDA6Y29yZV8wLjEzCit1Y29kZV9wb3J0XzE0LkJDTTg4NjgwPTEwR0Jhc2UtUjQzOmNvcmVfMC4xNAordWNvZGVfcG9ydF8xNS5CQ004ODY4MD0xMEdCYXNlLVI0NDpjb3JlXzEuMTUKK3Vjb2RlX3BvcnRfMTYuQkNNODg2ODA9MTBHQmFzZS1SNDY6Y29yZV8xLjE2CisKKyNkZWZhdWx0IHBvcnRzIGZvciBRTVgKK3Vjb2RlX3BvcnRfMTMuQkNNODgzNzVfQTA9MTBHQmFzZS1SNjQ6Y29yZV8wLjEzCit1Y29kZV9wb3J0XzE0LkJDTTg4Mzc1X0EwPTEwR0Jhc2UtUjY2OmNvcmVfMC4xNAordWNvZGVfcG9ydF8xNS5CQ004ODM3NV9BMD0xMEdCYXNlLVI2OTpjb3JlXzEuMTUKK3Vjb2RlX3BvcnRfMTYuQkNNODgzNzVfQTA9MTBHQmFzZS1SNzE6Y29yZV8xLjE2CisgCisKK3Vjb2RlX3BvcnRfMTMuQkNNODgzNzVfQjA9MTBHQmFzZS1SNjQ6Y29yZV8wLjEzCit1Y29kZV9wb3J0XzE0LkJDTTg4Mzc1X0IwPTEwR0Jhc2UtUjY2OmNvcmVfMC4xNAordWNvZGVfcG9ydF8xNS5CQ004ODM3NV9CMD0xMEdCYXNlLVI2OTpjb3JlXzEuMTUKK3Vjb2RlX3BvcnRfMTYuQkNNODgzNzVfQjA9MTBHQmFzZS1SNzE6Y29yZV8xLjE2CisgCisgCisjZGVmYXVsdCBwb3J0cyBmb3IgUUFYCit1Y29kZV9wb3J0XzAuQkNNODg0NzA9Q1BVLjA6Y29yZV8wLjAKKwordWNvZGVfcG9ydF8yMDAuQkNNODg0NzA9Q1BVLjg6Y29yZV8wLjIwMAorCit1Y29kZV9wb3J0XzIwMS5CQ004ODQ3MD1DUFUuMTY6Y29yZV8wLjIwMQorCit1Y29kZV9wb3J0XzIwMi5CQ004ODQ3MD1DUFUuMjQ6Y29yZV8wLjIwMgorCit1Y29kZV9wb3J0XzIwMy5CQ004ODQ3MD1DUFUuMzI6Y29yZV8wLjIwMworCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzAuQkNNODg0NzA9SU5KRUNURURfMl9QUAordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMC5CQ004ODQ3MD1DUFUKKwordWNvZGVfcG9ydF8xLkJDTTg4NDcwPVhFNDc6Y29yZV8wLjEKK3Vjb2RlX3BvcnRfMi5CQ004ODQ3MD1YRTQ1OmNvcmVfMC4yCit1Y29kZV9wb3J0XzMuQkNNODg0NzA9WEUxNzpjb3JlXzAuMwordWNvZGVfcG9ydF80LkJDTTg4NDcwPVhFMTY6Y29yZV8wLjQKK3Vjb2RlX3BvcnRfNS5CQ004ODQ3MD1YRTIzOmNvcmVfMC41Cit1Y29kZV9wb3J0XzYuQkNNODg0NzA9WEUyMjpjb3JlXzAuNgorI3BvcnRfaW5pdF9zcGVlZF94ZTEuQkNNODg0NzA9MjUwMAorcG9uX2FwcGxpY2F0aW9uX3N1cHBvcnRfZW5hYmxlZF8xLkJDTTg4NDcwPVRSVUUKK3Bvbl9hcHBsaWNhdGlvbl9zdXBwb3J0X2VuYWJsZWRfMy5CQ004ODQ3MD1UUlVFCitwb25fYXBwbGljYXRpb25fc3VwcG9ydF9lbmFibGVkXzQuQkNNODg0NzA9VFJVRQorcG9uX2FwcGxpY2F0aW9uX3N1cHBvcnRfZW5hYmxlZF81LkJDTTg4NDcwPVRSVUUKK3Bvbl9hcHBsaWNhdGlvbl9zdXBwb3J0X2VuYWJsZWRfNi5CQ004ODQ3MD1UUlVFCisKK2JjbTg4Nnh4X3J4X3VzZV9od190cmFwX2lkLkJDTTg4NjUwPTAKKworI3Vjb2RlX3BvcnRfMTI4LkJDTTg4NDcwPUdFNDY6Y29yZV8wLjEyOAorI3BvcnRfaW5pdF9zcGVlZF9nZTQ2LkJDTTg4NDcwPTEwMDAKK3Vjb2RlX3BvcnRfMTI4LkJDTTg4NDcwPVhFNDY6Y29yZV8wLjEyOAordWNvZGVfcG9ydF8xMzIuQkNNODg0NzA9WEUzOmNvcmVfMC4xMzIKK3Vjb2RlX3BvcnRfMTMxLkJDTTg4NDcwPVhFMjpjb3JlXzAuMTMxCit1Y29kZV9wb3J0XzEzMC5CQ004ODQ3MD1YRTE6Y29yZV8wLjEzMAordWNvZGVfcG9ydF8xMjkuQkNNODg0NzA9WEUwOmNvcmVfMC4xMjkKKworYmNtODg2eHhfcnhfdXNlX2h3X3RyYXBfaWQuQkNNODg0NzA9MAorCitzdGFibGVfZmlsZW5hbWUuQkNNODgyNzA9L3RtcC93YXJtYm9vdF9kYXRhCitmYXBfZGV2aWNlX21vZGUuQkNNODgyNzA9UFAKKyNkZWZhdWx0IHBvcnRzIGZvciBRVVgKK3Vjb2RlX3BvcnRfMC5CQ004ODI3MD1DUFUuMDpjb3JlXzAuMAordWNvZGVfcG9ydF8yMDAuQkNNODgyNzA9Q1BVLjg6Y29yZV8wLjEwMAordWNvZGVfcG9ydF8yMDEuQkNNODgyNzA9Q1BVLjE2OmNvcmVfMC4xMDEKK3Vjb2RlX3BvcnRfMjAyLkJDTTg4MjcwPUNQVS4yNDpjb3JlXzAuMTAyCit1Y29kZV9wb3J0XzIwMy5CQ004ODI3MD1DUFUuMzI6Y29yZV8wLjEwMwordWNvZGVfcG9ydF8xLkJDTTg4MjcwPVhFMDpjb3JlXzAuMQordWNvZGVfcG9ydF8yLkJDTTg4MjcwPVhFMTpjb3JlXzAuMgordWNvZGVfcG9ydF8zLkJDTTg4MjcwPVhFMjpjb3JlXzAuMwordWNvZGVfcG9ydF8xMy5CQ004ODI3MD1HRTEyOmNvcmVfMC4xMwordWNvZGVfcG9ydF8xNC5CQ004ODI3MD1HRTEzOmNvcmVfMC4xNAordWNvZGVfcG9ydF8xNS5CQ004ODI3MD1HRTE0OmNvcmVfMC4xNQordWNvZGVfcG9ydF8xNi5CQ004ODI3MD1HRTE1OmNvcmVfMC4xNgordWNvZGVfcG9ydF8xNy5CQ004ODI3MD1HRTE2OmNvcmVfMC4xNworCisKKyNGaXJtd2FyZSBtb2RlOgorIyhEb2N1bWFudGF0aW9uIHJlbGV2YW50IGZvciBCQ004ODZ4eCBhbmQgQkNNODg3eHgpCisjIDA9REVGQVVMVAorIyAxPVNGUF9PUFRfU1I0ICAgICAtIG9wdGljYWwgc2hvcnQgcmFuZ2UKKyMgMj1TRlBfREFDICAgICAgICAgLSBkaXJlY3QgYXR0YWNoIGNvcHBlcgorIyAzPVhMQVVJICAgICAgICAgICAtIDQwRyBYTEFVSSBtb2RlCisjIDQ9Rk9SQ0VfT1NERkUgICAgIC0gZm9yY2Ugb3ZlciBzYW1wbGUgZGlnaXRhbCBmZWVkYmFjayBlcXVhbGl6YXRpb24KKyMgNT1GT1JDRV9CUkRGRSAgICAgLSBmb3JjZSBiYXVkIHJhdGUgZGlnaXRhbCBmZWVkYmFjayBlcXVhbGl6YXRpb24KKyMgNj1TV19DTDcyICAgICAgICAgLSBzb2Z0d2FyZSBjbDcyIHdpdGggQU4gb24KKyMgNz1DTDcyX1dJVEhPVVRfQU4gLSBjbDcyIHdpdGhvdXQgQU4KKyNGb3IgTmVnZXYyIGNoYXNzaXMgZW5hYmxlIERGRSBpcyByZWNvbW1lbmRlZAorc2VyZGVzX2Zpcm13YXJlX21vZGUuQkNNODg2NTA9Mgorc2VyZGVzX2Zpcm13YXJlX21vZGVfaWwuQkNNODg2NTA9NAorc2VyZGVzX2Zpcm13YXJlX21vZGVfc2ZpLkJDTTg4NjUwPTAKK3NlcmRlc19maXJtd2FyZV9tb2RlX3NmaS5CQ004ODY3NT00CitzZXJkZXNfZmlybXdhcmVfbW9kZV9zZmkuQkNNODg0NzA9NAorc2VyZGVzX2Zpcm13YXJlX21vZGVfc2ZpLkJDTTg4MjcwPTQKK3NlcmRlc19maXJtd2FyZV9tb2RlX3NmaS5CQ004ODY4MD00CisKKworI3Vjb2RlX3BvcnRfMS5CQ004ODY1MD0xMEdCYXNlLVIwCisjdWNvZGVfcG9ydF8yLkJDTTg4NjUwPTEwR0Jhc2UtUjEKKyN1Y29kZV9wb3J0XzMuQkNNODg2NTA9MTBHQmFzZS1SMgorI3Vjb2RlX3BvcnRfNC5CQ004ODY1MD0xMEdCYXNlLVIzCisjdWNvZGVfcG9ydF81LkJDTTg4NjUwPTEwR0Jhc2UtUjQKKyN1Y29kZV9wb3J0XzYuQkNNODg2NTA9MTBHQmFzZS1SNQorI3Vjb2RlX3BvcnRfNy5CQ004ODY1MD0xMEdCYXNlLVI2CisjdWNvZGVfcG9ydF84LkJDTTg4NjUwPTEwR0Jhc2UtUjcKKyN1Y29kZV9wb3J0XzkuQkNNODg2NTA9MTBHQmFzZS1SOAorI3Vjb2RlX3BvcnRfMTAuQkNNODg2NTA9MTBHQmFzZS1SOQorI3Vjb2RlX3BvcnRfMTEuQkNNODg2NTA9MTBHQmFzZS1SMTAKKyN1Y29kZV9wb3J0XzEyLkJDTTg4NjUwPTEwR0Jhc2UtUjExCisjdWNvZGVfcG9ydF8xMy5CQ004ODY1MD0xMEdCYXNlLVIxMgorI3Vjb2RlX3BvcnRfMTQuQkNNODg2NTA9MTBHQmFzZS1SMTMKKyN1Y29kZV9wb3J0XzE1LkJDTTg4NjUwPTEwR0Jhc2UtUjE0CisjdWNvZGVfcG9ydF8xNi5CQ004ODY1MD0xMEdCYXNlLVIxNQorI3Vjb2RlX3BvcnRfMTcuQkNNODg2NTA9MTBHQmFzZS1SMTYKKyN1Y29kZV9wb3J0XzE4LkJDTTg4NjUwPTEwR0Jhc2UtUjE3CisjdWNvZGVfcG9ydF8xOS5CQ004ODY1MD0xMEdCYXNlLVIxOAorI3Vjb2RlX3BvcnRfMjAuQkNNODg2NTA9MTBHQmFzZS1SMTkKK3Vjb2RlX3BvcnRfMjAwLkJDTTg4NjUwPUNQVS44Cit1Y29kZV9wb3J0XzIwMS5CQ004ODY1MD1DUFUuMTYKK3Vjb2RlX3BvcnRfMjAyLkJDTTg4NjUwPUNQVS4yNAordWNvZGVfcG9ydF8yMDMuQkNNODg2NTA9Q1BVLjMyCisKKyM0MEcKKyN1Y29kZV9wb3J0XzEuQkNNODg2NTA9WExHRTAKKyN1Y29kZV9wb3J0XzIuQkNNODg2NTA9WExHRTEKKyN1Y29kZV9wb3J0XzMuQkNNODg2NTA9WExHRTIKKyN1Y29kZV9wb3J0XzQuQkNNODg2NTA9WExHRTMKKyN1Y29kZV9wb3J0XzUuQkNNODg2NTA9WExHRTQKKyN1Y29kZV9wb3J0XzYuQkNNODg2NTA9WExHRTUKKyN1Y29kZV9wb3J0XzcuQkNNODg2NTA9WExHRTYKKworI0lMS04gY29uZmlndXJhdGlvbiAtIGJhc2ljIGNvbmZpZworI3Vjb2RlX3BvcnRfMzEuQkNNODg2NTA9SUxLTjAKKyN1Y29kZV9wb3J0XzMyLkJDTTg4NjUwPUlMS04xCisjdWNvZGVfcG9ydF8zMi5CQ004ODY3NT1JTEtOMTpjb3JlXzAuMzIKKyNpbGtuX251bV9sYW5lc18wLkJDTTg4NjUwPTEyCisjaWxrbl9udW1fbGFuZXNfMS5CQ004ODY1MD0xMgorI3BvcnRfaW5pdF9zcGVlZF9pbC5CQ004ODY1MD0xMDMxMgorCisKKyNJTEtOIHBlciBwb3J0IGNoYW5uZWwgc3RhdAorI2lsa25fY291bnRlcnNfbW9kZS5CQ004ODY1MD1QQUNLRVRfUEVSX0NIQU5ORUwKKworI0lMS04gY29uZmlndXJhdGlvbiAtIGFkdmFuY2VkCisjaWxrbl9tZXRhZnJhbWVfc3luY19wZXJpb2Q9MjA0OAorI0lMS04gYnVyc3QgY29uZmlndXJhdGlvbiAtIElMS04gbWF4IGJ1cnN0IHN1cHBvcmVkIHZhbHVlczogMTI4LCAyNTYKKyNJTEtOIGJ1cnN0IHNob3J0IHNob3VsZCBiZSBsZXNzZXIgb3IgZXF1YWwgdG8gYnVyc3QgbWF4IC8yCisjaWxrbl9idXJzdF9tYXguQkNNODg2NzU9MjU2CisjaWxrbl9idXJzdF9taW4uQkNNODg2NzU9MzIKKyMgRW5hYmxlXERpc2FibGUgSUxLTiBzdGF0dXMgbWVzc2FnZSBzZW50IHRocm91Z2ggYW4gb3V0LW9mLWJhbmQgaW50ZXJmYWNlLgorIyBpbGtuX2ludGVyZmFjZV9zdGF0dXNfb29iX2lnbm9yZS5CQ004ODY1MD0xCisKKyMgaWxrbl9pc19idXJzdF9pbnRlcmxlYXZpbmc8aWxrbl9pZD4KKyMgMSAtIFRoZSBjaGFubmVsaXplZCBpbnRlcmZhY2UgZnVuY3Rpb25zIGluIGJ1cnN0IGludGVybGVhdmluZyBtb2RlIChkZWZhdWx0KS4gMCAtIGluIGZ1bGwgcGFja2V0IG1vZGUuCisjaWxrbl9pc19idXJzdF9pbnRlcmxlYXZpbmdfMS5CQ004ODY3NT0wCisKKyMjSUxLTiByZXRyYW5zbWl0CisjaWxrbl9yZXRyYW5zbWl0X2VuYWJsZV9yeC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X2VuYWJsZV90eC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X2J1ZmZlcl9zaXplLkJDTTg4NjUwPTI1MAorI2lsa25fcmV0cmFuc21pdF9udW1fcmVxdWVzdHNfcmVzZW50LkJDTTg4NjUwPTE1CisjaWxrbl9yZXRyYW5zbWl0X251bV9zbl9yZXBldGl0aW9uc190eC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X251bV9zbl9yZXBldGl0aW9uc19yeC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X3J4X3RpbWVvdXRfd29yZHMuQkNNODg2NTA9MzgwMAorI2lsa25fcmV0cmFuc21pdF9yeF90aW1lb3V0X3NuLkJDTTg4NjUwPTI1MAorI2lsa25fcmV0cmFuc21pdF9yeF9pZ25vcmUuQkNNODg2NTA9ODAKKyNpbGtuX3JldHJhbnNtaXRfcnhfcmVzZXRfd2hlbl9lcnJvcl9lbmFibGUuQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9yeF93YXRjaGRvZy5CQ004ODY1MD0wCisjaWxrbl9yZXRyYW5zbWl0X3J4X3Jlc2V0X3doZW5fYWxsaWduZWRfZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTEKKyNpbGtuX3JldHJhbnNtaXRfcnhfcmVzZXRfd2hlbl9yZXRyeV9lcnJvcl9lbmFibGUuQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9yeF9yZXNldF93aGVuX3dyYXBfYWZ0ZXJfZGlzY19lcnJvcl9lbmFibGUuQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9yeF9yZXNldF93aGVuX3dyYXBfYmVmb3JlX2Rpc2NfZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTAKKyNpbGtuX3JldHJhbnNtaXRfcnhfcmVzZXRfd2hlbl90aW1vdXRfZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTAKKyNpbGtuX3JldHJhbnNtaXRfdHhfd2FpdF9mb3Jfc2VxX251bV9jaGFuZ2VfZW5hYmxlLkJDTTg4NjUwPTEKKyNpbGtuX3JldHJhbnNtaXRfdHhfaWdub3JlX3JlcXVlc3RzX3doZW5fZmlmb19hbG1vc3RfZW1wdHkuQkNNODg2NTA9MQorCisjdWNvZGVfcG9ydF80MC5CQ004ODY1MD1SQ1kuMAorI3Vjb2RlX3BvcnRfNDEuQkNNODg2NTA9UkNZLjEKKyN1Y29kZV9wb3J0XzQyLkJDTTg4NjUwPVJDWS4yCisKKyMjIENBVUkgQ29uZmlndXJhdGlvbgorI3Vjb2RlX3BvcnRfNDEuQkNNODg2NTA9Q0dFMAorI3Vjb2RlX3BvcnRfNDIuQkNNODg2NTA9Q0dFMQorY2F1aV9udW1fbGFuZXNfMC5CQ004ODY1MD0xMAorY2F1aV9udW1fbGFuZXNfMS5CQ004ODY1MD0xMAorI1JlcXVpcmVkIGZvciB3b3JraW5nIElYSUEgMTAwRyBwb3J0OgorbWxkX2xhbmVfc3dhcF9sYW5lMjBfY2UuQkNNODg2NTA9MAorbWxkX2xhbmVfc3dhcF9sYW5lMjFfY2UuQkNNODg2NTA9MQorbWxkX2xhbmVfc3dhcF9sYW5lMF9jZS5CQ004ODY1MD0yMAorbWxkX2xhbmVfc3dhcF9sYW5lMV9jZS5CQ004ODY1MD0yMQorCisjIFRoaXMgY29uZmlndXJlcyB0aGUgbGFuZSBwb2xhcml0eQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxLkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5Mi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTMuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHk0LkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5NS5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTYuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHk3LkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5OC5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTkuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxMC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTExLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTIuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxMy5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTE0LkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTUuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxNi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTE3LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTguQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxOS5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTIwLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjEuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyMi5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTIzLkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjQuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyNS5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTI2LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjcuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyOC5CQ004ODY1MD0xCisKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTIuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkzLkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5NC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTUuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHk2LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5Ny5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTguQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHk5LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTAuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxMS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTEyLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTMuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxNC5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTE1LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTYuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxNy5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTE4LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTkuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyMC5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTIxLkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjIuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyMy5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTI0LkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjUuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyNi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTI3LkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjguQkNNODg2NTA9MQorCit4Z3hzX3R4X2xhbmVfbWFwX3F1YWQwLkJDTTg4NjUwPTB4MTAzMgoreGd4c190eF9sYW5lX21hcF9xdWFkMS5CQ004ODY1MD0weDIzMTAKK3hneHNfdHhfbGFuZV9tYXBfcXVhZDIuQkNNODg2NTA9MHgzMjEwCit4Z3hzX3R4X2xhbmVfbWFwX3F1YWQzLkJDTTg4NjUwPTB4MzIxMAoreGd4c190eF9sYW5lX21hcF9xdWFkNC5CQ004ODY1MD0weDEyMzAKK3hneHNfdHhfbGFuZV9tYXBfcXVhZDUuQkNNODg2NTA9MHgzMjAxCit4Z3hzX3R4X2xhbmVfbWFwX3F1YWQ2LkJDTTg4NjUwPTB4MjEwMworeGd4c190eF9sYW5lX21hcF9xdWFkNy5CQ004ODY1MD0weDAxMjMKKworeGd4c19yeF9sYW5lX21hcF9xdWFkMC5CQ004ODY1MD0weDMwMTIKK3hneHNfcnhfbGFuZV9tYXBfcXVhZDEuQkNNODg2NTA9MHgwMTMyCit4Z3hzX3J4X2xhbmVfbWFwX3F1YWQyLkJDTTg4NjUwPTB4MTIzMAoreGd4c19yeF9sYW5lX21hcF9xdWFkMy5CQ004ODY1MD0weDAxMjMKK3hneHNfcnhfbGFuZV9tYXBfcXVhZDQuQkNNODg2NTA9MHgzMDEyCit4Z3hzX3J4X2xhbmVfbWFwX3F1YWQ1LkJDTTg4NjUwPTB4MjAxMworeGd4c19yeF9sYW5lX21hcF9xdWFkNi5CQ004ODY1MD0weDIxMDMKKworCisjSGlnaCB2b2x0YWdlIGRyaXZlciBzdHJhcC4gSWYgMCwgY29ubmVjdGVkIHRvIDEuNFYgc3VwcGx5OyBpZiAxLCBjb25uZWN0ZWQgdG8gMVYgbW9kZS4KKyNmb3Igc3BlY2lmaWMgcXVhZCB1c2Ugc3JkX3R4X2Rydl9odl9kaXNhYmxlX3F1YWRfWCB3aGVyZSBYIGlzIChGU1JEIG51bSAqIDQgKyBpbnRlcm5hbCBxdWFkKQorc3JkX3R4X2Rydl9odl9kaXNhYmxlLkJDTTg4NjUwPTEKKworI1BvcnQgaW5pdCBtb2RlCisjcG9ydF9pbml0X2R1cGxleD0wCisjcG9ydF9pbml0X2Fkdj0wCisjcG9ydF9pbml0X2F1dG9uZWc9MAorCisKKyMgVGhpcyBkaXNhYmxlcyBzZXJkZXMgaW5pdGlhbGl6YXRpb24KKyMgcGh5X251bGwuQkNNODg2NTA9MQorCisjIyAgTnVtYmVyIG9mIEludGVybmFsIHBvcnRzCisjIEVuYWJsZSB0aGUgRVJQIHBvcnQuIFZhbHVlczogMCAvIDEuCitudW1fZXJwX3RtX3BvcnRzLkJDTTg4NjUwPTEKKyMgRW5hYmxlIHRoZSBPTFAgcG9ydC4gVmFsdWVzOiAwIC8gMS4KK251bV9vbHBfdG1fcG9ydHMuQkNNODg2NTA9MQorCisjIyBGaXJtd2FyZSBMb2FkIE1ldGhvZAorbG9hZF9maXJtd2FyZS5CQ004ODY1MD0weDEwMgorbG9hZF9maXJtd2FyZS5CQ004ODY3NT0weDEwMgorbG9hZF9maXJtd2FyZV9mYWJyaWMuQkNNODg2NzU9MHgxMDIKK2xvYWRfZmlybXdhcmVfZmFicmljLkJDTTg4NjgwPTB4MTAyCisKKyMjIyBIZWFkZXJzIGNvbmZpZ3VyYXRpb24gIyMjCisKKyMjIFVzZSBvZiB0aGUgdG1fcG9ydF9oZWFkZXJfdHlwZV88TG9jYWwtUG9ydC1JZD49PEhlYWRlci10eXBlPgorIyMgRGVmYXVsdCBoZWFkZXIgdHlwZSBpcyBkZXJpdmVkIGZyb20gZmFwX2RldmljZV9tb2RlOiBJZiBmYXBfZGV2aWNlX21vZGUgaXMKKyMjIFBQLCBkZWZhdWx0IGhlYWRlciB0eXBlIGlzIEVUSC4gT3RoZXJ3aXNlLCBkZWZ1YWx0IGhlYWRlciB0eXBlIGlzIFRNLgorIyMgSGVhZGVyIHR5cGUgcGVyIHBvcnQgY2FuIGJlIG92ZXJyaWRlbi4KKyMjIEFsbCBvcHRpb25zOiBFVEgvUkFXL1RNL1BST0cvQ1BVL1NUQUNLSU5HL1RETS9URE1fUkFXL1VESF9FVEgKKyMjIEluamVjdGVkIGhlYWRlciB0eXBlczogaWYgUFRDSCwgSU5KRUNURUQgKGxvY2FsIFBvcnQgb2YgdHlwZSBUTSkgb3IgSU5KRUNURURfUFAgKFBQKQorIyMgICAgICAgICAgICAgICAgICAgICAgICBpZiBQVENILTIsIElOSkVDVEVEXzIgKGxvY2FsIFBvcnQgb2YgdHlwZSBUTSkgb3IgSU5KRUNURURfMl9QUCAoUFApCisKKyMgU2V0IENQVSB0byB3b3JrIHdpdGggVE0gaGVhZGVyIChJVE1IKQorI3RtX3BvcnRfaGVhZGVyX3R5cGVfMC5CQ004ODY1MD1UTQorCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzAuQkNNODg2NTA9SU5KRUNURURfMgordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMC5CQ004ODY1MD1UTQorCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMC5CQ004ODY1MD1JTkpFQ1RFRF8yX1BQCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDAuQkNNODg2NTA9RVRICit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMS5CQ004ODY1MD1JTkpFQ1RFRF8yX1BQCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDEuQkNNODg2NTA9RVRICit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMi5CQ004ODY1MD1JTkpFQ1RFRF8yX1BQCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDIuQkNNODg2NTA9RVRICit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMy5CQ004ODY1MD1JTkpFQ1RFRF8yX1BQCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDMuQkNNODg2NTA9RVRICisKKworIyMjIFBhcnNlciBDb25maWd1cmF0aW9uICMjIworIyBQYXJzZXIgaGFzIDQgY3VzdG9tIG1hY3JvcyB0aGF0IGFyZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgYW5kCisjIGNvbmZpZ3VyZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYW5kIHNvYyBwcm9wZXJ0aWVzOgorIyBUcmlsbCAoMSBtYWNybykgLSB0cmlsbF9tb2RlCisjIEZDb0UgKDIgbWFjcm9zKSAtIGJjbTg4Nnh4X2Zjb2Vfc3dpdGNoX21vZGUKKyMgVnhMQU4gKDEgbWFjcm8pIC0gYmNtODg2eHhfdnhsYW5fZW5hYmxlCisjIElQdjYtRXh0ZW5zaW9uLWhlYWRlciAoMiBtYWNyb3MpIC0gYmNtODg2eHhfaXB2Nl9leHRfaGRyX2VuYWJsZQorIyBVRFAgKDEgbWFjcm8pIC0gVURQIHBhcnNpbmcgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBhbmQgY2FuIGJlCisjICBkaXNhYmxlZCB3aXRoIHNvYyBwcm9wZXJ0eSBjdXN0b21fZmVhdHVyZV91ZHBfcGFyc2VfZGlzYWJsZQorIyAgV2hlbiBkaXNhYmxpbmcgVURQIHBhcnNpbmcgVnhMQU4gYW5kIDE1ODhvVURQIGFyZSBhZmZlY3RlZAorCisKKyMgSW4gRkNvRSBOUFYgc3dpdGNoLCBpZiBzZXQgdG8gMSwgCisjIHBhY2tldHMgdGhhdCBpbmdyZXNzIGZyb20gdGhlIE5fUE9SVCBhcmUgdHJlYXRlZCBhcyBicmlkZ2UKKyMgYW5kIHBhY2tldHMgdGhhdCBpbmdyZXNzIGZyb20gdGhlIE5QX1BPUlQgYXJlIHRyZWF0ZWQgYXMgcm91dGVyCisjZmNvZV9ucHZfYnJpZGdlX21vZGU9MQorIyBFbmFibGUgSVB2NiBFeHRlbnNpb24gSGVhZGVyLCAwIC0gZGlzYWJsZSAoZGVmYXVsdCksIDEgLSBlbmFibGUKKyNiY204ODZ4eF9pcHY2X2V4dF9oZHJfZW5hYmxlPTEKKworIyBEaXNhYmxlIFVEUCBwYXJzaW5nLCAwIC0gZW5hYmxlIChkZWZhdWx0KSwgMSAtIGRpc2FibGUKKyNjdXN0b21fZmVhdHVyZV91ZHBfcGFyc2VfZGlzYWJsZT0xCisKKyNPQU1QL1NBVCBwb3J0CisjdG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjMyLkJDTTg4NjUwPUNQVQordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjMyLkJDTTg4Njc1PUNQVQorCisjIyMgU0FUCisjIyBFbmFibGUgU0FUIEludGVyZmFjZS4gMCAtIERpc2FibGUsIDEgLSBFbmFibGUgKERlZmF1bHQpIAorc2F0X2VuYWJsZT0xCisKKyMgU2V0IHRoZSByZWN5Y2xpbmcgcG9ydCBwcm9jZXNzaW5nIHRvIGJlIHJhdyAoc3RhdGljIGZvcndhcmRpbmcpCit0bV9wb3J0X2hlYWRlcl90eXBlX3JjeS5CQ004ODY1MD1SQVcKKworIyMjIFJDUFUKKyMgVmFsaWQgQ1BVIGxvY2FsIHBvcnRzIG9uIHdoaWNoIFJDUFUgcGFja2V0cyBjYW4gYmUgcmVjZWl2ZWQgYnkgc2xhdmUgZGV2aWNlLgorI3JjcHVfcnhfcGJtcD0weGYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorCisjdG1fcG9ydF9oZWFkZXJfdHlwZV81MTQuQkNNODg2NTA9UkFXCisKKyMjIEhlYWRlciBleHRlbnNpb25zCisjIFNldCBpZiBhbiBGVE1IIE91dC1MSUYgZXh0ZW5zaW9uIGlzIHByZXNlbnQgdG8gVW5pY2FzdCBhbmQgTXVsdGljYXN0IHBhY2tldHMKKyMgT3B0aW9uczogTkVWRVIgLyBJRl9NQyAob25seSBNdWx0aWNhc3QgcGFja2V0cykgLyBBTFdBWVMKK2ZhYnJpY19mdG1oX291dGxpZl9leHRlbnNpb24uQkNNODg2NTA9SUZfTUMKKworIyBTZXQgdGhlIEZUTUggTG9hZC1CYWxhbmNpbmcgS2V5IGV4dGVuc2lvbiBtb2RlCisjIE9wdGlvbnMgZm9yIDg4NjYwOiBFTkFCTEVELCBGVUxMX0hBU0gKKyMgT3B0aW9ucyBmb3IgODg2NTA6IEVOQUJMRUQKKyMgT3B0aW9ucyBmb3IgODg2NDAgY29tcGF0aWJsZTogRElTQUJMRUQgLyA4Ql9MQl9LRVlfOEJfU1RBQ0tJTkdfUk9VVEVfSElTVE9SWQorIyAvIDE2Ql9TVEFDS0lOR19ST1VURV9ISVNUT1JZIC8gU1RBTkRCWV9NQ19MQiAoYXZhaWxhYmxlIG9ubHkgZm9yIEFyYWRQbHVzKQorIyBEZWZhdWx0OiBESVNBQkxFRAorc3lzdGVtX2Z0bWhfbG9hZF9iYWxhbmNpbmdfZXh0X21vZGUuQkNNODg2NTA9RElTQUJMRUQKKworIyBTZXQgaWYgYW4gT1RNSCBPdXQtTElGIChDVUQpIEV4dGVuc2lvbiBpcyBwcmVzZW50IHRvIFVuaWNhc3QgYW5kIE11bHRpY2FzdCBwYWNrZXRzCisjIE9wdGlvbnM6IE5FVkVSIC8gSUZfTUMgKG9ubHkgTXVsdGljYXN0IHBhY2tldHMpIC8gQUxXQVlTIC8gRE9VQkxFX1RBRyAodHdvIGhvcCBzY2hlZHVsaW5nKSAvIEVYVEVOREVEOiBFeHRlbmRlZCAyNCBiaXQgQ1VECisjIERlZmF1bHQ6IE5FVkVSCisjIHRtX3BvcnRfb3RtaF9vdXRsaWZfZXh0X21vZGVfMTMuQkNNODg2NTA9TkVWRVIKKworIyBTZXQgaWYgYW4gT1RNSCBTb3VyY2UtU3lzdGVtLVBvcnQgRXh0ZW5zaW9uIGlzIHByZXNlbnQuCisjIE9wdGlvbjogMC8xCisjIERlZmF1bHQ6IDAKKyMgdG1fcG9ydF9vdG1oX3NyY19leHRfZW5hYmxlXzEzLkJDTTg4NjUwPTAKKworI1RydW5rIGhhc2ggZm9ybWF0LCByZWxldmFudCBvbmx5IGZvciBBcmFkUGx1cy4gUG9zc2libGUgdmFsdWVzOiBOT1JNQUwgKGRlZmF1bHQpIC8gSU5WRVJURUQgLyBEVVBMSUNBVEVELgorI3RydW5rX2hhc2hfZm9ybWF0PU5PUk1BTAorCisjIyBTdGFja2luZyBBcHBsaWNhdGlvbgorI3N0YWNraW5nX2VuYWJsZS5CQ004ODY1MD0xCisKKyMjIERldGVybWluZSBpZiBGVE1IIERlc3RpbmF0aW9uIFN5c3RlbSBQb3J0IEV4dGVuc2lvbiBpcyBhZGRlZCB0byBhbGwgRXRoZXJuZXQgcGFja2V0cy4KKyNmdG1oX2RzcF9leHRlbnNpb25fYWRkPTEKKworIyMgRGV0ZXJtaW5lIGlmIEZUTUggRGVzdGluYXRpb24gU3lzdGVtIFBvcnQgRXh0ZW5zaW9uIG9mIG1pcnJvcmVkL3Nub29wZWQgcGFja2V0cyBpcyBzdGFtcGVkIHdpdGggdGhlIG9yaWdpbmFsIGRlc3RpbmF0aW9uLgorI21pcnJvcl9zdGFtcF9zeXNfb25fZHNwX2V4dD0xCisKKyMjIFN5c3RlbSBSRUQKKyMgU2V0IFN5c3RlbS1SZWQgZnVuY3Rpb25hbGl0eS4KKyNzeXN0ZW1fcmVkX2VuYWJsZS5CQ004ODY1MD0xCisKKyMgSW5kaWNhdGUgdGhlIHNpemUgKEJ5dGVzKSBvZiBhIGZpcnN0IGhlYWRlciB0byBza2lwCisjIGJlZm9yZSB0aGUgbWFqb3IgaGVhZGVyIGF0IGluZ3Jlc3MgKGUuZy4gRXRoZXJuZXQsIElUTUgpCisjIEl0IGNhbiBiZSBzZXQgcGVyIHBvcnQgYWxzbworZmlyc3RfaGVhZGVyX3NpemUuQkNNODg2NTA9MAorCisjIEluZGljYXRlIHRoZSBzaXplIChCeXRlcykgb2YgdGhlIFBNRiBFeHRlbnNpb24gSGVhZGVycworIyB0byByZW1vdmUgZm9yIFRNIGhlYWRlciB0eXBlIHBvcnRzIChleHBlY3RpbmcgSVRNSCkKKyMgU2V0IHBlciBwb3J0CisjcG9zdF9oZWFkZXJzX3NpemVfMC5CQ004ODY1MD00CisKKyMgSW5kaWNhdGUgdGhlIHNpemUgKEJ5dGVzKSBvZiB0aGUgVXNlci1IZWFkZXJzOiBjb25maWd1cmFibGUKKyMgaGVhZGVycyBsb2NhdGVkIGluIHRoZSBmYWJyaWMgYmV0d2VlbiBpbnRlcm5hbCBoZWFkZXJzIGFuZAorIyBFdGhlcm5ldC4gVGhlaXIgdmFsdWVzIGFyZSBzZXQgYnkgSW5ncmVzcyBGUCwgYW5kIGNhbiBiZSB1c2VkCisjIGJ5IEVncmVzcyBGUCBvciBFZ3Jlc3MgRWRpdG9yLgorIyB1bml0czogYml0cy4gNCB2YWx1ZXMgY2FuIGJlIHNldDoKKyMgMCAtIHNpemUgb2YgdGhlIDFzdCBVc2VyLUhlYWRlciwgZm9yIHRoZSBFZ3Jlc3MgUE1GLiAwYiAvIDhiIC8gMTZiCisjIDEgLSBzaXplIG9mIHRoZSAybmQgVXNlci1IZWFkZXIsIGZvciB0aGUgRWdyZXNzIFBNRi4gMGIgLyA4YiAvIDE2YgorIyBUaGUgc3VtIG9mIHRoZXNlIDIgdmFsdWVzIHNob3VsZCBiZSB1bmRlciAxNmIKKyMgMiwgMyAtIHNpemUgb2YgdGhlIDFzdC8ybmQgVXNlci1IZWFkZXIsIGZvciB0aGUgRWdyZXNzIEVkaXRvci4KKyMgMGIgLyA4YiAvIDE2YiAvIDI0YiAvIDMyYgorIyBFYWNoIG9mIHRoZSBnbG9iYWwgVXNlci1IZWFkZXIgc2l6ZSBtdXN0IGJlIHVuZGVyIDMyIGJpdHMsIGJ1dCBub3QgMjQgYml0cy4KKyMgVGhlIEVncmVzcyBGUCBmaWVsZCBpcyBhbHdheXMgYXQgdGhlIE1TQiBvZiB0aGUgVXNlci1IZWFkZXIKKyMgTm90IGF2YWlsYWJsZSBmb3IgODg2NTAtQTAuCisjZmllbGRfY2xhc3NfaWRfc2l6ZV8wLkJDTTg4NjUwPTgKKyNmaWVsZF9jbGFzc19pZF9zaXplXzEuQkNNODg2NTA9MAorI2ZpZWxkX2NsYXNzX2lkX3NpemVfMi5CQ004ODY1MD0yNAorI2ZpZWxkX2NsYXNzX2lkX3NpemVfMy5CQ004ODY1MD0wCisKKworIyMjIFRydW5rIC0gTEFHIGNvbmZpZ3VyYXRpb24gIyMjCisjIFNldCB0aGUgbnVtYmVyIG9mIExBR3M6IDEwMjQsIDUxMiwgMjU2LCAxMjggb3IgNjQKK251bWJlcl9vZl90cnVua3MuQkNNODg2NTA9MjU2CisjIFVzaW5nIHRoZSBsYi1rZXkncyBNU0IgaW4gdHJ1bmsgcmVzb2x1dGlvbnMuCisjIDAgPSB1c2UgTFNCIChkZWZhdWx0KQorIyAxID0gdXNlIE1TQgordHJ1bmtfcmVzb2x2ZV91c2VfbGJfa2V5X21zYl9zdGFjayA9IDAKK3RydW5rX3Jlc29sdmVfdXNlX2xiX2tleV9tc2Jfc21vb3RoX2RpdmlzaW9uID0gMAorCisjIyMgU1lOQ0UgY29uZmlndXJhdGlvbiAjIyMKKyMjIFN5bmNocm9ub3VzIEV0aGVybmV0IFNpZ25hbCBNb2RlLgorIyMgT3B0aW9uczogVFdPX0RJRkZfQ0xLLCBUV09fQ0xLX0FORF9WQUxJRC4gRGVmYXVsdDogVFdPX0NMS19BTkRfVkFMSUQKKyNzeW5jX2V0aF9tb2RlLkJDTTg4NjUwPVRXT19DTEtfQU5EX1ZBTElECisKKyMjIENsb2NrIFNvdXJjZSAoc2luZ2xlIFNlckRlcykgbGFuZSBpbiB0aGUgc3BlY2lmaWVkIE5JRiBwb3J0LgorIyMgVXNhZ2U6IHN5bmNfZXRoX2Nsa190b19uaWZfaWRfY2xrXzxjbGtfbnVtYmVyPj08c2VyZGVzX251bWJlcj4KKyNzeW5jX2V0aF9jbGtfdG9fbmlmX2lkX2Nsa18wLkJDTTg4NjUwPTEKKyNzeW5jX2V0aF9jbGtfdG9fbmlmX2lkX2Nsa18xLkJDTTg4NjUwPTEKKworIyMgQ2xvY2sgRGl2aWRlciBmb3IgdGhlIHNlbGVjdGVkIHJlY292ZXJlZCBjbG9jay4gVmFsaWQgdmFsdWVzOiAxLzIvNC4gRGVmYXVsdDogMS4KKyMjIFVzYWdlOiBzeW5jX2V0aF9jbGtfZGl2aWRlcl9jbGtfPGNsa19udW1iZXI+PTwxLzIvND4KKyNzeW5jX2V0aF9jbGtfZGl2aWRlcl9jbGtfMC5CQ004ODY1MD0xCisjc3luY19ldGhfY2xrX2RpdmlkZXJfY2xrXzEuQkNNODg2NTA9MQorCisjIyBVc2FnZTogc3luY19ldGhfY2xrX3RvX3BvcnRfaWRfY2xrXzxjbGtfbnVtYmVyPj08c2VyZGVzX251bWJlcj4KKyNzeW5jX2V0aF9jbGtfdG9fcG9ydF9pZF9jbGtfMC5CQ004ODY3NT0xMworI3N5bmNfZXRoX2Nsa190b19wb3J0X2lkX2Nsa18xLkJDTTg4Njc1PTEzCisKKyMjIENsb2NrIGZyZXF1ZW5jeSBzZWxlY3RvciBmb3IgdGhlIHNlbGVjdGVkIHJlY292ZXJlZCBjbG9jay4gVmFsaWQgdmFsdWVzOiA8MTI1TUh6LTAvMTU2LjI1TUh6LTEvMjVNSHotMj4uIERlZmF1bHQ6IDEuCisjIyBVc2FnZTogc3luY19ldGhfY2xrX2RpdmlkZXJfY2xrPGNsa19pZD49PDAtMTI1TUh6LzEtMTU2LjI1TUh6LzItMjVNSHo+Cisjc3luY19ldGhfY2xrX2RpdmlkZXJfY2xrMC5CQ004ODY3NT0xCisjc3luY19ldGhfY2xrX2RpdmlkZXJfY2xrMS5CQ004ODY3NT0xCisKKyMjIEVuYWJsZSB0aGUgYXV0b21hdGljIHNxdWVsY2ggZnVuY3Rpb24gZm9yIHRoZSByZWNvdmVyZWQgY2xvY2suIFZhbGlkIHZhbHVlczogMC8xLiBEZWZhdWx0OiAwLgorIyMgVXNhZ2U6IHN5bmNfZXRoX2Nsa19zcXVlbGNoX2VuYWJsZV9jbGtfPGNsa19udW1iZXI+PTwwLzE+Cisjc3luY19ldGhfY2xrX3NxdWVsY2hfZW5hYmxlX2Nsa18wLkJDTTg4NjUwPTAKKyNzeW5jX2V0aF9jbGtfc3F1ZWxjaF9lbmFibGVfY2xrXzEuQkNNODg2NTA9MAorCisjIyMgRUxLIGNvbmZpZ3VyYXRpb24gIyMjCisjIyBFeHRlcm5hbCBsb29rdXAgKFRDQU0pIERldmljZSB0eXBlIHNlbGVjdCwgSW5kaWNhdGUgdGhlIEV4dGVybmFsIGxvb2t1cCBEZXZpY2UgdHlwZS4KKyMgVmFsdWUgT3B0aW9uczogTk9ORS9OTDg4NjUwLiBEZWZhdWx0OiBOT05FLgorI2V4dF90Y2FtX2Rldl90eXBlPU5MODg2NTAKKworCisjI0V4dGVybmFsIGxvb2t1cCAoZWxrKSBJTEtOIGxhbmVzIHN3YXAuIElmIHNldCwgcmV2ZXJzZSB0aGUgbGFuZXMgbnVtYmVyaW5nIG9yZGVyIG9uIGVsayBkZXZpY2Ugc2lkZS4gRE5YIHN5c3RlbSBkZWZhdWx0IGlzIDEuCisjZXh0X2lsa25fcmV2ZXJzZT0wCisKKyMjIFNldCBFTEsgRldEIHRhYmxlIFNpemUuCisjIGZvcm1hdDogZXh0X3h4eF9md2RfdGFibGVfc2l6ZS4KKyMgd2hlcmUgeHh4IHJlcGxhY2VkIGJ5IEZXRCBvcHRpb25zOiBpcDRfdWNfcnBmL2lwNF9tYy9pcDZfdWNfcnBmL2lwNi9pcDZfbWMvdHJpbGxfdWMvdHJpbGxfbWMvbXBscy9jb3VwX21wbHMKKyMgVmFsdWUgT3B0aW9uczogKDApIC0gRXh0ZXJuYWwgdGFibGUgZGlzYWJsZWQsID4wOiBudW1iZXIgb2YgZW50cmllcy4gRGVmYXVsdDogMC4KKyNleHRfaXA0X3VjX3JwZl9md2RfdGFibGVfc2l6ZT04MTkyCisjZXh0X2lwNF9tY19md2RfdGFibGVfc2l6ZT04MTkyCisKKyNFeHRlcm5hbCBUQ0FNIHJlc3VsdCBzaXplLCBhbGxvd3MgdG8gbW9kaWZ5IGVhY2ggZXh0ZXJuYWwgdGNhbSByZXN1bHQgc2l6ZS4gCisjVGhlIHRvdGFsIHNpemUgb2YgdGhlIGV4dGVybmFsIHJlc3VsdCBmb3IgTkwxMksgPSAxMjBiaXQgLgorI1RoZSBzaXplIG9mIGVhY2ggc2VnbWVudCB1cGRhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHF1YWxpZmllciBiY21GaWVsZFF1YWxpZnlFeHRlcm5hbFZhbHVlLiAKKyNEZWZhdWx0IHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIGRldmljZSBwcm9wZXJ0eS4KKyNpbi1jYXNlIG9mIGRvdWJsZSBjYXBhY2l0eSB1c2UgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IDQ4LDQ4LDI0LDI0IGFuZCBleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50X3BhZF8zPTI0CisKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzA9NDgKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzE9MzIKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzI9MjQKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzM9MTYKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzQ9MzIKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzU9MzIKKworIyMgU2V0IEVMSyBJUCBGV0QgdXNlIE5ldFJvdXRlICBBTEcuCisjIFZhbHVlIE9wdGlvbnM6IEFMR19MUE1fTFBNL0FMR19MUE1fTkVUUk9VVEUvQUxHX0xQTV9UQ0FNLiBEZWZhdWx0OiBBTEdfTFBNX1RDQU0uCisjZXh0X2Z3ZF9hbGdvcml0aG1fbHBtPUFMR19MUE1fVENBTQorCisjIyBTZXQgRUxLIGludGVyZmFjZSBtb2RlLgorIyBDaGFuZ2UgRUxLIGludGVyZmFjZSBjb25maWd1cmF0aW9uIHRvIHN1cHBvcnQgQ0FVSSBwb3J0LgorIyBWYWx1ZSBPcHRpb25zOiAwLzEuIDAgLSBOb3JtYWwgbW9kZSwgMSAgMiBDQVVJIHBvcnQgKyBFTEsgbW9kZS4gRGVmYXVsdDogMC4KKyNleHRfaW50ZXJmYWNlX21vZGU9MAorCisjIyMgQ29uZmlndXJlIE1ESU8gaW50ZXJmYWNlCisjIEV4dGVybmFsIE1ESU8gY2xvY2sgcmF0ZSBkaXZpc29yIC4gRGVmYXVsdDogMHgyNC4KKyNyYXRlX2V4dF9tZGlvX2Rpdmlzb3I9MHgzNgorIyBFeHRlcm5hbCBNRElPIGNsb2NrIHJhdGUgZGl2aXNvci4gRGVmYXVsdDogMHgxLgorI3JhdGVfZXh0X21kaW9fZGl2aWRlbmQ9MQorCisjIyMgVERNIC0gT1ROIGNvbmZpZ3VyYXRpb24gIyMjCisjIE9wdGlvbnM6IDAgLyBURE1fT1BUSU1JWkVEIC8gVERNX1NUQU5EQVJECitmYXBfdGRtX2J5cGFzcy5CQ004ODY1MD0wCisKKyMjIyBURE0gLSBSQVcvUEFDS0VUIGNvbmZpZ3VyYXRpb24gIyMjCisjIGlmIGZhcF90ZG1fcGFja2V0IGNvbmZpZyB0byBiZSB0cnVlLCBlbmFibGUgc3BlY2lmaWMgcG9ydHMgb24gdGhlIGRldmljZSB0byBjb25maWd1cmUgZm9yIHRkbSBwYWNrZXQgbW9kZSB0cmFmZmljLgorZmFwX3RkbV9wYWNrZXQuQkNNODg2NTA9MAorCisjIEluZGljYXRlIGlmIGEgUGV0cmEtQiBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHRoZSBhY3R1YWwgZGV2aWNlCisjIEZvciBURE0vT1ROIGFwcGxpY2F0aW9ucywKKyMgc3lzdGVtX2lzX3BldHJhX2JfaW5fc3lzdGVtLkJDTTg4NjUwPTAKKyMjSW5kaWNhdGUgaWYgVERNIGNhbiBhcnJpdmUgdGhyb2doIHByaW1hcnkgcGlwZS4KKyNTaG91bGQgYmUgMSBmb3IgYSBTeXN0ZW0gd2l0aCBQZXRyYUIgdGhhdCBjb25uZWN0ZWQgdG8gZmFicmljIG92ZXIgcHJpbWFyeSBwaXBlLgorZmFicmljX3RkbV9vdmVyX3ByaW1hcnlfcGlwZS5CQ004ODY1MD0wCisKKyMjIyBGYWJyaWMgY29uZmlndXJhdGlvbiAjIyMKKyMwLUxGRUMgMS04YlwxMGIgMi1GRUMgMy1CRUMKK2JhY2twbGFuZV9zZXJkZXNfZW5jb2RpbmcuQkNNODg2NTA9MgorI1Bvc3NpYmxlIHZhbHVlcyAtIEtSX0ZFQywgNjRfNjYsIFJTX0ZFQywgTExfUlNfRkVDCitiYWNrcGxhbmVfc2VyZGVzX2VuY29kaW5nLkJDTTg4Njc1PVJTX0ZFQworYmFja3BsYW5lX3NlcmRlc19lbmNvZGluZy5CQ004ODQ3MD1SU19GRUMKK2JhY2twbGFuZV9zZXJkZXNfZW5jb2RpbmcuQkNNODgyNzA9UlNfRkVDCitiYWNrcGxhbmVfc2VyZGVzX2VuY29kaW5nLkJDTTg4NjgwPVJTX0ZFQworCisjU0ZJIHNwZWVkIHJhdGUKK3BvcnRfaW5pdF9zcGVlZF9zZmkuQkNNODg2NTA9MTAzMTIKK3BvcnRfaW5pdF9zcGVlZF9zZmkuQkNNODg2NzU9MjUwMDAKK3BvcnRfaW5pdF9zcGVlZF9zZmkuQkNNODg0NzA9MjUwMDAKK3BvcnRfaW5pdF9zcGVlZF9zZmkuQkNNODgyNzA9MjUwMDAKK3BvcnRfaW5pdF9zcGVlZF9zZmkuQkNNODg2ODA9MjUwMDAKKworI0NMNzIKK3BvcnRfaW5pdF9jbDcyX3NmaS5CQ004ODY1MD0xCitwb3J0X2luaXRfY2w3Ml9zZmkuQkNNODg2NzU9MQorZmFicmljX3NlZ21lbnRhdGlvbl9lbmFibGUuQkNNODg2NTA9MQorCisjIyBGYWJyaWMgdHJhbnNtaXNzaW9uIG1vZGUKKyMgU2V0IHRoZSBDb25uZWN0IG1vZGUgdG8gdGhlIEZhYnJpYworIyBPcHRpb25zOiBGRSAtIHByZXNlbmNlIG9mIGEgRmFicmljIGRldmljZSAoc2luZ2xlIHN0YWdlKSAvIE1VTFRfU1RBR0VfRkUgLSAgTXVsdGktc3RhZ2UgLworIyBTSU5HTEVfRkFQIC0gc3RhbmQtYWxvbmUgZGV2aWNlIC8gTUVTSCAtIG1lc2ggLyBCQUNLMkJBQ0sgLSAyIGRldmljZXMgaW4gTWVzaAorI2ZhYnJpY19jb25uZWN0X21vZGUuQkNNODg2NTA9U0lOR0xFX0ZBUAorZmFicmljX2Nvbm5lY3RfbW9kZS5CQ004ODY1MD1GRQorIyBUaGUgSmVyaWNobyBjb25maWd1cmF0aW9uIGJlbG93IHdpbGwgYmUgb3ZlcnJpZGVuIGluIGplci5zb2MgZm9yIG11bHRpIGRldmljZSBjb25maWd1cmF0aW9ucworZmFicmljX2Nvbm5lY3RfbW9kZS5CQ004ODY3NT1TSU5HTEVfRkFQCitmYWJyaWNfY29ubmVjdF9tb2RlLkJDTTg4NDcwPVNJTkdMRV9GQVAKK2ZhYnJpY19jb25uZWN0X21vZGUuQkNNODgyNzA9U0lOR0xFX0ZBUAorZmFicmljX2Nvbm5lY3RfbW9kZS5CQ004ODY4MD1TSU5HTEVfRkFQCisKKworIyMgQ2VsbCBmb3JtYXQgY29uZmlndXJhdGlvbgorIyBJbmRpY2F0ZSBpZiB0aGUgdHJhZmZpYyBjYW4gYmUgc2VudCBpbiBkdWFsIHBpcGUKK2lzX2R1YWxfbW9kZS5CQ004ODY1MD0wCisjIEluZGljYXRlIG9uIHRoZSBleGlzdGFuY2Ugb2YgZHVhbCBwaXBlIGRldmljZSBtb2RlIGluIHN5c3RlbQorc3lzdGVtX2lzX2R1YWxfbW9kZV9pbl9zeXN0ZW0uQkNNODg2NTA9MAorCisjIEluZGljYXRlIHRoZSBmb3JtYXQgb2YgdGhlIGNlbGw6CisjIEEgVkNTMTI4IGNlbGwgaXMgdXNlZCBpZiBzeXN0ZW1faXNfdmNzXzEyOF9pbl9zeXN0ZW0gb3Igc3lzdGVtX2lzX2ZlNjAwX2luX3N5c3RlbSBpcyBUUlVFCitzeXN0ZW1faXNfdmNzXzEyOF9pbl9zeXN0ZW0uQkNNODg2NTA9MAorc3lzdGVtX2lzX2ZlNjAwX2luX3N5c3RlbS5CQ004ODY1MD0wCisKKyMjIyBXUkVEICMjIworCisjIFNldCB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgV1JFRCB0ZXN0cy4gMCAtIG1lYW5zIGlnbm9yZSBtYXggcGFja2V0IHNpemUuCitkaXNjYXJkX210dV9zaXplLkJDTTg4NjUwPTAKKworIyMjIE9DQiAoT24tQ2hpcCBCdWZmZXIpIGNvbmZpZ3VyYXRpb24gIyMjCisjIEVuYWJsZSB0aGUgT0NCCisjIEVuYWJsZSBNT0RFUzoKKyMgICAwL0ZBTFNFICAgICAgICAtLT4gIE9DQl9ESVNBQkxFRCAgICAgLS0+IE5vIE9DQiB1c2UKKyMgICAxL1RSVUUgICAgICAgICAtLT4gIE9DQl9FTkFCTEVEICAgICAgLS0+IExpa2UgaW4gQXJhZC1BMC9CMC4gU29tZSBwYWNrZXRzIG1heSB1c2UgYm90aCBEUkFNIGFuZCBPQ0IgcmVzb3VyY2VzCisjICAgT05FX1dBWV9CWVBBU1MgLS0+ICBEZXBlbmRzIG9uIG51bWJlciBvZiBwcmVzZW50IGRyYW1zIChhdmFpbGFibGUgb25seSBmb3IgQXJhZFBsdXMpOgorIyAgICAgICAgICAgICAgICAgICAgICAwIGRyYW1zOiAgIC0gT0NCX09OTFkKKyMgICAgICAgICAgICAgICAgICAgICAgMSBkcmFtczogICAtIE9DQl9PTkxZXzFfRFJBTSAgICAgLS0+ICA6IE9DQi1vbmx5IHdpdGggMSBEUkFNIGZvciB0aGUgZnJlZSBwb2ludGVycworIyAgICAgICAgICAgICAgICAgICAgICAyLTggZHJhbXM6IC0gT0NCX0RSQU1fU0VQQVJBVEUgICAtLT4gIDogT0NCIGFuZCBEUkFNIGNvZXhpc3Qgc2VwYXJhdGVseQorIyAgIERlZmF1bHQ6IFRSVUUuCitiY204ODZ4eF9vY2JfZW5hYmxlLkJDTTg4NjUwPTEKKworIyMgT0NCIChPbi1DaGlwIEJ1ZmZlcikgY29uZmlndXJhdGlvbgorIyBPQ0IgbW9kZXM6CisjICAgMCAtIERpc2FibGVkCisjICAgMSAtIEVuYWJsZWQgKERlZmF1bHQpLgorYmNtODg2eHhfb2NiX2VuYWJsZS5CQ004ODY3NT0xCisKKyMgT0NCIERhdGEgQnVmZmVyIHNpemUuIFBvc3NpYmxlIHZhbHVlczogMTI4LzI1Ni81MTIvMTAyNC4gRGVmYXVsdDogMjU2LgorYmNtODg2eHhfb2NiX2RhdGFidWZmZXJfc2l6ZS5CQ004ODY1MD0yNTYKKyMgT0NCIERhdGEgQnVmZmVyIHNpemUuIEplcmljaG8gYWxsb3dlZCB2YWx1ZXM6IDI1Ni81MTIuIERlZmF1bHQ6IDI1Ni4KK2JjbTg4Nnh4X29jYl9kYXRhYnVmZmVyX3NpemUuQkNNODg2NzU9MjU2CisjIFJlcGFydGl0aW9uIGJldHdlZW4gVW5pY2FzdCBhbmQgRnVsbCBNdWx0aWNhc3QgYnVmZmVycy4KKyMgMDogODAlIFVuaWNhc3QgYW5kIDIwJSBNdWx0aWNhc3QsIDE6IFVuaWNhc3QtT25seQorYmNtODg2eHhfb2NiX3JlcGFydGl0aW9uLkJDTTg4NjUwPTAKKworCisjIyMgUERNIGNvbmZpZ3VyYXRpb24gIyMjCisjIFNldCB0aGUgUERNIE1vZGUuCisjIDA6IHNpbXBsZSAoZGVmYXVsdCksIDE6IGV4dGVuZGVkIChtYW5kYXRvcnkgZm9yIExMRkMtVlNRLCBQRkMtVlNRLCBvciBTVC1WU1EpCitiY204ODZ4eF9wZG1fbW9kZS5CQ004ODY1MD0wCisKKyMjIyBNdWx0aWNhc3QgTnVtYmVyIG9mIERCdWZmIG1vZGUgIyMjCisjIFNldCBJUU0gRk1DIGJ1ZmZlcnMtcmVwbGljYXRpb24gc2l6ZXMKKyMgT3B0aW9ucyBmb3IgODg2NTA6IEFSQURfSU5JVF9GTUNfNEtfUkVQXzY0S19EQlVGRl9NT0RFL0FSQURfSU5JVF9GTUNfNjRfUkVQXzEyOEtfREJVRkZfTU9ERQorIyBEZWZhdWx0OiBBUkFEX0lOSVRfRk1DXzRLX1JFUF82NEtfREJVRkZfTU9ERQorbXVsdGljYXN0X25icl9mdWxsX2RidWZmLkJDTTg4NjUwPUFSQURfSU5JVF9GTUNfNEtfUkVQXzY0S19EQlVGRl9NT0RFCisKKyMjIyBNdWx0aWNhc3QgTnVtYmVyIG9mIERCdWZmIG1vZGUgIyMjCisjIFNldCBGTUMgYnVmZmVycy1yZXBsaWNhdGlvbiBzaXplcworIyBPcHRpb25zIGZvciA4ODY3NToKKyMgICAgSkVSSUNIT19JTklUX0ZNQ182NF9SRVBfNTEyS19EQlVGRl9NT0RFCisjICAgIEpFUklDSE9fSU5JVF9GTUNfNEtfUkVQXzI1NktfREJVRkZfTU9ERSAoRGVmYXVsdCkKKyMgICAgSkVSSUNIT19JTklUX0ZNQ19OT19SRVBfREJVRkZfTU9ERQorbXVsdGljYXN0X25icl9mdWxsX2RidWZmLkJDTTg4Njc1PUpFUklDSE9fSU5JVF9GTUNfNEtfUkVQXzI1NktfREJVRkZfTU9ERQorbXVsdGljYXN0X25icl9mdWxsX2RidWZmLkJDTTg4NDcwPUpFUklDSE9fSU5JVF9GTUNfTk9fUkVQX0RCVUZGX01PREUKK211bHRpY2FzdF9uYnJfZnVsbF9kYnVmZi5CQ004ODI3MD1KRVJJQ0hPX0lOSVRfRk1DX05PX1JFUF9EQlVGRl9NT0RFCittdWx0aWNhc3RfbmJyX2Z1bGxfZGJ1ZmYuQkNNODg2ODA9SkVSSUNIT19JTklUX0ZNQ180S19SRVBfMjU2S19EQlVGRl9NT0RFCisKKworIyMjIE11bHRpY2FzdCBjb25maWd1cmF0aW9uICMjIworIyBNdWx0aWNhc3QgZWdyZXNzIHZsYW4gbWVtYmVyc2hpcCByYW5nZS4gQnkgZGVmYXVsdDogMC00MDk1LgorZWdyZXNzX211bHRpY2FzdF9kaXJlY3RfYml0bWFwX21heC5CQ004ODY1MD00MDk1CisKKyMjIyMgSmVyaWNobyBjb25maWd1cmF0aW9uIG9mIHRoZSBudW1iZXIgb2YgaW5ncmVzcy9lZ3Jlc3MgbXVsdGljYXN0IGdyb3VwcworIyBJbmdyZXNzIG1heCBNQ0lEIGNhbiBiZSB1cCB0byAxMzEwNzAsIEVncmVzcyBtYXggTUNJRCBpbiBNZXNoIG9yIHNpbmdsZSBGQVAgbW9kZXMgaXMgdXAgdG8gNjU1MzUsCisjIG9yIG90aGVyd2lzZSBpcyB1cCB0byAxMzEwNzEuCisjbXVsdGljYXN0X2luZ3Jlc3NfZ3JvdXBfaWRfcmFuZ2VfbWF4LkJDTTg4Njc1PTMyNzY4CisjbXVsdGljYXN0X2VncmVzc19ncm91cF9pZF9yYW5nZV9tYXguQkNNODg2NzU9NjAwMDAKKworIyMjIFZPUSAtIEZsb3cgY29uZmlndXJhdGlvbiAjIyMKKworIyBTZXQgdGhlIFZPUSBtYXBwaW5nIG1vZGU6CisjIERJUkVDVDogTW9yZSB0aGFuIDRLIFN5c3RlbSBQb3J0cyBhcmUgc3VwcG9ydGVkLiBTeXN0ZW0tbGV2ZWwgV1JFRCBpcyBub3Qgc3VwcG9ydGVkLgorIyBJTkRJUkVDVDogc2ltaWxhciB0byBQZXRyYS1CLiBVcCB0byA0SyBTeXN0ZW0gUG9ydHMuCit2b3FfbWFwcGluZ19tb2RlLkJDTTg4NjUwPUlORElSRUNUCisKKyNFbmFibGUvZGlzYWJsZSBIUU9TIHN1cHBvcnQgLSBtYXBwaW5nIG9mIG1hbnkgc3lzdGVtIHBvcnRzIHRvIHNpbmdsZSBtb2Rwb3J0CitocW9zX21hcHBpbmdfZW5hYmxlLkJDTTg4NjUwPTAKKworIyBTZXQgdGhlIEJhc2UgUXVldWUgdG8gYmUgYWRkZWQgdG8gdGhlIHBhY2tldCBmbG93LWlkCisjIHdoZW4gdGhlIEZsb3ctSWQgaXMgc2V0IGV4cGxpY2l0ZWx5IGVpdGhlciBieSB0aGUgSVRNSAorIyBvciBieSB0aGUgRGVzdGluYXRpb24gcmVzb2x1dGlvbiBpbiB0aGUgUGFja2V0IHByb2Nlc3NpbmcKK2Zsb3dfbWFwcGluZ19xdWV1ZV9iYXNlLkJDTTg4NjUwPTAKKworCisjIFRoZSBhbGxvY2F0aW9uIG9mIHRoZSB0b3RhbCBwZXIgY29yZSByZXNvdXJjZXMgYmV0d2VlbiBzb3VyY2UgYW5kCisjIHF1ZXVlIGJhc2VkIHJlc2VydmF0aW9uIGRlcGVuZHMgb24gb25lIG9mIHR3byBndWFyYW50ZWUgbW9kZXM6IHN0cmljdCBhbmQgbG9vc2UuCisjaW5ncmVzc19jb25nZXN0aW9uX21hbmFnZW1lbnRfZ3VhcmFudGVlX21vZGU9e1NUUklDVCxMT09TRX0gZGVmYXVsdDogU1RSSUNUCitpbmdyZXNzX2Nvbmdlc3Rpb25fbWFuYWdlbWVudF9ndWFyYW50ZWVfbW9kZT1MT09TRQorIyBFYWNoIERQIGhhcyBpdHMgb3duIHRocmVzaG9sZHMgZm9yIHNvdXJjZSBiYXNlZCAoZHluYW1pYykgYW5kIGZvciBxdWV1ZSBiYXNlZCAocG9vbHMgMCwxIGFuZCBoZWFkcm9vbSkuCisjICBpbmdyZXNzX2Nvbmdlc3Rpb25fbWFuYWdlbWVudF97c291cmNlLHF1ZXVlLGFsbH1fdGhyZXNob2xkX3BlcmNlbnRhZ2VfY29sb3JfWzAtM109WzAtMTAwXSBkZWZhdWx0OiAxMDAsODUsNzUsMAorIyAgaW5ncmVzc19jb25nZXN0aW9uX21hbmFnZW1lbnRfe29jYl9vbmx5LGRyYW1fbWl4fV97cG9vbF97MCwxfSxoZWFkcm9vbX09c2l6ZSBkZWZhdWx0OiAwCisjICBpbmdyZXNzX2Nvbmdlc3Rpb25fbWFuYWdlbWVudF9taW5fcmVzb3VyY2VfcGVyY2VudGFnZV9keW5hbWljPVswLTgwXSBkZWZhdWx0OiAyMAorCisjIENvbmZpZ3VyZSBtYXhpbXVtIElEcyBvZiBTVC1WU1FzLCBtYXhpbXVtIElEcyBvZiBUTS1wb3J0cywgYW5kIGVuYWJsaW5nL2Rpc2FibGluZyBoZWFkZXIgY29tcGVuc2F0aW9uLiAKK2luZ3Jlc3NfY29uZ2VzdGlvbl9tYW5hZ2VtZW50X3N0YWdfbWF4X2lkLkJDTTg4Njc1PTAKK2luZ3Jlc3NfY29uZ2VzdGlvbl9tYW5hZ2VtZW50X3RtX3BvcnRfbWF4X2lkLkJDTTg4Njc1PTI1NQoraW5ncmVzc19jb25nZXN0aW9uX21hbmFnZW1lbnRfcGt0X2hlYWRlcl9jb21wZW5zYXRpb25fZW5hYmxlLkJDTTg4Njc1PTAKKworIyBUaGUgbnVtYmVyIG9mIHBhY2tldCBidWZmZXJzIHVzZWQgZm9yIHRoZSBhbGxvY2F0aW9uIG9mIERNQSBtZW1vcnkgYXQgQkNNIFJYIHRhc2sKKyMgVGhlIHBvb2wgc2l6ZSBkZXRlcm1pbmVkIGJ5IG5vZl9wa3RzICgyNTYpICogMTZLLgorI3J4X3Bvb2xfbm9mX3BrdHMuQkNNODg2NzU9MjU2CisKKworIyBTZXQgdGhlIG51bWJlciBvZiBwcmlvcml0aWVzIHN1cHBvcnRlZCBhdCBlZ3Jlc3MgcGVyIFBvcnQKKyMgT3B0aW9uczogMSAvIDIgLyA4Citwb3J0X3ByaW9yaXRpZXMuQkNNODg2NTA9OAorcG9ydF9wcmlvcml0aWVzLkJDTTg4Njc1PTIKK3BvcnRfcHJpb3JpdGllcy5CQ004ODQ3MD0yCitwb3J0X3ByaW9yaXRpZXMuQkNNODgyNzA9MgorcG9ydF9wcmlvcml0aWVzLkJDTTg4NjgwPTIKKworCisjIFNldCB0aGUgc2hhcmVkIG11bHRpY2FzdCByZXNvdXJjZSBtb2RlOiBTdHJpY3QgLyBEaXNjcmV0ZQorZWdyZXNzX3NoYXJlZF9yZXNvdXJjZXNfbW9kZS5CQ004ODY1MD1TdHJpY3QKKworIyBEZWZpbmUgb3V0Z29pbmcgcG9ydCByYXRlIG1vZGUgaW4gZGF0YSByYXRlIG9yIHBhY2tldCByYXRlLgorIyBPcHRpb25zOiBEQVRBIC8gUEFDS0VUCitvdG1fcG9ydF9wYWNrZXRfcmF0ZS5CQ004ODY1MD1EQVRBCisKKyMgU2V0IFBvcnQgZWdyZXNzIHJlY3ljbGluZyBzY2hlZHVsZXIgY29uZmlndXJhdGlvbi4KKyMgMDogU3RyaWN0IFByaW9yaXR5IFNjaGVkdWxlciwgMTogUm91bmQgUm9iaW4gU2NoZWR1bGVyCitwb3J0X2VncmVzc19yZWN5Y2xpbmdfc2NoZWR1bGVyX2NvbmZpZ3VyYXRpb24uQkNNODg2NTA9MAorCisjIFNldCBzdGF0aWNhbGx5IHRoZSByZWdpb24gbW9kZSBwZXIgcmVnaW9uIGlkCisjIDA6IHF1ZXVlIGNvbm5lY3RvcnMgb25seSAoSW50ZXJEaWdpdGF0ZWQgPSBGQUxTRSwgT2RkRXZlbiA9IFRSVUUpCisjIDE6IHF1ZXVlIGNvbm5lY3RvcnMsIFNFIChJbnRlckRpZ2l0YXRlZCA9VFJVRSwgT2RkRXZlbiA9IFRSVUUpCisjIDI6IHF1ZXVlIGNvbm5lY3RvcnMsIFNFIChJbnRlckRpZ2l0YXRlZCA9VFJVRSwgT2RkRXZlbiA9IEZBTFNFKQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl82NS5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzY2LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNjcuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl82OC5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzY5LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzAuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83MS5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzcyLkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzMuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83NC5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzc1LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzYuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83Ny5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzc4LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzkuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84MC5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzgxLkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODIuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84My5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzg0LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODUuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84Ni5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzg3LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODguQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84OS5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzkwLkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTEuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85Mi5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzkzLkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTQuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85NS5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzk2LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTcuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85OC5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzk5LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTAwLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTAxLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTAyLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTAzLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA0LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA1LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA2LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA3LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA4LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA5LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTEwLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTExLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTEyLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTEzLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE0LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE1LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE2LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE3LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE4LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE5LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTIwLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTIxLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTIyLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTIzLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTI0LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTI1LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTI2LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTI3LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTI4LkJDTTg4NjUwPTIKKworIyMgQ29uZmlndXJlIG51bWJlciBvZiBzeW1tZXRyaWMgY29yZXMgZWFjaCByZWdpb24gc3VwcG9ydHMgIyMKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEuQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQuQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl82LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzcuQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fOC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl85LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzExLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzYwLkJDTTg4NjUwPTIKKyNkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl9jb3JlMF8yLkJDTTg4Njc1PTIKKworIyMgQ29uZmlndXJlIG51bWJlciBvZiBzeW1tZXRyaWMgY29yZXMgZWFjaCByZWdpb24gc3VwcG9ydHMgIyMKKyNkZXZpY2VfY29yZV9tb2RlLkJDTTg4NDcwPVNJTkdMRV9DT1JFCisjIElMIHJlZ2lvbiBoYXMgb2Zmc2V0IG9mIDYzLCBpLmUuIHJlZ2lvbl8xIGhlcmUgd2lsbCBzaG93IGFzIHJlZ2lvbiA2NCBpbiBjb2RlCisjIyBDb25maWd1cmUgbnVtYmVyIG9mIHN5bW1ldHJpYyBjb3JlcyBlYWNoIHJlZ2lvbiBzdXBwb3J0cyAjIworZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMS5CQ004ODQ3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yLkJDTTg4NDcwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNC5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81LkJDTTg4NDcwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzYuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNy5CQ004ODQ3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl84LkJDTTg4NDcwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzkuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTAuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTEuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTIuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTMuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTQuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTUuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTYuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTcuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTguQkNNODg0NzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTkuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjAuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjEuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjIuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjMuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjQuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjUuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjYuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjcuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjguQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjkuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzAuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzEuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzIuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzMuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzQuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzUuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzYuQkNNODg0NzA9MQorCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zNy5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zOC5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zOS5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80MC5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80MS5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80Mi5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80My5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80NC5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80NS5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80Ni5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80Ny5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80OC5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80OS5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81MC5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81MS5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81Mi5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81My5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81NC5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81NS5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81Ni5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81Ny5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81OC5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81OS5CQ004ODQ3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl82MC5CQ004ODQ3MD0xCisKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzMuQkNNODg0NzA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zNC5CQ004ODQ3MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM1LkJDTTg4NDcwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzYuQkNNODg0NzA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zNy5CQ004ODQ3MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM4LkJDTTg4NDcwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzkuQkNNODg0NzA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80MC5CQ004ODQ3MD0wCisKKyMjIENvbmZpZ3VyZSBudW1iZXIgb2Ygc3ltbWV0cmljIGNvcmVzIGVhY2ggcmVnaW9uIHN1cHBvcnRzICMjCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xLkJDTTg4MjcwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMy5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl80LkJDTTg4MjcwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNi5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl83LkJDTTg4MjcwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzguQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fOS5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xMC5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xMS5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xMi5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xMy5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xNC5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xNS5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xNi5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xNy5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xOC5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8xOS5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yMC5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yMS5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yMi5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yMy5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yNC5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yNS5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yNi5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yNy5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yOC5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yOS5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zMC5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zMS5CQ004ODI3MD0xCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zMi5CQ004ODI3MD0xCisKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTcuQkNNODgyNzA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xOC5CQ004ODI3MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzE5LkJDTTg4MjcwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMjAuQkNNODgyNzA9MAorCisjIyMgRmxvdyBDb250cm9sIGNvbmZpZ3VyYXRpb24gIyMjCisjIFNldCB0aGUgRmxvdyBjb250cm9sIHR5cGUgcGVyIFBvcnQuCisjIE9wdGlvbnM6IExMIChMaW5rLWxldmVsKSAvIENCMiAoQ2xhc3MtQmFzZWQgLSAyIGNsYXNzZXMpIC8KKyMgQ0I4IChDbGFzcy1CYXNlZCAtIDggY2xhc3NlcykKKyMgZmxvd19jb250cm9sX3R5cGUuQkNNODg2NTA9TEwKKworIyMgT3V0LU9mLUJhbmQgRmxvdyBjb250cm9sIGNvbmZpZ3VyYXRpb24KKyNzcG5fRkNfT09CX1RZUEUsIHNwbl9GQ19PT0JfTU9ERSwgc3BuX0ZDX09PQl9DQUxFTkRFUl9MRU5HVEgsIHNwbl9GQ19PT0JfQ0FMRU5ERVJfUkVQX0NPVU5ULAorCisjIyBTZXQgdm9sdGFnZSBtb2RlIGZvciBvb2IgaW50ZXJmYWNlcworI0hTVExfMS41VgorIzMuM1YKKyNIU1RMXzEuNVZfVkRET19ESVZfMgorZXh0X3ZvbHRhZ2VfbW9kZV9vb2I9My4zVgorCisjIyBJbmJhbmQgSW50ZXJsYWtlbiBjb25maWd1cmF0aW9uCisjIHNwbl9GQ19JTkJBTkRfSU5UTEtOX01PREUsIHNwbl9GQ19JTkJBTkRfSU5UTEtOX0NBTEVOREVSX0xFTkdUSCwgc3BuX0ZDX0lOQkFORF9JTlRMS05fQ0FMRU5ERVJfUkVQX0NPVU5UCisjIHNwbl9GQ19JTkJBTkRfSU5UTEtOX0NBTEVOREVSX0xMRkNfTU9ERSwgc3BuX0ZDX0lOQkFORF9JTlRMS05fTExGQ19NVUJfRU5BQkxFX01BU0sKKworIyMjIE1ldGVyIGVuZ2luZSBjb25maWd1cmF0aW9uICMjIworCisjIFNwZWNpZnkgbWV0ZXIgb3BlcmF0aW9uIG1vZGUKKyMgMzIgLSBUd28gbWV0ZXJzIHBlciBwYWNrZXQgKDMyayB0b3RhbCkKKyMgNjQgLSBPbmUgbWV0ZXIgcGVyIHBhY2tldCAoNjRrIHRvdGFsKSBvciB0d28gbWV0ZXIgcGVyIHBhY2tldCBpbiBkdWFsIGNvcmUgZGV2aWNlIGNvbmZpZ3VyZWQgYXMgU0lOR0xFX0NPUkUgKDEyOEsgdG90YWwpCisjIDEyOCAtIE9uZSBtZXRlciBwZXIgcGFja2V0IGluIGR1YWwgY29yZSBkZXZpY2UgY29uZmlndXJlZCBhcyBTSU5HTEVfQ09SRSAoMTI4SyB0b3RhbCkKKyMgT3B0aW9uczogMCwgMzIsIDY0LCAxMjgKK3BvbGljZXJfaW5ncmVzc19jb3VudC5CQ004ODY1MD0zMgorcG9saWNlcl9pbmdyZXNzX2NvdW50LkJDTTg4NDcwPTMyCitwb2xpY2VyX2luZ3Jlc3NfY291bnQuQkNNODgyNzA9MzIKK3BvbGljZXJfaW5ncmVzc19jb3VudC5CQ004ODY4MD0zMgorCisKKyMgRm9yIG1ldGVycyBpbiBkb3VibGUgMzJrLzY0SyBtb2RlLCBkZXRlcm1pbmUgdGhlIHNoYXJpbmcgbW9kZQorIyBPcHRpb25zOgorIyAwIC0gTk9ORSAtIEZvciA2NGsgb3IgMTI4SyAob25lIG1ldGVyIHBlciBwYWNrZXQpCisjIDEgLSBTRVJJQUwgLSAzMmsgbW9kZSBvbmx5ICh0d28gbWV0ZXJzIHBlciBwYWNrZXQpCisjIDIgLSBQQVJBTExFTCAtIEZvciAzMmsgb3IgNjRrICh0d28gbWV0ZXIgcGVyIHBhY2tldCkKK3BvbGljZXJfaW5ncmVzc19zaGFyaW5nX21vZGUuQkNNODg2NTA9MQorcG9saWNlcl9pbmdyZXNzX3NoYXJpbmdfbW9kZS5CQ004ODQ3MD0xCitwb2xpY2VyX2luZ3Jlc3Nfc2hhcmluZ19tb2RlLkJDTTg4MjcwPTEKK3BvbGljZXJfaW5ncmVzc19zaGFyaW5nX21vZGUuQkNNODg2ODA9MQorCisKKyMgQXBwbGllcyBvbmx5IHRvIEFyYWQrICg4ODY2MCkKKyMgRm9yIG1ldGVycyBpbiBwYXJhbGxlbCBtb2RlLCBkZXRlcm1pbmUgdGhlIG1hcHBpbmcKKyMgT3B0aW9uczogQkVTVCwgV09SU1QKKyMgcG9saWNlcl9yZXN1bHRfcGFyYWxsZWxfY29sb3JfbWFwLkJDTTg4NjUwPVdPUlNUCisKKyMgQXBwbGllcyBvbmx5IHRvIEFyYWQrICg4ODY2MCkKKyMgRm9yIG1ldGVycyBpbiBwYXJhbGxlbCBtb2RlLCBkZXRlcm1pbmUgaG93IHRoZSBidWNrZXRzIGFyZSBjaGFuZ2VkCisjIE9wdGlvbnM6IENPTlNUQU5ULCBUUkFOU1BBUkVOVCwgREVGRVJSRUQKKyMgcG9saWNlcl9yZXN1bHRfcGFyYWxsZWxfYnVja2V0X3VwZGF0ZS5CQ004ODY1MD1DT05TVEFOVAorCisjIEFwcGxpZXMgb25seSB0byBBcmFkKyAoODg2NjApCisjIFNldCB0aGUgRXRoZXJuZXQgcG9saWNlciB0byB3b3JrIGluIGNvbG9yIGJsaW5kIG1vZGUKKyMgcmF0ZV9jb2xvcl9ibGluZC5CQ004ODY1MD0xCisKKyMgTDIgbGVhcm4gbGltaXQgbW9kZQorIyBPcHRpb25zOiBWTEFOLCBWTEFOX1BPUlQsIFRVTk5FTCBvciB0aGUgbnVtZXJpYyBlcXVpdmFsZW50IDAtMi4KKyMgRGVmYXVsdDogVkxBTgorIyBsMl9sZWFybl9saW1pdF9tb2RlID0gVkxBTl9QT1JUCisKKyMgQXBwbGllcyBvbmx5IHRvIEFyYWQrICg4ODY2MCkKKyMgRGV0ZXJtaW5lcyB0aGUgTDIgbGVhcm4gbGltaXQgcmFuZ2VzIHdoZW4gbDJfbGVhcm5fbGltaXRfbW9kZSBpcyBzZXQgdG8gVkxBTl9QT1JUCisjIFR3byByYW5nZSBiYXNlcyBjYW4gYmUgc2VsZWN0ZWQsIGVhY2ggb2YgMTZLIHNpemUuCisjIE9wdGlvbnM6IDAsIDE2SywgMzJLLCA0OEsuCisjIERlZmF1bHQ6IDAgJiAxNksKKyMgbDJfbGVhcm5fbGlmX3JhbmdlX2Jhc2VfMCA9IDAKKyMgbDJfbGVhcm5fbGlmX3JhbmdlX2Jhc2VfMSA9IDE2SworCisjIFNXIHNoYWRvdyBtb2RlIGZvciBleGFjdCBtYXRjaCB0YWJsZXMuIFJlcXVpcmVkIGZvciBTRVIgc3VwcG9ydCBhbmQgREJBTCBkaWFnbm9zdGljcy4KKyMgICAwIC0gRGlzYWJsZWQgKERlZmF1bHQpCisjICAgMSAtIEVuYWJsZWQKKyMgICAyIC0gRGlzYWJsZWQgZm9yIExFTSwgZW5hYmxlZCBmb3Igb3RoZXIgZXhhY3QgbWF0Y2ggdGFibGVzCitleGFjdF9tYXRjaF90YWJsZXNfc2hhZG93X2VuYWJsZS5CQ004ODY1MCA9IDEKK2V4YWN0X21hdGNoX3RhYmxlc19zaGFkb3dfZW5hYmxlLkJDTTg4Njc1ID0gMgorCisjIGRldGVybWluZSBob3cgbWFueSBjbWNzIGNvbm5lY3RlZCB0byB0aGUgQ1BVLiAKKyMgZGVmYXVsdCB2YWx1ZSA9IDEKKyMgYXBwbGllcyBvbmx5IHRvIGplcmljaG8gYW5kIGFib3ZlLiAKK3BjaV9jbWNzX251bS44ODY3NSA9IDMKK3BjaV9jbWNzX251bS44ODQ3MCA9IDMKKworIyMjIENvdW50ZXIgZW5naW5lIGNvbmZpZ3VyYXRpb24gIyMjCisKKyMgU2V0IHRoZSBDb3VudGVyIHNvdXJjZQorIyBPcHRpb25zOiBJTkdSRVNTX0ZJRUxEIC8gSU5HUkVTU19WT1EgLyBJTkdSRVNTX1ZTUSAvIElOR1JFU1NfQ05NIC8gCisjIElOR1JFU1NfTEFURU5DWSAvIEVHUkVTU19GSUVMRCAvIEVHUkVTU19WU0kgLyBFR1JFU1NfT1VUX0xJRiAvIEVHUkVTU19UTSAocGVyIHF1ZXVlKSAvIEVHUkVTU19UTV9QT1JUIChwZXIgcG9ydCkKKyMgRUdSRVNTX1JFQ0VJVkVfVlNJIC8gRUdSRVNTX1JFQ0VJVkVfT1VUX0xJRiAvIEVHUkVTU19SRUNFSVZFX1RNIChwZXIgcXVldWUpIC8gRUdSRVNTX1JFQ0VJVkVfVE1fUE9SVCAocGVyIHBvcnQpCisjIElOR1JFU1NfT0FNIC8gRUdSRVNTX09BTQorIyAyIENvdW50ZXItUG9pbnRlcnMgY2FuIGJlIHNldCAod2l0aCBfMCBhbmQgXzEpIGZvcgorIyBJTkdSRVNTX0ZJRUxEIC8gRUdSRVNTX0ZJRUxEIC8gRUdSRVNTX1ZTSSAvIEVHUkVTU19PVVRfTElGIC8gRUdSRVNTX1RNIC8gRUdSRVNTX1RNX1BPUlQKKyMgUmFuZ2UgZXh0ZW5zaW9uIGNhbiBiZSBzZXQgKHdpdGggX0xTQiBhbmQgX01TQikgZm9yCisjIElOR1JFU1NfRklFTEQgLyBFR1JFU1NfVlNJIC8gRUdSRVNTX09VVF9MSUYgLyBFR1JFU1NfVE0gLyBFR1JFU1NfVE1fUE9SVCAvRUdSRVNTX1JFQ0VJVkVfVlNJIC8KKyMgRUdSRVNTX1JFQ0VJVkVfT1VUX0xJRiAvIEVHUkVTU19SRUNFSVZFX1RNIC8gRUdSRVNTX1JFQ0VJVkVfVE1fUE9SVAorY291bnRlcl9lbmdpbmVfc291cmNlXzAuQkNNODg2NTA9SU5HUkVTU19GSUVMRF8wCitjb3VudGVyX2VuZ2luZV9zb3VyY2VfMS5CQ004ODY1MD1JTkdSRVNTX0ZJRUxEXzEKK2NvdW50ZXJfZW5naW5lX3NvdXJjZV8yLkJDTTg4NjUwPUlOR1JFU1NfVk9RCitjb3VudGVyX2VuZ2luZV9zb3VyY2VfMy5CQ004ODY1MD1FR1JFU1NfRklFTEQKKworIyBDb25maWd1cmUgdGhlIHN0YXRpc3RpYyBpbnRlcmZhY2UgZWdyZXNzIHRyYW5zbWl0IFBQIHNvdXJjZSBhbmQgdGhlIGluZ3Jlc3MgcmVjZWl2ZWQgUFAgc291cmNlCisjIE9wdGlvbnMgZm9yIGVncmVzczogRUdSRVNTX1ZTSSAvIEVHUkVTU19PVVRfTElGIC8gRUdSRVNTX1RNIC8gRUdSRVNTX1RNX1BPUlQgKHRoZSBkZWZhdWx0IGlzIFRNKQorIyBPcHRpb25zIGZvciBpbmdyZXNzOiBJTkdSRVNTX1ZTSSAvIElOR1JFU1NfSU5fTElGIC8gSU5HUkVTU19UTSAodGhlIGRlZmF1bHQgaXMgVE0pCisjIHZhbGlkIGp1c3Qgd2hlbiB0aGVyZSBpcyBubyBjb25mbGljdCB3aXRoIHRoZSBvdGhlciBjb3VudGVyIGVuZ2luZXMKKyNjb3VudGVyX2VuZ2luZV9zb3VyY2VfZWdyZXNzX3BwX3N0YXQwLkJDTTg4NjUwPUVHUkVTU19UTQorI2NvdW50ZXJfZW5naW5lX3NvdXJjZV9lZ3Jlc3NfcHBfc3RhdDEuQkNNODg2NTA9RUdSRVNTX1ZTSQorI2NvdW50ZXJfZW5naW5lX3NvdXJjZV9pbmdyZXNzX3BwX3N0YXQwLkJDTTg4NjUwPUlOR1JFU1NfSU5fTElGCisjY291bnRlcl9lbmdpbmVfc291cmNlX2luZ3Jlc3NfcHBfc3RhdDEuQkNNODg2NTA9SU5HUkVTU19UTQorCisKKyMgU2V0IHRoZSBDb3VudGVyIGVuZ2luZSByZXNvbHV0aW9uCisjIFNJTVBMRV9DT0xPUiA9IGdyZWVuLCBub3QgZ3JlZW4KKyMgU0lNUExFX0NPTE9SX0ZXRCA9IGZ3ZCBncmVlbiwgZndkIG5vdCBncmVlbiAoQkNNODg2NjBfQTAgb25seSkKKyMgU0lNUExFX0NPTE9SX0RST1AgPSBkcm9wIGdyZWVuLCBkcm9wIG5vdCBncmVlbiAoQkNNODg2NjBfQTAgb25seSkKKyMgRldEX0RST1AgPSBmb3J3YXJkZWQsIGRyb3BwZWQKKyMgR1JFRU5fTk9UX0dSRUVOID0gZndkIGdybiwgZHJvcCBncm4sIGZ3ZCBub3QgZ3JuLCBkcm9wIG5vdCBncm4KKyMgRlVMTF9DT0xPUiA9IGZ3ZCBncm4sIGRyb3AgZ3JuLCBmd2Qgbm90IGdybiwgZHJvcCB5ZWwsIGRyb3AgcmVkCisjIEFMTCA9IHJlY2VpdmVkCisjIEZXRCA9IGZvcndhcmRlZCwgRFJPUCA9IGRyb3BlZCAobm90IHN1cHBvcnRlZCBieSBBUkFEX0EwKQorIyBDT05GSUdVUkFCTEUgPSBkZWZpbmVkIGJ5IGNvdW50ZXJfZW5naW5lX21hcF8gU09DIHByb3BlcnRpZXMgKEJDTTg4NjYwX0EwIG9ubHkpCitjb3VudGVyX2VuZ2luZV9zdGF0aXN0aWNzXzAuQkNNODg2NTA9RlVMTF9DT0xPUgorY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18xLkJDTTg4NjUwPUZVTExfQ09MT1IKK2NvdW50ZXJfZW5naW5lX3N0YXRpc3RpY3NfMi5CQ004ODY1MD1GVUxMX0NPTE9SCitjb3VudGVyX2VuZ2luZV9zdGF0aXN0aWNzXzMuQkNNODg2NTA9RlVMTF9DT0xPUgorCisjIFNldCB0aGUgQ291bnRlciBmb3JtYXQKKyMgT3B0aW9uczogUEFDS0VUU19BTkRfQllURVMgLyBQQUNLRVRTIC8gQllURVMKKyMgLyBNQVhfUVVFVUVfU0laRSAvIExBVEVOQ1kgLyBQQUNLRVRTX0FORF9QQUNLRVRTKHN1cHBvcnRlZCBqdXN0IGluIEZXRF9EUk9QIHN0YXRpc3RpYyBpbiBCQ004ODY2MF9BMCkKKyMgSWYgbm90IFBBQ0tFVFNfQU5EX0JZVEVTIG9yIFBBQ0tFVFNfQU5EX1BBQ0tFVFMsIHRoZSBIVyBDb3VudGVyIHdpZHRoIGlzIDU5IGJpdHMsIHRodXMKKyMgbm8gYmFja2dyb3VuZCBTVyBvcGVyYXRpb24gaXMgcGVyZm9ybWVkCitjb3VudGVyX2VuZ2luZV9mb3JtYXRfMC5CQ004ODY1MD1QQUNLRVRTX0FORF9CWVRFUworY291bnRlcl9lbmdpbmVfZm9ybWF0XzEuQkNNODg2NTA9UEFDS0VUU19BTkRfQllURVMKK2NvdW50ZXJfZW5naW5lX2Zvcm1hdF8yLkJDTTg4NjUwPVBBQ0tFVFNfQU5EX0JZVEVTCitjb3VudGVyX2VuZ2luZV9mb3JtYXRfMy5CQ004ODY1MD1QQUNLRVRTX0FORF9CWVRFUworCisjICNlbmFibGUvZGlzYWJsZSBjb3VudGVyIHByb2Nlc3NvciBiYWNrZ3JvdW5kIHRocmVhZCAoZGVmYXVsdDoxLWVuYWJsZSkKKyMgY291bnRlcl9lbmdpbmVfc2FtcGxpbmdfaW50ZXJ2YWw9MQorCisKKyMjIyBDb25maWd1cmFibGUgbW9kZSBjb25maWd1cmF0aW9uIChCQ004ODY2MF9BMCBvbmx5KSMjIworIyBjb3VudGVyX2VuZ2luZV9zdGF0aXN0aWNzXzAuQkNNODg2NjBfQTA9Q09ORklHVVJBQkxFCisjIGNvdW50ZXJfZW5naW5lX21hcF9lbmFibGVfMC5CQ004ODY2MF9BMD0xCisjIGNvdW50ZXJfZW5naW5lX21hcF9zaXplXzAuQkNNODg2NjBfQTA9NAorIyBjb3VudGVyX2VuZ2luZV9tYXBfZndkX2dyZWVuX29mZnNldF8wLkJDTTg4NjYwX0EwPTAKKyMgY291bnRlcl9lbmdpbmVfbWFwX2Z3ZF95ZWxsb3dfb2Zmc2V0XzAuQkNNODg2NjBfQTA9MQorIyBjb3VudGVyX2VuZ2luZV9tYXBfZndkX3JlZF9vZmZzZXRfMC5CQ004ODY2MF9BMD0xCisjIGNvdW50ZXJfZW5naW5lX21hcF9md2RfYmxhY2tfb2Zmc2V0XzAuQkNNODg2NjBfQTA9MgorIyBjb3VudGVyX2VuZ2luZV9tYXBfZHJvcF9ncmVlbl9vZmZzZXRfMC5CQ004ODY2MF9BMD0zCisjIGNvdW50ZXJfZW5naW5lX21hcF9kcm9wX3llbGxvd19vZmZzZXRfMC5CQ004ODY2MF9BMD0zCisjIGNvdW50ZXJfZW5naW5lX21hcF9kcm9wX3JlZF9vZmZzZXRfMC5CQ004ODY2MF9BMD0zCisjIGNvdW50ZXJfZW5naW5lX21hcF9kcm9wX2JsYWNrX29mZnNldF8wLkJDTTg4NjYwX0EwPTMKKworIyMjIFN0YXRpc3RpYy1SZXBvcnQgY29uZmlndXJhdGlvbiAjIyMKKyMgRW5hYmxlIHRoZSBTdGF0aXN0aWMtSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24KKyMgc3RhdF9pZl9lbmFibGVfPHBvcnQ+IC0gbm90IHN1cHBvcnRlZCBieSBBUkFEX0EwCisjIHN0YXRfaWZfZW5hYmxlLkJDTTg4NjUwPTEKKworIyAjIyBTdGF0aXN0aWMtUmVwb3J0IFByb3BlcnRpZXMKKyMgIyBTZXQgU3RhdGlzdGljLVJlcG9ydCBpbnRlcmZhY2UgcmF0ZSBpbiBNYnBzCisjICMgSWYgVmFsdWUgaXMgJzAnIHRoZSBzdGF0aXN0aWNzIHBvcnQgcmF0ZSB3aWxsIGJlIHVzZWQuIERlZmF1bHQ6IDAuCisjIHN0YXRfaWZfcmF0ZS5CQ004ODY1MD0wCisjICMgU2V0IHRoZSBTdGF0aXN0aWMtUmVwb3J0IG1vZGUKKyMgIyBPcHRpb25zOiBCSUxMSU5HIC8gQklMTElOR19RVUVVRV9OVU1CRVIgKG5vdCBzdXBwb3J0ZWQgYnkgQVJBRF9BMCkvIFFTSVpFCisjIHN0YXRfaWZfcmVwb3J0X21vZGUuQkNNODg2NTA9UVNJWkUKKyMgI0luZGljYXRlIGlmIGlkbGUgcmVwb3J0cyBtdXN0IGJlIHNlbnQKKyMgI3doZW4gdGhlIFN0YXRpc3RpYy1yZXBvcnQgcmF0ZSBpcyB0b28gbG93CisjIHN0YXRfaWZfaWRsZV9yZXBvcnRzX3ByZXNlbnQuQkNNODg2NTA9MAorIyAjIEluZGljYXRlIGlmIHRoZSByZXBvcnRlZCBwYWNrZXQgc2l6ZSBpcyB0aGUgb3JpZ2luYWwgcGFja2V0IHNpemUKKyMgc3RhdF9pZl9yZXBvcnRfb3JpZ2luYWxfcGt0X3NpemUuQkNNODg2NTA9MQorIyAjSWYgc2V0IHRoZW4gYSBzaW5nbGUgaW5ncmVzcy1iaWxsaW5nIHJlcG9ydCB3aWxsIGJlIGdlbmVyYXRlZAorIyAjZm9yIHRoZSB3aG9sZSBzZXQgb2YgdGhlIG11bHRpY2FzdCBjb3BpZXMKKyMgc3RhdF9pZl9yZXBvcnRfbXVsdGljYXN0X3NpbmdsZV9jb3B5PTEKKyMgIyMgU3RhdGlzdGljIFBhY2tldCBjb25maWd1cmF0aW9ucworIyAjIFNldCB0aGUgU3RhdGlzdGljIFBhY2tldCBzaXplIChCeXRlcykKKyMgIyBWYWxpZCB2YWx1ZXM6IDY1Qi8xMjZCLzI0OEIvNDkyQiAoUXVldWUtU2l6ZSksIDY0Qi8xMjhCLzI1NkIvNTEyQi8xMDI0QiAoQmlsbGluZykuCisjIHN0YXRfaWZfcGt0X3NpemU9NjRCCisjCisjICMjIFNjcnViYmVyIGNvbmZpZ3VyYXRpb24KKyMgIyBTZXQgdGhlIHJhbmdlIG9mIFZPUXMgdG8gc2NydWIuIFJhbmdlOiAwIC0gOTZLLTEuCisjIHN0YXRfaWZfc2NydWJiZXJfcXVldWVfbWluLkJDTTg4NjUwPTAKKyMgc3RhdF9pZl9zY3J1YmJlcl9xdWV1ZV9tYXguQkNNODg2NTA9MAorIworIyAjIFNldCB0aGUgc2NydWJiZXIgcmF0ZSByYW5nZQorIyAjIElmIHNldCB0byAwIChkZWZhdWx0KSwgdGhlIHNjcnViYmVyIGlzIGRpc2FibGVkLiBVbml0czogbmFub3NlY29uZHMKKyMgc3RhdF9pZl9zY3J1YmJlcl9yYXRlX21pbi5CQ004ODY1MD0wCisjIHN0YXRfaWZfc2NydWJiZXJfcmF0ZV9tYXguQkNNODg2NTA9MAorIworIyAjIFNldCB0aGUgdGhyZXNob2xkcyAodGhyZXNoX2lkIDAgLSAxNSkgZGVmaW5pbmcKKyMgIyBvY2N1cGFuY3kgcmFuZ2UgcGVyIHJlc291cmNlIHR5cGU6CisjICMgRFJBTSBCdWZmZXJzLCBCdWZmZXIgZGVzY3JpcHRvcnMsIEJ1ZmZlciBkZXNjcmlwdG9ycyBidWZmZXJzCisjIHN0YXRfaWZfc2NydWJiZXJfYmRiX3RoLkJDTTg4NjUwPTAKKyMgc3RhdF9pZl9zY3J1YmJlcl9idWZmZXJfZGVzY3JfdGguQkNNODg2NTA9MAorIyBzdGF0X2lmX3VjX2RyYW1fYnVmZmVyX2Rlc2NyX3RoLkJDTTg4NjUwPTAKKyMKKyMgI1JlbGVjdGl2ZSByZXBvcnQgZm9yIHF1ZXVlIHNpemUgbW9kZSAtIG5vdCBzdXBwb3J0ZWQgYnkgQVJBRF9BMAorIyAjUmVwb3J0cyB3aWxsIGJlIGNyZWF0ZWQgZm9yIHF1ZXVlIG51bSByYW5nZSAoc3RhdF9pZl9zZWxlY3RpdmVfcmVwb3J0X3F1ZXVlX21pbiAtc3RhdF9pZl9zZWxlY3RpdmVfcmVwb3J0X3F1ZXVlX21heCkKKyMgI0RlZmF1bHQgLSBhbGwgcmFuZ2UKKyMgc3RhdF9pZl9zZWxlY3RpdmVfcmVwb3J0X3F1ZXVlX21pbi5CQ004ODY1MF9CMD0wCisjIHN0YXRfaWZfc2VsZWN0aXZlX3JlcG9ydF9xdWV1ZV9tYXguQkNNODg2NTBfQjA9OTgzMDMKKworIyMjIFRyYW5zYWN0aW9uIC0gRE1BIGNvbmZpZ3VyYXRpb24gIyMjCisjIFRpbWUgdG8gd2FpdCBmb3IgU0NIQU4gY2hhbm5lbCByZXNwb25zZSAoZnJvbSBDTUlDKS4gVW5pdHM6IG1pY3Jvc2Vjb25kcy4KKworCisjIyMgQ291bnRlciB0aHJlYWRzICMjIworIyAjIHNldCBwb3J0IGJpdG1hcCBvbiB3aGljaCBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gd2lsbCBiZSBlbmFibGVkIChkZWZhdWx0IGFsbCBwb3J0cykKKyMgYmNtX3N0YXRfcGJtcC5CQ004ODY3NT0weGZmZmZmZmZmZjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM2UwMDIKKyMKKyMgIyBzZXQgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGludGVydmFsIGluIG1pY3Jvc2Vjb25kcyAoZGVmYXVsdCBpcyAxMDAwMDAwKQorIyBiY21fc3RhdF9pbnRlcnZhbC5CQ004ODY3NT0xMDAwMDAwCisKKyMjIyBDb250cm9sIG9wdGltaXphdGlvbiBvZiBjb3NxIHBvcnQgaW5pdGlhbGl6YXRpb25zOiBzcGVlZCBmb3IgbWVtb3J5ICMjIworcnVudGltZV9wZXJmb3JtYW5jZV9vcHRpbWl6ZV9lbmFibGVfc2NoZWRfYWxsb2NhdGlvbi5CQ004ODY1MD0xCitydW50aW1lX3BlcmZvcm1hbmNlX29wdGltaXplX2VuYWJsZV9zY2hlZF9hbGxvY2F0aW9uLkJDTTg4Njc1PTEKKworIyMjIHN0YXRpYyB0YWJsZXMgaW5pdGlhdGlvbiAoU3VwcG9ydGVkIGZvciBKZXJpY2hvKSAjIyMKKyMgT3B0aW9uczogMSAtIGluaXRpYXRpbmcgc3RhdGljIHRhYmxlcywgMCAtIGRvZXNuJ3QgaW5pdGlhdGUgdGFibGVzIChEZWZhdWx0IFZhbHVlIGZvciBQQ0lEL2VtdWxhdGlvbikKKyNjdXN0b21fZmVhdHVyZV9zdGF0aWNfdGJsX2Z1bGxfaW5pdC5CQ004ODY3NT0xCisjY3VzdG9tX2ZlYXR1cmVfZHluYW1pY190YmxfZnVsbF9pbml0LkJDTTg4Njc1PTEKKworIyMjIEludGVycnVwdHMgIyMjCisjIyBTZXQgaW50ZXJydXB0cyBnbG9iYWwgcGFyYW1ldGVycy4KKyMgT3B0aW9uczogMSAtIFBvbGxpbmcgaW50ZXJydXB0IG1vZGUsIDAgLSBMaW5lL01TSSBpbnRlcnJ1cHQgbW9kZS4gRGVmYXVsdDogMS4KK3BvbGxlZF9pcnFfbW9kZS5CQ004ODY1MD0wCitwb2xsZWRfaXJxX21vZGUuQkNNODg2NzU9MAorIyAgU2V0IHRoZSBkZWxheSBpbiBtaWNyb3NlY29uZCBiZXR3ZWVuIHRoZSBwb2xsaW5nLCByZWxldmFudCBvbmx5IHRvIFBvbGxpbmcgbW9kZS4gIERlZmF1bHQ6IDB4MC4KK3BvbGxlZF9pcnFfZGVsYXkuQkNNODg2NTA9NTAwMDAKKworIyMgQ01JQyBpbnRlcnJ1cHRzOgorIyBFbmFibGU6IFVzZSBpbnRlcnJ1cHRzIGNvbXBsZXRpb24gaW5zdGVhZCBvZiBwb2xsaW5nIGNvbXBsZXRpb24gZm9yIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucy4KKyMgICAgICAgICBPcHRpb25zOiAxIC0gRW5hYmxlLCAwIC0gRGlzYWJsZS4gRGVmYXVsdDogMC4KKyMgVGltZW91dDogZGVsYXkgaW4gTWljcm9zZWNvbmQgYmV0d2VlbiB0aGUgcG9sbGluZywgcmVsZXZhbnQgb25seSB0byBQb2xsaW5nIGNvbXBsZXRpb24gbW9kZS4KKyMgU0NIQU46Cisjc2NoYW5faW50cl9lbmFibGUuMD0xCitzY2hhbl90aW1lb3V0X3VzZWMuQkNNODg2NTA9MzAwMDAwCisjIFRETUEKK3RkbWFfaW50cl9lbmFibGUuQkNNODg2NTA9MQordGRtYV9pbnRyX2VuYWJsZS5CQ004ODY3NT0wCit0ZG1hX3RpbWVvdXRfdXNlYy5CQ004ODY1MD01MDAwMDAwCit0ZG1hX3RpbWVvdXRfdXNlYy5CQ004ODY3NT01NjAwMDAwMDAKKyMgVFNMQU0KK3RzbGFtX2ludHJfZW5hYmxlLkJDTTg4NjUwPTEKK3RzbGFtX2ludHJfZW5hYmxlLkJDTTg4Njc1PTAKK3RzbGFtX3RpbWVvdXRfdXNlYy5CQ004ODY1MD01MDAwMDAwCit0c2xhbV90aW1lb3V0X3VzZWMuQkNNODg2NzU9NTYwMDAwMDAwCisjIE1JSU0KKyNtaWltX2ludHJfZW5hYmxlLjA9MQorbWlpbV90aW1lb3V0X3VzZWMuMD0zMDAwMDAKKworIyMjIERSQU0gY29uZmlndXJhdGlvbiAjIyMKKworIyBEUkFNIGJ1ZmZlciAoRGJ1ZmYpIHNpemUKKyMgQWxsb3dlZCB2YWx1ZXM6IDI1Ni81MTIvMTAyNC8yMDQ4LgorZXh0X3JhbV9kYnVmZl9zaXplLkJDTTg4NjUwPTEwMjQKK2V4dF9yYW1fZGJ1ZmZfc2l6ZS5CQ004ODQ3MD00MDk2CitleHRfcmFtX2RidWZmX3NpemUuQkNNODgyNzA9NDA5NgorCisjIE51bWJlciBvZiBleHRlcm5hbCBEUkFNcy4KKyMgQWxsb3dlZCB2YWx1ZXMgZm9yIDg4NjUwOiAwLzIvMy80LzYvOC4KKyMgQWxsb3dlZCB2YWx1ZXMgZm9yIDg4NjYwOiAwLzEvMi8zLzQvNi84LiBBIHZhbHVlIG9mIDEgaXMgcGVybWl0dGVkIG9ubHkgaW4gT05FIFdBWSBCWVBBU1Mgb2NiIG1vZGUuCisjIEFsbG93ZWQgdmFsdWVzIGZvciA4ODY3NTogMC8yLzMvNDEvNDIvNi84LiAnNDEnIC0gY29uZmlndXJlIDQgZHJhbXMgaW4gU2luZ2xlIFNpZGUgbW9kZSAoQSwgQiwgQywgRCkuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNDInIC0gY29uZmlndXJlIDQgZHJhbXMgaW4gc3ltbWV0cmljIG1vZGUgKEEsIEMsIEYsIEgpLgorIyBWYWx1ZSBvZiAwIGRpc2FibGVzIHRoZSBEUkFNLgorZXh0X3JhbV9wcmVzZW50LkJDTTg4NjUwPTgKKyMjIHRoaXMgc29jIGlzIGNvbmZpZ3VyZWQgaW4gcGVyIGJvYXJkIHNvYyBmaWxlIChiY204OHg3eF9ib2FyZC5zb2MpCitleHRfcmFtX3ByZXNlbnQuQkNNODg0NzA9MworZXh0X3JhbV9wcmVzZW50LkJDTTg4MjcwPTEKKworIyMjIERyYW0gVHVuaW5nIChTaG1vbykKKyMgMyA9IFNraXAgRHJhbSBUdW5pbmcgKFNobW9vKS4KKyMgMiA9IFVzZSBEcmFtIHNhdmVkIGNvbmZpZyBQYXJhbWV0ZXJzLCBpZiBubyBQYXJhbWV0ZXJzIFBlcmZvcm0gU2htb28gb24gaW5pdC4gRGVmYXVsdCBvcHRpb24uCisjIDEgPSBQZXJmb3JtIFNobW9vIG9uIGluaXQuCisjIDAgPSBVc2UgRHJhbSBzYXZlZCBjb25maWcgUGFyYW1ldGVycywgaWYgbm8gUGFyYW1ldGVycyBkbyBub3RoaW5nLgorZGRyM19hdXRvX3R1bmUuQkNNODg2NTA9MgorZGRyM19hdXRvX3R1bmUuQkNNODgyNzA9MgorZGRyM19hdXRvX3R1bmUuQkNNODg0NzA9MgorCisjIyMjIyBERFIgVHVuaW5nIHBhcmFtZXRlcnMgZm9yIElMIFNWSzQKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2J5dGUzX2NpMS4wPTB4MDAwMDAwMDQsMHgwMDAwMDAwMywweDAwMDAwMDA3LDB4MDAwMDAwMDMsMHgwMDAwMDAwMiwweDAwMDAwMDAwLDB4MDAwMDAwMDYsMHgwMDAwMDAwNCwKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2J5dGUxX2NpMi4wPTB4MDAwMDAwMTcsMHgwMDAwMDAxNCwweDAwMDAwMDE2LDB4MDAwMDAwMTQsMHgwMDAwMDAxNywweDAwMDAwMDE4LDB4MDAwMDAwMTcsMHgwMDAwMDAxNywKK2NvbWJvMjhfdHVuZV9jb21tb25fbWFjcm9fcmVzZXJ2ZWRfcmVnX2NpMC4wPTB4MDAwMDAwMDAsCitjb21ibzI4X3R1bmVfY29udHJvbF9yZWdzX3Jlc2VydmVkX3JlZ19jaTEuMD0weDAwMDAwMDAzLAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19yZWFkX2Nsb2NrX2NvbmZpZ19jaTAuMD0weDAwMDAwMDAyLAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfYnl0ZTJfY2kwLjA9MHgwMDAwMDAxOCwweDAwMDAwMDE3LDB4MDAwMDAwMTcsMHgwMDAwMDAxOCwweDAwMDAwMDE3LDB4MDAwMDAwMTQsMHgwMDAwMDAxNSwweDAwMDAwMDE3LAorY29tYm8yOF90dW5lX2RxX3JlYWRfbWF4X3ZkbF9mc21fY2kxLjA9MHgwMDAwMDA0YywweDAwMDAwMDRjLDB4MDAwMDAwNGMsMHgwMDAwMDA0YywKK2NvbWJvMjhfdHVuZV9hcV91X21heF92ZGxfY3RybF9jaTEuMD0weDAwMDAwMjE0LAorY29tYm8yOF90dW5lX2RxX3JkX21heF92ZGxfZHFzbl9jaTEuMD0weDAwMDAwMDE3LDB4MDAwMDAwMTksMHgwMDAwMDAyZCwweDAwMDAwMDJkLAorY29tYm8yOF90dW5lX2RxX3Jlbl9maWZvX2NvbmZpZ19jaTAuMD0weDAwMDAwMDkwLDB4MDAwMDAwOTAsMHgwMDAwMDA5MCwweDAwMDAwMDkwLAorY29tYm8yOF90dW5lX2RxX3dyX21pbl92ZGxfZGJpX2NpMS4wPTB4MDAwMDAwMDEsMHgwMDAwMDAwNCwweDAwMDAwMDAyLDB4MDAwMDAwMDMsCitjb21ibzI4X3R1bmVfYXFfdV9tYWNyb19yZXNlcnZlZF9yZWdfY2kwLjA9MHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2VkY19jaTEuMD0weDAwMDAwMDE2LDB4MDAwMDAwMTYsMHgwMDAwMDAxNywweDAwMDAwMDFhLAorY29tYm8yOF90dW5lX2FxX2xfbWF4X3ZkbF9hZGRyX2NpMS4wPTB4MDAwMDAyMTQsCitjb21ibzI4X3R1bmVfZHFfd3JfbWF4X3ZkbF9kYXRhX2NpMi4wPTB4MDAwMDAyMzgsMHgwMDAwMDQwNiwweDAwMDAwMjQ3LDB4MDAwMDA0MTYsCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9ieXRlM19jaTIuMD0weDAwMDAwMDAwLDB4MDAwMDAwMDMsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMywweDAwMDAwMDAxLDB4MDAwMDAwMDEsCitjb21ibzI4X3R1bmVfY29tbW9uX21hY3JvX3Jlc2VydmVkX3JlZ19jaTEuMD0weDAwMDAwMDAwLAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19yZXNlcnZlZF9yZWdfY2kyLjA9MHgwMDAwMDAwMywKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3NfcmVhZF9jbG9ja19jb25maWdfY2kxLjA9MHgwMDAwMDAwMiwKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2J5dGUyX2NpMS4wPTB4MDAwMDAwMTUsMHgwMDAwMDAxNSwweDAwMDAwMDE5LDB4MDAwMDAwMTcsMHgwMDAwMDAxNCwweDAwMDAwMDE2LDB4MDAwMDAwMTgsMHgwMDAwMDAxNiwKK2NvbWJvMjhfdHVuZV9kcV9yZWFkX21heF92ZGxfZnNtX2NpMi4wPTB4MDAwMDAwNGQsMHgwMDAwMDA0ZCwweDAwMDAwMDRkLDB4MDAwMDAwNGQsCitjb21ibzI4X3R1bmVfYXFfdV9tYXhfdmRsX2N0cmxfY2kyLjA9MHgwMDAwMDA0OCwKK2NvbWJvMjhfdHVuZV9kcV9yZF9tYXhfdmRsX2Rxc25fY2kyLjA9MHgwMDAwMDAyMywweDAwMDAwMDIyLDB4MDAwMDAwMmMsMHgwMDAwMDAyMCwKK2NvbWJvMjhfdHVuZV9kcV9yZW5fZmlmb19jb25maWdfY2kxLjA9MHgwMDAwMDA5MCwweDAwMDAwMDkwLDB4MDAwMDAwOTAsMHgwMDAwMDA5MCwKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2RiaV9jaTIuMD0weDAwMDAwMDAyLDB4MDAwMDAwMDEsMHgwMDAwMDAwMywweDAwMDAwMDAxLAorY29tYm8yOF90dW5lX2FxX3VfbWFjcm9fcmVzZXJ2ZWRfcmVnX2NpMS4wPTB4MDAwMDAwMDAsCitjb21ibzI4X3R1bmVfZHFfcmRfbWluX3ZkbF9lZGNfY2kyLjA9MHgwMDAwMDAxNiwweDAwMDAwMDE3LDB4MDAwMDAwMTYsMHgwMDAwMDAxNywKK2NvbWJvMjhfdHVuZV9hcV9sX21heF92ZGxfYWRkcl9jaTIuMD0weDAwMDAwMDQ4LAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19yZW5fZmlmb19jZW50cmFsX2luaXRpYWxpemVyX2NpMC4wPTB4MDAwMDAwMGYsCitjb21ibzI4X3R1bmVfY29tbW9uX21hY3JvX3Jlc2VydmVkX3JlZ19jaTIuMD0weDAwMDAwMDAwLAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19yZWFkX2Nsb2NrX2NvbmZpZ19jaTIuMD0weDAwMDAwMDAyLAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfYnl0ZTJfY2kyLjA9MHgwMDAwMDAxOCwweDAwMDAwMDE2LDB4MDAwMDAwMTUsMHgwMDAwMDAxNCwweDAwMDAwMDE1LDB4MDAwMDAwMTUsMHgwMDAwMDAxNCwweDAwMDAwMDE1LAorY29tYm8yOF90dW5lX2RxX3dyX21pbl92ZGxfYnl0ZTBfY2kwLjA9MHgwMDAwMDAwMSwweDAwMDAwMDAyLDB4MDAwMDAwMDAsMHgwMDAwMDAwMiwweDAwMDAwMDAyLDB4MDAwMDAwMDMsMHgwMDAwMDAwNCwweDAwMDAwMDAxLAorY29tYm8yOF90dW5lX2RxX3Jlbl9maWZvX2NvbmZpZ19jaTIuMD0weDAwMDAwMDkwLDB4MDAwMDAwOTAsMHgwMDAwMDA5MCwweDAwMDAwMDkwLAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfYnl0ZTNfY2kwLjA9MHgwMDAwMDAxOSwweDAwMDAwMDE3LDB4MDAwMDAwMWEsMHgwMDAwMDAxYywweDAwMDAwMDE3LDB4MDAwMDAwMTgsMHgwMDAwMDAxNCwweDAwMDAwMDE0LAorY29tYm8yOF90dW5lX2FxX3VfbWFjcm9fcmVzZXJ2ZWRfcmVnX2NpMi4wPTB4MDAwMDAwMDAsCitjb21ibzI4X3R1bmVfY29udHJvbF9yZWdzX3Jlbl9maWZvX2NlbnRyYWxfaW5pdGlhbGl6ZXJfY2kxLjA9MHgwMDAwMDAwZiwKK2NvbWJvMjhfdHVuZV9hcV9sX21heF92ZGxfY3RybF9jaTAuMD0weDAwMDAwMjAxLAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19pbnB1dF9zaGlmdF9jdHJsX2NpMC4wPTB4MDAwMDAwNzAsCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9ieXRlMF9jaTEuMD0weDAwMDAwMDA1LDB4MDAwMDAwMDEsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDMsCitjb21ibzI4X3R1bmVfZHFfcmRfbWluX3ZkbF9ieXRlM19jaTEuMD0weDAwMDAwMDE4LDB4MDAwMDAwMTcsMHgwMDAwMDAxYywweDAwMDAwMDFkLDB4MDAwMDAwMTQsMHgwMDAwMDAxNywweDAwMDAwMDFlLDB4MDAwMDAwMWQsCitjb21ibzI4X3R1bmVfY29udHJvbF9yZWdzX3Jlbl9maWZvX2NlbnRyYWxfaW5pdGlhbGl6ZXJfY2kyLjA9MHgwMDAwMDAwZiwKK2NvbWJvMjhfdHVuZV9kcV9yZF9tYXhfdmRsX2Rxc3BfY2kwLjA9MHgwMDAwMDAxOCwweDAwMDAwMDE5LDB4MDAwMDAwMjUsMHgwMDAwMDAyYiwKK2NvbWJvMjhfdHVuZV9hcV9sX21heF92ZGxfY3RybF9jaTEuMD0weDAwMDAwMjE0LAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19pbnB1dF9zaGlmdF9jdHJsX2NpMS4wPTB4MDAwMDAwNzAsCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9ieXRlMF9jaTIuMD0weDAwMDAwMDAwLDB4MDAwMDAwMDUsMHgwMDAwMDAwMywweDAwMDAwMDAzLDB4MDAwMDAwMDMsMHgwMDAwMDAwMywweDAwMDAwMDAzLDB4MDAwMDAwMDIsCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9lZGNfY2kwLjA9MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2J5dGUzX2NpMi4wPTB4MDAwMDAwMTUsMHgwMDAwMDAxNywweDAwMDAwMDE0LDB4MDAwMDAwMTUsMHgwMDAwMDAxNiwweDAwMDAwMDE4LDB4MDAwMDAwMTgsMHgwMDAwMDAxOSwKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2J5dGUxX2NpMC4wPTB4MDAwMDAwMDIsMHgwMDAwMDAwMiwweDAwMDAwMDAyLDB4MDAwMDAwMDMsMHgwMDAwMDAwMiwweDAwMDAwMDAxLDB4MDAwMDAwMDIsMHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3NfZWRjZW5fZmlmb19jZW50cmFsX2luaXRfY2kwLjA9MHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9kcV9tYWNyb19yZXNlcnZlZF9yZWdfY2kwLjA9MHgwMDAwMDAyNiwweDAwMDAwMDI2LDB4MDAwMDAwMjUsMHgwMDAwMDAyNiwKK2NvbWJvMjhfdHVuZV9kcV9yZF9tYXhfdmRsX2Rxc3BfY2kxLjA9MHgwMDAwMDAxNywweDAwMDAwMDE5LDB4MDAwMDAwMmQsMHgwMDAwMDAyZCwKK2NvbWJvMjhfdHVuZV9hcV9sX21heF92ZGxfY3RybF9jaTIuMD0weDAwMDAwMDQ4LAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19pbnB1dF9zaGlmdF9jdHJsX2NpMi4wPTB4MDAwMDAwNzAsCitjb21ibzI4X3R1bmVfZHFfcmRfbWluX3ZkbF9kYmlfY2kwLjA9MHgwMDAwMDAxNiwweDAwMDAwMDE3LDB4MDAwMDAwMTcsMHgwMDAwMDAxOCwKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2VkY19jaTEuMD0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorY29tYm8yOF90dW5lX2RxX3dyX21pbl92ZGxfYnl0ZTFfY2kxLjA9MHgwMDAwMDAwNiwweDAwMDAwMDA3LDB4MDAwMDAwMDUsMHgwMDAwMDAwNSwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHgwMDAwMDAwNywweDAwMDAwMDA1LAorY29tYm8yOF90dW5lX2RxX2VkY2VuX2ZpZm9fY29uZmlnX2NpMC4wPTB4MDAwMDAwODAsMHgwMDAwMDA4MCwweDAwMDAwMDgwLDB4MDAwMDAwODAsCitjb21ibzI4X3R1bmVfY29udHJvbF9yZWdzX2VkY2VuX2ZpZm9fY2VudHJhbF9pbml0X2NpMS4wPTB4MDAwMDAwMDAsCitjb21ibzI4X3R1bmVfZHFfdnJlZl9kYWNfY29uZmlnX2NpMC4wPTB4MDA3NjAwMDAsMHgwMDc0MDAwMCwweDAwODAwMDAwLDB4MDA3YzAwMDAsCitjb21ibzI4X3R1bmVfZHFfbWFjcm9fcmVzZXJ2ZWRfcmVnX2NpMS4wPTB4MDAwMDAwMjYsMHgwMDAwMDAyYSwweDAwMDAwMDI4LDB4MDAwMDAwMjksCitjb21ibzI4X3R1bmVfZHFfcmRfbWF4X3ZkbF9kcXNwX2NpMi4wPTB4MDAwMDAwMjMsMHgwMDAwMDAyMiwweDAwMDAwMDJjLDB4MDAwMDAwMjAsCitjb21ibzI4X3R1bmVfZHFfcmRfbWluX3ZkbF9ieXRlMF9jaTAuMD0weDAwMDAwMDE2LDB4MDAwMDAwMTQsMHgwMDAwMDAxNCwweDAwMDAwMDE2LDB4MDAwMDAwMTUsMHgwMDAwMDAxNSwweDAwMDAwMDE2LDB4MDAwMDAwMTYsCitjb21ibzI4X3R1bmVfZHFfcmRfbWluX3ZkbF9kYmlfY2kxLjA9MHgwMDAwMDAxNiwweDAwMDAwMDE2LDB4MDAwMDAwMTcsMHgwMDAwMDAxYSwKK2NvbWJvMjhfdHVuZV9hcV91X21heF92ZGxfYWRkcl9jaTAuMD0weDAwMDAwMjAxLAorY29tYm8yOF90dW5lX2RxX3dyX21heF92ZGxfZHFzX2NpMC4wPTB4MDAwMDA0NDAsMHgwMDAwMDQ0YSwweDAwMDAwNDIyLDB4MDAwMDA0MzAsCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9lZGNfY2kyLjA9MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2J5dGUxX2NpMi4wPTB4MDAwMDAwMDMsMHgwMDAwMDAwMCwweDAwMDAwMDAyLDB4MDAwMDAwMDEsMHgwMDAwMDAwMiwweDAwMDAwMDAxLDB4MDAwMDAwMDQsMHgwMDAwMDAwMSwKK2NvbWJvMjhfdHVuZV9kcV9lZGNlbl9maWZvX2NvbmZpZ19jaTEuMD0weDAwMDAwMDgwLDB4MDAwMDAwODAsMHgwMDAwMDA4MCwweDAwMDAwMDgwLAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19lZGNlbl9maWZvX2NlbnRyYWxfaW5pdF9jaTIuMD0weDAwMDAwMDAwLAorY29tYm8yOF90dW5lX2RxX3ZyZWZfZGFjX2NvbmZpZ19jaTEuMD0weDAwN2UwMDAwLDB4MDA3YTAwMDAsMHgwMDgyMDAwMCwweDAwODIwMDAwLAorY29tYm8yOF90dW5lX2RxX21hY3JvX3Jlc2VydmVkX3JlZ19jaTIuMD0weDAwMDAwMDI4LDB4MDAwMDAwMjgsMHgwMDAwMDAyYSwweDAwMDAwMDJiLAorY29tYm8yOF90dW5lX2RxX3dyX21pbl92ZGxfYnl0ZTJfY2kwLjA9MHgwMDAwMDAwMSwweDAwMDAwMDAwLDB4MDAwMDAwMDMsMHgwMDAwMDAwMiwweDAwMDAwMDA1LDB4MDAwMDAwMDUsMHgwMDAwMDAwMywweDAwMDAwMDA1LAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfYnl0ZTBfY2kxLjA9MHgwMDAwMDAxNSwweDAwMDAwMDE3LDB4MDAwMDAwMTcsMHgwMDAwMDAxNywweDAwMDAwMDE3LDB4MDAwMDAwMTUsMHgwMDAwMDAxNCwweDAwMDAwMDE1LAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfZGJpX2NpMi4wPTB4MDAwMDAwMTYsMHgwMDAwMDAxNywweDAwMDAwMDE2LDB4MDAwMDAwMTcsCitjb21ibzI4X3R1bmVfY29udHJvbF9yZWdzX3NoYXJlZF92cmVmX2RhY19jb25maWdfY2kwLjA9MHgwMDkyMDAwMCwKK2NvbWJvMjhfdHVuZV9hcV91X21heF92ZGxfYWRkcl9jaTEuMD0weDAwMDAwMjE0LAorY29tYm8yOF90dW5lX2RxX3dyX21heF92ZGxfZHFzX2NpMS4wPTB4MDAwMDA0NDAsMHgwMDAwMDQ0NiwweDAwMDAwNDJkLDB4MDAwMDA0MzQsCitjb21ibzI4X3R1bmVfZHFfZWRjZW5fZmlmb19jb25maWdfY2kyLjA9MHgwMDAwMDA4MCwweDAwMDAwMDgwLDB4MDAwMDAwODAsMHgwMDAwMDA4MCwKK2NvbWJvMjhfdHVuZV9hcV9sX21hY3JvX3Jlc2VydmVkX3JlZ19jaTAuMD0weDAwMDAwMDAwLAorY29tYm8yOF90dW5lX2RxX3ZyZWZfZGFjX2NvbmZpZ19jaTIuMD0weDAwODQwMDAwLDB4MDA3ZTAwMDAsMHgwMDhhMDAwMCwweDAwODIwMDAwLAorY29tYm8yOF90dW5lX2RxX3dyX21pbl92ZGxfYnl0ZTJfY2kxLjA9MHgwMDAwMDAwMCwweDAwMDAwMDAxLDB4MDAwMDAwMDIsMHgwMDAwMDAwNCwweDAwMDAwMDAzLDB4MDAwMDAwMDAsMHgwMDAwMDAwNCwweDAwMDAwMDA3LAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfYnl0ZTBfY2kyLjA9MHgwMDAwMDAxNCwweDAwMDAwMDE1LDB4MDAwMDAwMTUsMHgwMDAwMDAxNCwweDAwMDAwMDE2LDB4MDAwMDAwMTcsMHgwMDAwMDAxNSwweDAwMDAwMDE2LAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19zaGFyZWRfdnJlZl9kYWNfY29uZmlnX2NpMS4wPTB4MDA5MjAwMDAsCitjb21ibzI4X3R1bmVfYXFfdV9tYXhfdmRsX2FkZHJfY2kyLjA9MHgwMDAwMDA0OCwKK2NvbWJvMjhfdHVuZV9kcV93cl9tYXhfdmRsX2Rxc19jaTIuMD0weDAwMDAwNDI0LDB4MDAwMDA0MzUsMHgwMDAwMDQzYywweDAwMDAwNDQ0LAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfYnl0ZTFfY2kwLjA9MHgwMDAwMDAxNywweDAwMDAwMDE3LDB4MDAwMDAwMTgsMHgwMDAwMDAxOCwweDAwMDAwMDE0LDB4MDAwMDAwMTUsMHgwMDAwMDAxNSwweDAwMDAwMDE1LAorY29tYm8yOF90dW5lX2FxX2xfbWFjcm9fcmVzZXJ2ZWRfcmVnX2NpMS4wPTB4MDAwMDAwMDAsCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9ieXRlMl9jaTIuMD0weDAwMDAwMDA0LDB4MDAwMDAwMDAsMHgwMDAwMDAwNCwweDAwMDAwMDA1LDB4MDAwMDAwMDIsMHgwMDAwMDAwMywweDAwMDAwMDA0LDB4MDAwMDAwMDQsCitjb21ibzI4X3R1bmVfZHFfd3JfbWF4X3ZkbF9kYXRhX2NpMC4wPTB4MDAwMDA0MTYsMHgwMDAwMDQyOCwweDAwMDAwMjMyLDB4MDAwMDAyNDEsCitjb21ibzI4X3R1bmVfY29udHJvbF9yZWdzX3NoYXJlZF92cmVmX2RhY19jb25maWdfY2kyLjA9MHgwMDkyMDAwMCwKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2J5dGUzX2NpMC4wPTB4MDAwMDAwMDUsMHgwMDAwMDAwNSwweDAwMDAwMDA1LDB4MDAwMDAwMDQsMHgwMDAwMDAwMywweDAwMDAwMDAzLDB4MDAwMDAwMDMsMHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2J5dGUxX2NpMS4wPTB4MDAwMDAwMTgsMHgwMDAwMDAxOCwweDAwMDAwMDE4LDB4MDAwMDAwMTQsMHgwMDAwMDAxNCwweDAwMDAwMDE0LDB4MDAwMDAwMTgsMHgwMDAwMDAxNCwKK2NvbWJvMjhfdHVuZV9hcV9sX21hY3JvX3Jlc2VydmVkX3JlZ19jaTIuMD0weDAwMDAwMDAwLAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19yZXNlcnZlZF9yZWdfY2kwLjA9MHgwMDAwMDAwMywKK2NvbWJvMjhfdHVuZV9kcV9yZWFkX21heF92ZGxfZnNtX2NpMC4wPTB4MDAwMDAwNGIsMHgwMDAwMDA0YiwweDAwMDAwMDRiLDB4MDAwMDAwNGIsCitjb21ibzI4X3R1bmVfYXFfdV9tYXhfdmRsX2N0cmxfY2kwLjA9MHgwMDAwMDIwMSwKK2NvbWJvMjhfdHVuZV9kcV9yZF9tYXhfdmRsX2Rxc25fY2kwLjA9MHgwMDAwMDAxOCwweDAwMDAwMDE5LDB4MDAwMDAwMjUsMHgwMDAwMDAyYiwKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2RiaV9jaTAuMD0weDAwMDAwMDAxLDB4MDAwMDAwMDEsMHgwMDAwMDAwMywweDAwMDAwMDAzLAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfZWRjX2NpMC4wPTB4MDAwMDAwMTYsMHgwMDAwMDAxNywweDAwMDAwMDE3LDB4MDAwMDAwMTgsCitjb21ibzI4X3R1bmVfYXFfbF9tYXhfdmRsX2FkZHJfY2kwLjA9MHgwMDAwMDIwMSwKK2NvbWJvMjhfdHVuZV9kcV93cl9tYXhfdmRsX2RhdGFfY2kxLjA9MHgwMDAwMDQxNCwweDAwMDAwNDFlLDB4MDAwMDAyMzQsMHgwMDAwMDI0NSwKKworIyMjIEVuYWJsZSBCSVNUCisjIFJ1biBEcmFtIEJJU1Qgb24gaW5pdGlhbGl6YXRpb24sIGlmIEJJU1QgZmFpbCB0aGUgaW5pdGlhbGl6YXRpb24gd2lsbCBmYWlsLiBEZWZ1bHQ6IDEuCisjIGJpc3RfZW5hYmxlX2RyYW0uQkNNODg2NTA9MQorYmlzdF9lbmFibGVfZHJhbS5CQ004ODI3MD0xCitiaXN0X2VuYWJsZV9kcmFtLkJDTTg4NDcwPTEKKworIyMjIEV4YW1wbGUgZm9yIERyYW0gU2F2ZWQgY29uZmlnIFBhcmFtZXRlcnMuCisjIyBUaGlzIGV4YW1wbGUgaXMgZm9yIGNpPTE0IChEcmFtPTcpLgorI2RkcjNfdHVuZV9hZGRyY19jaTE0PTB4MDAwMDAwYWUKKyNkZHIzX3R1bmVfd3JfZHFfd2wxX2NpMTQ9MHg5MjkyOTI5MiwweDkyOTI5MjkyLDB4OTI5MjkyOTIsMHg5MjkyOTI5MgorI2RkcjNfdHVuZV93cl9kcV93bDBfY2kxND0weDkzOTM5MzkzLDB4OTM5MzkzOTMsMHg5MjkyOTI5MiwweDkyOTI5MjkyCisjZGRyM190dW5lX3dyX2RxX2NpMTQ9MHg4MDgwODA4MAorI2RkcjNfdHVuZV92cmVmX2NpMTQ9MHgwMDAwMDdkZgorI2RkcjNfdHVuZV9yZF9kcXNfY2kxND0weDk2OTY5MTkxLDB4OTA5MDkxOTEKKyNkZHIzX3R1bmVfcmRfZHFfd2wxX3JuX2NpMTQ9MHg4MjgyODI4MiwweDgyODI4MjgyLDB4ODI4MjgyODIsMHg4MjgyODI4MgorI2RkcjNfdHVuZV9yZF9kcV93bDBfcm5fY2kxND0weDgyODI4MjgyLDB4ODI4MjgyODIsMHg4OTg5ODk4OSwweDg5ODk4OTg5CisjZGRyM190dW5lX3JkX2RxX3dsMV9ycF9jaTE0PTB4ODI4MjgyODIsMHg4MjgyODI4MiwweDgyODI4MjgyLDB4ODI4MjgyODIKKyNkZHIzX3R1bmVfcmRfZHFfd2wwX3JwX2NpMTQ9MHg4MjgyODI4MiwweDgyODI4MjgyLDB4ODk4OTg5ODksMHg4OTg5ODk4OQorI2RkcjNfdHVuZV9yZF9lbl9jaTE0PTB4MDA5ZDllOWQsMHgwMGEyYTNhMQorI2RkcjNfdHVuZV9yZF9kYXRhX2RseV9jaTE0PTB4MDAwMDA1MDUKKworCisjIyMgRHJhbSB0eXBlOiBTZWxlY3QgT05MWSBPTkUgb2YgdGhlIGZvbGxvd2luZyBEUkFNIHR5cGVzLCB0byBjb25maWd1cmUgYWxsIGRyYW0gcmVsYXRlZCBwYXJhbWV0ZXJlcyBwZXIgdHlwZS4KKworIyBEcmFtIFR5cGUgZm9yIEFyYWQ6CisjZHJhbV90eXBlX0REUjNfSFlOSVhfSDVUUTJHNjNCRlJfVEVDXzEwNjY9MQorI2RyYW1fdHlwZV9ERFIzX0hZTklYX0g1VFEyRzYzQkZSX1RFQ185MzM9MQorI2RyYW1fdHlwZV9ERFIzX0hZTklYX0g1VFEyRzYzQkZSX1RFQ184MDA9MQorI2RyYW1fdHlwZV9ERFIzX01JQ1JPTl9NVDQxSjI1Nk0xNl80R0JJVF8xMDY2PTEKKyNkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoxMjhNMTZIQV8xMjVfMTA2Nj0xCisjZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMTI4TTE2SEFfMTI1XzkzMz0xCisjZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMTI4TTE2SEFfMTI1XzgwMD0xCisjZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDJKNjRNMTZMQV8xNUVfNjY3PTEKKyNkcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjRHMTY0NkJfNEdCSVRfMTA2Nj0xCisjZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZHXzkzMz0xCisjZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZHXzgwMD0xCisKKyMgRHJhbSBUeXBlIGZvciBKZXJpY2hvOgorIyMgdGhpcyBzb2MgaXMgY29uZmlndXJlZCBpbiBwZXIgYm9hcmQgc29jIGZpbGUgKGJjbTg4eDd4X2JvYXJkLnNvYykKKyNkcmFtX3R5cGVfRERSNF9NSUNST05fWTQwMTZBQUJHX0pEX0ZfNEdCSVQ9MQorZHJhbV90eXBlX0REUjRfTUlDUk9OX01UNDBBMjU2TTE2SEFfMDgzRUFfNEdCSVQ9MQorI2RyYW1fdHlwZV9ERFI0X0hZTklYX0g1QU40RzZOTUZSX1ZKQ180R0JJVD0xCisjZHJhbV90eXBlX0dERFI1X1NBTVNVTkdfSzRHMjAzMjVGRF8yR0JJVD0xCisjZHJhbV90eXBlX0dERFI1X1NBTVNVTkdfSzRHNDEzMjVGQ180R0JJVD0xCisjZHJhbV90eXBlX0dERFI1X01JQ1JPTl9FRFc0MDMyQ0FCR180R0JJVD0xCisjZHJhbV90eXBlX0dERFI1X0hZTklYX0g1R0M0SDI0TUZSX1QyQ180R0JJVD0xCisKKyMgRHJhbSBUeXBlIGZvciBBcmRvbjoKKyNkcmFtX3R5cGVfRERSNF9NSUNST05fRURZNDAxNkFBQkdfRFJGUl80R0JJVD0xCisKKyMgRFJBTSBmcmVxdWVuY3kKK2V4dF9yYW1fZnJlcS5CQ004ODY3NT0xNjAwCisKKyMjIyBTZXR0aW5nIGRyYW1fdHlwZV9ERFIzX0hZTklYX0g1VFEyRzYzQkZSX1RFQ18xMDY2IFBhcmFtZXRlcnMgYXMgRGVmYXVsdDoKKyMjIEFsbCBvdGhlciBkcmFtIHR5cGVzIHBhcmFtZXRlciByZXNpZGVzIGluIGFyYWQuc29jLiBjaG9vc2luZyBhbm90aGVyIERyYW0gVHlwZSB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycy4KK2V4dF9yYW1fdF9ycmQ9NjAwMAorZXh0X3JhbV9jb2x1bW5zPTEwMjQKK2V4dF9yYW1fYmFua3M9OAorZXh0X3JhbV9hcF9iaXRfcG9zPTEwCitleHRfcmFtX2J1cnN0X3NpemU9MzIKK2V4dF9yYW1fdF9yZWY9MzkwMDAwMAorZXh0X3JhbV90X3dyPTE1MDAwCitleHRfcmFtX3Rfd3RyPTc1MDAKK2V4dF9yYW1fdF9ydHA9NzUwMAorZXh0X3JhbV9mcmVxPTEwNjYKK2V4dF9yYW1fcm93cz0xNjM4NAorZXh0X3JhbV9qZWRlYz0yOQorZXh0X3JhbV90X3JjPTQ2MDkwCitleHRfcmFtX3RfcmNkX3JkPTEzMDkwCitleHRfcmFtX3RfcmNkX3dyPTEzMDkwCitleHRfcmFtX3RfcnA9MTMwOTAKK2V4dF9yYW1fdF9yZmM9MTYwMDAwCitleHRfcmFtX3RfcmFzPTMzMDAwCitleHRfcmFtX2Nfd3JfbGF0ZW5jeT0xMAorZXh0X3JhbV90X2Zhdz0zNTAwMAorZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTE0CitkZHIzX21lbV9ncmFkZT0weDE0MTQxNAorCisjIyBhZGRyZXNzIG9yIGJhbmsgYWRkcmVzcyBzd2FwIGV4YW1wbGUKKyNzd2FwcyBhcmUgZm91bmQgaW4gYmNtODh4eHhfYm9hcmQuc29jCisjZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtWF9iaXRZPU0KKworIyMgZHEgc3dhcCBleGFtcGxlCisjc3dhcHMgYXJlIGZvdW5kIGluIGJjbTg4eHh4X2JvYXJkLnNvYworI2JpdCBzd2FwIGV4YW1wbGU6CisjZXh0X3JhbV9kcV9zd2FwX2RyYW1YX2J5dGVZX2JpdFo9TQorI2J5dGUgc3dhcCBleGFtcGxlOgorI2V4dF9yYW1fZHFfc3dhcF9kcmFtWF9ieXRlWT1NCisKKyMjIERyYW0gR2VhciBkb3duIG1vZGUuIFZhbGlkIHZhbHVlczogMCAtIEVuYWJsZSwgMSAtIERpc2FibGUuIERlZmF1bHQ6IDB4MC4KK2V4dF9yYW1fZ2Vhcl9kb3duX21vZGUuQkNNODg2NzU9MAorCisjIyBBbGVydF9uIGRlLWFzc2VydGlvbiBwZXJpb2QgYWJvdmUgd2hpY2ggZXJyb3IgaXMgY29uc2lkZXJlZCBwYXJpdHkgZXJyb3IKKyNleHRfcmFtX2FsZXJ0X25fcGVyaW9kX3RocnMuQkNNODg2NzU9MjAKKworIyMgRHJhbSBBZGRyZXNzIGJ1cyBpbnZlcnNpb24uIFZhbGlkIHZhbHVlczogMCAtIEVuYWJsZSwgMSAtIERpc2FibGUuIERlZmF1bHQ6IDB4MC4KKyMjIHRoaXMgc29jIGlzIGNvbmZpZ3VyZWQgaW4gcGVyIGJvYXJkIHNvYyBmaWxlIChiY204OHg3eF9ib2FyZC5zb2MpCisjZXh0X3JhbV9hYmkuQkNNODg2NzU9MAorCisjIyBEYXRhIGJ1cyBpbnZlcnNpb24gb24gd3JpdGUvcmVhZCBkaXJlY3Rpb24uIFZhbGlkIHZhbHVlczogMCAtIERpc2FibGUsIDEgLSBFbmFibGUuIERlZmF1bHQ6IDB4MC4KKyMjIHRob3NlIHNvY3MgYXJlIGNvbmZpZ3VyZWQgaW4gcGVyIGJvYXJkIHNvYyBmaWxlIChiY204OHg3eF9ib2FyZC5zb2MpCisjZXh0X3JhbV93cml0ZV9kYmkuQkNNODg2NzU9MAorI2V4dF9yYW1fcmVhZF9kYmkuQkNNODg2NzU9MAorCisjIyBFbmFibGUgd3JpdGUvcmVhZCBDUkMgKEREUjQgZG9lcyBub3Qgc3VwcG9ydCByZWFkIENSQykuIERlZmF1bHQ6IDB4MC4KKyMjIHRob3NlIHNvY3MgYXJlIGNvbmZpZ3VyZWQgaW4gcGVyIGJvYXJkIHNvYyBmaWxlIChiY204OHg3eF9ib2FyZC5zb2MpCisjZXh0X3JhbV93cml0ZV9jcmMuQkNNODg2NzU9MQorI2V4dF9yYW1fcmVhZF9jcmMuQkNNODg2NzU9MAorCisjIyBDb21tYW5kIHBhcml0eSBsYXRlbmN5LiBWYWxpZCB2YWx1ZXM6IDAgLSBEaXNhYmxlLCA0LDUgb3IgNiAtIFZhbGlkIHZhbHVlcy4gRGVmYXVsdDogMHgwLgorIyMgdGhpcyBzb2MgaXMgY29uZmlndXJlZCBpbiBwZXIgYm9hcmQgc29jIGZpbGUgKGJjbTg4eDd4X2JvYXJkLnNvYykKKyNleHRfcmFtX2NtZF9wYXJfbGF0ZW5jeS5CQ004ODY3NT02CisKKyMgRFJBTSBwcmUtY29uZmlndXJhdGlvbnMgYWNjb3JkaW5nIHRvIGNvbmZpZyB2YXJpYWJsZXMgd2hpY2ggZGVmaW5lcworIyBEcmFtIFR5cGUuIEJDTTg4NjUwIHN1cHBvcnRzIG9ubHkgRERSMy4KKyMgRHJhbSBUeXBlLiBCQ004ODY3NSBzdXBwb3J0cyBERFI0IGFuZCBHRERSNS4KK2V4dF9yYW1fdHlwZS5CQ004ODY1MD1ERFIzCisjIyB0aGlzIHNvYyBpcyBjb25maWd1cmVkIGluIHBlciBib2FyZCBzb2MgZmlsZSAoYmNtODh4N3hfYm9hcmQuc29jKQorI2V4dF9yYW1fdHlwZS5CQ004ODY3NT1ERFI0CisKKyMgVG90YWwgRHJhbSBTaXplIChNQnl0ZXMpCisjIEZvciA4IGRyYW1zIGludGVyZmFjZXMsIDIgY2hhbm5lbCBlYWNoLCBFYWNoIGNoYW5uZWwgMkdiaXQgRHJhbS4gdGhlIHRvdGFsIERSQU0gc2l6ZSBpcyAzMkdCaXRzPTQwMDBNQnl0ZXMuCitleHRfcmFtX3RvdGFsX3NpemUuQkNNODg2NTA9NDAwMAorIyMgdGhpcyBzb2MgaXMgY29uZmlndXJlZCBpbiBwZXIgYm9hcmQgc29jIGZpbGUgKGJjbTg4eDd4X2JvYXJkLnNvYykKKyNleHRfcmFtX3RvdGFsX3NpemUuQkNNODg2NzU9ODAwMAorCisjIFRvdGFsIGJ1ZmZlciBzaXplIGFsbG9jYXRlZCBmb3IgVXNlciBidWZmZXIuIFVuaXRzOiBNYnl0ZXMuIERlZmF1bHQ6ICcweDAnLgorIyBTdXBwb3J0ZWQgc3VmZml4OgorIyAgICAgICBkcmFtIC0gdGhlIGJ1ZmZlciBzaXplIHdpbGwgYmUgc3VidHJhY3RlZCBmcm9tIHRoZSBEUkFNIHNpemUgYXZhaWxhYmxlIGZvciBwYWNrZXQgbWVtb3J5LgorI3VzZXJfYnVmZmVyX3NpemU9MAorI3VzZXJfYnVmZmVyX3NpemVfZHJhbT01MAorCisjIERSQU0gQ2xhbVNoZWxsIChpbnRlcmZhY2Ugc3dhcCBpdHMgSFcgUElOIHBhaXJzIGR1cmluZyBpbml0LikKKyMgTm90ZTogT25seSBvbmUgb2YgRFJBTXMgY2FuIGhhdmUgaXRzIFBJTiBzd2FwcGVkCisjIFZhbGlkIHZhbHVlczogMC8xCisjZHJhbTBfY2xhbXNoZWxsX2VuYWJsZS5CQ004ODY1MD0xCisjZHJhbTFfY2xhbXNoZWxsX2VuYWJsZS5CQ004ODY1MD0xCisKKyMgRFJBTSBtYXhpbXVtIG51bWJlciBvZiBjcmMgZXJyb3IgcGVyIGJ1ZmZlciwgYnVmZmVyIGRlbGV0ZWQgYnkgaW50ZXJydXB0IGFwcGxpY2F0aW9uLgorI2RyYW1fY3JjX2RlbF9idWZmZXJfbWF4X3JlY2xhaW1zPTAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbmZpZyB2YXJpYWJsZSBiZWxvdyBhcmUgb25seSBhY2Nlc3NlZCBmcm9tIGR1bmUuc29jLCBhbmQgYXJlIHVzZWQgdG8KKyMgY29uZmlndXJlIEJTUCAvIGV4YW1wbGUgYXBwbGljYXRpb24gLyBncm91cCBvZiBmb3JtYWwgY29uZmlnIHZhcmlhYmxlcy4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyBJZiBzZXQsIGFsd2F5cyBjb25maWd1cmVzIHN5bnRoZXNpemVycywgZXZlbiBpZiB0aGUgY29uZmlndXJlZCByYXRlIGlzIGVxdWFsIHRvCisjIyB0aGVpciBub21pbmFsIHJhdGUuIENhbiBiZSBkaXNhYmxlZCB0byBzcGVlZHVwIGJyaW5ndXAgdGltZSAoa2VlcCBpbiBtaW5kIHRoYXQgaWYKKyMjIGRpc2FibGVkLCBjaGFuZ2luZyBhIHN5bnQgdG8gYSBub24tbm9taW5hbCBmcmVxIGFuZCB0aGFuIGJhY2sgdG8gbm9taW5hbCB3aWxsIG5vdAorIyMgd29yaworI3N5bnRfb3Zlci5CQ004ODY1MD0xCisKKyMgTG9jYWwgdmFyaWFibGVzIGZvciBib2FyZCBzeW50aGVzaXplcnMgZnJlcS4gRmFicmljLCBjb21ibyBhbmQgbmlmIGFsc28gY29uZmlndXJlCisjIHRoZSAqX3JlZl9jbG9jayBzb2MgcHJvcGVydGllcyBmb3IgdGhlc2UgZnJlcXVlbmNpZXMuIGNvcmUsIGRkciBhbmQgcGh5IG9ubHkKKyMgY29uZmlndXJlcyB0aGUgc3ludGhlc2l6ZXIKK3N5bnRfY29yZS5CQ004ODY1MD0xMDAwMDAwMDAKK3N5bnRfZGRyLkJDTTg4NjUwPTEyNTAwMDAwMAorc3ludF9waHkuQkNNODg2NTA9MTU2MjUwMDAwCisjIGluIEplcmljaG8sIHRoaXMgZnJlcSBpcyB1c2VkIG9ubHkgZm9yIHRoZSBjb3JlIHN5bnRoCitzeW50aF9kcmFtX2ZyZXEuQkNNODg2NTA9MjUKKworI0NvbmZpZ3VyZSB0aGUgcmVmZXJlbmNlIGNsb2NrIGZyZXF1ZW5jaWVzIGZvciBOSUYgYW5kIEZhYnJpYyBTZXJEZXMKKyMgT3B0aW9uczogIDAgLSAxMjVNSHosIDEgLSAxNTYuMjVNSHosIC0xIC0gRGlzYWJsZQorc2VyZGVzX25pZl9jbGtfZnJlcS5CQ004ODY1MD0xCitzZXJkZXNfZmFicmljX2Nsa19mcmVxLkJDTTg4NjUwPTEKKyNzZXJkZXNfbmlmX2Nsa19mcmVxLkJDTTg4MjcwPS0xCisjc2VyZGVzX2ZhYnJpY19jbGtfZnJlcS5CQ004ODI3MD0tMQorc2VyZGVzX25pZl9jbGtfZnJlcS5CQ004MjA2PS0xCitzZXJkZXNfZmFicmljX2Nsa19mcmVxLkJDTTgyMDY9LTEKKyNzZXJkZXNfbmlmX2Nsa19mcmVxX291dDAuQkNNODg2NzU9MQorI3NlcmRlc19uaWZfY2xrX2ZyZXFfb3V0MS5CQ004ODY3NT0xCisjc2VyZGVzX25pZl9jbGtfZnJlcV9vdXQyLkJDTTg4Njc1PTEKKyNzZXJkZXNfbmlmX2Nsa19mcmVxX2luMC5CQ004ODY3NT0xCisjc2VyZGVzX25pZl9jbGtfZnJlcV9pbjEuQkNNODg2NzU9MQorI3NlcmRlc19uaWZfY2xrX2ZyZXFfaW4yLkJDTTg4Njc1PTEKKyNzZXJkZXNfZmFicmljX2Nsa19mcmVxX291dDAuQkNNODg2NzU9MQorI3NlcmRlc19mYWJyaWNfY2xrX2ZyZXFfb3V0MS5CQ004ODY3NT0xCisjc2VyZGVzX2ZhYnJpY19jbGtfZnJlcV9pbjAuQkNNODg2NzU9MQorI3NlcmRlc19mYWJyaWNfY2xrX2ZyZXFfaW4xLkJDTTg4Njc1PTEKKworCisjIElFRUUgMTU4OCAvIEJyb2Fkc3luYyAtCisjIGNvbmZpZ3VyZSBjbG9jayA6CisjICBEUExMIG1vZGUvbG9jazogMCAtIGVjaSB0cyBwbGwgY2xrIGRpc2FibGVkLCAxIC0gY29uZmlndXJlIGVjaSB0cyBwbGwgY2xrCisjICBEUExMIHBoYXNlL2ZyZXEuIERlZmF1bHQgaW5pdGlhbDogbG8gPSAweDQwMDAwMDAwLCBoaSA9IDB4MTAwMDAwMDAuCisjcGh5XzE1ODhfZHBsbF9mcmVxdWVuY3lfbG9jay5CQ004ODY1MD0xCisjcGh5XzE1ODhfZHBsbF9waGFzZV9pbml0aWFsX2xvLkJDTTg4NjUwPTB4NDAwMDAwMDAKKyNwaHlfMTU4OF9kcGxsX3BoYXNlX2luaXRpYWxfaGkuQkNNODg2NTA9MHgxMDAwMDAwMAorIyBJRUVFIDE1ODggLQorIyBwb3J0IGV4dGVybmFsIE1BQworIyAgaW5kaWNhdGlvbiB3aGV0aGVyIGV4dGVybmFsIE1BQyBleGlzdHMgb3Igbm90LgorIyAgMDogMTU4OCBleHRlcm5hbCBNQUMgZG9lcyBub3QgZXhpc3QKKyMgIDE6IDE1ODggZXh0ZXJuYWwgTUFDIGV4aXN0cworIyAgdGhlIGV4dGVybmFsIE1BQyBzdWJzdHJhY3RzIHRoZSBSWCB0aW1lIGZyb20gdGhlIGNvcnJlY3Rpb24gZmllbGQKKyMgIGFuZCBhZGRzIHRoZSBUWCB0aW1lIHRvIHRoZSBjb3JyZWN0aW9uIGZpZWxkLgorI2V4dF8xNTg4X21hY19lbmFibGVfMTQuQkNNODg2NTA9MQorIyAgSWYgc2V0LCA0OCBiaXRzIHN0YW1waW5nIGlzIHVzZWQgZm9yIDE1ODggcGFja2V0cy4gb3RoZXJ3aXNlIDMyIGJpdCBzdGFtcGluZyBpcyB1c2VkCisjICAwOiAxNTg4IDMyYiBzdGFtcGluZyAoRGVmYXVsdCkKKyMgIDE6IDE1ODggNDhiIHN0YW1waW5nCisjYmNtODg2NjBfMTU4OF80OGJfc3RhbXBpbmdfZW5hYmxlLkJDTTg4NjYwPTEKKworIyMgVHJpbGwgY29uZmlndXJhdGlvbnMKKyMgVHJpbGwgbW9kZTogMCAoZGlzYWJsZWQpIC8gMSAoY29hcnNlLWdyYWluZWQpIC8gMiAoZmluZS1ncmFpbmVkKQorI3RyaWxsX21vZGUuQkNNODg2NTA9MQorCisjIFRyaWxsIG11bHRpY2FzdCBwcnVubmluZyBtb2RlOgorIyAwOiBubyBwcnVubmluZyAtIHZzaSBpcyBub3QgcGFydCBvZiB0aGUga2V5CisjIDE6IFZTSSBwcnVubmluZzogS2V5IGlzIGRpc3QtdHJlZSxlc2FkaXQtYml0LFZTSS4KK3RyaWxsX21jX3BydW5lX21vZGUuQkNNODg2NTA9MAorCisjIEVuYWJsZSBTQSBhdXRoZW50aWNhdGlvbgorI3NhX2F1dGhfZW5hYmxlZD0xCisKKyMgQnJpZGdlIGRlZmF1bHQgbG9naWNhbCBpbnRlcmZhY2VzIGFsbG9jYXRpb24gSURTCitsb2dpY2FsX3BvcnRfbDJfYnJpZGdlLkJDTTg4NjUwPTAKK2xvZ2ljYWxfcG9ydF9kcm9wLkJDTTg4NjUwPTEKKworI2xvZ2ljYWxfcG9ydF9taW1faW4uQkNNODg2NTA9MgorI2xvZ2ljYWxfcG9ydF9taW1fb3V0LkJDTTg4NjUwPTQwOTYKKworIyBFbmFibGUgRVZCIGFwcGxpY2F0aW9uCisjZXZiX2VuYWJsZT0xCisKKyMgRW5hYmxlIEZsZXhpYmxlIFFpblEgYXBwbGljYXRpb24KKyN2bGFuX3RyYW5zbGF0aW9uX21hdGNoX2lwdjQ9MQorCisjIEVuYWJsZSBwcmVzZWwgbWdtdCBhZHZhbmNlIG1vZGUKKyNmaWVsZF9wcmVzZWxfbWdtdF9hZHZhbmNlZF9tb2RlPTEKKworIyBFbmFibGUgSVRNSCBwcm9ncmFtbWFibGUgbW9kZQorIyBJVE1IIHByb2Nlc3NpbmcgZnVsbHkgcHJvZ3JhbW1hYmxlIChub3QgZml4ZWQpIGJ5IHVzaW5nIHRoZSBGUCBBUElzLiAKKyMgSW4gdGhpcyBtb2RlIElUTUggcHJvY2Vzc2luZyB1c2VzIHRoZSBUQ0FNL2RpcmVjdCB0YWJsZSBmb3IgVE0gcHJvZ3JhbXMgbG9va3VwLCBpbiBzYW1lIG1hbm5lciBhcyBFdGhlcm5ldCBmcmFtZXMuCitpdG1oX3Byb2dyYW1tYWJsZV9tb2RlX2VuYWJsZS5CQ004ODY3NT0xCitpdG1oX3Byb2dyYW1tYWJsZV9tb2RlX2VuYWJsZS5CQ004ODQ3MD0xCitpdG1oX3Byb2dyYW1tYWJsZV9tb2RlX2VuYWJsZS5CQ004ODI3MD0xCitpdG1oX3Byb2dyYW1tYWJsZV9tb2RlX2VuYWJsZS5CQ004ODY4MD0xCisKKworCisjIFByZXBlbmQgdGFnIHRvIGJlIDQgYnl0ZXMgb3IgOCBieXRlcy4gRGVmYXVsdDogNEIuCisjIEFwcGxpY2FibGUgb25seSBmcm9tIEFSQUQrCisjcHJlcGVuZF90YWdfYnl0ZXM9NEIKKworIyBUaGUgUHJlcGVuZCBUYWcgaXMgbG9jYXRlZCBhdCAoMTIgKyAyKm9mZnNldCkgYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldC4KKyMgUmFuZ2U6IDAtNy4gRGVmYXVsdDogMAorI3ByZXBlbmRfdGFnX29mZnNldD0wCisKKyMgRW5hYmxlIEFSUCAobmV4dCBob3AgbWFjIGV4dGVuc2lvbikgZmVhdHVyZQorYmNtODg2eHhfbmV4dF9ob3BfbWFjX2V4dGVuc2lvbl9lbmFibGUuQkNNODg2NTA9MQorCisjIFNldCBWTEFOIHRyYW5zbGF0ZSBtb2RlLgorIyAwOiBub3JtYWwKKyMgMTogYWR2YW5jZWQgbW9kZS4gRW5hYmxlIHZsYW4gZWRpdCBzZXR0aW5ncyB3aXRoIGVuaGFuY2VkIHVzZXIgY29udHJvbAorI2JjbTg4Nnh4X3ZsYW5fdHJhbnNsYXRlX21vZGU9MAorCisjIFNldCBNUExTIHRlcm1pbmF0aW9uIGRhdGFiYXNlIG1vZGUKKyMgU2V0IE1QTFMgZGF0YWJhc2VzIGxvY2F0aW9uIGZvciBlYWNoIE1QTFMgbmFtZXNwYWNlIChMMSxMMixMMykKKyNiY204ODZ4eF9tcGxzX3Rlcm1pbmF0aW9uX2RhdGFiYXNlX21vZGU9MAorCisjIEVuYWJsZSAsIERpc2FibGUgTVBMUyBpbmRleGVkLgorIyBNUExTIHRlcm1pbmF0aW9uIHdpdGgga25vd24gbGFiZWwgc3RhY2sgbG9jYXRpb24uCisjIE11c3QgYmUgZW5hYmxlZCBpbiBjYXNlIGRldmljZSBzdXBwb3J0cyBtb3JlIHRoYW4gMiBNUExTIGxhYmVsIHRlcm1pbmF0aW9ucyAoTDEsTDIsTDMpCisjbXBsc190ZXJtaW5hdGlvbl9sYWJlbF9pbmRleF9lbmFibGU9MQorCisjIEVuYWJsZSBGYXN0UmVSb3V0ZSBsYWJlbHMgaW4gZGV2aWNlLgorI2Zhc3RfcmVyb3V0ZV9sYWJlbHNfZW5hYmxlPTAKKworIyBFbmFibGUgTVBMUyBDb250ZXh0IHNwZWNpZmljLiBVcHN0cmVhbSBsYWJlbCBhc3NpZ25tZW50IGluIGRldmljZS4KKyNtcGxzX2NvbnRleHRfc3BlY2lmaWNfbGFiZWxfZW5hYmxlPTAKKworIyBNUExTIGNvbnRleHQuCisjIENhbiBiZSBnbG9iYWwsIHBlciBwb3J0ICwgcGVyIGludGVyZmFjZSBvciBwZXIgcG9ydCxpbnRlcmZhY2UuCisjbXBsc19jb250ZXh0PWdsb2JhbAorCisjIE1QTFMgVFAgTUMgcmVzZXJ2ZWQgbWFjIGFkZHJlc3MgKDAxLTAwLTVFLTkwLTAwLTAwKS4KKyMgSWYgc2V0IGRldmljZSB3aWxsIHN1cHBvcnQgTXktTUFDIHRlcm1pbmF0aW9uIG9mIHJlc2VydmVkIE1DIEV0aGVybmV0CisjbXBsc190cF9teW1hY19yZXNlcnZlZF9hZGRyZXNzPTAKKworIyBNUExTIEVMSSBlbmFibGUgZGlzYWJsZQorbXBsc19lbnRyb3B5X2xhYmVsX2luZGljYXRvcl9lbmFibGU9MAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyNjZmcgZm9yIEJDTTg4MjAyIC0gQXJkb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyNDb3JlIGNsb2NrIGFuZCBzeXN0ZW0gcmVmZXJlbmNlIGNsb2NrIChLSHopCitjb3JlX2Nsb2NrX3NwZWVkX2toei5CQ004ODIwMj00NTAwMDAKK3N5c3RlbV9yZWZfY29yZV9jbG9ja19raHouQkNNODgyMDI9MTIwMDAwMAorCisjIyBTZXQgVE0gYXMgZGV2aWNlIG1vZGUKK2ZhcF9kZXZpY2VfbW9kZS5CQ004ODIwMj1UTQorCisjIyBTZXQgQ1BVIHBvcnRzIGhlYWRlciB0eXBlCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzAuQkNNODgyMDI9VE0KK3RtX3BvcnRfaGVhZGVyX3R5cGVfb3V0XzAuQkNNODgyMDI9VE0KK3RtX3BvcnRfaGVhZGVyX3R5cGVfaW5fMjAwLkJDTTg4MjAyPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDAuQkNNODgyMDI9VE0KK3RtX3BvcnRfaGVhZGVyX3R5cGVfaW5fMjAxLkJDTTg4MjAyPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDEuQkNNODgyMDI9VE0KK3RtX3BvcnRfaGVhZGVyX3R5cGVfaW5fMjAyLkJDTTg4MjAyPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDIuQkNNODgyMDI9VE0KK3RtX3BvcnRfaGVhZGVyX3R5cGVfaW5fMjAzLkJDTTg4MjAyPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDMuQkNNODgyMDI9VE0KKworIyMjIyMgQXBwbGljYXRpb24gY29uZmlndXJhdGlvbgorIyMjIERlZmF1bHQgU0RLIEFwcGxpY2F0aW9uCit1Y29kZV9wb3J0XzEuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjAKK3Vjb2RlX3BvcnRfMTMuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjEKK3Vjb2RlX3BvcnRfMTQuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjIKK3Vjb2RlX3BvcnRfMTUuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjMKK3Vjb2RlX3BvcnRfMTYuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjQKK3Vjb2RlX3BvcnRfMTcuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjUKKworIyMjIFBvcnRPcHJpb3JpdHkgKGFkZGl0b25hbCBwb3J0cyBjYW4gYmUgYWRkZWQpCisjZGlhZ19jb3NxX2Rpc2FibGUuQkNNODgyMDI9MQorI3Vjb2RlX3BvcnRfMS5CQ004ODIwMj1JR05PUkUKKyN1Y29kZV9wb3J0XzEzLkJDTTg4MjAyPUlHTk9SRQorI3Vjb2RlX3BvcnRfMTQuQkNNODgyMDI9SUdOT1JFCisjdWNvZGVfcG9ydF8xNS5CQ004ODIwMj1JR05PUkUKKyN1Y29kZV9wb3J0XzE2LkJDTTg4MjAyPUlHTk9SRQorI3Vjb2RlX3BvcnRfMTcuQkNNODgyMDI9SUdOT1JFCisjdWNvZGVfcG9ydF8xLkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4wCisjdWNvZGVfcG9ydF8yLkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4xCisjdWNvZGVfcG9ydF8zLkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4yCisjdWNvZGVfcG9ydF80LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4zCisjdWNvZGVfcG9ydF81LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC40CisjdWNvZGVfcG9ydF82LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC41CisjdWNvZGVfcG9ydF83LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC42CisjdWNvZGVfcG9ydF84LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC43CisjdWNvZGVfcG9ydF85LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC44CisjdWNvZGVfcG9ydF8xMC5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuOQorI3Vjb2RlX3BvcnRfMTEuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjEwCisjdWNvZGVfcG9ydF8xMi5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMTEKKyN1Y29kZV9wb3J0XzEzLkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4xMgorI3Vjb2RlX3BvcnRfMTQuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjEzCisjdWNvZGVfcG9ydF8xNS5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMTQKKyN1Y29kZV9wb3J0XzE2LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4xNQorI3Vjb2RlX3BvcnRfMTcuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjE2CisjdWNvZGVfcG9ydF8xOC5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMTcKKyN1Y29kZV9wb3J0XzE5LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4xOAorI3Vjb2RlX3BvcnRfMjAuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjE5CisjdWNvZGVfcG9ydF8yMS5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMjAKKyN1Y29kZV9wb3J0XzIyLkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4yMQorI3Vjb2RlX3BvcnRfMjMuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjIyCisjdWNvZGVfcG9ydF8yNC5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMjMKKyN1Y29kZV9wb3J0XzI1LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4yNAorCisjZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMS5CQ004ODIwMj0xCisjZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMi5CQ004ODIwMj0xCisjZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMy5CQ004ODIwMj0xCisjZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNC5CQ004ODIwMj0xCisjZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNS5CQ004ODIwMj0xCisjZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNi5CQ004ODIwMj0xCisjZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNy5CQ004ODIwMj0xCisjZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fOC5CQ004ODIwMj0xCisjZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fOS5CQ004ODIwMj0xCisjZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTAuQkNNODgyMDI9MQorCisjIyMgUHJpb3JpdHlPUG9ydAorI2RpYWdfY29zcV9kaXNhYmxlLkJDTTg4MjAyPTEKKyNzdGFja19lbmFibGUuQkNNODgyMDI9MAorI3Vjb2RlX3BvcnRfMTcuQkNNODgyMDI9SUdOT1JFCisjdWNvZGVfcG9ydF8xNi5CQ004ODIwMj1JR05PUkUKKyN1Y29kZV9wb3J0XzE1LkJDTTg4MjAyPUlHTk9SRQorI3Vjb2RlX3BvcnRfMTQuQkNNODgyMDI9SUdOT1JFCisjdWNvZGVfcG9ydF8xMy5CQ004ODIwMj1JR05PUkUKKyN1Y29kZV9wb3J0XzEuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjAKKworIyMgQ3JlZGl0IHdvcnRoIHJlc29sdXRpb24gKEZpeCB0aGUgSW50ZXJmYWNlIHJhdGUpCitjcmVkaXRfd29ydGhfcmVzb2x1dGlvbi5CQ004ODIwMj1tZWRpdW0KKworIyMjIEludGVycnVwdHMKK3BvbGxlZF9pcnFfbW9kZS5CQ004ODIwMj0xCisKKyMjIFRvIHVzZSBNQy1JRCBpbiB0aGUgcmFuZ2Ugb2YgPCAyNTUKK2VncmVzc19tdWx0aWNhc3RfZGlyZWN0X2JpdG1hcF9tYXguQkNNODgyMDI9MjU1CisKKyMjIyBGbG93IENvbnRyb2wKKyMjIEVuYWJsZSBGbG93IENvbnRyb2wgdG8gQ0wgU0NILiBSZWxldmFudCBvbmx5IHRvIFByaW9yaXR5IE92ZXIgUG9ydCBhcHBsaWNhdGlvbgorIyMgVmFsaWQgdmFsdWVzOiAxIC0gRW5hYmxlLCAwIC0gRGlzYWJsZS4gRGVmYXVsdDogMHgwLgorY3VzdG9tX2ZlYXR1cmVfY2xfc2NoZWR1bGVyX2ZjLkJDTTg4MjAyPTEKKworIyMgVmFsaWQgdmFsdWVzOiAxIC0gRW5hYmxlLCAwIC0gRGlzYWJsZS4gRGVmYXVsdDogMHgwLgorI2N1c3RvbV9mZWF0dXJlX2hpZ2hfdnNpX2ZwLkJDTTg4NjYwPTAKKworIyMgVXNlIGxvd2VyIENMLiBBcmRvbiBGQyBpcyBtYXBwZWQgdG8gQ0wgMC0yNTUuCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzY1LkJDTTg4MjAyPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNjYuQkNNODgyMDI9MQorCisjIyMgU3RhdGlzdGljLVJlcG9ydCBQcm9wZXJ0aWVzCitzdGF0X2lmX2VuYWJsZS5CQ004ODIwMj0xCitzdGF0X2lmX3JhdGUuQkNNODgyMDI9MTAwMDAKK3N0YXRfaWZfcGt0X3NpemUuQkNNODgyMDI9MTI2QgorIyMgU2V0IHRoZSBTdGF0aXN0aWMtUmVwb3J0IG1vZGUKK3N0YXRfaWZfcmVwb3J0X21vZGUuQkNNODgyMDI9UVNJWkUKKyMjIEVuYWJsZSBzdGF0aXN0aWNzIHJlcG9ydHMgb24gRW5RdWV1ZS4gVmFsaWQgdmFsdWVkOiAwLzEuIERlZmF1bHQ6ICcxJy4KK3N0YXRfaWZfcmVwb3J0X2VucXVldWVfZW5hYmxlLkJDTTg4MjAyPTEKKyMjIEVuYWJsZSBzdGF0aXN0aWNzIHJlcG9ydHMgb24gRGVRdWV1ZS4gVmFsaWQgdmFsdWVkOiAwLzEuIERlZmF1bHQ6ICcxJy4KK3N0YXRfaWZfcmVwb3J0X2RlcXVldWVfZW5hYmxlLkJDTTg4MjAyPTEKKworIyMgRGlzYWJsZSByZW1vdmVkIGZlYXR1cmVzCitwaHlfMTU4OF9kcGxsX2ZyZXF1ZW5jeV9sb2NrLkJDTTg4MjAyPTAKK2xvd19wb3dlcl9uaWZfbWFjLkJDTTg4MjAyPTAKK2xvd19wb3dlcl9mYWJyaWNfbWFjLkJDTTg4MjAyPTAKK2N1c3RvbV9mZWF0dXJlX25pZl9yZWNvdmVyeV9lbmFibGUuQkNNODgyMDI9MAorcGh5X251bGwuQkNNODgyMDI9MAorCisjIyBEaXNhYmxlIGNvdW50ZXIgdGhyZWFkCitiY21fc3RhdF9pbnRlcnZhbC5CQ004ODIwMj0wCisjYmNtX3N0YXRfc3luY190aW1lb3V0LkJDTTg4MjAyPTB4ZmZmZmZmZgorCisjIyMgRU1VTCBjaGFuZ2VzCisjZGlhZ19lbXVsYXRvcl9wYXJ0aWFsX2luaXQuQkNNODgyMDI9MQorI3NjaGFuX3RpbWVvdXRfdXNlYy5CQ004ODIwMj0weDdmZmZmZmZmCisjdGRtYV90aW1lb3V0X3VzZWMuQkNNODgyMDI9MHg3ZmZmZmZmZgorI3RzbGFtX3RpbWVvdXRfdXNlYy5CQ004ODIwMj0weDdmZmZmZmZmCisjcGh5X251bGwuQkNNODgyMDI9MAorCisjIyMgRGlzYWJsZSBETUEKKyN0ZG1hX3RpbWVvdXRfdXNlYy5CQ004ODIwMj0wCisjdHNsYW1fdGltZW91dF91c2VjLkJDTTg4MjAyPTAKKyN0YWJsZV9kbWFfZW5hYmxlLkJDTTg4MjAyPTAKKyN0c2xhbV9kbWFfZW5hYmxlLkJDTTg4MjAyPTAKKworIyMjIERyYW0gc2V0dXAKKyMgTnVtYmVyIG9mIGV4dGVybmFsIERSQU1zLgorIyBBbGxvd2VkIHZhbHVlcyBmb3IgODgyMDI6IDAgLyAxIChEcmFtIEQpIC8gMiAoRHJhbSdzIEMsIEQpIC8gMyAoRHJhbSdzIEIsIEMsIEQpIC8gNCAoRHJhbSdzIEEsIEIsIEMsIEQpIC8KK2V4dF9yYW1fcHJlc2VudC5CQ004ODIwMj0wCisKKyMjIyBUb3RhbCBzaXplIG9mIHJhbQorZXh0X3JhbV90b3RhbF9zaXplLkJDTTg4MjAyPTIwMDAKKworIyMjIE9DQgorYmNtODg2eHhfb2NiX2RhdGFidWZmZXJfc2l6ZS5CQ004ODIwMj0xMDI0CisKKyMgRFJBTSBmcmVxdWVuY3kgKERRLzIpCitleHRfcmFtX2ZyZXEuQkNNODgyMDI9MTIwMAorCisjIERyYW0gVHlwZS4gQXJkb24gc3VwcG9ydHMgb25seSBERFI0LgorZXh0X3JhbV90eXBlLkJDTTg4MjAyPUREUjQKKworIyMjIERyYW0gRmVhdHVyZXMKKworIyMgRHJhbSBHZWFyIGRvd24gbW9kZS4gVmFsaWQgdmFsdWVzOiAwIC0gRW5hYmxlLCAxIC0gRGlzYWJsZS4gRGVmYXVsdDogMHgwLgorI2V4dF9yYW1fZ2Vhcl9kb3duX21vZGUuQkNNODgyMDI9MQorCisjIyBBbGVydF9uIGRlLWFzc2VydGlvbiBwZXJpb2QgYWJvdmUgd2hpY2ggZXJyb3IgaXMgY29uc2lkZXJlZCBwYXJpdHkgZXJyb3IKKyNleHRfcmFtX2FsZXJ0X25fcGVyaW9kX3RocnMuQkNNODgyMDI9MAorCisjIyBEcmFtIEFkZHJlc3MgYnVzIGludmVyc2lvbi4gVmFsaWQgdmFsdWVzOiAwIC0gRW5hYmxlLCAxIC0gRGlzYWJsZS4gRGVmYXVsdDogMHgwLgorZXh0X3JhbV9hYmkuQkNNODgyMDI9MAorCisjIyBEYXRhIGJ1cyBpbnZlcnNpb24gb24gd3JpdGUvcmVhZCBkaXJlY3Rpb24uIFZhbGlkIHZhbHVlczogMCAtIERpc2FibGUsIDEgLSBFbmFibGUuIERlZmF1bHQ6IDB4MC4KK2V4dF9yYW1fd3JpdGVfZGJpLkJDTTg4MjAyPTAKK2V4dF9yYW1fcmVhZF9kYmkuQkNNODgyMDI9MAorCisjIyBFbmFibGUgd3JpdGUvcmVhZCBDUkMgKEREUjQgZG9lcyBub3Qgc3VwcG9ydCByZWFkIENSQykuIERlZmF1bHQ6IDB4MC4KKyNleHRfcmFtX3dyaXRlX2NyYz0uQkNNODgyMDIxCisjZXh0X3JhbV9yZWFkX2NyYz0uQkNNODgyMDIxCisKKyMjIENvbW1hbmQgcGFyaXR5IGxhdGVuY3kuIFZhbGlkIHZhbHVlczogMCAtIEVuYWJsZSwgMSAtIERpc2FibGUuIERlZmF1bHQ6IDB4MC4KK2V4dF9yYW1fY21kX3Bhcl9sYXRlbmN5LkJDTTg4MjAyPTYKKworIyMgRFJBTSBDbGFtU2hlbGwgKGludGVyZmFjZSBzd2FwIGl0cyBIVyBQSU4gcGFpcnMgZHVyaW5nIGluaXQuKQorIyBOb3RlOiBPbmx5IG9uZSBvZiBEUkFNcyBjYW4gaGF2ZSBpdHMgUElOIHN3YXBwZWQpLiBWYWxpZCB2YWx1ZXM6IDAvMS4KK2RyYW0xX2NsYW1zaGVsbF9lbmFibGVfMC5CQ004ODIwMj0xCitkcmFtMV9jbGFtc2hlbGxfZW5hYmxlXzEuQkNNODgyMDI9MQorZHJhbTFfY2xhbXNoZWxsX2VuYWJsZV8yLkJDTTg4MjAyPTEKK2RyYW0xX2NsYW1zaGVsbF9lbmFibGVfMy5CQ004ODIwMj0xCisKKyMjIERyYW0gRFEgU3dhcC4KKyMjIEZvcm1hdDogZXh0X3JhbV9kcV9zd2FwX2RyYW1YX2J5dGVZX2JpdFo9TS4gTWVhbnMsIEluIGRyYW0gWCwgQnl0ZSBZIHN3YXAgRFEgWiBhbmQgTS4gRGVmYXVsdDogTm8gc3dhcHBpbmcuCisjZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUyX2JpdDMuQkNNODgyMDI9NAorI2V4dF9yYW1fZHFfc3dhcF9kcmFtNF9ieXRlM19iaXQyLkJDTTg4MjAyPTEKKworIyMjIERyYW0gVHVuaW5nIChTaG1vbykKK2RkcjNfYXV0b190dW5lLkJDTTg4MjAyPTIKKworIyMjIEVuYWJsZSBCSVNUCisjIFJ1biBEcmFtIEJJU1Qgb24gaW5pdGlhbGl6YXRpb24sIGlmIEJJU1QgZmFpbCB0aGUgaW5pdGlhbGl6YXRpb24gd2lsbCBmYWlsLiBEZWZhdWx0OiAxLgorYmlzdF9lbmFibGVfZHJhbS5CQ004ODIwMj0xCisKKyMjIyBGYWJyaWMKKyMjIEVuYWJsZSBmYWJyaWMgbGlua3MKK3NlcmRlc19xcnR0X2FjdGl2ZV8wLkJDTTg4MjAyPTEKK3NlcmRlc19xcnR0X2FjdGl2ZV8xLkJDTTg4MjAyPTEKK3NlcmRlc19xcnR0X2FjdGl2ZV8yLkJDTTg4MjAyPTEKK3NlcmRlc19xcnR0X2FjdGl2ZV8zLkJDTTg4MjAyPTEKKworIyMgRmlybXdhcmUgTG9hZCBNZXRob2QKK2xvYWRfZmlybXdhcmUuQkNNODgyMDI9MgorCisjU0ZJIHNwZWVkIHJhdGUKK3BvcnRfaW5pdF9zcGVlZF9zZmkuQkNNODgyMDI9MTE1MDAKKworI0xDIFBMTCBpbi4gRGVmYXVsdDogMTU2LjI1TUh6LgorI3hneHNfbGNwbGxfeHRhbF9yZWZjbGs9MTI1CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjI2NmZyBmb3IgQkNNODg2NDBfQTAgLSBQZXRyYQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZm9yY2VfY2xrX21fbl9kaXZpc29yc196ZXJvX25pZjAuQkNNODg2NDBfQTA9MAorZm9yY2VfY2xrX21fbl9kaXZpc29yc196ZXJvX2ZhYnJpYzAuQkNNODg2NDBfQTA9MQorZm9yY2VfY2xrX21fbl9kaXZpc29yc196ZXJvX2NvbWIwLkJDTTg4NjQwX0EwPTAKKworY29tYm9fcmVmX2Nsb2NrLkJDTTg4NjQwPTMxMjUwMAorCituaWZfcmVmX2Nsb2NrLkJDTTg4NjQwX0EwPTMxMjUwMAorCisjIFVzZSB2YXJpYWJsZSBjZWxsIHNpemUKK3N5c3RlbV9jZWxsX2Zvcm1hdC5CQ004ODY0MF9BMD1WQ1MxMjgKKworIyBDb3JlIGNsb2NrIHNwZWVkIChNSHopCitjb3JlX2Nsb2NrX3NwZWVkLkJDTTg4NjQwX0EwPTMwMAorCisjIE1hcCBiY20gbG9jYWwgcG9ydCB0byBDUFUvTklGIGludGVyZmFjZXMKK3Vjb2RlX3BvcnRfMC5CQ004ODY0MF9BMD1DUFUuMAordWNvZGVfcG9ydF83My5CQ004ODY0MF9BMD1DUFUuMQordWNvZGVfcG9ydF83NC5CQ004ODY0MF9BMD1DUFUuMgordWNvZGVfcG9ydF83NS5CQ004ODY0MF9BMD1DUFUuMwordWNvZGVfcG9ydF83Ni5CQ004ODY0MF9BMD1DUFUuNAordWNvZGVfcG9ydF83Ny5CQ004ODY0MF9BMD1DUFUuNQordWNvZGVfcG9ydF83OC5CQ004ODY0MF9BMD1DUFUuNgorCisjIEludGVybGFrZW4gcG9ydHMgYmFzaWMgY29uZmlndXJhdGlvbiAodGVtcG9yYXJ5KS4KKyMgVGhpcyBjb25maWd1cmF0aW9uIHJlcGxhY2VzIHRoZSBhYm92ZSBYQVVJL1JYQVVJIHBvcnRzIGNvbmZpZworIyBUaGUgZm9sbG93aW5nIFBCIGRlc2lnbiBjb25zdHJhaW50IGlzIG5vdCBlbmZvcmNlZCBpbiBTVywgc28gbXVzdCBiZSB0YWtlbgorIyBjYXJlIG9mIGhlcmUsIHdoZW4gbWFwcGluZyBwb3J0cyB0byBpbnRlcmZhY2VzOgorIyAgIElmIHVzaW5nIGlsa24wLCBwb3J0IDEgKGlmIHVzZWQpIG11c3QgYmUgbWFwcGVkIHRvIGlsa24wCisjICAgSWYgdXNpbmcgaWxrbjEsIHBvcnQgMiAoaWYgdXNlZCkgbXVzdCBiZSBtYXBwZWQgdG8gaWxrbjEKKyMgICBOb3RlIHRoYXQgaW4gb3VyIGRlZmF1bHQgbWFwcGluZywgcG9ydCAyIGlzIG1hcHBlZCB0byBSWEFVSSA2LCB0aHVzIHdvbid0CisjICAgd29yay4gSWYgb25lIHdhbnRzIHRvIHVzZSBmcm9udCBwYW5lbCBwb3J0IDIgd2l0aCBpbGtuMSwgaGUgc2hvdWxkIGJlIG1hcAorIyAgIFJBWFVJNiB0byBhIHBvcnQgIT0gMi4KKyNpbGtuX251bV9sYW5lc18wLkJDTTg4NjQwX0EwPTEyCisjdWNvZGVfcG9ydF8xLkJDTTg4NjQwX0EwPUlMS04wLjAKKyN1Y29kZV9wb3J0XzIuQkNNODg2NDBfQTA9SUxLTjAuMQorI3Vjb2RlX3BvcnRfMy5CQ004ODY0MF9BMD1JTEtOMC4yCisjaWxrbl9udW1fbGFuZXNfMS5CQ004ODY0MF9BMD0xMgorI3Vjb2RlX3BvcnRfNC5CQ004ODY0MF9BMD1SWEFVSTYKKyN1Y29kZV9wb3J0XzUuQkNNODg2NDBfQTA9SUxLTjEuMAorI3Vjb2RlX3BvcnRfNi5CQ004ODY0MF9BMD1JTEtOMS4xCisjdWNvZGVfcG9ydF83LkJDTTg4NjQwX0EwPUlMS04xLjIKKworIyBEZWZhdWx0IGhlYWRlciB0eXBlIGlzIGRlcml2ZWQgZnJvbSBmYXBfZGV2aWNlX21vZGU6IElmIGZhcF9kZXZpY2VfbW9kZSBpcworIyBQUCwgZGVmYXVsdCBoZWFkZXIgdHlwZSBpcyBFVEguIE90aGVyd2lzZSwgZGVmdWFsdCBoZWFkZXIgdHlwZSBpcyBUTS4KKyMgSGVhZGVyIHR5cGUgcGVyIHBvcnQgY2FuIGJlIG92ZXJyaWRlbi4KKyMgQWxsIG9wdGlvbnM6IEVUSC9SQVcvVE0vUFJPRy9DUFUvU1RBQ0tJTkcvVERNL1RETV9SQVcvSU5KRUNURUQKKworIyBTZXQgQ1BVIHRvIHdvcmsgd2l0aCBUTSBoZWFkZXIgKElUTUgpCisjdG1fcG9ydF9oZWFkZXJfdHlwZV8wLkJDTTg4NjQwX0EwPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzAuQkNNODg2NDBfQTA9VE0KK3RtX3BvcnRfaGVhZGVyX3R5cGVfb3V0XzAuQkNNODg2NDBfQTA9Q1BVCit0bV9wb3J0X2hlYWRlcl90eXBlXzczLkJDTTg4NjQwX0EwPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlXzc0LkJDTTg4NjQwX0EwPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlXzc1LkJDTTg4NjQwX0EwPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlXzc2LkJDTTg4NjQwX0EwPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlXzc3LkJDTTg4NjQwX0EwPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlXzc4LkJDTTg4NjQwX0EwPVRNCisjIHJlY3ljbGluZyBwb3J0Cit0bV9wb3J0X2hlYWRlcl90eXBlXzQwLkJDTTg4NjQwX0EwPVJBVwordWNvZGVfcG9ydF80MC5CQ004ODY0MF9BMD1SQ1kuMAorCisjIEVuYWJsZSBFUlAgYW5kIE9MUCBwb3J0cworbnVtX2VycF90bV9wb3J0cy5CQ004ODY0MF9BMD0xCitudW1fb2xwX3RtX3BvcnRzLkJDTTg4NjQwX0EwPTEKK251bV9yZWN5Y2xlX3RtX3BvcnRzLkJDTTg4NjQwX0EwPTEKKworIyBEcmFtIGNvbmZpZ3VyYXRpb24KKyMgNjAwIE1oegorZXh0X3JhbV9wbGxfci5CQ004ODY0MF9BMD00CitleHRfcmFtX3BsbF9mLkJDTTg4NjQwX0EwPTQ3CitleHRfcmFtX3BsbF9xLkJDTTg4NjQwX0EwPTEKK2V4dF9yYW1fZnJlcS5CQ004ODY0MF9BMD02MDAKKworIyBEYnVmZiBzaXplCisjIEFsbG93ZWQgdmFsdWVzOiAyNTYvNTEyLzEwMjQvMjA0OC4KK2V4dF9yYW1fZGJ1ZmZfc2l6ZS5CQ004ODY0MF9BMD0xMDI0CisKKyMgTnVtYmVyIG9mIGV4dGVybmFsIERSQU1zLgorIyBBbGxvd2VkIHZhbHVlcyBmb3IgODh4NHg6IDAvMi8zLzQvNi4KKyMgQWxsb3dlZCB2YWx1ZXMgZm9yIDg4NjUwOiAwLzIvMy80LzYvOC4KKyMgZXh0X3JhbV90b3RhbF9zaXplIGJlbG93IGFzc3VtZWQgdGhpcyB2YWx1ZSBpcyA2IGZvciA4OHg0eCBhbmQgOCBmb3IKK2V4dF9yYW1fcHJlc2VudC5CQ004ODY0MF9BMD02CisKKyMgRHJhbSB0eXBlOiBTZWxlY3QgT05MWSBPTkUgb2YgdGhlIGZvbGxvd2luZyBEUkFNIHR5cGVzLCB0byBjb25maWd1cmUgYWxsIGRyYW0KKyMgcmVsYXRlZCBwYXJhbWV0ZXJlcyBwZXIgdHlwZS4KKyMgRHJhbSBUeXBlIGZvciBQYjoKKyNkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUo2NE0xNl8xNUUuQkNNODg2NDBfQTA9MQorI2RyYW1fdHlwZV9ERFIyX01JQ1JPTl9LNFQ1MTE2M1FFX1pDX0xGNy5CQ004ODY0MF9BMD0xCisjZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZFX0hDSzBfMTMzMy5CQ004ODY0MF9BMD0xCisjZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZFX0hDSzBfMTYwMC5CQ004ODY0MF9BMD0xCisjZHJhbV90eXBlX0dERFIzX1NBTVNVTkdfSzRKNTIzMjRRRS5CQ004ODY0MF9BMD0xCitkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoxMjhNMTZIQV8xNUVfMkcuQkNNODg2NDBfQTA9MQorCisjIFFEUiBjb25maWd1cmF0aW9uCisjIFBhcml0eS4gQWxsb3dlZCB2YWx1ZXM6IFBBUklUWS9FQ0MuCitleHRfcWRyX3Byb3RlY3Rpb25fdHlwZS5CQ004ODY0MF9BMD1QQVJJVFkKK2V4dF9xZHJfc2l6ZV9tYml0LkJDTTg4NjQwX0EwPTcyCisjUURSIHR5cGU6IFFEUi9RRFIyUC9RRFIzL05PTkUuCitleHRfcWRyX3R5cGUuQkNNODg2NDBfQTA9UURSCisKKyMgUURSIGNhbiB1c2UgdGhlIGNvcmUgY2xvY2ssIG9yIHVzaW5nIGl0J3Mgb3duIHBsbC4gQ3VycmVudCBleGFtcGxlIGlzIGZvciAyNTBNSHogcGxsIChpZiB1c2VkKS4KKyMgUURSIHVzaW5nIG93biBwbGwgY29uZmlndXJhdGlvbgorI2V4dF9xZHJfdXNlX2NvcmVfY2xvY2tfZnJlcS5CQ004ODY0MF9BMD0wCisjZXh0X3Fkcl9wbGxfbS5CQ004ODY0MF9BMD00CisjZXh0X3Fkcl9wbGxfbi5CQ004ODY0MF9BMD00CisjZXh0X3Fkcl9wbGxfcC5CQ004ODY0MF9BMD0wCisKKyMgUURSIHVzaW5nIGNvcmUgY2xvY2sKK2V4dF9xZHJfdXNlX2NvcmVfY2xvY2tfZnJlcS5CQ004ODY0MF9BMD0xCisKKyNDb25maWd1cmUgTURJTy4gSWYgcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkLCBNRElPIGlzIGRpc2FibGVkLgorbWRpb19jbG9ja19mcmVxX2toei5CQ004ODY0MF9BMD0xMDAwCisKKyMgU3RyZWFtaW5nIGludGVyZmFjZSBjb25maWd1cmF0aW9uCitzdHJlYW1pbmdfaWZfZW5hYmxlX3RpbWVvdXRjbnQuQkNNODg2NDBfQTA9MQorc3RyZWFtaW5nX2lmX3RpbWVvdXRfcHJkLkJDTTg4NjQwX0EwPTcwCitzdHJlYW1pbmdfaWZfcXVpZXRfbW9kZS5CQ004ODY0MF9BMD0wCitzdHJlYW1pbmdfaWZfZGlzY2FyZF9iYWRfcGFyaXR5LkJDTTg4NjQwX0EwPTAKKworIyBtYXhpbXVtIHBhY2tldCBzaXplIGZvciBXUkVEIHRlc3RzLiAwIC0gbWVhbnMgaWdub3JlIG1heCBwYWNrZXQgc2l6ZS4KK2Rpc2NhcmRfbXR1X3NpemUuQkNNODg2NDBfQTA9MAorCisjIG11bHRpY2FzdCBlZ3Jlc3MgdmxhbiBtZW1iZXJzaGlwIHJhbmdlLiBCeSBkZWZhdWx0OiAwLTQwOTUuCitlZ3Jlc3NfbXVsdGljYXN0X2RpcmVjdF9iaXRtYXBfbWF4LkJDTTg4NjQwX0EwPTQwOTUKKworIyBjb25maWd1cmUgZmxvdyBtYXBwaW5nIGJhc2UgdG8gMAorZmxvd19tYXBwaW5nX3F1ZXVlX2Jhc2UuQkNNODg2NDBfQTA9MAorCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzI1LkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMjYuQkNNODg2NDBfQTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8yNy5CQ004ODY0MF9BMD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzI4LkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMjkuQkNNODg2NDBfQTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zMC5CQ004ODY0MF9BMD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzMxLkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzIuQkNNODg2NDBfQTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zMy5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM0LkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzUuQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zNi5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM3LkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzguQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zOS5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQwLkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDEuQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80Mi5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQzLkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDQuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80NS5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQ2LkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDcuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80OC5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQ5LkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNTAuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl81MS5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzUyLkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNTMuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl81NC5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzU1LkJDTTg4NjQwX0EwPTIKKworIyBQb3dlciB1cCBzdGF0ZSAoRE9XTi9VUC9VUF9BTkRfUkVMT0NLKS4gQ2FuIGJlIGNvbmZpZ3VyZWQgcGVyIGxhbmUuCitwYl9zZXJkZXNfbGFuZV9wb3dlcl9zdGF0ZS5CQ004ODY0MF9BMD1VUF9BTkRfUkVMT0NLCisKKyMgU2VEZXMgbWVkaWEgdHlwZTogUHJlLWNvbmZpZ3VyYXRpb24gZm9yIHR4IHBhcmFtcywgYWNjb3JkaW5nIHRvCisjIG1lZGlhIHR5cGUuCisjIEFsbG93ZWQgdmFsdWVzOiBTSE9SVF9CQUNLUExBTkUvTE9OR19CQUNLUExBTkUvQ0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGUuQkNNODg2NDBfQTA9U0hPUlRfQkFDS1BMQU5FCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMjguQkNNODg2NDBfQTA9Q0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMjkuQkNNODg2NDBfQTA9Q0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMzAuQkNNODg2NDBfQTA9Q0hJUDJDSElQCitwYl9zZXJkZXNfbGFuZV90eF9waHlzX21lZGlhX3R5cGVfMzEuQkNNODg2NDBfQTA9Q0hJUDJDSElQCisKK3N5c3RlbV9pc19mZTE2MDBfaW5fc3lzdGVtLkJDTTg4NjQwX0EwPTAKKworIyBDb3VudGVyIGVuZ2luZSBjb25maWd1cmF0aW9uCitjb3VudGVyX2VuZ2luZV9zb3VyY2VfMS5CQ004ODY0MF9BMD0wCitjb3VudGVyX2VuZ2luZV9zdGF0aXN0aWNzXzEuQkNNODg2NDBfQTA9NAorY291bnRlcl9lbmdpbmVfc291cmNlXzIuQkNNODg2NDBfQTA9MQorY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18yLkJDTTg4NjQwX0EwPTQKKworIyBTdGF0aXN0aWMgUmVwb3J0aW5nCitzdGF0X2lmX2VuYWJsZT0wCisKKyMgQ2xvY2sgUGhhc2VzOiAwLzkwLzE4MC8yNzAKK3N0YXRfaWZfcGhhc2U9MAorCisjIFJhdGUgaW4gbm0KK3N0YXRfaWZfc3luY19yYXRlPTAKKworIyBUUlVFL0ZBTFNFCitzdGF0X2lmX3Bhcml0eV9lbmFibGU9RkFMU0UKKworIyBCSUxMSU5HL0ZBUDIwVgorc3RhdF9pZl9yZXBvcnRfbW9kZT1CSUxMSU5HCisKKyMgQmlsbGluZyBNb2RlCisjIEVHUl9RX05CL0NVRC9WU0lfVkxBTi9CT1RIX0xJRlMKK3N0YXRfaWZfcmVwb3J0X2JpbGxpbmdfbW9kZT1WU0lfVkxBTgorCisjIEZhcDIwViBNb2RlCisjIFFVRVVFL1BBQ0tFVAorc3RhdF9pZl9yZXBvcnRfZmFwMjB2X21vZGU9UVVFVUUKKworIyBRVUVVRV9OVU0vTUNfSUQgKG9ubHkgdmFsaWQgaW4gRmFwMjBWIFBBQ0tFVCBtb2RlKQorc3RhdF9pZl9yZXBvcnRfZmFwMjB2X2ZhYnJpY19tYz1RVUVVRV9OVU0KK3N0YXRfaWZfcmVwb3J0X2ZhcDIwdl9pbmdfbWM9UVVFVUVfTlVNCisKKyMgVFJVRS9GQUxTRSAob25seSB2YWxpZCBpbiBGYXAyMFYgUEFDS0VUIG1vZGUpCitzdGF0X2lmX3JlcG9ydF9mYXAyMHZfY25tX3JlcG9ydD1GQUxTRQorCisjIFRSVUUvRkFMU0UKK3N0YXRfaWZfcmVwb3J0X2ZhcDIwdl9jb3VudF9zbm9vcD1GQUxTRQorc3RhdF9pZl9yZXBvcnRfb3JpZ2luYWxfcGt0X3NpemU9RkFMU0UKK3N0YXRfaWZfcmVwb3J0X2ZhcDIwdl9zaW5nbGVfY29weV9yZXBvcnRlZD1GQUxTRQorCitzY2hhbl90aW1lb3V0X3VzZWMuQkNNODg2NDBfQTA9MzAwMDAwCisKKworcG9sbGVkX2lycV9tb2RlLkJDTTg4NjQwX0EwPTAKK3BvbGxlZF9pcnFfZGVsYXkuQkNNODg2NDBfQTA9MTAwMAorCisjIFNldCB0aGUgRlRNSCBMb2FkLUJhbGFuY2luZyBLZXkgZXh0ZW5zaW9uIG1vZGUKKyMgT3B0aW9ucyBmb3IgODg2NTA6IEVOQUJMRUQKKyMgT3B0aW9ucyBmb3IgODg2NDAgY29tcGF0aWJsZToKKyMgRElTQUJMRUQgLyA4Ql9MQl9LRVlfOEJfU1RBQ0tJTkdfUk9VVEVfSElTVE9SWSAvIDE2Ql9TVEFDS0lOR19ST1VURV9ISVNUT1JZCisjIERlZmF1bHQ6IERJU0FCTEVECitzeXN0ZW1fZnRtaF9sb2FkX2JhbGFuY2luZ19leHRfbW9kZS5CQ004ODY0MD1ESVNBQkxFRAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyNjZmcgZm9yIEJDTTg4NzUwIChGRTE2MDApCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmYWJyaWNfZGV2aWNlX21vZGUuQkNNODg3NTA9U0lOR0xFX1NUQUdFX0ZFMgorCitpc19kdWFsX21vZGUuQkNNODg3NTA9MAorc3lzdGVtX2lzX3Zjc18xMjhfaW5fc3lzdGVtLkJDTTg4NzUwPTAKKworc3lzdGVtX2lzX2R1YWxfbW9kZV9pbl9zeXN0ZW0uQkNNODg3NTA9MAorc3lzdGVtX2lzX3NpbmdsZV9tb2RlX2luX3N5c3RlbS5CQ004ODc1MD0xCisKK3N5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0uQkNNODg3NTA9MAorCitzeXN0ZW1fcmVmX2NvcmVfY2xvY2tfa2h6LkJDTTg4NzUwPTEyMDAwMDAKKworZmFicmljX21lcmdlX2NlbGxzLkJDTTg4NzUwPTAKK2ZhYnJpY19tdWx0aWNhc3RfbW9kZS5CQ004ODc1MD1ESVJFQ1QKK2ZhYnJpY19sb2FkX2JhbGFuY2luZ19tb2RlLkJDTTg4NzUwPU5PUk1BTF9MT0FEX0JBTEFOQ0UKK2ZhYnJpY190ZG1fZnJhZ21lbnQuQkNNODg3NTA9MHgxODAKKyMjQWxsb3dzIHNpbmdsZSBwaXBlIGRldmljZSB0byBzZW5kIFRETSB0cmFmZmljIG92ZXIgdGhlIGZhYnJpYyBwcmltYXJ5IHBpcGUgLSBhdmFpbGFibGUgZm9yIEZlMTYwMF9CMCBvbmx5CisjY2hhbmdlICB2Y3MxMjhfdW5pY2FzdF9wcmlvcml0eSB0byBiZSBsb3dlciB0aGFuIDIgLSB3aGVuIGVuYWJsaW5nCitmYWJyaWNfdGRtX292ZXJfcHJpbWFyeV9waXBlLkJDTTg4NzUwPTAKK2ZhYnJpY19vcHRpbWl6ZV9wYXJ0aWFsX2xpbmtzLkJDTTg4NzUwPTAKK3ZjczEyOF91bmljYXN0X3ByaW9yaXR5LkJDTTg4NzUwPTIKKworcG9sbGVkX2lycV9tb2RlLkJDTTg4NzUwPTAKK3BvbGxlZF9pcnFfZGVsYXkuQkNNODg3NTA9MTAwMAorCisjU2VsZWN0cyBpZiB0byBydW4gTUJJU1QgKE1lbW9yeSBCdWlsdCBJbiBTZWxmIFRlc3QpIG9mIGludGVybmFsIG1lbW9yeSAodGFibGVzKSBkdXJpbmcgc3RhcnR1cC4KKyNTdXBwb3J0ZWQgdmFsdWVzOiAwPWRvbid0IHJ1biwgMT1ydW4sIDI9cnVuIHdpdGggZXh0cmEgbG9ncworI2Jpc3RfZW5hYmxlLkJDTTg4NjUwPTEKK2Jpc3RfZW5hYmxlLkJDTTg4NzUwPTEKK2Jpc3RfZW5hYmxlLkJDTTg4NDcwPTAKKyNIaWdoIHZvbHRhZ2UgZHJpdmVyIHN0cmFwLiBJZiAwLCBjb25uZWN0ZWQgdG8gMS40ViBzdXBwbHk7IGlmIDEsIGNvbm5lY3RlZCB0byAxViBtb2RlLgorI2ZvciBzcGVjaWZpYyBxdWFkIHVzZSBzcmRfdHhfZHJ2X2h2X2Rpc2FibGVfcXVhZF9YIHdoZXJlIFggaXMgKEZTUkQgbnVtICogNCArIGludGVybmFsIHF1YWQpCitzcmRfdHhfZHJ2X2h2X2Rpc2FibGUuQkNNODg3NTA9MAorbG9hZF9maXJtd2FyZS5CQ004ODc1MD0yCisKKyMwLUxGRUMgMS04YlwxMGIgMi1GRUMgMy1CRUMKK2JhY2twbGFuZV9zZXJkZXNfZW5jb2RpbmcuQkNNODg3NTA9MgorCisjZW5hYmxlXGRpc2FibGUgQ0w3MgorcG9ydF9pbml0X2NsNzIuQkNNODg3NTA9MQorI0F2YWxpYWJsZSBzcGVlZHMgZm9yIEJDTTg4NzUwOiA1NzUwLCA2MjUwLCAxMDMxMiwgMTE1MDAsIDEyNTAwCitwb3J0X2luaXRfc3BlZWQuQkNNODg3NTA9MTAzMTIKKyNMQyBQTEwgaW5cb3V0IDA9MTI1TUh6IDE9MTU2LjI1TUh6CitzZXJkZXNfZmFicmljX2Nsa19mcmVxX2luLkJDTTg4NzUwPTEKK3NlcmRlc19mYWJyaWNfY2xrX2ZyZXFfb3V0LkJDTTg4NzUwPTEKK3NlcmRlc19taXhlZF9yYXRlX2VuYWJsZS5CQ004ODc1MF9CMD0wCisKKyMgVlNDMTI4IG9yIFZTQzI1NgorZmFicmljX2NlbGxfZm9ybWF0LkJDTTg4NzUwPVZTQzI1NgorCisjIENvcmUgY2xvY2sgc3BlZWQgKE1IeikKK2NvcmVfY2xvY2tfc3BlZWRfa2h6LkJDTTg4NzUwPTUzMzMzMworCisjIyBDTUlDIGludGVycnVwdHM6CisjIEVuYWJsZTogVXNlIGludGVycnVwdHMgY29tcGxldGlvbiBpbnN0ZWFkIG9mIHBvbGxpbmcgY29tcGxldGlvbiBmb3IgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zLgorIyAgICAgICAgIE9wdGlvbnM6IDEgLSBFbmFibGUsIDAgLSBEaXNhYmxlLiBEZWZhdWx0OiAwLgorIyBUaW1lb3V0OiBkZWxheSBpbiBNaWNyb3NlY29uZCBiZXR3ZWVuIHRoZSBwb2xsaW5nLAorIyBTQ0hBTjoKK3NjaGFuX2ludHJfZW5hYmxlLkJDTTg4NzUwPTAKK3NjaGFuX3RpbWVvdXRfdXNlYy5CQ004ODc1MD0zMDAwMDAKKyMgVERNQQordGRtYV9pbnRyX2VuYWJsZS5CQ004ODc1MD0wCit0ZG1hX3RpbWVvdXRfdXNlYy5CQ004ODc1MD01MDAwMDAwCisjIFRTTEFNCit0c2xhbV9pbnRyX2VuYWJsZS5CQ004ODc1MD0wCit0c2xhbV90aW1lb3V0X3VzZWMuQkNNODg3NTA9NTAwMDAwMAorIyBNSUlNCittaWltX2ludHJfZW5hYmxlLkJDTTg4NzUwPTAKK21paW1fdGltZW91dF91c2VjLkJDTTg4NzUwPTMwMDAwMAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyNjZmcgZm9yIEJDTTg4OTUwIChGRTMyMDApCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI0RldmljZSAgb3BlcmF0aW9uCitmYWJyaWNfZGV2aWNlX21vZGUuQkNNODg5NTA9U0lOR0xFX1NUQUdFX0ZFMgorZmFicmljX2xvYWRfYmFsYW5jaW5nX21vZGUuQkNNODg5NTA9Tk9STUFMX0xPQURfQkFMQU5DRQorCisjQ2VsbCBmb3JtYXQKK3N5c3RlbV9pc192Y3NfMTI4X2luX3N5c3RlbS5CQ004ODk1MD0wCisKKyNGYWJyaWMgcGlwZSBjb25maWd1cmF0aW9uCisKK2ZhYnJpY19udW1fcGlwZXMuQkNNODg5NTA9MQorZmFicmljX3BpcGVfbWFwLkJDTTg4OTUwPTAKK3N5c3RlbV9jb250YWluc19tdWx0aXBsZV9waXBlX2RldmljZS5CQ004ODk1MD0wCisKKyNtdWx0aWNhc3QgdGFibGUgbW9kZQorZmFicmljX211bHRpY2FzdF9tb2RlLkJDTTg4OTUwPURJUkVDVAorZmVfbWNfaWRfcmFuZ2UuQkNNODg5NTA9MTI4S19IQUxGCisKKyNDb3JlIGNsb2NrIGFuZCBzeXN0ZW0gcmVmZXJlbmNlIGNsb2NrIChLSHopCitzeXN0ZW1fcmVmX2NvcmVfY2xvY2tfa2h6LkJDTTg4OTUwPTEyMDAwMDAKK2NvcmVfY2xvY2tfc3BlZWRfa2h6LkJDTTg4OTUwPTcyMDAwMAorCisjTEMgUExMIGluXG91dCAwPTEyNU1IeiAxPTE1Ni4yNU1Iegorc2VyZGVzX2ZhYnJpY19jbGtfZnJlcV9pbi5CQ004ODk1MD0wCitzZXJkZXNfZmFicmljX2Nsa19mcmVxX291dC5CQ004ODk1MD0xCisKKyNUT0RPCitwb2xsZWRfaXJxX21vZGUuQkNNODg5NTA9MQorcG9sbGVkX2lycV9kZWxheS5CQ004ODk1MD0xMDAwCisKKyNNZW1vcnkgQmlzdAorYmlzdF9lbmFibGUuQkNNODg5NTA9MAorCisjSGlnaCB2b2x0YWdlIGRyaXZlciBzdHJhcC4gSWYgMCwgY29ubmVjdGVkIHRvIDEuMjVWIHN1cHBseTsgCisjaWYgMSwgY29ubmVjdGVkIHRvIDFWIG1vZGUgKEZvciB1bnVzZWQgRmFsY29uIFF1YWRzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byAxLjBWKS4KKyNmb3Igc3BlY2lmaWMgcXVhZCB1c2Ugc3JkX3R4X2Rydl9odl9kaXNhYmxlX3F1YWRfWCB3aGVyZSBYIGlzIChGU1JEIG51bSAqIDQgKyBpbnRlcm5hbCBxdWFkKQorc3JkX3R4X2Rydl9odl9kaXNhYmxlLkJDTTg4OTUwPTAKK2xvYWRfZmlybXdhcmUuQkNNODg5NTA9MHgxMDIKKworCisjI1BlciBwb3J0IHByb3BlcnRpZXMKKyNQb3NzaWJsZSB2YWx1ZXMgLSBLUl9GRUMsIDY0XzY2LCBSU19GRUMsIExMX1JTX0ZFQworYmFja3BsYW5lX3NlcmRlc19lbmNvZGluZy5CQ004ODk1MD1SU19GRUMKKworI2VuYWJsZVxkaXNhYmxlIENMNzIKK3BvcnRfaW5pdF9jbDcyLkJDTTg4OTUwPTEKKworI2xpbmsgc3BlZWQKK3BvcnRfaW5pdF9zcGVlZC5CQ004ODk1MD0yNTAwMAorCisjTGluayBjb25uZWN0ZWQgdG8gYSByZWFwdGVyCisjVmFsdWVzOiAwLzEuIERlZmF1bHQ6IDAKKyNyZXBlYXRlcl9saW5rX2VuYWJsZV88cG9ydD4uQkNNODg5NTA9MAorCisjI0ZhYnJpYyBjZWxsIEZJRk8gRE1BCitmYWJyaWNfY2VsbF9maWZvX2RtYV9lbmFibGUuQkNNODg5NTA9MQorCisjIyBDTUlDIGludGVycnVwdHM6CisjIEVuYWJsZTogVXNlIGludGVycnVwdHMgY29tcGxldGlvbiBpbnN0ZWFkIG9mIHBvbGxpbmcgY29tcGxldGlvbiBmb3IgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zLgorIyAgICAgICAgIE9wdGlvbnM6IDEgLSBFbmFibGUsIDAgLSBEaXNhYmxlLiBEZWZhdWx0OiAwLgorIyBUaW1lb3V0OiBkZWxheSBpbiBNaWNyb3NlY29uZCBiZXR3ZWVuIHRoZSBwb2xsaW5nLAorIyBTQ0hBTjoKK3NjaGFuX2ludHJfZW5hYmxlLkJDTTg4OTUwPTAKK3NjaGFuX3RpbWVvdXRfdXNlYy5CQ004ODk1MD0zMDAwMDAKKyMgVERNQQordGRtYV9pbnRyX2VuYWJsZS5CQ004ODk1MD0wCit0ZG1hX3RpbWVvdXRfdXNlYy5CQ004ODk1MD01MDAwMDAwCisjIFRTTEFNCit0c2xhbV9pbnRyX2VuYWJsZS5CQ004ODk1MD0wCit0c2xhbV90aW1lb3V0X3VzZWMuQkNNODg5NTA9NTAwMDAwMAorIyBNSUlNCittaWltX2ludHJfZW5hYmxlLkJDTTg4OTUwPTAKK21paW1fdGltZW91dF91c2VjLkJDTTg4OTUwPTMwMDAwMAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29uZmlndXJhdGlvbiBmb3IgZGV2aWNlcyBydW4gaW4gZW11bGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNkaWFnX2VtdWxhdG9yX3BhcnRpYWxfaW5pdC5CQ004ODQ3MD0yCisjcGh5X3NpbXVsLkJDTTg4NDcwPTEKKyNzeXN0ZW1fcmVmX2NvcmVfY2xvY2tfa2h6LkJDTTg4NDcwPTI1MDAwMAorI3N5c3RlbV9yZWZfY29yZV9jbG9ja19raHouQkNNODg0NzA9NjAwMDAwCisjcGh5X3NpbXVsLkJDTTg4MjcwPTEKKworcG9sbGVkX2lycV9tb2RlLkJDTTg4NDcwPTEKK3BvbGxlZF9pcnFfbW9kZS5CQ004ODI3MD0xCisKK3NjaGFuX2ludHJfZW5hYmxlLkJDTTg4NDcwPTAKK3NjaGFuX2ludHJfZW5hYmxlLkJDTTg4MjcwPTAKKworIyBGb3IgZW11bGF0aW9uIHVzZToKKyNzY2hhbl90aW1lb3V0X3VzZWMuQkNNODg0NzA9NjAwMDAwMDAwCitzY2hhbl90aW1lb3V0X3VzZWMuQkNNODg0NzA9MzAwMDAwCitzY2hhbl90aW1lb3V0X3VzZWMuQkNNODgyNzA9MjAwMDAwCisKKyMgVERNQQordGRtYV9pbnRyX2VuYWJsZS5CQ004ODQ3MD0wCisjdGRtYV9pbnRyX2VuYWJsZS5CQ004ODI3MD0wCisKKyMgRm9yIGVtdWxhdGlvbiB1c2U6CisjdGRtYV90aW1lb3V0X3VzZWMuQkNNODg0NzA9NjAwMDAwMDAwCit0ZG1hX3RpbWVvdXRfdXNlYy5CQ004ODQ3MD02MDAwMDAwMAordGRtYV90aW1lb3V0X3VzZWMuQkNNODgyNzA9NTAwMDAwCisKKyMgVFNMQU0KK3RzbGFtX2ludHJfZW5hYmxlLkJDTTg4NDcwPTAKK3RzbGFtX2ludHJfZW5hYmxlLkJDTTg4MjcwPTAKKworIyBGb3IgZW11bGF0aW9uIHVzZToKKyN0c2xhbV90aW1lb3V0X3VzZWMuQkNNODg0NzA9NjAwMDAwMDAwCit0c2xhbV90aW1lb3V0X3VzZWMuQkNNODg0NzA9NjAwMDAwMDAKK3RzbGFtX3RpbWVvdXRfdXNlYy5CQ004ODI3MD01MDAwMDAKKworI290bV9iYXNlX3FfcGFpci5CQ004ODQ3MD0yCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb25maWcgdmFyaWFibGUgYmVsb3cgYXJlIG9ubHkgYWNjZXNzZWQgZnJvbSBkdW5lLnNvYywgYW5kIGFyZSB1c2VkIHRvCisjIGNvbmZpZ3VyZSBCU1AgLyBleGFtcGxlIGFwcGxpY2F0aW9uIC8gZ3JvdXAgb2YgZm9ybWFsIGNvbmZpZyB2YXJpYWJsZXMuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTdXBwb3J0IChhbmQgY29uZmlndXJlIG9uIGluaXQpIHBhY2tldCBwcm9jZXNzaW5nIGZlYXR1cmVzLgorIyBJZiBub3QgZGVmaW5lZCAtIG9ubHkgdHJhZmZpYyBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBhcmUgZW5hYmxlZC4KK3BhY2tldF9wcm9jZXNzaW5nPTEKKworIyMgUENQIChQZXRyYSBDby1Qcm9jZXNzb3IpIGZlYXR1cmVzCisjcGNwX2Vsay5CQ004ODY0MF9BMD0xCisjcGNwX29hbS5CQ004ODY0MF9BMD0xCisjcGNwX2RtYS5CQ004ODY0MF9BMD0xCisKKyMjIFNldC9PdmVycmlkZSBURE0gcmVsYXRlZCBjb25maWcgdmFyaWFibGVzCisjdGRtLkJDTTg4NjQwX0EwPTEKKworIyBJZiBzZXQsIGFsd2F5cyBjb25maWd1cmVzIHN5bnRoZXNpemVycywgZXZlbiBpZiB0aGUgY29uZmlndXJlZCByYXRlIGlzCisjIGVxdWFsIHRvCisjIHRoZWlyIG5vbWluYWwgcmF0ZS4gQ2FuIGJlIGRpc2FibGVkIHRvIHNwZWVkdXAgYnJpbmd1cCB0aW1lCisjIChrZWVwIGluIG1pbmQgdGhhdCBpZiBkaXNhYmxlZCwgY2hhbmdpbmcgYSBzeW50IHRvIGEgbm9uLW5vbWluYWwgZnJlcSBhbmQKKyMgdGhhbiBiYWNrIHRvIG5vbWluYWwgd2lsbCBub3Qgd29yaworI3N5bnRfb3Zlci5CQ004ODY0MF9BMD0xCisKKyMgTG9jYWwgdmFyaWFibGVzIGZvciBib2FyZCBzeW50aGVzaXplcnMgZnJlcS4gRmFicmljLCBjb21ibyBhbmQgbmlmIGFsc28gY29uZmlndXJlCisjIHRoZSAqX3JlZl9jbG9jayBzb2MgcHJvcGVydGllcyBmb3IgdGhlc2UgZnJlcXVlbmNpZXMuIGNvcmUsIGRkciBhbmQgcGh5IG9ubHkKKyMgY29uZmlndXJlcyB0aGUgc3ludGhlc2l6ZXIKK3N5bnRfY29yZS5CQ004ODY0MF9BMD0xMDAwMDAwMDAKK3N5bnRfZGRyLkJDTTg4NjQwX0EwPTEyNTAwMDAwMAorc3ludF9waHkuQkNNODg2NDBfQTA9MTU2MjUwMDAwCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIFdhcm1ib290ICYgU1cgU3RhdGUgIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworI0hXIGpvdXJuYWwgd29ya2luZyBtb2RlLiBBbGxvd2VkIHZhbHVlczogMC0yLgorIyAgIDAgOiBEaXNhYmxlZAorIyAgIDEgOiBDb21taXQgQWZ0ZXIgRWFjaCBBcGkKKyMgICAyIDogQ29tbWl0IFVwb24gVXNlciBSZXF1ZXN0CitoYV9od19qb3VybmFsX21vZGU9MAorCitoYV9od19qb3VybmFsX3NpemU9MTU3Mjg2NDAKK2hhX3N3X2pvdXJuYWxfc2l6ZT0xNTcyODY0MAoraGFfY3Jhc2hfcmVjb3Zlcnk9MQorCisKKyMgc3RhYmxlX3NpemUgLSBhIHN0cmljdCBib3VuZCBvbiB0aGUgYXBwbGljYXRpb24ncyBleHRlcm5hbCBzdG9yYWdlIHNpemUKK3N0YWJsZV9zaXplLkJDTTg4OTUwPTIwMDAwMAorc3RhYmxlX3NpemUuQkNNODg3NTA9MjAwMDAwCitzdGFibGVfc2l6ZS5CQ004ODY1MD0yODEwMDAwMDAKK3N0YWJsZV9zaXplLkJDTTg4Njc1PTUwMDAwMDAwMAorc3RhYmxlX3NpemUuQkNNODg2ODA9NTAwMDAwMDAwCitzdGFibGVfc2l6ZS5CQ004ODY5MD01MDAwMDAwMDAKK3N0YWJsZV9zaXplLkJDTTg4NDcwPTM1MDAwMDAwMAorc3RhYmxlX3NpemUuQkNNODgyNzA9NjUwMDAwMDAwCitzdGFibGVfc2l6ZT00MjAwMDAwMDAKKworIyBkZXRlcm1pbmUgdGhlIG1lbW9yeSBzaXplIHByZS1hbGxvY2F0ZWQgZm9yIHRoZSBTREsncyBTVyBTdGF0ZQorc3dfc3RhdGVfbWF4X3NpemUuQkNNODg2NTA9MjEwMDAwMDAwCitzd19zdGF0ZV9tYXhfc2l6ZS5CQ004ODY3NT0zNTAwMDAwMDAKK3N3X3N0YXRlX21heF9zaXplLkJDTTg4NjgwPTM1MDAwMDAwMAorc3dfc3RhdGVfbWF4X3NpemUuQkNNODg0NzA9MzAwMDAwMDAwCitzd19zdGF0ZV9tYXhfc2l6ZS5CQ004ODI3MD0yMTAwMDAwMDAKK3N3X3N0YXRlX21heF9zaXplPTM1MDAwMDAwMAorCisjIHN0YWJsZSBsb2NhdGlvbgorIyMgcGFydCBvZiBzY2FjaGUgaW5pdGlhbGl6YXRpb24gZm9yIHdhcm1ib290IHBlcnNpc3RlbnQgc3RvcmFnZS4KKyMjIHZhbHVlczogMS0yOk5vdCBWYWxpZCBmb3IgZG54IDM6IFN0b3JlIGluIGEgZmlsZSAgNDogVXNlIFNoYXJlZCBNZW0uCisjIDQgaXMgdGhlIHByZWZmZXJlZCBvcHRpb24sIHVzaW5nIDMgZm9yIEFyYWQgYW5kIEZFIGluIG9yZGVyIHRvIHJlZ3Jlc3MgYm90aCBtb2Rlcy4KK3N0YWJsZV9sb2NhdGlvbi5CQ004ODk1MD0zCitzdGFibGVfbG9jYXRpb24uQkNNODg3NTA9Mworc3RhYmxlX2xvY2F0aW9uLkJDTTg4NjUwPTMKK3N0YWJsZV9sb2NhdGlvbi5CQ004ODY2MD0zCitzdGFibGVfbG9jYXRpb24uQkNNODg2NzU9Mworc3RhYmxlX2xvY2F0aW9uPTMKKworIyBzdGFibGVfZmlsZW5hbWUgLSB0aGUgd2FybWJvb3QgZmlsZSBuYW1lIChpZiBzdG9yZWQgb24gYSBmaWxlKSAKK3N0YWJsZV9maWxlbmFtZT0vdG1wL3dhcm1ib290X2RhdGEKKworIyBlbXVsYXRpb24gZmlsZSBuYW1lCitzdGFibGVfZmlsZW5hbWUuQkNNODg0NzA9L3RtcC93YXJtYm9vdF9kYXRhCisKKworIyBjcmVhdGUgdGhlIGZpbGUgaW4gbWVtb3J5IGZvciBhIGZhc3RlciB3YXJtYm9vdCBkZWJ1ZworI3N0YWJsZV9maWxlbmFtZT0vZGV2L3NobS93YXJtYm9vdF9kYXRhCisKKyMgc3RhYmxlX2ZsYWdzIC0gbm90IGluIHVzZQorc3RhYmxlX2ZsYWdzPTAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMgQnJpZGdlIGRlZmF1bHQgbG9naWNhbCBpbnRlcmZhY2VzIGFsbG9jYXRpb24gSURTCitsb2dpY2FsX3BvcnRfbDJfYnJpZGdlLkJDTTg4NjQwPTEKK2xvZ2ljYWxfcG9ydF9kcm9wLkJDTTg4NjQwPS0xCisKKyNsb2dpY2FsX3BvcnRfbWltX2luLkJDTTg4NjQwPTIKKyNsb2dpY2FsX3BvcnRfbWltX291dC5CQ004ODY0MD0zCisKKyMjIElQVjYgdHVubmVsCitiY204ODZ4eF9pcHY2X3R1bm5lbF9lbmFibGU9MQorCisjIyBJbmxpZiBQcm9maWxlIE1hbmFnZW1lbnQgTW9kZSAtIFFvUyBMMyBMMiBtYXJraW5nIG1vZGUKKyMKKyMgQkNNODg2NjAgT05MWQorIworIyBRb1MgTDMgTDIgbWFya2luZyBhbGxvd3MgY2hhbmdpbmcgdGhlIERTQ1AgYW5kL29yIEVYUCB2YWx1ZXMKKyMgb2YgSVAgYW5kL29yIE1QTFMgcGFja2V0cyBhY2NvcmRpbmcgdG8gdGhlIGluY29taW5nIHBvcnQKKyMgKG9yIGlubGlmKSwgYW5kIHRoZSBUcmFmZmljIENsYXNzL0Ryb3AgUHJlY2VkZW5jZS4KKyMKKyMgVGhlIGlubGlmIHByb2ZpbGUgaXMgdXNlZCB0byBjb250cm9sIHRoZSBEU0NQL0VYUCBtYXJraW5nLgorIyBUaGlzIFNPQyBwcm9wZXJ0eSBjb250cm9scyB3aGljaCBtb2RlIGlzIHVzZWQgZm9yIHRoZSBpbmxpZiBwcm9maWxlOgorIyAxOiBCYXNpYyBtb2RlICgxIGJpdCBvZiB0aGUgaW5saWYgcHJvZmlsZSBpcyByZXNlcnZlZCBhbmQgaXMgdXNlZCBmb3IgdGhlIERTQ1AvRVhQIG1hcmtpbmcpLgorIyAwOiBBZHZhbmNlZCBtb2RlICh0aGUgdXNlciBjb250cm9scyB3aGljaCBpbmxpZiBwcm9maWxlIHZhbHVlcyBwZXJmb3JtIERTQ1AvRVhQIG1hcmtpbmcgZGlyZWN0bHkpLgorI2JjbTg4Nnh4X3Fvc19sM19sMl9tYXJraW5nPTEKKworIyMgVW5pY2FzdCBSUEYgbW9kZSBwZXIgUklGCisjCisjIFRoaXMgU09DIHByb3BlcnR5IGFsbG93cyB0aGUgdXNlciB0byBzZXQgdGhlIHVuaWNhc3QgUlBGIG1vZGUgLSBsb29zZSwgc3RyaWN0IG9yIGRpc2FibGVkIC0gcGVyIFJJRi4KKyMgSWYgZGlzYWJsZWQsIHRoZSB1bmljYXN0IFJQRiBtb2RlIG9mIGEgUklGIGlzIHNldCBnbG9iYWxseS4KKyMgT3B0aW9uczogMCAvIDEKKworIyNKZXJpY2hvIG9ubHksIG51bWJlciBvZiBpbnJpZiBtYWMgdGVybWluYXRpb24gY29tYmluYXRpb25zLiBMZWdhbCB2YWx1ZXMgMCAtIDE2LCBkZWZhdWx0IHZhbHVlIDE2ICovCisjTm90ZTogVHdvIHNldHMgb2YgaWRlbnRpY2FsIG1hYyB0ZXJtaW5hdGlvbiBjb21iaW5hdGlvbnMgd2l0aCBkaWZmZXJlbnQgUlBGIG1vZGVzIChsb29zZSBhbmQgc3RyaWN0KSAKKyN3aWxsIGNvbnN1bWUgdHdvIHRlcm1pbmF0aW9uIGNvbWJpbmF0aW9ucyByZXNvdXJjZXMuCisjVHdvIHNldHMgb2YgaWRlbnRpY2FsIG1hYyB0ZXJtaW5hdGlvbiBjb21iaW5hdGlvbnMgd2l0aCBhbmQgd2l0aG91dCBsb29zZSBSUEYgd2lsbCBjb25zdW1lIG9ubHkgb25lIHJlc291cmNlLgorbnVtYmVyX29mX2lucmlmX21hY190ZXJtaW5hdGlvbl9jb21iaW5hdGlvbnM9OAorCisjI0plcmljaG8gb25seSwgaXBtY19sM21jYXN0bDJfbW9kZSBTT0MgYWxsb3dzIGEgcGVyIFJJRiBwcm9ncmFtIHNlbGVjdGlvbiBpbiB0aGUgY2FzZSBvZiBpcHY0IE1DIHdpdGggSVBNQyBkaXNhYmxlIAorI2luc3RlYWQgb2YgdGhlIGdsb2JhbCBiY21Td2l0Y2hMM01jYXN0TDIgc3dpdGNoIGNvbnRyb2wgc2VsZWN0aW9uLgorI0xlZ2FsIHZhbHVlczoKKyMwOiBiY21Td2l0Y2hMM01jYXN0TDIgc3dpdGNoIGNvbnRyb2wuCisjMTogUEVSIEluLVJJRiBzZWxlY3Rpb24uCisjTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgU09DIHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgSW4tUklGIG1hYyB0ZXJtaW5hdGlvbiBjb21iaW5hdGlvbnMgYml0cyBieSBvbmUgdG8gYSBtYXhpbXVtIG9mIDMgYml0cyAKKyNzbyBpdCBjYW4ndCBiZSBlbmFibGVkIHdpdGggbnVtYmVyX29mX2lucmlmX21hY190ZXJtaW5hdGlvbl9jb21iaW5hdGlvbnMgbGFyZ2VyIHRoYW4gOC4KK2lwbWNfbDNtY2FzdGwyX21vZGUgPSAxCisKKyMgVGhlIGJjbV9pcG1jX2FkZCBhZGRzIGJyaWRnZSBvciByb3V0ZSBlbnRyaWVzIGFjY29yZGluZyB0byB0aGUgQkNNX0lQTUNfTDIgZmxhZy4KKyMgU2V0dGluZyBjdXN0b21fZmVhdHVyZV9pcG1jX3NldF9lbnRyeV90eXBlX2J5X3JpZj0xIHdpbGwgdXNlIHRoZSByZWxhdGVkIElOLVJJRiBJUE1DIHN0YXRlIChlbmFibGUvZGlzYWJsZSkgCisjIHRvIHNlbGVjdCB0aGUgYmNtX2lwbWNfYWRkIGVudHJ5IHR5cGUgKGJyaWRnZS9yb3V0ZSkuCisjY3VzdG9tX2ZlYXR1cmVfaXBtY19zZXRfZW50cnlfdHlwZV9ieV9yaWY9MAorCisjIGJjbTg4Nnh4X2wzX2luZ3Jlc3NfdXJwZl9lbmFibGU9MQorCisjIyBCT1MgaGFuZGxpbmcgbW9kZQorIyBCQ004ODY2WCBPTkxZCisjCisjIFRoZXJlIGFyZSB0d28gd2F5cyB0byBoYW5kbGUgQk9TLCBjb250cm9sbGVkIGJ5IGJjbTg4Nnh4X21wbHNfdGVybWluYXRpb25fbW9kZToKKyMgMCAtIFVzZSBCT1MgYXMga2V5IGluIGxvb2t1cC4KKyMgMSAtIERvbid0IHVzZSBpdCAoZXhjZXB0IGZvciByZXNlcnZlZCBsYWJlbHMpLgorIworI2JjbTg4Nnh4X21wbHNfdGVybWluYXRpb25fa2V5X21vZGU9MAorCisjIENvbG9yIHJlc29sdXRpb24gbW9kZSBhbGxvd3MgdGhlIHVzZXIgdG8gaGF2ZSBtb3JlIGRldGFpbGVkIG1ldGVyaW5nIGNvbG9yIGluZm9ybWF0aW9uLgorIyBCQ004ODY2MCBPTkxZCisjCisjIE9wdGlvbnM6IDAtMgorIyAwOiBBIHJlZCByZXN1bHQgZnJvbSBib3RoIEV0aGVybmV0IHBvbGljZXIgYW5kIG1ldGVyIGltcGxpZXMgRFA9My4KKyMgMTogQSByZWQgcmVzdWx0IGZyb20gbWV0ZXIgaW1wbGllcyB0aGF0IERQPTIsIHdoaWxlIGEgcmVkIHJlc3VsdCBmcm9tIHJhdGUgKEV0aGVybmV0IHBvbGljZXIpIGltcGxpZXMgRFA9My4KKyNwb2xpY2VyX2NvbG9yX3Jlc29sdXRpb25fbW9kZT0xCisKKyMjIElubGlmIFByb2ZpbGUgTWFuYWdlbWVudCBNb2RlIC0gRGlzYWJsZSBTYW1lIEludGVyZmFjZSBGaWx0ZXIKKyMgQkNNODg2NlggT05MWQorIworIyBDb250cm9scyB3aGljaCBtb2RlIGlzIHVzZWQgZm9yIHRoZSBpbmxpZiBwcm9maWxlIG1hbmFnZW1lbnQuCisjIDE6IEJhc2ljIG1vZGUgKDEgYml0IG9mIHRoZSBpbmxpZiBwcm9maWxlIGlzIHJlc2VydmVkIGFuZCBpcyB1c2VkIGZvciB0aGUgc2FtZS1pbnRlcmZhY2UgZmlsdGVyKS4KKyMgMDogQWR2YW5jZWQgbW9kZSAodGhlIHVzZXIgY29udHJvbHMgd2hpY2ggaW5saWYgcHJvZmlsZSB2YWx1ZXMgaGF2ZSB0aGUgc2FtZS1pbnRlcmZhY2UgZmlsdGVyIGRpc2FibGVkIGZvciB0aGVtKS4KKyNiY204ODZ4eF9sb2dpY2FsX2ludGVyZmFjZV9icmlkZ2VfZmlsdGVyX2VuYWJsZT0xCisKKyMjIERlZmF1bHQgQmxvY2sgRm9yd2FyZGluZyBTdHJlbmd0aAorIworIyBDb25maWd1cmUgdGhlIGRlZmF1bHQgZm9yd2FyZGluZyBzdHJlbmd0aCBvZiBibG9ja3MuCisjCisjIFNPQyBQcm9wZXJ0aWVzOgorI2Jsb2NrX3RyYXBfc3RyZW5ndGhfdnR0IC0gVlRUIGJsb2NrIGZvcndhcmRpbmcgc3RyZW5ndGgKKyNibG9ja190cmFwX3N0cmVuZ3RoX2ZscCAtIEZMUCBibG9jayBmb3J3YXJkaW5nIHN0cmVuZ3RoCisjYmxvY2tfdHJhcF9zdHJlbmd0aF9oYXNoIC0gU0xCIGJsb2NrIGZvcndhcmRpbmcgc3RyZW5ndGggKEJDTTg4NjZYIE9OTFkpCisjYmxvY2tfdHJhcF9zdHJlbmd0aF9wbWZfMCAtIFBNRiAxc3QgbG9va3VwIGZvcndhcmRpbmcgc3RyZW5ndGgKKyNibG9ja190cmFwX3N0cmVuZ3RoX3BtZl8xIC0gUE1GIDJuZCBsb29rdXAgZm9yd2FyZGluZyBzdHJlbmd0aAorIworIyBPcHRpb25zOiAwLTcKKworIyMgU3RhdGVmdWwgTG9hZCBCYWxhbmNpbmcKKyMgQkNNODg2NlggT05MWQorIworIyBTdGF0ZWZ1bCBMb2FkIEJhbGFuY2luZyAoU0xCKSBhbGxvd3MgdGhlIGxvYWQgYmFsYW5jaW5nIG9mIEVDTVAgYW5kIExBRworIyBncm91cHMgdG8gYmVjb21lIHN0YXRlZnVsLgorIyBJbiBzdGFuZGFyZCBsb2FkIGJhbGFuY2luZywgcmVtb3ZpbmcgYSBtZW1iZXIgZnJvbSB0aGUgRUNNUC9MQUcKKyMgZ3JvdXAgbWF5IGFmZmVjdCB0aGUgc2VsZWN0ZWQgbWVtYmVyLCBzaW5jZSB0aGUgZm9ybXVsYQorIyBkZXBlbmRzIG9uIGdyb3VwIHNpemUuCisjIEluIHN0YXRlZnVsIGxvYWQgYmFsYW5jaW5nIHRoZSBtZW1iZXIgaXMgc2VsZWN0ZWQgb25jZSBhbmQgc2F2ZWQuCisjIExhdGVyLCB0aGUgbWVtYmVyIGlzIGFsd2F5cyByZXRyaWV2ZWQsIGFuZCBkb2VzIG5vdCBkZXBlbmQgb24KKyMgdGhlIHNpemUgb2YgdGhlIExBRy9FQ01QIGdyb3VwLgorIworIyByZXNpbGllbnRfaGFzaF9lbmFibGUgLSBFbmFibGUvZGlzYWJsZSBTTEIuIFZhbHVlczoKKyMgMSAtIEVuYWJsZSBTTEIuCisjIDAgLSBEaXNhYmxlIFNMQi4KKyNyZXNpbGllbnRfaGFzaF9lbmFibGU9MQorCisjIFdoZW4gdGhpcyBmbGFnIGlzIHNldCAoYW5kIHNwZWN1bGF0aXZlIHBhcnNpbmcgaXMgdXNlZCkgaXQgaXMgcG9zc2libGUgZm9yIGEgcGFja2V0IG9mIEw0b0lQdjQvNm9NUExTKDEtMyBsYWJlbHMpb0VUSAorIyB3aXRoIE1QTFMgZm9yd2FyZGluZyB0byB1c2UgdGhlIEw0IGhlYWRlciwgb3RoZXJ3aXNlIHRoZSBJUHY0LzYgaXMgdGhlIGxhc3Qga25vd24gaGVhZGVyLgorI05vdGU6IHNldHRpbmcgdGhpcyBmbGFnIGNhbiBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9yIHdoZW4gQk9TIGlzIHVzZWQgaW4gdGhlIHNjZW5hcmlvIGFib3ZlLgorI2N1c3RvbV9mZWF0dXJlX3NwZWN1bGF0aXZlX0w0X3N1cHBvcnQ9MAorCisjTWFrZSBBcmFkIFNPQyBwcm9wZXJ0aWVzIHdvcmsgZm9yIEFyYWQrLCBieSBtYXBwaW5nIHRoZSBCQ004ODY2MCBzdWZmaXggdG8gQkNNODg2NTAKK3NvY19mYW1pbHkuQkNNODg2NjA9QkNNODg2NTAKKyNNYWtlIEFyYWQgU09DIHByb3BlcnRpZXMgd29yayBmb3IgSmVyaWNobywgYnkgbWFwcGluZyB0aGUgQkNNODg2NzUgc3VmZml4IHRvIEJDTTg4NjUwCitzb2NfZmFtaWx5LkJDTTg4Njc1PUJDTTg4NjUwCisjTWFrZSBBcmFkIFNPQyBwcm9wZXJ0aWVzIHdvcmsgZm9yIFFNWCwgYnkgbWFwcGluZyB0aGUgQkNNODgzNzUgc3VmZml4IHRvIEJDTTg4NjUwCitzb2NfZmFtaWx5LkJDTTg4Mzc1PUJDTTg4NjUwCisjTWFrZSBBcmFkIFNPQyBwcm9wZXJ0aWVzIHdvcmsgZm9yIEFyZG9uLCBieSBtYXBwaW5nIHRoZSBCQ004ODIwMiBzdWZmaXggdG8gQkNNODg2NTAKK3NvY19mYW1pbHkuQkNNODgyMDI9QkNNODg2NTAKKyNNYWtlIEZFMzIwMCBTT0MgcHJvcGVydGllcyB3b3JrIGZvciBGRTMyMDAgU0tVIDg5NTIsIGJ5IG1hcHBpbmcgdGhlIEJDTTg4OTUyIHN1ZmZpeCB0byBCQ004ODk1MAorc29jX2ZhbWlseS5CQ004ODk1Mj1CQ004ODk1MAorI01ha2UgRkUxNjAwIFNPQyBwcm9wZXJ0aWVzIHdvcmsgZm9yIEZFMTYwMCBTS1UgODc1MywgYnkgbWFwcGluZyB0aGUgQkNNODg3NTMgc3VmZml4IHRvIEJDTTg4NzUwCitzb2NfZmFtaWx5LkJDTTg4NzUzPUJDTTg4NzUwCisjTWFrZSBGRTE2MDAgU09DIHByb3BlcnRpZXMgd29yayBmb3IgRkUxNjAwIFNLVSA4NzUyLCBieSBtYXBwaW5nIHRoZSBCQ004ODc1MiBzdWZmaXggdG8gQkNNODg3NTAKK3NvY19mYW1pbHkuQkNNODg3NTI9QkNNODg3NTAKKyNNYWtlIEFyYWQgU09DIHByb3BlcnRpZXMgd29yayBmb3IgUUFYLCBieSBtYXBwaW5nIHRoZSBCQ004ODQ3MCBzdWZmaXggdG8gQkNNODg2NTAKK3NvY19mYW1pbHkuQkNNODg0NzA9QkNNODg2NTAKKworI01ha2UgQXJhZCBTT0MgcHJvcGVydGllcyB3b3JrIGZvciBRVVgsIGJ5IG1hcHBpbmcgdGhlIEJDTTg4MjcwIHN1ZmZpeCB0byBCQ004ODY1MAorc29jX2ZhbWlseS5CQ004ODI3MD1CQ004ODY1MAorI01ha2UgQXJhZCBTT0MgcHJvcGVydGllcyB3b3JrIGZvciBGTEFJUiwgYnkgbWFwcGluZyB0aGUgQkNNODIwNiBzdWZmaXggdG8gQkNNODg2NTAKK3NvY19mYW1pbHkuQkNNODIwNj1CQ004ODY1MAorI01ha2UgQXJhZCBTT0MgcHJvcGVydGllcyB3b3JrIGZvciBKRVJJQ0hPX1BMVVMsIGJ5IG1hcHBpbmcgdGhlIEJDTTg4NDcwIHN1ZmZpeCB0byBCQ004ODY1MAorc29jX2ZhbWlseS5CQ004ODY4MD1CQ004ODY1MAorCisjIFVzZSBkaWZmZXJlbnQgbXltYWMgYWRkcmVzc2VzIGZvciBpcHY0IGFuZCBpcHY2IHdoZW4gdXNpbmcgdnJycCBmb3IgbXltYWMgdGVybWluYXRpb24uCisjbDNfdnJycF9pcHY2X2Rpc3RpbmN0PTEKKworIyBFbmFibGUgbXVsdGlwbGUgbXltYWMgdGVybWluYXRpb24gbW9kZS4KKyMgSW4gb3JkZXIgdG8gZW5hYmxlIGl0LCBhbHNvIHNldCBsM192cnJwX2lwdjZfZGlzdGluY3Q9MCBhbmQgbDNfdnJycF9tYXhfdmlkPTAgc2luY2UgdnJycCBhbmQKKyMgbXVsdGlwbGUgbXltYWMgbW9kZSBjYW4ndCBjbyBleGlzdC4KKyNsM19tdWx0aXBsZV9teW1hY190ZXJtaW5hdGlvbl9lbmFibGU9MQorCisjIERpc3Rpbmd1aXNoIGJldHdlZW4gaXB2NCBhbmQgYWxsIG90aGVyIGwzIHByb3RvY29scyB3aGVuIG11bHRpcGxlIG15bWFjIHRlcm1pbmF0aW5nCisjbDNfbXVsdGlwbGVfbXltYWNfdGVybWluYXRpb25fbW9kZT0xCisKKyMgVXN1YWxseSB0aGUgZmluYWwgRFAgZ2l2ZW4gYnkgdGhlIG1ldGVyIChvciB0aGUgSW4tRFApIGlzIHVuY2hhbmdlZCwgYW5kIGNhbiBiZSBmcm9tIDAtMy4KKyMgV2hlbiB0aGlzIFNPQyBwcm9wZXJ0eSBpcyBzZXQgdG8gMSwgd2hlbiB0aGUgZmluYWwgSU5HUkVTUyBEUCBpcyAyLAorIyBpdCBpcyBtYXBwZWQgdG8gMSBpbnN0ZWFkLCBhbmQgdGh1cyBvbmx5IHRoZSB2YWx1ZXMgMC0xIGFuZCAzIGNhbiBiZSBvdXRwdXQuCisjIFRoaXMgaGFzIG5vIGVmZmVjdCB3aGVuIHBvbGljZXJfY29sb3JfcmVzb2x1dGlvbl9tb2RlPTEuCisjY3VzdG9tX2ZlYXR1cmVfYWx3YXlzX21hcF9yZXN1bHRfZHBfMl90b18xPTEKKworIyBEeW5hbWljIHBvcnQgZmVhdHVyZQorI2N1c3RvbV9mZWF0dXJlX2R5bmFtaWNfcG9ydD0xCisKKyMgbG93IHBvd2VyIG5pZiBtYWMKKyNsb3dfcG93ZXJfbmlmX21hYz0wCisKKyMgYWxsb3cgbW9kaWZpY2F0aW9ucyBkdXJpbmcgdHJhZmZpYworI2N1c3RvbV9mZWF0dXJlX2FsbG93X21vZGlmaWNhdGlvbnNfZHVyaW5nX3RyYWZmaWM9MQorCisjIG1lbV9jYWNoZV9lbmFibGUgcHJvcGVydHkKKyMgQ2FjaGUgbWVtb3J5IG1vZGUgLSBlbmFibGUgbWVtb3J5IGNhY2hpbmcgZHVyaW5nIGluaXQuCisjIE5vdGU6IFRoZSB1c2VyIE1VU1QgYWRkIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggc3VmZml4ICdfc3BlY2lmaWMnIGJlZm9yZSBwcm92aWRpbmcgdGhlIGxpc3Qgb2YgdGhlIGNhY2hlZCBtZW1vcmllcy4KKyMgUG9zc2libGUgb3B0aW9ucyAoc3VmZml4ZXMpOgorIyBfYWxsICAgICAgICAtIGVuYWJsZSBhbGwgdGFibGVzIChleGNsdWRpbmcgcmVhZC1vbmx5L3dyaXRlLW9ubHkvZHluYW1pYy9zaWduYWwpCisjIF9wcmVkZWZpbmVkIC0gZW5hYmxlIHByZWRlZmluZWQgbGlzdCBvZiB0YWJsZXMKKyMgX3Bhcml0eSAgICAgLSBlbmFibGUgdGFibGVzIHByb3RlY3RlZCBieSBwYXJpdHkgZmllbGQKKyMgX2VjYyAgICAgICAgLSBlbmFibGUgdGFibGVzIHByb3RlY3RlZCBieSBlY2MgZmllbGQKKyMgX3NwZWNpZmljICAgLSBlbmFibGUgc3BlY2lmaWMgdGFibGVzIC0gTVVTVCBhZGQgdGhpcyBzdWZmaXggaWYgc3BlY2lmaWMgdGFibGVzIHNob3VsZCBiZSBjYWNoZWQKKyMgX3NwZWNpZmljX1ggLSBlbmFibGUgY2FjaGluZyBmb3IgbWVtb3J5IFgsIHdoZXJlIFggaXMgbWVtb3J5IG5hbWUuIE5vdGU6IHdpbGwgbm90IHdvcmsgd2l0aG91dCB0aGUgcHJldmlvdXMgc3VmZml4CisjIEV4YW1wbGU6ICh0aGlzIGV4YW1wbGUgd2lsbCBlbmFibGUgY2FjaGluZyBvZiB0aGUgSUhQX1JFQ1lDTEVfQ09NTUFORCB0YWJsZSkKKyMgbWVtX2NhY2hlX2VuYWJsZV9zcGVjaWZpYy5CQ004ODY1MD0xICMoTVVTVCBiZSBhZGRlZCBpbiBjYXNlIHNwZWNpZmljIHRhYmxlcyBzaG91bGQgYmUgY2FjaGVkKQorIyBtZW1fY2FjaGVfZW5hYmxlX3NwZWNpZmljX0lIUF9SRUNZQ0xFX0NPTU1BTkQuQkNNODg2NTA9MQorIyBtZW1fY2FjaGVfZW5hYmxlX3NwZWNpZmljLkJDTTg4Njc1PTEKKyMgbWVtX2NhY2hlX2VuYWJsZV9zcGVjaWZpY19JUFNfUVVFVUVfUFJJT1JJVFlfVEFCTEUuQkNNODg2NzU9MQorCittZW1fY2FjaGVfZW5hYmxlX3Bhcml0eS5CQ004ODY1MD0xCittZW1fY2FjaGVfZW5hYmxlX3Bhcml0eS5CQ004ODY3NT0xCittZW1fY2FjaGVfZW5hYmxlX3Bhcml0eS5CQ004ODIwMj0xCittZW1fY2FjaGVfZW5hYmxlX3Bhcml0eS5CQ004ODc1MD0xCittZW1fY2FjaGVfZW5hYmxlX3Bhcml0eS5CQ004ODk1MD0xCittZW1fY2FjaGVfZW5hYmxlX2VjYz0wCisKKyMgbWVtX25vY2FjaGUgcHJvcGVydHkKKyMgQ2FjaGUgbWVtb3J5IG1vZGUgLSBkaXNhYmxlIG1lbW9yeSBjYWNoaW5nIGZvciBzcGVjaWZpYyB0YWJsZSBkdXJpbmcgaW5pdC4KKyMgTm90ZTogdGhlIHVzZXIgTVVTVCBhZGQgdGhlIGRlZmF1bHQgcHJvcGVydHkgbmFtZSBiZWZvcmUgcHJvdmlkaW5nIHRoZSBsaXN0IG9mIHRoZSB1bmNhY2hlZCBtZW1vcmllcy4KKyMgUG9zc2libGUgb3B0aW9ucyAoc3VmZml4ZXMpOgorIyBzcGVjaWZpY19YIC0gZGlzYWJsZSBjYWNoaW5nIGZvciBtZW1vcnkgWCwgd2hlcmUgWCBpcyBtZW1vcnkgbmFtZS4gTm90ZTogd2lsbCBub3Qgd29yayB3aXRob3V0IHRoZSBwcmV2aW91cyBzdWZmaXgKKyMgRXhhbXBsZTogKHRoaXMgZXhhbXBsZSB3aWxsIGVuYWJsZSBjYWNoaW5nIG9mIHRoZSBJSFBfVEVSTUlOQVRJT05fUFJPRklMRV9UQUJMRSB0YWJsZSkKKyMgbWVtX25vY2FjaGUuQkNNODg2NjA9MSAjKE1VU1QgYmUgYWRkZWQgaW4gY2FzZSB0aGVyZSBhcmUgdW5jYWNoZWQgbWVtb3JpZXMpCisjIG1lbV9ub2NhY2hlX0lIUF9URVJNSU5BVElPTl9QUk9GSUxFX1RBQkxFLkJDTTg4NjYwPTEKKyNtZW1fbm9jYWNoZS5CQ004ODY4MD0xCisjbWVtX25vY2FjaGVfUFBEQl9CX0xJRl9UQUJMRV9MQUJFTF9QUk9UT0NPTF9PUl9MU1AuQkNNODg2ODA9MQorI21lbV9ub2NhY2hlX1BQREJfQl9MSUZfVEFCTEUuQkNNODg2ODA9MQorCisKK2N1c3RvbV9mZWF0dXJlX25vX2JhY2tkb29yPTEKKworIyBKZXJpY2hvIHNwbGl0IGhvcml6b24gbW9kZQorIyAwIC0gVXNlIDAtMSByYW5nZSBmb3IgbGlmIG9yaWVudGF0aW9uLgorIyAxIChkZWZhdWx0KSAtIFVzZSAwLTEgcmFuZ2UgZm9yIGxpZiBvcmllbnRhdGlvbiBpbiBBQyBsaWZzIGFuZCAwLTMgcmFuZ2UgZm9yIG9yaWVudGF0aW9uIGluIG90aGVyIGxpZiB0eXBlcy4KK3NwbGl0X2hvcml6b25fZm9yd2FyZGluZ19ncm91cHNfbW9kZS5CQ004ODY3NT0xCitzcGxpdF9ob3Jpem9uX2ZvcndhcmRpbmdfZ3JvdXBzX21vZGUuQkNNODg0NzA9MQorc3BsaXRfaG9yaXpvbl9mb3J3YXJkaW5nX2dyb3Vwc19tb2RlLkJDTTg4NjgwPTEKKworCisjIEVudHJpZXMgY2FwYWNpdGllcyBmb3IgcHVibGljIGFuZCBwcml2YXRlIElQIGZvcndhcmRpbmcgdGFibGVzCitwcml2YXRlX2lwX2Zyd3JkX3RhYmxlX3NpemU9NTAwMDAwCitwdWJsaWNfaXBfZnJ3cmRfdGFibGVfc2l6ZT01MDAwMDAKKworCisjRW5hYmxlIEtBUFMgQVJNIGFuZCBEZXNjcmlwdG9yLURNQQorZG1hX2Rlc2NfYWdncmVnYXRvcl9jaGFpbl9sZW5ndGhfbWF4PTUwMAorZG1hX2Rlc2NfYWdncmVnYXRvcl9idWZmX3NpemVfa2I9MTAwCitkbWFfZGVzY19hZ2dyZWdhdG9yX3RpbWVvdXRfdXNlYz0xMDAwCitkbWFfZGVzY19hZ2dyZWdhdG9yX2VuYWJsZV9zcGVjaWZpY19LQVBTPTEKKworI0luIEplcmljaG8gdGhlIEtBUFMgQVJNIERNQSBhbHJlYWR5IGNvbnN1bWVzIDY0S0Igb2YgYnVmZmVyIG1lbW9yeQorZG1hX2Rlc2NfYWdncmVnYXRvcl9idWZmX3NpemVfa2IuQkNNODg2NzU9NDAKKworIyBFbnRyaWVzIGNhcGFjaXRpZXMgZm9yIGRpcmVjdCBhY2Nlc3MgdGFibGVzIGluIEtBUFMgKDhLIGdyYW51bGFyaXR5KQorI3BtZl9rYXBzX2xhcmdlX2RiX3NpemU9ODA5NgorCisjZW5hYmxlIGV4cG9zZSBvZiBIVyBpZCBpbnN0ZWFkIG9mIFNXIGlkIGluIFRyYXBzLgorYmNtODg2eHhfcnhfdXNlX2h3X3RyYXBfaWQuQkNNODg2NzU9MQorCisjIEplcmljaG8gLSBtYXhpbXVtIFJJRiBJZCAoIHZhbGlkIHJhbmdlIGlzIDAgdG8gMzIqMTAyNC0xKQorI3JpZl9pZF9tYXg9MjAwMDAKKworI0lmIHNldCwgbmV2ZXIgYWRkIHRoZSBQUEggbGVhcm4gZXh0ZW5zaW9uICh1bmxlc3MgZXhwbGljdGx5IHJlcXVpcmVkIGluIEZQIGFjdGlvbikuCisjYmNtODg2eHhfcHBoX2xlYXJuX2V4dGVuc2lvbl9kaXNhYmxlLkJDTTg4NjUwPTAKKyNiY204ODZ4eF9wcGhfbGVhcm5fZXh0ZW5zaW9uX2Rpc2FibGUuQkNNODg2NjA9MAorI2JjbTg4Nnh4X3BwaF9sZWFybl9leHRlbnNpb25fZGlzYWJsZS5CQ004ODY3NT0wCisKKyMgSmVyaWNobyAtIGZpZWxkX2lwX2ZpcnN0X2ZyYWdtZW50X3BhcnNlZAorI2ZpZWxkX2lwX2ZpcnN0X2ZyYWdtZW50X3BhcnNlZD0wCisKKyMgbGVhcm5pbmdfZmlmb19kbWFfYnVmZmVyX3NpemUgaW4gYnl0ZXMgKGhvc3QgbWVtb3J5IHNpemUpLiBWYWxpZCByYW5nZSBpcyAyMC0zMjc2ODAKK2xlYXJuaW5nX2ZpZm9fZG1hX2J1ZmZlcl9zaXplPTIwMDAwMAorIyBsZWFybmluZ19maWZvX2RtYV90aW1lb3V0IGluIG1pY3Jvc2Vjb25kcy4gVmFsaWQgcmFuZ2UgaXMgMC02NTUzNS4gMCBtZWFucyBubyB0aW1lb3V0LgorbGVhcm5pbmdfZmlmb19kbWFfdGltZW91dD0zMjc2NworIyBsZWFybmluZ19maWZvX2RtYV90aHJlc2hvbGQgdmFsaWQgcmFuZ2UgaXMgMS0xNjM4NCAoMHg0MDAwKQorbGVhcm5pbmdfZmlmb19kbWFfdGhyZXNob2xkPTQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIE9BTSBhbmQgQkZEICMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE9BTSAvIEJGRCBpbml0aWFsaXphdGlvbgorIyBUbyBlbmFibGUgT0FNIHNldCBvYW1fZW5hYmxlIHRvIDEKKyMgVG8gZW5hYmxlIEJGRCBzZXQgYmZkX2VuYWJsZSB0byAxCisjIEJlIGF3YXJlIHRoYXQgT0FNIHJlcXVpcmVzIG1vcmUgc2V0dGluZ3MgKENvbmZpZ3VyaW5nIE9BTVAgYW5kIFJlY3ljbGUgcG9ydCkKKworIyBvYW1fZW5hYmxlPTEKKyMgYmZkX2VuYWJsZT0xCisKKyMgU2V0IE9BTVAgcG9ydAorbnVtX29hbXBfcG9ydHMuQkNNODg2NTA9MAorCisjIElmIEJGRCBpcyB1c2VkLCBydW50aW1lX3BlcmZvcm1hbmNlX29wdGltaXplX2VuYWJsZV9zY2hlZF9hbGxvY2F0aW9uIHNob3VsZCBiZSBzZXQgdG8gMAorIyB0byBwcmV2ZW50IGhpZ2ggbWVtb3J5IGNvbnN1bXB0aW9uCisKKyMgRGlzYWJsZSB0aGUgZm9sbG93aW5nOgorIyBiY204ODZ4eF9uZXh0X2hvcF9tYWNfZXh0ZW5zaW9uX2VuYWJsZQorIyBiY204ODZ4eF9pcHY2X3R1bm5lbF9lbmFibGUKKworIyBUbyB1c2UgSUVFRSAxNTg4LCBjb25maWd1cmUgRFBMTCBjbG9jaworCisjIENvbmZpZ3VyZSByZWN5Y2xlIHBvcnQgKGFzc3VtaW5nIHVjb2RlX3BvcnRfNDA9UkNZLjApCisKKyNvYW1fcmN5X3BvcnQuQkNNODg2NTA9NDAKKyN0bV9wb3J0X2hlYWRlcl90eXBlX2luXzQwLkJDTTg4NjUwPVRNCisjdG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfNDAuQkNNODg2NTA9RVRICisjdWNvZGVfcG9ydF80MC4wPVJDWS4wOmNvcmVfMC40MAorCisjIE1QTFMtVFAgY2hhbm5lbCB0eXBlcyBmb3IgT0FNL0JGRCAtIElmIE1QTFMtVFAgdXNlZCwgY2hhbm5lbCBzaG91bGQgYmUgc3BlY2lmaWVkCisjIEF2YWlsYWJsZSB0eXBlczogbXBsc3RwX2JmZF9jb250cm9sX2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9wd19hY2hfY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2RsbV9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfaWxtX2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9kbV9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfaXB2NF9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfY2NfY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2N2X2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9vbl9kZW1hbmRfY3ZfY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX3B3ZV9vYW1fY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2lwdjZfY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2ZhdWx0X29hbV9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfZzgxMTNfY2hhbm5lbF90eXBlCisjbXBsc3RwX2c4MTEzX2NoYW5uZWxfdHlwZT0weDg5MDIKKyNtcGxzdHBfZmF1bHRfb2FtX2NoYW5uZWxfdHlwZT0weDU2NzgKKworIyBVc2UgQkZEIE1QTFMgVFAKKyNiZmRfZW5jYXBzdWxhdGlvbl9tb2RlPTEKKworIyBVc2UgMTcxMSBwcm90b2NvbAorI2N1c3RvbV9mZWF0dXJlX3kxNzExX2VuYWJsZWQ9MQorCisjIE9BTSBETUEgdGhyZXNob2xkCisjb2FtcF9maWZvX2RtYV9ldmVudF9pbnRlcmZhY2VfZW5hYmxlPTEKKyNvYW1wX2ZpZm9fZG1hX2V2ZW50X2ludGVyZmFjZV90aW1lb3V0PTAKKyNvYW1wX2ZpZm9fZG1hX2V2ZW50X2ludGVyZmFjZV9idWZmZXJfc2l6ZT0weDEwMDAKKyNvYW1wX2ZpZm9fZG1hX2V2ZW50X2ludGVyZmFjZV90aHJlc2hvbGQ9MTAKKworIyBQT1JUIEJBU0VEIFBXRSBURVJNSU5BVElPTgorI3B3ZV90ZXJtaW5hdGlvbl9wb3J0X21vZGVfZW5hYmxlID0xCisKKyMgV2FsayBhcm91bmQgZm9yIElubGlmIGRhdGEgRXJyYXRhLCBmb3IgR0FMIHBhY2tldHMsIGxvb2t1cCBtcGxzIHRhYmxlIHdpdGggdmFsaWQgbXBscyBsYWJlbAorIyBpdCdzIG5vdCBvZmZpY2FsIHNvbHV0aW9uLCBqdXN0IGZvciBzb21lIGRlZGljYXRlZCBjdXN0b21lci4KKyMgb2ZmaWNhbCBzb2x1dGlvbiB3aWxsIGJlIFBNRi4gcGxlYXNlIHJlZmVyIHRoZSByZWxldmFudCBkb2MuCisjY3VzdG9tX2ZlYXR1cmVfZ2FsX2xvb2t1cF9leGFjdGx5PTEKKworY3VzdG9tX2ZlYXR1cmVfY21vZGVsX2xvb3BiYWNrPTEKKworI2ZvciBJUHY2VUM6IHVzZSBUY2FtIGluc3RlYWQgb2YgS0FQUworI2N1c3RvbV9mZWF0dXJlX2wzX2lwdjZfdWNfdXNlX3RjYW09MAorIyBpcHY2X21jIG5lZWQgS1BCIGxpYnJhcnkKK2N1c3RvbV9mZWF0dXJlX2lwdjZfbWNfZm9yd2FyZGluZ19kaXNhYmxlID0gMQordmxhbl9tYXRjaF9jcml0ZXJpYV9tb2RlPVBPTl9QQ1BfRVRIRVJUWVBFCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L2RueC5zb2MgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9kbnguc29jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTA2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9kbnguc29jCkBAIC0wLDAgKzEsMTkyIEBACisjCisjICRJZDogamVyLnNvYyx2IDEuOTAgMjAxMy8wOC8xNCAwODozMjowMCBuaW5hc2ggRXhwICQKKyMKKyMgJENvcHlyaWdodDogKGMpIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4kCisjCisKK2RlYnVnIGluZm8KK2RlYnVnIGFwcGwgcmNsb2FkIHdhcm4KK2RlYnVnIGFwcGwgc3ltdGFiIHdhcm4KK2RlYnVnIGJjbSByeCx0eCxsaW5rLGF0dGFjaCB3YXJuCitkZWJ1ZyBzb2MgdGVzdHMgd2FybgorZGVidWcgc29jIHJ4LHBoeSxzY2hhbixyZWcsc29jbWVtLGRtYSxtZW0sbWlpbSxtaWksaW50cixjb3VudGVyLGRkciB3YXJuCitkZWJ1ZyBzb2MgY29tbW9uIGVycgorZGVidWcgc3lzIHZlcmluZXQgd2FybgorZGVidWcgc29jIHBoeXNpbSB3YXJuCisKK2lmICQ/UU1YX0EwIHx8ICQ/QkNNODgzNzBfQTAgfHwgJD9CQ004ODM3MV9BMCB8fCAkP0JDTTg4MzcxTV9BMCB8fCAkP0JDTTg4Mzc1X0EwIHx8ICQ/QkNNODgzNzZfQTAgfHwgJD9CQ004ODM3Nk1fQTAgfHwgJD9CQ004ODM3N19BMCB8fCAkP0JDTTg4Mzc4X0EwIHx8ICQ/QkNNODgzNzlfQTAgfHwgXAorICAgJD9RTVhfQTEgfHwgJD9CQ004ODM3MF9BMSB8fCAkP0JDTTg4MzcxX0ExIHx8ICQ/QkNNODgzNzFNX0ExIHx8ICQ/QkNNODgzNzVfQTEgfHwgJD9CQ004ODM3Nl9BMSB8fCAkP0JDTTg4Mzc2TV9BMSB8fCAkP0JDTTg4Mzc3X0ExIHx8ICQ/QkNNODgzNzhfQTEgfHwgJD9CQ004ODM3OV9BMSB8fFwKKyAgICQ/UU1YX0IwIHx8ICQ/QkNNODgzNzBfQjAgfHwgJD9CQ004ODM3MV9CMCB8fCAkP0JDTTg4MzcxTV9CMCB8fCAkP0JDTTg4Mzc1X0IwIHx8ICQ/QkNNODgzNzZfQjAgfHwgJD9CQ004ODM3Nk1fQjAgfHwgJD9CQ004ODM3N19CMCB8fCAkP0JDTTg4Mzc4X0IwIHx8ICQ/QkNNODgzNzlfQjAgIFwKKyAgICdsb2NhbCBRTVggMScKK2lmICQ/SkVSSUNIT19BMCB8fCAkP0JDTTg4NjcwX0EwIHx8ICQ/QkNNODg2NzFfQTAgfHwgJD9CQ004ODY3MU1fQTAgfHwgJD9CQ004ODY3Ml9BMCB8fCAkP0JDTTg4NjczX0EwIHx8ICQ/QkNNODg2NzRfQTAgfHwgJD9CQ004ODY3NV9BMCB8fCAkP0JDTTg4Njc1TV9BMCB8fCAkP0JDTTg4Njc2X0EwIHx8ICQ/QkNNODg2NzZNX0EwIHx8ICQ/QkNNODg2NzhfQTAgfHwgJD9CQ004ODY3OV9BMCB8fCBcCisgICAkP0pFUklDSE9fQTEgfHwgJD9CQ004ODY3MF9BMSB8fCAkP0JDTTg4NjcxX0ExIHx8ICQ/QkNNODg2NzFNX0ExIHx8ICQ/QkNNODg2NzJfQTEgfHwgJD9CQ004ODY3M19BMSB8fCAkP0JDTTg4Njc0X0ExIHx8ICQ/QkNNODg2NzVfQTEgfHwgJD9CQ004ODY3NU1fQTEgfHwgJD9CQ004ODY3Nl9BMSB8fCAkP0JDTTg4Njc2TV9BMSB8fCAkP0JDTTg4Njc4X0ExIHx8ICQ/QkNNODg2NzlfQTEgfHwgXAorICAgJD9KRVJJQ0hPX0IwIHx8ICQ/QkNNODg2NzBfQjAgfHwgJD9CQ004ODY3MV9CMCB8fCAkP0JDTTg4NjcxTV9CMCB8fCAkP0JDTTg4NjcyX0IwIHx8ICQ/QkNNODg2NzNfQjAgfHwgJD9CQ004ODY3NF9CMCB8fCAkP0JDTTg4Njc1X0IwIHx8ICQ/QkNNODg2NzVNX0IwIHx8ICQ/QkNNODg2NzZfQjAgfHwgJD9CQ004ODY3Nk1fQjAgfHwgJD9CQ004ODY3OF9CMCB8fCAkP0JDTTg4Njc5X0IwIFwKKyAgICdsb2NhbCBKRVJJQ0hPIDEnCitpZiAkP0JDTTg4NjgwX0EwIHx8ICAkP0JDTTg4NjgxX0EwIHx8ICAkP0JDTTg4NjgyX0EwIHx8ICQ/QkNNODg2ODNfQTAgfHwgICQ/QkNNODgzODBfQTAgfHwgICQ/QkNNODgzODFfQTAgXAorICAgJ2xvY2FsIEpFUlBMVVMgMScKKworaWYgJD9CQ004ODY5MF9BMCBcCisgICAnbG9jYWwgSkVSVFdPIDEnCisKK2lmICQ/UU1YIFwKKyAgICAncmNsb2FkIGJjbTg4Mzc1X2JvYXJkLnNvYycKK2lmICQ/SkVSSUNITyBcCisgICAgJ3JjbG9hZCBiY204ODY3NV9ib2FyZC5zb2MnCisKK2lmICQ/SkVSUExVUyBcCisgICAgJ3JjbG9hZCBiY204ODY4MF9ib2FyZC5zb2MnCisKKyMKKyMgRm9yIEplcmljaG8tMjoKKyMgVGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlIHdoZW4gd2UgaGF2ZSBiY204ODY5MF9ib2FyZC5zb2MKKyMKK2lmICQ/SkVSVFdPIFwKKyAgICAncmNsb2FkIGJjbTg4NjgwX2JvYXJkLnNvYycKKworIyBMb2FkIERSQU0gdHVuaW5nIHByb3BlcnRpZXMgZnJvbSBsb2NhbCBGaWxlLiBSY0xvYWQgd2lsbCBub3QgZmFpbCBpZiBmaWxlIG5vdCBmb3VuZCwgYW5kIHdpbGwgbm90IHNob3cgZXJyb3JzIG9mIG1pc3NpbmcgZmlsZS4KK3NldCBSQ0Vycm9yPW9mZgorZGVidWcgYXBwbCBzaGVsbCB3YXJuCitpZiAkP1FNWCBcCisgICAgJ3JjbG9hZCAvaG9tZS9uZWdldi9iY204ODM3NV9kcmFtX3R1bmUuc29jJworCitpZiAkP0pFUklDSE8gXAorICAgICdyY2xvYWQgL2hvbWUvbmVnZXYvYmNtODg2NzVfZHJhbV90dW5lLnNvYycKKworZGVidWcgYXBwbCBzaGVsbCA9CitzZXQgUkNFcnJvcj1vbgorCitzZXQgUkNFcnJvcj1vZmYKK3JjbG9hZCBjb21ibzI4X2RyYW0uc29jCitzZXQgUkNFcnJvcj1vbgorCisjU2V0IGZhYnJpYyBjb25uZWN0IG1vZGUgYXMgRkUgZm9yIG11bHRpIEZBUCBzeXN0ZW0KK2lmICQ/ZGlhZ19jaGFzc2lzICIgXAorICAgY29uZmlnIGFkZCBmYWJyaWNfY29ubmVjdF9tb2RlLkJDTTg4Njc1PUZFIgorCisjIFNldCBtb2RpZDoKKyMgSWYgZGlhZ19jaGFzc2lzIGlzIGVuYWJsZWQgKHR3byBsaW5lIGNhcmRzKSwgYW5kICdzbG90JyBpcyBkZWZpbmVkIChzbG90IGlzIGRlZmluZWQgb25seSB3aGVuCisjIHdvcmtpbmcgd2l0aG91dCBhIG1hbmFnZW1lbnQgY2FyZCAtIHNldCBtb2RpZCB0byBiZSAnc2xvdCcKKyMgT3RoZXJ3aXNlIChzaW5nbGUgbGluZSBjYXJkLCBvciBtYW5hZ2VtZW50IGNhcmQpLCBzZXQgbW9kaWQgdG8gYmUgMCBmb3IgdW5pdCAwLCBhbmQgMSBmb3IgdW5pdCAhPSAwCitpZiAkP2RpYWdfY2hhc3NpcyAmJiAkP3Nsb3QgIlwKKyAgbG9jYWwgbW9kaWQgJHNsb3QiIFwKK2Vsc2UgIlwKKyAgbG9jYWwgbW9kaWQgJHVuaXQiCitleHByICRtb2RpZD09MTsgaWYgJD8gImxvY2FsIG1vZGlkIDIiCisKK2lmICQ/bW9kdWxlX2lkICIgXAorICBsb2NhbCBtb2RpZCAkbW9kdWxlX2lkIgorCitlY2hvICIkdW5pdDogbW9kaWQ9JG1vZGlkIgorCisjIFNldCBiYXNlX21vZGlkOgorIyBJZCBiYXNlX21vZHVsZV9pZCBpcyBzZXQsIHRoZW4gc2V0IGJhc2VfbW9kaWQgdG8gaGF2ZSBiYXNlX21vZHVsZV9pZCB2YWx1ZS4KKyMgT3RoZXJ3aXNlLCBzZXQgYmFzZV9tb2RpZCB0byBiZSAwLgoraWYgJD9iYXNlX21vZHVsZV9pZCAiIFwKKyAgbG9jYWwgYmFzZV9tb2RpZCAkYmFzZV9tb2R1bGVfaWQiIFwKK2Vsc2UgIiBcCisgIGxvY2FsIGJhc2VfbW9kaWQgMCIKKworZXhwciAkYmFzZV9tb2RpZCA+IDAKK2lmICQ/ICIgXAorICBlY2hvICckdW5pdDogYmFzZV9tb2RpZD0kYmFzZV9tb2RpZCciCisKK2lmICQ/ZGlhZ19jaGFzc2lzICIgXAorICBsb2NhbCBub2ZfZGV2aWNlcyAyIiBcCitlbHNlICJcCisgIGxvY2FsIG5vZl9kZXZpY2VzIDEiCisKK2lmICQ/bl9kZXZpY2VzICIgXAorICBsb2NhbCBub2ZfZGV2aWNlcyAkbl9kZXZpY2VzIgorCitleHByICRub2ZfZGV2aWNlcyA+IDEKK2lmICQ/ICIgXAorICBlY2hvICckdW5pdDogbm9mX2RldmljZXM9JG5vZl9kZXZpY2VzJyIKKworaWYgJD9tbmdfY3B1ICIgXAorICBlY2hvICckdW5pdDptYW5hZ2VtZW50IGNhcmQgLSBwb2xsaW5nIGlzIHNldCBvbic7IFwKKyAgY29uZmlnIGFkZCBwb2xsZWRfaXJxX21vZGUuQkNNODg2NzU9MTsgXAorICBjb25maWcgYWRkIHNjaGFuX2ludHJfZW5hYmxlLkJDTTg4Njc1PTA7IFwKKyAgY29uZmlnIGFkZCB0ZG1hX2ludHJfZW5hYmxlLkJDTTg4Njc1PTA7IFwKKyAgY29uZmlnIGFkZCB0c2xhbV9pbnRyX2VuYWJsZS5CQ004ODY3NT0wOyBcCisgIGNvbmZpZyBhZGQgbWlpbV9pbnRyX2VuYWJsZS5CQ004ODY3NT0wOyAiCisKKyNDb3VudGVycyB1bmF2YWlsYWJsZSBpbiBjbW9kZWwKK2lmICQ/Y21vZGVsICIgXAorICBjb25maWcgYWRkIGNvdW50ZXJfZW5naW5lX3NhbXBsaW5nX2ludGVydmFsPTA7IgorCisjZGVmYXVsdCB2YWx1ZXMgaW4gYSBjYXNlIHdoaWNoIHRoZXNlIHBhcmFtZXRlcnMgYXJlIG5vdCBleGlzdAoraWYgISQ/ZGlhZ19jb3NxX2Rpc2FibGUgIlwKKyAgbG9jYWwgZGlhZ19jb3NxX2Rpc2FibGUgMCIKK2lmICEkP3dhcm1ib290ICJcCisgIGxvY2FsIHdhcm1ib290IDAiCitpZiAhJD9kaWFnX2Rpc2FibGUgIlwKKyAgbG9jYWwgZGlhZ19kaXNhYmxlIDAiCitpZiAhJD9kaWFnX25vX2l0bWhfcHJvZ19tb2RlICJcCisgIGxvY2FsIGRpYWdfbm9faXRtaF9wcm9nX21vZGUgMCIKK2lmICEkP2wyX21vZGUgIlwKKyAgbG9jYWwgbDJfbW9kZSAwIgorCitpZiAkP0pFUlBMVVMgIlwKKyAgbG9jYWwgZGlhZ19kaXNhYmxlIDAiCitsb2NhbCBpbml0X290aGVycyBOb0xpbmtzY2FuPTAKK2lmICQ/SkVSUExVUyAiXAorICBsb2NhbCBpbml0X290aGVycyAnTm9JbnRyPTEgTm9MaW5rc2Nhbj0xIE5vQXBwbFN0az0wJyIKKworI0Rpc2FibGUgaW50ZXJydXB0cyBpbiBjbW9kZWwKK2lmICQ/Y21vZGVsICJcCisgIGxvY2FsIG5vX2ludHIgMSIgXAorZWxzZSAiXAorICBsb2NhbCBub19pbnRyIDAiCisKKyMKKyMgRm9yIEplcmljaG8tMiwgd2UgVEVNUE9SQVJJTFkgZGlzYWJsZSBzb21lIGNvbXBvbmVudHMgdG8gcXVpY2tseSBlbmFibGUKKyMgYSB3b3JraW5nIFBDSUQgdmVyc2lvbi4KKyMgCitpZiAkP0pFUlRXTyAiXAorICBsb2NhbCBub19zb2MgMCIKKworaWYgJD9KRVJUV08gIlwKKyAgbG9jYWwgbm9faW50ciAxIgorCisKKyNJTklUX0ROWCBNb2RJRD0kbW9kaWQgTm9mRGV2aWNlcz0kbm9mX2RldmljZXMgQ29zcURpc2FibGU9JGRpYWdfY29zcV9kaXNhYmxlIE5vQXBwbD0kZGlhZ19kaXNhYmxlIFdhcm1ib290PSR3YXJtYm9vdCBOb1J4TG9zPTEgJGluaXRfb3RoZXJzIE5vSXRtaFByb2dNb2RlPSRkaWFnX25vX2l0bWhfcHJvZ19tb2RlIEwyTW9kZT0kbDJfbW9kZSBOb0ludHI9JG5vX2ludHIgTm9Tb2M9JG5vX3NvYworCitJTklUX0ROWAorCisjTEVEIHN1cHBvcnQgc2VjdGlvbiBzdGFydAorI1Byb2dyYW0gb2YgTEVEMAorbG9jYWwgbGVkY29kZV8wICcwMiAwNSA2NyAyRCAwMiAwMSA2NyAyRCAwMiAxMSA2NyAyRCAwMiAwOSA2NyAyRFwKKyAwMiAxNSA2NyAyRCAwMiAwRCA2NyAyRCA4NiBFMCAzQSAwNiAyOCAzMiAwMCAzMlwKKyAwMSBCNyA5NyA3NSAzRSAxNiBFMCBDQSAwNiA3MCAzRSA3NyAzQSA2NyAzMyA3NVwKKyAzQSA3NyAxQyAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyA1NyAzMiAwRlwKKyA4NyA1NycgI3Nkazg4NjcwLmhleAorCisjUHJvZ3JhbSBvZiBMRUQxCitsb2NhbCBsZWRjb2RlXzEgJzAyIDFEIDY3IDJEIDAyIDJEIDY3IDJEIDAyIDA1IDY3IDJEIDAyIDBEIDY3IDJEXAorIDAyIDA5IDY3IDJEIDAyIDAxIDY3IDJEIDg2IEUwIDNBIDA2IDI4IDMyIDAwIDMyXAorIDAxIEI3IDk3IDc1IDNFIDE2IEUwIENBIDA2IDcwIDNFIDc3IDNBIDY3IDMzIDc1XAorIDNBIDc3IDFDIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDU3IDMyIDBGXAorIDg3IDU3JyAjc2RrODg2NzAuaGV4CisKKworI1Byb2dyYW0gb2YgTEVEMgorbG9jYWwgbGVkY29kZV8yICcwMiAwMSA2NyAyRCAwMiAwOSA2NyAyRCAwMiAwRCA2NyAyRCAwMiAwNSA2NyAyRFwKKyAwMiAyRCA2NyAyRCAwMiAxRCA2NyAyRCA4NiBFMCAzQSAwNiAyOCAzMiAwMCAzMlwKKyAwMSBCNyA5NyA3NSAzRSAxNiBFMCBDQSAwNiA3MCAzRSA3NyAzQSA2NyAzMyA3NVwKKyAzQSA3NyAxQyAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyA1NyAzMiAwRlwKKyA4NyA1NycgI3Nkazg4NjcwLmhleAorCisjIERvd25sb2FkIExFRCBjb2RlIGludG8gTEVEIHByb2Nlc3NvcnMgYW5kIGVuYWJsZSAoaWYgYXBwbGljYWJsZSkuCitpZiAkP2ZlYXR1cmVfbGVkX3Byb2MgJiYgISQ/c2ltdWxhdG9yIFwKKyAgICAibGVkIDAgcHJvZyAkbGVkY29kZV8wOyBcCisgICAgIGxlZCAxIHByb2cgJGxlZGNvZGVfMTsgXAorICAgICBsZWQgMiBwcm9nICRsZWRjb2RlXzI7IFwKKyAgICAgbGVkIGF1dG8gb247IFwKKyAgICAgbGVkIDAgc3RhcnQ7IFwKKyAgICAgbGVkIDEgc3RhcnQ7IFwKKyAgICAgbGVkIDIgc3RhcnQiCisKKworZWNobyAiZG54LnNvYzogRG9uZS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIgorCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9kdW5lLnNvYyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L2R1bmUuc29jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjI0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9kdW5lLnNvYwpAQCAtMCwwICsxLDEwODAgQEAKKyMKKyMgJElkOiBkdW5lLnNvYyx2IDEuNSAyMDExLzEyLzIwIDEwOjUzOjI4IHlhcm9ubSBFeHAgJAorIworIyAkQ29weXJpZ2h0OiAoYykgMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorIyBBbGwgUmlnaHRzIFJlc2VydmVkLiQKKyMKKyMgQ29uZmlndXJlIGZhcCBkZXZpY2UgbW9kZSAoVE0vUFAvVERNX09QVElNSVpFRC9URE1fU1RBTkRBUkQpCisjIGFuZCBmdG1oIG91dGxpZiBleHRlbnNpb24gZGVwZW5kaW5nIG9uIGNvbmZpZyB2YXJpYWJsZXMgJ3BhY2tldF9wcm9jZXNzaW5nJyBhbmQgJ3RkbScgdmFyaWFibGVzCitpZiAkP3RkbSAiXAorICBlY2hvICcqKiogVERNIE1PREUgKioqJzsgXAorICBjb25maWcgYWRkIGRpYWdfY29zcV9kaXNhYmxlPTE7IFwKKyAgaWYgISQ/ZmFwX2RldmljZV9tb2RlICdjb25maWcgYWRkIGZhcF9kZXZpY2VfbW9kZT1URE1fU1RBTkRBUkQnOyBcCisgIGNvbmZpZyBhZGQgZmFicmljX2Z0bWhfb3V0bGlmX2V4dGVuc2lvbj1BTFdBWVM7IFwKKyAgY29uZmlnIGV4dF9xZHJfdHlwZT1OT05FOyBcCisgIGNvbmZpZyBleHRfcmFtX3ByZXNlbnQ9MCIKK2lmICEkP3RkbSAmJiAkP3BhY2tldF9wcm9jZXNzaW5nICJcCisgIGVjaG8gJyoqKiBQQUNLRVQgUFJPQ0VTU0lORyBNT0RFICoqKic7IFwKKyAgY29uZmlnIGFkZCBmYWJyaWNfZnRtaF9vdXRsaWZfZXh0ZW5zaW9uPUFMV0FZUzsgXAorICBjb25maWcgYWRkIGZhcF9kZXZpY2VfbW9kZT1QUDsgXAorICBjb25maWcgYWRkIGVncmVzc19lbmNhcF9pcF90dW5uZWxfcmFuZ2VfbWluPTQwOTU7IFwKKyAgY29uZmlnIGFkZCBlZ3Jlc3NfZW5jYXBfaXBfdHVubmVsX3JhbmdlX21heD00MDk1OyBcCisgIGNvbmZpZyBhZGQgbXBsc190dW5uZWxfdGVybV9sYWJlbF9yYW5nZV9taW5fMD0xMDAwOyBcCisgIGNvbmZpZyBhZGQgbXBsc190dW5uZWxfdGVybV9sYWJlbF9yYW5nZV9tYXhfMD0xMDAxOyBcCisgIGNvbmZpZyBhZGQgbXBsc190dW5uZWxfdGVybV9sYWJlbF9yYW5nZV9taW5fMT0xMDAyOyBcCisgIGNvbmZpZyBhZGQgbXBsc190dW5uZWxfdGVybV9sYWJlbF9yYW5nZV9tYXhfMT0xMDAzOyBcCisgIGNvbmZpZyBhZGQgbXBsc190dW5uZWxfdGVybV9sYWJlbF9yYW5nZV9taW5fMj0xMDA0OyBcCisgIGNvbmZpZyBhZGQgbXBsc190dW5uZWxfdGVybV9sYWJlbF9yYW5nZV9tYXhfMj0xMDA1OyBcCisgIGlmICEkP2RpYWdfY29zcV9kaXNhYmxlICdjb25maWcgYWRkIGRpYWdfY29zcV9kaXNhYmxlPTAnOyIKK2lmICEkP3RkbSAmJiAhJD9wYWNrZXRfcHJvY2Vzc2luZyAiXAorICBlY2hvICcqKiogVE0gT05MWSBNT0RFICoqKic7IFwKKyAgY29uZmlnIGFkZCBmYXBfZGV2aWNlX21vZGU9VE07IFwKKyAgY29uZmlnIGFkZCBmYWJyaWNfZnRtaF9vdXRsaWZfZXh0ZW5zaW9uPUlGX01DOyBcCisgIGlmICEkP2RpYWdfY29zcV9kaXNhYmxlICdjb25maWcgYWRkIGRpYWdfY29zcV9kaXNhYmxlPTAnIgorCisjIFdoZW4gbW9yZSB0aGFuIGEgc2luZ2xlIGRldmljZSwgc2V0IGNvbm5lY3QgbW9kZSB0byBGRSBhbmQgbW9kaWQKKyMgdG8gdGhlIHNsb3QgaWQuIEZvciBhIHNpbmdsZSBkZXZpY2UsIHNldCBjb25uZWN0IG1vZGUgdG8gU0lOR0xFX0ZBUAorIyBhbmQgbW9kaWQgdG8gMC4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgc2luZ2xlX2ZhcCwgYWxsIGZhYnJpYy1mYWNpbmcgc2VyZGVzCisjIGxhbmVzIGFyZSBzZXQgaW4gbG9vcGJhY2ssIGZvciBmYWJyaWMgbXVsdGljYXN0IHRvIHdvcmsuCisjIEFsbCBvcHRpb25zIGZvciBmYWJyaWNfY29ubmVjdF9tb2RlIGFyZSBGRS9CQUNLMkJBQ0svTUVTSC9NVUxUSV9TVEFHRV9GRS9TSU5HTEVfRkFQCisKK2lmICEkP2RpYWdfY29zcV9kaXNhYmxlICJjb25maWcgYWRkIGRpYWdfY29zcV9kaXNhYmxlPTAiCitpZiAhJD9zbG90IHx8ICEkP2RpYWdfY2hhc3NpcyAibG9jYWwgc2xvdCAwIgoraWYgISQ/Ym9hcmRfdHlwZV9HRkFfQkkgImxvY2FsIGJvYXJkX3R5cGVfR0ZBX0JJIDEiCitpZiAhJD9ib2FyZF90eXBlX0dGQV9CSV8yICJsb2NhbCBib2FyZF90eXBlX0dGQV9CSV8yIDAiCisKK2lmICQ/ZGlhZ19jaGFzc2lzICIgXAorICBsb2NhbCBub2ZfZGV2aWNlcyAyOyBcCisgIGNvbmZpZyBhZGQgZmFicmljX2Nvbm5lY3RfbW9kZT1GRSIgXAorZWxzZSAiXAorICBsb2NhbCBub2ZfZGV2aWNlcyAxOyBcCisgIGlmICEkP2ZhYnJpY19jb25uZWN0X21vZGUgJ2NvbmZpZyBhZGQgZmFicmljX2Nvbm5lY3RfbW9kZT1TSU5HTEVfRkFQJyIKKyAgIAorI0VuYWJsZSBhbGwgcXVhcnRldHMuIENhbiBiZSBkb25lIHBlciBxdWFydGV0IHVzaW5nIF9OIHN1ZmZpeAorY29uZmlnIGFkZCBwYl9zZXJkZXNfcXJ0dF9hY3RpdmU9MQorCitsb2NhbCBsYW5lX3JhdGVfbmlmIDYyNTAwMDAKK2xvY2FsIGxhbmVfcmF0ZV9jb21fYSA2MjUwMDAwCitpZiAkYm9hcmRfdHlwZV9HRkFfQkkgIlwKKyAgICBsb2NhbCBsYW5lX3JhdGVfZmJyIDUwMDAwMDA7IFwKKyAgICBsb2NhbCBsYW5lX3JhdGVfY29tX2IgMzEyNTAwMDsgXAorICAgIGNvbmZpZyBhZGQgZmFicmljX3JlZl9jbG9jaz0yNTAwMDA7IFwKKyAgICBjb25maWcgYWRkIGNvbWJvX25pZl8wPTE7IFwKKyAgICBjb25maWcgYWRkIGNvbWJvX25pZl8xPTEiIFwKK2Vsc2UgJ1wKKyAgICBsb2NhbCBsYW5lX3JhdGVfZmJyIDYyNTAwMDA7IFwKKyAgICBsb2NhbCBsYW5lX3JhdGVfY29tX2IgNjI1MDAwMDsgXAorICAgIGNvbmZpZyBhZGQgZmFicmljX3JlZl9jbG9jaz0zMTI1MDA7IFwKKyAgICBjb25maWcgYWRkIGNvbWJvX25pZl8wPTA7IFwKKyAgICBjb25maWcgYWRkIGNvbWJvX25pZl8xPTA7IFwKKyAgICBmb3IgaT0zMiw1OSBcJ2NvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tZWRpYV90eXBlXyRpPUNISVAyQ0hJUFwnJworCisjIE5pZiBzZXJkZXMgcXVhcnRldHMKK2ZvciBpPTAsMiAnY29uZmlnIGFkZCBwYl9zZXJkZXNfcXJ0dF9tYXhfZXhwZWN0ZWRfcmF0ZV8kaT0kbGFuZV9yYXRlX25pZicKK2ZvciBpPTQsNiAnY29uZmlnIGFkZCBwYl9zZXJkZXNfcXJ0dF9tYXhfZXhwZWN0ZWRfcmF0ZV8kaT0kbGFuZV9yYXRlX25pZicKKworIyBOaWYgc2VyZGVzIHF1YXJ0ZXQgKGNvbWJvLWEpCitjb25maWcgYWRkIHBiX3NlcmRlc19xcnR0X21heF9leHBlY3RlZF9yYXRlXzM9JGxhbmVfcmF0ZV9jb21fYQorCisjIE5pZiBzZXJkZXMgcXVhcnRldCAoY29tYm8tYikKK2NvbmZpZyBhZGQgcGJfc2VyZGVzX3FydHRfbWF4X2V4cGVjdGVkX3JhdGVfNz0kbGFuZV9yYXRlX2NvbV9iCisKKyMgRmFicmljIHNlcmRlcyBxdWFydGV0cworZm9yIGk9OCwxNCAnY29uZmlnIGFkZCBwYl9zZXJkZXNfcXJ0dF9tYXhfZXhwZWN0ZWRfcmF0ZV8kaT0kbGFuZV9yYXRlX2ZicicKKworIyBzZXQgZGVmYXVsdCByYXRlIHRvIG5pZiByYXRlLiBPdmVycmlkZSBmYWJyaWMgbGFuZXMuCitjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3JhdGU9JGxhbmVfcmF0ZV9uaWYKK2ZvciBpPTEyLDE1ICdjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3JhdGVfJGk9JGxhbmVfcmF0ZV9jb21fYScKK2ZvciBpPTI4LDMxICdjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3JhdGVfJGk9JGxhbmVfcmF0ZV9jb21fYicKK2ZvciBpPTMyLDU5ICdjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3JhdGVfJGk9JGxhbmVfcmF0ZV9mYnInCisKKyMgQm9hcmQgVHlwZSBjb25maWd1cmF0aW9uLgorCitpZiAkYm9hcmRfdHlwZV9HRkFfQkkgIlwKKyAgICBlY2hvIENvbmZpZ3VyZSBHRkFfQkkgUG9ydC9JbnRlcmZjYWUvTmlmL1NlckRlcyBwYXJhbWV0ZXJzOyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzE9UlhBVUk3OyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzI9UlhBVUk2OyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzM9WEFVSTc7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfND1SWEFVSTA7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfNT1SWEFVSTI7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfNj1SWEFVSTQ7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfNz1SWEFVSTEyOyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0Xzg9UlhBVUkxMDsgXAorICAgIGNvbmZpZyBhZGQgdWNvZGVfcG9ydF85PVJYQVVJODsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF85PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfMjk9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF8xMz0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4XzE4PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfMjI9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF8zMD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4XzMxPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudD0yMzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aD0yMDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoPTIwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzEyPTMwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fMTI9MTg7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzEyPTM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF8xMj0xMzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfMTM9MzA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl8xMz0xODsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfMTM9MzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzEzPTEzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF8xND0zMDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzE0PTE4OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV8xND0zOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfMTQ9MTM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzE1PTMwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fMTU9MTg7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzE1PTM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF8xNT0xMzsiCisgICAgCitpZiAkYm9hcmRfdHlwZV9HRkFfQkkgIlwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zPTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zPTE1OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM9MTg7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8xMj0yMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMTI9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzEyPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMTI9ODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMTI9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8xMz0xODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMTM9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzEzPTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMTM9NDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMTM9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8xND0xNzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMTQ9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzE0PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMTQ9NDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMTQ9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8xNT0xOTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMTU9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzE1PTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMTU9MDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMTU9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8yOD0xMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMjg9MDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzI4PTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMjg9MDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMjg9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8yOT0xMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMjk9MDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzI5PTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMjk9MDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMjk9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zMD0xMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzA9MDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzMwPTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzA9MDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzA9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zMT0xMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzE9MDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzMxPTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzE9MDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzE9MTsiCisgICAgCisjIFRYIHBhcmFtcyBmb3IgZmFicmljIHJhdGUgb2YgNTAwMCBtYnBzIChOZWdldiBzeXN0ZW0pLgorIyBPdmVycmlkZXMgbWVkaWEgdHlwZSBjb25maWd1cmF0aW9uLgoraWYgJGJvYXJkX3R5cGVfR0ZBX0JJICJcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF8zMj0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzMyPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV8zMj0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfMzI9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfMzM9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl8zMz0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfMzM9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzMzPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzM0PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fMzQ9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzM0PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF8zND0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF8zNT0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzM1PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV8zNT0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfMzU9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfMzY9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl8zNj0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfMzY9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzM2PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzM3PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fMzc9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzM3PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF8zNz0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF8zOD0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzM4PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV8zOD0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfMzg9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfMzk9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl8zOT0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfMzk9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzM5PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzQwPTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNDA9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzQwPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF80MD0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF80MT0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzQxPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV80MT0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNDE9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNDI9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl80Mj0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNDI9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzQyPTAiCitpZiAkYm9hcmRfdHlwZV9HRkFfQkkgIlwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzQzPTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNDM9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzQzPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF80Mz0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF80ND0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzQ0PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV80ND0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNDQ9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNDU9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl80NT0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNDU9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzQ1PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzQ2PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNDY9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzQ2PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF80Nj0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF80Nz0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzQ3PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV80Nz0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNDc9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNDg9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl80OD0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNDg9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzQ4PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzQ5PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNDk9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzQ5PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF80OT0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF81MD0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzUwPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV81MD0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNTA9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNTE9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl81MT0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNTE9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzUxPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzUyPTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNTI9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzUyPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF81Mj0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF81Mz0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzUzPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV81Mz0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNTM9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNTQ9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl81ND0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNTQ9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzU0PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzU1PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNTU9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzU1PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF81NT0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF81Nj0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzU2PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV81Nj0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNTY9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNTc9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl81Nz0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNTc9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzU3PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzU4PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNTg9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzU4PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF81OD0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF81OT0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzU5PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV81OT0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNTk9MDsiCisKKyMgUlggcGFyYW1zIGZvciBmYWJyaWMgcmF0ZSBvZiA1MDAwIG1icHMgKE5lZ2V2IHN5c3RlbSkKK2lmICRib2FyZF90eXBlX0dGQV9CSSAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzMyPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzMyPTI7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzMyPTIxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzI9MzU7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzI9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzMzPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzMzPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzMzPTI4OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzM9MTY7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzM9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM0PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM0PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM0PTE4OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzQ9MjY7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzQ9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM1PTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM1PTI7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM1PTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzU9MTQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzU9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM2PTIyOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM2PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM2PTIyOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzY9MzA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzY9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM3PTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM3PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM3PTIwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzc9MTQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzc9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM4PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM4PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM4PTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzg9Mjk7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzg9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM5PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM5PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM5PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzk9MzA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzk9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQwPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQwPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQwPTIxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDA9MzM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDA9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQxPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQxPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQxPTIwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDE9NjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80MT0xOyIKK2lmICRib2FyZF90eXBlX0dGQV9CSSAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQyPTIwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQyPTM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQyPTE4OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDI9MzM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDI9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQzPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQzPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQzPTI2OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDM9MzM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDM9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ0PTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQ0PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ0PTIyOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDQ9MzQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDQ9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ1PTIyOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQ1PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ1PTE4OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDU9MTY7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDU9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ2PTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQ2PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ2PTIxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDY9Mjg7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDY9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ3PTIwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQ3PTI7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ3PTE2OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDc9OTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80Nz0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDg9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDg9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDg9MjM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80OD0zMzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80OD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDk9MjM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDk9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDk9Mjg7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80OT0xMjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80OT0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTA9MjM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTA9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTA9MjQ7IgoraWYgJGJvYXJkX3R5cGVfR0ZBX0JJICJcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTA9MTk7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTA9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzUxPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUxPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzUxPTIyOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTE9MjA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTE9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzUyPTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUyPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzUyPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTI9MzM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTI9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzUzPTIwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUzPTQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzUzPTEwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTM9NTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81Mz0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTQ9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTQ9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTQ9Mjk7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81ND0yNTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81ND0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTU9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTU9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTU9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81NT0yMjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81NT0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTY9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTY9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTY9MjI7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81Nj0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81Nj0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTc9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTc9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTc9MjI7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81Nz0yNTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81Nz0xOyIKKworaWYgJGJvYXJkX3R5cGVfR0ZBX0JJICJcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTg9MjM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTg9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTg9MjM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81OD0yNjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81OD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTk9MjM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTk9MjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTk9MjE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81OT0yNTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81OT0xOyIKKworaWYgJGJvYXJkX3R5cGVfR0ZBX0JJXzIgIlwKKyAgICBlY2hvIENvbmZpZ3VyZSBHRkFfQklfMiBQb3J0L0ludGVyZmNhZS9OaWYvU2VyRGVzIHBhcmFtZXRlcnM7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfMT1SWEFVSTM7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfMj1SWEFVSTI7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfMz1SWEFVSTE7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfND1SWEFVSTA7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfNT1SWEFVSTg7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfNj1SWEFVSTk7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfNz1SWEFVSTU7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfOD1SWEFVSTQ7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfOT1SWEFVSTEyOyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzEwPVJYQVVJMTM7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfMTE9UlhBVUkxMDsgXAorICAgIGNvbmZpZyBhZGQgdWNvZGVfcG9ydF8xMj1SWEFVSTExOyBcCisgICAgY29uZmlnIGFkZCBsYW5lc19zd2FwXzY9MTsgXAorICAgIGNvbmZpZyBhZGQgbGFuZXNfc3dhcF8xMD0xOyBcCisgICAgY29uZmlnIGFkZCBsYW5lc19zd2FwXzExPTE7IFwKKyAgICBjb25maWcgYWRkIGxhbmVzX3N3YXBfMTI9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF8xMj0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4XzE0PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfMjg9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF8zMT0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4XzMyPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfMzQ9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF80MT0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4XzQ4PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfNTA9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF81Mj0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4XzU1PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfNTY9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF81OD0xOyIKKyAgICAKK2lmICRib2FyZF90eXBlX0dGQV9CSV8yICYmICEkc3lzdGVtX2lzX2ZlNjAwX2luX3N5c3RlbSAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250PTIxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aD04OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wPTMwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluPTE4OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmU9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdD0xMzsiCisKKyNHRkEtQkkyLCB3aXRoIGZlNjAwLCBzbG90IDAKK2lmICRib2FyZF90eXBlX0dGQV9CSV8yICYmICRzeXN0ZW1faXNfZmU2MDBfaW5fc3lzdGVtICYmICEkc2xvdCAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzEyPTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8xMj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMTI9MTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMTI9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMTI9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8xMz0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMTM9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzEzPTE3OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzEzPTc7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzEzPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMTQ9MTg7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzE0PTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8xND03OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzE0PTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzE0PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMTU9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzE1PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8xNT0yMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8xNT0yMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMTU9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8yOD0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMjg9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzI4PTE4OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzI4PTg7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzI4PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMjk9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzI5PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8yOT05OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzI5PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzI5PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzA9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzMwPTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zMD0xODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zMD0xMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzA9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zMT0yMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzE9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzMxPTEwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzMxPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzMxPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzI9MjM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzMyPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zMj0yMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zMj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zMj0xIgoraWYgJGJvYXJkX3R5cGVfR0ZBX0JJXzIgJiYgJHN5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0gJiYgISRzbG90ICJcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzM9MjM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzMzPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zMz0xMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zMz00OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zMz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM0PTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zND0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzQ9MjA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzQ9MzA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM0PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzU9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM1PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zNT0xMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zNT01OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zNT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM2PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zNj0wOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzY9MTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzY9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzY9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zNz0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzc9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM3PTEwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM3PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM3PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzg9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM4PTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zOD0yMDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zOD0xMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzg9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zOT0yMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzk9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM5PTk7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzk9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzk9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80MD0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDA9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQwPTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQwPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQwPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDE9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQxPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80MT05OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQxPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQxPTEiCitpZiAkYm9hcmRfdHlwZV9HRkFfQklfMiAmJiAkc3lzdGVtX2lzX2ZlNjAwX2luX3N5c3RlbSAmJiAhJHNsb3QgIlwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80Mj0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDI9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQyPTEwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQyPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQyPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDM9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQzPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80Mz0yNTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80Mz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80Mz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ0PTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80ND0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDQ9OTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80ND0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80ND0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ1PTIyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80NT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDU9MTg7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDU9MTY7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQ1PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDY9MjE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQ2PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80Nj05OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQ2PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQ2PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDc9MjE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQ3PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80Nz0xMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80Nz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80Nz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ4PTIxOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80OD0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDg9ODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80OD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80OD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ5PTIxOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80OT0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDk9MTU7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDk9MTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQ5PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTA9MjM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUwPTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81MD0xNzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81MD0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81MD0xIgoraWYgJGJvYXJkX3R5cGVfR0ZBX0JJXzIgJiYgJHN5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0gJiYgISRzbG90ICJcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTE9MjI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUxPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81MT04OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzUxPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzUxPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTI9MTc7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUyPTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81Mj02OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzUyPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzUyPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTM9MjI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUzPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81Mz0xMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81Mz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81Mz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU0PTIxOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81ND0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTQ9NTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81ND0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81ND0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU1PTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81NT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTU9MTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTU9NDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTU9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81Nj0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTY9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU2PTIwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzU2PTIxOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81Nj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU3PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81Nz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTc9MTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTc9NzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTc9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81OD0xOTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTg9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU4PTExOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzU4PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzU4PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTk9MjI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU5PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81OT0xMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81OT0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81OT0xIgorCisjR0ZBLUJJMiwgd2l0aCBmZTYwMCwgc2xvdCAxCitpZiAkYm9hcmRfdHlwZV9HRkFfQklfMiAmJiAkc3lzdGVtX2lzX2ZlNjAwX2luX3N5c3RlbSAmJiAkc2xvdCAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzEyPTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8xMj0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMTI9OTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8xMj0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8xMj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzEzPTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8xMz00OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMTM9MjA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMTM9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMTM9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8xND0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMTQ9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzE0PTk7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMTQ9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMTQ9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8xNT0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMTU9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzE1PTEwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzE1PTk7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzE1PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMjg9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzI4PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8yOD0xNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8yOD00OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8yOD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzI5PTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8yOT0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMjk9OTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8yOT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8yOT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzMwPTIyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zMD0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzA9NjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zMD00OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zMD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzMxPTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zMT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzE9MTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzE9ODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzE9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zMj0yMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzI9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzMyPTE5OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzMyPTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzMyPTEiCitpZiAkYm9hcmRfdHlwZV9HRkFfQklfMiAmJiAkc3lzdGVtX2lzX2ZlNjAwX2luX3N5c3RlbSAmJiAkc2xvdCAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzMzPTIyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zMz0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzM9MTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzM9MTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzMzPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzQ9MjI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM0PTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zND0xNzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zND0yMDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzQ9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zNT0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzU9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM1PTEyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM1PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM1PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzY9MjI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM2PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zNj0xMDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zNj00OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zNj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM3PTIyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zNz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzc9MTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzc9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzc9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zOD0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzg9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM4PTIwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM4PTE0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zOD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM5PTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zOT0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzk9MTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzk9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzk9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80MD0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDA9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQwPTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQwPTE4OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80MD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQxPTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80MT0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDE9MTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDE9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDE9MSIKK2lmICRib2FyZF90eXBlX0dGQV9CSV8yICYmICRzeXN0ZW1faXNfZmU2MDBfaW5fc3lzdGVtICYmICRzbG90ICJcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDI9MjE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQyPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80Mj0xMDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80Mj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80Mj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQzPTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80Mz00OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDM9MjI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDM9NDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDM9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80ND0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDQ9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ0PTc7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDQ9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDQ9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80NT0yMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDU9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ1PTE4OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQ1PTE2OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80NT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ2PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80Nj0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDY9OTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80Nj0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80Nj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ3PTIyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80Nz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDc9OTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80Nz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80Nz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ4PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80OD0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDg9ODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80OD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80OD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ5PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80OT0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDk9MTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDk9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDk9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81MD0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTA9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzUwPTE4OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzUwPTExOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81MD0xIgoraWYgJGJvYXJkX3R5cGVfR0ZBX0JJXzIgJiYgJHN5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0gJiYgJHNsb3QgIlwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81MT0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTE9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzUxPTc7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTE9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTE9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81Mj0yMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTI9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzUyPTg7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTI9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTI9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81Mz0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTM9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzUzPTEyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzUzPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzUzPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTQ9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU0PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81ND03OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzU0PTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzU0PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTU9MjM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU1PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81NT0xMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81NT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81NT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU2PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81Nj0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTY9MjE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTY9MTY7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzU2PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTc9MjM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU3PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81Nz04OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzU3PTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzU3PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTg9MTc7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU4PTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81OD04OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzU4PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzU4PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTk9MjE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU5PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81OT0xNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81OT0xMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTk9MSIKKyAKKyMgRFJBTSBwcmUtY29uZmlndXJhdGlvbnMgYWNjb3JkaW5nIHRvIGNvbmZpZyB2YXJpYWJsZXMgd2hpY2ggZGVmaW5lcworIyB0aGUgZHJhbSB0eXBlLgorCisjRERSMworaWYgJD9kcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjFHMTY0NkVfSENLMF8xMzMzIHx8IFwKKyAgICQ/ZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZFX0hDSzBfMTYwMCB8fCBcCisgICAkP2RyYW1fdHlwZV9ERFIzX01JQ1JPTl9NVDQxSjY0TTE2XzE1RSB8fCBcCisgICAkP2RyYW1fdHlwZV9ERFIzX01JQ1JPTl9NVDQxSjEyOE0xNkhBXzE1RV8yRyAiXAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUREUjM7IFwKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz0xMDI0OyBcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTgiIAoraWYgJD9kcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoxMjhNMTZIQV8xNUVfMkcgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RvdGFsX3NpemU9MzA3MiIKK2lmICQ/ZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZFX0hDSzBfMTMzMyB8fCBcCisgICAkP2RyYW1fdHlwZV9ERFIzX1NBTVNVTkdfSzRCMUcxNjQ2RV9IQ0swXzE2MDAgfHwgXAorICAgJD9kcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUo2NE0xNl8xNUUgIlwKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdG90YWxfc2l6ZT0xNTM2IgorCisjR0REUjMKK2lmICQ/ZHJhbV90eXBlX0dERFIzX1NBTVNVTkdfSzRKNTIzMjRRRSBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1HRERSMyIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9NTEyIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9OCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RvdGFsX3NpemU9Mzg0IgorCisjRERSMgoraWYgJD9kcmFtX3R5cGVfRERSMl9NSUNST05fSzRUNTExNjNRRV9aQ19MRjcgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9RERSMiIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9MTAyNCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTQiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90b3RhbF9zaXplPTc2OCIKKyAgIAoraWYgJD9kcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjFHMTY0NkVfSENLMF8xNjAwIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9hcF9iaXRfcG9zPTEwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fYnVyc3Rfc2l6ZT0zMiIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTEiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9OCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDg3NTAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0xMTAwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zNTAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTQwMDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTM3NTAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xMzc1MCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkPTc1MDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0zOTAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xMzc1MCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTUwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cj03NTAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9ydHA9NzUwMCIKKworaWYgJD9kcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjFHMTY0NkVfSENLMF8xMzMzIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9hcF9iaXRfcG9zPTEwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fYnVyc3Rfc2l6ZT0zMiIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9OSIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT04IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yYz01MDAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTExMDAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTM2NjY2IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9NDUwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xNTAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTE1MDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9ycmQ9ODMzMyIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTM5MDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE1MDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNTAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyPTgzMzMiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cD02NjY2IgorCitpZiAkP2RyYW1fdHlwZV9ERFIzX01JQ1JPTl9NVDQxSjY0TTE2XzE1RSB8fCAkP2RyYW1fdHlwZV9ERFIzX01JQ1JPTl9NVDQxSjEyOE0xNkhBXzE1RV8yRyBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fYXBfYml0X3Bvcz0xMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2J1cnN0X3NpemU9MzIiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTkiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9NyIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDk1MDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0xMTAwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zNjAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTUwMDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTM1MDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xMzUwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkPTc1MDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0zOTAwYyIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTM1MDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE1MDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF93dHI9NzUwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwPTc1MDAiCisKKyMgU2Ftc3VuZyAoSzRKNTIzMjRRRSkKKyMgVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGNvcnJlc3BvbmQgdG8gQkMtMTYgZGFzaCwgYW5kIHdlcmUgdGVzdGVkIGluCisjIGR1bmUncyBsYWIgd2l0aCBCQy0xNCBkYXNoIGRyYW0gd29ya2luZyBpbiBmcmVxdWVuY3kgb2YgNTMzTUh6LgoraWYgJD9kcmFtX3R5cGVfR0REUjNfU0FNU1VOR19LNEo1MjMyNFFFIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9hcF9iaXRfcG9zPTgiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9idXJzdF9zaXplPTE2IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fZ2RkcjNfbXJzMF93cjE9MHgwMDAwMDMxMiIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2dkZHIzX2VtcjBfd3IxPTB4MDAwMDEwOWQiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTkiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9MSIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmNfY2xrPTI0IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yZmNfY2xrPTI5IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yYXNfY2xrPTE2IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9mYXdfY2xrPTUiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZF9jbGs9OSIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyX2Nsaz02IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfY2xrPTciIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0xNDUwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9ycF9jbGs9OCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3Rfd3JfY2xrPTgiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9jbGs9NCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2Nsaz00IgorCitpZiAkP2RyYW1fdHlwZV9ERFIyX01JQ1JPTl9LNFQ1MTE2M1FFX1pDX0xGNyBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fYXBfYml0X3Bvcz0xMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2J1cnN0X3NpemU9MTYiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9hdXRvX21vZGU9VFJVRSIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9NiIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT01IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yYz02MDAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTEwNTAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTQ1MDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9NDUwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xNTAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTE1MDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9ycmQ9MTAwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0zOTAwKSIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTUwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE1MDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF93dHI9NzUwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwPTc1MDAiCisKKworIyBJZiB1c2luZyBlbGssIG92ZXJyaWRlIHJlbGV2YW50IHBhcmFtZXRlcnM6CitpZiAkP3BjcF9lbGsgIlwKKyAgZWNobyAqKiogT1ZFUlJJRElORyBERUZBVUxUIENPTkZJRyBXSVRIIEVMSyBDT05GSUcgKioqOyBcCisgIGNvbmZpZyBjb21ib19yZWZfY2xvY2s9MTI1MDAwOyBcCisgIGNvbmZpZyBwYl9zZXJkZXNfcXJ0dF9tYXhfZXhwZWN0ZWRfcmF0ZV83PTM3NTAwMDA7IFwKKyAgY29uZmlnIHBiX3NlcmRlc19sYW5lX3JhdGVfMjg9Mzc1MDAwMDsgXAorICBjb25maWcgcGJfc2VyZGVzX2xhbmVfcmF0ZV8yOT0zNzUwMDAwOyBcCisgIGNvbmZpZyBwYl9zZXJkZXNfbGFuZV9yYXRlXzMwPTM3NTAwMDA7IFwKKyAgY29uZmlnIHBiX3NlcmRlc19sYW5lX3JhdGVfMzE9Mzc1MDAwMDsgXAorICBjb25maWcgYWRkIGV4dGVybmFsX2xvb2t1cF9tYWw9MTQ7IFwKKyAgY29uZmlnIGFkZCBzcGF1aV9pcGdfZGljX21vZGU9TUlOOyBcCisgIGNvbmZpZyBhZGQgc3BhdWlfaXBnX3NpemU9MTsgXAorICBjb25maWcgYWRkIHNwYXVpX2NyY19tb2RlPTMyYjsgXAorICBjb25maWcgYWRkIHNwYXVpX3ByZWFtYmxlX3NpemU9MDsgXAorICBjb25maWcgYWRkIHNwYXVpX3ByZWFtYmxlX3NraXBfc29wPTE7IFwKKyAgY29uZmlnIGFkZCBzcGF1aV9pc19kb3VibGVfc2l6ZV9zb3BfZXZlbl9vbmx5PTE7IFwKKyAgY29uZmlnIGFkZCBzcGF1aV9saW5rX3BhcnRuZXJfZG91YmxlX3NpemVfYnVzPTEiCisKK2lmICQ/cGNwX2VsayB8fCAkP3BjcF9vYW0gfHwgJD9wY3BfZG1hICJcCisgIGNvbmZpZyBhZGQgc3RyZWFtaW5nX2lmX211bHRpX3BvcnRfbW9kZT0xOyBcCisgIGNvbmZpZyBhZGQgc3RyZWFtaW5nX2lmX2Rpc2NhcmRfcGt0X3N0cmVhbWluZz0wOyBcCisgIGNvbmZpZyBhZGQgZmFicmljX2Z0bWhfb3V0bGlmX2V4dGVuc2lvbj1JRl9NQyIgXAorZWxzZSAiXAorICBjb25maWcgYWRkIHN0cmVhbWluZ19pZl9tdWx0aV9wb3J0X21vZGU9MDsgXAorICBjb25maWcgYWRkIHN0cmVhbWluZ19pZl9kaXNjYXJkX3BrdF9zdHJlYW1pbmc9MTsiCisKKyMgUnVuIHN3ZWVwIHBjcCBvbiByZWFsIEhXCitpZiAhJD9wbGlzaW0gJiYgISQ/d2FybWJvb3QgIiAgIFwKKyAgc3dlZXAgcGNwIgorICAKKyMgU2V0IHN5bnRzIGFjY29yZGluZyB0byByZWZlcmVuY2UgY2xvY2tzCitleHByICRuaWZfcmVmX2Nsb2NrKjEwMDA7IGxvY2FsIHN5bnRfbmlmICQ/CitleHByICRjb21ib19yZWZfY2xvY2sqMTAwMDsgbG9jYWwgc3ludF9jb21ibyAkPworZXhwciAkZmFicmljX3JlZl9jbG9jayoxMDAwOyBsb2NhbCBzeW50X2ZhYnJpYyAkPworCisjIFJlYWwgSFc6IFRha2UgcGV0cmEgb3V0IG9mIHJlc2V0CitpZiAhJD9wbGlzaW0gJiYgISQ/d2FybWJvb3QgIiBcCisgIGdmYV9iaSB1dGlscyBwZXRyYV9yZXNldCAxOyBcCisgIGVjaG8gQ29uZmlndXJlIHN5bnRoZXNpemVyczo7IFwKKyAgZWNobyBGYWJyaWM6ICRzeW50X2ZhYnJpYzsgZ2ZhX2JpIHV0aWxzIHN5bnRfc2V0IDEgJHN5bnRfZmFicmljICRzeW50X292ZXI7IFwKKyAgZWNobyBDb21ibzogICRzeW50X2NvbWJvOyAgZ2ZhX2JpIHV0aWxzIHN5bnRfc2V0IDIgJHN5bnRfY29tYm8gJHN5bnRfb3ZlcjsgXAorICBlY2hvIE5pZjogICAgJHN5bnRfbmlmOyAgICBnZmFfYmkgdXRpbHMgc3ludF9zZXQgMyAkc3ludF9uaWYgJHN5bnRfb3ZlcjsgXAorICBlY2hvIENvcmU6ICAgJHN5bnRfY29yZTsgICBnZmFfYmkgdXRpbHMgc3ludF9zZXQgNCAkc3ludF9jb3JlICRzeW50X292ZXI7IFwKKyAgZWNobyBERFI6ICAgICRzeW50X2RkcjsgICAgZ2ZhX2JpIHV0aWxzIHN5bnRfc2V0IDUgJHN5bnRfZGRyICRzeW50X292ZXI7IFwKKyAgZWNobyBQaHk6ICAgICRzeW50X3BoeTsgICAgZ2ZhX2JpIHV0aWxzIHN5bnRfc2V0IDEwICRzeW50X3BoeSAkc3ludF9vdmVyOyBcCisgIGdmYV9iaSB1dGlscyBwZXRyYV9yZXNldCAwIgorICAKK2RibSBzb2MgZXJyb3IKK2RibSBiY20gZXJyb3IKKworZWNobyAiJHVuaXQ6aW5pdCBzb2MiCitpbml0IHNvYworZWNobyAiJHVuaXQ6aW5pdCBzb2MgLSBEb25lIgorCitlY2hvICIkdW5pdDppbml0IGJjbSIKK2luaXQgYmNtCisKK2VjaG8gIiR1bml0OmluaXQgYmNtIC0gRG9uZSIKKworaWYgJD93YXJtYm9vdCAiXAorICBlY2hvICdXYXJtYm9vdDogaW5pdCBkb25lJzsgXAorICBlY2hvICdkdW5lLnNvYzogRG9uZS4nOyBcCisgIGV4aXQiCisKKyMgUmVhbCBIVyArIG5vbiB1c2luZyBzd2VlcDogSW5pdCBwaHlzCitpZiAhJD9wbGlzaW0gIiBcCisgIGdmYV9iaSB1dGlscyBwaHlzIgorCitpZiAhJD9ub19iY20gJiYgISQ/ZGlhZ19kaXNhYmxlICJcCisgIGluaXQgYXBwbF9kcHAgJHNsb3QgJG5vZl9kZXZpY2VzICRkaWFnX2Nvc3FfZGlzYWJsZTsiIFwKK2Vsc2UgIlwKKyAgZWNobyAnU2tpcHBpbmcgZGlhZ19pbml0LiBJbiBvcmRlciB0byBydW4gdHJhZmZpYywgZXh0cmEgY29uZmlndXJhdGlvbiBtdXN0IGJlIHBlcmZvcm1lZC4nIgorCisjIElmIHJ1bm5pbmcgQkNNIGxpYnJhcnk6CisjIFN0YXJ0IGxpbmtzY2FuIHRhc2sgYW5kIHNldCBwb3J0IGxpbmtzY2FuIG1vZGUuCitpZiAhJD9ub19iY20gJiYgISQ/cGNwX2VsayAiXAorICBsaW5rc2NhbiAyNTAwMDA7IFwKKyAgbGlua3NjYW4gc3BibT14ZSIKKyAgICAgCisjIElmIHVzaW5nIGVsaywgY29uZmlndXJlICBic3A6CitpZiAkP3BjcF9lbGsgIlwKKyAgZWNobyAqKiogQlNQIEVMSyBDT05GSUdVUkFUSU9OUyAqKio7IFwKKyAgZ2ZhX2JpIGVsa19pbml0OyIKKyAgCisjIElmIHVzaW5nIHBjcCBkbWEgdGhlbiBpbml0IGRtYQoraWYgISQ/cGxpc2ltICYmICQ/cGNwX2RtYSAiIFwKKyAgZWNobyAqKiogUENQIERNQSBDT05GSUdVUkFUSU9OUyAqKio7IFwKKyAgZ2ZhX2JpIGRtYV9pbml0IgorCisjaWYgJD9kaWFnX2NoYXNzaXMgJiYgISRzbG90ICJyY2xvYWQgcmMvbmVnZXZfcnBjX21hc3Rlci5zb2MuYXNzaSIgIyBNYXN0ZXIgb24gc2xvdCAwCisjaWYgJD9kaWFnX2NoYXNzaXMgJiYgJHNsb3QgInJjbG9hZCByYy9uZWdldl9ycGNfc2xhdmUuc29jLmFzc2kiICAgIyBTbGF2ZSBvbiBzbG90IDEKKworZWNobyAiZHVuZS5zb2M6IERvbmUuIgpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvaW5pdC5zaCBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L2luaXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjViNjJiZgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L2luaXQuc2gKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vYmFzaAorCitlY2hvICJJIGFtIGhlcmUgNCIKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvcWF4LnNvYyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L3FheC5zb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODk1YWU4MQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L3FheC5zb2MKQEAgLTAsMCArMSwxMjggQEAKKyMKKyMgJElkOiBxYXguc29jLHYgMS45MCAyMDEzLzA4LzE0IDA4OjMyOjAwIG5pbmFzaCBFeHAgJAorIworIyAkQ29weXJpZ2h0OiAoYykgMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorIyBBbGwgUmlnaHRzIFJlc2VydmVkLiQKKyMKKworIyBMb2FkIERSQU0gdHVuaW5nIHByb3BlcnRpZXMgZnJvbSBsb2NhbCBGaWxlLiBSY0xvYWQgd2lsbCBub3QgZmFpbCBpZiBmaWxlIG5vdCBmb3VuZCwgYW5kIHdpbGwgbm90IHNob3cgZXJyb3JzIG9mIG1pc3NpbmcgZmlsZS4KKyNkZXIgMHg0MCA0CisjZXhpdAorCitkZWJ1ZyBpbmZvCitkZWJ1ZyBhcHBsIHJjbG9hZCB3YXJuCitkZWJ1ZyBhcHBsIHN5bXRhYiB3YXJuCitkZWJ1ZyBiY20gcngsdHgsbGluayxhdHRhY2ggd2FybgorZGVidWcgc29jIHRlc3RzIHdhcm4KK2RlYnVnIHNvYyByeCxwaHksc2NoYW4scmVnLHNvY21lbSxkbWEsbWVtLG1paW0sbWlpLGludHIsY291bnRlcixkZHIgd2FybgorZGVidWcgc29jIGNvbW1vbiBlcnIKK2RlYnVnIHN5cyB2ZXJpbmV0IHdhcm4KK2RlYnVnIHNvYyBwaHlzaW0gd2FybgorCitpZiAkP1FBWCBcCisgICAgJ3JjbG9hZCBiY204ODQ3MF9ib2FyZC5zb2MnCisKK2lmICQ/UVVYIFwKKyAgICAncmNsb2FkIGJjbTg4MjcwX2JvYXJkLnNvYycKKworIyBMb2FkIERSQU0gdHVuaW5nIHByb3BlcnRpZXMgZnJvbSBsb2NhbCBGaWxlLiBSY0xvYWQgd2lsbCBub3QgZmFpbCBpZiBmaWxlIG5vdCBmb3VuZCwgYW5kIHdpbGwgbm90IHNob3cgZXJyb3JzIG9mIG1pc3NpbmcgZmlsZS4KK3NldCBSQ0Vycm9yPW9mZgorZGVidWcgYXBwbCBzaGVsbCB3YXJuCitpZiAkP1FBWCBcCisgICAgJ3JjbG9hZCAvaG9tZS9uZWdldi9iY204ODQ3MF9kcmFtX3R1bmUuc29jJworaWYgJD9RVVggXAorICAgICdyY2xvYWQgL2hvbWUvbmVnZXYvYmNtODgyNzBfZHJhbV90dW5lLnNvYycKKworZGVidWcgYXBwbCBzaGVsbCA9CitzZXQgUkNFcnJvcj1vbgorCitzZXQgUkNFcnJvcj1vZmYKK3JjbG9hZCBjb21ibzI4X2RyYW0uc29jCitzZXQgUkNFcnJvcj1vbgorCisjU2V0IGZhYnJpYyBjb25uZWN0IG1vZGUgYXMgRkUgZm9yIG11bHRpIEZBUCBzeXN0ZW0KK2lmICQ/ZGlhZ19jaGFzc2lzICIgXAorICAgY29uZmlnIGFkZCBmYWJyaWNfY29ubmVjdF9tb2RlLkJDTTg4NDcwPUZFIgorCisjIFNldCBtb2RpZDoKKyMgSWYgZGlhZ19jaGFzc2lzIGlzIGVuYWJsZWQgKHR3byBsaW5lIGNhcmRzKSwgYW5kICdzbG90JyBpcyBkZWZpbmVkIChzbG90IGlzIGRlZmluZWQgb25seSB3aGVuCisjIHdvcmtpbmcgd2l0aG91dCBhIG1hbmFnZW1lbnQgY2FyZCAtIHNldCBtb2RpZCB0byBiZSAnc2xvdCcKKyMgT3RoZXJ3aXNlIChzaW5nbGUgbGluZSBjYXJkLCBvciBtYW5hZ2VtZW50IGNhcmQpLCBzZXQgbW9kaWQgdG8gYmUgMCBmb3IgdW5pdCAwLCBhbmQgMSBmb3IgdW5pdCAhPSAwCitpZiAkP2RpYWdfY2hhc3NpcyAmJiAkP3Nsb3QgIlwKKyAgbG9jYWwgbW9kaWQgJHNsb3QiIFwKK2Vsc2UgIlwKKyAgbG9jYWwgbW9kaWQgJHVuaXQiCitleHByICRtb2RpZD09MTsgaWYgJD8gImxvY2FsIG1vZGlkIDIiCisKK2lmICQ/bW9kdWxlX2lkICIgXAorICBsb2NhbCBtb2RpZCAkbW9kdWxlX2lkIgorCitlY2hvICIkdW5pdDogbW9kaWQ9JG1vZGlkIgorCisjIFNldCBiYXNlX21vZGlkOgorIyBJZCBiYXNlX21vZHVsZV9pZCBpcyBzZXQsIHRoZW4gc2V0IGJhc2VfbW9kaWQgdG8gaGF2ZSBiYXNlX21vZHVsZV9pZCB2YWx1ZS4KKyMgT3RoZXJ3aXNlLCBzZXQgYmFzZV9tb2RpZCB0byBiZSAwLgoraWYgJD9iYXNlX21vZHVsZV9pZCAiIFwKKyAgbG9jYWwgYmFzZV9tb2RpZCAkYmFzZV9tb2R1bGVfaWQiIFwKK2Vsc2UgIiBcCisgIGxvY2FsIGJhc2VfbW9kaWQgMCIKKworZXhwciAkYmFzZV9tb2RpZCA+IDAKK2lmICQ/ICIgXAorICBlY2hvICckdW5pdDogYmFzZV9tb2RpZD0kYmFzZV9tb2RpZCciCisKK2lmICQ/ZGlhZ19jaGFzc2lzICIgXAorICBsb2NhbCBub2ZfZGV2aWNlcyAyIiBcCitlbHNlICJcCisgIGxvY2FsIG5vZl9kZXZpY2VzIDEiCisKK2lmICQ/bl9kZXZpY2VzICIgXAorICBsb2NhbCBub2ZfZGV2aWNlcyAkbl9kZXZpY2VzIgorCitleHByICRub2ZfZGV2aWNlcyA+IDEKK2lmICQ/ICIgXAorICBlY2hvICckdW5pdDogbm9mX2RldmljZXM9JG5vZl9kZXZpY2VzJyIKKworaWYgJD9tbmdfY3B1ICIgXAorICBlY2hvICckdW5pdDptYW5hZ2VtZW50IGNhcmQgLSBwb2xsaW5nIGlzIHNldCBvbic7IFwKKyAgY29uZmlnIGFkZCBwb2xsZWRfaXJxX21vZGUuQkNNODg2NzU9MTsgXAorICBjb25maWcgYWRkIHNjaGFuX2ludHJfZW5hYmxlLkJDTTg4Njc1PTA7IFwKKyAgY29uZmlnIGFkZCB0ZG1hX2ludHJfZW5hYmxlLkJDTTg4Njc1PTA7IFwKKyAgY29uZmlnIGFkZCB0c2xhbV9pbnRyX2VuYWJsZS5CQ004ODY3NT0wOyBcCisgIGNvbmZpZyBhZGQgbWlpbV9pbnRyX2VuYWJsZS5CQ004ODY3NT0wOyAiCisKKyNDb3VudGVycyB1bmF2YWlsYWJsZSBpbiBjbW9kZWwKK2lmICQ/Y21vZGVsICIgXAorICBjb25maWcgYWRkIGNvdW50ZXJfZW5naW5lX3NhbXBsaW5nX2ludGVydmFsPTA7IgorCisjZGVmYXVsdCB2YWx1ZXMgaW4gYSBjYXNlIHdoaWNoIHRoZXNlIHBhcmFtZXRlcnMgYXJlIG5vdCBleGlzdAoraWYgISQ/ZGlhZ19jb3NxX2Rpc2FibGUgIlwKKyAgbG9jYWwgZGlhZ19jb3NxX2Rpc2FibGUgMCIKK2lmICEkP3dhcm1ib290ICJcCisgIGxvY2FsIHdhcm1ib290IDAiCitpZiAhJD9kaWFnX2Rpc2FibGUgIlwKKyAgbG9jYWwgZGlhZ19kaXNhYmxlIDAiCitpZiAhJD9kaWFnX25vX2l0bWhfcHJvZ19tb2RlICJcCisgIGxvY2FsIGRpYWdfbm9faXRtaF9wcm9nX21vZGUgMCIKK2lmICEkP2wyX21vZGUgIlwKKyAgbG9jYWwgbDJfbW9kZSAwIgorCisjRGlzYWJsZSBpbnRlcnJ1cHRzIGluIGNtb2RlbAoraWYgJD9jbW9kZWwgIlwKKyAgbG9jYWwgbm9faW50ciAxIiBcCitlbHNlICJcCisgIGxvY2FsIG5vX2ludHIgMCIKKworaWYgJD9RVVggIlwKKyAgICBsb2NhbCBub19lbGsgMSIgXAorZWxzZSAiXAorICAgIGxvY2FsIG5vX2VsayAwIgorCitJTklUX0ROWCBNb2RJRD0kbW9kaWQgTm9mRGV2aWNlcz0kbm9mX2RldmljZXMgQ29zcURpc2FibGU9JGRpYWdfY29zcV9kaXNhYmxlIE5vQXBwbD0kZGlhZ19kaXNhYmxlIFdhcm1ib290PSR3YXJtYm9vdCBOb1J4TG9zPTEgTm9MaW5rc2Nhbj0wIE5vRWxrRGV2aWNlPSRub19lbGsgTm9FbGtBcHBsPTAgTm9JdG1oUHJvZ01vZGU9JGRpYWdfbm9faXRtaF9wcm9nX21vZGUgTDJNb2RlPSRsMl9tb2RlIE5vSW50cj0kbm9faW50cgorCisjZWNobyAicGVyZm9ybWluZyBmb3JjZSBmb3J3YXJkIHRvIHN5c3BvcnQgMSIKKyNtb2QgSUhQX1BJTkZPX0xMUiAwIDI1NiBERUZBVUxUX0NQVV9UUkFQX0NPREU9MjAwIERFRkFVTFRfQUNUSU9OX1BST0ZJTEVfRldEPTcKKyNtb2QgSUhCX0ZXRF9BQ1RfUFJPRklMRSAyMDAgMSBGV0RfQUNUX0RFU1RJTkFUSU9OPTB4MTAwMDEgRldEX0FDVF9ERVNUSU5BVElPTl9PVkVSV1JJVEU9MQorI2VjaG8gInBlcmZvcm1pbmcgY3JlZGl0IGZsdXNoIGZyb20gTklGIHRvIEVHUSIKKyNtIE5CSUhfVFhfRUdSRVNTX0NSRURJVFNfREVCVUdfUE0gVFhfRkxVU0hfRUdSRVNTX1BPUlRfMF9NTEZfMF9RTUxGX049MSBUWF9GTFVTSF9FR1JFU1NfUE9SVF8wX01MRl8xX1FNTEZfTj0xIFRYX0ZMVVNIX0VHUkVTU19QT1JUXzBfTUxGXzJfUU1MRl9OPTEgVFhfRkxVU0hfRUdSRVNTX1BPUlRfMF9NTEZfM19RTUxGX049MQorZWNobyAicWF4LnNvYzogRG9uZS4iCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9yYy5zb2MgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9yYy5zb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTc2NmU5OQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L3JjLnNvYwpAQCAtMCwwICsxLDE3OTIgQEAKKyMgJElkOiByYy5zb2MsdiAxLjE5MiAyMDEzLzA3LzE3IDIyOjEzOjQzIGRrZWxsZXkgRXhwICQKKyMgJENvcHlyaWdodDogKGMpIDE5OTgtMjAwMSBCcm9hZGNvbSBDb3JwLgorIyBBbGwgUmlnaHRzIFJlc2VydmVkLiQKKyMKKyMgSW5pdGlhbGl6YXRpb24gUkMgKHJ1biBjb21tYW5kcykgZmlsZQorIworIyAgICAgICBUaGVzZSBhcmUgZGVmYXVsdCBjb21tYW5kcyB0aGF0IGFyZSByZWFkIGFuZCBleGVjdXRlZCBieSBkZWZhdWx0CisjICAgICAgIHdoZW4gQkNNIGJvb3RzIHVwLiAgVHlwaWNhbGx5IHRoaXMgZmlsZSBpcyBjYWxsZWQgcmMuc29jIGFuZCByZXNpZGVzCisjICAgICAgIGluIHRoZSBmbGFzaCBmaWxlc3lzdGVtLCBOVlJBTSwgb3IgZGlzay4KKyMKKyMgQm9hcmQgQ29uZmlndXJhdGlvbiBTZXR0aW5nCisjCisjICAgICAgIFRoaXMgZmlsZSB1c2VzIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB0byBrbm93IG9uIHdoaWNoIGJvYXJkCisjICAgICAgIGl0IGlzIHJ1bm5pbmcuICBDdXJyZW50bHkgb25lIG9mIGZvbGxvd2luZyBzZXR0aW5ncyBtdXN0IGJlIG1hZGU6CisjCisjICAgICAgIEJDTTk1NjcwSzggICAgICAgICAgY29uZmlnIGFkZCBoZXJjOD0xCisjICAgICAgIEJDTTk1NjkwSzI0ICAgICAgICAgY29uZmlnIGFkZCBkcmFjb19iMmI9MQorIyAgICAgICBCQ005NTY5MEsyNFMgICAgICAgIGNvbmZpZyBhZGQgZHJhY29fc3RrPTEKKyMgICAgICAgQkNNOTU2OTBSMjQgICAgICAgICBjb25maWcgYWRkIGdhbGFoYWQ9MQorIyAgICAgICBCQ005NTY5MFIyNFMgICAgICAgIGNvbmZpZyBhZGQgbWVybGluPTEKKyMgICAgICAgQkNNOTU2OTBSNDhTICAgICAgICBjb25maWcgYWRkIGxhbmNlbG90PTEKKyMgICAgICAgQkNNOTU2OTFLMTIgICAgICAgICBjb25maWcgYWRkIGRyYWNvX2sxMj0xCisjICAgICAgIFdoaXRlIEtuaWdodCAgICAgICAgY29uZmlnIGFkZCB3aGl0ZV9rbmlnaHQ9MSAobm90IHNoaXBwaW5nKQorIyAgICAgICBCbGFjayBLbmlnaHQgICAgICAgIGNvbmZpZyBhZGQgYmxhY2tfa25pZ2h0PTEgKG5vdCBzaGlwcGluZykKKyMgICAgICAgQkNNOTU2NzNLMlMgICAgICAgICBjb25maWcgYWRkIHR3b2x5bng9MQorIyAgICAgICBCQ005NTY3M1I4ICAgICAgICAgIGNvbmZpZyBhZGQgaGVyY3VseW54PTEKKyMgICAgICAgQkNNOTU2NzNSMjRTICAgICAgICBjb25maWcgYWRkIGx5bnhhbGl0dGxlPTEKKyMgICAgICAgQkNNOTU2NzNSNDhTICAgICAgICBjb25maWcgYWRkIGx5bnhhbG90PTEKKyMgICAgICAgQkNNOTU2OTVQMjRTWF8xMCAgICBjb25maWcgYWRkIGd1ZW5ldmVyZT0xCisjICAgICAgIEJDTTk1NjUwSzI0ICAgICAgICAgY29uZmlnIGFkZCBtYWdudW09MSAoYXV0b21hdGljIGZvciA1NjUwTCkKKyMgICAgICAgQkNNOTU2NzUgICAgICAgICAgICBjb25maWcgYWRkIGhlcmM4XzE1PTEKKyMgICAgICAgQkNNOTU2NTBSMjQgICAgICAgICBjb25maWcgYWRkIHR1YzI0X3JlZj0xCisjICAgICAgIEJDTTk1Njk1UDQ4TE0gICAgICAgY29uZmlnIGFkZCBsbTQ4cD0xCisjICAgICAgIEJDTTk1Njk1UDQ4TE0tMTAgICAgY29uZmlnIGFkZCBsbTQ4cF9CPTEKKyMgICAgICAgQkNNOTU2NTA0UDQ4TE0tMTAgICBjb25maWcgYWRkIGxtNDhwX0M9MQorIyAgICAgICBCQ005NTY1MDRQNDhMTS0yMCAgIGNvbmZpZyBhZGQgbG00OHBfQz0xCisjICAgICAgIEJDTTk1NjUwNFA0OExNLTUwICAgY29uZmlnIGFkZCBsbTQ4cF9EPTEKKyMgICAgICAgQkNNOTU2NTA0UDQ4UE9FUkVGICBjb25maWcgYWRkIGZicG9lPTEKKyMgICAgICAgQkNNOTU2NTA0UDI0UkVGIFAwICBjb25maWcgYWRkIGZiMjQ9MQorIyAgICAgICBCQ005NTY1MDRQMjQgICAgUDAgIGNvbmZpZyBhZGQgZmIyND0xCisjICAgICAgIEJDTTk1NjEwMlA0OCAgICAgICAgY29uZmlnIGFkZCBmZWxpeDQ4PTEKKyMgICAgICAgQkNNOTUzMzAwUDI0UkVGICAgICBjb25maWcgYWRkIG1pcmFnZTI0PTEKKyMgICAgICAgQkNNOTU2ODAwSzIwQyAgICAgICBjb25maWcgYWRkIGJyYWRsZXlfMWc9MQorIyAgICAgICBCQ005NTY3MDBLMTYgICAgICAgIGNvbmZpZyBhZGQgaHVtdj0xCisjICAgICAgIEJDTTk1NjgwMEsyMCAgICAgICAgY29uZmlnIGFkZCBicmFkbGV5PTEKKyMgICAgICAgQkNNOTU2NTgwSzE2ICAgICAgICBjb25maWcgYWRkIGdvbGR3aW5nPTEKKyMgICAgICAgQkNNOTU2MzE0UDI0UkVGICAgICBjb25maWcgYWRkIGJjbTU2MzE0cDI0cmVmPTEKKyMgICAgICAgQkNNOTU2MDI0UDQ4UkVGICAgICBjb25maWcgYWRkIEJDTTk1NjAyNFA0OFJFRj0xCisjICAgICAgIEJDTTk1NjIyNFA0OFJFRiAgICAgY29uZmlnIGFkZCBCQ005NTYyMjRQNDhSRUY9MQorIyAgICAgICBCQ005NTYyMjRSNTBUICAgICAgIGNvbmZpZyBhZGQgQkNNOTU2MjI0UjUwVD0xCisjICAgICAgIEJDTTk1NjAyNFI1MFQgICAgICAgY29uZmlnIGFkZCBCQ005NTYwMjRSNTBUPTEKKyMgICAgICAgQkNNNTY4MjBLMjRYRyAgICAgICBjb25maWcgYWRkIEJDTTU2ODIwSzI0WEc9MQorIyAgICAgICBCQ005NTMzMTRSMjRHUyAgICAgIGNvbmZpZyBhZGQgQkNNOTUzMzE0UjI0R1M9MQorIyAgICAgICBCQ005NTMzMTRLMjQgICAgICAgIGNvbmZpZyBhZGQgQkNNOTUzMzE0SzI0PTEKKyMgICAgICAgQkNNOTU2ODIwUjI0WEcgICAgICBjb25maWcgYWRkIEJDTTk1NjgyMFIyNFhHPTEKKyMgICAgICAgQkNNOTU2MTYwUiAgICAgICAgICBjb25maWcgYWRkIGJjbTk1NjE2MHI9MQorCitpZiAkP0JDTTU2MTQ2X0EwIFwKKyAgICAnbG9jYWwgQkNNNTYxNDYgMScKKworaWYgJD9CQ001NjE0N19BMCBcCisgICAgJ2xvY2FsIEJDTTU2MTQ3IDEnCisKKworaWYgJD8xICJlY2hvIHJjOiBhcmd1bWVudHMgbm90IHN1cHBvcnRlZDsgZXhpdCIKK2lmICEkP3VuaXQgImVjaG8gcmM6IG5vIGN1cnJlbnQgdW5pdDsgZXhpdCIKKworZWNobyAicmM6IHVuaXQgJHVuaXQgZGV2aWNlICRkZXZuYW1lIgorbG9jYWwgcXVpZXQgbm8KK2xvY2FsIGVjaG8gZWNobworbG9jYWwgcmNkb25lIFwkcmMkdW5pdAoraWYgISJleHByICRyY2RvbmUgKyAwIiAibG9jYWwgZWNobyBub2VjaG87IGxvY2FsIHF1aWV0IHllcyIKKworIyBTZXQgY29udmVuaWVuY2UgbG9jYWwgdmFyaWFibGVzCisKKyMgc2ltdWxhdGlvbiByZWxhdGVkCisjaWYgJD9wbGlzaW0gXAorIyAgICAgICAibG9jYWwgbm9fYmNtIDEiCitpZiAkP3F1aWNrdHVybiB8fCAkP3BsaXNpbSBcCisJImxvY2FsIHNpbXVsYXRvciAxIgorCitpZiAkP3NpbXVsYXRvciBcCisgICAgJ2VjaG8gLW4gIkNoaXAgaW5pdCBzdGFydHMgYXQ6ICI7ZGF0ZScKKworIyBib2FyZCByZWxhdGVkCitpZiAkP2dhbGFoYWQgXAorCSJsb2NhbCBkcmFjb19iMmIgMSIKK2lmICQ/YmxhY2tfa25pZ2h0IHx8ICQ/d2hpdGVfa25pZ2h0IHx8ICQ/bWVybGluIFwKKwkibG9jYWwgZHJhY29faGVyYzQgMSIKKworI2lmICQ/UVVYX0EwIFwKKyMgICAgJ2VjaG8gYmxhYmxhYmxhO2RlciAweDQwIDQgOyBleGl0JworCitpZiAkP0ZMQUlSX0EwIFwKKyAgICAnZWNobyBibGFibGFibGE7ZGVyIDB4NDAgNCA7IGV4aXQnCisKK2lmICQ/QkNNODg3NTBfQTAgfHwgJD9CQ004ODc1MF9CMCB8fCAkP0JDTTg4NzUzX0EwIHx8ICQ/QkNNODg3NTNfQjAgfHwgJD9CQ004ODc1Ml9BMCB8fCAkP0JDTTg4NzUyX0IwIHx8ICAkP0JDTTg4NzU1X0IwIHx8ICQ/QkNNODg3NTRfQTAgfHwgJD9CQ004ODc3MF9BMSB8fCAkP0JDTTg4NzczX0ExIHx8ICQ/QkNNODg3NzRfQTEgfHwgJD9CQ004ODc3NV9BMSB8fCAkP0JDTTg4Nzc2X0ExIHx8ICQ/QkNNODg3NzdfQTEgfHwgJD9CQ004ODk1MF9BMCB8fCAkP0JDTTg4OTUwX0ExIHx8ICQ/QkNNODg5NTNfQTEgfHwgJD9CQ004ODk1NF9BMSB8fCAkP0JDTTg4OTU1X0ExIHx8ICQ/QkNNODg5NTZfQTEgfHwgJD9CQ004ODk1Ml9BMCB8fCAkP0JDTTg4OTUyX0ExIHx8ICQ/QkNNODg3NzJfQTEgXAorICAgICdyY2xvYWQgZGZlLnNvYyA7IGV4aXQnCisKK2lmICQ/QkNNODg3OTBfQTAgXAorICAgICdyY2xvYWQgZG54Zi5zb2MgOyBleGl0JworCitpZiAkP0FSQURfQTAgfHwgJD9BUkFEX0IwIHx8ICQ/QVJBRF9CMSB8fCAkP0FSQURQTFVTX0EwIHx8ICQ/QkNNODg2NTBfQTAgfHwgJD9CQ004ODY1MF9CMCB8fCAkP0JDTTg4NjUwX0IxIHx8ICQ/QkNNODg2NTJfQTAgfHwgJD9CQ004ODY1Ml9CMCB8fCAkP0JDTTg4MzUwX0IxIHx8ICQ/QkNNODgzNTFfQjEgfHwgXAorICAgJD9CQ004ODQ1MF9CMSB8fCAkP0JDTTg4NDUxX0IxIHx8ICQ/QkNNODg1NTBfQjEgfHwgJD9CQ004ODU1MV9CMSB8fCAkP0JDTTg4NTUyX0IxIHx8ICQ/QkNNODg2NTFfQjEgfHwgJD9CQ004ODY1NF9CMSB8fCAkP0JDTTg4NjYwX0EwIHx8ICQ/QkNNODgzNjBfQTAgfHwgJD9CQ004ODM2MV9BMCB8fCAkP0JDTTg4MzYzX0EwIHx8XAorICAgJD9CQ004ODQ2MF9BMCB8fCAkP0JDTTg4NDYxX0EwIHx8ICQ/QkNNODg1NjBfQTAgfHwgJD9CQ004ODU2MV9BMCB8fCAkP0JDTTg4NTYyX0EwIHx8ICQ/QkNNODg2NjFfQTAgfHwgJD9CQ004ODY2NF9BMCAgXAorICAgICdyY2xvYWQgYXJhZC5zb2MgOyBleGl0JworCitpZiAkP0JDTTgzMjA3X0EwIFwKKyAgICAncmNsb2FkIHNhbWFyLnNvYyA7IGV4aXQnCitpZiAkP0JDTTgzMjA4X0EwIFwKKyAgICAncmNsb2FkIHNpbmFpLnNvYyA7IGV4aXQnCisKK2lmICQ/UUFYX0EwIHx8ICQ/QkNNODg0NzBfQTAgfHwgJD9CQ004ODQ3MV9BMCB8fCAkP0JDTTg4NDczX0EwIHx8ICQ/QkNNODg0NzRfQTAgfHwgJD9CQ004ODQ3NEhfQTAgfHwgJD9CQ004ODQ3Nl9BMCB8fCAkP0JDTTg4NDc3X0EwIHx8IFwKKyAgICQ/UUFYX0IwIHx8ICQ/QkNNODg0NzBfQjAgfHwgJD9CQ004ODQ3MV9CMCB8fCAkP0JDTTg4NDczX0IwIHx8ICQ/QkNNODg0NzRfQjAgfHwgJD9CQ004ODQ3NEhfQjAgfHwgJD9CQ004ODQ3Nl9CMCB8fCAkP0JDTTg4NDc3X0IwIFwKKyAgICAnc2V0ZW52IFFBWCAxJworICAgIAoraWYgJD9RVVhfQTAgfHwgJD9CQ004ODI3MF9BMCBcCisgICAgJ3NldGVudiBRVVggMScKKworaWYgJD9KRVJJQ0hPX0EwIHx8ICAkP0JDTTg4NjcwX0EwIHx8ICQ/QkNNODg2NzFfQTAgfHwgJD9CQ004ODY3MU1fQTAgfHwgJD9CQ004ODY3Ml9BMCB8fCAkP0JDTTg4NjczX0EwIHx8ICQ/QkNNODg2NzRfQTAgfHwgJD9CQ004ODY3NV9BMCB8fCAkP0JDTTg4Njc1TV9BMCB8fCAkP0JDTTg4Njc2X0EwIHx8ICQ/QkNNODg2NzZNX0EwIHx8ICQ/QkNNODg2NzdfQTAgfHwgJD9CQ004ODY3OF9BMCB8fCAkP0JDTTg4Njc5X0EwIHx8IFwKKyAgICQ/SkVSSUNIT19BMSB8fCAgJD9CQ004ODY3MF9BMSB8fCAkP0JDTTg4NjcxX0ExIHx8ICQ/QkNNODg2NzFNX0ExIHx8ICQ/QkNNODg2NzJfQTEgfHwgJD9CQ004ODY3M19BMSB8fCAkP0JDTTg4Njc0X0ExIHx8ICQ/QkNNODg2NzVfQTEgfHwgJD9CQ004ODY3NU1fQTEgfHwgJD9CQ004ODY3Nl9BMSB8fCAkP0JDTTg4Njc2TV9BMSB8fCAkP0JDTTg4Njc3X0ExIHx8ICQ/QkNNODg2NzhfQTEgfHwgJD9CQ004ODY3OV9BMSB8fCBcCisgICAkP1FNWF9BMCAgICAgfHwgICQ/QkNNODgzNzBfQTAgfHwgJD9CQ004ODM3MV9BMCB8fCAkP0JDTTg4MzcxTV9BMCB8fCAkP0JDTTg4Mzc1X0EwIHx8ICQ/QkNNODgzNzZfQTAgfHwgJD9CQ004ODM3Nk1fQTAgfHwgJD9CQ004ODM3N19BMCB8fCAkP0JDTTg4Mzc4X0EwIHx8ICQ/QkNNODgzNzlfQTAgfHwgXAorICAgJD9RTVhfQTEgICAgIHx8ICAkP0JDTTg4MzcwX0ExIHx8ICQ/QkNNODgzNzFfQTEgfHwgJD9CQ004ODM3MU1fQTEgfHwgJD9CQ004ODM3NV9BMSB8fCAkP0JDTTg4Mzc2X0ExIHx8ICQ/QkNNODgzNzZNX0ExIHx8ICQ/QkNNODgzNzdfQTEgfHwgJD9CQ004ODM3OF9BMSB8fCAkP0JDTTg4Mzc5X0ExIHx8IFwKKyAgICQ/SkVSSUNIT19CMCB8fCAgJD9CQ004ODY3MF9CMCB8fCAkP0JDTTg4NjcxX0IwIHx8ICQ/QkNNODg2NzFNX0IwIHx8ICQ/QkNNODg2NzJfQjAgfHwgJD9CQ004ODY3M19CMCB8fCAkP0JDTTg4Njc0X0IwIHx8ICQ/QkNNODg2NzVfQjAgfHwgJD9CQ004ODY3NU1fQjAgfHwgJD9CQ004ODY3Nl9CMCB8fCAkP0JDTTg4Njc2TV9CMCB8fCAkP0JDTTg4Njc3X0IwIHx8ICQ/QkNNODg2NzhfQjAgfHwgJD9CQ004ODY3OV9CMCB8fCAkP0JDTTg4NjgwX0EwIHx8IFwKKyAgICQ/UU1YX0IwICAgICB8fCAgJD9CQ004ODM3MF9CMCB8fCAkP0JDTTg4MzcxX0IwIHx8ICQ/QkNNODgzNzFNX0IwIHx8ICQ/QkNNODgzNzVfQjAgfHwgJD9CQ004ODM3Nl9CMCB8fCAkP0JDTTg4Mzc2TV9CMCB8fCAkP0JDTTg4Mzc3X0IwIHx8ICQ/QkNNODgzNzhfQjAgfHwgJD9CQ004ODM3OV9CMCB8fCAkP0JDTTg4Mzc5X0ExIHx8IFwKKyAgICQ/SkVSUExVUyAgICB8fCAgJD9CQ004ODY4MF9BMCB8fCAgJD9CQ004ODY4MV9BMCB8fCAgJD9CQ004ODY4Ml9BMCB8fCAkP0JDTTg4NjgzX0EwIHx8ICAkP0JDTTg4MzgwX0EwIHx8ICAkP0JDTTg4MzgxX0EwIFwKKyAgICAncmNsb2FkIGplci5zb2MgOyBleGl0JworCitpZiAkP0JDTTg4NjkwX0EwICBcCisgICAgJ3JjbG9hZCBkbnguc29jIDsgZXhpdCcKKworaWYgJD9RQVggfHwgJD9RVVhcCisgICAgJ3JjbG9hZCBxYXguc29jIDsgcmNsb2FkIHJwYy5zb2MgOyAgZXhpdCcKKworCitpZiAkP0JDTTg4MjAyX0EwIHx8ICQ/QVJET05fQTAgfHwgJD9CQ004ODIwMl9BMSB8fCAkP0FSRE9OX0ExIHx8ICQ/QkNNODgyMDJfQTIgfHwgJD9BUkRPTl9BMlwKKyAgICAncmNsb2FkIGF0bWYuc29jIDsgZXhpdCcKKworaWYgJD9BQ1AgXAorICAgICdleGl0JworCitpZiAkP0JDTTg4NjkwX0EwXAorICAgICdleGl0JworICAgICAgCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHg1NjUwIiBcCisJImxvY2FsIG1hZ251bSAxIgoraWYgJD9kcmFjIHx8ICQ/ZHJhYzE1IFwKKwkibG9jYWwgZHJhY19hbnkgMSIKK2lmICQ/bHlueCB8fCAkP2x5bngxNSBcCisJImxvY2FsIGx5bnhfYW55IDEiCitpZiAkP3R1Y2FuYSB8fCAkP21hZ251bSBcCisJImxvY2FsIHR1Y2FuYV9hbnkgMSIKK2lmICQ/aGVyYyB8fCAkP2hlcmMxNSBcCisJImxvY2FsIGhlcmNfYW55IDEiCitpZiAkP2ZpcmVib2x0IHx8ICQ/ZmlyZWJvbHQyIHx8ICQ/aGVsaXggfHwgXAorICAgJD9mZWxpeCB8fCAkP2hlbGl4MTUgfHwgJD9mZWxpeDE1IHx8ICQ/cmFwdG9yIHx8ICQ/cmF2ZW4gfHwgJD9oYXdrZXllXAorCSJsb2NhbCBmaXJlYm9sdF9hbnkgMSIKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI1MDEiIFwKKwkibG9jYWwgZmlyZWJvbHRfMTB4NCAxIgoraWYgJD9lYXN5cmlkZXIgXAorCSJsb2NhbCBlYXN5cmlkZXJfYW55IDEiCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjAyIiBcCisJImxvY2FsIGVhc3lyaWRlcl8xeDEgMSIKK2lmICQ/YnJhZGxleSB8fCAkP2h1bXYgfHwgJD9nb2xkd2luZyBcCisJImxvY2FsIGJyYWRsZXlfYW55IDEiCitpZiAkP2RyYWNfYW55IHx8ICQ/bHlueF9hbnkgfHwgJD90dWNhbmFfYW55IFwKKwkibG9jYWwgeGdzMTJfc3dpdGNoIDEiCitpZiAkP2ZpcmVib2x0X2FueSB8fCAkP2Vhc3lyaWRlcl9hbnkgfHwgJD9icmFkbGV5X2FueSBcCisJImxvY2FsIHhnczNfc3dpdGNoIDEiCitpZiAkP3hnczEyX3N3aXRjaCB8fCAkP3hnczNfc3dpdGNoIFwKKwkibG9jYWwgeGdzX3N3aXRjaCAxIgoraWYgJD9oZXJjX2FueSBcCisJImxvY2FsIHhnc19mYWJyaWMgMSIKK2lmICQ/eGdzX2ZhYnJpYyB8fCAkP3hnc19zd2l0Y2ggXAorCSJsb2NhbCB4Z3MgMSIKK2lmICEkP3hncyBcCisJImxvY2FsIHN0cmF0YSAxIgoraWYgJD9zdHJhdGEgJiYgISQ/Z3NsIFwKKwkibG9jYWwgUEJNUF9BTEwgMHgwYmZmZmZmZiIKK2lmICQ/c3RyYXRhICYmICQ/Z3NsIFwKKwkibG9jYWwgUEJNUF9BTEwgMHgwODAwMDBmZiIKK2lmICQ/QkNNNTYyMTRfQTAgfHwgJD9CQ001NjAxNF9BMCB8fCAkP0JDTTU2MjE1X0EwIHx8IFwKKyAgICQ/QkNNNTYyMTRfQTEgfHwgJD9CQ001NjAxNF9BMSB8fCAkP0JDTTU2MjE1X0ExICYmIFwKKyAgICEkP0JDTTk1NjAyNFA0OFJFRiBcCisJImxvY2FsIHJhcDI0X3JlZiAxIgorCitpZiAkP0JDTTU2NTVfQTAgfHwgJD9CQ001NjU1X0IwIFwKKyAgICAgICAgImxvY2FsIHR1Y2FuYV9ub2hnIDEiCisKK2lmICQ/QkNNOTU2MDI0UDQ4UkVGIHx8ICQ/QkNNOTU2MjI0UDQ4UkVGIHx8ICQ/QkNNOTU2MDI0UjUwVCB8fCBcCisgICAkP0JDTTk1NjIyNFI1MFQgXAorICAgICAgICAibG9jYWwgcmF2ZW5fZWJfNDhwIDEiCisKK2lmICQ/QkNNOTUzMzE0UjI0R1MgXAorICAgICAgICAibG9jYWwgaGF3a2V5ZV9wMjQgMSIKKworaWYgJD9CQ005NTMzMTRLMjQgXAorICAgICAgICAibG9jYWwgaGF3a2V5ZV9rMjQgMSIKKworaWYgJD9maXJlYm9sdF9hbnkgJiYgJD9sbTQ4cCB8fCAkP2xtNDhwX0QgXAorICAgICAgICAiY29uZmlnIGFkZCBsbWZiNDg9MSIKKworIyBTZXQgc29mdHdhcmUncyB3YWl0IGZvciBTLUNoYW5uZWwgcmVzcG9uc2UgdG8gMyBzZWNvbmRzIGZvciBRdWlja1R1cm4KKyMgKFJlY29tbWVuZCBhdCBsZWFzdCAxMCBzZWNvbmRzIGlmIHRoZSBBUkwgaXMgMTAwJSBidXN5IHdpdGggaW5zZXJ0cy4pCitpZiAkP3F1aWNrdHVybgkic3RpbWVvdXQgMzAwMDAwMCIKK2lmICQ/cGxpc2ltCSJzdGltZW91dCA2MDAwMDAwMCIKKworIyBEaXJlY3QgcGh5IGxlZCBwcm9ncmFtbWluZzogNTQ2NCBhY3Rpdml0eSBsZWQgYmVjb21lcyBsaW5rL2FjdGl2aXR5CitpZiAkP2RyYWNfYW55ICYmICQ/bGFuY2Vsb3QgfHwgJD9seW54YWxvdCB8fCAkP2d1ZW5ldmVyZSBcCisJImNvbmZpZyBhZGQgcGh5X2xlZF9jdHJsPTB4MTgiCisKKyMgU2h1dGRvd24gdGhyZWFkcyBpZiBzeXN0ZW0gaXMgYWxyZWFkeSBydW5uaW5nCitpZiAkP3RyaXVtcGgzIFwKKwkiaWJvZFN5bmMgb2ZmIgorY291bnRlciBvZmYKK2xpbmtzY2FuIG9mZgoraWYgJD9mZWF0dXJlX2FybF9oYXNoZWQgJiYgISQ/c2ltdWxhdG9yIFwKKyAgICAgICAgImwybW9kZSBvZmYiCitpZiAkP2ZlYXR1cmVfY2VzICYmICQ/QkNNNTY0NDBfQTAgXAorICAgICAgICAiY2VzIG9mZiIKKworIyBUZXN0IG9uLWNoaXAgbWVtb3J5IGJlZm9yZSBpbml0aWFsaXppbmcKKyNpZiAhJD9zaW11bGF0b3IgImluaXQgc29jOyBiaXN0IGwzIGFybCBjYnAiCitpbml0IHNvYworCisjIEluaXRpYWxpemUgbWlzY2VsbGFuZW91cyBjaGlwIHJlZ2lzdGVycworaW5pdCBtaXNjCisKKyMgSW5pdGlhbGl6ZSBleHRlcm5hbCBUQ0FNIGlmIG5lY2Vzc2FyeQorIyBOT1RFIDogdGNhbSBpcyBpbml0aWFsaXplZCBkdXJpbmcgImluaXQgbWlzYyIgdW5sZXNzIAorIyAgICAgICAgdGNhbV9yZXNldF90b2dnbGUgPSAxIGlzIGNvbmZpZ3VyZWQKK2lmICJleHByICRyY2RvbmUgKyAwIiAmJiAhImV4cHIgJHRjYW1fcmVzZXRfdG9nZ2xlICsgMCIgXAorICAgICAgICAiZGlzcGF0Y2ggYXR0YWNoIDAgZXN3IDAiCitpZiAhImV4cHIgJHRjYW1fcmVzZXRfdG9nZ2xlICsgMCIgIm11eHNlbCAwOyBtdXhzZWwgMHg4MCIKK2lmICEiZXhwciAkdGNhbV9yZXNldF90b2dnbGUgKyAwIiAiaW5pdCB0Y2FtOyAkZWNobyByYzogVENBTSBpbml0aWFsaXplZCIKKworIyBJbml0aWFsaXplIHRoZSBTdHJhdGFTd2l0Y2ggTU1VIHJlZ2lzdGVycworaW5pdCBtbXUKK2lmICQ/a2F0YW5hMiBcCisgICBrdDJjb25maWcuc29jCisKKworIyBVbmNvbW1lbnQgdG8gdHVybiBvZmYgU2luZ2xlLUJpdCBFcnJvciByZXBvcnRpbmcgb24gNTY3MAorI2lmICQ/aGVyYyAibSBtbXVfaW50Y250bCBwcF9zYmVfZW49MCIKKworIyBJbml0aWFsaXplIENlbGwgRnJlZSBBZGRyZXNzIFBvb2wKKyMgTk9URTogdGhpcyBzaG91bGQgTk9UIGJlIGRvbmUgdW5sZXNzIGNoaXAgaXMga25vd24gdG8gaGF2ZSBiYWQgQ0ZBUAorIyBtZW1vcnkgZW50cmllcyB0aGF0IG5lZWQgdG8gYmUgbWFwcGVkIG91dC4KK2lmICQ/Y2ZhcF90ZXN0cyAiJGVjaG8gcmM6IEluaXRpYWxpemluZyBDRkFQOyBjZmFwaW5pdCIKKworJGVjaG8gcmM6IE1NVSBpbml0aWFsaXplZAorCisjCisjIExvYWQgdUtlcm5lbAorIworCisjIFBpY2sgZGVmYXVsdCBGVyBuYW1lcyBpZiBub3Qgc2V0IGFscmVhZHkgYnkgY29uZmlnCitpZiAhJD9md19jb3JlXzAgXAorICAgICdsb2NhbCBmd19jb3JlXzAgJHtmd19wcmVmaXh9XzBfYmZkX2JoaC5zcmVjOyBcCisgICAgIGlmICQ/Z3JleWhvdW5kIHx8ICQ/aHVycmljYW5lMiB8fCAkP2h1cnJpY2FuZTMgImxvY2FsIGZ3X2NvcmVfMCAke2Z3X3ByZWZpeH1fMF9wdHBmdWxsLnNyZWMiOyBcCisgICAgIGlmICQ/Y2FsYWRhbjMgImxvY2FsIGZ3X2NvcmVfMCAke2Z3X3ByZWZpeH1fMC5zcmVjIjsgXAorICAgICBpZiAkP2hlbGl4NCAmJiAhJD9mZWF0dXJlX2JoaCAibG9jYWwgZndfY29yZV8wICR7ZndfcHJlZml4fV8wX2JmZC5zcmVjIjsgXAorICAgICBpZiAkP2hlbGl4NCAmJiAkP2ZlYXR1cmVfYmhoICJsb2NhbCBmd19jb3JlXzAgJHtmd19wcmVmaXh9XzBfYmZkX2JoaC5zcmVjIjsgXAorICAgICBpZiAkP3RvbWFoYXdrICYmICEkP2ZlYXR1cmVfYmhoICJsb2NhbCBmd19jb3JlXzAgJHtmd19wcmVmaXh9XzBfYmZkLnNyZWMiOyBcCisgICAgIGlmICQ/dG9tYWhhd2tfcGx1cyAmJiAhJD9mZWF0dXJlX2JoaCAibG9jYWwgZndfY29yZV8wICR7ZndfcHJlZml4fV8wX2JmZC5zcmVjIjsgXAorICAgICBpZiAkP3RyaWRlbnQycGx1cyAmJiAhJD9mZWF0dXJlX2JoaCAibG9jYWwgZndfY29yZV8wICR7ZndfcHJlZml4fV8wX2JmZC5zcmVjIjsgXAorICAgICcKKworaWYgISQ/ZndfY29yZV8xIFwKKyAgICdsb2NhbCBmd19jb3JlXzEgJHtmd19wcmVmaXh9XzFfcHRwZnVsbC5zcmVjOyBcCisgICAgaWYgJD9jYWxhZGFuMyAibG9jYWwgZndfY29yZV8xICR7ZndfcHJlZml4fV8xX2JzLnNyZWMiOyBcCisgICAnCisKK2lmICEkP2Z3X2NvcmVfMiBcCisgICAibG9jYWwgZndfY29yZV8yICR7ZndfcHJlZml4fV8yX2V0aF9sbWRtLnNyZWMiCisKKyMgTG9hZCB0aGUgZmlybXdhcmVzCitpZiAkP2ZlYXR1cmVfY21pY20gJiYgISQ/cmNwdV9vbmx5ICYmICEkaWhvc3RfbW9kZSAmJiAhJD9mZWF0dXJlX2lwcm9jIFwKKyAgICAibWNzbG9hZCAwICR7ZndfY29yZV8wfSBJbml0TUNTPXRydWU7IFwKKyAgICAgbWNzbG9hZCAxICR7ZndfY29yZV8xfTsiCisKK2lmICQ/aHVycmljYW5lMiBcCisgICAibWNzbG9hZCAwICR7ZndfY29yZV8wfSBJbml0TUNTPXRydWU7IgorCitpZiAkP2ZlYXR1cmVfaXByb2MgJiYgISQ/aHVycmljYW5lMiAmJiAhJD9odXJyaWNhbmUzICYmICEkP3JjcHVfb25seSAmJiAhJD9mZWF0dXJlX3VjX21ob3N0ICYmICEkaWhvc3RfbW9kZVwKKyAgICAibWNzbG9hZCAwICR7ZndfY29yZV8wfSBJbml0TUNTPXRydWUgVHdvU3RhZ2U9dHJ1ZSBUd29TdGFnZUFkZHI9MHg2MDAwMDAwMDtcCisgICAgIG1jc2xvYWQgMSAke2Z3X2NvcmVfMX0gVHdvU3RhZ2U9dHJ1ZSBUd29TdGFnZUFkZHI9MHg2MDAyYzAwMDsiCisKK2lmICQ/ZmVhdHVyZV9pcHJvYyAmJiAhJD9yY3B1X29ubHkgJiYgJD9mZWF0dXJlX3VjX21ob3N0ICYmICQ/bnVtX3Vjc1wKKyAgICAnaWYgISJleHByICRudW1fdWNzID4gMCIgIm1jc2xvYWQgMCAke2Z3X2NvcmVfMH0gSW5pdE1DUz10cnVlIjsgXAorICAgICBpZiAhImV4cHIgJG51bV91Y3MgPiAxIiAibWNzbG9hZCAxICR7ZndfY29yZV8xfSI7IFwKKyAgICAgaWYgISJleHByICRudW1fdWNzID4gMiIgIm1jc2xvYWQgMiAke2Z3X2NvcmVfMn0iOycKKworIworIyBJbml0IENMSSBhbmQgQkNNIEFQSQorIworIyBUaGlzIG11c3QgYmUgZG9uZSBhZnRlciB0aGUgcmF3IHJlZ2lzdGVyIHdyaXRlcyB0byBhdm9pZCBoYXZpbmcgc3RhdGUKKyMgY2xvYmJlcmVkLiAgTk9URTogVGFibGVzIGFyZSBjbGVhcmVkIGJ5ICJpbml0IGJjbSIgYmVsb3cuICBJZgorIyB0YWJsZSBtb2RpZmljYXRpb25zIGFyZSByZXF1aXJlZCwgcHV0IHRoZW0gYWZ0ZXIgImluaXQgYmNtIi4gIFNvbWUKKyMgcmVnaXN0ZXJzIG1pZ2h0IGFsc28gYmUgYWZmZWN0ZWQuCisjCisKK2lmICEkP25vX2JjbSBcCisJImluaXQgYmNtOyBcCisJICRlY2hvIHJjOiBCQ00gZHJpdmVyIGluaXRpYWxpemVkIgorCitpZiAkP25vX2JjbSBcCisJIiRlY2hvIHJjOiAqKiogTk9UIGluaXRpYWxpemluZyBCQ00gZHJpdmVyICoqKiIKKworaWYgJD9ub19iY20gJiYgJD9zdHJhdGEgXAorICAgICd3cml0ZSB2dGFibGUgMCAxIFZMQU5fVEFHPTAsUE9SVF9CSVRNQVA9MCxVVF9QT1JUX0JJVE1BUD0wOyBcCisgICAgIGluc2VydCB2dGFibGUgVkxBTl9UQUc9MSxQT1JUX0JJVE1BUD0kUEJNUF9BTEwsVVRfUE9SVF9CSVRNQVA9JFBCTVBfQUxMOyBcCisgICAgIGxvY2FsIHB2IFwKKyAgICAgICAgIFZMQU5fVEFHPTEsU1BfU1Q9MyxQT1JUX0JJVE1BUD0kUEJNUF9BTEwsVVRfUE9SVF9CSVRNQVA9JFBCTVBfQUxMOyBcCisJIHdyaXRlIHB0YWJsZSAwIDMyIFBUWVBFPTA7IFwKKwkgaWYgISQ/Z3NsICJ3cml0ZSBwdGFibGUgMCAyNCAkcHYsUFRZUEU9MSI7IFwKKwkgaWYgISQ/Z3NsICJ3cml0ZSBwdGFibGUgMjQgMiAkcHYsUFRZUEU9MiI7IFwKKwkgaWYgJD9nc2wgICJ3cml0ZSBwdGFibGUgMCA4ICRwdixQVFlQRT0yIjsgXAorCSB3cml0ZSBwdGFibGUgMjcgMSAkcHYsUFRZUEU9MzsgXAorICAgICBsb2NhbCBwdicKKworIyBUdXJuIG9uIG1pcnJvcmluZyBvZiBoYXJkd2FyZSBBUkwgb3BlcmF0aW9ucyBpbnRvIHNvZnR3YXJlIEFSTCB0YWJsZS4KK2lmICQ/ZmVhdHVyZV9hcmxfc29ydGVkIFwKKwkiYXJsbW9kZSBpbnRyX2RtYTsgXAorCSAkZWNobyByYzogQVJMIERNQSBzaGFkb3dpbmcgZW5hYmxlZCIKKworaWYgJD9mZWF0dXJlX2FybF9oYXNoZWQgJiYgISQ/c2ltdWxhdG9yICYmICEkP3JjcHVfb25seSBcCisJImwybW9kZSBpbnRlcnZhbD0zMDAwMDAwOyBcCisJICRlY2hvIHJjOiBMMiBUYWJsZSBzaGFkb3dpbmcgZW5hYmxlZCIKKworIyBJZiBydW5uaW5nIEJDTSBsaWJyYXJ5LCBzdGFydCBsaW5rc2NhbiB0YXNrIGFuZCBzZXQgcG9ydCBtb2RlcworCitpZiAhJD9ub19iY20gJiYgISQ/cmNwdV9vbmx5IFwKKwkibGlua3NjYW4gMjUwMDAwOyBcCisJIHBvcnQgZmUsZ2UgbGlua3NjYW49b24gYXV0b25lZz1vbiBcCisJCXNwZWVkPTAgZnVsbGR1cGxleD10cnVlIHR4cGF1c2U9dHJ1ZSByeHBhdXNlPXRydWU7IFwKKwkgcG9ydCBzdCBsaW5rc2Nhbj1vbiB0eHBhdXNlPWZhbHNlIHJ4cGF1c2U9ZmFsc2U7IFwKKyAgICAgICAgIHBvcnQgeGUsY2UgbGlua3NjYW49b24gYXV0b25lZz1vZmYgXAorICAgICAgICAgICAgICAgIHNwZWVkPTAgZnVsbGR1cGxleD10cnVlIHR4cGF1c2U9dHJ1ZSByeHBhdXNlPXRydWU7IFwKKyAgICAgICAgIHBvcnQgaGcgbGlua3NjYW49b24gZnVsbGR1cGxleD10cnVlIHR4cGF1c2U9ZmFsc2UgcnhwYXVzZT1mYWxzZTsgXAorCSAkZWNobyByYzogUG9ydCBtb2RlcyBpbml0aWFsaXplZCIKKworaWYgISQ/bm9fYmNtICYmICQ/cmNwdV9vbmx5IFwKKwkibGlua3NjYW4gMjUwMDAwOyBcCisJIHBvcnQgZSBsaW5rc2Nhbj1vbjsgXAorCSBwb3J0IHN0IGxpbmtzY2FuPW9uOyBcCisgICAgIHBvcnQgeGUgbGlua3NjYW49b247IFwKKwkgJGVjaG8gcmM6IFBvcnQgbW9kZXMgaW5pdGlhbGl6ZWQiCisKK2lmICEkP25vX2JjbSAmJiAkP3NoYWRvdyBcCisgICAgICJwb3J0IGlsIGxpbmtzY2FuPW9uOyBcCisJICAkZWNobyByYzogSW50ZXJsYWtlbiBQb3J0IG1vZGUgaW5pdGlhbGl6ZWQiCisKKyMgU2VsZWN0aXZlbHkgcmUtZW5hYmxlIEF1dG8gTmVnb3RpYXRpb24gYmFzZWQgb24gY29uZmlnIHBvcnRfZm9yY2VfYW5fbGlzdC4KKyNpZiAkP3BvcnRfZm9yY2VfYW5fbGlzdCBcCisjICAgICJwb3J0ICRwb3J0X2ZvcmNlX2FuX2xpc3QgYXV0b25lZz1vbiIKKworIyBObyBzcGFubmluZyB0cmVlIGlzIHJ1bm5pbmcsIHNvIHB1dCBwb3J0cyBhbGwgaW4gdGhlIGZvcndhcmRpbmcgc3RhdGUKKyMgc3RwIHN1cHBvcnQgbm90IGF2YWlsYWJsZSBmb3Igc2hhZG93IGRldmljZS4KKworaWYgISQ/bm9fYmNtICYmICEkP3NoYWRvdyBcCisJInN0ZyBzdHAgMSBhbGwgZm9yd2FyZCIKKworIyBTdGFydCBjb3VudGVyIHRhc2sgdW5sZXNzIGFscmVhZHkgc3RhcnRlZCBieSAiaW5pdCBiY20iIGFib3ZlLgoraWYgJD9wbGlzaW0gImxvY2FsIGRtYSBmYWxzZSIKK2lmICEkP3BsaXNpbSAibG9jYWwgZG1hIHRydWUiCitpZiAkP2RldmljZV9lYl92bGkgImxvY2FsIGRtYSBmYWxzZSIKK2lmICQ/bm9fYmNtICYmICEkP3JjcHVfb25seVwKKwkiY291bnRlciBJbnRlcnZhbD0xMDAwIFBibT1hbGwgRG1hPSRkbWE7IFwKKwkgJGVjaG8gcmM6IENvdW50ZXIgY29sbGVjdGlvbiBlbmFibGVkIgoraWYgJD9yY3B1X29ubHkgXAorCSJjb3VudGVyIEludGVydmFsPTIwMDAwMDAgUGJtPWFsbCBEbWE9ZmFsc2U7IFwKKwkgJGVjaG8gcmM6IENvdW50ZXIgY29sbGVjdGlvbiBlbmFibGVkIgorCisjIFJlc3luY2hyb25pemUgdGhlIHNhdmVkIHZhbHVlcyBrZXB0IGJ5IHRoZSAnc2hvdyBjb3VudGVyJyBjb21tYW5kLgoraWYgISQ/c2ltdWxhdG9yIFwKKyAgICAiY291bnRlciBzeW5jIgorCisjIEJ5IGRlZmF1bHQsIGR1bXAgZGF0YSBvZiBwYWNrZXRzIHRoYXQgZ28gdG8gQ1BVLgoraWYgISQ/dGVzdGluaXQgXAorCSJwdyByZXBvcnQgK3JhdyIKKworIyBEZWZhdWx0IExFRCBwcm9jZXNzb3IgcHJvZ3JhbSBmb3IgdmFyaW91cyBTREtzIGFuZCByZWZlcmVuY2UgZGVzaWducy4KKyMgU291cmNlIGNvZGUgY2FuIGJlIGZvdW5kIGluICRTREsvbGVkL2V4YW1wbGVzLgorCitpZiAhJD9wNDggImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCA3RiA2NyAyRiA2NyA2QiAwNiA3RiA4MCBEMiAxQSA3NCAwMSAxMiBcCisgN0UgODUgMDUgRDIgMEYgNzEgMTkgNTIgMDAgMTIgN0QgODUgMDUgRDIgMUYgNzEgXAorIDIzIDUyIDAwIDEyIDdDIDg1IDA1IEQyIDA1IDcxIDJEIDUyIDAwIDNBIDY4IDMyIFwKKyAwMCA5NyA3NSAzQiAxMiBBMCBGRSA3RiAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NyBcCisgMTIgQkEgRkUgN0YgMDIgMEEgNTAgMTIgQkEgRkUgN0YgOTUgNzUgNTkgODUgMTIgXAorIEEwIEZFIDdGIDk1IDc1IEE4IDg1IDc3IDlBIDEyIEEwIEZFIDdGIDk1IDc1IDYzIFwKKyA4NSA3NyBBMSAxNiA3QyBEQSAwMiA3MSBBMSA3NyBBOCAzMiAwNSA5NyA3MSA3NiBcCisgMDYgN0QgRDIgMDEgNzEgOUEgMDYgN0YgNjcgOTMgNzUgOUEgMzIgMDIgOTcgNzEgXAorIDlBIDMyIDAzIDk3IDcxIEE4IDMyIDA0IDk3IDc1IEExIDA2IDdFIEQyIDA3IDcxIFwKKyBBMSA3NyBBOCAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyBcCisgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIgkJIyBzZGs1NjA1LmhleAorCitpZiAkP3A0OCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIDdGIDY3IDQzIDY3IDNDIDY3IDM1IDY3IDJGIDA2IDdGIDgwIEQyIFwKKyAxOCA3NCAwMSAyOCA2MCA3RiA2NyA5QiA2NyA4OSA2NyBCRiA2NyA4MyA2NyAzQyBcCisgNjcgNzMgNjcgNjggNjcgNUQgMDYgN0YgODAgRDIgMUEgNzQgMTMgM0EgNzAgNjcgXAorIEFEIDcxIEMzIDc3IEJGIDMyIDAzIDk3IDcxIEMzIDc3IEJGIDMyIDA1IDk3IDcxIFwKKyBDMyA3NyBCRiAxMiBCQSBGRSA3RiAzMiAwMSA5NyA3NSA0RiAwMiAwNiA1MCAzMiBcCisgMDAgOTcgNzUgNTcgMDIgMDYgNTAgOTUgNzUgQzMgODUgNzcgQkYgNjcgQUQgNzUgXAorIEJGIDMyIDA0IDk3IDcxIEMzIDc3IEJGIDY3IEFEIDc1IEJGIDMyIDAzIDk3IDcxIFwKKyBDMyA3NyBCRiA2NyBBRCA3NSBCRiAzMiAwMyA5NyA3MSBCRiAzMiAwNCA5NyA3MSBcCisgQkYgNzcgQzMgNjcgQjYgNzEgQzMgNzcgQkYgMTIgQTAgRkUgN0YgMzIgMDAgOTcgXAorIDc1IDk1IDAyIDA2IDUwIDk1IDc1IEMzIDg1IDc3IEJGIDEyIEJBIEZFIDdGIDMyIFwKKyAwMSA5NyA3NSBBNyAwMiAwNiA1MCA5NSA3NSBDMyA4NSA3NyBCRiAwNiA3RiAxMiBcCisgODAgRjggMTUgMUEgMDAgNTcgMDYgN0YgMTIgODAgRjggMTUgMUEgMDcgNTcgMzIgXAorIDBGIDg3IDU3IDMyIDBFIDg3IDU3JyIJCQkJCSMgcDQ4LmhleAorCitpZiAkP2hlcmMgJiYgISQ/YmxhY2tfa25pZ2h0ICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDEgNjcgMzYgMjkgMzIgMDggRDcgODcgMzIgMDcgRDcgODcgMzIgMDEgRDcgXAorIDg3IDMyIDAwIEQ3IDg3IDgwIEQyIDA5IDc0IDAyIDg2IDdGIDA2IDdGIEMyIDA3IFwKKyA3NCAyNCA4NiA3RSAxNiA3RSBDQSAwNyBFMCAxNyAwRCAxMiAwOCA5OCAyNyBENyBcCisgODcgOTEgNzQgMkQgM0EgMjggMTAgREEgMDcgNzUgM0UgRkEgMDIgNTcgRUEgMDYgXAorIDU3JyIJCQkJCQkJIyBzZGs1NjcwLmhleAorCitpZiAkP2hlcmMgJiYgJD9ibGFja19rbmlnaHQgImxvY2FsIGxlZGNvZGUgJ1wKKyAyQSAwMyAzMiAwOCBENyA4NyAzMiAwNyBENyA4NyAzMiAwMSBENyA4NyAzMiAwMCBcCisgRDcgODcgMkEgMDYgMzIgMDggRDcgODcgMzIgMDcgRDcgODcgMzIgMDEgRDcgODcgXAorIDMyIDAwIEQ3IDg3IDNBIDA4JyIJCQkJCSMga25pZ2dldC5oZXgKKworaWYgJD9kcmFjX2FueSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEMzIDY3IDRFIDY3IDhBIDA2IEMzIDgwIEQyIDBDIDc0IDAxIDI4IFwKKyA2MCBDMyAzMiAwMCBENyA4NyAzMiAwMSBENyA4NyAzMiAwNyBENyA4NyAzMiAwOCBcCisgRDcgODcgMzIgMEYgODcgMzIgMEYgODcgMzIgMEYgODcgMzIgMEYgODcgMTIgQzIgXAorIDg1IDA1IEQyIDBGIDcxIDM4IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIDQyIFwKKyA1MiAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSA0QyA1MiAwMCAzQSAzOCAzMiAwMCBcCisgOTcgNzUgNUEgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNjYgMTIgXAorIEFEIEZFIEMzIDAyIDBBIDUwIDEyIEFEIEZFIEMzIDk1IDc1IDc4IDg1IDEyIEEwIFwKKyBGRSBDMyA5NSA3NSBDMCA4NSA3NyBCOSAxMiBBMCBGRSBDMyA5NSA3NSA4MiA4NSBcCisgNzcgQzcgMTYgQzAgREEgMDIgNzEgQzcgNzcgQzAgMzIgMDUgOTcgNzEgOUEgMzIgXAorIDAyIDk3IDcxIEI5IDA2IEMxIEQyIDAxIDcxIEI5IDA2IEMzIDY3IEIyIDc1IEI5IFwKKyAzMiAwMyA5NyA3MSBDMCAzMiAwNCA5NyA3NSBDNyAwNiBDMiBEMiAwNyA3MSBDNyBcCisgNzcgQzAgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgXAorIDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIJCSMgc2RrNTY5MC5oZXgKKworaWYgJD9kcmFjb19rMTIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwQiBBMiAwMSAyOCBBMiAwMSA2MCBDMyA2NyAzMiA2NyA2RSAwNiBDMyA5MCBcCisgNzUgMDIgMTIgQzIgODUgMDUgRDIgMEYgNzEgMUMgNTIgMDAgMTIgQzEgODUgMDUgXAorIEQyIDFGIDcxIDI2IDUyIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDMwIDUyIDAwIFwKKyAzQSAzMCAzMiAwMCA5NyA3NSAzRSAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSBcCisgOTcgNzUgNEEgMTIgQUMgRkUgQzMgMDIgMEEgNTAgMTIgQUMgRkUgQzMgOTUgNzUgXAorIDVDIDg1IDEyIEEwIEZFIEMzIDk1IDc1IEE2IDg1IDc3IDlGIDEyIEEwIEZFIEMzIFwKKyA5NSA3NSA2NiA4NSA3NyBBRCAxNiBDMCBEQSAwMiA3MSBBRCA3NyBBNiAzMiAwNSBcCisgOTcgNzEgN0UgMzIgMDIgOTcgNzEgOUYgMDYgQzEgRDIgMDEgNzEgOUYgMDYgQzMgXAorIDY3IDk2IDc1IDlGIDMyIDAzIDk3IDcxIEE2IDMyIDA0IDk3IDc1IEFEIDA2IEMyIFwKKyBEMiAwNyA3MSBBRCA3NyBBNiAxMiA4MCBBMiAwMSBGOCAxNSAxQSAwMCA1NyAzMiBcCisgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgXAorIDMyIDBFIDg3IDU3JyIJCQkJCQkjIGsxMi01NjkwLmhleAorCitpZiAkP2hlcmMgJiYgJD93aGl0ZV9rbmlnaHQgImxvY2FsIGxlZGNvZGUgJ1wKKyAyQSAwMyA2NyAwQSAyQSAwNiA2NyAwQSAzQSAwOCAzMiAwOCBENyA4NyAzMiAwNyBcCisgRDcgODcgMzIgMDEgRDcgODcgMzIgMDAgRDcgODcgNTcnIgkJCSMgd2s1NjcwLmhleAorCitpZiAkP2hlcmMgJiYgJD9tZXJsaW4gImxvY2FsIGxlZGNvZGUgJ1wKKyAyQSAwMyA2NyAwQSAyQSAwNiA2NyAwQSAzQSAwOCAzMiAwOCBENyA4NyAzMiAwMCBcCisgRDcgODcgMzIgMDEgRDcgODcgMzIgMDcgRDcgODcgNTcnIgkJCSMgbWVybGluNTY3MC5oZXgKKworaWYgJD9oZXJjICYmICQ/bGFuY2Vsb3QgImxvY2FsIGxlZGNvZGUgJ1wKKyAyQSAwNSA2NyAxMiAyQSAwNiA2NyAxMiAyQSAwMyA2NyAxMiAyQSAwNCA2NyAxMiBcCisgM0EgMTAgMzIgMDggRDcgODcgMzIgMDAgRDcgODcgMzIgMDEgRDcgODcgMzIgMDcgXAorIEQ3IDg3IDU3JyIJCQkJCQkjIGxhbmNlbG90LmhleAorCitpZiAkP3hnc19mYWJyaWMgJiYgJD9ndWVuZXZlcmUgImxvY2FsIGxlZGNvZGUgJ1wKKyAyQSAwNCA2NyAwQSAyQSAwNSA2NyAwQSAzQSAwNCAzMiAwNyBENyA4NyAzMiAwMCBcCisgMzIgMDEgQjcgRDcgODcgNTcnIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ3VlbmV2ZXJlNTY3MC5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP3doaXRlX2tuaWdodCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEMzIDY3IDJmIDY3IDZCIDA2IEMzIDgwIEQyIDBDIDc0IDAxIDEyIFwKKyBDMiA4NSAwNSBEMiAwRiA3MSAxOSA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiA3MSBcCisgMjMgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgMkQgNTIgMDAgM0EgMzAgMzIgXAorIDAwIDk3IDc1IDNCIDEyIEEwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDQ3IFwKKyAxMiBBQyBGRSBDMyAwMiAwQSA1MCAxMiBBQyBGRSBDMyA5NSA3NSA1OSA4NSAxMiBcCisgQTAgRkUgQzMgOTUgNzUgQTggODUgNzcgOUEgMTIgQTAgRkUgQzMgOTUgNzUgNjMgXAorIDg1IDc3IEExIDE2IEMwIERBIDAyIDcxIEExIDc3IEE4IDMyIDA1IDk3IDcxIDdCIFwKKyAzMiAwMiA5NyA3MSA5QSAwNiBDMSBEMiAwMSA3MSA5QSAwNiBDMyA2NyA5MyA3NSBcCisgOUEgMzIgMDMgOTcgNzEgQTggMzIgMDQgOTcgNzUgQTEgMDYgQzIgRDIgMDcgNzEgXAorIEExIDc3IEE4IDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IFwKKyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciCQkjIHdrNTY5MC5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP21lcmxpbiAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEMzIDY3IDJGIDY3IDZCIDA2IEMzIDgwIEQyIDBDIDc0IDAxIDEyIFwKKyBDMiA4NSAwNSBEMiAwRiA3MSAxOSA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiA3MSBcCisgMjMgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgMkQgNTIgMDAgM0EgMzAgMzIgXAorIDAwIDk3IDc1IDNCIDEyIEEwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDQ3IFwKKyAxMiBBQyBGRSBDMyAwMiAwQSA1MCAxMiBBQyBGRSBDMyA5NSA3NSA1OSA4NSAxMiBcCisgQTAgRkUgQzMgOTUgNzUgQTggODUgNzcgOUEgMTIgQTAgRkUgQzMgOTUgNzUgNjMgXAorIDg1IDc3IEExIDE2IEMwIERBIDAyIDcxIEExIDc3IEE4IDMyIDA1IDk3IDcxIDdCIFwKKyAzMiAwMiA5NyA3MSA5QSAwNiBDMSBEMiAwMSA3MSA5QSAwNiBDMyA2NyA5MyA3NSBcCisgOUEgMzIgMDMgOTcgNzEgQTggMzIgMDQgOTcgNzUgQTEgMDYgQzIgRDIgMDcgNzEgXAorIEExIDc3IEE4IDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IFwKKyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyciCQkjIG1lcmxpbjU2OTAuaGV4CisKK2lmICQ/ZHJhY19hbnkgJiYgJD9nYWxhaGFkICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgMkYgNjcgNkIgMDYgQzMgODAgRDIgMEMgNzQgMDEgMTIgXAorIEMyIDg1IDA1IEQyIDBGIDcxIDE5IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIFwKKyAyMyA1MiAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAyRCA1MiAwMCAzQSAzMCAzMiBcCisgMDAgOTcgNzUgM0IgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDcgXAorIDEyIEFDIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDU5IDg1IDEyIFwKKyBBMCBGRSBDMyA5NSA3NSBBOCA4NSA3NyA5QSAxMiBBMCBGRSBDMyA5NSA3NSA2MyBcCisgODUgNzcgQTEgMTYgQzAgREEgMDIgNzEgQTEgNzcgQTggMzIgMDUgOTcgNzEgN0IgXAorIDMyIDAyIDk3IDcxIDlBIDA2IEMxIEQyIDAxIDcxIDlBIDA2IEMzIDY3IDkzIDc1IFwKKyA5QSAzMiAwMyA5NyA3MSBBOCAzMiAwNCA5NyA3NSBBMSAwNiBDMiBEMiAwNyA3MSBcCisgQTEgNzcgQTggMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgXAorIDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3JyIJCSMgZ2FsYWhhZC5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP2xtICJsb2NhbCBsZWRjb2RlICdcCitFMCAyOCA2MCBDMyA2NyAyRCAwNiBDMyA4MCBEMiAwQyA3NCAwMSAxMiBDMiA4NSBcCiswNSBEMiAwRiA3MSAxNyA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiA3MSAyMSA1MiBcCiswMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAyQiA1MiAwMCAzQSAxOCAzMiAwMCA5NyBcCis3NSAzOSAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NSAxMiBBQyBcCitGRSBDMyAwMiAwQSA1MCAxMiBBQyBGRSBDMyA5NSA3NSA1RiA4NSAxMiBBMCBGRSBcCitDMyA5NSA3MSA1QyAxNiBDMCBEQSAwMiA3MSBBNiA3NyBCNCA4NSA3NyA3NyAxMiBcCitBMCBGRSBDMyA5NSA3NSA2RiA4NSAxNiBDMCBEQSAwMiA3MSBBNiA3NyBBRCAxNiBcCitDMCBEQSAwMiA3MSBBRCA3NyBCNCAzMiAwNSA5NyA3MSA4MiAwNiBDMSBEMiAwMSBcCis3MSBBNiAwNiBDMyA2NyA5RiA3NSBBNiAzMiAwMiA5NyA3MSBBNiAzMiAwMyA5NyBcCis3MSBCNCAzMiAwNCA5NyA3NSBBRCAwNiBDMiBEMiAwNyA3MSBBRCA3NyBCNCAxMiBcCis4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyBcCiszMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICAgICAgIyBsbTU2OTAuaGV4CisKK2lmICQ/dHdvbHlueCAibG9jYWwgbGVkY29kZSAnXAorIDJBIDAxIDY3IDBBIDJBIDAwIDY3IDBBIDNBIDA4IDMyIDA4IEQ3IDg3IDMyIDAwIFwKKyBENyA4NyAzMiAwMSBENyA4NyAzMiAwNyBENyA4NyA1NyciICAgICAgICAgICAgICAgICAjIHR3b2x5bnguaGV4CisKK2lmICQ/bHlueF9hbnkgJiYgJD9oZXJjdWx5bnggfHwgJD9seW54YWxvdCB8fCAkP2xtIHx8ICQ/Z3VlbmV2ZXJlIFwKKwkibG9jYWwgbGVkY29kZSAnXAorMTIgQzAgODUgMDUgRDIgMDMgNzEgMEEgNTIgMDAgMkEgMDAgNjcgMTAgM0EgMDQgXAorMzIgMDggRDcgODcgMDYgQzAgRDIgMDEgNzEgMjIgMzIgMEYgODcgMzIgMEYgODcgXAorNzcgMkEgMzIgMDAgRDcgODcgMzIgMDEgRDcgODcgMzIgMDcgRDcgODcgNTcnIiAgICAgICMgaGVyY3VseW54LmhleAorCitpZiAkP3R1Y2FuYSAmJiAhJD9tYWdudW0gImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCA2NyAyMyBEMiAxOCA3NCAwMSAwMiAyMCA2NyAyMyBEMiAzOCA3NCAwOSAwMiBcCisgMTggNjcgMjMgRDIgMUMgNzQgMTEgRTkgMDIgODAgNDUgODAgODEgREEgMEQgNzQgXAorIDFBIDNBIDY4IDI4IDYwIEUzIDY3IDRBIDY3IDM2IDA2IEU0IDMwIDg3IDA2IEU1IFwKKyAzMCA4NyAwNiBFMyA4MCA1NyAzMiAwMCA5NyA3MSA0NSAzMiAwMSA5NyA3MSA0NSBcCisgMDIgMEYgNjAgRTUgNTcgMDIgMEUgNjAgRTUgNTcgMDYgRTMgMTIgQTAgRjggMTUgXAorIDFBIDAwIDc1IDU5IDAyIDBFIDYwIEU0IDU3IDAyIDBGIDYwIEU0IDU3JyIgICAgICAgICMgc2RrNTY2NS5oZXgKKworaWYgJD9tYWdudW0gJiYgISQ/dHVjMjRfcmVmICYmICEkP0JDTTU2NTBfQzAgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBGQyA2NyA1QSA2NyA5QyAwNiBGQSA2NyBEQSAwNiBGQiA2NyBEQSBcCisgMDYgRkMgODAgRDIgMUMgNzQgMDEgMTIgRkQgODUgMDUgRDIgMEYgNzEgMjEgNTIgXAorIDAwIDEyIEZFIDg1IDA1IEQyIDFGIDcxIDJCIDUyIDAwIDEyIEZGIDg1IDA1IEQyIFwKKyAwNSA3MSAzNSA1MiAwMCBFOSAwNSA5OCA5OCA5OCA5OCBDMiAwRiA2MCBGOSAwNSBcCisgODggODggODggODggQzIgRjAgQjYgRjkgNTAgODEgREEgMEMgNzQgMzYgRTkgMDIgXAorIDgwIDQ1IDgwIDgxIERBIDBFIDc0IDUxIDNBIDcwIDMyIDAwIDk3IDc1IDY2IDEyIFwKKyBDMCBGRSBGQyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA3MiAxMiBEQyBGRSBGQyAwMiBcCisgMEEgNTAgMTIgREMgRkUgRkMgOTUgNzUgODYgODUgMTIgQzAgRkUgRkMgOTUgMDIgXAorIEZBIDc1IEQ3IDg1IDc3IEQxIDEyIEMwIEZFIEZDIDk1IDc1IDkyIDg1IDAyIEZBIFwKKyA3NyBENCAxNiBGRiBEQSAwMiAwMiBGQSA3MSBENCA3NyBENyAzMiAwNSA5NyA3MSBcCisgQTkgMDYgRkUgRDIgMDEgMDIgRkIgNzEgRDEgMDYgRkMgNjcgQ0EgMDIgRkIgNzUgXAorIEQxIDMyIDAyIDk3IDcxIEQxIDMyIDAzIDk3IDcxIEQ3IDMyIDA0IDk3IDc1IEQ0IFwKKyAwNiBGRCBEMiAwNyAwMiBGQiA3MSBENCA3NyBENyAxMiBBMCBGOCAxNSAxQSAwMCBcCisgNTcgNDIgMDAgNTcgNDIgMDEgNTcgNDIgMDIgNTcgRDIgMDIgNzQgRTMgMzIgMEYgXAorIDg3IDc3IEU2IDMyIDBFIDg3IEQyIDAxIDc0IEVFIDMyIDBGIDg3IDU3IDMyIDBFIFwKKyA4NyA1NyciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNkazU2NjUuaGV4CisKK2lmICQ/bWFnbnVtICYmICEkP3R1YzI0X3JlZiAmJiAkP0JDTTU2NTBfQzAgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCA2MCBGQiBEMiAxOCA3NSAwOSBBMiAwMSA2MCBGQyAyOCA2NyAzNyA2NyA3MyBcCisgMDYgRkIgODAgRDIgMUMgNzQgMDEgMTIgRkQgODUgMDUgRDIgMEYgNzEgMjEgNTIgXAorIDAwIDEyIEZFIDg1IDA1IEQyIDFGIDcxIDJCIDUyIDAwIDEyIEZGIDg1IDA1IEQyIFwKKyAwNSA3MSAzNSA1MiAwMCAzQSA3MCAzMiAwMCA5NyA3NSA0MyAxMiBDMCBGRSBGQyBcCisgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNEYgMTIgREMgRkUgRkMgMDIgMEEgNTAgMTIgXAorIERDIEZFIEZDIDk1IDc1IDYxIDg1IDEyIEMwIEZFIEZDIDk1IDc1IEIwIDg1IDc3IFwKKyBBMiAxMiBDMCBGRSBGQyA5NSA3NSA2QiA4NSA3NyBBOSAxNiBGRiBEQSAwMiA3MSBcCisgQTkgNzcgQjAgMzIgMDUgOTcgNzEgN0UgMDYgRkUgRDIgMDEgNzEgQTIgMDYgRkMgXAorIDY3IDlCIDc1IEEyIDMyIDAyIDk3IDcxIEEyIDMyIDAzIDk3IDcxIEIwIDMyIDA0IFwKKyA5NyA3NSBBOSAwNiBGRCBEMiAwNyA3MSBBOSA3NyBCMCAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEYgODcgMzIgMEYgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgXAorIDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtYWdudW1fc2RrLmhleAorCitpZiAkP3R1YzI0X3JlZiAmJiAkP0JDTTU2NTBfQzAgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCA2MCBGQiBEMiAxOCA3MSAxMCA2MCBGQyAyOCA2NyBEMCA2NyBDMCA3NyAxOSBcCisgQTIgMDEgNjAgRkMgMjggNjcgNDAgNjcgN0MgMDYgRkIgODAgRDIgMUMgNzQgMDEgXAorIDEyIEZEIDg1IDA1IEQyIDBGIDcxIDJBIDUyIDAwIDEyIEZFIDg1IDA1IEQyIDFGIFwKKyA3MSAzNCA1MiAwMCAxMiBGRiA4NSAwNSBEMiAwNSA3MSAzRSA1MiAwMCAzQSA2OCBcCisgMzIgMDAgOTcgNzUgNEMgMTIgQzAgRkUgRkMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgXAorIDU4IDEyIERDIEZFIEZDIDAyIDBBIDUwIDEyIERDIEZFIEZDIDk1IDc1IDZBIDg1IFwKKyAxMiBDMCBGRSBGQyA5NSA3NSBCOSA4NSA3NyBBQiAxMiBDMCBGRSBGQyA5NSA3NSBcCisgNzQgODUgNzcgQjIgMTYgRkYgREEgMDIgNzEgQjIgNzcgQjkgMzIgMDUgOTcgNzEgXAorIDg3IDA2IEZFIEQyIDAxIDcxIEFCIDA2IEZDIDY3IEE0IDc1IEFCIDMyIDAyIDk3IFwKKyA3MSBBQiAzMiAwMyA5NyA3MSBCOSAzMiAwNCA5NyA3NSBCMiAwNiBGRCBEMiAwNyBcCisgNzEgQjIgNzcgQjkgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgMzIgMEYgXAorIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3IFwKKyAwMiAwRSAzMiAwMCA5NyA3MSBDRCAzMiAwMSA5NyA3MSBDRCA4MCAzMCA4NyA1NyBcCisgMDYgRkMgMTIgQTAgRjggMTUgMUEgMDAgMDIgMEYgNzUgREQgOTAgMzAgODcgNTcnIiAgIyBtYWdudW0uaGV4CisKK2lmICQ/dHVjMjRfcmVmICYmICEkP0JDTTU2NTBfQzAgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBGQyBEMiAxOCA3MSAwRSA2NyBFOSA2NyBEOSA3NyAxQSA2NyA1QSBcCisgNjcgOUMgMDYgRkEgNjcgRDAgMDYgRkIgNjcgRDAgMDYgRkMgODAgRDIgMUMgNzQgXAorIDAxIDEyIEZFIDg1IDA1IEQyIDFGIDcxIDJCIDUyIDAwIDEyIEZGIDg1IDA1IEQyIFwKKyAwNSA3MSAzNSA1MiAwMCBFOSAwNSA5OCA5OCA5OCA5OCBDMiAwRiA2MCBGOSAwNSBcCisgODggODggODggODggQzIgRjAgQjYgRjkgNTAgODEgREEgMEMgNzQgMzYgRTkgMDIgXAorIDgwIDQ1IDgwIDgxIERBIDBEIDc0IDUxIDNBIDY4IDMyIDAwIDk3IDc1IDY2IDEyIFwKKyBDMCBGRSBGQyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA3MiAxMiBEQyBGRSBGQyAwMiBcCisgMEEgNTAgMTIgREMgRkUgRkMgOTUgNzUgODYgODUgMTIgQzAgRkUgRkMgOTUgMDIgXAorIEZBIDc1IENEIDg1IDc3IEM3IDEyIEMwIEZFIEZDIDk1IDc1IDkyIDg1IDAyIEZBIFwKKyA3NyBDQSAxNiBGRiBEQSAwMiAwMiBGQSA3MSBDQSA3NyBDRCAzMiAwNSA5NyA3MSBcCisgQTkgMDYgRkUgRDIgMDEgMDIgRkIgNzEgQzcgMDYgRkMgNjcgQzAgMDIgRkIgNzUgXAorIEM3IDMyIDAyIDk3IDcxIEM3IDMyIDAzIDk3IDcxIENEIDMyIDA0IDk3IDc1IENBIFwKKyAxMiBBMCBGOCAxNSAxQSAwMCA1NyA0MiBGRiA1NyA0MiBGRSA1NyA0MiBFRiA1NyBcCisgMzAgODcgOTggOTggOTggOTggMzAgODcgNTcgMDIgMEUgMzIgMDAgOTcgNzEgRTYgXAorIDMyIDAxIDk3IDcxIEU2IDgwIDMwIDg3IDU3IDA2IEZDIDEyIEEwIEY4IDE1IDFBIFwKKyAwMCAwMiAwRiA3NSBGNiA5MCAzMCA4NyA1NyciICAgICAgICAgICAgICAgICAgICAgICAjIHR1YzI0X3JlZi5oZXgKKworaWYgJD9oZXJjOF8xNSAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAxIDI4IDMyIDA4IEQ3IDg3IDMyIDA3IEQ3IDg3IDMyIDAxIEQ3IDg3IDMyIFwKKyAwMCBENyA4NyA4MCBEMiAwOSA3NCAwMiA4NiA3RiAwNiA3RiBDMiAwNyA3NCAyMiBcCisgODYgN0UgMTYgN0UgQ0EgMDcgRTAgMTcgMEQgMTIgMDggOTggMjcgRDcgODcgOTEgXAorIDc0IDJCIDNBIDI4JyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2RrNTY3NS5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP2xtICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgMkQgMDYgQzMgODAgRDIgMEMgNzQgMDEgMTIgQzIgODUgXAorIDA1IEQyIDBGIDcxIDE3IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIDIxIDUyIFwKKyAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAyQiA1MiAwMCAzQSAxOCAzMiAwMCA5NyBcCisgNzUgMzkgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDUgMTIgQUMgXAorIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDVGIDg1IDEyIEEwIEZFIFwKKyBDMyA5NSA3MSA1QyAxNiBDMCBEQSAwMiA3MSBBNiA3NyBCNCA4NSA3NyA3NyAxMiBcCisgQTAgRkUgQzMgOTUgNzUgNkYgODUgMTYgQzAgREEgMDIgNzEgQTYgNzcgQUQgMTYgXAorIEMwIERBIDAyIDcxIEFEIDc3IEI0IDMyIDA1IDk3IDcxIDgyIDA2IEMxIEQyIDAxIFwKKyA3MSBBNiAwNiBDMyA2NyA5RiA3NSBBNiAzMiAwMiA5NyA3MSBBNiAzMiAwMyA5NyBcCisgNzEgQjQgMzIgMDQgOTcgNzUgQUQgMDYgQzIgRDIgMDcgNzEgQUQgNzcgQjQgMTIgXAorIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IFwKKyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCciICAjIGxtNTY5MC5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP2xtNDhwICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgN0MgMDYgQzMgODAgMjggNjAgQzMgNjcgN0MgNjcgNDAgXAorIDA2IEMzIDkwIDI4IDYwIEMzIDY3IDQwIDA2IEMzIDgwIDgwIEQyIDBDIDc0IDAxIFwKKyAxMiBDMiA4NSAwNSBEMiAwRiA3MSAyQSA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiBcCisgNzEgMzQgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgM0UgNTIgMDAgM0EgMzAgXAorIDMyIDAwIDk3IDc1IDRDIDEyIEEwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IFwKKyA1OCAxMiBBQyBGRSBDMyAwMiAwQSA1MCAxMiBBQyBGRSBDMyA5NSA3NSA2QSA4NSBcCisgMTIgQTAgRkUgQzMgOTUgNzUgQjkgODUgNzcgQUIgMTIgQTAgRkUgQzMgOTUgNzUgXAorIDc0IDg1IDc3IEIyIDE2IEMwIERBIDAyIDcxIEIyIDc3IEI5IDMyIDA1IDk3IDcxIFwKKyA4QyAzMiAwMiA5NyA3MSBBQiAwNiBDMSBEMiAwMSA3MSBBQiAwNiBDMyA2NyBBNCBcCisgNzUgQUIgMzIgMDMgOTcgNzEgQjkgMzIgMDQgOTcgNzUgQjIgMDYgQzIgRDIgMDcgXAorIDcxIEIyIDc3IEI5IDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIFwKKyA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICAjIGxtNDhwNTY5NS5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP2xtNDhwX0IgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBDMyA2NyA3OSAwNiBDMyA2NyAzRCAwNiBDMyA4MCAyOCA2MCBDMyBcCisgNjcgM0QgMDYgQzMgNjcgNzkgMDYgQzMgODAgRDIgMEMgNzQgMDEgMTIgQzIgODUgXAorIDA1IEQyIDBGIDcxIDI3IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIDMxIDUyIFwKKyAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAzQiA1MiAwMCAzQSAzMCAzMiAwMCA5NyBcCisgNzUgNDkgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNTUgMTIgQUMgXAorIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDY3IDg1IDEyIEEwIEZFIFwKKyBDMyA5NSA3NSBCNiA4NSA3NyBBOCAxMiBBMCBGRSBDMyA5NSA3NSA3MSA4NSA3NyBcCisgQUYgMTYgQzAgREEgMDIgNzEgQUYgNzcgQjYgMzIgMDUgOTcgNzEgODkgMzIgMDIgXAorIDk3IDcxIEE4IDA2IEMxIEQyIDAxIDcxIEE4IDA2IEMzIDY3IEExIDc1IEE4IDMyIFwKKyAwMyA5NyA3MSBCNiAzMiAwNCA5NyA3NSBBRiAwNiBDMiBEMiAwNyA3MSBBRiA3NyBcCisgQjYgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgXAorIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgICMgbG00OHA1Njk1XzEwLmhleAorCitpZiAkP2ZpcmVib2x0X2FueSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDU1IDY3IDkxIDA2IEUzIDgwIDI4IDYwIEUzIDY3IDkxIFwKKyA2NyA1NSAwNiBFMyA4MCBEMiAxOCA3NCAwMSAyOCA2MCBFMyA2NyBCOSA3NSAyNiBcCisgNjcgQ0UgNjcgNTUgNzcgMkUgMzIgMEUgODcgMzIgMDggODcgNjcgQzAgMDYgRTMgXAorIDgwIEQyIDFDIDc0IDE5IDEyIEUyIDg1IDA1IEQyIDBGIDcxIDNGIDUyIDAwIDEyIFwKKyBFMSA4NSAwNSBEMiAxRiA3MSA0OSA1MiAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSBcCisgNTMgNTIgMDAgM0EgNzAgMzIgMDAgOTcgNzUgNjEgMTIgQTAgRkUgRTMgMDIgMEEgXAorIDUwIDMyIDAxIDk3IDc1IDZEIDEyIEJDIEZFIEUzIDAyIDBBIDUwIDEyIEJDIEZFIFwKKyBFMyA5NSA3NSA3RiA4NSAxMiBBMCBGRSBFMyA5NSA3NSBDRSA4NSA3NyBDMCAxMiBcCisgQTAgRkUgRTMgOTUgNzUgODkgODUgNzcgQzcgMTYgRTAgREEgMDIgNzEgQzcgNzcgXAorIENFIDMyIDA1IDk3IDcxIEExIDMyIDAyIDk3IDcxIEMwIDA2IEUxIEQyIDAxIDcxIFwKKyBDMCAwNiBFMyA2NyBCOSA3NSBDMCAzMiAwMyA5NyA3MSBDRSAzMiAwNCA5NyA3NSBcCisgQzcgMDYgRTIgRDIgMDcgNzEgQzcgNzcgQ0UgMTIgODAgRjggMTUgMUEgMDAgNTcgXAorIDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIFwKKyA4NyAzMiAwRSA4NyA1NyciICAjIHNkazU2NTA0LmhleAorCisjTGVkIHByb2dyYW0gZm9yIG5ldyByZXYgb2YgRkIgU0RLIGFuZCBSZWYgZGVzaWduCitpZiAkP2ZpcmVib2x0X2FueSAmJiAhJD9mYjI0ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNEIgNjcgODcgMDYgRTMgODAgRDIgMTggNzQgMDEgMjggXAorIDYwIEUzIDY3IEFGIDc1IDFDIDY3IEM0IDY3IDRCIDc3IDI0IDMyIDBFIDg3IDMyIFwKKyAwOCA4NyA2NyBCNiAwNiBFMyA4MCBEMiAxQyA3NCAwRiAxMiBFMiA4NSAwNSBEMiBcCisgMEYgNzEgMzUgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgM0YgNTIgMDAgMTIgXAorIEUwIDg1IDA1IEQyIDA1IDcxIDQ5IDUyIDAwIDNBIDcwIDMyIDAwIDk3IDc1IDU3IFwKKyAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA2MyAxMiBCQyBGRSBFMyBcCisgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgNzUgODUgMTIgQTAgRkUgRTMgOTUgXAorIDc1IEM0IDg1IDc3IEI2IDEyIEEwIEZFIEUzIDk1IDc1IDdGIDg1IDc3IEJEIDE2IFwKKyBFMCBEQSAwMiA3MSBCRCA3NyBDNCAzMiAwNSA5NyA3MSA5NyAzMiAwMiA5NyA3MSBcCisgQjYgMDYgRTEgRDIgMDEgNzEgQjYgMDYgRTMgNjcgQUYgNzUgQjYgMzIgMDMgOTcgXAorIDcxIEM0IDMyIDA0IDk3IDc1IEJEIDA2IEUyIEQyIDA3IDcxIEJEIDc3IEM0IDEyIFwKKyA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyBcCisgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjIHNkazU2NTA0cmVmLmhleAorCisjT3ZlcnJpZGUgRGVmYXVsdCBGaXJlYm9sdCBMRUQgcHJvZ3JhbSBmb3IgTGluZSBNb2R1bGUKK2lmICQ/bG0gJiYgJD9maXJlYm9sdF9hbnkgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyA3OSAwNiBFMyA2NyAzRCAwNiBFMyA4MCAyOCA2MCBFMyBcCisgNjcgM0QgMDYgRTMgNjcgNzkgMDYgRTMgODAgRDIgMTggNzQgMDEgMTIgRTIgODUgXAorIDA1IEQyIDBGIDcxIDI3IDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIDMxIDUyIFwKKyAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSAzQiA1MiAwMCAzQSA2MCAzMiAwMCA5NyBcCisgNzUgNDkgMTIgQTAgRkUgRTMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNTUgMTIgQkMgXAorIEZFIEUzIDAyIDBBIDUwIDEyIEJDIEZFIEUzIDk1IDc1IDY3IDg1IDEyIEEwIEZFIFwKKyBFMyA5NSA3NSBCNiA4NSA3NyBBOCAxMiBBMCBGRSBFMyA5NSA3NSA3MSA4NSA3NyBcCisgQUYgMTYgRTAgREEgMDIgNzEgQUYgNzcgQjYgMzIgMDUgOTcgNzEgODkgMzIgMDIgXAorIDk3IDcxIEE4IDA2IEUxIEQyIDAxIDcxIEE4IDA2IEUzIDY3IEExIDc1IEE4IDMyIFwKKyAwMyA5NyA3MSBCNiAzMiAwNCA5NyA3NSBBRiAwNiBFMiBEMiAwNyA3MSBBRiA3NyBcCisgQjYgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgXAorIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgIyBsbTQ4cDU2NTA0LmhleAorCisjT3ZlcnJpZGUgRGVmYXVsdCBGaXJlYm9sdCBMRUQgcHJvZ3JhbSBmb3IgTGluZSBNb2R1bGUgLTUwIHZlcnNpb24KK2lmICQ/bG0gJiYgJD9sbTQ4cF9EICYmICQ/ZmlyZWJvbHRfYW55ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNkQgMDYgRTMgNjcgMzEgMDYgRTMgODAgRDIgMTggNzQgXAorIDAxIDEyIEUyIDg1IDA1IEQyIDBGIDcxIDFCIDUyIDAwIDEyIEUxIDg1IDA1IEQyIFwKKyAxRiA3MSAyNSA1MiAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSAyRiA1MiAwMCAzQSBcCisgNjAgMzIgMDAgOTcgNzUgM0QgMTIgQTAgRkUgRTMgMDIgMEEgNTAgMzIgMDEgOTcgXAorIDc1IDQ5IDEyIEJDIEZFIEUzIDAyIDBBIDUwIDEyIEJDIEZFIEUzIDk1IDc1IDVCIFwKKyA4NSAxMiBBMCBGRSBFMyA5NSA3NSBBQSA4NSA3NyA5QyAxMiBBMCBGRSBFMyA5NSBcCisgNzUgNjUgODUgNzcgQTMgMTYgRTAgREEgMDIgNzEgQTMgNzcgQUEgMzIgMDUgOTcgXAorIDcxIDdEIDMyIDAyIDk3IDcxIDlDIDA2IEUxIEQyIDAxIDcxIDlDIDA2IEUzIDY3IFwKKyA5NSA3NSA5QyAzMiAwMyA5NyA3MSBBQSAzMiAwNCA5NyA3NSBBMyAwNiBFMiBEMiBcCisgMDcgNzEgQTMgNzcgQUEgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgXAorIDBFIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IFwKKyA1NyciICMgbG00OHA1NjUwNF81MC5oZXgKKworaWYgJD9sbSAmJiAkP2ZpcmVib2x0XzEweDQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxOCAyOCAzMiAwNyA2NyAxRSA3NSAwQSBENyA4NyAzMiAwMSBENyA4NyAzMiBcCisgMDAgRDcgODcgMzIgMDggRDcgODcgODAgRDIgMUMgNzQgMDIgM0EgMEMgMTIgODAgXAorIEY4IDE1IDFBIDAwIDU3ICciICMgbG0xMnBjeDQ1NjUwMS5oZXgKKworaWYgJD9mYnBvZSAmJiAkP2ZpcmVib2x0X2FueSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDg1IDY3IDQ5IDA2IEUzIDgwIEQyIDE4IDc0IDAxIDI4IFwKKyA2MCBFMyA2NyBBRCA3NSAxQSA2NyBDMiA3NyAyMCAzMiAwRSA4NyAzMiAwOCA4NyBcCisgNjcgNDkgMDYgRTMgODAgRDIgMUEgNzQgMEYgMTIgRTIgODUgMDUgRDIgMEYgNzEgXAorIDMzIDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIDNEIDUyIDAwIDEyIEUwIDg1IFwKKyAwNSBEMiAwNSA3MSA0NyA1MiAwMCAzQSA2OCAzMiAwMCA5NyA3NSA1NSAxMiBBMCBcCisgRkUgRTMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNjEgMTIgQkEgRkUgRTMgMDIgMEEgXAorIDUwIDEyIEJBIEZFIEUzIDk1IDc1IDczIDg1IDEyIEEwIEZFIEUzIDk1IDc1IEMyIFwKKyA4NSA3NyBCNCAxMiBBMCBGRSBFMyA5NSA3NSA3RCA4NSA3NyBCQiAxNiBFMCBEQSBcCisgMDIgNzEgQkIgNzcgQzIgMzIgMDUgOTcgNzEgOTUgMzIgMDIgOTcgNzEgQjQgMDYgXAorIEUxIEQyIDAxIDcxIEI0IDA2IEUzIDY3IEFEIDc1IEI0IDMyIDAzIDk3IDcxIEMyIFwKKyAzMiAwNCA5NyA3NSBCQiAwNiBFMiBEMiAwNyA3MSBCQiA3NyBDMiAxMiA4MCBGOCBcCisgMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgXAorIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgIyBwb2U0OHA1NjUwNC5oZXgKKworI092ZXJyaWRlIERlZmF1bHQgRmlyZWJvbHQgTEVEIHByb2dyYW0gZm9yIGZlbGl4CitpZiAkP2ZlbGl4IHx8ICQ/ZmVsaXgxNSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDZCIDY3IEE3IDA2IEUzIDgwIEQyIDE4IDc0IDAxIDAyIFwKKyAxOCAyOCA2MCBFMyA2NyA0OSAwMiAxOSAyOCA2MCBFMyA2NyA0OSAzMiAwRSA4NyBcCisgMzIgMEUgODcgMzIgMEUgODcgMzIgMEUgODcgMTIgRTIgODUgMDUgRDIgMEYgNzEgXAorIDMzIDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIDNEIDUyIDAwIDEyIEUwIDg1IFwKKyAwNSBEMiAwNSA3MSA0NyA1MiAwMCAzQSA2OCA2NyBDRiA3NSA1MiAzMiAwRSA4NyBcCisgNzcgNTUgMzIgMEYgODcgMzIgMDAgOTcgNzUgNUUgMzIgMEUgODcgNTcgMzIgMDEgXAorIDk3IDc1IDY3IDMyIDBFIDg3IDU3IDMyIDBGIDg3IDU3IDMyIDAwIDk3IDc1IDc3IFwKKyAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA4MyAxMiBCQyBGRSBFMyBcCisgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgOTUgODUgMTIgQTAgRkUgRTMgOTUgXAorIDc1IEU0IDg1IDc3IEQ2IDEyIEEwIEZFIEUzIDk1IDc1IDlGIDg1IDc3IEREIDE2IFwKKyBFMCBEQSAwMiA3MSBERCA3NyBFNCAzMiAwNSA5NyA3MSBCNyAzMiAwMiA5NyA3MSBcCisgRDYgMDYgRTEgRDIgMDEgNzEgRDYgMDYgRTMgNjcgQ0YgNzUgRDYgMzIgMDMgOTcgXAorIDcxIEU0IDMyIDA0IDk3IDc1IEREIDA2IEUyIEQyIDA3IDcxIEREIDc3IEU0IDEyIFwKKyA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyBcCisgMzIgMEYgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcnIiAgIyBzZGs1NjEwMi5oZXgKKworI092ZXJyaWRlIERlZmF1bHQgRmVsaXggTEVEIHByb2dyYW0gZm9yIGZlbGl4NDgKK2lmICQ/ZmVsaXg0OCAmJiAkP2ZlbGl4IHx8ICQ/ZmVsaXgxNSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDZCIDY3IEE3IDA2IEUzIDgwIEQyIDE4IDc0IDAxIDAyIFwKKyAxOCAyOCA2MCBFMyA2NyA0OSAwMiAxOSAyOCA2MCBFMyA2NyA0OSAzMiAwRSA4NyBcCisgMzIgMEUgODcgMzIgMEUgODcgMzIgMEUgODcgMTIgRTIgODUgMDUgRDIgMEYgNzEgXAorIDMzIDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIDNEIDUyIDAwIDEyIEUwIDg1IFwKKyAwNSBEMiAwNSA3MSA0NyA1MiAwMCAzQSA2OCA2NyBDRiA3NSA1MiAzMiAwRSA4NyBcCisgNzcgNTUgMzIgMEYgODcgMzIgMDAgOTcgNzUgNUUgMzIgMEUgODcgNTcgMzIgMDEgXAorIDk3IDc1IDY3IDMyIDBFIDg3IDU3IDMyIDBGIDg3IDU3IDMyIDAwIDk3IDc1IDc3IFwKKyAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA4MyAxMiBCQyBGRSBFMyBcCisgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgOTUgODUgMTIgQTAgRkUgRTMgOTUgXAorIDc1IEU0IDg1IDc3IEQ2IDEyIEEwIEZFIEUzIDk1IDc1IDlGIDg1IDc3IEREIDE2IFwKKyBFMCBEQSAwMiA3MSBERCA3NyBFNCAzMiAwNSA5NyA3MSBCNyAzMiAwMiA5NyA3MSBcCisgRDYgMDYgRTEgRDIgMDEgNzEgRDYgMDYgRTMgNjcgQ0YgNzUgRDYgMzIgMDMgOTcgXAorIDcxIEU0IDMyIDA0IDk3IDc1IEREIDA2IEUyIEQyIDA3IDcxIEREIDc3IEU0IDEyIFwKKyA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyBcCisgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAgIyBmZWxpeDQ4LmhleAorCitpZiAkP2Vhc3lyaWRlcl9hbnkgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyA1OSA2NyA5NSAwNiBFMyA4MCAyOCA2MCBFMyA2NyA5NSBcCisgNjcgNTkgMDYgRTMgODAgRDIgMEMgNzQgMDEgMjggNjAgRTMgNjcgQkQgNzUgMjYgXAorIDY3IEQyIDY3IDU5IDc3IDJFIDMyIDBFIDg3IDMyIDA4IDg3IDY3IEM0IDA2IEUzIFwKKyA4MCBEMiAwRCA3NCAxOSAxMiBFMiA4NSAwNSBEMiAwRiA3MSAzRiA1MiAwMCAxMiBcCisgRTEgODUgMDUgRDIgMUYgNzEgNDkgNTIgMDAgMTIgRTAgODUgMDUgRDIgMDUgNzEgXAorIDUzIDUyIDAwIDY3IEM0IDY3IEM0IDNBIDM4IDMyIDAwIDk3IDc1IDY1IDEyIEEwIFwKKyBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA3MSAxMiBBRCBGRSBFMyAwMiAwQSBcCisgNTAgMTIgQUQgRkUgRTMgOTUgNzUgODMgODUgMTIgQTAgRkUgRTMgOTUgNzUgRDIgXAorIDg1IDc3IEM0IDEyIEEwIEZFIEUzIDk1IDc1IDhEIDg1IDc3IENCIDE2IEUwIERBIFwKKyAwMiA3MSBDQiA3NyBEMiAzMiAwNSA5NyA3MSBBNSAzMiAwMiA5NyA3MSBDNCAwNiBcCisgRTEgRDIgMDEgNzEgQzQgMDYgRTMgNjcgQkQgNzUgQzQgMzIgMDMgOTcgNzEgRDIgXAorIDMyIDA0IDk3IDc1IENCIDA2IEUyIEQyIDA3IDcxIENCIDc3IEQyIDEyIDgwIEY4IFwKKyAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiBcCisgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAgICMgc2RrNTY2MDEuaGV4CisKKyNPdmVycmlkZSBEZWZhdWx0IEVhc3lyaWRlciBMRUQgcHJvZ3JhbSBmb3IgNTY2MDIKK2lmICQ/ZWFzeXJpZGVyXzF4MSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDYwIEUxIDY3IDdDIDY3IDdDIDA2IEUxIDgwIEQyIDBDIDc0IDAxIDAyIDBDIFwKKyAyOCA2MCBFMSA2NyA3NSA3NSAxRCA2NyA4QSA2NyAzOSA3NyAyNSAzMiAwRSA4NyBcCisgMzIgMDggODcgNjcgN0MgMDYgRTEgRDIgMDAgMDIgMDAgNzQgMTAgMTIgRTAgODUgXAorIDA1IEQyIDA1IDcxIDM3IDUyIDAwIDNBIDM4IDMyIDAwIDk3IDc1IDQ1IDEyIEEwIFwKKyBGRSBFMSAwMiAwQSA1MCAzMiAwMSA5NyA3NSA1MSAxMiBBRCBGRSBFMSAwMiAwQSBcCisgNTAgMTIgQUQgRkUgRTEgOTUgNzUgNjMgODUgMTIgQTAgRkUgRTEgOTUgNzUgOEEgXAorIDg1IDc3IDdDIDEyIEEwIEZFIEUxIDk1IDc1IDZEIDg1IDc3IDgzIDE2IEUwIERBIFwKKyAwMiA3MSA4MyA3NyA4QSAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiBcCisgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgXAorIDU3JyIgICAjIHNkazU2NjAyLmhleAorCisjT3ZlcnJpZGUgRGVmYXVsdCAgTEVEIHByb2dyYW0gZm9yIDUzMzAwCitpZiAkP21pcmFnZTI0ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNkIgNjcgMkYgMDYgRTMgODAgRDIgMTggNzQgMDEgMTIgXAorIEUyIDg1IDA1IEQyIDBGIDcxIDE5IDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIFwKKyAyMyA1MiAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSAyRCA1MiAwMCAzQSAzMCAzMiBcCisgMDAgOTcgNzUgM0IgMTIgQTAgRkUgRTMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDcgXAorIDEyIEJDIEZFIEUzIDAyIDBBIDUwIDEyIEJDIEZFIEUzIDk1IDc1IDU5IDg1IDEyIFwKKyBBMCBGRSBFMyA5NSA3NSBBMiA4NSA3NyA5QSAxMiBBMCBGRSBFMyA5NSA3NSA2MyBcCisgODUgNzcgOUUgMTYgRTAgREEgMDIgNzEgOUUgNzcgQTIgMzIgMDUgOTcgNzEgN0IgXAorIDMyIDAyIDk3IDcxIDlBIDA2IEUxIEQyIDAxIDcxIDlBIDA2IEUzIDY3IDkzIDc1IFwKKyA5QSAzMiAwMyA5NyA3MSBBMiAzMiAwNCA5NyA3NSA5RSAwNiBFMiBEMiAwNyA3MSBcCisgOUUgNzcgQTIgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgXAorIDg3IDU3IDMyIDBFIDg3IDU3JyIgICMgc2RrNTMzMDAuaGV4CisKKyNPdmVycmlkZSBEZWZhdWx0IExFRCBwcm9ncmFtIGZvciA1NjMxNAoraWYgJD9iY201NjMxNHAyNHJlZiAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDc5IDY3IDNEIDA2IEUzIDgwIEQyIDE4IDc0IDAxIDI4IFwKKyA2MCBFMyA2NyA3OSA2NyBBOCAwNiBFMyA4MCBEMiAxQyA3NCAwRiAxMiBFMiA4NSBcCisgMDUgRDIgMEYgNzEgMjcgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgMzEgNTIgXAorIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDNCIDUyIDAwIDNBIDM4IDMyIDAwIDk3IFwKKyA3NSA0OSAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA1NSAxMiBCQyBcCisgRkUgRTMgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgNjcgODUgMTIgQTAgRkUgXAorIEUzIDk1IDc1IEIwIDg1IDc3IEE4IDEyIEEwIEZFIEUzIDk1IDc1IDcxIDg1IDc3IFwKKyBBQyAxNiBFMCBEQSAwMiA3MSBBQyA3NyBCMCAzMiAwNSA5NyA3MSA4OSAzMiAwMiBcCisgOTcgNzEgQTggMDYgRTEgRDIgMDEgNzEgQTggMDYgRTMgNjcgQTEgNzUgQTggMzIgXAorIDAzIDk3IDcxIEIwIDMyIDA0IDk3IDc1IEFDIDA2IEUyIEQyIDA3IDcxIEFDIDc3IFwKKyBCMCAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyBcCisgMzIgMEUgODcgNTcnIiAgIyBiY205NTYzMTRwMjRyZWYuaGV4CisKK2lmICQ/YnJhZGxleSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEYyIDY3IDFCIDA2IEYyIDgwIEQyIDE0IDc0IDAxIDg2IEYzIDEyIFwKKyBGMCA4NSAwNSBEMiAwNSA3MSAxOSA1MiAwMCAzQSAyOCAzMiAwMCA5NyA3NSAyNyBcCisgMTIgQTggRkUgRjIgMDIgMEEgNTAgMzIgMDEgOTcgNzUgMzMgMTIgQkMgRkUgRjIgXAorIDAyIDBBIDUwIDEyIEJDIEZFIEYyIDk1IDc1IDQ1IDg1IDEyIEE4IEZFIEYyIDk1IFwKKyA3NSA5MSA4NSA3NyA1NyAxMiBBOCBGRSBGMiA5NSA3NSA0RiA4NSA3NyA4QSAxNiBcCisgRjAgREEgMDIgNzEgOEEgNzcgOTEgMDYgRjIgMTIgOTQgRjggMTUgMDIgMDIgQzEgXAorIDc0IDZFIDAyIDA0IEMxIDc0IDZFIDAyIDA4IEMxIDc0IDZFIDc3IDc0IEM2IEYzIFwKKyA3NCA5MSA3NyA4QSAwNiBGMiA2NyA3QyA3NSA4MyA3NyA5MSAxMiA4MCBGOCAxNSBcCisgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgXAorIDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgICAgICMgc2RrNTY4MDAuaGV4CisKK2lmICQ/aHVtdiAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEYyIDY3IDIxIDA2IEYyIDgwIEQyIDA4IDc0IDBGIEYyIDAyIEQyIFwKKyAxMiA3NCAwMSA4NiBGMyAxMiBGMCA4NSAwNSBEMiAwNSA3MSAxRiA1MiAwMCAzQSBcCisgMjAgMzIgMDAgOTcgNzUgMkQgMTIgQTggRkUgRjIgMDIgMEEgNTAgMzIgMDEgOTcgXAorIDc1IDM5IDEyIEJBIEZFIEYyIDAyIDBBIDUwIDEyIEJBIEZFIEYyIDk1IDc1IDRCIFwKKyA4NSAxMiBBOCBGRSBGMiA5NSA3NSA5NyA4NSA3NyA1RCAxMiBBOCBGRSBGMiA5NSBcCisgNzUgNTUgODUgNzcgOTAgMTYgRjAgREEgMDIgNzEgOTAgNzcgOTcgMDYgRjIgMTIgXAorIDk0IEY4IDE1IDAyIDAyIEMxIDc0IDc0IDAyIDA0IEMxIDc0IDc0IDAyIDA4IEMxIFwKKyA3NCA3NCA3NyA3QSBDNiBGMyA3NCA5NyA3NyA5MCAwNiBGMiA2NyA4MiA3NSA4OSBcCisgNzcgOTcgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgXAorIDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgIyBzZGs1NjcwMC5oZXgKKworaWYgJD9icmFkbGV5XzFnICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgMkYgNjcgNkIgMDYgRTMgODAgRDIgMTQgNzQgMDEgMTIgXAorIEUyIDg1IDA1IEQyIDBGIDcxIDE5IDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIFwKKyAyMyA1MiAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSAyRCA1MiAwMCAzQSA1MCAzMiBcCisgMDAgOTcgNzUgM0IgMTIgQTAgRkUgRTMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDcgXAorIDEyIEI0IEZFIEUzIDAyIDBBIDUwIDEyIEI0IEZFIEUzIDk1IDc1IDU5IDg1IDEyIFwKKyBBMCBGRSBFMyA5NSA3NSBBOCA4NSA3NyA5QSAxMiBBMCBGRSBFMyA5NSA3NSA2MyBcCisgODUgNzcgQTEgMTYgRTAgREEgMDIgNzEgQTEgNzcgQTggMzIgMDUgOTcgNzEgN0IgXAorIDMyIDAyIDk3IDcxIDlBIDA2IEUxIEQyIDAxIDcxIDlBIDA2IEUzIDY3IDkzIDc1IFwKKyA5QSAzMiAwMyA5NyA3MSBBOCAzMiAwNCA5NyA3NSBBMSAwNiBFMiBEMiAwNyA3MSBcCisgQTEgNzcgQTggMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgXAorIDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3ICciICAjIHNkazU2ODAwYy5oZXgKKworaWYgJD9nb2xkd2luZyAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEYzIEQyIDEwIDc1IDBFIDY3IDNCIDY3IDk0IDc3IDEyIDY3IDk0IFwKKyA2NyAzQiAwNiBGMyA4MCBEMiAxNCA3NCAwMSA4NiBGNCAxMiBGMiA4NSAwNSBEMiBcCisgMEYgNzEgMjUgNTIgMDAgMTIgRjEgODUgMDUgRDIgMUYgNzEgMkYgNTIgMDAgMTIgXAorIEYwIDg1IDA1IEQyIDA1IDcxIDM5IDUyIDAwIDNBIDUwIDMyIDAwIDk3IDc1IDQ3IFwKKyAxMiBBOCBGRSBGMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA1MyAxMiBCQyBGRSBGMyBcCisgMDIgMEEgNTAgMTIgQkMgRkUgRjMgOTUgNzUgNjUgODUgMTIgQTggRkUgRjMgOTUgXAorIDc1IEMwIDg1IDc3IDc3IDEyIEE4IEZFIEYzIDk1IDc1IDZGIDg1IDc3IEI5IDE2IFwKKyBGMCBEQSAwMiA3MSBCOSA3NyBDMCAwNiBGMyAxMiA5NCBGOCAxNSAwMiAwMiBDMSBcCisgNzQgOEUgMDIgMDQgQzEgNzQgOEUgMDIgMDggQzEgNzQgOEUgNzcgQjIgQzYgRjQgXAorIDc0IEMwIDc3IEI5IDA2IEYzIDY3IEFCIDc1IEIyIDMyIDA0IDc1IEIyIDMyIDAzIFwKKyA5NyA3MSBDMCAwNiBGMiBEMiAwNyA3MSBCOSA3NyBDMCAxMiA4MCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgXAorIDMyIDBGIDg3IDMyIDBFIDg3IDU3ICciICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNkazU2NTgwLmhleAorCitpZiAkP2h1bXYgJiYgJD9sbSAibG9jYWwgbGVkY29kZSAnXAorIDAyIDA0IDI4IEQyIDA4IDc0IDBBIEYyIDAyIDI4IDMyIDA3IDY3IDI5IDc1IDExIFwKKyBENyA4NyA2MCBFNCA2NyAzMCAwNiBFNCA2MCBFNCA2NyA0QyAwNiBFNCAzMiAwOCBcCisgRDcgODcgODAgRDIgMTIgNzQgMDIgM0EgMzAgMTIgODAgRjggMTUgMUEgMDAgNTcgXAorIDA2IEU0IDEyIDk0IEY4IDE1IDAyIDEwIEMxIDcwIDQyIDEyIEQyIEZFIEU0IDAyIFwKKyAwQSA1MCAxMiBEMiBGRSBFNCA5NSA3NSA2RCA4NSA3NyA2OCAwNiBFNCAxMiA5NCBcCisgRjggMTUgMDIgMjAgQzEgNzAgNUUgMTIgQzAgRkUgRTQgMDIgMEEgNTAgMTIgQzAgXAorIEZFIEU0IDk1IDc1IDZEIDg1IDc3IDY4IDMyIDBFIEQ3IDg3IDU3IDMyIDBGIEQ3IFwKKyA4NyA1NyAnIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsbTEycDU2ODAyLmhleAorCisKK2lmICQ/cmFwdG9yICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDYgMjggNjAgRkYgNjcgNjQgNjcgOTMgMDYgRkYgODAgRDIgMzYgNzQgMDIgXAorIDAyIDA0IDI4IDYwIEZGIDY3IEJCIDc1IDFFIDMyIDBFIDg3IDc3IDIxIDMyIDBGIFwKKyA4NyA2NyA3RCAwNiBGRiA4MCBEMiAwNiA3NCAxMiAwMiAwMSAyOCA2MCBGRiA2NyBcCisgQkIgNzUgMzggMzIgMEUgODcgNzcgM0IgMzIgMEYgODcgNjcgN0QgMDYgRkYgODAgXAorIEQyIDAzIDc0IDJDIDEyIEZFIDg1IDA1IEQyIDBGIDcxIDRFIDUyIDAwIDEyIEZEIFwKKyA4NSAwNSBEMiAxRiA3MSA1OCA1MiAwMCAxMiBGQyA4NSAwNSBEMiAwNSA3MSA2MiBcCisgNTIgMDAgM0EgQzggMzIgMDEgOTcgNzUgNzYgMzIgMDAgOTcgNzUgQzkgMTYgRkMgXAorIERBIDAyIDcxIEM5IDc3IEQwIDMyIDAwIDk3IDc1IEMyIDc3IEQwIDMyIDAwIDk3IFwKKyA3NSA4NiAzMiAwRSA4NyA1NyAzMiAwMSA5NyA3NSA4RiAzMiAwRSA4NyA1NyAzMiBcCisgMEYgODcgNTcgMzIgMDUgOTcgNzEgQTMgMzIgMDIgOTcgNzEgQzIgMDYgRkQgRDIgXAorIDAxIDcxIEMyIDA2IEZGIDY3IEJCIDc1IEMyIDMyIDAzIDk3IDcxIEQwIDMyIDA0IFwKKyA5NyA3NSBDOSAwNiBGRSBEMiAwNyA3MSBDOSA3NyBEMCAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgXAorIDMyIDBGIDg3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgIyBzZGs1NjAxOC5oZXgKKworaWYgJD9yYXB0b3IgJiYgJD9yYXAyNF9yZWYgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwNiA2MCBFMSA2NyA0OCA2NyAzMSAwNiBFMSA4MCBEMiAxRSA3MSAwMiAwMiBcCisgMDUgNjAgRTEgNjcgNDggNjcgMzEgMDYgRTEgOTAgRDIgMDMgNzQgMTEgMDIgMDIgXAorIDYwIEUxIDY3IDQ4IDY3IDMxIDA2IEUxIDkwIEQyIDAwIDc0IDIwIDg2IEUwIDNBIFwKKyAzOCAwNiBFMSA2NyA1MCA3NSA1NyAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA1NyBcCisgMTYgRTAgQ0EgMDUgNzQgNUIgNzcgNTcgMDYgRTEgNjcgNTAgNzUgNTcgNzcgNUIgXAorIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDAwJyIgIyBzZGs1NjIxNC5oZXgKKworaWYgJD9yYXZlbl9lYl80OHAgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwNiAyOCA2MCBDMyA2NyAzMCA2NyA2QyAwNiBDMyA4MCBEMiAxRSA3NCAwMiBcCisgMTIgQzIgODUgMDUgRDIgMEYgNzEgMUEgNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgXAorIDcxIDI0IDUyIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDJFIDUyIDAwIDNBIDYwIFwKKyAzMiAwMCA5NyA3NSAzQyAxMiBDMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSBcCisgNDggMTIgRTAgRkUgQzMgMDIgMEEgNTAgMTIgRTAgRkUgQzMgOTUgNzUgNUEgODUgXAorIDEyIEMwIEZFIEMzIDk1IDc1IEE5IDg1IDc3IDlCIDEyIEMwIEZFIEMzIDk1IDc1IFwKKyA2NCA4NSA3NyBBMiAxNiBDMCBEQSAwMiA3MSBBMiA3NyBBOSAzMiAwNSA5NyA3MSBcCisgN0MgMzIgMDIgOTcgNzEgOUIgMDYgQzEgRDIgMDEgNzEgOUIgMDYgQzMgNjcgOTQgXAorIDc1IDlCIDMyIDAzIDk3IDcxIEE5IDMyIDA0IDk3IDc1IEEyIDA2IEMyIEQyIDA3IFwKKyA3MSBBMiA3NyBBOSAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSBcCisgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjYmNtOTU2MDI0cDQ4cmVmLmhleAorCitpZiAkP0JDTTk1NjAyNFI1MFQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwNiAyOCA2MCBDMyA2NyAzMCA2NyA2QyAwNiBDMyA4MCBEMiAxRSA3NCAwMiBcCisgMTIgQzIgODUgMDUgRDIgMEYgNzEgMUEgNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgXAorIDcxIDI0IDUyIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDJFIDUyIDAwIDNBIDYwIFwKKyAzMiAwMCA5NyA3NSAzQyAxMiBDMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSBcCisgNDggMTIgRTAgRkUgQzMgMDIgMEEgNTAgMTIgRTAgRkUgQzMgOTUgNzUgNUEgODUgXAorIDEyIEMwIEZFIEMzIDk1IDc1IEE5IDg1IDc3IDlCIDEyIEMwIEZFIEMzIDk1IDc1IFwKKyA2NCA4NSA3NyBBMiAxNiBDMCBEQSAwMiA3MSBBMiA3NyBBOSAzMiAwNSA5NyA3NSBcCisgN0MgMzIgMDIgOTcgNzEgOUIgMDYgQzEgRDIgMDEgNzEgOUIgMDYgQzMgNjcgOTQgXAorIDc1IDlCIDMyIDAzIDk3IDcxIEE5IDMyIDA0IDk3IDc1IEEyIDA2IEMyIEQyIDA3IFwKKyA3MSBBMiA3NyBBOSAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSBcCisgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjYmNtOTU2MDI0cjUwdC5oZXgKKworaWYgJD9zY29ycGlvbiB8fCAkP2NvbnF1ZXJvciAibG9jYWwgbGVkY29kZSAnXAorIDAyIDE4IDI4IDYwIEUxIDY3IDEyIDA2IEUxIDkwIEQyIDAwIDc0IDAyIDg2IEUwIFwKKyAzQSAxOCA2NyAyRCA3NSAzNCAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSAzOCAxNiBcCisgRTAgQ0EgMDUgNzQgMzggNzcgMzQgNjcgMkQgNzUgMzQgNzcgMzggMTIgQTAgRjggXAorIDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIFwKKyAwMCAwMCAwMCciICNzZGs1NjgyMC5oZXgKKworaWYgJD9zY29ycGlvbiAmJiAkP0JDTTk1NjgyMFIyNFhHICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDEgMjggNjcgRDAgMDIgMDIgMjggNjcgRDYgNjcgRDAgMDIgMDEgMjggNjcgXAorIEQ2IDAyIDA0IDI4IDY3IEQwIDAyIDAzIDI4IDY3IEQ2IDY3IEQwIDAyIDA0IDI4IFwKKyA2NyBENiAwMiAwNSAyOCA2NyBEMCAwMiAwNiAyOCA2NyBENiA2NyBEMCAwMiAwNSBcCisgMjggNjcgRDYgMDIgMDcgMjggNjcgRDAgMDIgMDggMjggNjcgRDYgNjcgRDAgMDIgXAorIDA3IDI4IDY3IEQ2IDAyIDA5IDI4IDY3IEQwIDAyIDBBIDI4IDY3IEQ2IDY3IEQwIFwKKyAwMiAwOSAyOCA2NyBENiAwMiAwQyAyOCA2NyBEMCAwMiAwQiAyOCA2NyBENiA2NyBcCisgRDAgMDIgMEMgMjggNjcgRDYgMDIgMEQgMjggNjcgRDAgMDIgMEUgMjggNjcgRDYgXAorIDY3IEQwIDAyIDBEIDI4IDY3IEQ2IDAyIDBGIDI4IDY3IEQwIDAyIDEwIDI4IDY3IFwKKyBENiA2NyBEMCAwMiAwRiAyOCA2NyBENiAwMiAxMSAyOCA2NyBEMCAwMiAxMiAyOCBcCisgNjcgRDYgNjcgRDAgMDIgMTEgMjggNjcgRDYgMDIgMTQgMjggNjcgRDAgMDIgMTMgXAorIDI4IDY3IEQ2IDY3IEQwIDAyIDE0IDI4IDY3IEQ2IDAyIDE1IDI4IDY3IEQwIDAyIFwKKyAxNiAyOCA2NyBENiA2NyBEMCAwMiAxNSAyOCA2NyBENiAwMiAxNyAyOCA2NyBEMCBcCisgMDIgMTggMjggNjcgRDYgNjcgRDAgMDIgMTcgMjggNjcgRDYgODYgRTAgM0EgMzAgXAorIDY3IEYxIDc1IEY4IDc3IEZDIDY3IEYxIDc1IEY4IDI4IDMyIDAwIDMyIDAxIEI3IFwKKyA5NyA3NSBGOCAxNiBFMCBDQSAwNSA3NCBGQyA3NyBGOCA2NyBGMSA3NSBGOCA3NyBcCisgRkMgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgXAorICciICNiY205NTY4MjByMjR4Zy5oZXgKKworaWYgJD92YWxreXJpZSAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAyIDY3IEE5IDY3IDk0IDAyIDAzIDY3IEE5IDY3IDk0IDAyIDA1IDY3IEE5IFwKKyA2NyA5NCAwMiAwNCA2NyBBOSA2NyA5NCAwMiAwNiA2NyBBOSA2NyA5NCAwMiAwNyBcCisgNjcgQTkgNjcgOTQgMDIgMTIgNjcgQTkgNjcgOTQgMDIgMTMgNjcgQTkgNjcgOTQgXAorIDAyIDBFIDY3IEE5IDY3IDk0IDAyIDBGIDY3IEE5IDY3IDk0IDAyIDExIDY3IEE5IFwKKyA2NyA5NCAwMiAxMCA2NyBBOSA2NyA5NCAwMiAxQSA2NyBBOSA2NyA5NCAwMiAyMCBcCisgNjcgQTkgNjcgOTQgMDIgMjEgNjcgQTkgNjcgOTQgMDIgMjIgNjcgQTkgNjcgOTQgXAorIDAyIDIzIDY3IEE5IDY3IDk0IDAyIDI0IDY3IEE5IDY3IDk0IDAyIDJGIDY3IEE5IFwKKyA2NyA5NCAwMiAyRSA2NyBBOSA2NyA5NCAwMiAxQiA2NyBBOSA2NyA5NCAwMiAyQiBcCisgNjcgQTkgNjcgOTQgMDIgMkMgNjcgQTkgNjcgOTQgMDIgMkQgNjcgQTkgNjcgOTQgXAorIDg2IEUwIDNBIDMwIDY3IEFGIDc1IEI2IDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IFwKKyBCNiAxNiBFMCBDQSAwNSA3NCBCQSA3NyBCNiA2NyBBRiA3NSBCNiA3NyBCQSAxMiBcCisgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgXAorIDAwJyIgI3NkazU2NjgwLmhleAorCitpZiAkP3ZhbGt5cmllMiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFFIDY3IEE5IDY3IDk0IDAyIDFGIDY3IEE5IDY3IDk0IDAyIDIxIDY3IEE5IFwKKyA2NyA5NCAwMiAyMCA2NyBBOSA2NyA5NCAwMiAyMiA2NyBBOSA2NyA5NCAwMiAyMyBcCisgNjcgQTkgNjcgOTQgMDIgMjQgNjcgQTkgNjcgOTQgMDIgMjUgNjcgQTkgNjcgOTQgXAorIDAyIDI2IDY3IEE5IDY3IDk0IDAyIDI3IDY3IEE5IDY3IDk0IDAyIDI5IDY3IEE5IFwKKyA2NyA5NCAwMiAyOCA2NyBBOSA2NyA5NCAwMiAyQSA2NyBBOSA2NyA5NCAwMiAyQiBcCisgNjcgQTkgNjcgOTQgMDIgMkMgNjcgQTkgNjcgOTQgMDIgMkQgNjcgQTkgNjcgOTQgXAorIDAyIDJFIDY3IEE5IDY3IDk0IDAyIDJGIDY3IEE5IDY3IDk0IDAyIDMxIDY3IEE5IFwKKyA2NyA5NCAwMiAzMCA2NyBBOSA2NyA5NCAwMiAzMiA2NyBBOSA2NyA5NCAwMiAzMyBcCisgNjcgQTkgNjcgOTQgMDIgMzQgNjcgQTkgNjcgOTQgMDIgMzUgNjcgQTkgNjcgOTQgXAorIDg2IEUwIDNBIDMwIDY3IEFGIDc1IEI2IDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IFwKKyBCNiAxNiBFMCBDQSAwNSA3NCBCQSA3NyBCNiA2NyBBRiA3NSBCNiA3NyBCQSAxMiBcCisgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgXAorIDAwJyIgI3NkazU2Njg1LmhleAorCitpZiAkP2hhd2tleWVfcDI0ICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDEgMjggNjAgRTMgNjcgNDMgNjcgMUMgMDYgRTMgODAgRDIgMTkgNzQgMDIgXAorIDEyIEUwIDg1IDA1IEQyIDAzIDcxIDFBIDUyIDAwIDNBIDYwIDMyIDAwIDMyIDAxIFwKKyBCNyA5NyA3NSAyQiAxMiBFNCBGRSBFMyAwMiAwMSA1MCAxMiBFNCBGRSBFMyA5NSBcCisgNzUgM0IgODUgMDYgRTMgNjcgNTUgNzUgNkEgNzcgNUMgMTYgRTAgREEgMDEgNzEgXAorIDZBIDc3IDVDIDA2IEUzIDY3IDU1IDc1IDZBIDMyIDAzIDk3IDcxIDVDIDMyIDA0IFwKKyA5NyA3NSA2QSA3NyA2MyAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiBcCisgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcgMzIgMEYgODcgMzIgMEYgODcgXAorIDU3JyIgICNiY205NTMzMTRwMjRyZWYuaGV4CisKK2lmICQ/aGF3a2V5ZV9rMjQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMSAyOCA2MCBFMSA2NyAzRCA2NyAxQyAwNiBFMSA4MCBEMiAxOSA3NCAwMiBcCisgMTIgRTAgODUgMDUgRDIgMDUgNzEgMUEgNTIgMDAgM0EgMzAgMzIgMDAgMzIgMDEgXAorIEI3IDk3IDc1IDJCIDEyIEUyIEZFIEUxIDAyIDBBIDUwIDEyIEUyIEZFIEUxIDk1IFwKKyA3NSAzNSA4NSA3NyA1MCAxNiBFMCBEQSAwMiA3MSA0QyA3NyA1MCAwNiBFMSA2NyBcCisgNDUgNzUgNTAgNzcgNEMgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgNTcgXAorIDMyIDBGIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI2JjbTk1MzMxNGsyNC5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYyNCIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxQyAyOCA2NyAxOCAwMiAxRCAyOCA2NyAxOCAwMiAxRSAyOCA2NyAxOCAwMiBcCisgMUYgMjggNjcgMTggODYgRTAgM0EgMDggNjcgM0IgNzUgMjAgNjcgNDYgNzcgMjQgXAorIDY3IDQyIDc3IDQyIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDQyIDE2IEUwIENBIFwKKyAwNSA3NCA0NiA3NyA0MiA2NyAzQiA3NSA0MiA3NyA0NiAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MjQuaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MjYiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMUEgMjggNjcgMjIgMDIgMUIgMjggNjcgMjIgMDIgMUMgMjggNjcgMjIgMDIgXAorIDFEIDI4IDY3IDIyIDAyIDFFIDI4IDY3IDIyIDAyIDFGIDI4IDY3IDIyIDg2IEUwIFwKKyAzQSAwOCA2NyAzRCA3NSA0NCAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA0OCAxNiBcCisgRTAgQ0EgMDUgNzQgNDggNzcgNDQgNjcgM0QgNzUgNDQgNzcgNDggMTIgQTAgRjggXAorIDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwJyIgI3NkazU2NjI2LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjI4IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAyIDI4IDY3IDJDIDAyIDBFIDI4IDY3IDJDIDAyIDFBIDI4IDY3IDJDIDAyIFwKKyAxQiAyOCA2NyAyQyAwMiAxQyAyOCA2NyAyQyAwMiAxRCAyOCA2NyAyQyAwMiAxRSBcCisgMjggNjcgMkMgMDIgMUYgMjggNjcgMkMgODYgRTAgM0EgMDggNjcgNDcgNzUgNEUgXAorIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDUyIDE2IEUwIENBIDA1IDc0IDUyIDc3IFwKKyA0RSA2NyA0NyA3NSA0RSA3NyA1MiAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiBcCisgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MjguaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MjkiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDIgMjggNjcgMkMgMDIgMEUgMjggNjcgMkMgMDIgMUEgMjggNjcgMkMgMDIgXAorIDFCIDI4IDY3IDJDIDAyIDFDIDI4IDY3IDJDIDAyIDFEIDI4IDY3IDJDIDAyIDFFIFwKKyAyOCA2NyAyQyAwMiAxRiAyOCA2NyAyQyA4NiBFMCAzQSAwOCA2NyA0NyA3NSA0RSBcCisgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNTIgMTYgRTAgQ0EgMDUgNzQgNTIgNzcgXAorIDRFIDY3IDQ3IDc1IDRFIDc3IDUyIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIFwKKyA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjYyOS5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYzNCIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxQSAyOCA2NyAxOCAwMiAxQiAyOCA2NyAxOCAwMiAxQyAyOCA2NyAxOCAwMiBcCisgMUQgMjggNjcgMTggODYgRTAgM0EgMDggNjcgM0IgNzUgMjAgNjcgNDYgNzcgMjQgXAorIDY3IDQyIDc3IDQyIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDQyIDE2IEUwIENBIFwKKyAwNSA3NCA0NiA3NyA0MiA2NyAzQiA3NSA0MiA3NyA0NiAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MzQuaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MzAiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMUEgMjggNjcgMTggMDIgMUIgMjggNjcgMTggMDIgMUMgMjggNjcgMTggMDIgXAorIDFEIDI4IDY3IDE4IDg2IEUwIDNBIDA4IDY3IDNCIDc1IDIwIDY3IDQ2IDc3IDI0IFwKKyA2NyA0MiA3NyA0MiAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA0MiAxNiBFMCBDQSBcCisgMDUgNzQgNDYgNzcgNDIgNjcgM0IgNzUgNDIgNzcgNDYgMTIgQTAgRjggMTUgMUEgXAorIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2NjM0LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjM2IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDJBIDI4IDY3IDIyIDAyIDMyIDI4IDY3IDIyIDAyIDFBIDI4IDY3IDIyIDAyIFwKKyAxQiAyOCA2NyAyMiAwMiAxQyAyOCA2NyAyMiAwMiAxRCAyOCA2NyAyMiA4NiBFMCBcCisgM0EgMDggNjcgM0QgNzUgNDQgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNDggMTYgXAorIEUwIENBIDA1IDc0IDQ4IDc3IDQ0IDY3IDNEIDc1IDQ0IDc3IDQ4IDEyIEEwIEY4IFwKKyAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCciICNzZGs1NjYzNi5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYzOCIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxRSAyOCA2NyAyQyAwMiAyNiAyOCA2NyAyQyAwMiAyQSAyOCA2NyAyQyAwMiBcCisgMzIgMjggNjcgMkMgMDIgMUEgMjggNjcgMkMgMDIgMUIgMjggNjcgMkMgMDIgMUMgXAorIDI4IDY3IDJDIDAyIDFEIDI4IDY3IDJDIDg2IEUwIDNBIDA4IDY3IDQ3IDc1IDRFIFwKKyAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA1MiAxNiBFMCBDQSAwNSA3NCA1MiA3NyBcCisgNEUgNjcgNDcgNzUgNEUgNzcgNTIgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgXAorIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2NjM4LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjM5IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFFIDI4IDY3IDJDIDAyIDI2IDI4IDY3IDJDIDAyIDJBIDI4IDY3IDJDIDAyIFwKKyAzMiAyOCA2NyAyQyAwMiAxQSAyOCA2NyAyQyAwMiAxQiAyOCA2NyAyQyAwMiAxQyBcCisgMjggNjcgMkMgMDIgMUQgMjggNjcgMkMgODYgRTAgM0EgMDggNjcgNDcgNzUgNEUgXAorIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDUyIDE2IEUwIENBIDA1IDc0IDUyIDc3IFwKKyA0RSA2NyA0NyA3NSA0RSA3NyA1MiAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiBcCisgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MzkuaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGIzMzQiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDIgMjggNjAgRTEgNjcgM0QgNjcgMUMgMDYgRTEgODAgRDIgMUUgNzQgMDIgXAorIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDFBIDUyIDAwIDNBIDM4IDMyIDAwIDMyIDAxIFwKKyBCNyA5NyA3NSAyQiAxMiBFMiBGRSBFMSAwMiAwQSA1MCAxMiBFMiBGRSBFMSA5NSBcCisgNzUgMzUgODUgNzcgNEMgMTYgRTAgREEgMDIgNzEgNTAgNzcgNEMgMDYgRTEgNjcgXAorIDQ1IDc1IDRDIDc3IDUwIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IFwKKyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjMzNC5oZXgKKworaWYgJD9hcG9sbG8gImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxRSAyOCA2MCBFMCA2NyA1OCA2NyA3MyAwNiBFMCA4MCAyOCA2MCBFMCA2NyBcCisgNzMgNjcgNTggMDYgRTAgODAgRDIgMzYgNzQgMDIgMDIgMUEgMjggNjAgRTAgNjcgXAorIDlCIDc1IDI5IDY3IEIwIDY3IDU4IDc3IDMxIDMyIDBFIDg3IDMyIDA4IDg3IDY3IFwKKyBBMiAwNiBFMCA4MCBEMiAxRSA3NCAxQyAxMiBFMiA4NSAwNSBEMiAwRiA3MSA0MiBcCisgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgNEMgNTIgMDAgMTIgRTMgODUgMDUgXAorIEQyIDA1IDcxIDU2IDUyIDAwIDNBIDcwIDMyIDAwIDk3IDc1IDY0IDMyIDAxIDk3IFwKKyA3MSA2QiA3NyBCMCAzMiAwMSA5NyA3MSBBOSA3NyBBMiAxNiBFMyBEQSAwMiA3MSBcCisgQTkgNzcgQjAgMzIgMDUgOTcgNzUgODMgMzIgMDIgOTcgNzEgQTIgMDYgRTEgRDIgXAorIDAxIDcxIEEyIDA2IEUwIDY3IDlCIDc1IEEyIDMyIDAzIDk3IDcxIEIwIDMyIDA0IFwKKyA5NyA3NSBBOSAwNiBFMiBEMiAwNyA3MSBBOSA3NyBCMCAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgXAorIDMyIDBGIDg3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2NTI0LmhleAorCitpZiAkP3RvbWFoYXdrIHx8ICQ/dG9tYWhhd2tfcGx1cyAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAwIDI4IDYwIEUxIDY3IDI1IDY3IDE0IDA2IEUxIDgwIEQyIDQwIDc0IDAyIFwKKyA4NiBFMCAzQSBGQyAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSAzNyAxNiBFMCBDQSBcCisgMDUgNzQgM0UgNzcgMzcgNjcgMkIgNzUgMzcgNzcgNDUgMTIgQTAgRjggMTUgMUEgXAorIDAwIDU3IDI4IDMyIDA3IDk3IDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBGIFwKKyA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAwMCAwMCAwMCAwMCciICNzZGs1Njk2MC5oZXgKKworaWYgJD90cmlkZW50MnBsdXMgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMSAyOCA2MCBFMSA2NyAzMSA2NyAyMCAwNiBFMSA4MCBEMiAzMSA3NCAwMiBcCisgODYgRTAgM0EgQzAgNjcgMzcgNzUgMUMgNjcgNTEgNzcgMjAgNjcgNDMgNzcgNDMgXAorIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDQzIDE2IEUwIENBIDA1IDc0IDRBIDc3IFwKKyA0MyA2NyAzNyA3NSA0MyA3NyA1MSAxMiBBMCBGOCAxNSAxQSAwMCA1NyAyOCAzMiBcCisgMDcgOTcgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgXAorIDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2ODYwLmhleAorCitpZiAkP2FwYWNoZSAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAwIDY3IDI0IDY3IDBGIDgwIEQyIDI0IDc0IDAyIDg2IEUwIDNBIEY4IDY3IFwKKyAzNCA3NSAxNiA3NyAxRCA1NyA2NyAzQyA3NSA2MiA3NyA0NCA1NyA2NyAzQyA3NSBcCisgNEUgNzcgNTggNTcgNjcgMkMgNzUgNjIgNzcgNzAgMDcgNTcgMDcgMTIgQTAgRjggXAorIDE1IDFBIDAwIDU3IDA3IDEyIEEwIEY4IDE1IDFBIDA0IDU3IDA3IDEyIEEwIEY4IFwKKyAxNSAxQSAwNSA1NyAxNiBFMCBDQSAxRSA3NCA2OSA3NyA2MiAwNyA1NyAxNiBFMCBcCisgQ0EgMUUgNzQgNzAgNzcgNjIgMDcgNTcgMTYgRTAgQ0EgMUUgNzQgNjkgNzcgNzAgXAorIDA3IDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3IFwKKyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjU2MC5oZXgKKworaWYgJD9nZW5lcmljOGxlZCAibG9jYWwgbGVkY29kZSAnXAorIDA2IEUxIEQyIDQwIDcxIDExIEUwIDYwIEUxIDE2IEUzIERBIDAxIDcxIDE1IDYwIFwKKyBFMyA2NyA1RCA3NSAyQiAxMiAwMSA2MSBFMyA2NyA3MSAyOCA2NyAzMiA4NiBFMCBcCisgMTYgRTIgODEgNjEgRTIgREEgMUUgNzUgMkIgM0EgMDggRTkgNjEgRTIgODYgRTEgXAorIDc3IDAwIDY3IDVEIDc1IDM4IDc3IDNDIDY3IDY0IDc3IDY0IDY3IDQxIDY3IDRGIFwKKyA1NyAyOCAzMiAwMSA5NyA3NSA2NCAxNiBFMCBDQSAwNSA3NCA2OCA3NyA2NCAyOCBcCisgMzIgMDAgOTcgNzUgNjQgMTYgRTAgQ0EgMDUgNzQgNjggNzcgNjQgMTIgQTAgRjggXAorIDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDA5IDc1IDY0IDc3IFwKKyA2OCAxMiAwNSA2NyA2QyAxMiAwNCA2NyA2QyAxMiAwMyA2NyA2QyAxMiAwMiA2NyBcCisgNkMgMTIgMDEgNjcgNkMgMTIgMDAgNjcgNkMgNTcgMDAgMDAgMDAgMDAgMDAgMDAnIiAjZ2VuZXJpYzhsZWQuaGV4CisKKyMgRG93bmxvYWQgTEVEIGNvZGUgaW50byBMRUQgcHJvY2Vzc29yIGFuZCBlbmFibGUgKGlmIGFwcGxpY2FibGUpLgorCitpZiAkP2ZlYXR1cmVfbGVkX3Byb2MgJiYgJD9sZWRjb2RlICYmICEkP3NpbXVsYXRvciBcCisJImxlZCBwcm9nICRsZWRjb2RlOyBcCisJIGxlZCBhdXRvIG9uOyBsZWQgc3RhcnQiCisKKyMgU2V0dXAgR3JleWhvdW5kIExFRCBwcm9jZXNzb3IKK2lmICQ/Z3JleWhvdW5kIFwKKyAgICAicmNsb2FkIGdoX2xlZHVwLnNvYyIKKworIyBTZXR1cCBIdXJyaWNhbmUzIExFRCBwcm9jZXNzb3IKK2lmICQ/aHVycmljYW5lMyBcCisgICAgInJjbG9hZCBocjNfbGVkLnNvYyIKKworIyBTZXR1cCBUb21haGF3ayBMRUQgcHJvY2Vzc29yCitpZiAkP3RvbWFoYXdrICYmICEkP3NpbXVsYXRvciBcCisgICAgImxlZCAxIHByb2cgJGxlZGNvZGU7IFwKKyAgICAgbGVkIDEgYXV0byBvbjsgbGVkIDEgc3RhcnQ7IFwKKyAgICAgbGVkIDIgcHJvZyAkbGVkY29kZTsgXAorICAgICBsZWQgMiBhdXRvIG9uOyBsZWQgMiBzdGFydCIKKworIyBTZXR1cCBUb21haGF3aysgTEVEIHByb2Nlc3NvcgoraWYgJD90b21haGF3a19wbHVzICYmICEkP3NpbXVsYXRvciBcCisgICAgImxlZCAxIHByb2cgJGxlZGNvZGU7IFwKKyAgICAgbGVkIDEgYXV0byBvbjsgbGVkIDEgc3RhcnQ7IFwKKyAgICAgbGVkIDIgcHJvZyAkbGVkY29kZTsgXAorICAgICBsZWQgMiBhdXRvIG9uOyBsZWQgMiBzdGFydCIKKworIyBJZiBsb2FkaW5nIG11bHRpcGxlIHJjLnNvYywgdXBvbiBsb2FkaW5nIHRoZSBsYXN0IHVuaXQsIHJlc3RhcnQKKyMgYWxsIExFRCBwcm9jZXNzb3JzIHNvIGFueSBjb21tb24gYmxpbmtpbmcgaXMgaW4gc3luYy4KKworaWYgISJleHByICQ/ZmVhdHVyZV9sZWRfcHJvYyAmJiAhJD9zaW11bGF0b3IgJiYgJHVuaXQgPT0gJHVuaXRzIC0gMSIgXAorCSIqOmxlZCBzdG9wOyAqOmxlZCBzdGFydCIKKworIyBSdW4gY291bnRlciBETUEgdGFzayA0IHRpbWVzIHBlciBzZWNvbmQgdG8gYWNoaWV2ZSBiZXR0ZXIKKyMgY3RyX3hhdWlfYWN0aXZpdHkuCitpZiAkP2JyYWRsZXlfYW55IFwKKyAgICAgICAgImN0ciBpbnRlcnZhbD0yNTAwMDAiCisKKyMgSW5pdGlhbGl6ZSBIZXJjdWxlcyBVQyBtb2RpZCAwIGVudHJ5IHRvIHBvaW50IHRvIHRoZSBDUFUKK2lmICQ/aGVyY19hbnkgXAorCSJ3IHVjIDAgMSAxIgorCisjIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgNDgtcG9ydCBpbiBTdGFja2luZyBtb2RlLgorIyBPbiB0aGUgNDgtcG9ydCBwbGF0Zm9ybSwgcmMuc29jIGlzIHJ1biB0d2ljZTsgb25jZSBvbiB1bml0IDAgYW5kCisjIHRoZW4gb25jZSBvbiB1bml0IDEuICBUaGUgdHVyYm8gcG9ydCBvbiB1bml0IE4gaXMgZ2VOLgorIyBBbGwgdHVyYm8gcG9ydCB0cmFmZmljIG11c3QgYmUgdGFnZ2VkOyBzZWUgdmxhbiBhZGQgYmVsb3cuCisjIFNlZSAkU0RLL2RvYy80OC1wb3J0LnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgaG93CisjIHRvIGNvbmZpZ3VyZSBJUEcgdmFsdWVzIGZvciBsaW5lIHJhdGUgb3BlcmF0aW9uLgorCitpZiAkP3A0OCAmJiAkP3VuaXQwIFwKKwkibG9jYWwgdHVyYm9fcG9ydCAwOyBsb2NhbCBteV9tb2RpZCAxOyIKKworaWYgJD9wNDggJiYgJD91bml0MSBcCisJImxvY2FsIHR1cmJvX3BvcnQgMTsgbG9jYWwgbXlfbW9kaWQgMjsiCisKK2lmICQ/cDQ4IFwKKwkibSBjb25maWcgc3RfaXNfbWlycj0wIHN0X21vZHVsZT0xIHN0X21jbnQ9MSBzdF9zaW1wbGV4PTAgc3RfbGluaz0wOyBcCisJIG0gY29uZmlnLmckdHVyYm9fcG9ydCBzdF9saW5rPTE7IFwKKwkgbSBnbWFjYzIuZ2UkdHVyYm9fcG9ydCBpcGd0PTggbWNsa2ZxPTE7IFwKKwkgbSBmZV9tYXhmIG1heGZyPTE1NjA7IFwKKwkgbSBtYXhmciBtYXhmcj0xNTY4OyBcCisJIG0gY29uZmlnMiBteV9tb2RpZD0kbXlfbW9kaWQ7IFwKKwkgcG9ydCBnZSR0dXJib19wb3J0IHNwZWVkPTI1MDA7IFwKKwkgdmxhbiBhZGQgMSBwYm09Z2UkdHVyYm9fcG9ydCB1Ym09bm9uZSIKKworaWYgISQ/bm9fYmNtICYmICQ/ZHJhY19hbnkgXAorICAgIm0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMT0weGMiCitpZiAhJD9ub19iY20gJiYgJD9seW54X2FueSBcCisgICAibSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QxPTB4MSIKK2lmICEkP25vX2JjbSAmJiAkP3R1Y2FuYSBcCisgICAic3RrbW9kZSBtb2RpZD0wOyIKK2lmICEkP25vX2JjbSAmJiAkP3R1Y2FuYSAmJiAhJD9tYWdudW0gJiYgISQ/dHVjYW5hX25vaGcgXAorICAgIm0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMj0weDM4OyBcCisgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MCBwb3J0X2Zvcl9tb2QyPTB4Mzg7IFwKKyAgICBzdGttb2RlIG1vZGlkPTAiCitpZiAhJD9ub19iY20gJiYgJD94Z3Nfc3dpdGNoICYmICEkP3JjcHVfb25seVwKKyAgICJzdGttb2RlIG1vZGlkPTA7IFwKKyAgICBzIENNSUNfQ09TX0NUUkxfUlggQ0gwX0NPU19CTVA9MCxDSDFfQ09TX0JNUD0weGZmLCBcCisgICAgICAgIENIMl9DT1NfQk1QPTAsQ0gzX0NPU19CTVA9MCIKKworIyBCYWNrLXRvLWJhY2sgRHJhY28gc2V0dXAuCisKKyMgRHJhY28gY2hpcHMgbXVzdCBydW4gYXQgMTI3TUh6LiBTb21lIG9sZGVyIHZlcnNpb25zCisjIGFyZSBub3Qgc2V0IHRvIHRoaXMgZnJlcXVlbmN5LgorCitpZiAkP2RyYWNvX3N0ayAmJiAkP3VuaXQwIFwKKyAgICAiaTJjIHByb2JlIHF1aWV0OyBiYiBjbG9jayBSZWYxMjUgMTI3IgorCisjIEFwcGxpZXMgdG8gU0RLIEJhc2Vib2FyZCB3aXRoIGVpdGhlciBpbnRlcm5hbCBvciBleHRlcm5hbCBIaWdpZ3MsCisjIGFzIHdlbGwgYXMgdGhlIEdhbGFoYWQgcmVmZXJlbmNlIGRlc2lnbi4KKworaWYgJD9kcmFjb19iMmIgJiYgJD91bml0MCBcCisgICAgInN0a21vZGUgbW9kaWQ9MDsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTEyOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTEyIgorCitpZiAhJD9zaW11bGF0b3IgJiYgJD9kcmFjb19iMmIgJiYgJD91bml0MCBcCisgICAgICJpMmMgcHJvYmUgcXVpZXQ7IGJiIGNsb2NrIFJlZjEyNSAxMjciCisKK2lmICQ/ZHJhY29fYjJiICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTE7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MDsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MCIKKworIyBNZXJsaW4sIFdoaXRlIEtuaWdodCwgQmxhY2sgS25pZ2h0IHNldHVwLgorIwlEcmFjbyB1bml0IDEgaXMgb24gSGVyYyBwb3J0IDgKKyMJRHJhY28gdW5pdCAyIGlzIG9uIEhlcmMgcG9ydCAxCisKK2lmICQ/ZHJhY29faGVyYzQgJiYgJD91bml0MCBcCisgICAgIncgdWMuaHBpYzcgMCAxIDB4MDsgXAorICAgICB3IHVjLmhwaWM3IDEgMSAweDI7IFwKKyAgICAgdyB1Yy5ocGljMCAwIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljMCAxIDEgMHgwIgorCitpZiAhJD9zaW11bGF0b3IgJiYgJD9kcmFjb19oZXJjNCAmJiAkP3VuaXQwIFwKKyAgICAgImkyYyBwcm9iZSBxdWlldDsgYmIgY2xvY2sgUmVmMTI1IDEyNyIKKworaWYgJD9kcmFjb19oZXJjNCAmJiAkP3VuaXQxIFwKKyAgICAic3RrbW9kZSBtb2RpZD0wOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MTI7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MTIiCisKK2lmICQ/ZHJhY29faGVyYzQgJiYgJD91bml0MiBcCisgICAgInN0a21vZGUgbW9kaWQ9MTsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0wOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0wIgorCisjIExhbmNlbG90IHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImxhbmNlbG90PTEiKQorIyBOb3RlczoKKyMJRHJhY28gdW5pdCAxIGlzIG9uIEhlcmMgcG9ydCA3CisjCURyYWNvIHVuaXQgMiBpcyBvbiBIZXJjIHBvcnQgOAorIwlEcmFjbyB1bml0IDMgaXMgb24gSGVyYyBwb3J0IDEKKyMJRHJhY28gdW5pdCA0IGlzIG9uIEhlcmMgcG9ydCAyCisKK2lmICQ/bGFuY2Vsb3QgJiYgJD91bml0MCBcCisgICAgIncgdWMuaHBpYzYgMCAxIDB4MDsgXAorICAgICB3IHVjLmhwaWM2IDEgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWM2IDIgMSAweDI7IFwKKyAgICAgdyB1Yy5ocGljNiAzIDEgMHg0OyBcCisgICAgIHcgdWMuaHBpYzcgMCAxIDB4ODA7IFwKKyAgICAgdyB1Yy5ocGljNyAxIDEgMHgwOyBcCisgICAgIHcgdWMuaHBpYzcgMiAxIDB4MjsgXAorICAgICB3IHVjLmhwaWM3IDMgMSAweDQ7IFwKKyAgICAgdyB1Yy5ocGljMCAwIDEgMHg4MDsgXAorICAgICB3IHVjLmhwaWMwIDEgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMwIDIgMSAweDA7IFwKKyAgICAgdyB1Yy5ocGljMCAzIDEgMHg0OyBcCisgICAgIHcgdWMuaHBpYzEgMCAxIDB4ODA7IFwKKyAgICAgdyB1Yy5ocGljMSAxIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljMSAyIDEgMHgyOyBcCisgICAgIHcgdWMuaHBpYzEgMyAxIDB4MCIKKworaWYgISQ/c2ltdWxhdG9yICYmICQ/bGFuY2Vsb3QgJiYgJD91bml0MCBcCisgICAgICJpMmMgcHJvYmUgcXVpZXQ7IGJiIGNsb2NrIERyYWNvX0NvcmUgMTI3IgorCitpZiAkP2xhbmNlbG90ICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTA7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMjsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMiIKKworaWYgJD9sYW5jZWxvdCAmJiAkP3VuaXQyIFwKKyAgICAic3RrbW9kZSBtb2RpZD0xOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTAgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MTI7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTAgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MTIiCisKK2lmICQ/bGFuY2Vsb3QgJiYgJD91bml0MyBcCisgICAgInN0a21vZGUgbW9kaWQ9MjsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MCBwb3J0X2Zvcl9tb2QzPTEyOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MCBwb3J0X2Zvcl9tb2QzPTEyIgorCitpZiAkP2xhbmNlbG90ICYmICQ/dW5pdDQgXAorICAgICJzdGttb2RlIG1vZGlkPTM7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MDsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MCIKKworIyBMeW54IFNESyAoVHdvTHlueCkgc2V0dXAKKyMgKGVuYWJsZWQgYnkgYWRkaW5nIHRoZSBwcm9wZXJ0eSAidHdvbHlueD0xIikKKworaWYgJD90d29seW54ICYmICQ/dW5pdDAgXAorICAgICJzdGttb2RlIG1vZGlkPTA7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0xOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTE7IFwKKyAgICAgIgorCitpZiAkP3R3b2x5bnggJiYgJD91bml0MSBcCisgICAgInN0a21vZGUgbW9kaWQ9MTsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MSBwb3J0X2Zvcl9tb2QxPTA7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xIHBvcnRfZm9yX21vZDE9MDsgXAorICAgICAiCisjIEhlcmN1THlueCBzZXR1cAorIyAoZW5hYmxlZCBieSBhZGRpbmcgdGhlIHByb3BlcnR5ICJoZXJjdWx5bng9MSIpCisjIE5vdGVzOgorIwlMeW54IHVuaXQgMSBpcyBvbiBIZXJjIHBvcnQgMQorIwlMeW54IHVuaXQgMiBpcyBvbiBIZXJjIHBvcnQgMgorIwlMeW54IHVuaXQgMyBpcyBvbiBIZXJjIHBvcnQgMworIwlMeW54IHVuaXQgNCBpcyBvbiBIZXJjIHBvcnQgNAorIwlMeW54IHVuaXQgNSBpcyBvbiBIZXJjIHBvcnQgNQorIwlMeW54IHVuaXQgNiBpcyBvbiBIZXJjIHBvcnQgNgorIwlMeW54IHVuaXQgNyBpcyBvbiBIZXJjIHBvcnQgNworIwlMeW54IHVuaXQgOCBpcyBvbiBIZXJjIHBvcnQgOAorCitpZiAkP2hlcmN1bHlueCAmJiAkP3VuaXQwIFwKKyAgICAiIFwKKyAgICAgdyB1Yy5ocGljMCAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMCAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljMCAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMCAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMCA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljMCA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljMCA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMCA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljMSAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMSAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljMSAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMSAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMSA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljMSA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljMSA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMSA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljMiAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMiAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljMiAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMiAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMiA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljMiA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljMiA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMiA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljMyAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMyAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljMyAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMyAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMyA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljMyA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljMyA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMyA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNCAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNCAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljNCAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljNCAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljNCA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljNCA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljNCA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljNCA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNSAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNSAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljNSAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljNSAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljNSA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljNSA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljNSA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljNSA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNiAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNiAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljNiAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljNiAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljNiA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljNiA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljNiA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljNiA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNyAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNyAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljNyAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljNyAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljNyA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljNyA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljNyA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljNyA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgIgorCitpZiAkP2hlcmN1bHlueCAmJiAkP2x5bnhfYW55IFwKKyAgICAgIm0gbW9kcG9ydF83XzAgXAorICAgICBwb3J0X2Zvcl9tb2QwPTEgcG9ydF9mb3JfbW9kMT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xIHBvcnRfZm9yX21vZDM9MSBcCisgICAgIHBvcnRfZm9yX21vZDQ9MSBwb3J0X2Zvcl9tb2Q1PTEgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEgcG9ydF9mb3JfbW9kNz0xOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIFwKKyAgICAgcG9ydF9mb3JfbW9kMD0xIHBvcnRfZm9yX21vZDE9MSBcCisgICAgIHBvcnRfZm9yX21vZDI9MSBwb3J0X2Zvcl9tb2QzPTEgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEgcG9ydF9mb3JfbW9kNT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xIHBvcnRfZm9yX21vZDc9MTsgXAorICAgICAiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTAiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDIgXAorICAgICJzdGttb2RlIG1vZGlkPTEiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDMgXAorICAgICJzdGttb2RlIG1vZGlkPTIiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDQgXAorICAgICJzdGttb2RlIG1vZGlkPTMiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDUgXAorICAgICJzdGttb2RlIG1vZGlkPTQiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDYgXAorICAgICJzdGttb2RlIG1vZGlkPTUiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDcgXAorICAgICJzdGttb2RlIG1vZGlkPTYiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDggXAorICAgICJzdGttb2RlIG1vZGlkPTciCisKKyMgTHlueGFMb3Qgc2V0dXAKKyMgKGVuYWJsZWQgYnkgYWRkaW5nIHRoZSBwcm9wZXJ0eSAibHlueGFsb3Q9MSIpCisjIE5vdGVzOgorIwlMeW54IHVuaXQgMCBpcyBvbiBIZXJjIHBvcnQgMyAoaGcyL2hwaWMyKSAobW9kIDApCisjCUx5bnggdW5pdCAxIGlzIG9uIEhlcmMgcG9ydCA0IChoZzMvaHBpYzMpIChtb2QgMSkKKyMJSGlnaWcgY29ubiAwIGlzIG9uIEhlcmMgcG9ydCA1IChoZzQvaHBpYzQpCisjCUhpZ2lnIGNvbm4gMSBpcyBvbiBIZXJjIHBvcnQgNiAoaGc1L2hwaWM1KQorIwlEcmFjbyB1bml0IDMgaXMgb24gSGVyYyBwb3J0IDcgKGhnNi9ocGljNikgKG1vZCAyKQorIwlEcmFjbyB1bml0IDQgaXMgb24gSGVyYyBwb3J0IDggKGhnNy9ocGljNykgKG1vZCAzKQorIwlEcmFjbyB1bml0IDUgaXMgb24gSGVyYyBwb3J0IDEgKGhnMC9ocGljMCkgKG1vZCA0KQorIwlEcmFjbyB1bml0IDYgaXMgb24gSGVyYyBwb3J0IDIgKGhnMS9ocGljMSkgKG1vZCA1KQorCitpZiAkP2x5bnhhbG90ICYmICQ/dW5pdDIgXAorICAgICIgXAorICAgICB3IHVjLmhwaWMwIDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMwIDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMwIDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMwIDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMwIDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMwIDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWMxIDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMxIDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMxIDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMxIDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMxIDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMxIDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWMyIDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMyIDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMyIDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMyIDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMyIDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMyIDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWMzIDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMzIDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMzIDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMzIDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMzIDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMzIDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM2IDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWM2IDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWM2IDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWM2IDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWM2IDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM2IDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM3IDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWM3IDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWM3IDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWM3IDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWM3IDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM3IDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICAiCisKK2lmICQ/bHlueGFsb3QgJiYgJD9seW54X2FueSBcCisgICAgICJtIG1vZHBvcnRfN18wIFwKKyAgICAgcG9ydF9mb3JfbW9kMD0xIHBvcnRfZm9yX21vZDE9MSBcCisgICAgIHBvcnRfZm9yX21vZDI9MSBwb3J0X2Zvcl9tb2QzPTEgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEgcG9ydF9mb3JfbW9kNT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xIHBvcnRfZm9yX21vZDc9MTsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBcCisgICAgIHBvcnRfZm9yX21vZDA9MSBwb3J0X2Zvcl9tb2QxPTEgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEgcG9ydF9mb3JfbW9kMz0xIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xIHBvcnRfZm9yX21vZDU9MSBcCisgICAgIHBvcnRfZm9yX21vZDY9MSBwb3J0X2Zvcl9tb2Q3PTE7IFwKKyAgICAgIgorCitpZiAkP2x5bnhhbG90ICYmICQ/ZHJhY19hbnkgXAorICAgICJtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMiBcCisgICAgIHBvcnRfZm9yX21vZDQ9MTIgcG9ydF9mb3JfbW9kNT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDY9MTIgcG9ydF9mb3JfbW9kNz0xMjsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MTIgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEyIHBvcnRfZm9yX21vZDU9MTIgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEyIHBvcnRfZm9yX21vZDc9MTI7IFwKKyAgICAgIgorCitpZiAkP2x5bnhhbG90ICYmICQ/dW5pdDAgXAorICAgICJzdGttb2RlIG1vZGlkPTAiCisgICAgIAoraWYgJD9seW54YWxvdCAmJiAkP3VuaXQxIFwKKyAgICAic3RrbW9kZSBtb2RpZD0xIgorCitpZiAkP2x5bnhhbG90ICYmICQ/dW5pdDMgXAorICAgICJzdGttb2RlIG1vZGlkPTIiCisKK2lmICQ/bHlueGFsb3QgJiYgJD91bml0NCBcCisgICAgInN0a21vZGUgbW9kaWQ9MyIKKworaWYgJD9seW54YWxvdCAmJiAkP3VuaXQ1IFwKKyAgICAic3RrbW9kZSBtb2RpZD00IgorCitpZiAkP2x5bnhhbG90ICYmICQ/dW5pdDYgXAorICAgICJzdGttb2RlIG1vZGlkPTUiCisKKyMgZ3VlbmV2ZXJlIHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImd1ZW5ldmVyZT0xIikKKyMgTm90ZXM6CisjICAgICAgIGhnWCBtYXBwaW5nIGJhc2VkIG9uIHBibXBfdmFsaWQuMD0weDFiNworIwlEcmFjbyB1bml0IDEgaXMgb24gSGVyYyBwb3J0IDEgKGhnMC9ocGljMCkgKG1vZCAwKQorIwlEcmFjbyB1bml0IDIgaXMgb24gSGVyYyBwb3J0IDIgKGhnMS9ocGljMSkgKG1vZCAxKQorIwlMeW54IHVuaXQgMyBpcyBvbiBIZXJjIHBvcnQgOCAoaGc1L2hwaWM3KSAobW9kIDIpCisjCUx5bnggdW5pdCA0IGlzIG9uIEhlcmMgcG9ydCA3IChoZzQvaHBpYzYpIChtb2QgMykKKyMJSGlnaWcgY29ubiAwIGlzIG9uIEhlcmMgcG9ydCA0IChoZzIvaHBpYzMpCisjCUhpZ2lnIGNvbm4gMSBpcyBvbiBIZXJjIHBvcnQgNSAoaGczL2hwaWM0KQorIyAgICAgICBIZXJjIHBvcnQgMyAtIFVudXNlZCAoaHBpYzIpCisjICAgICAgIEhlcmMgcG9ydCA2IC0gVW51c2VkIChocGljNSkKK2lmICQ/Z3VlbmV2ZXJlICYmICQ/dW5pdDAgXAorICAgICIgXAorICAgICB3IHVjLmhwaWMwIDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMwIDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWMwIDIgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMwIDMgMSAweDA4MDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWMxIDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMxIDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWMxIDIgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMxIDMgMSAweDA4MDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM3IDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM3IDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWM3IDIgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWM3IDMgMSAweDA4MDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM2IDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM2IDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWM2IDIgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWM2IDMgMSAweDA4MDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICAiCisKK2lmICQ/Z3VlbmV2ZXJlICYmICQ/bHlueF9hbnkgXAorICAgICAibSBtb2Rwb3J0XzdfMCBcCisgICAgIHBvcnRfZm9yX21vZDA9MSBwb3J0X2Zvcl9tb2QxPTEgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEgcG9ydF9mb3JfbW9kMz0xIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xIHBvcnRfZm9yX21vZDU9MSBcCisgICAgIHBvcnRfZm9yX21vZDY9MSBwb3J0X2Zvcl9tb2Q3PTE7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgXAorICAgICBwb3J0X2Zvcl9tb2QwPTEgcG9ydF9mb3JfbW9kMT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xIHBvcnRfZm9yX21vZDM9MSBcCisgICAgIHBvcnRfZm9yX21vZDQ9MSBwb3J0X2Zvcl9tb2Q1PTEgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEgcG9ydF9mb3JfbW9kNz0xOyBcCisgICAgICIKKworaWYgJD9ndWVuZXZlcmUgJiYgJD9kcmFjX2FueSBcCisgICAgIm0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xMiBwb3J0X2Zvcl9tb2QzPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xMiBwb3J0X2Zvcl9tb2Q1PTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xMiBwb3J0X2Zvcl9tb2Q3PTEyOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMiBcCisgICAgIHBvcnRfZm9yX21vZDQ9MTIgcG9ydF9mb3JfbW9kNT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDY9MTIgcG9ydF9mb3JfbW9kNz0xMjsgXAorICAgICAiCisKK2lmICQ/Z3VlbmV2ZXJlICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTAiCisgICAgIAoraWYgJD9ndWVuZXZlcmUgJiYgJD91bml0MiBcCisgICAgInN0a21vZGUgbW9kaWQ9MSIKKworaWYgJD9ndWVuZXZlcmUgJiYgJD91bml0MyBcCisgICAgInN0a21vZGUgbW9kaWQ9MiIKKworaWYgJD9ndWVuZXZlcmUgJiYgJD91bml0NCBcCisgICAgInN0a21vZGUgbW9kaWQ9MyIKKyAgICAgCisjIGZlbGl4NDggc2V0dXAKKyMgKGVuYWJsZWQgYnkgYWRkaW5nIHRoZSBwcm9wZXJ0eSAiZmVsaXg0OD0xIikKKyMgTm90ZXM6CisjICAgICAgIEJDTTU2MTAyIHVuaXQtMCBoaWdpZyBwb3J0IChwb3J0IDI2KSBpcyBjb25uZWN0ZWQKKyMgICAgICAgdG8gQkNNNTYxMDIgVW5pdC0xIGhpZ2lnIHBvcnQgKHBvcnQgMjYpCisjCisKK2lmICQ/ZmVsaXg0OCAmJiAkP3VuaXQwIFwKKyAgICAic3RrbW9kZSBtb2RpZD0wIDsgXAorICAgICBtIElFR1JfUE9SVCBNWV9NT0RJRD0wOyBcCisgICAgIG0gWFBPUlRfQ09ORklHIE1ZX01PRElEPTA7IFwKKyAgICAgdyBNT0RQT1JUX01BUCAxIDEgSElHSUdfUE9SVF9CSVRNQVA9MHg0IDsgXAorICAgICAiCisKK2lmICQ/ZmVsaXg0OCAmJiAkP3VuaXQxIFwKKyAgICAic3RrbW9kZSBtb2RpZD0xIDsgXAorICAgICBtIElFR1JfUE9SVCBNWV9NT0RJRD0xOyBcCisgICAgIG0gWFBPUlRfQ09ORklHIE1ZX01PRElEPTE7IFwKKyAgICAgdyBNT0RQT1JUX01BUCAwIDEgSElHSUdfUE9SVF9CSVRNQVA9MHg0IDsgXAorICAgICAiCisjIGZicG9lIHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImZicG9lPTEiKQorIyBOb3RlczoKKyMgICAgICAgQkNNNTY1MDQgdW5pdC0wIGhpZ2lnIHBvcnQgKHBvcnQgMjcsMjgpIGlzIGNvbm5lY3RlZAorIyAgICAgICB0byBCQ001NjUwNCBVbml0LTEgaGlnaWcgcG9ydCAocG9ydCAyNywyOCkKKyMKKworaWYgJD91bml0MCAmJiAkP2ZpcmVib2x0X2FueSAmJiAkP2ZicG9lICAgICBcCisgICJzdGttb2RlIG1vZGlkPTA7ICAgICAgICAgICBcCisgICB3IG1vZHBvcnRfbWFwIDEgMSBISUdJR19QT1JUX0JJVE1BUD0weDQ7IFwKKyAgIG0gSElHSUdfVFJVTktfR1JPVVAgSElHSUdfVFJVTktfUlRBRzE9MyBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMD0yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQxX1BPUlQxPTMgXAorICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDFfUE9SVDI9MiBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMz0zOyBcCisgICBtIEhJR0lHX1RSVU5LX0NPTlRST0wgSElHSUdfVFJVTktfSUQyPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LMj0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDM9MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTkszPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0JJVE1BUDE9MHhjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBQ1RJVkVfUE9SVF9CSVRNQVA9MHhmIgorCitpZiAkP3VuaXQxICYmICQ/ZmlyZWJvbHRfYW55ICYmICQ/ZmJwb2UgXAorICAic3RrbW9kZSBtb2RpZD0xOyBcCisgICB3IG1vZHBvcnRfbWFwIDAgMSBISUdJR19QT1JUX0JJVE1BUD0weDQ7IFwKKyAgIG0gSElHSUdfVFJVTktfR1JPVVAgSElHSUdfVFJVTktfUlRBRzE9MyBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMD0yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQxX1BPUlQxPTMgXAorICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDFfUE9SVDI9MiBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMz0zOyBcCisgICBtIEhJR0lHX1RSVU5LX0NPTlRST0wgSElHSUdfVFJVTktfSUQyPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LMj0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDM9MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTkszPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0JJVE1BUDE9MHhjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBQ1RJVkVfUE9SVF9CSVRNQVA9MHhmIgorCisjIER1YWwgUmFwdG9yL1JhdmVuIGJvYXJkcworaWYgJD9yYXZlbl9lYl80OHAgfHwgJD9yYXAyNF9yZWYgXAorICAgICJsb2NhbCByY3B1X3N5c3RlbSAxIgoraWYgJD91bml0MCAmJiAkP3JjcHVfc3lzdGVtIFwKKyAgICJzdGttb2RlIG1vZGlkPTAiCitpZiAkP3VuaXQxICYmICQ/cmNwdV9zeXN0ZW0gXAorICAgInN0a21vZGUgbW9kaWQ9MSIKKworIyBMTSBmYjQ4IHBsYXRmb3JtIHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImxtNDhwPTEiKQorIworaWYgJD91bml0MCAmJiAkP2ZpcmVib2x0X2FueSAmJiAkP2xtNDhwIHx8ICQ/bG00OHBfRCBcCisgICAic3RrbW9kZSBtb2RpZD0wIgorCitpZiAkP3VuaXQxICYmICQ/ZmlyZWJvbHRfYW55ICYmICQ/bG00OHAgfHwgJD9sbTQ4cF9EIFwKKyAgICJzdGttb2RlIG1vZGlkPTEiCisKKyMgU2V0IEZpcmVib2x0IFBPRSBwb3dlciBsZXZlbCAxNzAodG90YWwpIC0gMTEwKHN3aXRjaCkgPSA2MAoraWYgJD9mYnBvZSBcCisgICAgICAgICJsb2NhbCBwb2Vwb3dlciA2MCIKKworIyBTZXQgRHJhY28xNSBQT0UgcG93ZXIgbGV2ZWwgMTcwKHRvdGFsKSAtIDgwKHN3aXRjaCkgPSA5MAoraWYgJD9kcmFjMTVcCisgICAgICAgICJsb2NhbCBwb2Vwb3dlciA5MCIKKworIyBIdXJyaWNhbmUzIEJDTTk1NjE2MFIgc2V0dXAKKyMgTm90ZXM6CisjICAgICAgIEJDTTU2MTYwIHVuaXQtMCBoaWdpZyBwb3J0IChwb3J0IDI5LDMwKSBpcyBjb25uZWN0ZWQKKyMgICAgICAgdG8gQkNNNTYxNjAgVW5pdC0xIGhpZ2lnIHBvcnQgKHBvcnQgMjYsMjcpCisjCisKK2lmICQ/YmNtOTU2MTYwciAmJiAkP3VuaXQwICBcCisgICJzdGttb2RlIG1vZGlkPTA7IFwKKyAgIHcgbW9kcG9ydF9tYXAgMSAxIEhJR0lHX1BPUlRfQklUTUFQPTB4NjAwMDAwMDA7IFwKKyAgIHRydW5rIGFkZCBpZD0xMjggcj0zIHBibT1oZzAtaGcxIgorCitpZiAkP2JjbTk1NjE2MHIgJiYgJD91bml0MSAgXAorICAic3RrbW9kZSBtb2RpZD0xOyBcCisgICB3IG1vZHBvcnRfbWFwIDAgMSBISUdJR19QT1JUX0JJVE1BUD0weGMwMDAwMDA7IFwKKyAgIHRydW5rIGFkZCBpZD0xMjggcj0zIHBibT1oZzAtaGcxIgorCisjIGlmIGVuYWJsZV9wb2UgaXMgc2V0LCB0aGVuIGVuYWJsZSB0aGUgUE9FIHByb2Nlc3NvciBmb3IKKyMgZWl0aGVyIEZpcmVib2x0IG9yIERyYWNvMTUgcGxhdGZvcm0KK2lmICQ/dW5pdDAgJiYgJD9lbmFibGVfcG9lICYmICQ/ZmJwb2UgfHwgJD9kcmFjMTUgXAorICAgICAgICAiJGVjaG8gcmM6IEVuYWJsaW5nIFBPRSAuLi47IFwKKyAgICAgICAgIHBvZXNlbCByZXNldDsgXAorICAgICAgICAgaTJjIHByb2JlIHF1aWV0OyBcCisgICAgICAgICB4cG9lIHZlcmJvc2Ugb2ZmOyBcCisgICAgICAgICB4cG9lIHBvd2VyICRwb2Vwb3dlcjsgXAorICAgICAgICAgeHBvZSB2ZXJib3NlIG9uOyBcCisgICAgICAgICBwb2VzZWwgZW5hYmxlIgorCisjIG1hcmsgdGhpcyB1bml0IHNvIHRoYXQgc3Vic2VxdWVudCByYyBydW5zIGFyZSBxdWlldAorc2V0ZW52IHJjJHVuaXQgMQorCitpZiAkP21hY3NlYyAnXAorICAgIG1hY3NlYyBzeW5jOyBcCisgICAgJGVjaG8gInJjOiBNQUNTRUMgQ0xJIEVuYWJsZWQiJworCisjIGNhY2hlIGEgY29weSBvZiByYy5zb2MgaW4gbWVtb3J5CityY2NhY2hlIGFkZHEgcmMuc29jCisKKyMgc2V0dXAgY2hhc3NpcyBpZiByZXF1ZXN0ZWQKK2lmICEiZXhwciAkP2F1dG9jaGFzc2lzMiAmJiAkdW5pdCA9PSAkdW5pdHMgLSAxIiBcCisgICAgInNldGVudiBjaGFzc2lzMl9ub19yYyAxOyBcCisgICAgIHJjbG9hZCBjMnN3aXRjaC5zb2M7IFwKKyAgICAgc2V0ZW52IGNoYXNzaXMyX25vX3JjOyBcCisgICAgIgorCisjIHN0YXJ0IHN0YWNraW5nIGlmIHJlcXVlc3RlZAoraWYgISJleHByICQ/YXV0b3N0YWNrICYmICR1bml0ID09ICR1bml0cyAtIDEiIFwKKwkicmNsb2FkIHN0ay5zb2MiCisKK2lmICEiZXhwciAkP2FlZGV2ICsgMCIgJiYgISJleHByICR1bml0ID09ICR1bml0cyAtIDEiIFwKKyAgICAgICAiYWVkZXYgaW5pdCIKKworIyBodXJyaWNhbmUgNDhwIEZFIHBsYXRmb3JtIExFRCBzZXR1cCBmb3IgNTYxNDZfQTAgYW5kIDU2MTQ3X0EwIGJvYXJkCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImZlX2h1XzQ4cD0xIikKKyMKK2lmICQ/ZmVfaHVfNDhwICYmICQ/QkNNNTYxNDYgfHwgJD9CQ001NjE0NyBcCisgICAgInBoeSBmZTAgMHgxZiAweDAwOGI7IFwKKyAgICAgcGh5IGZlMCAweDFhIDB4M2YwOTtcCisgICAgIHBoeSBmZTggMHgxZiAweDAwOGI7IFwKKyAgICAgcGh5IGZlOCAweDFhIDB4M2YwOTsgXAorICAgICBwaHkgZmUxNiAweDFmIDB4MDA4YjsgXAorICAgICBwaHkgZmUxNiAweDFhIDB4M2YwOSIKKworIyBlbmFibGUgTEVEIG1hdHJpeCBtb2RlIGZvciBQSFk1NDI5MiBvbiBCQ005NTM0MTFLL1IKK2lmICQ/YmNtOTUzNDExIFwKKyAgICAicmNsb2FkIGdoX2JjbTk1MzQxMXguc29jIgorCitpZiAkP3NpbXVsYXRvciBcCisgICAgJ2VjaG8gLW4gIkNoaXAgaW5pdCBmaW5pc2hlcyBhdDogIjtkYXRlJworICAgIAorICAgIApkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvcmVhZG1lLnR4dCBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiNDBkYgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L3JlYWRtZS50eHQKQEAgLTAsMCArMSwxOSBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYmNtIGZpbGVzIHRoYXQgYXJlIG5lZWRlZCBpbiB0aGUgUUFYIHN2ayBmaWxlIHN5c3RlbSB0byBicmluZyB1cCAKK3RoZSBCQ00gRGlhZyBTaGVsbC4KK1VzZXIgc2hvdWxkIGFsc28gY29weSB0aGUgYmNtLnVzZXIgbGludXgta2VybmVsLWJkZS5rbyBhbmQgbGludXgtdXNlci1iZGUua28KK2Zyb20gdGhlIEplbmtpbnMgQkFMIFdSWCBidWlsZCBvciBwcml2YXRlIGJjbV9zZGsgYnVpbGQgdG8gdGhlIHNhbWUgUUFYIHN2ayBmaWxlIHN5c3RlbS4KKyEhIQorICAgRG8gbm90IGZvcmdldCB0byBjaGFuZ2UgdGhlIElQIGluIHJwYy5zb2MgdG8gcG9pbnQgaXQgdG8gdGhlIEJBTF9DT1JFCishISEKK1RoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGJjbV9zZGsgdmVyc2lvbiBpcyA2LjUuNAorLgorfC0tIGJjbTg4NDcwX2JvYXJkLnNvYworfC0tIGNvbWJvMjhfZHJhbS5zb2MKK3wtLSBjb25maWcuYmNtCit8LS0gaW5pdC5zaAorfC0tIHFheC5zb2MKK3wtLSByYy5zb2MKK2AtLSBycGMuc29jCisgCisgIAorCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9yZWxvYWQuc29jIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvcmVsb2FkLnNvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDhhNTBlCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvcmVsb2FkLnNvYwpAQCAtMCwwICsxLDggQEAKKyMKKyMgJElkOiByZWxvYWQtZHVuZS5zb2MsdiAxLjEgMjAxMS8xMi8xMyAxNTozNzoxMyBhc3NhZiBFeHAgJAorIworIyAkQ29weXJpZ2h0OiAoYykgMjAwNiBCcm9hZGNvbSBDb3JwLgorIyBBbGwgUmlnaHRzIFJlc2VydmVkLiQKKworc2V0ZW52IHdhcm1ib290IDEKK3JjbG9hZCByYy5zb2MKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L3JwYy5zb2MgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9ycGMuc29jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMGI3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9ycGMuc29jCkBAIC0wLDAgKzEsMzUgQEAKK2NwdWRiIG5ld2RiCisKK2NwdWRiIGFkZCBrZXk9MHgxCisKK2NwdWRiIGFkZCBrZXk9MHgyIGxvY2FsPXQKKworY3RzIGF0cCB0cmFucyBzb2NrIHNlcnZlciBzdGFydAorCitjdHMgYXRwIGNvcz0wIHZsYW49MQorCitjdGUgcmVnIG1vZGU9YXRwCisKKyMgTk9URTogWW91IG11c3QgdW4tY29tbWVudCB0aGUgbGluZSBiZWxvdyBhbmQgcmVwbGFjZSB0aGUgSVAgYWRkcmVzcyAoMTAuMTAuMTAuMTApIHdpdGgKKyMgICAgICAgdGhlIHZhbHVlIHRoYXQgbWF0Y2hlcyB5b3VyIHN5c3RlbS4gIFRoZSBJUCBhZGRyZXNzIG11c3QgYmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGxpbnV4CisjICAgICAgIGluc3RhbmNlIHdoZXJlIHlvdSBydW4geW91ciBiY21fYmFsIG9yIGJjbV9zZG5fYWdlbnQKKyMKKyNjdHMgYXRwIHRyYW5zIHNvY2sgaW5zdCBkaz0weDEgZGlwPTEwLjEwLjEwLjEwCisKK3JwYyBub25leHRob3AKKworcnBjIHN0YXJ0CisKKyMgTk9URTogVG8gZW5hYmxlIENQVSBwYWNrZXQgc2VuZCBhbmQgcmVjZWl2ZSAoaS5lLiBQYWNrZXRPdXQgYW5kIFBhY2tldEluIGZvciBTRE4pLAorIyAgICAgICB5b3UgbXVzdCB1bi1jb21tZW50IHRoZSBsaW5lcyBiZWxvdyBhbmQgcmVwbGFjZSB0aGUgSVAgYWRkcmVzcyAoMTAuMTAuMTAuMTApIGFuZCBwb3J0IHdpdGgKKyMgICAgICAgdGhlIHZhbHVlcyB0aGF0IG1hdGNoIHlvdXIgc3lzdGVtLiAgVGhlIElQIGFkZHJlc3MgbXVzdCBiZSB0aGUgYWRkcmVzcyBvZiB0aGUgbGludXgKKyMgICAgICAgaW5zdGFuY2Ugd2hlcmUgeW91IHJ1biB5b3VyIGJjbV9iYWwgb3IgYmNtX3Nkbl9hZ2VudCwgYW5kIHRoZSBwb3J0IG11c3QgbWF0Y2ggdGhlIHZhbHVlcyB1c2VkCisjICAgICAgIGluIHlvdXIgYmFsX2NvbmZpZy5pbmkgZmlsZQorIyAgICAgICAoaS5lLiBUaGUgdHJhcF90YXJnZXQgcG9ydCBudW1iZXIgaGVyZSBtdXN0IG1hdGNoIHRyYXBfdWRwX3BvcnQgaW4gYmFsX2NvbmZpZy5pbmksIGFuZCB0aGUgCisjICAgICAgICB0cmFwX3JlY2VpdmUgcG9ydCBoZXJlIG11c3QgbWF0Y2ggcGt0X3NlbmRfc3ZyX2xpc3Rlbl9wb3J0IGluIGJhbF9jb25maWcuaW5pKQorCisjCisjYmFsIHRyYXBfdGFyZ2V0IDEwLjEwLjEwLjEwOjUwMDAxCisKKyNiYWwgdHJhcF9yZWNlaXZlIDEwLjEwLjEwLjEwOjUwMDAyCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvc3ZrNC9iY204ODQ3MF9ib2FyZC5zb2MgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvYmNtODg0NzBfYm9hcmQuc29jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NDQyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvYmNtODg0NzBfYm9hcmQuc29jCkBAIC0wLDAgKzEsMjExIEBACisjICRJZDoKKyMgJENvcHlyaWdodDogKGMpIDE5OTgtMjAwMSBCcm9hZGNvbSBDb3JwLgorIyBBbGwgUmlnaHRzIFJlc2VydmVkLiQKKyMKKworIyBEcmFtIGRxIHN3YXBzIGZvciBCQ004ODQ3MAorCisjRHJhbSBIVyBwcm9wZXJ0aWVzCisKKyNSWCBwb2xhcml0eQorY29uZmlnIGFkZCBwaHlfcnhfcG9sYXJpdHlfZmxpcC5CQ004ODQ3MD0wCisKKworI1RYIHBvbGFyaXR5Citjb25maWcgYWRkIHBoeV90eF9wb2xhcml0eV9mbGlwLkJDTTg4NDcwPTAKKworI3J4IGxhbmUgc3dhcAorY29uZmlnIGFkZCBwaHlfcnhfbGFuZV9tYXAuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV9yeF9sYW5lX21hcF9xdWFkMC5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3J4X2xhbmVfbWFwX3F1YWQxLkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfcnhfbGFuZV9tYXBfcXVhZDIuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV9yeF9sYW5lX21hcF9xdWFkMy5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3J4X2xhbmVfbWFwX3F1YWQ0LkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfcnhfbGFuZV9tYXBfcXVhZDUuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV9yeF9sYW5lX21hcF9xdWFkNi5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3J4X2xhbmVfbWFwX3F1YWQ3LkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfcnhfbGFuZV9tYXBfcXVhZDguQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV9yeF9sYW5lX21hcF9xdWFkOS5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3J4X2xhbmVfbWFwX3F1YWQxMC5CQ004ODQ3MD0weDMxMjAKK2NvbmZpZyBhZGQgcGh5X3J4X2xhbmVfbWFwX3F1YWQxMS5CQ004ODQ3MD0weDMyMTAKKworCisjdHggbGFuZSBzd2FwCitjb25maWcgYWRkIHBoeV90eF9sYW5lX21hcC5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3R4X2xhbmVfbWFwX3F1YWQwLkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfdHhfbGFuZV9tYXBfcXVhZDEuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV90eF9sYW5lX21hcF9xdWFkMi5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3R4X2xhbmVfbWFwX3F1YWQzLkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfdHhfbGFuZV9tYXBfcXVhZDQuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV90eF9sYW5lX21hcF9xdWFkNS5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3R4X2xhbmVfbWFwX3F1YWQ2LkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfdHhfbGFuZV9tYXBfcXVhZDcuQkNNODg0NzA9MHgzMjEwCitjb25maWcgYWRkIHBoeV90eF9sYW5lX21hcF9xdWFkOC5CQ004ODQ3MD0weDMyMTAKK2NvbmZpZyBhZGQgcGh5X3R4X2xhbmVfbWFwX3F1YWQ5LkJDTTg4NDcwPTB4MzIxMAorY29uZmlnIGFkZCBwaHlfdHhfbGFuZV9tYXBfcXVhZDEwLkJDTTg4NDcwPTB4MzEyMAorY29uZmlnIGFkZCBwaHlfdHhfbGFuZV9tYXBfcXVhZDExLkJDTTg4NDcwPTB4MzIxMAorCisjIERyYW0gZHEgc3dhcHMgZm9yIEJDTTg4NDcwCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMF9iaXQwLkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUwX2JpdDEuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTBfYml0Mi5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMF9iaXQzLkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUwX2JpdDQuQkNNODg0NzA9MworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTBfYml0NS5CQ004ODQ3MD0yCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMF9iaXQ2LkJDTTg4NDcwPTYKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUwX2JpdDcuQkNNODg0NzA9NworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTFfYml0MC5CQ004ODQ3MD03Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMV9iaXQxLkJDTTg4NDcwPTMKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUxX2JpdDIuQkNNODg0NzA9NQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTFfYml0My5CQ004ODQ3MD0xCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMV9iaXQ0LkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUxX2JpdDUuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTFfYml0Ni5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMV9iaXQ3LkJDTTg4NDcwPTIKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUyX2JpdDAuQkNNODg0NzA9NQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTJfYml0MS5CQ004ODQ3MD0xCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMl9iaXQyLkJDTTg4NDcwPTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUyX2JpdDMuQkNNODg0NzA9MworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTJfYml0NC5CQ004ODQ3MD00Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlMl9iaXQ1LkJDTTg4NDcwPTIKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUyX2JpdDYuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTJfYml0Ny5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlM19iaXQwLkJDTTg4NDcwPTMKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUzX2JpdDEuQkNNODg0NzA9MgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTNfYml0Mi5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlM19iaXQzLkJDTTg4NDcwPTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUzX2JpdDQuQkNNODg0NzA9NgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTBfYnl0ZTNfYml0NS5CQ004ODQ3MD0xCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMF9ieXRlM19iaXQ2LkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0wX2J5dGUzX2JpdDcuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTBfYml0MC5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMF9iaXQxLkJDTTg4NDcwPTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUwX2JpdDIuQkNNODg0NzA9NQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTBfYml0My5CQ004ODQ3MD0zCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMF9iaXQ0LkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUwX2JpdDUuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTBfYml0Ni5CQ004ODQ3MD00Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMF9iaXQ3LkJDTTg4NDcwPTIKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUxX2JpdDAuQkNNODg0NzA9MworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTFfYml0MS5CQ004ODQ3MD0xCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMV9iaXQyLkJDTTg4NDcwPTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUxX2JpdDMuQkNNODg0NzA9NgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTFfYml0NC5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMV9iaXQ1LkJDTTg4NDcwPTIKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUxX2JpdDYuQkNNODg0NzA9NworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTFfYml0Ny5CQ004ODQ3MD00Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMl9iaXQwLkJDTTg4NDcwPTAKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUyX2JpdDEuQkNNODg0NzA9MworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTJfYml0Mi5CQ004ODQ3MD0xCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMl9iaXQzLkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUyX2JpdDQuQkNNODg0NzA9NgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTJfYml0NS5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMl9iaXQ2LkJDTTg4NDcwPTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUyX2JpdDcuQkNNODg0NzA9MgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTNfYml0MC5CQ004ODQ3MD0yCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlM19iaXQxLkJDTTg4NDcwPTYKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUzX2JpdDIuQkNNODg0NzA9MQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTNfYml0My5CQ004ODQ3MD03Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlM19iaXQ0LkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0xX2J5dGUzX2JpdDUuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTFfYnl0ZTNfYml0Ni5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlM19iaXQ3LkJDTTg4NDcwPTMKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUwX2JpdDAuQkNNODg0NzA9NworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTBfYml0MS5CQ004ODQ3MD00Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMF9iaXQyLkJDTTg4NDcwPTAKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUwX2JpdDMuQkNNODg0NzA9MgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTBfYml0NC5CQ004ODQ3MD0zCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMF9iaXQ1LkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUwX2JpdDYuQkNNODg0NzA9NgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTBfYml0Ny5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMV9iaXQwLkJDTTg4NDcwPTIKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUxX2JpdDEuQkNNODg0NzA9NAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTFfYml0Mi5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMV9iaXQzLkJDTTg4NDcwPTYKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUxX2JpdDQuQkNNODg0NzA9NQorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTFfYml0NS5CQ004ODQ3MD0zCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMV9iaXQ2LkJDTTg4NDcwPTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUxX2JpdDcuQkNNODg0NzA9NworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTJfYml0MC5CQ004ODQ3MD0xCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMl9iaXQxLkJDTTg4NDcwPTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUyX2JpdDIuQkNNODg0NzA9MworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTJfYml0My5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMl9iaXQ0LkJDTTg4NDcwPTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUyX2JpdDUuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTJfYml0Ni5CQ004ODQ3MD0yCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlMl9iaXQ3LkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUzX2JpdDAuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTNfYml0MS5CQ004ODQ3MD03Citjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlM19iaXQyLkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUzX2JpdDMuQkNNODg0NzA9NgorY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTNfYml0NC5CQ004ODQ3MD0yCitjb25maWcgYWRkIGV4dF9yYW1fZHFfc3dhcF9kcmFtMl9ieXRlM19iaXQ1LkJDTTg4NDcwPTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9kcV9zd2FwX2RyYW0yX2J5dGUzX2JpdDYuQkNNODg0NzA9MworY29uZmlnIGFkZCBleHRfcmFtX2RxX3N3YXBfZHJhbTJfYnl0ZTNfYml0Ny5CQ004ODQ3MD0xCisKKyMgRHJhbSBiYW5rIGFkZHIgc3dhcHMgZm9yIEJDTTg4NDcwCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTBfYml0Ny5CQ004ODQ3MD00Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTBfYml0MTEuQkNNODg0NzA9NQorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0wX2JpdDEzLkJDTTg4NDcwPTE1Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTBfYml0MTQuQkNNODg0NzA9MTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQ1LkJDTTg4NDcwPTYKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQwLkJDTTg4NDcwPTcKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQ4LkJDTTg4NDcwPTgKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQxLkJDTTg4NDcwPTkKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQ0LkJDTTg4NDcwPTEwCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTBfYml0MTYuQkNNODg0NzA9MTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQxNS5CQ004ODQ3MD0xMgorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0wX2JpdDEyLkJDTTg4NDcwPTEzCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTBfYml0Ni5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTBfYml0Mi5CQ004ODQ3MD0xCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTBfYml0OS5CQ004ODQ3MD0yCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTBfYml0MTAuQkNNODg0NzA9MTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMF9iaXQxNy5CQ004ODQ3MD0xNgorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0xX2JpdDEwLkJDTTg4NDcwPTQKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMV9iaXQxNC5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0Ny5CQ004ODQ3MD0xNQorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0xX2JpdDEyLkJDTTg4NDcwPTE3Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0NC5CQ004ODQ3MD02Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0Ni5CQ004ODQ3MD03Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0OS5CQ004ODQ3MD04Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0MS5CQ004ODQ3MD05Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0NS5CQ004ODQ3MD0xMAorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0xX2JpdDExLkJDTTg4NDcwPTExCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0OC5CQ004ODQ3MD0xMgorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0xX2JpdDEzLkJDTTg4NDcwPTEzCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0MC5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0MTUuQkNNODg0NzA9MQorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0xX2JpdDIuQkNNODg0NzA9MgorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0xX2JpdDE3LkJDTTg4NDcwPTE0Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTFfYml0MTYuQkNNODg0NzA9MTYKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQxNS5CQ004ODQ3MD00Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTJfYml0NS5CQ004ODQ3MD01Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTJfYml0MTEuQkNNODg0NzA9MTUKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQ3LkJDTTg4NDcwPTE3Citjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTJfYml0MTcuQkNNODg0NzA9NgorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0yX2JpdDAuQkNNODg0NzA9NworY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0yX2JpdDE2LkJDTTg4NDcwPTgKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQyLkJDTTg4NDcwPTkKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQxMy5CQ004ODQ3MD0xMAorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0yX2JpdDkuQkNNODg0NzA9MTEKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQxMi5CQ004ODQ3MD0xMgorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0yX2JpdDYuQkNNODg0NzA9MTMKK2NvbmZpZyBhZGQgZXh0X3JhbV9hZGRyX2Jhbmtfc3dhcF9kcmFtMl9iaXQxNC5CQ004ODQ3MD0wCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTJfYml0OC5CQ004ODQ3MD0xCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTJfYml0MS5CQ004ODQ3MD0yCitjb25maWcgYWRkIGV4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbTJfYml0NC5CQ004ODQ3MD0xNAorY29uZmlnIGFkZCBleHRfcmFtX2FkZHJfYmFua19zd2FwX2RyYW0yX2JpdDEwLkJDTTg4NDcwPTE2CisKKyMjRHJhbSBIVyBwcm9wZXJ0aWVzCitjb25maWcgYWRkIGV4dF9yYW1fcHJlc2VudC5CQ004ODQ3MD0zCitjb25maWcgYWRkIGRyYW1fdHlwZV9ERFI0X01JQ1JPTl9ZNDAxNkFBQkdfSkRfRl80R0JJVD0xCitjb25maWcgYWRkIGV4dF9yYW1fZnJlcS5CQ004ODQ3MD0xNjAwCitjb25maWcgYWRkIGV4dF9yYW1fYWJpLkJDTTg4NDcwPTAKK2NvbmZpZyBhZGQgZXh0X3JhbV93cml0ZV9kYmkuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX3JlYWRfZGJpLkJDTTg4NDcwPTAKK2NvbmZpZyBhZGQgZXh0X3JhbV93cml0ZV9jcmMuQkNNODg0NzA9MAorY29uZmlnIGFkZCBleHRfcmFtX3JlYWRfY3JjLkJDTTg4NDcwPTAKK2NvbmZpZyBhZGQgZXh0X3JhbV9jbWRfcGFyX2xhdGVuY3kuQkNNODg0NzA9NgorY29uZmlnIGFkZCBleHRfcmFtX3R5cGUuQkNNODg0NzA9RERSNAorY29uZmlnIGFkZCBleHRfcmFtX3RvdGFsX3NpemUuQkNNODg0NzA9MzAwMAorCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvY29tYm8yOF9kcmFtLnNvYyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvc3ZrNC9jb21ibzI4X2RyYW0uc29jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0N2MxZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvY29tYm8yOF9kcmFtLnNvYwpAQCAtMCwwICsxLDU2MCBAQAorIworIyAkSWQ6IGNvbWJvMjhfZHJhbS5zb2MsdiAxLjAgMjAxNC8wNC8yOCAxNTo1MDowMCBuaGVmZXR6IEV4cCAkCisjCisjICRDb3B5cmlnaHQ6IChjKSAyMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJAorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyBHZW5lcmFsIE5vdGVzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPdXIgY29udHJvbGxlciBzdXBwb3J0IGJvdGggRERSNCBhbmQgR0REUjUsIHdlIG5lZWQgdG8gIm1vZGlmeSIgZXh0X3JhbV9jb2x1bW5zIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorIyAgIEZvciBERFI0LCBuZWVkIHRvIHVzZSBjb2x1bW4gbnVtYmVyIGFzIGluIERSQU0gRGF0YSBTaGVldCwgbWVhbmluZyAxMDI0IGluIGRyYW1zIHN1cHBvcnRlZC4KKyMgICBGb3IgR0REUjUsIG5lZWQgdG8gbXVsdGlwbHkgbnVtYmVyIGluIERhdGEgU2hlZXQgYnkgOCAocmVwcmVzZW50aW5nIHRoZSAzIGFkZHJlc3MgYml0cywgd2hpY2ggYXJlIGNvbnN0YW50IDAwMCBpbiBERFI0LiksIG1lYW5pbmcgNTEyIGluIGRyYW1zIHN1cHBvcnRlZC4KKworCitpZiAkP2RyYW1fdHlwZV9ERFI0X1NBTVNVTkdfSzRBNEcxNjVXRF80R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1ERFI0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0yNjAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NTMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xMzMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xMzMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9N2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzIwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xMzMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTMwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX3M9MTBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9MTBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX3M9NGM7XFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX2w9MTBjO1xcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9sPTZjO1xcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9zPTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfenFjcz0xMjhjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX2FsZXJ0PTEzMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnN0PTUwMDAwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0zOTAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xN2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0wO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9MTAyNDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz0zMjc2ODsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9ODsiCisKK2lmICQ/ZHJhbV90eXBlX0REUjRfTUlDUk9OX0VEWTQwMTZBQUJHX0RSRlJfNEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9RERSNDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MjYwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDUzMjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTMzMjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTMzMjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD04YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9zPTdjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTMyMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTMzMjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0zMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9zPTEwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9sPTEwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9zPTRjO1xcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPTEwYztcXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2RfbD02YztcXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3pxY3M9MTI4YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY19hbGVydD0xMzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD01MDAwMDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MzkwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9MTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTZjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfYWw9MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTEwMjQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MzI3Njg7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTg7IgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTm90ZTogTm90IGZvciBuZXcgZGVzaWduIG5vdCByZWNvbW1lbmRlZCB0byBiZSB1c2VkIGFuZCBub3Qgc3VwcG9ydGVkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmICQ/ZHJhbV90eXBlX0REUjRfTUlDUk9OX01UNDBBMjU2TTE2SEFfMDgzRUFfNEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9RERSNDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MjYwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDcwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD0xMWM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfcz05YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zMjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTQ5MDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MzAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfbD0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz00YztcXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD0xMmM7XFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9OGM7XFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF96cWNzPTE3MGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfYWxlcnQ9MTMwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yc3Q9NTAwMDAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTM5MDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTE4YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTI0YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz0xMDI0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTMyNzY4OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz04OyIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5vdGU6IE5vdCBmb3IgbmV3IGRlc2lnbiBub3QgcmVjb21tZW5kZWQgdG8gYmUgdXNlZCBhbmQgbm90IHN1cHBvcnRlZAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZiAkP2RyYW1fdHlwZV9ERFI0X01JQ1JPTl9NVDQwQTUxMk0xNl84R0JJVCAiXAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUREUjQ7IFwKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MzUwMDAwO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NTMyMDtcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTEzMzIwO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTMzMjA7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPThjO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfcz03YztcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTMyMDAwO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNTAwMDtcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTMwMDAwO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz0xMGM7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9sPTEwYztcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX3M9NGM7XFwKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD0xMGM7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9sPThjO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz00YztcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3RfenFjcz0xMjhjO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfYWxlcnQ9MTMwMDA7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD01MDAwMDAwMDA7XAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0zOTAwMDAwO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTEyYztcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTZjO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0wO1wKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz0xMDI0OyBcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9NjU1MzY7IFwKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xMzMyMDtcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTg7IgorCitpZiAkP2RyYW1fdHlwZV9ERFI0X0hZTklYX0g1QU40RzZOTUZSX1ZKQ180R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1ERFI0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0yNjAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NTMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xMzMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xMzMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzIwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xMzMyMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTMwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX3M9NzUwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9sPTc1MDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz0yNTAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX2w9NzUwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9sPThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF96cWNzPTEyOGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfYWxlcnQ9MTMwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfd3JfbGF0ZW5jeT0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yc3Q9NTAwMDAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTM5MDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTE2YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTIwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz0xMDI0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTMyNzY4OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz04OyIKKworaWYgJD9kcmFtX3R5cGVfRERSNF9NSUNST05fWTQwMTZBQUJHX0pEX0ZfNEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9RERSNDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MjYwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDcwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD0xMWM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfcz05YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zMjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTQ5MDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MzAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfbD0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz00YztcXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD0xMmM7XFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9OGM7XFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF96cWNzPTE3MGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfYWxlcnQ9MTMwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yc3Q9NTAwMDAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTM5MDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTE2YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTI0YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz0xMDI0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTMyNzY4OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz04OyIKKworaWYgJD9kcmFtX3R5cGVfR0REUjVfU0FNU1VOR19LNEcyMDMyNUZEXzJHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUdERFI1OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz03ODAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ4MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTE1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTE2MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX2w9NjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9zPTYwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzQwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xNDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE2MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTI0MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfMzJhdz0xOTIwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz0yYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9sPTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX3M9OGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD0xMGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2RfbD0zYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9zPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTE5MDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTNjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MjBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX3JkX2xhdGVuY3k9M2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfd3JfbGF0ZW5jeT0xNGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yc3Q9MjAwMDAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfYWw9MWM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz01MTI7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9ODE5MjsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9MTY7IgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTm90ZTogTm90IGZvciBuZXcgZGVzaWduIG5vdCByZWNvbW1lbmRlZCB0byBiZSB1c2VkIGFuZCBub3Qgc3VwcG9ydGVkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmICQ/ZHJhbV90eXBlX0dERFI1X1NBTVNVTkdfSzRHNDEzMjVGQ180R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1HRERSNTsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MTEwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDgwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTYwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD02MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9NjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zNDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE0MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTYwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MjQwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF8zMmF3PTE5MjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9zPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz04YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPTEwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9sPTNjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MTkwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9M2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0yMGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfcmRfbGF0ZW5jeT0zYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY193cl9sYXRlbmN5PTE0YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD0yMDAwMDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0xYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTUxMjsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz0xNjM4NDsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9MTY7IgorCisjaWYgJD9kcmFtX3R5cGVfR0REUjVfSFlOSVhfSDVHUTJIMjRBRlJfUjBDXzJHQklUICJcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1HRERSNTsgXAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTEyMDAwMDtcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00ODAwMDtcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTQwMDA7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTE4MDAwO1wKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPTljO1wKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9zPTljO1wKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zMjAwMDtcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xNjAwMDtcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNjAwMDtcCisjICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MzAwMDA7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfMzJhdz0yNDUwMDA7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX3M9MmM7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9MmM7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX3M9OGM7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX2w9OGM7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9M2M7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9MmM7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTM5MDAwMDA7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT0zYztcCisjICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xNmM7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX3JkX2xhdGVuY3k9MmM7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX3dyX2xhdGVuY3k9MTFjO1wKKyMgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD0yMDAwMDAwMDA7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX3RfYWw9MWM7XAorIyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9NTEyOyBcCisjICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz04MTkyOyBcCisjICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9MTY7IgorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgIEVMUElEQSBHRERSNQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpZiAkP2RyYW1fdHlwZV9HRERSNV9NSUNST05fRURXNDAzMkNBQkdfNEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9R0REUjU7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTkwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDQwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTMwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTcwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD01MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9NTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0yNzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE3MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTgwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MjAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF8zMmF3PTE2MDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9zPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz03YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPTdjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9M2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz0yYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0xOTAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTE4YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY19yZF9sYXRlbmN5PTNjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX3dyX2xhdGVuY3k9MTFjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnN0PTIwMDAwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9NTEyOyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTE2Mzg0OyBcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz0xNjsiCisKK2lmICQ/ZHJhbV90eXBlX0dERFI1X0hZTklYX0g1R0M0SDI0TUZSX1QyQ180R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1HRERSNTsgXAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MTIwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDgwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTQwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTgwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD05YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9zPTljO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTMyMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTYwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0zMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90XzMyYXc9MjQ1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX3M9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfbD0yYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9zPThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX2w9OGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2RfbD0zYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9zPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTE5MDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX3JkX2xhdGVuY3k9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfd3JfbGF0ZW5jeT0xM2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yc3Q9MjAwMDAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfYWw9MWM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY29sdW1ucz01MTI7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MTYzODQ7IFwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTE2OyIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTm90ZTogRm9yIGV4dGVuZGVkIGRldmljZXMgZm9yIGV4YW1wbGUgTWljcm9uIGRyYW1fdHlwZV9ERFI0X01JQ1JPTl9NVDQwQTI1Nk0xNkhBXzA4M0UKKyMgICAgICAgcGxlYXNlIHVzZSBub25lIGV4dGVuZGVkIHBhcmFtZXRlcnMgZm9yIGV4YW1wbGUgZHJhbV90eXBlX0REUjRfTUlDUk9OX01UNDBBMjU2TTE2SEFfMDgzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaWYgJD9kcmFtX3R5cGVfRERSNF9NSUNST05fTVQ0MEEyNTZNMTZIQV8wODNfNEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9RERSNDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9mcmVxPTEyMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MjYwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDYxNjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTQxNjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTQxNjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD04YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9zPTdjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzPTMyMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTQxNjA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz0zMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9zPTEwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9sPTEwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9zPTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX2w9MTBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9NmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3pxY3M9MTI4YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY19hbGVydD0xMzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD01MDAwMDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MzkwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9MTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfYWw9MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTEwMjQ7XAorICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz0zMjc2ODtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz04O1wKKyAgY29uZmlnIGRlbGV0ZSBleHRfcmFtX2NtZF9wYXJfbGF0ZW5jeSo7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY21kX3Bhcl9sYXRlbmN5PTU7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xN2M7IgorZXhwciAkZXh0X3JhbV93cml0ZV9kYmkrMCA9PSAxCitpZiAkPyAmJiAkP2RyYW1fdHlwZV9ERFI0X01JQ1JPTl9NVDQwQTI1Nk0xNkhBXzA4M180R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0yMGM7IgorCitpZiAkP2RyYW1fdHlwZV9ERFI0X01JQ1JPTl9NVDQwQTUxMk0xNkhBXzA4M184R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1ERFI0O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2ZyZXE9MTIwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0zNTAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYz00NjE2MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xNDE2MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF9yZD0xNDE2MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9sPThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9N2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzIwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xNDE2MDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTMwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX3M9MTBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9MTBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX3M9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD0xMGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2RfbD02YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9zPTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfenFjcz0xMjhjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX2FsZXJ0PTEzMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnN0PTUwMDAwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0zOTAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0wO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9MTAyNDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTY1NTM2O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTg7XAorICBjb25maWcgZGVsZXRlIGV4dF9yYW1fY21kX3Bhcl9sYXRlbmN5KjtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jbWRfcGFyX2xhdGVuY3k9NTtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTE3YzsiCitleHByICRleHRfcmFtX3dyaXRlX2RiaSswID09IDEKK2lmICQ/ICYmICQ/ZHJhbV90eXBlX0REUjRfTUlDUk9OX01UNDBBNTEyTTE2SEFfMDgzXzhHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTIwYzsiCisKK2lmICQ/ZHJhbV90eXBlX0REUjRfTUlDUk9OX01UNDBBMjU2TTE2R0VfMDYyXzRHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUREUjQ7XAorICBjb25maWcgYWRkIGV4dF9yYW1fZnJlcT0xNjAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTI2MDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ3MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTE1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTE1MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX2w9MTFjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9OWM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzIwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xNTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE0OTAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTMwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX3M9MTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9MTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX3M9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD0xMmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2RfbD04YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9zPTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfenFjcz0xNzBjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX2FsZXJ0PTEzMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnN0PTUwMDAwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0zOTAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT0xNmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0wO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9MTAyNDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTMyNzY4O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTg7XAorICBjb25maWcgZGVsZXRlIGV4dF9yYW1fY21kX3Bhcl9sYXRlbmN5KjtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jbWRfcGFyX2xhdGVuY3k9ODtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTI0YzsiCitleHByICRleHRfcmFtX3dyaXRlX2RiaSswID09IDEKK2lmICQ/ICYmICQ/ZHJhbV90eXBlX0REUjRfTUlDUk9OX01UNDBBMjU2TTE2R0VfMDYyXzRHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTI4YzsiCisKK2lmICQ/ZHJhbV90eXBlX0REUjRfU0FNU1VOR19LNEE0RzE2NVdFXzRHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUREUjQ7XAorICBjb25maWcgYWRkIGV4dF9yYW1fZnJlcT0xMjAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTI2MDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ2MTYwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTE0MTYwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTE0MTYwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX2w9OGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfcz03YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zMjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE0MTYwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MzAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz0xMGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfbD0xMGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz00YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPTEwYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9sPTZjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF96cWNzPTEyOGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfYWxlcnQ9MTMwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yc3Q9NTAwMDAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmVmPTM5MDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTEyYyA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0wO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9MTAyNDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9yb3dzPTMyNzY4O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTg7XAorICBjb25maWcgZGVsZXRlIGV4dF9yYW1fY21kX3Bhcl9sYXRlbmN5KjtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jbWRfcGFyX2xhdGVuY3k9NTtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTE3YzsiCitleHByICRleHRfcmFtX3dyaXRlX2RiaSswID09IDEKK2lmICQ/ICYmICQ/ZHJhbV90eXBlX0REUjRfU0FNU1VOR19LNEE0RzE2NVdFXzRHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTIwYzsiCisKK2lmICQ/ZHJhbV90eXBlX0dERFI1X01JQ1JPTl9NVDUxSzI1Nk0zMkhGXzUwXzhHQklUICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUdERFI1O1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjPTExMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ0MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3dyPTEyMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTE3MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX2w9NTAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZF9zPTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MjcwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xNzAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE4MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTIwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfMzJhdz0xNjAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ydHBfcz0yYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9sPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyX3M9NmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfbD02YztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NjZF9sPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX3M9MmM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MTkwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jcmNfcmRfbGF0ZW5jeT0zYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY193cl9sYXRlbmN5PTExYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JzdD0yMDAwMDAwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9hbD0yYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTEwMjQ7XAorICBjb25maWcgYWRkIGV4dF9yYW1fcm93cz0xNjM4NDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz0xNjtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTE2YzsiCitleHByICRleHRfcmFtX3dyaXRlX2RiaT09MQoraWYgJD8gJiYgJD9kcmFtX3R5cGVfR0REUjVfTUlDUk9OX01UNTFLMjU2TTMySEZfNTBfOEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NfY2FzX2xhdGVuY3k9MTZjOyIKKworaWYgJD9kcmFtX3R5cGVfR0REUjVfU0FNU1VOR19LNEc0MTMyNUZFX0hDMjhfNEdCSVQgIlwKKyAgY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9R0REUjU7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MTEwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NDgwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTUwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTYwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9ycmRfbD02MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX3M9NjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zNDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE0MDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTYwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9mYXc9MjQwMDA7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF8zMmF3PTE5MjAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9zPTJjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwX2w9NGM7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfcz0zYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cl9sPThjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY2NkX2w9M2M7XAorICBjb25maWcgYWRkIGV4dF9yYW1fdF9jY2Rfcz0yYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0xOTAwMDAwO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2Nfd3JfbGF0ZW5jeT0zYztcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2NyY19yZF9sYXRlbmN5PTNjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfY3JjX3dyX2xhdGVuY3k9MTRjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3RfcnN0PTIwMDAwMDAwMDtcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90X2FsPTFjO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9NTEyO1wKKyAgY29uZmlnIGFkZCBleHRfcmFtX3Jvd3M9MTYzODQ7XAorICBjb25maWcgYWRkIGV4dF9yYW1fYmFua3M9MTY7XAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xOGM7IgorZXhwciAkZXh0X3JhbV93cml0ZV9kYmkrMCA9PSAxCitpZiAkPyAmJiAkP2RyYW1fdHlwZV9HRERSNV9TQU1TVU5HX0s0RzQxMzI1RkVfSEMyOF80R0JJVCAiXAorICBjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT0xOWM7IgpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9zdms0L2NvbmZpZy5iY20gYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvY29uZmlnLmJjbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODc4YzJkCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9zdms0L2NvbmZpZy5iY20KQEAgLTAsMCArMSwyOTEyIEBACisjCisjICRJZDogY29uZmlnLXNhbmQuYmNtLHYgMS4xNDAgMjAxMy8wOS8yMiAxNDoyOTo0NyB0b21lcm1hIEV4cCAkCisjCisjICRDb3B5cmlnaHQ6IChjKSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJAorCisjcGNpX292ZXJyaWRlX2Rldi4wPTB4ODM3NQorCisjIE5vdGU6IGNvbW1lbnQgc2l6ZSBpcyByZXN0cmljdGVkIHRvIDEyOCBjaGFyZWN0ZXJzIHBlciBsaW5lLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyNjZmcgZm9yIEJDTTg4NjQwIChQZXRyYUIpLCBCQ004ODY1MCAoQXJhZCkgYW5kIEJDTTg4MjAyIChBcmRvbikKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIHRlbXBvcmFyeSBzdXBwcmVzc2luZyB1bmtub3duIHNvYyBwcm9wZXJ0aWVzIHdhcm5pbmdzIC0gdGlsbCBhZGRpbmcgdGhlbSB1bmtub3duIHRvIHByb3BlcnR5LmgvcHJvcGdlbgorIyMgKG5lZWQgdG8gYmUgdGhlIGZpcnN0IHNvYyBwcm9wZXJ0eSBpbiB0aGUgZmlsZSkuCitzdXBwcmVzc191bmtub3duX3Byb3Bfd2FybmluZ3M9MQorCisKKyMjIE11bHRpIGRldmljZSBzeXN0ZW0gKE5lZ2V2KTogMiBkZXZpY2VzLCBmYWJyaWMgbW9kZSBpcyBGRSwgbW9kIGlkIGlzIHNsb3QgaWQKKyMjIChUb3AgbGluZSBjYXJkIGlzIDAsIGJ1dHRvbiBpcyAxKS4KKyNkaWFnX2NoYXNzaXM9MQorCisjIyBEaXNhYmxlIGRpYWcgaW5pdCBhcHBsaWNhdGlvbi4gU2hvdWxkIGJlIHVzZWQgaWYgb25lIHdhbnRzIHRvIHJ1biBoaXMgb3duCisjIyBhcHBsaWNhdGlvbiBpbnN0ZWFkIG9mIHRoZSBkaWFnIGluaXQgZXhhbXBsZQorI2RpYWdfZGlzYWJsZT0xCisKKyMjIFNraXAgY29zcSBjb25maWd1cmF0aW9uIGluIGRpYWdfaW5pdAorI2RpYWdfY29zcV9kaXNhYmxlPTEKKyMKKworc3RhY2tfZW5hYmxlLkJDTTg4NjgwPTEKK3RkbWFfdGltZW91dF91c2VjLkJDTTg4NjgwPTMwMDAwMDAKK3RzbGFtX3RpbWVvdXRfdXNlYy5CQ004ODY4MD0zMDAwMDAwCitkaWFnX2VtdWxhdG9yX3BhcnRpYWxfaW5pdC5CQ004ODY4MD0wCitwaHlfc2ltdWwuQkNNODg2ODA9MAorCisKKyMjIFNraXAgbDIgY29uZmlndXJhdGlvbiBpbiBkaWFnX2luaXQKKyNkaWFnX2wyX2Rpc2FibGU9MQorCisjIyBMMiBtb2RlIHRvIGxvYWQgMD1ERUZBVUxULCAxPUlOR1JFU1NfRElTVCwgMj1JTkdSRVNTX0NFTlQsIDM9RUdSRVNTX0RJU1QsIDQ9RUdSRVNTX0NFTlQsIDU9RUdSRVNTX0lOREVQRU5ERU5UCisjICAgICAgICAgICAgICAgICAgNj0oSU5HUkVTU19DRU5UICsgTEVBUk5fQ1BVKSwgNz0oRUdSRVNTX0NFTlQgKyBMRUFSTl9DUFUpCisjbDJfbW9kZT0wCisKKyMjIFNraXAgc3RrIGNvbmZpZ3VyYXRpb24gaW4gZGlhZ19pbml0CisjZGlhZ19ub19hcHBsX3N0az0xCisKKyMjIFNraXAgaXRtaCBwcm9ncmFtbWFibGUgbW9kZSBjb25maWd1cmF0aW9uIGluIGRpYWdfaW5pdAorI2RpYWdfbm9faXRtaF9wcm9nX21vZGU9MQorCisjIEluZ3Jlc3MgUE1GIGtleSBhbGxvY2F0aW9uIG9wdGltaXphdGlvbgorZmllbGRfa2V5X2FsbG9jYXRpb25fbXNiX2JhbGFuY2VfZW5hYmxlPTEKKworIyMgU2V0IG1vZGlkIHZhbHVlLiBTaG91bGQgYmUgdXNlZCB3aGVuIHJ1bm5pbmcgbXVsdGktZmFwIHN5c3RlbS4KKyMjIEVhY2ggZmFwIHNob3VsZCBoYXZlIGl0J3MgdW5pcXVlIG1vZGlkIHZhbHVlLiBEZWZhdWx0IGlzIGRlc2NyaWJlZCBpbiBkaWFnX2NoYXNzaXMuCisjbW9kdWxlX2lkPTxtb2RpZD4KKworIyMgU2V0IGJhc2VfbW9kaWQgdmFsdWUuIERlZmF1bHQgaXMgMC4KKyNiYXNlX21vZHVsZV9pZD08YmFzZV9tb2RpZD4KKworIyMgU2V0IG5vZl9kZXZpY2VzIHZhbHVlLiBTaG91bGQgYmUgc2V0IHdoZW4gd29ya2luZyBvbiBtdWx0aS1mYXBzIHN5c3RlbS4KKyMjIERlZmF1bHQgaXMgMSB3aGVuIGRpYWdfY2hhc3NpcyBpcyBub3QgZW5hYmxlZCwgb3IgMiB3aGVuIGRpYWdfY2hhc3NpcyBpcyBlbmFibGVkLgorI25fZGV2aWNlcz08bm9mX2RldmljZXM+CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjI2NmZyBmb3IgQkNNODg2NTAgLSBBcmFkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMgRGV2aWNlIGNvbmZpZ3VyYXRpb24gIyMjCisKKyMjIEFjdGl2YXRlIEVtdWxhdGlvbiBwYXJ0aWFsIGluaXQuIFZhbHVlczogMCAtIE5vcm1hbCwgMSAtIEVtdWxhdGlvbiAuRGVmYXVsdDogMHgwLgorZGlhZ19lbXVsYXRvcl9wYXJ0aWFsX2luaXQuQkNNODg2NTA9MAorI2RpYWdfZW11bGF0b3JfcGFydGlhbF9pbml0LkJDTTg4MjcwPTEKKyNkaWFnX2VtdWxhdG9yX3BhcnRpYWxfaW5pdC5CQ004ODY4MD0xCisjZGlhZ19lbXVsYXRvcl9wYXJ0aWFsX2luaXQuQkNNODg2NzU9MgorCisjcmVhbCBwaHkgaXNuJ3QgY29ubmVjdGVkIC0gcmVtb3ZlIG9uIHNpbGljb24gYXJyaXZhbAorI3BoeV9zaW11bC5CQ004ODY3NT0xCisKKyMjIEdlbmVyYWwKKyMgU2V0IHRoZSBGQVAgRGV2aWNlIG1vZGUKKyMgT3B0aW9uczogUFAgLyBUTSAvIFRETV9PUFRJTUlaRUQgLyBURE1fU1RBTkRBUkQKK2ZhcF9kZXZpY2VfbW9kZS5CQ004ODY1MD1QUAorIworIyBGSVhNRTogU0RLLTkxODMzCisjIFBQIEZpeGVkIEZvbGxvd2VkIFNESy05MTY2MgorIworCisjIE9wdGlvbnM6IFNZTU1FVFJJQyAvIEFTWU1NRVRSSUMgLyBTSU5HTEVfQ09SRQorIyBGb3IgZmFzdGVyIGVtdWxhdGlvbiwgdXNlIFNJTkdMRV9DT1JFCitkZXZpY2VfY29yZV9tb2RlLkJDTTg4Njc1PVNZTU1FVFJJQworZGV2aWNlX2NvcmVfbW9kZS5CQ004ODY4MD1TWU1NRVRSSUMKKyMjIENyZWRpdCB3b3J0aCBzaXplIChCeXRlcykKK2NyZWRpdF9zaXplLkJDTTg4NjUwPTEwMjQKKworIyMgS0JQIHJlY292ZXJ5IC0gYWxsb3cgZm9yIHJlY292ZXJ5IHNlcXVlbmNlIHRvIHJ1biBkdXJpbmcgaW5pdCBhbmQgc29mdCByZXNldCAob25seSBpZiBuZWNlc3NhcnkpCitjdXN0b21fZmVhdHVyZV9rYnBfcmVjb3ZlcnlfZW5hYmxlPTAKKworIyMgQ2xvY2sgY29uZmlndXJhdGlvbnMKKyMgQ29yZSBjbG9jayBzcGVlZCAoTUh6KS4gRGVmYXVsdC0gQkNNODg2NTA6IDYwMCBNSHosIEJDTTg4Njc1OiA3MjAgTUh6Citjb3JlX2Nsb2NrX3NwZWVkX2toei5CQ004ODY1MD02MDAwMDAKK2NvcmVfY2xvY2tfc3BlZWRfa2h6LkJDTTg4Njc1PTcyMDAwMAorY29yZV9jbG9ja19zcGVlZF9raHouQkNNODg0NzA9NjAwMDAwCitjb3JlX2Nsb2NrX3NwZWVkX2toei5CQ004ODY4MD04Mzc1MDAKK2NvcmVfY2xvY2tfc3BlZWRfa2h6LkJDTTg4MjcwPTI1MDAwMAorCisjIFN5c3RlbSByZWZlcmVuY2UgY2xvY2sgKE1IeikuIERlZmF1bHQtIEJDTTg4NjUwOiA2MDAgTUh6LCBCQ004ODY3NTogODAwIE1Iegorc3lzdGVtX3JlZl9jb3JlX2Nsb2NrX2toei5CQ004ODY1MD0xMjAwMDAwCisKKyNmYWJyaWMgcGNwCitmYWJyaWNfcGNwX2VuYWJsZS5CQ004ODY3NT0xCisKKyNVc2luZyBUY2FtIGluc3RlYWQgb2YgdGhlIEtBUFMgZm9yIHRoZSBJUHY0IE1DIGFuZCBJUFY2IE1DCisjIDAgLSBEb24ndCB1c2UgVEFDTQorIyAxIC0gVXNlIFRDQU0gZm9yIElQVjQvNiBNQworIyAyIC0gVXNlIFRBQ00gZm9yIElQVjQvNiBNQyBidXQgZG9uJ3QgdXNlIHRoZSBWUkYgZmllbGQgYXMgYSBxdWFsaWZpZXIgZm9yIElQVjQgTUMgZW50cmllcworI2N1c3RvbV9mZWF0dXJlX2wzX21jX3VzZV90Y2FtPTAKKworI2ZvciBJUHY2VUM6IHVzZSBUY2FtIGluc3RlYWQgb2YgS0FQUworI05vdGUgdGhhdCBpZiB0aGlzIHByb3BlcnR5IGlzIGVuYWJsZWQgdGhlIElQVjYtVUMgUlBGIHdpbGwgYmUgZGlzYWJsZWQKKyNjdXN0b21fZmVhdHVyZV9sM19pcHY2X3VjX3VzZV90Y2FtPTAKKworCisjYW1zIHBsbCBvdmVycmlkZSB2YWx1ZSAob25seSBmb3IgSmVyaWNobyBBMC9BMSktIHBvc3NpYmxlIHZhbHVlczogMHgxOSwgMHgxZSwgMHgxZi4gRGVmYXVsdCB2YWx1ZSAweDFmCisjY3VzdG9tX2ZlYXR1cmVfYW1zX3BsbF9vdmVycmlkZS5CQ004ODY3NT0weDFmCisKKyMjIyBOZXR3b3JrIEludGVyZmFjZSBjb25maWd1cmF0aW9uICMjIworIyMgVXNlIG9mIHRoZSB1Y29kZV9wb3J0XzxMb2NhbC1Qb3J0LUlkPj08SW50ZXJmYWNlLXR5cGU+WzxJbnRlcmZhY2UtSWQ+XVsuPENoYW5uZWwtSWQ+XQorIyMgTG9jYWwgcG9ydCByYW5nZTogMCAtIDI1NS4KKyMjIEludGVyZmFjZSB0eXBlczogWEFVSS9SWEFVSS9TR01JSS9JTEtOLzEwR0Jhc2UtUi9YTEdFL0NHRS9DUFUvSUdOT1JFCisKKyMgTWFwIGJjbSBsb2NhbCBwb3J0IHRvIENQVVsuY2hhbm5lbF0gaW50ZXJmYWNlcwordWNvZGVfcG9ydF8wLkJDTTg4NjUwPUNQVS4wCisKKyMgTWFwIGJjbSBsb2NhbCBwb3J0IHRvIE5ldHdvcmstSW50ZXJmYWNlWy5jaGFubmVsXSBpbnRlcmZhY2VzIC0gVEJECit1Y29kZV9wb3J0XzEyOC5CQ004ODY1MD0xMEdCYXNlLVIzNgordWNvZGVfcG9ydF8xMjkuQkNNODg2NTA9MTBHQmFzZS1SMzcKK3Vjb2RlX3BvcnRfMTMwLkJDTTg4NjUwPTEwR0Jhc2UtUjMyCit1Y29kZV9wb3J0XzEzMS5CQ004ODY1MD0xMEdCYXNlLVIzMwordWNvZGVfcG9ydF8xMzIuQkNNODg2NTA9MTBHQmFzZS1SMzQKK3Vjb2RlX3BvcnRfMTMzLkJDTTg4NjUwPTEwR0Jhc2UtUjM1Cit1Y29kZV9wb3J0XzEzNC5CQ004ODY1MD0xMEdCYXNlLVIxNgordWNvZGVfcG9ydF8xMzUuQkNNODg2NTA9MTBHQmFzZS1SMTcKK3Vjb2RlX3BvcnRfMTM2LkJDTTg4NjUwPTEwR0Jhc2UtUjE4Cit1Y29kZV9wb3J0XzEzNy5CQ004ODY1MD0xMEdCYXNlLVIxOQorCit1Y29kZV9wb3J0XzEuQkNNODg2NTA9MTBHQmFzZS1SMjIKK3Vjb2RlX3BvcnRfMi5CQ004ODY1MD0xMEdCYXNlLVIyMQordWNvZGVfcG9ydF8zLkJDTTg4NjUwPTEwR0Jhc2UtUjQyCit1Y29kZV9wb3J0XzQuQkNNODg2NTA9MTBHQmFzZS1SNDEKKworY3VzdG9tX2ZlYXR1cmVfbmlmX3JlY292ZXJ5X2VuYWJsZS5CQ004ODY1MD0xCitjdXN0b21fZmVhdHVyZV9uaWZfcmVjb3ZlcnlfaXRlci5CQ004ODY1MD03CitjdXN0b21fZmVhdHVyZV9za2lwX2JlZm9yZV90cmFmZmljX3ZhbGlkYXRpb24uQkNNODg2NzU9MAorI2N1c3RvbV9mZWF0dXJlX21hY19maWZvX3N0YXJ0X3R4X3RocnMuQkNNODg2NzU9OQorCisjcmVkaXJlY3QgcGFja2V0cyB0aGF0IGFyZSBkZXN0aW5lZCB0byBpbnZhbGlkIHF1ZXVlcworaW52YWxpZF9xdWV1ZV9yZWRpcmVjdD0wCisKKyNDTFAwCisjdWNvZGVfcG9ydF8xLkJDTTg4Njc1PVhFMDpjb3JlXzAuMQorI3Vjb2RlX3BvcnRfMi5CQ004ODY3NT1YRTE6Y29yZV8wLjIKKyN1Y29kZV9wb3J0XzMuQkNNODg2NzU9WEUyOmNvcmVfMC4zCisjdWNvZGVfcG9ydF80LkJDTTg4Njc1PVhFMzpjb3JlXzAuNAorI0NMUDEKKyN1Y29kZV9wb3J0XzUuQkNNODg2NzU9WEU0OmNvcmVfMC41CisjdWNvZGVfcG9ydF82LkJDTTg4Njc1PVhFNTpjb3JlXzAuNgorI3Vjb2RlX3BvcnRfNy5CQ004ODY3NT1YRTY6Y29yZV8wLjcKKyN1Y29kZV9wb3J0XzguQkNNODg2NzU9WEU3OmNvcmVfMC44CisjQ0xQMgorI3Vjb2RlX3BvcnRfOS5CQ004ODY3NT1YRTg6Y29yZV8wLjkKKyN1Y29kZV9wb3J0XzEwLkJDTTg4Njc1PVhFOTpjb3JlXzAuMTAKKyN1Y29kZV9wb3J0XzExLkJDTTg4Njc1PVhFMTA6Y29yZV8wLjExCisjdWNvZGVfcG9ydF8xMi5CQ004ODY3NT1YRTExOmNvcmVfMC4xMgorI0NMUDMKKyN1Y29kZV9wb3J0XzEzLkJDTTg4Njc1PVhFMTI6Y29yZV8wLjEzCisjdWNvZGVfcG9ydF8xNC5CQ004ODY3NT1YRTEzOmNvcmVfMC4xNAorI3Vjb2RlX3BvcnRfMTUuQkNNODg2NzU9WEUxNDpjb3JlXzAuMTUKKyN1Y29kZV9wb3J0XzE2LkJDTTg4Njc1PVhFMTU6Y29yZV8wLjE2CisjQ0xQNAorI3Vjb2RlX3BvcnRfMTcuQkNNODg2NzU9WEUxNjpjb3JlXzAuMTcKKyN1Y29kZV9wb3J0XzE4LkJDTTg4Njc1PVhFMTc6Y29yZV8wLjE4CisjdWNvZGVfcG9ydF8xOS5CQ004ODY3NT1YRTE4OmNvcmVfMC4xOQorI3Vjb2RlX3BvcnRfMjAuQkNNODg2NzU9WEUxOTpjb3JlXzAuMjAKKyNDTFA1CisjdWNvZGVfcG9ydF8yMS5CQ004ODY3NT1YRTIwOmNvcmVfMC4yMQorI3Vjb2RlX3BvcnRfMjIuQkNNODg2NzU9WEUyMTpjb3JlXzAuMjIKKyN1Y29kZV9wb3J0XzIzLkJDTTg4Njc1PVhFMjI6Y29yZV8wLjIzCisjdWNvZGVfcG9ydF8yNC5CQ004ODY3NT1YRTIzOmNvcmVfMC4yNAorI1hMUDAKKyN1Y29kZV9wb3J0XzI1LkJDTTg4Njc1PVhFMjQ6Y29yZV8wLjI1CisjdWNvZGVfcG9ydF8yNi5CQ004ODY3NT1YRTI1OmNvcmVfMC4yNgorI3Vjb2RlX3BvcnRfMjcuQkNNODg2NzU9WEUyNjpjb3JlXzAuMjcKKyN1Y29kZV9wb3J0XzI4LkJDTTg4Njc1PVhFMjc6Y29yZV8wLjI4CisjWExQMQorI3Vjb2RlX3BvcnRfMjkuQkNNODg2NzU9WEUyODpjb3JlXzAuMjkKKyN1Y29kZV9wb3J0XzMwLkJDTTg4Njc1PVhFMjk6Y29yZV8wLjMwCisjdWNvZGVfcG9ydF8zMS5CQ004ODY3NT1YRTMwOmNvcmVfMC4zMQorI3Vjb2RlX3BvcnRfMzIuQkNNODg2NzU9WEUzMTpjb3JlXzAuMzIKKyNYTFAyCisjdWNvZGVfcG9ydF8zMy5CQ004ODY3NT1YRTMyOmNvcmVfMC4zMworI3Vjb2RlX3BvcnRfMzQuQkNNODg2NzU9WEUzMzpjb3JlXzAuMzQKKyN1Y29kZV9wb3J0XzM1LkJDTTg4Njc1PVhFMzQ6Y29yZV8wLjM1CisjdWNvZGVfcG9ydF8zNi5CQ004ODY3NT1YRTM1OmNvcmVfMC4zNgorI1hMUDMKKyN1Y29kZV9wb3J0XzM3LkJDTTg4Njc1PVhFMzY6Y29yZV8wLjM3CisjdWNvZGVfcG9ydF8zOC5CQ004ODY3NT1YRTM3OmNvcmVfMC4zOAorI3Vjb2RlX3BvcnRfMzkuQkNNODg2NzU9WEUzODpjb3JlXzAuMzkKKyN1Y29kZV9wb3J0XzQwLkJDTTg4Njc1PVhFMzk6Y29yZV8wLjQwCisjWExQNCAobm90IGFzIFBNUTApCisjdWNvZGVfcG9ydF80MS5CQ004ODY3NT1YRTQwOmNvcmVfMC40MQorI3Vjb2RlX3BvcnRfNDIuQkNNODg2NzU9WEU0MTpjb3JlXzAuNDIKKyN1Y29kZV9wb3J0XzQzLkJDTTg4Njc1PVhFNDI6Y29yZV8wLjQzCisjdWNvZGVfcG9ydF80NC5CQ004ODY3NT1YRTQzOmNvcmVfMC40NAorI1hMUDUgKG5vdCBhcyBQTVExKQorI3Vjb2RlX3BvcnRfNDUuQkNNODg2NzU9WEU0NDpjb3JlXzAuNDUKKyN1Y29kZV9wb3J0XzQ2LkJDTTg4Njc1PVhFNDU6Y29yZV8wLjQ2CisjdWNvZGVfcG9ydF80Ny5CQ004ODY3NT1YRTQ2OmNvcmVfMC40NworI3Vjb2RlX3BvcnRfNDguQkNNODg2NzU9WEU0Nzpjb3JlXzAuNDgKKyNYTFA5CisjdWNvZGVfcG9ydF80OS5CQ004ODY3NT1YRTYwOmNvcmVfMC40OQorI3Vjb2RlX3BvcnRfNTAuQkNNODg2NzU9WEU2MTpjb3JlXzAuNTAKKyN1Y29kZV9wb3J0XzUxLkJDTTg4Njc1PVhFNjI6Y29yZV8wLjUxCisjdWNvZGVfcG9ydF81Mi5CQ004ODY3NT1YRTYzOmNvcmVfMC41MgorI1hMUDEwCisjdWNvZGVfcG9ydF81My5CQ004ODY3NT1YRTY0OmNvcmVfMC41MworI3Vjb2RlX3BvcnRfNTQuQkNNODg2NzU9WEU2NTpjb3JlXzAuNTQKKyN1Y29kZV9wb3J0XzU1LkJDTTg4Njc1PVhFNjY6Y29yZV8wLjU1CisjdWNvZGVfcG9ydF81Ni5CQ004ODY3NT1YRTY3OmNvcmVfMC41NgorI1hMUDExIChub3QgYXMgUE1RMykKKyN1Y29kZV9wb3J0XzU3LkJDTTg4Njc1PVhFNjg6Y29yZV8wLjU3CisjdWNvZGVfcG9ydF81OC5CQ004ODY3NT1YRTY5OmNvcmVfMC41OAorI3Vjb2RlX3BvcnRfNTkuQkNNODg2NzU9WEU3MDpjb3JlXzAuNTkKKyN1Y29kZV9wb3J0XzYwLkJDTTg4Njc1PVhFNzE6Y29yZV8wLjYwCisKKwordWNvZGVfcG9ydF8wLkJDTTg4Njc1PUNQVS4wOmNvcmVfMC4wCit1Y29kZV9wb3J0XzAuQkNNODg2ODA9Q1BVLjA6Y29yZV8wLjAKK3Vjb2RlX3BvcnRfMjAwLkJDTTg4Njc1PUNQVS44OmNvcmVfMS4yMDAKK3Vjb2RlX3BvcnRfMjAwLkJDTTg4NjgwPUNQVS44OmNvcmVfMS4yMDAKK3Vjb2RlX3BvcnRfMjAxLkJDTTg4Njc1PUNQVS4xNjpjb3JlXzAuMjAxCit1Y29kZV9wb3J0XzIwMS5CQ004ODY4MD1DUFUuMTY6Y29yZV8wLjIwMQordWNvZGVfcG9ydF8yMDIuQkNNODg2NzU9Q1BVLjI0OmNvcmVfMS4yMDIKK3Vjb2RlX3BvcnRfMjAyLkJDTTg4NjgwPUNQVS4yNDpjb3JlXzEuMjAyCit1Y29kZV9wb3J0XzIwMy5CQ004ODY3NT1DUFUuMzI6Y29yZV8wLjIwMwordWNvZGVfcG9ydF8yMDMuQkNNODg2ODA9Q1BVLjMyOmNvcmVfMC4yMDMKKworI2RlZmF1bHQgcG9ydHMgZm9yIEplcmljaG8gYW5kIFFNWAordWNvZGVfcG9ydF8xLkJDTTg4Njc1PUNHRTA6Y29yZV8wLjEKK3Vjb2RlX3BvcnRfMi5CQ004ODY3NT1JTEtOMTpjb3JlXzAuMgoraWxrbl9sYW5lc18xLkJDTTg4Njc1PTB4ZmZmMDAwCit1Y29kZV9wb3J0XzMuQkNNODg2NzU9SUxLTjI6Y29yZV8wLjMKK2lsa25fbGFuZXNfMi5CQ004ODY3NT0weGZmZgordWNvZGVfcG9ydF8xNy5CQ004ODY3NT1DR0UxOmNvcmVfMS4xNworCisjZGVmYXVsdCBwb3J0cyBmb3IgSmVyaWNobwordWNvZGVfcG9ydF8xMy5CQ004ODY3NT0xMEdCYXNlLVI2NDpjb3JlXzAuMTMKK3Vjb2RlX3BvcnRfMTQuQkNNODg2NzU9MTBHQmFzZS1SNjU6Y29yZV8wLjE0Cit1Y29kZV9wb3J0XzE1LkJDTTg4Njc1PTEwR0Jhc2UtUjY4OmNvcmVfMS4xNQordWNvZGVfcG9ydF8xNi5CQ004ODY3NT0xMEdCYXNlLVI2OTpjb3JlXzEuMTYKKworI2RlZmF1bHQgcG9ydHMgZm9yIEplcmljaG8gUGx1cwordWNvZGVfcG9ydF8xMy5CQ004ODY4MD0xMEdCYXNlLVI0MDpjb3JlXzAuMTMKK3Vjb2RlX3BvcnRfMTQuQkNNODg2ODA9MTBHQmFzZS1SNDM6Y29yZV8wLjE0Cit1Y29kZV9wb3J0XzE1LkJDTTg4NjgwPTEwR0Jhc2UtUjQ0OmNvcmVfMS4xNQordWNvZGVfcG9ydF8xNi5CQ004ODY4MD0xMEdCYXNlLVI0Njpjb3JlXzEuMTYKKworI2RlZmF1bHQgcG9ydHMgZm9yIFFNWAordWNvZGVfcG9ydF8xMy5CQ004ODM3NV9BMD0xMEdCYXNlLVI2NDpjb3JlXzAuMTMKK3Vjb2RlX3BvcnRfMTQuQkNNODgzNzVfQTA9MTBHQmFzZS1SNjY6Y29yZV8wLjE0Cit1Y29kZV9wb3J0XzE1LkJDTTg4Mzc1X0EwPTEwR0Jhc2UtUjY5OmNvcmVfMS4xNQordWNvZGVfcG9ydF8xNi5CQ004ODM3NV9BMD0xMEdCYXNlLVI3MTpjb3JlXzEuMTYKKyAKKwordWNvZGVfcG9ydF8xMy5CQ004ODM3NV9CMD0xMEdCYXNlLVI2NDpjb3JlXzAuMTMKK3Vjb2RlX3BvcnRfMTQuQkNNODgzNzVfQjA9MTBHQmFzZS1SNjY6Y29yZV8wLjE0Cit1Y29kZV9wb3J0XzE1LkJDTTg4Mzc1X0IwPTEwR0Jhc2UtUjY5OmNvcmVfMS4xNQordWNvZGVfcG9ydF8xNi5CQ004ODM3NV9CMD0xMEdCYXNlLVI3MTpjb3JlXzEuMTYKKyAKKyAKKyNkZWZhdWx0IHBvcnRzIGZvciBRQVgKK3Vjb2RlX3BvcnRfMC5CQ004ODQ3MD1DUFUuMDpjb3JlXzAuMAorCit1Y29kZV9wb3J0XzIwMC5CQ004ODQ3MD1DUFUuODpjb3JlXzAuMjAwCisKK3Vjb2RlX3BvcnRfMjAxLkJDTTg4NDcwPUNQVS4xNjpjb3JlXzAuMjAxCisKK3Vjb2RlX3BvcnRfMjAyLkJDTTg4NDcwPUNQVS4yNDpjb3JlXzAuMjAyCisKK3Vjb2RlX3BvcnRfMjAzLkJDTTg4NDcwPUNQVS4zMjpjb3JlXzAuMjAzCisKK3RtX3BvcnRfaGVhZGVyX3R5cGVfaW5fMC5CQ004ODQ3MD1JTkpFQ1RFRF8yX1BQCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8wLkJDTTg4NDcwPUNQVQorCit1Y29kZV9wb3J0XzEuQkNNODg0NzA9WEUyMjpjb3JlXzAuMQordWNvZGVfcG9ydF8yLkJDTTg4NDcwPVhFMjE6Y29yZV8wLjIKK3Vjb2RlX3BvcnRfMy5CQ004ODQ3MD1YRTQxOmNvcmVfMC4zCit1Y29kZV9wb3J0XzQuQkNNODg0NzA9WEU0Mjpjb3JlXzAuNAorCitwb25fYXBwbGljYXRpb25fc3VwcG9ydF9lbmFibGVkXzEuQkNNODg0NzA9VFJVRQorcG9uX2FwcGxpY2F0aW9uX3N1cHBvcnRfZW5hYmxlZF8yLkJDTTg4NDcwPVRSVUUKK3Bvbl9hcHBsaWNhdGlvbl9zdXBwb3J0X2VuYWJsZWRfMy5CQ004ODQ3MD1UUlVFCitwb25fYXBwbGljYXRpb25fc3VwcG9ydF9lbmFibGVkXzQuQkNNODg0NzA9VFJVRQorCit1Y29kZV9wb3J0XzEyOC5CQ004ODQ3MD1YRTM2OmNvcmVfMC4xMjgKK3Vjb2RlX3BvcnRfMTI5LkJDTTg4NDcwPVhFMzc6Y29yZV8wLjEyOQordWNvZGVfcG9ydF8xMzAuQkNNODg0NzA9WEUzMjpjb3JlXzAuMTMwCit1Y29kZV9wb3J0XzEzMS5CQ004ODQ3MD1YRTMzOmNvcmVfMC4xMzEKK3Vjb2RlX3BvcnRfMTMyLkJDTTg4NDcwPVhFMzQ6Y29yZV8wLjEzMgordWNvZGVfcG9ydF8xMzMuQkNNODg0NzA9WEUzNTpjb3JlXzAuMTMzCit1Y29kZV9wb3J0XzEzNC5CQ004ODQ3MD1YRTE2OmNvcmVfMC4xMzQKK3Vjb2RlX3BvcnRfMTM1LkJDTTg4NDcwPVhFMTc6Y29yZV8wLjEzNQordWNvZGVfcG9ydF8xMzYuQkNNODg0NzA9WEUxODpjb3JlXzAuMTM2Cit1Y29kZV9wb3J0XzEzNy5CQ004ODQ3MD1YRTE5OmNvcmVfMC4xMzcKKworYmNtODg2eHhfcnhfdXNlX2h3X3RyYXBfaWQuQkNNODg0NzA9MAorCitzdGFibGVfZmlsZW5hbWUuQkNNODgyNzA9L3RtcC93YXJtYm9vdF9kYXRhCitmYXBfZGV2aWNlX21vZGUuQkNNODgyNzA9UFAKKyNkZWZhdWx0IHBvcnRzIGZvciBRVVgKK3Vjb2RlX3BvcnRfMC5CQ004ODI3MD1DUFUuMDpjb3JlXzAuMAordWNvZGVfcG9ydF8yMDAuQkNNODgyNzA9Q1BVLjg6Y29yZV8wLjEwMAordWNvZGVfcG9ydF8yMDEuQkNNODgyNzA9Q1BVLjE2OmNvcmVfMC4xMDEKK3Vjb2RlX3BvcnRfMjAyLkJDTTg4MjcwPUNQVS4yNDpjb3JlXzAuMTAyCit1Y29kZV9wb3J0XzIwMy5CQ004ODI3MD1DUFUuMzI6Y29yZV8wLjEwMwordWNvZGVfcG9ydF8xLkJDTTg4MjcwPVhFMDpjb3JlXzAuMQordWNvZGVfcG9ydF8yLkJDTTg4MjcwPVhFMTpjb3JlXzAuMgordWNvZGVfcG9ydF8zLkJDTTg4MjcwPVhFMjpjb3JlXzAuMwordWNvZGVfcG9ydF8xMy5CQ004ODI3MD1HRTEyOmNvcmVfMC4xMwordWNvZGVfcG9ydF8xNC5CQ004ODI3MD1HRTEzOmNvcmVfMC4xNAordWNvZGVfcG9ydF8xNS5CQ004ODI3MD1HRTE0OmNvcmVfMC4xNQordWNvZGVfcG9ydF8xNi5CQ004ODI3MD1HRTE1OmNvcmVfMC4xNgordWNvZGVfcG9ydF8xNy5CQ004ODI3MD1HRTE2OmNvcmVfMC4xNworCisKKyNGaXJtd2FyZSBtb2RlOgorIyhEb2N1bWFudGF0aW9uIHJlbGV2YW50IGZvciBCQ004ODZ4eCBhbmQgQkNNODg3eHgpCisjIDA9REVGQVVMVAorIyAxPVNGUF9PUFRfU1I0ICAgICAtIG9wdGljYWwgc2hvcnQgcmFuZ2UKKyMgMj1TRlBfREFDICAgICAgICAgLSBkaXJlY3QgYXR0YWNoIGNvcHBlcgorIyAzPVhMQVVJICAgICAgICAgICAtIDQwRyBYTEFVSSBtb2RlCisjIDQ9Rk9SQ0VfT1NERkUgICAgIC0gZm9yY2Ugb3ZlciBzYW1wbGUgZGlnaXRhbCBmZWVkYmFjayBlcXVhbGl6YXRpb24KKyMgNT1GT1JDRV9CUkRGRSAgICAgLSBmb3JjZSBiYXVkIHJhdGUgZGlnaXRhbCBmZWVkYmFjayBlcXVhbGl6YXRpb24KKyMgNj1TV19DTDcyICAgICAgICAgLSBzb2Z0d2FyZSBjbDcyIHdpdGggQU4gb24KKyMgNz1DTDcyX1dJVEhPVVRfQU4gLSBjbDcyIHdpdGhvdXQgQU4KKyNGb3IgTmVnZXYyIGNoYXNzaXMgZW5hYmxlIERGRSBpcyByZWNvbW1lbmRlZAorc2VyZGVzX2Zpcm13YXJlX21vZGUuQkNNODg2NTA9Mgorc2VyZGVzX2Zpcm13YXJlX21vZGVfaWwuQkNNODg2NTA9NAorc2VyZGVzX2Zpcm13YXJlX21vZGVfc2ZpLkJDTTg4NjUwPTAKK3NlcmRlc19maXJtd2FyZV9tb2RlX3NmaS5CQ004ODY3NT00CitzZXJkZXNfZmlybXdhcmVfbW9kZV9zZmkuQkNNODg0NzA9NAorc2VyZGVzX2Zpcm13YXJlX21vZGVfc2ZpLkJDTTg4MjcwPTQKK3NlcmRlc19maXJtd2FyZV9tb2RlX3NmaS5CQ004ODY4MD00CisKKworI3Vjb2RlX3BvcnRfMS5CQ004ODY1MD0xMEdCYXNlLVIwCisjdWNvZGVfcG9ydF8yLkJDTTg4NjUwPTEwR0Jhc2UtUjEKKyN1Y29kZV9wb3J0XzMuQkNNODg2NTA9MTBHQmFzZS1SMgorI3Vjb2RlX3BvcnRfNC5CQ004ODY1MD0xMEdCYXNlLVIzCisjdWNvZGVfcG9ydF81LkJDTTg4NjUwPTEwR0Jhc2UtUjQKKyN1Y29kZV9wb3J0XzYuQkNNODg2NTA9MTBHQmFzZS1SNQorI3Vjb2RlX3BvcnRfNy5CQ004ODY1MD0xMEdCYXNlLVI2CisjdWNvZGVfcG9ydF84LkJDTTg4NjUwPTEwR0Jhc2UtUjcKKyN1Y29kZV9wb3J0XzkuQkNNODg2NTA9MTBHQmFzZS1SOAorI3Vjb2RlX3BvcnRfMTAuQkNNODg2NTA9MTBHQmFzZS1SOQorI3Vjb2RlX3BvcnRfMTEuQkNNODg2NTA9MTBHQmFzZS1SMTAKKyN1Y29kZV9wb3J0XzEyLkJDTTg4NjUwPTEwR0Jhc2UtUjExCisjdWNvZGVfcG9ydF8xMy5CQ004ODY1MD0xMEdCYXNlLVIxMgorI3Vjb2RlX3BvcnRfMTQuQkNNODg2NTA9MTBHQmFzZS1SMTMKKyN1Y29kZV9wb3J0XzE1LkJDTTg4NjUwPTEwR0Jhc2UtUjE0CisjdWNvZGVfcG9ydF8xNi5CQ004ODY1MD0xMEdCYXNlLVIxNQorI3Vjb2RlX3BvcnRfMTcuQkNNODg2NTA9MTBHQmFzZS1SMTYKKyN1Y29kZV9wb3J0XzE4LkJDTTg4NjUwPTEwR0Jhc2UtUjE3CisjdWNvZGVfcG9ydF8xOS5CQ004ODY1MD0xMEdCYXNlLVIxOAorI3Vjb2RlX3BvcnRfMjAuQkNNODg2NTA9MTBHQmFzZS1SMTkKK3Vjb2RlX3BvcnRfMjAwLkJDTTg4NjUwPUNQVS44Cit1Y29kZV9wb3J0XzIwMS5CQ004ODY1MD1DUFUuMTYKK3Vjb2RlX3BvcnRfMjAyLkJDTTg4NjUwPUNQVS4yNAordWNvZGVfcG9ydF8yMDMuQkNNODg2NTA9Q1BVLjMyCisKKyM0MEcKKyN1Y29kZV9wb3J0XzEuQkNNODg2NTA9WExHRTAKKyN1Y29kZV9wb3J0XzIuQkNNODg2NTA9WExHRTEKKyN1Y29kZV9wb3J0XzMuQkNNODg2NTA9WExHRTIKKyN1Y29kZV9wb3J0XzQuQkNNODg2NTA9WExHRTMKKyN1Y29kZV9wb3J0XzUuQkNNODg2NTA9WExHRTQKKyN1Y29kZV9wb3J0XzYuQkNNODg2NTA9WExHRTUKKyN1Y29kZV9wb3J0XzcuQkNNODg2NTA9WExHRTYKKworI0lMS04gY29uZmlndXJhdGlvbiAtIGJhc2ljIGNvbmZpZworI3Vjb2RlX3BvcnRfMzEuQkNNODg2NTA9SUxLTjAKKyN1Y29kZV9wb3J0XzMyLkJDTTg4NjUwPUlMS04xCisjdWNvZGVfcG9ydF8zMi5CQ004ODY3NT1JTEtOMTpjb3JlXzAuMzIKKyNpbGtuX251bV9sYW5lc18wLkJDTTg4NjUwPTEyCisjaWxrbl9udW1fbGFuZXNfMS5CQ004ODY1MD0xMgorI3BvcnRfaW5pdF9zcGVlZF9pbC5CQ004ODY1MD0xMDMxMgorCisKKyNJTEtOIHBlciBwb3J0IGNoYW5uZWwgc3RhdAorI2lsa25fY291bnRlcnNfbW9kZS5CQ004ODY1MD1QQUNLRVRfUEVSX0NIQU5ORUwKKworI0lMS04gY29uZmlndXJhdGlvbiAtIGFkdmFuY2VkCisjaWxrbl9tZXRhZnJhbWVfc3luY19wZXJpb2Q9MjA0OAorI0lMS04gYnVyc3QgY29uZmlndXJhdGlvbiAtIElMS04gbWF4IGJ1cnN0IHN1cHBvcmVkIHZhbHVlczogMTI4LCAyNTYKKyNJTEtOIGJ1cnN0IHNob3J0IHNob3VsZCBiZSBsZXNzZXIgb3IgZXF1YWwgdG8gYnVyc3QgbWF4IC8yCisjaWxrbl9idXJzdF9tYXguQkNNODg2NzU9MjU2CisjaWxrbl9idXJzdF9taW4uQkNNODg2NzU9MzIKKyMgRW5hYmxlXERpc2FibGUgSUxLTiBzdGF0dXMgbWVzc2FnZSBzZW50IHRocm91Z2ggYW4gb3V0LW9mLWJhbmQgaW50ZXJmYWNlLgorIyBpbGtuX2ludGVyZmFjZV9zdGF0dXNfb29iX2lnbm9yZS5CQ004ODY1MD0xCisKKyMgaWxrbl9pc19idXJzdF9pbnRlcmxlYXZpbmc8aWxrbl9pZD4KKyMgMSAtIFRoZSBjaGFubmVsaXplZCBpbnRlcmZhY2UgZnVuY3Rpb25zIGluIGJ1cnN0IGludGVybGVhdmluZyBtb2RlIChkZWZhdWx0KS4gMCAtIGluIGZ1bGwgcGFja2V0IG1vZGUuCisjaWxrbl9pc19idXJzdF9pbnRlcmxlYXZpbmdfMS5CQ004ODY3NT0wCisKKyMjSUxLTiByZXRyYW5zbWl0CisjaWxrbl9yZXRyYW5zbWl0X2VuYWJsZV9yeC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X2VuYWJsZV90eC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X2J1ZmZlcl9zaXplLkJDTTg4NjUwPTI1MAorI2lsa25fcmV0cmFuc21pdF9udW1fcmVxdWVzdHNfcmVzZW50LkJDTTg4NjUwPTE1CisjaWxrbl9yZXRyYW5zbWl0X251bV9zbl9yZXBldGl0aW9uc190eC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X251bV9zbl9yZXBldGl0aW9uc19yeC5CQ004ODY1MD0xCisjaWxrbl9yZXRyYW5zbWl0X3J4X3RpbWVvdXRfd29yZHMuQkNNODg2NTA9MzgwMAorI2lsa25fcmV0cmFuc21pdF9yeF90aW1lb3V0X3NuLkJDTTg4NjUwPTI1MAorI2lsa25fcmV0cmFuc21pdF9yeF9pZ25vcmUuQkNNODg2NTA9ODAKKyNpbGtuX3JldHJhbnNtaXRfcnhfcmVzZXRfd2hlbl9lcnJvcl9lbmFibGUuQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9yeF93YXRjaGRvZy5CQ004ODY1MD0wCisjaWxrbl9yZXRyYW5zbWl0X3J4X3Jlc2V0X3doZW5fYWxsaWduZWRfZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTEKKyNpbGtuX3JldHJhbnNtaXRfcnhfcmVzZXRfd2hlbl9yZXRyeV9lcnJvcl9lbmFibGUuQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9yeF9yZXNldF93aGVuX3dyYXBfYWZ0ZXJfZGlzY19lcnJvcl9lbmFibGUuQkNNODg2NTA9MQorI2lsa25fcmV0cmFuc21pdF9yeF9yZXNldF93aGVuX3dyYXBfYmVmb3JlX2Rpc2NfZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTAKKyNpbGtuX3JldHJhbnNtaXRfcnhfcmVzZXRfd2hlbl90aW1vdXRfZXJyb3JfZW5hYmxlLkJDTTg4NjUwPTAKKyNpbGtuX3JldHJhbnNtaXRfdHhfd2FpdF9mb3Jfc2VxX251bV9jaGFuZ2VfZW5hYmxlLkJDTTg4NjUwPTEKKyNpbGtuX3JldHJhbnNtaXRfdHhfaWdub3JlX3JlcXVlc3RzX3doZW5fZmlmb19hbG1vc3RfZW1wdHkuQkNNODg2NTA9MQorCisjdWNvZGVfcG9ydF80MC5CQ004ODY1MD1SQ1kuMAorI3Vjb2RlX3BvcnRfNDEuQkNNODg2NTA9UkNZLjEKKyN1Y29kZV9wb3J0XzQyLkJDTTg4NjUwPVJDWS4yCisKKyMjIENBVUkgQ29uZmlndXJhdGlvbgorI3Vjb2RlX3BvcnRfNDEuQkNNODg2NTA9Q0dFMAorI3Vjb2RlX3BvcnRfNDIuQkNNODg2NTA9Q0dFMQorY2F1aV9udW1fbGFuZXNfMC5CQ004ODY1MD0xMAorY2F1aV9udW1fbGFuZXNfMS5CQ004ODY1MD0xMAorI1JlcXVpcmVkIGZvciB3b3JraW5nIElYSUEgMTAwRyBwb3J0OgorbWxkX2xhbmVfc3dhcF9sYW5lMjBfY2UuQkNNODg2NTA9MAorbWxkX2xhbmVfc3dhcF9sYW5lMjFfY2UuQkNNODg2NTA9MQorbWxkX2xhbmVfc3dhcF9sYW5lMF9jZS5CQ004ODY1MD0yMAorbWxkX2xhbmVfc3dhcF9sYW5lMV9jZS5CQ004ODY1MD0yMQorCisjIFRoaXMgY29uZmlndXJlcyB0aGUgbGFuZSBwb2xhcml0eQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxLkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5Mi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTMuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHk0LkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5NS5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTYuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHk3LkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5OC5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTkuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxMC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTExLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTIuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxMy5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTE0LkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTUuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxNi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTE3LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MTguQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkxOS5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTIwLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjEuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyMi5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTIzLkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjQuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyNS5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4X3BoeTI2LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfcGh5MjcuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF9waHkyOC5CQ004ODY1MD0xCisKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTIuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkzLkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5NC5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTUuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHk2LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5Ny5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTguQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHk5LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTAuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxMS5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTEyLkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTMuQkNNODg2NTA9MQorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxNC5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTE1LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTYuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkxNy5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTE4LkJDTTg4NjUwPTAKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MTkuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyMC5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTIxLkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjIuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyMy5CQ004ODY1MD0xCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTI0LkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjUuQkNNODg2NTA9MAorcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF9waHkyNi5CQ004ODY1MD0wCitwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4X3BoeTI3LkJDTTg4NjUwPTEKK3BiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfcGh5MjguQkNNODg2NTA9MQorCit4Z3hzX3R4X2xhbmVfbWFwX3F1YWQwLkJDTTg4NjUwPTB4MTAzMgoreGd4c190eF9sYW5lX21hcF9xdWFkMS5CQ004ODY1MD0weDIzMTAKK3hneHNfdHhfbGFuZV9tYXBfcXVhZDIuQkNNODg2NTA9MHgzMjEwCit4Z3hzX3R4X2xhbmVfbWFwX3F1YWQzLkJDTTg4NjUwPTB4MzIxMAoreGd4c190eF9sYW5lX21hcF9xdWFkNC5CQ004ODY1MD0weDEyMzAKK3hneHNfdHhfbGFuZV9tYXBfcXVhZDUuQkNNODg2NTA9MHgzMjAxCit4Z3hzX3R4X2xhbmVfbWFwX3F1YWQ2LkJDTTg4NjUwPTB4MjEwMworeGd4c190eF9sYW5lX21hcF9xdWFkNy5CQ004ODY1MD0weDAxMjMKKworeGd4c19yeF9sYW5lX21hcF9xdWFkMC5CQ004ODY1MD0weDMwMTIKK3hneHNfcnhfbGFuZV9tYXBfcXVhZDEuQkNNODg2NTA9MHgwMTMyCit4Z3hzX3J4X2xhbmVfbWFwX3F1YWQyLkJDTTg4NjUwPTB4MTIzMAoreGd4c19yeF9sYW5lX21hcF9xdWFkMy5CQ004ODY1MD0weDAxMjMKK3hneHNfcnhfbGFuZV9tYXBfcXVhZDQuQkNNODg2NTA9MHgzMDEyCit4Z3hzX3J4X2xhbmVfbWFwX3F1YWQ1LkJDTTg4NjUwPTB4MjAxMworeGd4c19yeF9sYW5lX21hcF9xdWFkNi5CQ004ODY1MD0weDIxMDMKKworCisjSGlnaCB2b2x0YWdlIGRyaXZlciBzdHJhcC4gSWYgMCwgY29ubmVjdGVkIHRvIDEuNFYgc3VwcGx5OyBpZiAxLCBjb25uZWN0ZWQgdG8gMVYgbW9kZS4KKyNmb3Igc3BlY2lmaWMgcXVhZCB1c2Ugc3JkX3R4X2Rydl9odl9kaXNhYmxlX3F1YWRfWCB3aGVyZSBYIGlzIChGU1JEIG51bSAqIDQgKyBpbnRlcm5hbCBxdWFkKQorc3JkX3R4X2Rydl9odl9kaXNhYmxlLkJDTTg4NjUwPTEKKworI1BvcnQgaW5pdCBtb2RlCisjcG9ydF9pbml0X2R1cGxleD0wCisjcG9ydF9pbml0X2Fkdj0wCisjcG9ydF9pbml0X2F1dG9uZWc9MAorCisKKyMgVGhpcyBkaXNhYmxlcyBzZXJkZXMgaW5pdGlhbGl6YXRpb24KKyMgcGh5X251bGwuQkNNODg2NTA9MQorCisjIyAgTnVtYmVyIG9mIEludGVybmFsIHBvcnRzCisjIEVuYWJsZSB0aGUgRVJQIHBvcnQuIFZhbHVlczogMCAvIDEuCitudW1fZXJwX3RtX3BvcnRzLkJDTTg4NjUwPTEKKyMgRW5hYmxlIHRoZSBPTFAgcG9ydC4gVmFsdWVzOiAwIC8gMS4KK251bV9vbHBfdG1fcG9ydHMuQkNNODg2NTA9MQorCisjIyBGaXJtd2FyZSBMb2FkIE1ldGhvZAorbG9hZF9maXJtd2FyZS5CQ004ODY1MD0weDEwMgorbG9hZF9maXJtd2FyZS5CQ004ODY3NT0weDEwMgorbG9hZF9maXJtd2FyZV9mYWJyaWMuQkNNODg2NzU9MHgxMDIKK2xvYWRfZmlybXdhcmVfZmFicmljLkJDTTg4NjgwPTB4MTAyCisKKyMjIyBIZWFkZXJzIGNvbmZpZ3VyYXRpb24gIyMjCisKKyMjIFVzZSBvZiB0aGUgdG1fcG9ydF9oZWFkZXJfdHlwZV88TG9jYWwtUG9ydC1JZD49PEhlYWRlci10eXBlPgorIyMgRGVmYXVsdCBoZWFkZXIgdHlwZSBpcyBkZXJpdmVkIGZyb20gZmFwX2RldmljZV9tb2RlOiBJZiBmYXBfZGV2aWNlX21vZGUgaXMKKyMjIFBQLCBkZWZhdWx0IGhlYWRlciB0eXBlIGlzIEVUSC4gT3RoZXJ3aXNlLCBkZWZ1YWx0IGhlYWRlciB0eXBlIGlzIFRNLgorIyMgSGVhZGVyIHR5cGUgcGVyIHBvcnQgY2FuIGJlIG92ZXJyaWRlbi4KKyMjIEFsbCBvcHRpb25zOiBFVEgvUkFXL1RNL1BST0cvQ1BVL1NUQUNLSU5HL1RETS9URE1fUkFXL1VESF9FVEgKKyMjIEluamVjdGVkIGhlYWRlciB0eXBlczogaWYgUFRDSCwgSU5KRUNURUQgKGxvY2FsIFBvcnQgb2YgdHlwZSBUTSkgb3IgSU5KRUNURURfUFAgKFBQKQorIyMgICAgICAgICAgICAgICAgICAgICAgICBpZiBQVENILTIsIElOSkVDVEVEXzIgKGxvY2FsIFBvcnQgb2YgdHlwZSBUTSkgb3IgSU5KRUNURURfMl9QUCAoUFApCisKKyMgU2V0IENQVSB0byB3b3JrIHdpdGggVE0gaGVhZGVyIChJVE1IKQorI3RtX3BvcnRfaGVhZGVyX3R5cGVfMC5CQ004ODY1MD1UTQorCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzAuQkNNODg2NTA9SU5KRUNURURfMgordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMC5CQ004ODY1MD1UTQorCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMC5CQ004ODY1MD1JTkpFQ1RFRF8yX1BQCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDAuQkNNODg2NTA9RVRICit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMS5CQ004ODY1MD1JTkpFQ1RFRF8yX1BQCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDEuQkNNODg2NTA9RVRICit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMi5CQ004ODY1MD1JTkpFQ1RFRF8yX1BQCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDIuQkNNODg2NTA9RVRICit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMy5CQ004ODY1MD1JTkpFQ1RFRF8yX1BQCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8yMDMuQkNNODg2NTA9RVRICisKKworIyMjIFBhcnNlciBDb25maWd1cmF0aW9uICMjIworIyBQYXJzZXIgaGFzIDQgY3VzdG9tIG1hY3JvcyB0aGF0IGFyZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgYW5kCisjIGNvbmZpZ3VyZWQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYW5kIHNvYyBwcm9wZXJ0aWVzOgorIyBUcmlsbCAoMSBtYWNybykgLSB0cmlsbF9tb2RlCisjIEZDb0UgKDIgbWFjcm9zKSAtIGJjbTg4Nnh4X2Zjb2Vfc3dpdGNoX21vZGUKKyMgVnhMQU4gKDEgbWFjcm8pIC0gYmNtODg2eHhfdnhsYW5fZW5hYmxlCisjIElQdjYtRXh0ZW5zaW9uLWhlYWRlciAoMiBtYWNyb3MpIC0gYmNtODg2eHhfaXB2Nl9leHRfaGRyX2VuYWJsZQorIyBVRFAgKDEgbWFjcm8pIC0gVURQIHBhcnNpbmcgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBhbmQgY2FuIGJlCisjICBkaXNhYmxlZCB3aXRoIHNvYyBwcm9wZXJ0eSBjdXN0b21fZmVhdHVyZV91ZHBfcGFyc2VfZGlzYWJsZQorIyAgV2hlbiBkaXNhYmxpbmcgVURQIHBhcnNpbmcgVnhMQU4gYW5kIDE1ODhvVURQIGFyZSBhZmZlY3RlZAorCisKKyMgSW4gRkNvRSBOUFYgc3dpdGNoLCBpZiBzZXQgdG8gMSwgCisjIHBhY2tldHMgdGhhdCBpbmdyZXNzIGZyb20gdGhlIE5fUE9SVCBhcmUgdHJlYXRlZCBhcyBicmlkZ2UKKyMgYW5kIHBhY2tldHMgdGhhdCBpbmdyZXNzIGZyb20gdGhlIE5QX1BPUlQgYXJlIHRyZWF0ZWQgYXMgcm91dGVyCisjZmNvZV9ucHZfYnJpZGdlX21vZGU9MQorIyBFbmFibGUgSVB2NiBFeHRlbnNpb24gSGVhZGVyLCAwIC0gZGlzYWJsZSAoZGVmYXVsdCksIDEgLSBlbmFibGUKKyNiY204ODZ4eF9pcHY2X2V4dF9oZHJfZW5hYmxlPTEKKworIyBEaXNhYmxlIFVEUCBwYXJzaW5nLCAwIC0gZW5hYmxlIChkZWZhdWx0KSwgMSAtIGRpc2FibGUKKyNjdXN0b21fZmVhdHVyZV91ZHBfcGFyc2VfZGlzYWJsZT0xCisKKyNPQU1QL1NBVCBwb3J0CisjdG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjMyLkJDTTg4NjUwPUNQVQordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjMyLkJDTTg4Njc1PUNQVQorCisjIyMgU0FUCisjIyBFbmFibGUgU0FUIEludGVyZmFjZS4gMCAtIERpc2FibGUsIDEgLSBFbmFibGUgKERlZmF1bHQpIAorc2F0X2VuYWJsZT0xCisKKyMgU2V0IHRoZSByZWN5Y2xpbmcgcG9ydCBwcm9jZXNzaW5nIHRvIGJlIHJhdyAoc3RhdGljIGZvcndhcmRpbmcpCit0bV9wb3J0X2hlYWRlcl90eXBlX3JjeS5CQ004ODY1MD1SQVcKKworIyMjIFJDUFUKKyMgVmFsaWQgQ1BVIGxvY2FsIHBvcnRzIG9uIHdoaWNoIFJDUFUgcGFja2V0cyBjYW4gYmUgcmVjZWl2ZWQgYnkgc2xhdmUgZGV2aWNlLgorI3JjcHVfcnhfcGJtcD0weGYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorCisjdG1fcG9ydF9oZWFkZXJfdHlwZV81MTQuQkNNODg2NTA9UkFXCisKKyMjIEhlYWRlciBleHRlbnNpb25zCisjIFNldCBpZiBhbiBGVE1IIE91dC1MSUYgZXh0ZW5zaW9uIGlzIHByZXNlbnQgdG8gVW5pY2FzdCBhbmQgTXVsdGljYXN0IHBhY2tldHMKKyMgT3B0aW9uczogTkVWRVIgLyBJRl9NQyAob25seSBNdWx0aWNhc3QgcGFja2V0cykgLyBBTFdBWVMKK2ZhYnJpY19mdG1oX291dGxpZl9leHRlbnNpb24uQkNNODg2NTA9SUZfTUMKKworIyBTZXQgdGhlIEZUTUggTG9hZC1CYWxhbmNpbmcgS2V5IGV4dGVuc2lvbiBtb2RlCisjIE9wdGlvbnMgZm9yIDg4NjYwOiBFTkFCTEVELCBGVUxMX0hBU0gKKyMgT3B0aW9ucyBmb3IgODg2NTA6IEVOQUJMRUQKKyMgT3B0aW9ucyBmb3IgODg2NDAgY29tcGF0aWJsZTogRElTQUJMRUQgLyA4Ql9MQl9LRVlfOEJfU1RBQ0tJTkdfUk9VVEVfSElTVE9SWQorIyAvIDE2Ql9TVEFDS0lOR19ST1VURV9ISVNUT1JZIC8gU1RBTkRCWV9NQ19MQiAoYXZhaWxhYmxlIG9ubHkgZm9yIEFyYWRQbHVzKQorIyBEZWZhdWx0OiBESVNBQkxFRAorc3lzdGVtX2Z0bWhfbG9hZF9iYWxhbmNpbmdfZXh0X21vZGUuQkNNODg2NTA9RElTQUJMRUQKKworIyBTZXQgaWYgYW4gT1RNSCBPdXQtTElGIChDVUQpIEV4dGVuc2lvbiBpcyBwcmVzZW50IHRvIFVuaWNhc3QgYW5kIE11bHRpY2FzdCBwYWNrZXRzCisjIE9wdGlvbnM6IE5FVkVSIC8gSUZfTUMgKG9ubHkgTXVsdGljYXN0IHBhY2tldHMpIC8gQUxXQVlTIC8gRE9VQkxFX1RBRyAodHdvIGhvcCBzY2hlZHVsaW5nKSAvIEVYVEVOREVEOiBFeHRlbmRlZCAyNCBiaXQgQ1VECisjIERlZmF1bHQ6IE5FVkVSCisjIHRtX3BvcnRfb3RtaF9vdXRsaWZfZXh0X21vZGVfMTMuQkNNODg2NTA9TkVWRVIKKworIyBTZXQgaWYgYW4gT1RNSCBTb3VyY2UtU3lzdGVtLVBvcnQgRXh0ZW5zaW9uIGlzIHByZXNlbnQuCisjIE9wdGlvbjogMC8xCisjIERlZmF1bHQ6IDAKKyMgdG1fcG9ydF9vdG1oX3NyY19leHRfZW5hYmxlXzEzLkJDTTg4NjUwPTAKKworI1RydW5rIGhhc2ggZm9ybWF0LCByZWxldmFudCBvbmx5IGZvciBBcmFkUGx1cy4gUG9zc2libGUgdmFsdWVzOiBOT1JNQUwgKGRlZmF1bHQpIC8gSU5WRVJURUQgLyBEVVBMSUNBVEVELgorI3RydW5rX2hhc2hfZm9ybWF0PU5PUk1BTAorCisjIyBTdGFja2luZyBBcHBsaWNhdGlvbgorI3N0YWNraW5nX2VuYWJsZS5CQ004ODY1MD0xCisKKyMjIERldGVybWluZSBpZiBGVE1IIERlc3RpbmF0aW9uIFN5c3RlbSBQb3J0IEV4dGVuc2lvbiBpcyBhZGRlZCB0byBhbGwgRXRoZXJuZXQgcGFja2V0cy4KKyNmdG1oX2RzcF9leHRlbnNpb25fYWRkPTEKKworIyMgRGV0ZXJtaW5lIGlmIEZUTUggRGVzdGluYXRpb24gU3lzdGVtIFBvcnQgRXh0ZW5zaW9uIG9mIG1pcnJvcmVkL3Nub29wZWQgcGFja2V0cyBpcyBzdGFtcGVkIHdpdGggdGhlIG9yaWdpbmFsIGRlc3RpbmF0aW9uLgorI21pcnJvcl9zdGFtcF9zeXNfb25fZHNwX2V4dD0xCisKKyMjIFN5c3RlbSBSRUQKKyMgU2V0IFN5c3RlbS1SZWQgZnVuY3Rpb25hbGl0eS4KKyNzeXN0ZW1fcmVkX2VuYWJsZS5CQ004ODY1MD0xCisKKyMgSW5kaWNhdGUgdGhlIHNpemUgKEJ5dGVzKSBvZiBhIGZpcnN0IGhlYWRlciB0byBza2lwCisjIGJlZm9yZSB0aGUgbWFqb3IgaGVhZGVyIGF0IGluZ3Jlc3MgKGUuZy4gRXRoZXJuZXQsIElUTUgpCisjIEl0IGNhbiBiZSBzZXQgcGVyIHBvcnQgYWxzbworZmlyc3RfaGVhZGVyX3NpemUuQkNNODg2NTA9MAorCisjIEluZGljYXRlIHRoZSBzaXplIChCeXRlcykgb2YgdGhlIFBNRiBFeHRlbnNpb24gSGVhZGVycworIyB0byByZW1vdmUgZm9yIFRNIGhlYWRlciB0eXBlIHBvcnRzIChleHBlY3RpbmcgSVRNSCkKKyMgU2V0IHBlciBwb3J0CisjcG9zdF9oZWFkZXJzX3NpemVfMC5CQ004ODY1MD00CisKKyMgSW5kaWNhdGUgdGhlIHNpemUgKEJ5dGVzKSBvZiB0aGUgVXNlci1IZWFkZXJzOiBjb25maWd1cmFibGUKKyMgaGVhZGVycyBsb2NhdGVkIGluIHRoZSBmYWJyaWMgYmV0d2VlbiBpbnRlcm5hbCBoZWFkZXJzIGFuZAorIyBFdGhlcm5ldC4gVGhlaXIgdmFsdWVzIGFyZSBzZXQgYnkgSW5ncmVzcyBGUCwgYW5kIGNhbiBiZSB1c2VkCisjIGJ5IEVncmVzcyBGUCBvciBFZ3Jlc3MgRWRpdG9yLgorIyB1bml0czogYml0cy4gNCB2YWx1ZXMgY2FuIGJlIHNldDoKKyMgMCAtIHNpemUgb2YgdGhlIDFzdCBVc2VyLUhlYWRlciwgZm9yIHRoZSBFZ3Jlc3MgUE1GLiAwYiAvIDhiIC8gMTZiCisjIDEgLSBzaXplIG9mIHRoZSAybmQgVXNlci1IZWFkZXIsIGZvciB0aGUgRWdyZXNzIFBNRi4gMGIgLyA4YiAvIDE2YgorIyBUaGUgc3VtIG9mIHRoZXNlIDIgdmFsdWVzIHNob3VsZCBiZSB1bmRlciAxNmIKKyMgMiwgMyAtIHNpemUgb2YgdGhlIDFzdC8ybmQgVXNlci1IZWFkZXIsIGZvciB0aGUgRWdyZXNzIEVkaXRvci4KKyMgMGIgLyA4YiAvIDE2YiAvIDI0YiAvIDMyYgorIyBFYWNoIG9mIHRoZSBnbG9iYWwgVXNlci1IZWFkZXIgc2l6ZSBtdXN0IGJlIHVuZGVyIDMyIGJpdHMsIGJ1dCBub3QgMjQgYml0cy4KKyMgVGhlIEVncmVzcyBGUCBmaWVsZCBpcyBhbHdheXMgYXQgdGhlIE1TQiBvZiB0aGUgVXNlci1IZWFkZXIKKyMgTm90IGF2YWlsYWJsZSBmb3IgODg2NTAtQTAuCisjZmllbGRfY2xhc3NfaWRfc2l6ZV8wLkJDTTg4NjUwPTgKKyNmaWVsZF9jbGFzc19pZF9zaXplXzEuQkNNODg2NTA9MAorI2ZpZWxkX2NsYXNzX2lkX3NpemVfMi5CQ004ODY1MD0yNAorI2ZpZWxkX2NsYXNzX2lkX3NpemVfMy5CQ004ODY1MD0wCisKKworIyMjIFRydW5rIC0gTEFHIGNvbmZpZ3VyYXRpb24gIyMjCisjIFNldCB0aGUgbnVtYmVyIG9mIExBR3M6IDEwMjQsIDUxMiwgMjU2LCAxMjggb3IgNjQKK251bWJlcl9vZl90cnVua3MuQkNNODg2NTA9MjU2CisjIFVzaW5nIHRoZSBsYi1rZXkncyBNU0IgaW4gdHJ1bmsgcmVzb2x1dGlvbnMuCisjIDAgPSB1c2UgTFNCIChkZWZhdWx0KQorIyAxID0gdXNlIE1TQgordHJ1bmtfcmVzb2x2ZV91c2VfbGJfa2V5X21zYl9zdGFjayA9IDAKK3RydW5rX3Jlc29sdmVfdXNlX2xiX2tleV9tc2Jfc21vb3RoX2RpdmlzaW9uID0gMAorCisjIyMgU1lOQ0UgY29uZmlndXJhdGlvbiAjIyMKKyMjIFN5bmNocm9ub3VzIEV0aGVybmV0IFNpZ25hbCBNb2RlLgorIyMgT3B0aW9uczogVFdPX0RJRkZfQ0xLLCBUV09fQ0xLX0FORF9WQUxJRC4gRGVmYXVsdDogVFdPX0NMS19BTkRfVkFMSUQKKyNzeW5jX2V0aF9tb2RlLkJDTTg4NjUwPVRXT19DTEtfQU5EX1ZBTElECisKKyMjIENsb2NrIFNvdXJjZSAoc2luZ2xlIFNlckRlcykgbGFuZSBpbiB0aGUgc3BlY2lmaWVkIE5JRiBwb3J0LgorIyMgVXNhZ2U6IHN5bmNfZXRoX2Nsa190b19uaWZfaWRfY2xrXzxjbGtfbnVtYmVyPj08c2VyZGVzX251bWJlcj4KKyNzeW5jX2V0aF9jbGtfdG9fbmlmX2lkX2Nsa18wLkJDTTg4NjUwPTEKKyNzeW5jX2V0aF9jbGtfdG9fbmlmX2lkX2Nsa18xLkJDTTg4NjUwPTEKKworIyMgQ2xvY2sgRGl2aWRlciBmb3IgdGhlIHNlbGVjdGVkIHJlY292ZXJlZCBjbG9jay4gVmFsaWQgdmFsdWVzOiAxLzIvNC4gRGVmYXVsdDogMS4KKyMjIFVzYWdlOiBzeW5jX2V0aF9jbGtfZGl2aWRlcl9jbGtfPGNsa19udW1iZXI+PTwxLzIvND4KKyNzeW5jX2V0aF9jbGtfZGl2aWRlcl9jbGtfMC5CQ004ODY1MD0xCisjc3luY19ldGhfY2xrX2RpdmlkZXJfY2xrXzEuQkNNODg2NTA9MQorCisjIyBVc2FnZTogc3luY19ldGhfY2xrX3RvX3BvcnRfaWRfY2xrXzxjbGtfbnVtYmVyPj08c2VyZGVzX251bWJlcj4KKyNzeW5jX2V0aF9jbGtfdG9fcG9ydF9pZF9jbGtfMC5CQ004ODY3NT0xMworI3N5bmNfZXRoX2Nsa190b19wb3J0X2lkX2Nsa18xLkJDTTg4Njc1PTEzCisKKyMjIENsb2NrIGZyZXF1ZW5jeSBzZWxlY3RvciBmb3IgdGhlIHNlbGVjdGVkIHJlY292ZXJlZCBjbG9jay4gVmFsaWQgdmFsdWVzOiA8MTI1TUh6LTAvMTU2LjI1TUh6LTEvMjVNSHotMj4uIERlZmF1bHQ6IDEuCisjIyBVc2FnZTogc3luY19ldGhfY2xrX2RpdmlkZXJfY2xrPGNsa19pZD49PDAtMTI1TUh6LzEtMTU2LjI1TUh6LzItMjVNSHo+Cisjc3luY19ldGhfY2xrX2RpdmlkZXJfY2xrMC5CQ004ODY3NT0xCisjc3luY19ldGhfY2xrX2RpdmlkZXJfY2xrMS5CQ004ODY3NT0xCisKKyMjIEVuYWJsZSB0aGUgYXV0b21hdGljIHNxdWVsY2ggZnVuY3Rpb24gZm9yIHRoZSByZWNvdmVyZWQgY2xvY2suIFZhbGlkIHZhbHVlczogMC8xLiBEZWZhdWx0OiAwLgorIyMgVXNhZ2U6IHN5bmNfZXRoX2Nsa19zcXVlbGNoX2VuYWJsZV9jbGtfPGNsa19udW1iZXI+PTwwLzE+Cisjc3luY19ldGhfY2xrX3NxdWVsY2hfZW5hYmxlX2Nsa18wLkJDTTg4NjUwPTAKKyNzeW5jX2V0aF9jbGtfc3F1ZWxjaF9lbmFibGVfY2xrXzEuQkNNODg2NTA9MAorCisjIyMgRUxLIGNvbmZpZ3VyYXRpb24gIyMjCisjIyBFeHRlcm5hbCBsb29rdXAgKFRDQU0pIERldmljZSB0eXBlIHNlbGVjdCwgSW5kaWNhdGUgdGhlIEV4dGVybmFsIGxvb2t1cCBEZXZpY2UgdHlwZS4KKyMgVmFsdWUgT3B0aW9uczogTk9ORS9OTDg4NjUwLiBEZWZhdWx0OiBOT05FLgorI2V4dF90Y2FtX2Rldl90eXBlPU5MODg2NTAKKworCisjI0V4dGVybmFsIGxvb2t1cCAoZWxrKSBJTEtOIGxhbmVzIHN3YXAuIElmIHNldCwgcmV2ZXJzZSB0aGUgbGFuZXMgbnVtYmVyaW5nIG9yZGVyIG9uIGVsayBkZXZpY2Ugc2lkZS4gRE5YIHN5c3RlbSBkZWZhdWx0IGlzIDEuCisjZXh0X2lsa25fcmV2ZXJzZT0wCisKKyMjIFNldCBFTEsgRldEIHRhYmxlIFNpemUuCisjIGZvcm1hdDogZXh0X3h4eF9md2RfdGFibGVfc2l6ZS4KKyMgd2hlcmUgeHh4IHJlcGxhY2VkIGJ5IEZXRCBvcHRpb25zOiBpcDRfdWNfcnBmL2lwNF9tYy9pcDZfdWNfcnBmL2lwNi9pcDZfbWMvdHJpbGxfdWMvdHJpbGxfbWMvbXBscy9jb3VwX21wbHMKKyMgVmFsdWUgT3B0aW9uczogKDApIC0gRXh0ZXJuYWwgdGFibGUgZGlzYWJsZWQsID4wOiBudW1iZXIgb2YgZW50cmllcy4gRGVmYXVsdDogMC4KKyNleHRfaXA0X3VjX3JwZl9md2RfdGFibGVfc2l6ZT04MTkyCisjZXh0X2lwNF9tY19md2RfdGFibGVfc2l6ZT04MTkyCisKKyNFeHRlcm5hbCBUQ0FNIHJlc3VsdCBzaXplLCBhbGxvd3MgdG8gbW9kaWZ5IGVhY2ggZXh0ZXJuYWwgdGNhbSByZXN1bHQgc2l6ZS4gCisjVGhlIHRvdGFsIHNpemUgb2YgdGhlIGV4dGVybmFsIHJlc3VsdCBmb3IgTkwxMksgPSAxMjBiaXQgLgorI1RoZSBzaXplIG9mIGVhY2ggc2VnbWVudCB1cGRhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHF1YWxpZmllciBiY21GaWVsZFF1YWxpZnlFeHRlcm5hbFZhbHVlLiAKKyNEZWZhdWx0IHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIGRldmljZSBwcm9wZXJ0eS4KKyNpbi1jYXNlIG9mIGRvdWJsZSBjYXBhY2l0eSB1c2UgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IDQ4LDQ4LDI0LDI0IGFuZCBleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50X3BhZF8zPTI0CisKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzA9NDgKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzE9MzIKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzI9MjQKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzM9MTYKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzQ9MzIKKyNleHRfdGNhbV9yZXN1bHRfc2l6ZV9zZWdtZW50XzU9MzIKKworIyMgU2V0IEVMSyBJUCBGV0QgdXNlIE5ldFJvdXRlICBBTEcuCisjIFZhbHVlIE9wdGlvbnM6IEFMR19MUE1fTFBNL0FMR19MUE1fTkVUUk9VVEUvQUxHX0xQTV9UQ0FNLiBEZWZhdWx0OiBBTEdfTFBNX1RDQU0uCisjZXh0X2Z3ZF9hbGdvcml0aG1fbHBtPUFMR19MUE1fVENBTQorCisjIyBTZXQgRUxLIGludGVyZmFjZSBtb2RlLgorIyBDaGFuZ2UgRUxLIGludGVyZmFjZSBjb25maWd1cmF0aW9uIHRvIHN1cHBvcnQgQ0FVSSBwb3J0LgorIyBWYWx1ZSBPcHRpb25zOiAwLzEuIDAgLSBOb3JtYWwgbW9kZSwgMSAgMiBDQVVJIHBvcnQgKyBFTEsgbW9kZS4gRGVmYXVsdDogMC4KKyNleHRfaW50ZXJmYWNlX21vZGU9MAorCisjIyMgQ29uZmlndXJlIE1ESU8gaW50ZXJmYWNlCisjIEV4dGVybmFsIE1ESU8gY2xvY2sgcmF0ZSBkaXZpc29yIC4gRGVmYXVsdDogMHgyNC4KKyNyYXRlX2V4dF9tZGlvX2Rpdmlzb3I9MHgzNgorIyBFeHRlcm5hbCBNRElPIGNsb2NrIHJhdGUgZGl2aXNvci4gRGVmYXVsdDogMHgxLgorI3JhdGVfZXh0X21kaW9fZGl2aWRlbmQ9MQorCisjIyMgVERNIC0gT1ROIGNvbmZpZ3VyYXRpb24gIyMjCisjIE9wdGlvbnM6IDAgLyBURE1fT1BUSU1JWkVEIC8gVERNX1NUQU5EQVJECitmYXBfdGRtX2J5cGFzcy5CQ004ODY1MD0wCisKKyMjIyBURE0gLSBSQVcvUEFDS0VUIGNvbmZpZ3VyYXRpb24gIyMjCisjIGlmIGZhcF90ZG1fcGFja2V0IGNvbmZpZyB0byBiZSB0cnVlLCBlbmFibGUgc3BlY2lmaWMgcG9ydHMgb24gdGhlIGRldmljZSB0byBjb25maWd1cmUgZm9yIHRkbSBwYWNrZXQgbW9kZSB0cmFmZmljLgorZmFwX3RkbV9wYWNrZXQuQkNNODg2NTA9MAorCisjIEluZGljYXRlIGlmIGEgUGV0cmEtQiBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHRoZSBhY3R1YWwgZGV2aWNlCisjIEZvciBURE0vT1ROIGFwcGxpY2F0aW9ucywKKyMgc3lzdGVtX2lzX3BldHJhX2JfaW5fc3lzdGVtLkJDTTg4NjUwPTAKKyMjSW5kaWNhdGUgaWYgVERNIGNhbiBhcnJpdmUgdGhyb2doIHByaW1hcnkgcGlwZS4KKyNTaG91bGQgYmUgMSBmb3IgYSBTeXN0ZW0gd2l0aCBQZXRyYUIgdGhhdCBjb25uZWN0ZWQgdG8gZmFicmljIG92ZXIgcHJpbWFyeSBwaXBlLgorZmFicmljX3RkbV9vdmVyX3ByaW1hcnlfcGlwZS5CQ004ODY1MD0wCisKKyMjIyBGYWJyaWMgY29uZmlndXJhdGlvbiAjIyMKKyMwLUxGRUMgMS04YlwxMGIgMi1GRUMgMy1CRUMKK2JhY2twbGFuZV9zZXJkZXNfZW5jb2RpbmcuQkNNODg2NTA9MgorI1Bvc3NpYmxlIHZhbHVlcyAtIEtSX0ZFQywgNjRfNjYsIFJTX0ZFQywgTExfUlNfRkVDCitiYWNrcGxhbmVfc2VyZGVzX2VuY29kaW5nLkJDTTg4Njc1PVJTX0ZFQworYmFja3BsYW5lX3NlcmRlc19lbmNvZGluZy5CQ004ODQ3MD1SU19GRUMKK2JhY2twbGFuZV9zZXJkZXNfZW5jb2RpbmcuQkNNODgyNzA9UlNfRkVDCitiYWNrcGxhbmVfc2VyZGVzX2VuY29kaW5nLkJDTTg4NjgwPVJTX0ZFQworCisjU0ZJIHNwZWVkIHJhdGUKK3BvcnRfaW5pdF9zcGVlZF9zZmkuQkNNODg2NTA9MTAzMTIKK3BvcnRfaW5pdF9zcGVlZF9zZmkuQkNNODg2NzU9MjUwMDAKK3BvcnRfaW5pdF9zcGVlZF9zZmkuQkNNODg0NzA9MjUwMDAKK3BvcnRfaW5pdF9zcGVlZF9zZmkuQkNNODgyNzA9MjUwMDAKK3BvcnRfaW5pdF9zcGVlZF9zZmkuQkNNODg2ODA9MjUwMDAKKworI0NMNzIKK3BvcnRfaW5pdF9jbDcyX3NmaS5CQ004ODY1MD0xCitwb3J0X2luaXRfY2w3Ml9zZmkuQkNNODg2NzU9MQorZmFicmljX3NlZ21lbnRhdGlvbl9lbmFibGUuQkNNODg2NTA9MQorCisjIyBGYWJyaWMgdHJhbnNtaXNzaW9uIG1vZGUKKyMgU2V0IHRoZSBDb25uZWN0IG1vZGUgdG8gdGhlIEZhYnJpYworIyBPcHRpb25zOiBGRSAtIHByZXNlbmNlIG9mIGEgRmFicmljIGRldmljZSAoc2luZ2xlIHN0YWdlKSAvIE1VTFRfU1RBR0VfRkUgLSAgTXVsdGktc3RhZ2UgLworIyBTSU5HTEVfRkFQIC0gc3RhbmQtYWxvbmUgZGV2aWNlIC8gTUVTSCAtIG1lc2ggLyBCQUNLMkJBQ0sgLSAyIGRldmljZXMgaW4gTWVzaAorI2ZhYnJpY19jb25uZWN0X21vZGUuQkNNODg2NTA9U0lOR0xFX0ZBUAorZmFicmljX2Nvbm5lY3RfbW9kZS5CQ004ODY1MD1GRQorIyBUaGUgSmVyaWNobyBjb25maWd1cmF0aW9uIGJlbG93IHdpbGwgYmUgb3ZlcnJpZGVuIGluIGplci5zb2MgZm9yIG11bHRpIGRldmljZSBjb25maWd1cmF0aW9ucworZmFicmljX2Nvbm5lY3RfbW9kZS5CQ004ODY3NT1TSU5HTEVfRkFQCitmYWJyaWNfY29ubmVjdF9tb2RlLkJDTTg4NDcwPVNJTkdMRV9GQVAKK2ZhYnJpY19jb25uZWN0X21vZGUuQkNNODgyNzA9U0lOR0xFX0ZBUAorZmFicmljX2Nvbm5lY3RfbW9kZS5CQ004ODY4MD1TSU5HTEVfRkFQCisKKworIyMgQ2VsbCBmb3JtYXQgY29uZmlndXJhdGlvbgorIyBJbmRpY2F0ZSBpZiB0aGUgdHJhZmZpYyBjYW4gYmUgc2VudCBpbiBkdWFsIHBpcGUKK2lzX2R1YWxfbW9kZS5CQ004ODY1MD0wCisjIEluZGljYXRlIG9uIHRoZSBleGlzdGFuY2Ugb2YgZHVhbCBwaXBlIGRldmljZSBtb2RlIGluIHN5c3RlbQorc3lzdGVtX2lzX2R1YWxfbW9kZV9pbl9zeXN0ZW0uQkNNODg2NTA9MAorCisjIEluZGljYXRlIHRoZSBmb3JtYXQgb2YgdGhlIGNlbGw6CisjIEEgVkNTMTI4IGNlbGwgaXMgdXNlZCBpZiBzeXN0ZW1faXNfdmNzXzEyOF9pbl9zeXN0ZW0gb3Igc3lzdGVtX2lzX2ZlNjAwX2luX3N5c3RlbSBpcyBUUlVFCitzeXN0ZW1faXNfdmNzXzEyOF9pbl9zeXN0ZW0uQkNNODg2NTA9MAorc3lzdGVtX2lzX2ZlNjAwX2luX3N5c3RlbS5CQ004ODY1MD0wCisKKyMjIyBXUkVEICMjIworCisjIFNldCB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgV1JFRCB0ZXN0cy4gMCAtIG1lYW5zIGlnbm9yZSBtYXggcGFja2V0IHNpemUuCitkaXNjYXJkX210dV9zaXplLkJDTTg4NjUwPTAKKworIyMjIE9DQiAoT24tQ2hpcCBCdWZmZXIpIGNvbmZpZ3VyYXRpb24gIyMjCisjIEVuYWJsZSB0aGUgT0NCCisjIEVuYWJsZSBNT0RFUzoKKyMgICAwL0ZBTFNFICAgICAgICAtLT4gIE9DQl9ESVNBQkxFRCAgICAgLS0+IE5vIE9DQiB1c2UKKyMgICAxL1RSVUUgICAgICAgICAtLT4gIE9DQl9FTkFCTEVEICAgICAgLS0+IExpa2UgaW4gQXJhZC1BMC9CMC4gU29tZSBwYWNrZXRzIG1heSB1c2UgYm90aCBEUkFNIGFuZCBPQ0IgcmVzb3VyY2VzCisjICAgT05FX1dBWV9CWVBBU1MgLS0+ICBEZXBlbmRzIG9uIG51bWJlciBvZiBwcmVzZW50IGRyYW1zIChhdmFpbGFibGUgb25seSBmb3IgQXJhZFBsdXMpOgorIyAgICAgICAgICAgICAgICAgICAgICAwIGRyYW1zOiAgIC0gT0NCX09OTFkKKyMgICAgICAgICAgICAgICAgICAgICAgMSBkcmFtczogICAtIE9DQl9PTkxZXzFfRFJBTSAgICAgLS0+ICA6IE9DQi1vbmx5IHdpdGggMSBEUkFNIGZvciB0aGUgZnJlZSBwb2ludGVycworIyAgICAgICAgICAgICAgICAgICAgICAyLTggZHJhbXM6IC0gT0NCX0RSQU1fU0VQQVJBVEUgICAtLT4gIDogT0NCIGFuZCBEUkFNIGNvZXhpc3Qgc2VwYXJhdGVseQorIyAgIERlZmF1bHQ6IFRSVUUuCitiY204ODZ4eF9vY2JfZW5hYmxlLkJDTTg4NjUwPTEKKworIyMgT0NCIChPbi1DaGlwIEJ1ZmZlcikgY29uZmlndXJhdGlvbgorIyBPQ0IgbW9kZXM6CisjICAgMCAtIERpc2FibGVkCisjICAgMSAtIEVuYWJsZWQgKERlZmF1bHQpLgorYmNtODg2eHhfb2NiX2VuYWJsZS5CQ004ODY3NT0xCisKKyMgT0NCIERhdGEgQnVmZmVyIHNpemUuIFBvc3NpYmxlIHZhbHVlczogMTI4LzI1Ni81MTIvMTAyNC4gRGVmYXVsdDogMjU2LgorYmNtODg2eHhfb2NiX2RhdGFidWZmZXJfc2l6ZS5CQ004ODY1MD0yNTYKKyMgT0NCIERhdGEgQnVmZmVyIHNpemUuIEplcmljaG8gYWxsb3dlZCB2YWx1ZXM6IDI1Ni81MTIuIERlZmF1bHQ6IDI1Ni4KK2JjbTg4Nnh4X29jYl9kYXRhYnVmZmVyX3NpemUuQkNNODg2NzU9MjU2CisjIFJlcGFydGl0aW9uIGJldHdlZW4gVW5pY2FzdCBhbmQgRnVsbCBNdWx0aWNhc3QgYnVmZmVycy4KKyMgMDogODAlIFVuaWNhc3QgYW5kIDIwJSBNdWx0aWNhc3QsIDE6IFVuaWNhc3QtT25seQorYmNtODg2eHhfb2NiX3JlcGFydGl0aW9uLkJDTTg4NjUwPTAKKworCisjIyMgUERNIGNvbmZpZ3VyYXRpb24gIyMjCisjIFNldCB0aGUgUERNIE1vZGUuCisjIDA6IHNpbXBsZSAoZGVmYXVsdCksIDE6IGV4dGVuZGVkIChtYW5kYXRvcnkgZm9yIExMRkMtVlNRLCBQRkMtVlNRLCBvciBTVC1WU1EpCitiY204ODZ4eF9wZG1fbW9kZS5CQ004ODY1MD0wCisKKyMjIyBNdWx0aWNhc3QgTnVtYmVyIG9mIERCdWZmIG1vZGUgIyMjCisjIFNldCBJUU0gRk1DIGJ1ZmZlcnMtcmVwbGljYXRpb24gc2l6ZXMKKyMgT3B0aW9ucyBmb3IgODg2NTA6IEFSQURfSU5JVF9GTUNfNEtfUkVQXzY0S19EQlVGRl9NT0RFL0FSQURfSU5JVF9GTUNfNjRfUkVQXzEyOEtfREJVRkZfTU9ERQorIyBEZWZhdWx0OiBBUkFEX0lOSVRfRk1DXzRLX1JFUF82NEtfREJVRkZfTU9ERQorbXVsdGljYXN0X25icl9mdWxsX2RidWZmLkJDTTg4NjUwPUFSQURfSU5JVF9GTUNfNEtfUkVQXzY0S19EQlVGRl9NT0RFCisKKyMjIyBNdWx0aWNhc3QgTnVtYmVyIG9mIERCdWZmIG1vZGUgIyMjCisjIFNldCBGTUMgYnVmZmVycy1yZXBsaWNhdGlvbiBzaXplcworIyBPcHRpb25zIGZvciA4ODY3NToKKyMgICAgSkVSSUNIT19JTklUX0ZNQ182NF9SRVBfNTEyS19EQlVGRl9NT0RFCisjICAgIEpFUklDSE9fSU5JVF9GTUNfNEtfUkVQXzI1NktfREJVRkZfTU9ERSAoRGVmYXVsdCkKKyMgICAgSkVSSUNIT19JTklUX0ZNQ19OT19SRVBfREJVRkZfTU9ERQorbXVsdGljYXN0X25icl9mdWxsX2RidWZmLkJDTTg4Njc1PUpFUklDSE9fSU5JVF9GTUNfNEtfUkVQXzI1NktfREJVRkZfTU9ERQorbXVsdGljYXN0X25icl9mdWxsX2RidWZmLkJDTTg4NDcwPUpFUklDSE9fSU5JVF9GTUNfTk9fUkVQX0RCVUZGX01PREUKK211bHRpY2FzdF9uYnJfZnVsbF9kYnVmZi5CQ004ODI3MD1KRVJJQ0hPX0lOSVRfRk1DX05PX1JFUF9EQlVGRl9NT0RFCittdWx0aWNhc3RfbmJyX2Z1bGxfZGJ1ZmYuQkNNODg2ODA9SkVSSUNIT19JTklUX0ZNQ180S19SRVBfMjU2S19EQlVGRl9NT0RFCisKKworIyMjIE11bHRpY2FzdCBjb25maWd1cmF0aW9uICMjIworIyBNdWx0aWNhc3QgZWdyZXNzIHZsYW4gbWVtYmVyc2hpcCByYW5nZS4gQnkgZGVmYXVsdDogMC00MDk1LgorZWdyZXNzX211bHRpY2FzdF9kaXJlY3RfYml0bWFwX21heC5CQ004ODY1MD00MDk1CisKKyMjIyMgSmVyaWNobyBjb25maWd1cmF0aW9uIG9mIHRoZSBudW1iZXIgb2YgaW5ncmVzcy9lZ3Jlc3MgbXVsdGljYXN0IGdyb3VwcworIyBJbmdyZXNzIG1heCBNQ0lEIGNhbiBiZSB1cCB0byAxMzEwNzAsIEVncmVzcyBtYXggTUNJRCBpbiBNZXNoIG9yIHNpbmdsZSBGQVAgbW9kZXMgaXMgdXAgdG8gNjU1MzUsCisjIG9yIG90aGVyd2lzZSBpcyB1cCB0byAxMzEwNzEuCisjbXVsdGljYXN0X2luZ3Jlc3NfZ3JvdXBfaWRfcmFuZ2VfbWF4LkJDTTg4Njc1PTMyNzY4CisjbXVsdGljYXN0X2VncmVzc19ncm91cF9pZF9yYW5nZV9tYXguQkNNODg2NzU9NjAwMDAKKworIyMjIFZPUSAtIEZsb3cgY29uZmlndXJhdGlvbiAjIyMKKworIyBTZXQgdGhlIFZPUSBtYXBwaW5nIG1vZGU6CisjIERJUkVDVDogTW9yZSB0aGFuIDRLIFN5c3RlbSBQb3J0cyBhcmUgc3VwcG9ydGVkLiBTeXN0ZW0tbGV2ZWwgV1JFRCBpcyBub3Qgc3VwcG9ydGVkLgorIyBJTkRJUkVDVDogc2ltaWxhciB0byBQZXRyYS1CLiBVcCB0byA0SyBTeXN0ZW0gUG9ydHMuCit2b3FfbWFwcGluZ19tb2RlLkJDTTg4NjUwPUlORElSRUNUCisKKyNFbmFibGUvZGlzYWJsZSBIUU9TIHN1cHBvcnQgLSBtYXBwaW5nIG9mIG1hbnkgc3lzdGVtIHBvcnRzIHRvIHNpbmdsZSBtb2Rwb3J0CitocW9zX21hcHBpbmdfZW5hYmxlLkJDTTg4NjUwPTAKKworIyBTZXQgdGhlIEJhc2UgUXVldWUgdG8gYmUgYWRkZWQgdG8gdGhlIHBhY2tldCBmbG93LWlkCisjIHdoZW4gdGhlIEZsb3ctSWQgaXMgc2V0IGV4cGxpY2l0ZWx5IGVpdGhlciBieSB0aGUgSVRNSAorIyBvciBieSB0aGUgRGVzdGluYXRpb24gcmVzb2x1dGlvbiBpbiB0aGUgUGFja2V0IHByb2Nlc3NpbmcKK2Zsb3dfbWFwcGluZ19xdWV1ZV9iYXNlLkJDTTg4NjUwPTAKKworCisjIFRoZSBhbGxvY2F0aW9uIG9mIHRoZSB0b3RhbCBwZXIgY29yZSByZXNvdXJjZXMgYmV0d2VlbiBzb3VyY2UgYW5kCisjIHF1ZXVlIGJhc2VkIHJlc2VydmF0aW9uIGRlcGVuZHMgb24gb25lIG9mIHR3byBndWFyYW50ZWUgbW9kZXM6IHN0cmljdCBhbmQgbG9vc2UuCisjaW5ncmVzc19jb25nZXN0aW9uX21hbmFnZW1lbnRfZ3VhcmFudGVlX21vZGU9e1NUUklDVCxMT09TRX0gZGVmYXVsdDogU1RSSUNUCitpbmdyZXNzX2Nvbmdlc3Rpb25fbWFuYWdlbWVudF9ndWFyYW50ZWVfbW9kZT1MT09TRQorIyBFYWNoIERQIGhhcyBpdHMgb3duIHRocmVzaG9sZHMgZm9yIHNvdXJjZSBiYXNlZCAoZHluYW1pYykgYW5kIGZvciBxdWV1ZSBiYXNlZCAocG9vbHMgMCwxIGFuZCBoZWFkcm9vbSkuCisjICBpbmdyZXNzX2Nvbmdlc3Rpb25fbWFuYWdlbWVudF97c291cmNlLHF1ZXVlLGFsbH1fdGhyZXNob2xkX3BlcmNlbnRhZ2VfY29sb3JfWzAtM109WzAtMTAwXSBkZWZhdWx0OiAxMDAsODUsNzUsMAorIyAgaW5ncmVzc19jb25nZXN0aW9uX21hbmFnZW1lbnRfe29jYl9vbmx5LGRyYW1fbWl4fV97cG9vbF97MCwxfSxoZWFkcm9vbX09c2l6ZSBkZWZhdWx0OiAwCisjICBpbmdyZXNzX2Nvbmdlc3Rpb25fbWFuYWdlbWVudF9taW5fcmVzb3VyY2VfcGVyY2VudGFnZV9keW5hbWljPVswLTgwXSBkZWZhdWx0OiAyMAorCisjIENvbmZpZ3VyZSBtYXhpbXVtIElEcyBvZiBTVC1WU1FzLCBtYXhpbXVtIElEcyBvZiBUTS1wb3J0cywgYW5kIGVuYWJsaW5nL2Rpc2FibGluZyBoZWFkZXIgY29tcGVuc2F0aW9uLiAKK2luZ3Jlc3NfY29uZ2VzdGlvbl9tYW5hZ2VtZW50X3N0YWdfbWF4X2lkLkJDTTg4Njc1PTAKK2luZ3Jlc3NfY29uZ2VzdGlvbl9tYW5hZ2VtZW50X3RtX3BvcnRfbWF4X2lkLkJDTTg4Njc1PTI1NQoraW5ncmVzc19jb25nZXN0aW9uX21hbmFnZW1lbnRfcGt0X2hlYWRlcl9jb21wZW5zYXRpb25fZW5hYmxlLkJDTTg4Njc1PTAKKworIyBUaGUgbnVtYmVyIG9mIHBhY2tldCBidWZmZXJzIHVzZWQgZm9yIHRoZSBhbGxvY2F0aW9uIG9mIERNQSBtZW1vcnkgYXQgQkNNIFJYIHRhc2sKKyMgVGhlIHBvb2wgc2l6ZSBkZXRlcm1pbmVkIGJ5IG5vZl9wa3RzICgyNTYpICogMTZLLgorI3J4X3Bvb2xfbm9mX3BrdHMuQkNNODg2NzU9MjU2CisKKworIyBTZXQgdGhlIG51bWJlciBvZiBwcmlvcml0aWVzIHN1cHBvcnRlZCBhdCBlZ3Jlc3MgcGVyIFBvcnQKKyMgT3B0aW9uczogMSAvIDIgLyA4Citwb3J0X3ByaW9yaXRpZXMuQkNNODg2NTA9OAorcG9ydF9wcmlvcml0aWVzLkJDTTg4Njc1PTIKK3BvcnRfcHJpb3JpdGllcy5CQ004ODQ3MD0yCitwb3J0X3ByaW9yaXRpZXMuQkNNODgyNzA9MgorcG9ydF9wcmlvcml0aWVzLkJDTTg4NjgwPTIKKworCisjIFNldCB0aGUgc2hhcmVkIG11bHRpY2FzdCByZXNvdXJjZSBtb2RlOiBTdHJpY3QgLyBEaXNjcmV0ZQorZWdyZXNzX3NoYXJlZF9yZXNvdXJjZXNfbW9kZS5CQ004ODY1MD1TdHJpY3QKKworIyBEZWZpbmUgb3V0Z29pbmcgcG9ydCByYXRlIG1vZGUgaW4gZGF0YSByYXRlIG9yIHBhY2tldCByYXRlLgorIyBPcHRpb25zOiBEQVRBIC8gUEFDS0VUCitvdG1fcG9ydF9wYWNrZXRfcmF0ZS5CQ004ODY1MD1EQVRBCisKKyMgU2V0IFBvcnQgZWdyZXNzIHJlY3ljbGluZyBzY2hlZHVsZXIgY29uZmlndXJhdGlvbi4KKyMgMDogU3RyaWN0IFByaW9yaXR5IFNjaGVkdWxlciwgMTogUm91bmQgUm9iaW4gU2NoZWR1bGVyCitwb3J0X2VncmVzc19yZWN5Y2xpbmdfc2NoZWR1bGVyX2NvbmZpZ3VyYXRpb24uQkNNODg2NTA9MAorCisjIFNldCBzdGF0aWNhbGx5IHRoZSByZWdpb24gbW9kZSBwZXIgcmVnaW9uIGlkCisjIDA6IHF1ZXVlIGNvbm5lY3RvcnMgb25seSAoSW50ZXJEaWdpdGF0ZWQgPSBGQUxTRSwgT2RkRXZlbiA9IFRSVUUpCisjIDE6IHF1ZXVlIGNvbm5lY3RvcnMsIFNFIChJbnRlckRpZ2l0YXRlZCA9VFJVRSwgT2RkRXZlbiA9IFRSVUUpCisjIDI6IHF1ZXVlIGNvbm5lY3RvcnMsIFNFIChJbnRlckRpZ2l0YXRlZCA9VFJVRSwgT2RkRXZlbiA9IEZBTFNFKQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl82NS5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzY2LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNjcuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl82OC5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzY5LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzAuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83MS5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzcyLkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzMuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83NC5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzc1LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzYuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl83Ny5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzc4LkJDTTg4NjUwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNzkuQkNNODg2NTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84MC5CQ004ODY1MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzgxLkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODIuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84My5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzg0LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODUuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84Ni5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzg3LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fODguQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl84OS5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzkwLkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTEuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85Mi5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzkzLkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTQuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85NS5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzk2LkJDTTg4NjUwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fOTcuQkNNODg2NTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl85OC5CQ004ODY1MD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzk5LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTAwLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTAxLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTAyLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTAzLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA0LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA1LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA2LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA3LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA4LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTA5LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTEwLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTExLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTEyLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTEzLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE0LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE1LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE2LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE3LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE4LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTE5LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTIwLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTIxLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTIyLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTIzLkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTI0LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTI1LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTI2LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTI3LkJDTTg4NjUwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTI4LkJDTTg4NjUwPTIKKworIyMgQ29uZmlndXJlIG51bWJlciBvZiBzeW1tZXRyaWMgY29yZXMgZWFjaCByZWdpb24gc3VwcG9ydHMgIyMKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEuQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMi5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQuQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNS5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl82LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzcuQkNNODg2NTA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fOC5CQ004ODY1MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl85LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzExLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQ5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUwLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUxLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUyLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUzLkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU0LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU1LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU2LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU3LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU4LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzU5LkJDTTg4NjUwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzYwLkJDTTg4NjUwPTIKKyNkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl9jb3JlMF8yLkJDTTg4Njc1PTIKKworCisjIENvbmZpZ3VyZSBudW1iZXIgb2Ygc3ltbWV0cmljIGNvcmVzIGVhY2ggcmVnaW9uIHN1cHBvcnRzICMjCisjZGV2aWNlX2NvcmVfbW9kZS5CQ004ODQ3MD1TSU5HTEVfQ09SRQorIyBJTCByZWdpb24gaGFzIG9mZnNldCBvZiA2MywgaS5lLiByZWdpb25fMSBoZXJlIHdpbGwgc2hvdyBhcyByZWdpb24gNjQgaW4gY29kZQorIyMgQ29uZmlndXJlIG51bWJlciBvZiBzeW1tZXRyaWMgY29yZXMgZWFjaCByZWdpb24gc3VwcG9ydHMgIyMKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEuQkNNODg0NzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMi5CQ004ODQ3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8zLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNS5CQ004ODQ3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl82LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzcuQkNNODg0NzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fOC5CQ004ODQ3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl85LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEwLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzExLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEyLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEzLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE0LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE1LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE2LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE3LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE4LkJDTTg4NDcwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzE5LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIwLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIxLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIyLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIzLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI0LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI1LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI2LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI3LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI4LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzI5LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMwLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMxLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMyLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMzLkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM0LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM1LkJDTTg4NDcwPTEKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzM2LkJDTTg4NDcwPTEKKworZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzcuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzguQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzkuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNDAuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNDEuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNDIuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNDMuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNDQuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNDUuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNDYuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNDcuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNDguQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNDkuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNTAuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNTEuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNTIuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNTMuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNTQuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNTUuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNTYuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNTcuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNTguQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNTkuQkNNODg0NzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNjAuQkNNODg0NzA9MQorCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzMzLkJDTTg4NDcwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzQuQkNNODg0NzA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zNS5CQ004ODQ3MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM2LkJDTTg4NDcwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzcuQkNNODg0NzA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zOC5CQ004ODQ3MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM5LkJDTTg4NDcwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDAuQkNNODg0NzA9MAorCisjIyBDb25maWd1cmUgbnVtYmVyIG9mIHN5bW1ldHJpYyBjb3JlcyBlYWNoIHJlZ2lvbiBzdXBwb3J0cyAjIworZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMS5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl8yLkJDTTg4MjcwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNC5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl81LkJDTTg4MjcwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzYuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fNy5CQ004ODI3MD0yCitkdG1fZmxvd19ub2ZfcmVtb3RlX2NvcmVzX3JlZ2lvbl84LkJDTTg4MjcwPTIKK2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzkuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTAuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTEuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTIuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTMuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTQuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTUuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTYuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTcuQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTguQkNNODgyNzA9MgorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMTkuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjAuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjEuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjIuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjMuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjQuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjUuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjYuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjcuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjguQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMjkuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzAuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzEuQkNNODgyNzA9MQorZHRtX2Zsb3dfbm9mX3JlbW90ZV9jb3Jlc19yZWdpb25fMzIuQkNNODgyNzA9MQorCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzE3LkJDTTg4MjcwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMTguQkNNODgyNzA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8xOS5CQ004ODI3MD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzIwLkJDTTg4MjcwPTAKKworIyMjIEZsb3cgQ29udHJvbCBjb25maWd1cmF0aW9uICMjIworIyBTZXQgdGhlIEZsb3cgY29udHJvbCB0eXBlIHBlciBQb3J0LgorIyBPcHRpb25zOiBMTCAoTGluay1sZXZlbCkgLyBDQjIgKENsYXNzLUJhc2VkIC0gMiBjbGFzc2VzKSAvCisjIENCOCAoQ2xhc3MtQmFzZWQgLSA4IGNsYXNzZXMpCisjIGZsb3dfY29udHJvbF90eXBlLkJDTTg4NjUwPUxMCisKKyMjIE91dC1PZi1CYW5kIEZsb3cgY29udHJvbCBjb25maWd1cmF0aW9uCisjc3BuX0ZDX09PQl9UWVBFLCBzcG5fRkNfT09CX01PREUsIHNwbl9GQ19PT0JfQ0FMRU5ERVJfTEVOR1RILCBzcG5fRkNfT09CX0NBTEVOREVSX1JFUF9DT1VOVCwKKworIyMgU2V0IHZvbHRhZ2UgbW9kZSBmb3Igb29iIGludGVyZmFjZXMKKyNIU1RMXzEuNVYKKyMzLjNWCisjSFNUTF8xLjVWX1ZERE9fRElWXzIKK2V4dF92b2x0YWdlX21vZGVfb29iPTMuM1YKKworIyMgSW5iYW5kIEludGVybGFrZW4gY29uZmlndXJhdGlvbgorIyBzcG5fRkNfSU5CQU5EX0lOVExLTl9NT0RFLCBzcG5fRkNfSU5CQU5EX0lOVExLTl9DQUxFTkRFUl9MRU5HVEgsIHNwbl9GQ19JTkJBTkRfSU5UTEtOX0NBTEVOREVSX1JFUF9DT1VOVAorIyBzcG5fRkNfSU5CQU5EX0lOVExLTl9DQUxFTkRFUl9MTEZDX01PREUsIHNwbl9GQ19JTkJBTkRfSU5UTEtOX0xMRkNfTVVCX0VOQUJMRV9NQVNLCisKKyMjIyBNZXRlciBlbmdpbmUgY29uZmlndXJhdGlvbiAjIyMKKworIyBTcGVjaWZ5IG1ldGVyIG9wZXJhdGlvbiBtb2RlCisjIDMyIC0gVHdvIG1ldGVycyBwZXIgcGFja2V0ICgzMmsgdG90YWwpCisjIDY0IC0gT25lIG1ldGVyIHBlciBwYWNrZXQgKDY0ayB0b3RhbCkgb3IgdHdvIG1ldGVyIHBlciBwYWNrZXQgaW4gZHVhbCBjb3JlIGRldmljZSBjb25maWd1cmVkIGFzIFNJTkdMRV9DT1JFICgxMjhLIHRvdGFsKQorIyAxMjggLSBPbmUgbWV0ZXIgcGVyIHBhY2tldCBpbiBkdWFsIGNvcmUgZGV2aWNlIGNvbmZpZ3VyZWQgYXMgU0lOR0xFX0NPUkUgKDEyOEsgdG90YWwpCisjIE9wdGlvbnM6IDAsIDMyLCA2NCwgMTI4Citwb2xpY2VyX2luZ3Jlc3NfY291bnQuQkNNODg2NTA9MzIKK3BvbGljZXJfaW5ncmVzc19jb3VudC5CQ004ODQ3MD0zMgorcG9saWNlcl9pbmdyZXNzX2NvdW50LkJDTTg4MjcwPTMyCitwb2xpY2VyX2luZ3Jlc3NfY291bnQuQkNNODg2ODA9MzIKKworCisjIEZvciBtZXRlcnMgaW4gZG91YmxlIDMyay82NEsgbW9kZSwgZGV0ZXJtaW5lIHRoZSBzaGFyaW5nIG1vZGUKKyMgT3B0aW9uczoKKyMgMCAtIE5PTkUgLSBGb3IgNjRrIG9yIDEyOEsgKG9uZSBtZXRlciBwZXIgcGFja2V0KQorIyAxIC0gU0VSSUFMIC0gMzJrIG1vZGUgb25seSAodHdvIG1ldGVycyBwZXIgcGFja2V0KQorIyAyIC0gUEFSQUxMRUwgLSBGb3IgMzJrIG9yIDY0ayAodHdvIG1ldGVyIHBlciBwYWNrZXQpCitwb2xpY2VyX2luZ3Jlc3Nfc2hhcmluZ19tb2RlLkJDTTg4NjUwPTEKK3BvbGljZXJfaW5ncmVzc19zaGFyaW5nX21vZGUuQkNNODg0NzA9MQorcG9saWNlcl9pbmdyZXNzX3NoYXJpbmdfbW9kZS5CQ004ODI3MD0xCitwb2xpY2VyX2luZ3Jlc3Nfc2hhcmluZ19tb2RlLkJDTTg4NjgwPTEKKworCisjIEFwcGxpZXMgb25seSB0byBBcmFkKyAoODg2NjApCisjIEZvciBtZXRlcnMgaW4gcGFyYWxsZWwgbW9kZSwgZGV0ZXJtaW5lIHRoZSBtYXBwaW5nCisjIE9wdGlvbnM6IEJFU1QsIFdPUlNUCisjIHBvbGljZXJfcmVzdWx0X3BhcmFsbGVsX2NvbG9yX21hcC5CQ004ODY1MD1XT1JTVAorCisjIEFwcGxpZXMgb25seSB0byBBcmFkKyAoODg2NjApCisjIEZvciBtZXRlcnMgaW4gcGFyYWxsZWwgbW9kZSwgZGV0ZXJtaW5lIGhvdyB0aGUgYnVja2V0cyBhcmUgY2hhbmdlZAorIyBPcHRpb25zOiBDT05TVEFOVCwgVFJBTlNQQVJFTlQsIERFRkVSUkVECisjIHBvbGljZXJfcmVzdWx0X3BhcmFsbGVsX2J1Y2tldF91cGRhdGUuQkNNODg2NTA9Q09OU1RBTlQKKworIyBBcHBsaWVzIG9ubHkgdG8gQXJhZCsgKDg4NjYwKQorIyBTZXQgdGhlIEV0aGVybmV0IHBvbGljZXIgdG8gd29yayBpbiBjb2xvciBibGluZCBtb2RlCisjIHJhdGVfY29sb3JfYmxpbmQuQkNNODg2NTA9MQorCisjIEwyIGxlYXJuIGxpbWl0IG1vZGUKKyMgT3B0aW9uczogVkxBTiwgVkxBTl9QT1JULCBUVU5ORUwgb3IgdGhlIG51bWVyaWMgZXF1aXZhbGVudCAwLTIuCisjIERlZmF1bHQ6IFZMQU4KKyMgbDJfbGVhcm5fbGltaXRfbW9kZSA9IFZMQU5fUE9SVAorCisjIEFwcGxpZXMgb25seSB0byBBcmFkKyAoODg2NjApCisjIERldGVybWluZXMgdGhlIEwyIGxlYXJuIGxpbWl0IHJhbmdlcyB3aGVuIGwyX2xlYXJuX2xpbWl0X21vZGUgaXMgc2V0IHRvIFZMQU5fUE9SVAorIyBUd28gcmFuZ2UgYmFzZXMgY2FuIGJlIHNlbGVjdGVkLCBlYWNoIG9mIDE2SyBzaXplLgorIyBPcHRpb25zOiAwLCAxNkssIDMySywgNDhLLgorIyBEZWZhdWx0OiAwICYgMTZLCisjIGwyX2xlYXJuX2xpZl9yYW5nZV9iYXNlXzAgPSAwCisjIGwyX2xlYXJuX2xpZl9yYW5nZV9iYXNlXzEgPSAxNksKKworIyBTVyBzaGFkb3cgbW9kZSBmb3IgZXhhY3QgbWF0Y2ggdGFibGVzLiBSZXF1aXJlZCBmb3IgU0VSIHN1cHBvcnQgYW5kIERCQUwgZGlhZ25vc3RpY3MuCisjICAgMCAtIERpc2FibGVkIChEZWZhdWx0KQorIyAgIDEgLSBFbmFibGVkCisjICAgMiAtIERpc2FibGVkIGZvciBMRU0sIGVuYWJsZWQgZm9yIG90aGVyIGV4YWN0IG1hdGNoIHRhYmxlcworZXhhY3RfbWF0Y2hfdGFibGVzX3NoYWRvd19lbmFibGUuQkNNODg2NTAgPSAxCitleGFjdF9tYXRjaF90YWJsZXNfc2hhZG93X2VuYWJsZS5CQ004ODY3NSA9IDIKKworIyBkZXRlcm1pbmUgaG93IG1hbnkgY21jcyBjb25uZWN0ZWQgdG8gdGhlIENQVS4gCisjIGRlZmF1bHQgdmFsdWUgPSAxCisjIGFwcGxpZXMgb25seSB0byBqZXJpY2hvIGFuZCBhYm92ZS4gCitwY2lfY21jc19udW0uODg2NzUgPSAzCitwY2lfY21jc19udW0uODg0NzAgPSAzCisKKyMjIyBDb3VudGVyIGVuZ2luZSBjb25maWd1cmF0aW9uICMjIworCisjIFNldCB0aGUgQ291bnRlciBzb3VyY2UKKyMgT3B0aW9uczogSU5HUkVTU19GSUVMRCAvIElOR1JFU1NfVk9RIC8gSU5HUkVTU19WU1EgLyBJTkdSRVNTX0NOTSAvIAorIyBJTkdSRVNTX0xBVEVOQ1kgLyBFR1JFU1NfRklFTEQgLyBFR1JFU1NfVlNJIC8gRUdSRVNTX09VVF9MSUYgLyBFR1JFU1NfVE0gKHBlciBxdWV1ZSkgLyBFR1JFU1NfVE1fUE9SVCAocGVyIHBvcnQpCisjIEVHUkVTU19SRUNFSVZFX1ZTSSAvIEVHUkVTU19SRUNFSVZFX09VVF9MSUYgLyBFR1JFU1NfUkVDRUlWRV9UTSAocGVyIHF1ZXVlKSAvIEVHUkVTU19SRUNFSVZFX1RNX1BPUlQgKHBlciBwb3J0KQorIyBJTkdSRVNTX09BTSAvIEVHUkVTU19PQU0KKyMgMiBDb3VudGVyLVBvaW50ZXJzIGNhbiBiZSBzZXQgKHdpdGggXzAgYW5kIF8xKSBmb3IKKyMgSU5HUkVTU19GSUVMRCAvIEVHUkVTU19GSUVMRCAvIEVHUkVTU19WU0kgLyBFR1JFU1NfT1VUX0xJRiAvIEVHUkVTU19UTSAvIEVHUkVTU19UTV9QT1JUCisjIFJhbmdlIGV4dGVuc2lvbiBjYW4gYmUgc2V0ICh3aXRoIF9MU0IgYW5kIF9NU0IpIGZvcgorIyBJTkdSRVNTX0ZJRUxEIC8gRUdSRVNTX1ZTSSAvIEVHUkVTU19PVVRfTElGIC8gRUdSRVNTX1RNIC8gRUdSRVNTX1RNX1BPUlQgL0VHUkVTU19SRUNFSVZFX1ZTSSAvCisjIEVHUkVTU19SRUNFSVZFX09VVF9MSUYgLyBFR1JFU1NfUkVDRUlWRV9UTSAvIEVHUkVTU19SRUNFSVZFX1RNX1BPUlQKK2NvdW50ZXJfZW5naW5lX3NvdXJjZV8wLkJDTTg4NjUwPUlOR1JFU1NfRklFTERfMAorY291bnRlcl9lbmdpbmVfc291cmNlXzEuQkNNODg2NTA9SU5HUkVTU19GSUVMRF8xCitjb3VudGVyX2VuZ2luZV9zb3VyY2VfMi5CQ004ODY1MD1JTkdSRVNTX1ZPUQorY291bnRlcl9lbmdpbmVfc291cmNlXzMuQkNNODg2NTA9RUdSRVNTX0ZJRUxECisKKyMgQ29uZmlndXJlIHRoZSBzdGF0aXN0aWMgaW50ZXJmYWNlIGVncmVzcyB0cmFuc21pdCBQUCBzb3VyY2UgYW5kIHRoZSBpbmdyZXNzIHJlY2VpdmVkIFBQIHNvdXJjZQorIyBPcHRpb25zIGZvciBlZ3Jlc3M6IEVHUkVTU19WU0kgLyBFR1JFU1NfT1VUX0xJRiAvIEVHUkVTU19UTSAvIEVHUkVTU19UTV9QT1JUICh0aGUgZGVmYXVsdCBpcyBUTSkKKyMgT3B0aW9ucyBmb3IgaW5ncmVzczogSU5HUkVTU19WU0kgLyBJTkdSRVNTX0lOX0xJRiAvIElOR1JFU1NfVE0gKHRoZSBkZWZhdWx0IGlzIFRNKQorIyB2YWxpZCBqdXN0IHdoZW4gdGhlcmUgaXMgbm8gY29uZmxpY3Qgd2l0aCB0aGUgb3RoZXIgY291bnRlciBlbmdpbmVzCisjY291bnRlcl9lbmdpbmVfc291cmNlX2VncmVzc19wcF9zdGF0MC5CQ004ODY1MD1FR1JFU1NfVE0KKyNjb3VudGVyX2VuZ2luZV9zb3VyY2VfZWdyZXNzX3BwX3N0YXQxLkJDTTg4NjUwPUVHUkVTU19WU0kKKyNjb3VudGVyX2VuZ2luZV9zb3VyY2VfaW5ncmVzc19wcF9zdGF0MC5CQ004ODY1MD1JTkdSRVNTX0lOX0xJRgorI2NvdW50ZXJfZW5naW5lX3NvdXJjZV9pbmdyZXNzX3BwX3N0YXQxLkJDTTg4NjUwPUlOR1JFU1NfVE0KKworCisjIFNldCB0aGUgQ291bnRlciBlbmdpbmUgcmVzb2x1dGlvbgorIyBTSU1QTEVfQ09MT1IgPSBncmVlbiwgbm90IGdyZWVuCisjIFNJTVBMRV9DT0xPUl9GV0QgPSBmd2QgZ3JlZW4sIGZ3ZCBub3QgZ3JlZW4gKEJDTTg4NjYwX0EwIG9ubHkpCisjIFNJTVBMRV9DT0xPUl9EUk9QID0gZHJvcCBncmVlbiwgZHJvcCBub3QgZ3JlZW4gKEJDTTg4NjYwX0EwIG9ubHkpCisjIEZXRF9EUk9QID0gZm9yd2FyZGVkLCBkcm9wcGVkCisjIEdSRUVOX05PVF9HUkVFTiA9IGZ3ZCBncm4sIGRyb3AgZ3JuLCBmd2Qgbm90IGdybiwgZHJvcCBub3QgZ3JuCisjIEZVTExfQ09MT1IgPSBmd2QgZ3JuLCBkcm9wIGdybiwgZndkIG5vdCBncm4sIGRyb3AgeWVsLCBkcm9wIHJlZAorIyBBTEwgPSByZWNlaXZlZAorIyBGV0QgPSBmb3J3YXJkZWQsIERST1AgPSBkcm9wZWQgKG5vdCBzdXBwb3J0ZWQgYnkgQVJBRF9BMCkKKyMgQ09ORklHVVJBQkxFID0gZGVmaW5lZCBieSBjb3VudGVyX2VuZ2luZV9tYXBfIFNPQyBwcm9wZXJ0aWVzIChCQ004ODY2MF9BMCBvbmx5KQorY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18wLkJDTTg4NjUwPUZVTExfQ09MT1IKK2NvdW50ZXJfZW5naW5lX3N0YXRpc3RpY3NfMS5CQ004ODY1MD1GVUxMX0NPTE9SCitjb3VudGVyX2VuZ2luZV9zdGF0aXN0aWNzXzIuQkNNODg2NTA9RlVMTF9DT0xPUgorY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18zLkJDTTg4NjUwPUZVTExfQ09MT1IKKworIyBTZXQgdGhlIENvdW50ZXIgZm9ybWF0CisjIE9wdGlvbnM6IFBBQ0tFVFNfQU5EX0JZVEVTIC8gUEFDS0VUUyAvIEJZVEVTCisjIC8gTUFYX1FVRVVFX1NJWkUgLyBMQVRFTkNZIC8gUEFDS0VUU19BTkRfUEFDS0VUUyhzdXBwb3J0ZWQganVzdCBpbiBGV0RfRFJPUCBzdGF0aXN0aWMgaW4gQkNNODg2NjBfQTApCisjIElmIG5vdCBQQUNLRVRTX0FORF9CWVRFUyBvciBQQUNLRVRTX0FORF9QQUNLRVRTLCB0aGUgSFcgQ291bnRlciB3aWR0aCBpcyA1OSBiaXRzLCB0aHVzCisjIG5vIGJhY2tncm91bmQgU1cgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZAorY291bnRlcl9lbmdpbmVfZm9ybWF0XzAuQkNNODg2NTA9UEFDS0VUU19BTkRfQllURVMKK2NvdW50ZXJfZW5naW5lX2Zvcm1hdF8xLkJDTTg4NjUwPVBBQ0tFVFNfQU5EX0JZVEVTCitjb3VudGVyX2VuZ2luZV9mb3JtYXRfMi5CQ004ODY1MD1QQUNLRVRTX0FORF9CWVRFUworY291bnRlcl9lbmdpbmVfZm9ybWF0XzMuQkNNODg2NTA9UEFDS0VUU19BTkRfQllURVMKKworIyAjZW5hYmxlL2Rpc2FibGUgY291bnRlciBwcm9jZXNzb3IgYmFja2dyb3VuZCB0aHJlYWQgKGRlZmF1bHQ6MS1lbmFibGUpCisjIGNvdW50ZXJfZW5naW5lX3NhbXBsaW5nX2ludGVydmFsPTEKKworCisjIyMgQ29uZmlndXJhYmxlIG1vZGUgY29uZmlndXJhdGlvbiAoQkNNODg2NjBfQTAgb25seSkjIyMKKyMgY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18wLkJDTTg4NjYwX0EwPUNPTkZJR1VSQUJMRQorIyBjb3VudGVyX2VuZ2luZV9tYXBfZW5hYmxlXzAuQkNNODg2NjBfQTA9MQorIyBjb3VudGVyX2VuZ2luZV9tYXBfc2l6ZV8wLkJDTTg4NjYwX0EwPTQKKyMgY291bnRlcl9lbmdpbmVfbWFwX2Z3ZF9ncmVlbl9vZmZzZXRfMC5CQ004ODY2MF9BMD0wCisjIGNvdW50ZXJfZW5naW5lX21hcF9md2RfeWVsbG93X29mZnNldF8wLkJDTTg4NjYwX0EwPTEKKyMgY291bnRlcl9lbmdpbmVfbWFwX2Z3ZF9yZWRfb2Zmc2V0XzAuQkNNODg2NjBfQTA9MQorIyBjb3VudGVyX2VuZ2luZV9tYXBfZndkX2JsYWNrX29mZnNldF8wLkJDTTg4NjYwX0EwPTIKKyMgY291bnRlcl9lbmdpbmVfbWFwX2Ryb3BfZ3JlZW5fb2Zmc2V0XzAuQkNNODg2NjBfQTA9MworIyBjb3VudGVyX2VuZ2luZV9tYXBfZHJvcF95ZWxsb3dfb2Zmc2V0XzAuQkNNODg2NjBfQTA9MworIyBjb3VudGVyX2VuZ2luZV9tYXBfZHJvcF9yZWRfb2Zmc2V0XzAuQkNNODg2NjBfQTA9MworIyBjb3VudGVyX2VuZ2luZV9tYXBfZHJvcF9ibGFja19vZmZzZXRfMC5CQ004ODY2MF9BMD0zCisKKyMjIyBTdGF0aXN0aWMtUmVwb3J0IGNvbmZpZ3VyYXRpb24gIyMjCisjIEVuYWJsZSB0aGUgU3RhdGlzdGljLUludGVyZmFjZSBjb25maWd1cmF0aW9uCisjIHN0YXRfaWZfZW5hYmxlXzxwb3J0PiAtIG5vdCBzdXBwb3J0ZWQgYnkgQVJBRF9BMAorIyBzdGF0X2lmX2VuYWJsZS5CQ004ODY1MD0xCisKKyMgIyMgU3RhdGlzdGljLVJlcG9ydCBQcm9wZXJ0aWVzCisjICMgU2V0IFN0YXRpc3RpYy1SZXBvcnQgaW50ZXJmYWNlIHJhdGUgaW4gTWJwcworIyAjIElmIFZhbHVlIGlzICcwJyB0aGUgc3RhdGlzdGljcyBwb3J0IHJhdGUgd2lsbCBiZSB1c2VkLiBEZWZhdWx0OiAwLgorIyBzdGF0X2lmX3JhdGUuQkNNODg2NTA9MAorIyAjIFNldCB0aGUgU3RhdGlzdGljLVJlcG9ydCBtb2RlCisjICMgT3B0aW9uczogQklMTElORyAvIEJJTExJTkdfUVVFVUVfTlVNQkVSIChub3Qgc3VwcG9ydGVkIGJ5IEFSQURfQTApLyBRU0laRQorIyBzdGF0X2lmX3JlcG9ydF9tb2RlLkJDTTg4NjUwPVFTSVpFCisjICNJbmRpY2F0ZSBpZiBpZGxlIHJlcG9ydHMgbXVzdCBiZSBzZW50CisjICN3aGVuIHRoZSBTdGF0aXN0aWMtcmVwb3J0IHJhdGUgaXMgdG9vIGxvdworIyBzdGF0X2lmX2lkbGVfcmVwb3J0c19wcmVzZW50LkJDTTg4NjUwPTAKKyMgIyBJbmRpY2F0ZSBpZiB0aGUgcmVwb3J0ZWQgcGFja2V0IHNpemUgaXMgdGhlIG9yaWdpbmFsIHBhY2tldCBzaXplCisjIHN0YXRfaWZfcmVwb3J0X29yaWdpbmFsX3BrdF9zaXplLkJDTTg4NjUwPTEKKyMgI0lmIHNldCB0aGVuIGEgc2luZ2xlIGluZ3Jlc3MtYmlsbGluZyByZXBvcnQgd2lsbCBiZSBnZW5lcmF0ZWQKKyMgI2ZvciB0aGUgd2hvbGUgc2V0IG9mIHRoZSBtdWx0aWNhc3QgY29waWVzCisjIHN0YXRfaWZfcmVwb3J0X211bHRpY2FzdF9zaW5nbGVfY29weT0xCisjICMjIFN0YXRpc3RpYyBQYWNrZXQgY29uZmlndXJhdGlvbnMKKyMgIyBTZXQgdGhlIFN0YXRpc3RpYyBQYWNrZXQgc2l6ZSAoQnl0ZXMpCisjICMgVmFsaWQgdmFsdWVzOiA2NUIvMTI2Qi8yNDhCLzQ5MkIgKFF1ZXVlLVNpemUpLCA2NEIvMTI4Qi8yNTZCLzUxMkIvMTAyNEIgKEJpbGxpbmcpLgorIyBzdGF0X2lmX3BrdF9zaXplPTY0QgorIworIyAjIyBTY3J1YmJlciBjb25maWd1cmF0aW9uCisjICMgU2V0IHRoZSByYW5nZSBvZiBWT1FzIHRvIHNjcnViLiBSYW5nZTogMCAtIDk2Sy0xLgorIyBzdGF0X2lmX3NjcnViYmVyX3F1ZXVlX21pbi5CQ004ODY1MD0wCisjIHN0YXRfaWZfc2NydWJiZXJfcXVldWVfbWF4LkJDTTg4NjUwPTAKKyMKKyMgIyBTZXQgdGhlIHNjcnViYmVyIHJhdGUgcmFuZ2UKKyMgIyBJZiBzZXQgdG8gMCAoZGVmYXVsdCksIHRoZSBzY3J1YmJlciBpcyBkaXNhYmxlZC4gVW5pdHM6IG5hbm9zZWNvbmRzCisjIHN0YXRfaWZfc2NydWJiZXJfcmF0ZV9taW4uQkNNODg2NTA9MAorIyBzdGF0X2lmX3NjcnViYmVyX3JhdGVfbWF4LkJDTTg4NjUwPTAKKyMKKyMgIyBTZXQgdGhlIHRocmVzaG9sZHMgKHRocmVzaF9pZCAwIC0gMTUpIGRlZmluaW5nCisjICMgb2NjdXBhbmN5IHJhbmdlIHBlciByZXNvdXJjZSB0eXBlOgorIyAjIERSQU0gQnVmZmVycywgQnVmZmVyIGRlc2NyaXB0b3JzLCBCdWZmZXIgZGVzY3JpcHRvcnMgYnVmZmVycworIyBzdGF0X2lmX3NjcnViYmVyX2JkYl90aC5CQ004ODY1MD0wCisjIHN0YXRfaWZfc2NydWJiZXJfYnVmZmVyX2Rlc2NyX3RoLkJDTTg4NjUwPTAKKyMgc3RhdF9pZl91Y19kcmFtX2J1ZmZlcl9kZXNjcl90aC5CQ004ODY1MD0wCisjCisjICNSZWxlY3RpdmUgcmVwb3J0IGZvciBxdWV1ZSBzaXplIG1vZGUgLSBub3Qgc3VwcG9ydGVkIGJ5IEFSQURfQTAKKyMgI1JlcG9ydHMgd2lsbCBiZSBjcmVhdGVkIGZvciBxdWV1ZSBudW0gcmFuZ2UgKHN0YXRfaWZfc2VsZWN0aXZlX3JlcG9ydF9xdWV1ZV9taW4gLXN0YXRfaWZfc2VsZWN0aXZlX3JlcG9ydF9xdWV1ZV9tYXgpCisjICNEZWZhdWx0IC0gYWxsIHJhbmdlCisjIHN0YXRfaWZfc2VsZWN0aXZlX3JlcG9ydF9xdWV1ZV9taW4uQkNNODg2NTBfQjA9MAorIyBzdGF0X2lmX3NlbGVjdGl2ZV9yZXBvcnRfcXVldWVfbWF4LkJDTTg4NjUwX0IwPTk4MzAzCisKKyMjIyBUcmFuc2FjdGlvbiAtIERNQSBjb25maWd1cmF0aW9uICMjIworIyBUaW1lIHRvIHdhaXQgZm9yIFNDSEFOIGNoYW5uZWwgcmVzcG9uc2UgKGZyb20gQ01JQykuIFVuaXRzOiBtaWNyb3NlY29uZHMuCisKKworIyMjIENvdW50ZXIgdGhyZWFkcyAjIyMKKyMgIyBzZXQgcG9ydCBiaXRtYXAgb24gd2hpY2ggc3RhdGlzdGljcyBjb2xsZWN0aW9uIHdpbGwgYmUgZW5hYmxlZCAoZGVmYXVsdCBhbGwgcG9ydHMpCisjIGJjbV9zdGF0X3BibXAuQkNNODg2NzU9MHhmZmZmZmZmZmYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNlMDAyCisjCisjICMgc2V0IHN0YXRpc3RpY3MgY29sbGVjdGlvbiBpbnRlcnZhbCBpbiBtaWNyb3NlY29uZHMgKGRlZmF1bHQgaXMgMTAwMDAwMCkKKyMgYmNtX3N0YXRfaW50ZXJ2YWwuQkNNODg2NzU9MTAwMDAwMAorCisjIyMgQ29udHJvbCBvcHRpbWl6YXRpb24gb2YgY29zcSBwb3J0IGluaXRpYWxpemF0aW9uczogc3BlZWQgZm9yIG1lbW9yeSAjIyMKK3J1bnRpbWVfcGVyZm9ybWFuY2Vfb3B0aW1pemVfZW5hYmxlX3NjaGVkX2FsbG9jYXRpb24uQkNNODg2NTA9MQorcnVudGltZV9wZXJmb3JtYW5jZV9vcHRpbWl6ZV9lbmFibGVfc2NoZWRfYWxsb2NhdGlvbi5CQ004ODY3NT0xCisKKyMjIyBzdGF0aWMgdGFibGVzIGluaXRpYXRpb24gKFN1cHBvcnRlZCBmb3IgSmVyaWNobykgIyMjCisjIE9wdGlvbnM6IDEgLSBpbml0aWF0aW5nIHN0YXRpYyB0YWJsZXMsIDAgLSBkb2Vzbid0IGluaXRpYXRlIHRhYmxlcyAoRGVmYXVsdCBWYWx1ZSBmb3IgUENJRC9lbXVsYXRpb24pCisjY3VzdG9tX2ZlYXR1cmVfc3RhdGljX3RibF9mdWxsX2luaXQuQkNNODg2NzU9MQorI2N1c3RvbV9mZWF0dXJlX2R5bmFtaWNfdGJsX2Z1bGxfaW5pdC5CQ004ODY3NT0xCisKKyMjIyBJbnRlcnJ1cHRzICMjIworIyMgU2V0IGludGVycnVwdHMgZ2xvYmFsIHBhcmFtZXRlcnMuCisjIE9wdGlvbnM6IDEgLSBQb2xsaW5nIGludGVycnVwdCBtb2RlLCAwIC0gTGluZS9NU0kgaW50ZXJydXB0IG1vZGUuIERlZmF1bHQ6IDEuCitwb2xsZWRfaXJxX21vZGUuQkNNODg2NTA9MAorcG9sbGVkX2lycV9tb2RlLkJDTTg4Njc1PTAKKyMgIFNldCB0aGUgZGVsYXkgaW4gbWljcm9zZWNvbmQgYmV0d2VlbiB0aGUgcG9sbGluZywgcmVsZXZhbnQgb25seSB0byBQb2xsaW5nIG1vZGUuICBEZWZhdWx0OiAweDAuCitwb2xsZWRfaXJxX2RlbGF5LkJDTTg4NjUwPTUwMDAwCisKKyMjIENNSUMgaW50ZXJydXB0czoKKyMgRW5hYmxlOiBVc2UgaW50ZXJydXB0cyBjb21wbGV0aW9uIGluc3RlYWQgb2YgcG9sbGluZyBjb21wbGV0aW9uIGZvciB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMuCisjICAgICAgICAgT3B0aW9uczogMSAtIEVuYWJsZSwgMCAtIERpc2FibGUuIERlZmF1bHQ6IDAuCisjIFRpbWVvdXQ6IGRlbGF5IGluIE1pY3Jvc2Vjb25kIGJldHdlZW4gdGhlIHBvbGxpbmcsIHJlbGV2YW50IG9ubHkgdG8gUG9sbGluZyBjb21wbGV0aW9uIG1vZGUuCisjIFNDSEFOOgorI3NjaGFuX2ludHJfZW5hYmxlLjA9MQorc2NoYW5fdGltZW91dF91c2VjLkJDTTg4NjUwPTMwMDAwMAorIyBURE1BCit0ZG1hX2ludHJfZW5hYmxlLkJDTTg4NjUwPTEKK3RkbWFfaW50cl9lbmFibGUuQkNNODg2NzU9MAordGRtYV90aW1lb3V0X3VzZWMuQkNNODg2NTA9NTAwMDAwMAordGRtYV90aW1lb3V0X3VzZWMuQkNNODg2NzU9NTYwMDAwMDAwCisjIFRTTEFNCit0c2xhbV9pbnRyX2VuYWJsZS5CQ004ODY1MD0xCit0c2xhbV9pbnRyX2VuYWJsZS5CQ004ODY3NT0wCit0c2xhbV90aW1lb3V0X3VzZWMuQkNNODg2NTA9NTAwMDAwMAordHNsYW1fdGltZW91dF91c2VjLkJDTTg4Njc1PTU2MDAwMDAwMAorIyBNSUlNCisjbWlpbV9pbnRyX2VuYWJsZS4wPTEKK21paW1fdGltZW91dF91c2VjLjA9MzAwMDAwCisKKyMjIyBEUkFNIGNvbmZpZ3VyYXRpb24gIyMjCisKKyMgRFJBTSBidWZmZXIgKERidWZmKSBzaXplCisjIEFsbG93ZWQgdmFsdWVzOiAyNTYvNTEyLzEwMjQvMjA0OC4KK2V4dF9yYW1fZGJ1ZmZfc2l6ZS5CQ004ODY1MD0xMDI0CitleHRfcmFtX2RidWZmX3NpemUuQkNNODg0NzA9NDA5NgorZXh0X3JhbV9kYnVmZl9zaXplLkJDTTg4MjcwPTQwOTYKKworIyBOdW1iZXIgb2YgZXh0ZXJuYWwgRFJBTXMuCisjIEFsbG93ZWQgdmFsdWVzIGZvciA4ODY1MDogMC8yLzMvNC82LzguCisjIEFsbG93ZWQgdmFsdWVzIGZvciA4ODY2MDogMC8xLzIvMy80LzYvOC4gQSB2YWx1ZSBvZiAxIGlzIHBlcm1pdHRlZCBvbmx5IGluIE9ORSBXQVkgQllQQVNTIG9jYiBtb2RlLgorIyBBbGxvd2VkIHZhbHVlcyBmb3IgODg2NzU6IDAvMi8zLzQxLzQyLzYvOC4gJzQxJyAtIGNvbmZpZ3VyZSA0IGRyYW1zIGluIFNpbmdsZSBTaWRlIG1vZGUgKEEsIEIsIEMsIEQpLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQyJyAtIGNvbmZpZ3VyZSA0IGRyYW1zIGluIHN5bW1ldHJpYyBtb2RlIChBLCBDLCBGLCBIKS4KKyMgVmFsdWUgb2YgMCBkaXNhYmxlcyB0aGUgRFJBTS4KK2V4dF9yYW1fcHJlc2VudC5CQ004ODY1MD04CisjIyB0aGlzIHNvYyBpcyBjb25maWd1cmVkIGluIHBlciBib2FyZCBzb2MgZmlsZSAoYmNtODh4N3hfYm9hcmQuc29jKQorZXh0X3JhbV9wcmVzZW50LkJDTTg4NDcwPTMKK2V4dF9yYW1fcHJlc2VudC5CQ004ODI3MD0xCisKKyMjIyBEcmFtIFR1bmluZyAoU2htb28pCisjIDMgPSBTa2lwIERyYW0gVHVuaW5nIChTaG1vbykuCisjIDIgPSBVc2UgRHJhbSBzYXZlZCBjb25maWcgUGFyYW1ldGVycywgaWYgbm8gUGFyYW1ldGVycyBQZXJmb3JtIFNobW9vIG9uIGluaXQuIERlZmF1bHQgb3B0aW9uLgorIyAxID0gUGVyZm9ybSBTaG1vbyBvbiBpbml0LgorIyAwID0gVXNlIERyYW0gc2F2ZWQgY29uZmlnIFBhcmFtZXRlcnMsIGlmIG5vIFBhcmFtZXRlcnMgZG8gbm90aGluZy4KK2RkcjNfYXV0b190dW5lLkJDTTg4NjUwPTIKK2RkcjNfYXV0b190dW5lLkJDTTg4MjcwPTIKK2RkcjNfYXV0b190dW5lLkJDTTg4NDcwPTIKKworIyMjIyMgRERSIFR1bmluZyBwYXJhbWV0ZXJzIGZvciBJTCBTVks0Citjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9ieXRlM19jaTEuMD0weDAwMDAwMDA0LDB4MDAwMDAwMDMsMHgwMDAwMDAwNywweDAwMDAwMDAzLDB4MDAwMDAwMDIsMHgwMDAwMDAwMCwweDAwMDAwMDA2LDB4MDAwMDAwMDQsCitjb21ibzI4X3R1bmVfZHFfcmRfbWluX3ZkbF9ieXRlMV9jaTIuMD0weDAwMDAwMDE3LDB4MDAwMDAwMTQsMHgwMDAwMDAxNiwweDAwMDAwMDE0LDB4MDAwMDAwMTcsMHgwMDAwMDAxOCwweDAwMDAwMDE3LDB4MDAwMDAwMTcsCitjb21ibzI4X3R1bmVfY29tbW9uX21hY3JvX3Jlc2VydmVkX3JlZ19jaTAuMD0weDAwMDAwMDAwLAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19yZXNlcnZlZF9yZWdfY2kxLjA9MHgwMDAwMDAwMywKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3NfcmVhZF9jbG9ja19jb25maWdfY2kwLjA9MHgwMDAwMDAwMiwKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2J5dGUyX2NpMC4wPTB4MDAwMDAwMTgsMHgwMDAwMDAxNywweDAwMDAwMDE3LDB4MDAwMDAwMTgsMHgwMDAwMDAxNywweDAwMDAwMDE0LDB4MDAwMDAwMTUsMHgwMDAwMDAxNywKK2NvbWJvMjhfdHVuZV9kcV9yZWFkX21heF92ZGxfZnNtX2NpMS4wPTB4MDAwMDAwNGMsMHgwMDAwMDA0YywweDAwMDAwMDRjLDB4MDAwMDAwNGMsCitjb21ibzI4X3R1bmVfYXFfdV9tYXhfdmRsX2N0cmxfY2kxLjA9MHgwMDAwMDIxNCwKK2NvbWJvMjhfdHVuZV9kcV9yZF9tYXhfdmRsX2Rxc25fY2kxLjA9MHgwMDAwMDAxNywweDAwMDAwMDE5LDB4MDAwMDAwMmQsMHgwMDAwMDAyZCwKK2NvbWJvMjhfdHVuZV9kcV9yZW5fZmlmb19jb25maWdfY2kwLjA9MHgwMDAwMDA5MCwweDAwMDAwMDkwLDB4MDAwMDAwOTAsMHgwMDAwMDA5MCwKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2RiaV9jaTEuMD0weDAwMDAwMDAxLDB4MDAwMDAwMDQsMHgwMDAwMDAwMiwweDAwMDAwMDAzLAorY29tYm8yOF90dW5lX2FxX3VfbWFjcm9fcmVzZXJ2ZWRfcmVnX2NpMC4wPTB4MDAwMDAwMDAsCitjb21ibzI4X3R1bmVfZHFfcmRfbWluX3ZkbF9lZGNfY2kxLjA9MHgwMDAwMDAxNiwweDAwMDAwMDE2LDB4MDAwMDAwMTcsMHgwMDAwMDAxYSwKK2NvbWJvMjhfdHVuZV9hcV9sX21heF92ZGxfYWRkcl9jaTEuMD0weDAwMDAwMjE0LAorY29tYm8yOF90dW5lX2RxX3dyX21heF92ZGxfZGF0YV9jaTIuMD0weDAwMDAwMjM4LDB4MDAwMDA0MDYsMHgwMDAwMDI0NywweDAwMDAwNDE2LAorY29tYm8yOF90dW5lX2RxX3dyX21pbl92ZGxfYnl0ZTNfY2kyLjA9MHgwMDAwMDAwMCwweDAwMDAwMDAzLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDMsMHgwMDAwMDAwMSwweDAwMDAwMDAxLAorY29tYm8yOF90dW5lX2NvbW1vbl9tYWNyb19yZXNlcnZlZF9yZWdfY2kxLjA9MHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3NfcmVzZXJ2ZWRfcmVnX2NpMi4wPTB4MDAwMDAwMDMsCitjb21ibzI4X3R1bmVfY29udHJvbF9yZWdzX3JlYWRfY2xvY2tfY29uZmlnX2NpMS4wPTB4MDAwMDAwMDIsCitjb21ibzI4X3R1bmVfZHFfcmRfbWluX3ZkbF9ieXRlMl9jaTEuMD0weDAwMDAwMDE1LDB4MDAwMDAwMTUsMHgwMDAwMDAxOSwweDAwMDAwMDE3LDB4MDAwMDAwMTQsMHgwMDAwMDAxNiwweDAwMDAwMDE4LDB4MDAwMDAwMTYsCitjb21ibzI4X3R1bmVfZHFfcmVhZF9tYXhfdmRsX2ZzbV9jaTIuMD0weDAwMDAwMDRkLDB4MDAwMDAwNGQsMHgwMDAwMDA0ZCwweDAwMDAwMDRkLAorY29tYm8yOF90dW5lX2FxX3VfbWF4X3ZkbF9jdHJsX2NpMi4wPTB4MDAwMDAwNDgsCitjb21ibzI4X3R1bmVfZHFfcmRfbWF4X3ZkbF9kcXNuX2NpMi4wPTB4MDAwMDAwMjMsMHgwMDAwMDAyMiwweDAwMDAwMDJjLDB4MDAwMDAwMjAsCitjb21ibzI4X3R1bmVfZHFfcmVuX2ZpZm9fY29uZmlnX2NpMS4wPTB4MDAwMDAwOTAsMHgwMDAwMDA5MCwweDAwMDAwMDkwLDB4MDAwMDAwOTAsCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9kYmlfY2kyLjA9MHgwMDAwMDAwMiwweDAwMDAwMDAxLDB4MDAwMDAwMDMsMHgwMDAwMDAwMSwKK2NvbWJvMjhfdHVuZV9hcV91X21hY3JvX3Jlc2VydmVkX3JlZ19jaTEuMD0weDAwMDAwMDAwLAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfZWRjX2NpMi4wPTB4MDAwMDAwMTYsMHgwMDAwMDAxNywweDAwMDAwMDE2LDB4MDAwMDAwMTcsCitjb21ibzI4X3R1bmVfYXFfbF9tYXhfdmRsX2FkZHJfY2kyLjA9MHgwMDAwMDA0OCwKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3NfcmVuX2ZpZm9fY2VudHJhbF9pbml0aWFsaXplcl9jaTAuMD0weDAwMDAwMDBmLAorY29tYm8yOF90dW5lX2NvbW1vbl9tYWNyb19yZXNlcnZlZF9yZWdfY2kyLjA9MHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3NfcmVhZF9jbG9ja19jb25maWdfY2kyLjA9MHgwMDAwMDAwMiwKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2J5dGUyX2NpMi4wPTB4MDAwMDAwMTgsMHgwMDAwMDAxNiwweDAwMDAwMDE1LDB4MDAwMDAwMTQsMHgwMDAwMDAxNSwweDAwMDAwMDE1LDB4MDAwMDAwMTQsMHgwMDAwMDAxNSwKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2J5dGUwX2NpMC4wPTB4MDAwMDAwMDEsMHgwMDAwMDAwMiwweDAwMDAwMDAwLDB4MDAwMDAwMDIsMHgwMDAwMDAwMiwweDAwMDAwMDAzLDB4MDAwMDAwMDQsMHgwMDAwMDAwMSwKK2NvbWJvMjhfdHVuZV9kcV9yZW5fZmlmb19jb25maWdfY2kyLjA9MHgwMDAwMDA5MCwweDAwMDAwMDkwLDB4MDAwMDAwOTAsMHgwMDAwMDA5MCwKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2J5dGUzX2NpMC4wPTB4MDAwMDAwMTksMHgwMDAwMDAxNywweDAwMDAwMDFhLDB4MDAwMDAwMWMsMHgwMDAwMDAxNywweDAwMDAwMDE4LDB4MDAwMDAwMTQsMHgwMDAwMDAxNCwKK2NvbWJvMjhfdHVuZV9hcV91X21hY3JvX3Jlc2VydmVkX3JlZ19jaTIuMD0weDAwMDAwMDAwLAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19yZW5fZmlmb19jZW50cmFsX2luaXRpYWxpemVyX2NpMS4wPTB4MDAwMDAwMGYsCitjb21ibzI4X3R1bmVfYXFfbF9tYXhfdmRsX2N0cmxfY2kwLjA9MHgwMDAwMDIwMSwKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3NfaW5wdXRfc2hpZnRfY3RybF9jaTAuMD0weDAwMDAwMDcwLAorY29tYm8yOF90dW5lX2RxX3dyX21pbl92ZGxfYnl0ZTBfY2kxLjA9MHgwMDAwMDAwNSwweDAwMDAwMDAxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAzLAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfYnl0ZTNfY2kxLjA9MHgwMDAwMDAxOCwweDAwMDAwMDE3LDB4MDAwMDAwMWMsMHgwMDAwMDAxZCwweDAwMDAwMDE0LDB4MDAwMDAwMTcsMHgwMDAwMDAxZSwweDAwMDAwMDFkLAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19yZW5fZmlmb19jZW50cmFsX2luaXRpYWxpemVyX2NpMi4wPTB4MDAwMDAwMGYsCitjb21ibzI4X3R1bmVfZHFfcmRfbWF4X3ZkbF9kcXNwX2NpMC4wPTB4MDAwMDAwMTgsMHgwMDAwMDAxOSwweDAwMDAwMDI1LDB4MDAwMDAwMmIsCitjb21ibzI4X3R1bmVfYXFfbF9tYXhfdmRsX2N0cmxfY2kxLjA9MHgwMDAwMDIxNCwKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3NfaW5wdXRfc2hpZnRfY3RybF9jaTEuMD0weDAwMDAwMDcwLAorY29tYm8yOF90dW5lX2RxX3dyX21pbl92ZGxfYnl0ZTBfY2kyLjA9MHgwMDAwMDAwMCwweDAwMDAwMDA1LDB4MDAwMDAwMDMsMHgwMDAwMDAwMywweDAwMDAwMDAzLDB4MDAwMDAwMDMsMHgwMDAwMDAwMywweDAwMDAwMDAyLAorY29tYm8yOF90dW5lX2RxX3dyX21pbl92ZGxfZWRjX2NpMC4wPTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCitjb21ibzI4X3R1bmVfZHFfcmRfbWluX3ZkbF9ieXRlM19jaTIuMD0weDAwMDAwMDE1LDB4MDAwMDAwMTcsMHgwMDAwMDAxNCwweDAwMDAwMDE1LDB4MDAwMDAwMTYsMHgwMDAwMDAxOCwweDAwMDAwMDE4LDB4MDAwMDAwMTksCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9ieXRlMV9jaTAuMD0weDAwMDAwMDAyLDB4MDAwMDAwMDIsMHgwMDAwMDAwMiwweDAwMDAwMDAzLDB4MDAwMDAwMDIsMHgwMDAwMDAwMSwweDAwMDAwMDAyLDB4MDAwMDAwMDAsCitjb21ibzI4X3R1bmVfY29udHJvbF9yZWdzX2VkY2VuX2ZpZm9fY2VudHJhbF9pbml0X2NpMC4wPTB4MDAwMDAwMDAsCitjb21ibzI4X3R1bmVfZHFfbWFjcm9fcmVzZXJ2ZWRfcmVnX2NpMC4wPTB4MDAwMDAwMjYsMHgwMDAwMDAyNiwweDAwMDAwMDI1LDB4MDAwMDAwMjYsCitjb21ibzI4X3R1bmVfZHFfcmRfbWF4X3ZkbF9kcXNwX2NpMS4wPTB4MDAwMDAwMTcsMHgwMDAwMDAxOSwweDAwMDAwMDJkLDB4MDAwMDAwMmQsCitjb21ibzI4X3R1bmVfYXFfbF9tYXhfdmRsX2N0cmxfY2kyLjA9MHgwMDAwMDA0OCwKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3NfaW5wdXRfc2hpZnRfY3RybF9jaTIuMD0weDAwMDAwMDcwLAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfZGJpX2NpMC4wPTB4MDAwMDAwMTYsMHgwMDAwMDAxNywweDAwMDAwMDE3LDB4MDAwMDAwMTgsCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9lZGNfY2kxLjA9MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2J5dGUxX2NpMS4wPTB4MDAwMDAwMDYsMHgwMDAwMDAwNywweDAwMDAwMDA1LDB4MDAwMDAwMDUsMHgwMDAwMDAwMCwweDAwMDAwMDAxLDB4MDAwMDAwMDcsMHgwMDAwMDAwNSwKK2NvbWJvMjhfdHVuZV9kcV9lZGNlbl9maWZvX2NvbmZpZ19jaTAuMD0weDAwMDAwMDgwLDB4MDAwMDAwODAsMHgwMDAwMDA4MCwweDAwMDAwMDgwLAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19lZGNlbl9maWZvX2NlbnRyYWxfaW5pdF9jaTEuMD0weDAwMDAwMDAwLAorY29tYm8yOF90dW5lX2RxX3ZyZWZfZGFjX2NvbmZpZ19jaTAuMD0weDAwNzYwMDAwLDB4MDA3NDAwMDAsMHgwMDgwMDAwMCwweDAwN2MwMDAwLAorY29tYm8yOF90dW5lX2RxX21hY3JvX3Jlc2VydmVkX3JlZ19jaTEuMD0weDAwMDAwMDI2LDB4MDAwMDAwMmEsMHgwMDAwMDAyOCwweDAwMDAwMDI5LAorY29tYm8yOF90dW5lX2RxX3JkX21heF92ZGxfZHFzcF9jaTIuMD0weDAwMDAwMDIzLDB4MDAwMDAwMjIsMHgwMDAwMDAyYywweDAwMDAwMDIwLAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfYnl0ZTBfY2kwLjA9MHgwMDAwMDAxNiwweDAwMDAwMDE0LDB4MDAwMDAwMTQsMHgwMDAwMDAxNiwweDAwMDAwMDE1LDB4MDAwMDAwMTUsMHgwMDAwMDAxNiwweDAwMDAwMDE2LAorY29tYm8yOF90dW5lX2RxX3JkX21pbl92ZGxfZGJpX2NpMS4wPTB4MDAwMDAwMTYsMHgwMDAwMDAxNiwweDAwMDAwMDE3LDB4MDAwMDAwMWEsCitjb21ibzI4X3R1bmVfYXFfdV9tYXhfdmRsX2FkZHJfY2kwLjA9MHgwMDAwMDIwMSwKK2NvbWJvMjhfdHVuZV9kcV93cl9tYXhfdmRsX2Rxc19jaTAuMD0weDAwMDAwNDQwLDB4MDAwMDA0NGEsMHgwMDAwMDQyMiwweDAwMDAwNDMwLAorY29tYm8yOF90dW5lX2RxX3dyX21pbl92ZGxfZWRjX2NpMi4wPTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9ieXRlMV9jaTIuMD0weDAwMDAwMDAzLDB4MDAwMDAwMDAsMHgwMDAwMDAwMiwweDAwMDAwMDAxLDB4MDAwMDAwMDIsMHgwMDAwMDAwMSwweDAwMDAwMDA0LDB4MDAwMDAwMDEsCitjb21ibzI4X3R1bmVfZHFfZWRjZW5fZmlmb19jb25maWdfY2kxLjA9MHgwMDAwMDA4MCwweDAwMDAwMDgwLDB4MDAwMDAwODAsMHgwMDAwMDA4MCwKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3NfZWRjZW5fZmlmb19jZW50cmFsX2luaXRfY2kyLjA9MHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9kcV92cmVmX2RhY19jb25maWdfY2kxLjA9MHgwMDdlMDAwMCwweDAwN2EwMDAwLDB4MDA4MjAwMDAsMHgwMDgyMDAwMCwKK2NvbWJvMjhfdHVuZV9kcV9tYWNyb19yZXNlcnZlZF9yZWdfY2kyLjA9MHgwMDAwMDAyOCwweDAwMDAwMDI4LDB4MDAwMDAwMmEsMHgwMDAwMDAyYiwKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2J5dGUyX2NpMC4wPTB4MDAwMDAwMDEsMHgwMDAwMDAwMCwweDAwMDAwMDAzLDB4MDAwMDAwMDIsMHgwMDAwMDAwNSwweDAwMDAwMDA1LDB4MDAwMDAwMDMsMHgwMDAwMDAwNSwKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2J5dGUwX2NpMS4wPTB4MDAwMDAwMTUsMHgwMDAwMDAxNywweDAwMDAwMDE3LDB4MDAwMDAwMTcsMHgwMDAwMDAxNywweDAwMDAwMDE1LDB4MDAwMDAwMTQsMHgwMDAwMDAxNSwKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2RiaV9jaTIuMD0weDAwMDAwMDE2LDB4MDAwMDAwMTcsMHgwMDAwMDAxNiwweDAwMDAwMDE3LAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19zaGFyZWRfdnJlZl9kYWNfY29uZmlnX2NpMC4wPTB4MDA5MjAwMDAsCitjb21ibzI4X3R1bmVfYXFfdV9tYXhfdmRsX2FkZHJfY2kxLjA9MHgwMDAwMDIxNCwKK2NvbWJvMjhfdHVuZV9kcV93cl9tYXhfdmRsX2Rxc19jaTEuMD0weDAwMDAwNDQwLDB4MDAwMDA0NDYsMHgwMDAwMDQyZCwweDAwMDAwNDM0LAorY29tYm8yOF90dW5lX2RxX2VkY2VuX2ZpZm9fY29uZmlnX2NpMi4wPTB4MDAwMDAwODAsMHgwMDAwMDA4MCwweDAwMDAwMDgwLDB4MDAwMDAwODAsCitjb21ibzI4X3R1bmVfYXFfbF9tYWNyb19yZXNlcnZlZF9yZWdfY2kwLjA9MHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9kcV92cmVmX2RhY19jb25maWdfY2kyLjA9MHgwMDg0MDAwMCwweDAwN2UwMDAwLDB4MDA4YTAwMDAsMHgwMDgyMDAwMCwKK2NvbWJvMjhfdHVuZV9kcV93cl9taW5fdmRsX2J5dGUyX2NpMS4wPTB4MDAwMDAwMDAsMHgwMDAwMDAwMSwweDAwMDAwMDAyLDB4MDAwMDAwMDQsMHgwMDAwMDAwMywweDAwMDAwMDAwLDB4MDAwMDAwMDQsMHgwMDAwMDAwNywKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2J5dGUwX2NpMi4wPTB4MDAwMDAwMTQsMHgwMDAwMDAxNSwweDAwMDAwMDE1LDB4MDAwMDAwMTQsMHgwMDAwMDAxNiwweDAwMDAwMDE3LDB4MDAwMDAwMTUsMHgwMDAwMDAxNiwKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3Nfc2hhcmVkX3ZyZWZfZGFjX2NvbmZpZ19jaTEuMD0weDAwOTIwMDAwLAorY29tYm8yOF90dW5lX2FxX3VfbWF4X3ZkbF9hZGRyX2NpMi4wPTB4MDAwMDAwNDgsCitjb21ibzI4X3R1bmVfZHFfd3JfbWF4X3ZkbF9kcXNfY2kyLjA9MHgwMDAwMDQyNCwweDAwMDAwNDM1LDB4MDAwMDA0M2MsMHgwMDAwMDQ0NCwKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2J5dGUxX2NpMC4wPTB4MDAwMDAwMTcsMHgwMDAwMDAxNywweDAwMDAwMDE4LDB4MDAwMDAwMTgsMHgwMDAwMDAxNCwweDAwMDAwMDE1LDB4MDAwMDAwMTUsMHgwMDAwMDAxNSwKK2NvbWJvMjhfdHVuZV9hcV9sX21hY3JvX3Jlc2VydmVkX3JlZ19jaTEuMD0weDAwMDAwMDAwLAorY29tYm8yOF90dW5lX2RxX3dyX21pbl92ZGxfYnl0ZTJfY2kyLjA9MHgwMDAwMDAwNCwweDAwMDAwMDAwLDB4MDAwMDAwMDQsMHgwMDAwMDAwNSwweDAwMDAwMDAyLDB4MDAwMDAwMDMsMHgwMDAwMDAwNCwweDAwMDAwMDA0LAorY29tYm8yOF90dW5lX2RxX3dyX21heF92ZGxfZGF0YV9jaTAuMD0weDAwMDAwNDE2LDB4MDAwMDA0MjgsMHgwMDAwMDIzMiwweDAwMDAwMjQxLAorY29tYm8yOF90dW5lX2NvbnRyb2xfcmVnc19zaGFyZWRfdnJlZl9kYWNfY29uZmlnX2NpMi4wPTB4MDA5MjAwMDAsCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9ieXRlM19jaTAuMD0weDAwMDAwMDA1LDB4MDAwMDAwMDUsMHgwMDAwMDAwNSwweDAwMDAwMDA0LDB4MDAwMDAwMDMsMHgwMDAwMDAwMywweDAwMDAwMDAzLDB4MDAwMDAwMDAsCitjb21ibzI4X3R1bmVfZHFfcmRfbWluX3ZkbF9ieXRlMV9jaTEuMD0weDAwMDAwMDE4LDB4MDAwMDAwMTgsMHgwMDAwMDAxOCwweDAwMDAwMDE0LDB4MDAwMDAwMTQsMHgwMDAwMDAxNCwweDAwMDAwMDE4LDB4MDAwMDAwMTQsCitjb21ibzI4X3R1bmVfYXFfbF9tYWNyb19yZXNlcnZlZF9yZWdfY2kyLjA9MHgwMDAwMDAwMCwKK2NvbWJvMjhfdHVuZV9jb250cm9sX3JlZ3NfcmVzZXJ2ZWRfcmVnX2NpMC4wPTB4MDAwMDAwMDMsCitjb21ibzI4X3R1bmVfZHFfcmVhZF9tYXhfdmRsX2ZzbV9jaTAuMD0weDAwMDAwMDRiLDB4MDAwMDAwNGIsMHgwMDAwMDA0YiwweDAwMDAwMDRiLAorY29tYm8yOF90dW5lX2FxX3VfbWF4X3ZkbF9jdHJsX2NpMC4wPTB4MDAwMDAyMDEsCitjb21ibzI4X3R1bmVfZHFfcmRfbWF4X3ZkbF9kcXNuX2NpMC4wPTB4MDAwMDAwMTgsMHgwMDAwMDAxOSwweDAwMDAwMDI1LDB4MDAwMDAwMmIsCitjb21ibzI4X3R1bmVfZHFfd3JfbWluX3ZkbF9kYmlfY2kwLjA9MHgwMDAwMDAwMSwweDAwMDAwMDAxLDB4MDAwMDAwMDMsMHgwMDAwMDAwMywKK2NvbWJvMjhfdHVuZV9kcV9yZF9taW5fdmRsX2VkY19jaTAuMD0weDAwMDAwMDE2LDB4MDAwMDAwMTcsMHgwMDAwMDAxNywweDAwMDAwMDE4LAorY29tYm8yOF90dW5lX2FxX2xfbWF4X3ZkbF9hZGRyX2NpMC4wPTB4MDAwMDAyMDEsCitjb21ibzI4X3R1bmVfZHFfd3JfbWF4X3ZkbF9kYXRhX2NpMS4wPTB4MDAwMDA0MTQsMHgwMDAwMDQxZSwweDAwMDAwMjM0LDB4MDAwMDAyNDUsCisKKyMjIyBFbmFibGUgQklTVAorIyBSdW4gRHJhbSBCSVNUIG9uIGluaXRpYWxpemF0aW9uLCBpZiBCSVNUIGZhaWwgdGhlIGluaXRpYWxpemF0aW9uIHdpbGwgZmFpbC4gRGVmdWx0OiAxLgorIyBiaXN0X2VuYWJsZV9kcmFtLkJDTTg4NjUwPTEKK2Jpc3RfZW5hYmxlX2RyYW0uQkNNODgyNzA9MQorYmlzdF9lbmFibGVfZHJhbS5CQ004ODQ3MD0xCisKKyMjIyBFeGFtcGxlIGZvciBEcmFtIFNhdmVkIGNvbmZpZyBQYXJhbWV0ZXJzLgorIyMgVGhpcyBleGFtcGxlIGlzIGZvciBjaT0xNCAoRHJhbT03KS4KKyNkZHIzX3R1bmVfYWRkcmNfY2kxND0weDAwMDAwMGFlCisjZGRyM190dW5lX3dyX2RxX3dsMV9jaTE0PTB4OTI5MjkyOTIsMHg5MjkyOTI5MiwweDkyOTI5MjkyLDB4OTI5MjkyOTIKKyNkZHIzX3R1bmVfd3JfZHFfd2wwX2NpMTQ9MHg5MzkzOTM5MywweDkzOTM5MzkzLDB4OTI5MjkyOTIsMHg5MjkyOTI5MgorI2RkcjNfdHVuZV93cl9kcV9jaTE0PTB4ODA4MDgwODAKKyNkZHIzX3R1bmVfdnJlZl9jaTE0PTB4MDAwMDA3ZGYKKyNkZHIzX3R1bmVfcmRfZHFzX2NpMTQ9MHg5Njk2OTE5MSwweDkwOTA5MTkxCisjZGRyM190dW5lX3JkX2RxX3dsMV9ybl9jaTE0PTB4ODI4MjgyODIsMHg4MjgyODI4MiwweDgyODI4MjgyLDB4ODI4MjgyODIKKyNkZHIzX3R1bmVfcmRfZHFfd2wwX3JuX2NpMTQ9MHg4MjgyODI4MiwweDgyODI4MjgyLDB4ODk4OTg5ODksMHg4OTg5ODk4OQorI2RkcjNfdHVuZV9yZF9kcV93bDFfcnBfY2kxND0weDgyODI4MjgyLDB4ODI4MjgyODIsMHg4MjgyODI4MiwweDgyODI4MjgyCisjZGRyM190dW5lX3JkX2RxX3dsMF9ycF9jaTE0PTB4ODI4MjgyODIsMHg4MjgyODI4MiwweDg5ODk4OTg5LDB4ODk4OTg5ODkKKyNkZHIzX3R1bmVfcmRfZW5fY2kxND0weDAwOWQ5ZTlkLDB4MDBhMmEzYTEKKyNkZHIzX3R1bmVfcmRfZGF0YV9kbHlfY2kxND0weDAwMDAwNTA1CisKKworIyMjIERyYW0gdHlwZTogU2VsZWN0IE9OTFkgT05FIG9mIHRoZSBmb2xsb3dpbmcgRFJBTSB0eXBlcywgdG8gY29uZmlndXJlIGFsbCBkcmFtIHJlbGF0ZWQgcGFyYW1ldGVyZXMgcGVyIHR5cGUuCisKKyMgRHJhbSBUeXBlIGZvciBBcmFkOgorI2RyYW1fdHlwZV9ERFIzX0hZTklYX0g1VFEyRzYzQkZSX1RFQ18xMDY2PTEKKyNkcmFtX3R5cGVfRERSM19IWU5JWF9INVRRMkc2M0JGUl9URUNfOTMzPTEKKyNkcmFtX3R5cGVfRERSM19IWU5JWF9INVRRMkc2M0JGUl9URUNfODAwPTEKKyNkcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoyNTZNMTZfNEdCSVRfMTA2Nj0xCisjZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMTI4TTE2SEFfMTI1XzEwNjY9MQorI2RyYW1fdHlwZV9ERFIzX01JQ1JPTl9NVDQxSjEyOE0xNkhBXzEyNV85MzM9MQorI2RyYW1fdHlwZV9ERFIzX01JQ1JPTl9NVDQxSjEyOE0xNkhBXzEyNV84MDA9MQorI2RyYW1fdHlwZV9ERFIzX01JQ1JPTl9NVDQySjY0TTE2TEFfMTVFXzY2Nz0xCisjZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEI0RzE2NDZCXzRHQklUXzEwNjY9MQorI2RyYW1fdHlwZV9ERFIzX1NBTVNVTkdfSzRCMUcxNjQ2R185MzM9MQorI2RyYW1fdHlwZV9ERFIzX1NBTVNVTkdfSzRCMUcxNjQ2R184MDA9MQorCisjIERyYW0gVHlwZSBmb3IgSmVyaWNobzoKKyMjIHRoaXMgc29jIGlzIGNvbmZpZ3VyZWQgaW4gcGVyIGJvYXJkIHNvYyBmaWxlIChiY204OHg3eF9ib2FyZC5zb2MpCisjZHJhbV90eXBlX0REUjRfTUlDUk9OX1k0MDE2QUFCR19KRF9GXzRHQklUPTEKK2RyYW1fdHlwZV9ERFI0X01JQ1JPTl9NVDQwQTI1Nk0xNkhBXzA4M0VBXzRHQklUPTEKKyNkcmFtX3R5cGVfRERSNF9IWU5JWF9INUFONEc2Tk1GUl9WSkNfNEdCSVQ9MQorI2RyYW1fdHlwZV9HRERSNV9TQU1TVU5HX0s0RzIwMzI1RkRfMkdCSVQ9MQorI2RyYW1fdHlwZV9HRERSNV9TQU1TVU5HX0s0RzQxMzI1RkNfNEdCSVQ9MQorI2RyYW1fdHlwZV9HRERSNV9NSUNST05fRURXNDAzMkNBQkdfNEdCSVQ9MQorI2RyYW1fdHlwZV9HRERSNV9IWU5JWF9INUdDNEgyNE1GUl9UMkNfNEdCSVQ9MQorCisjIERyYW0gVHlwZSBmb3IgQXJkb246CisjZHJhbV90eXBlX0REUjRfTUlDUk9OX0VEWTQwMTZBQUJHX0RSRlJfNEdCSVQ9MQorCisjIERSQU0gZnJlcXVlbmN5CitleHRfcmFtX2ZyZXEuQkNNODg2NzU9MTYwMAorCisjIyMgU2V0dGluZyBkcmFtX3R5cGVfRERSM19IWU5JWF9INVRRMkc2M0JGUl9URUNfMTA2NiBQYXJhbWV0ZXJzIGFzIERlZmF1bHQ6CisjIyBBbGwgb3RoZXIgZHJhbSB0eXBlcyBwYXJhbWV0ZXIgcmVzaWRlcyBpbiBhcmFkLnNvYy4gY2hvb3NpbmcgYW5vdGhlciBEcmFtIFR5cGUgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMuCitleHRfcmFtX3RfcnJkPTYwMDAKK2V4dF9yYW1fY29sdW1ucz0xMDI0CitleHRfcmFtX2JhbmtzPTgKK2V4dF9yYW1fYXBfYml0X3Bvcz0xMAorZXh0X3JhbV9idXJzdF9zaXplPTMyCitleHRfcmFtX3RfcmVmPTM5MDAwMDAKK2V4dF9yYW1fdF93cj0xNTAwMAorZXh0X3JhbV90X3d0cj03NTAwCitleHRfcmFtX3RfcnRwPTc1MDAKK2V4dF9yYW1fZnJlcT0xMDY2CitleHRfcmFtX3Jvd3M9MTYzODQKK2V4dF9yYW1famVkZWM9MjkKK2V4dF9yYW1fdF9yYz00NjA5MAorZXh0X3JhbV90X3JjZF9yZD0xMzA5MAorZXh0X3JhbV90X3JjZF93cj0xMzA5MAorZXh0X3JhbV90X3JwPTEzMDkwCitleHRfcmFtX3RfcmZjPTE2MDAwMAorZXh0X3JhbV90X3Jhcz0zMzAwMAorZXh0X3JhbV9jX3dyX2xhdGVuY3k9MTAKK2V4dF9yYW1fdF9mYXc9MzUwMDAKK2V4dF9yYW1fY19jYXNfbGF0ZW5jeT0xNAorZGRyM19tZW1fZ3JhZGU9MHgxNDE0MTQKKworIyMgYWRkcmVzcyBvciBiYW5rIGFkZHJlc3Mgc3dhcCBleGFtcGxlCisjc3dhcHMgYXJlIGZvdW5kIGluIGJjbTg4eHh4X2JvYXJkLnNvYworI2V4dF9yYW1fYWRkcl9iYW5rX3N3YXBfZHJhbVhfYml0WT1NCisKKyMjIGRxIHN3YXAgZXhhbXBsZQorI3N3YXBzIGFyZSBmb3VuZCBpbiBiY204OHh4eF9ib2FyZC5zb2MKKyNiaXQgc3dhcCBleGFtcGxlOgorI2V4dF9yYW1fZHFfc3dhcF9kcmFtWF9ieXRlWV9iaXRaPU0KKyNieXRlIHN3YXAgZXhhbXBsZToKKyNleHRfcmFtX2RxX3N3YXBfZHJhbVhfYnl0ZVk9TQorCisjIyBEcmFtIEdlYXIgZG93biBtb2RlLiBWYWxpZCB2YWx1ZXM6IDAgLSBFbmFibGUsIDEgLSBEaXNhYmxlLiBEZWZhdWx0OiAweDAuCitleHRfcmFtX2dlYXJfZG93bl9tb2RlLkJDTTg4Njc1PTAKKworIyMgQWxlcnRfbiBkZS1hc3NlcnRpb24gcGVyaW9kIGFib3ZlIHdoaWNoIGVycm9yIGlzIGNvbnNpZGVyZWQgcGFyaXR5IGVycm9yCisjZXh0X3JhbV9hbGVydF9uX3BlcmlvZF90aHJzLkJDTTg4Njc1PTIwCisKKyMjIERyYW0gQWRkcmVzcyBidXMgaW52ZXJzaW9uLiBWYWxpZCB2YWx1ZXM6IDAgLSBFbmFibGUsIDEgLSBEaXNhYmxlLiBEZWZhdWx0OiAweDAuCisjIyB0aGlzIHNvYyBpcyBjb25maWd1cmVkIGluIHBlciBib2FyZCBzb2MgZmlsZSAoYmNtODh4N3hfYm9hcmQuc29jKQorI2V4dF9yYW1fYWJpLkJDTTg4Njc1PTAKKworIyMgRGF0YSBidXMgaW52ZXJzaW9uIG9uIHdyaXRlL3JlYWQgZGlyZWN0aW9uLiBWYWxpZCB2YWx1ZXM6IDAgLSBEaXNhYmxlLCAxIC0gRW5hYmxlLiBEZWZhdWx0OiAweDAuCisjIyB0aG9zZSBzb2NzIGFyZSBjb25maWd1cmVkIGluIHBlciBib2FyZCBzb2MgZmlsZSAoYmNtODh4N3hfYm9hcmQuc29jKQorI2V4dF9yYW1fd3JpdGVfZGJpLkJDTTg4Njc1PTAKKyNleHRfcmFtX3JlYWRfZGJpLkJDTTg4Njc1PTAKKworIyMgRW5hYmxlIHdyaXRlL3JlYWQgQ1JDIChERFI0IGRvZXMgbm90IHN1cHBvcnQgcmVhZCBDUkMpLiBEZWZhdWx0OiAweDAuCisjIyB0aG9zZSBzb2NzIGFyZSBjb25maWd1cmVkIGluIHBlciBib2FyZCBzb2MgZmlsZSAoYmNtODh4N3hfYm9hcmQuc29jKQorI2V4dF9yYW1fd3JpdGVfY3JjLkJDTTg4Njc1PTEKKyNleHRfcmFtX3JlYWRfY3JjLkJDTTg4Njc1PTAKKworIyMgQ29tbWFuZCBwYXJpdHkgbGF0ZW5jeS4gVmFsaWQgdmFsdWVzOiAwIC0gRGlzYWJsZSwgNCw1IG9yIDYgLSBWYWxpZCB2YWx1ZXMuIERlZmF1bHQ6IDB4MC4KKyMjIHRoaXMgc29jIGlzIGNvbmZpZ3VyZWQgaW4gcGVyIGJvYXJkIHNvYyBmaWxlIChiY204OHg3eF9ib2FyZC5zb2MpCisjZXh0X3JhbV9jbWRfcGFyX2xhdGVuY3kuQkNNODg2NzU9NgorCisjIERSQU0gcHJlLWNvbmZpZ3VyYXRpb25zIGFjY29yZGluZyB0byBjb25maWcgdmFyaWFibGVzIHdoaWNoIGRlZmluZXMKKyMgRHJhbSBUeXBlLiBCQ004ODY1MCBzdXBwb3J0cyBvbmx5IEREUjMuCisjIERyYW0gVHlwZS4gQkNNODg2NzUgc3VwcG9ydHMgRERSNCBhbmQgR0REUjUuCitleHRfcmFtX3R5cGUuQkNNODg2NTA9RERSMworIyMgdGhpcyBzb2MgaXMgY29uZmlndXJlZCBpbiBwZXIgYm9hcmQgc29jIGZpbGUgKGJjbTg4eDd4X2JvYXJkLnNvYykKKyNleHRfcmFtX3R5cGUuQkNNODg2NzU9RERSNAorCisjIFRvdGFsIERyYW0gU2l6ZSAoTUJ5dGVzKQorIyBGb3IgOCBkcmFtcyBpbnRlcmZhY2VzLCAyIGNoYW5uZWwgZWFjaCwgRWFjaCBjaGFubmVsIDJHYml0IERyYW0uIHRoZSB0b3RhbCBEUkFNIHNpemUgaXMgMzJHQml0cz00MDAwTUJ5dGVzLgorZXh0X3JhbV90b3RhbF9zaXplLkJDTTg4NjUwPTQwMDAKKyMjIHRoaXMgc29jIGlzIGNvbmZpZ3VyZWQgaW4gcGVyIGJvYXJkIHNvYyBmaWxlIChiY204OHg3eF9ib2FyZC5zb2MpCisjZXh0X3JhbV90b3RhbF9zaXplLkJDTTg4Njc1PTgwMDAKKworIyBUb3RhbCBidWZmZXIgc2l6ZSBhbGxvY2F0ZWQgZm9yIFVzZXIgYnVmZmVyLiBVbml0czogTWJ5dGVzLiBEZWZhdWx0OiAnMHgwJy4KKyMgU3VwcG9ydGVkIHN1ZmZpeDoKKyMgICAgICAgZHJhbSAtIHRoZSBidWZmZXIgc2l6ZSB3aWxsIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgRFJBTSBzaXplIGF2YWlsYWJsZSBmb3IgcGFja2V0IG1lbW9yeS4KKyN1c2VyX2J1ZmZlcl9zaXplPTAKKyN1c2VyX2J1ZmZlcl9zaXplX2RyYW09NTAKKworIyBEUkFNIENsYW1TaGVsbCAoaW50ZXJmYWNlIHN3YXAgaXRzIEhXIFBJTiBwYWlycyBkdXJpbmcgaW5pdC4pCisjIE5vdGU6IE9ubHkgb25lIG9mIERSQU1zIGNhbiBoYXZlIGl0cyBQSU4gc3dhcHBlZAorIyBWYWxpZCB2YWx1ZXM6IDAvMQorI2RyYW0wX2NsYW1zaGVsbF9lbmFibGUuQkNNODg2NTA9MQorI2RyYW0xX2NsYW1zaGVsbF9lbmFibGUuQkNNODg2NTA9MQorCisjIERSQU0gbWF4aW11bSBudW1iZXIgb2YgY3JjIGVycm9yIHBlciBidWZmZXIsIGJ1ZmZlciBkZWxldGVkIGJ5IGludGVycnVwdCBhcHBsaWNhdGlvbi4KKyNkcmFtX2NyY19kZWxfYnVmZmVyX21heF9yZWNsYWltcz0wCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb25maWcgdmFyaWFibGUgYmVsb3cgYXJlIG9ubHkgYWNjZXNzZWQgZnJvbSBkdW5lLnNvYywgYW5kIGFyZSB1c2VkIHRvCisjIGNvbmZpZ3VyZSBCU1AgLyBleGFtcGxlIGFwcGxpY2F0aW9uIC8gZ3JvdXAgb2YgZm9ybWFsIGNvbmZpZyB2YXJpYWJsZXMuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMgSWYgc2V0LCBhbHdheXMgY29uZmlndXJlcyBzeW50aGVzaXplcnMsIGV2ZW4gaWYgdGhlIGNvbmZpZ3VyZWQgcmF0ZSBpcyBlcXVhbCB0bworIyMgdGhlaXIgbm9taW5hbCByYXRlLiBDYW4gYmUgZGlzYWJsZWQgdG8gc3BlZWR1cCBicmluZ3VwIHRpbWUgKGtlZXAgaW4gbWluZCB0aGF0IGlmCisjIyBkaXNhYmxlZCwgY2hhbmdpbmcgYSBzeW50IHRvIGEgbm9uLW5vbWluYWwgZnJlcSBhbmQgdGhhbiBiYWNrIHRvIG5vbWluYWwgd2lsbCBub3QKKyMjIHdvcmsKKyNzeW50X292ZXIuQkNNODg2NTA9MQorCisjIExvY2FsIHZhcmlhYmxlcyBmb3IgYm9hcmQgc3ludGhlc2l6ZXJzIGZyZXEuIEZhYnJpYywgY29tYm8gYW5kIG5pZiBhbHNvIGNvbmZpZ3VyZQorIyB0aGUgKl9yZWZfY2xvY2sgc29jIHByb3BlcnRpZXMgZm9yIHRoZXNlIGZyZXF1ZW5jaWVzLiBjb3JlLCBkZHIgYW5kIHBoeSBvbmx5CisjIGNvbmZpZ3VyZXMgdGhlIHN5bnRoZXNpemVyCitzeW50X2NvcmUuQkNNODg2NTA9MTAwMDAwMDAwCitzeW50X2Rkci5CQ004ODY1MD0xMjUwMDAwMDAKK3N5bnRfcGh5LkJDTTg4NjUwPTE1NjI1MDAwMAorIyBpbiBKZXJpY2hvLCB0aGlzIGZyZXEgaXMgdXNlZCBvbmx5IGZvciB0aGUgY29yZSBzeW50aAorc3ludGhfZHJhbV9mcmVxLkJDTTg4NjUwPTI1CisKKyNDb25maWd1cmUgdGhlIHJlZmVyZW5jZSBjbG9jayBmcmVxdWVuY2llcyBmb3IgTklGIGFuZCBGYWJyaWMgU2VyRGVzCisjIE9wdGlvbnM6ICAwIC0gMTI1TUh6LCAxIC0gMTU2LjI1TUh6LCAtMSAtIERpc2FibGUKK3NlcmRlc19uaWZfY2xrX2ZyZXEuQkNNODg2NTA9MQorc2VyZGVzX2ZhYnJpY19jbGtfZnJlcS5CQ004ODY1MD0xCisjc2VyZGVzX25pZl9jbGtfZnJlcS5CQ004ODI3MD0tMQorI3NlcmRlc19mYWJyaWNfY2xrX2ZyZXEuQkNNODgyNzA9LTEKK3NlcmRlc19uaWZfY2xrX2ZyZXEuQkNNODIwNj0tMQorc2VyZGVzX2ZhYnJpY19jbGtfZnJlcS5CQ004MjA2PS0xCisjc2VyZGVzX25pZl9jbGtfZnJlcV9vdXQwLkJDTTg4Njc1PTEKKyNzZXJkZXNfbmlmX2Nsa19mcmVxX291dDEuQkNNODg2NzU9MQorI3NlcmRlc19uaWZfY2xrX2ZyZXFfb3V0Mi5CQ004ODY3NT0xCisjc2VyZGVzX25pZl9jbGtfZnJlcV9pbjAuQkNNODg2NzU9MQorI3NlcmRlc19uaWZfY2xrX2ZyZXFfaW4xLkJDTTg4Njc1PTEKKyNzZXJkZXNfbmlmX2Nsa19mcmVxX2luMi5CQ004ODY3NT0xCisjc2VyZGVzX2ZhYnJpY19jbGtfZnJlcV9vdXQwLkJDTTg4Njc1PTEKKyNzZXJkZXNfZmFicmljX2Nsa19mcmVxX291dDEuQkNNODg2NzU9MQorI3NlcmRlc19mYWJyaWNfY2xrX2ZyZXFfaW4wLkJDTTg4Njc1PTEKKyNzZXJkZXNfZmFicmljX2Nsa19mcmVxX2luMS5CQ004ODY3NT0xCisKKworIyBJRUVFIDE1ODggLyBCcm9hZHN5bmMgLQorIyBjb25maWd1cmUgY2xvY2sgOgorIyAgRFBMTCBtb2RlL2xvY2s6IDAgLSBlY2kgdHMgcGxsIGNsayBkaXNhYmxlZCwgMSAtIGNvbmZpZ3VyZSBlY2kgdHMgcGxsIGNsaworIyAgRFBMTCBwaGFzZS9mcmVxLiBEZWZhdWx0IGluaXRpYWw6IGxvID0gMHg0MDAwMDAwMCwgaGkgPSAweDEwMDAwMDAwLgorI3BoeV8xNTg4X2RwbGxfZnJlcXVlbmN5X2xvY2suQkNNODg2NTA9MQorI3BoeV8xNTg4X2RwbGxfcGhhc2VfaW5pdGlhbF9sby5CQ004ODY1MD0weDQwMDAwMDAwCisjcGh5XzE1ODhfZHBsbF9waGFzZV9pbml0aWFsX2hpLkJDTTg4NjUwPTB4MTAwMDAwMDAKKyMgSUVFRSAxNTg4IC0KKyMgcG9ydCBleHRlcm5hbCBNQUMKKyMgIGluZGljYXRpb24gd2hldGhlciBleHRlcm5hbCBNQUMgZXhpc3RzIG9yIG5vdC4KKyMgIDA6IDE1ODggZXh0ZXJuYWwgTUFDIGRvZXMgbm90IGV4aXN0CisjICAxOiAxNTg4IGV4dGVybmFsIE1BQyBleGlzdHMKKyMgIHRoZSBleHRlcm5hbCBNQUMgc3Vic3RyYWN0cyB0aGUgUlggdGltZSBmcm9tIHRoZSBjb3JyZWN0aW9uIGZpZWxkCisjICBhbmQgYWRkcyB0aGUgVFggdGltZSB0byB0aGUgY29ycmVjdGlvbiBmaWVsZC4KKyNleHRfMTU4OF9tYWNfZW5hYmxlXzE0LkJDTTg4NjUwPTEKKyMgIElmIHNldCwgNDggYml0cyBzdGFtcGluZyBpcyB1c2VkIGZvciAxNTg4IHBhY2tldHMuIG90aGVyd2lzZSAzMiBiaXQgc3RhbXBpbmcgaXMgdXNlZAorIyAgMDogMTU4OCAzMmIgc3RhbXBpbmcgKERlZmF1bHQpCisjICAxOiAxNTg4IDQ4YiBzdGFtcGluZworI2JjbTg4NjYwXzE1ODhfNDhiX3N0YW1waW5nX2VuYWJsZS5CQ004ODY2MD0xCisKKyMjIFRyaWxsIGNvbmZpZ3VyYXRpb25zCisjIFRyaWxsIG1vZGU6IDAgKGRpc2FibGVkKSAvIDEgKGNvYXJzZS1ncmFpbmVkKSAvIDIgKGZpbmUtZ3JhaW5lZCkKKyN0cmlsbF9tb2RlLkJDTTg4NjUwPTEKKworIyBUcmlsbCBtdWx0aWNhc3QgcHJ1bm5pbmcgbW9kZToKKyMgMDogbm8gcHJ1bm5pbmcgLSB2c2kgaXMgbm90IHBhcnQgb2YgdGhlIGtleQorIyAxOiBWU0kgcHJ1bm5pbmc6IEtleSBpcyBkaXN0LXRyZWUsZXNhZGl0LWJpdCxWU0kuCit0cmlsbF9tY19wcnVuZV9tb2RlLkJDTTg4NjUwPTAKKworIyBFbmFibGUgU0EgYXV0aGVudGljYXRpb24KKyNzYV9hdXRoX2VuYWJsZWQ9MQorCisjIEJyaWRnZSBkZWZhdWx0IGxvZ2ljYWwgaW50ZXJmYWNlcyBhbGxvY2F0aW9uIElEUworbG9naWNhbF9wb3J0X2wyX2JyaWRnZS5CQ004ODY1MD0wCitsb2dpY2FsX3BvcnRfZHJvcC5CQ004ODY1MD0xCisKKyNsb2dpY2FsX3BvcnRfbWltX2luLkJDTTg4NjUwPTIKKyNsb2dpY2FsX3BvcnRfbWltX291dC5CQ004ODY1MD00MDk2CisKKyMgRW5hYmxlIEVWQiBhcHBsaWNhdGlvbgorI2V2Yl9lbmFibGU9MQorCisjIEVuYWJsZSBGbGV4aWJsZSBRaW5RIGFwcGxpY2F0aW9uCisjdmxhbl90cmFuc2xhdGlvbl9tYXRjaF9pcHY0PTEKKworIyBFbmFibGUgcHJlc2VsIG1nbXQgYWR2YW5jZSBtb2RlCisjZmllbGRfcHJlc2VsX21nbXRfYWR2YW5jZWRfbW9kZT0xCisKKyMgRW5hYmxlIElUTUggcHJvZ3JhbW1hYmxlIG1vZGUKKyMgSVRNSCBwcm9jZXNzaW5nIGZ1bGx5IHByb2dyYW1tYWJsZSAobm90IGZpeGVkKSBieSB1c2luZyB0aGUgRlAgQVBJcy4gCisjIEluIHRoaXMgbW9kZSBJVE1IIHByb2Nlc3NpbmcgdXNlcyB0aGUgVENBTS9kaXJlY3QgdGFibGUgZm9yIFRNIHByb2dyYW1zIGxvb2t1cCwgaW4gc2FtZSBtYW5uZXIgYXMgRXRoZXJuZXQgZnJhbWVzLgoraXRtaF9wcm9ncmFtbWFibGVfbW9kZV9lbmFibGUuQkNNODg2NzU9MQoraXRtaF9wcm9ncmFtbWFibGVfbW9kZV9lbmFibGUuQkNNODg0NzA9MQoraXRtaF9wcm9ncmFtbWFibGVfbW9kZV9lbmFibGUuQkNNODgyNzA9MQoraXRtaF9wcm9ncmFtbWFibGVfbW9kZV9lbmFibGUuQkNNODg2ODA9MQorCisKKworIyBQcmVwZW5kIHRhZyB0byBiZSA0IGJ5dGVzIG9yIDggYnl0ZXMuIERlZmF1bHQ6IDRCLgorIyBBcHBsaWNhYmxlIG9ubHkgZnJvbSBBUkFEKworI3ByZXBlbmRfdGFnX2J5dGVzPTRCCisKKyMgVGhlIFByZXBlbmQgVGFnIGlzIGxvY2F0ZWQgYXQgKDEyICsgMipvZmZzZXQpIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQuCisjIFJhbmdlOiAwLTcuIERlZmF1bHQ6IDAKKyNwcmVwZW5kX3RhZ19vZmZzZXQ9MAorCisjIEVuYWJsZSBBUlAgKG5leHQgaG9wIG1hYyBleHRlbnNpb24pIGZlYXR1cmUKK2JjbTg4Nnh4X25leHRfaG9wX21hY19leHRlbnNpb25fZW5hYmxlLkJDTTg4NjUwPTEKKworIyBTZXQgVkxBTiB0cmFuc2xhdGUgbW9kZS4KKyMgMDogbm9ybWFsCisjIDE6IGFkdmFuY2VkIG1vZGUuIEVuYWJsZSB2bGFuIGVkaXQgc2V0dGluZ3Mgd2l0aCBlbmhhbmNlZCB1c2VyIGNvbnRyb2wKKyNiY204ODZ4eF92bGFuX3RyYW5zbGF0ZV9tb2RlPTAKKworIyBTZXQgTVBMUyB0ZXJtaW5hdGlvbiBkYXRhYmFzZSBtb2RlCisjIFNldCBNUExTIGRhdGFiYXNlcyBsb2NhdGlvbiBmb3IgZWFjaCBNUExTIG5hbWVzcGFjZSAoTDEsTDIsTDMpCisjYmNtODg2eHhfbXBsc190ZXJtaW5hdGlvbl9kYXRhYmFzZV9tb2RlPTAKKworIyBFbmFibGUgLCBEaXNhYmxlIE1QTFMgaW5kZXhlZC4KKyMgTVBMUyB0ZXJtaW5hdGlvbiB3aXRoIGtub3duIGxhYmVsIHN0YWNrIGxvY2F0aW9uLgorIyBNdXN0IGJlIGVuYWJsZWQgaW4gY2FzZSBkZXZpY2Ugc3VwcG9ydHMgbW9yZSB0aGFuIDIgTVBMUyBsYWJlbCB0ZXJtaW5hdGlvbnMgKEwxLEwyLEwzKQorI21wbHNfdGVybWluYXRpb25fbGFiZWxfaW5kZXhfZW5hYmxlPTEKKworIyBFbmFibGUgRmFzdFJlUm91dGUgbGFiZWxzIGluIGRldmljZS4KKyNmYXN0X3Jlcm91dGVfbGFiZWxzX2VuYWJsZT0wCisKKyMgRW5hYmxlIE1QTFMgQ29udGV4dCBzcGVjaWZpYy4gVXBzdHJlYW0gbGFiZWwgYXNzaWdubWVudCBpbiBkZXZpY2UuCisjbXBsc19jb250ZXh0X3NwZWNpZmljX2xhYmVsX2VuYWJsZT0wCisKKyMgTVBMUyBjb250ZXh0LgorIyBDYW4gYmUgZ2xvYmFsLCBwZXIgcG9ydCAsIHBlciBpbnRlcmZhY2Ugb3IgcGVyIHBvcnQsaW50ZXJmYWNlLgorI21wbHNfY29udGV4dD1nbG9iYWwKKworIyBNUExTIFRQIE1DIHJlc2VydmVkIG1hYyBhZGRyZXNzICgwMS0wMC01RS05MC0wMC0wMCkuCisjIElmIHNldCBkZXZpY2Ugd2lsbCBzdXBwb3J0IE15LU1BQyB0ZXJtaW5hdGlvbiBvZiByZXNlcnZlZCBNQyBFdGhlcm5ldAorI21wbHNfdHBfbXltYWNfcmVzZXJ2ZWRfYWRkcmVzcz0wCisKKyMgTVBMUyBFTEkgZW5hYmxlIGRpc2FibGUKK21wbHNfZW50cm9weV9sYWJlbF9pbmRpY2F0b3JfZW5hYmxlPTAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjY2ZnIGZvciBCQ004ODIwMiAtIEFyZG9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjQ29yZSBjbG9jayBhbmQgc3lzdGVtIHJlZmVyZW5jZSBjbG9jayAoS0h6KQorY29yZV9jbG9ja19zcGVlZF9raHouQkNNODgyMDI9NDUwMDAwCitzeXN0ZW1fcmVmX2NvcmVfY2xvY2tfa2h6LkJDTTg4MjAyPTEyMDAwMDAKKworIyMgU2V0IFRNIGFzIGRldmljZSBtb2RlCitmYXBfZGV2aWNlX21vZGUuQkNNODgyMDI9VE0KKworIyMgU2V0IENQVSBwb3J0cyBoZWFkZXIgdHlwZQordG1fcG9ydF9oZWFkZXJfdHlwZV9pbl8wLkJDTTg4MjAyPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8wLkJDTTg4MjAyPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMC5CQ004ODIwMj1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjAwLkJDTTg4MjAyPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMS5CQ004ODIwMj1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjAxLkJDTTg4MjAyPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMi5CQ004ODIwMj1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjAyLkJDTTg4MjAyPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX2luXzIwMy5CQ004ODIwMj1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV9vdXRfMjAzLkJDTTg4MjAyPVRNCisKKyMjIyMjIEFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24KKyMjIyBEZWZhdWx0IFNESyBBcHBsaWNhdGlvbgordWNvZGVfcG9ydF8xLkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4wCit1Y29kZV9wb3J0XzEzLkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4xCit1Y29kZV9wb3J0XzE0LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4yCit1Y29kZV9wb3J0XzE1LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4zCit1Y29kZV9wb3J0XzE2LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC40Cit1Y29kZV9wb3J0XzE3LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC41CisKKyMjIyBQb3J0T3ByaW9yaXR5IChhZGRpdG9uYWwgcG9ydHMgY2FuIGJlIGFkZGVkKQorI2RpYWdfY29zcV9kaXNhYmxlLkJDTTg4MjAyPTEKKyN1Y29kZV9wb3J0XzEuQkNNODgyMDI9SUdOT1JFCisjdWNvZGVfcG9ydF8xMy5CQ004ODIwMj1JR05PUkUKKyN1Y29kZV9wb3J0XzE0LkJDTTg4MjAyPUlHTk9SRQorI3Vjb2RlX3BvcnRfMTUuQkNNODgyMDI9SUdOT1JFCisjdWNvZGVfcG9ydF8xNi5CQ004ODIwMj1JR05PUkUKKyN1Y29kZV9wb3J0XzE3LkJDTTg4MjAyPUlHTk9SRQorI3Vjb2RlX3BvcnRfMS5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMAorI3Vjb2RlX3BvcnRfMi5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMQorI3Vjb2RlX3BvcnRfMy5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMgorI3Vjb2RlX3BvcnRfNC5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMworI3Vjb2RlX3BvcnRfNS5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuNAorI3Vjb2RlX3BvcnRfNi5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuNQorI3Vjb2RlX3BvcnRfNy5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuNgorI3Vjb2RlX3BvcnRfOC5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuNworI3Vjb2RlX3BvcnRfOS5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuOAorI3Vjb2RlX3BvcnRfMTAuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjkKKyN1Y29kZV9wb3J0XzExLkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4xMAorI3Vjb2RlX3BvcnRfMTIuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjExCisjdWNvZGVfcG9ydF8xMy5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMTIKKyN1Y29kZV9wb3J0XzE0LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4xMworI3Vjb2RlX3BvcnRfMTUuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjE0CisjdWNvZGVfcG9ydF8xNi5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMTUKKyN1Y29kZV9wb3J0XzE3LkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4xNgorI3Vjb2RlX3BvcnRfMTguQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjE3CisjdWNvZGVfcG9ydF8xOS5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMTgKKyN1Y29kZV9wb3J0XzIwLkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4xOQorI3Vjb2RlX3BvcnRfMjEuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjIwCisjdWNvZGVfcG9ydF8yMi5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMjEKKyN1Y29kZV9wb3J0XzIzLkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4yMgorI3Vjb2RlX3BvcnRfMjQuQkNNODgyMDI9VE1fSU5URVJOQUxfUEtULjIzCisjdWNvZGVfcG9ydF8yNS5CQ004ODIwMj1UTV9JTlRFUk5BTF9QS1QuMjQKKworI2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEuQkNNODgyMDI9MQorI2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzIuQkNNODgyMDI9MQorI2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzMuQkNNODgyMDI9MQorI2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzQuQkNNODgyMDI9MQorI2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzUuQkNNODgyMDI9MQorI2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzYuQkNNODgyMDI9MQorI2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzcuQkNNODgyMDI9MQorI2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzguQkNNODgyMDI9MQorI2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzkuQkNNODgyMDI9MQorI2R0bV9mbG93X25vZl9yZW1vdGVfY29yZXNfcmVnaW9uXzEwLkJDTTg4MjAyPTEKKworIyMjIFByaW9yaXR5T1BvcnQKKyNkaWFnX2Nvc3FfZGlzYWJsZS5CQ004ODIwMj0xCisjc3RhY2tfZW5hYmxlLkJDTTg4MjAyPTAKKyN1Y29kZV9wb3J0XzE3LkJDTTg4MjAyPUlHTk9SRQorI3Vjb2RlX3BvcnRfMTYuQkNNODgyMDI9SUdOT1JFCisjdWNvZGVfcG9ydF8xNS5CQ004ODIwMj1JR05PUkUKKyN1Y29kZV9wb3J0XzE0LkJDTTg4MjAyPUlHTk9SRQorI3Vjb2RlX3BvcnRfMTMuQkNNODgyMDI9SUdOT1JFCisjdWNvZGVfcG9ydF8xLkJDTTg4MjAyPVRNX0lOVEVSTkFMX1BLVC4wCisKKyMjIENyZWRpdCB3b3J0aCByZXNvbHV0aW9uIChGaXggdGhlIEludGVyZmFjZSByYXRlKQorY3JlZGl0X3dvcnRoX3Jlc29sdXRpb24uQkNNODgyMDI9bWVkaXVtCisKKyMjIyBJbnRlcnJ1cHRzCitwb2xsZWRfaXJxX21vZGUuQkNNODgyMDI9MQorCisjIyBUbyB1c2UgTUMtSUQgaW4gdGhlIHJhbmdlIG9mIDwgMjU1CitlZ3Jlc3NfbXVsdGljYXN0X2RpcmVjdF9iaXRtYXBfbWF4LkJDTTg4MjAyPTI1NQorCisjIyMgRmxvdyBDb250cm9sCisjIyBFbmFibGUgRmxvdyBDb250cm9sIHRvIENMIFNDSC4gUmVsZXZhbnQgb25seSB0byBQcmlvcml0eSBPdmVyIFBvcnQgYXBwbGljYXRpb24KKyMjIFZhbGlkIHZhbHVlczogMSAtIEVuYWJsZSwgMCAtIERpc2FibGUuIERlZmF1bHQ6IDB4MC4KK2N1c3RvbV9mZWF0dXJlX2NsX3NjaGVkdWxlcl9mYy5CQ004ODIwMj0xCisKKyMjIFZhbGlkIHZhbHVlczogMSAtIEVuYWJsZSwgMCAtIERpc2FibGUuIERlZmF1bHQ6IDB4MC4KKyNjdXN0b21fZmVhdHVyZV9oaWdoX3ZzaV9mcC5CQ004ODY2MD0wCisKKyMjIFVzZSBsb3dlciBDTC4gQXJkb24gRkMgaXMgbWFwcGVkIHRvIENMIDAtMjU1LgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl82NS5CQ004ODIwMj0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzY2LkJDTTg4MjAyPTEKKworIyMjIFN0YXRpc3RpYy1SZXBvcnQgUHJvcGVydGllcworc3RhdF9pZl9lbmFibGUuQkNNODgyMDI9MQorc3RhdF9pZl9yYXRlLkJDTTg4MjAyPTEwMDAwCitzdGF0X2lmX3BrdF9zaXplLkJDTTg4MjAyPTEyNkIKKyMjIFNldCB0aGUgU3RhdGlzdGljLVJlcG9ydCBtb2RlCitzdGF0X2lmX3JlcG9ydF9tb2RlLkJDTTg4MjAyPVFTSVpFCisjIyBFbmFibGUgc3RhdGlzdGljcyByZXBvcnRzIG9uIEVuUXVldWUuIFZhbGlkIHZhbHVlZDogMC8xLiBEZWZhdWx0OiAnMScuCitzdGF0X2lmX3JlcG9ydF9lbnF1ZXVlX2VuYWJsZS5CQ004ODIwMj0xCisjIyBFbmFibGUgc3RhdGlzdGljcyByZXBvcnRzIG9uIERlUXVldWUuIFZhbGlkIHZhbHVlZDogMC8xLiBEZWZhdWx0OiAnMScuCitzdGF0X2lmX3JlcG9ydF9kZXF1ZXVlX2VuYWJsZS5CQ004ODIwMj0xCisKKyMjIERpc2FibGUgcmVtb3ZlZCBmZWF0dXJlcworcGh5XzE1ODhfZHBsbF9mcmVxdWVuY3lfbG9jay5CQ004ODIwMj0wCitsb3dfcG93ZXJfbmlmX21hYy5CQ004ODIwMj0wCitsb3dfcG93ZXJfZmFicmljX21hYy5CQ004ODIwMj0wCitjdXN0b21fZmVhdHVyZV9uaWZfcmVjb3ZlcnlfZW5hYmxlLkJDTTg4MjAyPTAKK3BoeV9udWxsLkJDTTg4MjAyPTAKKworIyMgRGlzYWJsZSBjb3VudGVyIHRocmVhZAorYmNtX3N0YXRfaW50ZXJ2YWwuQkNNODgyMDI9MAorI2JjbV9zdGF0X3N5bmNfdGltZW91dC5CQ004ODIwMj0weGZmZmZmZmYKKworIyMjIEVNVUwgY2hhbmdlcworI2RpYWdfZW11bGF0b3JfcGFydGlhbF9pbml0LkJDTTg4MjAyPTEKKyNzY2hhbl90aW1lb3V0X3VzZWMuQkNNODgyMDI9MHg3ZmZmZmZmZgorI3RkbWFfdGltZW91dF91c2VjLkJDTTg4MjAyPTB4N2ZmZmZmZmYKKyN0c2xhbV90aW1lb3V0X3VzZWMuQkNNODgyMDI9MHg3ZmZmZmZmZgorI3BoeV9udWxsLkJDTTg4MjAyPTAKKworIyMjIERpc2FibGUgRE1BCisjdGRtYV90aW1lb3V0X3VzZWMuQkNNODgyMDI9MAorI3RzbGFtX3RpbWVvdXRfdXNlYy5CQ004ODIwMj0wCisjdGFibGVfZG1hX2VuYWJsZS5CQ004ODIwMj0wCisjdHNsYW1fZG1hX2VuYWJsZS5CQ004ODIwMj0wCisKKyMjIyBEcmFtIHNldHVwCisjIE51bWJlciBvZiBleHRlcm5hbCBEUkFNcy4KKyMgQWxsb3dlZCB2YWx1ZXMgZm9yIDg4MjAyOiAwIC8gMSAoRHJhbSBEKSAvIDIgKERyYW0ncyBDLCBEKSAvIDMgKERyYW0ncyBCLCBDLCBEKSAvIDQgKERyYW0ncyBBLCBCLCBDLCBEKSAvCitleHRfcmFtX3ByZXNlbnQuQkNNODgyMDI9MAorCisjIyMgVG90YWwgc2l6ZSBvZiByYW0KK2V4dF9yYW1fdG90YWxfc2l6ZS5CQ004ODIwMj0yMDAwCisKKyMjIyBPQ0IKK2JjbTg4Nnh4X29jYl9kYXRhYnVmZmVyX3NpemUuQkNNODgyMDI9MTAyNAorCisjIERSQU0gZnJlcXVlbmN5IChEUS8yKQorZXh0X3JhbV9mcmVxLkJDTTg4MjAyPTEyMDAKKworIyBEcmFtIFR5cGUuIEFyZG9uIHN1cHBvcnRzIG9ubHkgRERSNC4KK2V4dF9yYW1fdHlwZS5CQ004ODIwMj1ERFI0CisKKyMjIyBEcmFtIEZlYXR1cmVzCisKKyMjIERyYW0gR2VhciBkb3duIG1vZGUuIFZhbGlkIHZhbHVlczogMCAtIEVuYWJsZSwgMSAtIERpc2FibGUuIERlZmF1bHQ6IDB4MC4KKyNleHRfcmFtX2dlYXJfZG93bl9tb2RlLkJDTTg4MjAyPTEKKworIyMgQWxlcnRfbiBkZS1hc3NlcnRpb24gcGVyaW9kIGFib3ZlIHdoaWNoIGVycm9yIGlzIGNvbnNpZGVyZWQgcGFyaXR5IGVycm9yCisjZXh0X3JhbV9hbGVydF9uX3BlcmlvZF90aHJzLkJDTTg4MjAyPTAKKworIyMgRHJhbSBBZGRyZXNzIGJ1cyBpbnZlcnNpb24uIFZhbGlkIHZhbHVlczogMCAtIEVuYWJsZSwgMSAtIERpc2FibGUuIERlZmF1bHQ6IDB4MC4KK2V4dF9yYW1fYWJpLkJDTTg4MjAyPTAKKworIyMgRGF0YSBidXMgaW52ZXJzaW9uIG9uIHdyaXRlL3JlYWQgZGlyZWN0aW9uLiBWYWxpZCB2YWx1ZXM6IDAgLSBEaXNhYmxlLCAxIC0gRW5hYmxlLiBEZWZhdWx0OiAweDAuCitleHRfcmFtX3dyaXRlX2RiaS5CQ004ODIwMj0wCitleHRfcmFtX3JlYWRfZGJpLkJDTTg4MjAyPTAKKworIyMgRW5hYmxlIHdyaXRlL3JlYWQgQ1JDIChERFI0IGRvZXMgbm90IHN1cHBvcnQgcmVhZCBDUkMpLiBEZWZhdWx0OiAweDAuCisjZXh0X3JhbV93cml0ZV9jcmM9LkJDTTg4MjAyMQorI2V4dF9yYW1fcmVhZF9jcmM9LkJDTTg4MjAyMQorCisjIyBDb21tYW5kIHBhcml0eSBsYXRlbmN5LiBWYWxpZCB2YWx1ZXM6IDAgLSBFbmFibGUsIDEgLSBEaXNhYmxlLiBEZWZhdWx0OiAweDAuCitleHRfcmFtX2NtZF9wYXJfbGF0ZW5jeS5CQ004ODIwMj02CisKKyMjIERSQU0gQ2xhbVNoZWxsIChpbnRlcmZhY2Ugc3dhcCBpdHMgSFcgUElOIHBhaXJzIGR1cmluZyBpbml0LikKKyMgTm90ZTogT25seSBvbmUgb2YgRFJBTXMgY2FuIGhhdmUgaXRzIFBJTiBzd2FwcGVkKS4gVmFsaWQgdmFsdWVzOiAwLzEuCitkcmFtMV9jbGFtc2hlbGxfZW5hYmxlXzAuQkNNODgyMDI9MQorZHJhbTFfY2xhbXNoZWxsX2VuYWJsZV8xLkJDTTg4MjAyPTEKK2RyYW0xX2NsYW1zaGVsbF9lbmFibGVfMi5CQ004ODIwMj0xCitkcmFtMV9jbGFtc2hlbGxfZW5hYmxlXzMuQkNNODgyMDI9MQorCisjIyBEcmFtIERRIFN3YXAuCisjIyBGb3JtYXQ6IGV4dF9yYW1fZHFfc3dhcF9kcmFtWF9ieXRlWV9iaXRaPU0uIE1lYW5zLCBJbiBkcmFtIFgsIEJ5dGUgWSBzd2FwIERRIFogYW5kIE0uIERlZmF1bHQ6IE5vIHN3YXBwaW5nLgorI2V4dF9yYW1fZHFfc3dhcF9kcmFtMV9ieXRlMl9iaXQzLkJDTTg4MjAyPTQKKyNleHRfcmFtX2RxX3N3YXBfZHJhbTRfYnl0ZTNfYml0Mi5CQ004ODIwMj0xCisKKyMjIyBEcmFtIFR1bmluZyAoU2htb28pCitkZHIzX2F1dG9fdHVuZS5CQ004ODIwMj0yCisKKyMjIyBFbmFibGUgQklTVAorIyBSdW4gRHJhbSBCSVNUIG9uIGluaXRpYWxpemF0aW9uLCBpZiBCSVNUIGZhaWwgdGhlIGluaXRpYWxpemF0aW9uIHdpbGwgZmFpbC4gRGVmYXVsdDogMS4KK2Jpc3RfZW5hYmxlX2RyYW0uQkNNODgyMDI9MQorCisjIyMgRmFicmljCisjIyBFbmFibGUgZmFicmljIGxpbmtzCitzZXJkZXNfcXJ0dF9hY3RpdmVfMC5CQ004ODIwMj0xCitzZXJkZXNfcXJ0dF9hY3RpdmVfMS5CQ004ODIwMj0xCitzZXJkZXNfcXJ0dF9hY3RpdmVfMi5CQ004ODIwMj0xCitzZXJkZXNfcXJ0dF9hY3RpdmVfMy5CQ004ODIwMj0xCisKKyMjIEZpcm13YXJlIExvYWQgTWV0aG9kCitsb2FkX2Zpcm13YXJlLkJDTTg4MjAyPTIKKworI1NGSSBzcGVlZCByYXRlCitwb3J0X2luaXRfc3BlZWRfc2ZpLkJDTTg4MjAyPTExNTAwCisKKyNMQyBQTEwgaW4uIERlZmF1bHQ6IDE1Ni4yNU1Iei4KKyN4Z3hzX2xjcGxsX3h0YWxfcmVmY2xrPTEyNQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyNjZmcgZm9yIEJDTTg4NjQwX0EwIC0gUGV0cmEKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2ZvcmNlX2Nsa19tX25fZGl2aXNvcnNfemVyb19uaWYwLkJDTTg4NjQwX0EwPTAKK2ZvcmNlX2Nsa19tX25fZGl2aXNvcnNfemVyb19mYWJyaWMwLkJDTTg4NjQwX0EwPTEKK2ZvcmNlX2Nsa19tX25fZGl2aXNvcnNfemVyb19jb21iMC5CQ004ODY0MF9BMD0wCisKK2NvbWJvX3JlZl9jbG9jay5CQ004ODY0MD0zMTI1MDAKKworbmlmX3JlZl9jbG9jay5CQ004ODY0MF9BMD0zMTI1MDAKKworIyBVc2UgdmFyaWFibGUgY2VsbCBzaXplCitzeXN0ZW1fY2VsbF9mb3JtYXQuQkNNODg2NDBfQTA9VkNTMTI4CisKKyMgQ29yZSBjbG9jayBzcGVlZCAoTUh6KQorY29yZV9jbG9ja19zcGVlZC5CQ004ODY0MF9BMD0zMDAKKworIyBNYXAgYmNtIGxvY2FsIHBvcnQgdG8gQ1BVL05JRiBpbnRlcmZhY2VzCit1Y29kZV9wb3J0XzAuQkNNODg2NDBfQTA9Q1BVLjAKK3Vjb2RlX3BvcnRfNzMuQkNNODg2NDBfQTA9Q1BVLjEKK3Vjb2RlX3BvcnRfNzQuQkNNODg2NDBfQTA9Q1BVLjIKK3Vjb2RlX3BvcnRfNzUuQkNNODg2NDBfQTA9Q1BVLjMKK3Vjb2RlX3BvcnRfNzYuQkNNODg2NDBfQTA9Q1BVLjQKK3Vjb2RlX3BvcnRfNzcuQkNNODg2NDBfQTA9Q1BVLjUKK3Vjb2RlX3BvcnRfNzguQkNNODg2NDBfQTA9Q1BVLjYKKworIyBJbnRlcmxha2VuIHBvcnRzIGJhc2ljIGNvbmZpZ3VyYXRpb24gKHRlbXBvcmFyeSkuCisjIFRoaXMgY29uZmlndXJhdGlvbiByZXBsYWNlcyB0aGUgYWJvdmUgWEFVSS9SWEFVSSBwb3J0cyBjb25maWcKKyMgVGhlIGZvbGxvd2luZyBQQiBkZXNpZ24gY29uc3RyYWludCBpcyBub3QgZW5mb3JjZWQgaW4gU1csIHNvIG11c3QgYmUgdGFrZW4KKyMgY2FyZSBvZiBoZXJlLCB3aGVuIG1hcHBpbmcgcG9ydHMgdG8gaW50ZXJmYWNlczoKKyMgICBJZiB1c2luZyBpbGtuMCwgcG9ydCAxIChpZiB1c2VkKSBtdXN0IGJlIG1hcHBlZCB0byBpbGtuMAorIyAgIElmIHVzaW5nIGlsa24xLCBwb3J0IDIgKGlmIHVzZWQpIG11c3QgYmUgbWFwcGVkIHRvIGlsa24xCisjICAgTm90ZSB0aGF0IGluIG91ciBkZWZhdWx0IG1hcHBpbmcsIHBvcnQgMiBpcyBtYXBwZWQgdG8gUlhBVUkgNiwgdGh1cyB3b24ndAorIyAgIHdvcmsuIElmIG9uZSB3YW50cyB0byB1c2UgZnJvbnQgcGFuZWwgcG9ydCAyIHdpdGggaWxrbjEsIGhlIHNob3VsZCBiZSBtYXAKKyMgICBSQVhVSTYgdG8gYSBwb3J0ICE9IDIuCisjaWxrbl9udW1fbGFuZXNfMC5CQ004ODY0MF9BMD0xMgorI3Vjb2RlX3BvcnRfMS5CQ004ODY0MF9BMD1JTEtOMC4wCisjdWNvZGVfcG9ydF8yLkJDTTg4NjQwX0EwPUlMS04wLjEKKyN1Y29kZV9wb3J0XzMuQkNNODg2NDBfQTA9SUxLTjAuMgorI2lsa25fbnVtX2xhbmVzXzEuQkNNODg2NDBfQTA9MTIKKyN1Y29kZV9wb3J0XzQuQkNNODg2NDBfQTA9UlhBVUk2CisjdWNvZGVfcG9ydF81LkJDTTg4NjQwX0EwPUlMS04xLjAKKyN1Y29kZV9wb3J0XzYuQkNNODg2NDBfQTA9SUxLTjEuMQorI3Vjb2RlX3BvcnRfNy5CQ004ODY0MF9BMD1JTEtOMS4yCisKKyMgRGVmYXVsdCBoZWFkZXIgdHlwZSBpcyBkZXJpdmVkIGZyb20gZmFwX2RldmljZV9tb2RlOiBJZiBmYXBfZGV2aWNlX21vZGUgaXMKKyMgUFAsIGRlZmF1bHQgaGVhZGVyIHR5cGUgaXMgRVRILiBPdGhlcndpc2UsIGRlZnVhbHQgaGVhZGVyIHR5cGUgaXMgVE0uCisjIEhlYWRlciB0eXBlIHBlciBwb3J0IGNhbiBiZSBvdmVycmlkZW4uCisjIEFsbCBvcHRpb25zOiBFVEgvUkFXL1RNL1BST0cvQ1BVL1NUQUNLSU5HL1RETS9URE1fUkFXL0lOSkVDVEVECisKKyMgU2V0IENQVSB0byB3b3JrIHdpdGggVE0gaGVhZGVyIChJVE1IKQorI3RtX3BvcnRfaGVhZGVyX3R5cGVfMC5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV9pbl8wLkJDTTg4NjQwX0EwPVRNCit0bV9wb3J0X2hlYWRlcl90eXBlX291dF8wLkJDTTg4NjQwX0EwPUNQVQordG1fcG9ydF9oZWFkZXJfdHlwZV83My5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83NC5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83NS5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83Ni5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83Ny5CQ004ODY0MF9BMD1UTQordG1fcG9ydF9oZWFkZXJfdHlwZV83OC5CQ004ODY0MF9BMD1UTQorIyByZWN5Y2xpbmcgcG9ydAordG1fcG9ydF9oZWFkZXJfdHlwZV80MC5CQ004ODY0MF9BMD1SQVcKK3Vjb2RlX3BvcnRfNDAuQkNNODg2NDBfQTA9UkNZLjAKKworIyBFbmFibGUgRVJQIGFuZCBPTFAgcG9ydHMKK251bV9lcnBfdG1fcG9ydHMuQkNNODg2NDBfQTA9MQorbnVtX29scF90bV9wb3J0cy5CQ004ODY0MF9BMD0xCitudW1fcmVjeWNsZV90bV9wb3J0cy5CQ004ODY0MF9BMD0xCisKKyMgRHJhbSBjb25maWd1cmF0aW9uCisjIDYwMCBNaHoKK2V4dF9yYW1fcGxsX3IuQkNNODg2NDBfQTA9NAorZXh0X3JhbV9wbGxfZi5CQ004ODY0MF9BMD00NworZXh0X3JhbV9wbGxfcS5CQ004ODY0MF9BMD0xCitleHRfcmFtX2ZyZXEuQkNNODg2NDBfQTA9NjAwCisKKyMgRGJ1ZmYgc2l6ZQorIyBBbGxvd2VkIHZhbHVlczogMjU2LzUxMi8xMDI0LzIwNDguCitleHRfcmFtX2RidWZmX3NpemUuQkNNODg2NDBfQTA9MTAyNAorCisjIE51bWJlciBvZiBleHRlcm5hbCBEUkFNcy4KKyMgQWxsb3dlZCB2YWx1ZXMgZm9yIDg4eDR4OiAwLzIvMy80LzYuCisjIEFsbG93ZWQgdmFsdWVzIGZvciA4ODY1MDogMC8yLzMvNC82LzguCisjIGV4dF9yYW1fdG90YWxfc2l6ZSBiZWxvdyBhc3N1bWVkIHRoaXMgdmFsdWUgaXMgNiBmb3IgODh4NHggYW5kIDggZm9yCitleHRfcmFtX3ByZXNlbnQuQkNNODg2NDBfQTA9NgorCisjIERyYW0gdHlwZTogU2VsZWN0IE9OTFkgT05FIG9mIHRoZSBmb2xsb3dpbmcgRFJBTSB0eXBlcywgdG8gY29uZmlndXJlIGFsbCBkcmFtCisjIHJlbGF0ZWQgcGFyYW1ldGVyZXMgcGVyIHR5cGUuCisjIERyYW0gVHlwZSBmb3IgUGI6CisjZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKNjRNMTZfMTVFLkJDTTg4NjQwX0EwPTEKKyNkcmFtX3R5cGVfRERSMl9NSUNST05fSzRUNTExNjNRRV9aQ19MRjcuQkNNODg2NDBfQTA9MQorI2RyYW1fdHlwZV9ERFIzX1NBTVNVTkdfSzRCMUcxNjQ2RV9IQ0swXzEzMzMuQkNNODg2NDBfQTA9MQorI2RyYW1fdHlwZV9ERFIzX1NBTVNVTkdfSzRCMUcxNjQ2RV9IQ0swXzE2MDAuQkNNODg2NDBfQTA9MQorI2RyYW1fdHlwZV9HRERSM19TQU1TVU5HX0s0SjUyMzI0UUUuQkNNODg2NDBfQTA9MQorZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMTI4TTE2SEFfMTVFXzJHLkJDTTg4NjQwX0EwPTEKKworIyBRRFIgY29uZmlndXJhdGlvbgorIyBQYXJpdHkuIEFsbG93ZWQgdmFsdWVzOiBQQVJJVFkvRUNDLgorZXh0X3Fkcl9wcm90ZWN0aW9uX3R5cGUuQkNNODg2NDBfQTA9UEFSSVRZCitleHRfcWRyX3NpemVfbWJpdC5CQ004ODY0MF9BMD03MgorI1FEUiB0eXBlOiBRRFIvUURSMlAvUURSMy9OT05FLgorZXh0X3Fkcl90eXBlLkJDTTg4NjQwX0EwPVFEUgorCisjIFFEUiBjYW4gdXNlIHRoZSBjb3JlIGNsb2NrLCBvciB1c2luZyBpdCdzIG93biBwbGwuIEN1cnJlbnQgZXhhbXBsZSBpcyBmb3IgMjUwTUh6IHBsbCAoaWYgdXNlZCkuCisjIFFEUiB1c2luZyBvd24gcGxsIGNvbmZpZ3VyYXRpb24KKyNleHRfcWRyX3VzZV9jb3JlX2Nsb2NrX2ZyZXEuQkNNODg2NDBfQTA9MAorI2V4dF9xZHJfcGxsX20uQkNNODg2NDBfQTA9NAorI2V4dF9xZHJfcGxsX24uQkNNODg2NDBfQTA9NAorI2V4dF9xZHJfcGxsX3AuQkNNODg2NDBfQTA9MAorCisjIFFEUiB1c2luZyBjb3JlIGNsb2NrCitleHRfcWRyX3VzZV9jb3JlX2Nsb2NrX2ZyZXEuQkNNODg2NDBfQTA9MQorCisjQ29uZmlndXJlIE1ESU8uIElmIHBhcmFtZXRlciBpcyBub3QgZGVmaW5lZCwgTURJTyBpcyBkaXNhYmxlZC4KK21kaW9fY2xvY2tfZnJlcV9raHouQkNNODg2NDBfQTA9MTAwMAorCisjIFN0cmVhbWluZyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbgorc3RyZWFtaW5nX2lmX2VuYWJsZV90aW1lb3V0Y250LkJDTTg4NjQwX0EwPTEKK3N0cmVhbWluZ19pZl90aW1lb3V0X3ByZC5CQ004ODY0MF9BMD03MAorc3RyZWFtaW5nX2lmX3F1aWV0X21vZGUuQkNNODg2NDBfQTA9MAorc3RyZWFtaW5nX2lmX2Rpc2NhcmRfYmFkX3Bhcml0eS5CQ004ODY0MF9BMD0wCisKKyMgbWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgV1JFRCB0ZXN0cy4gMCAtIG1lYW5zIGlnbm9yZSBtYXggcGFja2V0IHNpemUuCitkaXNjYXJkX210dV9zaXplLkJDTTg4NjQwX0EwPTAKKworIyBtdWx0aWNhc3QgZWdyZXNzIHZsYW4gbWVtYmVyc2hpcCByYW5nZS4gQnkgZGVmYXVsdDogMC00MDk1LgorZWdyZXNzX211bHRpY2FzdF9kaXJlY3RfYml0bWFwX21heC5CQ004ODY0MF9BMD00MDk1CisKKyMgY29uZmlndXJlIGZsb3cgbWFwcGluZyBiYXNlIHRvIDAKK2Zsb3dfbWFwcGluZ19xdWV1ZV9iYXNlLkJDTTg4NjQwX0EwPTAKKworZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8yNS5CQ004ODY0MF9BMD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzI2LkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMjcuQkNNODg2NDBfQTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8yOC5CQ004ODY0MF9BMD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzI5LkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzAuQkNNODg2NDBfQTA9MAorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zMS5CQ004ODY0MF9BMD0wCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzMyLkJDTTg4NjQwX0EwPTAKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzMuQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zNC5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM1LkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzYuQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl8zNy5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzM4LkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fMzkuQkNNODg2NDBfQTA9MQorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80MC5CQ004ODY0MF9BMD0xCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQxLkJDTTg4NjQwX0EwPTEKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDIuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80My5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQ0LkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDUuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80Ni5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzQ3LkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNDguQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl80OS5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzUwLkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNTEuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl81Mi5CQ004ODY0MF9BMD0yCitkdG1fZmxvd19tYXBwaW5nX21vZGVfcmVnaW9uXzUzLkJDTTg4NjQwX0EwPTIKK2R0bV9mbG93X21hcHBpbmdfbW9kZV9yZWdpb25fNTQuQkNNODg2NDBfQTA9MgorZHRtX2Zsb3dfbWFwcGluZ19tb2RlX3JlZ2lvbl81NS5CQ004ODY0MF9BMD0yCisKKyMgUG93ZXIgdXAgc3RhdGUgKERPV04vVVAvVVBfQU5EX1JFTE9DSykuIENhbiBiZSBjb25maWd1cmVkIHBlciBsYW5lLgorcGJfc2VyZGVzX2xhbmVfcG93ZXJfc3RhdGUuQkNNODg2NDBfQTA9VVBfQU5EX1JFTE9DSworCisjIFNlRGVzIG1lZGlhIHR5cGU6IFByZS1jb25maWd1cmF0aW9uIGZvciB0eCBwYXJhbXMsIGFjY29yZGluZyB0bworIyBtZWRpYSB0eXBlLgorIyBBbGxvd2VkIHZhbHVlczogU0hPUlRfQkFDS1BMQU5FL0xPTkdfQkFDS1BMQU5FL0NISVAyQ0hJUAorcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tZWRpYV90eXBlLkJDTTg4NjQwX0EwPVNIT1JUX0JBQ0tQTEFORQorcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tZWRpYV90eXBlXzI4LkJDTTg4NjQwX0EwPUNISVAyQ0hJUAorcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tZWRpYV90eXBlXzI5LkJDTTg4NjQwX0EwPUNISVAyQ0hJUAorcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tZWRpYV90eXBlXzMwLkJDTTg4NjQwX0EwPUNISVAyQ0hJUAorcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tZWRpYV90eXBlXzMxLkJDTTg4NjQwX0EwPUNISVAyQ0hJUAorCitzeXN0ZW1faXNfZmUxNjAwX2luX3N5c3RlbS5CQ004ODY0MF9BMD0wCisKKyMgQ291bnRlciBlbmdpbmUgY29uZmlndXJhdGlvbgorY291bnRlcl9lbmdpbmVfc291cmNlXzEuQkNNODg2NDBfQTA9MAorY291bnRlcl9lbmdpbmVfc3RhdGlzdGljc18xLkJDTTg4NjQwX0EwPTQKK2NvdW50ZXJfZW5naW5lX3NvdXJjZV8yLkJDTTg4NjQwX0EwPTEKK2NvdW50ZXJfZW5naW5lX3N0YXRpc3RpY3NfMi5CQ004ODY0MF9BMD00CisKKyMgU3RhdGlzdGljIFJlcG9ydGluZworc3RhdF9pZl9lbmFibGU9MAorCisjIENsb2NrIFBoYXNlczogMC85MC8xODAvMjcwCitzdGF0X2lmX3BoYXNlPTAKKworIyBSYXRlIGluIG5tCitzdGF0X2lmX3N5bmNfcmF0ZT0wCisKKyMgVFJVRS9GQUxTRQorc3RhdF9pZl9wYXJpdHlfZW5hYmxlPUZBTFNFCisKKyMgQklMTElORy9GQVAyMFYKK3N0YXRfaWZfcmVwb3J0X21vZGU9QklMTElORworCisjIEJpbGxpbmcgTW9kZQorIyBFR1JfUV9OQi9DVUQvVlNJX1ZMQU4vQk9USF9MSUZTCitzdGF0X2lmX3JlcG9ydF9iaWxsaW5nX21vZGU9VlNJX1ZMQU4KKworIyBGYXAyMFYgTW9kZQorIyBRVUVVRS9QQUNLRVQKK3N0YXRfaWZfcmVwb3J0X2ZhcDIwdl9tb2RlPVFVRVVFCisKKyMgUVVFVUVfTlVNL01DX0lEIChvbmx5IHZhbGlkIGluIEZhcDIwViBQQUNLRVQgbW9kZSkKK3N0YXRfaWZfcmVwb3J0X2ZhcDIwdl9mYWJyaWNfbWM9UVVFVUVfTlVNCitzdGF0X2lmX3JlcG9ydF9mYXAyMHZfaW5nX21jPVFVRVVFX05VTQorCisjIFRSVUUvRkFMU0UgKG9ubHkgdmFsaWQgaW4gRmFwMjBWIFBBQ0tFVCBtb2RlKQorc3RhdF9pZl9yZXBvcnRfZmFwMjB2X2NubV9yZXBvcnQ9RkFMU0UKKworIyBUUlVFL0ZBTFNFCitzdGF0X2lmX3JlcG9ydF9mYXAyMHZfY291bnRfc25vb3A9RkFMU0UKK3N0YXRfaWZfcmVwb3J0X29yaWdpbmFsX3BrdF9zaXplPUZBTFNFCitzdGF0X2lmX3JlcG9ydF9mYXAyMHZfc2luZ2xlX2NvcHlfcmVwb3J0ZWQ9RkFMU0UKKworc2NoYW5fdGltZW91dF91c2VjLkJDTTg4NjQwX0EwPTMwMDAwMAorCisKK3BvbGxlZF9pcnFfbW9kZS5CQ004ODY0MF9BMD0wCitwb2xsZWRfaXJxX2RlbGF5LkJDTTg4NjQwX0EwPTEwMDAKKworIyBTZXQgdGhlIEZUTUggTG9hZC1CYWxhbmNpbmcgS2V5IGV4dGVuc2lvbiBtb2RlCisjIE9wdGlvbnMgZm9yIDg4NjUwOiBFTkFCTEVECisjIE9wdGlvbnMgZm9yIDg4NjQwIGNvbXBhdGlibGU6CisjIERJU0FCTEVEIC8gOEJfTEJfS0VZXzhCX1NUQUNLSU5HX1JPVVRFX0hJU1RPUlkgLyAxNkJfU1RBQ0tJTkdfUk9VVEVfSElTVE9SWQorIyBEZWZhdWx0OiBESVNBQkxFRAorc3lzdGVtX2Z0bWhfbG9hZF9iYWxhbmNpbmdfZXh0X21vZGUuQkNNODg2NDA9RElTQUJMRUQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjY2ZnIGZvciBCQ004ODc1MCAoRkUxNjAwKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZmFicmljX2RldmljZV9tb2RlLkJDTTg4NzUwPVNJTkdMRV9TVEFHRV9GRTIKKworaXNfZHVhbF9tb2RlLkJDTTg4NzUwPTAKK3N5c3RlbV9pc192Y3NfMTI4X2luX3N5c3RlbS5CQ004ODc1MD0wCisKK3N5c3RlbV9pc19kdWFsX21vZGVfaW5fc3lzdGVtLkJDTTg4NzUwPTAKK3N5c3RlbV9pc19zaW5nbGVfbW9kZV9pbl9zeXN0ZW0uQkNNODg3NTA9MQorCitzeXN0ZW1faXNfZmU2MDBfaW5fc3lzdGVtLkJDTTg4NzUwPTAKKworc3lzdGVtX3JlZl9jb3JlX2Nsb2NrX2toei5CQ004ODc1MD0xMjAwMDAwCisKK2ZhYnJpY19tZXJnZV9jZWxscy5CQ004ODc1MD0wCitmYWJyaWNfbXVsdGljYXN0X21vZGUuQkNNODg3NTA9RElSRUNUCitmYWJyaWNfbG9hZF9iYWxhbmNpbmdfbW9kZS5CQ004ODc1MD1OT1JNQUxfTE9BRF9CQUxBTkNFCitmYWJyaWNfdGRtX2ZyYWdtZW50LkJDTTg4NzUwPTB4MTgwCisjI0FsbG93cyBzaW5nbGUgcGlwZSBkZXZpY2UgdG8gc2VuZCBURE0gdHJhZmZpYyBvdmVyIHRoZSBmYWJyaWMgcHJpbWFyeSBwaXBlIC0gYXZhaWxhYmxlIGZvciBGZTE2MDBfQjAgb25seQorI2NoYW5nZSAgdmNzMTI4X3VuaWNhc3RfcHJpb3JpdHkgdG8gYmUgbG93ZXIgdGhhbiAyIC0gd2hlbiBlbmFibGluZworZmFicmljX3RkbV9vdmVyX3ByaW1hcnlfcGlwZS5CQ004ODc1MD0wCitmYWJyaWNfb3B0aW1pemVfcGFydGlhbF9saW5rcy5CQ004ODc1MD0wCit2Y3MxMjhfdW5pY2FzdF9wcmlvcml0eS5CQ004ODc1MD0yCisKK3BvbGxlZF9pcnFfbW9kZS5CQ004ODc1MD0wCitwb2xsZWRfaXJxX2RlbGF5LkJDTTg4NzUwPTEwMDAKKworI1NlbGVjdHMgaWYgdG8gcnVuIE1CSVNUIChNZW1vcnkgQnVpbHQgSW4gU2VsZiBUZXN0KSBvZiBpbnRlcm5hbCBtZW1vcnkgKHRhYmxlcykgZHVyaW5nIHN0YXJ0dXAuCisjU3VwcG9ydGVkIHZhbHVlczogMD1kb24ndCBydW4sIDE9cnVuLCAyPXJ1biB3aXRoIGV4dHJhIGxvZ3MKKyNiaXN0X2VuYWJsZS5CQ004ODY1MD0xCitiaXN0X2VuYWJsZS5CQ004ODc1MD0xCitiaXN0X2VuYWJsZS5CQ004ODQ3MD0wCisjSGlnaCB2b2x0YWdlIGRyaXZlciBzdHJhcC4gSWYgMCwgY29ubmVjdGVkIHRvIDEuNFYgc3VwcGx5OyBpZiAxLCBjb25uZWN0ZWQgdG8gMVYgbW9kZS4KKyNmb3Igc3BlY2lmaWMgcXVhZCB1c2Ugc3JkX3R4X2Rydl9odl9kaXNhYmxlX3F1YWRfWCB3aGVyZSBYIGlzIChGU1JEIG51bSAqIDQgKyBpbnRlcm5hbCBxdWFkKQorc3JkX3R4X2Rydl9odl9kaXNhYmxlLkJDTTg4NzUwPTAKK2xvYWRfZmlybXdhcmUuQkNNODg3NTA9MgorCisjMC1MRkVDIDEtOGJcMTBiIDItRkVDIDMtQkVDCitiYWNrcGxhbmVfc2VyZGVzX2VuY29kaW5nLkJDTTg4NzUwPTIKKworI2VuYWJsZVxkaXNhYmxlIENMNzIKK3BvcnRfaW5pdF9jbDcyLkJDTTg4NzUwPTEKKyNBdmFsaWFibGUgc3BlZWRzIGZvciBCQ004ODc1MDogNTc1MCwgNjI1MCwgMTAzMTIsIDExNTAwLCAxMjUwMAorcG9ydF9pbml0X3NwZWVkLkJDTTg4NzUwPTEwMzEyCisjTEMgUExMIGluXG91dCAwPTEyNU1IeiAxPTE1Ni4yNU1Iegorc2VyZGVzX2ZhYnJpY19jbGtfZnJlcV9pbi5CQ004ODc1MD0xCitzZXJkZXNfZmFicmljX2Nsa19mcmVxX291dC5CQ004ODc1MD0xCitzZXJkZXNfbWl4ZWRfcmF0ZV9lbmFibGUuQkNNODg3NTBfQjA9MAorCisjIFZTQzEyOCBvciBWU0MyNTYKK2ZhYnJpY19jZWxsX2Zvcm1hdC5CQ004ODc1MD1WU0MyNTYKKworIyBDb3JlIGNsb2NrIHNwZWVkIChNSHopCitjb3JlX2Nsb2NrX3NwZWVkX2toei5CQ004ODc1MD01MzMzMzMKKworIyMgQ01JQyBpbnRlcnJ1cHRzOgorIyBFbmFibGU6IFVzZSBpbnRlcnJ1cHRzIGNvbXBsZXRpb24gaW5zdGVhZCBvZiBwb2xsaW5nIGNvbXBsZXRpb24gZm9yIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucy4KKyMgICAgICAgICBPcHRpb25zOiAxIC0gRW5hYmxlLCAwIC0gRGlzYWJsZS4gRGVmYXVsdDogMC4KKyMgVGltZW91dDogZGVsYXkgaW4gTWljcm9zZWNvbmQgYmV0d2VlbiB0aGUgcG9sbGluZywKKyMgU0NIQU46CitzY2hhbl9pbnRyX2VuYWJsZS5CQ004ODc1MD0wCitzY2hhbl90aW1lb3V0X3VzZWMuQkNNODg3NTA9MzAwMDAwCisjIFRETUEKK3RkbWFfaW50cl9lbmFibGUuQkNNODg3NTA9MAordGRtYV90aW1lb3V0X3VzZWMuQkNNODg3NTA9NTAwMDAwMAorIyBUU0xBTQordHNsYW1faW50cl9lbmFibGUuQkNNODg3NTA9MAordHNsYW1fdGltZW91dF91c2VjLkJDTTg4NzUwPTUwMDAwMDAKKyMgTUlJTQorbWlpbV9pbnRyX2VuYWJsZS5CQ004ODc1MD0wCittaWltX3RpbWVvdXRfdXNlYy5CQ004ODc1MD0zMDAwMDAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjY2ZnIGZvciBCQ004ODk1MCAoRkUzMjAwKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNEZXZpY2UgIG9wZXJhdGlvbgorZmFicmljX2RldmljZV9tb2RlLkJDTTg4OTUwPVNJTkdMRV9TVEFHRV9GRTIKK2ZhYnJpY19sb2FkX2JhbGFuY2luZ19tb2RlLkJDTTg4OTUwPU5PUk1BTF9MT0FEX0JBTEFOQ0UKKworI0NlbGwgZm9ybWF0CitzeXN0ZW1faXNfdmNzXzEyOF9pbl9zeXN0ZW0uQkNNODg5NTA9MAorCisjRmFicmljIHBpcGUgY29uZmlndXJhdGlvbgorCitmYWJyaWNfbnVtX3BpcGVzLkJDTTg4OTUwPTEKK2ZhYnJpY19waXBlX21hcC5CQ004ODk1MD0wCitzeXN0ZW1fY29udGFpbnNfbXVsdGlwbGVfcGlwZV9kZXZpY2UuQkNNODg5NTA9MAorCisjbXVsdGljYXN0IHRhYmxlIG1vZGUKK2ZhYnJpY19tdWx0aWNhc3RfbW9kZS5CQ004ODk1MD1ESVJFQ1QKK2ZlX21jX2lkX3JhbmdlLkJDTTg4OTUwPTEyOEtfSEFMRgorCisjQ29yZSBjbG9jayBhbmQgc3lzdGVtIHJlZmVyZW5jZSBjbG9jayAoS0h6KQorc3lzdGVtX3JlZl9jb3JlX2Nsb2NrX2toei5CQ004ODk1MD0xMjAwMDAwCitjb3JlX2Nsb2NrX3NwZWVkX2toei5CQ004ODk1MD03MjAwMDAKKworI0xDIFBMTCBpblxvdXQgMD0xMjVNSHogMT0xNTYuMjVNSHoKK3NlcmRlc19mYWJyaWNfY2xrX2ZyZXFfaW4uQkNNODg5NTA9MAorc2VyZGVzX2ZhYnJpY19jbGtfZnJlcV9vdXQuQkNNODg5NTA9MQorCisjVE9ETworcG9sbGVkX2lycV9tb2RlLkJDTTg4OTUwPTEKK3BvbGxlZF9pcnFfZGVsYXkuQkNNODg5NTA9MTAwMAorCisjTWVtb3J5IEJpc3QKK2Jpc3RfZW5hYmxlLkJDTTg4OTUwPTAKKworI0hpZ2ggdm9sdGFnZSBkcml2ZXIgc3RyYXAuIElmIDAsIGNvbm5lY3RlZCB0byAxLjI1ViBzdXBwbHk7IAorI2lmIDEsIGNvbm5lY3RlZCB0byAxViBtb2RlIChGb3IgdW51c2VkIEZhbGNvbiBRdWFkcyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gMS4wVikuCisjZm9yIHNwZWNpZmljIHF1YWQgdXNlIHNyZF90eF9kcnZfaHZfZGlzYWJsZV9xdWFkX1ggd2hlcmUgWCBpcyAoRlNSRCBudW0gKiA0ICsgaW50ZXJuYWwgcXVhZCkKK3NyZF90eF9kcnZfaHZfZGlzYWJsZS5CQ004ODk1MD0wCitsb2FkX2Zpcm13YXJlLkJDTTg4OTUwPTB4MTAyCisKKworIyNQZXIgcG9ydCBwcm9wZXJ0aWVzCisjUG9zc2libGUgdmFsdWVzIC0gS1JfRkVDLCA2NF82NiwgUlNfRkVDLCBMTF9SU19GRUMKK2JhY2twbGFuZV9zZXJkZXNfZW5jb2RpbmcuQkNNODg5NTA9UlNfRkVDCisKKyNlbmFibGVcZGlzYWJsZSBDTDcyCitwb3J0X2luaXRfY2w3Mi5CQ004ODk1MD0xCisKKyNsaW5rIHNwZWVkCitwb3J0X2luaXRfc3BlZWQuQkNNODg5NTA9MjUwMDAKKworI0xpbmsgY29ubmVjdGVkIHRvIGEgcmVhcHRlcgorI1ZhbHVlczogMC8xLiBEZWZhdWx0OiAwCisjcmVwZWF0ZXJfbGlua19lbmFibGVfPHBvcnQ+LkJDTTg4OTUwPTAKKworIyNGYWJyaWMgY2VsbCBGSUZPIERNQQorZmFicmljX2NlbGxfZmlmb19kbWFfZW5hYmxlLkJDTTg4OTUwPTEKKworIyMgQ01JQyBpbnRlcnJ1cHRzOgorIyBFbmFibGU6IFVzZSBpbnRlcnJ1cHRzIGNvbXBsZXRpb24gaW5zdGVhZCBvZiBwb2xsaW5nIGNvbXBsZXRpb24gZm9yIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucy4KKyMgICAgICAgICBPcHRpb25zOiAxIC0gRW5hYmxlLCAwIC0gRGlzYWJsZS4gRGVmYXVsdDogMC4KKyMgVGltZW91dDogZGVsYXkgaW4gTWljcm9zZWNvbmQgYmV0d2VlbiB0aGUgcG9sbGluZywKKyMgU0NIQU46CitzY2hhbl9pbnRyX2VuYWJsZS5CQ004ODk1MD0wCitzY2hhbl90aW1lb3V0X3VzZWMuQkNNODg5NTA9MzAwMDAwCisjIFRETUEKK3RkbWFfaW50cl9lbmFibGUuQkNNODg5NTA9MAordGRtYV90aW1lb3V0X3VzZWMuQkNNODg5NTA9NTAwMDAwMAorIyBUU0xBTQordHNsYW1faW50cl9lbmFibGUuQkNNODg5NTA9MAordHNsYW1fdGltZW91dF91c2VjLkJDTTg4OTUwPTUwMDAwMDAKKyMgTUlJTQorbWlpbV9pbnRyX2VuYWJsZS5CQ004ODk1MD0wCittaWltX3RpbWVvdXRfdXNlYy5CQ004ODk1MD0zMDAwMDAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbmZpZ3VyYXRpb24gZm9yIGRldmljZXMgcnVuIGluIGVtdWxhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjZGlhZ19lbXVsYXRvcl9wYXJ0aWFsX2luaXQuQkNNODg0NzA9MgorI3BoeV9zaW11bC5CQ004ODQ3MD0xCisjc3lzdGVtX3JlZl9jb3JlX2Nsb2NrX2toei5CQ004ODQ3MD0yNTAwMDAKKyNzeXN0ZW1fcmVmX2NvcmVfY2xvY2tfa2h6LkJDTTg4NDcwPTYwMDAwMAorI3BoeV9zaW11bC5CQ004ODI3MD0xCisKK3BvbGxlZF9pcnFfbW9kZS5CQ004ODQ3MD0xCitwb2xsZWRfaXJxX21vZGUuQkNNODgyNzA9MQorCitzY2hhbl9pbnRyX2VuYWJsZS5CQ004ODQ3MD0wCitzY2hhbl9pbnRyX2VuYWJsZS5CQ004ODI3MD0wCisKKyMgRm9yIGVtdWxhdGlvbiB1c2U6Cisjc2NoYW5fdGltZW91dF91c2VjLkJDTTg4NDcwPTYwMDAwMDAwMAorc2NoYW5fdGltZW91dF91c2VjLkJDTTg4NDcwPTMwMDAwMAorc2NoYW5fdGltZW91dF91c2VjLkJDTTg4MjcwPTIwMDAwMAorCisjIFRETUEKK3RkbWFfaW50cl9lbmFibGUuQkNNODg0NzA9MAorI3RkbWFfaW50cl9lbmFibGUuQkNNODgyNzA9MAorCisjIEZvciBlbXVsYXRpb24gdXNlOgorI3RkbWFfdGltZW91dF91c2VjLkJDTTg4NDcwPTYwMDAwMDAwMAordGRtYV90aW1lb3V0X3VzZWMuQkNNODg0NzA9NjAwMDAwMDAKK3RkbWFfdGltZW91dF91c2VjLkJDTTg4MjcwPTUwMDAwMAorCisjIFRTTEFNCit0c2xhbV9pbnRyX2VuYWJsZS5CQ004ODQ3MD0wCit0c2xhbV9pbnRyX2VuYWJsZS5CQ004ODI3MD0wCisKKyMgRm9yIGVtdWxhdGlvbiB1c2U6CisjdHNsYW1fdGltZW91dF91c2VjLkJDTTg4NDcwPTYwMDAwMDAwMAordHNsYW1fdGltZW91dF91c2VjLkJDTTg4NDcwPTYwMDAwMDAwCit0c2xhbV90aW1lb3V0X3VzZWMuQkNNODgyNzA9NTAwMDAwCisKKyNvdG1fYmFzZV9xX3BhaXIuQkNNODg0NzA9MgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29uZmlnIHZhcmlhYmxlIGJlbG93IGFyZSBvbmx5IGFjY2Vzc2VkIGZyb20gZHVuZS5zb2MsIGFuZCBhcmUgdXNlZCB0bworIyBjb25maWd1cmUgQlNQIC8gZXhhbXBsZSBhcHBsaWNhdGlvbiAvIGdyb3VwIG9mIGZvcm1hbCBjb25maWcgdmFyaWFibGVzLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgU3VwcG9ydCAoYW5kIGNvbmZpZ3VyZSBvbiBpbml0KSBwYWNrZXQgcHJvY2Vzc2luZyBmZWF0dXJlcy4KKyMgSWYgbm90IGRlZmluZWQgLSBvbmx5IHRyYWZmaWMgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgYXJlIGVuYWJsZWQuCitwYWNrZXRfcHJvY2Vzc2luZz0xCisKKyMjIFBDUCAoUGV0cmEgQ28tUHJvY2Vzc29yKSBmZWF0dXJlcworI3BjcF9lbGsuQkNNODg2NDBfQTA9MQorI3BjcF9vYW0uQkNNODg2NDBfQTA9MQorI3BjcF9kbWEuQkNNODg2NDBfQTA9MQorCisjIyBTZXQvT3ZlcnJpZGUgVERNIHJlbGF0ZWQgY29uZmlnIHZhcmlhYmxlcworI3RkbS5CQ004ODY0MF9BMD0xCisKKyMgSWYgc2V0LCBhbHdheXMgY29uZmlndXJlcyBzeW50aGVzaXplcnMsIGV2ZW4gaWYgdGhlIGNvbmZpZ3VyZWQgcmF0ZSBpcworIyBlcXVhbCB0bworIyB0aGVpciBub21pbmFsIHJhdGUuIENhbiBiZSBkaXNhYmxlZCB0byBzcGVlZHVwIGJyaW5ndXAgdGltZQorIyAoa2VlcCBpbiBtaW5kIHRoYXQgaWYgZGlzYWJsZWQsIGNoYW5naW5nIGEgc3ludCB0byBhIG5vbi1ub21pbmFsIGZyZXEgYW5kCisjIHRoYW4gYmFjayB0byBub21pbmFsIHdpbGwgbm90IHdvcmsKKyNzeW50X292ZXIuQkNNODg2NDBfQTA9MQorCisjIExvY2FsIHZhcmlhYmxlcyBmb3IgYm9hcmQgc3ludGhlc2l6ZXJzIGZyZXEuIEZhYnJpYywgY29tYm8gYW5kIG5pZiBhbHNvIGNvbmZpZ3VyZQorIyB0aGUgKl9yZWZfY2xvY2sgc29jIHByb3BlcnRpZXMgZm9yIHRoZXNlIGZyZXF1ZW5jaWVzLiBjb3JlLCBkZHIgYW5kIHBoeSBvbmx5CisjIGNvbmZpZ3VyZXMgdGhlIHN5bnRoZXNpemVyCitzeW50X2NvcmUuQkNNODg2NDBfQTA9MTAwMDAwMDAwCitzeW50X2Rkci5CQ004ODY0MF9BMD0xMjUwMDAwMDAKK3N5bnRfcGh5LkJDTTg4NjQwX0EwPTE1NjI1MDAwMAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBXYXJtYm9vdCAmIFNXIFN0YXRlICMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyNIVyBqb3VybmFsIHdvcmtpbmcgbW9kZS4gQWxsb3dlZCB2YWx1ZXM6IDAtMi4KKyMgICAwIDogRGlzYWJsZWQKKyMgICAxIDogQ29tbWl0IEFmdGVyIEVhY2ggQXBpCisjICAgMiA6IENvbW1pdCBVcG9uIFVzZXIgUmVxdWVzdAoraGFfaHdfam91cm5hbF9tb2RlPTAKKworaGFfaHdfam91cm5hbF9zaXplPTE1NzI4NjQwCitoYV9zd19qb3VybmFsX3NpemU9MTU3Mjg2NDAKK2hhX2NyYXNoX3JlY292ZXJ5PTEKKworCisjIHN0YWJsZV9zaXplIC0gYSBzdHJpY3QgYm91bmQgb24gdGhlIGFwcGxpY2F0aW9uJ3MgZXh0ZXJuYWwgc3RvcmFnZSBzaXplCitzdGFibGVfc2l6ZS5CQ004ODk1MD0yMDAwMDAKK3N0YWJsZV9zaXplLkJDTTg4NzUwPTIwMDAwMAorc3RhYmxlX3NpemUuQkNNODg2NTA9MjgxMDAwMDAwCitzdGFibGVfc2l6ZS5CQ004ODY3NT01MDAwMDAwMDAKK3N0YWJsZV9zaXplLkJDTTg4NjgwPTUwMDAwMDAwMAorc3RhYmxlX3NpemUuQkNNODg2OTA9NTAwMDAwMDAwCitzdGFibGVfc2l6ZS5CQ004ODQ3MD0zNTAwMDAwMDAKK3N0YWJsZV9zaXplLkJDTTg4MjcwPTY1MDAwMDAwMAorc3RhYmxlX3NpemU9NDIwMDAwMDAwCisKKyMgZGV0ZXJtaW5lIHRoZSBtZW1vcnkgc2l6ZSBwcmUtYWxsb2NhdGVkIGZvciB0aGUgU0RLJ3MgU1cgU3RhdGUKK3N3X3N0YXRlX21heF9zaXplLkJDTTg4NjUwPTIxMDAwMDAwMAorc3dfc3RhdGVfbWF4X3NpemUuQkNNODg2NzU9MzUwMDAwMDAwCitzd19zdGF0ZV9tYXhfc2l6ZS5CQ004ODY4MD0zNTAwMDAwMDAKK3N3X3N0YXRlX21heF9zaXplLkJDTTg4NDcwPTMwMDAwMDAwMAorc3dfc3RhdGVfbWF4X3NpemUuQkNNODgyNzA9MjEwMDAwMDAwCitzd19zdGF0ZV9tYXhfc2l6ZT0zNTAwMDAwMDAKKworIyBzdGFibGUgbG9jYXRpb24KKyMjIHBhcnQgb2Ygc2NhY2hlIGluaXRpYWxpemF0aW9uIGZvciB3YXJtYm9vdCBwZXJzaXN0ZW50IHN0b3JhZ2UuCisjIyB2YWx1ZXM6IDEtMjpOb3QgVmFsaWQgZm9yIGRueCAzOiBTdG9yZSBpbiBhIGZpbGUgIDQ6IFVzZSBTaGFyZWQgTWVtLgorIyA0IGlzIHRoZSBwcmVmZmVyZWQgb3B0aW9uLCB1c2luZyAzIGZvciBBcmFkIGFuZCBGRSBpbiBvcmRlciB0byByZWdyZXNzIGJvdGggbW9kZXMuCitzdGFibGVfbG9jYXRpb24uQkNNODg5NTA9Mworc3RhYmxlX2xvY2F0aW9uLkJDTTg4NzUwPTMKK3N0YWJsZV9sb2NhdGlvbi5CQ004ODY1MD0zCitzdGFibGVfbG9jYXRpb24uQkNNODg2NjA9Mworc3RhYmxlX2xvY2F0aW9uLkJDTTg4Njc1PTMKK3N0YWJsZV9sb2NhdGlvbj0zCisKKyMgc3RhYmxlX2ZpbGVuYW1lIC0gdGhlIHdhcm1ib290IGZpbGUgbmFtZSAoaWYgc3RvcmVkIG9uIGEgZmlsZSkgCitzdGFibGVfZmlsZW5hbWU9L3RtcC93YXJtYm9vdF9kYXRhCisKKyMgZW11bGF0aW9uIGZpbGUgbmFtZQorc3RhYmxlX2ZpbGVuYW1lLkJDTTg4NDcwPS90bXAvd2FybWJvb3RfZGF0YQorCisKKyMgY3JlYXRlIHRoZSBmaWxlIGluIG1lbW9yeSBmb3IgYSBmYXN0ZXIgd2FybWJvb3QgZGVidWcKKyNzdGFibGVfZmlsZW5hbWU9L2Rldi9zaG0vd2FybWJvb3RfZGF0YQorCisjIHN0YWJsZV9mbGFncyAtIG5vdCBpbiB1c2UKK3N0YWJsZV9mbGFncz0wCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisjIEJyaWRnZSBkZWZhdWx0IGxvZ2ljYWwgaW50ZXJmYWNlcyBhbGxvY2F0aW9uIElEUworbG9naWNhbF9wb3J0X2wyX2JyaWRnZS5CQ004ODY0MD0xCitsb2dpY2FsX3BvcnRfZHJvcC5CQ004ODY0MD0tMQorCisjbG9naWNhbF9wb3J0X21pbV9pbi5CQ004ODY0MD0yCisjbG9naWNhbF9wb3J0X21pbV9vdXQuQkNNODg2NDA9MworCisjIyBJUFY2IHR1bm5lbAorYmNtODg2eHhfaXB2Nl90dW5uZWxfZW5hYmxlPTEKKworIyMgSW5saWYgUHJvZmlsZSBNYW5hZ2VtZW50IE1vZGUgLSBRb1MgTDMgTDIgbWFya2luZyBtb2RlCisjCisjIEJDTTg4NjYwIE9OTFkKKyMKKyMgUW9TIEwzIEwyIG1hcmtpbmcgYWxsb3dzIGNoYW5naW5nIHRoZSBEU0NQIGFuZC9vciBFWFAgdmFsdWVzCisjIG9mIElQIGFuZC9vciBNUExTIHBhY2tldHMgYWNjb3JkaW5nIHRvIHRoZSBpbmNvbWluZyBwb3J0CisjIChvciBpbmxpZiksIGFuZCB0aGUgVHJhZmZpYyBDbGFzcy9Ecm9wIFByZWNlZGVuY2UuCisjCisjIFRoZSBpbmxpZiBwcm9maWxlIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgRFNDUC9FWFAgbWFya2luZy4KKyMgVGhpcyBTT0MgcHJvcGVydHkgY29udHJvbHMgd2hpY2ggbW9kZSBpcyB1c2VkIGZvciB0aGUgaW5saWYgcHJvZmlsZToKKyMgMTogQmFzaWMgbW9kZSAoMSBiaXQgb2YgdGhlIGlubGlmIHByb2ZpbGUgaXMgcmVzZXJ2ZWQgYW5kIGlzIHVzZWQgZm9yIHRoZSBEU0NQL0VYUCBtYXJraW5nKS4KKyMgMDogQWR2YW5jZWQgbW9kZSAodGhlIHVzZXIgY29udHJvbHMgd2hpY2ggaW5saWYgcHJvZmlsZSB2YWx1ZXMgcGVyZm9ybSBEU0NQL0VYUCBtYXJraW5nIGRpcmVjdGx5KS4KKyNiY204ODZ4eF9xb3NfbDNfbDJfbWFya2luZz0xCisKKyMjIFVuaWNhc3QgUlBGIG1vZGUgcGVyIFJJRgorIworIyBUaGlzIFNPQyBwcm9wZXJ0eSBhbGxvd3MgdGhlIHVzZXIgdG8gc2V0IHRoZSB1bmljYXN0IFJQRiBtb2RlIC0gbG9vc2UsIHN0cmljdCBvciBkaXNhYmxlZCAtIHBlciBSSUYuCisjIElmIGRpc2FibGVkLCB0aGUgdW5pY2FzdCBSUEYgbW9kZSBvZiBhIFJJRiBpcyBzZXQgZ2xvYmFsbHkuCisjIE9wdGlvbnM6IDAgLyAxCisKKyMjSmVyaWNobyBvbmx5LCBudW1iZXIgb2YgaW5yaWYgbWFjIHRlcm1pbmF0aW9uIGNvbWJpbmF0aW9ucy4gTGVnYWwgdmFsdWVzIDAgLSAxNiwgZGVmYXVsdCB2YWx1ZSAxNiAqLworI05vdGU6IFR3byBzZXRzIG9mIGlkZW50aWNhbCBtYWMgdGVybWluYXRpb24gY29tYmluYXRpb25zIHdpdGggZGlmZmVyZW50IFJQRiBtb2RlcyAobG9vc2UgYW5kIHN0cmljdCkgCisjd2lsbCBjb25zdW1lIHR3byB0ZXJtaW5hdGlvbiBjb21iaW5hdGlvbnMgcmVzb3VyY2VzLgorI1R3byBzZXRzIG9mIGlkZW50aWNhbCBtYWMgdGVybWluYXRpb24gY29tYmluYXRpb25zIHdpdGggYW5kIHdpdGhvdXQgbG9vc2UgUlBGIHdpbGwgY29uc3VtZSBvbmx5IG9uZSByZXNvdXJjZS4KK251bWJlcl9vZl9pbnJpZl9tYWNfdGVybWluYXRpb25fY29tYmluYXRpb25zPTgKKworIyNKZXJpY2hvIG9ubHksIGlwbWNfbDNtY2FzdGwyX21vZGUgU09DIGFsbG93cyBhIHBlciBSSUYgcHJvZ3JhbSBzZWxlY3Rpb24gaW4gdGhlIGNhc2Ugb2YgaXB2NCBNQyB3aXRoIElQTUMgZGlzYWJsZSAKKyNpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgYmNtU3dpdGNoTDNNY2FzdEwyIHN3aXRjaCBjb250cm9sIHNlbGVjdGlvbi4KKyNMZWdhbCB2YWx1ZXM6CisjMDogYmNtU3dpdGNoTDNNY2FzdEwyIHN3aXRjaCBjb250cm9sLgorIzE6IFBFUiBJbi1SSUYgc2VsZWN0aW9uLgorI05vdGUgdGhhdCBlbmFibGluZyB0aGlzIFNPQyB3aWxsIHJlZHVjZSB0aGUgbnVtYmVyIG9mIEluLVJJRiBtYWMgdGVybWluYXRpb24gY29tYmluYXRpb25zIGJpdHMgYnkgb25lIHRvIGEgbWF4aW11bSBvZiAzIGJpdHMgCisjc28gaXQgY2FuJ3QgYmUgZW5hYmxlZCB3aXRoIG51bWJlcl9vZl9pbnJpZl9tYWNfdGVybWluYXRpb25fY29tYmluYXRpb25zIGxhcmdlciB0aGFuIDguCitpcG1jX2wzbWNhc3RsMl9tb2RlID0gMQorCisjIFRoZSBiY21faXBtY19hZGQgYWRkcyBicmlkZ2Ugb3Igcm91dGUgZW50cmllcyBhY2NvcmRpbmcgdG8gdGhlIEJDTV9JUE1DX0wyIGZsYWcuCisjIFNldHRpbmcgY3VzdG9tX2ZlYXR1cmVfaXBtY19zZXRfZW50cnlfdHlwZV9ieV9yaWY9MSB3aWxsIHVzZSB0aGUgcmVsYXRlZCBJTi1SSUYgSVBNQyBzdGF0ZSAoZW5hYmxlL2Rpc2FibGUpIAorIyB0byBzZWxlY3QgdGhlIGJjbV9pcG1jX2FkZCBlbnRyeSB0eXBlIChicmlkZ2Uvcm91dGUpLgorI2N1c3RvbV9mZWF0dXJlX2lwbWNfc2V0X2VudHJ5X3R5cGVfYnlfcmlmPTAKKworIyBiY204ODZ4eF9sM19pbmdyZXNzX3VycGZfZW5hYmxlPTEKKworIyMgQk9TIGhhbmRsaW5nIG1vZGUKKyMgQkNNODg2NlggT05MWQorIworIyBUaGVyZSBhcmUgdHdvIHdheXMgdG8gaGFuZGxlIEJPUywgY29udHJvbGxlZCBieSBiY204ODZ4eF9tcGxzX3Rlcm1pbmF0aW9uX21vZGU6CisjIDAgLSBVc2UgQk9TIGFzIGtleSBpbiBsb29rdXAuCisjIDEgLSBEb24ndCB1c2UgaXQgKGV4Y2VwdCBmb3IgcmVzZXJ2ZWQgbGFiZWxzKS4KKyMKKyNiY204ODZ4eF9tcGxzX3Rlcm1pbmF0aW9uX2tleV9tb2RlPTAKKworIyBDb2xvciByZXNvbHV0aW9uIG1vZGUgYWxsb3dzIHRoZSB1c2VyIHRvIGhhdmUgbW9yZSBkZXRhaWxlZCBtZXRlcmluZyBjb2xvciBpbmZvcm1hdGlvbi4KKyMgQkNNODg2NjAgT05MWQorIworIyBPcHRpb25zOiAwLTIKKyMgMDogQSByZWQgcmVzdWx0IGZyb20gYm90aCBFdGhlcm5ldCBwb2xpY2VyIGFuZCBtZXRlciBpbXBsaWVzIERQPTMuCisjIDE6IEEgcmVkIHJlc3VsdCBmcm9tIG1ldGVyIGltcGxpZXMgdGhhdCBEUD0yLCB3aGlsZSBhIHJlZCByZXN1bHQgZnJvbSByYXRlIChFdGhlcm5ldCBwb2xpY2VyKSBpbXBsaWVzIERQPTMuCisjcG9saWNlcl9jb2xvcl9yZXNvbHV0aW9uX21vZGU9MQorCisjIyBJbmxpZiBQcm9maWxlIE1hbmFnZW1lbnQgTW9kZSAtIERpc2FibGUgU2FtZSBJbnRlcmZhY2UgRmlsdGVyCisjIEJDTTg4NjZYIE9OTFkKKyMKKyMgQ29udHJvbHMgd2hpY2ggbW9kZSBpcyB1c2VkIGZvciB0aGUgaW5saWYgcHJvZmlsZSBtYW5hZ2VtZW50LgorIyAxOiBCYXNpYyBtb2RlICgxIGJpdCBvZiB0aGUgaW5saWYgcHJvZmlsZSBpcyByZXNlcnZlZCBhbmQgaXMgdXNlZCBmb3IgdGhlIHNhbWUtaW50ZXJmYWNlIGZpbHRlcikuCisjIDA6IEFkdmFuY2VkIG1vZGUgKHRoZSB1c2VyIGNvbnRyb2xzIHdoaWNoIGlubGlmIHByb2ZpbGUgdmFsdWVzIGhhdmUgdGhlIHNhbWUtaW50ZXJmYWNlIGZpbHRlciBkaXNhYmxlZCBmb3IgdGhlbSkuCisjYmNtODg2eHhfbG9naWNhbF9pbnRlcmZhY2VfYnJpZGdlX2ZpbHRlcl9lbmFibGU9MQorCisjIyBEZWZhdWx0IEJsb2NrIEZvcndhcmRpbmcgU3RyZW5ndGgKKyMKKyMgQ29uZmlndXJlIHRoZSBkZWZhdWx0IGZvcndhcmRpbmcgc3RyZW5ndGggb2YgYmxvY2tzLgorIworIyBTT0MgUHJvcGVydGllczoKKyNibG9ja190cmFwX3N0cmVuZ3RoX3Z0dCAtIFZUVCBibG9jayBmb3J3YXJkaW5nIHN0cmVuZ3RoCisjYmxvY2tfdHJhcF9zdHJlbmd0aF9mbHAgLSBGTFAgYmxvY2sgZm9yd2FyZGluZyBzdHJlbmd0aAorI2Jsb2NrX3RyYXBfc3RyZW5ndGhfaGFzaCAtIFNMQiBibG9jayBmb3J3YXJkaW5nIHN0cmVuZ3RoIChCQ004ODY2WCBPTkxZKQorI2Jsb2NrX3RyYXBfc3RyZW5ndGhfcG1mXzAgLSBQTUYgMXN0IGxvb2t1cCBmb3J3YXJkaW5nIHN0cmVuZ3RoCisjYmxvY2tfdHJhcF9zdHJlbmd0aF9wbWZfMSAtIFBNRiAybmQgbG9va3VwIGZvcndhcmRpbmcgc3RyZW5ndGgKKyMKKyMgT3B0aW9uczogMC03CisKKyMjIFN0YXRlZnVsIExvYWQgQmFsYW5jaW5nCisjIEJDTTg4NjZYIE9OTFkKKyMKKyMgU3RhdGVmdWwgTG9hZCBCYWxhbmNpbmcgKFNMQikgYWxsb3dzIHRoZSBsb2FkIGJhbGFuY2luZyBvZiBFQ01QIGFuZCBMQUcKKyMgZ3JvdXBzIHRvIGJlY29tZSBzdGF0ZWZ1bC4KKyMgSW4gc3RhbmRhcmQgbG9hZCBiYWxhbmNpbmcsIHJlbW92aW5nIGEgbWVtYmVyIGZyb20gdGhlIEVDTVAvTEFHCisjIGdyb3VwIG1heSBhZmZlY3QgdGhlIHNlbGVjdGVkIG1lbWJlciwgc2luY2UgdGhlIGZvcm11bGEKKyMgZGVwZW5kcyBvbiBncm91cCBzaXplLgorIyBJbiBzdGF0ZWZ1bCBsb2FkIGJhbGFuY2luZyB0aGUgbWVtYmVyIGlzIHNlbGVjdGVkIG9uY2UgYW5kIHNhdmVkLgorIyBMYXRlciwgdGhlIG1lbWJlciBpcyBhbHdheXMgcmV0cmlldmVkLCBhbmQgZG9lcyBub3QgZGVwZW5kIG9uCisjIHRoZSBzaXplIG9mIHRoZSBMQUcvRUNNUCBncm91cC4KKyMKKyMgcmVzaWxpZW50X2hhc2hfZW5hYmxlIC0gRW5hYmxlL2Rpc2FibGUgU0xCLiBWYWx1ZXM6CisjIDEgLSBFbmFibGUgU0xCLgorIyAwIC0gRGlzYWJsZSBTTEIuCisjcmVzaWxpZW50X2hhc2hfZW5hYmxlPTEKKworIyBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgKGFuZCBzcGVjdWxhdGl2ZSBwYXJzaW5nIGlzIHVzZWQpIGl0IGlzIHBvc3NpYmxlIGZvciBhIHBhY2tldCBvZiBMNG9JUHY0LzZvTVBMUygxLTMgbGFiZWxzKW9FVEgKKyMgd2l0aCBNUExTIGZvcndhcmRpbmcgdG8gdXNlIHRoZSBMNCBoZWFkZXIsIG90aGVyd2lzZSB0aGUgSVB2NC82IGlzIHRoZSBsYXN0IGtub3duIGhlYWRlci4KKyNOb3RlOiBzZXR0aW5nIHRoaXMgZmxhZyBjYW4gY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvciB3aGVuIEJPUyBpcyB1c2VkIGluIHRoZSBzY2VuYXJpbyBhYm92ZS4KKyNjdXN0b21fZmVhdHVyZV9zcGVjdWxhdGl2ZV9MNF9zdXBwb3J0PTAKKworI01ha2UgQXJhZCBTT0MgcHJvcGVydGllcyB3b3JrIGZvciBBcmFkKywgYnkgbWFwcGluZyB0aGUgQkNNODg2NjAgc3VmZml4IHRvIEJDTTg4NjUwCitzb2NfZmFtaWx5LkJDTTg4NjYwPUJDTTg4NjUwCisjTWFrZSBBcmFkIFNPQyBwcm9wZXJ0aWVzIHdvcmsgZm9yIEplcmljaG8sIGJ5IG1hcHBpbmcgdGhlIEJDTTg4Njc1IHN1ZmZpeCB0byBCQ004ODY1MAorc29jX2ZhbWlseS5CQ004ODY3NT1CQ004ODY1MAorI01ha2UgQXJhZCBTT0MgcHJvcGVydGllcyB3b3JrIGZvciBRTVgsIGJ5IG1hcHBpbmcgdGhlIEJDTTg4Mzc1IHN1ZmZpeCB0byBCQ004ODY1MAorc29jX2ZhbWlseS5CQ004ODM3NT1CQ004ODY1MAorI01ha2UgQXJhZCBTT0MgcHJvcGVydGllcyB3b3JrIGZvciBBcmRvbiwgYnkgbWFwcGluZyB0aGUgQkNNODgyMDIgc3VmZml4IHRvIEJDTTg4NjUwCitzb2NfZmFtaWx5LkJDTTg4MjAyPUJDTTg4NjUwCisjTWFrZSBGRTMyMDAgU09DIHByb3BlcnRpZXMgd29yayBmb3IgRkUzMjAwIFNLVSA4OTUyLCBieSBtYXBwaW5nIHRoZSBCQ004ODk1MiBzdWZmaXggdG8gQkNNODg5NTAKK3NvY19mYW1pbHkuQkNNODg5NTI9QkNNODg5NTAKKyNNYWtlIEZFMTYwMCBTT0MgcHJvcGVydGllcyB3b3JrIGZvciBGRTE2MDAgU0tVIDg3NTMsIGJ5IG1hcHBpbmcgdGhlIEJDTTg4NzUzIHN1ZmZpeCB0byBCQ004ODc1MAorc29jX2ZhbWlseS5CQ004ODc1Mz1CQ004ODc1MAorI01ha2UgRkUxNjAwIFNPQyBwcm9wZXJ0aWVzIHdvcmsgZm9yIEZFMTYwMCBTS1UgODc1MiwgYnkgbWFwcGluZyB0aGUgQkNNODg3NTIgc3VmZml4IHRvIEJDTTg4NzUwCitzb2NfZmFtaWx5LkJDTTg4NzUyPUJDTTg4NzUwCisjTWFrZSBBcmFkIFNPQyBwcm9wZXJ0aWVzIHdvcmsgZm9yIFFBWCwgYnkgbWFwcGluZyB0aGUgQkNNODg0NzAgc3VmZml4IHRvIEJDTTg4NjUwCitzb2NfZmFtaWx5LkJDTTg4NDcwPUJDTTg4NjUwCisKKyNNYWtlIEFyYWQgU09DIHByb3BlcnRpZXMgd29yayBmb3IgUVVYLCBieSBtYXBwaW5nIHRoZSBCQ004ODI3MCBzdWZmaXggdG8gQkNNODg2NTAKK3NvY19mYW1pbHkuQkNNODgyNzA9QkNNODg2NTAKKyNNYWtlIEFyYWQgU09DIHByb3BlcnRpZXMgd29yayBmb3IgRkxBSVIsIGJ5IG1hcHBpbmcgdGhlIEJDTTgyMDYgc3VmZml4IHRvIEJDTTg4NjUwCitzb2NfZmFtaWx5LkJDTTgyMDY9QkNNODg2NTAKKyNNYWtlIEFyYWQgU09DIHByb3BlcnRpZXMgd29yayBmb3IgSkVSSUNIT19QTFVTLCBieSBtYXBwaW5nIHRoZSBCQ004ODQ3MCBzdWZmaXggdG8gQkNNODg2NTAKK3NvY19mYW1pbHkuQkNNODg2ODA9QkNNODg2NTAKKworIyBVc2UgZGlmZmVyZW50IG15bWFjIGFkZHJlc3NlcyBmb3IgaXB2NCBhbmQgaXB2NiB3aGVuIHVzaW5nIHZycnAgZm9yIG15bWFjIHRlcm1pbmF0aW9uLgorI2wzX3ZycnBfaXB2Nl9kaXN0aW5jdD0xCisKKyMgRW5hYmxlIG11bHRpcGxlIG15bWFjIHRlcm1pbmF0aW9uIG1vZGUuCisjIEluIG9yZGVyIHRvIGVuYWJsZSBpdCwgYWxzbyBzZXQgbDNfdnJycF9pcHY2X2Rpc3RpbmN0PTAgYW5kIGwzX3ZycnBfbWF4X3ZpZD0wIHNpbmNlIHZycnAgYW5kCisjIG11bHRpcGxlIG15bWFjIG1vZGUgY2FuJ3QgY28gZXhpc3QuCisjbDNfbXVsdGlwbGVfbXltYWNfdGVybWluYXRpb25fZW5hYmxlPTEKKworIyBEaXN0aW5ndWlzaCBiZXR3ZWVuIGlwdjQgYW5kIGFsbCBvdGhlciBsMyBwcm90b2NvbHMgd2hlbiBtdWx0aXBsZSBteW1hYyB0ZXJtaW5hdGluZworI2wzX211bHRpcGxlX215bWFjX3Rlcm1pbmF0aW9uX21vZGU9MQorCisjIFVzdWFsbHkgdGhlIGZpbmFsIERQIGdpdmVuIGJ5IHRoZSBtZXRlciAob3IgdGhlIEluLURQKSBpcyB1bmNoYW5nZWQsIGFuZCBjYW4gYmUgZnJvbSAwLTMuCisjIFdoZW4gdGhpcyBTT0MgcHJvcGVydHkgaXMgc2V0IHRvIDEsIHdoZW4gdGhlIGZpbmFsIElOR1JFU1MgRFAgaXMgMiwKKyMgaXQgaXMgbWFwcGVkIHRvIDEgaW5zdGVhZCwgYW5kIHRodXMgb25seSB0aGUgdmFsdWVzIDAtMSBhbmQgMyBjYW4gYmUgb3V0cHV0LgorIyBUaGlzIGhhcyBubyBlZmZlY3Qgd2hlbiBwb2xpY2VyX2NvbG9yX3Jlc29sdXRpb25fbW9kZT0xLgorI2N1c3RvbV9mZWF0dXJlX2Fsd2F5c19tYXBfcmVzdWx0X2RwXzJfdG9fMT0xCisKKyMgRHluYW1pYyBwb3J0IGZlYXR1cmUKKyNjdXN0b21fZmVhdHVyZV9keW5hbWljX3BvcnQ9MQorCisjIGxvdyBwb3dlciBuaWYgbWFjCisjbG93X3Bvd2VyX25pZl9tYWM9MAorCisjIGFsbG93IG1vZGlmaWNhdGlvbnMgZHVyaW5nIHRyYWZmaWMKKyNjdXN0b21fZmVhdHVyZV9hbGxvd19tb2RpZmljYXRpb25zX2R1cmluZ190cmFmZmljPTEKKworIyBtZW1fY2FjaGVfZW5hYmxlIHByb3BlcnR5CisjIENhY2hlIG1lbW9yeSBtb2RlIC0gZW5hYmxlIG1lbW9yeSBjYWNoaW5nIGR1cmluZyBpbml0LgorIyBOb3RlOiBUaGUgdXNlciBNVVNUIGFkZCB0aGUgcHJvcGVydHkgbmFtZSB3aXRoIHN1ZmZpeCAnX3NwZWNpZmljJyBiZWZvcmUgcHJvdmlkaW5nIHRoZSBsaXN0IG9mIHRoZSBjYWNoZWQgbWVtb3JpZXMuCisjIFBvc3NpYmxlIG9wdGlvbnMgKHN1ZmZpeGVzKToKKyMgX2FsbCAgICAgICAgLSBlbmFibGUgYWxsIHRhYmxlcyAoZXhjbHVkaW5nIHJlYWQtb25seS93cml0ZS1vbmx5L2R5bmFtaWMvc2lnbmFsKQorIyBfcHJlZGVmaW5lZCAtIGVuYWJsZSBwcmVkZWZpbmVkIGxpc3Qgb2YgdGFibGVzCisjIF9wYXJpdHkgICAgIC0gZW5hYmxlIHRhYmxlcyBwcm90ZWN0ZWQgYnkgcGFyaXR5IGZpZWxkCisjIF9lY2MgICAgICAgIC0gZW5hYmxlIHRhYmxlcyBwcm90ZWN0ZWQgYnkgZWNjIGZpZWxkCisjIF9zcGVjaWZpYyAgIC0gZW5hYmxlIHNwZWNpZmljIHRhYmxlcyAtIE1VU1QgYWRkIHRoaXMgc3VmZml4IGlmIHNwZWNpZmljIHRhYmxlcyBzaG91bGQgYmUgY2FjaGVkCisjIF9zcGVjaWZpY19YIC0gZW5hYmxlIGNhY2hpbmcgZm9yIG1lbW9yeSBYLCB3aGVyZSBYIGlzIG1lbW9yeSBuYW1lLiBOb3RlOiB3aWxsIG5vdCB3b3JrIHdpdGhvdXQgdGhlIHByZXZpb3VzIHN1ZmZpeAorIyBFeGFtcGxlOiAodGhpcyBleGFtcGxlIHdpbGwgZW5hYmxlIGNhY2hpbmcgb2YgdGhlIElIUF9SRUNZQ0xFX0NPTU1BTkQgdGFibGUpCisjIG1lbV9jYWNoZV9lbmFibGVfc3BlY2lmaWMuQkNNODg2NTA9MSAjKE1VU1QgYmUgYWRkZWQgaW4gY2FzZSBzcGVjaWZpYyB0YWJsZXMgc2hvdWxkIGJlIGNhY2hlZCkKKyMgbWVtX2NhY2hlX2VuYWJsZV9zcGVjaWZpY19JSFBfUkVDWUNMRV9DT01NQU5ELkJDTTg4NjUwPTEKKyMgbWVtX2NhY2hlX2VuYWJsZV9zcGVjaWZpYy5CQ004ODY3NT0xCisjIG1lbV9jYWNoZV9lbmFibGVfc3BlY2lmaWNfSVBTX1FVRVVFX1BSSU9SSVRZX1RBQkxFLkJDTTg4Njc1PTEKKworbWVtX2NhY2hlX2VuYWJsZV9wYXJpdHkuQkNNODg2NTA9MQorbWVtX2NhY2hlX2VuYWJsZV9wYXJpdHkuQkNNODg2NzU9MQorbWVtX2NhY2hlX2VuYWJsZV9wYXJpdHkuQkNNODgyMDI9MQorbWVtX2NhY2hlX2VuYWJsZV9wYXJpdHkuQkNNODg3NTA9MQorbWVtX2NhY2hlX2VuYWJsZV9wYXJpdHkuQkNNODg5NTA9MQorbWVtX2NhY2hlX2VuYWJsZV9lY2M9MAorCisjIG1lbV9ub2NhY2hlIHByb3BlcnR5CisjIENhY2hlIG1lbW9yeSBtb2RlIC0gZGlzYWJsZSBtZW1vcnkgY2FjaGluZyBmb3Igc3BlY2lmaWMgdGFibGUgZHVyaW5nIGluaXQuCisjIE5vdGU6IHRoZSB1c2VyIE1VU1QgYWRkIHRoZSBkZWZhdWx0IHByb3BlcnR5IG5hbWUgYmVmb3JlIHByb3ZpZGluZyB0aGUgbGlzdCBvZiB0aGUgdW5jYWNoZWQgbWVtb3JpZXMuCisjIFBvc3NpYmxlIG9wdGlvbnMgKHN1ZmZpeGVzKToKKyMgc3BlY2lmaWNfWCAtIGRpc2FibGUgY2FjaGluZyBmb3IgbWVtb3J5IFgsIHdoZXJlIFggaXMgbWVtb3J5IG5hbWUuIE5vdGU6IHdpbGwgbm90IHdvcmsgd2l0aG91dCB0aGUgcHJldmlvdXMgc3VmZml4CisjIEV4YW1wbGU6ICh0aGlzIGV4YW1wbGUgd2lsbCBlbmFibGUgY2FjaGluZyBvZiB0aGUgSUhQX1RFUk1JTkFUSU9OX1BST0ZJTEVfVEFCTEUgdGFibGUpCisjIG1lbV9ub2NhY2hlLkJDTTg4NjYwPTEgIyhNVVNUIGJlIGFkZGVkIGluIGNhc2UgdGhlcmUgYXJlIHVuY2FjaGVkIG1lbW9yaWVzKQorIyBtZW1fbm9jYWNoZV9JSFBfVEVSTUlOQVRJT05fUFJPRklMRV9UQUJMRS5CQ004ODY2MD0xCisjbWVtX25vY2FjaGUuQkNNODg2ODA9MQorI21lbV9ub2NhY2hlX1BQREJfQl9MSUZfVEFCTEVfTEFCRUxfUFJPVE9DT0xfT1JfTFNQLkJDTTg4NjgwPTEKKyNtZW1fbm9jYWNoZV9QUERCX0JfTElGX1RBQkxFLkJDTTg4NjgwPTEKKworCitjdXN0b21fZmVhdHVyZV9ub19iYWNrZG9vcj0xCisKKyMgSmVyaWNobyBzcGxpdCBob3Jpem9uIG1vZGUKKyMgMCAtIFVzZSAwLTEgcmFuZ2UgZm9yIGxpZiBvcmllbnRhdGlvbi4KKyMgMSAoZGVmYXVsdCkgLSBVc2UgMC0xIHJhbmdlIGZvciBsaWYgb3JpZW50YXRpb24gaW4gQUMgbGlmcyBhbmQgMC0zIHJhbmdlIGZvciBvcmllbnRhdGlvbiBpbiBvdGhlciBsaWYgdHlwZXMuCitzcGxpdF9ob3Jpem9uX2ZvcndhcmRpbmdfZ3JvdXBzX21vZGUuQkNNODg2NzU9MQorc3BsaXRfaG9yaXpvbl9mb3J3YXJkaW5nX2dyb3Vwc19tb2RlLkJDTTg4NDcwPTEKK3NwbGl0X2hvcml6b25fZm9yd2FyZGluZ19ncm91cHNfbW9kZS5CQ004ODY4MD0xCisKKworIyBFbnRyaWVzIGNhcGFjaXRpZXMgZm9yIHB1YmxpYyBhbmQgcHJpdmF0ZSBJUCBmb3J3YXJkaW5nIHRhYmxlcworcHJpdmF0ZV9pcF9mcndyZF90YWJsZV9zaXplPTUwMDAwMAorcHVibGljX2lwX2Zyd3JkX3RhYmxlX3NpemU9NTAwMDAwCisKKworI0VuYWJsZSBLQVBTIEFSTSBhbmQgRGVzY3JpcHRvci1ETUEKK2RtYV9kZXNjX2FnZ3JlZ2F0b3JfY2hhaW5fbGVuZ3RoX21heD01MDAKK2RtYV9kZXNjX2FnZ3JlZ2F0b3JfYnVmZl9zaXplX2tiPTEwMAorZG1hX2Rlc2NfYWdncmVnYXRvcl90aW1lb3V0X3VzZWM9MTAwMAorZG1hX2Rlc2NfYWdncmVnYXRvcl9lbmFibGVfc3BlY2lmaWNfS0FQUz0xCisKKyNJbiBKZXJpY2hvIHRoZSBLQVBTIEFSTSBETUEgYWxyZWFkeSBjb25zdW1lcyA2NEtCIG9mIGJ1ZmZlciBtZW1vcnkKK2RtYV9kZXNjX2FnZ3JlZ2F0b3JfYnVmZl9zaXplX2tiLkJDTTg4Njc1PTQwCisKKyMgRW50cmllcyBjYXBhY2l0aWVzIGZvciBkaXJlY3QgYWNjZXNzIHRhYmxlcyBpbiBLQVBTICg4SyBncmFudWxhcml0eSkKKyNwbWZfa2Fwc19sYXJnZV9kYl9zaXplPTgwOTYKKworI2VuYWJsZSBleHBvc2Ugb2YgSFcgaWQgaW5zdGVhZCBvZiBTVyBpZCBpbiBUcmFwcy4KK2JjbTg4Nnh4X3J4X3VzZV9od190cmFwX2lkLkJDTTg4NjUwPTEKK2JjbTg4Nnh4X3J4X3VzZV9od190cmFwX2lkLkJDTTg4Njc1PTEKKworIyBKZXJpY2hvIC0gbWF4aW11bSBSSUYgSWQgKCB2YWxpZCByYW5nZSBpcyAwIHRvIDMyKjEwMjQtMSkKKyNyaWZfaWRfbWF4PTIwMDAwCisKKyNJZiBzZXQsIG5ldmVyIGFkZCB0aGUgUFBIIGxlYXJuIGV4dGVuc2lvbiAodW5sZXNzIGV4cGxpY3RseSByZXF1aXJlZCBpbiBGUCBhY3Rpb24pLgorI2JjbTg4Nnh4X3BwaF9sZWFybl9leHRlbnNpb25fZGlzYWJsZS5CQ004ODY1MD0wCisjYmNtODg2eHhfcHBoX2xlYXJuX2V4dGVuc2lvbl9kaXNhYmxlLkJDTTg4NjYwPTAKKyNiY204ODZ4eF9wcGhfbGVhcm5fZXh0ZW5zaW9uX2Rpc2FibGUuQkNNODg2NzU9MAorCisjIEplcmljaG8gLSBmaWVsZF9pcF9maXJzdF9mcmFnbWVudF9wYXJzZWQKKyNmaWVsZF9pcF9maXJzdF9mcmFnbWVudF9wYXJzZWQ9MAorCisjIGxlYXJuaW5nX2ZpZm9fZG1hX2J1ZmZlcl9zaXplIGluIGJ5dGVzIChob3N0IG1lbW9yeSBzaXplKS4gVmFsaWQgcmFuZ2UgaXMgMjAtMzI3NjgwCitsZWFybmluZ19maWZvX2RtYV9idWZmZXJfc2l6ZT0yMDAwMDAKKyMgbGVhcm5pbmdfZmlmb19kbWFfdGltZW91dCBpbiBtaWNyb3NlY29uZHMuIFZhbGlkIHJhbmdlIGlzIDAtNjU1MzUuIDAgbWVhbnMgbm8gdGltZW91dC4KK2xlYXJuaW5nX2ZpZm9fZG1hX3RpbWVvdXQ9MzI3NjcKKyMgbGVhcm5pbmdfZmlmb19kbWFfdGhyZXNob2xkIHZhbGlkIHJhbmdlIGlzIDEtMTYzODQgKDB4NDAwMCkKK2xlYXJuaW5nX2ZpZm9fZG1hX3RocmVzaG9sZD00CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyBPQU0gYW5kIEJGRCAjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBPQU0gLyBCRkQgaW5pdGlhbGl6YXRpb24KKyMgVG8gZW5hYmxlIE9BTSBzZXQgb2FtX2VuYWJsZSB0byAxCisjIFRvIGVuYWJsZSBCRkQgc2V0IGJmZF9lbmFibGUgdG8gMQorIyBCZSBhd2FyZSB0aGF0IE9BTSByZXF1aXJlcyBtb3JlIHNldHRpbmdzIChDb25maWd1cmluZyBPQU1QIGFuZCBSZWN5Y2xlIHBvcnQpCisKKyMgb2FtX2VuYWJsZT0xCisjIGJmZF9lbmFibGU9MQorCisjIFNldCBPQU1QIHBvcnQKK251bV9vYW1wX3BvcnRzLkJDTTg4NjUwPTAKKworIyBJZiBCRkQgaXMgdXNlZCwgcnVudGltZV9wZXJmb3JtYW5jZV9vcHRpbWl6ZV9lbmFibGVfc2NoZWRfYWxsb2NhdGlvbiBzaG91bGQgYmUgc2V0IHRvIDAKKyMgdG8gcHJldmVudCBoaWdoIG1lbW9yeSBjb25zdW1wdGlvbgorCisjIERpc2FibGUgdGhlIGZvbGxvd2luZzoKKyMgYmNtODg2eHhfbmV4dF9ob3BfbWFjX2V4dGVuc2lvbl9lbmFibGUKKyMgYmNtODg2eHhfaXB2Nl90dW5uZWxfZW5hYmxlCisKKyMgVG8gdXNlIElFRUUgMTU4OCwgY29uZmlndXJlIERQTEwgY2xvY2sKKworIyBDb25maWd1cmUgcmVjeWNsZSBwb3J0IChhc3N1bWluZyB1Y29kZV9wb3J0XzQwPVJDWS4wKQorCisjb2FtX3JjeV9wb3J0LkJDTTg4NjUwPTQwCisjdG1fcG9ydF9oZWFkZXJfdHlwZV9pbl80MC5CQ004ODY1MD1UTQorI3RtX3BvcnRfaGVhZGVyX3R5cGVfb3V0XzQwLkJDTTg4NjUwPUVUSAorI3Vjb2RlX3BvcnRfNDAuMD1SQ1kuMDpjb3JlXzAuNDAKKworIyBNUExTLVRQIGNoYW5uZWwgdHlwZXMgZm9yIE9BTS9CRkQgLSBJZiBNUExTLVRQIHVzZWQsIGNoYW5uZWwgc2hvdWxkIGJlIHNwZWNpZmllZAorIyBBdmFpbGFibGUgdHlwZXM6IG1wbHN0cF9iZmRfY29udHJvbF9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfcHdfYWNoX2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9kbG1fY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2lsbV9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfZG1fY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2lwdjRfY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2NjX2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9jdl9jaGFubmVsX3R5cGUKKyMgICAgICAgICAgICAgICBtcGxzdHBfb25fZGVtYW5kX2N2X2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9wd2Vfb2FtX2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9pcHY2X2NoYW5uZWxfdHlwZQorIyAgICAgICAgICAgICAgIG1wbHN0cF9mYXVsdF9vYW1fY2hhbm5lbF90eXBlCisjICAgICAgICAgICAgICAgbXBsc3RwX2c4MTEzX2NoYW5uZWxfdHlwZQorI21wbHN0cF9nODExM19jaGFubmVsX3R5cGU9MHg4OTAyCisjbXBsc3RwX2ZhdWx0X29hbV9jaGFubmVsX3R5cGU9MHg1Njc4CisKKyMgVXNlIEJGRCBNUExTIFRQCisjYmZkX2VuY2Fwc3VsYXRpb25fbW9kZT0xCisKKyMgVXNlIDE3MTEgcHJvdG9jb2wKKyNjdXN0b21fZmVhdHVyZV95MTcxMV9lbmFibGVkPTEKKworIyBPQU0gRE1BIHRocmVzaG9sZAorI29hbXBfZmlmb19kbWFfZXZlbnRfaW50ZXJmYWNlX2VuYWJsZT0xCisjb2FtcF9maWZvX2RtYV9ldmVudF9pbnRlcmZhY2VfdGltZW91dD0wCisjb2FtcF9maWZvX2RtYV9ldmVudF9pbnRlcmZhY2VfYnVmZmVyX3NpemU9MHgxMDAwCisjb2FtcF9maWZvX2RtYV9ldmVudF9pbnRlcmZhY2VfdGhyZXNob2xkPTEwCisKKyMgUE9SVCBCQVNFRCBQV0UgVEVSTUlOQVRJT04KKyNwd2VfdGVybWluYXRpb25fcG9ydF9tb2RlX2VuYWJsZSA9MQorCisjIFdhbGsgYXJvdW5kIGZvciBJbmxpZiBkYXRhIEVycmF0YSwgZm9yIEdBTCBwYWNrZXRzLCBsb29rdXAgbXBscyB0YWJsZSB3aXRoIHZhbGlkIG1wbHMgbGFiZWwKKyMgaXQncyBub3Qgb2ZmaWNhbCBzb2x1dGlvbiwganVzdCBmb3Igc29tZSBkZWRpY2F0ZWQgY3VzdG9tZXIuCisjIG9mZmljYWwgc29sdXRpb24gd2lsbCBiZSBQTUYuIHBsZWFzZSByZWZlciB0aGUgcmVsZXZhbnQgZG9jLgorI2N1c3RvbV9mZWF0dXJlX2dhbF9sb29rdXBfZXhhY3RseT0xCisKK2N1c3RvbV9mZWF0dXJlX2Ntb2RlbF9sb29wYmFjaz0xCisKKyNmb3IgSVB2NlVDOiB1c2UgVGNhbSBpbnN0ZWFkIG9mIEtBUFMKKyNjdXN0b21fZmVhdHVyZV9sM19pcHY2X3VjX3VzZV90Y2FtPTAKKyMgaXB2Nl9tYyBuZWVkIEtQQiBsaWJyYXJ5CitjdXN0b21fZmVhdHVyZV9pcHY2X21jX2ZvcndhcmRpbmdfZGlzYWJsZSA9IDEKK3ZsYW5fbWF0Y2hfY3JpdGVyaWFfbW9kZT1QT05fUENQX0VUSEVSVFlQRQorCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvZG54LnNvYyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvc3ZrNC9kbnguc29jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTA2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvZG54LnNvYwpAQCAtMCwwICsxLDE5MiBAQAorIworIyAkSWQ6IGplci5zb2MsdiAxLjkwIDIwMTMvMDgvMTQgMDg6MzI6MDAgbmluYXNoIEV4cCAkCisjCisjICRDb3B5cmlnaHQ6IChjKSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJAorIworCitkZWJ1ZyBpbmZvCitkZWJ1ZyBhcHBsIHJjbG9hZCB3YXJuCitkZWJ1ZyBhcHBsIHN5bXRhYiB3YXJuCitkZWJ1ZyBiY20gcngsdHgsbGluayxhdHRhY2ggd2FybgorZGVidWcgc29jIHRlc3RzIHdhcm4KK2RlYnVnIHNvYyByeCxwaHksc2NoYW4scmVnLHNvY21lbSxkbWEsbWVtLG1paW0sbWlpLGludHIsY291bnRlcixkZHIgd2FybgorZGVidWcgc29jIGNvbW1vbiBlcnIKK2RlYnVnIHN5cyB2ZXJpbmV0IHdhcm4KK2RlYnVnIHNvYyBwaHlzaW0gd2FybgorCitpZiAkP1FNWF9BMCB8fCAkP0JDTTg4MzcwX0EwIHx8ICQ/QkNNODgzNzFfQTAgfHwgJD9CQ004ODM3MU1fQTAgfHwgJD9CQ004ODM3NV9BMCB8fCAkP0JDTTg4Mzc2X0EwIHx8ICQ/QkNNODgzNzZNX0EwIHx8ICQ/QkNNODgzNzdfQTAgfHwgJD9CQ004ODM3OF9BMCB8fCAkP0JDTTg4Mzc5X0EwIHx8IFwKKyAgICQ/UU1YX0ExIHx8ICQ/QkNNODgzNzBfQTEgfHwgJD9CQ004ODM3MV9BMSB8fCAkP0JDTTg4MzcxTV9BMSB8fCAkP0JDTTg4Mzc1X0ExIHx8ICQ/QkNNODgzNzZfQTEgfHwgJD9CQ004ODM3Nk1fQTEgfHwgJD9CQ004ODM3N19BMSB8fCAkP0JDTTg4Mzc4X0ExIHx8ICQ/QkNNODgzNzlfQTEgfHxcCisgICAkP1FNWF9CMCB8fCAkP0JDTTg4MzcwX0IwIHx8ICQ/QkNNODgzNzFfQjAgfHwgJD9CQ004ODM3MU1fQjAgfHwgJD9CQ004ODM3NV9CMCB8fCAkP0JDTTg4Mzc2X0IwIHx8ICQ/QkNNODgzNzZNX0IwIHx8ICQ/QkNNODgzNzdfQjAgfHwgJD9CQ004ODM3OF9CMCB8fCAkP0JDTTg4Mzc5X0IwICBcCisgICAnbG9jYWwgUU1YIDEnCitpZiAkP0pFUklDSE9fQTAgfHwgJD9CQ004ODY3MF9BMCB8fCAkP0JDTTg4NjcxX0EwIHx8ICQ/QkNNODg2NzFNX0EwIHx8ICQ/QkNNODg2NzJfQTAgfHwgJD9CQ004ODY3M19BMCB8fCAkP0JDTTg4Njc0X0EwIHx8ICQ/QkNNODg2NzVfQTAgfHwgJD9CQ004ODY3NU1fQTAgfHwgJD9CQ004ODY3Nl9BMCB8fCAkP0JDTTg4Njc2TV9BMCB8fCAkP0JDTTg4Njc4X0EwIHx8ICQ/QkNNODg2NzlfQTAgfHwgXAorICAgJD9KRVJJQ0hPX0ExIHx8ICQ/QkNNODg2NzBfQTEgfHwgJD9CQ004ODY3MV9BMSB8fCAkP0JDTTg4NjcxTV9BMSB8fCAkP0JDTTg4NjcyX0ExIHx8ICQ/QkNNODg2NzNfQTEgfHwgJD9CQ004ODY3NF9BMSB8fCAkP0JDTTg4Njc1X0ExIHx8ICQ/QkNNODg2NzVNX0ExIHx8ICQ/QkNNODg2NzZfQTEgfHwgJD9CQ004ODY3Nk1fQTEgfHwgJD9CQ004ODY3OF9BMSB8fCAkP0JDTTg4Njc5X0ExIHx8IFwKKyAgICQ/SkVSSUNIT19CMCB8fCAkP0JDTTg4NjcwX0IwIHx8ICQ/QkNNODg2NzFfQjAgfHwgJD9CQ004ODY3MU1fQjAgfHwgJD9CQ004ODY3Ml9CMCB8fCAkP0JDTTg4NjczX0IwIHx8ICQ/QkNNODg2NzRfQjAgfHwgJD9CQ004ODY3NV9CMCB8fCAkP0JDTTg4Njc1TV9CMCB8fCAkP0JDTTg4Njc2X0IwIHx8ICQ/QkNNODg2NzZNX0IwIHx8ICQ/QkNNODg2NzhfQjAgfHwgJD9CQ004ODY3OV9CMCBcCisgICAnbG9jYWwgSkVSSUNITyAxJworaWYgJD9CQ004ODY4MF9BMCB8fCAgJD9CQ004ODY4MV9BMCB8fCAgJD9CQ004ODY4Ml9BMCB8fCAkP0JDTTg4NjgzX0EwIHx8ICAkP0JDTTg4MzgwX0EwIHx8ICAkP0JDTTg4MzgxX0EwIFwKKyAgICdsb2NhbCBKRVJQTFVTIDEnCisKK2lmICQ/QkNNODg2OTBfQTAgXAorICAgJ2xvY2FsIEpFUlRXTyAxJworCitpZiAkP1FNWCBcCisgICAgJ3JjbG9hZCBiY204ODM3NV9ib2FyZC5zb2MnCitpZiAkP0pFUklDSE8gXAorICAgICdyY2xvYWQgYmNtODg2NzVfYm9hcmQuc29jJworCitpZiAkP0pFUlBMVVMgXAorICAgICdyY2xvYWQgYmNtODg2ODBfYm9hcmQuc29jJworCisjCisjIEZvciBKZXJpY2hvLTI6CisjIFRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSB3aGVuIHdlIGhhdmUgYmNtODg2OTBfYm9hcmQuc29jCisjCitpZiAkP0pFUlRXTyBcCisgICAgJ3JjbG9hZCBiY204ODY4MF9ib2FyZC5zb2MnCisKKyMgTG9hZCBEUkFNIHR1bmluZyBwcm9wZXJ0aWVzIGZyb20gbG9jYWwgRmlsZS4gUmNMb2FkIHdpbGwgbm90IGZhaWwgaWYgZmlsZSBub3QgZm91bmQsIGFuZCB3aWxsIG5vdCBzaG93IGVycm9ycyBvZiBtaXNzaW5nIGZpbGUuCitzZXQgUkNFcnJvcj1vZmYKK2RlYnVnIGFwcGwgc2hlbGwgd2FybgoraWYgJD9RTVggXAorICAgICdyY2xvYWQgL2hvbWUvbmVnZXYvYmNtODgzNzVfZHJhbV90dW5lLnNvYycKKworaWYgJD9KRVJJQ0hPIFwKKyAgICAncmNsb2FkIC9ob21lL25lZ2V2L2JjbTg4Njc1X2RyYW1fdHVuZS5zb2MnCisKK2RlYnVnIGFwcGwgc2hlbGwgPQorc2V0IFJDRXJyb3I9b24KKworc2V0IFJDRXJyb3I9b2ZmCityY2xvYWQgY29tYm8yOF9kcmFtLnNvYworc2V0IFJDRXJyb3I9b24KKworI1NldCBmYWJyaWMgY29ubmVjdCBtb2RlIGFzIEZFIGZvciBtdWx0aSBGQVAgc3lzdGVtCitpZiAkP2RpYWdfY2hhc3NpcyAiIFwKKyAgIGNvbmZpZyBhZGQgZmFicmljX2Nvbm5lY3RfbW9kZS5CQ004ODY3NT1GRSIKKworIyBTZXQgbW9kaWQ6CisjIElmIGRpYWdfY2hhc3NpcyBpcyBlbmFibGVkICh0d28gbGluZSBjYXJkcyksIGFuZCAnc2xvdCcgaXMgZGVmaW5lZCAoc2xvdCBpcyBkZWZpbmVkIG9ubHkgd2hlbgorIyB3b3JraW5nIHdpdGhvdXQgYSBtYW5hZ2VtZW50IGNhcmQgLSBzZXQgbW9kaWQgdG8gYmUgJ3Nsb3QnCisjIE90aGVyd2lzZSAoc2luZ2xlIGxpbmUgY2FyZCwgb3IgbWFuYWdlbWVudCBjYXJkKSwgc2V0IG1vZGlkIHRvIGJlIDAgZm9yIHVuaXQgMCwgYW5kIDEgZm9yIHVuaXQgIT0gMAoraWYgJD9kaWFnX2NoYXNzaXMgJiYgJD9zbG90ICJcCisgIGxvY2FsIG1vZGlkICRzbG90IiBcCitlbHNlICJcCisgIGxvY2FsIG1vZGlkICR1bml0IgorZXhwciAkbW9kaWQ9PTE7IGlmICQ/ICJsb2NhbCBtb2RpZCAyIgorCitpZiAkP21vZHVsZV9pZCAiIFwKKyAgbG9jYWwgbW9kaWQgJG1vZHVsZV9pZCIKKworZWNobyAiJHVuaXQ6IG1vZGlkPSRtb2RpZCIKKworIyBTZXQgYmFzZV9tb2RpZDoKKyMgSWQgYmFzZV9tb2R1bGVfaWQgaXMgc2V0LCB0aGVuIHNldCBiYXNlX21vZGlkIHRvIGhhdmUgYmFzZV9tb2R1bGVfaWQgdmFsdWUuCisjIE90aGVyd2lzZSwgc2V0IGJhc2VfbW9kaWQgdG8gYmUgMC4KK2lmICQ/YmFzZV9tb2R1bGVfaWQgIiBcCisgIGxvY2FsIGJhc2VfbW9kaWQgJGJhc2VfbW9kdWxlX2lkIiBcCitlbHNlICIgXAorICBsb2NhbCBiYXNlX21vZGlkIDAiCisKK2V4cHIgJGJhc2VfbW9kaWQgPiAwCitpZiAkPyAiIFwKKyAgZWNobyAnJHVuaXQ6IGJhc2VfbW9kaWQ9JGJhc2VfbW9kaWQnIgorCitpZiAkP2RpYWdfY2hhc3NpcyAiIFwKKyAgbG9jYWwgbm9mX2RldmljZXMgMiIgXAorZWxzZSAiXAorICBsb2NhbCBub2ZfZGV2aWNlcyAxIgorCitpZiAkP25fZGV2aWNlcyAiIFwKKyAgbG9jYWwgbm9mX2RldmljZXMgJG5fZGV2aWNlcyIKKworZXhwciAkbm9mX2RldmljZXMgPiAxCitpZiAkPyAiIFwKKyAgZWNobyAnJHVuaXQ6IG5vZl9kZXZpY2VzPSRub2ZfZGV2aWNlcyciCisKK2lmICQ/bW5nX2NwdSAiIFwKKyAgZWNobyAnJHVuaXQ6bWFuYWdlbWVudCBjYXJkIC0gcG9sbGluZyBpcyBzZXQgb24nOyBcCisgIGNvbmZpZyBhZGQgcG9sbGVkX2lycV9tb2RlLkJDTTg4Njc1PTE7IFwKKyAgY29uZmlnIGFkZCBzY2hhbl9pbnRyX2VuYWJsZS5CQ004ODY3NT0wOyBcCisgIGNvbmZpZyBhZGQgdGRtYV9pbnRyX2VuYWJsZS5CQ004ODY3NT0wOyBcCisgIGNvbmZpZyBhZGQgdHNsYW1faW50cl9lbmFibGUuQkNNODg2NzU9MDsgXAorICBjb25maWcgYWRkIG1paW1faW50cl9lbmFibGUuQkNNODg2NzU9MDsgIgorCisjQ291bnRlcnMgdW5hdmFpbGFibGUgaW4gY21vZGVsCitpZiAkP2Ntb2RlbCAiIFwKKyAgY29uZmlnIGFkZCBjb3VudGVyX2VuZ2luZV9zYW1wbGluZ19pbnRlcnZhbD0wOyIKKworI2RlZmF1bHQgdmFsdWVzIGluIGEgY2FzZSB3aGljaCB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBub3QgZXhpc3QKK2lmICEkP2RpYWdfY29zcV9kaXNhYmxlICJcCisgIGxvY2FsIGRpYWdfY29zcV9kaXNhYmxlIDAiCitpZiAhJD93YXJtYm9vdCAiXAorICBsb2NhbCB3YXJtYm9vdCAwIgoraWYgISQ/ZGlhZ19kaXNhYmxlICJcCisgIGxvY2FsIGRpYWdfZGlzYWJsZSAwIgoraWYgISQ/ZGlhZ19ub19pdG1oX3Byb2dfbW9kZSAiXAorICBsb2NhbCBkaWFnX25vX2l0bWhfcHJvZ19tb2RlIDAiCitpZiAhJD9sMl9tb2RlICJcCisgIGxvY2FsIGwyX21vZGUgMCIKKworaWYgJD9KRVJQTFVTICJcCisgIGxvY2FsIGRpYWdfZGlzYWJsZSAwIgorbG9jYWwgaW5pdF9vdGhlcnMgTm9MaW5rc2Nhbj0wCitpZiAkP0pFUlBMVVMgIlwKKyAgbG9jYWwgaW5pdF9vdGhlcnMgJ05vSW50cj0xIE5vTGlua3NjYW49MSBOb0FwcGxTdGs9MCciCisKKyNEaXNhYmxlIGludGVycnVwdHMgaW4gY21vZGVsCitpZiAkP2Ntb2RlbCAiXAorICBsb2NhbCBub19pbnRyIDEiIFwKK2Vsc2UgIlwKKyAgbG9jYWwgbm9faW50ciAwIgorCisjCisjIEZvciBKZXJpY2hvLTIsIHdlIFRFTVBPUkFSSUxZIGRpc2FibGUgc29tZSBjb21wb25lbnRzIHRvIHF1aWNrbHkgZW5hYmxlCisjIGEgd29ya2luZyBQQ0lEIHZlcnNpb24uCisjIAoraWYgJD9KRVJUV08gIlwKKyAgbG9jYWwgbm9fc29jIDAiCisKK2lmICQ/SkVSVFdPICJcCisgIGxvY2FsIG5vX2ludHIgMSIKKworCisjSU5JVF9ETlggTW9kSUQ9JG1vZGlkIE5vZkRldmljZXM9JG5vZl9kZXZpY2VzIENvc3FEaXNhYmxlPSRkaWFnX2Nvc3FfZGlzYWJsZSBOb0FwcGw9JGRpYWdfZGlzYWJsZSBXYXJtYm9vdD0kd2FybWJvb3QgTm9SeExvcz0xICRpbml0X290aGVycyBOb0l0bWhQcm9nTW9kZT0kZGlhZ19ub19pdG1oX3Byb2dfbW9kZSBMMk1vZGU9JGwyX21vZGUgTm9JbnRyPSRub19pbnRyIE5vU29jPSRub19zb2MKKworSU5JVF9ETlgKKworI0xFRCBzdXBwb3J0IHNlY3Rpb24gc3RhcnQKKyNQcm9ncmFtIG9mIExFRDAKK2xvY2FsIGxlZGNvZGVfMCAnMDIgMDUgNjcgMkQgMDIgMDEgNjcgMkQgMDIgMTEgNjcgMkQgMDIgMDkgNjcgMkRcCisgMDIgMTUgNjcgMkQgMDIgMEQgNjcgMkQgODYgRTAgM0EgMDYgMjggMzIgMDAgMzJcCisgMDEgQjcgOTcgNzUgM0UgMTYgRTAgQ0EgMDYgNzAgM0UgNzcgM0EgNjcgMzMgNzVcCisgM0EgNzcgMUMgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgNTcgMzIgMEZcCisgODcgNTcnICNzZGs4ODY3MC5oZXgKKworI1Byb2dyYW0gb2YgTEVEMQorbG9jYWwgbGVkY29kZV8xICcwMiAxRCA2NyAyRCAwMiAyRCA2NyAyRCAwMiAwNSA2NyAyRCAwMiAwRCA2NyAyRFwKKyAwMiAwOSA2NyAyRCAwMiAwMSA2NyAyRCA4NiBFMCAzQSAwNiAyOCAzMiAwMCAzMlwKKyAwMSBCNyA5NyA3NSAzRSAxNiBFMCBDQSAwNiA3MCAzRSA3NyAzQSA2NyAzMyA3NVwKKyAzQSA3NyAxQyAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyA1NyAzMiAwRlwKKyA4NyA1NycgI3Nkazg4NjcwLmhleAorCisKKyNQcm9ncmFtIG9mIExFRDIKK2xvY2FsIGxlZGNvZGVfMiAnMDIgMDEgNjcgMkQgMDIgMDkgNjcgMkQgMDIgMEQgNjcgMkQgMDIgMDUgNjcgMkRcCisgMDIgMkQgNjcgMkQgMDIgMUQgNjcgMkQgODYgRTAgM0EgMDYgMjggMzIgMDAgMzJcCisgMDEgQjcgOTcgNzUgM0UgMTYgRTAgQ0EgMDYgNzAgM0UgNzcgM0EgNjcgMzMgNzVcCisgM0EgNzcgMUMgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgNTcgMzIgMEZcCisgODcgNTcnICNzZGs4ODY3MC5oZXgKKworIyBEb3dubG9hZCBMRUQgY29kZSBpbnRvIExFRCBwcm9jZXNzb3JzIGFuZCBlbmFibGUgKGlmIGFwcGxpY2FibGUpLgoraWYgJD9mZWF0dXJlX2xlZF9wcm9jICYmICEkP3NpbXVsYXRvciBcCisgICAgImxlZCAwIHByb2cgJGxlZGNvZGVfMDsgXAorICAgICBsZWQgMSBwcm9nICRsZWRjb2RlXzE7IFwKKyAgICAgbGVkIDIgcHJvZyAkbGVkY29kZV8yOyBcCisgICAgIGxlZCBhdXRvIG9uOyBcCisgICAgIGxlZCAwIHN0YXJ0OyBcCisgICAgIGxlZCAxIHN0YXJ0OyBcCisgICAgIGxlZCAyIHN0YXJ0IgorCisKK2VjaG8gImRueC5zb2M6IERvbmUuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9zdms0L2R1bmUuc29jIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9zdms0L2R1bmUuc29jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjI0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvZHVuZS5zb2MKQEAgLTAsMCArMSwxMDgwIEBACisjCisjICRJZDogZHVuZS5zb2MsdiAxLjUgMjAxMS8xMi8yMCAxMDo1MzoyOCB5YXJvbm0gRXhwICQKKyMKKyMgJENvcHlyaWdodDogKGMpIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4kCisjCisjIENvbmZpZ3VyZSBmYXAgZGV2aWNlIG1vZGUgKFRNL1BQL1RETV9PUFRJTUlaRUQvVERNX1NUQU5EQVJEKQorIyBhbmQgZnRtaCBvdXRsaWYgZXh0ZW5zaW9uIGRlcGVuZGluZyBvbiBjb25maWcgdmFyaWFibGVzICdwYWNrZXRfcHJvY2Vzc2luZycgYW5kICd0ZG0nIHZhcmlhYmxlcworaWYgJD90ZG0gIlwKKyAgZWNobyAnKioqIFRETSBNT0RFICoqKic7IFwKKyAgY29uZmlnIGFkZCBkaWFnX2Nvc3FfZGlzYWJsZT0xOyBcCisgIGlmICEkP2ZhcF9kZXZpY2VfbW9kZSAnY29uZmlnIGFkZCBmYXBfZGV2aWNlX21vZGU9VERNX1NUQU5EQVJEJzsgXAorICBjb25maWcgYWRkIGZhYnJpY19mdG1oX291dGxpZl9leHRlbnNpb249QUxXQVlTOyBcCisgIGNvbmZpZyBleHRfcWRyX3R5cGU9Tk9ORTsgXAorICBjb25maWcgZXh0X3JhbV9wcmVzZW50PTAiCitpZiAhJD90ZG0gJiYgJD9wYWNrZXRfcHJvY2Vzc2luZyAiXAorICBlY2hvICcqKiogUEFDS0VUIFBST0NFU1NJTkcgTU9ERSAqKionOyBcCisgIGNvbmZpZyBhZGQgZmFicmljX2Z0bWhfb3V0bGlmX2V4dGVuc2lvbj1BTFdBWVM7IFwKKyAgY29uZmlnIGFkZCBmYXBfZGV2aWNlX21vZGU9UFA7IFwKKyAgY29uZmlnIGFkZCBlZ3Jlc3NfZW5jYXBfaXBfdHVubmVsX3JhbmdlX21pbj00MDk1OyBcCisgIGNvbmZpZyBhZGQgZWdyZXNzX2VuY2FwX2lwX3R1bm5lbF9yYW5nZV9tYXg9NDA5NTsgXAorICBjb25maWcgYWRkIG1wbHNfdHVubmVsX3Rlcm1fbGFiZWxfcmFuZ2VfbWluXzA9MTAwMDsgXAorICBjb25maWcgYWRkIG1wbHNfdHVubmVsX3Rlcm1fbGFiZWxfcmFuZ2VfbWF4XzA9MTAwMTsgXAorICBjb25maWcgYWRkIG1wbHNfdHVubmVsX3Rlcm1fbGFiZWxfcmFuZ2VfbWluXzE9MTAwMjsgXAorICBjb25maWcgYWRkIG1wbHNfdHVubmVsX3Rlcm1fbGFiZWxfcmFuZ2VfbWF4XzE9MTAwMzsgXAorICBjb25maWcgYWRkIG1wbHNfdHVubmVsX3Rlcm1fbGFiZWxfcmFuZ2VfbWluXzI9MTAwNDsgXAorICBjb25maWcgYWRkIG1wbHNfdHVubmVsX3Rlcm1fbGFiZWxfcmFuZ2VfbWF4XzI9MTAwNTsgXAorICBpZiAhJD9kaWFnX2Nvc3FfZGlzYWJsZSAnY29uZmlnIGFkZCBkaWFnX2Nvc3FfZGlzYWJsZT0wJzsiCitpZiAhJD90ZG0gJiYgISQ/cGFja2V0X3Byb2Nlc3NpbmcgIlwKKyAgZWNobyAnKioqIFRNIE9OTFkgTU9ERSAqKionOyBcCisgIGNvbmZpZyBhZGQgZmFwX2RldmljZV9tb2RlPVRNOyBcCisgIGNvbmZpZyBhZGQgZmFicmljX2Z0bWhfb3V0bGlmX2V4dGVuc2lvbj1JRl9NQzsgXAorICBpZiAhJD9kaWFnX2Nvc3FfZGlzYWJsZSAnY29uZmlnIGFkZCBkaWFnX2Nvc3FfZGlzYWJsZT0wJyIKKworIyBXaGVuIG1vcmUgdGhhbiBhIHNpbmdsZSBkZXZpY2UsIHNldCBjb25uZWN0IG1vZGUgdG8gRkUgYW5kIG1vZGlkCisjIHRvIHRoZSBzbG90IGlkLiBGb3IgYSBzaW5nbGUgZGV2aWNlLCBzZXQgY29ubmVjdCBtb2RlIHRvIFNJTkdMRV9GQVAKKyMgYW5kIG1vZGlkIHRvIDAuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIHNpbmdsZV9mYXAsIGFsbCBmYWJyaWMtZmFjaW5nIHNlcmRlcworIyBsYW5lcyBhcmUgc2V0IGluIGxvb3BiYWNrLCBmb3IgZmFicmljIG11bHRpY2FzdCB0byB3b3JrLgorIyBBbGwgb3B0aW9ucyBmb3IgZmFicmljX2Nvbm5lY3RfbW9kZSBhcmUgRkUvQkFDSzJCQUNLL01FU0gvTVVMVElfU1RBR0VfRkUvU0lOR0xFX0ZBUAorCitpZiAhJD9kaWFnX2Nvc3FfZGlzYWJsZSAiY29uZmlnIGFkZCBkaWFnX2Nvc3FfZGlzYWJsZT0wIgoraWYgISQ/c2xvdCB8fCAhJD9kaWFnX2NoYXNzaXMgImxvY2FsIHNsb3QgMCIKK2lmICEkP2JvYXJkX3R5cGVfR0ZBX0JJICJsb2NhbCBib2FyZF90eXBlX0dGQV9CSSAxIgoraWYgISQ/Ym9hcmRfdHlwZV9HRkFfQklfMiAibG9jYWwgYm9hcmRfdHlwZV9HRkFfQklfMiAwIgorCitpZiAkP2RpYWdfY2hhc3NpcyAiIFwKKyAgbG9jYWwgbm9mX2RldmljZXMgMjsgXAorICBjb25maWcgYWRkIGZhYnJpY19jb25uZWN0X21vZGU9RkUiIFwKK2Vsc2UgIlwKKyAgbG9jYWwgbm9mX2RldmljZXMgMTsgXAorICBpZiAhJD9mYWJyaWNfY29ubmVjdF9tb2RlICdjb25maWcgYWRkIGZhYnJpY19jb25uZWN0X21vZGU9U0lOR0xFX0ZBUCciCisgICAKKyNFbmFibGUgYWxsIHF1YXJ0ZXRzLiBDYW4gYmUgZG9uZSBwZXIgcXVhcnRldCB1c2luZyBfTiBzdWZmaXgKK2NvbmZpZyBhZGQgcGJfc2VyZGVzX3FydHRfYWN0aXZlPTEKKworbG9jYWwgbGFuZV9yYXRlX25pZiA2MjUwMDAwCitsb2NhbCBsYW5lX3JhdGVfY29tX2EgNjI1MDAwMAoraWYgJGJvYXJkX3R5cGVfR0ZBX0JJICJcCisgICAgbG9jYWwgbGFuZV9yYXRlX2ZiciA1MDAwMDAwOyBcCisgICAgbG9jYWwgbGFuZV9yYXRlX2NvbV9iIDMxMjUwMDA7IFwKKyAgICBjb25maWcgYWRkIGZhYnJpY19yZWZfY2xvY2s9MjUwMDAwOyBcCisgICAgY29uZmlnIGFkZCBjb21ib19uaWZfMD0xOyBcCisgICAgY29uZmlnIGFkZCBjb21ib19uaWZfMT0xIiBcCitlbHNlICdcCisgICAgbG9jYWwgbGFuZV9yYXRlX2ZiciA2MjUwMDAwOyBcCisgICAgbG9jYWwgbGFuZV9yYXRlX2NvbV9iIDYyNTAwMDA7IFwKKyAgICBjb25maWcgYWRkIGZhYnJpY19yZWZfY2xvY2s9MzEyNTAwOyBcCisgICAgY29uZmlnIGFkZCBjb21ib19uaWZfMD0wOyBcCisgICAgY29uZmlnIGFkZCBjb21ib19uaWZfMT0wOyBcCisgICAgZm9yIGk9MzIsNTkgXCdjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWVkaWFfdHlwZV8kaT1DSElQMkNISVBcJycKKworIyBOaWYgc2VyZGVzIHF1YXJ0ZXRzCitmb3IgaT0wLDIgJ2NvbmZpZyBhZGQgcGJfc2VyZGVzX3FydHRfbWF4X2V4cGVjdGVkX3JhdGVfJGk9JGxhbmVfcmF0ZV9uaWYnCitmb3IgaT00LDYgJ2NvbmZpZyBhZGQgcGJfc2VyZGVzX3FydHRfbWF4X2V4cGVjdGVkX3JhdGVfJGk9JGxhbmVfcmF0ZV9uaWYnCisKKyMgTmlmIHNlcmRlcyBxdWFydGV0IChjb21iby1hKQorY29uZmlnIGFkZCBwYl9zZXJkZXNfcXJ0dF9tYXhfZXhwZWN0ZWRfcmF0ZV8zPSRsYW5lX3JhdGVfY29tX2EKKworIyBOaWYgc2VyZGVzIHF1YXJ0ZXQgKGNvbWJvLWIpCitjb25maWcgYWRkIHBiX3NlcmRlc19xcnR0X21heF9leHBlY3RlZF9yYXRlXzc9JGxhbmVfcmF0ZV9jb21fYgorCisjIEZhYnJpYyBzZXJkZXMgcXVhcnRldHMKK2ZvciBpPTgsMTQgJ2NvbmZpZyBhZGQgcGJfc2VyZGVzX3FydHRfbWF4X2V4cGVjdGVkX3JhdGVfJGk9JGxhbmVfcmF0ZV9mYnInCisKKyMgc2V0IGRlZmF1bHQgcmF0ZSB0byBuaWYgcmF0ZS4gT3ZlcnJpZGUgZmFicmljIGxhbmVzLgorY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yYXRlPSRsYW5lX3JhdGVfbmlmCitmb3IgaT0xMiwxNSAnY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yYXRlXyRpPSRsYW5lX3JhdGVfY29tX2EnCitmb3IgaT0yOCwzMSAnY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yYXRlXyRpPSRsYW5lX3JhdGVfY29tX2InCitmb3IgaT0zMiw1OSAnY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yYXRlXyRpPSRsYW5lX3JhdGVfZmJyJworCisjIEJvYXJkIFR5cGUgY29uZmlndXJhdGlvbi4KKworaWYgJGJvYXJkX3R5cGVfR0ZBX0JJICJcCisgICAgZWNobyBDb25maWd1cmUgR0ZBX0JJIFBvcnQvSW50ZXJmY2FlL05pZi9TZXJEZXMgcGFyYW1ldGVyczsgXAorICAgIGNvbmZpZyBhZGQgdWNvZGVfcG9ydF8xPVJYQVVJNzsgXAorICAgIGNvbmZpZyBhZGQgdWNvZGVfcG9ydF8yPVJYQVVJNjsgXAorICAgIGNvbmZpZyBhZGQgdWNvZGVfcG9ydF8zPVhBVUk3OyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzQ9UlhBVUkwOyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzU9UlhBVUkyOyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzY9UlhBVUk0OyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0Xzc9UlhBVUkxMjsgXAorICAgIGNvbmZpZyBhZGQgdWNvZGVfcG9ydF84PVJYQVVJMTA7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfOT1SWEFVSTg7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfOT0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4XzI5PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfMTM9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF8xOD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4XzIyPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfMzA9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF8zMT0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnQ9MjM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnQ9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGg9MjA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aD0yMDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF8xMj0zMDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzEyPTE4OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV8xMj0zOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfMTI9MTM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzEzPTMwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fMTM9MTg7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzEzPTM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF8xMz0xMzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfMTQ9MzA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl8xND0xODsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfMTQ9MzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzE0PTEzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF8xNT0zMDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzE1PTE4OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV8xNT0zOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfMTU9MTM7IgorICAgIAoraWYgJGJvYXJkX3R5cGVfR0ZBX0JJICJcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMz0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMz0xNTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zPTE4OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMTI9MjE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzEyPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8xMj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzEyPTg7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzEyPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMTM9MTg7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzEzPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8xMz0wOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzEzPTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzEzPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMTQ9MTc7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzE0PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8xND0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzE0PTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzE0PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMTU9MTk7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzE1PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8xNT0wOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzE1PTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzE1PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMjg9MTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzI4PTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8yOD0wOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzI4PTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzI4PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMjk9MTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzI5PTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8yOT0wOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzI5PTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzI5PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzA9MTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzMwPTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zMD0wOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzMwPTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzMwPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzE9MTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzMxPTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zMT0wOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzMxPTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzMxPTE7IgorICAgIAorIyBUWCBwYXJhbXMgZm9yIGZhYnJpYyByYXRlIG9mIDUwMDAgbWJwcyAoTmVnZXYgc3lzdGVtKS4KKyMgT3ZlcnJpZGVzIG1lZGlhIHR5cGUgY29uZmlndXJhdGlvbi4KK2lmICRib2FyZF90eXBlX0dGQV9CSSAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfMzI9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl8zMj0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfMzI9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzMyPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzMzPTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fMzM9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzMzPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF8zMz0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF8zND0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzM0PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV8zND0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfMzQ9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfMzU9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl8zNT0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfMzU9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzM1PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzM2PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fMzY9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzM2PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF8zNj0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF8zNz0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzM3PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV8zNz0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfMzc9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfMzg9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl8zOD0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfMzg9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzM4PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzM5PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fMzk9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzM5PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF8zOT0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF80MD0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzQwPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV80MD0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNDA9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNDE9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl80MT0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNDE9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzQxPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzQyPTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNDI9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzQyPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF80Mj0wIgoraWYgJGJvYXJkX3R5cGVfR0ZBX0JJICJcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF80Mz0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzQzPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV80Mz0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNDM9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNDQ9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl80ND0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNDQ9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzQ0PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzQ1PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNDU9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzQ1PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF80NT0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF80Nj0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzQ2PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV80Nj0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNDY9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNDc9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl80Nz0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNDc9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzQ3PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzQ4PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNDg9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzQ4PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF80OD0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF80OT0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzQ5PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV80OT0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNDk9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNTA9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl81MD0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNTA9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzUwPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzUxPTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNTE9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzUxPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF81MT0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF81Mj0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzUyPTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV81Mj0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNTI9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNTM9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl81Mz0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNTM9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzUzPTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzU0PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNTQ9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzU0PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF81ND0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF81NT0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzU1PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV81NT0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNTU9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNTY9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl81Nj0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNTY9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzU2PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfYW1wXzU3PTMxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX21haW5fNTc9MjQ7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlXzU3PTA7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcG9zdF81Nz0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcF81OD0zMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19tYWluXzU4PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3ByZV81OD0wOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3RfNTg9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19hbXBfNTk9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbl81OT0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wcmVfNTk9MDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfdHhfcGh5c19wb3N0XzU5PTA7IgorCisjIFJYIHBhcmFtcyBmb3IgZmFicmljIHJhdGUgb2YgNTAwMCBtYnBzIChOZWdldiBzeXN0ZW0pCitpZiAkYm9hcmRfdHlwZV9HRkFfQkkgIlwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zMj0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zMj0yOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zMj0yMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzMyPTM1OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzMyPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zMz0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zMz0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zMz0yODsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzMzPTE2OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzMzPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zND0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zND0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zND0xODsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM0PTI2OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM0PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zNT0yMzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zNT0yOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zNT0yMzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM1PTE0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM1PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zNj0yMjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zNj0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zNj0yMjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM2PTMwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM2PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zNz0yMzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zNz0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zNz0yMDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM3PTE0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM3PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zOD0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zOD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zOD0yMzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM4PTI5OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM4PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zOT0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zOT0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zOT0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM5PTMwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM5PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80MD0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80MD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80MD0yMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQwPTMzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQwPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80MT0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80MT0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80MT0yMDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQxPTY7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDE9MTsiCitpZiAkYm9hcmRfdHlwZV9HRkFfQkkgIlwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80Mj0yMDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80Mj0zOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80Mj0xODsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQyPTMzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQyPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80Mz0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80Mz0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80Mz0yNjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQzPTMzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQzPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80ND0yMzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80ND0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80ND0yMjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQ0PTM0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQ0PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80NT0yMjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80NT0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80NT0xODsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQ1PTE2OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQ1PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80Nj0yMzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80Nj0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80Nj0yMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQ2PTI4OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQ2PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80Nz0yMDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80Nz0yOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80Nz0xNjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQ3PTk7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDc9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ4PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQ4PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ4PTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDg9MzM7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDg9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ5PTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQ5PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ5PTI4OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDk9MTI7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDk9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzUwPTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUwPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzUwPTI0OyIKK2lmICRib2FyZF90eXBlX0dGQV9CSSAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzUwPTE5OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzUwPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81MT0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81MT0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81MT0yMjsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzUxPTIwOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzUxPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81Mj0yMzsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81Mj0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81Mj0yNDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzUyPTMzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzUyPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81Mz0yMDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81Mz00OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81Mz0xMDsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzUzPTU7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTM9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU0PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU0PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU0PTI5OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTQ9MjU7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTQ9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU1PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU1PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU1PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTU9MjI7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTU9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU2PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU2PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU2PTIyOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTY9MzE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTY9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU3PTI0OyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU3PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU3PTIyOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTc9MjU7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTc9MTsiCisKK2lmICRib2FyZF90eXBlX0dGQV9CSSAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU4PTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU4PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU4PTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTg9MjY7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTg9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU5PTIzOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU5PTI7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU5PTIxOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTk9MjU7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTk9MTsiCisKK2lmICRib2FyZF90eXBlX0dGQV9CSV8yICJcCisgICAgZWNobyBDb25maWd1cmUgR0ZBX0JJXzIgUG9ydC9JbnRlcmZjYWUvTmlmL1NlckRlcyBwYXJhbWV0ZXJzOyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzE9UlhBVUkzOyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzI9UlhBVUkyOyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzM9UlhBVUkxOyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzQ9UlhBVUkwOyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzU9UlhBVUk4OyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzY9UlhBVUk5OyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0Xzc9UlhBVUk1OyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0Xzg9UlhBVUk0OyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0Xzk9UlhBVUkxMjsgXAorICAgIGNvbmZpZyBhZGQgdWNvZGVfcG9ydF8xMD1SWEFVSTEzOyBcCisgICAgY29uZmlnIGFkZCB1Y29kZV9wb3J0XzExPVJYQVVJMTA7IFwKKyAgICBjb25maWcgYWRkIHVjb2RlX3BvcnRfMTI9UlhBVUkxMTsgXAorICAgIGNvbmZpZyBhZGQgbGFuZXNfc3dhcF82PTE7IFwKKyAgICBjb25maWcgYWRkIGxhbmVzX3N3YXBfMTA9MTsgXAorICAgIGNvbmZpZyBhZGQgbGFuZXNfc3dhcF8xMT0xOyBcCisgICAgY29uZmlnIGFkZCBsYW5lc19zd2FwXzEyPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfMTI9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF8xND0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4XzI4PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfMzE9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV90eF8zMj0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3R4XzM0PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfdHhfNDE9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF80OD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4XzUwPTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfNTI9MTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfc3dhcF9wb2xhcml0eV9yeF81NT0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9zd2FwX3BvbGFyaXR5X3J4XzU2PTE7IFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3N3YXBfcG9sYXJpdHlfcnhfNTg9MTsiCisgICAgCitpZiAkYm9hcmRfdHlwZV9HRkFfQklfMiAmJiAhJHN5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0gIlwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudD0yMTsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGg9ODsgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudD0xOyBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX2FtcD0zMDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfbWFpbj0xODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3R4X3BoeXNfcHJlPTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV90eF9waHlzX3Bvc3Q9MTM7IgorCisjR0ZBLUJJMiwgd2l0aCBmZTYwMCwgc2xvdCAwCitpZiAkYm9hcmRfdHlwZV9HRkFfQklfMiAmJiAkc3lzdGVtX2lzX2ZlNjAwX2luX3N5c3RlbSAmJiAhJHNsb3QgIlwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8xMj0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMTI9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzEyPTExOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzEyPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzEyPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMTM9MjM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzEzPTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8xMz0xNzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8xMz03OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8xMz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzE0PTE4OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8xND0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMTQ9NzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8xND00OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8xND0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzE1PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8xNT0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMTU9MjE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMTU9MjE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzE1PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMjg9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzI4PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8yOD0xODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8yOD04OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8yOD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzI5PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8yOT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMjk9OTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8yOT0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8yOT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzMwPTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zMD0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzA9MTg7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzA9MTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzMwPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzE9MjE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzMxPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zMT0xMDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zMT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zMT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzMyPTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zMj0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzI9MjI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzI9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzI9MSIKK2lmICRib2FyZF90eXBlX0dGQV9CSV8yICYmICRzeXN0ZW1faXNfZmU2MDBfaW5fc3lzdGVtICYmICEkc2xvdCAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzMzPTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zMz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzM9MTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzM9NDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzM9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zND0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzQ9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM0PTIwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM0PTMwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zND0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM1PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zNT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzU9MTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzU9NTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzU9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zNj0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzY9MDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM2PTExOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM2PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM2PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzc9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM3PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zNz0xMDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zNz0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zNz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM4PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zOD0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzg9MjA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzg9MTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM4PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzk9MjI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM5PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zOT05OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM5PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM5PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDA9MjM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQwPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80MD0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80MD0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80MD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQxPTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80MT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDE9OTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80MT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80MT0xIgoraWYgJGJvYXJkX3R5cGVfR0ZBX0JJXzIgJiYgJHN5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0gJiYgISRzbG90ICJcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDI9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQyPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80Mj0xMDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80Mj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80Mj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQzPTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80Mz0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDM9MjU7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDM9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDM9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80ND0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDQ9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ0PTk7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDQ9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDQ9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80NT0yMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDU9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ1PTE4OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQ1PTE2OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80NT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ2PTIxOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80Nj0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDY9OTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80Nj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80Nj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQ3PTIxOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80Nz0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDc9MTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDc9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDc9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80OD0yMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDg9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ4PTg7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDg9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDg9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80OT0yMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDk9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ5PTE1OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQ5PTEzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF80OT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzUwPTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81MD0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTA9MTc7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTA9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTA9MSIKK2lmICRib2FyZF90eXBlX0dGQV9CSV8yICYmICRzeXN0ZW1faXNfZmU2MDBfaW5fc3lzdGVtICYmICEkc2xvdCAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzUxPTIyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81MT0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTE9ODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81MT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81MT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzUyPTE3OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81Mj0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTI9NjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81Mj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81Mj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzUzPTIyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81Mz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTM9MTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTM9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTM9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81ND0yMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTQ9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU0PTU7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTQ9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTQ9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81NT0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTU9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU1PTE0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzU1PTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzU1PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTY9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU2PTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81Nj0yMDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81Nj0yMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTY9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81Nz0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTc9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU3PTE0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzU3PTc7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzU3PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTg9MTk7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzU4PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81OD0xMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81OD0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81OD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU5PTIyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81OT0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTk9MTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTk9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTk9MSIKKworI0dGQS1CSTIsIHdpdGggZmU2MDAsIHNsb3QgMQoraWYgJGJvYXJkX3R5cGVfR0ZBX0JJXzIgJiYgJHN5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0gJiYgJHNsb3QgIlwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8xMj0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMTI9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzEyPTk7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMTI9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMTI9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8xMz0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMTM9NDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzEzPTIwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzEzPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzEzPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMTQ9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzE0PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8xND05OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzE0PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzE0PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMTU9MjM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzE1PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8xNT0xMDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8xNT05OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8xNT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzI4PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8yOD0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMjg9MTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMjg9NDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMjg9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8yOT0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMjk9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzI5PTk7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMjk9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMjk9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zMD0yMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzA9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzMwPTY7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzA9NDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzA9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zMT0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzE9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzMxPTE0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzMxPTg7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzMxPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzI9MjI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzMyPTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zMj0xOTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zMj00OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zMj0xIgoraWYgJGJvYXJkX3R5cGVfR0ZBX0JJXzIgJiYgJHN5c3RlbV9pc19mZTYwMF9pbl9zeXN0ZW0gJiYgJHNsb3QgIlwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zMz0yMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzM9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzMzPTExOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzMzPTEwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zMz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM0PTIyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zND0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzQ9MTc7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzQ9MjA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM0PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzU9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM1PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zNT0xMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zNT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF8zNT0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzM2PTIyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF8zNj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfMzY9MTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfMzY9NDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzY9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zNz0yMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzc9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM3PTEwOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM3PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM3PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfMzg9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzM4PTM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF8zOD0yMDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF8zOD0xNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfMzg9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF8zOT0yMzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfMzk9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzM5PTExOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzM5PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzM5PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDA9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQwPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80MD0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80MD0xODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDA9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80MT0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDE9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQxPTExOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQxPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQxPTEiCitpZiAkYm9hcmRfdHlwZV9HRkFfQklfMiAmJiAkc3lzdGVtX2lzX2ZlNjAwX2luX3N5c3RlbSAmJiAkc2xvdCAiXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzQyPTIxOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF80Mj0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNDI9MTA7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDI9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDI9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80Mz0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDM9NDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQzPTIyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQzPTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQzPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDQ9MjM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQ0PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80ND03OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQ0PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQ0PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNDU9MjI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzQ1PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF80NT0xODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF80NT0xNjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDU9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80Nj0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDY9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ2PTk7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDY9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDY9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80Nz0yMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDc9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ3PTk7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDc9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDc9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80OD0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDg9MjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ4PTg7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNDg9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNDg9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF80OT0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNDk9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzQ5PTEyOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzQ5PTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzQ5PTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTA9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUwPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81MD0xODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81MD0xMTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTA9MSIKK2lmICRib2FyZF90eXBlX0dGQV9CSV8yICYmICRzeXN0ZW1faXNfZmU2MDBfaW5fc3lzdGVtICYmICRzbG90ICJcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTE9MjM7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUxPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81MT03OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzUxPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzUxPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTI9MjE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUyPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81Mj04OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzUyPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzUyPTE7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3pjbnRfNTM9MjQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3oxY250XzUzPTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2RmZWx0aF81Mz0xMjsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81Mz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81Mz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU0PTI0OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81ND0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTQ9NzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81ND0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81ND0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU1PTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81NT0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTU9MTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTU9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZzFjbnRfNTU9MTsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfemNudF81Nj0yNDsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfejFjbnRfNTY9MzsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfZGZlbHRoXzU2PTIxOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c190bHRoXzU2PTE2OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81Nj0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU3PTIzOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81Nz0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTc9ODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81Nz00OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81Nz0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU4PTE3OyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81OD0zOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTg9ODsgIFwKKyAgICBjb25maWcgYWRkIHBiX3NlcmRlc19sYW5lX3J4X3BoeXNfdGx0aF81OD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19nMWNudF81OD0xOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196Y250XzU5PTIxOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c196MWNudF81OT0yOyAgXAorICAgIGNvbmZpZyBhZGQgcGJfc2VyZGVzX2xhbmVfcnhfcGh5c19kZmVsdGhfNTk9MTQ7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX3RsdGhfNTk9MTI7ICBcCisgICAgY29uZmlnIGFkZCBwYl9zZXJkZXNfbGFuZV9yeF9waHlzX2cxY250XzU5PTEiCisgCisjIERSQU0gcHJlLWNvbmZpZ3VyYXRpb25zIGFjY29yZGluZyB0byBjb25maWcgdmFyaWFibGVzIHdoaWNoIGRlZmluZXMKKyMgdGhlIGRyYW0gdHlwZS4KKworI0REUjMKK2lmICQ/ZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZFX0hDSzBfMTMzMyB8fCBcCisgICAkP2RyYW1fdHlwZV9ERFIzX1NBTVNVTkdfSzRCMUcxNjQ2RV9IQ0swXzE2MDAgfHwgXAorICAgJD9kcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUo2NE0xNl8xNUUgfHwgXAorICAgJD9kcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoxMjhNMTZIQV8xNUVfMkcgIlwKKyAgICBjb25maWcgYWRkIGV4dF9yYW1fdHlwZT1ERFIzOyBcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX2NvbHVtbnM9MTAyNDsgXAorICAgIGNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz04IiAKK2lmICQ/ZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKMTI4TTE2SEFfMTVFXzJHICJcCisgIGNvbmZpZyBhZGQgZXh0X3JhbV90b3RhbF9zaXplPTMwNzIiCitpZiAkP2RyYW1fdHlwZV9ERFIzX1NBTVNVTkdfSzRCMUcxNjQ2RV9IQ0swXzEzMzMgfHwgXAorICAgJD9kcmFtX3R5cGVfRERSM19TQU1TVU5HX0s0QjFHMTY0NkVfSENLMF8xNjAwIHx8IFwKKyAgICQ/ZHJhbV90eXBlX0REUjNfTUlDUk9OX01UNDFKNjRNMTZfMTVFICJcCisgICAgY29uZmlnIGFkZCBleHRfcmFtX3RvdGFsX3NpemU9MTUzNiIKKworI0dERFIzCitpZiAkP2RyYW1fdHlwZV9HRERSM19TQU1TVU5HX0s0SjUyMzI0UUUgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3R5cGU9R0REUjMiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTUxMiIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2JhbmtzPTgiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90b3RhbF9zaXplPTM4NCIKKworI0REUjIKK2lmICQ/ZHJhbV90eXBlX0REUjJfTUlDUk9OX0s0VDUxMTYzUUVfWkNfTEY3IFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90eXBlPUREUjIiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jb2x1bW5zPTEwMjQiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9iYW5rcz00IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdG90YWxfc2l6ZT03NjgiCisgICAKK2lmICQ/ZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZFX0hDSzBfMTYwMCBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fYXBfYml0X3Bvcz0xMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2J1cnN0X3NpemU9MzIiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTExIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTgiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ4NzUwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MTEwMDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzUwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz00MDAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTEzNzUwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTM3NTAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZD03NTAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MzkwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnA9MTM3NTAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3dyPTE1MDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF93dHI9NzUwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnRwPTc1MDAiCisKK2lmICQ/ZHJhbV90eXBlX0REUjNfU0FNU1VOR19LNEIxRzE2NDZFX0hDSzBfMTMzMyBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fYXBfYml0X3Bvcz0xMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2J1cnN0X3NpemU9MzIiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTkiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9OCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NTAwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0xMTAwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz0zNjY2NiIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTQ1MDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTUwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xNTAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkPTgzMzMiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JlZj0zOTAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9ycD0xNTAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3Rfd3I9MTUwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3d0cj04MzMzIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9ydHA9NjY2NiIKKworaWYgJD9kcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUo2NE0xNl8xNUUgfHwgJD9kcmFtX3R5cGVfRERSM19NSUNST05fTVQ0MUoxMjhNMTZIQV8xNUVfMkcgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2FwX2JpdF9wb3M9MTAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9idXJzdF9zaXplPTMyIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT05IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTciIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JjPTQ5NTAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yZmM9MTEwMDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yYXM9MzYwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X2Zhdz01MDAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmNkX3JkPTEzNTAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yY2Rfd3I9MTM1MDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JyZD03NTAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MzkwMGMiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTEzNTAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNTAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyPTc1MDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cD03NTAwIgorCisjIFNhbXN1bmcgKEs0SjUyMzI0UUUpCisjIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBjb3JyZXNwb25kIHRvIEJDLTE2IGRhc2gsIGFuZCB3ZXJlIHRlc3RlZCBpbgorIyBkdW5lJ3MgbGFiIHdpdGggQkMtMTQgZGFzaCBkcmFtIHdvcmtpbmcgaW4gZnJlcXVlbmN5IG9mIDUzM01Iei4KK2lmICQ/ZHJhbV90eXBlX0dERFIzX1NBTVNVTkdfSzRKNTIzMjRRRSBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fYXBfYml0X3Bvcz04IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fYnVyc3Rfc2l6ZT0xNiIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2dkZHIzX21yczBfd3IxPTB4MDAwMDAzMTIiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9nZGRyM19lbXIwX3dyMT0weDAwMDAxMDlkIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fY19jYXNfbGF0ZW5jeT05IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fY193cl9sYXRlbmN5PTEiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JjX2Nsaz0yNCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmZjX2Nsaz0yOSIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmFzX2Nsaz0xNiIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3X2Nsaz01IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmRfY2xrPTkiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cl9jbGs9NiIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkX2Nsaz03IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MTQ1MCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnBfY2xrPTgiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3dyX2Nsaz04IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF93dHJfY2xrPTQiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cF9jbGs9NCIKKworaWYgJD9kcmFtX3R5cGVfRERSMl9NSUNST05fSzRUNTExNjNRRV9aQ19MRjcgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX2FwX2JpdF9wb3M9MTAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9idXJzdF9zaXplPTE2IiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fYXV0b19tb2RlPVRSVUUiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jX2Nhc19sYXRlbmN5PTYiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV9jX3dyX2xhdGVuY3k9NSIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcmM9NjAwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JmYz0xMDUwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3Jhcz00NTAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfZmF3PTQ1MDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yY2RfcmQ9MTUwMDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JjZF93cj0xNTAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3RfcnJkPTEwMDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF9yZWY9MzkwMCkiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3JwPTE1MDAwIiBcCisgICJjb25maWcgYWRkIGV4dF9yYW1fdF93cj0xNTAwMCIgXAorICAiY29uZmlnIGFkZCBleHRfcmFtX3Rfd3RyPTc1MDAiIFwKKyAgImNvbmZpZyBhZGQgZXh0X3JhbV90X3J0cD03NTAwIgorCisKKyMgSWYgdXNpbmcgZWxrLCBvdmVycmlkZSByZWxldmFudCBwYXJhbWV0ZXJzOgoraWYgJD9wY3BfZWxrICJcCisgIGVjaG8gKioqIE9WRVJSSURJTkcgREVGQVVMVCBDT05GSUcgV0lUSCBFTEsgQ09ORklHICoqKjsgXAorICBjb25maWcgY29tYm9fcmVmX2Nsb2NrPTEyNTAwMDsgXAorICBjb25maWcgcGJfc2VyZGVzX3FydHRfbWF4X2V4cGVjdGVkX3JhdGVfNz0zNzUwMDAwOyBcCisgIGNvbmZpZyBwYl9zZXJkZXNfbGFuZV9yYXRlXzI4PTM3NTAwMDA7IFwKKyAgY29uZmlnIHBiX3NlcmRlc19sYW5lX3JhdGVfMjk9Mzc1MDAwMDsgXAorICBjb25maWcgcGJfc2VyZGVzX2xhbmVfcmF0ZV8zMD0zNzUwMDAwOyBcCisgIGNvbmZpZyBwYl9zZXJkZXNfbGFuZV9yYXRlXzMxPTM3NTAwMDA7IFwKKyAgY29uZmlnIGFkZCBleHRlcm5hbF9sb29rdXBfbWFsPTE0OyBcCisgIGNvbmZpZyBhZGQgc3BhdWlfaXBnX2RpY19tb2RlPU1JTjsgXAorICBjb25maWcgYWRkIHNwYXVpX2lwZ19zaXplPTE7IFwKKyAgY29uZmlnIGFkZCBzcGF1aV9jcmNfbW9kZT0zMmI7IFwKKyAgY29uZmlnIGFkZCBzcGF1aV9wcmVhbWJsZV9zaXplPTA7IFwKKyAgY29uZmlnIGFkZCBzcGF1aV9wcmVhbWJsZV9za2lwX3NvcD0xOyBcCisgIGNvbmZpZyBhZGQgc3BhdWlfaXNfZG91YmxlX3NpemVfc29wX2V2ZW5fb25seT0xOyBcCisgIGNvbmZpZyBhZGQgc3BhdWlfbGlua19wYXJ0bmVyX2RvdWJsZV9zaXplX2J1cz0xIgorCitpZiAkP3BjcF9lbGsgfHwgJD9wY3Bfb2FtIHx8ICQ/cGNwX2RtYSAiXAorICBjb25maWcgYWRkIHN0cmVhbWluZ19pZl9tdWx0aV9wb3J0X21vZGU9MTsgXAorICBjb25maWcgYWRkIHN0cmVhbWluZ19pZl9kaXNjYXJkX3BrdF9zdHJlYW1pbmc9MDsgXAorICBjb25maWcgYWRkIGZhYnJpY19mdG1oX291dGxpZl9leHRlbnNpb249SUZfTUMiIFwKK2Vsc2UgIlwKKyAgY29uZmlnIGFkZCBzdHJlYW1pbmdfaWZfbXVsdGlfcG9ydF9tb2RlPTA7IFwKKyAgY29uZmlnIGFkZCBzdHJlYW1pbmdfaWZfZGlzY2FyZF9wa3Rfc3RyZWFtaW5nPTE7IgorCisjIFJ1biBzd2VlcCBwY3Agb24gcmVhbCBIVworaWYgISQ/cGxpc2ltICYmICEkP3dhcm1ib290ICIgICBcCisgIHN3ZWVwIHBjcCIKKyAgCisjIFNldCBzeW50cyBhY2NvcmRpbmcgdG8gcmVmZXJlbmNlIGNsb2NrcworZXhwciAkbmlmX3JlZl9jbG9jayoxMDAwOyBsb2NhbCBzeW50X25pZiAkPworZXhwciAkY29tYm9fcmVmX2Nsb2NrKjEwMDA7IGxvY2FsIHN5bnRfY29tYm8gJD8KK2V4cHIgJGZhYnJpY19yZWZfY2xvY2sqMTAwMDsgbG9jYWwgc3ludF9mYWJyaWMgJD8KKworIyBSZWFsIEhXOiBUYWtlIHBldHJhIG91dCBvZiByZXNldAoraWYgISQ/cGxpc2ltICYmICEkP3dhcm1ib290ICIgXAorICBnZmFfYmkgdXRpbHMgcGV0cmFfcmVzZXQgMTsgXAorICBlY2hvIENvbmZpZ3VyZSBzeW50aGVzaXplcnM6OyBcCisgIGVjaG8gRmFicmljOiAkc3ludF9mYWJyaWM7IGdmYV9iaSB1dGlscyBzeW50X3NldCAxICRzeW50X2ZhYnJpYyAkc3ludF9vdmVyOyBcCisgIGVjaG8gQ29tYm86ICAkc3ludF9jb21ibzsgIGdmYV9iaSB1dGlscyBzeW50X3NldCAyICRzeW50X2NvbWJvICRzeW50X292ZXI7IFwKKyAgZWNobyBOaWY6ICAgICRzeW50X25pZjsgICAgZ2ZhX2JpIHV0aWxzIHN5bnRfc2V0IDMgJHN5bnRfbmlmICRzeW50X292ZXI7IFwKKyAgZWNobyBDb3JlOiAgICRzeW50X2NvcmU7ICAgZ2ZhX2JpIHV0aWxzIHN5bnRfc2V0IDQgJHN5bnRfY29yZSAkc3ludF9vdmVyOyBcCisgIGVjaG8gRERSOiAgICAkc3ludF9kZHI7ICAgIGdmYV9iaSB1dGlscyBzeW50X3NldCA1ICRzeW50X2RkciAkc3ludF9vdmVyOyBcCisgIGVjaG8gUGh5OiAgICAkc3ludF9waHk7ICAgIGdmYV9iaSB1dGlscyBzeW50X3NldCAxMCAkc3ludF9waHkgJHN5bnRfb3ZlcjsgXAorICBnZmFfYmkgdXRpbHMgcGV0cmFfcmVzZXQgMCIKKyAgCitkYm0gc29jIGVycm9yCitkYm0gYmNtIGVycm9yCisKK2VjaG8gIiR1bml0OmluaXQgc29jIgoraW5pdCBzb2MKK2VjaG8gIiR1bml0OmluaXQgc29jIC0gRG9uZSIKKworZWNobyAiJHVuaXQ6aW5pdCBiY20iCitpbml0IGJjbQorCitlY2hvICIkdW5pdDppbml0IGJjbSAtIERvbmUiCisKK2lmICQ/d2FybWJvb3QgIlwKKyAgZWNobyAnV2FybWJvb3Q6IGluaXQgZG9uZSc7IFwKKyAgZWNobyAnZHVuZS5zb2M6IERvbmUuJzsgXAorICBleGl0IgorCisjIFJlYWwgSFcgKyBub24gdXNpbmcgc3dlZXA6IEluaXQgcGh5cworaWYgISQ/cGxpc2ltICIgXAorICBnZmFfYmkgdXRpbHMgcGh5cyIKKworaWYgISQ/bm9fYmNtICYmICEkP2RpYWdfZGlzYWJsZSAiXAorICBpbml0IGFwcGxfZHBwICRzbG90ICRub2ZfZGV2aWNlcyAkZGlhZ19jb3NxX2Rpc2FibGU7IiBcCitlbHNlICJcCisgIGVjaG8gJ1NraXBwaW5nIGRpYWdfaW5pdC4gSW4gb3JkZXIgdG8gcnVuIHRyYWZmaWMsIGV4dHJhIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBwZXJmb3JtZWQuJyIKKworIyBJZiBydW5uaW5nIEJDTSBsaWJyYXJ5OgorIyBTdGFydCBsaW5rc2NhbiB0YXNrIGFuZCBzZXQgcG9ydCBsaW5rc2NhbiBtb2RlLgoraWYgISQ/bm9fYmNtICYmICEkP3BjcF9lbGsgIlwKKyAgbGlua3NjYW4gMjUwMDAwOyBcCisgIGxpbmtzY2FuIHNwYm09eGUiCisgICAgIAorIyBJZiB1c2luZyBlbGssIGNvbmZpZ3VyZSAgYnNwOgoraWYgJD9wY3BfZWxrICJcCisgIGVjaG8gKioqIEJTUCBFTEsgQ09ORklHVVJBVElPTlMgKioqOyBcCisgIGdmYV9iaSBlbGtfaW5pdDsiCisgIAorIyBJZiB1c2luZyBwY3AgZG1hIHRoZW4gaW5pdCBkbWEKK2lmICEkP3BsaXNpbSAmJiAkP3BjcF9kbWEgIiBcCisgIGVjaG8gKioqIFBDUCBETUEgQ09ORklHVVJBVElPTlMgKioqOyBcCisgIGdmYV9iaSBkbWFfaW5pdCIKKworI2lmICQ/ZGlhZ19jaGFzc2lzICYmICEkc2xvdCAicmNsb2FkIHJjL25lZ2V2X3JwY19tYXN0ZXIuc29jLmFzc2kiICMgTWFzdGVyIG9uIHNsb3QgMAorI2lmICQ/ZGlhZ19jaGFzc2lzICYmICRzbG90ICJyY2xvYWQgcmMvbmVnZXZfcnBjX3NsYXZlLnNvYy5hc3NpIiAgICMgU2xhdmUgb24gc2xvdCAxCisKK2VjaG8gImR1bmUuc29jOiBEb25lLiIKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvc3ZrNC9ta19iY21fbm9kZS5zaCBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvc3ZrNC9ta19iY21fbm9kZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MGNlNDEzCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9zdms0L21rX2JjbV9ub2RlLnNoCkBAIC0wLDAgKzEsNSBAQAorIyEvYmluL3NoCitta25vZCAvZGV2L2xpbnV4LXVzZXItYmRlIGMgMTI2IDAKK21rbm9kIC9kZXYvbGludXgta2VybmVsLWJkZSBjIDEyNyAwCitta25vZCAvZGV2L2xpbnV4LXVrLXByb3h5IGMgMTI1IDAKKyAgCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvcWF4LnNvYyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvc3ZrNC9xYXguc29jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NWFlODEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvcWF4LnNvYwpAQCAtMCwwICsxLDEyOCBAQAorIworIyAkSWQ6IHFheC5zb2MsdiAxLjkwIDIwMTMvMDgvMTQgMDg6MzI6MDAgbmluYXNoIEV4cCAkCisjCisjICRDb3B5cmlnaHQ6IChjKSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJAorIworCisjIExvYWQgRFJBTSB0dW5pbmcgcHJvcGVydGllcyBmcm9tIGxvY2FsIEZpbGUuIFJjTG9hZCB3aWxsIG5vdCBmYWlsIGlmIGZpbGUgbm90IGZvdW5kLCBhbmQgd2lsbCBub3Qgc2hvdyBlcnJvcnMgb2YgbWlzc2luZyBmaWxlLgorI2RlciAweDQwIDQKKyNleGl0CisKK2RlYnVnIGluZm8KK2RlYnVnIGFwcGwgcmNsb2FkIHdhcm4KK2RlYnVnIGFwcGwgc3ltdGFiIHdhcm4KK2RlYnVnIGJjbSByeCx0eCxsaW5rLGF0dGFjaCB3YXJuCitkZWJ1ZyBzb2MgdGVzdHMgd2FybgorZGVidWcgc29jIHJ4LHBoeSxzY2hhbixyZWcsc29jbWVtLGRtYSxtZW0sbWlpbSxtaWksaW50cixjb3VudGVyLGRkciB3YXJuCitkZWJ1ZyBzb2MgY29tbW9uIGVycgorZGVidWcgc3lzIHZlcmluZXQgd2FybgorZGVidWcgc29jIHBoeXNpbSB3YXJuCisKK2lmICQ/UUFYIFwKKyAgICAncmNsb2FkIGJjbTg4NDcwX2JvYXJkLnNvYycKKworaWYgJD9RVVggXAorICAgICdyY2xvYWQgYmNtODgyNzBfYm9hcmQuc29jJworCisjIExvYWQgRFJBTSB0dW5pbmcgcHJvcGVydGllcyBmcm9tIGxvY2FsIEZpbGUuIFJjTG9hZCB3aWxsIG5vdCBmYWlsIGlmIGZpbGUgbm90IGZvdW5kLCBhbmQgd2lsbCBub3Qgc2hvdyBlcnJvcnMgb2YgbWlzc2luZyBmaWxlLgorc2V0IFJDRXJyb3I9b2ZmCitkZWJ1ZyBhcHBsIHNoZWxsIHdhcm4KK2lmICQ/UUFYIFwKKyAgICAncmNsb2FkIC9ob21lL25lZ2V2L2JjbTg4NDcwX2RyYW1fdHVuZS5zb2MnCitpZiAkP1FVWCBcCisgICAgJ3JjbG9hZCAvaG9tZS9uZWdldi9iY204ODI3MF9kcmFtX3R1bmUuc29jJworCitkZWJ1ZyBhcHBsIHNoZWxsID0KK3NldCBSQ0Vycm9yPW9uCisKK3NldCBSQ0Vycm9yPW9mZgorcmNsb2FkIGNvbWJvMjhfZHJhbS5zb2MKK3NldCBSQ0Vycm9yPW9uCisKKyNTZXQgZmFicmljIGNvbm5lY3QgbW9kZSBhcyBGRSBmb3IgbXVsdGkgRkFQIHN5c3RlbQoraWYgJD9kaWFnX2NoYXNzaXMgIiBcCisgICBjb25maWcgYWRkIGZhYnJpY19jb25uZWN0X21vZGUuQkNNODg0NzA9RkUiCisKKyMgU2V0IG1vZGlkOgorIyBJZiBkaWFnX2NoYXNzaXMgaXMgZW5hYmxlZCAodHdvIGxpbmUgY2FyZHMpLCBhbmQgJ3Nsb3QnIGlzIGRlZmluZWQgKHNsb3QgaXMgZGVmaW5lZCBvbmx5IHdoZW4KKyMgd29ya2luZyB3aXRob3V0IGEgbWFuYWdlbWVudCBjYXJkIC0gc2V0IG1vZGlkIHRvIGJlICdzbG90JworIyBPdGhlcndpc2UgKHNpbmdsZSBsaW5lIGNhcmQsIG9yIG1hbmFnZW1lbnQgY2FyZCksIHNldCBtb2RpZCB0byBiZSAwIGZvciB1bml0IDAsIGFuZCAxIGZvciB1bml0ICE9IDAKK2lmICQ/ZGlhZ19jaGFzc2lzICYmICQ/c2xvdCAiXAorICBsb2NhbCBtb2RpZCAkc2xvdCIgXAorZWxzZSAiXAorICBsb2NhbCBtb2RpZCAkdW5pdCIKK2V4cHIgJG1vZGlkPT0xOyBpZiAkPyAibG9jYWwgbW9kaWQgMiIKKworaWYgJD9tb2R1bGVfaWQgIiBcCisgIGxvY2FsIG1vZGlkICRtb2R1bGVfaWQiCisKK2VjaG8gIiR1bml0OiBtb2RpZD0kbW9kaWQiCisKKyMgU2V0IGJhc2VfbW9kaWQ6CisjIElkIGJhc2VfbW9kdWxlX2lkIGlzIHNldCwgdGhlbiBzZXQgYmFzZV9tb2RpZCB0byBoYXZlIGJhc2VfbW9kdWxlX2lkIHZhbHVlLgorIyBPdGhlcndpc2UsIHNldCBiYXNlX21vZGlkIHRvIGJlIDAuCitpZiAkP2Jhc2VfbW9kdWxlX2lkICIgXAorICBsb2NhbCBiYXNlX21vZGlkICRiYXNlX21vZHVsZV9pZCIgXAorZWxzZSAiIFwKKyAgbG9jYWwgYmFzZV9tb2RpZCAwIgorCitleHByICRiYXNlX21vZGlkID4gMAoraWYgJD8gIiBcCisgIGVjaG8gJyR1bml0OiBiYXNlX21vZGlkPSRiYXNlX21vZGlkJyIKKworaWYgJD9kaWFnX2NoYXNzaXMgIiBcCisgIGxvY2FsIG5vZl9kZXZpY2VzIDIiIFwKK2Vsc2UgIlwKKyAgbG9jYWwgbm9mX2RldmljZXMgMSIKKworaWYgJD9uX2RldmljZXMgIiBcCisgIGxvY2FsIG5vZl9kZXZpY2VzICRuX2RldmljZXMiCisKK2V4cHIgJG5vZl9kZXZpY2VzID4gMQoraWYgJD8gIiBcCisgIGVjaG8gJyR1bml0OiBub2ZfZGV2aWNlcz0kbm9mX2RldmljZXMnIgorCitpZiAkP21uZ19jcHUgIiBcCisgIGVjaG8gJyR1bml0Om1hbmFnZW1lbnQgY2FyZCAtIHBvbGxpbmcgaXMgc2V0IG9uJzsgXAorICBjb25maWcgYWRkIHBvbGxlZF9pcnFfbW9kZS5CQ004ODY3NT0xOyBcCisgIGNvbmZpZyBhZGQgc2NoYW5faW50cl9lbmFibGUuQkNNODg2NzU9MDsgXAorICBjb25maWcgYWRkIHRkbWFfaW50cl9lbmFibGUuQkNNODg2NzU9MDsgXAorICBjb25maWcgYWRkIHRzbGFtX2ludHJfZW5hYmxlLkJDTTg4Njc1PTA7IFwKKyAgY29uZmlnIGFkZCBtaWltX2ludHJfZW5hYmxlLkJDTTg4Njc1PTA7ICIKKworI0NvdW50ZXJzIHVuYXZhaWxhYmxlIGluIGNtb2RlbAoraWYgJD9jbW9kZWwgIiBcCisgIGNvbmZpZyBhZGQgY291bnRlcl9lbmdpbmVfc2FtcGxpbmdfaW50ZXJ2YWw9MDsiCisKKyNkZWZhdWx0IHZhbHVlcyBpbiBhIGNhc2Ugd2hpY2ggdGhlc2UgcGFyYW1ldGVycyBhcmUgbm90IGV4aXN0CitpZiAhJD9kaWFnX2Nvc3FfZGlzYWJsZSAiXAorICBsb2NhbCBkaWFnX2Nvc3FfZGlzYWJsZSAwIgoraWYgISQ/d2FybWJvb3QgIlwKKyAgbG9jYWwgd2FybWJvb3QgMCIKK2lmICEkP2RpYWdfZGlzYWJsZSAiXAorICBsb2NhbCBkaWFnX2Rpc2FibGUgMCIKK2lmICEkP2RpYWdfbm9faXRtaF9wcm9nX21vZGUgIlwKKyAgbG9jYWwgZGlhZ19ub19pdG1oX3Byb2dfbW9kZSAwIgoraWYgISQ/bDJfbW9kZSAiXAorICBsb2NhbCBsMl9tb2RlIDAiCisKKyNEaXNhYmxlIGludGVycnVwdHMgaW4gY21vZGVsCitpZiAkP2Ntb2RlbCAiXAorICBsb2NhbCBub19pbnRyIDEiIFwKK2Vsc2UgIlwKKyAgbG9jYWwgbm9faW50ciAwIgorCitpZiAkP1FVWCAiXAorICAgIGxvY2FsIG5vX2VsayAxIiBcCitlbHNlICJcCisgICAgbG9jYWwgbm9fZWxrIDAiCisKK0lOSVRfRE5YIE1vZElEPSRtb2RpZCBOb2ZEZXZpY2VzPSRub2ZfZGV2aWNlcyBDb3NxRGlzYWJsZT0kZGlhZ19jb3NxX2Rpc2FibGUgTm9BcHBsPSRkaWFnX2Rpc2FibGUgV2FybWJvb3Q9JHdhcm1ib290IE5vUnhMb3M9MSBOb0xpbmtzY2FuPTAgTm9FbGtEZXZpY2U9JG5vX2VsayBOb0Vsa0FwcGw9MCBOb0l0bWhQcm9nTW9kZT0kZGlhZ19ub19pdG1oX3Byb2dfbW9kZSBMMk1vZGU9JGwyX21vZGUgTm9JbnRyPSRub19pbnRyCisKKyNlY2hvICJwZXJmb3JtaW5nIGZvcmNlIGZvcndhcmQgdG8gc3lzcG9ydCAxIgorI21vZCBJSFBfUElORk9fTExSIDAgMjU2IERFRkFVTFRfQ1BVX1RSQVBfQ09ERT0yMDAgREVGQVVMVF9BQ1RJT05fUFJPRklMRV9GV0Q9NworI21vZCBJSEJfRldEX0FDVF9QUk9GSUxFIDIwMCAxIEZXRF9BQ1RfREVTVElOQVRJT049MHgxMDAwMSBGV0RfQUNUX0RFU1RJTkFUSU9OX09WRVJXUklURT0xCisjZWNobyAicGVyZm9ybWluZyBjcmVkaXQgZmx1c2ggZnJvbSBOSUYgdG8gRUdRIgorI20gTkJJSF9UWF9FR1JFU1NfQ1JFRElUU19ERUJVR19QTSBUWF9GTFVTSF9FR1JFU1NfUE9SVF8wX01MRl8wX1FNTEZfTj0xIFRYX0ZMVVNIX0VHUkVTU19QT1JUXzBfTUxGXzFfUU1MRl9OPTEgVFhfRkxVU0hfRUdSRVNTX1BPUlRfMF9NTEZfMl9RTUxGX049MSBUWF9GTFVTSF9FR1JFU1NfUE9SVF8wX01MRl8zX1FNTEZfTj0xCitlY2hvICJxYXguc29jOiBEb25lLiIKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvcmMvc3ZrNC9yYy5zb2MgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvcmMuc29jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOGVkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvcmMuc29jCkBAIC0wLDAgKzEsMTc5MCBAQAorIyAkSWQ6IHJjLnNvYyx2IDEuMTkyIDIwMTMvMDcvMTcgMjI6MTM6NDMgZGtlbGxleSBFeHAgJAorIyAkQ29weXJpZ2h0OiAoYykgMTk5OC0yMDAxIEJyb2FkY29tIENvcnAuCisjIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJAorIworIyBJbml0aWFsaXphdGlvbiBSQyAocnVuIGNvbW1hbmRzKSBmaWxlCisjCisjICAgICAgIFRoZXNlIGFyZSBkZWZhdWx0IGNvbW1hbmRzIHRoYXQgYXJlIHJlYWQgYW5kIGV4ZWN1dGVkIGJ5IGRlZmF1bHQKKyMgICAgICAgd2hlbiBCQ00gYm9vdHMgdXAuICBUeXBpY2FsbHkgdGhpcyBmaWxlIGlzIGNhbGxlZCByYy5zb2MgYW5kIHJlc2lkZXMKKyMgICAgICAgaW4gdGhlIGZsYXNoIGZpbGVzeXN0ZW0sIE5WUkFNLCBvciBkaXNrLgorIworIyBCb2FyZCBDb25maWd1cmF0aW9uIFNldHRpbmcKKyMKKyMgICAgICAgVGhpcyBmaWxlIHVzZXMgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHRvIGtub3cgb24gd2hpY2ggYm9hcmQKKyMgICAgICAgaXQgaXMgcnVubmluZy4gIEN1cnJlbnRseSBvbmUgb2YgZm9sbG93aW5nIHNldHRpbmdzIG11c3QgYmUgbWFkZToKKyMKKyMgICAgICAgQkNNOTU2NzBLOCAgICAgICAgICBjb25maWcgYWRkIGhlcmM4PTEKKyMgICAgICAgQkNNOTU2OTBLMjQgICAgICAgICBjb25maWcgYWRkIGRyYWNvX2IyYj0xCisjICAgICAgIEJDTTk1NjkwSzI0UyAgICAgICAgY29uZmlnIGFkZCBkcmFjb19zdGs9MQorIyAgICAgICBCQ005NTY5MFIyNCAgICAgICAgIGNvbmZpZyBhZGQgZ2FsYWhhZD0xCisjICAgICAgIEJDTTk1NjkwUjI0UyAgICAgICAgY29uZmlnIGFkZCBtZXJsaW49MQorIyAgICAgICBCQ005NTY5MFI0OFMgICAgICAgIGNvbmZpZyBhZGQgbGFuY2Vsb3Q9MQorIyAgICAgICBCQ005NTY5MUsxMiAgICAgICAgIGNvbmZpZyBhZGQgZHJhY29fazEyPTEKKyMgICAgICAgV2hpdGUgS25pZ2h0ICAgICAgICBjb25maWcgYWRkIHdoaXRlX2tuaWdodD0xIChub3Qgc2hpcHBpbmcpCisjICAgICAgIEJsYWNrIEtuaWdodCAgICAgICAgY29uZmlnIGFkZCBibGFja19rbmlnaHQ9MSAobm90IHNoaXBwaW5nKQorIyAgICAgICBCQ005NTY3M0syUyAgICAgICAgIGNvbmZpZyBhZGQgdHdvbHlueD0xCisjICAgICAgIEJDTTk1NjczUjggICAgICAgICAgY29uZmlnIGFkZCBoZXJjdWx5bng9MQorIyAgICAgICBCQ005NTY3M1IyNFMgICAgICAgIGNvbmZpZyBhZGQgbHlueGFsaXR0bGU9MQorIyAgICAgICBCQ005NTY3M1I0OFMgICAgICAgIGNvbmZpZyBhZGQgbHlueGFsb3Q9MQorIyAgICAgICBCQ005NTY5NVAyNFNYXzEwICAgIGNvbmZpZyBhZGQgZ3VlbmV2ZXJlPTEKKyMgICAgICAgQkNNOTU2NTBLMjQgICAgICAgICBjb25maWcgYWRkIG1hZ251bT0xIChhdXRvbWF0aWMgZm9yIDU2NTBMKQorIyAgICAgICBCQ005NTY3NSAgICAgICAgICAgIGNvbmZpZyBhZGQgaGVyYzhfMTU9MQorIyAgICAgICBCQ005NTY1MFIyNCAgICAgICAgIGNvbmZpZyBhZGQgdHVjMjRfcmVmPTEKKyMgICAgICAgQkNNOTU2OTVQNDhMTSAgICAgICBjb25maWcgYWRkIGxtNDhwPTEKKyMgICAgICAgQkNNOTU2OTVQNDhMTS0xMCAgICBjb25maWcgYWRkIGxtNDhwX0I9MQorIyAgICAgICBCQ005NTY1MDRQNDhMTS0xMCAgIGNvbmZpZyBhZGQgbG00OHBfQz0xCisjICAgICAgIEJDTTk1NjUwNFA0OExNLTIwICAgY29uZmlnIGFkZCBsbTQ4cF9DPTEKKyMgICAgICAgQkNNOTU2NTA0UDQ4TE0tNTAgICBjb25maWcgYWRkIGxtNDhwX0Q9MQorIyAgICAgICBCQ005NTY1MDRQNDhQT0VSRUYgIGNvbmZpZyBhZGQgZmJwb2U9MQorIyAgICAgICBCQ005NTY1MDRQMjRSRUYgUDAgIGNvbmZpZyBhZGQgZmIyND0xCisjICAgICAgIEJDTTk1NjUwNFAyNCAgICBQMCAgY29uZmlnIGFkZCBmYjI0PTEKKyMgICAgICAgQkNNOTU2MTAyUDQ4ICAgICAgICBjb25maWcgYWRkIGZlbGl4NDg9MQorIyAgICAgICBCQ005NTMzMDBQMjRSRUYgICAgIGNvbmZpZyBhZGQgbWlyYWdlMjQ9MQorIyAgICAgICBCQ005NTY4MDBLMjBDICAgICAgIGNvbmZpZyBhZGQgYnJhZGxleV8xZz0xCisjICAgICAgIEJDTTk1NjcwMEsxNiAgICAgICAgY29uZmlnIGFkZCBodW12PTEKKyMgICAgICAgQkNNOTU2ODAwSzIwICAgICAgICBjb25maWcgYWRkIGJyYWRsZXk9MQorIyAgICAgICBCQ005NTY1ODBLMTYgICAgICAgIGNvbmZpZyBhZGQgZ29sZHdpbmc9MQorIyAgICAgICBCQ005NTYzMTRQMjRSRUYgICAgIGNvbmZpZyBhZGQgYmNtNTYzMTRwMjRyZWY9MQorIyAgICAgICBCQ005NTYwMjRQNDhSRUYgICAgIGNvbmZpZyBhZGQgQkNNOTU2MDI0UDQ4UkVGPTEKKyMgICAgICAgQkNNOTU2MjI0UDQ4UkVGICAgICBjb25maWcgYWRkIEJDTTk1NjIyNFA0OFJFRj0xCisjICAgICAgIEJDTTk1NjIyNFI1MFQgICAgICAgY29uZmlnIGFkZCBCQ005NTYyMjRSNTBUPTEKKyMgICAgICAgQkNNOTU2MDI0UjUwVCAgICAgICBjb25maWcgYWRkIEJDTTk1NjAyNFI1MFQ9MQorIyAgICAgICBCQ001NjgyMEsyNFhHICAgICAgIGNvbmZpZyBhZGQgQkNNNTY4MjBLMjRYRz0xCisjICAgICAgIEJDTTk1MzMxNFIyNEdTICAgICAgY29uZmlnIGFkZCBCQ005NTMzMTRSMjRHUz0xCisjICAgICAgIEJDTTk1MzMxNEsyNCAgICAgICAgY29uZmlnIGFkZCBCQ005NTMzMTRLMjQ9MQorIyAgICAgICBCQ005NTY4MjBSMjRYRyAgICAgIGNvbmZpZyBhZGQgQkNNOTU2ODIwUjI0WEc9MQorIyAgICAgICBCQ005NTYxNjBSICAgICAgICAgIGNvbmZpZyBhZGQgYmNtOTU2MTYwcj0xCisKK2lmICQ/QkNNNTYxNDZfQTAgXAorICAgICdsb2NhbCBCQ001NjE0NiAxJworCitpZiAkP0JDTTU2MTQ3X0EwIFwKKyAgICAnbG9jYWwgQkNNNTYxNDcgMScKKworCitpZiAkPzEgImVjaG8gcmM6IGFyZ3VtZW50cyBub3Qgc3VwcG9ydGVkOyBleGl0IgoraWYgISQ/dW5pdCAiZWNobyByYzogbm8gY3VycmVudCB1bml0OyBleGl0IgorCitlY2hvICJyYzogdW5pdCAkdW5pdCBkZXZpY2UgJGRldm5hbWUiCitsb2NhbCBxdWlldCBubworbG9jYWwgZWNobyBlY2hvCitsb2NhbCByY2RvbmUgXCRyYyR1bml0CitpZiAhImV4cHIgJHJjZG9uZSArIDAiICJsb2NhbCBlY2hvIG5vZWNobzsgbG9jYWwgcXVpZXQgeWVzIgorCisjIFNldCBjb252ZW5pZW5jZSBsb2NhbCB2YXJpYWJsZXMKKworIyBzaW11bGF0aW9uIHJlbGF0ZWQKKyNpZiAkP3BsaXNpbSBcCisjICAgICAgICJsb2NhbCBub19iY20gMSIKK2lmICQ/cXVpY2t0dXJuIHx8ICQ/cGxpc2ltIFwKKwkibG9jYWwgc2ltdWxhdG9yIDEiCisKK2lmICQ/c2ltdWxhdG9yIFwKKyAgICAnZWNobyAtbiAiQ2hpcCBpbml0IHN0YXJ0cyBhdDogIjtkYXRlJworCisjIGJvYXJkIHJlbGF0ZWQKK2lmICQ/Z2FsYWhhZCBcCisJImxvY2FsIGRyYWNvX2IyYiAxIgoraWYgJD9ibGFja19rbmlnaHQgfHwgJD93aGl0ZV9rbmlnaHQgfHwgJD9tZXJsaW4gXAorCSJsb2NhbCBkcmFjb19oZXJjNCAxIgorCisjaWYgJD9RVVhfQTAgXAorIyAgICAnZWNobyBibGFibGFibGE7ZGVyIDB4NDAgNCA7IGV4aXQnCisKK2lmICQ/RkxBSVJfQTAgXAorICAgICdlY2hvIGJsYWJsYWJsYTtkZXIgMHg0MCA0IDsgZXhpdCcKKworaWYgJD9CQ004ODc1MF9BMCB8fCAkP0JDTTg4NzUwX0IwIHx8ICQ/QkNNODg3NTNfQTAgfHwgJD9CQ004ODc1M19CMCB8fCAkP0JDTTg4NzUyX0EwIHx8ICQ/QkNNODg3NTJfQjAgfHwgICQ/QkNNODg3NTVfQjAgfHwgJD9CQ004ODc1NF9BMCB8fCAkP0JDTTg4NzcwX0ExIHx8ICQ/QkNNODg3NzNfQTEgfHwgJD9CQ004ODc3NF9BMSB8fCAkP0JDTTg4Nzc1X0ExIHx8ICQ/QkNNODg3NzZfQTEgfHwgJD9CQ004ODc3N19BMSB8fCAkP0JDTTg4OTUwX0EwIHx8ICQ/QkNNODg5NTBfQTEgfHwgJD9CQ004ODk1M19BMSB8fCAkP0JDTTg4OTU0X0ExIHx8ICQ/QkNNODg5NTVfQTEgfHwgJD9CQ004ODk1Nl9BMSB8fCAkP0JDTTg4OTUyX0EwIHx8ICQ/QkNNODg5NTJfQTEgfHwgJD9CQ004ODc3Ml9BMSBcCisgICAgJ3JjbG9hZCBkZmUuc29jIDsgZXhpdCcKKworaWYgJD9CQ004ODc5MF9BMCBcCisgICAgJ3JjbG9hZCBkbnhmLnNvYyA7IGV4aXQnCisKK2lmICQ/QVJBRF9BMCB8fCAkP0FSQURfQjAgfHwgJD9BUkFEX0IxIHx8ICQ/QVJBRFBMVVNfQTAgfHwgJD9CQ004ODY1MF9BMCB8fCAkP0JDTTg4NjUwX0IwIHx8ICQ/QkNNODg2NTBfQjEgfHwgJD9CQ004ODY1Ml9BMCB8fCAkP0JDTTg4NjUyX0IwIHx8ICQ/QkNNODgzNTBfQjEgfHwgJD9CQ004ODM1MV9CMSB8fCBcCisgICAkP0JDTTg4NDUwX0IxIHx8ICQ/QkNNODg0NTFfQjEgfHwgJD9CQ004ODU1MF9CMSB8fCAkP0JDTTg4NTUxX0IxIHx8ICQ/QkNNODg1NTJfQjEgfHwgJD9CQ004ODY1MV9CMSB8fCAkP0JDTTg4NjU0X0IxIHx8ICQ/QkNNODg2NjBfQTAgfHwgJD9CQ004ODM2MF9BMCB8fCAkP0JDTTg4MzYxX0EwIHx8ICQ/QkNNODgzNjNfQTAgfHxcCisgICAkP0JDTTg4NDYwX0EwIHx8ICQ/QkNNODg0NjFfQTAgfHwgJD9CQ004ODU2MF9BMCB8fCAkP0JDTTg4NTYxX0EwIHx8ICQ/QkNNODg1NjJfQTAgfHwgJD9CQ004ODY2MV9BMCB8fCAkP0JDTTg4NjY0X0EwICBcCisgICAgJ3JjbG9hZCBhcmFkLnNvYyA7IGV4aXQnCisKK2lmICQ/QkNNODMyMDdfQTAgXAorICAgICdyY2xvYWQgc2FtYXIuc29jIDsgZXhpdCcKK2lmICQ/QkNNODMyMDhfQTAgXAorICAgICdyY2xvYWQgc2luYWkuc29jIDsgZXhpdCcKKworaWYgJD9RQVhfQTAgfHwgJD9CQ004ODQ3MF9BMCB8fCAkP0JDTTg4NDcxX0EwIHx8ICQ/QkNNODg0NzNfQTAgfHwgJD9CQ004ODQ3NF9BMCB8fCAkP0JDTTg4NDc0SF9BMCB8fCAkP0JDTTg4NDc2X0EwIHx8ICQ/QkNNODg0NzdfQTAgfHwgXAorICAgJD9RQVhfQjAgfHwgJD9CQ004ODQ3MF9CMCB8fCAkP0JDTTg4NDcxX0IwIHx8ICQ/QkNNODg0NzNfQjAgfHwgJD9CQ004ODQ3NF9CMCB8fCAkP0JDTTg4NDc0SF9CMCB8fCAkP0JDTTg4NDc2X0IwIHx8ICQ/QkNNODg0NzdfQjAgXAorICAgICdzZXRlbnYgUUFYIDEnCisgICAgCitpZiAkP1FVWF9BMCB8fCAkP0JDTTg4MjcwX0EwIFwKKyAgICAnc2V0ZW52IFFVWCAxJworCitpZiAkP0pFUklDSE9fQTAgfHwgICQ/QkNNODg2NzBfQTAgfHwgJD9CQ004ODY3MV9BMCB8fCAkP0JDTTg4NjcxTV9BMCB8fCAkP0JDTTg4NjcyX0EwIHx8ICQ/QkNNODg2NzNfQTAgfHwgJD9CQ004ODY3NF9BMCB8fCAkP0JDTTg4Njc1X0EwIHx8ICQ/QkNNODg2NzVNX0EwIHx8ICQ/QkNNODg2NzZfQTAgfHwgJD9CQ004ODY3Nk1fQTAgfHwgJD9CQ004ODY3N19BMCB8fCAkP0JDTTg4Njc4X0EwIHx8ICQ/QkNNODg2NzlfQTAgfHwgXAorICAgJD9KRVJJQ0hPX0ExIHx8ICAkP0JDTTg4NjcwX0ExIHx8ICQ/QkNNODg2NzFfQTEgfHwgJD9CQ004ODY3MU1fQTEgfHwgJD9CQ004ODY3Ml9BMSB8fCAkP0JDTTg4NjczX0ExIHx8ICQ/QkNNODg2NzRfQTEgfHwgJD9CQ004ODY3NV9BMSB8fCAkP0JDTTg4Njc1TV9BMSB8fCAkP0JDTTg4Njc2X0ExIHx8ICQ/QkNNODg2NzZNX0ExIHx8ICQ/QkNNODg2NzdfQTEgfHwgJD9CQ004ODY3OF9BMSB8fCAkP0JDTTg4Njc5X0ExIHx8IFwKKyAgICQ/UU1YX0EwICAgICB8fCAgJD9CQ004ODM3MF9BMCB8fCAkP0JDTTg4MzcxX0EwIHx8ICQ/QkNNODgzNzFNX0EwIHx8ICQ/QkNNODgzNzVfQTAgfHwgJD9CQ004ODM3Nl9BMCB8fCAkP0JDTTg4Mzc2TV9BMCB8fCAkP0JDTTg4Mzc3X0EwIHx8ICQ/QkNNODgzNzhfQTAgfHwgJD9CQ004ODM3OV9BMCB8fCBcCisgICAkP1FNWF9BMSAgICAgfHwgICQ/QkNNODgzNzBfQTEgfHwgJD9CQ004ODM3MV9BMSB8fCAkP0JDTTg4MzcxTV9BMSB8fCAkP0JDTTg4Mzc1X0ExIHx8ICQ/QkNNODgzNzZfQTEgfHwgJD9CQ004ODM3Nk1fQTEgfHwgJD9CQ004ODM3N19BMSB8fCAkP0JDTTg4Mzc4X0ExIHx8ICQ/QkNNODgzNzlfQTEgfHwgXAorICAgJD9KRVJJQ0hPX0IwIHx8ICAkP0JDTTg4NjcwX0IwIHx8ICQ/QkNNODg2NzFfQjAgfHwgJD9CQ004ODY3MU1fQjAgfHwgJD9CQ004ODY3Ml9CMCB8fCAkP0JDTTg4NjczX0IwIHx8ICQ/QkNNODg2NzRfQjAgfHwgJD9CQ004ODY3NV9CMCB8fCAkP0JDTTg4Njc1TV9CMCB8fCAkP0JDTTg4Njc2X0IwIHx8ICQ/QkNNODg2NzZNX0IwIHx8ICQ/QkNNODg2NzdfQjAgfHwgJD9CQ004ODY3OF9CMCB8fCAkP0JDTTg4Njc5X0IwIHx8ICQ/QkNNODg2ODBfQTAgfHwgXAorICAgJD9RTVhfQjAgICAgIHx8ICAkP0JDTTg4MzcwX0IwIHx8ICQ/QkNNODgzNzFfQjAgfHwgJD9CQ004ODM3MU1fQjAgfHwgJD9CQ004ODM3NV9CMCB8fCAkP0JDTTg4Mzc2X0IwIHx8ICQ/QkNNODgzNzZNX0IwIHx8ICQ/QkNNODgzNzdfQjAgfHwgJD9CQ004ODM3OF9CMCB8fCAkP0JDTTg4Mzc5X0IwIHx8ICQ/QkNNODgzNzlfQTEgfHwgXAorICAgJD9KRVJQTFVTICAgIHx8ICAkP0JDTTg4NjgwX0EwIHx8ICAkP0JDTTg4NjgxX0EwIHx8ICAkP0JDTTg4NjgyX0EwIHx8ICQ/QkNNODg2ODNfQTAgfHwgICQ/QkNNODgzODBfQTAgfHwgICQ/QkNNODgzODFfQTAgXAorICAgICdyY2xvYWQgamVyLnNvYyA7IGV4aXQnCisKK2lmICQ/QkNNODg2OTBfQTAgIFwKKyAgICAncmNsb2FkIGRueC5zb2MgOyBleGl0JworCitpZiAkP1FBWCB8fCAkP1FVWFwKKyAgICAncmNsb2FkIHFheC5zb2MgOyAgZXhpdCcKKworCitpZiAkP0JDTTg4MjAyX0EwIHx8ICQ/QVJET05fQTAgfHwgJD9CQ004ODIwMl9BMSB8fCAkP0FSRE9OX0ExIHx8ICQ/QkNNODgyMDJfQTIgfHwgJD9BUkRPTl9BMlwKKyAgICAncmNsb2FkIGF0bWYuc29jIDsgZXhpdCcKKworaWYgJD9BQ1AgXAorICAgICdleGl0JworCitpZiAkP0JDTTg4NjkwX0EwXAorICAgICdleGl0JworICAgICAgCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHg1NjUwIiBcCisJImxvY2FsIG1hZ251bSAxIgoraWYgJD9kcmFjIHx8ICQ/ZHJhYzE1IFwKKwkibG9jYWwgZHJhY19hbnkgMSIKK2lmICQ/bHlueCB8fCAkP2x5bngxNSBcCisJImxvY2FsIGx5bnhfYW55IDEiCitpZiAkP3R1Y2FuYSB8fCAkP21hZ251bSBcCisJImxvY2FsIHR1Y2FuYV9hbnkgMSIKK2lmICQ/aGVyYyB8fCAkP2hlcmMxNSBcCisJImxvY2FsIGhlcmNfYW55IDEiCitpZiAkP2ZpcmVib2x0IHx8ICQ/ZmlyZWJvbHQyIHx8ICQ/aGVsaXggfHwgXAorICAgJD9mZWxpeCB8fCAkP2hlbGl4MTUgfHwgJD9mZWxpeDE1IHx8ICQ/cmFwdG9yIHx8ICQ/cmF2ZW4gfHwgJD9oYXdrZXllXAorCSJsb2NhbCBmaXJlYm9sdF9hbnkgMSIKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI1MDEiIFwKKwkibG9jYWwgZmlyZWJvbHRfMTB4NCAxIgoraWYgJD9lYXN5cmlkZXIgXAorCSJsb2NhbCBlYXN5cmlkZXJfYW55IDEiCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjAyIiBcCisJImxvY2FsIGVhc3lyaWRlcl8xeDEgMSIKK2lmICQ/YnJhZGxleSB8fCAkP2h1bXYgfHwgJD9nb2xkd2luZyBcCisJImxvY2FsIGJyYWRsZXlfYW55IDEiCitpZiAkP2RyYWNfYW55IHx8ICQ/bHlueF9hbnkgfHwgJD90dWNhbmFfYW55IFwKKwkibG9jYWwgeGdzMTJfc3dpdGNoIDEiCitpZiAkP2ZpcmVib2x0X2FueSB8fCAkP2Vhc3lyaWRlcl9hbnkgfHwgJD9icmFkbGV5X2FueSBcCisJImxvY2FsIHhnczNfc3dpdGNoIDEiCitpZiAkP3hnczEyX3N3aXRjaCB8fCAkP3hnczNfc3dpdGNoIFwKKwkibG9jYWwgeGdzX3N3aXRjaCAxIgoraWYgJD9oZXJjX2FueSBcCisJImxvY2FsIHhnc19mYWJyaWMgMSIKK2lmICQ/eGdzX2ZhYnJpYyB8fCAkP3hnc19zd2l0Y2ggXAorCSJsb2NhbCB4Z3MgMSIKK2lmICEkP3hncyBcCisJImxvY2FsIHN0cmF0YSAxIgoraWYgJD9zdHJhdGEgJiYgISQ/Z3NsIFwKKwkibG9jYWwgUEJNUF9BTEwgMHgwYmZmZmZmZiIKK2lmICQ/c3RyYXRhICYmICQ/Z3NsIFwKKwkibG9jYWwgUEJNUF9BTEwgMHgwODAwMDBmZiIKK2lmICQ/QkNNNTYyMTRfQTAgfHwgJD9CQ001NjAxNF9BMCB8fCAkP0JDTTU2MjE1X0EwIHx8IFwKKyAgICQ/QkNNNTYyMTRfQTEgfHwgJD9CQ001NjAxNF9BMSB8fCAkP0JDTTU2MjE1X0ExICYmIFwKKyAgICEkP0JDTTk1NjAyNFA0OFJFRiBcCisJImxvY2FsIHJhcDI0X3JlZiAxIgorCitpZiAkP0JDTTU2NTVfQTAgfHwgJD9CQ001NjU1X0IwIFwKKyAgICAgICAgImxvY2FsIHR1Y2FuYV9ub2hnIDEiCisKK2lmICQ/QkNNOTU2MDI0UDQ4UkVGIHx8ICQ/QkNNOTU2MjI0UDQ4UkVGIHx8ICQ/QkNNOTU2MDI0UjUwVCB8fCBcCisgICAkP0JDTTk1NjIyNFI1MFQgXAorICAgICAgICAibG9jYWwgcmF2ZW5fZWJfNDhwIDEiCisKK2lmICQ/QkNNOTUzMzE0UjI0R1MgXAorICAgICAgICAibG9jYWwgaGF3a2V5ZV9wMjQgMSIKKworaWYgJD9CQ005NTMzMTRLMjQgXAorICAgICAgICAibG9jYWwgaGF3a2V5ZV9rMjQgMSIKKworaWYgJD9maXJlYm9sdF9hbnkgJiYgJD9sbTQ4cCB8fCAkP2xtNDhwX0QgXAorICAgICAgICAiY29uZmlnIGFkZCBsbWZiNDg9MSIKKworIyBTZXQgc29mdHdhcmUncyB3YWl0IGZvciBTLUNoYW5uZWwgcmVzcG9uc2UgdG8gMyBzZWNvbmRzIGZvciBRdWlja1R1cm4KKyMgKFJlY29tbWVuZCBhdCBsZWFzdCAxMCBzZWNvbmRzIGlmIHRoZSBBUkwgaXMgMTAwJSBidXN5IHdpdGggaW5zZXJ0cy4pCitpZiAkP3F1aWNrdHVybgkic3RpbWVvdXQgMzAwMDAwMCIKK2lmICQ/cGxpc2ltCSJzdGltZW91dCA2MDAwMDAwMCIKKworIyBEaXJlY3QgcGh5IGxlZCBwcm9ncmFtbWluZzogNTQ2NCBhY3Rpdml0eSBsZWQgYmVjb21lcyBsaW5rL2FjdGl2aXR5CitpZiAkP2RyYWNfYW55ICYmICQ/bGFuY2Vsb3QgfHwgJD9seW54YWxvdCB8fCAkP2d1ZW5ldmVyZSBcCisJImNvbmZpZyBhZGQgcGh5X2xlZF9jdHJsPTB4MTgiCisKKyMgU2h1dGRvd24gdGhyZWFkcyBpZiBzeXN0ZW0gaXMgYWxyZWFkeSBydW5uaW5nCitpZiAkP3RyaXVtcGgzIFwKKwkiaWJvZFN5bmMgb2ZmIgorY291bnRlciBvZmYKK2xpbmtzY2FuIG9mZgoraWYgJD9mZWF0dXJlX2FybF9oYXNoZWQgJiYgISQ/c2ltdWxhdG9yIFwKKyAgICAgICAgImwybW9kZSBvZmYiCitpZiAkP2ZlYXR1cmVfY2VzICYmICQ/QkNNNTY0NDBfQTAgXAorICAgICAgICAiY2VzIG9mZiIKKworIyBUZXN0IG9uLWNoaXAgbWVtb3J5IGJlZm9yZSBpbml0aWFsaXppbmcKKyNpZiAhJD9zaW11bGF0b3IgImluaXQgc29jOyBiaXN0IGwzIGFybCBjYnAiCitpbml0IHNvYworCisjIEluaXRpYWxpemUgbWlzY2VsbGFuZW91cyBjaGlwIHJlZ2lzdGVycworaW5pdCBtaXNjCisKKyMgSW5pdGlhbGl6ZSBleHRlcm5hbCBUQ0FNIGlmIG5lY2Vzc2FyeQorIyBOT1RFIDogdGNhbSBpcyBpbml0aWFsaXplZCBkdXJpbmcgImluaXQgbWlzYyIgdW5sZXNzIAorIyAgICAgICAgdGNhbV9yZXNldF90b2dnbGUgPSAxIGlzIGNvbmZpZ3VyZWQKK2lmICJleHByICRyY2RvbmUgKyAwIiAmJiAhImV4cHIgJHRjYW1fcmVzZXRfdG9nZ2xlICsgMCIgXAorICAgICAgICAiZGlzcGF0Y2ggYXR0YWNoIDAgZXN3IDAiCitpZiAhImV4cHIgJHRjYW1fcmVzZXRfdG9nZ2xlICsgMCIgIm11eHNlbCAwOyBtdXhzZWwgMHg4MCIKK2lmICEiZXhwciAkdGNhbV9yZXNldF90b2dnbGUgKyAwIiAiaW5pdCB0Y2FtOyAkZWNobyByYzogVENBTSBpbml0aWFsaXplZCIKKworIyBJbml0aWFsaXplIHRoZSBTdHJhdGFTd2l0Y2ggTU1VIHJlZ2lzdGVycworaW5pdCBtbXUKK2lmICQ/a2F0YW5hMiBcCisgICBrdDJjb25maWcuc29jCisKKworIyBVbmNvbW1lbnQgdG8gdHVybiBvZmYgU2luZ2xlLUJpdCBFcnJvciByZXBvcnRpbmcgb24gNTY3MAorI2lmICQ/aGVyYyAibSBtbXVfaW50Y250bCBwcF9zYmVfZW49MCIKKworIyBJbml0aWFsaXplIENlbGwgRnJlZSBBZGRyZXNzIFBvb2wKKyMgTk9URTogdGhpcyBzaG91bGQgTk9UIGJlIGRvbmUgdW5sZXNzIGNoaXAgaXMga25vd24gdG8gaGF2ZSBiYWQgQ0ZBUAorIyBtZW1vcnkgZW50cmllcyB0aGF0IG5lZWQgdG8gYmUgbWFwcGVkIG91dC4KK2lmICQ/Y2ZhcF90ZXN0cyAiJGVjaG8gcmM6IEluaXRpYWxpemluZyBDRkFQOyBjZmFwaW5pdCIKKworJGVjaG8gcmM6IE1NVSBpbml0aWFsaXplZAorCisjCisjIExvYWQgdUtlcm5lbAorIworCisjIFBpY2sgZGVmYXVsdCBGVyBuYW1lcyBpZiBub3Qgc2V0IGFscmVhZHkgYnkgY29uZmlnCitpZiAhJD9md19jb3JlXzAgXAorICAgICdsb2NhbCBmd19jb3JlXzAgJHtmd19wcmVmaXh9XzBfYmZkX2JoaC5zcmVjOyBcCisgICAgIGlmICQ/Z3JleWhvdW5kIHx8ICQ/aHVycmljYW5lMiB8fCAkP2h1cnJpY2FuZTMgImxvY2FsIGZ3X2NvcmVfMCAke2Z3X3ByZWZpeH1fMF9wdHBmdWxsLnNyZWMiOyBcCisgICAgIGlmICQ/Y2FsYWRhbjMgImxvY2FsIGZ3X2NvcmVfMCAke2Z3X3ByZWZpeH1fMC5zcmVjIjsgXAorICAgICBpZiAkP2hlbGl4NCAmJiAhJD9mZWF0dXJlX2JoaCAibG9jYWwgZndfY29yZV8wICR7ZndfcHJlZml4fV8wX2JmZC5zcmVjIjsgXAorICAgICBpZiAkP2hlbGl4NCAmJiAkP2ZlYXR1cmVfYmhoICJsb2NhbCBmd19jb3JlXzAgJHtmd19wcmVmaXh9XzBfYmZkX2JoaC5zcmVjIjsgXAorICAgICBpZiAkP3RvbWFoYXdrICYmICEkP2ZlYXR1cmVfYmhoICJsb2NhbCBmd19jb3JlXzAgJHtmd19wcmVmaXh9XzBfYmZkLnNyZWMiOyBcCisgICAgIGlmICQ/dG9tYWhhd2tfcGx1cyAmJiAhJD9mZWF0dXJlX2JoaCAibG9jYWwgZndfY29yZV8wICR7ZndfcHJlZml4fV8wX2JmZC5zcmVjIjsgXAorICAgICBpZiAkP3RyaWRlbnQycGx1cyAmJiAhJD9mZWF0dXJlX2JoaCAibG9jYWwgZndfY29yZV8wICR7ZndfcHJlZml4fV8wX2JmZC5zcmVjIjsgXAorICAgICcKKworaWYgISQ/ZndfY29yZV8xIFwKKyAgICdsb2NhbCBmd19jb3JlXzEgJHtmd19wcmVmaXh9XzFfcHRwZnVsbC5zcmVjOyBcCisgICAgaWYgJD9jYWxhZGFuMyAibG9jYWwgZndfY29yZV8xICR7ZndfcHJlZml4fV8xX2JzLnNyZWMiOyBcCisgICAnCisKK2lmICEkP2Z3X2NvcmVfMiBcCisgICAibG9jYWwgZndfY29yZV8yICR7ZndfcHJlZml4fV8yX2V0aF9sbWRtLnNyZWMiCisKKyMgTG9hZCB0aGUgZmlybXdhcmVzCitpZiAkP2ZlYXR1cmVfY21pY20gJiYgISQ/cmNwdV9vbmx5ICYmICEkaWhvc3RfbW9kZSAmJiAhJD9mZWF0dXJlX2lwcm9jIFwKKyAgICAibWNzbG9hZCAwICR7ZndfY29yZV8wfSBJbml0TUNTPXRydWU7IFwKKyAgICAgbWNzbG9hZCAxICR7ZndfY29yZV8xfTsiCisKK2lmICQ/aHVycmljYW5lMiBcCisgICAibWNzbG9hZCAwICR7ZndfY29yZV8wfSBJbml0TUNTPXRydWU7IgorCitpZiAkP2ZlYXR1cmVfaXByb2MgJiYgISQ/aHVycmljYW5lMiAmJiAhJD9odXJyaWNhbmUzICYmICEkP3JjcHVfb25seSAmJiAhJD9mZWF0dXJlX3VjX21ob3N0ICYmICEkaWhvc3RfbW9kZVwKKyAgICAibWNzbG9hZCAwICR7ZndfY29yZV8wfSBJbml0TUNTPXRydWUgVHdvU3RhZ2U9dHJ1ZSBUd29TdGFnZUFkZHI9MHg2MDAwMDAwMDtcCisgICAgIG1jc2xvYWQgMSAke2Z3X2NvcmVfMX0gVHdvU3RhZ2U9dHJ1ZSBUd29TdGFnZUFkZHI9MHg2MDAyYzAwMDsiCisKK2lmICQ/ZmVhdHVyZV9pcHJvYyAmJiAhJD9yY3B1X29ubHkgJiYgJD9mZWF0dXJlX3VjX21ob3N0ICYmICQ/bnVtX3Vjc1wKKyAgICAnaWYgISJleHByICRudW1fdWNzID4gMCIgIm1jc2xvYWQgMCAke2Z3X2NvcmVfMH0gSW5pdE1DUz10cnVlIjsgXAorICAgICBpZiAhImV4cHIgJG51bV91Y3MgPiAxIiAibWNzbG9hZCAxICR7ZndfY29yZV8xfSI7IFwKKyAgICAgaWYgISJleHByICRudW1fdWNzID4gMiIgIm1jc2xvYWQgMiAke2Z3X2NvcmVfMn0iOycKKworIworIyBJbml0IENMSSBhbmQgQkNNIEFQSQorIworIyBUaGlzIG11c3QgYmUgZG9uZSBhZnRlciB0aGUgcmF3IHJlZ2lzdGVyIHdyaXRlcyB0byBhdm9pZCBoYXZpbmcgc3RhdGUKKyMgY2xvYmJlcmVkLiAgTk9URTogVGFibGVzIGFyZSBjbGVhcmVkIGJ5ICJpbml0IGJjbSIgYmVsb3cuICBJZgorIyB0YWJsZSBtb2RpZmljYXRpb25zIGFyZSByZXF1aXJlZCwgcHV0IHRoZW0gYWZ0ZXIgImluaXQgYmNtIi4gIFNvbWUKKyMgcmVnaXN0ZXJzIG1pZ2h0IGFsc28gYmUgYWZmZWN0ZWQuCisjCisKK2lmICEkP25vX2JjbSBcCisJImluaXQgYmNtOyBcCisJICRlY2hvIHJjOiBCQ00gZHJpdmVyIGluaXRpYWxpemVkIgorCitpZiAkP25vX2JjbSBcCisJIiRlY2hvIHJjOiAqKiogTk9UIGluaXRpYWxpemluZyBCQ00gZHJpdmVyICoqKiIKKworaWYgJD9ub19iY20gJiYgJD9zdHJhdGEgXAorICAgICd3cml0ZSB2dGFibGUgMCAxIFZMQU5fVEFHPTAsUE9SVF9CSVRNQVA9MCxVVF9QT1JUX0JJVE1BUD0wOyBcCisgICAgIGluc2VydCB2dGFibGUgVkxBTl9UQUc9MSxQT1JUX0JJVE1BUD0kUEJNUF9BTEwsVVRfUE9SVF9CSVRNQVA9JFBCTVBfQUxMOyBcCisgICAgIGxvY2FsIHB2IFwKKyAgICAgICAgIFZMQU5fVEFHPTEsU1BfU1Q9MyxQT1JUX0JJVE1BUD0kUEJNUF9BTEwsVVRfUE9SVF9CSVRNQVA9JFBCTVBfQUxMOyBcCisJIHdyaXRlIHB0YWJsZSAwIDMyIFBUWVBFPTA7IFwKKwkgaWYgISQ/Z3NsICJ3cml0ZSBwdGFibGUgMCAyNCAkcHYsUFRZUEU9MSI7IFwKKwkgaWYgISQ/Z3NsICJ3cml0ZSBwdGFibGUgMjQgMiAkcHYsUFRZUEU9MiI7IFwKKwkgaWYgJD9nc2wgICJ3cml0ZSBwdGFibGUgMCA4ICRwdixQVFlQRT0yIjsgXAorCSB3cml0ZSBwdGFibGUgMjcgMSAkcHYsUFRZUEU9MzsgXAorICAgICBsb2NhbCBwdicKKworIyBUdXJuIG9uIG1pcnJvcmluZyBvZiBoYXJkd2FyZSBBUkwgb3BlcmF0aW9ucyBpbnRvIHNvZnR3YXJlIEFSTCB0YWJsZS4KK2lmICQ/ZmVhdHVyZV9hcmxfc29ydGVkIFwKKwkiYXJsbW9kZSBpbnRyX2RtYTsgXAorCSAkZWNobyByYzogQVJMIERNQSBzaGFkb3dpbmcgZW5hYmxlZCIKKworaWYgJD9mZWF0dXJlX2FybF9oYXNoZWQgJiYgISQ/c2ltdWxhdG9yICYmICEkP3JjcHVfb25seSBcCisJImwybW9kZSBpbnRlcnZhbD0zMDAwMDAwOyBcCisJICRlY2hvIHJjOiBMMiBUYWJsZSBzaGFkb3dpbmcgZW5hYmxlZCIKKworIyBJZiBydW5uaW5nIEJDTSBsaWJyYXJ5LCBzdGFydCBsaW5rc2NhbiB0YXNrIGFuZCBzZXQgcG9ydCBtb2RlcworCitpZiAhJD9ub19iY20gJiYgISQ/cmNwdV9vbmx5IFwKKwkibGlua3NjYW4gMjUwMDAwOyBcCisJIHBvcnQgZmUsZ2UgbGlua3NjYW49b24gYXV0b25lZz1vbiBcCisJCXNwZWVkPTAgZnVsbGR1cGxleD10cnVlIHR4cGF1c2U9dHJ1ZSByeHBhdXNlPXRydWU7IFwKKwkgcG9ydCBzdCBsaW5rc2Nhbj1vbiB0eHBhdXNlPWZhbHNlIHJ4cGF1c2U9ZmFsc2U7IFwKKyAgICAgICAgIHBvcnQgeGUsY2UgbGlua3NjYW49b24gYXV0b25lZz1vZmYgXAorICAgICAgICAgICAgICAgIHNwZWVkPTAgZnVsbGR1cGxleD10cnVlIHR4cGF1c2U9dHJ1ZSByeHBhdXNlPXRydWU7IFwKKyAgICAgICAgIHBvcnQgaGcgbGlua3NjYW49b24gZnVsbGR1cGxleD10cnVlIHR4cGF1c2U9ZmFsc2UgcnhwYXVzZT1mYWxzZTsgXAorCSAkZWNobyByYzogUG9ydCBtb2RlcyBpbml0aWFsaXplZCIKKworaWYgISQ/bm9fYmNtICYmICQ/cmNwdV9vbmx5IFwKKwkibGlua3NjYW4gMjUwMDAwOyBcCisJIHBvcnQgZSBsaW5rc2Nhbj1vbjsgXAorCSBwb3J0IHN0IGxpbmtzY2FuPW9uOyBcCisgICAgIHBvcnQgeGUgbGlua3NjYW49b247IFwKKwkgJGVjaG8gcmM6IFBvcnQgbW9kZXMgaW5pdGlhbGl6ZWQiCisKK2lmICEkP25vX2JjbSAmJiAkP3NoYWRvdyBcCisgICAgICJwb3J0IGlsIGxpbmtzY2FuPW9uOyBcCisJICAkZWNobyByYzogSW50ZXJsYWtlbiBQb3J0IG1vZGUgaW5pdGlhbGl6ZWQiCisKKyMgU2VsZWN0aXZlbHkgcmUtZW5hYmxlIEF1dG8gTmVnb3RpYXRpb24gYmFzZWQgb24gY29uZmlnIHBvcnRfZm9yY2VfYW5fbGlzdC4KKyNpZiAkP3BvcnRfZm9yY2VfYW5fbGlzdCBcCisjICAgICJwb3J0ICRwb3J0X2ZvcmNlX2FuX2xpc3QgYXV0b25lZz1vbiIKKworIyBObyBzcGFubmluZyB0cmVlIGlzIHJ1bm5pbmcsIHNvIHB1dCBwb3J0cyBhbGwgaW4gdGhlIGZvcndhcmRpbmcgc3RhdGUKKyMgc3RwIHN1cHBvcnQgbm90IGF2YWlsYWJsZSBmb3Igc2hhZG93IGRldmljZS4KKworaWYgISQ/bm9fYmNtICYmICEkP3NoYWRvdyBcCisJInN0ZyBzdHAgMSBhbGwgZm9yd2FyZCIKKworIyBTdGFydCBjb3VudGVyIHRhc2sgdW5sZXNzIGFscmVhZHkgc3RhcnRlZCBieSAiaW5pdCBiY20iIGFib3ZlLgoraWYgJD9wbGlzaW0gImxvY2FsIGRtYSBmYWxzZSIKK2lmICEkP3BsaXNpbSAibG9jYWwgZG1hIHRydWUiCitpZiAkP2RldmljZV9lYl92bGkgImxvY2FsIGRtYSBmYWxzZSIKK2lmICQ/bm9fYmNtICYmICEkP3JjcHVfb25seVwKKwkiY291bnRlciBJbnRlcnZhbD0xMDAwIFBibT1hbGwgRG1hPSRkbWE7IFwKKwkgJGVjaG8gcmM6IENvdW50ZXIgY29sbGVjdGlvbiBlbmFibGVkIgoraWYgJD9yY3B1X29ubHkgXAorCSJjb3VudGVyIEludGVydmFsPTIwMDAwMDAgUGJtPWFsbCBEbWE9ZmFsc2U7IFwKKwkgJGVjaG8gcmM6IENvdW50ZXIgY29sbGVjdGlvbiBlbmFibGVkIgorCisjIFJlc3luY2hyb25pemUgdGhlIHNhdmVkIHZhbHVlcyBrZXB0IGJ5IHRoZSAnc2hvdyBjb3VudGVyJyBjb21tYW5kLgoraWYgISQ/c2ltdWxhdG9yIFwKKyAgICAiY291bnRlciBzeW5jIgorCisjIEJ5IGRlZmF1bHQsIGR1bXAgZGF0YSBvZiBwYWNrZXRzIHRoYXQgZ28gdG8gQ1BVLgoraWYgISQ/dGVzdGluaXQgXAorCSJwdyByZXBvcnQgK3JhdyIKKworIyBEZWZhdWx0IExFRCBwcm9jZXNzb3IgcHJvZ3JhbSBmb3IgdmFyaW91cyBTREtzIGFuZCByZWZlcmVuY2UgZGVzaWducy4KKyMgU291cmNlIGNvZGUgY2FuIGJlIGZvdW5kIGluICRTREsvbGVkL2V4YW1wbGVzLgorCitpZiAhJD9wNDggImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCA3RiA2NyAyRiA2NyA2QiAwNiA3RiA4MCBEMiAxQSA3NCAwMSAxMiBcCisgN0UgODUgMDUgRDIgMEYgNzEgMTkgNTIgMDAgMTIgN0QgODUgMDUgRDIgMUYgNzEgXAorIDIzIDUyIDAwIDEyIDdDIDg1IDA1IEQyIDA1IDcxIDJEIDUyIDAwIDNBIDY4IDMyIFwKKyAwMCA5NyA3NSAzQiAxMiBBMCBGRSA3RiAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NyBcCisgMTIgQkEgRkUgN0YgMDIgMEEgNTAgMTIgQkEgRkUgN0YgOTUgNzUgNTkgODUgMTIgXAorIEEwIEZFIDdGIDk1IDc1IEE4IDg1IDc3IDlBIDEyIEEwIEZFIDdGIDk1IDc1IDYzIFwKKyA4NSA3NyBBMSAxNiA3QyBEQSAwMiA3MSBBMSA3NyBBOCAzMiAwNSA5NyA3MSA3NiBcCisgMDYgN0QgRDIgMDEgNzEgOUEgMDYgN0YgNjcgOTMgNzUgOUEgMzIgMDIgOTcgNzEgXAorIDlBIDMyIDAzIDk3IDcxIEE4IDMyIDA0IDk3IDc1IEExIDA2IDdFIEQyIDA3IDcxIFwKKyBBMSA3NyBBOCAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyBcCisgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIgkJIyBzZGs1NjA1LmhleAorCitpZiAkP3A0OCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIDdGIDY3IDQzIDY3IDNDIDY3IDM1IDY3IDJGIDA2IDdGIDgwIEQyIFwKKyAxOCA3NCAwMSAyOCA2MCA3RiA2NyA5QiA2NyA4OSA2NyBCRiA2NyA4MyA2NyAzQyBcCisgNjcgNzMgNjcgNjggNjcgNUQgMDYgN0YgODAgRDIgMUEgNzQgMTMgM0EgNzAgNjcgXAorIEFEIDcxIEMzIDc3IEJGIDMyIDAzIDk3IDcxIEMzIDc3IEJGIDMyIDA1IDk3IDcxIFwKKyBDMyA3NyBCRiAxMiBCQSBGRSA3RiAzMiAwMSA5NyA3NSA0RiAwMiAwNiA1MCAzMiBcCisgMDAgOTcgNzUgNTcgMDIgMDYgNTAgOTUgNzUgQzMgODUgNzcgQkYgNjcgQUQgNzUgXAorIEJGIDMyIDA0IDk3IDcxIEMzIDc3IEJGIDY3IEFEIDc1IEJGIDMyIDAzIDk3IDcxIFwKKyBDMyA3NyBCRiA2NyBBRCA3NSBCRiAzMiAwMyA5NyA3MSBCRiAzMiAwNCA5NyA3MSBcCisgQkYgNzcgQzMgNjcgQjYgNzEgQzMgNzcgQkYgMTIgQTAgRkUgN0YgMzIgMDAgOTcgXAorIDc1IDk1IDAyIDA2IDUwIDk1IDc1IEMzIDg1IDc3IEJGIDEyIEJBIEZFIDdGIDMyIFwKKyAwMSA5NyA3NSBBNyAwMiAwNiA1MCA5NSA3NSBDMyA4NSA3NyBCRiAwNiA3RiAxMiBcCisgODAgRjggMTUgMUEgMDAgNTcgMDYgN0YgMTIgODAgRjggMTUgMUEgMDcgNTcgMzIgXAorIDBGIDg3IDU3IDMyIDBFIDg3IDU3JyIJCQkJCSMgcDQ4LmhleAorCitpZiAkP2hlcmMgJiYgISQ/YmxhY2tfa25pZ2h0ICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDEgNjcgMzYgMjkgMzIgMDggRDcgODcgMzIgMDcgRDcgODcgMzIgMDEgRDcgXAorIDg3IDMyIDAwIEQ3IDg3IDgwIEQyIDA5IDc0IDAyIDg2IDdGIDA2IDdGIEMyIDA3IFwKKyA3NCAyNCA4NiA3RSAxNiA3RSBDQSAwNyBFMCAxNyAwRCAxMiAwOCA5OCAyNyBENyBcCisgODcgOTEgNzQgMkQgM0EgMjggMTAgREEgMDcgNzUgM0UgRkEgMDIgNTcgRUEgMDYgXAorIDU3JyIJCQkJCQkJIyBzZGs1NjcwLmhleAorCitpZiAkP2hlcmMgJiYgJD9ibGFja19rbmlnaHQgImxvY2FsIGxlZGNvZGUgJ1wKKyAyQSAwMyAzMiAwOCBENyA4NyAzMiAwNyBENyA4NyAzMiAwMSBENyA4NyAzMiAwMCBcCisgRDcgODcgMkEgMDYgMzIgMDggRDcgODcgMzIgMDcgRDcgODcgMzIgMDEgRDcgODcgXAorIDMyIDAwIEQ3IDg3IDNBIDA4JyIJCQkJCSMga25pZ2dldC5oZXgKKworaWYgJD9kcmFjX2FueSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEMzIDY3IDRFIDY3IDhBIDA2IEMzIDgwIEQyIDBDIDc0IDAxIDI4IFwKKyA2MCBDMyAzMiAwMCBENyA4NyAzMiAwMSBENyA4NyAzMiAwNyBENyA4NyAzMiAwOCBcCisgRDcgODcgMzIgMEYgODcgMzIgMEYgODcgMzIgMEYgODcgMzIgMEYgODcgMTIgQzIgXAorIDg1IDA1IEQyIDBGIDcxIDM4IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIDQyIFwKKyA1MiAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSA0QyA1MiAwMCAzQSAzOCAzMiAwMCBcCisgOTcgNzUgNUEgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNjYgMTIgXAorIEFEIEZFIEMzIDAyIDBBIDUwIDEyIEFEIEZFIEMzIDk1IDc1IDc4IDg1IDEyIEEwIFwKKyBGRSBDMyA5NSA3NSBDMCA4NSA3NyBCOSAxMiBBMCBGRSBDMyA5NSA3NSA4MiA4NSBcCisgNzcgQzcgMTYgQzAgREEgMDIgNzEgQzcgNzcgQzAgMzIgMDUgOTcgNzEgOUEgMzIgXAorIDAyIDk3IDcxIEI5IDA2IEMxIEQyIDAxIDcxIEI5IDA2IEMzIDY3IEIyIDc1IEI5IFwKKyAzMiAwMyA5NyA3MSBDMCAzMiAwNCA5NyA3NSBDNyAwNiBDMiBEMiAwNyA3MSBDNyBcCisgNzcgQzAgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgXAorIDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIJCSMgc2RrNTY5MC5oZXgKKworaWYgJD9kcmFjb19rMTIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwQiBBMiAwMSAyOCBBMiAwMSA2MCBDMyA2NyAzMiA2NyA2RSAwNiBDMyA5MCBcCisgNzUgMDIgMTIgQzIgODUgMDUgRDIgMEYgNzEgMUMgNTIgMDAgMTIgQzEgODUgMDUgXAorIEQyIDFGIDcxIDI2IDUyIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDMwIDUyIDAwIFwKKyAzQSAzMCAzMiAwMCA5NyA3NSAzRSAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSBcCisgOTcgNzUgNEEgMTIgQUMgRkUgQzMgMDIgMEEgNTAgMTIgQUMgRkUgQzMgOTUgNzUgXAorIDVDIDg1IDEyIEEwIEZFIEMzIDk1IDc1IEE2IDg1IDc3IDlGIDEyIEEwIEZFIEMzIFwKKyA5NSA3NSA2NiA4NSA3NyBBRCAxNiBDMCBEQSAwMiA3MSBBRCA3NyBBNiAzMiAwNSBcCisgOTcgNzEgN0UgMzIgMDIgOTcgNzEgOUYgMDYgQzEgRDIgMDEgNzEgOUYgMDYgQzMgXAorIDY3IDk2IDc1IDlGIDMyIDAzIDk3IDcxIEE2IDMyIDA0IDk3IDc1IEFEIDA2IEMyIFwKKyBEMiAwNyA3MSBBRCA3NyBBNiAxMiA4MCBBMiAwMSBGOCAxNSAxQSAwMCA1NyAzMiBcCisgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgXAorIDMyIDBFIDg3IDU3JyIJCQkJCQkjIGsxMi01NjkwLmhleAorCitpZiAkP2hlcmMgJiYgJD93aGl0ZV9rbmlnaHQgImxvY2FsIGxlZGNvZGUgJ1wKKyAyQSAwMyA2NyAwQSAyQSAwNiA2NyAwQSAzQSAwOCAzMiAwOCBENyA4NyAzMiAwNyBcCisgRDcgODcgMzIgMDEgRDcgODcgMzIgMDAgRDcgODcgNTcnIgkJCSMgd2s1NjcwLmhleAorCitpZiAkP2hlcmMgJiYgJD9tZXJsaW4gImxvY2FsIGxlZGNvZGUgJ1wKKyAyQSAwMyA2NyAwQSAyQSAwNiA2NyAwQSAzQSAwOCAzMiAwOCBENyA4NyAzMiAwMCBcCisgRDcgODcgMzIgMDEgRDcgODcgMzIgMDcgRDcgODcgNTcnIgkJCSMgbWVybGluNTY3MC5oZXgKKworaWYgJD9oZXJjICYmICQ/bGFuY2Vsb3QgImxvY2FsIGxlZGNvZGUgJ1wKKyAyQSAwNSA2NyAxMiAyQSAwNiA2NyAxMiAyQSAwMyA2NyAxMiAyQSAwNCA2NyAxMiBcCisgM0EgMTAgMzIgMDggRDcgODcgMzIgMDAgRDcgODcgMzIgMDEgRDcgODcgMzIgMDcgXAorIEQ3IDg3IDU3JyIJCQkJCQkjIGxhbmNlbG90LmhleAorCitpZiAkP3hnc19mYWJyaWMgJiYgJD9ndWVuZXZlcmUgImxvY2FsIGxlZGNvZGUgJ1wKKyAyQSAwNCA2NyAwQSAyQSAwNSA2NyAwQSAzQSAwNCAzMiAwNyBENyA4NyAzMiAwMCBcCisgMzIgMDEgQjcgRDcgODcgNTcnIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZ3VlbmV2ZXJlNTY3MC5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP3doaXRlX2tuaWdodCAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEMzIDY3IDJmIDY3IDZCIDA2IEMzIDgwIEQyIDBDIDc0IDAxIDEyIFwKKyBDMiA4NSAwNSBEMiAwRiA3MSAxOSA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiA3MSBcCisgMjMgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgMkQgNTIgMDAgM0EgMzAgMzIgXAorIDAwIDk3IDc1IDNCIDEyIEEwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDQ3IFwKKyAxMiBBQyBGRSBDMyAwMiAwQSA1MCAxMiBBQyBGRSBDMyA5NSA3NSA1OSA4NSAxMiBcCisgQTAgRkUgQzMgOTUgNzUgQTggODUgNzcgOUEgMTIgQTAgRkUgQzMgOTUgNzUgNjMgXAorIDg1IDc3IEExIDE2IEMwIERBIDAyIDcxIEExIDc3IEE4IDMyIDA1IDk3IDcxIDdCIFwKKyAzMiAwMiA5NyA3MSA5QSAwNiBDMSBEMiAwMSA3MSA5QSAwNiBDMyA2NyA5MyA3NSBcCisgOUEgMzIgMDMgOTcgNzEgQTggMzIgMDQgOTcgNzUgQTEgMDYgQzIgRDIgMDcgNzEgXAorIEExIDc3IEE4IDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IFwKKyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciCQkjIHdrNTY5MC5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP21lcmxpbiAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEMzIDY3IDJGIDY3IDZCIDA2IEMzIDgwIEQyIDBDIDc0IDAxIDEyIFwKKyBDMiA4NSAwNSBEMiAwRiA3MSAxOSA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiA3MSBcCisgMjMgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgMkQgNTIgMDAgM0EgMzAgMzIgXAorIDAwIDk3IDc1IDNCIDEyIEEwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IDQ3IFwKKyAxMiBBQyBGRSBDMyAwMiAwQSA1MCAxMiBBQyBGRSBDMyA5NSA3NSA1OSA4NSAxMiBcCisgQTAgRkUgQzMgOTUgNzUgQTggODUgNzcgOUEgMTIgQTAgRkUgQzMgOTUgNzUgNjMgXAorIDg1IDc3IEExIDE2IEMwIERBIDAyIDcxIEExIDc3IEE4IDMyIDA1IDk3IDcxIDdCIFwKKyAzMiAwMiA5NyA3MSA5QSAwNiBDMSBEMiAwMSA3MSA5QSAwNiBDMyA2NyA5MyA3NSBcCisgOUEgMzIgMDMgOTcgNzEgQTggMzIgMDQgOTcgNzUgQTEgMDYgQzIgRDIgMDcgNzEgXAorIEExIDc3IEE4IDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IFwKKyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyciCQkjIG1lcmxpbjU2OTAuaGV4CisKK2lmICQ/ZHJhY19hbnkgJiYgJD9nYWxhaGFkICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgMkYgNjcgNkIgMDYgQzMgODAgRDIgMEMgNzQgMDEgMTIgXAorIEMyIDg1IDA1IEQyIDBGIDcxIDE5IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIFwKKyAyMyA1MiAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAyRCA1MiAwMCAzQSAzMCAzMiBcCisgMDAgOTcgNzUgM0IgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDcgXAorIDEyIEFDIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDU5IDg1IDEyIFwKKyBBMCBGRSBDMyA5NSA3NSBBOCA4NSA3NyA5QSAxMiBBMCBGRSBDMyA5NSA3NSA2MyBcCisgODUgNzcgQTEgMTYgQzAgREEgMDIgNzEgQTEgNzcgQTggMzIgMDUgOTcgNzEgN0IgXAorIDMyIDAyIDk3IDcxIDlBIDA2IEMxIEQyIDAxIDcxIDlBIDA2IEMzIDY3IDkzIDc1IFwKKyA5QSAzMiAwMyA5NyA3MSBBOCAzMiAwNCA5NyA3NSBBMSAwNiBDMiBEMiAwNyA3MSBcCisgQTEgNzcgQTggMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgXAorIDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3JyIJCSMgZ2FsYWhhZC5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP2xtICJsb2NhbCBsZWRjb2RlICdcCitFMCAyOCA2MCBDMyA2NyAyRCAwNiBDMyA4MCBEMiAwQyA3NCAwMSAxMiBDMiA4NSBcCiswNSBEMiAwRiA3MSAxNyA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiA3MSAyMSA1MiBcCiswMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAyQiA1MiAwMCAzQSAxOCAzMiAwMCA5NyBcCis3NSAzOSAxMiBBMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA0NSAxMiBBQyBcCitGRSBDMyAwMiAwQSA1MCAxMiBBQyBGRSBDMyA5NSA3NSA1RiA4NSAxMiBBMCBGRSBcCitDMyA5NSA3MSA1QyAxNiBDMCBEQSAwMiA3MSBBNiA3NyBCNCA4NSA3NyA3NyAxMiBcCitBMCBGRSBDMyA5NSA3NSA2RiA4NSAxNiBDMCBEQSAwMiA3MSBBNiA3NyBBRCAxNiBcCitDMCBEQSAwMiA3MSBBRCA3NyBCNCAzMiAwNSA5NyA3MSA4MiAwNiBDMSBEMiAwMSBcCis3MSBBNiAwNiBDMyA2NyA5RiA3NSBBNiAzMiAwMiA5NyA3MSBBNiAzMiAwMyA5NyBcCis3MSBCNCAzMiAwNCA5NyA3NSBBRCAwNiBDMiBEMiAwNyA3MSBBRCA3NyBCNCAxMiBcCis4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyBcCiszMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICAgICAgIyBsbTU2OTAuaGV4CisKK2lmICQ/dHdvbHlueCAibG9jYWwgbGVkY29kZSAnXAorIDJBIDAxIDY3IDBBIDJBIDAwIDY3IDBBIDNBIDA4IDMyIDA4IEQ3IDg3IDMyIDAwIFwKKyBENyA4NyAzMiAwMSBENyA4NyAzMiAwNyBENyA4NyA1NyciICAgICAgICAgICAgICAgICAjIHR3b2x5bnguaGV4CisKK2lmICQ/bHlueF9hbnkgJiYgJD9oZXJjdWx5bnggfHwgJD9seW54YWxvdCB8fCAkP2xtIHx8ICQ/Z3VlbmV2ZXJlIFwKKwkibG9jYWwgbGVkY29kZSAnXAorMTIgQzAgODUgMDUgRDIgMDMgNzEgMEEgNTIgMDAgMkEgMDAgNjcgMTAgM0EgMDQgXAorMzIgMDggRDcgODcgMDYgQzAgRDIgMDEgNzEgMjIgMzIgMEYgODcgMzIgMEYgODcgXAorNzcgMkEgMzIgMDAgRDcgODcgMzIgMDEgRDcgODcgMzIgMDcgRDcgODcgNTcnIiAgICAgICMgaGVyY3VseW54LmhleAorCitpZiAkP3R1Y2FuYSAmJiAhJD9tYWdudW0gImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCA2NyAyMyBEMiAxOCA3NCAwMSAwMiAyMCA2NyAyMyBEMiAzOCA3NCAwOSAwMiBcCisgMTggNjcgMjMgRDIgMUMgNzQgMTEgRTkgMDIgODAgNDUgODAgODEgREEgMEQgNzQgXAorIDFBIDNBIDY4IDI4IDYwIEUzIDY3IDRBIDY3IDM2IDA2IEU0IDMwIDg3IDA2IEU1IFwKKyAzMCA4NyAwNiBFMyA4MCA1NyAzMiAwMCA5NyA3MSA0NSAzMiAwMSA5NyA3MSA0NSBcCisgMDIgMEYgNjAgRTUgNTcgMDIgMEUgNjAgRTUgNTcgMDYgRTMgMTIgQTAgRjggMTUgXAorIDFBIDAwIDc1IDU5IDAyIDBFIDYwIEU0IDU3IDAyIDBGIDYwIEU0IDU3JyIgICAgICAgICMgc2RrNTY2NS5oZXgKKworaWYgJD9tYWdudW0gJiYgISQ/dHVjMjRfcmVmICYmICEkP0JDTTU2NTBfQzAgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBGQyA2NyA1QSA2NyA5QyAwNiBGQSA2NyBEQSAwNiBGQiA2NyBEQSBcCisgMDYgRkMgODAgRDIgMUMgNzQgMDEgMTIgRkQgODUgMDUgRDIgMEYgNzEgMjEgNTIgXAorIDAwIDEyIEZFIDg1IDA1IEQyIDFGIDcxIDJCIDUyIDAwIDEyIEZGIDg1IDA1IEQyIFwKKyAwNSA3MSAzNSA1MiAwMCBFOSAwNSA5OCA5OCA5OCA5OCBDMiAwRiA2MCBGOSAwNSBcCisgODggODggODggODggQzIgRjAgQjYgRjkgNTAgODEgREEgMEMgNzQgMzYgRTkgMDIgXAorIDgwIDQ1IDgwIDgxIERBIDBFIDc0IDUxIDNBIDcwIDMyIDAwIDk3IDc1IDY2IDEyIFwKKyBDMCBGRSBGQyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA3MiAxMiBEQyBGRSBGQyAwMiBcCisgMEEgNTAgMTIgREMgRkUgRkMgOTUgNzUgODYgODUgMTIgQzAgRkUgRkMgOTUgMDIgXAorIEZBIDc1IEQ3IDg1IDc3IEQxIDEyIEMwIEZFIEZDIDk1IDc1IDkyIDg1IDAyIEZBIFwKKyA3NyBENCAxNiBGRiBEQSAwMiAwMiBGQSA3MSBENCA3NyBENyAzMiAwNSA5NyA3MSBcCisgQTkgMDYgRkUgRDIgMDEgMDIgRkIgNzEgRDEgMDYgRkMgNjcgQ0EgMDIgRkIgNzUgXAorIEQxIDMyIDAyIDk3IDcxIEQxIDMyIDAzIDk3IDcxIEQ3IDMyIDA0IDk3IDc1IEQ0IFwKKyAwNiBGRCBEMiAwNyAwMiBGQiA3MSBENCA3NyBENyAxMiBBMCBGOCAxNSAxQSAwMCBcCisgNTcgNDIgMDAgNTcgNDIgMDEgNTcgNDIgMDIgNTcgRDIgMDIgNzQgRTMgMzIgMEYgXAorIDg3IDc3IEU2IDMyIDBFIDg3IEQyIDAxIDc0IEVFIDMyIDBGIDg3IDU3IDMyIDBFIFwKKyA4NyA1NyciICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNkazU2NjUuaGV4CisKK2lmICQ/bWFnbnVtICYmICEkP3R1YzI0X3JlZiAmJiAkP0JDTTU2NTBfQzAgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCA2MCBGQiBEMiAxOCA3NSAwOSBBMiAwMSA2MCBGQyAyOCA2NyAzNyA2NyA3MyBcCisgMDYgRkIgODAgRDIgMUMgNzQgMDEgMTIgRkQgODUgMDUgRDIgMEYgNzEgMjEgNTIgXAorIDAwIDEyIEZFIDg1IDA1IEQyIDFGIDcxIDJCIDUyIDAwIDEyIEZGIDg1IDA1IEQyIFwKKyAwNSA3MSAzNSA1MiAwMCAzQSA3MCAzMiAwMCA5NyA3NSA0MyAxMiBDMCBGRSBGQyBcCisgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNEYgMTIgREMgRkUgRkMgMDIgMEEgNTAgMTIgXAorIERDIEZFIEZDIDk1IDc1IDYxIDg1IDEyIEMwIEZFIEZDIDk1IDc1IEIwIDg1IDc3IFwKKyBBMiAxMiBDMCBGRSBGQyA5NSA3NSA2QiA4NSA3NyBBOSAxNiBGRiBEQSAwMiA3MSBcCisgQTkgNzcgQjAgMzIgMDUgOTcgNzEgN0UgMDYgRkUgRDIgMDEgNzEgQTIgMDYgRkMgXAorIDY3IDlCIDc1IEEyIDMyIDAyIDk3IDcxIEEyIDMyIDAzIDk3IDcxIEIwIDMyIDA0IFwKKyA5NyA3NSBBOSAwNiBGRCBEMiAwNyA3MSBBOSA3NyBCMCAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEYgODcgMzIgMEYgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgXAorIDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtYWdudW1fc2RrLmhleAorCitpZiAkP3R1YzI0X3JlZiAmJiAkP0JDTTU2NTBfQzAgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCA2MCBGQiBEMiAxOCA3MSAxMCA2MCBGQyAyOCA2NyBEMCA2NyBDMCA3NyAxOSBcCisgQTIgMDEgNjAgRkMgMjggNjcgNDAgNjcgN0MgMDYgRkIgODAgRDIgMUMgNzQgMDEgXAorIDEyIEZEIDg1IDA1IEQyIDBGIDcxIDJBIDUyIDAwIDEyIEZFIDg1IDA1IEQyIDFGIFwKKyA3MSAzNCA1MiAwMCAxMiBGRiA4NSAwNSBEMiAwNSA3MSAzRSA1MiAwMCAzQSA2OCBcCisgMzIgMDAgOTcgNzUgNEMgMTIgQzAgRkUgRkMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgXAorIDU4IDEyIERDIEZFIEZDIDAyIDBBIDUwIDEyIERDIEZFIEZDIDk1IDc1IDZBIDg1IFwKKyAxMiBDMCBGRSBGQyA5NSA3NSBCOSA4NSA3NyBBQiAxMiBDMCBGRSBGQyA5NSA3NSBcCisgNzQgODUgNzcgQjIgMTYgRkYgREEgMDIgNzEgQjIgNzcgQjkgMzIgMDUgOTcgNzEgXAorIDg3IDA2IEZFIEQyIDAxIDcxIEFCIDA2IEZDIDY3IEE0IDc1IEFCIDMyIDAyIDk3IFwKKyA3MSBBQiAzMiAwMyA5NyA3MSBCOSAzMiAwNCA5NyA3NSBCMiAwNiBGRCBEMiAwNyBcCisgNzEgQjIgNzcgQjkgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgMzIgMEYgXAorIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3IFwKKyAwMiAwRSAzMiAwMCA5NyA3MSBDRCAzMiAwMSA5NyA3MSBDRCA4MCAzMCA4NyA1NyBcCisgMDYgRkMgMTIgQTAgRjggMTUgMUEgMDAgMDIgMEYgNzUgREQgOTAgMzAgODcgNTcnIiAgIyBtYWdudW0uaGV4CisKK2lmICQ/dHVjMjRfcmVmICYmICEkP0JDTTU2NTBfQzAgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBGQyBEMiAxOCA3MSAwRSA2NyBFOSA2NyBEOSA3NyAxQSA2NyA1QSBcCisgNjcgOUMgMDYgRkEgNjcgRDAgMDYgRkIgNjcgRDAgMDYgRkMgODAgRDIgMUMgNzQgXAorIDAxIDEyIEZFIDg1IDA1IEQyIDFGIDcxIDJCIDUyIDAwIDEyIEZGIDg1IDA1IEQyIFwKKyAwNSA3MSAzNSA1MiAwMCBFOSAwNSA5OCA5OCA5OCA5OCBDMiAwRiA2MCBGOSAwNSBcCisgODggODggODggODggQzIgRjAgQjYgRjkgNTAgODEgREEgMEMgNzQgMzYgRTkgMDIgXAorIDgwIDQ1IDgwIDgxIERBIDBEIDc0IDUxIDNBIDY4IDMyIDAwIDk3IDc1IDY2IDEyIFwKKyBDMCBGRSBGQyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA3MiAxMiBEQyBGRSBGQyAwMiBcCisgMEEgNTAgMTIgREMgRkUgRkMgOTUgNzUgODYgODUgMTIgQzAgRkUgRkMgOTUgMDIgXAorIEZBIDc1IENEIDg1IDc3IEM3IDEyIEMwIEZFIEZDIDk1IDc1IDkyIDg1IDAyIEZBIFwKKyA3NyBDQSAxNiBGRiBEQSAwMiAwMiBGQSA3MSBDQSA3NyBDRCAzMiAwNSA5NyA3MSBcCisgQTkgMDYgRkUgRDIgMDEgMDIgRkIgNzEgQzcgMDYgRkMgNjcgQzAgMDIgRkIgNzUgXAorIEM3IDMyIDAyIDk3IDcxIEM3IDMyIDAzIDk3IDcxIENEIDMyIDA0IDk3IDc1IENBIFwKKyAxMiBBMCBGOCAxNSAxQSAwMCA1NyA0MiBGRiA1NyA0MiBGRSA1NyA0MiBFRiA1NyBcCisgMzAgODcgOTggOTggOTggOTggMzAgODcgNTcgMDIgMEUgMzIgMDAgOTcgNzEgRTYgXAorIDMyIDAxIDk3IDcxIEU2IDgwIDMwIDg3IDU3IDA2IEZDIDEyIEEwIEY4IDE1IDFBIFwKKyAwMCAwMiAwRiA3NSBGNiA5MCAzMCA4NyA1NyciICAgICAgICAgICAgICAgICAgICAgICAjIHR1YzI0X3JlZi5oZXgKKworaWYgJD9oZXJjOF8xNSAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAxIDI4IDMyIDA4IEQ3IDg3IDMyIDA3IEQ3IDg3IDMyIDAxIEQ3IDg3IDMyIFwKKyAwMCBENyA4NyA4MCBEMiAwOSA3NCAwMiA4NiA3RiAwNiA3RiBDMiAwNyA3NCAyMiBcCisgODYgN0UgMTYgN0UgQ0EgMDcgRTAgMTcgMEQgMTIgMDggOTggMjcgRDcgODcgOTEgXAorIDc0IDJCIDNBIDI4JyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2RrNTY3NS5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP2xtICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgMkQgMDYgQzMgODAgRDIgMEMgNzQgMDEgMTIgQzIgODUgXAorIDA1IEQyIDBGIDcxIDE3IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIDIxIDUyIFwKKyAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAyQiA1MiAwMCAzQSAxOCAzMiAwMCA5NyBcCisgNzUgMzkgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDUgMTIgQUMgXAorIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDVGIDg1IDEyIEEwIEZFIFwKKyBDMyA5NSA3MSA1QyAxNiBDMCBEQSAwMiA3MSBBNiA3NyBCNCA4NSA3NyA3NyAxMiBcCisgQTAgRkUgQzMgOTUgNzUgNkYgODUgMTYgQzAgREEgMDIgNzEgQTYgNzcgQUQgMTYgXAorIEMwIERBIDAyIDcxIEFEIDc3IEI0IDMyIDA1IDk3IDcxIDgyIDA2IEMxIEQyIDAxIFwKKyA3MSBBNiAwNiBDMyA2NyA5RiA3NSBBNiAzMiAwMiA5NyA3MSBBNiAzMiAwMyA5NyBcCisgNzEgQjQgMzIgMDQgOTcgNzUgQUQgMDYgQzIgRDIgMDcgNzEgQUQgNzcgQjQgMTIgXAorIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IFwKKyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCciICAjIGxtNTY5MC5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP2xtNDhwICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgQzMgNjcgN0MgMDYgQzMgODAgMjggNjAgQzMgNjcgN0MgNjcgNDAgXAorIDA2IEMzIDkwIDI4IDYwIEMzIDY3IDQwIDA2IEMzIDgwIDgwIEQyIDBDIDc0IDAxIFwKKyAxMiBDMiA4NSAwNSBEMiAwRiA3MSAyQSA1MiAwMCAxMiBDMSA4NSAwNSBEMiAxRiBcCisgNzEgMzQgNTIgMDAgMTIgQzAgODUgMDUgRDIgMDUgNzEgM0UgNTIgMDAgM0EgMzAgXAorIDMyIDAwIDk3IDc1IDRDIDEyIEEwIEZFIEMzIDAyIDBBIDUwIDMyIDAxIDk3IDc1IFwKKyA1OCAxMiBBQyBGRSBDMyAwMiAwQSA1MCAxMiBBQyBGRSBDMyA5NSA3NSA2QSA4NSBcCisgMTIgQTAgRkUgQzMgOTUgNzUgQjkgODUgNzcgQUIgMTIgQTAgRkUgQzMgOTUgNzUgXAorIDc0IDg1IDc3IEIyIDE2IEMwIERBIDAyIDcxIEIyIDc3IEI5IDMyIDA1IDk3IDcxIFwKKyA4QyAzMiAwMiA5NyA3MSBBQiAwNiBDMSBEMiAwMSA3MSBBQiAwNiBDMyA2NyBBNCBcCisgNzUgQUIgMzIgMDMgOTcgNzEgQjkgMzIgMDQgOTcgNzUgQjIgMDYgQzIgRDIgMDcgXAorIDcxIEIyIDc3IEI5IDEyIDgwIEY4IDE1IDFBIDAwIDU3IDMyIDBFIDg3IDMyIDBFIFwKKyA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAzMiAwRiA4NyAzMiAwRSA4NyA1NyciICAjIGxtNDhwNTY5NS5oZXgKKworaWYgJD9kcmFjX2FueSAmJiAkP2xtNDhwX0IgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBDMyA2NyA3OSAwNiBDMyA2NyAzRCAwNiBDMyA4MCAyOCA2MCBDMyBcCisgNjcgM0QgMDYgQzMgNjcgNzkgMDYgQzMgODAgRDIgMEMgNzQgMDEgMTIgQzIgODUgXAorIDA1IEQyIDBGIDcxIDI3IDUyIDAwIDEyIEMxIDg1IDA1IEQyIDFGIDcxIDMxIDUyIFwKKyAwMCAxMiBDMCA4NSAwNSBEMiAwNSA3MSAzQiA1MiAwMCAzQSAzMCAzMiAwMCA5NyBcCisgNzUgNDkgMTIgQTAgRkUgQzMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNTUgMTIgQUMgXAorIEZFIEMzIDAyIDBBIDUwIDEyIEFDIEZFIEMzIDk1IDc1IDY3IDg1IDEyIEEwIEZFIFwKKyBDMyA5NSA3NSBCNiA4NSA3NyBBOCAxMiBBMCBGRSBDMyA5NSA3NSA3MSA4NSA3NyBcCisgQUYgMTYgQzAgREEgMDIgNzEgQUYgNzcgQjYgMzIgMDUgOTcgNzEgODkgMzIgMDIgXAorIDk3IDcxIEE4IDA2IEMxIEQyIDAxIDcxIEE4IDA2IEMzIDY3IEExIDc1IEE4IDMyIFwKKyAwMyA5NyA3MSBCNiAzMiAwNCA5NyA3NSBBRiAwNiBDMiBEMiAwNyA3MSBBRiA3NyBcCisgQjYgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgXAorIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgICMgbG00OHA1Njk1XzEwLmhleAorCitpZiAkP2ZpcmVib2x0X2FueSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDU1IDY3IDkxIDA2IEUzIDgwIDI4IDYwIEUzIDY3IDkxIFwKKyA2NyA1NSAwNiBFMyA4MCBEMiAxOCA3NCAwMSAyOCA2MCBFMyA2NyBCOSA3NSAyNiBcCisgNjcgQ0UgNjcgNTUgNzcgMkUgMzIgMEUgODcgMzIgMDggODcgNjcgQzAgMDYgRTMgXAorIDgwIEQyIDFDIDc0IDE5IDEyIEUyIDg1IDA1IEQyIDBGIDcxIDNGIDUyIDAwIDEyIFwKKyBFMSA4NSAwNSBEMiAxRiA3MSA0OSA1MiAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSBcCisgNTMgNTIgMDAgM0EgNzAgMzIgMDAgOTcgNzUgNjEgMTIgQTAgRkUgRTMgMDIgMEEgXAorIDUwIDMyIDAxIDk3IDc1IDZEIDEyIEJDIEZFIEUzIDAyIDBBIDUwIDEyIEJDIEZFIFwKKyBFMyA5NSA3NSA3RiA4NSAxMiBBMCBGRSBFMyA5NSA3NSBDRSA4NSA3NyBDMCAxMiBcCisgQTAgRkUgRTMgOTUgNzUgODkgODUgNzcgQzcgMTYgRTAgREEgMDIgNzEgQzcgNzcgXAorIENFIDMyIDA1IDk3IDcxIEExIDMyIDAyIDk3IDcxIEMwIDA2IEUxIEQyIDAxIDcxIFwKKyBDMCAwNiBFMyA2NyBCOSA3NSBDMCAzMiAwMyA5NyA3MSBDRSAzMiAwNCA5NyA3NSBcCisgQzcgMDYgRTIgRDIgMDcgNzEgQzcgNzcgQ0UgMTIgODAgRjggMTUgMUEgMDAgNTcgXAorIDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIFwKKyA4NyAzMiAwRSA4NyA1NyciICAjIHNkazU2NTA0LmhleAorCisjTGVkIHByb2dyYW0gZm9yIG5ldyByZXYgb2YgRkIgU0RLIGFuZCBSZWYgZGVzaWduCitpZiAkP2ZpcmVib2x0X2FueSAmJiAhJD9mYjI0ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNEIgNjcgODcgMDYgRTMgODAgRDIgMTggNzQgMDEgMjggXAorIDYwIEUzIDY3IEFGIDc1IDFDIDY3IEM0IDY3IDRCIDc3IDI0IDMyIDBFIDg3IDMyIFwKKyAwOCA4NyA2NyBCNiAwNiBFMyA4MCBEMiAxQyA3NCAwRiAxMiBFMiA4NSAwNSBEMiBcCisgMEYgNzEgMzUgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgM0YgNTIgMDAgMTIgXAorIEUwIDg1IDA1IEQyIDA1IDcxIDQ5IDUyIDAwIDNBIDcwIDMyIDAwIDk3IDc1IDU3IFwKKyAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA2MyAxMiBCQyBGRSBFMyBcCisgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgNzUgODUgMTIgQTAgRkUgRTMgOTUgXAorIDc1IEM0IDg1IDc3IEI2IDEyIEEwIEZFIEUzIDk1IDc1IDdGIDg1IDc3IEJEIDE2IFwKKyBFMCBEQSAwMiA3MSBCRCA3NyBDNCAzMiAwNSA5NyA3MSA5NyAzMiAwMiA5NyA3MSBcCisgQjYgMDYgRTEgRDIgMDEgNzEgQjYgMDYgRTMgNjcgQUYgNzUgQjYgMzIgMDMgOTcgXAorIDcxIEM0IDMyIDA0IDk3IDc1IEJEIDA2IEUyIEQyIDA3IDcxIEJEIDc3IEM0IDEyIFwKKyA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyBcCisgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjIHNkazU2NTA0cmVmLmhleAorCisjT3ZlcnJpZGUgRGVmYXVsdCBGaXJlYm9sdCBMRUQgcHJvZ3JhbSBmb3IgTGluZSBNb2R1bGUKK2lmICQ/bG0gJiYgJD9maXJlYm9sdF9hbnkgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyA3OSAwNiBFMyA2NyAzRCAwNiBFMyA4MCAyOCA2MCBFMyBcCisgNjcgM0QgMDYgRTMgNjcgNzkgMDYgRTMgODAgRDIgMTggNzQgMDEgMTIgRTIgODUgXAorIDA1IEQyIDBGIDcxIDI3IDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIDMxIDUyIFwKKyAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSAzQiA1MiAwMCAzQSA2MCAzMiAwMCA5NyBcCisgNzUgNDkgMTIgQTAgRkUgRTMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNTUgMTIgQkMgXAorIEZFIEUzIDAyIDBBIDUwIDEyIEJDIEZFIEUzIDk1IDc1IDY3IDg1IDEyIEEwIEZFIFwKKyBFMyA5NSA3NSBCNiA4NSA3NyBBOCAxMiBBMCBGRSBFMyA5NSA3NSA3MSA4NSA3NyBcCisgQUYgMTYgRTAgREEgMDIgNzEgQUYgNzcgQjYgMzIgMDUgOTcgNzEgODkgMzIgMDIgXAorIDk3IDcxIEE4IDA2IEUxIEQyIDAxIDcxIEE4IDA2IEUzIDY3IEExIDc1IEE4IDMyIFwKKyAwMyA5NyA3MSBCNiAzMiAwNCA5NyA3NSBBRiAwNiBFMiBEMiAwNyA3MSBBRiA3NyBcCisgQjYgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgXAorIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgIyBsbTQ4cDU2NTA0LmhleAorCisjT3ZlcnJpZGUgRGVmYXVsdCBGaXJlYm9sdCBMRUQgcHJvZ3JhbSBmb3IgTGluZSBNb2R1bGUgLTUwIHZlcnNpb24KK2lmICQ/bG0gJiYgJD9sbTQ4cF9EICYmICQ/ZmlyZWJvbHRfYW55ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNkQgMDYgRTMgNjcgMzEgMDYgRTMgODAgRDIgMTggNzQgXAorIDAxIDEyIEUyIDg1IDA1IEQyIDBGIDcxIDFCIDUyIDAwIDEyIEUxIDg1IDA1IEQyIFwKKyAxRiA3MSAyNSA1MiAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSAyRiA1MiAwMCAzQSBcCisgNjAgMzIgMDAgOTcgNzUgM0QgMTIgQTAgRkUgRTMgMDIgMEEgNTAgMzIgMDEgOTcgXAorIDc1IDQ5IDEyIEJDIEZFIEUzIDAyIDBBIDUwIDEyIEJDIEZFIEUzIDk1IDc1IDVCIFwKKyA4NSAxMiBBMCBGRSBFMyA5NSA3NSBBQSA4NSA3NyA5QyAxMiBBMCBGRSBFMyA5NSBcCisgNzUgNjUgODUgNzcgQTMgMTYgRTAgREEgMDIgNzEgQTMgNzcgQUEgMzIgMDUgOTcgXAorIDcxIDdEIDMyIDAyIDk3IDcxIDlDIDA2IEUxIEQyIDAxIDcxIDlDIDA2IEUzIDY3IFwKKyA5NSA3NSA5QyAzMiAwMyA5NyA3MSBBQSAzMiAwNCA5NyA3NSBBMyAwNiBFMiBEMiBcCisgMDcgNzEgQTMgNzcgQUEgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgXAorIDBFIDg3IDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IFwKKyA1NyciICMgbG00OHA1NjUwNF81MC5oZXgKKworaWYgJD9sbSAmJiAkP2ZpcmVib2x0XzEweDQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxOCAyOCAzMiAwNyA2NyAxRSA3NSAwQSBENyA4NyAzMiAwMSBENyA4NyAzMiBcCisgMDAgRDcgODcgMzIgMDggRDcgODcgODAgRDIgMUMgNzQgMDIgM0EgMEMgMTIgODAgXAorIEY4IDE1IDFBIDAwIDU3ICciICMgbG0xMnBjeDQ1NjUwMS5oZXgKKworaWYgJD9mYnBvZSAmJiAkP2ZpcmVib2x0X2FueSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDg1IDY3IDQ5IDA2IEUzIDgwIEQyIDE4IDc0IDAxIDI4IFwKKyA2MCBFMyA2NyBBRCA3NSAxQSA2NyBDMiA3NyAyMCAzMiAwRSA4NyAzMiAwOCA4NyBcCisgNjcgNDkgMDYgRTMgODAgRDIgMUEgNzQgMEYgMTIgRTIgODUgMDUgRDIgMEYgNzEgXAorIDMzIDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIDNEIDUyIDAwIDEyIEUwIDg1IFwKKyAwNSBEMiAwNSA3MSA0NyA1MiAwMCAzQSA2OCAzMiAwMCA5NyA3NSA1NSAxMiBBMCBcCisgRkUgRTMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNjEgMTIgQkEgRkUgRTMgMDIgMEEgXAorIDUwIDEyIEJBIEZFIEUzIDk1IDc1IDczIDg1IDEyIEEwIEZFIEUzIDk1IDc1IEMyIFwKKyA4NSA3NyBCNCAxMiBBMCBGRSBFMyA5NSA3NSA3RCA4NSA3NyBCQiAxNiBFMCBEQSBcCisgMDIgNzEgQkIgNzcgQzIgMzIgMDUgOTcgNzEgOTUgMzIgMDIgOTcgNzEgQjQgMDYgXAorIEUxIEQyIDAxIDcxIEI0IDA2IEUzIDY3IEFEIDc1IEI0IDMyIDAzIDk3IDcxIEMyIFwKKyAzMiAwNCA5NyA3NSBCQiAwNiBFMiBEMiAwNyA3MSBCQiA3NyBDMiAxMiA4MCBGOCBcCisgMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgXAorIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgIyBwb2U0OHA1NjUwNC5oZXgKKworI092ZXJyaWRlIERlZmF1bHQgRmlyZWJvbHQgTEVEIHByb2dyYW0gZm9yIGZlbGl4CitpZiAkP2ZlbGl4IHx8ICQ/ZmVsaXgxNSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDZCIDY3IEE3IDA2IEUzIDgwIEQyIDE4IDc0IDAxIDAyIFwKKyAxOCAyOCA2MCBFMyA2NyA0OSAwMiAxOSAyOCA2MCBFMyA2NyA0OSAzMiAwRSA4NyBcCisgMzIgMEUgODcgMzIgMEUgODcgMzIgMEUgODcgMTIgRTIgODUgMDUgRDIgMEYgNzEgXAorIDMzIDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIDNEIDUyIDAwIDEyIEUwIDg1IFwKKyAwNSBEMiAwNSA3MSA0NyA1MiAwMCAzQSA2OCA2NyBDRiA3NSA1MiAzMiAwRSA4NyBcCisgNzcgNTUgMzIgMEYgODcgMzIgMDAgOTcgNzUgNUUgMzIgMEUgODcgNTcgMzIgMDEgXAorIDk3IDc1IDY3IDMyIDBFIDg3IDU3IDMyIDBGIDg3IDU3IDMyIDAwIDk3IDc1IDc3IFwKKyAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA4MyAxMiBCQyBGRSBFMyBcCisgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgOTUgODUgMTIgQTAgRkUgRTMgOTUgXAorIDc1IEU0IDg1IDc3IEQ2IDEyIEEwIEZFIEUzIDk1IDc1IDlGIDg1IDc3IEREIDE2IFwKKyBFMCBEQSAwMiA3MSBERCA3NyBFNCAzMiAwNSA5NyA3MSBCNyAzMiAwMiA5NyA3MSBcCisgRDYgMDYgRTEgRDIgMDEgNzEgRDYgMDYgRTMgNjcgQ0YgNzUgRDYgMzIgMDMgOTcgXAorIDcxIEU0IDMyIDA0IDk3IDc1IEREIDA2IEUyIEQyIDA3IDcxIEREIDc3IEU0IDEyIFwKKyA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyBcCisgMzIgMEYgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcnIiAgIyBzZGs1NjEwMi5oZXgKKworI092ZXJyaWRlIERlZmF1bHQgRmVsaXggTEVEIHByb2dyYW0gZm9yIGZlbGl4NDgKK2lmICQ/ZmVsaXg0OCAmJiAkP2ZlbGl4IHx8ICQ/ZmVsaXgxNSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDZCIDY3IEE3IDA2IEUzIDgwIEQyIDE4IDc0IDAxIDAyIFwKKyAxOCAyOCA2MCBFMyA2NyA0OSAwMiAxOSAyOCA2MCBFMyA2NyA0OSAzMiAwRSA4NyBcCisgMzIgMEUgODcgMzIgMEUgODcgMzIgMEUgODcgMTIgRTIgODUgMDUgRDIgMEYgNzEgXAorIDMzIDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIDNEIDUyIDAwIDEyIEUwIDg1IFwKKyAwNSBEMiAwNSA3MSA0NyA1MiAwMCAzQSA2OCA2NyBDRiA3NSA1MiAzMiAwRSA4NyBcCisgNzcgNTUgMzIgMEYgODcgMzIgMDAgOTcgNzUgNUUgMzIgMEUgODcgNTcgMzIgMDEgXAorIDk3IDc1IDY3IDMyIDBFIDg3IDU3IDMyIDBGIDg3IDU3IDMyIDAwIDk3IDc1IDc3IFwKKyAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA4MyAxMiBCQyBGRSBFMyBcCisgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgOTUgODUgMTIgQTAgRkUgRTMgOTUgXAorIDc1IEU0IDg1IDc3IEQ2IDEyIEEwIEZFIEUzIDk1IDc1IDlGIDg1IDc3IEREIDE2IFwKKyBFMCBEQSAwMiA3MSBERCA3NyBFNCAzMiAwNSA5NyA3MSBCNyAzMiAwMiA5NyA3MSBcCisgRDYgMDYgRTEgRDIgMDEgNzEgRDYgMDYgRTMgNjcgQ0YgNzUgRDYgMzIgMDMgOTcgXAorIDcxIEU0IDMyIDA0IDk3IDc1IEREIDA2IEUyIEQyIDA3IDcxIEREIDc3IEU0IDEyIFwKKyA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyBcCisgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAgIyBmZWxpeDQ4LmhleAorCitpZiAkP2Vhc3lyaWRlcl9hbnkgImxvY2FsIGxlZGNvZGUgJ1wKKyBFMCAyOCA2MCBFMyA2NyA1OSA2NyA5NSAwNiBFMyA4MCAyOCA2MCBFMyA2NyA5NSBcCisgNjcgNTkgMDYgRTMgODAgRDIgMEMgNzQgMDEgMjggNjAgRTMgNjcgQkQgNzUgMjYgXAorIDY3IEQyIDY3IDU5IDc3IDJFIDMyIDBFIDg3IDMyIDA4IDg3IDY3IEM0IDA2IEUzIFwKKyA4MCBEMiAwRCA3NCAxOSAxMiBFMiA4NSAwNSBEMiAwRiA3MSAzRiA1MiAwMCAxMiBcCisgRTEgODUgMDUgRDIgMUYgNzEgNDkgNTIgMDAgMTIgRTAgODUgMDUgRDIgMDUgNzEgXAorIDUzIDUyIDAwIDY3IEM0IDY3IEM0IDNBIDM4IDMyIDAwIDk3IDc1IDY1IDEyIEEwIFwKKyBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA3MSAxMiBBRCBGRSBFMyAwMiAwQSBcCisgNTAgMTIgQUQgRkUgRTMgOTUgNzUgODMgODUgMTIgQTAgRkUgRTMgOTUgNzUgRDIgXAorIDg1IDc3IEM0IDEyIEEwIEZFIEUzIDk1IDc1IDhEIDg1IDc3IENCIDE2IEUwIERBIFwKKyAwMiA3MSBDQiA3NyBEMiAzMiAwNSA5NyA3MSBBNSAzMiAwMiA5NyA3MSBDNCAwNiBcCisgRTEgRDIgMDEgNzEgQzQgMDYgRTMgNjcgQkQgNzUgQzQgMzIgMDMgOTcgNzEgRDIgXAorIDMyIDA0IDk3IDc1IENCIDA2IEUyIEQyIDA3IDcxIENCIDc3IEQyIDEyIDgwIEY4IFwKKyAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiBcCisgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAgICMgc2RrNTY2MDEuaGV4CisKKyNPdmVycmlkZSBEZWZhdWx0IEVhc3lyaWRlciBMRUQgcHJvZ3JhbSBmb3IgNTY2MDIKK2lmICQ/ZWFzeXJpZGVyXzF4MSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDYwIEUxIDY3IDdDIDY3IDdDIDA2IEUxIDgwIEQyIDBDIDc0IDAxIDAyIDBDIFwKKyAyOCA2MCBFMSA2NyA3NSA3NSAxRCA2NyA4QSA2NyAzOSA3NyAyNSAzMiAwRSA4NyBcCisgMzIgMDggODcgNjcgN0MgMDYgRTEgRDIgMDAgMDIgMDAgNzQgMTAgMTIgRTAgODUgXAorIDA1IEQyIDA1IDcxIDM3IDUyIDAwIDNBIDM4IDMyIDAwIDk3IDc1IDQ1IDEyIEEwIFwKKyBGRSBFMSAwMiAwQSA1MCAzMiAwMSA5NyA3NSA1MSAxMiBBRCBGRSBFMSAwMiAwQSBcCisgNTAgMTIgQUQgRkUgRTEgOTUgNzUgNjMgODUgMTIgQTAgRkUgRTEgOTUgNzUgOEEgXAorIDg1IDc3IDdDIDEyIEEwIEZFIEUxIDk1IDc1IDZEIDg1IDc3IDgzIDE2IEUwIERBIFwKKyAwMiA3MSA4MyA3NyA4QSAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiBcCisgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgXAorIDU3JyIgICAjIHNkazU2NjAyLmhleAorCisjT3ZlcnJpZGUgRGVmYXVsdCAgTEVEIHByb2dyYW0gZm9yIDUzMzAwCitpZiAkP21pcmFnZTI0ICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgNkIgNjcgMkYgMDYgRTMgODAgRDIgMTggNzQgMDEgMTIgXAorIEUyIDg1IDA1IEQyIDBGIDcxIDE5IDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIFwKKyAyMyA1MiAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSAyRCA1MiAwMCAzQSAzMCAzMiBcCisgMDAgOTcgNzUgM0IgMTIgQTAgRkUgRTMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDcgXAorIDEyIEJDIEZFIEUzIDAyIDBBIDUwIDEyIEJDIEZFIEUzIDk1IDc1IDU5IDg1IDEyIFwKKyBBMCBGRSBFMyA5NSA3NSBBMiA4NSA3NyA5QSAxMiBBMCBGRSBFMyA5NSA3NSA2MyBcCisgODUgNzcgOUUgMTYgRTAgREEgMDIgNzEgOUUgNzcgQTIgMzIgMDUgOTcgNzEgN0IgXAorIDMyIDAyIDk3IDcxIDlBIDA2IEUxIEQyIDAxIDcxIDlBIDA2IEUzIDY3IDkzIDc1IFwKKyA5QSAzMiAwMyA5NyA3MSBBMiAzMiAwNCA5NyA3NSA5RSAwNiBFMiBEMiAwNyA3MSBcCisgOUUgNzcgQTIgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgXAorIDg3IDU3IDMyIDBFIDg3IDU3JyIgICMgc2RrNTMzMDAuaGV4CisKKyNPdmVycmlkZSBEZWZhdWx0IExFRCBwcm9ncmFtIGZvciA1NjMxNAoraWYgJD9iY201NjMxNHAyNHJlZiAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEUzIDY3IDc5IDY3IDNEIDA2IEUzIDgwIEQyIDE4IDc0IDAxIDI4IFwKKyA2MCBFMyA2NyA3OSA2NyBBOCAwNiBFMyA4MCBEMiAxQyA3NCAwRiAxMiBFMiA4NSBcCisgMDUgRDIgMEYgNzEgMjcgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgMzEgNTIgXAorIDAwIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDNCIDUyIDAwIDNBIDM4IDMyIDAwIDk3IFwKKyA3NSA0OSAxMiBBMCBGRSBFMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA1NSAxMiBCQyBcCisgRkUgRTMgMDIgMEEgNTAgMTIgQkMgRkUgRTMgOTUgNzUgNjcgODUgMTIgQTAgRkUgXAorIEUzIDk1IDc1IEIwIDg1IDc3IEE4IDEyIEEwIEZFIEUzIDk1IDc1IDcxIDg1IDc3IFwKKyBBQyAxNiBFMCBEQSAwMiA3MSBBQyA3NyBCMCAzMiAwNSA5NyA3MSA4OSAzMiAwMiBcCisgOTcgNzEgQTggMDYgRTEgRDIgMDEgNzEgQTggMDYgRTMgNjcgQTEgNzUgQTggMzIgXAorIDAzIDk3IDcxIEIwIDMyIDA0IDk3IDc1IEFDIDA2IEUyIEQyIDA3IDcxIEFDIDc3IFwKKyBCMCAxMiA4MCBGOCAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyBcCisgMzIgMEUgODcgNTcnIiAgIyBiY205NTYzMTRwMjRyZWYuaGV4CisKK2lmICQ/YnJhZGxleSAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEYyIDY3IDFCIDA2IEYyIDgwIEQyIDE0IDc0IDAxIDg2IEYzIDEyIFwKKyBGMCA4NSAwNSBEMiAwNSA3MSAxOSA1MiAwMCAzQSAyOCAzMiAwMCA5NyA3NSAyNyBcCisgMTIgQTggRkUgRjIgMDIgMEEgNTAgMzIgMDEgOTcgNzUgMzMgMTIgQkMgRkUgRjIgXAorIDAyIDBBIDUwIDEyIEJDIEZFIEYyIDk1IDc1IDQ1IDg1IDEyIEE4IEZFIEYyIDk1IFwKKyA3NSA5MSA4NSA3NyA1NyAxMiBBOCBGRSBGMiA5NSA3NSA0RiA4NSA3NyA4QSAxNiBcCisgRjAgREEgMDIgNzEgOEEgNzcgOTEgMDYgRjIgMTIgOTQgRjggMTUgMDIgMDIgQzEgXAorIDc0IDZFIDAyIDA0IEMxIDc0IDZFIDAyIDA4IEMxIDc0IDZFIDc3IDc0IEM2IEYzIFwKKyA3NCA5MSA3NyA4QSAwNiBGMiA2NyA3QyA3NSA4MyA3NyA5MSAxMiA4MCBGOCAxNSBcCisgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgXAorIDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgICAgICMgc2RrNTY4MDAuaGV4CisKK2lmICQ/aHVtdiAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEYyIDY3IDIxIDA2IEYyIDgwIEQyIDA4IDc0IDBGIEYyIDAyIEQyIFwKKyAxMiA3NCAwMSA4NiBGMyAxMiBGMCA4NSAwNSBEMiAwNSA3MSAxRiA1MiAwMCAzQSBcCisgMjAgMzIgMDAgOTcgNzUgMkQgMTIgQTggRkUgRjIgMDIgMEEgNTAgMzIgMDEgOTcgXAorIDc1IDM5IDEyIEJBIEZFIEYyIDAyIDBBIDUwIDEyIEJBIEZFIEYyIDk1IDc1IDRCIFwKKyA4NSAxMiBBOCBGRSBGMiA5NSA3NSA5NyA4NSA3NyA1RCAxMiBBOCBGRSBGMiA5NSBcCisgNzUgNTUgODUgNzcgOTAgMTYgRjAgREEgMDIgNzEgOTAgNzcgOTcgMDYgRjIgMTIgXAorIDk0IEY4IDE1IDAyIDAyIEMxIDc0IDc0IDAyIDA0IEMxIDc0IDc0IDAyIDA4IEMxIFwKKyA3NCA3NCA3NyA3QSBDNiBGMyA3NCA5NyA3NyA5MCAwNiBGMiA2NyA4MiA3NSA4OSBcCisgNzcgOTcgMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgXAorIDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3JyIgIyBzZGs1NjcwMC5oZXgKKworaWYgJD9icmFkbGV5XzFnICJsb2NhbCBsZWRjb2RlICdcCisgRTAgMjggNjAgRTMgNjcgMkYgNjcgNkIgMDYgRTMgODAgRDIgMTQgNzQgMDEgMTIgXAorIEUyIDg1IDA1IEQyIDBGIDcxIDE5IDUyIDAwIDEyIEUxIDg1IDA1IEQyIDFGIDcxIFwKKyAyMyA1MiAwMCAxMiBFMCA4NSAwNSBEMiAwNSA3MSAyRCA1MiAwMCAzQSA1MCAzMiBcCisgMDAgOTcgNzUgM0IgMTIgQTAgRkUgRTMgMDIgMEEgNTAgMzIgMDEgOTcgNzUgNDcgXAorIDEyIEI0IEZFIEUzIDAyIDBBIDUwIDEyIEI0IEZFIEUzIDk1IDc1IDU5IDg1IDEyIFwKKyBBMCBGRSBFMyA5NSA3NSBBOCA4NSA3NyA5QSAxMiBBMCBGRSBFMyA5NSA3NSA2MyBcCisgODUgNzcgQTEgMTYgRTAgREEgMDIgNzEgQTEgNzcgQTggMzIgMDUgOTcgNzEgN0IgXAorIDMyIDAyIDk3IDcxIDlBIDA2IEUxIEQyIDAxIDcxIDlBIDA2IEUzIDY3IDkzIDc1IFwKKyA5QSAzMiAwMyA5NyA3MSBBOCAzMiAwNCA5NyA3NSBBMSAwNiBFMiBEMiAwNyA3MSBcCisgQTEgNzcgQTggMTIgODAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgXAorIDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3ICciICAjIHNkazU2ODAwYy5oZXgKKworaWYgJD9nb2xkd2luZyAibG9jYWwgbGVkY29kZSAnXAorIEUwIDI4IDYwIEYzIEQyIDEwIDc1IDBFIDY3IDNCIDY3IDk0IDc3IDEyIDY3IDk0IFwKKyA2NyAzQiAwNiBGMyA4MCBEMiAxNCA3NCAwMSA4NiBGNCAxMiBGMiA4NSAwNSBEMiBcCisgMEYgNzEgMjUgNTIgMDAgMTIgRjEgODUgMDUgRDIgMUYgNzEgMkYgNTIgMDAgMTIgXAorIEYwIDg1IDA1IEQyIDA1IDcxIDM5IDUyIDAwIDNBIDUwIDMyIDAwIDk3IDc1IDQ3IFwKKyAxMiBBOCBGRSBGMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSA1MyAxMiBCQyBGRSBGMyBcCisgMDIgMEEgNTAgMTIgQkMgRkUgRjMgOTUgNzUgNjUgODUgMTIgQTggRkUgRjMgOTUgXAorIDc1IEMwIDg1IDc3IDc3IDEyIEE4IEZFIEYzIDk1IDc1IDZGIDg1IDc3IEI5IDE2IFwKKyBGMCBEQSAwMiA3MSBCOSA3NyBDMCAwNiBGMyAxMiA5NCBGOCAxNSAwMiAwMiBDMSBcCisgNzQgOEUgMDIgMDQgQzEgNzQgOEUgMDIgMDggQzEgNzQgOEUgNzcgQjIgQzYgRjQgXAorIDc0IEMwIDc3IEI5IDA2IEYzIDY3IEFCIDc1IEIyIDMyIDA0IDc1IEIyIDMyIDAzIFwKKyA5NyA3MSBDMCAwNiBGMiBEMiAwNyA3MSBCOSA3NyBDMCAxMiA4MCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgXAorIDMyIDBGIDg3IDMyIDBFIDg3IDU3ICciICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNkazU2NTgwLmhleAorCitpZiAkP2h1bXYgJiYgJD9sbSAibG9jYWwgbGVkY29kZSAnXAorIDAyIDA0IDI4IEQyIDA4IDc0IDBBIEYyIDAyIDI4IDMyIDA3IDY3IDI5IDc1IDExIFwKKyBENyA4NyA2MCBFNCA2NyAzMCAwNiBFNCA2MCBFNCA2NyA0QyAwNiBFNCAzMiAwOCBcCisgRDcgODcgODAgRDIgMTIgNzQgMDIgM0EgMzAgMTIgODAgRjggMTUgMUEgMDAgNTcgXAorIDA2IEU0IDEyIDk0IEY4IDE1IDAyIDEwIEMxIDcwIDQyIDEyIEQyIEZFIEU0IDAyIFwKKyAwQSA1MCAxMiBEMiBGRSBFNCA5NSA3NSA2RCA4NSA3NyA2OCAwNiBFNCAxMiA5NCBcCisgRjggMTUgMDIgMjAgQzEgNzAgNUUgMTIgQzAgRkUgRTQgMDIgMEEgNTAgMTIgQzAgXAorIEZFIEU0IDk1IDc1IDZEIDg1IDc3IDY4IDMyIDBFIEQ3IDg3IDU3IDMyIDBGIEQ3IFwKKyA4NyA1NyAnIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsbTEycDU2ODAyLmhleAorCisKK2lmICQ/cmFwdG9yICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDYgMjggNjAgRkYgNjcgNjQgNjcgOTMgMDYgRkYgODAgRDIgMzYgNzQgMDIgXAorIDAyIDA0IDI4IDYwIEZGIDY3IEJCIDc1IDFFIDMyIDBFIDg3IDc3IDIxIDMyIDBGIFwKKyA4NyA2NyA3RCAwNiBGRiA4MCBEMiAwNiA3NCAxMiAwMiAwMSAyOCA2MCBGRiA2NyBcCisgQkIgNzUgMzggMzIgMEUgODcgNzcgM0IgMzIgMEYgODcgNjcgN0QgMDYgRkYgODAgXAorIEQyIDAzIDc0IDJDIDEyIEZFIDg1IDA1IEQyIDBGIDcxIDRFIDUyIDAwIDEyIEZEIFwKKyA4NSAwNSBEMiAxRiA3MSA1OCA1MiAwMCAxMiBGQyA4NSAwNSBEMiAwNSA3MSA2MiBcCisgNTIgMDAgM0EgQzggMzIgMDEgOTcgNzUgNzYgMzIgMDAgOTcgNzUgQzkgMTYgRkMgXAorIERBIDAyIDcxIEM5IDc3IEQwIDMyIDAwIDk3IDc1IEMyIDc3IEQwIDMyIDAwIDk3IFwKKyA3NSA4NiAzMiAwRSA4NyA1NyAzMiAwMSA5NyA3NSA4RiAzMiAwRSA4NyA1NyAzMiBcCisgMEYgODcgNTcgMzIgMDUgOTcgNzEgQTMgMzIgMDIgOTcgNzEgQzIgMDYgRkQgRDIgXAorIDAxIDcxIEMyIDA2IEZGIDY3IEJCIDc1IEMyIDMyIDAzIDk3IDcxIEQwIDMyIDA0IFwKKyA5NyA3NSBDOSAwNiBGRSBEMiAwNyA3MSBDOSA3NyBEMCAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgXAorIDMyIDBGIDg3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgIyBzZGs1NjAxOC5oZXgKKworaWYgJD9yYXB0b3IgJiYgJD9yYXAyNF9yZWYgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwNiA2MCBFMSA2NyA0OCA2NyAzMSAwNiBFMSA4MCBEMiAxRSA3MSAwMiAwMiBcCisgMDUgNjAgRTEgNjcgNDggNjcgMzEgMDYgRTEgOTAgRDIgMDMgNzQgMTEgMDIgMDIgXAorIDYwIEUxIDY3IDQ4IDY3IDMxIDA2IEUxIDkwIEQyIDAwIDc0IDIwIDg2IEUwIDNBIFwKKyAzOCAwNiBFMSA2NyA1MCA3NSA1NyAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA1NyBcCisgMTYgRTAgQ0EgMDUgNzQgNUIgNzcgNTcgMDYgRTEgNjcgNTAgNzUgNTcgNzcgNUIgXAorIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDAwJyIgIyBzZGs1NjIxNC5oZXgKKworaWYgJD9yYXZlbl9lYl80OHAgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwNiAyOCA2MCBDMyA2NyAzMCA2NyA2QyAwNiBDMyA4MCBEMiAxRSA3NCAwMiBcCisgMTIgQzIgODUgMDUgRDIgMEYgNzEgMUEgNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgXAorIDcxIDI0IDUyIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDJFIDUyIDAwIDNBIDYwIFwKKyAzMiAwMCA5NyA3NSAzQyAxMiBDMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSBcCisgNDggMTIgRTAgRkUgQzMgMDIgMEEgNTAgMTIgRTAgRkUgQzMgOTUgNzUgNUEgODUgXAorIDEyIEMwIEZFIEMzIDk1IDc1IEE5IDg1IDc3IDlCIDEyIEMwIEZFIEMzIDk1IDc1IFwKKyA2NCA4NSA3NyBBMiAxNiBDMCBEQSAwMiA3MSBBMiA3NyBBOSAzMiAwNSA5NyA3MSBcCisgN0MgMzIgMDIgOTcgNzEgOUIgMDYgQzEgRDIgMDEgNzEgOUIgMDYgQzMgNjcgOTQgXAorIDc1IDlCIDMyIDAzIDk3IDcxIEE5IDMyIDA0IDk3IDc1IEEyIDA2IEMyIEQyIDA3IFwKKyA3MSBBMiA3NyBBOSAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSBcCisgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjYmNtOTU2MDI0cDQ4cmVmLmhleAorCitpZiAkP0JDTTk1NjAyNFI1MFQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwNiAyOCA2MCBDMyA2NyAzMCA2NyA2QyAwNiBDMyA4MCBEMiAxRSA3NCAwMiBcCisgMTIgQzIgODUgMDUgRDIgMEYgNzEgMUEgNTIgMDAgMTIgQzEgODUgMDUgRDIgMUYgXAorIDcxIDI0IDUyIDAwIDEyIEMwIDg1IDA1IEQyIDA1IDcxIDJFIDUyIDAwIDNBIDYwIFwKKyAzMiAwMCA5NyA3NSAzQyAxMiBDMCBGRSBDMyAwMiAwQSA1MCAzMiAwMSA5NyA3NSBcCisgNDggMTIgRTAgRkUgQzMgMDIgMEEgNTAgMTIgRTAgRkUgQzMgOTUgNzUgNUEgODUgXAorIDEyIEMwIEZFIEMzIDk1IDc1IEE5IDg1IDc3IDlCIDEyIEMwIEZFIEMzIDk1IDc1IFwKKyA2NCA4NSA3NyBBMiAxNiBDMCBEQSAwMiA3MSBBMiA3NyBBOSAzMiAwNSA5NyA3NSBcCisgN0MgMzIgMDIgOTcgNzEgOUIgMDYgQzEgRDIgMDEgNzEgOUIgMDYgQzMgNjcgOTQgXAorIDc1IDlCIDMyIDAzIDk3IDcxIEE5IDMyIDA0IDk3IDc1IEEyIDA2IEMyIEQyIDA3IFwKKyA3MSBBMiA3NyBBOSAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiAwRSBcCisgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcnIiAjYmNtOTU2MDI0cjUwdC5oZXgKKworaWYgJD9zY29ycGlvbiB8fCAkP2NvbnF1ZXJvciAibG9jYWwgbGVkY29kZSAnXAorIDAyIDE4IDI4IDYwIEUxIDY3IDEyIDA2IEUxIDkwIEQyIDAwIDc0IDAyIDg2IEUwIFwKKyAzQSAxOCA2NyAyRCA3NSAzNCAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSAzOCAxNiBcCisgRTAgQ0EgMDUgNzQgMzggNzcgMzQgNjcgMkQgNzUgMzQgNzcgMzggMTIgQTAgRjggXAorIDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIFwKKyAwMCAwMCAwMCciICNzZGs1NjgyMC5oZXgKKworaWYgJD9zY29ycGlvbiAmJiAkP0JDTTk1NjgyMFIyNFhHICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDEgMjggNjcgRDAgMDIgMDIgMjggNjcgRDYgNjcgRDAgMDIgMDEgMjggNjcgXAorIEQ2IDAyIDA0IDI4IDY3IEQwIDAyIDAzIDI4IDY3IEQ2IDY3IEQwIDAyIDA0IDI4IFwKKyA2NyBENiAwMiAwNSAyOCA2NyBEMCAwMiAwNiAyOCA2NyBENiA2NyBEMCAwMiAwNSBcCisgMjggNjcgRDYgMDIgMDcgMjggNjcgRDAgMDIgMDggMjggNjcgRDYgNjcgRDAgMDIgXAorIDA3IDI4IDY3IEQ2IDAyIDA5IDI4IDY3IEQwIDAyIDBBIDI4IDY3IEQ2IDY3IEQwIFwKKyAwMiAwOSAyOCA2NyBENiAwMiAwQyAyOCA2NyBEMCAwMiAwQiAyOCA2NyBENiA2NyBcCisgRDAgMDIgMEMgMjggNjcgRDYgMDIgMEQgMjggNjcgRDAgMDIgMEUgMjggNjcgRDYgXAorIDY3IEQwIDAyIDBEIDI4IDY3IEQ2IDAyIDBGIDI4IDY3IEQwIDAyIDEwIDI4IDY3IFwKKyBENiA2NyBEMCAwMiAwRiAyOCA2NyBENiAwMiAxMSAyOCA2NyBEMCAwMiAxMiAyOCBcCisgNjcgRDYgNjcgRDAgMDIgMTEgMjggNjcgRDYgMDIgMTQgMjggNjcgRDAgMDIgMTMgXAorIDI4IDY3IEQ2IDY3IEQwIDAyIDE0IDI4IDY3IEQ2IDAyIDE1IDI4IDY3IEQwIDAyIFwKKyAxNiAyOCA2NyBENiA2NyBEMCAwMiAxNSAyOCA2NyBENiAwMiAxNyAyOCA2NyBEMCBcCisgMDIgMTggMjggNjcgRDYgNjcgRDAgMDIgMTcgMjggNjcgRDYgODYgRTAgM0EgMzAgXAorIDY3IEYxIDc1IEY4IDc3IEZDIDY3IEYxIDc1IEY4IDI4IDMyIDAwIDMyIDAxIEI3IFwKKyA5NyA3NSBGOCAxNiBFMCBDQSAwNSA3NCBGQyA3NyBGOCA2NyBGMSA3NSBGOCA3NyBcCisgRkMgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgXAorICciICNiY205NTY4MjByMjR4Zy5oZXgKKworaWYgJD92YWxreXJpZSAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAyIDY3IEE5IDY3IDk0IDAyIDAzIDY3IEE5IDY3IDk0IDAyIDA1IDY3IEE5IFwKKyA2NyA5NCAwMiAwNCA2NyBBOSA2NyA5NCAwMiAwNiA2NyBBOSA2NyA5NCAwMiAwNyBcCisgNjcgQTkgNjcgOTQgMDIgMTIgNjcgQTkgNjcgOTQgMDIgMTMgNjcgQTkgNjcgOTQgXAorIDAyIDBFIDY3IEE5IDY3IDk0IDAyIDBGIDY3IEE5IDY3IDk0IDAyIDExIDY3IEE5IFwKKyA2NyA5NCAwMiAxMCA2NyBBOSA2NyA5NCAwMiAxQSA2NyBBOSA2NyA5NCAwMiAyMCBcCisgNjcgQTkgNjcgOTQgMDIgMjEgNjcgQTkgNjcgOTQgMDIgMjIgNjcgQTkgNjcgOTQgXAorIDAyIDIzIDY3IEE5IDY3IDk0IDAyIDI0IDY3IEE5IDY3IDk0IDAyIDJGIDY3IEE5IFwKKyA2NyA5NCAwMiAyRSA2NyBBOSA2NyA5NCAwMiAxQiA2NyBBOSA2NyA5NCAwMiAyQiBcCisgNjcgQTkgNjcgOTQgMDIgMkMgNjcgQTkgNjcgOTQgMDIgMkQgNjcgQTkgNjcgOTQgXAorIDg2IEUwIDNBIDMwIDY3IEFGIDc1IEI2IDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IFwKKyBCNiAxNiBFMCBDQSAwNSA3NCBCQSA3NyBCNiA2NyBBRiA3NSBCNiA3NyBCQSAxMiBcCisgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgXAorIDAwJyIgI3NkazU2NjgwLmhleAorCitpZiAkP3ZhbGt5cmllMiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFFIDY3IEE5IDY3IDk0IDAyIDFGIDY3IEE5IDY3IDk0IDAyIDIxIDY3IEE5IFwKKyA2NyA5NCAwMiAyMCA2NyBBOSA2NyA5NCAwMiAyMiA2NyBBOSA2NyA5NCAwMiAyMyBcCisgNjcgQTkgNjcgOTQgMDIgMjQgNjcgQTkgNjcgOTQgMDIgMjUgNjcgQTkgNjcgOTQgXAorIDAyIDI2IDY3IEE5IDY3IDk0IDAyIDI3IDY3IEE5IDY3IDk0IDAyIDI5IDY3IEE5IFwKKyA2NyA5NCAwMiAyOCA2NyBBOSA2NyA5NCAwMiAyQSA2NyBBOSA2NyA5NCAwMiAyQiBcCisgNjcgQTkgNjcgOTQgMDIgMkMgNjcgQTkgNjcgOTQgMDIgMkQgNjcgQTkgNjcgOTQgXAorIDAyIDJFIDY3IEE5IDY3IDk0IDAyIDJGIDY3IEE5IDY3IDk0IDAyIDMxIDY3IEE5IFwKKyA2NyA5NCAwMiAzMCA2NyBBOSA2NyA5NCAwMiAzMiA2NyBBOSA2NyA5NCAwMiAzMyBcCisgNjcgQTkgNjcgOTQgMDIgMzQgNjcgQTkgNjcgOTQgMDIgMzUgNjcgQTkgNjcgOTQgXAorIDg2IEUwIDNBIDMwIDY3IEFGIDc1IEI2IDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IFwKKyBCNiAxNiBFMCBDQSAwNSA3NCBCQSA3NyBCNiA2NyBBRiA3NSBCNiA3NyBCQSAxMiBcCisgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgXAorIDAwJyIgI3NkazU2Njg1LmhleAorCitpZiAkP2hhd2tleWVfcDI0ICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDEgMjggNjAgRTMgNjcgNDMgNjcgMUMgMDYgRTMgODAgRDIgMTkgNzQgMDIgXAorIDEyIEUwIDg1IDA1IEQyIDAzIDcxIDFBIDUyIDAwIDNBIDYwIDMyIDAwIDMyIDAxIFwKKyBCNyA5NyA3NSAyQiAxMiBFNCBGRSBFMyAwMiAwMSA1MCAxMiBFNCBGRSBFMyA5NSBcCisgNzUgM0IgODUgMDYgRTMgNjcgNTUgNzUgNkEgNzcgNUMgMTYgRTAgREEgMDEgNzEgXAorIDZBIDc3IDVDIDA2IEUzIDY3IDU1IDc1IDZBIDMyIDAzIDk3IDcxIDVDIDMyIDA0IFwKKyA5NyA3NSA2QSA3NyA2MyAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRSA4NyAzMiBcCisgMEYgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgNTcgMzIgMEYgODcgMzIgMEYgODcgXAorIDU3JyIgICNiY205NTMzMTRwMjRyZWYuaGV4CisKK2lmICQ/aGF3a2V5ZV9rMjQgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMSAyOCA2MCBFMSA2NyAzRCA2NyAxQyAwNiBFMSA4MCBEMiAxOSA3NCAwMiBcCisgMTIgRTAgODUgMDUgRDIgMDUgNzEgMUEgNTIgMDAgM0EgMzAgMzIgMDAgMzIgMDEgXAorIEI3IDk3IDc1IDJCIDEyIEUyIEZFIEUxIDAyIDBBIDUwIDEyIEUyIEZFIEUxIDk1IFwKKyA3NSAzNSA4NSA3NyA1MCAxNiBFMCBEQSAwMiA3MSA0QyA3NyA1MCAwNiBFMSA2NyBcCisgNDUgNzUgNTAgNzcgNEMgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEUgODcgNTcgXAorIDMyIDBGIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI2JjbTk1MzMxNGsyNC5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYyNCIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxQyAyOCA2NyAxOCAwMiAxRCAyOCA2NyAxOCAwMiAxRSAyOCA2NyAxOCAwMiBcCisgMUYgMjggNjcgMTggODYgRTAgM0EgMDggNjcgM0IgNzUgMjAgNjcgNDYgNzcgMjQgXAorIDY3IDQyIDc3IDQyIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDQyIDE2IEUwIENBIFwKKyAwNSA3NCA0NiA3NyA0MiA2NyAzQiA3NSA0MiA3NyA0NiAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MjQuaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MjYiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMUEgMjggNjcgMjIgMDIgMUIgMjggNjcgMjIgMDIgMUMgMjggNjcgMjIgMDIgXAorIDFEIDI4IDY3IDIyIDAyIDFFIDI4IDY3IDIyIDAyIDFGIDI4IDY3IDIyIDg2IEUwIFwKKyAzQSAwOCA2NyAzRCA3NSA0NCAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA0OCAxNiBcCisgRTAgQ0EgMDUgNzQgNDggNzcgNDQgNjcgM0QgNzUgNDQgNzcgNDggMTIgQTAgRjggXAorIDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwJyIgI3NkazU2NjI2LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjI4IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAyIDI4IDY3IDJDIDAyIDBFIDI4IDY3IDJDIDAyIDFBIDI4IDY3IDJDIDAyIFwKKyAxQiAyOCA2NyAyQyAwMiAxQyAyOCA2NyAyQyAwMiAxRCAyOCA2NyAyQyAwMiAxRSBcCisgMjggNjcgMkMgMDIgMUYgMjggNjcgMkMgODYgRTAgM0EgMDggNjcgNDcgNzUgNEUgXAorIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDUyIDE2IEUwIENBIDA1IDc0IDUyIDc3IFwKKyA0RSA2NyA0NyA3NSA0RSA3NyA1MiAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiBcCisgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MjguaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MjkiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDIgMjggNjcgMkMgMDIgMEUgMjggNjcgMkMgMDIgMUEgMjggNjcgMkMgMDIgXAorIDFCIDI4IDY3IDJDIDAyIDFDIDI4IDY3IDJDIDAyIDFEIDI4IDY3IDJDIDAyIDFFIFwKKyAyOCA2NyAyQyAwMiAxRiAyOCA2NyAyQyA4NiBFMCAzQSAwOCA2NyA0NyA3NSA0RSBcCisgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNTIgMTYgRTAgQ0EgMDUgNzQgNTIgNzcgXAorIDRFIDY3IDQ3IDc1IDRFIDc3IDUyIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIFwKKyA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjYyOS5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYzNCIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxQSAyOCA2NyAxOCAwMiAxQiAyOCA2NyAxOCAwMiAxQyAyOCA2NyAxOCAwMiBcCisgMUQgMjggNjcgMTggODYgRTAgM0EgMDggNjcgM0IgNzUgMjAgNjcgNDYgNzcgMjQgXAorIDY3IDQyIDc3IDQyIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDQyIDE2IEUwIENBIFwKKyAwNSA3NCA0NiA3NyA0MiA2NyAzQiA3NSA0MiA3NyA0NiAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEYgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MzQuaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGI2MzAiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMUEgMjggNjcgMTggMDIgMUIgMjggNjcgMTggMDIgMUMgMjggNjcgMTggMDIgXAorIDFEIDI4IDY3IDE4IDg2IEUwIDNBIDA4IDY3IDNCIDc1IDIwIDY3IDQ2IDc3IDI0IFwKKyA2NyA0MiA3NyA0MiAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA0MiAxNiBFMCBDQSBcCisgMDUgNzQgNDYgNzcgNDIgNjcgM0IgNzUgNDIgNzcgNDYgMTIgQTAgRjggMTUgMUEgXAorIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2NjM0LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjM2IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDJBIDI4IDY3IDIyIDAyIDMyIDI4IDY3IDIyIDAyIDFBIDI4IDY3IDIyIDAyIFwKKyAxQiAyOCA2NyAyMiAwMiAxQyAyOCA2NyAyMiAwMiAxRCAyOCA2NyAyMiA4NiBFMCBcCisgM0EgMDggNjcgM0QgNzUgNDQgMjggMzIgMDAgMzIgMDEgQjcgOTcgNzUgNDggMTYgXAorIEUwIENBIDA1IDc0IDQ4IDc3IDQ0IDY3IDNEIDc1IDQ0IDc3IDQ4IDEyIEEwIEY4IFwKKyAxNSAxQSAwMCA1NyAzMiAwRiA4NyA1NyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCciICNzZGs1NjYzNi5oZXgKKworaWYgISJleHByICRwY2lkZXYgKyAwID09IDB4YjYzOCIgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxRSAyOCA2NyAyQyAwMiAyNiAyOCA2NyAyQyAwMiAyQSAyOCA2NyAyQyAwMiBcCisgMzIgMjggNjcgMkMgMDIgMUEgMjggNjcgMkMgMDIgMUIgMjggNjcgMkMgMDIgMUMgXAorIDI4IDY3IDJDIDAyIDFEIDI4IDY3IDJDIDg2IEUwIDNBIDA4IDY3IDQ3IDc1IDRFIFwKKyAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSA1MiAxNiBFMCBDQSAwNSA3NCA1MiA3NyBcCisgNEUgNjcgNDcgNzUgNEUgNzcgNTIgMTIgQTAgRjggMTUgMUEgMDAgNTcgMzIgMEYgXAorIDg3IDU3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2NjM4LmhleAorCitpZiAhImV4cHIgJHBjaWRldiArIDAgPT0gMHhiNjM5IiAibG9jYWwgbGVkY29kZSAnXAorIDAyIDFFIDI4IDY3IDJDIDAyIDI2IDI4IDY3IDJDIDAyIDJBIDI4IDY3IDJDIDAyIFwKKyAzMiAyOCA2NyAyQyAwMiAxQSAyOCA2NyAyQyAwMiAxQiAyOCA2NyAyQyAwMiAxQyBcCisgMjggNjcgMkMgMDIgMUQgMjggNjcgMkMgODYgRTAgM0EgMDggNjcgNDcgNzUgNEUgXAorIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDUyIDE2IEUwIENBIDA1IDc0IDUyIDc3IFwKKyA0RSA2NyA0NyA3NSA0RSA3NyA1MiAxMiBBMCBGOCAxNSAxQSAwMCA1NyAzMiAwRiBcCisgODcgNTcgMzIgMEUgODcgNTcgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnIiAjc2RrNTY2MzkuaGV4CisKK2lmICEiZXhwciAkcGNpZGV2ICsgMCA9PSAweGIzMzQiICJsb2NhbCBsZWRjb2RlICdcCisgMDIgMDIgMjggNjAgRTEgNjcgM0QgNjcgMUMgMDYgRTEgODAgRDIgMUUgNzQgMDIgXAorIDEyIEUwIDg1IDA1IEQyIDA1IDcxIDFBIDUyIDAwIDNBIDM4IDMyIDAwIDMyIDAxIFwKKyBCNyA5NyA3NSAyQiAxMiBFMiBGRSBFMSAwMiAwQSA1MCAxMiBFMiBGRSBFMSA5NSBcCisgNzUgMzUgODUgNzcgNEMgMTYgRTAgREEgMDIgNzEgNTAgNzcgNEMgMDYgRTEgNjcgXAorIDQ1IDc1IDRDIDc3IDUwIDEyIEEwIEY4IDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IFwKKyAzMiAwRSA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjMzNC5oZXgKKworaWYgJD9hcG9sbG8gImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAxRSAyOCA2MCBFMCA2NyA1OCA2NyA3MyAwNiBFMCA4MCAyOCA2MCBFMCA2NyBcCisgNzMgNjcgNTggMDYgRTAgODAgRDIgMzYgNzQgMDIgMDIgMUEgMjggNjAgRTAgNjcgXAorIDlCIDc1IDI5IDY3IEIwIDY3IDU4IDc3IDMxIDMyIDBFIDg3IDMyIDA4IDg3IDY3IFwKKyBBMiAwNiBFMCA4MCBEMiAxRSA3NCAxQyAxMiBFMiA4NSAwNSBEMiAwRiA3MSA0MiBcCisgNTIgMDAgMTIgRTEgODUgMDUgRDIgMUYgNzEgNEMgNTIgMDAgMTIgRTMgODUgMDUgXAorIEQyIDA1IDcxIDU2IDUyIDAwIDNBIDcwIDMyIDAwIDk3IDc1IDY0IDMyIDAxIDk3IFwKKyA3MSA2QiA3NyBCMCAzMiAwMSA5NyA3MSBBOSA3NyBBMiAxNiBFMyBEQSAwMiA3MSBcCisgQTkgNzcgQjAgMzIgMDUgOTcgNzUgODMgMzIgMDIgOTcgNzEgQTIgMDYgRTEgRDIgXAorIDAxIDcxIEEyIDA2IEUwIDY3IDlCIDc1IEEyIDMyIDAzIDk3IDcxIEIwIDMyIDA0IFwKKyA5NyA3NSBBOSAwNiBFMiBEMiAwNyA3MSBBOSA3NyBCMCAxMiBBMCBGOCAxNSAxQSBcCisgMDAgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEUgODcgMzIgMEYgODcgNTcgXAorIDMyIDBGIDg3IDMyIDBFIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2NTI0LmhleAorCitpZiAkP3RvbWFoYXdrIHx8ICQ/dG9tYWhhd2tfcGx1cyAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAwIDI4IDYwIEUxIDY3IDI1IDY3IDE0IDA2IEUxIDgwIEQyIDQwIDc0IDAyIFwKKyA4NiBFMCAzQSBGQyAyOCAzMiAwMCAzMiAwMSBCNyA5NyA3NSAzNyAxNiBFMCBDQSBcCisgMDUgNzQgM0UgNzcgMzcgNjcgMkIgNzUgMzcgNzcgNDUgMTIgQTAgRjggMTUgMUEgXAorIDAwIDU3IDI4IDMyIDA3IDk3IDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBGIFwKKyA4NyAzMiAwRSA4NyA1NyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAwMCAwMCAwMCAwMCciICNzZGs1Njk2MC5oZXgKKworaWYgJD90cmlkZW50MnBsdXMgImxvY2FsIGxlZGNvZGUgJ1wKKyAwMiAwMSAyOCA2MCBFMSA2NyAzMSA2NyAyMCAwNiBFMSA4MCBEMiAzMSA3NCAwMiBcCisgODYgRTAgM0EgQzAgNjcgMzcgNzUgMUMgNjcgNTEgNzcgMjAgNjcgNDMgNzcgNDMgXAorIDI4IDMyIDAwIDMyIDAxIEI3IDk3IDc1IDQzIDE2IEUwIENBIDA1IDc0IDRBIDc3IFwKKyA0MyA2NyAzNyA3NSA0MyA3NyA1MSAxMiBBMCBGOCAxNSAxQSAwMCA1NyAyOCAzMiBcCisgMDcgOTcgNTcgMzIgMEUgODcgMzIgMEUgODcgNTcgMzIgMEYgODcgMzIgMEUgODcgXAorIDU3IDMyIDBFIDg3IDMyIDBGIDg3IDU3IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwJyIgI3NkazU2ODYwLmhleAorCitpZiAkP2FwYWNoZSAibG9jYWwgbGVkY29kZSAnXAorIDAyIDAwIDY3IDI0IDY3IDBGIDgwIEQyIDI0IDc0IDAyIDg2IEUwIDNBIEY4IDY3IFwKKyAzNCA3NSAxNiA3NyAxRCA1NyA2NyAzQyA3NSA2MiA3NyA0NCA1NyA2NyAzQyA3NSBcCisgNEUgNzcgNTggNTcgNjcgMkMgNzUgNjIgNzcgNzAgMDcgNTcgMDcgMTIgQTAgRjggXAorIDE1IDFBIDAwIDU3IDA3IDEyIEEwIEY4IDE1IDFBIDA0IDU3IDA3IDEyIEEwIEY4IFwKKyAxNSAxQSAwNSA1NyAxNiBFMCBDQSAxRSA3NCA2OSA3NyA2MiAwNyA1NyAxNiBFMCBcCisgQ0EgMUUgNzQgNzAgNzcgNjIgMDcgNTcgMTYgRTAgQ0EgMUUgNzQgNjkgNzcgNzAgXAorIDA3IDU3IDMyIDBFIDg3IDMyIDBFIDg3IDU3IDMyIDBGIDg3IDMyIDBFIDg3IDU3IFwKKyAzMiAwRSA4NyAzMiAwRiA4NyA1NyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCciICNzZGs1NjU2MC5oZXgKKworaWYgJD9nZW5lcmljOGxlZCAibG9jYWwgbGVkY29kZSAnXAorIDA2IEUxIEQyIDQwIDcxIDExIEUwIDYwIEUxIDE2IEUzIERBIDAxIDcxIDE1IDYwIFwKKyBFMyA2NyA1RCA3NSAyQiAxMiAwMSA2MSBFMyA2NyA3MSAyOCA2NyAzMiA4NiBFMCBcCisgMTYgRTIgODEgNjEgRTIgREEgMUUgNzUgMkIgM0EgMDggRTkgNjEgRTIgODYgRTEgXAorIDc3IDAwIDY3IDVEIDc1IDM4IDc3IDNDIDY3IDY0IDc3IDY0IDY3IDQxIDY3IDRGIFwKKyA1NyAyOCAzMiAwMSA5NyA3NSA2NCAxNiBFMCBDQSAwNSA3NCA2OCA3NyA2NCAyOCBcCisgMzIgMDAgOTcgNzUgNjQgMTYgRTAgQ0EgMDUgNzQgNjggNzcgNjQgMTIgQTAgRjggXAorIDE1IDFBIDAwIDU3IDMyIDBGIDg3IDU3IDMyIDBFIDg3IDU3IDA5IDc1IDY0IDc3IFwKKyA2OCAxMiAwNSA2NyA2QyAxMiAwNCA2NyA2QyAxMiAwMyA2NyA2QyAxMiAwMiA2NyBcCisgNkMgMTIgMDEgNjcgNkMgMTIgMDAgNjcgNkMgNTcgMDAgMDAgMDAgMDAgMDAgMDAnIiAjZ2VuZXJpYzhsZWQuaGV4CisKKyMgRG93bmxvYWQgTEVEIGNvZGUgaW50byBMRUQgcHJvY2Vzc29yIGFuZCBlbmFibGUgKGlmIGFwcGxpY2FibGUpLgorCitpZiAkP2ZlYXR1cmVfbGVkX3Byb2MgJiYgJD9sZWRjb2RlICYmICEkP3NpbXVsYXRvciBcCisJImxlZCBwcm9nICRsZWRjb2RlOyBcCisJIGxlZCBhdXRvIG9uOyBsZWQgc3RhcnQiCisKKyMgU2V0dXAgR3JleWhvdW5kIExFRCBwcm9jZXNzb3IKK2lmICQ/Z3JleWhvdW5kIFwKKyAgICAicmNsb2FkIGdoX2xlZHVwLnNvYyIKKworIyBTZXR1cCBIdXJyaWNhbmUzIExFRCBwcm9jZXNzb3IKK2lmICQ/aHVycmljYW5lMyBcCisgICAgInJjbG9hZCBocjNfbGVkLnNvYyIKKworIyBTZXR1cCBUb21haGF3ayBMRUQgcHJvY2Vzc29yCitpZiAkP3RvbWFoYXdrICYmICEkP3NpbXVsYXRvciBcCisgICAgImxlZCAxIHByb2cgJGxlZGNvZGU7IFwKKyAgICAgbGVkIDEgYXV0byBvbjsgbGVkIDEgc3RhcnQ7IFwKKyAgICAgbGVkIDIgcHJvZyAkbGVkY29kZTsgXAorICAgICBsZWQgMiBhdXRvIG9uOyBsZWQgMiBzdGFydCIKKworIyBTZXR1cCBUb21haGF3aysgTEVEIHByb2Nlc3NvcgoraWYgJD90b21haGF3a19wbHVzICYmICEkP3NpbXVsYXRvciBcCisgICAgImxlZCAxIHByb2cgJGxlZGNvZGU7IFwKKyAgICAgbGVkIDEgYXV0byBvbjsgbGVkIDEgc3RhcnQ7IFwKKyAgICAgbGVkIDIgcHJvZyAkbGVkY29kZTsgXAorICAgICBsZWQgMiBhdXRvIG9uOyBsZWQgMiBzdGFydCIKKworIyBJZiBsb2FkaW5nIG11bHRpcGxlIHJjLnNvYywgdXBvbiBsb2FkaW5nIHRoZSBsYXN0IHVuaXQsIHJlc3RhcnQKKyMgYWxsIExFRCBwcm9jZXNzb3JzIHNvIGFueSBjb21tb24gYmxpbmtpbmcgaXMgaW4gc3luYy4KKworaWYgISJleHByICQ/ZmVhdHVyZV9sZWRfcHJvYyAmJiAhJD9zaW11bGF0b3IgJiYgJHVuaXQgPT0gJHVuaXRzIC0gMSIgXAorCSIqOmxlZCBzdG9wOyAqOmxlZCBzdGFydCIKKworIyBSdW4gY291bnRlciBETUEgdGFzayA0IHRpbWVzIHBlciBzZWNvbmQgdG8gYWNoaWV2ZSBiZXR0ZXIKKyMgY3RyX3hhdWlfYWN0aXZpdHkuCitpZiAkP2JyYWRsZXlfYW55IFwKKyAgICAgICAgImN0ciBpbnRlcnZhbD0yNTAwMDAiCisKKyMgSW5pdGlhbGl6ZSBIZXJjdWxlcyBVQyBtb2RpZCAwIGVudHJ5IHRvIHBvaW50IHRvIHRoZSBDUFUKK2lmICQ/aGVyY19hbnkgXAorCSJ3IHVjIDAgMSAxIgorCisjIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgNDgtcG9ydCBpbiBTdGFja2luZyBtb2RlLgorIyBPbiB0aGUgNDgtcG9ydCBwbGF0Zm9ybSwgcmMuc29jIGlzIHJ1biB0d2ljZTsgb25jZSBvbiB1bml0IDAgYW5kCisjIHRoZW4gb25jZSBvbiB1bml0IDEuICBUaGUgdHVyYm8gcG9ydCBvbiB1bml0IE4gaXMgZ2VOLgorIyBBbGwgdHVyYm8gcG9ydCB0cmFmZmljIG11c3QgYmUgdGFnZ2VkOyBzZWUgdmxhbiBhZGQgYmVsb3cuCisjIFNlZSAkU0RLL2RvYy80OC1wb3J0LnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgaG93CisjIHRvIGNvbmZpZ3VyZSBJUEcgdmFsdWVzIGZvciBsaW5lIHJhdGUgb3BlcmF0aW9uLgorCitpZiAkP3A0OCAmJiAkP3VuaXQwIFwKKwkibG9jYWwgdHVyYm9fcG9ydCAwOyBsb2NhbCBteV9tb2RpZCAxOyIKKworaWYgJD9wNDggJiYgJD91bml0MSBcCisJImxvY2FsIHR1cmJvX3BvcnQgMTsgbG9jYWwgbXlfbW9kaWQgMjsiCisKK2lmICQ/cDQ4IFwKKwkibSBjb25maWcgc3RfaXNfbWlycj0wIHN0X21vZHVsZT0xIHN0X21jbnQ9MSBzdF9zaW1wbGV4PTAgc3RfbGluaz0wOyBcCisJIG0gY29uZmlnLmckdHVyYm9fcG9ydCBzdF9saW5rPTE7IFwKKwkgbSBnbWFjYzIuZ2UkdHVyYm9fcG9ydCBpcGd0PTggbWNsa2ZxPTE7IFwKKwkgbSBmZV9tYXhmIG1heGZyPTE1NjA7IFwKKwkgbSBtYXhmciBtYXhmcj0xNTY4OyBcCisJIG0gY29uZmlnMiBteV9tb2RpZD0kbXlfbW9kaWQ7IFwKKwkgcG9ydCBnZSR0dXJib19wb3J0IHNwZWVkPTI1MDA7IFwKKwkgdmxhbiBhZGQgMSBwYm09Z2UkdHVyYm9fcG9ydCB1Ym09bm9uZSIKKworaWYgISQ/bm9fYmNtICYmICQ/ZHJhY19hbnkgXAorICAgIm0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMT0weGMiCitpZiAhJD9ub19iY20gJiYgJD9seW54X2FueSBcCisgICAibSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QxPTB4MSIKK2lmICEkP25vX2JjbSAmJiAkP3R1Y2FuYSBcCisgICAic3RrbW9kZSBtb2RpZD0wOyIKK2lmICEkP25vX2JjbSAmJiAkP3R1Y2FuYSAmJiAhJD9tYWdudW0gJiYgISQ/dHVjYW5hX25vaGcgXAorICAgIm0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMj0weDM4OyBcCisgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MCBwb3J0X2Zvcl9tb2QyPTB4Mzg7IFwKKyAgICBzdGttb2RlIG1vZGlkPTAiCitpZiAhJD9ub19iY20gJiYgJD94Z3Nfc3dpdGNoICYmICEkP3JjcHVfb25seVwKKyAgICJzdGttb2RlIG1vZGlkPTA7IFwKKyAgICBzIENNSUNfQ09TX0NUUkxfUlggQ0gwX0NPU19CTVA9MCxDSDFfQ09TX0JNUD0weGZmLCBcCisgICAgICAgIENIMl9DT1NfQk1QPTAsQ0gzX0NPU19CTVA9MCIKKworIyBCYWNrLXRvLWJhY2sgRHJhY28gc2V0dXAuCisKKyMgRHJhY28gY2hpcHMgbXVzdCBydW4gYXQgMTI3TUh6LiBTb21lIG9sZGVyIHZlcnNpb25zCisjIGFyZSBub3Qgc2V0IHRvIHRoaXMgZnJlcXVlbmN5LgorCitpZiAkP2RyYWNvX3N0ayAmJiAkP3VuaXQwIFwKKyAgICAiaTJjIHByb2JlIHF1aWV0OyBiYiBjbG9jayBSZWYxMjUgMTI3IgorCisjIEFwcGxpZXMgdG8gU0RLIEJhc2Vib2FyZCB3aXRoIGVpdGhlciBpbnRlcm5hbCBvciBleHRlcm5hbCBIaWdpZ3MsCisjIGFzIHdlbGwgYXMgdGhlIEdhbGFoYWQgcmVmZXJlbmNlIGRlc2lnbi4KKworaWYgJD9kcmFjb19iMmIgJiYgJD91bml0MCBcCisgICAgInN0a21vZGUgbW9kaWQ9MDsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTEyOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTEyIgorCitpZiAhJD9zaW11bGF0b3IgJiYgJD9kcmFjb19iMmIgJiYgJD91bml0MCBcCisgICAgICJpMmMgcHJvYmUgcXVpZXQ7IGJiIGNsb2NrIFJlZjEyNSAxMjciCisKK2lmICQ/ZHJhY29fYjJiICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTE7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MDsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MCIKKworIyBNZXJsaW4sIFdoaXRlIEtuaWdodCwgQmxhY2sgS25pZ2h0IHNldHVwLgorIwlEcmFjbyB1bml0IDEgaXMgb24gSGVyYyBwb3J0IDgKKyMJRHJhY28gdW5pdCAyIGlzIG9uIEhlcmMgcG9ydCAxCisKK2lmICQ/ZHJhY29faGVyYzQgJiYgJD91bml0MCBcCisgICAgIncgdWMuaHBpYzcgMCAxIDB4MDsgXAorICAgICB3IHVjLmhwaWM3IDEgMSAweDI7IFwKKyAgICAgdyB1Yy5ocGljMCAwIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljMCAxIDEgMHgwIgorCitpZiAhJD9zaW11bGF0b3IgJiYgJD9kcmFjb19oZXJjNCAmJiAkP3VuaXQwIFwKKyAgICAgImkyYyBwcm9iZSBxdWlldDsgYmIgY2xvY2sgUmVmMTI1IDEyNyIKKworaWYgJD9kcmFjb19oZXJjNCAmJiAkP3VuaXQxIFwKKyAgICAic3RrbW9kZSBtb2RpZD0wOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MTI7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0wIHBvcnRfZm9yX21vZDE9MTIiCisKK2lmICQ/ZHJhY29faGVyYzQgJiYgJD91bml0MiBcCisgICAgInN0a21vZGUgbW9kaWQ9MTsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0wOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0wIgorCisjIExhbmNlbG90IHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImxhbmNlbG90PTEiKQorIyBOb3RlczoKKyMJRHJhY28gdW5pdCAxIGlzIG9uIEhlcmMgcG9ydCA3CisjCURyYWNvIHVuaXQgMiBpcyBvbiBIZXJjIHBvcnQgOAorIwlEcmFjbyB1bml0IDMgaXMgb24gSGVyYyBwb3J0IDEKKyMJRHJhY28gdW5pdCA0IGlzIG9uIEhlcmMgcG9ydCAyCisKK2lmICQ/bGFuY2Vsb3QgJiYgJD91bml0MCBcCisgICAgIncgdWMuaHBpYzYgMCAxIDB4MDsgXAorICAgICB3IHVjLmhwaWM2IDEgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWM2IDIgMSAweDI7IFwKKyAgICAgdyB1Yy5ocGljNiAzIDEgMHg0OyBcCisgICAgIHcgdWMuaHBpYzcgMCAxIDB4ODA7IFwKKyAgICAgdyB1Yy5ocGljNyAxIDEgMHgwOyBcCisgICAgIHcgdWMuaHBpYzcgMiAxIDB4MjsgXAorICAgICB3IHVjLmhwaWM3IDMgMSAweDQ7IFwKKyAgICAgdyB1Yy5ocGljMCAwIDEgMHg4MDsgXAorICAgICB3IHVjLmhwaWMwIDEgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMwIDIgMSAweDA7IFwKKyAgICAgdyB1Yy5ocGljMCAzIDEgMHg0OyBcCisgICAgIHcgdWMuaHBpYzEgMCAxIDB4ODA7IFwKKyAgICAgdyB1Yy5ocGljMSAxIDEgMHgxMDA7IFwKKyAgICAgdyB1Yy5ocGljMSAyIDEgMHgyOyBcCisgICAgIHcgdWMuaHBpYzEgMyAxIDB4MCIKKworaWYgISQ/c2ltdWxhdG9yICYmICQ/bGFuY2Vsb3QgJiYgJD91bml0MCBcCisgICAgICJpMmMgcHJvYmUgcXVpZXQ7IGJiIGNsb2NrIERyYWNvX0NvcmUgMTI3IgorCitpZiAkP2xhbmNlbG90ICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTA7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMjsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMiIKKworaWYgJD9sYW5jZWxvdCAmJiAkP3VuaXQyIFwKKyAgICAic3RrbW9kZSBtb2RpZD0xOyBcCisgICAgIG0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTAgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MTI7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTAgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MTIiCisKK2lmICQ/bGFuY2Vsb3QgJiYgJD91bml0MyBcCisgICAgInN0a21vZGUgbW9kaWQ9MjsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MCBwb3J0X2Zvcl9tb2QzPTEyOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MCBwb3J0X2Zvcl9tb2QzPTEyIgorCitpZiAkP2xhbmNlbG90ICYmICQ/dW5pdDQgXAorICAgICJzdGttb2RlIG1vZGlkPTM7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MDsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MCIKKworIyBMeW54IFNESyAoVHdvTHlueCkgc2V0dXAKKyMgKGVuYWJsZWQgYnkgYWRkaW5nIHRoZSBwcm9wZXJ0eSAidHdvbHlueD0xIikKKworaWYgJD90d29seW54ICYmICQ/dW5pdDAgXAorICAgICJzdGttb2RlIG1vZGlkPTA7IFwKKyAgICAgbSBtb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTAgcG9ydF9mb3JfbW9kMT0xOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MCBwb3J0X2Zvcl9tb2QxPTE7IFwKKyAgICAgIgorCitpZiAkP3R3b2x5bnggJiYgJD91bml0MSBcCisgICAgInN0a21vZGUgbW9kaWQ9MTsgXAorICAgICBtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MSBwb3J0X2Zvcl9tb2QxPTA7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xIHBvcnRfZm9yX21vZDE9MDsgXAorICAgICAiCisjIEhlcmN1THlueCBzZXR1cAorIyAoZW5hYmxlZCBieSBhZGRpbmcgdGhlIHByb3BlcnR5ICJoZXJjdWx5bng9MSIpCisjIE5vdGVzOgorIwlMeW54IHVuaXQgMSBpcyBvbiBIZXJjIHBvcnQgMQorIwlMeW54IHVuaXQgMiBpcyBvbiBIZXJjIHBvcnQgMgorIwlMeW54IHVuaXQgMyBpcyBvbiBIZXJjIHBvcnQgMworIwlMeW54IHVuaXQgNCBpcyBvbiBIZXJjIHBvcnQgNAorIwlMeW54IHVuaXQgNSBpcyBvbiBIZXJjIHBvcnQgNQorIwlMeW54IHVuaXQgNiBpcyBvbiBIZXJjIHBvcnQgNgorIwlMeW54IHVuaXQgNyBpcyBvbiBIZXJjIHBvcnQgNworIwlMeW54IHVuaXQgOCBpcyBvbiBIZXJjIHBvcnQgOAorCitpZiAkP2hlcmN1bHlueCAmJiAkP3VuaXQwIFwKKyAgICAiIFwKKyAgICAgdyB1Yy5ocGljMCAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMCAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljMCAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMCAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMCA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljMCA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljMCA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMCA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljMSAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMSAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljMSAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMSAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMSA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljMSA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljMSA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMSA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljMiAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMiAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljMiAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMiAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMiA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljMiA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljMiA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMiA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljMyAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljMyAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljMyAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljMyAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljMyA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljMyA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljMyA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljMyA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNCAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNCAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljNCAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljNCAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljNCA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljNCA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljNCA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljNCA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNSAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNSAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljNSAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljNSAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljNSA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljNSA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljNSA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljNSA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNiAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNiAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljNiAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljNiAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljNiA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljNiA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljNiA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljNiA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgdyB1Yy5ocGljNyAwIDEgMHgwMDI7IFwKKyAgICAgdyB1Yy5ocGljNyAxIDEgMHgwMDQ7IFwKKyAgICAgdyB1Yy5ocGljNyAyIDEgMHgwMDg7IFwKKyAgICAgdyB1Yy5ocGljNyAzIDEgMHgwMTA7IFwKKyAgICAgdyB1Yy5ocGljNyA0IDEgMHgwMjA7IFwKKyAgICAgdyB1Yy5ocGljNyA1IDEgMHgwNDA7IFwKKyAgICAgdyB1Yy5ocGljNyA2IDEgMHgwODA7IFwKKyAgICAgdyB1Yy5ocGljNyA3IDEgMHgxMDA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICA7IFwKKyAgICAgIgorCitpZiAkP2hlcmN1bHlueCAmJiAkP2x5bnhfYW55IFwKKyAgICAgIm0gbW9kcG9ydF83XzAgXAorICAgICBwb3J0X2Zvcl9tb2QwPTEgcG9ydF9mb3JfbW9kMT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xIHBvcnRfZm9yX21vZDM9MSBcCisgICAgIHBvcnRfZm9yX21vZDQ9MSBwb3J0X2Zvcl9tb2Q1PTEgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEgcG9ydF9mb3JfbW9kNz0xOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIFwKKyAgICAgcG9ydF9mb3JfbW9kMD0xIHBvcnRfZm9yX21vZDE9MSBcCisgICAgIHBvcnRfZm9yX21vZDI9MSBwb3J0X2Zvcl9tb2QzPTEgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEgcG9ydF9mb3JfbW9kNT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xIHBvcnRfZm9yX21vZDc9MTsgXAorICAgICAiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTAiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDIgXAorICAgICJzdGttb2RlIG1vZGlkPTEiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDMgXAorICAgICJzdGttb2RlIG1vZGlkPTIiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDQgXAorICAgICJzdGttb2RlIG1vZGlkPTMiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDUgXAorICAgICJzdGttb2RlIG1vZGlkPTQiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDYgXAorICAgICJzdGttb2RlIG1vZGlkPTUiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDcgXAorICAgICJzdGttb2RlIG1vZGlkPTYiCisKK2lmICQ/aGVyY3VseW54ICYmICQ/dW5pdDggXAorICAgICJzdGttb2RlIG1vZGlkPTciCisKKyMgTHlueGFMb3Qgc2V0dXAKKyMgKGVuYWJsZWQgYnkgYWRkaW5nIHRoZSBwcm9wZXJ0eSAibHlueGFsb3Q9MSIpCisjIE5vdGVzOgorIwlMeW54IHVuaXQgMCBpcyBvbiBIZXJjIHBvcnQgMyAoaGcyL2hwaWMyKSAobW9kIDApCisjCUx5bnggdW5pdCAxIGlzIG9uIEhlcmMgcG9ydCA0IChoZzMvaHBpYzMpIChtb2QgMSkKKyMJSGlnaWcgY29ubiAwIGlzIG9uIEhlcmMgcG9ydCA1IChoZzQvaHBpYzQpCisjCUhpZ2lnIGNvbm4gMSBpcyBvbiBIZXJjIHBvcnQgNiAoaGc1L2hwaWM1KQorIwlEcmFjbyB1bml0IDMgaXMgb24gSGVyYyBwb3J0IDcgKGhnNi9ocGljNikgKG1vZCAyKQorIwlEcmFjbyB1bml0IDQgaXMgb24gSGVyYyBwb3J0IDggKGhnNy9ocGljNykgKG1vZCAzKQorIwlEcmFjbyB1bml0IDUgaXMgb24gSGVyYyBwb3J0IDEgKGhnMC9ocGljMCkgKG1vZCA0KQorIwlEcmFjbyB1bml0IDYgaXMgb24gSGVyYyBwb3J0IDIgKGhnMS9ocGljMSkgKG1vZCA1KQorCitpZiAkP2x5bnhhbG90ICYmICQ/dW5pdDIgXAorICAgICIgXAorICAgICB3IHVjLmhwaWMwIDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMwIDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMwIDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMwIDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMwIDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMwIDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWMxIDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMxIDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMxIDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMxIDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMxIDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMxIDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWMyIDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMyIDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMyIDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMyIDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMyIDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMyIDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWMzIDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWMzIDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWMzIDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWMzIDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMzIDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMzIDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM2IDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWM2IDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWM2IDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWM2IDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWM2IDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM2IDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM3IDAgMSAweDAwODsgXAorICAgICB3IHVjLmhwaWM3IDEgMSAweDAxMDsgXAorICAgICB3IHVjLmhwaWM3IDIgMSAweDA4MDsgXAorICAgICB3IHVjLmhwaWM3IDMgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWM3IDQgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM3IDUgMSAweDAwNDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICAiCisKK2lmICQ/bHlueGFsb3QgJiYgJD9seW54X2FueSBcCisgICAgICJtIG1vZHBvcnRfN18wIFwKKyAgICAgcG9ydF9mb3JfbW9kMD0xIHBvcnRfZm9yX21vZDE9MSBcCisgICAgIHBvcnRfZm9yX21vZDI9MSBwb3J0X2Zvcl9tb2QzPTEgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEgcG9ydF9mb3JfbW9kNT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xIHBvcnRfZm9yX21vZDc9MTsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBcCisgICAgIHBvcnRfZm9yX21vZDA9MSBwb3J0X2Zvcl9tb2QxPTEgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEgcG9ydF9mb3JfbW9kMz0xIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xIHBvcnRfZm9yX21vZDU9MSBcCisgICAgIHBvcnRfZm9yX21vZDY9MSBwb3J0X2Zvcl9tb2Q3PTE7IFwKKyAgICAgIgorCitpZiAkP2x5bnhhbG90ICYmICQ/ZHJhY19hbnkgXAorICAgICJtIG1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMiBcCisgICAgIHBvcnRfZm9yX21vZDQ9MTIgcG9ydF9mb3JfbW9kNT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDY9MTIgcG9ydF9mb3JfbW9kNz0xMjsgXAorICAgICBtIGltb2Rwb3J0XzdfMCBwb3J0X2Zvcl9tb2QwPTEyIHBvcnRfZm9yX21vZDE9MTIgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEyIHBvcnRfZm9yX21vZDM9MTIgXAorICAgICBwb3J0X2Zvcl9tb2Q0PTEyIHBvcnRfZm9yX21vZDU9MTIgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEyIHBvcnRfZm9yX21vZDc9MTI7IFwKKyAgICAgIgorCitpZiAkP2x5bnhhbG90ICYmICQ/dW5pdDAgXAorICAgICJzdGttb2RlIG1vZGlkPTAiCisgICAgIAoraWYgJD9seW54YWxvdCAmJiAkP3VuaXQxIFwKKyAgICAic3RrbW9kZSBtb2RpZD0xIgorCitpZiAkP2x5bnhhbG90ICYmICQ/dW5pdDMgXAorICAgICJzdGttb2RlIG1vZGlkPTIiCisKK2lmICQ/bHlueGFsb3QgJiYgJD91bml0NCBcCisgICAgInN0a21vZGUgbW9kaWQ9MyIKKworaWYgJD9seW54YWxvdCAmJiAkP3VuaXQ1IFwKKyAgICAic3RrbW9kZSBtb2RpZD00IgorCitpZiAkP2x5bnhhbG90ICYmICQ/dW5pdDYgXAorICAgICJzdGttb2RlIG1vZGlkPTUiCisKKyMgZ3VlbmV2ZXJlIHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImd1ZW5ldmVyZT0xIikKKyMgTm90ZXM6CisjICAgICAgIGhnWCBtYXBwaW5nIGJhc2VkIG9uIHBibXBfdmFsaWQuMD0weDFiNworIwlEcmFjbyB1bml0IDEgaXMgb24gSGVyYyBwb3J0IDEgKGhnMC9ocGljMCkgKG1vZCAwKQorIwlEcmFjbyB1bml0IDIgaXMgb24gSGVyYyBwb3J0IDIgKGhnMS9ocGljMSkgKG1vZCAxKQorIwlMeW54IHVuaXQgMyBpcyBvbiBIZXJjIHBvcnQgOCAoaGc1L2hwaWM3KSAobW9kIDIpCisjCUx5bnggdW5pdCA0IGlzIG9uIEhlcmMgcG9ydCA3IChoZzQvaHBpYzYpIChtb2QgMykKKyMJSGlnaWcgY29ubiAwIGlzIG9uIEhlcmMgcG9ydCA0IChoZzIvaHBpYzMpCisjCUhpZ2lnIGNvbm4gMSBpcyBvbiBIZXJjIHBvcnQgNSAoaGczL2hwaWM0KQorIyAgICAgICBIZXJjIHBvcnQgMyAtIFVudXNlZCAoaHBpYzIpCisjICAgICAgIEhlcmMgcG9ydCA2IC0gVW51c2VkIChocGljNSkKK2lmICQ/Z3VlbmV2ZXJlICYmICQ/dW5pdDAgXAorICAgICIgXAorICAgICB3IHVjLmhwaWMwIDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMwIDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWMwIDIgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMwIDMgMSAweDA4MDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWMxIDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWMxIDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWMxIDIgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWMxIDMgMSAweDA4MDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM3IDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM3IDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWM3IDIgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWM3IDMgMSAweDA4MDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICB3IHVjLmhwaWM2IDAgMSAweDAwMjsgXAorICAgICB3IHVjLmhwaWM2IDEgMSAweDAwNDsgXAorICAgICB3IHVjLmhwaWM2IDIgMSAweDEwMDsgXAorICAgICB3IHVjLmhwaWM2IDMgMSAweDA4MDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICAiCisKK2lmICQ/Z3VlbmV2ZXJlICYmICQ/bHlueF9hbnkgXAorICAgICAibSBtb2Rwb3J0XzdfMCBcCisgICAgIHBvcnRfZm9yX21vZDA9MSBwb3J0X2Zvcl9tb2QxPTEgXAorICAgICBwb3J0X2Zvcl9tb2QyPTEgcG9ydF9mb3JfbW9kMz0xIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xIHBvcnRfZm9yX21vZDU9MSBcCisgICAgIHBvcnRfZm9yX21vZDY9MSBwb3J0X2Zvcl9tb2Q3PTE7IFwKKyAgICAgbSBpbW9kcG9ydF83XzAgXAorICAgICBwb3J0X2Zvcl9tb2QwPTEgcG9ydF9mb3JfbW9kMT0xIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xIHBvcnRfZm9yX21vZDM9MSBcCisgICAgIHBvcnRfZm9yX21vZDQ9MSBwb3J0X2Zvcl9tb2Q1PTEgXAorICAgICBwb3J0X2Zvcl9tb2Q2PTEgcG9ydF9mb3JfbW9kNz0xOyBcCisgICAgICIKKworaWYgJD9ndWVuZXZlcmUgJiYgJD9kcmFjX2FueSBcCisgICAgIm0gbW9kcG9ydF83XzAgcG9ydF9mb3JfbW9kMD0xMiBwb3J0X2Zvcl9tb2QxPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kMj0xMiBwb3J0X2Zvcl9tb2QzPTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kND0xMiBwb3J0X2Zvcl9tb2Q1PTEyIFwKKyAgICAgcG9ydF9mb3JfbW9kNj0xMiBwb3J0X2Zvcl9tb2Q3PTEyOyBcCisgICAgIG0gaW1vZHBvcnRfN18wIHBvcnRfZm9yX21vZDA9MTIgcG9ydF9mb3JfbW9kMT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDI9MTIgcG9ydF9mb3JfbW9kMz0xMiBcCisgICAgIHBvcnRfZm9yX21vZDQ9MTIgcG9ydF9mb3JfbW9kNT0xMiBcCisgICAgIHBvcnRfZm9yX21vZDY9MTIgcG9ydF9mb3JfbW9kNz0xMjsgXAorICAgICAiCisKK2lmICQ/Z3VlbmV2ZXJlICYmICQ/dW5pdDEgXAorICAgICJzdGttb2RlIG1vZGlkPTAiCisgICAgIAoraWYgJD9ndWVuZXZlcmUgJiYgJD91bml0MiBcCisgICAgInN0a21vZGUgbW9kaWQ9MSIKKworaWYgJD9ndWVuZXZlcmUgJiYgJD91bml0MyBcCisgICAgInN0a21vZGUgbW9kaWQ9MiIKKworaWYgJD9ndWVuZXZlcmUgJiYgJD91bml0NCBcCisgICAgInN0a21vZGUgbW9kaWQ9MyIKKyAgICAgCisjIGZlbGl4NDggc2V0dXAKKyMgKGVuYWJsZWQgYnkgYWRkaW5nIHRoZSBwcm9wZXJ0eSAiZmVsaXg0OD0xIikKKyMgTm90ZXM6CisjICAgICAgIEJDTTU2MTAyIHVuaXQtMCBoaWdpZyBwb3J0IChwb3J0IDI2KSBpcyBjb25uZWN0ZWQKKyMgICAgICAgdG8gQkNNNTYxMDIgVW5pdC0xIGhpZ2lnIHBvcnQgKHBvcnQgMjYpCisjCisKK2lmICQ/ZmVsaXg0OCAmJiAkP3VuaXQwIFwKKyAgICAic3RrbW9kZSBtb2RpZD0wIDsgXAorICAgICBtIElFR1JfUE9SVCBNWV9NT0RJRD0wOyBcCisgICAgIG0gWFBPUlRfQ09ORklHIE1ZX01PRElEPTA7IFwKKyAgICAgdyBNT0RQT1JUX01BUCAxIDEgSElHSUdfUE9SVF9CSVRNQVA9MHg0IDsgXAorICAgICAiCisKK2lmICQ/ZmVsaXg0OCAmJiAkP3VuaXQxIFwKKyAgICAic3RrbW9kZSBtb2RpZD0xIDsgXAorICAgICBtIElFR1JfUE9SVCBNWV9NT0RJRD0xOyBcCisgICAgIG0gWFBPUlRfQ09ORklHIE1ZX01PRElEPTE7IFwKKyAgICAgdyBNT0RQT1JUX01BUCAwIDEgSElHSUdfUE9SVF9CSVRNQVA9MHg0IDsgXAorICAgICAiCisjIGZicG9lIHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImZicG9lPTEiKQorIyBOb3RlczoKKyMgICAgICAgQkNNNTY1MDQgdW5pdC0wIGhpZ2lnIHBvcnQgKHBvcnQgMjcsMjgpIGlzIGNvbm5lY3RlZAorIyAgICAgICB0byBCQ001NjUwNCBVbml0LTEgaGlnaWcgcG9ydCAocG9ydCAyNywyOCkKKyMKKworaWYgJD91bml0MCAmJiAkP2ZpcmVib2x0X2FueSAmJiAkP2ZicG9lICAgICBcCisgICJzdGttb2RlIG1vZGlkPTA7ICAgICAgICAgICBcCisgICB3IG1vZHBvcnRfbWFwIDEgMSBISUdJR19QT1JUX0JJVE1BUD0weDQ7IFwKKyAgIG0gSElHSUdfVFJVTktfR1JPVVAgSElHSUdfVFJVTktfUlRBRzE9MyBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMD0yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQxX1BPUlQxPTMgXAorICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDFfUE9SVDI9MiBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMz0zOyBcCisgICBtIEhJR0lHX1RSVU5LX0NPTlRST0wgSElHSUdfVFJVTktfSUQyPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LMj0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDM9MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTkszPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0JJVE1BUDE9MHhjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBQ1RJVkVfUE9SVF9CSVRNQVA9MHhmIgorCitpZiAkP3VuaXQxICYmICQ/ZmlyZWJvbHRfYW55ICYmICQ/ZmJwb2UgXAorICAic3RrbW9kZSBtb2RpZD0xOyBcCisgICB3IG1vZHBvcnRfbWFwIDAgMSBISUdJR19QT1JUX0JJVE1BUD0weDQ7IFwKKyAgIG0gSElHSUdfVFJVTktfR1JPVVAgSElHSUdfVFJVTktfUlRBRzE9MyBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMD0yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTktfSUQxX1BPUlQxPTMgXAorICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDFfUE9SVDI9MiBcCisgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0lEMV9QT1JUMz0zOyBcCisgICBtIEhJR0lHX1RSVU5LX0NPTlRST0wgSElHSUdfVFJVTktfSUQyPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LMj0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBISUdJR19UUlVOS19JRDM9MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSElHSUdfVFJVTkszPTEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhJR0lHX1RSVU5LX0JJVE1BUDE9MHhjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBQ1RJVkVfUE9SVF9CSVRNQVA9MHhmIgorCisjIER1YWwgUmFwdG9yL1JhdmVuIGJvYXJkcworaWYgJD9yYXZlbl9lYl80OHAgfHwgJD9yYXAyNF9yZWYgXAorICAgICJsb2NhbCByY3B1X3N5c3RlbSAxIgoraWYgJD91bml0MCAmJiAkP3JjcHVfc3lzdGVtIFwKKyAgICJzdGttb2RlIG1vZGlkPTAiCitpZiAkP3VuaXQxICYmICQ/cmNwdV9zeXN0ZW0gXAorICAgInN0a21vZGUgbW9kaWQ9MSIKKworIyBMTSBmYjQ4IHBsYXRmb3JtIHNldHVwCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImxtNDhwPTEiKQorIworaWYgJD91bml0MCAmJiAkP2ZpcmVib2x0X2FueSAmJiAkP2xtNDhwIHx8ICQ/bG00OHBfRCBcCisgICAic3RrbW9kZSBtb2RpZD0wIgorCitpZiAkP3VuaXQxICYmICQ/ZmlyZWJvbHRfYW55ICYmICQ/bG00OHAgfHwgJD9sbTQ4cF9EIFwKKyAgICJzdGttb2RlIG1vZGlkPTEiCisKKyMgU2V0IEZpcmVib2x0IFBPRSBwb3dlciBsZXZlbCAxNzAodG90YWwpIC0gMTEwKHN3aXRjaCkgPSA2MAoraWYgJD9mYnBvZSBcCisgICAgICAgICJsb2NhbCBwb2Vwb3dlciA2MCIKKworIyBTZXQgRHJhY28xNSBQT0UgcG93ZXIgbGV2ZWwgMTcwKHRvdGFsKSAtIDgwKHN3aXRjaCkgPSA5MAoraWYgJD9kcmFjMTVcCisgICAgICAgICJsb2NhbCBwb2Vwb3dlciA5MCIKKworIyBIdXJyaWNhbmUzIEJDTTk1NjE2MFIgc2V0dXAKKyMgTm90ZXM6CisjICAgICAgIEJDTTU2MTYwIHVuaXQtMCBoaWdpZyBwb3J0IChwb3J0IDI5LDMwKSBpcyBjb25uZWN0ZWQKKyMgICAgICAgdG8gQkNNNTYxNjAgVW5pdC0xIGhpZ2lnIHBvcnQgKHBvcnQgMjYsMjcpCisjCisKK2lmICQ/YmNtOTU2MTYwciAmJiAkP3VuaXQwICBcCisgICJzdGttb2RlIG1vZGlkPTA7IFwKKyAgIHcgbW9kcG9ydF9tYXAgMSAxIEhJR0lHX1BPUlRfQklUTUFQPTB4NjAwMDAwMDA7IFwKKyAgIHRydW5rIGFkZCBpZD0xMjggcj0zIHBibT1oZzAtaGcxIgorCitpZiAkP2JjbTk1NjE2MHIgJiYgJD91bml0MSAgXAorICAic3RrbW9kZSBtb2RpZD0xOyBcCisgICB3IG1vZHBvcnRfbWFwIDAgMSBISUdJR19QT1JUX0JJVE1BUD0weGMwMDAwMDA7IFwKKyAgIHRydW5rIGFkZCBpZD0xMjggcj0zIHBibT1oZzAtaGcxIgorCisjIGlmIGVuYWJsZV9wb2UgaXMgc2V0LCB0aGVuIGVuYWJsZSB0aGUgUE9FIHByb2Nlc3NvciBmb3IKKyMgZWl0aGVyIEZpcmVib2x0IG9yIERyYWNvMTUgcGxhdGZvcm0KK2lmICQ/dW5pdDAgJiYgJD9lbmFibGVfcG9lICYmICQ/ZmJwb2UgfHwgJD9kcmFjMTUgXAorICAgICAgICAiJGVjaG8gcmM6IEVuYWJsaW5nIFBPRSAuLi47IFwKKyAgICAgICAgIHBvZXNlbCByZXNldDsgXAorICAgICAgICAgaTJjIHByb2JlIHF1aWV0OyBcCisgICAgICAgICB4cG9lIHZlcmJvc2Ugb2ZmOyBcCisgICAgICAgICB4cG9lIHBvd2VyICRwb2Vwb3dlcjsgXAorICAgICAgICAgeHBvZSB2ZXJib3NlIG9uOyBcCisgICAgICAgICBwb2VzZWwgZW5hYmxlIgorCisjIG1hcmsgdGhpcyB1bml0IHNvIHRoYXQgc3Vic2VxdWVudCByYyBydW5zIGFyZSBxdWlldAorc2V0ZW52IHJjJHVuaXQgMQorCitpZiAkP21hY3NlYyAnXAorICAgIG1hY3NlYyBzeW5jOyBcCisgICAgJGVjaG8gInJjOiBNQUNTRUMgQ0xJIEVuYWJsZWQiJworCisjIGNhY2hlIGEgY29weSBvZiByYy5zb2MgaW4gbWVtb3J5CityY2NhY2hlIGFkZHEgcmMuc29jCisKKyMgc2V0dXAgY2hhc3NpcyBpZiByZXF1ZXN0ZWQKK2lmICEiZXhwciAkP2F1dG9jaGFzc2lzMiAmJiAkdW5pdCA9PSAkdW5pdHMgLSAxIiBcCisgICAgInNldGVudiBjaGFzc2lzMl9ub19yYyAxOyBcCisgICAgIHJjbG9hZCBjMnN3aXRjaC5zb2M7IFwKKyAgICAgc2V0ZW52IGNoYXNzaXMyX25vX3JjOyBcCisgICAgIgorCisjIHN0YXJ0IHN0YWNraW5nIGlmIHJlcXVlc3RlZAoraWYgISJleHByICQ/YXV0b3N0YWNrICYmICR1bml0ID09ICR1bml0cyAtIDEiIFwKKwkicmNsb2FkIHN0ay5zb2MiCisKK2lmICEiZXhwciAkP2FlZGV2ICsgMCIgJiYgISJleHByICR1bml0ID09ICR1bml0cyAtIDEiIFwKKyAgICAgICAiYWVkZXYgaW5pdCIKKworIyBodXJyaWNhbmUgNDhwIEZFIHBsYXRmb3JtIExFRCBzZXR1cCBmb3IgNTYxNDZfQTAgYW5kIDU2MTQ3X0EwIGJvYXJkCisjIChlbmFibGVkIGJ5IGFkZGluZyB0aGUgcHJvcGVydHkgImZlX2h1XzQ4cD0xIikKKyMKK2lmICQ/ZmVfaHVfNDhwICYmICQ/QkNNNTYxNDYgfHwgJD9CQ001NjE0NyBcCisgICAgInBoeSBmZTAgMHgxZiAweDAwOGI7IFwKKyAgICAgcGh5IGZlMCAweDFhIDB4M2YwOTtcCisgICAgIHBoeSBmZTggMHgxZiAweDAwOGI7IFwKKyAgICAgcGh5IGZlOCAweDFhIDB4M2YwOTsgXAorICAgICBwaHkgZmUxNiAweDFmIDB4MDA4YjsgXAorICAgICBwaHkgZmUxNiAweDFhIDB4M2YwOSIKKworIyBlbmFibGUgTEVEIG1hdHJpeCBtb2RlIGZvciBQSFk1NDI5MiBvbiBCQ005NTM0MTFLL1IKK2lmICQ/YmNtOTUzNDExIFwKKyAgICAicmNsb2FkIGdoX2JjbTk1MzQxMXguc29jIgorCitpZiAkP3NpbXVsYXRvciBcCisgICAgJ2VjaG8gLW4gIkNoaXAgaW5pdCBmaW5pc2hlcyBhdDogIjtkYXRlJwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9zdms0L3JlbG9hZC5zb2MgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvcmVsb2FkLnNvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDhhNTBlCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9zdms0L3JlbG9hZC5zb2MKQEAgLTAsMCArMSw4IEBACisjCisjICRJZDogcmVsb2FkLWR1bmUuc29jLHYgMS4xIDIwMTEvMTIvMTMgMTU6Mzc6MTMgYXNzYWYgRXhwICQKKyMKKyMgJENvcHlyaWdodDogKGMpIDIwMDYgQnJvYWRjb20gQ29ycC4KKyMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4kCisKK3NldGVudiB3YXJtYm9vdCAxCityY2xvYWQgcmMuc29jCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3JjL3N2azQvc3RhcnRfaW5nLnNoIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9zdms0L3N0YXJ0X2luZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42Zjc5ZmIzCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9yYy9zdms0L3N0YXJ0X2luZy5zaApAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorL2Jyb2FkY29tL21rX2JjbV9ub2RlLnNoCisvYnJvYWRjb20vYmNtLnVzZXIKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9zZGstYmFsLTYuNS43LnBhdGNoIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9zZGstYmFsLTYuNS43LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjhmMDEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3Nkay1iYWwtNi41LjcucGF0Y2gKQEAgLTAsMCArMSwxMzk0IEBACitkaWZmIC1OYXVyIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9pbmNsdWRlL2FwcGwvZGlhZy9iYWxfY21kLmggc2RrLWFsbC02LjUuNy9pbmNsdWRlL2FwcGwvZGlhZy9iYWxfY21kLmgKKy0tLSAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41LjcvaW5jbHVkZS9hcHBsL2RpYWcvYmFsX2NtZC5oCTE5NzAtMDEtMDEgMDI6MDA6MDAuMDAwMDAwMDAwICswMjAwCisrKysgc2RrLWFsbC02LjUuNy9pbmNsdWRlL2FwcGwvZGlhZy9iYWxfY21kLmgJMjAxNy0wMS0yNiAxMToyNDoxOC4yNTEyNzg0ODkgKzAyMDAKK0BAIC0wLDAgKzEsMjIgQEAKKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisrICogIAorKyAqICBDb3B5cmlnaHQgMjAxNiAtIEJyb2FkY29tIENvcnBvcmF0aW9uCisrICogICAgCisrICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIAorKworKyNpZm5kZWYgQkFMX0NNRF9ICisrI2RlZmluZSBCQUxfQ01EX0gKKysKKysjaW5jbHVkZSA8YXBwbC9kaWFnL3NoZWxsLmg+CisrIAorK3N0YXRpYyBjaGFyIGNtZF9iYWxfdXNhZ2VbXSA9IAorKyAgICAiYmFsIFtjbWRdXG5cdCIKKysgICAgIkNvbW1hbmRzOlxuXHQiCisrICAgICIgIHRyYXBfdGFyZ2V0IDx0YXJnZXRfaXA6cG9ydD4gIC0gU2V0IGEgcmVtb3RlIGlwIGFuZCBwb3J0IHRvIHJlY2VpdmUgbG9jYWwgY3B1IHRyYXBwZWQgcGFja2V0c1xuXHQiCisrICAgICIgIHRyYXBfcmVjZWl2ZSA8c2VuZGVyX2lwOnBvcnQ+IC0gU2V0IGEgbG9jYWwgcG9ydCB0byByZWNlaXZlIHJlbW90ZSBzZW5kZXJfaXAgbWVzc2FnZXMgXG5cdCIKKysgICAgIlxuXHQiCisrICAgICJXaGVuIGNhbGxlZCB3aXRoIG5vIHBhcmFtZXRlcnMsIGluaXRpYWxpemUgdGhlIEJBTCBCQ00gQXBpIGFuZCBlbnRlciB0aGUgYmFsIHN1Yi1zaGVsbC5cbiI7CisrCisrY21kX3Jlc3VsdF90IGNtZF9iYWwoaW50IHVuaXQsIGFyZ3NfdCAqYXJncyk7CisrCisrI2VuZGlmICAgIAorZGlmZiAtTmF1ciAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41LjcvaW5jbHVkZS9iY20vcnguaCBzZGstYWxsLTYuNS43L2luY2x1ZGUvYmNtL3J4LmgKKy0tLSAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41LjcvaW5jbHVkZS9iY20vcnguaAkyMDE2LTEyLTAxIDA1OjE1OjA1LjAwMDAwMDAwMCArMDIwMAorKysrIHNkay1hbGwtNi41LjcvaW5jbHVkZS9iY20vcnguaAkyMDE3LTAxLTI2IDExOjMwOjEyLjk2MDEyMjE2NiArMDIwMAorQEAgLTE3ODksNSArMTc4OSwxOCBAQAorICAgICBiY21fcnhfY29zcV9tYXBwaW5nX3QgKnJ4X2Nvc3FfbWFwcGluZyk7CisgCisgI2VuZGlmIC8qIEJDTV9ISURFX0RJU1BBVENIQUJMRSAqLworKyAKKysvKgorKyAqIEJBTCBwYXRjaCB0byBhbGxvdyBSUEMgcmVnaXN0ZXIgcGFja2V0IHJlY2VpdmUgY2FsbGJhY2sKKysgKi8KKyt0eXBlZGVmIHZvaWQgKCpkcHBfcnhfY2JfZikgKAorKyAgICAgICAgaW50IHVuaXQsCisrICAgICAgICBpbnQgcG9ydCwKKysgICAgICAgIGludCByZWFzb24sCisrICAgICAgICB1bnNpZ25lZCBjaGFyICpwa3QsCisrICAgICAgICBpbnQgcGt0X2xlbik7CisrCisrZXh0ZXJuCisrdm9pZCBkcHBfZGZ0X3R4X2NiKGludCB1bml0LCBpbnQgcG9ydCwgaW50IHJlYXNvbiwgdW5zaWduZWQgY2hhciAqcGF5bG9hZCwgaW50IHBheWxvYWRfbGVuKTsKKyAKKyAjZW5kaWYgLyogX19CQ01fUlhfSF9fICovCitkaWZmIC1OYXVyIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9tYWtlL01ha2UuY29uZmlnIHNkay1hbGwtNi41LjcvbWFrZS9NYWtlLmNvbmZpZworLS0tIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9tYWtlL01ha2UuY29uZmlnCTIwMTYtMTItMDEgMDU6MTY6MTYuMDAwMDAwMDAwICswMjAwCisrKysgc2RrLWFsbC02LjUuNy9tYWtlL01ha2UuY29uZmlnCTIwMTctMDEtMjYgMTE6MzQ6MzkuNTUzNDk0NTk5ICswMjAwCitAQCAtMzIsNiArMzIsMTMgQEAKKyAjIH0KKyBlbmRpZgorIAorK2lmZXEgKCR7QlVJTERfSU5HX0FTX0xJQn0sMSkKKytDRkdGTEFHUyArPSAtREJVSUxEX0lOR19BU19MSUIgLUROT19DVFJMX0MKKytlbmRpZgorK2lmZXEgKCR7Q09ORklHX1NXSVRDSF9SUEN9LHkpCisrQ0ZHRkxBR1MgKz0gLURDT05GSUdfU1dJVENIX1JQQworK2VuZGlmCisrCisgIworICMgU2V0IGEgZGVmYXVsdCB0YXJnZXQgaWYgb25lIGlzIG5vdCBzZXQuIElmIG92ZXJyaWRlLXRhcmdldCBpcyBzZXQsCisgIyB0aGVuIHRoZSB0YXJnZXQgd2lsbCBiZWNvbWUgb3ZlcnJpZGUtdGFyZ2V0IGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZAorZGlmZiAtTmF1ciAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41LjcvbWFrZS9NYWtlLmxvY2FsLmJhbCBzZGstYWxsLTYuNS43L21ha2UvTWFrZS5sb2NhbC5iYWwKKy0tLSAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41LjcvbWFrZS9NYWtlLmxvY2FsLmJhbAkxOTcwLTAxLTAxIDAyOjAwOjAwLjAwMDAwMDAwMCArMDIwMAorKysrIHNkay1hbGwtNi41LjcvbWFrZS9NYWtlLmxvY2FsLmJhbAkyMDE3LTAxLTI2IDExOjM2OjQzLjcyMjczNTc1MiArMDIwMAorQEAgLTAsMCArMSwzMCBAQAorKyNGRUFUVVJFX0xJU1QgOj0gQ0lOVCBMMyBJMkMgTUVNX1NDQU4gRURJVExJTkUgVEVTVCBCQ01fU0FMX1BST0ZJTEUgQ1VTVE9NRVIgQ0hBU1NJUyBSQ1BVIEFUUFRSQU5TX1NPQ0tFVCBEVU5FX1VJIElOVFIgQVBJTU9ERSBQVFAgS0JQCisrRkVBVFVSRV9MSVNUIDo9IENJTlQgTDMgSTJDIE1FTV9TQ0FOIEVESVRMSU5FIFRFU1QgQkNNX1NBTF9QUk9GSUxFIENIQVNTSVMgUkNQVSBBVFBUUkFOU19TT0NLRVQgRFVORV9VSSBJTlRSIEFQSU1PREUgUFRQIAorKworK0RFQlVHX0NGTEFHUz0tV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudAorKworK0JDTV9QVExfU1BUPTEKKysKKytBTExfRFBQX0NISVBTID0gMQorK0FMTF9ERkVfQ0hJUFMgPSAxCisrCisrIyBJbmNsdWRlcyBYTUwgbGlicmFyeSBhbmQgZW5hYmxlcyB1c2Ugb2YgImRpYWcgcHAgZHVtcCIgdXRpbGl0eSBmb3IgUFAgaW1wb3J0L2V4cG9ydCBmYWNpbGl0aWVzIAorK0RBVEFJT19TVVBQT1JUID0gMQorK0tFUk5fVkVSPTMuNy4xMAorKworK0NGR0ZMQUdTICs9IC1EU1RBVElDPXN0YXRpYworK0NGR0ZMQUdTICs9IC1EQkNNX1dBUk1fQk9PVF9TVVBQT1JUCisrQ0ZHRkxBR1MgKz0gLURCQ01fV0FSTV9CT09UX1NVUFBPUlRfU1dfRFVNUAorK0NGR0ZMQUdTICs9IC1EQkNNX0VBU1lfUkVMT0FEX1dCX0NPTVBBVF9TVVBQT1JUCisrQ0ZHRkxBR1MgKz0gLURCQ01fQ09OVFJPTF9BUElfVFJBQ0tJTkcKKytDRkdGTEFHUyArPSAtRF9fRFVORV9MSU5VWF9CQ01fQ1BVX1BDSUVfXworK0NGR0ZMQUdTICs9IC1EUEhZU19BRERSU19BUkVfNjRCSVRTIC1EU0FMX0JERV8zMkJJVF9VU0VSXzY0QklUX0tFUk5FTAorK0NGR0ZMQUdTICs9IC1EX1NJTVBMRV9NRU1PUllfQUxMT0NBVElPTl89MCAtRFVTRV9MSU5VWF9CREVfTU1BUD0xCisrQ0ZHRkxBR1MgKz0gLURTQ0FDSEVfQ1JDX0NIRUNLCisrCisrQ0ZHRkxBR1MgKz0gLURCUk9BRENPTV9TVksKKysKKysjS0JQX0RFVklDRSA6PSBLQlBfQUxHCisrCisrVkVORE9SX0xJU1Q9Q1VTVE9NRVI3OCBCUk9BRENPTSBETlgKKysKK2RpZmYgLU5hdXIgL3Byb2plY3RzL05UU1dfU1dfUFJKUy9FeHRlcm5hbFJlbGVhc2VzL0JDTS82LjUuNy9nYS9zZGstYWxsLTYuNS43L21ha2UvTWFrZWZpbGUudW5peC1saW51eCBzZGstYWxsLTYuNS43L21ha2UvTWFrZWZpbGUudW5peC1saW51eAorLS0tIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9tYWtlL01ha2VmaWxlLnVuaXgtbGludXgJMjAxNi0xMi0wMSAwNToxNjoxNy4wMDAwMDAwMDAgKzAyMDAKKysrKyBzZGstYWxsLTYuNS43L21ha2UvTWFrZWZpbGUudW5peC1saW51eAkyMDE3LTAxLTI2IDEzOjE2OjM1LjAzNTgyODY0OCArMDIwMAorQEAgLTQ3LDcgKzQ3LDcgQEAKKyAKKyAKKyAjIExpbnV4CistTElCUz0gLWxuc2wgLWxwdGhyZWFkIC1sbSAtbHJ0CisrTElCUz0gLWxuc2wgLXB0aHJlYWQgLWxtIC1scnQKKyBDRkdGTEFHUyArPSAtREJDTV9QTEFURk9STV9TVFJJTkc9XCJ1bml4LWxpbnV4XCIKKyAKKyAjIEZvciBHQ0MgNC4yLngsIGFkZCAtV25vLWFkZHJlc3MKK2RpZmYgLU5hdXIgL3Byb2plY3RzL05UU1dfU1dfUFJKUy9FeHRlcm5hbFJlbGVhc2VzL0JDTS82LjUuNy9nYS9zZGstYWxsLTYuNS43L21ha2UvTWFrZWZpbGUudW5peC1saW51eC02NCBzZGstYWxsLTYuNS43L21ha2UvTWFrZWZpbGUudW5peC1saW51eC02NAorLS0tIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9tYWtlL01ha2VmaWxlLnVuaXgtbGludXgtNjQJMjAxNi0xMi0wMSAwNToxNjoxNy4wMDAwMDAwMDAgKzAyMDAKKysrKyBzZGstYWxsLTYuNS43L21ha2UvTWFrZWZpbGUudW5peC1saW51eC02NAkyMDE3LTAxLTI2IDEzOjE3OjM1Ljk1OTQ0NjA1NCArMDIwMAorQEAgLTQ4LDcgKzQ4LDcgQEAKKyBGRUFUVVJFX0VYQ0xVREVfTElTVCA9ICQoc29ydCAkKF9GRUFUVVJFX0VYQ0xVREVfTElTVCkpCisgCisgIyBMaW51eAorLUxJQlM9IC1sbnNsIC1scHRocmVhZCAtbG0gLWxydAorK0xJQlM9IC1sbnNsIC1wdGhyZWFkIC1sbSAtbHJ0CisgCisgQ0ZHRkxBR1MgKz0gLURCQ01fUExBVEZPUk1fU1RSSU5HPVwidW5peC1saW51eC02NFwiCisgCitkaWZmIC1OYXVyIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9tYWtlL01ha2VmaWxlLnVuaXgtbGludXh+IHNkay1hbGwtNi41LjcvbWFrZS9NYWtlZmlsZS51bml4LWxpbnV4fgorLS0tIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9tYWtlL01ha2VmaWxlLnVuaXgtbGludXh+CTE5NzAtMDEtMDEgMDI6MDA6MDAuMDAwMDAwMDAwICswMjAwCisrKysgc2RrLWFsbC02LjUuNy9tYWtlL01ha2VmaWxlLnVuaXgtbGludXh+CTIwMTctMDEtMjYgMTM6MTY6MzQuOTczODI5MDM4ICswMjAwCitAQCAtMCwwICsxLDYwIEBACisrIyAkSWQ6IE1ha2VmaWxlLnVuaXgtbGludXgsdiAxLjExIEJyb2FkY29tIFNESyAkCisrIyAkQ29weXJpZ2h0OiAoYykgMjAxNiBCcm9hZGNvbS4KKysjIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuJAorKyMKKysjIEJ1aWxkIHJ1bGVzIGZvciBMaW51eC94ODYgKExpdHRsZSBFbmRpYW4pIHdpdGggUExJIHN1cHBvcnQKKysKKytpbmNsdWRlICR7U0RLfS9tYWtlL01ha2VmaWxlLnVuaXgtY29tbW9uCisrCisrIyBXaGVuIHVzaW5nIEdEQiBvbiBMaW51eCwgeW91IG1heSB3YW50IHRvIHVzZSAic2V0ZW52IEdEQiAxIiB0byBkaXNhYmxlCisrIyBlZGl0bGluZS4gIEZvciBiZXN0IHJlc3VsdHMgcHV0ICJzZXQgZW52aXJvbm1lbnQgR0RCIDEiIGluIHlvdXIgLmdkYmluaXQuCisrCisrIyBMaW51eC1zcGVjaWZpYyBDb25maWd1cmF0aW9uIEZsYWdzCisrCisrRU5ESUFOX0RFRiA9IC1ETEVfSE9TVD0xCisrCisrIyBOb3RlcyBvbiBBTUQgQXRobG9uIDY0LWJpdAorKyMKKysjIENvbXBpbGVzIG9uIHg4Nl82NCBkZWZhdWx0IHRvIDMyLWJpdCBlbXVsYXRpb24gdW5sZXNzIDY0LWJpdCBtb2RlCisrIyBpcyBzcGVjaWZpY2FsbHkgcmVxdWVzdGVkIGluIE1ha2UubG9jYWwgYnkgdW5jb21tZW50aW5nIHRoZSB0d28gZGVmaW5lcworKyMgZm9yIFBUUlNfQVJFXzY0QklUUyBhbmQgTE9OR1NfQVJFXzY0QklUUy4KKysjCisrIyBOb3RlIHRoYXQgdGhlIGNvZGUgYmFzZSB3aWxsIGNvbXBpbGUgaW4gNjQtYml0IG1vZGUsIGJ1dCB3aWxsIG5vdCBydW4KKysjIGNvcnJlY3RseSBiZWNhdXNlIG1hbGxvYygpIGNhbiByZXR1cm4gdmFsdWVzID4zMiBiaXRzIGFuZCB0aGUgUExJU0lNCisrIyBwcm90b2NvbCBvbmx5IHN1cHBvcnRzIDMyLWJpdCBhZGRyZXNzZXMuCisrCisraWZlcSAoJChzaGVsbCB1bmFtZSAtbSkseDg2XzY0KQorKyBpZmVxICgsJChmaW5kc3RyaW5nIC1EUFRSU19BUkVfNjRCSVRTLCQoQ0ZHRkxBR1MpKSkKKysgIENDID0gJHtIQ0N9IC1tMzIKKysgIENYWCA9IGcrKyAtbTMyCisrIGVsc2UKKysgIENDID0gJHtIQ0N9CisrICBDWFggPSBnKysKKysgZW5kaWYKKytlbmRpZgorKworK0xECT0gbGQKKytBUgk9IGFyCisrQVJGTEFHUwk9IC1yYworK1NUUklQCT0gc3RyaXAKKytSQU5MSUIgID0gcmFubGliCisrCisrIyBGaWx0ZXIgb3V0IGZlYXR1cmVzIHRoYXQgY2Fubm90IG9yIHNob3VsZCBub3QgYmUgc3VwcG9ydGVkIGluIExpbnV4CisraWZkZWYgRVNXX0NISVBTCisrX0ZFQVRVUkVfRVhDTFVERV9MSVNUICs9IE9PQl9SQ1BVCisrZW5kaWYKKytGRUFUVVJFX0VYQ0xVREVfTElTVCA9ICQoc29ydCAkKF9GRUFUVVJFX0VYQ0xVREVfTElTVCkpCisrCisrCisrIyBMaW51eAorK0xJQlM9IC1sbnNsIC1scHRocmVhZCAtbG0gLWxydAorK0NGR0ZMQUdTICs9IC1EQkNNX1BMQVRGT1JNX1NUUklORz1cInVuaXgtbGludXhcIgorKworKyMgRm9yIEdDQyA0LjIueCwgYWRkIC1Xbm8tYWRkcmVzcworK0dDQ19NQUpPUl9WRVIgID0gJChzaGVsbCBlY2hvIHwkKENDKSAtZE0gLUUgLXwgZ3JlcCBfX0dOVUNfXyB8IGN1dCAtZCcgJyAtZjMpCisrR0NDX01JTk9SX1ZFUiAgPSAkKHNoZWxsIGVjaG8gfCQoQ0MpIC1kTSAtRSAtfCBncmVwIF9fR05VQ19NSU5PUl9fIHwgY3V0IC1kJyAnIC1mMykKKytpZmVxICgke0dDQ19NQUpPUl9WRVJ9LCA0KQorK2lmZXEgKCR7R0NDX01JTk9SX1ZFUn0sIDIpCisrQkNNX0VYVFJBX0NDX0NGTEFHUyAgID0gLVduby1hZGRyZXNzCisrZW5kaWYKKytlbmRpZgorZGlmZiAtTmF1ciAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41LjcvbWFrZS9NYWtlZmlsZS51bml4LW5ldGJzZCBzZGstYWxsLTYuNS43L21ha2UvTWFrZWZpbGUudW5peC1uZXRic2QKKy0tLSAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41LjcvbWFrZS9NYWtlZmlsZS51bml4LW5ldGJzZAkyMDE2LTEyLTAxIDA1OjE2OjE3LjAwMDAwMDAwMCArMDIwMAorKysrIHNkay1hbGwtNi41LjcvbWFrZS9NYWtlZmlsZS51bml4LW5ldGJzZAkyMDE3LTAxLTI2IDEzOjEzOjAzLjg4NDE1NjI1MSArMDIwMAorQEAgLTI3LDcgKzI3LDcgQEAKKyBGRUFUVVJFX0VYQ0xVREVfTElTVCA9ICQoc29ydCAkKF9GRUFUVVJFX0VYQ0xVREVfTElTVCkpCisgCisgIyBOZXRCU0QKKy1MSUJTPSAtbHB0aHJlYWQgLWxtIC1sc2VtCisrK0xJQlM9IC1wdGhyZWFkIC1sbSAtbHNlbQorIAorIENGR0ZMQUdTICs9IC1EQkNNX1BMQVRGT1JNX1NUUklORz1cInVuaXgtbmV0YnNkXCIKKyAKK2RpZmYgLU5hdXIgL3Byb2plY3RzL05UU1dfU1dfUFJKUy9FeHRlcm5hbFJlbGVhc2VzL0JDTS82LjUuNy9nYS9zZGstYWxsLTYuNS43L21ha2UvTWFrZWZpbGUudW5peC11c2VyIHNkay1hbGwtNi41LjcvbWFrZS9NYWtlZmlsZS51bml4LXVzZXIKKy0tLSAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41LjcvbWFrZS9NYWtlZmlsZS51bml4LXVzZXIJMjAxNi0xMi0wMSAwNToxNjoxNy4wMDAwMDAwMDAgKzAyMDAKKysrKyBzZGstYWxsLTYuNS43L21ha2UvTWFrZWZpbGUudW5peC11c2VyCTIwMTctMDEtMjYgMTM6MTQ6MjkuMjg5NjE4OTY3ICswMjAwCitAQCAtNDIsNyArNDIsNyBAQAorIE9TVFlQRSA9IExJTlVYCisgCisgIyBMaW51eAorLUxJQlM9IC1sbnNsIC1scHRocmVhZCAtbG0gLWxydAorK0xJQlM9IC1sbnNsIC1wdGhyZWFkIC1sbSAtbHJ0CisgCisgIworICMgT1JJR0lOIGlzIHVzZWQgdG8gT3B0aW9uYWxseSBzZWxlY3QgZGlmZmVyZW50IENGTEFHUy4gSXQgaXMgdXNlZCB0byBpbXBvcnQKK2RpZmYgLU5hdXIgL3Byb2plY3RzL05UU1dfU1dfUFJKUy9FeHRlcm5hbFJlbGVhc2VzL0JDTS82LjUuNy9nYS9zZGstYWxsLTYuNS43L3NyYy9hcHBsL2RpYWcvYmFsX2NtZC5jIHNkay1hbGwtNi41Ljcvc3JjL2FwcGwvZGlhZy9iYWxfY21kLmMKKy0tLSAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41Ljcvc3JjL2FwcGwvZGlhZy9iYWxfY21kLmMJMTk3MC0wMS0wMSAwMjowMDowMC4wMDAwMDAwMDAgKzAyMDAKKysrKyBzZGstYWxsLTYuNS43L3NyYy9hcHBsL2RpYWcvYmFsX2NtZC5jCTIwMTctMDEtMjYgMTE6Mzg6MjAuNTc0MTQ0NDEwICswMjAwCitAQCAtMCwwICsxLDgzNyBAQAorKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKysgKiAKKysgKiBDb3B5cmlnaHQgMjAxNS0gQnJvYWRjb20gQ29ycG9yYXRpb24KKysgKiBUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uCisrICogYW5kL29yIGl0cyBsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvcgorKyAqIGRpc3RyaWJ1dGVkIHB1cnN1YW50IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLAorKyAqIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQgYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbgorKyAqICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4gYW4gQXV0aG9yaXplZCBMaWNlbnNlLAorKyAqIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodCB0byB1c2UsIG9yCisrICogd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorKyAqIGV4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbAorKyAqIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQKKysgKiBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFIE5PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORAorKyAqIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkgQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFCisrICogU09GVFdBUkUuCisrICogICAKKysgKiBFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorKyAqICAgCisrICogMS4gIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisrICogY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisrICogYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisrICogdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKysgKiBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisrICogICAgCisrICogMi4gIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQKKysgKiAiQVMgSVMiIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLAorKyAqIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUgorKyAqIE9USEVSV0lTRSwgV0lUSCBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWQorKyAqIERJU0NMQUlNUyBBTlkgQU5EIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwKKysgKiBOT05JTkZSSU5HRU1FTlQsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsCisrICogQUNDVVJBQ1kgT1IgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IKKysgKiBDT1JSRVNQT05ERU5DRSBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQKKysgKiBPRiBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorKyAqICAgCisrICogMy4gIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTQorKyAqIE9SIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKysgKiBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkgV0FZCisrICogUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTiBJRgorKyAqIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsgT1IgKGlpKQorKyAqIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFIFNPRlRXQVJFCisrICogSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUyBTSEFMTCBBUFBMWQorKyAqIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkgTElNSVRFRAorKyAqIFJFTUVEWS4KKysgKiAgIAorKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisrIAorKy8qKgorKyAqIEBmaWxlIGJhbF9jbWQuY18KKysgKiBAYnJpZWYgQkFMIElORyBDTEkgY29tbWFuZHMgc3VwcG9ydCBTREsgYWNjZXNzIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSByZWd1bGFyIENMSQorKyAqIFRoZSBCQUwgQ0xJIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIENMSQorKyAqIG1vZHVsZS4gVGhlIENMSSBtb2R1bGUgY2FuIGJlIHVzZWQgYXMgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG1hbmFnZW1lbnQKKysgKiBpbnRlcmZhY2UgZm9yIHRoZSBCQUwgU3dpdGNoIFV0aWwuIEJBTCBTd2l0Y2ggVXRpbCBjb25maWd1cmF0aW9uIGNhbiBiZSBzcGVjaWZpZWQKKysgKiB1c2luZyBhIHNlcmllcyBvZiBCQUwgQ0xJIGNvbW1hbmRzLiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoZSBDTEkgaXMgdG8gcHJvdmlkZQorKyAqIElORyBBUEkgYWNjZXNzIHRoYXQgYXJlIG5vdCBub3JtYWxseSBhdmFpbGFibGUgdGhyb3VnaCBwdWJsaWMgQVBJLCBzdWNoIGFzIFJQQworKyAqIGFjY2VzcyB0byBJTkcgZmVhdHVyZXMgdGhhdCBhcmUgZGVlcCBpbiBTREsgc3RhY2suCisrICogCisrICoqLworKworKyAvKkB7Ki8KKysgCisrLyogLS0tIHN5c3RlbSBpbmNsdWRlcyAtLS0gKi8KKysKKysjaW5jbHVkZSA8dW5pc3RkLmg+CisrI2luY2x1ZGUgPHN0ZGlvLmg+CisrI2luY2x1ZGUgPHN0cmluZy5oPgorKyNpbmNsdWRlIDxjdHlwZS5oPgorKyNpbmNsdWRlIDxzdGRsaWIuaD4KKysjaW5jbHVkZSA8YXBwbC9kaWFnL3NoZWxsLmg+CisrI2luY2x1ZGUgPGFwcGwvZGlhZy9wYXJzZS5oPgorKyNpbmNsdWRlIDxzYWwvYXBwbC9zYWwuaD4KKysjaW5jbHVkZSA8c2FsL2FwcGwvZWRpdGxpbmUvZWRpdGxpbmUuaD4KKysjaW5jbHVkZSA8ZXJybm8uaD4KKysjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisrI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKysjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKysjaW5jbHVkZSA8YmNtL3J4Lmg+CisrI2luY2x1ZGUgPGJjbS9lcnJvci5oPgorKyNpbmNsdWRlIDxiY20vc3RhY2suaD4KKysKKysjZGVmaW5lIEJBTF9DTElfVkVSU0lPTiAgIjEuMCIKKysKKysvKiAtLS0gcHJvamVjdCBpbmNsdWRlcyAtLS0gKi8KKytleHRlcm4gaW50IHN0YXJ0X3RyYXBfc2VydmljZShjaGFyICppcF9wb3J0KTsKKytleHRlcm4gaW50IHN0YXJ0X2hvc3RfbGlzdGVuZXIoY2hhciAqaXBfcG9ydCk7CisrCisrLyogLS0tIGxvY2FsIHN0YXRpYyBjb25zdGFudHMgLS0tKi8KKysjZGVmaW5lIEJBTF9TV0lUQ0hfQ0xJX0lQX0xFTiAxMjgKKyt0eXBlZGVmIHN0cnVjdCBiYWxfc3dpdGNoX2NsaV9jZmdfdAorK3sKKysgICBjaGFyIHRyYXBfdGFyZ2V0W0JBTF9TV0lUQ0hfQ0xJX0lQX0xFTl07ICAgICAgICAgICAvKiByZW1vdGUgaXA6cG9ydCBhZGRyZXNzIHdoZXJlIHRoZSB0cmFwcGVkIHBhY2tldCBzZW50ICovCisrICAgY2hhciB0cmFwX3JlY2VpdmVbQkFMX1NXSVRDSF9DTElfSVBfTEVOXTsgICAgICAgICAgLyogcmVtb3RlIGlwIHdoZXJlIHRoZSBsb2NhbCBwb3J0IHJlY2VpdmUgbWVzc2FnZSAgKi8KKyt9YmFsX3N3aXRjaF9jbGlfY2ZnX3Q7CisrCisrc3RhdGljIGJhbF9zd2l0Y2hfY2xpX2NmZ190IGdfY3VyX2N0eDsKKysKKytzdGF0aWMgYmFsX3N3aXRjaF9jbGlfY2ZnX3QgKmdwX2N1cl9jdHggPSAmZ19jdXJfY3R4OworKworK2VudW0KKyt7CisrICAgIEJBTF9SRUFTT05fU0VORF9UT19OTkkgPSAxLAorKyAgICBCQUxfUkVBU09OX1NFTkRfVE9fUE9OCisrfTsKKysgICAgICAKKysvKioKKysgKiAgKiBAYnJpZWYgTWF4aW11bSBudW1iZXIgb2YgYXJndW1lbnRzIHN1cHBvcnRlZCBieSB0aGUgJ2JhbCcgQ0xJIGNvbW1hbmQKKysgKiAgICovCisrI2RlZmluZSBNQVhfQVJHUyAxMAorKworKy8qKgorKyAqKiBAYnJpZWYgQkFMIENMSSBoZWxwIHRleHQKKysgKiovCisrI2RlZmluZSBIRUxQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrImV4aXQgICAgICAgICAgLSBFeGl0IHRoZSBCQUwgc3ViLXNoZWxsXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrInNob3cgICAgICAgICAgLSBTaG93IGN1cnJlbnQgc2V0dGluZ3NcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrInRyYXBfdGFyZ2V0ICAgLSByZWdpc3RlciBjYWxsYmFjayBhbmQgc2VuZCBDUFUgdHJhcHBlZCBwYWNrZXRzIHRvIHJlbW90ZSBJUDpQT1JUXG4iICAgICAgICAgICAgICBcCisrInRyYXBfcmVjZWl2ZSAgLSBTdGFydCBhIHJlY2VpdmluZyB0aHJlYWQgdG8gbGlzdGVuIG9uIFBPUlQgZm9yIG1lc3NhZ2VzIGZyb20gcmVtb3RlIElQIFxuIiAgICAgICBcCisrCisrCisrLyoqCisrICoqIEBicmllZiBCQUwgU3dpdGNoIEFwcCBoZWxwIHRleHQgc3BlY2lmaWMgdG8gJ3Nob3cnIGNvbW1hbmRzCisrICoqLworKyNkZWZpbmUgU0hPV19IRUxQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisrInNob3cgY29uZmlnICAgLSBEaXNwbGF5IHRoZSBCQUwgQ0xJIGNvbmZpZ3VyYXRpb25cbiIgICAgICAgICAgIFwKKysic2hvdyB2ZXJzaW9uICAtIERpc3BsYXkgdGhlIEJBTCBCQ00gU0RLIHZlcnNpb25cbiIgICAgICAgICAgICAgXAorKworKworKy8qKgorKyAqICBAYnJpZWYgQ0xJIHByb21wdCBzdHJpbmcKKysgKiAqLworK3N0YXRpYyBjaGFyIGdfYmFsX2NsaV9wcm9tcHRbOF07CisrCisrCisrLyoKKysgKiBAYnJpZWYgQkFMIFN3aXRjaCBBcHAgaGVscCB0ZXh0CisrICoKKysgKiBAcmV0dXJuIGNoYXIqICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBwcm9tcHQgdG8gZGlzcGxheQorKyAqKi8KKytzdGF0aWMgY2hhciAqYmFsX3NldF9wcm9tcHQoKQorK3sKKysgICAgc3ByaW50ZihnX2JhbF9jbGlfcHJvbXB0LCAiYmFsPiIpOworKyAgICByZXR1cm4gZ19iYWxfY2xpX3Byb21wdDsKKyt9CisrCisrLyoqCisrICogIEBicmllZiBQYXJzZSBhIGxpbmUgb2YgaW5wdXQgaW50byBhIFBPU0lYLWxpa2UgYXJndW1lbnQgbGlzdAorKyAqIAorKyAqKiBAcGFyYW0gcGFyc2VkX2lucHV0ICBVbnBhcnNlZCBsaW5lIG9mIENMSSBpbnB1dAorKyAqKiBAcGFyYW0gYXJnYyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaW4gdGhlIGxpc3QKKysgKiogQHBhcmFtIGFyZ3YgICAgICAgICBQb2ludGVyIHRvIHRoZSBhcmd1bWVudCBsaXN0CisrICoqIEByZXR1cm4gaW50ICAgICAgICAgTnVtYmVyIG9mIGFyZ3VtZW50IHRoYXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHBhcnNlZAorKyAqKi8KKytpbnQgYmFsX3BhcnNlX2lucHV0IChjaGFyICpwYXJzZWRfaW5wdXQsIGludCAqYXJnYywgY2hhciAqKmFyZ3YpCisreworKyAgICBjaGFyICpzOworKyAgICBpbnQgbGFyZ2M7CisrCisrICAgIGxhcmdjID0gMDsKKysgICAgcyA9IHBhcnNlZF9pbnB1dDsKKysgICAgd2hpbGUgKChsYXJnYyA8IE1BWF9BUkdTKSAmJiAocyAhPSBOVUxMKSAmJiAoKnMgIT0gMCkpCisrICAgIHsKKysgICAgICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCisrICAgICAgICBzICs9IHN0cnNwbiAocywgIiBcdCIpOworKworKyAgICAgICAgLyogTm9uLXdoaXRlc3BhY2UgZm91bmQgKi8KKysgICAgICAgIGlmICgqcyAhPSAwKQorKyAgICAgICAgeyAKKysgICAgICAgICAgICAvKiBBZGQgdGhlIHN0cmluZyB0byB0aGUgYXJndW1lbnQgbGlzdCAqLworKyAgICAgICAgICAgIGFyZ3ZbbGFyZ2MrK10gPSBzOworKworKyAgICAgICAgICAgIC8qIEZpbmQgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgKGlmIGFueS4uLikgKi8KKysgICAgICAgICAgICBzID0gc3RycGJyayAocywgIiBcdCIpOworKyAgICAgICAgICAgIGlmIChzICE9IE5VTEwpCisrICAgICAgICAgICAgeyAKKysgICAgICAgICAgICAgICAgLyogRm91bmQgc29tZSB3aGl0ZSBzcGFjZSwgbnVsbCBvdXQgdGhlIGZpcnN0IHdoaXRlCisrICAgICAgICAgICAgICAgICAgIHNwYWNlIGNoYXJhY3Rlci4gKi8gCisrICAgICAgICAgICAgICAgIGlmIChsYXJnYyA8IE1BWF9BUkdTKQorKyAgICAgICAgICAgICAgICB7CisrICAgICAgICAgICAgICAgICAgICAqcysrID0gMDsKKysgICAgICAgICAgICAgICAgfQorKworKyAgICAgICAgICAgICAgICAvKiBPdGhlcndpc2UsIGRvbid0IG51bGwgdGhlIGxhc3QgcGFyYW0sIHRvIHBhc3MgaXQgb24KKysgICAgICAgICAgICAgICAgICogY29tbWFuZCB0byBwYXJzZSB0aGVtc2VsdmVzIAorKyAgICAgICAgICAgICAgICAgKi8KKysgICAgICAgICAgICB9CisrICAgICAgICB9CisrICAgIH0KKysKKysgICAgKmFyZ2MgPSBsYXJnYzsKKysKKysgICAgcmV0dXJuIGxhcmdjOworK30KKysKKysgLyogQkFMIHBhY2tldF9pbiBmdW5jdGlvbiBhbmQgZGVmaW5pdGlvbnMgKi8KKysgdHlwZWRlZiBzdHJ1Y3QKKysgIHsKKysgICAgICBpbnQgc29ja2V0OworKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworKyAgfXRyYXBfdGFyZ2V0X3Q7CisrICBzdGF0aWMgdHJhcF90YXJnZXRfdCBzX3RhcmdldF9kZXZpY2U7CisrICBzdGF0aWMgaW50IHRhcmdldF9pbml0ID0gMDsKKysgICNkZWZpbmUgREVGQVVMVF9TT1BfQURKICAgIDIgCisrICAjZGVmaW5lIERFRkFVTFRfUkVBU09OX0FESiA0IAorKworKyAgYmNtX3J4X3QgdHJhcF9zZXJ2aWNlX2NiKGludCB1bml0LCBiY21fcGt0X3QgKnBrdCwgdm9pZCAqY29va2llKQorKyAgeworKworKyAgICB1aW50OCAqcF9wYXlsb2FkOworKyAgICBpbnQgZHBwX2hkcl9sZW4sIHBheWxvYWRfbGVuLCBuX3NlbnQ7CisrICAgIHRyYXBfdGFyZ2V0X3QgKnBfdGFyZ2V0X2RldmljZSA9ICh0cmFwX3RhcmdldF90ICopY29va2llOworKyAgICB1aW50MTYgKnBfc3JjX3BvcnQsIGRlZl9zb3A7CisrICAgIHVpbnQzMiAqcF9yZWFzb24sIGRlZl9yZWFzb247CisrICAgIC8qIHNraXAgdGhlIGRwcCBoZWFkZXIgLSAxOSBieXRlcyAqLworKyAgICBwX3BheWxvYWQgPSBwa3QtPl9wa3RfZGF0YS5kYXRhOworKyAgICBkcHBfaGRyX2xlbiA9IHBrdC0+dG90X2xlbiAtIHBrdC0+cGt0X2xlbiArIDA7CisrICAgIHBheWxvYWRfbGVuID0gcGt0LT50b3RfbGVuIC0gZHBwX2hkcl9sZW47CisrICAgIHBfcGF5bG9hZCArPSBkcHBfaGRyX2xlbjsKKysKKysgICAgLyoKKysgICAgICogcmVwbGFjZSBTT1BfQURKIGJ5dGVzIHdpdGggc291cmNlIHBvcnQgaW5mbyBiZWZvcmUgc2VuZAorKyAgICAgKiBhc3N1bWluZyBERUZBVUxUX1NPUF9BREogaXMgYWx3YXlzIDIgYnl0ZXMKKysgICAgICogcmVwbGFjZSBTT1BfUkVBU09OIGJ5dGVzIHdpdGggdHJhcCByZWFzb24gLSBUQkQKKysgICAgICovCisrICAgICBwX3NyY19wb3J0ID0gKHVpbnQxNiAqKShwX3BheWxvYWQgLSBERUZBVUxUX1NPUF9BREopOworKyAgICAgLyogc2F2ZSB0aGUgb3JpZ2luYWwgaW5mbyAqLworKyAgICAgZGVmX3NvcCA9ICoocF9zcmNfcG9ydCk7CisrICAgICAvKiByZXBsYWNlIDIgYnl0ZXMgd2l0aCBpbmdyZXNzIHBvcnQgaW5mbyAqLworKyAgICAgKnBfc3JjX3BvcnQgPSBodG9ucyhwa3QtPnNyY19wb3J0ICYgMHhmZik7IC8qIHBrdC0+c3JjX3BvcnQgaXMgMSBieXRlIGxvbmcgKi8KKysKKysgICAgIHBfcmVhc29uID0gKHVpbnQzMiAqKShwX3BheWxvYWQgLSBERUZBVUxUX1NPUF9BREogLSBERUZBVUxUX1JFQVNPTl9BREopOworKyAgICAgLyogc2F2ZSB0aGUgb3JpZ2luYWwgaW5mbyAqLworKyAgICAgZGVmX3JlYXNvbiA9ICoocF9yZWFzb24pOworKyAgICAgLyogcmVwbGFjZSA0IGJ5dGVzIHdpdGggcmVhc29uIGNvZGUgKi8KKysgICAgICpwX3JlYXNvbiA9IGh0b25sKHBrdC0+cnhfdHJhcF9kYXRhKTsKKysKKysgICAgIG5fc2VudCA9IHNlbmR0byhwX3RhcmdldF9kZXZpY2UtPnNvY2tldCwKKysgICAgICAgICAgICAgICAgICAgICBwX3BheWxvYWQtREVGQVVMVF9TT1BfQURKLURFRkFVTFRfUkVBU09OX0FESiwKKysgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX2xlbitERUZBVUxUX1NPUF9BREorREVGQVVMVF9SRUFTT05fQURKLCAwLAorKyAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJihwX3RhcmdldF9kZXZpY2UtPmFkZHIpLAorKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKysKKysgICAgIC8qIHB1dCBiYWNrIHRoZSBvcmlnaW5hbCB2YWx1ZXMgKi8KKysgICAgICpwX3NyY19wb3J0ID0gZGVmX3NvcDsKKysgICAgICpwX3JlYXNvbiAgID0gZGVmX3JlYXNvbjsKKysKKysgICAgIGlmIChuX3NlbnQgPiAwKQorKyAgICAgICAgIHJldHVybiBCQ01fUlhfSEFORExFRDsKKysgICAgIGVsc2UKKysgICAgICAgICByZXR1cm4gQkNNX1JYX05PVF9IQU5ETEVEOworKyAgfQorKworKyBpbnQgc3RhcnRfdHJhcF9zZXJ2aWNlKCBjaGFyICppcF9wb3J0KSAKKysgIHsKKysgICAgICBpbnQgcmV0LCBwb3J0OworKyAgICAgIGNoYXIgaXBbODBdLCAqY29sOworKworKyAgICAgIGlmKHRhcmdldF9pbml0ID09IDApCisrICAgICAgeworKyAgICAgICAgICBpZigoc190YXJnZXRfZGV2aWNlLnNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCkpIDwgMCkKKysgICAgICAgICAgeworKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworKyAgICAgICAgICB9CisrICAgICAgICAgIHRhcmdldF9pbml0ID0gMTsKKysgICAgICB9CisrICAgICAgLyogZmlsbCBpbiB0cmFnZXQgZGV2aWNlIGluZm8gLSBpcF9wb3J0IGhhcyB0aGUgZm9ybWF0IG9mIGlwOnBvcnQsIHNvIGxvb2sgZm9yICI6IiBmb3Igc2VwYXJhdGlvbiAqLworKyAgICAgIGNvbCA9IHN0cnN0cihpcF9wb3J0LCAiOiIpOworKyAgICAgIHBvcnQgPSBhdG9pKGNvbCsxKTsKKysgICAgICAvKiB0ZXJtaW5hdGUgdGhlIHN0cmluZyBhdCB0aGUgZW5kIG9mIElQIGFkZHJlc3MgKi8KKysgICAgICAqY29sID0gMDsKKysgICAgICBzdHJjcHkoaXAsIGlwX3BvcnQpOworKworKyAgICAgIHNfdGFyZ2V0X2RldmljZS5hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworKyAgICAgIHNfdGFyZ2V0X2RldmljZS5hZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisrICAgICAgc190YXJnZXRfZGV2aWNlLmFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKGlwKTsKKysKKysgICAgICByZXQgPSBiY21fcnhfcmVnaXN0ZXIoMCwgIkNwdSBUcmFwcyIsIHRyYXBfc2VydmljZV9jYiwgNTAsICh2b2lkICopJnNfdGFyZ2V0X2RldmljZSwgQkNNX1JDT19GX0FMTF9DT1MpOworKyAgICAgIHJldHVybiByZXQ7CisrICB9CisrCisrLyoqCisrICoqIEBicmllZiBDTEkgcGFyc2VyIGFuZCBoYW5kbGVyIGZvciAndHJhcF90YXJnZXQnIGNvbW1hbmRzCisrICoqCisrICoqIFRoaXMgcm91dGluZSBoYW5kbGVzIHRoZSAnYmFsIHRyYXBfdGFyZ2V0IFthcmdzXScgQ0xJIGFwcCBjb25maWd1cmF0aW9uCisrICoqIGNvbW1hbmRzLgorKyAqKgorKyAqKiBAcGFyYW0gYXJnYyAgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgbGlzdAorKyAqKiBAcGFyYW0gYXJndiAgUG9pbnRlciB0byB0aGUgYXJndW1lbnQgbGlzdAorKyAqICovCisrdm9pZCBiYWxfYmNtX2NsaV90cmFwX3RhcmdldChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisreworKworKyAgICBpZiAoYXJnYyAhPSAxKQorKyAgICB7CisrICAgICAgICBwcmludGYoIkludmFsaWQgYXJndW1lbnRzXG4iKTsKKysgICAgICAgIHJldHVybjsKKysgICAgfQorKworKyAgICB7CisrICAgICAgICBzdHJjcHkoZ3BfY3VyX2N0eC0+dHJhcF90YXJnZXQsIGFyZ3ZbMF0pOworKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSB0cmFwIHRhcmdldCB3aXRoIHRoZSBzcGVjaWZpZWQgc2V0dGluZy4gKi8KKysgICAgICAgIGlmIChzdGFydF90cmFwX3NlcnZpY2UoYXJndlswXSkgIT0gMCkKKysgICAgICAgIHsKKysgICAgICAgICAgICBwcmludGYoIkVycm9yLCBmYWlsZWQgdG8gc3RhcnQgdHJhcCBzZXJ2aWNlIG9uICclcydcbiIsIAorKyAgICAgICAgICAgICAgICAgICBhcmd2WzBdKTsKKysgICAgICAgIH0KKysgICAgfQorK30KKysKKyt0eXBlZGVmIHN0cnVjdAorK3sKKysgICAgICBpbnQgdWRwX3BvcnQ7CisrICAgICAgc2FsX3RocmVhZF90IHRocmVhZGlkOworKyAgICAgIGRwcF9yeF9jYl9mIGNhbGxiYWNrOworK310cmFwX2NvbnRleHRfdDsKKysKKysgIHN0YXRpYyB0cmFwX2NvbnRleHRfdCB0cmFwX2N0eCA9IHswfTsKKysgIHN0YXRpYyBpbnQgbGlzdGVuZXJfaW5pdCA9IDA7CisrCisrI2RlZmluZSBNQVhfUlhfUEFDS0VUX1NJWkUgKDIwMDApCisrCisrc3RhdGljIHZvaWQgaG9zdF9yZWNlaXZlKHZvaWQgKnBfdXNlcl9kYXRhKQorK3sKKysgICAgaW50IHJjOworKyAgICBpbnQgc1VEUFNvY2tldDsKKysgICAgdW5zaWduZWQgY2hhciBjQnVmZmVyW01BWF9SWF9QQUNLRVRfU0laRV07CisrICAgIGludCBuQnl0ZXNSZWN2ID0gMDsKKysgICAgaW50IG5CdWZTaXplID0gTUFYX1JYX1BBQ0tFVF9TSVpFOworKyAgICBzb2NrbGVuX3QgblJlY2VpdmVBZGRyU2l6ZSA9IDA7CisrICAgIGludCBtYXhmZDsKKysgICAgZmRfc2V0IHJlYWRfZmRzOworKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKysgICAgdWludDE2ICpwX2RzdF9wb3J0LCBkc3RfcG9ydDsKKysgICAgdHJhcF9jb250ZXh0X3QgKnBfdHJhcF9jdHggPSAodHJhcF9jb250ZXh0X3QgKilwX3VzZXJfZGF0YTsKKysgICAgdWludDMyICpwX3JlYXNvbiwgcmVhc29uOworKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc1JlY2VpdmVGcm9tQWRkcjsKKysKKysgICAgLyogQ3JlYXRlIGEgY29ubmVjdGlvbmxlc3Mgc29ja2V0ICovCisrICAgIHNVRFBTb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworKyAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHZhbGlkIHNvY2tldCAqLworKyAgICBpZihzVURQU29ja2V0IDwgMCkKKysgICAgeworKyAgICAgICAgcHJpbnRmKCIgaG9zdF9yZWNlaXZlOmNyZWF0ZSBzb2NrZXQgZmFpbGVkXG4iKTsKKysgICAgICAgIHJldHVybjsKKysgICAgfQorKworKyAgICAvKiBTZXR1cCBhIGJpbmQgb24gdGhlIHNvY2tldCwgdGVsbGluZyB1cyB3aGF0IHBvcnQgYW5kCisrICAgICAqIGFkYXB0ZXIgdG8gcmVjZWl2ZSBkYXRhZ3JhbXMgb24uCisrICAgICAqIE5PVEU6IHdlIGFjY2VwdCBVRFAgcGFja2V0cyBmcm9tIGFueSBzZW5kZXIgYXMgbG9uZworKyAgICAgKiBhcyB0aGV5IGFycml2ZSBvbiB0aGUgc3BlY2lmaWVkIHBvcnQuCisrICAgICAqLworKyAgICAgbWVtc2V0KCZzUmVjZWl2ZUZyb21BZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisrCisrICAgICBzUmVjZWl2ZUZyb21BZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworKyAgICAgc1JlY2VpdmVGcm9tQWRkci5zaW5fcG9ydCA9IGh0b25zKHBfdHJhcF9jdHgtPnVkcF9wb3J0KTsKKysgICAgIHNSZWNlaXZlRnJvbUFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisrCisrICAgICByYyA9IGJpbmQoc1VEUFNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzUmVjZWl2ZUZyb21BZGRyLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisrICAgICBpZiAocmMgPCAwKQorKyAgICAgeworKyAgICAgICAgICBwcmludGYoImhvc3RfcmVjZWl2ZTpiaW5kIGZhaWxlZFxuIik7CisrICAgICAgICAgIHJldHVybjsKKysgICAgIH0KKysKKysgICAgIC8vIFJlY2VpdmUgYSBkYXRhZ3JhbSBmcm9tIGFub3RoZXIgZGV2aWNlCisrICAgICB3aGlsZSgxKQorKyAgICAgeworKyAgICAgICAgIEZEX1pFUk8oJnJlYWRfZmRzKTsKKysgICAgICAgICBGRF9TRVQoc1VEUFNvY2tldCwgJnJlYWRfZmRzKTsKKysgICAgICAgICBtYXhmZCA9IHNVRFBTb2NrZXQ7CisrICAgICAgICAgLyogU2V0IHRoZSB0aW1lb3V0ICovCisrICAgICAgICAgdHYudHZfc2VjICA9IDE7CisrICAgICAgICAgdHYudHZfdXNlYyA9IDA7ICAvKiAgMSBzZWNvbmRzICovCisrICAgICAgICAgcmMgPSBzZWxlY3QobWF4ZmQgKyAxLCAmcmVhZF9mZHMsIE5VTEwsIE5VTEwsICZ0dik7CisrCisrICAgICAgICAgaWYgKHJjIDwgMCkKKysgICAgICAgICB7CisrICAgICAgICAgICAgIHByaW50ZigiIGhvc3RfcmVjZWl2ZTpzZWxlY3QgZmFpbGVkIGVyciA9ICVkXG4iLCByYyk7CisrICAgICAgICAgICAgIGJyZWFrOworKyAgICAgICAgIH0KKysgICAgICAgICBpZiAocmMgPT0gMCkKKysgICAgICAgICB7CisrICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworKyAgICAgICAgICAgICBjb250aW51ZTsKKysgICAgICAgICB9CisrICAgICAgICAgLy8gR2V0IHRoZSBkYXRhZ3JhbQorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CeXRlc1JlY3YgPSByZWN2ZnJvbShzVURQU29ja2V0LCBjQnVmZmVyLCBuQnVmU2l6ZSwgMCwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmc1JlY2VpdmVGcm9tQWRkciwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5SZWNlaXZlQWRkclNpemUpOworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiR290ICVkIGJ5dGVzIG1lc3NhZ2UgXG4iLCBuQnl0ZXNSZWN2KTsKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgZmlyc3QgNCBieXRlcyBhcmUgcmVhc29uICovCisrICAgICAgICAgcF9yZWFzb24gPSAodWludDMyICopKGNCdWZmZXIpOworKyAgICAgICAgIHJlYXNvbiA9IG50b2hsKCpwX3JlYXNvbik7CisrCisrICAgICAgICAgLyogdGhlIG5leHQgMiBieXRlcyBhcmUgZGVzdGluYXRpb24gcG9ydCAqLworKyAgICAgICAgIHBfZHN0X3BvcnQgPSAodWludDE2ICopKGNCdWZmZXIgKyBERUZBVUxUX1JFQVNPTl9BREopOworKyAgICAgICAgIGRzdF9wb3J0ID0gbnRvaHMoKnBfZHN0X3BvcnQpOworKworKyAgICAgICAgIC8qIGNhbGwgdGhlIHJlZ2lzdGVyIGNhbGxiYWNrIGhlcmUgLSBzZXQgdW5pdCB0byAwIGFzIGl0IGlzIGRvbid0IGNhcmUgKi8KKysgICAgICAgICBpZihwX3RyYXBfY3R4LT5jYWxsYmFjaykKKysgICAgICAgICB7CisrICAgICAgICAgICAgIHBfdHJhcF9jdHgtPmNhbGxiYWNrKDAsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wb3J0LAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNCdWZmZXIrREVGQVVMVF9TT1BfQURKK0RFRkFVTFRfUkVBU09OX0FESiwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzUmVjdi1ERUZBVUxUX1NPUF9BREotREVGQVVMVF9SRUFTT05fQURKKTsKKysgICAgICAgICB9CisrICAgICAgIH0KKysgICAgICAgY2xvc2Uoc1VEUFNvY2tldCk7CisrCisrICAgICAgIHJldHVybjsKKyt9CisrCisrCisrdm9pZCBkcHBfZGZ0X3R4X2NiKGludCB1bml0LCBpbnQgZHN0X3BvcnQsIGludCByZWFzb24sIHVuc2lnbmVkIGNoYXIgKnBheWxvYWQsIGludCBwYXlsb2FkX2xlbikKKyt7CisrCisrICAgIGludCBpOworKyAgICBiY21fcGt0X3QgKnR4X3BrdDsKKysgICAgdWludDhfdCB0eF9wa3RfZHVuZV9oZWFkZXJbNl07CisrICAgIHVpbnQzMl90IHR4X3BrdF9vZmZzZXQgPSAwOworKyAgICBiY21fZ3BvcnRfdCBzeXNfZ3BvcnQ7CisrICAgIGJjbV9ncG9ydF90IGxvY2FsX2dwb3J0OworKyAgICBiY21fcG9ydF90IHN5c3BvcnQgPSAwOworKyAgICBiY21fZ3BvcnRfdCBsb2NhbF9jcHVfcG9ydCA9IDA7CisrICAgIGludCBzZGtfcmM7CisrCisrICAgIHByaW50ZigiTXNnIGZyb20gY29yZTpcbiIpOworKyAgICBwcmludGYoIiBkc3QgcG9ydDolZCwgcmN2IHJlYXNvbjogMHgleCwgIiwgZHN0X3BvcnQsIHJlYXNvbik7CisrCisrICAgIC8qIGR1bXAgb3V0IGZpcnN0ICAzMiBieXRlcyAqLworKyAgICBwcmludGYoInBheWxvYWQgKGZpcnN0IDEyIGJ5dGVzKTogIik7CisrICAgIGZvcihpPTA7IGk8MTI7IGkrKykKKysgICAgeworKyAgICAgIGlmKGklNiA9PSAwICYmIGkpIHByaW50ZigiICIpOworKyAgICAgIHByaW50ZigiJTAyeCIsIHBheWxvYWRbaV0pOworKyAgICB9CisrICAgIHByaW50ZigiXG4iKTsKKysKKysKKysgICAgLyogTWFwIHRoZSBsb2NhbCBwb3J0IG51bWJlciB0byBhIENQVSAic3lzdGVtIiBwb3J0LiAqLworKyAgICBsb2NhbF9ncG9ydCA9IGRzdF9wb3J0OworKyAgICBzZGtfcmMgPSBiY21fc3RrX2dwb3J0X3N5c3BvcnRfZ2V0KHVuaXQsIGxvY2FsX2dwb3J0LCAmc3lzX2dwb3J0KTsKKysgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorKyAgICB7CisrICAgICAgLyogRXJyb3IgKi8KKysgICAgICBwcmludGYoIiVzKCk6IFtQYWNrZXRPdXRdIGJjbV9zdGtfZ3BvcnRfc3lzcG9ydF9nZXQgcmV0dXJuZWQgd2l0aCBmYWlsdXJlIGNvZGUgJyVzJ1xuIiwKKysgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYykpOworKyAgICAgIHJldHVybjsKKysgICAgfQorKworKyAgICBzeXNwb3J0ID0gc3lzX2dwb3J0ICYgMHhmZjsKKysKKysgICAgICAgLyogR2V0IHRoZSBsb2NhbCBDUFUgcG9ydCAqLworKyAgICBzZGtfcmMgPSBiY21fcG9ydF9sb2NhbF9nZXQodW5pdCwgQkNNX0dQT1JUX0xPQ0FMX0NQVSwgJmxvY2FsX2NwdV9wb3J0KTsKKysgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorKyAgICB7CisrICAgICAgLyogRXJyb3IgKi8KKysgICAgICBwcmludGYoIiVzKCk6IFtQYWNrZXRPdXRdIGJjbV9wb3J0X2xvY2FsX2dldCByZXR1cm5lZCB3aXRoIGZhaWx1cmUgY29kZSAnJXMnXG4iLAorKyAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSk7CisrICAgICAgcmV0dXJuOworKyAgICB9CisrCisrICAgIC8qIEFsbG9jYXRlIGEgcGFja2V0IHN0cnVjdHVyZSAqLworKyAgICBzZGtfcmMgPSBiY21fcGt0X2FsbG9jKHVuaXQsIHBheWxvYWRfbGVuK3NpemVvZih0eF9wa3RfZHVuZV9oZWFkZXIpLCAwLCAmdHhfcGt0KTsKKysKKysgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorKyAgICB7CisrICAgICAgLyogRXJyb3IgKi8KKysgICAgICBwcmludGYoIiVzKCk6IFtQYWNrZXRPdXRdIGJjbV9wa3RfYWxsb2MgcmV0dXJuZWQgd2l0aCBmYWlsdXJlIGNvZGUgJyVzJ1xuIiwKKysgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYykpOworKyAgICAgIHJldHVybjsKKysgICAgfQorKworKyAgICAvKiBTZXQgdXAgdGhlIHBhY2tldCBmb3IgYSBzaW5nbGUgYmxvY2sgKi8KKysgICAgdHhfcGt0LT5jYWxsX2JhY2sgPSAwOworKyAgICB0eF9wa3QtPmJsa19jb3VudCA9IDE7CisrICAgIHR4X3BrdC0+dW5pdCA9IHVuaXQ7CisrCisrICAgIC8qIER1bmUgVE0gaGVhZGVyICovCisrICAgIHR4X3BrdC0+X2RwcF9oZHJbM10gPSAweDAwOyAvKiBjaGFubmVsIG51bSAqLworKyAgICB0eF9wa3QtPl9kcHBfaGRyWzJdID0gMHgwMDsKKysgICAgdHhfcGt0LT5fZHBwX2hkclsxXSA9IDB4MDA7CisrICAgIHR4X3BrdC0+X2RwcF9oZHJbMF0gPSAweDAwOworKworKyAgICB0eF9wa3QtPl9kcHBfaGRyX3R5cGUgPSAxOyAgLyogRFBQX0hEUl9pdG1oX2Jhc2UgKi8KKysKKysgICAgLyogUFRDSCAqLworKyAgICB0eF9wa3RfZHVuZV9oZWFkZXJbMF0gPSAweDUwOworKyAgICB0eF9wa3RfZHVuZV9oZWFkZXJbMV0gPSBsb2NhbF9jcHVfcG9ydDsKKysKKysgICAgLyogSVRNSCAqLworKyAgICB0eF9wa3RfZHVuZV9oZWFkZXJbMl0gPSAweDAxOworKyAgICB0eF9wa3RfZHVuZV9oZWFkZXJbM10gPSAweDAwOworKyAgICB0eF9wa3RfZHVuZV9oZWFkZXJbNF0gPSAoc3lzcG9ydCAmIDB4ZmYpOyAvKiBEZXN0aW5hdGlvbiBwb3J0ICovCisrICAgIHR4X3BrdF9kdW5lX2hlYWRlcls1XSA9IDB4MDA7CisrCisrICAgLyogSW5zZXJ0IHRoZSBEVU5FIGhlYWRlciBpbnRvIHRoZSBwYWNrZXQgKi8KKysgICAgYmNtX3BrdF9tZW1jcHkgKHR4X3BrdCwgdHhfcGt0X29mZnNldCwgdHhfcGt0X2R1bmVfaGVhZGVyLCBzaXplb2YodHhfcGt0X2R1bmVfaGVhZGVyKSk7CisrICAgIHR4X3BrdF9vZmZzZXQgKz0gc2l6ZW9mKHR4X3BrdF9kdW5lX2hlYWRlcik7CisrCisrICAgIC8qIEluc2VydCB0aGUgcGF5bG9hZCBpbnRvIHRoZSBwYWNrZXQgKi8KKysgICAgYmNtX3BrdF9tZW1jcHkgKHR4X3BrdCwgdHhfcGt0X29mZnNldCwgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOworKyAgICB0eF9wa3Rfb2Zmc2V0ICs9IHBheWxvYWRfbGVuOworKworKyAgICBwcmludGYoIiVzKCk6IFtQYWNrZXRPdXRdIHRyYW5zbWl0dGluZyBhICVkIGxlbmd0aCBwYWNrZXQsICIKKysgICAgICAgICAgICJzeXNfZ3BvcnQ6MHglWCwgc3lzcG9ydDogJWRcbiIsCisrICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisrICAgICAgICAgICBwYXlsb2FkX2xlbiwKKysgICAgICAgICAgIHN5c19ncG9ydCwKKysgICAgICAgICAgIHN5c3BvcnQpOworKworKyAgICAvKiBUcmFuc21pdCB0aGUgcGFja2V0ICovCisrICAgIHNka19yYyA9IGJjbV90eCh1bml0LCB0eF9wa3QsIE5VTEwpOworKyAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisrICAgIHsKKysgICAgICAvKiBFcnJvciAqLworKyAgICAgIHByaW50ZiggIiVzKCk6ICBiY21fdHggcmV0dXJuZWQgd2l0aCBmYWlsdXJlIGNvZGUgJyVzJ1xuIiwKKysgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpKTsKKysgICAgfQorKworKyAgICAvKiBDbGVhbnVwICovCisrICAgIGJjbV9wa3RfZnJlZSh1bml0LCB0eF9wa3QpOworKworKyAgICByZXR1cm47CisrfQorKworK3ZvaWQgZHBwX2RmdF9tc2dfY2IoaW50IHVuaXQsIGludCBkc3RfcG9ydCwgaW50IHJlYXNvbiwgdW5zaWduZWQgY2hhciAqcGF5bG9hZCwgaW50IHBheWxvYWRfbGVuKQorK3sKKysKKysgICAgaW50IGksIGxlbjsgIAorKworKyAgICBwcmludGYoIk1zZyBmcm9tIGNvcmU6XG4iKTsKKysgICAgcHJpbnRmKCIgZHN0IHBvcnQ6JWQsIHJjdiByZWFzb246IDB4JXgsICIsIGRzdF9wb3J0LCByZWFzb24pOworKworKyAgICBsZW4gPSAocGF5bG9hZF9sZW4gPiAzMik/IDMyOiBwYXlsb2FkX2xlbjsKKysgICAgCisrICAgIC8qIGR1bXAgb3V0IGZpcnN0ICAzMiBieXRlcyAqLworKyAgICBwcmludGYoInBheWxvYWQgKGZpcnN0ICVkIGJ5dGVzKTogIiwgbGVuKTsKKysgICAgZm9yKGk9MDsgaTxsZW47IGkrKykKKysgICAgeworKyAgICAgIGlmKGklOCA9PSAwICYmIGkpIHByaW50ZigiICIpOworKyAgICAgIHByaW50ZigiJTAyeCIsIHBheWxvYWRbaV0pOworKyAgICB9CisrICAgIHByaW50ZigiXG4iKTsKKysgICAgCisrICAgIHJldHVybjsKKyt9CisrCisrdm9pZCBkcHBfZGZ0X2hvc3RfY2IoaW50IHVuaXQsIGludCBkc3RfcG9ydCwgaW50IHJlYXNvbiwgdW5zaWduZWQgY2hhciAqcGF5bG9hZCwgaW50IHBheWxvYWRfbGVuKQorK3sKKysgICAgc3dpdGNoKHJlYXNvbikKKysgICAgeworKyAgICAgICAgY2FzZSBCQUxfUkVBU09OX1NFTkRfVE9fTk5JOgorKyAgICAgICAgY2FzZSBCQUxfUkVBU09OX1NFTkRfVE9fUE9OOgorKyAgICAgICAgICAgIGRwcF9kZnRfdHhfY2IodW5pdCwgZHN0X3BvcnQsIHJlYXNvbiwgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOworKyAgICAgICAgYnJlYWs7CisrICAgICAgICBkZWZhdWx0OgorKyAgICAgICAgICAgIGRwcF9kZnRfbXNnX2NiKHVuaXQsIGRzdF9wb3J0LCByZWFzb24sIHBheWxvYWQsIHBheWxvYWRfbGVuKTsKKysgICAgICAgIGJyZWFrOworKyAgICB9CisrICAgIHJldHVybjsKKyt9CisrCisrCisrCisrCisrCisrCisrCisrCisrCisrCisrLyoKKysgKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBzdGFydCBhIHRocmVhZCB0byBsaXN0ZW4gZm9yCisrICogcGFja2V0cyBzZW50IGZyb20gQkFMIHRvIGJjbS51c2VyIGZvciBpbmplY3Rpb24gaW50byB0aGUgc3dpdGNoLgorKyAqICAKKysgKiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgdXNlciBpbmNsdWRlcyB0aGUgdHJhcF9yZWNlaXZlIGlkZW50aWZpZXIgaW4gCisrICogdGhlIHJwYy5zb2MgZmlsZSB0aGF0IGlzIGNvLXJlc2lkZW50IHdpdGggdGhlIGJjbS51c2VyIGV4ZWN1dGFibGUuCisrICogCisrICoqIEFuIGV4YW1wbGUgbGluZSBpbiB0aGUgcnBjLnNvYyBmaWxlIG1pZ2h0IGJlOgorKyAqCisrICogIGR1bmUgInNhbmQgdHJhcF9yZWNlaXZlIDEwLjMuMi4yOjUwMDAzIgorKyAqIAorKyAqICBUaGlzIGxpbmUgc3BlY2lmaWVzIHRvIGxpc3RlbiBvbiBwb3J0IDUwMDAzIGFuZCB0aGF0IG1lc3NhZ2VzIHdpbGwKKysgKiAgYXJyaXZlIGZyb20gSVAgMTAuMy4yLjIgKGFsdGhvdWdoIHRoZSBJUCBhZGRyZXNzIGlzIG5vdCByZXNwZWN0ZWQKKysgKiAgaW4gdGhpcyBjb2RlKS4KKysgKiAKKysgKiAgKi8KKytpbnQgc3RhcnRfaG9zdF9saXN0ZW5lcihjaGFyICppcF9wb3J0KQorKyAgeworKworKyAgICBjaGFyICpjb2w7CisrCisrICAgIGlmKGxpc3RlbmVyX2luaXQgIT0gMCkKKysgICAgICB7CisrICAgICAgICAgIHJldHVybiAwOworKyAgICAgIH0KKysKKysgICAgICAvKiBmaWxsIGluIGhvc3QgbGlzdGVuZXIgaW5mbyAtIGlwX3BvcnQgaGFzIHRoZSBmb3JtYXQgb2YgaXA6cG9ydCwgc28gbG9vayBmb3IgIjoiIGZvciBzZXBhcmF0aW9uICovCisrICAgICAgY29sID0gc3Ryc3RyKGlwX3BvcnQsICI6Iik7CisrICAgICAgdHJhcF9jdHgudWRwX3BvcnQgPSBhdG9pKGNvbCsxKTsKKysKKysgICAgICAvKiByZWdpc3RlciBhIGRlZmF1bHQgaGFuZGxlciAqLworKyAgICAgIHRyYXBfY3R4LmNhbGxiYWNrID0gZHBwX2RmdF9ob3N0X2NiOworKworKyAgICAgIC8qIHNwYXduIGEgdGhyZWFkIHRvIGxpc3RlbiB0byBzb2NrZXQgKi8KKysgICAgICB0cmFwX2N0eC50aHJlYWRpZCA9IHNhbF90aHJlYWRfY3JlYXRlKCJ0cmFwX3J4IiwgODE5MiwgNTAsIGhvc3RfcmVjZWl2ZSwgJnRyYXBfY3R4KTsKKysKKysgICAgICBpZiAodHJhcF9jdHgudGhyZWFkaWQgPT0gU0FMX1RIUkVBRF9FUlJPUikKKysgICAgICB7CisrICAgICAgICAgIHJldHVybiAtMjsKKysgICAgICB9CisrCisrICAgICAgbGlzdGVuZXJfaW5pdCA9IDE7CisrICAgICAgcmV0dXJuIDA7CisrICB9CisrICAgICAgICAgICAgICAgICAgICAgICAKKysvKioKKysgKiogQGJyaWVmIENMSSBwYXJzZXIgYW5kIGhhbmRsZXIgZm9yICd0cmFwX3JlY2VpdmUnIGNvbW1hbmRzCisrICoqCisrICoqIFRoaXMgcm91dGluZSBoYW5kbGVzIHRoZSAnYmFsIHRyYXBfcmVjZWl2ZSBbYXJnc10nIENMSSBhcHAgY29uZmlndXJhdGlvbgorKyAqKiBjb21tYW5kcy4KKysgKioKKysgKiogQHBhcmFtIGFyZ2MgIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaW4gdGhlIGxpc3QKKysgKiogQHBhcmFtIGFyZ3YgIFBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IGxpc3QKKysgKiAqLworK3ZvaWQgYmFsX2JjbV9jbGlfdHJhcF9yZWNlaXZlKGludCBhcmdjLCBjaGFyICoqYXJndikKKyt7CisrCisrICAgIGlmIChhcmdjICE9IDEpCisrICAgIHsKKysgICAgICAgIHByaW50ZigiSW52YWxpZCBhcmd1bWVudHNcbiIpOworKyAgICAgICAgcmV0dXJuOworKyAgICB9CisrCisrICAgIHsKKysgICAgICAgIHN0cmNweShncF9jdXJfY3R4LT50cmFwX3JlY2VpdmUsIGFyZ3ZbMF0pOworKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBtc2cgcmVjZWl2ZXIgIHdpdGggdGhlIHNwZWNpZmllZCBzZXR0aW5nLiAqLworKyAgICAgICAgaWYgKHN0YXJ0X2hvc3RfbGlzdGVuZXIoYXJndlswXSkgIT0gMCkKKysgICAgICAgIHsKKysgICAgICAgICAgICBwcmludGYoIkVycm9yLCBmYWlsZWQgdG8gc3RhcnQgdHJhcCBsaXN0ZW5lciBvbiAnJXMnXG4iLCAKKysgICAgICAgICAgICAgICAgICAgYXJndlswXSk7CisrICAgICAgICB9CisrICAgIH0KKyt9CisrCisrLyoqCisrICoqIEBicmllZiBIYW5kbGVyIGZvciB0aGUgJ2JhbCBzaG93IHZlcnNpb24nIGNvbW1hbmQKKysgKioKKysgKiogVGhpcyByb3V0aW5lIGhhbmRsZXMgdGhlICdiYWwgc2hvdyB2ZXJzaW9uJyBDTEkgY29tbWFuZCAKKysgKiogYW5kIHNob3cgdmVyc2lvbiBpbmZvcm1hdGlvbiBvbiB0aGUgY29uc29sZS4KKysgKioKKysgKiovCisrdm9pZCBiYWxfYmNtX3Nob3dfdmVyc2lvbih2b2lkKQorK3sKKysKKysgICAgLyogUHJpbnQgb3V0IHRoZSBzb2Z0d2FyZSByZXZpc2lvbiBpbmZvcm1hdGlvbiAqLworKyAgICBwcmludGYoIkJyb2FkY29tIFNvZnR3YXJlLCBCcm9hZGJhbmQgQWJzdHJhY3Rpb24gTGF5ZXIsIENMSSBWZXJzaW9uICVzIFxuIiwgCisrICAgICAgICAgICBCQUxfQ0xJX1ZFUlNJT04pOyAKKyt9CisrCisrCisrLyoqCisrICoqIEBicmllZiBDTEkgcGFyc2VyIGFuZCBoYW5kbGVyIGZvciAnc2hvdycgY29tbWFuZHMKKysgKioKKysgKiogVGhpcyByb3V0aW5lIGhhbmRsZXMgdGhlICdiYWwgc2hvdyBbYXJnc10nIENMSSBhcHAgY29tbWFuZHMuCisrICoqCisrICoqIEBwYXJhbSBhcmdjICBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGluIHRoZSBsaXN0CisrICoqIEBwYXJhbSBhcmd2ICBQb2ludGVyIHRvIHRoZSBhcmd1bWVudCBsaXN0CisrICoqLworK3ZvaWQgYmFsX2JjbV9jbGlfc2hvdyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisreworKyAgICBjaGFyICpzaG93X2NtZDsKKysgICAgICAgCisrICAgIHNob3dfY21kID0gYXJndlswXTsKKysKKysgICAgaWYgKGFyZ2MgPT0gMCkKKysgICAgeworKyAgICAgICAgcHJpbnRmKCJFcnJvcjogbWlzc2luZyBzaG93IHN1Yi1jb21tYW5kLlxuIik7CisrICAgICAgICBwcmludGYoIiVzIiwgU0hPV19IRUxQKTsKKysgICAgICAgIHJldHVybjsKKysgICAgfQorKyAgICAKKysgICAgc2hvd19jbWQgPSBhcmd2WzBdOworKworKyAgICBpZiAoc2FsX3N0cmNhc2VjbXAoc2hvd19jbWQsICJjb25maWciKSA9PSAwKQorKyAgICB7CisrICAgICAgICBwcmludGYoIkJBTCBCQ00gQXBwIENvbmZpZ3VyYXRpb246XG4iKTsKKysgICAgICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworKyAgICAgICAgcHJpbnRmKCJ0cmFwX3RhcmdldCBpcF9wb3J0ICA9ICVzXG4iLCAgIGdwX2N1cl9jdHgtPnRyYXBfdGFyZ2V0KTsKKysgICAgICAgIHByaW50ZigidHJhcF9yZWNlaXZlIGlwX3BvcnQgPSAlc1xuIiwgICBncF9jdXJfY3R4LT50cmFwX3JlY2VpdmUpOworKyAgICB9CisrICAgIGVsc2UgaWYgKHNhbF9zdHJjYXNlY21wKHNob3dfY21kLCAidmVyc2lvbiIpID09IDApCisrICAgIHsKKysgICAgICAgIGJhbF9iY21fc2hvd192ZXJzaW9uKCk7CisrICAgIH0KKysgICAgZWxzZSBpZiAoc2FsX3N0cmNhc2VjbXAoc2hvd19jbWQsICJoZWxwIikgPT0gMCB8fAorKyAgICAgICAgICAgICBzYWxfc3RyY2FzZWNtcChzaG93X2NtZCwgIj8iKSA9PSAwKQorKyAgICB7CisrICAgICAgICBwcmludGYoIiVzIiwgU0hPV19IRUxQKTsKKysgICAgfQorKyAgICBlbHNlCisrICAgIHsKKysgICAgICAgIHByaW50ZigiRXJyb3I6IHVua25vd24gc2hvdyBjb21tYW5kICclcycuXG4iLCBzaG93X2NtZCk7CisrICAgIH0KKyt9CisrCisrLyoqCisrICoqIEBicmllZiBFeGVjdXRlcyBhIGNvbW1hbmQgYXMgc3BlY2lmaWVkIGJ5IGEgc2luZ2xlIGxpbmUgb2YgQ0xJIGlucHV0CisrICoqCisrICoqIEBwYXJhbSBhcmdjICBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGluIHRoZSBsaXN0CisrICoqIEBwYXJhbSBhcmd2ICBQb2ludGVyIHRvIHRoZSBhcmd1bWVudCBsaXN0CisrICoqLworK3ZvaWQgRG9DbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorK3sKKysgICAgY2hhciAqY21kOworKworKyAgICBpZiAoYXJnYyA9PSAwIHx8IGFyZ3ZbMF0gPT0gTlVMTCkKKysgICAgeworKyAgICAgICAgcmV0dXJuOworKyAgICB9CisrCisrICAgIGNtZCA9IGFyZ3ZbMF07CisrCisrICAgIHByaW50ZigiQ0xJIGV4ZWN1dGluZyBjb21tYW5kICclcydcbiIsIGNtZCk7CisrCisrICAgIGlmIChzYWxfc3RyY2FzZWNtcChjbWQsICJ0cmFwX3RhcmdldCIpID09IDApCisrICAgIHsKKysgICAgICAgYmFsX2JjbV9jbGlfdHJhcF90YXJnZXQoYXJnYy0xLCAmYXJndlsxXSk7CisrICAgIH0KKysgICAgZWxzZSBpZiAoc2FsX3N0cmNhc2VjbXAoY21kLCAidHJhcF9yZWNlaXZlIikgPT0gMCkKKysgICAgeworKyAgICAgICBiYWxfYmNtX2NsaV90cmFwX3JlY2VpdmUoYXJnYy0xLCAmYXJndlsxXSk7CisrICAgIH0gICAKKysgICAgZWxzZSBpZiAoc2FsX3N0cmNhc2VjbXAoY21kLCAic2hvdyIpID09IDApCisrICAgIHsKKysgICAgICAgIGJhbF9iY21fY2xpX3Nob3coYXJnYy0xLCAmYXJndlsxXSk7CisrICAgIH0KKysgICAgZWxzZSBpZiAoc2FsX3N0cmNhc2VjbXAoY21kLCAiaGVscCIpID09IDAgfHwKKysgICAgICAgICAgICAgc2FsX3N0cmNhc2VjbXAoY21kLCAiPyIpID09IDApCisrICAgIHsKKysgICAgICAgIC8qIERpc3BsYXkgaGVscCAqLworKyAgICAgICAgcHJpbnRmKCIlcyIsIEhFTFApOworKyAgICB9CisrICAgIGVsc2UgaWYgKHNhbF9zdHJjYXNlY21wKGNtZCwgImV4aXQiKSA9PSAwKQorKyAgICB7CisrICAgICAgICByZXR1cm47CisrICAgIH0KKysgICAgZWxzZQorKyAgICB7CisrICAgICAgICBwcmludGYoIlVua25vd24gY29tbWFuZCAnJXMnXG4iLCBjbWQpOworKyAgICB9CisrfQorKworKy8qKgorKyAqICAqIEBicmllZiBNYWluIHByb2Nlc3NpbmcgbG9vcCBmb3IgdGhlIENMSQorKyAqICAgKgorKyAqICAgICogQHBhcmFtIGFyZ3MgIFBvaW50ZXIgdG8gYW4gQkNNIFNESyBmb3JtYXR0ZWQgYXJndW1lbnQgbGlzdAorKyAqICAgICAqLworK3ZvaWQgYmFsX2NsaV9zaGVsbChhcmdzX3QgKmFyZ3MpCisreworKyAgICBjaGFyICpjbWQ7CisrICAgIGludCBhcmdjID0gMDsKKysgICAgY2hhciAqYXJndltNQVhfQVJHU107CisrICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworKyAKKysgICAgaWYgKGluaXRpYWxpemVkID09IDApCisrICAgIHsKKysgICAgICAgIGJhbF9zZXRfcHJvbXB0KCk7CisrICAgICAgICBpbml0aWFsaXplZCA9IDE7CisrICAgIH0KKysKKysgICAgaWYgKGFyZ3MtPmFfYXJnYyA+IDEpCisrICAgIHsKKysKKysgICAgICAgIERvQ21kKGFyZ3MtPmFfYXJnYy0xLCAmYXJncy0+YV9hcmd2WzFdKTsKKysgICAgfQorKyAgICBlbHNlCisrICAgIHsKKysKKysgICAgICAgIHByaW50ZigiQ0xJIHJ1bm5pbmcgaW4gaW50ZXJhY3RpdmUgbW9kZVxuIik7CisrCisrICAgICAgICBmb3IgKDs7KQorKyAgICAgICAgeworKyAgICAgICAgICAgIC8qIHVzZSBJTkcgZWRpdGxpbmUgbGlicmFyeSwgRE9OVCBmcmVlIHBvaW50ZXIgImNtZCIgYXMgTGludXggbWFuIHJlYWRsaW5lCisrICAgICAgICAgICAgICAgc3VnZ2VzdGVkLCBpdCB3aWxsIGNhdXNlIGEgY3Jhc2ggKi8gICAgICAgICAgICAKKysgICAgICAgICAgICBjbWQgPSByZWFkbGluZShnX2JhbF9jbGlfcHJvbXB0KTsKKysgICAgICAgICAgICBpZiAoKmNtZCAhPSAnXDAnKQorKyAgICAgICAgICAgIHsKKysgICAgICAgICAgICAgICAgYWRkX2hpc3RvcnkoY21kKTsKKysgICAgICAgICAgICB9CisrICAgICAgICAgICAgZWxzZQorKyAgICAgICAgICAgIHsKKysgICAgICAgICAgICAgICAgY29udGludWU7CisrICAgICAgICAgICAgfQorKyAgICAgICAgICAgIAorKyAgICAgICAgICAgIGlmICgoc2FsX3N0cmNhc2VjbXAoY21kLCAiZXhpdCIpID09IDApIHx8IChzYWxfc3RyY2FzZWNtcChjbWQsICJxdWl0IikgPT0gMCkpCisrICAgICAgICAgICAgeworKyAgICAgICAgICAgICAgICBwcmludGYgKCJleGl0aW5nIGJhbCBzaGVsbC5cbiIpOworKyAgICAgICAgICAgICAgICBicmVhazsKKysgICAgICAgICAgICB9CisrICAgICAgICAgICAgCisrICAgICAgICAgICAgYmFsX3BhcnNlX2lucHV0KGNtZCwgJmFyZ2MsIGFyZ3YpOworKyAgICAgICAgICAgIAorKyAgICAgICAgICAgIERvQ21kKGFyZ2MsIGFyZ3YpOworKyAgICAgICAgICAgIAorKyAgICAgICAgfQorKyAgICB9CisrCisrICAgIC8qICJDb25zdW1lIiBhbGwgb2YgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgc28gdGhlIGJjbS51c2VyIHNoZWxsCisrICAgICAqIGRvZXMgbm90IGNvbXBsYWluLgorKyAgICAgKi8KKysgICAgYXJncy0+YV9hcmcgPSBhcmdzLT5hX2FyZ2M7CisrfQorKworKy8qKgorKyAqICAgQGJyaWVmIFRoZSBjbWRsaXN0IGhvb2sgZm9yIHRoZSBCQUwgQkNNIEFwcCBDTEkgY29tbWFuZAorKyAqICAgCisrICogICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZ1bmN0aW9uIHRvICJob29rIiBpbnRvIHRoZSBtYWluIGJjbS51c2VyCisrICogICBDTEkuCisrICogIAorKyAqICBAcGFyYW0gdW5pdCAgU0RLIHVuaXQgbnVtYmVyCisrICogIEBwYXJhbSBhcmdzICBQb2ludGVyIHRvIGFuIEJDTSBTREsgZm9ybWF0dGVkIGFyZ3VtZW50IGxpc3QKKysgKiAgIAorKyAqICBAcmV0dXJuIGNtZF9yZXN1bHRfdAorKyAqICAKKysgKiAqLworK2NtZF9yZXN1bHRfdCBjbWRfYmFsKGludCB1bml0LCBhcmdzX3QgKmFyZ3MpCisreworKyAgIC8qICBjaGFyICpzdWJjbWQgPSBBUkdfR0VUKGFyZ3MpOyAqLworKworKyAgICBiYWxfY2xpX3NoZWxsKGFyZ3MpOworKworKyAgICByZXR1cm4gQ01EX09LOworK30KKysvKkB9Ki8KK2RpZmYgLU5hdXIgL3Byb2plY3RzL05UU1dfU1dfUFJKUy9FeHRlcm5hbFJlbGVhc2VzL0JDTS82LjUuNy9nYS9zZGstYWxsLTYuNS43L3NyYy9hcHBsL2RpYWcvY21kbGlzdC5jIHNkay1hbGwtNi41Ljcvc3JjL2FwcGwvZGlhZy9jbWRsaXN0LmMKKy0tLSAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41Ljcvc3JjL2FwcGwvZGlhZy9jbWRsaXN0LmMJMjAxNi0xMi0wMSAwNToxNjoyNS4wMDAwMDAwMDAgKzAyMDAKKysrKyBzZGstYWxsLTYuNS43L3NyYy9hcHBsL2RpYWcvY21kbGlzdC5jCTIwMTctMDEtMjYgMTI6MDQ6MDQuOTkyNzIyNzU4ICswMjAwCitAQCAtNTcsNiArNTcsNyBAQAorIAorICNpbmNsdWRlIDxhcHBsL2RpYWcvZGlhZy5oPgorICNpbmNsdWRlIDxhcHBsL2RpYWcvY21kbGlzdC5oPgorKyNpbmNsdWRlIDxhcHBsL2RpYWcvYmFsX2NtZC5oPgorIAorIGNtZF90ICpjdXJfY21kX2xpc3RbU09DX01BWF9OVU1fREVWSUNFU107CisgaW50IGN1cl9jbWRfY250W1NPQ19NQVhfTlVNX0RFVklDRVNdOworQEAgLTk4LDYgKzk5LDkgQEAKKyAgICAgICJBdHRhY2ggU09DIGRldmljZShzKSIgfSwKKyAgICAgeyJCYWNrR3JvdW5kIiwgICAgICBzaF9iZywgICAgICAgICAgICAgICAgIHNoX2JnX3VzYWdlLAorICAgICAgIkV4ZWN1dGUgYSBjb21tYW5kIGluIHRoZSBiYWNrZ3JvdW5kLiJ9LAorKyAgIC8qIEJBTCBJTkcgQVBJIHN1cHBvcnQgKi8KKysgICAgeyJCQUwiLCAgICAgICAgICAgICBjbWRfYmFsLCAgICAgICAgICAgICAgY21kX2JhbF91c2FnZSwKKysgICAgICJSdW4gYSBCQUwgSU5HIEFwaSBjb21tYW5kLiJ9LAorICNpZiBkZWZpbmVkKElOQ0xVREVfQkNNWF9ESUFHKQorICAgICB7IkJDTSIsICAgICAgICAgICAgIGNtZF9tb2RlX2JjbSwgICAgICAgICAgICBzaGVsbF9iY21fdXNhZ2UsCisgICAgICAiU2V0IHNoZWxsIG1vZGUgdG8gQkNNLiJ9LAorZGlmZiAtTmF1ciAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41Ljcvc3JjL2FwcGwvZGlhZy9jdHJhbnMuYyBzZGstYWxsLTYuNS43L3NyYy9hcHBsL2RpYWcvY3RyYW5zLmMKKy0tLSAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41Ljcvc3JjL2FwcGwvZGlhZy9jdHJhbnMuYwkyMDE2LTEyLTAxIDA1OjE2OjI1LjAwMDAwMDAwMCArMDIwMAorKysrIHNkay1hbGwtNi41Ljcvc3JjL2FwcGwvZGlhZy9jdHJhbnMuYwkyMDE3LTAxLTI2IDEyOjIzOjQ4Ljg4MzM5MzIyMCArMDIwMAorQEAgLTEwMTYsNiArMTAxNiw3IEBACisgICAgIHJldHVybiBydjsKKyB9CisgCisrI2RlZmluZSBCQUxfQ01EX0xFTiAxMjgKKyAKKyBiY21fcnhfdAorIGFiX2VjaG9fY2IoY3B1ZGJfa2V5X3Qgc3JjX2tleSwKK0BAIC0xMDMzLDYgKzEwMzQsOCBAQAorICAgICBpbnQgbW9kZTsKKyAgICAgaW50IGxlbjsKKyAgICAgQ2FsbGJhY2tPcHRpb25zICpvcHRpb25zID0gKENhbGxiYWNrT3B0aW9ucyAqKWNvb2tpZTsKKysgICAgY2hhciBiYWxfY21kW0JBTF9DTURfTEVOXTsKKysgICAgaW50ICBiYWxfY21kX2xlbjsKKyAKKyAgICAgaWYgKHBheWxvYWQgPT0gTlVMTCkgeyAgLyogSnVzdCB1c2UgZmlyc3Qgc2VnbWVudCBmb3Igc3RyaW5nICovCisgICAgICAgICBpZiAocGt0ID09IE5VTEwpIHsKK0BAIC0xMDg1LDYgKzEwODgsOSBAQAorICAgICAgICAgX3NlbmRfZWNob19wa3QoY2xpZW50X2lkLCBwYXlsb2FkLCBsZW4sIGRlcHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9mbGFncywgbW9kZSwgb3B0aW9ucy0+dmVyYm9zZSwgc3JjX2tleSwgTlVMTCk7CisgICAgIH0KKysgICAgYmFsX2NtZF9sZW4gPSAoKGxlbi1vZmZzZXQpID49IEJBTF9DTURfTEVOKT8gQkFMX0NNRF9MRU4tMTogbGVuLW9mZnNldDsKKysgICAgbWVtY3B5KGJhbF9jbWQsICZwYXlsb2FkW29mZnNldF0sIGJhbF9jbWRfbGVuKTsKKysgICAgYmFsX2NtZFtiYWxfY21kX2xlbl0gPSAwOworIAorICAgICBpZiAoYXN5bmNfZnJlZSkgeworICAgICAgICAgcnYgPSBCQ01fUlhfSEFORExFRF9PV05FRDsKK0BAIC0xMDkzLDYgKzEwOTksMTMgQEAKKyAgICAgICAgIHJ2ID0gQkNNX1JYX0hBTkRMRUQ7CisgICAgIH0KKyAKKysgICAgLyoqIGlmIHN0cmluZyBoYXMgc3BlY2lhbCBjbGkgcHJlZml4ICE+LCBleGVjdXRlIHRoZSBjbGkgY29tbWFuZCAqLworKyAgICBpZihiYWxfY21kWzBdID09ICchJyAmJiBiYWxfY21kWzFdID09ICc+JykKKysgICAgeworKyAgICAgICAgY2xpX291dCgiRXhlY3V0ZSBCQUwgQ0xJIGNtZCAtPiAlc1xuIiwgJmJhbF9jbWRbMl0pOworKyAgICAgICAgc2hfcHJvY2Vzc19jb21tYW5kKDAsICZiYWxfY21kWzJdKTsKKysgICAgfQorKworICAgICByZXR1cm4gcnY7CisgfQorIAorZGlmZiAtTmF1ciAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41Ljcvc3JjL2FwcGwvZGlhZy9zaGVsbC5jIHNkay1hbGwtNi41Ljcvc3JjL2FwcGwvZGlhZy9zaGVsbC5jCistLS0gL3Byb2plY3RzL05UU1dfU1dfUFJKUy9FeHRlcm5hbFJlbGVhc2VzL0JDTS82LjUuNy9nYS9zZGstYWxsLTYuNS43L3NyYy9hcHBsL2RpYWcvc2hlbGwuYwkyMDE2LTEyLTAxIDA1OjE2OjI1LjAwMDAwMDAwMCArMDIwMAorKysrIHNkay1hbGwtNi41Ljcvc3JjL2FwcGwvZGlhZy9zaGVsbC5jCTIwMTctMDEtMjYgMTI6MzE6NDkuODczNDI3NDAwICswMjAwCitAQCAtMjE0LDEwICsyMTQsMTUgQEAKKyAgICAgICAgIHZhcl91bnNldCgiaWhvc3RfbW9kZSIsIEZBTFNFLCBUUlVFLCBGQUxTRSk7CisgICAgICAgICB2YXJfdW5zZXQoIm51bV91Y3MiLCBGQUxTRSwgVFJVRSwgRkFMU0UpOworICAgICB9CisrICAgIAorKyNpZmRlZiBDT05GSUdfU1dJVENIX1JQQworKyAgICBjbGlfb3V0KCJSdW5uaW5nIHdpdGggcmVtb3RlIGhhcmR3YXJlLCBza2lwIHNldHRpbmcgdW5pdCB2YXJpYWJsZVxuIik7CisrICAgIHJldHVybjsKKysjZW5kaWYKKyAKKyAgICAgaWYgKG5ld191bml0ID49IDApIHsKKy0JICAgIHVpbnQxNiBkZXZfaWQ7CistCSAgICB1aW50OCByZXZfaWQ7CisrICAgICAgICB1aW50MTYgZGV2X2lkOworKyAgICAgICAgdWludDggcmV2X2lkOworICAgICAgICAgY2hhciAqY2hpcF9zdHJpbmc7CisgICAgICAgICB1aW50MTYgZGV2X2lkX2RyaXZlcjsKKyAgICAgICAgIHVpbnQ4IHJldl9pZF9kcml2ZXI7CitAQCAtNDY2LDcgKzQ3MSw5IEBACisgICAgICAgICAvKiBOb3QgYXR0YWNoZWQsIHByaW50IG91dCBlcnJvciAqLworICAgICAgICAgaWYgKG92ZXJyaWRlX3VuaXQpCisgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisrI2lmbmRlZiBCVUlMRF9JTkdfQVNfTElCCisgICAgICAgICBjbGlfb3V0KCIlczogRXJyb3I6IFVuaXQgJWQgbm90IGF0dGFjaGVkXG4iLCBwZngsIHUpOworKyNlbmRpZgorICAgICAgICAgcmV0dXJuKEZBTFNFKTsKKyAgICAgfQorICAgICByZXR1cm4oVFJVRSk7CitkaWZmIC1OYXVyIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9zcmMvYXBwbC9kaWFnL3N5c3RlbS5jIHNkay1hbGwtNi41Ljcvc3JjL2FwcGwvZGlhZy9zeXN0ZW0uYworLS0tIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9zcmMvYXBwbC9kaWFnL3N5c3RlbS5jCTIwMTYtMTItMDEgMDU6MTY6MjUuMDAwMDAwMDAwICswMjAwCisrKysgc2RrLWFsbC02LjUuNy9zcmMvYXBwbC9kaWFnL3N5c3RlbS5jCTIwMTctMDEtMjYgMTI6MzU6NDUuMDAxOTgyNDU0ICswMjAwCitAQCAtMjM3OSw3ICsyMzc5LDEzIEBACisgICAgIERJU1BMQVlfTUVNX1BSSU5URigoIiVzKCk6IEp1c3QgYmVmb3JlIEJDTSBzaGVsbFxyXG4iLF9fRlVOQ1RJT05fXykpIDsKKyAKKyAgICAgd2hpbGUgKDEpIHsKKysgICAgICAKKysjaWZuZGVmIEJVSUxEX0lOR19BU19MSUIKKyAgICAgc2hfcHJvY2VzcygtMSwgIkJDTSIsIFRSVUUpOworKyNlbHNlCisrICByZXR1cm47CisrI2VuZGlmCisrCisgI2lmZGVmIE5PX1NBTF9BUFBMCisgICAgIHJldHVybjsKKyAjZWxzZQorZGlmZiAtTmF1ciAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41Ljcvc3JjL2JjbS9kcHAvYWxsb2NfbW5ncl9jb3NxLmMgc2RrLWFsbC02LjUuNy9zcmMvYmNtL2RwcC9hbGxvY19tbmdyX2Nvc3EuYworLS0tIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9zcmMvYmNtL2RwcC9hbGxvY19tbmdyX2Nvc3EuYwkyMDE2LTEyLTAxIDA1OjE2OjQ3LjAwMDAwMDAwMCArMDIwMAorKysrIHNkay1hbGwtNi41Ljcvc3JjL2JjbS9kcHAvYWxsb2NfbW5ncl9jb3NxLmMJMjAxNy0wMS0yNiAxMjo0Mzo1MC41MTEwMDg0MDAgKzAyMDAKK0BAIC0zNjQ0LDYgKzM2NDQsNyBAQAorICAgICAgICAgaWYgKGZsb3dfdHlwZSA9PSBTT0NfVE1DX0FNX1NDSF9GTE9XX1RZUEVfQ09OTkVDVE9SKSB7CisgICAgICAgICAgICAgcmVnaW9uID0gIF9CQ01fRFBQX0FNX0NPU1FfR0VUX1JFR0lPTl9JTkRFWF9GUk9NX0ZMT1dfSU5ERVgoKmZsb3dfaWQpOworICAgICAgICAgICAgIGlmIChub2ZfcmVtb3RlX2NvcmVzICE9IFNPQ19EUFBfQ09ORklHKHVuaXQpLT5hcmFkLT5yZWdpb25fbm9mX3JlbW90ZV9jb3Jlc1tjb3JlXVtyZWdpb25dKSB7CisrCSAgICAgICAgcHJpbnRmKCIgbm9mX3JlbW90ZV9jb3JlcyAlZCAhPSAlZCBhdCBjb3JlICVkIHJlZ2lvbiAlZFxuIiwgbm9mX3JlbW90ZV9jb3JlcywgU09DX0RQUF9DT05GSUcodW5pdCktPmFyYWQtPnJlZ2lvbl9ub2ZfcmVtb3RlX2NvcmVzW2NvcmVdW3JlZ2lvbl0sIGNvcmUsIHJlZ2lvbik7CisgICAgICAgICAgICAgICAgIEJDTUROWF9FUlJfRVhJVF9NU0coQkNNX0VfUEFSQU0sKF9CU0xfQkNNX01TRygiUmVxdWVzdGVkIHJlZ2lvbiBkb2Vzbid0IHN1cHBvcnQgcmVxdWVzdGVkIG51bWJlciBvZiByZW1vdGUgY29yZXMiKSkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KK2RpZmYgLU5hdXIgL3Byb2plY3RzL05UU1dfU1dfUFJKUy9FeHRlcm5hbFJlbGVhc2VzL0JDTS82LjUuNy9nYS9zZGstYWxsLTYuNS43L3NyYy9iY20vcnBjL3BhY2suYyBzZGstYWxsLTYuNS43L3NyYy9iY20vcnBjL3BhY2suYworLS0tIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9zcmMvYmNtL3JwYy9wYWNrLmMJMjAxNi0xMi0wMSAwNToxNzowMC4wMDAwMDAwMDAgKzAyMDAKKysrKyBzZGstYWxsLTYuNS43L3NyYy9iY20vcnBjL3BhY2suYwkyMDE3LTAxLTI2IDEyOjUyOjUxLjAxNjcxMTE0MyArMDIwMAorQEAgLTk5NzUsNiArOTk3NSw5IEBACisgdWludDggKgorIF9iY21fcGFja19yeF90cmFwX2NvbmZpZyh1aW50OCAqYnVmLCBiY21fcnhfdHJhcF9jb25maWdfdCAqdmFyKQorIHsKKysJdWludDggIHplcm9fOCAgPSAwOworKwl1aW50MzIgemVyb18zMiA9IDA7CisrCQorIAlCQ01fUEFDS19VMzIoYnVmLCB2YXItPmZsYWdzKTsKKyAJQkNNX1BBQ0tfVTMyKGJ1ZiwgdmFyLT5kZXN0X3BvcnQpOworIAlCQ01fUEFDS19VMzIoYnVmLCB2YXItPmRlc3RfZ3JvdXApOworQEAgLTk5ODksMTIgKzk5OTIsMzIgQEAKKyAJQkNNX1BBQ0tfVTMyKGJ1ZiwgdmFyLT5mb3J3YXJkaW5nX3R5cGUpOworIAlCQ01fUEFDS19VMzIoYnVmLCB2YXItPmZvcndhcmRpbmdfaGVhZGVyKTsKKyAJQkNNX1BBQ0tfVTMyKGJ1ZiwgdmFyLT5lbmNhcF9pZCk7CistCUJDTV9QQUNLX1UzMihidWYsIHZhci0+bWlycm9yX2NtZC0+ZmxhZ3MpOworLQlCQ01fUEFDS19VOChidWYsIHZhci0+bWlycm9yX2NtZC0+Zm9yd2FyZF9zdHJlbmd0aCk7CistCUJDTV9QQUNLX1U4KGJ1ZiwgdmFyLT5taXJyb3JfY21kLT5jb3B5X3N0cmVuZ3RoKTsKKy0JQkNNX1BBQ0tfVTMyKGJ1ZiwgdmFyLT5taXJyb3JfY21kLT5yZWN5Y2xlX2NtZCk7CistCUJDTV9QQUNLX1UzMihidWYsIHZhci0+Y29yZV9jb25maWdfYXJyLT5kZXN0X3BvcnQpOworLQlCQ01fUEFDS19VMzIoYnVmLCB2YXItPmNvcmVfY29uZmlnX2Fyci0+ZW5jYXBfaWQpOworKwkKKysgICAgICAgIGlmKHZhci0+bWlycm9yX2NtZCkKKysgICAgICAgIHsKKysgICAgICAgIEJDTV9QQUNLX1UzMihidWYsIHZhci0+bWlycm9yX2NtZC0+ZmxhZ3MpOworKyAgICAgICAgQkNNX1BBQ0tfVTgoYnVmLCB2YXItPm1pcnJvcl9jbWQtPmZvcndhcmRfc3RyZW5ndGgpOworKyAgICAgICAgQkNNX1BBQ0tfVTgoYnVmLCB2YXItPm1pcnJvcl9jbWQtPmNvcHlfc3RyZW5ndGgpOworKyAgICAgICAgQkNNX1BBQ0tfVTMyKGJ1ZiwgdmFyLT5taXJyb3JfY21kLT5yZWN5Y2xlX2NtZCk7CisrICAgICAgICB9CisrICAgICAgICBlbHNlCisrICAgICAgICB7CisrICAgICAgICBCQ01fUEFDS19VMzIoYnVmLCB6ZXJvXzMyKTsKKysgICAgICAgIEJDTV9QQUNLX1U4KGJ1ZiwgemVyb184KTsKKysgICAgICAgIEJDTV9QQUNLX1U4KGJ1ZiwgemVyb184KTsKKysgICAgICAgIEJDTV9QQUNLX1UzMihidWYsIHplcm9fMzIpOworKyAgICAgICAgfQorKyAgICAgICAgaWYodmFyLT5jb3JlX2NvbmZpZ19hcnIpCisrICAgICAgICB7CisrICAgICAgICBCQ01fUEFDS19VMzIoYnVmLCB2YXItPmNvcmVfY29uZmlnX2Fyci0+ZGVzdF9wb3J0KTsKKysgICAgICAgIEJDTV9QQUNLX1UzMihidWYsIHZhci0+Y29yZV9jb25maWdfYXJyLT5lbmNhcF9pZCk7CisrICAgICAgICB9CisrICAgICAgICBlbHNlCisrICAgICAgICB7CisrICAgICAgICBCQ01fUEFDS19VMzIoYnVmLCB6ZXJvXzMyKTsKKysgICAgICAgIEJDTV9QQUNLX1UzMihidWYsIHplcm9fMzIpOworKyAgICAgICAgfQorKwkKKyAJQkNNX1BBQ0tfVTMyKGJ1ZiwgdmFyLT5jb3JlX2NvbmZpZ19hcnJfbGVuKTsKKyAJQkNNX1BBQ0tfVTMyKGJ1ZiwgdmFyLT5xb3NfbWFwX2lkKTsKKyAJQkNNX1BBQ0tfVTMyKGJ1ZiwgdmFyLT50dW5uZWxfdGVybWluYXRpb25fdHJhcF9zdHJlbmd0aCk7CitAQCAtMTAwMDUsNiArMTAwMjgsOSBAQAorIHVpbnQ4ICoKKyBfYmNtX3VucGFja19yeF90cmFwX2NvbmZpZyh1aW50OCAqYnVmLCBiY21fcnhfdHJhcF9jb25maWdfdCAqdmFyKQorIHsKKysJdWludDggIHZhcl84LCB0ZW1wOworKwl1aW50MzIgdmFyXzMyOworKwkKKyAJQkNNX1VOUEFDS19VMzIoYnVmLCB2YXItPmZsYWdzKTsKKyAJQkNNX1VOUEFDS19VMzIoYnVmLCB2YXItPmRlc3RfcG9ydCk7CisgCUJDTV9VTlBBQ0tfVTMyKGJ1ZiwgdmFyLT5kZXN0X2dyb3VwKTsKK0BAIC0xMDAxOSwxMiArMTAwNDUsNDAgQEAKKyAJQkNNX1VOUEFDS19VMzIoYnVmLCB2YXItPmZvcndhcmRpbmdfdHlwZSk7CisgCUJDTV9VTlBBQ0tfVTMyKGJ1ZiwgdmFyLT5mb3J3YXJkaW5nX2hlYWRlcik7CisgCUJDTV9VTlBBQ0tfVTMyKGJ1ZiwgdmFyLT5lbmNhcF9pZCk7CistCUJDTV9VTlBBQ0tfVTMyKGJ1ZiwgdmFyLT5taXJyb3JfY21kLT5mbGFncyk7CistCUJDTV9VTlBBQ0tfVTgoYnVmLCB2YXItPm1pcnJvcl9jbWQtPmZvcndhcmRfc3RyZW5ndGgpOworLQlCQ01fVU5QQUNLX1U4KGJ1ZiwgdmFyLT5taXJyb3JfY21kLT5jb3B5X3N0cmVuZ3RoKTsKKy0JQkNNX1VOUEFDS19VMzIoYnVmLCB2YXItPm1pcnJvcl9jbWQtPnJlY3ljbGVfY21kKTsKKy0JQkNNX1VOUEFDS19VMzIoYnVmLCB2YXItPmNvcmVfY29uZmlnX2Fyci0+ZGVzdF9wb3J0KTsKKy0JQkNNX1VOUEFDS19VMzIoYnVmLCB2YXItPmNvcmVfY29uZmlnX2Fyci0+ZW5jYXBfaWQpOworKwkKKysgICAgICAgIGlmKHZhci0+bWlycm9yX2NtZCkKKysgICAgICAgIHsKKysgICAgICAgIEJDTV9VTlBBQ0tfVTMyKGJ1ZiwgdmFyLT5taXJyb3JfY21kLT5mbGFncyk7CisrICAgICAgICBCQ01fVU5QQUNLX1U4KGJ1ZiwgdmFyLT5taXJyb3JfY21kLT5mb3J3YXJkX3N0cmVuZ3RoKTsKKysgICAgICAgIEJDTV9VTlBBQ0tfVTgoYnVmLCB2YXItPm1pcnJvcl9jbWQtPmNvcHlfc3RyZW5ndGgpOworKyAgICAgICAgQkNNX1VOUEFDS19VMzIoYnVmLCB2YXItPm1pcnJvcl9jbWQtPnJlY3ljbGVfY21kKTsKKysgICAgICAgIH0KKysgICAgICAgIGVsc2UKKysgICAgICAgIHsKKysgICAgICAgIEJDTV9VTlBBQ0tfVTMyKGJ1ZiwgdmFyXzMyKTsKKysgICAgICAgIEJDTV9VTlBBQ0tfVTgoYnVmLCB2YXJfOCk7CisrICAgICAgICBCQ01fVU5QQUNLX1U4KGJ1ZiwgdmFyXzgpOworKyAgICAgICAgQkNNX1VOUEFDS19VMzIoYnVmLCB2YXJfMzIpOworKyAgICAgICAgLyogbWFrZSBjb21waWxlciBoYXBweSA6IHVuc2VkLWJ1dC1zZXQgKi8KKysgICAgICAgIHRlbXAgPSB2YXJfODsKKysgICAgICAgIHZhcl84ID0gdmFyXzMyOworKyAgICAgICAgdmFyXzMyID0gdGVtcDsKKysgICAgICAgIH0KKysgICAgICAgIGlmKHZhci0+Y29yZV9jb25maWdfYXJyKQorKyAgICAgICAgeworKyAgICAgICAgQkNNX1VOUEFDS19VMzIoYnVmLCB2YXItPmNvcmVfY29uZmlnX2Fyci0+ZGVzdF9wb3J0KTsKKysgICAgICAgIEJDTV9VTlBBQ0tfVTMyKGJ1ZiwgdmFyLT5jb3JlX2NvbmZpZ19hcnItPmVuY2FwX2lkKTsKKysgICAgICAgIH0KKysgICAgICAgIGVsc2UKKysgICAgICAgIHsKKysgICAgICAgIEJDTV9VTlBBQ0tfVTMyKGJ1ZiwgdmFyXzMyKTsKKysgICAgICAgIEJDTV9VTlBBQ0tfVTMyKGJ1ZiwgdmFyXzMyKTsKKysgICAgICAgIC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgOiB1bnNlZC1idXQtc2V0ICovCisrICAgICAgICB0ZW1wID0gdmFyXzg7CisrICAgICAgICB2YXJfOCA9IHZhcl8zMjsKKysgICAgICAgIHZhcl8zMiA9IHRlbXA7CisrICAgICAgICB9CisrCQorIAlCQ01fVU5QQUNLX1UzMihidWYsIHZhci0+Y29yZV9jb25maWdfYXJyX2xlbik7CisgCUJDTV9VTlBBQ0tfVTMyKGJ1ZiwgdmFyLT5xb3NfbWFwX2lkKTsKKyAJQkNNX1VOUEFDS19VMzIoYnVmLCB2YXItPnR1bm5lbF90ZXJtaW5hdGlvbl90cmFwX3N0cmVuZ3RoKTsKK2RpZmYgLU5hdXIgL3Byb2plY3RzL05UU1dfU1dfUFJKUy9FeHRlcm5hbFJlbGVhc2VzL0JDTS82LjUuNy9nYS9zZGstYWxsLTYuNS43L3NyYy9iY20vcnBjL3NlcnZlci5jIHNkay1hbGwtNi41Ljcvc3JjL2JjbS9ycGMvc2VydmVyLmMKKy0tLSAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41Ljcvc3JjL2JjbS9ycGMvc2VydmVyLmMJMjAxNi0xMi0wMSAwNToxNzowMC4wMDAwMDAwMDAgKzAyMDAKKysrKyBzZGstYWxsLTYuNS43L3NyYy9iY20vcnBjL3NlcnZlci5jCTIwMTctMDEtMjYgMTI6NTk6MDAuNzc5NDYyODg1ICswMjAwCitAQCAtMTExMjk0LDExICsxMTEyOTQsMTkgQEAKKyAJCXJfcF9jb25maWcgPSBOVUxMOworIAl9IGVsc2UgeworIAkJcl9wX2NvbmZpZyA9ICZjb25maWc7CisrCQkJIGJjbV9yeF90cmFwX2NvbmZpZ190X2luaXQocl9wX2NvbmZpZyk7CisgCQkodm9pZCkgX2JjbV91bnBhY2tfcnhfdHJhcF9jb25maWcocl9wcCwgcl9wX2NvbmZpZyk7CisgCX0KKyAJYmNtX3JwY19mcmVlKHJfcGt0LCByX2Nvb2tpZSk7CisgCistCXJfcmV0ID0gYmNtX3J4X3RyYXBfc2V0KHVuaXQsIHRyYXBfaWQsIHJfcF9jb25maWcpOworKwlpZihyX3BfY29uZmlnKQorKyAgICAgICAgeworKwkgIHJfcmV0ID0gYmNtX3J4X3RyYXBfc2V0KHVuaXQsIHRyYXBfaWQsIHJfcF9jb25maWcpOworKyAgICAgICAgfQorKyAgICAgICAgZWxzZQorKyAgICAgICAgeworKwkgIHJfcmV0ID0gQkNNX0VfRU1QVFk7CisrICAgICAgICB9CisgCisgCXJfcGt0ID0gYmNtX3JwY19zZXR1cCgnUycsICh1aW50MzIgKikwLCA0LCByX3NlcSwgcl9yZXQpOworIAlyX3BwID0gcl9wa3QgKyBCQ01fUlBDX0hMRU4rNDsKK2RpZmYgLU5hdXIgL3Byb2plY3RzL05UU1dfU1dfUFJKUy9FeHRlcm5hbFJlbGVhc2VzL0JDTS82LjUuNy9nYS9zZGstYWxsLTYuNS43L3N5c3RlbXMvbGludXgvdXNlci9jb21tb24vc29jZGlhZy5jIHNkay1hbGwtNi41Ljcvc3lzdGVtcy9saW51eC91c2VyL2NvbW1vbi9zb2NkaWFnLmMKKy0tLSAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41Ljcvc3lzdGVtcy9saW51eC91c2VyL2NvbW1vbi9zb2NkaWFnLmMJMjAxNi0xMi0wMSAwNToxODo0MC4wMDAwMDAwMDAgKzAyMDAKKysrKyBzZGstYWxsLTYuNS43L3N5c3RlbXMvbGludXgvdXNlci9jb21tb24vc29jZGlhZy5jCTIwMTctMDEtMjYgMTM6MDI6MTYuMDAwMjQ2NDQ2ICswMjAwCitAQCAtMTc3LDcgKzE3NywxMSBAQAorIC8qCisgICogTWFpbiBsb29wLgorICAqLworLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisrI2lmbmRlZiBCVUlMRF9JTkdfQVNfTElCCisrIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisrI2Vsc2UKKysgaW50IHNvY2RpYWdfbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorKyNlbmRpZgorIHsKKyAgICAgaW50IGksIGxlbjsKKyAgICAgY2hhciAqZW52c3RyOworQEAgLTI2MCw4ICsyNjQsMTAgQEAKKyAjZW5kaWYKKyAKKyAgICAgZGlhZ19zaGVsbCgpOworLQorKyAgICAKKysjaWZuZGVmIEJVSUxEX0lOR19BU19MSUIKKyAgICAgbGludXhfYmRlX2Rlc3Ryb3koYmRlKTsKKysjZW5kaWYKKyAjaWZkZWYgTUVNTE9HX1NVUFBPUlQKKyAgICAgaWYgKG1lbWxvZ19sb2NrKSB7CisgICAgICAgICBzYWxfbXV0ZXhfZGVzdHJveShtZW1sb2dfbG9jayk7CitkaWZmIC1OYXVyIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9zeXN0ZW1zL3NpbS9zb2NkaWFnLmMgc2RrLWFsbC02LjUuNy9zeXN0ZW1zL3NpbS9zb2NkaWFnLmMKKy0tLSAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41Ljcvc3lzdGVtcy9zaW0vc29jZGlhZy5jCTIwMTYtMTItMDEgMDU6MTg6NDEuMDAwMDAwMDAwICswMjAwCisrKysgc2RrLWFsbC02LjUuNy9zeXN0ZW1zL3NpbS9zb2NkaWFnLmMJMjAxNy0wMS0yNiAxMzowOToyMS4wMzM1NjAyMDUgKzAyMDAKK0BAIC0zMSwxMSArMzEsMTYgQEAKKyAvKgorICAqIE1haW4gbG9vcC4KKyAgKi8KKy1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorKyNpZm5kZWYgQlVJTERfSU5HX0FTX0xJQgorKyBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorKyNlbHNlCisrIGludCBzb2NkaWFnX21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKysjZW5kaWYKKyB7CisgICAgIGNoYXIgKnNvY3JjID0gU09DX0lOSVRfUkM7CisgICAgIGNoYXIgKmNvbmZpZ19maWxlID0gTlVMTCwgKmNvbmZpZ190ZW1wID0gTlVMTDsKKyAgICAgaW50IGxlbiA9IDA7CisrICAgIEZJTEUgKmZwOworIAorICAgICBpZiAoKGNvbmZpZ19maWxlID0gZ2V0ZW52KCJCQ01fQ09ORklHX0ZJTEUiKSkgIT0gTlVMTCkgeworICAgICAgICAgbGVuID0gc2FsX3N0cmxlbihjb25maWdfZmlsZSk7CitAQCAtNTYsNiArNjEsMTIgQEAKKyAJZXhpdCgxKTsKKyAgICAgfQorIAorKyAgICBpZiAoKGZwID0gc2FsX2ZvcGVuKCJyYy5zb2MiLCAiciIpKSAhPSBOVUxMKQorKyAgICB7CisrICAgICAgICBzZXRlbnYoIlNPQ19CT09UX1NDUklQVCIsICJyYy5zb2MiLCAwKTsKKysgICAgICAgIHNhbF9mY2xvc2UoZnApOworKyAgICB9CisrCisgI2lmZGVmIERFQlVHX1NUQVJUVVAKKyAgICAgZGVidWdrX3NlbGVjdChERUJVR19TVEFSVFVQKTsKKyAjZW5kaWYKKworZGlmZiAtTmF1ciAvcHJvamVjdHMvTlRTV19TV19QUkpTL0V4dGVybmFsUmVsZWFzZXMvQkNNLzYuNS43L2dhL3Nkay1hbGwtNi41Ljcvc3JjL2JjbS9ycGMvcnBjLmMgc2RrLWFsbC02LjUuNy9zcmMvYmNtL3JwYy9ycGMuYworLS0tIC9wcm9qZWN0cy9OVFNXX1NXX1BSSlMvRXh0ZXJuYWxSZWxlYXNlcy9CQ00vNi41LjcvZ2Evc2RrLWFsbC02LjUuNy9zcmMvYmNtL3JwYy9ycGMuYwkyMDE2LTExLTMwIDIyOjE3OjAwLjAwMDAwMDAwMCAtMDUwMAorKysrIHNkay1hbGwtNi41Ljcvc3JjL2JjbS9ycGMvcnBjLmMJMjAxNy0wMS0yNyAwODoyNzozNy42NTYxODYzNzEgLTA1MDAKK0BAIC0yNjgsNyArMjY4LDcgQEAKKyAKKyAgICAgYnAgPSBidWY7CisgICAgIEJDTV9QQUNLX1UzMihicCwgc2VxKTsKKy0KKysvKioqKioqKioqKioqKioqIElMIDIwMTctMDEtMjYgIFdIWSBBREQgdGhlc2UgY2hlY2s/PyBub3QgaW4gNi41LjYgKioqKioqKioqCisgICAgIGlmICghQkNNX1VOSVRfVkFMSUQodW5pdCkgfHwgKEJDTV9DT05UUk9MKHVuaXQpLT5kcnZfY29udHJvbCA9PSBOVUxMKSkgeworICAgICAgICAgX2JjbV9ycGNfdW5saW5rX3JlcXVlc3QocmVxKTsKKyAgICAgICAgIHNhbF9zZW1fZGVzdHJveShyZXEtPnNlbSk7CitAQCAtMjc2LDcgKzI3Niw3IEBACisgICAgICAgICBzYWxfZnJlZSgodm9pZCAqKXJlcSk7CisgICAgICAgICByZXR1cm4gQkNNX0VfTUVNT1JZOworICAgICB9CistCisrKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgIGNwdSA9ICooY3B1ZGJfa2V5X3QgKilCQ01fQ09OVFJPTCh1bml0KS0+ZHJ2X2NvbnRyb2w7CisgI2lmZGVmIEJDTV9SUENfQVRQX1RYX0NBTExCQUNLCisgICAgIC8qCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvc2gvYmFsX3N3aXRjaF9hcHAuc2ggYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3NoL2JhbF9zd2l0Y2hfYXBwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxNDYxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9iY20tc2RrL3NoL2JhbF9zd2l0Y2hfYXBwLnNoCkBAIC0wLDAgKzEsNDkgQEAKKyMhL2Jpbi9zaAorCit3aGlsZSBbWyAkIyA+IDEgXV0KK2RvCitrZXk9IiQxIgorCitjYXNlICRrZXkgaW4KKyAgICAtQ2EpCisgICAgQ09SRV9JUFVEUD0iJDIiCisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAtUykKKyAgICBTV0lUQ0hfSVBVRFA9IiQyIgorICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAorICAgIDs7CisgICAgKikKKyAgICAgICAgICAgICMgdW5rbm93biBvcHRpb24KKyAgICBlY2hvICJVbmtub3duIE9wdGlvbnMgLSAke2tleX0iCisgICAgOzsKK2VzYWMKK3NoaWZ0ICMgcGFzdCBhcmd1bWVudCBvciB2YWx1ZQorZG9uZQorCisKK0NPUkVfSVA9JHtDT1JFX0lQVURQJSU6Kn0KK0NPUkVfVURQPSR7Q09SRV9JUFVEUCMjKjp9CitTV0lUQ0hfSVA9JHtTV0lUQ0hfSVBVRFAlJToqfQorU1dJVENIX1VEUD0ke1NXSVRDSF9JUFVEUCMjKjp9CisKK2NkIC9vcHQvYmNtNTY0NTAKKworaWYgWyAhIC16ICIke1NXSVRDSF9JUH0iIF07IHRoZW4KK3NlZCAtaSAicy8uKmFwcC5pcC4qL2JhbCBzZXQgYXBwLmlwICR7U1dJVENIX0lQfS8iIC4vYmFsLnNvYworZmkKKworaWYgWyAhIC16ICIke1NXSVRDSF9VRFB9IiBdOyB0aGVuCitzZWQgLWkgInMvLiphcHAudWRwX3BvcnQuKi9iYWwgc2V0IGFwcC51ZHBfcG9ydCAke1NXSVRDSF9VRFB9LyIgLi9iYWwuc29jCitmaQorCitpZiBbICEgLXogIiR7Q09SRV9JUH0iIF07IHRoZW4KK3NlZCAtaSAicy8uKmFwcC5wZWVyX2lwLiovYmFsIHNldCBhcHAucGVlcl9pcCAke0NPUkVfSVB9LyIgLi9iYWwuc29jCitmaQorCitpZiBbICEgLXogIiR7Q09SRV9VRFB9IiBdOyB0aGVuCitzZWQgLWkgInMvLiphcHAucGVlcl9wb3J0LiovYmFsIHNldCBhcHAucGVlcl9wb3J0ICR7Q09SRV9VRFB9LyIgLi9iYWwuc29jCitmaQorCisuL2t0Ml9pbml0LnNoCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvc2gva3QyX2luaXQuc2guc3ZrMyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsvc2gva3QyX2luaXQuc2guc3ZrMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjBlZjRjCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay9zaC9rdDJfaW5pdC5zaC5zdmszCkBAIC0wLDAgKzEsMjIgQEAKKyMhL2Jpbi9zaAorCitQQ0lfS1QyX0JVUz0wMDAwOjA1OjAwLjAKKworbWtub2QgL2Rldi9saW51eC11c2VyLWJkZSBjIDEyNiAwCitzbGVlcCAxCisKK2lmIFsgIiQxIiA9PSAiLS1zZXR1cF9vbmx5IiBdOyB0aGVuCisgICAgZXhpdAorZmkKKworZWNobyAiV2FpdGluZyBmb3IgS1QyIG91dCBvZiByZXNldCIKKword2hpbGUgWyAhIC1kIC9zeXMvYnVzL3BjaS9kZXZpY2VzLyRQQ0lfS1QyX0JVUyBdCitkbworICAgICBzbGVlcCAxCitkb25lCisKK3NsZWVwIDEKKworZWNobyAiU3RhcnQgYmNtLnVzZXIgLi4uIgorLi9iY20udXNlcgpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvM3JkcGFydHkvbGluZW5vaXNlIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvbGluZW5vaXNlCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdiMWQwODcKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9saW5lbm9pc2UKQEAgLTAsMCArMSBAQAorbWFwbGUvc2RrL2hvc3RfcmVmZXJlbmNlL2xpbmVub2lzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlLzNyZHBhcnR5L21hcGxlL01ha2VmaWxlIGIvYmFsX3JlbGVhc2UvM3JkcGFydHkvbWFwbGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxNWU5MgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L21hcGxlL01ha2VmaWxlCkBAIC0wLDAgKzEsNDUgQEAKKyMgVGhpcyBkdW1teSBNYWtlZmlsZSBkb2Vzbid0IGJ1aWxkIGFueXRoaW5nLgorIyBJdCBqdXN0IGFkZHMgcGF0aHMgdG8gTWFwbGUgU0RLIGhlYWRlciBmaWxlcyBhbmQgbGlicmFyaWVzCisjCitNT0RfTkFNRSA9IG1hcGxlX3NkaworTU9EX1RZUEUgPSBsaWIKKworTU9EX0lOQ19ESVJTICA9ICQoU1JDX0RJUikvc2RrL2hvc3RfZHJpdmVyL2FwaQorTU9EX0lOQ19ESVJTICs9ICQoU1JDX0RJUikvc2RrL2hvc3RfZHJpdmVyL2hvc3RfYXBpCisKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorICAgTU9EX0lOQ19ESVJTICs9ICQoU1JDX0RJUikvc2RrL2hvc3RfY3VzdG9taXplZC9lbWJlZGRlZF9jbGkKKyAgIE1PRF9JTkNfRElSUyArPSAkKFNSQ19ESVIpL3Nkay9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vb3NfY2xpCitlbmRpZgorCitpZm5lcSAoIiQoQk9BUkQpIiwgIiIpCisgICBNT0RfSU5DX0RJUlMgKz0gJChTUkNfRElSKS9zZGsvaG9zdF9jdXN0b21pemVkL2JvYXJkLyQoQk9BUkQpCitlbmRpZgorCitNT0RfSU5DX0RJUlMgKz0gJChTUkNfRElSKS9zZGsvaG9zdF9kcml2ZXIvdHJhbnNwb3J0CitNT0RfSU5DX0RJUlMgKz0gJChTUkNfRElSKS9zZGsvaG9zdF9kcml2ZXIvbW9kZWwKK01PRF9JTkNfRElSUyArPSAkKFNSQ19ESVIpL3Nkay9ob3N0X2RyaXZlci9jb21tb25fZ3BvbgorTU9EX0lOQ19ESVJTICs9ICQoU1JDX0RJUikvc2RrL2hvc3RfZHJpdmVyL3N3X3ZlcnNpb24KKworTU9EX0xJQlMgID0gLUwkKFNSQ19ESVIpL3Nkay9idWlsZC9vdXRwdXQKK01PRF9MSUJTICs9IC1sbW9kZWwKK01PRF9MSUJTICs9IC1sY29tbW9uX2FwaQorTU9EX0xJQlMgKz0gLWx0cmFuc3BvcnQKK01PRF9MSUJTICs9IC1sZGV2aWNlX3NlbGVjdG9yCitpZm5lcSAoIiQoQk9BUkQpIiwgIiIpCisgICBNT0RfTElCUyArPSAtbGJjbV9ib2FyZAorZW5kaWYKKworaWZlcSAoIiQoU0lNVUxBVElPTl9CVUlMRCkiLCAieSIpCisgICAgTU9EX0xJQlMgKz0gLWx0cl9wbHVnaW5fdWRwCitlbHNlCisgICAgTU9EX0xJQlMgKz0gLWx0cl9wbHVnaW5fbXV4IC1sdHJfcGx1Z2luX3JhdyAtbHRyX3BsdWdpbl9yYXdfdWQKK2VuZGlmCisKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorICAgIE1PRF9JTkNfRElSUyArPSAkKFNSQ19ESVIpL3Nkay9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZworICAgIE1PRF9JTkNfRElSUyArPSAkKFNSQ19ESVIpL3Nkay9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpCisgICAgTU9EX0lOQ19ESVJTICs9ICQoU1JDX0RJUikvc2RrL2hvc3RfcmVmZXJlbmNlL2RldmljZV9zZWxlY3RvcgorICAgIE1PRF9MSUJTICs9IC1sYXBpX2NsaQorICAgIE1PRF9MSUJTICs9IC1sYXBpX2Rldl9sb2cKK2VuZGlmCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9tYXBsZS9jdXIgYi9iYWxfcmVsZWFzZS8zcmRwYXJ0eS9tYXBsZS9jdXIKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMDRjODZjZQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlLzNyZHBhcnR5L21hcGxlL2N1cgpAQCAtMCwwICsxIEBACisuLi8uLi8uLi9iY202ODYyMF9yZWxlYXNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvQ09QWVJJR0hUIGIvYmFsX3JlbGVhc2UvQ09QWVJJR0hUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Yzk5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9DT1BZUklHSFQKQEAgLTAsMCArMSwyNiBAQAorPDpjb3B5cmlnaHQtQlJDTToyMDE3OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIENvcHlyaWdodCAoYykgMjAxNyBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvTWFrZWZpbGUgYi9iYWxfcmVsZWFzZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmE2NDg4Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvTWFrZWZpbGUKQEAgLTAsMCArMSw0MjUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpwcm9wcmlldGFyeTpzdGFuZGFyZAorIyAgIAorIyAgICAgQnJvYWRjb20gTHRkLiBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tIEx0ZC4KKyMgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgICAKKyMgIFRoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gTHRkLiBhbmQvb3IgaXRzCisjICBsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAorIyAgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKKyMgIGJldHdlZW4geW91IGFuZCBCcm9hZGNvbSBMdGQuIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCisjICBhbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIEx0ZC4gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0CisjICB0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20gTHRkLgorIyAgZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorIyAgcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKKyMgIE5PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCisjICBCUk9BRENPTSBMVEQgQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIyAgIAorIyAgRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyMgICAKKyMgIDEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisjICAgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20gTHRkLiwgYW5kIHlvdSBzaGFsbCB1c2UKKyMgICAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyMgICAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbSBMdGQuCisjICAgICAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorIyAgIAorIyAgMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisjICAgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorIyAgICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorIyAgICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisjICAgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisjICAgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyMgICAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorIyAgICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyMgICAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisjICAgCisjICAzLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyMgICAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisjICAgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisjICAgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyMgICAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisjICAgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorIyAgICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyMgICAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisjICAgICAgTElNSVRFRCBSRU1FRFkuCisjICA6PgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDZW50cmFsIE1ha2VmaWxlCisjCisKKyMgSWRlbnRpZnkgd2hldGhlciBpdCBpcyBjdXN0b21lciBvciBkZXZlbG9wbWVudCBidWlsZAoraWZuZXEgKCIkKHdpbGRjYXJkIC5yZWxlYXNlX2J1aWxkKSIsIiIpCisgICAgUkVMRUFTRV9CVUlMRD15CisgICAgZXhwb3J0IFJFTEVBU0VfQlVJTEQKK2VuZGlmCisKK0RPQ1NfU1VCU1lTVEVNIDo9IGNvcmUKK2lmZXEgKCIkKEJVSUxEX09GX0FHRU5UKSIsICJ5IikKKyAgICBpZm5lcSAoIiQoZmluZHN0cmluZyBjb3JlLCQoTUFLRUNNREdPQUxTKSkiLCAiIikKKyAgICAgICAgJChlcnJvciBTZXR0aW5nIEJVSUxEX09GX0FHRU5UPSQoQlVJTERfT0ZfQUdFTlQpIGluIGluY29tcGF0aWJsZSB3aXRoIG9uZSBvZiBtYWtlIHRhcmdldHMgIiQoTUFLRUNNREdPQUxTKSIiKQorICAgIGVuZGlmCisgICAgIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgaWZlcSAoIiQoTUFLRUNNREdPQUxTKSIsICJjbGVhbiIpCisgICAgICAgIE9WRUVSSURFX0dPQUwgPSBjbGVhbl9hZ2VudAorICAgIGVuZGlmCisgICAgaWZlcSAoIiQoTUFLRUNNREdPQUxTKSIsICIiKQorICAgICAgICBPVkVFUklERV9HT0FMID0gc2RuX2FnZW50CisgICAgZW5kaWYKKyAgICBET0NTX1NVQlNZU1RFTSA6PSBhZ2VudAorZW5kaWYKK2lmZXEgKCIkKEJVSUxEX09GX0FHRU5UKSIsICJuIikKKyAgICBpZm5lcSAoIiQoZmluZHN0cmluZyBhZ2VudCwkKE1BS0VDTURHT0FMUykpIiwgIiIpCisgICAgICAgICQoZXJyb3IgU2V0dGluZyBCVUlMRF9PRl9BR0VOVD0kKEJVSUxEX09GX0FHRU5UKSBpbiBpbmNvbXBhdGlibGUgd2l0aCBvbmUgb2YgbWFrZSB0YXJnZXRzICIkKE1BS0VDTURHT0FMUykiIikKKyAgICBlbmRpZgorICAgICMgQmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIGlmZXEgKCIkKE1BS0VDTURHT0FMUykiLCAiY2xlYW4iKQorICAgICAgICBPVkVFUklERV9HT0FMID0gY2xlYW5fY29yZQorICAgIGVuZGlmCisgICAgaWZlcSAoIiQoTUFLRUNNREdPQUxTKSIsICIiKQorICAgICAgICBPVkVFUklERV9HT0FMID0gY29yZQorICAgIGVuZGlmCitlbmRpZgoraWZuZXEgKCIkKGZpbmRzdHJpbmcgYWdlbnQsJChNQUtFQ01ER09BTFMpKSIsICIiKQorICAgIEJVSUxEX09GX0FHRU5UID0geQorZW5kaWYKKworQlVJTERfTkNfQUdFTlQgPz0geQorCitleHBvcnQgQlVJTERfT0ZfQUdFTlQKK2V4cG9ydCBCVUlMRF9OQ19BR0VOVAorCitQTEFURk9STSA/PSBtYXBsZQorVE9QX0RJUj0kKHNoZWxsIHB3ZCkKK2V4cG9ydCBQTEFURk9STQorZXhwb3J0IFRPUF9ESVIKKworTUFLRV9ESVI9JChUT1BfRElSKS9taworTUFLRV9ERVZJQ0VfRElSPSQoTUFLRV9ESVIpLyQoREVWSUNFKQorZXhwb3J0IE1BS0VfRElSCitleHBvcnQgTUFLRV9ERVZJQ0VfRElSCisKK1RPUF9TUkNfRElSPSQoVE9QX0RJUikvc3JjCitleHBvcnQgVE9QX1NSQ19ESVIKKworaW5jbHVkZSAkKE1BS0VfRElSKS9NYWtlZmlsZS5pbml0aWFsX2NvbmZpZworaW5jbHVkZSAkKFRPUF9ESVIpL2JyYW5jaC5pbmZvCisKK09VVF9ESVIgICAgICAgICAgPz0gJChUT1BfRElSKS9idWlsZAorT1VUX0RPQ1NfRElSCSA/PSAkKE9VVF9ESVIpL2RvYworCitleHBvcnQgT1VUX0RJUgorZXhwb3J0IE9VVF9ET0NTX0RJUgorCisjIExpc3Qgb2YgYWxsIG1vZHVsZXMsIGFsbCBsaWJyYXJ5IG1vZHVsZXMgYW5kIGFsbCBhcHBsaWNhdGlvbiBtb2R1bGVzCitleHBvcnQgQUxMX01PRFVMRVMKK2V4cG9ydCBBTExfTElCX01PRFVMRVMKK2V4cG9ydCBBTExfQVBQX01PRFVMRVMKKworIyBDdXJyZW50IGJvYXJkCitleHBvcnQgQk9BUkQKK2lmbmVxICgiJChCT0FSRCkiLCAiIikKKyAgICBCT0FSRF9ESVIgPz0gJChUT1BfRElSKS8zcmRwYXJ0eS9tYXBsZS9ib2FyZHMvY3VyLyQoQk9BUkQpCisgICAgZXhwb3J0IEJPQVJEX0RJUgorZW5kaWYKKworIyBMb2NhdGlvbiBvZiBNYXBsZSBTREsgZGlyCitNQVBMRV9TREtfRElSID89ICQoVE9QX0RJUikvM3JkcGFydHkvbWFwbGUvY3VyCisKK0xPQ0FMX01BUExFX1NES19ESVIgPSAzcmRwYXJ0eS9tYXBsZS9zZGsKK2V4cG9ydCBNQVBMRV9TREtfRElSCitleHBvcnQgTE9DQUxfTUFQTEVfU0RLX0RJUgorTUFQTEVfQk9BUkQgPz0gJChCT0FSRCkKK2lmbmVxICgiJChNQVBMRV9CT0FSRCkiLCAiIikKKyAgICBNQVBMRV9CT0FSRF9ESVIgPz0gJChNQVBMRV9TREtfRElSKS8uLi9ib2FyZHMvY3VyLyQoTUFQTEVfQk9BUkQpCitlbHNlICAgIAorICAgIE1BUExFX0JPQVJEX0RJUiA9ICQoc2hlbGwgY2F0ICQoVE9QX0RJUikvJChMT0NBTF9NQVBMRV9TREtfRElSKS9idWlsZC8ubWFwbGVfYm9hcmRfZGlyIDI+IC9kZXYvbnVsbCkKKyAgICB0bXAgPSAkKHNoZWxsIDsgcm0gLWYgJChPVVRfRElSKS8ubWFwbGVfYm9hcmRfZGlyKQorZW5kaWYKKworSU5HX1NES19WRVIgPz0gNi41LjcKK0lOR19TREsgPz0gc2RrLWFsbC0kKElOR19TREtfVkVSKQorSU5HX1NES19QQVRDSCA/PXNkay1iYWwtJChJTkdfU0RLX1ZFUikucGF0Y2gKK0lOR19TREtfVE9QX0RJUiA/PSAkKFRPUF9ESVIpLzNyZHBhcnR5L2JjbS1zZGsKK2lmZXEgKCIkKEJPQVJEKSIsICIiKQorCUlOR19TREtfREVGQVVMVF9ESVIgOj0gJChJTkdfU0RLX1RPUF9ESVIpL2J1aWxkLyQoSU5HX1NESykKK2Vsc2UKKwlJTkdfU0RLX0RFRkFVTFRfRElSIDo9ICQoSU5HX1NES19UT1BfRElSKS9idWlsZC0kKEJPQVJEKS8kKElOR19TREspCitlbmRpZgorSU5HX1NES19ESVIgPz0gJChJTkdfU0RLX0RFRkFVTFRfRElSKQorZXhwb3J0IElOR19TREtfVkVSCitleHBvcnQgSU5HX1NESworZXhwb3J0IElOR19TREtfUEFUQ0gKK2V4cG9ydCBJTkdfU0RLX1RPUF9ESVIgCitleHBvcnQgSU5HX1NES19ESVIgCisKK1NXSVRDSCA/PSBxYXgKK2V4cG9ydCBTV0lUQ0gKKworVE1QX0JBTF9WRVJTSU9OX0g9JHtNQUtFX0RJUn0vYmFsX3ZlcnNpb24udG1wCitCQUxfVkVSU0lPTl9IOj0ke1RPUF9ESVJ9L3NyYy9jb21tb24vaW5jbHVkZS9iYWxfdmVyc2lvbi5oCisKKyMgTk9URTogQlVJTERfSU5GTyBpcyBzZXQgYW5kIGV4cG9ydGVkIGJ5IEplbmtpbnMgd2hlbiBidWlsdCBieSB0aGF0IHRvb2wKK2V4cG9ydCBKRU5LSU5TX0JVSUxECitpZmVxICgiJChKRU5LSU5TX0JVSUxEKSIsICJ5IikKKyAgICBQRVJGT1JDRV9SRVZJU0lPTjo9JChQNF9DSEFOR0VMSVNUKQorZWxzZSBpZm5lcSAoIiQoUkVMRUFTRV9CVUlMRCksICJ5IikgCisgICAgUEVSRk9SQ0VfUkVWSVNJT046PSQoc2hlbGwgcDQgY2hhbmdlcyAtbSAxIC8vJChERVBPVCkvJChCUkFOQ0gpLy4uLlwjaGF2ZSB8IGN1dCAtZCAiICIgLWYgMikKKyAgICBCVUlMRF9JTkZPPSJEZXZlbG9wZXIgYnVpbGQgXCgiJHtVU0VSfSJAIiR7UFdEfSJcKSIKKyAgICBleHBvcnQgQlVJTERfSU5GTworZWxzZQorICAgIEJVSUxEX0lORk89IkN1c3RvbWVyIFJlbGVhc2UgQnVpbGQgXCgiJHtVU0VSfSJAIiR7UFdEfSJcKSIKKyAgICBleHBvcnQgQlVJTERfSU5GTworZW5kaWYKKworCitSRUxFQVNFX1RZUEU6PSR7UkVMRUFTRV9UWVBFfQorQlVJTERfVVNFUjo9JHtVU0VSfQorQlVJTERfVE9QRElSOj0ke1RPUF9ESVJ9CitCVUlMRF9QRVJGT1JDRV9SRVZJU0lPTjo9JChQRVJGT1JDRV9SRVZJU0lPTikKK0JVSUxEX1ZFUlNJT05fUFJFRklYOj0kKFJFTEVBU0VfVFlQRSkkKE1BSk9SKS4kKE1JTk9SKS4kKFBBVENIKQorQlVJTERfVkVSU0lPTjo9JChCVUlMRF9WRVJTSU9OX1BSRUZJWCkuJHtCVUlMRF9QRVJGT1JDRV9SRVZJU0lPTn0KK0JVSUxEX0RBVEU6PWBkYXRlICslbS0lZC0lWS0lSCVNJVNgCitleHBvcnQgQlVJTERfVkVSU0lPTgorZXhwb3J0IEJVSUxEX1BFUkZPUkNFX1JFVklTSU9OCitleHBvcnQgU1JDX1JFTEVBU0VfRklMRV9QUkVGSVggPz0gcmVsZWFzZS5zcmMuJChCVUlMRF9WRVJTSU9OX1BSRUZJWCkKK2V4cG9ydCBJTkNMVURFX01BUExFX1NES19SRUxFQVNFID89IHkKKworViA/PSAwCitpZmVxICh4IiQoVikiLCB4IjAiKQorCVNJTEVOVCA9IC1zCisJZXhwb3J0IFNJTEVOVAorCVNJTEVOVF9CVUlMRD1ACitlbmRpZgorCisjIEluY2x1ZGUgYm9hcmQgc3VwcG9ydCBmaWxlCisjIEl0IGV4cG9ydHMgdmFyaWFibGVzIHN1Y2ggYXMgQ1JPU1NfQ09NUElMRQoraWZuZXEgKCIkKEJPQVJEKSIsICIiKQorICAgLWluY2x1ZGUgbWsvYm9hcmRzLyQoQk9BUkQpL2JvYXJkLmNvbmZpZworZW5kaWYKKworaWZuZXEgKCIkKE9WRUVSSURFX0dPQUwpIiwgIiIpCithbGw6ICQoT1ZFRVJJREVfR09BTCkKK2Vsc2UKK2FsbDogcHJpbnRfbWFwbGVfZGlyIGNvcmUgc2RuX2FnZW50CitlbmRpZgorCitjbGVhbjogY2xlYW5fY29yZSBjbGVhbl9hZ2VudCBjbGVhbl9vY3Nfb21jaQorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkKE9VVF9ESVIpCisKK2hlbHBfZ2VuZXJhbDoKKwlAZWNobyAibWFrZSBwYXJhbWV0ZXJzOiIKKwlAZWNobyAiICAgQk9BUkQgICAgICAgICAgICAgLSBib2FyZCB0byBidWlsZCBmb3IiCisJQGVjaG8gIiAgIEJPQVJEX0RJUiAgICAgICAgIC0gYm9hcmQgZGlyZWN0b3J5IgorCUBlY2hvICIgICBWPTxvdXRwdXRfbGV2ZWw+ICAtID0xLXZlcmJvc2UgY29tbWFuZCBvdXRwdXQsID0yLW1ha2VmaWxlIGRlYnVnIG91dHB1dCIKKwlAZWNobyAiICAgRVhUUkFfVFlQRVMgICAgICAgLSBMb3ctbGV2ZWwgb3B0aW9uLiBTcGFjZS1kZWxpbWl0ZWQgbGlzdCBvZiBleHRyYSB0eXBlcyB3aXRob3V0IGJjbW9sdF8gcHJlZml4IgorCUBlY2hvICIgICBFTkFCTEVfQ0xJICAgICAgICAtID1uLWV4Y2x1ZGUgQ0xJIHN1cHBvcnQuIEluY2x1ZGVkIGJ5IGRlZmF1bHQiCisJQGVjaG8gIm1ha2UgdGFyZ2V0czoiCisJQGVjaG8gIiAgIGFsbCAgICAgICAgICAgICAgIC0gYnVpbGQgYWxsIHN1YnN5c3RlbXMuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdGFyZ2V0IgorCUBlY2hvICIgICBjb3JlICAgICAgICAgICAgICAtIGJ1aWxkIGNvcmUgc3Vic3lzdGVtIChCQUwgc3RhbmRhbG9uZSkiCisJQGVjaG8gIiAgIHNkbl9hZ2VudCAgICAgICAgIC0gYnVpbGQgYWdlbnQgc3Vic3lzdGVtIChCQUwgU0ROIGFnZW50KSIKKwlAZWNobyAiICAgbWFwbGVfc2RrX2RpciAgICAgLSBjcmVhdGUgM3JkcGFydHkvbWFwbGUvc2RrIgorCUBlY2hvICIgICBtYXBsZV9zZGsgICAgICAgICAtIGJ1aWxkIG1hcGxlIHNkay4gUGxlYXNlIHNldCBCT0FSRD08Ym9hcmQ+IHBhcmFtZXRlciIKKwlAZWNobyAiICAgbWFwbGVfc2RrX2NsZWFuICAgLSBjbGVhbiBtYXBsZSBzZGsiCisJQGVjaG8gIiAgIGluZ19zZGtfZGlyICAgICAgIC0gY3JlYXRlIDNyZHBhcnR5L2JjbS1zZGsvYnVpbGQiCisJQGVjaG8gIiAgIGluZ19zZGsgICAgICAgICAgIC0gYnVpbGQgM3JkcGFydHkvYmNtLXNkay9idWlsZCIKKwlAZWNobyAiICAgaW5nX3Nka19jbGVhbiAgICAgLSBjbGVhbiAzcmRwYXJ0eS9iY20tc2RrL2J1aWxkIgorCUBlY2hvICIgICBpbmdfYmNtX3VzZXIgICAgICAtIGJ1aWxkIHRoZSBiY21fdXNlciBiaW5hcnkgKHRvb2xjaGFpbnMgcGF0aHMgbXVzdCBiZSBzZXQgY29ycmVjdGx5IGZpcnN0KSIKKwlAZWNobyAiICAgY2xlYW4gICAgICAgICAgICAgLSBjbGVhbiBldmVyeXRoaW5nIgorCUBlY2hvICIgICBjbGVhbl9jb3JlICAgICAgICAtIGNsZWFuIGNvcmUgc3Vic3lzdGVtIgorCUBlY2hvICIgICBjbGVhbl9zZG5fYWdlbnQgICAtIGNsZWFuIFNETiBhZ2VudCIKKwlAZWNobyAiICAgY2xlYW5fb2NzX29tY2kgICAgLSBjbGVhbiBPQ1MgT01DSSBzdGFjayIKKwlAZWNobyAiICAgY2xlYW5fYmNtX29tY2kgICAgLSBjbGVhbiBCcm9hZGNvbSBPTUNJIHN0YWNrIgorCUBlY2hvICIgICBkb2NzICAgICAgICAgICAgICAtIGdlbmVyYXRlIHJlZmVyZW5jZSBkb2N1bWVudCBpbiBodG1sIGZvcm1hdCIKKwlAZWNobyAiICAgZG9jc19wZGYgICAgICAgICAgLSBnZW5lcmF0ZSByZWZlcmVuY2UgZG9jdW1lbnQgaW4gcGRmIGZvcm1hdCIKKwlAZWNobyAiICAgZG9jc19jbGVhbiAgICAgICAgLSBjbGVhbiBkb2N1bWVudHMiCisJQGVjaG8gIiAgIHZlcnNpb25fZmlsZSAgICAgIC0gYnVpbGRzIEJBTCB2ZXJzaW9uIGZpbGUiCisJQGVjaG8gIiAgIGJpbl9yZWxlYXNlX2NvcmUgICAgICAtIGNyZWF0ZSBCQUwgY29yZSBiaW5hcnkgcmVsZWFzZSBhcmNoaXZlIgorCUBlY2hvICIgICBiaW5fcmVsZWFzZV9zZG5fYWdlbnQgLSBjcmVhdGUgQkFMIFNETiBhZ2VudCBiaW5hcnkgcmVsZWFzZSBhcmNoaXZlIgorCUBlY2hvICIgICBiaW5fcmVsZWFzZSAgICAgICAgICAgLSBjcmVhdGUgQkFMIGNvcmUgYW5kIFNETiBhZ2VudCBiaW5hcnkgcmVsZWFzZSBhcmNoaXZlcyIKKwlAZWNobyAiICAgc3JjX3JlbGVhc2UgICAgICAgLSBjcmVhdGUgYWxsIEJBTCBzb3VyY2UgcmVsZWFzZSBhcmNoaXZlcyIKKwlAZWNobyAiIgorCUBlY2hvICJPcHRpb25hbCBtYWtlIGFyZ3VtZW50czoiCisJQGVjaG8gIiIKKwlAZWNobyAiICAgQlVJTERfTkNfQUdFTlQ9biAgICAgICAgICAtIGRvIE5PVCBidWlsZCBORVRDT05GIGFnZW50IGludG8gYmNtX3Nkbl9hZ2VudC4gVXNlZCB3aXRoIG1ha2UgdGFyZ2V0IFwic2RuX2FnZW50XCIiCisJQGVjaG8gIiAgIFRFU1RfU1dfVVRJTF9MT09QQkFDSz15ICAgLSBzdHViIG91dCB0aGUgc3dpdGNoIHV0aWxzIgorCUBlY2hvICIiCisKKworaGVscDogaGVscF9nZW5lcmFsIGhlbHBfY29yZQorCisuUEhPTlk6IHZlcnNpb25fZmlsZQorCit2ZXJzaW9uX2ZpbGU6CisJQGVjaG8gIiAgR2VuZXJhdGluZyAkQCIKKwlAZWNobyAiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiID4gJChUTVBfQkFMX1ZFUlNJT05fSCkKKwlAZWNobyAiICogRE8gTk9UIEVESVQhIFRISVMgRklMRSBXQVMgQVVUTyBHRU5FUkFURUQuIERPIE5PVCBFRElUISAgICoiID4+ICQoVE1QX0JBTF9WRVJTSU9OX0gpCisJQGVjaG8gIiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyIgPj4gJChUTVBfQkFMX1ZFUlNJT05fSCkKKwlAZWNobyAiICB3cm90ZSBoZWFkZXIuLi4iCisJQCQoQlVJTERfVE9QRElSKS90b29scy9jb3B5cmlnaHRfdG9vbHMvaW5zZXJ0X2NvcHlyaWdodC5wbCAtdCBjIC1sICQoQlVJTERfVE9QRElSKS9DT1BZUklHSFQgPj4gJChUTVBfQkFMX1ZFUlNJT05fSCkKKwlAZWNobyAiI2lmICFkZWZpbmVkKEJBTF9WRVJTSU9OX0gpIiA+PiAkKFRNUF9CQUxfVkVSU0lPTl9IKQorCUBlY2hvICIjZGVmaW5lIEJBTF9WRVJTSU9OX0giID4+ICQoVE1QX0JBTF9WRVJTSU9OX0gpCisJQGVjaG8gIiIgPj4gJChUTVBfQkFMX1ZFUlNJT05fSCkKKwlAZWNobyAiI2RlZmluZSBCQUxfVkVSU0lPTiAgICAgICAgICBcIiR7QlVJTERfVkVSU0lPTn1cIiIgPj4gJChUTVBfQkFMX1ZFUlNJT05fSCkKKwlAZWNobyAiI2RlZmluZSBCQUxfVkVSU0lPTl9TVFJfTEVOICAoYGVjaG8gJHtCVUlMRF9WRVJTSU9OfSB8IHdjIC1jYCkiID4+ICQoVE1QX0JBTF9WRVJTSU9OX0gpCisJQGVjaG8gIiIgPj4gJChUTVBfQkFMX1ZFUlNJT05fSCkKKwlAZWNobyAiI2RlZmluZSBCQUxfQlVJTERfREFURSBcImBkYXRlYFwiIiA+PiAkKFRNUF9CQUxfVkVSU0lPTl9IKQorCUBlY2hvICIjZGVmaW5lIEJBTF9CVUlMRF9JTkZPICAgICAgIFwiJHtCVUlMRF9JTkZPfVwiIiA+PiAkKFRNUF9CQUxfVkVSU0lPTl9IKQorCUBlY2hvICIiID4+ICQoVE1QX0JBTF9WRVJTSU9OX0gpCisJQGVjaG8gIiNlbmRpZiAgLyogQkFMX1ZFUlNJT05fSCAqLyIgPj4gJChUTVBfQkFMX1ZFUlNJT05fSCkKKwlAZGlmZiAkKFRNUF9CQUxfVkVSU0lPTl9IKSAkKEJBTF9WRVJTSU9OX0gpID4gL2Rldi9udWxsOyBcCisJaWYgWyAkJD8gLW5lIDAgXTsgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgbXYgLWYgJChUTVBfQkFMX1ZFUlNJT05fSCkgJChCQUxfVkVSU0lPTl9IKTsgICAgICAgICAgXAorCWZpCisKKy5QSE9OWTogb3ZlcmxheV9iYWxfbWFwbGVfc2NyaXB0cworCitvdmVybGF5X2JhbF9tYXBsZV9zY3JpcHRzOgorCUBlY2hvICJDcmVhdGluZyBhbmQgT3ZlcmxheWluZyBCQUwtc3BlY2lmaWMgc3ZrX2luaXQuc2ggYW5kIHRyeF9pbml0LnNoIG9udG8gbWFwbGUgZnMiCisJQGVjaG8gIihpbiAkKExPQ0FMX01BUExFX1NES19ESVIpL2J1aWxkL2ZzLykiCisJQGNwIC1mICQoTE9DQUxfTUFQTEVfU0RLX0RJUikvaG9zdF9jdXN0b21pemVkL2JvYXJkL3dyeC9mcy9zdmtfaW5pdC5zaCB+L3N2a19pbml0LnNoCisJQGNhdCB+L3N2a19pbml0LnNoIHwgc2VkIHMvIi5cL2JjbV91c2VyX2FwcGwiLycuXC9iY21fdXNlcl9hcHBsIDwgdHJ4X2luaXQuc2ggXCZcJiAuXC9iY21fdXNlcl9hcHBsJy9nID4gfi9zdmtfaW5pdF9mb3JfYmFsLnNoCisJQGNhdCB+L3N2a19pbml0LnNoIHwgc2VkIHMvIi5cL2JjbV91c2VyX2FwcGwiLycuXC9iY21fdXNlcl9hcHBsIDwgdHJ4X2luaXQuc2gnL2cgPiB+L3N2a19pbml0X2Zvcl9iYWxfc3RhcnR1cC5zaAorCUBta2RpciAtcCAkKExPQ0FMX01BUExFX1NES19ESVIpL2J1aWxkL2ZzLworCUBtdiAtZiB+L3N2a19pbml0X2Zvcl9iYWwuc2ggJChMT0NBTF9NQVBMRV9TREtfRElSKS9idWlsZC9mcy9zdmtfaW5pdC5zaAorCUBtdiAtZiB+L3N2a19pbml0X2Zvcl9iYWxfc3RhcnR1cC5zaCAkKExPQ0FMX01BUExFX1NES19ESVIpL2J1aWxkL2ZzL3N2a19pbml0X3N0YXJ0dXAuc2gKKwlAY2htb2QgNzU1ICQoTE9DQUxfTUFQTEVfU0RLX0RJUikvYnVpbGQvZnMvc3ZrX2luaXQuc2gKKwlAY2htb2QgNzU1ICQoTE9DQUxfTUFQTEVfU0RLX0RJUikvYnVpbGQvZnMvc3ZrX2luaXRfc3RhcnR1cC5zaAorCUBjcCAtZiAkKFRPUF9ESVIpL3NjcmlwdHMvdHJ4X2luaXQuc2ggJChMT0NBTF9NQVBMRV9TREtfRElSKS9idWlsZC9mcy8uCisJQHJtIH4vc3ZrX2luaXQuc2gKKworLlBIT05ZOgorCisuUEhPTlk6IHNkbl9hZ2VudAorc2RuX2FnZW50OiB2ZXJzaW9uX2ZpbGUgYnVpbGRfc2RuX2FnZW50CisKKy5QSE9OWTogYnVpbGRfc2RuX2FnZW50CitidWlsZF9zZG5fYWdlbnQ6IGJ1aWxkX2FnZW50CisJJChTSUxFTlRfQlVJTEQpbXYgJChUT1BfRElSKS9idWlsZC9hZ2VudC8zcmRwYXJ0eS9pbmRpZ28vb2ZwYWxfb2ZfYWdlbnQgJChUT1BfRElSKS9idWlsZC9hZ2VudC9iY21fc2RuX2FnZW50CisJJChTSUxFTlRfQlVJTEQpbWsvY3JlYXRlX2FydGlmYWN0cy5zaAorCisuUEhPTlk6IGluZ19iY21fdXNlcgorCitpbmdfYmNtX3VzZXI6CisJQGVjaG8gIkJ1aWxkaW5nIElORyBiY20udXNlciIKKwlAcHVzaGQgM3JkcGFydHkvYmNtLXNkay9idWlsZC9zZGstYWxsLTYuNC40L3N5c3RlbXMvbGludXgvdXNlci9ndG8tMl82ICYmIG1ha2UgJiYgcG9wZAorCisKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG9ubHkgc2V0IGlmIHRoZXkgaGF2ZSBub3QgYmVlbiBzZXQKKyMgcHJldmlvdXNseSBvciBwYXNzZWQgaW4uCisKKy5QSE9OWTogZG9jcworZG9jczogZG9jc18kKERPQ1NfU1VCU1lTVEVNKQorCitkb2NzX3BkZjogZG9jc18kKERPQ1NfU1VCU1lTVEVNKQorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgLUMgJChPVVRfRE9DU19ESVIpL2xhdGV4CisKK2RvY3NfY2xlYW46CisJJChTSUxFTlRfQlVJTEQpJChCT0xEX1BSSU5UKSAiQ2xlYW5pbmcgZG9jcyIKKwkkKFNJTEVOVF9CVUlMRClybSAtZnIgJChPVVRfRE9DU19ESVIpCisKK2Nsb2JiZXI6IGNsZWFuIGRvY3NfY2xlYW4KKworLlBIT05ZOiBwcmludF9tYXBsZV9kaXIKKworcHJpbnRfbWFwbGVfZGlyOgorCUBlY2hvICJVc2luZyBNQVBMRSBmcm9tICQoTUFQTEVfU0RLX0RJUikgY29waWVkIHRvICQoTE9DQUxfTUFQTEVfU0RLX0RJUikiCisKK2NvcmU6IHZlcnNpb25fZmlsZSBidWlsZF9jb3JlCisJJChTSUxFTlRfQlVJTEQpZXhwb3J0IEJVSUxEX05DX0FHRU5UPW47XAorCWV4cG9ydCBCVUlMRF9PRl9BR0VOVD1uO1wKKwltay9jcmVhdGVfYXJ0aWZhY3RzLnNoCisKKyVfY29yZToKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpICQoU0lMRU5UKSBTVUJTWVNURU09Y29yZSAtZiAkKE1BS0VfRElSKS9NYWtlZmlsZS5tYWluIEJVSUxEX05DX0FHRU5UPW4gJEAKKworYWdlbnQ6IHZlcnNpb25fZmlsZSBidWlsZF9hZ2VudAorCislX2FnZW50OgorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgJChTSUxFTlQpIFNVQlNZU1RFTT1hZ2VudCAtZiAkKE1BS0VfRElSKS9NYWtlZmlsZS5tYWluICRACisKKy5QSE9OWTogYmluX3JlbGVhc2Vfc2RuX2FnZW50CitiaW5fcmVsZWFzZV9zZG5fYWdlbnQ6IGJpbl9yZWxlYXNlX2FnZW50CisKKy5QSE9OWTogYmluX3JlbGVhc2UKK2Jpbl9yZWxlYXNlOiBiaW5fcmVsZWFzZV9jb3JlIGJpbl9yZWxlYXNlX2FnZW50CisKKy5QSE9OWTogbWFwbGVfc2RrX2RldmVsX3RvX3JlbGVhc2UKKworbWFwbGVfc2RrX2RldmVsX3RvX3JlbGVhc2U6CitpZm5lcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCisJJChTSUxFTlRfQlVJTEQpaWYgWyAhIC1mICQoTUFQTEVfU0RLX0RJUikvYnVpbGQvbWFwbGUvaG9zdC9mcy9iY202ODYyMF9ib290LmJpbiBdOyB0aGVuIFwKKwkgICBlY2hvICEhISBCdWlsZCBtYXBsZSBmaXJzdDtcCisJICAgZWNobyBtYWtlIC1DICQoTUFQTEVfU0RLX0RJUikgQk9BUkQ9d3J4O1wKKwkgICBleGl0IC0xO1wKKwlmaQorCSQoU0lMRU5UX0JVSUxEKWNkICQoTUFQTEVfU0RLX0RJUikgJiYgcm0gLWZyIHJlbGVhc2UgJiYgc2NyaXB0cy9yZWxfZGVsaXZlcnkuc2ggJChNQVBMRV9SRUxfREVMSVZFUllfUFJFRklYKQorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkKExPQ0FMX01BUExFX1NES19ESVIpCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoTE9DQUxfTUFQTEVfU0RLX0RJUikKKwkkKFNJTEVOVF9CVUlMRCljcCAtYXIgJChNQVBMRV9TREtfRElSKS9yZWxlYXNlLyogJChMT0NBTF9NQVBMRV9TREtfRElSKS8KK2lmbmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKwkkKFNJTEVOVF9CVUlMRCljcCAkKE1BUExFX1NES19ESVIpL21ha2UvYmNtNjg2MjAvbGludC5zaCAkKExPQ0FMX01BUExFX1NES19ESVIpL21ha2UvYmNtNjg2MjAvCitlbmRpZgorCisuUEhPTlk6IG1hcGxlX3Nka19kaXIKK21hcGxlX3Nka19kaXI6IG1hcGxlX3Nka19kZXZlbF90b19yZWxlYXNlCisJJChTSUxFTlRfQlVJTEQpaWYgWyAhIC1mICQoTE9DQUxfTUFQTEVfU0RLX0RJUikvZW1iZWRkZWRfYmluYXJpZXMvYmNtNjg2MjBfYm9vdC5iaW4gXTsgdGhlbiBcCisJICAgZWNobyAhISEgJChMT0NBTF9NQVBMRV9TREtfRElSKS9lbWJlZGRlZF9iaW5hcmllcy9iY202ODYyMF9ib290LmJpbiBpcyBhYnNlbnQ7XAorCSAgIGVjaG8gISEhIFBsZWFzZSBjb3B5IEJDTTY4NjIwIFNESyByZWxlYXNlIHRvICQoTE9DQUxfTUFQTEVfU0RLX0RJUik7XAorCSAgIGV4aXQgLTE7XAorCWZpCisJJChTSUxFTlRfQlVJTEQpbWtkaXIgLXAgc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbgorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciBzcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uLyoKKwkkKFNJTEVOVF9CVUlMRCljZCBzcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uICYmIGxuIC1zIC4uLy4uLy4uLyQoTE9DQUxfTUFQTEVfU0RLX0RJUikvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uLyogLgorCSQoU0lMRU5UX0JVSUxEKXJtIC1mIHNyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vYmNtb3NfcGxhdGZvcm0uaAorCitzcmNfcmVsZWFzZToKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0VfRElSKS9zcmNfcmVsZWFzZS5zaAorCisuUEhPTlk6IG1hcGxlX3NkaworbWFwbGVfc2RrOiBtYXBsZV9zZGtfYnVpbGQgb3ZlcmxheV9iYWxfbWFwbGVfc2NyaXB0cworCittYXBsZV9zZGtfYnVpbGQ6CisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoVE9QX0RJUikvJChMT0NBTF9NQVBMRV9TREtfRElSKS9idWlsZC9vdXRwdXQvKgorCSQoU0lMRU5UX0JVSUxEKWNkICQoTE9DQUxfTUFQTEVfU0RLX0RJUikgJiYgXAorICAgICAgIHVuc2V0IE9VVF9ESVIgJiYgXAorICAgICAgIEJPQVJEPSQoTUFQTEVfQk9BUkQpIEJPQVJEX0RJUj0kKE1BUExFX0JPQVJEX0RJUikgJChNQUtFKSAkKFNJTEVOVCkgCitpZmVxICgiJChCT0FSRCkiLCAiIikKKwkkKFNJTEVOVF9CVUlMRClta2RpciAtcCAkKFRPUF9ESVIpLyQoTE9DQUxfTUFQTEVfU0RLX0RJUikvYnVpbGQvb3V0cHV0LworCSQoU0lMRU5UX0JVSUxEKWZpbmQgJChUT1BfRElSKS8kKExPQ0FMX01BUExFX1NES19ESVIpIC1uYW1lICdsaWIqLmEnIC1leGVjIGxuIC1zIFx7XH0gJChUT1BfRElSKS8kKExPQ0FMX01BUExFX1NES19ESVIpL2J1aWxkL291dHB1dC8gMj4gL2Rldi9udWxsIFw7CisJJChTSUxFTlRfQlVJTEQpcm0gLWYgJChUT1BfRElSKS8kKExPQ0FMX01BUExFX1NES19ESVIpL2J1aWxkLy5tYXBsZV9ib2FyZF9kaXIKK2Vsc2UKKwkkKFNJTEVOVF9CVUlMRCllY2hvICQoTUFQTEVfQk9BUkRfRElSKSA+ICQoVE9QX0RJUikvJChMT0NBTF9NQVBMRV9TREtfRElSKS9idWlsZC8ubWFwbGVfYm9hcmRfZGlyCitlbmRpZiAgICAgICAKKworbWFwbGVfc2RrX2NsZWFuOgorCSQoU0lMRU5UX0JVSUxEKU9VVF9ESVI9JChUT1BfRElSKS8kKExPQ0FMX01BUExFX1NES19ESVIpL2J1aWxkIE9VVF9ESVJfQkFTRT0kKFRPUF9ESVIpLyQoTE9DQUxfTUFQTEVfU0RLX0RJUikvYnVpbGQgXAorCSAgIEJPQVJEX0RJUj0kKE1BUExFX0JPQVJEX0RJUikgJChNQUtFKSAkKFNJTEVOVCkgLUMgJChMT0NBTF9NQVBMRV9TREtfRElSKSBUT1BfRElSPSQoVE9QX0RJUikvM3JkcGFydHkvbWFwbGUvc2RrIFwKKwkgICBCT0FSRD0kKE1BUExFX0JPQVJEKSBjbGVhbgorCitpbmdfc2RrX2RpcjoKKwkkKFNJTEVOVF9CVUlMRCkkKElOR19TREtfVE9QX0RJUikvbWFrZV9pbmdfZGlyLnNoCisKK2luZ19zZGs6CisJJChTSUxFTlRfQlVJTEQpJChNQUtFKSAtQyAkKElOR19TREtfVE9QX0RJUikgLWYgTWFrZWZpbGUuc2RrIHNkaworCitpbmdfc2RrX2NsZWFuOgoraWZlcSAoJChJTkdfU0RLX0RFRkFVTFRfRElSKSwgJChJTkdfU0RLX0RJUikpCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoSU5HX1NES19ESVIpCitlbHNlCQorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgLUMgJChJTkdfU0RLX0RJUikgY2xlYW4KK2VuZGlmCQorCitjbGVhbl9vY3Nfb21jaToKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpIC1DICQoVE9QX0RJUikvM3JkcGFydHkvb2NzX29tY2kgY2xlYW4KKworI2NsZWFuX2JjbV9vbWNpOgorIwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpIC1DICQoVE9QX0RJUikvM3JkcGFydHkvb2NzX29tY2kgY2xlYW4KKworLlBIT05ZOiBjbGVhbl9zZG5fYWdlbnQgCQorY2xlYW5fc2RuX2FnZW50OiBjbGVhbl9hZ2VudAorCitwcmludC0lIDogOyBAZWNobyAkKiA9ICQoJCopCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL1JFQURNRV9IT1dfVE9fQlVJTERfQkFMIGIvYmFsX3JlbGVhc2UvUkVBRE1FX0hPV19UT19CVUlMRF9CQUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzZWNmMgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL1JFQURNRV9IT1dfVE9fQlVJTERfQkFMCkBAIC0wLDAgKzEsMzkgQEAKK1RoaXMgZmlsZSBjb250YWlucyBpbnN0cnVjdGlvbnMgb2YgaG93IHRvIGV4dHJhY3QgQkFMIHNvdXJjZSByZWxlYXNlIHBhY2thZ2UgYW5kIGNvbXBpbGUgaXQuCitJdCBpcyBhc3N1bWVkIHRoYXQgc3dpdGNoIChRdW1yYW4pIFNESyBpcyBvYnRhaW5lZCBmcm9tIGl0cyByZWxldmFudCByZXBvc2l0b3J5IGFuZCBpdCBpcyBub3QgcGFydCBvZiBCQUwgc291cmNlIHJlbGVhc2UgcGFja2FnZS4KKworSGVyZSBhcmUgdGhlIHN0ZXBzIG5lZWRlZCB0byBleHRyYWN0IGFuZCBjb21waWxlIHRoZSBzb3VyY2UgY29kZToKKworMS4gQ3JlYXRlIGEgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IHdhbnQgdG8gZXh0cmFjdCB0aGUgcGFja2FnZS4gSW4gdGhlIGZvbGxvd2luZyBzdGVwcyB3ZSB1c2UgL3RtcC9iYWxfc3JjX3JlbGVhc2UgYXMgYW4gZXhhbXBsZS4KKworICAgbWtkaXIgLXAgL3RtcC9iYWxfc3JjX3JlbGVhc2UKKworMi4gVW56aXAgKGV4dHJhY3QpIHRoZSBjb21iaW5lZCBNYXBsZSBTREsgYW5kIEJBTCBwYWNrYWdlIGludG8gdGhlIGxvY2F0aW9uIHlvdSBzZWxlY3RlZDoKKworICAgdW56aXAgPHBhdGhfdG9fcmVsZWFzZV96aXA+L1NXLUJDTTY4NjIwXzxyZXZpc2lvbj4uemlwIC1kIC90bXAvYmFsX3NyY19yZWxlYXNlIAorCiszLiBPYnRhaW4gc3dpdGNoIChRdW1yYW4pIFNESyBmcm9tIGl0cyByZXBvc2l0b3J5LgorCis0LiBDb3B5IHN3aXRjaCAoUXVtcmFuKSBTREsgdG8gL3RtcC9iYWxfc3JjX3JlbGVhc2UvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkay4KKworICAgY3AgLzxwYXRoX3RvX3N3aXRjaF9zZGs+L3Nkay1hbGwtPHJldmlzaW9uPi50YXIuZ3ogL3RtcC9iYWxfc3JjX3JlbGVhc2UvYmFsX3JlbGVhc2UvM3JkcGFydHkvYmNtLXNkaworCis1LiBDaGFuZ2UgZGlyZWN0b3J5IHRvIHRoZSBzZWxlY3RlZCBsb2NhdGlvbi4KKworICAgY2QgL3RtcC9iYWxfc3JjX3JlbGVhc2UvYmFsX3JlbGVhc2UKKworNi4gQ29tcGlsZSBNYXBsZSBTREsKKworICAgbWFrZSBtYXBsZV9zZGtfZGlyCisgICBtYWtlIG1hcGxlX3NkaworCis3LiBDb21waWxlIHN3aXRjaCAoUXVtcmFuKSBTREsKKworICAgbWFrZSBpbmdfc2RrX2RpcgorICAgbWFrZSBpbmdfc2RrCisKKzguIENvbXBpbGUgQkFMOgorCisgICBtYWtlIGNvcmUKKworOS4gV2hlbiB0aGUgYnVpbGQgZW5kcyBzdWNjZXNzZnVsbHksIGJhbF9jb3JlIGV4ZWN1dGFibGUgKGJ1aWxkL2NvcmUvc3JjL2NvcmUvbWFpbi9iYWxfY29yZSkgc2hvdWxkIGJlIGNyZWF0ZWQuCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL1JFQURNRV9IT1dfVE9fQlVJTERfU0ROX1BBTCBiL2JhbF9yZWxlYXNlL1JFQURNRV9IT1dfVE9fQlVJTERfU0ROX1BBTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGJmNmRkCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvUkVBRE1FX0hPV19UT19CVUlMRF9TRE5fUEFMCkBAIC0wLDAgKzEsNDcgQEAKK1RoaXMgZmlsZSBjb250YWlucyBpbnN0cnVjdGlvbnMgb2YgaG93IHRvIGV4dHJhY3QgQkFML1NETi1QQUwgc291cmNlIHJlbGVhc2UgcGFja2FnZXMgYW5kIGNvbXBpbGUgdGhlbS4KK0l0IGlzIGFzc3VtZWQgdGhhdCBzd2l0Y2ggKFF1bXJhbikgU0RLIGlzIG9idGFpbmVkIGZyb20gaXRzIHJlbGV2YW50IHJlcG9zaXRvcnkgYW5kIGl0IGlzIG5vdCBwYXJ0IG9mIFNETi1QQUwgc291cmNlIHJlbGVhc2UgcGFja2FnZS4KKworSGVyZSBhcmUgdGhlIHN0ZXBzIG5lZWRlZCB0byBleHRyYWN0IGFuZCBjb21waWxlIHRoZSBzb3VyY2UgY29kZToKKworMS4gQ3JlYXRlIGEgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IHdhbnQgdG8gZXh0cmFjdCB0aGUgcGFja2FnZS4gSW4gdGhlIGZvbGxvd2luZyBzdGVwcyB3ZSB1c2UgL3RtcC9iYWxfc3JjX3JlbGVhc2UgYXMgYW4gZXhhbXBsZS4KKworICAgbWtkaXIgLXAgL3RtcC9iYWxfc3JjX3JlbGVhc2UKKworMi4gVW56aXAgKGV4dHJhY3QpIHRoZSBjb21iaW5lZCBNYXBsZSBTREsgYW5kIEJBTCBwYWNrYWdlIGludG8gdGhlIGxvY2F0aW9uIHlvdSBzZWxlY3RlZDoKKworICAgdW56aXAgPHBhdGhfdG9fcmVsZWFzZV96aXA+L1NXLUJDTTY4NjIwXzxyZXZpc2lvbj4uemlwIC1kIC90bXAvYmFsX3NyY19yZWxlYXNlIAorCiszLiBFeHRyYWN0IFNETi1QQUw6CisKKyAgIHRhciAtLXN0cmlwLWNvbXBvbmVudHM9MSAtQyAvdG1wL2JhbF9zcmNfcmVsZWFzZS9iYWxfcmVsZWFzZSAteHZ6ZiA8cGF0aF90b19zZG5fcGFsX3RhcmJhbGw+L3Nkbl9wYWwuPHN1ZmZpeD4udGFyLmd6CisKKzQuIEluIGNhc2UgT01DSSBpcyBhbHNvIHJlcXVpcmVkLCB5b3Ugc2hvdWxkIGV4dHJhY3QgT01DSToKKworICAgdGFyIC0tc3RyaXAtY29tcG9uZW50cz0xIC1DIC90bXAvYmFsX3NyY19yZWxlYXNlL2JhbF9yZWxlYXNlIC14dnpmIDxwYXRoX3RvX29tY2lfdGFyYmFsbD4vb21jaS48c3VmZml4Pi50YXIuZ3oKKworNS4gT2J0YWluIHN3aXRjaCAoUXVtcmFuKSBTREsgZnJvbSBpdHMgcmVwb3NpdG9yeS4KKworNi4gQ29weSBzd2l0Y2ggKFF1bXJhbikgU0RLIHRvIC90bXAvYmFsX3NyY19yZWxlYXNlL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsuCisKKyAgIGNwIC88cGF0aF90b19zd2l0Y2hfc2RrPi9zZGstYWxsLTxyZXZpc2lvbj4udGFyLmd6IC90bXAvYmFsX3NyY19yZWxlYXNlL2JhbF9yZWxlYXNlLzNyZHBhcnR5L2JjbS1zZGsKKworNy4gQ2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgc2VsZWN0ZWQgbG9jYXRpb24uCisKKyAgIGNkIC90bXAvYmFsX3NyY19yZWxlYXNlL2JhbF9yZWxlYXNlCisKKzguIENvbXBpbGUgTWFwbGUgU0RLCisKKyAgIG1ha2UgbWFwbGVfc2RrX2RpcgorICAgbWFrZSBtYXBsZV9zZGsKKworOS4gQ29tcGlsZSBzd2l0Y2ggKFF1bXJhbikgU0RLCisKKyAgIG1ha2UgaW5nX3Nka19kaXIKKyAgIG1ha2UgaW5nX3NkaworCisxMC4gQ29tcGlsZSBTRE4tUEFMOgorCisgICBtYWtlIHNkbl9hZ2VudAorCisxMS4gV2hlbiB0aGUgYnVpbGQgZW5kcyBzdWNjZXNzZnVsbHksIGJhbF9jb3JlIGV4ZWN1dGFibGUgKGJ1aWxkL2NvcmUvc3JjL2NvcmUvbWFpbi9iYWxfY29yZSkgYW5kIFNETiBhZ2VudCBleGVjdXRhYmxlIChidWlsZC9hZ2VudC9iY21fc2RuX2FnZW50KSBzaG91bGQgYmUgY3JlYXRlZC4KKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvYnJhbmNoLmluZm8gYi9iYWxfcmVsZWFzZS9icmFuY2guaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWU4ZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvYnJhbmNoLmluZm8KQEAgLTAsMCArMSw1OCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgQ29weXJpZ2h0IDIwMDgtMjAxNyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorIyAgCisjICBUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uCisjICBhbmQvb3IgaXRzIGxpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yCisjICBkaXN0cmlidXRlZCBwdXJzdWFudCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwKKyMgIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQgYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbgorIyAgIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbiBhbiBBdXRob3JpemVkIExpY2Vuc2UsCisjICBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQgdG8gdXNlLCBvcgorIyAgd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorIyAgZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsCisjICBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVECisjICBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFIE5PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORAorIyAgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWSBCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUKKyMgIFNPRlRXQVJFLgorIyAgCisjICBFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIyAgCisjICAxLiAgVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyMgIGNvbnN0aXR1dGVzIHRoZSB2YWx1YWJsZSB0cmFkZSBzZWNyZXRzIG9mIEJyb2FkY29tLCBhbmQgeW91IHNoYWxsIHVzZQorIyAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisjICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorIyAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorIyAgIAorIyAgMi4gIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQKKyMgICJBUyBJUyIgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsCisjICBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IKKyMgIE9USEVSV0lTRSwgV0lUSCBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWQorIyAgRElTQ0xBSU1TIEFOWSBBTkQgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLAorIyAgTk9OSU5GUklOR0VNRU5ULCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLAorIyAgQUNDVVJBQ1kgT1IgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IKKyMgIENPUlJFU1BPTkRFTkNFIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVAorIyAgT0YgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyMgIAorIyAgMy4gIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTQorIyAgT1IgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorIyAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZIFdBWQorIyAgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTiBJRgorIyAgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOyBPUiAoaWkpCisjICBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRSBTT0ZUV0FSRQorIyAgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUyBTSEFMTCBBUFBMWQorIyAgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWSBMSU1JVEVECisjICBSRU1FRFkuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBUaGlzIGlzIHRoZSByZWxlYXNlIGluZm9ybWF0aW9uIGZvciAiY3VycmVudCIgYnJhbmNoLiAKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworREVQT1Q9eHBvbl9jbworQlJBTkNIPWJhbC9jdXIKK1JFTEVBU0VfVFlQRT1SCitNQUpPUj0wMgorTUlOT1I9MDIKK1BBVENIPTAxCitQRVJGT1JDRV9SRVZJU0lPTj0xMzkxNzcKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL2RveHlnZW4vRG94eWdlbkxheW91dC54bWwgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL0RveHlnZW5MYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWQ1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL0RveHlnZW5MYXlvdXQueG1sCkBAIC0wLDAgKzEsMTg4IEBACis8ZG94eWdlbmxheW91dCB2ZXJzaW9uPSIxLjAiPgorICA8IS0tIEdlbmVyYXRlZCBieSBkb3h5Z2VuIDEuOC42IC0tPgorICA8IS0tIE5hdmlnYXRpb24gaW5kZXggdGFicyBmb3IgSFRNTCBvdXRwdXQgLS0+CisgIDxuYXZpbmRleD4KKyAgICA8dGFiIHR5cGU9Im1haW5wYWdlIiB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4KKyAgICA8dGFiIHR5cGU9InBhZ2VzIiB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiIGludHJvPSIiLz4KKyAgICA8dGFiIHR5cGU9Im1vZHVsZXMiIHZpc2libGU9InllcyIgdGl0bGU9IkFQSSBSZWZlcmVuY2UiIGludHJvPSIiLz4KKyAgICA8dGFiIHR5cGU9Im5hbWVzcGFjZXMiIHZpc2libGU9InllcyIgdGl0bGU9IiI+CisgICAgICA8dGFiIHR5cGU9Im5hbWVzcGFjZWxpc3QiIHZpc2libGU9InllcyIgdGl0bGU9IiIgaW50cm89IiIvPgorICAgICAgPHRhYiB0eXBlPSJuYW1lc3BhY2VtZW1iZXJzIiB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiIGludHJvPSIiLz4KKyAgICA8L3RhYj4KKyAgICA8dGFiIHR5cGU9ImNsYXNzZXMiIHZpc2libGU9Im5vIiB0aXRsZT0iIj4KKyAgICAgIDx0YWIgdHlwZT0iY2xhc3NsaXN0IiB2aXNpYmxlPSJubyIgdGl0bGU9IiIgaW50cm89IiIvPgorICAgICAgPHRhYiB0eXBlPSJjbGFzc2luZGV4IiB2aXNpYmxlPSJubyIgdGl0bGU9IiIvPgorICAgICAgPHRhYiB0eXBlPSJoaWVyYXJjaHkiIHZpc2libGU9Im5vIiB0aXRsZT0iIiBpbnRybz0iIi8+CisgICAgICA8dGFiIHR5cGU9ImNsYXNzbWVtYmVycyIgdmlzaWJsZT0ibm8iIHRpdGxlPSIiIGludHJvPSIiLz4KKyAgICA8L3RhYj4KKyAgICA8dGFiIHR5cGU9ImZpbGVzIiB2aXNpYmxlPSJubyIgdGl0bGU9IiI+CisgICAgICA8dGFiIHR5cGU9ImZpbGVsaXN0IiB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiIGludHJvPSIiLz4KKyAgICAgIDx0YWIgdHlwZT0iZ2xvYmFscyIgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIiBpbnRybz0iIi8+CisgICAgPC90YWI+CisgICAgPHRhYiB0eXBlPSJleGFtcGxlcyIgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIiBpbnRybz0iIi8+CisgIDwvbmF2aW5kZXg+CisKKyAgPCEtLSBMYXlvdXQgZGVmaW5pdGlvbiBmb3IgYSBjbGFzcyBwYWdlIC0tPgorICA8Y2xhc3M+CisgICAgPGJyaWVmZGVzY3JpcHRpb24gdmlzaWJsZT0ieWVzIi8+CisgICAgPGRldGFpbGVkZGVzY3JpcHRpb24gdGl0bGU9IiIvPgorICAgIDxpbmNsdWRlcyB2aXNpYmxlPSIkU0hPV19JTkNMVURFX0ZJTEVTIi8+CisgICAgPGluaGVyaXRhbmNlZ3JhcGggdmlzaWJsZT0iJENMQVNTX0dSQVBIIi8+CisgICAgPGNvbGxhYm9yYXRpb25ncmFwaCB2aXNpYmxlPSIkQ09MTEFCT1JBVElPTl9HUkFQSCIvPgorICAgIDxtZW1iZXJkZWNsPgorICAgICAgPG5lc3RlZGNsYXNzZXMgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIi8+CisgICAgICA8cHVibGljdHlwZXMgdGl0bGU9IiIvPgorICAgICAgPHB1YmxpY3Nsb3RzIHRpdGxlPSIiLz4KKyAgICAgIDxzaWduYWxzIHRpdGxlPSIiLz4KKyAgICAgIDxwdWJsaWNtZXRob2RzIHRpdGxlPSIiLz4KKyAgICAgIDxwdWJsaWNzdGF0aWNtZXRob2RzIHRpdGxlPSIiLz4KKyAgICAgIDxwdWJsaWNhdHRyaWJ1dGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwdWJsaWNzdGF0aWNhdHRyaWJ1dGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm90ZWN0ZWR0eXBlcyB0aXRsZT0iIi8+CisgICAgICA8cHJvdGVjdGVkc2xvdHMgdGl0bGU9IiIvPgorICAgICAgPHByb3RlY3RlZG1ldGhvZHMgdGl0bGU9IiIvPgorICAgICAgPHByb3RlY3RlZHN0YXRpY21ldGhvZHMgdGl0bGU9IiIvPgorICAgICAgPHByb3RlY3RlZGF0dHJpYnV0ZXMgdGl0bGU9IiIvPgorICAgICAgPHByb3RlY3RlZHN0YXRpY2F0dHJpYnV0ZXMgdGl0bGU9IiIvPgorICAgICAgPHBhY2thZ2V0eXBlcyB0aXRsZT0iIi8+CisgICAgICA8cGFja2FnZW1ldGhvZHMgdGl0bGU9IiIvPgorICAgICAgPHBhY2thZ2VzdGF0aWNtZXRob2RzIHRpdGxlPSIiLz4KKyAgICAgIDxwYWNrYWdlYXR0cmlidXRlcyB0aXRsZT0iIi8+CisgICAgICA8cGFja2FnZXN0YXRpY2F0dHJpYnV0ZXMgdGl0bGU9IiIvPgorICAgICAgPHByb3BlcnRpZXMgdGl0bGU9IiIvPgorICAgICAgPGV2ZW50cyB0aXRsZT0iIi8+CisgICAgICA8cHJpdmF0ZXR5cGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwcml2YXRlc2xvdHMgdGl0bGU9IiIvPgorICAgICAgPHByaXZhdGVtZXRob2RzIHRpdGxlPSIiLz4KKyAgICAgIDxwcml2YXRlc3RhdGljbWV0aG9kcyB0aXRsZT0iIi8+CisgICAgICA8cHJpdmF0ZWF0dHJpYnV0ZXMgdGl0bGU9IiIvPgorICAgICAgPHByaXZhdGVzdGF0aWNhdHRyaWJ1dGVzIHRpdGxlPSIiLz4KKyAgICAgIDxmcmllbmRzIHRpdGxlPSIiLz4KKyAgICAgIDxyZWxhdGVkIHRpdGxlPSIiIHN1YnRpdGxlPSIiLz4KKyAgICAgIDxtZW1iZXJncm91cHMgdmlzaWJsZT0ieWVzIi8+CisgICAgPC9tZW1iZXJkZWNsPgorICAgIDxtZW1iZXJkZWY+CisgICAgICA8aW5saW5lY2xhc3NlcyB0aXRsZT0iIi8+CisgICAgICA8ZnVuY3Rpb25zIHRpdGxlPSIiLz4KKyAgICAgIDx0eXBlZGVmcyB0aXRsZT0iIi8+CisgICAgICA8ZW51bXMgdGl0bGU9IiIvPgorICAgICAgPGNvbnN0cnVjdG9ycyB0aXRsZT0iIi8+CisgICAgICA8cmVsYXRlZCB0aXRsZT0iIi8+CisgICAgICA8dmFyaWFibGVzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm9wZXJ0aWVzIHRpdGxlPSIiLz4KKyAgICAgIDxldmVudHMgdGl0bGU9IiIvPgorICAgIDwvbWVtYmVyZGVmPgorICAgIDxhbGxtZW1iZXJzbGluayB2aXNpYmxlPSJubyIvPgorICAgIDx1c2VkZmlsZXMgdmlzaWJsZT0iJFNIT1dfVVNFRF9GSUxFUyIvPgorICAgIDxhdXRob3JzZWN0aW9uIHZpc2libGU9InllcyIvPgorICA8L2NsYXNzPgorCisgIDwhLS0gTGF5b3V0IGRlZmluaXRpb24gZm9yIGEgbmFtZXNwYWNlIHBhZ2UgLS0+CisgIDxuYW1lc3BhY2U+CisgICAgPGJyaWVmZGVzY3JpcHRpb24gdmlzaWJsZT0ieWVzIi8+CisgICAgPGRldGFpbGVkZGVzY3JpcHRpb24gdGl0bGU9IiIvPgorICAgIDxtZW1iZXJkZWNsPgorICAgICAgPG5lc3RlZG5hbWVzcGFjZXMgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIi8+CisgICAgICA8ZnVuY3Rpb25zIHRpdGxlPSIiLz4KKyAgICAgIDxjbGFzc2VzIHZpc2libGU9InllcyIgdGl0bGU9IiIvPgorICAgICAgPHR5cGVkZWZzIHRpdGxlPSIiLz4KKyAgICAgIDxlbnVtcyB0aXRsZT0iIi8+CisgICAgICA8dmFyaWFibGVzIHRpdGxlPSIiLz4KKyAgICAgIDxtZW1iZXJncm91cHMgdmlzaWJsZT0ieWVzIi8+CisgICAgPC9tZW1iZXJkZWNsPgorICAgIDxtZW1iZXJkZWY+CisgICAgICA8aW5saW5lY2xhc3NlcyB0aXRsZT0iIi8+CisgICAgICA8ZnVuY3Rpb25zIHRpdGxlPSIiLz4KKyAgICAgIDx0eXBlZGVmcyB0aXRsZT0iIi8+CisgICAgICA8ZW51bXMgdGl0bGU9IiIvPgorICAgICAgPHZhcmlhYmxlcyB0aXRsZT0iIi8+CisgICAgPC9tZW1iZXJkZWY+CisgICAgPGF1dGhvcnNlY3Rpb24gdmlzaWJsZT0ieWVzIi8+CisgIDwvbmFtZXNwYWNlPgorCisgIDwhLS0gTGF5b3V0IGRlZmluaXRpb24gZm9yIGEgZmlsZSBwYWdlIC0tPgorICA8ZmlsZT4KKyAgICA8YnJpZWZkZXNjcmlwdGlvbiB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8ZGV0YWlsZWRkZXNjcmlwdGlvbiB0aXRsZT0iIi8+CisgICAgPGluY2x1ZGVzIHZpc2libGU9IiRTSE9XX0lOQ0xVREVfRklMRVMiLz4KKyAgICA8aW5jbHVkZWdyYXBoIHZpc2libGU9IiRJTkNMVURFX0dSQVBIIi8+CisgICAgPGluY2x1ZGVkYnlncmFwaCB2aXNpYmxlPSIkSU5DTFVERURfQllfR1JBUEgiLz4KKyAgICA8c291cmNlbGluayB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8bWVtYmVyZGVjbD4KKyAgICAgIDxmdW5jdGlvbnMgdGl0bGU9IiIvPgorICAgICAgPGNsYXNzZXMgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIi8+CisgICAgICA8bmFtZXNwYWNlcyB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4KKyAgICAgIDxkZWZpbmVzIHRpdGxlPSIiLz4KKyAgICAgIDx0eXBlZGVmcyB0aXRsZT0iIi8+CisgICAgICA8ZW51bXMgdGl0bGU9IiIvPgorICAgICAgPHZhcmlhYmxlcyB0aXRsZT0iIi8+CisgICAgICA8bWVtYmVyZ3JvdXBzIHZpc2libGU9InllcyIvPgorICAgIDwvbWVtYmVyZGVjbD4KKyAgICA8bWVtYmVyZGVmPgorICAgICAgPGlubGluZWNsYXNzZXMgdGl0bGU9IiIvPgorICAgICAgPGZ1bmN0aW9ucyB0aXRsZT0iIi8+CisgICAgICA8ZGVmaW5lcyB0aXRsZT0iIi8+CisgICAgICA8dHlwZWRlZnMgdGl0bGU9IiIvPgorICAgICAgPGVudW1zIHRpdGxlPSIiLz4KKyAgICAgIDx2YXJpYWJsZXMgdGl0bGU9IiIvPgorICAgIDwvbWVtYmVyZGVmPgorICAgIDxhdXRob3JzZWN0aW9uLz4KKyAgPC9maWxlPgorCisgIDwhLS0gTGF5b3V0IGRlZmluaXRpb24gZm9yIGEgZ3JvdXAgcGFnZSAtLT4KKyAgPGdyb3VwPgorICAgIDxicmllZmRlc2NyaXB0aW9uIHZpc2libGU9InllcyIvPgorICAgIDxkZXRhaWxlZGRlc2NyaXB0aW9uIHRpdGxlPSIiLz4KKyAgICA8Z3JvdXBncmFwaCB2aXNpYmxlPSIkR1JPVVBfR1JBUEhTIi8+CisgICAgPG1lbWJlcmRlY2w+CisgICAgICA8bmVzdGVkZ3JvdXBzIHZpc2libGU9InllcyIgdGl0bGU9IiIvPgorICAgICAgPGZ1bmN0aW9ucyB0aXRsZT0iIi8+CisgICAgICA8ZGlycyB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4KKyAgICAgIDxmaWxlcyB2aXNpYmxlPSJ5ZXMiIHRpdGxlPSIiLz4KKyAgICAgIDxuYW1lc3BhY2VzIHZpc2libGU9InllcyIgdGl0bGU9IiIvPgorICAgICAgPGNsYXNzZXMgdmlzaWJsZT0ieWVzIiB0aXRsZT0iIi8+CisgICAgICA8ZGVmaW5lcyB0aXRsZT0iIi8+CisgICAgICA8dHlwZWRlZnMgdGl0bGU9IiIvPgorICAgICAgPGVudW1zIHRpdGxlPSIiLz4KKyAgICAgIDxlbnVtdmFsdWVzIHRpdGxlPSIiLz4KKyAgICAgIDx2YXJpYWJsZXMgdGl0bGU9IiIvPgorICAgICAgPHNpZ25hbHMgdGl0bGU9IiIvPgorICAgICAgPHB1YmxpY3Nsb3RzIHRpdGxlPSIiLz4KKyAgICAgIDxwcm90ZWN0ZWRzbG90cyB0aXRsZT0iIi8+CisgICAgICA8cHJpdmF0ZXNsb3RzIHRpdGxlPSIiLz4KKyAgICAgIDxldmVudHMgdGl0bGU9IiIvPgorICAgICAgPHByb3BlcnRpZXMgdGl0bGU9IiIvPgorICAgICAgPGZyaWVuZHMgdGl0bGU9IiIvPgorICAgICAgPG1lbWJlcmdyb3VwcyB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8L21lbWJlcmRlY2w+CisgICAgPG1lbWJlcmRlZj4KKyAgICAgIDxwYWdlZG9jcy8+CisgICAgICA8ZnVuY3Rpb25zIHRpdGxlPSIiLz4KKyAgICAgIDxpbmxpbmVjbGFzc2VzIHRpdGxlPSIiLz4KKyAgICAgIDxkZWZpbmVzIHRpdGxlPSIiLz4KKyAgICAgIDx0eXBlZGVmcyB0aXRsZT0iIi8+CisgICAgICA8ZW51bXMgdGl0bGU9IiIvPgorICAgICAgPGVudW12YWx1ZXMgdGl0bGU9IiIvPgorICAgICAgPHZhcmlhYmxlcyB0aXRsZT0iIi8+CisgICAgICA8c2lnbmFscyB0aXRsZT0iIi8+CisgICAgICA8cHVibGljc2xvdHMgdGl0bGU9IiIvPgorICAgICAgPHByb3RlY3RlZHNsb3RzIHRpdGxlPSIiLz4KKyAgICAgIDxwcml2YXRlc2xvdHMgdGl0bGU9IiIvPgorICAgICAgPGV2ZW50cyB0aXRsZT0iIi8+CisgICAgICA8cHJvcGVydGllcyB0aXRsZT0iIi8+CisgICAgICA8ZnJpZW5kcyB0aXRsZT0iIi8+CisgICAgPC9tZW1iZXJkZWY+CisgICAgPGF1dGhvcnNlY3Rpb24gdmlzaWJsZT0ieWVzIi8+CisgIDwvZ3JvdXA+CisKKyAgPCEtLSBMYXlvdXQgZGVmaW5pdGlvbiBmb3IgYSBkaXJlY3RvcnkgcGFnZSAtLT4KKyAgPGRpcmVjdG9yeT4KKyAgICA8YnJpZWZkZXNjcmlwdGlvbiB2aXNpYmxlPSJ5ZXMiLz4KKyAgICA8ZGV0YWlsZWRkZXNjcmlwdGlvbiB0aXRsZT0iIi8+CisgICAgPGRpcmVjdG9yeWdyYXBoIHZpc2libGU9InllcyIvPgorICAgIDxtZW1iZXJkZWNsPgorICAgICAgPGRpcnMgdmlzaWJsZT0ieWVzIi8+CisgICAgICA8ZmlsZXMgdmlzaWJsZT0ieWVzIi8+CisgICAgPC9tZW1iZXJkZWNsPgorICA8L2RpcmVjdG9yeT4KKzwvZG94eWdlbmxheW91dD4KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL2RveHlnZW4vTWFrZWZpbGUgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjIxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL01ha2VmaWxlCkBAIC0wLDAgKzEsOTQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpwcm9wcmlldGFyeTpzdGFuZGFyZAorIyAgIAorIyAgICAgQnJvYWRjb20gTHRkLiBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tIEx0ZC4KKyMgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgICAKKyMgIFRoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gTHRkLiBhbmQvb3IgaXRzCisjICBsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAorIyAgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKKyMgIGJldHdlZW4geW91IGFuZCBCcm9hZGNvbSBMdGQuIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCisjICBhbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIEx0ZC4gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0CisjICB0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20gTHRkLgorIyAgZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorIyAgcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKKyMgIE5PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCisjICBCUk9BRENPTSBMVEQgQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIyAgIAorIyAgRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyMgICAKKyMgIDEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisjICAgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20gTHRkLiwgYW5kIHlvdSBzaGFsbCB1c2UKKyMgICAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyMgICAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbSBMdGQuCisjICAgICAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorIyAgIAorIyAgMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisjICAgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorIyAgICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorIyAgICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisjICAgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisjICAgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyMgICAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorIyAgICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyMgICAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisjICAgCisjICAzLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyMgICAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisjICAgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisjICAgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyMgICAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisjICAgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorIyAgICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyMgICAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisjICAgICAgTElNSVRFRCBSRU1FRFkuCisjICA6PgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIGRveHlnZW4gZm9yIGJhbCBzb3VyY2UgY29kZQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitQUk9KRUNUX05VTUJFUj0kKHNoZWxsIC4vZ2VuUHJvamVjdE51bWJlci5zaCkKK1RNUF9GSUxFPWNmZy50bXAKK09VVFBVVF9GSUxFPWRveHlnZW5fb3V0cHV0LnR4dAorV0FSTklOR1NfRklMRT1kb3h5Z2VuX3dhcm5pbmdzLnR4dAorCitHRU5fR1JBUEhTID89IE5PCisKKy5QSE9OWTogZG9jcworZG9jczoKKwlAaWYgWyAiJChHRU5fR1JBUEhTKSIgIT0gIllFUyIgXTsgdGhlbiBcCisJCWVjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIgOyBcCisJCWVjaG8gIiMgR3JhcGhzIHdpbGwgTk9UIGJlIGdlbmVyYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyIgOyBcCisJCWVjaG8gIiMgVHlwZSAnbWFrZSBHRU5fR1JBUEhTPVlFUycgdG8gaW5zdHJ1Y3QgZG94eWdlbiB0byBnZW5lcmF0ZSBncmFwaHMgIyIgOyBcCisJCWVjaG8gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIgOyBcCisJCXNsZWVwIDMgOyBcCisJZmkKKwkkKGNhbGwgZ2VuX2RvY19jbWQsJChPVVRfRE9DU19ESVIpL2JhbF9pbnRlcm5hbCxiYWwuZG94eSkKKwkkKGNhbGwgZ2VuX2RvY19jbWQsJChPVVRfRE9DU19ESVIpL2JhbF9wdWJsaWMsYmFsX3B1YmxpYy5kb3h5KQorCSQoY2FsbCBnZW5fZG9jX2NtZCwkKE9VVF9ET0NTX0RJUikvc2RuX3BhbCxzZG5fcGFsLmRveHkpCisJJChjYWxsIGdlbl9kb2NfY21kLCQoT1VUX0RPQ1NfRElSKS9vbWNpc3ZjLG9tY2lzdmMuZG94eSkKKworZGVmaW5lIGdlbl9kb2NfY21kCisJcm0gLWZyICQxCisJbWtkaXIgLXAgJDEKKwlzZWQgLWUgJ3NAJU9VVF9ET0NTX0RJUkAkMUBnJyBcCisJCS1lICdzQCVTUkNfRElSQCQoVE9QX1NSQ19ESVIpQGcnIFwKKwkJLWUgJ3NAJVBST0pFQ1RfTlVNQkVSQCQoUFJPSkVDVF9OVU1CRVIpQGcnIFwKKwkJLWUgJ3NAJUhBVkVfRE9UQCQoR0VOX0dSQVBIUylAZycgXAorCQktZSAnc0AlTU9ERUxfRElSQCQoT1VUX0RJUl9CQVNFKS9zcmMvY29tbW9uL2luY2x1ZGVAZycgXAorCQktZSAnc0AlT01DSV9NT0RFTF9ESVJAJChPVVRfRElSX0JBU0UpL3NyYy9saWIvbGlib21jaXN2Y0BnJyBcCisJCSQyID4gJDEvRG94eWZpbGUKKwlybSAtZnIgJDEvJChPVVRQVVRfRklMRSkgJDEvJChXQVJOSU5HU19GSUxFKQorCWNkICQxICYmIGRveHlnZW4gMj4kMS8kKFdBUk5JTkdTX0ZJTEUpIHwgdGVlICQxLyQoT1VUUFVUX0ZJTEUpCisJQGVjaG8gIiIKKwlAZWNobyAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisJQGVjaG8gIiMgIENoZWNraW5nIGRveHlnZW4gb3V0cHV0IGZvciB3YXJuaW5ncy4uLiAjIgorCUBlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIKKwlAY2F0ICQxLyQoV0FSTklOR1NfRklMRSkKKwlAdGVzdCAtcyAkMS8kKFdBUk5JTkdTX0ZJTEUpICYmIGVjaG8gLW5lICJcbiEhISBXQVJOSU5HUyBXRVJFIEZPVU5EISEhXG5cblBsZWFzZSBzZWUgd2FybmluZ3MgbGlzdGVkIGFib3ZlIGFuZCBjaGVjayAkMS8kKFdBUk5JTkdTX0ZJTEUpIGZvciBtb3JlIGluZm9ybWF0aW9uXG5cbiIgJiYgZXhpdCAtMSB8fCBlY2hvICJEb25lLiIKKwlybSAtZnIgJDEvJChPVVRQVVRfRklMRSkgJDEvJChXQVJOSU5HU19GSUxFKSAkMS9Eb3h5ZmlsZQorZW5kZWYKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL2RveHlnZW4vYmFsLmRveHkgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL2JhbC5kb3h5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNGU4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL2JhbC5kb3h5CkBAIC0wLDAgKzEsMTg0MSBAQAorIyBEb3h5ZmlsZSAxLjguMgorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdC4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLgorIyBUaGUgZm9ybWF0IGlzOgorIyAgICAgICBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgRm9yIGxpc3RzIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyAgICAgICBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKCIgIikuCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwKKyMgdGV4dCBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlCisjIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlCisjIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKKworIyBUaGUgUFJPSkVDVF9OQU1FIHRhZyBpcyBhIHNpbmdsZSB3b3JkIChvciBzZXF1ZW5jZSBvZiB3b3JkcykgdGhhdCBzaG91bGQKKyMgaWRlbnRpZnkgdGhlIHByb2plY3QuIE5vdGUgdGhhdCBpZiB5b3UgZG8gbm90IHVzZSBEb3h5d2l6YXJkIHlvdSBuZWVkCisjIHRvIHB1dCBxdW90ZXMgYXJvdW5kIHRoZSBwcm9qZWN0IG5hbWUgaWYgaXQgY29udGFpbnMgc3BhY2VzLgorCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gIkJyb2FkYmFuZCBBZGFwdGlvbiBMYXllciIKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuCisjIFRoaXMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IKKyMgaWYgc29tZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSAlUFJPSkVDVF9OVU1CRVIKKworIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXIKKyMgYSBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4KKworUFJPSkVDVF9CUklFRiAgICAgICAgICA9CisKKyMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYW4gbG9nbyBvciBpY29uIHRoYXQgaXMKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90CisjIGV4Y2VlZCA1NSBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBsb2dvIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitQUk9KRUNUX0xPR08gICAgICAgICAgID0gIiVTUkNfRElSLy4uL2RveHlnZW4vYnJvYWRjb20ucG5nIgorCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkKKyMgYmFzZSBwYXRoIHdoZXJlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uCisjIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9ICVPVVRfRE9DU19ESVIKKworIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZQorIyA0MDk2IHN1Yi1kaXJlY3RvcmllcyAoaW4gMiBsZXZlbHMpIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIGVhY2ggb3V0cHV0CisjIGZvcm1hdCBhbmQgd2lsbCBkaXN0cmlidXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgb3ZlciB0aGVzZSBkaXJlY3Rvcmllcy4KKyMgRW5hYmxpbmcgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mCisjIHNvdXJjZSBmaWxlcywgd2hlcmUgcHV0dGluZyBhbGwgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3b3VsZAorIyBvdGhlcndpc2UgY2F1c2UgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKworQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBFbmdsaXNoLCBvdGhlciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZToKKyMgQWZyaWthYW5zLCBBcmFiaWMsIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwgQ2hpbmVzZS1UcmFkaXRpb25hbCwKKyMgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFc3BlcmFudG8sIEZhcnNpLCBGaW5uaXNoLCBGcmVuY2gsIEdlcm1hbiwKKyMgR3JlZWssIEh1bmdhcmlhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2gKKyMgbWVzc2FnZXMpLCBLb3JlYW4sIEtvcmVhbi1lbiwgTGl0aHVhbmlhbiwgTm9yd2VnaWFuLCBNYWNlZG9uaWFuLCBQZXJzaWFuLAorIyBQb2xpc2gsIFBvcnR1Z3Vlc2UsIFJvbWFuaWFuLCBSdXNzaWFuLCBTZXJiaWFuLCBTZXJiaWFuLUN5cmlsbGljLCBTbG92YWssCisjIFNsb3ZlbmUsIFNwYW5pc2gsIFN3ZWRpc2gsIFVrcmFpbmlhbiwgYW5kIFZpZXRuYW1lc2UuCisKK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoCisKKyMgSWYgdGhlIEJSSUVGX01FTUJFUl9ERVNDIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGluY2x1ZGUgYnJpZWYgbWVtYmVyIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4KKyMgdGhlIGZpbGUgYW5kIGNsYXNzIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YURvYykuCisjIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisKK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKKworIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIHByZXBlbmQKKyMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24uCisjIE5vdGU6IGlmIGJvdGggSElERV9VTkRPQ19NRU1CRVJTIGFuZCBCUklFRl9NRU1CRVJfREVTQyBhcmUgc2V0IHRvIE5PLCB0aGUKKyMgYnJpZWYgZGVzY3JpcHRpb25zIHdpbGwgYmUgY29tcGxldGVseSBzdXBwcmVzc2VkLgorCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTCisKKyMgVGhpcyB0YWcgaW1wbGVtZW50cyBhIHF1YXNpLWludGVsbGlnZW50IGJyaWVmIGRlc2NyaXB0aW9uIGFiYnJldmlhdG9yCisjIHRoYXQgaXMgdXNlZCB0byBmb3JtIHRoZSB0ZXh0IGluIHZhcmlvdXMgbGlzdGluZ3MuIEVhY2ggc3RyaW5nCisjIGluIHRoaXMgbGlzdCwgaWYgZm91bmQgYXMgdGhlIGxlYWRpbmcgdGV4dCBvZiB0aGUgYnJpZWYgZGVzY3JpcHRpb24sIHdpbGwgYmUKKyMgc3RyaXBwZWQgZnJvbSB0aGUgdGV4dCBhbmQgdGhlIHJlc3VsdCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcworIyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4KKyMgSWYgbGVmdCBibGFuaywgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCIkbmFtZSIgaXMgYXV0b21hdGljYWxseQorIyByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkpOiAiVGhlICRuYW1lIGNsYXNzIiAiVGhlICRuYW1lIHdpZGdldCIKKyMgIlRoZSAkbmFtZSBmaWxlIiAiaXMiICJwcm92aWRlcyIgInNwZWNpZmllcyIgImNvbnRhaW5zIgorIyAicmVwcmVzZW50cyIgImEiICJhbiIgInRoZSIKKworQUJCUkVWSUFURV9CUklFRiAgICAgICA9CisKKyMgSWYgdGhlIEFMV0FZU19ERVRBSUxFRF9TRUMgYW5kIFJFUEVBVF9CUklFRiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZXRhaWxlZCBzZWN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLgorCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwKKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50CisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwKKyMgcGF0aCBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQKKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuCisKK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBOTworCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgU1RSSVBfRlJPTV9QQVRIIHRhZworIyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLiBTdHJpcHBpbmcgaXMKKyMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YKKyMgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LgorIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZQorIyBwYXRoIHRvIHN0cmlwLiBOb3RlIHRoYXQgeW91IHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28KKyMgcmVsYXRpdmUgcGF0aHMsIHdoaWNoIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMKKyMgc3RhcnRlZC4KKworU1RSSVBfRlJPTV9QQVRIICAgICAgICA9CisKKyMgVGhlIFNUUklQX0ZST01fSU5DX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YKKyMgdGhlIHBhdGggbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgY2xhc3MsIHdoaWNoIHRlbGxzCisjIHRoZSByZWFkZXIgd2hpY2ggaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiBvcmRlciB0byB1c2UgYSBjbGFzcy4KKyMgSWYgbGVmdCBibGFuayBvbmx5IHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcworIyBkZWZpbml0aW9uIGlzIHVzZWQuIE90aGVyd2lzZSBvbmUgc2hvdWxkIHNwZWNpZnkgdGhlIGluY2x1ZGUgcGF0aHMgdGhhdAorIyBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlciB1c2luZyB0aGUgLUkgZmxhZy4KKworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9CisKKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyCisjIChidXQgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdXIgZmlsZSBzeXN0ZW0KKyMgZG9lc24ndCBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuCisjIHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFEb2Mtc3R5bGUKKyMgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIEphdmFEb2MKKyMgY29tbWVudHMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMKKyMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IFlFUworCisjIElmIHRoZSBRVF9BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwKKyMgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIFF0LXN0eWxlCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBjb21tZW50cworIyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcKKyMgYW4gZXhwbGljaXQgXGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQorCitRVF9BVVRPQlJJRUYgICAgICAgICAgID0gTk8KKworIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBEb3h5Z2VuCisjIHRyZWF0IGEgbXVsdGktbGluZSBDKysgc3BlY2lhbCBjb21tZW50IGJsb2NrIChpLmUuIGEgYmxvY2sgb2YgLy8hIG9yIC8vLworIyBjb21tZW50cykgYXMgYSBicmllZiBkZXNjcmlwdGlvbi4gVGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4KKyMgVGhlIG5ldyBkZWZhdWx0IGlzIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkCisjIGRlc2NyaXB0aW9uLiBTZXQgdGhpcyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvdXIgaW5zdGVhZC4KKworTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PCisKKyMgSWYgdGhlIElOSEVSSVRfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYW4gdW5kb2N1bWVudGVkCisjIG1lbWJlciBpbmhlcml0cyB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0CisjIHJlLWltcGxlbWVudHMuCisKK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBwcm9kdWNlCisjIGEgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwKKyMgYmUgcGFydCBvZiB0aGUgZmlsZS9jbGFzcy9uYW1lc3BhY2UgdGhhdCBjb250YWlucyBpdC4KKworU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCisKKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuCisjIERveHlnZW4gdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuCisKK1RBQl9TSVpFICAgICAgICAgICAgICAgPSA0CisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiBhbGlhc2VzIHRoYXQgYWN0cworIyBhcyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4KKyMgRm9yIGV4YW1wbGUgYWRkaW5nICJzaWRlZWZmZWN0PVxwYXIgU2lkZSBFZmZlY3RzOlxuIiB3aWxsIGFsbG93IHlvdSB0bworIyBwdXQgdGhlIGNvbW1hbmQgXHNpZGVlZmZlY3QgKG9yIEBzaWRlZWZmZWN0KSBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgd2hpY2gKKyMgd2lsbCByZXN1bHQgaW4gYSB1c2VyLWRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZyAiU2lkZSBFZmZlY3RzOiIuCisjIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0IG5ld2xpbmVzLgorCitBTElBU0VTICAgICAgICAgICAgICAgID0gIlRBQkxFX0hEUjJ7Mn09PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48L3RyPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUQUJMRV9ST1cyezJ9PTx0cj48dGQ+XDE8L3RkPjx0ZD5cMjwvdGQ+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfSERSM3szfT08dHI+PHRoPlwxPC90aD48dGg+XDI8L3RoPjx0aD5cMzwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XM3szfT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjx0ZD5cMzwvdGQ+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfSERSNHs0fT08dHI+PHRoPlwxPC90aD48dGg+XDI8L3RoPjx0aD5cMzwvdGg+PHRoPlw0PC90aD48L3RyPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUQUJMRV9ST1c0ezR9PTx0cj48dGQ+XDE8L3RkPjx0ZD5cMjwvdGQ+PHRkPlwzPC90ZD48dGQ+XDQ8L3RkPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX0hEUjV7NX09PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48dGg+XDM8L3RoPjx0aD5cNDwvdGg+PHRoPlw1PC90aD48L3RyPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUQUJMRV9ST1c1ezV9PTx0cj48dGQ+XDE8L3RkPjx0ZD5cMjwvdGQ+PHRkPlwzPC90ZD48dGQ+XDQ8L3RkPjx0ZD5cNTwvdGQ+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfSERSNns2fT08dHI+PHRoPlwxPC90aD48dGg+XDI8L3RoPjx0aD5cMzwvdGg+PHRoPlw0PC90aD48dGg+XDU8L3RoPjx0aD5cNjwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XNns2fT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjx0ZD5cMzwvdGQ+PHRkPlw0PC90ZD48dGQ+XDU8L3RkPjx0ZD5cNjwvdGQ+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfSERSN3s3fT08dHI+PHRoPlwxPC90aD48dGg+XDI8L3RoPjx0aD5cMzwvdGg+PHRoPlw0PC90aD48dGg+XDU8L3RoPjx0aD5cNjwvdGg+PHRoPlw3PC90aD48L3RyPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUQUJMRV9ST1c3ezd9PTx0cj48dGQ+XDE8L3RkPjx0ZD5cMjwvdGQ+PHRkPlwzPC90ZD48dGQ+XDQ8L3RkPjx0ZD5cNTwvdGQ+PHRkPlw2PC90ZD48dGQ+XDc8L3RkPjwvdHI+IgorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2Ygd29yZC1rZXl3b3JkIG1hcHBpbmdzIChUQ0wgb25seSkuCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgImNsYXNzPWl0Y2w6OmNsYXNzIiB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIGNvbW1hbmQgY2xhc3MgaW4gdGhlCisjIGl0Y2w6OmNsYXNzIG1lYW5pbmcuCisKK1RDTF9TVUJTVCAgICAgICAgICAgICAgPQorCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMKKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLgorIyBGb3IgaW5zdGFuY2UsIHNvbWUgb2YgdGhlIG5hbWVzIHRoYXQgYXJlIHVzZWQgd2lsbCBiZSBkaWZmZXJlbnQuIFRoZSBsaXN0CisjIG9mIGFsbCBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gWUVTCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IKKyMgSmF2YS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLCBxdWFsaWZpZWQKKyMgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IKKyMgRm9ydHJhbi4KKworT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvcgorIyBWSERMLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0CisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwKKyMgYW5kIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLAorIyBKYXZhc2NyaXB0LCBDU2hhcnAsIEMsIEMrKywgRCwgUEhQLCBPYmplY3RpdmUtQywgUHl0aG9uLCBGb3J0cmFuLCBWSERMLCBDLAorIyBDKysuIEZvciBpbnN0YW5jZSB0byBtYWtlIGRveHlnZW4gdHJlYXQgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0CisjIGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDIChkZWZhdWx0IGlzIEZvcnRyYW4pLCB1c2U6IGluYz1Gb3J0cmFuIGY9Qy4gTm90ZQorIyB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZSB0aGUKKyMgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCisKK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPQorCisjIElmIE1BUktET1dOX1NVUFBPUlQgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIHRoZW4gZG94eWdlbiBwcmUtcHJvY2Vzc2VzIGFsbAorIyBjb21tZW50cyBhY2NvcmRpbmcgdG8gdGhlIE1hcmtkb3duIGZvcm1hdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHJlYWRhYmxlCisjIGRvY3VtZW50YXRpb24uIFNlZSBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duLyBmb3IgZGV0YWlscy4KKyMgVGhlIG91dHB1dCBvZiBtYXJrZG93biBwcm9jZXNzaW5nIGlzIGZ1cnRoZXIgcHJvY2Vzc2VkIGJ5IGRveHlnZW4sIHNvIHlvdQorIyBjYW4gbWl4IGRveHlnZW4sIEhUTUwsIGFuZCBYTUwgY29tbWFuZHMgd2l0aCBNYXJrZG93biBmb3JtYXR0aW5nLgorIyBEaXNhYmxlIG9ubHkgaW4gY2FzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXRpZXMgaXNzdWVzLgorCitNQVJLRE9XTl9TVVBQT1JUICAgICAgID0gWUVTCisKKyMgV2hlbiBlbmFibGVkIGRveHlnZW4gdHJpZXMgdG8gbGluayB3b3JkcyB0aGF0IGNvcnJlc3BvbmQgdG8gZG9jdW1lbnRlZCBjbGFzc2VzLAorIyBvciBuYW1lc3BhY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbi4gU3VjaCBhIGxpbmsgY2FuIGJlCisjIHByZXZlbnRlZCBpbiBpbmRpdmlkdWFsIGNhc2VzIGJ5IGJ5IHB1dHRpbmcgYSAlIHNpZ24gaW4gZnJvbnQgb2YgdGhlIHdvcmQgb3IKKyMgZ2xvYmFsbHkgYnkgc2V0dGluZyBBVVRPTElOS19TVVBQT1JUIHRvIE5PLgorCitBVVRPTElOS19TVVBQT1JUICAgICAgID0gWUVTCisKKyMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudAorIyB0byBpbmNsdWRlIChhIHRhZyBmaWxlIGZvcikgdGhlIFNUTCBzb3VyY2VzIGFzIGlucHV0LCB0aGVuIHlvdSBzaG91bGQKKyMgc2V0IHRoaXMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZAorIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsgdi5zLgorIyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlcyB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorCitCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gTk8KKworIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bworIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCBzb3VyY2VzIG9ubHkuCisjIERveHlnZW4gd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYworIyBpbnN0ZWFkIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KKworU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCisKKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTICh0aGUgZGVmYXVsdCkgd2lsbCBtYWtlIGRveHlnZW4gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YKKyMgdGhlIHNhbWUgdHlwZSAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEKKyMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8KKyMgTk8gdG8gcHJldmVudCBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcKKyMgdGhlIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZAorIyB1bmlvbnMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcKKyMgQGluZ3JvdXApIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvcgorIyBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuCisKK0lOTElORV9HUk9VUEVEX0NMQVNTRVMgPSBOTworCisjIFdoZW4gdGhlIElOTElORV9TSU1QTEVfU1RSVUNUUyB0YWcgaXMgc2V0IHRvIFlFUywgc3RydWN0cywgY2xhc3NlcywgYW5kCisjIHVuaW9ucyB3aXRoIG9ubHkgcHVibGljIGRhdGEgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluIHRoZSBkb2N1bWVudGF0aW9uCisjIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsIG5hbWVzcGFjZSwgb3IgZ3JvdXAKKyMgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCksCisjIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbgorIyBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorCitJTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8KKworIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yIGVudW0KKyMgaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkKKyMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gTk8KKworIyBUaGUgU1lNQk9MX0NBQ0hFX1NJWkUgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgY2FjaGUgdXNlIHRvCisjIGRldGVybWluZSB3aGljaCBzeW1ib2xzIHRvIGtlZXAgaW4gbWVtb3J5IGFuZCB3aGljaCB0byBmbHVzaCB0byBkaXNrLgorIyBXaGVuIHRoZSBjYWNoZSBpcyBmdWxsLCBsZXNzIG9mdGVuIHVzZWQgc3ltYm9scyB3aWxsIGJlIHdyaXR0ZW4gdG8gZGlzay4KKyMgRm9yIHNtYWxsIHRvIG1lZGl1bSBzaXplIHByb2plY3RzICg8MTAwMCBpbnB1dCBmaWxlcykgdGhlIGRlZmF1bHQgdmFsdWUgaXMKKyMgcHJvYmFibHkgZ29vZCBlbm91Z2guIEZvciBsYXJnZXIgcHJvamVjdHMgYSB0b28gc21hbGwgY2FjaGUgc2l6ZSBjYW4gY2F1c2UKKyMgZG94eWdlbiB0byBiZSBidXN5IHN3YXBwaW5nIHN5bWJvbHMgdG8gYW5kIGZyb20gZGlzayBtb3N0IG9mIHRoZSB0aW1lCisjIGNhdXNpbmcgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBwZW5hbHR5LgorIyBJZiB0aGUgc3lzdGVtIGhhcyBlbm91Z2ggcGh5c2ljYWwgbWVtb3J5IGluY3JlYXNpbmcgdGhlIGNhY2hlIHdpbGwgaW1wcm92ZSB0aGUKKyMgcGVyZm9ybWFuY2UgYnkga2VlcGluZyBtb3JlIHN5bWJvbHMgaW4gbWVtb3J5LiBOb3RlIHRoYXQgdGhlIHZhbHVlIHdvcmtzIG9uCisjIGEgbG9nYXJpdGhtaWMgc2NhbGUgc28gaW5jcmVhc2luZyB0aGUgc2l6ZSBieSBvbmUgd2lsbCByb3VnaGx5IGRvdWJsZSB0aGUKKyMgbWVtb3J5IHVzYWdlLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6CisjIDJeKDE2K1NZTUJPTF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzLgorCisjU1lNQk9MX0NBQ0hFX1NJWkUgICAgICA9IDAKKworIyBTaW1pbGFyIHRvIHRoZSBTWU1CT0xfQ0FDSEVfU0laRSB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGxvb2t1cCBjYWNoZSBjYW4gYmUKKyMgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuCisjIHRoZWlyIG5hbWUgYW5kIHNjb3BlLiBTaW5jZSB0aGlzIGNhbiBiZSBhbiBleHBlbnNpdmUgcHJvY2VzcyBhbmQgb2Z0ZW4gdGhlCisjIHNhbWUgc3ltYm9sIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgY29kZSwgZG94eWdlbiBrZWVwcyBhIGNhY2hlIG9mCisjIHByZS1yZXNvbHZlZCBzeW1ib2xzLiBJZiB0aGUgY2FjaGUgaXMgdG9vIHNtYWxsIGRveHlnZW4gd2lsbCBiZWNvbWUgc2xvd2VyLgorIyBJZiB0aGUgY2FjaGUgaXMgdG9vIGxhcmdlLCBtZW1vcnkgaXMgd2FzdGVkLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzCisjIGZvcm11bGE6IDJeKDE2K0xPT0tVUF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzLgorCitMT09LVVBfQ0FDSEVfU0laRSAgICAgID0gMQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVYVFJBQ1RfQUxMIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLgorIyBQcml2YXRlIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzCisjIHRoZSBFWFRSQUNUX1BSSVZBVEUgYW5kIEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMKKworRVhUUkFDVF9BTEwgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRSQUNUX1BSSVZBVEUgdGFnIGlzIHNldCB0byBZRVMgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QQUNLQUdFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBtZW1iZXJzIHdpdGggcGFja2FnZSBvciBpbnRlcm5hbAorIyBzY29wZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitFWFRSQUNUX1BBQ0tBR0UgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZQorIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykKKyMgZGVmaW5lZCBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBJZiBzZXQgdG8gTk8gb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IFlFUworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gV2hlbiBzZXQgdG8gWUVTIGxvY2FsCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4KKyMgdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZC4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UKKyMgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0CisjIGFub255bW91cyBuYW1lc3BhY2VzIGFyZSBoaWRkZW4uCisKK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBvZiBkb2N1bWVudGVkIGNsYXNzZXMsIGZpbGVzIG9yIG5hbWVzcGFjZXMuCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKKyMgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLgorIyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisKK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cworIyBvdmVydmlld3MuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIGZyaWVuZCAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGRlY2xhcmF0aW9ucyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFueQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlCisjIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKworSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCisKKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbgorIyB0aGF0IGlzIHR5cGVkIGFmdGVyIGEgXGludGVybmFsIGNvbW1hbmQgaXMgaW5jbHVkZWQuIElmIHRoZSB0YWcgaXMgc2V0CisjIHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiB0aGUgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGV4Y2x1ZGVkLgorIyBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisKK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBEb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZQorIyBmaWxlIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUyB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcgorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MKKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisKK0NBU0VfU0VOU0VfTkFNRVMgICAgICAgPSBZRVMKKworIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuCisjIHdpbGwgc2hvdyBtZW1iZXJzIHdpdGggdGhlaXIgZnVsbCBjbGFzcyBhbmQgbmFtZXNwYWNlIHNjb3BlcyBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIFlFUyB0aGUgc2NvcGUgd2lsbCBiZSBoaWRkZW4uCisKK0hJREVfU0NPUEVfTkFNRVMgICAgICAgPSBOTworCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KKyMgd2lsbCBwdXQgYSBsaXN0IG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgb2YgdGhhdCBmaWxlLgorCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCisKKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbgorIyB3aWxsIGxpc3QgaW5jbHVkZSBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24KKyMgcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KKworRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBhIHRhZyBbaW5saW5lXQorIyBpcyBpbnNlcnRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuCisKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gZG94eWdlbgorIyB3aWxsIHNvcnQgdGhlIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzCisjIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4KKyMgZGVjbGFyYXRpb24gb3JkZXIuCisKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIGJyaWVmIGRvY3VtZW50YXRpb24gb2YgZmlsZSwgbmFtZXNwYWNlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5CisjIGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbgorIyBkZWNsYXJhdGlvbiBvcmRlci4KKworU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgc29ydCB0aGUgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQKKyMgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQorIyB0aGUgY29uc3RydWN0b3JzIHdpbGwgYXBwZWFyIGluIHRoZSByZXNwZWN0aXZlIG9yZGVycyBkZWZpbmVkIGJ5CisjIFNPUlRfTUVNQkVSX0RPQ1MgYW5kIFNPUlRfQlJJRUZfRE9DUy4KKyMgVGhpcyB0YWcgd2lsbCBiZSBpZ25vcmVkIGZvciBicmllZiBkb2NzIGlmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8KKyMgYW5kIGlnbm9yZWQgZm9yIGRldGFpbGVkIGRvY3MgaWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8uCisKK1NPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTworCisjIElmIHRoZSBTT1JUX0dST1VQX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIGhpZXJhcmNoeSBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkKKyMgdGhlIGdyb3VwIG5hbWVzIHdpbGwgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuCisKK1NPUlRfR1JPVVBfTkFNRVMgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlCisjIHNvcnRlZCBieSBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8KKyMgTk8gKHRoZSBkZWZhdWx0KSwgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLAorIyBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4KKyMgTm90ZTogVGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsIGlmIEhJREVfU0NPUEVfTkFNRVMgaXMgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlCisjIGFscGhhYmV0aWNhbCBsaXN0LgorCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KKworIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvCisjIGRvIHByb3BlciB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhCisjIG1hdGNoIGJldHdlZW4gdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4KKyMgaWYgdGhlcmUgaXMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZQorIyBieSBkb2luZyBhIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbgorIyB3aWxsIHN0aWxsIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgorCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcgorIyBkaXNhYmxlIChOTykgdGhlIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbworIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0CisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcgorIyBkaXNhYmxlIChOTykgdGhlIGJ1ZyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxidWcKKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcgorIyBkaXNhYmxlIChOTykgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZworIyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwKKyMgZG9jdW1lbnRhdGlvbiBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiBzZWN0aW9ubmFtZSAuLi4gXGVuZGlmLgorCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0KKworIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcworIyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIG1hY3JvIGNvbnNpc3RzIG9mIGZvciBpdCB0byBhcHBlYXIgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkCisjIGhlcmUgaXQgd2lsbCBiZSBoaWRkZW4uIFVzZSBhIHZhbHVlIG9mIDAgdG8gaGlkZSBpbml0aWFsaXplcnMgY29tcGxldGVseS4KKyMgVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGluaXRpYWxpemVyIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBtYWNyb3MgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyCisjIGNvbW1hbmQgaW4gdGhlIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZAorIyBhdCB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMgdGhlCisjIGxpc3Qgd2lsbCBtZW50aW9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKworU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRmlsZXMgcGFnZS4KKyMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgRmlsZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQorIyBOYW1lc3BhY2VzIHBhZ2UuCisjIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXgKKyMgYW5kIGZyb20gdGhlIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4KKworU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUworCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdAorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20KKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxjb21tYW5kPiA8aW5wdXQtZmlsZT4sIHdoZXJlIDxjb21tYW5kPiBpcyB0aGUgdmFsdWUgb2YKKyMgdGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuIGlucHV0IGZpbGUKKyMgcHJvdmlkZWQgYnkgZG94eWdlbi4gV2hhdGV2ZXIgdGhlIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dAorIyBpcyB1c2VkIGFzIHRoZSBmaWxlIHZlcnNpb24uIFNlZSB0aGUgbWFudWFsIGZvciBleGFtcGxlcy4KKworRklMRV9WRVJTSU9OX0ZJTFRFUiAgICA9CisKKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKKyMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4KKyMgWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZAorIyBEb3h5Z2VuTGF5b3V0LnhtbCB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgorCitMQVlPVVRfRklMRSAgICAgICAgICAgID0gJVNSQ19ESVIvLi4vZG94eWdlbi9Eb3h5Z2VuTGF5b3V0LnhtbAorCisKKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcworIyBjb250YWluaW5nIHRoZSByZWZlcmVuY2VzIGRhdGEuIFRoaXMgbXVzdCBiZSBhIGxpc3Qgb2YgLmJpYiBmaWxlcy4gVGhlCisjIC5iaWIgZXh0ZW5zaW9uIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgb21pdHRlZC4gVXNpbmcgdGhpcyBjb21tYW5kCisjIHJlcXVpcmVzIHRoZSBiaWJ0ZXggdG9vbCB0byBiZSBpbnN0YWxsZWQuIFNlZSBhbHNvCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGZvciBtb3JlIGluZm8uIEZvciBMYVRlWCB0aGUgc3R5bGUKKyMgb2YgdGhlIGJpYmxpb2dyYXBoeSBjYW4gYmUgY29udHJvbGxlZCB1c2luZyBMQVRFWF9CSUJfU1RZTEUuIFRvIHVzZSB0aGlzCisjIGZlYXR1cmUgeW91IG5lZWQgYmlidGV4IGFuZCBwZXJsIGF2YWlsYWJsZSBpbiB0aGUgc2VhcmNoIHBhdGguCisKK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFFVSUVUIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgZ2VuZXJhdGVkCisjIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlCisjIGdlbmVyYXRlZCBieSBkb3h5Z2VuLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsKKyMgTk8gaXMgdXNlZC4KKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIFdBUk5fSUZfVU5ET0NVTUVOVEVEIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzCisjIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZyB3aWxsCisjIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuCisKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBOTworCisjIElmIFdBUk5fSUZfRE9DX0VSUk9SIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncyBmb3IKKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZQorIyBwYXJhbWV0ZXJzIGluIGEgZG9jdW1lbnRlZCBmdW5jdGlvbiwgb3IgZG9jdW1lbnRpbmcgcGFyYW1ldGVycyB0aGF0CisjIGRvbid0IGV4aXN0IG9yIHVzaW5nIG1hcmt1cCBjb21tYW5kcyB3cm9uZ2x5LgorCitXQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTCisKKyMgVGhlIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3IKKyMgZnVuY3Rpb25zIHRoYXQgYXJlIGRvY3VtZW50ZWQsIGJ1dCBoYXZlIG5vIGRvY3VtZW50YXRpb24gZm9yIHRoZWlyIHBhcmFtZXRlcnMKKyMgb3IgcmV0dXJuIHZhbHVlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0CisjIHdyb25nIG9yIGluY29tcGxldGUgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YKKyMgZG9jdW1lbnRhdGlvbi4KKworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IFlFUworCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQKKyMgZG94eWdlbiBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQKKyMgdGFncywgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUKKyMgd2FybmluZyBvcmlnaW5hdGVkIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4KKyMgJHZlcnNpb24sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkCisjIGJlIG9idGFpbmVkIHZpYSBGSUxFX1ZFUlNJT05fRklMVEVSKQorCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKKworIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nCisjIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4KKyMgdG8gc3RkZXJyLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgSU5QVVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KKyMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlICJteWZpbGUuY3BwIiBvcgorIyBkaXJlY3RvcmllcyBsaWtlICIvdXNyL3NyYy9teXByb2plY3QiLiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgd2l0aCBzcGFjZXMuCisKK0lOUFVUICAgICAgICAgICAgICAgICAgPSAlU1JDX0RJUi9saWIvbGliYmFsYXBpL2JhbF9hcGkuZG94IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlTU9ERUxfRElSL21vZGVsLmRveCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvbGliL2xpYmJhbGFwaS9iYWxfYXBpLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL2xpYi9saWJiYWxhcGkvYmFsX2FwaS5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlTU9ERUxfRElSL2JhbF9tb2RlbF9pZHMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJU1PREVMX0RJUi9iYWxfbW9kZWxfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcworIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGlzCisjIGFsc28gdGhlIGRlZmF1bHQgaW5wdXQgZW5jb2RpbmcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0CisjIGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3IKKyMgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcAorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0CisjIGJsYW5rIHRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHRlc3RlZDoKKyMgKi5jICouY2MgKi5jeHggKi5jcHAgKi5jKysgKi5kICouamF2YSAqLmlpICouaXh4ICouaXBwICouaSsrICouaW5sICouaCAqLmhoCisjICouaHh4ICouaHBwICouaCsrICouaWRsICoub2RsICouY3MgKi5waHAgKi5waHAzICouaW5jICoubSAqLm1tICouZG94ICoucHkKKyMgKi5mOTAgKi5mICouZm9yICoudmhkICoudmhkbAorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jICouaCAqLmNwcAorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcworIyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4KKyMgSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gWUVTCisKKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlCisjIGV4Y2x1ZGVkIGZyb20gdGhlIElOUFVUIHNvdXJjZSBmaWxlcy4gVGhpcyB3YXkgeW91IGNhbiBlYXNpbHkgZXhjbHVkZSBhCisjIHN1YmRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IHRyZWUgd2hvc2Ugcm9vdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgSU5QVVQgdGFnLgorIyBOb3RlIHRoYXQgcmVsYXRpdmUgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1bi4KKworRVhDTFVERSAgICAgICAgICAgICAgICA9ICVTUkNfRElSL2NvbW1vbi9vc19hYnN0cmFjdGlvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvY29tbW9uL2RiX2VuZ2luZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvY29tbW9uL2NsaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvY29tbW9uL2Rldl9sb2cgXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL2NvbW1vbi91dGlscyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvY29tbW9uL2NvbmZpZyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvY29yZS91dGlsL29hbS9lcG9uX29hbV9jbGkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL2NvcmUvdXRpbC9vYW0vZXBvbl9vYW0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL2NvcmUvdXRpbC9vYW0vY29tbW9uX2Vwb25fb2FtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9jb3JlL3V0aWwvb2FtL2VvbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvY29tbW9uL21vZGVsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9saWIvbGlib21jaXN2YyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvbGliL2xpYm9tY2lzdGFjayBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvb2ZwYWwvbG9jaQorCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlIHN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQKKyMgZnJvbSB0aGUgaW5wdXQuCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4gTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQKKyMgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMKKyMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAqL3Rlc3QvKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKkV4YW1wbGVzKgorCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLAorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0CisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPQorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZQorIyB0aGUgXGluY2x1ZGUgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPQorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcAorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0CisjIGJsYW5rIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPQorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlCisjIGNvbW1hbmRzIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KKworIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gaW1hZ2UgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZQorIyB0aGUgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0KKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPgorIyBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4KKyMgaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyIHByb2dyYW0gd3JpdGVzCisjIHRvIHN0YW5kYXJkIG91dHB1dC4KKyMgSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcgd2lsbCBiZQorIyBpZ25vcmVkLgorCitJTlBVVF9GSUxURVIgICAgICAgICAgID0KKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuCisjIGJhc2lzLgorIyBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guCisjIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06CisjIHBhdHRlcm49ZmlsdGVyIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSBvciBpZgorIyBub24gb2YgdGhlIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0KKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlCisjIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KKworIyBUaGUgRklMVEVSX1NPVVJDRV9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBzb3VyY2UgZmlsdGVycyBwZXIgZmlsZQorIyBwYXR0ZXJuLiBBIHBhdHRlcm4gd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBmb3IgRklMVEVSX1BBVFRFUk4gKGlmIGFueSkKKyMgYW5kIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGlzYWJsZSBzb3VyY2UgZmlsdGVyaW5nIGZvciBhIHNwZWNpZmljIHBhdHRlcm4KKyMgdXNpbmcgKi5leHQ9IChzbyB3aXRob3V0IG5hbWluZyBhIGZpbHRlcikuIFRoaXMgb3B0aW9uIG9ubHkgaGFzIGVmZmVjdCB3aGVuCisjIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgZW5hYmxlZC4KKworRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gc291cmNlIGJyb3dzaW5nCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB3aWxsCisjIGJlIGdlbmVyYXRlZC4gRG9jdW1lbnRlZCBlbnRpdGllcyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGVzZSBzb3VyY2VzLgorIyBOb3RlOiBUbyBnZXQgcmlkIG9mIGFsbCBzb3VyY2UgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dCwgbWFrZSBzdXJlIGFsc28KKyMgVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keQorIyBvZiBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgZGlyZWN0bHkgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTworCisjIFNldHRpbmcgdGhlIFNUUklQX0NPREVfQ09NTUVOVFMgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgaW5zdHJ1Y3QKKyMgZG94eWdlbiB0byBoaWRlIGFueSBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlCisjIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMKKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkCisjIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMKKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzCisjIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTworCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkKKyMgYW5kIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20KKyMgZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbAorIyBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4KKyMgT3RoZXJ3aXNlIHRoZXkgd2lsbCBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLgorCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCisKKyMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlCisjIHdpbGwgcG9pbnQgdG8gdGhlIEhUTUwgZ2VuZXJhdGVkIGJ5IHRoZSBodGFncygxKSB0b29sIGluc3RlYWQgb2YgZG94eWdlbgorIyBidWlsdC1pbiBzb3VyY2UgYnJvd3Nlci4gVGhlIGh0YWdzIHRvb2wgaXMgcGFydCBvZiBHTlUncyBnbG9iYWwgc291cmNlCisjIHRhZ2dpbmcgc3lzdGVtIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdQorIyB3aWxsIG5lZWQgdmVyc2lvbiA0LjguNiBvciBoaWdoZXIuCisKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3IKKyMgd2hpY2ggYW4gaW5jbHVkZSBpcyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisKK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXgKKyMgb2YgYWxsIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QKKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBJZiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGlzIGVuYWJsZWQgKHNlZSBBTFBIQUJFVElDQUxfSU5ERVgpIHRoZW4KKyMgdGhlIENPTFNfSU5fQUxQSEFfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zCisjIGluIHdoaWNoIHRoaXMgbGlzdCB3aWxsIGJlIHNwbGl0IChjYW4gYmUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFsxLi4yMF0pCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbAorIyBjbGFzc2VzIHdpbGwgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LgorIyBUaGUgSUdOT1JFX1BSRUZJWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBwcmVmaXhlcyB0aGF0CisjIHNob3VsZCBiZSBpZ25vcmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisKK0lHTk9SRV9QUkVGSVggICAgICAgICAgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIEhUTUwgb3V0cHV0LgorCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCisKKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGh0bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gaHRtbAorCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlIChmb3IgZXhhbXBsZTogLmh0bSwucGhwLC5hc3ApLiBJZiBpdCBpcyBsZWZ0IGJsYW5rCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBmaWxlcyB3aXRoIC5odG1sIGV4dGVuc2lvbi4KKworSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sCisKKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBoZWFkZXIgZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGEgY3VzdG9tIGhlYWRlciB5b3UgYXJlIHJlc3BvbnNpYmxlCisjICBmb3IgdGhlIHByb3BlciBpbmNsdXNpb24gb2YgYW55IHNjcmlwdHMgYW5kIHN0eWxlIHNoZWV0cyB0aGF0IGRveHlnZW4KKyMgbmVlZHMsIHdoaWNoIGlzIGRlcGVuZGVudCBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQuCisjIEl0IGlzIGFkdmlzZWQgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IGhlYWRlciB1c2luZyAiZG94eWdlbiAtdyBodG1sCisjIGhlYWRlci5odG1sIGZvb3Rlci5odG1sIHN0eWxlc2hlZXQuY3NzIFlvdXJDb25maWdGaWxlIiBhbmQgdGhlbiBtb2RpZnkKKyMgdGhhdCBoZWFkZXIuIE5vdGUgdGhhdCB0aGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkKKyMgaGF2ZSB0byByZWRvIHRoaXMgd2hlbiB1cGdyYWRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIGRveHlnZW4gb3Igd2hlbgorIyBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBzdWNoIGFzIEdFTkVSQVRFX1RSRUVWSUVXIQorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gJVNSQ19ESVIvLi4vZG94eWdlbi9oZWFkZXIuaHRtbAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgZm9vdGVyIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgZm9vdGVyLgorCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0gJVNSQ19ESVIvLi4vZG94eWdlbi9mb290ZXIuaHRtbAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nCisjIHN0eWxlIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8KKyMgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LiBOb3RlIHRoYXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlCisjIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBhcyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcworIyB0YWcgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZSBvYnNvbGV0ZS4KKworSFRNTF9TVFlMRVNIRUVUICAgICAgICA9CisKKyMgVGhlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhZGRpdGlvbmFsCisjIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcgc3R5bGUgc2hlZXQgdGhhdCBpcyBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQKKyMgc3R5bGUgc2hlZXRzIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZQorIyBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUCisjIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvciBtb3JlCisjIHJvYnVzdCBhZ2FpbnN0IGZ1dHVyZSB1cGRhdGVzLiBEb3h5Z2VuIHdpbGwgY29weSB0aGUgc3R5bGUgc2hlZXQgZmlsZSB0bworIyB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKworSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9CisKKyMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUKKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUKKyMgJHJlbHBhdGgkIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UKKyMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQKKyMgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuCisKK0hUTUxfRVhUUkFfRklMRVMgICAgICAgPQorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfSFVFIHRhZyBjb250cm9scyB0aGUgY29sb3Igb2YgdGhlIEhUTUwgb3V0cHV0LgorIyBEb3h5Z2VuIHdpbGwgYWRqdXN0IHRoZSBjb2xvcnMgaW4gdGhlIHN0eWxlIHNoZWV0IGFuZCBiYWNrZ3JvdW5kIGltYWdlcworIyBhY2NvcmRpbmcgdG8gdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsCisjIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMgRm9yIGluc3RhbmNlIHRoZSB2YWx1ZSAwIHJlcHJlc2VudHMgcmVkLCA2MCBpcyB5ZWxsb3csIDEyMCBpcyBncmVlbiwKKyMgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4KKyMgVGhlIGFsbG93ZWQgcmFuZ2UgaXMgMCB0byAzNTkuCisKK0hUTUxfQ09MT1JTVFlMRV9IVUUgICAgPSAyMjAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX1NBVCB0YWcgY29udHJvbHMgdGhlIHB1cml0eSAob3Igc2F0dXJhdGlvbikgb2YKKyMgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIEZvciBhIHZhbHVlIG9mIDAgdGhlIG91dHB1dCB3aWxsIHVzZQorIyBncmF5c2NhbGVzIG9ubHkuIEEgdmFsdWUgb2YgMjU1IHdpbGwgcHJvZHVjZSB0aGUgbW9zdCB2aXZpZCBjb2xvcnMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvCisjIHRoZSBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cKKyMgMTAwIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UKKyMgdGhlIG91dHB1dCBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsCisjIHNvIDgwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwKKyMgYW5kIDEwMCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdhbW1hLgorCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODAKKworIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nCisjIHRoaXMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLgorCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhUTUxfRFlOQU1JQ19TRUNUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBnZW5lcmF0ZWQgSFRNTAorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBoaWRkZW4gYW5kIHNob3duIGFmdGVyIHRoZQorIyBwYWdlIGhhcyBsb2FkZWQuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTworCisjIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YKKyMgZW50cmllcyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyCisjIGNhbiBleHBhbmQgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQKKyMgdGhlIHRyZWUgdG8gc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZQorIyB2aXNpYmxlICh1bmxlc3MgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLgorIyBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkKKyMgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzCisjIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQgdHJlZSBieSBkZWZhdWx0LgorCitIVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcworIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMKKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4KKyMgVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIE1ha2VmaWxlIGluIHRoZQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbiB0aGF0CisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQKKyMgaXQgYXQgc3RhcnR1cC4KKyMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwKKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZQorIyBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZQorIyBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlciAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkKKyMgY2FuIGJlIGdyb3VwZWQuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQKKyMgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEKKyMgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbgorIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorCitET0NTRVRfQlVORExFX0lEICAgICAgID0gd3d3LmJyb2FkY29tLmNvbQorCisjIFdoZW4gR0VORVJBVEVfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkKKyMgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUKKyMgc3R5bGUgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4KKworRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IHd3dy5icm9hZGNvbS5jb20KKworIyBUaGUgR0VORVJBVEVfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLgorCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gQnJvYWRjb20gTGltaXRlZAorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcworIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciB0b29scyBsaWtlIHRoZQorIyBNaWNyb3NvZnQgSFRNTCBoZWxwIHdvcmtzaG9wIHRvIGdlbmVyYXRlIGEgY29tcGlsZWQgSFRNTCBoZWxwIGZpbGUgKC5jaG0pCisjIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fRklMRSB0YWcgY2FuCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobSBmaWxlLiBZb3UKKyMgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlCisjIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZgorIyB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIChoaGMuZXhlKS4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEdFTkVSQVRFX0NISSBmbGFnCisjIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZCAoWUVTKSBvciB0aGF0CisjIGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fSU5ERVhfRU5DT0RJTkcKKyMgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKGhoayksIGNvbnRlbnQgKGhoYykgYW5kIHByb2plY3QgZmlsZQorIyBjb250ZW50LgorCitDSE1fSU5ERVhfRU5DT0RJTkcgICAgID0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBCSU5BUllfVE9DIGZsYWcKKyMgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgYQorIyBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKE5PKSBpbiB0aGUgLmNobSBmaWxlLgorCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KKworIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycworIyB0byB0aGUgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3LgorCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQKKyMgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhCisjIFF0IENvbXByZXNzZWQgSGVscCAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuCisjIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0byB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorCitRQ0hfRklMRSAgICAgICAgICAgICAgID0KKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZworIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlCisKK1FIUF9OQU1FU1BBQ0UgICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZworIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC1mb2xkZXJzCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiBRSFBfQ1VTVF9GSUxURVJfTkFNRSBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbSBmaWx0ZXIgdG8KKyMgYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLWZpbHRlcnMKKworUUhQX0NVU1RfRklMVEVSX05BTUUgICA9CisKKyMgVGhlIFFIUF9DVVNUX0ZJTFRfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUKKyMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycyI+CisjIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbSBGaWx0ZXJzPC9hPi4KKworUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9CisKKyMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMKKyMgcHJvamVjdCdzCisjIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuCisjIDxhIGhyZWY9Imh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMiPgorIyBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlczwvYT4uCisKK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPQorCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbgorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIFF0J3MgcWhlbHBnZW5lcmF0b3IuCisjIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUgZ2VuZXJhdGVkCisjIC5xaHAgZmlsZS4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0VDTElQU0VIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzCisjICB3aWxsIGJlIGdlbmVyYXRlZCwgd2hpY2ggdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgZm9ybSBhbiBFY2xpcHNlIGhlbHAKKyMgcGx1Z2luLiBUbyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cworIyBtZW51IGluIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTAorIyBmaWxlcyBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YKKyMgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcworIyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlCisjIHRoZSBoZWxwIGFwcGVhcnMuCisKK0dFTkVSQVRFX0VDTElQU0VIRUxQICAgPSBOTworCisjIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbgorIyB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIHNob3VsZCBhbHNvIGhhdmUKKyMgdGhpcyBuYW1lLgorCitFQ0xJUFNFX0RPQ19JRCAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKQorIyBhdCB0b3Agb2YgZWFjaCBIVE1MIHBhZ2UuIFRoZSB2YWx1ZSBOTyAodGhlIGRlZmF1bHQpIGVuYWJsZXMgdGhlIGluZGV4IGFuZAorIyB0aGUgdmFsdWUgWUVTIGRpc2FibGVzIGl0LiBTaW5jZSB0aGUgdGFicyBoYXZlIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZQorIyBuYXZpZ2F0aW9uIHRyZWUgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gTk8gaWYgeW91IGFscmVhZHkgc2V0CisjIEdFTkVSQVRFX1RSRUVWSUVXIHRvIFlFUy4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uCisjIElmIHRoZSB0YWcgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkCisjIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0CisjIGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cworIyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4KKyMgV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUgSFRNTCBoZWxwIGZlYXR1cmUuCisjIFNpbmNlIHRoZSB0cmVlIGJhc2ljYWxseSBoYXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHRhYiBpbmRleCB5b3UKKyMgY291bGQgY29uc2lkZXIgdG8gc2V0IERJU0FCTEVfSU5ERVggdG8gTk8gd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4KKworR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IFlFUworCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMKKyMgKHJhbmdlIFswLDEuLjIwXSkgdGhhdCBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtCisjIHZhbHVlcyBmcm9tIGFwcGVhcmluZyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4KKworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKKworIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZQorIyB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUKKyMgaXMgc2hvd24uCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBXaGVuIHRoZSBFWFRfTElOS1NfSU5fV0lORE9XIG9wdGlvbiBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBvcGVuCisjIGxpbmtzIHRvIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKworRVhUX0xJTktTX0lOX1dJTkRPVyAgICA9IE5PCisKKyMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhdGV4IGZvcm11bGFzIGluY2x1ZGVkCisjIGFzIGltYWdlcyBpbiB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyAxMC4gTm90ZSB0aGF0CisjIHdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bCBkb3h5Z2VuIHJ1biB5b3UgbmVlZAorIyB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeQorIyB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTAKKworIyBVc2UgdGhlIEZPUk1VTEFfVFJBTlBBUkVOVCB0YWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGZvciBmb3JtdWxhcyBhcmUgdHJhbnNwYXJlbnQgUE5Hcy4gVHJhbnNwYXJlbnQgUE5HcyBhcmUKKyMgbm90IHN1cHBvcnRlZCBwcm9wZXJseSBmb3IgSUUgNi4wLCBidXQgYXJlIHN1cHBvcnRlZCBvbiBhbGwgbW9kZXJuIGJyb3dzZXJzLgorIyBOb3RlIHRoYXQgd2hlbiBjaGFuZ2luZyB0aGlzIG9wdGlvbiB5b3UgbmVlZCB0byBkZWxldGUgYW55IGZvcm1fKi5wbmcgZmlsZXMKKyMgaW4gdGhlIEhUTUwgb3V0cHV0IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKworRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUworCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4CisjIChzZWUgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUKKyMgcmVuZGVyaW5nIGluc3RlYWQgb2YgdXNpbmcgcHJlcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdAorIyBoYXZlIExhVGVYIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MCisjIG91dHB1dC4gV2hlbiBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZAorIyBjb25maWd1cmUgdGhlIHBhdGggdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uCisKK1VTRV9NQVRISkFYICAgICAgICAgICAgPSBOTworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbgorIyBkaXJlY3Rvcnkgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4CisjIGRpcmVjdG9yeSBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4KKyMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8KKyMgdGhlIE1hdGhKYXggQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0CisjIGluc3RhbGxpbmcgTWF0aEpheC4KKyMgSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsCisjIGNvcHkgb2YgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuCisKK01BVEhKQVhfUkVMUEFUSCAgICAgICAgPSBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0CisKKyMgVGhlIE1BVEhKQVhfRVhURU5TSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgTWF0aEpheCBleHRlbnNpb24KKyMgbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuCisKK01BVEhKQVhfRVhURU5TSU9OUyAgICAgPQorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94CisjIGZvciB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0CisjIGFuZCBESFRNTCBhbmQgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZworIyBIVE1MIGhlbHAgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cworIyAoR0VORVJBVEVfRE9DU0VUKSB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZAorIyB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lCisjIGNhbiBiZSBzbG93LCB0aGVuIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUKKyMgaW1wbGVtZW50ZWQgdXNpbmcgYSBQSFAgZW5hYmxlZCB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYXQgdGhlIHdlYiBjbGllbnQKKyMgdXNpbmcgSmF2YXNjcmlwdC4gRG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBzZWFyY2ggUEhQIHNjcmlwdCBhbmQgaW5kZXgKKyMgZmlsZSB0byBwdXQgb24gdGhlIHdlYiBzZXJ2ZXIuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIHNlcnZlcgorIyBiYXNlZCBhcHByb2FjaCBpcyB0aGF0IGl0IHNjYWxlcyBiZXR0ZXIgdG8gbGFyZ2UgcHJvamVjdHMgYW5kIGFsbG93cworIyBmdWxsIHRleHQgc2VhcmNoLiBUaGUgZGlzYWR2YW50YWdlcyBhcmUgdGhhdCBpdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBzZXR1cAorIyBhbmQgZG9lcyBub3QgaGF2ZSBsaXZlIHNlYXJjaGluZyBjYXBhYmlsaXRpZXMuCisKK1NFUlZFUl9CQVNFRF9TRUFSQ0ggICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgTGF0ZXggb3V0cHV0LgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlCisjIGludm9rZWQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgY29tbWFuZCBuYW1lLgorIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvcgorIyBnZW5lcmF0aW5nIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUKKyMgTWFrZWZpbGUgdGhhdCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8KKyMgZ2VuZXJhdGUgaW5kZXggZm9yIExhVGVYLiBJZiBsZWZ0IGJsYW5rIGBtYWtlaW5kZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUKKyMgZGVmYXVsdCBjb21tYW5kIG5hbWUuCisKK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKKworIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QKKyMgTGFUZVggZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bworIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQKKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBsZXR0ZXIsIGxlZ2FsIGFuZAorIyBleGVjdXRpdmUuIElmIGxlZnQgYmxhbmsgYTR3aWRlIHdpbGwgYmUgdXNlZC4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbmFtZXMgb2YgTGFUZVgKKyMgcGFja2FnZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4KKworRVhUUkFfUEFDS0FHRVMgICAgICAgICA9CisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IKKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsCisjIHRoZSBmaXJzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPQorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yCisjIHRoZSBnZW5lcmF0ZWQgbGF0ZXggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlcgorIyB0aGUgbGFzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGZvb3Rlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0ZPT1RFUiAgICAgICAgICAgPQorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkCisjIGlzIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIHBkZiAodXNpbmcgcHMycGRmKS4gVGhlIHBkZiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMKKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBwZGZsYXRleCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZgorIyBwbGFpbiBsYXRleCBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorCitVU0VfUERGTEFURVggICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcXGJhdGNobW9kZS4KKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcAorIyBydW5uaW5nIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuCisjIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgTEFURVhfSElERV9JTkRJQ0VTIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90CisjIGluY2x1ZGUgdGhlIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKQorIyBpbiB0aGUgb3V0cHV0LgorCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KKworIyBJZiBMQVRFWF9TT1VSQ0VfQ09ERSBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUKKyMgc291cmNlIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3MKKyMgc3VjaCBhcyBTT1VSQ0VfQlJPV1NFUi4KKworTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUKKyMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFRoZSBkZWZhdWx0IHN0eWxlIGlzICJwbGFpbiIuIFNlZQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgorCitMQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQKKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aAorIyBvdGhlciBSVEYgcmVhZGVycyBvciBlZGl0b3JzLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHJ0Zicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0CisjIFJURiBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQKKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLgorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBXT1JEIG9yIG90aGVyCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLgorIyBOb3RlOiB3b3JkcGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCisKKyMgTG9hZCBzdHlsZSBzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncworIyBjb25maWcgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlCisjIHJlcGxhY2VtZW50cywgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPQorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuCisjIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4KKworUlRGX0VYVEVOU0lPTlNfRklMRSAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYG1hbicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8KKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBEb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LAorIyB0aGVuIGl0IHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5CisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMKKyMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0IHRoZW0gdGhlIG1hbiBjb21tYW5kCisjIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuIFRoZSBkZWZhdWx0IGlzIE5PLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHhtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBUaGUgWE1MX1NDSEVNQSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgc2NoZW1hLAorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKKyNYTUxfU0NIRU1BICAgICAgICAgICAgID0KKworIyBUaGUgWE1MX0RURCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgRFRELAorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKKyNYTUxfRFREICAgICAgICAgICAgICAgID0KKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAorIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZworIyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQKKyMgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFhNTCBvdXRwdXQuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYW4gQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGF1dG9nZW4uc2YubmV0KSBmaWxlCisjIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsCisjIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZSBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzCisjIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZQorIyBtb21lbnQuCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB0aGUgbmVjZXNzYXJ5IE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZQorIyB0byBnZW5lcmF0ZSBQREYgYW5kIERWSSBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlCisjIG5pY2VseSBmb3JtYXR0ZWQgc28gaXQgY2FuIGJlIHBhcnNlZCBieSBhIGh1bWFuIHJlYWRlci4KKyMgVGhpcyBpcyB1c2VmdWwKKyMgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLgorIyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhpcworIyB0YWcgaXMgc2V0IHRvIE5PIHRoZSBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIKKyMgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdCBqdXN0IHRoZSBzYW1lLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUKKyMgYXJlIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4KKyMgVGhpcyBpcyB1c2VmdWwgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lCisjIE1ha2VmaWxlIGRvbid0IG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGV2YWx1YXRlIGFsbCBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlCisjIGZpbGVzLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybworIyBuYW1lcyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgY29uZGl0aW9uYWwKKyMgY29tcGlsYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQKKyMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMKKyMgdGhlbiB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUKKyMgUFJFREVGSU5FRCBhbmQgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGUgaW5jbHVkZXMgZmlsZXMKKyMgcG9pbnRlZCB0byBieSBJTkNMVURFX1BBVEggd2lsbCBiZSBzZWFyY2hlZCB3aGVuIGEgI2luY2x1ZGUgaXMgZm91bmQuCisKK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKKworIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieQorIyB0aGUgcHJlcHJvY2Vzc29yLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0KKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwKKyMgYmUgdXNlZC4KKworSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9CisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdAorIyBhcmUgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YKKyMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZQorIyBvciBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgPSBhcmUKKyMgb21pdHRlZCA9MSBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nCisjIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3IKKyMgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKworUFJFREVGSU5FRCAgICAgICAgICAgICA9IF9fYXR0cmlidXRlX18oeCk9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2NwbHVzcGx1cworCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gYW5kIEVYUEFORF9PTkxZX1BSRURFRiB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgdGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YgbWFjcm8gbmFtZXMgdGhhdCBzaG91bGQgYmUgZXhwYW5kZWQuCisjIFRoZSBtYWNybyBkZWZpbml0aW9uIHRoYXQgaXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgd2lsbCBiZSB1c2VkLgorIyBVc2UgdGhlIFBSRURFRklORUQgdGFnIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBtYWNybyBkZWZpbml0aW9uIHRoYXQKKyMgb3ZlcnJ1bGVzIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIHRoZSBzb3VyY2UgY29kZS4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9CisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbgorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zCisjIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZSBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYQorIyBzZW1pY29sb24sIGJlY2F1c2UgdGhlc2Ugd2lsbCBjb25mdXNlIHRoZSBwYXJzZXIgaWYgbm90IHJlbW92ZWQuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZ2ZpbGVzLiBGb3IgZWFjaAorIyB0YWcgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUKKyMgZm9ybWF0IG9mIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6CisjCisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6CisjCisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KKyMgd2hlcmUgImxvYzEiIGFuZCAibG9jMiIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzCisjIG9yIFVSTHMuIE5vdGUgdGhhdCBlYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzCisjIE5PVCBpbmNsdWRlIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoCisjIGRveHlnZW4gaXMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KKworVEFHRklMRVMgICAgICAgICAgICAgICA9CisKKyMgV2hlbiBhIGZpbGUgbmFtZSBpcyBzcGVjaWZpZWQgYWZ0ZXIgR0VORVJBVEVfVEFHRklMRSwgZG94eWdlbiB3aWxsIGNyZWF0ZQorIyBhIHRhZyBmaWxlIHRoYXQgaXMgYmFzZWQgb24gdGhlIGlucHV0IGZpbGVzIGl0IHJlYWRzLgorCitHRU5FUkFURV9UQUdGSUxFICAgICAgID0KKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkCisjIGluIHRoZSBjbGFzcyBpbmRleC4gSWYgc2V0IHRvIE5PIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzCisjIHdpbGwgYmUgbGlzdGVkLgorCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQKKyMgaW4gdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwKKyMgYmUgbGlzdGVkLgorCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCisKKyMgVGhlIFBFUkxfUEFUSCBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHBlcmwgc2NyaXB0CisjIGludGVycHJldGVyIChpLmUuIHRoZSByZXN1bHQgb2YgYHdoaWNoIHBlcmwnKS4KKworUEVSTF9QQVRIICAgICAgICAgICAgICA9IC91c3IvYmluL3BlcmwKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYSBpbmhlcml0YW5jZSBkaWFncmFtIChpbiBIVE1MLCBSVEYgYW5kIExhVGVYKSBmb3IgY2xhc3NlcyB3aXRoIGJhc2UKKyMgb3Igc3VwZXIgY2xhc3Nlcy4gU2V0dGluZyB0aGUgdGFnIHRvIE5PIHR1cm5zIHRoZSBkaWFncmFtcyBvZmYuIE5vdGUgdGhhdAorIyB0aGlzIG9wdGlvbiBhbHNvIHdvcmtzIHdpdGggSEFWRV9ET1QgZGlzYWJsZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0bworIyBpbnN0YWxsIGFuZCB1c2UgZG90LCBzaW5jZSBpdCB5aWVsZHMgbW9yZSBwb3dlcmZ1bCBncmFwaHMuCisKK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBZRVMKKworIyBZb3UgY2FuIGRlZmluZSBtZXNzYWdlIHNlcXVlbmNlIGNoYXJ0cyB3aXRoaW4gZG94eWdlbiBjb21tZW50cyB1c2luZyB0aGUgXG1zYworIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWUKKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK01TQ0dFTl9QQVRIICAgICAgICAgICAgPQorCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlCisjIGluaGVyaXRhbmNlIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQKKyMgb3IgaXMgbm90IGEgY2xhc3MuCisKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6LCBhIGdyYXBoIHZpc3VhbGl6YXRpb24KKyMgdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudCBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbgorIyBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQorCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gJUhBVkVfRE9UCisKKyMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcworIyBhbGxvd2VkIHRvIHJ1biBpbiBwYXJhbGxlbC4gV2hlbiBzZXQgdG8gMCAodGhlIGRlZmF1bHQpIGRveHlnZW4gd2lsbAorIyBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdAorIyBleHBsaWNpdGx5IHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlCisjIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3Npbmcgc3BlZWQuCisKK0RPVF9OVU1fVEhSRUFEUyAgICAgICAgPSAwCisKKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdXNlIHRoZSBIZWx2ZXRpY2EgZm9udCBmb3IgYWxsIGRvdCBmaWxlcyB0aGF0CisjIGRveHlnZW4gZ2VuZXJhdGVzLiBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IHlvdSBjYW4gc3BlY2lmeQorIyB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZSBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQKKyMgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYSBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nCisjIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUKKyMgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuCisKK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBIZWx2ZXRpY2EKKworIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGZvbnQgb2YgZG90IGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgc2l6ZSBpcyAxMHB0LgorCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIEhlbHZldGljYSBmb250LgorIyBJZiB5b3Ugc3BlY2lmeSBhIGRpZmZlcmVudCBmb250IHVzaW5nIERPVF9GT05UTkFNRSB5b3UgY2FuIHVzZSBET1RfRk9OVFBBVEggdG8KKyMgc2V0IHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdC4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9CisKKyMgSWYgdGhlIENMQVNTX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kCisjIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4gU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUKKyMgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQKKyMgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24gZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZAorIyBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCisKKyMgSWYgdGhlIEdST1VQX0dSQVBIUyBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzCisKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZworIyBMYW5ndWFnZS4KKworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBlbmFibGVkLCB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzaG93biBpbnNpZGUKKyMgdGhlIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZQorIyBncmFwaCBtYXkgYmVjb21lIHRvbyBiaWcgdG8gYmUgdXNlZnVsLiBUaGUgVU1MX0xJTUlUX05VTV9GSUVMRFMKKyMgdGhyZXNob2xkIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHR5cGUgdG8gbWFrZSB0aGUgc2l6ZSBtb3JlCisjIG1hbmFnYWJsZS4gU2V0IHRoaXMgdG8gMCBmb3Igbm8gbGltaXQuIE5vdGUgdGhhdCB0aGUgdGhyZXNob2xkIG1heSBiZQorIyBleGNlZWRlZCBieSA1MCUgYmVmb3JlIHRoZSBsaW1pdCBpcyBlbmZvcmNlZC4KKworVU1MX0xJTUlUX05VTV9GSUVMRFMgICA9IDEwCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIgaW5zdGFuY2VzLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERV9HUkFQSCwgYW5kIEhBVkVfRE9UCisjIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkCisjIGZpbGUgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoCisjIG90aGVyIGRvY3VtZW50ZWQgZmlsZXMuCisKK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERURfQllfR1JBUEgsIGFuZAorIyBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2gKKyMgZG9jdW1lbnRlZCBoZWFkZXIgZmlsZSBzaG93aW5nIHRoZSBkb2N1bWVudGVkIGZpbGVzIHRoYXQgZGlyZWN0bHkgb3IKKyMgaW5kaXJlY3RseSBpbmNsdWRlIHRoaXMgZmlsZS4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIGFuZCBIQVZFX0RPVCBvcHRpb25zIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbCBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocworIyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4KKworQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBTExFUl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlciBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXIKKyMgZ3JhcGhzIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuCisKK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGhpY2FsIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKKworIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTCisjIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMKKyMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisKK0RJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBZRVMKKworIyBUaGUgRE9UX0lNQUdFX0ZPUk1BVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSBmb3JtYXQgb2YgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgYnkgZG90LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHN2ZywgcG5nLCBqcGcsIG9yIGdpZi4KKyMgSWYgbGVmdCBibGFuayBwbmcgd2lsbCBiZSB1c2VkLiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQKKyMgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlIHRoZSBTVkcgZmlsZXMKKyMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcyByZXF1aXJlbWVudCkuCisKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKKworIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8KKyMgZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3RpdmUgU1ZHIGltYWdlcyB0aGF0IGFsbG93IHpvb21pbmcgYW5kIHBhbm5pbmcuCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4KKyMgVGVzdGVkIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLiBGb3IgSUUgOSsgeW91CisjIG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzCisjIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0LgorCitJTlRFUkFDVElWRV9TVkcgICAgICAgID0gTk8KKworIyBUaGUgdGFnIERPVF9QQVRIIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorCitET1RfUEFUSCAgICAgICAgICAgICAgID0KKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGRvdGZpbGUgY29tbWFuZCkuCisKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPQorCisjIFRoZSBNU0NGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIG1zYyBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcbXNjZmlsZSBjb21tYW5kKS4KKworTVNDRklMRV9ESVJTICAgICAgICAgICA9CisKKyMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyMgbm9kZXMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoCisjIGJlY29tZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMKKyMgdmlzdWFsaXplZCBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlCisjIG51bWJlciBvZiBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4KKyMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZQorIyB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILgorCitET1RfR1JBUEhfTUFYX05PREVTICAgID0gMjAwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUKKyMgZ3JhcGhzIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlCisjIGZyb20gdGhlIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzCisjIHRoYXQgbGF5IGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcworIyBvcHRpb24gdG8gMSBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlCisjIGNvZGUgYmFzZXMuIEFsc28gbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisKK01BWF9ET1RfR1JBUEhfREVQVEggICAgPSAyCisKKyMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50CisjIGJhY2tncm91bmQuIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBkb3Qgb24gV2luZG93cyBkb2VzIG5vdAorIyBzZWVtIHRvIHN1cHBvcnQgdGhpcyBvdXQgb2YgdGhlIGJveC4gV2FybmluZzogRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB1c2VkLAorIyBlbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgbGVhZCB0byBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZgorIyBhIGdyYXBoIChpLmUuIHRoZXkgYmVjb21lIGhhcmQgdG8gcmVhZCkuCisKK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgRE9UX01VTFRJX1RBUkdFVFMgdGFnIHRvIFlFUyBhbGxvdyBkb3QgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgb3V0cHV0CisjIGZpbGVzIGluIG9uZSBydW4gKGkuZS4gbXVsdGlwbGUgLW8gYW5kIC1UIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZSkuIFRoaXMKKyMgbWFrZXMgZG90IHJ1biBmYXN0ZXIsIGJ1dCBzaW5jZSBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIGRvdCAoPjEuOC4xMCkKKyMgc3VwcG9ydCB0aGlzLCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKworRE9UX01VTFRJX1RBUkdFVFMgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xFR0VORCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kCisjIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZCBncmFwaHMuCisKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90IGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUKKyMgdGhlIHZhcmlvdXMgZ3JhcGhzLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9kb3h5Z2VuL2JhbF9wdWJsaWMuZG94eSBiL2JhbF9yZWxlYXNlL2RveHlnZW4vYmFsX3B1YmxpYy5kb3h5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYmUzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL2JhbF9wdWJsaWMuZG94eQpAQCAtMCwwICsxLDE4MjggQEAKKyMgRG94eWZpbGUgMS44LjIKKworIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4KKyMgVGhlIGZvcm1hdCBpczoKKyMgICAgICAgVEFHID0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIEZvciBsaXN0cyBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKKyMgICAgICAgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzICgiICIpLgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBjb25maWcgZmlsZQorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsCisjIHRleHQgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgdGFnLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZQorIyBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZQorIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KKworRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3Igc2VxdWVuY2Ugb2Ygd29yZHMpIHRoYXQgc2hvdWxkCisjIGlkZW50aWZ5IHRoZSBwcm9qZWN0LiBOb3RlIHRoYXQgaWYgeW91IGRvIG5vdCB1c2UgRG94eXdpemFyZCB5b3UgbmVlZAorIyB0byBwdXQgcXVvdGVzIGFyb3VuZCB0aGUgcHJvamVjdCBuYW1lIGlmIGl0IGNvbnRhaW5zIHNwYWNlcy4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9ICJCcm9hZGJhbmQgQWRhcHRpb24gTGF5ZXIiCisKKyMgVGhlIFBST0pFQ1RfTlVNQkVSIHRhZyBjYW4gYmUgdXNlZCB0byBlbnRlciBhIHByb2plY3Qgb3IgcmV2aXNpb24gbnVtYmVyLgorIyBUaGlzIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yCisjIGlmIHNvbWUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBpcyB1c2VkLgorCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0gJVBST0pFQ1RfTlVNQkVSCisKKyMgVXNpbmcgdGhlIFBST0pFQ1RfQlJJRUYgdGFnIG9uZSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbCBvbmUgbGluZSBkZXNjcmlwdGlvbgorIyBmb3IgYSBwcm9qZWN0IHRoYXQgYXBwZWFycyBhdCB0aGUgdG9wIG9mIGVhY2ggcGFnZSBhbmQgc2hvdWxkIGdpdmUgdmlld2VyCisjIGEgcXVpY2sgaWRlYSBhYm91dCB0aGUgcHVycG9zZSBvZiB0aGUgcHJvamVjdC4gS2VlcCB0aGUgZGVzY3JpcHRpb24gc2hvcnQuCisKK1BST0pFQ1RfQlJJRUYgICAgICAgICAgPQorCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGFuIGxvZ28gb3IgaWNvbiB0aGF0IGlzCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIGxvZ28gc2hvdWxkIG5vdAorIyBleGNlZWQgNTUgcGl4ZWxzIGFuZCB0aGUgbWF4aW11bSB3aWR0aCBzaG91bGQgbm90IGV4Y2VlZCAyMDAgcGl4ZWxzLgorIyBEb3h5Z2VuIHdpbGwgY29weSB0aGUgbG9nbyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKworUFJPSkVDVF9MT0dPICAgICAgICAgICA9ICIlU1JDX0RJUi8uLi9kb3h5Z2VuL2Jyb2FkY29tLnBuZyIKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpCisjIGJhc2UgcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbgorIyB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZiBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCisKK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSAlT1VUX0RPQ1NfRElSCisKKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUKKyMgNDA5NiBzdWItZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dAorIyBmb3JtYXQgYW5kIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuCisjIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZgorIyBzb3VyY2UgZmlsZXMsIHdoZXJlIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQKKyMgb3RoZXJ3aXNlIGNhdXNlIHBlcmZvcm1hbmNlIHByb2JsZW1zIGZvciB0aGUgZmlsZSBzeXN0ZW0uCisKK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTworCisjIFRoZSBPVVRQVVRfTEFOR1VBR0UgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggYWxsCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaXMgd3JpdHRlbi4gRG94eWdlbiB3aWxsIHVzZSB0aGlzCisjIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGFsbCBjb25zdGFudCBvdXRwdXQgaW4gdGhlIHByb3BlciBsYW5ndWFnZS4KKyMgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgRW5nbGlzaCwgb3RoZXIgc3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6CisjIEFmcmlrYWFucywgQXJhYmljLCBCcmF6aWxpYW4sIENhdGFsYW4sIENoaW5lc2UsIENoaW5lc2UtVHJhZGl0aW9uYWwsCisjIENyb2F0aWFuLCBDemVjaCwgRGFuaXNoLCBEdXRjaCwgRXNwZXJhbnRvLCBGYXJzaSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sCisjIEdyZWVrLCBIdW5nYXJpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoCisjIG1lc3NhZ2VzKSwgS29yZWFuLCBLb3JlYW4tZW4sIExpdGh1YW5pYW4sIE5vcndlZ2lhbiwgTWFjZWRvbmlhbiwgUGVyc2lhbiwKKyMgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLAorIyBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBVa3JhaW5pYW4sIGFuZCBWaWV0bmFtZXNlLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBpbmNsdWRlIGJyaWVmIG1lbWJlciBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluCisjIHRoZSBmaWxlIGFuZCBjbGFzcyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFEb2MpLgorIyBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCBwcmVwZW5kCisjIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLgorIyBOb3RlOiBpZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvcgorIyB0aGF0IGlzIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZworIyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlCisjIHN0cmlwcGVkIGZyb20gdGhlIHRleHQgYW5kIHRoZSByZXN1bHQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGlzdCwgaXMKKyMgdXNlZCBhcyB0aGUgYW5ub3RhdGVkIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuCisjIElmIGxlZnQgYmxhbmssIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkICgiJG5hbWUiIGlzIGF1dG9tYXRpY2FsbHkKKyMgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZW50aXR5KTogIlRoZSAkbmFtZSBjbGFzcyIgIlRoZSAkbmFtZSB3aWRnZXQiCisjICJUaGUgJG5hbWUgZmlsZSIgImlzIiAicHJvdmlkZXMiICJzcGVjaWZpZXMiICJjb250YWlucyIKKyMgInJlcHJlc2VudHMiICJhIiAiYW4iICJ0aGUiCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPQorCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KKyMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZgorIyBkZXNjcmlwdGlvbi4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKworSU5MSU5FX0lOSEVSSVRFRF9NRU1CICA9IE5PCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsCisjIHBhdGggYmVmb3JlIGZpbGVzIG5hbWUgaW4gdGhlIGZpbGUgbGlzdCBhbmQgaW4gdGhlIGhlYWRlciBmaWxlcy4gSWYgc2V0CisjIHRvIE5PIHRoZSBzaG9ydGVzdCBwYXRoIHRoYXQgbWFrZXMgdGhlIGZpbGUgbmFtZSB1bmlxdWUgd2lsbCBiZSB1c2VkLgorCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gTk8KKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIFNUUklQX0ZST01fUEFUSCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4gU3RyaXBwaW5nIGlzCisjIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZCBwYXJ0IG9mCisjIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUKKyMgcGF0aCB0byBzdHJpcC4gTm90ZSB0aGF0IHlvdSBzcGVjaWZ5IGFic29sdXRlIHBhdGhzIGhlcmUsIGJ1dCBhbHNvCisjIHJlbGF0aXZlIHBhdGhzLCB3aGljaCB3aWxsIGJlIHJlbGF0aXZlIGZyb20gdGhlIGRpcmVjdG9yeSB3aGVyZSBkb3h5Z2VuIGlzCisjIHN0YXJ0ZWQuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPQorCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mCisjIHRoZSBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscworIyB0aGUgcmVhZGVyIHdoaWNoIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuCisjIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MKKyMgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZCBzcGVjaWZ5IHRoZSBpbmNsdWRlIHBhdGhzIHRoYXQKKyMgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPQorCisjIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlcgorIyAoYnV0IGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3VyIGZpbGUgc3lzdGVtCisjIGRvZXNuJ3Qgc3VwcG9ydCBsb25nIG5hbWVzIGxpa2Ugb24gRE9TLCBNYWMsIG9yIENELVJPTS4KKworU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbgorIyB3aWxsIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhRG9jLXN0eWxlCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhRG9jCisjIGNvbW1lbnRzIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzCisjICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsCisjIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgY29tbWVudHMKKyMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nCisjIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgRG94eWdlbgorIyB0cmVhdCBhIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8KKyMgY29tbWVudHMpIGFzIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuCisjIFRoZSBuZXcgZGVmYXVsdCBpcyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZAorIyBkZXNjcmlwdGlvbi4gU2V0IHRoaXMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3VyIGluc3RlYWQuCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGFuIHVuZG9jdW1lbnRlZAorIyBtZW1iZXIgaW5oZXJpdHMgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdAorIyByZS1pbXBsZW1lbnRzLgorCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZQorIyBhIG5ldyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsCisjIGJlIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLgorIyBEb3h5Z2VuIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gNAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMKKyMgYXMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuCisjIEZvciBleGFtcGxlIGFkZGluZyAic2lkZWVmZmVjdD1ccGFyIFNpZGUgRWZmZWN0czpcbiIgd2lsbCBhbGxvdyB5b3UgdG8KKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoCisjIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcgIlNpZGUgRWZmZWN0czoiLgorIyBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydCBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9ICJUQUJMRV9IRFIyezJ9PTx0cj48dGg+XDE8L3RoPjx0aD5cMjwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XMnsyfT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX0hEUjN7M309PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48dGg+XDM8L3RoPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX1JPVzN7M309PHRyPjx0ZD5cMTwvdGQ+PHRkPlwyPC90ZD48dGQ+XDM8L3RkPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX0hEUjR7NH09PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48dGg+XDM8L3RoPjx0aD5cNDwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XNHs0fT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjx0ZD5cMzwvdGQ+PHRkPlw0PC90ZD48L3RyPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUQUJMRV9IRFI1ezV9PTx0cj48dGg+XDE8L3RoPjx0aD5cMjwvdGg+PHRoPlwzPC90aD48dGg+XDQ8L3RoPjx0aD5cNTwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XNXs1fT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjx0ZD5cMzwvdGQ+PHRkPlw0PC90ZD48dGQ+XDU8L3RkPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX0hEUjZ7Nn09PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48dGg+XDM8L3RoPjx0aD5cNDwvdGg+PHRoPlw1PC90aD48dGg+XDY8L3RoPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX1JPVzZ7Nn09PHRyPjx0ZD5cMTwvdGQ+PHRkPlwyPC90ZD48dGQ+XDM8L3RkPjx0ZD5cNDwvdGQ+PHRkPlw1PC90ZD48dGQ+XDY8L3RkPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX0hEUjd7N309PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48dGg+XDM8L3RoPjx0aD5cNDwvdGg+PHRoPlw1PC90aD48dGg+XDY8L3RoPjx0aD5cNzwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XN3s3fT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjx0ZD5cMzwvdGQ+PHRkPlw0PC90ZD48dGQ+XDU8L3RkPjx0ZD5cNjwvdGQ+PHRkPlw3PC90ZD48L3RyPiIKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nCisjICJjbGFzcz1pdGNsOjpjbGFzcyIgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZQorIyBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4KKyMgRm9yIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdAorIyBvZiBhbGwgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IFlFUworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0pBVkEgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgSmF2YQorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yCisjIEphdmEuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywgcXVhbGlmaWVkCisjIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisKK09QVElNSVpFX09VVFBVVF9KQVZBICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfRk9SX0ZPUlRSQU4gdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgRm9ydHJhbgorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yCisjIEZvcnRyYW4uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IKKyMgVkhETC4KKworT1BUSU1JWkVfT1VUUFVUX1ZIREwgICA9IE5PCisKKyMgRG94eWdlbiBzZWxlY3RzIHRoZSBwYXJzZXIgdG8gdXNlIGRlcGVuZGluZyBvbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlcyBpdAorIyBwYXJzZXMuIFdpdGggdGhpcyB0YWcgeW91IGNhbiBhc3NpZ24gd2hpY2ggcGFyc2VyIHRvIHVzZSBmb3IgYSBnaXZlbgorIyBleHRlbnNpb24uIERveHlnZW4gaGFzIGEgYnVpbHQtaW4gbWFwcGluZywgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgb3IgZXh0ZW5kIGl0CisjIHVzaW5nIHRoaXMgdGFnLiBUaGUgZm9ybWF0IGlzIGV4dD1sYW5ndWFnZSwgd2hlcmUgZXh0IGlzIGEgZmlsZSBleHRlbnNpb24sCisjIGFuZCBsYW5ndWFnZSBpcyBvbmUgb2YgdGhlIHBhcnNlcnMgc3VwcG9ydGVkIGJ5IGRveHlnZW46IElETCwgSmF2YSwKKyMgSmF2YXNjcmlwdCwgQ1NoYXJwLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiwgVkhETCwgQywKKyMgQysrLiBGb3IgaW5zdGFuY2UgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IC5pbmMgZmlsZXMgYXMgRm9ydHJhbiBmaWxlcyAoZGVmYXVsdAorIyBpcyBQSFApLCBhbmQgLmYgZmlsZXMgYXMgQyAoZGVmYXVsdCBpcyBGb3J0cmFuKSwgdXNlOiBpbmM9Rm9ydHJhbiBmPUMuIE5vdGUKKyMgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UgdGhlCisjIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0KKworIyBJZiBNQVJLRE9XTl9TVVBQT1JUIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwKKyMgY29tbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuCisjIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UKKyMgY2FuIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4KKyMgRGlzYWJsZSBvbmx5IGluIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4KKworTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUworCisjIFdoZW4gZW5hYmxlZCBkb3h5Z2VuIHRyaWVzIHRvIGxpbmsgd29yZHMgdGhhdCBjb3JyZXNwb25kIHRvIGRvY3VtZW50ZWQgY2xhc3NlcywKKyMgb3IgbmFtZXNwYWNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uIFN1Y2ggYSBsaW5rIGNhbiBiZQorIyBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkIG9yCisjIGdsb2JhbGx5IGJ5IHNldHRpbmcgQVVUT0xJTktfU1VQUE9SVCB0byBOTy4KKworQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUworCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQKKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkCisjIHNldCB0aGlzIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7IHYucy4KKyMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZXMgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uCisjIGRpYWdyYW1zIHRoYXQgaW52b2x2ZSBTVEwgY2xhc3NlcyBtb3JlIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZS4KKworQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PCisKKyMgSWYgeW91IHVzZSBNaWNyb3NvZnQncyBDKysvQ0xJIGxhbmd1YWdlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8KKyMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4KKworQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgc291cmNlcyBvbmx5LgorIyBEb3h5Z2VuIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMKKyMgaW5zdGVhZCBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCisKK1NJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTworCisjIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0byBpbmRpY2F0ZSBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBhIHByb3BlcnR5LiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgbWFrZSBkb3h5Z2VuIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3Igc2V0dGluZyBhIHNpbXBsZSB0eXBlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCisKKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQworIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0CisjIG1lbWJlciBpbiB0aGUgZ3JvdXAgKGlmIGFueSkgZm9yIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZSBncm91cC4gQnkgZGVmYXVsdAorIyBhbGwgbWVtYmVycyBvZiBhIGdyb3VwIG11c3QgYmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5LgorCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KKworIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mCisjIHRoZSBzYW1lIHR5cGUgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhCisjIHN1Ymdyb3VwIG9mIHRoYXQgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvCisjIE5PIHRvIHByZXZlbnQgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nCisjIHRoZSBcbm9zdWJncm91cGluZyBjb21tYW5kLgorCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiB0aGUgSU5MSU5FX0dST1VQRURfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3Nlcywgc3RydWN0cyBhbmQKKyMgdW5pb25zIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nCisjIEBpbmdyb3VwKSBpbnN0ZWFkIG9mIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbiBwYWdlcykgb3IKKyMgc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KKworIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZAorIyB1bmlvbnMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyB3aWxsIGJlIHNob3duIGlubGluZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyBvZiB0aGUgc2NvcGUgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZCAoaS5lLiBmaWxlLCBuYW1lc3BhY2UsIG9yIGdyb3VwCisjIGRvY3VtZW50YXRpb24pLCBwcm92aWRlZCB0aGlzIHNjb3BlIGlzIGRvY3VtZW50ZWQuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpLAorIyBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zIGFyZSBzaG93biBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4KKyMgcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4KKworSU5MSU5FX1NJTVBMRV9TVFJVQ1RTICA9IE5PCisKKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtCisjIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbworIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QKKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5CisjIGJlIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKworVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IE5PCisKKyMgVGhlIFNZTUJPTF9DQUNIRV9TSVpFIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGNhY2hlIHVzZSB0bworIyBkZXRlcm1pbmUgd2hpY2ggc3ltYm9scyB0byBrZWVwIGluIG1lbW9yeSBhbmQgd2hpY2ggdG8gZmx1c2ggdG8gZGlzay4KKyMgV2hlbiB0aGUgY2FjaGUgaXMgZnVsbCwgbGVzcyBvZnRlbiB1c2VkIHN5bWJvbHMgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2suCisjIEZvciBzbWFsbCB0byBtZWRpdW0gc2l6ZSBwcm9qZWN0cyAoPDEwMDAgaW5wdXQgZmlsZXMpIHRoZSBkZWZhdWx0IHZhbHVlIGlzCisjIHByb2JhYmx5IGdvb2QgZW5vdWdoLiBGb3IgbGFyZ2VyIHByb2plY3RzIGEgdG9vIHNtYWxsIGNhY2hlIHNpemUgY2FuIGNhdXNlCisjIGRveHlnZW4gdG8gYmUgYnVzeSBzd2FwcGluZyBzeW1ib2xzIHRvIGFuZCBmcm9tIGRpc2sgbW9zdCBvZiB0aGUgdGltZQorIyBjYXVzaW5nIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgcGVuYWx0eS4KKyMgSWYgdGhlIHN5c3RlbSBoYXMgZW5vdWdoIHBoeXNpY2FsIG1lbW9yeSBpbmNyZWFzaW5nIHRoZSBjYWNoZSB3aWxsIGltcHJvdmUgdGhlCisjIHBlcmZvcm1hbmNlIGJ5IGtlZXBpbmcgbW9yZSBzeW1ib2xzIGluIG1lbW9yeS4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB3b3JrcyBvbgorIyBhIGxvZ2FyaXRobWljIHNjYWxlIHNvIGluY3JlYXNpbmcgdGhlIHNpemUgYnkgb25lIHdpbGwgcm91Z2hseSBkb3VibGUgdGhlCisjIG1lbW9yeSB1c2FnZS4gVGhlIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcyBmb3JtdWxhOgorIyAyXigxNitTWU1CT0xfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLAorIyBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2ID0gNjU1MzYgc3ltYm9scy4KKworI1NZTUJPTF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMgU2ltaWxhciB0byB0aGUgU1lNQk9MX0NBQ0hFX1NJWkUgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlCisjIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbgorIyB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZQorIyBzYW1lIHN5bWJvbCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlIGNvZGUsIGRveHlnZW4ga2VlcHMgYSBjYWNoZSBvZgorIyBwcmUtcmVzb2x2ZWQgc3ltYm9scy4gSWYgdGhlIGNhY2hlIGlzIHRvbyBzbWFsbCBkb3h5Z2VuIHdpbGwgYmVjb21lIHNsb3dlci4KKyMgSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcworIyBmb3JtdWxhOiAyXigxNitMT09LVVBfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLAorIyBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2ID0gNjU1MzYgc3ltYm9scy4KKworTE9PS1VQX0NBQ0hFX1NJWkUgICAgICA9IDEKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbgorIyBkb2N1bWVudGF0aW9uIGFyZSBkb2N1bWVudGVkLCBldmVuIGlmIG5vIGRvY3VtZW50YXRpb24gd2FzIGF2YWlsYWJsZS4KKyMgUHJpdmF0ZSBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcworIyB0aGUgRVhUUkFDVF9QUklWQVRFIGFuZCBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1BSSVZBVEUgdGFnIGlzIHNldCB0byBZRVMgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1BBQ0tBR0UgdGFnIGlzIHNldCB0byBZRVMgYWxsIG1lbWJlcnMgd2l0aCBwYWNrYWdlIG9yIGludGVybmFsCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0VYVFJBQ1RfUEFDS0FHRSAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMgY2xhc3NlcyAoYW5kIHN0cnVjdHMpCisjIGRlZmluZWQgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgSWYgc2V0IHRvIE5PIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBOTworCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gV2hlbiBzZXQgdG8gWUVTIGxvY2FsCisjIG1ldGhvZHMsIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzZWN0aW9uIGJ1dCBub3QgaW4KKyMgdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZC4KKworRVhUUkFDVF9MT0NBTF9NRVRIT0RTICA9IE5PCisKKyMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBZRVMsIHRoZSBtZW1iZXJzIG9mIGFub255bW91cyBuYW1lc3BhY2VzIHdpbGwgYmUKKyMgZXh0cmFjdGVkIGFuZCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBuYW1lc3BhY2UgY2FsbGVkCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UKKyMgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0CisjIGFub255bW91cyBuYW1lc3BhY2VzIGFyZSBoaWRkZW4uCisKK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBvZiBkb2N1bWVudGVkIGNsYXNzZXMsIGZpbGVzIG9yIG5hbWVzcGFjZXMuCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKKyMgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLgorIyBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisKK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBZRVMKKworIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMKKyMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisKK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBZRVMKKworIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgZnJpZW5kIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uCisKK0hJREVfRlJJRU5EX0NPTVBPVU5EUyAgPSBOTworCisjIElmIHRoZSBISURFX0lOX0JPRFlfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYW55CisjIGRvY3VtZW50YXRpb24gYmxvY2tzIGZvdW5kIGluc2lkZSB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uLgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUKKyMgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLgorCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8KKworIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uCisjIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYSBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQKKyMgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIHRoZSBkb2N1bWVudGF0aW9uIHdpbGwgYmUgZXhjbHVkZWQuCisjIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KKworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIERveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlCisjIGZpbGUgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbworIyBhbGxvd2VkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjbGFzc2VzIG9yIGZpbGVzIHdob3NlIG5hbWVzIG9ubHkgZGlmZmVyCisjIGluIGNhc2UgYW5kIGlmIHlvdXIgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgY2FzZSBzZW5zaXRpdmUgZmlsZSBuYW1lcy4gV2luZG93cworIyBhbmQgTWFjIHVzZXJzIGFyZSBhZHZpc2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IFlFUworCisjIElmIHRoZSBISURFX1NDT1BFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KKyMgd2lsbCBzaG93IG1lbWJlcnMgd2l0aCB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZSBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbgorIyB3aWxsIHB1dCBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyBvZiB0aGF0IGZpbGUuCisKK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKKworIyBJZiB0aGUgRk9SQ0VfTE9DQUxfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuCisjIHdpbGwgbGlzdCBpbmNsdWRlIGZpbGVzIHdpdGggZG91YmxlIHF1b3RlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyByYXRoZXIgdGhhbiB3aXRoIHNoYXJwIGJyYWNrZXRzLgorCitGT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGEgdGFnIFtpbmxpbmVdCisjIGlzIGluc2VydGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4KKworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuCisjIHdpbGwgc29ydCB0aGUgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMKKyMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbgorIyBkZWNsYXJhdGlvbiBvcmRlci4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyBicmllZiBkb2N1bWVudGF0aW9uIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseQorIyBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4KKyMgZGVjbGFyYXRpb24gb3JkZXIuCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIHNvcnQgdGhlIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0CisjIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkKKyMgdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieQorIyBTT1JUX01FTUJFUl9ET0NTIGFuZCBTT1JUX0JSSUVGX0RPQ1MuCisjIFRoaXMgdGFnIHdpbGwgYmUgaWdub3JlZCBmb3IgYnJpZWYgZG9jcyBpZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PCisjIGFuZCBpZ25vcmVkIGZvciBkZXRhaWxlZCBkb2NzIGlmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PLgorCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8KKworIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyBoaWVyYXJjaHkgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpCisjIHRoZSBncm91cCBuYW1lcyB3aWxsIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLgorCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlCisjIHNvcnRlZCBieSBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8KKyMgTk8gKHRoZSBkZWZhdWx0KSwgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLAorIyBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4KKyMgTm90ZTogVGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsIGlmIEhJREVfU0NPUEVfTkFNRVMgaXMgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlCisjIGFscGhhYmV0aWNhbCBsaXN0LgorCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KKworIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvCisjIGRvIHByb3BlciB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhCisjIG1hdGNoIGJldHdlZW4gdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4KKyMgaWYgdGhlcmUgaXMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZQorIyBieSBkb2luZyBhIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbgorIyB3aWxsIHN0aWxsIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgorCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcgorIyBkaXNhYmxlIChOTykgdGhlIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbworIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0IGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QKKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBOTworCisjIFRoZSBHRU5FUkFURV9CVUdMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSBidWcgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcYnVnCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcKKyMgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMKKworIyBUaGUgRU5BQkxFRF9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsCisjIGRvY3VtZW50YXRpb24gc2VjdGlvbnMsIG1hcmtlZCBieSBcaWYgc2VjdGlvbm5hbWUgLi4uIFxlbmRpZi4KKworRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9CisKKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMKKyMgdGhlIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyBjb25zaXN0cyBvZiBmb3IgaXQgdG8gYXBwZWFyIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZAorIyBoZXJlIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuCisjIFRoZSBhcHBlYXJhbmNlIG9mIHRoZSBpbml0aWFsaXplciBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplcgorIyBjb21tYW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQKKyMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBOTworCisjIFNldCB0aGUgU0hPV19GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRmlsZXMgcGFnZS4KKyMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgRmlsZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlCisjIE5hbWVzcGFjZXMgcGFnZS4KKyMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleAorIyBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLgorCitTSE9XX05BTUVTUEFDRVMgICAgICAgID0gWUVTCisKKyMgVGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIG9yIHNjcmlwdCB0aGF0CisjIGRveHlnZW4gc2hvdWxkIGludm9rZSB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBmb3IgZWFjaCBmaWxlICh0eXBpY2FsbHkgZnJvbQorIyB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSkuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIHByb2dyYW0gYnkgZXhlY3V0aW5nICh2aWEKKyMgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGNvbW1hbmQ+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGNvbW1hbmQ+IGlzIHRoZSB2YWx1ZSBvZgorIyB0aGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZQorIyBwcm92aWRlZCBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0CisjIGlzIHVzZWQgYXMgdGhlIGZpbGUgdmVyc2lvbi4gU2VlIHRoZSBtYW51YWwgZm9yIGV4YW1wbGVzLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0KKworIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZAorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZAorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUKKyMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLgorIyBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkCisjIERveHlnZW5MYXlvdXQueG1sIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuCisKK0xBWU9VVF9GSUxFICAgICAgICAgICAgPSAlU1JDX0RJUi8uLi9kb3h5Z2VuL0RveHlnZW5MYXlvdXQueG1sCisKKworIyBUaGUgQ0lURV9CSUJfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgYmliIGZpbGVzCisjIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgZGF0YS4gVGhpcyBtdXN0IGJlIGEgbGlzdCBvZiAuYmliIGZpbGVzLiBUaGUKKyMgLmJpYiBleHRlbnNpb24gaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZCBpZiBvbWl0dGVkLiBVc2luZyB0aGlzIGNvbW1hbmQKKyMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28KKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4gRm9yIExhVGVYIHRoZSBzdHlsZQorIyBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMKKyMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZSBzZWFyY2ggcGF0aC4KKworQ0lURV9CSUJfRklMRVMgICAgICAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQKKyMgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuCisKK1FVSUVUICAgICAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBXQVJOSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBhcmUKKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuaworIyBOTyBpcyB1c2VkLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgV0FSTl9JRl9VTkRPQ1VNRU5URUQgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MKKyMgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnIHdpbGwKKyMgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4KKworV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IE5PCisKKyMgSWYgV0FSTl9JRl9ET0NfRVJST1IgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcgorIyBwb3RlbnRpYWwgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uLCBzdWNoIGFzIG5vdCBkb2N1bWVudGluZyBzb21lCisjIHBhcmFtZXRlcnMgaW4gYSBkb2N1bWVudGVkIGZ1bmN0aW9uLCBvciBkb2N1bWVudGluZyBwYXJhbWV0ZXJzIHRoYXQKKyMgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGUgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGVuYWJsZWQgdG8gZ2V0IHdhcm5pbmdzIGZvcgorIyBmdW5jdGlvbnMgdGhhdCBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycworIyBvciByZXR1cm4gdmFsdWUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIGRveHlnZW4gd2lsbCBvbmx5IHdhcm4gYWJvdXQKKyMgd3Jvbmcgb3IgaW5jb21wbGV0ZSBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbiwgYnV0IG5vdCBhYm91dCB0aGUgYWJzZW5jZSBvZgorIyBkb2N1bWVudGF0aW9uLgorCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gWUVTCisKKyMgVGhlIFdBUk5fRk9STUFUIHRhZyBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdAorIyBkb3h5Z2VuIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dAorIyB0YWdzLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBmaWxlIGFuZCBsaW5lIG51bWJlciBmcm9tIHdoaWNoIHRoZQorIyB3YXJuaW5nIG9yaWdpbmF0ZWQgYW5kIHRoZSB3YXJuaW5nIHRleHQuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgY29udGFpbgorIyAkdmVyc2lvbiwgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdmVyc2lvbiBvZiB0aGUgZmlsZSAoaWYgaXQgY291bGQKKyMgYmUgb2J0YWluZWQgdmlhIEZJTEVfVkVSU0lPTl9GSUxURVIpCisKK1dBUk5fRk9STUFUICAgICAgICAgICAgPSAiJGZpbGU6JGxpbmU6ICR0ZXh0IgorCisjIFRoZSBXQVJOX0xPR0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHRvIHdoaWNoIHdhcm5pbmcKKyMgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbgorIyB0byBzdGRlcnIuCisKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBJTlBVVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbgorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgIm15ZmlsZS5jcHAiIG9yCisjIGRpcmVjdG9yaWVzIGxpa2UgIi91c3Ivc3JjL215cHJvamVjdCIuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcworIyB3aXRoIHNwYWNlcy4KKworSU5QVVQgICAgICAgICAgICAgICAgICA9ICVTUkNfRElSL2xpYi9saWJiYWxhcGkvYmFsX2FwaS5kb3ggXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL2xpYi9saWJiYWxhcGkvYmFsX2FwaS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlTU9ERUxfRElSL21vZGVsLmRveCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvY29tbW9uL2luY2x1ZGUvYmFsX29iai5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9jb21tb24vaW5jbHVkZS9iYWxfb2Jqcy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlTU9ERUxfRElSL2JhbF9tb2RlbF9pZHMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJU1PREVMX0RJUi9iYWxfbW9kZWxfdHlwZXMuaAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzCisjIHRoYXQgZG94eWdlbiBwYXJzZXMuIEludGVybmFsbHkgZG94eWdlbiB1c2VzIHRoZSBVVEYtOCBlbmNvZGluZywgd2hpY2ggaXMKKyMgYWxzbyB0aGUgZGVmYXVsdCBpbnB1dCBlbmNvZGluZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQKKyMgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvcgorIyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisKK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQKKyMgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOgorIyAqLmMgKi5jYyAqLmN4eCAqLmNwcCAqLmMrKyAqLmQgKi5qYXZhICouaWkgKi5peHggKi5pcHAgKi5pKysgKi5pbmwgKi5oICouaGgKKyMgKi5oeHggKi5ocHAgKi5oKysgKi5pZGwgKi5vZGwgKi5jcyAqLnBocCAqLnBocDMgKi5pbmMgKi5tICoubW0gKi5kb3ggKi5weQorIyAqLmY5MCAqLmYgKi5mb3IgKi52aGQgKi52aGRsCisKK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPSAqLmMgKi5oICouY3BwCisKKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzCisjIHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLgorIyBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUKKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLgorCitFWENMVURFICAgICAgICAgICAgICAgID0KKworIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkCisjIGZyb20gdGhlIGlucHV0LgorCitFWENMVURFX1NZTUxJTktTICAgICAgID0gTk8KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZQorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkCisjIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0byBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzCisjIGZvciBleGFtcGxlIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gKi90ZXN0LyogXAorICAgICAgICAgICAgICAgICAgICAgICAgICpFeGFtcGxlcyoKKworIyBUaGUgRVhDTFVERV9TWU1CT0xTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHN5bWJvbCBuYW1lcworIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQorIyBvdXRwdXQuIFRoZSBzeW1ib2wgbmFtZSBjYW4gYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYSB3b3JkLCBvciBpZiB0aGUKKyMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywKKyMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdAorCitFWENMVURFX1NZTUJPTFMgICAgICAgID0KKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUKKyMgdGhlIFxpbmNsdWRlIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAKKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdAorIyBibGFuayBhbGwgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0KKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZQorIyBjb21tYW5kcyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCisKKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGltYWdlIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUKKyMgdGhlIFxpbWFnZSBjb21tYW5kKS4KKworSU1BR0VfUEFUSCAgICAgICAgICAgICA9CisKKyMgVGhlIElOUFVUX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gdGhhdCBkb3h5Z2VuIHNob3VsZAorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxmaWx0ZXI+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGZpbHRlcj4KKyMgaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuCisjIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlciBwcm9ncmFtIHdyaXRlcworIyB0byBzdGFuZGFyZCBvdXRwdXQuCisjIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnIHdpbGwgYmUKKyMgaWdub3JlZC4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9CisKKyMgVGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWx0ZXJzIG9uIGEgcGVyIGZpbGUgcGF0dGVybgorIyBiYXNpcy4KKyMgRG94eWdlbiB3aWxsIGNvbXBhcmUgdGhlIGZpbGUgbmFtZSB3aXRoIGVhY2ggcGF0dGVybiBhbmQgYXBwbHkgdGhlCisjIGZpbHRlciBpZiB0aGVyZSBpcyBhIG1hdGNoLgorIyBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOgorIyBwYXR0ZXJuPWZpbHRlciAobGlrZSAqLmNwcD1teV9jcHBfZmlsdGVyKS4gU2VlIElOUFVUX0ZJTFRFUiBmb3IgZnVydGhlcgorIyBpbmZvIG9uIGhvdyBmaWx0ZXJzIGFyZSB1c2VkLiBJZiBGSUxURVJfUEFUVEVSTlMgaXMgZW1wdHkgb3IgaWYKKyMgbm9uIG9mIHRoZSBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4KKworRklMVEVSX1BBVFRFUk5TICAgICAgICA9CisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIpIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGlucHV0IGZpbGVzIHdoZW4gcHJvZHVjaW5nIHNvdXJjZQorIyBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCisKKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpCisjIGFuZCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuCisjIHVzaW5nICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLiBUaGlzIG9wdGlvbiBvbmx5IGhhcyBlZmZlY3Qgd2hlbgorIyBGSUxURVJfU09VUkNFX0ZJTEVTIGlzIGVuYWJsZWQuCisKK0ZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbAorIyBiZSBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4KKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSBhbHNvCisjIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keQorIyBvZiBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgZGlyZWN0bHkgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTworCisjIFNldHRpbmcgdGhlIFNUUklQX0NPREVfQ09NTUVOVFMgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgaW5zdHJ1Y3QKKyMgZG94eWdlbiB0byBoaWRlIGFueSBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlCisjIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMKKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkCisjIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMKKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzCisjIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTworCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkKKyMgYW5kIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20KKyMgZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbAorIyBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4KKyMgT3RoZXJ3aXNlIHRoZXkgd2lsbCBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLgorCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCisKKyMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlCisjIHdpbGwgcG9pbnQgdG8gdGhlIEhUTUwgZ2VuZXJhdGVkIGJ5IHRoZSBodGFncygxKSB0b29sIGluc3RlYWQgb2YgZG94eWdlbgorIyBidWlsdC1pbiBzb3VyY2UgYnJvd3Nlci4gVGhlIGh0YWdzIHRvb2wgaXMgcGFydCBvZiBHTlUncyBnbG9iYWwgc291cmNlCisjIHRhZ2dpbmcgc3lzdGVtIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdQorIyB3aWxsIG5lZWQgdmVyc2lvbiA0LjguNiBvciBoaWdoZXIuCisKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3IKKyMgd2hpY2ggYW4gaW5jbHVkZSBpcyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisKK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXgKKyMgb2YgYWxsIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QKKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBJZiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGlzIGVuYWJsZWQgKHNlZSBBTFBIQUJFVElDQUxfSU5ERVgpIHRoZW4KKyMgdGhlIENPTFNfSU5fQUxQSEFfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zCisjIGluIHdoaWNoIHRoaXMgbGlzdCB3aWxsIGJlIHNwbGl0IChjYW4gYmUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFsxLi4yMF0pCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbAorIyBjbGFzc2VzIHdpbGwgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LgorIyBUaGUgSUdOT1JFX1BSRUZJWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBwcmVmaXhlcyB0aGF0CisjIHNob3VsZCBiZSBpZ25vcmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisKK0lHTk9SRV9QUkVGSVggICAgICAgICAgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIEhUTUwgb3V0cHV0LgorCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCisKKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGh0bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gaHRtbAorCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlIChmb3IgZXhhbXBsZTogLmh0bSwucGhwLC5hc3ApLiBJZiBpdCBpcyBsZWZ0IGJsYW5rCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBmaWxlcyB3aXRoIC5odG1sIGV4dGVuc2lvbi4KKworSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sCisKKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBoZWFkZXIgZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGEgY3VzdG9tIGhlYWRlciB5b3UgYXJlIHJlc3BvbnNpYmxlCisjICBmb3IgdGhlIHByb3BlciBpbmNsdXNpb24gb2YgYW55IHNjcmlwdHMgYW5kIHN0eWxlIHNoZWV0cyB0aGF0IGRveHlnZW4KKyMgbmVlZHMsIHdoaWNoIGlzIGRlcGVuZGVudCBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQuCisjIEl0IGlzIGFkdmlzZWQgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IGhlYWRlciB1c2luZyAiZG94eWdlbiAtdyBodG1sCisjIGhlYWRlci5odG1sIGZvb3Rlci5odG1sIHN0eWxlc2hlZXQuY3NzIFlvdXJDb25maWdGaWxlIiBhbmQgdGhlbiBtb2RpZnkKKyMgdGhhdCBoZWFkZXIuIE5vdGUgdGhhdCB0aGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkKKyMgaGF2ZSB0byByZWRvIHRoaXMgd2hlbiB1cGdyYWRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIGRveHlnZW4gb3Igd2hlbgorIyBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBzdWNoIGFzIEdFTkVSQVRFX1RSRUVWSUVXIQorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gJVNSQ19ESVIvLi4vZG94eWdlbi9oZWFkZXIuaHRtbAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgZm9vdGVyIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgZm9vdGVyLgorCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0gJVNSQ19ESVIvLi4vZG94eWdlbi9mb290ZXIuaHRtbAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nCisjIHN0eWxlIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8KKyMgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LiBOb3RlIHRoYXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlCisjIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBhcyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcworIyB0YWcgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZSBvYnNvbGV0ZS4KKworSFRNTF9TVFlMRVNIRUVUICAgICAgICA9CisKKyMgVGhlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhZGRpdGlvbmFsCisjIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcgc3R5bGUgc2hlZXQgdGhhdCBpcyBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQKKyMgc3R5bGUgc2hlZXRzIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZQorIyBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUCisjIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvciBtb3JlCisjIHJvYnVzdCBhZ2FpbnN0IGZ1dHVyZSB1cGRhdGVzLiBEb3h5Z2VuIHdpbGwgY29weSB0aGUgc3R5bGUgc2hlZXQgZmlsZSB0bworIyB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKworSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9CisKKyMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUKKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUKKyMgJHJlbHBhdGgkIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UKKyMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQKKyMgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuCisKK0hUTUxfRVhUUkFfRklMRVMgICAgICAgPQorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfSFVFIHRhZyBjb250cm9scyB0aGUgY29sb3Igb2YgdGhlIEhUTUwgb3V0cHV0LgorIyBEb3h5Z2VuIHdpbGwgYWRqdXN0IHRoZSBjb2xvcnMgaW4gdGhlIHN0eWxlIHNoZWV0IGFuZCBiYWNrZ3JvdW5kIGltYWdlcworIyBhY2NvcmRpbmcgdG8gdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsCisjIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMgRm9yIGluc3RhbmNlIHRoZSB2YWx1ZSAwIHJlcHJlc2VudHMgcmVkLCA2MCBpcyB5ZWxsb3csIDEyMCBpcyBncmVlbiwKKyMgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4KKyMgVGhlIGFsbG93ZWQgcmFuZ2UgaXMgMCB0byAzNTkuCisKK0hUTUxfQ09MT1JTVFlMRV9IVUUgICAgPSAyMjAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX1NBVCB0YWcgY29udHJvbHMgdGhlIHB1cml0eSAob3Igc2F0dXJhdGlvbikgb2YKKyMgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIEZvciBhIHZhbHVlIG9mIDAgdGhlIG91dHB1dCB3aWxsIHVzZQorIyBncmF5c2NhbGVzIG9ubHkuIEEgdmFsdWUgb2YgMjU1IHdpbGwgcHJvZHVjZSB0aGUgbW9zdCB2aXZpZCBjb2xvcnMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvCisjIHRoZSBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cKKyMgMTAwIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UKKyMgdGhlIG91dHB1dCBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsCisjIHNvIDgwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwKKyMgYW5kIDEwMCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdhbW1hLgorCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODAKKworIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nCisjIHRoaXMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLgorCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhUTUxfRFlOQU1JQ19TRUNUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBnZW5lcmF0ZWQgSFRNTAorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBoaWRkZW4gYW5kIHNob3duIGFmdGVyIHRoZQorIyBwYWdlIGhhcyBsb2FkZWQuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTworCisjIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YKKyMgZW50cmllcyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyCisjIGNhbiBleHBhbmQgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQKKyMgdGhlIHRyZWUgdG8gc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZQorIyB2aXNpYmxlICh1bmxlc3MgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLgorIyBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkKKyMgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzCisjIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQgdHJlZSBieSBkZWZhdWx0LgorCitIVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcworIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMKKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4KKyMgVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIE1ha2VmaWxlIGluIHRoZQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbiB0aGF0CisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQKKyMgaXQgYXQgc3RhcnR1cC4KKyMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwKKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZQorIyBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZQorIyBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlciAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkKKyMgY2FuIGJlIGdyb3VwZWQuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQKKyMgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEKKyMgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbgorIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorCitET0NTRVRfQlVORExFX0lEICAgICAgID0gd3d3LmJyb2FkY29tLmNvbQorCisjIFdoZW4gR0VORVJBVEVfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkKKyMgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUKKyMgc3R5bGUgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4KKworRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IHd3dy5icm9hZGNvbS5jb20KKworIyBUaGUgR0VORVJBVEVfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLgorCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gQnJvYWRjb20gTGltaXRlZAorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcworIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciB0b29scyBsaWtlIHRoZQorIyBNaWNyb3NvZnQgSFRNTCBoZWxwIHdvcmtzaG9wIHRvIGdlbmVyYXRlIGEgY29tcGlsZWQgSFRNTCBoZWxwIGZpbGUgKC5jaG0pCisjIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fRklMRSB0YWcgY2FuCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobSBmaWxlLiBZb3UKKyMgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlCisjIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZgorIyB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIChoaGMuZXhlKS4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEdFTkVSQVRFX0NISSBmbGFnCisjIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZCAoWUVTKSBvciB0aGF0CisjIGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fSU5ERVhfRU5DT0RJTkcKKyMgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKGhoayksIGNvbnRlbnQgKGhoYykgYW5kIHByb2plY3QgZmlsZQorIyBjb250ZW50LgorCitDSE1fSU5ERVhfRU5DT0RJTkcgICAgID0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBCSU5BUllfVE9DIGZsYWcKKyMgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgYQorIyBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKE5PKSBpbiB0aGUgLmNobSBmaWxlLgorCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KKworIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycworIyB0byB0aGUgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3LgorCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQKKyMgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhCisjIFF0IENvbXByZXNzZWQgSGVscCAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuCisjIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0byB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorCitRQ0hfRklMRSAgICAgICAgICAgICAgID0KKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZworIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlCisKK1FIUF9OQU1FU1BBQ0UgICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZworIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC1mb2xkZXJzCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiBRSFBfQ1VTVF9GSUxURVJfTkFNRSBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbSBmaWx0ZXIgdG8KKyMgYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLWZpbHRlcnMKKworUUhQX0NVU1RfRklMVEVSX05BTUUgICA9CisKKyMgVGhlIFFIUF9DVVNUX0ZJTFRfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUKKyMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycyI+CisjIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbSBGaWx0ZXJzPC9hPi4KKworUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9CisKKyMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMKKyMgcHJvamVjdCdzCisjIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuCisjIDxhIGhyZWY9Imh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMiPgorIyBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlczwvYT4uCisKK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPQorCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbgorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIFF0J3MgcWhlbHBnZW5lcmF0b3IuCisjIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUgZ2VuZXJhdGVkCisjIC5xaHAgZmlsZS4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0VDTElQU0VIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzCisjICB3aWxsIGJlIGdlbmVyYXRlZCwgd2hpY2ggdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgZm9ybSBhbiBFY2xpcHNlIGhlbHAKKyMgcGx1Z2luLiBUbyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cworIyBtZW51IGluIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTAorIyBmaWxlcyBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YKKyMgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcworIyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlCisjIHRoZSBoZWxwIGFwcGVhcnMuCisKK0dFTkVSQVRFX0VDTElQU0VIRUxQICAgPSBOTworCisjIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbgorIyB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIHNob3VsZCBhbHNvIGhhdmUKKyMgdGhpcyBuYW1lLgorCitFQ0xJUFNFX0RPQ19JRCAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKQorIyBhdCB0b3Agb2YgZWFjaCBIVE1MIHBhZ2UuIFRoZSB2YWx1ZSBOTyAodGhlIGRlZmF1bHQpIGVuYWJsZXMgdGhlIGluZGV4IGFuZAorIyB0aGUgdmFsdWUgWUVTIGRpc2FibGVzIGl0LiBTaW5jZSB0aGUgdGFicyBoYXZlIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZQorIyBuYXZpZ2F0aW9uIHRyZWUgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gTk8gaWYgeW91IGFscmVhZHkgc2V0CisjIEdFTkVSQVRFX1RSRUVWSUVXIHRvIFlFUy4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uCisjIElmIHRoZSB0YWcgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkCisjIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0CisjIGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cworIyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4KKyMgV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUgSFRNTCBoZWxwIGZlYXR1cmUuCisjIFNpbmNlIHRoZSB0cmVlIGJhc2ljYWxseSBoYXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHRhYiBpbmRleCB5b3UKKyMgY291bGQgY29uc2lkZXIgdG8gc2V0IERJU0FCTEVfSU5ERVggdG8gTk8gd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4KKworR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IFlFUworCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMKKyMgKHJhbmdlIFswLDEuLjIwXSkgdGhhdCBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtCisjIHZhbHVlcyBmcm9tIGFwcGVhcmluZyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4KKworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKKworIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZQorIyB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUKKyMgaXMgc2hvd24uCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBXaGVuIHRoZSBFWFRfTElOS1NfSU5fV0lORE9XIG9wdGlvbiBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBvcGVuCisjIGxpbmtzIHRvIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKworRVhUX0xJTktTX0lOX1dJTkRPVyAgICA9IE5PCisKKyMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhdGV4IGZvcm11bGFzIGluY2x1ZGVkCisjIGFzIGltYWdlcyBpbiB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyAxMC4gTm90ZSB0aGF0CisjIHdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bCBkb3h5Z2VuIHJ1biB5b3UgbmVlZAorIyB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeQorIyB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTAKKworIyBVc2UgdGhlIEZPUk1VTEFfVFJBTlBBUkVOVCB0YWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGZvciBmb3JtdWxhcyBhcmUgdHJhbnNwYXJlbnQgUE5Hcy4gVHJhbnNwYXJlbnQgUE5HcyBhcmUKKyMgbm90IHN1cHBvcnRlZCBwcm9wZXJseSBmb3IgSUUgNi4wLCBidXQgYXJlIHN1cHBvcnRlZCBvbiBhbGwgbW9kZXJuIGJyb3dzZXJzLgorIyBOb3RlIHRoYXQgd2hlbiBjaGFuZ2luZyB0aGlzIG9wdGlvbiB5b3UgbmVlZCB0byBkZWxldGUgYW55IGZvcm1fKi5wbmcgZmlsZXMKKyMgaW4gdGhlIEhUTUwgb3V0cHV0IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKworRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUworCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4CisjIChzZWUgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUKKyMgcmVuZGVyaW5nIGluc3RlYWQgb2YgdXNpbmcgcHJlcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdAorIyBoYXZlIExhVGVYIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MCisjIG91dHB1dC4gV2hlbiBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZAorIyBjb25maWd1cmUgdGhlIHBhdGggdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uCisKK1VTRV9NQVRISkFYICAgICAgICAgICAgPSBOTworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbgorIyBkaXJlY3Rvcnkgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4CisjIGRpcmVjdG9yeSBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4KKyMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8KKyMgdGhlIE1hdGhKYXggQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0CisjIGluc3RhbGxpbmcgTWF0aEpheC4KKyMgSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsCisjIGNvcHkgb2YgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuCisKK01BVEhKQVhfUkVMUEFUSCAgICAgICAgPSBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0CisKKyMgVGhlIE1BVEhKQVhfRVhURU5TSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgTWF0aEpheCBleHRlbnNpb24KKyMgbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuCisKK01BVEhKQVhfRVhURU5TSU9OUyAgICAgPQorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94CisjIGZvciB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0CisjIGFuZCBESFRNTCBhbmQgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZworIyBIVE1MIGhlbHAgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cworIyAoR0VORVJBVEVfRE9DU0VUKSB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZAorIyB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lCisjIGNhbiBiZSBzbG93LCB0aGVuIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUKKyMgaW1wbGVtZW50ZWQgdXNpbmcgYSBQSFAgZW5hYmxlZCB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYXQgdGhlIHdlYiBjbGllbnQKKyMgdXNpbmcgSmF2YXNjcmlwdC4gRG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBzZWFyY2ggUEhQIHNjcmlwdCBhbmQgaW5kZXgKKyMgZmlsZSB0byBwdXQgb24gdGhlIHdlYiBzZXJ2ZXIuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIHNlcnZlcgorIyBiYXNlZCBhcHByb2FjaCBpcyB0aGF0IGl0IHNjYWxlcyBiZXR0ZXIgdG8gbGFyZ2UgcHJvamVjdHMgYW5kIGFsbG93cworIyBmdWxsIHRleHQgc2VhcmNoLiBUaGUgZGlzYWR2YW50YWdlcyBhcmUgdGhhdCBpdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBzZXR1cAorIyBhbmQgZG9lcyBub3QgaGF2ZSBsaXZlIHNlYXJjaGluZyBjYXBhYmlsaXRpZXMuCisKK1NFUlZFUl9CQVNFRF9TRUFSQ0ggICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgTGF0ZXggb3V0cHV0LgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlCisjIGludm9rZWQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgY29tbWFuZCBuYW1lLgorIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvcgorIyBnZW5lcmF0aW5nIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUKKyMgTWFrZWZpbGUgdGhhdCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8KKyMgZ2VuZXJhdGUgaW5kZXggZm9yIExhVGVYLiBJZiBsZWZ0IGJsYW5rIGBtYWtlaW5kZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUKKyMgZGVmYXVsdCBjb21tYW5kIG5hbWUuCisKK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKKworIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QKKyMgTGFUZVggZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bworIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQKKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBsZXR0ZXIsIGxlZ2FsIGFuZAorIyBleGVjdXRpdmUuIElmIGxlZnQgYmxhbmsgYTR3aWRlIHdpbGwgYmUgdXNlZC4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbmFtZXMgb2YgTGFUZVgKKyMgcGFja2FnZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4KKworRVhUUkFfUEFDS0FHRVMgICAgICAgICA9CisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IKKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsCisjIHRoZSBmaXJzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPQorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yCisjIHRoZSBnZW5lcmF0ZWQgbGF0ZXggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlcgorIyB0aGUgbGFzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGZvb3Rlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0ZPT1RFUiAgICAgICAgICAgPQorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkCisjIGlzIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIHBkZiAodXNpbmcgcHMycGRmKS4gVGhlIHBkZiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMKKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBwZGZsYXRleCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZgorIyBwbGFpbiBsYXRleCBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorCitVU0VfUERGTEFURVggICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcXGJhdGNobW9kZS4KKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcAorIyBydW5uaW5nIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuCisjIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgTEFURVhfSElERV9JTkRJQ0VTIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90CisjIGluY2x1ZGUgdGhlIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKQorIyBpbiB0aGUgb3V0cHV0LgorCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KKworIyBJZiBMQVRFWF9TT1VSQ0VfQ09ERSBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUKKyMgc291cmNlIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3MKKyMgc3VjaCBhcyBTT1VSQ0VfQlJPV1NFUi4KKworTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUKKyMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFRoZSBkZWZhdWx0IHN0eWxlIGlzICJwbGFpbiIuIFNlZQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgorCitMQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQKKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aAorIyBvdGhlciBSVEYgcmVhZGVycyBvciBlZGl0b3JzLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHJ0Zicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0CisjIFJURiBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQKKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLgorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBXT1JEIG9yIG90aGVyCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLgorIyBOb3RlOiB3b3JkcGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCisKKyMgTG9hZCBzdHlsZSBzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncworIyBjb25maWcgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlCisjIHJlcGxhY2VtZW50cywgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPQorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuCisjIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4KKworUlRGX0VYVEVOU0lPTlNfRklMRSAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYG1hbicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8KKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBEb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LAorIyB0aGVuIGl0IHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5CisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMKKyMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0IHRoZW0gdGhlIG1hbiBjb21tYW5kCisjIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuIFRoZSBkZWZhdWx0IGlzIE5PLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHhtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBUaGUgWE1MX1NDSEVNQSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgc2NoZW1hLAorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKKyNYTUxfU0NIRU1BICAgICAgICAgICAgID0KKworIyBUaGUgWE1MX0RURCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgRFRELAorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKKyNYTUxfRFREICAgICAgICAgICAgICAgID0KKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAorIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZworIyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQKKyMgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFhNTCBvdXRwdXQuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYW4gQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGF1dG9nZW4uc2YubmV0KSBmaWxlCisjIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsCisjIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZSBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzCisjIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZQorIyBtb21lbnQuCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB0aGUgbmVjZXNzYXJ5IE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZQorIyB0byBnZW5lcmF0ZSBQREYgYW5kIERWSSBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlCisjIG5pY2VseSBmb3JtYXR0ZWQgc28gaXQgY2FuIGJlIHBhcnNlZCBieSBhIGh1bWFuIHJlYWRlci4KKyMgVGhpcyBpcyB1c2VmdWwKKyMgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLgorIyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhpcworIyB0YWcgaXMgc2V0IHRvIE5PIHRoZSBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIKKyMgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdCBqdXN0IHRoZSBzYW1lLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUKKyMgYXJlIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4KKyMgVGhpcyBpcyB1c2VmdWwgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lCisjIE1ha2VmaWxlIGRvbid0IG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGV2YWx1YXRlIGFsbCBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlCisjIGZpbGVzLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybworIyBuYW1lcyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgY29uZGl0aW9uYWwKKyMgY29tcGlsYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQKKyMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMKKyMgdGhlbiB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUKKyMgUFJFREVGSU5FRCBhbmQgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGUgaW5jbHVkZXMgZmlsZXMKKyMgcG9pbnRlZCB0byBieSBJTkNMVURFX1BBVEggd2lsbCBiZSBzZWFyY2hlZCB3aGVuIGEgI2luY2x1ZGUgaXMgZm91bmQuCisKK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKKworIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieQorIyB0aGUgcHJlcHJvY2Vzc29yLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0KKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwKKyMgYmUgdXNlZC4KKworSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9CisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdAorIyBhcmUgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YKKyMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZQorIyBvciBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgPSBhcmUKKyMgb21pdHRlZCA9MSBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nCisjIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3IKKyMgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKworUFJFREVGSU5FRCAgICAgICAgICAgICA9IF9fYXR0cmlidXRlX18oeCk9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2NwbHVzcGx1cworCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gYW5kIEVYUEFORF9PTkxZX1BSRURFRiB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgdGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YgbWFjcm8gbmFtZXMgdGhhdCBzaG91bGQgYmUgZXhwYW5kZWQuCisjIFRoZSBtYWNybyBkZWZpbml0aW9uIHRoYXQgaXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgd2lsbCBiZSB1c2VkLgorIyBVc2UgdGhlIFBSRURFRklORUQgdGFnIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBtYWNybyBkZWZpbml0aW9uIHRoYXQKKyMgb3ZlcnJ1bGVzIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIHRoZSBzb3VyY2UgY29kZS4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9CisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbgorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zCisjIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZSBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYQorIyBzZW1pY29sb24sIGJlY2F1c2UgdGhlc2Ugd2lsbCBjb25mdXNlIHRoZSBwYXJzZXIgaWYgbm90IHJlbW92ZWQuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZGl0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgVEFHRklMRVMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnZmlsZXMuIEZvciBlYWNoCisjIHRhZyBmaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgYWRkZWQuIFRoZQorIyBmb3JtYXQgb2YgYSB0YWcgZmlsZSB3aXRob3V0IHRoaXMgbG9jYXRpb24gaXMgYXMgZm9sbG93czoKKyMKKyMgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4KKyMgQWRkaW5nIGxvY2F0aW9uIGZvciB0aGUgdGFnIGZpbGVzIGlzIGRvbmUgYXMgZm9sbG93czoKKyMKKyMgVEFHRklMRVMgPSBmaWxlMT1sb2MxICJmaWxlMiA9IGxvYzIiIC4uLgorIyB3aGVyZSAibG9jMSIgYW5kICJsb2MyIiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMKKyMgb3IgVVJMcy4gTm90ZSB0aGF0IGVhY2ggdGFnIGZpbGUgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUgKHdoZXJlIHRoZSBuYW1lIGRvZXMKKyMgTk9UIGluY2x1ZGUgdGhlIHBhdGgpLiBJZiBhIHRhZyBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2gKKyMgZG94eWdlbiBpcyBydW4sIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgdGFnZmlsZSBoZXJlLgorCitUQUdGSUxFUyAgICAgICAgICAgICAgID0KKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlCisjIGEgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPQorCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZSBsaXN0ZWQKKyMgaW4gdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8gb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMKKyMgd2lsbCBiZSBsaXN0ZWQuCisKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbAorIyBiZSBsaXN0ZWQuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQKKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiBgd2hpY2ggcGVybCcpLgorCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIGluaGVyaXRhbmNlIGRpYWdyYW0gKGluIEhUTUwsIFJURiBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZQorIyBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8gTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0CisjIHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVCBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvCisjIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlIHBvd2VyZnVsIGdyYXBocy4KKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjCisjIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZQorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pIHRvIHByb2R1Y2UgdGhlIGNoYXJ0IGFuZCBpbnNlcnQgaXQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIFRoZSBNU0NHRU5fUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUKKyMgdGhlIG1zY2dlbiB0b29sIHJlc2lkZXMuIElmIGxlZnQgZW1wdHkgdGhlIHRvb2wgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUKKyMgZGVmYXVsdCBzZWFyY2ggcGF0aC4KKworTVNDR0VOX1BBVEggICAgICAgICAgICA9CisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUKKyMgaW5oZXJpdGFuY2UgYW5kIHVzYWdlIHJlbGF0aW9ucyBpZiB0aGUgdGFyZ2V0IGlzIHVuZG9jdW1lbnRlZAorIyBvciBpcyBub3QgYSBjbGFzcy4KKworSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUworCisjIElmIHlvdSBzZXQgdGhlIEhBVkVfRE9UIHRhZyB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgYXNzdW1lIHRoZSBkb3QgdG9vbCBpcworIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXosIGEgZ3JhcGggdmlzdWFsaXphdGlvbgorIyB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50IEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uCisjIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSAlSEFWRV9ET1QKKworIyBUaGUgRE9UX05VTV9USFJFQURTIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRvdCBpbnZvY2F0aW9ucyBkb3h5Z2VuIGlzCisjIGFsbG93ZWQgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsCisjIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0CisjIGV4cGxpY2l0bHkgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UKKyMgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZyBzcGVlZC4KKworRE9UX05VTV9USFJFQURTICAgICAgICA9IDAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB1c2UgdGhlIEhlbHZldGljYSBmb250IGZvciBhbGwgZG90IGZpbGVzIHRoYXQKKyMgZG94eWdlbiBnZW5lcmF0ZXMuIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgeW91IGNhbiBzcGVjaWZ5CisjIHRoZSBmb250IG5hbWUgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCB0byBtYWtlIHN1cmUgZG90IGlzIGFibGUgdG8gZmluZAorIyB0aGUgZm9udCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcKKyMgdGhlIERPVEZPTlRQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5IHNldHRpbmcgRE9UX0ZPTlRQQVRIIHRvIHRoZQorIyBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm9udC4KKworRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQorCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgZm9udCBvZiBkb3QgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCBzaXplIGlzIDEwcHQuCisKK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMAorCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgSGVsdmV0aWNhIGZvbnQuCisjIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gdXNlIERPVF9GT05UUEFUSCB0bworIyBzZXQgdGhlIHBhdGggd2hlcmUgZG90IGNhbiBmaW5kIGl0LgorCitET1RfRk9OVFBBVEggICAgICAgICAgID0KKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQKKyMgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLiBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZQorIyBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZAorIyBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kCisjIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuCisKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKKworIyBJZiB0aGUgR1JPVVBfR1JBUEhTIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMKKworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgaW5oZXJpdGFuY2UgYW5kCisjIGNvbGxhYm9yYXRpb24gZGlhZ3JhbXMgaW4gYSBzdHlsZSBzaW1pbGFyIHRvIHRoZSBPTUcncyBVbmlmaWVkIE1vZGVsaW5nCisjIExhbmd1YWdlLgorCitVTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZQorIyB0aGUgY2xhc3Mgbm9kZS4gSWYgdGhlcmUgYXJlIG1hbnkgZmllbGRzIG9yIG1ldGhvZHMgYW5kIG1hbnkgbm9kZXMgdGhlCisjIGdyYXBoIG1heSBiZWNvbWUgdG9vIGJpZyB0byBiZSB1c2VmdWwuIFRoZSBVTUxfTElNSVRfTlVNX0ZJRUxEUworIyB0aHJlc2hvbGQgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUKKyMgbWFuYWdhYmxlLiBTZXQgdGhpcyB0byAwIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlCisjIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0IGlzIGVuZm9yY2VkLgorCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKKworIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUKKyMgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpciBpbnN0YW5jZXMuCisKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFX0dSQVBILCBhbmQgSEFWRV9ET1QKKyMgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQKKyMgZmlsZSBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGgKKyMgb3RoZXIgZG9jdW1lbnRlZCBmaWxlcy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFRF9CWV9HUkFQSCwgYW5kCisjIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaAorIyBkb2N1bWVudGVkIGhlYWRlciBmaWxlIHNob3dpbmcgdGhlIGRvY3VtZW50ZWQgZmlsZXMgdGhhdCBkaXJlY3RseSBvcgorIyBpbmRpcmVjdGx5IGluY2x1ZGUgdGhpcyBmaWxlLgorCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBTExfR1JBUEggYW5kIEhBVkVfRE9UIG9wdGlvbnMgYXJlIHNldCB0byBZRVMgdGhlbgorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbgorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UKKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzCisjIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbgorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UKKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlcgorIyBncmFwaHMgZm9yIHNlbGVjdGVkIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4KKworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaGljYWwgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KKworR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUworCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMKKyMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3RvcmllcworIyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZSBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUKKyMgcmVsYXRpb25zIGJldHdlZW4gdGhlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBieSBkb3QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgc3ZnLCBwbmcsIGpwZywgb3IgZ2lmLgorIyBJZiBsZWZ0IGJsYW5rIHBuZyB3aWxsIGJlIHVzZWQuIElmIHlvdSBjaG9vc2Ugc3ZnIHlvdSBuZWVkIHRvIHNldAorIyBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UgdGhlIFNWRyBmaWxlcworIyB2aXNpYmxlIGluIElFIDkrIChvdGhlciBicm93c2VycyBkbyBub3QgaGF2ZSB0aGlzIHJlcXVpcmVtZW50KS4KKworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZworCisjIElmIERPVF9JTUFHRV9GT1JNQVQgaXMgc2V0IHRvIHN2ZywgdGhlbiB0aGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvIFlFUyB0bworIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4KKyMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLgorIyBUZXN0ZWQgYW5kIHdvcmtpbmcgYXJlIEZpcmVmb3gsIENocm9tZSwgU2FmYXJpLCBhbmQgT3BlcmEuIEZvciBJRSA5KyB5b3UKKyMgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlIHRoZSBTVkcgZmlsZXMKKyMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuCisKK0lOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTworCisjIFRoZSB0YWcgRE9UX1BBVEggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPQorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcZG90ZmlsZSBjb21tYW5kKS4KKworRE9URklMRV9ESVJTICAgICAgICAgICA9CisKKyMgVGhlIE1TQ0ZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gbXNjIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlCisjIFxtc2NmaWxlIGNvbW1hbmQpLgorCitNU0NGSUxFX0RJUlMgICAgICAgICAgID0KKworIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZgorIyBub2RlcyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGgKKyMgYmVjb21lcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcworIyB2aXN1YWxpemVkIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUKKyMgbnVtYmVyIG9mIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbgorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlCisjIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguCisKK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSAyMDAKKworIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZQorIyBncmFwaHMgZ2VuZXJhdGVkIGJ5IGRvdC4gQSBkZXB0aCB2YWx1ZSBvZiAzIG1lYW5zIHRoYXQgb25seSBub2RlcyByZWFjaGFibGUKKyMgZnJvbSB0aGUgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMKKyMgdGhhdCBsYXkgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzCisjIG9wdGlvbiB0byAxIG9yIDIgbWF5IGdyZWF0bHkgcmVkdWNlIHRoZSBjb21wdXRhdGlvbiB0aW1lIG5lZWRlZCBmb3IgbGFyZ2UKKyMgY29kZSBiYXNlcy4gQWxzbyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5CisjIERPVF9HUkFQSF9NQVhfTk9ERVMuIFVzaW5nIGEgZGVwdGggb2YgMCBtZWFucyBubyBkZXB0aCByZXN0cmljdGlvbi4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDIKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90CisjIHNlZW0gdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LiBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsCisjIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mCisjIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0byByZWFkKS4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKQorIyBzdXBwb3J0IHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQKKyMgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkIGdyYXBocy4KKworR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUworCisjIElmIHRoZSBET1RfQ0xFQU5VUCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZQorIyB0aGUgdmFyaW91cyBncmFwaHMuCisKK0RPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL2RveHlnZW4vYnJvYWRjb20ucG5nIGIvYmFsX3JlbGVhc2UvZG94eWdlbi9icm9hZGNvbS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3NDgwYwotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL2RveHlnZW4vYnJvYWRjb20ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL2RveHlnZW4vZm9vdGVyLmh0bWwgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL2Zvb3Rlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMTUyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL2Zvb3Rlci5odG1sCkBAIC0wLDAgKzEsMjEgQEAKKzwhLS0gSFRNTCBmb290ZXIgZm9yIGRveHlnZW4gMS44LjMuMS0tPgorPCEtLSBzdGFydCBmb290ZXIgcGFydCAtLT4KKzwhLS1CRUdJTiBHRU5FUkFURV9UUkVFVklFVy0tPgorPGRpdiBpZD0ibmF2LXBhdGgiIGNsYXNzPSJuYXZwYXRoIj48IS0tIGlkIGlzIG5lZWRlZCBmb3IgdHJlZXZpZXcgZnVuY3Rpb24hIC0tPgorICA8dWw+CisgICAgJG5hdnBhdGgKKyAgICA8bGkgY2xhc3M9ImZvb3RlciI+CisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5icm9hZGNvbS5jb20iPgorICAgIDxpbWcgY2xhc3M9ImZvb3RlciIgYWx0PSJCQUw6IEJyb2FkY29tIEFkYXB0YXRpb24gTGF5ZXIiLz48L2E+ICRwcm9qZWN0bnVtYmVyIDwvbGk+CisgIDwvdWw+Cis8L2Rpdj4KKzwhLS1FTkQgR0VORVJBVEVfVFJFRVZJRVctLT4KKzwhLS1CRUdJTiAhR0VORVJBVEVfVFJFRVZJRVctLT4KKzxociBjbGFzcz0iZm9vdGVyIi8+PGFkZHJlc3MgY2xhc3M9ImZvb3RlciI+PHNtYWxsPgorJGdlbmVyYXRlZGJ5ICYjMTYwOzxhIGhyZWY9Imh0dHA6Ly93d3cuYnJvYWRjb20uY29tIj4KKzxpbWcgY2xhc3M9ImZvb3RlciIgYWx0PSJCQUwgT2JqZWN0IE1vZGVsIi8+Cis8L2E+ICRwcm9qZWN0bnVtYmVyCis8L3NtYWxsPjwvYWRkcmVzcz4KKzwhLS1FTkQgIUdFTkVSQVRFX1RSRUVWSUVXLS0+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9kb3h5Z2VuL2dlblByb2plY3ROdW1iZXIuc2ggYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL2dlblByb2plY3ROdW1iZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTNiMjRjZQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL2RveHlnZW4vZ2VuUHJvamVjdE51bWJlci5zaApAQCAtMCwwICsxLDY3IEBACisjIS9iaW4vYmFzaAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisjICAgCisjICAgICBCcm9hZGNvbSBMdGQuIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20gTHRkLgorIyAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyAgIAorIyAgVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBMdGQuIGFuZC9vciBpdHMKKyMgIGxpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50CisjICB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorIyAgYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIEx0ZC4gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KKyMgIGFuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gTHRkLiBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKKyMgIHRvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbSBMdGQuCisjICBleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCisjICBwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorIyAgTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKKyMgIEJST0FEQ09NIExURCBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisjICAgCisjICBFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIyAgIAorIyAgMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyMgICAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSBMdGQuLCBhbmQgeW91IHNoYWxsIHVzZQorIyAgICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworIyAgICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tIEx0ZC4KKyMgICAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisjICAgCisjICAyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyMgICAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisjICAgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisjICAgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyMgICAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyMgICAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorIyAgICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisjICAgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorIyAgICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyMgICAKKyMgIDMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorIyAgICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyMgICAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyMgICAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorIyAgICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyMgICAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisjICAgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworIyAgICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyMgICAgICBMSU1JVEVEIFJFTUVEWS4KKyMgIDo+CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyNHZXQgdGhlIGFic29sdXRlIHBhdGggb2YgdmVyc2lvbiBmaWxlLgorIworIyEhISBUaGlzIHNjcmlwdCBNVVNUIGJlIHB1dCBpbiBiYWwvY3VyL2RveHlnZW4gZGlyZWN0b3J5ICEhIQorIworUFJPSlJPT1Q9JFBXRC8uLgorQlJBTkNIX0lORk89JHtQUk9KUk9PVH0vYnJhbmNoLmluZm8KK2lmIFsgISAtZiAke0JSQU5DSF9JTkZPfSBdOyB0aGVuCisgICAgZWNobyAiVW5rbm93biIKKyAgICBleGl0CitmaQorCitSRUxFQVNFX1RZUEU9YGNhdCAke0JSQU5DSF9JTkZPfSB8IGdyZXAgUkVMRUFTRV9UWVBFIHwgc2VkICdzJS4qPSUlJ2AKK01BSk9SPWBjYXQgJHtCUkFOQ0hfSU5GT30gfCBncmVwIE1BSk9SIHwgc2VkICdzJS4qPSUlJ2AKK01JTk9SPWBjYXQgJHtCUkFOQ0hfSU5GT30gfCBncmVwIE1JTk9SIHwgc2VkICdzJS4qPSUlJ2AKK1BBVENIPWBjYXQgJHtCUkFOQ0hfSU5GT30gfCBncmVwIFBBVENIIHwgc2VkICdzJS4qPSUlJ2AKKworZWNobyAke1JFTEVBU0VfVFlQRX0ke01BSk9SfS4ke01JTk9SfS4ke1BBVENIfQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvZG94eWdlbi9oZWFkZXIuaHRtbCBiL2JhbF9yZWxlYXNlL2RveHlnZW4vaGVhZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzOTdiNQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL2RveHlnZW4vaGVhZGVyLmh0bWwKQEAgLTAsMCArMSw1NSBAQAorPCEtLSBIVE1MIGhlYWRlciBmb3IgZG94eWdlbiAxLjguMy4xLS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC94aHRtbDtjaGFyc2V0PVVURi04Ii8+Cis8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPTkiLz4KKzxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iQnJvYWRjb20gTGltaXRlZCIvPgorPCEtLUJFR0lOIFBST0pFQ1RfTkFNRS0tPjx0aXRsZT4kcHJvamVjdG5hbWU6ICR0aXRsZTwvdGl0bGU+PCEtLUVORCBQUk9KRUNUX05BTUUtLT4KKzwhLS1CRUdJTiAhUFJPSkVDVF9OQU1FLS0+PHRpdGxlPiR0aXRsZTwvdGl0bGU+PCEtLUVORCAhUFJPSkVDVF9OQU1FLS0+Cis8bGluayBocmVmPSIkcmVscGF0aF50YWJzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIvPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJHJlbHBhdGheanF1ZXJ5LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IiRyZWxwYXRoXmR5bnNlY3Rpb25zLmpzIj48L3NjcmlwdD4KKyR0cmVldmlldworJHNlYXJjaAorJG1hdGhqYXgKKzxsaW5rIGhyZWY9IiRyZWxwYXRoXiRzdHlsZXNoZWV0IiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiAvPgorJGV4dHJhc3R5bGVzaGVldAorPC9oZWFkPgorPGJvZHk+Cis8ZGl2IGlkPSJ0b3AiPjwhLS0gZG8gbm90IHJlbW92ZSB0aGlzIGRpdiwgaXQgaXMgY2xvc2VkIGJ5IGRveHlnZW4hIC0tPgorCis8IS0tQkVHSU4gVElUTEVBUkVBLS0+Cis8ZGl2IGlkPSJ0aXRsZWFyZWEiPgorPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgPHRib2R5PgorIDx0ciBzdHlsZT0iaGVpZ2h0OiA1NnB4OyI+CisgIDwhLS1CRUdJTiBQUk9KRUNUX0xPR08tLT4KKyAgPHRkIGlkPSJwcm9qZWN0bG9nbyI+PGltZyBhbHQ9IkxvZ28iIHNyYz0iJHJlbHBhdGheJHByb2plY3Rsb2dvIi8+PC90ZD4KKyAgPCEtLUVORCBQUk9KRUNUX0xPR08tLT4KKyAgPCEtLUJFR0lOIFBST0pFQ1RfTkFNRS0tPgorICA8dGQgc3R5bGU9InBhZGRpbmctbGVmdDogMC41ZW07Ij4KKyAgIDxkaXYgaWQ9InByb2plY3RuYW1lIj4kcHJvamVjdG5hbWUKKyAgIDwhLS1CRUdJTiBQUk9KRUNUX05VTUJFUi0tPiYjMTYwOzxzcGFuIGlkPSJwcm9qZWN0bnVtYmVyIj4kcHJvamVjdG51bWJlcjwvc3Bhbj48IS0tRU5EIFBST0pFQ1RfTlVNQkVSLS0+CisgICA8L2Rpdj4KKyAgIDwhLS1CRUdJTiBQUk9KRUNUX0JSSUVGLS0+PGRpdiBpZD0icHJvamVjdGJyaWVmIj4kcHJvamVjdGJyaWVmPC9kaXY+PCEtLUVORCBQUk9KRUNUX0JSSUVGLS0+CisgIDwvdGQ+CisgIDwhLS1FTkQgUFJPSkVDVF9OQU1FLS0+CisgIDwhLS1CRUdJTiAhUFJPSkVDVF9OQU1FLS0+CisgICA8IS0tQkVHSU4gUFJPSkVDVF9CUklFRi0tPgorICAgIDx0ZCBzdHlsZT0icGFkZGluZy1sZWZ0OiAwLjVlbTsiPgorICAgIDxkaXYgaWQ9InByb2plY3RicmllZiI+JHByb2plY3RicmllZjwvZGl2PgorICAgIDwvdGQ+CisgICA8IS0tRU5EIFBST0pFQ1RfQlJJRUYtLT4KKyAgPCEtLUVORCAhUFJPSkVDVF9OQU1FLS0+CisgIDwhLS1CRUdJTiBESVNBQkxFX0lOREVYLS0+CisgICA8IS0tQkVHSU4gU0VBUkNIRU5HSU5FLS0+CisgICA8dGQ+JHNlYXJjaGJveDwvdGQ+CisgICA8IS0tRU5EIFNFQVJDSEVOR0lORS0tPgorICA8IS0tRU5EIERJU0FCTEVfSU5ERVgtLT4KKyA8L3RyPgorIDwvdGJvZHk+Cis8L3RhYmxlPgorPC9kaXY+Cis8IS0tRU5EIFRJVExFQVJFQS0tPgorPCEtLSBlbmQgaGVhZGVyIHBhcnQgLS0+CmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9kb3h5Z2VuL29tY2lzdmMuZG94eSBiL2JhbF9yZWxlYXNlL2RveHlnZW4vb21jaXN2Yy5kb3h5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMGVlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL29tY2lzdmMuZG94eQpAQCAtMCwwICsxLDE4MzkgQEAKKyMgRG94eWZpbGUgMS44LjIKKworIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4KKyMgVGhlIGZvcm1hdCBpczoKKyMgICAgICAgVEFHID0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIEZvciBsaXN0cyBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKKyMgICAgICAgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzICgiICIpLgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBjb25maWcgZmlsZQorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsCisjIHRleHQgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgdGFnLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZQorIyBpY29udiBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZQorIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KKworRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3Igc2VxdWVuY2Ugb2Ygd29yZHMpIHRoYXQgc2hvdWxkCisjIGlkZW50aWZ5IHRoZSBwcm9qZWN0LiBOb3RlIHRoYXQgaWYgeW91IGRvIG5vdCB1c2UgRG94eXdpemFyZCB5b3UgbmVlZAorIyB0byBwdXQgcXVvdGVzIGFyb3VuZCB0aGUgcHJvamVjdCBuYW1lIGlmIGl0IGNvbnRhaW5zIHNwYWNlcy4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9ICJCcm9hZGNvbSBPTUNJIFNlcnZpY2UgTGF5ZXIiCisKKyMgVGhlIFBST0pFQ1RfTlVNQkVSIHRhZyBjYW4gYmUgdXNlZCB0byBlbnRlciBhIHByb2plY3Qgb3IgcmV2aXNpb24gbnVtYmVyLgorIyBUaGlzIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yCisjIGlmIHNvbWUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBpcyB1c2VkLgorCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0gJVBST0pFQ1RfTlVNQkVSCisKKyMgVXNpbmcgdGhlIFBST0pFQ1RfQlJJRUYgdGFnIG9uZSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbCBvbmUgbGluZSBkZXNjcmlwdGlvbgorIyBmb3IgYSBwcm9qZWN0IHRoYXQgYXBwZWFycyBhdCB0aGUgdG9wIG9mIGVhY2ggcGFnZSBhbmQgc2hvdWxkIGdpdmUgdmlld2VyCisjIGEgcXVpY2sgaWRlYSBhYm91dCB0aGUgcHVycG9zZSBvZiB0aGUgcHJvamVjdC4gS2VlcCB0aGUgZGVzY3JpcHRpb24gc2hvcnQuCisKK1BST0pFQ1RfQlJJRUYgICAgICAgICAgPQorCisjIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGFuIGxvZ28gb3IgaWNvbiB0aGF0IGlzCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIGxvZ28gc2hvdWxkIG5vdAorIyBleGNlZWQgNTUgcGl4ZWxzIGFuZCB0aGUgbWF4aW11bSB3aWR0aCBzaG91bGQgbm90IGV4Y2VlZCAyMDAgcGl4ZWxzLgorIyBEb3h5Z2VuIHdpbGwgY29weSB0aGUgbG9nbyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKworUFJPSkVDVF9MT0dPICAgICAgICAgICA9ICIlU1JDX0RJUi8uLi9kb3h5Z2VuL2Jyb2FkY29tLnBuZyIKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpCisjIGJhc2UgcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbgorIyB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZiBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCisKK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSAlT1VUX0RPQ1NfRElSCisKKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUKKyMgNDA5NiBzdWItZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dAorIyBmb3JtYXQgYW5kIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuCisjIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZgorIyBzb3VyY2UgZmlsZXMsIHdoZXJlIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQKKyMgb3RoZXJ3aXNlIGNhdXNlIHBlcmZvcm1hbmNlIHByb2JsZW1zIGZvciB0aGUgZmlsZSBzeXN0ZW0uCisKK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTworCisjIFRoZSBPVVRQVVRfTEFOR1VBR0UgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggYWxsCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaXMgd3JpdHRlbi4gRG94eWdlbiB3aWxsIHVzZSB0aGlzCisjIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGFsbCBjb25zdGFudCBvdXRwdXQgaW4gdGhlIHByb3BlciBsYW5ndWFnZS4KKyMgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgRW5nbGlzaCwgb3RoZXIgc3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6CisjIEFmcmlrYWFucywgQXJhYmljLCBCcmF6aWxpYW4sIENhdGFsYW4sIENoaW5lc2UsIENoaW5lc2UtVHJhZGl0aW9uYWwsCisjIENyb2F0aWFuLCBDemVjaCwgRGFuaXNoLCBEdXRjaCwgRXNwZXJhbnRvLCBGYXJzaSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sCisjIEdyZWVrLCBIdW5nYXJpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoCisjIG1lc3NhZ2VzKSwgS29yZWFuLCBLb3JlYW4tZW4sIExpdGh1YW5pYW4sIE5vcndlZ2lhbiwgTWFjZWRvbmlhbiwgUGVyc2lhbiwKKyMgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLAorIyBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBVa3JhaW5pYW4sIGFuZCBWaWV0bmFtZXNlLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBpbmNsdWRlIGJyaWVmIG1lbWJlciBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluCisjIHRoZSBmaWxlIGFuZCBjbGFzcyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFEb2MpLgorIyBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCisKKyMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCBwcmVwZW5kCisjIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLgorIyBOb3RlOiBpZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvcgorIyB0aGF0IGlzIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZworIyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlCisjIHN0cmlwcGVkIGZyb20gdGhlIHRleHQgYW5kIHRoZSByZXN1bHQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGlzdCwgaXMKKyMgdXNlZCBhcyB0aGUgYW5ub3RhdGVkIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuCisjIElmIGxlZnQgYmxhbmssIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkICgiJG5hbWUiIGlzIGF1dG9tYXRpY2FsbHkKKyMgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZW50aXR5KTogIlRoZSAkbmFtZSBjbGFzcyIgIlRoZSAkbmFtZSB3aWRnZXQiCisjICJUaGUgJG5hbWUgZmlsZSIgImlzIiAicHJvdmlkZXMiICJzcGVjaWZpZXMiICJjb250YWlucyIKKyMgInJlcHJlc2VudHMiICJhIiAiYW4iICJ0aGUiCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPQorCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KKyMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZgorIyBkZXNjcmlwdGlvbi4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKworSU5MSU5FX0lOSEVSSVRFRF9NRU1CICA9IE5PCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsCisjIHBhdGggYmVmb3JlIGZpbGVzIG5hbWUgaW4gdGhlIGZpbGUgbGlzdCBhbmQgaW4gdGhlIGhlYWRlciBmaWxlcy4gSWYgc2V0CisjIHRvIE5PIHRoZSBzaG9ydGVzdCBwYXRoIHRoYXQgbWFrZXMgdGhlIGZpbGUgbmFtZSB1bmlxdWUgd2lsbCBiZSB1c2VkLgorCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gTk8KKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIFNUUklQX0ZST01fUEFUSCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4gU3RyaXBwaW5nIGlzCisjIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZCBwYXJ0IG9mCisjIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUKKyMgcGF0aCB0byBzdHJpcC4gTm90ZSB0aGF0IHlvdSBzcGVjaWZ5IGFic29sdXRlIHBhdGhzIGhlcmUsIGJ1dCBhbHNvCisjIHJlbGF0aXZlIHBhdGhzLCB3aGljaCB3aWxsIGJlIHJlbGF0aXZlIGZyb20gdGhlIGRpcmVjdG9yeSB3aGVyZSBkb3h5Z2VuIGlzCisjIHN0YXJ0ZWQuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPQorCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mCisjIHRoZSBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscworIyB0aGUgcmVhZGVyIHdoaWNoIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuCisjIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MKKyMgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZCBzcGVjaWZ5IHRoZSBpbmNsdWRlIHBhdGhzIHRoYXQKKyMgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPQorCisjIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlcgorIyAoYnV0IGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3VyIGZpbGUgc3lzdGVtCisjIGRvZXNuJ3Qgc3VwcG9ydCBsb25nIG5hbWVzIGxpa2Ugb24gRE9TLCBNYWMsIG9yIENELVJPTS4KKworU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbgorIyB3aWxsIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhRG9jLXN0eWxlCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhRG9jCisjIGNvbW1lbnRzIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzCisjICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsCisjIGludGVycHJldCB0aGUgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgY29tbWVudHMKKyMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMgcmVxdWlyaW5nCisjIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgRG94eWdlbgorIyB0cmVhdCBhIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8KKyMgY29tbWVudHMpIGFzIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuCisjIFRoZSBuZXcgZGVmYXVsdCBpcyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZAorIyBkZXNjcmlwdGlvbi4gU2V0IHRoaXMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3VyIGluc3RlYWQuCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGFuIHVuZG9jdW1lbnRlZAorIyBtZW1iZXIgaW5oZXJpdHMgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdAorIyByZS1pbXBsZW1lbnRzLgorCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZQorIyBhIG5ldyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsCisjIGJlIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLgorIyBEb3h5Z2VuIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gNAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMKKyMgYXMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuCisjIEZvciBleGFtcGxlIGFkZGluZyAic2lkZWVmZmVjdD1ccGFyIFNpZGUgRWZmZWN0czpcbiIgd2lsbCBhbGxvdyB5b3UgdG8KKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoCisjIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcgIlNpZGUgRWZmZWN0czoiLgorIyBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydCBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9ICJUQUJMRV9IRFIyezJ9PTx0cj48dGg+XDE8L3RoPjx0aD5cMjwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XMnsyfT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX0hEUjN7M309PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48dGg+XDM8L3RoPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX1JPVzN7M309PHRyPjx0ZD5cMTwvdGQ+PHRkPlwyPC90ZD48dGQ+XDM8L3RkPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX0hEUjR7NH09PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48dGg+XDM8L3RoPjx0aD5cNDwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XNHs0fT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjx0ZD5cMzwvdGQ+PHRkPlw0PC90ZD48L3RyPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUQUJMRV9IRFI1ezV9PTx0cj48dGg+XDE8L3RoPjx0aD5cMjwvdGg+PHRoPlwzPC90aD48dGg+XDQ8L3RoPjx0aD5cNTwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XNXs1fT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjx0ZD5cMzwvdGQ+PHRkPlw0PC90ZD48dGQ+XDU8L3RkPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX0hEUjZ7Nn09PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48dGg+XDM8L3RoPjx0aD5cNDwvdGg+PHRoPlw1PC90aD48dGg+XDY8L3RoPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX1JPVzZ7Nn09PHRyPjx0ZD5cMTwvdGQ+PHRkPlwyPC90ZD48dGQ+XDM8L3RkPjx0ZD5cNDwvdGQ+PHRkPlw1PC90ZD48dGQ+XDY8L3RkPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX0hEUjd7N309PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48dGg+XDM8L3RoPjx0aD5cNDwvdGg+PHRoPlw1PC90aD48dGg+XDY8L3RoPjx0aD5cNzwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XN3s3fT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjx0ZD5cMzwvdGQ+PHRkPlw0PC90ZD48dGQ+XDU8L3RkPjx0ZD5cNjwvdGQ+PHRkPlw3PC90ZD48L3RyPiIKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nCisjICJjbGFzcz1pdGNsOjpjbGFzcyIgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZQorIyBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4KKyMgRm9yIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdAorIyBvZiBhbGwgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IFlFUworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0pBVkEgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgSmF2YQorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yCisjIEphdmEuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywgcXVhbGlmaWVkCisjIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisKK09QVElNSVpFX09VVFBVVF9KQVZBICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfRk9SX0ZPUlRSQU4gdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgRm9ydHJhbgorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yCisjIEZvcnRyYW4uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IKKyMgVkhETC4KKworT1BUSU1JWkVfT1VUUFVUX1ZIREwgICA9IE5PCisKKyMgRG94eWdlbiBzZWxlY3RzIHRoZSBwYXJzZXIgdG8gdXNlIGRlcGVuZGluZyBvbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlcyBpdAorIyBwYXJzZXMuIFdpdGggdGhpcyB0YWcgeW91IGNhbiBhc3NpZ24gd2hpY2ggcGFyc2VyIHRvIHVzZSBmb3IgYSBnaXZlbgorIyBleHRlbnNpb24uIERveHlnZW4gaGFzIGEgYnVpbHQtaW4gbWFwcGluZywgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgb3IgZXh0ZW5kIGl0CisjIHVzaW5nIHRoaXMgdGFnLiBUaGUgZm9ybWF0IGlzIGV4dD1sYW5ndWFnZSwgd2hlcmUgZXh0IGlzIGEgZmlsZSBleHRlbnNpb24sCisjIGFuZCBsYW5ndWFnZSBpcyBvbmUgb2YgdGhlIHBhcnNlcnMgc3VwcG9ydGVkIGJ5IGRveHlnZW46IElETCwgSmF2YSwKKyMgSmF2YXNjcmlwdCwgQ1NoYXJwLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiwgVkhETCwgQywKKyMgQysrLiBGb3IgaW5zdGFuY2UgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IC5pbmMgZmlsZXMgYXMgRm9ydHJhbiBmaWxlcyAoZGVmYXVsdAorIyBpcyBQSFApLCBhbmQgLmYgZmlsZXMgYXMgQyAoZGVmYXVsdCBpcyBGb3J0cmFuKSwgdXNlOiBpbmM9Rm9ydHJhbiBmPUMuIE5vdGUKKyMgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UgdGhlCisjIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0KKworIyBJZiBNQVJLRE9XTl9TVVBQT1JUIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwKKyMgY29tbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuCisjIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UKKyMgY2FuIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4KKyMgRGlzYWJsZSBvbmx5IGluIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4KKworTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUworCisjIFdoZW4gZW5hYmxlZCBkb3h5Z2VuIHRyaWVzIHRvIGxpbmsgd29yZHMgdGhhdCBjb3JyZXNwb25kIHRvIGRvY3VtZW50ZWQgY2xhc3NlcywKKyMgb3IgbmFtZXNwYWNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uIFN1Y2ggYSBsaW5rIGNhbiBiZQorIyBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkIG9yCisjIGdsb2JhbGx5IGJ5IHNldHRpbmcgQVVUT0xJTktfU1VQUE9SVCB0byBOTy4KKworQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUworCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQKKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkCisjIHNldCB0aGlzIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7IHYucy4KKyMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZXMgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uCisjIGRpYWdyYW1zIHRoYXQgaW52b2x2ZSBTVEwgY2xhc3NlcyBtb3JlIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZS4KKworQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IE5PCisKKyMgSWYgeW91IHVzZSBNaWNyb3NvZnQncyBDKysvQ0xJIGxhbmd1YWdlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8KKyMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4KKworQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgc291cmNlcyBvbmx5LgorIyBEb3h5Z2VuIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMKKyMgaW5zdGVhZCBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCisKK1NJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTworCisjIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0byBpbmRpY2F0ZSBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBhIHByb3BlcnR5LiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgbWFrZSBkb3h5Z2VuIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3Igc2V0dGluZyBhIHNpbXBsZSB0eXBlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCisKKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQworIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0CisjIG1lbWJlciBpbiB0aGUgZ3JvdXAgKGlmIGFueSkgZm9yIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZSBncm91cC4gQnkgZGVmYXVsdAorIyBhbGwgbWVtYmVycyBvZiBhIGdyb3VwIG11c3QgYmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5LgorCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KKworIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mCisjIHRoZSBzYW1lIHR5cGUgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhCisjIHN1Ymdyb3VwIG9mIHRoYXQgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvCisjIE5PIHRvIHByZXZlbnQgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nCisjIHRoZSBcbm9zdWJncm91cGluZyBjb21tYW5kLgorCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiB0aGUgSU5MSU5FX0dST1VQRURfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3Nlcywgc3RydWN0cyBhbmQKKyMgdW5pb25zIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nCisjIEBpbmdyb3VwKSBpbnN0ZWFkIG9mIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbiBwYWdlcykgb3IKKyMgc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KKworIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZAorIyB1bmlvbnMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyB3aWxsIGJlIHNob3duIGlubGluZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyBvZiB0aGUgc2NvcGUgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZCAoaS5lLiBmaWxlLCBuYW1lc3BhY2UsIG9yIGdyb3VwCisjIGRvY3VtZW50YXRpb24pLCBwcm92aWRlZCB0aGlzIHNjb3BlIGlzIGRvY3VtZW50ZWQuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpLAorIyBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zIGFyZSBzaG93biBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZCBNYW4KKyMgcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4KKworSU5MSU5FX1NJTVBMRV9TVFJVQ1RTICA9IE5PCisKKyMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtCisjIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbworIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QKKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5CisjIGJlIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKworVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IE5PCisKKyMgVGhlIFNZTUJPTF9DQUNIRV9TSVpFIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGNhY2hlIHVzZSB0bworIyBkZXRlcm1pbmUgd2hpY2ggc3ltYm9scyB0byBrZWVwIGluIG1lbW9yeSBhbmQgd2hpY2ggdG8gZmx1c2ggdG8gZGlzay4KKyMgV2hlbiB0aGUgY2FjaGUgaXMgZnVsbCwgbGVzcyBvZnRlbiB1c2VkIHN5bWJvbHMgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2suCisjIEZvciBzbWFsbCB0byBtZWRpdW0gc2l6ZSBwcm9qZWN0cyAoPDEwMDAgaW5wdXQgZmlsZXMpIHRoZSBkZWZhdWx0IHZhbHVlIGlzCisjIHByb2JhYmx5IGdvb2QgZW5vdWdoLiBGb3IgbGFyZ2VyIHByb2plY3RzIGEgdG9vIHNtYWxsIGNhY2hlIHNpemUgY2FuIGNhdXNlCisjIGRveHlnZW4gdG8gYmUgYnVzeSBzd2FwcGluZyBzeW1ib2xzIHRvIGFuZCBmcm9tIGRpc2sgbW9zdCBvZiB0aGUgdGltZQorIyBjYXVzaW5nIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgcGVuYWx0eS4KKyMgSWYgdGhlIHN5c3RlbSBoYXMgZW5vdWdoIHBoeXNpY2FsIG1lbW9yeSBpbmNyZWFzaW5nIHRoZSBjYWNoZSB3aWxsIGltcHJvdmUgdGhlCisjIHBlcmZvcm1hbmNlIGJ5IGtlZXBpbmcgbW9yZSBzeW1ib2xzIGluIG1lbW9yeS4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB3b3JrcyBvbgorIyBhIGxvZ2FyaXRobWljIHNjYWxlIHNvIGluY3JlYXNpbmcgdGhlIHNpemUgYnkgb25lIHdpbGwgcm91Z2hseSBkb3VibGUgdGhlCisjIG1lbW9yeSB1c2FnZS4gVGhlIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcyBmb3JtdWxhOgorIyAyXigxNitTWU1CT0xfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLAorIyBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2ID0gNjU1MzYgc3ltYm9scy4KKworI1NZTUJPTF9DQUNIRV9TSVpFICAgICAgPSAwCisKKyMgU2ltaWxhciB0byB0aGUgU1lNQk9MX0NBQ0hFX1NJWkUgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlCisjIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbgorIyB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZQorIyBzYW1lIHN5bWJvbCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gdGhlIGNvZGUsIGRveHlnZW4ga2VlcHMgYSBjYWNoZSBvZgorIyBwcmUtcmVzb2x2ZWQgc3ltYm9scy4gSWYgdGhlIGNhY2hlIGlzIHRvbyBzbWFsbCBkb3h5Z2VuIHdpbGwgYmVjb21lIHNsb3dlci4KKyMgSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcworIyBmb3JtdWxhOiAyXigxNitMT09LVVBfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZSBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLAorIyBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2ID0gNjU1MzYgc3ltYm9scy4KKworTE9PS1VQX0NBQ0hFX1NJWkUgICAgICA9IDEKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbgorIyBkb2N1bWVudGF0aW9uIGFyZSBkb2N1bWVudGVkLCBldmVuIGlmIG5vIGRvY3VtZW50YXRpb24gd2FzIGF2YWlsYWJsZS4KKyMgUHJpdmF0ZSBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcworIyB0aGUgRVhUUkFDVF9QUklWQVRFIGFuZCBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcworIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwKKyMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUKKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMgY2xhc3NlcyAoYW5kIHN0cnVjdHMpCisjIGRlZmluZWQgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgSWYgc2V0IHRvIE5PIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBZRVMKKworIyBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgZm9yIE9iamVjdGl2ZS1DIGNvZGUuIFdoZW4gc2V0IHRvIFlFUyBsb2NhbAorIyBtZXRob2RzLCB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluCisjIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBvbmx5IG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQuCisKK0VYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTworCisjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlcyB3aWxsIGJlCisjIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZAorIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlCisjIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZS4gQnkgZGVmYXVsdAorIyBhbm9ueW1vdXMgbmFtZXNwYWNlcyBhcmUgaGlkZGVuLgorCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgb2YgZG9jdW1lbnRlZCBjbGFzc2VzLCBmaWxlcyBvciBuYW1lc3BhY2VzLgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisjIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbiBzZWN0aW9uIGlzIGdlbmVyYXRlZC4KKyMgVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorCitISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMKKyMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisKK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBOTworCisjIElmIHRoZSBISURFX0ZSSUVORF9DT01QT1VORFMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbAorIyBmcmllbmQgKGNsYXNzfHN0cnVjdHx1bmlvbikgZGVjbGFyYXRpb25zLgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4KKworSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PCisKKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbnkKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQorIyBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suCisKK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24KKyMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldAorIyB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gdGhlIGRvY3VtZW50YXRpb24gd2lsbCBiZSBleGNsdWRlZC4KKyMgU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gRG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUKKyMgZmlsZSBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbgorIyB3aWxsIHNob3cgbWVtYmVycyB3aXRoIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMgdGhlIHNjb3BlIHdpbGwgYmUgaGlkZGVuLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU0hPV19JTkNMVURFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuCisjIHdpbGwgcHV0IGEgbGlzdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uCisjIG9mIHRoYXQgZmlsZS4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4KKyMgd2lsbCBsaXN0IGluY2x1ZGUgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uCisjIHJhdGhlciB0aGFuIHdpdGggc2hhcnAgYnJhY2tldHMuCisKK0ZPUkNFX0xPQ0FMX0lOQ0xVREVTICAgPSBOTworCisjIElmIHRoZSBJTkxJTkVfSU5GTyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYSB0YWcgW2lubGluZV0KKyMgaXMgaW5zZXJ0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4KKyMgd2lsbCBzb3J0IHRoZSAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycworIyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluCisjIGRlY2xhcmF0aW9uIG9yZGVyLgorCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyBicmllZiBkb2N1bWVudGF0aW9uIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseQorIyBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4KKyMgZGVjbGFyYXRpb24gb3JkZXIuCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIHNvcnQgdGhlIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0CisjIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkKKyMgdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieQorIyBTT1JUX01FTUJFUl9ET0NTIGFuZCBTT1JUX0JSSUVGX0RPQ1MuCisjIFRoaXMgdGFnIHdpbGwgYmUgaWdub3JlZCBmb3IgYnJpZWYgZG9jcyBpZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PCisjIGFuZCBpZ25vcmVkIGZvciBkZXRhaWxlZCBkb2NzIGlmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PLgorCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8KKworIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyBoaWVyYXJjaHkgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpCisjIHRoZSBncm91cCBuYW1lcyB3aWxsIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLgorCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfQllfU0NPUEVfTkFNRSB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZQorIyBzb3J0ZWQgYnkgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvCisjIE5PICh0aGUgZGVmYXVsdCksIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwKKyMgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZQorIyBhbHBoYWJldGljYWwgbGlzdC4KKworU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PCisKKyMgSWYgdGhlIFNUUklDVF9QUk9UT19NQVRDSElORyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgZG94eWdlbiBmYWlscyB0bworIyBkbyBwcm9wZXIgdHlwZSByZXNvbHV0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gaXQgd2lsbCByZWplY3QgYQorIyBtYXRjaCBiZXR3ZWVuIHRoZSBwcm90b3R5cGUgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIG1lbWJlciBmdW5jdGlvbiBldmVuCisjIGlmIHRoZXJlIGlzIG9ubHkgb25lIGNhbmRpZGF0ZSBvciBpdCBpcyBvYnZpb3VzIHdoaWNoIGNhbmRpZGF0ZSB0byBjaG9vc2UKKyMgYnkgZG9pbmcgYSBzaW1wbGUgc3RyaW5nIG1hdGNoLiBCeSBkaXNhYmxpbmcgU1RSSUNUX1BST1RPX01BVENISU5HIGRveHlnZW4KKyMgd2lsbCBzdGlsbCBhY2NlcHQgYSBtYXRjaCBiZXR3ZWVuIHByb3RvdHlwZSBhbmQgaW1wbGVtZW50YXRpb24gaW4gc3VjaCBjYXNlcy4KKworU1RSSUNUX1BST1RPX01BVENISU5HICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RPRE9MSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSB0b2RvIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8KKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfVEVTVExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcgorIyBkaXNhYmxlIChOTykgdGhlIHRlc3QgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdAorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9CVUdMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSBidWcgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcYnVnCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcKKyMgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMKKworIyBUaGUgRU5BQkxFRF9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsCisjIGRvY3VtZW50YXRpb24gc2VjdGlvbnMsIG1hcmtlZCBieSBcaWYgc2VjdGlvbm5hbWUgLi4uIFxlbmRpZi4KKworRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9CisKKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMKKyMgdGhlIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyBjb25zaXN0cyBvZiBmb3IgaXQgdG8gYXBwZWFyIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZAorIyBoZXJlIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuCisjIFRoZSBhcHBlYXJhbmNlIG9mIHRoZSBpbml0aWFsaXplciBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplcgorIyBjb21tYW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKKworIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQKKyMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKworIyBTZXQgdGhlIFNIT1dfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEZpbGVzIHBhZ2UuCisjIFRoaXMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZQorIyBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLiBUaGUgZGVmYXVsdCBpcyBZRVMuCisKK1NIT1dfRklMRVMgICAgICAgICAgICAgPSBZRVMKKworIyBTZXQgdGhlIFNIT1dfTkFNRVNQQUNFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUKKyMgTmFtZXNwYWNlcyBwYWdlLgorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBOYW1lc3BhY2VzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4CisjIGFuZCBmcm9tIHRoZSBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLiBUaGUgZGVmYXVsdCBpcyBZRVMuCisKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCA8Y29tbWFuZD4gPGlucHV0LWZpbGU+LCB3aGVyZSA8Y29tbWFuZD4gaXMgdGhlIHZhbHVlIG9mCisjIHRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlCisjIHByb3ZpZGVkIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQKKyMgaXMgdXNlZCBhcyB0aGUgZmlsZSB2ZXJzaW9uLiBTZWUgdGhlIG1hbnVhbCBmb3IgZXhhbXBsZXMuCisKK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPQorCisjIFRoZSBMQVlPVVRfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxheW91dCBmaWxlIHdoaWNoIHdpbGwgYmUgcGFyc2VkCisjIGJ5IGRveHlnZW4uIFRoZSBsYXlvdXQgZmlsZSBjb250cm9scyB0aGUgZ2xvYmFsIHN0cnVjdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCisjIG91dHB1dCBmaWxlcyBpbiBhbiBvdXRwdXQgZm9ybWF0IGluZGVwZW5kZW50IHdheS4gVG8gY3JlYXRlIHRoZSBsYXlvdXQgZmlsZQorIyB0aGF0IHJlcHJlc2VudHMgZG94eWdlbidzIGRlZmF1bHRzLCBydW4gZG94eWdlbiB3aXRoIHRoZSAtbCBvcHRpb24uCisjIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgZmlsZSBuYW1lIGFmdGVyIHRoZSBvcHRpb24sIGlmIG9taXR0ZWQKKyMgRG94eWdlbkxheW91dC54bWwgd2lsbCBiZSB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgZmlsZS4KKworTEFZT1VUX0ZJTEUgICAgICAgICAgICA9ICVTUkNfRElSLy4uL2RveHlnZW4vRG94eWdlbkxheW91dC54bWwKKworCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMKKyMgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyBkYXRhLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZQorIyAuYmliIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFVzaW5nIHRoaXMgY29tbWFuZAorIyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbworIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLiBGb3IgTGFUZVggdGhlIHN0eWxlCisjIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcworIyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlIHNlYXJjaCBwYXRoLgorCitDSVRFX0JJQl9GSUxFUyAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZAorIyBieSBkb3h5Z2VuLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rCisjIE5PIGlzIHVzZWQuCisKK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKKworIyBJZiBXQVJOX0lGX1VORE9DVU1FTlRFRCBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncworIyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcgd2lsbAorIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gTk8KKworIyBJZiBXQVJOX0lGX0RPQ19FUlJPUiBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUKKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdAorIyBkb24ndCBleGlzdCBvciB1c2luZyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworCisjIFRoZSBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yCisjIGZ1bmN0aW9ucyB0aGF0IGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzCisjIG9yIHJldHVybiB2YWx1ZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dAorIyB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mCisjIGRvY3VtZW50YXRpb24uCisKK1dBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBZRVMKKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0CisjIGRveHlnZW4gY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0CisjIHRhZ3MsIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlCisjIHdhcm5pbmcgb3JpZ2luYXRlZCBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluCisjICR2ZXJzaW9uLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZAorIyBiZSBvYnRhaW5lZCB2aWEgRklMRV9WRVJTSU9OX0ZJTFRFUikKKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZworIyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuCisjIHRvIHN0ZGVyci4KKworV0FSTl9MT0dGSUxFICAgICAgICAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCisjIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSAibXlmaWxlLmNwcCIgb3IKKyMgZGlyZWN0b3JpZXMgbGlrZSAiL3Vzci9zcmMvbXlwcm9qZWN0Ii4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHdpdGggc3BhY2VzLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gJVNSQ19ESVIvbGliL2xpYm9tY2lzdmMvb21jaV9zdmNfYXBpLmRveCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJU9NQ0lfTU9ERUxfRElSL29tY2lfbW9kZWwuZG94IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9saWIvbGlib21jaXN2Yy9vbWNpX3N2Yy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9saWIvbGlib21jaXN2Yy9vbWNpX3N2Y19zdWJfdGVybS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9saWIvbGlib21jaXN2Yy9vbWNpX3N2Y19mbG93LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICVPTUNJX01PREVMX0RJUi9vbWNpX21vZGVsX2lkcy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlT01DSV9NT0RFTF9ESVIvb21jaV9tb2RlbF90eXBlcy5oCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZXMKKyMgdGhhdCBkb3h5Z2VuIHBhcnNlcy4gSW50ZXJuYWxseSBkb3h5Z2VuIHVzZXMgdGhlIFVURi04IGVuY29kaW5nLCB3aGljaCBpcworIyBhbHNvIHRoZSBkZWZhdWx0IGlucHV0IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdAorIyBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYgZm9yCisjIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KKworSU5QVVRfRU5DT0RJTkcgICAgICAgICA9IFVURi04CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBGSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAKKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdAorIyBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6CisjICouYyAqLmNjICouY3h4ICouY3BwICouYysrICouZCAqLmphdmEgKi5paSAqLml4eCAqLmlwcCAqLmkrKyAqLmlubCAqLmggKi5oaAorIyAqLmh4eCAqLmhwcCAqLmgrKyAqLmlkbCAqLm9kbCAqLmNzICoucGhwICoucGhwMyAqLmluYyAqLm0gKi5tbSAqLmRveCAqLnB5CisjICouZjkwICouZiAqLmZvciAqLnZoZCAqLnZoZGwKKworRklMRV9QQVRURVJOUyAgICAgICAgICA9ICouYyAqLmggKi5jcHAKKworIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMKKyMgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uCisjIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworUkVDVVJTSVZFICAgICAgICAgICAgICA9IFlFUworCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcworIyBydW4uCisKK0VYQ0xVREUgICAgICAgICAgICAgICAgPSAlU1JDX0RJUi9jb21tb24vb3NfYWJzdHJhY3Rpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL2NvbW1vbi9kYl9lbmdpbmUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL2NvbW1vbi9jbGkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL2NvbW1vbi9kZXZfbG9nIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9jb21tb24vdXRpbHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL2NvbW1vbi9jb25maWcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL2NvcmUvdXRpbC9vYW0vZXBvbl9vYW1fY2xpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9jb3JlL3V0aWwvb2FtL2Vwb25fb2FtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9jb3JlL3V0aWwvb2FtL2NvbW1vbl9lcG9uX29hbSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvY29yZS91dGlsL29hbS9lb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL2NvbW1vbi9tb2RlbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvb2ZwYWwvbG9jaQorCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlIHN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQKKyMgZnJvbSB0aGUgaW5wdXQuCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4gTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQKKyMgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMKKyMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAqL3Rlc3QvKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKkV4YW1wbGVzKgorCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLAorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0CisKK0VYQ0xVREVfU1lNQk9MUyAgICAgICAgPQorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZQorIyB0aGUgXGluY2x1ZGUgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPQorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcAorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0CisjIGJsYW5rIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPQorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlCisjIGNvbW1hbmRzIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KKworIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gaW1hZ2UgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZQorIyB0aGUgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0KKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPgorIyBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4KKyMgaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyIHByb2dyYW0gd3JpdGVzCisjIHRvIHN0YW5kYXJkIG91dHB1dC4KKyMgSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcgd2lsbCBiZQorIyBpZ25vcmVkLgorCitJTlBVVF9GSUxURVIgICAgICAgICAgID0KKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuCisjIGJhc2lzLgorIyBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guCisjIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06CisjIHBhdHRlcm49ZmlsdGVyIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSBvciBpZgorIyBub24gb2YgdGhlIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0KKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlCisjIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KKworIyBUaGUgRklMVEVSX1NPVVJDRV9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBzb3VyY2UgZmlsdGVycyBwZXIgZmlsZQorIyBwYXR0ZXJuLiBBIHBhdHRlcm4gd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBmb3IgRklMVEVSX1BBVFRFUk4gKGlmIGFueSkKKyMgYW5kIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGlzYWJsZSBzb3VyY2UgZmlsdGVyaW5nIGZvciBhIHNwZWNpZmljIHBhdHRlcm4KKyMgdXNpbmcgKi5leHQ9IChzbyB3aXRob3V0IG5hbWluZyBhIGZpbHRlcikuIFRoaXMgb3B0aW9uIG9ubHkgaGFzIGVmZmVjdCB3aGVuCisjIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgZW5hYmxlZC4KKworRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gc291cmNlIGJyb3dzaW5nCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB3aWxsCisjIGJlIGdlbmVyYXRlZC4gRG9jdW1lbnRlZCBlbnRpdGllcyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGVzZSBzb3VyY2VzLgorIyBOb3RlOiBUbyBnZXQgcmlkIG9mIGFsbCBzb3VyY2UgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dCwgbWFrZSBzdXJlIGFsc28KKyMgVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keQorIyBvZiBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgZGlyZWN0bHkgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTworCisjIFNldHRpbmcgdGhlIFNUUklQX0NPREVfQ09NTUVOVFMgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgaW5zdHJ1Y3QKKyMgZG94eWdlbiB0byBoaWRlIGFueSBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlCisjIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMKKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkCisjIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMKKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzCisjIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTworCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkKKyMgYW5kIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20KKyMgZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbAorIyBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4KKyMgT3RoZXJ3aXNlIHRoZXkgd2lsbCBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLgorCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCisKKyMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlCisjIHdpbGwgcG9pbnQgdG8gdGhlIEhUTUwgZ2VuZXJhdGVkIGJ5IHRoZSBodGFncygxKSB0b29sIGluc3RlYWQgb2YgZG94eWdlbgorIyBidWlsdC1pbiBzb3VyY2UgYnJvd3Nlci4gVGhlIGh0YWdzIHRvb2wgaXMgcGFydCBvZiBHTlUncyBnbG9iYWwgc291cmNlCisjIHRhZ2dpbmcgc3lzdGVtIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdQorIyB3aWxsIG5lZWQgdmVyc2lvbiA0LjguNiBvciBoaWdoZXIuCisKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3IKKyMgd2hpY2ggYW4gaW5jbHVkZSBpcyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisKK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXgKKyMgb2YgYWxsIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QKKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBJZiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGlzIGVuYWJsZWQgKHNlZSBBTFBIQUJFVElDQUxfSU5ERVgpIHRoZW4KKyMgdGhlIENPTFNfSU5fQUxQSEFfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zCisjIGluIHdoaWNoIHRoaXMgbGlzdCB3aWxsIGJlIHNwbGl0IChjYW4gYmUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFsxLi4yMF0pCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbAorIyBjbGFzc2VzIHdpbGwgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LgorIyBUaGUgSUdOT1JFX1BSRUZJWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBwcmVmaXhlcyB0aGF0CisjIHNob3VsZCBiZSBpZ25vcmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisKK0lHTk9SRV9QUkVGSVggICAgICAgICAgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIEhUTUwgb3V0cHV0LgorCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCisKKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGh0bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gaHRtbAorCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlIChmb3IgZXhhbXBsZTogLmh0bSwucGhwLC5hc3ApLiBJZiBpdCBpcyBsZWZ0IGJsYW5rCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBmaWxlcyB3aXRoIC5odG1sIGV4dGVuc2lvbi4KKworSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sCisKKyMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBoZWFkZXIgZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGEgY3VzdG9tIGhlYWRlciB5b3UgYXJlIHJlc3BvbnNpYmxlCisjICBmb3IgdGhlIHByb3BlciBpbmNsdXNpb24gb2YgYW55IHNjcmlwdHMgYW5kIHN0eWxlIHNoZWV0cyB0aGF0IGRveHlnZW4KKyMgbmVlZHMsIHdoaWNoIGlzIGRlcGVuZGVudCBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQuCisjIEl0IGlzIGFkdmlzZWQgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IGhlYWRlciB1c2luZyAiZG94eWdlbiAtdyBodG1sCisjIGhlYWRlci5odG1sIGZvb3Rlci5odG1sIHN0eWxlc2hlZXQuY3NzIFlvdXJDb25maWdGaWxlIiBhbmQgdGhlbiBtb2RpZnkKKyMgdGhhdCBoZWFkZXIuIE5vdGUgdGhhdCB0aGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkKKyMgaGF2ZSB0byByZWRvIHRoaXMgd2hlbiB1cGdyYWRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIGRveHlnZW4gb3Igd2hlbgorIyBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBzdWNoIGFzIEdFTkVSQVRFX1RSRUVWSUVXIQorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gJVNSQ19ESVIvLi4vZG94eWdlbi9oZWFkZXIuaHRtbAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgZm9vdGVyIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgZm9vdGVyLgorCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0gJVNSQ19ESVIvLi4vZG94eWdlbi9mb290ZXIuaHRtbAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nCisjIHN0eWxlIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8KKyMgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LiBOb3RlIHRoYXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlCisjIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBhcyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcworIyB0YWcgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZSBvYnNvbGV0ZS4KKworSFRNTF9TVFlMRVNIRUVUICAgICAgICA9CisKKyMgVGhlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhZGRpdGlvbmFsCisjIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcgc3R5bGUgc2hlZXQgdGhhdCBpcyBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQKKyMgc3R5bGUgc2hlZXRzIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZQorIyBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUCisjIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvciBtb3JlCisjIHJvYnVzdCBhZ2FpbnN0IGZ1dHVyZSB1cGRhdGVzLiBEb3h5Z2VuIHdpbGwgY29weSB0aGUgc3R5bGUgc2hlZXQgZmlsZSB0bworIyB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKworSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9CisKKyMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUKKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUKKyMgJHJlbHBhdGgkIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UKKyMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQKKyMgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuCisKK0hUTUxfRVhUUkFfRklMRVMgICAgICAgPQorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfSFVFIHRhZyBjb250cm9scyB0aGUgY29sb3Igb2YgdGhlIEhUTUwgb3V0cHV0LgorIyBEb3h5Z2VuIHdpbGwgYWRqdXN0IHRoZSBjb2xvcnMgaW4gdGhlIHN0eWxlIHNoZWV0IGFuZCBiYWNrZ3JvdW5kIGltYWdlcworIyBhY2NvcmRpbmcgdG8gdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsCisjIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMgRm9yIGluc3RhbmNlIHRoZSB2YWx1ZSAwIHJlcHJlc2VudHMgcmVkLCA2MCBpcyB5ZWxsb3csIDEyMCBpcyBncmVlbiwKKyMgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4KKyMgVGhlIGFsbG93ZWQgcmFuZ2UgaXMgMCB0byAzNTkuCisKK0hUTUxfQ09MT1JTVFlMRV9IVUUgICAgPSAyMjAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX1NBVCB0YWcgY29udHJvbHMgdGhlIHB1cml0eSAob3Igc2F0dXJhdGlvbikgb2YKKyMgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIEZvciBhIHZhbHVlIG9mIDAgdGhlIG91dHB1dCB3aWxsIHVzZQorIyBncmF5c2NhbGVzIG9ubHkuIEEgdmFsdWUgb2YgMjU1IHdpbGwgcHJvZHVjZSB0aGUgbW9zdCB2aXZpZCBjb2xvcnMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvCisjIHRoZSBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cKKyMgMTAwIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UKKyMgdGhlIG91dHB1dCBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsCisjIHNvIDgwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwKKyMgYW5kIDEwMCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGdhbW1hLgorCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODAKKworIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nCisjIHRoaXMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLgorCitIVE1MX1RJTUVTVEFNUCAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhUTUxfRFlOQU1JQ19TRUNUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBnZW5lcmF0ZWQgSFRNTAorIyBkb2N1bWVudGF0aW9uIHdpbGwgY29udGFpbiBzZWN0aW9ucyB0aGF0IGNhbiBiZSBoaWRkZW4gYW5kIHNob3duIGFmdGVyIHRoZQorIyBwYWdlIGhhcyBsb2FkZWQuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTworCisjIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YKKyMgZW50cmllcyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyCisjIGNhbiBleHBhbmQgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQKKyMgdGhlIHRyZWUgdG8gc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZQorIyB2aXNpYmxlICh1bmxlc3MgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLgorIyBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkKKyMgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzCisjIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQgdHJlZSBieSBkZWZhdWx0LgorCitIVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcworIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMKKyMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgaW50cm9kdWNlZCB3aXRoIE9TWCAxMC41IChMZW9wYXJkKS4KKyMgVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIE1ha2VmaWxlIGluIHRoZQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbiB0aGF0CisjIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQKKyMgaXQgYXQgc3RhcnR1cC4KKyMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwKKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZQorIyBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZQorIyBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlciAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkKKyMgY2FuIGJlIGdyb3VwZWQuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQKKyMgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEKKyMgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbgorIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorCitET0NTRVRfQlVORExFX0lEICAgICAgID0gd3d3LmJyb2FkY29tLmNvbQorCisjIFdoZW4gR0VORVJBVEVfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkKKyMgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUKKyMgc3R5bGUgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4KKworRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IHd3dy5icm9hZGNvbS5jb20KKworIyBUaGUgR0VORVJBVEVfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLgorCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gQnJvYWRjb20gTGltaXRlZAorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcworIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciB0b29scyBsaWtlIHRoZQorIyBNaWNyb3NvZnQgSFRNTCBoZWxwIHdvcmtzaG9wIHRvIGdlbmVyYXRlIGEgY29tcGlsZWQgSFRNTCBoZWxwIGZpbGUgKC5jaG0pCisjIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fRklMRSB0YWcgY2FuCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobSBmaWxlLiBZb3UKKyMgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlCisjIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZgorIyB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIChoaGMuZXhlKS4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCisKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEdFTkVSQVRFX0NISSBmbGFnCisjIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZCAoWUVTKSBvciB0aGF0CisjIGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBDSE1fSU5ERVhfRU5DT0RJTkcKKyMgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKGhoayksIGNvbnRlbnQgKGhoYykgYW5kIHByb2plY3QgZmlsZQorIyBjb250ZW50LgorCitDSE1fSU5ERVhfRU5DT0RJTkcgICAgID0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBCSU5BUllfVE9DIGZsYWcKKyMgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgYQorIyBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKE5PKSBpbiB0aGUgLmNobSBmaWxlLgorCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KKworIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycworIyB0byB0aGUgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3LgorCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQKKyMgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhCisjIFF0IENvbXByZXNzZWQgSGVscCAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuCisjIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0byB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorCitRQ0hfRklMRSAgICAgICAgICAgICAgID0KKworIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZworIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlCisKK1FIUF9OQU1FU1BBQ0UgICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZworIyBRdCBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC1mb2xkZXJzCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiBRSFBfQ1VTVF9GSUxURVJfTkFNRSBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbSBmaWx0ZXIgdG8KKyMgYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLWZpbHRlcnMKKworUUhQX0NVU1RfRklMVEVSX05BTUUgICA9CisKKyMgVGhlIFFIUF9DVVNUX0ZJTFRfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUKKyMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycyI+CisjIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbSBGaWx0ZXJzPC9hPi4KKworUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9CisKKyMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMKKyMgcHJvamVjdCdzCisjIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuCisjIDxhIGhyZWY9Imh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMiPgorIyBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlczwvYT4uCisKK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPQorCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbgorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIFF0J3MgcWhlbHBnZW5lcmF0b3IuCisjIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUgZ2VuZXJhdGVkCisjIC5xaHAgZmlsZS4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0VDTElQU0VIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzCisjICB3aWxsIGJlIGdlbmVyYXRlZCwgd2hpY2ggdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgZm9ybSBhbiBFY2xpcHNlIGhlbHAKKyMgcGx1Z2luLiBUbyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cworIyBtZW51IGluIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTAorIyBmaWxlcyBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YKKyMgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcworIyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlCisjIHRoZSBoZWxwIGFwcGVhcnMuCisKK0dFTkVSQVRFX0VDTElQU0VIRUxQICAgPSBOTworCisjIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbgorIyB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIHNob3VsZCBhbHNvIGhhdmUKKyMgdGhpcyBuYW1lLgorCitFQ0xJUFNFX0RPQ19JRCAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKQorIyBhdCB0b3Agb2YgZWFjaCBIVE1MIHBhZ2UuIFRoZSB2YWx1ZSBOTyAodGhlIGRlZmF1bHQpIGVuYWJsZXMgdGhlIGluZGV4IGFuZAorIyB0aGUgdmFsdWUgWUVTIGRpc2FibGVzIGl0LiBTaW5jZSB0aGUgdGFicyBoYXZlIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZQorIyBuYXZpZ2F0aW9uIHRyZWUgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gTk8gaWYgeW91IGFscmVhZHkgc2V0CisjIEdFTkVSQVRFX1RSRUVWSUVXIHRvIFlFUy4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9UUkVFVklFVyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSB0cmVlLWxpa2UgaW5kZXgKKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uCisjIElmIHRoZSB0YWcgdmFsdWUgaXMgc2V0IHRvIFlFUywgYSBzaWRlIHBhbmVsIHdpbGwgYmUgZ2VuZXJhdGVkCisjIGNvbnRhaW5pbmcgYSB0cmVlLWxpa2UgaW5kZXggc3RydWN0dXJlIChqdXN0IGxpa2UgdGhlIG9uZSB0aGF0CisjIGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cworIyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQgKGkuZS4gYW55IG1vZGVybiBicm93c2VyKS4KKyMgV2luZG93cyB1c2VycyBhcmUgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUgSFRNTCBoZWxwIGZlYXR1cmUuCisjIFNpbmNlIHRoZSB0cmVlIGJhc2ljYWxseSBoYXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHRhYiBpbmRleCB5b3UKKyMgY291bGQgY29uc2lkZXIgdG8gc2V0IERJU0FCTEVfSU5ERVggdG8gTk8gd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4KKworR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IFlFUworCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMKKyMgKHJhbmdlIFswLDEuLjIwXSkgdGhhdCBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtCisjIHZhbHVlcyBmcm9tIGFwcGVhcmluZyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4KKworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKKworIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZQorIyB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUKKyMgaXMgc2hvd24uCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBXaGVuIHRoZSBFWFRfTElOS1NfSU5fV0lORE9XIG9wdGlvbiBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBvcGVuCisjIGxpbmtzIHRvIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKworRVhUX0xJTktTX0lOX1dJTkRPVyAgICA9IE5PCisKKyMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhdGV4IGZvcm11bGFzIGluY2x1ZGVkCisjIGFzIGltYWdlcyBpbiB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyAxMC4gTm90ZSB0aGF0CisjIHdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bCBkb3h5Z2VuIHJ1biB5b3UgbmVlZAorIyB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeQorIyB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTAKKworIyBVc2UgdGhlIEZPUk1VTEFfVFJBTlBBUkVOVCB0YWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGZvciBmb3JtdWxhcyBhcmUgdHJhbnNwYXJlbnQgUE5Hcy4gVHJhbnNwYXJlbnQgUE5HcyBhcmUKKyMgbm90IHN1cHBvcnRlZCBwcm9wZXJseSBmb3IgSUUgNi4wLCBidXQgYXJlIHN1cHBvcnRlZCBvbiBhbGwgbW9kZXJuIGJyb3dzZXJzLgorIyBOb3RlIHRoYXQgd2hlbiBjaGFuZ2luZyB0aGlzIG9wdGlvbiB5b3UgbmVlZCB0byBkZWxldGUgYW55IGZvcm1fKi5wbmcgZmlsZXMKKyMgaW4gdGhlIEhUTUwgb3V0cHV0IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKworRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUworCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4CisjIChzZWUgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUKKyMgcmVuZGVyaW5nIGluc3RlYWQgb2YgdXNpbmcgcHJlcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdAorIyBoYXZlIExhVGVYIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MCisjIG91dHB1dC4gV2hlbiBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZAorIyBjb25maWd1cmUgdGhlIHBhdGggdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uCisKK1VTRV9NQVRISkFYICAgICAgICAgICAgPSBOTworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbgorIyBkaXJlY3Rvcnkgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4CisjIGRpcmVjdG9yeSBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4KKyMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8KKyMgdGhlIE1hdGhKYXggQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0CisjIGluc3RhbGxpbmcgTWF0aEpheC4KKyMgSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsCisjIGNvcHkgb2YgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuCisKK01BVEhKQVhfUkVMUEFUSCAgICAgICAgPSBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0CisKKyMgVGhlIE1BVEhKQVhfRVhURU5TSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgTWF0aEpheCBleHRlbnNpb24KKyMgbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuCisKK01BVEhKQVhfRVhURU5TSU9OUyAgICAgPQorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94CisjIGZvciB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0CisjIGFuZCBESFRNTCBhbmQgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZworIyBIVE1MIGhlbHAgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cworIyAoR0VORVJBVEVfRE9DU0VUKSB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZAorIyB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lCisjIGNhbiBiZSBzbG93LCB0aGVuIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUKKyMgaW1wbGVtZW50ZWQgdXNpbmcgYSBQSFAgZW5hYmxlZCB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYXQgdGhlIHdlYiBjbGllbnQKKyMgdXNpbmcgSmF2YXNjcmlwdC4gRG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBzZWFyY2ggUEhQIHNjcmlwdCBhbmQgaW5kZXgKKyMgZmlsZSB0byBwdXQgb24gdGhlIHdlYiBzZXJ2ZXIuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIHNlcnZlcgorIyBiYXNlZCBhcHByb2FjaCBpcyB0aGF0IGl0IHNjYWxlcyBiZXR0ZXIgdG8gbGFyZ2UgcHJvamVjdHMgYW5kIGFsbG93cworIyBmdWxsIHRleHQgc2VhcmNoLiBUaGUgZGlzYWR2YW50YWdlcyBhcmUgdGhhdCBpdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBzZXR1cAorIyBhbmQgZG9lcyBub3QgaGF2ZSBsaXZlIHNlYXJjaGluZyBjYXBhYmlsaXRpZXMuCisKK1NFUlZFUl9CQVNFRF9TRUFSQ0ggICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgTGF0ZXggb3V0cHV0LgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUKKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlCisjIGludm9rZWQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgY29tbWFuZCBuYW1lLgorIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvcgorIyBnZW5lcmF0aW5nIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUKKyMgTWFrZWZpbGUgdGhhdCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8KKyMgZ2VuZXJhdGUgaW5kZXggZm9yIExhVGVYLiBJZiBsZWZ0IGJsYW5rIGBtYWtlaW5kZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUKKyMgZGVmYXVsdCBjb21tYW5kIG5hbWUuCisKK01BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKKworIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QKKyMgTGFUZVggZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bworIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQKKyMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBsZXR0ZXIsIGxlZ2FsIGFuZAorIyBleGVjdXRpdmUuIElmIGxlZnQgYmxhbmsgYTR3aWRlIHdpbGwgYmUgdXNlZC4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQorCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbmFtZXMgb2YgTGFUZVgKKyMgcGFja2FnZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4KKworRVhUUkFfUEFDS0FHRVMgICAgICAgICA9CisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IKKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsCisjIHRoZSBmaXJzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPQorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yCisjIHRoZSBnZW5lcmF0ZWQgbGF0ZXggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlcgorIyB0aGUgbGFzdCBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGZvb3Rlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0ZPT1RFUiAgICAgICAgICAgPQorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkCisjIGlzIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIHBkZiAodXNpbmcgcHMycGRmKS4gVGhlIHBkZiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMKKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBwZGZsYXRleCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZgorIyBwbGFpbiBsYXRleCBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorCitVU0VfUERGTEFURVggICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcXGJhdGNobW9kZS4KKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcAorIyBydW5uaW5nIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuCisjIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgTEFURVhfSElERV9JTkRJQ0VTIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90CisjIGluY2x1ZGUgdGhlIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKQorIyBpbiB0aGUgb3V0cHV0LgorCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KKworIyBJZiBMQVRFWF9TT1VSQ0VfQ09ERSBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUKKyMgc291cmNlIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3MKKyMgc3VjaCBhcyBTT1VSQ0VfQlJPV1NFUi4KKworTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUKKyMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFRoZSBkZWZhdWx0IHN0eWxlIGlzICJwbGFpbiIuIFNlZQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgorCitMQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQKKyMgVGhlIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdmVyeSBwcmV0dHkgd2l0aAorIyBvdGhlciBSVEYgcmVhZGVycyBvciBlZGl0b3JzLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHJ0Zicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0CisjIFJURiBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQKKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLgorIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBXT1JEIG9yIG90aGVyCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLgorIyBOb3RlOiB3b3JkcGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCisKKyMgTG9hZCBzdHlsZSBzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncworIyBjb25maWcgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlCisjIHJlcGxhY2VtZW50cywgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPQorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuCisjIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4KKworUlRGX0VYVEVOU0lPTlNfRklMRSAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYG1hbicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8KKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBEb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LAorIyB0aGVuIGl0IHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5CisjIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMKKyMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0IHRoZW0gdGhlIG1hbiBjb21tYW5kCisjIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuIFRoZSBkZWZhdWx0IGlzIE5PLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYHhtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBUaGUgWE1MX1NDSEVNQSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgc2NoZW1hLAorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKKyNYTUxfU0NIRU1BICAgICAgICAgICAgID0KKworIyBUaGUgWE1MX0RURCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBYTUwgRFRELAorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKKyNYTUxfRFREICAgICAgICAgICAgICAgID0KKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAorIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZworIyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQKKyMgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFhNTCBvdXRwdXQuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYW4gQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGF1dG9nZW4uc2YubmV0KSBmaWxlCisjIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsCisjIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZSBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzCisjIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZQorIyBtb21lbnQuCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZQorIyB0aGUgbmVjZXNzYXJ5IE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZQorIyB0byBnZW5lcmF0ZSBQREYgYW5kIERWSSBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlCisjIG5pY2VseSBmb3JtYXR0ZWQgc28gaXQgY2FuIGJlIHBhcnNlZCBieSBhIGh1bWFuIHJlYWRlci4KKyMgVGhpcyBpcyB1c2VmdWwKKyMgaWYgeW91IHdhbnQgdG8gdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLgorIyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhpcworIyB0YWcgaXMgc2V0IHRvIE5PIHRoZSBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIKKyMgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdCBqdXN0IHRoZSBzYW1lLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUKKyMgYXJlIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4KKyMgVGhpcyBpcyB1c2VmdWwgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lCisjIE1ha2VmaWxlIGRvbid0IG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGV2YWx1YXRlIGFsbCBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlCisjIGZpbGVzLgorCitFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybworIyBuYW1lcyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgY29uZGl0aW9uYWwKKyMgY29tcGlsYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQKKyMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMKKyMgdGhlbiB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUKKyMgUFJFREVGSU5FRCBhbmQgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGUgaW5jbHVkZXMgZmlsZXMKKyMgcG9pbnRlZCB0byBieSBJTkNMVURFX1BBVEggd2lsbCBiZSBzZWFyY2hlZCB3aGVuIGEgI2luY2x1ZGUgaXMgZm91bmQuCisKK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKKworIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieQorIyB0aGUgcHJlcHJvY2Vzc29yLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0KKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwKKyMgYmUgdXNlZC4KKworSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9CisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdAorIyBhcmUgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YKKyMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZQorIyBvciBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgPSBhcmUKKyMgb21pdHRlZCA9MSBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nCisjIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3IKKyMgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKworUFJFREVGSU5FRCAgICAgICAgICAgICA9IF9fYXR0cmlidXRlX18oeCk9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2NwbHVzcGx1cworCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gYW5kIEVYUEFORF9PTkxZX1BSRURFRiB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgdGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YgbWFjcm8gbmFtZXMgdGhhdCBzaG91bGQgYmUgZXhwYW5kZWQuCisjIFRoZSBtYWNybyBkZWZpbml0aW9uIHRoYXQgaXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgd2lsbCBiZSB1c2VkLgorIyBVc2UgdGhlIFBSRURFRklORUQgdGFnIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBtYWNybyBkZWZpbml0aW9uIHRoYXQKKyMgb3ZlcnJ1bGVzIHRoZSBkZWZpbml0aW9uIGZvdW5kIGluIHRoZSBzb3VyY2UgY29kZS4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9CisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbgorIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zCisjIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZSBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYQorIyBzZW1pY29sb24sIGJlY2F1c2UgdGhlc2Ugd2lsbCBjb25mdXNlIHRoZSBwYXJzZXIgaWYgbm90IHJlbW92ZWQuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uOjphZGRpdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZ2ZpbGVzLiBGb3IgZWFjaAorIyB0YWcgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUKKyMgZm9ybWF0IG9mIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6CisjCisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6CisjCisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KKyMgd2hlcmUgImxvYzEiIGFuZCAibG9jMiIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzCisjIG9yIFVSTHMuIE5vdGUgdGhhdCBlYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzCisjIE5PVCBpbmNsdWRlIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoCisjIGRveHlnZW4gaXMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KKworVEFHRklMRVMgICAgICAgICAgICAgICA9CisKKyMgV2hlbiBhIGZpbGUgbmFtZSBpcyBzcGVjaWZpZWQgYWZ0ZXIgR0VORVJBVEVfVEFHRklMRSwgZG94eWdlbiB3aWxsIGNyZWF0ZQorIyBhIHRhZyBmaWxlIHRoYXQgaXMgYmFzZWQgb24gdGhlIGlucHV0IGZpbGVzIGl0IHJlYWRzLgorCitHRU5FUkFURV9UQUdGSUxFICAgICAgID0KKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkCisjIGluIHRoZSBjbGFzcyBpbmRleC4gSWYgc2V0IHRvIE5PIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzCisjIHdpbGwgYmUgbGlzdGVkLgorCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQKKyMgaW4gdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwKKyMgYmUgbGlzdGVkLgorCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCisKKyMgVGhlIFBFUkxfUEFUSCBzaG91bGQgYmUgdGhlIGFic29sdXRlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHBlcmwgc2NyaXB0CisjIGludGVycHJldGVyIChpLmUuIHRoZSByZXN1bHQgb2YgYHdoaWNoIHBlcmwnKS4KKworUEVSTF9QQVRIICAgICAgICAgICAgICA9IC91c3IvYmluL3BlcmwKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYSBpbmhlcml0YW5jZSBkaWFncmFtIChpbiBIVE1MLCBSVEYgYW5kIExhVGVYKSBmb3IgY2xhc3NlcyB3aXRoIGJhc2UKKyMgb3Igc3VwZXIgY2xhc3Nlcy4gU2V0dGluZyB0aGUgdGFnIHRvIE5PIHR1cm5zIHRoZSBkaWFncmFtcyBvZmYuIE5vdGUgdGhhdAorIyB0aGlzIG9wdGlvbiBhbHNvIHdvcmtzIHdpdGggSEFWRV9ET1QgZGlzYWJsZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0bworIyBpbnN0YWxsIGFuZCB1c2UgZG90LCBzaW5jZSBpdCB5aWVsZHMgbW9yZSBwb3dlcmZ1bCBncmFwaHMuCisKK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBZRVMKKworIyBZb3UgY2FuIGRlZmluZSBtZXNzYWdlIHNlcXVlbmNlIGNoYXJ0cyB3aXRoaW4gZG94eWdlbiBjb21tZW50cyB1c2luZyB0aGUgXG1zYworIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWUKKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK01TQ0dFTl9QQVRIICAgICAgICAgICAgPQorCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlCisjIGluaGVyaXRhbmNlIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQKKyMgb3IgaXMgbm90IGEgY2xhc3MuCisKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6LCBhIGdyYXBoIHZpc3VhbGl6YXRpb24KKyMgdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudCBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbgorIyBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KQorCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gJUhBVkVfRE9UCisKKyMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcworIyBhbGxvd2VkIHRvIHJ1biBpbiBwYXJhbGxlbC4gV2hlbiBzZXQgdG8gMCAodGhlIGRlZmF1bHQpIGRveHlnZW4gd2lsbAorIyBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdAorIyBleHBsaWNpdGx5IHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlCisjIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3Npbmcgc3BlZWQuCisKK0RPVF9OVU1fVEhSRUFEUyAgICAgICAgPSAwCisKKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdXNlIHRoZSBIZWx2ZXRpY2EgZm9udCBmb3IgYWxsIGRvdCBmaWxlcyB0aGF0CisjIGRveHlnZW4gZ2VuZXJhdGVzLiBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IHlvdSBjYW4gc3BlY2lmeQorIyB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZSBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQKKyMgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYSBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nCisjIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieSBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUKKyMgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuCisKK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBIZWx2ZXRpY2EKKworIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGZvbnQgb2YgZG90IGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgc2l6ZSBpcyAxMHB0LgorCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIEhlbHZldGljYSBmb250LgorIyBJZiB5b3Ugc3BlY2lmeSBhIGRpZmZlcmVudCBmb250IHVzaW5nIERPVF9GT05UTkFNRSB5b3UgY2FuIHVzZSBET1RfRk9OVFBBVEggdG8KKyMgc2V0IHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdC4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9CisKKyMgSWYgdGhlIENMQVNTX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kCisjIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4gU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUKKyMgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorCitDTEFTU19HUkFQSCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQKKyMgaW5kaXJlY3QgaW1wbGVtZW50YXRpb24gZGVwZW5kZW5jaWVzIChpbmhlcml0YW5jZSwgY29udGFpbm1lbnQsIGFuZAorIyBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCisKKyMgSWYgdGhlIEdST1VQX0dSQVBIUyBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzCisKK0dST1VQX0dSQVBIUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZworIyBMYW5ndWFnZS4KKworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBlbmFibGVkLCB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzaG93biBpbnNpZGUKKyMgdGhlIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZQorIyBncmFwaCBtYXkgYmVjb21lIHRvbyBiaWcgdG8gYmUgdXNlZnVsLiBUaGUgVU1MX0xJTUlUX05VTV9GSUVMRFMKKyMgdGhyZXNob2xkIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHR5cGUgdG8gbWFrZSB0aGUgc2l6ZSBtb3JlCisjIG1hbmFnYWJsZS4gU2V0IHRoaXMgdG8gMCBmb3Igbm8gbGltaXQuIE5vdGUgdGhhdCB0aGUgdGhyZXNob2xkIG1heSBiZQorIyBleGNlZWRlZCBieSA1MCUgYmVmb3JlIHRoZSBsaW1pdCBpcyBlbmZvcmNlZC4KKworVU1MX0xJTUlUX05VTV9GSUVMRFMgICA9IDEwCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIgaW5zdGFuY2VzLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERV9HUkFQSCwgYW5kIEhBVkVfRE9UCisjIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkCisjIGZpbGUgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoCisjIG90aGVyIGRvY3VtZW50ZWQgZmlsZXMuCisKK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERURfQllfR1JBUEgsIGFuZAorIyBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2gKKyMgZG9jdW1lbnRlZCBoZWFkZXIgZmlsZSBzaG93aW5nIHRoZSBkb2N1bWVudGVkIGZpbGVzIHRoYXQgZGlyZWN0bHkgb3IKKyMgaW5kaXJlY3RseSBpbmNsdWRlIHRoaXMgZmlsZS4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIGFuZCBIQVZFX0RPVCBvcHRpb25zIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbCBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocworIyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4KKworQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBTExFUl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlciBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24KKyMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXIKKyMgZ3JhcGhzIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuCisKK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGhpY2FsIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKKworIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTCisjIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMKKyMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisKK0RJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBZRVMKKworIyBUaGUgRE9UX0lNQUdFX0ZPUk1BVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSBmb3JtYXQgb2YgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgYnkgZG90LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHN2ZywgcG5nLCBqcGcsIG9yIGdpZi4KKyMgSWYgbGVmdCBibGFuayBwbmcgd2lsbCBiZSB1c2VkLiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQKKyMgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlIHRoZSBTVkcgZmlsZXMKKyMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcyByZXF1aXJlbWVudCkuCisKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKKworIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8KKyMgZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3RpdmUgU1ZHIGltYWdlcyB0aGF0IGFsbG93IHpvb21pbmcgYW5kIHBhbm5pbmcuCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4KKyMgVGVzdGVkIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLiBGb3IgSUUgOSsgeW91CisjIG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzCisjIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0LgorCitJTlRFUkFDVElWRV9TVkcgICAgICAgID0gTk8KKworIyBUaGUgdGFnIERPVF9QQVRIIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorCitET1RfUEFUSCAgICAgICAgICAgICAgID0KKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGRvdGZpbGUgY29tbWFuZCkuCisKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPQorCisjIFRoZSBNU0NGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIG1zYyBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcbXNjZmlsZSBjb21tYW5kKS4KKworTVNDRklMRV9ESVJTICAgICAgICAgICA9CisKKyMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyMgbm9kZXMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoCisjIGJlY29tZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMKKyMgdmlzdWFsaXplZCBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlCisjIG51bWJlciBvZiBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4KKyMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZQorIyB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILgorCitET1RfR1JBUEhfTUFYX05PREVTICAgID0gMjAwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUKKyMgZ3JhcGhzIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlCisjIGZyb20gdGhlIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzCisjIHRoYXQgbGF5IGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcworIyBvcHRpb24gdG8gMSBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlCisjIGNvZGUgYmFzZXMuIEFsc28gbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisKK01BWF9ET1RfR1JBUEhfREVQVEggICAgPSAyCisKKyMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50CisjIGJhY2tncm91bmQuIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBkb3Qgb24gV2luZG93cyBkb2VzIG5vdAorIyBzZWVtIHRvIHN1cHBvcnQgdGhpcyBvdXQgb2YgdGhlIGJveC4gV2FybmluZzogRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB1c2VkLAorIyBlbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgbGVhZCB0byBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZgorIyBhIGdyYXBoIChpLmUuIHRoZXkgYmVjb21lIGhhcmQgdG8gcmVhZCkuCisKK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgRE9UX01VTFRJX1RBUkdFVFMgdGFnIHRvIFlFUyBhbGxvdyBkb3QgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgb3V0cHV0CisjIGZpbGVzIGluIG9uZSBydW4gKGkuZS4gbXVsdGlwbGUgLW8gYW5kIC1UIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZSkuIFRoaXMKKyMgbWFrZXMgZG90IHJ1biBmYXN0ZXIsIGJ1dCBzaW5jZSBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIGRvdCAoPjEuOC4xMCkKKyMgc3VwcG9ydCB0aGlzLCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKworRE9UX01VTFRJX1RBUkdFVFMgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xFR0VORCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kCisjIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZCBncmFwaHMuCisKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90IGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUKKyMgdGhlIHZhcmlvdXMgZ3JhcGhzLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9kb3h5Z2VuL29tY2lzdmMvb21jaXN2Yy5kb3ggYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL29tY2lzdmMvb21jaXN2Yy5kb3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyODYxMQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL2RveHlnZW4vb21jaXN2Yy9vbWNpc3ZjLmRveApAQCAtMCwwICsxLDE3IEBACisvKgorICogT0xheWVyIFNvZnR3YXJlIERldmVsb3BlcidzIEd1aWRlIC0gbWFpbiBwYWdlCisgKi8KKworLyoqIFxtYWlucGFnZSBPTUNJIFNlcnZpY2UgTGF5ZXIgU29mdHdhcmUgRGV2ZW9wZXIncyBHdWlkZQorCitcc2VjdGlvbiBpbnRybyBJbnRyb2R1Y3Rpb24KK09NQ0kgU2VydmljZSBMYXllciBhbmQgT01DSSBhdGFjayBpcyBCQUwgLyBTRE4tUEFMIGFkZC1vbiBwYWNrYWdlLiBJdCBpcyBkZXNpZ25lZCBmb3IgbWFuYWdpbmcgeFBPTiBPTlVzIHVzaW5nIHNlcnZpY2Utb3JpZW50ZWQgcmVxdWVzdHMuCitPTUNJIFNlcnZpY2UgTGF5ZXIgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CistIENvbnZlcnRzIHNlcnZpY2Ugb3JpZW50ZWQgcmVxdWVzdHMgaW50byBPTUNJIE1FIHJlcXVlc3RzCistIEFwcGxpZXMgT01DSSBNRXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgdXNpbmcgYnVpbHQtaW4gRlNNcworLSBIYW5kbGVzIE9OVSBhY3RpdmF0aW9uIGFuZCBNSUIgdXBsb2FkLiBJZGVudGlmaWVzIE9OVSB0eXBlIGJhc2VkIG9uIHRoZSBPTUNJIE1JQiB1cGxvYWQgcmVzdWx0cworKi8KKworLyoqIFxwYWdlIG9tY2lzdmNfYXBpIE9NQ0kgU2VydmljZSBMYXllciBBUEkKKyAgU2VlIFxyZWYgb21jaXN2Y19hcGkgaW4gQVBJIFJlZmVyZW5jZSBjaGFwdGVyCisqLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvZG94eWdlbi9zZG5fcGFsLmRveHkgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL3Nkbl9wYWwuZG94eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzFlMjVkCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvZG94eWdlbi9zZG5fcGFsLmRveHkKQEAgLTAsMCArMSwxODMzIEBACisjIERveHlmaWxlIDEuOC4yCisKKyMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0LgorIworIyBBbGwgdGV4dCBhZnRlciBhIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuCisjIFRoZSBmb3JtYXQgaXM6CisjICAgICAgIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMgaXRlbXMgY2FuIGFsc28gYmUgYXBwZW5kZWQgdXNpbmc6CisjICAgICAgIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoIiAiKS4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbAorIyB0ZXh0IGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUKKyMgaWNvbnYgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUKKyMgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisKK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAorCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIHNlcXVlbmNlIG9mIHdvcmRzKSB0aGF0IHNob3VsZAorIyBpZGVudGlmeSB0aGUgcHJvamVjdC4gTm90ZSB0aGF0IGlmIHlvdSBkbyBub3QgdXNlIERveHl3aXphcmQgeW91IG5lZWQKKyMgdG8gcHV0IHF1b3RlcyBhcm91bmQgdGhlIHByb2plY3QgbmFtZSBpZiBpdCBjb250YWlucyBzcGFjZXMuCisKK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSAiU0ROIFBBTCAtIFNETiBQT04gQWRhcHRhdGlvbiBMYXllciIKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuCisjIFRoaXMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IKKyMgaWYgc29tZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCisKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSAlUFJPSkVDVF9OVU1CRVIKKworIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXIKKyMgYSBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4KKworUFJPSkVDVF9CUklFRiAgICAgICAgICA9CisKKyMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYW4gbG9nbyBvciBpY29uIHRoYXQgaXMKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90CisjIGV4Y2VlZCA1NSBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBsb2dvIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitQUk9KRUNUX0xPR08gICAgICAgICAgID0gIiVTUkNfRElSLy4uL2RveHlnZW4vYnJvYWRjb20ucG5nIgorCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkKKyMgYmFzZSBwYXRoIHdoZXJlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uCisjIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9ICVPVVRfRE9DU19ESVIKKworIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZQorIyA0MDk2IHN1Yi1kaXJlY3RvcmllcyAoaW4gMiBsZXZlbHMpIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIGVhY2ggb3V0cHV0CisjIGZvcm1hdCBhbmQgd2lsbCBkaXN0cmlidXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgb3ZlciB0aGVzZSBkaXJlY3Rvcmllcy4KKyMgRW5hYmxpbmcgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mCisjIHNvdXJjZSBmaWxlcywgd2hlcmUgcHV0dGluZyBhbGwgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3b3VsZAorIyBvdGhlcndpc2UgY2F1c2UgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKworQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBUaGUgZGVmYXVsdCBsYW5ndWFnZSBpcyBFbmdsaXNoLCBvdGhlciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZToKKyMgQWZyaWthYW5zLCBBcmFiaWMsIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwgQ2hpbmVzZS1UcmFkaXRpb25hbCwKKyMgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFc3BlcmFudG8sIEZhcnNpLCBGaW5uaXNoLCBGcmVuY2gsIEdlcm1hbiwKKyMgR3JlZWssIEh1bmdhcmlhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2gKKyMgbWVzc2FnZXMpLCBLb3JlYW4sIEtvcmVhbi1lbiwgTGl0aHVhbmlhbiwgTm9yd2VnaWFuLCBNYWNlZG9uaWFuLCBQZXJzaWFuLAorIyBQb2xpc2gsIFBvcnR1Z3Vlc2UsIFJvbWFuaWFuLCBSdXNzaWFuLCBTZXJiaWFuLCBTZXJiaWFuLUN5cmlsbGljLCBTbG92YWssCisjIFNsb3ZlbmUsIFNwYW5pc2gsIFN3ZWRpc2gsIFVrcmFpbmlhbiwgYW5kIFZpZXRuYW1lc2UuCisKK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoCisKKyMgSWYgdGhlIEJSSUVGX01FTUJFUl9ERVNDIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGluY2x1ZGUgYnJpZWYgbWVtYmVyIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4KKyMgdGhlIGZpbGUgYW5kIGNsYXNzIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YURvYykuCisjIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisKK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKKworIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIHByZXBlbmQKKyMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24uCisjIE5vdGU6IGlmIGJvdGggSElERV9VTkRPQ19NRU1CRVJTIGFuZCBCUklFRl9NRU1CRVJfREVTQyBhcmUgc2V0IHRvIE5PLCB0aGUKKyMgYnJpZWYgZGVzY3JpcHRpb25zIHdpbGwgYmUgY29tcGxldGVseSBzdXBwcmVzc2VkLgorCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTCisKKyMgVGhpcyB0YWcgaW1wbGVtZW50cyBhIHF1YXNpLWludGVsbGlnZW50IGJyaWVmIGRlc2NyaXB0aW9uIGFiYnJldmlhdG9yCisjIHRoYXQgaXMgdXNlZCB0byBmb3JtIHRoZSB0ZXh0IGluIHZhcmlvdXMgbGlzdGluZ3MuIEVhY2ggc3RyaW5nCisjIGluIHRoaXMgbGlzdCwgaWYgZm91bmQgYXMgdGhlIGxlYWRpbmcgdGV4dCBvZiB0aGUgYnJpZWYgZGVzY3JpcHRpb24sIHdpbGwgYmUKKyMgc3RyaXBwZWQgZnJvbSB0aGUgdGV4dCBhbmQgdGhlIHJlc3VsdCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcworIyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4KKyMgSWYgbGVmdCBibGFuaywgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCIkbmFtZSIgaXMgYXV0b21hdGljYWxseQorIyByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkpOiAiVGhlICRuYW1lIGNsYXNzIiAiVGhlICRuYW1lIHdpZGdldCIKKyMgIlRoZSAkbmFtZSBmaWxlIiAiaXMiICJwcm92aWRlcyIgInNwZWNpZmllcyIgImNvbnRhaW5zIgorIyAicmVwcmVzZW50cyIgImEiICJhbiIgInRoZSIKKworQUJCUkVWSUFURV9CUklFRiAgICAgICA9CisKKyMgSWYgdGhlIEFMV0FZU19ERVRBSUxFRF9TRUMgYW5kIFJFUEVBVF9CUklFRiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZXRhaWxlZCBzZWN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLgorCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwKKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50CisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwKKyMgcGF0aCBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQKKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuCisKK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBOTworCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgU1RSSVBfRlJPTV9QQVRIIHRhZworIyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLiBTdHJpcHBpbmcgaXMKKyMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YKKyMgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LgorIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZQorIyBwYXRoIHRvIHN0cmlwLiBOb3RlIHRoYXQgeW91IHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28KKyMgcmVsYXRpdmUgcGF0aHMsIHdoaWNoIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMKKyMgc3RhcnRlZC4KKworU1RSSVBfRlJPTV9QQVRIICAgICAgICA9CisKKyMgVGhlIFNUUklQX0ZST01fSU5DX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YKKyMgdGhlIHBhdGggbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgY2xhc3MsIHdoaWNoIHRlbGxzCisjIHRoZSByZWFkZXIgd2hpY2ggaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiBvcmRlciB0byB1c2UgYSBjbGFzcy4KKyMgSWYgbGVmdCBibGFuayBvbmx5IHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcworIyBkZWZpbml0aW9uIGlzIHVzZWQuIE90aGVyd2lzZSBvbmUgc2hvdWxkIHNwZWNpZnkgdGhlIGluY2x1ZGUgcGF0aHMgdGhhdAorIyBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlciB1c2luZyB0aGUgLUkgZmxhZy4KKworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9CisKKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyCisjIChidXQgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdXIgZmlsZSBzeXN0ZW0KKyMgZG9lc24ndCBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuCisjIHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFEb2Mtc3R5bGUKKyMgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIEphdmFEb2MKKyMgY29tbWVudHMgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMKKyMgKHRodXMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IEBicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IFlFUworCisjIElmIHRoZSBRVF9BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwKKyMgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIFF0LXN0eWxlCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBjb21tZW50cworIyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcKKyMgYW4gZXhwbGljaXQgXGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQorCitRVF9BVVRPQlJJRUYgICAgICAgICAgID0gTk8KKworIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBEb3h5Z2VuCisjIHRyZWF0IGEgbXVsdGktbGluZSBDKysgc3BlY2lhbCBjb21tZW50IGJsb2NrIChpLmUuIGEgYmxvY2sgb2YgLy8hIG9yIC8vLworIyBjb21tZW50cykgYXMgYSBicmllZiBkZXNjcmlwdGlvbi4gVGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4KKyMgVGhlIG5ldyBkZWZhdWx0IGlzIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkCisjIGRlc2NyaXB0aW9uLiBTZXQgdGhpcyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvdXIgaW5zdGVhZC4KKworTVVMVElMSU5FX0NQUF9JU19CUklFRiA9IE5PCisKKyMgSWYgdGhlIElOSEVSSVRfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYW4gdW5kb2N1bWVudGVkCisjIG1lbWJlciBpbmhlcml0cyB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0CisjIHJlLWltcGxlbWVudHMuCisKK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBwcm9kdWNlCisjIGEgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwKKyMgYmUgcGFydCBvZiB0aGUgZmlsZS9jbGFzcy9uYW1lc3BhY2UgdGhhdCBjb250YWlucyBpdC4KKworU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCisKKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuCisjIERveHlnZW4gdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuCisKK1RBQl9TSVpFICAgICAgICAgICAgICAgPSA0CisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiBhbGlhc2VzIHRoYXQgYWN0cworIyBhcyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4KKyMgRm9yIGV4YW1wbGUgYWRkaW5nICJzaWRlZWZmZWN0PVxwYXIgU2lkZSBFZmZlY3RzOlxuIiB3aWxsIGFsbG93IHlvdSB0bworIyBwdXQgdGhlIGNvbW1hbmQgXHNpZGVlZmZlY3QgKG9yIEBzaWRlZWZmZWN0KSBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgd2hpY2gKKyMgd2lsbCByZXN1bHQgaW4gYSB1c2VyLWRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZyAiU2lkZSBFZmZlY3RzOiIuCisjIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0IG5ld2xpbmVzLgorCitBTElBU0VTICAgICAgICAgICAgICAgID0gIlRBQkxFX0hEUjJ7Mn09PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48L3RyPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUQUJMRV9ST1cyezJ9PTx0cj48dGQ+XDE8L3RkPjx0ZD5cMjwvdGQ+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfSERSM3szfT08dHI+PHRoPlwxPC90aD48dGg+XDI8L3RoPjx0aD5cMzwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XM3szfT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjx0ZD5cMzwvdGQ+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfSERSNHs0fT08dHI+PHRoPlwxPC90aD48dGg+XDI8L3RoPjx0aD5cMzwvdGg+PHRoPlw0PC90aD48L3RyPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUQUJMRV9ST1c0ezR9PTx0cj48dGQ+XDE8L3RkPjx0ZD5cMjwvdGQ+PHRkPlwzPC90ZD48dGQ+XDQ8L3RkPjwvdHI+IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRBQkxFX0hEUjV7NX09PHRyPjx0aD5cMTwvdGg+PHRoPlwyPC90aD48dGg+XDM8L3RoPjx0aD5cNDwvdGg+PHRoPlw1PC90aD48L3RyPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUQUJMRV9ST1c1ezV9PTx0cj48dGQ+XDE8L3RkPjx0ZD5cMjwvdGQ+PHRkPlwzPC90ZD48dGQ+XDQ8L3RkPjx0ZD5cNTwvdGQ+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfSERSNns2fT08dHI+PHRoPlwxPC90aD48dGg+XDI8L3RoPjx0aD5cMzwvdGg+PHRoPlw0PC90aD48dGg+XDU8L3RoPjx0aD5cNjwvdGg+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfUk9XNns2fT08dHI+PHRkPlwxPC90ZD48dGQ+XDI8L3RkPjx0ZD5cMzwvdGQ+PHRkPlw0PC90ZD48dGQ+XDU8L3RkPjx0ZD5cNjwvdGQ+PC90cj4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVEFCTEVfSERSN3s3fT08dHI+PHRoPlwxPC90aD48dGg+XDI8L3RoPjx0aD5cMzwvdGg+PHRoPlw0PC90aD48dGg+XDU8L3RoPjx0aD5cNjwvdGg+PHRoPlw3PC90aD48L3RyPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUQUJMRV9ST1c3ezd9PTx0cj48dGQ+XDE8L3RkPjx0ZD5cMjwvdGQ+PHRkPlwzPC90ZD48dGQ+XDQ8L3RkPjx0ZD5cNTwvdGQ+PHRkPlw2PC90ZD48dGQ+XDc8L3RkPjwvdHI+IgorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2Ygd29yZC1rZXl3b3JkIG1hcHBpbmdzIChUQ0wgb25seSkuCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgImNsYXNzPWl0Y2w6OmNsYXNzIiB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIGNvbW1hbmQgY2xhc3MgaW4gdGhlCisjIGl0Y2w6OmNsYXNzIG1lYW5pbmcuCisKK1RDTF9TVUJTVCAgICAgICAgICAgICAgPQorCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMKKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLgorIyBGb3IgaW5zdGFuY2UsIHNvbWUgb2YgdGhlIG5hbWVzIHRoYXQgYXJlIHVzZWQgd2lsbCBiZSBkaWZmZXJlbnQuIFRoZSBsaXN0CisjIG9mIGFsbCBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gWUVTCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IKKyMgSmF2YS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLCBxdWFsaWZpZWQKKyMgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IKKyMgRm9ydHJhbi4KKworT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvcgorIyBWSERMLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0CisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwKKyMgYW5kIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLAorIyBKYXZhc2NyaXB0LCBDU2hhcnAsIEMsIEMrKywgRCwgUEhQLCBPYmplY3RpdmUtQywgUHl0aG9uLCBGb3J0cmFuLCBWSERMLCBDLAorIyBDKysuIEZvciBpbnN0YW5jZSB0byBtYWtlIGRveHlnZW4gdHJlYXQgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0CisjIGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDIChkZWZhdWx0IGlzIEZvcnRyYW4pLCB1c2U6IGluYz1Gb3J0cmFuIGY9Qy4gTm90ZQorIyB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZSB0aGUKKyMgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCisKK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPQorCisjIElmIE1BUktET1dOX1NVUFBPUlQgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIHRoZW4gZG94eWdlbiBwcmUtcHJvY2Vzc2VzIGFsbAorIyBjb21tZW50cyBhY2NvcmRpbmcgdG8gdGhlIE1hcmtkb3duIGZvcm1hdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHJlYWRhYmxlCisjIGRvY3VtZW50YXRpb24uIFNlZSBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duLyBmb3IgZGV0YWlscy4KKyMgVGhlIG91dHB1dCBvZiBtYXJrZG93biBwcm9jZXNzaW5nIGlzIGZ1cnRoZXIgcHJvY2Vzc2VkIGJ5IGRveHlnZW4sIHNvIHlvdQorIyBjYW4gbWl4IGRveHlnZW4sIEhUTUwsIGFuZCBYTUwgY29tbWFuZHMgd2l0aCBNYXJrZG93biBmb3JtYXR0aW5nLgorIyBEaXNhYmxlIG9ubHkgaW4gY2FzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXRpZXMgaXNzdWVzLgorCitNQVJLRE9XTl9TVVBQT1JUICAgICAgID0gWUVTCisKKyMgV2hlbiBlbmFibGVkIGRveHlnZW4gdHJpZXMgdG8gbGluayB3b3JkcyB0aGF0IGNvcnJlc3BvbmQgdG8gZG9jdW1lbnRlZCBjbGFzc2VzLAorIyBvciBuYW1lc3BhY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbi4gU3VjaCBhIGxpbmsgY2FuIGJlCisjIHByZXZlbnRlZCBpbiBpbmRpdmlkdWFsIGNhc2VzIGJ5IGJ5IHB1dHRpbmcgYSAlIHNpZ24gaW4gZnJvbnQgb2YgdGhlIHdvcmQgb3IKKyMgZ2xvYmFsbHkgYnkgc2V0dGluZyBBVVRPTElOS19TVVBQT1JUIHRvIE5PLgorCitBVVRPTElOS19TVVBQT1JUICAgICAgID0gWUVTCisKKyMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudAorIyB0byBpbmNsdWRlIChhIHRhZyBmaWxlIGZvcikgdGhlIFNUTCBzb3VyY2VzIGFzIGlucHV0LCB0aGVuIHlvdSBzaG91bGQKKyMgc2V0IHRoaXMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZAorIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsgdi5zLgorIyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlcyB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorCitCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gTk8KKworIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bworIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCBzb3VyY2VzIG9ubHkuCisjIERveHlnZW4gd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYworIyBpbnN0ZWFkIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KKworU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCisKKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTICh0aGUgZGVmYXVsdCkgd2lsbCBtYWtlIGRveHlnZW4gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YKKyMgdGhlIHNhbWUgdHlwZSAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEKKyMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8KKyMgTk8gdG8gcHJldmVudCBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcKKyMgdGhlIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZAorIyB1bmlvbnMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcKKyMgQGluZ3JvdXApIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvcgorIyBzZWN0aW9uIChmb3IgTGFUZVggYW5kIFJURikuCisKK0lOTElORV9HUk9VUEVEX0NMQVNTRVMgPSBOTworCisjIFdoZW4gdGhlIElOTElORV9TSU1QTEVfU1RSVUNUUyB0YWcgaXMgc2V0IHRvIFlFUywgc3RydWN0cywgY2xhc3NlcywgYW5kCisjIHVuaW9ucyB3aXRoIG9ubHkgcHVibGljIGRhdGEgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluIHRoZSBkb2N1bWVudGF0aW9uCisjIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsIG5hbWVzcGFjZSwgb3IgZ3JvdXAKKyMgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCksCisjIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbgorIyBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorCitJTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8KKworIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yIGVudW0KKyMgaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkKKyMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gTk8KKworIyBUaGUgU1lNQk9MX0NBQ0hFX1NJWkUgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgY2FjaGUgdXNlIHRvCisjIGRldGVybWluZSB3aGljaCBzeW1ib2xzIHRvIGtlZXAgaW4gbWVtb3J5IGFuZCB3aGljaCB0byBmbHVzaCB0byBkaXNrLgorIyBXaGVuIHRoZSBjYWNoZSBpcyBmdWxsLCBsZXNzIG9mdGVuIHVzZWQgc3ltYm9scyB3aWxsIGJlIHdyaXR0ZW4gdG8gZGlzay4KKyMgRm9yIHNtYWxsIHRvIG1lZGl1bSBzaXplIHByb2plY3RzICg8MTAwMCBpbnB1dCBmaWxlcykgdGhlIGRlZmF1bHQgdmFsdWUgaXMKKyMgcHJvYmFibHkgZ29vZCBlbm91Z2guIEZvciBsYXJnZXIgcHJvamVjdHMgYSB0b28gc21hbGwgY2FjaGUgc2l6ZSBjYW4gY2F1c2UKKyMgZG94eWdlbiB0byBiZSBidXN5IHN3YXBwaW5nIHN5bWJvbHMgdG8gYW5kIGZyb20gZGlzayBtb3N0IG9mIHRoZSB0aW1lCisjIGNhdXNpbmcgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBwZW5hbHR5LgorIyBJZiB0aGUgc3lzdGVtIGhhcyBlbm91Z2ggcGh5c2ljYWwgbWVtb3J5IGluY3JlYXNpbmcgdGhlIGNhY2hlIHdpbGwgaW1wcm92ZSB0aGUKKyMgcGVyZm9ybWFuY2UgYnkga2VlcGluZyBtb3JlIHN5bWJvbHMgaW4gbWVtb3J5LiBOb3RlIHRoYXQgdGhlIHZhbHVlIHdvcmtzIG9uCisjIGEgbG9nYXJpdGhtaWMgc2NhbGUgc28gaW5jcmVhc2luZyB0aGUgc2l6ZSBieSBvbmUgd2lsbCByb3VnaGx5IGRvdWJsZSB0aGUKKyMgbWVtb3J5IHVzYWdlLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6CisjIDJeKDE2K1NZTUJPTF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzLgorCisjU1lNQk9MX0NBQ0hFX1NJWkUgICAgICA9IDAKKworIyBTaW1pbGFyIHRvIHRoZSBTWU1CT0xfQ0FDSEVfU0laRSB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGxvb2t1cCBjYWNoZSBjYW4gYmUKKyMgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuCisjIHRoZWlyIG5hbWUgYW5kIHNjb3BlLiBTaW5jZSB0aGlzIGNhbiBiZSBhbiBleHBlbnNpdmUgcHJvY2VzcyBhbmQgb2Z0ZW4gdGhlCisjIHNhbWUgc3ltYm9sIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgY29kZSwgZG94eWdlbiBrZWVwcyBhIGNhY2hlIG9mCisjIHByZS1yZXNvbHZlZCBzeW1ib2xzLiBJZiB0aGUgY2FjaGUgaXMgdG9vIHNtYWxsIGRveHlnZW4gd2lsbCBiZWNvbWUgc2xvd2VyLgorIyBJZiB0aGUgY2FjaGUgaXMgdG9vIGxhcmdlLCBtZW1vcnkgaXMgd2FzdGVkLiBUaGUgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzCisjIGZvcm11bGE6IDJeKDE2K0xPT0tVUF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzLgorCitMT09LVVBfQ0FDSEVfU0laRSAgICAgID0gMQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVYVFJBQ1RfQUxMIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLgorIyBQcml2YXRlIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzCisjIHRoZSBFWFRSQUNUX1BSSVZBVEUgYW5kIEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMKKworRVhUUkFDVF9BTEwgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3MKKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwKKyMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUKKyMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykKKyMgZGVmaW5lZCBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBJZiBzZXQgdG8gTk8gb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhUUkFDVF9MT0NBTF9DTEFTU0VTICA9IE5PCisKKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwKKyMgbWV0aG9kcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbgorIyB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkLgorCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KKworIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZQorIyBleHRyYWN0ZWQgYW5kIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIG5hbWVzcGFjZSBjYWxsZWQKKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZQorIyBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQKKyMgYW5vbnltb3VzIG5hbWVzcGFjZXMgYXJlIGhpZGRlbi4KKworRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBtZW1iZXJzIG9mIGRvY3VtZW50ZWQgY2xhc3NlcywgZmlsZXMgb3IgbmFtZXNwYWNlcy4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorIyB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24gc2VjdGlvbiBpcyBnZW5lcmF0ZWQuCisjIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzCisjIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgZnJpZW5kIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uCisKK0hJREVfRlJJRU5EX0NPTVBPVU5EUyAgPSBOTworCisjIElmIHRoZSBISURFX0lOX0JPRFlfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYW55CisjIGRvY3VtZW50YXRpb24gYmxvY2tzIGZvdW5kIGluc2lkZSB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uLgorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUKKyMgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLgorCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8KKworIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uCisjIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYSBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQKKyMgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIHRoZSBkb2N1bWVudGF0aW9uIHdpbGwgYmUgZXhjbHVkZWQuCisjIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KKworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIERveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlCisjIGZpbGUgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbworIyBhbGxvd2VkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjbGFzc2VzIG9yIGZpbGVzIHdob3NlIG5hbWVzIG9ubHkgZGlmZmVyCisjIGluIGNhc2UgYW5kIGlmIHlvdXIgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgY2FzZSBzZW5zaXRpdmUgZmlsZSBuYW1lcy4gV2luZG93cworIyBhbmQgTWFjIHVzZXJzIGFyZSBhZHZpc2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IFlFUworCisjIElmIHRoZSBISURFX1NDT1BFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KKyMgd2lsbCBzaG93IG1lbWJlcnMgd2l0aCB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZSBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbgorIyB3aWxsIHB1dCBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyBvZiB0aGF0IGZpbGUuCisKK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKKworIyBJZiB0aGUgRk9SQ0VfTE9DQUxfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuCisjIHdpbGwgbGlzdCBpbmNsdWRlIGZpbGVzIHdpdGggZG91YmxlIHF1b3RlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbgorIyByYXRoZXIgdGhhbiB3aXRoIHNoYXJwIGJyYWNrZXRzLgorCitGT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGEgdGFnIFtpbmxpbmVdCisjIGlzIGluc2VydGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4KKworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuCisjIHdpbGwgc29ydCB0aGUgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMKKyMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbgorIyBkZWNsYXJhdGlvbiBvcmRlci4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyBicmllZiBkb2N1bWVudGF0aW9uIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseQorIyBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4KKyMgZGVjbGFyYXRpb24gb3JkZXIuCisKK1NPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIHNvcnQgdGhlIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0CisjIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkKKyMgdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieQorIyBTT1JUX01FTUJFUl9ET0NTIGFuZCBTT1JUX0JSSUVGX0RPQ1MuCisjIFRoaXMgdGFnIHdpbGwgYmUgaWdub3JlZCBmb3IgYnJpZWYgZG9jcyBpZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PCisjIGFuZCBpZ25vcmVkIGZvciBkZXRhaWxlZCBkb2NzIGlmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PLgorCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8KKworIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyBoaWVyYXJjaHkgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpCisjIHRoZSBncm91cCBuYW1lcyB3aWxsIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLgorCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlCisjIHNvcnRlZCBieSBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8KKyMgTk8gKHRoZSBkZWZhdWx0KSwgdGhlIGNsYXNzIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLAorIyBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4KKyMgTm90ZTogVGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsIGlmIEhJREVfU0NPUEVfTkFNRVMgaXMgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlCisjIGFscGhhYmV0aWNhbCBsaXN0LgorCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KKworIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvCisjIGRvIHByb3BlciB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhCisjIG1hdGNoIGJldHdlZW4gdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4KKyMgaWYgdGhlcmUgaXMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZQorIyBieSBkb2luZyBhIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbgorIyB3aWxsIHN0aWxsIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgorCitTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcgorIyBkaXNhYmxlIChOTykgdGhlIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbworIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKKyMgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0IGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QKKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgYnVnIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZworIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCisjIGRpc2FibGUgKE5PKSB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nCisjIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCisKKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbAorIyBkb2N1bWVudGF0aW9uIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIHNlY3Rpb25uYW1lIC4uLiBcZW5kaWYuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPQorCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzCisjIHRoZSBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgbWFjcm8gY29uc2lzdHMgb2YgZm9yIGl0IHRvIGFwcGVhciBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQKKyMgaGVyZSBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5LgorIyBUaGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5pdGlhbGl6ZXIgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIG1hY3JvcyBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBjYW4gYmUgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIKKyMgY29tbWFuZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKworTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCisKKyMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkCisjIGF0IHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3NlcyBhbmQgc3RydWN0cy4gSWYgc2V0IHRvIFlFUyB0aGUKKyMgbGlzdCB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gTk8KKworIyBTZXQgdGhlIFNIT1dfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEZpbGVzIHBhZ2UuCisjIFRoaXMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZQorIyBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLiBUaGUgZGVmYXVsdCBpcyBZRVMuCisKK1NIT1dfRklMRVMgICAgICAgICAgICAgPSBZRVMKKworIyBTZXQgdGhlIFNIT1dfTkFNRVNQQUNFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUKKyMgTmFtZXNwYWNlcyBwYWdlLgorIyBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBOYW1lc3BhY2VzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4CisjIGFuZCBmcm9tIHRoZSBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLiBUaGUgZGVmYXVsdCBpcyBZRVMuCisKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCA8Y29tbWFuZD4gPGlucHV0LWZpbGU+LCB3aGVyZSA8Y29tbWFuZD4gaXMgdGhlIHZhbHVlIG9mCisjIHRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlCisjIHByb3ZpZGVkIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQKKyMgaXMgdXNlZCBhcyB0aGUgZmlsZSB2ZXJzaW9uLiBTZWUgdGhlIG1hbnVhbCBmb3IgZXhhbXBsZXMuCisKK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPQorCisjIFRoZSBMQVlPVVRfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxheW91dCBmaWxlIHdoaWNoIHdpbGwgYmUgcGFyc2VkCisjIGJ5IGRveHlnZW4uIFRoZSBsYXlvdXQgZmlsZSBjb250cm9scyB0aGUgZ2xvYmFsIHN0cnVjdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCisjIG91dHB1dCBmaWxlcyBpbiBhbiBvdXRwdXQgZm9ybWF0IGluZGVwZW5kZW50IHdheS4gVG8gY3JlYXRlIHRoZSBsYXlvdXQgZmlsZQorIyB0aGF0IHJlcHJlc2VudHMgZG94eWdlbidzIGRlZmF1bHRzLCBydW4gZG94eWdlbiB3aXRoIHRoZSAtbCBvcHRpb24uCisjIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgZmlsZSBuYW1lIGFmdGVyIHRoZSBvcHRpb24sIGlmIG9taXR0ZWQKKyMgRG94eWdlbkxheW91dC54bWwgd2lsbCBiZSB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgZmlsZS4KKworTEFZT1VUX0ZJTEUgICAgICAgICAgICA9ICVTUkNfRElSLy4uL2RveHlnZW4vRG94eWdlbkxheW91dC54bWwKKworCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMKKyMgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlcyBkYXRhLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZQorIyAuYmliIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFVzaW5nIHRoaXMgY29tbWFuZAorIyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbworIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLiBGb3IgTGFUZVggdGhlIHN0eWxlCisjIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcworIyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlIHNlYXJjaCBwYXRoLgorCitDSVRFX0JJQl9GSUxFUyAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZAorIyBieSBkb3h5Z2VuLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rCisjIE5PIGlzIHVzZWQuCisKK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKKworIyBJZiBXQVJOX0lGX1VORE9DVU1FTlRFRCBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncworIyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcgd2lsbAorIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gTk8KKworIyBJZiBXQVJOX0lGX0RPQ19FUlJPUiBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUKKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdAorIyBkb24ndCBleGlzdCBvciB1c2luZyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKworV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUworCisjIFRoZSBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yCisjIGZ1bmN0aW9ucyB0aGF0IGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzCisjIG9yIHJldHVybiB2YWx1ZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dAorIyB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mCisjIGRvY3VtZW50YXRpb24uCisKK1dBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBZRVMKKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0CisjIGRveHlnZW4gY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0CisjIHRhZ3MsIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlCisjIHdhcm5pbmcgb3JpZ2luYXRlZCBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluCisjICR2ZXJzaW9uLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZAorIyBiZSBvYnRhaW5lZCB2aWEgRklMRV9WRVJTSU9OX0ZJTFRFUikKKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZworIyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuCisjIHRvIHN0ZGVyci4KKworV0FSTl9MT0dGSUxFICAgICAgICAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCisjIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSAibXlmaWxlLmNwcCIgb3IKKyMgZGlyZWN0b3JpZXMgbGlrZSAiL3Vzci9zcmMvbXlwcm9qZWN0Ii4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHdpdGggc3BhY2VzLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gJVNSQ19ESVIvLi4vZG94eWdlbi9zZG5fcGFsL3Nkbl9wYWwuZG94IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9vZnBhbC9vZnBhbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9vZnBhbC9vZnBhbF9jb25zdGFudHMuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvb2ZwYWwvb2ZwYWxfdGFibGUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvb2ZwYWwvb2ZwYWxfZmxvdy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9vZnBhbC9vZnBhbF9ncm91cC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9vZnBhbC9vZnBhbF9wYWNrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvb2ZwYWwvb2ZwYWxfbWV0ZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJVNSQ19ESVIvb2ZwYWwvb2ZwYWxfcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9vZnBhbC9vZnBhbF9iYXJyaWVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICVTUkNfRElSL29mcGFsL29mcGFsX2N1c3RvbS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAlU1JDX0RJUi9vZnBhbC9vZnBhbF9uZXRjb25mLmgKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcworIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGlzCisjIGFsc28gdGhlIGRlZmF1bHQgaW5wdXQgZW5jb2RpbmcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0CisjIGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udiBmb3IKKyMgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcAorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0CisjIGJsYW5rIHRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHRlc3RlZDoKKyMgKi5jICouY2MgKi5jeHggKi5jcHAgKi5jKysgKi5kICouamF2YSAqLmlpICouaXh4ICouaXBwICouaSsrICouaW5sICouaCAqLmhoCisjICouaHh4ICouaHBwICouaCsrICouaWRsICoub2RsICouY3MgKi5waHAgKi5waHAzICouaW5jICoubSAqLm1tICouZG94ICoucHkKKyMgKi5mOTAgKi5mICouZm9yICoudmhkICoudmhkbAorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jICouaCAqLmNwcAorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcworIyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4KKyMgSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gWUVTCisKKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlCisjIGV4Y2x1ZGVkIGZyb20gdGhlIElOUFVUIHNvdXJjZSBmaWxlcy4gVGhpcyB3YXkgeW91IGNhbiBlYXNpbHkgZXhjbHVkZSBhCisjIHN1YmRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IHRyZWUgd2hvc2Ugcm9vdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgSU5QVVQgdGFnLgorIyBOb3RlIHRoYXQgcmVsYXRpdmUgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1bi4KKworRVhDTFVERSAgICAgICAgICAgICAgICA9CisKKyMgVGhlIEVYQ0xVREVfU1lNTElOS1MgdGFnIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGV0aGVyIG9yIG5vdCBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcyAoYSBVbml4IGZpbGUgc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZAorIyBmcm9tIHRoZSBpbnB1dC4KKworRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUKKyMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLiBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZAorIyBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8gZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcworIyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9QQVRURVJOUyAgICAgICA9ICovdGVzdC8qIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqRXhhbXBsZXMqCisKKyMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMKKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKKyMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlCisjIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKKworRVhDTFVERV9TWU1CT0xTICAgICAgICA9CisKKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcgorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50cyB0aGF0IGFyZSBpbmNsdWRlZCAoc2VlCisjIHRoZSBcaW5jbHVkZSBjb21tYW5kKS4KKworRVhBTVBMRV9QQVRIICAgICAgICAgICA9CisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhBTVBMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQKKyMgYmxhbmsgYWxsIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhBTVBMRV9QQVRURVJOUyAgICAgICA9CisKKyMgSWYgdGhlIEVYQU1QTEVfUkVDVVJTSVZFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gc3ViZGlyZWN0b3JpZXMgd2lsbCBiZQorIyBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBcaW5jbHVkZSBvciBcZG9udGluY2x1ZGUKKyMgY29tbWFuZHMgaXJyZXNwZWN0aXZlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgUkVDVVJTSVZFIHRhZy4KKyMgUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBpbWFnZSB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlCisjIHRoZSBcaW1hZ2UgY29tbWFuZCkuCisKK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAlU1JDX0RJUi8uLi9kb3h5Z2VuL3Nkbl9wYWwKKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQgPGZpbHRlcj4gPGlucHV0LWZpbGU+LCB3aGVyZSA8ZmlsdGVyPgorIyBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4KKyMgaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyIHByb2dyYW0gd3JpdGVzCisjIHRvIHN0YW5kYXJkIG91dHB1dC4KKyMgSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcgd2lsbCBiZQorIyBpZ25vcmVkLgorCitJTlBVVF9GSUxURVIgICAgICAgICAgID0KKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuCisjIGJhc2lzLgorIyBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guCisjIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06CisjIHBhdHRlcm49ZmlsdGVyIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyCisjIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSBvciBpZgorIyBub24gb2YgdGhlIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0KKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUikgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgd2hlbiBwcm9kdWNpbmcgc291cmNlCisjIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KKworIyBUaGUgRklMVEVSX1NPVVJDRV9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBzb3VyY2UgZmlsdGVycyBwZXIgZmlsZQorIyBwYXR0ZXJuLiBBIHBhdHRlcm4gd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBmb3IgRklMVEVSX1BBVFRFUk4gKGlmIGFueSkKKyMgYW5kIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGlzYWJsZSBzb3VyY2UgZmlsdGVyaW5nIGZvciBhIHNwZWNpZmljIHBhdHRlcm4KKyMgdXNpbmcgKi5leHQ9IChzbyB3aXRob3V0IG5hbWluZyBhIGZpbHRlcikuIFRoaXMgb3B0aW9uIG9ubHkgaGFzIGVmZmVjdCB3aGVuCisjIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgZW5hYmxlZC4KKworRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gc291cmNlIGJyb3dzaW5nCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB3aWxsCisjIGJlIGdlbmVyYXRlZC4gRG9jdW1lbnRlZCBlbnRpdGllcyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGVzZSBzb3VyY2VzLgorIyBOb3RlOiBUbyBnZXQgcmlkIG9mIGFsbCBzb3VyY2UgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dCwgbWFrZSBzdXJlIGFsc28KKyMgVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBOTworCisjIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5CisjIG9mIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBkaXJlY3RseSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTICh0aGUgZGVmYXVsdCkgd2lsbCBpbnN0cnVjdAorIyBkb3h5Z2VuIHRvIGhpZGUgYW55IHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUKKyMgZnJhZ21lbnRzLiBOb3JtYWwgQywgQysrIGFuZCBGb3J0cmFuIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLgorCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gTk8KKworIyBJZiB0aGUgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUworIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQKKyMgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIGl0IHdpbGwgYmUgbGlzdGVkLgorCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gTk8KKworIyBJZiB0aGUgUkVGRVJFTkNFU19SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUworIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQgZW50aXRpZXMKKyMgY2FsbGVkL3VzZWQgYnkgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGxpc3RlZC4KKworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfTElOS19TT1VSQ0UgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KQorIyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbQorIyBmdW5jdGlvbnMgaW4gUkVGRVJFTkNFU19SRUxBVElPTiBhbmQgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiBsaXN0cyB3aWxsCisjIGxpbmsgdG8gdGhlIHNvdXJjZSBjb2RlLgorIyBPdGhlcndpc2UgdGhleSB3aWxsIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uCisKK1JFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUKKyMgd2lsbCBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuCisjIGJ1aWx0LWluIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UKKyMgdGFnZ2luZyBzeXN0ZW0gKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91CisjIHdpbGwgbmVlZCB2ZXJzaW9uIDQuOC42IG9yIGhpZ2hlci4KKworVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvcgorIyB3aGljaCBhbiBpbmNsdWRlIGlzIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleAorIyBvZiBhbGwgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdAorIyBjb250YWlucyBhIGxvdCBvZiBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUworCisjIElmIHRoZSBhbHBoYWJldGljYWwgaW5kZXggaXMgZW5hYmxlZCAoc2VlIEFMUEhBQkVUSUNBTF9JTkRFWCkgdGhlbgorIyB0aGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMKKyMgaW4gd2hpY2ggdGhpcyBsaXN0IHdpbGwgYmUgc3BsaXQgKGNhbiBiZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzEuLjIwXSkKKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsCisjIGNsYXNzZXMgd2lsbCBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguCisjIFRoZSBJR05PUkVfUFJFRklYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHByZWZpeGVzIHRoYXQKKyMgc2hvdWxkIGJlIGlnbm9yZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgSFRNTCBvdXRwdXQuCisKK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKKworIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgaHRtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSBodG1sCisKKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLC5waHAsLmFzcCkuIElmIGl0IGlzIGxlZnQgYmxhbmsKKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGZpbGVzIHdpdGggLmh0bWwgZXh0ZW5zaW9uLgorCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBIVE1MIGhlYWRlciBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHN0YW5kYXJkIGhlYWRlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYSBjdXN0b20gaGVhZGVyIHlvdSBhcmUgcmVzcG9uc2libGUKKyMgIGZvciB0aGUgcHJvcGVyIGluY2x1c2lvbiBvZiBhbnkgc2NyaXB0cyBhbmQgc3R5bGUgc2hlZXRzIHRoYXQgZG94eWdlbgorIyBuZWVkcywgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZC4KKyMgSXQgaXMgYWR2aXNlZCB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgaGVhZGVyIHVzaW5nICJkb3h5Z2VuIC13IGh0bWwKKyMgaGVhZGVyLmh0bWwgZm9vdGVyLmh0bWwgc3R5bGVzaGVldC5jc3MgWW91ckNvbmZpZ0ZpbGUiIGFuZCB0aGVuIG1vZGlmeQorIyB0aGF0IGhlYWRlci4gTm90ZSB0aGF0IHRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseQorIyBoYXZlIHRvIHJlZG8gdGhpcyB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbiBvciB3aGVuCisjIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBjb25maWd1cmF0aW9uIHNldHRpbmdzIHN1Y2ggYXMgR0VORVJBVEVfVFJFRVZJRVchCisKK0hUTUxfSEVBREVSICAgICAgICAgICAgPSAlU1JDX0RJUi8uLi9kb3h5Z2VuL2hlYWRlci5odG1sCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBmb290ZXIuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAlU1JDX0RJUi8uLi9kb3h5Z2VuL2Zvb3Rlci5odG1sCisKKyMgVGhlIEhUTUxfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcKKyMgc3R5bGUgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0bworIyBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIEhUTUwgb3V0cHV0LiBJZiBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuIE5vdGUgdGhhdCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UKKyMgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIGluc3RlYWQgb2YgdGhpcyBvbmUsIGFzIGl0IGlzIG1vcmUgcm9idXN0IGFuZCB0aGlzCisjIHRhZyB3aWxsIGluIHRoZSBmdXR1cmUgYmVjb21lIG9ic29sZXRlLgorCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0KKworIyBUaGUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwKKyMgdXNlci1kZWZpbmVkIGNhc2NhZGluZyBzdHlsZSBzaGVldCB0aGF0IGlzIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZAorIyBzdHlsZSBzaGVldHMgY3JlYXRlZCBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlCisjIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4gVGhpcyBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyBIVE1MX1NUWUxFU0hFRVQKKyMgc2luY2UgaXQgZG9lcyBub3QgcmVwbGFjZSB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXQgYW5kIGlzIHRoZXJlZm9yIG1vcmUKKyMgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvCisjIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitIVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0KKworIyBUaGUgSFRNTF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gTm90ZQorIyB0aGF0IHRoZXNlIGZpbGVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBiYXNlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gVXNlIHRoZQorIyAkcmVscGF0aCQgbWFya2VyIGluIHRoZSBIVE1MX0hFQURFUiBhbmQvb3IgSFRNTF9GT09URVIgZmlsZXMgdG8gbG9hZCB0aGVzZQorIyBmaWxlcy4gSW4gdGhlIEhUTUxfU1RZTEVTSEVFVCBmaWxlLCB1c2UgdGhlIGZpbGUgbmFtZSBvbmx5LiBBbHNvIG5vdGUgdGhhdAorIyB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvciBtYXJrZXJzIGF2YWlsYWJsZS4KKworSFRNTF9FWFRSQV9GSUxFUyAgICAgICA9CisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuCisjIERveHlnZW4gd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGUgc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzCisjIGFjY29yZGluZyB0byB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwKKyMgc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIyBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLAorIyAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMCBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLgorIyBUaGUgYWxsb3dlZCByYW5nZSBpcyAwIHRvIDM1OS4KKworSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZgorIyB0aGUgY29sb3JzIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlCisjIGdyYXlzY2FsZXMgb25seS4gQSB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4KKworSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8KKyMgdGhlIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdworIyAxMDAgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZQorIyB0aGUgb3V0cHV0IGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwKKyMgc28gODAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLAorIyBhbmQgMTAwIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2FtbWEuCisKK0hUTUxfQ09MT1JTVFlMRV9HQU1NQSAgPSA4MAorCisjIElmIHRoZSBIVE1MX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQgSFRNTAorIyBwYWdlIHdpbGwgY29udGFpbiB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBwYWdlIHdhcyBnZW5lcmF0ZWQuIFNldHRpbmcKKyMgdGhpcyB0byBOTyBjYW4gaGVscCB3aGVuIGNvbXBhcmluZyB0aGUgb3V0cHV0IG9mIG11bHRpcGxlIHJ1bnMuCisKK0hUTUxfVElNRVNUQU1QICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlCisjIHBhZ2UgaGFzIGxvYWRlZC4KKworSFRNTF9EWU5BTUlDX1NFQ1RJT05TICA9IE5PCisKKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZgorIyBlbnRyaWVzIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXIKKyMgY2FuIGV4cGFuZCBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZAorIyB0aGUgdHJlZSB0byBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlCisjIHZpc2libGUgKHVubGVzcyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuCisjIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZiBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieQorIyBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMKKyMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZCB0cmVlIGJ5IGRlZmF1bHQuCisKK0hUTUxfSU5ERVhfTlVNX0VOVFJJRVMgPSAxMDAKKworIyBJZiB0aGUgR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMworIyBpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBpbnRyb2R1Y2VkIHdpdGggT1NYIDEwLjUgKExlb3BhcmQpLgorIyBUbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHNldCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgTWFrZWZpbGUgaW4gdGhlCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluIHRoYXQKKyMgZGlyZWN0b3J5IGFuZCBydW5uaW5nICJtYWtlIGluc3RhbGwiIHdpbGwgaW5zdGFsbCB0aGUgZG9jc2V0IGluCisjIH4vTGlicmFyeS9EZXZlbG9wZXIvU2hhcmVkL0RvY3VtZW50YXRpb24vRG9jU2V0cyBzbyB0aGF0IFhjb2RlIHdpbGwgZmluZAorIyBpdCBhdCBzdGFydHVwLgorIyBTZWUgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMvY3JlYXRpbmdkb2NzZXRzd2l0aGRveHlnZW4uaHRtbAorIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworR0VORVJBVEVfRE9DU0VUICAgICAgICA9IE5PCisKKyMgV2hlbiBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIHRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlCisjIGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlCisjIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKQorIyBjYW4gYmUgZ3JvdXBlZC4KKworRE9DU0VUX0ZFRUROQU1FICAgICAgICA9ICJTRE4gUEFMIFNvZnR3YXJlIERldmVsb3BlcidzIEd1aWRlIgorCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdAorIyBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24gc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYQorIyByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuCisjIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSB3d3cuYnJvYWRjb20uY29tCisKKyMgV2hlbiBHRU5FUkFURV9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseQorIyBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZQorIyBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC5kb2N1bWVudGF0aW9uLgorCitET0NTRVRfUFVCTElTSEVSX0lEICAgID0gd3d3LmJyb2FkY29tLmNvbQorCisjIFRoZSBHRU5FUkFURV9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuCisKK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBCcm9hZGNvbSBMaW1pdGVkCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRvb2xzIGxpa2UgdGhlCisjIE1pY3Jvc29mdCBIVE1MIGhlbHAgd29ya3Nob3AgdG8gZ2VuZXJhdGUgYSBjb21waWxlZCBIVE1MIGhlbHAgZmlsZSAoLmNobSkKKyMgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIENITV9GSUxFIHRhZyBjYW4KKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htIGZpbGUuIFlvdQorIyBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUKKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5LgorCitDSE1fRklMRSAgICAgICAgICAgICAgID0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBISENfTE9DQVRJT04gdGFnIGNhbgorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4KKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKworSEhDX0xPQ0FUSU9OICAgICAgICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgR0VORVJBVEVfQ0hJIGZsYWcKKyMgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIHRoYXQKKyMgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIENITV9JTkRFWF9FTkNPRElORworIyBpcyB1c2VkIHRvIGVuY29kZSBIdG1sSGVscCBpbmRleCAoaGhrKSwgY29udGVudCAoaGhjKSBhbmQgcHJvamVjdCBmaWxlCisjIGNvbnRlbnQuCisKK0NITV9JTkRFWF9FTkNPRElORyAgICAgPQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEJJTkFSWV9UT0MgZmxhZworIyBjb250cm9scyB3aGV0aGVyIGEgYmluYXJ5IHRhYmxlIG9mIGNvbnRlbnRzIGlzIGdlbmVyYXRlZCAoWUVTKSBvciBhCisjIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoTk8pIGluIHRoZSAuY2htIGZpbGUuCisKK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzCisjIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisKK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQKKyMgUUhQX1ZJUlRVQUxfRk9MREVSIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZAorIyB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEKKyMgUXQgQ29tcHJlc3NlZCBIZWxwICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfUUhQICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbgorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4KKyMgVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuCisKK1FDSF9GSUxFICAgICAgICAgICAgICAgPQorCisjIFRoZSBRSFBfTkFNRVNQQUNFIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nCisjIFF0IEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUKKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UKKworUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nCisjIFF0IEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUKKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLWZvbGRlcnMKKworUUhQX1ZJUlRVQUxfRk9MREVSICAgICA9IGRvYworCisjIElmIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIGlzIHNldCwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tIGZpbHRlciB0bworIyBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUKKyMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycworCitRSFBfQ1VTVF9GSUxURVJfTkFNRSAgID0KKworIyBUaGUgUUhQX0NVU1RfRklMVF9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQorIyBjdXN0b20gZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQorIyA8YSBocmVmPSJodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS1maWx0ZXJzIj4KKyMgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tIEZpbHRlcnM8L2E+LgorCitRSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0KKworIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcworIyBwcm9qZWN0J3MKKyMgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4KKyMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcyI+CisjIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzPC9hPi4KKworUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFFIR19MT0NBVElPTiB0YWcgY2FuCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncyBxaGVscGdlbmVyYXRvci4KKyMgSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZSBnZW5lcmF0ZWQKKyMgLnFocCBmaWxlLgorCitRSEdfTE9DQVRJT04gICAgICAgICAgID0KKworIyBJZiB0aGUgR0VORVJBVEVfRUNMSVBTRUhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMKKyMgIHdpbGwgYmUgZ2VuZXJhdGVkLCB3aGljaCB0b2dldGhlciB3aXRoIHRoZSBIVE1MIGZpbGVzLCBmb3JtIGFuIEVjbGlwc2UgaGVscAorIyBwbHVnaW4uIFRvIGluc3RhbGwgdGhpcyBwbHVnaW4gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHVuZGVyIHRoZSBoZWxwIGNvbnRlbnRzCisjIG1lbnUgaW4gRWNsaXBzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MCisjIGZpbGVzIG5lZWRzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZgorIyB0aGUgZGlyZWN0b3J5IHdpdGhpbiB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzCisjIHRoZSBFQ0xJUFNFX0RPQ19JRCB2YWx1ZS4gQWZ0ZXIgY29weWluZyBFY2xpcHNlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBiZWZvcmUKKyMgdGhlIGhlbHAgYXBwZWFycy4KKworR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PCisKKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luCisjIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZQorIyB0aGlzIG5hbWUuCisKK0VDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggKHRhYnMpCisjIGF0IHRvcCBvZiBlYWNoIEhUTUwgcGFnZS4gVGhlIHZhbHVlIE5PICh0aGUgZGVmYXVsdCkgZW5hYmxlcyB0aGUgaW5kZXggYW5kCisjIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMgaXQuIFNpbmNlIHRoZSB0YWJzIGhhdmUgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlCisjIG5hdmlnYXRpb24gdHJlZSB5b3UgY2FuIHNldCB0aGlzIG9wdGlvbiB0byBOTyBpZiB5b3UgYWxyZWFkeSBzZXQKKyMgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLgorCitESVNBQkxFX0lOREVYICAgICAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleAorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4KKyMgSWYgdGhlIHRhZyB2YWx1ZSBpcyBzZXQgdG8gWUVTLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQKKyMgY29udGFpbmluZyBhIHRyZWUtbGlrZSBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQKKyMgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzCisjIEphdmFTY3JpcHQsIERIVE1MLCBDU1MgYW5kIGZyYW1lcyBpcyByZXF1aXJlZCAoaS5lLiBhbnkgbW9kZXJuIGJyb3dzZXIpLgorIyBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBIVE1MIGhlbHAgZmVhdHVyZS4KKyMgU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4IHlvdQorIyBjb3VsZCBjb25zaWRlciB0byBzZXQgRElTQUJMRV9JTkRFWCB0byBOTyB3aGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLgorCitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gWUVTCisKKyMgVGhlIEVOVU1fVkFMVUVTX1BFUl9MSU5FIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBlbnVtIHZhbHVlcworIyAocmFuZ2UgWzAsMS4uMjBdKSB0aGF0IGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwKKyMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IGEgdmFsdWUgb2YgMCB3aWxsIGNvbXBsZXRlbHkgc3VwcHJlc3MgdGhlIGVudW0KKyMgdmFsdWVzIGZyb20gYXBwZWFyaW5nIGluIHRoZSBvdmVydmlldyBzZWN0aW9uLgorCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAorCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlCisjIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZQorIyBpcyBzaG93bi4KKworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorCisjIFdoZW4gdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIG9wZW4KKyMgbGlua3MgdG8gZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93LgorCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8KKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGF0ZXggZm9ybXVsYXMgaW5jbHVkZWQKKyMgYXMgaW1hZ2VzIGluIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFRoZSBkZWZhdWx0IGlzIDEwLiBOb3RlIHRoYXQKKyMgd2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRveHlnZW4gcnVuIHlvdSBuZWVkCisjIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5CisjIHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuCisKK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMAorCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZQorIyBub3Qgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcworIyBpbiB0aGUgSFRNTCBvdXRwdXQgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0LgorCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTCisKKyMgRW5hYmxlIHRoZSBVU0VfTUFUSEpBWCBvcHRpb24gdG8gcmVuZGVyIExhVGVYIGZvcm11bGFzIHVzaW5nIE1hdGhKYXgKKyMgKHNlZSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZQorIyByZW5kZXJpbmcgaW5zdGVhZCBvZiB1c2luZyBwcmVyZW5kZXJlZCBiaXRtYXBzLiBVc2UgdGhpcyBpZiB5b3UgZG8gbm90CisjIGhhdmUgTGFUZVggaW5zdGFsbGVkIG9yIGlmIHlvdSB3YW50IHRvIGZvcm11bGFzIGxvb2sgcHJldHRpZXIgaW4gdGhlIEhUTUwKKyMgb3V0cHV0LiBXaGVuIGVuYWJsZWQgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5zdGFsbCBNYXRoSmF4IHNlcGFyYXRlbHkgYW5kCisjIGNvbmZpZ3VyZSB0aGUgcGF0aCB0byBpdCB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4KKworVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlCisjIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uCisjIGRpcmVjdG9yeSBzaG91bGQgY29udGFpbiB0aGUgTWF0aEpheC5qcyBzY3JpcHQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG1hdGhqYXgKKyMgZGlyZWN0b3J5IGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgdGhlbgorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0bworIyB0aGUgTWF0aEpheCBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgc28geW91IGNhbiBxdWlja2x5IHNlZSB0aGUgcmVzdWx0IHdpdGhvdXQKKyMgaW5zdGFsbGluZyBNYXRoSmF4LgorIyBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwKKyMgY29weSBvZiBNYXRoSmF4IGZyb20gaHR0cDovL3d3dy5tYXRoamF4Lm9yZyBiZWZvcmUgZGVwbG95bWVudC4KKworTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QKKworIyBUaGUgTUFUSEpBWF9FWFRFTlNJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBNYXRoSmF4IGV4dGVuc2lvbgorIyBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGR1cmluZyBNYXRoSmF4IHJlbmRlcmluZy4KKworTUFUSEpBWF9FWFRFTlNJT05TICAgICA9CisKKyMgV2hlbiB0aGUgU0VBUkNIRU5HSU5FIHRhZyBpcyBlbmFibGVkIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHNlYXJjaCBib3gKKyMgZm9yIHRoZSBIVE1MIG91dHB1dC4gVGhlIHVuZGVybHlpbmcgc2VhcmNoIGVuZ2luZSB1c2VzIGphdmFzY3JpcHQKKyMgYW5kIERIVE1MIGFuZCBzaG91bGQgd29yayBvbiBhbnkgbW9kZXJuIGJyb3dzZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nCisjIEhUTUwgaGVscCAoR0VORVJBVEVfSFRNTEhFTFApLCBRdCBoZWxwIChHRU5FUkFURV9RSFApLCBvciBkb2NzZXRzCisjIChHRU5FUkFURV9ET0NTRVQpIHRoZXJlIGlzIGFscmVhZHkgYSBzZWFyY2ggZnVuY3Rpb24gc28gdGhpcyBvbmUgc2hvdWxkCisjIHR5cGljYWxseSBiZSBkaXNhYmxlZC4gRm9yIGxhcmdlIHByb2plY3RzIHRoZSBqYXZhc2NyaXB0IGJhc2VkIHNlYXJjaCBlbmdpbmUKKyMgY2FuIGJlIHNsb3csIHRoZW4gZW5hYmxpbmcgU0VSVkVSX0JBU0VEX1NFQVJDSCBtYXkgcHJvdmlkZSBhIGJldHRlciBzb2x1dGlvbi4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIFBIUCBlbmFibGVkIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhdCB0aGUgd2ViIGNsaWVudAorIyB1c2luZyBKYXZhc2NyaXB0LiBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgdGhlIHNlYXJjaCBQSFAgc2NyaXB0IGFuZCBpbmRleAorIyBmaWxlIHRvIHB1dCBvbiB0aGUgd2ViIHNlcnZlci4gVGhlIGFkdmFudGFnZSBvZiB0aGUgc2VydmVyCisjIGJhc2VkIGFwcHJvYWNoIGlzIHRoYXQgaXQgc2NhbGVzIGJldHRlciB0byBsYXJnZSBwcm9qZWN0cyBhbmQgYWxsb3dzCisjIGZ1bGwgdGV4dCBzZWFyY2guIFRoZSBkaXNhZHZhbnRhZ2VzIGFyZSB0aGF0IGl0IGlzIG1vcmUgZGlmZmljdWx0IHRvIHNldHVwCisjIGFuZCBkb2VzIG5vdCBoYXZlIGxpdmUgc2VhcmNoaW5nIGNhcGFiaWxpdGllcy4KKworU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBMYXRleCBvdXRwdXQuCisKK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUKKyMgaW52b2tlZC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBjb21tYW5kIG5hbWUuCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yCisjIGdlbmVyYXRpbmcgYml0bWFwcyBmb3IgZm9ybXVsYXMgaW4gdGhlIEhUTUwgb3V0cHV0LCBidXQgbm90IGluIHRoZQorIyBNYWtlZmlsZSB0aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisKK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAorCisjIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0bworIyBnZW5lcmF0ZSBpbmRleCBmb3IgTGFUZVguIElmIGxlZnQgYmxhbmsgYG1ha2VpbmRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZQorIyBkZWZhdWx0IGNvbW1hbmQgbmFtZS4KKworTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdAorIyBMYVRlWCBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLgorCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KKworIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZAorIyBieSB0aGUgcHJpbnRlci4gUG9zc2libGUgdmFsdWVzIGFyZTogYTQsIGxldHRlciwgbGVnYWwgYW5kCisjIGV4ZWN1dGl2ZS4gSWYgbGVmdCBibGFuayBhNHdpZGUgd2lsbCBiZSB1c2VkLgorCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTR3aWRlCisKKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBuYW1lcyBvZiBMYVRlWAorIyBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0KKworIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvcgorIyB0aGUgZ2VuZXJhdGVkIGxhdGV4IGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwKKyMgdGhlIGZpcnN0IGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgaGVhZGVyLiBOb3RpY2U6IG9ubHkgdXNlIHRoaXMgdGFnIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKworTEFURVhfSEVBREVSICAgICAgICAgICA9CisKKyMgVGhlIExBVEVYX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGZvb3RlciBmb3IKKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGZvb3RlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIGFmdGVyCisjIHRoZSBsYXN0IGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgZm9vdGVyLiBOb3RpY2U6IG9ubHkgdXNlIHRoaXMgdGFnIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKworTEFURVhfRk9PVEVSICAgICAgICAgICA9CisKKyMgSWYgdGhlIFBERl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgTGFUZVggdGhhdCBpcyBnZW5lcmF0ZWQKKyMgaXMgcHJlcGFyZWQgZm9yIGNvbnZlcnNpb24gdG8gcGRmICh1c2luZyBwczJwZGYpLiBUaGUgcGRmIGZpbGUgd2lsbAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcworIyBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIHBkZiB2aWV3ZXIuCisKK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIElmIHRoZSBVU0VfUERGTEFURVggdGFnIGlzIHNldCB0byBZRVMsIHBkZmxhdGV4IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mCisjIHBsYWluIGxhdGV4IGluIHRoZSBnZW5lcmF0ZWQgTWFrZWZpbGUuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8gZ2V0IGEKKyMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uCisKK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxcYmF0Y2htb2RlLgorIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwCisjIHJ1bm5pbmcgaWYgZXJyb3JzIG9jY3VyLCBpbnN0ZWFkIG9mIGFza2luZyB0aGUgdXNlciBmb3IgaGVscC4KKyMgVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIyBJZiBMQVRFWF9ISURFX0lORElDRVMgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QKKyMgaW5jbHVkZSB0aGUgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pCisjIGluIHRoZSBvdXRwdXQuCisKK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworCisjIElmIExBVEVYX1NPVVJDRV9DT0RFIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZQorIyBzb3VyY2UgY29kZSB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIExhVGVYIG91dHB1dC4KKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncworIyBzdWNoIGFzIFNPVVJDRV9CUk9XU0VSLgorCitMQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8KKworIyBUaGUgTEFURVhfQklCX1NUWUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdHlsZSB0byB1c2UgZm9yIHRoZQorIyBiaWJsaW9ncmFwaHksIGUuZy4gcGxhaW5uYXQsIG9yIGllZWV0ci4gVGhlIGRlZmF1bHQgc3R5bGUgaXMgInBsYWluIi4gU2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGZvciBtb3JlIGluZm8uCisKK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dAorIyBUaGUgUlRGIG91dHB1dCBpcyBvcHRpbWl6ZWQgZm9yIFdvcmQgOTcgYW5kIG1heSBub3QgbG9vayB2ZXJ5IHByZXR0eSB3aXRoCisjIG90aGVyIFJURiByZWFkZXJzIG9yIGVkaXRvcnMuCisKK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTworCisjIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgcnRmJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworUlRGX09VVFBVVCAgICAgICAgICAgICA9IHJ0ZgorCisjIElmIHRoZSBDT01QQUNUX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QKKyMgUlRGIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8KKyMgc2F2ZSBzb21lIHRyZWVzIGluIGdlbmVyYWwuCisKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZAorIyB3aWxsIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIFdPUkQgb3Igb3RoZXIKKyMgcHJvZ3JhbXMgd2hpY2ggc3VwcG9ydCB0aG9zZSBmaWVsZHMuCisjIE5vdGU6IHdvcmRwYWQgKHdyaXRlKSBhbmQgb3RoZXJzIGRvIG5vdCBzdXBwb3J0IGxpbmtzLgorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlIHNoZWV0IGRlZmluaXRpb25zIGZyb20gZmlsZS4gU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzCisjIGNvbmZpZyBmaWxlLCBpLmUuIGEgc2VyaWVzIG9mIGFzc2lnbm1lbnRzLiBZb3Ugb25seSBoYXZlIHRvIHByb3ZpZGUKKyMgcmVwbGFjZW1lbnRzLCBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9CisKKyMgU2V0IG9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIGFuIHJ0ZiBkb2N1bWVudC4KKyMgU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZyBmaWxlLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBtYW4gcGFnZXMKKworR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbWFuJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0bworIyB0aGUgZ2VuZXJhdGVkIG1hbiBwYWdlcyAoZGVmYXVsdCBpcyB0aGUgc3Vicm91dGluZSdzIHNlY3Rpb24gLjMpCisKK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuMworCisjIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIERveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsCisjIHRoZW4gaXQgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkKKyMgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbCBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcworIyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQgdGhlbSB0aGUgbWFuIGNvbW1hbmQKKyMgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4gVGhlIGRlZmF1bHQgaXMgTk8uCisKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwKKyMgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgeG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorCisjIFRoZSBYTUxfU0NIRU1BIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBzY2hlbWEsCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKworI1hNTF9TQ0hFTUEgICAgICAgICAgICAgPQorCisjIFRoZSBYTUxfRFREIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBEVEQsCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQorIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKworI1hNTF9EVEQgICAgICAgICAgICAgICAgPQorCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsCisjIGR1bXAgdGhlIHByb2dyYW0gbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nCisjIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8gdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdAorIyBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgWE1MIG91dHB1dC4KKworWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhbiBBdXRvR2VuIERlZmluaXRpb25zIChzZWUgYXV0b2dlbi5zZi5uZXQpIGZpbGUKKyMgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwKKyMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwKKyMgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKworR0VORVJBVEVfQVVUT0dFTl9ERUYgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFBlcmwgbW9kdWxlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9QRVJMTU9EIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMKKyMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlCisjIG1vbWVudC4KKworR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlCisjIHRoZSBuZWNlc3NhcnkgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlCisjIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisKK1BFUkxNT0RfTEFURVggICAgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX1BSRVRUWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUKKyMgbmljZWx5IGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLgorIyBUaGlzIGlzIHVzZWZ1bAorIyBpZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uCisjIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzCisjIHRhZyBpcyBzZXQgdG8gTk8gdGhlIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlcgorIyBhbmQgUGVybCB3aWxsIHBhcnNlIGl0IGp1c3QgdGhlIHNhbWUuCisKK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKKworIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZQorIyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLgorIyBUaGlzIGlzIHVzZWZ1bCBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUKKyMgTWFrZWZpbGUgZG9uJ3Qgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCisKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKKyMgZXZhbHVhdGUgYWxsIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUKKyMgZmlsZXMuCisKK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBleHBhbmQgYWxsIG1hY3JvCisjIG5hbWVzIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBjb25kaXRpb25hbAorIyBjb21waWxhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZAorIyB3YXkgYnkgc2V0dGluZyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUworIyB0aGVuIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZQorIyBQUkVERUZJTkVEIGFuZCBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZSBpbmNsdWRlcyBmaWxlcworIyBwb2ludGVkIHRvIGJ5IElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIHdoZW4gYSAjaW5jbHVkZSBpcyBmb3VuZC4KKworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5CisjIHRoZSBwcmVwcm9jZXNzb3IuCisKK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPQorCisjIFlvdSBjYW4gdXNlIHRoZSBJTkNMVURFX0ZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQKKyMgcGF0dGVybnMgKGxpa2UgKi5oIGFuZCAqLmhwcCkgdG8gZmlsdGVyIG91dCB0aGUgaGVhZGVyLWZpbGVzIGluIHRoZQorIyBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuaywgdGhlIHBhdHRlcm5zIHNwZWNpZmllZCB3aXRoIEZJTEVfUEFUVEVSTlMgd2lsbAorIyBiZSB1c2VkLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0KKworIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0CisjIGFyZSBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lCisjIG9yIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSA9IGFyZQorIyBvbWl0dGVkID0xIGlzIGFzc3VtZWQuIFRvIHByZXZlbnQgYSBtYWNybyBkZWZpbml0aW9uIGZyb20gYmVpbmcKKyMgdW5kZWZpbmVkIHZpYSAjdW5kZWYgb3IgcmVjdXJzaXZlbHkgZXhwYW5kZWQgdXNlIHRoZSA6PSBvcGVyYXRvcgorIyBpbnN0ZWFkIG9mIHRoZSA9IG9wZXJhdG9yLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gX19hdHRyaWJ1dGVfXyh4KT0gXAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fY3BsdXNwbHVzCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbgorIyB0aGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4KKyMgVGhlIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuCisjIFVzZSB0aGUgUFJFREVGSU5FRCB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdAorIyBvdmVycnVsZXMgdGhlIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgorCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0KKworIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuCisjIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbCByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MKKyMgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlIGFuIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhCisjIHNlbWljb2xvbiwgYmVjYXVzZSB0aGVzZSB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QgcmVtb3ZlZC4KKworU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb246OmFkZGl0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgVEFHRklMRVMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnZmlsZXMuIEZvciBlYWNoCisjIHRhZyBmaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgYWRkZWQuIFRoZQorIyBmb3JtYXQgb2YgYSB0YWcgZmlsZSB3aXRob3V0IHRoaXMgbG9jYXRpb24gaXMgYXMgZm9sbG93czoKKyMKKyMgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4KKyMgQWRkaW5nIGxvY2F0aW9uIGZvciB0aGUgdGFnIGZpbGVzIGlzIGRvbmUgYXMgZm9sbG93czoKKyMKKyMgVEFHRklMRVMgPSBmaWxlMT1sb2MxICJmaWxlMiA9IGxvYzIiIC4uLgorIyB3aGVyZSAibG9jMSIgYW5kICJsb2MyIiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMKKyMgb3IgVVJMcy4gTm90ZSB0aGF0IGVhY2ggdGFnIGZpbGUgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUgKHdoZXJlIHRoZSBuYW1lIGRvZXMKKyMgTk9UIGluY2x1ZGUgdGhlIHBhdGgpLiBJZiBhIHRhZyBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2gKKyMgZG94eWdlbiBpcyBydW4sIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgdGFnZmlsZSBoZXJlLgorCitUQUdGSUxFUyAgICAgICAgICAgICAgID0KKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlCisjIGEgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPQorCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZSBsaXN0ZWQKKyMgaW4gdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8gb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMKKyMgd2lsbCBiZSBsaXN0ZWQuCisKK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRFUk5BTF9HUk9VUFMgdGFnIGlzIHNldCB0byBZRVMgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbAorIyBiZSBsaXN0ZWQuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQKKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiBgd2hpY2ggcGVybCcpLgorCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIGluaGVyaXRhbmNlIGRpYWdyYW0gKGluIEhUTUwsIFJURiBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZQorIyBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8gTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0CisjIHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVCBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvCisjIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlIHBvd2VyZnVsIGdyYXBocy4KKworQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUworCisjIFlvdSBjYW4gZGVmaW5lIG1lc3NhZ2Ugc2VxdWVuY2UgY2hhcnRzIHdpdGhpbiBkb3h5Z2VuIGNvbW1lbnRzIHVzaW5nIHRoZSBcbXNjCisjIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZQorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pIHRvIHByb2R1Y2UgdGhlIGNoYXJ0IGFuZCBpbnNlcnQgaXQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIFRoZSBNU0NHRU5fUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUKKyMgdGhlIG1zY2dlbiB0b29sIHJlc2lkZXMuIElmIGxlZnQgZW1wdHkgdGhlIHRvb2wgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUKKyMgZGVmYXVsdCBzZWFyY2ggcGF0aC4KKworTVNDR0VOX1BBVEggICAgICAgICAgICA9CisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUKKyMgaW5oZXJpdGFuY2UgYW5kIHVzYWdlIHJlbGF0aW9ucyBpZiB0aGUgdGFyZ2V0IGlzIHVuZG9jdW1lbnRlZAorIyBvciBpcyBub3QgYSBjbGFzcy4KKworSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUworCisjIElmIHlvdSBzZXQgdGhlIEhBVkVfRE9UIHRhZyB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgYXNzdW1lIHRoZSBkb3QgdG9vbCBpcworIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXosIGEgZ3JhcGggdmlzdWFsaXphdGlvbgorIyB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50IEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uCisjIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSAlSEFWRV9ET1QKKworIyBUaGUgRE9UX05VTV9USFJFQURTIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRvdCBpbnZvY2F0aW9ucyBkb3h5Z2VuIGlzCisjIGFsbG93ZWQgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsCisjIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0CisjIGV4cGxpY2l0bHkgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UKKyMgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZyBzcGVlZC4KKworRE9UX05VTV9USFJFQURTICAgICAgICA9IDAKKworIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB1c2UgdGhlIEhlbHZldGljYSBmb250IGZvciBhbGwgZG90IGZpbGVzIHRoYXQKKyMgZG94eWdlbiBnZW5lcmF0ZXMuIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgeW91IGNhbiBzcGVjaWZ5CisjIHRoZSBmb250IG5hbWUgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCB0byBtYWtlIHN1cmUgZG90IGlzIGFibGUgdG8gZmluZAorIyB0aGUgZm9udCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcKKyMgdGhlIERPVEZPTlRQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5IHNldHRpbmcgRE9UX0ZPTlRQQVRIIHRvIHRoZQorIyBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm9udC4KKworRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQorCisjIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgZm9udCBvZiBkb3QgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCBzaXplIGlzIDEwcHQuCisKK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMAorCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgSGVsdmV0aWNhIGZvbnQuCisjIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gdXNlIERPVF9GT05UUEFUSCB0bworIyBzZXQgdGhlIHBhdGggd2hlcmUgZG90IGNhbiBmaW5kIGl0LgorCitET1RfRk9OVFBBVEggICAgICAgICAgID0KKworIyBJZiB0aGUgQ0xBU1NfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQKKyMgaW5kaXJlY3QgaW5oZXJpdGFuY2UgcmVsYXRpb25zLiBTZXR0aW5nIHRoaXMgdGFnIHRvIFlFUyB3aWxsIGZvcmNlIHRoZQorIyBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4KKyMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZAorIyBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kCisjIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuCisKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKKworIyBJZiB0aGUgR1JPVVBfR1JBUEhTIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMKKworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgaW5oZXJpdGFuY2UgYW5kCisjIGNvbGxhYm9yYXRpb24gZGlhZ3JhbXMgaW4gYSBzdHlsZSBzaW1pbGFyIHRvIHRoZSBPTUcncyBVbmlmaWVkIE1vZGVsaW5nCisjIExhbmd1YWdlLgorCitVTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZQorIyB0aGUgY2xhc3Mgbm9kZS4gSWYgdGhlcmUgYXJlIG1hbnkgZmllbGRzIG9yIG1ldGhvZHMgYW5kIG1hbnkgbm9kZXMgdGhlCisjIGdyYXBoIG1heSBiZWNvbWUgdG9vIGJpZyB0byBiZSB1c2VmdWwuIFRoZSBVTUxfTElNSVRfTlVNX0ZJRUxEUworIyB0aHJlc2hvbGQgbGltaXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUKKyMgbWFuYWdhYmxlLiBTZXQgdGhpcyB0byAwIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlCisjIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0IGlzIGVuZm9yY2VkLgorCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKKworIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUKKyMgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpciBpbnN0YW5jZXMuCisKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFX0dSQVBILCBhbmQgSEFWRV9ET1QKKyMgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQKKyMgZmlsZSBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGgKKyMgb3RoZXIgZG9jdW1lbnRlZCBmaWxlcy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFRF9CWV9HUkFQSCwgYW5kCisjIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaAorIyBkb2N1bWVudGVkIGhlYWRlciBmaWxlIHNob3dpbmcgdGhlIGRvY3VtZW50ZWQgZmlsZXMgdGhhdCBkaXJlY3RseSBvcgorIyBpbmRpcmVjdGx5IGluY2x1ZGUgdGhpcyBmaWxlLgorCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBTExfR1JBUEggYW5kIEhBVkVfRE9UIG9wdGlvbnMgYXJlIHNldCB0byBZRVMgdGhlbgorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbgorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UKKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzCisjIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLgorCitDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbgorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UKKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlcgorIyBncmFwaHMgZm9yIHNlbGVjdGVkIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4KKworQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdSQVBISUNBTF9ISUVSQVJDSFkgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaGljYWwgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KKworR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUworCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMKKyMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3RvcmllcworIyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZSBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUKKyMgcmVsYXRpb25zIGJldHdlZW4gdGhlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKworRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUworCisjIFRoZSBET1RfSU1BR0VfRk9STUFUIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBieSBkb3QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgc3ZnLCBwbmcsIGpwZywgb3IgZ2lmLgorIyBJZiBsZWZ0IGJsYW5rIHBuZyB3aWxsIGJlIHVzZWQuIElmIHlvdSBjaG9vc2Ugc3ZnIHlvdSBuZWVkIHRvIHNldAorIyBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UgdGhlIFNWRyBmaWxlcworIyB2aXNpYmxlIGluIElFIDkrIChvdGhlciBicm93c2VycyBkbyBub3QgaGF2ZSB0aGlzIHJlcXVpcmVtZW50KS4KKworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZworCisjIElmIERPVF9JTUFHRV9GT1JNQVQgaXMgc2V0IHRvIHN2ZywgdGhlbiB0aGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvIFlFUyB0bworIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4KKyMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLgorIyBUZXN0ZWQgYW5kIHdvcmtpbmcgYXJlIEZpcmVmb3gsIENocm9tZSwgU2FmYXJpLCBhbmQgT3BlcmEuIEZvciBJRSA5KyB5b3UKKyMgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlIHRoZSBTVkcgZmlsZXMKKyMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuCisKK0lOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTworCisjIFRoZSB0YWcgRE9UX1BBVEggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPQorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcZG90ZmlsZSBjb21tYW5kKS4KKworRE9URklMRV9ESVJTICAgICAgICAgICA9CisKKyMgVGhlIE1TQ0ZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gbXNjIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlCisjIFxtc2NmaWxlIGNvbW1hbmQpLgorCitNU0NGSUxFX0RJUlMgICAgICAgICAgID0KKworIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZgorIyBub2RlcyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGgKKyMgYmVjb21lcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcworIyB2aXN1YWxpemVkIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUKKyMgbnVtYmVyIG9mIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbgorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlCisjIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguCisKK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSAyMDAKKworIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZQorIyBncmFwaHMgZ2VuZXJhdGVkIGJ5IGRvdC4gQSBkZXB0aCB2YWx1ZSBvZiAzIG1lYW5zIHRoYXQgb25seSBub2RlcyByZWFjaGFibGUKKyMgZnJvbSB0aGUgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMKKyMgdGhhdCBsYXkgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzCisjIG9wdGlvbiB0byAxIG9yIDIgbWF5IGdyZWF0bHkgcmVkdWNlIHRoZSBjb21wdXRhdGlvbiB0aW1lIG5lZWRlZCBmb3IgbGFyZ2UKKyMgY29kZSBiYXNlcy4gQWxzbyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5CisjIERPVF9HUkFQSF9NQVhfTk9ERVMuIFVzaW5nIGEgZGVwdGggb2YgMCBtZWFucyBubyBkZXB0aCByZXN0cmljdGlvbi4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDIKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90CisjIHNlZW0gdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LiBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsCisjIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mCisjIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0byByZWFkKS4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKQorIyBzdXBwb3J0IHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQKKyMgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkIGdyYXBocy4KKworR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUworCisjIElmIHRoZSBET1RfQ0xFQU5VUCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAorIyByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZQorIyB0aGUgdmFyaW91cyBncmFwaHMuCisKK0RPVF9DTEVBTlVQICAgICAgICAgICAgPSBZRVMKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL2RveHlnZW4vc2RuX3BhbC9zZG5fcGFsLmRveCBiL2JhbF9yZWxlYXNlL2RveHlnZW4vc2RuX3BhbC9zZG5fcGFsLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmI3MmJhCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvZG94eWdlbi9zZG5fcGFsL3Nkbl9wYWwuZG94CkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBTRE4tUEFMIFNvZnR3YXJlIERldmVsb3BlcidzIEd1aWRlIC0gbWFpbiBwYWdlCisgKi8KKworLyoqIFxtYWlucGFnZSBTRE4tUEFMIFNvZnR3YXJlIERldmVvcGVyJ3MgR3VpZGUKKworXHNlY3Rpb24gaW50cm8gSW50cm9kdWN0aW9uCitTRE4gUEFMIGlzIEJBTCBhZGQtb24gcGFja2FnZS4gSXQgaXMgZGVzaWduZWQgZm9yIG1hbmFnaW5nIHhQT04gT0xUIHZpcnR1YWwgc3dpdGNoICh4UE9OIHZPTFQpIHVzaW5nIE9wZW5GbG93IGFuZC9vciBORVRDT05GIHByb3RvY29scy4KK1RoZSB4UE9OIHZPTFQgY29uc2lzdHMgb2YgeFBPTiBsaW5lIGNhcmQgYW5kIHN1YnRlbmRpbmcgT05Vcy4KK1NETiBQQUwgYWN0cyBhcyBhbiBpbnRlcm1lZGlhdGUgbGF5ZXIgYmV0d2VlbiBPcGVuRmxvdyBhbmQgTkVUQ09ORiBhZ2VudHMgYW5kIHRoZQorcy93IHN0YWNrcyBtYW5hZ2luZyB0aGUgbGluZSBjYXJkIGFuZCBPTlVzLgorICAgIC0geFBPTiBsaW5lIGNhcmQgaXMgbWFuYWdlZCBieSBCQUwKKyAgICAtIHhQT04gT05VcyBhcmUgbWFuYWdlZCBieSBPTUNJIFNlcnZpY2UgTGF5ZXIKKworU0ROLVBBTCBjb25zaXN0cyBvZiAyIG1haW4gY29tcG9uZW50czoKKyAgICAtIE9GLVBBTCAgICAtIE9wZW5GbG93IFBPTiBBZGFwdGF0aW9uIExheWVyLiBJdCBpcyBhbiBTREsgaW50ZW5kZWQgZm9yIGludGVncmF0aW9uIHdpdGggT3BlbkZsb3cgYWdlbnQuCisgICAgICAgIC0gU0ROLVBBTCBTREsgdXNlcyBkYXRhIHR5cGVzIGdlbmVyYXRlZCBieSBsb3h5Z2VuIGNvZGUgZ2VuZXJhdG9yIGZvciBDIChsb2NpKS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mbG9vZGxpZ2h0L2xveGlnZW4gZm9yIGRldGFpbHMuCisgICAgICAgIC0gU0ROLVBBTCBTREsgaW5jbHVkZXMgYSByZWZlcmVuY2UgaW50ZWdyYXRpb24gd2l0aCBpbmRvZ28gT0YgYWdlbnQuIFNlZSBodHRwOi8vd3d3LnByb2plY3RmbG9vZGxpZ2h0Lm9yZy9pbmRpZ28gZm9yIGRldGFpbHMuCisgICAgLSB4cG9uLXZvbHQueWFuZyBtb2RlbCAtIFlhbmcgbW9kZWwgZm9yIG1hbmFnaW5nIHhQT04gdk9MVCB1c2luZyBORVRDT05GIHByb3RvY29sLgorICAgICAgICAtIFRoaXMgbW9kdWxlIGlzIGltcGxlbWVudGVkIGFzIGEgcGx1Z2luIGZvciBvcGVuLXNvdXJjZSBsaWJuZXRjb25mIFNESy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9DRVNORVQvbGlibmV0Y29uZiBmb3IgZGV0YWlscy4KKyovCisKKy8qKiBccGFnZSBvZnBhbF9hcGkgT0YtUEFMIFB1YmxpYyBBUEkKKyAgU2VlIFxyZWYgb2ZwYWxfYXBpIGluIEFQSSBSZWZlcmVuY2UgY2hhcHRlcgorKi8KKworLyoqIFxwYWdlIHhwb25fdm9sdF95YW5nIHhwb24tdm9sdCBZYW5nIE1vZGVsCisgIFxpbWFnZSBodG1sIHhwb24tdm9sdC5wbmcKKyovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9kb3h5Z2VuL3Nkbl9wYWwveHBvbi12b2x0LnBuZyBiL2JhbF9yZWxlYXNlL2RveHlnZW4vc2RuX3BhbC94cG9uLXZvbHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZWNiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9kb3h5Z2VuL3Nkbl9wYWwveHBvbi12b2x0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9tay9NYWtlZmlsZS5jb25maWcgYi9iYWxfcmVsZWFzZS9tay9NYWtlZmlsZS5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY5YTY0OQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL21rL01ha2VmaWxlLmNvbmZpZwpAQCAtMCwwICsxLDQzOSBAQAorIyBDb21tb24gTWFrZWZpbGUgY29uZmlndXJhdGlvbgorIworCisjIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG11c3QgYmUgc2V0CisjIE1PRF9OQU1FIC0gbW9kdWxlIG5hbWUuIERlcGVuZGluZyBvbiBNT0RfVFlQRSBjYW4gYmUgZW5jYXBzdWxhdGVkIChlLmcuLCBNT0RfTkFNRT1vcyAtLT4gbGlib3MuYSkKKyMgTU9EX1RZUEUgLSBtb2R1bGUgdHlwZS4gU3VwcG9ydGVkIHR5cGVzIGN1cnJlbnRseSBhcmUgImxpYiIsICJhcHAiLCAibGludXhfbW9kdWxlIiwgImxpbnV4X2xpYiIsICJzaGFyZWRfbGliIgorIwkJCSBOb3RlOiAKKyMJCQkJRm9yIGxpYnJhcnkgbW9kdWxlIGl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgInVuaXRlc3QiIHRhcmdldCBpbiAKKyMJCQkJbWsvJChTVUJTWVNURU0pL21vZHVsZXMuY29yZSAvIC5hcHBzCisjCQkJCUluIHRoaXMgY2FzZSB1bml0ZXN0LmMgaXMgY29tcGlsZWQgYW5kIGxpbmtlZCB3aXRoIGl0cyBtb2R1bGUgbGlicmFyeS4KKyMJCQkJSG93ZXZlciwgTU9EX1RZUEUgcmVtYWlucyBhICJsaWIiLiAgCisjCisjIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBvcHRpb25hbAorIyBzcmNzICAgICAtIGxpc3Qgb2YgLmMgc291cmNlIGZpbGVzIHJlbGF0aXZlIHRvIFNSQ19ESVIKKyMgYXNfc3JjcyAgLSBsaXN0IG9mIC5zIChsb3dlciBjYXNlIHMpICAgc291cmNlIGZpbGVzIHJlbGF0aXZlIHRvIFNSQ19ESVIKKyMgQVNfc3JjcyAgLSBsaXN0IG9mIC5TICh1cHBlciBjYXNlIC5TKSBzb3VyY2UgZmlsZXMgcmVsYXRpdmUgdG8gU1JDX0RJUiAKKyMgZ2VuX2JhbF9zcmNzIC0gbGlzdCBvZiAuYyB0aGF0IGhhdmUgdG8gYmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhlIGJ1aWxkIGZyb20gYmFsLm9ianNldAorIyBnZW5fYmFsX2hkcnMgLSBsaXN0IG9mIC5oIHRoYXQgaGF2ZSB0byBiZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGUgYnVpbGQgZnJvbSBiYWwub2Jqc2V0CisjIGdlbl9vbWNpX3NyY3MgLSBsaXN0IG9mIC5jIHRoYXQgaGF2ZSB0byBiZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGUgYnVpbGQgZnJvbSBvbWNpLm9ianNldAorIyBnZW5fb21jaV9oZHJzIC0gbGlzdCBvZiAuaCB0aGF0IGhhdmUgdG8gYmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhlIGJ1aWxkIGZyb20gb21jaS5vYmpzZXQKKyMgZ2VuX29tY2lfc3RhY2tfc3JjcyAtIGxpc3Qgb2YgLmMgdGhhdCBoYXZlIHRvIGJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoZSBidWlsZCBmcm9tIG9tY2lfbWVfZGF0YW1vZGVsLmNzdgorIyBnZW5fb21jaV9zdGFja19oZHJzIC0gbGlzdCBvZiAuaCB0aGF0IGhhdmUgdG8gYmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhlIGJ1aWxkIGZyb20gb21jaV9tZV9kYXRhbW9kZWwuY3N2CisjIE1PRF9ERVBTIC0gbGlzdCBvZiBtb2R1bGVzIHRoZSAiY3VycmVudCIgbW9kdWxlIGRlcGVuZHMgb24uIE9TIGFic3RyYWN0aW9uIGxheWVyIGRlcGVuZGVuY3kKKyMJCQkgKG1vZHVsZSAib3MiKSBpcyBhbHdheXMgcHJlc2VudCBpbXBsaWNpdGx5LiBGb3IgZXhhbXBsZSwgYXBpX2NsaSBtb2R1bGUncyBNYWtlZmlsZSAKKyMJCQkgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBsaW5lOgorIwkJCSBNT0RfREVQUyA9IGNsaSBhcGkgdXRpbHMgbW9kZWwKKyMgTU9EX0RFUFNfT1BUIC0gc2ltaWxhciB0byBNT0RfREVQUywgYnV0IGRlcGVuZGVuY2llcyBhcmUgb3B0aW9uYWwgYW5kIG1pZ2h0IG5vdCBiZSBwcmVzZW50IGluIHRoZSBzb3VyY2UgdHJlZS4KKyMgTU9EX0lOQ19ESVJTIC0gdXNlZCB3aGVuIG1vZHVsZSBleHBvcnRzIGluY2x1ZGVzIGluIGRpcmVjdG9yeShzKSBvdGhlciB0aGFuIHRoZSBtb2R1bGUgZGlyZWN0b3J5IAorIyBNT0RfREVGUyAtIGFkZGl0aW9uYWwgZGVmaW5lcywgaW5jbHVkaW5nIC1ELiB0aGUgZGVmaW5lcyBhcmUgYWRkZWQgd2hlbiBjb21waWxpbmcgInRoaXMiIG1vZHVsZQorIwkJCSBhbmQgYWxsIG1vZHVsZXMgZGVwZW5kaW5nIG9uIGl0CisjIE1PRF9MSUJTIC0gYWRkaXRpb25hbCBsaWJyYXJpZXMgcmVxdWlyZWQgYnkgdGhlIG1vZHVsZSwgaW5jbHVkaW5nIC1sIGFuZCAtTAorIyBNT0RfQ1VTVE9NIC0gaWYgc2V0ICJ5IiwgZGVmYXVsdCBydWxlIGZvciBidWlsZGluZyB0aGUgbW9kdWxlIGlzIE5PVCBwcm92aWRlZC4KKyMJCQkgSW4gdGhpcyBjYXNlIHRoZSBydWxlIGZvciBidWlsZGluZyAkKE1PRF9UQVJHRVQpIG11c3QgYmUgcHJvdmlkZWQgaW4gbW9kdWxlJ3MgTWFrZWZpbGUKKyMgTU9EX1BPU1RfQlVJTEQgLSBvcHRpb25hbCBjb21tYW5kcyB0aGF0IHNob3VsZCBiZSBleGVjdXRlZCBhZnRlciBzdWNjZXNzZnVsIG1vZHVsZSBidWlsZAorIyAKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG5vdCByZXF1aXJlZCBpbiBtb3N0IGNhc2VzLCBidXQgc3VwcG9ydGVkIG5vbmV0aGVsZXNzCisjIEVYVFJBX0NGTEFHUyAtIGV4dHJhIENGTEFHUyB0aGUgbW9kdWxlIHJlcXVpcmVzIGZvciBjb21waWxhdGlvbgorIyBFWFRSQV9JTkNMVURFUyAtIGV4dHJhIGluY2x1ZGUgZGlyZWN0b3JpZXMgdGhlIG1vZHVsZSByZXF1aXJlcyBmb3IgY29tcGlsYXRpb24gKHdpdGggLUkpCisjIEVYVFJBX0xJQlNfUEFUSCAtIGFkZGl0aW9uYWwgbGlicmFyeSBzZWFyY2ggcGF0aHMKKyMgRVhUUkFfTElCUyBhZGRpdGlvbmFsIGxpYnJhcmllcyB0byBsaW5rIHdpdGgKKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHByZS1zZXQgYW5kIGNhbiBiZSB1c2VkIGluIG1vZHVsZS1zcGVjaWZpYyBNYWtlZmlsZQorIyBUT1BfRElSIC0gZnVsbHkgcXVhbGlmaWVkIHRvcCBkaXJlY3RvcnkKKyMgTU9EX0RJUiAtIG1vZHVsZSBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHRvcCBkaXJlY3RvcnkKKyMgT1VUX0RJUl9CQVNFIC0gb3V0cHV0IGRpcmVjdG9yeSBiYXNlCisjIEFMTF9NT0RVTEVTIC0gbGlzdCBvZiBhbGwgbW9kdWxlcyBpbiB0aGUgY3VycmVudCBzdWJzeXN0ZW0gKGNvcmUvYXBwcykKKyMgQUxMX0xJQl9NT0RVTEVTIC0gbGlzdCBvZiBhbGwgbGliIG1vZHVsZXMgaW4gdGhlIGN1cnJlbnQgc3Vic3lzdGVtIChjb3JlL2FwcHMpCisjIEFMTF9BUFBfTU9EVUxFUyAtIGxpc3Qgb2YgYWxsIGFwcCBtb2R1bGVzIGluIHRoZSBjdXJyZW50IHN1YnN5c3RlbSAoY29yZS9hcHBzKQorIyBTSU1VTEFUSU9OX0JVSUxEIC0gc2V0ICJ5IiBmb3Igc2ltdWxhdGlvbiBidWlsZCAoQ1JPU1NfQ09NUElMRSBpcyBlbXB0eSkgCisjIE9TIC0gT1MKKyMgRU5BQkxFX0VQT04gLSBzZXQgInkiIGlmIEVQT04gbW9kZSBpcyBpbmNsdWRlZAorIyBFTkFCTEVfR1BPTiAtIHNldCAieSIgaWYgR1BPTiBtb2RlIGlzIGluY2x1ZGVkCisjIEVOQUJMRV9YR1BPTiAtIHNldCAieSIgaWYgWEdQT04gbW9kZSBpcyBpbmNsdWRlZAorIyBFTkFCTEVfR1BPTl9PUl9YR1BPTiAtIHNldCAieSIgaWYgR1BPTiBvciBYR1BPTiBtb2RlIGlzIGluY2x1ZGVkCisjIEVOQUJMRV9DTEkgLSBzZXQgIm4iIGlmIENMSSBzdXBwb3J0IGlzIG5vdCByZXF1aXJlZAorIyBFTkFCTEVfTE9HIC0gc2V0ICJuIiBpZiBsb2dnZXIgc3VwcG9ydCBpcyBub3QgcmVxdWlyZWQKKyMKKyMgVVNFX0NMQU5HIC0gc2V0ICJ5IiB0byBlbmFibGUgQ0xBTkcgY29kZSBwYXNzIGZvciBpbXByb3ZlZCBkaWFnbm9zdGljCisjCisjIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBwcmUtc2V0IGFuZCBjYW4gYmUgdXNlZCBhbmQvb3Igb3ZlcndyaXR0ZW4gaW4gbW9kdWxlLXNwZWNpZmljIE1ha2VmaWxlCisjIFNSQ19ESVIgLSBmdWxseS1xdWFsaWZpZWQgc291cmNlIGRpcmVjdG9yeQorIyBPVVRfRElSIC0gbW9kdWxlIG91dHB1dCBkaXJlY3RvcnkKKyMgVEFSR0VUX0xJQiAtIGxpYnJhcnkgbmFtZSBmb3IgImxpYiIgb3IgInNoYXJlZF9saWIiIG1vZHVsZS4gQnkgZGVmYXVsdCBpdCBpcyAkKE1PRF9OQU1FKQorIyBUQVJHRVRfTElCX0ZOQU1FIC0gbW9kdWxlIGxpYnJhcnkgZmlsZSBuYW1lIGluY2x1ZGluZyBwYXRoLiAKKyMJCUJ5IGRlZmF1bHQgaXQgaXMgJChPVVRfRElSKS9saWIkKFRBUkdFVF9MSUIpLmEgZm9yICJsaWIiIG1vZHVsZSBhbmQgCisjCQkkKE9VVF9ESVIpL2xpYiQoVEFSR0VUX0xJQikuc28gZm9yICJzaGFyZWRfbGliIgorIyBNT0RfVEFSR0VUIC0gbW9kdWxlIHRhcmdldCBuYW1lLCBpbmNsdWRpbmcgcGF0aC4gQnkgZGVmYXVsdCBpdCBpcyAKKyMJJChPVVRfRElSKS8kKE1PRF9OQU1FKSBmb3IgImFwcCIgbW9kdWxlcworIwkkKFRBUkdFVF9MSUJfRk5BTUUpIGZvciAibGliIiBhbmQgInNoYXJlZF9saWIiIG1vZHVsZXMKKyMgQ09ERUdFTl9PVVRQVVRfRElSIC0gb3V0cHV0IGRpcmVjdG9yeSBjb250YWluaW5nIGdlbmVyYXRlZCBmaWxlcworCitUT09MQ0hBSU4gICAgPz0gZ2NjCitPUyAgICAgICAgICAgPz0gcG9zaXgKK0RFQlVHICAgICAgICA/PSB5CitCTERfREVQICAgICAgPz0gZ2NjCitVU0VfQ0xBTkcgCSA/PSBuCisKK2V4cG9ydCBTSEVMTCA6PSAvYmluL2Jhc2gKKworZXhwb3J0IEJPQVJECitleHBvcnQgVE9PTENIQUlOCitleHBvcnQgT1MKK2V4cG9ydCBERUJVRworZXhwb3J0IEJMRF9ERVAKK2V4cG9ydCBPU19LRVJORUwKKworViA/PSAwCitpZmVxICh4IiQoVikiLCB4IjAiKQorICAgIFNJTEVOVF9CVUlMRCA9IEAKK2VuZGlmCisKK1NSQ19ESVIJCSAgICAgPSAkKFRPUF9ESVIpLyQoTU9EX0RJUikKK09VVF9ESVJfQkFTRSAJPz0gJChUT1BfRElSKS9idWlsZC8kKFNVQlNZU1RFTSkKK09VVF9ESVIgICAgICAJOj0gJChPVVRfRElSX0JBU0UpLyQoTU9EX0RJUikKKworIworIyBDb21waWxlciB3YXJuaW5nIGNvbmZpZ3VyYXRpb24KKyMgU29tZSBleHRyYSB3YXJuaW5ncyBhcmUgYWx3YXlzIGVuYWJsZWQuIE90aGVycyBtdXN0IGJlIG9wdGVkIGluIG9uIHRoZSBtb2R1bGUgbGV2ZWwKKyMKK0VOQUJMRV9FWFRSQV9XQVJOSU5HUyA/PSB5CitleHBvcnQgRU5BQkxFX0VYVFJBX1dBUk5JTkdTCisKK2lmbmVxICgiJChCVUlMRF9OQ19BR0VOVCkiLCAieSIpCisgICAgb3ZlcnJpZGUgTkNfQUdFTlQgOj0gbm9uZQorZW5kaWYKKworIyBJbmNsdWRlIG9wdGlvbmFsIHN1YnN5c3RlbS1zcGVjaWZpYyBjb25maWd1cmF0aW9uCistaW5jbHVkZSBtay8kKFNVQlNZU1RFTSkvTWFrZWZpbGUuJChTVUJTWVNURU0pLmNvbmZpZworCitFTkFCTEVfRVBPTgkgPz0geQorRU5BQkxFX0dQT04JID89IHkKK0VOQUJMRV9YR1BPTiA/PSB5CisKK0VOQUJMRV9HUE9OX09SX1hHUE9OID0gbgoraWZlcSAoIiQoRU5BQkxFX0dQT04pIiwgInkiKQorICAgIEVOQUJMRV9HUE9OX09SX1hHUE9OID0geQorZW5kaWYKK2lmZXEgKCIkKEVOQUJMRV9YR1BPTikiLCAieSIpCisgICAgRU5BQkxFX0dQT05fT1JfWEdQT04gPSB5CitlbmRpZgorZXhwb3J0IEVOQUJMRV9FUE9OCitleHBvcnQgRU5BQkxFX0dQT04KK2V4cG9ydCBFTkFCTEVfWEdQT04KK2V4cG9ydCBFTkFCTEVfR1BPTl9PUl9YR1BPTgorCitDT05GSUdfRElSICAgICAgPSBzcmMvY29tbW9uL2NvbmZpZworT1NfUExBVEZPUk1fRElSID0gc3JjLyQoU1VCU1lTVEVNKS9wbGF0Zm9ybQorCisjIENMSSBhbmQgbG9nZ2VyIHN1cHBvcnQKK0VOQUJMRV9DTEkgPz0geQorRU5BQkxFX0xPRyA/PSB5CitCQUxfTU9OT0xJVEhJQyA/PSB5CisKK2V4cG9ydCBFTkFCTEVfQ0xJCitleHBvcnQgRU5BQkxFX0xPRworZXhwb3J0IEJBTF9NT05PTElUSElDCisKKyMKKyMjIyBJbmNsdWRlIG1vZHVsZSBNYWtlZmlsZQorIyBGb3IgTU9EX0NVU1RPTSBvbmx5IHdpbGwgYmUgaW5jbHVkZWQgaW4gTWFrZWZpbGUucnVsZXMgc2Vjb25kIHRpbWUgZm9yIHByb3BhZ2F0ZSBjdXN0b20gcnVsZXMgCisjCitpbmNsdWRlICQoU1JDX0RJUikvTWFrZWZpbGUKKworIyBDb2RlLWdlbmVyYXRvciAtIHJlbGF0ZWQgcGFyYW1ldGVycworQ09ERUdFTl9JTlBVVF9ESVIJID0gJChTUkNfRElSKS9jb2RlZ2VuX3RlbXBsYXRlcworQ09ERUdFTl9PVVRQVVRfRElSCSA9ICQoT1VUX0RJUikKK0NPREVHRU5fRElSCQkJID0gJChUT1BfRElSKS9zcmMvZGF0YW1vZGVsL2Jpbi9jb2RlZ2VuCitDT0RFR0VOX0VYRSAgICAgICAgICA9ICQoQ09ERUdFTl9ESVIpL1Rla25vdnVzLk1ldGFTdHJ1Y3R1cmUuQ29kZUdlbmVyYXRvci5leGUKKworT01DSV9TVEFDS19DT0RFR0VOX0lOUFVUX0RJUiA9ICQoU1JDX0RJUikvbWVfY29kZWdlbgorT01DSV9TVEFDS19DT0RFR0VOX0VYRSA9ICQoT1VUX0RJUikvb21jaV9tZV9jb2RlZ2VuCisKK0JBTF9NT0RFTF9GSUxFCQkgPSAkKFRPUF9ESVIpL3NyYy9kYXRhbW9kZWwvYmFsLm9ianNldAorT01DSV9NT0RFTF9GSUxFCQkgPSAkKFRPUF9ESVIpL3NyYy9kYXRhbW9kZWwvb21jaS5vYmpzZXQKK09NQ0lfU1RBQ0tfTU9ERUxfRklMRSA9ICQoVE9QX0RJUikvc3JjL2RhdGFtb2RlbC9vbWNpX21lX2RhdGFtb2RlbC5jc3YKK01PTk9fVkVSICAgICAgICAgICAgPz0gNC4zLjIuNDY3CitNT05PX1BBVEggICAgICAgICAgID89IC9vcHQvbW9uby0kKE1PTk9fVkVSKS9iaW4vbW9ubworCitleHBvcnQgU1JDX0RJUgorZXhwb3J0IE9VVF9ESVJfQkFTRQorZXhwb3J0IE9VVF9ESVIKK2V4cG9ydCBNT0RFTF9PVVRfRElSCisKK2lmZXEgKCIkKHdpbGRjYXJkICQoTU9OT19QQVRIKSkiLCAiIikKKyAgICAjIElmIHdlIGNhbid0IGZpbmQgTW9ubyBpbnN0YWxsZWQgaW4gdGhlIGNvcnJlY3QgcGF0aCwgZGVmYXVsdCB0byB0aGUgY3VycmVudCBQQVRIIHZlcnNpb24uCisgICAgIyBJbiB0aGUgZnV0dXJlLCB3ZSBzaG91bGQgYWx3YXlzIHVzZSBNb25vIGZyb20gYSBjb21tb24gdG9vbHMgZGlyZWN0b3J5LgorICAgICMgVE9ETzogY2hhbmdlIHRoaXMgb25jZSB0aGUgY29tcGlsZXIvdG9vbGNoYWluIHBhdGhzIGFyZSBiZXR0ZXIgZGVmaW5lZC4KKyAgICBNT05PX1BBVEggICAgICAgID0gbW9ubworZW5kaWYKKworIyBUcmVhdCAieWVzIiBhbmQgInkiIHRoZSBzYW1lCitpZmVxICgiJChVU0VfQ0xBTkcpIiwgInllcyIpCisgICAgVVNFX0NMQU5HIDo9IHkKK2VuZGlmCitpZmVxICgiJChVU0VfQ0xBTkcpIiwgInkiKQorICAgIGluY2x1ZGUgJChNQUtFX0RJUikvY2xhbmcub3B0cworZW5kaWYKKworIyBEaXNhYmxlIGNvZGUgZ2VuZXJhdGlvbiBpbiByZWxlYXNlIGJ1aWxkCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBzcmNzIDo9ICQoc3JjcykgJChnZW5fYmFsX3NyY3MpICQoZ2VuX29tY2lfc3JjcykKKyAgICBnZW5fYmFsX2hkcnMgOj0gCisgICAgZ2VuX2JhbF9zcmNzIDo9IAorICAgIGdlbl9vbWNpX2hkcnMgOj0gCisgICAgZ2VuX29tY2lfc3JjcyA6PSAKKyAgICAjIERpc2FibGUgTElOVCBhbmQgQ0xBTkcKKyAgICBVU0VfTElOVCA9IG4KKyAgICBVU0VfQ0xBTkcgPSBuCitlbmRpZgorCitTUkNTID0gJChzdHJpcCAkKHNyY3M6JT0kKFNSQ19ESVIpLyUpKQorCisjIEluIENPTVBJTEVfQUxMX0lOX09ORV9HTyBtb2RlIGFsbCAuYyBmaWxlcyBvZiBhIG1vZHVsZSBhcmUgY29tcGlsZWQgaW4gCisjIGEgc2luZ2xlIGludm9jYXRpb24gb2YgQkxEX0NDIGNvbXBpbGVyLiBJbiByZXN1bHQsIG9iamVjdHMgZmlsZXMgYXJlIGNyZWF0ZWQKKyMgaW4gT1VUX0RJUiBldmVuIGlmIG1vZHVsZSdzIC5jIGZpbGVzIGFyZSBzcHJlYWQgaW4gc3ViLWRpcmVjdG9yaWVzCitpZmVxICgiJChDT01QSUxFX0FMTF9JTl9PTkVfR08pIiwgInkiKQorICAgIHNyY3Nfbm9fZGlyID0gJChub3RkaXIgJChzcmNzKSkgIAorICAgIF9PQkpTID0gJChzcmNzX25vX2RpcjolLmM9JChPVVRfRElSKS8lLm8pCitlbHNlCisgICAgX09CSlMgPSAkKHNyY3M6JS5jPSQoT1VUX0RJUikvJS5vKQorZW5kaWYKKworYXNfU1JDUyA9ICQoc3RyaXAgJChhc19zcmNzOiU9JChTUkNfRElSKS8lKSkKK2FzX09CSlMgPSAkKGFzX3NyY3M6JS5zPSQoT1VUX0RJUikvJS5vKQorX09CSlMgICs9ICQoYXNfT0JKUykKKworQVNfU1JDUyA9ICQoc3RyaXAgJChBU19zcmNzOiU9JChTUkNfRElSKS8lKSkKK0FTX09CSlMgPSAkKEFTX3NyY3M6JS5TPSQoT1VUX0RJUikvJS5vKQorX09CSlMgICs9ICQoQVNfT0JKUykKKworaWZuZXEgKCIkKGdlbl9iYWxfc3JjcykiLCAiIikKKyAgICBHRU5fQkFMX1NSQ1MgPSAkKHN0cmlwICQoZ2VuX2JhbF9zcmNzOiU9JChDT0RFR0VOX09VVFBVVF9ESVIpLyUpKQorICAgIF9PQkpTICs9ICQoR0VOX0JBTF9TUkNTOiUuYz0lLm8pCitlbmRpZgoraWZuZXEgKCIkKGdlbl9iYWxfaGRycykiLCAiIikKKyAgICBHRU5fQkFMX0hEUlMgPSAkKHN0cmlwICQoZ2VuX2JhbF9oZHJzOiU9JChDT0RFR0VOX09VVFBVVF9ESVIpLyUpKQorZW5kaWYKKworaWZuZXEgKCIkKGdlbl9vbWNpX3NyY3MpIiwgIiIpCisgICAgR0VOX09NQ0lfU1JDUyA9ICQoc3RyaXAgJChnZW5fb21jaV9zcmNzOiU9JChDT0RFR0VOX09VVFBVVF9ESVIpLyUpKQorICAgIF9PQkpTICs9ICQoR0VOX09NQ0lfU1JDUzolLmM9JS5vKQorZW5kaWYKK2lmbmVxICgiJChnZW5fb21jaV9oZHJzKSIsICIiKQorICAgIEdFTl9PTUNJX0hEUlMgPSAkKHN0cmlwICQoZ2VuX29tY2lfaGRyczolPSQoQ09ERUdFTl9PVVRQVVRfRElSKS8lKSkKK2VuZGlmCisKK2lmbmVxICgiJChnZW5fb21jaV9zdGFja19zcmNzKSIsICIiKQorICAgIEdFTl9PTUNJX1NUQUNLX1NSQ1MgPSAkKHN0cmlwICQoZ2VuX29tY2lfc3RhY2tfc3JjczolPSQoQ09ERUdFTl9PVVRQVVRfRElSKS8lKSkKKyAgICBfT0JKUyArPSAkKEdFTl9PTUNJX1NUQUNLX1NSQ1M6JS5jPSUubykKK2VuZGlmCitpZm5lcSAoIiQoZ2VuX29tY2lfc3RhY2tfaGRycykiLCAiIikKKyAgICBHRU5fT01DSV9TVEFDS19IRFJTID0gJChzdHJpcCAkKGdlbl9vbWNpX3N0YWNrX2hkcnM6JT0kKENPREVHRU5fT1VUUFVUX0RJUikvJSkpCitlbmRpZgorCitPQkpTID0gJChzdHJpcCAkKF9PQkpTKSkKKworR0VOX1NSQ1MgPSAkKEdFTl9CQUxfU1JDUykgJChHRU5fT01DSV9TUkNTKSAkKEdFTl9PTUNJX1NUQUNLX1NSQ1MpCitHRU5fSERSUyA9ICQoR0VOX0JBTF9IRFJTKSAkKEdFTl9PTUNJX0hEUlMpICQoR0VOX09NQ0lfU1RBQ0tfSERSUykKKworIyBBZGQgZGVmYXVsdCBkZXBlbmRlbmN5IG9uIE9TIGFic3RyYWN0aW9uCitpZmVxICgiJChNT0RfTkFNRSkiLCAiIikKKyAgICBpZm5lcSAoeCIkKFYpIiwgeCIwIikKKyAgICAgICAgJChpbmZvIE1PRF9OQU1FIGlzIG5vdCBzZXQgZm9yICQoU1JDX0RJUikvTWFrZWZpbGUuIFNraXBwaW5nLi4pCisgICAgZW5kaWYKKyAgICBNT0RfVFlQRSA9IF9za2lwXworZW5kaWYKKworIyBBZGQgZGVmYXVsdCBkZXBlbmRlbmN5IG9uIE9TIGFic3RyYWN0aW9uCitpZm5lcSAoIiQoTU9EX1NVUFBSRVNTX09TX0RFUCksICJ5KQorICAgIGlmZXEgKCIkKE1PRF9UWVBFKSIsICJsaW51eF9tb2R1bGUiKQorICAgICAgICBfa2VybmVsID0geQorICAgIGVuZGlmCisgICAgaWZlcSAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X2xpYiIpCisgICAgICAgIF9rZXJuZWwgPSB5CisgICAgZW5kaWYKKyAgICBpZmVxICgiJChfa2VybmVsKSIsICJ5IikKKyAgICAgICAgIE1PRF9ERVBTIDo9IG9zX2xpbnV4ICQoTU9EX0RFUFMpCisgICAgZWxzZSAgICAKKyAgICAgICAgIE1PRF9ERVBTIDo9IG9zICQoTU9EX0RFUFMpCisgICAgZW5kaWYKK2VuZGlmCisKKyMgRXh0cmEgdHlwZXMgZmlsdGVyCitpZm5lcSAoIiQoRVhUUkFfVFlQRVMpIiwgIiIpCisgICAgRVhUUkFfVFlQRVMgOj0gJChzaGVsbCBlY2hvIC1uICQoRVhUUkFfVFlQRVMpIHwgc2VkIC1lICdzLyAvXFx8L2cnKQorICAgIEdFTl9FWFRSQV9UWVBFUyA6PSAtdHlwZU5hbWVGaWx0ZXI9XF5cKCQoRVhUUkFfVFlQRVMpXClcJCQgCitlbmRpZgorCitPU19LRVJORUwgPz0gJChPUykKK1VDX1BMQVRGT1JNID0gJChzaGVsbCBlY2hvICQoUExBVEZPUk0pIHwgdHIgYS16IEEtWikKK1VDX1NVQlNZU1RFTSA9ICQoc2hlbGwgZWNobyAkKFNVQlNZU1RFTSkgfCB0ciBhLXogQS1aKQorVUNfT1MgPSAkKHNoZWxsIGVjaG8gJChPUykgfCB0ciBhLXogQS1aKQorVUNfT1NfS0VSTkVMID0gJChzaGVsbCBlY2hvICQoT1NfS0VSTkVMKSB8IHRyIGEteiBBLVopCisKK0VYVFJBX0RFRklORVMgICArPSAtREJDTV9TVUJTWVNURU1fJChVQ19TVUJTWVNURU0pIC1EQkNNX1BMQVRGT1JNXyQoVUNfUExBVEZPUk0pIC1EQkNNX09TXyQoVUNfT1MpCitFWFRSQV9ERUZJTkVTICAgKz0gLURCQ01fU1VCU1lTVEVNX0hPU1QKK0VYVFJBX0RFRklORVMgICArPSAtRCQoVUNfT1NfS0VSTkVMKV9LRVJORUxfU1BBQ0UKK2lmZXEgKCIkKEVOQUJMRV9FUE9OKSIsICJ5IikKKyAgICBFWFRSQV9ERUZJTkVTCSs9IC1EQkNNX0VQT04KK2VuZGlmCitpZmVxICgiJChFTkFCTEVfR1BPTikiLCAieSIpCisgICAgRVhUUkFfREVGSU5FUwkrPSAtREJDTV9HUE9OCitlbmRpZgoraWZlcSAoIiQoRU5BQkxFX1hHUE9OKSIsICJ5IikKKyAgICBFWFRSQV9ERUZJTkVTCSs9IC1EQkNNX1hHUE9OCitlbmRpZgorCitpZm5lcSAoIiQoQ09ORklHX01BQ19SUEMpIiwgIm4iKQorRVhUUkFfREVGSU5FUyArPSAtRENPTkZJR19NQUNfUlBDCitlbmRpZgorCitpZm5lcSAoIiQoQ09ORklHX1NXSVRDSF9SUEMpIiwgIm4iKQorRVhUUkFfREVGSU5FUyArPSAtRENPTkZJR19TV0lUQ0hfUlBDCitlbmRpZgorCitpZm5lcSAoIiQoQk9BUkQpIiwgIiIpCitFWFRSQV9ERUZJTkVTCSs9IC1EQk9BUkQ9JChCT0FSRCkKK2VuZGlmCisKK2lmZXEgKCIkKEJPQVJEKSIsICJ3cngiKQorRVhUUkFfREVGSU5FUwkrPSAtRFdSWF9CVUlMRAorZW5kaWYKKworaWZlcSAoIiQoQlVJTERfT0ZfQUdFTlQpIiwgInkiKQorRVhUUkFfREVGSU5FUyAgICs9IC1EQlVJTERfT0ZfQUdFTlQKK2VuZGlmCisKK2lmZXEgKCIkKEZPUkNFX1BLVElOX1NORCkiLCAieSIpCitFWFRSQV9ERUZJTkVTICAgKz0gLURGT1JDRV9QS1RJTl9TTkQKK2VuZGlmCisKKyMgQnVpbGQgdW5pdGVzdHMgZm9yIHNpbXVsYXRpb24gYW5kIGZyb20gSmVua2lucyBqb2JzCitVTklURVNUID89IG4KKworaWZlcSAoIiQoU0lNVUxBVElPTl9CVUlMRCkiLCAieSIpCisJRVhUUkFfREVGSU5FUyArPSAtRFNJTVVMQVRJT05fQlVJTEQKKwlVTklURVNUID0geQorZW5kaWYKKworaWZlcSAoIiQoSkVOS0lOU19CVUlMRCkiLCAieSIpCisJVU5JVEVTVCA9IHkKK2VuZGlmCisKK2lmZXEgKCIkKEJBTF9NT05PTElUSElDKSIsICJ5IikKKyAgICBFWFRSQV9ERUZJTkVTICs9IC1EQkFMX01PTk9MSVRISUMKK2VuZGlmCisKK0VYVFJBX0lOQ0xVREVTICArPSAtSSQoU1JDX0RJUikKK0VYVFJBX0lOQ0xVREVTICArPSAtSSQoVE9QX1NSQ19ESVIpL2NvbW1vbi9pbmNsdWRlIC1JJChPVVRfRElSX0JBU0UpL3NyYy9jb21tb24vaW5jbHVkZQorCitPUFRfRElTQUJMRV8kKFVDX1NVQlNZU1RFTSkgPz1uCitPUFRfRElTQUJMRSA6PSAkKE9QVF9ESVNBQkxFXyQoVUNfU1VCU1lTVEVNKSkKKworQVJDSF9DRkxBR1MgPSAkKEFSQ0hfRkxBR1MpCitpZmVxICgiJChPUFRfRElTQUJMRSkiLCAieSIpCisgICAgQVJDSF9DRkxBR1MJCSs9ICQoREVCVUdfT19DRkxBR1MpCisJRVhUUkFfTEZMQUdTCSs9ICQoREVCVUdfT19MRkxBR1MpCisgICAgRVhUUkFfQVNGTEFHUyAgICs9ICQoREVCVUdfT19BU0ZMQUdTKQorICAgIEVYVFJBX2FzRkxBR1MgICArPSAkKERFQlVHX09fYXNMQUdTKQorZWxzZQorICAgIEFSQ0hfQ0ZMQUdTICAgICArPSAkKFJFTEVBU0VfT19DRkxBR1MpCisJRVhUUkFfTEZMQUdTCSs9ICQoUkVMRUFTRV9PX0xGTEFHUykKKyAgICBFWFRSQV9BU0ZMQUdTICAgKz0gJChSRUxFQVNFX09fQVNGTEFHUykKKyAgICBFWFRSQV9hc0ZMQUdTICAgKz0gJChSRUxFQVNFX09fYXNGTEFHUykKK2VuZGlmCisKKyMgM3JkIHBhcnR5IHBhY2thZ2VzIGluc3RhbGwgbG9jYXRpb24KK0lOU1RBTExfRElSID89ICQoT1VUX0RJUl9CQVNFKQorZXhwb3J0IElOU1RBTExfRElSCitFWFRSQV9JTkNMVURFUyArPSAtSSQoSU5TVEFMTF9ESVIpL2luY2x1ZGUKKworUEFUSCA6PSAkKElOU1RBTExfRElSKS9iaW46JChQQVRIKQorZXhwb3J0IFBBVEgKKworIyBTaGFyZWQgbGlicmFyeSBsb2NhdGlvbgorU0hBUkVEX0xJQl9ESVIgPz0gJChJTlNUQUxMX0RJUikvbGliCitleHBvcnQgU0hBUkVEX0xJQl9ESVIKKworIyBUcmVhdCBsaWIgYXMgc2hhcmVkIGxpYiBpZiBCVUlMRF9TSEFSRURfTElCUyBpcyB5CitpZmVxICAoIiQoQlVJTERfU0hBUkVEX0xJQlMpIiwgInkiKQorICAgZXhwb3J0IEJVSUxEX1NIQVJFRF9MSUJTCisgICBpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpYiIpCisgICAgICBNT0RfVFlQRSA9IHNoYXJlZF9saWIKKyAgIGVuZGlmCisgICBFWFRSQV9MSUJTX1BBVEggKz0gLUwkKFRPUF9ESVIpLyQoTE9DQUxfTUFQTEVfU0RLX0RJUikvYnVpbGQvc2hhcmVkX2xpYnMKK2VuZGlmCitFWFRSQV9MSUJTX1BBVEggKz0gLUwkKFNIQVJFRF9MSUJfRElSKQorCisjIENhbGN1bGF0ZSBNT0RfVEFSR0VUIGJhc2VkIG9uIE1PRF9UWVBFCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpYiIpCisJaWZuZXEgKCIkKE9CSlMpIiwgIiIpCisJCVRBUkdFVF9MSUIgPz0gJChNT0RfTkFNRSkKKwkJVEFSR0VUX0xJQl9GTkFNRSA/PSAkKE9VVF9ESVIpL2xpYiQoVEFSR0VUX0xJQikuYQorCWVuZGlmCisJTU9EX1RBUkdFVCA/PSAkKFRBUkdFVF9MSUJfRk5BTUUpCitlbHNlIGlmZXEgICgiJChNT0RfVFlQRSkiLCAic2hhcmVkX2xpYiIpCisJaWZuZXEgKCIkKE9CSlMpIiwgIiIpCisJCVRBUkdFVF9MSUIgPz0gJChNT0RfTkFNRSkKKwkJVEFSR0VUX0xJQl9GTkFNRSA/PSAkKE9VVF9ESVIpL2xpYiQoVEFSR0VUX0xJQikuc28KKwllbmRpZgorCU1PRF9UQVJHRVQgPz0gJChUQVJHRVRfTElCX0ZOQU1FKQorZWxzZSBpZmVxICAoIiQoTU9EX1RZUEUpIiwgImFwcCIpCisJTU9EX1RBUkdFVCA/PSAkKE9VVF9ESVIpLyQoTU9EX05BTUUpCitlbHNlIGlmZXEgICgiJChNT0RfVFlQRSkiLCAibGludXhfbW9kdWxlIikKKyAgICBpZmVxICgiJChLRVJORUxESVIpIiwgIiIpCisgICAgICAgICQoZXJyb3IgS0VSTkVMRElSIG11c3QgYmUgc2V0IGluIGJvYXJkIHByb2ZpbGUpCisgICAgZW5kaWYKKyAgICBpZmVxICgiJChLRVJORUxfQVJDSCkiLCAiIikKKyAgICAgICAgJChlcnJvciBLRVJORUxfQVJDSCBtdXN0IGJlIHNldCBpbiBib2FyZCBwcm9maWxlKQorICAgIGVuZGlmCisgICAgaWZlcSAoIiQoS0VSTkVMX09VVERJUikiLCAiIikKKyAgICAgICAgS0VSTkVMX09VVERJUiA6PSAkKEtFUk5FTERJUikKKyAgICBlbmRpZgorCU1PRF9UQVJHRVQgPz0gJChTUkNfRElSKS8kKE1PRF9OQU1FKS5rbworZWxzZSBpZmVxICgiJChNT0RfVFlQRSkiLCAibGludXhfbGliIikgCisgICAgTU9EX1RBUkdFVCA/PSAkKE9VVF9ESVJfQkFTRSkvJChNT0RfTkFNRSkubGludXhsaWIKK2Vsc2UgaWZlcSAoIiQoTU9EX1RZUEUpIiwgIl9za2lwXyIpCisgICAgTU9EX1RBUkdFVCA9IC5kdW1teQorZWxzZSAgICAgICAgCQorICAgICQoZXJyb3IgTU9EX1RZUEUgJChNT0RfVFlQRSkgaXMgaW5jb3JyZWN0IGZvciBtb2R1bGUgJChNT0RfTkFNRSkuIE11c3QgYmUgbGliIG9yIGFwcCkKK2VuZGlmCisKK2lmZXEgKCIkKE1PRF9UQVJHRVQpIiwgIiIpCisgICBNT0RfVEFSR0VUID0gJChNT0RfTkFNRSkKK2VuZGlmCisKK2lmZXEgKCIkKE9TKSIsICJwb3NpeCIpCisJRVhUUkFfREVGSU5FUyArPSAtRF9YT1BFTl9TT1VSQ0U9NjAwCisgICAgTElCUyAgID0gLWxydCAtbHB0aHJlYWQgLWxtCitlbmRpZgorCisjIE1ha2Ugc3VyZSB0aGF0IHBhdGhzIGluIEVYVFJBX0lOQ0xVREVTIGFyZSBhYnNvbHV0ZQoraWZuZXEgKCIkKEVYVFJBX0lOQ0xVREVTKSIsICIiKQorICAgICMgTWFrZSBzdXJlIHRoYXQgZWFjaCBkaXJlY3RvcnkgaXMgYW4gYWJzb2x1dGUgcGF0aAorICAgIEVYVFJBX0lOQ1MgPSAkKGFkZHByZWZpeCAtSSwgJChhYnNwYXRoICQoc3Vic3QgLUksLCQoc3Vic3QgJChUT1BfRElSKS8sLCQoRVhUUkFfSU5DTFVERVMpKSkpKQorZW5kaWYKK2lmbmVxICgiJChFWFRSQV9BU0lOQ0xVREVTKSIsICIiKQorICAgICMgTWFrZSBzdXJlIHRoYXQgZWFjaCBkaXJlY3RvcnkgaXMgYW4gYWJzb2x1dGUgcGF0aAorICAgIEVYVFJBX0FTSU5DUyA9ICQoYWRkcHJlZml4IC1JLCAkKGFic3BhdGggJChzdWJzdCAtSSwsJChzdWJzdCAkKFRPUF9ESVIpLywsJChFWFRSQV9BU0lOQ0xVREVTKSkpKSkKK2VuZGlmCitpZm5lcSAoIiQoRVhUUkFfYXNJTkNMVURFUykiLCAiIikKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IGVhY2ggZGlyZWN0b3J5IGlzIGFuIGFic29sdXRlIHBhdGgKKyAgICBFWFRSQV9hc0lOQ1MgPSAkKGFkZHByZWZpeCAtSSwgJChhYnNwYXRoICQoc3Vic3QgLUksLCQoc3Vic3QgJChUT1BfRElSKS8sLCQoRVhUUkFfYXNJTkNMVURFUykpKSkpCitlbmRpZgoraWZlcSAoIiQoVVNFX0xJTlQpIiwgInkiKQorICAgIFVTRV9MSU5UIDo9IHllcworZW5kaWYgICAgCitpZmVxICgiJChVU0VfTElOVCkiLCAieWVzIikKKyAgICBFWFRSQV9ERUZJTkVTICs9IC1EVVNFX0xJTlQKK2VuZGlmCisKK0VYVFJBX0RFRklORVMgKz0gJChVU0VSX0VYVFJBX0RFRklORVMpICQoVVNFUl9FWFRSQV8kKFVDX1NVQlNZU1RFTSlfREVGSU5FUykKK0VYVFJBX0NGTEFHUyArPSAkKFVTRVJfRVhUUkFfQ0ZMQUdTKSAkKFVTRVJfRVhUUkFfJChVQ19TVUJTWVNURU0pX0NGTEFHUykKK0NGTEFHUyAgKz0gJChBUkNIX0NGTEFHUykgJChFWFRSQV9DRkxBR1MpICAkKEVYVFJBX0lOQ1MpICQoRVhUUkFfREVGSU5FUykKK0FTRkxBR1MgKz0gJChBUkNIX0ZMQUdTKSAkKEVYVFJBX0FTRkxBR1MpICQoRVhUUkFfQVNJTkNTKSAkKEVYVFJBX0FTREVGSU5FUykKK2FzRkxBR1MgKz0gJChBUkNIX0ZMQUdTKSAkKEVYVFJBX2FzRkxBR1MpICQoRVhUUkFfYXNJTkNTKSAkKEVYVFJBX2FzREVGSU5FUykKK0xGTEFHUyAgKz0gJChBUkNIX0ZMQUdTKSAkKEVYVFJBX0xGTEFHUykKK0RFUF9GTEFHUyArPSAkKEVYVFJBX0NGTEFHUykgJChFWFRSQV9JTkNTKSAkKEVYVFJBX0RFRklORVMpCitDTEFOR19GTEFHUyArPSAkKEVYVFJBX0NGTEFHUykgJChFWFRSQV9JTkNTKSAkKEVYVFJBX0RFRklORVMpICQoQ0xBTkdfT1BUUykKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL21rL01ha2VmaWxlLmluaXRpYWxfY29uZmlnIGIvYmFsX3JlbGVhc2UvbWsvTWFrZWZpbGUuaW5pdGlhbF9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxZWM4NAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL21rL01ha2VmaWxlLmluaXRpYWxfY29uZmlnCkBAIC0wLDAgKzEsNiBAQAoraWZlcSAoIiQoVEVSTSkiLCAiZHVtYiIpCisgICAgICAgIEJPTERfUFJJTlQgOj0gcHJpbnRmICJcbi0tLS0gJXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKK2Vsc2UKKyAgICAgICAgQk9MRF9QUklOVD89cHJpbnRmICIbWzAxbSVzG1swbVxuIgorZW5kaWYKK2V4cG9ydCBCT0xEX1BSSU5UCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9tay9NYWtlZmlsZS5tYWluIGIvYmFsX3JlbGVhc2UvbWsvTWFrZWZpbGUubWFpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODE4NzY2Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvbWsvTWFrZWZpbGUubWFpbgpAQCAtMCwwICsxLDE4MCBAQAorIyBJdCBpcyBpbmNsdWRlZCBmcm9tIHRoZSBjZW50cmFsIE1ha2VmaWxlIG9uY2UgZm9yIGVhY2ggc3Vic3lzdGVtIChlLmcuLCAiY29yZSIgYW5kICJhZ2VudCIpCisjIFBBUkFNQVRFUjogU1VCU1lTVEVNCisKK1VDX1NVQlNZU1RFTSA9ICQoc2hlbGwgZWNobyAkKFNVQlNZU1RFTSkgfCB0ciBhLXogQS1aKQorZXhwb3J0IEJVSUxEX1RBUkdFVCA9ICQoU1VCU1lTVEVNKQorZXhwb3J0IEJJTl9SRUxFQVNFX0ZJTEVfUFJFRklYID89IHJlbGVhc2UuYmluLiQoU1VCU1lTVEVNKS4kKEJVSUxEX1ZFUlNJT05fUFJFRklYKQorZXhwb3J0IE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSIAkgPz0gJChPVVRfRElSKS8kKFNVQlNZU1RFTSkKKworIyBDb21iaW5lIG1vZHVsZXMuJChTVUJTWVNURU0pLmJhbCwgbW9kdWxlcy4kKFNVQlNZU1RFTSkuc2RuX3BhbCBhbmQgbW9kdWxlcy4kKFNVQlNZU1RFTSkub21jaSBpbnRvIGEgc2luZ2xlIGZpbGUgaW4gdGhlIHN1YnN5c3RlbSBkaXJlY3RvcnkKK2RlZmluZSBjb21iaW5lX21vZHVsZXMKKwlta2RpciAtcCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKTsgXAorCXJtIC1yZiAkMTsgXAorICAgIHRvdWNoICQxOyBcCisJZm9yIG1vZF9maWxlIGluICQyOyBkbyBjYXQgJCRtb2RfZmlsZSA+PiAkMTsgZG9uZTsKK2VuZGVmCisKKyMgQ3JlYXRlICQoU1VCU1lTVEVNKS9tb2R1bGVzLiQoU1VCU1lTVEVNKS5vbWNpIGFuZCAkKFNVQlNZU1RFTSkvbW9kdWxlcy4kKFNVQlNZU1RFTSkuc2RuX3BhbCBpZiB0aGV5IGRvZXNuJ3QgZXhpc3QsIGFzIGVtcHR5IGZpbGVzLgorIyBUaGlzIGlzIHJlbGV2YW50IHdoZW4gY29tcGlsaW5nIGZyb20gc291cmNlIHJlbGVhc2UgcGFja2FnZSBleHRyYWN0aW9uLgorJChNQUtFX0RJUikvJChTVUJTWVNURU0pL21vZHVsZXMuJChTVUJTWVNURU0pLm9tY2k6IHwgcGhvbnl0YXJnZXQKKwl0b3VjaCAkQAorJChNQUtFX0RJUikvJChTVUJTWVNURU0pL21vZHVsZXMuJChTVUJTWVNURU0pLnNkbl9wYWw6IHwgcGhvbnl0YXJnZXQKKwl0b3VjaCAkQAorCitwaG9ueXRhcmdldDoKKworIyBPUkRFUiBJUyBJTVBPUlRBTlQgLSBPTUNJIHNob3VsZCBjb21lIGJlZm9yZSBCQUwKKyQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL21vZHVsZXMuY29yZTogJChNQUtFX0RJUikvJChTVUJTWVNURU0pL21vZHVsZXMuJChTVUJTWVNURU0pLm9tY2kgJChNQUtFX0RJUikvJChTVUJTWVNURU0pL21vZHVsZXMuJChTVUJTWVNURU0pLmJhbAorCSQoY2FsbCBjb21iaW5lX21vZHVsZXMsJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvbW9kdWxlcy5jb3JlLCReKQorCisjIE9SREVSIElTIElNUE9SVEFOVCAtIFNETl9QQUwgc2hvdWxkIGNvbWUgYWZ0ZXIgQkFMCiskKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9tb2R1bGVzLmFnZW50OiAkKE1BS0VfRElSKS8kKFNVQlNZU1RFTSkvbW9kdWxlcy4kKFNVQlNZU1RFTSkuYmFsICQoTUFLRV9ESVIpLyQoU1VCU1lTVEVNKS9tb2R1bGVzLiQoU1VCU1lTVEVNKS5vbWNpICQoTUFLRV9ESVIpLyQoU1VCU1lTVEVNKS9tb2R1bGVzLiQoU1VCU1lTVEVNKS5zZG5fcGFsCisJJChjYWxsIGNvbWJpbmVfbW9kdWxlcywkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9tb2R1bGVzLmFnZW50LCReKQorCiskKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfbGlzdF8kKEJPQVJEKTogJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSkgXAorICAgICAgICAkKE1BS0VfRElSKS9NYWtlZmlsZS5jb25maWcgJChNQUtFX0RJUikvTWFrZWZpbGUucnVsZXMgJChNQUtFX0RJUikvTWFrZWZpbGUudGVtcGxhdGUgJChNQUtFX0RJUikvTWFrZWZpbGUubWFpbgorCUBpZiAhIHRlc3QgLWYgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pX2xpc3RfJChCT0FSRCk7IHRoZW5cCisJICAgIGlmIGxzICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XyogMj4vZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlblwKKwkgICAgCW9sZGRlcHM9YGxzICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XypgIDsgXAorCSAgICAJb2xkX2JvYXJkPWBlY2hvICQkb2xkZGVwcyB8IHNlZCAnc0AkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfbGlzdF9AQCdgIDsgXAorCQkJJChCT0xEX1BSSU5UKSAiUHJldmlvdXMgYnVpbGQgd2FzIGZvciBkaWZmZXJlbnQgYm9hcmQgJCRvbGRfYm9hcmQuIGNsZWFuaW5nIHVwLi4iO1wKKwkJCSQoTUFLRSkgLXMgQk9BUkQ9JCRvbGRfYm9hcmQgVj0wIGNsZWFuXyQoU1VCU1lTVEVNKTsgXAorCQkJcm0gLWZyICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2J1aWxkL291dHB1dC8qOyBcCisJCWZpO1wKKwlmaQorCUAkKEJPTERfUFJJTlQpICJHZW5lcmF0aW5nIGxpc3Qgb2YgJChTVUJTWVNURU0pIG1vZHVsZXMgZm9yICQoQlVJTERfVEFSR0VUKSIKKwlAcm0gLWZyICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XyoKKwlAcm0gLWZyICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUBybSAtZnIgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUBybSAtZnIgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2FwcF9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUBta2RpciAtcCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKQorCUB0b3VjaCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbW9kdWxlcy4kKFNVQlNZU1RFTSkKKwlAdG91Y2ggJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUB0b3VjaCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfYXBwX21vZHVsZXMuJChTVUJTWVNURU0pCisJQGZvciBtb2RfZGlyIGluIGBhd2sgJ3twcmludCAkJDF9JyAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9tb2R1bGVzLiQoU1VCU1lTVEVNKWA7IGRvXAorCQlpZiB0ZXN0ICIkJG1vZF9kaXIiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQltb2RfbmFtZT1gJChNQUtFKSAtcyBWPTAgU1VCU1lTVEVNPSQoU1VCU1lTVEVNKSBNT0RfRElSPSQkbW9kX2RpciBTS0lQX0RFUFM9eWVzIC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlIG1vZHVsZV9uYW1lYDtcCisJCWlmIHRlc3QgIiQkbW9kX25hbWUiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQltb2RfbmFtZT0kJHttb2RfbmFtZX1fJChTVUJTWVNURU0pO1wKKwkJbW9kX3R5cGU9YGdyZXAgLWUgJ15bWzpzcGFjZTpdXSpNT0RfVFlQRVtbOnNwYWNlOl1dKj0nICQkbW9kX2Rpci9NYWtlZmlsZSB8IGF3ayAtRj0gJ3tzdWIoL1xyLywiIik7IHByaW50ICQkMn0nIHwgc2VkIC1lICdzL15bIFx0XSovLydgOyBcCisJCWVjaG8gLW4gIiQkbW9kX25hbWUgIiA+PiAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbW9kdWxlcy4kKFNVQlNZU1RFTSk7IFwKKwkJaWYgdGVzdCAiYGVjaG8gLW4gJCRtb2RfdHlwZSB8IHNlZCAtZSAncy9saW51eF9saWIgbGliL2xpYi8nIHwgc2VkIC1lICdzL2xpYiBsaW51eF9saWIvbGliLydgIiA9ICJsaWIiIDsgdGhlblwKKwkJCWVjaG8gLW4gIiQkbW9kX25hbWUgIiA+PiAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbGliX21vZHVsZXMuJChTVUJTWVNURU0pOyBcCisJCWZpO1wKKwkJaWYgdGVzdCAiJCRtb2RfdHlwZSIgPSAiYXBwIiA7IHRoZW5cCisJCQllY2hvIC1uICIkJG1vZF9uYW1lICIgPj4gJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2FwcF9tb2R1bGVzLiQoU1VCU1lTVEVNKTsgXAorCQlmaTtcCisJZG9uZQorCUB0b3VjaCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfbGlzdF8kKEJPQVJEKQorCiskKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfJChCT0FSRCk6ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XyQoQk9BUkQpCisJQCQoQk9MRF9QUklOVCkgIkJ1aWxkaW5nICQoQk9BUkQpIGJvYXJkIGVudmlyb25tZW50IGZvciAkKEJVSUxEX1RBUkdFVCkiCisJJChNQUtFKSBTVUJTWVNURU09JChTVUJTWVNURU0pIE1PRF9ESVI9JCRtb2RfZGlyIE9VVF9ESVJfQkFTRT0kKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKSBTS0lQX0RFUFM9eWVzIFwKKyAgICAgICAgICAgIEFMTF9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKyAgICAgICAgICAgIEFMTF9MSUJfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbGliX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorICAgICAgICAgICAgQUxMX0FQUF9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9hcHBfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisgICAgICAgICAgICAtZiAkKE1BS0VfRElSKS9NYWtlZmlsZS50ZW1wbGF0ZSBib2FyZF9lbnYKKwlAJChCT0xEX1BSSU5UKSAiR2VuZXJhdGluZyAkKFNVQlNZU1RFTSkgZGVwZW5kZW5jaWVzIGZvciAkKEJVSUxEX1RBUkdFVCkiCisJQGZvciBtb2RfZGlyIGluIGBhd2sgJ3twcmludCAkJDF9JyAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9tb2R1bGVzLiQoU1VCU1lTVEVNKWA7IGRvXAorCQlpZiB0ZXN0ICIkJG1vZF9kaXIiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQltb2RfbmFtZT1gJChNQUtFKSAtcyBWPTAgU1VCU1lTVEVNPSQoU1VCU1lTVEVNKSBNT0RfRElSPSQkbW9kX2RpciBTS0lQX0RFUFM9eWVzIC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlIG1vZHVsZV9uYW1lYDtcCisJCWlmIHRlc3QgIiQkbW9kX25hbWUiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQlpZiAhICQoTUFLRSkgJChTSUxFTlQpIFNVQlNZU1RFTT0kKFNVQlNZU1RFTSkgTU9EX0RJUj0kJG1vZF9kaXIgT1VUX0RJUl9CQVNFPSQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpIFNLSVBfREVQUz15ZXMgXAorCQkJQUxMX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorCQkJQUxMX0xJQl9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9saWJfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisJCQlBTExfQVBQX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2FwcF9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKwkJCS1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlIG1vZGRlcDsgdGhlbiBleGl0IDE7XAorCQlmaTtcCisJZG9uZQorCUB0b3VjaCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfJChCT0FSRCkKKwlAZWNobyAiJChCT0FSRF9ESVIpIiA+ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5ib2FyZF9kaXIKKworLlBIT05ZOgorCisjIE1ha2Ugc3VyZSB0aGF0IG5vbmUgb2YgbW9kdWxlIE1ha2VmaWxlcyBjaGFuZ2VkLgorIyBJZiB0aGVyZSBpcyBhIGNoYW5nZSAtIHdlIG5lZWQgdG8gcmVnZW5lcmF0ZSBkZXBlbmRlbmNpZXMKK19kZXBzXyQoU1VCU1lTVEVNKV86ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV8kKEJPQVJEKSAuUEhPTlkKKwlAY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL21vZHVsZXMuJChTVUJTWVNURU0pIHwgd2hpbGUgcmVhZCAtciBtb2RfZGlyX3Rhcmc7IGRvXAorCQkJbW9kX2Rpcj1gZWNobyAkJG1vZF9kaXJfdGFyZyB8IGF3ayAne3ByaW50ICQkMX0nYDtcCisJCQlpZiB0ZXN0ICIkJG1vZF9kaXIiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQkJaWYgdGVzdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfbGlzdF8kKEJPQVJEKSAtb3QgJCRtb2RfZGlyL01ha2VmaWxlOyB0aGVuXAorCQkJCWVjaG8gJCRtb2RfZGlyL01ha2VmaWxlIGNoYW5nZWQsIG11c3QgcmVnZW5lcmF0ZSBkZXBlbmRlbmNpZXMuO1wKKwkJCQllY2hvIFBMRUFTRSBSRS1SVU4gbWFrZTtcCisJCQkJcm0gLWYgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pX2xpc3RfJChCT0FSRCk7XAorCQkJCWV4aXQgLTE7XAorCQkJZmk7XAorCQlkb25lCisKK2J1aWxkXyQoU1VCU1lTVEVNKTogX2RlcHNfJChTVUJTWVNURU0pXworCUAkKEJPTERfUFJJTlQpICJCdWlsZGluZyAkKFNVQlNZU1RFTSkgaW1hZ2UgZm9yICQoQlVJTERfVEFSR0VUKSIKKwlAY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL21vZHVsZXMuJChTVUJTWVNURU0pIHwgd2hpbGUgcmVhZCAtciBtb2RfZGlyX3Rhcmc7IGRvXAorCQltb2RfZGlyPWBlY2hvICQkbW9kX2Rpcl90YXJnIHwgYXdrICd7cHJpbnQgJCQxfSdgO1wKKwkJaWYgdGVzdCAiJCRtb2RfZGlyIiA9ICIiIDsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJbW9kX3RhcmdldHM9YGVjaG8gJCRtb2RfZGlyX3RhcmcgfCBhd2sgJ3twcmludCAkJDIgJCQzICQkNCAkJDV9J2A7XAorCQlpZiAhICQoTUFLRSkgJChTSUxFTlQpIFNVQlNZU1RFTT0kKFNVQlNZU1RFTSkgTU9EX0RJUj0kJG1vZF9kaXIgT1VUX0RJUl9CQVNFPSQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpIFwKKwkJCUFMTF9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKwkJCUFMTF9MSUJfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbGliX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorCQkJQUxMX0FQUF9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9hcHBfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisJCQktZiAkKE1BS0VfRElSKS9NYWtlZmlsZS50ZW1wbGF0ZSAkJG1vZF90YXJnZXRzOyB0aGVuIGV4aXQgMTtcCisJCWZpO1wKKwlkb25lCisJQCQoQk9MRF9QUklOVCkgIkZpbmlzaGVkIGJ1aWxkaW5nICQoU1VCU1lTVEVNKSBpbWFnZSBmb3IgJChCVUlMRF9UQVJHRVQpIgorCitjbGVhbl8kKFNVQlNZU1RFTSk6IEJPQVJEPSQoc2hlbGwgbHMgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pX2xpc3RfKiAyPi9kZXYvbnVsbCB8IHNlZCAnc0AkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfbGlzdF9AQCcpCisKK2NsZWFuXyQoU1VCU1lTVEVNKTogJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSkKKwlAJChCT0xEX1BSSU5UKSAiQ2xlYW4gJChQTEFURk9STSkgJChTVUJTWVNURU0pIEJPQVJEPSQoQk9BUkQpIgorCUBmb3IgbW9kX2RpciBpbiBgYXdrICd7cHJpbnQgJCQxfScgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSlgOyBkb1wKKwkJaWYgdGVzdCAiJCRtb2RfZGlyIiA9ICIiIDsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJJChNQUtFKSAkKFNJTEVOVCkgU1VCU1lTVEVNPSQoU1VCU1lTVEVNKSBNT0RfRElSPSQkbW9kX2RpciBPVVRfRElSX0JBU0U9JChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikgU0tJUF9ERVBTPXllcyBcCisJCQktZiAkKE1BS0VfRElSKS9NYWtlZmlsZS50ZW1wbGF0ZSBjbGVhbl9tb2R1bGU7XAorCWRvbmUKKwkkKFNJTEVOVF9CVUlMRClybSAtZnIgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSAnKn4nIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSAnKi5rbycgLXByaW50MCAyPi9kZXYvbnVsbCB8IHhhcmdzIC0wIHJtIC1yZgorCSQoU0lMRU5UX0JVSUxEKWZpbmQgJChTVUJTWVNURU0pIC1uYW1lICcuKi5jbWQnIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSAnKi5vJyAtcHJpbnQwIDI+L2Rldi9udWxsIHwgeGFyZ3MgLTAgcm0gLXJmCisJJChTSUxFTlRfQlVJTEQpZmluZCAkKFNVQlNZU1RFTSkgLW5hbWUgJyoubW9kLmMnIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSBtb2R1bGVzLm9yZGVyIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSBNb2R1bGUuc3ltdmVycyAtcHJpbnQwIDI+L2Rldi9udWxsfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSAudG1wX3ZlcnNpb25zIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKyAKK2hlbHBfJChTVUJTWVNURU0pOgorCUBlY2hvICIkJFBMQVRGT1JNICQoU1VCU1lTVEVNKSBtb2R1bGVzOiIKKwlAY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL21vZHVsZXMuJChTVUJTWVNURU0pIHwgd2hpbGUgcmVhZCAtciBtb2RfZGlyX3Rhcmc7IGRvXAorCQltb2RfZGlyPWBlY2hvICQkbW9kX2Rpcl90YXJnIHwgYXdrICd7cHJpbnQgJCQxfSdgO1wKKwkJaWYgdGVzdCAiJCRtb2RfZGlyIiA9ICIiIDsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJbW9kX25hbWU9YCQoTUFLRSkgLXMgVj0wIFNVQlNZU1RFTT0kKFNVQlNZU1RFTSkgTU9EX0RJUj0kJG1vZF9kaXIgU0tJUF9ERVBTPXllcyAtZiAkKE1BS0VfRElSKS9NYWtlZmlsZS50ZW1wbGF0ZSBtb2R1bGVfbmFtZWA7XAorCQlpZiB0ZXN0ICIkJG1vZF9uYW1lIiA9ICIiIDsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJZWNobyAiICAiICQke21vZF9uYW1lfV8kKFNVQlNZU1RFTSk7XAorCWRvbmUKKworIyBUYXJnZXRzIGZvciBidWlsZGluZyBpbmRpdmlkdWFsICQoU1VCU1lTVEVNKSBtb2R1bGUKKyVfJChTVUJTWVNURU0pOjogX2RlcHNfJChTVUJTWVNURU0pXworCUB3aGlsZSByZWFkIC1yIG1vZF9kaXJfdGFyZzsgZG9cCisJCW1vZF9kaXI9YGVjaG8gJCRtb2RfZGlyX3RhcmcgfCBhd2sgJ3twcmludCAkJDF9J2A7XAorCQlpZiB0ZXN0ICIkJG1vZF9kaXIiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQltb2RfbmFtZT1gJChNQUtFKSAtcyBWPTAgU1VCU1lTVEVNPSQoU1VCU1lTVEVNKSBNT0RfRElSPSQkbW9kX2RpciBTS0lQX0RFUFM9eWVzIC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlIG1vZHVsZV9uYW1lYDtcCisJCWlmIHRlc3QgIiQkbW9kX25hbWUiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQltb2RfbmFtZT0kJHttb2RfbmFtZX1fJChTVUJTWVNURU0pO1wKKwkJbW9kX3RhcmdldHM9YGVjaG8gJCRtb2RfZGlyX3RhcmcgfCBhd2sgJ3twcmludCAkJDIgJCQzICQkNCAkJDV9J2A7XAorCQlpZiB0ZXN0ICIkJG1vZF9uYW1lIiA9ICIkQCIgOyB0aGVuXAorCQkJdGFyZ2V0X2ZvdW5kPXk7XAorCQkJJChNQUtFKSAkKFNJTEVOVCkgU1VCU1lTVEVNPSQoU1VCU1lTVEVNKSBNT0RfRElSPSQkbW9kX2RpciBPVVRfRElSX0JBU0U9JChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikgXAorCQkJQUxMX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorCQkJQUxMX0xJQl9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9saWJfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisJCQlBTExfQVBQX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2FwcF9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKwkJCQktZiAkKE1BS0VfRElSKS9NYWtlZmlsZS50ZW1wbGF0ZSAkJG1vZF90YXJnZXRzIHx8IGV4aXQgMTtcCisJCWZpO1wKKwlkb25lIDwgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSk7XAorCWlmIHRlc3QgIiQkdGFyZ2V0X2ZvdW5kIiAhPSAieSIgOyB0aGVuXAorCQllY2hvIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgJEA7XAorCQlleGl0IDE7XAorCWZpCisKK2RvY3NfJChTVUJTWVNURU0pOiBfZGVwc18kKFNVQlNZU1RFTSlfCisJbWtkaXIgLXAgJChPVVRfRE9DU19ESVIpCisJJChTSUxFTlRfQlVJTEQpJChNQUtFKSAtQyBkb3h5Z2VuIE9VVF9ESVJfQkFTRT0kKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKQorCitiaW5fcmVsZWFzZV8kKFNVQlNZU1RFTSk6IGJ1aWxkXyQoU1VCU1lTVEVNKQorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRV9ESVIpL2Jpbl9yZWxlYXNlLnNoCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9tay9NYWtlZmlsZS5ydWxlcyBiL2JhbF9yZWxlYXNlL21rL01ha2VmaWxlLnJ1bGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmIyMmYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9tay9NYWtlZmlsZS5ydWxlcwpAQCAtMCwwICsxLDQ5NCBAQAorIyBDb21tb24gTWFrZWZpbGUgcnVsZXMKKyMKKworIyBGb3IgbGludXhfbGliIHdlIGRvbid0IGJ1aWxkIGFueXRoaW5nLiBPYmplY3QgZmlsZXMgYXJlIGp1c3QgYWRkZWQKKyMgd2hlbiBjb21waWxpbmcgbW9kdWxlcyBkZXBlbmRpbmcgb24gdGhlIGxpYnMKKworaWZlcSAgKCIkKE1PRF9UWVBFKSIsICJsaW51eF9saWIiKQorCSMgU2tpcCBsaWJyYXJpZXMgdGhhdCBtaWdodCBoYXZlIGNyZXB0IGluIGRlcGVuZGVuY2llcworICAgIFNLSVBfTElCX01PRFVMRVMgPSB5CisgICAgZXhwb3J0IFNLSVBfTElCX01PRFVMRVMKK2VuZGlmICAgIAorCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCisJIyBTa2lwIGxpYnJhcmllcyB0aGF0IG1pZ2h0IGhhdmUgY3JlcHQgaW4gZGVwZW5kZW5jaWVzCisgICAgU0tJUF9MSUJfTU9EVUxFUyA9IHkKKyAgICBleHBvcnQgU0tJUF9MSUJfTU9EVUxFUworZW5kaWYgICAgCisKK2lmZXEgKCIkKE1PRF9UWVBFKSIsICJsaWIiKQorICAgIE1PRFVMRV9JU19BX0xJQlJBUlkgPSB5CitlbHNlIGlmZXEgKCIkKE1PRF9UWVBFKSIsICJzaGFyZWRfbGliIikKKyAgICBNT0RVTEVfSVNfQV9MSUJSQVJZID0geQorZWxzZQorICAgIE1PRFVMRV9JU19BX0xJQlJBUlkgPSBuCitlbmRpZgorCisjIEluY2x1ZGUgbW9kdWxlJ3Mgb3duIGF1dG8tZ2VuZXJhdGVkIE1ha2VmaWxlLmNvbmZpZy4kKE1PRFVMRSkgZmlsZSBpZiBhbnkKKyMgSXQgaW4gdHVybiBpbmNsdWRlcyBhbGwgZGVwZW5kZW5jaWVzCitpZmVxICh4IiQoVikiLCB4IjIiKQorICAgICQoaW5mbyAhISFNT0RfTkFNRT0kKE1PRF9OQU1FKSBNT0RfVFlQRT0kKE1PRF9UWVBFKSBNT0RfVEFSR0VUPSQoTU9EX1RBUkdFVCkpCisgICAgJChpbmZvICEhIUluY2x1ZGluZyBvd24gZGVwZW5kZW5jeSBmaWxlOiAkKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpKQorZW5kaWYKKy1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2lmZXEgKHgiJChWKSIsIHgiMiIpCisgICAgJChpbmZvICEhIUFmdGVyIGluY2x1ZGUgb2YgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKSkKK2VuZGlmCisKK2lmZXEgKHgiJChWKSIsIHgiMiIpCisgICAgJChpbmZvICEhISBCdWlsZGluZyAkKE1PRF9UWVBFKSBtb2R1bGUgJChNT0RfTkFNRSk6IGRlcGVuZHMgb24gJChNT0RfREVQU19GSUxFUykgU0tJUF9MSUJTPSQoU0tJUF9MSUJfTU9EVUxFUykpCitlbmRpZgorCisjIFNraXAgZGVmYXVsdCBydWxlcyBmb3IgY3VzdG9tIG1vZHVsZQoraWZuZXEgICgiJChNT0RfQ1VTVE9NKSIsICJ5IikKKyAKKyMgRGVmYXVsdCBsaWIgcnVsZQoraWZlcSAgKCIkKE1PRF9UWVBFKSIsICJsaWIiKQorCitpZmVxICgiJChTS0lQX0xJQl9NT0RVTEVTKSIsICJ5IikKKworJChNT0RfVEFSR0VUKTogCisKKyMgb2YgaWZuZXEgICgiJChTS0lQX0xJQl9NT0RVTEVTKSIsICJ5IikKK2Vsc2UKKworIyBDcmVhdGUgbGlicmFyeSBpZiB0aGVyZSBhcmUgYW55IG9iamVjdHMgCiskKE1PRF9UQVJHRVQpOiAkKE9CSlMpCitpZm5lcSAoIiQoT0JKUykiLCAiIikKKwkkKFNJTEVOVF9CVUlMRCkkKEJMRF9BUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCitpZmVxICgiJChNT0RfUE9TVF9CVUlMRCkiLCAiIikKKwlAJChCT0xEX1BSSU5UKSAiZG9uZTogJEAiCitlbmRpZgkKK2VuZGlmCitpZm5lcSAoIiQoTU9EX1BPU1RfQlVJTEQpIiwgIiIpCisJJChTSUxFTlRfQlVJTEQpJChNT0RfUE9TVF9CVUlMRCkKKwlAJChCT0xEX1BSSU5UKSAiZG9uZTogJEAiCitlbmRpZgkKKwkkKFNJTEVOVF9CVUlMRCl0b3VjaCAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpCisKKyMgZW5kIG9mIGlmZXEgKCIkKFNLSVBfTElCX01PRFVMRVMpIiwgInkiKQorZW5kaWYKKworIyBlbmQgb2YgaWZlcSAgKCIkKE1PRF9UWVBFKSIsICJsaWIiKQorZW5kaWYKKyAKKyMgRGVmYXVsdCBzaGFyZWRfbGliIHJ1bGUKK2lmZXEgICgiJChNT0RfVFlQRSkiLCAic2hhcmVkX2xpYiIpCisKK0VYVFJBX0NGTEFHUyArPSAtZlBJQworCisjIENyZWF0ZSBsaWJyYXJ5IGlmIHRoZXJlIGFyZSBhbnkgb2JqZWN0cyAKKyQoTU9EX1RBUkdFVCk6ICQoT0JKUykKK2lmbmVxICgiJChPQkpTKSIsICIiKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0NDKSAtc2hhcmVkIC1vICRAICQoT0JKUykgJChMRkxBR1MpCisJJChTSUxFTlRfQlVJTEQpbWtkaXIgLXAgJChTSEFSRURfTElCX0RJUikKKwkkKFNJTEVOVF9CVUlMRCljcCAkQCAkKFNIQVJFRF9MSUJfRElSKS8KK2lmZXEgKCIkKE1PRF9QT1NUX0JVSUxEKSIsICIiKQorCUAkKEJPTERfUFJJTlQpICJkb25lOiAkQCIKK2VuZGlmCQorZW5kaWYKK2lmbmVxICgiJChNT0RfUE9TVF9CVUlMRCkiLCAiIikKKwkkKFNJTEVOVF9CVUlMRCkkKE1PRF9QT1NUX0JVSUxEKQorCUAkKEJPTERfUFJJTlQpICJkb25lOiAkQCIKK2VuZGlmCQorCSQoU0lMRU5UX0JVSUxEKXRvdWNoICQoT1VUX0RJUl9CQVNFKS8uJChNT0RfTkFNRSkKKworIyBlbmQgb2YgaWZlcSAgKCIkKE1PRF9UWVBFKSIsICJzaGFyZWRfbGliIikKK2VuZGlmCisKKyMgRGVmYXVsdCBhcHAgcnVsZQoraWZlcSAgKCIkKE1PRF9UWVBFKSIsICJhcHAiKQorCiskKE1PRF9UQVJHRVQpOiAkKE9CSlMpICQoTU9EX0RFUFNfRklMRVMpCisJJChTSUxFTlRfQlVJTEQpJChCTERfQ0MpIC1vICRAICQoT0JKUykgJChMRkxBR1MpICQoRVhUUkFfTElCU19QQVRIKSAkKEVYVFJBX0xJQlNfTk9SRUNfQkVGT1JFKSAkKExJQlNfU1RBUlRfTUFSS0VSKSAkKEVYVFJBX0xJQlMpICQoTElCU19FTkRfTUFSS0VSKSAkKEVYVFJBX0xJQlNfTk9SRUNfQUZURVIpICQoTElCUykKK2lmbmVxICgiJChNT0RfUE9TVF9CVUlMRCkiLCAiIikKKwkkKFNJTEVOVF9CVUlMRCkkKE1PRF9QT1NUX0JVSUxEKQorZW5kaWYJCisJJChTSUxFTlRfQlVJTEQpdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKQorCUAkKEJPTERfUFJJTlQpICJkb25lOiAkKE9VVF9ESVIpLyQoTU9EX05BTUUpIgorCisjIGVuZGlmIG9mIGlmZXEgICgiJChNT0RfVFlQRSkiLCAiYXBwIikKK2VuZGlmCisKKyMgRm9yIGxpbnV4X2xpYiB3ZSBkb24ndCBidWlsZCBhbnl0aGluZy4gT2JqZWN0IGZpbGVzIGFyZSBqdXN0IGFkZGVkCisjIHdoZW4gY29tcGlsaW5nIG1vZHVsZXMgZGVwZW5kaW5nIG9uIHRoZSBsaWJzCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X2xpYiIpCisgICAgTElOVVhfTElCX09CSkVDVFMgOj0gJChzcmNzOiUuYz0kKFNSQ19ESVIpLyUubykKKworJChNT0RfVEFSR0VUKTogJChTUkNTKSAkKEdFTl9TUkNTKSAkKE1PRF9ERVBTX0ZJTEVTKQorCSQoU0lMRU5UX0JVSUxEKXRvdWNoICQoTU9EX1RBUkdFVCkKKwkkKFNJTEVOVF9CVUlMRCl0b3VjaCAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpCisKK2VuZGlmCisKKyMgRGVmYXVsdCBsaW51eF9tb2R1bGUkKHNyY3M6JT0kKFNSQ19ESVIpLyUpCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCisgICAgb2JqLW0gICAgKz0gJChNT0RfTkFNRSkubworICAgICQoTU9EX05BTUUpLW9ianMgOj0gJChzcmNzOiUuYz0lLm8pCisgICAgTElCX09CSlNfUkVMX1BBVEggPSAkKGZvcmVhY2ggb28sJChBTExfTElCX09CSlMpLCQoc2hlbGwgcHl0aG9uIC1jICJpbXBvcnQgb3MucGF0aDsgcHJpbnQgb3MucGF0aC5yZWxwYXRoKCckKG9vKScsICckKFNSQ19ESVIpJykiKSkKKworICAgIF9LRVJORUxfTUFLRVBBUk1TID0gLUMgJChLRVJORUxESVIpIE09JChTUkNfRElSKSBLQlVJTERfRVhUUkFfU1lNQk9MUz0iJChLQlVJTERfRVhUUkFfU1lNQk9MUykiIFwKKyAgICAJTz0kKEtFUk5FTF9PVVRESVIpIEFSQ0g9JChLRVJORUxfQVJDSCkgQ1JPU1NfQ09NUElMRT0kKENST1NTX0NPTVBJTEUpIFY9JChWKSBFWFRSQV9DRkxBR1M9IiQoRVhUUkFfQ0ZMQUdTKSIgXAorICAgIAlvYmotbT0kKG9iai1tKSAkKE1PRF9OQU1FKS1vYmpzPSIkKCQoTU9EX05BTUUpLW9ianMpICQoTElCX09CSlNfUkVMX1BBVEgpIgorICAgIEtFUk5FTF9NQUtFUEFSTVMgPSAkKF9LRVJORUxfTUFLRVBBUk1TOiVvc19hYnN0cmFjdGlvbi9wb3NpeD0lb3NfYWJzdHJhY3Rpb24vbGludXgpCisKKwkjIFByZXZlbnQgcGFyYWxsZWwgYnVpbGQgICAgCisuTk9UUEFSQUxMRUw6CisKKyAgICAjIE9ubHkgYnVpbGQgbGludXggbW9kdWxlIGlmIG5vdCBhbHJlYWR5IGJlaW5nIGJ1aWx0IGJ5IGFub3RoZXIgbWFrZSB0aHJlYWQuCisgICAgIyBPdGhlcndpc2UsIGxpbnV4IGJ1aWxkIHN5c3RlbSBnZXQgY29uZnVzZWQKKyAgICAjIEFsc28sIHJlbW92ZSAtcyBmbGFnIHVzaW5nIE1BS0VGTEFHUy4gT3RoZXJ3aXNlLCBsaW51eCBidWlsZCBzeXN0ZW0gd2lsbCBub3QgcHJpbnQgbmFtZXMgb2YgdGhlIGZpbGVzCisgICAgIyBiZWluZyBjb21waWxlZAorJChNT0RfVEFSR0VUKTogJChTUkNTKSAkKE1PRF9ERVBTX0ZJTEVTKQoraWZuZXEgICgiJChTUkNfRElSKSIsICIkKFRPUF9ESVIpLyQoTU9EX0RJUikiKQorCUBjcCAtZiAkKFRPUF9ESVIpLyQoTU9EX0RJUikvTWFrZWZpbGUgJChTUkNfRElSKQorZW5kaWYKKwkkKFNJTEVOVF9CVUlMRClpZiBbICEgLWYgJChTUkNfRElSKS8uJChNT0RfTkFNRSlfaW5fcHJvZ3Jlc3MgXTsgdGhlbiBcCisJCXRvdWNoICQoU1JDX0RJUikvLiQoTU9EX05BTUUpX2luX3Byb2dyZXNzOyBcCisJCU1BS0VGTEFHUz0gJChNQUtFKSAkKEtFUk5FTF9NQUtFUEFSTVMpIDtcCisJCWlmIFtbICIkJD8iICE9ICIwIiBdXTsgdGhlbiBcCisJCQlybSAtZiAkKFNSQ19ESVIpLy4kKE1PRF9OQU1FKV9pbl9wcm9ncmVzcztcCisJCQlleGl0IC0yO1wKKwkJZmk7IFwKKwkJbWtkaXIgLXAgJChPVVRfRElSX0JBU0UpL2xpbnV4X21vZHVsZXMgO1wKKwkJdG91Y2ggLWMgJChNT0RfVEFSR0VUKSA7XAorCQljcCAkKFNSQ19ESVIpLyQoTU9EX05BTUUpLmtvICQoT1VUX0RJUl9CQVNFKS9saW51eF9tb2R1bGVzLyA7XAorCQl0b3VjaCAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpIDtcCisJCSQoQk9MRF9QUklOVCkgImRvbmU6ICQoTU9EX1RBUkdFVCkiIDtcCisJCXJtIC1mICQoU1JDX0RJUikvLiQoTU9EX05BTUUpX2luX3Byb2dyZXNzIDtcCisJZmkKKworIyBUYWtlIGNhcmUgb2YgY29tcGlsaW5nIGdlbmVyYXRlZCBjb2RlIGZvciBsaW51eCBrZXJuZWwKK2lmbmVxICAoIiQoU1JDX0RJUikiLCAiJChUT1BfRElSKS8kKE1PRF9ESVIpIikKKworJChTUkNfRElSKS8lLmMgOiAkKENPREVHRU5fT1VUUFVUX0RJUikvLi4vJS5jCisJJChTSUxFTlRfQlVJTEQpY3AgLWYgJChDT0RFR0VOX09VVFBVVF9ESVIpLy4uLyouW2MsaF0gJChTUkNfRElSKS8KKworJChTUkNfRElSKS8lLmggOiAkKENPREVHRU5fT1VUUFVUX0RJUikvLi4vJS5oCisJJChTSUxFTlRfQlVJTEQpY3AgLWYgJChDT0RFR0VOX09VVFBVVF9ESVIpLy4uLyouW2MsaF0gJChTUkNfRElSKS8KKworZW5kaWYKKworIyBFbmQgb2YgTU9EX1RZUEU9PWxpbnV4X21vZHVsZQorZW5kaWYKKworIyBlbHNlIG9mIGlmbmVxICAoIiQoTU9EX0NVU1RPTSkiLCAieSIpCitlbHNlCisKKyMgb25seSBmb3IgTU9EX0NVU1RPTSBpbmNsdWRlIE1vZHVsZSBNYWtlZmlsZSBzZWNvbmQgdGltZSBmb3IgcHJvcGFnYXRlICAKKyMgY3VzdG9tIHJ1bGVzLCBmaXJzdCB0aW1lIGluY2x1ZGVkIGluIE1ha2VmaWxlLmNvbmZpZyBmb3IgYWxsIG1vZHVsZXMgCitpbmNsdWRlICQoU1JDX0RJUikvTWFrZWZpbGUKKworIyBFbmQgb2YgaWZuZXEgKCQoTU9EX0NVU1RPTSksIHkpCitlbmRpZgorCiskKE9VVF9ESVIpLyUubzogJChTUkNfRElSKS8lLmMgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQoraWZlcSAoeCIkKFYpIiwgeCIwIikKKwlAZWNobyAiQ0MgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoZGlyICRAKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0NDKSAkKENGTEFHUykgLURfX0JBU0VOQU1FX189YGJhc2VuYW1lICQ8YCAtYyAtbyAkQCAkPAoraWZlcSAoeCIkKFVTRV9MSU5UKSIsIHgieWVzIikKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJQGVjaG8gIkxJTlQgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKUZPUkNFX0xJTlQ9JChGT1JDRV9MSU5UKSAkKE1BS0VfREVWSUNFX0RJUikvbGludC5zaCAkKExJTlRfRkxBR1MpICQoZmlsdGVyIC1JJSAtRCUsICQoQ0ZMQUdTKSkgJDwgfHwgeyBybSAkQDsgZmFsc2U7IH0KK2VuZGlmCitpZmVxICh4IiQoVVNFX0NMQU5HKSIsIHgieSIpCitpZmVxICh4IiQoVikiLCB4IjAiKQorCV9mbj1gYmFzZW5hbWUgIiQ8IiAuY2AgO1wKKwlldmFsICJfZGlzYWJsZV9mbl9zZXQ9XCQke0RJU0FCTEVfQ0xBTkdfJCRfZm59IjsgXAorCWlmIHRlc3QgIiQkX2Rpc2FibGVfZm5fc2V0IiAhPSAieSIgOyB0aGVuIGVjaG8gIkNMQU5HICQ8IjsgZWxzZSBlY2hvICJDTEFORyAkPCAuLi4gc2tpcHBlZCI7IGZpCitlbmRpZgorCV9mbj1gYmFzZW5hbWUgIiQ8IiAuY2AgO1wKKwlldmFsICJfZGlzYWJsZV9mbl9zZXQ9XCQke0RJU0FCTEVfQ0xBTkdfJCRfZm59IjsgXAorCWlmIHRlc3QgIiQkX2Rpc2FibGVfZm5fc2V0IiAhPSAieSIgOyB0aGVuICAkKENMQU5HKSAkKENMQU5HX0ZMQUdTKSAtYyAkPCAtbyAkQC5jbGFuZyAmJiBybSAtZiAkQC5jbGFuZzsgZmkKKyMgZW5kIG9mIGlmZXEgKHgiJChVU0VfQ0xBTkcpIiwgeCJ5IikJCitlbmRpZgkKKworJChPVVRfRElSKS8lLm86ICQoU1JDX0RJUikvJS5zICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJQGVjaG8gIkFTICQ8IgorZW5kaWYKKwkkKFNJTEVOVF9CVUlMRClta2RpciAtcCAkKGRpciAkQCkKKwkkKFNJTEVOVF9CVUlMRCkkKEJMRF9BUykgJChhc0ZMQUdTKSAtbyAkQCAkPAorCiskKE9VVF9ESVIpLyUubzogJChTUkNfRElSKS8lLlMgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQoraWZlcSAoeCIkKFYpIiwgeCIwIikKKwlAZWNobyAiQVMgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoZGlyICRAKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0NDKSAkKEFTRkxBR1MpIC1vICRAICQ8CisKKworJChPVVRfRElSKS8lLmQ6ICQoU1JDX0RJUikvJS5jICQoU1JDX0RJUikvTWFrZWZpbGUKK2lmbmVxICgiJChCVUlMRF9ERVBTX0lOX0NDKSIsICJ5IikKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJQGVjaG8gIkRQICQ8IgorZW5kaWYKKwkkKFNJTEVOVF9CVUlMRClta2RpciAtcCAkKGRpciAkQCkKKwkkKFNJTEVOVF9CVUlMRCkkKEJMRF9ERVApIC1NTSAtTVQgJChAOi5kPS5vKSAkKERFUF9GTEFHUykgJDwgID4gJEAgJiYgc2VkICdzLFwoJCpcLm9cKVsgOl0qLFwxICRAIDogLGcnIC1pICRACitlbmRpZgorCiskKENPREVHRU5fT1VUUFVUX0RJUikvJS5vOiAkKENPREVHRU5fT1VUUFVUX0RJUikvJS5jICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJQGVjaG8gIkNDICQ8IgorZW5kaWYKKwkkKFNJTEVOVF9CVUlMRClta2RpciAtcCAkKGRpciAkQCkKKwkkKFNJTEVOVF9CVUlMRCkkKEJMRF9DQykgJChDRkxBR1MpIC1EX19CQVNFTkFNRV9fPWBiYXNlbmFtZSAkPGAgLWMgLW8gJEAgJDwKKworJChDT0RFR0VOX09VVFBVVF9ESVIpLyUuZDogJChDT0RFR0VOX09VVFBVVF9ESVIpLyUuYyAkKFNSQ19ESVIpL01ha2VmaWxlCitpZm5lcSAoIiQoQlVJTERfREVQU19JTl9DQykiLCAieSIpCitpZmVxICh4IiQoVikiLCB4IjAiKQorCUBlY2hvICJEUCAkPCIKK2VuZGlmCisJJChTSUxFTlRfQlVJTEQpbWtkaXIgLXAgJChkaXIgJEApCisJJChTSUxFTlRfQlVJTEQpJChCTERfREVQKSAtTU0gLU1UICQoQDouZD0ubykgJChERVBfRkxBR1MpICQ8ICA+ICRAICYmIHNlZCAncyxcKCQqXC5vXClbIDpdKixcMSAkQCA6ICxnJyAtaSAkQAorZW5kaWYKKworaWZuZXEgKCIkKFNLSVBfREVQUykiLCAieWVzIikKK2lmbmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCitpZm5lcSAgKCIkKE1PRF9UWVBFKSIsICJsaW51eF9saWIiKQorLWluY2x1ZGUgJChPQkpTOi5vPS5kKQorZW5kaWYKK2VuZGlmCitlbmRpZgorCitCVUlMRF9VTklURVNUID0gJChVTklURVNUKQoraWZlcSAgKCIkKE9CSlMpIiwgIiIpCisgICAgQlVJTERfVU5JVEVTVCA9IG4KK2VuZGlmICAgIAorCisjIE9ubHkgYnVpbGQgdW5pdGVzdCBpZiBsaWJyYXJ5IG9iamVjdHMgYXJlIGluY2x1ZGVkCitpZmVxICAoIiQoQlVJTERfVU5JVEVTVCkiLCAieSIpCisKK3VuaXRlc3Q6ICQoT1VUX0RJUikvdW5pdGVzdAorCiskKE9VVF9ESVIpL3VuaXRlc3Q6ICQoT1VUX0RJUikvdW5pdGVzdC5vICQoVEFSR0VUX0xJQl9GTkFNRSkgJChNT0RfREVQU19GSUxFUykKKwkkKFNJTEVOVF9CVUlMRCkkKEJMRF9DQykgLW8gJEAgJChPVVRfRElSKS91bml0ZXN0Lm8gJChMRkxBR1MpICQoRVhUUkFfTElCU19QQVRIKSAkKExJQlNfU1RBUlRfTUFSS0VSKSAkKEVYVFJBX0xJQlMpICQoTElCU19FTkRfTUFSS0VSKSAkKExJQlMpCisJJChTSUxFTlRfQlVJTEQpdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKQorCUAkKEJPTERfUFJJTlQpICJkb25lOiAkQCIKKworIyBlbHNlIG9mIGlmbmVxICAoIiQoQlVJTERfVU5JVEVTVCkiLCAieSIpCitlbHNlIAorCit1bml0ZXN0OiAkKFRBUkdFVF9MSUJfRk5BTUUpICQoTU9EX0RFUFNfRklMRVMpCisJCisjIGVuZGlmIG9mIGlmbmVxICAoIiQoQlVJTERfVU5JVEVTVCkiLCAieSIpCitlbmRpZgorCisjIEdlbmVyYXRlIHNvdXJjZXMgaWYgbmVjZXNzYXJ5CitpZm5lcSAgKCIkKEdFTl9TUkNTKSQoR0VOX0hEUlMpJChHRU5fT01DSV9TUkNTKSQoR0VOX09NQ0lfSERSUykkKEdFTl9PTUNJX1NUQUNLX1NSQ1MpJChHRU5fT01DSV9TVEFDS19IRFJTKSIsICIiKQorCiskKEdFTl9CQUxfU1JDUykgJChHRU5fQkFMX0hEUlMpOiAkKE9VVF9ESVIpLy4kKE1PRF9OQU1FKV9nZW5lcmF0ZWRfYmFsCiskKEdFTl9PTUNJX1NSQ1MpICQoR0VOX09NQ0lfSERSUyk6ICQoT1VUX0RJUikvLiQoTU9EX05BTUUpX2dlbmVyYXRlZF9vbWNpCiskKEdFTl9PTUNJX1NUQUNLX1NSQ1MpICQoR0VOX09NQ0lfU1RBQ0tfSERSUyk6ICQoT1VUX0RJUikvLiQoTU9EX05BTUUpX2dlbmVyYXRlZF9vbWNpX3N0YWNrCisKKyQoT1VUX0RJUikvLiQoTU9EX05BTUUpX2dlbmVyYXRlZF9iYWw6ICQoQkFMX01PREVMX0ZJTEUpICQod2lsZGNhcmQgJChDT0RFR0VOX0RJUikvKikgJCh3aWxkY2FyZCAkKENPREVHRU5fSU5QVVRfRElSKS8qKQorCSQoY2FsbCBnZW5fY21kLCQoR0VOX0JBTF9TUkNTKSwkKEdFTl9CQUxfSERSUyksJChCQUxfTU9ERUxfRklMRSksImJjbWJhbCIpCisKKyQoT1VUX0RJUikvLiQoTU9EX05BTUUpX2dlbmVyYXRlZF9vbWNpOiAkKE9NQ0lfTU9ERUxfRklMRSkgJCh3aWxkY2FyZCAkKENPREVHRU5fRElSKS8qKSAkKHdpbGRjYXJkICQoQ09ERUdFTl9JTlBVVF9ESVIpLyopCisJJChjYWxsIGdlbl9jbWQsJChHRU5fT01DSV9TUkNTKSwkKEdFTl9PTUNJX0hEUlMpLCQoT01DSV9NT0RFTF9GSUxFKSwiYmNtb21jaSIpCisKKyQoT01DSV9TVEFDS19DT0RFR0VOX0VYRSk6ICQoT01DSV9TVEFDS19DT0RFR0VOX0lOUFVUX0RJUikvb21jaV9tZV9jb2RlZ2VuLmMKKwlta2RpciAtcCAkKE9VVF9ESVIpCisJJChCTERfQ0NfSE9TVCkgJChFWFRSQV9DRkxBR1MpIC1nZHdhcmYtMyAtbyAkQCAkPCAtSSQoVE9QX0RJUikvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbiAtSSQoVE9QX0RJUikvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9wb3NpeCAtSSQoVE9QX0RJUikvc3JjL2NvbW1vbi9jb25maWcgLUkkKFRPUF9ESVIpL3NyYy9jb3JlL3BsYXRmb3JtIC1JJChUT1BfRElSKS9zcmMvY29tbW9uL2luY2x1ZGUKKworJChPVVRfRElSKS8uJChNT0RfTkFNRSlfZ2VuZXJhdGVkX29tY2lfc3RhY2s6ICQoT01DSV9TVEFDS19NT0RFTF9GSUxFKSAkKHdpbGRjYXJkICQoQ09ERUdFTl9ESVIpLyopICQod2lsZGNhcmQgJChDT0RFR0VOX0lOUFVUX0RJUikvKikgJChPTUNJX1NUQUNLX0NPREVHRU5fRVhFKQorCSQoY2FsbCBnZW5fb21jaV9zdGFja19jbWQsJChHRU5fT01DSV9TVEFDS19TUkNTKSwkKEdFTl9PTUNJX1NUQUNLX0hEUlMpLCQoT01DSV9TVEFDS19NT0RFTF9GSUxFKSwiYmNtX29tY2kiKQorCitkZWZpbmUgZ2VuX2NtZAorCW1rZGlyIC1wICQoQ09ERUdFTl9PVVRQVVRfRElSKQorCWVjaG8gIkdlbmVyYXRpbmcgY29kZSBmcm9tIG1vZGVsOiAkKG5vdGRpciAkMSAkMikiCisJJChNT05PX1BBVEgpICQoQ09ERUdFTl9FWEUpIC0tZ2Vub2JqbW9kZWwgLW9ianNldD0iJDMiIC1zdHlsZT1iYWwgLXByZWZpeD0kNCBcCisgICAJLXRlbXBsYXRlZGlyPSIkKENPREVHRU5fSU5QVVRfRElSKSIgLW91dGRpcj0iJChDT0RFR0VOX09VVFBVVF9ESVIpIgorCXRvdWNoICRAIAorCWVjaG8gIkNvZGUgZ2VuZXJhdGlvbiBjb21wbGV0ZSEiCitlbmRlZgorCitkZWZpbmUgZ2VuX29tY2lfc3RhY2tfY21kCisJZWNobyAiR2VuZXJhdGluZyBjb2RlIGZyb20gbW9kZWw6ICQobm90ZGlyICQxICQyKSIKKyAgICAkKE9NQ0lfU1RBQ0tfQ09ERUdFTl9FWEUpICQ0ICQoT1VUX0RJUikgJDMgJChhZGRwcmVmaXggJChPTUNJX1NUQUNLX0NPREVHRU5fSU5QVVRfRElSKS8sICQoYWRkc3VmZml4IC50bXBsLCAkKG5vdGRpciAkMSAkMikpKQorICAgIGZvciBmaWxlIGluICQoR0VOX09NQ0lfU1RBQ0tfSERSUykgJChHRU5fT01DSV9TVEFDS19TUkNTKTsgZG8gXAorICAgICAgICAkKFRPUF9ESVIpL3Rvb2xzL2NvcHlyaWdodF90b29scy9pbnNlcnRfY29weXJpZ2h0LnBsIC10IGMgLWwgJChUT1BfRElSKS9DT1BZUklHSFQgJCRmaWxlID4gJCRmaWxlLnRtcDsgXAorICAgICAgICBtdiAkJGZpbGUudG1wICQkZmlsZTsgXAorICAgIGRvbmUKKwl0b3VjaCAkQCAKKwllY2hvICJDb2RlIGdlbmVyYXRpb24gY29tcGxldGUhIgorZW5kZWYKKworIyBlbmQgb2YgaWZuZXEgICgiJChHRU5fU1JDUykkKEdFTl9IRFJTKSQoR0VOX09NQ0lfU1JDUykkKEdFTl9PTUNJX0hEUlMpJChHRU5fT01DSV9TVEFDS19TUkNTKSQoR0VOX09NQ0lfU1RBQ0tfSERSUykiLCAiIikKK2VuZGlmCisKKyMKKyMgRGVwZW5kZW5jeSBydWxlcyBnZW5lcmF0aW9uOiAtLT4gTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpCisjIAorCitNT0RfQ09ORklHX0ZJTEUgPSAkKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpCitNT0RfQ09ORklHX0RFRiAgPSAkKE1PRF9OQU1FKV9ERVBfREVGSU5FRAoraWZuZXEgKCIkKE1PRF9JTkNfRElSUykiLCAiIikKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IGVhY2ggZGlyZWN0b3J5IGlzIGFuIGFic29sdXRlIHBhdGgKKyAgICBNT0RfSU5DUyA9ICQoYWRkcHJlZml4IC1JLCAkKGFic3BhdGggJChzdWJzdCAtSSwsJChzdWJzdCAkKFRPUF9ESVIpLywsJChNT0RfSU5DX0RJUlMpKSkpKQorZWxzZQorCU1PRF9JTkNTID0gLUkkKFNSQ19ESVIpCisgICAgaWZuZXEgKCIkKEdFTl9IRFJTKSIsICIiKQorICAgICAgICBNT0RfSU5DUyArPSAtSSQoQ09ERUdFTl9PVVRQVVRfRElSKQorCWVuZGlmCitlbmRpZgorCisjIAorIyBHZW5lcmF0ZSBNYWtlZmlsZS5jb25maWcuJChNT0RVTEUpIGNhcGFibGUgb2YgcmUtY3JlYXRpbmcgdGhlIG1vZHVsZQorIworbW9kZGVwOiAkKEdFTl9TUkNTKSAkKEdFTl9IRFJTKQoraWZlcSAoeCIkKFYpIiwgeCIzIikKKwlAZWNobyAiISEhISEgIG1vZGRlcCBmb3IgIE1PRF9OQU1FPSQoTU9EX05BTUUpIE1PRF9UWVBFPSQoTU9EX1RZUEUpIE1PRF9DVVNUT009JChNT0RfQ1VTVE9NKSEhISIKK2VuZGlmCisJJChTSUxFTlRfQlVJTEQpbWtkaXIgLXAgJChPVVRfRElSX0JBU0UpCisJQHJtIC1mciAkKE1PRF9DT05GSUdfRklMRSkKKwlAcm0gLWZyICQoT0JKUzoubz0uZCkKKworCUBlY2hvICJpZmVxICh4XCIkJCIiKFYpXCIsIHhcIjJcIikiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiICAgICQkIiIoaW5mbyAhISEgTU9EVUxFPSQkIiIoTU9EX05BTUUpIC0tPiAkKE1PRF9DT05GSUdfRklMRSk6ICQoTU9EX0NPTkZJR19ERUYpPSQkIiIoJChNT0RfQ09ORklHX0RFRikpLCBERVBTPSQoTU9EX0RFUFMpKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gImVuZGlmIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisKKyAgICAjIFByZXZlbnQgZG91YmxlIGluY2x1c2lvbiAKKwlAZWNobyAiaWZuZXEgKFwiJCQiIigkKE1PRF9DT05GSUdfREVGKSlcIiwgXCJ5XCIpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiJChNT0RfQ09ORklHX0RFRikgOj0geSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gImV4cG9ydCAkKE1PRF9OQU1FKV9ESVIgOj0gJChTUkNfRElSKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gImV4cG9ydCAkKE1PRF9OQU1FKV9PVVRfRElSIDo9ICQoT1VUX0RJUikiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCisgICAgaWZlcSAgKCIkKE1PRFVMRV9JU19BX0xJQlJBUlkpIiwgInkiKQorCQlAZWNobyAiX3NraXBfaXQgOj0geSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZWxzZQorCQlAZWNobyAiX3NraXBfaXQgOj0gbiIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZW5kaWYKKwlAZWNobyAiaWZuZXEgKFwiJCQiIihTS0lQX0xJQl9NT0RVTEVTKVwiLCBcInlcIikiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCUBlY2hvICIgICAgX3NraXBfaXQgOj0gbiIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gImVuZGlmIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKworCUBlY2hvICJpZm5lcSAoXCIkJCIiKF9za2lwX2l0KVwiLCBcInlcIikiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKworICAgIGlmZXEgICgiJChNT0RVTEVfSVNfQV9MSUJSQVJZKSIsICJ5IikKKyAgICAgICAgaWZuZXEgKCIkKE9CSlMpIiwgIiIpCisJCQlAZWNobyAiRVhUUkFfTElCUyArPSAkKExJQlNfTUFSS0VSKSQoVEFSR0VUX0xJQikiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQkJQGVjaG8gIkVYVFJBX0xJQlNfUEFUSCArPSAkKExJQlNfUEFUSF9NQVJLRVIpJChPVVRfRElSKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmbmVxICgiJChNT0RfTElCUykiLCAiIikKKwkJCUBlY2hvICJFWFRSQV9MSUJTICs9ICQoTU9EX0xJQlMpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICAgICAgZW5kaWYKKyAgICAgICAgaWZuZXEgKCIkKE1PRF9MSUJTX05PUkVDX0JFRk9SRSkiLCAiIikKKwkJCUBlY2hvICJFWFRSQV9MSUJTX05PUkVDX0JFRk9SRSArPSAkKE1PRF9MSUJTX05PUkVDX0JFRk9SRSkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgICAgICBlbmRpZgorICAgICAgICBpZm5lcSAoIiQoTU9EX0xJQlNfTk9SRUNfQUZURVIpIiwgIiIpCisJCQlAZWNobyAiRVhUUkFfTElCU19OT1JFQ19BRlRFUiArPSAkKE1PRF9MSUJTX05PUkVDX0FGVEVSKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgICAgIGVuZGlmCisJCUBlY2hvICJpZm5lcSAoeFwiJCQiIihNT0RfTkFNRSlcIiwgeFwiJChNT0RfTkFNRSlcIikiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gIiAgIE1PRF9ERVBTX0ZJTEVTICs9ICQoT1VUX0RJUl9CQVNFKS8uJChNT0RfTkFNRSkiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gImVuZGlmIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZW5kaWYKKworICAgIGlmZXEgICgiJChNT0RfVFlQRSkiLCAibGludXhfbGliIikKKyAgICAgICAgaWZuZXEgKCIkKE9CSlMpIiwgIiIpCisJCQlAZWNobyAiQUxMX0xJQl9PQkpTICs9ICQoTElOVVhfTElCX09CSkVDVFMpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgICAgIGVuZGlmCisJCUBlY2hvICJpZm5lcSAoeFwiJCQiIihNT0RfTkFNRSlcIiwgeFwiJChNT0RfTkFNRSlcIikiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gIiAgIE1PRF9ERVBTX0ZJTEVTICs9ICQoT1VUX0RJUl9CQVNFKS8uJChNT0RfTkFNRSkiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gImVuZGlmIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZW5kaWYKKworICAgIGlmZXEgICgiJChNT0RfVFlQRSkiLCAibGludXhfbW9kdWxlIikKKwkJQGVjaG8gImlmbmVxICh4XCIkJCIiKE1PRF9OQU1FKVwiLCB4XCIkKE1PRF9OQU1FKVwiKSIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQkJQGVjaG8gIiAgIEtCVUlMRF9FWFRSQV9TWU1CT0xTICs9ICQoU1JDX0RJUikvTW9kdWxlLnN5bXZlcnMiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQkJQGVjaG8gIiAgIE1PRF9ERVBTX0ZJTEVTICs9ICQoT1VUX0RJUl9CQVNFKS8uJChNT0RfTkFNRSkiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gImVuZGlmIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZW5kaWYKKworICAgICMgTW9kdWxlIGNyZWF0aW9uIHJ1bGVzCisJQGVjaG8gIiQoTU9EX05BTUUpXyQoU1VCU1lTVEVNKTogJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKSIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCUBlY2hvICIiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKTogLkZPUkNFIiAgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGlmZXEgICgiJChNT0RfQ1VTVE9NKSIsICJ5IikKKwkJQGVjaG8gIgkJJCQiIihNQUtFKSBNT0RfRElSPSQoTU9EX0RJUikgLWYgJChNQUtFX0RJUikvTWFrZWZpbGUudGVtcGxhdGUgJChNT0RfVEFSR0VUKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZWxzZQorICAgIGlmbmVxICAoIiQoT0JKUykiLCAiIikKKwkJQGVjaG8gIgkJJCQiIihNQUtFKSBNT0RfRElSPSQoTU9EX0RJUikgLWYgJChNQUtFX0RJUikvTWFrZWZpbGUudGVtcGxhdGUgJChNT0RfVEFSR0VUKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZW5kaWYKKyAgICBpZmVxICAoIiQoT0JKUykiLCAiIikKKwkJQGVjaG8gIgkJaWYgWyAhIC1mICQoT1VUX0RJUl9CQVNFKS8uJChNT0RfTkFNRSkgXTsgdGhlbiB0b3VjaCAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpOyBmaSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZW5kaWYKKyAgICBlbmRpZgorCUBlY2hvICIiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiLkZPUkNFOiIgICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisKKyAgICBpZm5lcSAoIiQoTU9EX0RFRlMpIiwgIiIpCisJCUBlY2hvICJFWFRSQV9DRkxBR1MgKz0gJChNT0RfREVGUykiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVuZGlmCisJCisJQGVjaG8gImVuZGlmIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisKKyAgICAjIElmIGl0IGlzIGEgbGlicmFyeSBhbmQgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGFzIHNvbWVvbmUncyBkZXBlbmRlbmN5IC0gZXh0ZW5kIE1PRF9ERVBfRlVMTF9OQU1FUworICAgICMgYW5kIGdlbmVyYXRlIGEgcnVsZSB0byByZWJ1aWx0IHRoZSBsaWJyYXJ5CisgICAgaWZuZXEgKCIkKE1PRF9ERVBTKSQoTU9EX0RFUFNfT1BUKSIsICIiKQorCQlAZWNobyAiaWZlcSAoeFwiJCQiIihWKVwiLCB4XCIyXCIpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICIgICAkJCIiKGluZm8gISEhIE5vdyBpbmNsdWRlIGRlcGVuZGVuY2llcyAkKE1PRF9ERVBTKSAkKE1PRF9ERVBTX09QVCkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQlAZWNobyAiZW5kaWYiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICAgICAgaWZuZXEgKCIkKE1PRF9ERVBTKSIsICIiKQorCQlAZWNobyAiJChNT0RfTkFNRSlfTU9EX0RFUFMgPSAkKE1PRF9ERVBTKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICJpZm5lcSAoeFwiJCQiIihTS0lQX0RFUFMpXCIsIHhcInllc1wiKSIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQlAZWNobyAiaW5jbHVkZSAkJCIiKCQoTU9EX05BTUUpX01PRF9ERVBTOiU9JChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4lKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICJlbmRpZiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgICAgICBlbmRpZgorICAgICAgICBpZm5lcSAoIiQoTU9EX0RFUFNfT1BUKSIsICIiKQorCQlAZWNobyAiJChNT0RfTkFNRSlfTU9EX0RFUFNfT1BUID0gJChNT0RfREVQU19PUFQpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gImlmbmVxICh4XCIkJCIiKFNLSVBfREVQUylcIiwgeFwieWVzXCIpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICItaW5jbHVkZSAkJCIiKCQoTU9EX05BTUUpX01PRF9ERVBTX09QVDolPSQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJSkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQlAZWNobyAiZW5kaWYiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICAgICAgZW5kaWYKKwlAZWNobyAiaWZlcSAoeFwiJCQiIihWKVwiLCB4XCIyXCIpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIiAgICQkIiIoaW5mbyAhISEgJChNT0RfTkFNRSkgZmluaXNoZWQgaW5jbHVkaW5nIGRlcGVuZGVuY2llcykiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCUBlY2hvICJlbmRpZiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVuZGlmCisKKwlAZWNobyAiRVhUUkFfQ0ZMQUdTICs9ICQoTU9EX0lOQ1MpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiZW5kaWYiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorIyAKKyMgZW5kIG9mIG1vZGRlcDogdGFyZ2V0CisjCisKK2NsZWFuX21vZHVsZTo6CitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCisJJChTSUxFTlRfQlVJTEQpLXRlc3QgLWYgJChTUkNfRElSKS9NYWtlZmlsZSAmJiAkKE1BS0UpICQoS0VSTkVMX01BS0VQQVJNUykgY2xlYW4KKwkkKFNJTEVOVF9CVUlMRCljZCAkKFNSQ19ESVIpICYmIHJtIC1mciAkKCQoTU9EX05BTUUpLW9ianMpICQoJChNT0RfTkFNRSktb2JqczouLi8lPS4uLy4lLmNtZCkKKwkkKFNJTEVOVF9CVUlMRClybSAtZnIgJChPVVRfRElSX0JBU0UpL2xpbnV4X21vZHVsZXMvJChNT0RfTkFNRSkua28KK2VuZGlmCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X2xpYiIpCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoTElOVVhfTElCX09CSkVDVFMpCitlbmRpZgkKKwkkKFNJTEVOVF9CVUlMRCljZCAkKFNSQ19ESVIpICYmIHJtIC1mciAkKHBhdHN1YnN0ICUuYywuJS5vLmNtZCwkKHNyY3MpKQorCSQoU0lMRU5UX0JVSUxEKVsgISAtZCAkKE9VVF9ESVIpIF0gfHwgZmluZCAkKE9VVF9ESVIpIC1uYW1lICcqLltvLGQsYV0nIC1wcmludDAgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClbICEgLWQgJChPVVRfRElSKSBdIHx8IGZpbmQgJChPVVRfRElSKSAtbmFtZSAnKn4nICAgICAgICAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLXJmCisJJChTSUxFTlRfQlVJTEQpWyAhIC1kICQoT1VUX0RJUikgXSB8fCBmaW5kICQoT1VUX0RJUikgLW5hbWUgJyoua28nICAgICAgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgorCSQoU0lMRU5UX0JVSUxEKVsgISAtZCAkKE9VVF9ESVIpIF0gfHwgZmluZCAkKE9VVF9ESVIpIC1uYW1lICcuKi5jbWQnICAgIC1wcmludDAgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClybSAtZnIgJChTUkNfRElSKS8qLm1vZC5jICQoU1JDX0RJUikvbW9kdWxlcy5vcmRlciAkKFNSQ19ESVIpL01vZHVsZS5zeW12ZXJzICQoU1JDX0RJUikvLnRtcF92ZXJzaW9ucworCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkKE1PRF9UQVJHRVQpICQoT1VUX0RJUikvJChUQVJHRVQpICQoT1VUX0RJUikvdW5pdGVzdCAkKFRBUkdFVF9MSUJfRk5BTUUpCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoQUxMX0xJQl9PQkpTKQorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkKEdFTl9TUkNTKSAkKEdFTl9IRFJTKSAkKE9VVF9ESVIpLy4kKE1PRF9OQU1FKV9nZW5lcmF0ZWRfKgoraWZuZXEgKCIkKE1PRF9OQU1FKSIsICIiKQorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoU1JDX0RJUikvLiQoTU9EX05BTUUpX2luX3Byb2dyZXNzCitlbmRpZgkKKyAgICAKK2Nsb2JiZXI6IGNsZWFuX21vZHVsZQorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkKE9VVF9ESVIpCisKKyMgT3B0aW9uYWwgc3Vic3lzdGVtLXNwZWNpZmljIHJ1bGVzCistaW5jbHVkZSBtay8kKFNVQlNZU1RFTSkvTWFrZWZpbGUuJChTVUJTWVNURU0pLnJ1bGVzCisKKyMgR2VuZXJhdGUgYm9hcmQtc3BlY2lmaWMgZW52aXJvbm1lbnQgaWYgYW55Citib2FyZF9lbnY6ICQoQk9BUkRfRU5WX1JVTEUpCisKK21vZHVsZV9uYW1lOgorCSQoaW5mbyAkKE1PRF9OQU1FKSkKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL21rL01ha2VmaWxlLnRlbXBsYXRlIGIvYmFsX3JlbGVhc2UvbWsvTWFrZWZpbGUudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzZTk2MgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL21rL01ha2VmaWxlLnRlbXBsYXRlCkBAIC0wLDAgKzEsMTIgQEAKKyMgQ2VudHJhbCBNYWtlZmlsZSB0ZW1wbGF0ZQorIyBCdWlsZHMgc3BlY2lmaWMgbW9kdWxlCisjIElucHV0IHBhcmFtZXRlcnM6CisjIE1PRF9ESVIKKyMgVE9QX0RJUgorCitpZmVxICh4IiQoVikiLCB4IjEiKQorICAgICQoaW5mbyBCdWlsZGluZyBtb2R1bGUgJChNT0RfRElSKSkKK2VuZGlmCisKK2luY2x1ZGUgJChNQUtFX0RJUikvTWFrZWZpbGUuY29uZmlnCitpbmNsdWRlICQoTUFLRV9ESVIpL01ha2VmaWxlLnJ1bGVzCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9tay9hZ2VudC9tb2R1bGVzLmFnZW50LmJhbCBiL2JhbF9yZWxlYXNlL21rL2FnZW50L21vZHVsZXMuYWdlbnQuYmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkY2E0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9tay9hZ2VudC9tb2R1bGVzLmFnZW50LmJhbApAQCAtMCwwICsxLDI0IEBACiszcmRwYXJ0eS9iY20tc2RrCiszcmRwYXJ0eS9saW5lbm9pc2UKK3NyYy9jb21tb24vYmFsX2FwcF91dGlscworc3JjL2NvbW1vbi9jbGkKK3NyYy9jb21tb24vZGV2X2xvZworc3JjL2NvbW1vbi9pbmNsdWRlCiszcmRwYXJ0eS9tYXBsZQorc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbgorc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9vc19jbGkKK3NyYy9jb21tb24vdXRpbHMKK3NyYy9jb3JlL21haW4KK3NyYy9jb3JlL3V0aWwvbWFjCitzcmMvY29yZS91dGlsL3N3aXRjaAorc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwCitzcmMvY29yZS91dGlsL3N3aXRjaC9lc3cKK3NyYy9saWIvbGliYmFsYXBpCitzcmMvbGliL2xpYmJhbGFwaWNsaQorc3JjL2xpYi9saWJvYmptc2cKK3NyYy9saWIvbGlib21jaXN2Yworc3JjL2xpYi9saWJyc2NtZ3IKK3NyYy9saWIvbGlidG9wb2xvZ3kKK3NyYy9saWIvbGlidXRpbHMKK3NyYy9saWIvbGliY21kbGluZQorCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9tay9iaW5fcmVsZWFzZS5zaCBiL2JhbF9yZWxlYXNlL21rL2Jpbl9yZWxlYXNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiZDAyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9tay9iaW5fcmVsZWFzZS5zaApAQCAtMCwwICsxLDk0IEBACisjIS9iaW4vYmFzaAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisjICAgCisjICAgICBCcm9hZGNvbSBMdGQuIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20gTHRkLgorIyAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyAgIAorIyAgVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBMdGQuIGFuZC9vciBpdHMKKyMgIGxpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50CisjICB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorIyAgYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIEx0ZC4gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KKyMgIGFuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gTHRkLiBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKKyMgIHRvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbSBMdGQuCisjICBleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCisjICBwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorIyAgTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKKyMgIEJST0FEQ09NIExURCBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisjICAgCisjICBFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIyAgIAorIyAgMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyMgICAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSBMdGQuLCBhbmQgeW91IHNoYWxsIHVzZQorIyAgICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworIyAgICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tIEx0ZC4KKyMgICAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisjICAgCisjICAyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyMgICAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisjICAgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisjICAgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyMgICAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyMgICAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorIyAgICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisjICAgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorIyAgICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyMgICAKKyMgIDMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorIyAgICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyMgICAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyMgICAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorIyAgICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyMgICAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisjICAgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworIyAgICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyMgICAgICBMSU1JVEVEIFJFTUVEWS4KKyMgIDo+CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhpcyBzY3JpcHQgaXMgY2FsbGVkIGZyb20gdGhlIG1haW4gTWFrZWZpbGUuCisjIFByZXJlcXVpc2l0ZXM6CisjIDEuIEJBTCBzdGFuZGFsb25lIG9yIG9mcGFsX29mX2FnZW50IGJpbmFyaWVzIGFyZSBidWlsdC4KKyMgMi4gRW52aXJvbm1lbnQgdmFyaWFibGVzIGRlZmluZWQ6CisjICAgIC0gQlVJTERfVEFSR0VUIDogYmFsX29mX2FnZW50IC8gYmFsX2NvcmUKKyMgICAgLSBCSU5fUkVMRUFTRV9GSUxFX1BSRUZJWCAgOiBiaW5hcnkgcmVsZWFzZSBmaWxlIHByZWZpeAorCitpZiBbWyAiJEJJTl9SRUxFQVNFX0ZJTEVfUFJFRklYIiA9PSAiIiBdXTsgdGhlbgorICAgZWNobyBCSU5fUkVMRUFTRV9GSUxFX1BSRUZJWCB2YXJpYWJsZSBtdXN0IGJlIHNldAorICAgZXhpdCAtMQorZmkKKworVE1QX0RJUj0vdG1wL2JhbF9iaW5fcmVsZWFzZS9gZGF0ZSArJWRfJW1fJVlfJUhfJU1fJVNgCitCSU5fUkVMRUFTRV9GSUxFPSRCSU5fUkVMRUFTRV9GSUxFX1BSRUZJWC50YXIuZ3oKK0JJTl9SRUxFQVNFX0RJUj0kVE1QX0RJUi8kQklOX1JFTEVBU0VfRklMRV9QUkVGSVgKKworbWtkaXIgLXAgJEJJTl9SRUxFQVNFX0RJUgorCitpZiBbWyAiJEJVSUxEX1RBUkdFVCIgPT0gImNvcmUiIF1dOyB0aGVuCisgICAgZWNobyBHZW5lcmF0aW5nIEJBTCBSZWxlYXNlIEFyY2hpdmUgJEJJTl9SRUxFQVNFX0ZJTEUKKyAgICBjcCBidWlsZC9jb3JlL3NyYy9jb3JlL21haW4vYmFsX2NvcmUgJEJJTl9SRUxFQVNFX0RJUi8KK2VsaWYgW1sgIiRCVUlMRF9UQVJHRVQiID09ICJhZ2VudCIgXV07IHRoZW4KKyAgICBlY2hvIEdlbmVyYXRpbmcgT0YgQWdlbnQgUmVsZWFzZSBBcmNoaXZlICRCSU5fUkVMRUFTRV9GSUxFCisgICAgY3AgYnVpbGQvYWdlbnQvM3JkcGFydHkvaW5kaWdvL29mcGFsX29mX2FnZW50ICRCSU5fUkVMRUFTRV9ESVIvYmNtX3Nkbl9hZ2VudAorIyBUaGUgZm9sbG93aW5nIGFyZSByZWxldmFudCBvbmx5IHdoZW4gQlVJTERfTkNfQUdFTlQ9eSwgc28gdGhleSBtaWdodCBub3QgZXhpc3QKKyAgICBpZiB0ZXN0IC1lIGJ1aWxkL2FnZW50L3N0YXJ0X3Nkbl9hZ2VudC5zaDsgdGhlbiBjcCBidWlsZC9hZ2VudC9zdGFydF9zZG5fYWdlbnQuc2ggJEJJTl9SRUxFQVNFX0RJUjsgZmkKKyAgICBpZiB0ZXN0IC1lIGJ1aWxkL2FnZW50L2xpYjsgdGhlbiBjcCAtYXIgYnVpbGQvYWdlbnQvbGliICRCSU5fUkVMRUFTRV9ESVI7IGZpCisgICAgaWYgdGVzdCAtZSBidWlsZC9hZ2VudC9iaW47IHRoZW4gY3AgLWFyIGJ1aWxkL2FnZW50L2JpbiAkQklOX1JFTEVBU0VfRElSOyBmaQorICAgIGlmIHRlc3QgLWUgYnVpbGQvYWdlbnQvbW9kdWxlczsgdGhlbiBjcCAtYXIgYnVpbGQvYWdlbnQvbW9kdWxlcyAkQklOX1JFTEVBU0VfRElSOyBmaQorICAgIGlmIHRlc3QgLWUgL3Vzci9saWIvbGlic3NsLnNvLjEwOyB0aGVuIGNwIC1hciAvdXNyL2xpYi9saWJzc2wuc28uMTAgJEJJTl9SRUxFQVNFX0RJUjsgZmkKKyAgICBpZiB0ZXN0IC1lIC91c3IvbGliL2xpYmNyeXB0by5zby4xMDsgdGhlbiBjcCAtYXIgL3Vzci9saWIvbGliY3J5cHRvLnNvLjEwICRCSU5fUkVMRUFTRV9ESVI7IGZpCitlbHNlCisgICAgZWNobyBCVUlMRF9UQVJHRVQgaGFzIHVuZXhwZWN0ZWQgdmFsdWUgXCIkQlVJTERfVEFSR0VUXCIuIE11c3QgYmUgXCJjb3JlXCIgb3IgXCJhZ2VudFwiCisgICAgZXhpdCAtMQorZmkKKworY3Agc2NyaXB0cy9iYWxfYXV0b3N0YXJ0LmluaSAkQklOX1JFTEVBU0VfRElSLworY3Agc2NyaXB0cy9iYWxfY29uZmlnLmluaSAkQklOX1JFTEVBU0VfRElSLworY3AgM3JkcGFydHkvYmNtLXNkay9yYy9iYWwvcnBjLnNvYy50ZW1wbGF0ZSAkQklOX1JFTEVBU0VfRElSCisKK2NkICRUTVBfRElSCit0YXIgLWN6ZiAkQklOX1JFTEVBU0VfRklMRSAkQklOX1JFTEVBU0VfRklMRV9QUkVGSVgKK2VjaG8gLi8kQklOX1JFTEVBU0VfRklMRSBjcmVhdGVkCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL21rL2JvYXJkcy93cngvYm9hcmQuY29uZmlnIGIvYmFsX3JlbGVhc2UvbWsvYm9hcmRzL3dyeC9ib2FyZC5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhNGFlMAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL21rL2JvYXJkcy93cngvYm9hcmQuY29uZmlnCkBAIC0wLDAgKzEsNDkgQEAKKyMgV1JYIGJvYXJkCisjCisKK2V4cG9ydCBDT05GSUdfTUFDX1JQQyA/PSBuCitleHBvcnQgQ09ORklHX1NXSVRDSF9SUEMgPz0gbgorCisjIEtlcm5lbCB0cmVlIGFuZCB0b29sY2hhaW4KK0JPQVJEX0RJUiAgICAgICA/PSAkKFRPUF9ESVIpLy4uL2JvYXJkcy9jdXIvJChCT0FSRCkKK0tFUk5FTF9CUkNNX1ZFUiA9IDMuMC4yLW0xLjAxCitUT09MQ0hBSU5fUEFUSCAgPz0gL29wdC90b29sY2hhaW5zL21hcGxlL3Rvb2xjaGFpbnNfYmluL21pcHNjcm9zcy9saW51eC9iaW4KK0NST1NTX0NPTVBJTEUgICA9ICQoVE9PTENIQUlOX1BBVEgpL21pcHM2NC1ubG0tbGludXgtCitDUk9TU19MSUJfUEFUSCAgPSAkKFRPT0xDSEFJTl9QQVRIKS8uLi9taXBzNjQtbmxtLWxpbnV4L2xpYjY0CitDT05GSUdVUkVfVEFSR0VUICA9IG1pcHM2NC1ubG0tbGludXgKK2V4cG9ydCBUT09MQ0hBSU5fUEFUSAorZXhwb3J0IENST1NTX0NPTVBJTEUKK2V4cG9ydCBDT05GSUdVUkVfVEFSR0VUCisKKyMgSW4gdGhlIG1vbWVudCB3ZSBkb24ndCBwbGFuIHRvIGJ1aWxkIGFueSBrZXJuZWwgbW9kdWxlcworIyBpZi93aGVuIHdlIGRvIHNldCBPRF9LRVJORUw9bGludXgKK2V4cG9ydCBPU19LRVJORUw9IHBvc2l4CisKKyMgT1MgZm9yIHVzZXIgc3BhY2UgCitPUyAgICAgICAgICAgICAgPSBwb3NpeAorCisjIFRoZSBmb2xsb3dpbmcgZ3JvdXAgaXMgb25seSBuZWVkZWQgaWYgd2UgZGVjaWRlIHRoYXQgZG8gbmVlZCBsaW51eCBrZXJuZWwgbW9kdWxlcworIyBJbiB0aGlzIGNhc2UgT1NfS0VSTkVMIGFib3ZlIG11c3QgYmUgc2V0ID1saW51eCBhbmQgYSBmZXcgYWRkaXRpb25zIGFyZSBuZWVkZWQgaW4gdGhlIHNvdXJjZSB0cmVlICAgCitLRVJORUxESVIgICAgICAgPSAkKEJPQVJEX0RJUikvbGludXgvJChLRVJORUxfQlJDTV9WRVIpL2xpbnV4CitLRVJORUxfT1VURElSICA/PSAkKEtFUk5FTERJUikKK2V4cG9ydCBLRVJORUxESVIKK2V4cG9ydCBLRVJORUxfT1VURElSCitLRVJORUxfQVJDSCAgICAgPSBtaXBzCitBUkNIX0ZMQUdTICAgICAgKz0gLUVCIC1tYWJpPTY0CitMRF9BUkNIX0ZMQUdTICs9IC1tZWxmNjRidHNtaXAKK0hPU1RfQklHX0VORElBTiA/PSB5CisKK2V4cG9ydCBLRVJORUxfQVJDSAorZXhwb3J0IEFSQ0hfRkxBR1MKKworZXhwb3J0IEtFUk5FTF9UQVJfTkFNRSAgPSB3cnhfbGludXgtc2RrLnRhci5iejIKK2V4cG9ydCBMSUJTX1RBUl9OQU1FICAgID0gbGlicmFyaWVzLnRhci5iejIKKworCitpZmVxICgiJChTVUJTWVNURU0pIiwgImNvcmUiKQorCSMgQ29yZS1zcGVjaWZpYyBzdHVmZgorZW5kaWYJCisKK2lmZXEgKCIkKFNVQlNZU1RFTSkiLCAiYXBwcyIpCisgICAgIyBBcHBzLXNwZWNpZmljIHN0dWZmCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvbWsvY2xhbmcub3B0cyBiL2JhbF9yZWxlYXNlL21rL2NsYW5nLm9wdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzODNlZgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL21rL2NsYW5nLm9wdHMKQEAgLTAsMCArMSw2IEBACisjIENMQU5HIG9wdGlvbnMKKworIyBDTEFORyB0b29sCitleHBvcnQgQ0xBTkcgPz0gY2xhbmcKK2V4cG9ydCBDTEFOR19PUFRTID0gLVduby11bnVzZWQtZnVuY3Rpb24KK2V4cG9ydCBMTFZNVkVSID89IDMuNgpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvbWsvY29uZmlnLmxudCBiL2JhbF9yZWxlYXNlL21rL2NvbmZpZy5sbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0MDc5MgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL21rL2NvbmZpZy5sbnQKQEAgLTAsMCArMSwxMDQgQEAKKy1pL3Rvb2xzL2FybS9EUy01XzUuMTguMC9MaW51eC02NC9pbmNsdWRlIAorLXdsaWIoMCkgLy8gbm8gY29tcGxhaW50cyBmb3IgbGlicyAKKy1iIAorLXUgCistdiAKKy1BKEM5OSkKKy1jZ251CistZF9fR05VQ19fCistZF9fRlVOQ1RJT05fXz0iRlVOQyIKKy1maHMKKytkQkNNT1NfVFJVRT0oKGJjbW9zX2Jvb2wpMSkKKytkQkNNT1NfRkFMU0U9KChiY21vc19ib29sKTApCistc3Ryb25nKEF6Y1hKemMpCistc3Ryb25nKEFYSmIsYmNtb3NfYm9vbCkKKy1zdHJvbmcoLCB1aW50NjRfdCkKKy1zdHJvbmcoLCB1aW50MzJfdCkKKy1zdHJvbmcoLCB1aW50MTZfdCkKKy1zdHJvbmcoLCB1aW50OF90KQorLXN0cm9uZygsIGludDY0X3QpCistc3Ryb25nKCwgaW50MzJfdCkKKy1zdHJvbmcoLCBpbnQxNl90KQorLXN0cm9uZygsIGludDhfdCkKKy1zdHJvbmcoLCBVTE9ORykKKy1zdHJvbmcoLCBzaXplX3QpCistc2VtKCBiY21vc19mYXN0bG9ja19sb2NrLCB0aHJlYWRfbG9jayApCistc2VtKCBiY21vc19mYXN0bG9ja191bmxvY2ssIHRocmVhZF91bmxvY2sgKQorLXNlbSggYmNtb3Nfc2VtX3dhaXQsIHRocmVhZF9sb2NrICkKKy1zZW0oIGJjbW9zX3NlbV9wb3N0LCB0aHJlYWRfdW5sb2NrICkKKy1zZW0oIGJjbW9zX211dGV4X2xvY2ssIHRocmVhZF9sb2NrICkKKy1zZW0oIGJjbW9zX211dGV4X3VubG9jaywgdGhyZWFkX3VubG9jayApCistZnVuY3Rpb24oIGZyZWUsIGJjbW9zX2Jsa19wb29sX2ZyZWUgKQorLWZ1bmN0aW9uKCBtYWxsb2MoMCksIGJjbW9zX2Jsa19wb29sX2FsbG9jKDApICkKKy1mdW5jdGlvbiggY2FsbG9jKDApLCBiY21vc19ibGtfcG9vbF9jYWxsb2MoMCkgKQorLWZ1bmN0aW9uKCBtYWxsb2MoMCksIGJjbW9zX2J5dGVfcG9vbF9hbGxvYygwKSApCistZnVuY3Rpb24oIG1hbGxvYygxKSwgYmNtb3NfYnl0ZV9wb29sX2FsbG9jKDIpICkKKy1mdW5jdGlvbiggZnJlZSwgYmNtb3NfYnl0ZV9wb29sX2ZyZWUgKQorLWZ1bmN0aW9uKCBtYWxsb2MociksIGJjbW9zX2Jsa19wb29sX2FsbG9jKHIpICkKKy1mdW5jdGlvbiggY2FsbG9jKHIpLCBiY21vc19ibGtfcG9vbF9jYWxsb2MocikgKQorLWZ1bmN0aW9uKCBtYWxsb2MociksIGJjbW9zX2J5dGVfcG9vbF9hbGxvYyhyKSApCistZnVuY3Rpb24oIG1hbGxvYywgYmNtb3NfYWxsb2MgKQorLWZ1bmN0aW9uKCBjYWxsb2MsIGJjbW9zX2NhbGxvYyApCistZnVuY3Rpb24oIGZyZWUsIGJjbW9zX2ZyZWUgKQorLWZ1bmN0aW9uKCBtYWxsb2MoMCksIGJjbWRiX3NldF9sb2NrX3JlYWQoMCkgKQorLWZ1bmN0aW9uKCBmcmVlKDApLCBiY21kYl9zZXRfdW5sb2NrX3JlYWQoMCkgKQorLWZ1bmN0aW9uKCBtYWxsb2MoMCksIGJjbWRiX3NldF9sb2NrX21vZGlmeSgwKSApCistZnVuY3Rpb24oIGZyZWUoMCksIGJjbWRiX3NldF91bmxvY2tfbW9kaWZ5KDApICkKKy1mdW5jdGlvbiggbWFsbG9jKDApLCBiY21kYl9yZWNvcmRfZ2V0cmF3X3JlYWQoMCkgKQorLWZ1bmN0aW9uKCBmcmVlKDApLCBiY21kYl9yZWNvcmRfdW5sb2NrX3JlYWQoMCkgKQorLWZ1bmN0aW9uKCBtYWxsb2MoMCksIGJjbWRiX3JlY29yZF9nZXRyYXdfd3JpdGUoMCkgKQorLWZ1bmN0aW9uKCBmcmVlKDApLCBiY21kYl9yZWNvcmRfdW5sb2NrX3dyaXRlKDApICkKKy1lKgorK2U2NAorK2U0MDggCisrZTQxMyAKKytlNDE0IAorK2U0MTUgCisrZTQxNiAKKytlNDE5IAorK2U0MjAgCisrZTQyMyAKKytlNDI0IAorK2U0MjggCisrZTQyOSAKKytlNDMzIAorK2U0MzggCisrZTQ0OSAKKytlNDU0IAorK2U0NTUgCisrZTUzMCAKKytlNTQ3IAorK2U1NDkgCisrZTU4NyAKKytlNTg4IAorK2U1ODkgCisrZTU5MCAKKytlNjAzIAorK2U2MDQgCisrZTYzMiAKKytlNjMzIAorK2U2MzQgCisrZTYzNSAKKytlNjM2IAorK2U2MzcgCisrZTYzOCAKKytlNjM5IAorK2U2NDAgCisrZTY0NCAKKytlNjUyIAorK2U2NzQgCisrZTY4NCAKKytlNjg1IAorK2U3MjcgCisrZTczMyAKKytlNzg5IAorK2U4MTAgCisrZTk1NworCisrZG9mZnNldG9mKF9fdHlwLF9faWQpPSgoc2l6ZV90KSYoKChfX3R5cCopMCktPl9faWQpKQorK2RfX2F0dHJpYnV0ZV9fKC4uLik9CisKKy8vIHRoaXMgaXMgcmVwZWF0ZWQgYmVjYXVzZSBlYWNoIGludm9jYXRpb24gZG91YmxlcyB0aGUgc2l6ZSBvZiBtYWNybyBzdG9yYWdlCisrbWFjcm9zICttYWNyb3MgK21hY3JvcyArbWFjcm9zCisrbWFjcm9zICttYWNyb3MgK21hY3JvcyArbWFjcm9zCistcGFzc2VzKDIpCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9tay9jb3JlL01ha2VmaWxlLmNvcmUuY29uZmlnIGIvYmFsX3JlbGVhc2UvbWsvY29yZS9NYWtlZmlsZS5jb3JlLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWM0MTE3Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvbWsvY29yZS9NYWtlZmlsZS5jb3JlLmNvbmZpZwpAQCAtMCwwICsxLDE5IEBACisjIEJBTCBjb3JlIGNvbmZpZ3VyYXRpb24KKyMKKyMgU2V0IGVudmlyb25tZW50LCBleHRyYSBmbGFncywgZXRjLgorIyBJbiBwYXJ0aWN1bGFyLCBzZXQgQ1JPU1NfQ09NUElMRQorIyBGb3IgbGludXggZW52aXJvbm1lbnQgbWFrZSBzdXJlIHRvIHNldCBhbHNvIE9TX0tFUk5FTD1saW51eCwgS0VSTkVMRElSLCBLRVJORUxfT1VURElSIGFuZCBLRVJORUxfQVJDSAoraWZuZXEgKCIkKEJPQVJEKSIsICIiKQorICAgIGluY2x1ZGUgbWsvYm9hcmRzLyQoQk9BUkQpL2JvYXJkLmNvbmZpZworCS1pbmNsdWRlIG1rL2JvYXJkcy8kKEJPQVJEKS8kKFRPT0xDSEFJTikub3B0cworZW5kaWYKKworaW5jbHVkZSBtay8kKFRPT0xDSEFJTikub3B0cworCitleHBvcnQgS0VSTkVMRElSCitleHBvcnQgS0VSTkVMX09VVERJUgorZXhwb3J0IEtFUk5FTF9BUkNICitleHBvcnQgT1NfS0VSTkVMCisKK0JVSUxEX09GX0FHRU5UIDo9IG4KK0JVSUxEX05DX0FHRU5UIDo9IG4KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL21rL2NvcmUvTWFrZWZpbGUuY29yZS5ydWxlcyBiL2JhbF9yZWxlYXNlL21rL2NvcmUvTWFrZWZpbGUuY29yZS5ydWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDA2NzhiCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvbWsvY29yZS9NYWtlZmlsZS5jb3JlLnJ1bGVzCkBAIC0wLDAgKzEsNyBAQAorIyBCQUwgY29yZS1zcGVjaWZpYyBydWxlcworIworIyBQbGF0Zm9ybS9ib2FyZC1zcGVjaWZpYyBydWxlcworIyBJbiBwYXJ0aWN1bGFyLCBzZXQgQk9BUkRfRU5WX1JVTEUgaWYgdGhlcmUgaXMgYW55dGhpbmcgYm9hcmQtc3BlY2lmaWMgdG8gYmUgZG9uZQoraWZuZXEgKCIkKEJPQVJEKSIsICIiKQorICAgIC1pbmNsdWRlIG1rL2JvYXJkcy8kKEJPQVJEKS9ib2FyZC5ydWxlcworZW5kaWYKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL21rL2NvcmUvbW9kdWxlcy5jb3JlLmJhbCBiL2JhbF9yZWxlYXNlL21rL2NvcmUvbW9kdWxlcy5jb3JlLmJhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGI2NGMzCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvbWsvY29yZS9tb2R1bGVzLmNvcmUuYmFsCkBAIC0wLDAgKzEsMjMgQEAKKzNyZHBhcnR5L2JjbS1zZGsKKzNyZHBhcnR5L2xpbmVub2lzZQorc3JjL2NvbW1vbi9iYWxfYXBwX3V0aWxzCitzcmMvY29tbW9uL2NsaQorc3JjL2NvbW1vbi9kZXZfbG9nCitzcmMvY29tbW9uL2luY2x1ZGUKKzNyZHBhcnR5L21hcGxlCitzcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uCitzcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL29zX2NsaQorc3JjL2NvbW1vbi91dGlscworc3JjL2NvcmUvbWFpbgorc3JjL2NvcmUvdXRpbC9tYWMKK3NyYy9jb3JlL3V0aWwvc3dpdGNoCitzcmMvY29yZS91dGlsL3N3aXRjaC9kcHAKK3NyYy9jb3JlL3V0aWwvc3dpdGNoL2Vzdworc3JjL2xpYi9saWJiYWxhcGkKK3NyYy9saWIvbGliYmFsYXBpY2xpCitzcmMvbGliL2xpYm9iam1zZworc3JjL2xpYi9saWJyc2NtZ3IKK3NyYy9saWIvbGlidG9wb2xvZ3kKK3NyYy9saWIvbGlidXRpbHMKK3NyYy9saWIvbGliY21kbGluZQorc3JjL2FwcHMvYmFsX2NsaQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvbWsvY3JlYXRlX2FydGlmYWN0cy5zaCBiL2JhbF9yZWxlYXNlL21rL2NyZWF0ZV9hcnRpZmFjdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTkzZjFkYwotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL21rL2NyZWF0ZV9hcnRpZmFjdHMuc2gKQEAgLTAsMCArMSwxMDAgQEAKKyMhL2Jpbi9iYXNoCisjc2V0IC14CisKKyMgQ29weSBjb25maWcgc2NyaXB0LiBMb29rIGluIHRoZSBCQUwgZGlyZWN0b3J5IGZpcnN0LiBJZiBub3QgZm91bmQsIHRha2UgZnJvbSB0aGUgc2NyaXB0cworZnVuY3Rpb24gY29weV9jb25maWdfc2NyaXB0IHsKKwlpZiB0ZXN0IC1uICIkMiI7IHRoZW4KKwkJdGVtcGxhdGVfZGlyPSQyCisJZWxzZQorCQl0ZW1wbGF0ZV9kaXI9JGJhbF9kaXIvc2NyaXB0cworCWZpCisJaWYgWyAtZiAkYmFsX2Rpci8kMSBdOyB0aGVuCisJICAgY3AgLWEgJGJhbF9kaXIvJDEgJHRhcmdldF9kaXIvCisJZWxzZQorCSAgIGNwIC1hICR0ZW1wbGF0ZV9kaXIvJDEgJHRhcmdldF9kaXIvCisJZmkKK30KKworYmFsX2Rpcj1gcHdkYAorCisjIENvcHkgYW5kIHN0cmlwIGJjbV9zZG5fYWdlbnQKK2lmIFsgIiRCVUlMRF9PRl9BR0VOVCIgPSAieSIgXTsgdGhlbgorCXRhcmdldF9kaXI9YmNtX3Nkbl9hZ2VudF9hcnRpZmFjdHMKKwl0YXJnZXRfZXhlYz1iY21fc2RuX2FnZW50CisJdGFyZ2V0X25hbWU9YmNtX3Nkbl9hZ2VudAorCWJ1aWxkX2Rpcj1idWlsZC9hZ2VudAorZWxzZQorCXRhcmdldF9kaXI9YmNtX2JhbF9hcnRpZmFjdHMKKwl0YXJnZXRfbmFtZT1iYWxfY2xpCisJdGFyZ2V0X2V4ZWM9c3JjL2FwcHMvYmFsX2NsaS9iYWxfY2xpCisJYnVpbGRfZGlyPWJ1aWxkL2NvcmUKK2ZpCisKK2NkICRidWlsZF9kaXIKK2VjaG8gIkNyZWF0aW5nICR0YXJnZXRfbmFtZSBidWlsZCBhcnRpZmFjdHMgaW4gYHB3ZGAvJHRhcmdldF9kaXIiCitybSAtZnIgJHRhcmdldF9kaXIKK21rZGlyIC1wICR0YXJnZXRfZGlyCisKK2VjaG8gIlN0cmlwcGluZyAkdGFyZ2V0X25hbWUgYW5kIGV4dHJhY3RpbmcgZGVidWcgc3ltYm9scyIKKyR7Q1JPU1NfQ09NUElMRX1vYmpjb3B5IC0tc3RyaXAtZGVidWcgLS1zdHJpcC11bm5lZWRlZCAkdGFyZ2V0X2V4ZWMgJHRhcmdldF9kaXIvJHRhcmdldF9uYW1lCiske0NST1NTX0NPTVBJTEV9b2JqY29weSAtLW9ubHkta2VlcC1kZWJ1ZyAkdGFyZ2V0X2V4ZWMgJHRhcmdldF9uYW1lLmRlYnVnCiske0NST1NTX0NPTVBJTEV9b2JqY29weSAtLWFkZC1nbnUtZGVidWdsaW5rPSR0YXJnZXRfbmFtZS5kZWJ1ZyAkdGFyZ2V0X2Rpci8kdGFyZ2V0X25hbWUKK2VjaG8gIlN0cmlwcGluZyBjb21wbGV0ZSIKKworaWYgWyAiJEpFTktJTlNfQlVJTEQiID09ICJ5IiBdOyB0aGVuCisJY3AgJGJhbF9kaXIvLi4vLi4vLi4vYnVpbGRfaW5mby5sb2cgYnVpbGRfaW5mby5sb2cKKwl0YXIgLWN6ZiAkdGFyZ2V0X25hbWUuZGVidWcudGFyLmd6ICR0YXJnZXRfbmFtZS5kZWJ1ZyBidWlsZF9pbmZvLmxvZworCXJtIGJ1aWxkX2luZm8ubG9nCitlbHNlCisJdGFyIC1jemYgJHRhcmdldF9uYW1lLmRlYnVnLnRhci5neiAkdGFyZ2V0X25hbWUuZGVidWcKK2ZpCisKKyMgQ29weSBpbml0IHNjcmlwdHMuIExvb2sgaW4gdGhlIEJBTCBkaXJlY3RvcnkgZmlyc3QuIElmIG5vdCBmb3VuZCwgdGFrZSBmcm9tIHRoZSBzY3JpcHRzCitjb3B5X2NvbmZpZ19zY3JpcHQgYmFsX2NvbmZpZy5pbmkKK2NvcHlfY29uZmlnX3NjcmlwdCBiYWxfYXV0b3N0YXJ0LmluaQorY29weV9jb25maWdfc2NyaXB0IGJhbF90b3BvbG9neS5pbmkKKyMgUmVuYW1lIHRoZSBiYWxfdG9wb2xvZ3kuaW5pIGZpbGUgdG8gYXZvaWQgYnJpbmd1cCBpc3N1ZXMKK212ICR0YXJnZXRfZGlyL2JhbF90b3BvbG9neS5pbmkgJHRhcmdldF9kaXIvYmFsX3RvcG9sb2d5LmluaS5zYW1wbGUKK2NvcHlfY29uZmlnX3NjcmlwdCBycGMuc29jLnRlbXBsYXRlICRiYWxfZGlyLzNyZHBhcnR5L2JjbS1zZGsvcmMvYmFsCitjcCAtYXIgLi4vLi4vM3JkcGFydHkvYmNtLXNkay9yYyAkdGFyZ2V0X2Rpci9zd2l0Y2hfcmMKK3JtIC1mciAkdGFyZ2V0X2Rpci9zd2l0Y2hfcmMvYXJhZCAkdGFyZ2V0X2Rpci9zd2l0Y2hfcmMva3QyCisKK2lmIFsgIiRCVUlMRF9OQ19BR0VOVCIgPSAieSIgXTsgdGhlbgorICAgIGNwIC1hciBsaWIgJHRhcmdldF9kaXIvCisgICAgIyBmb3IgU0ROLVBBTCBydW5uaW5nIG9uIHg4NiwgY29weSB0aGUgbGlic3NsIGFuZCBsaWJjcnlwdG8KKyAgICBpZiBbICIkQk9BUkQiID0gIiIgXTsgdGhlbgorICAgICAgICBlY2hvICJDb3B5aW5nIGxpYmNyeXB0byBhbmQgbGlic3NsIGZvciB4ODYgdGFyZ2V0IgorICAgICAgICBjcCAvdXNyL2xpYi9saWJzc2wuc28uMTAgL3Vzci9saWIvbGliY3J5cHRvLnNvLjEwICR0YXJnZXRfZGlyL2xpYi8KKyAgICBmaQorICAgIGNwIC1hciBtb2R1bGVzICR0YXJnZXRfZGlyLworICAgIGNwIC1hIHN0YXJ0X3Nkbl9hZ2VudC5zaCAkdGFyZ2V0X2Rpci8KKyAgICBjcCAtYSBzdGFydF9uZXRvcGVlcl9jbGkuc2ggJHRhcmdldF9kaXIvCisgICAgY3AgLWEgYmluL25ldG9wZWVyLWNsaSAkdGFyZ2V0X2Rpci8KK2ZpCisKK2lmIFsgIiRCT0FSRCIgPSAid3J4IiBdOyB0aGVuCisgICAgZWNobyAiQ29weWluZyBTVks0IHNwZWNpZmljIHNjcmlwdHMgYW5kIGZpbGVzIgorICAgIGNvcHlfY29uZmlnX3NjcmlwdCBiYWxfc2V0dXBfc3ZrNC5zaAorICAgIGVjaG8gJ2lmIFsgIiR7UFdEfSIgIT0gIi9icm9hZGNvbSIgXTsgdGhlbiBlY2hvICJFUlJPUjogWW91ciBhcmNoaXZlIGZpbGUgbXVzdCBiZSBleHBhbmRlZCBpbnRvIC9icm9hZGNvbSBiZWZvcmUgcnVubmluZyB0aGlzIHNjcmlwdCI7IGVsc2UgaWYgWyAtZCAvZXRjL3JjUy5kIF07IHRoZW4gZWNobyAiSW5zdGFsbGluZyBiYWwgc3RhcnR1cCBzY3JpcHQgaW4gL2V0Yy9yY1MuZCIgJiYgcHVzaGQgL2V0Yy9yY1MuZCA+L2Rldi9udWxsICYmIHJtIC1mIFM5OWJhbHNldHVwICYmIGxuIC1zIC9icm9hZGNvbS9iYWxfc2V0dXBfc3ZrNC5zaCBTOTliYWxzZXR1cCAmJiBwb3BkID4vZGV2L251bGwgJiYgZWNobyAiSW5zdGFsbGluZyBzdms0IHNjcmlwdHMiICYmIGNwIC1mIHN3aXRjaF9yYy9zdms0LyogLiAmJiB0b3VjaCAvZXRjL3N2azQgJiYgY2F0IGJhbF9jb25maWcuaW5pIHwgc2VkIHMvIm9mX2RldnM9MSIvIm9mX2RldnM9MiIvZyA+IGJhbF9jb25maWcuaW5pLnN2azRfZGV2cyAmJiBjYXQgYmFsX2NvbmZpZy5pbmkuc3ZrNF9kZXZzIHwgc2VkIHMvIm51bV9ubmlfcG9ydHM9MSIvIm51bV9ubmlfcG9ydHM9NiIvZyA+IGJhbF9jb25maWcuaW5pLnN2azRfZGV2c19ubmkgJiYgY2F0IGJhbF9jb25maWcuaW5pLnN2azRfZGV2c19ubmkgfCBzZWQgcy8ibWFwdGFibGU9MyIvIm1hcHRhYmxlPTQiL2cgPiBiYWxfY29uZmlnLmluaSAmJiBybSAtZiBiYWxfY29uZmlnLmluaS5zdms0X2RldnMgJiYgcm0gLWYgYmFsX2NvbmZpZy5pbmkuc3ZrNF9kZXZzX25uaTsgZmk7IGZpJyA+IHN2azRfaW5zdGFsbC5zaAorICAgIGNobW9kIDc1NSBzdms0X2luc3RhbGwuc2gKKyAgICBjcCBzdms0X2luc3RhbGwuc2ggJHRhcmdldF9kaXIKKyAgICBlY2hvICJQbGVhc2UgcnVuIHN2azRfaW5zdGFsbC5zaCAob25seSBvbiBTVks0IGhhcmR3YXJlISkiID4gUkVBRE1FLnN2azQKKyAgICBjcCAuLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvYnVpbGQvZnMvc3ZrX2luaXRfc3RhcnR1cC5zaCAkdGFyZ2V0X2Rpci8KKyAgICBpZiBbICIkSkVOS0lOU19CVUlMRCIgPT0gInkiIF07IHRoZW4KKyAgICAgICAgY3AgLi4vLi4vM3JkcGFydHkvYmNtLXNkay9idWlsZC13cngvc2RrLWFsbC0qL2J1aWxkL3Byb2plY3RzL3hQT05fT0xUL2plbmtpbnMvam9icy9CYWwuU3luY2VkLmJjbS1zZGstKi5Xcngvd29ya3NwYWNlL2JhbC9jdXIvM3JkcGFydHkvYmNtLXNkay9saW51eC0qLWJkZS5rbyAkdGFyZ2V0X2Rpci8KKyAgICBmaQorICAgIGNwIFJFQURNRS5zdms0ICR0YXJnZXRfZGlyLyAmJiBybSBSRUFETUUuc3ZrNAorZmkKKworaWYgWyAiJEpFTktJTlNfQlVJTEQiID09ICJ5IiBdOyB0aGVuCisgICAgZWNobyAiSW5jbHVkaW5nIGJ1aWxkX2luZm8ubG9nIGluIHRoZSBhcmNoaXZlIgorICAgIGNwICRiYWxfZGlyLy4uLy4uLy4uL2J1aWxkX2luZm8ubG9nICR0YXJnZXRfZGlyLworZmkKKworYXJjaGl2ZT0kdGFyZ2V0X2Rpci50YXIuZ3oKK2VjaG8gIkFyY2hpdmluZyBhcnRpZmFjdHMgaW4gYHB3ZGAvJGFyY2hpdmUiCit0YXIgLWN6ZiAkYXJjaGl2ZSAkdGFyZ2V0X2RpcgorZWNobyAiQXJjaGl2ZSBjb250YWluczoiCit0YXIgdHp2ZiAkYXJjaGl2ZQorCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL21rL2djYy5vcHRzIGIvYmFsX3JlbGVhc2UvbWsvZ2NjLm9wdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkY2YzMgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL21rL2djYy5vcHRzCkBAIC0wLDAgKzEsNTYgQEAKK0VYVFJBX0NGTEFHUyAgICArPSAtV2FsbCAtV2Vycm9yCitBUkZMQUdTID0gcgorCitCTERfQ0NfSE9TVCA9ICQoQ0NBQ0hFKSBnY2MKK0JMRF9DQyA9ICQoQ0NBQ0hFKSAkKENST1NTX0NPTVBJTEUpZ2NjCitCTERfQVMgPSAkKENDQUNIRSkgJChDUk9TU19DT01QSUxFKWdjYworQkxEX0FSID0gJChDUk9TU19DT01QSUxFKWFyCitCTERfREVQID0gJChCTERfQ0MpCisKKyMgTWFwbGUgU0RLIHJlcXVpcmVzIEM5OQorQ0ZMQUdTICAgICs9IC1zdGQ9Yzk5CitpZmVxICgiJChFTkFCTEVfRVhUUkFfV0FSTklOR1MpIiwgInkiKQorICAgIENGTEFHUyAgICArPSAtV2V4dHJhIC1XYmFkLWZ1bmN0aW9uLWNhc3QgLVdjYXN0LWFsaWduIC1XY2FzdC1xdWFsIC1XY2hhci1zdWJzY3JpcHRzCisgICAgQ0ZMQUdTICAgICs9IC1XbWlzc2luZy1wcm90b3R5cGVzIC1XbmVzdGVkLWV4dGVybnMgLVdwb2ludGVyLWFyaXRoIC1XcmVkdW5kYW50LWRlY2xzCisgICAgQ0ZMQUdTICAgICs9IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdwYXJlbnRoZXNlcyAtV3N3aXRjaCAtV3N3aXRjaC1kZWZhdWx0IC1XdW51c2VkIC1XdW5pbml0aWFsaXplZCAtV3VudXNlZC1idXQtc2V0LXZhcmlhYmxlCisgICAgQ0ZMQUdTICAgICs9IC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIC1Xbm8tc2lnbi1jb21wYXJlCisgICAgQ0ZMQUdTICAgICs9IC1Xc2hhZG93IC1Xbm8taW5saW5lCitlbmRpZgorCitCVUlMRF9ERVBTX0lOX0NDICAgID89IHkKK2V4cG9ydCBCVUlMRF9ERVBTX0lOX0NDCisKK2lmZXEgKCIkKEJVSUxEX0RFUFNfSU5fQ0MpIiwgInkiKQorICAgIENGTEFHUyArPSAtTU1EIC1NUAorZW5kaWYKKworaWZlcSAoIiQoQ1JPU1NfQ09NUElMRSkiLCAiIikKKyAgICBBUkNIX0ZMQUdTICs9IC1tMzIgLW1hcmNoPWkzODYKKyAgICBMRF9BUkNIX0ZMQUdTICs9IC1tIGVsZl9pMzg2IC0tb2Zvcm1hdD1lbGYzMi1pMzg2CisgICAgU0lNVUxBVElPTl9CVUlMRCA/PSB5CisgICAgZXhwb3J0IFNJTVVMQVRJT05fQlVJTEQKKyAgICBHQ0NWRVIgPz0gNC44LjEKKyAgICBleHBvcnQgR0NDVkVSCisgICAgIyBUZW1wb3JhcnksIHVudGlsIGJhZCBjYXN0IGluIGJjbV9kZXZfbG9nX3Rhc2suYyBpcyBmaXhlZCAoU1dNQVBMRS0yMTIzKQorICAgIENGTEFHUyArPSAtV25vLXN0cmljdC1hbGlhc2luZworICAgIENPTkZJR1VSRV9UQVJHRVQgPz0gaTU4Ni1saW51eC1nbnUKK2VuZGlmCisKK2lmZXEgKCIkKEVYUE9SVF9EWU5BTUlDX1NZTUJPTFMpIiwgInkiKQorICAgIEFSQ0hfRkxBR1MgKz0gLVdsLC1leHBvcnQtZHluYW1pYworZW5kaWYKKworaWZuZXEgKCIkKFNJTVVMQVRJT05fQlVJTEQpIiwgInkiKQorICAgIEVYVFJBX0NGTEFHUyAgICArPSAtV2ZyYW1lLWxhcmdlci10aGFuPTE2Mzg0CitlbmRpZgorCitMSUJTX01BUktFUiA9LWwKK0xJQlNfUEFUSF9NQVJLRVIgPS1MCitMSUJTX1NUQVJUX01BUktFUiA9IC1XbCwtLXN0YXJ0LWdyb3VwCitMSUJTX0VORF9NQVJLRVIgPSAtV2wsLS1lbmQtZ3JvdXAKKworIyBEZWJ1ZyBhbmQgcmVsZWFzZSBvcHRpbWl6YXRpb24gb3B0aW9ucy4gQ2FuIGJlIG92ZXJ3cml0dGVuIGluIE1ha2VmaWxlLmNvbmZpZy4kKFBMQVRGT1JNKQorREVCVUdfT19DRkxBR1MgICAgICA/PSAtZyAtZ2R3YXJmLTMgLU8wCitERUJVR19PX0xGTEFHUyAgICAgID89IC1nCitSRUxFQVNFX09fQ0ZMQUdTICAgID89IC1nIC1nZHdhcmYtMyAtTzAKK1JFTEVBU0VfT19MRkxBR1MgICAgPz0gLWcKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL21rL2xpbnQuc2ggYi9iYWxfcmVsZWFzZS9tay9saW50LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliODk0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9tay9saW50LnNoCkBAIC0wLDAgKzEsNTkgQEAKKyMhL2Jpbi9iYXNoCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKyMgICAKKyMgICAgIEJyb2FkY29tIEx0ZC4gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbSBMdGQuCisjICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisjICAgCisjICBUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIEx0ZC4gYW5kL29yIGl0cworIyAgbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKKyMgIHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCisjICBiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gTHRkLiAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorIyAgYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBMdGQuIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAorIyAgdG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tIEx0ZC4KKyMgIGV4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKKyMgIHByb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCisjICBOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorIyAgQlJPQURDT00gTFREIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKyMgICAKKyMgIEV4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisjICAgCisjICAxLiBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorIyAgICAgIGNvbnN0aXR1dGVzIHRoZSB2YWx1YWJsZSB0cmFkZSBzZWNyZXRzIG9mIEJyb2FkY29tIEx0ZC4sIGFuZCB5b3Ugc2hhbGwgdXNlCisjICAgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisjICAgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20gTHRkLgorIyAgICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKyMgICAKKyMgIDIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorIyAgICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyMgICAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyMgICAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorIyAgICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorIyAgICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisjICAgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyMgICAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisjICAgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorIyAgIAorIyAgMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisjICAgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorIyAgICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorIyAgICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisjICAgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworIyAgICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyMgICAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisjICAgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorIyAgICAgIExJTUlURUQgUkVNRURZLgorIyAgOj4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0xJTlQ9L3Byb2plY3RzL3hwb25fY29fbGludC9iaW4vZmxpbnQKK2lmIFsgLWUgJExJTlQgXTsgdGhlbiAKK2lmIFsgLXcgIiR7QDogLTF9IiBdOyB0aGVuIAorCSRMSU5UICQqCitlbHNlCisJZWNobyAiU2tpcHBpbmcgbm9uLXdyaXRhYmxlIGZpbGUgJHtAOiAtMX0iCitmaQorZWxzZQorCWVjaG8gIkVSUk9SOiBsaW50IGV4ZWN1dGFibGUgJExJTlQgZG9lc24ndCBleGlzdCIKK2ZpCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9tay9zcmNfcmVsZWFzZS5zaCBiL2JhbF9yZWxlYXNlL21rL3NyY19yZWxlYXNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkYjczZDgKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9tay9zcmNfcmVsZWFzZS5zaApAQCAtMCwwICsxLDI5NiBAQAorIyEvYmluL2Jhc2gKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpwcm9wcmlldGFyeTpzdGFuZGFyZAorIworIyAgICAgQnJvYWRjb20gTHRkLiBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tIEx0ZC4KKyMgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMKKyMgIFRoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gTHRkLiBhbmQvb3IgaXRzCisjICBsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAorIyAgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKKyMgIGJldHdlZW4geW91IGFuZCBCcm9hZGNvbSBMdGQuIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCisjICBhbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIEx0ZC4gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0CisjICB0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20gTHRkLgorIyAgZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorIyAgcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKKyMgIE5PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCisjICBCUk9BRENPTSBMVEQgQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIworIyAgRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyMKKyMgIDEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisjICAgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20gTHRkLiwgYW5kIHlvdSBzaGFsbCB1c2UKKyMgICAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyMgICAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbSBMdGQuCisjICAgICAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorIworIyAgMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisjICAgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorIyAgICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorIyAgICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisjICAgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisjICAgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyMgICAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorIyAgICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyMgICAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisjCisjICAzLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyMgICAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisjICAgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisjICAgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyMgICAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisjICAgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorIyAgICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyMgICAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisjICAgICAgTElNSVRFRCBSRU1FRFkuCisjICA6PgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRoaXMgc2NyaXB0IGlzIGNhbGxlZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlLgorIyBQcmVyZXF1aXNpdGVzOgorIyAxLiBCQUwgc3RhbmRhbG9uZSBvciBvZnBhbF9vZl9hZ2VudCBiaW5hcmllcyBhcmUgYnVpbHQuCisjIDIuIEVudmlyb25tZW50IHZhcmlhYmxlcyBkZWZpbmVkOgorIyAgICAtIFNSQ19SRUxFQVNFX0ZJTEVfUFJFRklYIDogc291cmNlIHJlbGVhc2UgZmlsZSBwcmVmaXggKHN0cmluZykKKyMgICAgLSBJTkNMVURFX01BUExFX1NES19SRUxFQVNFIDogaW5jbHVkZSBtYXBsZSBTREsgcmVsZWFzZSAoaWYgc2V0LCB0aGVuIE1hcGxlIFNESyByZWxlYXNlIGlzIGluY2x1ZGVkLCBhbmQgaXRzIHppcCBhY3R1YWxseSBjb250YWlucyBCQUwncyBjb2RlLCB3aXRob3V0IE9NQ0kgYW5kIFNETi1QQUwpLgorCitpZiBbWyAiJFNSQ19SRUxFQVNFX0ZJTEVfUFJFRklYIiA9PSAiIiBdXTsgdGhlbgorICAgZWNobyBTUkNfUkVMRUFTRV9GSUxFX1BSRUZJWCB2YXJpYWJsZSBtdXN0IGJlIHNldAorICAgZXhpdCAtMQorZmkKKworVE1QX0RJUj0vdG1wL2JhbF9zcmNfcmVsZWFzZS9gZGF0ZSArJWRfJW1fJVlfJUhfJU1fJVNgCisKK0JBTF9SRUxFQVNFX1BSRUZJWD1iYWwuJFNSQ19SRUxFQVNFX0ZJTEVfUFJFRklYCitTRE5fUEFMX1JFTEVBU0VfUFJFRklYPXNkbl9wYWwuJFNSQ19SRUxFQVNFX0ZJTEVfUFJFRklYCitPTUNJX1JFTEVBU0VfUFJFRklYPW9tY2kuJFNSQ19SRUxFQVNFX0ZJTEVfUFJFRklYCisKK0JBTF9SRUxFQVNFX0RJUj0kVE1QX0RJUi9iYWwvJFNSQ19SRUxFQVNFX0ZJTEVfUFJFRklYCitTRE5fUEFMX1JFTEVBU0VfRElSPSRUTVBfRElSL3Nkbl9wYWwvJFNSQ19SRUxFQVNFX0ZJTEVfUFJFRklYCitPTUNJX1JFTEVBU0VfRElSPSRUTVBfRElSL29tY2kvJFNSQ19SRUxFQVNFX0ZJTEVfUFJFRklYCisKK0JBTF9TUkNfUkVMRUFTRV9GSUxFPSRCQUxfUkVMRUFTRV9QUkVGSVgudGFyLmd6CitTRE5fUEFMX1NSQ19SRUxFQVNFX0ZJTEU9JFNETl9QQUxfUkVMRUFTRV9QUkVGSVgudGFyLmd6CitPTUNJX1NSQ19SRUxFQVNFX0ZJTEU9JE9NQ0lfUkVMRUFTRV9QUkVGSVgudGFyLmd6CisKK0NQPSJjcCAtUiAtLXBhcmVudHMiCisKK2lmIFsgLWQgYnVpbGQvY29yZSBdOyB0aGVuCisgICAgU1VCU1lTVEVNPWNvcmUKK2VsaWYgWyAtZCBidWlsZC9hZ2VudCBdOyB0aGVuCisgICAgU1VCU1lTVEVNPWFnZW50CitlbHNlCisgICBlY2hvIE5laXRoZXIgYnVpbGQvY29yZSBub3IgYnVpbGQvYWdlbnQgc3ViZGlyZWN0b3JpZXMgZXhpc3QKKyAgIGV4aXQgLTEKK2ZpCisKK2lmIFsgISAtZiBidWlsZC8kU1VCU1lTVEVNL3NyYy9jb21tb24vaW5jbHVkZS9iYWxfbW9kZWxfaWRzLmggXTsgdGhlbgorICAgIGVjaG8gR2VuZXJhdGVkIEJBTCBoZWFkZXIgZmlsZXMgYXJlIG1pc3NpbmcuIEJ1aWxkIEJBTCBmaXJzdAorICAgIGV4aXQgLTEKK2ZpCisKK2lmIFsgISAtZiBidWlsZC8kU1VCU1lTVEVNL3NyYy9saWIvbGlib21jaXN2Yy9vbWNpX21vZGVsX2lkcy5oIF07IHRoZW4KKyAgICBlY2hvIEdlbmVyYXRlZCBPTUNJIFNWQyBoZWFkZXIgZmlsZXMgYXJlIG1pc3NpbmcuIEJ1aWxkIE9NQ0kgU1ZDIGZpcnN0CisgICAgZXhpdCAtMQorZmkKKworbWtkaXIgLXAgJEJBTF9SRUxFQVNFX0RJUgorbWtkaXIgLXAgJFNETl9QQUxfUkVMRUFTRV9ESVIKK21rZGlyIC1wICRPTUNJX1JFTEVBU0VfRElSCisKKyMgQ29weSBhdXRvLWdlbmVyYXRlZCBmaWxlcyBmaXJzdCwgYXMgd2Ugd2lsbCBuZWVkIHRvIGRvICJtYWtlIGNsZWFuIiBhZnRlcndhcmRzIChiZWNhdXNlIHNvbWUgM3JkcGFydHkgbGlicmFyaWVzIGhhdmUgYmluYXJpZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcmllcyBhbmQgd2UgbmVlZCB0byBjbGVhbiB0aG9zZSkuCisjIDEuIEJBTAorbWtkaXIgLXAgJEJBTF9SRUxFQVNFX0RJUi9zcmMvY29tbW9uL2luY2x1ZGUKK2NwIFwKKyAgICBidWlsZC8kU1VCU1lTVEVNL3NyYy9jb21tb24vaW5jbHVkZS9iYWxfbW9kZWxfaWRzLmggXAorICAgIGJ1aWxkLyRTVUJTWVNURU0vc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9tb2RlbF90eXBlcy5oIFwKKyAgICAkQkFMX1JFTEVBU0VfRElSL3NyYy9jb21tb24vaW5jbHVkZQorCitta2RpciAtcCAkQkFMX1JFTEVBU0VfRElSL3NyYy9saWIvbGlib2JqbXNnCitjcCAgXAorICAgIGJ1aWxkLyRTVUJTWVNURU0vc3JjL2xpYi9saWJvYmptc2cvYmFsX21vZGVsX2Z1bmNzLmMgXAorICAgIGJ1aWxkLyRTVUJTWVNURU0vc3JjL2xpYi9saWJvYmptc2cvYmFsX29ial9tc2dfcGFja191bnBhY2suYyBcCisgICAgYnVpbGQvJFNVQlNZU1RFTS9zcmMvbGliL2xpYm9iam1zZy9iYWxfbW9kZWxfZnVuY3MuaCBcCisgICAgYnVpbGQvJFNVQlNZU1RFTS9zcmMvbGliL2xpYm9iam1zZy9iYWxfb2JqX21zZ19wYWNrX3VucGFjay5oIFwKKyAgICAkQkFMX1JFTEVBU0VfRElSL3NyYy9saWIvbGlib2JqbXNnCisKK21rZGlyIC1wICRCQUxfUkVMRUFTRV9ESVIvc3JjL2xpYi9saWJiYWxhcGljbGkKK2NwIFwKKyAgICBidWlsZC8kU1VCU1lTVEVNL3NyYy9saWIvbGliYmFsYXBpY2xpL2JhbF9hcGlfY2xpX2hlbHBlcnMuaCBcCisgICAgYnVpbGQvJFNVQlNZU1RFTS9zcmMvbGliL2xpYmJhbGFwaWNsaS9iYWxfYXBpX2NsaV9oZWxwZXJzLmMgXAorICAgIGJ1aWxkLyRTVUJTWVNURU0vc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGlfaGFuZGxlcnMuYyBcCisgICAgJEJBTF9SRUxFQVNFX0RJUi9zcmMvbGliL2xpYmJhbGFwaWNsaQorCisjIDIuIE9NQ0kKKyMgQ29weSBhdXRvLWdlbmVyYXRlZCBmaWxlcyB0byB0aGUgc291cmNlcyBkaXJlY3RvcnkKK21rZGlyIC1wICRPTUNJX1JFTEVBU0VfRElSL3NyYy9saWIvbGlib21jaXN2YworY3AgXAorICAgIGJ1aWxkLyRTVUJTWVNURU0vc3JjL2xpYi9saWJvbWNpc3ZjL29tY2lfbW9kZWxfaWRzLmggXAorICAgIGJ1aWxkLyRTVUJTWVNURU0vc3JjL2xpYi9saWJvbWNpc3ZjL29tY2lfbW9kZWxfdHlwZXMuaCBcCisgICAgYnVpbGQvJFNVQlNZU1RFTS9zcmMvbGliL2xpYm9tY2lzdmMvb21jaV9tb2RlbF9mdW5jcy5oIFwKKyAgICBidWlsZC8kU1VCU1lTVEVNL3NyYy9saWIvbGlib21jaXN2Yy9vbWNpX21vZGVsX2Z1bmNzLmMgXAorICAgIGJ1aWxkLyRTVUJTWVNURU0vc3JjL2xpYi9saWJvbWNpc3ZjL29tY2lfY2xpX2hhbmRsZXJzLmMgXAorICAgIGJ1aWxkLyRTVUJTWVNURU0vc3JjL2xpYi9saWJvbWNpc3ZjL29tY2lfY2xpX2hlbHBlcnMuaCBcCisgICAgYnVpbGQvJFNVQlNZU1RFTS9zcmMvbGliL2xpYm9tY2lzdmMvb21jaV9jbGlfaGVscGVycy5jIFwKKyAgICAkT01DSV9SRUxFQVNFX0RJUi9zcmMvbGliL2xpYm9tY2lzdmMKKworIyBDbGVhbgorbWFrZSBjbGVhbgorbWFrZSBjbGVhbiBCVUlMRF9OQ19BR0VOVD15CisKKyMgTm93IHJlY3JlYXRlIHRoZSBzdWJzeXN0ZW0gZGlyZWN0b3J5ICh3aXBlZCBvdXQgYnkgdGhlIG1ha2UgY2xlYW4pLCBiZWNhdXNlIHRoZSBhcmNoaXZlIGFydGlmYWN0cyBmcm9tIHRoZSBidWlsZCB3aWxsIGdvIHRoZXJlCitta2RpciAtcCBidWlsZC8kU1VCU1lTVEVNCisKKyMgTm93IG1haW4gY29weQorCisjIDEuIEJBTAorCisjIENvcHkgb25seSByZWxldmFudCBzb3VyY2VzLgorZm9yIGZpbGUgaW4gYGZpbmQgbWsgLW1heGRlcHRoIDEgLXR5cGUgZmA7IGRvIGNwIC1MIC0tcGFyZW50cyAkZmlsZSAkQkFMX1JFTEVBU0VfRElSOyBkb25lCiskQ1AgM3JkcGFydHkvYmNtLXNkay9tYWtlICRCQUxfUkVMRUFTRV9ESVIvCiskQ1AgM3JkcGFydHkvYmNtLXNkay9NYWtlZmlsZSAkQkFMX1JFTEVBU0VfRElSLworJENQIDNyZHBhcnR5L2JjbS1zZGsvTWFrZWZpbGUuc2RrICRCQUxfUkVMRUFTRV9ESVIvCiskQ1AgM3JkcGFydHkvYmNtLXNkay9tYWtlX2luZ19kaXIuc2ggJEJBTF9SRUxFQVNFX0RJUi8KKyRDUCAzcmRwYXJ0eS9iY20tc2RrL3JjICRCQUxfUkVMRUFTRV9ESVIvCiskQ1AgM3JkcGFydHkvYmNtLXNkay8qLnBhdGNoICRCQUxfUkVMRUFTRV9ESVIvCiskQ1AgM3JkcGFydHkvYmNtLXNkay9zaCAkQkFMX1JFTEVBU0VfRElSLworJENQIDNyZHBhcnR5L2xpbmVub2lzZSAkQkFMX1JFTEVBU0VfRElSLworJENQIDNyZHBhcnR5L21hcGxlL01ha2VmaWxlICRCQUxfUkVMRUFTRV9ESVIvCiskQ1AgYnJhbmNoLmluZm8gJEJBTF9SRUxFQVNFX0RJUi8KK2NobW9kICt3ICRCQUxfUkVMRUFTRV9ESVIvYnJhbmNoLmluZm8KK2VjaG8gUEVSRk9SQ0VfUkVWSVNJT049JEJVSUxEX1BFUkZPUkNFX1JFVklTSU9OID4+ICRCQUxfUkVMRUFTRV9ESVIvYnJhbmNoLmluZm8KKyRDUCBDT1BZUklHSFQgJEJBTF9SRUxFQVNFX0RJUi8KKyRDUCBkb3h5Z2VuICRCQUxfUkVMRUFTRV9ESVIvCiskQ1AgTWFrZWZpbGUgJEJBTF9SRUxFQVNFX0RJUi8KKyRDUCBSRUFETUUqICRCQUxfUkVMRUFTRV9ESVIvCiskQ1AgbWsvYm9hcmRzICRCQUxfUkVMRUFTRV9ESVIvCiskQ1AgbWsvY29yZS9NYWtlZmlsZSogJEJBTF9SRUxFQVNFX0RJUi8KKyRDUCBtay9jb3JlL21vZHVsZXMuY29yZS5iYWwgJEJBTF9SRUxFQVNFX0RJUi8KKyRDUCBtay9hZ2VudC9tb2R1bGVzLmFnZW50LmJhbCAkQkFMX1JFTEVBU0VfRElSLworJENQIHNjcmlwdHMgJEJBTF9SRUxFQVNFX0RJUi8KKyRDUCBzcmMvY29tbW9uICRCQUxfUkVMRUFTRV9ESVIvCiskQ1Agc3JjL2NvcmUgJEJBTF9SRUxFQVNFX0RJUi8KKyRDUCBzcmMvYXBwcy9iYWxfY2xpICRCQUxfUkVMRUFTRV9ESVIvCiskQ1Agc3JjL2RhdGFtb2RlbC9iYWwub2Jqc2V0ICRCQUxfUkVMRUFTRV9ESVIvCiskQ1Agc3JjL2xpYi9jb21tb24gJEJBTF9SRUxFQVNFX0RJUi8KKyRDUCBzcmMvbGliL2xpYmJhbGFwaSAkQkFMX1JFTEVBU0VfRElSLworJENQIHNyYy9saWIvbGliYmFsYXBpY2xpICRCQUxfUkVMRUFTRV9ESVIvCiskQ1Agc3JjL2xpYi9saWJvYmptc2cgJEJBTF9SRUxFQVNFX0RJUi8KKyRDUCBzcmMvbGliL2xpYnJzY21nciAkQkFMX1JFTEVBU0VfRElSLworJENQIHNyYy9saWIvbGlidG9wb2xvZ3kgJEJBTF9SRUxFQVNFX0RJUi8KKyRDUCBzcmMvbGliL2xpYnV0aWxzICRCQUxfUkVMRUFTRV9ESVIvCiskQ1Agc3JjL2xpYi9saWJjbWRsaW5lICRCQUxfUkVMRUFTRV9ESVIvCiskQ1AgdG9vbHMgJEJBTF9SRUxFQVNFX0RJUi8KKworIyBUaGUgZm9sbG93aW5nIGZpbGUgd2lsbCBpbmRpY2F0ZSBhIHJlbGVhc2UgYnVpbGQKK3RvdWNoICRCQUxfUkVMRUFTRV9ESVIvLnJlbGVhc2VfYnVpbGQKKworIyBBZGQgd3JpdGUgcGVybWlzc2lvbiB0byBhbGwgdGhlIGNvcGllZCBmaWxlcworZmluZCAkQkFMX1JFTEVBU0VfRElSIC10eXBlIGYgfCB4YXJncyAtZCAnXG4nIGNobW9kICt3CisKKyMgUmVtb3ZlIGNvZGVnZW5fdGVtcGxhdGVzIGFuZCAuY2NhY2hlCitmaW5kICRCQUxfUkVMRUFTRV9ESVIgLW5hbWUgY29kZWdlbl90ZW1wbGF0ZXMgfCB4YXJncyBybSAtcmYKK2ZpbmQgJEJBTF9SRUxFQVNFX0RJUiAtbmFtZSAuY2NhY2hlIHwgeGFyZ3Mgcm0gLXJmCisKK2NkICRCQUxfUkVMRUFTRV9ESVIvLi4KK3RhciAtY3pmICRCQUxfU1JDX1JFTEVBU0VfRklMRSAkU1JDX1JFTEVBU0VfRklMRV9QUkVGSVgKK2NkIC0gPiAvZGV2L251bGwKK212ICRUTVBfRElSL2JhbC8kQkFMX1NSQ19SRUxFQVNFX0ZJTEUgLgorZWNobyAuLyRCQUxfU1JDX1JFTEVBU0VfRklMRSBjcmVhdGVkCisKKyMgMi4gU0ROLVBBTAorCisjIENvcHkgb25seSByZWxldmFudCBzb3VyY2VzLgorZm9yIGZpbGUgaW4gYGZpbmQgbWsgLW1heGRlcHRoIDEgLXR5cGUgZmA7IGRvIGNwIC0tcGFyZW50cyAkZmlsZSAkU0ROX1BBTF9SRUxFQVNFX0RJUjsgZG9uZQorJENQIDNyZHBhcnR5L2xvY2kgJFNETl9QQUxfUkVMRUFTRV9ESVIvCiskQ1AgM3JkcGFydHkvbGlieG1sMiAkU0ROX1BBTF9SRUxFQVNFX0RJUi8KKyRDUCAzcmRwYXJ0eS9saWJ4c2x0ICRTRE5fUEFMX1JFTEVBU0VfRElSLworJENQIDNyZHBhcnR5L2xpYmdwZy1lcnJvciAkU0ROX1BBTF9SRUxFQVNFX0RJUi8KKyRDUCAzcmRwYXJ0eS9saWJnY3J5cHQgJFNETl9QQUxfUkVMRUFTRV9ESVIvCiskQ1AgM3JkcGFydHkvbGlic3NoICRTRE5fUEFMX1JFTEVBU0VfRElSLworJENQIDNyZHBhcnR5L2xpYmN1cmwgJFNETl9QQUxfUkVMRUFTRV9ESVIvCiskQ1AgM3JkcGFydHkvbGlibmV0Y29uZiAkU0ROX1BBTF9SRUxFQVNFX0RJUi8KKyRDUCAzcmRwYXJ0eS9pbmRpZ28gJFNETl9QQUxfUkVMRUFTRV9ESVIvCiskQ1AgM3JkcGFydHkvb3Blbnl1bWEgJFNETl9QQUxfUkVMRUFTRV9ESVIvCiskQ1AgM3JkcGFydHkveWFuZy9CQkYgJFNETl9QQUxfUkVMRUFTRV9ESVIvCiskQ1AgM3JkcGFydHkveWFuZy9JQU5BICRTRE5fUEFMX1JFTEVBU0VfRElSLworJENQIDNyZHBhcnR5L3lhbmcvSUVURiAkU0ROX1BBTF9SRUxFQVNFX0RJUi8KKyRDUCAzcmRwYXJ0eS9weWFuZyAkU0ROX1BBTF9SRUxFQVNFX0RJUi8KKyRDUCAzcmRwYXJ0eS9uZXRvcGVlciAkU0ROX1BBTF9SRUxFQVNFX0RJUi8KKyRDUCBtay9hZ2VudC9NYWtlZmlsZSogJFNETl9QQUxfUkVMRUFTRV9ESVIvCiskQ1AgbWsvYWdlbnQvbW9kdWxlcy5hZ2VudC5zZG5fcGFsICRTRE5fUEFMX1JFTEVBU0VfRElSLworJENQIHNyYy9hZ2VudCAkU0ROX1BBTF9SRUxFQVNFX0RJUi8KKyRDUCBzcmMvbmV0Y29uZiAkU0ROX1BBTF9SRUxFQVNFX0RJUi8KKyRDUCBzcmMvb2ZwYWwgJFNETl9QQUxfUkVMRUFTRV9ESVIvCisKKyMgQWRkIHdyaXRlIHBlcm1pc3Npb24gdG8gYWxsIHRoZSBjb3BpZWQgZmlsZXMKK2ZpbmQgJFNETl9QQUxfUkVMRUFTRV9ESVIgLXR5cGUgZiB8IHhhcmdzIC1kICdcbicgY2htb2QgK3cKKworIyBSZW1vdmUgLmNjYWNoZQorZmluZCAkU0ROX1BBTF9SRUxFQVNFX0RJUiAtbmFtZSAuY2NhY2hlIHwgeGFyZ3Mgcm0gLXJmCisKK2NkICRTRE5fUEFMX1JFTEVBU0VfRElSLy4uCit0YXIgLWN6ZiAkU0ROX1BBTF9TUkNfUkVMRUFTRV9GSUxFICRTUkNfUkVMRUFTRV9GSUxFX1BSRUZJWAorY2QgLSA+IC9kZXYvbnVsbAorbXYgJFRNUF9ESVIvc2RuX3BhbC8kU0ROX1BBTF9TUkNfUkVMRUFTRV9GSUxFIC4KK2VjaG8gLi8kU0ROX1BBTF9TUkNfUkVMRUFTRV9GSUxFIGNyZWF0ZWQKKworIyAzLiBPTUNJCisKKyMgQ29weSBvbmx5IHJlbGV2YW50IHNvdXJjZXMuCiskQ1AgbWsvY29yZS9tb2R1bGVzLmNvcmUub21jaSAkT01DSV9SRUxFQVNFX0RJUi8KKyRDUCBtay9hZ2VudC9tb2R1bGVzLmFnZW50Lm9tY2kgJE9NQ0lfUkVMRUFTRV9ESVIvCiskQ1Agc3JjL2RhdGFtb2RlbC9vbWNpKiAkT01DSV9SRUxFQVNFX0RJUi8KKyRDUCBzcmMvbGliL2xpYm9tY2lzdGFjayAkT01DSV9SRUxFQVNFX0RJUi8KKyRDUCBzcmMvbGliL2xpYm9tY2lzdmMgJE9NQ0lfUkVMRUFTRV9ESVIvCisKKyMgUmVtb3ZlIE9DUyBPTUNJIHN0YWNrIGZyb20gbW9kdWxlcy4qLm9tY2kKK3NlZCAtaSAnLzNyZHBhcnR5XC9vY3Nfb21jaS9kJyAkT01DSV9SRUxFQVNFX0RJUi9tay9jb3JlL21vZHVsZXMuY29yZS5vbWNpCitzZWQgLWkgJy8zcmRwYXJ0eVwvb2NzX29tY2kvZCcgJE9NQ0lfUkVMRUFTRV9ESVIvbWsvYWdlbnQvbW9kdWxlcy5hZ2VudC5vbWNpCisKKyMgQWRkIHdyaXRlIHBlcm1pc3Npb24gdG8gYWxsIHRoZSBjb3BpZWQgZmlsZXMKK2ZpbmQgJE9NQ0lfUkVMRUFTRV9ESVIgLXR5cGUgZiB8IHhhcmdzIC1kICdcbicgY2htb2QgK3cKKworIyBSZW1vdmUgY29kZWdlbl90ZW1wbGF0ZXMgYW5kIC5jY2FjaGUKK2ZpbmQgJE9NQ0lfUkVMRUFTRV9ESVIgLW5hbWUgY29kZWdlbl90ZW1wbGF0ZXMgfCB4YXJncyBybSAtcmYKK2ZpbmQgJE9NQ0lfUkVMRUFTRV9ESVIgLW5hbWUgLmNjYWNoZSB8IHhhcmdzIHJtIC1yZgorCisjIEFkZCBhIGZsYWcgdG8gT01DSSBTVkMncyBNYWtlZmlsZSwgc28gdGhhdCB3aGVuIE9NQ0kgcGFja2FnZSBpcyBleHRyYWN0ZWQsIGJ1aWxkcyB3aWxsIGluY2x1ZGUgcmVhbCBPTUNJIFNWQywgbm90IHN0dWJzLgorZWNobyAiVVNFX0JDTV9PTUNJX1NWQ19JTl9SRUxFQVNFPXkiID4+ICRPTUNJX1JFTEVBU0VfRElSL3NyYy9saWIvbGlib21jaXN2Yy9NYWtlZmlsZS5jb25maWcub21jaQorCitjZCAkT01DSV9SRUxFQVNFX0RJUi8uLgordGFyIC1jemYgJE9NQ0lfU1JDX1JFTEVBU0VfRklMRSAkU1JDX1JFTEVBU0VfRklMRV9QUkVGSVgKK2NkIC0gPiAvZGV2L251bGwKK212ICRUTVBfRElSL29tY2kvJE9NQ0lfU1JDX1JFTEVBU0VfRklMRSAuCitlY2hvIC4vJE9NQ0lfU1JDX1JFTEVBU0VfRklMRSBjcmVhdGVkCisKKyMgSWYgSU5DTFVERV9NQVBMRV9TREtfUkVMRUFTRSBpcyBkZWZpbmVkLCB0aGVuIHdlIGNyZWF0ZSBhIG1hcGxlIHJlbGVhc2UgdGhhdCB3aWxsIHdyYXAgdGhlIEJBTCByZWxlYXNlLgoraWYgW1sgIiRJTkNMVURFX01BUExFX1NES19SRUxFQVNFIiAhPSAiIiBdXTsgdGhlbgorICAgIE9MRF9ESVI9YHB3ZGAKKyAgICBCQUxfTUFQTEVfUkVMRUFTRV9ESVI9JFRNUF9ESVIvYmFsX21hcGxlX3JlbGVhc2UKKyAgICAuLzNyZHBhcnR5L21hcGxlL2N1ci9zY3JpcHRzL3JlbF9kZWxpdmVyeS5zaCAkTUFQTEVfUkVMX0RFTElWRVJZX1BSRUZJWAorICAgIEJDTTY4NjIwX1pJUF9GSUxFPWBscyAuLzNyZHBhcnR5L21hcGxlL2N1ci9TVy1CQ002ODYyMCouemlwYAorICAgIG1rZGlyIC1wICRCQUxfTUFQTEVfUkVMRUFTRV9ESVIvYmNtNjg2MjBfcmVsZWFzZQorICAgIHVuemlwICRCQ002ODYyMF9aSVBfRklMRSAtZCAkQkFMX01BUExFX1JFTEVBU0VfRElSL2JjbTY4NjIwX3JlbGVhc2UKKyAgICAKKyAgICBjZCAkQkFMX01BUExFX1JFTEVBU0VfRElSCisgICAgbG4gLXMgYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2RvY3MgZG9jcworCisgICAgbWtkaXIgLXAgYmFsX3JlbGVhc2UKKyAgICBjZCAkQkFMX1JFTEVBU0VfRElSCisgICAgJENQIC4gJEJBTF9NQVBMRV9SRUxFQVNFX0RJUi9iYWxfcmVsZWFzZS8KKyAgICBjZCAkQkFMX01BUExFX1JFTEVBU0VfRElSL2JhbF9yZWxlYXNlLzNyZHBhcnR5L21hcGxlCisgICAgbG4gLXMgLi4vLi4vLi4vYmNtNjg2MjBfcmVsZWFzZSBjdXIKKworICAgIGNkICRCQUxfTUFQTEVfUkVMRUFTRV9ESVIKKyAgICB6aXAgLXkgLXIgYGJhc2VuYW1lICRCQ002ODYyMF9aSVBfRklMRWAgLi8qCisgICAgY2QgJE9MRF9ESVIKKyAgICBtdiAkQkFMX01BUExFX1JFTEVBU0VfRElSL2BiYXNlbmFtZSAkQkNNNjg2MjBfWklQX0ZJTEVgIC4KKyAgICBlY2hvIGBiYXNlbmFtZSAuLyRCQ002ODYyMF9aSVBfRklMRWAgY3JlYXRlZAorZmkKKworZWNobyBJbnN0cnVjdGlvbnMgb2YgaG93IHRvIGV4dHJhY3QgYW5kIGNvbXBpbGUgc291cmNlIHJlbGVhc2UgcGFja2FnZXMgZXhpc3QgaW4gYGxzIFJFQURNRSpgIGZpbGVzCisKK3JtIC1yZiAkVE1QX0RJUgorCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zY3JpcHRzL2JhbF9hdXRvc3RhcnQuaW5pIGIvYmFsX3JlbGVhc2Uvc2NyaXB0cy9iYWxfYXV0b3N0YXJ0LmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjllYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc2NyaXB0cy9iYWxfYXV0b3N0YXJ0LmluaQpAQCAtMCwwICsxLDExNyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgVGhpcyBpcyBhIHNhbXBsZSBiYWxfYXV0b3N0YXJ0LmluaSBmaWxlLiAgSWYgdXNlZCwgaXQgbXVzdCByZXNpZGUgaW4gCisjIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgYmNtX3Nkbl9hZ2VudCBleGVjdXRhYmxlLiAgCisjCisjIEV4YW1wbGVzIGZvciBFUE9OICxHUE9OLCBYR1BPTjEsIGFuZCBYR1NQT04gc3lzdGVtcyBhcmUgZ2l2ZW4gYmVsb3cuICBZb3UgY2Fubm90IG1peAorIyBFUE9OIC8gR1BPTiAvIFhHUE9OMSAvIFhHU1BPTiBlbnRyaWVzIGluIHRoaXMgZmlsZS4gIFN5c3RlbXMgYXJlIGFzc3VtZWQgdG8gYmUgZWl0aGVyCisjIEVQT04gb3IgR1BPTiBvciBYR1BPTjEgb3IgWEdTUE9OIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBlbnRyeSBmb3IgdG9wb2xvZ3kucG9uX21vZGUgaW4KKyMgdGhlIGJhbF9jb25maWcuaW5pIGZpbGUpLiAgTkdQT04yIHN5c3RlbXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGF1dG9zdGFydCBmZWF0dXJlCisjIG9yIEJBTCBjb2RlIGF0IHRoaXMgdGltZS4KKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFRoaXMgaXMgYSBzYW1wbGUgYXV0b3N0YXJ0IHNjcmlwdCBmb3IgYSBNQVBMRSBFUE9OIHN5c3RlbSwgCisjIHdoZXJlIE9OVXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgTUFDIGFkZHJlc3MKKyMKKyMgTk9URTogVGhpcyBzY3JpcHQgaXMgb25seSB1c2VhYmxlIG9uIGFuIFNETiB2ZXJzaW9uCisjIG9mIEJBTCwgdGhhdCBpcywgd2l0aCB0aGUgYmNtX3Nkbl9hZ2VudC4gIAorIworIyBPbiBzdGFydHVwLCB0aGUgYmNtX3Nkbl9hZ2VudCBjb2RlIHJlYWRzIHRoaXMgYXV0b3N0YXJ0IGZpbGUsCisjIHRoZW46CisjIC0gYnJpbmdzIHVwIHRoZSBhY2Nlc3MtdGVybWluYWwKKyMgLSBicmluZ3MgdXAgZWFjaCBpbnRlcmZhY2Ugc3BlY2lmaWVkIGluIHRoZSBlbnRyeSBsaXN0CisjIC0gYnJpbmdzIHVwIGEgc3Vic2NyaWJlci10ZXJtaW5hbCBmb3IgZWFjaCBPTlUgZW50cnkKKyMKKyMgT05VIElEcyBjYW4gb3ZlcmxhcCBvbiBkaWZmZXJlbnQgUE9OIGludGVyZmFjZXMKKyMKKyMgRW50cnkgZm9ybWF0IGZvciBhbiBFUE9OIHN5c3RlbSBpczoKKyMgb251PU9OVSBJRCwgaW50PVBPTiBJTlRFUkZBQ0UgSUQsIG1hYz1NQUMgQUREUkVTUyBPRiBUSEUgT05VCisjIGUuZy4KKyMgb251PTMsIGludD0yLCBtYWM9MDA6MzM6MjM6MzM6MzM6OTgKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIAorIyBVbmNvbW1lbnQtb3V0IGVudHJpZXMgYmVsb3cgYW5kIG1vZGlmeSB0aGVtIGZvciB5b3VyIEVQT04gc3lzdGVtCisjCisjb251PTEsIGludD0wLCBtYWM9MDA6MTA6MTg6YWQ6Njk6ZDAKKyNvbnU9NiwgaW50PTAsIG1hYz0wMDoxMDoxODphZDo2MzozOAorI29udT0zLCBpbnQ9MiwgbWFjPTAwOjEwOjE4OmFkOjY2Ojc0Cisjb251PTEyLCBpbnQ9MCwgbWFjPTAwOjEwOjE4OmFkOjI5OjMyCisjb251PTMsIGludD0xLCBtYWM9MDA6MTA6MTg6YWQ6NTk6MjIKKyNvbnU9MywgaW50PTAsIG1hYz0wMDoxMDoxODphZDo2ODo0NAorCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgVGhpcyBpcyBhIHNhbXBsZSBhdXRvc3RhcnQgc2NyaXB0IGZvciBhIE1BUExFIEdQT04gc3lzdGVtLCAKKyMgd2hlcmUgT05VcyBhcmUgaWRlbnRpZmllZCBieSB0aGVpciBwYXNzd29yZCBhbmQgc2VyaWFsIG51bWJlcgorIworIyBOT1RFOiBUaGlzIHNjcmlwdCBpcyBvbmx5IHVzZWFibGUgb24gYW4gU0ROIHZlcnNpb24KKyMgb2YgQkFMLCB0aGF0IGlzLCB3aXRoIHRoZSBiY21fc2RuX2FnZW50ICAKKyMKKyMgT24gc3RhcnR1cCwgdGhlIGJjbV9zZG5fYWdlbnQgY29kZSByZWFkcyB0aGlzIGF1dG9zdGFydCBmaWxlLAorIyB0aGVuOgorIyAtIGJyaW5ncyB1cCB0aGUgYWNjZXNzLXRlcm1pbmFsCisjIC0gYnJpbmdzIHVwIGVhY2ggaW50ZXJmYWNlIHNwZWNpZmllZCBpbiB0aGUgZW50cnkgbGlzdAorIyAtIGJyaW5ncyB1cCBhIHN1YnNjcmliZXItdGVybWluYWwgZm9yIGVhY2ggT05VIGVudHJ5CisjCisjIE9OVSBJRHMgY2FuIG92ZXJsYXAgb24gZGlmZmVyZW50IFBPTiBpbnRlcmZhY2VzCisjCisjIEVudHJ5IGZvcm1hdCBmb3IgYW4gR1BPTiBzeXN0ZW0gaXM6CisjIG9udT1PTlUgSUQsIGludD1QT04gSU5URVJGQUNFIElELCB2ZW5kPVZFTkRPUiBJRCwgcGFzcz1QQVNTV09SRAorIyBlLmcuCisjIG9udT0zLCBpbnQ9MiwgdmVuZD1WRU5ET1IgSUQgRlJPTSBPTlUgTEFCRUwsIHBhc3M9T05VIFBBU1NXT1JECisjCisjIE5PVEU6IElmIGJjbV9zZG5fYWdlbnQgaXMgc3RhcnRlZCBpbiBhdXRvbm91bW91cyBPTlUgYWN0aXZhdGlvbiBtb2RlICgtTyBvciAtLWF1dG9fYWN0aXZhdGUgY29tbWFuZCBsaW5lIG9wdGlvbiksCisjIHZlbmQgYW5kIHBhc3MgcGFyYW1ldGVycyBzaG91bGQgYmUgc2V0IGFzIDAuIEluIHRoaXMgY2FzZSwgdGhlIHN5c3RlbSBkb2VzIG5vdCBicmluZyB0aGUKKyMgc3Vic2NyaWJlciB0ZXJtaW5hbCB1cC4gVGhlIHN1YnNjcmliZXIgdGVybWluYWwgd2lsbCBiZSBhY3RpdmF0ZWQgYXV0b21hdGljYWxseSB3aGVuIGRpc2NvdmVyZWQuIAorIyBOb3RlIHRoYXQgT05VIGVudHJpZXMgd2l0aCB3aXRoIHZlbmQgJiBwYXNzIGVxdWFsIGFuZCBub3QtZXF1YWwgMCBjYW4gYmUgbWl4ZWQuIEluIHRoaXMgY2FzZSwKKyMgc29tZSBzdWJzY3JpYmVyIHRlcm1pbmFscyB3aWxsIGJlIHByZS1jb25maWd1cmVkLCBiZWZvcmUgdGhleSBhcmUgZGlzY292ZXJlZCAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBVbmNvbW1lbnQtb3V0IGVudHJpZXMgYmVsb3cgYW5kIG1vZGlmeSB0aGVtIGZvciB5b3VyIEdQT04gc3lzdGVtCisjCisjb251PTEsIGludD0wLCB2ZW5kPTQyNTI0MzRkMDE5NDYxMjEsIHBhc3M9MzEzMjMzMzQzNTM2MzczODM5MzAKKyNvbnU9NiwgaW50PTAsIHZlbmQ9NDI1MjQzNGQwMTk0NjEzMiwgcGFzcz0zMTMyMzMzNDM1MzYzNzM4MzkzMAorIworIyBVbmNvbW1lbnQgdGhlIGVudHJ5IGJlbG93IGlmIGJjbV9zZG5fYWdlbnQgaXMgc3RhcnRlZCBpbiBhdXRvbm9tb3VzIE9OVSAKKyMgYWN0aXZhdGlvbiBtb2RlICgtTyBvciAtLWF1dG9fYWN0aXZhdGUpLiBUaGUgZW50cnkgYmVsb3cgd2lsbCBjYXVzZSBQT04gCisjIGludGVyZmFjZSAyIHRvIGJlIGVuYWJsZWQuIE9OVXMgd2lsbCBiZSBhY3RpdmF0ZWQgYXV0b21hdGljYWxseSB3aGVuIGRpc2NvdmVyZWQKKyMKKyNvbnU9MSwgaW50PTIsIHZlbmQ9MDAsIHBhc3M9MDAKKworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUaGlzIGlzIGEgc2FtcGxlIGF1dG9zdGFydCBzY3JpcHQgZm9yIGEgTUFQTEUgWEdQT04xIG9yIFhHU1BPTiBzeXN0ZW0sIAorIyB3aGVyZSBPTlVzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIHBhc3N3b3JkIGFuZCByZWdpc3RyYXRpb24gSUQKKyMKKyMgTk9URTogVGhpcyBzY3JpcHQgaXMgb25seSB1c2VhYmxlIG9uIGFuIFNETiB2ZXJzaW9uCisjIG9mIEJBTCwgdGhhdCBpcywgd2l0aCB0aGUgYmNtX3Nkbl9hZ2VudCAgCisjCisjIE9uIHN0YXJ0dXAsIHRoZSBiY21fc2RuX2FnZW50IGNvZGUgcmVhZHMgdGhpcyBhdXRvc3RhcnQgZmlsZSwKKyMgdGhlbjoKKyMgLSBicmluZ3MgdXAgdGhlIGFjY2Vzcy10ZXJtaW5hbAorIyAtIGJyaW5ncyB1cCBlYWNoIGludGVyZmFjZSBzcGVjaWZpZWQgaW4gdGhlIGVudHJ5IGxpc3QKKyMgLSBicmluZ3MgdXAgYSBzdWJzY3JpYmVyLXRlcm1pbmFsIGZvciBlYWNoIE9OVSBlbnRyeQorIworIyBPTlUgSURzIGNhbiBvdmVybGFwIG9uIGRpZmZlcmVudCBQT04gaW50ZXJmYWNlcworIworIyBFbnRyeSBmb3JtYXQgZm9yIGFuIFhHUE9OMSBvciBYR1NQT04gc3lzdGVtIGlzOgorIyBvbnU9T05VIElELCBpbnQ9UE9OIElOVEVSRkFDRSBJRCwgdmVuZD1WRU5ET1IgSUQsIHJlZ2lzdHJhdGlvbl9pZD1SRUdJU1RSQVRJT05fSUQKKyMgZS5nLgorIyBvbnU9MywgaW50PTIsIHZlbmQ9VkVORE9SIElEIEZST00gT05VIExBQkVMLCByZWdpc3RyYXRpb25faWQ9UkVHSVNUUkFUSU9OX0lECisjIAorIyBBcyBpbiBjYXNlIHdpdGggR1BPTiwgYmNtX3Nkbl9hZ2VudCBjb250cm9sbGluZyBYR1BPTjEgb3IgWEdTUE9OIHN5c3RlbSBjYW4gYmUgc3RhcnRlZCBpbiBhdXRvbm9tb3VzCisjIE9OVSBhY3RpdmF0aW9uIG1vZGUuIEluIHRoaXMgY2FzZSB2ZW5kIGFuZCByZWdpc3RyYXRpb25faWQgc2hvdWxkIGJlIHNldCAwLgorIyBUaGUgT05VIHdpbGwgYmUgYWN0aXZhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBkaXNjb3ZlcmVkIAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFVuY29tbWVudC1vdXQgZW50cmllcyBiZWxvdyBhbmQgbW9kaWZ5IHRoZW0gZm9yIHlvdXIgWEdQT04xIG9yIFhHU1BPTiBzeXN0ZW0KKyMKKyNvbnU9MSwgaW50PTAsIHZlbmQ9NDI1MjQzNGQwMTk0NjEyMSwgcmVnaXN0cmF0aW9uX2lkPTIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMAorI29udT02LCBpbnQ9MCwgdmVuZD00MjUyNDM0ZDAxOTQ2MTMyLCByZWdpc3RyYXRpb25faWQ9MjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwMjAyMDIwCisjCisjIFVuY29tbWVudCB0aGUgZW50cnkgYmVsb3cgaWYgYmNtX3Nkbl9hZ2VudCBpcyBzdGFydGVkIGluIGF1dG9ub21vdXMgT05VIAorIyBhY3RpdmF0aW9uIG1vZGUgKC1PIG9yIC0tYXV0b19hY3RpdmF0ZSkuIFRoZSBlbnRyeSBiZWxvdyB3aWxsIGNhdXNlIFBPTiAKKyMgaW50ZXJmYWNlIDIgdG8gYmUgZW5hYmxlZC4gT05VcyB3aWxsIGJlIGFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gZGlzY292ZXJlZAorIworI29udT0xLCBpbnQ9MiwgdmVuZD0wMCwgcmVnaXN0cmF0aW9uX2lkPTAwCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zY3JpcHRzL2JhbF9jb25maWcuaW5pIGIvYmFsX3JlbGVhc2Uvc2NyaXB0cy9iYWxfY29uZmlnLmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDhhYjIzCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc2NyaXB0cy9iYWxfY29uZmlnLmluaQpAQCAtMCwwICsxLDI0IEBACitpd2ZfbW9kZT1kaXJlY3QKKyMgTWFwcGluZyB0YWJsZSBiZXR3ZWVuIFF1bXJhbiBhbmQgTWFwbGU6IDMtc2VwYXJhdGUgUWFYL01hcGxlIFNWS3MsIDQtU1ZLNAoraW50Zl9tYXB0YWJsZT0zCitudW1fbm5pX3BvcnRzPTEKKyMgVURQIHBvcnQgd2hlcmUgYmNtLnVzZXIgbGlzdGVucyBmb3IgcGt0X3NlbmQgbWVzc2FnZXMgZnJvbSBjb3JlIChuZWVkZWQgZm9yIHJlbW90ZSBiY20udXNlciBvbmx5ISkKK3BrdF9zZW5kX3N2cl9saXN0ZW5fcG9ydD01MDAwMgorIyBVRFAgcG9ydCB3aGVyZSB0aGUgY29yZSBsaXN0ZW5zIGZvciBwa3RfcmN2IG1lc3NhZ2UgZnJvbSBiY20udXNlciAobmVlZGVkIGZvciByZW1vdGUgYmNtLnVzZXIgb25seSEpCit0cmFwX3VkcF9wb3J0PTUwMDAxCisKKyMgVGhlIGZvbGxvd2luZyB0b3BvbG9neSBjb25maWd1cmF0aW9uIChjdXJyZW50bHkgY29tbWVudGVkIG91dCkgaXMgYW4gYWx0ZXJuYXRpdmUgZm9yIGJhbF90b3BvbG9neS5pbmkuCisjIEluIGNhc2UgYm90aCBleGlzdCwgYmFsX3RvcG9sb2d5LmluaSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhpcyBjb25maWd1cmF0aW9uLgordG9wb2xvZ3kubnVtX29mX2RldnM9MQordG9wb2xvZ3kubnVtX29mX3BvbnNfcGVyX2Rldj0yCisjIEFsbG93ZWQgcG9uIG1vZGVzIGFyZTogZ3Bvbnx4Z3Bvbnx4Z3N8bmdwb24yfGVwb25fdGRtYXxlcG9uXzFnfGVwb25fMTBnCit0b3BvbG9neS5wb25fbW9kZT14Z3MKKworI2VuYWJsZSAoeSkgb3IgZGlzYWJsZSAobikgbG9vcGJhY2sgbW9kZSBpbiBNQUMgKGRvZXMgbm90IG5lZWQgYWNjZXNzIHRvIE1hcGxlIEhXIGlmIGVuYWJsZWQpCisjbWFjX2xvb3BiYWNrPXkKKworIyBFbmFibGUgTk5JIGF1dG8tbmVnb3RpYXRpb24gb24gTk5JIHBvcnQgPG4+LgorIyBJdCBpcyBrbm93biB0byB3b3JrIG9uIE5OSTAgd2l0aCBzb21lIDFHIHRyYW5zY2VpdmVycywgaG93ZXZlcgorIyB0aGlzIG1vZGUgd2Fzbid0IHRlc3RlZCBvbiBOTkkgaW50ZXJmYWNlcyBvdGhlciB0aGFuIDAgYW5kL29yIHdpdGggZGlmZmVyZW50IHRyYW5zY2VpdmVycy4KKyMgVXNlIGF0IHlvdXIgb3duIHJpc2sKKyMgYXV0b25lZ19ubmk8bj49eQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc2NyaXB0cy9iYWxfc2V0dXBfc3ZrNC5zaCBiL2JhbF9yZWxlYXNlL3NjcmlwdHMvYmFsX3NldHVwX3N2azQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2ViMWNjMgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NjcmlwdHMvYmFsX3NldHVwX3N2azQuc2gKQEAgLTAsMCArMSwyMyBAQAorIyEvYmluL3NoCisjCisjIFN0YXJ0IGJhbCBkZXZpY2VzCisjCisKK2Nhc2UgIiQxIiBpbgorICAgIHN0YXJ0KQorCWVjaG8gLW4gIlN0YXJ0aW5nIGJhbCBkZXZpY2VzOiAiCisgICAgICAgIC9icm9hZGNvbS9ta19iY21fbm9kZS5zaAorICAgICAgICAvYnJvYWRjb20vc3ZrX2luaXRfc3RhcnR1cC5zaAorCWVjaG8gIk9LIgorCTs7CisgICAgc3RvcCkKKwllY2hvICJPSyIKKwk7OworICAgIHJlc3RhcnR8cmVsb2FkKQorCTs7CisgICAgKikKKwllY2hvICJVc2FnZTogJDAge3N0YXJ0fHN0b3B8cmVzdGFydH0iCisJZXhpdCAxCitlc2FjCisKK2V4aXQgJD8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NjcmlwdHMvYmFsX3RvcG9sb2d5LmluaSBiL2JhbF9yZWxlYXNlL3NjcmlwdHMvYmFsX3RvcG9sb2d5LmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Y5NmVjCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc2NyaXB0cy9iYWxfdG9wb2xvZ3kuaW5pCkBAIC0wLDAgKzEsMTggQEAKKyMgTG9naWNhbCBQT04gSUQsIFBPTiBNb2RlIChncG9ufHhncG9ufGVwb25fMTBnfHhnc3xuZ3BvbjIpLCBQaHlzaWNhbCBEZXZpY2UgSUQsIFBoeXNpY2FsIFBPTiBJRAorIyBDb21tZW50cyBiZWxvdyBjb250YWluIGdwb24gY29uZmlndXJhdGlvbiBleGFtcGxlCisjMCwgZ3BvbiwgMCwgMAorIzEsIGdwb24sIDAsIDEKKyMyLCBncG9uLCAwLCAyCisjMywgZ3BvbiwgMCwgMworIzQsIGdwb24sIDAsIDQKKyM1LCBncG9uLCAwLCA1CisjNiwgZ3BvbiwgMCwgNgorIzcsIGdwb24sIDAsIDcKKyM4LCBncG9uLCAwLCA4CisjOSwgZ3BvbiwgMCwgOQorIzEwLCBncG9uLCAwLCAxMAorIzExLCBncG9uLCAwLCAxMQorIzEyLCBncG9uLCAwLCAxMgorIzEzLCBncG9uLCAwLCAxMworIzE0LCBncG9uLCAwLCAxNAorIzE1LCBncG9uLCAwLCAxNQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc2NyaXB0cy9iY21fdXNlcl9zdGFydF9zdG9wIGIvYmFsX3JlbGVhc2Uvc2NyaXB0cy9iY21fdXNlcl9zdGFydF9zdG9wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBlMzk4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zY3JpcHRzL2JjbV91c2VyX3N0YXJ0X3N0b3AKQEAgLTAsMCArMSw3MiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgU3RhcnQvU3RvcCBCQ00uVVNFUgorIworCisjIAorIyBTZXQgdGhlIGRpcmVjdG9yeSBwYXRoIHRvIGJjbS51c2VyLCBvciAKKyMgYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byBiY20udXNlciBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHdoZW4gY2FsbGluZyB0aGlzIHNjcmlwdCAKKyMgKHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZjogWyBzdGFydCwgc3RvcCBdCisjCitpZiBbIC16ICQyIF07IHRoZW4KKworIyBMb29rIGZvciBiY20udXNlciwgc2V0IHRoZSBzdGFydGluZyBkaXJlY3RvcnkgYXBwcm9wcmlhdGVseSwgb3IKKyMgc2ltcGxlIGV4aXQgaWYgbm90IGZvdW5kCisjCitpZiBbIC1mIC9tbnQvYmNtLnVzZXIgXTsgdGhlbgorQkNNX1VTRVJfQklOX0RJUj0vbW50LworZWxpZiBbIC1mIC9icm9hZGNvbS9iY20udXNlciBdOyB0aGVuCitCQ01fVVNFUl9CSU5fRElSPS9icm9hZGNvbQorZWxpZiBbIC1mIC9vcHQvYmNtNTY0NTAvYmNtLnVzZXIgXTsgdGhlbgorQkNNX1VTRVJfQklOX0RJUj0vb3B0L2JjbTU2NDUwCitlbGlmIFsgLWYgLi9iY20udXNlciBdOyB0aGVuCitCQ01fVVNFUl9CSU5fRElSPS4KK2Vsc2UKK2VjaG8gImNhbm5vdCBmaW5kIGJjbS51c2VyLCBleGl0aW5nIgorZXhpdCAxCitmaQorCitlbHNlICMgdGhlIHVzZXIgbWF5IGNob29zZSB0aGUgc3RhcnRpbmcgZGlyZWN0b3J5IGRpcmVjdGx5IHVzaW5nIHRoZSBzZWNvbmQgYXJnbWVudCAKK0JDTV9VU0VSX0JJTl9ESVI9JDIKK2ZpICAgCisKK2Nhc2UgIiQxIiBpbgorICBzdGFydCkKKyAgCWVjaG8gLW4gIlN0YXJ0aW5nIGJjbS51c2VyOiAiCisJY2QgJHtCQ01fVVNFUl9CSU5fRElSfQorICAgICAgICBsc21vZCB8IGdyZXAgLXEgbGludXhfdXNlcl9iZGUgPiAvZGV2L251bGwKKyAgICAgICAgaWYgWyAiJD8iID09ICIwIiBdOyB0aGVuCisgICAgICAgICAgICBybW1vZCBsaW51eF91c2VyX2JkZQorICAgICAgICAgICAgZWNobyAtbiAiKC11c2VyKSIKKyAgICAgICAgZmkKKworICAgICAgICBsc21vZCB8IGdyZXAgLXEgbGludXhfa2VybmVsX2JkZSA+IC9kZXYvbnVsbAorICAgICAgICBpZiBbICIkPyIgPT0gIjAiIF07IHRoZW4KKyAgICAgICAgICAgIHJtbW9kIGxpbnV4X2tlcm5lbF9iZGUKKyAgICAgICAgICAgIGVjaG8gLW4gIigta2VybmVsKSIKKyAgICAgICAgZmkKKworIworIyBUaGUgbGludXhfa2VybmVsX2JkZSBhbmQgbGludXhfdXNlcl9iZGUgbW9kdWxlcyBhcmUgbG9hZGVkIGJ5IHRoZSBiY20udXNlciBleGVjdXRhYmxlCisjCisKKyMgQ3JlYXRlIHRoZSBsaW51eCBkZXZpY2UgZmlsZSwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdAorICAgICAgICBpZiBbICEgLWMgL2Rldi9saW51eC11c2VyLWJkZSBdOyB0aGVuCisgICAgICAgICAgICBta25vZCAvZGV2L2xpbnV4LXVzZXItYmRlIGMgMTI2IDAKKyAgICAgICAgZmkKKyAgICAgICAgLi9iY20udXNlcgorCWVjaG8gIk9LIgorCTs7CisgIHN0b3ApCisJZWNobyAtbiAiU3RvcHBpbmcgYmNtLnVzZXI6ICIKKwlwa2lsbCAtZiBiY20udXNlcgorCWVjaG8gIk9LIgorCTs7CisgIHJlc3RhcnR8cmVsb2FkKQorCTs7CisgICopCisJZWNobyAiVXNhZ2U6ICQwIHtzdGFydHxzdG9wfHJlc3RhcnR9IgorCWV4aXQgMQorZXNhYworCitleGl0ICQ/CmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zY3JpcHRzL21hcGxlX3N0YXJ0X3N0b3AgYi9iYWxfcmVsZWFzZS9zY3JpcHRzL21hcGxlX3N0YXJ0X3N0b3AKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmQ4MWQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NjcmlwdHMvbWFwbGVfc3RhcnRfc3RvcApAQCAtMCwwICsxLDU3IEBACisjIS9iaW4vc2gKKyMKKyMgU3RhcnQvU3RvcCBNYXBsZQorIworY2FzZSAiJDEiIGluCisgIHN0YXJ0KQorICAJZWNobyAtZSAgIkNoZWNraW5nIGlmIHN2a19pbml0LnNoIGNhbGxzIHRyeF9pbml0LnNoXG4iCisgIAljZCAvb3B0L2JjbTY4NjIwCisgIAlpZiBbICEgLWUgdHJ4X2luaXQuc2ggXTsgdGhlbgorICAJICAgIGVjaG8gInRyeF9pbml0LnNoIG5vdCBwcmVzZW50IiAmJiBjZCAtICYmIGV4aXQgMQorICAJZmkKKyAgCWlmIFsgLXogImBncmVwICIuL2JjbV91c2VyX2FwcGwgPCB0cnhfaW5pdC5zaCIgc3ZrX2luaXQuc2hgIiBdOyB0aGVuCisgIAkgICAgZWNobyAic3ZrX2luaXQuc2ggZG9lcyBub3QgY2FsbCB0cnhfaW5pdC5zaCIgJiYgY2QgLSAmJiBleGl0IDEKKyAgCWVsaWYgW1sgISAteiAiYGdyZXAgIi4vYmNtX3VzZXJfYXBwbCA8IHRyeF9pbml0LnNoIiBzdmtfaW5pdC5zaCB8IGdyZXAgIl5ccyojXHMqImAiIF1dOyB0aGVuCisgIAkgICAgZWNobyAiY2FsbCB0byB0cnhfaW5pdC5zaCBpcyBjb21tZW50ZWQgb3V0IGluIHN2a19pbml0LnNoIiAmJiBjZCAtICYmIGV4aXQgMQorICAJZmkKKworICAgICAgICBlY2hvIC1uICJTdGFydGluZyBNQVBMRTogIgorICAgICAgICBjZCAvb3B0L2JjbTY4NjIwICYmIC4vc3ZrX2luaXQuc2ggLS1wcm94eSA0MDAwMAorIAk7OworICBzdG9wKQorICAgICAgICBlY2hvIC1uICJTdG9wcGluZyBNYXBsZTogIgorICAgICAgICBwa2lsbCAtZiBiY21fdXNlcl9hcHBsCisgICAgICAgIGlmIFsgISAteiAiYGxzbW9kIHwgZ3JlcCAtbSAxIGNvb3BfZGJhX2xpbnV4YCIgXTsgdGhlbgorCSAgICBybW1vZCBjb29wX2RiYV9saW51eAorICAgICAgICBmaQorICAgICAgICBpZiBbICEgLXogImBsc21vZCB8IGdyZXAgLW0gMSBiY21fZGV2X2N0cmxfbGludXhgIiBdOyB0aGVuCisJICAgIHJtbW9kIGJjbV9kZXZfY3RybF9saW51eAorICAgICAgICBmaQorICAgICAgICBpZiBbICEgLXogImBsc21vZCB8IGdyZXAgLW0gMSBpMmNfZGV2c2AiIF07IHRoZW4KKwkgICAgcm1tb2QgaTJjX2RldnMua28KKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAhIC16ICJgbHNtb2QgfCBncmVwIC1tIDEgb3NfbGludXhgIiBdOyB0aGVuCisJICAgIHJtbW9kIG9zX2xpbnV4LmtvCisgICAgICAgIGZpCisgICAgICAgIGlmIFsgISAteiAiYGxzbW9kIHwgZ3JlcCAtbSAxIGxsX3BjaWVgIiBdOyB0aGVuCisJICAgIHJtbW9kIGxsX3BjaWUua28KKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAtZSAvZGV2L21hcGxlX2Rldl9jdHJsIF07IHRoZW4KKwkgICAgcm0gL2Rldi9tYXBsZV9kZXZfY3RybAorICAgICAgICBmaQorICAgICAgICBMT0NLX0RJUl9JTklUPS90bXAvYmNtNjg2MjBfc3ZrX2luaXQKKyAgICAgICAgTE9DS19ESVJfS0VSTkVMX0xPR19PV05FRD0vdG1wL2JjbTY4NjIwX2tlcm5lbF9sb2dfb3duZWQKKyAgICAgICAgcm0gLWZyICRMT0NLX0RJUl9JTklUCisgICAgICAgIHJtIC1mciAkTE9DS19ESVJfS0VSTkVMX0xPR19PV05FRAorICAgICAgICBlY2hvICJPSyIKKwk7OworICByZXN0YXJ0fHJlbG9hZCkKKyAgICAgICAgIiQwIiBzdG9wCisgICAgICAgICIkMCIgc3RhcnQKKwk7OworICAqKQorCWVjaG8gIlVzYWdlOiAkMCB7c3RhcnR8c3RvcHxyZXN0YXJ0fSIKKwlleGl0IDEKK2VzYWMKKworZXhpdCAkPwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc2NyaXB0cy9yeXUvUE9OX3RvcG9sb2d5XzEwMF9mbG93X2FkZF90aGVuX2RlbGV0ZV9hbGwucHkgYi9iYWxfcmVsZWFzZS9zY3JpcHRzL3J5dS9QT05fdG9wb2xvZ3lfMTAwX2Zsb3dfYWRkX3RoZW5fZGVsZXRlX2FsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmUzYjFmCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc2NyaXB0cy9yeXUvUE9OX3RvcG9sb2d5XzEwMF9mbG93X2FkZF90aGVuX2RlbGV0ZV9hbGwucHkKQEAgLTAsMCArMSwxMTIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExIE5pcHBvbiBUZWxlZ3JhcGggYW5kIFRlbGVwaG9uZSBDb3Jwb3JhdGlvbi4NCisjDQorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMNCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyMNCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCisjIGltcGxpZWQuDQorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitpbXBvcnQgbG9nZ2luZw0KKw0KK2Zyb20gcnl1LmJhc2UgaW1wb3J0IGFwcF9tYW5hZ2VyDQorZnJvbSB0aW1lIGltcG9ydCBzbGVlcA0KK2Zyb20gcnl1LmNvbnRyb2xsZXIgaW1wb3J0IG9mcF9ldmVudA0KK2Zyb20gcnl1LmNvbnRyb2xsZXIuaGFuZGxlciBpbXBvcnQgQ09ORklHX0RJU1BBVENIRVIsIE1BSU5fRElTUEFUQ0hFUg0KK2Zyb20gcnl1LmNvbnRyb2xsZXIuaGFuZGxlciBpbXBvcnQgc2V0X2V2X2Nscw0KK2Zyb20gcnl1Lm9mcHJvdG8gaW1wb3J0IG9mcHJvdG9fdjFfMw0KK2Zyb20gcnl1LmxpYi5wYWNrZXQgaW1wb3J0IHBhY2tldA0KK2Zyb20gcnl1LmxpYi5wYWNrZXQgaW1wb3J0IGV0aGVybmV0DQorZnJvbSByeXUubGliIGltcG9ydCBhZGRyY29udg0KKw0KK0xPRyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdyeXUuYXBwLnBvbl90b3BvbG9neScpDQorDQorY2xhc3MgUG9uVG9wb2xvZ3kxMyhhcHBfbWFuYWdlci5SeXVBcHApOg0KKyAgICBPRlBfVkVSU0lPTlMgPSBbb2Zwcm90b192MV8zLk9GUF9WRVJTSU9OXQ0KKw0KKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCisgICAgICAgIHN1cGVyKFBvblRvcG9sb2d5MTMsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykNCisgICAgICAgIHNlbGYubWFjX3RvX3BvcnQgPSB7fQ0KKw0KKyAgICBAc2V0X2V2X2NscyhvZnBfZXZlbnQuRXZlbnRPRlBTd2l0Y2hGZWF0dXJlcywgQ09ORklHX0RJU1BBVENIRVIpDQorICAgIGRlZiBzd2l0Y2hfZmVhdHVyZXNfaGFuZGxlcihzZWxmLCBldik6DQorICAgICAgICBkYXRhcGF0aCA9IGV2Lm1zZy5kYXRhcGF0aA0KKw0KKyAgICAgICAgIyBUaGlzIGRvZXMgbm90aGluZyBpZiBmbG93cyBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgY29uZmlndXJlZCBpbiB0aGUgT0YgYWdlbnQNCisgICAgICAgIHNlbGYuZGVsX2FsbF9mbG93cyhkYXRhcGF0aCkNCisNCisgICAgICAgICMgQ29uZmlndXJlIHRoZSBmbG93cyAoVklEIDEwMCkNCisgICAgICAgICMNCisgICAgICAgICMgUG9ydHMgMS0xMjggYXJlIGltcGxpY2l0bHkgbWFwcGVkIHRvIFVOSS0wIG9uIE9OVSAxLT4xMjgNCisgICAgICAgICMgUG9ydHMgMTI5IGFuZCBhYm92ZSBhcmUgaW1wbGljaXRseSBtYXBwZWQgdG8gT0xUIE5OSS0wIGFuZCBhYm92ZQ0KKyAgICAgICAgc2VsZi5hZGRfdmlkX2Zsb3coZGF0YXBhdGgsMTAwMDAsIDEsIDEyOSwgMTAwLCAwKQ0KKyAgICAgICAgc2VsZi5hZGRfdmlkX2Zsb3coZGF0YXBhdGgsMTAwMDEsIDEyOSwgMSwgMTAwLCAwKQ0KKw0KKyAgICAgICAgc2xlZXAoMSkNCisgICAgICAgIHNlbGYuc2VuZF9iYXJyaWVyKGRhdGFwYXRoKQ0KKw0KKyAgICAgICAgc2xlZXAoNSkNCisgICAgICAgIA0KKyAgICAgICAgc2VsZi5kZWxfYWxsX2Zsb3dzKGRhdGFwYXRoKQ0KKw0KKyAgICBAc2V0X2V2X2NscyhvZnBfZXZlbnQuRXZlbnRPRlBQb3J0U3RhdHVzLCBNQUlOX0RJU1BBVENIRVIpDQorICAgIGRlZiBwb3J0X3N0YXR1c19oYW5kbGVyKHNlbGYsIGV2KToNCisgICAgICAgIExPRy5kZWJ1ZygncG9ydF9zdGF0dXNfaGFuZGxlciBwb3J0IGlkOiAlZCcsIGV2Lm1zZy5kZXNjLnBvcnRfbm8pDQorDQorICAgIGRlZiBhZGRfbWV0ZXIoc2VsZiwgZGF0YXBhdGgsIG1ldGVyX2lkLCByYXRlKToNCisgICAgICAgIG9mcHJvdG8gPSBkYXRhcGF0aC5vZnByb3RvDQorICAgICAgICBwYXJzZXIgPSBkYXRhcGF0aC5vZnByb3RvX3BhcnNlcg0KKyAgICAgICAgYmFuZCA9IHBhcnNlci5PRlBNZXRlckJhbmREcm9wKGJ1cnN0X3NpemU9MCwgcmF0ZT1yYXRlKQ0KKyAgICAgICAgbW9kID0gcGFyc2VyLk9GUE1ldGVyTW9kKGRhdGFwYXRoPWRhdGFwYXRoLGNvbW1hbmQ9b2Zwcm90by5PRlBNQ19BREQsIGZsYWdzPW9mcHJvdG8uT0ZQTUZfS0JQUywgbWV0ZXJfaWQ9bWV0ZXJfaWQsIGJhbmRzPVtiYW5kXSkNCisgICAgICAgIExPRy5pbmZvKCJhZGRfbWV0ZXI6IG1ldGVyX2lkPSVkLCByYXRlPSVkIEtCUFMiKQ0KKyAgICAgICAgZGF0YXBhdGguc2VuZF9tc2cobW9kKQ0KKw0KKyAgICBkZWYgYWRkX3ZpZF9mbG93KHNlbGYsIGRhdGFwYXRoLCBjb29raWUsIHNyY19wb3J0LCBkc3RfcG9ydCwgdmlkLCBtZXRlcl9pZCk6DQorICAgICAgICBvZnByb3RvID0gZGF0YXBhdGgub2Zwcm90bw0KKyAgICAgICAgcGFyc2VyID0gZGF0YXBhdGgub2Zwcm90b19wYXJzZXINCisgICAgICAgIGFjdGlvbnMgPSBbcGFyc2VyLk9GUEFjdGlvbk91dHB1dChkc3RfcG9ydCldDQorICAgICAgICBpZiBtZXRlcl9pZCAhPSAwOg0KKyAgICAgICAgICAgIGluc3QgPSBbcGFyc2VyLk9GUEluc3RydWN0aW9uQWN0aW9ucyhvZnByb3RvLk9GUElUX0FQUExZX0FDVElPTlMsYWN0aW9ucyksIHBhcnNlci5PRlBJbnN0cnVjdGlvbk1ldGVyKG1ldGVyX2lkKV0NCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgaW5zdCA9IFtwYXJzZXIuT0ZQSW5zdHJ1Y3Rpb25BY3Rpb25zKG9mcHJvdG8uT0ZQSVRfQVBQTFlfQUNUSU9OUyxhY3Rpb25zKV0NCisNCisgICAgICAgICMgTk9URTogMHgxMDAwIGlzIE9SJ2QgaW50byB0aGUgdmlkIHRvIHNldCB0aGUgT0ZQVklEX1BSRVNFTlQgZmxhZyBpbiB0aGUgT3BlbkZsb3cgRkxPV19NT0QgKE9GUEZDX0FERCkgDQorICAgICAgICAjIG1lc3NhZ2UgbWF0Y2ggZmllbGQuDQorICAgICAgICBtYXRjaCA9IHBhcnNlci5PRlBNYXRjaChpbl9wb3J0PXNyY19wb3J0LCB2bGFuX3ZpZD0odmlkIHwgMHgxMDAwKSkNCisgICAgICAgIG1vZCA9IHBhcnNlci5PRlBGbG93TW9kKGRhdGFwYXRoPWRhdGFwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llPWNvb2tpZSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVfbWFzaz0zMjc2NywgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eT0wLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoPW1hdGNoLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucz1pbnN0KQ0KKyAgICAgICAgTE9HLmluZm8oImFkZF92aWRfZmxvdzogc3JjX3BvcnQ9JWQgZHN0X3BvcnQ9JWQgdmlkPSVkIG1ldGVyPSVkIGNvb2tpZT0lZCIsIA0KKyAgICAgICAgICAgICAgICAgc3JjX3BvcnQsIGRzdF9wb3J0LCB2aWQsIG1ldGVyX2lkLCBjb29raWUpDQorICAgICAgICBkYXRhcGF0aC5zZW5kX21zZyhtb2QpDQorDQorICAgIGRlZiBkZWxfZmxvdyhzZWxmLCBkYXRhcGF0aCwgY29va2llKToNCisgICAgICAgIExPRy5pbmZvKCJkZWxfZmxvdzogY29va2llPSVkIiwgY29va2llKQ0KKyAgICAgICAgc2VsZi5fZGVsX2Zsb3coZGF0YXBhdGgsIGNvb2tpZSwgMzI3NjcpDQorDQorICAgIGRlZiBkZWxfYWxsX2Zsb3dzKHNlbGYsIGRhdGFwYXRoKToNCisgICAgICAgIExPRy5pbmZvKCJkZWxfYWxsX2Zsb3dzIikNCisgICAgICAgICMgQ29va2llIDAgKGFyZ3VtZW50IDIpIHRlbGxzIHRoZSBPRiBhZ2VudCB0byBkZWxldGUgYWxsIGNvbmZpZ3VyZWQgZmxvd3MNCisgICAgICAgIHNlbGYuX2RlbF9mbG93KGRhdGFwYXRoLCAwLCAwKQ0KKw0KKyAgICBkZWYgX2RlbF9mbG93KHNlbGYsIGRhdGFwYXRoLCBjb29raWUsIG1hc2spOg0KKyAgICAgICAgb2Zwcm90byA9IGRhdGFwYXRoLm9mcHJvdG8NCisgICAgICAgIHBhcnNlciA9IGRhdGFwYXRoLm9mcHJvdG9fcGFyc2VyDQorIA0KKyAgICAgICAgbW9kID0gcGFyc2VyLk9GUEZsb3dNb2QoDQorICAgICAgICAgICAgZGF0YXBhdGg9ZGF0YXBhdGgsIG1hdGNoPU5vbmUsIGNvb2tpZT1jb29raWUsIGNvb2tpZV9tYXNrPW1hc2ssDQorICAgICAgICAgICAgY29tbWFuZD1vZnByb3RvLk9GUEZDX0RFTEVURSkNCisgICAgICAgIGRhdGFwYXRoLnNlbmRfbXNnKG1vZCkNCisNCisgICAgZGVmIHNlbmRfYmFycmllcihzZWxmLCBkYXRhcGF0aCk6DQorICAgICAgICBMT0cuaW5mbygic2VuZF9iYXJyaWVyIikNCisgICAgICAgIGRhdGFwYXRoLnNlbmRfYmFycmllcigpDQorICAgICAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NjcmlwdHMvcnl1L1BPTl90b3BvbG9neV8xMDBfZmxvd19hZGRfdGhlbl9kZWxldGVfYWxsX2xvb3AucHkgYi9iYWxfcmVsZWFzZS9zY3JpcHRzL3J5dS9QT05fdG9wb2xvZ3lfMTAwX2Zsb3dfYWRkX3RoZW5fZGVsZXRlX2FsbF9sb29wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODc4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zY3JpcHRzL3J5dS9QT05fdG9wb2xvZ3lfMTAwX2Zsb3dfYWRkX3RoZW5fZGVsZXRlX2FsbF9sb29wLnB5CkBAIC0wLDAgKzEsMTIwIEBACisjIENvcHlyaWdodCAoQykgMjAxMSBOaXBwb24gVGVsZWdyYXBoIGFuZCBUZWxlcGhvbmUgQ29ycG9yYXRpb24uDQorIw0KKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisjDQorIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisjDQorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQorIyBpbXBsaWVkLg0KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoraW1wb3J0IGxvZ2dpbmcNCisNCitmcm9tIHJ5dS5iYXNlIGltcG9ydCBhcHBfbWFuYWdlcg0KK2Zyb20gdGltZSBpbXBvcnQgc2xlZXANCitmcm9tIHJ5dS5jb250cm9sbGVyIGltcG9ydCBvZnBfZXZlbnQNCitmcm9tIHJ5dS5jb250cm9sbGVyLmhhbmRsZXIgaW1wb3J0IENPTkZJR19ESVNQQVRDSEVSLCBNQUlOX0RJU1BBVENIRVINCitmcm9tIHJ5dS5jb250cm9sbGVyLmhhbmRsZXIgaW1wb3J0IHNldF9ldl9jbHMNCitmcm9tIHJ5dS5vZnByb3RvIGltcG9ydCBvZnByb3RvX3YxXzMNCitmcm9tIHJ5dS5saWIucGFja2V0IGltcG9ydCBwYWNrZXQNCitmcm9tIHJ5dS5saWIucGFja2V0IGltcG9ydCBldGhlcm5ldA0KK2Zyb20gcnl1LmxpYiBpbXBvcnQgYWRkcmNvbnYNCisNCitMT0cgPSBsb2dnaW5nLmdldExvZ2dlcigncnl1LmFwcC5wb25fdG9wb2xvZ3knKQ0KKw0KK2NsYXNzIFBvblRvcG9sb2d5MTMoYXBwX21hbmFnZXIuUnl1QXBwKToNCisgICAgT0ZQX1ZFUlNJT05TID0gW29mcHJvdG9fdjFfMy5PRlBfVkVSU0lPTl0NCisNCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQorICAgICAgICBzdXBlcihQb25Ub3BvbG9neTEzLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpDQorICAgICAgICBzZWxmLm1hY190b19wb3J0ID0ge30NCisNCisgICAgQHNldF9ldl9jbHMob2ZwX2V2ZW50LkV2ZW50T0ZQU3dpdGNoRmVhdHVyZXMsIENPTkZJR19ESVNQQVRDSEVSKQ0KKyAgICBkZWYgc3dpdGNoX2ZlYXR1cmVzX2hhbmRsZXIoc2VsZiwgZXYpOg0KKyAgICAgICAgZGF0YXBhdGggPSBldi5tc2cuZGF0YXBhdGgNCisNCisgICAgICAgICMgQWRkL0RlbCB1cHN0cmVhbS9kb3duc3RyZWFtIGZsb3dzIChWSUQgMTAwKSBpbiBhIGxvb3AgdG8gdGVzdCBmb3IgbGVha3MgaW4gdGhlIE9GIGFnZW50DQorICAgICAgICAjDQorICAgICAgICAjIChOT1RFOiBUaGUgZmlyc3QgZGVsX2FsbF9mbG93cyBkb2VzIG5vdGhpbmcgaWYgZmxvd3MgaGF2ZSBub3QgYmVlbiBwcmV2aW91c2x5IA0KKyAgICAgICAgIyBjb25maWd1cmVkIGluIHRoZSBPRiBhZ2VudCkNCisgICAgICAgIHdoaWxlIDE6DQorICAgICAgICAgICAgc2VsZi5kZWxfYWxsX2Zsb3dzKGRhdGFwYXRoKQ0KKw0KKyAgICAgICAgICAgIHNlbGYuYWRkX3ZpZF9mbG93KGRhdGFwYXRoLDEwMDAwLCAxLCAxMjksIDEwMCwgMCkNCisgICAgICAgICAgICBzZWxmLmFkZF92aWRfZmxvdyhkYXRhcGF0aCwxMDAwMSwgMTI5LCAxLCAxMDAsIDApDQorDQorICAgICAgICAgICAgc2xlZXAoMSkNCisgICAgICAgICAgICBzZWxmLnNlbmRfYmFycmllcihkYXRhcGF0aCkNCisgICAgICAgICAgDQorICAgICAgICAgICAgc2xlZXAoNSkNCisgICAgICAgIA0KKyANCisgICAgQHNldF9ldl9jbHMob2ZwX2V2ZW50LkV2ZW50T0ZQUG9ydFN0YXR1cywgTUFJTl9ESVNQQVRDSEVSKQ0KKyAgICBkZWYgcG9ydF9zdGF0dXNfaGFuZGxlcihzZWxmLCBldik6DQorICAgICAgICBMT0cuZGVidWcoJ3BvcnRfc3RhdHVzX2hhbmRsZXIgcG9ydCBpZDogJWQnLCBldi5tc2cuZGVzYy5wb3J0X25vKQ0KKw0KKyAgICBkZWYgYWRkX21ldGVyKHNlbGYsIGRhdGFwYXRoLCBtZXRlcl9pZCwgcmF0ZSk6DQorICAgICAgICBvZnByb3RvID0gZGF0YXBhdGgub2Zwcm90bw0KKyAgICAgICAgcGFyc2VyID0gZGF0YXBhdGgub2Zwcm90b19wYXJzZXINCisgICAgICAgIGJhbmQgPSBwYXJzZXIuT0ZQTWV0ZXJCYW5kRHJvcChidXJzdF9zaXplPTAsIHJhdGU9cmF0ZSkNCisgICAgICAgIG1vZCA9IHBhcnNlci5PRlBNZXRlck1vZChkYXRhcGF0aD1kYXRhcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPW9mcHJvdG8uT0ZQTUNfQURELCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz1vZnByb3RvLk9GUE1GX0tCUFMsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGVyX2lkPW1ldGVyX2lkLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kcz1bYmFuZF0pDQorICAgICAgICBMT0cuaW5mbygiYWRkX21ldGVyOiBtZXRlcl9pZD0lZCwgcmF0ZT0lZCBLQlBTIikNCisgICAgICAgIGRhdGFwYXRoLnNlbmRfbXNnKG1vZCkNCisNCisgICAgZGVmIGFkZF92aWRfZmxvdyhzZWxmLCBkYXRhcGF0aCwgY29va2llLCBzcmNfcG9ydCwgZHN0X3BvcnQsIHZpZCwgbWV0ZXJfaWQpOg0KKyAgICAgICAgb2Zwcm90byA9IGRhdGFwYXRoLm9mcHJvdG8NCisgICAgICAgIHBhcnNlciA9IGRhdGFwYXRoLm9mcHJvdG9fcGFyc2VyDQorICAgICAgICBhY3Rpb25zID0gW3BhcnNlci5PRlBBY3Rpb25PdXRwdXQoZHN0X3BvcnQpXQ0KKyAgICAgICAgaWYgbWV0ZXJfaWQgIT0gMDoNCisgICAgICAgICAgICBpbnN0ID0gW3BhcnNlci5PRlBJbnN0cnVjdGlvbkFjdGlvbnMob2Zwcm90by5PRlBJVF9BUFBMWV9BQ1RJT05TLGFjdGlvbnMpLCANCisgICAgICAgICAgICAgICAgICAgIHBhcnNlci5PRlBJbnN0cnVjdGlvbk1ldGVyKG1ldGVyX2lkKV0NCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgaW5zdCA9IFtwYXJzZXIuT0ZQSW5zdHJ1Y3Rpb25BY3Rpb25zKG9mcHJvdG8uT0ZQSVRfQVBQTFlfQUNUSU9OUyxhY3Rpb25zKV0NCisNCisgICAgICAgICMgTk9URTogMHgxMDAwIGlzIE9SJ2QgaW50byB0aGUgdmlkIHRvIHNldCB0aGUgT0ZQVklEX1BSRVNFTlQgZmxhZyBpbiB0aGUgT3BlbkZsb3cgRkxPV19NT0QgKE9GUEZDX0FERCkgDQorICAgICAgICAjIG1lc3NhZ2UgbWF0Y2ggZmllbGQuDQorICAgICAgICBtYXRjaCA9IHBhcnNlci5PRlBNYXRjaChpbl9wb3J0PXNyY19wb3J0LCB2bGFuX3ZpZD0odmlkIHwgMHgxMDAwKSkNCisgICAgICAgIG1vZCA9IHBhcnNlci5PRlBGbG93TW9kKGRhdGFwYXRoPWRhdGFwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llPWNvb2tpZSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVfbWFzaz0zMjc2NywgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eT0wLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoPW1hdGNoLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucz1pbnN0KQ0KKyAgICAgICAgTE9HLmluZm8oImFkZF92aWRfZmxvdzogc3JjX3BvcnQ9JWQgZHN0X3BvcnQ9JWQgdmlkPSVkIG1ldGVyPSVkIGNvb2tpZT0lZCIsIA0KKyAgICAgICAgICAgICAgICAgc3JjX3BvcnQsIGRzdF9wb3J0LCB2aWQsIG1ldGVyX2lkLCBjb29raWUpDQorICAgICAgICBkYXRhcGF0aC5zZW5kX21zZyhtb2QpDQorDQorICAgIGRlZiBkZWxfZmxvdyhzZWxmLCBkYXRhcGF0aCwgY29va2llKToNCisgICAgICAgIExPRy5pbmZvKCJkZWxfZmxvdzogY29va2llPSVkIiwgY29va2llKQ0KKyAgICAgICAgc2VsZi5fZGVsX2Zsb3coZGF0YXBhdGgsIGNvb2tpZSwgMzI3NjcpDQorDQorICAgIGRlZiBkZWxfYWxsX2Zsb3dzKHNlbGYsIGRhdGFwYXRoKToNCisgICAgICAgIExPRy5pbmZvKCJkZWxfYWxsX2Zsb3dzIikNCisgICAgICAgICMgQ29va2llIDAgKGFyZ3VtZW50IDIpIHRlbGxzIHRoZSBPRiBhZ2VudCB0byBkZWxldGUgYWxsIGNvbmZpZ3VyZWQgZmxvd3MNCisgICAgICAgIHNlbGYuX2RlbF9mbG93KGRhdGFwYXRoLCAwLCAwKQ0KKw0KKyAgICBkZWYgX2RlbF9mbG93KHNlbGYsIGRhdGFwYXRoLCBjb29raWUsIG1hc2spOg0KKyAgICAgICAgb2Zwcm90byA9IGRhdGFwYXRoLm9mcHJvdG8NCisgICAgICAgIHBhcnNlciA9IGRhdGFwYXRoLm9mcHJvdG9fcGFyc2VyDQorIA0KKyAgICAgICAgbW9kID0gcGFyc2VyLk9GUEZsb3dNb2QoDQorICAgICAgICAgICAgZGF0YXBhdGg9ZGF0YXBhdGgsIG1hdGNoPU5vbmUsIGNvb2tpZT1jb29raWUsIGNvb2tpZV9tYXNrPW1hc2ssDQorICAgICAgICAgICAgY29tbWFuZD1vZnByb3RvLk9GUEZDX0RFTEVURSkNCisgICAgICAgIGRhdGFwYXRoLnNlbmRfbXNnKG1vZCkNCisgICAgDQorICAgIGRlZiBzZW5kX2JhcnJpZXIoc2VsZiwgZGF0YXBhdGgpOg0KKyAgICAgICAgTE9HLmluZm8oInNlbmRfYmFycmllciIpDQorICAgICAgICBkYXRhcGF0aC5zZW5kX2JhcnJpZXIoKQ0KKyAgICAgICAgICAgICAgICAgICANCisNCisNCisNCisgICAgICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc2NyaXB0cy9yeXUvUE9OX3RvcG9sb2d5XzEwMF9mbG93X2FkZF90aGVuX2RlbGV0ZV9kc190aGVuX3VzLnB5IGIvYmFsX3JlbGVhc2Uvc2NyaXB0cy9yeXUvUE9OX3RvcG9sb2d5XzEwMF9mbG93X2FkZF90aGVuX2RlbGV0ZV9kc190aGVuX3VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NzkwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zY3JpcHRzL3J5dS9QT05fdG9wb2xvZ3lfMTAwX2Zsb3dfYWRkX3RoZW5fZGVsZXRlX2RzX3RoZW5fdXMucHkKQEAgLTAsMCArMSwxMjMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExIE5pcHBvbiBUZWxlZ3JhcGggYW5kIFRlbGVwaG9uZSBDb3Jwb3JhdGlvbi4NCisjDQorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMNCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyMNCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCisjIGltcGxpZWQuDQorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitpbXBvcnQgbG9nZ2luZw0KKw0KK2Zyb20gcnl1LmJhc2UgaW1wb3J0IGFwcF9tYW5hZ2VyDQorZnJvbSB0aW1lIGltcG9ydCBzbGVlcA0KK2Zyb20gcnl1LmNvbnRyb2xsZXIgaW1wb3J0IG9mcF9ldmVudA0KK2Zyb20gcnl1LmNvbnRyb2xsZXIuaGFuZGxlciBpbXBvcnQgQ09ORklHX0RJU1BBVENIRVIsIE1BSU5fRElTUEFUQ0hFUg0KK2Zyb20gcnl1LmNvbnRyb2xsZXIuaGFuZGxlciBpbXBvcnQgc2V0X2V2X2Nscw0KK2Zyb20gcnl1Lm9mcHJvdG8gaW1wb3J0IG9mcHJvdG9fdjFfMw0KK2Zyb20gcnl1LmxpYi5wYWNrZXQgaW1wb3J0IHBhY2tldA0KK2Zyb20gcnl1LmxpYi5wYWNrZXQgaW1wb3J0IGV0aGVybmV0DQorZnJvbSByeXUubGliIGltcG9ydCBhZGRyY29udg0KKw0KK0xPRyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdyeXUuYXBwLnBvbl90b3BvbG9neScpDQorDQorY2xhc3MgUG9uVG9wb2xvZ3kxMyhhcHBfbWFuYWdlci5SeXVBcHApOg0KKyAgICBPRlBfVkVSU0lPTlMgPSBbb2Zwcm90b192MV8zLk9GUF9WRVJTSU9OXQ0KKw0KKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCisgICAgICAgIHN1cGVyKFBvblRvcG9sb2d5MTMsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykNCisgICAgICAgIHNlbGYubWFjX3RvX3BvcnQgPSB7fQ0KKw0KKyAgICBAc2V0X2V2X2NscyhvZnBfZXZlbnQuRXZlbnRPRlBTd2l0Y2hGZWF0dXJlcywgQ09ORklHX0RJU1BBVENIRVIpDQorICAgIGRlZiBzd2l0Y2hfZmVhdHVyZXNfaGFuZGxlcihzZWxmLCBldik6DQorICAgICAgICBkYXRhcGF0aCA9IGV2Lm1zZy5kYXRhcGF0aA0KKw0KKyAgICAgICAgIyBUaGlzIGRvZXMgbm90aGluZyBpZiBmbG93cyBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgY29uZmlndXJlZCBpbiB0aGUgT0YgYWdlbnQNCisgICAgICAgIHNlbGYuZGVsX2FsbF9mbG93cyhkYXRhcGF0aCkNCisNCisgICAgICAgICMgQ29uZmlndXJlIHRoZSBmbG93cyAoVklEIDEwMCkNCisgICAgICAgICMNCisgICAgICAgICMgUG9ydHMgMS0xMjggYXJlIGltcGxpY2l0bHkgbWFwcGVkIHRvIFVOSS0wIG9uIE9OVSAxLTEyDQorICAgICAgICAjIFBvcnRzIDEyOSBhbmQgYWJvdmUgYXJlIGltcGxpY2l0bHkgbWFwcGVkIHRvIE9MVCBOTkktMCBhbmQgYWJvdmUNCisgICAgICAgIHNlbGYuYWRkX3ZpZF9mbG93KGRhdGFwYXRoLDEwMDAwLCAxLCAxMjksIDEwMCwgMCkNCisgICAgICAgIHNlbGYuYWRkX3ZpZF9mbG93KGRhdGFwYXRoLDEwMDAxLCAxMjksIDEsIDEwMCwgMCkNCisNCisgICAgICAgIHNsZWVwKDEpDQorICAgICAgICBzZWxmLnNlbmRfYmFycmllcihkYXRhcGF0aCkNCisNCisgICAgICAgIHNsZWVwKDUpDQorICAgICAgICANCisgICAgICAgICMgRGVsZXRlIHRoZSBkb3duc3RyZWFtIGZsb3cNCisgICAgICAgIHNlbGYuZGVsX2Zsb3coZGF0YXBhdGgsIDEwMDAxKQ0KKyAgICAgICAgIyBUaGVuIGRlbGV0ZSB0aGUgdXBzdHJlYW0gZmxvdw0KKyAgICAgICAgc2VsZi5kZWxfZmxvdyhkYXRhcGF0aCwgMTAwMDApDQorDQorICAgIEBzZXRfZXZfY2xzKG9mcF9ldmVudC5FdmVudE9GUFBvcnRTdGF0dXMsIE1BSU5fRElTUEFUQ0hFUikNCisgICAgZGVmIHBvcnRfc3RhdHVzX2hhbmRsZXIoc2VsZiwgZXYpOg0KKyAgICAgICAgTE9HLmRlYnVnKCdwb3J0X3N0YXR1c19oYW5kbGVyIHBvcnQgaWQ6ICVkJywgZXYubXNnLmRlc2MucG9ydF9ubykNCisNCisgICAgZGVmIGFkZF9tZXRlcihzZWxmLCBkYXRhcGF0aCwgbWV0ZXJfaWQsIHJhdGUpOg0KKyAgICAgICAgb2Zwcm90byA9IGRhdGFwYXRoLm9mcHJvdG8NCisgICAgICAgIHBhcnNlciA9IGRhdGFwYXRoLm9mcHJvdG9fcGFyc2VyDQorICAgICAgICBiYW5kID0gcGFyc2VyLk9GUE1ldGVyQmFuZERyb3AoYnVyc3Rfc2l6ZT0wLCByYXRlPXJhdGUpDQorICAgICAgICBtb2QgPSBwYXJzZXIuT0ZQTWV0ZXJNb2QoZGF0YXBhdGg9ZGF0YXBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1vZnByb3RvLk9GUE1DX0FERCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M9b2Zwcm90by5PRlBNRl9LQlBTLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRlcl9pZD1tZXRlcl9pZCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHM9W2JhbmRdKQ0KKyAgICAgICAgTE9HLmluZm8oImFkZF9tZXRlcjogbWV0ZXJfaWQ9JWQsIHJhdGU9JWQgS0JQUyIpDQorICAgICAgICBkYXRhcGF0aC5zZW5kX21zZyhtb2QpDQorDQorICAgIGRlZiBhZGRfdmlkX2Zsb3coc2VsZiwgZGF0YXBhdGgsIGNvb2tpZSwgc3JjX3BvcnQsIGRzdF9wb3J0LCB2aWQsIG1ldGVyX2lkKToNCisgICAgICAgIG9mcHJvdG8gPSBkYXRhcGF0aC5vZnByb3RvDQorICAgICAgICBwYXJzZXIgPSBkYXRhcGF0aC5vZnByb3RvX3BhcnNlcg0KKyAgICAgICAgYWN0aW9ucyA9IFtwYXJzZXIuT0ZQQWN0aW9uT3V0cHV0KGRzdF9wb3J0KV0NCisgICAgICAgIGlmIG1ldGVyX2lkICE9IDA6DQorICAgICAgICAgICAgaW5zdCA9IFtwYXJzZXIuT0ZQSW5zdHJ1Y3Rpb25BY3Rpb25zKG9mcHJvdG8uT0ZQSVRfQVBQTFlfQUNUSU9OUyxhY3Rpb25zKSwgDQorICAgICAgICAgICAgICAgICAgICBwYXJzZXIuT0ZQSW5zdHJ1Y3Rpb25NZXRlcihtZXRlcl9pZCldDQorICAgICAgICBlbHNlOg0KKyAgICAgICAgICAgIGluc3QgPSBbcGFyc2VyLk9GUEluc3RydWN0aW9uQWN0aW9ucyhvZnByb3RvLk9GUElUX0FQUExZX0FDVElPTlMsYWN0aW9ucyldDQorDQorICAgICAgICAjIE5PVEU6IDB4MTAwMCBpcyBPUidkIGludG8gdGhlIHZpZCB0byBzZXQgdGhlIE9GUFZJRF9QUkVTRU5UIGZsYWcgaW4gdGhlIE9wZW5GbG93IEZMT1dfTU9EIChPRlBGQ19BREQpIA0KKyAgICAgICAgIyBtZXNzYWdlIG1hdGNoIGZpZWxkLg0KKyAgICAgICAgbWF0Y2ggPSBwYXJzZXIuT0ZQTWF0Y2goaW5fcG9ydD1zcmNfcG9ydCwgdmxhbl92aWQ9KHZpZCB8IDB4MTAwMCkpDQorICAgICAgICBtb2QgPSBwYXJzZXIuT0ZQRmxvd01vZChkYXRhcGF0aD1kYXRhcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZT1jb29raWUsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llX21hc2s9MzI3NjcsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk9MCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaD1tYXRjaCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnM9aW5zdCkNCisgICAgICAgIExPRy5pbmZvKCJhZGRfdmlkX2Zsb3c6IHNyY19wb3J0PSVkIGRzdF9wb3J0PSVkIHZpZD0lZCBtZXRlcj0lZCBjb29raWU9JWQiLCANCisgICAgICAgICAgICAgICAgIHNyY19wb3J0LCBkc3RfcG9ydCwgdmlkLCBtZXRlcl9pZCwgY29va2llKQ0KKyAgICAgICAgZGF0YXBhdGguc2VuZF9tc2cobW9kKQ0KKw0KKyAgICBkZWYgZGVsX2Zsb3coc2VsZiwgZGF0YXBhdGgsIGNvb2tpZSk6DQorICAgICAgICBMT0cuaW5mbygiZGVsX2Zsb3c6IGNvb2tpZT0lZCIsIGNvb2tpZSkNCisgICAgICAgIHNlbGYuX2RlbF9mbG93KGRhdGFwYXRoLCBjb29raWUsIDMyNzY3KQ0KKw0KKyAgICBkZWYgZGVsX2FsbF9mbG93cyhzZWxmLCBkYXRhcGF0aCk6DQorICAgICAgICBMT0cuaW5mbygiZGVsX2FsbF9mbG93cyIpDQorDQorICAgICAgICAjIENvb2tpZSAwIChhcmd1bWVudCAyKSB0ZWxscyB0aGUgT0YgYWdlbnQgdG8gZGVsZXRlIGFsbCBjb25maWd1cmVkIGZsb3dzDQorICAgICAgICBzZWxmLl9kZWxfZmxvdyhkYXRhcGF0aCwgMCwgMCkNCisNCisgICAgZGVmIF9kZWxfZmxvdyhzZWxmLCBkYXRhcGF0aCwgY29va2llLCBtYXNrKToNCisgICAgICAgIG9mcHJvdG8gPSBkYXRhcGF0aC5vZnByb3RvDQorICAgICAgICBwYXJzZXIgPSBkYXRhcGF0aC5vZnByb3RvX3BhcnNlcg0KKyANCisgICAgICAgIG1vZCA9IHBhcnNlci5PRlBGbG93TW9kKGRhdGFwYXRoPWRhdGFwYXRoLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoPU5vbmUsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llPWNvb2tpZSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVfbWFzaz1tYXNrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1vZnByb3RvLk9GUEZDX0RFTEVURSkNCisgICAgICAgIGRhdGFwYXRoLnNlbmRfbXNnKG1vZCkNCisNCisgICAgZGVmIHNlbmRfYmFycmllcihzZWxmLCBkYXRhcGF0aCk6DQorICAgICAgICBMT0cuaW5mbygic2VuZF9iYXJyaWVyIikNCisgICAgICAgIGRhdGFwYXRoLnNlbmRfYmFycmllcigpDQorICAgICAgICAgICAgICAgICAgIA0KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NjcmlwdHMvcnl1L1BPTl90b3BvbG9neV8xMDBfZmxvd19hZGRfdGhlbl9kZWxldGVfdXNfdGhlbl9kcy5weSBiL2JhbF9yZWxlYXNlL3NjcmlwdHMvcnl1L1BPTl90b3BvbG9neV8xMDBfZmxvd19hZGRfdGhlbl9kZWxldGVfdXNfdGhlbl9kcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODgyMDhmCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc2NyaXB0cy9yeXUvUE9OX3RvcG9sb2d5XzEwMF9mbG93X2FkZF90aGVuX2RlbGV0ZV91c190aGVuX2RzLnB5CkBAIC0wLDAgKzEsMTE5IEBACisjIENvcHlyaWdodCAoQykgMjAxMSBOaXBwb24gVGVsZWdyYXBoIGFuZCBUZWxlcGhvbmUgQ29ycG9yYXRpb24uDQorIw0KKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisjDQorIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisjDQorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQorIyBpbXBsaWVkLg0KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoraW1wb3J0IGxvZ2dpbmcNCisNCitmcm9tIHJ5dS5iYXNlIGltcG9ydCBhcHBfbWFuYWdlcg0KK2Zyb20gdGltZSBpbXBvcnQgc2xlZXANCitmcm9tIHJ5dS5jb250cm9sbGVyIGltcG9ydCBvZnBfZXZlbnQNCitmcm9tIHJ5dS5jb250cm9sbGVyLmhhbmRsZXIgaW1wb3J0IENPTkZJR19ESVNQQVRDSEVSLCBNQUlOX0RJU1BBVENIRVINCitmcm9tIHJ5dS5jb250cm9sbGVyLmhhbmRsZXIgaW1wb3J0IHNldF9ldl9jbHMNCitmcm9tIHJ5dS5vZnByb3RvIGltcG9ydCBvZnByb3RvX3YxXzMNCitmcm9tIHJ5dS5saWIucGFja2V0IGltcG9ydCBwYWNrZXQNCitmcm9tIHJ5dS5saWIucGFja2V0IGltcG9ydCBldGhlcm5ldA0KK2Zyb20gcnl1LmxpYiBpbXBvcnQgYWRkcmNvbnYNCisNCitMT0cgPSBsb2dnaW5nLmdldExvZ2dlcigncnl1LmFwcC5wb25fdG9wb2xvZ3knKQ0KKw0KK2NsYXNzIFBvblRvcG9sb2d5MTMoYXBwX21hbmFnZXIuUnl1QXBwKToNCisgICAgT0ZQX1ZFUlNJT05TID0gW29mcHJvdG9fdjFfMy5PRlBfVkVSU0lPTl0NCisNCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQorICAgICAgICBzdXBlcihQb25Ub3BvbG9neTEzLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpDQorICAgICAgICBzZWxmLm1hY190b19wb3J0ID0ge30NCisNCisgICAgQHNldF9ldl9jbHMob2ZwX2V2ZW50LkV2ZW50T0ZQU3dpdGNoRmVhdHVyZXMsIENPTkZJR19ESVNQQVRDSEVSKQ0KKyAgICBkZWYgc3dpdGNoX2ZlYXR1cmVzX2hhbmRsZXIoc2VsZiwgZXYpOg0KKyAgICAgICAgZGF0YXBhdGggPSBldi5tc2cuZGF0YXBhdGgNCisNCisgICAgICAgICMgVGhpcyBkb2VzIG5vdGhpbmcgaWYgZmxvd3MgaGF2ZSBub3QgYmVlbiBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgaW4gdGhlIE9GIGFnZW50DQorICAgICAgICBzZWxmLmRlbF9hbGxfZmxvd3MoZGF0YXBhdGgpDQorDQorICAgICAgICAjIENvbmZpZ3VyZSB0aGUgZmxvd3MgKFZJRCAxMDApDQorICAgICAgICAjDQorICAgICAgICAjIFBvcnRzIDEtMTI4IGFyZSBpbXBsaWNpdGx5IG1hcHBlZCB0byBVTkktMCBvbiBPTlUgMS0+MTI4DQorICAgICAgICAjIFBvcnRzIDEyOSBhbmQgYWJvdmUgYXJlIGltcGxpY2l0bHkgbWFwcGVkIHRvIE9MVCBOTkktMCBhbmQgYWJvdmUNCisgICAgICAgIHNlbGYuYWRkX3ZpZF9mbG93KGRhdGFwYXRoLDEwMDAwLCAxLCAxMjksIDEwMCwgMCkNCisgICAgICAgIHNlbGYuYWRkX3ZpZF9mbG93KGRhdGFwYXRoLDEwMDAxLCAxMjksIDEsIDEwMCwgMCkNCisNCisgICAgICAgIHNsZWVwKDEpDQorICAgICAgICBzZWxmLnNlbmRfYmFycmllcihkYXRhcGF0aCkNCisNCisgICAgICAgIHNsZWVwKDUpDQorICAgICAgICANCisgICAgICAgICMgRGVsZXRlIHRoZSB1cHN0cmVhbSBmbG93DQorICAgICAgICBzZWxmLmRlbF9mbG93KGRhdGFwYXRoLCAxMDAwMCkNCisgICAgICAgICMgVGhlbiBkZWxldGUgdGhlIGRvd25zdHJlYW0gZmxvdw0KKyAgICAgICAgc2VsZi5kZWxfZmxvdyhkYXRhcGF0aCwgMTAwMDEpDQorDQorICAgIEBzZXRfZXZfY2xzKG9mcF9ldmVudC5FdmVudE9GUFBvcnRTdGF0dXMsIE1BSU5fRElTUEFUQ0hFUikNCisgICAgZGVmIHBvcnRfc3RhdHVzX2hhbmRsZXIoc2VsZiwgZXYpOg0KKyAgICAgICAgTE9HLmRlYnVnKCdwb3J0X3N0YXR1c19oYW5kbGVyIHBvcnQgaWQ6ICVkJywgZXYubXNnLmRlc2MucG9ydF9ubykNCisNCisgICAgZGVmIGFkZF9tZXRlcihzZWxmLCBkYXRhcGF0aCwgbWV0ZXJfaWQsIHJhdGUpOg0KKyAgICAgICAgb2Zwcm90byA9IGRhdGFwYXRoLm9mcHJvdG8NCisgICAgICAgIHBhcnNlciA9IGRhdGFwYXRoLm9mcHJvdG9fcGFyc2VyDQorICAgICAgICBiYW5kID0gcGFyc2VyLk9GUE1ldGVyQmFuZERyb3AoYnVyc3Rfc2l6ZT0wLCByYXRlPXJhdGUpDQorICAgICAgICBtb2QgPSBwYXJzZXIuT0ZQTWV0ZXJNb2QoZGF0YXBhdGg9ZGF0YXBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1vZnByb3RvLk9GUE1DX0FERCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M9b2Zwcm90by5PRlBNRl9LQlBTLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRlcl9pZD1tZXRlcl9pZCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHM9W2JhbmRdKQ0KKyAgICAgICAgTE9HLmluZm8oImFkZF9tZXRlcjogbWV0ZXJfaWQ9JWQsIHJhdGU9JWQgS0JQUyIpDQorICAgICAgICBkYXRhcGF0aC5zZW5kX21zZyhtb2QpDQorDQorICAgIGRlZiBhZGRfdmlkX2Zsb3coc2VsZiwgZGF0YXBhdGgsIGNvb2tpZSwgc3JjX3BvcnQsIGRzdF9wb3J0LCB2aWQsIG1ldGVyX2lkKToNCisgICAgICAgIG9mcHJvdG8gPSBkYXRhcGF0aC5vZnByb3RvDQorICAgICAgICBwYXJzZXIgPSBkYXRhcGF0aC5vZnByb3RvX3BhcnNlcg0KKyAgICAgICAgYWN0aW9ucyA9IFtwYXJzZXIuT0ZQQWN0aW9uT3V0cHV0KGRzdF9wb3J0KV0NCisgICAgICAgIGlmIG1ldGVyX2lkICE9IDA6DQorICAgICAgICAgICAgaW5zdCA9IFtwYXJzZXIuT0ZQSW5zdHJ1Y3Rpb25BY3Rpb25zKG9mcHJvdG8uT0ZQSVRfQVBQTFlfQUNUSU9OUyxhY3Rpb25zKSwgcGFyc2VyLk9GUEluc3RydWN0aW9uTWV0ZXIobWV0ZXJfaWQpXQ0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICBpbnN0ID0gW3BhcnNlci5PRlBJbnN0cnVjdGlvbkFjdGlvbnMob2Zwcm90by5PRlBJVF9BUFBMWV9BQ1RJT05TLGFjdGlvbnMpXQ0KKw0KKyAgICAgICAgIyBOT1RFOiAweDEwMDAgaXMgT1InZCBpbnRvIHRoZSB2aWQgdG8gc2V0IHRoZSBPRlBWSURfUFJFU0VOVCBmbGFnIGluIHRoZSBPcGVuRmxvdyBGTE9XX01PRCAoT0ZQRkNfQUREKSANCisgICAgICAgICMgbWVzc2FnZSBtYXRjaCBmaWVsZC4NCisgICAgICAgIG1hdGNoID0gcGFyc2VyLk9GUE1hdGNoKGluX3BvcnQ9c3JjX3BvcnQsIHZsYW5fdmlkPSh2aWQgfCAweDEwMDApKQ0KKyAgICAgICAgbW9kID0gcGFyc2VyLk9GUEZsb3dNb2QoZGF0YXBhdGg9ZGF0YXBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWU9Y29va2llLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZV9tYXNrPTMyNzY3LCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5PTAsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2g9bWF0Y2gsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zPWluc3QpDQorICAgICAgICBMT0cuaW5mbygiYWRkX3ZpZF9mbG93OiBzcmNfcG9ydD0lZCBkc3RfcG9ydD0lZCB2aWQ9JWQgbWV0ZXI9JWQgY29va2llPSVkIiwgDQorICAgICAgICAgICAgICAgICBzcmNfcG9ydCwgZHN0X3BvcnQsIHZpZCwgbWV0ZXJfaWQsIGNvb2tpZSkNCisgICAgICAgIGRhdGFwYXRoLnNlbmRfbXNnKG1vZCkNCisNCisgICAgZGVmIGRlbF9mbG93KHNlbGYsIGRhdGFwYXRoLCBjb29raWUpOg0KKyAgICAgICAgTE9HLmluZm8oImRlbF9mbG93OiBjb29raWU9JWQiLCBjb29raWUpDQorICAgICAgICBzZWxmLl9kZWxfZmxvdyhkYXRhcGF0aCwgY29va2llLCAzMjc2NykNCisNCisgICAgZGVmIGRlbF9hbGxfZmxvd3Moc2VsZiwgZGF0YXBhdGgpOg0KKyAgICAgICAgTE9HLmluZm8oImRlbF9hbGxfZmxvd3MiKQ0KKyAgICAgICAgIyBDb29raWUgMCAoYXJndW1lbnQgMikgdGVsbHMgdGhlIE9GIGFnZW50IHRvIGRlbGV0ZSBhbGwgY29uZmlndXJlZCBmbG93cw0KKyAgICAgICAgc2VsZi5fZGVsX2Zsb3coZGF0YXBhdGgsIDAsIDApDQorDQorICAgIGRlZiBfZGVsX2Zsb3coc2VsZiwgZGF0YXBhdGgsIGNvb2tpZSwgbWFzayk6DQorICAgICAgICBvZnByb3RvID0gZGF0YXBhdGgub2Zwcm90bw0KKyAgICAgICAgcGFyc2VyID0gZGF0YXBhdGgub2Zwcm90b19wYXJzZXINCisgDQorICAgICAgICBtb2QgPSBwYXJzZXIuT0ZQRmxvd01vZCgNCisgICAgICAgICAgICBkYXRhcGF0aD1kYXRhcGF0aCwgbWF0Y2g9Tm9uZSwgY29va2llPWNvb2tpZSwgY29va2llX21hc2s9bWFzaywNCisgICAgICAgICAgICBjb21tYW5kPW9mcHJvdG8uT0ZQRkNfREVMRVRFKQ0KKyAgICAgICAgZGF0YXBhdGguc2VuZF9tc2cobW9kKQ0KKw0KKyAgICBkZWYgc2VuZF9iYXJyaWVyKHNlbGYsIGRhdGFwYXRoKToNCisgICAgICAgIExPRy5pbmZvKCJzZW5kX2JhcnJpZXIiKQ0KKyAgICAgICAgZGF0YXBhdGguc2VuZF9iYXJyaWVyKCkNCisgICAgICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc2NyaXB0cy9yeXUvUE9OX3RvcG9sb2d5XzEwMF9mbG93X2FkZF93aXRoX2RzX21ldGVyLnB5IGIvYmFsX3JlbGVhc2Uvc2NyaXB0cy9yeXUvUE9OX3RvcG9sb2d5XzEwMF9mbG93X2FkZF93aXRoX2RzX21ldGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzNkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zY3JpcHRzL3J5dS9QT05fdG9wb2xvZ3lfMTAwX2Zsb3dfYWRkX3dpdGhfZHNfbWV0ZXIucHkKQEAgLTAsMCArMSwxMjUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExIE5pcHBvbiBUZWxlZ3JhcGggYW5kIFRlbGVwaG9uZSBDb3Jwb3JhdGlvbi4NCisjDQorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMNCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyMNCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCisjIGltcGxpZWQuDQorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitpbXBvcnQgbG9nZ2luZw0KKw0KK2Zyb20gcnl1LmJhc2UgaW1wb3J0IGFwcF9tYW5hZ2VyDQorZnJvbSB0aW1lIGltcG9ydCBzbGVlcA0KK2Zyb20gcnl1LmNvbnRyb2xsZXIgaW1wb3J0IG9mcF9ldmVudA0KK2Zyb20gcnl1LmNvbnRyb2xsZXIuaGFuZGxlciBpbXBvcnQgQ09ORklHX0RJU1BBVENIRVIsIE1BSU5fRElTUEFUQ0hFUg0KK2Zyb20gcnl1LmNvbnRyb2xsZXIuaGFuZGxlciBpbXBvcnQgc2V0X2V2X2Nscw0KK2Zyb20gcnl1Lm9mcHJvdG8gaW1wb3J0IG9mcHJvdG9fdjFfMw0KK2Zyb20gcnl1LmxpYi5wYWNrZXQgaW1wb3J0IHBhY2tldA0KK2Zyb20gcnl1LmxpYi5wYWNrZXQgaW1wb3J0IGV0aGVybmV0DQorZnJvbSByeXUubGliIGltcG9ydCBhZGRyY29udg0KKw0KK0xPRyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdyeXUuYXBwLnBvbl90b3BvbG9neScpDQorDQorY2xhc3MgUG9uVG9wb2xvZ3kxMyhhcHBfbWFuYWdlci5SeXVBcHApOg0KKyAgICBPRlBfVkVSU0lPTlMgPSBbb2Zwcm90b192MV8zLk9GUF9WRVJTSU9OXQ0KKw0KKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCisgICAgICAgIHN1cGVyKFBvblRvcG9sb2d5MTMsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykNCisgICAgICAgIHNlbGYubWFjX3RvX3BvcnQgPSB7fQ0KKw0KKyAgICBAc2V0X2V2X2NscyhvZnBfZXZlbnQuRXZlbnRPRlBTd2l0Y2hGZWF0dXJlcywgQ09ORklHX0RJU1BBVENIRVIpDQorICAgIGRlZiBzd2l0Y2hfZmVhdHVyZXNfaGFuZGxlcihzZWxmLCBldik6DQorICAgICAgICBkYXRhcGF0aCA9IGV2Lm1zZy5kYXRhcGF0aA0KKyAgICAgICAgDQorICAgICAgICAjIFRoaXMgZG9lcyBub3RoaW5nIGlmIGZsb3dzIGhhdmUgbm90IGJlZW4gcHJldmlvdXNseSBjb25maWd1cmVkIGluIHRoZSBPRiBhZ2VudA0KKyAgICAgICAgc2VsZi5kZWxfYWxsX2Zsb3dzKGRhdGFwYXRoKQ0KKyAgICAgICAgDQorICAgICAgICAjIEFkZCBhIG1ldGVyICg1MDAgS2JwcyByYXRlIGxpbWl0KSB3aXRoIGFuIElEIG9mIDExDQorICAgICAgICBzZWxmLmFkZF9tZXRlcihkYXRhcGF0aCwgMTEsIDUwMCkNCisgDQorICAgICAgICAjIENvbmZpZ3VyZSB0aGUgZmxvd3MgIChWSUQgMTAwKSANCisgICAgICAgICMgTm90ZTogdGhlIGRvd25zdHJlYW0gZmxvdyBoYXMgYSBtZXRlciBJRCByZWZlcmVuY2UNCisgICAgICAgICMNCisgICAgICAgICMgUG9ydHMgMS0xMjggYXJlIGltcGxpY2l0bHkgbWFwcGVkIHRvIFVOSS0wIG9uIE9OVXMgMS0+MTI4DQorICAgICAgICAjIFBvcnRzIDEyOSBhbmQgYWJvdmUgYXJlIGltcGxpY2l0bHkgbWFwcGVkIHRvIE9MVCBOTkktMCBhbmQgYWJvdmUNCisgICAgICAgIHNlbGYuYWRkX3ZpZF9mbG93KGRhdGFwYXRoLDEwMDAwLCAxLCAxMjksIDEwMCwgMCkNCisgICAgICAgIHNlbGYuYWRkX3ZpZF9mbG93KGRhdGFwYXRoLDEwMDAxLCAxMjksIDEsIDEwMCwgMTEpDQorDQorICAgICAgICBzbGVlcCgxKQ0KKyAgICAgICAgc2VsZi5zZW5kX2JhcnJpZXIoZGF0YXBhdGgpDQorDQorDQorICAgIEBzZXRfZXZfY2xzKG9mcF9ldmVudC5FdmVudE9GUFBvcnRTdGF0dXMsIE1BSU5fRElTUEFUQ0hFUikNCisgICAgZGVmIHBvcnRfc3RhdHVzX2hhbmRsZXIoc2VsZiwgZXYpOg0KKyAgICAgICAgTE9HLmRlYnVnKCdwb3J0X3N0YXR1c19oYW5kbGVyIHBvcnQgaWQ6ICVkJywgZXYubXNnLmRlc2MucG9ydF9ubykNCisNCisgICAgZGVmIGFkZF9tZXRlcihzZWxmLCBkYXRhcGF0aCwgbWV0ZXJfaWQsIHJhdGUpOg0KKyAgICAgICAgb2Zwcm90byA9IGRhdGFwYXRoLm9mcHJvdG8NCisgICAgICAgIHBhcnNlciA9IGRhdGFwYXRoLm9mcHJvdG9fcGFyc2VyDQorICAgICAgICBiYW5kID0gcGFyc2VyLk9GUE1ldGVyQmFuZERyb3AoYnVyc3Rfc2l6ZT0wLCByYXRlPXJhdGUpDQorICAgICAgICBtb2QgPSBwYXJzZXIuT0ZQTWV0ZXJNb2QoZGF0YXBhdGg9ZGF0YXBhdGgsY29tbWFuZD1vZnByb3RvLk9GUE1DX0FERCwgZmxhZ3M9b2Zwcm90by5PRlBNRl9LQlBTLCBtZXRlcl9pZD1tZXRlcl9pZCwgYmFuZHM9W2JhbmRdKQ0KKyAgICAgICAgTE9HLmluZm8oImFkZF9tZXRlcjogbWV0ZXJfaWQ9JWQsIHJhdGU9JWQgS0JQUyIpDQorICAgICAgICBkYXRhcGF0aC5zZW5kX21zZyhtb2QpDQorDQorICAgIGRlZiBhZGRfdmlkX2Zsb3coc2VsZiwgZGF0YXBhdGgsIGNvb2tpZSwgc3JjX3BvcnQsIGRzdF9wb3J0LCB2aWQsIG1ldGVyX2lkKToNCisgICAgICAgIG9mcHJvdG8gPSBkYXRhcGF0aC5vZnByb3RvDQorICAgICAgICBwYXJzZXIgPSBkYXRhcGF0aC5vZnByb3RvX3BhcnNlcg0KKyAgICAgICAgYWN0aW9ucyA9IFtwYXJzZXIuT0ZQQWN0aW9uT3V0cHV0KGRzdF9wb3J0KV0NCisgICAgICAgIGlmIG1ldGVyX2lkICE9IDA6DQorICAgICAgICAgICAgaW5zdCA9IFtwYXJzZXIuT0ZQSW5zdHJ1Y3Rpb25BY3Rpb25zKG9mcHJvdG8uT0ZQSVRfQVBQTFlfQUNUSU9OUyxhY3Rpb25zKSwgcGFyc2VyLk9GUEluc3RydWN0aW9uTWV0ZXIobWV0ZXJfaWQpXQ0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICBpbnN0ID0gW3BhcnNlci5PRlBJbnN0cnVjdGlvbkFjdGlvbnMob2Zwcm90by5PRlBJVF9BUFBMWV9BQ1RJT05TLGFjdGlvbnMpXQ0KKw0KKyAgICAgICAgIyBOT1RFOiAweDEwMDAgaXMgT1InZCBpbnRvIHRoZSB2aWQgdG8gc2V0IHRoZSBPRlBWSURfUFJFU0VOVCBmbGFnIGluIHRoZSBPcGVuRmxvdyBGTE9XX01PRCAoT0ZQRkNfQUREKSANCisgICAgICAgICMgbWVzc2FnZSBtYXRjaCBmaWVsZC4NCisgICAgICAgIG1hdGNoID0gcGFyc2VyLk9GUE1hdGNoKGluX3BvcnQ9c3JjX3BvcnQsIHZsYW5fdmlkPSh2aWQgfCAweDEwMDApKQ0KKyAgICAgICAgbW9kID0gcGFyc2VyLk9GUEZsb3dNb2QoZGF0YXBhdGg9ZGF0YXBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWU9Y29va2llLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZV9tYXNrPTMyNzY3LCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5PTAsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2g9bWF0Y2gsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zPWluc3QpDQorICAgICAgICBMT0cuaW5mbygiYWRkX3ZpZF9mbG93OiBzcmNfcG9ydD0lZCBkc3RfcG9ydD0lZCB2aWQ9JWQgbWV0ZXI9JWQgY29va2llPSVkIiwgDQorICAgICAgICAgICAgICAgICBzcmNfcG9ydCwgZHN0X3BvcnQsIHZpZCwgbWV0ZXJfaWQsIGNvb2tpZSkNCisgICAgICAgIGRhdGFwYXRoLnNlbmRfbXNnKG1vZCkNCisNCisgICAgZGVmIGRlbF9mbG93KHNlbGYsIGRhdGFwYXRoLCBjb29raWUpOg0KKyAgICAgICAgb2Zwcm90byA9IGRhdGFwYXRoLm9mcHJvdG8NCisgICAgICAgIHBhcnNlciA9IGRhdGFwYXRoLm9mcHJvdG9fcGFyc2VyDQorIA0KKyAgICAgICAgbW9kID0gcGFyc2VyLk9GUEZsb3dNb2QoDQorICAgICAgICAgICAgZGF0YXBhdGg9ZGF0YXBhdGgsIG1hdGNoPU5vbmUsIGNvb2tpZT1jb29raWUsIGNvb2tpZV9tYXNrPTMyNzY3LA0KKyAgICAgICAgICAgIGNvbW1hbmQ9b2Zwcm90by5PRlBGQ19ERUxFVEUpDQorICAgICAgICBMT0cuaW5mbygiZGVsX2Zsb3c6IGNvb2tpZT0lZCIsIGNvb2tpZSkNCisgICAgICAgIGRhdGFwYXRoLnNlbmRfbXNnKG1vZCkNCisNCisgICAgZGVmIGRlbF9hbGxfZmxvd3Moc2VsZiwgZGF0YXBhdGgpOg0KKyAgICAgICAgTE9HLmluZm8oImRlbF9hbGxfZmxvd3MiKQ0KKyAgICAgICAgIyBDb29raWUgMCAoYXJndW1lbnQgMikgdGVsbHMgdGhlIE9GIGFnZW50IHRvIGRlbGV0ZSBhbGwgY29uZmlndXJlZCBmbG93cw0KKyAgICAgICAgc2VsZi5fZGVsX2Zsb3coZGF0YXBhdGgsIDAsIDApDQorDQorICAgIGRlZiBfZGVsX2Zsb3coc2VsZiwgZGF0YXBhdGgsIGNvb2tpZSwgbWFzayk6DQorICAgICAgICBvZnByb3RvID0gZGF0YXBhdGgub2Zwcm90bw0KKyAgICAgICAgcGFyc2VyID0gZGF0YXBhdGgub2Zwcm90b19wYXJzZXINCisgDQorICAgICAgICBtb2QgPSBwYXJzZXIuT0ZQRmxvd01vZChkYXRhcGF0aD1kYXRhcGF0aCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaD1Ob25lLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZT1jb29raWUsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llX21hc2s9bWFzaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9b2Zwcm90by5PRlBGQ19ERUxFVEUpDQorICAgICAgICBkYXRhcGF0aC5zZW5kX21zZyhtb2QpDQorDQorICAgIGRlZiBzZW5kX2JhcnJpZXIoc2VsZiwgZGF0YXBhdGgpOg0KKyAgICAgICAgTE9HLmluZm8oInNlbmRfYmFycmllciIpDQorICAgICAgICBkYXRhcGF0aC5zZW5kX2JhcnJpZXIoKQ0KKyAgICAgICAgICAgICAgICAgICANCisNCisNCisNCisgICAgICAgICAgICAgICAgICAgDQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc2NyaXB0cy90cnhfaW5pdC5zaCBiL2JhbF9yZWxlYXNlL3NjcmlwdHMvdHJ4X2luaXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgwYmZmNgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NjcmlwdHMvdHJ4X2luaXQuc2gKQEAgLTAsMCArMSw2NyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisjICAgCisjICAgICBCcm9hZGNvbSBMdGQuIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20gTHRkLgorIyAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyAgIAorIyAgVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBMdGQuIGFuZC9vciBpdHMKKyMgIGxpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50CisjICB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorIyAgYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIEx0ZC4gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KKyMgIGFuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gTHRkLiBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKKyMgIHRvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbSBMdGQuCisjICBleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCisjICBwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorIyAgTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKKyMgIEJST0FEQ09NIExURCBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisjICAgCisjICBFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIyAgIAorIyAgMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyMgICAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSBMdGQuLCBhbmQgeW91IHNoYWxsIHVzZQorIyAgICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworIyAgICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tIEx0ZC4KKyMgICAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisjICAgCisjICAyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyMgICAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisjICAgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisjICAgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyMgICAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyMgICAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorIyAgICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisjICAgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorIyAgICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyMgICAKKyMgIDMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorIyAgICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyMgICAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyMgICAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorIyAgICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyMgICAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisjICAgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworIyAgICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyMgICAgICBMSU1JVEVEIFJFTUVEWS4KKyMgIDo+CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgCisjIENvbW1hbmRzIHJlcXVpcmVkIHRvIGVuYWJsZSBhbGwgMTYgUE9OIHBvcnRzIG9uIHRoZSBNQVBMRSBkZXZpY2UKKworL2JvYXJkL3RyeF9lbmFibGUgcG9uX2lkPTAKKy9ib2FyZC90cnhfZW5hYmxlIHBvbl9pZD0xCisvYm9hcmQvdHJ4X2VuYWJsZSBwb25faWQ9MgorL2JvYXJkL3RyeF9lbmFibGUgcG9uX2lkPTMKKy9ib2FyZC90cnhfZW5hYmxlIHBvbl9pZD00CisvYm9hcmQvdHJ4X2VuYWJsZSBwb25faWQ9NQorL2JvYXJkL3RyeF9lbmFibGUgcG9uX2lkPTYKKy9ib2FyZC90cnhfZW5hYmxlIHBvbl9pZD03CisvYm9hcmQvdHJ4X2VuYWJsZSBwb25faWQ9OAorL2JvYXJkL3RyeF9lbmFibGUgcG9uX2lkPTkKKy9ib2FyZC90cnhfZW5hYmxlIHBvbl9pZD0xMAorL2JvYXJkL3RyeF9lbmFibGUgcG9uX2lkPTExCisvYm9hcmQvdHJ4X2VuYWJsZSBwb25faWQ9MTIKKy9ib2FyZC90cnhfZW5hYmxlIHBvbl9pZD0xMworL2JvYXJkL3RyeF9lbmFibGUgcG9uX2lkPTE0CisvYm9hcmQvdHJ4X2VuYWJsZSBwb25faWQ9MTUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NjcmlwdHMvdXBncmFkZV9iYWxfcXVtcmFuLnNoIGIvYmFsX3JlbGVhc2Uvc2NyaXB0cy91cGdyYWRlX2JhbF9xdW1yYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGI4YjYxZAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NjcmlwdHMvdXBncmFkZV9iYWxfcXVtcmFuLnNoCkBAIC0wLDAgKzEsOTYgQEAKKyMhL2Jpbi9iYXNoIAorCisjIERlZmluZSBhbGwgQkFMIGFwcHMgdG8gYmUgdXBncmFkZWQgaGVyZQorRklMRUxJU1Q9KCdiY20udXNlcicgJ2xpbnV4LWtlcm5lbC1iZGUua28nICdsaW51eC11c2VyLWJkZS5rbycgJ2JjbTg4NDcwX2JvYXJkLnNvYycgJ2NvbWJvMjhfZHJhbS5zb2MnICdjb25maWcuYmNtJyAnaW5pdC5zaCcgJ3FheC5zb2MnICdyYy5zb2MnKQorI0pFTktJTlNTRVJWRVI9J2plbmtpbnMtdGx2YS0wNi5pbC5icm9hZGNvbS5jb20nCitKRU5LSU5TU0VSVkVSPScxMC4xODcuMTMwLjE3MicKK0lOR19TREtfVkVSPSc2LjUuNicKKworbWtkaXIgLXAgb2xkCisKK0pFTktJTlNQQVRIMT0iaHR0cDovLyR7SkVOS0lOU1NFUlZFUn0vam9iL0JhbC5TeW5jZWQuYmNtLXNkay0ke0lOR19TREtfVkVSfS9sYXN0U3VjY2Vzc2Z1bEJ1aWxkL2FydGlmYWN0L2JhbC9jdXIvIgorSkVOS0lOU0ZJTEUxPSgKKwkJJzNyZHBhcnR5L2JjbS1zZGsvYnVpbGQvc2RrLWFsbC0nJHtJTkdfU0RLX1ZFUn0nL2J1aWxkL2xpbnV4L3VzZXIvd3J4LTNfNy9iY20udXNlcicKKyAgICAgICAgCSczcmRwYXJ0eS9iY20tc2RrL2J1aWxkL3Nkay1hbGwtJyR7SU5HX1NES19WRVJ9Jy9idWlsZC9saW51eC91c2VyL3dyeC0zXzcvbGludXgta2VybmVsLWJkZS5rbycKKyAgICAgICAgCSczcmRwYXJ0eS9iY20tc2RrL2J1aWxkL3Nkay1hbGwtJyR7SU5HX1NES19WRVJ9Jy9idWlsZC9saW51eC91c2VyL3dyeC0zXzcvbGludXgtdXNlci1iZGUua28nCisgICAgICAgIAknM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvYmNtODg0NzBfYm9hcmQuc29jJworCQknM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvY29tYm8yOF9kcmFtLnNvYycKKwkJJzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L2NvbmZpZy5iY20nCisJCSczcmRwYXJ0eS9iY20tc2RrL3JjL3FheC9pbml0LnNoJworCQknM3JkcGFydHkvYmNtLXNkay9yYy9xYXgvcWF4LnNvYycKKwkJJzNyZHBhcnR5L2JjbS1zZGsvcmMvcWF4L3JjLnNvYycKKykKKworCitmdW5jdGlvbiBjb2xvcmVkRWNobygpeworICAgIGxvY2FsIGV4cD0kMTsKKyAgICBsb2NhbCBjb2xvcj0kMjsKKyAgICBpZiAhIFtbICRjb2xvciA9fiAnXlswLTldJCcgXV0gOyB0aGVuCisgICAgICAgY2FzZSAkKGVjaG8gJGNvbG9yIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpIGluCisgICAgICAgIGJsYWNrKSBjb2xvcj0wIDs7CisgICAgICAgIHJlZCkgY29sb3I9MSA7OworICAgICAgICBncmVlbikgY29sb3I9MiA7OworICAgICAgICB5ZWxsb3cpIGNvbG9yPTMgOzsKKyAgICAgICAgYmx1ZSkgY29sb3I9NCA7OworICAgICAgICBtYWdlbnRhKSBjb2xvcj01IDs7CisgICAgICAgIGN5YW4pIGNvbG9yPTYgOzsKKyAgICAgICAgd2hpdGV8KikgY29sb3I9NyA7OyAjIHdoaXRlIG9yIGludmFsaWQgY29sb3IKKyAgICAgICBlc2FjCisgICAgZmkKKyAgICB0cHV0IHNldGFmICRjb2xvcjsKKyAgICBlY2hvICRleHA7CisgICAgdHB1dCBzZ3IwOworfQorCitmdW5jdGlvbiBjaGVja19yZXR1cm4oKXsKKwllY2hvIC1uICIkMS4uLgkiCisJJCgkMikKKwlpZiBbICQ/IC1lcSAwIF07IHRoZW4KKwkJY29sb3JlZEVjaG8gJ1sgT0sgXScgZ3JlZW4KKwllbHNlCisJCWNvbG9yZWRFY2hvICdbIEVSUk9SIF0nIHJlZAorCWZpCit9CisKKyMgQ2hlY2tpbmcgY29ubmVjdGl2aXR5IHRvIEplbmtpbnMgU2VydmVyCitlY2hvIC1uICJWZXJpZmluZyBDb25uZWN0aXZpdHkgdG8gSmVua2lucy4uLgkiCitwaW5nIC1jIDEgJHtKRU5LSU5TU0VSVkVSfSAmPiAvZGV2L251bGwKK2lmIFsgJD8gLWVxIDAgXTsgdGhlbgorCQljb2xvcmVkRWNobyAnWyBPSyBdJyBncmVlbgorCWVsc2UKKwkJY29sb3JlZEVjaG8gJ1sgRVJST1IgXScgcmVkCisJCWVjaG8gJ0Fib3J0aW5nIFVwZ3JhZGUhJworCQlleGl0IDAKKwlmaQorCisjIGRlbGV0ZSBhbnkgb2xkIHZlcnNpb25zCitlY2hvICdEZWxldGluZyBvbGRlciB2ZXJzaW9ucy4uLicKK2ZvciBGSUxFIGluICR7RklMRUxJU1RbQF19CisJZG8KKwkJY2hlY2tfcmV0dXJuICJEZWxldGluZyAke0ZJTEV9Lm9sZCIgInJtIC1mIG9sZC8ke0ZJTEV9Lm9sZCIKKwlkb25lCisKKyMgcmVuYW1lIHRoZSBleGlzdGluZyB2ZXJzaW9ucworZWNobyAnUmVuYW1pbmcgbGFzdCB2ZXJzaW9uIHgub2xkIC4uLicKK2ZvciBGSUxFIGluICR7RklMRUxJU1RbQF19CisJZG8KKwkJY2hlY2tfcmV0dXJuICJNb3ZpbmcgJHtGSUxFfSB0byAke0ZJTEV9Lm9sZCIgIm12ICR7RklMRX0gb2xkLyR7RklMRX0ub2xkIgorCWRvbmUKKworIyBHZXQgdGhlIG5ldyB2ZXJzaW9ucworZWNobyAnRG93bmxvYWRpbmcgSU5HIHZlcnNpb24gJyR7SU5HX1NES19WRVJ9Jy4uLicKK2ZvciBGSUxFIGluICR7SkVOS0lOU0ZJTEUxW0BdfQorCWRvCisJCUNPTU1BTkQ9IndnZXQgLXEgJHtKRU5LSU5TUEFUSDF9JHtGSUxFfSIKKwkJU0hPUlRGSUxFPSQoZWNobyAke0ZJTEV9IHwgc2VkICdzOi4qLzo6JykKKwkJY2hlY2tfcmV0dXJuICJHZXR0aW5nIExhdGVzdCAke1NIT1JURklMRX0iICIke0NPTU1BTkR9IgorCWRvbmUKKworIyBDaGFuZ2luZyBwZXJtaXNzaW9ucyB0byBleGVjdXRhYmxlCitlY2hvICdDaGFuZ2luZyBwZXJtaXNzaW9ucyB0byBleGVjdXRhYmxlLi4uJworZm9yIEZJTEUgaW4gJHtGSUxFTElTVFtAXX0KKwlkbworCQljaGVja19yZXR1cm4gIk1ha2lpbmcgJHtGSUxFfSBleGVjdXRhYmxlIiAiY2htb2QgNzU1ICR7RklMRX0iCisJZG9uZQorCitlY2hvICdVcGdyYWRlIENvbXBsZXRlJwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2FwcHMvYmFsX2NsaS9NYWtlZmlsZSBiL2JhbF9yZWxlYXNlL3NyYy9hcHBzL2JhbF9jbGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjODg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9hcHBzL2JhbF9jbGkvTWFrZWZpbGUKQEAgLTAsMCArMSwzOSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisjICAKKyMgICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorIyAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyAgCisjICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisjICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisjICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyMgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorIyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyMgIAorIyAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorIyAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisjICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisjICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisjICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyMgICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyMgICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisjICAgICBvZiB0aGUgc29mdHdhcmUuCisjICAKKyMgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorIyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisjICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorIyAgd3JpdHRlbiBjb25zZW50LgorIyAgCisjICA6PgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBCQUwgY29yZSBDTEkgYXBwbGljYXRpb24KKyMKK01PRF9OQU1FID0gYmFsX2NsaQorTU9EX0RFUFMgPSBiYWxfY29yZSBkZXZfbG9nIGNsaSBvc19jbGkgYmFsX2FwaV9jbGkgdG9wb2xvZ3kgY21kbGluZQorTU9EX0RFUFNfT1BUID0gb21jaXN2YworTU9EX1RZUEUgPSBhcHAKKworc3JjcyA9IGJhbF9jbGlfYXBwLmMKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9hcHBzL2JhbF9jbGkvYmFsX2NsaV9hcHAuYyBiL2JhbF9yZWxlYXNlL3NyYy9hcHBzL2JhbF9jbGkvYmFsX2NsaV9hcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE2MjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2FwcHMvYmFsX2NsaS9iYWxfY2xpX2FwcC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICoKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQGZpbGUgYmFsX2NsaV9hcHAuYworICogQGJyaWVmIEJBTCBDTEkgYXBwbGljYXRpb24KKyAqIEBhZGR0b2dyb3VwIGN0cmxyCisgKi8KKworLypAeyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiYWxfY29yZS5oPgorI2luY2x1ZGUgPGJhbF9jbGkuaD4KKworI2lmZGVmIE9NQ0lfU1ZDCisjaW5jbHVkZSA8b21jaV9zdmMuaD4KKyNpbmNsdWRlIDxvbWNpX3N2Y19jbGkuaD4KKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgQmFsIENvcmUKKyAqCisgKiAgQSBmdW5jdGlvbiB0byBpbml0aWFsaXplIGFuZCBzdGFydCB0aGUgQmFsIENvcmUuIFRoZSB1c2VyCisgKiAgc3VwcGxpZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhcmUgcHJvY2Vzc2VkLCB0aGUgaW50ZXJuYWwgQ0xJIGlzCisgKiAgaW5pdGlhbGl6ZWQsIGFzIGFyZSBhbGwgb2YgdGhlIGNvbXBvbmVudHMgaW4gdGhlIENvcmUuICBVc2VyIGlucHV0IHRvCisgKiAgdGhlIENMSSBpcyB0aGVuIHByb2Nlc3NlZC4gIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIHVudGlsIHRoZQorICogIHVzZXIgcXVpdHMgdGhlIENMSSwgYXQgd2hpY2ggdGltZSB0aGUgQkFMIGNvcmUgdGVybWluYXRlcyBvcGVyYXRpb24uCisgKgorICogIEVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFyZSBjb25zaWRlcmVkCisgKiAgdG8gYmUgZmF0YWwuCisgKgorICogQHBhcmFtIGFyZ2MgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGNvdW50CisgKgorICogQHBhcmFtIGFyZ3YgcG9pbnRlciB0byBjb21tYW5kIGxpbmUgYXJndW1lbnQgbGlzdAorICoKKyAqIEByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLUVJTlZBTCB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBiY21vc19lcnJubyByZXQ7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogSW5pdCBCQUwgY29tcG9uZW50cyAqLworICAgICAgICByZXQgPSBiY21iYWxfaW5pdF9hbGwoYXJnYywgYXJndiwgTlVMTCk7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIEV4ZWN1dGUgaW5pdCBzY3JpcHQgaWYgYW55ICovCisgICAgICAgIHJldCA9IGJjbWJhbF9jbGlfZXhlY19pbml0X3NjcmlwdCgpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBMZXQgZXZlcnl0aGluZyBydW4gdW50aWwgQ0xJIHRlcm1pbmF0ZXMgKi8KKyAgICAgICAgd2hpbGUgKCFiY21iYWxfY2xpX2lzX3Rlcm1pbmF0ZWQoKSkKKyAgICAgICAgICAgIGJjbW9zX3VzbGVlcCgxMDAwMDAwKTsKKyAgICB9CisgICAgd2hpbGUgKDApOworCisgICAgLyogQ2xlYW51cCAqLworICAgIGJjbWJhbF9jbGlfZmluaXNoKCk7CisgICAgYmNtYmFsX2ZpbmlzaCgpOworICAgIGJjbW9zX2V4aXQoKTsKKworICAgIHJldHVybiAoQkNNX0VSUl9PSyA9PSByZXQpID8gMCA6IC0xOworfQorCisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9iYWxfYXBwX3V0aWxzL01ha2VmaWxlIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9iYWxfYXBwX3V0aWxzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NTFiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2JhbF9hcHBfdXRpbHMvTWFrZWZpbGUKQEAgLTAsMCArMSwzNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisjICAKKyMgICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorIyAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyAgCisjICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisjICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisjICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyMgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorIyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyMgIAorIyAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorIyAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisjICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisjICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisjICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyMgICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyMgICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisjICAgICBvZiB0aGUgc29mdHdhcmUuCisjICAKKyMgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorIyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisjICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorIyAgd3JpdHRlbiBjb25zZW50LgorIyAgCisjICA6PgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21tb24gdXRpbGl0aWVzCisjCitNT0RfTkFNRSA9IGJhbF9hcHBfdXRpbHMKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGRldl9sb2cgbWFwbGVfc2RrCitzcmNzID0gYmFsX2FwcF9jb21tb25fdXRpbHMuYwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9iYWxfYXBwX3V0aWxzL2JhbF9hcHBfY29tbW9uX3V0aWxzLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2JhbF9hcHBfdXRpbHMvYmFsX2FwcF9jb21tb25fdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Mzg5NGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9iYWxfYXBwX3V0aWxzL2JhbF9hcHBfY29tbW9uX3V0aWxzLmMKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX2FwcF9jb21tb25fdXRpbHMuYworICogQGJyaWVmIEJBTCBhcHAgY29tbW9uIFV0aWxpdGllcyBmdW5jdGlvbmFsaXR5CisgKgorICogQGFkZHRvZ3JvdXAgdXRpbAorICovCisKKy8qQHsqLworCisjaW5jbHVkZSAiYmFsX2FwcF9jb21tb25fdXRpbHMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisqIEBicmllZiBhcHBfdXRpbF9wYXJzZV9pcF9wb3J0CisqCisqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHBhcnNlIHRoZSB1c2VyIHN1cHBsaWVkIElQIGFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlCisqIHJlbW90ZSBNQUMgZGV2aWNlLgorKgorKiBAcGFyYW0gaXBfcG9ydCAgICAgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgSVA6cG9ydCB0byBwYXJzZQorKgorKiBAcGFyYW0gaXAgICAgICAgICAgVGhlIElQIGFkZHJlc3MgdGhhdCByZXN1bHRzIGZyb20gdGhlIHBhcnNpbmcgZnVuY3Rpb24KKyoKKyogQHBhcmFtIHBvcnQgICAgICAgIFRoZSBwb3J0IHRoYXQgcmVzdWx0cyBmcm9tIHRoZSBwYXJzaW5nIGZ1bmN0aW9uCisqCisqIEByZXR1cm4gYmNtb3NfZXJybm8KKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBhcHBfdXRpbF9wYXJzZV9pcF9wb3J0KGNvbnN0IGNoYXIgKmlwX3BvcnQsIHVpbnQzMl90ICppcCwgdWludDE2X3QgKnBvcnQpCit7CisgICAgaW50IG47CisgICAgdWludDMyX3QgaXAxLCBpcDIsIGlwMywgaXA0LCBwcDsKKworICAgIGlmICghaXBfcG9ydCkKKyAgICB7CisgICAgICAgIGJjbW9zX3ByaW50ZigiRVJSOiBpcF9wb3J0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBuID0gc3NjYW5mKGlwX3BvcnQsICIldS4ldS4ldS4ldToldSIsICZpcDEsICZpcDIsICZpcDMsICZpcDQsICZwcCk7CisgICAgaWYgKG4gIT0gNSB8fCBpcDEgPiAweGZmIHx8IGlwMiA+IDB4ZmYgfHwgaXAzID4gMHhmZiB8fCBpcDQgPiAweGZmIHx8IHBwID4gMHhmZmZmKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCJFUlI6IENhbid0IHBhcnNlICVzLiBNdXN0IGJlIGlwX2FkZHJlc3M6cG9ydFxuIiwgaXBfcG9ydCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgICppcCA9IChpcDEgPDwgMjQpIHwgKGlwMiA8PCAxNikgfCAoaXAzIDw8IDgpIHwgaXA0OworICAgICpwb3J0ID0gcHA7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qQH0qLworCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2JhbF9hcHBfdXRpbHMvYmFsX2FwcF9jb21tb25fdXRpbHMuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vYmFsX2FwcF91dGlscy9iYWxfYXBwX2NvbW1vbl91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkYjFiOWYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2JhbF9hcHBfdXRpbHMvYmFsX2FwcF9jb21tb25fdXRpbHMuaApAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfYXBwX2NvbW1vbl91dGlscy5oCisgKiBAYnJpZWYgQkFMIFV0aWxpdGllcyBpbmNsdWRlIGZpbGUKKyAqCisgKiBAZGVmZ3JvdXAgdXRpbCBCYWwgQXBwIFV0aWwgUm91dGluZXMKKyAqIEBpbmdyb3VwIGxpYgorICovCisKKyNpZm5kZWYgX0JBTF9DT01NT05fVVRJTFNfSAorI2RlZmluZSBfQkFMX0NPTU1PTl9VVElMU19ICisKKy8qQHsqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiYWxfbXNnLmg+CisjaW5jbHVkZSA8YmFsX3V0aWxzX21zZy5oPgorI2luY2x1ZGUgPGJhbF9tc2dfdHlwZS5oPgorI2luY2x1ZGUgPGJhbF9vYmpzLmg+CisKK2JjbW9zX2Vycm5vIGFwcF91dGlsX3BhcnNlX2lwX3BvcnQoY29uc3QgY2hhciAqaXBfcG9ydCwgdWludDMyX3QgKmlwLCB1aW50MTZfdCAqcG9ydCk7CisKKy8qQH0qLworCisjZW5kaWYgLyogX0JBTF9DT01NT05fVVRJTFNfSCovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2NsaSBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vY2xpCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjg1NzNjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2NsaQpAQCAtMCwwICsxIEBACisuLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9yZWZlcmVuY2UvY2xpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9jb25maWcvYmNtX2NvbmZpZy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9jb25maWcvYmNtX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMjFjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2NvbmZpZy9iY21fY29uZmlnLmgKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKyNpZm5kZWYgQkNNT0xUX0NPTkZJR19IXworI2RlZmluZSBCQ01PTFRfQ09ORklHX0hfCisKKy8qKiBcZGVmZ3JvdXAgY29uZmlnIENvbmZpZ3VyYXRpb24gQ29uc3RhbnRzCisgKiBDb25maWd1cmF0aW9uIGNvbnN0YW50cyB0aGF0IG11c3QgYmUgcmV2aXNlZCBieSBjdXN0b21lcgorICogQHsKKyAqLworCisjZGVmaW5lIEJDTVRSX01BWF9PTFRTICAgICAgICAgICAgIDEgICAgICAvKio8IE1heCBudW1iZXIgb2YgT0xUcyAqLworCisvKiogQH0gKi8KKworCisjZW5kaWYgLyogQkNNT0xUX0NPTkZJR19IXyAqLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9kYl9lbmdpbmUvTWFrZWZpbGUgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2RiX2VuZ2luZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2I2NGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9kYl9lbmdpbmUvTWFrZWZpbGUKQEAgLTAsMCArMSwzNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisjICAKKyMgICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorIyAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyAgCisjICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisjICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisjICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyMgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorIyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyMgIAorIyAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorIyAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisjICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisjICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisjICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyMgICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyMgICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisjICAgICBvZiB0aGUgc29mdHdhcmUuCisjICAKKyMgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorIyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisjICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorIyAgd3JpdHRlbiBjb25zZW50LgorIyAgCisjICA6PgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEYXRhIEJhc2UgZW5naW5lCisjCitNT0RfTkFNRSA9IGRiCitNT0RfVFlQRSA9IGxpYgorCitzcmNzID0gYmNtX2RiX2VuZ2luZS5jCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2RiX2VuZ2luZS9iY21fZGJfZW5naW5lLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2RiX2VuZ2luZS9iY21fZGJfZW5naW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0ZjE5YQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vZGJfZW5naW5lL2JjbV9kYl9lbmdpbmUuYwpAQCAtMCwwICsxLDE2MDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKgorICogRGF0YSBCYXNlIEVuZ2luZQorICoKKyAqIFByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwuCisgKi8KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fZGJfZW5naW5lLmg+CisKKy8qIERCIHRyYWNlIGxldmVsICovCitiY21vc190cmFjZV9sZXZlbCBiY21kYl90cmFjZV9sZXZlbCA9IEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SOworCisjZGVmaW5lIEJDTURCX1RSQUNFKGxldmVsLCBmbXQsIGFyZ3MuLi4pICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChsZXZlbCA8PSBiY21kYl90cmFjZV9sZXZlbCkgICAgIFwKKyAgICAgICAgICAgICBiY21vc190cmFjZShsZXZlbCwgIiVzIyVkPiAiIGZtdCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyMgYXJncyk7ICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBQcmludCBlcnJvciB0cmFjZSBjb25kaXRpb25hbGx5LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwgKi8KKyNkZWZpbmUgQkNNREJfVFJBQ0VfRVJST1IoZm10LCBhcmdzLi4uKSAgICAgICAgXAorICAgIEJDTURCX1RSQUNFKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiREIgRVJSOiAlcyMlZD4gIiBmbXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjIGFyZ3MpCisKKy8qIFByaW50IHdhcm5pbmcgdHJhY2UgY29uZGl0aW9uYWxseSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsICovCisjZGVmaW5lIEJDTURCX1RSQUNFX1dBUk5JTkcoZm10LCBhcmdzLi4uKSAgICAgICAgXAorICAgIEJDTURCX1RSQUNFKEJDTU9TX1RSQUNFX0xFVkVMX1dBUk5JTkcsICJEQiBXQVJOOiAlcyMlZD4gIiBmbXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjIGFyZ3MpCisKKy8qIFByaW50IGluZm8gdHJhY2UgY29uZGl0aW9uYWxseSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsICovCisjZGVmaW5lIEJDTURCX1RSQUNFX0lORk8oZm10LCBhcmdzLi4uKSAgICAgICAgXAorICAgIEJDTURCX1RSQUNFKEJDTU9TX1RSQUNFX0xFVkVMX0lORk8sICJEQiBJTkZPOiAlcyMlZD4gIiBmbXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjIGFyZ3MpCisKKy8qIEVuYWJsZSBkZWJ1ZyBwcmludHMgKi8KKyNkZWZpbmUgQkNNREJfREVCVUcKKworI2lmZGVmIEJDTURCX0RFQlVHCisKKy8qIFByaW50IGRlYnVnIHRyYWNlIGNvbmRpdGlvbmFsbHksIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCB0cmFjZSBsZXZlbCAqLworI2RlZmluZSBCQ01EQl9UUkFDRV9ERUJVRyhmbXQsIGFyZ3MuLi4pICAgICAgICBcCisgICAgQkNNREJfVFJBQ0UoQkNNT1NfVFJBQ0VfTEVWRUxfREVCVUcsICJEQiBEQkc6ICVzIyVkPiAiIGZtdCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyMgYXJncykKKworI2Vsc2UKKworI2RlZmluZSBCQ01EQl9UUkFDRV9ERUJVRyhmbXQsIGFyZ3MuLi4pCisKKyNlbmRpZgorCisKKworLyoqIERhdGEgYmFzZSBlbnRyeQorICogXGluZ3JvdXAgYmNtZGIKKyAqLworc3RydWN0IGJjbWRiX2VudHJ5Cit7CisgICAgdm9pZCAqZGF0YTsgICAgICAgLyogU2V0IG9yIHJlY29yZCAqLworICAgIHVpbnQ4X3QgZmxhZ3M7CisjZGVmaW5lIEJDTURCX0ZMQUdfVkFMSUQgICAgMHgwMSAgLyoqPCBFbnRyeSBpcyB2YWxpZCAqLworI2RlZmluZSBCQ01EQl9GTEFHX1JFQ09SRCAgIDB4MDIgIC8qKjwgUmVjb3JkICovCisjZGVmaW5lIEJDTURCX0ZMQUdfU09TICAgICAgMHgxMCAgLyoqPCBTZXQgb2Ygc2V0cyAqLworICAgIHVpbnQ4X3QgcmVhZF9jb3VudDsKKyAgICB1aW50OF90IHdyaXRlX3BlbmRpbmc7CisgICAgdWludDhfdCBmZnU7Cit9OworCisvKiogU2V0L1JlY29yZCBjaGFuZ2Ugbm90aWZpY2F0aW9uCisgKiBcaW5ncm91cCBiY21kYgorICovCit0eXBlZGVmIHN0cnVjdCBiY21kYl9ub3RpZnkKK3sKKyAgICBzdHJ1Y3QgYmNtZGJfbm90aWZ5ICpuZXh0OworICAgIGJjbWRiX25vdGlmeV9jYiBjYjsKKyAgICBsb25nIGNiX3ByaXY7Cit9IGJjbWRiX25vdGlmeTsKKworLyoqIERhdGEgQmFzZSBTZXQgY29udHJvbCBibG9jaworICogXGluZ3JvdXAgYmNtZGIKKyAqLworc3RydWN0IGJjbWRiX3NldAoreworICAgIGJjbWRiX2VudHJ5IGVudHJ5OyAgICAgICAgLyoqPCBDb21tb24gZmllbGRzIGZvciBzZXQgYW5kIHJlY29yZCAqLworICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAvKio8IFNldCBuYW1lICovCisgICAgYmNtZGJfc2V0ICpwYXJlbnQ7ICAgICAgICAvKio8IFNldCBwYXJlbnQgKi8KKyAgICBiY21kYl9rZXkgbXlfa2V5OyAgICAgICAgIC8qKjwgS2V5IGluIHRoZSBwYXJlbnQgc2V0ICovCisgICAgaW50IG1heF9lbnRyaWVzOyAgICAgICAgICAgIC8qKjwgTWF4IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2V0LiAtMT1pbmxpbWl0ZWQgKi8KKyAgICBpbnQgbnVtX2VudHJpZXM7ICAgICAgICAgICAgLyoqPCBDdXJyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2V0ICovCisgICAgaW50IGVudHJ5X3NpemU7ICAgICAgICAgICAgIC8qKjwgU2V0IGVudHJ5IHNpemUuICovCisgICAgaW50IG1hZ2ljOyAgICAgICAgICAgICAgICAgIC8qKjwgTWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEJDTURCX01BR0lDX0FDVElWRV9TRVQgICAgICAgICAoKCdhJzw8MjQpIHwgKCdzJzw8MTYpIHwgKCdlJzw8OCkgfCAndCcpCisjZGVmaW5lIEJDTURCX01BR0lDX0ZSRUVfU0VUICAgICAgICAgICAoKCdmJzw8MjQpIHwgKCdzJzw8MTYpIHwgKCdlJzw8OCkgfCAndCcpCisKKyAgICAvKiogR2V0IG5leHQgZWxlbWVudCAqLworICAgIGJjbWRiX2tleSAoKmVudHJ5X2dldF9uZXh0KShjb25zdCBiY21kYl9zZXQgKnRoaXMsIGJjbWRiX2tleSBjdXIpOworCisgICAgLyoqIEFkZCBuZXcgZW50cnkuIHJldHVybnMgMCBpZiBvayAqLworICAgIGludCAoKmVudHJ5X25ldykoYmNtZGJfc2V0ICp0aGlzLCBiY21kYl9rZXkga2V5LCBjb25zdCB2b2lkICpkYXRhKTsKKworICAgIC8qKiBEZWxldGUgZW50cnkgKi8KKyAgICBpbnQgKCplbnRyeV9kZWxldGUpKGJjbWRiX3NldCAqdGhpcywgYmNtZGJfZW50cnkgKmVudHJ5KTsKKworICAgIC8qCisgICAgICogSGFuZGxlIOKAkyBrZXkgbWFwcGluZworICAgICAqLworCisgICAgLyoqIENvbnZlcnQgZW50cnkgaGFuZGxlIHRvIGVudHJ5IGtleSAqLworICAgIGJjbWRiX2tleSAoKmhhbmRsZV90b19rZXkpKGNvbnN0IGJjbWRiX3NldCAqdGhpcywgY29uc3QgYmNtZGJfZW50cnkgKmVudHJ5KTsKKworICAgIC8qKiBDb252ZXJ0IGVudHJ5IGtleSB0byBlbnRyeSBoYW5kbGUgKi8KKyAgICBiY21kYl9lbnRyeSAqKCprZXlfdG9faGFuZGxlKShjb25zdCBiY21kYl9zZXQgKnRoaXMsIGJjbWRiX2tleSBrZXkpOworCisgICAgLyoKKyAgICAgKiBTZXQvUmVjb3JkIGxvY2tpbmcKKyAgICAgKiBlbnRyeSBpcyBoYW5kbGUgb2YgdGhlIHNldCBvciByZWNvcmQgdG8gYmUgbG9ja2VkL3VubG9ja2VkCisgICAgICovCisKKyAgICAvKiogTG9jayB0aGUgd2hvbGUgc2V0IGZvciByZWFkaW5nICovCisgICAgdm9pZCAoKmxvY2tfc2V0X3JlYWQpKGJjbWRiX3NldCAqc2V0KTsKKworICAgIC8qKiBVbmxvY2sgc2V0IGxvY2tlZCBmb3IgcmVhZGluZyAqLworICAgIHZvaWQgKCp1bmxvY2tfc2V0X3JlYWQpKGJjbWRiX3NldCAqc2V0KTsKKworICAgIC8qKiBMb2NrIHRoZSB3aG9sZSBzZXQgZm9yIHVwZGF0ZSAqLworICAgIGxvbmcgKCpsb2NrX3NldF9tb2RpZnkpKGJjbWRiX3NldCAqc2V0KTsKKworICAgIC8qKiBVbmxvY2sgc2V0IGxvY2tlZCBmb3IgdXBkYXRlICovCisgICAgdm9pZCAoKnVubG9ja19zZXRfbW9kaWZ5KShiY21kYl9zZXQgKnNldCwgbG9uZyBmYXN0bG9ja19mbGFncyk7CisKKyAgICAvKiogTG9jayB0aGUgc2V0IHJlY3Vyc2l2ZWx5IGZvciB1cGRhdGUgKFNvUyBvbmx5KSAqLworICAgIHZvaWQgKCpsb2NrX3NldF9yZWN1cnNpdmVseV9tb2RpZnkpKGJjbWRiX3NldCAqc2V0KTsKKworICAgIC8qKiBVbmxvY2sgcmVjdXJzaXZlbHkgc2V0IGxvY2tlZCBmb3IgdXBkYXRlIChTb1Mgb25seSkgICovCisgICAgdm9pZCAoKnVubG9ja19zZXRfcmVjdXJzaXZlbHlfbW9kaWZ5KShiY21kYl9zZXQgKnNldCk7CisKKyAgICAvKiogTG9jayByZWNvcmQgZm9yIHJlYWRpbmcgKi8KKyAgICB2b2lkICooKmxvY2tfcmVjb3JkX3JlYWQpKGJjbWRiX3NldCAqc2V0LCBiY21kYl9rZXkga2V5KTsKKworICAgIC8qKiBSZWxlYXNlIHJlYWQgbG9jayAqLworICAgIHZvaWQgKCp1bmxvY2tfcmVjb3JkX3JlYWQpKGJjbWRiX3NldCAqc2V0LCBiY21kYl9rZXkga2V5KTsKKworICAgIC8qKiBMb2NrIHJlY29yZCBmb3IgbW9kaWZpY2F0aW9uLiAqLworICAgIHZvaWQgKigqbG9ja19yZWNvcmRfd3JpdGUpKGJjbWRiX3NldCAqc2V0LCBiY21kYl9rZXkga2V5LCBpbnQgaXNfZGVsZXRpb24pOworCisgICAgLyoqIFJlbGVhc2UgbW9kaWZ5IGxvY2sgKi8KKyAgICB2b2lkICgqdW5sb2NrX3JlY29yZF93cml0ZSkoYmNtZGJfc2V0ICpzZXQsIGludCBpc19kZWxldGlvbiwgaW50IGlzX2NhbmNlbGxhdGlvbik7CisKKyAgICAvKiogRm9ybWF0IGZ1bmN0aW9uIHRoYXQgY29udmVydHMgcmVjb3JkIGRhdGEgdG8gaHVtYW4tcmVhZGFibGUgZm9ybSAqLworICAgIGJjbWRiX2Zvcm1hdF9jYiBmb3JtYXQ7CisKKyAgICAvKiogVXBkYXRlIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20uXG4KKyAgICAgKiBOb3RlIHRoYXQgbm90aWZpY2F0aW9uIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJlZm9yZSB0aGUgYWN0dWFsIHVwZGF0ZSBvZiB0aGUgZGF0YSBiYXNlLCBzbyB0aGF0CisgICAgICogdGhlcmUgaXMgYW4gb3B0aW9uIHRvIGFib3J0IHRoZSB1cGRhdGUgaWYgbmVlZGVkLgorICAgICAqLworICAgIGJjbWRiX25vdGlmeSAqbm90aWZ5X2xpc3RfaGVhZDsKKworICAgIC8qKiBTaGFkb3cgZGF0YSByZWNvcmQgKi8KKyAgICB2b2lkICpzaGFkb3dfZGF0YTsKKworICAgIC8qKiBob2xkcyB0aGUgcG9pbnRlciB0byBhIHdyaXRlLWxvY2tlZCBlbnRyeSAqLworICAgIGJjbWRiX2VudHJ5ICp3cml0ZV9sb2NrZWRfZW50cnkgOworCisgICAgLyoqIG11dGV4IHRoYXQgcHJldmVudHMgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHVwZGF0ZXMgKi8KKyAgICBiY21vc19tdXRleCBtdXRleF91cGRhdGU7CisKKyAgICAvKiogc2VtYXBob3JlIHRoYXQgaG9sZHMgdXBkYXRlIHdoaWxlIHRoZXJlIGFyZSB1bmZpbmlzaGVkIHJlYWRzICovCisgICAgYmNtb3Nfc2VtIHNlbV93YWl0X3JlYWRfdG9fZmluaXNoOworCisgICAgLyoqIGZhc3Rsb2NrICovCisgICAgYmNtb3NfZmFzdGxvY2sgZmFzdGxvY2s7Cit9OworCisKKy8qKjwgRGF0YSBiYXNlIHJlY29yZAorICogXGluZ3JvdXAgYmNtZGIKKyAqLworc3RydWN0IGJjbWRiX3JlY29yZAoreworICAgIHN0cnVjdCBiY21kYl9lbnRyeSBlOyAgICAgICAvKio8IEVudHJ5IC0gY29tbW9uIHBhcnQgZm9yIHNldCBhbmQgcmVjb3JkICovCit9OworCisvKgorICogREIgYmFja2VuZCBjYWxsYmFja3MKKyAqLworCisvKgorICogQXJyYXktYmFzZWQgYmFja2VuZAorICovCisKKy8qKiBHZXQgbmV4dCBlbGVtZW50ICovCitzdGF0aWMgYmNtZGJfa2V5IF9iY21kYl9hcnJheV9lbnRyeV9nZXRfbmV4dChjb25zdCBiY21kYl9zZXQgKnRoaXMsIGJjbWRiX2tleSBrZXkpCit7CisgICAgQlVHX09OKCF0aGlzLT5lbnRyeS5kYXRhKTsKKworICAgIGlmIChrZXkgPCAwKQorICAgICAgICBrZXkgPSAwOworICAgIGVsc2UKKyAgICAgICAgKytrZXk7CisKKyAgICB3aGlsZSgodW5zaWduZWQpa2V5PHRoaXMtPm1heF9lbnRyaWVzKQorICAgIHsKKyAgICAgICAgYmNtZGJfZW50cnkgKmVudHJ5ID0gKGJjbWRiX2VudHJ5ICopdGhpcy0+ZW50cnkuZGF0YSArIGtleTsKKyAgICAgICAgaWYgKChlbnRyeS0+ZmxhZ3MgJiBCQ01EQl9GTEFHX1ZBTElEKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICArK2tleTsKKyAgICB9CisKKyAgICBpZiAoKHVuc2lnbmVkKWtleSA+PSB0aGlzLT5tYXhfZW50cmllcykKKyAgICAgICAgcmV0dXJuIEJDTURCX0tFWV9OT19NT1JFOyAgLyogbm8gbW9yZSAqLworCisgICAgcmV0dXJuIGtleTsKK30KKworLyoKKyAqIEhhbmRsZSDigJMga2V5IG1hcHBpbmcKKyAqLworCisvKiogQ29udmVydCBlbnRyeSBoYW5kbGUgdG8gZW50cnkga2V5ICovCitzdGF0aWMgaW5saW5lIGJjbWRiX2tleSBfYmNtZGJfYXJyYXlfaGFuZGxlX3RvX2tleShjb25zdCBiY21kYl9zZXQgKnRoaXMsIGNvbnN0IGJjbWRiX2VudHJ5ICplbnRyeSkKK3sKKyAgICBiY21kYl9rZXkga2V5OworCisgICAgQlVHX09OKCF0aGlzKTsKKyAgICBCVUdfT04oIWVudHJ5KTsKKyAgICBCVUdfT04oIXRoaXMtPm1hZ2ljID09IEJDTURCX01BR0lDX0FDVElWRV9TRVQpOworICAgIEJVR19PTighdGhpcy0+ZW50cnkuZGF0YSk7CisKKyAgICBrZXkgPSBlbnRyeSAtIChiY21kYl9lbnRyeSAqKXRoaXMtPmVudHJ5LmRhdGE7CisgICAgaWYgKCh1bnNpZ25lZClrZXkgPj0gdGhpcy0+bWF4X2VudHJpZXMpCisgICAgICAgIHJldHVybiBCQ01EQl9LRVlfSU5WQUw7CisKKyAgICByZXR1cm4ga2V5OworfQorCisKKy8qKiBDb252ZXJ0IGVudHJ5IGtleSB0byBlbnRyeSBoYW5kbGUgKi8KK3N0YXRpYyBpbmxpbmUgYmNtZGJfZW50cnkgKl9iY21kYl9hcnJheV9rZXlfdG9faGFuZGxlKGNvbnN0IGJjbWRiX3NldCAqdGhpcywgYmNtZGJfa2V5IGtleSkKK3sKKyAgICBCVUdfT04oIXRoaXMpOworICAgIEJVR19PTighdGhpcy0+bWFnaWMgPT0gQkNNREJfTUFHSUNfQUNUSVZFX1NFVCk7CisgICAgQlVHX09OKCF0aGlzLT5lbnRyeS5kYXRhKTsKKworICAgIGlmICgodW5zaWduZWQgbG9uZylrZXkgPj0gdGhpcy0+bWF4X2VudHJpZXMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIChiY21kYl9lbnRyeSAqKXRoaXMtPmVudHJ5LmRhdGEgKyBrZXk7Cit9CisKKworLyoqIHNlbS1iYXNlZCBzZXQgcmVhZC1sb2NrICovCitzdGF0aWMgdm9pZCBiY21kYl9zZXRfbG9ja19yZWFkX3NlbShiY21kYl9zZXQgKnNldCkKK3sKKyAgICBiY21vc19tdXRleF9sb2NrKCZzZXQtPm11dGV4X3VwZGF0ZSwgQkNNT1NfV0FJVF9GT1JFVkVSKTsKK30KKworCisvKiogc2VtLWJhc2VkIHNldCByZWFkLXVubG9jayAqLworc3RhdGljIHZvaWQgYmNtZGJfc2V0X3VubG9ja19yZWFkX3NlbShiY21kYl9zZXQgKnNldCkKK3sKKyAgICBiY21vc19tdXRleF91bmxvY2soJnNldC0+bXV0ZXhfdXBkYXRlKTsKK30KKworCisvKiogc2VtLWJhc2VkIHNldCBtb2RpZnktbG9jayAqLworc3RhdGljIGxvbmcgYmNtZGJfc2V0X2xvY2tfbW9kaWZ5X3NlbShiY21kYl9zZXQgKnNldCkKK3sKKyAgICBiY21vc19tdXRleF9sb2NrKCZzZXQtPm11dGV4X3VwZGF0ZSwgQkNNT1NfV0FJVF9GT1JFVkVSKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKiogc2VtLWJhc2VkIHNldCBtb2RpZnktdW5sb2NrICovCitzdGF0aWMgdm9pZCBiY21kYl9zZXRfdW5sb2NrX21vZGlmeV9zZW0oYmNtZGJfc2V0ICpzZXQsIGxvbmcgZmFzdGxvY2tfZmxhZ3MpCit7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZzZXQtPm11dGV4X3VwZGF0ZSk7Cit9CisKKworLyoqIGhlbHBlciBmdW5jdGlvbiB3aGljaCByZWN1cnNpdmVseSBsb2NrcyBhbGwgc3Vic2V0cyBvZiBTb1MKKyAqICBmb3IgbW9kaWZ5ICovCitzdGF0aWMgdm9pZCBiY21kYl9yZWN1cnNpdmVfc3Vic2V0c19sb2NrX21vZGlmeShiY21kYl9zZXQgKnNvcykKK3sKKyAgICBpbnQga2V5OworICAgIGludCBsZWZ0X2VudHJpZXMgPSBzb3MtPm51bV9lbnRyaWVzOworICAgIGJjbWRiX2VudHJ5ICplbnRyeTsKKyAgICBiY21kYl9zZXQgKnN1YnNldDsKKworICAgIEJVR19PTighKHNvcy0+ZW50cnkuZmxhZ3MgJiBCQ01EQl9GTEFHX1NPUykpOworCisgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBzb3MtPm1heF9lbnRyaWVzOyArK2tleSkKKyAgICB7CisgICAgICAgIGVudHJ5ID0gc29zLT5rZXlfdG9faGFuZGxlKHNvcywga2V5KTsKKworICAgICAgICBpZiAoKGVudHJ5LT5mbGFncyAmIEJDTURCX0ZMQUdfVkFMSUQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdWJzZXQgPSAoYmNtZGJfc2V0ICopZW50cnktPmRhdGE7CisgICAgICAgICAgICBzdWJzZXQtPmxvY2tfc2V0X3JlY3Vyc2l2ZWx5X21vZGlmeShzdWJzZXQpOworCisgICAgICAgICAgICAtLWxlZnRfZW50cmllczsKKyAgICAgICAgICAgIC8qIGlmIHdlIGhhbmRsZWQgYWxsIHN1YnNldHMgd2UgY2FuIGJyZWFrIHRoZSAiZm9yIiAqLworICAgICAgICAgICAgaWYgKGxlZnRfZW50cmllcz09MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisvKiogaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHJlY3Vyc2l2ZWx5IHVubG9ja3MgYWxsIHN1YnNldHMgb2YgU29TCisgKiAgZm9yIG1vZGlmeSAqLworc3RhdGljIHZvaWQgYmNtZGJfcmVjdXJzaXZlX3N1YnNldHNfdW5sb2NrX21vZGlmeShiY21kYl9zZXQgKnNvcykKK3sKKyAgICBpbnQga2V5OworICAgIGludCBsZWZ0X2VudHJpZXMgPSBzb3MtPm51bV9lbnRyaWVzOworICAgIGJjbWRiX2VudHJ5ICplbnRyeTsKKyAgICBiY21kYl9zZXQgKnN1YnNldDsKKworICAgIEJVR19PTighKHNvcy0+ZW50cnkuZmxhZ3MgJiBCQ01EQl9GTEFHX1NPUykpOworCisgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBzb3MtPm1heF9lbnRyaWVzOyArK2tleSkKKyAgICB7CisgICAgICAgIGVudHJ5ID0gc29zLT5rZXlfdG9faGFuZGxlKHNvcywga2V5KTsKKworICAgICAgICBpZiAoKGVudHJ5LT5mbGFncyAmIEJDTURCX0ZMQUdfVkFMSUQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdWJzZXQgPSAoYmNtZGJfc2V0ICopZW50cnktPmRhdGE7CisgICAgICAgICAgICBzdWJzZXQtPnVubG9ja19zZXRfcmVjdXJzaXZlbHlfbW9kaWZ5KHN1YnNldCk7CisKKyAgICAgICAgICAgIC0tbGVmdF9lbnRyaWVzOworICAgICAgICAgICAgLyogaWYgd2UgaGFuZGxlZCBhbGwgc3Vic2V0cyB3ZSBjYW4gYnJlYWsgdGhlICJmb3IiICovCisgICAgICAgICAgICBpZiAobGVmdF9lbnRyaWVzPT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKy8qKiBzZW0tYmFzZWQgc2V0IG1vZGlmeS1sb2NrIHJlY3Vyc2l2ZWx5ICovCitzdGF0aWMgdm9pZCBiY21kYl9zZXRfbG9ja19yZWN1cnNpdmVseV9tb2RpZnlfc2VtKGJjbWRiX3NldCAqc2V0KQoreworICAgIEJDTURCX1RSQUNFX0RFQlVHKCJsb2NrIHNldCBtb2RpZnkgcmVjdXJzaXZlbHk6ICVzXG4iLCBzZXQtPm5hbWUpOworICAgIGJjbW9zX211dGV4X2xvY2soJnNldC0+bXV0ZXhfdXBkYXRlLCBCQ01PU19XQUlUX0ZPUkVWRVIpOworICAgIEJDTURCX1RSQUNFX0RFQlVHKCJtdXRleCB3YXMgbG9ja2VkXG4iKTsKKworICAgIGlmICgoc2V0LT5lbnRyeS5mbGFncyAmIEJDTURCX0ZMQUdfU09TKSkKKyAgICB7CisgICAgICAgIEJDTURCX1RSQUNFX0RFQlVHKCJnb2luZyB0byBsb2NrIHRoZSBzdWJzZXRzXG4iKTsKKyAgICAgICAgYmNtZGJfcmVjdXJzaXZlX3N1YnNldHNfbG9ja19tb2RpZnkoc2V0KTsKKyAgICB9Cit9CisKKworLyoqIHNlbS1iYXNlZCBzZXQgbW9kaWZ5LXVubG9jayByZWN1cnNpdmVseSAqLworc3RhdGljIHZvaWQgYmNtZGJfc2V0X3VubG9ja19yZWN1cnNpdmVseV9tb2RpZnlfc2VtKGJjbWRiX3NldCAqc2V0KQoreworICAgIEJDTURCX1RSQUNFX0RFQlVHKCJ1bmxvY2sgc2V0IG1vZGlmeSByZWN1cnNpdmVseTogJXNcbiIsIHNldC0+bmFtZSk7CisKKyAgICBpZiAoKHNldC0+ZW50cnkuZmxhZ3MgJiBCQ01EQl9GTEFHX1NPUykpCisgICAgeworICAgICAgICBCQ01EQl9UUkFDRV9ERUJVRygiZ29pbmcgdG8gdW5sb2NrIHRoZSBzdWJzZXRzXG4iKTsKKyAgICAgICAgYmNtZGJfcmVjdXJzaXZlX3N1YnNldHNfdW5sb2NrX21vZGlmeShzZXQpOworICAgIH0KKworICAgIGJjbW9zX211dGV4X3VubG9jaygmc2V0LT5tdXRleF91cGRhdGUpOworICAgIEJDTURCX1RSQUNFX0RFQlVHKCJtdXRleCB3YXMgdW5sb2NrZWRcbiIpOworfQorCisKKy8qKiBOQi1yZWFkLXNlbS13cml0ZSBwb2xpY3k6IHNldCByZWFkIGxvY2sgKi8KK3N0YXRpYyB2b2lkIGJjbWRiX3NldF9sb2NrX3JlYWRfX25iX3JlYWRfc2VtX3dyaXRlKGJjbWRiX3NldCAqc2V0KQoreworICAgIGxvbmcgZmxhZ3M7CisKKyAgICBCQ01EQl9UUkFDRV9ERUJVRygibG9jayBzZXQgcmVhZDogJXNcbiIsIHNldC0+bmFtZSk7CisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZzZXQtPmZhc3Rsb2NrKTsKKyAgICArK3NldC0+ZW50cnkucmVhZF9jb3VudDsKKyAgICBCQ01EQl9UUkFDRV9ERUJVRygicmVhZF9jb3VudCBpcyBub3c6ICV1XG4iLCBzZXQtPmVudHJ5LnJlYWRfY291bnQpOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmc2V0LT5mYXN0bG9jaywgZmxhZ3MpOworfQorCisKKy8qKiBOQi1yZWFkLXNlbS13cml0ZSBwb2xpY3k6IHNldCByZWFkIHVubG9jayAqLworc3RhdGljIHZvaWQgYmNtZGJfc2V0X3VubG9ja19yZWFkX19uYl9yZWFkX3NlbV93cml0ZShiY21kYl9zZXQgKnNldCkKK3sKKyAgICBsb25nIGZsYWdzOworCisgICAgQkNNREJfVFJBQ0VfREVCVUcoInVubG9jayBzZXQgcmVhZDogJXNcbiIsIHNldC0+bmFtZSk7CisKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnNldC0+ZmFzdGxvY2spOworICAgIEJVR19PTighc2V0LT5lbnRyeS5yZWFkX2NvdW50KTsKKyAgICBpZiAoISgtLXNldC0+ZW50cnkucmVhZF9jb3VudCkgJiYKKyAgICAgICAgc2V0LT5lbnRyeS53cml0ZV9wZW5kaW5nKQorICAgIHsKKyAgICAgICAgQkNNREJfVFJBQ0VfREVCVUcoImdvaW5nIHRvIHdha2UgcGVuZGluZyB3cml0ZXJcbiIpOworCisgICAgICAgIHNldC0+ZW50cnkud3JpdGVfcGVuZGluZyA9IDA7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmc2V0LT5mYXN0bG9jaywgZmxhZ3MpOworICAgICAgICBiY21vc19zZW1fcG9zdCgmc2V0LT5zZW1fd2FpdF9yZWFkX3RvX2ZpbmlzaCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmc2V0LT5mYXN0bG9jaywgZmxhZ3MpOworICAgIH0KK30KKworCisvKiogTkItcmVhZC1zZW0td3JpdGUgcG9saWN5OiBzZXQgbW9kaWZ5IGxvY2sgKi8KK3N0YXRpYyBsb25nIGJjbWRiX3NldF9sb2NrX21vZGlmeV9fbmJfcmVhZF9zZW1fd3JpdGUoYmNtZGJfc2V0ICpzZXQpCit7CisgICAgbG9uZyBmbGFnczsKKworICAgIEJDTURCX1RSQUNFX0RFQlVHKCJsb2NrIHNldCBtb2RpZnk6ICVzXG4iLCBzZXQtPm5hbWUpOworICAgIGJjbW9zX211dGV4X2xvY2soJnNldC0+bXV0ZXhfdXBkYXRlLCBCQ01PU19XQUlUX0ZPUkVWRVIpOworICAgIEJDTURCX1RSQUNFX0RFQlVHKCJtdXRleCB3YXMgbG9ja2VkXG4iKTsKKworICAgIHdoaWxlKDEpCisgICAgeworICAgICAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnNldC0+ZmFzdGxvY2spOworICAgICAgICBpZiAoIXNldC0+ZW50cnkucmVhZF9jb3VudCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiBXYWl0IHVudGlsIHJlYWQgaXMgY29tcGxldGVkICovCisgICAgICAgIHNldC0+ZW50cnkud3JpdGVfcGVuZGluZyA9IDE7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmc2V0LT5mYXN0bG9jaywgZmxhZ3MpOworICAgICAgICBiY21vc19zZW1fd2FpdCgmc2V0LT5zZW1fd2FpdF9yZWFkX3RvX2ZpbmlzaCwgQkNNT1NfV0FJVF9GT1JFVkVSKTsKKyAgICB9CisgICAgLyogQXQgdGhpcyBwb2ludCBmYXN0bG9jayBpcyB0YWtlbiBhbmQgdGhlcmUgYXJlIG5vIHBlbmRpbmcgcmVhZHMgKi8KKworICAgIEJDTURCX1RSQUNFX0RFQlVHKCJmYXN0bG9jayBpcyB0YWtlbiwgbm8gYWN0aXZlIHJlYWRzXG4iKTsKKworICAgIHJldHVybiBmbGFnczsKK30KKworCisvKiogTkItcmVhZC1zZW0td3JpdGUgcG9saWN5OiBzZXQgbW9kaWZ5IHVubG9jayAqLworc3RhdGljIHZvaWQgYmNtZGJfc2V0X3VubG9ja19tb2RpZnlfX25iX3JlYWRfc2VtX3dyaXRlKGJjbWRiX3NldCAqc2V0LCBsb25nIGZhc3Rsb2NrX2ZsYWdzKQoreworICAgIEJDTURCX1RSQUNFX0RFQlVHKCJ1bmxvY2sgc2V0IG1vZGlmeTogJXNcbiIsIHNldC0+bmFtZSk7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZzZXQtPmZhc3Rsb2NrLCBmYXN0bG9ja19mbGFncyk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZzZXQtPm11dGV4X3VwZGF0ZSk7CisgICAgQkNNREJfVFJBQ0VfREVCVUcoIm11dGV4IHdhcyB1bmxvY2tlZFxuIik7Cit9CisKKworLyoqIHNlbS1yZWFkL3NlbS13cml0ZSBwb2xpY3k6IGxvY2sgZW50cnkgKi8KK3N0YXRpYyB2b2lkICpiY21kYl9zZW1fcmVhZF9zZW1fd3JpdGVfbG9jayhiY21kYl9zZXQgKnNldCwgYmNtZGJfa2V5IGtleSwgaW50IGlzX2RlbGV0aW9uKQoreworICAgIGJjbWRiX2VudHJ5ICplbnRyeTsKKyAgICBiY21vc19tdXRleF9sb2NrKCZzZXQtPm11dGV4X3VwZGF0ZSwgQkNNT1NfV0FJVF9GT1JFVkVSKTsKKworICAgIGlmIChpc19kZWxldGlvbikKKyAgICB7CisgICAgICAgIC8qIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIGluIGRlbGV0aW9uIGNhc2UgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZW50cnkgPSBzZXQtPmtleV90b19oYW5kbGUoc2V0LCBrZXkpOworICAgIGlmICghZW50cnkgfHwgIShlbnRyeS0+ZmxhZ3MgJiBCQ01EQl9GTEFHX1ZBTElEKSkKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmc2V0LT5tdXRleF91cGRhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5LT5kYXRhOworfQorCisvKiogc2VtLXJlYWQvc2VtLXdyaXRlIHBvbGljeTogdW5sb2NrIGVudHJ5ICovCitzdGF0aWMgdm9pZCBiY21kYl9zZW1fcmVhZF9zZW1fd3JpdGVfdW5sb2NrKGJjbWRiX3NldCAqc2V0KQoreworICAgIGJjbW9zX211dGV4X3VubG9jaygmc2V0LT5tdXRleF91cGRhdGUpOworfQorCisvKiogc2VtLXJlYWQvc2VtLXdyaXRlIHBvbGljeTogbG9jayBlbnRyeSBmb3IgcmVhZGluZyAqLworc3RhdGljIHZvaWQgKmJjbWRiX3NlbV9yZWFkX3NlbV93cml0ZV9sb2NrX3JlYWQoYmNtZGJfc2V0ICpzZXQsIGJjbWRiX2tleSBrZXkpCit7CisgICAgcmV0dXJuIGJjbWRiX3NlbV9yZWFkX3NlbV93cml0ZV9sb2NrKHNldCwga2V5LCAwKSA7Cit9CisKKy8qKiBzZW0tcmVhZC9zZW0td3JpdGUgcG9saWN5OiB1bmxvY2sgZW50cnkgZm9yIHJlYWRpbmcgKi8KK3N0YXRpYyB2b2lkIGJjbWRiX3NlbV9yZWFkX3NlbV93cml0ZV91bmxvY2tfcmVhZChiY21kYl9zZXQgKnNldCwgYmNtZGJfa2V5IGtleSkKK3sKKyAgICBiY21kYl9zZW1fcmVhZF9zZW1fd3JpdGVfdW5sb2NrKHNldCk7Cit9CisKKy8qKiBzZW0tcmVhZC9zZW0td3JpdGUgcG9saWN5OiBsb2NrIGVudHJ5IGZvciB3cml0aW5nICovCitzdGF0aWMgdm9pZCAqYmNtZGJfc2VtX3JlYWRfc2VtX3dyaXRlX2xvY2tfd3JpdGUoYmNtZGJfc2V0ICpzZXQsIGJjbWRiX2tleSBrZXksIGludCBpc19kZWxldGlvbikKK3sKKyAgICByZXR1cm4gYmNtZGJfc2VtX3JlYWRfc2VtX3dyaXRlX2xvY2soc2V0LCBrZXksIGlzX2RlbGV0aW9uKSA7Cit9CisKKy8qKiBzZW0tcmVhZC9zZW0td3JpdGUgcG9saWN5OiB1bmxvY2sgZW50cnkgZm9yIHdyaXRpbmcgKi8KK3N0YXRpYyB2b2lkIGJjbWRiX3NlbV9yZWFkX3NlbV93cml0ZV91bmxvY2tfd3JpdGUoYmNtZGJfc2V0ICpzZXQsIGludCBpc19kZWxldGlvbiwgaW50IGlzX2NhbmNlbGxhdGlvbikKK3sKKyAgICBiY21kYl9zZW1fcmVhZF9zZW1fd3JpdGVfdW5sb2NrKHNldCk7Cit9CisKKy8qKiBub24tYmxvY2tpbmctcmVhZC9zaGFkb3cgd3JpdGUgcG9saWN5OiBMb2NrIGVudHJ5IGZvciByZWFkaW5nICovCitzdGF0aWMgdm9pZCAqYmNtZGJfbmJfcmVhZF9zaGFkb3dfd3JpdGVfbG9ja19yZWFkKGJjbWRiX3NldCAqc2V0LCBiY21kYl9rZXkga2V5KQoreworICAgIGJjbWRiX2VudHJ5ICplbnRyeTsKKyAgICBsb25nIGZsYWdzOworCisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZzZXQtPmZhc3Rsb2NrKTsKKyAgICBlbnRyeSA9IHNldC0+a2V5X3RvX2hhbmRsZShzZXQsIGtleSk7CisgICAgaWYgKCFlbnRyeSB8fCAhKGVudHJ5LT5mbGFncyAmIEJDTURCX0ZMQUdfVkFMSUQpKQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZzZXQtPmZhc3Rsb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICArK2VudHJ5LT5yZWFkX2NvdW50OworCisgICAgQkNNREJfVFJBQ0VfREVCVUcoImxvY2sgcmVjb3JkIHJlYWQ6ICVzLCBrZXk9JWQgbmV3X3JlYWRfY291bnQ9JWRcbiIsIHNldC0+bmFtZSwga2V5LCBlbnRyeS0+cmVhZF9jb3VudCk7CisKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnNldC0+ZmFzdGxvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gZW50cnktPmRhdGE7Cit9CisKKworLyoqIG5vbi1ibG9ja2luZy1yZWFkL3NoYWRvdyB3cml0ZSBwb2xpY3k6IFVubG9jayBlbnRyeSBmb3IgcmVhZGluZyAqLworc3RhdGljIHZvaWQgYmNtZGJfbmJfcmVhZF9zaGFkb3dfd3JpdGVfdW5sb2NrX3JlYWQoYmNtZGJfc2V0ICpzZXQsIGJjbWRiX2tleSBrZXkpCit7CisgICAgYmNtZGJfZW50cnkgKmVudHJ5PXNldC0+a2V5X3RvX2hhbmRsZShzZXQsIGtleSk7CisgICAgbG9uZyBmbGFnczsKKyAgICBCVUdfT04oIWVudHJ5KTsKKworICAgIEJDTURCX1RSQUNFX0RFQlVHKCJ1bmxvY2sgcmVjb3JkIHJlYWQ6ICVzLCBrZXk9JWRcbiIsIHNldC0+bmFtZSwga2V5KTsKKworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmc2V0LT5mYXN0bG9jayk7CisgICAgLyogSWYgd3JpdGUgaXMgcGVuZGluZyAtIGZpbmlzaCBpdCBhbmQgcmVsZWFzZSB3cml0ZSBsb2NrICovCisgICAgQlVHX09OKCFlbnRyeS0+cmVhZF9jb3VudCk7CisgICAgaWYgKCEoLS1lbnRyeS0+cmVhZF9jb3VudCkgJiYgc2V0LT5lbnRyeS53cml0ZV9wZW5kaW5nKQorICAgIHsKKyAgICAgICAgQkNNREJfVFJBQ0VfREVCVUcoImdvaW5nIHRvIHdha2UgcGVuZGluZyB3cml0ZXJcbiIpOworCisgICAgICAgIC8qIFdyaXRlIHdhcyBwZW5kaW5nLiBSZWxlYXNlIHdyaXRlIHRhc2sgKi8KKyAgICAgICAgc2V0LT5lbnRyeS53cml0ZV9wZW5kaW5nID0gMDsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZzZXQtPmZhc3Rsb2NrLCBmbGFncyk7CisgICAgICAgIGJjbW9zX3NlbV9wb3N0KCZzZXQtPnNlbV93YWl0X3JlYWRfdG9fZmluaXNoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNREJfVFJBQ0VfREVCVUcoInJlYWRfY291bnQgaXMgbm93OiAldVxuIiwgZW50cnktPnJlYWRfY291bnQpOworICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnNldC0+ZmFzdGxvY2ssIGZsYWdzKTsKKyAgICB9Cit9CisKKy8qKiBub24tYmxvY2tpbmctcmVhZC9zaGFkb3cgd3JpdGUgcG9saWN5OiBMb2NrIGVudHJ5IGZvcgorICogIHdyaXRpbmcvZGVsZXRpb24uCisgKiAgcmV0dXJuZWQgdmFsdWUgb2YgTlVMTCBtZWFucyBlcnJvciBvbmx5IGluIGNhc2UgdGhhdAorICogIGlzX2RlbGV0aW9uIGlzIDAgKi8KK3N0YXRpYyB2b2lkICpiY21kYl9uYl9yZWFkX3NoYWRvd193cml0ZV9sb2NrX3dyaXRlKGJjbWRiX3NldCAqc2V0LCBiY21kYl9rZXkga2V5LCBpbnQgaXNfZGVsZXRpb24pCit7CisgICAgYmNtZGJfZW50cnkgKmVudHJ5OworCisgICAgQkNNREJfVFJBQ0VfREVCVUcoImxvY2sgcmVjb3JkIHdyaXRlOiAlcywga2V5PSVkXG4iLCBzZXQtPm5hbWUsIGtleSk7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZzZXQtPm11dGV4X3VwZGF0ZSwgQkNNT1NfV0FJVF9GT1JFVkVSKTsKKyAgICBCQ01EQl9UUkFDRV9ERUJVRygibXV0ZXggd2FzIGxvY2tlZFxuIik7CisKKyAgICBpZiAoaXNfZGVsZXRpb24pCisgICAgeworICAgICAgICAvKiB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHVybiBpbiBkZWxldGlvbiBjYXNlICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIHRoaXMgY2hlY2sgaXMgbmVlZGVkIHNpbmNlIG11dGV4X3VwZGF0ZSBpcyB0YXNrLWF3YXJlLgorICAgICAgIGl0IGlzIG5vdCBhbGxvd2VkIGZvciBhIHRhc2sgdG8gbG9jayBmb3Igd3JpdGluZyBhIDJuZCByZWNvcmQgYmVmb3JlIHVubG9ja2luZyB0aGUgZmlyc3Qgb25lLiAqLworICAgIGlmIChzZXQtPndyaXRlX2xvY2tlZF9lbnRyeSkKKyAgICB7CisgICAgICAgIEJDTURCX1RSQUNFX0VSUk9SKCJ0aGVyZSBpcyBhbHJlYWR5IGFuIGVudHJ5IGxvY2tlZCBmb3Igd3JpdGluZ1xuIik7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmc2V0LT5tdXRleF91cGRhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBlbnRyeSA9IHNldC0+a2V5X3RvX2hhbmRsZShzZXQsIGtleSk7CisgICAgaWYgKCFlbnRyeSB8fCAhKGVudHJ5LT5mbGFncyAmIEJDTURCX0ZMQUdfVkFMSUQpKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZzZXQtPm11dGV4X3VwZGF0ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBDb3B5IGRhdGEgdG8gc2hhZG93IGVudHJ5ICovCisgICAgbWVtY3B5KHNldC0+c2hhZG93X2RhdGEsIGVudHJ5LT5kYXRhLCBzZXQtPmVudHJ5X3NpemUpOworICAgIHNldC0+d3JpdGVfbG9ja2VkX2VudHJ5ID0gZW50cnk7CisgICAgcmV0dXJuIHNldC0+c2hhZG93X2RhdGE7Cit9CisKKy8qKiBub24tYmxvY2tpbmctcmVhZC9zaGFkb3cgd3JpdGUgcG9saWN5OiBVbmxvY2sgZW50cnkgZm9yCisgKiAgd3JpdGluZy9kZWxldGlvbiAqLworc3RhdGljIHZvaWQgYmNtZGJfbmJfcmVhZF9zaGFkb3dfd3JpdGVfdW5sb2NrX3dyaXRlKGJjbWRiX3NldCAqc2V0LCBpbnQgaXNfZGVsZXRpb24sIGludCBpc19jYW5jZWxsYXRpb24pCit7CisgICAgYmNtZGJfZW50cnkgKmVudHJ5ID0gc2V0LT53cml0ZV9sb2NrZWRfZW50cnk7CisgICAgbG9uZyBmbGFnczsKKyAgICB2b2lkICpvbGRfZGF0YTsKKworICAgIC8qIG5vIGVudHJ5IGlzIGxvY2tlZCAqLworICAgIEJVR19PTighZW50cnkpOworCisgICAgQkNNREJfVFJBQ0VfREVCVUcoInVubG9jayByZWNvcmQgd3JpdGU6ICVzXG4iLCBzZXQtPm5hbWUpOworCisgICAgLyogY2FuY2VsbGF0aW9uOiBubyBuZWVkIHRvIHVwZGF0ZSB0aGUgZW50cnkgZnJvbSB0aGUgc2hhZG93IChvciB0byBkZWxldGUgdGhlIGVudHJ5IGluIGNhc2Ugb2YgZGVsZXRpb24pLiAqLworICAgIGlmIChpc19jYW5jZWxsYXRpb24pCisgICAgeworICAgICAgICBzZXQtPndyaXRlX2xvY2tlZF9lbnRyeSA9IE5VTEw7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmc2V0LT5tdXRleF91cGRhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUoMSkKKyAgICB7CisgICAgICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmc2V0LT5mYXN0bG9jayk7CisgICAgICAgIC8qIFdhaXQgdW50aWwgbmVpdGhlciByZWNvcmQgbm9yIHNldCBhcmUgbG9ja2VkIGZvciByZWFkaW5nICovCisgICAgICAgIGlmICghZW50cnktPnJlYWRfY291bnQgJiYgIXNldC0+ZW50cnkucmVhZF9jb3VudCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIFJlYWQgbG9jayBpcyBhY3RpdmUuIHdhaXQgKi8KKworICAgICAgICBCQ01EQl9UUkFDRV9ERUJVRygicmVhZCBsb2NrIGlzIGFjdGl2ZS4gZ29pbmcgdG8gc2xlZXAuXG4iKTsKKworICAgICAgICBzZXQtPmVudHJ5LndyaXRlX3BlbmRpbmcgPSAxOworICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnNldC0+ZmFzdGxvY2ssIGZsYWdzKTsKKyAgICAgICAgYmNtb3Nfc2VtX3dhaXQoJnNldC0+c2VtX3dhaXRfcmVhZF90b19maW5pc2gsIEJDTU9TX1dBSVRfRk9SRVZFUik7CisgICAgfQorCisgICAgLyogQXQgdGhpcyBwb2ludCB0aGVyZSBpcyBubyByZWFkIGxvY2sgYW5kIGZhc3Rsb2NrIGlzIHRha2VuLiAqLworCisgICAgQkNNREJfVFJBQ0VfREVCVUcoImZhc3Rsb2NrIGlzIHRha2VuLCBubyBhY3RpdmUgcmVhZHNcbiIpOworCisgICAgaWYgKGlzX2RlbGV0aW9uKQorICAgIHsKKyAgICAgICAgLyogZGVsZXRlIHRoZSBlbnRyeSAqLworICAgICAgICBzZXQtPmVudHJ5X2RlbGV0ZShzZXQsIGVudHJ5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRXhjaGFuZ2UgcmVjb3JkIGRhdGEgd2l0aCBzaGFkb3cgYW5kIHJlbGVhc2UgYWxsIGxvY2tzLiAqLworICAgICAgICBvbGRfZGF0YSA9IGVudHJ5LT5kYXRhOworICAgICAgICBlbnRyeS0+ZGF0YSA9IHNldC0+c2hhZG93X2RhdGE7CisgICAgICAgIHNldC0+c2hhZG93X2RhdGEgPSBvbGRfZGF0YTsKKyAgICAgICAgc2V0LT53cml0ZV9sb2NrZWRfZW50cnkgPSBOVUxMOworICAgIH0KKworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmc2V0LT5mYXN0bG9jaywgZmxhZ3MpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmc2V0LT5tdXRleF91cGRhdGUpOworICAgIEJDTURCX1RSQUNFX0RFQlVHKCJtdXRleCB3YXMgdW5sb2NrZWRcbiIpOworfQorCisvKiogbm9uZSBwb2xpY3k6IHNldCByZWFkLWxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21kYl9zZXRfbG9ja19yZWFkX2R1bW15KGJjbWRiX3NldCAqc2V0KQoreworfQorCisvKiogbm9uZSBwb2xpY3k6IHNldCByZWFkLXVubG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbWRiX3NldF91bmxvY2tfcmVhZF9kdW1teShiY21kYl9zZXQgKnNldCkKK3sKK30KKworLyoqIG5vbmUgcG9saWN5OiBzZXQgbW9kaWZ5LWxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBiY21kYl9zZXRfbG9ja19tb2RpZnlfZHVtbXkoYmNtZGJfc2V0ICpzZXQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBub25lIHBvbGljeTogc2V0IG1vZGlmeS11bmxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21kYl9zZXRfdW5sb2NrX21vZGlmeV9kdW1teShiY21kYl9zZXQgKnNldCwgbG9uZyBmYXN0bG9ja19mbGFncykKK3sKK30KKworLyoqIG5vbmUgcG9saWN5OiBzZXQgbW9kaWZ5LWxvY2sgcmVjdXJzaXZlbHkgICovCitzdGF0aWMgdm9pZCBiY21kYl9zZXRfbG9ja19yZWN1cnNpdmVseV9tb2RpZnlfZHVtbXkoYmNtZGJfc2V0ICpzZXQpCit7Cit9CisKKy8qKiBub25lIHBvbGljeTogc2V0IG1vZGlmeS11bmxvY2sgcmVjdXJzaXZlbHkgICovCitzdGF0aWMgdm9pZCBiY21kYl9zZXRfdW5sb2NrX3JlY3Vyc2l2ZWx5X21vZGlmeV9kdW1teShiY21kYl9zZXQgKnNldCkKK3sKK30KKworLyoqIG5vbmUgcG9saWN5OiByZWNvcmQgbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkICpiY21kYl9kdW1teV9sb2NrKGJjbWRiX3NldCAqc2V0LCBiY21kYl9rZXkga2V5LCBpbnQgaXNfZGVsZXRpb24pCit7CisgICAgYmNtZGJfZW50cnkgKmVudHJ5OworCisgICAgLyogdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gaW4gZGVsZXRpb24gY2FzZSAqLworICAgIGlmIChpc19kZWxldGlvbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBlbnRyeSA9IHNldC0+a2V5X3RvX2hhbmRsZShzZXQsIGtleSk7CisgICAgaWYgKCFlbnRyeSB8fCAhKGVudHJ5LT5mbGFncyAmIEJDTURCX0ZMQUdfVkFMSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gZW50cnktPmRhdGE7Cit9CisKKy8qKiBub25lIHBvbGljeTogcmVjb3JkIHVubG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbWRiX2R1bW15X3VubG9jayhiY21kYl9zZXQgKnNldCkKK3sKK30KKworLyoqIG5vbmUgcG9saWN5OiByZWNvcmQgbG9jayBmb3IgcmVhZGluZyAqLworc3RhdGljIGlubGluZSB2b2lkICpiY21kYl9kdW1teV9sb2NrX3JlYWQoYmNtZGJfc2V0ICpzZXQsIGJjbWRiX2tleSBrZXkpCit7CisgICAgcmV0dXJuIGJjbWRiX2R1bW15X2xvY2soc2V0LCBrZXksIDApOworfQorCisvKiogbm9uZSBwb2xpY3k6IHJlY29yZCB1bmxvY2sgZm9yIHJlYWRpbmcgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21kYl9kdW1teV91bmxvY2tfcmVhZChiY21kYl9zZXQgKnNldCwgYmNtZGJfa2V5IGtleSkKK3sKKyAgICBiY21kYl9kdW1teV91bmxvY2soc2V0KTsKK30KKworLyoqIG5vbmUgcG9saWN5OiByZWNvcmQgbG9jayBmb3Igd3JpdGluZyAqLworc3RhdGljIGlubGluZSB2b2lkICpiY21kYl9kdW1teV9sb2NrX3dyaXRlKGJjbWRiX3NldCAqc2V0LCBiY21kYl9rZXkga2V5LCBpbnQgaXNfZGVsZXRpb24pCit7CisgICAgcmV0dXJuIGJjbWRiX2R1bW15X2xvY2soc2V0LCBrZXksIGlzX2RlbGV0aW9uKTsKK30KKworLyoqIG5vbmUgcG9saWN5OiByZWNvcmQgdW5sb2NrIGZvciB3cml0aW5nICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtZGJfZHVtbXlfdW5sb2NrX3dyaXRlKGJjbWRiX3NldCAqc2V0LCBpbnQgaXNfZGVsZXRpb24sIGludCBpc19jYW5jZWxsYXRpb24pCit7CisgICAgYmNtZGJfZHVtbXlfdW5sb2NrKHNldCk7Cit9CisKKworCisvKiogQWRkIG5ldyBzdWItc2V0LiByZXR1cm5zIDAgaWYgb2sKKyAqIGRhdGEgY29udGFpbnMgbmV3IHNldCBoYW5kbGUKKyAqLworc3RhdGljIGludCBiY21kYl9zZXRfbmV3KGJjbWRiX3NldCAqdGhpcywgYmNtZGJfa2V5IGtleSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICAvKiBBbHRob3VnaCB0aGlzIGNhbGxiYWNrIHRha2VzICJjb25zdCB2b2lkICoiIHBhcmFtZXRlciwKKyAgICAgKiBpdCBpcyBqdXN0IGZvciBjb21wYXRpYmlsaXR5IGZpdGggU29SLT5uZXdfZW50cnkgaW50ZXJmYWNlLgorICAgICAqIEZvciBTb1MgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGNvbnN0YW50IG9uIGFwcGxpY2F0aW9uIGxldmVsCisgICAgICogKHNlZSBiY21kYl9zZXRfYWRkKCkpCisgICAgICovCisgICAgYmNtZGJfZW50cnkgKmVudHJ5ID0gdGhpcy0+a2V5X3RvX2hhbmRsZSh0aGlzLCBrZXkpOworICAgIGJjbWRiX3NldCAqbmV3X3NldCA9IChiY21kYl9zZXQgKikobG9uZylkYXRhOworCisgICAgaWYgKCFlbnRyeSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICBpZiAoKGVudHJ5LT5mbGFncyAmIEJDTURCX0ZMQUdfVkFMSUQpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgICsrdGhpcy0+bnVtX2VudHJpZXM7CisgICAgZW50cnktPmRhdGEgPSAodm9pZCAqKShsb25nKWRhdGE7CisgICAgZW50cnktPmZsYWdzIHw9IEJDTURCX0ZMQUdfVkFMSUQ7CisgICAgbmV3X3NldC0+bXlfa2V5ID0ga2V5OworICAgIG5ld19zZXQtPnBhcmVudCA9IHRoaXM7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBBZGQgbmV3IHJlY29yZC4gcmV0dXJucyAwIGlmIG9rCisgKiBkYXRhIGNvbnRhaW5zIHJlY29yZCBkYXRhIHBvaW50ZXIKKyAqLworc3RhdGljIGludCBiY21kYl9yZWNvcmRfbmV3KGJjbWRiX3NldCAqdGhpcywgYmNtZGJfa2V5IGtleSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBiY21kYl9yZWNvcmQgKnJlY29yZCA9IChiY21kYl9yZWNvcmQgKil0aGlzLT5rZXlfdG9faGFuZGxlKHRoaXMsIGtleSk7CisgICAgaWYgKCFyZWNvcmQgfHwgIXJlY29yZC0+ZS5kYXRhKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGlmICgocmVjb3JkLT5lLmZsYWdzICYgQkNNREJfRkxBR19WQUxJRCkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgKyt0aGlzLT5udW1fZW50cmllczsKKyAgICBtZW1jcHkocmVjb3JkLT5lLmRhdGEsIGRhdGEsIHRoaXMtPmVudHJ5X3NpemUpOworICAgIHJlY29yZC0+ZS5mbGFncyB8PSBCQ01EQl9GTEFHX1ZBTElEOworICAgIHJldHVybiAwOworfQorCisvKiogRGVsZXRlIGVudHJ5ICovCitzdGF0aWMgaW50IGJjbWRiX2VudHJ5X2RlbGV0ZShiY21kYl9zZXQgKnRoaXMsIGJjbWRiX2VudHJ5ICplbnRyeSkKK3sKKyAgICBpZiAoIWVudHJ5KQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGlmICghKGVudHJ5LT5mbGFncyAmIEJDTURCX0ZMQUdfVkFMSUQpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgIGVudHJ5LT5mbGFncyAmPSB+QkNNREJfRkxBR19WQUxJRDsKKyAgICAtLXRoaXMtPm51bV9lbnRyaWVzOworICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBFeHRlcm5hbCBBUElzCisgKi8KKworCisvKiogSW5pdGlhbGl6ZSBkYXRhIGJhc2UgZW5naW5lCisgKgorICogXHJldHVybgorICogICAgICAwICAgLSBPS1xuCisgKiAgICAgIDwwICAtIGVycm9yIGNvZGUKKyAqIFxpbmdyb3VwIGJjbWRiCisgKi8KK2ludCBiY21kYl9tb2R1bGVfaW5pdCh2b2lkKQoreworICAgIHJldHVybiAwOworfQorCisKKy8qKiBNYWtlIHNldC1vZi1zZXRzIGNvbnRyb2wgYmxvY2suCisgKgorICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIHNldCBvZiBzZXRzIHdpdGggcmVhc29uYWJsZSBkZWZhdWx0cyBmb3IgYWxsIGNhbGxiYWNrcyBhbmQgZmllbGRzLgorICogT25jZSBjcmVhdGVkLCB0aGUgc2V0IGNvbnRyb2wgYmxvY2sgY2FuIGJlIHR1bmVkIGJlZm9yZSBhZGRpbmcgdGhlIG5ldyBzZXQgdG8gaXRzIHBhcmVudCBzZXQuCisgKiBccGFyYW1baW5dICAgaW5pdCAgICAgICAgICAgIHNldCBwYXJhbWV0ZXJzCisgKiBccGFyYW1bb3V0XSAgbmV3X3NldCAgICAgICAgIHNldCBjb250cm9sIGJsb2NrCisgKiBccmV0dXJuCisgKiAgICAgIDAgICAtIE9LXG4KKyAqICAgICAgPDAgIC0gZXJyb3IgY29kZQorICovCitpbnQgYmNtZGJfbWFrZV9zZXRfb2Zfc2V0cyhjb25zdCBiY21kYl9zb3NfaW5pdCAqaW5pdCwgYmNtZGJfc2V0ICoqbmV3X3NldCkKK3sKKyAgICBiY21kYl9zZXQgKnNvczsKKyAgICBiY21kYl9lbnRyeSAqZW50cmllczsKKyAgICBpbnQgcmM7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2sgKi8KKyAgICBpZiAoIWluaXQgfHwgIWluaXQtPm5hbWUgfHwgIW5ld19zZXQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgaWYgKChpbml0LT5iYWNrZW5kX3R5cGUgPT0gQkNNREJfQkFDS0VORF9BUlJBWSkgJiYgIWluaXQtPm1heF9lbnRyaWVzKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgLyogQWxsb2NhdGUgc2V0IGNvbnRyb2wgYmxvY2sgYW5kIHNldCByZWNvcmRzICovCisgICAgc29zID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21kYl9zZXQpICsgc3RybGVuKGluaXQtPm5hbWUpICsgMSk7CisgICAgaWYgKCFzb3MpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIHNvcy0+bmFtZSA9IChjaGFyICopKHNvcyArIDEpOworICAgIHN0cmNweShzb3MtPm5hbWUsIGluaXQtPm5hbWUpOworICAgIHNvcy0+ZW50cnlfc2l6ZSA9IHNpemVvZihiY21kYl9zZXQpOworICAgIHNvcy0+bWF4X2VudHJpZXMgPSBpbml0LT5tYXhfZW50cmllczsKKyAgICBzb3MtPm15X2tleSA9IEJDTURCX0tFWV9JTlZBTDsKKyAgICBzb3MtPmVudHJ5LmZsYWdzID0gQkNNREJfRkxBR19TT1M7CisgICAgc29zLT5tYWdpYyA9IEJDTURCX01BR0lDX0FDVElWRV9TRVQ7CisKKyAgICAvKiBTZXQgYmFja2VuZCBjYWxsYmFja3MgKi8KKyAgICBzd2l0Y2goaW5pdC0+YmFja2VuZF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01EQl9CQUNLRU5EX0FSUkFZOgorICAgICAgICAgICAgZW50cmllcyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYmNtZGJfc2V0KSppbml0LT5tYXhfZW50cmllcyk7CisgICAgICAgICAgICBpZiAoIWVudHJpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShzb3MpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc29zLT5lbnRyeS5kYXRhID0gZW50cmllczsKKyAgICAgICAgICAgIHNvcy0+ZW50cnlfZ2V0X25leHQgPSBfYmNtZGJfYXJyYXlfZW50cnlfZ2V0X25leHQ7CisgICAgICAgICAgICBzb3MtPmhhbmRsZV90b19rZXkgPSBfYmNtZGJfYXJyYXlfaGFuZGxlX3RvX2tleTsKKyAgICAgICAgICAgIHNvcy0+a2V5X3RvX2hhbmRsZSA9IF9iY21kYl9hcnJheV9rZXlfdG9faGFuZGxlOworICAgICAgICAgICAgc29zLT5lbnRyeV9uZXcgPSBiY21kYl9zZXRfbmV3OworICAgICAgICAgICAgc29zLT5lbnRyeV9kZWxldGUgPSBiY21kYl9lbnRyeV9kZWxldGU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCJPbmx5IGFycmF5LWJhc2VkIERCIGJhY2tlbmQgaXMgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoc29zKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgLyogU2V0IGxvY2tpbmcgY2FsbGJhY2tzLiBTb1MgbG9ja2luZyBwb2xpY3kgaXMgYWx3YXlzIFNFTUFQSE9SRSAqLworCisgICAgLyogaW4gU29TLCBsb2NraW5nIGZvciByZWFkIGlzIHNhbWUgYXMgZm9yIHdyaXRlIChhbmQgaXMgZG9uZSByZWN1cnNpdmVseSkuICovCisgICAgc29zLT5sb2NrX3NldF9yZWFkID0gYmNtZGJfc2V0X2xvY2tfcmVjdXJzaXZlbHlfbW9kaWZ5X3NlbTsKKyAgICBzb3MtPnVubG9ja19zZXRfcmVhZCA9IGJjbWRiX3NldF91bmxvY2tfcmVjdXJzaXZlbHlfbW9kaWZ5X3NlbTsKKyAgICBzb3MtPmxvY2tfc2V0X21vZGlmeSA9IGJjbWRiX3NldF9sb2NrX21vZGlmeV9zZW07CisgICAgc29zLT51bmxvY2tfc2V0X21vZGlmeSA9IGJjbWRiX3NldF91bmxvY2tfbW9kaWZ5X3NlbTsKKyAgICBzb3MtPmxvY2tfc2V0X3JlY3Vyc2l2ZWx5X21vZGlmeSA9IGJjbWRiX3NldF9sb2NrX3JlY3Vyc2l2ZWx5X21vZGlmeV9zZW0gOworICAgIHNvcy0+dW5sb2NrX3NldF9yZWN1cnNpdmVseV9tb2RpZnkgPSBiY21kYl9zZXRfdW5sb2NrX3JlY3Vyc2l2ZWx5X21vZGlmeV9zZW0gOworCisgICAgLyogY3JlYXRlIG11dGV4X3VwZGF0ZSAqLworICAgIHJjID0gYmNtb3NfbXV0ZXhfY3JlYXRlKCZzb3MtPm11dGV4X3VwZGF0ZSwgaW5pdC0+b3NfZmxhZ3MpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoZW50cmllcyk7CisgICAgICAgIGJjbW9zX2ZyZWUoc29zKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmc29zLT5mYXN0bG9jaywgaW5pdC0+b3NfZmxhZ3MpOworCisgICAgKm5ld19zZXQgPSBzb3M7CisKKyAgICByZXR1cm4gMDsKK30KKworCisKKworLyoqIE1ha2Ugc2V0LW9mLXJlY29yZHMgY29udHJvbCBibG9jay4KKyAqCisgKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgc2V0IG9mIHJlY29yZHMgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBhbGwgY2FsbGJhY2tzIGFuZCBmaWVsZHMuCisgKiBPbmNlIGNyZWF0ZWQsIHRoZSBzZXQgY29udHJvbCBibG9jayBjYW4gYmUgdHVuZWQgYmVmb3JlIGFkZGluZyB0aGUgbmV3IHNldCB0byBpdHMgcGFyZW50IHNldC4KKyAqIFxwYXJhbVtpbl0gICBpbml0ICAgICAgICAgICAgc2V0IHBhcmFtZXRlcnMKKyAqIFxwYXJhbVtpbl0gICBhbGxvY19yZWNvcmRzICAgdHJ1ZSAoMSkgLSBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCByZWNvcmRzLgorICogXHBhcmFtW291dF0gIG5ld19zZXQgICAgICAgICBzZXQgY29udHJvbCBibG9jaworICogXHJldHVybgorICogICAgICAwICAgLSBPS1xuCisgKiAgICAgIDwwICAtIGVycm9yIGNvZGUKKyAqLworaW50IGJjbWRiX21ha2Vfc2V0X29mX3JlY29yZHMoY29uc3QgYmNtZGJfc29yX2luaXQgKmluaXQsIGludCBhbGxvY19yZWNvcmRzLCBiY21kYl9zZXQgKipuZXdfc2V0KQoreworICAgIGJjbWRiX3NldCAqc29yOworICAgIGJjbWRiX2VudHJ5ICplbnRyaWVzID0gTlVMTDsKKyAgICB2b2lkICpkYXRhID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmMgOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrICovCisgICAgaWYgKCFpbml0IHx8ICFpbml0LT5uYW1lKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGlmICgoaW5pdC0+YmFja2VuZF90eXBlID09IEJDTURCX0JBQ0tFTkRfQVJSQVkpICYmICFpbml0LT5tYXhfZW50cmllcykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICBpZiAoIWluaXQtPnJlY29yZF9zaXplKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgLyogQWxsb2NhdGUgc2V0IGNvbnRyb2wgYmxvY2sgYW5kIHNldCByZWNvcmRzICovCisgICAgc29yID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21kYl9zZXQpICsgc3RybGVuKGluaXQtPm5hbWUpICsgMSk7CisgICAgaWYgKCFzb3IpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIHNvci0+bmFtZSA9IChjaGFyICopKHNvciArIDEpOworICAgIHN0cmNweShzb3ItPm5hbWUsIGluaXQtPm5hbWUpOworICAgIHNvci0+ZW50cnlfc2l6ZSA9IGluaXQtPnJlY29yZF9zaXplOworICAgIHNvci0+bWF4X2VudHJpZXMgPSBpbml0LT5tYXhfZW50cmllczsKKyAgICBzb3ItPm15X2tleSA9IEJDTURCX0tFWV9JTlZBTDsKKyAgICBzb3ItPm1hZ2ljID0gQkNNREJfTUFHSUNfQUNUSVZFX1NFVDsKKyAgICBzb3ItPmZvcm1hdCA9IGluaXQtPmZvcm1hdDsKKworICAgIC8qIFNldCBiYWNrZW5kIGNhbGxiYWNrcyAqLworICAgIHN3aXRjaChpbml0LT5iYWNrZW5kX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTURCX0JBQ0tFTkRfQVJSQVk6CisgICAgICAgICAgICBlbnRyaWVzID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21kYl9lbnRyeSkqaW5pdC0+bWF4X2VudHJpZXMpOworICAgICAgICAgICAgaWYgKCFlbnRyaWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX2ZyZWUoc29yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNvci0+ZW50cnkuZGF0YSA9IGVudHJpZXM7CisgICAgICAgICAgICBzb3ItPmVudHJ5X2dldF9uZXh0ID0gX2JjbWRiX2FycmF5X2VudHJ5X2dldF9uZXh0OworICAgICAgICAgICAgc29yLT5oYW5kbGVfdG9fa2V5ID0gX2JjbWRiX2FycmF5X2hhbmRsZV90b19rZXk7CisgICAgICAgICAgICBzb3ItPmtleV90b19oYW5kbGUgPSBfYmNtZGJfYXJyYXlfa2V5X3RvX2hhbmRsZTsKKyAgICAgICAgICAgIHNvci0+ZW50cnlfbmV3ID0gYmNtZGJfcmVjb3JkX25ldzsKKyAgICAgICAgICAgIHNvci0+ZW50cnlfZGVsZXRlID0gYmNtZGJfZW50cnlfZGVsZXRlOworCisgICAgICAgICAgICAvKiBQcmVhbGxvY2F0ZSBkYXRhICovCisgICAgICAgICAgICBpZiAoYWxsb2NfcmVjb3JkcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGluaXQtPm1heF9lbnRyaWVzICogaW5pdC0+cmVjb3JkX3NpemU7CisgICAgICAgICAgICAgICAgaWYgKGluaXQtPmxvY2tfcG9saWN5ID09IEJDTURCX0xPQ0tfTkJfUkVBRF9TSEFET1dfV1JJVEUpCisgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gaW5pdC0+cmVjb3JkX3NpemU7IC8qIHJvb20gZm9yIHNoYWRvdyBlbnRyeSAqLworICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGRhdGEgKyAxIGV4dHJhIGZvciBzaGFkb3cgYXJlYSAqLworICAgICAgICAgICAgICAgIGRhdGEgPSBiY21vc19jYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFkYXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShlbnRyaWVzKTsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShzb3IpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxpbml0LT5tYXhfZW50cmllczsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtZGJfZW50cnkgKmVudHJ5ID0gKGJjbWRiX2VudHJ5ICopc29yLT5lbnRyeS5kYXRhICsgaTsKKyAgICAgICAgICAgICAgICAgICAgZW50cnktPmRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgaSAqIGluaXQtPnJlY29yZF9zaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluaXQtPmxvY2tfcG9saWN5ID09IEJDTURCX0xPQ0tfTkJfUkVBRF9TSEFET1dfV1JJVEUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzb3ItPnNoYWRvd19kYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGkgKiBpbml0LT5yZWNvcmRfc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJbml0aWFsaXplIHJlY29yZHMgKi8KKyAgICAgICAgICAgIGZvcihpPTA7IGk8aW5pdC0+bWF4X2VudHJpZXM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21kYl9lbnRyeSAqZW50cnkgPSAoYmNtZGJfZW50cnkgKilzb3ItPmVudHJ5LmRhdGEgKyBpOworICAgICAgICAgICAgICAgIGVudHJ5LT5mbGFncyA9IEJDTURCX0ZMQUdfUkVDT1JEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZigiT25seSBhcnJheS1iYXNlZCBEQiBiYWNrZW5kIGlzIHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICBiY21vc19mcmVlKHNvcik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIC8qIFNldCBsb2NraW5nIGNhbGxiYWNrcyBiYXNlZCBvbiBsb2NraW5nIHBvbGljeSAqLworICAgIHN3aXRjaChpbml0LT5sb2NrX3BvbGljeSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNREJfTE9DS19TRU1fUkVBRF9TRU1fV1JJVEU6CisgICAgICAgICAgICBzb3ItPmxvY2tfcmVjb3JkX3dyaXRlID0gYmNtZGJfc2VtX3JlYWRfc2VtX3dyaXRlX2xvY2tfd3JpdGU7CisgICAgICAgICAgICBzb3ItPmxvY2tfcmVjb3JkX3JlYWQgPSBiY21kYl9zZW1fcmVhZF9zZW1fd3JpdGVfbG9ja19yZWFkOworICAgICAgICAgICAgc29yLT51bmxvY2tfcmVjb3JkX3dyaXRlID0gYmNtZGJfc2VtX3JlYWRfc2VtX3dyaXRlX3VubG9ja193cml0ZTsKKyAgICAgICAgICAgIHNvci0+dW5sb2NrX3JlY29yZF9yZWFkID0gYmNtZGJfc2VtX3JlYWRfc2VtX3dyaXRlX3VubG9ja19yZWFkOworICAgICAgICAgICAgc29yLT5sb2NrX3NldF9yZWFkID0gYmNtZGJfc2V0X2xvY2tfcmVhZF9zZW07CisgICAgICAgICAgICBzb3ItPnVubG9ja19zZXRfcmVhZCA9IGJjbWRiX3NldF91bmxvY2tfcmVhZF9zZW07CisgICAgICAgICAgICBzb3ItPmxvY2tfc2V0X21vZGlmeSA9IGJjbWRiX3NldF9sb2NrX21vZGlmeV9zZW07CisgICAgICAgICAgICBzb3ItPnVubG9ja19zZXRfbW9kaWZ5ID0gYmNtZGJfc2V0X3VubG9ja19tb2RpZnlfc2VtOworICAgICAgICAgICAgc29yLT5sb2NrX3NldF9yZWN1cnNpdmVseV9tb2RpZnkgPSBiY21kYl9zZXRfbG9ja19yZWN1cnNpdmVseV9tb2RpZnlfc2VtIDsKKyAgICAgICAgICAgIHNvci0+dW5sb2NrX3NldF9yZWN1cnNpdmVseV9tb2RpZnkgPSBiY21kYl9zZXRfdW5sb2NrX3JlY3Vyc2l2ZWx5X21vZGlmeV9zZW0gOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01EQl9MT0NLX05PTkU6CisgICAgICAgIGNhc2UgQkNNREJfTE9DS19PVEhFUjoKKyAgICAgICAgICAgIHNvci0+bG9ja19yZWNvcmRfd3JpdGUgPSBiY21kYl9kdW1teV9sb2NrX3dyaXRlOworICAgICAgICAgICAgc29yLT5sb2NrX3JlY29yZF9yZWFkID0gYmNtZGJfZHVtbXlfbG9ja19yZWFkOworICAgICAgICAgICAgc29yLT51bmxvY2tfcmVjb3JkX3dyaXRlID0gYmNtZGJfZHVtbXlfdW5sb2NrX3dyaXRlOworICAgICAgICAgICAgc29yLT51bmxvY2tfcmVjb3JkX3JlYWQgPSBiY21kYl9kdW1teV91bmxvY2tfcmVhZDsKKyAgICAgICAgICAgIHNvci0+bG9ja19zZXRfcmVhZCA9IGJjbWRiX3NldF9sb2NrX3JlYWRfZHVtbXk7CisgICAgICAgICAgICBzb3ItPnVubG9ja19zZXRfcmVhZCA9IGJjbWRiX3NldF91bmxvY2tfcmVhZF9kdW1teTsKKyAgICAgICAgICAgIHNvci0+bG9ja19zZXRfbW9kaWZ5ID0gYmNtZGJfc2V0X2xvY2tfbW9kaWZ5X2R1bW15OworICAgICAgICAgICAgc29yLT51bmxvY2tfc2V0X21vZGlmeSA9IGJjbWRiX3NldF91bmxvY2tfbW9kaWZ5X2R1bW15OworICAgICAgICAgICAgc29yLT5sb2NrX3NldF9yZWN1cnNpdmVseV9tb2RpZnkgPSBiY21kYl9zZXRfbG9ja19yZWN1cnNpdmVseV9tb2RpZnlfZHVtbXkgOworICAgICAgICAgICAgc29yLT51bmxvY2tfc2V0X3JlY3Vyc2l2ZWx5X21vZGlmeSA9IGJjbWRiX3NldF91bmxvY2tfcmVjdXJzaXZlbHlfbW9kaWZ5X2R1bW15IDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNREJfTE9DS19OQl9SRUFEX1NIQURPV19XUklURToKKyAgICAgICAgICAgIHNvci0+bG9ja19yZWNvcmRfd3JpdGUgPSBiY21kYl9uYl9yZWFkX3NoYWRvd193cml0ZV9sb2NrX3dyaXRlOworICAgICAgICAgICAgc29yLT5sb2NrX3JlY29yZF9yZWFkID0gYmNtZGJfbmJfcmVhZF9zaGFkb3dfd3JpdGVfbG9ja19yZWFkOworICAgICAgICAgICAgc29yLT51bmxvY2tfcmVjb3JkX3dyaXRlID0gYmNtZGJfbmJfcmVhZF9zaGFkb3dfd3JpdGVfdW5sb2NrX3dyaXRlOworICAgICAgICAgICAgc29yLT51bmxvY2tfcmVjb3JkX3JlYWQgPSBiY21kYl9uYl9yZWFkX3NoYWRvd193cml0ZV91bmxvY2tfcmVhZDsKKyAgICAgICAgICAgIHNvci0+bG9ja19zZXRfcmVhZCA9IGJjbWRiX3NldF9sb2NrX3JlYWRfX25iX3JlYWRfc2VtX3dyaXRlOworICAgICAgICAgICAgc29yLT51bmxvY2tfc2V0X3JlYWQgPSBiY21kYl9zZXRfdW5sb2NrX3JlYWRfX25iX3JlYWRfc2VtX3dyaXRlOworICAgICAgICAgICAgc29yLT5sb2NrX3NldF9tb2RpZnkgPSBiY21kYl9zZXRfbG9ja19tb2RpZnlfX25iX3JlYWRfc2VtX3dyaXRlOworICAgICAgICAgICAgc29yLT51bmxvY2tfc2V0X21vZGlmeSA9IGJjbWRiX3NldF91bmxvY2tfbW9kaWZ5X19uYl9yZWFkX3NlbV93cml0ZTsKKyAgICAgICAgICAgIHNvci0+bG9ja19zZXRfcmVjdXJzaXZlbHlfbW9kaWZ5ID0gYmNtZGJfc2V0X2xvY2tfcmVjdXJzaXZlbHlfbW9kaWZ5X3NlbSA7CisgICAgICAgICAgICBzb3ItPnVubG9ja19zZXRfcmVjdXJzaXZlbHlfbW9kaWZ5ID0gYmNtZGJfc2V0X3VubG9ja19yZWN1cnNpdmVseV9tb2RpZnlfc2VtIDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoIkxvY2sgcG9saWN5ICVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGluaXQtPmxvY2tfcG9saWN5KTsKKyAgICAgICAgICAgIGlmIChkYXRhKQorICAgICAgICAgICAgICAgIGJjbW9zX2ZyZWUoZGF0YSk7CisgICAgICAgICAgICBpZiAoZW50cmllcykKKyAgICAgICAgICAgICAgICBiY21vc19mcmVlKGVudHJpZXMpOworICAgICAgICAgICAgYmNtb3NfZnJlZShzb3IpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgbXV0ZXhfdXBkYXRlICovCisgICAgcmMgPSBiY21vc19tdXRleF9jcmVhdGUoJnNvci0+bXV0ZXhfdXBkYXRlLCBpbml0LT5vc19mbGFncyk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgaWYgKGRhdGEpCisgICAgICAgICAgICBiY21vc19mcmVlKGRhdGEpOworICAgICAgICBpZiAoZW50cmllcykKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoZW50cmllcyk7CisgICAgICAgIGJjbW9zX2ZyZWUoc29yKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgLyogY3JlYXRlIHNlbV93YWl0X3JlYWRfdG9fZmluaXNoLiBpdCBpcyBpbml0aWFsaXplZCB0byBiZSB0YWtlbiAqLworICAgIHJjID0gYmNtb3Nfc2VtX2NyZWF0ZSgmc29yLT5zZW1fd2FpdF9yZWFkX3RvX2ZpbmlzaCwgMCwgaW5pdC0+b3NfZmxhZ3MpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIC8qIG5vIHBvaW50IHRvIGNoZWNrIGhlcmUgdGhlIGVycm9yIGNvZGUgb2YgYmNtb3NfbXV0ZXhfZGVzdHJveSAqLworICAgICAgICBiY21vc19tdXRleF9kZXN0cm95KCZzb3ItPm11dGV4X3VwZGF0ZSk7CisgICAgICAgIGlmIChkYXRhKQorICAgICAgICAgICAgYmNtb3NfZnJlZShkYXRhKTsKKyAgICAgICAgaWYgKGVudHJpZXMpCisgICAgICAgICAgICBiY21vc19mcmVlKGVudHJpZXMpOworICAgICAgICBiY21vc19mcmVlKHNvcik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJnNvci0+ZmFzdGxvY2ssIGluaXQtPm9zX2ZsYWdzKTsKKworICAgICpuZXdfc2V0ID0gc29yOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqIExvY2sgZGF0YSBzZXQgZm9yIHJlYWRpbmcuIFdoZW4gc2V0IGlzIGxvY2tlZCAtIGl0IGNhbid0IGJlCisgKiAgbW9kaWZpZWQuCisgKgorICogXHBhcmFtW2luXSAgIHNldCAgICAgICAgICAgICBkYXRhIGJhc2Ugc2V0IHRvIGJlIGxvY2tlZAorICoKKyAqIFxpbmdyb3VwIGJjbWRiCisgKi8KK3ZvaWQgYmNtZGJfc2V0X2xvY2tfcmVhZChiY21kYl9zZXQgKnNldCkKK3sKKyAgICBCVUdfT04oIXNldCk7CisgICAgQlVHX09OKCFzZXQtPm1hZ2ljID09IEJDTURCX01BR0lDX0FDVElWRV9TRVQpOworICAgIEJVR19PTighc2V0LT5sb2NrX3NldF9yZWFkKTsKKyAgICBzZXQtPmxvY2tfc2V0X3JlYWQoc2V0KTsKK30KKworCisvKiogUmVsZWFzZSBkYXRhIHNldCBsb2NrCisgKgorICogVW5sb2NrIHNldCBsb2NrZWQgYnkgXHJlZiBiY21kYl9zZXRfbG9ja19yZWFkCisgKgorICogXHBhcmFtW2luXSAgIHNldCAgICAgICAgICAgICBkYXRhIGJhc2Ugc2V0IHRvIGJlIHVubG9ja2VkCisgKgorICogXGluZ3JvdXAgYmNtZGIKKyAqLwordm9pZCBiY21kYl9zZXRfdW5sb2NrX3JlYWQoYmNtZGJfc2V0ICpzZXQpCit7CisgICAgQlVHX09OKCFzZXQpOworICAgIEJVR19PTighc2V0LT5tYWdpYyA9PSBCQ01EQl9NQUdJQ19BQ1RJVkVfU0VUKTsKKyAgICBCVUdfT04oIXNldC0+dW5sb2NrX3NldF9yZWFkKTsKKyAgICBzZXQtPnVubG9ja19zZXRfcmVhZChzZXQpOworfQorCisKKy8qKiBMb2NrIGRhdGEgc2V0IGZvciBtb2RpZnkuIElmIHRoZSBzZXQgaXMgU29TLCB0aGUgbG9ja2luZworICogIHdpbGwgYmUgcmVjdXJzaXZlLgorICoKKyAqIFxwYXJhbVtpbl0gICBzZXQgICAgICAgICAgICAgZGF0YSBiYXNlIHNldCB0byBiZSBsb2NrZWQKKyAqCisgKiBcaW5ncm91cCBiY21kYgorICovCit2b2lkIGJjbWRiX3NldF9sb2NrX21vZGlmeShiY21kYl9zZXQgKnNldCkKK3sKKyAgICBCVUdfT04oIXNldCk7CisgICAgQlVHX09OKCFzZXQtPm1hZ2ljID09IEJDTURCX01BR0lDX0FDVElWRV9TRVQpOworICAgIEJVR19PTighc2V0LT5sb2NrX3NldF9yZWN1cnNpdmVseV9tb2RpZnkpOworICAgIHNldC0+bG9ja19zZXRfcmVjdXJzaXZlbHlfbW9kaWZ5KHNldCk7Cit9CisKKworLyoqIFJlbGVhc2UgZGF0YSBzZXQgbG9jaworICoKKyAqIFVubG9jayBzZXQgbG9ja2VkIGJ5IFxyZWYgYmNtZGJfc2V0X2xvY2tfbW9kaWZ5CisgKgorICogXHBhcmFtW2luXSAgIHNldCAgICAgICAgICAgICBkYXRhIGJhc2Ugc2V0IHRvIGJlIHVubG9ja2VkCisgKgorICogXGluZ3JvdXAgYmNtZGIKKyAqLwordm9pZCBiY21kYl9zZXRfdW5sb2NrX21vZGlmeShiY21kYl9zZXQgKnNldCkKK3sKKyAgICBCVUdfT04oIXNldCk7CisgICAgQlVHX09OKCFzZXQtPm1hZ2ljID09IEJDTURCX01BR0lDX0FDVElWRV9TRVQpOworICAgIEJVR19PTighc2V0LT51bmxvY2tfc2V0X3JlY3Vyc2l2ZWx5X21vZGlmeSk7CisgICAgc2V0LT51bmxvY2tfc2V0X3JlY3Vyc2l2ZWx5X21vZGlmeShzZXQpOworfQorCisKKy8qKiBBZGQgc2V0IHRvIHRoZSBwYXJlbnQgc2V0IHdpdGggc3BlY2lmaWMga2V5LgorICoKKyAqIFRoZSBmdW5jdGlvbiBhZGRzIHNldCB0byB0aGUgcGFyZW50IHNldCBjcmVhdGluZyBkYXRhIGJhc2UgaGllcmFyY2h5LgorICogVGhlIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgYWNxdWlyZXMgbW9kaWZ5IGxvY2sgYW5kIHJlbGVhc2VzIGl0CisgKiBpbiB0aGUgZW5kIG9mIG9wZXJhdGlvbi4KKyAqIFxwYXJhbVtpbl0gICBzb3MgICAgICAgICAgICAgcGFyZW50IHNldCBvZiBzZXRzCisgKiBccGFyYW1baW5dICAga2V5ICAgICAgICAgICAgIGtleSB0byBhZGQgbmV3IHNldCBhdAorICogXHBhcmFtW2luXSAgIG5ld19zZXQgICAgICAgICBzZXQgY29udHJvbCBibG9jaworICogXHJldHVybgorICogICAgICA9MCAgLSBPS1xuCisgKiAgICAgIDwwICAtIGVycm9yIGNvZGUKKyAqIFxpbmdyb3VwIGJjbWRiCisgKi8KK2ludCBiY21kYl9zZXRfYWRkKGJjbWRiX3NldCAqc29zLCBiY21kYl9rZXkga2V5LCBiY21kYl9zZXQgKm5ld19zZXQpCit7CisgICAgaW50IHJjOworICAgIGxvbmcgZmFzdGxvY2tfZmxhZ3M7CisgICAgQlVHX09OKCFzb3MpOworICAgIEJVR19PTighc29zLT5tYWdpYyA9PSBCQ01EQl9NQUdJQ19BQ1RJVkVfU0VUKTsKKyAgICBCVUdfT04oIShzb3MtPmVudHJ5LmZsYWdzICYgQkNNREJfRkxBR19TT1MpKTsKKyAgICBCVUdfT04oIW5ld19zZXQpOworICAgIEJVR19PTighbmV3X3NldC0+bWFnaWMgPT0gQkNNREJfTUFHSUNfQUNUSVZFX1NFVCk7CisgICAgQlVHX09OKCFuZXdfc2V0LT5teV9rZXkgPT0gQkNNREJfS0VZX0lOVkFMKTsKKyAgICBmYXN0bG9ja19mbGFncyA9IHNvcy0+bG9ja19zZXRfbW9kaWZ5KHNvcyk7CisgICAgcmMgPSBzb3MtPmVudHJ5X25ldyhzb3MsIGtleSwgbmV3X3NldCk7CisgICAgc29zLT51bmxvY2tfc2V0X21vZGlmeShzb3MsIGZhc3Rsb2NrX2ZsYWdzKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyoqIEdldCBzZXQgaGFuZGxlIGdpdmVuIGl0cyBrZXkuCisgKgorICogXHBhcmFtW2luXSAgIHNvcyAgICAgICAgICAgICBwYXJlbnQgc2V0IG9mIHNldHMKKyAqIFxwYXJhbVtpbl0gICBrZXkgICAgICAgICAgICAgc2V0IGtleS4KKyAqIFxyZXR1cm4KKyAqICAgICAgIT0wIC0gc2V0IGhhbmRsZQorICogICAgICBOVUxMLSBkb2Vzbid0IGV4aXN0CisgKiBcaW5ncm91cCBiY21kYgorICovCitiY21kYl9zZXQgKmJjbWRiX3NldF9oYW5kbGUoY29uc3QgYmNtZGJfc2V0ICpzb3MsIGJjbWRiX2tleSBrZXkpCit7CisgICAgYmNtZGJfZW50cnkgKmVudHJ5OworICAgIEJVR19PTighc29zKTsKKyAgICBCVUdfT04oIXNvcy0+bWFnaWMgPT0gQkNNREJfTUFHSUNfQUNUSVZFX1NFVCk7CisgICAgQlVHX09OKCEoc29zLT5lbnRyeS5mbGFncyAmIEJDTURCX0ZMQUdfU09TKSk7CisgICAgZW50cnkgPSBzb3MtPmtleV90b19oYW5kbGUoc29zLCBrZXkpOworICAgIGlmICghZW50cnkgfHwgIShlbnRyeS0+ZmxhZ3MgJiBCQ01EQl9GTEFHX1ZBTElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChiY21kYl9zZXQgKillbnRyeS0+ZGF0YTsKK30KKworCisvKiogR2V0IHNldCBrZXkgZ2l2ZW4gaXRzIGhhbmRsZS4KKyAqCisgKiBccGFyYW1baW5dICAgc2V0ICAgICAgICAgICAgIHNldCBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBrZXkgICAgICAgICAgICAgc2V0IGtleS4KKyAqIFxyZXR1cm4KKyAqICAgICAgIT1CQ01EQl9LRVlfSU5WQUwgLSBzZXQga2V5CisgKiAgICAgIEJDTURCX0tFWV9JTlZBTCAtIGVycm9yCisgKiBcaW5ncm91cCBiY21kYgorICovCitiY21kYl9rZXkgYmNtZGJfc2V0X2tleShjb25zdCBiY21kYl9zZXQgKnNldCkKK3sKKyAgICBCVUdfT04oIXNldCk7CisgICAgQlVHX09OKCFzZXQtPm1hZ2ljID09IEJDTURCX01BR0lDX0FDVElWRV9TRVQpOworICAgIHJldHVybiBzZXQtPm15X2tleTsKK30KKworCisvKiogR2V0IHNldCBuYW1lCisgKgorICogXHBhcmFtW2luXSAgIHNldCAgICAgICAgICAgICBzZXQgaGFuZGxlCisgKiBccmV0dXJuIHNldCBuYW1lCisgKiBcaW5ncm91cCBiY21kYgorICovCitjb25zdCBjaGFyICpiY21kYl9zZXRfbmFtZShjb25zdCBiY21kYl9zZXQgKnNldCkKK3sKKyAgICBCVUdfT04oIXNldCk7CisgICAgQlVHX09OKCFzZXQtPm1hZ2ljID09IEJDTURCX01BR0lDX0FDVElWRV9TRVQpOworICAgIHJldHVybiBzZXQtPm5hbWU7Cit9CisKKworLyoqIEdldCBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgc2V0LgorICoKKyAqIFxwYXJhbVtpbl0gICBzZXQgICAgICAgICAgICAgc2V0IGhhbmRsZQorICogXHJldHVybiBudW1iZXIgb2YgYWN0aXZlIHJlY29yZHMgaW4gdGhlIHNldAorICogXGluZ3JvdXAgYmNtZGIKKyAqLworaW50IGJjbWRiX3NldF9udW1fcmVjb3Jkcyhjb25zdCBiY21kYl9zZXQgKnNldCkKK3sKKyAgICBCVUdfT04oIXNldCk7CisgICAgQlVHX09OKCFzZXQtPm1hZ2ljID09IEJDTURCX01BR0lDX0FDVElWRV9TRVQpOworICAgIHJldHVybiBzZXQtPm51bV9lbnRyaWVzOworfQorCisKKy8qKiBHZXQgZW50cnkgc2l6ZQorICoKKyAqIFxwYXJhbVtpbl0gICBzZXQgICAgICAgICAgICAgc2V0IGhhbmRsZQorICogXHJldHVybiBzZXQgZW50cnkgc2l6ZQorICogXGluZ3JvdXAgYmNtZGIKKyAqLworaW50IGJjbWRiX3NldF9lbnRyeV9zaXplKGNvbnN0IGJjbWRiX3NldCAqc2V0KQoreworICAgIEJVR19PTighc2V0KTsKKyAgICBCVUdfT04oIXNldC0+bWFnaWMgPT0gQkNNREJfTUFHSUNfQUNUSVZFX1NFVCk7CisgICAgcmV0dXJuIHNldC0+ZW50cnlfc2l6ZTsKK30KKworCisvKiogQWRkIHJlY29yZCB0byB0aGUgcGFyZW50IHNldCB3aXRoIHNwZWNpZmljIGtleS4KKyAqCisgKiBUaGUgZnVuY3Rpb24gY3JlYXRlcyBhIG5ldyByZWNvcmQgYW5kIGFkZHMgaXQgdG8gdGhlIHBhcmVudCBzZXQgd2l0aCBzcGVjaWZpYyBrZXkuCisgKiBUaGUgZnVuY3Rpb24gYXV0b21hdGljYWxseSBhY3F1aXJlcyBtb2RpZnkgbG9jayBhbmQgcmVsZWFzZXMgaXQKKyAqIGluIHRoZSBlbmQgb2Ygb3BlcmF0aW9uLgorICogXHBhcmFtW2luXSAgIHNvciAgICAgICAgICAgICBwYXJlbnQgc2V0IG9mIHJlY29yZHMKKyAqIFxwYXJhbVtpbl0gICBrZXkgICAgICAgICAgICAga2V5IHRvIGFkZCBuZXcgc2V0IGF0CisgKiBccGFyYW1baW5dICAgZGF0YSAgICAgICAgICAgIHJlY29yZCBkYXRhLiBEYXRhIHNpemUgaXMgZGVmaW5lZCBhdCBwYXJlbnQgU09SIHJlZ2lzdHJhdGlvbiB0aW1lLgorICogXHBhcmFtW291dF0gIHBfcmVjb3JkICAgICAgICBuZXcgcmVjb3JkIGhhbmRsZQorICogXHJldHVybgorICogICAgICA9MCAgLSBPS1xuCisgKiAgICAgIDwwICAtIGVycm9yIGNvZGUKKyAqIFxpbmdyb3VwIGJjbWRiCisgKi8KK2ludCBiY21kYl9yZWNvcmRfYWRkKGJjbWRiX3NldCAqc29yLCBiY21kYl9rZXkga2V5LCBjb25zdCB2b2lkICpkYXRhKQoreworICAgIGludCByYzsKKyAgICBsb25nIGZhc3Rsb2NrX2ZsYWdzOworCisgICAgQlVHX09OKCFzb3IpOworICAgIEJVR19PTighZGF0YSk7CisgICAgQlVHX09OKCFzb3ItPm1hZ2ljID09IEJDTURCX01BR0lDX0FDVElWRV9TRVQpOworICAgIEJVR19PTighKHNvci0+ZW50cnkuZmxhZ3MgJiBCQ01EQl9GTEFHX1NPUyk9PTApOworCisgICAgZmFzdGxvY2tfZmxhZ3MgPSBzb3ItPmxvY2tfc2V0X21vZGlmeShzb3IpOworICAgIHJjPXNvci0+ZW50cnlfbmV3KHNvciwga2V5LCBkYXRhKTsKKyAgICBzb3ItPnVubG9ja19zZXRfbW9kaWZ5KHNvciwgZmFzdGxvY2tfZmxhZ3MpOworICAgIHJldHVybiByYzsKK30KKworCisvKiogRGVsZXRlIHJlY29yZCBmcm9tIHRoZSBwYXJlbnQgU29SIGdpdmVuIHRoZSByZWNvcmQga2V5LgorICoKKyAqIFRoZSBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGFjcXVpcmVzIG1vZGlmeSBsb2NrIGFuZCByZWxlYXNlcyBpdAorICogaW4gdGhlIGVuZCBvZiBvcGVyYXRpb24uCisgKgorICogXHBhcmFtW2luXSAgIHNvciAgICAgICAgICAgICBwYXJlbnQgc2V0IG9mIHJlY29yZHMKKyAqIFxwYXJhbVtpbl0gICBrZXkgICAgICAgICAgICAgcmVjb3JkIGtleS4KKyAqLwordm9pZCBiY21kYl9yZWNvcmRfZGVsZXRlKGJjbWRiX3NldCAqc29yLCBiY21kYl9rZXkga2V5KQoreworICAgIEJVR19PTighc29yKTsKKyAgICBCVUdfT04oIXNvci0+bWFnaWMgPT0gQkNNREJfTUFHSUNfQUNUSVZFX1NFVCk7CisgICAgQlVHX09OKCEoc29yLT5lbnRyeS5mbGFncyAmIEJDTURCX0ZMQUdfU09TKT09MCk7CisKKyAgICBzb3ItPmxvY2tfcmVjb3JkX3dyaXRlKHNvciwga2V5LCAxKTsKKyAgICBzb3ItPnVubG9ja19yZWNvcmRfd3JpdGUoc29yLCAxLCAwKTsKK30KKworCisvKiogR2V0IHJlY29yZCBkYXRhIHBvaW50ZXIgd2l0aG91dCBsb2NraW5nLgorICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8gZGF0YSBzdHJ1Y3R1cmUgc3RvcmVkIGluIGRhdGEgYmFzZSByZWNvcmQuXG4KKyAqIEF0dGVudGlvbiEgVGhlIGNhbGxlciBpcyByZXF1aXJlZCB0byBhcXVpcmUgcmVhZCBvciB3cml0ZSBsb2NrIC0gYXMgYXBwcm9wcmlhdGUKKyAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYW5kIHJlbGVhc2UgdGhlIGxvY2sgd2hlbiBwcm9jZXNzaW5nIGlzIGZpbmlzaGVkLgorICoKKyAqIFxwYXJhbVtpbl0gICBzb3IgICAgICAgICAgICAgcGFyZW50IHNldCBvZiByZWNvcmRzCisgKiBccGFyYW1baW5dICAga2V5ICAgICAgICAgICAgIHJlY29yZCBrZXkKKyAqIFxyZXR1cm4KKyAqICAgICAgZGF0YSBwb2ludGVyLiBOVUxMIGlmIHRoZXJlIGlzIG5vIHJlY29yZCBtYXRjaGluZyB0aGUga2V5LgorICogXGluZ3JvdXAgYmNtZGIKKyAqLwordm9pZCAqYmNtZGJfcmVjb3JkX2dldHJhd19ub2xvY2soYmNtZGJfc2V0ICpzb3IsIGJjbWRiX2tleSBrZXkpCit7CisgICAgYmNtZGJfZW50cnkgKmVudHJ5OworICAgIEJVR19PTighc29yKTsKKyAgICBCVUdfT04oIXNvci0+bWFnaWMgPT0gQkNNREJfTUFHSUNfQUNUSVZFX1NFVCk7CisgICAgQlVHX09OKCEoc29yLT5lbnRyeS5mbGFncyAmIEJDTURCX0ZMQUdfU09TKT09MCk7CisgICAgZW50cnkgPSBzb3ItPmtleV90b19oYW5kbGUoc29yLCBrZXkpOworICAgIGlmICghZW50cnkgfHwgIShlbnRyeS0+ZmxhZ3MgJiBCQ01EQl9GTEFHX1ZBTElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGVudHJ5LT5kYXRhOworfQorCisKKy8qKiBMb2NrIHJlY29yZCBmb3IgcmVhZGluZyBhbmQgcmV0dXJuIHJlY29yZCBkYXRhIHBvaW50ZXIuCisgKgorICogVGhlIGZ1bmN0aW9uIGFxdWlyZXMgcmVhZC1sb2NrIGFuZCByZXR1cm5zIHBvaW50ZXIgdG8gZGF0YSBzdHJ1Y3R1cmUgc3RvcmVkIGluIGRhdGEgYmFzZSByZWNvcmQuXG4KKyAqIHJlYWQtbG9jayBtdXN0IGJlIHJlbGVhc2VkIHNlcGFyYXRlbHkgd2hlbiB0aGUgcG9pbnRlciBpcyBubyBsb25nZXIgaW4gdXNlLgorICogTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHJlY29yZC1yZWFkIGxvY2sgaXMgbm9uLWJsb2NraW5nIGFuZCBjb3VudGluZy4KKyAqIFRoYXQgbWVhbnMgdGhhdCBtdWx0aXBsZSBwcm9jZXNzZXMgY2FtIHJlYWQtbG9jayB0aGUgc2FtZSByZWNvcmQgd2l0aG91dCBibG9ja2luZy4KKyAqIFRoZSBmdW5jdGlvbiBpcyBsb3ctbGV2ZWwuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBtYWNybyBccmVmIGJjbWRiX3JlY29yZF9nZXRfcmVhZCBpbnN0ZWFkLgorICoKKyAqIFxwYXJhbVtpbl0gICBzb3IgICAgICAgICAgICAgcGFyZW50IHNldCBvZiByZWNvcmRzCisgKiBccGFyYW1baW5dICAga2V5ICAgICAgICAgICAgIHJlY29yZCBrZXkKKyAqIFxyZXR1cm4KKyAqICAgICAgZGF0YSBwb2ludGVyLiBOVUxMIGlmIHRoZXJlIGlzIG5vIHJlY29yZCBtYXRjaGluZyB0aGUga2V5LgorICogXGluZ3JvdXAgYmNtZGIKKyAqLworY29uc3Qgdm9pZCAqYmNtZGJfcmVjb3JkX2dldHJhd19yZWFkKGJjbWRiX3NldCAqc29yLCBiY21kYl9rZXkga2V5KQoreworICAgIEJVR19PTighc29yKTsKKyAgICBCVUdfT04oIXNvci0+bWFnaWMgPT0gQkNNREJfTUFHSUNfQUNUSVZFX1NFVCk7CisgICAgQlVHX09OKCEoc29yLT5lbnRyeS5mbGFncyAmIEJDTURCX0ZMQUdfU09TKT09MCk7CisgICAgcmV0dXJuIHNvci0+bG9ja19yZWNvcmRfcmVhZChzb3IsIGtleSk7Cit9CisKKworLyoqIFVubG9jayByZWNvcmQgbG9ja2VkIGZvciByZWFkaW5nLgorICoKKyAqIFxwYXJhbVtpbl0gICBzb3IgICAgICAgICAgICAgcGFyZW50IHNldCBvZiByZWNvcmRzCisgKiBccGFyYW1baW5dICAga2V5ICAgICAgICAgICAgIHJlY29yZCBrZXkKKyAqCisgKiBcaW5ncm91cCBiY21kYgorICovCit2b2lkIGJjbWRiX3JlY29yZF91bmxvY2tfcmVhZChiY21kYl9zZXQgKnNvciwgYmNtZGJfa2V5IGtleSkKK3sKKyAgICBCVUdfT04oIXNvcik7CisgICAgQlVHX09OKCFzb3ItPm1hZ2ljID09IEJDTURCX01BR0lDX0FDVElWRV9TRVQpOworICAgIEJVR19PTighKHNvci0+ZW50cnkuZmxhZ3MgJiBCQ01EQl9GTEFHX1NPUyk9PTApOworICAgIHNvci0+dW5sb2NrX3JlY29yZF9yZWFkKHNvciwga2V5KTsKK30KKworCisvKiogUmVhZCByZWNvcmQgZGF0YSBpbnRvIHVzZXIgYXJlYS4KKyAqCisgKiBUaGUgZnVuY3Rpb24gYXF1aXJlcyByZWFkLWxvY2ssIHJlYWRzIGRhdGEgaW50byB1c2VyIGFyZWEgYW5kIHJlbGVhc2VzIHJlYWQtbG9jay4KKyAqCisgKiBccGFyYW1baW5dICAgc29yICAgICAgICAgICAgIHBhcmVudCBzZXQgb2YgcmVjb3JkcworICogXHBhcmFtW2luXSAgIGtleSAgICAgICAgICAgICByZWNvcmQga2V5CisgKiBccGFyYW1baW5dICAgb2Zmc2V0ICAgICAgICAgIG9mZnNldCBpbiBkYXRhIHJlY29yZAorICogXHBhcmFtW2luXSAgIHNpemUgICAgICAgICAgICBkYXRhIHNpemUuIE5vdGUgdGhhdCBvZmZzZXQrc2l6ZSBtdXN0IGJlIDw9IHJlY29yZF9zaXplCisgKiBccGFyYW1baW5dICAgZGF0YSAgICAgICAgICAgIGRhdGEgcG9pbnRlci4KKyAqIFxyZXR1cm4KKyAqICAgICAgPTAtT0tcbgorICogICAgICA8MC1lcnJvciBjb2RlCisgKiBcaW5ncm91cCBiY21kYgorICovCitpbnQgYmNtZGJfcmVjb3JkX3JlYWQoYmNtZGJfc2V0ICpzb3IsIGJjbWRiX2tleSBrZXksIGludCBvZmZzZXQsIGludCBzaXplLCB2b2lkICpkYXRhKQoreworICAgIGNvbnN0IHZvaWQgKmQgPSBiY21kYl9yZWNvcmRfZ2V0cmF3X3JlYWQoc29yLCBrZXkpOworICAgIGlmICghZCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICBpZiAoKHVuc2lnbmVkKW9mZnNldCArICh1bnNpZ25lZClzaXplID4gc29yLT5lbnRyeV9zaXplKQorICAgIHsKKyAgICAgICAgYmNtZGJfcmVjb3JkX3VubG9ja19yZWFkKHNvciwga2V5KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgbWVtY3B5KGRhdGEsIChjb25zdCBjaGFyICopZCsodW5zaWduZWQpb2Zmc2V0LCAodW5zaWduZWQpc2l6ZSk7CisgICAgYmNtZGJfcmVjb3JkX3VubG9ja19yZWFkKHNvciwga2V5KTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKiogTG9jayByZWNvcmQgZm9yIHdyaXRpbmcgYW5kIHJldHVybiByZWNvcmQgZGF0YSBwb2ludGVyLgorICoKKyAqIFRoZSBmdW5jdGlvbiBhcXVpcmVzIHdyaXRlLWxvY2sgYW5kIHJldHVybnMgcG9pbnRlciB0byBkYXRhIHN0cnVjdHVyZSBzdG9yZWQgaW4gZGF0YSBiYXNlIHJlY29yZC5cbgorICogd3JpdGUtbG9jayBtdXN0IGJlIHJlbGVhc2VkIHNlcGFyYXRlbHkgd2hlbiB0aGUgcG9pbnRlciBpcyBubyBsb25nZXIgaW4gdXNlLgorICogVGhlIGZ1bmN0aW9uIGlzIGxvdy1sZXZlbC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIG1hY3JvIFxyZWYgYmNtZGJfcmVjb3JkX2dldF93cml0ZSBpbnN0ZWFkLgorICoKKyAqIFxwYXJhbVtpbl0gICBzb3IgICAgICAgICAgICAgcGFyZW50IHNldCBvZiByZWNvcmRzCisgKiBccGFyYW1baW5dICAga2V5ICAgICAgICAgICAgIHJlY29yZCBrZXkKKyAqIFxyZXR1cm4KKyAqICAgICAgZGF0YSBwb2ludGVyLiBOVUxMIGlmIHRoZXJlIGlzIG5vIHJlY29yZCBtYXRjaGluZyB0aGUga2V5LgorICogXGluZ3JvdXAgYmNtZGIKKyAqLwordm9pZCAqYmNtZGJfcmVjb3JkX2dldHJhd193cml0ZShiY21kYl9zZXQgKnNvciwgYmNtZGJfa2V5IGtleSkKK3sKKyAgICBCVUdfT04oIXNvcik7CisgICAgQlVHX09OKCFzb3ItPm1hZ2ljID09IEJDTURCX01BR0lDX0FDVElWRV9TRVQpOworICAgIEJVR19PTighKHNvci0+ZW50cnkuZmxhZ3MgJiBCQ01EQl9GTEFHX1NPUyk9PTApOworICAgIHJldHVybiBzb3ItPmxvY2tfcmVjb3JkX3dyaXRlKHNvciwga2V5LCAwKTsKK30KKworCisvKiogVW5sb2NrIHJlY29yZCBsb2NrZWQgZm9yIHdyaXRpbmcuCisgKgorICogXHBhcmFtW2luXSAgIHNvciAgICAgICAgICAgICBwYXJlbnQgc2V0IG9mIHJlY29yZHMKKyAqIFxwYXJhbVtpbl0gICBpc19jYW5jZWxsYXRpb24gVFJVRT1jYW5jZWwgdHJhbnNhY3Rpb24KKyAqCisgKiBcaW5ncm91cCBiY21kYgorICovCit2b2lkIGJjbWRiX3JlY29yZF91bmxvY2tfd3JpdGUoYmNtZGJfc2V0ICpzb3IsIGludCBpc19jYW5jZWxsYXRpb24pCit7CisgICAgQlVHX09OKCFzb3IpOworICAgIEJVR19PTighc29yLT5tYWdpYyA9PSBCQ01EQl9NQUdJQ19BQ1RJVkVfU0VUKTsKKyAgICBCVUdfT04oIShzb3ItPmVudHJ5LmZsYWdzICYgQkNNREJfRkxBR19TT1MpPT0wKTsKKyAgICBzb3ItPnVubG9ja19yZWNvcmRfd3JpdGUoc29yLCAwLCBpc19jYW5jZWxsYXRpb24pOworfQorCisKKy8qKiBXcml0ZSByZWNvcmQgZGF0YS4KKyAqCisgKiBUaGUgZnVuY3Rpb24gYXF1aXJlcyBtb2RpZnktbG9jaywgcmVwbGFjZXMgZGF0YSBzdG9yZWQgaW4gZGF0YSBiYXNlIHJlY29yZAorICogYW5kIHJlbGVzZXMgdGhlIGxvY2suCisgKgorICogXHBhcmFtW2luXSAgIHNvciAgICAgICAgICAgICBwYXJlbnQgc2V0IG9mIHJlY29yZHMKKyAqIFxwYXJhbVtpbl0gICBrZXkgICAgICAgICAgICAgcmVjb3JkIGtleQorICogXHBhcmFtW2luXSAgIG9mZnNldCAgICAgICAgICBvZmZzZXQgaW4gZGF0YSByZWNvcmQKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgICAgICAgICAgZGF0YSBzaXplLiBOb3RlIHRoYXQgb2Zmc2V0K3NpemUgbXVzdCBiZSA8PSByZWNvcmRfc2l6ZQorICogXHBhcmFtW2luXSAgIGRhdGEgICAgICAgICAgICBkYXRhIHBvaW50ZXIuCisgKiBccmV0dXJuCisgKiAgICAgID0wLU9LXG4KKyAqICAgICAgPDAtZXJyb3IgY29kZQorICogXGluZ3JvdXAgYmNtZGIKKyAqLworaW50IGJjbWRiX3JlY29yZF93cml0ZShiY21kYl9zZXQgKnNvciwgYmNtZGJfa2V5IGtleSwgaW50IG9mZnNldCwgaW50IHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpCit7CisgICAgdm9pZCAqZD1iY21kYl9yZWNvcmRfZ2V0cmF3X3dyaXRlKHNvciwga2V5KTsKKyAgICBpZiAoIWQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgaWYgKCh1bnNpZ25lZClvZmZzZXQgKyAodW5zaWduZWQpc2l6ZSA+IHNvci0+ZW50cnlfc2l6ZSkKKyAgICB7CisgICAgICAgIGJjbWRiX3JlY29yZF91bmxvY2tfd3JpdGUoc29yLCAwKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgbWVtY3B5KChjaGFyICopZCsodW5zaWduZWQpb2Zmc2V0LCBkYXRhLCAodW5zaWduZWQpc2l6ZSk7CisgICAgYmNtZGJfcmVjb3JkX3VubG9ja193cml0ZShzb3IsIDApOworICAgIHJldHVybiAwOworfQorCisKKy8qKiBSZWdpc3RlciBub3RpZmljYXRpb24gZnVuY3Rpb24gdG8gZ2V0IGluZm9ybWVkCisgKiB3aGVuIGRhdGEgYmFzZSBzZXQgaXMgbW9kaWZpZWQuCisgKgorICogXHBhcmFtW2luXSAgIHNvciAgICAgICAgICAgICBwYXJlbnQgc2V0IG9mIHJlY29yZHMKKyAqIFxwYXJhbVtpbl0gICBjYiAgICAgICAgICAgICAgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICogXHBhcmFtW2luXSAgIGNiX3ByaXYgICAgICAgICBwcml2YXRlIGRhdGEgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaworICogXHJldHVybgorICogICAgICA9MCAgLSBPS1xuCisgKiAgICAgIDwwICAtIGVycm9yIGNvZGUKKyAqIFxpbmdyb3VwIGJjbWRiCisgKi8KK2ludCBiY21kYl9zZXRfbm90aWZ5X3JlZ2lzdGVyKGJjbWRiX3NldCAqc29yLCBiY21kYl9ub3RpZnlfY2IgY2IsIGxvbmcgY2JfcHJpdikKK3sKKyAgICBiY21kYl9ub3RpZnkgKm5mX25ldywgKm5mLCAqbmZfcHJldiA9IE5VTEw7CisKKyAgICBCVUdfT04oIXNvcik7CisgICAgQlVHX09OKCFzb3ItPm1hZ2ljID09IEJDTURCX01BR0lDX0FDVElWRV9TRVQpOworICAgIEJVR19PTighY2IpOworCisgICAgbmZfbmV3ID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21kYl9ub3RpZnkpKTsKKyAgICBpZiAoIW5mX25ldykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgbmZfbmV3LT5jYiA9IGNiOworICAgIG5mX25ldy0+Y2JfcHJpdiA9IGNiX3ByaXY7CisKKyAgICAvKiBBZGQgdG8gc2V0J3Mgbm90aWZpY2F0aW9uIGxpc3QgKi8KKyAgICBuZiA9IHNvci0+bm90aWZ5X2xpc3RfaGVhZDsKKyAgICB3aGlsZShuZikKKyAgICB7CisgICAgICAgIG5mX3ByZXYgPSBuZjsKKyAgICAgICAgbmYgPSBuZi0+bmV4dDsKKyAgICB9CisgICAgaWYgKG5mX3ByZXYpCisgICAgICAgIG5mX3ByZXYtPm5leHQgPSBuZl9uZXc7CisgICAgZWxzZQorICAgICAgICBzb3ItPm5vdGlmeV9saXN0X2hlYWQgPSBuZl9uZXc7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKiogRGF0YSBiYXNlIGl0ZXJhdG9yCisgKgorICogXHBhcmFtW2luXSAgIHNldCAgICAgICAgICAgICBkYXRhIGJhc2Ugc2V0CisgKiBccGFyYW1baW5dICAgcHJldiAgICAgICAgICAgIGxhc3QgZW50cnkuIEJDTURCX0tFWV9BTlk9c3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nCisgKiBccmV0dXJuICBkYXRhIGJhc2UgZW50cnkga2V5IGZvbGxvd2luZyBwcmV2IG9yIEJDTURCX0tFWV9OT19NT1JFIGlmIGVuZCBpcyByZWFjaGVkLlxuCisgKiAgICAgICAgICBCQ01EQl9LRVlfSU5WQUwgaXMgcmVxdHVybmVkIGlmIHByZXYga2V5IGlzIGludmFsaWQKKyAqIFxpbmdyb3VwIGJjbWRiCisgKi8KK2JjbWRiX2tleSBiY21kYl9zZXRfaXRlcmF0ZShjb25zdCBiY21kYl9zZXQgKnNldCwgYmNtZGJfa2V5IHByZXYpCit7CisgICAgQlVHX09OKCFzZXQpOworICAgIEJVR19PTighc2V0LT5tYWdpYyA9PSBCQ01EQl9NQUdJQ19BQ1RJVkVfU0VUKTsKKyAgICByZXR1cm4gc2V0LT5lbnRyeV9nZXRfbmV4dChzZXQsIHByZXYpOworfQorCisKKy8qIFByaW50IGRhdGFiYXNlIHN0cnVjdHVyZSAqLworc3RhdGljIHZvaWQgX2JjbWRiX3ByaW50X3N0cnVjdHVyZShjb25zdCBiY21kYl9zZXQgKnNldCwgaW50IGxldmVsKQoreworICAgIGludCBpOworCisgICAgaWYgKCFzZXQpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIEluZGVudGF0aW9uICovCisgICAgZm9yKGk9MDsgaTxsZXZlbDsgaSsrKQorICAgICAgICBwcmludGYoIlx0Iik7CisKKyAgICBpZiAoKHNldC0+ZW50cnkuZmxhZ3MgJiBCQ01EQl9GTEFHX1NPUykpCisgICAgeworICAgICAgICBiY21kYl9rZXkga2V5ID0gYmNtZGJfc2V0X2l0ZXJhdGUoc2V0LCBCQ01EQl9LRVlfQU5ZKTsKKyAgICAgICAgcHJpbnRmKCIlLTE2cyBTb1MgbWF4X2VudHJpZXM9JWQgZW50cmllcz0lZFxuIiwgc2V0LT5uYW1lLCBzZXQtPm1heF9lbnRyaWVzLCBzZXQtPm51bV9lbnRyaWVzKTsKKyAgICAgICAgd2hpbGUoa2V5ID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9iY21kYl9wcmludF9zdHJ1Y3R1cmUoYmNtZGJfc2V0X2hhbmRsZShzZXQsIGtleSksIGxldmVsKzEpOworICAgICAgICAgICAga2V5ID0gYmNtZGJfc2V0X2l0ZXJhdGUoc2V0LCBrZXkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ZigiJS0xNnMgU29SIG1heF9lbnRyaWVzPSVkIGVudHJpZXM9JWQgcmVjb3JkX3NpemU9JWQgdG90YWxfc2l6ZT0lZFxuIiwKKyAgICAgICAgICAgICAgIHNldC0+bmFtZSwgc2V0LT5tYXhfZW50cmllcywgc2V0LT5udW1fZW50cmllcywgc2V0LT5lbnRyeV9zaXplLAorICAgICAgICAgICAgICAgc2V0LT5lbnRyeV9zaXplKnNldC0+bWF4X2VudHJpZXMpOworICAgIH0KK30KKworCisvKiogUHJpbnQgZGF0YWJhc2Ugc3RydWN0dXJlLgorICoKKyAqIFxwYXJhbVtpbl0gICBzZXQgICAgICAgICAgICAgcm9vdCBzZXQKKyAqIFxpbmdyb3VwIGJjbWRiCisgKi8KK3ZvaWQgYmNtZGJfc2V0X3ByaW50X3N0cnVjdHVyZShjb25zdCBiY21kYl9zZXQgKnNldCkKK3sKKyAgICBfYmNtZGJfcHJpbnRfc3RydWN0dXJlKHNldCwgMCk7Cit9CisKKworLyoqIEZvcm1hdCByZWNvcmQgZm9yIHByaW50aW5nLgorICoKKyAqIFRoZSBmdW5jdGlvbiBjb252ZXJ0cyByZWNvcmQgZGF0YSB0byBodW1hbi1yZWFkaWJsZSBmb3JtYXQuCisgKgorICogXHBhcmFtW2luXSAgIHNvciAgICAgICAgICAgICBwYXJlbnQgc2V0IG9mIHJlY29yZHMKKyAqIFxwYXJhbVtpbl0gICBrZXkgICAgICAgICAgICAgcmVjb3JkIGtleQorICogXHBhcmFtW291dF0gIGJ1ZmZlciAgICAgICAgICBvdXRwdXQgYnVmZmVyCisgKiBccGFyYW1baW5dICAgc2l6ZSAgICAgICAgICAgIGJ1ZmZlciBzaXplCisgKiBccmV0dXJuCisgKiAgICAgID49MC1hbW91bnQgb2YgZGF0YSBwbGFjZWQgaW4gdGhlIGJ1ZmZlclxuCisgKiAgICAgIDwwLWVycm9yIGNvZGUKKyAqLworaW50IGJjbWRiX3JlY29yZF9yZWFkX2Zvcm1hdHRlZChiY21kYl9zZXQgKnNvciwgYmNtZGJfa2V5IGtleSwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIGludCBsZW47CisgICAgaWYgKCFidWZmZXIgfHwgIXNpemUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgaWYgKCFzb3ItPmZvcm1hdCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAqYnVmZmVyPTA7CisgICAgZGF0YSA9IGJjbWRiX3JlY29yZF9nZXRyYXdfcmVhZChzb3IsIGtleSk7CisgICAgaWYgKCFkYXRhKQorICAgICAgICByZXR1cm4gMDsKKyAgICBsZW4gPSBzb3ItPmZvcm1hdChkYXRhLCBidWZmZXIsIHNpemUpOworICAgIGJjbWRiX3JlY29yZF91bmxvY2tfcmVhZChzb3IsIGtleSk7CisgICAgcmV0dXJuIGxlbjsKK30KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vZGJfZW5naW5lL2JjbV9kYl9lbmdpbmUuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vZGJfZW5naW5lL2JjbV9kYl9lbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDc3MDIyCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9kYl9lbmdpbmUvYmNtX2RiX2VuZ2luZS5oCkBAIC0wLDAgKzEsNjIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoKKyAqIGJjbV9kYl9lbmdpbmUuYworICoKKyAqIERhdGEgYmFzZSBlbmdpbmUKKyAqLworI2lmbmRlZiBCQ01EQl9FTkdJTkVfSAorCisjZGVmaW5lIEJDTURCX0VOR0lORV9ICisKKy8qKiAgXGRlZmdyb3VwIGJjbWRiX2UgRGF0YSBCYXNlIEVuZ2luZSBNb2R1bGUKK0hpZXJhcmNoaWNhbCBkYXRhIGJhc2UgaXMgYnVpbHQgZnJvbSAzIHR5cGVzIG9mIG9iamVjdHM6CistIHNldDogY29uc2lzdHMgb2YgY29udHJvbCBpbmZvIGFuZCBkeW5hbWljIGFycmF5IG9mIG90aGVyIHNldHMgT1Igb2YgcmVjb3JkcyBvZiB0aGUgc2FtZSBraW5kLgorICAgIC0gTWl4aW5nIHN1YnNldHMgYW5kIHJlY29yZHMgaW4gdGhlIHNhbWUgc2V0IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgLSBTZXRzIGFyZSBvYmplY3RzIHRoYXQgcGVyZm9ybSBvcGVyYXRpb25zIGxpa2UgYWNjZXNzLCBsb2NraW5nLCBhZGRpbmcgb3IgcmVtb3ZpbmcgZWxlbWVudHMsCisgICAgICBldGMuLCB2aWEgbWV0aG9kcyB0aGF0IGNhbiBkaWZmZXIgZm9yIGV2ZXJ5IHNldC4KKyAgICAtIFNldCBlbGVtZW50cyBhcmUgYWRkcmVzc2VkIHVzaW5nIGEgc2luZ2xlIGtleS4KKyAgICAtIE1vc3Qgc2V0cyBhcmUgaW50ZXJuYWxseSBvcmdhbml6ZWQgYXMgYXJyYXlzLiBIb3dldmVyLCBvdGhlciBvcmdhbml6YXRpb25zIChlLmcuLCBsaXN0cywgaGFzaCB0YWJsZXMpCisgICAgICBhcmUgYWxzbyBwb3NzaWJsZSBiZWNhdXNlIGVhY2ggc2V0IGNhbiBoYXZlIGRpZmZlcmVudCBzZXQgb2YgbWV0aG9kcyBmb3IgZWxlbWVudCBhY2Nlc3MuCistIHJlY29yZDogaXMgYSBjb250YWluZXIgZm9yIHN0b3JpbmcgaW5mb3JtYXRpb24uCisgICAgLSBSZWNvcmQgY29uc2lzdHMgb2YgY29udHJvbCBpbmZvIGFuZCBhIHN0cnVjdHVyZSBjb250YWluaW5nIGZpZWxkcy4KKyAgICAtIFJlY29yZCBpcyB0aGUgc21hbGxlc3QgREIgZWxlbWVudCB0aGF0IGhhcyBhIGhhbmRsZSBhbmQgY2FuIGJlIGluZGl2aWR1YWxseSBsb2NrZWQuCisgICAgLSBSZWNvcmQgc2l6ZSBpcyBmaXhlZCBhdCB0aW1lIHdoZW4gdGhlIHNldCBjb250YWluaW5nIHJlY29yZHMgaXMgY3JlYXRlZC4KKy0gZmllbGQ6IGlzIGEgY29udmVuaWVuY2UgZWxlbWVudC4KKyAgICAtIERCIEFQSSBpbmNsdWRlcyBmaWVsZCBhY2Nlc3MgbWFjcm9zIGZvciBjb252ZW5pZW5jZSBhbmQgdHJhY2VhYmlsaXR5LgorICAgICAgQXBhcnQgZnJvbSB0aGF0LCByZWNvcmQgbGF5b3V0IGlzIHRyYW5zcGFyZW50IHRvIHRoZSBEQiBlbmdpbmUuCisgICAgLSBEQiB1c2VyIGhhcyBhbiBvcHRpb24gb2YgYWNjZXNzaW5nIHJlY29yZCBmaWVsZHMgZGlyZWN0bHkgKGFzIEMgc3RydWN0dXJlIGZpZWxkcyksIHdpdGhvdXQgdXNpbmcgREIgQVBJCisgQHsKKyovCisKKyNkZWZpbmUgYmNtZGJfZXJyb3JfcHJpbnQocmMsZm9ybWF0LGFyZ3MuLi4pICAgICAgIEJDTU9TX1RSQUNFX0VSUigic3RhdHVzOiVzIDoiIGZvcm1hdCwgYmNtb3Nfc3RyZXJyb3IocmMpLCAjI2FyZ3MpCisKKy8qKiBEYXRhIGJhc2UgYmFja2VuZCB0eXBlCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTURCX0JBQ0tFTkRfQVJSQVksICAgIC8qKjwgQXJyYXktYmFzZWQgYmFja2VuZCAqLworICAgIEJDTURCX0JBQ0tFTkRfSEFTSCwgICAgIC8qKjwgSGFzaC1iYXNlZCBiYWNrZW5kICovCisgICAgQkNNREJfQkFDS0VORF9PVEhFUiAgICAgLyoqPCBVc2VyLWRlZmluZWQgYmFja2VuZCAqLworfSBiY21kYl9iYWNrZW5kX3R5cGU7CisKKworLyoqIERhdGEgbG9ja2luZyBwb2xpY3kKKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNREJfTE9DS19OT05FLCAgICAgICAgICAgICAgICAvKio8IE5vIHJlY29yZC1sZXZlbCBsb2NraW5nLiBDYW4gYmUgdXNlZCBmb3IgcmVjb3JkcyBjb250YWluaW5nIGluZGVwZW5kZW50IGZpZWxkcyAqLworICAgIEJDTURCX0xPQ0tfTkJfUkVBRF9TSEFET1dfV1JJVEUsLyoqPCBOb24tYmxvY2tpbmcgcmVhZCwgd3JpdGUgdXNpbmcgc2hhZG93IGFyZWEgKGRlZmF1bHQpICovCisgICAgQkNNREJfTE9DS19TRU1fUkVBRF9TRU1fV1JJVEUsICAvKio8IFN0cm9uZyBsb2NraW5nLiBCb3RoIHJlYWQgYW5kIHdyaXRlIGxvY2tzIHVzZSBzZW1hcGhvcmVzICovCisgICAgQkNNREJfTE9DS19PVEhFUiAgICAgICAgICAgICAgICAvKio8IFVzZXItZGVmaW5lZCBsb2NraW5nIHBvbGljeSAqLworfSBiY21kYl9sb2NrX3BvbGljeTsKKworCisvKiogRGF0YSBiYXNlIGtleQorICogVmFsaWQgdmFsdWVzID49IDAKKyAqLwordHlwZWRlZiBpbnQgYmNtZGJfa2V5OworCisKKy8qKiBBbnkga2V5CisgKi8KKyNkZWZpbmUgQkNNREJfS0VZX0FOWSAgICAgICAoLTEpCisKKy8qKiBJbnZhbGlkIGtleQorICovCisjZGVmaW5lIEJDTURCX0tFWV9JTlZBTCAgICAgKC0yKQorCisvKiogTm8gbW9yZSByZWNvcmRzCisgKi8KKyNkZWZpbmUgQkNNREJfS0VZX05PX01PUkUgICAoLTMpCisKKworIC8qKiBEYXRhIEJhc2UgU2V0IGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWRiX3NldCBiY21kYl9zZXQ7CisKKy8qKiBEYXRhIEJhc2UgUmVjb3JkIGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWRiX3JlY29yZCBiY21kYl9yZWNvcmQ7CisKKy8qKiBEYXRhIEJhc2UgU2V0IG9yIFJlY29yZCAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtZGJfZW50cnkgYmNtZGJfZW50cnk7CisKKworLyoqIERhdGEgYmFzZSBvcGVyYXRpb25zIGZvciBub3RpZmljYXRpb25zLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01EQl9PUEVSX0FERCwgICAgICAgICAvKio8IEVudHJ5IGhhcyBiZWVuIGFkZGVkICovCisgICAgQkNNREJfT1BFUl9ERUxFVEUsICAgICAgLyoqPCBFbnRyeSBoYXMgYmVlbiBkZWxldGVkICovCisgICAgQkNNREJfT1BFUl9VUERBVEUgICAgICAgLyoqPCBFbnRyeSBoYXMgYmVlbiBtb2RpZmllZCAqLworfSBiY21kYl9vcGVyX3Q7CisKKworLyoqIERhdGEgYmFzZSB1cGRhdGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrLgorICovCit0eXBlZGVmIHZvaWQgKCpiY21kYl9ub3RpZnlfY2IpKGJjbWRiX3NldCAqc2V0LCBiY21kYl9rZXkga2V5LCBiY21kYl9vcGVyX3Qgb3Blciwgdm9pZCAqbmV3X2RhdGEpOworCisKKy8qKiBGb3JtYXQgY2FsbGJhY2suIFVzZWQgYnkgYmNtZGJfcmVjb3JkX3JlYWRfZm9ybWF0dGVkIHRvIGNvbnZlcnQgcmVjb3JkIGRhdGEgdG8gaHVtYW4tcmVhZGlibGUgZm9ybWF0ICovCit0eXBlZGVmIGludCAoKmJjbWRiX2Zvcm1hdF9jYikoY29uc3Qgdm9pZCAqZGF0YSwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpOworCisKKy8qKiBTZXQtb2YtU2V0cyBpbml0IHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtZGJfc29zX2luaXQKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAvKio8IFNldCBuYW1lICovCisgICAgYmNtZGJfYmFja2VuZF90eXBlIGJhY2tlbmRfdHlwZTsgICAgLyoqPCBCYWNrZW5kIHR5cGUgKi8KKyAgICB1aW50MzJfdCBtYXhfZW50cmllczsgICAgICAgICAgICAgICAvKio8IE1heCBudW1iZXIgb2YgZW50cmllcy4gMD11bmxpbWl0ZWQgKG5vdCBzdXBwb3J0ZWQgZm9yIGFycmF5IGJhY2tlbmQpICovCisgICAgdWludDMyX3Qgb3NfZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBPUyBmbGFncy4gQ29udHJvbCB3aGV0aGVyIHNldCBjYW4gYmUgYWNjZXNzZWQgYnkgbXVsdGlwbGUgY29yZXMuIFNlZSBiY21vc19tdXRleF9jcmVhdGUoKSAqLworfSBiY21kYl9zb3NfaW5pdDsKKworCisvKiogU2V0LW9mLVJlY29yZHMgaW5pdCBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWRiX3Nvcl9pbml0Cit7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgLyoqPCBTZXQgbmFtZSAqLworICAgIGJjbWRiX2JhY2tlbmRfdHlwZSBiYWNrZW5kX3R5cGU7ICAgIC8qKjwgQmFja2VuZCB0eXBlICovCisgICAgYmNtZGJfbG9ja19wb2xpY3kgbG9ja19wb2xpY3k7ICAgICAgLyoqPCBTZXQgbG9ja2luZyBwb2xpY3kgKi8KKyAgICB1aW50MzJfdCBtYXhfZW50cmllczsgICAgICAgICAgICAgICAvKio8IE1heCBudW1iZXIgb2YgZW50cmllcy4gMD11bmxpbWl0ZWQgKG5vdCBzdXBwb3J0ZWQgZm9yIGFycmF5IGJhY2tlbmQpICovCisgICAgdWludDMyX3QgcmVjb3JkX3NpemU7ICAgICAgICAgICAgICAgLyoqPCBSZWNvcmQgc2l6ZSA+IDAgKi8KKyAgICBiY21kYl9mb3JtYXRfY2IgZm9ybWF0OyAgICAgICAgICAgICAvKio8IGNhbGxiYWNrIHRoYXQgY29udmVydHMgcmVjb3JkIGRhdGEgdG8gaHVtYW4tcmVhZGFibGUgZm9ybSAqLworICAgIHVpbnQzMl90IG9zX2ZsYWdzOyAgICAgICAgICAgICAgICAgIC8qKjwgT1MgZmxhZ3MuIENvbnRyb2wgd2hldGhlciBzZXQgY2FuIGJlIGFjY2Vzc2VkIGJ5IG11bHRpcGxlIGNvcmVzLiBTZWUgYmNtb3NfbXV0ZXhfY3JlYXRlKCkgKi8KK30gYmNtZGJfc29yX2luaXQ7CisKKworLyoqIEluaXRpYWxpemUgZGF0YSBiYXNlIGVuZ2luZQorICogCisgKiBccmV0dXJuCisgKiAgICAgIDAgICAtIE9LXG4KKyAqICAgICAgPDAgIC0gZXJyb3IgY29kZQorICovCitpbnQgYmNtZGJfbW9kdWxlX2luaXQodm9pZCk7CisKKworLyoqIE1ha2Ugc2V0LW9mLXNldHMgY29udHJvbCBibG9jay4KKyAqIAorICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIHNldCBvZiBzZXRzIHdpdGggcmVhc29uYWJsZSBkZWZhdWx0cyBmb3IgYWxsIGNhbGxiYWNrcyBhbmQgZmllbGRzLgorICogT25jZSBjcmVhdGVkLCB0aGUgc2V0IGNvbnRyb2wgYmxvY2sgY2FuIGJlIHR1bmVkIGJlZm9yZSBhZGRpbmcgdGhlIG5ldyBzZXQgdG8gaXRzIHBhcmVudCBzZXQuCisgKiBccGFyYW1baW5dICAgaW5pdCAgICAgICAgICAgIHNldCBwYXJhbWV0ZXJzCisgKiBccGFyYW1bb3V0XSAgbmV3X3NldCAgICAgICAgIHNldCBjb250cm9sIGJsb2NrCisgKiBccmV0dXJuCisgKiAgICAgIDAgICAtIE9LXG4KKyAqICAgICAgPDAgIC0gZXJyb3IgY29kZQorICovIAoraW50IGJjbWRiX21ha2Vfc2V0X29mX3NldHMoY29uc3QgYmNtZGJfc29zX2luaXQgKmluaXQsIGJjbWRiX3NldCAqKm5ld19zZXQpOworCisKKy8qKiBNYWtlIHNldC1vZi1zZXRzIGNvbnRyb2wgYmxvY2sgbWFjcm8uCisgKgorICogQ2FsbHMgXHJlZiBiY21kYl9tYWtlX3NldF9vZl9zZXRzLgorICogUHJpbnRzIGVycm9yIG1lc3NhZ2UgYW5kIGp1bXBzIHRvIGVycm9yX2xhYmVsIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqIEZvciBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gc2VlIFxyZWYgYmNtZGJfbWFrZV9zZXRfb2Zfc2V0cworICovCisjZGVmaW5lIEJDTURCX01BS0VfU09TKF9uYW1lLF9iYWNrZW5kLF9tYXhfZW50cmllcyxfcF9oYW5kbGUsX3JjLF9lcnJvcl9sYWJlbCkgXAorKHtcCisgICAgYmNtZGJfc29zX2luaXQgX2luaXQgPSB7IC5uYW1lPV9uYW1lLCAubWF4X2VudHJpZXM9X21heF9lbnRyaWVzLCAuYmFja2VuZF90eXBlPV9iYWNrZW5kfTtcCisgICAgX3JjID0gYmNtZGJfbWFrZV9zZXRfb2Zfc2V0cygmX2luaXQsIF9wX2hhbmRsZSk7XAorICAgIGlmIChfcmMpXAorICAgIHtcCisgICAgICAgIGJjbWRiX2Vycm9yX3ByaW50KF9yYywgImZhaWxlZCB0byBjcmVhdGUgc2V0ICVzLlxuIiwgX25hbWUpO1wKKyAgICAgICAgZ290byBfZXJyb3JfbGFiZWw7XAorICAgIH1cCit9KQorCisKKy8qKiBNYWtlIHNldC1vZi1yZWNvcmRzIGNvbnRyb2wgYmxvY2suCisgKgorICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIHNldCBvZiByZWNvcmRzIHdpdGggcmVhc29uYWJsZSBkZWZhdWx0cyBmb3IgYWxsIGNhbGxiYWNrcyBhbmQgZmllbGRzLgorICogT25jZSBjcmVhdGVkLCB0aGUgc2V0IGNvbnRyb2wgYmxvY2sgY2FuIGJlIHR1bmVkIGJlZm9yZSBhZGRpbmcgdGhlIG5ldyBzZXQgdG8gaXRzIHBhcmVudCBzZXQuCisgKiBccGFyYW1baW5dICAgaW5pdCAgICAgICAgICAgIHNldCBwYXJhbWV0ZXJzCisgKiBccGFyYW1baW5dICAgYWxsb2NfcmVjb3JkcyAgIHRydWUgKDEpIC0gYWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgcmVjb3Jkcy4KKyAqIFxwYXJhbVtvdXRdICBuZXdfc2V0ICAgICAgICAgc2V0IGNvbnRyb2wgYmxvY2sKKyAqIFxyZXR1cm4KKyAqICAgICAgMCAgIC0gT0tcbgorICogICAgICA8MCAgLSBlcnJvciBjb2RlCisgKi8gCitpbnQgYmNtZGJfbWFrZV9zZXRfb2ZfcmVjb3Jkcyhjb25zdCBiY21kYl9zb3JfaW5pdCAqaW5pdCwgaW50IGFsbG9jX3JlY29yZHMsIGJjbWRiX3NldCAqKm5ld19zZXQpOworCisKKy8qKiBNYWtlIHNldC1vZi1yZWNvcmRzIGNvbnRyb2wgYmxvY2sgbWFjcm8uCisgKgorICogQ2FsbHMgXHJlZiBiY21kYl9tYWtlX3NldF9vZl9yZWNvcmRzLgorICogUHJpbnRzIGVycm9yIG1lc3NhZ2UgYW5kIGp1bXBzIHRvIGVycm9yX2xhYmVsIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqIEZvciBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gc2VlIFxyZWYgYmNtZGJfbWFrZV9zZXRfb2ZfcmVjb3JkcworICovCisjZGVmaW5lIEJDTURCX01BS0VfU09SKF9uYW1lLF9iYWNrZW5kLF9sb2NrLF9tYXhfZW50cmllcyxfcmVjX3NpemUsX2lzX2FsbG9jLF9mb3JtYXQsX3BfaGFuZGxlLF9yYyxfZXJyb3JfbGFiZWwpIFwKKyh7XAorICAgIGJjbWRiX3Nvcl9pbml0IF9pbml0ID0geyAubmFtZT1fbmFtZSwgLm1heF9lbnRyaWVzPV9tYXhfZW50cmllcywgLmJhY2tlbmRfdHlwZT1fYmFja2VuZCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvY2tfcG9saWN5PV9sb2NrLCAucmVjb3JkX3NpemU9X3JlY19zaXplLC5mb3JtYXQ9X2Zvcm1hdH07XAorICAgIF9yYyA9IGJjbWRiX21ha2Vfc2V0X29mX3JlY29yZHMoJl9pbml0LF9pc19hbGxvYyxfcF9oYW5kbGUpO1wKKyAgICBpZiAoX3JjKVwKKyAgICB7XAorICAgICAgICBiY21kYl9lcnJvcl9wcmludChfcmMsICJmYWlsZWQgdG8gY3JlYXRlIHJlY29yZCBzZXQgJXMuXG4iLCBfbmFtZSk7XAorICAgICAgICBnb3RvIF9lcnJvcl9sYWJlbDtcCisgICAgfVwKK30pCisKKworLyoqIExvY2sgZGF0YSBzZXQuIFdoZW4gc2V0IGlzIGxvY2tlZCAtIGl0IGNhbid0IGJlIG1vZGlmaWVkLgorICogCisgKiBccGFyYW1baW5dICAgc2V0ICAgICAgICAgICAgIGRhdGEgYmFzZSBzZXQgdG8gYmUgbG9ja2VkCisgKiAKKyAqLwordm9pZCBiY21kYl9zZXRfbG9ja19yZWFkKGJjbWRiX3NldCAqc2V0KTsKKworCisvKiogUmVsZWFzZSBkYXRhIHNldCBsb2NrCisgKgorICogVW5sb2NrIHNldCBsb2NrZWQgYnkgXHJlZiBiY21kYl9zZXRfbG9ja19yZWFkCisgKgorICogXHBhcmFtW2luXSAgIHNldCAgICAgICAgICAgICBkYXRhIGJhc2Ugc2V0IHRvIGJlIHVubG9ja2VkCisgKi8KK3ZvaWQgYmNtZGJfc2V0X3VubG9ja19yZWFkKGJjbWRiX3NldCAqc2V0KTsKKworCisvKiogTG9jayBkYXRhIHNldCBmb3IgbW9kaWZ5LiBJZiB0aGUgc2V0IGlzIFNvUywgdGhlIGxvY2tpbmcKKyAqICB3aWxsIGJlIHJlY3Vyc2l2ZS4KKyAqCisgKiBccGFyYW1baW5dICAgc2V0ICAgICAgICAgICAgIGRhdGEgYmFzZSBzZXQgdG8gYmUgbG9ja2VkCisgKgorICogXGluZ3JvdXAgYmNtZGIKKyAqLwordm9pZCBiY21kYl9zZXRfbG9ja19tb2RpZnkoYmNtZGJfc2V0ICpzZXQpOworCisKKy8qKiBSZWxlYXNlIGRhdGEgc2V0IGxvY2sKKyAqCisgKiBVbmxvY2sgc2V0IGxvY2tlZCBieSBccmVmIGJjbWRiX3NldF9sb2NrX21vZGlmeQorICoKKyAqIFxwYXJhbVtpbl0gICBzZXQgICAgICAgICAgICAgZGF0YSBiYXNlIHNldCB0byBiZSB1bmxvY2tlZAorICoKKyAqIFxpbmdyb3VwIGJjbWRiCisgKi8KK3ZvaWQgYmNtZGJfc2V0X3VubG9ja19tb2RpZnkoYmNtZGJfc2V0ICpzZXQpOworCisKKy8qKiBBZGQgc2V0IHRvIHRoZSBwYXJlbnQgc2V0LgorICoKKyAqIFRoZSBmdW5jdGlvbiBhZGRzIHNldCB0byB0aGUgcGFyZW50IHNldCBjcmVhdGluZyBkYXRhIGJhc2UgaGllcmFyY2h5LgorICogVGhlIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgYWNxdWlyZXMgbW9kaWZ5IGxvY2sgYW5kIHJlbGVhc2VzIGl0CisgKiBpbiB0aGUgZW5kIG9mIG9wZXJhdGlvbi4KKyAqIFxwYXJhbVtpbl0gICBzb3MgICAgICAgICAgICAgcGFyZW50IHNldCBvZiBzZXRzCisgKiBccGFyYW1baW5dICAga2V5ICAgICAgICAgICAgIGtleSB0byBhZGQgbmV3IHNldCBhdAorICogXHBhcmFtW2luXSAgIG5ld19zZXQgICAgICAgICBzZXQgY29udHJvbCBibG9jaworICogXHJldHVybgorICogICAgICA9MCAgLSBPS1xuCisgKiAgICAgIDwwICAtIGVycm9yIGNvZGUKKyAqLworaW50IGJjbWRiX3NldF9hZGQoYmNtZGJfc2V0ICpzb3MsIGJjbWRiX2tleSBrZXksIGJjbWRiX3NldCAqbmV3X3NldCk7CisKKworLyoqIEFkZCBzZXQgdG8gdGhlIHBhcmVudCBzZXQgd2l0aCBzcGVjaWZpYyBrZXkgbWFjcm8uCisgKgorICogQ2FsbHMgXHJlZiBiY21kYl9zZXRfYWRkLgorICogUHJpbnRzIGVycm9yIG1lc3NhZ2UgYW5kIGp1bXBzIHRvIGVycm9yX2xhYmVsIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqIEZvciBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gc2VlIFxyZWYgYmNtZGJfc2V0X2FkZAorICovCisjZGVmaW5lIEJDTURCX1NFVF9BREQoX3BhcmVudCxfa2V5LF9zZXQsX3JjLF9lcnJvcl9sYWJlbCkgXAorKHtcCisgICAgX3JjID0gYmNtZGJfc2V0X2FkZChfcGFyZW50LF9rZXksX3NldCk7XAorICAgIGlmIChfcmMpXAorICAgIHtcCisgICAgICAgIGJjbWRiX2Vycm9yX3ByaW50KF9yYywgImZhaWxlZCB0byBhZGQgc2V0ICVzIHRvICVzLlxuIiwgYmNtZGJfc2V0X25hbWUoX3NldCksIGJjbWRiX3NldF9uYW1lKF9wYXJlbnQpKTtcCisgICAgICAgIGdvdG8gX2Vycm9yX2xhYmVsO1wKKyAgICB9XAorfSkKKworCisvKiogR2V0IHNldCBoYW5kbGUgZ2l2ZW4gaXRzIGtleS4KKyAqCisgKiBccGFyYW1baW5dICAgc29zICAgICAgICAgICAgIHBhcmVudCBzZXQgb2Ygc2V0cworICogXHBhcmFtW2luXSAgIGtleSAgICAgICAgICAgICBzZXQga2V5LgorICogXHJldHVybgorICogICAgICAhPTAgLSBzZXQgaGFuZGxlCisgKiAgICAgIE5VTEwtIGRvZXNuJ3QgZXhpc3QKKyAqLworYmNtZGJfc2V0ICpiY21kYl9zZXRfaGFuZGxlKGNvbnN0IGJjbWRiX3NldCAqc29zLCBiY21kYl9rZXkga2V5KTsKKworCisvKiogR2V0IHNldCBrZXkgZ2l2ZW4gaXRzIGhhbmRsZS4KKyAqCisgKiBccGFyYW1baW5dICAgc2V0ICAgICAgICAgICAgIHNldCBoYW5kbGUKKyAqIFxyZXR1cm4KKyAqICAgICAgIT1CQ01EQl9LRVlfSU5WQUwgLSBzZXQga2V5XG4KKyAqICAgICAgQkNNREJfS0VZX0lOVkFMIC0gZXJyb3IKKyAqLworYmNtZGJfa2V5IGJjbWRiX3NldF9rZXkoY29uc3QgYmNtZGJfc2V0ICpzZXQpOworCisKKy8qKiBHZXQgc2V0IG5hbWUKKyAqIAorICogXHBhcmFtW2luXSAgIHNldCAgICAgICAgICAgICBzZXQgaGFuZGxlCisgKiBccmV0dXJuIHNldCBuYW1lCisgKi8KK2NvbnN0IGNoYXIgKmJjbWRiX3NldF9uYW1lKGNvbnN0IGJjbWRiX3NldCAqc2V0KTsKKworCisvKiogR2V0IG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBzZXQuCisgKgorICogXHBhcmFtW2luXSAgIHNldCAgICAgICAgICAgICBzZXQgaGFuZGxlCisgKiBccmV0dXJuIG51bWJlciBvZiBhY3RpdmUgcmVjb3JkcyBpbiB0aGUgc2V0CisgKi8KK2ludCBiY21kYl9zZXRfbnVtX3JlY29yZHMoY29uc3QgYmNtZGJfc2V0ICpzZXQpOworCisKKy8qKiBHZXQgZW50cnkgc2l6ZQorICoKKyAqIFxwYXJhbVtpbl0gICBzZXQgICAgICAgICAgICAgc2V0IGhhbmRsZQorICogXHJldHVybiBzZXQgZW50cnkgc2l6ZQorICovCitpbnQgYmNtZGJfc2V0X2VudHJ5X3NpemUoY29uc3QgYmNtZGJfc2V0ICpzZXQpOworCisKKy8qKiBBZGQgcmVjb3JkIHRvIHRoZSBwYXJlbnQgc2V0LgorICoKKyAqIFRoZSBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IHJlY29yZCBhbmQgYWRkcyBpdCB0byB0aGUgcGFyZW50IHNldCB3aXRoIHNwZWNpZmljIGtleS4KKyAqIFRoZSBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGFjcXVpcmVzIG1vZGlmeSBsb2NrIGFuZCByZWxlYXNlcyBpdAorICogaW4gdGhlIGVuZCBvZiBvcGVyYXRpb24uCisgKiBccGFyYW1baW5dICAgc29yICAgICAgICAgICAgIHBhcmVudCBzZXQgb2YgcmVjb3JkcworICogXHBhcmFtW2luXSAgIGtleSAgICAgICAgICAgICByZWNvcmQga2V5CisgKiBccGFyYW1baW5dICAgZGF0YSAgICAgICAgICAgIHJlY29yZCBkYXRhLiBEYXRhIHNpemUgaXMgZGVmaW5lZCBhdCBwYXJlbnQgU09SIHJlZ2lzdHJhdGlvbiB0aW1lLgorICogXHJldHVybgorICogICAgICA9MCAgLSBPS1xuCisgKiAgICAgIDwwICAtIGVycm9yIGNvZGUKKyAqLworaW50IGJjbWRiX3JlY29yZF9hZGQoYmNtZGJfc2V0ICpzb3IsIGJjbWRiX2tleSBrZXksIGNvbnN0IHZvaWQgKmRhdGEpOworCisKKy8qKiBEZWxldGUgcmVjb3JkIGZyb20gdGhlIHBhcmVudCBTb1IgZ2l2ZW4gdGhlIHJlY29yZCBrZXkuCisgKiAKKyAqIFRoZSBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGFjcXVpcmVzIG1vZGlmeSBsb2NrIGFuZCByZWxlYXNlcyBpdAorICogaW4gdGhlIGVuZCBvZiBvcGVyYXRpb24uCisgKgorICogXHBhcmFtW2luXSAgIHNvciAgICAgICAgICAgICBwYXJlbnQgc2V0IG9mIHJlY29yZHMKKyAqIFxwYXJhbVtpbl0gICBrZXkgICAgICAgICAgICAgcmVjb3JkIGtleS4KKyAqLwordm9pZCBiY21kYl9yZWNvcmRfZGVsZXRlKGJjbWRiX3NldCAqc29yLCBiY21kYl9rZXkga2V5KTsKKworCisvKiogR2V0IHJlY29yZCBkYXRhIHBvaW50ZXIgd2l0aG91dCBsb2NraW5nLgorICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8gZGF0YSBzdHJ1Y3R1cmUgc3RvcmVkIGluIGRhdGEgYmFzZSByZWNvcmQuXG4KKyAqIEF0dGVudGlvbiEgVGhlIGNhbGxlciBpcyByZXF1aXJlZCB0byBhcXVpcmUgcmVhZCBvciB3cml0ZSBsb2NrIC0gYXMgYXBwcm9wcmlhdGUKKyAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYW5kIHJlbGVhc2UgdGhlIGxvY2sgd2hlbiBwcm9jZXNzaW5nIGlzIGZpbmlzaGVkLgorICogVGhlIGZ1bmN0aW9uIGlzIGxvdy1sZXZlbC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIFxyZWYgYmNtZGJfcmVjb3JkX2dldF9ub2xvY2sgaW5zdGVhZC4KKyAqCisgKiBccGFyYW1baW5dICAgc29yICAgICAgICAgICAgIHBhcmVudCBzZXQgb2YgcmVjb3JkcworICogXHBhcmFtW2luXSAgIGtleSAgICAgICAgICAgICByZWNvcmQga2V5CisgKiBccmV0dXJuCisgKiAgICAgIGRhdGEgcG9pbnRlci4gTlVMTCBpZiB0aGVyZSBpcyBubyByZWNvcmQgbWF0Y2hpbmcgdGhlIGtleS4KKyAqLwordm9pZCAqYmNtZGJfcmVjb3JkX2dldHJhd19ub2xvY2soYmNtZGJfc2V0ICpzb3IsIGJjbWRiX2tleSBrZXkpOworCisKKy8qKiBHZXQgcmVjb3JkIGRhdGEgcG9pbnRlciB3aXRob3V0IGxvY2tpbmcuCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgcG9pbnRlciB0byBkYXRhIHN0cnVjdHVyZSBzdG9yZWQgaW4gZGF0YSBiYXNlIHJlY29yZC5cbgorICogQXR0ZW50aW9uISBUaGUgY2FsbGVyIGlzIHJlcXVpcmVkIHRvIGFxdWlyZSByZWFkIG9yIHdyaXRlIGxvY2sgLSBhcyBhcHByb3ByaWF0ZQorICogYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhbmQgcmVsZWFzZSB0aGUgbG9jayB3aGVuIHByb2Nlc3NpbmcgaXMgZmluaXNoZWQuCisgKgorICogXHBhcmFtW2luXSAgIF9zb3IgICAgICAgICAgICBwYXJlbnQgc2V0IG9mIHJlY29yZHMKKyAqIFxwYXJhbVtpbl0gICBfa2V5ICAgICAgICAgICAgcmVjb3JkIGtleQorICogXHBhcmFtW2luXSAgIF9yZWNvcmRfdHlwZSAgICB1bmRlcmx5aW5nIGRhdGEgdHlwZS4KKyAqIFxyZXR1cm4KKyAqICAgICAgZGF0YSBwb2ludGVyIGNhc3RlZCB0byB0aGUgdW5kZXJseWluZyBkYXRhIHR5cGVcbgorICogICAgICBOVUxMIGlmIHRoZXJlIGlzIG5vIHJlY29yZCBtYXRjaGluZyB0aGUga2V5LgorICovCisjZGVmaW5lIGJjbWRiX3JlY29yZF9nZXRfbm9sb2NrKF9zb3IsIF9rZXksIF9yZWNvcmRfdHlwZSkgICAgICBcCisgICAgKHsgXAorICAgICAgICBhc3NlcnQoc2l6ZW9mKF9yZWNvcmRfdHlwZSk9PWJjbWRiX3NldF9lbnRyeV9zaXplKF9zb3IpKTsgXAorICAgICAgICAoX3JlY29yZF90eXBlICopYmNtZGJfcmVjb3JkX2dldHJhd19ub2xvY2soX3NvciwgX2tleSk7IFwKKyAgICAgfSkKKworCisvKiogTG9jayByZWNvcmQgZm9yIHJlYWRpbmcgYW5kIHJldHVybiByZWNvcmQgZGF0YSBwb2ludGVyLgorICoKKyAqIFRoZSBmdW5jdGlvbiBhcXVpcmVzIHJlYWQtbG9jayBhbmQgcmV0dXJucyBwb2ludGVyIHRvIGRhdGEgc3RydWN0dXJlIHN0b3JlZCBpbiBkYXRhIGJhc2UgcmVjb3JkLlxuCisgKiByZWFkLWxvY2sgbXVzdCBiZSByZWxlYXNlZCBzZXBhcmF0ZWx5IHdoZW4gdGhlIHBvaW50ZXIgaXMgbm8gbG9uZ2VyIGluIHVzZS4KKyAqIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCByZWNvcmQtcmVhZCBsb2NrIGlzIG5vbi1ibG9ja2luZyBhbmQgY291bnRpbmcuCisgKiBUaGF0IG1lYW5zIHRoYXQgbXVsdGlwbGUgcHJvY2Vzc2VzIGNhbiByZWFkLWxvY2sgdGhlIHNhbWUgcmVjb3JkIHdpdGhvdXQgYmxvY2tpbmcuCisgKiBUaGUgZnVuY3Rpb24gaXMgbG93LWxldmVsLiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgbWFjcm8gXHJlZiBiY21kYl9yZWNvcmRfZ2V0X3JlYWQgaW5zdGVhZC4KKyAqCisgKiBccGFyYW1baW5dICAgc29yICAgICAgICAgICAgIHBhcmVudCBzZXQgb2YgcmVjb3JkcworICogXHBhcmFtW2luXSAgIGtleSAgICAgICAgICAgICByZWNvcmQga2V5CisgKiBccmV0dXJuCisgKiAgICAgIGRhdGEgcG9pbnRlci4gTlVMTCBpZiB0aGVyZSBpcyBubyByZWNvcmQgbWF0Y2hpbmcgdGhlIGtleS4KKyAqLworY29uc3Qgdm9pZCAqYmNtZGJfcmVjb3JkX2dldHJhd19yZWFkKGJjbWRiX3NldCAqc29yLCBiY21kYl9rZXkga2V5KTsKKworCisvKiogTG9jayByZWNvcmQgZm9yIHJlYWRpbmcgYW5kIHJldHVybiByZWNvcmQgZGF0YSBwb2ludGVyLgorICoKKyAqIFRoZSBtYWNybyByZXR1cm5zIHBvaW50ZXIgdG8gZGF0YSBzdHJ1Y3R1cmUgc3RvcmVkIGluIGRhdGEgYmFzZSByZWNvcmQuXG4KKyAqIFRoZSByZWFkLWxvY2sgbXVzdCBiZSByZWxlYXNlZCBzZXBhcmF0ZWx5IHdoZW4gdGhlIHBvaW50ZXIgaXMgbm8gbG9uZ2VyIGluIHVzZS4KKyAqIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCByZWNvcmQtcmVhZCBsb2NrIGlzIG5vbi1ibG9ja2luZyBhbmQgY291bnRpbmcuCisgKiBUaGF0IG1lYW5zIHRoYXQgbXVsdGlwbGUgcHJvY2Vzc2VzIGNhbiByZWFkLWxvY2sgdGhlIHNhbWUgcmVjb3JkIHdpdGhvdXQgYmxvY2tpbmcuCisgKgorICogXHBhcmFtW2luXSAgIF9zb3IgICAgICAgICAgICBwYXJlbnQgc2V0IG9mIHJlY29yZHMKKyAqIFxwYXJhbVtpbl0gICBfa2V5ICAgICAgICAgICAgcmVjb3JkIGtleQorICogXHBhcmFtW2luXSAgIF9yZWNvcmRfdHlwZSAgICB1bmRlcmx5aW5nIGRhdGEgdHlwZS4KKyAqIFxyZXR1cm4KKyAqICAgICAgZGF0YSBwb2ludGVyIGNhc3RlZCB0byB0aGUgdW5kZXJseWluZyBkYXRhIHR5cGUKKyAqLworI2RlZmluZSBiY21kYl9yZWNvcmRfZ2V0X3JlYWQoX3NvciwgX2tleSwgX3JlY29yZF90eXBlKSBcCisgICAgKHsgXAorICAgICAgICBhc3NlcnQoc2l6ZW9mKF9yZWNvcmRfdHlwZSk9PWJjbWRiX3NldF9lbnRyeV9zaXplKF9zb3IpKTsgIFwKKyAgICAgICAgKGNvbnN0IF9yZWNvcmRfdHlwZSAqKWJjbWRiX3JlY29yZF9nZXRyYXdfcmVhZChfc29yLCBfa2V5KTtcCisgICAgIH0pCisKKworLyoqIFVubG9jayByZWNvcmQgbG9ja2VkIGZvciByZWFkaW5nLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgXHJlZiBiY21kYl9yZWNvcmRfZ2V0X3JlYWQgb3IKKyAqIFxyZWYgYmNtZGJfcmVjb3JkX2dldHJhd19yZWFkLiBGb2xsb3dpbmcgYmNtZGJfcmVjb3JkX3JlYWRfdW5sb2NrCisgKiBjYWxsIHBvaW50ZXIgcmV0dXJuZWQgYnkgXHJlZiBiY21kYl9yZWNvcmRfZ2V0X3JlYWQgYmVjb21lcyBpbnZhbGlkLgorICogCisgKiBccGFyYW1baW5dICAgc29yICAgICAgICAgICAgIHBhcmVudCBzZXQgb2YgcmVjb3JkcworICogXHBhcmFtW2luXSAgIGtleSAgICAgICAgICAgICByZWNvcmQga2V5CisgKiAKKyAqLwordm9pZCBiY21kYl9yZWNvcmRfdW5sb2NrX3JlYWQoYmNtZGJfc2V0ICpzb3IsIGJjbWRiX2tleSBrZXkpOworCisKKy8qKiBSZWFkIHJlY29yZCBkYXRhIGludG8gdXNlciBhcmVhLgorICoKKyAqIFRoZSBmdW5jdGlvbiBhcXVpcmVzIHJlYWQtbG9jaywgcmVhZHMgZGF0YSBpbnRvIHVzZXIgYXJlYSBhbmQgcmVsZWFzZXMgcmVhZC1sb2NrLgorICoKKyAqIFxwYXJhbVtpbl0gICBzb3IgICAgICAgICAgICAgcGFyZW50IHNldCBvZiByZWNvcmRzCisgKiBccGFyYW1baW5dICAga2V5ICAgICAgICAgICAgIHJlY29yZCBrZXkKKyAqIFxwYXJhbVtpbl0gICBvZmZzZXQgICAgICAgICAgb2Zmc2V0IGluIGRhdGEgcmVjb3JkCisgKiBccGFyYW1baW5dICAgc2l6ZSAgICAgICAgICAgIGRhdGEgc2l6ZS4gTm90ZSB0aGF0IG9mZnNldCtzaXplIG11c3QgYmUgPD0gcmVjb3JkX3NpemUKKyAqIFxwYXJhbVtpbl0gICBkYXRhICAgICAgICAgICAgZGF0YSBwb2ludGVyLgorICogXHJldHVybgorICogICAgICA9MC1PS1xuCisgKiAgICAgIDwwLWVycm9yIGNvZGUKKyAqLworaW50IGJjbWRiX3JlY29yZF9yZWFkKGJjbWRiX3NldCAqc29yLCBiY21kYl9rZXkga2V5LCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSwgdm9pZCAqZGF0YSk7CisKKworLyoqIEdldCByZWNvcmQgZmllbGQuCisgKgorICogVGhlIG1hY3JvIHJldHVybnMgcmVjb3JkIGZpZWxkIHZhbHVlLgorICoKKyAqIFxwYXJhbVtpbl0gICBfc29yICAgICAgICAgICAgcGFyZW50IHNldCBvZiByZWNvcmRzCisgKiBccGFyYW1baW5dICAgX2tleSAgICAgICAgICAgIHJlY29yZCBrZXkKKyAqIFxwYXJhbVtpbl0gICBfcmVjb3JkX3R5cGUgICAgdHlwZSBvZiB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZS4KKyAqIFxwYXJhbVtpbl0gICBfZmllbGRfbmFtZSAgICAgZGF0YSBzdHJ1Y3R1cmUgZmllbGQgbmFtZQorICogXHBhcmFtW291dF0gIF9wX2ZpZWxkX3ZhbHVlICBwb2ludGVyIG9mIHZhcmlhYmxlIHdoZXJlIGRhdGEgc3RydWN0dXJlIGZpZWxkIHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZAorICogXHJldHVybgorICogICAgICA9MC1PS1xuCisgKiAgICAgIDwwLWVycm9yIGNvZGUKKyAqLworI2RlZmluZSBiY21kYl9yZWNvcmRfcmVhZF9maWVsZChfc29yLCBfa2V5LCBfcmVjb3JkX3R5cGUsIF9maWVsZF9uYW1lLCBfcF9maWVsZF92YWx1ZSkgXAorICAgIGJjbWRiX3JlY29yZF9yZWFkKF9zb3IsIF9rZXksIG9mZnNldG9mKF9yZWNvcmRfdHlwZSwgX2ZpZWxkX25hbWUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKihfcF9maWVsZF92YWx1ZSkpLCBfcF9maWVsZF92YWx1ZSk7CisKKworLyoqIExvY2sgcmVjb3JkIGZvciB3cml0aW5nIGFuZCByZXR1cm4gcmVjb3JkIGRhdGEgcG9pbnRlci4KKyAqCisgKiBUaGUgZnVuY3Rpb24gYXF1aXJlcyB3cml0ZS1sb2NrIGFuZCByZXR1cm5zIHBvaW50ZXIgdG8gZGF0YSBzdHJ1Y3R1cmUgc3RvcmVkIGluIGRhdGEgYmFzZSByZWNvcmQuXG4KKyAqIHdyaXRlLWxvY2sgbXVzdCBiZSByZWxlYXNlZCBzZXBhcmF0ZWx5IHdoZW4gdGhlIHBvaW50ZXIgaXMgbm8gbG9uZ2VyIGluIHVzZS4KKyAqIFRoZSBmdW5jdGlvbiBpcyBsb3ctbGV2ZWwuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBtYWNybyBccmVmIGJjbWRiX3JlY29yZF9nZXRfd3JpdGUgaW5zdGVhZC4KKyAqCisgKiBccGFyYW1baW5dICAgc29yICAgICAgICAgICAgIHBhcmVudCBzZXQgb2YgcmVjb3JkcworICogXHBhcmFtW2luXSAgIGtleSAgICAgICAgICAgICByZWNvcmQga2V5CisgKiBccmV0dXJuCisgKiAgICAgIGRhdGEgcG9pbnRlci4gTlVMTCBpZiB0aGVyZSBpcyBubyByZWNvcmQgbWF0Y2hpbmcgdGhlIGtleS4KKyAqLwordm9pZCAqYmNtZGJfcmVjb3JkX2dldHJhd193cml0ZShiY21kYl9zZXQgKnNvciwgYmNtZGJfa2V5IGtleSk7CisKKworLyoqIExvY2sgcmVjb3JkIGZvciB3cml0aW5nIGFuZCByZXR1cm4gcmVjb3JkIGRhdGEgcG9pbnRlci4KKyAqCisgKiBUaGUgZnVuY3Rpb24gYXF1aXJlcyB3cml0ZS1sb2NrIGFuZCByZXR1cm5zIHBvaW50ZXIgdG8gZGF0YSBzdHJ1Y3R1cmUgc3RvcmVkIGluIGRhdGEgYmFzZSByZWNvcmQuXG4KKyAqIHdyaXRlLWxvY2sgbXVzdCBiZSByZWxlYXNlZCBzZXBhcmF0ZWx5IHdoZW4gdGhlIHBvaW50ZXIgaXMgbm8gbG9uZ2VyIGluIHVzZS4KKyAqCisgKiBccGFyYW1baW5dICAgX3NvciAgICAgICAgICAgIHBhcmVudCBzZXQgb2YgcmVjb3JkcworICogXHBhcmFtW2luXSAgIF9rZXkgICAgICAgICAgICByZWNvcmQga2V5CisgKiBccGFyYW1baW5dICAgX3JlY29yZF90eXBlICAgIHVuZGVybHlpbmcgZGF0YSB0eXBlLgorICogXHJldHVybgorICogICAgICBkYXRhIHBvaW50ZXIgY2FzdGVkIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEgdHlwZQorICovCisjZGVmaW5lIGJjbWRiX3JlY29yZF9nZXRfd3JpdGUoX3NvciwgX2tleSwgX3JlY29yZF90eXBlKSAgICAgIFwKKyAgICAoeyBcCisgICAgICAgIGFzc2VydChzaXplb2YoX3JlY29yZF90eXBlKT09YmNtZGJfc2V0X2VudHJ5X3NpemUoX3NvcikpOyAgIFwKKyAgICAgICAgKF9yZWNvcmRfdHlwZSAqKWJjbWRiX3JlY29yZF9nZXRyYXdfd3JpdGUoX3NvciwgX2tleSk7XAorICAgICB9KQorCisKKy8qKiBVbmxvY2sgcmVjb3JkIGxvY2tlZCBmb3Igd3JpdGluZy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIFxyZWYgYmNtZGJfcmVjb3JkX2dldF93cml0ZSBvcgorICogXHJlZiBiY21kYl9yZWNvcmRfZ2V0cmF3X3dyaXRlLiBGb2xsb3dpbmcgYmNtZGJfcmVjb3JkX3VubG9ja193cml0ZQorICogY2FsbCBwb2ludGVyIHJldHVybmVkIGJ5IFxyZWYgYmNtZGJfcmVjb3JkX2dldF93cml0ZSBiZWNvbWVzIGludmFsaWQuCisgKgorICogXHBhcmFtW2luXSAgIHNvciAgICAgICAgICAgICBwYXJlbnQgc2V0IG9mIHJlY29yZHMKKyAqIFxwYXJhbVtpbl0gICBpc19jYW5jZWxsYXRpb24gVFJVRT1jYW5jZWwgdHJhbnNhY3Rpb24KKyAqCisgKi8KK3ZvaWQgYmNtZGJfcmVjb3JkX3VubG9ja193cml0ZShiY21kYl9zZXQgKnNvciwgaW50IGlzX2NhbmNlbGxhdGlvbik7CisKKworCisvKiogV3JpdGUgcmVjb3JkIGRhdGEuCisgKgorICogVGhlIGZ1bmN0aW9uIGFxdWlyZXMgbW9kaWZ5LWxvY2ssIHJlcGxhY2VzIGRhdGEgc3RvcmVkIGluIGRhdGEgYmFzZSByZWNvcmQKKyAqIGFuZCByZWxlc2VzIHRoZSBsb2NrLgorICoKKyAqIFxwYXJhbVtpbl0gICBzb3IgICAgICAgICAgICAgcGFyZW50IHNldCBvZiByZWNvcmRzCisgKiBccGFyYW1baW5dICAga2V5ICAgICAgICAgICAgIHJlY29yZCBrZXkKKyAqIFxwYXJhbVtpbl0gICBvZmZzZXQgICAgICAgICAgb2Zmc2V0IGluIGRhdGEgcmVjb3JkCisgKiBccGFyYW1baW5dICAgc2l6ZSAgICAgICAgICAgIGRhdGEgc2l6ZS4gTm90ZSB0aGF0IG9mZnNldCtzaXplIG11c3QgYmUgPD0gcmVjb3JkX3NpemUKKyAqIFxwYXJhbVtpbl0gICBkYXRhICAgICAgICAgICAgZGF0YSBwb2ludGVyLgorICogXHJldHVybgorICogICAgICA9MC1PS1xuCisgKiAgICAgIDwwLWVycm9yIGNvZGUKKyAqLworaW50IGJjbWRiX3JlY29yZF93cml0ZShiY21kYl9zZXQgKnNvciwgYmNtZGJfa2V5IGtleSwgaW50IG9mZnNldCwgaW50IHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOworCisKKy8qKiBXcml0ZSByZWNvcmQgZmllbGQuCisgKgorICogVGhlIG1hY3JvIHVwZGF0ZXMgcmVjb3JkIGZpZWxkIHZhbHVlLlxuCisgKiBUaGUgbWFjcm8gYXF1aXJlcyBhbmQgcmVsZWFzZXMgcmVjb3JkLW1vZGlmeSBsb2NrLgorICoKKyAqIFxwYXJhbVtpbl0gICBfc29yICAgICAgICAgICAgcGFyZW50IHNldCBvZiByZWNvcmRzCisgKiBccGFyYW1baW5dICAgX2tleSAgICAgICAgICAgIHJlY29yZCBrZXkKKyAqIFxwYXJhbVtpbl0gICBfcmVjb3JkX3R5cGUgICAgdHlwZSBvZiB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZS4KKyAqIFxwYXJhbVtpbl0gICBfZmllbGRfbmFtZSAgICAgZGF0YSBzdHJ1Y3R1cmUgZmllbGQgbmFtZQorICogXHBhcmFtW2luXSAgIF9maWVsZF92YWx1ZSAgICBmaWVsZCB2YWx1ZQorICogXHJldHVybgorICogICAgICA9MC1PS1xuCisgKiAgICAgIDwwLWVycm9yIGNvZGUKKyAqLworI2RlZmluZSBiY21kYl9yZWNvcmRfd3JpdGVfZmllbGQoX3NvciwgX2tleSwgX3JlY29yZF90eXBlLCBfZmllbGRfbmFtZSwgX2ZpZWxkX3ZhbHVlKSBcCisgICAgKHsgXAorICAgICAgICB0eXBlb2YoKChfcmVjb3JkX3R5cGUgKikwKS0+X2ZpZWxkX25hbWUpIF9mID0gX2ZpZWxkX3ZhbHVlO1wKKyAgICAgICAgYmNtZGJfcmVjb3JkX3dyaXRlKF9zb3IsIF9rZXksIG9mZnNldG9mKF9yZWNvcmRfdHlwZSwgX2ZpZWxkX25hbWUpLCBzaXplb2YoX2YpLCAmX2YpO1wKKyAgICB9KTsKKworCisvKiogUmVnaXN0ZXIgbm90aWZpY2F0aW9uIGZ1bmN0aW9uIHRvIGdldCBpbmZvcm1lZAorICogd2hlbiBkYXRhIGJhc2Ugc2V0IGlzIG1vZGlmaWVkLgorICoKKyAqIFxwYXJhbVtpbl0gICBzb3IgICAgICAgICAgICAgcGFyZW50IHNldCBvZiByZWNvcmRzCisgKiBccGFyYW1baW5dICAgY2IgICAgICAgICAgICAgIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKyAqIFxwYXJhbVtpbl0gICBjYl9wcml2ICAgICAgICAgcHJpdmF0ZSBkYXRhIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sKKyAqIFxyZXR1cm4KKyAqICAgICAgPTAgIC0gT0tcbgorICogICAgICA8MCAgLSBlcnJvciBjb2RlCisgKi8KK2ludCBiY21kYl9zZXRfbm90aWZ5X3JlZ2lzdGVyKGJjbWRiX3NldCAqc29yLCBiY21kYl9ub3RpZnlfY2IgY2IsIGxvbmcgY2JfcHJpdik7CisKKworLyoqIERhdGEgYmFzZSBpdGVyYXRvcgorICoKKyAqIFxwYXJhbVtpbl0gICBzZXQgICAgICAgICAgICAgZGF0YSBiYXNlIHNldAorICogXHBhcmFtW2luXSAgIHByZXYgICAgICAgICAgICBsYXN0IGVudHJ5LiBCQ01EQl9LRVlfQU5ZPXN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZworICogXHJldHVybiAgZGF0YSBiYXNlIGVudHJ5IGtleSBmb2xsb3dpbmcgcHJldiBvciBCQ01EQl9LRVlfTk9fTU9SRSBpZiBlbmQgaXMgcmVhY2hlZC5cbgorICogICAgICAgICAgQkNNREJfS0VZX0lOVkFMIGlzIHJlcXR1cm5lZCBpZiBwcmV2IGtleSBpcyBpbnZhbGlkCisgKi8KK2JjbWRiX2tleSBiY21kYl9zZXRfaXRlcmF0ZShjb25zdCBiY21kYl9zZXQgKnNldCwgYmNtZGJfa2V5IHByZXYpOworCisKKy8qKiBQcmludCBkYXRhYmFzZSBzdHJ1Y3R1cmUuCisgKgorICogXHBhcmFtW2luXSAgIHNldCAgICAgICAgICAgICByb290IHNldAorICovCit2b2lkIGJjbWRiX3NldF9wcmludF9zdHJ1Y3R1cmUoY29uc3QgYmNtZGJfc2V0ICpzZXQpOworCisKKy8qKiBGb3JtYXQgcmVjb3JkIGZvciBwcmludGluZy4KKyAqCisgKiBUaGUgZnVuY3Rpb24gY29udmVydHMgcmVjb3JkIGRhdGEgdG8gaHVtYW4tcmVhZGFibGUgZm9ybWF0LgorICoKKyAqIFxwYXJhbVtpbl0gICBzb3IgICAgICAgICAgICAgcGFyZW50IHNldCBvZiByZWNvcmRzCisgKiBccGFyYW1baW5dICAga2V5ICAgICAgICAgICAgIHJlY29yZCBrZXkKKyAqIFxwYXJhbVtvdXRdICBidWZmZXIgICAgICAgICAgb3V0cHV0IGJ1ZmZlcgorICogXHBhcmFtW2luXSAgIHNpemUgICAgICAgICAgICBidWZmZXIgc2l6ZQorICogXHJldHVybgorICogICAgICA+PTAtYW1vdW50IG9mIGRhdGEgcGxhY2VkIGluIHRoZSBidWZmZXJcbgorICogICAgICA8MC1lcnJvciBjb2RlCisgKi8KK2ludCBiY21kYl9yZWNvcmRfcmVhZF9mb3JtYXR0ZWQoYmNtZGJfc2V0ICpzb3IsIGJjbWRiX2tleSBrZXksIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpOworCisKKy8qKiBAfSBlbmQgb2YgYmNtZGJfZSBncm91cCAqLworCisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTURCX0VOR0lORV9IICovCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vZGJfZW5naW5lL3VuaXRlc3QuYyBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vZGJfZW5naW5lL3VuaXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTYzOGNlCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9kYl9lbmdpbmUvdW5pdGVzdC5jCkBAIC0wLDAgKzEsNDkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoKKyAqIHVuaXRlc3QuYworICoKKyAqICBDcmVhdGVkIG9uOiAyMDEzLTEyLTEwCisgKiAgICAgIEF1dGhvcjogc3dhbGxhY2UKKyAqLworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtX2RiX2VuZ2luZS5oIgorCisvKiBFUE9OIExMSUQgZGF0YSBzdHJ1Y3R1cmUgc3Vic2V0ICovCit0eXBlZGVmIGVudW0gCisgICAgeworICAgIC8qIEZyZWUgZW50cnkgaW4gdGhlIExMSUQgbWFuYWdlbWVudCB0YWJsZSwgYXZhaWxhYmxlIGZvciBhc3NpZ25tZW50IG9uIGFuCisgICAgICAgTVBDUCByZWdpc3RlciByZXF1ZXN0LiAqLworICAgIHVuYXNzaWduZWRfbGxpZCwKKyAgICAvKiBMb2NrZWQgb3V0IHdhaXRpbmcgb24gYSB0aW1lciB0byByZWxlYXNlIHRoZSBMTElEICovCisgICAgbm90X3JlZ2lzdGVyZWRfbGxpZCwKKyAgICAvKiBXYWl0aW5nIGZvciBwZXJtaXNzaW9uIHRvIHJlZ2lzdGVyIGZyb20gaG9zdCAqLworICAgIGlnbm9yZWRfbGxpZCwKKyAgICAvKiBMTElEIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGFuIE9OVSBNQUMgYnV0IG5vdCByZWdpc3RlcmVkLiBJbnRlcm1lZGlhdGUgCisgICAgICAgc3RhdGUgYmVmb3JlIHRoZSBPTlUgcmV0dXJucyBhIHJlZ2lzdHJhdGlvbiBhY2suICovCisgICAgd2FpdF9yZWdfYWNrX2xsaWQsCisgICAgLyogT0xUIGxpbmsgaXMgaW4tc2VydmljZTsgdXNlciB0cmFmZmljIGlzIGFsbG93ZWQgKi8KKyAgICBpbnNlcnZpY2VfbGxpZCwKKyAgICB3YWl0X25vX3JlcG9ydHNfbGxpZCwKKyAgICAvKiBUaGUgZm9sbG93aW5nIHN0YXRlIG9ubHkgYXBwbGllcyB0byBtdWx0aWNhc3QvZmxvb2QgbGlua3MgKi8KKyAgICBpbl9zZXJ2aWNlX21jYXN0X2xsaWQsCisgICAgLyogV2Ugd2FudCBhICJSZXNlcnZlZCIgc3RhdGUgZm9yIHRoaW5ncyBsaWtlIE9wdGljYWwgbW9uaXRvcmluZyAqLworICAgIHJlc2VydmVkX2xsaWQsCisgICAgLyogV2UgaGF2ZSBkZXRlY3RlZCBhIHJvZ3VlIE9OVSBvbiB0aGlzIExMSUQgLSBkb24ndCB1c2UgaXQhICovCisgICAgcXVhcmFudGluZWRfbGxpZCwKKyAgICBsbGlkX3N0YXRlX2NvdW50LAorICAgIH0gZXBvbl9vbHRfbGxpZF9zdGF0ZTsKKworc3RhdGljIGNoYXIgKmdldF9sbGlkX3N0YXRlX3N0cmluZyhlcG9uX29sdF9sbGlkX3N0YXRlIGxsaWRfc3RhdGUpCit7CisgICAgc3RhdGljIGNoYXIgKmxsaWRfc3RhdGVfc3RyaW5nc1tdPSB7CisgICAgICAgICJ1bmFzc2lnbmVkIiwKKyAgICAgICAgIm5vdF9yZWdpc3RlcmVkIiwKKyAgICAgICAgImlnbm9yZWQiLAorICAgICAgICAid2FpdF9yZWdfYWNrIiwKKyAgICAgICAgImluc2VydmljZSIsCisgICAgICAgICJ3YWl0X25vX3JlcG9ydHMiLAorICAgICAgICAiaW5fc2VydmljZV9tY2FzdCIsCisgICAgICAgICJyZXNlcnZlZCIsCisgICAgICAgICJxdWFyYW50aW5lZCIKKyAgICAgICAgfTsKKworICAgIHJldHVybiBsbGlkX3N0YXRlX3N0cmluZ3NbKHVpbnQxNl90KShsbGlkX3N0YXRlKV07Cit9CisKKyNkZWZpbmUgTUFYX0xJTktTX1BFUl9QT1JUICA1MTIKKyNkZWZpbmUgTUFYX1BPUlRTX1BFUl9IQUxGX0NISVAgOCAKKyNkZWZpbmUgTUFYX0xJTktTX1BFUl9IQUxGX0NISVAgKChNQVhfTElOS1NfUEVSX1BPUlQpKihNQVhfUE9SVFNfUEVSX0hBTEZfQ0hJUCkpCisKK3R5cGVkZWYgdWludDhfdCBjb3JlX2Vwb247Cit0eXBlZGVmIHVpbnQxNl90IGh3X2xpbmtfaW5kZXg7CisKK3R5cGVkZWYgc3RydWN0IGVwb25fZGJfb2x0X2xsaWRfcmVjCisgICAgeworICAgIGVwb25fb2x0X2xsaWRfc3RhdGUgc3RhdGU7CisgICAgY29yZV9lcG9uIGVwb247CisgICAgaHdfbGlua19pbmRleCBpbmRleDsKKyAgICB9IGVwb25fZGJfb2x0X2xsaWRfcmVjOworCisKK3R5cGVkZWYgc3RydWN0IGVwb25fbXNnX29sdF9sbGlkX3JlYworeworICAgIHVpbnQxNl90IGluZGV4OworICAgIGVwb25fZGJfb2x0X2xsaWRfcmVjIGxsaWRfcmVjOworfSBlcG9uX21zZ19vbHRfbGxpZF9yZWM7CisKK3R5cGVkZWYgZW51bQorICAgIHsKKyAgICBlbmFibGVkLAorICAgIGRpc2FibGVkLAorICAgIH0gZXBvbl9vbHRfcG9ydF9zdGF0ZTsKKworc3RhdGljIGNoYXIgKmdldF9wb3J0X3N0YXRlX3N0cmluZyhlcG9uX29sdF9wb3J0X3N0YXRlIHBvcnRfc3RhdGUpCit7CisgICAgc3RhdGljIGNoYXIgKnBvcnRfc3RhdGVfc3RyaW5nc1tdPSB7CisgICAgICAgICJlbmFibGVkIiwKKyAgICAgICAgImRpc2FibGVkIiwKKyAgICAgICAgfTsKKworICAgIHJldHVybiBwb3J0X3N0YXRlX3N0cmluZ3NbKHVpbnQxNl90KShwb3J0X3N0YXRlKV07Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgZXBvbl9kYl9vbHRfcG9ydF9yZWMKKyAgICB7CisgICAgZXBvbl9vbHRfcG9ydF9zdGF0ZSBzdGF0ZTsKKyAgICB9IGVwb25fZGJfb2x0X3BvcnRfcmVjOworCit0eXBlZGVmIHN0cnVjdCBlcG9uX21zZ19vbHRfcG9ydF9yZWMKK3sKKyAgICB1aW50MTZfdCBpbmRleDsKKyAgICBlcG9uX2RiX29sdF9wb3J0X3JlYyBwb3J0X3JlYzsKK30gZXBvbl9tc2dfb2x0X3BvcnRfcmVjOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBlcG9uX29sdF9saW5rX3JlY29yZCwKKyAgICBlcG9uX29sdF9wb3J0X3JlY29yZCwKKyAgICBudW1fZGJfdGFibGVzLAorfSBkYl90YWJsZXM7CisKKworLyogIE1hc3RlciBkYXRhYmFzZSBoYW5kbGUgICovCitzdGF0aWMgYmNtZGJfc2V0ICpkYl9zb3Nfc2V0OworCitzdGF0aWMgYmNtZGJfc2V0KiBlcG9uX2dldF9kYl9oYW5kbGUodm9pZCkKK3sKKyAgICByZXR1cm4gZGJfc29zX3NldDsKK30KKworI2RlZmluZSBMSU5LX1JFQ19EQigpIGJjbWRiX3NldCAqZGJfc2V0ID0gYmNtZGJfc2V0X2hhbmRsZShlcG9uX2dldF9kYl9oYW5kbGUoKSwgZXBvbl9vbHRfbGlua19yZWNvcmQpCisKKyNkZWZpbmUgUE9SVF9SRUNfREIgYmNtZGJfc2V0ICpkYl9zZXQgPSBiY21kYl9zZXRfaGFuZGxlKGVwb25fZ2V0X2RiX2hhbmRsZSgpLCBlcG9uX29sdF9wb3J0X3JlY29yZCkKKworLyogRGF0YWJhc2UgdGVzdCBtZXNzYWdlcyAtICAgKi8KK3R5cGVkZWYgZW51bSAKKyAgICB7CisgICAgdXBkYXRlX2xpbmtfZGIgPSAyMCwKKyAgICB1cGRhdGVfcG9ydF9kYiA9IDIxLAorICAgIGR1bXBfZGIgICA9IDMwLAorICAgIH0gZGJ0ZXN0X21zZ2lkOworCitzdGF0aWMgaW5saW5lIGNvbnN0IGVwb25fZGJfb2x0X2xsaWRfcmVjICplcG9uX29sdF9nZXRfbGxpZF9yZWNfcmVhZCh1aW50MTZfdCBpbmRleCkKKyAgICB7IAorICAgIExJTktfUkVDX0RCKCk7CisgICAgcmV0dXJuIGJjbWRiX3JlY29yZF9nZXRfcmVhZChkYl9zZXQsIGluZGV4LCBlcG9uX2RiX29sdF9sbGlkX3JlYyk7CisgICAgfTsKKworc3RhdGljIGlubGluZSB2b2lkIGVwb25fZGJfb2x0X3VubG9ja19sbGlkX3JlYyh1aW50MTZfdCBpbmRleCkKKyAgICB7CisgICAgTElOS19SRUNfREIoKTsKKyAgICBiY21kYl9yZWNvcmRfdW5sb2NrX3JlYWQoZGJfc2V0LCBpbmRleCk7CisgICAgfQorCisKKyNkZWZpbmUgT2x0R2V0TGxpZFJlY1dyaXRlKGluZGV4KSBcCisgICAgKHsgXAorICAgIExJTktfUkVDX0RCKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmNtZGJfcmVjb3JkX2dldF93cml0ZShkYl9zZXQsIGluZGV4LCBlcG9uX2RiX29sdF9sbGlkX3JlYyk7XAorICAgICB9KQorCisjZGVmaW5lIE9sdENvbW1pdExsaWRSZWMoaW5kZXgpIFwKKyAgICAoeyBcCisgICAgTElOS19SRUNfREIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJjbWRiX3JlY29yZF91bmxvY2tfd3JpdGUoZGJfc2V0LCBCQ01PU19GQUxTRSk7XAorICAgICB9KQorCisKK3N0YXRpYyB2b2lkIHV0X2R1bXBfZGIodm9pZCkKK3sKKyAgICB1aW50MTZfdCBpbmRleDsKKyAgICBiY21kYl9zZXQgKmRiX3NldDsKKworICAgIGRiX3NldCA9IGJjbWRiX3NldF9oYW5kbGUoZXBvbl9nZXRfZGJfaGFuZGxlKCksIGVwb25fb2x0X3BvcnRfcmVjb3JkKTsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfUE9SVFNfUEVSX0hBTEZfQ0hJUDsgaW5kZXgrKykKKyAgICB7CisgICAgICAgIGNvbnN0IGVwb25fZGJfb2x0X3BvcnRfcmVjICpwb3J0X3JlYzsKKyAgICAgICAgcG9ydF9yZWMgPSBiY21kYl9yZWNvcmRfZ2V0X3JlYWQoZGJfc2V0LCBpbmRleCwgZXBvbl9kYl9vbHRfcG9ydF9yZWMpOworICAgICAgICBCQ01PU19UUkFDRShCQ01PU19UUkFDRV9MRVZFTF9JTkZPLCAKKyAgICAgICAgICAgICAgICAgICAgIlJlY29yZCAlZCwgc3RhdGUgJXNcbiIsIGluZGV4LCAKKyAgICAgICAgICAgICAgICAgICAgZ2V0X3BvcnRfc3RhdGVfc3RyaW5nKHBvcnRfcmVjLT5zdGF0ZSkpOworICAgICAgICBiY21kYl9yZWNvcmRfdW5sb2NrX3JlYWQoZGJfc2V0LCBpbmRleCk7CisgICAgfQorCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX0xJTktTX1BFUl9IQUxGX0NISVA7IGluZGV4KyspCisgICAgeworICAgICAgICBjb25zdCBlcG9uX2RiX29sdF9sbGlkX3JlYyAqbGxpZF9yZWM7CisgICAgICAgIGxsaWRfcmVjID0gZXBvbl9vbHRfZ2V0X2xsaWRfcmVjX3JlYWQoaW5kZXgpOworICAgICAgICBpZiAobGxpZF9yZWMtPnN0YXRlICE9IHVuYXNzaWduZWRfbGxpZCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0UoQkNNT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICAgICAgICJSZWNvcmQgJWQsIHBvcnQgJWQsIHN0YXRlICVzXG4iLCBsbGlkX3JlYy0+aW5kZXgsIAorICAgICAgICAgICAgICAgICAgICBsbGlkX3JlYy0+ZXBvbiwgZ2V0X2xsaWRfc3RhdGVfc3RyaW5nKGxsaWRfcmVjLT5zdGF0ZSkpOworICAgICAgICB9CisgICAgICAgIGVwb25fZGJfb2x0X3VubG9ja19sbGlkX3JlYyhpbmRleCk7CisgICAgfQorCisKK30KKworc3RhdGljIHZvaWQgdXRfdXBkYXRlX2xpbmtfZGIoZXBvbl9tc2dfb2x0X2xsaWRfcmVjICpyZWMpCit7CisgICAgZXBvbl9kYl9vbHRfbGxpZF9yZWMgKmxsaWRfcmVjOworICAgIGxsaWRfcmVjPU9sdEdldExsaWRSZWNXcml0ZShyZWMtPmluZGV4KTsKKyAgICBsbGlkX3JlYy0+c3RhdGU9cmVjLT5sbGlkX3JlYy5zdGF0ZTsKKworICAgIE9sdENvbW1pdExsaWRSZWMoaW5kZXgpOworfQorCitzdGF0aWMgdm9pZCB1dF91cGRhdGVfcG9ydF9kYihlcG9uX21zZ19vbHRfcG9ydF9yZWMgKnJlYykKK3sKKyAgICBiY21kYl9zZXQgKmRiX3NldDsKKyAgICBlcG9uX2RiX29sdF9wb3J0X3JlYyAqcG9ydF9yZWM7CisKKyAgICBkYl9zZXQgPSBiY21kYl9zZXRfaGFuZGxlKGVwb25fZ2V0X2RiX2hhbmRsZSgpLCBlcG9uX29sdF9wb3J0X3JlY29yZCk7CisgICAgcG9ydF9yZWMgPSBiY21kYl9yZWNvcmRfZ2V0X3dyaXRlKGRiX3NldCwgcmVjLT5pbmRleCwgZXBvbl9kYl9vbHRfcG9ydF9yZWMpOworCisgICAgcG9ydF9yZWMtPnN0YXRlPXJlYy0+cG9ydF9yZWMuc3RhdGU7CisKKyAgICBiY21kYl9yZWNvcmRfdW5sb2NrX3dyaXRlKGRiX3NldCwgQkNNT1NfRkFMU0UpOworfQorCisKK3N0YXRpYyB2b2lkIHV0X21zZ19oYW5kbGVyKGRidGVzdF9tc2dpZCBpZCwgdm9pZCAqZGF0YSkKKyAgICB7CisgICAgc3dpdGNoIChpZCkKKyAgICAgICAgeworICAgICAgICBjYXNlIHVwZGF0ZV9saW5rX2RiOgorICAgICAgICAgICAgdXRfdXBkYXRlX2xpbmtfZGIoKGVwb25fbXNnX29sdF9sbGlkX3JlYyopZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHVwZGF0ZV9wb3J0X2RiOgorICAgICAgICAgICAgdXRfdXBkYXRlX3BvcnRfZGIoKGVwb25fbXNnX29sdF9wb3J0X3JlYyopZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGR1bXBfZGI6CisgICAgICAgICAgICB1dF9kdW1wX2RiKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0KKworLyogRGF0YWJhc2UgZW5naW5lIHVuaXQgdGVzdCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB1aW50MTZfdCBlcG9uX2RiX2RhdGFfaW5pdCh2b2lkKQorICAgeworICAgIHVpbnQxNl90IGluZGV4OworICAgIGJjbWRiX3NldCAqZGJfc2V0OworICAgIGludCByYyA9IDA7CisKKyAgICBkYl9zZXQgPSBiY21kYl9zZXRfaGFuZGxlKGVwb25fZ2V0X2RiX2hhbmRsZSgpLCBlcG9uX29sdF9saW5rX3JlY29yZCk7CisgICAgZm9yICggaW5kZXggPSAwOyAKKyAgICAgICAgIChpbmRleCA8IE1BWF9MSU5LU19QRVJfSEFMRl9DSElQKSAmJiAocmMgPj0gMCkgJiYgKGRiX3NldCAhPSBOVUxMKSA7IAorICAgICAgICAgIGluZGV4KyspCisgICAgICAgIHsKKyAgICAgICAgZXBvbl9kYl9vbHRfbGxpZF9yZWMgbGxpZF9yZWM7CisKKyAgICAgICAgbGxpZF9yZWMuc3RhdGUgPSB1bmFzc2lnbmVkX2xsaWQ7CisgICAgICAgIGxsaWRfcmVjLmVwb24gPSBpbmRleC9NQVhfTElOS1NfUEVSX1BPUlQ7CisgICAgICAgIGxsaWRfcmVjLmluZGV4ID0gaW5kZXg7CisgICAgICAgIHJjID0gYmNtZGJfcmVjb3JkX2FkZChkYl9zZXQsIGluZGV4LCAodm9pZCAqKSZsbGlkX3JlYyk7CisgICAgICAgIH0KKworICAgIGRiX3NldCA9IGJjbWRiX3NldF9oYW5kbGUoZXBvbl9nZXRfZGJfaGFuZGxlKCksIGVwb25fb2x0X3BvcnRfcmVjb3JkKTsKKyAgICBmb3IgKCBpbmRleCA9IDA7CisgICAgICAgICAoaW5kZXggPCBNQVhfUE9SVFNfUEVSX0hBTEZfQ0hJUCkgJiYgKHJjID49IDApICYmIChkYl9zZXQgIT0gTlVMTCkgOyAKKyAgICAgICAgICBpbmRleCsrKQorICAgICAgICB7CisgICAgICAgIGVwb25fZGJfb2x0X3BvcnRfcmVjIHBvcnRfcmVjOworICAgICAgICBwb3J0X3JlYy5zdGF0ZSA9IGRpc2FibGVkOworICAgICAgICByYyA9IGJjbWRiX3JlY29yZF9hZGQoZGJfc2V0LCBpbmRleCwgKHZvaWQgKikmcG9ydF9yZWMpOworICAgICAgICB9CisgICAgcmV0dXJuIHJjOworICAgIH0KKworc3RhdGljIGludCBlcG9uX2RiX2luc3RhbmNlX2luaXQodm9pZCkKKyAgICB7CisgICAgYmNtZGJfc29zX2luaXQgZGJfc29zX2luc3Q7CisgICAgYmNtZGJfc29yX2luaXQgZGJfc29yX2luc3Q7CisgICAgY29uc3QgY2hhciogZGJfbmFtZSA9ICJFUE9OIFNUQUNLIjsKKyAgICBjb25zdCBjaGFyKiBkYl9sbGlkX25hbWUgPSAiRVBPTiBMSU5LIFJFQyI7CisgICAgY29uc3QgY2hhciogZGJfZXBvcnRfbmFtZSA9ICJFUE9OIFBPUlQgUkVDIjsKKyAgICBiY21kYl9zZXQgKmRiX3Nvcl9zZXQ7CisgICAgaW50IHJjOworCisgICAgZGJfc29zX2luc3QubmFtZSA9IGRiX25hbWU7CisgICAgZGJfc29zX2luc3QuYmFja2VuZF90eXBlID0gQkNNREJfQkFDS0VORF9BUlJBWTsKKyAgICBkYl9zb3NfaW5zdC5tYXhfZW50cmllcyA9IG51bV9kYl90YWJsZXM7IAorICAgIHJjID0gYmNtZGJfbWFrZV9zZXRfb2Zfc2V0cygmZGJfc29zX2luc3QsICZkYl9zb3Nfc2V0KTsKKworICAgIGlmIChyYyA+PSAwKQorICAgICAgICB7CisgICAgICAgIGRiX3Nvcl9pbnN0Lm5hbWUgPSBkYl9sbGlkX25hbWU7CisgICAgICAgIGRiX3Nvcl9pbnN0LmJhY2tlbmRfdHlwZSA9IEJDTURCX0JBQ0tFTkRfQVJSQVk7CisgICAgICAgIGRiX3Nvcl9pbnN0LmxvY2tfcG9saWN5ID0gQkNNREJfTE9DS19OQl9SRUFEX1NIQURPV19XUklURTsKKyAgICAgICAgZGJfc29yX2luc3QubWF4X2VudHJpZXMgPSBNQVhfTElOS1NfUEVSX0hBTEZfQ0hJUDsgCisgICAgICAgIGRiX3Nvcl9pbnN0LnJlY29yZF9zaXplID0gc2l6ZW9mKGVwb25fZGJfb2x0X2xsaWRfcmVjKTsKKyAgICAgICAgZGJfc29yX2luc3QuZm9ybWF0ID0gTlVMTDsKKyAgICAgICAgYmNtZGJfbWFrZV9zZXRfb2ZfcmVjb3JkcygmZGJfc29yX2luc3QsIEJDTU9TX1RSVUUsICZkYl9zb3Jfc2V0KTsKKyAgICAgICAgCisgICAgICAgIHJjID0gYmNtZGJfc2V0X2FkZChlcG9uX2dldF9kYl9oYW5kbGUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcG9uX29sdF9saW5rX3JlY29yZCwgZGJfc29yX3NldCk7CisgICAgICAgIH0KKyAgICBpZiAocmMgPj0gMCkKKyAgICAgICAgeworICAgICAgICBkYl9zb3JfaW5zdC5uYW1lID0gZGJfZXBvcnRfbmFtZTsKKyAgICAgICAgZGJfc29yX2luc3QuYmFja2VuZF90eXBlID0gQkNNREJfQkFDS0VORF9BUlJBWTsKKyAgICAgICAgZGJfc29yX2luc3QubG9ja19wb2xpY3kgPSBCQ01EQl9MT0NLX05CX1JFQURfU0hBRE9XX1dSSVRFOworICAgICAgICBkYl9zb3JfaW5zdC5tYXhfZW50cmllcyA9IE1BWF9QT1JUU19QRVJfSEFMRl9DSElQOyAKKyAgICAgICAgZGJfc29yX2luc3QucmVjb3JkX3NpemUgPSBzaXplb2YoZXBvbl9kYl9vbHRfcG9ydF9yZWMpOworICAgICAgICBkYl9zb3JfaW5zdC5mb3JtYXQgPSBOVUxMOworICAgICAgICByYyA9IGJjbWRiX21ha2Vfc2V0X29mX3JlY29yZHMoJmRiX3Nvcl9pbnN0LCBCQ01PU19UUlVFLCAmZGJfc29yX3NldCk7CisgICAgICAgIH0KKworICAgIHJjID0gYmNtZGJfc2V0X2FkZChlcG9uX2dldF9kYl9oYW5kbGUoKSwgZXBvbl9vbHRfcG9ydF9yZWNvcmQsIGRiX3Nvcl9zZXQpOworCisgICAgQkNNT1NfVFJBQ0UoQkNNT1NfVFJBQ0VfTEVWRUxfSU5GTywgImRhdGFiYXNlIGNyZWF0aW9uIHJldHVybmQgJWRcbiIsIHJjKTsKKworICAgIGlmIChyYyA+PSAwKQorICAgICAgICB7CisgICAgICAgIHJjID0gZXBvbl9kYl9kYXRhX2luaXQoKTsKKyAgICAgICAgfQorICAgIHJldHVybiByYzsKKyAgICB9CisKKy8qIFRocmVhZCBoYW5kbGVycyAtIHNvIHRoYXQgdGhlIERCIGFjY2Vzc2VzIGNhbiBiZSB0ZXN0ZWQgYWNyb3NzIG11bHRpcGxlCisgICB0aHJlYWRzLiAqLworc3RhdGljIGludCB0YXNrMV9oYW5kbGVyKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19tc2dfcXVldWUgKnEgPSAoYmNtb3NfbXNnX3F1ZXVlICopZGF0YTsKKyAgICBiY21vc19tc2cgKm1zZzsKKworICAgIEJDTU9TX1RSQUNFKEJDTU9TX1RSQUNFX0xFVkVMX0lORk8sICJ0cmFkaXRpb25hbCB0YXNrIGhhbmRsZXJcbiIpOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRShCQ01PU19UUkFDRV9MRVZFTF9JTkZPLCAiV2FpdGluZyBmb3IgbWVzc2FnZVxuIik7CisKKyAgICAgICAgYmNtb3NfbXNnX3JlY3YocSwgQkNNT1NfV0FJVF9GT1JFVkVSLCAmbXNnKTsKKyAgICAgICAgQkNNT1NfVFJBQ0UoQkNNT1NfVFJBQ0VfTEVWRUxfSU5GTywgCisgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBtZXNzYWdlIElEICVkLCBkYXRhICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBtc2ctPnR5cGUsIG1zZy0+ZGF0YSk7CisgICAgCisgICAgICAgIHV0X21zZ19oYW5kbGVyKG1zZy0+dHlwZSwgbXNnLT5kYXRhKTsKKyAgICAgICAgYmNtb3NfdXNsZWVwKDEwMDAwMCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGJjbW9zX2Vycm5vIG1vZDFfaW5pdChsb25nIGRhdGEpCit7CisgICAgQkNNT1NfVFJBQ0UoQkNNT1NfVFJBQ0VfTEVWRUxfSU5GTywgIiVsZFxuIiwgZGF0YSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIG1vZF9tc2dfaGFuZGxlcihiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm1zZykKK3sKKyAgICBCQ01PU19UUkFDRShCQ01PU19UUkFDRV9MRVZFTF9JTkZPLCAibW9kdWxlICVkICBtc2cgJWQgIGRhdGEgJXBcbiIsIAorICAgICAgICAgICAgICAgIG1vZHVsZV9pZCwgbXNnLT50eXBlLCBtc2ctPmRhdGEpOworCisgICAgdXRfbXNnX2hhbmRsZXIobXNnLT50eXBlLCBtc2ctPmRhdGEpOworfQorCisKKworLyogVW5pdCB0ZXN0IGZ1bmN0aW9uIC0gICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGJjbW9zX3Rhc2tfcGFybSB0cCA9IHt9OworICAgIGJjbW9zX21zZ19xdWV1ZV9wYXJtIHFwID0ge307CisgICAgYmNtb3NfbW9kdWxlX3Bhcm0gbXAgPSB7fTsKKyAgICBiY21vc19tc2cgbXNnMSA9IHt9OworICAgIGJjbW9zX21zZyBtc2cyID0ge307CisKKyAgICBiY21vc190YXNrIHQxOworICAgIGJjbW9zX3Rhc2sgdDI7CisgICAgYmNtb3NfbXNnX3F1ZXVlIHExOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGVwb25fbXNnX29sdF9sbGlkX3JlYyBsaW5rX3JlYzEsIGxpbmtfcmVjMjsKKyAgICBlcG9uX21zZ19vbHRfcG9ydF9yZWMgcG9ydF9tc2cxLCBwb3J0X21zZzI7CisKKyAgICBiY21vc19pbml0KCk7CisgICAgYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KEJDTU9TX1RSQUNFX0xFVkVMX0RFQlVHKTsKKworICAgIGlmIChlcG9uX2RiX2luc3RhbmNlX2luaXQoKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgaW5zdGFudGlhdGUgYSBEYXRhYmFzZVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisgICAgCisgICAgQkNNT1NfVFJBQ0UoQkNNT1NfVFJBQ0VfTEVWRUxfSU5GTywgIkRhdGFiYXNlIHNldCAlcFxuIiwgCisgICAgICAgICAgICAgICAgYmNtZGJfc2V0X2hhbmRsZShkYl9zb3Nfc2V0LCBlcG9uX29sdF9saW5rX3JlY29yZCkpOworCisgICAgLyogQ3JlYXRlIG1lc3NhZ2UgcXVldWUgKi8KKyAgICBxcC5uYW1lID0gIm1zZyBxdWV1ZTEiOworICAgIHFwLnNpemUgPSAxNjsKKyAgICBxcC5oaWdoX3dtID0gMTQ7CisgICAgcXAubG93X3dtID0gMTI7CisgICAgcmMgPSBiY21vc19tc2dfcXVldWVfY3JlYXRlKCZxMSwgJnFwKTsKKworICAgIC8qIENyZWF0ZSBhIGNvdXBsZSBvZiB0aHJlYWRzICovCisgICAgdHAubmFtZSA9ICJ0YXNrMSI7CisgICAgdHAuaGFuZGxlciA9IHRhc2sxX2hhbmRsZXI7CisgICAgdHAuZGF0YSA9IChsb25nKSZxMTsKKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZ0MSwgJnRwKTsKKworICAgIHRwLm5hbWUgPSAidGFzazIiOworICAgIHRwLmhhbmRsZXIgPSBOVUxMOworICAgIHRwLmRhdGEgPSAwOworICAgIHJjID0gYmNtb3NfdGFza19jcmVhdGUoJnQyLCAmdHApOworCisgICAgLyogUmVnaXN0ZXIgYSBtb2R1bGUgKi8KKyAgICBtcC5xcGFybS5uYW1lID0gIm1vZHVsZTEiOworICAgIG1wLnFwYXJtLnNpemUgPSAxNjsKKyAgICBtcC5pbml0ID0gbW9kMV9pbml0OworICAgIGJjbW9zX21vZHVsZV9jcmVhdGUoQkNNT1NfTU9EVUxFX0lEX1RFU1QxLCAmdDIsICZtcCk7CisgICAgCisgICAgLyogV2FpdCBzb21lICovCisgICAgYmNtb3NfdXNsZWVwKDIwMDAwMDApOworCisgICAgLyogIFNlbmQgYSBtZXNzYWdlIHRvIHVwZGF0ZSB0aGUgREIgLSBlbmFibGUgYSBwb3J0Ki8KKyAgICBwb3J0X21zZzEuaW5kZXg9NTsKKyAgICBwb3J0X21zZzEucG9ydF9yZWMuc3RhdGU9ZW5hYmxlZDsKKyAgICBtc2cxLnR5cGUgPSB1cGRhdGVfcG9ydF9kYjsKKyAgICBtc2cxLmRhdGEgPSAmcG9ydF9tc2cxOworICAgIGJjbW9zX21zZ19zZW5kKCZxMSwgJm1zZzEsIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IpOworCisgICAgLyogIFNlbmQgYSBtZXNzYWdlIHRvIHVwZGF0ZSB0aGUgREIgLSBlbmFibGUgYSBwb3J0Ki8KKyAgICBwb3J0X21zZzIuaW5kZXg9MzsKKyAgICBwb3J0X21zZzIucG9ydF9yZWMuc3RhdGU9ZW5hYmxlZDsKKyAgICBtc2cyLnR5cGUgPSB1cGRhdGVfcG9ydF9kYjsKKyAgICBtc2cyLmRhdGEgPSAmcG9ydF9tc2cyOworICAgIGJjbW9zX21zZ19zZW5kKCZxMSwgJm1zZzIsIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IpOworCisgICAgLyogV2FpdCBzb21lICovCisgICAgYmNtb3NfdXNsZWVwKDIwMDAwMDApOworCisgICAgLyogIFNlbmQgYSBtZXNzYWdlIHRvIHVwZGF0ZSB0aGUgREIgLSBwdXQgYSBsaW5rIEluIFNlcnZpY2UqLworICAgIGxpbmtfcmVjMS5pbmRleD0xNDsKKyAgICBsaW5rX3JlYzEubGxpZF9yZWMuc3RhdGU9aW5zZXJ2aWNlX2xsaWQ7CisgICAgbXNnMS50eXBlID0gdXBkYXRlX2xpbmtfZGI7CisgICAgbXNnMS5kYXRhID0gJmxpbmtfcmVjMTsKKyAgICBiY21vc19tc2dfc2VuZCgmcTEsICZtc2cxLCBCQ01PU19NU0dfU0VORF9OT19GUkVFX09OX0VSUk9SKTsKKworICAgIC8qICBTZW5kIGEgbWVzc2FnZSB0byB1cGRhdGUgdGhlIERCIC0gcXVhcmFudGluZSBhIGxpbmsgKi8KKyAgICBsaW5rX3JlYzIuaW5kZXg9MjI7CisgICAgbGlua19yZWMyLmxsaWRfcmVjLnN0YXRlPXF1YXJhbnRpbmVkX2xsaWQ7CisgICAgbXNnMi50eXBlID0gdXBkYXRlX2xpbmtfZGI7CisgICAgbXNnMi5kYXRhID0gJmxpbmtfcmVjMjsKKyAgICBtc2cyLmhhbmRsZXIgPSBtb2RfbXNnX2hhbmRsZXI7CisgICAgYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9URVNUMSwgJm1zZzIsIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IpOworCisgICAgLyogV2FpdCBzb21lICovCisgICAgYmNtb3NfdXNsZWVwKDIwMDAwMDApOworCisgICAgLyogU2VuZCBhIG1lc3NhZ2UgdG8gZHVtcCB0aGUgREIgKi8KKyAgICBtc2cxLnR5cGUgPSBkdW1wX2RiOworICAgIG1zZzEuaGFuZGxlciA9IG1vZF9tc2dfaGFuZGxlcjsKKyAgICBtc2cxLmRhdGEgPSBOVUxMOworICAgIGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShCQ01PU19NT0RVTEVfSURfVEVTVDEsICZtc2cxLCBCQ01PU19NU0dfU0VORF9OT19GUkVFX09OX0VSUk9SKTsKKworCisgICAgLyogV2FpdCBzb21lICovCisgICAgYmNtb3NfdXNsZWVwKDIwMDAwMDApOworCisgICAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9kZWJ1Zy9pcGNfcGluZy9NYWtlZmlsZSBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vZGVidWcvaXBjX3BpbmcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjMmI4NQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vZGVidWcvaXBjX3BpbmcvTWFrZWZpbGUKQEAgLTAsMCArMSwzNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisjICAKKyMgICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorIyAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyAgCisjICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisjICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisjICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyMgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorIyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyMgIAorIyAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorIyAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisjICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisjICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisjICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyMgICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyMgICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisjICAgICBvZiB0aGUgc29mdHdhcmUuCisjICAKKyMgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorIyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisjICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorIyAgd3JpdHRlbiBjb25zZW50LgorIyAgCisjICA6PgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBJUEMgcGluZyBkZWJ1ZyB1dGlsaXR5CisjCitNT0RfTkFNRSA9IGlwY19waW5nCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSBjbGkKK3NyY3MgPSBiYWxfaXBjX3BpbmcuYwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9kZXZfbG9nIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9kZXZfbG9nCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjBjMmU3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2Rldl9sb2cKQEAgLTAsMCArMSBAQAorLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvTWFrZWZpbGUgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2NTBhYQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vaW5jbHVkZS9NYWtlZmlsZQpAQCAtMCwwICsxLDM4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyMgIAorIyAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisjICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisjICAKKyMgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyMgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyMgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorIyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisjICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorIyAgCisjICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisjICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyMgICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyMgICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyMgICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorIyAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworIyAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyMgICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyMgIAorIyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisjICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyMgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisjICB3cml0dGVuIGNvbnNlbnQuCisjICAKKyMgIDo+CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbW1vbiBoZWFkZXJzCisjCitNT0RfTkFNRSA9IGNvbW1vbl9pbmNsdWRlCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSAgCitnZW5fYmFsX2hkcnMgPSBiYWxfbW9kZWxfaWRzLmggYmFsX21vZGVsX3R5cGVzLmgKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9idWYuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vaW5jbHVkZS9iYWxfYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlMDZmNwotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vaW5jbHVkZS9iYWxfYnVmLmgKQEAgLTAsMCArMSw0MyBAQAorI2lmbmRlZiBCQUxfQlVGCisjZGVmaW5lIEJBTF9CVUYKKworI2luY2x1ZGUgImJjbW9sdF9idWYuaCIKKwordHlwZWRlZiBiY21vbHRfYnVmIGJjbWJhbF9idWY7CisKKyNkZWZpbmUgYmNtYmFsX2J1Zl9pbml0KGJ1Ziwgc2l6ZSwgc3RhcnQpICBiY21vbHRfYnVmX2luaXQoYnVmLCBzaXplLCBzdGFydCwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpCisjZGVmaW5lIGJjbWJhbF9idWZfYWxsb2MoYnVmLCBzaXplKSAgICAgICAgYmNtb2x0X2J1Zl9hbGxvYyhidWYsIHNpemUsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKQorI2RlZmluZSBiY21iYWxfYnVmX2ZyZWUgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfZnJlZQorI2RlZmluZSBiY21iYWxfYnVmX3NraXAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2tpcAorI2RlZmluZSBiY21iYWxfYnVmX3NldF9wb3MgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcworI2RlZmluZSBiY21iYWxfYnVmX2dldF91c2VkICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfZ2V0X3VzZWQKKyNkZWZpbmUgYmNtYmFsX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUgICAgICBiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZQorI2RlZmluZSBiY21iYWxfYnVmX3dyaXRlICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGUKKyNkZWZpbmUgYmNtYmFsX2J1Zl9yZWFkICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQKKyNkZWZpbmUgYmNtYmFsX2J1Zl9yZXdpbmQgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3Jld2luZAorI2RlZmluZSBiY21iYWxfYnVmX3dyaXRlX3U4ICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgKKyNkZWZpbmUgYmNtYmFsX2J1Zl9yZWFkX3U4ICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgKKyNkZWZpbmUgYmNtYmFsX2J1Zl93cml0ZV91MTYgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UxNgorI2RlZmluZSBiY21iYWxfYnVmX3JlYWRfdTE2ICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MTYKKyNkZWZpbmUgYmNtYmFsX2J1Zl93cml0ZV9zMTYgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3MxNgorI2RlZmluZSBiY21iYWxfYnVmX3JlYWRfczE2ICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF9zMTYKKyNkZWZpbmUgYmNtYmFsX2J1Zl93cml0ZV91MjQgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UyNAorI2RlZmluZSBiY21iYWxfYnVmX3JlYWRfdTI0ICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MjQKKyNkZWZpbmUgYmNtYmFsX2J1Zl93cml0ZV91MzIgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UzMgorI2RlZmluZSBiY21iYWxfYnVmX3JlYWRfdTMyICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MzIKKyNkZWZpbmUgYmNtYmFsX2J1Zl93cml0ZV9zMzIgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3MzMgorI2RlZmluZSBiY21iYWxfYnVmX3JlYWRfczMyICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF9zMzIKKyNkZWZpbmUgYmNtYmFsX2J1Zl93cml0ZV91NjQgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U2NAorI2RlZmluZSBiY21iYWxfYnVmX3JlYWRfdTY0ICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91NjQKKyNkZWZpbmUgYmNtYmFsX2J1Zl93cml0ZV9ib29sICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX2Jvb2wKKyNkZWZpbmUgYmNtYmFsX2J1Zl9yZWFkX2Jvb2wgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWRfYm9vbAorI2RlZmluZSBiY21iYWxfYnVmX3dyaXRlX21hY19hZGRyZXNzICAgICAgIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MKKyNkZWZpbmUgYmNtYmFsX2J1Zl9yZWFkX21hY19hZGRyZXNzICAgICAgICBiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MKKyNkZWZpbmUgYmNtYmFsX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MgICAgICBiY21vbHRfYnVmX3dyaXRlX2lwdjRfYWRkcmVzcworI2RlZmluZSBiY21iYWxfYnVmX3JlYWRfaXB2NF9hZGRyZXNzICAgICAgIGJjbW9sdF9idWZfcmVhZF9pcHY0X2FkZHJlc3MKKyNkZWZpbmUgYmNtYmFsX2J1Zl93cml0ZV9pcHY2X2FkZHJlc3MgICAgICBiY21vbHRfYnVmX3dyaXRlX2lwdjZfYWRkcmVzcworI2RlZmluZSBiY21iYWxfYnVmX3JlYWRfaXB2Nl9hZGRyZXNzICAgICAgIGJjbW9sdF9idWZfcmVhZF9pcHY2X2FkZHJlc3MKKyNkZWZpbmUgYmNtYmFsX2J1Zl93cml0ZV92bGFuX3RhZyAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3ZsYW5fdGFnCisjZGVmaW5lIGJjbWJhbF9idWZfcmVhZF92bGFuX3RhZyAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3ZsYW5fdGFnCisKKyNlbmRpZiAvKiBCQUxfQlVGICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX2NvbW1vbi5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWEyNTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9jb21tb24uaApAQCAtMCwwICsxLDMxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX2NvbW1vbi5oCisgKgorICogQGJyaWVmIENvbW1vbiBpbmNsdWRlIGZpbGVzIGFuZCBtaXNjZWxsYW5lb3VzIG1hY3JvcyBmb3IgdGhlIEJBTCBzb3VyY2UgY29kZS4KKyAqCisgKi8KKworI2lmbmRlZglCQUxDT01NT05fSAorI2RlZmluZQlCQUxDT01NT05fSAorCisvKkB7Ki8KKworLyogLS0tIHN5c3RlbSBpbmNsdWRlcyAtLS0qLworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisvKiAtLS0gcHJvamVjdCBpbmNsdWRlcyAtLS0qLworCisvKioKKyAqIEBicmllZiBPVUkgSWRlbnRpZmllcgorICogIAorICovICAKK3R5cGVkZWYgdWludDhfdCBvdWlfdmFsX3RbM107CisKKy8qCisgKiBBIG1heC9taW4gZnVuY3Rpb24KKyAqLworI2RlZmluZSBtYXgoYSxiKSAoKGEgPiBiKSA/IGEgOiBiKQorI2RlZmluZSBtaW4oYSxiKSAoKGEgPiBiKSA/IGIgOiBhKQorCisvKioKKyAqICBAYnJpZWYgTWF4aW11bSB2YWx1ZSBmb3IgYSBWTEFOIElECisgKi8KKyNkZWZpbmUgTUFYX1ZMQU5fSUQgNDA5NAorCisvKioKKyAqICBAYnJpZWYgTWluaW11bSB2YWx1ZSBmb3IgYW4gODAyLjFhaCBJLVNJRAorICoKKyAqICBOb3RlcyBmcm9tIElFRUU6CisgKiAgICAgIDAgICAgICAtIFJlc2VydmVkIGZvciB1c2UgYnkgZnV0dXJlIGFtZW5kbWVudHMgdG8gdGhlIHN0YW5kYXJkLgorICogICAgICAxICAgICAgLSBEZWZhdWx0IHZhbHVlLCB1bmFzc2lnbmVkIElTSUQuCisgKiAgICAgIDIuLkZGICAtIFJlc2VydmVkIGZvciB1c2UgYnkgZnV0dXJlIGFtZW5kbWVudHMgdG8gdGhlIHN0YW5kYXJkLgorICovCisjZGVmaW5lIE1JTl84MDIxQUhfSVNJRCAweDAwMDAwMTAwCisKKy8qKgorICogIEBicmllZiBNYXhpbXVtIHZhbHVlIGZvciBhbiA4MDIuMWFoIEktU0lECisgKgorICogIE5vdGVzIGZyb20gSUVFRToKKyAqICAgICAgRkZGRkZGIGlzIHJlc2VydmVkIGJ5IElFRUUKKyAqLworI2RlZmluZSBNQVhfODAyMUFIX0lTSUQgMHgwMEZGRkZGRQorCisvKioKKyAqIEBicmllZiBWTEFOIFRQSUQgZGVmaW5pdGlvbnMKKyAqLwordHlwZWRlZiBlbnVtIHZsYW5fdHBpZF90eXBlCit7CisgICAgVkxBTl9UUElEX1RZUEVfREVGQVVMVCA9IDB4MDAwMCwgICAgIC8qKjwgU2ltcGxlIEJyaWRnZSAtIGkuZS4gVklEIDAsIG5vIHRhZ2dpbmcgKi8KKyAgICBWTEFOX1RQSURfVFlQRV84MDIxUSAgID0gMHg4MTAwLCAgICAgLyoqPCBDLVZMQU4gKi8KKyAgICBWTEFOX1RQSURfVFlQRV84MDIxQUQgID0gMHg4OEE4LCAgICAgLyoqPCBTLVZMQU4gKi8KKyAgICBWTEFOX1RQSURfVFlQRV85MTAwICAgID0gMHg5MTAwLCAgICAgLyoqPCBMZWdhY3kgVFBJRCAqLworICAgIFZMQU5fVFBJRF9UWVBFXzkyMDAgICAgPSAweDkyMDAsICAgICAvKio8IExlZ2FjeSBUUElEICovCisgICAgVkxBTl9UUElEX1RZUEVfOTMwMCAgICA9IDB4OTMwMCwgICAgIC8qKjwgTGVnYWN5IFRQSUQgKi8KKyAgICBWTEFOX1RQSURfVFlQRV84MDIxQUhfSVRBRyA9IDB4ODhFNyAgLyoqPCA4MDIuMWFoIEktVGFnIFRQSUQgKi8KK30gdmxhbl90cGlkX3R5cGU7CisKKy8qKgorICogQGJyaWVmIFZMQU4gdHlwZSBkZWZpbml0aW9ucworICovCit0eXBlZGVmIGVudW0gdmxhbl9tb2RlX3R5cGUKK3sKKyAgICBWTEFOX01PREVfTk9ORSwgICAgICAgLyoqPCBOZWl0aGVyIFNoYXJlZCBvciBMMlZQTiAqLworICAgIFZMQU5fTU9ERV9TSEFSRUQsICAgICAvKio8IElQLWJhc2VkIHNoYXJlZCB2bGFuICovCisgICAgVkxBTl9NT0RFXzgwMjFBRF9FTiwgIC8qKjwgRFBvRSA4MDIuMWFkIChvciAuMXEpIGVuY2Fwc3VsYXRpb24gbW9kZSAqLworICAgIFZMQU5fTU9ERV84MDIxQURfVFAsICAvKio8IERQb0UgODAyLjFhZCAob3IgLjFxKSB0cmFuc3BvcnQgbW9kZSAqLworICAgIFZMQU5fTU9ERV84MDIxQUhfRU4sICAvKio8IERQb0UgODAyLjFhaCBlbmNhcHN1bGF0aW9uIG1vZGUgKi8KKyAgICBWTEFOX01PREVfODAyMUFIX1RQLCAgLyoqPCBEUG9FIDgwMi4xYWggdHJhbnNwb3J0IG1vZGUgKi8KKyAgICBWTEFOX01PREVfREFDICAgICAgICAgLyoqPCBEUG9FIERFTUFSQyBBdXRvIENvbmZpZ3VyYXRpb24gKi8KK30gdmxhbl9tb2RlOworCisvKioKKyAqIEBicmllZiBNYWNybyB0byB0ZXN0IGlmIGEgVkxBTiBpcyA4MDIuMWFkCisgKi8KKyNkZWZpbmUgVkxBTl9JU184MDIxQUQoX3ZsYW5fKSAoKChfdmxhbl8pLT50eXBlID09IFZMQU5fTU9ERV84MDIxQURfRU4pIHx8ICgoX3ZsYW5fKS0+dHlwZSA9PSBWTEFOX01PREVfODAyMUFEX1RQKSkKKworLyoqCisgKiBAYnJpZWYgTWFjcm8gdG8gdGVzdCBpZiBhIFZMQU4gaXMgODAyLjFhaAorICovCisjZGVmaW5lIFZMQU5fSVNfODAyMUFIKF92bGFuXykgKCgoX3ZsYW5fKS0+dHlwZSA9PSBWTEFOX01PREVfODAyMUFIX0VOKSB8fCAoKF92bGFuXyktPnR5cGUgPT0gVkxBTl9NT0RFXzgwMjFBSF9UUCkpCisKKy8qKgorICogQGJyaWVmIE1hY3JvIHRvIHRlc3QgaWYgYSBWTEFOIGlzIEwyVlBOIChhcyBvcHBvc2VkIHRvICdOb25lJyBvciAiU2hhcmVkJykKKyAqLworI2RlZmluZSBWTEFOX0lTX0wyVlBOKF92bGFuXykgKFZMQU5fSVNfODAyMUFEKF92bGFuXykgfHwgVkxBTl9JU184MDIxQUgoX3ZsYW5fKSkKKworLyoqCisgKiBAYnJpZWYgTWFjcm8gdG8gdGVzdCBpZiBhIFZMQU4gaXMgRFBvRSBJUC1IU0QKKyAqLworI2RlZmluZSBWTEFOX0lTX0RQT0VfSVBIU0QoX3ZsYW5fKSAoKChfdmxhbl8pLT50eXBlID09IFZsYW5UeXBlX05vbmUpICYmICgoX3ZsYW5fKS0+ZHBvZUlwLnN2aWQgIT0gMCkgJiYgKChfdmxhbl8pLT5kcG9lSXAuY3ZpZCAhPSAwKSkKKworLyoqCisgKiBAYnJpZWYgTWFjcm8gdG8gdGVzdCBpZiBhIFZMQU4gaXMgTGVnYWN5IElQLUhTRAorICovCisjZGVmaW5lIFZMQU5fSVNfTEVHQUNZX0lQSFNEKF92bGFuXykgKCgoX3ZsYW5fKS0+dHlwZSA9PSBWbGFuVHlwZV9Ob25lKSAmJiAoKF92bGFuXyktPmRwb2VJcC5zdmlkID09IDApKQorCisvKioKKyAqIEBicmllZiBNYWNybyB0byB0ZXN0IGlmIGEgVkxBTiBpcyBEUG9FIElQLUhTRCB3aXRoIFBPTi1OTkkgc3R5bGUgdGFnZ2luZworICovCisjZGVmaW5lIFZMQU5fSVNfRFBPRV9JUEhTRF9QT05fTk5JKF92bGFuXykgKFZMQU5fSVNfRFBPRV9JUEhTRChfdmxhbl8pICYmICgoX3ZsYW5fKS0+ZG90MWFkW1ZMQU5fVEFHX09VVEVSXS5ubmlUcGlkICE9IDApKQorCisvKioKKyAqIEBicmllZiBNYWNybyB0byB0ZXN0IGlmIGEgVkxBTiBpcyBTaGFyZWQKKyAqLworI2RlZmluZSBWTEFOX0lTX1NIQVJFRChfdmxhbl8pICgoX3ZsYW5fKS0+dHlwZSA9PSBWTEFOX01PREVfU0hBUkVEKQorCisvKioKKyAqIEBicmllZiA4MDIuMWFkIFZMQU4gVGFnIGluZGV4CisgKgorICogVGhpcyBlbnVtIGlzIHVzZWQgaW4gdGhlIFZsYW5UIHN0cnVjdHVyZSB0byBhZGRyZXNzIHRoZSBvdXRlciB2cy4gdGhlIGlubmVyCisgKiA4MDIuMWFkIHRhZy4KKyAqLwordHlwZWRlZiBlbnVtIHZsYW5fdGFnX2luZGV4Cit7CisgICAgVkxBTl9UQUdfSU5ERVhfT1VURVIgPSAwLCAgLyoqPCBPdXRlciB0YWcsIHR5cGljYWxseSB0aGUgUy1WTEFOIHRhZyAqLworICAgIFZMQU5fVEFHX0lOREVYX0lOTkVSID0gMSwgIC8qKjwgSW5uZXIgdGFnLCB0eXBpY2FsbHkgdGhlIEMtVkxBTiB0YWcgKi8KKyAgICBWTEFOX1RBR19JTkRFWF9NQVggICA9IDIKK30gdmxhbl90YWdfaW5kZXg7CisKKy8qKgorICogQGJyaWVmIFZsYW5UIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfdmxhbgoreworICAgIHZsYW5fbW9kZSAgICB0eXBlOyAgICAgLyoqPCBUeXBlIG9mIFZMQU4gKi8KKworICAgIC8qKiBJbnRyYS1DaGFzc2lzIFRhZ2dpbmcgKi8KKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHRwaWQ7ICAgICAgICAgIC8qKjwgSUNUIFRQSUQgKi8KKyAgICAgICAgdWludDE2X3QgdmlkOyAgICAgICAgICAgLyoqPCBJQ1QgVkxBTiBJRCAqLworICAgIH0gaWN0OworCisgICAgLyoqIERQb0UgSVAgSFNEIFRhZ2dpbmcgKi8KKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHN2aWQ7ICAgICAgICAgIC8qKjwgUy1UQUcgVklEICovCisgICAgICAgIHVpbnQxNl90IGN2aWQ7ICAgICAgICAgIC8qKjwgQy1UQUcgVklEICovCisgICAgfSBkcG9lX2lwOworCisgICAgLyoqIDgwMi4xYWQgKGFuZCA4MDIuMXEpIHRhZ2dpbmcgKi8KKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IG5uaV90cGlkOyAgICAgICAvKio8IFZMQU4gVGFnIFRQSUQgdXNlZCBvbiB0aGUgTk5JICovCisgICAgICAgIHVpbnQxNl90IHVuaV90cGlkOyAgICAgICAvKio8IFZMQU4gVGFnIFRQSUQgdXNlZCBvbiB0aGUgVU5JICovCisgICAgICAgIHVpbnQ4X3QgIGNvczsgICAgICAgICAgIC8qKjwgQ29TIGJpdHMgdXNlZCBpbiB0aGlzIFZMQU4gVGFnICovCisgICAgICAgIHVpbnQxNl90IHZpZDsgICAgICAgICAgIC8qKjwgVkxBTiBJRCAqLworICAgIH0gZG90XzFhZFtWTEFOX1RBR19JTkRFWF9NQVhdOworCisgICAgLyoqIDgwMi4xYWggZW5jYXBzdWxhdGlvbiBpbmZvICovCisgICAgc3RydWN0CisgICAgeworICAgICAgICAvKiogODAyLjFhaCBCLU1BQ3MgKi8KKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgYmRhOyAgIC8qKjwgODAyLjFhaCBEZXN0aW5hdGlvbiBCLU1BQyAqLworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBic2E7ICAgLyoqPCA4MDIuMWFoIFNvdXJjZSBCLU1BQyAqLworCisgICAgICAgIC8qKiA4MDIuMWFoIEItVGFnICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBubmlfdHBpZDsgICAvKio8IEItVGFnIFRQSUQgdXNlZCBvbiB0aGUgTk5JICovCisgICAgICAgICAgICB1aW50MTZfdCB1bmlfdHBpZDsgICAvKio8IEItVGFnIFRQSUQgdXNlZCBvbiB0aGUgVU5JICovCisgICAgICAgICAgICB1aW50MTZfdCB2aWQ7ICAgICAgIC8qKjwgQi1UYWcgVkxBTiBJRCAqLworICAgICAgICB9IGJ0YWc7CisKKyAgICAgICAgLyoqIDgwMi4xYWggSS1UYWcgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG5uaV90cGlkOyAgIC8qKjwgSS1UYWcgVFBJRCB1c2VkIG9uIHRoZSBOTkkgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHVuaV90cGlkOyAgIC8qKjwgSS1UYWcgVFBJRCB1c2VkIG9uIHRoZSBVTkkgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGlzaWQ7ICAgICAgLyoqPCBJLVRhZyBTZXJ2aWNlIElEICovCisgICAgICAgIH0gaXRhZzsKKyAgICB9IGRvdF8xYWg7CisKKyAgICAvKiogTDJWUE4gc3BlY2lmaWMgVkxBTiBjb25maWd1cmF0aW9uICovCisgICAgdWludDMyX3QgICAgICAgICB2cG5faWR4OyAvKio8IEluZGV4IG9mIEwyVlBOIHRoYXQgbGluayBpcyBhc3NvY2lhdGVkIHdpdGguICovCit9IGJjbWJhbF92bGFuOworCisvKioKKyAqIEBicmllZiBNQUMgQWRkcmVzcyBrZXkgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGVmZmVjdGl2ZWx5IGFkZHMgYSBsZW5ndGggZmllbGQgdG8gdGhlIE1hY0FkZHJlc3NUIHN0cnVjdHVyZQorICogd2hpY2ggaGVscHMgd2hlbiBoYW5kbGluZyBHZXROZXh0IHJlcXVlc3RzIHRoYXQgZG9uJ3QgY29udGFpbiBhIGZ1bGwgTUFDCisgKiBBZGRyZXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBtYWNfYWRkcmVzc19rZXkKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcjsgIC8qKjwgVGhlIE1BQyBhZGRyZXNzICovCisgICAgdWludDE2X3QgICAgICAgICBsZW47ICAgICAgICAvKio8IFRoZSBsZW5ndGggb2YgdGhlIE1BQyBhZGRyZXNzIGluIHRoZSBmaWVsZCBhYm92ZSAqLworfSBtYWNfYWRkcmVzc19rZXk7CisKKy8qKgorICogQGJyaWVmIE1BQyBBZGRyZXNzIGxlbmd0aAorICovCisjZGVmaW5lIE1BQ19BRERSRVNTX0xFTiA2CisKKy8qKgorICogQGJyaWVmIENvbnZlcnRzIGEgTWFjQWRkcmVzc1Qgc3RydWN0dXJlIGludG8gYSBNYWNBZGRyZXNzS2V5VCBzdHJ1Y3R1cmUuCisgKi8KKyNkZWZpbmUgTUFDX0FERFJfVE9fS0VZKEEsIEssIEwpIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgKEspLT5tYWNfYWRkciA9ICooQSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChLKS0+bGVuID0gKEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvKioKKyAqICBAYnJpZWYgQ29tcGFyZXMgdGhlIDgwMi4xYWQgKG9yIHEpIGZpZWxkcyBvZiB0d28gVmxhblQgb2JqZWN0cworICoKKyAqICBUaGlzIG1hY3JvIHJldHVybnMgJzEnIGlmIGFsbCBmaWVsZHMgbWF0Y2gsIGFuZCAnMCcgb3RoZXJ3aXNlLgorICoKKyAqICBOb3RlLCB0aGlzIG1hY3JvIGxvb2tzIGF0IHRoZSBubmlUcGlkIG9ubHkuIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBkZXRlcm1pbmUKKyAqICB3aGV0aGVyIG9yIG5vdCBhbiBPTFQgRG9tYWluIGFscmVhZHkgZXhpc3RzIGZvciBhIGdpdmVuIFZMQU4gKHdoaWNoIHByZXZlbnRzCisgKiAgY29uZmlndXJpbmcgZHVwbGljYXRlL292ZXJsYXBwaW5nIE9MVCBkb21haW4gc2VsZWN0b3JzKS4KKyAqCisgKi8KKyNkZWZpbmUgVkxBTlNfTUFUQ0hfQUQoX3ZsYW4xXywgX3ZsYW4yXykgKCgoX3ZsYW4xXyktPmRvdDFhZFtWTEFOX1RBR19PVVRFUl0udmlkICAgICA9PSAoX3ZsYW4yXyktPmRvdDFhZFtWTEFOX1RBR19PVVRFUl0udmlkKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF92bGFuMV8pLT5kb3QxYWRbVkxBTl9UQUdfT1VURVJdLm5uaVRwaWQgPT0gKF92bGFuMl8pLT5kb3QxYWRbVkxBTl9UQUdfT1VURVJdLm5uaVRwaWQpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX3ZsYW4xXyktPmRvdDFhZFtWTEFOX1RBR19JTk5FUl0udmlkICAgICA9PSAoX3ZsYW4yXyktPmRvdDFhZFtWTEFOX1RBR19JTk5FUl0udmlkKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF92bGFuMV8pLT5kb3QxYWRbVkxBTl9UQUdfSU5ORVJdLm5uaVRwaWQgPT0gKF92bGFuMl8pLT5kb3QxYWRbVkxBTl9UQUdfSU5ORVJdLm5uaVRwaWQpKQorCisvKioKKyAqICBAYnJpZWYgQ29tcGFyZXMgdGhlIDgwMi4xYWggKG1hYy1pbi1tYWMpIGZpZWxkcyBvZiB0d28gVmxhblQgb2JqZWN0cworICoKKyAqICBUaGlzIG1hY3JvIHJldHVybnMgJzEnIGlmIGFsbCBmaWVsZHMgbWF0Y2gsIGFuZCAnMCcgb3RoZXJ3aXNlLgorICoKKyAqICBOb3RlLCB0aGlzIG1hY3JvIGxvb2tzIGF0IHRoZSBubmlUcGlkJ3Mgb25seS4gVGhpcyBtYWNybyBpcyB1c2VkIHRvCisgKiAgZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGFuIE9MVCBEb21haW4gYWxyZWFkeSBleGlzdHMgZm9yIGEgZ2l2ZW4gVkxBTgorICogICh3aGljaCBwcmV2ZW50cyBjb25maWd1cmluZyBkdXBsaWNhdGUvb3ZlcmxhcHBpbmcgT0xUIGRvbWFpbiBzZWxlY3RvcnMpLgorICoKKyAqLworI2RlZmluZSBWTEFOU19NQVRDSF9BSChfdmxhbjFfLCBfdmxhbjJfKSAoKChfdmxhbjFfKS0+ZG90MWFoLmJ0YWcubm5pVHBpZCA9PSAoX3ZsYW4yXyktPmRvdDFhaC5idGFnLm5uaVRwaWQpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX3ZsYW4xXyktPmRvdDFhaC5idGFnLnZpZCA9PSAoX3ZsYW4yXyktPmRvdDFhaC5idGFnLnZpZCkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfdmxhbjFfKS0+ZG90MWFoLml0YWcubm5pVHBpZCA9PSAoX3ZsYW4yXyktPmRvdDFhaC5pdGFnLm5uaVRwaWQpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX3ZsYW4xXyktPmRvdDFhaC5pdGFnLmlzaWQgPT0gKF92bGFuMl8pLT5kb3QxYWguaXRhZy5pc2lkKSkKKworLyoqCisgKiAgQGJyaWVmIENvbXBhcmVzIHRoZSBJQ1QgZmllbGRzIG9mIHR3byBWbGFuVCBvYmplY3RzCisgKgorICogIFRoaXMgbWFjcm8gcmV0dXJucyAnMScgaWYgYWxsIGZpZWxkcyBtYXRjaCwgYW5kICcwJyBvdGhlcndpc2UuCisgKgorICogIE5vdGUsIHRoaXMgbWFjcm8gbG9va3MgYXQgdGhlIElDVCBmaWVsZHMgb25seS4gVGhpcyBtYWNybyBpcworICogIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGFuIE9MVCBEb21haW4gYWxyZWFkeQorICogIGV4aXN0cyBmb3IgYSBnaXZlbiBWTEFOICh3aGljaCBwcmV2ZW50cyBjb25maWd1cmluZworICogIGR1cGxpY2F0ZS9vdmVybGFwcGluZyBPTFQgZG9tYWluIHNlbGVjdG9ycykuCisgKgorICovCisjZGVmaW5lIFZMQU5TX01BVENIX0lDVChfdmxhbjFfLCBfdmxhbjJfKSAoKChfdmxhbjFfKS0+aWN0LnRwaWQgPT0gKF92bGFuMl8pLT5pY3QudHBpZCkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX3ZsYW4xXyktPmljdC52aWQgPT0gKF92bGFuMl8pLT5pY3QudmlkKSkKKy8qKgorICogIEBicmllZiBDb21wYXJlcyB0aGUgODAyLjFhZCAob3IgcSkgYW5kIDgwMi4xYWggKG1hYy1pbi1tYWMpCisgKiAgICAgICAgIGZpZWxkcyBvZiB0d28gVmxhblQgb2JqZWN0cworICoKKyAqICBUaGlzIG1hY3JvIHJldHVybnMgJzEnIGlmIGFsbCBmaWVsZHMgbWF0Y2gsIGFuZCAnMCcgb3RoZXJ3aXNlLgorICoKKyAqLworI2RlZmluZSBWTEFOU19NQVRDSChfdmxhbjFfLCBfdmxhbjJfKSAoVkxBTlNfTUFUQ0hfQUQoX3ZsYW4xXywgX3ZsYW4yXykgJiYgVkxBTlNfTUFUQ0hfQUgoX3ZsYW4xXywgX3ZsYW4yXykpCisKKy8qKgorICogIEBicmllZiBNYWNyb3MgZm9yIHNldHRpbmcvY2xlYXJpbmcgYml0cyBpbnNpZGUgb2YgYW4gaW50ZWdlcgorICovCisjZGVmaW5lIFNFVF9CSVQoeCxuKSAgICAoKHgpIHw9ICgxTCA8PCAobikpKQorI2RlZmluZSBDTFJfQklUKHgsbikgICAgKCh4KSAmPSAofigxTCA8PCAobikpKSkKKyNkZWZpbmUgQklUX0lTX1NFVCh4LG4pICgoKHgpID4+IChuKSkgJiAxKQorCisKKworLyoqCisgKiAgU3RhdGljIGNvbXBpbGUgdGltZSBhc3NlcnQgdXNlZCB0byBlbnN1cmUgdGhhdCBlbnVtcyBhbmQgYXNzb2NpYXRlZAorICogIGNoYXJhY3RlciBhcnJheXMgYXJlIGVxdWFsLgorICoKKyAqICBVc2UgdGhlIEJBTF9TVEFUSUNfQVNTRVJUIGZ1bmN0aW9uIGluIHlvdXIgY29kZSB0byBjaGVjayBhcnJheSBzaXplcworICovCisjZGVmaW5lIF9CQUxfU1RBVElDX0FTU0VSVF9IRUxQRVIoZXhwciwgbXNnKSAoc2l6ZW9mIChzdHJ1Y3Qge3Vuc2lnbmVkIGludCBTVEFUSUNfQVNTRVJUX18jI21zZzogKGV4cHIpID8gMSA6IC0xO30gKSkKKworI2RlZmluZSBCQUxfU1RBVElDX0FTU0VSVChleHByLCBtc2cpIGV4dGVybiBpbnQgKCphc3NlcnRfZnVuY3Rpb25fXyMjbXNnKHZvaWQpKSBbX0JBTF9TVEFUSUNfQVNTRVJUX0hFTFBFUihleHByLCBtc2cpIF0KKworLypAfSovCisKKyNlbmRpZiAvKiAjaWZuZGVmIEJBTENPTU1PTl9IICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX2lkcy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDIzOWU2Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9pZHMuaApAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfaWRzLmgKKyAqIEBicmllZiBCQUwgSURzIHVzZWQgaW4gdGhlIHN5c3RlbQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgb2YgdGhlICBCQUwgSURzIHVzZWQgaW4gdGhlIHN5c3RlbQorICoKKyAqLworI2lmbmRlZglCQUxJRFNfSAorI2RlZmluZQlCQUxJRFNfSAorCisvKkB7Ki8KKworLypAfSovCisKKyNlbmRpZiAvKiAjaWZuZGVmIEJBTElEU19IICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX21vZGVsX2lkcy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9tb2RlbF9pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMThiNzRlCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9tb2RlbF9pZHMuaApAQCAtMCwwICsxLDcxNCBAQAorI2lmbmRlZiBCQUxfTU9ERUxfSURTX0hfCisjZGVmaW5lIEJBTF9NT0RFTF9JRFNfSF8KKworLyoqIFxpbmdyb3VwIG9iamVjdF9tb2RlbF9kYXRhX3R5cGVzCisgKiBcZGVmZ3JvdXAgb2JqZWN0X21vZGVsX2VudW1zIEJBTCBPYmplY3QgTW9kZWwgRW51bWVyYXRpb25zCisgKi8KKworLyoqIFxhZGR0b2dyb3VwIG9iamVjdF9tb2RlbF9lbnVtcworICogQHsKKyAqLworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWNjZXNzX3Rlcm1pbmFsX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19pZAoreworICAgIEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfQ0ZHX0lEX0FETUlOX1NUQVRFICAgPSAwLCAgICAvKio8IEFkbWluaXN0cmF0aXZlIHN0YXRlLiAqLworICAgIEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfQ0ZHX0lEX09QRVJfU1RBVFVTICAgPSAxLCAgICAvKio8IE9wZXJhdGlvbmFsIHN0YXR1cy4gKi8KKyAgICBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9JV0ZfTU9ERSAgICAgID0gMiwgICAgLyoqPCBJbnRlcndvcmtpbmcgZnVuY3Rpb24gbW9kZS4gKi8KKyAgICBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9fTlVNX09GICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFjY2Vzc190ZXJtaW5hbF9pbmQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWQKK3sKKyAgICBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURSAgID0gMCwgICAgLyoqPCBBZG1pbmlzdHJhdGl2ZSBzdGF0ZS4gKi8KKyAgICBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9PUEVSX1NUQVRVUyAgID0gMSwgICAgLyoqPCBPcGVyYXRpb25hbCBzdGF0dXMuICovCisgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfSVdGX01PREUgICAgICA9IDIsICAgIC8qKjwgSW50ZXJ3b3JraW5nIGZ1bmN0aW9uIG1vZGUuICovCisgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfX05VTV9PRiAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhY2Nlc3NfdGVybWluYWxfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X2lkCit7CisgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9LRVlfSURfQUNDRVNTX1RFUk1fSUQ9IDAsICAgIC8qKjwgYWNjZXNzX3Rlcm1faWQuICovCisgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9LRVlfSURfX05VTV9PRiAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBmbG93X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfZmxvd19jZmdfaWQKK3sKKyAgICBCQ01CQUxfRkxPV19DRkdfSURfQURNSU5fU1RBVEUgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBZG1pbmlzdHJhdGl2ZSBzdGF0ZS4gKi8KKyAgICBCQ01CQUxfRkxPV19DRkdfSURfT1BFUl9TVEFUVVMgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBPcGVyYXRpb25hbCBzdGF0dXMuICovCisgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FDQ0VTU19JTlRfSUQgICAgICAgICAgICA9IDIsICAgIC8qKjwgQWNjZXNzIEludGVyZmFjZSBJRC4gKi8KKyAgICBCQ01CQUxfRkxPV19DRkdfSURfTkVUV09SS19JTlRfSUQgICAgICAgICAgID0gMywgICAgLyoqPCBOZXR3b3JrIEludGVyZmFjZSBJRC4gKi8KKyAgICBCQ01CQUxfRkxPV19DRkdfSURfU1VCX1RFUk1fSUQgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBTdWJzY3JpYmVyIFRlcm1pbmFsIElELiAqLworICAgIEJDTUJBTF9GTE9XX0NGR19JRF9TVUJfVEVSTV9VTklfSURYICAgICAgICAgPSA1LCAgICAvKio8IFN1YnNjcmliZXIgVGVybWluYWwgdW5pIHBvcnQgaW5kZXguICovCisgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NWQ19QT1JUX0lEICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgU2VydmljZSBQb3J0IElELiAqLworICAgIEJDTUJBTF9GTE9XX0NGR19JRF9BR0dfUE9SVF9JRCAgICAgICAgICAgICAgPSA3LCAgICAvKio8IEFnZ3JlZ2F0ZSBwb3J0IElELiAqLworICAgIEJDTUJBTF9GTE9XX0NGR19JRF9SRVNPTFZFX01BQyAgICAgICAgICAgICAgPSA4LCAgICAvKio8IFJlc29sdmUgbWFjLiAqLworICAgIEJDTUJBTF9GTE9XX0NGR19JRF9DTEFTU0lGSUVSICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IENsYXNzaWZpZXIuICovCisgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FDVElPTiAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgQWN0aW9uLiAqLworICAgIEJDTUJBTF9GTE9XX0NGR19JRF9TTEEgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IFNMQS4gKi8KKyAgICBCQ01CQUxfRkxPV19DRkdfSURfQ09PS0lFICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBDb29raWUuICovCisgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1BSSU9SSVRZICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgUHJpb3JpdHkuICovCisgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0dST1VQX0lEICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgR3JvdXAgSUQuICovCisgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1FVRVVFICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgRWdyZXNzIHF1ZXVlLiAqLworICAgIEJDTUJBTF9GTE9XX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9mbG93X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGZsb3dfaW5kIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9mbG93X2luZF9pZAoreworICAgIEJDTUJBTF9GTE9XX0lORF9JRF9BRE1JTl9TVEFURSAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFkbWluaXN0cmF0aXZlIHN0YXRlLiAqLworICAgIEJDTUJBTF9GTE9XX0lORF9JRF9PUEVSX1NUQVRVUyAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE9wZXJhdGlvbmFsIHN0YXR1cy4gKi8KKyAgICBCQ01CQUxfRkxPV19JTkRfSURfQUNDRVNTX0lOVF9JRCAgICAgICAgICAgID0gMiwgICAgLyoqPCBBY2Nlc3MgaW50ZXJmYWNlIElELiAqLworICAgIEJDTUJBTF9GTE9XX0lORF9JRF9ORVRXT1JLX0lOVF9JRCAgICAgICAgICAgPSAzLCAgICAvKio8IE5ldHdvcmsgSW50ZXJmYWNlIElELiAqLworICAgIEJDTUJBTF9GTE9XX0lORF9JRF9TVUJfVEVSTV9JRCAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFN1YnNjcmliZXIgdGVybWluYWwgSUQuICovCisgICAgQkNNQkFMX0ZMT1dfSU5EX0lEX1NWQ19QT1JUX0lEICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgU2VydmljZSBwb3J0IElELiAqLworICAgIEJDTUJBTF9GTE9XX0lORF9JRF9BR0dfUE9SVF9JRCAgICAgICAgICAgICAgPSA2LCAgICAvKio8IEFnZ3JlZ2F0ZSBwb3J0IElELiAqLworICAgIEJDTUJBTF9GTE9XX0lORF9JRF9SRVNPTFZFX01BQyAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFJlc29sdmUgbWFjLiAqLworICAgIEJDTUJBTF9GTE9XX0lORF9JRF9CQVNFX1RDX0lEICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEJhc2UgVENPTlQgSUQuICovCisgICAgQkNNQkFMX0ZMT1dfSU5EX0lEX0NMQVNTSUZJRVIgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgQ2xhc3NpZmllci4gKi8KKyAgICBCQ01CQUxfRkxPV19JTkRfSURfQUNUSU9OICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBBY3Rpb24uICovCisgICAgQkNNQkFMX0ZMT1dfSU5EX0lEX1NMQSAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgU0xBLiAqLworICAgIEJDTUJBTF9GTE9XX0lORF9JRF9DT09LSUUgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IENvb2tpZS4gKi8KKyAgICBCQ01CQUxfRkxPV19JTkRfSURfUFJJT1JJVFkgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBQcmlvcml0eS4gKi8KKyAgICBCQ01CQUxfRkxPV19JTkRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfZmxvd19pbmRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBmbG93X2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfZmxvd19rZXlfaWQKK3sKKyAgICBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19JRCAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBGbG93IElELiAqLworICAgIEJDTUJBTF9GTE9XX0tFWV9JRF9GTE9XX1RZUEUgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZsb3cgdHlwZS4gKi8KKyAgICBCQ01CQUxfRkxPV19LRVlfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfZmxvd19rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBmbG93X3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX2Zsb3dfc3RhdF9pZAoreworICAgIEJDTUJBTF9GTE9XX1NUQVRfSURfUlhfUEFDS0VUUyAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlY2VpdmVkIHBhY2tldHMuICovCisgICAgQkNNQkFMX0ZMT1dfU1RBVF9JRF9SWF9CWVRFUyAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUmVjZWl2ZWQgYnl0ZXMuICovCisgICAgQkNNQkFMX0ZMT1dfU1RBVF9JRF9UWF9QQUNLRVRTICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgVHJhbnNtaXR0ZWQgcGFja2V0cy4gKi8KKyAgICBCQ01CQUxfRkxPV19TVEFUX0lEX1RYX0JZVEVTICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBUcmFuc21pdHRlZCBieXRlcy4gKi8KKyAgICBCQ01CQUxfRkxPV19TVEFUX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfZmxvd19zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3JvdXBfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9ncm91cF9jZmdfaWQKK3sKKyAgICBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlNfQ01EICAgICAgICAgICAgID0gMCwgICAgLyoqPCBNZW1iZXJzaGlwIG9wZXJhdGlvbiBjb21tYW5kcy4gKi8KKyAgICBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlMgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBNZW1iZXIuICovCisgICAgQkNNQkFMX0dST1VQX0NGR19JRF9DT09LSUUgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQXBwbGljYXRpb24gY29va2llLiAqLworICAgIEJDTUJBTF9HUk9VUF9DRkdfSURfRkxPV1MgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IExpc3Qgb2YgZmxvd3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBncm91cCAuICovCisgICAgQkNNQkFMX0dST1VQX0NGR19JRF9PV05FUiAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgT3duZXIgb2YgdGhlIGdyb3VwLiAqLworICAgIEJDTUJBTF9HUk9VUF9DRkdfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9ncm91cF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncm91cF9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX2dyb3VwX2tleV9pZAoreworICAgIEJDTUJBTF9HUk9VUF9LRVlfSURfR1JPVVBfSUQgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEdyb3VwIElELiAqLworICAgIEJDTUJBTF9HUk9VUF9LRVlfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9ncm91cF9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBpbnRlcmZhY2VfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkCit7CisgICAgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfQURNSU5fU1RBVEUgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBBZG1pbmlzdHJhdGl2ZSBzdGF0ZS4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9PUEVSX1NUQVRVUyAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9wZXJhdGlvbmFsIHN0YXR1cy4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9NSU5fREFUQV9BR0dfUE9SVF9JRD0gMiwgICAgICAgICAgICAvKio8IE1pbmltdW0gYWdncmVnYXRlIHBvcnQgSUQuICovCisgICAgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfTUlOX0RBVEFfU1ZDX1BPUlRfSUQ9IDMsICAgICAgICAgICAgLyoqPCBNaW5pbXVtIHNlcnZpY2UgcG9ydCBJRC4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFICAgID0gNCwgICAgICAgICAgICAvKio8IFRyYW5zY2VpdmVyIHR5cGUuICovCisgICAgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfRFNfTUlTU19NT0RFICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtIHVua25vd24gcGFja2V0IGFjdGlvbi4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9NVFUgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IE1UVS4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9GTE9XX0NPTlRST0wgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEZsb3cgY29udHJvbC4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9EU19UTSAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIuICovCisgICAgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfVVNfVE0gICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlci4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9TVUJfVEVSTV9JRF9MSVNUICAgID0gMTAsICAgICAgICAgICAvKio8IFN1Yi10ZXJtIGlkIGxpc3QuICovCisgICAgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfaW50ZXJmYWNlX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGludGVyZmFjZV9pbmQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX2ludGVyZmFjZV9pbmRfaWQKK3sKKyAgICBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9BRE1JTl9TVEFURSAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEFkbWluaXN0cmF0aXZlIHN0YXRlLiAqLworICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX09QRVJfU1RBVFVTICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgT3BlcmF0aW9uYWwgc3RhdHVzLiAqLworICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01JTl9EQVRBX0FHR19QT1JUX0lEPSAyLCAgICAgICAgICAgIC8qKjwgTWluaW11bSBhZ2dyZWdhdGUgcG9ydCBJRC4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9NSU5fREFUQV9TVkNfUE9SVF9JRD0gMywgICAgICAgICAgICAvKio8IE1pbmltdW0gc2VydmljZSBwb3J0IElELiAqLworICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX1RSQU5TQ0VJVkVSX1RZUEUgICAgPSA0LCAgICAgICAgICAgIC8qKjwgVHJhbnNjZWl2ZXIgdHlwZS4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19NSVNTX01PREUgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gdW5rbm93biBwYWNrZXQgYWN0aW9uLiAqLworICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01UVSAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgTVRVLiAqLworICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX0ZMT1dfQ09OVFJPTCAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgRmxvdyBjb250cm9sLiAqLworICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX0RTX1RNICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlci4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9VU19UTSAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFVwc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyLiAqLworICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX2ludGVyZmFjZV9pbmRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBpbnRlcmZhY2Vfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9pbnRlcmZhY2Vfa2V5X2lkCit7CisgICAgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfSU5URl9JRCAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBpbnRmX2lkLiAqLworICAgIEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX0lOVEZfVFlQRSAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgaW50Zl90eXBlLiAqLworICAgIEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX2ludGVyZmFjZV9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBpbnRlcmZhY2Vfc3RhdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfaWQKK3sKKyAgICBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfUlhfUEFDS0VUUyAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFJlY2lldmVkIHBhY2tldHMuICovCisgICAgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1JYX0JZVEVTICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBieXRlcy4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfVFhfUEFDS0VUUyAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFRyYW5zbWl0dGVkIHBhY2tldHMuICovCisgICAgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1RYX0JZVEVTICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBUcmFuc21pdHRlZCBieXRlcy4gKi8KKyAgICBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHBhY2tldF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3BhY2tldF9jZmdfaWQKK3sKKyAgICBCQ01CQUxfUEFDS0VUX0NGR19JRF9GTE9XX0lEICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEZsb3cgSWQuICovCisgICAgQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19UWVBFICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBGbG93IFR5cGUuICovCisgICAgQkNNQkFMX1BBQ0tFVF9DRkdfSURfSU5URl9JRCAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBJbnRlcmZhY2UgSUQuICovCisgICAgQkNNQkFMX1BBQ0tFVF9DRkdfSURfSU5URl9UWVBFICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBJbnRlcmZhY2UgVHlwZS4gKi8KKyAgICBCQ01CQUxfUEFDS0VUX0NGR19JRF9TVkNfUE9SVCAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFNlcnZpY2UgUG9ydC4gKi8KKyAgICBCQ01CQUxfUEFDS0VUX0NGR19JRF9GTE9XX0NPT0tJRSAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEZsb3cgQ29va2llLiAqLworICAgIEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX1BLVCAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgUGFja2V0IERhdGEuICovCisgICAgQkNNQkFMX1BBQ0tFVF9DRkdfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfcGFja2V0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHBhY2tldF9pbmQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3BhY2tldF9pbmRfaWQKK3sKKyAgICBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX0lEICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEZsb3cgSWQuICovCisgICAgQkNNQkFMX1BBQ0tFVF9JTkRfSURfRkxPV19UWVBFICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBGbG93IFR5cGUuICovCisgICAgQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9JRCAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBJbnRlcmZhY2UgSUQuICovCisgICAgQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9UWVBFICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBJbnRlcmZhY2UgVHlwZS4gKi8KKyAgICBCQ01CQUxfUEFDS0VUX0lORF9JRF9TVkNfUE9SVCAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFNlcnZpY2UgUG9ydC4gKi8KKyAgICBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX0NPT0tJRSAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEZsb3cgQ29va2llLiAqLworICAgIEJDTUJBTF9QQUNLRVRfSU5EX0lEX1BLVCAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgUGFja2V0IERhdGEuICovCisgICAgQkNNQkFMX1BBQ0tFVF9JTkRfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfcGFja2V0X2luZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHBhY2tldF9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3BhY2tldF9rZXlfaWQKK3sKKyAgICBCQ01CQUxfUEFDS0VUX0tFWV9JRF9SRVNFUlZFRCAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFJlc2VydmVkIGtleSBmaWVsZC4gKi8KKyAgICBCQ01CQUxfUEFDS0VUX0tFWV9JRF9QQUNLRVRfU0VORF9ERVNUICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFBhY2tldCBkZXN0aW5hdGlvbi4gKi8KKyAgICBCQ01CQUxfUEFDS0VUX0tFWV9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9wYWNrZXRfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfaWQKK3sKKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfQURNSU5fU1RBVEUgICAgICAgPSAwLCAgICAvKio8IEFkbWluaXN0cmF0aXZlIHN0YXRlLiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9PUEVSX1NUQVRVUyAgICAgICA9IDEsICAgIC8qKjwgT3BlcmF0aW9uYWwgc3RhdHVzLiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TRVJJQUxfTlVNQkVSICAgICA9IDIsICAgIC8qKjwgU2VyaWFsIG51bWJlci4gKi8KKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfUEFTU1dPUkQgICAgICAgICAgPSAzLCAgICAvKio8IFBhc3N3b3JkLiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9SRUdJU1RSQVRJT05fSUQgICA9IDQsICAgIC8qKjwgUmVnaXN0cmF0aW9uIGlkLiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TVkNfUE9SVF9JRCAgICAgICA9IDUsICAgIC8qKjwgU2VydmljZSBwb3J0IElELiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9NQUNfQUREUkVTUyAgICAgICA9IDYsICAgIC8qKjwgTUFDIGFkZHJlc3MuICovCisgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX0RTX1RNICAgICAgICAgICAgID0gNywgICAgLyoqPCBEb3duc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyLiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9VU19UTSAgICAgICAgICAgICA9IDgsICAgIC8qKjwgVXBzdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIuICovCisgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1NWQ19QT1JUX0lEX0xJU1QgID0gOSwgICAgLyoqPCBzdmNfcG9ydF9pZCBsaXN0LiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9BR0dfUE9SVF9JRF9MSVNUICA9IDEwLCAgIC8qKjwgYWdnX3BvcnRfaWQgbGlzdC4gKi8KKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHN1YnNjcmliZXJfdGVybWluYWxfaW5kIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkCit7CisgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX0FETUlOX1NUQVRFICAgICAgID0gMCwgICAgLyoqPCBBZG1pbmlzdHJhdGl2ZSBzdGF0ZS4gKi8KKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfT1BFUl9TVEFUVVMgICAgICAgPSAxLCAgICAvKio8IE9wZXJhdGlvbmFsIHN0YXR1cy4gKi8KKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfU0VSSUFMX05VTUJFUiAgICAgPSAyLCAgICAvKio8IFNlcmlhbCBudW1iZXIuICovCisgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1BBU1NXT1JEICAgICAgICAgID0gMywgICAgLyoqPCBQYXNzd29yZC4gKi8KKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfUkVHSVNUUkFUSU9OX0lEICAgPSA0LCAgICAvKio8IFJlZ2lzdHJhdGlvbiBpZC4gKi8KKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfU1ZDX1BPUlRfSUQgICAgICAgPSA1LCAgICAvKio8IFNlcnZpY2UgcG9ydCBJRC4gKi8KKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfTUFDX0FERFJFU1MgICAgICAgPSA2LCAgICAvKio8IE1BQyBhZGRyZXNzLiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9EU19UTSAgICAgICAgICAgICA9IDcsICAgIC8qKjwgRG93bnN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlci4gKi8KKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfVVNfVE0gICAgICAgICAgICAgPSA4LCAgICAvKio8IFVwc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyLiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfaWQKK3sKKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfU1VCX1RFUk1fSUQgICAgICAgPSAwLCAgICAvKio8IHN1Yl90ZXJtX2lkLiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0tFWV9JRF9JTlRGX0lEICAgICAgICAgICA9IDEsICAgIC8qKjwgaW50Zl9pZC4gKi8KKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHN1YnNjcmliZXJfdGVybWluYWxfc3RhdCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfaWQKK3sKKyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1JYX1BBQ0tFVFMgICAgICAgPSAwLCAgICAvKio8IFJlY2VpdmVkICBwYWNrZXRzLiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX1NUQVRfSURfUlhfQllURVMgICAgICAgICA9IDEsICAgIC8qKjwgUmVjZWl2ZWQgYnl0ZXMuICovCisgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9UWF9QQUNLRVRTICAgICAgID0gMiwgICAgLyoqPCBUcmFuc21pdHRlZCBwYWNrZXRzLiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX1NUQVRfSURfVFhfQllURVMgICAgICAgICA9IDMsICAgIC8qKjwgVHJhbnNtaXR0ZWQgYnl0ZXMuICovCisgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgdG1fcXVldWVfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWQKK3sKKyAgICBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1BSSU9SSVRZICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHByaW9yaXR5LiAqLworICAgIEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfV0VJR0hUICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgd2VpZ2h0LiAqLworICAgIEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcmF0ZS4gKi8KKyAgICBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX0JBQyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IGJhYy4gKi8KKyAgICBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX0NSRUFUSU9OX01PREUgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IGNyZWF0aW9uX21vZGUuICovCisgICAgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9SRUZfQ09VTlQgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCByZWZfY291bnQuICovCisgICAgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF90bV9xdWV1ZV9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB0bV9xdWV1ZV9pbmQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3RtX3F1ZXVlX2luZF9pZAoreworICAgIEJDTUJBTF9UTV9RVUVVRV9JTkRfSURfUkVUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcmV0LiAqLworICAgIEJDTUJBTF9UTV9RVUVVRV9JTkRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfdG1fcXVldWVfaW5kX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgdG1fcXVldWVfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF90bV9xdWV1ZV9rZXlfaWQKK3sKKyAgICBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX1NDSEVEX0lEICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHNjaGVkX2lkLiAqLworICAgIEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfRElSICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgc2NoZWQgZGlyLiAqLworICAgIEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgaWQuICovCisgICAgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF90bV9xdWV1ZV9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB0bV9xdWV1ZV9zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2lkCit7CisgICAgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfUEFDS0VUU19PSyAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBwYWNrZXRzX29rLiAqLworICAgIEJDTUJBTF9UTV9RVUVVRV9TVEFUX0lEX0JZVEVTX09LICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgYnl0ZXNfb2suICovCisgICAgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfUEFDS0VUU19ESVNDQVJERUQgICAgICAgICAgID0gMiwgICAgLyoqPCBwYWNrZXRzX2Rpc2NhcmRlZC4gKi8KKyAgICBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9CWVRFU19ESVNDQVJERUQgICAgICAgICAgICAgPSAzLCAgICAvKio8IGJ5dGVzX2Rpc2NhcmRlZC4gKi8KKyAgICBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX3RtX3F1ZXVlX3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB0bV9zY2hlZF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3RtX3NjaGVkX2NmZ19pZAoreworICAgIEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfT1dORVIgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgb3duZXIuICovCisgICAgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9UWVBFICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCB0eXBlLiAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU0NIRURfUEFSRU5UICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcGFyZW50LiAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU0NIRURfQ0hJTERfVFlQRSAgICAgICAgICAgICA9IDMsICAgIC8qKjwgY2hpbGRfdHlwZS4gKi8KKyAgICBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHJhdGUuICovCisgICAgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9UQ09OVF9TTEEgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCB0Y29udF9zbGEuICovCisgICAgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9DUkVBVElPTl9NT0RFICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBjcmVhdGlvbl9tb2RlLiAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgcXVldWVzLiAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU1VCX1NDSEVEUyAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgc3ViX3NjaGVkcy4gKi8KKyAgICBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX05VTV9QUklPUklUSUVTICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IG51bV9wcmlvcml0aWVzLiAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfdG1fc2NoZWRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgdG1fc2NoZWRfaW5kIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF90bV9zY2hlZF9pbmRfaWQKK3sKKyAgICBCQ01CQUxfVE1fU0NIRURfSU5EX0lEX1JFVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHJldC4gKi8KKyAgICBCQ01CQUxfVE1fU0NIRURfSU5EX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX3RtX3NjaGVkX2luZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRtX3NjaGVkX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfdG1fc2NoZWRfa2V5X2lkCit7CisgICAgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBkaXIuICovCisgICAgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBpZC4gKi8KKyAgICBCQ01CQUxfVE1fU0NIRURfS0VZX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX3RtX3NjaGVkX2tleV9pZDsKKworLyoqIEFsbCBvYmplY3QgdGFncyBmb3IgYWxsIG9iamVjdHMgaW4gdGhlIHN5c3RlbS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfb2JqX3RhZworeworICAgIEJDTUJBTF9PQkpfVEFHX19OVU1fT0YgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfb2JqX3RhZzsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgb2JqZWN0cyBpbiB0aGUgc3lzdGVtLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9vYmpfaWQKK3sKKyAgICBCQ01CQUxfT0JKX0lEX19CRUdJTiwKKyAgICBCQ01CQUxfT0JKX0lEX0FDQ0VTU19URVJNSU5BTCAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJBTCBBY2Nlc3MgVGVybWluYWwgKi8KKyAgICBCQ01CQUxfT0JKX0lEX0ZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEJBTCBGbG93ICovCisgICAgQkNNQkFMX09CSl9JRF9HUk9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBCQUwgR3JvdXAgKi8KKyAgICBCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEJBTCBJbnRlcmZhY2UgKi8KKyAgICBCQ01CQUxfT0JKX0lEX1BBQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHBhY2tldCAqLworICAgIEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTCAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgQkFMIFN1YnNjcmliZXIgVGVybWluYWwgKi8KKyAgICBCQ01CQUxfT0JKX0lEX1RNX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IHRtX3F1ZXVlICovCisgICAgQkNNQkFMX09CSl9JRF9UTV9TQ0hFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCB0bV9zY2hlZCAqLworICAgIEJDTUJBTF9PQkpfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX29ial9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcG9zc2libGUgZ3JvdXBzIHVuZGVyIGFsbCBvYmplY3RzIGluIHRoZSBzeXN0ZW0uIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX29ial9ncm91cF9pZAoreworICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfX0JFR0lOLAorICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfQUNDRVNTX1RFUk1JTkFMX0tFWSAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQkFMIEFjY2VzcyBUZXJtaW5hbCAtIGtleSAqLworICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfQUNDRVNTX1RFUk1JTkFMX0NGRyAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQkFMIEFjY2VzcyBUZXJtaW5hbCAtIGNmZyAqLworICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfQUNDRVNTX1RFUk1JTkFMX0lORCAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQkFMIEFjY2VzcyBUZXJtaW5hbCAtIEFjY2VzcyBUZXJtaW5hbCBJbmRpY2F0aW9uICovCisgICAgQkNNQkFMX09CSl9HUk9VUF9JRF9GTE9XX0tFWSAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBCQUwgRmxvdyAtIGtleSAqLworICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfRkxPV19DRkcgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgQkFMIEZsb3cgLSBjZmcgKi8KKyAgICBCQ01CQUxfT0JKX0dST1VQX0lEX0ZMT1dfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEJBTCBGbG93IC0gc3RhdCAqLworICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfRkxPV19JTkQgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgQkFMIEZsb3cgLSBGbG93IEluZGljYXRpb24gKi8KKyAgICBCQ01CQUxfT0JKX0dST1VQX0lEX0dST1VQX0tFWSAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IEJBTCBHcm91cCAtIGtleSAqLworICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfR1JPVVBfQ0ZHICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgQkFMIEdyb3VwIC0gY2ZnICovCisgICAgQkNNQkFMX09CSl9HUk9VUF9JRF9JTlRFUkZBQ0VfS0VZICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBCQUwgSW50ZXJmYWNlIC0ga2V5ICovCisgICAgQkNNQkFMX09CSl9HUk9VUF9JRF9JTlRFUkZBQ0VfQ0ZHICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBCQUwgSW50ZXJmYWNlIC0gY2ZnICovCisgICAgQkNNQkFMX09CSl9HUk9VUF9JRF9JTlRFUkZBQ0VfU1RBVCAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBCQUwgSW50ZXJmYWNlIC0gc3RhdCAqLworICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfSU5URVJGQUNFX0lORCAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgQkFMIEludGVyZmFjZSAtIEludGVyZmFjZSBJbmRpY2F0aW9uICovCisgICAgQkNNQkFMX09CSl9HUk9VUF9JRF9QQUNLRVRfS0VZICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBwYWNrZXQgLSBrZXkgKi8KKyAgICBCQ01CQUxfT0JKX0dST1VQX0lEX1BBQ0tFVF9DRkcgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IHBhY2tldCAtIGNmZyAqLworICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfUEFDS0VUX0lORCAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgcGFja2V0IC0gUGFja2V0IGluZGljYXRpb24gKi8KKyAgICBCQ01CQUxfT0JKX0dST1VQX0lEX1NVQlNDUklCRVJfVEVSTUlOQUxfS0VZICAgICAgICAgPSAxNiwgICAvKio8IEJBTCBTdWJzY3JpYmVyIFRlcm1pbmFsIC0ga2V5ICovCisgICAgQkNNQkFMX09CSl9HUk9VUF9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGRyAgICAgICAgID0gMTcsICAgLyoqPCBCQUwgU3Vic2NyaWJlciBUZXJtaW5hbCAtIGNmZyAqLworICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUICAgICAgICA9IDE4LCAgIC8qKjwgQkFMIFN1YnNjcmliZXIgVGVybWluYWwgLSBzdGF0ICovCisgICAgQkNNQkFMX09CSl9HUk9VUF9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORCAgICAgICAgID0gMTksICAgLyoqPCBCQUwgU3Vic2NyaWJlciBUZXJtaW5hbCAtIFN1YnNjcmliZXIgVGVybWluYWwgSW5kaWNhdGlvbiAqLworICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfVE1fUVVFVUVfS0VZICAgICAgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgdG1fcXVldWUgLSBrZXkgKi8KKyAgICBCQ01CQUxfT0JKX0dST1VQX0lEX1RNX1FVRVVFX0NGRyAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAvKio8IHRtX3F1ZXVlIC0gY2ZnICovCisgICAgQkNNQkFMX09CSl9HUk9VUF9JRF9UTV9RVUVVRV9TVEFUICAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCB0bV9xdWV1ZSAtIHN0YXQgKi8KKyAgICBCQ01CQUxfT0JKX0dST1VQX0lEX1RNX1FVRVVFX0lORCAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IHRtX3F1ZXVlIC0gVG0gUXVldWUgSW5kaWNhdGlvbiAqLworICAgIEJDTUJBTF9PQkpfR1JPVVBfSURfVE1fU0NIRURfS0VZICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgdG1fc2NoZWQgLSBrZXkgKi8KKyAgICBCQ01CQUxfT0JKX0dST1VQX0lEX1RNX1NDSEVEX0NGRyAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IHRtX3NjaGVkIC0gY2ZnICovCisgICAgQkNNQkFMX09CSl9HUk9VUF9JRF9UTV9TQ0hFRF9JTkQgICAgICAgICAgICAgICAgICAgID0gMjYsICAgLyoqPCB0bV9zY2hlZCAtIFRtIFNjaGVkIEluZGljYXRpb24gKi8KKyAgICBCQ01CQUxfT0JKX0dST1VQX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfb2JqX2dyb3VwX2lkOworCisvKiogTGlzdCBvZiBhbGwgYWNjZXNzX3Rlcm1pbmFsIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9hdXRvX2lkCit7CisgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0FVVE9fSURfSU5EICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFjY2VzcyBUZXJtaW5hbCBJbmRpY2F0aW9uLiAqLworICAgIEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgZmxvdyBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9mbG93X2F1dG9faWQKK3sKKyAgICBCQ01CQUxfRkxPV19BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01CQUxfRkxPV19BVVRPX0lEX0lORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEZsb3cgSW5kaWNhdGlvbi4gKi8KKyAgICBCQ01CQUxfRkxPV19BVVRPX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfZmxvd19hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgaW50ZXJmYWNlIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX2ludGVyZmFjZV9hdXRvX2lkCit7CisgICAgQkNNQkFMX0lOVEVSRkFDRV9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01CQUxfSU5URVJGQUNFX0FVVE9fSURfSU5EICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEludGVyZmFjZSBJbmRpY2F0aW9uLiAqLworICAgIEJDTUJBTF9JTlRFUkZBQ0VfQVVUT19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX2ludGVyZmFjZV9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgcGFja2V0IGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3BhY2tldF9hdXRvX2lkCit7CisgICAgQkNNQkFMX1BBQ0tFVF9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01CQUxfUEFDS0VUX0FVVE9fSURfSU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBhY2tldCBpbmRpY2F0aW9uLiAqLworICAgIEJDTUJBTF9QQUNLRVRfQVVUT19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfcGFja2V0X2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBzdWJzY3JpYmVyX3Rlcm1pbmFsIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfYXV0b19pZAoreworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0FVVE9fSURfSU5EICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3Vic2NyaWJlciBUZXJtaW5hbCBJbmRpY2F0aW9uLiAqLworICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIHRtX3F1ZXVlIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3RtX3F1ZXVlX2F1dG9faWQKK3sKKyAgICBCQ01CQUxfVE1fUVVFVUVfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNQkFMX1RNX1FVRVVFX0FVVE9fSURfSU5EICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBUbSBRdWV1ZSBJbmRpY2F0aW9uLiAqLworICAgIEJDTUJBTF9UTV9RVUVVRV9BVVRPX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfdG1fcXVldWVfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIHRtX3NjaGVkIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3RtX3NjaGVkX2F1dG9faWQKK3sKKyAgICBCQ01CQUxfVE1fU0NIRURfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNQkFMX1RNX1NDSEVEX0FVVE9fSURfSU5EICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBUbSBTY2hlZCBJbmRpY2F0aW9uLiAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9BVVRPX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfdG1fc2NoZWRfYXV0b19pZDsKKworI2RlZmluZSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfZmxvd19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX2Zsb3dfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF9mbG93X3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX2Zsb3dfaW5kX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX0lORF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF9ncm91cF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICBCQ01CQUxfR1JPVVBfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX2dyb3VwX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgIEJDTUJBTF9HUk9VUF9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9pbmRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3BhY2tldF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgIEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3BhY2tldF9rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgIEJDTUJBTF9QQUNLRVRfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3BhY2tldF9pbmRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgIEJDTUJBTF9QQUNLRVRfSU5EX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9pZF9hbGxfcHJvcGVydGllcyAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfdG1fcXVldWVfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgIEJDTUJBTF9UTV9RVUVVRV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3RtX3F1ZXVlX2luZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgIEJDTUJBTF9UTV9RVUVVRV9JTkRfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfdG1fc2NoZWRfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF90bV9zY2hlZF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX2luZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TQ0hFRF9JTkRfSURfX05VTV9PRgorCisvKiBUaGUgZm9sbG93aW5nIGFyZSByZXF1aXJlZCBmb3IgdGhlIEFQSSBJbml0L1NldC9ldGMgbWFjcm9zICovCisjZGVmaW5lIGJjbWJhbF9vYmpfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfT0JKX0lEX19CRUdJTgorI2RlZmluZSBiY21iYWxfb2JqX2lkX2FjY2Vzc190ZXJtaW5hbCAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX09CSl9JRF9BQ0NFU1NfVEVSTUlOQUwKKyNkZWZpbmUgYmNtYmFsX29ial9pZF9mbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9PQkpfSURfRkxPVworI2RlZmluZSBiY21iYWxfb2JqX2lkX2dyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX09CSl9JRF9HUk9VUAorI2RlZmluZSBiY21iYWxfb2JqX2lkX2ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX09CSl9JRF9JTlRFUkZBQ0UKKyNkZWZpbmUgYmNtYmFsX29ial9pZF9wYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9PQkpfSURfUEFDS0VUCisjZGVmaW5lIGJjbWJhbF9vYmpfaWRfc3Vic2NyaWJlcl90ZXJtaW5hbCAgICAgICAgICAgICAgICAgICBCQ01CQUxfT0JKX0lEX1NVQlNDUklCRVJfVEVSTUlOQUwKKyNkZWZpbmUgYmNtYmFsX29ial9pZF90bV9xdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9PQkpfSURfVE1fUVVFVUUKKyNkZWZpbmUgYmNtYmFsX29ial9pZF90bV9zY2hlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9PQkpfSURfVE1fU0NIRUQKKyNkZWZpbmUgYmNtYmFsX29ial9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9PQkpfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2F1dG9faWRfaW5kICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9BVVRPX0lEX0lORAorI2RlZmluZSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX2Zsb3dfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbWJhbF9mbG93X2F1dG9faWRfaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19BVVRPX0lEX0lORAorI2RlZmluZSBiY21iYWxfZmxvd19hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF9pbnRlcmZhY2VfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICBCQ01CQUxfSU5URVJGQUNFX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbWJhbF9pbnRlcmZhY2VfYXV0b19pZF9pbmQgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfSU5URVJGQUNFX0FVVE9fSURfSU5ECisjZGVmaW5lIGJjbWJhbF9pbnRlcmZhY2VfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICBCQ01CQUxfSU5URVJGQUNFX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfcGFja2V0X2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1BBQ0tFVF9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21iYWxfcGFja2V0X2F1dG9faWRfaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1BBQ0tFVF9BVVRPX0lEX0lORAorI2RlZmluZSBiY21iYWxfcGFja2V0X2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1BBQ0tFVF9BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfYXV0b19pZF9fYmVnaW4gICAgICAgICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2F1dG9faWRfaW5kICAgICAgICAgICAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9BVVRPX0lEX0lORAorI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9hdXRvX2lkX19udW1fb2YgICAgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF90bV9xdWV1ZV9hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fUVVFVUVfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtYmFsX3RtX3F1ZXVlX2F1dG9faWRfaW5kICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9RVUVVRV9BVVRPX0lEX0lORAorI2RlZmluZSBiY21iYWxfdG1fcXVldWVfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1FVRVVFX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfdG1fc2NoZWRfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1NDSEVEX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbWJhbF90bV9zY2hlZF9hdXRvX2lkX2luZCAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fU0NIRURfQVVUT19JRF9JTkQKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TQ0hFRF9BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfaWRfYWNjZXNzX3Rlcm1faWQgICAgICAgIEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfS0VZX0lEX0FDQ0VTU19URVJNX0lECisjZGVmaW5lIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2lkX2FkbWluX3N0YXRlICAgICAgICAgICBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURQorI2RlZmluZSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19pZF9vcGVyX3N0YXR1cyAgICAgICAgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9DRkdfSURfT1BFUl9TVEFUVVMKKyNkZWZpbmUgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfaWRfaXdmX21vZGUgICAgICAgICAgICAgIEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfQ0ZHX0lEX0lXRl9NT0RFCisjZGVmaW5lIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2lkX2FkbWluX3N0YXRlICAgICAgICAgICBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURQorI2RlZmluZSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9pZF9vcGVyX3N0YXR1cyAgICAgICAgICAgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfT1BFUl9TVEFUVVMKKyNkZWZpbmUgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWRfaXdmX21vZGUgICAgICAgICAgICAgIEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfSU5EX0lEX0lXRl9NT0RFCisjZGVmaW5lIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2lkX19udW1fb2YgICAgICAgICAgICAgICBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF9mbG93X2tleV9pZF9mbG93X2lkICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19JRAorI2RlZmluZSBiY21iYWxfZmxvd19rZXlfaWRfZmxvd190eXBlICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfS0VZX0lEX0ZMT1dfVFlQRQorI2RlZmluZSBiY21iYWxfZmxvd19rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX2Zsb3dfY2ZnX2lkX2FkbWluX3N0YXRlICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX0NGR19JRF9BRE1JTl9TVEFURQorI2RlZmluZSBiY21iYWxfZmxvd19jZmdfaWRfb3Blcl9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX09QRVJfU1RBVFVTCisjZGVmaW5lIGJjbWJhbF9mbG93X2NmZ19pZF9hY2Nlc3NfaW50X2lkICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19DRkdfSURfQUNDRVNTX0lOVF9JRAorI2RlZmluZSBiY21iYWxfZmxvd19jZmdfaWRfbmV0d29ya19pbnRfaWQgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX05FVFdPUktfSU5UX0lECisjZGVmaW5lIGJjbWJhbF9mbG93X2NmZ19pZF9zdWJfdGVybV9pZCAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19DRkdfSURfU1VCX1RFUk1fSUQKKyNkZWZpbmUgYmNtYmFsX2Zsb3dfY2ZnX2lkX3N1Yl90ZXJtX3VuaV9pZHggICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX0NGR19JRF9TVUJfVEVSTV9VTklfSURYCisjZGVmaW5lIGJjbWJhbF9mbG93X2NmZ19pZF9zdmNfcG9ydF9pZCAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19DRkdfSURfU1ZDX1BPUlRfSUQKKyNkZWZpbmUgYmNtYmFsX2Zsb3dfY2ZnX2lkX2FnZ19wb3J0X2lkICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX0NGR19JRF9BR0dfUE9SVF9JRAorI2RlZmluZSBiY21iYWxfZmxvd19jZmdfaWRfcmVzb2x2ZV9tYWMgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1JFU09MVkVfTUFDCisjZGVmaW5lIGJjbWJhbF9mbG93X2NmZ19pZF9jbGFzc2lmaWVyICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19DRkdfSURfQ0xBU1NJRklFUgorI2RlZmluZSBiY21iYWxfZmxvd19jZmdfaWRfYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FDVElPTgorI2RlZmluZSBiY21iYWxfZmxvd19jZmdfaWRfc2xhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NMQQorI2RlZmluZSBiY21iYWxfZmxvd19jZmdfaWRfY29va2llICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0NPT0tJRQorI2RlZmluZSBiY21iYWxfZmxvd19jZmdfaWRfcHJpb3JpdHkgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1BSSU9SSVRZCisjZGVmaW5lIGJjbWJhbF9mbG93X2NmZ19pZF9ncm91cF9pZCAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19DRkdfSURfR1JPVVBfSUQKKyNkZWZpbmUgYmNtYmFsX2Zsb3dfY2ZnX2lkX3F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX0NGR19JRF9RVUVVRQorI2RlZmluZSBiY21iYWxfZmxvd19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX2Zsb3dfc3RhdF9pZF9yeF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX1NUQVRfSURfUlhfUEFDS0VUUworI2RlZmluZSBiY21iYWxfZmxvd19zdGF0X2lkX3J4X2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfU1RBVF9JRF9SWF9CWVRFUworI2RlZmluZSBiY21iYWxfZmxvd19zdGF0X2lkX3R4X3BhY2tldHMgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfU1RBVF9JRF9UWF9QQUNLRVRTCisjZGVmaW5lIGJjbWJhbF9mbG93X3N0YXRfaWRfdHhfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19TVEFUX0lEX1RYX0JZVEVTCisjZGVmaW5lIGJjbWJhbF9mbG93X3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX2Zsb3dfaW5kX2lkX2FkbWluX3N0YXRlICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX0lORF9JRF9BRE1JTl9TVEFURQorI2RlZmluZSBiY21iYWxfZmxvd19pbmRfaWRfb3Blcl9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfSU5EX0lEX09QRVJfU1RBVFVTCisjZGVmaW5lIGJjbWJhbF9mbG93X2luZF9pZF9hY2Nlc3NfaW50X2lkICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19JTkRfSURfQUNDRVNTX0lOVF9JRAorI2RlZmluZSBiY21iYWxfZmxvd19pbmRfaWRfbmV0d29ya19pbnRfaWQgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfSU5EX0lEX05FVFdPUktfSU5UX0lECisjZGVmaW5lIGJjbWJhbF9mbG93X2luZF9pZF9zdWJfdGVybV9pZCAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19JTkRfSURfU1VCX1RFUk1fSUQKKyNkZWZpbmUgYmNtYmFsX2Zsb3dfaW5kX2lkX3N2Y19wb3J0X2lkICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX0lORF9JRF9TVkNfUE9SVF9JRAorI2RlZmluZSBiY21iYWxfZmxvd19pbmRfaWRfYWdnX3BvcnRfaWQgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfSU5EX0lEX0FHR19QT1JUX0lECisjZGVmaW5lIGJjbWJhbF9mbG93X2luZF9pZF9yZXNvbHZlX21hYyAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19JTkRfSURfUkVTT0xWRV9NQUMKKyNkZWZpbmUgYmNtYmFsX2Zsb3dfaW5kX2lkX2Jhc2VfdGNfaWQgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX0lORF9JRF9CQVNFX1RDX0lECisjZGVmaW5lIGJjbWJhbF9mbG93X2luZF9pZF9jbGFzc2lmaWVyICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19JTkRfSURfQ0xBU1NJRklFUgorI2RlZmluZSBiY21iYWxfZmxvd19pbmRfaWRfYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfSU5EX0lEX0FDVElPTgorI2RlZmluZSBiY21iYWxfZmxvd19pbmRfaWRfc2xhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfSU5EX0lEX1NMQQorI2RlZmluZSBiY21iYWxfZmxvd19pbmRfaWRfY29va2llICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfSU5EX0lEX0NPT0tJRQorI2RlZmluZSBiY21iYWxfZmxvd19pbmRfaWRfcHJpb3JpdHkgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfSU5EX0lEX1BSSU9SSVRZCisjZGVmaW5lIGJjbWJhbF9mbG93X2luZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19JTkRfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfZ3JvdXBfa2V5X2lkX2dyb3VwX2lkICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0dST1VQX0tFWV9JRF9HUk9VUF9JRAorI2RlZmluZSBiY21iYWxfZ3JvdXBfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0dST1VQX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF9ncm91cF9jZmdfaWRfbWVtYmVyc19jbWQgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlNfQ01ECisjZGVmaW5lIGJjbWJhbF9ncm91cF9jZmdfaWRfbWVtYmVycyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlMKKyNkZWZpbmUgYmNtYmFsX2dyb3VwX2NmZ19pZF9jb29raWUgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9HUk9VUF9DRkdfSURfQ09PS0lFCisjZGVmaW5lIGJjbWJhbF9ncm91cF9jZmdfaWRfZmxvd3MgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfR1JPVVBfQ0ZHX0lEX0ZMT1dTCisjZGVmaW5lIGJjbWJhbF9ncm91cF9jZmdfaWRfb3duZXIgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfR1JPVVBfQ0ZHX0lEX09XTkVSCisjZGVmaW5lIGJjbWJhbF9ncm91cF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfR1JPVVBfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9rZXlfaWRfaW50Zl9pZCAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX0lOVEZfSUQKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9rZXlfaWRfaW50Zl90eXBlICAgICAgICAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX0lOVEZfVFlQRQorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX2NmZ19pZF9hZG1pbl9zdGF0ZSAgICAgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfQURNSU5fU1RBVEUKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9jZmdfaWRfb3Blcl9zdGF0dXMgICAgICAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX09QRVJfU1RBVFVTCisjZGVmaW5lIGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkX21pbl9kYXRhX2FnZ19wb3J0X2lkICAgICAgICBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9NSU5fREFUQV9BR0dfUE9SVF9JRAorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX2NmZ19pZF9taW5fZGF0YV9zdmNfcG9ydF9pZCAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfTUlOX0RBVEFfU1ZDX1BPUlRfSUQKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9jZmdfaWRfdHJhbnNjZWl2ZXJfdHlwZSAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9jZmdfaWRfZHNfbWlzc19tb2RlICAgICAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0RTX01JU1NfTU9ERQorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX2NmZ19pZF9tdHUgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfTVRVCisjZGVmaW5lIGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkX2Zsb3dfY29udHJvbCAgICAgICAgICAgICAgICBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9GTE9XX0NPTlRST0wKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9jZmdfaWRfZHNfdG0gICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0RTX1RNCisjZGVmaW5lIGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkX3VzX3RtICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9VU19UTQorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX2NmZ19pZF9zdWJfdGVybV9pZF9saXN0ICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfU1VCX1RFUk1fSURfTElTVAorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfaWRfcnhfcGFja2V0cyAgICAgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1JYX1BBQ0tFVFMKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2lkX3J4X2J5dGVzICAgICAgICAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9SWF9CWVRFUworI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfaWRfdHhfcGFja2V0cyAgICAgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1RYX1BBQ0tFVFMKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2lkX3R4X2J5dGVzICAgICAgICAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9UWF9CWVRFUworI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9pbmRfaWRfYWRtaW5fc3RhdGUgICAgICAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX0FETUlOX1NUQVRFCisjZGVmaW5lIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2lkX29wZXJfc3RhdHVzICAgICAgICAgICAgICAgICBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9PUEVSX1NUQVRVUworI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX2luZF9pZF9taW5fZGF0YV9hZ2dfcG9ydF9pZCAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfTUlOX0RBVEFfQUdHX1BPUlRfSUQKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9pbmRfaWRfbWluX2RhdGFfc3ZjX3BvcnRfaWQgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01JTl9EQVRBX1NWQ19QT1JUX0lECisjZGVmaW5lIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2lkX3RyYW5zY2VpdmVyX3R5cGUgICAgICAgICAgICBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9UUkFOU0NFSVZFUl9UWVBFCisjZGVmaW5lIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2lkX2RzX21pc3NfbW9kZSAgICAgICAgICAgICAgICBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19NSVNTX01PREUKKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9pbmRfaWRfbXR1ICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01UVQorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX2luZF9pZF9mbG93X2NvbnRyb2wgICAgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfRkxPV19DT05UUk9MCisjZGVmaW5lIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2lkX2RzX3RtICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19UTQorI2RlZmluZSBiY21iYWxfaW50ZXJmYWNlX2luZF9pZF91c190bSAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfVVNfVE0KKyNkZWZpbmUgYmNtYmFsX2ludGVyZmFjZV9pbmRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3BhY2tldF9rZXlfaWRfcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9QQUNLRVRfS0VZX0lEX1JFU0VSVkVECisjZGVmaW5lIGJjbWJhbF9wYWNrZXRfa2V5X2lkX3BhY2tldF9zZW5kX2Rlc3QgICAgICAgICAgICAgICBCQ01CQUxfUEFDS0VUX0tFWV9JRF9QQUNLRVRfU0VORF9ERVNUCisjZGVmaW5lIGJjbWJhbF9wYWNrZXRfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfUEFDS0VUX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF9wYWNrZXRfY2ZnX2lkX2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfUEFDS0VUX0NGR19JRF9GTE9XX0lECisjZGVmaW5lIGJjbWJhbF9wYWNrZXRfY2ZnX2lkX2Zsb3dfdHlwZSAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfUEFDS0VUX0NGR19JRF9GTE9XX1RZUEUKKyNkZWZpbmUgYmNtYmFsX3BhY2tldF9jZmdfaWRfaW50Zl9pZCAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0lOVEZfSUQKKyNkZWZpbmUgYmNtYmFsX3BhY2tldF9jZmdfaWRfaW50Zl90eXBlICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0lOVEZfVFlQRQorI2RlZmluZSBiY21iYWxfcGFja2V0X2NmZ19pZF9zdmNfcG9ydCAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1BBQ0tFVF9DRkdfSURfU1ZDX1BPUlQKKyNkZWZpbmUgYmNtYmFsX3BhY2tldF9jZmdfaWRfZmxvd19jb29raWUgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0ZMT1dfQ09PS0lFCisjZGVmaW5lIGJjbWJhbF9wYWNrZXRfY2ZnX2lkX3BrdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfUEFDS0VUX0NGR19JRF9QS1QKKyNkZWZpbmUgYmNtYmFsX3BhY2tldF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3BhY2tldF9pbmRfaWRfZmxvd19pZCAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9QQUNLRVRfSU5EX0lEX0ZMT1dfSUQKKyNkZWZpbmUgYmNtYmFsX3BhY2tldF9pbmRfaWRfZmxvd190eXBlICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9QQUNLRVRfSU5EX0lEX0ZMT1dfVFlQRQorI2RlZmluZSBiY21iYWxfcGFja2V0X2luZF9pZF9pbnRmX2lkICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9JRAorI2RlZmluZSBiY21iYWxfcGFja2V0X2luZF9pZF9pbnRmX3R5cGUgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9UWVBFCisjZGVmaW5lIGJjbWJhbF9wYWNrZXRfaW5kX2lkX3N2Y19wb3J0ICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfUEFDS0VUX0lORF9JRF9TVkNfUE9SVAorI2RlZmluZSBiY21iYWxfcGFja2V0X2luZF9pZF9mbG93X2Nvb2tpZSAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1BBQ0tFVF9JTkRfSURfRkxPV19DT09LSUUKKyNkZWZpbmUgYmNtYmFsX3BhY2tldF9pbmRfaWRfcGt0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9QQUNLRVRfSU5EX0lEX1BLVAorI2RlZmluZSBiY21iYWxfcGFja2V0X2luZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1BBQ0tFVF9JTkRfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfaWRfc3ViX3Rlcm1faWQgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfS0VZX0lEX1NVQl9URVJNX0lECisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9pZF9pbnRmX2lkICAgICAgICAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfSU5URl9JRAorI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfaWRfX251bV9vZiAgICAgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2lkX2FkbWluX3N0YXRlICAgICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURQorI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfaWRfb3Blcl9zdGF0dXMgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX09QRVJfU1RBVFVTCisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZF9zZXJpYWxfbnVtYmVyICAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfU0VSSUFMX05VTUJFUgorI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfaWRfcGFzc3dvcmQgICAgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1BBU1NXT1JECisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZF9yZWdpc3RyYXRpb25faWQgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfUkVHSVNUUkFUSU9OX0lECisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZF9zdmNfcG9ydF9pZCAgICAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfU1ZDX1BPUlRfSUQKKyNkZWZpbmUgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2lkX21hY19hZGRyZXNzICAgICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfaWRfZHNfdG0gICAgICAgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX0RTX1RNCisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZF91c190bSAgICAgICAgICAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfVVNfVE0KKyNkZWZpbmUgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2lkX3N2Y19wb3J0X2lkX2xpc3QgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TVkNfUE9SVF9JRF9MSVNUCisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZF9hZ2dfcG9ydF9pZF9saXN0ICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfQUdHX1BPUlRfSURfTElTVAorI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9pZF9yeF9wYWNrZXRzICAgICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX1NUQVRfSURfUlhfUEFDS0VUUworI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2lkX3J4X2J5dGVzICAgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9SWF9CWVRFUworI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2lkX3R4X3BhY2tldHMgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9UWF9QQUNLRVRTCisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfaWRfdHhfYnl0ZXMgICAgICAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1RYX0JZVEVTCisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfaWRfX251bV9vZiAgICAgICAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkX2FkbWluX3N0YXRlICAgICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURQorI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfaWRfb3Blcl9zdGF0dXMgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX09QRVJfU1RBVFVTCisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9pZF9zZXJpYWxfbnVtYmVyICAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfU0VSSUFMX05VTUJFUgorI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfaWRfcGFzc3dvcmQgICAgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1BBU1NXT1JECisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9pZF9yZWdpc3RyYXRpb25faWQgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfUkVHSVNUUkFUSU9OX0lECisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9pZF9zdmNfcG9ydF9pZCAgICAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfU1ZDX1BPUlRfSUQKKyNkZWZpbmUgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkX21hY19hZGRyZXNzICAgICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfaWRfZHNfdG0gICAgICAgICAgICAgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX0RTX1RNCisjZGVmaW5lIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9pZF91c190bSAgICAgICAgICAgICBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfVVNfVE0KKyNkZWZpbmUgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkX19udW1fb2YgICAgICAgICAgIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF90bV9xdWV1ZV9rZXlfaWRfc2NoZWRfaWQgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX1NDSEVEX0lECisjZGVmaW5lIGJjbWJhbF90bV9xdWV1ZV9rZXlfaWRfc2NoZWRfZGlyICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX1NDSEVEX0RJUgorI2RlZmluZSBiY21iYWxfdG1fcXVldWVfa2V5X2lkX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9JRAorI2RlZmluZSBiY21iYWxfdG1fcXVldWVfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWRfcHJpb3JpdHkgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1BSSU9SSVRZCisjZGVmaW5lIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWRfd2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1dFSUdIVAorI2RlZmluZSBiY21iYWxfdG1fcXVldWVfY2ZnX2lkX3JhdGUgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9SQVRFCisjZGVmaW5lIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWRfYmFjICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX0JBQworI2RlZmluZSBiY21iYWxfdG1fcXVldWVfY2ZnX2lkX2NyZWF0aW9uX21vZGUgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9DUkVBVElPTl9NT0RFCisjZGVmaW5lIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWRfcmVmX2NvdW50ICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1JFRl9DT1VOVAorI2RlZmluZSBiY21iYWxfdG1fcXVldWVfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2lkX3BhY2tldHNfb2sgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9QQUNLRVRTX09LCisjZGVmaW5lIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2lkX2J5dGVzX29rICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9CWVRFU19PSworI2RlZmluZSBiY21iYWxfdG1fcXVldWVfc3RhdF9pZF9wYWNrZXRzX2Rpc2NhcmRlZCAgICAgICAgICAgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfUEFDS0VUU19ESVNDQVJERUQKKyNkZWZpbmUgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfaWRfYnl0ZXNfZGlzY2FyZGVkICAgICAgICAgICAgIEJDTUJBTF9UTV9RVUVVRV9TVEFUX0lEX0JZVEVTX0RJU0NBUkRFRAorI2RlZmluZSBiY21iYWxfdG1fcXVldWVfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfdG1fcXVldWVfaW5kX2lkX3JldCAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1FVRVVFX0lORF9JRF9SRVQKKyNkZWZpbmUgYmNtYmFsX3RtX3F1ZXVlX2luZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9RVUVVRV9JTkRfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfdG1fc2NoZWRfa2V5X2lkX2RpciAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9ESVIKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX2tleV9pZF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TQ0hFRF9LRVlfSURfSUQKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TQ0hFRF9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfdG1fc2NoZWRfY2ZnX2lkX293bmVyICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9PV05FUgorI2RlZmluZSBiY21iYWxfdG1fc2NoZWRfY2ZnX2lkX3NjaGVkX3R5cGUgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9UWVBFCisjZGVmaW5lIGJjbWJhbF90bV9zY2hlZF9jZmdfaWRfc2NoZWRfcGFyZW50ICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX1BBUkVOVAorI2RlZmluZSBiY21iYWxfdG1fc2NoZWRfY2ZnX2lkX3NjaGVkX2NoaWxkX3R5cGUgICAgICAgICAgICAgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9DSElMRF9UWVBFCisjZGVmaW5lIGJjbWJhbF90bV9zY2hlZF9jZmdfaWRfcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1JBVEUKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX2NmZ19pZF90Y29udF9zbGEgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfVENPTlRfU0xBCisjZGVmaW5lIGJjbWJhbF90bV9zY2hlZF9jZmdfaWRfY3JlYXRpb25fbW9kZSAgICAgICAgICAgICAgICBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX0NSRUFUSU9OX01PREUKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX2NmZ19pZF9xdWV1ZXMgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfUVVFVUVTCisjZGVmaW5lIGJjbWJhbF90bV9zY2hlZF9jZmdfaWRfc3ViX3NjaGVkcyAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NVQl9TQ0hFRFMKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX2NmZ19pZF9udW1fcHJpb3JpdGllcyAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfTlVNX1BSSU9SSVRJRVMKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21iYWxfdG1fc2NoZWRfaW5kX2lkX3JldCAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1NDSEVEX0lORF9JRF9SRVQKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX2luZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TQ0hFRF9JTkRfSURfX05VTV9PRgorCisvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCB0eXBlIGhhcyB0aGUgZ2l2ZW4gdGFnLiAKKyAqCisgKiBccmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgdGhlIGdpdmVuIHRhZywgZmFsc2Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9vYmpfaGFzX3RhZyhiY21iYWxfb2JqX2lkIG9iaiwgYmNtYmFsX29ial90YWcgdGFnKTsKKworI2RlZmluZSBCQ01CQUxfT0JKX0lEX0FOWSAgICgoYmNtYmFsX29ial9pZCkgVUlOVDE2X01BWCkKKworLyoqIEB9ICovCisjZW5kaWYgLyogQkFMX01PREVMX0lEU19IXyAqLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9tb2RlbF90eXBlcy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9tb2RlbF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjgzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX21vZGVsX3R5cGVzLmgKQEAgLTAsMCArMSwxMTU0IEBACisjaWZuZGVmIEJBTF9NT0RFTF9UWVBFUworI2RlZmluZSBCQUxfTU9ERUxfVFlQRVMKKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgImJhbF9vYmouaCIKKworLyoqIFxkZWZncm91cCBvYmplY3RfbW9kZWxfZGF0YV90eXBlcyBCQUwgT2JqZWN0IE1vZGVsIERhdGEgVHlwZXMKKyAqIEB7CisgKi8KK3R5cGVkZWYgdWludDMyX3QgYmNtYmFsX2FjY2Vzc19pZDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21iYWxfYWNjZXNzX2lkOiB0eXBlZCBhbGlhcyBmb3IgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KK3R5cGVkZWYgdWludDE2X3QgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQ7ICAgICAgICAgICAgLyoqPCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCit0eXBlZGVmIHVpbnQ2NF90IGJjbWJhbF9jb29raWU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtYmFsX2Nvb2tpZTogdHlwZWQgYWxpYXMgZm9yIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIuICovCit0eXBlZGVmIHVpbnQzMl90IGJjbWJhbF9pbnRmX2lkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtYmFsX2ludGZfaWQ6IHR5cGVkIGFsaWFzIGZvciBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordHlwZWRlZiB1aW50MzJfdCBiY21iYWxfc3ViX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbWJhbF9zdWJfaWQ6IHR5cGVkIGFsaWFzIGZvciBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01CQUxfU1VCX0lEX1VOS05PV04gICAoKGJjbWJhbF9zdWJfaWQpIDY1NTM1VUwpCit0eXBlZGVmIHVpbnQzMl90IGJjbWJhbF9mbG93X2lkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtYmFsX2Zsb3dfaWQ6IHR5cGVkIGFsaWFzIGZvciBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordHlwZWRlZiB1aW50MzJfdCBiY21iYWxfZ3JvdXBfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbWJhbF9ncm91cF9pZDogdHlwZWQgYWxpYXMgZm9yIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuICovCit0eXBlZGVmIHVpbnQxNl90IGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQ7ICAgICAgICAgICAgICAgIC8qKjwgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCit0eXBlZGVmIHVpbnQzMl90IGJjbWJhbF90bV9zY2hlZF9pZDsgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtYmFsX3RtX3NjaGVkX2lkOiB0eXBlZCBhbGlhcyBmb3IgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNQkFMX1RNX1NDSEVEX0lEX1VOS05PV04gICgoYmNtYmFsX3RtX3NjaGVkX2lkKSA2NTUzNVVMKQordHlwZWRlZiB1aW50OF90IGJjbWJhbF90bV9xdWV1ZV9pZDsgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbWJhbF90bV9xdWV1ZV9pZDogdHlwZWQgYWxpYXMgZm9yIGEgOC1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KK3R5cGVkZWYgdWludDhfdCBiY21iYWxfcGVyY2VudDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21iYWxfcGVyY2VudDogdHlwZWQgYWxpYXMgZm9yIGEgOC1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KK3R5cGVkZWYgdWludDhfdCBiY21iYWxfdG1fcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21iYWxfdG1fcHJpb3JpdHk6IHR5cGVkIGFsaWFzIGZvciBhIDgtYml0IHVuc2lnbmVkIGludGVnZXIuICovCit0eXBlZGVmIHVpbnQxNl90IGJjbWJhbF90bV9zY2hlZF9pZF9pbmRleDsgICAgICAgICAgICAgIC8qKjwgYmNtYmFsX3RtX3NjaGVkX2lkX2luZGV4OiB0eXBlZCBhbGlhcyBmb3IgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KK3R5cGVkZWYgdWludDhfdCBiY21iYWxfdG1fd2VpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21iYWxfdG1fd2VpZ2h0OiB0eXBlZCBhbGlhcyBmb3IgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworCisvKiogYWN0aW9uIElELiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9hY3Rpb25faWQKK3sKKyAgICBCQ01CQUxfQUNUSU9OX0lEX05PTkUgICAgICAgICAgID0gMCwKKyAgICBCQ01CQUxfQUNUSU9OX0lEX0NNRFNfQklUTUFTSyAgID0gMHgwMDAxLCAgICAgICAgICAgLyoqPCBDb21tYW5kcyBiaXRtYXNrLiAqLworICAgIEJDTUJBTF9BQ1RJT05fSURfT19WSUQgICAgICAgICAgPSAweDAwMDIsICAgICAgICAgICAvKio8IE91dGVyIHZpZC4gKi8KKyAgICBCQ01CQUxfQUNUSU9OX0lEX09fUEJJVFMgICAgICAgID0gMHgwMDA0LCAgICAgICAgICAgLyoqPCBPdXRlciBwYml0cy4gKi8KKyAgICBCQ01CQUxfQUNUSU9OX0lEX09fVFBJRCAgICAgICAgID0gMHgwMDA4LCAgICAgICAgICAgLyoqPCBPdXRlciB0cGlkLiAqLworICAgIEJDTUJBTF9BQ1RJT05fSURfSV9WSUQgICAgICAgICAgPSAweDAwMTAsICAgICAgICAgICAvKio8IElubmVyIHZpZC4gKi8KKyAgICBCQ01CQUxfQUNUSU9OX0lEX0lfUEJJVFMgICAgICAgID0gMHgwMDIwLCAgICAgICAgICAgLyoqPCBJbm5lciBwYml0cy4gKi8KKyAgICBCQ01CQUxfQUNUSU9OX0lEX0lfVFBJRCAgICAgICAgID0gMHgwMDQwLCAgICAgICAgICAgLyoqPCBJbm5lciB0cGlkLiAqLworICAgIEJDTUJBTF9BQ1RJT05fSURfQUxMICAgICAgICAgICAgPSAweDAwN0YgICAgICAgICAgICAvKio8IEFsbCBmaWVsZHMgKi8KK30gYmNtYmFsX2FjdGlvbl9pZDsKKworLyoqIGFjdGlvbl9jbWRfaWQuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX2FjdGlvbl9jbWRfaWQKK3sKKyAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9OT05FICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX0FERF9PVVRFUl9UQUcgICAgICA9IDB4MDAwMSwgICAvKio8IEFkZCBvdXRlciB0YWcuICovCisgICAgQkNNQkFMX0FDVElPTl9DTURfSURfUkVNT1ZFX09VVEVSX1RBRyAgID0gMHgwMDAyLCAgIC8qKjwgUmVtb3ZlIG91dGVyIHRhZy4gKi8KKyAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9YTEFURV9PVVRFUl9UQUcgICAgPSAweDAwMDQsICAgLyoqPCBUcmFuc2xhdGUgb3V0ZXIgdGFnLiAqLworICAgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1hMQVRFX1RXT19UQUdTICAgICA9IDB4MDAwOCwgICAvKio8IFRyYW5zbGF0ZSB0d28gdGFncy4gKi8KKyAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9ESVNDQVJEX0RTX0JDQVNUICAgPSAweDAwMTAsICAgLyoqPCBVc2VkIHRvIHNhdGlzZnkgVFItMTU2IElzc3VlIDMgUi0xMTEgKi8KKyAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9ESVNDQVJEX0RTX1VOS05PV04gPSAweDAwMjAsICAgLyoqPCBVc2VkIHRvIHNhdGlzZnkgVFItMTU2IElzc3VlIDMgUi0xMDkgKi8KKyAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9BRERfVFdPX1RBR1MgICAgICAgPSAweDAwNDAsICAgLyoqPCBBZGQgdHdvIHRhZ3MuICovCisgICAgQkNNQkFMX0FDVElPTl9DTURfSURfUkVNT1ZFX1RXT19UQUdTICAgID0gMHgwMDgwLCAgIC8qKjwgUmVtb3ZlIHR3byB0YWdzLiAqLworICAgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1JFTUFSS19QQklUUyAgICAgICA9IDB4MDEwMCwgICAvKio8IFNldCB0aGUgb3V0ZXIgdGFnIHBiaXRzICovCisgICAgQkNNQkFMX0FDVElPTl9DTURfSURfQ09QWV9QQklUUyAgICAgICAgID0gMHgwMjAwLCAgIC8qKjwgQ29weSB0aGUgaW5uZXIgcGJpdHMgdG8gb3V0ZXIgcGJpdHMgKi8KKyAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9SRVZFUlNFX0NPUFlfUEJJVFMgPSAweDA0MDAsICAgLyoqPCBDb3B5IHRoZSBvdXRlciBwYml0cyB0byBpbm5lciBwYml0cyAqLworICAgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX0RTQ1BfVE9fUEJJVFMgICAgICA9IDB4MDgwMCwgICAvKio8IENvcHkgdGhlIEw0IERTQ1AgdG8gb3V0ZXIgcGJpdHMgKi8KKyAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9UUkFQX1RPX0hPU1QgICAgICAgPSAweDEwMDAgICAgLyoqPCBOb3QgYSB2YWxpZCBhY3Rpb24gZm9yIGEgZ3JvdXAgb2JqZWN0IG1lbWJlciAqLworfSBiY21iYWxfYWN0aW9uX2NtZF9pZDsKKworLyoqIGNsYXNzaWZpZXIgSUQuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX2NsYXNzaWZpZXJfaWQKK3sKKyAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9OT05FICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX09fVFBJRCAgICAgICAgICAgICA9IDB4MDAwMSwgICAvKio8IE91dGVyIFRQSUQgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkICovCisgICAgQkNNQkFMX0NMQVNTSUZJRVJfSURfT19WSUQgICAgICAgICAgICAgID0gMHgwMDAyLCAgIC8qKjwgT3V0ZXIgVklEIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCAqLworICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX0lfVFBJRCAgICAgICAgICAgICA9IDB4MDAwNCwgICAvKio8IElubmVyIFRQSUQgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkICovCisgICAgQkNNQkFMX0NMQVNTSUZJRVJfSURfSV9WSUQgICAgICAgICAgICAgID0gMHgwMDA4LCAgIC8qKjwgSW5uZXIgVklEIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCAqLworICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX09fUEJJVFMgICAgICAgICAgICA9IDB4MDAxMCwgICAvKio8IE91dGVyIFBCSVRTIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCAqLworICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX0lfUEJJVFMgICAgICAgICAgICA9IDB4MDAyMCwgICAvKio8IElubmVyIFBCSVRTIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCAqLworICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX0VUSEVSX1RZUEUgICAgICAgICA9IDB4MDA0MCwgICAvKio8IEV0aGVydHlwZSBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQgKi8KKyAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9EU1RfTUFDICAgICAgICAgICAgPSAweDAwODAsICAgLyoqPCBEZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQgKi8KKyAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9TUkNfTUFDICAgICAgICAgICAgPSAweDAxMDAsICAgLyoqPCBTb3VyY2UgTUFDIGFkZHJlc3Mgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkICovCisgICAgQkNNQkFMX0NMQVNTSUZJRVJfSURfSVBfUFJPVE8gICAgICAgICAgID0gMHgwMjAwLCAgIC8qKjwgSVAgcHJvdG9jb2wgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkICovCisgICAgQkNNQkFMX0NMQVNTSUZJRVJfSURfRFNUX0lQICAgICAgICAgICAgID0gMHgwNDAwLCAgIC8qKjwgRGVzdGluYXRpb24gSVAgYWRkcmVzcyBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQgKi8KKyAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9TUkNfSVAgICAgICAgICAgICAgPSAweDA4MDAsICAgLyoqPCBTb3VyY2UgSVAgYWRkcmVzcyBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQgKi8KKyAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9TUkNfUE9SVCAgICAgICAgICAgPSAweDEwMDAsICAgLyoqPCBTb3VyY2UgcG9ydCBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQgKi8KKyAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9EU1RfUE9SVCAgICAgICAgICAgPSAweDIwMDAsICAgLyoqPCBEZXN0aW5hdGlvbiBwb3J0IG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCAqLworICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX1BLVF9UQUdfVFlQRSAgICAgICA9IDB4NDAwMCwgICAvKio8IFRoZSB0YWcgdHlwZSBvZiB0aGUgaW5ncmVzcyBwYWNrZXRzICovCisgICAgQkNNQkFMX0NMQVNTSUZJRVJfSURfQUxMICAgICAgICAgICAgICAgID0gMHg3RkZGICAgIC8qKjwgQWxsIGZpZWxkcyAqLworfSBiY21iYWxfY2xhc3NpZmllcl9pZDsKKworLyoqIFBhY2tldCB0YWcgdHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfcGt0X3RhZ190eXBlCit7CisgICAgQkNNQkFMX1BLVF9UQUdfVFlQRV9OT05FICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01CQUxfUEtUX1RBR19UWVBFX1VOVEFHR0VEICAgICAgICAgICAgPSAweDAwMDEsICAgLyoqPCBVbnRhZ2dlZC4gKi8KKyAgICBCQ01CQUxfUEtUX1RBR19UWVBFX1NJTkdMRV9UQUcgICAgICAgICAgPSAweDAwMDIsICAgLyoqPCBTaW5nbGUgdGFnLiAqLworICAgIEJDTUJBTF9QS1RfVEFHX1RZUEVfRE9VQkxFX1RBRyAgICAgICAgICA9IDB4MDAwNCAgICAvKio8IERvdWJsZSB0YWcuICovCit9IGJjbWJhbF9wa3RfdGFnX3R5cGU7CisKKy8qKiBHZW5lcmljIGVuYWJsZS9kaXNhYmxlIGVudW1lcmF0aW9uIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX2NvbnRyb2wKK3sKKyAgICBCQ01CQUxfQ09OVFJPTF9ESVNBQkxFICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBkaXNhYmxlLiAqLworICAgIEJDTUJBTF9DT05UUk9MX0VOQUJMRSAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IGVuYWJsZS4gKi8KKyAgICBCQ01CQUxfQ09OVFJPTF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9jb250cm9sOworCisvKiogRGVzdGluYXRpb24gdHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfZGVzdF90eXBlCit7CisgICAgQkNNQkFMX0RFU1RfVFlQRV9OTkkgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgZm9yIHBhY2tldHMgYmVpbmcgc2VudCB0byB0aGUgTk5JICovCisgICAgQkNNQkFMX0RFU1RfVFlQRV9TVUJfVEVSTSAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgZm9yIHBhY2tldHMgYmVpbmcgc2VudCB0byBhIHN1YnNjcmliZXIgdGVybWluYWwgKi8KKyAgICBCQ01CQUxfREVTVF9UWVBFX0hPU1QgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgLyoqPCAgZm9yIHBhY2tldCBpbmRpY2F0aW9ucyByZWNlaXZlZCBmcm9tIE5OSSBvciBTVUJfVEVSTSBhbmQgYmVpbmcgc2VudCB0byB0aGUgaG9zdCAqLworfSBiY21iYWxfZGVzdF90eXBlOworCisvKiogRG93bnN0cmVhbiBhY3Rpb24gZm9yIHVua25vd24gcGFja2V0cy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfZHNfbWlzc19tb2RlCit7CisgICAgQkNNQkFMX0RTX01JU1NfTU9ERV9ESVNDQVJEICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgRGlzY2FyZC4gKi8KKyAgICBCQ01CQUxfRFNfTUlTU19NT0RFX0JST0FEQ0FTVCAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBCcm9hZGNhc3QuICovCisgICAgQkNNQkFMX0RTX01JU1NfTU9ERV9WSUQgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgVmlkLiAqLworICAgIEJDTUJBTF9EU19NSVNTX01PREVfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9kc19taXNzX21vZGU7CisKKy8qKiBFeHRyYSBCVyBFbGlnaWJpbGl0eSBUeXBlIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX2V4dHJhX2J3X2VsaWdpYmlsaXR5X3R5cGUKK3sKKyAgICBCQ01CQUxfRVhUUkFfQldfRUxJR0lCSUxJVFlfVFlQRV9OT05FICAgICAgID0gMCwgICAgLyoqPCBOb25lICovCisgICAgQkNNQkFMX0VYVFJBX0JXX0VMSUdJQklMSVRZX1RZUEVfTk9UX0FTU1VSRUQ9IDEsICAgIC8qKjwgTm90IGFzc3VyZWQgKi8KKyAgICBCQ01CQUxfRVhUUkFfQldfRUxJR0lCSUxJVFlfVFlQRV9CRVNUX0VGRk9SVD0gMiwgICAgLyoqPCBCZXN0IGVmZm9ydCAqLworICAgIEJDTUJBTF9FWFRSQV9CV19FTElHSUJJTElUWV9UWVBFX19OVU1fT0YgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9leHRyYV9id19lbGlnaWJpbGl0eV90eXBlOworCisvKiogRmxvdyBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9mbG93X3R5cGUKK3sKKyAgICBCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBVcHN0cmVhbSBmbG93ICovCisgICAgQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgRG93bnN0cmVhbSBGbG93ICovCisgICAgQkNNQkFMX0ZMT1dfVFlQRV9CUk9BRENBU1QgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgQnJvYWRjYXN0IEZsb3cgKi8KKyAgICBCQ01CQUxfRkxPV19UWVBFX01VTFRJQ0FTVCAgICAgICAgICAgICAgICAgID0gNCAgICAgLyoqPCBNdWx0aWNhc3QgRmxvdyAqLworfSBiY21iYWxfZmxvd190eXBlOworCisvKiogTWVtYmVyIG9wZXJhdGlvbiB0eXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9ncm91cF9tZW1iZXJfY21kCit7CisgICAgQkNNQkFMX0dST1VQX01FTUJFUl9DTURfQUREX01FTUJFUlMgICAgICAgICA9IDEsICAgIC8qKjwgQWRkIG5ldyBtZW1iZXJzLiAqLworICAgIEJDTUJBTF9HUk9VUF9NRU1CRVJfQ01EX1JFTV9NRU1CRVJTICAgICAgICAgPSAyLCAgICAvKio8IFJlbW92ZSBleGlzdGluZyBtZW1iZXJzLiAqLworICAgIEJDTUJBTF9HUk9VUF9NRU1CRVJfQ01EX1NFVF9NRU1CRVJTICAgICAgICAgPSAzICAgICAvKio8IFJlcGxhY2UgbWVtYmVycyB3aXRoIG5ldyBzZXQuICovCit9IGJjbWJhbF9ncm91cF9tZW1iZXJfY21kOworCisvKiogb3duZXIgb2YgdGhlIGdyb3VwIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX2dyb3VwX293bmVyCit7CisgICAgQkNNQkFMX0dST1VQX09XTkVSX05PTkUgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgbm8gb3duZXIgKi8KKyAgICBCQ01CQUxfR1JPVVBfT1dORVJfTVVMVElDQVNUICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCB1c2VkIGFzIG11bHRpY2FzdCBncm91cCAqLworICAgIEJDTUJBTF9HUk9VUF9PV05FUl9VTklDQVNUICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IHVzZWQgYXMgdW5pY2FzdCBncm91cCAqLworICAgIEJDTUJBTF9HUk9VUF9PV05FUl9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9ncm91cF9vd25lcjsKKworLyoqIEludGVyZmFjZSB0eXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9pbnRmX3R5cGUKK3sKKyAgICBCQ01CQUxfSU5URl9UWVBFX05OSSAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBOTkkgSW50ZXJmYWNlLiAqLworICAgIEJDTUJBTF9JTlRGX1RZUEVfUE9OICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFBPSU4gSW50ZXJmYWNlLiAqLworICAgIEJDTUJBTF9JTlRGX1RZUEVfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF9pbnRmX3R5cGU7CisKKy8qKiBJbnRlcndvcmtpbmcgRnVuY3Rpb24gTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfaXdmX21vZGUKK3sKKyAgICBCQ01CQUxfSVdGX01PREVfRElSRUNUX01BUFBJTkcgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEaXJlY3QgbWFwcGluZy4gKi8KKyAgICBCQ01CQUxfSVdGX01PREVfUEVSX0ZMT1cgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQZXIgZmxvdyAuICovCisgICAgQkNNQkFMX0lXRl9NT0RFX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfaXdmX21vZGU7CisKKy8qKiBTTEEgSUQuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3NsYV9pZAoreworICAgIEJDTUJBTF9TTEFfSURfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTUJBTF9TTEFfSURfTUlOX1JBVEUgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgLyoqPCBUaGUgbWluaW1hbCByYXRlIGZvciB0aGlzIGZsb3csIGluIGtpbG9iaXRzIHBlciBzZWNvbmQgKG9wdGlvbmFsKSAqLworICAgIEJDTUJBTF9TTEFfSURfTUFYX1JBVEUgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgLyoqPCBUaGUgbWF4aW11bSByYXRlIGZvciB0aGlzIGZsb3csIGluIGtpbG9iaXRzIHBlciBzZWNvbmQgKG9wdGlvbmFsKSAqLworICAgIEJDTUJBTF9TTEFfSURfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDMgICAgLyoqPCBBbGwgZmllbGRzICovCit9IGJjbWJhbF9zbGFfaWQ7CisKKy8qKiBBZG1pbiBzdGF0ZSB2YWx1ZXMgZm9yIGFjY2VzcyB0ZXJtaW5hbCBvYmplY3QgCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfc3RhdGUKK3sKKyAgICBCQ01CQUxfU1RBVEVfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgQWRtaW4gc3RhdGUgdXAgKi8KKyAgICBCQ01CQUxfU1RBVEVfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgQWRtaW4gc3RhdGUgZG93biAqLworICAgIEJDTUJBTF9TVEFURV9URVNUSU5HICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgLyoqPCBBZG1pbiBzdGF0ZSB0ZXN0aW5nICovCit9IGJjbWJhbF9zdGF0ZTsKKworLyoqIE9wZXIgc3RhdHVzIHZhbHVlcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9zdGF0dXMKK3sKKyAgICBCQ01CQUxfU1RBVFVTX1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgT3BlciBzdGF0dXMgdXAgKi8KKyAgICBCQ01CQUxfU1RBVFVTX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgT3BlciBzdGF0dXMgZG93biAqLworICAgIEJDTUJBTF9TVEFUVVNfVEVTVElORyAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBPcGVyIHN0YXR1cyB0ZXN0aW5nICovCisgICAgQkNNQkFMX1NUQVRVU19OT1RfUFJFU0VOVCAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IE9wZXIgc3RhdHVzIG5vdCBwcmVzZW50ICovCisgICAgQkNNQkFMX1NUQVRVU19MT1dFUl9MQVlFUl9ET1dOICAgICAgICAgICAgICA9IDUsICAgICAgICAvKio8IE9wZXIgc3RhdHVzIGxvd2VyIGxheWVyIGRvd24gKi8KKyAgICBCQ01CQUxfU1RBVFVTX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgID0gNiAgICAgICAgIC8qKjwgT3BlciBzdGF0dXMgdW5rbm93biAqLworfSBiY21iYWxfc3RhdHVzOworCisvKiogQnVmZmVyIEFkbWlzc2lvbiBDb250cm9sIFR5cGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfdG1fYmFjX3R5cGUKK3sKKyAgICBCQ01CQUxfVE1fQkFDX1RZUEVfVEFJTERST1AgICAgICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgVGFpbGRyb3AgICovCisgICAgQkNNQkFMX1RNX0JBQ19UWVBFX1dUQUlMRFJPUCAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFdlaWdodGVkIHRhaWxkcm9wICovCisgICAgQkNNQkFMX1RNX0JBQ19UWVBFX1JFRCAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFJhbmRvbSBFYXJseSBEaXNjYXJkICovCisgICAgQkNNQkFMX1RNX0JBQ19UWVBFX1dSRUQgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IFdlaWdodGVkIFJhbmRvbSBFYXJseSBEaXNjYXJkICovCisgICAgQkNNQkFMX1RNX0JBQ19UWVBFX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX3RtX2JhY190eXBlOworCisvKiogVE0gQ3JlYXRpb24gTW9kZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF90bV9jcmVhdGlvbl9tb2RlCit7CisgICAgQkNNQkFMX1RNX0NSRUFUSU9OX01PREVfTUFOVUFMICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCB0bSBvYmplY3QgY3JlYXRlZCBtYW51YWxseSAqLworICAgIEJDTUJBTF9UTV9DUkVBVElPTl9NT0RFX0FVVE8gICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgdG0gb2JqZWN0IGNyZWF0ZWQgYXV0b21hdGljYWxseSAqLworICAgIEJDTUJBTF9UTV9DUkVBVElPTl9NT0RFX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX3RtX2NyZWF0aW9uX21vZGU7CisKKy8qKiBTY2hlZHVsaW5nIExldmVsIGZvciB0aGUgQ2hpbGRyZW4gVE0gIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGUKK3sKKyAgICBCQ01CQUxfVE1fU0NIRURfQ0hJTERfVFlQRV9RVUVVRSAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFF1ZXVlLWxldmVsIHNjaGVkdWxlciAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9DSElMRF9UWVBFX1NDSEVEICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgU2NoZWR1bGVyLWxldmVsIHNjaGVkdWxlciAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9DSElMRF9UWVBFX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGU7CisKKy8qKiBUcmFmZmljIERpcmVjdGlvbiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF90bV9zY2hlZF9kaXIKK3sKKyAgICBCQ01CQUxfVE1fU0NIRURfRElSX1VTICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFVwc3RyZWFtICovCisgICAgQkNNQkFMX1RNX1NDSEVEX0RJUl9EUyAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtICovCit9IGJjbWJhbF90bV9zY2hlZF9kaXI7CisKKy8qKiBUTSBTY2hlZHVsZXIgT3duZXIgVHlwZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF90bV9zY2hlZF9vd25lcl90eXBlCit7CisgICAgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfVU5ERUZJTkVEICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBVbmRlZmluZWQgKi8KKyAgICBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9JTlRFUkZBQ0UgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEludGVyZmFjZSAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1NVQl9URVJNICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU3Vic2NyaWJlciB0ZXJtaW5hbCAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0FHR19QT1JUICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgVE0gc2NoZWR1bGVyIGlzIG93bmVkIGJ5IGFnZ3JlZ2F0aW9uIHBvcnQgKi8KKyAgICBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9VTkkgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFRNIHNjaGVkdWxlciBpcyBvd25lZCBieSBVTkkgcG9ydCAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1ZJUlRVQUwgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgT3RoZXIgdW5zcGVjaWZpZWQgb3duZXIgKi8KKyAgICBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF90bV9zY2hlZF9vd25lcl90eXBlOworCisvKiogdG1fc2NoZWRfb3duZXIgYWdnX3BvcnQgSUQuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3RtX3NjaGVkX293bmVyX2FnZ19wb3J0X2lkCit7CisgICAgQkNNQkFMX1RNX1NDSEVEX09XTkVSX0FHR19QT1JUX0lEX05PTkUgICAgICAgICAgPSAwLAorICAgIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9BR0dfUE9SVF9JRF9JTlRGX0lEICAgICAgID0gMHgwMDAxLCAgIC8qKjwgUE9OIGludGVyZmFjZSBpZCAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9BR0dfUE9SVF9JRF9TVUJfVEVSTV9JRCAgID0gMHgwMDAyLCAgIC8qKjwgU3Vic2NyaWJlciB0ZXJtaW5hbCBpZCAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9BR0dfUE9SVF9JRF9BR0dfUE9SVF9JRCAgID0gMHgwMDA0LCAgIC8qKjwgQWdncmVnYXRpb24gcG9ydCBpZCAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9BR0dfUE9SVF9JRF9BTEwgICAgICAgICAgID0gMHgwMDA3ICAgIC8qKjwgQWxsIGZpZWxkcyAqLworfSBiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWQ7CisKKy8qKiB0bV9zY2hlZF9wYXJlbnQgSUQuIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9pZAoreworICAgIEJDTUJBTF9UTV9TQ0hFRF9QQVJFTlRfSURfTk9ORSAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01CQUxfVE1fU0NIRURfUEFSRU5UX0lEX1NDSEVEX0lEICAgICAgICAgICAgICA9IDB4MDAwMSwgICAvKio8IFBhcmVudCBzY2hlZHVsZXIgaWQgKi8KKyAgICBCQ01CQUxfVE1fU0NIRURfUEFSRU5UX0lEX1BSSU9SSVRZICAgICAgICAgICAgICA9IDB4MDAwMiwgICAvKio8IFByaW9yaXR5ICovCisgICAgQkNNQkFMX1RNX1NDSEVEX1BBUkVOVF9JRF9XRUlHSFQgICAgICAgICAgICAgICAgPSAweDAwMDQsICAgLyoqPCBXZWlnaHQgKi8KKyAgICBCQ01CQUxfVE1fU0NIRURfUEFSRU5UX0lEX0FMTCAgICAgICAgICAgICAgICAgICA9IDB4MDAwNyAgICAvKio8IEFsbCBmaWVsZHMgKi8KK30gYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9pZDsKKworLyoqIFNjaGVkdWxlciBUeXBlIAorICovCit0eXBlZGVmIGVudW0gYmNtYmFsX3RtX3NjaGVkX3R5cGUKK3sKKyAgICBCQ01CQUxfVE1fU0NIRURfVFlQRV9OT05FICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IE5PIHNjaGVkdWxpbmcgKi8KKyAgICBCQ01CQUxfVE1fU0NIRURfVFlQRV9XRlEgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFdlaWdodGVkIEZhaXIgUXVldWUgKi8KKyAgICBCQ01CQUxfVE1fU0NIRURfVFlQRV9TUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFN0cmljdCBQcmlvcml0eSAqLworICAgIEJDTUJBTF9UTV9TQ0hFRF9UWVBFX1NQX1dGUSAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgIC8qKjwgSHlicmlkIFNQICsgV0ZRICovCisgICAgQkNNQkFMX1RNX1NDSEVEX1RZUEVfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbWJhbF90bV9zY2hlZF90eXBlOworCisvKiogdG1fc2hhcGluZyBJRC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfdG1fc2hhcGluZ19pZAoreworICAgIEJDTUJBTF9UTV9TSEFQSU5HX0lEX05PTkUgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01CQUxfVE1fU0hBUElOR19JRF9TQlIgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAvKio8IFN1c3RhaW5lZCBCaXQgUmF0ZSAoa2JwcykgKi8KKyAgICBCQ01CQUxfVE1fU0hBUElOR19JRF9QQlIgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAvKio8IFBlYWsgQml0IFJhdGUgKGticHMpICovCisgICAgQkNNQkFMX1RNX1NIQVBJTkdfSURfQlVSU1QgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQsICAgLyoqPCBNYXggQnVyc3QgQnl0ZXMgYXQgUGVhayBCaXQgUmF0ZSAqLworICAgIEJDTUJBTF9UTV9TSEFQSU5HX0lEX0FMTCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA3ICAgIC8qKjwgQWxsIGZpZWxkcyAqLworfSBiY21iYWxfdG1fc2hhcGluZ19pZDsKKworLyoqIHRtX3Rjb250X3NsYSBJRC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfdG1fdGNvbnRfc2xhX2lkCit7CisgICAgQkNNQkFMX1RNX1RDT05UX1NMQV9JRF9OT05FICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTUJBTF9UTV9UQ09OVF9TTEFfSURfRVhUUkFfQldfRUxJRyAgICAgICAgICAgID0gMHgwMDAxLCAgIC8qKjwgRXh0cmEgQlcgZWxpZ2liaWxpdHkgdHlwZSAqLworICAgIEJDTUJBTF9UTV9UQ09OVF9TTEFfSURfTlJUX0NCUiAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgIC8qKjwgTlJUIENCUiAqLworICAgIEJDTUJBTF9UTV9UQ09OVF9TTEFfSURfUlRfQ0JSICAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgIC8qKjwgUlRfQ0JSICovCisgICAgQkNNQkFMX1RNX1RDT05UX1NMQV9JRF9SVF9QUk9GSUxFICAgICAgICAgICAgICAgPSAweDAwMDgsICAgLyoqPCBSVCBQcm9maWxlICovCisgICAgQkNNQkFMX1RNX1RDT05UX1NMQV9JRF9OUlRfUFJPRklMRSAgICAgICAgICAgICAgPSAweDAwMTAsICAgLyoqPCBOUlQgUHJvZmlsZSAqLworICAgIEJDTUJBTF9UTV9UQ09OVF9TTEFfSURfQUxMICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDFGICAgIC8qKjwgQWxsIGZpZWxkcyAqLworfSBiY21iYWxfdG1fdGNvbnRfc2xhX2lkOworCisvKiogVHJhbnNjZWl2ZXIgdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21iYWxfdHJ4X3R5cGUKK3sKKyAgICBCQ01CQUxfVFJYX1RZUEVfR1BPTl9TUFNfNDNfNDggICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IGdwb25fc3BzXzQzXzQ4LiAqLworICAgIEJDTUJBTF9UUlhfVFlQRV9HUE9OX1NQU19TT0dfNDMyMSAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgZ3Bvbl9zcHNfc29nXzQzMjEuICovCisgICAgQkNNQkFMX1RSWF9UWVBFX0dQT05fTFRFXzM2ODBfTSAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBncG9uX2x0ZV8zNjgwX20uICovCisgICAgQkNNQkFMX1RSWF9UWVBFX0dQT05fU09VUkNFX1BIT1RPTklDUyAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBncG9uX3NvdXJjZV9waG90b25pY3MuICovCisgICAgQkNNQkFMX1RSWF9UWVBFX0dQT05fTFRFXzM2ODBfUCAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgLyoqPCBncG9uX2x0ZV8zNjgwX3AuICovCisgICAgQkNNQkFMX1RSWF9UWVBFX1hHUE9OX0xUSF83MjIyX1BDICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCB4Z3Bvbl9sdGhfNzIyMl9wYy4gKi8KKyAgICBCQ01CQUxfVFJYX1RZUEVfWEdQT05fTFRIXzcyMjZfUEMgICAgICAgICAgICAgICA9IDYsICAgICAgICAvKio8IHhncG9uX2x0aF83MjI2X3BjLiAqLworICAgIEJDTUJBTF9UUlhfVFlQRV9YR1BPTl9MVEhfNTMwMl9QQyAgICAgICAgICAgICAgID0gNywgICAgICAgIC8qKjwgeGdwb25fbHRoXzUzMDJfcGMuICovCisgICAgQkNNQkFMX1RSWF9UWVBFX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21iYWxfdHJ4X3R5cGU7CisKKyNkZWZpbmUgYmNtYmFsX2FjdGlvbl9pZF9ub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9JRF9OT05FCisjZGVmaW5lIGJjbWJhbF9hY3Rpb25faWRfY21kc19iaXRtYXNrICAgICAgICAgICAgICAgICAgIEJDTUJBTF9BQ1RJT05fSURfQ01EU19CSVRNQVNLCisjZGVmaW5lIGJjbWJhbF9hY3Rpb25faWRfb192aWQgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9BQ1RJT05fSURfT19WSUQKKyNkZWZpbmUgYmNtYmFsX2FjdGlvbl9pZF9vX3BiaXRzICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9JRF9PX1BCSVRTCisjZGVmaW5lIGJjbWJhbF9hY3Rpb25faWRfb190cGlkICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9BQ1RJT05fSURfT19UUElECisjZGVmaW5lIGJjbWJhbF9hY3Rpb25faWRfaV92aWQgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9BQ1RJT05fSURfSV9WSUQKKyNkZWZpbmUgYmNtYmFsX2FjdGlvbl9pZF9pX3BiaXRzICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9JRF9JX1BCSVRTCisjZGVmaW5lIGJjbWJhbF9hY3Rpb25faWRfaV90cGlkICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9BQ1RJT05fSURfSV9UUElECisjZGVmaW5lIGJjbWJhbF9hY3Rpb25faWRfYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9BQ1RJT05fSURfQUxMCisjZGVmaW5lIGJjbWJhbF9jbGFzc2lmaWVyX2lkX25vbmUgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX05PTkUKKyNkZWZpbmUgYmNtYmFsX2NsYXNzaWZpZXJfaWRfb190cGlkICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0NMQVNTSUZJRVJfSURfT19UUElECisjZGVmaW5lIGJjbWJhbF9jbGFzc2lmaWVyX2lkX29fdmlkICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX09fVklECisjZGVmaW5lIGJjbWJhbF9jbGFzc2lmaWVyX2lkX2lfdHBpZCAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX0lfVFBJRAorI2RlZmluZSBiY21iYWxfY2xhc3NpZmllcl9pZF9pX3ZpZCAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9JX1ZJRAorI2RlZmluZSBiY21iYWxfY2xhc3NpZmllcl9pZF9vX3BiaXRzICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9PX1BCSVRTCisjZGVmaW5lIGJjbWJhbF9jbGFzc2lmaWVyX2lkX2lfcGJpdHMgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX0lfUEJJVFMKKyNkZWZpbmUgYmNtYmFsX2NsYXNzaWZpZXJfaWRfZXRoZXJfdHlwZSAgICAgICAgICAgICAgICAgQkNNQkFMX0NMQVNTSUZJRVJfSURfRVRIRVJfVFlQRQorI2RlZmluZSBiY21iYWxfY2xhc3NpZmllcl9pZF9kc3RfbWFjICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9EU1RfTUFDCisjZGVmaW5lIGJjbWJhbF9jbGFzc2lmaWVyX2lkX3NyY19tYWMgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX1NSQ19NQUMKKyNkZWZpbmUgYmNtYmFsX2NsYXNzaWZpZXJfaWRfaXBfcHJvdG8gICAgICAgICAgICAgICAgICAgQkNNQkFMX0NMQVNTSUZJRVJfSURfSVBfUFJPVE8KKyNkZWZpbmUgYmNtYmFsX2NsYXNzaWZpZXJfaWRfZHN0X2lwICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0NMQVNTSUZJRVJfSURfRFNUX0lQCisjZGVmaW5lIGJjbWJhbF9jbGFzc2lmaWVyX2lkX3NyY19pcCAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9DTEFTU0lGSUVSX0lEX1NSQ19JUAorI2RlZmluZSBiY21iYWxfY2xhc3NpZmllcl9pZF9zcmNfcG9ydCAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9TUkNfUE9SVAorI2RlZmluZSBiY21iYWxfY2xhc3NpZmllcl9pZF9kc3RfcG9ydCAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9EU1RfUE9SVAorI2RlZmluZSBiY21iYWxfY2xhc3NpZmllcl9pZF9wa3RfdGFnX3R5cGUgICAgICAgICAgICAgICBCQ01CQUxfQ0xBU1NJRklFUl9JRF9QS1RfVEFHX1RZUEUKKyNkZWZpbmUgYmNtYmFsX2NsYXNzaWZpZXJfaWRfYWxsICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0NMQVNTSUZJRVJfSURfQUxMCisjZGVmaW5lIGJjbWJhbF9zbGFfaWRfbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9TTEFfSURfTk9ORQorI2RlZmluZSBiY21iYWxfc2xhX2lkX21pbl9yYXRlICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfU0xBX0lEX01JTl9SQVRFCisjZGVmaW5lIGJjbWJhbF9zbGFfaWRfbWF4X3JhdGUgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9TTEFfSURfTUFYX1JBVEUKKyNkZWZpbmUgYmNtYmFsX3NsYV9pZF9hbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1NMQV9JRF9BTEwKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX293bmVyX2FnZ19wb3J0X2lkX25vbmUgICAgICAgICAgQkNNQkFMX1RNX1NDSEVEX09XTkVSX0FHR19QT1JUX0lEX05PTkUKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX293bmVyX2FnZ19wb3J0X2lkX2ludGZfaWQgICAgICAgQkNNQkFMX1RNX1NDSEVEX09XTkVSX0FHR19QT1JUX0lEX0lOVEZfSUQKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX293bmVyX2FnZ19wb3J0X2lkX3N1Yl90ZXJtX2lkICAgQkNNQkFMX1RNX1NDSEVEX09XTkVSX0FHR19QT1JUX0lEX1NVQl9URVJNX0lECisjZGVmaW5lIGJjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9pZF9hZ2dfcG9ydF9pZCAgIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9BR0dfUE9SVF9JRF9BR0dfUE9SVF9JRAorI2RlZmluZSBiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWRfYWxsICAgICAgICAgICBCQ01CQUxfVE1fU0NIRURfT1dORVJfQUdHX1BPUlRfSURfQUxMCisjZGVmaW5lIGJjbWJhbF90bV9zY2hlZF9wYXJlbnRfaWRfbm9uZSAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TQ0hFRF9QQVJFTlRfSURfTk9ORQorI2RlZmluZSBiY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkX3NjaGVkX2lkICAgICAgICAgICAgICBCQ01CQUxfVE1fU0NIRURfUEFSRU5UX0lEX1NDSEVEX0lECisjZGVmaW5lIGJjbWJhbF90bV9zY2hlZF9wYXJlbnRfaWRfcHJpb3JpdHkgICAgICAgICAgICAgIEJDTUJBTF9UTV9TQ0hFRF9QQVJFTlRfSURfUFJJT1JJVFkKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9pZF93ZWlnaHQgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1NDSEVEX1BBUkVOVF9JRF9XRUlHSFQKKyNkZWZpbmUgYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9pZF9hbGwgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1NDSEVEX1BBUkVOVF9JRF9BTEwKKyNkZWZpbmUgYmNtYmFsX3RtX3NoYXBpbmdfaWRfbm9uZSAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1NIQVBJTkdfSURfTk9ORQorI2RlZmluZSBiY21iYWxfdG1fc2hhcGluZ19pZF9zYnIgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fU0hBUElOR19JRF9TQlIKKyNkZWZpbmUgYmNtYmFsX3RtX3NoYXBpbmdfaWRfcGJyICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1RNX1NIQVBJTkdfSURfUEJSCisjZGVmaW5lIGJjbWJhbF90bV9zaGFwaW5nX2lkX2J1cnN0ICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TSEFQSU5HX0lEX0JVUlNUCisjZGVmaW5lIGJjbWJhbF90bV9zaGFwaW5nX2lkX2FsbCAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9TSEFQSU5HX0lEX0FMTAorI2RlZmluZSBiY21iYWxfdG1fdGNvbnRfc2xhX2lkX25vbmUgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fVENPTlRfU0xBX0lEX05PTkUKKyNkZWZpbmUgYmNtYmFsX3RtX3Rjb250X3NsYV9pZF9leHRyYV9id19lbGlnICAgICAgICAgICAgQkNNQkFMX1RNX1RDT05UX1NMQV9JRF9FWFRSQV9CV19FTElHCisjZGVmaW5lIGJjbWJhbF90bV90Y29udF9zbGFfaWRfbnJ0X2NiciAgICAgICAgICAgICAgICAgIEJDTUJBTF9UTV9UQ09OVF9TTEFfSURfTlJUX0NCUgorI2RlZmluZSBiY21iYWxfdG1fdGNvbnRfc2xhX2lkX3J0X2NiciAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fVENPTlRfU0xBX0lEX1JUX0NCUgorI2RlZmluZSBiY21iYWxfdG1fdGNvbnRfc2xhX2lkX3J0X3Byb2ZpbGUgICAgICAgICAgICAgICBCQ01CQUxfVE1fVENPTlRfU0xBX0lEX1JUX1BST0ZJTEUKKyNkZWZpbmUgYmNtYmFsX3RtX3Rjb250X3NsYV9pZF9ucnRfcHJvZmlsZSAgICAgICAgICAgICAgQkNNQkFMX1RNX1RDT05UX1NMQV9JRF9OUlRfUFJPRklMRQorI2RlZmluZSBiY21iYWxfdG1fdGNvbnRfc2xhX2lkX2FsbCAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fVENPTlRfU0xBX0lEX0FMTAorCisvKiogYWN0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2FjdGlvbgoreworICAgIGJjbWJhbF9hY3Rpb25faWQgcHJlc2VuY2VfbWFzazsgICAgIC8qKjwgUHJlc2VuY2UgTWFzay4gKi8KKyAgICBiY21iYWxfYWN0aW9uX2NtZF9pZCBjbWRzX2JpdG1hc2s7ICAvKio8IENvbW1hbmRzIGJpdG1hc2suICovCisgICAgdWludDE2X3Qgb192aWQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBPdXRlciB2aWQuICovCisgICAgdWludDhfdCBvX3BiaXRzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBPdXRlciBwYml0cy4gKi8KKyAgICB1aW50MTZfdCBvX3RwaWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE91dGVyIHRwaWQuICovCisgICAgdWludDE2X3QgaV92aWQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbm5lciB2aWQuICovCisgICAgdWludDhfdCBpX3BiaXRzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBJbm5lciBwYml0cy4gKi8KKyAgICB1aW50MTZfdCBpX3RwaWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IElubmVyIHRwaWQuICovCit9IGJjbWJhbF9hY3Rpb247CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBhZ2dyZWdhdGlvbl9wb3J0X2lkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OAoreworICAgIHVpbnQ4X3QgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQgKnZhbDsgICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4OworCisvKiogY2xhc3NpZmllci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9jbGFzc2lmaWVyCit7CisgICAgYmNtYmFsX2NsYXNzaWZpZXJfaWQgcHJlc2VuY2VfbWFzazsgLyoqPCBQcmVzZW5jZSBNYXNrLiAqLworICAgIHVpbnQxNl90IG9fdHBpZDsgICAgICAgICAgICAgICAgICAgIC8qKjwgT3V0ZXIgVFBJRCBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQgKi8KKyAgICB1aW50MTZfdCBvX3ZpZDsgICAgICAgICAgICAgICAgICAgICAvKio8IE91dGVyIFZJRCBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQgKi8KKyAgICB1aW50MTZfdCBpX3RwaWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IElubmVyIFRQSUQgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkICovCisgICAgdWludDE2X3QgaV92aWQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbm5lciBWSUQgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkICovCisgICAgdWludDhfdCBvX3BiaXRzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBPdXRlciBQQklUUyBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQgKi8KKyAgICB1aW50OF90IGlfcGJpdHM7ICAgICAgICAgICAgICAgICAgICAvKio8IElubmVyIFBCSVRTIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCAqLworICAgIHVpbnQxNl90IGV0aGVyX3R5cGU7ICAgICAgICAgICAgICAgIC8qKjwgRXRoZXJ0eXBlIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGRzdF9tYWM7ICAgICAgICAgIC8qKjwgRGVzdGluYXRpb24gTUFDIGFkZHJlc3Mgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3Mgc3JjX21hYzsgICAgICAgICAgLyoqPCBTb3VyY2UgTUFDIGFkZHJlc3Mgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkICovCisgICAgdWludDhfdCBpcF9wcm90bzsgICAgICAgICAgICAgICAgICAgLyoqPCBJUCBwcm90b2NvbCBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQgKi8KKyAgICBiY21vc19pcHY0X2FkZHJlc3MgZHN0X2lwOyAgICAgICAgICAvKio8IERlc3RpbmF0aW9uIElQIGFkZHJlc3Mgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkICovCisgICAgYmNtb3NfaXB2NF9hZGRyZXNzIHNyY19pcDsgICAgICAgICAgLyoqPCBTb3VyY2UgSVAgYWRkcmVzcyBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQgKi8KKyAgICB1aW50MTZfdCBzcmNfcG9ydDsgICAgICAgICAgICAgICAgICAvKio8IFNvdXJjZSBwb3J0IG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCAqLworICAgIHVpbnQxNl90IGRzdF9wb3J0OyAgICAgICAgICAgICAgICAgIC8qKjwgRGVzdGluYXRpb24gcG9ydCBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQgKi8KKyAgICBiY21iYWxfcGt0X3RhZ190eXBlIHBrdF90YWdfdHlwZTsgICAvKio8IFRoZSB0YWcgdHlwZSBvZiB0aGUgaW5ncmVzcyBwYWNrZXRzICovCit9IGJjbWJhbF9jbGFzc2lmaWVyOworCisvKiogUGFja2V0IGRlc3RpbmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2Rlc3QKK3sKKyAgICBiY21iYWxfZGVzdF90eXBlIHR5cGU7ICAgICAgICAgICAgICAvKio8IHBhY2tldCBkZXN0aW5hdGlvbi4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWJhbF9pbnRmX2lkIGludF9pZDsgICAgICAvKio8IEludGVyZmFjZSBJRC4gKi8KKyAgICAgICAgfSBubmk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWJhbF9zdWJfaWQgc3ViX3Rlcm1faWQ7ICAvKio8IFN1YnNjcmliZXIgdGVybWluYWwgSUQuICovCisgICAgICAgICAgICB1aW50MTZfdCBzdWJfdGVybV91bmk7ICAgICAgLyoqPCBTdWJzY3JpYmVyIHRlcm1pbmFsIFVOSS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGludF9pZDsgICAgICAgICAgICAvKio8IEludGVyZmFjZSBJRC4gKi8KKyAgICAgICAgfSBzdWJfdGVybTsKKyAgICB9IHU7Cit9IGJjbWJhbF9kZXN0OworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZmxvd19pZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyCit7CisgICAgdWludDMyX3QgbGVuOyAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21iYWxfZmxvd19pZCAqdmFsOyAgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyOworCisvKiogUXVldWUgUmVmZXJlbmNlIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfdG1fcXVldWVfcmVmCit7CisgICAgYmNtYmFsX3RtX3NjaGVkX2lkIHNjaGVkX2lkOyAgICAvKio8IFNjaGVkdWxlciAodG1fc2NoZWQpIElEICovCisgICAgYmNtYmFsX3RtX3F1ZXVlX2lkIHF1ZXVlX2lkOyAgICAvKio8IFF1ZXVlIElEICovCit9IGJjbWJhbF90bV9xdWV1ZV9yZWY7CisKKy8qKiBHcm91cCBNZW1iZXIgSW5mby4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mbworeworICAgIGJjbWJhbF9pbnRmX2lkIGludGZfaWQ7ICAgICAgICAgICAgIC8qKjwgQWNjZXNzIGludGVyZmFjZSBpZCBmb3IgdGhpcyBtZW1iZXIgKi8KKyAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkIHN2Y19wb3J0X2lkOyAvKio8IFRoZSBtdWx0aWNhc3QgIkdFTSIgZm9yIHRoaXMgbWVtYmVyICovCisgICAgYmNtYmFsX2FjdGlvbiBhY3Rpb247ICAgICAgICAgICAgICAgLyoqPCBWTEFOIGFjdGlvbnMgKi8KKyAgICBiY21iYWxfdG1fcXVldWVfcmVmIHF1ZXVlOyAgICAgICAgICAvKio8IEVncmVzcyBxdWV1ZSAqLworfSBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm87CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncm91cF9tZW1iZXJfaW5mby4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNgoreworICAgIHVpbnQxNl90IGxlbjsgICAgICAgICAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gKnZhbDsgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2OworCisvKiogUGFzc3dvcmQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfcGFzc3dvcmQKK3sKKyAgICB1aW50OF90IGFyclsxMF07ICAgIC8qKjwgQXJyYXkuICovCit9IGJjbWJhbF9wYXNzd29yZDsKKworLyoqIFJlZ2lzdHJhdGlvbiBpZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9yZWdpc3RyYXRpb25faWQKK3sKKyAgICB1aW50OF90IGFyclszNl07ICAgIC8qKjwgT05VIHJlZ2lzdHJhdGlvbiBJRCAqLworfSBiY21iYWxfcmVnaXN0cmF0aW9uX2lkOworCisvKiogU2VyaWFsIG51bWJlci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9zZXJpYWxfbnVtYmVyCit7CisgICAgdWludDhfdCB2ZW5kb3JfaWRbNF07ICAgICAgIC8qKjwgdmVuZG9yIGlkLiAqLworICAgIHVpbnQ4X3QgdmVuZG9yX3NwZWNpZmljWzRdOyAvKio8IHZlbmRvciBzcGVjaWZpYy4gKi8KK30gYmNtYmFsX3NlcmlhbF9udW1iZXI7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBzZXJ2aWNlX3BvcnRfaWQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTgKK3sKKyAgICB1aW50OF90IGxlbjsgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCAqdmFsOyAgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91ODsKKworLyoqIFNMQS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9zbGEKK3sKKyAgICBiY21iYWxfc2xhX2lkIHByZXNlbmNlX21hc2s7ICAgIC8qKjwgUHJlc2VuY2UgTWFzay4gKi8KKyAgICB1aW50MzJfdCBtaW5fcmF0ZTsgICAgICAgICAgICAgIC8qKjwgVGhlIG1pbmltYWwgcmF0ZSBmb3IgdGhpcyBmbG93LCBpbiBraWxvYml0cyBwZXIgc2Vjb25kIChvcHRpb25hbCkgKi8KKyAgICB1aW50MzJfdCBtYXhfcmF0ZTsgICAgICAgICAgICAgIC8qKjwgVGhlIG1heGltdW0gcmF0ZSBmb3IgdGhpcyBmbG93LCBpbiBraWxvYml0cyBwZXIgc2Vjb25kIChvcHRpb25hbCkgKi8KK30gYmNtYmFsX3NsYTsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHN1Yl9pZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9zdWJfaWRfbGlzdF91MTYKK3sKKyAgICB1aW50MTZfdCBsZW47ICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtYmFsX3N1Yl9pZCAqdmFsOyAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbWJhbF9zdWJfaWRfbGlzdF91MTY7CisKKy8qKiBSYW5kb20gRWFybHkgRGlzY2FyZCBDb25maWd1cmF0aW9uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfdG1fcmVkCit7CisgICAgYmNtYmFsX3BlcmNlbnQgbWluX3RocmVzaG9sZDsgICAvKio8IE1pbiB0aHJlc2hvbGQgaW4gcGVyY2VudCBvZiBtYXggcXVldWUgc2l6ZSAqLworICAgIGJjbWJhbF9wZXJjZW50IG1heF90aHJlc2hvbGQ7ICAgLyoqPCBNYXggdGhyZXNob2xkIGluIHBlcmNlbnQgb2YgbWF4IHF1ZXVlIHNpemUgKi8KKyAgICBiY21iYWxfcGVyY2VudCBtYXhfcHJvYmFiaWxpdHk7IC8qKjwgRGlzY2FyZCBwcm9iYWJpbGl0eSBmb3Igb2NjdXBhbmN5IGJldHdlZW4gbWluX3RocmVzaG9sZCBhbmQgbWF4X3RocmVzaG9sZCAqLworfSBiY21iYWxfdG1fcmVkOworCisvKiogUXVldWUgQnVmZmVyIEFkbWlzc2lvbiBDb250cm9sIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfdG1fYmFjCit7CisgICAgYmNtYmFsX3RtX2JhY190eXBlIHR5cGU7ICAgICAgICAvKio8IEJ1ZmZlciBBZG1pc3Npb24gQ29udHJvbCBUeXBlICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBtYXhfc2l6ZTsgICAgICAvKio8IG1heCBudW1iZXIgb2YgcGFja2V0cyBpbiB0aGUgcXVldWUgKi8KKyAgICAgICAgfSB0YWlsZHJvcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtYmFsX3RtX3JlZCByZWQ7ICAgICAgLyoqPCBSYW5kb20gRWFybHkgRGlzY2FyZCBjb25maWd1cmF0aW9uICovCisgICAgICAgIH0gcmVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21iYWxfdG1fcmVkIGdyZWVuOyAgICAvKio8IEdyZWVuIFJhbmRvbSBFYXJseSBEaXNjYXJkIENvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgICAgIGJjbWJhbF90bV9yZWQgeWVsbG93OyAgIC8qKjwgWWVsbG93IFJhbmRvbSBFYXJseSBEaXNjYXJkIENvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgICAgIGJjbWJhbF90bV9yZWQgcmVkOyAgICAgIC8qKjwgUmVkIFJhbmRvbSBFYXJseSBEaXNjYXJkIENvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgfSB3cmVkOworICAgIH0gdTsKK30gYmNtYmFsX3RtX2JhYzsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHRtX3F1ZXVlX2lkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdTgKK3sKKyAgICB1aW50OF90IGxlbjsgICAgICAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21iYWxfdG1fcXVldWVfaWQgKnZhbDsgICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91ODsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHRtX3NjaGVkX2lkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3RtX3NjaGVkX2lkX2xpc3RfdTgKK3sKKyAgICB1aW50OF90IGxlbjsgICAgICAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21iYWxfdG1fc2NoZWRfaWQgKnZhbDsgICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91ODsKKworLyoqIFRNIFNjaGVkdWxlciBPd25lciAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3RtX3NjaGVkX293bmVyCit7CisgICAgYmNtYmFsX3RtX3NjaGVkX293bmVyX3R5cGUgdHlwZTsgICAgLyoqPCBPd25lciB0eXBlICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21iYWxfaW50Zl90eXBlIGludGZfdHlwZTsgLyoqPCBJbnRlcmZhY2UgVHlwZSAqLworICAgICAgICAgICAgYmNtYmFsX2ludGZfaWQgaW50Zl9pZDsgICAgIC8qKjwgSW50ZXJmYWNlIElEICovCisgICAgICAgIH0gaW50ZXJmYWNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21iYWxfaW50Zl9pZCBpbnRmX2lkOyAgICAgLyoqPCBQT04gaW50ZXJmYWNlIGlkICovCisgICAgICAgICAgICBiY21iYWxfc3ViX2lkIHN1Yl90ZXJtX2lkOyAgLyoqPCBTdWJzY3JpYmVyIHRlcm1pbmFsIElEICovCisgICAgICAgIH0gc3ViX3Rlcm07CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9pZCBwcmVzZW5jZV9tYXNrOyAgICAvKio8IFByZXNlbmNlIE1hc2suICovCisgICAgICAgICAgICB1aW50OF90IGludGZfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQT04gaW50ZXJmYWNlIGlkICovCisgICAgICAgICAgICBiY21iYWxfc3ViX2lkIHN1Yl90ZXJtX2lkOyAgICAgICAgICAgICAgLyoqPCBTdWJzY3JpYmVyIHRlcm1pbmFsIGlkICovCisgICAgICAgICAgICBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBhZ2dfcG9ydF9pZDsgLyoqPCBBZ2dyZWdhdGlvbiBwb3J0IGlkICovCisgICAgICAgIH0gYWdnX3BvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaW50Zl9pZDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBPTiBpbnRlcmZhY2UgaWQgKi8KKyAgICAgICAgICAgIGJjbWJhbF9zdWJfaWQgc3ViX3Rlcm1faWQ7ICAgICAgICAgICAgICAvKio8IFN1YnNjcmliZXIgdGVybWluYWwgaWQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaWR4OyAgICAvKio8IEluZGV4IGF0IHN1YnNjcmliZXIgdGVybWluYWwgKi8KKyAgICAgICAgfSB1bmk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGlkeDsgICAvKio8IE93bmVyIGluZGV4ICovCisgICAgICAgIH0gdmlydHVhbDsKKyAgICB9IHU7Cit9IGJjbWJhbF90bV9zY2hlZF9vd25lcjsKKworLyoqIFNjaGVkdWxpbmcgUGFyZW50IENvbm5lY3QgUG9pbnQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF90bV9zY2hlZF9wYXJlbnQKK3sKKyAgICBiY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkIHByZXNlbmNlX21hc2s7ICAgIC8qKjwgUHJlc2VuY2UgTWFzay4gKi8KKyAgICBiY21iYWxfdG1fc2NoZWRfaWQgc2NoZWRfaWQ7ICAgICAgICAgICAgICAgIC8qKjwgUGFyZW50IHNjaGVkdWxlciBpZCAqLworICAgIGJjbWJhbF90bV9wcmlvcml0eSBwcmlvcml0eTsgICAgICAgICAgICAgICAgLyoqPCBQcmlvcml0eSAqLworICAgIGJjbWJhbF90bV93ZWlnaHQgd2VpZ2h0OyAgICAgICAgICAgICAgICAgICAgLyoqPCBXZWlnaHQgKi8KK30gYmNtYmFsX3RtX3NjaGVkX3BhcmVudDsKKworLyoqIFNoYXBpbmcgUGFyYW1ldGVycyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3RtX3NoYXBpbmcKK3sKKyAgICBiY21iYWxfdG1fc2hhcGluZ19pZCBwcmVzZW5jZV9tYXNrOyAvKio8IFByZXNlbmNlIE1hc2suICovCisgICAgdWludDMyX3Qgc2JyOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdXN0YWluZWQgQml0IFJhdGUgKGticHMpICovCisgICAgdWludDMyX3QgcGJyOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQZWFrIEJpdCBSYXRlIChrYnBzKSAqLworICAgIHVpbnQzMl90IGJ1cnN0OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IEJ1cnN0IEJ5dGVzIGF0IFBlYWsgQml0IFJhdGUgKi8KK30gYmNtYmFsX3RtX3NoYXBpbmc7CisKKy8qKiBJVFUtUE9OIEV4dGVuZGVkIFNMQSBQYXJhbWV0ZXJzIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfdG1fdGNvbnRfc2xhCit7CisgICAgYmNtYmFsX3RtX3Rjb250X3NsYV9pZCBwcmVzZW5jZV9tYXNrOyAgICAgICAgICAgLyoqPCBQcmVzZW5jZSBNYXNrLiAqLworICAgIGJjbWJhbF9leHRyYV9id19lbGlnaWJpbGl0eV90eXBlIGV4dHJhX2J3X2VsaWc7IC8qKjwgRXh0cmEgQlcgZWxpZ2liaWxpdHkgdHlwZSAqLworICAgIHVpbnQ4X3QgbnJ0X2NicjsgICAgICAgIC8qKjwgTlJUIENCUiAqLworICAgIHVpbnQ4X3QgcnRfY2JyOyAgICAgICAgIC8qKjwgUlRfQ0JSICovCisgICAgdWludDhfdCBydF9wcm9maWxlOyAgICAgLyoqPCBSVCBQcm9maWxlICovCisgICAgdWludDhfdCBucnRfcHJvZmlsZTsgICAgLyoqPCBOUlQgUHJvZmlsZSAqLworfSBiY21iYWxfdG1fdGNvbnRfc2xhOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTguIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfdThfbGlzdF91MzIKK3sKKyAgICB1aW50MzJfdCBsZW47ICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICB1aW50OF90ICp2YWw7ICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21iYWxfdThfbGlzdF91MzI7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiYWNjZXNzX3Rlcm1pbmFsIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleQoreworICAgIGJjbWJhbF9hY2Nlc3NfaWQgYWNjZXNzX3Rlcm1faWQ7ICAgIC8qKjwgUmVzZXJ2ZWQgKHNldCB0byAwKSAqLworfSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJhY2Nlc3NfdGVybWluYWwiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGEKK3sKKyAgICBiY21iYWxfc3RhdGUgYWRtaW5fc3RhdGU7ICAgLyoqPCBBZG1pbmlzdHJhdGl2ZSBzdGF0ZSAqLworICAgIGJjbWJhbF9zdGF0dXMgb3Blcl9zdGF0dXM7ICAvKio8IE9wZXJhdGlvbmFsIHN0YXR1cyAqLworICAgIGJjbWJhbF9pd2ZfbW9kZSBpd2ZfbW9kZTsgICAvKio8IFRoZSBpbnRlcndvcmtpbmcgbW9kZSAqLworfSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImFjY2Vzc190ZXJtaW5hbCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmcKK3sKKyAgICBiY21iYWxfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImluZCIgZ3JvdXAgb2YgdGhlICJhY2Nlc3NfdGVybWluYWwiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGEKK3sKKyAgICBiY21iYWxfc3RhdGUgYWRtaW5fc3RhdGU7ICAgLyoqPCBDdXJyZW50IGFkbWluaXN0cmF0aXZlIHN0YXRlICovCisgICAgYmNtYmFsX3N0YXR1cyBvcGVyX3N0YXR1czsgIC8qKjwgQ3VycmVudCBvcGVyYXRpb25hbCBzdGF0dXMgKi8KKyAgICBiY21iYWxfaXdmX21vZGUgaXdmX21vZGU7ICAgLyoqPCBUaGUgaW50ZXJ3b3JraW5nIG1vZGUgKi8KK30gYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJpbmQiIGdyb3VwIG9mICJhY2Nlc3NfdGVybWluYWwiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kCit7CisgICAgYmNtYmFsX2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImZsb3ciIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9mbG93X2tleQoreworICAgIGJjbWJhbF9mbG93X2lkIGZsb3dfaWQ7ICAgICAvKio8IFRoZSBJRCBvZiB0aGUgZmxvdyBvYmplY3QgaW5zdGFuY2UgYmVpbmcgcmVmZXJlbmNlZCAqLworICAgIGJjbWJhbF9mbG93X3R5cGUgZmxvd190eXBlOyAvKio8IFRoZSB0eXBlIG9mIHRoZSBmbG93LCBVcHN0cmVhbSwgRG93bnN0cmVhbSwgQnJvYWRjYXN0IG9yIE11bHRpY2FzdCAqLworfSBiY21iYWxfZmxvd19rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZmxvdyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2Zsb3dfY2ZnX2RhdGEKK3sKKyAgICBiY21iYWxfc3RhdGUgYWRtaW5fc3RhdGU7ICAgICAgICAgICAgICAgLyoqPCBBZG1pbmlzdHJhdGl2ZSBzdGF0ZSAqLworICAgIGJjbWJhbF9zdGF0dXMgb3Blcl9zdGF0dXM7ICAgICAgICAgICAgICAvKio8IE9wZXJhdGlvbmFsIHN0YXR1cyAqLworICAgIGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQ7ICAgICAgICAgICAvKio8IFRoZSBJRCBvZiB0aGUgc3Vic2NyaWJlciBzaWRlIGludGVyZmFjZTsgaS5lLiBQT04gKi8KKyAgICBiY21iYWxfaW50Zl9pZCBuZXR3b3JrX2ludF9pZDsgICAgICAgICAgLyoqPCBUaGUgSUQgb2YgdGhlIG5ldHdvcmsgc2lkZSBpbnRlcmZhY2U7IGkuZS4gTk5JICovCisgICAgYmNtYmFsX3N1Yl9pZCBzdWJfdGVybV9pZDsgICAgICAgICAgICAgIC8qKjwgVGhlIElEIG9mIHRoZSBzdWJzY2NyaWJlciB0ZXJtaW5hbCBkZXZpY2UgKi8KKyAgICB1aW50OF90IHN1Yl90ZXJtX3VuaV9pZHg7ICAgICAgICAgICAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIHN1YnNjY3JpYmVyIHRlcm1pbmFsIHVuaSBwb3J0IHRoZSBmbG93IGlzIHJlbGF0ZWQgdG8gKi8KKyAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkIHN2Y19wb3J0X2lkOyAgICAgLyoqPCBUaGUgSUQgb2YgdGhlIHNlcnZpY2UgcG9ydCAoZm9yIEdQT04vWEdQT04gLSBHRU0gSUQpICovCisgICAgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQgYWdnX3BvcnRfaWQ7IC8qKjwgVGhlIElEIG9mIHRoZSBhZ2dyZWdhdGUgcG9ydCAoZm9yIEdQT04vWEdQT04gLSBBTExPQyBJRCkgKi8KKyAgICBiY21vc19ib29sIHJlc29sdmVfbWFjOyAgICAgICAgICAgICAgICAgLyoqPCBBIGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgTUFDIGFkZHJlc3MgdGFibGUgc2hvdWxkIGJlIHVzZWQgaW4gRFMgR0VNIHJlc29sdXRpb24gKi8KKyAgICBiY21iYWxfY2xhc3NpZmllciBjbGFzc2lmaWVyOyAgICAgICAgICAgLyoqPCBUaGUgY2xhc3NpZmllciBmb3IgdGhpcyBmbG93ICovCisgICAgYmNtYmFsX2FjdGlvbiBhY3Rpb247ICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGZsb3cgKi8KKyAgICBiY21iYWxfc2xhIHNsYTsgICAgICAgICAgICAgLyoqPCBTTEEgcGFyYW1ldGVycyBmb3IgdGhpcyBmbG93ICovCisgICAgYmNtYmFsX2Nvb2tpZSBjb29raWU7ICAgICAgIC8qKjwgQXBwbGljYXRpb24gY29va2llICovCisgICAgdWludDE2X3QgcHJpb3JpdHk7ICAgICAgICAgIC8qKjwgUHJpb3JpdHkgZm9yIHRoaXMgZmxvdyBpbiBjYXNlIG9mIG11bHRpcGxlIG1hdGNoLiAqLworICAgIGJjbWJhbF9ncm91cF9pZCBncm91cF9pZDsgICAvKio8IFJXIC0gVGhlIG11bHRpY2FzdCBncm91cCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmbG93LCB2YWxpZCBmb3IgdHlwZSBNVUxUSUNBU1Qgb25seSAqLworICAgIGJjbWJhbF90bV9xdWV1ZV9yZWYgcXVldWU7ICAvKio8IEVncmVzcyBxdWV1ZSAqLworfSBiY21iYWxfZmxvd19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJmbG93IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfZmxvd19jZmcKK3sKKyAgICBiY21iYWxfY2ZnIGhkcjsgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbWJhbF9mbG93X2tleSBrZXk7ICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtYmFsX2Zsb3dfY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtYmFsX2Zsb3dfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJmbG93IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfZmxvd19zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCByeF9wYWNrZXRzOyAgICAvKio8IFJlY2VpdmVkIHBhY2tldHMuICovCisgICAgdWludDY0X3QgcnhfYnl0ZXM7ICAgICAgLyoqPCBSZWNlaXZlZCBieXRlcy4gKi8KKyAgICB1aW50NjRfdCB0eF9wYWNrZXRzOyAgICAvKio8IFRyYW5zbWl0dGVkIHBhY2tldHMuICovCisgICAgdWludDY0X3QgdHhfYnl0ZXM7ICAgICAgLyoqPCBUcmFuc21pdHRlZCBieXRlcy4gKi8KK30gYmNtYmFsX2Zsb3dfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJmbG93IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfZmxvd19zdGF0Cit7CisgICAgYmNtYmFsX3N0YXQgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21iYWxfZmxvd19rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbWJhbF9mbG93X3N0YXRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbWJhbF9mbG93X3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJpbmQiIGdyb3VwIG9mIHRoZSAiZmxvdyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2Zsb3dfaW5kX2RhdGEKK3sKKyAgICBiY21iYWxfc3RhdGUgYWRtaW5fc3RhdGU7ICAgICAgIC8qKjwgQWRtaW5pc3RyYXRpdmUgc3RhdGUgKi8KKyAgICBiY21iYWxfc3RhdHVzIG9wZXJfc3RhdHVzOyAgICAgIC8qKjwgT3BlcmF0aW9uYWwgU3RhdHVzICovCisgICAgdWludDE2X3QgYWNjZXNzX2ludF9pZDsgICAgICAgICAvKio8IFRoZSBJRCBvZiB0aGUgc3Vic2NyaWJlciBzaWRlIGludGVyZmFjZTsgaS5lLiBQT04gKi8KKyAgICB1aW50MTZfdCBuZXR3b3JrX2ludF9pZDsgICAgICAgIC8qKjwgVGhlIElEIG9mIHRoZSBuZXR3b3JrIHNpZGUgaW50ZXJmYWNlOyBpLmUuIE5OSSAqLworICAgIHVpbnQzMl90IHN1Yl90ZXJtX2lkOyAgICAgICAgICAgLyoqPCBUaGUgSUQgb2YgdGhlIHN1YnNjY3JpYmVyIHRlcm1pbmFsIGRldmljZSAqLworICAgIHVpbnQxNl90IHN2Y19wb3J0X2lkOyAgICAgICAgICAgLyoqPCBUaGUgSUQgb2YgdGhlIHNlcnZpY2UgcG9ydCAoZm9yIEdQT04vWEdQT04gLSBHRU0gSUQpICovCisgICAgdWludDE2X3QgYWdnX3BvcnRfaWQ7ICAgICAgICAgICAvKio8IFRoZSBJRCBvZiB0aGUgYWdncmVnYXRlIHBvcnQgKGZvciBHUE9OL1hHUE9OIC0gQUxMT0MgSUQpICovCisgICAgYmNtb3NfYm9vbCByZXNvbHZlX21hYzsgICAgICAgICAvKio8IEEgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBNQUMgYWRkcmVzcyB0YWJsZSBzaG91bGQgYmUgdXNlZCBpbiBEUyBHRU0gcmVzb2x1dGlvbiAqLworICAgIHVpbnQxNl90IGJhc2VfdGNfaWQ7ICAgICAgICAgICAgLyoqPCBUaGUgYmFzZSBpbmRleCBvZiB0aGUgVEMgb2JqZWN0KHMpIHRvIGJlIHVzZWQgZm9yIHRoaXMgZmxvdyAqLworICAgIGJjbWJhbF9jbGFzc2lmaWVyIGNsYXNzaWZpZXI7ICAgLyoqPCBUaGUgY2xhc3NpZmllciBmb3IgdGhpcyBmbG93ICovCisgICAgYmNtYmFsX2FjdGlvbiBhY3Rpb247ICAgICAgICAgICAvKio8IFRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBmbG93ICovCisgICAgYmNtYmFsX3NsYSBzbGE7ICAgICAgICAgICAgICAgICAvKio8IFNMQSBwYXJhbWV0ZXJzIGZvciB0aGlzIGZsb3cgKi8KKyAgICB1aW50MzJfdCBjb29raWU7ICAgICAgICAgICAgICAgIC8qKjwgQXBwbGljYXRpb24gY29va2llICovCisgICAgdWludDE2X3QgcHJpb3JpdHk7ICAgICAgICAgICAgICAvKio8IFByaW9yaXR5IGZvciB0aGlzIGZsb3cgaW4gY2FzZSBvZiBtdWx0aXBsZSBtYXRjaC4gKi8KK30gYmNtYmFsX2Zsb3dfaW5kX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiaW5kIiBncm91cCBvZiAiZmxvdyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2Zsb3dfaW5kCit7CisgICAgYmNtYmFsX2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21iYWxfZmxvd19rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbWJhbF9mbG93X2luZF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbWJhbF9mbG93X2luZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJncm91cCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2dyb3VwX2tleQoreworICAgIGJjbWJhbF9ncm91cF9pZCBncm91cF9pZDsgICAvKio8IFRoZSBJRCBvZiB0aGUgZ3JvdXAgb2JqZWN0IGluc3RhbmNlIGJlaW5nIHJlZmVyZW5jZWQgKi8KK30gYmNtYmFsX2dyb3VwX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncm91cCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2dyb3VwX2NmZ19kYXRhCit7CisgICAgYmNtYmFsX2dyb3VwX21lbWJlcl9jbWQgbWVtYmVyc19jbWQ7ICAgICAgICAvKio8IE1lbWJlcnNoaXAgb3BlcmF0aW9uIGNvbW1hbmRzLiAqLworICAgIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiBtZW1iZXJzOyAgLyoqPCBUaGUgbGlzdCBvZiBtZW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdyb3VwICovCisgICAgYmNtYmFsX2Nvb2tpZSBjb29raWU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFwcGxpY2F0aW9uIGNvb2tpZSAqLworICAgIGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyIGZsb3dzOyAgICAgICAgICAgICAgLyoqPCBMaXN0IG9mIGZsb3dzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdyb3VwICovCisgICAgYmNtYmFsX2dyb3VwX293bmVyIG93bmVyOyAgICAgICAgICAgICAgICAgICAvKio8IE93bmVyIG9mIHRoZSBncm91cC4gKi8KK30gYmNtYmFsX2dyb3VwX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImdyb3VwIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfZ3JvdXBfY2ZnCit7CisgICAgYmNtYmFsX2NmZyBoZHI7ICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21iYWxfZ3JvdXBfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbWJhbF9ncm91cF9jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbWJhbF9ncm91cF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiaW50ZXJmYWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfaW50ZXJmYWNlX2tleQoreworICAgIHVpbnQzMl90IGludGZfaWQ7ICAgICAgICAgICAvKio8IGludGZfaWQuICovCisgICAgYmNtYmFsX2ludGZfdHlwZSBpbnRmX3R5cGU7IC8qKjwgaW50Zl90eXBlLiAqLworfSBiY21iYWxfaW50ZXJmYWNlX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJpbnRlcmZhY2UiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEKK3sKKyAgICBiY21iYWxfc3RhdGUgYWRtaW5fc3RhdGU7ICAgLyoqPCBBZG1pbmlzdHJhdGl2ZSBzdGF0ZSAqLworICAgIGJjbWJhbF9zdGF0dXMgb3Blcl9zdGF0dXM7ICAvKio8IE9wZXJhdGlvbmFsIHN0YXR1cyAqLworICAgIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkIG1pbl9kYXRhX2FnZ19wb3J0X2lkOyAgICAvKio8IFRoZSBtaW5pbXVtIGFnZ19wb3J0X2lkIHRoYXQgaXMgYWxsb3dlZCBpbiB0aGUgc3lzdGVtICovCisgICAgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCBtaW5fZGF0YV9zdmNfcG9ydF9pZDsgICAgICAgIC8qKjwgVGhlIG1pbmltdW0gc3ZjX3BvcnRfaWQgdGhhdCBpcyBhbGxvd2VkIGluIHRoZSBzeXN0ZW0gKi8KKyAgICBiY21iYWxfdHJ4X3R5cGUgdHJhbnNjZWl2ZXJfdHlwZTsgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdHJhbnNjZWl2ZXIgdHlwZSB1c2VkIG9uIGFuIGludGVyZmFjZSAqLworICAgIGJjbWJhbF9kc19taXNzX21vZGUgZHNfbWlzc19tb2RlOyAgICAgICAgICAgICAgICAgICAvKio8IERlZmluZXMgdGhlIGFjdGlvbiB0byB0YWtlIGZvciB1bmtub3duIGRvd25zdHJlYW0gcGFja2V0cyAqLworICAgIHVpbnQxNl90IG10dTsgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgTVRVIGZvciBhbiBpbnRlcmZhY2UgKi8KKyAgICBiY21iYWxfY29udHJvbCBmbG93X2NvbnRyb2w7ICAgIC8qKjwgRmxvdyBjb250cm9sIGVuYWJsZSBvciBkaXNhYmxlICovCisgICAgYmNtYmFsX3RtX3NjaGVkX2lkIGRzX3RtOyAgICAgICAvKio8IERvd25zdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIgKi8KKyAgICBiY21iYWxfdG1fc2NoZWRfaWQgdXNfdG07ICAgICAgIC8qKjwgVXBzdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIgKi8KKyAgICBiY21iYWxfc3ViX2lkX2xpc3RfdTE2IHN1Yl90ZXJtX2lkX2xpc3Q7ICAgIC8qKjwgQSBsaXN0IG9mIHN1YnNjcmliZXIgdGVybWluYWwgaWRzIGNvbmZpZ3VyZWQgb24gdGhpcyBpbnRlcmZhY2UgKi8KK30gYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJpbnRlcmZhY2UiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9pbnRlcmZhY2VfY2ZnCit7CisgICAgYmNtYmFsX2NmZyBoZHI7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtYmFsX2ludGVyZmFjZV9rZXkga2V5OyAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbWJhbF9pbnRlcmZhY2VfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJpbnRlcmZhY2UiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgcnhfcGFja2V0czsgICAgLyoqPCBSZWNpZXZlZCBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHJ4X2J5dGVzOyAgICAgIC8qKjwgUmVjZWl2ZWQgYnl0ZXMuICovCisgICAgdWludDY0X3QgdHhfcGFja2V0czsgICAgLyoqPCBUcmFuc21pdHRlZCBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHR4X2J5dGVzOyAgICAgIC8qKjwgVHJhbnNtaXR0ZWQgYnl0ZXMuICovCit9IGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJpbnRlcmZhY2UiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9pbnRlcmZhY2Vfc3RhdAoreworICAgIGJjbWJhbF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21iYWxfaW50ZXJmYWNlX2tleSBrZXk7ICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21iYWxfaW50ZXJmYWNlX3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJpbmQiIGdyb3VwIG9mIHRoZSAiaW50ZXJmYWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhCit7CisgICAgYmNtYmFsX3N0YXRlIGFkbWluX3N0YXRlOyAgICAgICAgICAgLyoqPCBDdXJyZW50IGFkbWluaXN0cmF0aXZlIHN0YXRlICovCisgICAgYmNtYmFsX3N0YXR1cyBvcGVyX3N0YXR1czsgICAgICAgICAgLyoqPCBDdXJyZW50IG9wZXJhdGlvbmFsIHN0YXRlICovCisgICAgdWludDE2X3QgbWluX2RhdGFfYWdnX3BvcnRfaWQ7ICAgICAgLyoqPCBUaGUgbWluaW11bSBhZ2dfcG9ydF9pZCB0aGF0IGlzIGFsbG93ZWQgaW4gdGhlIHN5c3RlbSAqLworICAgIHVpbnQxNl90IG1pbl9kYXRhX3N2Y19wb3J0X2lkOyAgICAgIC8qKjwgVGhlIG1pbmltdW0gc3ZjX3BvcnRfaWQgdGhhdCBpcyBhbGxvd2VkIGluIHRoZSBzeXN0ZW0gKi8KKyAgICBiY21iYWxfdHJ4X3R5cGUgdHJhbnNjZWl2ZXJfdHlwZTsgICAvKio8IFRoZSB0cmFuc2NlaXZlciB0eXBlIHVzZWQgb24gYW4gaW50ZXJmYWNlICovCisgICAgYmNtYmFsX2RzX21pc3NfbW9kZSBkc19taXNzX21vZGU7ICAgLyoqPCBEZWZpbmVzIHRoZSBhY3Rpb24gdG8gdGFrZSBmb3IgRFMgdW5rbm93biBwYWNrZXRzICovCisgICAgdWludDE2X3QgbXR1OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgTVRVIGZvciBhbiBpbnRlcmZhY2UgKi8KKyAgICBiY21iYWxfY29udHJvbCBmbG93X2NvbnRyb2w7ICAgICAgICAvKio8IEZsb3cgY29udHJvbCBlbmFibGUgb3IgZGlzYWJsZSAqLworICAgIGJjbWJhbF90bV9zY2hlZF9pZCBkc190bTsgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlciAqLworICAgIGJjbWJhbF90bV9zY2hlZF9pZCB1c190bTsgICAgICAgICAgIC8qKjwgVXBzdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIgKi8KK30gYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJpbmQiIGdyb3VwIG9mICJpbnRlcmZhY2UiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9pbnRlcmZhY2VfaW5kCit7CisgICAgYmNtYmFsX2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtYmFsX2ludGVyZmFjZV9rZXkga2V5OyAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbWJhbF9pbnRlcmZhY2VfaW5kOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgInBhY2tldCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3BhY2tldF9rZXkKK3sKKyAgICB1aW50MzJfdCByZXNlcnZlZDsgICAgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQga2V5IGZpZWxkLiAqLworICAgIGJjbWJhbF9kZXN0IHBhY2tldF9zZW5kX2Rlc3Q7ICAgLyoqPCBQYWNrZXQgZGVzdGluYXRpb24uICovCit9IGJjbWJhbF9wYWNrZXRfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInBhY2tldCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3BhY2tldF9jZmdfZGF0YQoreworICAgIGJjbWJhbF9mbG93X2lkIGZsb3dfaWQ7ICAgICAgICAgICAgIC8qKjwgTi9BIGZvciBzZW5kaW5nIGEgcGFja2V0ICovCisgICAgYmNtYmFsX2Zsb3dfdHlwZSBmbG93X3R5cGU7ICAgICAgICAgLyoqPCBGbG93IFR5cGUuICovCisgICAgYmNtYmFsX2ludGZfaWQgaW50Zl9pZDsgICAgICAgICAgICAgLyoqPCBJbnRlcmZhY2UgSUQuICovCisgICAgYmNtYmFsX2ludGZfdHlwZSBpbnRmX3R5cGU7ICAgICAgICAgLyoqPCBJbnRlcmZhY2UgVHlwZS4gKi8KKyAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkIHN2Y19wb3J0OyAgICAvKio8IE4vQSBmb3Igc2VuZGluZyBhIHBhY2tldCAqLworICAgIGJjbWJhbF9jb29raWUgZmxvd19jb29raWU7ICAgICAgICAgIC8qKjwgTi9BIGZvciBzZW5kaW5nIGEgcGFja2V0ICovCisgICAgYmNtYmFsX3U4X2xpc3RfdTMyIHBrdDsgICAgICAgICAgICAgLyoqPCBQYWNrZXQgRGF0YS4gKi8KK30gYmNtYmFsX3BhY2tldF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJwYWNrZXQiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9wYWNrZXRfY2ZnCit7CisgICAgYmNtYmFsX2NmZyBoZHI7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtYmFsX3BhY2tldF9rZXkga2V5OyAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtYmFsX3BhY2tldF9jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbWJhbF9wYWNrZXRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaW5kIiBncm91cCBvZiB0aGUgInBhY2tldCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3BhY2tldF9pbmRfZGF0YQoreworICAgIGJjbWJhbF9mbG93X2lkIGZsb3dfaWQ7ICAgICAgICAgICAgIC8qKjwgTi9BIGZvciBzZW5kaW5nIGEgcGFja2V0ICovCisgICAgYmNtYmFsX2Zsb3dfdHlwZSBmbG93X3R5cGU7ICAgICAgICAgLyoqPCBGbG93IFR5cGUuICovCisgICAgYmNtYmFsX2ludGZfaWQgaW50Zl9pZDsgICAgICAgICAgICAgLyoqPCBJbnRlcmZhY2UgSUQuICovCisgICAgYmNtYmFsX2ludGZfdHlwZSBpbnRmX3R5cGU7ICAgICAgICAgLyoqPCBJbnRlcmZhY2UgVHlwZS4gKi8KKyAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkIHN2Y19wb3J0OyAgICAvKio8IE4vQSBmb3Igc2VuZGluZyBhIHBhY2tldCAqLworICAgIGJjbWJhbF9jb29raWUgZmxvd19jb29raWU7ICAgICAgICAgIC8qKjwgTi9BIGZvciBzZW5kaW5nIGEgcGFja2V0ICovCisgICAgYmNtYmFsX3U4X2xpc3RfdTMyIHBrdDsgICAgICAgICAgICAgLyoqPCBQYWNrZXQgRGF0YS4gKi8KK30gYmNtYmFsX3BhY2tldF9pbmRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJpbmQiIGdyb3VwIG9mICJwYWNrZXQiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9wYWNrZXRfaW5kCit7CisgICAgYmNtYmFsX2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtYmFsX3BhY2tldF9rZXkga2V5OyAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtYmFsX3BhY2tldF9pbmRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbWJhbF9wYWNrZXRfaW5kOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgInN1YnNjcmliZXJfdGVybWluYWwiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5Cit7CisgICAgYmNtYmFsX3N1Yl9pZCBzdWJfdGVybV9pZDsgIC8qKjwgc3ViX3Rlcm1faWQuICovCisgICAgYmNtYmFsX2ludGZfaWQgaW50Zl9pZDsgICAgIC8qKjwgaW50Zl9pZC4gKi8KK30gYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInN1YnNjcmliZXJfdGVybWluYWwiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEKK3sKKyAgICBiY21iYWxfc3RhdGUgYWRtaW5fc3RhdGU7ICAgICAgICAgICAvKio8IEFkbWluaXN0cmF0aXZlIHN0YXRlICovCisgICAgYmNtYmFsX3N0YXR1cyBvcGVyX3N0YXR1czsgICAgICAgICAgLyoqPCBPcGVyYXRpb25hbCBzdGF0dXMgKi8KKyAgICBiY21iYWxfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyOyAvKio8IFRoZSBzZXJpYWwgbnVtYmVyIG9mIGFuICBJVFUgUE9OIChHUE9OL1hHLVBPTjEvWEdTLVBPTi9ORy1QT04yKSBzdWJzY3JpYmVyIHRlcm1pbmFsICovCisgICAgYmNtYmFsX3Bhc3N3b3JkIHBhc3N3b3JkOyAgICAgICAgICAgLyoqPCBUaGUgcGFzc3dvcmQgb2YgYSBHUE9OIHN1YnNjcmliZXIgdGVybWluYWwgKi8KKyAgICBiY21iYWxfcmVnaXN0cmF0aW9uX2lkIHJlZ2lzdHJhdGlvbl9pZDsgICAgICAgICAgICAgICAgIC8qKjwgT05VIHJlZ2lzdHJhdGlvbiBJRCBvZiBhbiAgSVRVIFBPTiAoWEctUE9OMS9YR1MtUE9OL05HLVBPTjIpIHN1YnNjcmliZXIgdGVybWluYWwgKi8KKyAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkIHN2Y19wb3J0X2lkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIG1hbmFnZW1lbnQgc2VydmljZSBwb3J0IElEIChmb3IgUE9OLCB0aGUgT05VIElEKSAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgRXRoZXJuZXQgTUFDIGFkZHJlc3Mgb2YgYW4gRVBPTiBzdWJzY3JpYmVyIHRlcm1pbmFsICovCisgICAgYmNtYmFsX3RtX3NjaGVkX2lkIGRzX3RtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIgKi8KKyAgICBiY21iYWxfdG1fc2NoZWRfaWQgdXNfdG07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIgKi8KKyAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggc3ZjX3BvcnRfaWRfbGlzdDsgICAgICAgIC8qKjwgQSBsaXN0IG9mIGJlYXJlciB0cmFmZmljIHN2Y19wb3J0X2lkcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzY3JpYmVyIHRlcm1pbmFsICovCisgICAgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OCBhZ2dfcG9ydF9pZF9saXN0OyAgICAvKio8IEEgbGlzdCBvZiBhZ2dyX3BvcnRfaWRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNjcmliZXIgdGVybWluYWwgKi8KK30gYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAic3Vic2NyaWJlcl90ZXJtaW5hbCIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcKK3sKKyAgICBiY21iYWxfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0IiBncm91cCBvZiB0aGUgInN1YnNjcmliZXJfdGVybWluYWwiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgcnhfcGFja2V0czsgICAgLyoqPCBSZWNlaXZlZCBwYWNrZXRzIG9uIHNwZWNpZmllZCBvYmplY3QgKi8KKyAgICB1aW50NjRfdCByeF9ieXRlczsgICAgICAvKio8IFJlY2VpdmVkIGJ5dGVzIG9uIHNwZWNpZmllZCBvYmplY3QgKi8KKyAgICB1aW50NjRfdCB0eF9wYWNrZXRzOyAgICAvKio8IFRyYW5zbWl0dGVkIHBhY2tldHMgb24gc3BlY2lmaWVkIG9iamVjdCAqLworICAgIHVpbnQ2NF90IHR4X2J5dGVzOyAgICAgIC8qKjwgVHJhbnNtaXR0dGVkIGJ5dGVzIG9uIHNwZWNpZmllZCBvYmplY3QgKi8KK30gYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJzdWJzY3JpYmVyX3Rlcm1pbmFsIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXQKK3sKKyAgICBiY21iYWxfc3RhdCBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaW5kIiBncm91cCBvZiB0aGUgInN1YnNjcmliZXJfdGVybWluYWwiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEKK3sKKyAgICBiY21iYWxfc3RhdGUgYWRtaW5fc3RhdGU7ICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IGFkbWluaXN0cmF0aXZlIHN0YXRlICovCisgICAgYmNtYmFsX3N0YXR1cyBvcGVyX3N0YXR1czsgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBvcGVyYXRpb25hbCBzdGF0dXMgKi8KKyAgICBiY21iYWxfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyOyAgICAgLyoqPCBUaGUgc2VyaWFsIG51bWJlciBvZiBhbiAgSVRVIFBPTiAoR1BPTi9YRy1QT04xL1hHUy1QT04vTkctUE9OMikgc3Vic2NyaWJlciB0ZXJtaW5hbCAqLworICAgIGJjbWJhbF9wYXNzd29yZCBwYXNzd29yZDsgICAgICAgICAgICAgICAvKio8IFRoZSBwYXNzd29yZCBvZiBhIEdQT04gc3Vic2NyaWJlciB0ZXJtaW5hbCAqLworICAgIGJjbWJhbF9yZWdpc3RyYXRpb25faWQgcmVnaXN0cmF0aW9uX2lkOyAvKio8IE9OVSByZWdpc3RyYXRpb24gSUQgb2YgYW4gIElUVSBQT04gKFhHLVBPTjEvWEdTLVBPTi9ORy1QT04yKSBzdWJzY3JpYmVyIHRlcm1pbmFsICovCisgICAgdWludDE2X3Qgc3ZjX3BvcnRfaWQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHNlcnZpY2UgcG9ydCBJRCAoZm9yIFBPTiwgdGhlIE9OVSBJRCkgKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgICAgICAgICAgLyoqPCBUaGUgRXRoZXJuZXQgTUFDIGFkZHJlc3Mgb2YgYW4gZXBvbiBzdWJzY3JpYmVyIHRlcm1pbmFsICovCisgICAgYmNtYmFsX3RtX3NjaGVkX2lkIGRzX3RtOyAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlciAqLworICAgIGJjbWJhbF90bV9zY2hlZF9pZCB1c190bTsgICAgICAgICAgICAgICAvKio8IFVwc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyICovCit9IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImluZCIgZ3JvdXAgb2YgInN1YnNjcmliZXJfdGVybWluYWwiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kCit7CisgICAgYmNtYmFsX2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgInRtX3F1ZXVlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfdG1fcXVldWVfa2V5Cit7CisgICAgYmNtYmFsX3RtX3NjaGVkX2lkIHNjaGVkX2lkOyAgICAvKio8IFNjaGVkdWxlciB0aGF0IG93bnMgdGhlIHF1ZXVlICovCisgICAgYmNtYmFsX3RtX3NjaGVkX2RpciBzY2hlZF9kaXI7ICAvKio8IHNjaGVkIGRpci4gKi8KKyAgICBiY21iYWxfdG1fcXVldWVfaWQgaWQ7ICAgICAgICAgIC8qKjwgUXVldWUgaWQgKi8KK30gYmNtYmFsX3RtX3F1ZXVlX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJ0bV9xdWV1ZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhCit7CisgICAgYmNtYmFsX3RtX3ByaW9yaXR5IHByaW9yaXR5OyAgICAgICAgICAgIC8qKjwgU2NoZWR1bGluZyBwcmlvcml0eSAqLworICAgIGJjbWJhbF90bV93ZWlnaHQgd2VpZ2h0OyAgICAgICAgICAgICAgICAvKio8IFNjaGVkdWxpbmcgd2VpZ2h0ICovCisgICAgYmNtYmFsX3RtX3NoYXBpbmcgcmF0ZTsgICAgICAgICAgICAgICAgIC8qKjwgUmF0ZSBzaGFwaW5nIHBhcmFtZXRlcnMgKi8KKyAgICBiY21iYWxfdG1fYmFjIGJhYzsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCdWZmZXIgYWRtaXNzaW9uIGNvbnRyb2wgKi8KKyAgICBiY21iYWxfdG1fY3JlYXRpb25fbW9kZSBjcmVhdGlvbl9tb2RlOyAgLyoqPCBDcmVhdGlvbiBtb2RlICovCisgICAgdWludDhfdCByZWZfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlIGNvdW50IChmbG93cykgKi8KK30gYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgInRtX3F1ZXVlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfdG1fcXVldWVfY2ZnCit7CisgICAgYmNtYmFsX2NmZyBoZHI7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtYmFsX3RtX3F1ZXVlX2tleSBrZXk7ICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbWJhbF90bV9xdWV1ZV9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0IiBncm91cCBvZiB0aGUgInRtX3F1ZXVlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgcGFja2V0c19vazsgICAgICAgIC8qKjwgUGFja2V0cyB0cmFuc21pdHRlZCBzdWNjZXdzc2Z1bGx5ICovCisgICAgdWludDY0X3QgYnl0ZXNfb2s7ICAgICAgICAgIC8qKjwgQnl0ZXMgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgdWludDY0X3QgcGFja2V0c19kaXNjYXJkZWQ7IC8qKjwgUGFja2V0cyBkaXNjYXJkZWQgKi8KKyAgICB1aW50NjRfdCBieXRlc19kaXNjYXJkZWQ7ICAgLyoqPCBCeXRlcyBkaXNjYXJkZWQgKi8KK30gYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0IiBncm91cCBvZiAidG1fcXVldWUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF90bV9xdWV1ZV9zdGF0Cit7CisgICAgYmNtYmFsX3N0YXQgaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtYmFsX3RtX3F1ZXVlX2tleSBrZXk7ICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbWJhbF90bV9xdWV1ZV9zdGF0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaW5kIiBncm91cCBvZiB0aGUgInRtX3F1ZXVlIiBvYmplY3QuIAorICoKKyAqIFRtIFF1ZXVlIEluZGljYXRpb24gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YQoreworICAgIHVpbnQzMl90IHJldDsgICAvKio8IHJldCAqLworfSBiY21iYWxfdG1fcXVldWVfaW5kX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiaW5kIiBncm91cCBvZiAidG1fcXVldWUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF90bV9xdWV1ZV9pbmQKK3sKKyAgICBiY21iYWxfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21iYWxfdG1fcXVldWVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21iYWxfdG1fcXVldWVfaW5kX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtYmFsX3RtX3F1ZXVlX2luZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ0bV9zY2hlZCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3RtX3NjaGVkX2tleQoreworICAgIGJjbWJhbF90bV9zY2hlZF9kaXIgZGlyOyAgICAvKio8IFRyYWZmaWMgZGlyZWN0aW9uICovCisgICAgYmNtYmFsX3RtX3NjaGVkX2lkIGlkOyAgICAgIC8qKjwgSUQgKi8KK30gYmNtYmFsX3RtX3NjaGVkX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJ0bV9zY2hlZCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhCit7CisgICAgYmNtYmFsX3RtX3NjaGVkX293bmVyIG93bmVyOyAgICAgICAgLyoqPCBvd25lci4gKi8KKyAgICBiY21iYWxfdG1fc2NoZWRfdHlwZSBzY2hlZF90eXBlOyAgICAvKio8IFNjaGVkdWxlciB0eXBlICovCisgICAgYmNtYmFsX3RtX3NjaGVkX3BhcmVudCBzY2hlZF9wYXJlbnQ7ICAgICAgICAgICAgLyoqPCBTY2hlZHVsaW5nIHBhcmFtZXRlcnMgZm9yIHBhcmVudCBzY2hlZHVsZXIgKi8KKyAgICBiY21iYWxfdG1fc2NoZWRfY2hpbGRfdHlwZSBzY2hlZF9jaGlsZF90eXBlOyAgICAvKio8IFNjaGVkdWxpbmcgbGV2ZWwgZm9yIGNoaWxkcmVuIHRtICAqLworICAgIGJjbWJhbF90bV9zaGFwaW5nIHJhdGU7ICAgICAgICAgICAgICAgICAvKio8IFJhdGUgc2hhcGluZyBwYXJhbWV0ZXJzICovCisgICAgYmNtYmFsX3RtX3Rjb250X3NsYSB0Y29udF9zbGE7ICAgICAgICAgIC8qKjwgQWRkaXRpb25hbCBTTEEgcGFyYW1ldGVycyBmb3IgYWdnX3BvcnQgb3duZXIgKi8KKyAgICBiY21iYWxfdG1fY3JlYXRpb25fbW9kZSBjcmVhdGlvbl9tb2RlOyAgLyoqPCBDcmVhdGlvbiBtb2RlICovCisgICAgYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdTggcXVldWVzOyAgICAgIC8qKjwgU3Vic2lkaWFyeSBxdWV1ZXMgKi8KKyAgICBiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OCBzdWJfc2NoZWRzOyAgLyoqPCBTdWJzaWRpYXJ5IHNjaGVkdWxlcnMgKi8KKyAgICB1aW50OF90IG51bV9wcmlvcml0aWVzOyAgICAgICAgICAgICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIHN0cmljdCBwcmlvcml0eSBzY2hlZHVsaW5nIGVsZW1lbnRzICovCit9IGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJ0bV9zY2hlZCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3RtX3NjaGVkX2NmZworeworICAgIGJjbWJhbF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbWJhbF90bV9zY2hlZF9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21iYWxfdG1fc2NoZWRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaW5kIiBncm91cCBvZiB0aGUgInRtX3NjaGVkIiBvYmplY3QuIAorICoKKyAqIFRtIFNjaGVkIEluZGljYXRpb24gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YQoreworICAgIHVpbnQzMl90IHJldDsgICAvKio8IHJldCAqLworfSBiY21iYWxfdG1fc2NoZWRfaW5kX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiaW5kIiBncm91cCBvZiAidG1fc2NoZWQiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF90bV9zY2hlZF9pbmQKK3sKKyAgICBiY21iYWxfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21iYWxfdG1fc2NoZWRfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21iYWxfdG1fc2NoZWRfaW5kX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtYmFsX3RtX3NjaGVkX2luZDsKKworLyoqIEB9ICovCisjZW5kaWYgLyogQkFMX01PREVMX1RZUEVTICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX21zZy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWE4NWM1Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9tc2cuaApAQCAtMCwwICsxLDM0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qIERlZmluZSB0aGUgdG9wIGxldmVsIERveHlnZW4gZ3JvdXBzLiAqLworCisvKioKKyAqIEBkZWZncm91cCBjb3JlICBCQUwgQ29yZSBFbmdpbmUKKyAqCisgKiBAZGVmZ3JvdXAgYXBwcyAgQkFMIFV0aWxzCisgKgorICogQGRlZmdyb3VwIGxpYiAgIEJBTCBMaWJyYXJpZXMKKyAqCisgKi8KKworLyoqCisgKiBAZmlsZSBiYWxfbXNnLmgKKyAqCisgKiBAYnJpZWYgSW5jbHVkZSBmaWxlcyBhbmQgbWlzY2VsbGFuZW91cyBtYWNyb3MgZm9yIHRoZSBCQUwgbWVzc2FnaW5nCisgKgorICovCisKKyNpZm5kZWYJQkFMTVNHX0gKKyNkZWZpbmUJQkFMTVNHX0gKKworI2luY2x1ZGUgPGJhbF9vYmpzLmg+CisjaW5jbHVkZSA8YmFsX21zZ190eXBlLmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqIEJBTCBtZXNzYWdlIGhlYWRlciBoZWxwZXJzCisgKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworLyoKKyAqIFVuZGVybHlpbmcgbXNnX3NlbmQgdGltZW91dCB1bml0cyBpbiB1UyAobWljcm8gc2Vjb25kcykKKyAqLworI2RlZmluZSBCQ01CQUxfTVNHX1RJTUVPVVRfMV9TRUMgICgxMDAwMDAwKQorCisvKgorICogR2V0IGEgcG9pbnRlciB0byB0aGUgbWVzc2FnZSBwYXlsb2FkIGdpdmVuIHRoZSBiY21vc19tc2cgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmJjbWJhbF9wYXlsb2FkX3B0cl9nZXQoYmFsX2NvbW1fbXNnX2hkciAqX20pCit7CisgICAgLyogcGF5bG9hZCBzdGFydHMgZnJvbSBCQUwgY29tbXVuaWNhdGlvbiBoZWFkZXIgKi8KKyAgICByZXR1cm4gKHZvaWQgKilfbTsKK30KKworLyoKKyAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIEJBTCBoZWFkZXIgZ2l2ZW4gdGhlIG1lc3NhZ2UgcGF5bG9hZCBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgYmFsX2NvbW1fbXNnX2hkciAqYmNtYmFsX2JhbF9oZHJfZ2V0KHZvaWQgKl9tc2dfcGF5bG9hZF9wdHIpCit7CisgICAgLyogcGF5bG9hZCBzdGFydHMgZnJvbSBCQUwgY29tbXVuaWNhdGlvbiBoZWFkZXIgKi8KKyAgICByZXR1cm4gKGJhbF9jb21tX21zZ19oZHIgKilfbXNnX3BheWxvYWRfcHRyOworfQorCisvKgorICogR2V0IGEgcG9pbnRlciB0byB0aGUgQkFMIGhlYWRlciBnaXZlbiB0aGUgYmNtb3MgaGVhZGVyIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSBiYWxfY29tbV9tc2dfaGRyICpiY21iYWxfYmFsX2hkcl9nZXRfYnlfYmNtb3NfaGRyKGJjbW9zX21zZyAqbSkKK3sKKyAgICByZXR1cm4gY29udGFpbmVyX29mKG0sIGJhbF9jb21tX21zZ19oZHIsIG0pOworfQorCisvKgorICogR2V0IGEgcG9pbnRlciB0byB0aGUgQkNNT1MgaGVhZGVyIGdpdmVuIHRoZSBtZXNzYWdlIHBheWxvYWQgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX21zZyAqYmNtYmFsX2JjbW9zX2hkcl9nZXQodm9pZCAqX21zZ19wYXlsb2FkX3B0cikKK3sKKyAgICByZXR1cm4gJihiY21iYWxfYmFsX2hkcl9nZXQoX21zZ19wYXlsb2FkX3B0ciktPm0pOworfQorCisvKgorICogU2V0IHRoZSBCQUwgaGVhZGVyIHBhcmFtZXRlcnMgZ2l2ZW4gdGhlIG1lc3NhZ2UgcGF5bG9hZCBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21iYWxfbXNnX2hkcl9zZXQodm9pZCAqX21zZ19wYXlsb2FkX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbXNnX2lkIF90eXBlX21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfbXNnX3R5cGUgIF90eXBlX21pbm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxfc3Vic3lzdGVtIF9zZW5kZXJfc3Vic3lzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfb2JqX2lkIF9tc2dfaWRfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBfbXNnX2lkX29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IF9leF9pZCkKK3sKKyAgICBiY21vc19tc2cgKm9zX21zZyA9IGJjbWJhbF9iY21vc19oZHJfZ2V0KF9tc2dfcGF5bG9hZF9wdHIpOworICAgIGJhbF9jb21tX21zZ19oZHIgKmJhbF9oZHIgPSBiY21iYWxfYmFsX2hkcl9nZXQoX21zZ19wYXlsb2FkX3B0cik7CisKKyAgICAvKgorICAgICAqIHNldCB1cCB0aGUgYmNtb3NfbXNnIGhlYWRlciBmaWVsZHMKKyAgICAgKi8KKyAgICBvc19tc2ctPmRhdGEgPSAodm9pZCAqKSgoY2hhciAqKShiY21iYWxfYmNtb3NfaGRyX2dldChfbXNnX3BheWxvYWRfcHRyKSkgKyBzaXplb2YoYmNtb3NfbXNnKSk7CisgICAgb3NfbXNnLT5zdGFydCA9IG9zX21zZy0+ZGF0YTsKKyAgICBvc19tc2ctPnR5cGUgPSBfdHlwZV9tYWpvcjsKKyAgICBvc19tc2ctPmluc3RhbmNlID0gMDsKKyAgICBvc19tc2ctPnNlbmRlciA9IEJDTU9TX01PRFVMRV9JRF9OT05FOyAvKiBkb2Vzbid0IG1hdHRlciAqLworCisgICAgLyoKKyAgICAgKiBzZXQgdXAgdGhlIGJhbCBtc2cgaGVhZGVyIGZpZWxkcworICAgICAqLworICAgIGJhbF9oZHItPnZlcnNpb25fbWFqb3IgPSBCQUxfSERSX1ZFUlNJT05fTUFKT1I7CisgICAgYmFsX2hkci0+dmVyc2lvbl9taW5vciA9IEJBTF9IRFJfVkVSU0lPTl9NSU5PUjsKKyAgICBiYWxfaGRyLT5tc2dfdHlwZSA9IF90eXBlX21pbm9yOworICAgIGJhbF9oZHItPm1zZ19pZCA9ICgoYmFsX2hkci0+bXNnX2lkICYgMHgwMDAwRkZGRikgfCAgKChfbXNnX2lkX29wZXIgJiAweDAwMDBGRkZGKSA8PCAxNikpOworICAgIGJhbF9oZHItPm1zZ19pZCA9ICgoYmFsX2hkci0+bXNnX2lkICYgMHhGRkZGMDAwMCkgfCAgKF9tc2dfaWRfb2JqICYgMHgwMDAwRkZGRikpOworICAgIGJhbF9oZHItPmV4X2lkID0gX2V4X2lkOworICAgIGJhbF9oZHItPnNlbmRlciA9IF9zZW5kZXJfc3Vic3lzOworICAgIGJhbF9oZHItPnRpbWVzdGFtcCA9IGJjbW9zX3RpbWVzdGFtcCgpOworfQorCisvKgorICogR2V0IHRoZSBzZW5kZXIgZmllbGQgaW4gdGhlIEJBTCBoZWFkZXIgZ2l2ZW4gdGhlIG1lc3NhZ2UgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIGJhbF9zdWJzeXN0ZW0gYmNtYmFsX3NlbmRlcl9nZXQodm9pZCAqX21zZ19wYXlsb2FkX3B0cikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2JhbF9oZHJfZ2V0KF9tc2dfcGF5bG9hZF9wdHIpLT5zZW5kZXI7Cit9CisKKy8qCisgKiBTZXQgdGhlIHNlbmRlciBmaWVsZCBpbiB0aGUgQkFMIGhlYWRlciBnaXZlbiB0aGUgbWVzc2FnZSBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21iYWxfc2VuZGVyX3NldCh2b2lkICpfbXNnX3BheWxvYWRfcHRyLCBiYWxfc3Vic3lzdGVtIF9zZW5kZXJfc3Vic3lzKQoreworICAgIGJjbWJhbF9iYWxfaGRyX2dldChfbXNnX3BheWxvYWRfcHRyKS0+c2VuZGVyID0gX3NlbmRlcl9zdWJzeXM7Cit9CisKKy8qCisgKiBHZXQgdGhlIHRvcCBsZXZlbCB0eXBlIGZpZWxkIGluIHRoZSBCQUwgaGVhZGVyIGdpdmVuIHRoZSBtZXNzYWdlIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSBiY21vc19tc2dfaWQgYmNtYmFsX3R5cGVfbWFqb3JfZ2V0KHZvaWQgKl9tc2dfcGF5bG9hZF9wdHIpCit7CisgICAgcmV0dXJuIGJjbWJhbF9iY21vc19oZHJfZ2V0KF9tc2dfcGF5bG9hZF9wdHIpLT50eXBlOworfQorCisvKgorICogU2V0IHRoZSB0b3AgbGV2ZWwgdHlwZSBmaWVsZCBpbiB0aGUgQkFMIGhlYWRlciBnaXZlbiB0aGUgbWVzc2FnZSBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21iYWxfdHlwZV9tYWpvcl9zZXQodm9pZCAqX21zZ19wYXlsb2FkX3B0ciwgYmNtb3NfbXNnX2lkIF90eXBlX21ham9yKQoreworICAgIGJjbWJhbF9iY21vc19oZHJfZ2V0KF9tc2dfcGF5bG9hZF9wdHIpLT50eXBlID0gX3R5cGVfbWFqb3I7Cit9CisKKy8qCisgKiBHZXQgdGhlIGlubmVyIHR5cGUgZmllbGQgaW4gdGhlIEJBTCBoZWFkZXIgZ2l2ZW4gdGhlIG1lc3NhZ2UgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIGJjbWJhbF9tc2dfdHlwZSBiY21iYWxfdHlwZV9taW5vcl9nZXQodm9pZCAqX21zZ19wYXlsb2FkX3B0cikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2JhbF9oZHJfZ2V0KF9tc2dfcGF5bG9hZF9wdHIpLT5tc2dfdHlwZTsKK30KKworLyoKKyAqIFNldCB0aGUgaW5uZXIgdHlwZSBmaWVsZCBpbiB0aGUgQkFMIGhlYWRlciBnaXZlbiB0aGUgbWVzc2FnZSBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21iYWxfdHlwZV9taW5vcl9zZXQodm9pZCAqX21zZ19wYXlsb2FkX3B0ciwgYmNtYmFsX21zZ190eXBlIF90eXBlX21pbm9yKQoreworICAgIGJjbWJhbF9iYWxfaGRyX2dldChfbXNnX3BheWxvYWRfcHRyKS0+bXNnX3R5cGUgPSBfdHlwZV9taW5vcjsKK30KKworCisvKgorICogR2V0IHRoZSBtc2dfaWRfb3BlciBmaWVsZCBpbiB0aGUgQkFMIGhlYWRlciBnaXZlbiB0aGUgbWVzc2FnZSBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgYmNtYmFsX21zZ19pZF9vcGVyX2dldCh2b2lkICpfbXNnX3BheWxvYWRfcHRyKQoreworICAgIHJldHVybiAoKGJjbWJhbF9iYWxfaGRyX2dldChfbXNnX3BheWxvYWRfcHRyKS0+bXNnX2lkICYgMHhGRkZGMDAwMCkgPj4gMTYpOworfQorCisvKgorICogU2V0IHRoZSBtc2dfaWRfb3BlciBmaWVsZCBpbiB0aGUgQkFMIGhlYWRlciBnaXZlbiB0aGUgbWVzc2FnZSBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21iYWxfbXNnX2lkX29wZXJfc2V0KHZvaWQgKl9tc2dfcGF5bG9hZF9wdHIsIHVpbnQxNl90IF9tc2dfaWRfb3BlcikKK3sKKyAgICBiY21iYWxfYmFsX2hkcl9nZXQoX21zZ19wYXlsb2FkX3B0ciktPm1zZ19pZCA9CisgICAgICAgICgoYmNtYmFsX2JhbF9oZHJfZ2V0KF9tc2dfcGF5bG9hZF9wdHIpLT5tc2dfaWQgJiAweDAwMDBGRkZGKSB8ICAgKChfbXNnX2lkX29wZXIgJiAweDAwMDBGRkZGKSA8PCAxNikpOworfQorCisvKgorICogR2V0IHRoZSBtc2dfaWRfb2JqIGZpZWxkIGluIHRoZSBCQUwgaGVhZGVyIGdpdmVuIHRoZSBtZXNzYWdlIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSBiY21iYWxfb2JqX2lkIGJjbWJhbF9tc2dfaWRfb2JqX2dldCh2b2lkICpfbXNnX3BheWxvYWRfcHRyKQoreworICAgIHJldHVybiAoYmNtYmFsX2JhbF9oZHJfZ2V0KF9tc2dfcGF5bG9hZF9wdHIpLT5tc2dfaWQgJiAweDAwMDBGRkZGICk7Cit9CisKKy8qCisgKiBTZXQgdGhlIG1zZ19pZF9vYmogZmllbGQgaW4gdGhlIEJBTCBoZWFkZXIgZ2l2ZW4gdGhlIG1lc3NhZ2UgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYmFsX21zZ19pZF9vYmpfc2V0KHZvaWQgKl9tc2dfcGF5bG9hZF9wdHIsIGJjbWJhbF9vYmpfaWQgX21zZ19pZF9vYmopCit7CisgICAgYmNtYmFsX2JhbF9oZHJfZ2V0KF9tc2dfcGF5bG9hZF9wdHIpLT5tc2dfaWQgPQorICAgICAgICAoKGJjbWJhbF9iYWxfaGRyX2dldChfbXNnX3BheWxvYWRfcHRyKS0+bXNnX2lkICYgMHhGRkZGMDAwMCkgfCAoX21zZ19pZF9vYmogJiAweDAwMDBGRkZGKSk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGV4X2lkIGZpZWxkIGluIHRoZSBCQUwgaGVhZGVyIGdpdmVuIHRoZSBtZXNzYWdlIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBiY21iYWxfZXhfaWRfZ2V0KHZvaWQgKl9tc2dfcGF5bG9hZF9wdHIpCit7CisgICAgcmV0dXJuIGJjbWJhbF9iYWxfaGRyX2dldChfbXNnX3BheWxvYWRfcHRyKS0+ZXhfaWQ7Cit9CisKKy8qCisgKiBTZXQgdGhlIGV4X2lkIGZpZWxkIGluIHRoZSBCQUwgaGVhZGVyIGdpdmVuIHRoZSBtZXNzYWdlIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbWJhbF9leF9pZF9zZXQodm9pZCAqX21zZ19wYXlsb2FkX3B0ciwgdWludDMyX3QgX2V4X2lkKQoreworICAgIGJjbWJhbF9iYWxfaGRyX2dldChfbXNnX3BheWxvYWRfcHRyKS0+ZXhfaWQgPSBfZXhfaWQ7Cit9CisKKy8qCisgKiBHZXQgdGhlIG1ham9yIHZlcnNpb24gZmllbGQgaW4gdGhlIEJBTCBoZWFkZXIgZ2l2ZW4gdGhlIG1lc3NhZ2UgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGJjbWJhbF9tYWpvcl92ZXJzaW9uX2dldCh2b2lkICpfbXNnX3BheWxvYWRfcHRyKQoreworICAgIHJldHVybiBiY21iYWxfYmFsX2hkcl9nZXQoX21zZ19wYXlsb2FkX3B0ciktPnZlcnNpb25fbWFqb3I7Cit9CisKKy8qCisgKiBTZXQgdGhlIG1ham9yIHZlcnNpb24gZmllbGQgaW4gdGhlIEJBTCBoZWFkZXIgZ2l2ZW4gdGhlIG1lc3NhZ2UgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgIGJjbWJhbF9tYWpvcl92ZXJzaW9uX3NldCh2b2lkICpfbXNnX3BheWxvYWRfcHRyLCB1aW50MTZfdCBfdmVyc2lvbl9tYWpvcikKK3sKKyAgICBiY21iYWxfYmFsX2hkcl9nZXQoX21zZ19wYXlsb2FkX3B0ciktPnZlcnNpb25fbWFqb3IgPSBfdmVyc2lvbl9tYWpvcjsKK30KKworLyoKKyAqIEdldCB0aGUgbWlub3IgdmVyc2lvbiBmaWVsZCBpbiB0aGUgQkFMIGhlYWRlciBnaXZlbiB0aGUgbWVzc2FnZSBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgYmNtYmFsX21pbm9yX3ZlcnNpb25fZ2V0KHZvaWQgKl9tc2dfcGF5bG9hZF9wdHIpCit7CisgICAgcmV0dXJuIGJjbWJhbF9iYWxfaGRyX2dldChfbXNnX3BheWxvYWRfcHRyKS0+dmVyc2lvbl9taW5vcjsKK30KKworLyoKKyAqIFNldCB0aGUgbWlub3IgdmVyc2lvbiBmaWVsZCBpbiB0aGUgQkFMIGhlYWRlciBnaXZlbiB0aGUgbWVzc2FnZSBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21iYWxfbWlub3JfdmVyc2lvbl9zZXQodm9pZCAqX21zZ19wYXlsb2FkX3B0ciwgdWludDE2X3QgX3ZlcnNpb25fbWFqb3IpCit7CisgICAgYmNtYmFsX2JhbF9oZHJfZ2V0KF9tc2dfcGF5bG9hZF9wdHIpLT52ZXJzaW9uX21ham9yID0gX3ZlcnNpb25fbWFqb3I7Cit9CisKKy8qCisgKiBHZXQgdGhlIHNjcmF0Y2hwYWQgZmllbGQgaW4gdGhlIEJBTCBoZWFkZXIgZ2l2ZW4gdGhlIG1lc3NhZ2UgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmJjbWJhbF9zY3JhdGNocGFkX2dldCh2b2lkICpfbXNnX3BheWxvYWRfcHRyKQoreworICAgIHJldHVybiBiY21iYWxfYmFsX2hkcl9nZXQoX21zZ19wYXlsb2FkX3B0ciktPnNjcmF0Y2hwYWQ7Cit9CisKKy8qCisgKiBTZXQgdGhlIHNjcmF0Y2hwYWQgZmllbGQgaW4gdGhlIEJBTCBoZWFkZXIgZ2l2ZW4gdGhlIG1lc3NhZ2UgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYmFsX3NjcmF0Y2hwYWRfc2V0KHZvaWQgKl9tc2dfcGF5bG9hZF9wdHIsIHZvaWQgKl9zY3JhdGNocGFkKQoreworICAgIGJjbWJhbF9iYWxfaGRyX2dldChfbXNnX3BheWxvYWRfcHRyKS0+c2NyYXRjaHBhZCA9IF9zY3JhdGNocGFkOworfQorCisvKgorICogQWxsb2NhdGUgYSBCQUwgbWVzc2FnZSBnaXZlbiB0aGUgcGF5bG9hZCBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqYmNtYmFsX21zZ19jYWxsb2ModWludDMyX3QgX21zZ19wYXlsb2FkX3NpemUpCit7CisgICAgLyogUGF5bG9hZCBpbmNsdWRlcyBjb21tIGhlYWRlciAqLworICAgIGJhbF9jb21tX21zZ19oZHIgKm0gPSBiY21vc19jYWxsb2MoX21zZ19wYXlsb2FkX3NpemUpOworICAgIGlmIChOVUxMID09IG0pCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBiY21iYWxfcGF5bG9hZF9wdHJfZ2V0KG0pOworfQorCisvKgorICogRnJlZSBhIEJBTCBtZXNzYWdlIGdpdmVuIHRoZSBwYXlsb2FkIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbWJhbF9tc2dfZnJlZSh2b2lkICptc2cpCit7CisgICAgcmV0dXJuIGJjbW9zX21zZ19mcmVlKGJjbWJhbF9iY21vc19oZHJfZ2V0KG1zZykpOworfQorCisvKgorICogRXh0ZXJuYWwgZnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGJhbF9tc2cuYworICovCisKKy8qCisgKiBDbG9uZSBCQUwgbWVzc2FnZQorICogUmV0dXJucyBwYXlsb2FkX3B0ciBvZiB0aGUgY2xvbmUKKyAqLwordm9pZCAqYmNtYmFsX21zZ19jbG9uZSh2b2lkICpiYWxfb2JqKTsKKworLyoKKyAqIFNlbmQgYSBCQUwgbWVzc2FnZSBnaXZlbiB0aGUgcGF5bG9hZCBwb2ludGVyCisgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9tc2dfc2VuZChiY21vc19tc2dfcXVldWUgKnF1ZXVlLCB2b2lkICptc2dfcGF5bG9hZCwgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgZmxhZ3MpOworCisvKgorICogQ2FsbCBjYWxsYmFjayBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGFyZ2V0IG1vZHVsZSBhbmQgcGFzcyBpdCB0aGUgQkFMIG1lc3NhZ2UgcG9pbnRlcgorICovCitiY21vc19lcnJubyBiY21iYWxfbXNnX2NhbGwodm9pZCAqbXNnX3BheWxvYWQsIGJjbW9zX21vZHVsZV9pZCBtb2R1bGUsIEZfYmNtb3NfbXNnX2hhbmRsZXIgY2IsIGJjbW9zX21zZ19zZW5kX2ZsYWdzIGZsYWdzKTsKKworLyoKKyAqIFJlY2VpdmUgYSBCQUwgbWVzc2FnZSBnaXZlbiB0aGUgcGF5bG9hZCBwb2ludGVyCisgKgorICogTk9URTogVGhlIHRpbWVvdXQgYXJndW1lbnQgaXMgaW4gdW5pdHMgb2YgdVMgKG1pY3JvIHNlY29uZHMpLiAgVXNlIHRoZSAjZGVmaW5lZCB0aW1lb3V0IHZhbHVlcyBhYm92ZS4KKyAqCisgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9tc2dfcmVjdihiY21vc19tc2dfcXVldWUgKnF1ZXVlLCB1aW50MzJfdCB0aW1lb3V0LCB2b2lkICoqbXNnX3BheWxvYWQpOworCisvKiogR2V0IHBhY2tlZCBiYWxfY29tbV9tc2dfaGRyIGxlbmd0aCAqLworaW50MzJfdCBiY21iYWxfYmFsX21zZ19oZHJfZ2V0X3BhY2tlZF9sZW5ndGgodm9pZCk7CisKKy8qKiBQYWNrIGEgQkFMIG1lc3NhZ2UgaGVhZGVyIHRvIGEgYnl0ZSBzdHJlYW0gKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9iYWxfbXNnX2hkcl9wYWNrKGNvbnN0IGJhbF9jb21tX21zZ19oZHIgKm1zZywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFjayBhIEJBTCBtZXNzYWdlIGhlYWRlciBmcm9tIGEgYnl0ZSBzdHJlYW0gKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9iYWxfbXNnX2hkcl91bnBhY2soYmFsX2NvbW1fbXNnX2hkciAqbXNnLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGVlayBleGNoYW5nZV9pZCBpbiB0aGUgcmVjZWl2ZWQgbWVzc2FnZSB3aXRob3V0IHVucGFja2luZyAqLworYmNtb3NfZXJybm8gYmNtYmFsX2JhbF9tc2dfcGVla19leF9pZChiY21vc19tc2cgKm1zZywgdWludDMyX3QgKmV4X2lkKTsKKworI2VuZGlmIC8qICNpZm5kZWYgQkFMTVNHX0ggKi8KKworCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vaW5jbHVkZS9iYWxfbXNnX3R5cGUuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vaW5jbHVkZS9iYWxfbXNnX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGU5OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9tc2dfdHlwZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisjaWZuZGVmIF9CQUxfTVNHX1RZUEVfSF8KKyNkZWZpbmUgX0JBTF9NU0dfVFlQRV9IXworCisvKgorICogICogVGhlIEJBTCBtZXNzYWdlIHN1YnR5cGUKKyAqICAgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJBTF9NU0dfVFlQRV9SRVEsCisgICAgQkFMX01TR19UWVBFX1JTUCwKKyAgICBCQUxfTVNHX1RZUEVfQUNLLAorICAgIEJBTF9NU0dfVFlQRV9JTkQsICAgICAgLyoqPCBBbiBJTkRpY2F0aW9uIG1lc3NhZ2UgZ2VuZXJhdGVkIGFzIGEgcGFydCBvZiBhIHByb3RvY29sIGV4Y2hhbmdlICAqLworICAgIEJBTF9NU0dfVFlQRV9BVVRPX0lORCwgLyoqPCBBbiBhc3luY2hyb25vdXMgYXV0b25vbW91cyBJTkRpY2F0aW9uIG1lc3NhZ2UgICovCit9IGJjbWJhbF9tc2dfdHlwZTsKKworc3RhdGljIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBjaGFyICpiY21iYWxfbXNnX3Rfc3RyW10gPSAKK3sKKyAgICAiQkFMX01TR19SRVEiLAorICAgICJCQUxfTVNHX1JTUCIsCisgICAgIkJBTF9NU0dfQUNLIiwKKyAgICAiQkFMX01TR19JTkQiLCAgICAgICAgIC8qKjwgQW4gSU5EaWNhdGlvbiBtZXNzYWdlIGdlbmVyYXRlZCBhcyBhIHBhcnQgb2YgYSBwcm90b2NvbCBleGNoYW5nZSAgKi8KKyAgICAiQkFMX01TR19BVVRPX0lORCIgICAgIC8qKjwgQW4gYXN5bmNocm9ub3VzIGF1dG9ub21vdXMgSU5EaWNhdGlvbiBtZXNzYWdlICAqLworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vaW5jbHVkZS9iYWxfb2JqLmggYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX29iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZThlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX29iai5oCkBAIC0wLDAgKzEsMjA1IEBACisjaWZuZGVmIEJBTF9PQkoKKyNkZWZpbmUgQkFMX09CSgorCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb3NfZXJybm8uaD4KKyNpbmNsdWRlICJiYWxfbW9kZWxfaWRzLmgiCisjaW5jbHVkZSAiYmFsX2J1Zi5oIgorI2luY2x1ZGUgImJhbF9tc2dfdHlwZS5oIgorCisvKgorICogVGhlIGN1cnJlbnQgQkFMIGhlYWRlciB2ZXJzaW9uCisgKi8KKyNkZWZpbmUgQkFMX0hEUl9WRVJTSU9OX01BSk9SICAgICgxKQorI2RlZmluZSBCQUxfSERSX1ZFUlNJT05fTUlOT1IgICAgKDEpCisKKy8qCisgKiBUaGUgQkFMIGNvbW1vbiBtZXNzYWdlIGhlYWRlcgorICovCit0eXBlZGVmIHN0cnVjdCBiYWxfY29tbV9tc2dfaGRyCit7CisgICAgYmNtb3NfbXNnICAgICAgICBtOyAgICAgICAgICAgICAgIC8qKjwgYmNtb3MgbWVzc2FnZSBoZWFkZXIgKi8KKyAgICB1aW50MTZfdCAgICAgICAgIHZlcnNpb25fbWFqb3I7ICAgLyoqPCBIZWFkZXIgTWFqb3IgdmVyc2lvbiBudW1iZXIgKi8KKyAgICB1aW50MTZfdCAgICAgICAgIHZlcnNpb25fbWlub3I7ICAgLyoqPCBIZWFkZXIgTWlub3IgdmVyc2lvbiBudW1iZXIgKi8KKyAgICBiY21iYWxfbXNnX3R5cGUgIG1zZ190eXBlOyAgICAgICAgLyoqPCBSZXF1ZXN0IC8gUmVzcG9uc2UgLyBBY2sgLyBJbmRpY2F0aW9uICovCisgICAgdWludDMyX3QgICAgICAgICBtc2dfaWQ7ICAgICAgICAgIC8qKjwgTWVzc2FnZSBJRCDigJMgdGhlIElEIG9mIHRoZSBtZXNzYWdlIChzdWJJRCB1bmRlciB0aGUgbWVzc2FnZSB0eXBlKSAqLworICAgIHVpbnQzMl90ICAgICAgICAgZXhfaWQ7ICAgICAgICAgICAvKio8IEV4Y2hhbmdlIElEIGZvciBtZXNzYWdlIHRyYWNraW5nIGJldHdlZW4gZW5kcG9pbnRzICovCisgICAgYmFsX3N1YnN5c3RlbSAgICBzZW5kZXI7ICAgICAgICAgIC8qKjwgU2VuZGVyIHN1YnN5c3RlbSAtIHVzZWQgZm9yIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiAqLworICAgIHVpbnQzMl90ICAgICAgICAgdGltZXN0YW1wOyAgICAgICAvKio8IFRpbWVzdGFtcCB3aGVuIHRoZSBtZXNzYWdlIHdhcyBzZW50ICovCisgICAgYmNtb3Nfc2VtICAgICAgICBzZW07ICAgICAgICAgICAgIC8qKjwgU2VtYXBob3JlIHVzZWQgZm9yIGludGVyLXRocmVhZCBjb21tdW5pY2F0aW9uICovCisgICAgdm9pZCogICAgICAgICAgICBzY3JhdGNocGFkOyAgICAgIC8qKjwgU2NyYXRjaHBhZCB1c2VkIGZvciBpbnRlci10aHJlYWQgY29tbXVuaWNhdGlvbiAqLworICAgIHVpbnQ4X3QgICAgICAgICAgcGF5bG9hZFtdOyAgICAgICAvKio8IFBheWxvYWQgZm9sbG93cyB0aGUgaGVhZGVyICovCit9IGJhbF9jb21tX21zZ19oZHI7CisKKy8qKiBWZXJzaW9uIG9mIE9iamVjdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBCQ01CQUxfT0JKX1ZFUlNJT04gICAgIDIgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGN1cnJlbnQgdmVyc2lvbiBudW1iZXIgKi8KK3R5cGVkZWYgdWludDMyX3QgYmNtYmFsX29iamVjdF92ZXI7ICAgICAgICAgICAgICAvKio8IFRoZSBhdHRyaWJ1dGUgdHlwZSBpbiB0aGUgb2JqZWN0IGluZm8gc3RydWN0dXJlICovCisKKy8qKiBCaXRtYXNrIG9mIG9iamVjdCBhdHRyaWJ1dGVzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiBhbiBvYmplY3QgKDEgPSBzcGVjaWZpZWQsIDAgPSBub3Qgc3BlY2lmaWVkKSAqLwordHlwZWRlZiB1aW50NjRfdCBiY21iYWxfcHJlc2VuY2VfbWFzazsKKworLyoqIFByZXNlbmNlIG1hc2sgaW5kaWNhdGluZyBhbGwgZmllbGRzIHByZXNlbnQgKi8KKyNkZWZpbmUgQkNNQkFMX1BSRVNFTkNFX01BU0tfQUxMICgoYmNtYmFsX3ByZXNlbmNlX21hc2spMHhGRkZGRkZGRkZGRkZGRkZGKQorCisvKiogSGVscGVyIHR5cGUgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIGRhdGEgZm9ybWF0IG9mIGEgbWVzc2FnZSBzaG91bGQgbG9vayBsaWtlICovCit0eXBlZGVmIGVudW0gYmNtYmFsX21ndF9ncm91cAoreworICAgIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAgICAgICAgICAgICAgIC8qKjwgS2V5IHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBvYmplY3QgaW5zdGFuY2UgKi8KKyAgICBCQ01CQUxfTUdUX0dST1VQX0NGRywgICAgICAgICAgICAgICAvKio8IENvbmZpZ3VyYXRpb24gKGdldC9zZXQvY2xlYXIpICovCisgICAgQkNNQkFMX01HVF9HUk9VUF9TVEFULCAgICAgICAgICAgICAgLyoqPCBTdGF0aXN0aWNzICovCisgICAgQkNNQkFMX01HVF9HUk9VUF9BVVRPLCAgICAgICAgICAgICAgLyoqPCBBdXRvbm9tb3VzIGluZGljYXRpb25zICovCisgICAgQkNNQkFMX01HVF9HUk9VUF9BVVRPX0NGRywgICAgICAgICAgLyoqPCBBdXRvbm9tb3VzIGluZGljYXRpb24gY29uZmlndXJhdGlvbiAqLworICAgIEJDTUJBTF9NR1RfR1JPVVBfX05VTV9PRgorfSBiY21iYWxfbWd0X2dyb3VwOworCisvKiogT2JqZWN0IG1lc3NhZ2UgdHlwZS4gQ2FuIGJlIGEgY29tYmluYXRpb24gb2YgZmxhZ3MuICovCit0eXBlZGVmIGVudW0gYmNtYmFsX29ial9tc2dfdHlwZQoreworICAgIEJDTUJBTF9PQkpfTVNHX1RZUEVfR0VUICAgPSAweDAxLCAgIC8qKjwgR2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworICAgIEJDTUJBTF9PQkpfTVNHX1RZUEVfU0VUICAgPSAweDAyLCAgIC8qKjwgU2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworICAgIEJDTUJBTF9PQkpfTVNHX1RZUEVfQ0xFQVIgPSAweDA0LCAgIC8qKjwgQ2xlYXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCit9IGJjbWJhbF9vYmpfbXNnX3R5cGU7CisKKy8qKiBPYmplY3QgbWVzc2FnZSBkaXJlY3Rpb24gLSByZXF1ZXN0IG9yIHJlc3BvbnNlLiAqLwordHlwZWRlZiBlbnVtIGJjbWJhbF9vYmpfbXNnX2RpcgoreworICAgIEJDTUJBTF9PQkpfTVNHX0RJUl9SRVFVRVNULAorICAgIEJDTUJBTF9PQkpfTVNHX0RJUl9SRVNQT05TRQorfSBiY21iYWxfb2JqX21zZ19kaXI7CisKKyNkZWZpbmUgQkNNQkFMX09CSl9JTklUX1ZBTCAgMHhkZWFkYmVlZiAvKio8IFRoZSB2YWx1ZSBvZiB0aGUgb2JqX2luaXRfdmFsIGFmdGVyIG1hY3JvIGluaXRpYWxpemF0aW9uICovCisKKy8qKiBJbmZvcm1hdGlvbiBjb21tb24gdG8gYWxsIEJBTCBvYmplY3RzICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfb2JqCit7CisgICAgYmFsX2NvbW1fbXNnX2hkciAgICAgY29tbV9oZHI7ICAgICAgLyoqPCBDb21tdW5pY2F0aW9uIGhlYWRlciAqLworICAgIGJjbWJhbF9vYmplY3RfdmVyICAgIHZlcnNpb247ICAgICAgIC8qKjwgVmVyc2lvbiBvZiB0aGUgT2JqZWN0IGRlZmluaXRpb24vc3RydWN0dXJlICovCisgICAgYmNtYmFsX29ial9pZCAgICAgICAgb2JqX3R5cGU7ICAgICAgLyoqPCBBbiBlbnVtZXJhdGVkIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IGJlaW5nIHNwZWNpZmllZCAqLworICAgIGJjbWJhbF9tZ3RfZ3JvdXAgICAgIGdyb3VwOyAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBncm91cCAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgIHN1Ymdyb3VwOyAgICAgIC8qKjwgU3ViZ3JvdXAgZm9yIGluZGljYXRpb25zICovCisgICAgYmNtYmFsX29ial9tc2dfdHlwZSAgdHlwZTsgICAgICAgICAgLyoqPCBUeXBlIChlLmcuIGdldCAvIHNldCAvIGNsZWFyKSAgKi8KKyAgICBiY21iYWxfb2JqX21zZ19kaXIgICBkaXI7ICAgICAgICAgICAvKio8IERpcmVjdGlvbiAtIHJlcXVlc3QgLyByZXNwb25zZSAqLworICAgIGJjbW9zX2Vycm5vCQkgICAgIHN0YXR1czsgICAgICAgIC8qKjwgQkFMIHN0YXR1cyBjb2RlIChCQ01fRVJSX09L4oCTc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UpICovCisgICAgYmNtYmFsX3ByZXNlbmNlX21hc2sgcHJlc2VuY2VfbWFzazsgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggYXR0cmlidXRlIHBhcmFtZXRlcnMgYXJlIHByZXNlbnQgKi8KKworICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBpbnRlcm5hbC4gVGhleSBhcmUgbm90IHNlbnQgb24gdGhlIGxpbmUgKi8KKyAgICBiY21vc19ib29sICAgICAgICAgICBpc19pbnByb2dyZXNzOyAvKio8IFJPIC0gV2hlbiBzZXQgdG8gVFJVRTogT2JqZWN0IGlzIGNoYW5naW5nIHN0YXRlIGludGVybmFsbHkgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICpsaXN0X2J1ZjsgICAgICAvKio8IE1lbW9yeSBidWZmZXIgaW4gd2hpY2ggdG8gc3RvcmUgdmFyaWFibGUtc2l6ZWQgbGlzdHMgd2hlbiB1bnBhY2tpbmcgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgICBsaXN0X2J1Zl9zaXplOyAvKio8IE51bWJlciBvZiBieXRlcyBpbiB0aGUgdmFyaWFibGUtc2l6ZWQgbGlzdCBidWZmZXIgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgICBvYmpfaW5pdF92YWw7ICAvKio8IEFuIGZpZWxkIHRoYXQgaXMgc2V0IG9uIElOSVQgbWFjcm8gY2FsbCwgYW5kIGNoZWNrZWQgYnkgdGhlIEFQSSAqLworfSBiY21iYWxfb2JqOworCisvKiogSW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB1c2Ugd2l0aCBCQUwgY29uZmlndXJhdGlvbiBBUEkgKGdldC9zZXQvY2xlYXIpICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfY2ZnCit7CisgICAgYmNtYmFsX29iaiBoZHI7Cit9IGJjbWJhbF9jZmc7CisKKy8qKiBJbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIEJBTCBzdGF0aXN0aWNzIEFQSSAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX3N0YXQKK3sKKyAgICBiY21iYWxfb2JqIGhkcjsKK30gYmNtYmFsX3N0YXQ7CisKKy8qKiBJbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIEJBTCBpbmRpY2F0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2F1dG8KK3sKKyAgICBiY21iYWxfb2JqIGhkcjsKK30gYmNtYmFsX2F1dG87CisKKy8qKiBJbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIEJBTCBpbmRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gQVBJICovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfYXV0b19jZmcKK3sKKyAgICBiY21iYWxfb2JqIGhkcjsKK30gYmNtYmFsX2F1dG9fY2ZnOworCisvKiogV2hldGhlciB3ZSBwYWNrIHRoZSBlbnRpcmUgc3RydWN0dXJlIG9mIGEgbWVzc2FnZSAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbWJhbF9vYmpfbXNnX3Nob3VsZF9wYWNrX2RhdGEoY29uc3QgYmNtYmFsX29iaiAqbXNnKQoreworICAgIHN3aXRjaCAobXNnLT5ncm91cCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9TVEFUOgorICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICBpZiAoKG1zZy0+dHlwZSAmIEJDTUJBTF9PQkpfTVNHX1RZUEVfR0VUKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG1zZy0+ZGlyID09IEJDTUJBTF9PQkpfTVNHX0RJUl9SRVNQT05TRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgobXNnLT50eXBlICYgQkNNQkFMX09CSl9NU0dfVFlQRV9TRVQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAobXNnLT5kaXIgPT0gQkNNQkFMX09CSl9NU0dfRElSX1JFUVVFU1QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorfQorCisvKiogR2V0IHRoZSBwYWNrZWQgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgcG9ydGlvbiBvZiBhbiBvYmplY3QgbWVzc2FnZSAqLworc3RhdGljIGlubGluZSBpbnQzMl90IGJjbWJhbF9vYmpfbXNnX2hkcl9nZXRfcGFja2VkX2xlbmd0aCh2b2lkKQoreworICAgIHJldHVybiAyNDsKK30KKworLyoqIFBhY2sgYSBtZXNzYWdlIGhlYWRlciB0byBhIGJ5dGUgc3RyZWFtICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGJjbWJhbF9vYmpfbXNnX2hkcl9wYWNrKGNvbnN0IGJjbWJhbF9vYmogKm1zZywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIGJjbW9zX2Jvb2wgcmV0OworCisgICAgcmV0ID0gICAgICAgIGJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KW1zZy0+dmVyc2lvbik7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCAodWludDMyX3QpbXNnLT5vYmpfdHlwZSk7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCltc2ctPmdyb3VwKTsKKyAgICByZXQgPSByZXQgJiYgYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCBtc2ctPnN1Ymdyb3VwKTsKKyAgICByZXQgPSByZXQgJiYgYmNtYmFsX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KW1zZy0+dHlwZSk7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCltc2ctPmRpcik7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfd3JpdGVfczE2KGJ1ZiwgKGludDE2X3QpbXNnLT5zdGF0dXMpOworICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsIChpbnQzMl90KW1zZy0+aXNfaW5wcm9ncmVzcyk7ICAgIAorICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsICh1aW50NjRfdCltc2ctPnByZXNlbmNlX21hc2spOworCisgICAgcmV0dXJuIHJldCA/IEJDTV9FUlJfT0sgOiBCQ01fRVJSX09WRVJGTE9XOworfQorCisvKiogVW5wYWNrIGEgbWVzc2FnZSBoZWFkZXIgZnJvbSBhIGJ5dGUgc3RyZWFtICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGJjbWJhbF9vYmpfbXNnX2hkcl91bnBhY2soYmNtYmFsX29iaiAqbXNnLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgICB2ZXJzaW9uOworICAgIHVpbnQ4X3QgICAgb2JqX3R5cGU7CisgICAgdWludDhfdCAgICBncm91cDsKKyAgICB1aW50MTZfdCAgIHN1Ymdyb3VwOworICAgIHVpbnQ4X3QgICAgdHlwZTsKKyAgICB1aW50OF90ICAgIGRpcjsKKyAgICBpbnQxNl90ICAgIHN0YXR1czsKKyAgICB1aW50MzJfdCAgIGlzX2lucHJvZ3Jlc3M7CisgICAgdWludDY0X3QgICBwcmVzZW5jZV9tYXNrOworICAgIGJjbW9zX2Jvb2wgcmV0OworCisgICAgcmV0ID0gICAgICAgIGJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmdmVyc2lvbik7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfcmVhZF91OChidWYsICZvYmpfdHlwZSk7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfcmVhZF91OChidWYsICZncm91cCk7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmc3ViZ3JvdXApOworICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmdHlwZSk7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfcmVhZF91OChidWYsICZkaXIpOworICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3JlYWRfczE2KGJ1ZiwgJnN0YXR1cyk7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmaXNfaW5wcm9ncmVzcyk7ICAgIAorICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3JlYWRfdTY0KGJ1ZiwgJnByZXNlbmNlX21hc2spOworICAgIGlmIChyZXQpCisgICAgeworICAgICAgICBtc2ctPnZlcnNpb24gPSAoYmNtYmFsX29iamVjdF92ZXIpdmVyc2lvbjsKKyAgICAgICAgbXNnLT5vYmpfdHlwZSA9IChiY21iYWxfb2JqX2lkKW9ial90eXBlOworICAgICAgICBtc2ctPmdyb3VwID0gKGJjbWJhbF9tZ3RfZ3JvdXApZ3JvdXA7CisgICAgICAgIG1zZy0+c3ViZ3JvdXAgPSBzdWJncm91cDsKKyAgICAgICAgbXNnLT50eXBlID0gKGJjbWJhbF9vYmpfbXNnX3R5cGUpdHlwZTsKKyAgICAgICAgbXNnLT5kaXIgPSAoYmNtYmFsX29ial9tc2dfZGlyKWRpcjsKKyAgICAgICAgbXNnLT5zdGF0dXMgPSAoYmNtb3NfZXJybm8pc3RhdHVzOworICAgICAgICBtc2ctPmlzX2lucHJvZ3Jlc3MgPSAoYmNtb3NfYm9vbClpc19pbnByb2dyZXNzOworICAgICAgICBtc2ctPnByZXNlbmNlX21hc2sgPSAoYmNtYmFsX3ByZXNlbmNlX21hc2spcHJlc2VuY2VfbWFzazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0ID8gQkNNX0VSUl9PSyA6IEJDTV9FUlJfT1ZFUkZMT1c7Cit9CisKKyNlbmRpZiAvKiBCQUxfT0JKICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX29ianMuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vaW5jbHVkZS9iYWxfb2Jqcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTNjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX29ianMuaApAQCAtMCwwICsxLDk4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKgorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKgorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEBmaWxlIGJhbF9vYmpzLmgKKyAqIEBicmllZiBUaGUgZmlsZSBwcm92aWRlcyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgQkFMIG9iamVjdHMKKyAqCisgKi8KKyNpZm5kZWYgQkFMT0JKU19ICisjZGVmaW5lIEJBTE9CSlNfSAorCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisjaW5jbHVkZSAiYmFsX2NvbW1vbi5oIgorI2luY2x1ZGUgImJhbF9tb2RlbF9pZHMuaCIKKyNpbmNsdWRlICJiYWxfbW9kZWxfdHlwZXMuaCIKKworLyoqIFxpbmdyb3VwIGFwaQorICogQHsKKyAqLworCitzdGF0aWMgY2hhciAqYmFsX29ial9zdHJbXSA9Cit7CisgICAgW2JjbWJhbF9vYmpfaWRfYWNjZXNzX3Rlcm1pbmFsXSA9ICAgICAiYWNjZXNzX3Rlcm1pbmFsIG9iamVjdCIsCisgICAgW2JjbWJhbF9vYmpfaWRfaW50ZXJmYWNlXSA9ICAgICAgICAgICAiaW50ZXJmYWNlIG9iamVjdCIsCisgICAgW2JjbWJhbF9vYmpfaWRfc3Vic2NyaWJlcl90ZXJtaW5hbF0gPSAic3Vic2NyaWJlcl90ZXJtaW5hbCBvYmplY3QiLAorICAgIFtiY21iYWxfb2JqX2lkX2Zsb3ddID0gICAgICAgICAgICAgICAgImZsb3cgb2JqZWN0IiwKKyAgICBbYmNtYmFsX29ial9pZF9wYWNrZXRdID0gICAgICAgICAgICAgICJwYWNrZXQgb2JqZWN0IiwKKyAgICBbYmNtYmFsX29ial9pZF9ncm91cF0gPSAgICAgICAgICAgICAgICJncm91cCBvYmplY3QiLAorICAgIFtiY21iYWxfb2JqX2lkX3RtX3NjaGVkXSA9ICAgICAgICAgICAgInNjaGVkdWxlciBvYmplY3QiLAorICAgIFtiY21iYWxfb2JqX2lkX3RtX3F1ZXVlXSA9ICAgICAgICAgICAgInF1ZXVlIG9iamVjdCIsCit9OworCisvKiBFbnN1cmUgdGhhdCB0aGUgbmFtZSBhcnJheSBzaXplIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgZW51bSAqLworQkFMX1NUQVRJQ19BU1NFUlQgKEJDTUJBTF9PQkpfSURfX05VTV9PRiA9PSAoc2l6ZW9mIChiYWxfb2JqX3N0cikgLyBzaXplb2YgKGNoYXIgKikpLCBiY21iYWxfb2JqX2lkKTsKKworc3RhdGljIGlubGluZSBjaGFyICpiY21iYWxfb2JqdHlwZV9zdHIoYmNtYmFsX29ial9pZCBvYmopCit7CisgICAgcmV0dXJuIChCQ01CQUxfT0JKX0lEX19OVU1fT0YgPj0gb2JqKSA/IGJhbF9vYmpfc3RyW29ial0gOiAidW5rbm93biI7Cit9CisKKyNkZWZpbmUgQkNNQkFMX0ZMT1dfUFJJT1JJVFlfTUFYICAgICAgNjU1MzUKKyNkZWZpbmUgQkNNQkFMX0ZMT1dfUFJJT1JJVFlfTUlOICAgICAgMAorI2RlZmluZSBCQUxfRkxPV19ERUZBVUxUX1BSSU9SSVRZICAgICAxMAorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSW50ZXJuYWwgQkNNQkFMIG1hY3JvcyB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIEJBTCBvYmplY3QgZWxlbWVudHMKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiBJbml0aWFsaXplIHJlcXVlc3QuIEludGVybmFsIG1hY3JvCisgKiBcaW5ncm91cCBhcGkKKyAqIFxwYXJhbVtpbl0gICBfaCAgICAgIE1lc3NhZ2UgaGVhZGVyCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgbmFtZSAoaS5lLiBmbG93KQorICogXHBhcmFtW2luXSAgIF9ncnAgICAgbWVzc2FnZSB0eXBlCisgKiBccGFyYW1baW5dICAgX3N1YmdycCBtZXNzYWdlIHN1Ymdyb3VwCisgKi8KKyNkZWZpbmUgX0JDTUJBTF9SRVFfSU5JVChfaCwgX29iaiwgX2dycCwgX3N1YmdycCkgXAorICAgIChfaCktPm9ial9pbml0X3ZhbCA9IEJDTUJBTF9PQkpfSU5JVF9WQUw7IFwKKyAgICAoX2gpLT52ZXJzaW9uID0gQkNNQkFMX09CSl9WRVJTSU9OOyBcCisgICAgKF9oKS0+c3RhdHVzID0gQkNNX0VSUl9PSzsgXAorICAgIChfaCktPnByZXNlbmNlX21hc2sgPSAwOyBcCisgICAgKF9oKS0+b2JqX3R5cGUgPSBiY21iYWxfb2JqX2lkXyAjIyBfb2JqOyBcCisgICAgKF9oKS0+Z3JvdXAgPSBfZ3JwOyBcCisgICAgKF9oKS0+c3ViZ3JvdXAgPSBfc3ViZ3JwOworCisvKiogSW5pdGlhbGl6ZSBzZXQgc3RydWN0dXJlCisgKiBcaW5ncm91cCBhcGkKKyAqIFxwYXJhbVtpbl0gICBfcyAgICAgIFNldCBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCBuYW1lIChpLmUuIGZsb3cpCisgKiBccGFyYW1baW5dICAgX2tleSAgICBPYmplY3Qga2V5CisgKi8KKyNkZWZpbmUgQkNNQkFMX0NGR19JTklUKF9zLCBfb2JqLCBfa2V5KSBcCisgICAgZG8geyBcCisgICAgICAgIGJjbWJhbF8gIyMgX29iaiAjIyBfY2ZnICpfeF8gPSBfczsgXAorICAgICAgICBtZW1zZXQoX3hfLCAwLCBzaXplb2YoKl94XykpOyBcCisgICAgICAgIF9CQ01CQUxfUkVRX0lOSVQoJigoX3hfKS0+aGRyLmhkciksIF9vYmosIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwKTsgXAorICAgICAgICAoX3hfKS0+a2V5ID0gX2tleTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qKiBJbml0aWFsaXplIHN0YXRpc3RpY3Mgc3RydWN0dXJlCisgKiBcaW5ncm91cCBhcGkKKyAqIFxwYXJhbVtpbl0gICBfcyAgICAgIFN0YXRpc3RpY3Mgc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgbmFtZSAoaS5lLiBmbG93KQorICogXHBhcmFtW2luXSAgIF9rZXkgICAgT2JqZWN0IGtleQorICovCisjZGVmaW5lIEJDTUJBTF9TVEFUX0lOSVQoX3MsIF9vYmosIF9rZXkpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgYmNtYmFsXyAjIyBfb2JqICMjIF9zdGF0ICpfeF8gPSBfczsgXAorICAgICAgICBtZW1zZXQoX3hfLCAwLCBzaXplb2YoKl94XykpOyBcCisgICAgICAgIF9CQ01CQUxfUkVRX0lOSVQoJigoX3hfKS0+aGRyLmhkciksIF9vYmosIEJDTUJBTF9NR1RfR1JPVVBfU1RBVCwgMCk7IFwKKyAgICAgICAgKF94XyktPmtleSA9IF9rZXk7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiogU2V0IHRoZSBtZW1vcnkgYnVmZmVyIHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgd2l0aGluIGEgY2ZnIGdldAorICogXGluZ3JvdXAgYXBpCisgKiBccGFyYW1baW5dICAgX3MgICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfYnVmICAgIFBvaW50ZXIgdG8gYSBsb2NhdGlvbiBpbiBtZW1vcnkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIGxpc3RzCisgKiBccGFyYW1baW5dICAgX2xlbiAgICBMZW5ndGggb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IF9idWYKKyAqLworI2RlZmluZSBCQ01CQUxfQ0ZHX0xJU1RfQlVGX1NFVChfcywgX29iaiwgX2J1ZiwgX2xlbikgXAorICAgIGRvIHsgXAorICAgICAgICBiY21iYWxfICMjIF9vYmogIyMgX2NmZyAqX3hfID0gX3M7IFwKKyAgICAgICAgX3hfLT5oZHIuaGRyLmxpc3RfYnVmID0gX2J1ZjsgXAorICAgICAgICBfeF8tPmhkci5oZHIubGlzdF9idWZfc2l6ZSA9IF9sZW47IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBTZXQgdGhlIG9iamVjdCBwcm9ncmVzcyBzdGF0ZQorICogXGluZ3JvdXAgYXBpCisgKiBccGFyYW1baW5dICAgX3MgICAgICBPYmplY3Qgc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX3AgICAgICBOZXcgb2JqZWN0IGluLXByb2dyZXNzIHN0YXRlOiBCQ01PU19UUlVFLCBvciBCQ01PU19GQUxTRQorICovCisjZGVmaW5lIEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfU0VUKF9zLCBfcCkgKChfcyktPmhkci5oZHIuaXNfaW5wcm9ncmVzcyA9IF9wICkKKworLyogUmV0dXJuIHRoZSBvYmplY3QgcHJvZ3Jlc3Mgc3RhdGUKKyAqIFxpbmdyb3VwIGFwaQorICogXHBhcmFtW2luXSAgIF9zICAgICAgT2JqZWN0IHN0cnVjdHVyZQorICovCisjZGVmaW5lIEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfR0VUKF9zKSAoKF9zKS0+aGRyLmhkci5pc19pbnByb2dyZXNzKQorCisvKiBJbnRlcm5hbCBtYWNybzogR2V0IGEgYml0bWFzayBnaXZlbiBhIHByb3BlcnR5IElEIGVudW0gKi8KKyNkZWZpbmUgQkNNQkFMX1BST1BfTUFTS19HRVQoX29iaiwgX2dycCwgX3ApIFwKKyAgICAoYmNtYmFsXyAjIyBfb2JqICMjIF9ncnAgIyMgX2lkXyAjIyBfcCA9PSBiY21iYWxfICAjIyBfb2JqICMjIF9ncnAgIyMgX2lkX2FsbF9wcm9wZXJ0aWVzID8gXAorICAgICAgICAoKDFVTEwgPDwgKHVpbnQ2NF90KWJjbWJhbF8gICMjIF9vYmogIyMgX2dycCAjIyBfaWRfICMjIF9wKSAtIDEpIDogXAorICAgICAgICAoMVVMTCA8PCAodWludDY0X3QpYmNtYmFsXyAgIyMgX29iaiAjIyBfZ3JwICMjIF9pZF8gIyMgX3ApKQorCisKKy8qIE1hY3JvOiBJbmRpY2F0ZSB0aGF0IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgcHJlc2VudCAtIFVTRSBXSVRIIENBVVRJT04gKi8KKyNkZWZpbmUgQkNNQkFMX1BST1BfU0VUX1BSRVNFTlQoX20sIF9vYmosIF9ncnAsIF9wKSBcCisgICAgZG8geyBcCisgICAgICAgIChfbSktPmhkci5oZHIucHJlc2VuY2VfbWFzayB8PSBCQ01CQUxfUFJPUF9NQVNLX0dFVChfb2JqLCBfZ3JwLCBfcCk7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBJbnRlcm5hbCBtYWNybzogSW5kaWNhdGUgdGhhdCBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50ICovCisjZGVmaW5lIEJDTUJBTF9QUk9QX0NMRUFSX1BSRVNFTlQoX20sIF9vYmosIF9ncnAsIF9wKSAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfbSktPmhkci5oZHIucHJlc2VuY2VfbWFzayAmPSB+KEJDTUJBTF9QUk9QX01BU0tfR0VUKF9vYmosIF9ncnAsIF9wKSk7XAorICAgIH0gd2hpbGUgKDApCisKKy8qIEludGVybmFsIG1hY3JvOiBjaGVjayBpZiBwcm9wZXJ0eSBpcyBwcmVzZW50ICovCisjZGVmaW5lIF9CQ01CQUxfUFJPUF9JU19QUkVTRU5UKF9tLCBfb2JqLCBfZ3JwLCBfcCkgXAorICAgICgoKF9tKS0+aGRyLmhkci5wcmVzZW5jZV9tYXNrICYgQkNNQkFMX1BST1BfTUFTS19HRVQoX29iaiwgX2dycCwgX3ApKSA/IFwKKyAgICAgICAgQkNNT1NfVFJVRSA6IEJDTU9TX0ZBTFNFKQorCisvKiogU2V0IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaW4gbWVzc2FnZSBzdHJ1Y3R1cmUKKyAqIFxpbmdyb3VwIGFwaQorICogXHBhcmFtW2luXSAgIF9tICAgICAgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisgKiBccGFyYW1baW5dICAgX3YgICAgICBQcm9wZXJ0eSB2YWx1ZQorICovCisjZGVmaW5lIEJDTUJBTF9DRkdfUFJPUF9TRVQoX20sIF9vYmosIF9wLCBfdikgXAorICAgZG8geyBcCisgICAgICAgQkNNQkFMX1BST1BfU0VUX1BSRVNFTlQoX20sIF9vYmosIF9jZmcsIF9wKTtcCisgICAgICAgKF9tKS0+ZGF0YS5fcCA9IChfdik7XAorICAgfSB3aGlsZSAoMCkKKworLyoqIEluZGljYXRlIHRoYXQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBzaG91bGQgYmUgcmVhZAorICogXGluZ3JvdXAgYXBpCisgKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01CQUxfQ0ZHX1BST1BfR0VUKF9tLCBfb2JqLCBfcCkgQkNNQkFMX1BST1BfU0VUX1BSRVNFTlQoX20sIF9vYmosIF9jZmcsIF9wKQorCisvKiogY2xlYXIgb2JqZWN0IHByb3BlcnR5IGluIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBcaW5ncm91cCBhcGkKKyAqIFxwYXJhbVtpbl0gICBfbSAgICAgIE9iamVjdCBzdHJ1Y3R1cmUgcG9pbnRlcgorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IG5hbWUgKGkuZS4gZmxvdykKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIEF0dHJpYnV0ZSBuYW1lIChpLmUuIGFkbWluX3N0YXRlKQorICovCisjZGVmaW5lIEJDTUJBTF9DRkdfUFJPUF9DTEVBUihfbSwgX29iaiwgX3ApICAgICAgICAgXAorICAgIGRvIHsgXAorICAgICAgICBCQ01CQUxfUFJPUF9DTEVBUl9QUkVTRU5UKF9tLCBfb2JqLCBfY2ZnLCBfcCk7ICAgICAgICBcCisgICAgICAgIG1lbXNldCgmKChfbSktPmRhdGEuX3ApLCAwLCBzaXplb2YoKF9tKS0+ZGF0YS5fcCkpOyAgICBcCisgICAgfSB3aGlsZSAoMCkKKworLyoqIENoZWNrIGlmIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgc2V0IGluIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBcaW5ncm91cCBhcGkKKyAqIFxwYXJhbVtpbl0gICBfbSAgICAgIENvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9wICAgICAgUHJvcGVydHkgbmFtZQorICovCisjZGVmaW5lIEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoX20sIF9vYmosIF9wKSBfQkNNQkFMX1BST1BfSVNfUFJFU0VOVChfbSwgX29iaiwgX2NmZywgX3ApCisKKy8qKiBJbmRpY2F0ZSB0aGF0IHN0YXRpc3RpYyBwcm9wZXJ0eSBzaG91bGQgYmUgcmVhZAorICogXGluZ3JvdXAgYXBpCisgKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01CQUxfU1RBVF9QUk9QX0dFVChfbSwgX29iaiwgX3ApIEJDTUJBTF9QUk9QX1NFVF9QUkVTRU5UKF9tLCBfb2JqLCBfc3RhdCwgX3ApCisKKy8qKiBDaGVjayBpZiBzdGF0aXN0aWMgcHJvcGVydHkgaXMgc2V0IGluIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBcaW5ncm91cCBhcGkKKyAqIFxwYXJhbVtpbl0gICBfbSAgICAgIFN0YXRpc3RpYyBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisgKi8KKyNkZWZpbmUgQkNNQkFMX1NUQVRfUFJPUF9JU19TRVQoX20sIF9vYmosIF9wKSBfQkNNQkFMX1BST1BfSVNfUFJFU0VOVChfbSwgX29iaiwgX3N0YXQsIF9wKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogTWFjcm9zIGZvciBzZXR0aW5nIGF0dHJpYnV0ZSB2YWx1ZXMgd2hlcmUgYW4gYXR0cmlidXRlIHN1cHBvcnRzIGEgcHJlc2VuY2VfbWFzaworICoqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKi8KKworLyogSW50ZXJuYWwgbWFjcm86IEdldCBhIGJpdG1hc2sgZ2l2ZW4gYSBhdHRyaWJ1dGUgZWxlbWVudCBwcm9wZXJ0eSBJRCBlbnVtICovCisjZGVmaW5lIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9NQVNLX0dFVChfYXR0ciwgX3ApIGJjbWJhbF8gIyMgX2F0dHIgIyMgX2lkXyAjIyBfcAorCisvKiBJbnRlcm5hbCBtYWNybzogSW5kaWNhdGUgdGhhdCBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIHByZXNlbnQgKi8KKyNkZWZpbmUgX0JDTUJBTF9BVFRSSUJVVEVfUFJPUF9TRVRfUFJFU0VOVChwX2F0dHIsIF9hdHRyLF9wKSAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHBfYXR0ciktPnByZXNlbmNlX21hc2sgfD0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX01BU0tfR0VUKF9hdHRyLCBfcCk7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBJbnRlcm5hbCBtYWNybzogSW5kaWNhdGUgdGhhdCBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50ICovCisjZGVmaW5lIF9CQ01CQUxfQVRUUklCVVRFX1BST1BfQ0xFQVJfUFJFU0VOVChwX2F0dHIsIF9hdHRyLF9wKSAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHBfYXR0ciktPnByZXNlbmNlX21hc2sgJj0gfihCQ01CQUxfQVRUUklCVVRFX1BST1BfTUFTS19HRVQoX2F0dHIsIF9wKSk7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiogU2V0IGF0dHJpYnV0ZSBlbGVtZW50IHByb3BlcnR5IGluIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX3BfYXR0ciBBdHRyaWJ1dGUgc3RydWN0dXJlIHBvaW50ZXIKKyAqIFxwYXJhbVtpbl0gICBfYXR0ciAgIEF0dHJpYnV0ZSBuYW1lCisgKiBccGFyYW1baW5dICAgX3AgICAgICBFbGVtZW50IG5hbWUgKGkuZS4gb190cGlkKQorICogXHBhcmFtW2luXSAgIF92ICAgICAgRWxlbWVudCB2YWx1ZQorICovCisjZGVmaW5lIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9TRVQoX3BfYXR0ciwgX2F0dHIsIF9wLCBfdikgICAgXAorICAgIGRvIHsgXAorICAgICAgICBfQkNNQkFMX0FUVFJJQlVURV9QUk9QX1NFVF9QUkVTRU5UKF9wX2F0dHIsIF9hdHRyLCBfcCk7ICAgXAorICAgICAgICAoX3BfYXR0ciktPl9wID0gKF92KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworLyoqIENsZWFyIGF0dHJpYnV0ZSBlbGVtZW50IHByb3BlcnR5IGluIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX3BfYXR0ciBBdHRyaWJ1dGUgc3RydWN0dXJlIHBvaW50ZXIKKyAqIFxwYXJhbVtpbl0gICBfYXR0ciAgIEF0dHJpYnV0ZSBuYW1lCisgKiBccGFyYW1baW5dICAgX3AgICAgICBFbGVtZW50IG5hbWUgKGkuZS4gb190cGlkKQorICovCisjZGVmaW5lIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9DTEVBUihfcF9hdHRyLCBfYXR0ciwgX3ApICAgIFwKKyAgICBkbyB7IFwKKyAgICAgICAgX0JDTUJBTF9BVFRSSUJVVEVfUFJPUF9DTEVBUl9QUkVTRU5UKF9wX2F0dHIsIF9hdHRyLCBfcCk7ICAgXAorICAgICAgICBtZW1zZXQoJigoX3BfYXR0ciktPl9wKSwgMCwgc2l6ZW9mKChfcF9hdHRyKS0+X3ApKTsgICBcCisgICAgfSB3aGlsZSAoMCkKKworCisvKiBJbnRlcm5hbCBtYWNybzogY2hlY2sgaWYgYW4gYXR0cmlidXRlIGVsZW1lbnQgaXMgcHJlc2VudCAqLworI2RlZmluZSBfQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1BSRVNFTlQoX3BfYXR0ciwgX2F0dHIsIF9wKSAgICAgICAgICAgICAgXAorICAgICgoKF9wX2F0dHIpLT5wcmVzZW5jZV9tYXNrICYgQkNNQkFMX0FUVFJJQlVURV9QUk9QX01BU0tfR0VUKF9hdHRyLCBfcCkpID8gXAorICAgICAgICAgQkNNT1NfVFJVRSA6IEJDTU9TX0ZBTFNFKQorCisvKiogQ2hlY2sgaWYgYXR0cmlidXRlIGVsZW1lbnQgcHJvcGVydHkgaXMgc2V0IGluIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX3BfYXR0ciBBdHRyaWJ1dGUgc3RydWN0dXJlIHBvaW50ZXIKKyAqIFxwYXJhbVtpbl0gICBfYXR0ciAgIEF0dHJpYnV0ZSBuYW1lCisgKiBccGFyYW1baW5dICAgX3AgICAgICBFbGVtZW50IG5hbWUgKGkuZS4gb190cGlkKQorICovCisjZGVmaW5lIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoX3BfYXR0ciwgX2F0dHIsIF9wKSAgICBfQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1BSRVNFTlQoX3BfYXR0ciwgX2F0dHIsIF9wKQorCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBJbnRlcm5hbCBCQ01CQUwgbWFjcm9zIHVzZWQgdG8gbWFuaXB1bGF0ZSBjbWRzX2JpdG1hc2sgb2YgYWN0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiogQ2hlY2sgaWYgYWN0aW9uIGNtZCBpZCBpcyBzZXQgaW4gYWN0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9tICAgICAgT2JqZWN0IHN0cnVjdHVyZSBwb2ludGVyCisgKiBccGFyYW1baW5dICAgX2IgICAgICBjbWQgSWQgYml0bWFzaworICovCisjZGVmaW5lIEJDTUJBTF9BQ1RJT05fQ01EX0lEX0lTX1NFVChfbSwgX2IpIFwKKyAgICAoKChfbSktPmNtZHNfYml0bWFzayAmIChfYikpID8gXAorICAgICAgICBCQ01PU19UUlVFIDogQkNNT1NfRkFMU0UpCisKKy8qKiBTZXQgYWN0aW9uIGNtZCBpZCBpbiBhY3Rpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX20gICAgICBPYmplY3Qgc3RydWN0dXJlIHBvaW50ZXIKKyAqIFxwYXJhbVtpbl0gICBfYiAgICAgIGNtZCBJZCBiaXRtYXNrCisgKi8KKyNkZWZpbmUgQkNNQkFMX0FDVElPTl9DTURfSURfU0VUKF9tLCBfYikgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX20pLT5jbWRzX2JpdG1hc2sgfD0gKF9iKTtcCisgICAgfSB3aGlsZSAoMCkKKworCisvKiogQ2xlYXIgYWN0aW9uIGNtZCBpZCBpbiBhY3Rpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX20gICAgICBPYmplY3Qgc3RydWN0dXJlIHBvaW50ZXIKKyAqIFxwYXJhbVtpbl0gICBfYiAgICAgIGNtZCBJZCBiaXRtYXNrCisgKi8KKyNkZWZpbmUgQkNNQkFMX0FDVElPTl9DTURfSURfQ0xFQVIoX20sIF9iKSBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChfbSktPmNtZHNfYml0bWFzayAmPSB+KF9iKTtcCisgICAgfSB3aGlsZSAoMCkKKworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21iYWxfZmxvd19vYmplY3Rfb3ZlcmxheV93X3NyY19wcmlvcml0eShiY21iYWxfZmxvd19jZmcgKmRzdG9iaiwgYmNtYmFsX2Zsb3dfY2ZnICpzcmNvYmopCit7CisgICAgQlVHX09OKE5VTEwgPT0gZHN0b2JqKTsKKyAgICBCVUdfT04oTlVMTCA9PSBzcmNvYmopOworCisgICAgYmNtYmFsX3ByZXNlbmNlX21hc2sgZGVzdF9wcmVzZW5jZV9tYXNrOworCisgICAgLyogRmlyc3QsIGNvcHkgdGhlIGNvbW1vbiBvYmplY3QgYW5kIGtleXMgaW4gdGhlaXIgZW50aXJldHksIGV4Y2VwdCBmb3IgcHJlc2VydmluZyB0aGUgcHJlc2VuY2VfbWFzayAqLworICAgIGRlc3RfcHJlc2VuY2VfbWFzayA9IGRzdG9iai0+aGRyLmhkci5wcmVzZW5jZV9tYXNrOworICAgIGRzdG9iai0+aGRyID0gc3Jjb2JqLT5oZHI7CisgICAgZHN0b2JqLT5rZXkgPSBzcmNvYmotPmtleTsKKyAgICBkc3RvYmotPmhkci5oZHIucHJlc2VuY2VfbWFzayA9IGRlc3RfcHJlc2VuY2VfbWFzazsKKworICAgIC8qIE5vdyBjb3B5IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBvYmplY3QgKi8KKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgZmxvdywgYWRtaW5fc3RhdGUpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGZsb3csIGFkbWluX3N0YXRlLCBzcmNvYmotPmRhdGEuYWRtaW5fc3RhdGUpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBmbG93LCBhY2Nlc3NfaW50X2lkKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBmbG93LCBhY2Nlc3NfaW50X2lkLCBzcmNvYmotPmRhdGEuYWNjZXNzX2ludF9pZCk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGZsb3csIG5ldHdvcmtfaW50X2lkKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBmbG93LCBuZXR3b3JrX2ludF9pZCwgc3Jjb2JqLT5kYXRhLm5ldHdvcmtfaW50X2lkKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgZmxvdywgc3ViX3Rlcm1faWQpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGZsb3csIHN1Yl90ZXJtX2lkLCBzcmNvYmotPmRhdGEuc3ViX3Rlcm1faWQpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBmbG93LCBzdmNfcG9ydF9pZCkpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgZmxvdywgc3ZjX3BvcnRfaWQsIHNyY29iai0+ZGF0YS5zdmNfcG9ydF9pZCk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGZsb3csIGFnZ19wb3J0X2lkKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBmbG93LCBhZ2dfcG9ydF9pZCwgc3Jjb2JqLT5kYXRhLmFnZ19wb3J0X2lkKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgZmxvdywgcmVzb2x2ZV9tYWMpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGZsb3csIHJlc29sdmVfbWFjLCBzcmNvYmotPmRhdGEucmVzb2x2ZV9tYWMpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBmbG93LCBxdWV1ZSkpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgZmxvdywgcXVldWUsIHNyY29iai0+ZGF0YS5xdWV1ZSk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGZsb3csIGFjdGlvbikpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgZmxvdywgYWN0aW9uLCBzcmNvYmotPmRhdGEuYWN0aW9uKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgZmxvdywgY2xhc3NpZmllcikpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgZmxvdywgY2xhc3NpZmllciwgc3Jjb2JqLT5kYXRhLmNsYXNzaWZpZXIpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBmbG93LCBzbGEpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGZsb3csIHNsYSwgc3Jjb2JqLT5kYXRhLnNsYSk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGZsb3csIGdyb3VwX2lkKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBmbG93LCBncm91cF9pZCwgc3Jjb2JqLT5kYXRhLmdyb3VwX2lkKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgZmxvdywgY29va2llKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBmbG93LCBjb29raWUsIHNyY29iai0+ZGF0YS5jb29raWUpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjbWJhbF9mbG93X29iamVjdF9vdmVybGF5X3dfZHN0X3ByaW9yaXR5KGJjbWJhbF9mbG93X2NmZyAqZHN0b2JqLCBiY21iYWxfZmxvd19jZmcgKnNyY29iaikKK3sKKyAgICBCVUdfT04oTlVMTCA9PSBkc3RvYmopOworICAgIEJVR19PTihOVUxMID09IHNyY29iaik7CisKKyAgICBiY21iYWxfcHJlc2VuY2VfbWFzayBkZXN0X3ByZXNlbmNlX21hc2s7CisKKyAgICAvKiBGaXJzdCwgY29weSB0aGUgY29tbW9uIG9iamVjdCBhbmQga2V5cyBpbiB0aGVpciBlbnRpcmV0eSwKKyAgICAgKiBleGNlcHQgZm9yIHByZXNlcnZpbmcgdGhlIHByZXNlbmNlX21hc2sgKi8KKyAgICBkZXN0X3ByZXNlbmNlX21hc2sgPSBkc3RvYmotPmhkci5oZHIucHJlc2VuY2VfbWFzazsKKyAgICBkc3RvYmotPmhkciA9IHNyY29iai0+aGRyOworICAgIGRzdG9iai0+a2V5ID0gc3Jjb2JqLT5rZXk7CisgICAgZHN0b2JqLT5oZHIuaGRyLnByZXNlbmNlX21hc2sgPSBkZXN0X3ByZXNlbmNlX21hc2s7CisKKyAgICAvKiBOb3cgY29weSBvbmx5IHRoZSBmaWVsZHMgdGhhdCBoYXZlIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBzb3VyY2UgYW5kIGFyZSBub3QgYWxyZWFkeSBzZXQgaW4gdGhlIGRzdCBvYmplY3QgKi8KKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgZmxvdywgYWRtaW5fc3RhdGUpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCBmbG93LCBhZG1pbl9zdGF0ZSkpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgZmxvdywgYWRtaW5fc3RhdGUsIHNyY29iai0+ZGF0YS5hZG1pbl9zdGF0ZSk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGZsb3csIGFjY2Vzc19pbnRfaWQpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCBmbG93LCBhY2Nlc3NfaW50X2lkKSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBmbG93LCBhY2Nlc3NfaW50X2lkLCBzcmNvYmotPmRhdGEuYWNjZXNzX2ludF9pZCk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGZsb3csIG5ldHdvcmtfaW50X2lkKSkKKyAgICB7CisgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKGRzdG9iaiwgZmxvdywgbmV0d29ya19pbnRfaWQpKQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGZsb3csIG5ldHdvcmtfaW50X2lkLCBzcmNvYmotPmRhdGEubmV0d29ya19pbnRfaWQpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBmbG93LCBzdWJfdGVybV9pZCkpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIGZsb3csIHN1Yl90ZXJtX2lkKSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBmbG93LCBzdWJfdGVybV9pZCwgc3Jjb2JqLT5kYXRhLnN1Yl90ZXJtX2lkKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgZmxvdywgc3ZjX3BvcnRfaWQpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCBmbG93LCBzdmNfcG9ydF9pZCkpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgZmxvdywgc3ZjX3BvcnRfaWQsIHNyY29iai0+ZGF0YS5zdmNfcG9ydF9pZCk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGZsb3csIGFnZ19wb3J0X2lkKSkKKyAgICB7CisgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKGRzdG9iaiwgZmxvdywgYWdnX3BvcnRfaWQpKQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGZsb3csIGFnZ19wb3J0X2lkLCBzcmNvYmotPmRhdGEuYWdnX3BvcnRfaWQpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBmbG93LCByZXNvbHZlX21hYykpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIGZsb3csIHJlc29sdmVfbWFjKSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBmbG93LCByZXNvbHZlX21hYywgc3Jjb2JqLT5kYXRhLnJlc29sdmVfbWFjKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgZmxvdywgcXVldWUpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCBmbG93LCBxdWV1ZSkpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgZmxvdywgcXVldWUsIHNyY29iai0+ZGF0YS5xdWV1ZSk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGZsb3csIGFjdGlvbikpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIGZsb3csIGFjdGlvbikpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgZmxvdywgYWN0aW9uLCBzcmNvYmotPmRhdGEuYWN0aW9uKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgZmxvdywgY2xhc3NpZmllcikpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIGZsb3csIGNsYXNzaWZpZXIpKQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGZsb3csIGNsYXNzaWZpZXIsIHNyY29iai0+ZGF0YS5jbGFzc2lmaWVyKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgZmxvdywgc2xhKSkKKyAgICB7CisgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKGRzdG9iaiwgZmxvdywgc2xhKSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBmbG93LCBzbGEsIHNyY29iai0+ZGF0YS5zbGEpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBmbG93LCBncm91cF9pZCkpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIGZsb3csIGdyb3VwX2lkKSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBmbG93LCBncm91cF9pZCwgc3Jjb2JqLT5kYXRhLmdyb3VwX2lkKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgZmxvdywgY29va2llKSkKKyAgICB7CisgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKGRzdG9iaiwgZmxvdywgY29va2llKSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBmbG93LCBjb29raWUsIHNyY29iai0+ZGF0YS5jb29raWUpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjbWJhbF9zdWJfdGVybV9vYmplY3Rfb3ZlcmxheV93X3NyY19wcmlvcml0eShiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgKmRzdG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpzcmNvYmopCit7CisgICAgQlVHX09OKE5VTEwgPT0gZHN0b2JqKTsKKyAgICBCVUdfT04oTlVMTCA9PSBzcmNvYmopOworCisgICAgYmNtYmFsX3ByZXNlbmNlX21hc2sgZGVzdF9wcmVzZW5jZV9tYXNrOworCisgICAgLyogRmlyc3QsIGNvcHkgdGhlIGNvbW1vbiBvYmplY3QgYW5kIGtleXMgaW4gdGhlaXIgZW50aXJldHksIGV4Y2VwdCBmb3IgcHJlc2VydmluZyB0aGUgcHJlc2VuY2VfbWFzayAqLworICAgIGRlc3RfcHJlc2VuY2VfbWFzayA9IGRzdG9iai0+aGRyLmhkci5wcmVzZW5jZV9tYXNrOworICAgIGRzdG9iai0+aGRyID0gc3Jjb2JqLT5oZHI7CisgICAgZHN0b2JqLT5rZXkgPSBzcmNvYmotPmtleTsKKyAgICBkc3RvYmotPmhkci5oZHIucHJlc2VuY2VfbWFzayA9IGRlc3RfcHJlc2VuY2VfbWFzazsKKworICAgIC8qIE5vdyBjb3B5IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBvYmplY3QgKi8KKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgYWRtaW5fc3RhdGUpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIGFkbWluX3N0YXRlLCBzcmNvYmotPmRhdGEuYWRtaW5fc3RhdGUpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBzZXJpYWxfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBzZXJpYWxfbnVtYmVyLCBzcmNvYmotPmRhdGEuc2VyaWFsX251bWJlcik7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIHBhc3N3b3JkKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBwYXNzd29yZCwgc3Jjb2JqLT5kYXRhLnBhc3N3b3JkKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcmVnaXN0cmF0aW9uX2lkKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCByZWdpc3RyYXRpb25faWQsIHNyY29iai0+ZGF0YS5yZWdpc3RyYXRpb25faWQpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBzdmNfcG9ydF9pZCkpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgc3ZjX3BvcnRfaWQsIHNyY29iai0+ZGF0YS5zdmNfcG9ydF9pZCk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIGRzX3RtKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBkc190bSwgc3Jjb2JqLT5kYXRhLmRzX3RtKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgdXNfdG0pKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIHVzX3RtLCBzcmNvYmotPmRhdGEudXNfdG0pOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBtYWNfYWRkcmVzcykpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgbWFjX2FkZHJlc3MsIHNyY29iai0+ZGF0YS5tYWNfYWRkcmVzcyk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYmFsX3N1Yl90ZXJtX29iamVjdF9vdmVybGF5X3dfZHN0X3ByaW9yaXR5KGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZyAqZHN0b2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgKnNyY29iaikKK3sKKyAgICBCVUdfT04oTlVMTCA9PSBkc3RvYmopOworICAgIEJVR19PTihOVUxMID09IHNyY29iaik7CisKKyAgICBiY21iYWxfcHJlc2VuY2VfbWFzayBkZXN0X3ByZXNlbmNlX21hc2s7CisKKyAgICAvKiBGaXJzdCwgY29weSB0aGUgY29tbW9uIG9iamVjdCBhbmQga2V5cyBpbiB0aGVpciBlbnRpcmV0eSwgZXhjZXB0IGZvciBwcmVzZXJ2aW5nIHRoZSBwcmVzZW5jZV9tYXNrICovCisgICAgZGVzdF9wcmVzZW5jZV9tYXNrID0gZHN0b2JqLT5oZHIuaGRyLnByZXNlbmNlX21hc2s7CisgICAgZHN0b2JqLT5oZHIgPSBzcmNvYmotPmhkcjsKKyAgICBkc3RvYmotPmtleSA9IHNyY29iai0+a2V5OworICAgIGRzdG9iai0+aGRyLmhkci5wcmVzZW5jZV9tYXNrID0gZGVzdF9wcmVzZW5jZV9tYXNrOworCisgICAgLyogTm93IGNvcHkgb25seSB0aGUgZmllbGRzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZCBpbiB0aGUgc291cmNlIG9iamVjdCAqLworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBhZG1pbl9zdGF0ZSkpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIGFkbWluX3N0YXRlKSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBhZG1pbl9zdGF0ZSwgc3Jjb2JqLT5kYXRhLmFkbWluX3N0YXRlKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgc2VyaWFsX251bWJlcikpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIHNlcmlhbF9udW1iZXIpKQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIHNlcmlhbF9udW1iZXIsIHNyY29iai0+ZGF0YS5zZXJpYWxfbnVtYmVyKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcGFzc3dvcmQpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBwYXNzd29yZCkpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcGFzc3dvcmQsIHNyY29iai0+ZGF0YS5wYXNzd29yZCk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIHJlZ2lzdHJhdGlvbl9pZCkpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIHJlZ2lzdHJhdGlvbl9pZCkpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcmVnaXN0cmF0aW9uX2lkLCBzcmNvYmotPmRhdGEucmVnaXN0cmF0aW9uX2lkKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgc3ZjX3BvcnRfaWQpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBzdmNfcG9ydF9pZCkpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgc3ZjX3BvcnRfaWQsIHNyY29iai0+ZGF0YS5zdmNfcG9ydF9pZCk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIGRzX3RtKSkKKyAgICB7CisgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKGRzdG9iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgZHNfdG0pKQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIGRzX3RtLCBzcmNvYmotPmRhdGEuZHNfdG0pOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCB1c190bSkpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIHN1YnNjcmliZXJfdGVybWluYWwsIHVzX3RtKSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCB1c190bSwgc3Jjb2JqLT5kYXRhLnVzX3RtKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBtYWNfYWRkcmVzcykpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgbWFjX2FkZHJlc3MsIHNyY29iai0+ZGF0YS5tYWNfYWRkcmVzcyk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYmFsX3RtX3NjaGVkX29iamVjdF9vdmVybGF5X3dfc3JjX3ByaW9yaXR5KGJjbWJhbF90bV9zY2hlZF9jZmcgKmRzdG9iaiwgYmNtYmFsX3RtX3NjaGVkX2NmZyAqc3Jjb2JqKQoreworICAgIEJVR19PTihOVUxMID09IGRzdG9iaik7CisgICAgQlVHX09OKE5VTEwgPT0gc3Jjb2JqKTsKKworICAgIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGRlc3RfcHJlc2VuY2VfbWFzazsKKworICAgIC8qIEZpcnN0LCBjb3B5IHRoZSBjb21tb24gb2JqZWN0IGFuZCBrZXlzIGluIHRoZWlyIGVudGlyZXR5LCBleGNlcHQgZm9yIHByZXNlcnZpbmcgdGhlIHByZXNlbmNlX21hc2sgKi8KKyAgICBkZXN0X3ByZXNlbmNlX21hc2sgPSBkc3RvYmotPmhkci5oZHIucHJlc2VuY2VfbWFzazsKKyAgICBkc3RvYmotPmhkciA9IHNyY29iai0+aGRyOworICAgIGRzdG9iai0+a2V5ID0gc3Jjb2JqLT5rZXk7CisgICAgZHN0b2JqLT5oZHIuaGRyLnByZXNlbmNlX21hc2sgPSBkZXN0X3ByZXNlbmNlX21hc2s7CisKKyAgICAvKiBOb3cgY29weSBvbmx5IHRoZSBmaWVsZHMgdGhhdCBoYXZlIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBzb3VyY2Ugb2JqZWN0ICovCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIHRtX3NjaGVkLCBvd25lcikpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgdG1fc2NoZWQsIG93bmVyLCBzcmNvYmotPmRhdGEub3duZXIpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCB0bV9zY2hlZCwgc2NoZWRfdHlwZSkpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgdG1fc2NoZWQsIHNjaGVkX3R5cGUsIHNyY29iai0+ZGF0YS5zY2hlZF90eXBlKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgdG1fc2NoZWQsIHNjaGVkX3BhcmVudCkpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgdG1fc2NoZWQsIHNjaGVkX3BhcmVudCwgc3Jjb2JqLT5kYXRhLnNjaGVkX3BhcmVudCk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIHRtX3NjaGVkLCBzY2hlZF9jaGlsZF90eXBlKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCB0bV9zY2hlZCwgc2NoZWRfY2hpbGRfdHlwZSwgc3Jjb2JqLT5kYXRhLnNjaGVkX2NoaWxkX3R5cGUpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCB0bV9zY2hlZCwgcmF0ZSkpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgdG1fc2NoZWQsIHJhdGUsIHNyY29iai0+ZGF0YS5yYXRlKTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgdG1fc2NoZWQsIHRjb250X3NsYSkpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgdG1fc2NoZWQsIHRjb250X3NsYSwgc3Jjb2JqLT5kYXRhLnRjb250X3NsYSk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIHRtX3NjaGVkLCBjcmVhdGlvbl9tb2RlKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCB0bV9zY2hlZCwgY3JlYXRpb25fbW9kZSwgc3Jjb2JqLT5kYXRhLmNyZWF0aW9uX21vZGUpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCB0bV9zY2hlZCwgbnVtX3ByaW9yaXRpZXMpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIHRtX3NjaGVkLCBudW1fcHJpb3JpdGllcywgc3Jjb2JqLT5kYXRhLm51bV9wcmlvcml0aWVzKTsKKyAgICB9CisKK30KKworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21iYWxfdG1fc2NoZWRfb2JqZWN0X292ZXJsYXlfd19kc3RfcHJpb3JpdHkoYmNtYmFsX3RtX3NjaGVkX2NmZyAqZHN0b2JqLCBiY21iYWxfdG1fc2NoZWRfY2ZnICpzcmNvYmopCit7CisgICAgQlVHX09OKE5VTEwgPT0gZHN0b2JqKTsKKyAgICBCVUdfT04oTlVMTCA9PSBzcmNvYmopOworCisgICAgYmNtYmFsX3ByZXNlbmNlX21hc2sgZGVzdF9wcmVzZW5jZV9tYXNrOworCisgICAgLyogRmlyc3QsIGNvcHkgdGhlIGNvbW1vbiBvYmplY3QgYW5kIGtleXMgaW4gdGhlaXIgZW50aXJldHksCisgICAgICogZXhjZXB0IGZvciBwcmVzZXJ2aW5nIHRoZSBwcmVzZW5jZV9tYXNrICovCisgICAgZGVzdF9wcmVzZW5jZV9tYXNrID0gZHN0b2JqLT5oZHIuaGRyLnByZXNlbmNlX21hc2s7CisgICAgZHN0b2JqLT5oZHIgPSBzcmNvYmotPmhkcjsKKyAgICBkc3RvYmotPmtleSA9IHNyY29iai0+a2V5OworICAgIGRzdG9iai0+aGRyLmhkci5wcmVzZW5jZV9tYXNrID0gZGVzdF9wcmVzZW5jZV9tYXNrOworCisgICAgLyogTm93IGNvcHkgb25seSB0aGUgZmllbGRzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZCBpbiB0aGUgc291cmNlIGFuZCBhcmUgbm90IGFscmVhZHkgc2V0IGluIHRoZSBkc3Qgb2JqZWN0ICovCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIHRtX3NjaGVkLCBvd25lcikpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIHRtX3NjaGVkLCBvd25lcikpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgdG1fc2NoZWQsIG93bmVyLCBzcmNvYmotPmRhdGEub3duZXIpOworICAgIH0KKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgdG1fc2NoZWQsIHNjaGVkX3R5cGUpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCB0bV9zY2hlZCwgc2NoZWRfdHlwZSkpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgdG1fc2NoZWQsIHNjaGVkX3R5cGUsIHNyY29iai0+ZGF0YS5zY2hlZF90eXBlKTsKKyAgICB9CisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIHRtX3NjaGVkLCBzY2hlZF9wYXJlbnQpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCB0bV9zY2hlZCwgc2NoZWRfcGFyZW50KSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCB0bV9zY2hlZCwgc2NoZWRfcGFyZW50LCBzcmNvYmotPmRhdGEuc2NoZWRfcGFyZW50KTsKKyAgICB9CisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIHRtX3NjaGVkLCBzY2hlZF9jaGlsZF90eXBlKSkKKyAgICB7CisgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKGRzdG9iaiwgdG1fc2NoZWQsIHNjaGVkX2NoaWxkX3R5cGUpKQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIHRtX3NjaGVkLCBzY2hlZF9jaGlsZF90eXBlLCBzcmNvYmotPmRhdGEuc2NoZWRfY2hpbGRfdHlwZSk7CisgICAgfQorICAgIAorICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCB0bV9zY2hlZCwgcmF0ZSkpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIHRtX3NjaGVkLCByYXRlKSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCB0bV9zY2hlZCwgcmF0ZSwgc3Jjb2JqLT5kYXRhLnJhdGUpOworICAgIH0KKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgdG1fc2NoZWQsIHRjb250X3NsYSkpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIHRtX3NjaGVkLCB0Y29udF9zbGEpKQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIHRtX3NjaGVkLCB0Y29udF9zbGEsIHNyY29iai0+ZGF0YS50Y29udF9zbGEpOworICAgIH0KKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgdG1fc2NoZWQsIGNyZWF0aW9uX21vZGUpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCB0bV9zY2hlZCwgY3JlYXRpb25fbW9kZSkpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgdG1fc2NoZWQsIGNyZWF0aW9uX21vZGUsIHNyY29iai0+ZGF0YS5jcmVhdGlvbl9tb2RlKTsKKyAgICB9CQkJCQkKKworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21iYWxfdG1fcXVldWVfb2JqZWN0X292ZXJsYXkoYmNtYmFsX3RtX3F1ZXVlX2NmZyAqZHN0b2JqLCBiY21iYWxfdG1fcXVldWVfY2ZnICpzcmNvYmopCit7CisgICAgQlVHX09OKE5VTEwgPT0gZHN0b2JqKTsKKyAgICBCVUdfT04oTlVMTCA9PSBzcmNvYmopOworCisgICAgYmNtYmFsX3ByZXNlbmNlX21hc2sgZGVzdF9wcmVzZW5jZV9tYXNrOworCisgICAgLyogRmlyc3QsIGNvcHkgdGhlIGNvbW1vbiBvYmplY3QgYW5kIGtleXMgaW4gdGhlaXIgZW50aXJldHksIGV4Y2VwdCBmb3IgcHJlc2VydmluZyB0aGUgcHJlc2VuY2VfbWFzayAqLworICAgIGRlc3RfcHJlc2VuY2VfbWFzayA9IGRzdG9iai0+aGRyLmhkci5wcmVzZW5jZV9tYXNrOworICAgIGRzdG9iai0+aGRyID0gc3Jjb2JqLT5oZHI7CisgICAgZHN0b2JqLT5rZXkgPSBzcmNvYmotPmtleTsKKyAgICBkc3RvYmotPmhkci5oZHIucHJlc2VuY2VfbWFzayA9IGRlc3RfcHJlc2VuY2VfbWFzazsKKworICAgIC8qIE5vdyBjb3B5IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBvYmplY3QgKi8KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCB0bV9xdWV1ZSwgcHJpb3JpdHkpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIHRtX3F1ZXVlLCBwcmlvcml0eSwgc3Jjb2JqLT5kYXRhLnByaW9yaXR5KTsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgdG1fcXVldWUsIHdlaWdodCkpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgdG1fcXVldWUsIHdlaWdodCwgc3Jjb2JqLT5kYXRhLndlaWdodCk7CisgICAgfQorCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIHRtX3F1ZXVlLCByYXRlKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCB0bV9xdWV1ZSwgcmF0ZSwgc3Jjb2JqLT5kYXRhLnJhdGUpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCB0bV9xdWV1ZSwgYmFjKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCB0bV9xdWV1ZSwgYmFjLCBzcmNvYmotPmRhdGEuYmFjKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXJybm8gYmFsX29ial9rZXlfc3RyX2dldChiY21iYWxfb2JqICpvYmosIGNoYXIgKnBfb2JqX2tleV9zdHIpCit7CisgICAgQlVHX09OKE5VTEwgPT0gcF9vYmpfa2V5X3N0cik7CisKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisgICAgc3dpdGNoIChvYmotPm9ial90eXBlKQorICAgIHsKKworICAgICAgICBjYXNlIChCQ01CQUxfT0JKX0lEX0FDQ0VTU19URVJNSU5BTCk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwcmludGYocF9vYmpfa2V5X3N0ciwgInVuaXQ6JWQiLCAKKyAgICAgICAgICAgICAgICAgICAgKChiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZyAqKW9iaiktPmtleS5hY2Nlc3NfdGVybV9pZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY2FzZSAoQkNNQkFMX09CSl9JRF9JTlRFUkZBQ0UpOgorICAgICAgICB7CisgICAgICAgICAgICBzcHJpbnRmKHBfb2JqX2tleV9zdHIsICJpbnRmX2lkOiVkLCB0eXBlOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgKChiY21iYWxfaW50ZXJmYWNlX2NmZyAqKW9iaiktPmtleS5pbnRmX2lkLAorICAgICAgICAgICAgICAgICAgICAoKGJjbWJhbF9pbnRlcmZhY2VfY2ZnICopb2JqKS0+a2V5LmludGZfdHlwZSA9PSBCQ01CQUxfSU5URl9UWVBFX05OSSA/ICJOTkkiIDoKKyAgICAgICAgICAgICAgICAgICAgKChiY21iYWxfaW50ZXJmYWNlX2NmZyAqKW9iaiktPmtleS5pbnRmX3R5cGUgPT0gQkNNQkFMX0lOVEZfVFlQRV9QT04gPyAiUE9OIiA6CisgICAgICAgICAgICAgICAgICAgICI/Pz8iCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgKEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTCk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwcmludGYocF9vYmpfa2V5X3N0ciwgInN1Yl90ZXJtX2lkOiVkLCBpbnRmX2lkOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgKChiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgKilvYmopLT5rZXkuc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgICAgICgoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICopb2JqKS0+a2V5LmludGZfaWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIChCQ01CQUxfT0JKX0lEX0ZMT1cpOgorICAgICAgICB7CisgICAgICAgICAgICBzcHJpbnRmKHBfb2JqX2tleV9zdHIsICJmbG93X2lkOiVkLCB0eXBlOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgKChiY21iYWxfZmxvd19jZmcgKilvYmopLT5rZXkuZmxvd19pZCwKKyAgICAgICAgICAgICAgICAgICAgKChiY21iYWxfZmxvd19jZmcgKilvYmopLT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPyAidXBzdHJlYW0iIDoKKyAgICAgICAgICAgICAgICAgICAgKChiY21iYWxfZmxvd19jZmcgKilvYmopLT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSA/ICJkb3duc3RyZWFtIiA6CisgICAgICAgICAgICAgICAgICAgICgoYmNtYmFsX2Zsb3dfY2ZnICopb2JqKS0+a2V5LmZsb3dfdHlwZSA9PSBCQ01CQUxfRkxPV19UWVBFX0JST0FEQ0FTVCA/ICJicm9hZGNhc3QiIDoKKyAgICAgICAgICAgICAgICAgICAgKChiY21iYWxfZmxvd19jZmcgKilvYmopLT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfTVVMVElDQVNUID8gIm11bHRpY2FzdCIgOgorICAgICAgICAgICAgICAgICAgICAiPz8/IgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIChCQ01CQUxfT0JKX0lEX0dST1VQKToKKyAgICAgICAgeworICAgICAgICAgICAgc3ByaW50ZihwX29ial9rZXlfc3RyLCAiZ3JvdXBfaWQ6JWQiLAorICAgICAgICAgICAgICAgICAgICAoKGJjbWJhbF9ncm91cF9jZmcgKilvYmopLT5rZXkuZ3JvdXBfaWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIChCQ01CQUxfT0JKX0lEX1RNX1NDSEVEKToKKyAgICAgICAgeworICAgICAgICAgICAgc3ByaW50ZihwX29ial9rZXlfc3RyLCAiZGlyOiVzLCBpZDolZCIsCisgICAgICAgICAgICAgICAgICAgICgoYmNtYmFsX3RtX3NjaGVkX2NmZyAqKW9iaiktPmtleS5kaXIgPT0gQkNNQkFMX1RNX1NDSEVEX0RJUl9VUyA/ICJ1cHN0cmVhbSIgOgorICAgICAgICAgICAgICAgICAgICAoKGJjbWJhbF90bV9zY2hlZF9jZmcgKilvYmopLT5rZXkuZGlyID09IEJDTUJBTF9UTV9TQ0hFRF9ESVJfRFMgPyAiZG93bnN0cmVhbSIgOgorICAgICAgICAgICAgICAgICAgICAiPz8/IiwKKyAgICAgICAgICAgICAgICAgICAgKChiY21iYWxfdG1fc2NoZWRfY2ZnICopb2JqKS0+a2V5LmlkCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAKKworICAgICAgICBjYXNlIChCQ01CQUxfT0JKX0lEX1RNX1FVRVVFKToKKyAgICAgICAgeworICAgICAgICAgICAgc3ByaW50ZihwX29ial9rZXlfc3RyLCAic2NoZWRfaWQ6JWQsIHNjaGVkX2RpcjolcywgaWQ6JWQiLCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgKChiY21iYWxfdG1fcXVldWVfY2ZnICopb2JqKS0+a2V5LnNjaGVkX2lkLAorICAgICAgICAgICAgICAgICAgICAoKGJjbWJhbF90bV9xdWV1ZV9jZmcgKilvYmopLT5rZXkuc2NoZWRfZGlyID09IEJDTUJBTF9UTV9TQ0hFRF9ESVJfVVMgPyAidXBzdHJlYW0iIDoKKyAgICAgICAgICAgICAgICAgICAgKChiY21iYWxfdG1fcXVldWVfY2ZnICopb2JqKS0+a2V5LnNjaGVkX2RpciA9PSBCQ01CQUxfVE1fU0NIRURfRElSX0RTID8gImRvd25zdHJlYW0iIDoKKyAgICAgICAgICAgICAgICAgICAgIj8/PyIsCisgICAgICAgICAgICAgICAgICAgICgoYmNtYmFsX3RtX3F1ZXVlX2NmZyAqKW9iaiktPmtleS5pZAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBjYXNlIChCQ01CQUxfT0JKX0lEX1BBQ0tFVCk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwcmludGYocF9vYmpfa2V5X3N0ciwgIiAiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNwcmludGYocF9vYmpfa2V5X3N0ciwgIiAiKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21iYWxfaW50ZXJmYWNlX29iamVjdF9vdmVybGF5X3dfZHN0X3ByaW9yaXR5KGJjbWJhbF9pbnRlcmZhY2VfY2ZnICpkc3RvYmosIGJjbWJhbF9pbnRlcmZhY2VfY2ZnICpzcmNvYmopCit7CisgICAgQlVHX09OKE5VTEwgPT0gZHN0b2JqKTsKKyAgICBCVUdfT04oTlVMTCA9PSBzcmNvYmopOworICAgIAorICAgIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGRlc3RfcHJlc2VuY2VfbWFzazsKKyAgICAKKyAgICAvKiBGaXJzdCwgY29weSB0aGUgY29tbW9uIG9iamVjdCBhbmQga2V5cyBpbiB0aGVpciBlbnRpcmV0eSwKKyAgICAqIGV4Y2VwdCBmb3IgcHJlc2VydmluZyB0aGUgcHJlc2VuY2VfbWFzayAqLworICAgIGRlc3RfcHJlc2VuY2VfbWFzayA9IGRzdG9iai0+aGRyLmhkci5wcmVzZW5jZV9tYXNrOworICAgIGRzdG9iai0+aGRyID0gc3Jjb2JqLT5oZHI7CisgICAgZHN0b2JqLT5rZXkgPSBzcmNvYmotPmtleTsKKyAgICBkc3RvYmotPmhkci5oZHIucHJlc2VuY2VfbWFzayA9IGRlc3RfcHJlc2VuY2VfbWFzazsKKyAgICAKKyAgICAvKiBOb3cgY29weSBvbmx5IHRoZSBmaWVsZHMgdGhhdCBoYXZlIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBzb3VyY2UgYW5kIGFyZSBub3QgYWxyZWFkeSBzZXQgaW4gdGhlIGRzdCBvYmplY3QgKi8KKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgaW50ZXJmYWNlLCBhZG1pbl9zdGF0ZSkpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIGludGVyZmFjZSwgYWRtaW5fc3RhdGUpKQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGludGVyZmFjZSwgYWRtaW5fc3RhdGUsIHNyY29iai0+ZGF0YS5hZG1pbl9zdGF0ZSk7CisgICAgfQorICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBpbnRlcmZhY2UsIG1pbl9kYXRhX2FnZ19wb3J0X2lkKSkKKyAgICB7CisgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKGRzdG9iaiwgaW50ZXJmYWNlLCBtaW5fZGF0YV9hZ2dfcG9ydF9pZCkpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgaW50ZXJmYWNlLCBtaW5fZGF0YV9hZ2dfcG9ydF9pZCwgc3Jjb2JqLT5kYXRhLm1pbl9kYXRhX2FnZ19wb3J0X2lkKTsKKyAgICB9ICAgCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGludGVyZmFjZSwgbWluX2RhdGFfc3ZjX3BvcnRfaWQpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCBpbnRlcmZhY2UsIG1pbl9kYXRhX3N2Y19wb3J0X2lkKSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBpbnRlcmZhY2UsIG1pbl9kYXRhX3N2Y19wb3J0X2lkLCBzcmNvYmotPmRhdGEubWluX2RhdGFfc3ZjX3BvcnRfaWQpOworICAgIH0gICAgCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGludGVyZmFjZSwgdHJhbnNjZWl2ZXJfdHlwZSkpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIGludGVyZmFjZSwgdHJhbnNjZWl2ZXJfdHlwZSkpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgaW50ZXJmYWNlLCB0cmFuc2NlaXZlcl90eXBlLCBzcmNvYmotPmRhdGEudHJhbnNjZWl2ZXJfdHlwZSk7CisgICAgfSAgICAKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgaW50ZXJmYWNlLCBkc19taXNzX21vZGUpKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCBpbnRlcmZhY2UsIGRzX21pc3NfbW9kZSkpCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgaW50ZXJmYWNlLCBkc19taXNzX21vZGUsIHNyY29iai0+ZGF0YS5kc19taXNzX21vZGUpOworICAgIH0gIAorICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBpbnRlcmZhY2UsIG10dSkpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIGludGVyZmFjZSwgbXR1KSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBpbnRlcmZhY2UsIG10dSwgc3Jjb2JqLT5kYXRhLm10dSk7CisgICAgfQkJCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGludGVyZmFjZSwgZmxvd19jb250cm9sKSkKKyAgICB7CisgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKGRzdG9iaiwgaW50ZXJmYWNlLCBmbG93X2NvbnRyb2wpKQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGludGVyZmFjZSwgZmxvd19jb250cm9sLCBzcmNvYmotPmRhdGEuZmxvd19jb250cm9sKTsKKyAgICB9CisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGludGVyZmFjZSwgZHNfdG0pKQorICAgIHsKKyAgICAgICAgaWYoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoZHN0b2JqLCBpbnRlcmZhY2UsIGRzX3RtKSkKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBpbnRlcmZhY2UsIGRzX3RtLCBzcmNvYmotPmRhdGEuZHNfdG0pOworICAgIH0KKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgaW50ZXJmYWNlLCB1c190bSkpCisgICAgeworICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChkc3RvYmosIGludGVyZmFjZSwgdXNfdG0pKQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGludGVyZmFjZSwgdXNfdG0sIHNyY29iai0+ZGF0YS51c190bSk7CisgICAgfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21iYWxfaW50ZXJmYWNlX29iamVjdF9vdmVybGF5X3dfc3JjX3ByaW9yaXR5KGJjbWJhbF9pbnRlcmZhY2VfY2ZnICpkc3RvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9pbnRlcmZhY2VfY2ZnICAqc3Jjb2JqKQoreworICAgIEJVR19PTihOVUxMID09IGRzdG9iaik7CisgICAgQlVHX09OKE5VTEwgPT0gc3Jjb2JqKTsKKyAgICAKKyAgICBiY21iYWxfcHJlc2VuY2VfbWFzayBkZXN0X3ByZXNlbmNlX21hc2s7CisgICAgCisgICAgLyogRmlyc3QsIGNvcHkgdGhlIGNvbW1vbiBvYmplY3QgYW5kIGtleXMgaW4gdGhlaXIgZW50aXJldHksIGV4Y2VwdCBmb3IgcHJlc2VydmluZyB0aGUgcHJlc2VuY2VfbWFzayAqLworICAgIGRlc3RfcHJlc2VuY2VfbWFzayA9IGRzdG9iai0+aGRyLmhkci5wcmVzZW5jZV9tYXNrOworICAgIGRzdG9iai0+aGRyID0gc3Jjb2JqLT5oZHI7CisgICAgZHN0b2JqLT5rZXkgPSBzcmNvYmotPmtleTsKKyAgICBkc3RvYmotPmhkci5oZHIucHJlc2VuY2VfbWFzayA9IGRlc3RfcHJlc2VuY2VfbWFzazsKKyAgICAKKyAgICAvKiBOb3cgY29weSBvbmx5IHRoZSBmaWVsZHMgdGhhdCBoYXZlIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBzb3VyY2Ugb2JqZWN0ICovCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGludGVyZmFjZSwgYWRtaW5fc3RhdGUpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGludGVyZmFjZSwgYWRtaW5fc3RhdGUsIHNyY29iai0+ZGF0YS5hZG1pbl9zdGF0ZSk7CisgICAgfQorICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBpbnRlcmZhY2UsIG1pbl9kYXRhX2FnZ19wb3J0X2lkKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBpbnRlcmZhY2UsIG1pbl9kYXRhX2FnZ19wb3J0X2lkLCBzcmNvYmotPmRhdGEubWluX2RhdGFfYWdnX3BvcnRfaWQpOworICAgIH0KKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgaW50ZXJmYWNlLCBtaW5fZGF0YV9zdmNfcG9ydF9pZCkpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgaW50ZXJmYWNlLCBtaW5fZGF0YV9zdmNfcG9ydF9pZCwgc3Jjb2JqLT5kYXRhLm1pbl9kYXRhX3N2Y19wb3J0X2lkKTsKKyAgICB9ICAgIAorICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBpbnRlcmZhY2UsIHRyYW5zY2VpdmVyX3R5cGUpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGludGVyZmFjZSwgdHJhbnNjZWl2ZXJfdHlwZSwgc3Jjb2JqLT5kYXRhLnRyYW5zY2VpdmVyX3R5cGUpOworICAgIH0KKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHNyY29iaiwgaW50ZXJmYWNlLCBkc19taXNzX21vZGUpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGludGVyZmFjZSwgZHNfbWlzc19tb2RlLCBzcmNvYmotPmRhdGEuZHNfbWlzc19tb2RlKTsKKyAgICB9CisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGludGVyZmFjZSwgbXR1KSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBpbnRlcmZhY2UsIG10dSwgc3Jjb2JqLT5kYXRhLm10dSk7CisgICAgfQorICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBpbnRlcmZhY2UsIGZsb3dfY29udHJvbCkpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKGRzdG9iaiwgaW50ZXJmYWNlLCBmbG93X2NvbnRyb2wsIHNyY29iai0+ZGF0YS5mbG93X2NvbnRyb2wpOworICAgIH0gICAgCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChzcmNvYmosIGludGVyZmFjZSwgZHNfdG0pKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChkc3RvYmosIGludGVyZmFjZSwgZHNfdG0sIHNyY29iai0+ZGF0YS5kc190bSk7CisgICAgfQorICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoc3Jjb2JqLCBpbnRlcmZhY2UsIHVzX3RtKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoZHN0b2JqLCBpbnRlcmZhY2UsIHVzX3RtLCBzcmNvYmotPmRhdGEudXNfdG0pOworICAgIH0KKworfQorLypAfSovCisKKworI2VuZGlmIC8qIEJBTE9CSlNfSCAqLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9vc21zZy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF9vc21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Y2FmODUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX29zbXNnLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIGJhbF9vc21zZy5oCisgKiBAYnJpZWYgQkFMIE1lc3NhZ2UgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMKKyAqCisgKi8KKyNpZm5kZWYgQkFMX09TTVNHX0hfCisjZGVmaW5lIEJBTF9PU01TR19IXworLyoKKyAqIE1lc3NhZ2Ugc3RydWN0dXJlcy4KKyAqIEdvaW5nIHRvIGJlIGdlbmVyYXRlZCBmcm9tIG9iamVjdCBtb2RlbCBhbmQgbW92ZWQgZWxzZXdoZXJlCisgKi8KKworLyogQkFMIHN1YnN5c3RlbSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkFMX1NVQlNZU1RFTV9DT1JFLAorICAgIEJBTF9TVUJTWVNURU1fTUFDX1VUSUwsCisgICAgQkFMX1NVQlNZU1RFTV9TV0lUQ0hfVVRJTCwKKyAgICBCQUxfU1VCU1lTVEVNX1BVQkxJQ19BUEksCisKKyAgICBCQUxfU1VCU1lTVEVNX19OVU1fT0YKK30gYmFsX3N1YnN5c3RlbTsKKworCitfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgc3RhdGljIGNvbnN0IGNoYXIgKnN1YnN5c3RlbV9zdHJbXSA9Cit7CisgICAgIkJBTCBDb3JlIiwKKyAgICAiQkFMIE1hYyBVdGlsIiwKKyAgICAiQkFMIFN3aXRjaCBVdGlsIiwKKyAgICAiQkFMIFB1YmxpYyBBUEkiCit9OworCisvKiogQkFMIE9TIG1lc3NhZ2UKKyAqIFxpbmdyb3VwIHN5c3RlbV9tc2cKKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT1NfTVNHX0lEX19CRUdJTiwKKworICAgIC8qIE1lc3NhZ2VzIHVzZWQgaW50ZXJuYWxseSBieSBPUyBhYnN0cmFjdGlvbi4gRG8gbm90IHRvdWNoICovCisgICAgQkNNT1NfTVNHX0lEX0lOVEVSTkFMX1RJTUVSLCAgICAgICAgICAgIC8qKjwgSW50ZXJuYWwgInRpbWVyIG1lc3NhZ2UiIHR5cGUgKi8KKyAgICBCQ01PU19NU0dfSURfSU5URVJOQUxfRVZFTlQsICAgICAgICAgICAgLyoqPCBJbnRlcm5hbCAiZXZlbnQgbWVzc2FnZSIgdHlwZSAqLworICAgIEJDTU9TX01TR19JRF9JTlRFUk5BTF9JUEMsCisKKyAgICAvKiBBcHBsaWNhdGlvbiBtZXNzYWdlcyAqLworICAgIEJDTU9TX01TR19JRF9JUENfUElORywgICAgICAgICAgICAgICAgICAvKioqIEludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbiBwaW5nICovCisKKyAgICAvKiBDb3JlL1N3aXRjaCB1dGlsIG1lc3NhZ2VzICovCisgICAgQkNNQkFMX1NXSVRDSF9VVElMX01TRywKKworICAgIC8qIENvcmUvTWFjIHV0aWwgbWVzc2FnZXMgKi8KKyAgICBCQ01CQUxfTUFDX1VUSUxfTVNHLAorCisgICAgLyogQ29yZTwtPlB1YmxpYyBBUEkgbWVzc2FnZXMgKi8KKyAgICBCQ01CQUxfTUdNVF9NU0csCisKKyAgICAvKiBDb3JlLT5QdWJsaWMgQVBJIGluZGljYXRpb24gbWVzc2FnZXMgKGJvdGggYXV0byBhbmQgIm5vcm1hbCIpICovCisgICAgQkNNQkFMX01HTVRfQVBJX0lORF9NU0csCisKKyAgICBCQ01PU19NU0dfSURfRU9OX1BST1hZX1JYLAorICAgIEJDTU9TX01TR19JRF9FT05fREVTVFJPWV9TVEFURSwKKworICAgIEJDTU9TX01TR19JRF9FUE9OX09BTV9QUk9YWV9SWCwKKyAgICBCQ01PU19NU0dfSURfRVBPTl9PQU1fVElNRU9VVCwKKworCUJDTU9TX01TR19JRF9PTUNJX1RSQU5TUE9SVF9TRU5ELAorCisgICAgQkNNT1NfTVNHX0lEX19FTkQsCisgICAgQkNNT1NfTVNHX0lEX19GT1JDRTE2ID0gMHg3ZmZmCit9IGJjbW9zX21zZ19pZDsKKworCisjZW5kaWYgLyogQkFMX09TTVNHX0hfICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX3V0aWxzX21zZy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF91dGlsc19tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjcyMWZjCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF91dGlsc19tc2cuaApAQCAtMCwwICsxLDE4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RoZSBtZXNzYWdlIGZvcm1hdCB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8ICAgICAgICAgICAgIEJBTCBIZWFkZXIgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8IFBheWxvYWQgRGF0YSAgICAgICAgICAgICAgIHwKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8ICpiY21vc19oZWFkZXIgfCAgICAgICAgICAgICAgICAgIHwgIEFwcCBIZWFkZXIgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgIHZlcnNpb24gICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyB8ICAgdHlwZSAgICAgICAgfCAgIG1zZ190eXBlICAgICAgIHwgIG9ial9rZXkgICAgICAgICB8IGJhbF91dGlsX2luZF9mbG93X3QgICAgICAgIHwKKyB8ICAgICAgICAgICAgICAgfCAgIG1zZ19pZCAgICAgICAgIHwgIHN0YXR1cyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICpUaGUgYmNtb3MgSGVhZGVyIGlzIGFjdHVhbGx5IHRoZSBmaXJzdCBmaWVsZCBvZiBCQUwgSGVhZGVyIHN0cnVjdHVyZSAoYmFsX2NvbW1fbXNnX2hkcl90KQorIAorIHR5cGUgY2FuIGJlOiAKKyAgICAgICAgICAgICBCQ01CQUxfU1dJVENIX1VUSUxfTVNHCisgICAgICAgICAgICAgQkNNQkFMX01BQ19VVElMX01TRworICAgICAgICAgICAgICAKKyBtc2dfdHlwZSBjYW4gYmU6CisgICAgICAgICAgICAgQkFMX01TR19JTkQsCisgICAgICAgICAgICAgQkFMX01TR19BVVRPX0lORAorICAgICAgICAgICAgIAorIG1zZ19pZCBpcyBtb2R1bGUgc3BlY2lmaWMsIGJ1dCBjb250YWlucyB0d28gMTYgYml0cyBmaWVsZHMgKE9CSkVDVF9JRCwgT1BFUkFUSU9OX0lEKQorIHNlZSAgYmFsX29ianMuaCBmb3IgT0JKRUNUX0lEIGRldGFpbHMKKyBUaGUgT1BFUkFUSU9OX0lEIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIHRoZSBPQkpFQ1QgLSBzZWUgZXhhbXBsZSBiZWxvdworIGJhbF9tc2cuaAorIAorIHN0YXR1cyBpcyBmb3IgaW5kaWNhdGlvbiBtZXNzYWdlIHRvIHNob3cgZ2VuZXJhbCByZXN1bHRzLiBUaGUgdmFsdWUgaXMgYmNtb3NfZXJybm8uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX3V0aWxzX21zZy5oCisgKgorICogQGJyaWVmIENvbW1vbiBoZWFkZXIgZm9yIG1lc3NhZ2VzIHNlbnQgYmV0d2VlbiBVdGlscyBhbmQgQ29yZQorICoKKyAqIEBpbmdyb3VwIGFwcHMKKyAqLworCisjaWZuZGVmICBfQkFMX1VUSUxfTVNHX0hfCisjZGVmaW5lICBfQkFMX1VUSUxfTVNHX0hfCisKKy8qQHsqLworCisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEJBTF9VVElMX01TR19WRVJTSU9OICAxCisKKy8qIGFjY2VzcyB0ZXJtaW5hbCByZXF1ZXN0IGxpc3QsCisgKi8gIAordHlwZWRlZiBlbnVtCit7CisgICBCQUxfVVRJTF9PUEVSX0FDQ19URVJNX0NPTk5FQ1QsCisgICBCQUxfVVRJTF9PUEVSX0FDQ19URVJNX0RJU0NPTk5FQ1QKK30gYmFsX3V0aWxfb3Blcl9hY2NfdGVybTsKKworLyogc3Vic2NyaWJlciB0ZXJtaW5hbCByZXF1ZXN0IGxpc3QsCisgKi8gIAordHlwZWRlZiBlbnVtCit7CisgICBCQUxfVVRJTF9PUEVSX1NVQl9URVJNX0FERCwKKyAgIEJBTF9VVElMX09QRVJfU1VCX1RFUk1fUkVNT1ZFLAorICAgQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9DTEVBUiwKKyAgIEJBTF9VVElMX09QRVJfU1VCX1RFUk1fRElTQ09WRVJZCit9IGJhbF91dGlsX29wZXJfc3ViX3Rlcm07CisKKy8qIGludGVyZmFjZSByZXF1ZXN0IGxpc3QsCisgKi8gIAordHlwZWRlZiBlbnVtCit7CisgICBCQUxfVVRJTF9PUEVSX0lGX1VQLAorICAgQkFMX1VUSUxfT1BFUl9JRl9ET1dOCit9IGJhbF91dGlsX29wZXJfaWY7CisKKy8qIGZsb3cgcmVxdWVzdCBsaXN0LAorICovICAKK3R5cGVkZWYgZW51bQoreworICAgQkFMX1VUSUxfT1BFUl9GTE9XX0FERCwgICAgICAgIAorICAgQkFMX1VUSUxfT1BFUl9GTE9XX1JFTU9WRSwKKyAgIEJBTF9VVElMX09QRVJfRkxPV19DTEVBUgorfSBiYWxfdXRpbF9vcGVyX2Zsb3c7CisKK3R5cGVkZWYgZW51bQoreworICAgQkFMX1VUSUxfRkxPV19JTkRfU0VORF9OT05FLCAgICAgICAgCisgICBCQUxfVVRJTF9GTE9XX0lORF9TRU5EX1NVQ0NFU1MsCisgICBCQUxfVVRJTF9GTE9XX0lORF9TRU5EX0ZBSUwKK30gYmFsX3V0aWxfZmxvd19pbmQ7CisKKy8qIGdyb3VwIHJlcXVlc3QgbGlzdCwKKyAqLyAgCit0eXBlZGVmIGVudW0KK3sKKyAgIEJBTF9VVElMX09QRVJfR1JPVVBfQ1JFQVRFLAorICAgQkFMX1VUSUxfT1BFUl9HUk9VUF9BREQsICAgICAgICAKKyAgIEJBTF9VVElMX09QRVJfR1JPVVBfUkVNT1ZFLAorICAgQkFMX1VUSUxfT1BFUl9HUk9VUF9TRVQsCisgICBCQUxfVVRJTF9PUEVSX0dST1VQX0RFU1RST1kKK30gYmFsX3V0aWxfb3Blcl9ncm91cDsKKwordHlwZWRlZiBlbnVtCit7CisgICBCQUxfVVRJTF9PUEVSX0FHR19QT1JUX0FERCwKKyAgIEJBTF9VVElMX09QRVJfQUdHX1BPUlRfUkVNT1ZFLAorICAgQkFMX1VUSUxfT1BFUl9BR0dfUE9SVF9DTEVBUgorfSBiYWxfdXRpbF9vcGVyX2FnZ19wb3J0OworCisvKiBNYWNybyB0byByZXRyaWV2ZSB0aGUgbmFtZSBzdHJpbmcgb2YgdGhlIEdST1VQIG9wZXIgKi8KKyNkZWZpbmUgQkNNQkFMX1VUSUxfR1JPVVBfT1BFUl9TVFJfR0VUKF9fb3BfdHlwZV9fKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCBCQUxfVVRJTF9PUEVSX0dST1VQX0NSRUFURSAgPT0gX19vcF90eXBlX18gKSA/ICJjcmVhdGUiIDogICBcCisgICAgICAgICggQkFMX1VUSUxfT1BFUl9HUk9VUF9BREQgICAgID09IF9fb3BfdHlwZV9fICkgPyAiYWRkIiA6ICAgICAgXAorICAgICAgICAoIEJBTF9VVElMX09QRVJfR1JPVVBfUkVNT1ZFICA9PSBfX29wX3R5cGVfXyApID8gInJlbW92ZSIgOiAgIFwKKyAgICAgICAgKCBCQUxfVVRJTF9PUEVSX0dST1VQX1NFVCAgICAgPT0gX19vcF90eXBlX18gKSA/ICJzZXQiIDogICAgICBcCisgICAgICAgICggQkFMX1VUSUxfT1BFUl9HUk9VUF9ERVNUUk9ZID09IF9fb3BfdHlwZV9fICkgPyAiZGVzdHJveSIgOiAgXAorICAgICAgICAidW5rbm93biIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKiBiYWxfYXBwX21zZ19vYmpfa2V5X3QgYWxsb3cgYXBwbGljYXRpb25zIHRvIGlkIHdoaWNoIGluc3RhbmNlIG9mIG9iamVjdAorICogdGhpcyBtZXNzYWdlIHNob3VsZCBiZSBwcm9jZXNzZWQKKyAqLwordHlwZWRlZiB1bmlvbiBiYWxfdXRpbF9tc2dfb2JqX2tleQoreworICAgIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5IGFjY190ZXJtX2tleTsKKyAgICBiY21iYWxfaW50ZXJmYWNlX2tleSBpZl9rZXk7CisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5IHN1Yl90ZXJtX2tleTsKKyAgICBiY21iYWxfZmxvd19rZXkgZmxvd19rZXk7CisgICAgYmNtYmFsX2dyb3VwX2tleSBncm91cF9rZXk7CisgICAgYmNtYmFsX3RtX3NjaGVkX2tleSB0bV9zY2hlZF9rZXk7Cit9IGJhbF91dGlsX21zZ19vYmpfa2V5OworCisjZGVmaW5lICBCQ01CQUxfSU5WQUxJRF9UVU5ORUxfSUQgMHhmZmZmZmZmZgorIAorIC8qIGluZGljYXRpb24gbWVzc2FnZSBoZWFkZXIgKi8KKyB0eXBlZGVmIHN0cnVjdCBiYWxfdXRpbF9tc2dfaW5kCisgeyAgCisgICAgIGJhbF9jb21tX21zZ19oZHIgIGNvbW1faGRyOyAvKiBDb21tdW5pY2F0aW9uIGhlYWRlciAqLworICAgICB1aW50MzJfdCAgICAgICAgICB2ZXJzaW9uOyAgLyogdmVyc2lvbiBvZiB0aGUgYXBwIG1lc3NhZ2UgZm9ybWF0ICovCisgICAgIGJhbF91dGlsX21zZ19vYmpfa2V5IG9ial9rZXk7CisgICAgIGludDMyX3QgICAgICAgICAgIHN0YXR1czsgICAvKiBiY21vc19lcnJubyAqLworICAgICAvKiBPcHRpb25hbCBjdXN0b20gQkFMIE1BQy9TV0lUQ0ggVVRJTCBpbmRpY2F0aW9uIGRhdGEgZm9sbG93cyAqLworICAgICBjaGFyICAgICAgICAgICAgICBkYXRhWzBdOworIH0gYmFsX3V0aWxfbXNnX2luZDsKKyAKKyAvKiBhdXRvIGluZGljYXRpb24gbWVzc2FnZSBoZWFkZXIgKi8KKyB0eXBlZGVmIGJhbF91dGlsX21zZ19pbmQgYmFsX3V0aWxfbXNnX2F1dG9faW5kOworCisjZW5kaWYgIC8qIF9CQUxfVVRJTF9NU0dfSCAqLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF92ZXJzaW9uLmggYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL2luY2x1ZGUvYmFsX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzNmZjZiCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9pbmNsdWRlL2JhbF92ZXJzaW9uLmgKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERPIE5PVCBFRElUISBUSElTIEZJTEUgV0FTIEFVVE8gR0VORVJBVEVELiBETyBOT1QgRURJVCEgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE3OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE3IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisjaWYgIWRlZmluZWQoQkFMX1ZFUlNJT05fSCkKKyNkZWZpbmUgQkFMX1ZFUlNJT05fSAorCisjZGVmaW5lIEJBTF9WRVJTSU9OICAgICAgICAgICJSMDIuMDIuMDEuMTM5MTc3IgorI2RlZmluZSBCQUxfVkVSU0lPTl9TVFJfTEVOICAoMTcpCisKKyNkZWZpbmUgQkFMX0JVSUxEX0RBVEUgIlRodSBNYXIgMzAgMTg6MTU6MzUgSURUIDIwMTciCisjZGVmaW5lIEJBTF9CVUlMRF9JTkZPICAgICAgICIiCisKKyNlbmRpZiAgLyogQkFMX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9NYWtlZmlsZSBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODIzZDc4YwotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9NYWtlZmlsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vYmNtb3NfY29tbW9uLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmVjY2IyYWEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX2NvbW1vbi5jCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLzNyZHBhcnR5L21hcGxlL3Nkay9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfY29tbW9uLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX2NvbW1vbi5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hMzE3NDdhCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19jb21tb24uaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2NvbW1vbi5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19jb21tb24yLmggYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX2NvbW1vbjIuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iNWQ2ZjhmCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19jb21tb24yLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19jb21tb24yLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX2VuZGlhbi5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zYzEwMzZkCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19lbmRpYW4uaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2VuZGlhbi5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI0MDI1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX2Vycm5vLmMKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjliYWM4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX2Vycm5vLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19oYXNoX3RhYmxlLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX2hhc2hfdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44MWNiM2MwCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19oYXNoX3RhYmxlLmMKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19oYXNoX3RhYmxlLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX2hhc2hfdGFibGUuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vYmNtb3NfaGFzaF90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmMwMTExYmUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX2hhc2hfdGFibGUuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2hhc2hfdGFibGUuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vYmNtb3NfcGFjay5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19wYWNrLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzU4MmVkMQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vYmNtb3NfcGFjay5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLzNyZHBhcnR5L21hcGxlL3Nkay9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfcGFjay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19xdWV1ZS5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmNmMmQ4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX3F1ZXVlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19xdWV1ZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19yd19sb2NrLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX3J3X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iZWU4YzIzCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19yd19sb2NrLmMKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19yd19sb2NrLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX3J3X2xvY2suaCBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vYmNtb3NfcndfbG9jay5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmNkOWU4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX3J3X2xvY2suaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3J3X2xvY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vYmNtb3Nfc3lzaWYuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vYmNtb3Nfc3lzaWYuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hOWM4ZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc19zeXNpZi5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLzNyZHBhcnR5L21hcGxlL3Nkay9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3Nfc3lzaWYuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vYmNtb3NfdHJlZS5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc190cmVlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjI0MzNlNwotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb21tb24vb3NfYWJzdHJhY3Rpb24vYmNtb3NfdHJlZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLzNyZHBhcnR5L21hcGxlL3Nkay9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfdHJlZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc190eXBlcy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9iY21vc190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVlNDM1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2JjbW9zX3R5cGVzLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc190eXBlcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9jZmUgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2NmZQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41ZGJhMjdlCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9jZmUKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9jZmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL2xpbnV4IGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9saW51eApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lZTIyNDlkCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9saW51eApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2xpbnV4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9vc19jbGkgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL29zX2NsaQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wNzVmOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9vc19jbGkKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9vc19jbGkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL3Bvc2l4IGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9wb3NpeApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45ZjA0ZmVlCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi9wb3NpeApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL3Bvc2l4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi92eHdvcmtzNTUgYi9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL29zX2Fic3RyYWN0aW9uL3Z4d29ya3M1NQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41YTNiMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi9vc19hYnN0cmFjdGlvbi92eHdvcmtzNTUKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi92eHdvcmtzNTUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29tbW9uL3V0aWxzIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi91dGlscwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4xZDdhNThjCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvbW1vbi91dGlscwpAQCAtMCwwICsxIEBACisuLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9kcml2ZXIvdXRpbHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL01ha2VmaWxlIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGE2ZTAyCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9NYWtlZmlsZQpAQCAtMCwwICsxLDM5IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyMgIAorIyAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisjICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisjICAKKyMgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyMgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyMgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorIyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisjICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorIyAgCisjICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisjICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyMgICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyMgICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyMgICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorIyAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworIyAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyMgICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyMgIAorIyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisjICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyMgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisjICB3cml0dGVuIGNvbnNlbnQuCisjICAKKyMgIDo+CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJBTCBjb3JlIENMSSBhcHBsaWNhdGlvbgorIworTU9EX05BTUUgPSBiYWxfY29yZQorTU9EX0RFUFMgPSBjb21tb25faW5jbHVkZSBkZXZfbG9nIGNsaSBvc19jbGkgYmFsX2FwaSBiYWxfYXBpX2NsaSBiYWxfbWFjX3V0aWwgYmFsX3N3aXRjaF91dGlsIGJhbF9hcHBfdXRpbHMgcnNjbWdyIGJhbG9iam1zZyB0b3BvbG9neSBjbWRsaW5lCitNT0RfREVQU19PUFQgPSBvbWNpc3ZjCisKK01PRF9UWVBFID0gbGliCisKK3NyY3MgPSBiYWxfY29yZS5jIGJhbF9jbGkuYyBiYWxfd29ya2VyLmMgYWNjX3Rlcm1fZnNtLmMgc3ViX3Rlcm1fZnNtLmMgZmxvd19mc20uYyBmc21fY29tbW9uLmMgZ3JvdXBfZnNtLmMgdG1fc2NoZWRfZnNtLmMgdG1fcXVldWVfZnNtLmMKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vYWNjX3Rlcm1fZnNtLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2FjY190ZXJtX2ZzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NjM1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2FjY190ZXJtX2ZzbS5jCkBAIC0wLDAgKzEsMjQzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKgorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKgorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEBmaWxlIGFjY190ZXJtX2ZzbS5jCisgKiBAYnJpZWYgQ29kZSB0byBzdXBwb3J0IHRoZSBCQUwgYWNjZXNzIHRlcm1pbmFsIEZTTQorICoKKyAqIEBhZGR0b2dyb3VwIGFjY2Vzc190ZXJtaW5hbAorICovCisKKy8qQHsqLworCisjZGVmaW5lIEJBTF9EQkdfUFJJTlQKKworLyotLS0gcHJvamVjdCBpbmNsdWRlcyAtLS0qLworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGFjY190ZXJtX2ZzbS5oPgorI2luY2x1ZGUgPGJhbF9tc2cuaD4KKyNpbmNsdWRlIDxiYWxfYXBpLmg+CisjaW5jbHVkZSAiYmFsX3dvcmtlci5oIgorI2luY2x1ZGUgImJhbF9tYWNfdXRpbC5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfdXRpbC5oIgorI2luY2x1ZGUgPGJhbF9vc21zZy5oPgorI2luY2x1ZGUgPGZzbV9jb21tb24uaD4KKyNpbmNsdWRlIDxyc2NfbWdyLmg+CisjaW5jbHVkZSA8YmFsX2NvcmUuaD4KKworI2lmZGVmIEVOQUJMRV9MT0cKKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorCisvKgorICogQGJyaWVmIFRoZSBsb2dnaW5nIGRldmljZSBpZHMgZm9yIHRoZSBhY2Nlc3MtdGVybWluYWwgYW5kIGludGVyZmFjZQorICovCitzdGF0aWMgZGV2X2xvZ19pZCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsOworc3RhdGljIGRldl9sb2dfaWQgbG9nX2lkX2ludGVyZmFjZTsKKyNlbmRpZgorCisKKy8qLS0tIGxvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAgLS0tKi8KK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fdXBfb2soYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fZG5fc3RhcnQoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fZG5fb2soYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21faWdub3JlX21zZyhhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fdXBfcGVuZGluZyhhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fZG5fcGVuZGluZyhhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fYWRkaW5nX3Byb2Nlc3NfdXRpbF9tc2coYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gYWNjX3Rlcm1fZnNtX3JlbW92aW5nX3Byb2Nlc3NfdXRpbF9tc2coYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIGFjY190ZXJtX2ZzbV9wcm9jZXNzX3V0aWxfYXV0b19tc2coYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fcHJvY2Vzc19hZGRpbmdfdGltZW91dChhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fcHJvY2Vzc19yZW1vdmluZ190aW1lb3V0KGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fdXBfc3RhcnQoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBpbnRlcmZhY2VfYWRtaW5fdXBfc3RhcnQoYWNjX3Rlcm1faW50ZXJmYWNlICpwX2ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnKTsKKworc3RhdGljIGJjbW9zX2Vycm5vIGludGVyZmFjZV9hZG1pbl9kbl9zdGFydChhY2NfdGVybV9pbnRlcmZhY2UgKnBfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2cpOworCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgYWNjX3Rlcm1fZnNtX3RpbWVyX2V4cGlyeShiY21vc190aW1lciAqdGltZXIsIGxvbmcgcFVzZXIpOworCitzdGF0aWMgYmNtb3NfZXJybm8gYWNjZXNzX3Rlcm1pbmFsX2ZzbV9leGVjKGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm1faW5zdCwgYWNjX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworCisvKioKKyAqIGFjY2Vzcy10ZXJtaW5hbCBGU00gaGVscGVyIGZ1bmN0aW9ucworICovCitzdGF0aWMgYmNtb3NfZXJybm8gYWNjX3Rlcm1fZnNtX3N0YXRlX2VycihhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgdm9pZCBpbml0aWFsaXplX2FjY2Vzc190ZXJtaW5hbF9pbnN0YW5jZV9jb25maWcoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2lkX2xpc3RfZmlsbCh1aW50MzJfdCBpbnRlcmZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9zdWJfaWRfbGlzdF91MTYgKnN1Yl90ZXJtX2lkX2xpc3QpOworCisKK3N0YXRpYyBhY2NfdGVybV9pbnN0ICphY2Nlc3NfdGVybWluYWxfZ2V0KHZvaWQpOworc3RhdGljIGNoYXIgKmludGVyZmFjZV90eXBlX3N0cl9nZXQoYmNtYmFsX2ludGZfdHlwZSBpbnRmX3R5cGUpOworCitzdGF0aWMgYmNtb3NfZXJybm8gaW50ZXJmYWNlX3RtX3NjaGVkX3NldChiY21iYWxfaW50ZXJmYWNlX2NmZyAqcF9pbnRlcmZhY2VfaW5mbyk7CitzdGF0aWMgYWNjX3Rlcm1faW50ZXJmYWNlICogYmNtYmFsX2ludGVyZmFjZV9nZXQoYmNtYmFsX2ludGVyZmFjZV9rZXkga2V5KTsKKworI2RlZmluZSBBQ0NfVEVSTV9GU01fU1RBVEVfQURESU5HX1RJTUVPVVQgICAgICAgICAgICg0NSkgLyogU2Vjb25kcyAqLworCisvKgorICogQGJyaWVmIFRoZSBkZWZpbml0aW9uIG9mIGFuIGFjY2VzcyB0ZXJtaW5hbCBGU00gc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbgorICovCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqIGFjY190ZXJtX2ZzbV9zdGF0ZV9wcm9jZXNzb3IpKGFjY190ZXJtX2luc3QgKiwgdm9pZCAqLCBhY2NfdGVybV9mc21fZXZlbnQgKik7CisKK2V4dGVybiBiY21iYWxfY29uZmlnX3BhcmFtcyBiYWxfY29uZmlnX3BhcmFtczsKKworCisvKioKKyAqIEBicmllZiBBUEkgdG8gZ2V0IG9wZXIgc3RhdHVzIGZyb20gYWRtaW4gc3RhdGUgb2YgYW4gaW50ZXJmYWNlCisgKi8KK2JjbWJhbF9zdGF0dXMgYmNtYmFsX2dldF9pbnRmX29wZXJfc3RhdHVzX2Zyb21fYWRtaW5fc3RhdGUgKGJjbWJhbF9zdGF0ZSBpbnRmX2FkbWluX3N0YXRlKQoreworICAgIHN3aXRjaCAoaW50Zl9hZG1pbl9zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX1VQOgorICAgICAgICAgICAgcmV0dXJuIEJDTUJBTF9TVEFUVVNfVVA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJDTUJBTF9TVEFURV9ET1dOOgorICAgICAgICAgICAgcmV0dXJuIEJDTUJBTF9TVEFUVVNfRE9XTjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX1RFU1RJTkc6CisgICAgICAgICAgICByZXR1cm4gQkNNQkFMX1NUQVRVU19URVNUSU5HOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01CQUxfU1RBVFVTX1VQOyAgLyogZGVmYXVsdCBrZWVwIG9wZXIgc3RhdHVzIGFzIFVQICovCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNQkFMX1NUQVRVU19VUDsgIC8qIGRlZmF1bHQga2VlcCBvcGVyIHN0YXR1cyBhcyBVUCAqLworfQorCisKKy8qKgorICogQGJyaWVmIEFQSSB0byBjb252ZXJ0IHBvcnQgdHlwZSBhbmQgaWQgZnJvbSBDTEkvTWdtdCBpbnRlcmZhY2UgdG8gdGhlIGludGVybmFsCisgKiBpbmRleCBvZiBpbnRlcmZhY2UgYXJyYXkgZGF0YWJhc2UuCisgKi8KK3VpbnQzMl90IGJjbWJhbF9wb3J0X3R5cGVfYW5kX2lkX3RvX2ludGVyZmFjZV9pbmRleCAoYmNtYmFsX2ludGZfdHlwZSBpbnRmX3R5cGUsIGJjbWJhbF9pbnRmX2lkIGludGZfaWQpCit7CisgICAgc3dpdGNoIChpbnRmX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTUJBTF9JTlRGX1RZUEVfUE9OOgorICAgICAgICAgICAgaWYgKGludGZfaWQgPCBOVU1fU1VQUE9SVEVEX1NVQlNDUklCRVJfSU5URVJGQUNFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50Zl9pZDsgLyogemVybyBvZmZzZXQgZm9yIHRoZSBQT04gcG9ydHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNQkFMX0lOVEZfVFlQRV9OTkk6CisgICAgICAgICAgICBpZiAoaW50Zl9pZCA8IGJhbF9jb25maWdfcGFyYW1zLm51bV9ubmlfcG9ydHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChOVU1fU1VQUE9SVEVEX1NVQlNDUklCRVJfSU5URVJGQUNFUyArIGludGZfaWQpOyAvKiBvZmZzZXQtZWQgZm9yIHRoZSBOTkkgcG9ydHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gSU5WQUxJRF9JTlRFUkZBQ0VfSU5ERVg7CisKK30KKworCisvKgorICogQGJyaWVmIFRoZSBBY2Nlc3MgdGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgYXJyYXkKKyAqLworc3RhdGljIGFjY190ZXJtX2ZzbV9zdGF0ZV9wcm9jZXNzb3IgYWNjZXNzX3Rlcm1fc3RhdGVzW0FDQ19URVJNX0ZTTV9TVEFURV9fTlVNX09GXVtBQ0NfVEVSTV9GU01fRVZFTlRfVFlQRV9fTlVNX09GXSA9Cit7CisKKyAgICBbQUNDX1RFUk1fRlNNX1NUQVRFX05VTExdID0KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IEFERElORworICAgICAgICAgKi8KKyAgICAgICAgW0FDQ19URVJNX0ZTTV9FVkVOVF9UWVBFX0FETUlOX1VQXSAgICAgPSBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fdXBfc3RhcnQsCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogTlVMTAorICAgICAgICAgKi8KKyAgICAgICAgW0FDQ19URVJNX0ZTTV9FVkVOVF9UWVBFX0FETUlOX0ROXSAgICAgPSBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fZG5fb2ssCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogTlVMTAorICAgICAgICAgKi8KKyAgICAgICAgW0FDQ19URVJNX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHXSAgICAgICAgICAgICAgID0gYWNjX3Rlcm1fZnNtX2lnbm9yZV9tc2csCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogTlVMTAorICAgICAgICAgKi8KKyAgICAgICAgW0FDQ19URVJNX0ZTTV9FVkVOVF9UWVBFX1VUSUxfQVVUT19NU0ddICAgICAgICAgID0gYWNjX3Rlcm1fZnNtX3Byb2Nlc3NfdXRpbF9hdXRvX21zZywKKyAgICB9LAorCisgICAgW0FDQ19URVJNX0ZTTV9TVEFURV9BRERJTkddID0KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IEFERElORworICAgICAgICAgKi8KKyAgICAgICAgW0FDQ19URVJNX0ZTTV9FVkVOVF9UWVBFX0FETUlOX1VQXSAgICAgPSBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fdXBfcGVuZGluZywKKworICAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBBRERJTkcgfCBBRERFRAorICAgICAgICAgKi8KKyAgICAgICAgW0FDQ19URVJNX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHXSAgICAgICAgICAgICAgID0gYWNjX3Rlcm1fZnNtX2FkZGluZ19wcm9jZXNzX3V0aWxfbXNnLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IEFERElORworICAgICAgICAgKi8KKyAgICAgICAgW0FDQ19URVJNX0ZTTV9FVkVOVF9UWVBFX1VUSUxfQVVUT19NU0ddICAgICAgICAgID0gYWNjX3Rlcm1fZnNtX3Byb2Nlc3NfdXRpbF9hdXRvX21zZywKKworICAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBOVUxMCisgICAgICAgICAqLworICAgICAgICBbQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfVElNRU9VVF0gICAgICAgICAgICAgICA9IGFjY190ZXJtX2ZzbV9wcm9jZXNzX2FkZGluZ190aW1lb3V0LAorCisgICAgfSwKKworICAgIFtBQ0NfVEVSTV9GU01fU1RBVEVfQURERURdID0KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IEFEREVECisgICAgICAgICAqLworICAgICAgICBbQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfQURNSU5fVVBdICAgICA9IGFjY190ZXJtX2ZzbV9hY2NfdGVybV9hZG1pbl91cF9vaywKKworICAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBSRU1PVklORworICAgICAgICAgKi8KKyAgICAgICAgW0FDQ19URVJNX0ZTTV9FVkVOVF9UWVBFX0FETUlOX0ROXSAgICAgPSBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fZG5fc3RhcnQsCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogQURESU5HIHwgQURERUQKKyAgICAgICAgICovCisgICAgICAgIFtBQ0NfVEVSTV9GU01fRVZFTlRfVFlQRV9VVElMX01TR10gICAgICAgICAgICAgICA9IGFjY190ZXJtX2ZzbV9pZ25vcmVfbXNnLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IEFEREVECisgICAgICAgICAqLworICAgICAgICBbQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfVVRJTF9BVVRPX01TR10gICAgICAgICAgPSBhY2NfdGVybV9mc21fcHJvY2Vzc191dGlsX2F1dG9fbXNnLAorCisgICAgfSwKKworICAgIFtBQ0NfVEVSTV9GU01fU1RBVEVfUkVNT1ZJTkddID0KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IFJFTU9WSU5HCisgICAgICAgICAqLworICAgICAgICBbQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfQURNSU5fRE5dICAgICA9IGFjY190ZXJtX2ZzbV9hY2NfdGVybV9hZG1pbl9kbl9wZW5kaW5nLAorCisgICAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBSRU1PVklORyB8IE5VTEwKKyAgICAgICAgICovCisgICAgICAgIFtBQ0NfVEVSTV9GU01fRVZFTlRfVFlQRV9VVElMX01TR10gICAgICAgICAgICAgICA9IGFjY190ZXJtX2ZzbV9yZW1vdmluZ19wcm9jZXNzX3V0aWxfbXNnLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IFJFTU9WSU5HCisgICAgICAgICAqLworICAgICAgICBbQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfVVRJTF9BVVRPX01TR10gICAgICAgICAgPSBhY2NfdGVybV9mc21fcHJvY2Vzc191dGlsX2F1dG9fbXNnLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IE5VTEwKKyAgICAgICAgICovCisgICAgICAgIFtBQ0NfVEVSTV9GU01fRVZFTlRfVFlQRV9USU1FT1VUXSAgICAgICAgICAgICAgID0gYWNjX3Rlcm1fZnNtX3Byb2Nlc3NfcmVtb3ZpbmdfdGltZW91dCwKKyAgICB9LAorCit9OworCitzdGF0aWMgY2hhciAqc3RhdGVfbmFtZV9zdHJbXSA9Cit7CisgICAgIkFDQ19URVJNX05VTEwiLAorICAgICJBQ0NfVEVSTV9BRERJTkciLAorICAgICJBQ0NfVEVSTV9BRERFRCIsCisgICAgIkFDQ19URVJNX1JFTU9WSU5HIiwKK307CisKKy8qIEVuc3VyZSB0aGF0IHRoZSBuYW1lIGFycmF5IHNpemUgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBlbnVtICovCitCQUxfU1RBVElDX0FTU0VSVCAoQUNDX1RFUk1fRlNNX1NUQVRFX19MQVNUID09IChzaXplb2YgKHN0YXRlX25hbWVfc3RyKSAvIHNpemVvZiAoY2hhciAqKSksIGFjY190ZXJtX2ZzbV9zdGF0ZSk7CisKK3N0YXRpYyBjaGFyICphY2NfdGVybV9zdGF0ZV9uYW1lX2dldChhY2NfdGVybV9mc21fc3RhdGUgc3RhdGUpCit7CisgICAgaWYoc3RhdGUgPCBBQ0NfVEVSTV9GU01fU1RBVEVfX0xBU1QpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGVfbmFtZV9zdHJbc3RhdGVdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gIkFDQ19URVJNX1VOS05PV04iOworICAgIH0KK30KKworc3RhdGljIGNoYXIgKmV2ZW50X25hbWVfc3RyW10gPQoreworICAgICJBQ0NfVEVSTV9GU01fQUNDX1RFUk1fQURNSU5fVVBfRVZFTlQiLAorICAgICJBQ0NfVEVSTV9GU01fQUNDX1RFUk1fQURNSU5fRE5fRVZFTlQiLAorICAgICJBQ0NfVEVSTV9GU01fSU5UX0FETUlOX1VQX0VWRU5UIiwKKyAgICAiQUNDX1RFUk1fRlNNX0lOVF9BRE1JTl9ETl9FVkVOVCIsCisgICAgIkFDQ19URVJNX0ZTTV9VVElMX01TR19FVkVOVCIsCisgICAgIkFDQ19URVJNX0ZTTV9VVElMX0FVVE9fTVNHX0VWRU5UIiwKKyAgICAiQUNDX1RFUk1fRlNNX1RJTUVPVVRfRVZFTlQiCit9OworCisvKiBFbnN1cmUgdGhhdCB0aGUgbmFtZSBhcnJheSBzaXplIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgZW51bSAqLworQkFMX1NUQVRJQ19BU1NFUlQgKEFDQ19URVJNX0ZTTV9FVkVOVF9UWVBFX19MQVNUID09IChzaXplb2YgKGV2ZW50X25hbWVfc3RyKSAvIHNpemVvZiAoY2hhciAqKSksIGFjY190ZXJtX2ZzbV9ldmVudF90eXBlKTsKKworc3RhdGljIGNoYXIgKmFjY190ZXJtX2V2ZW50X25hbWVfZ2V0KGFjY190ZXJtX2ZzbV9ldmVudF90eXBlIGV2ZW50KQoreworICAgIGlmKGV2ZW50IDwgQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfX0xBU1QpCisgICAgeworICAgICAgICByZXR1cm4gZXZlbnRfbmFtZV9zdHJbZXZlbnRdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gIkFDQ19URVJNX0VWVF9VTktOT1dOIjsKKyAgICB9Cit9CisKK3N0YXRpYyBhY2NfdGVybV9pbnN0IHNpbmdsZV9hY2Nlc3NfdGVybWluYWxfaW5zdGFuY2U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gY2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIGFjY2Vzcy10ZXJtaW5hbCBGU00KKyAqICAgICAgICBpbmZyYXN0cnVjdHVyZS4KKyAqCisgKiAgICAgICAgTk9URTogVGhpcyBpcyBjYWxsZWQgb25jZSBvbiBzdGFydHVwIGFuZCBOT1QgZm9yIGVhY2ggRlNNIGluc3RhbmNlLgorICoKKyAqIEByZXR1cm5zIHZvaWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYWNjZXNzX3Rlcm1pbmFsX2ZzbV9pbml0KHZvaWQpCit7CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgLyogUmVnaXN0ZXIgdGhlIGxvZyBpZHMgZm9yIHRoaXMgRlNNICovCisgICAgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJBQ0NfVEVSTSIsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIEJVR19PTihsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsID09IERFVl9MT0dfSU5WQUxJRF9JRCk7CisKKyAgICBsb2dfaWRfaW50ZXJmYWNlID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoIklOVEYiLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICBCVUdfT04obG9nX2lkX2ludGVyZmFjZSA9PSBERVZfTE9HX0lOVkFMSURfSUQpOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemUgdGhlIGFjY2VzcyB0ZXJtaW5hbCBpbnN0YW5jZSBzdHJ1Y3R1cmVzCisgICAgICovCisgICAgaW5pdGlhbGl6ZV9hY2Nlc3NfdGVybWluYWxfaW5zdGFuY2VfY29uZmlnKCZzaW5nbGVfYWNjZXNzX3Rlcm1pbmFsX2luc3RhbmNlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEFjY2VzcyB0ZXJtaW5hbCBGU00gc3RhdGUgcHJvY2Vzc2luZyBleGVjdXRpdmUgZnVuY3Rpb24KKyAqCisgKiBAcGFyYW0gcF9hY2NfdGVybV9pbnN0ICBQb2ludGVyIHRvIGFuIGFjY2VzcyB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdGVybWluYWwgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBhY2Nlc3NfdGVybWluYWxfZnNtX2V4ZWMoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGFjY190ZXJtX2ZzbV9zdGF0ZSBwcmVfc3RhdGU7CisgICAgYWNjX3Rlcm1fZnNtX3N0YXRlX3Byb2Nlc3NvciBhY2NfdGVybV9zdGF0ZV9wcm9jZXNzb3I7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKE5VTEwgPT0gcF9hY2NfdGVybV9pbnN0KTsKKyAgICBCVUdfT04oTlVMTCA9PSBwX2V2ZW50KTsKKworICAgIC8qIFJlY29yZCB0aGUgcHJlc2VudCBzdGF0ZSBiZWZvcmUgdHJhbnNpdGlvbmluZworICAgICAqLworICAgIHByZV9zdGF0ZSA9IHBfYWNjX3Rlcm1faW5zdC0+ZnNtX3N0YXRlOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBhY2NfdGVybV9zdGF0ZV9wcm9jZXNzb3IgPSBhY2Nlc3NfdGVybV9zdGF0ZXNbcF9hY2NfdGVybV9pbnN0LT5mc21fc3RhdGVdW3BfZXZlbnQtPmV2ZW50X3R5cGVdOworCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSdzIGEgc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbiBmb3IgdGhpcyBldmVudCBhbmQgc3RhdGUsIGV4ZWN1dGUgaXQuCisgICAgICogT3RoZXJ3aXNlLCBwcm9jZXNzIGEgZ2VuZXJpYyBlcnJvci4KKyAgICAgKi8KKyAgICBpZiAoYWNjX3Rlcm1fc3RhdGVfcHJvY2Vzc29yKQorICAgIHsKKyAgICAgICAgcmV0ID0gYWNjX3Rlcm1fc3RhdGVfcHJvY2Vzc29yKHBfYWNjX3Rlcm1faW5zdCwgcF9ldmVudC0+bXNnLCBwX2V2ZW50KTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIGFjY190ZXJtX2ZzbV9zdGF0ZV9lcnIocF9hY2NfdGVybV9pbnN0LCBwX2V2ZW50LT5tc2csIHBfZXZlbnQpOworICAgIH0KKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsICIqKiogRlNNIGV4ZWM6IEV2ZW50ICVzLCBTdGF0ZTogJXMgLS0+ICVzXG4iLAorICAgICAgICAgICBhY2NfdGVybV9ldmVudF9uYW1lX2dldChwX2V2ZW50LT5ldmVudF90eXBlKSwKKyAgICAgICAgICAgYWNjX3Rlcm1fc3RhdGVfbmFtZV9nZXQocHJlX3N0YXRlKSwKKyAgICAgICAgICAgYWNjX3Rlcm1fc3RhdGVfbmFtZV9nZXQocF9hY2NfdGVybV9pbnN0LT5mc21fc3RhdGUpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2JjbW9zX2Vycm5vIHByb2Nlc3NfYWNjZXNzX3Rlcm1pbmFsX3V0aWxfbXNnKHZvaWQgKm1zZ19wYXlsb2FkKQoreworICAgIGFjY190ZXJtX2luc3QgKnBfYWNjZXNzX3Rlcm1pbmFsX2luc3Q7CisKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsICJBQ0NFU1NfVEVSTUlOQUwgaW5kaWNhdGlvbiByZWNlaXZlZCBmcm9tIHV0aWxcbiIpOworCisgICAgLyogRmluZCB0aGUgc3BlY2lmaWVkIGFjY2VzcyB0ZXJtaW5hbCBpbnN0YW5jZSAqLworICAgIHBfYWNjZXNzX3Rlcm1pbmFsX2luc3QgPSBhY2Nlc3NfdGVybWluYWxfZ2V0KCk7CisKKyAgICBpZiAoTlVMTCAhPSBwX2FjY2Vzc190ZXJtaW5hbF9pbnN0KQorICAgIHsKKyAgICAgICAgYWNjX3Rlcm1fZnNtX2V2ZW50IGV2ZW50OworCisgICAgICAgIGV2ZW50LmV2ZW50X3R5cGUgPSBBQ0NfVEVSTV9GU01fRVZFTlRfVFlQRV9VVElMX01TRzsKKyAgICAgICAgZXZlbnQubXNnID0gbXNnX3BheWxvYWQ7CisKKyAgICAgICAgYWNjZXNzX3Rlcm1pbmFsX2ZzbV9leGVjKHBfYWNjZXNzX3Rlcm1pbmFsX2luc3QsICZldmVudCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9pbnRlcmZhY2UsICJDb3VsZCBub3QgZmluZCB0aGUgQUNUSVZFIGFjY2Vzcy10ZXJtaW5hbFxuIik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBBY2Nlc3MgdGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZm9yIGFuIGFjY2Vzcy10ZXJtaW5hbAorICogICAgICAgIGFkbWluLXVwIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkgd2hlbiB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgYWNjZXNzLXRlcm1pbmFsIGluc3RhbmNlIGlzIGluIHRoZSBhZG1pbi1kb3duIHN0YXRlIChpLmUuIHdoZW4KKyAqICAgICAgICB0aGUgYWNjZXNzLXRlcm1pbmFsIGluc3RhbmNlIEZTTSBpcyBpbiB0aGUgTlVMTCBzdGF0ZSkuCisgKgorICogQHBhcmFtIHBfYWNjX3Rlcm1faW5zdCAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSQorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdGVybWluYWwgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fdXBfc3RhcnQoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGFjY190ZXJtX2ZzbV9zdGF0ZSBvbGRfc3RhdGUgPSBwX2FjY190ZXJtX2luc3QtPmZzbV9zdGF0ZTsKKworICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgYW4gYWRtaW4gVVAgcmVxdWVzdCBmcm9tIEJBTCBBUEkgLSBicmluZ2luZyBhY2Nlc3MgdGVybWluYWwgdXBcbiIpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGNoYW5nZSBhY2Nlc3MgdGVybWluYWwgc3RhdGUgdG8gQURESU5HICovCisgICAgICAgIHBfYWNjX3Rlcm1faW5zdC0+ZnNtX3N0YXRlID0gQUNDX1RFUk1fRlNNX1NUQVRFX0FERElORzsKKworICAgICAgICAvKiBzdGFydCB0aGUgdGltZW91dCB0aW1lciBmb3IgdGhlIEFERElORyBzdGF0ZSAqLworICAgICAgICBmc21fdGltZXJfc3RhcnQoJnBfYWNjX3Rlcm1faW5zdC0+dGltZXJfaW5mbywKKyAgICAgICAgICAgIHBfYWNjX3Rlcm1faW5zdCwKKyAgICAgICAgICAgIGFjY190ZXJtX2ZzbV90aW1lcl9leHBpcnksCisgICAgICAgICAgICBUSU1FUl9EVVJBVElPTl9JTl9TRUMoQUNDX1RFUk1fRlNNX1NUQVRFX0FERElOR19USU1FT1VUKSwKKyAgICAgICAgICAgIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwpOworCisgICAgICAgIC8qIFZhbGlkYXRlIHRoYXQgdGhlIE9MVCBTVyB2ZXJzaW9uIHRoYXQgdGhlIEJhbCB3YXMgY29tcGlsZWQgYWdhaW5zdCBtYXRjaGVzCisgICAgICAgICAqIHRoZSBTVyB2ZXJzaW9uIG9mIHRoZSBhY3R1YWwgT0xUIHRoYXQgdGhlIEJhbCB3b3JrcyB3aXRoLiBXZSBhc3N1bWUgdGhhdAorICAgICAgICAgKiBEZXZpY2UgSWQgMCBoYXMgdGhlIHNhbWUgdmVyc2lvbiBhcyBhbGwgb3RoZXIgT0xUIGRldmljZXMgKi8KKyAgICAgICAgaWYgKCFiY21iYWxfaXNfbWFjX2luX2xvb3BiYWNrKCkgJiYKKyAgICAgICAgICAgIChCQ01fRVJSX09LICE9IChyZXQgPSBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc3dfdmVyc2lvbl92YWxpZGF0ZSgoYmNtb2x0X2RldmlkKSAwKSkpKQorICAgICAgICB7CisgICAgICAgIAlCQ01fTE9HKEVSUk9SLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLCAibWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3N3X3ZlcnNpb25fdmFsaWRhdGUoKCkgZmFpbGVkLiByYz0lc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgIAlicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvcmUgY2FsbHMgTWFjIFV0aWxzIHRvIHNldCB0aGUgYWNjZXNzLXRlcm1pbmFsIHBhcmFtZXRlcnMgdXNpbmcgdGhlIGFwcGxpY2FibGUgU0RLIGNhbGxzICovCisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXQocF9hY2NfdGVybV9pbnN0LCBCQUxfVVRJTF9PUEVSX0FDQ19URVJNX0NPTk5FQ1QpKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwgIm1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXQoKCkgZmFpbGVkLiByYz0lc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfXdoaWxlKDApOworCisgICAgaWYoQkNNX0VSUl9PSyA9PSByZXQpCisgICAgeworICAgIAkvKgorICAgIAkqIFRoZSBhY2Nlc3MtdGVybWluYWwgb2JqZWN0IGNvbW1hbmQgaGFzIHN1Y2NlZWRlZC4gIFRoZSBjdXJyZW50IG9iamVjdCBpbmZvCisgICAgCSogYmVjb21lcyB0aGUgY29tbWFuZGVkIG9iamVjdCBpbmZvLCBleGNlcHQgZm9yIHRoZSBvcGVyX3N0YXR1cy4gIFRoaXMgc2hvdWxkCisgICAgCSogYmUgZG9uZSBhdG9taWNhbGx5CisgICAgCSovCisgICAgCW1lbWNweSgmcF9hY2NfdGVybV9pbnN0LT5jdXJyZW50X2FjY190ZXJtX29ial9pbmZvLAorICAgIAkJJnBfYWNjX3Rlcm1faW5zdC0+YXBpX3JlcV9hY2NfdGVybV9vYmpfaW5mbywKKyAgICAJCXNpemVvZihwX2FjY190ZXJtX2luc3QtPmFwaV9yZXFfYWNjX3Rlcm1fb2JqX2luZm8pKTsKKworICAgIAlCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfYWNjX3Rlcm1faW5zdC0+Y3VycmVudF9hY2NfdGVybV9vYmpfaW5mbyksIEJDTU9TX1RSVUUpOworCisgICAgCUJDTUJBTF9DRkdfUFJPUF9TRVQoJnBfYWNjX3Rlcm1faW5zdC0+Y3VycmVudF9hY2NfdGVybV9vYmpfaW5mbywKKyAgICAJCWFjY2Vzc190ZXJtaW5hbCwKKyAgICAJCW9wZXJfc3RhdHVzLAorICAgIAkJQkNNQkFMX1NUQVRVU19ET1dOKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAJZnNtX3RpbWVyX3N0b3AoJnBfYWNjX3Rlcm1faW5zdC0+dGltZXJfaW5mbyk7CisgICAgCXBfYWNjX3Rlcm1faW5zdC0+ZnNtX3N0YXRlID0gb2xkX3N0YXRlOworICAgCSAgICBtZ210X21zZ19zZW5kX2JhbGFwaV9pbmQocmV0LCBtc2csIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBBY2Nlc3MgdGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZm9yIGFuICBhY2Nlc3MtdGVybWluYWwKKyAqICAgICAgICBhZG1pbi11cCBjb21tYW5kIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJIHdoZW4gdGhlIHNwZWNpZmllZAorICogICAgICAgIGFjY2Vzcy10ZXJtaW5hbCBpcyBhbHJlYWR5IGFkbWluLXVwIChpLmUuIHdoZW4gdGhlIHNwZWNpZmllZAorICogICAgICAgIGFjY2Vzcy10ZXJtaW5hbCBpbnN0YW5jZSBGU00gaXMgaW4gdGhlIEFEREVEIHN0YXRlKS4KKyAqCisgKiBAcGFyYW0gcF9hY2NfdGVybV9pbnN0ICBQb2ludGVyIHRvIGFuIGFjY2VzcyB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB0ZXJtaW5hbCBldmVudCBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGFjY190ZXJtX2ZzbV9hY2NfdGVybV9hZG1pbl91cF9vayhhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgIlJlY2VpdmVkIGFuIGFkbWluIFVQIHJlcXVlc3QgZnJvbSBCQUwgQVBJIC0gcmV0dXJuaW5nIE9LIHRvIHRoZSBBUEkiCisgICAgICAgICAgICAiIC0gbm8gZnVydGhlciBmdW5jdGlvblxuIik7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgQWNjZXNzIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZvciBhbiBhY2Nlc3MtdGVybWluYWwKKyAqICAgICAgICBhZG1pbi1kb3duIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkgd2hlbiB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgYWNjZXNzLXRlcm1pbmFsIGlzIGFkbWluLXVwIChpLmUgd2hlbiB0aGUgc3BlY2lmaWVkIGFjY2Vzcy10ZXJtaW5hbAorICogICAgICAgIGluc3RhbmNlIEZTTSBpcyBpbiB0aGUgQURERUQgc3RhdGUpLgorICoKKyAqIEBwYXJhbSBwX2FjY190ZXJtX2luc3QgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYWNjX3Rlcm1fZnNtX2FjY190ZXJtX2FkbWluX2RuX3N0YXJ0KGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAiUmVjZWl2ZWQgYW4gYWRtaW4gRE9XTiByZXF1ZXN0IGZyb20gQkFMIEFQSSAtIHJlbW92aW5nIHRoZSBhY2Nlc3MgdGVybWluYWxcbiIpOworCisgICAgLyoKKyAgICAgKiBAdG9kbyAtIGNvbXBsZXRlIHRoZSBET1dOIGltcGxlbWVudGF0aW9uIC0gdW50aWwgdGhlbiwgcmV0dXJuIGFuIGVycm9yCisgICAgICovCisgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEFjY2VzcyB0ZXJtaW5hbCBGU00gc3RhdGUgcHJvY2Vzc2luZyBmb3IgYWNjZXNzLXRlcm1pbmFsCisgKiAgICAgICAgYWRtaW4tZG93biBjb21tYW5kIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJIHdoZW4gdGhlIHNwZWNpZmllZAorICogICAgICAgIGFjY2Vzcy10ZXJtaW5hbCBpcyBhbHJlYWR5IGFkbWluLWRvd24uCisgKgorICogQHBhcmFtIHBfYWNjX3Rlcm1faW5zdCAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSQorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdGVybWluYWwgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fZG5fb2soYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICJSZWNlaXZlZCBhbiBhZG1pbiBET1dOIHJlcXVlc3QgZnJvbSBCQUwgQVBJIC0gcmV0dXJuaW5nIE9LIHRvIHRoZSBBUEkiCisgICAgICAgICAgICAiIC0gbm8gZnVydGhlciBmdW5jdGlvblxuIik7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgQWNjZXNzIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRvIGlnbm9yZSBhCisgKiAgICAgICAgcmVjZWl2ZWQgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gcF9hY2NfdGVybV9pbnN0ICBQb2ludGVyIHRvIGFuIGFjY2VzcyB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB0ZXJtaW5hbCBldmVudCBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGFjY190ZXJtX2ZzbV9pZ25vcmVfbXNnKGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLCAiSWdub3JpbmcgbWVzc2FnZSBmcm9tIEJBTCBBUEkgXG4iKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgQWNjZXNzIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRvIHByb2Nlc3MgYW4KKyAqICAgICAgICBhY2Nlc3MtdGVybWluYWwgYWRtaW4tdXAgY29tbWFuZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSSB3aGVuIHRoZQorICogICAgICAgIHNwZWNpZmllZCBhY2Nlc3MtdGVybWluYWwgaXMgaW4gdGhlIFJFTU9WSU5HIHN0YXRlLgorICoKKyAqIEBwYXJhbSBwX2FjY190ZXJtX2luc3QgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYWNjX3Rlcm1fZnNtX2FjY190ZXJtX2FkbWluX3VwX3BlbmRpbmcoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAiIFJlY2VpdmVkIGFuIGFkbWluIFVQIHJlcXVlc3QgZnJvbSBCQUwgQVBJIC0gcmV0dXJuaW5nIFVQX1BFTkRJTkcgdG8gdGhlIEFQSSIKKyAgICAgICAgICAgICIgLSBubyBmdXJ0aGVyIGZ1bmN0aW9uXG4iKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBBY2Nlc3MgdGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gcHJvY2VzcyBhbgorICogICAgICAgIGFjY2Vzcy10ZXJtaW5hbCBhZG1pbi1kb3duIGNvbW1hbmQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkgd2hlbiB0aGUKKyAqICAgICAgICBzcGVjaWZpZWQgYWNjZXNzLXRlcm1pbmFsIEZTTSBpcyBpbiB0aGUgUkVNT1ZJTkcgc3RhdGUuCisgKgorICogQHBhcmFtIHBfYWNjX3Rlcm1faW5zdCAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSQorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdGVybWluYWwgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fYWNjX3Rlcm1fYWRtaW5fZG5fcGVuZGluZyhhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX0lOX1BST0dSRVNTOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICIgUmVjZWl2ZWQgYW4gYWRtaW4gRE9XTiByZXF1ZXN0IGZyb20gQkFMIEFQSSIKKyAgICAgICAgICAgICIgLSByZXR1cm5pbmcgSU5fUFJPR1JFU1MgdG8gdGhlIEFQSSAtIG5vIGZ1cnRoZXIgZnVuY3Rpb25cbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEFjY2VzcyB0ZXJtaW5hbCBGU00gc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbiB0byBwcm9jZXNzIGEKKyAqICAgICAgICBtZXNzYWdlIGZyb20gb25lIG9mIHRoZSBCQUwgYXBwcyB3aGVuIHRoZSBzcGVjaWZpZWQgYWNjZXNzLXRlcm1pbmFsCisgKiAgICAgICAgaW5zdGFuY2UgRlNNIGlzIGluIHRoZSBBRERJTkcgc3RhdGUuCisgKgorICogQHBhcmFtIHBfYWNjX3Rlcm1faW5zdCAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9uZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCBhcHBzLgorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdGVybWluYWwgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fYWRkaW5nX3Byb2Nlc3NfdXRpbF9tc2coYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgZmxvd19mc21fc3RhdGUgbmV4dF9zdGF0ZSA9IEFDQ19URVJNX0ZTTV9TVEFURV9OVUxMOworICAgIGJjbW9zX2Vycm5vIHJldDsKKyAgICBiYWxfdXRpbF9tc2dfaW5kICppbmRfbXNnOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IHBfYWNjX3Rlcm1faW5zdCk7CisgICAgQlVHX09OKE5VTEwgPT0gbXNnKTsKKyAgICBCVUdfT04oTlVMTCA9PSBwX2V2ZW50KTsKKworICAgIGluZF9tc2cgPSAoYmFsX3V0aWxfbXNnX2luZCAqKW1zZzsKKworICAgIHJldCA9IGluZF9tc2ctPnN0YXR1czsKKworICAgIC8qCisgICAgICogTk9URTogQVVUT19JTkQgbWVzc2FnZXMgYXJlIG5vdCBwcm9jZXNzZWQgaW4gdGhpcyBmdW5jdGlvbiwKKyAgICAgKiBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnNpZGVyIHRoZW0gaW4gdGhpcyBsb2dpYy4KKyAgICAgKi8KKyAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgIlJlY2VpdmVkIGFuIElORCBtZXNzYWdlIGZyb20gQkFMIFVUSUwgKCVzKSBkdXJpbmcgQURESU5HIHN0YXRlIHdpdGggc3RhdHVzICVzXG4iLAorICAgICAgICAgICAgICAgIHN1YnN5c3RlbV9zdHJbYmNtYmFsX3NlbmRlcl9nZXQobXNnKV0sCisgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmV0KQorICAgICAgICAgICAgICAgICk7CisgICAgfQorCisgICAvKgorICAgICogU3RvcCB0aGUgaW5kaWNhdGlvbiB0aW1lcgorICAgICovCisgICBmc21fdGltZXJfc3RvcCgmcF9hY2NfdGVybV9pbnN0LT50aW1lcl9pbmZvKTsKKworICAgaWYoQkNNX0VSUl9PSyA9PSByZXQpCisgICB7CisgICAgICAgLyogQ29yZSBjYWxscyBTd2l0Y2ggVXRpbHMgdG8gc2V0IHRoZSBhY2Nlc3MtdGVybWluYWwgcGFyYW1ldGVycyB1c2luZyB0aGUgYXBwbGljYWJsZSBTREsgY2FsbHMgKi8KKyAgICAgICByZXQgPSBzd191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXQocF9hY2NfdGVybV9pbnN0LCBCQUxfVVRJTF9PUEVSX0FDQ19URVJNX0NPTk5FQ1QpOworICAgICAgIGlmIChyZXQpCisgICAgICAgeworICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgICAgInN3X3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldCgoKSBmYWlsZWQuIHJjPSVzXG4iLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICB9CisKKyAgICAgICBpZihCQ01fRVJSX09LID09IHJldCkKKyAgICAgICB7CisgICAgICAgICAgIHVpbnQzMl90IGxvZ2ljYWxfcG9uOworCisgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnBfYWNjX3Rlcm1faW5zdC0+Y3VycmVudF9hY2NfdGVybV9vYmpfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1NUQVRVU19VUCk7CisKKyAgICAgICAgICAgLyoKKyAgICAgICAgICAgICogSW5pdGlhbGl6ZSB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbmx5IGlmIGF0IGxlYXN0IG9mIHRoZSBQT05zIG9uIHRoZSBkZXZpY2UgaXMgYSBHUE9OL1hHUE9OL1hHUy9OR1BPTjIgUE9OCisgICAgICAgICAgICAqLworICAgICAgICAgICBCQ01fVE9QT19ERVZfRk9SX0VBQ0hfUE9OKDAsIGxvZ2ljYWxfcG9uKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBiY21fdG9wb19wb25fZmFtaWx5IHBvbl9mYW1pbHkgPSBiY21fdG9wb19wb25fZ2V0X3Bvbl9mYW1pbHkobG9naWNhbF9wb24pOworCisgICAgICAgICAgICAgICBpZiAocG9uX2ZhbWlseSA9PSBCQ01fVE9QT19QT05fRkFNSUxZX0dQT04pCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcnNjX21ncl9tYWNfaW5pdCgpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisKKyAgICAgICAgICAgLyoKKyAgICAgICAgICAgICogR28gdG8gdGhlIEFEREVEIHN0YXRlIHVwb24gc3VjY2VzcworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgbmV4dF9zdGF0ZSA9IEFDQ19URVJNX0ZTTV9TVEFURV9BRERFRDsKKworCisgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgICAgIiBGYWlsZWQgaW4gc3RhdGUgJXM7JXNcbiIsCisgICAgICAgICAgICAgICAgICAgYWNjX3Rlcm1fc3RhdGVfbmFtZV9nZXQocF9hY2NfdGVybV9pbnN0LT5mc21fc3RhdGUpLAorICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJldCkpOworCisgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIEF1dG9tYXRpY2FsbHkgcmV0dXJuIHRvIHRoZSBOVUxMIHN0YXRlIGlmIGFuIGVycm9yIG9jY3VycworICAgICAgICAgICAgKi8KKyAgICAgICB9CisKKyAgICAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfYWNjX3Rlcm1faW5zdC0+Y3VycmVudF9hY2NfdGVybV9vYmpfaW5mbyksIEJDTU9TX0ZBTFNFKTsKKworICAgICAgIC8qCisgICAgICAgICogU2VuZCB0aGUgaW5kaWNhdGlvbiBiYWNrIHRvIHRoZSBCQUwgcHVibGljIEFQSSBoZXJlCisgICAgICAgICovCisgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcF9hY2NfdGVybV9pbnN0LT5jdXJyZW50X2FjY190ZXJtX29ial9pbmZvLmhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCk7CisKKworCisgICB9CisKKyAgIHBfYWNjX3Rlcm1faW5zdC0+ZnNtX3N0YXRlID0gbmV4dF9zdGF0ZTsKKworICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEFjY2VzcyB0ZXJtaW5hbCBGU00gc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbiB0byBwcm9jZXNzIGEKKyAqICAgICAgICBtZXNzYWdlIGZyb20gb25lIG9mIHRoZSBCQUwgYXBwcyByZWNlaXZlZCB3aGVuIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICBhY2Nlc3MtdGVybWluYWwgaW5zdGFuY2UgRlNNIGlzIGluIHRoZSBSRU1PVklORyBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gcF9hY2NfdGVybV9pbnN0ICBQb2ludGVyIHRvIGFuIGFjY2VzcyB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gb25lIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQkFMIGFwcHMuCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGFuIGFjY2VzcyB0ZXJtaW5hbCBldmVudCBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGFjY190ZXJtX2ZzbV9yZW1vdmluZ19wcm9jZXNzX3V0aWxfbXNnKGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQ7CisgICAgYmFsX3V0aWxfbXNnX2luZCAqaW5kX21zZzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04oTlVMTCA9PSBwX2FjY190ZXJtX2luc3QpOworICAgIEJVR19PTihOVUxMID09IG1zZyk7CisgICAgQlVHX09OKE5VTEwgPT0gcF9ldmVudCk7CisKKyAgICBpbmRfbXNnID0gKGJhbF91dGlsX21zZ19pbmQgKiltc2c7CisKKyAgICByZXQgPSBpbmRfbXNnLT5zdGF0dXM7CisKKyAgICAvKgorICAgICAqIE5PVEU6IEFVVE9fSU5EIG1lc3NhZ2VzIGFyZSBub3QgcHJvY2Vzc2VkIGluIHRoaXMgZnVuY3Rpb24sCisgICAgICogc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjb25zaWRlciB0aGVtIGluIHRoaXMgbG9naWMuCisgICAgICovCisKKyAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgIiBSZWNlaXZlZCBhbiBJTkQgbWVzc2FnZSBmcm9tIEJBTCBVVElMICglcykgZHVyaW5nIFJFTU9WSU5HIHN0YXRlXG4iLAorICAgICAgICAgICAgICAgIHN1YnN5c3RlbV9zdHJbYmNtYmFsX3NlbmRlcl9nZXQobXNnKV0pOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBBY2Nlc3MgdGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gcHJvY2VzcyBhbgorICogICAgICAgIEFVVE8gSU5EIG1lc3NhZ2UgZnJvbSBvbmUgb2YgdGhlIEJBTCBhcHBzLgorICoKKyAqIEBwYXJhbSBwX2FjY190ZXJtX2luc3QgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBvbmUgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBCQUwgYXBwcy4KKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYWNjX3Rlcm1fZnNtX3Byb2Nlc3NfdXRpbF9hdXRvX21zZyhhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKE5VTEwgPT0gcF9hY2NfdGVybV9pbnN0KTsKKyAgICBCVUdfT04oTlVMTCA9PSBtc2cpOworICAgIEJVR19PTihOVUxMID09IHBfZXZlbnQpOworCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgIiBSZWNlaXZlZCBhbiBBVVRPIElORCBtZXNzYWdlIGZyb20gQkFMIFVUSUwgKClcbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgSW50ZXJmYWNlIGFkbWluLXVwIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkgd2hlbgorICogICAgICAgIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIGluc3RhbmNlIGlzIGluIHRoZSBhZG1pbi11cCBzdGF0ZS4KKyAqCisgKiBAbm90ZSAgVGhpcyBoYW5kbGVyIGdldHMgY2FsbGVkIGZvciBib3RoIFBPTiBhbmQgTk5JIHR5cGUgaW50ZXJmYWNlcworICoKKyAqIEBwYXJhbSBwX2ludGVyZmFjZV9pbnN0IFBvaW50ZXIgdG8gYW4gaW50ZXJmYWNlIGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGludGVyZmFjZV9hZG1pbl91cF9zdGFydChhY2NfdGVybV9pbnRlcmZhY2UgKnBfaW50ZXJmYWNlX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZykKK3sKKwkJYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKwkJYmNtYmFsX2ludGVyZmFjZV9rZXkgKmtleSA9ICYocF9pbnRlcmZhY2VfaW5zdC0+YXBpX3JlcV9pbnRfb2JqX2luZm8ua2V5KTsKKworCQlCQ01fTE9HKElORk8sIGxvZ19pZF9pbnRlcmZhY2UsCisJCQkiIFJlY2VpdmVkIGFuIElOVEVSRkFDRSBhZG1pbiBVUCByZXF1ZXN0IGZyb20gQkFMIEFQSSIKKwkJCSIgLSBicmluZ2luZyBpbnRlcmZhY2UgKCVzJWQpIFVQIFxuIiwKKwkJCWludGVyZmFjZV90eXBlX3N0cl9nZXQoa2V5LT5pbnRmX3R5cGUpLAorCQkJa2V5LT5pbnRmX2lkKTsKKworCQlkbworCQl7CisJCQliY21iYWxfc3RhdGUgb2xkX2FkbWluX3N0YXRlID0gcF9pbnRlcmZhY2VfaW5zdC0+Y3VycmVudF9pbnRfb2JqX2luZm8uZGF0YS5hZG1pbl9zdGF0ZTsKKworCQkJLyoKKwkJCSogQ3JlYXRlIGEgcG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIGluc3RhbmNlIHNwZWNpZmllZCBieSB0aGUgdXNlcgorCQkJKi8KKworCQkJLyoKKwkJCSogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgbWluX2RhdGFfYWdnX3BvcnRfaWQgYXR0cmlidXRlIGZvciB0aGUgaW50ZXJmYWNlLCB0aGVuIHByb2dyYW0gdGhlIHJlc291cmNlIG1hbmFnZXIKKwkJCSogd2l0aCB0aGlzIHZhbHVlLglJdCB3aWxsIGFsc28gYmUgc2VudCB0byB0aGUgTUFDIGRldmljZSBmb3IgYW55IHJlcXVpcmVkIHByb2dyYW1taW5nIHRoZXJlLgorCQkJKi8KKwkJCWlmICgoQkNNQkFMX0lOVEZfVFlQRV9QT04gPT0ga2V5LT5pbnRmX3R5cGUpICYmCisJCQkJKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmcF9pbnRlcmZhY2VfaW5zdC0+YXBpX3JlcV9pbnRfb2JqX2luZm8sCisJCQkJaW50ZXJmYWNlLAorCQkJCW1pbl9kYXRhX2FnZ19wb3J0X2lkKSkgJiYKKwkJCQkoQkNNX0VSUl9PSyAhPSByc2NfbWdyX2FjY2Vzc19pbnRfYmFzZV9hbGxvY19pZF9zZXQoa2V5LT5pbnRmX2lkLAorCQkJCXBfaW50ZXJmYWNlX2luc3QtPmFwaV9yZXFfaW50X29ial9pbmZvLmRhdGEubWluX2RhdGFfYWdnX3BvcnRfaWQpKSkKKwkJCQl7CisJCQkJCUJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsICJFcnJvciB3aGlsZSBzZXR0aW5nIGJhc2UgYWdnX3BvcnRfaWQgKCVkKSBpbiB0aGUgcmVzb3VyY2UgbWFuYWdlclxuIiwKKwkJCQkJCXBfaW50ZXJmYWNlX2luc3QtPmFwaV9yZXFfaW50X29ial9pbmZvLmRhdGEubWluX2RhdGFfYWdnX3BvcnRfaWQpOworCisJCQkJCXJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJLyogQ2hhbmdlIHRoZSBpbnRlcmZhY2UgYWRtaW4gc3RhdGUgb2YgdGhlICJjdXJyZW50IiBpbnRlcmZhY2Ugb2JqZWN0IHRvIHVwICh0aGlzIGlzIGZvciByZXBvcnRpbmcpICovCisJCQlCQ01CQUxfQ0ZHX1BST1BfU0VUKCZwX2ludGVyZmFjZV9pbnN0LT5jdXJyZW50X2ludF9vYmpfaW5mbywKKwkJCQlpbnRlcmZhY2UsCisJCQkJYWRtaW5fc3RhdGUsCisJCQkJQkNNQkFMX1NUQVRFX1VQKTsKKworCQkJLyogQ29yZSBjYWxscyBNYWMgVXRpbHMgdG8gc2V0IHRoZSBpbnRlcmZhY2UgcGFyYW1ldGVycyB1c2luZyB0aGUgYXBwbGljYWJsZSBTREsgY2FsbHMgKi8KKwkJCXJldCA9IG1hY191dGlsX2ludGVyZmFjZV9zZXQocF9pbnRlcmZhY2VfaW5zdCwgQkFMX1VUSUxfT1BFUl9JRl9VUCk7CisKKwkJCWlmIChCQ01fRVJSX09LICE9IHJldCkKKwkJCXsKKwkJCQlCQ01CQUxfQ0ZHX1BST1BfU0VUKCZwX2ludGVyZmFjZV9pbnN0LT5jdXJyZW50X2ludF9vYmpfaW5mbywKKwkJCQkJaW50ZXJmYWNlLAorCQkJCQlhZG1pbl9zdGF0ZSwKKwkJCQkJb2xkX2FkbWluX3N0YXRlKTsKKworCQkJCUJDTV9MT0coRVJST1IsIGxvZ19pZF9pbnRlcmZhY2UsCisJCQkJCSJFcnJvciBkZXRlY3RlZCBieSBtYWNfdXRpbF9pbnRlcmZhY2Vfc2V0ICglcylcbiIsCisJCQkJCWJjbW9zX3N0cmVycm9yKHJldCkpOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0gd2hpbGUgKDApOworCisJCWlmIChCQ01fRVJSX09LICE9IHJldCkKKwkJeworCQkJLyogcmVwb3J0IHRoaXMgZXJyb3IgdG8gdGhlIEFQSSAqLworCQkJbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKwkJCQltc2csCisJCQkJbG9nX2lkX2ludGVyZmFjZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfaW50ZXJmYWNlX2luc3QtPmN1cnJlbnRfaW50X29ial9pbmZvKSwgQkNNT1NfVFJVRSk7CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgSW50ZXJmYWNlIGFkbWluLXVwIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkgd2hlbgorICogICAgICAgIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIGluc3RhbmNlIGlzIGluIHRoZSBhZG1pbi1kb3duIHN0YXRlLgorICoKKyAqIEBub3RlICBUaGlzIGhhbmRsZXIgZ2V0cyBjYWxsZWQgZm9yIGJvdGggUE9OIGFuZCBOTkkgdHlwZSBpbnRlcmZhY2VzCisgKgorICogQHBhcmFtIHBfaW50ZXJmYWNlX2luc3QgUG9pbnRlciB0byBhbiBpbnRlcmZhY2UgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gaW50ZXJmYWNlX2FkbWluX2RuX3N0YXJ0KGFjY190ZXJtX2ludGVyZmFjZSAqcF9pbnRlcmZhY2VfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnKQoreworCisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBiY21iYWxfaW50ZXJmYWNlX2tleSAqa2V5ID0gJihwX2ludGVyZmFjZV9pbnN0LT5hcGlfcmVxX2ludF9vYmpfaW5mby5rZXkpOworCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfaW50ZXJmYWNlLAorICAgICAgICAgICAgIiBSZWNlaXZlZCBhbiBJTlRFUkZBQ0UgYWRtaW4gRE9XTiByZXF1ZXN0IGZyb20gQkFMIEFQSSIKKyAgICAgICAgICAgICIgLSBicmluZ2luZyBpbnRlcmZhY2UgKCVzJWQpIERPV04gXG4iLAorICAgICAgICAgICAgaW50ZXJmYWNlX3R5cGVfc3RyX2dldChrZXktPmludGZfdHlwZSksCisgICAgICAgICAgICBrZXktPmludGZfaWQpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGJjbWJhbF9zdGF0ZSBvbGRfYWRtaW5fc3RhdGUgPSBwX2ludGVyZmFjZV9pbnN0LT5jdXJyZW50X2ludF9vYmpfaW5mby5kYXRhLmFkbWluX3N0YXRlOworCisgICAgICAgIC8qCisgICAgICAgICAqIENyZWF0ZSBhIHBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBpbnN0YW5jZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIKKyAgICAgICAgICovCisKKyAgICAgICAvKiBDb3JlIGNhbGxzIE1hYyBVdGlscyB0byBzZXQgdGhlIGludGVyZmFjZSBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBhcHBsaWNhYmxlIFNESyBjYWxscyAqLworICAgICAgICByZXQgPSBtYWNfdXRpbF9pbnRlcmZhY2Vfc2V0KHBfaW50ZXJmYWNlX2luc3QsIEJBTF9VVElMX09QRVJfSUZfRE9XTik7CisKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnBfaW50ZXJmYWNlX2luc3QtPmN1cnJlbnRfaW50X29ial9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfYWRtaW5fc3RhdGUpOworCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZGV0ZWN0ZWQgYnkgbWFjX3V0aWxfaW50ZXJmYWNlX3NldCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyZXQpKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwkJCisgICAgfSB3aGlsZSAoMCk7CisKKyAgICAvKiBDaGFuZ2UgdGhlIGludGVyZmFjZSBhZG1pbiBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnRlcmZhY2UgaW5mbyB0byBkb3duICovCisgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmcF9pbnRlcmZhY2VfaW5zdC0+Y3VycmVudF9pbnRfb2JqX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9TVEFURV9ET1dOKTsKKworICAgIC8qIENoZWNrIGZvciBhbnkgZXJyb3IgYW5kIHNlbmQgYW4gaW5kaWNhdGlvbiBpbW1lZGlhdGVseSBpbiB0aGF0IGNhc2UgKi8KKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgeworICAgICAgICAvKiByZXBvcnQgdGhpcyBlcnJvciB0byB0aGUgQVBJICovCisgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfaW50ZXJmYWNlKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfaW50ZXJmYWNlX2luc3QtPmN1cnJlbnRfaW50X29ial9pbmZvKSwgQkNNT1NfVFJVRSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgZnVuY3Rpb24gdG8gcHJvY2VzcyBhIHRpbWVyIGV4cGlyeSBmb3IgZWl0aGVyIHRoZSBBRERJTkcKKyAqICAgICAgICBzdGF0ZXMuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGFuCisgKiAgICAgICAgQUNDX1RFUk1fRlNNX1RJTUVPVVRfRVZFTlQgaW4gdGhlIEZTTSBzdGF0ZSBtYWNoaW5lLgorICoKKyAqIEBwYXJhbSB0aW1lciAtIEEgcG9pbnRlciB0byB0aGUgdGltZXIgaW5zdGFuY2UKKyAqIEBwYXJhbSBwVXNlciAtIEFuIG9wYXF1ZSBwb2ludGVyIHRvIGFuIGFjY2VzcyB0ZXJtaW5hbCBpbnN0YW5jZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX3RpbWVyX3JjID09IEJDTU9TX1RJTUVSX09LCisgKi8KK3N0YXRpYyBiY21vc190aW1lcl9yYyBhY2NfdGVybV9mc21fdGltZXJfZXhwaXJ5KGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBwVXNlcikKK3sKKyAgICBhY2NfdGVybV9mc21fZXZlbnQgYWNjX3Rlcm1fZXZlbnQ7CisKKyAgIC8qCisgICAgKiBTdG9wIHRoZSBpbmRpY2F0aW9uIHRpbWVyCisgICAgKi8KKyAgICBmc21fdGltZXJfc3RvcCh0aW1lcik7CisKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAidGltZXIgZXhwaXJ5XG4iKTsKKworICAgIC8qCisgICAgICogQSBtZXNzYWdlIHBvaW50ZXIgaXMgYWx3YXlzIHBhc3NlZCBpbnNpZGUgdGhlIGV2ZW50IHN0cnVjdHVyZS4gSW4gdGhpcyBjYXNlLCBpdCBpcyB1bnVzZWQKKyAgICAgKi8KKyAgICBhY2NfdGVybV9ldmVudC5tc2cgPSBOVUxMOworICAgIGFjY190ZXJtX2V2ZW50LmV2ZW50X3R5cGUgPSBBQ0NfVEVSTV9GU01fRVZFTlRfVFlQRV9USU1FT1VUOworCisgICAgLyogRGVjbGFyZSB0aGlzIG5vIGxvbmdlciBpbi1wcm9ncmVzcyAqLworICAgIEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfU0VUKCYoKChhY2NfdGVybV9pbnN0ICopcFVzZXIpLT5jdXJyZW50X2FjY190ZXJtX29ial9pbmZvKSwgQkNNT1NfRkFMU0UpOworCisgICAgLyoKKyAgICAgKiBSdW4gdGhlIGFjY2VzcyB0ZXJtaW5hbCBGU00gdG8gcHJvY2VzcyB0aGlzIGV2ZW50CisgICAgICovCisgICAgYWNjZXNzX3Rlcm1pbmFsX2ZzbV9leGVjKChhY2NfdGVybV9pbnN0ICopcFVzZXIsICZhY2NfdGVybV9ldmVudCk7CisKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgQWNjZXNzIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGEgdGltZW91dCB0aGF0IG9jY3VycworICogICAgICAgIHdoZW4gdGhlIEZTTSBpcyBpbiB0aGUgQURESU5HIHN0YXRlLiBJbiB0aGlzIGNhc2UsIHRoZSBGU00gc2hvdWxkCisgKiAgICAgICAganVzdCBnbyBiYWNrIHRvIHRoZSBOVUxMIHN0YXRlLgorICoKKyAqIEBwYXJhbSBwX2FjY190ZXJtX2luc3QgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYWNjX3Rlcm1fZnNtX3Byb2Nlc3NfYWRkaW5nX3RpbWVvdXQoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAiRXJyb3I6IFJlY2VpdmVkIGEgdGltZW91dCB3aGlsZSBpbiB0aGUgJXMgc3RhdGUuXG4iLAorICAgICAgICAgICAgYWNjX3Rlcm1fc3RhdGVfbmFtZV9nZXQocF9hY2NfdGVybV9pbnN0LT5mc21fc3RhdGUpKTsKKworCisgICAgLyoKKyAgICAgKiBTZW5kIHRoZSBpbmRpY2F0aW9uIGJhY2sgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGhlcmUKKyAgICAgKi8KKyAgICBtZ210X21zZ19zZW5kX2JhbGFwaV9pbmQoQkNNX0VSUl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSYocF9hY2NfdGVybV9pbnN0LT5jdXJyZW50X2FjY190ZXJtX29ial9pbmZvLmhkci5oZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsKTsKKworICAgIC8qCisgICAgICogR28gYmFjayB0byB0aGUgcHJldmlvdXMgc3RhdGUKKyAgICAgKi8KKyAgICBwX2FjY190ZXJtX2luc3QtPmZzbV9zdGF0ZSA9IEFDQ19URVJNX0ZTTV9TVEFURV9OVUxMOworICAgIEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfU0VUKCYocF9hY2NfdGVybV9pbnN0LT5jdXJyZW50X2FjY190ZXJtX29ial9pbmZvKSwgQkNNT1NfRkFMU0UpOworCisgICAgcmV0dXJuIHJldDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgQWNjZXNzIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGEgdGltZW91dCB0aGF0IG9jY3VycworICogICAgICAgIHdoZW4gdGhlIEZTTSBpcyBpbiB0aGUgUkVNT1ZJTkcgc3RhdGUuIEluIHRoaXMgY2FzZSwgdGhlIEZTTSBzaG91bGQKKyAqICAgICAgICBqdXN0IGdvIGJhY2sgdG8gdGhlIEFEREVEIHN0YXRlLgorICoKKyAqIEBwYXJhbSBwX2FjY190ZXJtX2luc3QgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYWNjX3Rlcm1fZnNtX3Byb2Nlc3NfcmVtb3ZpbmdfdGltZW91dChhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICJSZWNlaXZlZCBhIHRpbWVvdXQgd2hpbGUgaW4gdGhlICVzIHN0YXRlLiAgR29pbmcgYmFjayB0byB0aGUgQURERUQgc3RhdGVcbiIsCisgICAgICAgICAgICAgYWNjX3Rlcm1fc3RhdGVfbmFtZV9nZXQocF9hY2NfdGVybV9pbnN0LT5mc21fc3RhdGUpKTsKKworICAgIC8qCisgICAgICogR28gYmFjayB0byB0aGUgcHJldmlvdXMgc3RhdGUKKyAgICAgKi8KKyAgICBwX2FjY190ZXJtX2luc3QtPmZzbV9zdGF0ZSA9IEFDQ19URVJNX0ZTTV9TVEFURV9BRERFRDsKKworICAgIHJldHVybiByZXQ7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIGZ1bmN0aW9uIHRvIHByb2Nlc3MgYQorICogICAgICAgIG1lc3NhZ2UgZnJvbSBvbmUgb2YgdGhlIEJBTCBhcHBzIGZvciB0aGUgc3BlY2lmaWVkIGludGVyZmFjZQorICoKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9uZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCBhcHBzLgorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBwcm9jZXNzX2ludGVyZmFjZV91dGlsX21zZyh2b2lkICptc2cpCit7CisgICAgYmNtb3NfZXJybm8gICByZXQgPSBCQ01fRVJSX09LOworICAgIHVpbnQzMl90IGludGVyZmFjZV9pbmRleCA9IElOVkFMSURfSU5URVJGQUNFX0lOREVYOworICAgIGJhbF91dGlsX21zZ19pbmQgKmluZF9tc2c7CisgICAgYWNjX3Rlcm1faW50ZXJmYWNlICpwX2ludGVyZmFjZV9pbnN0OworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IG1zZyk7CisKKyAgICBpbmRfbXNnID0gKGJhbF91dGlsX21zZ19pbmQgKiltc2c7CisKKyAgICAvKgorICAgICAqIE5PVEU6IEFVVE9fSU5EIG1lc3NhZ2VzIGFyZSBub3QgcHJvY2Vzc2VkIGluIHRoaXMgZnVuY3Rpb24sCisgICAgICogc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjb25zaWRlciB0aGVtIGluIHRoaXMgbG9naWMuCisgICAgICovCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICIgUmVjZWl2ZWQgYW4gaW50ZXJmYWNlIElORCBtZXNzYWdlIGZyb20gQkFMIFVUSUwgKCVzKVxuIiwKKyAgICAgICAgICAgIHN1YnN5c3RlbV9zdHJbYmNtYmFsX3NlbmRlcl9nZXQobXNnKV0pOworCisgICAgaWYgKEJDTV9FUlJfT0sgPT0gaW5kX21zZy0+c3RhdHVzKQorICAgIHsKKyAgICAgICAgLyogZmlyc3QgZ2V0IHRoZSBpbmRleCB0byB0aGUgaW50ZXJmYWNlIGFycmF5IGZyb20gcG9ydCBpZC90eXBlICovCisgICAgICAgIGludGVyZmFjZV9pbmRleCA9IGJjbWJhbF9wb3J0X3R5cGVfYW5kX2lkX3RvX2ludGVyZmFjZV9pbmRleChpbmRfbXNnLT5vYmpfa2V5LmlmX2tleS5pbnRmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRfbXNnLT5vYmpfa2V5LmlmX2tleS5pbnRmX2lkKTsKKworICAgICAgICBpZiAoaW50ZXJmYWNlX2luZGV4ID49IElOVkFMSURfSU5URVJGQUNFX0lOREVYKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBwb3J0IHR5cGUvaWQgKCVzLyVkKSB0byBpbnRlcmZhY2UgaW5kZXggKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX3R5cGVfc3RyX2dldChpbmRfbXNnLT5vYmpfa2V5LmlmX2tleS5pbnRmX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICBpbmRfbXNnLT5vYmpfa2V5LmlmX2tleS5pbnRmX2lkLAorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfaW5kZXgpOworCisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBwX2ludGVyZmFjZV9pbnN0ID0gJihhY2Nlc3NfdGVybWluYWxfZ2V0KCktPmludGZfaW5mby5pbnRlcmZhY2VbaW50ZXJmYWNlX2luZGV4XSk7CisKKyAgICAgICAgaWYoQkNNX0VSUl9PSyA9PSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvcmUgY2FsbHMgU3dpdGNoIFV0aWxzIHRvIHNldCB0aGUgaW50ZXJmYWNlIHBhcmFtZXRlcnMgdXNpbmcgdGhlIGFwcGxpY2FibGUgU0RLIGNhbGwKKyAgICAgICAgICAgICAqIElmIGEgUE9OIHBvcnQgaXMgYmVpbmcgc2V0LCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGRpcmVjdCBjb25uZWN0IHN3aXRjaCBwb3J0IGlzIGFsc28KKyAgICAgICAgICAgICAqIHNldCBhbG9uZyB3aXRoIGl0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldCA9IHN3X3V0aWxfaW50ZXJmYWNlX3NldChwX2ludGVyZmFjZV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwX2ludGVyZmFjZV9pbnN0LT5hcGlfcmVxX2ludF9vYmpfaW5mby5kYXRhLmFkbWluX3N0YXRlID09IEJDTUJBTF9TVEFURV9ET1dOID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFMX1VUSUxfT1BFUl9JRl9ET1dOIDogQkFMX1VUSUxfT1BFUl9JRl9VUCkpOworCisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAic3dfdXRpbF9pbnRlcmZhY2Vfc2V0KCgpIGZhaWxlZC4gcmM9JXNcbiIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIkJhZCBpbnRlcmZhY2UgaW5kZXg6IGludGVyZmFjZSB0eXBlL2lkICglcy8lZCkgKHN0YXR1czogJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfdHlwZV9zdHJfZ2V0KGluZF9tc2ctPm9ial9rZXkuaWZfa2V5LmludGZfdHlwZSksCisgICAgICAgICAgICAgICAgICAgIGluZF9tc2ctPm9ial9rZXkuaWZfa2V5LmludGZfaWQsCisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKGluZF9tc2ctPnN0YXR1cykpOworICAgICAgICB9CisKKworCisgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyBpbnRlcmZhY2UgKCVkKSB0byAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAoQkNNQkFMX1NUQVRFX1VQID09IHBfaW50ZXJmYWNlX2luc3QtPmFwaV9yZXFfaW50X29ial9pbmZvLmRhdGEuYWRtaW5fc3RhdGUpID8KKyAgICAgICAgICAgICAgICAgICAgIlVQIiA6ICJET1dOIik7CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEludGVyZmFjZSBTRVQgZnVuY3Rpb24gc3VjY2VlZGVkLCBzbyBjb3B5IHRoZSBBUEkgcmVxdWVzdCBpbnRvIHRoZQorICAgICAgICAgICAgICogY3VycmVudCBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAgCisJCQliY21iYWxfaW50ZXJmYWNlX29iamVjdF9vdmVybGF5X3dfc3JjX3ByaW9yaXR5KCYocF9pbnRlcmZhY2VfaW5zdC0+Y3VycmVudF9pbnRfb2JqX2luZm8pLCYocF9pbnRlcmZhY2VfaW5zdC0+YXBpX3JlcV9pbnRfb2JqX2luZm8pKTsKKworICAgICAgICAgICAgLyogU2V0IHRoZSBzdGF0dXMgb2YgdGhlIGN1cnJlbnQgaW50ZXJmYWNlIHRoYXQgd2UganVzdCBjb25maWd1cmVkIHRvIHRoZSByZXF1ZXN0ZWQgc3RhdGUgKFVQIG9yIERPV04pICovCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZwX2ludGVyZmFjZV9pbnN0LT5jdXJyZW50X2ludF9vYmpfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2dldF9pbnRmX29wZXJfc3RhdHVzX2Zyb21fYWRtaW5fc3RhdGUocF9pbnRlcmZhY2VfaW5zdC0+YXBpX3JlcV9pbnRfb2JqX2luZm8uZGF0YS5hZG1pbl9zdGF0ZSkpOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIkJhZCByZXNwb25zZSBmcm9tIHN3aXRjaDogSW50ZXJmYWNlIHR5cGUvSWQ6ICVzLyVkIChzdGF0dXM6JXMpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX3R5cGVfc3RyX2dldChpbmRfbXNnLT5vYmpfa2V5LmlmX2tleS5pbnRmX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICBpbmRfbXNnLT5vYmpfa2V5LmlmX2tleS5pbnRmX2lkLAorICAgICAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihpbmRfbXNnLT5zdGF0dXMpKTsKKworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVycm9yICovCisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9pbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgIkJhZCBpbnRlcmZhY2UgaW5kaWNhdGlvbiBmcm9tIE1BQyAoc3RhdHVzOiVzKVxuIiwKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihpbmRfbXNnLT5zdGF0dXMpKTsKKyAgICB9CisKKyAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfaW50ZXJmYWNlX2luc3QtPmN1cnJlbnRfaW50X29ial9pbmZvKSwgQkNNT1NfRkFMU0UpOworCisgICAgLyoKKyAgICAgKiBTZW5kIHRoZSBpbmRpY2F0aW9uIGJhY2sgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGhlcmUKKyAgICAgKi8KKyAgICBtZ210X21zZ19zZW5kX2JhbGFwaV9pbmQocmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSYocF9pbnRlcmZhY2VfaW5zdC0+Y3VycmVudF9pbnRfb2JqX2luZm8uaGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2lkX2ludGVyZmFjZSk7CisKKyAgICByZXR1cm4gcmV0OworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBBY2Nlc3MgdGVybWluYWwgRlNNIGZ1bmN0aW9uIHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW4gYW4gZXJyb3IKKyAqICAgICAgICBpcyBlbmNvdW50ZXJlZCBkdXJpbmcgRlNNIHByb2Nlc3NpbmcuCisgKgorICogQHBhcmFtIHBfYWNjX3Rlcm1faW5zdCAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSAoTUFZIEJFIE5VTEwhKQorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdGVybWluYWwgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBhY2NfdGVybV9mc21fc3RhdGVfZXJyKGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX0lOVkFMSURfT1A7CisKKyAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgIkVycm9yIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgRlNNIC0gQkFEIEVWRU5UICAgZXZlbnQ6JXMsIHN0YXRlOiVzXG4iLAorICAgICAgICAgICAgYWNjX3Rlcm1fZXZlbnRfbmFtZV9nZXQocF9ldmVudC0+ZXZlbnRfdHlwZSksCisgICAgICAgICAgICBhY2NfdGVybV9zdGF0ZV9uYW1lX2dldChwX2FjY190ZXJtX2luc3QtPmZzbV9zdGF0ZSkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgY29yZSB3b3JrZXIgdGhyZWFkIHRvIHByb2Nlc3MgYW4KKyAqICAgICAgICBhY2Nlc3MtdGVybWluYWwgb2JqZWN0IG1lc3NhZ2UgKFNFVCwgR0VULCBDTEVBUiwgU1RBVFMpIHJlY2VpdmVkCisgKiAgICAgICAgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkuCisgKgorICogQHBhcmFtIG1zZ19wYXlsb2FkICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBCQUwgUHVibGljIEFQSS4KKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gcHJvY2Vzc19hY2Nlc3NfdGVybWluYWxfb2JqZWN0KHZvaWQgKm1zZ19wYXlsb2FkKQoreworCisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSywgcnNwX3JldCA9IEJDTV9FUlJfT0s7CisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2Nlc3NfdGVybWluYWxfaW5zdDsKKyAgICBhY2NfdGVybV9mc21fZXZlbnQgYWNjX3Rlcm1fZXZlbnQ7CisgICAgYmNtYmFsX29ial9tc2dfdHlwZSBvcGVyX3R5cGU7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKE5VTEwgPT0gbXNnX3BheWxvYWQpOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICJQcm9jZXNzaW5nIGFuIGFjY2Vzcy10ZXJtaW5hbCBvYmplY3RcbiIpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEZpbmQgb3IgY3JlYXRlIHRoZSBzcGVjaWZpZWQgYWNjZXNzIHRlcm1pbmFsIGluc3RhbmNlCisgICAgICAgICAqLworICAgICAgICBwX2FjY2Vzc190ZXJtaW5hbF9pbnN0ID0gYWNjZXNzX3Rlcm1pbmFsX2dldCgpOworCisgICAgICAgIG9wZXJfdHlwZSA9ICgoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmcgKiltc2dfcGF5bG9hZCktPmhkci5oZHIudHlwZTsKKworICAgICAgICAvKiBJZiB0aGUgc3RhdGUgb2YgdGhlIGFjY2Vzcy10ZXJtaW5hbCBpcyBpbiBmbHV4LCB0aGVuIHJlamVjdCB0aGUgU0VUIHJlcXVlc3QgKi8KKyAgICAgICAgaWYoQkNNQkFMX09CSl9NU0dfVFlQRV9TRVQgPT0gb3Blcl90eXBlICYmCisgICAgICAgICAgIEJDTU9TX1RSVUUgPT0gQkNNQkFMX09CSl9JTl9QUk9HUkVTU19HRVQoJihwX2FjY2Vzc190ZXJtaW5hbF9pbnN0LT5jdXJyZW50X2FjY190ZXJtX29ial9pbmZvKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgYWNjZXNzLXRlcm1pbmFsIGlzIGluLXByb2dyZXNzLCBTRVRzIGFyZSBub3QgYWxsb3dlZFxuIik7CisgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5fUFJPR1JFU1M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvcHkgdGhlIG9iamVjdCBpbiB0aGUgbWVzc2FnZSBpbnRvIGxvY2FsIHN0b3JhZ2UgKi8KKyAgICAgICAgbWVtY3B5KCZwX2FjY2Vzc190ZXJtaW5hbF9pbnN0LT5hcGlfcmVxX2FjY190ZXJtX29ial9pbmZvLAorICAgICAgICAgICAgICAgbXNnX3BheWxvYWQsCisgICAgICAgICAgICAgICBzaXplb2YocF9hY2Nlc3NfdGVybWluYWxfaW5zdC0+YXBpX3JlcV9hY2NfdGVybV9vYmpfaW5mbykpOworCisgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgImFjY2Vzc190ZXJtaW5hbCBhZG1pbiBzdGF0ZSBpczogJXNcbiIsCisgICAgICAgICAgICAgICAgKEJDTUJBTF9TVEFURV9VUCA9PSBwX2FjY2Vzc190ZXJtaW5hbF9pbnN0LT5hcGlfcmVxX2FjY190ZXJtX29ial9pbmZvLmRhdGEuYWRtaW5fc3RhdGUpID8KKyAgICAgICAgICAgICAgICAiVVAiIDogIkRPV04iKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBIG1lc3NhZ2UgcG9pbnRlciBpcyBhbHdheXMgcGFzc2VkIGluc2lkZSB0aGUgZXZlbnQgc3RydWN0dXJlLgorICAgICAgICAgKi8KKyAgICAgICAgYWNjX3Rlcm1fZXZlbnQubXNnID0gbXNnX3BheWxvYWQ7CisKKyAgICAgICAgLyogU0VUIG9yIEdFVCBvciAuLi4/ICovCisgICAgICAgIHN3aXRjaCAob3Blcl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIChCQ01CQUxfT0JKX01TR19UWVBFX1NFVCk6CisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3NpbmcgYSBhY2Nlc3MtdGVybWluYWwgU0VUIFJFUSBtZ210IG1lc3NhZ2VcbiIpOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDaGVjayBpZiB0aGUgbWFuZGF0b3J5IGFjY2Vzcy10ZXJtaW5hbCBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBhZG1pbiBzdGF0ZSBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5ICovCisgICAgICAgICAgICAgICAgICAgIGlmKEJDTU9TX0ZBTFNFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJnBfYWNjZXNzX3Rlcm1pbmFsX2luc3QtPmFwaV9yZXFfYWNjX3Rlcm1fb2JqX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbl9zdGF0ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTUFOREFUT1JZX1BBUk1fSVNfTUlTU0lORzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLypzZXQgaXdmX21vZGUgZnJvbSB0aGUgZ2xvYmFsIGNvbmZpZyBwYXJhbWV0ZXJzKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmcF9hY2Nlc3NfdGVybWluYWxfaW5zdC0+YXBpX3JlcV9hY2NfdGVybV9vYmpfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl3Zl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2NvbmZpZ19nZXQoKS0+aXdmX21vZGUpOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFBlcmZvcm0gdGhlIHZhbGlkYXRpb24gY2hlY2socykgdGhhdCB0aGUgdXRpbHMgcmVxdWlyZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPQorICAgICAgICAgICAgICAgICAgICAgICAocmV0ID0gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX2luZm9fdmFsaWRhdGUoJnBfYWNjZXNzX3Rlcm1pbmFsX2luc3QtPmFwaV9yZXFfYWNjX3Rlcm1fb2JqX2luZm8pKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUoMCk7CisKKyAgICAgICAgICAgICAgICAvKiBXZSByZXNwb25kIHRvIHRoZSBCQUwgcHVibGljIEFQSSBiYWNrZW5kIHdpdGggYSByZXN1bHQuIFdlIGFsd2F5cworICAgICAgICAgICAgICAgICAqIHNlbmQgYSBjb21wbGV0ZSBtc2dfcGF5bG9hZCBiYWNrIHRvIHRoZSBBUEksIGJ1dCB0aGUgZGF0YSBwb3J0aW9uCisgICAgICAgICAgICAgICAgICogb2YgdGhlIG9iamVjdCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gYSBHRVQgb3IgR0VULVNUQVRTIGhhcyBiZWVuIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByc3BfcmV0ID0gbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ19wYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCk7CisKKyAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJzcF9yZXQgfHwgQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiB0aGUgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwIGZ1bmN0aW9uIGFib3ZlIGxvZ3MgYW55IGVycm9ycyB0aGF0IG9jY3VyIHRoZXJlICovCisgICAgICAgICAgICAgICAgICAgIHJldCA9IChCQ01fRVJSX09LICE9IHJzcF9yZXQpID8gcnNwX3JldCA6IHJldDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogUmVmbGVjdCB0aGUgYWRtaW4gc3RhdGUgb2YgdGhlIGFjY2Vzcy10ZXJtaW5hbCBhY2NvcmRpbmcgdG8gdGhlIGNvbW1hbmRlZCBhZG1pbiBzdGF0ZSAqLworICAgICAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnBfYWNjZXNzX3Rlcm1pbmFsX2luc3QtPmN1cnJlbnRfYWNjX3Rlcm1fb2JqX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW5fc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYWNjZXNzX3Rlcm1pbmFsX2luc3QtPmFwaV9yZXFfYWNjX3Rlcm1fb2JqX2luZm8uZGF0YS5hZG1pbl9zdGF0ZSk7CisKKyAgICAgICAgICAgICAgICBpZihCQ01CQUxfU1RBVEVfVVAgPT0gcF9hY2Nlc3NfdGVybWluYWxfaW5zdC0+YXBpX3JlcV9hY2NfdGVybV9vYmpfaW5mby5kYXRhLmFkbWluX3N0YXRlKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBhY2NfdGVybV9ldmVudC5ldmVudF90eXBlID0gQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfQURNSU5fVVA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFjY190ZXJtX2V2ZW50LmV2ZW50X3R5cGUgPSBBQ0NfVEVSTV9GU01fRVZFTlRfVFlQRV9BRE1JTl9ETjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJ1biB0aGUgYWNjZXNzIHRlcm1pbmFsIEZTTSB0byBwcm9jZXNzIHRoaXMgZXZlbnQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXQgPSBhY2Nlc3NfdGVybWluYWxfZnNtX2V4ZWMocF9hY2Nlc3NfdGVybWluYWxfaW5zdCwgJmFjY190ZXJtX2V2ZW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAoQkNNQkFMX09CSl9NU0dfVFlQRV9HRVQpOgorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzaW5nIGEgYWNjZXNzLXRlcm1pbmFsIEdFVCBSRVEgbWdtdCBtZXNzYWdlXG4iKTsKKworICAgICAgICAgICAgICAgIHBfYWNjZXNzX3Rlcm1pbmFsX2luc3QtPmN1cnJlbnRfYWNjX3Rlcm1fb2JqX2luZm8uaGRyLmhkci5jb21tX2hkciA9ICgoYmNtYmFsX29iaiAqKW1zZ19wYXlsb2FkKS0+Y29tbV9oZHI7CisgICAgICAgICAgICAgICAgKigoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmcgKiltc2dfcGF5bG9hZCkgPSBwX2FjY2Vzc190ZXJtaW5hbF9pbnN0LT5jdXJyZW50X2FjY190ZXJtX29ial9pbmZvOworCisgICAgICAgICAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX3BheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBvcGVyYXRpb24gb24gYWNjZXNzLXRlcm1pbmFsIG9iamVjdCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX21zZ19pZF9vcGVyX2dldChtc2dfcGF5bG9hZCkpOworCisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworCisgICAgICAgICAgICAgICAgLyogV2UgcmVzcG9uZCB0byB0aGUgQkFMIHB1YmxpYyBBUEkgYmFja2VuZCB3aXRoIGEgcmVzdWx0LiBXZSBhbHdheXMKKyAgICAgICAgICAgICAgICAgKiBzZW5kIGEgY29tcGxldGUgbXNnX3BheWxvYWQgYmFjayB0byB0aGUgQVBJLCBidXQgdGhlIGRhdGEgcG9ydGlvbgorICAgICAgICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgaXMgb25seSByZWxldmFudCB3aGVuIGEgR0VUIG9yIEdFVC1TVEFUUyBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsIG9wZXJfdHlwZSwgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gcmV0cmlldmUgYW4gYWNjZXNzLXRlcm1pbmFsIGluc3RhbmNlCisgKgorICogQHJldHVybnMgYWNjX3Rlcm1faW5zdF90KiAgQSBwb2ludGVyIHRvIHRoZSBmb3VuZCBhY2Nlc3MtdGVybWluYWwgaW5zdGFuY2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIG9uZSBpcyBub3QgZm91bmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYWNjX3Rlcm1faW5zdCAqYWNjZXNzX3Rlcm1pbmFsX2dldCh2b2lkKQoreworICAgIGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0gPSAoYWNjX3Rlcm1faW5zdCAqKU5VTEw7CisKKyAgICBwX2FjY190ZXJtID0gJnNpbmdsZV9hY2Nlc3NfdGVybWluYWxfaW5zdGFuY2U7CisKKyAgICByZXR1cm4gcF9hY2NfdGVybTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgc3RhdHVzIG9mIHRoZSBhY2Nlc3MtdGVybWluYWwKKyAqCisgKgorICogQHJldHVybnMgYmNtYmFsX3N0YXR1cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtYmFsX3N0YXR1cyBhY2NfdGVybV9zdGF0dXNfZ2V0KHZvaWQpCit7CisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0OworCisgICAgcF9hY2NfdGVybV9pbnN0ID0gYWNjZXNzX3Rlcm1pbmFsX2dldCgpOworCisgICAgcmV0dXJuIHBfYWNjX3Rlcm1faW5zdC0+Y3VycmVudF9hY2NfdGVybV9vYmpfaW5mby5kYXRhLm9wZXJfc3RhdHVzOworCit9CisKK3N0YXRpYyBiY21vc19lcnJubyBpbnRlcmZhY2VfdG1fc2NoZWRfc2V0KGJjbWJhbF9pbnRlcmZhY2VfY2ZnICpwX2ludGVyZmFjZV9pbmZvKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgdG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZF9pbnN0OworICAgIGJjbWJhbF90bV9zY2hlZF9rZXkgdG1fa2V5OworICAgIHN3aXRjaChwX2ludGVyZmFjZV9pbmZvLT5rZXkuaW50Zl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01CQUxfSU5URl9UWVBFX1BPTjoKKyAgICAgICAgeworICAgICAgICAgICAgLypmb3IgYWN0aXZlIHBvbiBpbnRlcmZhY2U6CisgICAgICAgICAgICAgICAgICAgICAgIGRzX3RtIHNob3VsZCBiZSBkZWZpbmUsIC0gaWYgaXQgaXMgc2V0LCB2YWxpZGF0ZSBzY2hlZCBleGlzdCBhbmQgbWF0Y2ggZGlyZWN0aW9uIChkcykKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNldCAtIHdpbGwgY3JlYXRlIGF1dG8gY3JlYXRlZCB0bSAgICAgICAgICAgICovCisgICAgICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfaW50ZXJmYWNlX2luZm8saW50ZXJmYWNlLGRzX3RtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bV9rZXkuZGlyID0gQkNNQkFMX1RNX1NDSEVEX0RJUl9EUzsKKyAgICAgICAgICAgICAgICB0bV9rZXkuaWQgPSBwX2ludGVyZmFjZV9pbmZvLT5kYXRhLmRzX3RtOworICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdCA9IHRtX3NjaGVkX2luc3RfZ2V0KHRtX2tleSwgVE1fU0NIRURfRkxBR19BQ1RJVkUpOworICAgICAgICAgICAgICAgIGlmIChOVUxMID09IHBfdG1fc2NoZWRfaW5zdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9pbnRlcmZhY2UsICJ0aGVyZSBpcyBubyBkcyB0bSBzY2hlZCB3aXRoIGlkICVkIiwgdG1fa2V5LmlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCQkJCXJldCA9IGJjbWJhbF90bV9zY2hlZF9zZXRfaW50ZXJmYWNlX293bmVyKHBfaW50ZXJmYWNlX2luZm8tPmtleSwgcF90bV9zY2hlZF9pbnN0KTsKKwkJCQlpZihCQ01fRVJSX09LICE9IHJldCkKKwkJCQl7CisJCQkJCUJDTV9MT0coRVJST1IsIGxvZ19pZF9pbnRlcmZhY2UsICJjb3VsZCBub3Qgc2V0IGludGVyZmFjZSAlZCBhcyBvd25lciBvZiB0bSBzY2hlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2ludGVyZmFjZV9pbmZvLT5rZXkuaW50Zl9pZCwgdG1fa2V5LmlkKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKmF1dG8gY3JlYXRlZCBzY2hlZCB3YXMgcmVtb3ZlZCBhbmQgbm8gb3RoZXIgZGVmYXVsdCBzY2hlZCB3YXMgc2V0Ki8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLCAiZGVmYXVsdCB0bSBub2RlIG11c3QgYmUgc2V0ISAiKTsKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX01BTkRBVE9SWV9QQVJNX0lTX01JU1NJTkc7CisgICAgICAgICAgICAgICAgYnJlYWs7IAkJCQkKKyAgICAgICAgICAgIH0JCQkKKwkJCS8qIHVzX3RtIGlzIG9wdGlvbmFsIC0gaWYgaXQgaXMgc2V0LCB2YWxpZGF0ZSBzY2hlZCBleGlzdCBhbmQgbWF0Y2ggZGlyZWN0aW9uICh1cykqLworCQkgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2ludGVyZmFjZV9pbmZvLCBpbnRlcmZhY2UsIHVzX3RtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bV9rZXkuZGlyID0gQkNNQkFMX1RNX1NDSEVEX0RJUl9VUzsKKyAgICAgICAgICAgICAgICB0bV9rZXkuaWQgPSBwX2ludGVyZmFjZV9pbmZvLT5kYXRhLnVzX3RtOworICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdCA9IHRtX3NjaGVkX2luc3RfZ2V0KHRtX2tleSwgVE1fU0NIRURfRkxBR19BQ1RJVkUpOworICAgICAgICAgICAgICAgIGlmIChOVUxMID09IHBfdG1fc2NoZWRfaW5zdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9pbnRlcmZhY2UsICJ0aGVyZSBpcyBubyB1cyB0bSBzY2hlZCB3aXRoIGlkICVkIiwgdG1fa2V5LmlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCQkJCXJldCA9IGJjbWJhbF90bV9zY2hlZF9zZXRfaW50ZXJmYWNlX293bmVyKHBfaW50ZXJmYWNlX2luZm8tPmtleSwgcF90bV9zY2hlZF9pbnN0KTsKKwkJCQlpZihCQ01fRVJSX09LICE9IHJldCkKKwkJCQl7CisJCQkJCUJDTV9MT0coRVJST1IsIGxvZ19pZF9pbnRlcmZhY2UsICJjb3VsZCBub3Qgc2V0IGludGVyZmFjZSAlZCBhcyBvd25lciBvZiB0bSBzY2hlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2ludGVyZmFjZV9pbmZvLT5rZXkuaW50Zl9pZCwgdG1fa2V5LmlkKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01CQUxfSU5URl9UWVBFX05OSToKKyAgICAgICAgeworICAgICAgICAgICAgLypmb3IgYWN0aXZlIG5uaSBpbnRlcmZhY2U6CisgICAgICAgICAgICB1c190bSBzaG91bGQgYmUgZGVmaW5lLCAtCisgICAgICAgICAgICBpZiBpdCBpcyBzZXQsIHZhbGlkYXRlIHNjaGVkIGV4aXN0IGFuZCBtYXRjaCBkaXJlY3Rpb24gKHVzKQorICAgICAgICAgICAgaWYgbm90IHNldCAtIHdpbGwgY3JlYXRlIGF1dG8gY3JlYXRlZCB0bQorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9pbnRlcmZhY2VfaW5mbywgaW50ZXJmYWNlLCB1c190bSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1fa2V5LmRpciA9IEJDTUJBTF9UTV9TQ0hFRF9ESVJfVVM7CisgICAgICAgICAgICAgICAgdG1fa2V5LmlkID0gcF9pbnRlcmZhY2VfaW5mby0+ZGF0YS51c190bTsKKyAgICAgICAgICAgICAgICBwX3RtX3NjaGVkX2luc3QgPSB0bV9zY2hlZF9pbnN0X2dldCh0bV9rZXksIFRNX1NDSEVEX0ZMQUdfQUNUSVZFKTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBwX3RtX3NjaGVkX2luc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLCAidGhlcmUgaXMgbm8gdXMgdG0gc2NoZWQgd2l0aCBpZCAlZCIsIHRtX2tleS5pZCk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworCQkJCXJldCA9IGJjbWJhbF90bV9zY2hlZF9zZXRfaW50ZXJmYWNlX293bmVyKHBfaW50ZXJmYWNlX2luZm8tPmtleSwgcF90bV9zY2hlZF9pbnN0KTsKKwkJCQlpZihCQ01fRVJSX09LICE9IHJldCkKKwkJCQl7CisJCQkJCUJDTV9MT0coRVJST1IsIGxvZ19pZF9pbnRlcmZhY2UsICJjb3VsZCBub3Qgc2V0IGludGVyZmFjZSAlZCBhcyBvd25lciBvZiB0bSBzY2hlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2ludGVyZmFjZV9pbmZvLT5rZXkuaW50Zl9pZCwgdG1fa2V5LmlkKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKmF1dG8gY3JlYXRlZCBzY2hlZCB3YXMgcmVtb3ZlZCBhbmQgbm8gb3RoZXIgZGVmYXVsdCBzY2hlZCB3YXMgc2V0Ki8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLCAiZGVmYXVsdCB0bSBub2RlIG11c3QgYmUgc2V0ISAiKTsKKyAgICAgICAgICAgICAgICBicmVhazsJCisgICAgICAgICAgICB9CQkJCisgCQkJLyogZHNfdG0gaXMgb3B0aW9uYWwgLSBpZiBpdCBpcyBzZXQsIHZhbGlkYXRlIHNjaGVkIGV4aXN0IGFuZCBtYXRjaCBkaXJlY3Rpb24gKGRzKSovCisgICAgICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfaW50ZXJmYWNlX2luZm8sIGludGVyZmFjZSwgZHNfdG0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtX2tleS5kaXIgPSBCQ01CQUxfVE1fU0NIRURfRElSX0RTOworICAgICAgICAgICAgICAgIHRtX2tleS5pZCA9IHBfaW50ZXJmYWNlX2luZm8tPmRhdGEuZHNfdG07CisgICAgICAgICAgICAgICAgcF90bV9zY2hlZF9pbnN0ID0gdG1fc2NoZWRfaW5zdF9nZXQodG1fa2V5LCBUTV9TQ0hFRF9GTEFHX0FDVElWRSk7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gcF90bV9zY2hlZF9pbnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2ludGVyZmFjZSwgInRoZXJlIGlzIG5vIGRzIHRtIHNjaGVkIHdpdGggaWQgJWQiLCB0bV9rZXkuaWQpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXQgPSBiY21iYWxfdG1fc2NoZWRfc2V0X2ludGVyZmFjZV9vd25lcihwX2ludGVyZmFjZV9pbmZvLT5rZXksIHBfdG1fc2NoZWRfaW5zdCk7CisgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLCAiY291bGQgbm90IHNldCBpbnRlcmZhY2UgJWQgYXMgb3duZXIgb2YgdG0gc2NoZWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9pbnRlcmZhY2VfaW5mby0+a2V5LmludGZfaWQsIHRtX2tleS5pZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2ludGVyZmFjZSwgIkludmFsaWQgaW50ZiB0eXBlICglZCkgaW4gaW50ZXJmYWNlIGtleVxuIiwKKyAgICAgICAgICAgICAgICAgICBwX2ludGVyZmFjZV9pbmZvLT5rZXkuaW50Zl90eXBlKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYmNtb3NfZXJybm8gaW50ZXJmYWNlX3RtX3NjaGVkX3Vuc2V0KGJjbWJhbF9pbnRlcmZhY2Vfa2V5IGludGZfa2V5LCBiY21iYWxfdG1fc2NoZWRfa2V5IHNjaGVkX2tleSkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGFjY190ZXJtX2ludGVyZmFjZSAqcF9hY2NfdGVybV9pbnRlcmZhY2UgPSAgYmNtYmFsX2ludGVyZmFjZV9nZXQoaW50Zl9rZXkpOworICAgIGRvCisgICAgeworICAgICAgICBpZihOVUxMID09IHBfYWNjX3Rlcm1faW50ZXJmYWNlKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLCAibm8gc3VjaCBpbnRlcmZhY2UgKGlkID0gJWQgZGlyID0gJXMgKSBcbiIsCisgICAgICAgICAgICAgICAgaW50Zl9rZXkuaW50Zl9pZCwgaW50ZXJmYWNlX3R5cGVfc3RyX2dldChpbnRmX2tleS5pbnRmX3R5cGUpKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisJCSAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNQkFMX1RNX1NDSEVEX0RJUl9VUyA9PSBzY2hlZF9rZXkuZGlyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfQ0xFQVIoJihwX2FjY190ZXJtX2ludGVyZmFjZS0+Y3VycmVudF9pbnRfb2JqX2luZm8pLCBpbnRlcmZhY2UsIHVzX3RtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9DTEVBUigmKHBfYWNjX3Rlcm1faW50ZXJmYWNlLT5jdXJyZW50X2ludF9vYmpfaW5mbyksIGludGVyZmFjZSwgZHNfdG0pOworICAgICAgICB9CisgICAgfXdoaWxlKDApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byBwcm9jZXNzIGFuIGludGVyZmFjZSBvYmplY3QgbWVzc2FnZQorICogICAgICAgIChTRVQsIEdFVCwgQ0xFQVIsIFNUQVRTKSByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSS4KKyAqCisgKiBAcGFyYW0gbXNnX3BheWxvYWQgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEJBTCBQdWJsaWMgQVBJLgorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBwcm9jZXNzX2ludGVyZmFjZV9vYmplY3Qodm9pZCAqbXNnX3BheWxvYWQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIGJjbWJhbF9pbnRlcmZhY2VfY2ZnICpwX2ludGZfY2ZnID0gKGJjbWJhbF9pbnRlcmZhY2VfY2ZnICopbXNnX3BheWxvYWQ7CisgICAgYmNtYmFsX2ludGVyZmFjZV9rZXkgKnBfaW50Zl9rZXk7CisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2Nlc3NfdGVybWluYWxfaW5zdDsKKworICAgIGJjbWJhbF9pbnRlcmZhY2VfY2ZnICpwX2FwaV9yZXFfaW50ZXJmYWNlX2luZm87CisgICAgYmNtYmFsX2ludGVyZmFjZV9jZmcgKnBfY3VycmVudF9pbnRlcmZhY2VfaW5mbzsKKyAgICB1aW50MzJfdCBpbnRlcmZhY2VfaW5kZXggPSBJTlZBTElEX0lOVEVSRkFDRV9JTkRFWDsKKyAgICBiY21iYWxfb2JqX21zZ190eXBlIG9wZXJfdHlwZTsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9pbnRlcmZhY2UsCisgICAgICAgICAgICAiUHJvY2Vzc2luZyBhbiBpbnRlcmZhY2Ugb2JqZWN0XG4iKTsKKworICAgIGRvCisgICAgeworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBvcGVyX3R5cGUgPSBwX2ludGZfY2ZnLT5oZHIuaGRyLnR5cGU7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBTZWUgaWYgdGhlIGFjY2VzcyB0ZXJtaW5hbCBpcyBhY3RpdmUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcF9hY2Nlc3NfdGVybWluYWxfaW5zdCA9IGFjY2Vzc190ZXJtaW5hbF9nZXQoKTsKKworICAgICAgICAgICAgaWYoTlVMTCA9PSBwX2FjY2Vzc190ZXJtaW5hbF9pbnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGFjY2Vzcy10ZXJtaW5hbCBpcyBub3QgYWN0aXZlXG4iKTsKKworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIHRoZSBzdGF0ZSBvZiB0aGUgYWNjZXNzLXRlcm1pbmFsIGlzIGluIGZsdXgsIHRoZW4gcmVqZWN0IHRoZSBTRVQgcmVxdWVzdCAqLworICAgICAgICAgICAgaWYoQkNNQkFMX09CSl9NU0dfVFlQRV9TRVQgPT0gb3Blcl90eXBlICYmCisgICAgICAgICAgICAgICBCQ01PU19UUlVFID09IEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfR0VUKCYocF9hY2Nlc3NfdGVybWluYWxfaW5zdC0+Y3VycmVudF9hY2NfdGVybV9vYmpfaW5mbykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGFjY2Vzcy10ZXJtaW5hbCBpcyBpbi1wcm9ncmVzcywgU0VUcyB0byBhbiBpbnRlcmZhY2UgYXJlIG5vdCBhbGxvd2VkXG4iKTsKKworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5fUFJPR1JFU1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBHZXQgdGhlIGludGVyZmFjZSBrZXkgZnJvbSB0aGUgbWVzc2FnZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwX2ludGZfa2V5ID0gJnBfaW50Zl9jZmctPmtleTsKKworICAgICAgICAgICAgaWYgKHBfaW50Zl9rZXktPmludGZfdHlwZSA9PSBCQ01CQUxfSU5URl9UWVBFX1BPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwX2ludGZfa2V5LT5pbnRmX2lkID4gTlVNX1NVUFBPUlRFRF9TVUJTQ1JJQkVSX0lOVEVSRkFDRVMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQgb2YgcmFuZ2UgdmFsdWUgKCVkKSBkZXRlY3RlZCBpbiBpbnRlcmZhY2Uga2V5IGZvciBQT05cbiIsIHBfaW50Zl9rZXktPmludGZfaWQpOworCisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qKiBAdG9kbyBjaGVjayB0aGUgbG93ZXIgbGltaXQgYWxzbyAqLworICAgICAgICAgICAgZWxzZSBpZiAocF9pbnRmX2tleS0+aW50Zl90eXBlID09IEJDTUJBTF9JTlRGX1RZUEVfTk5JKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBCQ01PU19GQUxTRSA9PSBiY21fdG9wb19ubmlfaXNfdmFsaWQocF9pbnRmX2tleS0+aW50Zl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQgb2YgcmFuZ2UgdmFsdWUgKCVkKSBkZXRlY3RlZCBpbiBpbnRlcmZhY2Uga2V5IGZvciBOTklcbiIsIHBfaW50Zl9rZXktPmludGZfaWQpOworCisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW50ZiB0eXBlICglZCkgaW4gaW50ZXJmYWNlIGtleVxuIiwgcF9pbnRmX2tleS0+aW50Zl90eXBlKTsKKworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIERvbid0IGFjY2VwdCBpbnRlcmZhY2Ugb2JqZWN0IHJlZmVyZW5jZXMgd2hlbiB0aGUgYXNzb2NpYXRlZCBhY2Nlc3MtdGVybWluYWwgaXMgZG93bgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEludGVyZmFjZXMgYXJlIG5vdCBldmVuIGluc3RhbnRpYXRlZCBpbnRlcm5hbGx5IHVudGlsIHRoZSBhY2Nlc3MtdGVybWluYWwgb2JqZWN0IHRvIHdoaWNoCisgICAgICAgICAgICAgKiB0aGV5IGJlbG9uZyBpcyBpbnN0YW50aWF0ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKEJDTUJBTF9TVEFURV9ET1dOID09IHBfYWNjZXNzX3Rlcm1pbmFsX2luc3QtPmN1cnJlbnRfYWNjX3Rlcm1fb2JqX2luZm8uZGF0YS5hZG1pbl9zdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9pbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzIHRlcm1pbmFsIGFkbWluLXN0YXRlIGlzIERPV05cbiIpOworCisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlZBTElEX09QOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBHZXQgdGhlIGluZGV4IHRvIHRoZSBpbnRlcmZhY2UgYXJyYXkgZnJvbSBwb3J0IGlkL3R5cGUgKi8KKyAgICAgICAgICAgIGludGVyZmFjZV9pbmRleCA9IGJjbWJhbF9wb3J0X3R5cGVfYW5kX2lkX3RvX2ludGVyZmFjZV9pbmRleCAocF9pbnRmX2tleS0+aW50Zl90eXBlLCBwX2ludGZfa2V5LT5pbnRmX2lkKTsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfaW5kZXggPj0gSU5WQUxJRF9JTlRFUkZBQ0VfSU5ERVgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIHBvcnQgdHlwZS9pZCAoJXMvJWQpIHRvIGludGVyZmFjZSBpbmRleCAoJWQpIGZvciBhY2Nlc3MgdGVybWluYWxcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfdHlwZV9zdHJfZ2V0KHBfaW50Zl9rZXktPmludGZfdHlwZSksIHBfaW50Zl9rZXktPmludGZfaWQsIGludGVyZmFjZV9pbmRleCk7CisKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGlzIGlzIGEgcG9pbnRlciB0byB0aGUgIkFQSSBpbnRlcmZhY2UiIHN0cnVjdHVyZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwX2FwaV9yZXFfaW50ZXJmYWNlX2luZm8gPQorICAgICAgICAgICAgICAgICYocF9hY2Nlc3NfdGVybWluYWxfaW5zdC0+aW50Zl9pbmZvLmludGVyZmFjZVtpbnRlcmZhY2VfaW5kZXhdLmFwaV9yZXFfaW50X29ial9pbmZvKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSAiY3VycmVudCBpbnRlcmZhY2UiIHN0cnVjdHVyZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwX2N1cnJlbnRfaW50ZXJmYWNlX2luZm8gPQorICAgICAgICAgICAgICAgICYocF9hY2Nlc3NfdGVybWluYWxfaW5zdC0+aW50Zl9pbmZvLmludGVyZmFjZVtpbnRlcmZhY2VfaW5kZXhdLmN1cnJlbnRfaW50X29ial9pbmZvKTsKKworICAgICAgICAgICAgLyogSWYgdGhlIHN0YXRlIG9mIHRoZSBpbnRlcmZhY2UgaXMgaW4gZmx1eCwgdGhlbiByZWplY3QgdGhlIFNFVCByZXF1ZXN0ICovCisgICAgICAgICAgICBpZihCQ01CQUxfT0JKX01TR19UWVBFX1NFVCA9PSBvcGVyX3R5cGUgJiYKKyAgICAgICAgICAgICAgIChCQ01PU19UUlVFID09IEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfR0VUKHBfY3VycmVudF9pbnRlcmZhY2VfaW5mbykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGludGVyZmFjZSBpcyBpbi1wcm9ncmVzcywgU0VUcyBhcmUgbm90IGFsbG93ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5fUFJPR1JFU1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfXdoaWxlKDApOworCisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXZSByZXNwb25kIHRvIHRoZSBCQUwgcHVibGljIEFQSSBiYWNrZW5kIHdpdGggYSByZXN1bHQuIFdlIGFsd2F5cworICAgICAgICAgICAgICogc2VuZCBhIGNvbXBsZXRlIG1zZ19wYXlsb2FkIGJhY2sgdG8gdGhlIEFQSSwgYnV0IHRoZSBkYXRhIHBvcnRpb24KKyAgICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgaXMgb25seSByZWxldmFudCB3aGVuIGEgR0VUIG9yIEdFVC1TVEFUUyBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChyZXQsIG1zZ19wYXlsb2FkLCBvcGVyX3R5cGUsIGxvZ19pZF9pbnRlcmZhY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBGaWxsIGluIHRoZSBpbnRlcmZhY2UgaW5mbyBTRVQgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICovCisgICAgICAgICpwX2FwaV9yZXFfaW50ZXJmYWNlX2luZm8gPSAqcF9pbnRmX2NmZzsKKworICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICIgaW50ZXJmYWNlIG9iamVjdCBzdGF0ZSBmcm9tIEFQSSBtZXNzYWdlIGlzOiAlZCwgaW50Zl90eXBlOiAlcyBpbnRmX2lkOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBwX2FwaV9yZXFfaW50ZXJmYWNlX2luZm8tPmRhdGEuYWRtaW5fc3RhdGUsCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlX3R5cGVfc3RyX2dldChwX2FwaV9yZXFfaW50ZXJmYWNlX2luZm8tPmtleS5pbnRmX3R5cGUpLAorICAgICAgICAgICAgICAgIHBfYXBpX3JlcV9pbnRlcmZhY2VfaW5mby0+a2V5LmludGZfaWQpOworCisKKyAgICAgICAgLyogU0VUIG9yIEdFVCBvciAuLi4/ICovCisgICAgICAgIHN3aXRjaCAob3Blcl90eXBlKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGNhc2UgKEJDTUJBTF9PQkpfTVNHX1RZUEVfU0VUKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3NpbmcgYW4gaW50ZXJmYWNlIFNFVCBSRVEgbWdtdCBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgICAgICAvKmlmIHNjaGVkIGlzIGFscmVhZHkgc2V0LCBjYW4gbm90IGNoYW5nZSBzY2hlZCBzZXR0aW5nIHVzaW5nIHNldCBjb21tYW5kLCBzaG91bGQgZmlyc3QgZGVsZXRlIGN1cnJlbnQgc2NoZWQqLworICAgICAgICAgICAgICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9jdXJyZW50X2ludGVyZmFjZV9pbmZvLGludGVyZmFjZSxkc190bSkKKyAgICAgICAgICAgICAgICAgICAmJiBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfYXBpX3JlcV9pbnRlcmZhY2VfaW5mbyxpbnRlcmZhY2UsZHNfdG0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHNfdG0gJWQgaXMgYWxyZWFkeSBzZXQgYXQgaW50ZXJmYWNlLCBpdCBzaG91bGQgYmUgZmlyc3QgY2xlYXJlZCBpbiBvcmRlciB0byBiZSByZXBsYWNlZCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jdXJyZW50X2ludGVyZmFjZV9pbmZvLT5kYXRhLmRzX3RtKTsKKwkJCQkJcmV0ID0gQkNNX0VSUl9BTFJFQURZOworCQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2N1cnJlbnRfaW50ZXJmYWNlX2luZm8saW50ZXJmYWNlLHVzX3RtKQorICAgICAgICAgICAgICAgICAgICYmIEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9hcGlfcmVxX2ludGVyZmFjZV9pbmZvLGludGVyZmFjZSx1c190bSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c190bSAlZCBpcyBhbHJlYWR5IHNldCBhdCBpbnRlcmZhY2UsIGl0IHNob3VsZCBiZSBmaXJzdCBjbGVhcmVkIGluIG9yZGVyIHRvIGJlIHJlcGxhY2VkIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cnJlbnRfaW50ZXJmYWNlX2luZm8tPmRhdGEudXNfdG0pOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0FMUkVBRFk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0JCisgICAgICAgICAgICAgICAgLyogV2UgcmVzcG9uZCB0byB0aGUgQkFMIHB1YmxpYyBBUEkgYmFja2VuZCB3aXRoIGEgcmVzdWx0LiBXZSBhbHdheXMKKyAgICAgICAgICAgICAgICAgKiBzZW5kIGEgY29tcGxldGUgbXNnX3BheWxvYWQgYmFjayB0byB0aGUgQVBJLCBidXQgdGhlIGRhdGEgcG9ydGlvbgorICAgICAgICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgaXMgb25seSByZWxldmFudCB3aGVuIGEgR0VUIG9yIEdFVC1TVEFUUyBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmV0ID0gbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsIG9wZXJfdHlwZSwgbG9nX2lkX2ludGVyZmFjZSk7CisKKyAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIElmIHRoaXMgaW50ZXJmYWNlIGlzIGFscmVhZHkgdXAsIHRoZW4ganVzdCByZXR1cm4gT0sgKi8KKyAgICAgICAgICAgICAgICBpZihCQ01CQUxfU1RBVEVfVVAgPT0gcF9hcGlfcmVxX2ludGVyZmFjZV9pbmZvLT5kYXRhLmFkbWluX3N0YXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNQkFMX1NUQVRVU19VUCA9PSBwX2N1cnJlbnRfaW50ZXJmYWNlX2luZm8tPmRhdGEub3Blcl9zdGF0dXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9pbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PT09PT4gUmVjZWl2ZWQgYW4gaW50ZXJmYWNlIFVQIGZvciBhbiBhbHJlYWR5IFVQIGludGVyZmFjZSwgcmV0dXJuaW5nIE9LXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyp2YWxpZGF0ZSBhbmQgc2V0IHRoZSBpbnRlcmZhY2UnIHRtIHNjaGVkKi8KKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2ludGVyZmFjZV9vYmplY3Rfb3ZlcmxheV93X2RzdF9wcmlvcml0eShwX2FwaV9yZXFfaW50ZXJmYWNlX2luZm8scF9jdXJyZW50X2ludGVyZmFjZV9pbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW50ZXJmYWNlX3RtX3NjaGVkX3NldChwX2FwaV9yZXFfaW50ZXJmYWNlX2luZm8pOwkJCQkJCisgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfaW50ZXJmYWNlLCJDb3VsZCBub3Qgc2V0IHRoZSBpbnRlcmZhY2UgdG0gc2NoZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2FkbWluX3VwX3N0YXJ0KCYocF9hY2Nlc3NfdGVybWluYWxfaW5zdC0+aW50Zl9pbmZvLmludGVyZmFjZVtpbnRlcmZhY2VfaW5kZXhdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ19wYXlsb2FkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNQkFMX1NUQVRVU19ET1dOID09IHBfY3VycmVudF9pbnRlcmZhY2VfaW5mby0+ZGF0YS5vcGVyX3N0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09PT09PiBSZWNlaXZlZCBhbiBpbnRlcmZhY2UgRE9XTiBmb3IgYW4gYWxyZWFkeSBET1dOIGludGVyZmFjZSwgcmV0dXJuaW5nIE9LXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfYWRtaW5fZG5fc3RhcnQoJihwX2FjY2Vzc190ZXJtaW5hbF9pbnN0LT5pbnRmX2luZm8uaW50ZXJmYWNlW2ludGVyZmFjZV9pbmRleF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX3BheWxvYWQpOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgKEJDTUJBTF9PQkpfTVNHX1RZUEVfR0VUKToKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9pbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2Vzc2luZyBhIGludGVyZmFjZSBHRVQgUkVRIG1nbXQgbWVzc2FnZVxuIik7CisKKyAgICAgICAgICAgICAgICAvKiBXZSByZXNwb25kIHRvIHRoZSBCQUwgcHVibGljIEFQSSBiYWNrZW5kIHdpdGggYSByZXN1bHQuIFdlIGFsd2F5cworICAgICAgICAgICAgICAgICAqIHNlbmQgYSBjb21wbGV0ZSBtc2dfcGF5bG9hZCBiYWNrIHRvIHRoZSBBUEksIGJ1dCB0aGUgZGF0YSBwb3J0aW9uCisgICAgICAgICAgICAgICAgICogb2YgdGhlIG9iamVjdCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gYSBHRVQgb3IgR0VULVNUQVRTIGhhcyBiZWVuIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwX2N1cnJlbnRfaW50ZXJmYWNlX2luZm8tPmhkci5oZHIuY29tbV9oZHIgPSAoKGJjbWJhbF9vYmogKiltc2dfcGF5bG9hZCktPmNvbW1faGRyOworCisgICAgICAgICAgICAgICAgYmNtYmFsX3N1Yl9pZF9saXN0X3UxNiBzdWJfdGVybV9pZF9saXN0ID0ge307CisKKyAgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfQ0xFQVIocF9jdXJyZW50X2ludGVyZmFjZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2lkX2xpc3QpOworCisgICAgICAgICAgICAgICAgLyogSWYgdGhlIHVzZXIgcmVxdWVzdGVkIHRoZSBsaXN0IG9mIHN1Yl90ZXJtX2lkcyBmb3IgdGhpcyBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICogYW5kIHRoaXMgaXMgYSBQT04gaW50ZXJmYWNlLCB0aGVuIHJldHVybiB0aGUgbGlzdC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfYXBpX3JlcV9pbnRlcmZhY2VfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2lkX2xpc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNQkFMX0lOVEZfVFlQRV9QT04gPT0gcF9jdXJyZW50X2ludGVyZmFjZV9pbmZvLT5rZXkuaW50Zl90eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2lkX2xpc3RfZmlsbChpbnRlcmZhY2VfaW5kZXgsICZzdWJfdGVybV9pZF9saXN0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9URTogVGhlIHJldHVybmVkIGxpc3QgbWF5IGJlIGVtcHR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKHBfY3VycmVudF9pbnRlcmZhY2VfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9pZF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9pZF9saXN0KTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKigoYmNtYmFsX2ludGVyZmFjZV9jZmcgKiltc2dfcGF5bG9hZCkgPSAqcF9jdXJyZW50X2ludGVyZmFjZV9pbmZvOworCisgICAgICAgICAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsIG9wZXJfdHlwZSwgbG9nX2lkX2ludGVyZmFjZSk7CisKKyAgICAgICAgICAgICAgICAvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgbGlzdCBpZiBpdCB3YXMgdXNlZCAqLworICAgICAgICAgICAgICAgIGlmKHN1Yl90ZXJtX2lkX2xpc3QudmFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShzdWJfdGVybV9pZF9saXN0LnZhbCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9pbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uIG9uIGludGVyZmFjZSBvYmplY3QgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9tc2dfaWRfb3Blcl9nZXQobXNnX3BheWxvYWQpKTsKKworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKworICAgICAgICAgICAgICAgIC8qIFdlIHJlc3BvbmQgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGJhY2tlbmQgd2l0aCBhIHJlc3VsdC4gV2UgYWx3YXlzCisgICAgICAgICAgICAgICAgICogc2VuZCBhIGNvbXBsZXRlIG1zZ19wYXlsb2FkIGJhY2sgdG8gdGhlIEFQSSwgYnV0IHRoZSBkYXRhIHBvcnRpb24KKyAgICAgICAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiBhIEdFVCBvciBHRVQtU1RBVFMgaGFzIGJlZW4gcmVxdWVzdGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChyZXQsIG1zZ19wYXlsb2FkLCBvcGVyX3R5cGUsIGxvZ19pZF9pbnRlcmZhY2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH13aGlsZSAoMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gY2FsbGVkIHRvIGluaXRpYWxpemUgYSBzaW5nbGUgYWNjZXNzLXRlcm1pbmFsIGluc3RhbmNlLgorICogICAgICAgIE5PVEU6IFRoaXMgaXMgY2FsbGVkIG9uY2Ugb24gc3RhcnR1cCBhbmQgTk9UIGZvciBlYWNoIEZTTSBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gcF9hY2NfdGVybV9pbnN0ICBQb2ludGVyIHRvIGFuIGFjY2VzcyB0ZXJtaW5hbCBpbnN0YW5jZQorICoKKyAqIEByZXR1cm5zIHZvaWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfYWNjZXNzX3Rlcm1pbmFsX2luc3RhbmNlX2NvbmZpZyhhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3QpCit7CisgICAgaW50IGlpOworICAgIGludCBpbnRmX2lkOworICAgIGJjbW9zX2Vycm5vIHJldDsKKwkKKyAgICBCVUdfT04oTlVMTCA9PSBwX2FjY190ZXJtX2luc3QpOworCisgICAgcF9hY2NfdGVybV9pbnN0LT5jdXJyZW50X2FjY190ZXJtX29ial9pbmZvLmtleS5hY2Nlc3NfdGVybV9pZCA9IDA7CisKKyAgICBCQ01CQUxfQ0ZHX0lOSVQoJnBfYWNjX3Rlcm1faW5zdC0+Y3VycmVudF9hY2NfdGVybV9vYmpfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgICAgICAgICBwX2FjY190ZXJtX2luc3QtPmN1cnJlbnRfYWNjX3Rlcm1fb2JqX2luZm8ua2V5KTsKKworICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnBfYWNjX3Rlcm1faW5zdC0+Y3VycmVudF9hY2NfdGVybV9vYmpfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1NUQVRFX0RPV04pOworCisgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmcF9hY2NfdGVybV9pbnN0LT5jdXJyZW50X2FjY190ZXJtX29ial9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgb3Blcl9zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfU1RBVFVTX0RPV04pOworCisgICAgQkNNQkFMX1BST1BfU0VUX1BSRVNFTlQoJnBfYWNjX3Rlcm1faW5zdC0+Y3VycmVudF9hY2NfdGVybV9vYmpfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpd2ZfbW9kZSk7CisKKyAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfYWNjX3Rlcm1faW5zdC0+Y3VycmVudF9hY2NfdGVybV9vYmpfaW5mbyksIEJDTU9TX0ZBTFNFKTsKKworICAgIHsKKyAgICAgICAgYmNtYmFsX2ludGVyZmFjZV9rZXkga2V5OworCisgICAgICAgIGludGZfaWQgPSAwOyAgICAvKiByZXNldCB0aGUgcG9ydCBpZCB0byB0aGUgc3RhcnRpbmcgaWQgdmFsdWUgZm9yIHRoZSBQT04gaW50ZXJmYWNlcyAqLworCisgICAgICAgIGtleS5pbnRmX3R5cGUgPSBCQ01CQUxfSU5URl9UWVBFX1BPTjsKKworICAgICAgICBmb3IoaWk9MDsgaWk8TlVNX1NVUFBPUlRFRF9TVUJTQ1JJQkVSX0lOVEVSRkFDRVM7IGlpKyspCisgICAgICAgIHsKKworICAgICAgICAgICAga2V5LmludGZfaWQgPSBpbnRmX2lkOworCisgICAgICAgICAgICBwX2FjY190ZXJtX2luc3QtPmludGZfaW5mby5pbnRlcmZhY2VbaWldLm51bV9zdWJfdGVybXNfb25faW50ID0gMDsKKyAgICAgICAgICAgIFRBSUxRX0lOSVQoJnBfYWNjX3Rlcm1faW5zdC0+aW50Zl9pbmZvLmludGVyZmFjZVtpaV0uc3ViX3Rlcm1faWRfbGlzdCk7CisKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfSU5JVCgmcF9hY2NfdGVybV9pbnN0LT5pbnRmX2luZm8uaW50ZXJmYWNlW2lpXS5jdXJyZW50X2ludF9vYmpfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5KTsKKworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmcF9hY2NfdGVybV9pbnN0LT5pbnRmX2luZm8uaW50ZXJmYWNlW2lpXS5jdXJyZW50X2ludF9vYmpfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW5fc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1NUQVRFX0RPV04pOworCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZwX2FjY190ZXJtX2luc3QtPmludGZfaW5mby5pbnRlcmZhY2VbaWldLmN1cnJlbnRfaW50X29ial9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfU1RBVFVTX0RPV04pOworCQkJCisgICAgICAgICAgICByZXQgPSBiY21iYWxfdG1fc2NoZWRfaW50ZXJmYWNlX3RtX2F1dG9fY3JlYXRlKCZwX2FjY190ZXJtX2luc3QtPmludGZfaW5mby5pbnRlcmZhY2VbaWldLmN1cnJlbnRfaW50X29ial9pbmZvKTsKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9pbnRlcmZhY2UsICJjb3VsZCBub3Qgc2V0IGFuIGF1dG8gLSBjcmVhdGUgYSB0bSBzY2hlZCBmb3IgcG9uIGlmICVkIiwgaW50Zl9pZCk7CisJCQkJYnJlYWs7CisgICAgICAgICAgICB9IAorCisgICAgICAgICAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfYWNjX3Rlcm1faW5zdC0+aW50Zl9pbmZvLmludGVyZmFjZVtpaV0uY3VycmVudF9pbnRfb2JqX2luZm8pLCBCQ01PU19GQUxTRSk7CisKKyAgICAgICAgICAgIGludGZfaWQrKzsKKyAgICAgICAgfQorCisgICAgICAgIGludGZfaWQgPSAwOyAgICAvKiByZXNldCB0aGUgcG9ydCBpZCB0byB0aGUgc3RhcnRpbmcgaWQgdmFsdWUgZm9yIHRoZSBOTkkgaW50ZXJmYWNlcyAqLworCisgICAgICAgIGtleS5pbnRmX3R5cGUgPSBCQ01CQUxfSU5URl9UWVBFX05OSTsKKworICAgICAgICBmb3IoaWk9TlVNX1NVUFBPUlRFRF9TVUJTQ1JJQkVSX0lOVEVSRkFDRVM7IGlpPChOVU1fU1VQUE9SVEVEX1NVQlNDUklCRVJfSU5URVJGQUNFUyArIGJhbF9jb25maWdfcGFyYW1zLm51bV9ubmlfcG9ydHMpOyBpaSsrKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGtleS5pbnRmX2lkID0gaW50Zl9pZDsKKworICAgICAgICAgICAgQkNNQkFMX0NGR19JTklUKCZwX2FjY190ZXJtX2luc3QtPmludGZfaW5mby5pbnRlcmZhY2VbaWldLmN1cnJlbnRfaW50X29ial9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkpOworCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZwX2FjY190ZXJtX2luc3QtPmludGZfaW5mby5pbnRlcmZhY2VbaWldLmN1cnJlbnRfaW50X29ial9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfU1RBVEVfVVApOworCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZwX2FjY190ZXJtX2luc3QtPmludGZfaW5mby5pbnRlcmZhY2VbaWldLmN1cnJlbnRfaW50X29ial9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfU1RBVFVTX1VQKTsKKworCQkJCisgICAgICAgICAgICByZXQgPSBiY21iYWxfdG1fc2NoZWRfaW50ZXJmYWNlX3RtX2F1dG9fY3JlYXRlKCZwX2FjY190ZXJtX2luc3QtPmludGZfaW5mby5pbnRlcmZhY2VbaWldLmN1cnJlbnRfaW50X29ial9pbmZvKTsKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9pbnRlcmZhY2UsICJjb3VsZCBub3Qgc2V0IGFuIGF1dG8gLSBjcmVhdGUgYSB0bSBzY2hlZCBmb3Igbm5pIGlmICVkIiwgaW50Zl9pZCk7IAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfYWNjX3Rlcm1faW5zdC0+aW50Zl9pbmZvLmludGVyZmFjZVtpaV0uY3VycmVudF9pbnRfb2JqX2luZm8pLCBCQ01PU19GQUxTRSk7CisKKyAgICAgICAgICAgIGludGZfaWQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworYmNtb3NfZXJybm8gYmNtYmFsX2ludGVyZmFjZV9zdWJfdGVybV9saXN0X2VudHJ5X2FkZChiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgc3ViX3Rlcm1fa2V5KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2Nlc3NfdGVybWluYWxfaW5zdDsKKyAgICBzdWJfdGVybV9pZF9lbnRyeSAqY3VycmVudF9lbnRyeTsKKyAgICBhY2NfdGVybV9pbnRlcmZhY2UgKnBfaW50ZXJmYWNlOworCisgICAgcF9hY2Nlc3NfdGVybWluYWxfaW5zdCA9IGFjY2Vzc190ZXJtaW5hbF9nZXQoKTsKKworICAgIGRvCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiB0aGUgc3BlY2lmaWVkIGFjY2VzcyB0ZXJtaW5hbCBpcyBub3QgYWN0aXZlIHRoZW4gaXQncyBpbnRlcmZhY2VzIGFyZSBkb3duLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoTlVMTCA9PSBwX2FjY2Vzc190ZXJtaW5hbF9pbnN0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgICAgICAgICAibm8gc3VjaCBBQ1RJVkUgYWNjZXNzIHRlcm1pbmFsXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfU1RBVEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHBfaW50ZXJmYWNlID0gJnBfYWNjZXNzX3Rlcm1pbmFsX2luc3QtPmludGZfaW5mby5pbnRlcmZhY2Vbc3ViX3Rlcm1fa2V5LmludGZfaWRdOworCisgICAgICAgIC8qIENoZWNrIGlmIHRoZSBpZCBpcyBhbHJlYWR5IG9uIHRoZSBsaXN0IGJlZm9yZSBhZGRpbmcgaXQgKi8KKyAgICAgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICZwX2ludGVyZmFjZS0+c3ViX3Rlcm1faWRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICBuZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihjdXJyZW50X2VudHJ5LT5zdWJfdGVybV9pZCA9PSBzdWJfdGVybV9rZXkuc3ViX3Rlcm1faWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCBhIG5ldyBlbnRyeSBhbmQgY29uZmlndXJlIGl0ICovCisgICAgICAgIGN1cnJlbnRfZW50cnkgPSBiY21vc19jYWxsb2Moc2l6ZW9mKHN1Yl90ZXJtX2lkX2VudHJ5KSk7CisKKyAgICAgICAgaWYgKE5VTEwgPT0gY3VycmVudF9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2FjY2Vzc190ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgIk5vIG1lbW9yeSBhdmFpbGFibGVcbiIpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudF9lbnRyeS0+c3ViX3Rlcm1faWQgPSBzdWJfdGVybV9rZXkuc3ViX3Rlcm1faWQ7CisKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgICAgICJhZGRpbmcgc3ViX3Rlcm0gaWQgJXUgdG8gaW50ZXJmYWNlICV1XG4iLCBzdWJfdGVybV9rZXkuc3ViX3Rlcm1faWQsIHN1Yl90ZXJtX2tleS5pbnRmX2lkKTsKKworICAgICAgICAvKiBTYXZlIHRoZSBlbnRyeSBvbiB0aGUgbGlzdCBvZiBzdWJzY3JpYmVyLXRlcm1pbmFsIGlkcyBvbiB0aGlzIGludGVyZmFjZSAqLworICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmcF9pbnRlcmZhY2UtPnN1Yl90ZXJtX2lkX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZW50cnksIG5leHQpOworCisgICAgICAgIChwX2ludGVyZmFjZS0+bnVtX3N1Yl90ZXJtc19vbl9pbnQpKys7CisKKyAgICB9IHdoaWxlICgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbWJhbF9pbnRlcmZhY2Vfc3ViX3Rlcm1fbGlzdF9lbnRyeV9yZW1vdmUoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5IHN1Yl90ZXJtX2tleSkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX05PRU5UOworICAgIGFjY190ZXJtX2luc3QgKnBfYWNjZXNzX3Rlcm1pbmFsX2luc3Q7CisgICAgYWNjX3Rlcm1faW50ZXJmYWNlICpwX2ludGVyZmFjZTsKKyAgICBzdWJfdGVybV9pZF9lbnRyeSAqY3VycmVudF9lbnRyeSwgKnBfdGVtcF9lbnRyeTsKKworICAgIGRvCisgICAgeworICAgICAgICBwX2FjY2Vzc190ZXJtaW5hbF9pbnN0ID0gYWNjZXNzX3Rlcm1pbmFsX2dldCgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZSBzcGVjaWZpZWQgYWNjZXNzIHRlcm1pbmFsIGlzIG5vdCBhY3RpdmUgdGhlbiBpdCdzIGludGVyZmFjZXMgYXJlIGRvd24uCisgICAgICAgICAqLworICAgICAgICBpZihOVUxMID09IHBfYWNjZXNzX3Rlcm1pbmFsX2luc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsCisgICAgICAgICAgICAgICAgICAgICJubyBzdWNoIEFDVElWRSBhY2Nlc3MgdGVybWluYWxcbiIpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9TVEFURTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcF9pbnRlcmZhY2UgPSAmcF9hY2Nlc3NfdGVybWluYWxfaW5zdC0+aW50Zl9pbmZvLmludGVyZmFjZVtzdWJfdGVybV9rZXkuaW50Zl9pZF07CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGlkIGlzIG9uIHRoZSBsaXN0ICovCisgICAgICAgIFRBSUxRX0ZPUkVBQ0hfU0FGRShjdXJyZW50X2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfaW50ZXJmYWNlLT5zdWJfdGVybV9pZF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGVtcF9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY3VycmVudF9lbnRyeS0+c3ViX3Rlcm1faWQgPT0gc3ViX3Rlcm1fa2V5LnN1Yl90ZXJtX2lkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIHN1YnNjcmliZXItdGVybWluYWwgaWRzIG9uIHRoaXMgaW50ZXJmYWNlICovCisgICAgICAgICAgICAgICAgVEFJTFFfUkVNT1ZFKCZwX2ludGVyZmFjZS0+c3ViX3Rlcm1faWRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9lbnRyeSwgbmV4dCk7CisKKyAgICAgICAgICAgICAgICBiY21vc19mcmVlKGN1cnJlbnRfZW50cnkpOworCisgICAgICAgICAgICAgICAgKHBfaW50ZXJmYWNlLT5udW1fc3ViX3Rlcm1zX29uX2ludCktLTsKKworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKDApOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2lkX2xpc3RfZmlsbCh1aW50MzJfdCBpbnRlcmZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9zdWJfaWRfbGlzdF91MTYgKnN1Yl90ZXJtX2lkX2xpc3QpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3Q7CisgICAgc3ViX3Rlcm1faWRfZW50cnkgKmN1cnJlbnRfZW50cnkgPSBOVUxMOworICAgIGludCBpaSA9IDA7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VlIGlmIHRoZSBhY2Nlc3MtdGVybWluYWwgaXMgYWN0aXZlCisgICAgICAgICAqLworICAgICAgICBwX2FjY190ZXJtX2luc3QgPSBhY2Nlc3NfdGVybWluYWxfZ2V0KCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIHNwZWNpZmllZCBhY2Nlc3MgdGVybWluYWwgaXMgbm90IGFjdGl2ZSB0aGVuIGl0J3MgaW50ZXJmYWNlcyBhcmUgZG93bi4KKyAgICAgICAgICovCisgICAgICAgIGlmKE5VTEwgPT0gcF9hY2NfdGVybV9pbnN0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgICAgICAgICAibm8gc3VjaCBBQ1RJVkUgYWNjZXNzIHRlcm1pbmFsXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRyYXZlcnNlIHRoZSBsaXN0IG9mIHN1Yl90ZXJtX2lkcyByZWNvcmRlZCBhbmQgZmlsbCBpbiB0aGUgbGlzdCB0byBiZSByZXR1cm5lZCAqLworICAgICAgICBzdWJfdGVybV9pZF9saXN0LT5sZW4gPSBwX2FjY190ZXJtX2luc3QtPmludGZfaW5mby5pbnRlcmZhY2VbaW50ZXJmYWNlX2luZGV4XS5udW1fc3ViX3Rlcm1zX29uX2ludDsKKyAgICAgICAgc3ViX3Rlcm1faWRfbGlzdC0+dmFsID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21iYWxfc3ViX2lkKSAqIHN1Yl90ZXJtX2lkX2xpc3QtPmxlbik7CisKKyAgICAgICAgaWYgKE5VTEwgPT0gc3ViX3Rlcm1faWRfbGlzdC0+dmFsKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgICAgICAgICAiTm8gbWVtb3J5IGF2YWlsYWJsZVxuIik7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgIFRBSUxRX0ZPUkVBQ0goY3VycmVudF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAmcF9hY2NfdGVybV9pbnN0LT5pbnRmX2luZm8uaW50ZXJmYWNlW2ludGVyZmFjZV9pbmRleF0uc3ViX3Rlcm1faWRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICBuZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgICAgICAgICAiYWRkaW5nIHN1Yl90ZXJtX2lkICV1IHRvIHJlc3BvbnNlIGF0IGFycmF5IGxvY2F0aW9uICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2VudHJ5LT5zdWJfdGVybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgaWkpOworICAgICAgICAgICAgc3ViX3Rlcm1faWRfbGlzdC0+dmFsW2lpKytdID0gY3VycmVudF9lbnRyeS0+c3ViX3Rlcm1faWQ7CisgICAgICAgIH0KKworICAgIH0gd2hpbGUgKDApOworCisgICAgcmV0dXJuIHJldDsKK30KKworYmNtb3NfZXJybm8gYmNtYmFsX2ludGVyZmFjZV90bV9nZXQoYmNtYmFsX2ludGVyZmFjZV9rZXkga2V5LCBiY21iYWxfdG1fc2NoZWRfaWQgKmlkKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybV9pbnN0OworICAgIHVpbnQzMl90IGludGVyZmFjZV9pbmRleCA9IElOVkFMSURfSU5URVJGQUNFX0lOREVYOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIFNlZSBpZiB0aGUgYWNjZXNzLXRlcm1pbmFsIGlzIGFjdGl2ZSAqLworICAgICAgICBwX2FjY190ZXJtX2luc3QgPSBhY2Nlc3NfdGVybWluYWxfZ2V0KCk7CisKKyAgICAgICAgLyogSWYgdGhlIHNwZWNpZmllZCBhY2Nlc3MgdGVybWluYWwgaXMgbm90IGFjdGl2ZSB0aGVuIGl0J3MgaW50ZXJmYWNlcyBhcmUgZG93bi4gKi8KKyAgICAgICAgaWYoTlVMTCA9PSBwX2FjY190ZXJtX2luc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsIm5vIHN1Y2ggQUNUSVZFIGFjY2VzcyB0ZXJtaW5hbFxuIik7CisJCQlyZXQgPSBCQ01fRVJSX05PVF9DT05ORUNURUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHRoZSBzcGVjaWZpZWQgYWNjZXNzIHRlcm1pbmFsIGlzIGRvd24sIHRoZW4gaXQncyBpbnRlcmZhY2VzIGFyZSBkb3duLiAqLworICAgICAgICBpZihCQ01CQUxfU1RBVEVfVVAgIT0gcF9hY2NfdGVybV9pbnN0LT5jdXJyZW50X2FjY190ZXJtX29ial9pbmZvLmRhdGEuYWRtaW5fc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9UX0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogZmlyc3QgZ2V0IHRoZSBpbmRleCB0byB0aGUgaW50ZXJmYWNlIGFycmF5IGZyb20gcG9ydCBpZC90eXBlICovCisgICAgICAgIGludGVyZmFjZV9pbmRleCA9IGJjbWJhbF9wb3J0X3R5cGVfYW5kX2lkX3RvX2ludGVyZmFjZV9pbmRleCAoa2V5LmludGZfdHlwZSwga2V5LmludGZfaWQpOworICAgICAgICBpZiAoaW50ZXJmYWNlX2luZGV4ID49IElOVkFMSURfSU5URVJGQUNFX0lOREVYKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLCJJTlZBTElEIHBvcnQgdHlwZS9pZCAoJXMvJWQpIHRvIGludGVyZmFjZSBpbmRleCAoJWQpXG4iLAorICAgICAgICAgICAgICAgIGludGVyZmFjZV90eXBlX3N0cl9nZXQoa2V5LmludGZfdHlwZSksIGtleS5pbnRmX2lkLCBpbnRlcmZhY2VfaW5kZXgpOworCQkJcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIFJldHJpZXZlIHRoZSByZWxldmFueSBkZWZhdWx0IHRtIHNjaGVkIG9mIHRoZSBpbnRlcmZhY2UgKi8KKwkJaWYgKEJDTUJBTF9JTlRGX1RZUEVfTk5JID09IGtleS5pbnRmX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICppZCA9IHBfYWNjX3Rlcm1faW5zdC0+aW50Zl9pbmZvLmludGVyZmFjZVtpbnRlcmZhY2VfaW5kZXhdLmN1cnJlbnRfaW50X29ial9pbmZvLmRhdGEudXNfdG07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKkJDTUJBTF9JTlRGX1RZUEVfUE9OICovCisgICAgICAgIHsKKyAgICAgICAgICAgICppZCA9IHBfYWNjX3Rlcm1faW5zdC0+aW50Zl9pbmZvLmludGVyZmFjZVtpbnRlcmZhY2VfaW5kZXhdLmN1cnJlbnRfaW50X29ial9pbmZvLmRhdGEuZHNfdG07CisgICAgICAgIH0KKyAgICB9d2hpbGUoMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2Ugb2JqZWN0CisgKgorICogQHBhcmFtIGtleSAgICAgICBBbiBpbnRlcmZhY2UgaW5zdGFuY2Uga2V5CisgKgorICogQHJldHVybnMgYmNtYmFsX3N0YXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21iYWxfc3RhdHVzIGJjbWJhbF9pbnRlcmZhY2Vfc3RhdHVzX2dldChiY21iYWxfaW50ZXJmYWNlX2tleSBrZXkpCit7CisgICAgYmNtYmFsX3N0YXRlIGludGZfc3RhdHVzID0gQkNNQkFMX1NUQVRVU19ET1dOOworICAgIGFjY190ZXJtX2ludGVyZmFjZSAqcF9hY2NfdGVybV9pbnRlcmZhY2UgPSBiY21iYWxfaW50ZXJmYWNlX2dldChrZXkpOworCisgICAgaWYoTlVMTCA9PSBwX2FjY190ZXJtX2ludGVyZmFjZSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9hY2Nlc3NfdGVybWluYWwsIm5vIHN1Y2ggaW50ZXJmYWNlXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50Zl9zdGF0dXMgPSAgcF9hY2NfdGVybV9pbnRlcmZhY2UtPmN1cnJlbnRfaW50X29ial9pbmZvLmRhdGEub3Blcl9zdGF0dXM7CisgICAgfQorICAgIHJldHVybiBpbnRmX3N0YXR1czsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBpbnRlcmZhY2Ugb2JqZWN0CisgKgorICogQHBhcmFtIGtleSAgICAgICBBbiBpbnRlcmZhY2UgaW5zdGFuY2Uga2V5CisgKgorICogQHJldHVybnMgYWNjX3Rlcm1faW50ZXJmYWNlICAqcF9hY2NfdGVybV9pbnRlcmZhY2UgIGEgcG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIG9iamVjdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGFjY190ZXJtX2ludGVyZmFjZSAqIGJjbWJhbF9pbnRlcmZhY2VfZ2V0KGJjbWJhbF9pbnRlcmZhY2Vfa2V5IGtleSkKK3sKKyAgICBhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtX2luc3QgPSBOVUxMOworICAgIGFjY190ZXJtX2ludGVyZmFjZSAqcF9hY2NfdGVybV9pbnRlcmZhY2UgPSBOVUxMOworICAgIHVpbnQzMl90IGludGVyZmFjZV9pbmRleCA9IElOVkFMSURfSU5URVJGQUNFX0lOREVYOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNlZSBpZiB0aGUgYWNjZXNzLXRlcm1pbmFsIGlzIGFjdGl2ZQorICAgICAgICAgKi8KKyAgICAgICAgcF9hY2NfdGVybV9pbnN0ID0gYWNjZXNzX3Rlcm1pbmFsX2dldCgpOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIHNwZWNpZmllZCBhY2Nlc3MgdGVybWluYWwgaXMgbm90IGFjdGl2ZSB0aGVuIGl0J3MgaW50ZXJmYWNlcyBhcmUgZG93bi4KKyAgICAgICAgICovCisgICAgICAgIGlmKE5VTEwgPT0gcF9hY2NfdGVybV9pbnN0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgICAgICAgICAibm8gc3VjaCBBQ1RJVkUgYWNjZXNzIHRlcm1pbmFsXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmV0cmlldmUgdGhlIGludGVyZmFjZQorICAgICAgICAgKi8KKyAgICAgICAgLyogZmlyc3QgZ2V0IHRoZSBpbmRleCB0byB0aGUgaW50ZXJmYWNlIGFycmF5IGZyb20gcG9ydCBpZC90eXBlICovCisgICAgICAgIGludGVyZmFjZV9pbmRleCA9IGJjbWJhbF9wb3J0X3R5cGVfYW5kX2lkX3RvX2ludGVyZmFjZV9pbmRleCAoa2V5LmludGZfdHlwZSwga2V5LmludGZfaWQpOworICAgICAgICBpZiAoaW50ZXJmYWNlX2luZGV4ID49IElOVkFMSURfSU5URVJGQUNFX0lOREVYKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfYWNjZXNzX3Rlcm1pbmFsLAorICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBwb3J0IHR5cGUvaWQgKCVzLyVkKSB0byBpbnRlcmZhY2UgaW5kZXggKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX3R5cGVfc3RyX2dldChrZXkuaW50Zl90eXBlKSwga2V5LmludGZfaWQsIGludGVyZmFjZV9pbmRleCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwX2FjY190ZXJtX2ludGVyZmFjZSA9ICAmKHBfYWNjX3Rlcm1faW5zdC0+aW50Zl9pbmZvLmludGVyZmFjZVtpbnRlcmZhY2VfaW5kZXhdKTsKKworICAgIH13aGlsZSgwKTsKKworCisgICAgcmV0dXJuIHBfYWNjX3Rlcm1faW50ZXJmYWNlOworfQorCitzdGF0aWMgY2hhciAqaW50ZXJmYWNlX3R5cGVfc3RyX2dldChiY21iYWxfaW50Zl90eXBlIGludGZfdHlwZSkKK3sKKyAgICByZXR1cm4gaW50Zl90eXBlID09IEJDTUJBTF9JTlRGX1RZUEVfTk5JID8gIk5OSSIgOgorICAgICAgICBpbnRmX3R5cGUgPT0gQkNNQkFMX0lOVEZfVFlQRV9QT04gPyAiUE9OIiA6ICJVTktOT1dOIFRZUEUiOworfQorLypAfSovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2FjY190ZXJtX2ZzbS5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9hY2NfdGVybV9mc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjMzN2FlCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9hY2NfdGVybV9mc20uaApAQCAtMCwwICsxLDE5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYWNjX3Rlcm1fZnNtLmgKKyAqIEBicmllZiBDb2RlIHRvIHN1cHBvcnQgdGhlIEJBTCBBY2Nlc3MgVGVybWluYWwgRlNNCisgKgorICogQGRlZmdyb3VwIGFjY2Vzc190ZXJtaW5hbCBBY2Nlc3MgVGVybWluYWwKKyAqIEBpbmdyb3VwIGNvcmUKKyAqLworCisKKyNpZm5kZWYgQUNDX1RFUk1fRlNNX0gKKyNkZWZpbmUgQUNDX1RFUk1fRlNNX0gKKworLypAeyovCisKKyNpbmNsdWRlIDxiY21fdG9wby5oPgorI2luY2x1ZGUgPGJhbF9hcGkuaD4KKyNpbmNsdWRlIDxzdWJfdGVybV9mc20uaD4KKyNpbmNsdWRlIDx0bV9zY2hlZF9mc20uaD4KKworCisvKiogQW4gZW51bWVyYXRpb24gb2YgdGhlIGFjY2Vzcy10ZXJtaW5hbCBGU00gZXZlbnRzLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfTk9ORSAgICAgICAgICAgICAgICAgPSAtMSwKKyAgQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfQURNSU5fVVAgICAgICAgICwKKyAgQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfQURNSU5fRE4gICAgICAgICwKKyAgQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfSU5UX0FETUlOX1VQICAgICwKKyAgQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfSU5UX0FETUlOX0ROICAgICwKKyAgQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfVVRJTF9NU0cgICAgICAgICwKKyAgQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfVVRJTF9BVVRPX01TRyAgICwKKyAgQUNDX1RFUk1fRlNNX0VWRU5UX1RZUEVfVElNRU9VVCAgICAgICAgICwKKworCisgIEFDQ19URVJNX0ZTTV9FVkVOVF9UWVBFX19MQVNULAorICBBQ0NfVEVSTV9GU01fRVZFTlRfVFlQRV9fTlVNX09GCit9IGFjY190ZXJtX2ZzbV9ldmVudF90eXBlOworCisKKy8qKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgYWNjZXNzLXRlcm1pbmFsIEZTTSBzdGF0ZXMuCisgKi8KK3R5cGVkZWYgZW51bQoreworICBBQ0NfVEVSTV9GU01fU1RBVEVfTk9ORSAgICAgPSAtMSwKKyAgQUNDX1RFUk1fRlNNX1NUQVRFX05VTEwgICAgICAgICAsCisgIEFDQ19URVJNX0ZTTV9TVEFURV9BRERJTkcgICAgICAgLAorICBBQ0NfVEVSTV9GU01fU1RBVEVfQURERUQgICAgICAgICwKKyAgQUNDX1RFUk1fRlNNX1NUQVRFX1JFTU9WSU5HICAgICAsCisKKyAgQUNDX1RFUk1fRlNNX1NUQVRFX19MQVNULAorICBBQ0NfVEVSTV9GU01fU1RBVEVfX05VTV9PRgorfSBhY2NfdGVybV9mc21fc3RhdGU7CisKKy8qKgorICogQSBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHRoZSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4KKyAqIGFjY2Vzcy10ZXJtaW5hbCBGU00gZXZlbnQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNjX3Rlcm1fZnNtX2V2ZW50Cit7CisgIGFjY190ZXJtX2ZzbV9ldmVudF90eXBlICBldmVudF90eXBlOyAvKio8IEFuIEZTTSBldmVudCAqLworICB2b2lkICAgICAgICAgICAgICAgICAgKm1zZzsgICAgICAgLyoqPCBBIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgYmVpbmcgcHJvY2Vzc2VkIGJ5IHRoZSBGU00gZHVyaW5nIGFuIGV2ZW50ICovCit9IGFjY190ZXJtX2ZzbV9ldmVudDsKKworLyoqCisgKiBAYnJpZWYgQSB0ZW1wb3Jhcnkgc2V0IG9mIGRlZmluaXRpb25zIHRvIHN1cHBvcnQgYWNjZXNzLXRlcm1pbmFsIGludGVyZmFjZXMuCisgKiBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCBieSBhIG1vcmUgZ2VuZXJpYyBtYXBwaW5nIG1ldGhvZC4KKyAqIEBub3RlIFRoZSBtYXggUE9OIGludGVyZmFjZSBvZiAxNiBpcyBhIHByYWN0aWNhbCBsaW1pdCB0aGF0IGFjY2VzcyB0ZXJtIHdpbGwgc3VwcG9ydCBmb3Igbm93LiAKKyAqLworI2RlZmluZSBOVU1fU1VQUE9SVEVEX1NVQlNDUklCRVJfSU5URVJGQUNFUyAgICAgKDE2KQorI2RlZmluZSBOVU1fU1VQUE9SVEVEX05OSV9JTlRFUkZBQ0VTICAgICAgICAgICAgKEJDTV9UT1BPX01BWF9OTklfUE9SVFMpCisjZGVmaW5lIE5VTV9TVVBQT1JURURfSU5URVJGQUNFUyAgICAgICAgICAgICAgICAoTlVNX1NVUFBPUlRFRF9TVUJTQ1JJQkVSX0lOVEVSRkFDRVMgKyBOVU1fU1VQUE9SVEVEX05OSV9JTlRFUkZBQ0VTKQorLyoqIGludmFsaWQgaW50ZXJmYWNlIGluZGV4IC0gdXNlZCBmb3IgYW55IGVycm9yIGluIG1hcHBpbmcgcG9ydCB0eXBlL2lkIHRvIGludGVyZmFjZSBpbmRleCAqLworI2RlZmluZSBJTlZBTElEX0lOVEVSRkFDRV9JTkRFWCAgICAgICAgICAgICAgICAgKE5VTV9TVVBQT1JURURfSU5URVJGQUNFUykKKworI2RlZmluZSBCQUxfQUNDX1RFUk1fTUFYX0ZMT1dTX1BFUl9QT04gICAgICAgICAgKDEwMjQpCisjZGVmaW5lIEJBTF9BQ0NfVEVSTV9NQVhfRkxPV1MgICAgICAgICAgICAgICAgICAoTlVNX1NVUFBPUlRFRF9TVUJTQ1JJQkVSX0lOVEVSRkFDRVMgKiBCQUxfQUNDX1RFUk1fTUFYX0ZMT1dTX1BFUl9QT04pCisKK3R5cGVkZWYgc3RydWN0IHN1Yl90ZXJtX2lkX2VudHJ5Cit7CisgICAgYmNtYmFsX3N1Yl9pZCBzdWJfdGVybV9pZDsKKyAgICBUQUlMUV9FTlRSWShzdWJfdGVybV9pZF9lbnRyeSkgbmV4dDsgLyoqPCBUQUlMUSBsaW5rICovICAgIAorfXN1Yl90ZXJtX2lkX2VudHJ5OworCisvKioKKyAqIFR3byBpbnRlcmZhY2Ugb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2Vzcy10ZXJtaW5hbC4gCisgKiBPbmUgc3RvcmVzIHRoZSBBUEkgcmVxdWVzdHMsIGFuZCBvbmUgcmVjb3JkcyB0aGUgY3VycmVudAorICogc3RhdGUgb2YgdGhlIG9iamVjdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNjX3Rlcm1faW50ZXJmYWNlCit7CisgICAgYmNtYmFsX2ludGVyZmFjZV9jZmcgY3VycmVudF9pbnRfb2JqX2luZm87ICAgLyoqPCBUaGUgY3VycmVudCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgKHVzZWQgZm9yIEdFVCkgKi8KKyAgICBiY21iYWxfaW50ZXJmYWNlX2NmZyBhcGlfcmVxX2ludF9vYmpfaW5mbzsgICAvKio8IFRoZSBsYXN0IGludGVyZmFjZSBvYmplY3QgaW5mbyByZWNlaXZlZCBmcm9tIHRoZSBQdWJsaWMgQVBJICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgbnVtX3N1Yl90ZXJtc19vbl9pbnQ7ICAgLyoqPCBUaGUgbnVtYmVyIG9mIHN1YnNjcmliZXIgdGVybWluYWxzIG9uIHRoaXMgaW50ZXJmYWNlICovCisgICAgVEFJTFFfSEVBRChzdWJfdGVybV9pZF9saXN0X2hlYWQsIHN1Yl90ZXJtX2lkX2VudHJ5KSBzdWJfdGVybV9pZF9saXN0OworfSBhY2NfdGVybV9pbnRlcmZhY2U7CisKKy8qKgorICogVGhlIGludGVyZmFjZSBrZXkgb2YgdGhlIGluc3RhbmNlIGJlaW5nIG1hbmlwdWxhdGVkLCBhbmQgYW4gYXJyYXkgb2YgaW50ZXJmYWNlIG9iamVjdHMgYXNzb2NpYXRlZAorICogd2l0aCBhbiBhY2Nlc3MgdGVybWluYWwgaW5zdGFuY2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFjY190ZXJtX2ludGVyZmFjZV9pbmZvCit7IAorICAgIGFjY190ZXJtX2ludGVyZmFjZSAgIGludGVyZmFjZVtOVU1fU1VQUE9SVEVEX0lOVEVSRkFDRVNdOyAvKio8IEFsbCBpbnRlcmZhY2UgaW5zdGFuY2VzICovCisKK31hY2NfdGVybV9pbnRlcmZhY2VfaW5mbzsKKworCisvKioKKyAqIEFuIHN0cnVjdHVyZSBkZWZpbmluZyBhbiBhY2Nlc3MgdGVybWluYWwgaW5zdGFuY2UgYW5kIGl0cyBhc3NvY2lhdGVkIGludGVyZmFjZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNjX3Rlcm1faW5zdAoreworICAvKio8IFRoZSBjdXJyZW50IGluZm9ybWF0aW9uIGZvciB0aGlzIGFjY2Vzcy10ZXJtaW5hbCAodXNlZCBmb3IgR0VUKSAgKi8KKyAgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmcgICBjdXJyZW50X2FjY190ZXJtX29ial9pbmZvOworICAKKyAgLyoqPCBUaGUgbGFzdCBhY2Nlc3MtdGVybWluYWwgb2JqZWN0IGluZm8gcmVjZWl2ZWQgZnJvbSB0aGUgUHVibGljIEFQSSAqLyAKKyAgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmcgICBhcGlfcmVxX2FjY190ZXJtX29ial9pbmZvOyAKKworICBhY2NfdGVybV9mc21fc3RhdGUgICAgICAgICAgICBmc21fc3RhdGU7ICAgICAgLyoqPCBUaGUgYWNjZXNzLXRlcm1pbmFsIEZTTSBzdGF0ZSAqLworICBhY2NfdGVybV9pbnRlcmZhY2VfaW5mbyAgICAgICBpbnRmX2luZm87ICAgICAgLyoqPCBUaGUgYWNjZXNzLXRlcm1pbmFsIGludGVyZmFjZXMgKi8KKyAgYmNtb3NfdGltZXIgICAgICAgICAgICAgICAgICAgdGltZXJfaW5mbzsgICAgIC8qKjwgQSBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIHN0YXRlIG1hY2hpbmUgdGltZW91dCB0aW1lciAqLworICAKK30gYWNjX3Rlcm1faW5zdDsKKworCisvKi0tLSBleHRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgLS0tKi8KK2V4dGVybiBiY21vc19lcnJubyBwcm9jZXNzX2FjY2Vzc190ZXJtaW5hbF9vYmplY3Qodm9pZCAqbXNnX3BheWxvYWQpOworCitleHRlcm4gYmNtb3NfZXJybm8gcHJvY2Vzc19hY2Nlc3NfdGVybWluYWxfdXRpbF9tc2codm9pZCAqbXNnX3BheWxvYWQpOworCitleHRlcm4gYmNtb3NfZXJybm8gcHJvY2Vzc19pbnRlcmZhY2Vfb2JqZWN0KHZvaWQgKm1zZ19wYXlsb2FkKTsKKworZXh0ZXJuIGJjbW9zX2Vycm5vIHByb2Nlc3NfaW50ZXJmYWNlX3V0aWxfbXNnKHZvaWQgKm1zZ19wYXlsb2FkKTsKKworZXh0ZXJuIGJjbW9zX2Vycm5vIGJjbWJhbF9pbnRlcmZhY2Vfc3ViX3Rlcm1fbGlzdF9hZGQoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5IHN1Yl90ZXJtX2tleSk7CisKK2V4dGVybiBiY21vc19lcnJubyBiY21iYWxfaW50ZXJmYWNlX3N1Yl90ZXJtX2xpc3RfcmVtb3ZlKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSBzdWJfdGVybV9rZXkpOworCitleHRlcm4gdm9pZCBhY2Nlc3NfdGVybWluYWxfZnNtX2luaXQodm9pZCk7CisKK2V4dGVybiBiY21iYWxfc3RhdHVzIGJjbWJhbF9pbnRlcmZhY2Vfc3RhdHVzX2dldChiY21iYWxfaW50ZXJmYWNlX2tleSBrZXkpOworCitleHRlcm4gYmNtYmFsX3N0YXR1cyBiY21iYWxfZ2V0X2ludGZfb3Blcl9zdGF0dXNfZnJvbV9hZG1pbl9zdGF0ZSAoYmNtYmFsX3N0YXRlIGludGZfYWRtaW5fc3RhdGUpOworCitleHRlcm4gdWludDMyX3QgYmNtYmFsX3BvcnRfdHlwZV9hbmRfaWRfdG9faW50ZXJmYWNlX2luZGV4KGJjbWJhbF9pbnRmX3R5cGUgaW50Zl90eXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2ludGZfaWQgaW50Zl9pZCk7CitleHRlcm4gYmNtYmFsX3N0YXR1cyBhY2NfdGVybV9zdGF0dXNfZ2V0KHZvaWQpOworCitleHRlcm4gYmNtb3NfZXJybm8gYmNtYmFsX2ludGVyZmFjZV9zdWJfdGVybV9saXN0X2VudHJ5X2FkZChiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgc3ViX3Rlcm1fa2V5KTsKKworZXh0ZXJuIGJjbW9zX2Vycm5vIGJjbWJhbF9pbnRlcmZhY2Vfc3ViX3Rlcm1fbGlzdF9lbnRyeV9yZW1vdmUoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5IHN1Yl90ZXJtX2tleSk7CisKK2V4dGVybiBiY21vc19lcnJubyBiY21iYWxfaW50ZXJmYWNlX3RtX2dldChiY21iYWxfaW50ZXJmYWNlX2tleSBrZXksIGJjbWJhbF90bV9zY2hlZF9pZCAqaWQpOworCitleHRlcm4gYmNtb3NfZXJybm8gaW50ZXJmYWNlX3RtX3NjaGVkX3Vuc2V0KGJjbWJhbF9pbnRlcmZhY2Vfa2V5IGludGZfa2V5LCBiY21iYWxfdG1fc2NoZWRfa2V5IHNjaGVkX2tleSk7CisKK2V4dGVybiBiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfaW50ZXJmYWNlX3RtX2F1dG9fY3JlYXRlKGJjbWJhbF9pbnRlcmZhY2VfY2ZnICpwX2ludGVyZmFjZV9pbmZvKTsKKworZXh0ZXJuIGJjbW9zX2Vycm5vIGJjbWJhbF90bV9zY2hlZF9zZXRfaW50ZXJmYWNlX293bmVyKGJjbWJhbF9pbnRlcmZhY2Vfa2V5IGludGVyZmFjZV9rZXksIHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCk7CisKK2V4dGVybiBiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfc2V0X3N1Yl90ZXJtX293bmVyKAliY21iYWxfdG1fc2NoZWRfa2V5IHRtX3NjaGVkX2tleSwgY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpwX3N1Yl90ZXJtX2NmZyk7CisKKworLypAfSovCisKKyNlbmRpZiAvKkFDQ19URVJNX0ZTTV9IICovCisKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9iYWxfY2xpLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2JhbF9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDJjMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9iYWxfY2xpLmMKQEAgLTAsMCArMSw0MjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKgorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICoKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKgorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICoKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBAZmlsZSBiYWxfY2xpLmMKKyAqIEBicmllZiBTYW1wbGUgQ0xJIHdoaWNoIGlzIHVzZWQgdG8gZXhlcmNpc2UgdGhlIEJBTCBQdWJsaWMgQVBJCisgKgorICovCisKKy8qQHsqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxiYWxfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxiYWxfY29yZS5oPgorI2luY2x1ZGUgPGJhbF9hcGkuaD4KKyNpbmNsdWRlIDxiYWxfYXBpX2NsaS5oPgorI2luY2x1ZGUgPGJjbW9zX2NsaS5oPgorI2luY2x1ZGUgPHJzY19tZ3JfY2xpLmg+CisjaW5jbHVkZSA8YmFsX3N3aXRjaF9hY2NfdGVybS5oPgorI2luY2x1ZGUgPGJhbF9tYWNfdXRpbC5oPgorI2luY2x1ZGUgPGJhbF9zd2l0Y2hfdXRpbC5oPgorI2luY2x1ZGUgImJhbF9jbGkuaCIKKworI2lmZGVmIE9NQ0lfU1ZDCisjaW5jbHVkZSA8b21jaV9zdmMuaD4KKyNpbmNsdWRlIDxvbWNpX3N2Y19jbGkuaD4KKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0xPRworI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisvKgorICogQ0xJIGxvZ2dpbmcgZGV2aWNlIGlkcworICovCitkZXZfbG9nX2lkIGxvZ19pZF9jbGk7CisKKy8qIENMSSBsb2dnaW5nIGZvciBPTlUgZGlzY292ZXJ5ICovCitkZXZfbG9nX2lkIGxvZ19pZF9jbGlfZGlzYzsKKyNlbmRpZgorYmNtY2xpX3Nlc3Npb24gKmN1cnJlbnRfc2Vzc2lvbjsKKworLyogdXNlcl9leGl0X2NiIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gQkFMIGlzIGJ1aWx0IHdpdGggYSB1c2VyIGFwcGxpY2F0aW9uCisgKiBhbmQgcnVuIGFzIGEgc2V0IG9mIHRocmVhZHMgaW4gdGhhdCBhcHBsaWNhdGlvbiAoaS5lLiB3aGVuIGJjbWJhbF9pbml0IGlzCisgKiBjYWxsZWQpICovCitzdGF0aWMgYmNtYmFsX2V4aXRfY2IgdXNlcl9leGl0X2NiOworc3RhdGljIGJjbW9zX3Rhc2sgYmFsX2NsaV90aHJlYWQ7CisKK3N0YXRpYyBjb25zdCBjaGFyICpiYWxfaXdmX21vZGVfdG9fc3RyKGJjbWJhbF9pd2ZfbW9kZSBpd2ZfbW9kZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RyX3RhYmxlW0JDTUJBTF9JV0ZfTU9ERV9fTlVNX09GXSA9CisgICAgeworICAgICAgICBbQkNNQkFMX0lXRl9NT0RFX0RJUkVDVF9NQVBQSU5HXSAgICAgID0gImRpcmVjdF9tYXBwaW5nIiwKKyAgICAgICAgW0JDTUJBTF9JV0ZfTU9ERV9QRVJfRkxPV10gICAgICAgICAgICA9ICJwZXJfZmxvdyIsCisgICAgfTsKKyAgICByZXR1cm4gKGl3Zl9tb2RlID49IEJDTUJBTF9JV0ZfTU9ERV9fTlVNX09GKSA/ICI8dW5rbm93bj4iIDogc3RyX3RhYmxlW2l3Zl9tb2RlXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmJhbF9pbnRmX21hcHRhYmxlX3RvX3N0cihiYWxfc3dhcHBfcG9ydF9tYXBfaW5keCBpbnRmX21hcHRhYmxlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdHJfdGFibGVbQkFMX1NXQVBQX1BPUlRfTUFQX19OVU1fT0ZdID0KKyAgICB7CisgICAgICAgIFtCQUxfU1dBUFBfUE9SVF9NQVBfR1BPTl0gICA9ICJncG9uIiwKKyAgICAgICAgW0JBTF9TV0FQUF9QT1JUX01BUF9HUE9OX1YzXSA9ICJncG9uIHYzIiwKKyAgICAgICAgW0JBTF9TV0FQUF9QT1JUX01BUF9FWFBdID0gImV4cCIsCisgICAgICAgIFtCQUxfU1dBUFBfUE9SVF9NQVBfRVhQMl0gPSAiZXhwIDIiLAorICAgICAgICBbQkFMX1NXQVBQX1BPUlRfTUFQX1NWSzRdID0gInN2azQiLAorICAgICAgICBbQkFMX1NXQVBQX1BPUlRfTUFQX0VQT05fVERNQV0gPSAiZXBvbl90ZG1hIiwKKyAgICAgICAgW0JBTF9TV0FQUF9QT1JUX01BUF9FUE9OXzFHXSA9ICJlcG9uXzFnIiwKKyAgICAgICAgW0JBTF9TV0FQUF9QT1JUX01BUF9FUE9OXzEwR10gPSAiZXBvbl8xMGciLAorICAgIH07CisgICAgcmV0dXJuIChpbnRmX21hcHRhYmxlID49IEJBTF9TV0FQUF9QT1JUX01BUF9fTlVNX09GKSA/ICI8dW5rbm93bj4iIDogc3RyX3RhYmxlW2ludGZfbWFwdGFibGVdOworfQorCisvKgorICogc2hvd19jb25maWYgQ0xJIGNvbW1hbmQgaGFuZGxlcgorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3Nob3dfY29uZmlnX2NtZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgblBhcm1zKQoreworICAgIGNvbnN0IGJjbWJhbF9jb25maWdfcGFyYW1zICpiYWxfY29uZmlnID0gYmNtYmFsX2NvbmZpZ19nZXQoKTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgImludGVyd29ya2luZyBtb2RlIGlzIDogJXNcbiIsIGJhbF9pd2ZfbW9kZV90b19zdHIoYmFsX2NvbmZpZy0+aXdmX21vZGUpKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAic3dpdGNoIGludGVyZmFjZSBtYXBwaW5nIHRhYmxlIGlzIDogJXNcbiIsIGJhbF9pbnRmX21hcHRhYmxlX3RvX3N0cihiYWxfY29uZmlnLT5pbnRmX21hcHRhYmxlKSk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIm1hYyBpcyAlcyBsb29wYmFjayBtb2RlIFxuIiwgYmNtYmFsX2lzX21hY19pbl9sb29wYmFjaygpID8gIklOIiA6ICJOT1QgSU4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAibnVtYmVyIG9mIG5uaSBwb3J0cyBpcyA6ICVkIFxuIiwgYmFsX2NvbmZpZy0+bnVtX25uaV9wb3J0cyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgInBvcnQgZm9yIHRyYXBwZWQgcGFja2V0cyBpcyA6ICVkIFxuIiwgYmFsX2NvbmZpZy0+dHJhcF91ZHBfcG9ydCk7CisKKyAgICBCQ01fVE9QT19GT1JfRUFDSF9ERVYoZGV2aWNlX2lkKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgInBvbiBtb2RlIG9mIGRldmljZSAlZCBpcyAlcyAsIG51bWJlciBvZiBwb25zIGlzICVkXG4iLCBkZXZpY2VfaWQsCisgICAgICAgICAgICBiY21fdG9wb19kZXZfZ2V0X3Bvbl9tb2RlX3N0cihkZXZpY2VfaWQpLGJjbV90b3BvX2Rldl9nZXRfbWF4X3BvbihkZXZpY2VfaWQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogInF1aXQiIENMSSBjb21tYW5kIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgX2NtZF9xdWl0KGJjbWNsaV9zZXNzaW9uICpzZXNzLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuUGFybXMpCit7CisgICAgYmNtY2xpX3N0b3Aoc2Vzcyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2VzcywgIkJBTCBjb3JlIENMSSB0ZXJtaW5hdGVkIGJ5ICdRdWl0JyBjb21tYW5kXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogInNsZWVwIiBDTEkgY29tbWFuZCBoYW5kbGVyICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2NtZF9zbGVlcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgblBhcm1zKQoreworICAgIGJjbW9zX3VzbGVlcChwYXJtWzBdLnZhbHVlLnVudW1iZXIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIEJBTCBjb3JlIGRlYnVnIENMSQorICoKKyAqIEByZXR1cm5zIEJDTV9FUlJfT0sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX2RlYnVnX2luaXQodm9pZCkKK3sKKyAgICBiY21jbGlfZW50cnkgKmRpcjsKKworICAgIGRpciA9IGJjbWNsaV9kaXJfYWRkKE5VTEwsICJkZWJ1ZyIsICJCQUwgY29yZSBkZWJ1ZyBDTEkiLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKworICAgIC8qIEFkZCB0aGUgcmVzb3VyY2UgbWFuYWdlciBkZWJ1ZyBDTEkgKi8KKyAgICByc2NfbWdyX2NsaV9pbml0KGRpcik7CisgICAgbWFjX3V0aWxfY2xpX2luaXQoZGlyKTsKKworICAgIC8qIEFkZCB0aGUgc3dpdGNoIHV0aWwgZGVidWcgQ0xJICovCisgICAgc3dfdXRpbF9jbGlfaW5pdChkaXIpOworCisjaWZkZWYgT01DSV9TVkMKKyAgICBpZiAoIW9tY2lfc3ZjX2lzX2xvb3BiYWNrKCkpCisgICAgICAgIG9tY2lfc3ZjX2NsaV9pbml0KGRpcik7CisjZW5kaWYKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJzbGVlcCIsICJTbGVlcCBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIHVzZWMiLCBfY21kX3NsZWVwLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ0aW1lIHRvIHNsZWVwIChtaWNyb3NlY29uZHMpIiwgInRpbWUgdG8gc2xlZXAgKG1pY3Jvc2Vjb25kcykiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJzaG93X2NvbmZpZyIsICJzaG93IGJhbCBjb25maWd1cmF0aW9uIiwgYmFsX3Nob3dfY29uZmlnX2NtZCk7CisKKyAgICAvKiBBZGQgb3MgQ0xJICovCisgICAgYmNtb3NfY2xpX2luaXQoZGlyKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogQkFMIEluZGljYXRpb24gY2FsbGJhY2sgaGFuZGxlciAqLworc3RhdGljIHZvaWQgYXBpX2luZF9jYl9oYW5kbGVyKGJjbWJhbF9vYmogKm9iaikKK3sKKworICAgIGlmKChCQ01CQUxfT0JKX0lEX1NVQlNDUklCRVJfVEVSTUlOQUwgPT0gb2JqLT5vYmpfdHlwZSkgJiYKKyAgICAgICAoQkNNQkFMX1NVQl9JRF9VTktOT1dOID09ICgoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICopb2JqKS0+a2V5LnN1Yl90ZXJtX2lkKSkKKyAgICB7CisgICAgICAgIGJjbWJhbF9zZXJpYWxfbnVtYmVyICpwX3NlcmlhbF9udW1iZXIgPQorICAgICAgICAgICAgJigoKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZyAqKW9iaiktPmRhdGEuc2VyaWFsX251bWJlcik7CisKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2NsaV9kaXNjLCAiRGlzY292ZXJlZCBPTlUgc2VyaWFsIG51bWJlciAiCisgICAgICAgICAgICAgICAgIiUyWCUyWCUyWCUyWCUxWCUxWCUxWCUxWCUxWCUxWCUxWCUxWCAiCisgICAgICAgICAgICAgICAgIm9uIFBPTiAlZFxuIiwKKyAgICAgICAgICAgICAgICBwX3NlcmlhbF9udW1iZXItPnZlbmRvcl9pZFswXSwKKyAgICAgICAgICAgICAgICBwX3NlcmlhbF9udW1iZXItPnZlbmRvcl9pZFsxXSwKKyAgICAgICAgICAgICAgICBwX3NlcmlhbF9udW1iZXItPnZlbmRvcl9pZFsyXSwKKyAgICAgICAgICAgICAgICBwX3NlcmlhbF9udW1iZXItPnZlbmRvcl9pZFszXSwKKyAgICAgICAgICAgICAgICBwX3NlcmlhbF9udW1iZXItPnZlbmRvcl9zcGVjaWZpY1swXT4+NCAmIDB4MGYsCisgICAgICAgICAgICAgICAgcF9zZXJpYWxfbnVtYmVyLT52ZW5kb3Jfc3BlY2lmaWNbMF0gJiAweDBmLAorICAgICAgICAgICAgICAgIHBfc2VyaWFsX251bWJlci0+dmVuZG9yX3NwZWNpZmljWzFdPj40ICYgMHgwZiwKKyAgICAgICAgICAgICAgICBwX3NlcmlhbF9udW1iZXItPnZlbmRvcl9zcGVjaWZpY1sxXSAmIDB4MGYsCisgICAgICAgICAgICAgICAgcF9zZXJpYWxfbnVtYmVyLT52ZW5kb3Jfc3BlY2lmaWNbMl0+PjQgJiAweDBmLAorICAgICAgICAgICAgICAgIHBfc2VyaWFsX251bWJlci0+dmVuZG9yX3NwZWNpZmljWzJdICYgMHgwZiwKKyAgICAgICAgICAgICAgICBwX3NlcmlhbF9udW1iZXItPnZlbmRvcl9zcGVjaWZpY1szXT4+NCAmIDB4MGYsCisgICAgICAgICAgICAgICAgcF9zZXJpYWxfbnVtYmVyLT52ZW5kb3Jfc3BlY2lmaWNbM10gJiAweDBmLAorCisgICAgICAgICAgICAgICAgKChiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgKilvYmopLT5rZXkuaW50Zl9pZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNoYXIgb2JqX2tleV9zdHJbMjU2XTsKKworICAgICAgICBiYWxfb2JqX2tleV9zdHJfZ2V0KG9iaiwgb2JqX2tleV9zdHIpOworCisgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX2NsaSwKKyAgICAgICAgICAgICAgICAiUHJvY2Vzc2luZyBDTEkgQVBJIFwnJXNcJyBJTkQgY2FsbGJhY2sgKHN0YXR1cyBpcyAlcyksIChrZXkgaXMgJXMpXG4iLAorICAgICAgICAgICAgICAgIGJjbWJhbF9vYmp0eXBlX3N0cihvYmotPm9ial90eXBlKSwKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihvYmotPnN0YXR1cyksCisgICAgICAgICAgICAgICAgb2JqX2tleV9zdHIpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyogRXhlY3V0ZSBDTEkgc2NyaXB0ICovCitiY21vc19lcnJubyBiY21iYWxfY2xpX2V4ZWNfc2NyaXB0KGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGNoYXIgYnVmWzEwMjRdOworICAgIEZJTEUgKmY7CisKKyAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgaWYgKCFmKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJDYW4ndCBvcGVuIGZpbGUgJXMgZm9yIHJlYWRpbmdcbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgd2hpbGUgKCFiY21jbGlfaXNfc3RvcHBlZChjdXJyZW50X3Nlc3Npb24pICYmICFmZW9mKGYpICYmCisgICAgICAgIGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiktMSwgZikpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoY3VycmVudF9zZXNzaW9uLCAiJXMiLCBidWYpOworICAgICAgICBiY21jbGlfcGFyc2UoY3VycmVudF9zZXNzaW9uLCBidWYpOworICAgIH0KKyAgICBmY2xvc2UoZik7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEV4ZWN1dGUgaW5pdCBDTEkgc2NyaXB0IGlmIGFueSAqLworYmNtb3NfZXJybm8gYmNtYmFsX2NsaV9leGVjX2luaXRfc2NyaXB0KHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBjb25zdCBjaGFyICppbml0X3NjcmlwdCA9IGJjbWJhbF9jb25maWdfZ2V0KCktPmluaXRfc2NyaXB0OworCisgICAgaWYgKGluaXRfc2NyaXB0KQorICAgICAgICByZXQgPSBiY21iYWxfY2xpX2V4ZWNfc2NyaXB0KGluaXRfc2NyaXB0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIENMSSB0aHJlYWQgaGFuZGxlciAqLworc3RhdGljIGludCBfYmFsX2NsaV90aHJlYWRfaGFuZGxlcihsb25nIGRhdGEpCit7CisgICAgY2hhciBpbml0X3N0cmluZ1tdPSJcbiI7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3MgPSBjdXJyZW50X3Nlc3Npb247CisKKyAgICAvKiBTd2l0Y2ggdG8gaW50ZXJhY3RpdmUgbW9kZSBpZiBub3Qgc3RvcHBlZCBpbiB0aGUgaW5pdCBzY3JpcHQgKi8KKyAgICBpZiAoIWJjbWNsaV9pc19zdG9wcGVkKHNlc3MpKQorICAgIHsKKyAgICAgICAgLyogRm9yY2UgYSBDTEkgY29tbWFuZCBwcm9tcHQKKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHN0cmluZyBwYXNzZWQgaW50byB0aGUgcGFyc2UgZnVuY3Rpb24KKyAgICAgICAgICogbXVzdCBiZSBtb2RpZmlhYmxlLCBzbyBhIHN0cmluZyBjb25zdGFudCBsaWtlCisgICAgICAgICAqIGJjbWNsaV9wYXJzZShjdXJyZW50X3Nlc3Npb24sICJcbiIpIHdpbGwgbm90CisgICAgICAgICAqIHdvcmsuCisgICAgICAgICAqLworICAgICAgICBiY21jbGlfcGFyc2Uoc2VzcywgaW5pdF9zdHJpbmcpOworCisgICAgICAgIC8qIFByb2Nlc3MgdXNlciBpbnB1dCB1bnRpbCBFT0Ygb3IgcXVpdCBjb21tYW5kICovCisgICAgICAgIGJjbWNsaV9kcml2ZXIoc2Vzcyk7CisgICAgfTsKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9jb3JlLCAiQkFMIENMSSB0ZXJtaW5hdGVkXG4iKTsKKworICAgIC8qIGNhbGwgdGhlIHVzZXIncyBleGl0IGNhbGxiYWNrLCBpZiBhbnkgKi8KKyAgICBpZih1c2VyX2V4aXRfY2IpICgqdXNlcl9leGl0X2NiKSgpOworCisgICAgY3VycmVudF9zZXNzaW9uID0gTlVMTDsKKyAgICBiY21jbGlfc2Vzc2lvbl9jbG9zZShzZXNzKTsKKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBCQUwgQ0xJCisgKgorICogQHJldHVybnMgQkNNX0VSUl9PSyBvbiBzdWNjZXNzLCBvdGhlciBiY21vc19lcnJubyBjb2RlcyBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21iYWxfY2xpX2luaXQoYmNtYmFsX2V4aXRfY2IgZXhpdF9jYikKK3sKKyAgICBjb25zdCBiY21iYWxfY29uZmlnX3BhcmFtcyAqYmFsX2NvbmZpZyA9IGJjbWJhbF9jb25maWdfZ2V0KCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcGFybSBtb25fc2Vzc2lvbl9wYXJtID0ge307CisgICAgYmNtb3NfdGFza19wYXJtIGJhbF9jbGlfdGFza19wID0ge307CisgICAgYmNtY2xpX2VudHJ5ICpkaXI7CisgICAgYmNtb3NfZXJybm8gcmV0OworICAgIGJjbWJhbF9jYl9jZmcgY2JfY2ZnID0ge307CisKKyAgICBtb25fc2Vzc2lvbl9wYXJtLmFjY2Vzc19yaWdodCA9IGJhbF9jb25maWctPmFjY2VzczsKKyAgICBtb25fc2Vzc2lvbl9wYXJtLmxpbmVfZWRpdF9tb2RlID0gYmFsX2NvbmZpZy0+ZWRpdF9tb2RlOworCisjaWZkZWYgRU5BQkxFX0xPRworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSB0aGUgbG9nZ2luZyBjb250ZXh0CisgICAgICovCisgICAgbG9nX2lkX2NsaSA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJDTEkiLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICBCVUdfT04obG9nX2lkX2NsaSA9PSBERVZfTE9HX0lOVkFMSURfSUQpOworCisgICAgbG9nX2lkX2NsaV9kaXNjID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoIkNMSV9ESVNDIiwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgQlVHX09OKGxvZ19pZF9jbGlfZGlzYyA9PSBERVZfTE9HX0lOVkFMSURfSUQpOworI2VuZGlmCisKKyAgICBkbworICAgIHsKKyAgICAgICAgcmV0ID0gYmNtY2xpX3Nlc3Npb25fb3BlbigmbW9uX3Nlc3Npb25fcGFybSwgJmN1cnJlbnRfc2Vzc2lvbik7CisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfY2xpLCAiQ2FuJ3Qgb3BlbiBDTEkgc2Vzc2lvblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGNiX2NmZy5vYmpfdHlwZSA9IEJDTUJBTF9PQkpfSURfQU5ZOworICAgICAgICAgICAgY2JfY2ZnLmluZF9jYl9oZGxyID0gKGZfYmNtYmFsX2luZF9oYW5kbGVyIClhcGlfaW5kX2NiX2hhbmRsZXI7CisKKyAgICAgICAgICAgIGJjbWJhbF9zdWJzY3JpYmVfaW5kKCZjYl9jZmcpOworICAgICAgICB9CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgYmFsIGFwaSBjbGkgVUkgKi8KKyAgICAgICAgaWYoTlVMTCA9PSAoZGlyID0gYmNtY2xpX2Rpcl9hZGQoTlVMTCwgImJhbCIsICJCQUwgQVBJIGFjY2VzcyIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2NsaSwgIkNvdWxkIG5vdCBpbml0aWFsaXplIHRoZSBCQUwgQVBJIENMSSBoaWVyYXJjaHlcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBiY21iYWxfYXBpY2xpX2FkZF9jb21tYW5kcyhjdXJyZW50X3Nlc3Npb24sIGRpcik7CisgICAgICAgIGlmIChyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2NsaSwgIkNvdWxkIG5vdCBpbml0aWFsaXplIHRoZSBCQUwgQ0xJOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGJhbCAiZGVidWciIENMSSAqLworICAgICAgICByZXQgPSBiYWxfZGVidWdfaW5pdCgpOworICAgICAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2NvcmUsICJFcnJvciBpbml0aWFsaXppbmcgdGhlIGJhbCBkZWJ1ZyBjbGlcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgLyogQWRkIGxvZ2dlciBDTEkgKi8KKyAgICAgICAgYmNtX2Rldl9sb2dfY2xpX2luaXQoTlVMTCk7CisjZW5kaWYKKworICAgICAgICAvKiBBZGQgInF1aXQiIGNvbW1hbmQgYXQgdGhlIHRvcCBsZXZlbCAqLworICAgICAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKE5VTEwsICJxdWl0IiwgIlF1aXQiLCBfY21kX3F1aXQpOworCisKKyAgICAgICAgLyogUmVjb3JkIHRoZSB1c2VyJ3MgY2hvaWNlIG9mIGNhbGxiYWNrIGZ1bmN0aW9uIG9uIG91ciBleGl0IChtYXkgYmUgTlVMTCEpICovCisgICAgICAgIHVzZXJfZXhpdF9jYiA9IGV4aXRfY2I7CisKKyAgICAgICAgLyogQ3JlYXRlIEJBTCBDTEkgdGhyZWFkICovCisgICAgICAgIGJhbF9jbGlfdGFza19wLm5hbWUgPSAiYmFsX2NsaV90aHJlYWQiOworICAgICAgICBiYWxfY2xpX3Rhc2tfcC5oYW5kbGVyID0gX2JhbF9jbGlfdGhyZWFkX2hhbmRsZXI7CisgICAgICAgIGJhbF9jbGlfdGFza19wLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9DTEk7CisKKyAgICAgICAgcmV0ID0gYmNtb3NfdGFza19jcmVhdGUoJmJhbF9jbGlfdGhyZWFkLCAmYmFsX2NsaV90YXNrX3ApOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiQ291bGRuJ3QgY3JlYXRlIEJBTCBDTEkgdGhyZWFkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgIH0gd2hpbGUoMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIHVuLWluaXRpYWxpemVzIHRoZSBCQUwgQ0xJCisgKgorICogQHJldHVybnMgQkNNX0VSUl9PSworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9jbGlfZmluaXNoKHZvaWQpCit7CisgICAgaWYgKCFjdXJyZW50X3Nlc3Npb24pCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworCisgICAgYmNtYmFsX2NsaV9zdG9wKCk7CisKKyAgICBiY21vc190YXNrX2Rlc3Ryb3koJmJhbF9jbGlfdGhyZWFkKTsKKworICAgIGJjbWJhbF9hcGlfZmluaXNoKCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKiBTdG9wIENMSSAqLwordm9pZCBiY21iYWxfY2xpX3N0b3Aodm9pZCkKK3sKKyAgICBpZiAoY3VycmVudF9zZXNzaW9uKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3N0b3AoY3VycmVudF9zZXNzaW9uKTsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRfc2Vzc2lvbikKKyAgICAgICAgICAgIGJjbW9zX3VzbGVlcCgxMDAwMCk7CisgICAgfQorfQorCisvKiBJcyBDTEkgdGVybWluYXRlZD8gKi8KK2JjbW9zX2Jvb2wgIGJjbWJhbF9jbGlfaXNfdGVybWluYXRlZCh2b2lkKQoreworICAgIHJldHVybiAoY3VycmVudF9zZXNzaW9uID09IE5VTEwpIHx8IGJjbWNsaV9pc19zdG9wcGVkKGN1cnJlbnRfc2Vzc2lvbik7Cit9CisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9iYWxfY2xpLmggYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2JhbF9jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGYxOWI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9iYWxfY2xpLmgKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKgorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKgorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEBmaWxlIGJhbF9jbGkuaAorICogQGJyaWVmIEFsbCBmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zIHN1cHBsaWVkIGJ5IHRoZSBTYW1wbGUgQ0xJCisgKgorICovCisKKworI2lmbmRlZiBCQUxfQ0xJX0gKKyNkZWZpbmUgQkFMX0NMSV9ICisKKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21vc19jbGkuaD4KKyNpbmNsdWRlIDxiYWxfY29yZS5oPgorLypAeyovCisKK2V4dGVybiBiY21vc19lcnJubyBiY21iYWxfY2xpX2luaXQoYmNtYmFsX2V4aXRfY2IgZXhpdF9jYik7CitleHRlcm4gdm9pZCBiY21iYWxfY2xpX3N0b3Aodm9pZCk7CitleHRlcm4gYmNtb3NfZXJybm8gYmNtYmFsX2NsaV9maW5pc2godm9pZCk7CitleHRlcm4gYmNtb3NfZXJybm8gYmNtYmFsX2NsaV9leGVjX2luaXRfc2NyaXB0KHZvaWQpOworZXh0ZXJuIGJjbW9zX2Vycm5vIGJjbWJhbF9jbGlfZXhlY19zY3JpcHQoY29uc3QgY2hhciAqZmlsZW5hbWUpOworZXh0ZXJuIGJjbW9zX2Jvb2wgIGJjbWJhbF9jbGlfaXNfdGVybWluYXRlZCh2b2lkKTsKK2V4dGVybiBiY21jbGlfc2Vzc2lvbiAqY3VycmVudF9zZXNzaW9uOworCisKKy8qQH0qLworCisjZW5kaWYgLyogQkFMX0NMSV9IICovCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vYmFsX2NvcmUuYyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vYmFsX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2MxNTczCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9iYWxfY29yZS5jCkBAIC0wLDAgKzEsMTAxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKgorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKgorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEBmaWxlIGJhbF9jb3JlLmMKKyAqIEBicmllZiBUaGUgY29kZSB0aGF0IGNvbXByaXNlcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBhbmQgaW5pdGlhbGl6YXRpb24KKyAqICAgICAgICBjb2RlIGZvciB0aGUgQkFMIENvcmUuCisgKgorICogQGFkZHRvZ3JvdXAgY3RybHIKKyAqLworCisvKkB7Ki8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJhbF9zd2l0Y2hfdXRpbC5oPgorI2luY2x1ZGUgPGJhbF9tYWNfdXRpbC5oPgorI2luY2x1ZGUgPGJhbF92ZXJzaW9uLmg+CisjaW5jbHVkZSA8Y21kbGluZS5oPgorI2luY2x1ZGUgPGJhbF9jb3JlLmg+CisjaW5jbHVkZSA8YmFsX2NsaS5oPgorCisjaW5jbHVkZSAicnNjX21nci5oIgorI2luY2x1ZGUgImJhbF93b3JrZXIuaCIKKyNpbmNsdWRlICJiYWxfc3dpdGNoX2FjY190ZXJtLmgiCisKKyNpZmRlZiBFTkFCTEVfTE9HCisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNlbmRpZgorCisjaWZkZWYgT01DSV9TVkMKKyNpbmNsdWRlIDxvbWNpX3N2Yy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NQUNfUlBDKQorI2RlZmluZSBDT05GSUdfTUFDX1VUSUxfSVBfUE9SVAorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfTE9HCisvKgorICogQGJyaWVmIFRoZSBMb2dnaW5nIGRldmljZSBpZCBmb3IgdGhlIEJBTCBjb3JlCisgKi8KK2Rldl9sb2dfaWQgbG9nX2lkX2NvcmU7CisjZW5kaWYKKworCisvKi0tLSBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgIC0tLSovCitzdGF0aWMgdm9pZCB3ZWxjb21lX3RvX2JhbCh2b2lkKTsKK3N0YXRpYyBiY21vc19lcnJubyBiYWxfY29yZV9pbml0KHZvaWQpOworc3RhdGljIHZvaWQgYmFsX2NvcmVfZmluaXNoKHZvaWQpOworc3RhdGljIHZvaWQgYmFsX3BhcnNlX2NvbmZpZyhzdHJ1Y3QgYmNtYmFsX2NvbmZpZ19wYXJhbXMgKnBfcGFyYW1zKTsKK3N0YXRpYyBiY21vc19lcnJubyBiYWxfcnBjX3NvY19nZW4odm9pZCk7CisKKy8qCisgKiBXb3JrZXIgdGhyZWFkIGFuZCBSWCB0aHJlYWQocykgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0YXRpYyBiY21vc190YXNrIGNvcmVfd29ya2VyX3RocmVhZDsKKworc3RhdGljIGJjbW9zX2Vycm5vIF91c2FnZShjb25zdCBjaGFyICpjbWQpOworCisjZGVmaW5lIEJBTF9DSEVDS19JUF9BUkdVTUVOVChfaSwgX2FyZ2MsIF9vcHRpb24pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKF9pID09IF9hcmdjIC0gMSkgXAorICAgICAgICB7IFwKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IElQOnBvcnQgaXMgZXhwZWN0ZWQgYWZ0ZXIgJXMgb3B0aW9uXG4iLCBfb3B0aW9uKTsgXAorICAgICAgICAgICAgcmV0dXJuIF91c2FnZShhcmd2WzBdKTtcCisgICAgICAgIH1cCisgICAgfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIENPUkVfTUdNVF9JUF9QT1JUX0NNRExJTkVfT1BUICAgIi1DIgorI2RlZmluZSBCQUxfQVBJX0lQX1BPUlRfQ01ETElORV9PUFQgICAgICItQSIKKyNkZWZpbmUgQkFMX01BQ19JUF9QT1JUX0NNRExJTkVfT1BUICAgICAiLU0iCisjZGVmaW5lIEJBTF9TV19JUF9DTURMSU5FX09QVCAgICAgICAgICAgIi1TIgorI2RlZmluZSBCQUxfSU5JVF9TQ1JJUFRfT1BUICAgICAgICAgICAgICItZiIKKyNkZWZpbmUgQkFMX0xPR19GSUxFX09QVCAgICAgICAgICAgICAgICAiLUYiCisjZGVmaW5lIEJBTF9IRUxQX09QVCAgICAgICAgICAgICAgICAgICAgIi1oIgorI2RlZmluZSBCQUxfTE9OR19IRUxQX09QVCAgICAgICAgICAgICAgICItLWhlbHAiCisjZGVmaW5lIEJBTF9MRVZFTF9PUFQgICAgICAgICAgICAgICAgICAgIi1MIgorI2RlZmluZSBCQUxfTk9fTE9HX09QVCAgICAgICAgICAgICAgICAgICItbmwiCisjZGVmaW5lIEJBTF9MT0dfU1lTTE9HX09QVCAgICAgICAgICAgICAgIi1zeXNsb2ciCisjZGVmaW5lIEJBTF9OT19MSU5FRURJVF9PUFQgICAgICAgICAgICAgIi1uZSIKKworCisvKiBDb21tYW5kIGxpbmUgYXJndW1lbnRzICovCitzdGF0aWMgY2xfYXJndW1lbnQgc3VwcG9ydGVkX2NsX2FyZ3NbXSA9Cit7CisjaWZkZWYgQ09ORklHX01BQ19VVElMX0lQX1BPUlQKKyAgICB7IC5zaG9ydF9uYW1lID0gQkFMX01BQ19JUF9QT1JUX0NNRExJTkVfT1BULAorICAgICAgLmV4dHJhX2FyZyA9ICJtYWNfZGV2aWNlX2lwOnBvcnQiLAorICAgICAgLmRlc2NyaXB0aW9uID0gIklQIGFkZHJlc3M6VURQIHBvcnQgd2hlcmUgdGhlIE1BQyBkZXZpY2UgbGlzdGVucyBmb3IgUlBDIG1lc3NhZ2VzIiwKKyAgICAgIC5mbGFncyA9IENMX0FSR1VNRU5UX0ZMQUdfTUFOREFUT1JZLAorICAgICAgLm93bmVyID0gIkJBTCIKKyAgICB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NXSVRDSF9SUEMKKyAgICB7IC5zaG9ydF9uYW1lID0gQkFMX1NXX0lQX0NNRExJTkVfT1BULAorICAgICAgLmV4dHJhX2FyZyA9ICJzd2l0Y2hfaXAiLAorICAgICAgLmRlc2NyaXB0aW9uID0gIlN3aXRjaCBJUCBhZGRyZXNzIGZvciBSUEMgbWVzc2FnZXMiLAorICAgICAgLmZsYWdzID0gQ0xfQVJHVU1FTlRfRkxBR19NQU5EQVRPUlksCisgICAgfSwKKyNlbmRpZgorICAgIHsgLnNob3J0X25hbWUgPSBDT1JFX01HTVRfSVBfUE9SVF9DTURMSU5FX09QVCwKKyAgICAgIC5leHRyYV9hcmcgPSAiY29yZV9tZ210X2lwOnBvcnQiLAorICAgICAgLmRlc2NyaXB0aW9uID0gIklQIGFkZHJlc3M6VURQIHBvcnQgd2hlcmUgdGhlIGNvcmUgbGlzdGVucyBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkiLAorICAgIH0sCisgICAgeyAuc2hvcnRfbmFtZSA9IEJBTF9BUElfSVBfUE9SVF9DTURMSU5FX09QVCwKKyAgICAgIC5leHRyYV9hcmcgPSAgICJhbF9hcGlfbWdtdCBpcDpwb3J0IiwKKyAgICAgIC5kZXNjcmlwdGlvbiA9ICJJUCBhZGRyZXNzOlVEUCBwb3J0IHdoZXJlIEJBTCBQdWJsaWMgQVBJIGxpc3RlbnMgZm9yIHJlc3BvbnNlcyBmcm9tIHRoZSBjb3JlIiwKKyAgICB9LAorICAgIHsgLnNob3J0X25hbWUgPSBCQUxfTEVWRUxfT1BULAorICAgICAgLmV4dHJhX2FyZyA9ICAgImxldmVsIiwKKyAgICAgIC5kZXNjcmlwdGlvbiA9ICJDTEkgbGV2ZWw6IGd1ZXN0IHwgYWRtaW4gfCBkZWJ1ZyIsCisgICAgfSwKKyAgICB7IC5zaG9ydF9uYW1lID0gQkFMX05PX0xJTkVFRElUX09QVCwKKyAgICAgIC5kZXNjcmlwdGlvbiA9ICJEaXNhYmxlIGxpbmUgZWRpdGluZyIsCisgICAgfSwKKyAgICB7IC5zaG9ydF9uYW1lID0gQkFMX0lOSVRfU0NSSVBUX09QVCwKKyAgICAgIC5leHRyYV9hcmcgPSAic2NyaXB0X2ZpbGVfbmFtZSIsCisgICAgICAuZGVzY3JpcHRpb24gPSAiU2NyaXB0IGNvbnRhaW5pbmcgQkFMIENMSSBjb21tYW5kcyIsCisgICAgfSwKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgeyAuc2hvcnRfbmFtZSA9IEJBTF9MT0dfRklMRV9PUFQsCisgICAgICAuZXh0cmFfYXJnID0gImxvZ19maWxlX25hbWUiLAorICAgICAgLmRlc2NyaXB0aW9uID0gIkxvZyBpbnRvIGZpbGUiLAorICAgIH0sCisgICAgeyAubG9uZ19uYW1lID0gQkFMX0xPR19TWVNMT0dfT1BULAorICAgICAgLmRlc2NyaXB0aW9uID0gIkxvZyB0byBzeXNsb2ciLAorICAgIH0sCisgICAgeyAuc2hvcnRfbmFtZSA9IEJBTF9OT19MT0dfT1BULAorICAgICAgLmRlc2NyaXB0aW9uID0gIkRpc2FibGUgbG9nZ2VyIiwKKyAgICB9LAorI2VuZGlmCisjaWZuZGVmIEJVSUxEX09GX0FHRU5UCisgICAgeyAuc2hvcnRfbmFtZSA9IEJBTF9IRUxQX09QVCwKKyAgICAgIC5sb25nX25hbWUgPSBCQUxfTE9OR19IRUxQX09QVCwKKyAgICAgIC5kZXNjcmlwdGlvbiA9ICJUaGlzIGhlbHAiLAorICAgIH0sCisjZW5kaWYKK307CisKKy8qCisgKiBUaGUgQkFMIGNvcmUgY29uZmlnIGZpbGUgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIFRPUE9MT0dZX0ZJTEVfTkFNRSAiYmFsX3RvcG9sb2d5LmluaSIKKyNkZWZpbmUgQ09ORklHX0ZJTEVfTkFNRSAiYmFsX2NvbmZpZy5pbmkiCisjZGVmaW5lIE1BWF9DT05GSUdfRklMRV9MSU5FX0xFTiAyNTYKKyNkZWZpbmUgTUFYX0NPTkZJR19QQVJBTV9OQU1FX0xFTiA2NAorI2RlZmluZSBNQVhfQ09ORklHX1BBUkFNX1ZBTFVFX0xFTiA2NAorCitiY21iYWxfY29uZmlnX3BhcmFtcyBiYWxfY29uZmlnX3BhcmFtcyA9Cit7CisgICAgLml3Zl9tb2RlID0gQkNNQkFMX0lXRl9NT0RFX1BFUl9GTE9XLAorICAgIC5pbnRmX21hcHRhYmxlID0gMiwKKyAgICAubnVtX25uaV9wb3J0cyA9IEJDTV9UT1BPX01BWF9OTklfUE9SVFMsCisgICAgLyogVGhlIGludGVyZmFjZSBtYXBwaW5nIHRhYmxlIGRlZmF1bHQgdmFsdWUgaXMgc2V0IGluIHRoZSBzd2l0Y2ggdXRpbGl0aWVzICovCisgICAgLnRvcG9fcGFyYW1zLnBvbl9tb2RlID0gQkNNX1RPUE9fUE9OX01PREVfSU5WQUxJRCwKKyAgICAvKiBEZWZhdWx0IENMSSBzZXNzaW9uIHBhcmFtZXRlcnMgKi8KKyAgICAuYWNjZXNzID0gQkNNQ0xJX0FDQ0VTU19BRE1JTiwKKyAgICAuZWRpdF9tb2RlID0gQkNNQ0xJX0xJTkVfRURJVF9ERUZBVUxULAorfTsKK3N0YXRpYyBiY21vc19ib29sIGJhbF9pbml0aWFsaXplZDsKKworI2RlZmluZSBSUENfU09DX1RFTVBMQVRFX0ZJTEVfTkFNRSAicnBjLnNvYy50ZW1wbGF0ZSIKKyNkZWZpbmUgUlBDX1NPQ19GSUxFX05BTUUgInJwYy5zb2MiCisjZGVmaW5lIE1BWF9DTURfTElORV9MRU4gMjU2CisKKyAvKgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIHBvc3NpYmxlIGl3ZiBtb2RlcworICovCitzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGl3Zl9tb2RlX2VudW1bXSA9IHsKKyAgICB7IC5uYW1lPSJkaXJlY3QiLCAgICAgIC52YWw9QkNNQkFMX0lXRl9NT0RFX0RJUkVDVF9NQVBQSU5HfSwKKyAgICB7IC5uYW1lPSJwZXJfZmxvdyIsICAgIC52YWw9QkNNQkFMX0lXRl9NT0RFX1BFUl9GTE9XfSwKKyAgICBCQ01DTElfRU5VTV9MQVNUCit9OworCisvKioKKyAqIEBicmllZiBUaGUgQnJvYWRjb20gTHRkIGxvZ28uCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpnX3BfY29tcGFueV9sb2dvID0KKyJcblxuIgorIiAgICAgICAgICAgICAqXG4iCisiICAgICAgICAgICAgKiAqXG4iCisiICAgICAgICAgICAqICAgKlxuIgorIiAgICAgICAgICAgKiAgICpcbiIKKyIgICAgICAgICAgKiAgICAgKlxuIgorIiAgICAgICAgICAqICAgICAqXG4iCisiICAgICAgICAgICogICAgICpcbiIKKyIgICAqICogICAqICAgICAgICogICAqICpcbiIKKyIgKiAgICAgICogICAgICAgICAqICAgICAgKlxuXG4iCisiQ29weXJpZ2h0IChjKSAyMDE3IEJyb2FkY29tIEx0ZFxuXG4iOworCisKKyNpZmRlZiBFTkFCTEVfTE9HCisvKiBDcmVhdGUgbG9nX2lkIGZvciB0aGUgY29yZSAqLworc3RhdGljIHZvaWQgYmFsX2NvcmVfbG9nX2luaXQodm9pZCkKK3sKKyAgICAvKiBSZWdpc3RlciB0aGUgY29yZSBsb2dnaW5nIGNvbnRleHQgKi8KKyAgICBsb2dfaWRfY29yZSA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJDT1JFX0NUUkxSIiwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgQlVHX09OKGxvZ19pZF9jb3JlID09IERFVl9MT0dfSU5WQUxJRF9JRCk7CisKKyAgICBiY21fZGV2X2xvZ19sZXZlbF9zZXRfc3R5bGUoREVWX0xPR19MRVZFTF9GQVRBTCwgQkNNX0RFVl9MT0dfU1RZTEVfQk9MRCk7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWxfc2V0X3N0eWxlKERFVl9MT0dfTEVWRUxfRVJST1IsIEJDTV9ERVZfTE9HX1NUWUxFX0JPTEQpOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2NvcmUsICJCQUwgQ29yZSBpcyBzdGFydGluZ1xuIik7Cit9CisKKy8qIEluaXRpYWxpemUgbG9nZ2VyICovCitzdGF0aWMgaW50IGJhbF9kZXZfbG9nX3RpbWVfdG9fc3RyX2NiKHVpbnQzMl90IGJhbF90aW1lLCBjaGFyICp0aW1lX3N0ciwgaW50IHRpbWVfc3RyX3NpemUpCit7CisgICAgLyogUm91bmQgdGltZXN0YW1wIHRvIHRoZSBuZWFyZXN0IG1zICovCisgICAgdWludDMyX3QgdGltZV9tcyA9IChiYWxfdGltZSArIDUwMCkgLyAxMDAwOworICAgIHJldHVybiBzbnByaW50Zih0aW1lX3N0ciwgdGltZV9zdHJfc2l6ZSwgIiUwNXUuJTAzdSIsIHRpbWVfbXMgLyAxMDAwLCB0aW1lX21zICUgMTAwMCk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBzeXN0ZW0gbG9nZ2luZyBzdWJzeXN0ZW0KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGF0IHN5c3RlbSBzdGFydHVwIHRpbWUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21iYWxfbG9nX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisjaWZkZWYgRU5BQkxFX0xPRworICAgIGNvbnN0IGNoYXIgKmxvZ19maWxlX25hbWUgPSBiYWxfY29uZmlnX3BhcmFtcy5sb2dfZmlsZV9uYW1lOworICAgIGlmIChiYWxfY29uZmlnX3BhcmFtcy5kaXNhYmxlX2xvZykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgZG8KKyAgICB7CisgICAgICAgIGlmIChOVUxMID09IGxvZ19maWxlX25hbWUgJiYgIWJhbF9jb25maWdfcGFyYW1zLmxvZ19zeXNsb2cpCisgICAgICAgIHsKKyNkZWZpbmUgREVWX0xPR19TSVpFMSAxPDwyMAorI2RlZmluZSBERVZfTE9HX1FVRVVFX1NJWkUgMTAwMAorICAgICAgICAgICAgc3RhdGljIHVpbnQ4X3QgbG9nZ2VyX2J1ZjFbREVWX0xPR19TSVpFMV07CisgICAgICAgICAgICB2b2lkICphZGRyZXNzZXNbREVWX0xPR19NQVhfRklMRVNdID0ge2xvZ2dlcl9idWYxfTsKKyAgICAgICAgICAgIHVpbnQzMl90IHNpemVzW0RFVl9MT0dfTUFYX0ZJTEVTXSA9IHtzaXplb2YobG9nZ2VyX2J1ZjEpfTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzW0RFVl9MT0dfTUFYX0ZJTEVTXSA9IHtCQ01fREVWX0xPR19GSUxFX0ZMQUdfV1JBUF9BUk9VTkR9OworICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgc3lzdGVtIGxvZ2dlciBmb3IgdGhlIGNvcmUgdGhyZWFkcyAqLworICAgICAgICAgICAgcmV0ID0gYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcihhZGRyZXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX1NJWkVPRkFSUkFZKGFkZHJlc3NlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFTS19QUklPUklUWV9ERVZfTE9HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZfTE9HX1FVRVVFX1NJWkUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtX2Rldl9sb2dfcGFybSBkZXZfbG9nX3Bhcm0gPSB7fTsKKyAgICAgICAgICAgIGludCBuZmlsZXMgPSAwOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gbG9nX2ZpbGVfbmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZXZfbG9nX3Bhcm0ubG9nX2ZpbGVbbmZpbGVzXS50eXBlID0gQkNNX0RFVl9MT0dfRklMRV9SRUdVTEFSOworICAgICAgICAgICAgICAgIGRldl9sb2dfcGFybS5sb2dfZmlsZVtuZmlsZXNdLnVkZWZfcGFybXMgPSAoY2hhciAqKShsb25nKWxvZ19maWxlX25hbWU7CisgICAgICAgICAgICAgICAgZGV2X2xvZ19wYXJtLmxvZ19maWxlW25maWxlc10uZmxhZ3MgPSBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQ7CisgICAgICAgICAgICAgICAgKytuZmlsZXM7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgaWYgKGJhbF9jb25maWdfcGFyYW1zLmxvZ19zeXNsb2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGV2X2xvZ19wYXJtLmxvZ19maWxlW25maWxlc10udHlwZSA9IEJDTV9ERVZfTE9HX0ZJTEVfU1lTTE9HOworICAgICAgICAgICAgICAgIGRldl9sb2dfcGFybS5sb2dfZmlsZVtuZmlsZXNdLnVkZWZfcGFybXMgPSAiQkFMIjsKKyAgICAgICAgICAgICAgICBkZXZfbG9nX3Bhcm0ubG9nX2ZpbGVbbmZpbGVzXS5mbGFncyA9IEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19WQUxJRDsKKyAgICAgICAgICAgICAgICArK25maWxlczsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICByZXQgPSBiY21fZGV2X2xvZ19pbml0X2RlZmF1bHRfbG9nZ2VyX2V4dCgmZGV2X2xvZ19wYXJtLAorICAgICAgICAgICAgICAgIG5maWxlcywgLyogTG9nIGludG8gZmlsZSBhbmQvb3Igc3lzbG9nICovCisgICAgICAgICAgICAgICAgMHg0MDAwLAorICAgICAgICAgICAgICAgIFRBU0tfUFJJT1JJVFlfREVWX0xPRywKKyAgICAgICAgICAgICAgICBERVZfTE9HX1FVRVVFX1NJWkUpOworICAgICAgICB9CisKKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3IgaW5pdGlhbGl6aW5nIGxvZ2dlciBkZWZhdWx0IHZhbHVlcyAoJXMpXG4iLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYmNtX2Rldl9sb2dfc2V0X3RpbWVfdG9fc3RyX2NiKGJhbF9kZXZfbG9nX3RpbWVfdG9fc3RyX2NiKTsKKyAgICB9CisgICAgd2hpbGUoMCk7CisjZW5kaWYgLyogI2lmZGVmIEVOQUJMRV9MT0cgKi8KKworICAgIHJldHVybiByZXQ7Cit9CisKKworLyogUGFyc2UgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9jbWRsaW5lX3BhcnNlKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoY2xfdmFsaWRhdGUoYXJnYywgYXJndiwgc3VwcG9ydGVkX2NsX2FyZ3MsIEJDTV9TSVpFT0ZBUlJBWShzdXBwb3J0ZWRfY2xfYXJncykpICE9IEJDTV9FUlJfT0spCisgICAgICAgIHJldHVybiBfdXNhZ2UoYXJndlswXSk7CisKKyAgICAvKgorICAgICAqIFBhcnNlIGFsbCBvcHRpb25hbCBhcmd1bWVudHMKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgQ09SRV9NR01UX0lQX1BPUlRfQ01ETElORV9PUFQpKQorICAgICAgICB7CisgICAgICAgICAgICBCQUxfQ0hFQ0tfSVBfQVJHVU1FTlQoaSwgYXJnYywgQ09SRV9NR01UX0lQX1BPUlRfQ01ETElORV9PUFQpOworICAgICAgICAgICAgYmFsX2NvbmZpZ19wYXJhbXMuY29yZV9tZ210X2lwX3BvcnQgPSBhcmd2WysraV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCBCQUxfQVBJX0lQX1BPUlRfQ01ETElORV9PUFQpKQorICAgICAgICB7CisgICAgICAgICAgICBCQUxfQ0hFQ0tfSVBfQVJHVU1FTlQoaSwgYXJnYywgQkFMX0FQSV9JUF9QT1JUX0NNRExJTkVfT1BUKTsKKyAgICAgICAgICAgIGJhbF9jb25maWdfcGFyYW1zLmJhbGFwaV9tZ210X2lwX3BvcnQgPSBhcmd2WysraV07CisgICAgICAgIH0KKyNpZmRlZiBDT05GSUdfTUFDX1VUSUxfSVBfUE9SVAorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sIEJBTF9NQUNfSVBfUE9SVF9DTURMSU5FX09QVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdoZW4gd2UgYnVpbGQgZm9yIHg4NiwgdGhpcyBpcyBhIG5lY2Vzc2FyeSBhcmd1bWVudCwgYmVjYXVzZSB0aGUgTUFDIGRldmljZSBpcworICAgICAgICAgICAgICogcmVtb3RlIGZyb20gdGhlIEJBTCBjb3JlLiAgV2hlbiB3ZSBidWlsZCBmb3IgV1JYLCB0aGlzIGFyZ3VtZW50IGlzbid0IHJlcXVpcmVkCisgICAgICAgICAgICAgKiBiZWNhdXNlIHRoZSBNQUMgZGV2aWNlIGlzIGxvY2FsIGFuZCB0aGUgbWFjX3JwY19pcF9wb3J0IHZhbHVlIGlzIG5vdCB1c2VkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBCQUxfQ0hFQ0tfSVBfQVJHVU1FTlQoaSwgYXJnYywgQkFMX01BQ19JUF9QT1JUX0NNRExJTkVfT1BUKTsKKyAgICAgICAgICAgIGJhbF9jb25maWdfcGFyYW1zLm1hY19ycGNfaXBfcG9ydCA9IGFyZ3ZbKytpXTsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NXSVRDSF9SUEMKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCBCQUxfU1dfSVBfQ01ETElORV9PUFQpKQorICAgICAgICB7CisgICAgICAgICAgICBCQUxfQ0hFQ0tfSVBfQVJHVU1FTlQoaSwgYXJnYywgQkFMX1NXX0lQX0NNRExJTkVfT1BUKTsKKyAgICAgICAgICAgIGJhbF9jb25maWdfcGFyYW1zLnN3X3JwY19pcCA9IGFyZ3ZbKytpXTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgQkFMX0xFVkVMX09QVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICJhZG1pbiIpKQorICAgICAgICAgICAgICAgIGJhbF9jb25maWdfcGFyYW1zLmFjY2VzcyA9IEJDTUNMSV9BQ0NFU1NfQURNSU47CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJndWVzdCIpKQorICAgICAgICAgICAgICAgIGJhbF9jb25maWdfcGFyYW1zLmFjY2VzcyA9IEJDTUNMSV9BQ0NFU1NfR1VFU1Q7CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJkZWJ1ZyIpKQorICAgICAgICAgICAgICAgIGJhbF9jb25maWdfcGFyYW1zLmFjY2VzcyA9IEJDTUNMSV9BQ0NFU1NfREVCVUc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIF91c2FnZShhcmd2WzBdKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sIEJBTF9OT19MSU5FRURJVF9PUFQpKQorICAgICAgICB7CisgICAgICAgICAgICBiYWxfY29uZmlnX3BhcmFtcy5lZGl0X21vZGUgPSBCQ01DTElfTElORV9FRElUX0RJU0FCTEU7CisgICAgICAgIH0KKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgQkFMX05PX0xPR19PUFQpKQorICAgICAgICB7CisgICAgICAgICAgICBiYWxfY29uZmlnX3BhcmFtcy5kaXNhYmxlX2xvZyA9IEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCBCQUxfTE9HX1NZU0xPR19PUFQpKQorICAgICAgICB7CisgICAgICAgICAgICBiYWxfY29uZmlnX3BhcmFtcy5sb2dfc3lzbG9nID0gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sIEJBTF9MT0dfRklMRV9PUFQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA9PSBhcmdjIC0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vc19wcmludGYoIkxvZyBmaWxlIG5hbWUgaXMgZXhwZWN0ZWQgYWZ0ZXIgJXMgb3B0aW9uXG4iLCBCQUxfTE9HX0ZJTEVfT1BUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX3VzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmFsX2NvbmZpZ19wYXJhbXMubG9nX2ZpbGVfbmFtZSA9IGFyZ3ZbKytpXTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgQkFMX0lOSVRfU0NSSVBUX09QVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpID09IGFyZ2MgLSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiU2NyaXB0IGZpbGUgbmFtZSBpcyBleHBlY3RlZCBhZnRlciAlcyBvcHRpb25cbiIsIEJBTF9JTklUX1NDUklQVF9PUFQpOworICAgICAgICAgICAgICAgIHJldHVybiBfdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiYWxfY29uZmlnX3BhcmFtcy5pbml0X3NjcmlwdCA9IGFyZ3ZbKytpXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sIEJBTF9IRUxQX09QVCkgfHwgIXN0cmNtcChhcmd2W2ldLCBCQUxfTE9OR19IRUxQX09QVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfdXNhZ2UoYXJndlswXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXZSBoYXZlIGVuY291bnRlcmVkIGEgbm9uLW1hbmRhdG9yeSBjb21tYW5kIGxpbmUgb3B0aW9uCisgICAgICAgICAgICAgKiB0aGF0IHdlIGRvbid0IHJlY29nbml6ZS4gIFRoaXMgaXMgYSBmYXRhbCBlcnJvci4gIFByaW50CisgICAgICAgICAgICAgKiB0aGUgcHJvcGVyIGNvbW1hbmQgbGluZSBpbnZvY2F0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwcmludGYoIkVycm9yOiB1bnJlY29nbml6ZWQgY21kbGluZSBvcHRpb24gc3BlY2lmaWVkICglcylcbiIsIGFyZ3ZbaV0pOworICAgICAgICAgICAgcmV0dXJuIF91c2FnZShhcmd2WzBdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVGhlIHVzZXIgTVVTVCBzcGVjaWZ5IHRoZSBtYWMgYW5kIHN3aXRjaCBJUDpwb3J0IGZvciBJUEMKKyAgICAgKi8KKyAgICBpZiAoQkNNT1NfRkFMU0UKKyNpZm5kZWYgQkFMX01PTk9MSVRISUMKKyAgICAgICAgfHwgKE5VTEwgPT0gYmFsX2NvbmZpZ19wYXJhbXMuY29yZV9tZ210X2lwX3BvcnQpIHx8IChOVUxMID09IGJhbF9jb25maWdfcGFyYW1zLmJhbGFwaV9tZ210X2lwX3BvcnQpCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUFDX1VUSUxfSVBfUE9SVAorICAgICAgICB8fCAoKEJDTU9TX1RSVUUgIT0gYmNtYmFsX2lzX21hY19pbl9sb29wYmFjaygpKSAmJiAoTlVMTCA9PSBiYWxfY29uZmlnX3BhcmFtcy5tYWNfcnBjX2lwX3BvcnQpKQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NXSVRDSF9SUEMKKyAgICAgICAgfHwgKE5VTEwgPT0gYmFsX2NvbmZpZ19wYXJhbXMuc3dfcnBjX2lwKQorI2VuZGlmCisgICAgICApCisgICAgeworICAgICAgICBwcmludGYoIkVycm9yOiB5b3UgbXVzdCBlbnRlciBBTEwgbWFuZGF0b3J5IGNtZGxpbmUgb3B0aW9uc1xuIik7CisgICAgICAgIHJldHVybiBfdXNhZ2UoYXJndlswXSk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFRoaXMgaXMgQkFMIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gQkFMIGlzIGNvbXBpbGVkCisgKiBhcyBhIGxpYnJhcnkgcmF0aGVyIHRoYW4gc3RhbmQtYWxvbmUgYXBwbGljYXRpb24uCisgKiBccGFyYW1baW5dICAgYXJnYyAgICBOdW1iZXIgb2YgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMKKyAqIFxwYXJhbVtpbl0gICBhcmd2ICAgIENvbW1hbmQgbGluZSBwYXJhbWV0ZXIgYXJyYXkKKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0sgKDApIGlmIHN1Y2Nlc3NmdWwgb3IgZXJyb3I8MCBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtYmFsX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQ7CisKKyAgICAvKiBSZWFkIHRoZSBiYWwgY29uZmlnIGZpbGUgKGJhbF9jb25maWcuaW5pKSBwYXJhbWV0ZXJzLCBpZiB0aGUgY29uZmlnIGZpbGUgaXMgcHJlc2VudCAqLworICAgIGJhbF9wYXJzZV9jb25maWcoJmJhbF9jb25maWdfcGFyYW1zKTsKKworICAgIC8qIE5vdyBpbml0aWFsaXplIHRoZSBzeXN0ZW0gdG9wb2xvZ3kgKi8KKyAgICByZXQgPSBiY21fdG9wb19pbml0KChiYWxfY29uZmlnX3BhcmFtcy50b3BvX3BhcmFtcy5udW1fb2ZfZGV2cyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIGJhbF9jb25maWdfcGFyYW1zLnRvcG9fcGFyYW1zLm51bV9vZl9wb25zX3Blcl9kZXYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYWxfY29uZmlnX3BhcmFtcy50b3BvX3BhcmFtcy5wb25fbW9kZSAhPSBCQ01fVE9QT19QT05fTU9ERV9JTlZBTElEKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmYmFsX2NvbmZpZ19wYXJhbXMudG9wb19wYXJhbXMgOiBOVUxMLCBUT1BPTE9HWV9GSUxFX05BTUUpOworCisgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgeworICAgICAgICBiY21vc19wcmludGYoIkVycm9yIGluaXRpYWxpemluZyB0aGUgc3lzdGVtIHRvcG9sb2d5XG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgYmFsX2NvcmVfbG9nX2luaXQoKTsKKyNlbmRpZgorCisgICAgLyogR2VuZXJhdGUgcnBjLnNvYyBmcm9tIHJwYy5zb2MudGVtcGxhdGUgKi8KKyAgICBpZiAoQkNNX0VSUl9PSyAhPSAocmV0ID0gYmFsX3JwY19zb2NfZ2VuKCkpKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZG8KKyAgICB7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgQkFMIGNvcmUgaXRzZWxmCisgICAgICAgICAqIE5PVEU6IEl0IGlzIGFzc3VtZWQgdGhhdCBsb2dnaW5nIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorICAgICAgICAgKiBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBjYWxsIGlzIG1hZGUKKyAgICAgICAgICovCisgICAgICAgIHJldCA9IGJhbF9jb3JlX2luaXQoKTsKKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9jb3JlLCAiRXJyb3IgaW5pdGlhbGl6aW5nIHRoZSBiYWwgY29yZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHN3aXRjaCB1dGlsaXRpZXMgKi8KKyAgICAgICAgcmV0ID0gc3dfdXRpbF9pbml0KCk7CisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfY29yZSwgIkVycm9yIGluaXRpYWxpemluZyB0aGUgYmFsIHN3aXRjaCB1dGlsaXRpZXNcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBtYWMgdXRpbGl0aWVzICovCisgICAgICAgIHJldCA9IG1hY191dGlsX2luaXQoYmFsX2NvbmZpZ19wYXJhbXMubWFjX3JwY19pcF9wb3J0KTsKKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9jb3JlLCAiRXJyb3IgaW5pdGlhbGl6aW5nIHRoZSBiYWwgbWFjIHV0aWxpdGllc1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGJhbCBwdWJsaWMgYXBpICovCisgICAgICAgIHJldCA9IGJjbWJhbF9hcGlfaW5pdChiYWxfY29uZmlnX3BhcmFtcy5iYWxhcGlfbWdtdF9pcF9wb3J0LCBiYWxfY29uZmlnX3BhcmFtcy5jb3JlX21nbXRfaXBfcG9ydCk7CisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfY29yZSwgIkNvdWxkIG5vdCBpbml0aWFsaXplIHRoZSBCQUwgUHVibGljIEFQSVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJhbF9pbml0aWFsaXplZCA9IEJDTU9TX1RSVUU7CisKKyAgICAgICAgLyogUHJpbnQgb3V0IHRoZSB3ZWxjb21lIGJhbm5lciAqLworICAgICAgICB3ZWxjb21lX3RvX2JhbCgpOworICAgIH0KKyAgICB3aGlsZSgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYmNtYmFsX2ZpbmlzaCh2b2lkKQoreworICAgIGJjbWJhbF9jbGlfZmluaXNoKCk7CisgICAgaWYgKGJhbF9pbml0aWFsaXplZCkKKyAgICAgICAgYmFsX2NvcmVfZmluaXNoKCk7Cit9CisKKy8qIFRvcC1sZXZlbCBpbml0IHNlcXVlbmNlICovCitiY21vc19lcnJubyBiY21iYWxfaW5pdF9hbGwoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgYmNtYmFsX2V4aXRfY2IgZXhpdF9jYikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgZXJyID0gYmNtYmFsX2NtZGxpbmVfcGFyc2UoYXJnYywgYXJndik7CisgICAgZXJyID0gKGVyciAhPSBCQ01fRVJSX09LKSA/IGVyciA6IGJjbW9zX2luaXQoKTsKKyAgICBlcnIgPSAoZXJyICE9IEJDTV9FUlJfT0spID8gZXJyIDogYmNtYmFsX2xvZ19pbml0KCk7CisgICAgZXJyID0gKGVyciAhPSBCQ01fRVJSX09LKSA/IGVyciA6IGJjbWJhbF9pbml0KCk7CisgICAgZXJyID0gKGVyciAhPSBCQ01fRVJSX09LKSA/IGVyciA6IGJjbWJhbF9jbGlfaW5pdChleGl0X2NiKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgQkFMIGNvcmUgY29tbWFuZCBsaW5lIHVzYWdlIGZ1bmN0aW9uCisgKgorICogIEEgZnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgcHJvcGVyIGJhbF9jb3JlIGNvbW1hbmQgbGluZSBmb3JtYXQKKyAqCisgKiBAcGFyYW0gY21kIEEgcG9pbnRlciB0byB0aGUgY29tbWFuZCBsaW5lIHN0cmluZyB0aGF0IHRoZSB1c2VyIGVudGVyZWQgdG8KKyAqICAgICAgICAgICAgc3RhcnQgdGhlIEJBTCBjb3JlLgorICoKKyAqIEByZXR1cm5zIEJDTV9FUlJfUEFSTSAtIFRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIHJ1biBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlcgorICogICAgICAgICAgICAgICAgICAgIGVudGVyaW5nIGFuIGludmFsaWQgdmFsdWUgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gX3VzYWdlKGNvbnN0IGNoYXIgKmNtZCkKK3sKKyNpZm5kZWYgQlVJTERfT0ZfQUdFTlQKKyAgICAvKiBGb3IgU0ROX0FHRU5UIGFsbCBwYXJtIHVzYWdlIGluZm8gaXMgcHJpbnRlZCBpbiB0aGUgYWdlbnQncyBtYWluICovCisgICAgY2xfcHJpbnRfdXNhZ2UoY21kLCBOVUxMLCBzdXBwb3J0ZWRfY2xfYXJncywgQkNNX1NJWkVPRkFSUkFZKHN1cHBvcnRlZF9jbF9hcmdzKSwgQ0xfQVJHVU1FTlRfVVNBR0VfRkxBR19OT05FKTsKKyNlbmRpZgorICAgIHJldHVybiBCQ01fRVJSX1BBUk07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBCQUwgY29yZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqICBBIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIEJBTCBjb3JlIGFuZCBhbGwgaXRzIGFzc29jaWF0ZWQgdGhyZWFkcy4KKyAqCisgKiBAcmV0dXJucyBCQ01fRVJSX09LLCBvciB0aGUgcmV0dXJuIHZhbHVlIGZyb20gZmlyc3QgZnVuY3Rpb24gY2FsbGVkCisgKiAgICAgICAgICB0aGF0IGZhaWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiYWxfY29yZV9pbml0KHZvaWQpCit7CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2tfcCA9IHt9OworICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wID0ge307CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBtZ210X3F1ZXVlX2FkZHJfcG9ydHMgbWdtdF9xdWV1ZV9pbmZvOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIENyZWF0ZSBtZXNzYWdlIHF1ZXVlcyAqLworICAgICAgICBtZ210X3F1ZXVlX2luZm8uY29yZV9tZ210X2lwX3BvcnQgPSBiYWxfY29uZmlnX3BhcmFtcy5jb3JlX21nbXRfaXBfcG9ydDsKKyAgICAgICAgbWdtdF9xdWV1ZV9pbmZvLmJhbGFwaV9tZ210X2lwX3BvcnQgPSBiYWxfY29uZmlnX3BhcmFtcy5iYWxhcGlfbWdtdF9pcF9wb3J0OworICAgICAgICByZXQgPSBjb3JlX21zZ19xdWV1ZV9pbml0KCZtZ210X3F1ZXVlX2luZm8pOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9jb3JlLCAiQ291bGRuJ3QgY3JlYXRlIG1lc3NhZ2UgcXVldWVzXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogQ3JlYXRlIHdvcmtlciB0aHJlYWQgJiBtb2R1bGVzIGZvciBtZ210IG1lc3NhZ2VzICovCisgICAgICAgIHRhc2tfcC5uYW1lID0gImNvcmVfd29ya2VyIjsKKyAgICAgICAgdGFza19wLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9XT1JLRVI7CisKKyAgICAgICAgcmV0ID0gYmNtb3NfdGFza19jcmVhdGUoJmNvcmVfd29ya2VyX3RocmVhZCwgJnRhc2tfcCk7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2NvcmUsICJDb3VsZG4ndCBjcmVhdGUgd29ya2VyIHRocmVhZFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYWxpemUgdGhlIHdvcmtlciB0aHJlYWQgdGhhdCB3YXMganVzdCBzcGF3bmVkCisgICAgICAgICAqLworICAgICAgICBjb3JlX3dvcmtlcl90aHJlYWRfaW5pdCgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIE5vdyBjcmVhdGUgdGhlIG1vZHVsZSBmb3IgdGhlIHdvcmtlciB0aHJlYWQKKyAgICAgICAgICovCisgICAgICAgIG1vZHVsZV9wLnFwYXJtLm5hbWUgPSAiY29yZV93b3JrZXJfbWdtdF9tb2R1bGUiOworICAgICAgICBtb2R1bGVfcC5pbml0ID0gX2JhbF93b3JrZXJfbWdtdF9tb2R1bGVfaW5pdDsKKyAgICAgICAgcmV0ID0gYmNtb3NfbW9kdWxlX2NyZWF0ZShCQ01PU19NT0RVTEVfSURfV09SS0VSX01HTVQsICZjb3JlX3dvcmtlcl90aHJlYWQsICZtb2R1bGVfcCk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9jb3JlLCAiQ291bGRuJ3QgY3JlYXRlIG1nbXQgd29ya2VyIG1vZHVsZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisjaWZkZWYgQ09ORklHX1NXSVRDSF9SUEMKKyAgICAgICAgcmV0ID0gc3dfdXRpbF9wa3Rfc2VuZF9pbml0KGJhbF9jb25maWdfcGFyYW1zLnN3X3JwY19pcCwgYmFsX2NvbmZpZ19wYXJhbXMucGt0X3NlbmRfc3ZyX2xpc3Rlbl9wb3J0KTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfY29yZSwgIkNvdWxkbid0IGluaXRpYWxpemUgdGhlIHBhY2tldCBzZW5kIGludGVyZmFjZSByZXQgPSAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2NvcmUsCisgICAgICAgICAgICAgICAgIlwiUGFja2V0IHNlbmRcIiBpbnRlcmZhY2UgaXMgaW5pdGlhbGl6ZWQiCisgICAgICAgICAgICAgICAgIiB0byB1c2Ugc2VydmVyIGF0ICVzOiVkXG4iLAorICAgICAgICAgICAgICAgIGJhbF9jb25maWdfcGFyYW1zLnN3X3JwY19pcCwgYmFsX2NvbmZpZ19wYXJhbXMucGt0X3NlbmRfc3ZyX2xpc3Rlbl9wb3J0ICk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICB3aGlsZSgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBCQUwgY29yZSBmaW5pc2ggZnVuY3Rpb24KKyAqCisgKiAgQSBmdW5jdGlvbiB0byBjbGVhbiB1cCB0aGUgQkFMIGNvcmUgYW5kIGFsbCBpdHMgYXNzb2NpYXRlZCB0aHJlYWRzIG9uCisgKiAgZXhpdC4KKyAqCisgKiBAcmV0dXJucyBCQ01fRVJSX09LCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYmFsX2NvcmVfZmluaXNoKHZvaWQpCit7CisgICAgcnNjX21ncl91bmluaXQoKTsKKyAgICBtYWNfdXRpbF9maW5pc2goKTsKKyAgICBzd191dGlsX2ZpbmlzaCgpOworCisgICAgY29yZV93b3JrZXJfdGhyZWFkX2ZpbmlzaCgpOworCisgICAgYmNtb3NfbW9kdWxlX2Rlc3Ryb3koQkNNT1NfTU9EVUxFX0lEX1dPUktFUl9NR01UKTsKKworICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmY29yZV93b3JrZXJfdGhyZWFkKTsKKworICAgIC8qIExldCBsb2dnZXIgdGFzayBoYXZlIGVub3VnaCB0aW1lIHRvIGRyYWluIGl0cyBtZXNzYWdlIHF1ZXVlLiAqLworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBiY21vc191c2xlZXAoMTAwMDAwMCk7CisgICAgYmNtX2Rldl9sb2dfZGVzdHJveSgpOworI2VuZGlmCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byBwcmludCB0aGUgd2VsY29tZSBiYW5uZXIgZm9yIEJBTAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYXQgc3lzdGVtIHN0YXJ0dXAgdGltZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdlbGNvbWVfdG9fYmFsKHZvaWQpCit7CisgICAgdGltZV90IHRtID0gdGltZShOVUxMKTsKKworICAgIC8qIEB0b2RvIERvbid0IHByaW50IHRoZSB3ZWxjb21lIGJhbm5lciB3aGVuIHJ1bm5pbmcgYXMgYSBkYWVtb24gKi8KKworICAgIHByaW50ZigiJXMiLCBnX3BfY29tcGFueV9sb2dvKTsKKworICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX2NvcmUsICIqKiogV2VsY29tZSB0byBCQUwgJXMgdmVyc2lvbiAlcyAoQnVpbHQ6ICVzKVxuIiwKKyNpZm5kZWYgQlVJTERfT0ZfQUdFTlQKKyAgICAgICAgICAgIiIsCisjZWxzZQorICAgICAgICAgICAiT0YtQWdlbnQiLAorI2VuZGlmCisgICAgICAgIEJBTF9WRVJTSU9OLCBCQUxfQlVJTERfREFURSk7CisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfY29yZSwgIiVzXG4iLCBCQUxfQlVJTERfSU5GTyk7CisKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9jb3JlLCAiVGltZSBpczogJXMiLCBhc2N0aW1lKGxvY2FsdGltZSgmdG0pKSk7CisKKyNpZmRlZiBURVNUX1NXX1VUSUxfTE9PUEJBQ0sKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9jb3JlLCAiLS0tLUJVSUxUIFdJVEggVEVTVF9TV19VVElMX0xPT1BCQUNLXG4iKTsKKyNlbmRpZgorCisgICAgaWYgKEJDTU9TX1RSVUUgPT0gYmNtYmFsX2lzX21hY19pbl9sb29wYmFjaygpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfY29yZSwgIi0tLS1DT05GSUdVUkVEIFdJVEggTUFDIFVUSUwgTE9PUEJBQ0tcbiIpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSB0cmltIGhlbHBlciBmdW5jdGlvbgorICoKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHJpZCBvZiB0cmFpbGluZyBhbmQgbGVhZGluZyB3aGl0ZXNwYWNlCisgKiAgaW5jbHVkaW5nIHRoZSAiXG4iIGZyb20gZmdldHMoKQorICoKKyAqIEBwYXJhbSBzICAgQSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdGhhdCBpcyB0byBiZSB0cmltbWVkCisgKgorICogQHJldHVybnMgLWNoYXIgKiwgdGhlIHRyaW1tZWQgc3RpbmcKKyAqCisgKi8KK3N0YXRpYyBjaGFyICp0cmltIChjaGFyICogcykKK3sKKyAgICAvKiBJbml0aWFsaXplIHN0YXJ0LCBlbmQgcG9pbnRlcnMgKi8KKyAgICBpbnQgbGVuID0gc3RybGVuKHMpOworICAgIGNoYXIgKnMxID0gcywgKnMyID0gJnNbbGVuIC0gMV07CisKKyAgICAvKiBUcmltIGFuZCBkZWxpbWl0IHJpZ2h0IHNpZGUgKi8KKyAgICB3aGlsZSAoIChpc3NwYWNlICgqczIpKSAmJiAoczIgPj0gczEpICkKKyAgICB7CisgICAgICAgIHMyLS07CisgICAgICAgIGxlbi0tOworICAgIH0KKworICAgICooczIrMSkgPSAnXDAnOworCisgICAgLyogVHJpbSBsZWZ0IHNpZGUgKi8KKyAgICB3aGlsZSAoIChpc3NwYWNlICgqczEpKSAmJiAoczEgPCBzMikgKQorICAgIHsKKyAgICAgICAgczErKzsKKyAgICAgICAgbGVuLS07CisgICAgfQorCisgICAgLyogQ29weSBmaW5pc2hlZCBzdHJpbmcuIFVzZSBtZW1tb3ZlLCBhcyBpdCBpcyBndWFyYW50ZWVkIHRvIGNvcnJlY3RseSBoYW5kbGUgb3ZlcmxhcHBpbmcgc3RyaW5ncy4gKi8KKyAgICBtZW1tb3ZlIChzLCBzMSwgbGVuICsgMSk7CisgICAgcmV0dXJuIHM7Cit9CisKKy8qIEEgaGVscGVyIGZ1bmN0aW9uIGZvciBmaW5kaW5nIGFuIGVudW0gYXJyYXkgZW50cnkgdmFsdWUsIGdpdmVuIGl0J3MgbmFtZSovCitzdGF0aWMgbG9uZyBmaW5kX3ZhbF9ieV9lbnVtX25hbWUoYmNtY2xpX2VudW1fdmFsICpwX2VudW1fYXJyYXksIGNvbnN0IGNoYXIgKiBuYW1lKQoreworICAgIGxvbmcgdmFsID0gLTE7CisgICAgIGludCBpaTsKKworCisgICAgZm9yKGlpPTA7IHBfZW51bV9hcnJheVtpaV0ubmFtZSAhPSBOVUxMOyBpaSsrKQorICAgIHsKKyAgICAgICAgaWYoMCA9PSBzdHJjbXAobmFtZSwgcF9lbnVtX2FycmF5W2lpXS5uYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsID0gcF9lbnVtX2FycmF5W2lpXS52YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRoYXQgcmVhZHMgYmFsIGNvbmZpZyBmaWxlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgdGhlIGJhbCBjb25maWcgZmlsZSBpbnRvIHRoZQorICogYmNtYmFsX2NvbmZpZ19wYXJhbXMgc3RydWN0dXJlLgorICoKKyAqIFRoZSBjb25maWcgZmlsZSBpcyBkZWZpbmVkIHRvIGJlIG5hbWVkICJiYWxfY29uZmlnLmluaSIgYW5kIGlzCisgKiBvZiB0aGUgZm9ybWF0OgorICogcGFyYW1fbmFtZT1wYXJhbV92YWx1ZQorICoKKyAqIEBwYXJhbSBwX3BhcmFtcyBBIHBvaW50ZXIgdG8gdGhlIGNvcmUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKgorICogQHJldHVybnMgdm9pZAorICoKKyAqLworc3RhdGljIHZvaWQgYmFsX3BhcnNlX2NvbmZpZyhiY21iYWxfY29uZmlnX3BhcmFtcyAqcF9wYXJhbXMpCit7CisgICAgY2hhciAqcywgYnVmZltNQVhfQ09ORklHX0ZJTEVfTElORV9MRU5dOworICAgIGNoYXIgbmFtZVtNQVhfQ09ORklHX1BBUkFNX05BTUVfTEVOXSwgdmFsdWVbTUFYX0NPTkZJR19QQVJBTV9WQUxVRV9MRU5dOworICAgIEZJTEUgKmZwID0gZm9wZW4gKENPTkZJR19GSUxFX05BTUUsICJyIik7CisKKyAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiTm8gY29uZmlnIGZpbGUgKCVzKSBmb3VuZFxuIiwgQ09ORklHX0ZJTEVfTkFNRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcmludGYoIkJBTCBjb25maWd1cmF0aW9uIHBhcmFtcyBhcyByZWFkIGZyb20gJXM6XG4iLCBDT05GSUdfRklMRV9OQU1FKTsKKworICAgIC8qIFJlYWQgbmV4dCBsaW5lICovCisgICAgd2hpbGUgKChzID0gZmdldHMgKGJ1ZmYsIHNpemVvZiBidWZmLCBmcCkpICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBTa2lwIGJsYW5rIGxpbmVzIGFuZCBjb21tZW50cyAqLworICAgICAgICBpZiAoYnVmZlswXSA9PSAnXG4nIHx8IGJ1ZmZbMF0gPT0gJyMnKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogUGFyc2UgbmFtZS92YWx1ZSBwYWlyIGZyb20gbGluZSAqLworICAgICAgICBzID0gc3RydG9rIChidWZmLCAiPSIpOworICAgICAgICBpZiAocz09TlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdHJuY3B5IChuYW1lLCBzLCBNQVhfQ09ORklHX1BBUkFNX05BTUVfTEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIHMgPSBzdHJ0b2sgKE5VTEwsICI9Iik7CisKKyAgICAgICAgaWYgKHM9PU5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RybmNweSAodmFsdWUsIHMsIE1BWF9DT05GSUdfUEFSQU1fVkFMVUVfTEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyaW0gKHZhbHVlKTsKKworICAgICAgICBwcmludGYoIiVzPSVzXG4iLCBuYW1lLCB2YWx1ZSk7CisKKyAgICAgICAgLyogQ29weSBpbnRvIGNvcnJlY3QgZW50cnkgaW4gcGFyYW1ldGVycyBzdHJ1Y3QgKi8KKyAgICAgICAgaWYoc3RyY21wKG5hbWUsICJpd2ZfbW9kZSIpPT0wKQorICAgICAgICB7CisgICAgICAgICAgICBwX3BhcmFtcy0+aXdmX21vZGUgPSBmaW5kX3ZhbF9ieV9lbnVtX25hbWUoaXdmX21vZGVfZW51bSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoc3RyY21wKG5hbWUsICJpbnRmX21hcHRhYmxlIik9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGludGZfbWFwX3RibF9pZHg7CisKKyAgICAgICAgICAgIGludGZfbWFwX3RibF9pZHggPSBhdG9pKHZhbHVlKTsKKworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSBiYWxfYmNtX2ludGZfbWFwdGFibGVfc2V0KGludGZfbWFwX3RibF9pZHgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3I6IHZhbHVlICgldSkgaXMgbm90IGEgdmFsaWQgaW5kZXgsIGlnbm9yZWQiLCBpbnRmX21hcF90YmxfaWR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX3BhcmFtcy0+aW50Zl9tYXB0YWJsZSA9IGF0b2kodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoc3RyY21wKG5hbWUsICJ0cmFwX3VkcF9wb3J0Iik9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVkcF9wb3J0OworCisgICAgICAgICAgICB1ZHBfcG9ydCA9IGF0b2kodmFsdWUpOworCisgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IGJhbF9iY21fdHJhcF9yY3ZfcG9ydF9zZXQodWRwX3BvcnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3I6IHZhbHVlICgldSkgaXMgbm90IGEgdmFsaWQgcG9ydCwgaWdub3JlZCIsIHVkcF9wb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX3BhcmFtcy0+dHJhcF91ZHBfcG9ydCA9IHVkcF9wb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoc3RyY21wKG5hbWUsICJkc19zY2hlZF9tb2RlIik9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHNjaGVkX21vZGU7CisKKyAgICAgICAgICAgIHNjaGVkX21vZGUgPSBhdG9pKHZhbHVlKTsKKworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSBiYWxfYmNtX2RzX3NjaGVkX21vZGVfc2V0KHNjaGVkX21vZGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3I6IHZhbHVlICgldSkgaXMgbm90IGEgdmFsaWQgc2NoZWQgbW9kZSwgaWdub3JlZCIsIHNjaGVkX21vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfcGFyYW1zLT5kc19zY2hlZF9tb2RlID0gc2NoZWRfbW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHN0cmNtcChuYW1lLCAibnVtX25uaV9wb3J0cyIpPT0wKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHBfcGFyYW1zLT5udW1fbm5pX3BvcnRzID0gYXRvaSh2YWx1ZSk7CisgICAgICAgICAgICBiY21fdG9wb19kZXZfc2V0X21heF9ubmkoMCwgcF9wYXJhbXMtPm51bV9ubmlfcG9ydHMpOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihzdHJjbXAobmFtZSwgInBrdF9zZW5kX3N2cl9saXN0ZW5fcG9ydCIpPT0wKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHBfcGFyYW1zLT5wa3Rfc2VuZF9zdnJfbGlzdGVuX3BvcnQgPSBhdG9pKHZhbHVlKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoc3RyY21wKG5hbWUsICJ0b3BvbG9neS5udW1fb2ZfZGV2cyIpPT0wKQorICAgICAgICB7CisgICAgICAgICAgICBwX3BhcmFtcy0+dG9wb19wYXJhbXMubnVtX29mX2RldnMgPSBhdG9pKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHN0cmNtcChuYW1lLCAidG9wb2xvZ3kubnVtX29mX3BvbnNfcGVyX2RldiIpPT0wKQorICAgICAgICB7CisgICAgICAgICAgICBwX3BhcmFtcy0+dG9wb19wYXJhbXMubnVtX29mX3BvbnNfcGVyX2RldiA9IGF0b2kodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoc3RyY21wKG5hbWUsICJ0b3BvbG9neS5wb25fbW9kZSIpPT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZihzdHJjbXAodmFsdWUsICJncG9uIik9PTApCisgICAgICAgICAgICAgICAgcF9wYXJhbXMtPnRvcG9fcGFyYW1zLnBvbl9tb2RlID0gQkNNX1RPUE9fUE9OX01PREVfR1BPTjsKKyAgICAgICAgICAgIGVsc2UgaWYoc3RyY21wKHZhbHVlLCAieGdwb24iKT09MCkKKyAgICAgICAgICAgICAgICBwX3BhcmFtcy0+dG9wb19wYXJhbXMucG9uX21vZGUgPSBCQ01fVE9QT19QT05fTU9ERV9YR1BPTjsKKyAgICAgICAgICAgIGVsc2UgaWYoc3RyY21wKHZhbHVlLCAieGdzIik9PTApCisgICAgICAgICAgICAgICAgcF9wYXJhbXMtPnRvcG9fcGFyYW1zLnBvbl9tb2RlID0gQkNNX1RPUE9fUE9OX01PREVfWEdTOworICAgICAgICAgICAgZWxzZSBpZihzdHJjbXAodmFsdWUsICJlcG9uX3RkbWEiKT09MCkKKyAgICAgICAgICAgICAgICBwX3BhcmFtcy0+dG9wb19wYXJhbXMucG9uX21vZGUgPSBCQ01fVE9QT19QT05fTU9ERV9FUE9OX1RETUE7CisgICAgICAgICAgICBlbHNlIGlmKHN0cmNtcCh2YWx1ZSwgImVwb25fMWciKT09MCkKKyAgICAgICAgICAgICAgICBwX3BhcmFtcy0+dG9wb19wYXJhbXMucG9uX21vZGUgPSBCQ01fVE9QT19QT05fTU9ERV9FUE9OXzFHOworICAgICAgICAgICAgZWxzZSBpZihzdHJjbXAodmFsdWUsICJlcG9uXzEwZyIpPT0wKQorICAgICAgICAgICAgICAgIHBfcGFyYW1zLT50b3BvX3BhcmFtcy5wb25fbW9kZSA9IEJDTV9UT1BPX1BPTl9NT0RFX0VQT05fMTBHOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoc3RyY21wKG5hbWUsICJtYWNfbG9vcGJhY2siKT09MCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc3RyY21wKHZhbHVlLCAieSIpPT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfcGFyYW1zLT5sb29wYmFja19tb2Rlc19iaXRfbWFzayB8PSBCSVRfRklFTERfTUFDX0lOX0xPT1BCQUNLOworICAgICAgICAgICAgfQorICAgICAgICB9CisjaWZkZWYgT01DSV9TVkMKKyAgICAgICAgZWxzZSBpZihzdHJjbXAobmFtZSwgIm9tY2lfbG9vcGJhY2siKT09MCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoc3RyY21wKHZhbHVlLCAieSIpPT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9tY2lfc3ZjX3NldF9sb29wYmFjayhCQ01PU19UUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGVsc2UgaWYoc3RybmNtcChuYW1lLCAiYXV0b25lZ19ubmkiLCAxMSk9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpbnRmX2lkID0gYXRvaShuYW1lKzExKTsKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpaW50Zl9pZCA+PSBCQUxfQVBJX01BWF9JTlRGX0lEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3I6ICVzOiBOTkkgJWQgaXMgaW52YWxpZCwgaWdub3JlZCIsIG5hbWUsIGludGZfaWQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoc3RyY21wKHZhbHVlLCAieSIpPT0wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfcGFyYW1zLT5ubmlfYXV0b25lZ19iaXRfbWFzayB8PSAoMSA8PCBpbnRmX2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCIlcy8lczogVW5rbm93biBuYW1lL3ZhbHVlIGNvbmZpZyBmaWxlIHBhaXIhXG4iLG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0vL3doaWxlCisKKyAgICBwcmludGYoIlxuIik7CisKKyAgICAvKiBDbG9zZSBmaWxlICovCisgICAgZmNsb3NlIChmcCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiYWxfcnBjX3NvY19nZW4odm9pZCkKK3sKKyNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLCisjaWZkZWYgQ09ORklHX1NXSVRDSF9SUEMKKyAgICBjaGFyIGNtZFtNQVhfQ01EX0xJTkVfTEVOXTsKKyAgICBGSUxFICpmcCA9IGZvcGVuIChSUENfU09DX1RFTVBMQVRFX0ZJTEVfTkFNRSwgInIiKTsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiJXMgbm90IGZvdW5kXG4iLCBSUENfU09DX1RFTVBMQVRFX0ZJTEVfTkFNRSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKyAgICBmY2xvc2UgKGZwKTsKKworICAgIHNucHJpbnRmKGNtZCwgTUFYX0NNRF9MSU5FX0xFTiwgInNlZCAtZSBcInMvXFxcXFxcJERJUFxcXFwkLyVzL1wiICVzID4gJXMiLAorICAgICAgICBiYWxfY29uZmlnX3BhcmFtcy5zd19ycGNfaXAsIFJQQ19TT0NfVEVNUExBVEVfRklMRV9OQU1FLCBSUENfU09DX0ZJTEVfTkFNRSk7CisgICAgcmMgPSBzeXN0ZW0oY21kKTsKKyAgICBpZiAocmMgfHwgV0VYSVRTVEFUVVMocmMpKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gZ2VuZXJhdGUgJXMgZnJvbSAlc1xuIiwgUlBDX1NPQ19GSUxFX05BTUUsIFJQQ19TT0NfVEVNUExBVEVfRklMRV9OQU1FKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCit1aW50MTZfdCBiY21iYWxfbnVtX25uaV9wb3J0c19nZXQodm9pZCkKK3sKKyAgICByZXR1cm4gYmFsX2NvbmZpZ19wYXJhbXMubnVtX25uaV9wb3J0czsKK30KKworYmNtb3NfYm9vbCBiY21iYWxfaXNfbWFjX2luX2xvb3BiYWNrKHZvaWQpCit7CisgICAgcmV0dXJuIElTX01BQ19JTl9MT09QQkFDSyhiYWxfY29uZmlnX3BhcmFtcy5sb29wYmFja19tb2Rlc19iaXRfbWFzayk7Cit9CisKK2JjbW9zX2Jvb2wgYmNtYmFsX2lzX25uaV9hdXRvbmVnX29uKGJjbWJhbF9pbnRmX2lkIGludGZfaWQpCit7CisgICAgcmV0dXJuIElTX05OSV9JTlRGX0FVVE9ORUdfT04oYmFsX2NvbmZpZ19wYXJhbXMubm5pX2F1dG9uZWdfYml0X21hc2ssIGludGZfaWQpOworfQorCisvKiBHZXQgc3VwcG9ydGVkIGNvbW1hbmQgbGluZSBhcmd1bWVudCBsaXN0ICovCitpbnQgYmNtYmFsX3N1cHBvcnRlZF9hcmdzX2dldChjbF9hcmd1bWVudCBzdXBwb3J0ZWRfYXJnc1tdLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGk9MDsgaTxCQ01fU0laRU9GQVJSQVkoc3VwcG9ydGVkX2NsX2FyZ3MpOyBpKyspCisgICAgeworICAgICAgICBpZiAoaSA8IHNpemUpCisgICAgICAgICAgICBzdXBwb3J0ZWRfYXJnc1tpXSA9IHN1cHBvcnRlZF9jbF9hcmdzW2ldOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworLyogR2V0IEJBTCBjb25maWd1cmF0aW9uICovCitjb25zdCBiY21iYWxfY29uZmlnX3BhcmFtcyAqYmNtYmFsX2NvbmZpZ19nZXQodm9pZCkKK3sKKyAgICByZXR1cm4gJmJhbF9jb25maWdfcGFyYW1zOworfQorCisvKkB9Ki8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vYmFsX2NvcmUuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vYmFsX2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDEwYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9iYWxfY29yZS5oCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICoKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogQGZpbGUgYmFsX2NvcmUuaAorICogQGJyaWVmIFRoZSBpbmNsdWRlIGZpbGVzIGNvbW1vbiB0byBhbGwgY29yZSBmaWxlcworICoKKyAqIEBhZGR0b2dyb3VwIGN0cmxyCisgKi8KKworCisjaWZuZGVmCUNPUkVNQUlOX0gKKyNkZWZpbmUJQ09SRU1BSU5fSAorCisvKkB7Ki8KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiYWxfb2Jqcy5oPgorI2lmZGVmIEVOQUJMRV9MT0cKKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8YmNtX3RvcG8uaD4KKyNpbmNsdWRlIDxjbWRsaW5lLmg+CisKK2V4dGVybiBkZXZfbG9nX2lkIGxvZ19pZF9jb3JlOworCisKKyNkZWZpbmUgQklUX0ZJRUxEX01BQ19JTl9MT09QQkFDSyAgICAgICAweDAxCisjZGVmaW5lIEJJVF9GSUVMRF9TV0lUQ0hfSU5fTE9PUEJBQ0sgICAgMHgwMgorI2RlZmluZSBJU19NQUNfSU5fTE9PUEJBQ0soY29uZmlnKSAgICAgICgoY29uZmlnKSAmIEJJVF9GSUVMRF9NQUNfSU5fTE9PUEJBQ0spCisjZGVmaW5lIElTX05OSV9JTlRGX0FVVE9ORUdfT04oY29uZmlnLCBpbnRmKSAgICAgIChjb25maWcgJiAoMSA8PCBpbnRmKSkKKwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2NvbmZpZ19wYXJhbXMKK3sKKyAgICBiY21iYWxfaXdmX21vZGUgaXdmX21vZGU7CisgICAgdWludDMyX3QgICAgICAgIGludGZfbWFwdGFibGU7CisgICAgdWludDMyX3QgICAgICAgIHRyYXBfdWRwX3BvcnQ7CisgICAgdWludDE2X3QgICAgICAgIG51bV9ubmlfcG9ydHM7CisgICAgdWludDMyX3QgICAgICAgIGRzX3NjaGVkX21vZGU7CisgICAgdWludDMyX3QgICAgICAgIHBrdF9zZW5kX3N2cl9saXN0ZW5fcG9ydDsgIC8qIFRoZSBwb3J0IG51bWJlciB3aGVyZSB0aGUgYmNtLnVzZXIgcHJvY2VzcyBsaXN0ZW5zIGZvciBwYWNrZXQgc2VuZCBtZXNzYWdlcyBmcm9tIHRoZSBjb3JlICovCisgICAgdWludDhfdCAgICAgICAgIGxvb3BiYWNrX21vZGVzX2JpdF9tYXNrOyAgIC8qIG1hYyB8IHN3aXRjaCB8IHNvbWV0aGluZyBlbHNlICBpbiBsb29wYmFjayBtb2RlICovCisgICAgYmNtX3RvcG9fcGFyYW1zIHRvcG9fcGFyYW1zOworICAgIHVpbnQzMl90ICAgICAgICBubmlfYXV0b25lZ19iaXRfbWFzazsgICAgICAvKiBOTkkgYXV0b25lZyBpcyBPTiAqLworCisgICAgLyoKKyAgICAgKiBJUDpQb3J0IHN0cmluZ3Mgc3BlY2lmeWluZyBJUDpQb3J0IGFzc2lnbm1lbnRzIG9mIHRoZSBxdWV1ZXMKKyAgICAgKiByZXF1aXJlZCBmb3IgSVBDIGJldHdlZW4gQkFMIGNvbXBvbmVudHMKKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpjb3JlX21nbXRfaXBfcG9ydDsKKyAgICBjb25zdCBjaGFyICpiYWxhcGlfbWdtdF9pcF9wb3J0OworICAgIGNvbnN0IGNoYXIgKm1hY19ycGNfaXBfcG9ydDsKKyAgICBjb25zdCBjaGFyICpzd19ycGNfaXA7CisKKyAgICAvKiBDTEkgc2Vzc2lvbiBjb25maWd1cmF0aW9uICovCisgICAgYmNtY2xpX2FjY2Vzc19yaWdodCBhY2Nlc3M7CisgICAgYmNtY2xpX2xpbmVfZWRpdF9tb2RlIGVkaXRfbW9kZTsKKyAgICBjb25zdCBjaGFyICppbml0X3NjcmlwdDsKKworICAgIC8qIExvZ2dlciBwYXJhbWV0ZXJzICovCisgICAgYmNtb3NfYm9vbCBkaXNhYmxlX2xvZzsKKyAgICBjb25zdCBjaGFyICpsb2dfZmlsZV9uYW1lOworICAgIGJjbW9zX2Jvb2wgbG9nX3N5c2xvZzsKK30gYmNtYmFsX2NvbmZpZ19wYXJhbXM7CisKK2V4dGVybiBiY21vc19lcnJubyBiY21iYWxfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGJjbWJhbF9maW5pc2godm9pZCk7CitleHRlcm4gaW50IGJjbWJhbF9zdXBwb3J0ZWRfYXJnc19nZXQoY2xfYXJndW1lbnQgc3VwcG9ydGVkX2FyZ3NbXSwgaW50IHNpemUpOworZXh0ZXJuIGJjbW9zX2Vycm5vIGJjbWJhbF9jbWRsaW5lX3BhcnNlKGludCBhcmdjLCBjaGFyICphcmd2W10pOworZXh0ZXJuIGJjbW9zX2Vycm5vIGJjbWJhbF9sb2dfaW5pdCh2b2lkKTsKK2V4dGVybiBjb25zdCBiY21iYWxfY29uZmlnX3BhcmFtcyAqYmNtYmFsX2NvbmZpZ19nZXQodm9pZCk7CisKK3R5cGVkZWYgdm9pZCAoKiBiY21iYWxfZXhpdF9jYikodm9pZCk7CisKKy8qIFRvcC1sZXZlbCBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZQorICogLSBwYXJzZSBjb21tZW5kIGxpbmUKKyAqIC0gaW5pdGlhbGl6ZSBPUyBhYnN0cmFjdGlvbgorICogLSBpbml0aWFsaXplIGxvZ2dlcgorICogLSBpbml0aWFsaXplIEJBTCBjb3JlIGFuZCB1dGlscworICogLSBpbml0aWFsaXplIEJBTCBDTEkKKyAqLworZXh0ZXJuIGJjbW9zX2Vycm5vIGJjbWJhbF9pbml0X2FsbChpbnQgYXJnYywgY2hhciAqYXJndltdLCBiY21iYWxfZXhpdF9jYiBleGl0X2NiKTsKKworZXh0ZXJuIGJjbW9zX2Jvb2wgYmNtYmFsX2lzX21hY19pbl9sb29wYmFjayh2b2lkKTsKKworZXh0ZXJuIGJjbW9zX2Jvb2wgYmNtYmFsX2lzX25uaV9hdXRvbmVnX29uKGJjbWJhbF9pbnRmX2lkIGludGZfaWQpOworCisvKkB9Ki8KKworI2VuZGlmIC8qQ09SRU1BSU5fSCovCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vYmFsX3dvcmtlci5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9iYWxfd29ya2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmNTBiZQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vYmFsX3dvcmtlci5jCkBAIC0wLDAgKzEsNzkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfd29ya2VyLmMKKyAqIEBicmllZiBJbml0aWFsaXphdGlvbiBhbmQgbWVzc2FnZSBoYW5kbGVyIGZ1bmN0aW9ucyBmb3IgdGhlIEJBTCBDb3JlCisgKiAgICAgICAgd29ya2VyIHRocmVhZCBpbmNsdWRpbmcgYWxsIGNvcmUgRlNNIGluaXRpYWxpemF0aW9uLgorICoKKyAqIEBhZGR0b2dyb3VwIGN0cmxyCisgKi8KKworLypAeyovCisKKy8qIFByb2plY3QgaW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiYWxfYXBpLmg+CisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgPGJhbF9vc21zZy5oPgorI2luY2x1ZGUgImJhbF93b3JrZXIuaCIKKyNpbmNsdWRlICJhY2NfdGVybV9mc20uaCIKKyNpbmNsdWRlICJmbG93X2ZzbS5oIgorI2luY2x1ZGUgImdyb3VwX2ZzbS5oIgorI2luY2x1ZGUgInN1Yl90ZXJtX2ZzbS5oIgorI2luY2x1ZGUgInRtX3NjaGVkX2ZzbS5oIgorI2luY2x1ZGUgInRtX3F1ZXVlX2ZzbS5oIgorI2luY2x1ZGUgImZzbV9jb21tb24uaCIKKyNpbmNsdWRlICJiYWxfYXBpX3dvcmtlci5oIgorI2luY2x1ZGUgImJhbF9vYmpfbXNnX3BhY2tfdW5wYWNrLmgiCisKKyNpbmNsdWRlICJiYWxfZHBwX2FjY190ZXJtLmgiCisjaW5jbHVkZSAicnNjX21nci5oIgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpZmRlZiBFTkFCTEVfTE9HCisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKy8qCisgKiBAYnJpZWYgVGhlIGxvZ2dpbmcgZGV2aWNlIGlkIGZvciB0aGUgY29yZQorICovCitleHRlcm4gZGV2X2xvZ19pZCBsb2dfaWRfY29yZTsKKyNlbmRpZgorCisvKiBMb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGNvcmVfbWdtdF9tc2dfaGFuZGxlcihiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm1zZyk7CitzdGF0aWMgYmNtb3NfZXJybm8gcHJvY2Vzc19tZ210X21zZyh2b2lkICptc2dfcGF5bG9hZCk7CitzdGF0aWMgYmNtb3NfZXJybm8gcHJvY2Vzc191dGlsX21zZyh2b2lkICptc2dfcGF5bG9hZCk7CisKK3N0YXRpYyBpbnQgX2JhbF9tZ210X3J4X2hhbmRsZXIobG9uZyBkYXRhKTsKKworc3RhdGljIGJjbW9zX2Vycm5vIHByb2Nlc3NfcGFja2V0X29iamVjdCh2b2lkICptc2dfcGF5bG9hZCk7CisKKy8qCisgKiBAYnJpZWYgVGhlIEJBTCBjb3JlIG1hbmFnZW1lbnQgcXVldWUuICBUaGVzZSBhcmUgdGhlIHF1ZXVlcyB0aHJvdWdoIHdoaWNoIHRoZSBjb3JlIAorICogY29udmVyc2VzIHdpdGggdGhlIFB1YmxpYyBBUEkuIFRoZSByZW1vdGUgZW5kcG9pbnQgb2YgdGhlc2UgcXVldWVzIGFyZSB0aGUgCisgKiBCQUwgQVBJIGJhY2tlbmQuCisgKi8KK3N0YXRpYyBiY21vc19tc2dfcXVldWUgY29yZV9tZ210X3F1ZXVlOworc3RhdGljIGJjbW9zX21zZ19xdWV1ZSBjb3JlX2FwaV9xdWV1ZTsKK3N0YXRpYyBiY21vc19tc2dfcXVldWUgY29yZV9hcGlfaW5kX3F1ZXVlOworYmNtb3NfbXNnX3F1ZXVlICpwX2JhbF9jb3JlX3F1ZXVlOworYmNtb3NfbXNnX3F1ZXVlICpwX2JhbF9jb3JlX3RvX2FwaV9xdWV1ZTsKK2JjbW9zX21zZ19xdWV1ZSAqcF9iYWxfY29yZV90b19hcGlfaW5kX3F1ZXVlOworCisvKgorICogQGJyaWVmIFRoZSByeCB0aHJlYWQgZm9yIG1hbmFnZW1lbnQgbWVzc2FnZSByZWNlcHRpb24KKyAqLworc3RhdGljIGJjbW9zX3Rhc2sgcnhfbWdtdF90aHJlYWQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEluaXRpYWxpemUgdGhlIHdvcmtlciB0aHJlYWQKKyAqCisgKiBBIFdvcmtlciBtb2R1bGUgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyBhbGwgb2YgdGhlIGRhdGEgc3RydWN0dXJlcyBhbmQKKyAqIEZTTXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBCQUwgY29yZS4gIFRoaXMgZnVuY3Rpb24gY2FsbGVkIGZyb20gYmFsX2NvcmVfaW5pdAorICogZHVyaW5nIEJBTCBjb3JlIHN0YXJ0dXAuIAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29yZV93b3JrZXJfdGhyZWFkX2luaXQodm9pZCkKK3sKKyAgICAvKiAKKyAgICAgKiBJbml0aWFsaXplIGFsbCBvZiB0aGUgd29ya2VyIHRocmVhZCBob3N0ZWQgRlNNcyBhbmQgdGhlIHJlc291cmNlIG1hbmFnZXIKKyAgICAgKi8KKyAgICAgCisgICAgcnNjX21ncl9pbml0KCk7CisKKyAgICB0bV9xdWV1ZV9mc21faW5pdCgpOworCQkKKyAgICB0bV9zY2hlZF9mc21faW5pdCgpOworCisgICAgYWNjZXNzX3Rlcm1pbmFsX2ZzbV9pbml0KCk7CisKKyAgICBmbG93X2ZzbV9pbml0KCk7CisKKyAgICBzdWJfdGVybV9mc21faW5pdCgpOworICAgIAorICAgIGdyb3VwX2ZzbV9pbml0KCk7CisKKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgRmluaXNoIHRoZSB3b3JrZXIgdGhyZWFkCisgKgorICogQSBXb3JrZXIgbW9kdWxlIGZ1bmN0aW9uIHRoYXQgdW4taW5pdGlhbGl6ZXMgYWxsIG9mIHRoZSBkYXRhIHN0cnVjdHVyZXMgYW5kCisgKiBGU01zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQkFMIGNvcmUuICBUaGlzIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGJhbF9jb3JlX2luaXQKKyAqIGR1cmluZyBCQUwgY29yZSBjbGVhbnVwIG9uIGV4aXQuIAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29yZV93b3JrZXJfdGhyZWFkX2ZpbmlzaCh2b2lkKQoreworICAgIC8qCisgICAgICogVW4taW5pdGlhbGl6ZSB0aGUgd29ya2VyIHRocmVhZCBvd25lZCBkYXRhIHN0cnVjdHVyZXMuIGV0Yy4KKyAgICAgKi8KKyAgICBiY21vc19tc2dfdW5yZWdpc3RlcihCQ01CQUxfTUdNVF9NU0csIDAsIEJDTU9TX01PRFVMRV9JRF9XT1JLRVJfTUdNVCk7CisKKyAgICBiY21vc19tc2dfdW5yZWdpc3RlcihCQ01CQUxfTUFDX1VUSUxfTVNHLCAwLCBCQ01PU19NT0RVTEVfSURfV09SS0VSX01HTVQpOworCisgICAgYmNtb3NfdGFza19kZXN0cm95KCZyeF9tZ210X3RocmVhZCk7CisKKyAgICBzdWJfdGVybV9mc21fZmluaXNoKCk7CisKKyAgICBmbG93X2ZzbV9maW5pc2goKTsKKworICAgIGdyb3VwX2ZzbV9maW5pc2goKTsKKworICAgIHRtX3NjaGVkX2ZzbV9maW5pc2goKTsKKworICAgIHRtX3F1ZXVlX2ZzbV9maW5pc2goKTsKKwkKKyAgICBiY21vc19tc2dfcXVldWVfZGVzdHJveSgmY29yZV9tZ210X3F1ZXVlKTsKKworICAgIGlmIChwX2JhbF9jb3JlX3RvX2FwaV9xdWV1ZSA9PSAmY29yZV9hcGlfcXVldWUpCisgICAgICAgIGJjbW9zX21zZ19xdWV1ZV9kZXN0cm95KHBfYmFsX2NvcmVfdG9fYXBpX3F1ZXVlKTsKKworICAgIGlmIChwX2JhbF9jb3JlX3RvX2FwaV9pbmRfcXVldWUgPT0gJmNvcmVfYXBpX2luZF9xdWV1ZSkKKyAgICAgICAgYmNtb3NfbXNnX3F1ZXVlX2Rlc3Ryb3kocF9iYWxfY29yZV90b19hcGlfaW5kX3F1ZXVlKTsKKyAKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEJBTCBjb3JlIG1hbmFnZW1lbnQgbWVzc2FnZSBxdWV1ZSBpbml0CisgKgorICogQSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgdGhlIHdvcmtlciBtb2R1bGUuCisgKiBJdCBjcmVhdGVzIG1lc3NhZ2UgcXVldWVzIGZvciBjb21tdW5pY2F0aW9uIHdpdGggQVBJIGxheWVyIGFuZCBVVElMUworICoKKyAqIEBwYXJhbSBtZ210X3F1ZXVlX2luZm8gQSBwb2ludGVyIHRvIHRoZSBpcDpwb3J0IGFkZHJlc3NlcyByZXF1aXJlZCBmb3IgdGhlIG1zZyBxdWV1ZXMuCisgKiAgICAgICAgICAgICBUaGUgaXA6cG9ydCBhZGRyZXNzZXMgY2FuIGJlIE5VTEwgaW4gQkFMX01PTk9MSVRISUMgbW9kZS4gSW4gdGhpcyBjYXNlCisgKiAgICAgICAgICAgICBpbnRlci10aHJlYWQgcXVldWVzIHdpbGwgYmUgdXNlZCBmb3IgY29tbXVuaWNhdGlvbi4KKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGNvcmVfbXNnX3F1ZXVlX2luaXQobWdtdF9xdWV1ZV9hZGRyX3BvcnRzICptZ210X3F1ZXVlX2luZm8pCit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gbXNnX3FfcCA9IHt9OworICAgIGJjbW9zX2Vycm5vIHJldDsKKworICAgIGRvCisgICAgeworICAgICAgICAvKiBDcmVhdGUgY29yZSBxdWV1ZS4gQkFMIGNvcmUgbGlzdGVucyBvbiB0aGlzIHF1ZXVlCisgICAgICAgICAqIGZvciBwdWJsaWMgQVBJIGNhbGxzIGFuZCBpbmRpY2F0aW9ucyBmcm9tIHRoZSBVVGlscworICAgICAgICAgKi8KKyAgICAgICAgbXNnX3FfcC5uYW1lID0gIm1nbXRfcnhfcSI7CisgICAgICAgIGlmIChOVUxMICE9IG1nbXRfcXVldWVfaW5mby0+Y29yZV9tZ210X2lwX3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBxdWV1ZSBhbGxvd3Mgc2VuZGluZyBmcm9tIGNvcmVfbWdtdF9pcF9wb3J0IGFuZCByZWNlaXZpbmcgYXQgY29yZV9tZ210X2lwX3BvcnQgKi8KKyAgICAgICAgICAgIG1zZ19xX3AubG9jYWxfZXBfYWRkcmVzcyA9IG1nbXRfcXVldWVfaW5mby0+Y29yZV9tZ210X2lwX3BvcnQ7CisgICAgICAgICAgICBtc2dfcV9wLnJlbW90ZV9lcF9hZGRyZXNzID0gbWdtdF9xdWV1ZV9pbmZvLT5jb3JlX21nbXRfaXBfcG9ydDsKKyAgICAgICAgICAgIG1zZ19xX3AuZXBfdHlwZSA9IEJDTU9TX01TR19RVUVVRV9FUF9VRFBfU09DS0VUOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbXNnX3FfcC5lcF90eXBlID0gQkNNT1NfTVNHX1FVRVVFX0VQX0xPQ0FMOworICAgICAgICB9CisgICAgICAgIHJldCA9IGJjbW9zX21zZ19xdWV1ZV9jcmVhdGUoJmNvcmVfbWdtdF9xdWV1ZSwgJm1zZ19xX3ApOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9jb3JlLCAiQ291bGRuJ3QgY3JlYXRlIHJ4IG1nbXQgcXVldWVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcF9iYWxfY29yZV9xdWV1ZSA9ICZjb3JlX21nbXRfcXVldWU7CisjaWZkZWYgQkFMX01PTk9MSVRISUMKKyAgICAgICAgaWYgKE5VTEwgPT0gbWdtdF9xdWV1ZV9pbmZvLT5jb3JlX21nbXRfaXBfcG9ydCkKKyAgICAgICAgICAgIHBfYmFsYXBpX3RvX2NvcmVfcXVldWUgPSBwX2JhbF9jb3JlX3F1ZXVlOworI2VuZGlmCisKKyAgICAgICAgLyogTm93IGNyZWF0ZSBhIFRYIHF1ZXVlIGZvciBzZW5kaW5nIHJlcGxpZXMgZnJvbSB0aGUgY29yZSB0byBBUEkuCisgICAgICAgICAqIE9ubHkgZG8gaXQgaWYgdXNpbmcgc29ja2V0IHRyYW5zcG9ydC4gSW4gY2FzZSBvZiBpbnRlci10aHJlYWQgcXVldWVzCisgICAgICAgICAqIGl0IHdpbGwgYmUgY3JlYXRlZCBieSBBUEkgbGF5ZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChOVUxMICE9IG1nbXRfcXVldWVfaW5mby0+YmFsYXBpX21nbXRfaXBfcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgcG9ydG51bTsKKyAgICAgICAgICAgIGNoYXIgKnBfcG9ydG51bV9zdHI7CisgICAgICAgICAgICBjaGFyIGJhbGFwaV9pbmRfcG9ydF9zdHJbMjU2XTsKKworICAgICAgICAgICAgbXNnX3FfcC5uYW1lID0gIm1nbXRfdG9fYXBpX3EiOworICAgICAgICAgICAgbXNnX3FfcC5sb2NhbF9lcF9hZGRyZXNzID0gTlVMTDsKKyAgICAgICAgICAgIG1zZ19xX3AucmVtb3RlX2VwX2FkZHJlc3MgPSBtZ210X3F1ZXVlX2luZm8tPmJhbGFwaV9tZ210X2lwX3BvcnQ7CisgICAgICAgICAgICBtc2dfcV9wLmVwX3R5cGUgPSBCQ01PU19NU0dfUVVFVUVfRVBfVURQX1NPQ0tFVDsKKyAgICAgICAgICAgIHJldCA9IGJjbW9zX21zZ19xdWV1ZV9jcmVhdGUoJmNvcmVfYXBpX3F1ZXVlLCAmbXNnX3FfcCk7CisgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2NvcmUsICJDb3VsZG4ndCBjcmVhdGUgdHggbWdtdCBxdWV1ZVxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2JhbF9jb3JlX3RvX2FwaV9xdWV1ZSA9ICZjb3JlX2FwaV9xdWV1ZTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIG1ha2UgYSBjb3B5IG9mIHRoZSB1c2VyIGNob3NlbiBiYWwgYXBpIG1nbXQgcG9ydAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdHJjcHkoYmFsYXBpX2luZF9wb3J0X3N0ciwgbWdtdF9xdWV1ZV9pbmZvLT5iYWxhcGlfbWdtdF9pcF9wb3J0KTsKKworICAgICAgICAgICAgLyogRmluZCB0aGUgcG9ydCBudW1iZXIgKi8KKyAgICAgICAgICAgIHBfcG9ydG51bV9zdHIgPSBzdHJjaHIoYmFsYXBpX2luZF9wb3J0X3N0ciwgJzonKSArIDE7CisKKyAgICAgICAgICAgIC8qIGNvbnZlcnQgdG8gYW4gaW50ZWdlciBhbmQgaW5jcmVtZW50IGl0IGJ5IG9uZSAqLworICAgICAgICAgICAgcG9ydG51bSA9IGF0b2kocF9wb3J0bnVtX3N0cikgKyAxOworCisgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIG5ldyBzdHJpbmcgZGVmaW5pbmcgdGhlIEJBTCBBUEkgaW5kaWNhdGlvbiBwb3J0ICovCisgICAgICAgICAgICBzcHJpbnRmKHBfcG9ydG51bV9zdHIsIiVkIiwgcG9ydG51bSk7CisKKyAgICAgICAgICAgIC8qIENyZWF0ZSBjb3JlLT5BUEkgaW5kaWNhdGlvbiBxdWV1ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtc2dfcV9wLm5hbWUgPSAibWdtdF9pbmRfcSI7CisKKyAgICAgICAgICAgIC8qIFNldCB1cCB0aGUgbWFuYWdlbWVudCBJUDpwb3J0IGFjY2VzcyBwYXJhbWV0ZXJzIHRvIGFsbG93IHRoZSBjb3JlIHRvIHNlbmQgaW5kaWNhdGlvbnMgdG8KKyAgICAgICAgICAgICAqIHRoZSBCQUwgcHVibGljIEFQSSAtIHRoaXMgaXMgYSBUWCBxdWV1ZSBvbmx5IS4gCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1zZ19xX3AubG9jYWxfZXBfYWRkcmVzcyA9IE5VTEw7CisgICAgICAgICAgICBtc2dfcV9wLnJlbW90ZV9lcF9hZGRyZXNzID0gYmFsYXBpX2luZF9wb3J0X3N0cjsKKyAgICAgICAgICAgIG1zZ19xX3AuZXBfdHlwZSA9IEJDTU9TX01TR19RVUVVRV9FUF9VRFBfU09DS0VUOworCisgICAgICAgICAgICByZXQgPSBiY21vc19tc2dfcXVldWVfY3JlYXRlKCZjb3JlX2FwaV9pbmRfcXVldWUsICZtc2dfcV9wKTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfY29yZSwgIkNvdWxkbid0IGNyZWF0ZSB0aGUgY29yZSB0eCBpbmRpY2F0aW9uIHF1ZXVlXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2NvcmUsICJDcmVhdGVkIHRoZSBjb3JlIHR4IGluZGljYXRpb24gcXVldWVcbiIpOworCisgICAgICAgICAgICBwX2JhbF9jb3JlX3RvX2FwaV9pbmRfcXVldWUgPSAmY29yZV9hcGlfaW5kX3F1ZXVlOworICAgICAgICB9CisgICAgfSB3aGlsZSAoMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBCQUwgY29yZSBtYW5hZ2VtZW50IHdvcmtlciBtb2R1bGUgaW5pdAorICoKKyAqIEEgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIHRoZSB3b3JrZXIgbW9kdWxlLgorICogSXQgcmVnaXN0ZXJzIGZvciBtZXNzYWdlcyB0aGF0IHRoaXMgbW9kdWxlIGlzIGV4cGVjdGVkIHRvIHByb2Nlc3MuCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBfYmFsX3dvcmtlcl9tZ210X21vZHVsZV9pbml0KGxvbmcgZGF0YSkKK3sKKworICAgIGJjbW9zX3Rhc2tfcGFybSB0YXNrX3AgPSB7fTsKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisgICAgZG8KKyAgICB7CisKKyAgICAgICAgLyogQ3JlYXRlIE1nbXQgUlggdGhyZWFkICovCisgICAgICAgIHRhc2tfcC5uYW1lID0gIm1nbXRfbWdtdF9yeCI7CisgICAgICAgIHRhc2tfcC5wcmlvcml0eSA9IFRBU0tfUFJJT1JJVFlfSVBDX1JYOworICAgICAgICB0YXNrX3AuaGFuZGxlciA9IF9iYWxfbWdtdF9yeF9oYW5kbGVyOworICAgICAgICB0YXNrX3AuZGF0YSA9IChsb25nKXBfYmFsX2NvcmVfcXVldWU7CisKKyAgICAgICAgcmV0ID0gYmNtb3NfdGFza19jcmVhdGUoJnJ4X21nbXRfdGhyZWFkLCAmdGFza19wKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2NvcmUsICJDb3VsZG4ndCBjcmVhdGUgTWdtdCBSWCB0aHJlYWRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWdpc3RlciB0aGUgbWVzc2FnZSB0eXBlcyB0byBiZSBoYW5kbGVkIGJ5IHRoZSBtZ210IG1vZHVsZQorICAgICAgICAgKi8KKyAgICAgICAgYmNtb3NfbXNnX3JlZ2lzdGVyKEJDTUJBTF9NR01UX01TRywgMCwgQkNNT1NfTU9EVUxFX0lEX1dPUktFUl9NR01ULCBjb3JlX21nbXRfbXNnX2hhbmRsZXIpOworICAgICAgICBiY21vc19tc2dfcmVnaXN0ZXIoQkNNQkFMX01BQ19VVElMX01TRywgMCwgQkNNT1NfTU9EVUxFX0lEX1dPUktFUl9NR01ULCBjb3JlX3V0aWxfbXNnX2hhbmRsZXIpOworICAgIH0KKyAgICB3aGlsZSgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIE1nbXQgUlggaGFuZGxlcgorICoKKyAqIFRoaXMgaGFuZGxlciBpcyBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiBhbiBSWCB0aHJlYWQuICBJdCdzIHB1cnBvc2UgCisgKiBpcyB0byBkaXNwYXRjaCB0aGUgbWVzc2FnZSByZWNlaXZlZCBoZXJlIHRvIHRoZSBtb2R1bGUgdGhhdCBoYXMgcmVnaXN0ZXJlZAorICogdG8gcHJvY2VzcyB0aGlzIG1lc3NhZ2UuICBUaGUgbWVzc2FnZSBpcyB0aGVuIHByb2Nlc3NlZCBpbiB0aGUgY29udGV4dCAKKyAqIG9mIHRoZSB0aHJlYWQgdG8gd2hpY2ggdGhhdCBtb2R1bGUgaXMgYXR0YWNoZWQuCisgKgorICogQHBhcmFtIGRhdGEgQSBwb2ludGVyIHRvIHRoZSByZWNlaXZlZCBtZXNzYWdlCisgKgorICogQHJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIG9uIGZhaWx1cmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9iYWxfbWdtdF9yeF9oYW5kbGVyKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19tc2dfcXVldWUgKnJ4cSA9IChiY21vc19tc2dfcXVldWUgKilkYXRhOworICAgIGJjbW9zX3Rhc2sgKm15X3Rhc2sgPSBiY21vc190YXNrX2N1cnJlbnQoKTsKKyAgICB2b2lkICpwYXlsb2FkOworICAgIGJjbW9zX21zZyAqbXNnOworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICB3aGlsZSAoIW15X3Rhc2stPmRlc3Ryb3lfcmVxdWVzdCkKKyAgICB7CisgICAgICAgIHBheWxvYWQgPSBOVUxMOworICAgICAgICByZXQgPSBiY21iYWxfbXNnX3JlY3YocnhxLCBCQ01PU19XQUlUX0ZPUkVWRVIsICZwYXlsb2FkKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVW5leHBlY3RlZCBmYWlsdXJlICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfY29yZSwgImJjbWJhbF9tc2dfcmVjdigpIC0+ICVzXG4iLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogTWVzc2FnZSByZWNlaXZlZCAqLworICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfY29yZSwgImJjbWJhbF9tc2dfcmVjdiglcCkgLT4gJXNcbiIsIHBheWxvYWQsIGJjbW9zX3N0cmVycm9yKHJldCkpOworCisgICAgICAgLyogCisgICAgICAgICAqIEdvdCBhIG1lc3NhZ2UsIHNvIG5vdyBkaXNwYXRjaCBpdC4gIFRoaXMgd2lsbCByZXN1bHQgaW4gb25lCisgICAgICAgICAqIG9mIHRoZSBtb2R1bGVzIChyZWdpc3RlcmVkIGZvciB0aGUgbWVzc2FnZSBiZWluZyBwcm9jZXNzZWQpCisgICAgICAgICAqIGV4ZWN1dGluZyBpdHMgbWVzc2FnZSBjYWxsYmFjayBoYW5kbGVyLgorICAgICAgICAgKgorICAgICAgICAgKi8KKyAgICAgICAgbXNnID0gYmNtYmFsX2JjbW9zX2hkcl9nZXQocGF5bG9hZCk7CisgICAgICAgIHJldCA9IGJjbW9zX21zZ19kaXNwYXRjaChtc2csIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9jb3JlLCAKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGRpc3BhdGNoIG1lc3NhZ2UgJWQ6JWRcbiIsIAorICAgICAgICAgICAgICAgICAgICAoaW50KW1zZy0+dHlwZSwgKGludCltc2ctPmluc3RhbmNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG15X3Rhc2stPmRlc3Ryb3llZCA9IEJDTU9TX1RSVUU7CisKKyAgICByZXR1cm4gKEJDTV9FUlJfT0sgPT0gcmV0KSA/IDAgOiAtRUlOVkFMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgQkFMIGNvcmUgbWFuYWdlbWVudCBtZXNzYWdlIGhhbmRsZXIKKyAqCisgKiBBIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcnMgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqIEJBTCBwdWJsaWMgQVBJIHZpYSBhbiBSWCB0aHJlYWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBleGVjdXRlcyBpbiB0aGUgY29udGV4dCBvZiB0aGUgd29ya2VyIHRocmVhZC4KKyAqCisgKiBAcGFyYW0gbW9kdWxlX2lkICBUaGUgaW5kZXggb2YgdGhlIG1vZHVsZSB0aGF0IHRoaXMgbWVzc2FnZSBoYW5kbGVyCisgKiAgICAgICAgICAgICAgICAgICBpcyBhc3NvY2lhdGVkIHdpdGguCisgKgorICogQHBhcmFtIG1zZyAgICAgICAgQSBwb2ludGVyIHRvIHRoZSByZWNlaXZlZCBtZXNzYWdlIHRvIGJlIHByb2Nlc3NlZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNvcmVfbWdtdF9tc2dfaGFuZGxlcihiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm1zZykKK3sKKworICAgIHZvaWQgKm1zZ19wYXlsb2FkOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IG1zZyk7CisKKyAgICAvKgorICAgICAqIEB0by1kbyAKKyAgICAgKiB2YWxpZGF0ZSB0aGUgbWVzc2FnZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBpcyBjb3JyZWN0CisgICAgICovCisKKyAgICAvKgorICAgICAqIFBvaW50IHRvIHRoZSBtZXNzYWdlIHBheWxvYWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZworICAgICAqLworICAgIG1zZ19wYXlsb2FkID0gYmNtYmFsX3BheWxvYWRfcHRyX2dldChiY21iYWxfYmFsX2hkcl9nZXRfYnlfYmNtb3NfaGRyKG1zZykpOworCisgICAgLyoKKyAgICAgKiBUaGVzZSBhcmUgbWVzc2FnZXMgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkgb3IgdGhlIFVUSUxTCisgICAgICoKKyAgICAgKiAtIGNhbGwgaW50byBhcHByb3ByaWF0ZSBGU00KKyAgICAgKiAgICAKKyAgICAgKi8KKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfY29yZSwgIlJlY2VpdmVkIGEgbWdtdCBtZXNzYWdlIChwYXlsb2FkIGF0ICVwKVxuIiwgbXNnX3BheWxvYWQpOworCisKKyAgICBpZihCQ01CQUxfTUdNVF9NU0cgPT0gYmNtYmFsX3R5cGVfbWFqb3JfZ2V0KG1zZ19wYXlsb2FkKSAmJiAKKyAgICAgICBCQUxfU1VCU1lTVEVNX1BVQkxJQ19BUEkgPT0gYmNtYmFsX3NlbmRlcl9nZXQobXNnX3BheWxvYWQpKQorICAgIHsKKyAgICAgICAgLyogUHJvY2VzcyB0aGUgbWVzc2FnZSAqLworICAgICAgICBwcm9jZXNzX21nbXRfbXNnKG1zZ19wYXlsb2FkKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhGQVRBTCwgbG9nX2lkX2NvcmUsICJtZXNzYWdlIHJlY2VpdmVkIHdpdGggd3JvbmcgbWFqb3IgdHlwZS9zdWJzeXN0ZW0gY29tYmluYXRpb24gKCVkL1wlZClcbiIsIAorICAgICAgICAgICAgICAgIGJjbWJhbF90eXBlX21ham9yX2dldChtc2dfcGF5bG9hZCksCisgICAgICAgICAgICAgICAgYmNtYmFsX3NlbmRlcl9nZXQobXNnX3BheWxvYWQpKTsKKworICAgICAgICBCVUdfT04oQkNNT1NfVFJVRSk7CisgICAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBCQUwgY29yZSBtYW5hZ2VtZW50IG1lc3NhZ2UgcHJvY2Vzc2luZyBmdW5jdGlvbgorICoKKyAqIEEgV29ya2VyIG1vZHVsZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqIEJBTCBwdWJsaWMgQVBJIG9yIFVUSUxzIHZpYSBhbiBSWCB0aHJlYWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBleGVjdXRlcyBpbiB0aGUgY29udGV4dCBvZiB0aGUgd29ya2VyIHRocmVhZAorICoKKyAqIEBwYXJhbSBtc2dfcGF5bG9hZCBBIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdG8gYmUgcHJvY2Vzc2VkCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gcHJvY2Vzc19tZ210X21zZyh2b2lkICptc2dfcGF5bG9hZCkKK3sKKworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgYmNtYmFsX29ial9pZCBvYmp0eXBlOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2NvcmUsICJQcm9jZXNzaW5nIGEgbWFuYWdlbWVudCBtZXNzYWdlXG4iKTsKKworICAgIG9ianR5cGUgPSBiY21iYWxfbXNnX2lkX29ial9nZXQobXNnX3BheWxvYWQpOworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIHRoZSBtZXNzYWdlIGJhc2VkIG9uIHRoZSB0eXBlIG9mIEJBTCBvYmplY3QgYW5kIHNlbmRlcgorICAgICAqIGluIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHN3aXRjaChvYmp0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX0ZMT1c6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NfZmxvd19vYmplY3QobXNnX3BheWxvYWQpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfR1JPVVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NfZ3JvdXBfb2JqZWN0KG1zZ19wYXlsb2FkKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9BQ0NFU1NfVEVSTUlOQUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NfYWNjZXNzX3Rlcm1pbmFsX29iamVjdChtc2dfcGF5bG9hZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9JTlRFUkZBQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NfaW50ZXJmYWNlX29iamVjdChtc2dfcGF5bG9hZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMOgorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzX3N1YnNjcmliZXJfdGVybWluYWxfb2JqZWN0KG1zZ19wYXlsb2FkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX1BBQ0tFVDoKKyAgICAgICAgeworCisgICAgICAgICAgICByZXQgPSBwcm9jZXNzX3BhY2tldF9vYmplY3QobXNnX3BheWxvYWQpOworCisgICAgICAgICAgICAvKiBXZSByZXNwb25kIHRvIHRoZSBCQUwgcHVibGljIEFQSSBiYWNrZW5kIHdpdGggYSByZXN1bHQuIFdlIGFsd2F5cyAKKyAgICAgICAgICAgICAqIHNlbmQgYSBjb21wbGV0ZSBtc2dfcGF5bG9hZCBiYWNrIHRvIHRoZSBBUEksIGJ1dCB0aGUgZGF0YSBwb3J0aW9uIAorICAgICAgICAgICAgICogb2YgdGhlIG9iamVjdCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gYSBHRVQgb3IgR0VULVNUQVRTIGhhcyBiZWVuIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsICgoYmNtYmFsX29iaiAqKW1zZ19wYXlsb2FkKS0+dHlwZSwgbG9nX2lkX2NvcmUpOworICAgIAorICAgICAgICAgICAgYnJlYWs7CisgCisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfVE1fU0NIRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NfdG1fc2NoZWRfb2JqZWN0KG1zZ19wYXlsb2FkKTsKKyAgICAgICAgICAgIGJyZWFrOwkJCQkgCisgICAgICAgIH0KKwkJCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9UTV9RVUVVRToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc190bV9xdWV1ZV9vYmplY3QobXNnX3BheWxvYWQpOworICAgICAgICAgICAgYnJlYWs7CQkJCSAKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9jb3JlLCAKKyAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG9iamVjdCBkZXRlY3RlZCBpbiBtYW5hZ2VtZW50IG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworCisgICAgICAgICAgICAvKiBXZSByZXNwb25kIHRvIHRoZSBCQUwgcHVibGljIEFQSSBiYWNrZW5kIHdpdGggYSByZXN1bHQuIFdlIGFsd2F5cyAKKyAgICAgICAgICAgICAqIHNlbmQgYSBjb21wbGV0ZSBtc2dfcGF5bG9hZCBiYWNrIHRvIHRoZSBBUEksIGJ1dCB0aGUgZGF0YSBwb3J0aW9uIAorICAgICAgICAgICAgICogb2YgdGhlIG9iamVjdCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gYSBHRVQgb3IgR0VULVNUQVRTIGhhcyBiZWVuIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsICgoYmNtYmFsX29iaiAqKW1zZ19wYXlsb2FkKS0+dHlwZSwgbG9nX2lkX2NvcmUpOworICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgYmNtYmFsX21zZ19mcmVlKG1zZ19wYXlsb2FkKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBCQUwgY29yZSB1dGlsIG1lc3NhZ2UgaGFuZGxlcgorICoKKyAqIEEgZnVuY3Rpb24gdGhhdCBoYW5kbGVycyBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoZQorICogQkFMIHV0aWxzIHZpYSBhbiBSWCB0aHJlYWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBleGVjdXRlcyBpbiB0aGUgY29udGV4dCBvZiB0aGUgd29ya2VyIHRocmVhZC4KKyAqCisgKiBAcGFyYW0gbW9kdWxlX2lkICBUaGUgaW5kZXggb2YgdGhlIG1vZHVsZSB0aGF0IHRoaXMgbWVzc2FnZSBoYW5kbGVyCisgKiAgICAgICAgICAgICAgICAgICBpcyBhc3NvY2lhdGVkIHdpdGguCisgKgorICogQHBhcmFtIG1zZyAgICAgICAgQSBwb2ludGVyIHRvIHRoZSByZWNlaXZlZCBtZXNzYWdlIHRvIGJlIHByb2Nlc3NlZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29yZV91dGlsX21zZ19oYW5kbGVyKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqbXNnKQoreworCisgICAgdm9pZCAqbXNnX3BheWxvYWQ7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKE5VTEwgPT0gbXNnKTsKKworICAgIC8qCisgICAgICogQHRvLWRvIAorICAgICAqIHZhbGlkYXRlIHRoZSBtZXNzYWdlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGlzIGNvcnJlY3QKKyAgICAgKi8KKworICAgIC8qCisgICAgICogUG9pbnQgdG8gdGhlIG1lc3NhZ2UgcGF5bG9hZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nCisgICAgICovCisgICAgbXNnX3BheWxvYWQgPSBiY21iYWxfcGF5bG9hZF9wdHJfZ2V0KGJjbWJhbF9iYWxfaGRyX2dldF9ieV9iY21vc19oZHIobXNnKSk7CisKKyAgICAvKgorICAgICAqIFRoZXNlIGFyZSBtZXNzYWdlcyBmcm9tIHRoZSBCQUwgVXRpbHMKKyAgICAgKgorICAgICAqIC0gY2FsbCBpbnRvIGFwcHJvcHJpYXRlIEZTTQorICAgICAqICAgIAorICAgICAqLworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9jb3JlLCAiUmVjZWl2ZWQgYSBVdGlsIG1lc3NhZ2UgKHBheWxvYWQgYXQgJXApXG4iLCBtc2dfcGF5bG9hZCk7CisKKyAgICBpZihCQ01CQUxfTUFDX1VUSUxfTVNHID09IGJjbWJhbF90eXBlX21ham9yX2dldChtc2dfcGF5bG9hZCkgJiYKKyAgICAgICBCQUxfU1VCU1lTVEVNX01BQ19VVElMID09IGJjbWJhbF9zZW5kZXJfZ2V0KG1zZ19wYXlsb2FkKSkKKyAgICB7ICAgICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyB0aGUgbWVzc2FnZSAqLworICAgICAgICBwcm9jZXNzX3V0aWxfbXNnKG1zZ19wYXlsb2FkKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEZBVEFMLCBsb2dfaWRfY29yZSwgIm1lc3NhZ2UgcmVjZWl2ZWQgd2l0aCB3cm9uZyBtYWpvciB0eXBlL3N1YnN5c3RlbSBjb21iaW5hdGlvbiAoJWQvXCVkKVxuIiwgCisgICAgICAgICAgICAgICAgYmNtYmFsX3R5cGVfbWFqb3JfZ2V0KG1zZ19wYXlsb2FkKSwKKyAgICAgICAgICAgICAgICBiY21iYWxfc2VuZGVyX2dldChtc2dfcGF5bG9hZCkpOworCisgICAgICAgIEJVR19PTihCQ01PU19UUlVFKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBCQUwgY29yZSB1dGlsIG1lc3NhZ2UgcHJvY2Vzc2luZyBmdW5jdGlvbgorICoKKyAqIEEgV29ya2VyIG1vZHVsZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqIEJBTCB1dGlscyB2aWEgYW4gUlggdGhyZWFkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHdvcmtlciB0aHJlYWQKKyAqCisgKiBAcGFyYW0gbXNnX3BheWxvYWQgQSBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIHRvIGJlIHByb2Nlc3NlZAorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIHByb2Nlc3NfdXRpbF9tc2codm9pZCAqbXNnX3BheWxvYWQpCit7CisKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJjbWJhbF9vYmpfaWQgb2JqdHlwZTsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9jb3JlLCAiUHJvY2Vzc2luZyBhIHV0aWwgbWVzc2FnZVxuIik7CisKKyAgICBvYmp0eXBlID0gYmNtYmFsX21zZ19pZF9vYmpfZ2V0KG1zZ19wYXlsb2FkKTsKKworICAgIC8qCisgICAgICogUHJvY2VzcyB0aGUgdXRpbCBtZXNzYWdlIGJhc2VkIG9uIHRoZSB0eXBlIG9mIEJBTCBvYmplY3QKKyAgICAgKiBpbiB0aGUgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBzd2l0Y2gob2JqdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9GTE9XOgorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzX2Zsb3dfdXRpbF9tc2cobXNnX3BheWxvYWQpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfR1JPVVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NfZ3JvdXBfdXRpbF9tc2cobXNnX3BheWxvYWQpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIAorICAgICAgICB9CisKKworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfQUNDRVNTX1RFUk1JTkFMOgorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzX2FjY2Vzc190ZXJtaW5hbF91dGlsX21zZyhtc2dfcGF5bG9hZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9JTlRFUkZBQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3NfaW50ZXJmYWNlX3V0aWxfbXNnKG1zZ19wYXlsb2FkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX1NVQlNDUklCRVJfVEVSTUlOQUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IHByb2Nlc3Nfc3Vic2NyaWJlcl90ZXJtaW5hbF91dGlsX21zZyhtc2dfcGF5bG9hZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9UTV9TQ0hFRDoKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc190bV9zY2hlZF91dGlsX21zZyhtc2dfcGF5bG9hZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9jb3JlLCAKKyAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG9iamVjdCBkZXRlY3RlZCBpbiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdXRpbFxuIik7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgICogRnJlZSB0aGUgbWVzc2FnZSBhZnRlciBwcm9jZXNzaW5nCisgICAgICovCisgICAgYmNtYmFsX21zZ19mcmVlKG1zZ19wYXlsb2FkKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBCQUwgY29yZSAicGFja2V0IHNlbmQiIG1lc3NhZ2UgcHJvY2Vzc2luZyBmdW5jdGlvbgorICoKKyAqIEEgV29ya2VyIG1vZHVsZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgcGFja2V0IHNlbmQgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqIEJBTCBwdWJsaWMgQVBJIHZpYSBhbiBSWCB0aHJlYWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBleGVjdXRlcyBpbiB0aGUgY29udGV4dCBvZiB0aGUgd29ya2VyIHRocmVhZAorICoKKyAqIEBwYXJhbSBtc2dfcGF5bG9hZCBBIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdG8gYmUgcHJvY2Vzc2VkCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gcHJvY2Vzc19wYWNrZXRfb2JqZWN0KHZvaWQgKm1zZ19wYXlsb2FkKQoreworCisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICB1aW50OF90ICpwX3VzZXJfcGt0OworICAgIHVpbnQxNl90IHVzZXJfcGt0X2xlbjsKKyAgICB1aW50OF90IGRzdF9wb3J0X2lkOworICAgIGJjbW9zX2Jvb2wgYl9wb3J0X2lkX2lzX25uaTsKKyAgICBiY21iYWxfcGFja2V0X2NmZyAqcF9wYWNrZXRfb2JqOworICAgIHVpbnQxNl90IHR1bm5lbF90YWdfdmxhbl9pZCA9IDA7CisgCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2NvcmUsICJQcm9jZXNzaW5nIGEgXCJQYWNrZXQgc2VuZFwiIG1lc3NhZ2VcbiIpOworCisgICAgcF9wYWNrZXRfb2JqID0gKGJjbWJhbF9wYWNrZXRfY2ZnICopbXNnX3BheWxvYWQ7CisgICAgCisgICAgLyogRXh0cmFjdCB0aGUgbGVuZ3RoIG9mIHRoZSB1c2VyIHBhY2tldCB0byBiZSBwcm94aWVkICovCisgICAgdXNlcl9wa3RfbGVuID0gcF9wYWNrZXRfb2JqLT5kYXRhLnBrdC5sZW47CisKKyAgICAvKiBEZXJpdmUgYSBwb2ludGVyIHRvIHRoZSB1c2VyIHBhY2tldCAqLworICAgIHBfdXNlcl9wa3QgPSBwX3BhY2tldF9vYmotPmRhdGEucGt0LnZhbDsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9jb3JlLCAidXNlciBwYWNrZXQgZmlyc3QgMTIgYnl0ZXMgJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYICUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKKyAgICAgICAgICAgIHBfdXNlcl9wa3RbMF0sIHBfdXNlcl9wa3RbMV0sIHBfdXNlcl9wa3RbMl0sIHBfdXNlcl9wa3RbM10sIHBfdXNlcl9wa3RbNF0sIHBfdXNlcl9wa3RbNV0sIAorICAgICAgICAgICAgcF91c2VyX3BrdFs2XSwgcF91c2VyX3BrdFs3XSwgcF91c2VyX3BrdFs4XSwgcF91c2VyX3BrdFs5XSwgcF91c2VyX3BrdFsxMF0sIHBfdXNlcl9wa3RbMTFdKTsKKworICAgIC8qIElzIHRoaXMgcGFja2V0IGRlc3RpbmVkIHRvIGFuIE5OSSBvciBQT04gcG9ydD8gKi8KKyAgICBiX3BvcnRfaWRfaXNfbm5pID0gKEJDTUJBTF9ERVNUX1RZUEVfTk5JID09IHBfcGFja2V0X29iai0+a2V5LnBhY2tldF9zZW5kX2Rlc3QudHlwZSkgPworICAgICAgICBCQ01PU19UUlVFIDogQkNNT1NfRkFMU0U7CisKKyAgICAvKgorICAgICAqIFByb2Nlc3MgdGhlIG1lc3NhZ2UgYmFzZWQgb24gdGhlIHR5cGUgb2YgQkFMIG9iamVjdAorICAgICAqIGluIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHN3aXRjaChwX3BhY2tldF9vYmotPmhkci5oZHIub2JqX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfUEFDS0VUOgorICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRzdF9wb3J0X2lkID0gKEJDTU9TX1RSVUUgPT0gYl9wb3J0X2lkX2lzX25uaSkgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHBfcGFja2V0X29iai0+a2V5LnBhY2tldF9zZW5kX2Rlc3QudS5ubmkuaW50X2lkKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIChwX3BhY2tldF9vYmotPmtleS5wYWNrZXRfc2VuZF9kZXN0LnUuc3ViX3Rlcm0uaW50X2lkKTsKKyAgICAgICAgICAgIGlmKEJDTU9TX0ZBTFNFID09IGJfcG9ydF9pZF9pc19ubmkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogUGFja2V0cyBkZXN0aW5lZCB0byBhIFBPTiBpbnRlcmZhY2UgcmVxdWlyZSBhIHR1bm5lbCB0YWcKKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIEdldCB0aGUgc3ZjX3BvcnRfaWQgZm9yIHRoZSBmaXJzdCBmbG93IG9uIHRoZSBzdWJzY3JpYmVyIHRlcm1pbmFsIChpZiB0aGVyZSBpcyBvbmUpCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSBzdmNfcG9ydF9pZF9mb3Jfc3ViX3Rlcm1fZHNfZmxvd19nZXQocF9wYWNrZXRfb2JqLT5rZXkucGFja2V0X3NlbmRfZGVzdC51LnN1Yl90ZXJtLmludF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BhY2tldF9vYmotPmtleS5wYWNrZXRfc2VuZF9kZXN0LnUuc3ViX3Rlcm0uc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wYWNrZXRfb2JqLT5rZXkucGFja2V0X3NlbmRfZGVzdC51LnN1Yl90ZXJtLnN1Yl90ZXJtX3VuaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHVubmVsX3RhZ192bGFuX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19pZF9jb3JlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFja2V0IHNlbmQgY291bGQgbm90IGZpbmQgYW55IGRvd25zdHJlYW0gRkxPVyB0byBzZW5kIHBhY2tldCBmb3Igc3ViX3Rlcm1faWQgJWQgKFBPTiAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wYWNrZXRfb2JqLT5rZXkucGFja2V0X3NlbmRfZGVzdC51LnN1Yl90ZXJtLnN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcGFja2V0X29iai0+a2V5LnBhY2tldF9zZW5kX2Rlc3QudS5zdWJfdGVybS5pbnRfaWQpOyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldCA9IHN3X3V0aWxfcGt0X3NlbmQoZHN0X3BvcnRfaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiX3BvcnRfaWRfaXNfbm5pID8gUkVBU09OX1NFTkRfVE9fTk5JIDogUkVBU09OX1NFTkRfVE9fUE9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF91c2VyX3BrdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfcGt0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCl0dW5uZWxfdGFnX3ZsYW5faWQpOyAgICAgICAKKyAgICAgICAgfQorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2NvcmUsIAorICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgb2JqZWN0IGRldGVjdGVkIGluIFwicGFja2V0IHNlbmRcIiBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIH0KKyAgICAvKgorICAgICAqIE5PVEU6IERPIE5PVCBmcmVlIHRoZSBtZXNzYWdlIGFmdGVyIHByb2Nlc3NpbmcgaGVyZS4gIEl0IGlzIGZyZWVkIGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9uCisgICAgICovCisgCisgICAgcmV0dXJuIHJldDsKK30KKworLypAfSovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2JhbF93b3JrZXIuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vYmFsX3dvcmtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZGY2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2JhbF93b3JrZXIuaApAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfd29ya2VyLmgKKyAqIAorICogQGJyaWVmIEJhbCB3b3JrZXIgdGhyZWFkIGluY2x1ZGUgZmlsZQorICogCisgKiBNb2R1bGUgY29udGFpbnMgdGhlIGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIHVzZWQgdG8gc3VwcG9ydCB0aGUgCisgKiBCQUwgY29yZSB3b3JrZXIgdGhyZWFkLgorICoKKyAqIEBkZWZncm91cCBjdHJsciBDb3JlIENvbnRyb2xsZXIKKyAqIEBpbmdyb3VwIGNvcmUKKyAqCisgKi8KKworI2lmbmRlZglCQUxXT1JLRVJfSAorI2RlZmluZQlCQUxXT1JLRVJfSAorCisvKkB7Ki8KKworI2luY2x1ZGUgPGJjbW9zX2Vycm5vLmg+CisjaW5jbHVkZSA8YmFsX2FwaS5oPgorCisvKiBUcmFuc21pdCBRdWV1ZXMgdG8gYW5kIGZyb20gQkFMIGNvcmUgKi8KK2V4dGVybiBiY21vc19tc2dfcXVldWUgKnBfYmFsX2NvcmVfdG9fYXBpX3F1ZXVlOworZXh0ZXJuIGJjbW9zX21zZ19xdWV1ZSAqcF9iYWxfY29yZV90b19hcGlfaW5kX3F1ZXVlOworCisvKgorICogRnVuY3Rpb24gZGVjbGFyYXRpb25zCisgKi8KK2V4dGVybiBiY21vc19lcnJubyBfYmFsX3dvcmtlcl9tZ210X21vZHVsZV9pbml0KGxvbmcgZGF0YSk7CitleHRlcm4gYmNtb3NfZXJybm8gX2JhbF93b3JrZXJfdXRpbF9tb2R1bGVfaW5pdChsb25nIGRhdGEpOworCitleHRlcm4gYmNtb3NfZXJybm8gY29yZV9tc2dfcXVldWVfaW5pdChtZ210X3F1ZXVlX2FkZHJfcG9ydHMgKm1zZ19xdWV1ZV9pbmZvKTsKK2V4dGVybiB2b2lkIGNvcmVfd29ya2VyX3RocmVhZF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgY29yZV93b3JrZXJfdGhyZWFkX2ZpbmlzaCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgY29yZV91dGlsX21zZ19oYW5kbGVyKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqbXNnKTsKKworCisvKkB9Ki8KKworI2VuZGlmIC8qIEJBTFdPUktFUl9IICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2Zsb3dfZnNtLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2Zsb3dfZnNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlZTcxYQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vZmxvd19mc20uYwpAQCAtMCwwICsxLDI1NTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIGZsb3dfZnNtLmMKKyAqIEBicmllZiBDb2RlIHRvIHN1cHBvcnQgdGhlIEJBTCBmbG93IEZTTQorICoKKyAqIEBhZGR0b2dyb3VwIGZsb3cKKyAqCisgKi8KKworLypAeyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxmbG93X2ZzbS5oPgorI2luY2x1ZGUgPHRtX3NjaGVkX2ZzbS5oPgorI2luY2x1ZGUgPHRtX3F1ZXVlX2ZzbS5oPgorCisKKyNpbmNsdWRlIDxiYWxfbXNnLmg+CisjaW5jbHVkZSA8YmFsX29zbXNnLmg+CisjaW5jbHVkZSAiYmFsX3dvcmtlci5oIgorI2luY2x1ZGUgImJhbF9tYWNfdXRpbC5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfdXRpbC5oIgorI2luY2x1ZGUgInJzY19tZ3IuaCIKKworI2luY2x1ZGUgPGJhbF9vYmpzLmg+CisjaW5jbHVkZSA8ZnNtX2NvbW1vbi5oPgorI2luY2x1ZGUgPGJhbF9zd2l0Y2hfZmxvdy5oPgorCisjaWZkZWYgRU5BQkxFX0xPRworI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisKKyAvKgorICogQGJyaWVmIFRoZSBsb2dnaW5nIGRldmljZSBpZCBmb3IgZmxvdworICovCitzdGF0aWMgZGV2X2xvZ19pZCBsb2dfaWRfZmxvdzsKKyNlbmRpZgorCisvKiBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBiY21vc19lcnJubyBmbG93X2ZzbV9hZG1pbl91cF9zdGFydChmbG93X2luc3QgKnBfZmxvd19pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIGZsb3dfZnNtX2FkbWluX3VwX2Vycm9yKGZsb3dfaW5zdCAqcF9mbG93X2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fYWRtaW5fZG5fc3RhcnQoZmxvd19pbnN0ICpwX2Zsb3dfaW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBmbG93X2ZzbV9hZG1pbl9kbl9vayhmbG93X2luc3QgKnBfZmxvd19pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIGZsb3dfZnNtX2FkbWluX2RuX2Vycm9yKGZsb3dfaW5zdCAqcF9mbG93X2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21faWdub3JlX3V0aWxfbXNnKGZsb3dfaW5zdCAqcF9mbG93X2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fcmVtb3ZpbmdfcHJvY2Vzc191dGlsX21zZyhmbG93X2luc3QgKnBfZmxvd19pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fcmVtb3ZpbmdfcHJvY2Vzc191dGlsX2F1dG9fbXNnKGZsb3dfaW5zdCAqcF9mbG93X2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fbnVsbF9wcm9jZXNzX3V0aWxfYXV0b19tc2coZmxvd19pbnN0ICpwX2Zsb3dfaW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fcHJvY2Vzc191dGlsX21zZyhmbG93X2luc3QgKnBfZmxvd19pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fcHJvY2Vzc191dGlsX2F1dG9fbXNnKGZsb3dfaW5zdCAqcF9mbG93X2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fY2xlYXJfc3RhcnQoZmxvd19pbnN0ICpwX2Zsb3dfaW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2ZzbV9ldmVudCAqcF9ldmVudCk7CisKKworc3RhdGljIGJjbW9zX2Vycm5vIGZsb3dfZnNtX3N0YXRlX2VycihmbG93X2luc3QgKnBfZmxvd19pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fZXhlYyhmbG93X2luc3QgKnBfZmxvd19pbnN0LCBmbG93X2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBmbG93X2luc3QgKmZsb3dfaW5zdF9nZXQoYmNtYmFsX2Zsb3dfa2V5ICprZXksIGZsb3dfZmxhZyBzZWFyY2hfZmxhZywgYmNtb3NfYm9vbCAqaXNfbmV3X2Zsb3cpOworCisKKyNpZmRlZiBGUkVFX0ZMT1dfQllfS0VZX1NVUFBPUlRFRAorc3RhdGljIGJjbW9zX2Vycm5vIGZsb3dfZnJlZV9ieV9rZXkoYmNtYmFsX2Zsb3dfa2V5ICprZXkpOworI2VuZGlmCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mcmVlX2J5X2VudHJ5KGZsb3dfaW5zdCAqcF9lbnRyeSk7CisKK3N0YXRpYyBiY21vc19lcnJubyBmbG93X3RtX2dldChiY21iYWxfZmxvd19jZmcgKnBfZmxvd19pbmZvLCB0bV9zY2hlZF9pbnN0ICoqcF90bV9zY2hlZF9pbnN0KTsKK3N0YXRpYyBiY21vc19lcnJubyBmbG93X3F1ZXVlX3ZhbGlkYXRlKGJjbWJhbF9mbG93X2NmZyAqcF9mbG93X2NmZywgdG1fcXVldWVfaW5zdCAqKnBfdG1fcXVldWVfaW5zdCk7CisKKworLyoKKyAqIEBicmllZiBUaGUgR2xvYmFsIGZsb3cgZnNtIGNvbnRleHQgZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGZsb3dfZnNtX2N0eCBnX2Zsb3dfZnNtX2Zsb3dfbGlzdF9jdHg7CisKKy8qCisgKiBNYWNyb3MgZm9yIGZsb3cgY3R4IGFjY2VzcworICovCisjZGVmaW5lIEZMT1dfRlNNX0ZMT1dfTElTVF9DVFggICAgICAoZ19mbG93X2ZzbV9mbG93X2xpc3RfY3R4KQorI2RlZmluZSBGTE9XX0ZTTV9GTE9XX0xJU1RfQ1RYX1BUUiAgKCZnX2Zsb3dfZnNtX2Zsb3dfbGlzdF9jdHgpCisKKy8qCisgKiAgQGJyaWVmIFRoZSBkZWZpbml0aW9uIG9mIGEgZmxvdyBGU00gc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbgorICovCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqIGZsb3dfZnNtX3N0YXRlX3Byb2Nlc3NvcikoZmxvd19pbnN0ICosIHZvaWQgKiwgZmxvd19mc21fZXZlbnQgKik7CisKKy8qCisgKiAgQGJyaWVmIFRoZSBGbG93IEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGFycmF5CisgKi8KK3N0YXRpYyBmbG93X2ZzbV9zdGF0ZV9wcm9jZXNzb3IgZmxvd19zdGF0ZXNbRkxPV19GU01fU1RBVEVfX05VTV9PRl1bRkxPV19GU01fRVZFTlRfVFlQRV9fTlVNX09GXSA9Cit7CisgCisgICAgW0ZMT1dfRlNNX1NUQVRFX05VTExdID0gCisgICAgeyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTkZJR1VSSU5HCisgICAgICAgICAqLyAKKyAgICAgICAgW0ZMT1dfRlNNX0VWRU5UX1RZUEVfQURNSU5fVVBdICAgICA9IGZsb3dfZnNtX2FkbWluX3VwX3N0YXJ0LCAgIAorCisgICAgICAgIC8qIAorICAgICAgICAgKiBOZXh0IHN0YXRlOiBOVUxMIAorICAgICAgICAgKi8gICAKKyAgICAgICAgW0ZMT1dfRlNNX0VWRU5UX1RZUEVfQURNSU5fRE5dICAgICA9IGZsb3dfZnNtX2FkbWluX2RuX29rLAorCisgICAgICAgIC8qIAorICAgICAgICAgKiBOZXh0IHN0YXRlOiBOVUxMIAorICAgICAgICAgKi8KKyAgICAgICAgW0ZMT1dfRlNNX0VWRU5UX1RZUEVfVVRJTF9NU0ddICAgICAgPSBmbG93X2ZzbV9pZ25vcmVfdXRpbF9tc2csCisKKyAgICAgICAgLyogCisgICAgICAgICAqIE5leHQgc3RhdGU6IE5VTEwgCisgICAgICAgICAqLworICAgICAgICBbRkxPV19GU01fRVZFTlRfVFlQRV9VVElMX0FVVE9fTVNHXSA9IGZsb3dfZnNtX251bGxfcHJvY2Vzc191dGlsX2F1dG9fbXNnLAorICAgIH0sCisgICAgW0ZMT1dfRlNNX1NUQVRFX0NPTkZJR1VSSU5HXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHsgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogQ09ORklHVVJJTkcKKyAgICAgICAgICovIAorICAgICAgICBbRkxPV19GU01fRVZFTlRfVFlQRV9BRE1JTl9VUF0gICAgID0gZmxvd19mc21fYWRtaW5fdXBfc3RhcnQsICAgCisKKyAgICAgICAgLyogCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTkZJR1VSSU5HIAorICAgICAgICAgKi8gICAKKyAgICAgICAgW0ZMT1dfRlNNX0VWRU5UX1RZUEVfQURNSU5fRE5dICAgICA9IGZsb3dfZnNtX2FkbWluX2RuX3N0YXJ0LAorCisgICAgICAgIC8qIAorICAgICAgICAgKiBOZXh0IHN0YXRlOiBDT05GSUdVUklORyB8IENPTkZJR1VSRUQgCisgICAgICAgICAqLworICAgICAgICBbRkxPV19GU01fRVZFTlRfVFlQRV9VVElMX01TR10gICAgICA9IGZsb3dfZnNtX3Byb2Nlc3NfdXRpbF9tc2csCisKKyAgICAgICAgLyogCisgICAgICAgICAqIE5leHQgc3RhdGU6IFJFTU9WSU5HCisgICAgICAgICAqLworICAgICAgICBbRkxPV19GU01fRVZFTlRfVFlQRV9SRU1PVkVdICAgICA9IGZsb3dfZnNtX2NsZWFyX3N0YXJ0LAorCisgICAgICAgIC8qIAorICAgICAgICAgKiBOZXh0IHN0YXRlOiBDT05GSUdVUklORyAKKyAgICAgICAgICovCisgICAgICAgIFtGTE9XX0ZTTV9FVkVOVF9UWVBFX1VUSUxfQVVUT19NU0ddID0gZmxvd19mc21fcHJvY2Vzc191dGlsX2F1dG9fbXNnLAorCisgICAgfSwKKworICAgIFtGTE9XX0ZTTV9TVEFURV9DT05GSUdVUkVEXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB7ICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogQ09ORklHVVJFRAorICAgICAgICAgKi8gCisgICAgICAgIFtGTE9XX0ZTTV9FVkVOVF9UWVBFX0FETUlOX1VQXSAgICAgPSBmbG93X2ZzbV9hZG1pbl91cF9zdGFydCwgICAKKworICAgICAgICAvKiAKKyAgICAgICAgICogTmV4dCBzdGF0ZTogQ09ORklHVVJJTkcKKyAgICAgICAgICovICAgCisgICAgICAgIFtGTE9XX0ZTTV9FVkVOVF9UWVBFX0FETUlOX0ROXSAgICAgPSBmbG93X2ZzbV9hZG1pbl9kbl9zdGFydCwKKworICAgICAgICAvKiAKKyAgICAgICAgICogTmV4dCBzdGF0ZTogUkVNT1ZJTkcKKyAgICAgICAgICovCisgICAgICAgIFtGTE9XX0ZTTV9FVkVOVF9UWVBFX1JFTU9WRV0gICAgID0gZmxvd19mc21fY2xlYXJfc3RhcnQsCisKKyAgICAgICAgLyogCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTkZJR1VSSU5HCisgICAgICAgICAqLworICAgICAgICBbRkxPV19GU01fRVZFTlRfVFlQRV9VVElMX01TR10gICAgICA9IGZsb3dfZnNtX3Byb2Nlc3NfdXRpbF9tc2csCisKKyAgICAgICAgLyogCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTkZJR1VSRUQKKyAgICAgICAgICovCisgICAgICAgIFtGTE9XX0ZTTV9FVkVOVF9UWVBFX1VUSUxfQVVUT19NU0ddID0gZmxvd19mc21fcHJvY2Vzc191dGlsX2F1dG9fbXNnLAorCisgICAgfSwKKworICAgIFtGTE9XX0ZTTV9TVEFURV9SRU1PVklOR10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgeyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IFJFTU9WSU5HIAorICAgICAgICAgKi8gCisgICAgICAgIFtGTE9XX0ZTTV9FVkVOVF9UWVBFX0FETUlOX1VQXSAgICAgPSBmbG93X2ZzbV9hZG1pbl91cF9lcnJvciwgICAKKworICAgICAgICAvKiAKKyAgICAgICAgICogTmV4dCBzdGF0ZTogUkVNT1ZJTkcgCisgICAgICAgICAqLyAgIAorICAgICAgICBbRkxPV19GU01fRVZFTlRfVFlQRV9BRE1JTl9ETl0gICAgID0gZmxvd19mc21fYWRtaW5fZG5fZXJyb3IsCisKKyAgICAgICAgIC8qIAorICAgICAgICAgKiBOZXh0IHN0YXRlOiBSRU1PVklORyB8IE5VTEwKKyAgICAgICAgICovCisgICAgICAgIFtGTE9XX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHXSAgICAgID0gZmxvd19mc21fcmVtb3ZpbmdfcHJvY2Vzc191dGlsX21zZywKKworICAgICAgICAvKiAKKyAgICAgICAgICogTmV4dCBzdGF0ZTogUkVNT1ZJTkcgCisgICAgICAgICAqLworICAgICAgICBbRkxPV19GU01fRVZFTlRfVFlQRV9VVElMX0FVVE9fTVNHXSA9IGZsb3dfZnNtX3JlbW92aW5nX3Byb2Nlc3NfdXRpbF9hdXRvX21zZywKKyAgICB9LAorCit9OworCitzdGF0aWMgY2hhciAqc3RhdGVfbmFtZV9zdHJbXSA9IAoreworICAgICJGTE9XX0ZTTV9TVEFURV9OVUxMIiwKKyAgICAiRkxPV19GU01fU1RBVEVfQ09ORklHVVJJTkciLAorICAgICJGTE9XX0ZTTV9TVEFURV9DT05GSUdVUkVEIiwKKyAgICAiRkxPV19GU01fU1RBVEVfUkVNT1ZJTkciLAorfTsKKworLyogRW5zdXJlIHRoYXQgdGhlIG5hbWUgYXJyYXkgc2l6ZSBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIGVudW0gKi8KK0JBTF9TVEFUSUNfQVNTRVJUIChGTE9XX0ZTTV9TVEFURV9fTEFTVCA9PSAoc2l6ZW9mIChzdGF0ZV9uYW1lX3N0cikgLyBzaXplb2YgKGNoYXIgKikpLCBmbG93X2ZzbV9zdGF0ZSk7CisKK3N0YXRpYyBjaGFyICpmbG93X3N0YXRlX25hbWVfZ2V0KGZsb3dfZnNtX3N0YXRlIHN0YXRlKQoreworICAgIGlmKHN0YXRlIDwgRkxPV19GU01fU1RBVEVfX0xBU1QpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGVfbmFtZV9zdHJbc3RhdGVdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gIkZMT1dfVU5LTk9XTiI7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqZXZlbnRfbmFtZV9zdHJbXSA9IAoreworICAgICJGTE9XX0ZTTV9BRE1JTl9VUF9FVkVOVCIsCisgICAgIkZMT1dfRlNNX0FETUlOX0ROX0VWRU5UIiwKKyAgICAiRkxPV19GU01fUkVNT1ZFX0VWRU5UIiwKKyAgICAiRkxPV19GU01fVVRJTF9NU0dfRVZFTlQiLAorICAgICJGTE9XX0ZTTV9VVElMX0FVVE9fTVNHX0VWRU5UIiwKK307CisKKy8qIEVuc3VyZSB0aGF0IHRoZSBuYW1lIGFycmF5IHNpemUgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBlbnVtICovCitCQUxfU1RBVElDX0FTU0VSVCAoRkxPV19GU01fRVZFTlRfVFlQRV9fTEFTVCA9PSAoc2l6ZW9mIChldmVudF9uYW1lX3N0cikgLyBzaXplb2YgKGNoYXIgKikpLCBmbG93X2ZzbV9ldmVudF90eXBlKTsKKworc3RhdGljIGNoYXIgKmZsb3dfZXZlbnRfbmFtZV9nZXQoZmxvd19mc21fZXZlbnRfdHlwZSBldmVudCkKK3sKKyAgICBpZihldmVudCA8IEZMT1dfRlNNX0VWRU5UX1RZUEVfX0xBU1QpCisgICAgeworICAgICAgICByZXR1cm4gZXZlbnRfbmFtZV9zdHJbZXZlbnRdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gIkZMT1dfRVZUX1VOS05PV04iOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBjdXJyZW50X2Zsb3dfaW5mbyBvYmplY3Qgb2YgdGhlIAorICogICAgICAgIHN1cHBsaWVkIGVudHJ5LgorICoKKyAqIEBwYXJhbSBwX2VudHJ5IEEgcG9pbnRlciB0byB0aGUgZW50cnkgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqCisgKgorICogQHJldHVybnMgdm9pZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZmxvd19pbnN0X2VudHJ5X29ial9pbml0KGZsb3dfaW5zdCAqcF9lbnRyeSkKK3sKKyAgICAvKiBUaGUgYWN0dWFsIGtleSBjb250ZW50IGlzIGlycmVsZXZhbnQgZm9yIGZyZWUgZmxvd3MgKi8KKyAgICBiY21iYWxfZmxvd19rZXkga2V5ID0geyAuZmxvd19pZCA9IDAsIC5mbG93X3R5cGUgPSBCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU0gfTsKKworICAgIEJDTUJBTF9DRkdfSU5JVCgmcF9lbnRyeS0+Y3VycmVudF9mbG93X2luZm8sCisgICAgICAgICAgICAgICAgICAgIGZsb3csCisgICAgICAgICAgICAgICAgICAgIGtleSk7CisgICAgICAgIAorICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnBfZW50cnktPmN1cnJlbnRfZmxvd19pbmZvLAorICAgICAgICAgICAgICAgICAgICBmbG93LAorICAgICAgICAgICAgICAgICAgICBhZG1pbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQkFMX1NUQVRFX0RPV04pOworCisgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmcF9lbnRyeS0+Y3VycmVudF9mbG93X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBmbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgb3Blcl9zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfU1RBVFVTX0RPV04pOworICAgICAgICAgICAgCisgICAgQkNNQkFMX09CSl9JTl9QUk9HUkVTU19TRVQoJihwX2VudHJ5LT5jdXJyZW50X2Zsb3dfaW5mbyksIEJDTU9TX0ZBTFNFKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIEZsb3cgRlNNIGluZnJhc3RydWN0dXJlLgorICogIAorICogICAgICAgIE5PVEU6IFRoaXMgaXMgY2FsbGVkIG9uY2Ugb24gc3RhcnR1cCBhbmQgTk9UIGZvciBlYWNoIEZTTSBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gZmxvd19mc21faW5pdCh2b2lkKQoreworICAgIGludCBpaTsKKyAgICBmbG93X2luc3QgKm5ld19lbnRyeTsKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisjaWZkZWYgRU5BQkxFX0xPRworICAgIGxvZ19pZF9mbG93ID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoIkZMT1ciLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICBCVUdfT04obG9nX2lkX2Zsb3cgPT0gREVWX0xPR19JTlZBTElEX0lEKTsKKyNlbmRpZgorCisgICAgLyogSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGZsb3cgcXVldWVzICovCisgICAgVEFJTFFfSU5JVCgmRkxPV19GU01fRkxPV19MSVNUX0NUWF9QVFItPmZyZWVfZmxvd19saXN0KTsKKyAgICBUQUlMUV9JTklUKCZGTE9XX0ZTTV9GTE9XX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX2Zsb3dfbGlzdCk7CisKKyAgICAvKiBQb3B1bGF0ZSB0aGUgZnJlZSBsaXN0IHdpdGggaXQncyBpbml0aWFsIHNldCBvZiBmbG93cworICAgICAqLworICAgIGZvcihpaT0wOyBpaTxGTE9XX0FMTE9DQVRJT05fQkxPQ0tfU0laRTsgaWkrKykKKyAgICB7CisgICAgICAgIAorICAgICAgICBuZXdfZW50cnkgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGZsb3dfaW5zdCkpOworCisgICAgICAgIGlmIChOVUxMID09IG5ld19lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhGQVRBTCwgbG9nX2lkX2Zsb3csICAiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGZsb3cgZnJlZSBsaXN0IC0gRkFUQUxcbiIpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICBmbG93X2ZyZWVfYnlfZW50cnkobmV3X2VudHJ5KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRvIHVuLWluaXRpYWxpemUgdGhlIEZsb3cgRlNNIGluZnJhc3RydWN0dXJlLgorICogIAorICogICAgICAgIE5PVEU6IFRoaXMgaXMgY2FsbGVkIG9uY2Ugb24gc2h1dGRvd24gYW5kIE5PVCBmb3IgZWFjaCBGU00gaW5zdGFuY2UuCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGZsb3dfZnNtX2ZpbmlzaCh2b2lkKQoreworCisgICAgZmxvd19pbnN0ICpjdXJyZW50X2VudHJ5LCAqcF90ZW1wX2VudHJ5OworCisgICAgLyogRnJlZSBhbGwgdGhlIGVudHJpZXMgb24gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksIAorICAgICAgICAgICAgICAgICAgICAgICAmRkxPV19GU01fRkxPV19MSVNUX0NUWF9QVFItPmFjdGl2ZV9mbG93X2xpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICBmbG93X2luc3RfbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgcF90ZW1wX2VudHJ5KQorICAgIHsKKyAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgICAgIFRBSUxRX1JFTU9WRSgmRkxPV19GU01fRkxPV19MSVNUX0NUWF9QVFItPmFjdGl2ZV9mbG93X2xpc3QsIGN1cnJlbnRfZW50cnksIGZsb3dfaW5zdF9uZXh0KTsKKworICAgICAgICBiY21vc19mcmVlKGN1cnJlbnRfZW50cnkpOworCisgICAgfQorCisgICAgLyogRnJlZSBhbGwgdGhlIGVudHJpZXMgb24gdGhlIGZyZWUgbGlzdCAqLworICAgIFRBSUxRX0ZPUkVBQ0hfU0FGRShjdXJyZW50X2VudHJ5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgJkZMT1dfRlNNX0ZMT1dfTElTVF9DVFhfUFRSLT5mcmVlX2Zsb3dfbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5zdF9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBwX3RlbXBfZW50cnkpCisgICAgeworICAgICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgYWN0aXZlIGxpc3QgKi8KKyAgICAgICAgVEFJTFFfUkVNT1ZFKCZGTE9XX0ZTTV9GTE9XX0xJU1RfQ1RYX1BUUi0+ZnJlZV9mbG93X2xpc3QsIGN1cnJlbnRfZW50cnksIGZsb3dfaW5zdF9uZXh0KTsKKworICAgICAgICBiY21vc19mcmVlKGN1cnJlbnRfZW50cnkpOworICAgIH0KKyAgICAgCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBGbG93IEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGV4ZWN1dGl2ZSBmdW5jdGlvbgorICoKKyAqIEBwYXJhbSBwX2Zsb3dfaW5zdCAgUG9pbnRlciB0byBhIGZsb3cgaW5zdGFuY2UKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgUG9pbnRlciB0byBhIGZsb3cgZXZlbnQgc3RydWN0dXJlCisgKiAKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGZsb3dfZnNtX2V4ZWMoZmxvd19pbnN0ICpwX2Zsb3dfaW5zdCwgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBmbG93X2ZzbV9zdGF0ZSBwcmVfc3RhdGU7IAorICAgIGZsb3dfZnNtX3N0YXRlX3Byb2Nlc3NvciBmbG93X3N0YXRlX3Byb2Nlc3NvcjsgICAgIAorCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IHBfZmxvd19pbnN0KTsKKyAgICBCVUdfT04oTlVMTCA9PSBwX2V2ZW50KTsKKworICAgIC8qIFJlY29yZCB0aGUgcHJlc2VudCBzdGF0ZSBmb3IgZGVidWcgcHJpbnRpbmcKKyAgICAgKi8KKyAgICBwcmVfc3RhdGUgPSBwX2Zsb3dfaW5zdC0+ZnNtX3N0YXRlOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gCisgICAgICovCisgICAgZmxvd19zdGF0ZV9wcm9jZXNzb3IgPSBmbG93X3N0YXRlc1twX2Zsb3dfaW5zdC0+ZnNtX3N0YXRlXVtwX2V2ZW50LT5ldmVudF90eXBlXTsKKworICAgIC8qCisgICAgICogSWYgdGhlcmUncyBhIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gZm9yIHRoaXMgZXZlbnQgYW5kIHN0YXRlLCBleGVjdXRlIGl0LgorICAgICAqIE90aGVyd2lzZSwgcHJvY2VzcyBhIGdlbmVyaWMgZXJyb3IuCisgICAgICovCisgICAgaWYgKGZsb3dfc3RhdGVfcHJvY2Vzc29yKQorICAgIHsKKyAgICAgICAgcmV0ID0gZmxvd19zdGF0ZV9wcm9jZXNzb3IocF9mbG93X2luc3QsIHBfZXZlbnQtPm1zZywgcF9ldmVudCk7CisgICAgfSBlbHNlICAgICAgICAKKyAgICB7CisgICAgICAgIGZsb3dfZnNtX3N0YXRlX2VycihwX2Zsb3dfaW5zdCwgcF9ldmVudC0+bXNnLCBwX2V2ZW50KTsKKyAgICB9CisgICAgCisgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgIioqKiBFcnJvciBkZXRlY3RlZCBkdXJpbmcgc3RhdGUgcHJvY2Vzc2luZ1xuIik7CisgICAgICAgIHBfZmxvd19pbnN0LT5mc21fc3RhdGUgPSBwcmVfc3RhdGU7CisgICAgfQorCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2Zsb3csICAiKioqIEV2ZW50ICVzLCBTdGF0ZTogJXMgLS0+ICVzXG5cbiIsCisgICAgICAgICAgICBmbG93X2V2ZW50X25hbWVfZ2V0KHBfZXZlbnQtPmV2ZW50X3R5cGUpLAorICAgICAgICAgICAgZmxvd19zdGF0ZV9uYW1lX2dldChwcmVfc3RhdGUpLCAKKyAgICAgICAgICAgIGZsb3dfc3RhdGVfbmFtZV9nZXQocF9mbG93X2luc3QtPmZzbV9zdGF0ZSkpOyAKKworICAgIHJldHVybiByZXQ7Cit9CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBGbG93IEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZvciBhIGZsb3cgYWRtaW4tdXAgY29tbWFuZCByZWNlaXZlZCAKKyAqICAgICAgICBmcm9tIHRoZSBCQUwgUHVibGljIEFQSSB3aGVuIHRoZSBzcGVjaWZpZWQgZmxvdyBpbnN0YW5jZSBpcyBpbiB0aGUgCisgKiAgICAgICAgYWRtaW4tZG93biBzdGF0ZSAoaS5lLiB3aGVuIHRoZSBmbG93IGluc3RhbmNlIEZTTSBpcyBpbiB0aGUgTlVMTCBzdGF0ZSkuCisgKgorICogQHBhcmFtIHBfZmxvd19pbnN0ICAgICAgUG9pbnRlciB0byBhbiBmbG93IGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZmxvdyBldmVudCBzdHJ1Y3R1cmUKKyAqIAorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fYWRtaW5fdXBfc3RhcnQoZmxvd19pbnN0ICpwX2Zsb3dfaW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgYmNtb3NfYm9vbCBpc19kc19mbG93X3RvX2hvc3QsIGlzX2RzX25fdG9fMTsKKworCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfZmxvdywgICJHb3QgYWRtaW4gVVAgcmVxdWVzdCBmcm9tIEJBTCBBUEkgLSBicmluZ2luZyB1cCBGTE9XXG4iKTsKKworICAgIGRvCisgICAgeworICAgICAgICAvKiBjaGFuZ2UgRmxvdyBzdGF0ZSB0byBDT05GSUdVUklORyAqLworICAgICAgICBwX2Zsb3dfaW5zdC0+ZnNtX3N0YXRlID0gRkxPV19GU01fU1RBVEVfQ09ORklHVVJJTkc7CisKKyAgICAgICAgLyrigJMgQ29yZSBjYWxscyBTd2l0Y2ggVXRpbHMgdG8gYWRkIGFwcGxpY2FibGUgQ01EcyAqLworICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBzd191dGlsX2Zsb3dfc2V0KHBfZmxvd19pbnN0LCBCQUxfVVRJTF9PUEVSX0ZMT1dfQUREKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAgImVycm9yICVzIGRldGVjdGVkIGJ5IHN3aXRjaCB1dGlsIHdoaWxlIGFkZGluZyBmbG93XG4iLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyrigJMgQ29yZSBjYWxscyBNYWMgVXRpbHMgYWRkIGFwcGxpY2FibGUgQ01EcyAqLworICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBtYWNfdXRpbF9mbG93X3NldChwX2Zsb3dfaW5zdCwgQkFMX1VUSUxfT1BFUl9GTE9XX0FERCkpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgICJlcnJvciAlcyBkZXRlY3RlZCBieSBtYWMgdXRpbFxuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisKKyAgICAgICAgICAgIC8qIFJlbW92ZSB0aGUgKGp1c3QgYWRkZWQpIGZsb3cgZnJvbSB0aGUgc3dpdGNoIG90aGVyd2lzZSB0aGUgc3dpdGNoIHV0aWxzIAorICAgICAgICAgICAgICogd2lsbCByZW1lbWJlciBpdCBhbmQgY29tcGxhaW4gd2hlbiB0aGlzIGZsb3cgaXMgYWRkZWQgbGF0ZXIuICBUaGVyZSdzIG5vdAorICAgICAgICAgICAgICogbXVjaCB3ZSBjYW4gZG8gYWJvdXQgaXQgaWYgcmVtb3ZpbmcgdGhpcyBmbG93IGZhaWxzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHN3X3V0aWxfZmxvd19zZXQocF9mbG93X2luc3QsIEJBTF9VVElMX09QRVJfRkxPV19DTEVBUikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csICAKKyAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBkZXRlY3RlZCBieSBzd2l0Y2ggdXRpbCB3aGlsZSByZW1vdmluZyBmbG93XG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgaGFyZHdhcmUgaGFzIHByb3Blcmx5IGFjY2VwdGVkIHRoZSBvYmplY3QgaW5mbywgc28gdGhlIHJlcXVlc3Qgb2JqZWN0IGJlY29tZXMKKyAgICAgICAgICogdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBiY21iYWxfZmxvd19vYmplY3Rfb3ZlcmxheV93X3NyY19wcmlvcml0eSgmcF9mbG93X2luc3QtPmN1cnJlbnRfZmxvd19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvKTsKKyAKKyAgICAgICAgaXNfZHNfZmxvd190b19ob3N0ID0gKEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSA9PSBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8ua2V5LmZsb3dfdHlwZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8sIGZsb3csIGFjdGlvbikgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hY3Rpb24uY21kc19iaXRtYXNrICYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9UUkFQX1RPX0hPU1QpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaXNfZHNfbl90b18xID0gKChCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU0gPT0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmtleS5mbG93X3R5cGUpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJnBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mbywgZmxvdywgZ3JvdXBfaWQpICApKTsKKworCisgICAgICAgIC8qIEFkZCB0aGUgc3ZjX3BvcnRfaWQgcmVjb3JkIHRvIHRoZSBzdWJfdGVybSByZWNvcmQgZm9yIHVwc3RyZWFtIGZsb3dzLCAKKyAgICAgICAgICogb3IgZm9yIGRvd25zdHJlYW0gZmxvd3MgdGhhdCBhcmUgbm90IGRlc3RpbmVkIHRvIHRoZSBob3N0CisgICAgICAgICAqLworICAgICAgICBpZihCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNICAgPT0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmtleS5mbG93X3R5cGUgIHx8CisgICAgICAgICAgIChCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU0gPT0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmtleS5mbG93X3R5cGUgJiYKKyAgICAgICAgICAgICEoaXNfZHNfZmxvd190b19ob3N0KSAmJiAhKGlzX2RzX25fdG9fMSkpKQorICAgIAorICAgICAgICB7CisgICAgICAgICAgICBiY21iYWxfc3ViX3Rlcm1fc3ZjX3BvcnRfaWRfbGlzdF9lbnRyeV9hZGQocF9mbG93X2luc3QtPnBfc3ViX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5zdmNfcG9ydF9pZCk7CisgICAgICAgIH0KKyAKKyAgICAgICAgLyogQWRkIHRoZSBhZ2dfcG9ydF9pZCB0byB0aGUgc3ViX3Rlcm0gcmVjb3JkIChvbmx5IGZvciB1cHN0cmVhbSBmbG93cykgKi8KKyAgICAgICAgaWYoQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSA9PSBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8ua2V5LmZsb3dfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtYmFsX3N1Yl90ZXJtX2FnZ19wb3J0X2lkX2xpc3RfZW50cnlfYWRkKHBfZmxvd19pbnN0LT5wX3N1Yl90ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuYWdnX3BvcnRfaWQpOworICAgICAgICB9CisgCisgICAgICAgIEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfU0VUKCYocF9mbG93X2luc3QtPmN1cnJlbnRfZmxvd19pbmZvKSwgQkNNT1NfVFJVRSk7CisKKyAgICB9d2hpbGUoMCk7CisKKyAgICAvKiBJZiB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgcHJvY2Vzc2luZywgdGhlbiByZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBBUEkgYW5kIGZyZWUgdGhlIGZsb3cgKi8KKyAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICB7CisgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2lkX2Zsb3cpOworCisgICAgICAgIGZsb3dfZnJlZV9ieV9lbnRyeShwX2Zsb3dfaW5zdCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgRmxvdyBGU00gc3RhdGUgcHJvY2Vzc2luZyBmb3IgYSBmbG93IGFkbWluLXVwIGNvbW1hbmQgcmVjZWl2ZWQgCisgKiAgICAgICAgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkgd2hlbiB0aGUgc3BlY2lmaWVkIGZsb3cgRlNNIGlzIGFscmVhZHkgCisgKiAgICAgICAgaW4gdGhlIFJFTU9WSU5HIHN0YXRlLgorICoKKyAqIEBwYXJhbSBwX2Zsb3dfaW5zdCAgICAgIFBvaW50ZXIgdG8gYSBmbG93IGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZmxvdyBldmVudCBzdHJ1Y3R1cmUKKyAqIAorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fYWRtaW5fdXBfZXJyb3IoZmxvd19pbnN0ICpwX2Zsb3dfaW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX1NUQVRFOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2Zsb3csICAKKyAgICAgICAgICAgICJSZWNlaXZlZCBhbiBhZG1pbiBVUCByZXF1ZXN0IGZyb20gQkFMIEFQSSIKKyAgICAgICAgICAgICIgLSByZXR1cm5pbmcgRVJST1IgdG8gdGhlIEFQSSAtIG5vIGZ1cnRoZXIgZnVuY3Rpb25cbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEZsb3cgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZm9yIGEgZmxvdyBhZG1pbi1kb3duIGNvbW1hbmQgCisgKiAgICAgICAgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkgd2hlbiB0aGUgc3BlY2lmaWVkIGZsb3cgaXMKKyAqICAgICAgICBhZG1pbi11cCAoaS5lIHdoZW4gdGhlIHNwZWNpZmllZCBmbG93IGluc3RhbmNlIEZTTSBpcyBpbiB0aGUKKyAqICAgICAgICBDT05GSUdVUkVEIHN0YXRlKS4KKyAqCisgKiBAcGFyYW0gcF9mbG93X2luc3QgICAgICBQb2ludGVyIHRvIGEgZmxvdyBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGEgZmxvdyBldmVudCBzdHJ1Y3R1cmUKKyAqIAorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fYWRtaW5fZG5fc3RhcnQoZmxvd19pbnN0ICpwX2Zsb3dfaW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9mbG93LAorICAgICAgICAgICAgIkdvdCBhZG1pbiBET1dOIHJlcXVlc3QgZnJvbSBCQUwgQVBJIC0gYnJpbmdpbmcgZG93biBGTE9XXG4iKTsKKworICAgIC8qIGNoYW5nZSBGbG93IHN0YXRlIHRvIENPTkZJR1VSSU5HICovCisgICAgcF9mbG93X2luc3QtPmZzbV9zdGF0ZSA9IEZMT1dfRlNNX1NUQVRFX0NPTkZJR1VSSU5HOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8q4oCTIENvcmUgY2FsbHMgU3dpdGNoIFV0aWxzIHRvIHJlbW92ZSBhcHBsaWNhYmxlIENNRHMgKi8KKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gc3dfdXRpbF9mbG93X3NldChwX2Zsb3dfaW5zdCwgQkFMX1VUSUxfT1BFUl9GTE9XX1JFTU9WRSkpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgICJlcnJvciAlcyBkZXRlY3RlZCBieSBzd2l0Y2ggdXRpbFxuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8q4oCTIENvcmUgY2FsbHMgTWFjIFV0aWxzIHJlbW92ZSBhcHBsaWNhYmxlIENNRHMgKi8KKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gbWFjX3V0aWxfZmxvd19zZXQocF9mbG93X2luc3QsIEJBTF9VVElMX09QRVJfRkxPV19SRU1PVkUpKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csICAiZXJyb3IgJXMgZGV0ZWN0ZWQgYnkgbWFjIHV0aWxcbiIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgaGFyZHdhcmUgaGFzIHByb3Blcmx5IGFjY2VwdGVkIHRoZSBvYmplY3QgaW5mbyBidXQgd2UgZG8KKyAgICAgICAgICogbm90IG92ZXJ3cml0ZSB0aGUgY3VycmVudCBmbG93IGRhdGEgYXMgdGhlcmUgaXMgbm90aGluZyBpbiB0aGUgcmVxdWVzdAorICAgICAgICAgKiB0aGF0IGlzIHJlbGV2YW50IGJlc2lkZXMgdGhlIGFkbWluX3N0YXRlCisgICAgICAgICAqLworICAgICAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfZmxvd19pbnN0LT5jdXJyZW50X2Zsb3dfaW5mbyksIEJDTU9TX1RSVUUpOworCisgICAgfXdoaWxlKDApOworICAgIC8qIFJlcG9ydCBhbnkgZXJyb3IgZm91bmQgdG8gdGhlIEFQSSBpbW1lZGlhdGVseSAqLworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgIHsKKyAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfZmxvdyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEZsb3cgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZm9yIGEgZmxvdyBjbGVhciBjb21tYW5kIAorICogICAgICAgIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJLiAKKyAqCisgKiBAcGFyYW0gcF9mbG93X2luc3QgICAgICBQb2ludGVyIHRvIGEgZmxvdyBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGEgZmxvdyBldmVudCBzdHJ1Y3R1cmUKKyAqIAorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fY2xlYXJfc3RhcnQoZmxvd19pbnN0ICpwX2Zsb3dfaW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgdG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZF9pbnN0OworICAgIHVpbnQzMl90IGFsbG9jX3JlZl9jb3VudDsKKyAgICBiY21vc19ib29sIGJfZmxvd19pc19kZXN0aW5lZF90b19ob3N0OworCXRtX3F1ZXVlX2luc3QgKnBfdG1fcXVldWVfaW5zdCA9IE5VTEw7CisgICAgCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfZmxvdywKKyAgICAiR290IENMRUFSIHJlcXVlc3QgZnJvbSBCQUwgQVBJIC0gcmVtb3ZpbmcgRkxPV1xuIik7CisgICAgCisgICAgLyogY2hhbmdlIEZsb3cgc3RhdGUgdG8gUkVNT1ZJTkcgKi8KKyAgICBwX2Zsb3dfaW5zdC0+ZnNtX3N0YXRlID0gRkxPV19GU01fU1RBVEVfUkVNT1ZJTkc7CisKKwkKKwliX2Zsb3dfaXNfZGVzdGluZWRfdG9faG9zdCA9ICgoQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmKHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mbyksIGZsb3csIGFjdGlvbikgJiYgCisJCQkJCQkJCSAgIChwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hY3Rpb24uY21kc19iaXRtYXNrICYgCisJCQkJCQkJCQlCQ01CQUxfQUNUSU9OX0NNRF9JRF9UUkFQX1RPX0hPU1QpKSA/IEJDTU9TX1RSVUUgOiBCQ01PU19GQUxTRSk7CisgICAgZG8KKyAgICB7CisgICAgICAgIC8qQ29yZSBjYWxscyBTd2l0Y2ggVXRpbHMgdG8gY2xlYXIgYXBwbGljYWJsZSBDTURzICovCisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IHN3X3V0aWxfZmxvd19zZXQocF9mbG93X2luc3QsIEJBTF9VVElMX09QRVJfRkxPV19DTEVBUikpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgICJlcnJvciAlcyBkZXRlY3RlZCBieSBzd2l0Y2ggdXRpbFxuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLypDb3JlIGNhbGxzIE1hYyBVdGlscyBjbGVhciBhcHBsaWNhYmxlIENNRHMgKi8KKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gbWFjX3V0aWxfZmxvd19zZXQocF9mbG93X2luc3QsIEJBTF9VVElMX09QRVJfRkxPV19DTEVBUikpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiBlbnRyeSBkb2VzIG5vdCBleGlzdCBmb3IgYSBjbGVhciwgdGhhdCBpcyBmaW5lLCBzaW5jZSBhbnl3YXkgdGhhdCB3b3VsZCBoYXZlIGJlZW4gdGhlIGVuZCBnb2FsICovCisgICAgICAgICAgICBpZiAoQkNNX0VSUl9OT0VOVCAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csICAiZXJyb3IgJXMgZGV0ZWN0ZWQgYnkgbWFjIHV0aWxcbiIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNID09IHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5rZXkuZmxvd190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvKmhhbmRsZSB0aGUgYWxsb2MgaWQgYW5kIGFsbG9jIC0gdG0gc2NoZWQqLworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByc2NfbWdyX2FsbG9jX2lkX2ZyZWUocF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuYWNjZXNzX2ludF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5kYXRhLmFnZ19wb3J0X2lkLCBwX2Zsb3dfaW5zdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csIAorICAgICAgICAgICAgICAgICAgICAiIGVycm9yIGVuY291bnRlcmVkIGR1cmluZyByZWxlYXNlIG9mIGZsb3cgcmVzb3VyY2VzIChhZ2dfcG9ydF9pZDogJWQsIGludGZfaWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5kYXRhLmFjY2Vzc19pbnRfaWQsCisgICAgICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5kYXRhLmFnZ19wb3J0X2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qY2hlY2sgaWYgdG0gc2NoZWQgc2hvdWxkIGJlIHJlbW92ZWQgLSByZWYgY291bnQgPSAxIGFuZCB0bSBzY2hlZCBpcyBhdXRvIGNyZWF0ZWQqLworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gZmxvd190bV9nZXQoJihwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8pLCAmcF90bV9zY2hlZF9pbnN0KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgCisgICAgICAgICAgICAgICAgICAgICIgY291bGQgbm90IGZpbmQgdG0gc2NoZWQgZm9yIGFnZ19wb3J0X2lkOiAlZCwgaW50Zl9pZDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuYWNjZXNzX2ludF9pZCwKKyAgICAgICAgICAgICAgICAgICAgcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuYWdnX3BvcnRfaWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gcnNjX21ncl9hbGxvY19pZF9nZXRfcmVmX2NvdW50KHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5kYXRhLmFjY2Vzc19pbnRfaWQscF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuYWdnX3BvcnRfaWQsICZhbGxvY19yZWZfY291bnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZihCQ01fRVJSX09LID09IHJldAorICAgICAgICAgICAgICAgICYmIEJDTUJBTF9UTV9DUkVBVElPTl9NT0RFX0FVVE8gPT0gcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLmNyZWF0aW9uX21vZGUKKyAgICAgICAgICAgICAgICAmJiAxID09IGFsbG9jX3JlZl9jb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBiY21iYWxfdG1fc2NoZWRfZnNtX2FjdGl2ZV9kZXN0cm95KHBfdG1fc2NoZWRfaW5zdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKmlmIHRoZSBmbG93IGlzIG5vdCBhIGNwdSBmbG93ICh0byBob3N0KSwgc2hvdWxkIGhhbmRsZSBpdCBzY2hlZC9xdWV1ZSBzZXR0aW5nKi8KKyAgICAgICAgaWYoIWJfZmxvd19pc19kZXN0aW5lZF90b19ob3N0KQorICAgICAgICB7CisgICAgICAgICAgICAvKnJlbW92ZSB0aGUgZmxvdyBmcm9tIHRoZSB0aGUgdG0gcXVldWUgbGlzdCovCQkJIAorICAgICAgICAgICAgLypmaW5kIHRtIHF1ZXVlIGluc3RhbmNlKi8KKyAgICAgICAgICAgIHJldCA9IGZsb3dfcXVldWVfdmFsaWRhdGUoJnBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mbywgJnBfdG1fcXVldWVfaW5zdCk7IAorICAgICAgICAKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSAgQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICByZXQgPSBiY21iYWxfdG1fcXVldWVfdXNlX3NldChwX3RtX3F1ZXVlX2luc3QsIEJDTU9TX0ZBTFNFKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgIAl9CisgICAgICAgIAorICAgICAgICAvKiBUaGUgaGFyZHdhcmUgaGFzIHByb3Blcmx5IGFjY2VwdGVkIHRoZSBvYmplY3QgaW5mbywgc28gdGhlIHJlcXVlc3Qgb2JqZWN0IGJlY29tZXMKKyAgICAgICAgKiB0aGUgY3VycmVudCBzdGF0ZSwgZXhjZXB0IGZvciB0aGUgb3Blcl9zdGF0dXMuCisgICAgICAgICovCisgICAgICAgIGJjbWJhbF9mbG93X29iamVjdF9vdmVybGF5X3dfc3JjX3ByaW9yaXR5KCZwX2Zsb3dfaW5zdC0+Y3VycmVudF9mbG93X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8pOworICAgICAgICAKKyAgICAgICAgQkNNQkFMX09CSl9JTl9QUk9HUkVTU19TRVQoJihwX2Zsb3dfaW5zdC0+Y3VycmVudF9mbG93X2luZm8pLCBCQ01PU19UUlVFKTsKKyAgICAgICAgCisgICAgfXdoaWxlKDApOworICAgIAorICAgIC8qIFJlcG9ydCBhbnkgZXJyb3IgZm91bmQgdG8gdGhlIEFQSSBpbW1lZGlhdGVseSAqLworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgIHsKKyAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfZmxvdyk7CisgICAgfQorICAgIAorICAgIHJldHVybiByZXQ7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgRmxvdyBGU00gc3RhdGUgcHJvY2Vzc2luZyBmb3IgYSBmbG93IGFkbWluLWRvd24gY29tbWFuZCAKKyAqICAgICAgICBmcm9tIHRoZSBCQUwgUHVibGljIEFQSSB3aGVuIHRoZSBzcGVjaWZpZWQgZmxvdyBpcyBhbHJlYWR5IAorICogICAgICAgIGFkbWluLWRvd24uCisgKgorICogQHBhcmFtIHBfZmxvd19pbnN0ICAgICAgUG9pbnRlciB0byBhIGZsb3cgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSQorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBmbG93IGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBmbG93X2ZzbV9hZG1pbl9kbl9vayhmbG93X2luc3QgKnBfZmxvd19pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgIAorICAgICAgICAgICAgIlJlY2VpdmVkIGFuIGFkbWluIERPV04gcmVxdWVzdCBmcm9tIEJBTCBBUEkiCisgICAgICAgICAgICAiIC0gcmV0dXJuaW5nIE9LIHRvIHRoZSBBUEkgLSBubyBmdXJ0aGVyIGZ1bmN0aW9uXG4iKTsKKworICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19pZF9mbG93KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgRmxvdyBGU00gc3RhdGUgcHJvY2Vzc2luZyBmb3IgYSBmbG93IGFkbWluLWRvd24gY29tbWFuZCAKKyAqICAgICAgICByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSSB3aGVuIHRoZSBzcGVjaWZpZWQgZmxvdyBGU00gCisgKiAgICAgICAgaXMgaW4gdGhlIENPTkZJR1VSSU5HIHN0YXRlLgorICoKKyAqIEBwYXJhbSBwX2Zsb3dfaW5zdCAgICAgIFBvaW50ZXIgdG8gYSBmbG93IGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYSBmbG93IGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBmbG93X2ZzbV9hZG1pbl9kbl9lcnJvcihmbG93X2luc3QgKnBfZmxvd19pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfU1RBVEU7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgIAorICAgICAgICAgICAgIlJlY2VpdmVkIGFuIGFkbWluIERPV04gcmVxdWVzdCBmcm9tIEJBTCBBUEkiCisgICAgICAgICAgICAiIC0gcmV0dXJuaW5nIEVSUk9SIHRvIHRoZSBBUEkgLSBubyBmdXJ0aGVyIGZ1bmN0aW9uXG4iKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBGbG93IEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRvIGlnbm9yZSBhIHJlY2VpdmVkIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIHBfZmxvd19pbnN0ICAgICAgUG9pbnRlciB0byBhbiBmbG93IGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIHV0aWxzCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGFuIGZsb3cgZXZlbnQgc3RydWN0dXJlCisgKiAKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGZsb3dfZnNtX2lnbm9yZV91dGlsX21zZyhmbG93X2luc3QgKnBfZmxvd19pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgICJJZ25vcmluZyBtZXNzYWdlIGZyb20gQkFMIHV0aWxzXG4iKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgRmxvdyBGU00gc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbiB0byBwcm9jZXNzIGFuICBBVVRPIElORCAKKyAqICAgICAgICBtZXNzYWdlIGZyb20gb25lIG9mIHRoZSBCQUwgYXBwcy4KKyAqCisgKiBAcGFyYW0gcF9mbG93X2luc3QgICAgICBQb2ludGVyIHRvIGEgZmxvdyBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gb25lIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQkFMIGFwcHMuCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGEgZmxvdyBldmVudCBzdHJ1Y3R1cmUKKyAqIAorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fbnVsbF9wcm9jZXNzX3V0aWxfYXV0b19tc2coZmxvd19pbnN0ICpwX2Zsb3dfaW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04oTlVMTCA9PSBwX2Zsb3dfaW5zdCk7CisgICAgQlVHX09OKE5VTEwgPT0gbXNnKTsKKyAgICBCVUdfT04oTlVMTCA9PSBwX2V2ZW50KTsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9mbG93LCAgIlJlY2VpdmVkIGFuIEFVVE8gSU5EIGluIHRoZSBOVUxMIHN0YXRlXG4iKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBGbG93IEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRvIHByb2Nlc3MgYSBtZXNzYWdlIGZyb20gCisgKiAgICAgICAgb25lIG9mIHRoZSBCQUwgYXBwcyByZWNlaXZlZCB3aGVuIHRoZSBzcGVjaWZpZWQgZmxvdyBpbnN0YW5jZSBGU00gCisgKiAgICAgICAgaXMgaW4gdGhlIENPTkZJR1VSSU5HIHN0YXRlLgorICoKKyAqIEBwYXJhbSBwX2Zsb3dfaW5zdCAgICAgIFBvaW50ZXIgdG8gYSBmbG93IGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBvbmUgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBCQUwgYXBwcy4KKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBmbG93X2ZzbV9wcm9jZXNzX3V0aWxfbXNnKGZsb3dfaW5zdCAqcF9mbG93X2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQ7CisgICAgYmFsX3V0aWxfbXNnX2luZCAqaW5kX21zZzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04oTlVMTCA9PSBwX2Zsb3dfaW5zdCk7CisgICAgQlVHX09OKE5VTEwgPT0gbXNnKTsKKyAgICBCVUdfT04oTlVMTCA9PSBwX2V2ZW50KTsKKworICAgIGluZF9tc2cgPSAoYmFsX3V0aWxfbXNnX2luZCAqKW1zZzsKKworICAgIC8qCisgICAgICogTk9URTogQVVUT19JTkQgbWVzc2FnZXMgYXJlIG5vdCBwcm9jZXNzZWQgaW4gdGhpcyBmdW5jdGlvbiwKKyAgICAgKiBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnNpZGVyIHRoZW0gaW4gdGhpcyBsb2dpYy4KKyAgICAgKi8KKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9mbG93LCAKKyAgICAgICAgICAgICIgUmVjZWl2ZWQgYW4gSU5EIG1lc3NhZ2UgZnJvbSBCQUwgVVRJTCAoJXMpIGR1cmluZyAlcyBzdGF0ZVxuIiwKKyAgICAgICAgICAgIHN1YnN5c3RlbV9zdHJbYmNtYmFsX3NlbmRlcl9nZXQobXNnKV0sZmxvd19zdGF0ZV9uYW1lX2dldChwX2Zsb3dfaW5zdC0+ZnNtX3N0YXRlKSk7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgCisgICAgICAgICAgICAiJXMsIHRocmVhZCAlcywgbW9kdWxlICVkXG4iLCBfX0ZVTkNUSU9OX18sIGJjbW9zX3Rhc2tfY3VycmVudCgpLT5uYW1lLCBiY21vc19tb2R1bGVfY3VycmVudCgpKTsKKworICAgIC8qIEhhbmRsZSBpbmRpY2F0aW9uICovCisgICAgcmV0ID0gaW5kX21zZy0+c3RhdHVzOworCisgICAgLyogUmVmbGVjdCB0aGUgZXhlY3V0aW9uIHN0YXR1cyBpbiB0aGUgb2JqZWN0IGJlaW5nIHJldHVybmVkIGluIHRoZSBpbmRpY2F0aW9uCisgICAgICovCisgICAgaWYoQkNNX0VSUl9PSyA9PSByZXQpCisgICAgeworICAgICAgICBwX2Zsb3dfaW5zdC0+Y3VycmVudF9mbG93X2luZm8uZGF0YS5vcGVyX3N0YXR1cyA9CisgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5vcGVyX3N0YXR1czsKKwkJCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBmbG93IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb25maWd1cmVkCisgICAgICAgICAqLworICAgICAgICBwX2Zsb3dfaW5zdC0+ZnNtX3N0YXRlID0gRkxPV19GU01fU1RBVEVfQ09ORklHVVJFRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csICAiRmxvdyAlZDogRmFpbGVkIGluIHN0YXRlICVzLiBFcnJvciAlc1xuIiwKKyAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8ua2V5LmZsb3dfaWQsCisgICAgICAgICAgICAgICAgZmxvd19zdGF0ZV9uYW1lX2dldChwX2Zsb3dfaW5zdC0+ZnNtX3N0YXRlKSwKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICB9CisKKyAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfZmxvd19pbnN0LT5jdXJyZW50X2Zsb3dfaW5mbyksIEJDTU9TX0ZBTFNFKTsKKyAgICBwX2Zsb3dfaW5zdC0+Y3VycmVudF9mbG93X2luZm8uaGRyLmhkci5zdGF0dXMgPSByZXQ7CisKKyAgICAvKgorICAgICAqIFNlbmQgdGhlIGluZGljYXRpb24gYmFjayB0byB0aGUgQkFMIHB1YmxpYyBBUEkgaGVyZQorICAgICAqLworICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2Zsb3dfaW5zdC0+Y3VycmVudF9mbG93X2luZm8uaGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2lkX2Zsb3cpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEZsb3cgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gcHJvY2VzcyBhIG1lc3NhZ2UgZnJvbSAKKyAqICAgICAgICBvbmUgb2YgdGhlIEJBTCBhcHBzIHJlY2VpdmVkIAorICoKKyAqIEBwYXJhbSBwX2Zsb3dfaW5zdCAgICAgIFBvaW50ZXIgdG8gYSBmbG93IGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBvbmUgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBCQUwgYXBwcy4KKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBmbG93X2ZzbV9wcm9jZXNzX3V0aWxfYXV0b19tc2coZmxvd19pbnN0ICpwX2Zsb3dfaW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBiYWxfdXRpbF9tc2dfYXV0b19pbmQgKmluZF9tc2c7CisgICAgCisgICAgCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IHBfZmxvd19pbnN0KTsKKyAgICBCVUdfT04oTlVMTCA9PSBtc2cpOworICAgIEJVR19PTihOVUxMID09IHBfZXZlbnQpOworICAgIAorICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9mbG93LCAgCisgICAgICAgICAgICAiUmVjZWl2ZWQgYW4gQVVUTyBJTkQgbWVzc2FnZSBpbiB0aGUgJXMgc3RhdGVcbiIsCisgICAgICAgICAgICBmbG93X3N0YXRlX25hbWVfZ2V0KHBfZmxvd19pbnN0LT5mc21fc3RhdGUpKTsKKyAgICAKKyAgICBpbmRfbXNnID0gKGJhbF91dGlsX21zZ19hdXRvX2luZCAqKW1zZzsKKyAgICAKKyAgICAvKiBIYW5kbGUgaW5kaWNhdGlvbiAqLworICAgIHJldCA9IGluZF9tc2ctPnN0YXR1czsKKyAgICAKKyAgICBpZihCQ01fRVJSX09LID09IHJldCkKKyAgICB7CisJICAgIC8qIGRhdGEgcmVmbGVjdHMgdGhlIG5ldyBvcGVyX3N0YXR1cyBpbiB0aGUgb2JqZWN0IGJlaW5nIGluZGljYXRlZCAqLworICAgICAgICBtZW1jcHkoJnBfZmxvd19pbnN0LT5jdXJyZW50X2Zsb3dfaW5mby5kYXRhLm9wZXJfc3RhdHVzLCBpbmRfbXNnLT5kYXRhLCBzaXplb2YoYmNtYmFsX3N0YXR1cykpOworICAgICAgICAKKyAgICAgICAgLyogCisgICAgICAgICogU2VuZCB0aGUgaW5kaWNhdGlvbiBiYWNrIHRvIHRoZSBCQUwgcHVibGljIEFQSSBoZXJlCisgICAgICAgICovCisgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAmcF9mbG93X2luc3QtPmN1cnJlbnRfZmxvd19pbmZvLmhkciwgCisgICAgICAgICAgICBsb2dfaWRfZmxvdyk7CisKKwkJCisgICAgICAgIHBfZmxvd19pbnN0LT5mc21fc3RhdGUgPSBGTE9XX0ZTTV9TVEFURV9DT05GSUdVUkVEOworCQkKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEZsb3cgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gcHJvY2VzcyBhCisgKiAgICAgICAgbWVzc2FnZSBmcm9tIG9uZSBvZiB0aGUgQkFMIGFwcHMgcmVjZWl2ZWQgd2hlbiB0aGUgc3BlY2lmaWVkIAorICogICAgICAgIGZsb3cgaW5zdGFuY2UgRlNNIGlzIGluIHRoZSBSRU1PVklORyBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gcF9mbG93X2luc3QgICAgICBQb2ludGVyIHRvIGFuIGZsb3cgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9uZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCBhcHBzLgorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBmbG93IGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBmbG93X2ZzbV9yZW1vdmluZ19wcm9jZXNzX3V0aWxfbXNnKGZsb3dfaW5zdCAqcF9mbG93X2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJhbF91dGlsX21zZ19pbmQgKmluZF9tc2c7CisgICAgYmNtb3NfYm9vbCBpc19kc19mbG93X3RvX2hvc3Q7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IHBfZmxvd19pbnN0KTsKKyAgICBCVUdfT04oTlVMTCA9PSBtc2cpOworICAgIEJVR19PTihOVUxMID09IHBfZXZlbnQpOworCisgICAgaW5kX21zZyA9IChiYWxfdXRpbF9tc2dfaW5kICopbXNnOworCisgICAgLyoKKyAgICAgKiBOT1RFOiBBVVRPX0lORCBtZXNzYWdlcyBhcmUgbm90IHByb2Nlc3NlZCBpbiB0aGlzIGZ1bmN0aW9uLAorICAgICAqIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29uc2lkZXIgdGhlbSBpbiB0aGlzIGxvZ2ljLgorICAgICAqLworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2Zsb3csIAorICAgICAgICAgICAgIiBSZWNlaXZlZCBhbiBJTkQgbWVzc2FnZSBmcm9tIEJBTCBVVElMICglcykgZHVyaW5nIFJFTU9WSU5HIHN0YXRlXG4iLAorICAgICAgICAgICAgc3Vic3lzdGVtX3N0cltiY21iYWxfc2VuZGVyX2dldChtc2cpXSk7CisKKyAgICBkb3sKKworICAgICAgICAvKiBIYW5kbGUgaW5kaWNhdGlvbiAqLworICAgICAgICByZXQgPSBpbmRfbXNnLT5zdGF0dXM7CisgICAgCisgICAgICAgIC8qIFJlZmxlY3QgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgaW4gdGhlIG9iamVjdCBiZWluZyByZXR1cm5lZCBpbiB0aGUgaW5kaWNhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgaWYoQkNNX0VSUl9PSyA9PSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPT0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmtleS5mbG93X3R5cGUgfHwKKyAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSA9PSBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8ua2V5LmZsb3dfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpc19kc19mbG93X3RvX2hvc3QgPSAoQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNID09IHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5rZXkuZmxvd190eXBlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLCBmbG93LCBhY3Rpb24pICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuYWN0aW9uLmNtZHNfYml0bWFzayAmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9DTURfSURfVFJBUF9UT19IT1NUKSkpOworICAgIAorICAgICAgICAgICAgICAgIGlmIChiY21fdG9wb19wb25fZ2V0X3Bvbl9mYW1pbHkocF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuYWNjZXNzX2ludF9pZCkgPT0gQkNNX1RPUE9fUE9OX0ZBTUlMWV9HUE9OKQorICAgICAgICAgICAgICAgIHsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgYXR0ZW1wdCB0byByZWxlYXNlIGEgR0VNIGZvciBhIGRvd25zdHJlYW0gZmxvdyB0aGF0IGlzIFRSQVBfVE9fSE9TVCwgYmVjYXVzZSB0aGVyZQorICAgICAgICAgICAgICAgICAgICAgKiBpcyBubyBzdWJzY3JpYmVyIHRlcm1pbmFsIGludm9sdmVkIGluIHRoaXMgZmxvdyAodGhlcmUgd2FzIG5vIEdFTSBhbGxvY2F0ZWQgZm9yIHRoaXMgZmxvdykuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZihCQ01PU19GQUxTRSA9PSBpc19kc19mbG93X3RvX2hvc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcnNjX21ncl9nZW1fZnJlZShwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hY2Nlc3NfaW50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5kYXRhLnN2Y19wb3J0X2lkLCBwX2Zsb3dfaW5zdCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgcmVsZWFzZSBvZiBmbG93IHJlc291cmNlcyAoc3ZjX3BvcnRfaWQ6ICVkLCBpbnRmX2lkOiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuc3ZjX3BvcnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hY2Nlc3NfaW50X2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAorICAgIAorICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB0aGUgc3ZjX3BvcnRfaWQgcmVjb3JkIGZyb20gdGhlIHN1Yl90ZXJtIHJlY29yZCBmb3IgdXBzdHJlYW0gZmxvd3MsIAorICAgICAgICAgICAgICAgICAqIG9yIGZvciBkb3duc3RyZWFtIGZsb3dzIHRoYXQgYXJlIG5vdCBkZXN0aW5lZCB0byB0aGUgaG9zdAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKChCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNID09IHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5rZXkuZmxvd190eXBlKSB8fAorICAgICAgICAgICAgICAgICAgICgoQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNID09IHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5rZXkuZmxvd190eXBlKSAmJgorICAgICAgICAgICAgICAgICAgICAhKGlzX2RzX2Zsb3dfdG9faG9zdCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX3N1Yl90ZXJtX3N2Y19wb3J0X2lkX2xpc3RfZW50cnlfcmVtb3ZlKHBfZmxvd19pbnN0LT5wX3N1Yl90ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+Y3VycmVudF9mbG93X2luZm8uZGF0YS5zdmNfcG9ydF9pZCk7CisgICAgICAgICAgICAgICAgfQorICAgIAorCQkJICAgIC8qIFJlbW92ZSB0aGUgYWdnX3BvcnRfaWQgZnJvbSB0aGUgc3ViX3Rlcm0gcmVjb3JkIChvbmx5IGZvciB1cHN0cmVhbSBmbG93cykgKi8KKyAgICAJCQlpZihCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNID09IHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5rZXkuZmxvd190eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX3N1Yl90ZXJtX2FnZ19wb3J0X2lkX2xpc3RfZW50cnlfcmVtb3ZlKHBfZmxvd19pbnN0LT5wX3N1Yl90ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+Y3VycmVudF9mbG93X2luZm8uZGF0YS5hZ2dfcG9ydF9pZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+Y3VycmVudF9mbG93X2luZm8uaGRyLmhkci5zdGF0dXMgPSByZXQ7CisgICAgCisgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBwcm9wZXIgc3RhdGUgYW5kIHN0YXR1cyBmb3IgdGhlIGluZGljYXRpb24gYWJvdXQgdG8gYmUgc2VudCAqLworICAgICAgICAgICAgcF9mbG93X2luc3QtPmN1cnJlbnRfZmxvd19pbmZvLmRhdGEuYWRtaW5fc3RhdGUgPSBCQ01CQUxfU1RBVEVfRE9XTjsKKyAgICAgICAgICAgIHBfZmxvd19pbnN0LT5jdXJyZW50X2Zsb3dfaW5mby5kYXRhLm9wZXJfc3RhdHVzID0gQkNNQkFMX1NUQVRVU19ET1dOOworICAgICAgICAgICAgCisgICAgICAgICAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfZmxvd19pbnN0LT5jdXJyZW50X2Zsb3dfaW5mbyksIEJDTU9TX0ZBTFNFKTsKKyAgICAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAqIFNlbmQgdGhlIHN1Y2Nlc3MgaW5kaWNhdGlvbiBiYWNrIHRvIHRoZSBCQUwgcHVibGljIEFQSSBoZXJlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfZmxvd19pbnN0LT5jdXJyZW50X2Zsb3dfaW5mby5oZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19pZF9mbG93KTsKKyAgICAKKyAgICAgICAgICAgIC8qIFJldHVybiB0aGUgZmxvdyB0byB0aGUgZnJlZSBwb29sIHJlZ2FyZGxlc3Mgb2YgdGhlIGVycm9ycyBlbmNvdW50ZXJlZCBhYm92ZSAqLworICAgICAgICAgICAgZmxvd19mcmVlX2J5X2VudHJ5KHBfZmxvd19pbnN0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VuZCB0aGUgZmFpbHVyZSBpbmRpY2F0aW9uIGJhY2sgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGhlcmUKKyAgICAgICAgICovCisgICAgICAgICAgICBtZ210X21zZ19zZW5kX2JhbGFwaV9pbmQocmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2Zsb3dfaW5zdC0+Y3VycmVudF9mbG93X2luZm8uaGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfZmxvdyk7CisgICAgICAgIH0KKyAgICB9d2hpbGUoMCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEZsb3cgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gcHJvY2VzcyBhCisgKiAgICAgICAgQVVUTyBJTkQgbWVzc2FnZSBmcm9tIG9uZSBvZiB0aGUgQkFMIGFwcHMgcmVjZWl2ZWQgd2hlbiB0aGUgc3BlY2lmaWVkIAorICogICAgICAgIGZsb3cgaW5zdGFuY2UgRlNNIGlzIGluIHRoZSBSRU1PVklORyBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gcF9mbG93X2luc3QgICAgICBQb2ludGVyIHRvIGFuIGZsb3cgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9uZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCBhcHBzLgorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBmbG93IGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd19mc21fcmVtb3ZpbmdfcHJvY2Vzc191dGlsX2F1dG9fbXNnKGZsb3dfaW5zdCAqcF9mbG93X2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04oTlVMTCA9PSBwX2Zsb3dfaW5zdCk7CisgICAgQlVHX09OKE5VTEwgPT0gbXNnKTsKKyAgICBCVUdfT04oTlVMTCA9PSBwX2V2ZW50KTsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9mbG93LCAgCisgICAgICAgICAgICAiUmVjZWl2ZWQgYW4gQVVUTyBJTkQgaW4gdGhlIHJlbW92aW5nIHN0YXRlIgorICAgICAgICAgICAgIiAtIG5vIGZ1cnRoZXIgZnVuY3Rpb25cbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEZsb3cgRlNNIGZ1bmN0aW9uIHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW4gYW4gZXJyb3IgCisgKiAgICAgICAgaXMgZW5jb3VudGVyZWQgZHVyaW5nIEZTTSBwcm9jZXNzaW5nLgorICoKKyAqIEBwYXJhbSBwX2Zsb3dfaW5zdCAgICAgIFBvaW50ZXIgdG8gYW4gZmxvdyBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gb25lIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQkFMIGFwcHMuCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGFuIGZsb3cgZXZlbnQgc3RydWN0dXJlCisgKiAKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGZsb3dfZnNtX3N0YXRlX2VycihmbG93X2luc3QgKnBfZmxvd19pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9JTlZBTElEX09QOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2Zsb3csICAKKyAgICAgICAgICAgICJFcnJvciBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIEZMT1cgRlNNIgorICAgICAgICAgICAgIiAtIEJBRCBFVkVOVCAoKVxuIik7CisKKyAgICByZXR1cm4gcmV0OworfQorc3RhdGljIGJjbW9zX2Vycm5vIGZsb3dfcXVldWVfdmFsaWRhdGUoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfY2ZnLCB0bV9xdWV1ZV9pbnN0ICoqcF90bV9xdWV1ZV9pbnN0KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgYmNtYmFsX2ludGVyZmFjZV9rZXkgaW50Zl9rZXk7CisgICAgYmNtYmFsX3RtX3NjaGVkX2tleSB0bV9rZXk7CisgICAgdG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZDsKKyAgICBiY21iYWxfdG1fcXVldWVfa2V5IHF1ZXVlX2tleTsKKyAgICBiY21iYWxfdG1fcXVldWVfcmVmIHF1ZXVlX3JlZjsKKyAgICBiY21vc19ib29sIGlzX2F1dG9fc2V0ID0gQkNNT1NfVFJVRTsKKyAgICAKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYgKEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPT0gcF9mbG93X2NmZy0+a2V5LmZsb3dfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50Zl9rZXkuaW50Zl90eXBlID0gQkNNQkFMX0lOVEZfVFlQRV9OTkk7CisgICAgICAgICAgICB0bV9rZXkuZGlyID0gQkNNQkFMX1RNX1NDSEVEX0RJUl9VUzsKKyAgICAgICAgICAgIGludGZfa2V5LmludGZfaWQgPSBwX2Zsb3dfY2ZnLT5kYXRhLm5ldHdvcmtfaW50X2lkOworICAgICAgICB9ICAgICAgIAorICAgICAgICBlbHNlIC8qQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRU0gb3IgQkNNQkFMX0ZMT1dfVFlQRV9NVUxUSUNBU1QgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50Zl9rZXkuaW50Zl90eXBlID0gQkNNQkFMX0lOVEZfVFlQRV9QT047CisgICAgICAgICAgICB0bV9rZXkuZGlyID0gQkNNQkFMX1RNX1NDSEVEX0RJUl9EUzsKKyAgICAgICAgICAgIGludGZfa2V5LmludGZfaWQgPSBwX2Zsb3dfY2ZnLT5kYXRhLmFjY2Vzc19pbnRfaWQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvd19jZmcsIGZsb3csIHF1ZXVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcXVldWVfcmVmID0gcF9mbG93X2NmZy0+ZGF0YS5xdWV1ZTsKKyAgICAgICAgICAgIGlzX2F1dG9fc2V0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAKKyAgICAgICAgICAgIC8qbG9vayBmb3IgdGhlIGF1dG8gY3JlYXRlZCB0bSBzY2hlZCBhbmQgcXVldWUqLworICAgICAgICAgICAgcmV0ID0gYmNtYmFsX2ludGVyZmFjZV90bV9nZXQoaW50Zl9rZXksICZ0bV9rZXkuaWQpOworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZ2V0IGludGVyZmFjZSBpbnN0YW5jZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgdG8gc2V0IGZsb3cgcXVldWUgcmVmZXJlbmNlIGludGZfa2V5LmludGZfdHlwZSA9ICVkLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgaW50Zl9rZXkuaW50Zl9pZCA9ICVkXG4iLAorCQkJCSAgICBpbnRmX2tleS5pbnRmX3R5cGUsIGludGZfa2V5LmludGZfaWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF90bV9zY2hlZCA9IHRtX3NjaGVkX2luc3RfZ2V0KHRtX2tleSwgVE1fU0NIRURfRkxBR19BQ1RJVkUpOworICAgICAgICAgICAgaWYgKE5VTEwgPT0gcF90bV9zY2hlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgCisgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGdldCB0bSBzY2hlZCBpbnN0YW5jZSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAic2V0IGZsb3cgcXVldWUgcmVmZXJlbmNlIGludGZfa2V5LmludGZfdHlwZSA9ICVkLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgaW50Zl9rZXkuaW50Zl9pZCA9ICVkIHRtX2tleS5kaXIgPSAlc1xuIgorCQkJCSAgICAsaW50Zl9rZXkuaW50Zl90eXBlLCBpbnRmX2tleS5pbnRmX2lkLCBUTV9TQ0hFRF9ESVJfVE9fU1RSKHRtX2tleS5kaXIpKTsKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihCQ01CQUxfVE1fQ1JFQVRJT05fTU9ERV9BVVRPICE9IHBfdG1fc2NoZWQtPmN1cnJlbnRfdG1fc2NoZWRfaW5mby5kYXRhLmNyZWF0aW9uX21vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csIAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbiBub3Qgc2V0IGZsb3cgcXVldWUgcmVmZXJlbmNlIGlmIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIHRtIHNjaGVkIGlzIG5vdCBhdXRvIGNyZWF0ZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnRmX2tleS5pbnRmX3R5cGUgPSAlZCwgaW50Zl9rZXkuaW50Zl9pZCA9ICVkIHRtX2tleS5kaXIgPSAlc1xuIiwKKwkJCQkgICAgaW50Zl9rZXkuaW50Zl90eXBlLCBpbnRmX2tleS5pbnRmX2lkLCBUTV9TQ0hFRF9ESVJfVE9fU1RSKHRtX2tleS5kaXIpKTsKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qaWYgdGhlIHRtIHNjaGVkIGV4aXN0IGFuZCBpdCBpcyBhdXRvIGNyZWF0ZWQsIHF1ZXVlIDAgc2hvdWxkIGJlIHRoZXJlIGFzIHdlbGwqLworICAgICAgICAgICAgcXVldWVfcmVmLnNjaGVkX2lkID0gdG1fa2V5LmlkOworICAgICAgICAgICAgcXVldWVfcmVmLnF1ZXVlX2lkID0gMDsKKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX2Zsb3csIAorICAgICAgICAgICAgICAgICAgICAiZmxvdyB3aWxsIGJlIGFzc2lnbiB0byBxdWV1ZTogbm9kZSBpZD0lZCAiCisgICAgICAgICAgICAgICAgICAgICJub2RlIGRpcj0lcyBxdWV1ZSBpZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICB0bV9rZXkuaWQsIFRNX1NDSEVEX0RJUl9UT19TVFIodG1fa2V5LmRpciksIHF1ZXVlX3JlZi5xdWV1ZV9pZCk7ICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2Zsb3dfY2ZnLCBmbG93LCBxdWV1ZSwgcXVldWVfcmVmKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcXVldWVfa2V5LmlkID0gcXVldWVfcmVmLnF1ZXVlX2lkOworICAgICAgICBxdWV1ZV9rZXkuc2NoZWRfaWQgPSBxdWV1ZV9yZWYuc2NoZWRfaWQ7CisgICAgICAgIHF1ZXVlX2tleS5zY2hlZF9kaXIgPSB0bV9rZXkuZGlyOworICAgICAgICAKKyAgICAgICAgLyp2YWxpZGF0ZSBhIGdpdmVuIHRtIHF1ZXVlIGV4aXN0IGFuZCBtYXRjaCBmbG93IHR5cGUqLworICAgICAgICAqcF90bV9xdWV1ZV9pbnN0ID0gdG1fcXVldWVfaW5zdF9nZXQocXVldWVfa2V5LCBUTV9RVUVVRV9GTEFHX0FDVElWRSk7CisgICAgICAgIGlmIChOVUxMID09ICpwX3RtX3F1ZXVlX2luc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LAorICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgdGhlIHF1ZXVlIHRvIGFzc2lnbiB0aGUgZmxvdyB0byAiCisgICAgICAgICAgICAgICAgICAgICI6dG0gc2NoZWQgZGlyID0gJXMgdG0gc2NoZWQgaWQgPSAlZCBxdWV1ZSBpZCA9ICVkXG4iLAorCQkJICAgIFRNX1NDSEVEX0RJUl9UT19TVFIocXVldWVfa2V5LnNjaGVkX2RpciksIHF1ZXVlX2tleS5zY2hlZF9pZCxxdWV1ZV9rZXkuaWQpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PU19GQUxTRSA9PSBpc19hdXRvX3NldCkKKyAgICAgICAgeworICAgICAgICAgICAgLypzaG91bGQgdmFsaWRhdGUgcXVldWUgaXMgcmVsYXRlZCB0byB0aGUgZmxvdyBpbnRmL3N1Yl90ZXJtL3N1Yl90ZXJtX3VuaSovCisgICAgICAgICAgICB0bV9rZXkuZGlyID0gcXVldWVfa2V5LnNjaGVkX2RpcjsKKyAgICAgICAgICAgIHRtX2tleS5pZCA9ICBxdWV1ZV9rZXkuc2NoZWRfaWQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBfdG1fc2NoZWQgPSB0bV9zY2hlZF9pbnN0X2dldCh0bV9rZXksIFRNX1NDSEVEX0ZMQUdfQUNUSVZFKTsKKyAgICAgICAgICAgIGlmIChOVUxMID09IHBfdG1fc2NoZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csIAorICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBnZXQgdG0gc2NoZWQgaW5zdGFuY2UgdG8gc2V0IGZsb3cgcXVldWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSBpbnRmX2tleS5pbnRmX3R5cGUgPSAlZCwgaW50Zl9rZXkuaW50Zl9pZCA9ICVkIHRtX2tleS5kaXIgID0gJXNcbiIsCisgICAgCQkJICAgIGludGZfa2V5LmludGZfdHlwZSwgaW50Zl9rZXkuaW50Zl9pZCwgVE1fU0NIRURfRElSX1RPX1NUUih0bV9rZXkuZGlyKSk7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmcF90bV9zY2hlZC0+cmVxX3RtX3NjaGVkX2luZm8sdG1fc2NoZWQsb3duZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKHBfdG1fc2NoZWQtPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0lOVEVSRkFDRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfU1VCX1RFUk06CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocF90bV9zY2hlZC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci51LnN1Yl90ZXJtLmludGZfaWQgIT0gcF9mbG93X2NmZy0+ZGF0YS5hY2Nlc3NfaW50X2lkCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwX3RtX3NjaGVkLT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLm93bmVyLnUuc3ViX3Rlcm0uc3ViX3Rlcm1faWQhPSBwX2Zsb3dfY2ZnLT5kYXRhLnN1Yl90ZXJtX2lkKQorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVldWUgcmVmZXJlbmNlZCBieSBmbG93LCBhdHRhY2hlZCB0byB0bSBzY2hlZCBpbnN0YW5jZSB0aGF0IGlzIG93bmVkIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1YiB0ZXJtIGludGZfaWQgPSAlZCBzdWJfdGVybV9pZCA9ICVkIHdoaWxlIGZsb3cgaXMgcmVsYXRlZCB0byBzdWIgdGVybSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnRmX2lkID0gJWQgc3ViX3Rlcm1faWQgPSAlZCB0aGVyZWZvciBjYW5ub3QgYmUgc2V0IGFzIGZsb3cgcXVldWVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90bV9zY2hlZC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci51LnN1Yl90ZXJtLmludGZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90bV9zY2hlZC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci51LnN1Yl90ZXJtLnN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19jZmctPmRhdGEuYWNjZXNzX2ludF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfY2ZnLT5kYXRhLnN1Yl90ZXJtX3VuaV9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9VTkk6CisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAocF90bV9zY2hlZC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci51LnVuaS5pbnRmX2lkICE9IHBfZmxvd19jZmctPmRhdGEuYWNjZXNzX2ludF9pZAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcF90bV9zY2hlZC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci51LnVuaS5zdWJfdGVybV9pZCE9IHBfZmxvd19jZmctPmRhdGEuc3ViX3Rlcm1faWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBfdG1fc2NoZWQtPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXIudS51bmkuaWR4ICE9IHBfZmxvd19jZmctPmRhdGEuc3ViX3Rlcm1fdW5pX2lkeCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVldWUgcmVmZXJlbmNlZCBieSBmbG93ICwgYXR0YWNoZWQgdG8gdG0gc2NoZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2UgdGhhdCBpcyBvd25lZCBieSBzdWIgdGVybSB1bmkgaW50Zl9pZCA9ICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Yl90ZXJtX2lkID0gJWQgdW5pID0gJWQgd2hpbGUgZmxvdyBpcyByZWxhdGVkIHRvIHVuaSBzdWIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVybSBpbnRmX2lkID0gJWQgc3ViX3Rlcm1faWQgPSAlZCB1bmkgPSAlZCB0aGVyZWZvciBjYW5ub3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IGFzIGZsb3cgcXVldWVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90bV9zY2hlZC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci51LnVuaS5pbnRmX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdG1fc2NoZWQtPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXIudS51bmkuc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90bV9zY2hlZC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci51LnVuaS5pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mbG93X2NmZy0+ZGF0YS5hY2Nlc3NfaW50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19jZmctPmRhdGEuc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mbG93X2NmZy0+ZGF0YS5zdWJfdGVybV91bmlfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtIHNjaGVkIGluc3RhbmNlIGlzIG93bmVkIGJ5ICVkIHRoZXJlZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGJlIHNldCBhcyBmbG93IHF1ZXVlXG4iLAorCQkJICAgICAgICAgICAgcF90bV9zY2hlZC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgCisgICAgICAgICAgICAgICAgICAgICJ0bSBzY2hlZCBpbnN0YW5jZSBpcyBub3Qgc2V0IHdpdGggYW4gb3duZXIgdGhlcmVmb3IgIgorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGJlIHNldCBhcyBmbG93IHF1ZXVlIGludGZfa2V5LmludGZfdHlwZSA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICJpbnRmX2tleS5pbnRmX2lkID0gJWQgdG1fa2V5LmRpciA9ICVzXG4iLAorCQkJICAgIGludGZfa2V5LmludGZfdHlwZSwgaW50Zl9rZXkuaW50Zl9pZCwgVE1fU0NIRURfRElSX1RPX1NUUih0bV9rZXkuZGlyKSk7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAgICAKKyAgICAgICAgfQorICAgIH13aGlsZSAoMCk7CisgICAgcmV0dXJuIHJldDsKKworfQorICAgICAgICAgICAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBjb3JlIHdvcmtlciB0aHJlYWQgdG8gcHJvY2VzcyBhbiAKKyAqICAgICAgICBmbG93IG9iamVjdCBtZXNzYWdlIChTRVQsIEdFVCwgQ0xFQVIsIFNUQVRTKSByZWNlaXZlZCAKKyAqICAgICAgICBmcm9tIHRoZSBCQUwgUHVibGljIEFQSS4KKyAqCisgKiBAcGFyYW0gbXNnX3BheWxvYWQgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBCQUwgUHVibGljIEFQSS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBwcm9jZXNzX2Zsb3dfb2JqZWN0KHZvaWQgKm1zZ19wYXlsb2FkKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0ssIHJzcF9yZXQgPSBCQ01fRVJSX09LOworICAgIGJjbWJhbF9mbG93X2NmZyAqcF9mbG93X2NmZyA9IChiY21iYWxfZmxvd19jZmcgKiltc2dfcGF5bG9hZDsKKyAgICBmbG93X2luc3QgKnBfZmxvd19pbnN0ID0gTlVMTDsKKyAgICBmbG93X2ZzbV9ldmVudCBmc21fZXZlbnQ7CisgICAgYmNtYmFsX2Zsb3dfa2V5ICpwX2Zsb3dfa2V5OworICAgIGJjbWJhbF9zdGF0ZSBhZG1pbl9zdGF0ZV9yZXE7CisgICAgYmNtb3NfYm9vbCBiX2Zsb3dfaXNfZGVzdGluZWRfdG9faG9zdDsKKyAgICBiY21iYWxfb2JqX21zZ190eXBlIG9wZXJfdHlwZTsKKyAgICBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgc3ViX3Rlcm1fa2V5OworICAgIHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCA9IE5VTEw7CisgICAgYmNtb3NfYm9vbCBpc19tdWx0aWNhc3QgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc19ib29sIGlzX3VuaWNhc3QgPSBCQ01PU19GQUxTRTsKKyAgICAKKyAgICBiY21vc19ib29sIGlzX3VzX25fdG9fMSA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgaXNfZHNfbl90b18xID0gQkNNT1NfRkFMU0U7CisgICAgCisgICAgdG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0ID0gTlVMTDsgICAgCisJCisgICAgQlVHX09OKE5VTEwgPT0gbXNnX3BheWxvYWQpOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2Zsb3csICAiUHJvY2Vzc2luZyBhIGZsb3cgb2JqZWN0XG4iKTsKKworICAgIHBfZmxvd19rZXkgPSAmcF9mbG93X2NmZy0+a2V5OworCisgICAgb3Blcl90eXBlID0gcF9mbG93X2NmZy0+aGRyLmhkci50eXBlOworCisgICAgaXNfbXVsdGljYXN0ID0gKEJDTUJBTF9GTE9XX1RZUEVfTVVMVElDQVNUID09IHBfZmxvd19rZXktPmZsb3dfdHlwZSk7CisKKyAgICBpc191bmljYXN0ICAgPSAoKEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPT0gcF9mbG93X2tleS0+Zmxvd190eXBlKSB8fCAKKyAgICAgICAgICAgICAgICAgICAgKEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSA9PSBwX2Zsb3dfa2V5LT5mbG93X3R5cGUpKTsgICAgICAgICAgICAgICAgCisKKyAgICBpc191c19uX3RvXzEgPSAoKEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPT0gcF9mbG93X2tleS0+Zmxvd190eXBlKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93X2NmZywgZmxvdywgZ3JvdXBfaWQpKSk7CisKKyAgICBpc19kc19uX3RvXzEgPSAoKEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSA9PSBwX2Zsb3dfa2V5LT5mbG93X3R5cGUpICYmIAorICAgICAgICAgICAgICAgICAgICAoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3dfY2ZnLCBmbG93LCBncm91cF9pZCkgICkpOworCisKKyAgICAvKgorICAgICAqIEEgbWVzc2FnZSBwb2ludGVyIG1heSBiZSBwYXNzZWQgaW5zaWRlIHRoZSBldmVudCBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgZnNtX2V2ZW50Lm1zZyA9IG1zZ19wYXlsb2FkOworCisgICAgLyogU0VUIG9yIEdFVCBvciBDTEVBUi4uLj8gKi8KKyAgICBzd2l0Y2ggKG9wZXJfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgKEJDTUJBTF9PQkpfTVNHX1RZUEVfU0VUKToKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBiX2dlbmVyYXRlX2V2ZW50ID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICBiY21vc19ib29sIGZvdW5kX25ld19mbG93ID0gQkNNT1NfRkFMU0U7CisKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9mbG93LCAKKyAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3NpbmcgYSBmbG93IFNFVCBSRVEgbWdtdCBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihCQ01CQUxfU1RBVFVTX1VQICE9IGFjY190ZXJtX3N0YXR1c19nZXQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVSUk9SIC0gQWNjZXNzLXRlcm1pbmFsIGlzIG5vdCBVUC4gIE5vIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJfZmxvd19pc19kZXN0aW5lZF90b19ob3N0ID0gKChCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvd19jZmcsIGZsb3csIGFjdGlvbikgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwX2Zsb3dfY2ZnLT5kYXRhLmFjdGlvbi5jbWRzX2JpdG1hc2sgJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1RSQVBfVE9fSE9TVCkpID8gQkNNT1NfVFJVRSA6IEJDTU9TX0ZBTFNFKTsKKworICAgICAgICAgICAgICAgIGFkbWluX3N0YXRlX3JlcSA9IHBfZmxvd19jZmctPmRhdGEuYWRtaW5fc3RhdGU7CisKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9mbG93LCAgCisgICAgICAgICAgICAgICAgICAgICAgICAiZmxvdyAlZDolcyByZXF1ZXN0IC0gYWRtaW4gc3RhdGUgcmVxdWVzdGVkIGlzICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcF9mbG93X2tleS0+Zmxvd19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENPUkVfRlNNX0ZMT1dfVFlQRV9HRVRfU1RSKHBfZmxvd19rZXktPmZsb3dfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoQkNNQkFMX1NUQVRFX1VQID09IGFkbWluX3N0YXRlX3JlcSkgPyAiVVAiIDogIkRPV04iKTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRmluZCBvciBjcmVhdGUgdGhlIHNwZWNpZmllZCBmbG93IGluc3RhbmNlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcF9mbG93X2luc3QgPSBmbG93X2luc3RfZ2V0KHBfZmxvd19rZXksIEZMT1dfRkxBR19BTlksICZmb3VuZF9uZXdfZmxvdyk7CisgICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBwX2Zsb3dfaW5zdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYSBmYXRhbCBlcnJvciBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVSUk9SIC0gRmxvdyBub3QgZm91bmQuICBObyBmdXJ0aGVyIHByb2Nlc3NpbmdcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEZpbGwgaW4gdGhlIGxvY2FsIGZsb3cgaW5mbyBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mbyA9ICpwX2Zsb3dfY2ZnOworCisgICAgICAgICAgICAgICAgLyogRm9yIGZsb3dzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCwgbWVyZ2UgdGhlCisgICAgICAgICAgICAgICAgICogcmVxdWVzdGVkIGZsb3cgZGF0YSB3aXRoIHRoZSBjdXJyZW50IGZsb3cgZGF0YSwgYW5kIHRoaXMgcmVzdWx0cyBpbiB0aGUgbmV3IHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoKEJDTU9TX0ZBTFNFID09IGZvdW5kX25ld19mbG93KSAmJiAKKyAgICAgICAgICAgICAgICAgICAocF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEub3Blcl9zdGF0dXMgIT0gcF9mbG93X2luc3QtPmN1cnJlbnRfZmxvd19pbmZvLmRhdGEub3Blcl9zdGF0dXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2Zsb3dfb2JqZWN0X292ZXJsYXlfd19kc3RfcHJpb3JpdHkoJnBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfZmxvd19pbnN0LT5jdXJyZW50X2Zsb3dfaW5mbyk7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfSAKKworICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX2Zsb3csICAKKyAgICAgICAgICAgICAgICAgICAgICAgICJmbG93IGFjY2Vzc19pbnRfaWQ6ICVkLCBzdWJfdGVybV9pZDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hY2Nlc3NfaW50X2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5kYXRhLnN1Yl90ZXJtX2lkKTsKKworICAgICAgICAgICAgICAgIC8qIE5leHQsIGZpbmQgc3ViIHRlcm0gaW5zdGFuY2UsIGlmIGlzIGZsb3cgVVAgKi8KKyAgICAgICAgICAgICAgICBpZiAoQkNNQkFMX1NUQVRFX1VQID09IGFkbWluX3N0YXRlX3JlcSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2tleS5pbnRmX2lkID0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuYWNjZXNzX2ludF9pZDsKKyAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fa2V5LnN1Yl90ZXJtX2lkID0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuc3ViX3Rlcm1faWQ7CisKKyAgICAgICAgICAgICAgICAgICAgcF9zdWJfdGVybV9pbnN0ID0gc3ViX3Rlcm1faW5zdF9nZXQoJnN1Yl90ZXJtX2tleSwgU1VCX1RFUk1fRkxBR19BQ1RJVkUpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghcF9zdWJfdGVybV9pbnN0ICYmICFpc19tdWx0aWNhc3QgJiYgIWlzX2RzX25fdG9fMSAmJiAhYl9mbG93X2lzX2Rlc3RpbmVkX3RvX2hvc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gYWN0aXZlIHN1YnNjcmliZXIgdGVybWluYWwgd2l0aCBpZD0ldSwgYW5kIGZvciBmbG93IHR5cGUgJXMgXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9rZXkuc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SRV9GU01fRkxPV19UWVBFX0dFVF9TVFIocF9mbG93X2tleS0+Zmxvd190eXBlKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qaWYgdGhlIGZsb3cgaXMgbm90IGEgY3B1IGZsb3cgKHRvIGhvc3QpLCB0aGVuIHdlIHNob3VsZCB2YWxpZGF0ZS91c2UgdGhlIHNjaGVkL3F1ZXVlIHNldHRpbmcqLworICAgICAgICAgICAgICAgICAgICBpZighYl9mbG93X2lzX2Rlc3RpbmVkX3RvX2hvc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qZmluZCB0bSBxdWV1ZSBpbnN0YW5jZSovCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBmbG93X3F1ZXVlX3ZhbGlkYXRlKCYocF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvKSwgJnBfdG1fcXVldWVfaW5zdCk7IAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBiY21iYWxfdG1fcXVldWVfdXNlX3NldChwX3RtX3F1ZXVlX2luc3QsIEJDTU9TX1RSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0LT5wX3N1Yl90ZXJtX2luc3QgPSBwX3N1Yl90ZXJtX2luc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFByb2Nlc3MgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZigoKEJDTUJBTF9TVEFURV9VUCA9PSBhZG1pbl9zdGF0ZV9yZXEpIHx8IGZvdW5kX25ld19mbG93KQorICAgICAgICAgICAgICAgICAgICYmIChCQ01CQUxfU1RBVEVfVVAgIT0gcF9mbG93X2luc3QtPmN1cnJlbnRfZmxvd19pbmZvLmRhdGEuYWRtaW5fc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCAgICAgICAgICAgIHN2Y19wb3J0X2lkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZmxvd19pbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICpwX3BlZXJfZmxvdzsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Y19wb3J0X2lkX3JhbmdlOworCisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21fdG9wb19wb25fZ2V0X3Bvbl9mYW1pbHkocF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuYWNjZXNzX2ludF9pZCkgPT0gQkNNX1RPUE9fUE9OX0ZBTUlMWV9HUE9OKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZXJlJ3Mgbm8gbmVlZCB0byBkbyBhbnl0aGluZyB3aXRoIHRoZSBNQUMgaW4gZG93bnN0cmVhbSBmbG93cyB0aGF0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoYXQgYXJlIGRlc3RpbmVkIHRvIHRoZSBob3N0IENQVSAoaS5lLiBOTkktPkNQVSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSA9PSBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8ua2V5LmZsb3dfdHlwZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGJfZmxvd19pc19kZXN0aW5lZF90b19ob3N0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogR0VNIHJlc29sdXRpb24gZG9lcyBub3QgcmVseSBvbiB0aGUgcGJpdHMgaW4gYSBwYWNrZXQsIGhvd2V2ZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IGFsbG9jYXRlIGEgc3ZjX3BvcnRfaWQgcmFuZ2Ugb2YgMS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Y19wb3J0X2lkX3JhbmdlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJcyB0aGVyZSBhIHBlZXIgZmxvdyBjb25maWd1cmVkIGFscmVhZHk/IChvbmx5IHVwc3RyZWFtIGFuZCBkb3duc3RyZWFtIGZsb3dzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYW4gaGF2ZSBhIHBlZXIgZmxvdykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIG5vdCwgbG9vayBpbiB0aGUgYWN0aXZlIGxpc3QgZm9yIGEgbWF0Y2guICBOT1RFOiBJdCBtaWdodCBub3QgYmUgdGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaXNfdW5pY2FzdCAmJiBOVUxMID09IHBfZmxvd19pbnN0LT5wX3BlZXJfZmxvd19pbnN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU2VlIGlmIHdlIGNhbiBmaW5kIGEgcGVlciBmbG93IChhIHBlZXIgZmxvdyBpcyBhIGZsb3cgdGhhdCBoYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBzYW1lIGZsb3cgSUQgYXMgdGhpcyBmbG93IGRvZXMsIGJ1dCBoYXMgdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGluIHRoZSBrZXkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb29rIGZvciBhbiBhY3RpdmUgZmxvdywgYnV0IGlnbm9yZSB0aGUgZGlyZWN0aW9uIChCRVdBUkU6IHdlIG1pZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaW5kIG91cnNlbGYhISkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wZWVyX2Zsb3cgID0gZmxvd19pbnN0X2dldChwX2Zsb3dfa2V5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxPV19GTEFHX0FDVElWRSB8IEZMT1dfRkxBR19JR05PUkVfRElSLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgZmxvdyB0aGF0IHdlIGZvdW5kIGlzbid0IHVzLCB0aGVuIGxpbmsgaXQgdG8gb3VyIGZsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocF9wZWVyX2Zsb3ctPmFwaV9yZXFfZmxvd19pbmZvLmtleS5mbG93X3R5cGUgIT0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8ua2V5LmZsb3dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+cF9wZWVyX2Zsb3dfaW5zdCA9IHBfcGVlcl9mbG93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgYSBwZWVyIGZsb3cgZXhpc3RzLCBjb3B5IHRoZSBHRU0gSUQgZnJvbSB0aGUgcGVlciBmbG93IGludG8gdGhpcyBmbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihOVUxMICE9IHBfZmxvd19pbnN0LT5wX3BlZXJfZmxvd19pbnN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmNfcG9ydF9pZCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0LT5wX3BlZXJfZmxvd19pbnN0LT5jdXJyZW50X2Zsb3dfaW5mby5kYXRhLnN2Y19wb3J0X2lkOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNpbmcgR0VNIElEIGZyb20gcGVlciBmbG93ICglZCkgb24gYWNjZXNzX2lkICVkXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZjX3BvcnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5kYXRhLmFjY2Vzc19pbnRfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXZlbiB0aG91Z2ggd2UgaGF2ZSBnZW0gSWQsIGdldCBpdCBhbGxvY2F0ZWQgYnkgcnNyYyBtZ3Igc28gdGhhdCBpdCBjYW4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtYW5hZ2UgcmVmIGNvdW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcnNjX21ncl9nZW1fYWxsb2NfdW5pY2FzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hY2Nlc3NfaW50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdmNfcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmNfcG9ydF9pZF9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdCk7IC8qIEEgbXVsdGljYXN0IGZsb3cgY2Fubm90IGhhdmUgYSBwZWVyIGZsb3cuIFNvIHRoaXMgbWVhbnMgdGhpcyBpcyBkZWZpbml0ZWx5IG5vdCBhIG11bHRpY2FzdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBbiBlcnJvciBoYXMgb2NjdXJyZWQgdHJ5aW5nIHRvIGdldCBtYW5kYXRvcnkgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgICJGYWlsZWQgdG8gZ2V0IGJhc2UgR0VNIGZyb20gcmVzb3VyY2UgbWFuYWdlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHRvZG8gSWYgdGhlIGZsb3cgaW5zdGFuY2UgKHRoYXQgd2UgZ290KSBpcyBub3QgYWN0aXZlLCB0aGVuIHJldHVybiBpdCB0byB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZnJlZSBwb29sLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIEEgcGVlciBmbG93IGRvZXMgbm90IGV4aXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWRzIHNpbmdsZSBHRU0gZm9yIGZsb3dzIHdoaWNoIGlzIG5vdCBtdWx0aWNhc3QgYW5kIG5vdCBkb3duc3RyZWFtIE46MSBzZXJ2aWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gYW5vdGhlciB3b3JkcywgYWxsIHVwc3RyZWFtIGZsb3dzIGFuZCBkb3duc3RyZWFtIGZsb3dzIHdoaWNoIGlzIG5vdCBOOjEgc2VydmljZSBuZWVkcyBvbmUgR0VNICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighaXNfbXVsdGljYXN0ICYmICFpc19kc19uX3RvXzEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Y19wb3J0X2lkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Y19wb3J0X2lkID0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuc3ZjX3BvcnRfaWQ7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2luZyB0aGUgYmFzZSBHRU0gSUQgc3VwcGxpZWQgYnkgdGhlIHVzZXIgKCVkKSBvbiBhY2Nlc3NfaWQgJWRcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Y19wb3J0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5kYXRhLmFjY2Vzc19pbnRfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2Zsb3csICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0dGluZyBhIG5ldyBiYXNlIEdFTSBJRCBvbiBhY2Nlc3NfaWQgJWQgZnJvbSByZXNvdXJjZSBtYW5hZ2VyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5kYXRhLmFjY2Vzc19pbnRfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmNfcG9ydF9pZCA9IDA7IC8qIDAgaXMgYSBtYWdpYyBudW1iZXIgdGVsbGluZyB0aGUgcmVzb3VyY2UgbWFuYWdlciB0aGF0IGl0IHNob3VsZCBwcm92aWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIGluaXRpYWwgYWxsb2NhdGlvbiBvZiB0aGUgYmFzZSBHRU0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcnNjX21ncl9nZW1fYWxsb2NfdW5pY2FzdChwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hY2Nlc3NfaW50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdmNfcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmNfcG9ydF9pZF9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQW4gZXJyb3IgaGFzIG9jY3VycmVkIHRyeWluZyB0byBnZXQgbWFuZGF0b3J5IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csICAiRmFpbGVkIHRvIGdldCBiYXNlIEdFTSBmcm9tIHJlc291cmNlIG1hbmFnZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEB0b2RvIElmIHRoZSBmbG93IGluc3RhbmNlICh0aGF0IHdlIGdvdCkgaXMgbm90IGFjdGl2ZSwgdGhlbiByZXR1cm4gaXQgdG8gdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmcmVlIHBvb2wuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGUgYWxsIG1lbWJlcnMgaW4gdGhlIGdyb3VwIGFzc29maWNhdGVkIHdpdGggdGhlIGZsb3cgaGFzIGEgR0VNICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8sIGZsb3csIGdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfZ3JvdXBfa2V5IGdyb3VwX2tleTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfZ3JvdXBfb3duZXIgZ3JvdXBfb3duZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfa2V5Lmdyb3VwX2lkID0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuZ3JvdXBfaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNfZHNfbl90b18xIHx8IGlzX3VzX25fdG9fMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9vd25lciA9IEJDTUJBTF9HUk9VUF9PV05FUl9VTklDQVNUOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9vd25lciA9IEJDTUJBTF9HUk9VUF9PV05FUl9NVUxUSUNBU1Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGdyb3VwX293bmVyX3NldChncm91cF9rZXksIGdyb3VwX293bmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciAlcyB3aGlsZSB1cGRhdGluZyBncm91cCBvd25lclxuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIEdFTSBJRCBpbnRvIHRoZSBvYmplY3QgYmVpbmcgcHJvY2Vzc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzdmNfcG9ydF9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLCBmbG93LCBzdmNfcG9ydF9pZCxzdmNfcG9ydF9pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgICJHRU0gJWQgYmVpbmcgdXNlZFxuIiwgc3ZjX3BvcnRfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFsbG9jIElEIGlzIG9ubHkgcmVxdWlyZWQgb24gYW4gVVBTVFJFQU0gRkxPVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSA9PSBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8ua2V5LmZsb3dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworCQkJCQkJCQkJdG1fc2NoZWRfaW5zdCAqIGR1bW15X3BfdG1fc2NoZWRfaW5zdDsKKwkJCQkJCQkJCXJldCA9IGZsb3dfdG1fZ2V0KCZwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8sICZkdW1teV9wX3RtX3NjaGVkX2luc3QpOworCQkJCQkJCQkJCisJCQkJCQkJCQlpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisJCQkJCQkJCQl7CisJCQkJCQkJCQkJLyogQW4gZXJyb3IgaGFzIG9jY3VycmVkIHRyeWluZyB0byBnZXQgbWFuZGF0b3J5IGRhdGEgICovCisJCQkJCQkJCQkJQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csICAiRmFpbGVkIHRvIGdldCByZXF1aXJlZCB0bSBzY2hlZCBmb3IgYWdnIHBvcnQgaWRcbiIpOworCQkJCQkJCQkJCWJyZWFrOwkJCisJCQkJCQkJCQl9CisJCQkJCQkJCQlyZXQgPSByc2NfbWdyX2FsbG9jX2lkX2FsbG9jKCBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hY2Nlc3NfaW50X2lkLCAKKwkJCQkJCQkJCSZwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hZ2dfcG9ydF9pZCwgMSwgcF9mbG93X2luc3QpOworCQkJCQkJCQkJaWYgKEJDTV9FUlJfT0sgIT0gcmV0KQorCQkJCQkJCQkJeworCQkJCQkJCQkJCUJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAgIkZhaWxlZCB0byBnZXQgQUxMT0MgSUQgZnJvbSByZXNvdXJjZSBtYW5hZ2VyXG4iKTsKKwkJCQkJCQkJCQlicmVhazsJCQorCQkJCQkJCQkJfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgICJBTExPQyBJRCAlZCBiZWluZyB1c2VkXG4iLCBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hZ2dfcG9ydF9pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQZXJmb3JtIHRoZSB2YWxpZGF0aW9uIGNoZWNrKHMpIHRoYXQgdGhlIHV0aWxzIHJlcXVpcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IG1hY191dGlsX2Zsb3dfaW5mb192YWxpZGF0ZSgmcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAiRmFpbGVkIG1hYyB2YWxpZGF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmNtX3RvcG9fcG9uX2dldF9wb25fZmFtaWx5KHBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mby5kYXRhLmFjY2Vzc19pbnRfaWQpID09IEJDTV9UT1BPX1BPTl9GQU1JTFlfRVBPTikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGVyZSdzIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgd2l0aCB0aGUgTUFDIGluIGRvd25zdHJlYW0gZmxvd3MgdGhhdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGF0IGFyZSBkZXN0aW5lZCB0byB0aGUgaG9zdCBDUFUgKGkuZS4gTk5JLT5DUFUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPT0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmtleS5mbG93X3R5cGUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShiX2Zsb3dfaXNfZGVzdGluZWRfdG9faG9zdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2tleS5pbnRmX2lkID0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuYWNjZXNzX2ludF9pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fa2V5LnN1Yl90ZXJtX2lkID0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuc3ViX3Rlcm1faWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdWJfdGVybV9pbnN0ID0gc3ViX3Rlcm1faW5zdF9nZXQoJnN1Yl90ZXJtX2tleSwgU1VCX1RFUk1fRkxBR19BQ1RJVkUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcF9zdWJfdGVybV9pbnN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHN1YnNjcmliZXIgdGVybWluYWwgd2l0aCBpZD0ldVxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2tleS5zdWJfdGVybV9pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2V0IHN2Y19wb3J0IHRvIHRoZSBzdWJ0dW5uZWwgaWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8sIGZsb3csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Y19wb3J0X2lkLHBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvLmRhdGEuc3ZjX3BvcnRfaWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFBlcmZvcm0gdGhlIHZhbGlkYXRpb24gY2hlY2socykgdGhhdCB0aGUgdXRpbHMgcmVxdWlyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gbWFjX3V0aWxfZmxvd19pbmZvX3ZhbGlkYXRlKCZwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csICJGYWlsZWQgbWFjIHZhbGlkYXRpb25cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaW4gdGhlIHN3aXRjaCBmb3IgdXBzdHJlYW0gZmxvd3MgdGhhdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoYXQgYXJlIGRlc3RpbmVkIHRvIHRoZSBob3N0IENQVSAoaS5lLiBQT04tPkNQVSksIHNvIG5vIHN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICogdmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoKEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPT0gcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmtleS5mbG93X3R5cGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfZmxvd19pc19kZXN0aW5lZF90b19ob3N0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBzd191dGlsX2Zsb3dfaW5mb192YWxpZGF0ZSgmcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgIkZhaWxlZCBzd2l0Y2ggdmFsaWRhdGlvblxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcF9mbG93X2luc3QtPmN1cnJlbnRfZmxvd19pbmZvLmRhdGEuYWRtaW5fc3RhdGUgPSBCQ01CQUxfU1RBVEVfVVA7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBleHBlY3RlZCBzdGF0ZSBvZiB0aGUgb3Blcl9zdGF0dXMgdXBvbiBzdWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5vcGVyX3N0YXR1cyA9IEJDTUJBTF9TVEFUVVNfVVA7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgZnNtX2V2ZW50LmV2ZW50X3R5cGUgPSBGTE9XX0ZTTV9FVkVOVF9UWVBFX0FETUlOX1VQOworICAgICAgICAgICAgICAgICAgICAgICAgYl9nZW5lcmF0ZV9ldmVudCA9IEJDTU9TX1RSVUU7CisKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSgwKTsKKworICAgICAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19mcmVlX2J5X2VudHJ5KHBfZmxvd19pbnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogTk9URTogVGhpcyBpcyBub3QgYSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRtaW4gZG93biBwcm9jZXNzaW5nLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogQHRvZG8gLSBjb21wbGV0ZSBhZG1pbiBkb3duIHByb2Nlc3NpbmcgCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZWxzZSBpZigoKEJDTUJBTF9TVEFURV9ET1dOID09IGFkbWluX3N0YXRlX3JlcSkgfHwgZm91bmRfbmV3X2Zsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoQkNNQkFMX1NUQVRFX0RPV04gIT0gcF9mbG93X2luc3QtPmN1cnJlbnRfZmxvd19pbmZvLmRhdGEuYWRtaW5fc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9mbG93X2luc3QtPmN1cnJlbnRfZmxvd19pbmZvLmRhdGEuYWRtaW5fc3RhdGUgPSBCQ01CQUxfU1RBVEVfRE9XTjsKKworICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGV4cGVjdGVkIHN0YXRlIG9mIHRoZSBvcGVyX3N0YXR1cyB1cG9uIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgcF9mbG93X2luc3QtPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEub3Blcl9zdGF0dXMgPSBCQ01CQUxfU1RBVFVTX0RPV047CisKKyAgICAgICAgICAgICAgICAgICAgZnNtX2V2ZW50LmV2ZW50X3R5cGUgPSBGTE9XX0ZTTV9FVkVOVF9UWVBFX0FETUlOX0ROOworICAgICAgICAgICAgICAgICAgICBiX2dlbmVyYXRlX2V2ZW50ID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQHRvZG8gaW1wbGVtZW50IGEgTU9ESUZZIGhlcmUgKi8KKworICAgICAgICAgICAgICAgICAgICBicmVhazsgICAvKiBubyBzdGF0ZSBjaGFuZ2UgZGV0ZWN0ZWQgLSBkbyBub3RoaW5nIGZvciBub3cgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH13aGlsZSgwKTsKKworICAgICAgICAgICAgLyogV2UgcmVzcG9uZCB0byB0aGUgQkFMIHB1YmxpYyBBUEkgYmFja2VuZCB3aXRoIGEgcmVzdWx0LiBXZSBhbHdheXMgCisgICAgICAgICAgICAgKiBzZW5kIGEgY29tcGxldGUgbXNnX3BheWxvYWQgYmFjayB0byB0aGUgQVBJLCBidXQgdGhlIGRhdGEgcG9ydGlvbiAKKyAgICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgaXMgb25seSByZWxldmFudCB3aGVuIGEgR0VUIG9yIEdFVC1TVEFUUyBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJzcF9yZXQgPSBtZ210X21zZ19zZW5kX2JhbGFwaV9yc3AocmV0LCBtc2dfcGF5bG9hZCwgb3Blcl90eXBlLCBsb2dfaWRfZmxvdyk7CisKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcnNwX3JldCB8fCBCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB0aGUgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwIGZ1bmN0aW9uIGFib3ZlIGxvZ3MgYW55IGVycm9ycyB0aGF0IG9jY3VyIHRoZXJlICovCisgICAgICAgICAgICAgICAgcmV0ID0gKEJDTV9FUlJfT0sgIT0gcnNwX3JldCkgPyByc3BfcmV0IDogcmV0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgLyogSWYgdGhlcmUgd2FzIGFuIGV2ZW50IGdlbmVyYXRlZCwgY2FsbCB0aGUgc3RhdGUgbWFjaGluZSBleGVjICovCisgICAgICAgICAgICBpZihCQ01PU19UUlVFID09IGJfZ2VuZXJhdGVfZXZlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBSdW4gdGhlIGZsb3cgRlNNIHRvIHByb2Nlc3MgdGhpcyBldmVudAorICAgICAgICAgICAgICAgICAqLworCQkJCXJldCA9IGZsb3dfZnNtX2V4ZWMocF9mbG93X2luc3QsICZmc21fZXZlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIChCQ01CQUxfT0JKX01TR19UWVBFX0dFVCk6CisgICAgICAgIHsKKworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2Zsb3csICAiUHJvY2Vzc2luZyBhIGZsb3cgR0VUIFJFUSBtZ210IG1lc3NhZ2VcbiIpOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKEJDTUJBTF9TVEFUVVNfVVAgIT0gYWNjX3Rlcm1fc3RhdHVzX2dldCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVJST1IgLSBBY2Nlc3MtdGVybWluYWwgaXMgbm90IFVQLiAgTm8gZnVydGhlciBwcm9jZXNzaW5nXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9TVEFURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogRmluZCB0aGUgc3BlY2lmaWVkIGZsb3cgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHBfZmxvd19pbnN0ID0gZmxvd19pbnN0X2dldChwX2Zsb3dfa2V5LCBGTE9XX0ZMQUdfQUNUSVZFLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihOVUxMID09IHBfZmxvd19pbnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9TVEFURSAhPSByZXQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgbm90IGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAgIkVSUk9SIC0gU3BlY2lmaWVkIGZsb3cgKCVkOiVzKSBub3QgZm91bmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19rZXktPmZsb3dfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUkVfRlNNX0ZMT1dfVFlQRV9HRVRfU1RSKHBfZmxvd19rZXktPmZsb3dfdHlwZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogV2UgcmVzcG9uZCB0byB0aGUgQkFMIHB1YmxpYyBBUEkgYmFja2VuZCB3aXRoIGEgcmVzdWx0LiBXZSBhbHdheXMgCisgICAgICAgICAgICAgICAgICogc2VuZCBhIGNvbXBsZXRlIG1zZ19wYXlsb2FkIGJhY2sgdG8gdGhlIEFQSSwgYnV0IHRoZSBkYXRhIHBvcnRpb24gCisgICAgICAgICAgICAgICAgICogb2YgdGhlIG9iamVjdCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gYSBHRVQgb3IgR0VULVNUQVRTIGhhcyBiZWVuIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdC0+Y3VycmVudF9mbG93X2luZm8uaGRyLmhkci5jb21tX2hkciA9ICgoYmNtYmFsX29iaiAqKW1zZ19wYXlsb2FkKS0+Y29tbV9oZHI7CisgICAgICAgICAgICAgICAgKigoYmNtYmFsX2Zsb3dfY2ZnICopbXNnX3BheWxvYWQpID0gcF9mbG93X2luc3QtPmN1cnJlbnRfZmxvd19pbmZvOworCisgICAgICAgICAgICB9IHdoaWxlICgwKTsKKworICAgICAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsIG9wZXJfdHlwZSwgbG9nX2lkX2Zsb3cpOworCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisKKyAgICAgICAgY2FzZSAoQkNNQkFMX09CSl9NU0dfVFlQRV9DTEVBUik6CisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9mbG93LCAgIlByb2Nlc3NpbmcgYSBmbG93IENMRUFSIFJFUSBtZ210IG1lc3NhZ2VcbiIpOworIAorICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihCQ01CQUxfU1RBVFVTX1VQICE9IGFjY190ZXJtX3N0YXR1c19nZXQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVSUk9SIC0gQWNjZXNzLXRlcm1pbmFsIGlzIG5vdCBVUC4gIE5vIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRmluZCB0aGUgc3BlY2lmaWVkIGZsb3cgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwX2Zsb3dfaW5zdCA9IGZsb3dfaW5zdF9nZXQocF9mbG93X2tleSwgRkxPV19GTEFHX0FDVElWRSwgTlVMTCk7CisKKyAgICAgICAgICAgICAgICBpZihOVUxMID09IHBfZmxvd19pbnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csICAiRVJST1IgLSBTcGVjaWZpZWQgZmxvdyAoJWQ6JXMpIG5vdCBmb3VuZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfa2V5LT5mbG93X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUkVfRlNNX0ZMT1dfVFlQRV9HRVRfU1RSKHBfZmxvd19rZXktPmZsb3dfdHlwZSkpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlKDApOworCisgICAgICAgICAgICAvKiBXZSByZXNwb25kIHRvIHRoZSBCQUwgcHVibGljIEFQSSBiYWNrZW5kIHdpdGggYSByZXN1bHQuIFdlIGFsd2F5cyAKKyAgICAgICAgICAgICAqIHNlbmQgYSBjb21wbGV0ZSBtc2dfcGF5bG9hZCBiYWNrIHRvIHRoZSBBUEksIGJ1dCB0aGUgZGF0YSBwb3J0aW9uIAorICAgICAgICAgICAgICogb2YgdGhlIG9iamVjdCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gYSBHRVQgb3IgR0VULVNUQVRTIGhhcyBiZWVuIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcnNwX3JldCA9IG1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChyZXQsIG1zZ19wYXlsb2FkLCBvcGVyX3R5cGUsIGxvZ19pZF9mbG93KTsKKworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByc3BfcmV0IHx8IEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHRoZSBtZ210X21zZ19zZW5kX2JhbGFwaV9yc3AgZnVuY3Rpb24gYWJvdmUgbG9ncyBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgdGhlcmUgKi8KKyAgICAgICAgICAgICAgICByZXQgPSAoQkNNX0VSUl9PSyAhPSByc3BfcmV0KSA/IHJzcF9yZXQgOiByZXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE1lcmdlIHRoZSByZXF1ZXN0ZWQgZmxvdyBkYXRhIHdpdGggdGhlIGN1cnJlbnQgZmxvdyBkYXRhLCAKKyAgICAgICAgICAgICAqIGFuZCB0aGlzIGlzIHRoZSBuZXcgcmVxdWVzdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYmNtYmFsX2Zsb3dfb2JqZWN0X292ZXJsYXlfd19kc3RfcHJpb3JpdHkoJnBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2Zsb3dfaW5zdC0+Y3VycmVudF9mbG93X2luZm8pOyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJ1biB0aGUgZmxvdyBGU00gdG8gcHJvY2VzcyB0aGlzIGV2ZW50CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZzbV9ldmVudC5ldmVudF90eXBlID0gRkxPV19GU01fRVZFTlRfVFlQRV9SRU1PVkU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBmbG93X2ZzbV9leGVjKHBfZmxvd19pbnN0LCAmZnNtX2V2ZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgICJVbnN1cHBvcnRlZCBvcGVyYXRpb24gb24gZmxvdyBvYmplY3QgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgb3Blcl90eXBlICk7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisKKyAgICAgICAgICAgIC8qIFdlIHJlc3BvbmQgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGJhY2tlbmQgd2l0aCBhIHJlc3VsdC4gV2UgYWx3YXlzIAorICAgICAgICAgICAgICogc2VuZCBhIGNvbXBsZXRlIG1zZ19wYXlsb2FkIGJhY2sgdG8gdGhlIEFQSSwgYnV0IHRoZSBkYXRhIHBvcnRpb24gCisgICAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiBhIEdFVCBvciBHRVQtU1RBVFMgaGFzIGJlZW4gcmVxdWVzdGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtZ210X21zZ19zZW5kX2JhbGFwaV9yc3AocmV0LCBtc2dfcGF5bG9hZCwgb3Blcl90eXBlLCBsb2dfaWRfZmxvdyk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2Zsb3csICIlcyByZXR1cm5zIDogJXNcbiIsIF9fRlVOQ1RJT05fXywgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gcHJvY2VzcyBhIGZsb3cgb2JqZWN0IGV2ZW50IHJlY2VpdmVkCisgKiAgICAgICAgZnJvbSBvbmUgb2YgdGhlIEJBTCBhcHBzLgorICoKKyAqIEBwYXJhbSBtc2dfcGF5bG9hZCAgQSBwb2ludGVyIHRvIHRoZSB1dGlsIG1lc3NhZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBwcm9jZXNzX2Zsb3dfdXRpbF9tc2codm9pZCAqbXNnX3BheWxvYWQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBmbG93X2luc3QgKnBfZmxvd19pbnN0OworICAgIGZsb3dfZnNtX2V2ZW50IGZzbV9ldmVudDsKKyAgICBiY21iYWxfbXNnX3R5cGUgdHlwZTsKKyAgICBiY21iYWxfZmxvd19rZXkga2V5OworCisgICAgdHlwZSA9IGJjbWJhbF90eXBlX21pbm9yX2dldChtc2dfcGF5bG9hZCk7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgICJwcm9jZXNzaW5nIGEgZmxvdyAlcyB1dGlsIG1lc3NhZ2UgZnJvbSAlc1xuIiwKKyAgICAgICAgICAgIGJjbWJhbF9tc2dfdF9zdHJbdHlwZV0sCisgICAgICAgICAgICBzdWJzeXN0ZW1fc3RyW2JjbWJhbF9zZW5kZXJfZ2V0KG1zZ19wYXlsb2FkKV0pOworCisgICAgLyogcmVjb3ZlciB0aGUga2V5IGZyb20gdGhlIG1lc3NhZ2UgKi8KKyAgICBrZXkgPSAoKGJhbF91dGlsX21zZ19pbmQgKiltc2dfcGF5bG9hZCktPm9ial9rZXkuZmxvd19rZXk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2Zsb3csICAiR290IGZsb3cga2V5IGlkIGZyb20gdXRpbCBtZXNzYWdlICglZClcbiIsIGtleS5mbG93X2lkKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGZsb3cgaW5zdGFuY2UgdGhhdCdzIGJlaW5nIHJlZmVyZW5jZWQKKyAgICAgICAgICovCisgICAgICAgIGlmKE5VTEwgPT0gKHBfZmxvd19pbnN0ID0gZmxvd19pbnN0X2dldCgma2V5LCBGTE9XX0ZMQUdfQUNUSVZFLCBOVUxMKSkpCisgICAgICAgIHsgIAorICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2Zsb3csICAiaW52YWxpZCBmbG93ICglZCwgJXMpIGZvdW5kIHdoaWxlIHByb2Nlc3NpbmcgYSB1dGlsIG1lc3NhZ2UgZnJvbSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAga2V5LmZsb3dfaWQsCisgICAgICAgICAgICAgICAgICAgIENPUkVfRlNNX0ZMT1dfVFlQRV9HRVRfU1RSKGtleS5mbG93X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICBzdWJzeXN0ZW1fc3RyW2JjbWJhbF9zZW5kZXJfZ2V0KG1zZ19wYXlsb2FkKV0pOworCisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFJlY29yZCB0aGUgbXNnIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgYWNjZXNzCisgICAgICAgICAqLworICAgICAgICBmc21fZXZlbnQubXNnID0gbXNnX3BheWxvYWQ7CisKKyAgICAgICAgaWYgKEJBTF9NU0dfVFlQRV9JTkQgPT0gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgZnNtX2V2ZW50LmV2ZW50X3R5cGUgPSBGTE9XX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEJBTF9NU0dfVFlQRV9BVVRPX0lORCA9PSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBmc21fZXZlbnQuZXZlbnRfdHlwZSA9IEZMT1dfRlNNX0VWRU5UX1RZUEVfVVRJTF9BVVRPX01TRzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAgCisgICAgICAgICAgICAgICAgICAgICJVbmtub3duIG1lc3NhZ2UgdHlwZSByZWNlaXZlZCBmcm9tIHRoZSBVVElMIgorICAgICAgICAgICAgICAgICAgICAiIChub3Qgb25lIG9mIElORDpBVVRPX0lORCkgKHR5cGU6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUnVuIHRoZSBGbG93IEZTTSB0byBwcm9jZXNzIHRoaXMgZXZlbnQKKyAgICAgICAgICovCisgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBmbG93X2ZzbV9leGVjKHBfZmxvd19pbnN0LCAmZnNtX2V2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb25zCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byByZXRyaWV2ZSBhIGZsb3cgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZAorICogICAgICAgIGNsYXNzLgorICoKKyAqIEBwYXJhbSBrZXkgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGtleSBvZiB0aGUgZmxvdyBiZWluZyAKKyAqICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkCisgKiBAcGFyYW0gc2VhcmNoX2ZsYWcgICAgQSBmbGFnIHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgZmxvdworICogICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIHRvIGJlIHJldHJpZXZlZAorICoKKyAqIEBwYXJhbSBpc19uZXdfZmxvdyAgICBBIHJldHVybmVkIHZhbHVlIHNpZ25pZnlpbmcgd2hldGhlciBhIGZvdW5kIGZsb3cgd2FzIG9uIHRoZSBmcmVlIGxpc3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQHJldHVybnMgZmxvd19pbnN0X3QqIEEgcG9pbnRlciB0byB0aGUgZm91bmQgZmxvdyBpbnN0YW5jZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIG9uZSBpcyBub3QgZm91bmQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgZmxvd19pbnN0ICpmbG93X2luc3RfZ2V0KGJjbWJhbF9mbG93X2tleSAqa2V5LCBmbG93X2ZsYWcgc2VhcmNoX2ZsYWcsIGJjbW9zX2Jvb2wgKmlzX25ld19mbG93KQoreworICAgIGZsb3dfaW5zdCAqY3VycmVudF9lbnRyeSA9IE5VTEw7CisKKyAgICBpZihOVUxMICE9IGlzX25ld19mbG93KQorICAgIHsKKyAgICAgICAgKmlzX25ld19mbG93ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGaXJzdCwgY2hlY2sgdGhlIGFjdGl2ZSBsaXN0IGlmIHRoZSBjYWxsZXIgaGFzIGNob3NlbiB0byBkbyBzbworICAgICAqLworICAgIGlmKEZMT1dfRkxBR19BQ1RJVkUgJiBzZWFyY2hfZmxhZykKKyAgICB7CisgICAgICAgIFRBSUxRX0ZPUkVBQ0goY3VycmVudF9lbnRyeSwgCisgICAgICAgICAgICAgICAgICAgICAgJkZMT1dfRlNNX0ZMT1dfTElTVF9DVFhfUFRSLT5hY3RpdmVfZmxvd19saXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICBmbG93X2luc3RfbmV4dCkKKyAgICAgICAgeworIAorICAgICAgICAgICAgaWYoKGN1cnJlbnRfZW50cnktPmFwaV9yZXFfZmxvd19pbmZvLmtleS5mbG93X2lkID09IGtleS0+Zmxvd19pZCkgCisgICAgICAgICAgICAgICAmJiAKKyAgICAgICAgICAgICAgICgoRkxPV19GTEFHX0lHTk9SRV9ESVIgJiBzZWFyY2hfZmxhZykgPyAKKyAgICAgICAgICAgICAgICAxOihjdXJyZW50X2VudHJ5LT5hcGlfcmVxX2Zsb3dfaW5mby5rZXkuZmxvd190eXBlID09IGtleS0+Zmxvd190eXBlKSkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgICJGb3VuZCBhY3RpdmUgZmxvd1xuIik7CisgICAgICAgICAgICAgICAgLyogVGhlIGZsb3cgaW5zdGFuY2UgcG9pbnRlciBpcyBpbiBjdXJyZW50X2VudHJ5ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IAorICAgICAgICAKKyAgICAvKgorICAgICAqIE5leHQsIGNoZWNrIHRoZSBmcmVlIGxpc3QgaWYgdGhlIGNhbGxlciBoYXMgY2hvc2VuIHRvIGRvIHNvCisgICAgICovCisgICAgaWYoKEZMT1dfRkxBR19GUkVFICYgc2VhcmNoX2ZsYWcpICYmIChOVUxMID09IGN1cnJlbnRfZW50cnkpKQorICAgIHsKKyAgICAgICAgLyogTm93IGNoZWNrIHRoZSBmcmVlIGxpc3QgKi8KKyAgICAgICAgaWYoIVRBSUxRX0VNUFRZKCZGTE9XX0ZTTV9GTE9XX0xJU1RfQ1RYX1BUUi0+ZnJlZV9mbG93X2xpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBKdXN0IGdyYWIgdGhlIGZpcnN0IGVudHJ5ICovCisgICAgICAgICAgICBjdXJyZW50X2VudHJ5ID0gVEFJTFFfRklSU1QoJkZMT1dfRlNNX0ZMT1dfTElTVF9DVFhfUFRSLT5mcmVlX2Zsb3dfbGlzdCk7CisKKyAgICAgICAgICAgIC8qIFJlbW92ZSBpdCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KKyAgICAgICAgICAgIFRBSUxRX1JFTU9WRSgmRkxPV19GU01fRkxPV19MSVNUX0NUWF9QVFItPmZyZWVfZmxvd19saXN0LCBjdXJyZW50X2VudHJ5LCBmbG93X2luc3RfbmV4dCk7CisKKyAgICAgICAgICAgIC8qIEFuZCBhZGQgaXQgdG8gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmRkxPV19GU01fRkxPV19MSVNUX0NUWF9QVFItPmFjdGl2ZV9mbG93X2xpc3QsIGN1cnJlbnRfZW50cnksIGZsb3dfaW5zdF9uZXh0KTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEluaXRpYWxpemUgdGhlIGZzbSBzdGF0ZSBhbmQgc29tZSBvZiB0aGUgZmllbGRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGN1cnJlbnRfZW50cnktPmZzbV9zdGF0ZSA9IEZMT1dfRlNNX1NUQVRFX05VTEw7CisgICAgICAgICAgICBjdXJyZW50X2VudHJ5LT5wX3BlZXJfZmxvd19pbnN0ID0gTlVMTDsKKworICAgICAgICAgICAgaWYoTlVMTCAhPSBpc19uZXdfZmxvdykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqaXNfbmV3X2Zsb3cgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgICJVc2luZyBuZXcgZmxvd1xuIik7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKChGTE9XX0ZMQUdfQU5ZICYgc2VhcmNoX2ZsYWcpICYmIChOVUxMID09IGN1cnJlbnRfZW50cnkpKQorICAgIHsKKyAgICAgICAgLypBIGZsb3cgd2FzIG5vdCBmb3VuZCBvbiBlaXRoZXIgbGlzdCAqLworICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgICIqKioqKioqKioqKioqKiBFUlJPUjogbm8gZmxvdyBmb3VuZFxuIik7CisgICAgfQorICAgIAorICAgIHJldHVybiBjdXJyZW50X2VudHJ5OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gcmV0cmlldmUgYSBmbG93IGluc3RhbmNlIGJ5IGFjY2Vzc19pZl9pZCBhbmQgc3ZjX3BvcnRfaWQKKyAqCisgKiBAcGFyYW0gYWNjZXNzX2lmX2lkICAgYWNjZXNzIGludGVyZmFjZSBpZCBvZiB0aGUgZmxvdyBiZWluZyBzZWFyY2hlZAorICogQHBhcmFtIHR5cGUgICAgICAgICAgIGZsb3cgdHlwZSAoZGlyZWN0aW9uKQorICogQHBhcmFtIHN2Y19wb3J0X2lkICAgIHN2Y19wb3J0X2lkIG9mIHRoZSBmbG93IGJlaW5nIHNlYXJjaGVkCisgKgorICogQHJldHVybnMgZmxvd19pbnN0X3QqIEEgcG9pbnRlciB0byB0aGUgZm91bmQgZmxvdyBpbnN0YW5jZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICBvciBOVUxMIGlmIG9uZSBpcyBub3QgZm91bmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Zsb3dfaW5zdCAqZmxvd19nZXRfYnlfc3ZjX2lkKHVpbnQxNl90IGFjY2Vzc19pZl9pZCwgYmNtYmFsX2Zsb3dfdHlwZSB0eXBlLCBiY21iYWxfc2VydmljZV9wb3J0X2lkIHN2Y19wb3J0X2lkKQoreworICAgIGZsb3dfaW5zdCAqY3VycmVudF9lbnRyeSA9IE5VTEw7CisKKyAgICAvKgorICAgICAqIEZpcnN0LCBjaGVjayB0aGUgYWN0aXZlIGxpc3QgaWYgdGhlIGNhbGxlciBoYXMgY2hvc2VuIHRvIGRvIHNvCisgICAgICovCisgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X2VudHJ5LAorICAgICAgICAmRkxPV19GU01fRkxPV19MSVNUX0NUWF9QVFItPmFjdGl2ZV9mbG93X2xpc3QsCisgICAgICAgIGZsb3dfaW5zdF9uZXh0KQorICAgIHsKKworICAgICAgICBpZigoY3VycmVudF9lbnRyeS0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hY2Nlc3NfaW50X2lkID09IGFjY2Vzc19pZl9pZCkKKyAgICAgICAgICAgJiYKKyAgICAgICAgICAgKGN1cnJlbnRfZW50cnktPmFwaV9yZXFfZmxvd19pbmZvLmtleS5mbG93X3R5cGUgPT0gdHlwZSkKKyAgICAgICAgICAgJiYKKyAgICAgICAgICAgKGN1cnJlbnRfZW50cnktPmFwaV9yZXFfZmxvd19pbmZvLmRhdGEuc3ZjX3BvcnRfaWQgPT0gc3ZjX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgZmxvdyBpbnN0YW5jZSBwb2ludGVyIGlzIGluIGN1cnJlbnRfZW50cnkgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGN1cnJlbnRfZW50cnk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgZmxvdyBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIAorICogICAgICAgIGZsb3cgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIGtleSAgICBBIGZsb3cga2V5IAorICoKKyAqIEByZXR1cm5zIGJjbWJhbF9mbG93X2NmZyogQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGZsb3cgaW5mbyBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBmbG93LCBvciBOVUxMIGlmIHRoZSBmbG93IGlzIG5vdCBmb3VuZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtYmFsX2Zsb3dfY2ZnICpmbG93X2dldF9jdXJyZW50X2luZm9fYnlfa2V5KGJjbWJhbF9mbG93X2tleSBrZXkpCit7CisgICAgZmxvd19pbnN0ICpjdXJyZW50X2VudHJ5ID0gTlVMTDsKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIGFjdGl2ZSBsaXN0IAorICAgICAqLworICAgIFRBSUxRX0ZPUkVBQ0goY3VycmVudF9lbnRyeSwKKyAgICAgICAgJkZMT1dfRlNNX0ZMT1dfTElTVF9DVFhfUFRSLT5hY3RpdmVfZmxvd19saXN0LAorICAgICAgICBmbG93X2luc3RfbmV4dCkKKyAgICB7CisKKyAgICAgICAgaWYoKGN1cnJlbnRfZW50cnktPmN1cnJlbnRfZmxvd19pbmZvLmtleS5mbG93X2lkID09IGtleS5mbG93X2lkKQorICAgICAgICAgICAmJgorICAgICAgICAgICAoY3VycmVudF9lbnRyeS0+Y3VycmVudF9mbG93X2luZm8ua2V5LmZsb3dfdHlwZSA9PSBrZXkuZmxvd190eXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIGZsb3cgaW5zdGFuY2UgcG9pbnRlciBpcyBpbiBjdXJyZW50X2VudHJ5ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZihjdXJyZW50X2VudHJ5KQorICAgIHsKKyAgICAgICAgcmV0dXJuICYoY3VycmVudF9lbnRyeS0+Y3VycmVudF9mbG93X2luZm8pOworICAgIH0KKyAgICBlbHNlCisgICAgeyAKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRvIHJldHJpZXZlIGEgZmxvdyBpbnN0YW5jZSBieSBhY2Nlc3NfaWZfaWQgYW5kIGFnZ19wb3J0X2lkCisgKgorICogQHBhcmFtIGFjY2Vzc19pZl9pZCAgIGFjY2VzcyBpbnRlcmZhY2UgaWQgb2YgdGhlIGZsb3cgYmVpbmcgc2VhcmNoZWQKKyAqIEBwYXJhbSBhZ2dfcG9ydF9pZCAgICBzdmNfcG9ydF9pZCBvZiB0aGUgZmxvdyBiZWluZyBzZWFyY2hlZAorICoKKyAqIEByZXR1cm5zIGZsb3dfaW5zdF90KiBBIHBvaW50ZXIgdG8gdGhlIGZvdW5kIGZsb3cgaW5zdGFuY2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiBvbmUgaXMgbm90IGZvdW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitmbG93X2luc3QgKmZsb3dfZ2V0X2J5X2FnZ19pZCh1aW50MTZfdCBhY2Nlc3NfaWZfaWQsIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkIGFnZ19wb3J0X2lkKQoreworICAgIGZsb3dfaW5zdCAqY3VycmVudF9lbnRyeSA9IE5VTEw7CisKKyAgICAvKgorICAgICAqIEZpcnN0LCBjaGVjayB0aGUgYWN0aXZlIGxpc3QgaWYgdGhlIGNhbGxlciBoYXMgY2hvc2VuIHRvIGRvIHNvCisgICAgICovCisgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X2VudHJ5LAorICAgICAgICAmRkxPV19GU01fRkxPV19MSVNUX0NUWF9QVFItPmFjdGl2ZV9mbG93X2xpc3QsCisgICAgICAgIGZsb3dfaW5zdF9uZXh0KQorICAgIHsKKworICAgICAgICBpZigoY3VycmVudF9lbnRyeS0+Y3VycmVudF9mbG93X2luZm8uZGF0YS5hY2Nlc3NfaW50X2lkID09IGFjY2Vzc19pZl9pZCkKKyAgICAgICAgICAgJiYKKyAgICAgICAgICAgKGN1cnJlbnRfZW50cnktPmN1cnJlbnRfZmxvd19pbmZvLmtleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSkKKyAgICAgICAgICAgJiYKKyAgICAgICAgICAgKGN1cnJlbnRfZW50cnktPmN1cnJlbnRfZmxvd19pbmZvLmRhdGEuYWdnX3BvcnRfaWQgPT0gYWdnX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgZmxvdyBpbnN0YW5jZSBwb2ludGVyIGlzIGluIGN1cnJlbnRfZW50cnkgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGN1cnJlbnRfZW50cnk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgZmlyc3QgZmxvdyBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGgKKyAqICAgICAgICBhIHN1YnNjcmliZXIgdGVybWluYWwKKyAqCisgKiBAcGFyYW0gYWNjZXNzX2lmX2lkICAgYWNjZXNzIGludGVyZmFjZSBpZCBvZiB0aGUgZmxvdyBiZWluZyBzZWFyY2hlZAorICogQHBhcmFtIHR5cGUgICAgICAgICAgIGZsb3cgdHlwZSAoZGlyZWN0aW9uKQorICogQHBhcmFtIHN1Yl90ZXJtX2lkICAgIHRoZSBzdWJzY3JpYmVyIHRlcm1pbmFsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmxvdyBiZWluZworICogICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkIAorICogQHBhcmFtIHN1Yl90ZXJtX3VuaSAgIHVuaSBwb3J0IG9uIE9OVQorICoKKyAqIEByZXR1cm5zIGZsb3dfaW5zdF90KiBBIHBvaW50ZXIgdG8gdGhlIGZvdW5kIGZsb3cgaW5zdGFuY2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiBvbmUgaXMgbm90IGZvdW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgZmxvd19pbnN0ICpmbG93X2dldF9maXJzdF9ieV9zdWJfdGVybSh1aW50MTZfdCBhY2Nlc3NfaWZfaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfZmxvd190eXBlIHR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdWJfdGVybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3ViX3Rlcm1fdW5pKQoreworICAgIGZsb3dfaW5zdCAqY3VycmVudF9lbnRyeSA9IE5VTEw7CisgICAgZmxvd19pbnN0ICptYXRjaGVkX2VudHJ5ID0gTlVMTDsKKworICAgIC8qCisgICAgICogRmlyc3QsIGNoZWNrIHRoZSBhY3RpdmUgbGlzdCBpZiB0aGUgY2FsbGVyIGhhcyBjaG9zZW4gdG8gZG8gc28KKyAgICAgKi8KKyAgICBUQUlMUV9GT1JFQUNIKGN1cnJlbnRfZW50cnksCisgICAgICAgICZGTE9XX0ZTTV9GTE9XX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX2Zsb3dfbGlzdCwKKyAgICAgICAgZmxvd19pbnN0X25leHQpCisgICAgeworCisgICAgICAgIGlmKChjdXJyZW50X2VudHJ5LT5jdXJyZW50X2Zsb3dfaW5mby5kYXRhLmFjY2Vzc19pbnRfaWQgPT0gYWNjZXNzX2lmX2lkKQorICAgICAgICAgICAmJgorICAgICAgICAgICAoY3VycmVudF9lbnRyeS0+Y3VycmVudF9mbG93X2luZm8ua2V5LmZsb3dfdHlwZSA9PSB0eXBlKQorICAgICAgICAgICAmJgorICAgICAgICAgICAoY3VycmVudF9lbnRyeS0+Y3VycmVudF9mbG93X2luZm8uZGF0YS5zdWJfdGVybV9pZCA9PSBzdWJfdGVybV9pZCkKKyAgICAgICAgICAgJiYKKyAgICAgICAgICAgKGN1cnJlbnRfZW50cnktPmN1cnJlbnRfZmxvd19pbmZvLmRhdGEuc3ViX3Rlcm1fdW5pX2lkeCA9PSBzdWJfdGVybV91bmkpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgZmxvdyBpbnN0YW5jZSBwb2ludGVyIGlzIGluIGN1cnJlbnRfZW50cnkgKi8KKyAgICAgICAgICAgIG1hdGNoZWRfZW50cnkgPSBjdXJyZW50X2VudHJ5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigoY3VycmVudF9lbnRyeS0+Y3VycmVudF9mbG93X2luZm8uZGF0YS5hY2Nlc3NfaW50X2lkID09IGFjY2Vzc19pZl9pZCkKKyAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgIChjdXJyZW50X2VudHJ5LT5jdXJyZW50X2Zsb3dfaW5mby5rZXkuZmxvd190eXBlID09IHR5cGUpCisgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAoY3VycmVudF9lbnRyeS0+Y3VycmVudF9mbG93X2luZm8uZGF0YS5zdWJfdGVybV9pZCA9PSBzdWJfdGVybV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKE5VTEwgPT0gbWF0Y2hlZF9lbnRyeSkKKyAgICAgICAgICAgICAgICBtYXRjaGVkX2VudHJ5ID0gY3VycmVudF9lbnRyeTsgLyogc3RvcmUgdGhlIGZpcnN0IG1hdGNoZWQgZW50cnkgaXJyZXNwZWN0aXZlIG9mIHVuaSBwb3J0IG1hdGNoICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbWF0Y2hlZF9lbnRyeTsKK30KKworCitiY21vc19lcnJubyBzdmNfcG9ydF9pZF9mb3Jfc3ViX3Rlcm1fZHNfZmxvd19nZXQodWludDE2X3QgYWNjZXNzX2lmX2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdWJfdGVybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdWJfdGVybV91bmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKnN2Y19wb3J0X2lkKQoreworICAgIGZsb3dfaW5zdCAqcF9mbG93X2luc3Q7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIGlmKE5VTEwgPT0gKHBfZmxvd19pbnN0ID0gZmxvd19nZXRfZmlyc3RfYnlfc3ViX3Rlcm0oYWNjZXNzX2lmX2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX3VuaSkpKQorICAgIHsKKyAgICAgICAgcmV0ID0gQkNNX0VSUl9OT0VOVDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnN2Y19wb3J0X2lkID0gcF9mbG93X2luc3QtPmN1cnJlbnRfZmxvd19pbmZvLmRhdGEuc3ZjX3BvcnRfaWQ7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKworfQorCisjaWZkZWYgRlJFRV9GTE9XX0JZX0tFWV9TVVBQT1JURUQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gZnJlZSBhIGZsb3cgaW5zdGFuY2Ugc3BlY2lmaWVkIGJ5IGEgc3VwcGxpZWQga2V5LgorICoKKyAqCisgKiBAcGFyYW0ga2V5IEEgcG9pbnRlciB0byB0aGUga2V5IG9mIHRoZSBzdWJzY3JpYmVyIHRlcm1pbmFsIGluc3RhbmNlIHRvIGJlIGZyZWVkCisgKiAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGZsb3dfZnJlZV9ieV9rZXkoYmNtYmFsX2Zsb3dfa2V5ICprZXkpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBmbG93X2luc3QgKmN1cnJlbnRfZW50cnk7CisgICAgZmxvd19pbnN0ICpwX3RlbXBfZW50cnk7CisKKyAgICBCVUdfT04oTlVMTCA9PSBrZXkpOworCisgICAgLyoKKyAgICAgKiBGaXJzdCwgY2hlY2sgdGhlIGFjdGl2ZSBsaXN0IChhbiBhY3RpdmUgZmxvdyBjYW4gYmUgaW4gdGhlIGFkZGluZyBvciByZW1vdmluZyBzdGF0ZSkKKyAgICAgKi8KKyAgICBUQUlMUV9GT1JFQUNIX1NBRkUoY3VycmVudF9lbnRyeSwgCisgICAgICAgICAgICAgICAgICAgICAgICZGTE9XX0ZTTV9GTE9XX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX2Zsb3dfbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfaW5zdF9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBwX3RlbXBfZW50cnkpCisgICAgeworICAgICAgICBpZigoY3VycmVudF9lbnRyeS0+YXBpX3JlcV9mbG93X2luZm8ua2V5LmZsb3dfaWQgPT0ga2V5LT5mbG93X2lkKSAmJgorICAgICAgICAgICAoY3VycmVudF9lbnRyeS0+YXBpX3JlcV9mbG93X2luZm8ua2V5LmZsb3dfdHlwZSA9PSBrZXktPmZsb3dfdHlwZSkpCisgICAgICAgIHsKKworICAgICAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgICAgICAgICBUQUlMUV9SRU1PVkUoJkZMT1dfRlNNX0ZMT1dfTElTVF9DVFhfUFRSLT5hY3RpdmVfZmxvd19saXN0LCBjdXJyZW50X2VudHJ5LCBmbG93X2luc3RfbmV4dCk7CisKKyAgICAgICAgICAgIC8qIEFuZCBhZGQgaXQgdG8gdGhlIGZyZWUgbGlzdCAqLworICAgICAgICAgICAgY3VycmVudF9lbnRyeS0+ZnNtX3N0YXRlID0gRkxPV19GU01fU1RBVEVfTlVMTDsKKyAgICAgICAgICAgIGN1cnJlbnRfZW50cnktPnBfc3ViX3Rlcm1fZnNtID0gTlVMTDsKKyAgICAgICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZGTE9XX0ZTTV9GTE9XX0xJU1RfQ1RYX1BUUi0+ZnJlZV9mbG93X2xpc3QsIGN1cnJlbnRfZW50cnksIGZsb3dfaW5zdF9uZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRvIGZyZWUgYSBmbG93IGluc3RhbmNlIHNwZWNpZmllZCBieSBhIHRoZSBzdXBwbGllZCAKKyAqICAgICAgICBlbnRyeSBwb2ludGVyLgorICoKKyAqIEBwYXJhbSBwX2VudHJ5IEEgcG9pbnRlciB0byB0aGUgZW50cnkgdG8gYmUgZnJlZWQKKyAqICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGZsb3dfZnJlZV9ieV9lbnRyeShmbG93X2luc3QgKnBfZW50cnkpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBmbG93X2luc3QgKmN1cnJlbnRfZW50cnk7CisgICAgZmxvd19pbnN0ICpwX3RlbXBfZW50cnk7CisKKyAgICAvKgorICAgICAqIEZpcnN0LCBjaGVjayB0aGUgYWN0aXZlIGxpc3QgKGFuIGFjdGl2ZSBmbG93IGNhbiBiZSBpbiB0aGUgYWRkaW5nIG9yIHJlbW92aW5nIHN0YXRlKQorICAgICAqLworICAgIFRBSUxRX0ZPUkVBQ0hfU0FGRShjdXJyZW50X2VudHJ5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgJkZMT1dfRlNNX0ZMT1dfTElTVF9DVFhfUFRSLT5hY3RpdmVfZmxvd19saXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvd19pbnN0X25leHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBfdGVtcF9lbnRyeSkKKyAgICB7CisgICAgICAgIGlmKGN1cnJlbnRfZW50cnkgPT0gcF9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgYWN0aXZlIGxpc3QgKi8KKyAgICAgICAgICAgIFRBSUxRX1JFTU9WRSgmRkxPV19GU01fRkxPV19MSVNUX0NUWF9QVFItPmFjdGl2ZV9mbG93X2xpc3QsIGN1cnJlbnRfZW50cnksIGZsb3dfaW5zdF9uZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICAvKiBBbmQgYWRkIGl0IHRvIHRoZSBmcmVlIGxpc3QgKi8KKyAgICBwX2VudHJ5LT5mc21fc3RhdGUgPSBGTE9XX0ZTTV9TVEFURV9OVUxMOworICAgICAgICAgICAgCisgICAgLyogQW5kIGluaXRpYWxpemUgdGhlIGN1cnJlbnQgb2JqZWN0IGluIHRoZSBmbG93IGluc3RhbmNlICovCisgICAgZmxvd19pbnN0X2VudHJ5X29ial9pbml0KHBfZW50cnkpOworCisgICAgVEFJTFFfSU5TRVJUX1RBSUwoJkZMT1dfRlNNX0ZMT1dfTElTVF9DVFhfUFRSLT5mcmVlX2Zsb3dfbGlzdCwgcF9lbnRyeSwgZmxvd19pbnN0X25leHQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGZsb3dfdG1fYXV0b19jcmVhdGUoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfaW5mbywgdG1fc2NoZWRfaW5zdCAqKnBfdG1fc2NoZWRfaW5zdCkKK3sKKyAgCWJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgIAliY21iYWxfdG1fc2NoZWRfY2ZnIHRtX3NjaGVkX2RlZmF1bHRfY2ZnOworICAgIGJjbWJhbF90bV9zY2hlZF9vd25lciBvd25lcjsJCisgICAgYmNtYmFsX3RtX3NjaGVkX2tleSB0bV9zY2hlZF9rZXk7CisgICAgZG8KKyAgICB7CisgICAgICAgIHRtX3NjaGVkX2tleS5kaXIgPSBCQ01CQUxfVE1fU0NIRURfRElSX1VTOworICAgICAgICBCQ01CQUxfQ0ZHX0lOSVQoJnRtX3NjaGVkX2RlZmF1bHRfY2ZnLCB0bV9zY2hlZCwgdG1fc2NoZWRfa2V5KTsKKyAgICAgICAgb3duZXIudHlwZSA9IEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0FHR19QT1JUOworICAgICAgICBvd25lci51LmFnZ19wb3J0LmludGZfaWQgPSBwX2Zsb3dfaW5mby0+ZGF0YS5hY2Nlc3NfaW50X2lkOworICAgICAgICBvd25lci51LmFnZ19wb3J0LnN1Yl90ZXJtX2lkID0gcF9mbG93X2luZm8tPmRhdGEuc3ViX3Rlcm1faWQ7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnRtX3NjaGVkX2RlZmF1bHRfY2ZnLCB0bV9zY2hlZCwgb3duZXIsIG93bmVyKTsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmdG1fc2NoZWRfZGVmYXVsdF9jZmcsIHRtX3NjaGVkLCBjcmVhdGlvbl9tb2RlLCBCQ01CQUxfVE1fQ1JFQVRJT05fTU9ERV9BVVRPKTsKKyAgICAgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3dfaW5mbyxmbG93LHNsYSkpCisgICAgICAgIHsgICAgCisgICAgICAgICAgICBCQ01CQUxfQVRUUklCVVRFX1BST1BfU0VUKCYodG1fc2NoZWRfZGVmYXVsdF9jZmcuZGF0YS5yYXRlKSx0bV9zaGFwaW5nLCBzYnIsIHBfZmxvd19pbmZvLT5kYXRhLnNsYS5taW5fcmF0ZSk7CisgICAgICAgICAgICBCQ01CQUxfQVRUUklCVVRFX1BST1BfU0VUKCYodG1fc2NoZWRfZGVmYXVsdF9jZmcuZGF0YS5yYXRlKSx0bV9zaGFwaW5nLCBwYnIsIHBfZmxvd19pbmZvLT5kYXRhLnNsYS5tYXhfcmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gKHJldCA9IGJjbWJhbF90bV9zY2hlZF9hdXRvX2NyZWF0ZSh0bV9zY2hlZF9kZWZhdWx0X2NmZywgcF90bV9zY2hlZF9pbnN0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9mbG93LCAiQ291bGQgbm90IGNyZWF0ZSB0aGUgYXV0byB0bSBzY2hlZFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZmxvd190bV9nZXQoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfaW5mbywgdG1fc2NoZWRfaW5zdCAqKnBfdG1fc2NoZWRfaW5zdCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGRvCisgICAgeworICAgICAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdnX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZmxvdywgIAorICAgICAgICAgICAgICAgICAgICAiVXNpbmcgQUxMT0MgSUQgc3VwcGxpZWQgYnkgdGhlIHVzZXIgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcF9mbG93X2luZm8tPmRhdGEuYWdnX3BvcnRfaWQgKTsKKwkJCisgICAgICAgICAgICAqcF90bV9zY2hlZF9pbnN0ID0gdG1fc2NoZWRfZmluZF9hZ2dfcG9ydF9ub2RlKHBfZmxvd19pbmZvLT5kYXRhLmFjY2Vzc19pbnRfaWQsIHBfZmxvd19pbmZvLT5kYXRhLmFnZ19wb3J0X2lkKTsKKyAgICAgICAgICAgIGlmKE5VTEwgPT0gKnBfdG1fc2NoZWRfaW5zdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgIAorICAgICAgICAgICAgICAgICAgICAgICAgImFnZyBwb3J0ICVkIChpbnRmIGlkICVkIHN1YiB0ZXJtIGlkICVkICkgaGFzIG5vIHRtIHNjaGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcF9mbG93X2luZm8tPmRhdGEuYWdnX3BvcnRfaWQsIHBfZmxvd19pbmZvLT5kYXRhLmFjY2Vzc19pbnRfaWQsIHBfZmxvd19pbmZvLT5kYXRhLnN1Yl90ZXJtX2lkKTsKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwX2Zsb3dfaW5mby0+ZGF0YS5zdWJfdGVybV9pZCAhPSAoKnBfdG1fc2NoZWRfaW5zdCktPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXIudS5hZ2dfcG9ydC5zdWJfdGVybV9pZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgIAorICAgICAgICAgICAgICAgICAgICAgICAgImFnZyBwb3J0ICVkIChpbnRmIGlkICVkKSBpcyBhbHJlYWR5IGFzc2lnbiB0byBzdWIgdGVybSAlZCAobm90ICVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5mby0+ZGF0YS5hZ2dfcG9ydF9pZCwgcF9mbG93X2luZm8tPmRhdGEuYWNjZXNzX2ludF9pZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAoKnBfdG1fc2NoZWRfaW5zdCktPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXIudS5hZ2dfcG9ydC5zdWJfdGVybV9pZCwgCisgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfaW5mby0+ZGF0YS5zdWJfdGVybV9pZCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworCSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgIAl9CisgICAgICAgIGVsc2UKKyAgICAJeworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2Zsb3csICAiR2V0dGluZyBhIG5ldyBBTExPQyBJRCBmcm9tIHJlc291cmNlIG1hbmFnZXJcbiIpOworICAgICAgICAgICAgLypjcmVhdGUgYSBuZXcgYWdnIHBvcnQgdG0gYW5kIGFsbG9jYXRlIGEgbmV3IGFnZyBwb3J0IGlkICovICAKKyAgICAgICAgICAgIHJldCA9IGZsb3dfdG1fYXV0b19jcmVhdGUocF9mbG93X2luZm8sIHBfdG1fc2NoZWRfaW5zdCk7CisgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZmxvdywgIAorICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBjcmVhdGUgdGhlIGF1dG8gdG0gc2NoZWQgZm9yIGFnZyBwb3J0ICVkIChpbnRmIGlkICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19pbmZvLT5kYXRhLmFnZ19wb3J0X2lkLCBwX2Zsb3dfaW5mby0+ZGF0YS5hY2Nlc3NfaW50X2lkKTsJCQkJCisgICAgIAkJCWJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2Zsb3dfaW5mbywgZmxvdywgYWdnX3BvcnRfaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBfdG1fc2NoZWRfaW5zdCktPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXIudS5hZ2dfcG9ydC5hZ2dfcG9ydF9pZCk7CisgICAgICAgIH0KKyAgICB9d2hpbGUoMCk7CisgICAgcmV0dXJuIHJldDsKK30KKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9mbG93X2ZzbS5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9mbG93X2ZzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM2YmIzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2Zsb3dfZnNtLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIGZsb3dfZnNtLmgKKyAqIEBicmllZiBDb2RlIHRvIHN1cHBvcnQgdGhlIEJBTCBGbG93IEZTTQorICoKKyAqIEBkZWZncm91cCBmbG93IEZsb3cKKyAqIEBpbmdyb3VwIGNvcmUKKyAqLworCisjaWZuZGVmIEZMT1dfRlNNX0gKKyNkZWZpbmUgRkxPV19GU01fSAorCisvKkB7Ki8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJhbF9hcGkuaD4KKworI2RlZmluZSBGTE9XX0FMTE9DQVRJT05fQkxPQ0tfU0laRSAgKDE2Mzg0KQorCisjZGVmaW5lIENPUkVfRlNNX0ZMT1dfVFlQRV9HRVRfU1RSKF9mc21fZmxvd190eXBlKSAgIChCQ01CQUxfRkxPV19UWVBFX01VTFRJQ0FTVCA9PSAoX2ZzbV9mbG93X3R5cGUpID8gIk11bHRpY2FzdCI6XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0ZMT1dfVFlQRV9CUk9BRENBU1QgPT0gKF9mc21fZmxvd190eXBlKSA/ICJCcm9hZGNhc3QiOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSA9PSAoX2ZzbV9mbG93X3R5cGUpID8gIkRvd25zdHJlYW0iOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPT0gKF9mc21fZmxvd190eXBlKSA/ICJVcHN0cmVhbSI6IkludmFsaWQiKQorCisKK3R5cGVkZWYgZW51bQoreworICAgIEZMT1dfRlNNX0VWRU5UX1RZUEVfTk9ORSAgICAgICAgICAgICAgICAgPSAtMSwKKyAgICBGTE9XX0ZTTV9FVkVOVF9UWVBFX0FETUlOX1VQICAgICAgICAgICAgICAgICAsCisgICAgRkxPV19GU01fRVZFTlRfVFlQRV9BRE1JTl9ETiAgICAgICAgICAgICAgICAgLAorICAgIEZMT1dfRlNNX0VWRU5UX1RZUEVfUkVNT1ZFICAgICAgICAgICAgICAgICAgICwKKyAgICBGTE9XX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHICAgICAgICAgICAgICAgICAsCisgICAgRkxPV19GU01fRVZFTlRfVFlQRV9VVElMX0FVVE9fTVNHICAgICAgICAgICAgLAorCisKKyAgICBGTE9XX0ZTTV9FVkVOVF9UWVBFX19MQVNULAorICAgIEZMT1dfRlNNX0VWRU5UX1RZUEVfX05VTV9PRgorfSBmbG93X2ZzbV9ldmVudF90eXBlOworCisKKwordHlwZWRlZiBlbnVtCit7CisgICAgRkxPV19GU01fU1RBVEVfTk9ORSA9ICAgICAtMSwKKyAgICBGTE9XX0ZTTV9TVEFURV9OVUxMICAgICAgICAgLAorICAgIEZMT1dfRlNNX1NUQVRFX0NPTkZJR1VSSU5HICAsCisgICAgRkxPV19GU01fU1RBVEVfQ09ORklHVVJFRCAgICwKKyAgICBGTE9XX0ZTTV9TVEFURV9SRU1PVklORyAgICAgLAorIAorCisgICAgRkxPV19GU01fU1RBVEVfX0xBU1QsCisgICAgRkxPV19GU01fU1RBVEVfX05VTV9PRgorfSBmbG93X2ZzbV9zdGF0ZTsKKworCit0eXBlZGVmIGVudW0KK3sKKyAgICBGTE9XX0ZMQUdfQUNUSVZFID0gICAgIDE8PDAsICAgIC8qKjwgQSBmbG93IGlzIG9uIHRoZSBhY3RpdmUgbGlzdCAqLworICAgIEZMT1dfRkxBR19GUkVFID0gICAgICAgMTw8MSwgICAgLyoqPCBBIGZsb3cgaXMgb24gdGhlIGZyZWUgbGlzdCAqLworICAgIEZMT1dfRkxBR19BTlkgPSAgICAgICAgKEZMT1dfRkxBR19BQ1RJVkUgfCBGTE9XX0ZMQUdfRlJFRSksICAgIC8qKjwgQSBmbG93IGlzIG9uIGVpdGhlciB0aGUgYWN0aXZlIG9yIGZyZWUgbGlzdCAqLworICAgIEZMT1dfRkxBR19JR05PUkVfRElSID0gMTw8MiAgICAgLyoqPCBJZ25vcmUgZGlyZWN0aW9uIGR1cmluZyBvcGVyYXRpb24gKi8KK30gZmxvd19mbGFnOworCisKK3R5cGVkZWYgc3RydWN0IGZsb3dfZnNtX2V2ZW50X3QKK3sKKyAgICBmbG93X2ZzbV9ldmVudF90eXBlIGV2ZW50X3R5cGU7ICAgLyoqPCBUaGUgZmxvdyBmc20gZXZlbnRzICovCisgICAgdm9pZCAgICAgICAgICAgICAqbXNnOworCisgICAgLyogb3RoZXIgbmVjZXNzYXJ5IGluZm9ybWF0aW9uICovCit9IGZsb3dfZnNtX2V2ZW50OworCisKKy8qIEZsb3cgc3RhdGUgaW4gTUFDIHBsdWdpbiAqLwordHlwZWRlZiBlbnVtCit7CisgICAgRkxPV19NQUNfU1RBVEVfTk9ORSAgPSAgMHgwMCwgICAgLyoqPCBOZWl0aGVyIHN2Y19pZCBub3IgYWdnX2lkIGNvbmZpZ3VyZWQgKi8KKyAgICBGTE9XX01BQ19TVEFURV9TVkMgICA9ICAxPDwwLCAgICAvKio8IFNWQyBpcyBjb25maWd1cmVkICovCisgICAgRkxPV19NQUNfU1RBVEVfQUdHICAgPSAgMTw8MSwgICAgLyoqPCBBR0cgaXMgY29uZmlndXJlZCAqLworICAgIEZMT1dfTUFDX1NUQVRFX1JFQURZID0gKEZMT1dfTUFDX1NUQVRFX1NWQyB8IEZMT1dfTUFDX1NUQVRFX0FHRykKK30gZmxvd19tYWNfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IGZsb3dfaW5zdCBmbG93X2luc3Q7CitzdHJ1Y3QgZmxvd19pbnN0Cit7CisgICAgYmNtYmFsX2Zsb3dfY2ZnICAgIGN1cnJlbnRfZmxvd19pbmZvOyAgICAvKio8IFRoZSBjdXJyZW50IGluZm9ybWF0aW9uIGZvciB0aGlzIGZsb3cgKHVzZWQgZm9yIEdFVCkgKi8KKyAgICBiY21iYWxfZmxvd19jZmcgICAgYXBpX3JlcV9mbG93X2luZm87ICAgIC8qKjwgVGhlIGxhc3QgZmxvdyBvYmplY3QgaW5mbyByZWNlaXZlZCBmcm9tIHRoZSBQdWJsaWMgQVBJICovCisgICAgZmxvd19mc21fc3RhdGUgICAgICBmc21fc3RhdGU7ICAgICAgICAgICAvKio8IFRoZSBGbG93IEZTTSBzdGF0ZSAqLworICAgIGZsb3dfbWFjX3N0YXRlICAgICAgbWFjX3N0YXRlOyAgICAgICAgICAgLyoqPCBGbG93IHN0YXRlIGZyb20gTUFDIHBvaW50IG9mIHZpZXcgKi8KKyAgICBzdHJ1Y3QgZmxvd19pbnN0ICAgICAgKnBfcGVlcl9mbG93X2luc3Q7IC8qKjwgUG9pbnRlciB0byB0aGUgbGlua2VkIGZsb3cgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiAoaWYgYW55KSAqLworICAgIHN0cnVjdCBzdWJfdGVybV9pbnN0ICAqcF9zdWJfdGVybV9pbnN0OyAgLyoqPCBQb2ludGVyIHRvIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmxvdyAqLworICAgIGJjbW9zX3RpbWVyICAgICAgICAgICB0aW1lcl9pbmZvOyAgICAgICAgLyoqPCBBIHN0cnVjdHVyZSB1c2VkIGZvciB0aGUgc3RhdGUgbWFjaGluZSB0aW1lb3V0IHRpbWVyICovCisgICAgVEFJTFFfRU5UUlkoZmxvd19pbnN0KSBmbG93X2luc3RfbmV4dCA7ICAvKio8IFRBSUxRIGxpbmsgKi8KKyAgICBUQUlMUV9FTlRSWShmbG93X2luc3QpIHJzY19tZ3JfbGlzdF9uZXh0IDsgIC8qKjwgVEFJTFEgbGluayB1c2VkIGZvciBzdG9yaW5nIGluIFJlc291cmNlIG1nciBsaXN0ICovCit9OworCisKKy8qIAorICogRmxvdyBGU00gZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3R5cGVkZWYgc3RydWN0IGZsb3dfZnNtX2N0eAoreworICAgIC8qIExpc3RzIG9mIGZyZWUgZmxvdyBlbnRyaWVzIGFuZCBhY3RpdmUgZmxvdyBlbnRyaWVzCisgICAgICovCisgICAgVEFJTFFfSEVBRChmcmVlX2Zsb3dfbGlzdF9oZWFkLCBmbG93X2luc3QpIGZyZWVfZmxvd19saXN0OworCisgICAgVEFJTFFfSEVBRChhY3RpdmVfZmxvd19saXN0X2hlYWQsIGZsb3dfaW5zdCkgYWN0aXZlX2Zsb3dfbGlzdDsKKworfSBmbG93X2ZzbV9jdHg7CisKKworLyogCisgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgCisgKi8KK2V4dGVybiBiY21vc19lcnJubyBmbG93X2ZzbV9pbml0KHZvaWQpOworZXh0ZXJuIGJjbW9zX2Vycm5vIGZsb3dfZnNtX2ZpbmlzaCh2b2lkKTsKKworZXh0ZXJuIGJjbW9zX2Vycm5vIHByb2Nlc3NfZmxvd19vYmplY3Qodm9pZCAqbXNnX3BheWxvYWQpOworCitleHRlcm4gYmNtb3NfZXJybm8gcHJvY2Vzc19mbG93X3V0aWxfbXNnKHZvaWQgKm1zZ19wYXlsb2FkKTsKKworZXh0ZXJuIGZsb3dfaW5zdCAqZmxvd19nZXRfYnlfc3ZjX2lkKHVpbnQxNl90IGFjY2Vzc19pZl9pZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfZmxvd190eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkIHN2Y19wb3J0X2lkKTsKKworZXh0ZXJuIGZsb3dfaW5zdCAqZmxvd19nZXRfYnlfYWdnX2lkKHVpbnQxNl90IGFjY2Vzc19pZl9pZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBhZ2dfcG9ydF9pZCk7CisKK2V4dGVybiBiY21vc19lcnJubyBzdmNfcG9ydF9pZF9mb3Jfc3ViX3Rlcm1fZHNfZmxvd19nZXQodWludDE2X3QgYWNjZXNzX2lmX2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1Yl90ZXJtX3VuaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKnN2Y19wb3J0X2lkKTsKKworZXh0ZXJuIGJjbWJhbF9mbG93X2NmZyAqZmxvd19nZXRfY3VycmVudF9pbmZvX2J5X2tleShiY21iYWxfZmxvd19rZXkga2V5KTsKKworCisvKkB9Ki8KKworI2VuZGlmIC8qRkxPV19GU01fSCAqLworCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2ZzbV9jb21tb24uYyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vZnNtX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMWE4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2ZzbV9jb21tb24uYwpAQCAtMCwwICsxLDM1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgZnNtX2NvbW1vbi5jCisgKiBAYnJpZWYgQ29tbW9uIGNvZGUgdG8gc3VwcG9ydCB0aGUgQkFMIGFjY2VzcyB0ZXJtaW5hbCBGU01zCisgKgorICogQGFkZHRvZ3JvdXAgY29yZQorICovCisKKy8qQHsqLworCisvKi0tLSBwcm9qZWN0IGluY2x1ZGVzIC0tLSovCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YWNjX3Rlcm1fZnNtLmg+CisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgPGJhbF9hcGkuaD4KKyNpbmNsdWRlICJiYWxfd29ya2VyLmgiCisjaW5jbHVkZSAiYmFsX21hY191dGlsLmgiCisjaW5jbHVkZSAiYmFsX3N3aXRjaF91dGlsLmgiCisjaW5jbHVkZSA8YmFsX29zbXNnLmg+CisjaW5jbHVkZSA8ZnNtX2NvbW1vbi5oPgorCisjaWZkZWYgRU5BQkxFX0xPRworI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBTZW5kIGEgbWFuYWdlbWVudCBtZXNzYWdlIHJlc3BvbnNlCisgKgorICogQSBXb3JrZXIgbW9kdWxlIGZ1bmN0aW9uIHRoYXQgc2VuZHMgdGhlIHNwZWNpZmllZCBtZXNzYWdlIHRvIHRoZQorICogQkFMIFB1YmxpYyBBUEkuCisgKgorICogQHBhcmFtIGNtZF9zdGF0dXMgIFRoZSByZXN1bHRzIG9mIHRoZSBjb21tYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZQorICoKKyAqIEBwYXJhbSBtc2dfcGF5bG9hZCBBIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdG8gYmUgc2VudAorICoKKyAqIEBwYXJhbSBvcGVyX3R5cGUgVGhlIG9wZXJhdGlvbiB0eXBlIG9mIHRoZSBvYmplY3QgaW4gdGhpcyByZXNwb25zZQorICoKKyAqIEBwYXJhbSBsb2dfaWQgVGhlIGxvZyBpZCBvZiB0aGUgY2FsbGluZyBjb21wb25lbnQKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIG1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChiY21vc19lcnJubyBjbWRfc3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2dfcGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfb2JqX21zZ190eXBlIG9wZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfbG9nX2lkIGxvZ19pZCkKK3sKKworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKE5VTEwgPT0gbXNnX3BheWxvYWQpOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkLCAic2VuZGluZyByc3AgbWVzc2FnZSB0byB0aGUgcHVibGljIGFwaSAocGF5bG9hZCBhdCAlcClcbiIsCisgICAgICAgICAgICBtc2dfcGF5bG9hZCk7CisKKyAgICAvKgorICAgICAqIFNlbmQgdGhlIHJlc3BvbnNlIGJhY2sgdG8gdGhlIEJBTCBQdWJsaWMgQVBJIGJhY2tlbmQKKyAgICAgKi8KKyAgICBiY21iYWxfbXNnX2hkcl9zZXQobXNnX3BheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF90eXBlX21ham9yX2dldChtc2dfcGF5bG9hZCksCisgICAgICAgICAgICAgICAgICAgICAgIEJBTF9NU0dfVFlQRV9SU1AsCisgICAgICAgICAgICAgICAgICAgICAgIEJBTF9TVUJTWVNURU1fQ09SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX21zZ19pZF9vYmpfZ2V0KG1zZ19wYXlsb2FkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX21zZ19pZF9vcGVyX2dldChtc2dfcGF5bG9hZCksCisgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9leF9pZF9nZXQobXNnX3BheWxvYWQpKTsKKworICAgIC8qIFJldHVybiB0aGUgY29tbWFuZCBzdGF0dXMgdG8gdGhlIFB1YmxpYyBBUEkgYmFja2VuZCAqLworICAgICgoYmNtYmFsX29iaiAqKShtc2dfcGF5bG9hZCkpLT5zdGF0dXMgPSBjbWRfc3RhdHVzOworCisgICAgKChiY21iYWxfb2JqICopKG1zZ19wYXlsb2FkKSktPmRpciA9IEJDTUJBTF9PQkpfTVNHX0RJUl9SRVNQT05TRTsKKworICAgICgoYmNtYmFsX29iaiAqKShtc2dfcGF5bG9hZCkpLT50eXBlID0gb3Blcl90eXBlOworIAorICAgIGlmKEJDTV9FUlJfT0sgIT0gY21kX3N0YXR1cykKKyAgICB7CisgICAgICAgICgoYmNtYmFsX29iaiAqKShtc2dfcGF5bG9hZCkpLT5wcmVzZW5jZV9tYXNrID0gMDsKKyAgICB9CisgCisgICAgLyogU2VuZCBtZXNzYWdlLCBidXQgZG9uJ3QgZnJlZSBpdC4gSXQgaXMgc3RpbGwgYmVpbmcgdXNlZCBieSBGU00gKi8KKyAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBiY21iYWxfbXNnX3NlbmQocF9iYWxfY29yZV90b19hcGlfcXVldWUsIG1zZ19wYXlsb2FkLCBCQ01PU19NU0dfU0VORF9OT19GUkVFX09OX0VSUk9SKSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWQsICJtc2dfc2VuZCBmYWlsZWQgdG8gc2VuZCByc3AgdG8gY29yZSAoZXJyb3I6JXMpXG4iLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWQsICJSU1AgbWVzc2FnZSBzZW50IHRvIHRoZSBwdWJsaWMgYXBpIHdpdGggc3RhdHVzPSVzXG4iLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKGNtZF9zdGF0dXMpKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJldDsKKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFNlbmQgYSBtYW5hZ2VtZW50IG1lc3NhZ2UgaW5kaWNhdGlvbgorICoKKyAqIEEgV29ya2VyIG1vZHVsZSBmdW5jdGlvbiB0aGF0IHNlbmRzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSB0byB0aGUKKyAqIEJBTCBQdWJsaWMgQVBJLgorICoKKyAqIEBwYXJhbSBjbWRfc3RhdHVzICBUaGUgcmVzdWx0cyBvZiB0aGUgY29tbWFuZCBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UKKyAqCisgKiBAcGFyYW0gaXNfYXV0b19pbmQgU2V0IHRvIEJDTU9TX1RSVUUgaWYgdGhlIGluZGljYXRpb24gdG8gYmUgc2VudCBpcyBhbiBBVVRPIElORAorICoKKyAqIEBwYXJhbSBtc2dfcGF5bG9hZCBBIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdG8gYmUgc2VudCAoYSBCQUwgb2JqZWN0ISkgKG1heSBiZSBOVUxMKQorICoKKyAqIEBwYXJhbSBsb2dfaWQgVGhlIGxvZyBpZCBvZiB0aGUgY2FsbGluZyBjb21wb25lbnQKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBfbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKGJjbW9zX2Vycm5vIGNtZF9zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19ib29sIGlzX2F1dG9faW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnX3BheWxvYWQsIC8qIElmIHRoaXMgaXMgTlVMTCwgdGhlcmUgaXMgbm8gbWVzc2FnZSBib2R5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfbG9nX2lkIGxvZ19pZCkKK3sKKworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgdWludDE2X3QgcGF5bG9hZF9zaXplOworICAgIHZvaWQgKnBfaW5kX21zZzsKKyAgICBiY21iYWxfb2JqX2lkIG9ial90eXBlOworCisgICAgaWYoTlVMTCA9PSBtc2dfcGF5bG9hZCkKKyAgICB7CisgICAgICAgIG9ial90eXBlID0gQkNNQkFMX09CSl9JRF9BTlk7CisgICAgICAgIHBheWxvYWRfc2l6ZSA9IHNpemVvZihiY21iYWxfb2JqKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3dpdGNoKCgoYmNtYmFsX29iaiAqKW1zZ19wYXlsb2FkKS0+b2JqX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgKEJDTUJBTF9PQkpfSURfRkxPVyk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplID0gc2l6ZW9mKGJjbWJhbF9mbG93X2NmZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgKEJDTUJBTF9PQkpfSURfQUNDRVNTX1RFUk1JTkFMKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXlsb2FkX3NpemUgPSBzaXplb2YoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIChCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRSk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplID0gc2l6ZW9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAoQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXlsb2FkX3NpemUgPSBzaXplb2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAoQkNNQkFMX09CSl9JRF9HUk9VUCk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplID0gc2l6ZW9mKGJjbWJhbF9ncm91cF9jZmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIChCQ01CQUxfT0JKX0lEX1RNX1NDSEVEKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXlsb2FkX3NpemUgPSBzaXplb2YoYmNtYmFsX3RtX3NjaGVkX2NmZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgKEJDTUJBTF9PQkpfSURfVE1fUVVFVUUpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfY2ZnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWQsICJpbmRpY2F0aW9uIGZvciBvYmplY3QgKCVkKSBub3Qgc3VwcG9ydGVkXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICgoYmNtYmFsX29iaiAqKW1zZ19wYXlsb2FkKS0+b2JqX3R5cGUpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgCisgICAgfQorCisgICAgcF9pbmRfbXNnID0gYmNtYmFsX21zZ19jYWxsb2MocGF5bG9hZF9zaXplKTsKKworICAgIGlmKE5VTEwgPT0gbXNnX3BheWxvYWQpCisgICAgeworICAgICAgICAoKGJjbWJhbF9vYmogKilwX2luZF9tc2cpLT5vYmpfdHlwZSA9IG9ial90eXBlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtZW1jcHkocF9pbmRfbXNnLCBtc2dfcGF5bG9hZCwgcGF5bG9hZF9zaXplKTsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBTZW5kIHRoZSBpbmRpY2F0aW9uIGJhY2sgdG8gdGhlIEJBTCBQdWJsaWMgQVBJIGJhY2tlbmQKKyAgICAgKi8KKyAgICBiY21iYWxfbXNnX2hkcl9zZXQocF9pbmRfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfTUdNVF9BUElfSU5EX01TRywKKyAgICAgICAgICAgICAgICAgICAgICAgKEJDTU9TX1RSVUUgPT0gaXNfYXV0b19pbmQpID8gQkFMX01TR19UWVBFX0FVVE9fSU5EIDogQkFMX01TR19UWVBFX0lORCwKKyAgICAgICAgICAgICAgICAgICAgICAgQkFMX1NVQlNZU1RFTV9DT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAoKGJjbWJhbF9vYmogKilwX2luZF9tc2cpLT5vYmpfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICAvKiBSZXR1cm4gdGhlIGNvbW1hbmQgc3RhdHVzIHRvIHRoZSBQdWJsaWMgQVBJIGJhY2tlbmQgKi8KKyAgICAoKGJjbWJhbF9vYmogKikocF9pbmRfbXNnKSktPnN0YXR1cyA9IGNtZF9zdGF0dXM7CisKKyAgICAoKGJjbWJhbF9vYmogKikocF9pbmRfbXNnKSktPnR5cGUgPSBCQ01CQUxfT0JKX01TR19UWVBFX0dFVDsKKyAgICAoKGJjbWJhbF9vYmogKikocF9pbmRfbXNnKSktPmRpciA9IEJDTUJBTF9PQkpfTVNHX0RJUl9SRVNQT05TRTsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZCwgInNlbmRpbmcgSU5EIG1lc3NhZ2UgdG8gdGhlIHB1YmxpYyBhcGkgKHBheWxvYWQgYXQgJXApXG4iLCBwX2luZF9tc2cpOworCisgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gYmNtYmFsX21zZ19zZW5kKHBfYmFsX2NvcmVfdG9fYXBpX2luZF9xdWV1ZSwgcF9pbmRfbXNnLCBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZCwgIm1zZ19zZW5kIGZhaWxlZCB0byBzZW5kIElORCB0byBwdWJsaWMgQVBJICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWQsICJJTkQgbWVzc2FnZSBzZW50IHRvIHRoZSBwdWJsaWMgYXBpIHdpdGggc3RhdHVzPSVzXG4iLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKGNtZF9zdGF0dXMpKTsKKyAgICB9CisgICAgCisgIG91dDoKKyAgICByZXR1cm4gcmV0OworCit9CisKK2JjbW9zX2Vycm5vIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChiY21vc19lcnJubyBjbWRfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZ19wYXlsb2FkLCAvKiBJZiB0aGlzIGlzIE5VTEwsIHRoZXJlIGlzIG5vIG1lc3NhZ2UgYm9keSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9sb2dfaWQgbG9nX2lkKQoreworCisgICAgcmV0dXJuIF9tZ210X21zZ19zZW5kX2JhbGFwaV9pbmQoY21kX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PU19GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfcGF5bG9hZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2lkKTsKK30KKworYmNtb3NfZXJybm8gbWdtdF9tc2dfc2VuZF9iYWxhcGlfYXV0b19pbmQoYmNtb3NfZXJybm8gY21kX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZ19wYXlsb2FkLCAvKiBJZiB0aGlzIGlzIE5VTEwsIHRoZXJlIGlzIG5vIG1lc3NhZ2UgYm9keSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2xvZ19pZCBsb2dfaWQpCit7CisKKyAgICByZXR1cm4gX21nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChjbWRfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9TX1RSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX3BheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2lkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIGFuZCBTdGFydCB0aGUgRlNNIHRpbWVyIAorICoKKyAqIEBwYXJhbSBwX3RpbWVyX2luc3QgICBBIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgYSB0aW1lciBkYXRhIHN0cnVjdHVyZQorICoKKyAqIEBwYXJhbSBwX2luc3QgICAgQW4gb3BhcXVlIHBvaW50ZXIgdG8gYW4gRlNNIGluc3RhbmNlIHRvIGJlIHBhc3NlZCB0byB0aGUgdGltZXIKKyAqICAgICAgICAgICAgICAgICAgZXhwaXJ5IGhhbmRsZXIKKyAqCisgKiBAcGFyYW0gcF90aW1lcl9leHBpcnlfaGFuZGxlciAgIEEgdGltZXIgZXhwaXJ5IGhhbmRsZXIgZnVuY3Rpb24KKyAqCisgKiBAcGFyYW0gZGVsYXkgICBUaGUgZGVsYXkgaW50ZXJ2YWwgKGluIG1TKSBmb3IgdGhpcyB0aW1lciB0byBydW4gYmVmb3JlIHRoZQorICogICAgICAgICAgICAgICAgZXhwaXJ5IGhhbmRsZXIgaXMgY2FsbGVkCisgKgorICogQHBhcmFtIGxvZ19pZCAgIFRoZSBsb2dfaWQgdG8gdXNlIHdoZW4gbG9nZ2luZyBlcnJvcnMgZW5jb3VudGVyZWQgaW4gdGhpcyAKKyAqICAgICAgICAgICAgICAgICBmdW5jdGlvbgorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIGZzbV90aW1lcl9zdGFydChiY21vc190aW1lciAqcF90aW1lcl9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGX2JjbW9zX3RpbWVyX2hhbmRsZXIgcF90aW1lcl9leHBpcnlfaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheSwgIC8qIGRlbGF5IGlzIGluIG1TICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2xvZ19pZCBsb2dfaWQpCit7CisKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJjbW9zX3RpbWVyX3Bhcm0gdGltZXJfc3BlYzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04ocF9pbnN0ID09IE5VTEwpOyAgICAKKyAgICBCVUdfT04ocF90aW1lcl9leHBpcnlfaGFuZGxlciA9PSBOVUxMKTsgICAgCisgICAgQlVHX09OKHBfdGltZXJfaW5zdCA9PSBOVUxMKTsgICAgCisKKworICAgIC8qIENyZWF0ZSBiY21fb3MgdGltZXIgKi8KKyAgICB0aW1lcl9zcGVjLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX1dPUktFUl9NR01UOyAKKyAgICB0aW1lcl9zcGVjLmhhbmRsZXIgPSBwX3RpbWVyX2V4cGlyeV9oYW5kbGVyOworICAgIHRpbWVyX3NwZWMuZGF0YSA9IChsb25nKSBwX2luc3Q7CisgICAgdGltZXJfc3BlYy5wZXJpb2RpYyA9IEJDTU9TX0ZBTFNFOworCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gYmNtb3NfdGltZXJfY3JlYXRlKHBfdGltZXJfaW5zdCwgJnRpbWVyX3NwZWMpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkLCAiQ2FuJ3QgY3JlYXRlIHRpbWVyIGZvciBGU01cbiIpOworICAgICAgICByZXQgPSBCQ01fRVJSX05PUkVTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBTdGFydCB0aGUgdGltZXIuICBUaW1lciByZXNvbHV0aW9uIGlzIGluIHVTKi8KKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQocF90aW1lcl9pbnN0LCBkZWxheSoxMDAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFN0b3AgYW5kIGRlbGV0ZSB0aGUgc3BlY2lmaWVkIEZTTSB0aW1lciAKKyAqCisgKiBAcGFyYW0gcF90aW1lcl9pbnN0ICAgQSBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIGEgdGltZXIgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKi8KK3ZvaWQgZnNtX3RpbWVyX3N0b3AoYmNtb3NfdGltZXIgKnBfdGltZXJfaW5zdCkKK3sgICAgICAgIAorICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04ocF90aW1lcl9pbnN0ID09IE5VTEwpOyAgICAKKworICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3kocF90aW1lcl9pbnN0KTsKK30KKworLypAfSovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2ZzbV9jb21tb24uaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vZnNtX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNWI4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2ZzbV9jb21tb24uaApAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBmc21fY29tbW9uLmgKKyAqIEBicmllZiBDb21tb24gY29kZSB0byBzdXBwb3J0IHRoZSBCQUwgQWNjZXNzIFRlcm1pbmFsIEZTTXMKKyAqCisgKiBAaW5ncm91cCBjb3JlCisgKi8KKyNpZm5kZWYgRlNNX0NPTU1PTl9ICisjZGVmaW5lIEZTTV9DT01NT05fSAorCisvKkB7Ki8KKworI2luY2x1ZGUgPGJhbF9jb21tb24uaD4KKyNpbmNsdWRlIDxiYWxfb2JqLmg+CisKKyNkZWZpbmUgVElNRVJfRFVSQVRJT05fMV9TRUMgICAgICAgICAgICAgICAgICAgICAgKDEwMDApCisjZGVmaW5lIFRJTUVSX0RVUkFUSU9OX0lOX1NFQyh0aW1lX2luX3NlY29uZHMpICAgIChUSU1FUl9EVVJBVElPTl8xX1NFQyp0aW1lX2luX3NlY29uZHMpCisKKworZXh0ZXJuIGJjbW9zX2Vycm5vIG1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChiY21vc19lcnJubyBjbWRfc3RhdHVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnX3BheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9vYmpfbXNnX3R5cGUgb3Blcl90eXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2xvZ19pZCBsb2dfaWQpOworCitleHRlcm4gYmNtb3NfZXJybm8gbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKGJjbW9zX2Vycm5vIGNtZF9zdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZ19wYXlsb2FkLCAvKiBJZiB0aGlzIGlzIE5VTEwsIHRoZXJlIGlzIG5vIG1lc3NhZ2UgYm9keSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfbG9nX2lkIGxvZ19pZCk7CisKK2V4dGVybiBiY21vc19lcnJubyBtZ210X21zZ19zZW5kX2JhbGFwaV9hdXRvX2luZChiY21vc19lcnJubyBjbWRfc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZ19wYXlsb2FkLCAvKiBJZiB0aGlzIGlzIE5VTEwsIHRoZXJlIGlzIG5vIG1lc3NhZ2UgYm9keSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9sb2dfaWQgbG9nX2lkKTsKKworZXh0ZXJuIGJjbW9zX2Vycm5vIGZzbV90aW1lcl9zdGFydChiY21vc190aW1lciAqcF90aW1lcl9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZfYmNtb3NfdGltZXJfaGFuZGxlciBwX3RpbWVyX2V4cGlyeV9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheSwgIC8qIGRlbGF5IGlzIGluIG1TICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9sb2dfaWQgbG9nX2lkKTsKKworZXh0ZXJuIHZvaWQgZnNtX3RpbWVyX3N0b3AoYmNtb3NfdGltZXIgKnBfdGltZXJfaW5zdCk7CisKKy8qQH0qLworCisjZW5kaWYgLypGU01fQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vZ3JvdXBfZnNtLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2dyb3VwX2ZzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YjBhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL2dyb3VwX2ZzbS5jCkBAIC0wLDAgKzEsMjE2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgZ3JvdXBfZnNtLmMKKyAqIEBicmllZiBDb2RlIHRvIHN1cHBvcnQgdGhlIEJBTCBncm91cCBGU00KKyAqCisgKgorICovCisKKy8qQHsqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8Z3JvdXBfZnNtLmg+CisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgPGJhbF9vc21zZy5oPgorI2luY2x1ZGUgImJhbF93b3JrZXIuaCIKKyNpbmNsdWRlICJiYWxfbWFjX3V0aWwuaCIKKyNpbmNsdWRlICJiYWxfc3dpdGNoX3V0aWwuaCIKKyNpbmNsdWRlICJyc2NfbWdyLmgiCisKKyNpbmNsdWRlIDxiYWxfb2Jqcy5oPgorI2luY2x1ZGUgPGZzbV9jb21tb24uaD4KKworI2lmZGVmIEVOQUJMRV9MT0cKKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorCisgLyoKKyAqIEBicmllZiBUaGUgbG9nZ2luZyBkZXZpY2UgaWQgZm9yIGdyb3VwCisgKi8KK3N0YXRpYyBkZXZfbG9nX2lkIGxvZ19pZF9ncm91cDsKKyNlbmRpZgorCisvKiBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBiY21vc19lcnJubyBncm91cF9mc21fY3JlYXRlKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnNtX2Rlc3Ryb3koZ3JvdXBfaW5zdCAqcF9ncm91cF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnNtX2FkZChncm91cF9pbnN0ICpwX2dyb3VwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnNtX3JlbW92ZShncm91cF9pbnN0ICpwX2dyb3VwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnNtX3NldChncm91cF9pbnN0ICpwX2dyb3VwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnNtX2NvbmZpZ3VyaW5nX3V0aWxfbXNnKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnNtX2RlbGV0aW5nX3V0aWxfbXNnKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnNtX2lnbm9yZV9hcGlfbXNnKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnNtX3N0YXRlX2Vycihncm91cF9pbnN0ICpwX2dyb3VwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIGdyb3VwX2ZzbV9leGVjKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCwgZ3JvdXBfZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGdyb3VwX2luc3QgKmdyb3VwX2luc3RfZ2V0KGJjbWJhbF9ncm91cF9rZXkgKmtleSwgZ3JvdXBfZmxhZyBzZWFyY2hfZmxhZyk7CisKK3N0YXRpYyBiY21vc19lcnJubyBncm91cF9mcmVlX2J5X2VudHJ5KGdyb3VwX2luc3QgKnBfZW50cnkpOworCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2dyb3VwX29iamVjdF9tZW1iZXJfcmVtb3ZlKGJjbWJhbF9ncm91cF9jZmcgKnBfcmVxX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2N1cl9ncm91cCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfZ3JvdXBfb2JqZWN0X21lbWJlcl9hZGQoYmNtYmFsX2dyb3VwX2NmZyAqcF9yZXFfZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9ncm91cF9jZmcgKnBfY3VyX2dyb3VwKTsKKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9ncm91cF9vYmplY3RfbWVtYmVyX3JlcGxhY2UoYmNtYmFsX2dyb3VwX2NmZyAqcF9yZXFfZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2N1cl9ncm91cCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfZ3JvdXBfb2JqZWN0X292ZXJsYXkoYmNtYmFsX2dyb3VwX2NmZyAqcF9yZXFfZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9ncm91cF9jZmcgKnBfY3VyX2dyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgKiBAYnJpZWYgVGhlIEdsb2JhbCBncm91cCBmc20gY29udGV4dCBkYXRhIHN0cnVjdHVyZQorICovCitzdGF0aWMgZ3JvdXBfZnNtX2N0eCBnX2dyb3VwX2ZzbV9ncm91cF9saXN0X2N0eDsKKworLyoKKyAqIE1hY3JvcyBmb3IgZ3JvdXAgY3R4IGFjY2VzcworICovCisjZGVmaW5lIEdST1VQX0ZTTV9HUk9VUF9MSVNUX0NUWCAgICAgIChnX2dyb3VwX2ZzbV9ncm91cF9saXN0X2N0eCkKKyNkZWZpbmUgR1JPVVBfRlNNX0dST1VQX0xJU1RfQ1RYX1BUUiAgKCZnX2dyb3VwX2ZzbV9ncm91cF9saXN0X2N0eCkKKworLyoKKyAqICBAYnJpZWYgVGhlIGRlZmluaXRpb24gb2YgYSBncm91cCBGU00gc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbgorICovCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqIGdyb3VwX2ZzbV9zdGF0ZV9wcm9jZXNzb3IpKGdyb3VwX2luc3QgKiwgdm9pZCAqLCBncm91cF9mc21fZXZlbnQgKik7CisKKy8qCisgKiAgQGJyaWVmIFRoZSBHcm91cCBGU00gc3RhdGUgcHJvY2Vzc2luZyBhcnJheQorICovCitzdGF0aWMgZ3JvdXBfZnNtX3N0YXRlX3Byb2Nlc3NvciBncm91cF9zdGF0ZXNbR1JPVVBfRlNNX1NUQVRFX19OVU1fT0ZdW0dST1VQX0ZTTV9FVkVOVF9UWVBFX19OVU1fT0ZdID0KK3sKKworICAgIFtHUk9VUF9GU01fU1RBVEVfTlVMTF0gPQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogQ09NRklHVVJJTkcKKyAgICAgICAgICovCisgICAgICAgIFtHUk9VUF9GU01fRVZFTlRfVFlQRV9DUkVBVEVdICA9IGdyb3VwX2ZzbV9jcmVhdGUsCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogTlVMTAorICAgICAgICAgKi8KKyAgICAgICAgW0dST1VQX0ZTTV9FVkVOVF9UWVBFX0RFU1RST1ldID0gZ3JvdXBfZnNtX2lnbm9yZV9hcGlfbXNnLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTkZJR1VSSU5HCisgICAgICAgICAqLworICAgICAgICBbR1JPVVBfRlNNX0VWRU5UX1RZUEVfQUREXSAgICAgPSBncm91cF9mc21fYWRkLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IE5VTEwKKyAgICAgICAgICovCisgICAgICAgIFtHUk9VUF9GU01fRVZFTlRfVFlQRV9SRU1PVkVdID0gZ3JvdXBfZnNtX2lnbm9yZV9hcGlfbXNnLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTkZJR1VSSU5HCisgICAgICAgICAqLworICAgICAgICBbR1JPVVBfRlNNX0VWRU5UX1RZUEVfU0VUXSA9IGdyb3VwX2ZzbV9zZXQsCisKKyAgICB9LAorICAgIFtHUk9VUF9GU01fU1RBVEVfQ09ORklHVVJJTkddID0KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTUZJR1VSSU5HCisgICAgICAgICAqLworICAgICAgICBbR1JPVVBfRlNNX0VWRU5UX1RZUEVfQ1JFQVRFXSAgPSBncm91cF9mc21faWdub3JlX2FwaV9tc2csCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogQ09NRklHVVJJTkcKKyAgICAgICAgICovCisgICAgICAgIFtHUk9VUF9GU01fRVZFTlRfVFlQRV9ERVNUUk9ZXSA9IGdyb3VwX2ZzbV9pZ25vcmVfYXBpX21zZywKKworICAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBDT05GSUdVUklORworICAgICAgICAgKi8KKyAgICAgICAgW0dST1VQX0ZTTV9FVkVOVF9UWVBFX0FERF0gICAgID0gZ3JvdXBfZnNtX2lnbm9yZV9hcGlfbXNnLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTkZJR1VSSU5HCisgICAgICAgICAqLworICAgICAgICBbR1JPVVBfRlNNX0VWRU5UX1RZUEVfUkVNT1ZFXSA9IGdyb3VwX2ZzbV9pZ25vcmVfYXBpX21zZywKKworICAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBDT05GSUdVUklORworICAgICAgICAgKi8KKyAgICAgICAgW0dST1VQX0ZTTV9FVkVOVF9UWVBFX1NFVF0gPSBncm91cF9mc21faWdub3JlX2FwaV9tc2csCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogQ09ORklHVVJFRAorICAgICAgICAgKi8KKyAgICAgICAgW0dST1VQX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHXSAgPSBncm91cF9mc21fY29uZmlndXJpbmdfdXRpbF9tc2csCisKKyAgICB9LAorCisgICAgW0dST1VQX0ZTTV9TVEFURV9DT05GSUdVUkVEXSA9CisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBDT01GSUdVUklORworICAgICAgICAgKi8KKyAgICAgICAgW0dST1VQX0ZTTV9FVkVOVF9UWVBFX0NSRUFURV0gID0gZ3JvdXBfZnNtX2lnbm9yZV9hcGlfbXNnLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IERFTEVUSU5HCisgICAgICAgICAqLworICAgICAgICBbR1JPVVBfRlNNX0VWRU5UX1RZUEVfREVTVFJPWV0gPSBncm91cF9mc21fZGVzdHJveSwKKworICAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBDT05GSUdVUklORworICAgICAgICAgKi8KKyAgICAgICAgW0dST1VQX0ZTTV9FVkVOVF9UWVBFX0FERF0gICAgID0gZ3JvdXBfZnNtX2FkZCwKKworICAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBDT05GSUdVUklORworICAgICAgICAgKi8KKyAgICAgICAgW0dST1VQX0ZTTV9FVkVOVF9UWVBFX1JFTU9WRV0gPSBncm91cF9mc21fcmVtb3ZlLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTkZJR1VSSU5HCisgICAgICAgICAqLworICAgICAgICBbR1JPVVBfRlNNX0VWRU5UX1RZUEVfU0VUXSA9IGdyb3VwX2ZzbV9zZXQsCisKKyAgICB9LAorCisgICAgW0dST1VQX0ZTTV9TVEFURV9ERUxFVElOR10gPQorICAgIHsKKyAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBERUxFVElORworICAgICAgICAgKi8KKyAgICAgICAgW0dST1VQX0ZTTV9FVkVOVF9UWVBFX0NSRUFURV0gID0gZ3JvdXBfZnNtX2lnbm9yZV9hcGlfbXNnLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IERFTEVUSU5HCisgICAgICAgICAqLworICAgICAgICBbR1JPVVBfRlNNX0VWRU5UX1RZUEVfREVTVFJPWV0gPSBncm91cF9mc21faWdub3JlX2FwaV9tc2csCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogREVMRVRJTkcKKyAgICAgICAgICovCisgICAgICAgIFtHUk9VUF9GU01fRVZFTlRfVFlQRV9BRERdICAgICA9IGdyb3VwX2ZzbV9pZ25vcmVfYXBpX21zZywKKworICAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBERUxFVElORworICAgICAgICAgKi8KKyAgICAgICAgW0dST1VQX0ZTTV9FVkVOVF9UWVBFX1JFTU9WRV0gPSBncm91cF9mc21faWdub3JlX2FwaV9tc2csCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogREVMRVRJTkcKKyAgICAgICAgICovCisgICAgICAgIFtHUk9VUF9GU01fRVZFTlRfVFlQRV9TRVRdID0gZ3JvdXBfZnNtX2lnbm9yZV9hcGlfbXNnLAorCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IE5VTEwKKyAgICAgICAgICovCisgICAgICAgIFtHUk9VUF9GU01fRVZFTlRfVFlQRV9VVElMX01TR10gID0gZ3JvdXBfZnNtX2RlbGV0aW5nX3V0aWxfbXNnLAorCisgICAgfSwKKworfTsKKworc3RhdGljIGNoYXIgKnN0YXRlX25hbWVfc3RyW10gPQoreworICAgICJHUk9VUF9GU01fU1RBVEVfTlVMTCIsCisgICAgIkdST1VQX0ZTTV9TVEFURV9DT05GSUdVUklORyIsCisgICAgIkdST1VQX0ZTTV9TVEFURV9DT05GSUdVUkVEIiwKKyAgICAiR1JPVVBfRlNNX1NUQVRFX0RFTEVUSU5HIiwKK307CisKKy8qIEVuc3VyZSB0aGF0IHRoZSBuYW1lIGFycmF5IHNpemUgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBlbnVtICovCitCQUxfU1RBVElDX0FTU0VSVCAoR1JPVVBfRlNNX1NUQVRFX19MQVNUID09IChzaXplb2YgKHN0YXRlX25hbWVfc3RyKSAvIHNpemVvZiAoY2hhciAqKSksIGdyb3VwX2ZzbV9zdGF0ZSk7CisKK3N0YXRpYyBjaGFyICpncm91cF9zdGF0ZV9uYW1lX2dldChncm91cF9mc21fc3RhdGUgc3RhdGUpCit7CisgICAgaWYoc3RhdGUgPCBHUk9VUF9GU01fU1RBVEVfX0xBU1QpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGVfbmFtZV9zdHJbc3RhdGVdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gIkdST1VQX1VOS05PV04iOworICAgIH0KK30KKworc3RhdGljIGNoYXIgKmV2ZW50X25hbWVfc3RyW10gPQoreworICAgICJHUk9VUF9GU01fQ1JFQVRFX0VWRU5UIiwKKyAgICAiR1JPVVBfRlNNX0RFU1RST1lfRVZFTlQiLAorICAgICJHUk9VUF9GU01fQUREX0VWRU5UIiwKKyAgICAiR1JPVVBfRlNNX1JFTU9WRV9FVkVOVCIsCisgICAgIkdST1VQX0ZTTV9TRVRfRVZFTlQiLAorICAgICJHUk9VUF9GU01fVVRJTF9NU0dfRVZFTlQiLAorfTsKKworLyogRW5zdXJlIHRoYXQgdGhlIG5hbWUgYXJyYXkgc2l6ZSBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIGVudW0gKi8KK0JBTF9TVEFUSUNfQVNTRVJUIChHUk9VUF9GU01fRVZFTlRfVFlQRV9fTEFTVCA9PSAoc2l6ZW9mIChldmVudF9uYW1lX3N0cikgLyBzaXplb2YgKGNoYXIgKikpLCBncm91cF9mc21fZXZlbnRfdHlwZSk7CisKK3N0YXRpYyBjaGFyICpncm91cF9ldmVudF9uYW1lX2dldChncm91cF9mc21fZXZlbnRfdHlwZSBldmVudCkKK3sKKyAgICBpZihldmVudCA8IEdST1VQX0ZTTV9FVkVOVF9UWVBFX19MQVNUKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV2ZW50X25hbWVfc3RyW2V2ZW50XTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuICJHUk9VUF9FVlRfVU5LTk9XTiI7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIGN1cnJlbnRfZ3JvdXBfaW5mbyBvYmplY3Qgb2YgdGhlIAorICogICAgICAgIHN1cHBsaWVkIGVudHJ5LgorICoKKyAqIEBwYXJhbSBwX2VudHJ5IEEgcG9pbnRlciB0byB0aGUgZW50cnkgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqCisgKgorICogQHJldHVybnMgdm9pZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZ3JvdXBfaW5zdF9lbnRyeV9vYmpfaW5pdChncm91cF9pbnN0ICpwX2VudHJ5KQoreworICAgIC8qIFRoZSBhY3R1YWwga2V5IGNvbnRlbnQgaXMgaXJyZWxldmFudCBmb3IgZnJlZSBncm91cHMgKi8KKyAgICBiY21iYWxfZ3JvdXBfa2V5IGtleSA9IHsgLmdyb3VwX2lkID0gMCB9OworCisgICAgQkNNQkFMX0NGR19JTklUKCZwX2VudHJ5LT5jdXJyZW50X2dyb3VwX2luZm8sCisgICAgICAgICAgICAgICAgICAgIGdyb3VwLAorICAgICAgICAgICAgICAgICAgICBrZXkpOworCisgICAgQkNNQkFMX09CSl9JTl9QUk9HUkVTU19TRVQoJihwX2VudHJ5LT5jdXJyZW50X2dyb3VwX2luZm8pLCBCQ01PU19GQUxTRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgR3JvdXAgRlNNIGluZnJhc3RydWN0dXJlLgorICoKKyAqICAgICAgICBOT1RFOiBUaGlzIGlzIGNhbGxlZCBvbmNlIG9uIHN0YXJ0dXAgYW5kIE5PVCBmb3IgZWFjaCBGU00gaW5zdGFuY2UuCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGdyb3VwX2ZzbV9pbml0KHZvaWQpCit7CisgICAgaW50IGlpOworICAgIGdyb3VwX2luc3QgKm5ld19lbnRyeTsKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisjaWZkZWYgRU5BQkxFX0xPRworICAgIGxvZ19pZF9ncm91cCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJHUk9VUCIsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIEJVR19PTihsb2dfaWRfZ3JvdXAgPT0gREVWX0xPR19JTlZBTElEX0lEKTsKKyNlbmRpZgorCisgICAgLyogSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIGdyb3VwIHF1ZXVlcyAqLworICAgIFRBSUxRX0lOSVQoJkdST1VQX0ZTTV9HUk9VUF9MSVNUX0NUWF9QVFItPmZyZWVfZ3JvdXBfbGlzdCk7CisgICAgVEFJTFFfSU5JVCgmR1JPVVBfRlNNX0dST1VQX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX2dyb3VwX2xpc3QpOworCisgICAgLyogUG9wdWxhdGUgdGhlIGZyZWUgbGlzdCB3aXRoIGl0J3MgaW5pdGlhbCBzZXQgb2YgZ3JvdXBzCisgICAgICovCisgICAgZm9yKGlpPTA7IGlpPEdST1VQX0FMTE9DQVRJT05fQkxPQ0tfU0laRTsgaWkrKykKKyAgICB7CisKKyAgICAgICAgbmV3X2VudHJ5ID0gYmNtb3NfY2FsbG9jKHNpemVvZihncm91cF9pbnN0KSk7CisKKyAgICAgICAgaWYgKE5VTEwgPT0gbmV3X2VudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEZBVEFMLCBsb2dfaWRfZ3JvdXAsICAiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGdyb3VwIGZyZWUgbGlzdCAtIEZBVEFMXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgZ3JvdXBfZnJlZV9ieV9lbnRyeShuZXdfZW50cnkpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gdW4taW5pdGlhbGl6ZSB0aGUgR3JvdXAgRlNNIGluZnJhc3RydWN0dXJlLgorICoKKyAqICAgICAgICBOT1RFOiBUaGlzIGlzIGNhbGxlZCBvbmNlIG9uIHNodXRkb3duIGFuZCBOT1QgZm9yIGVhY2ggRlNNIGluc3RhbmNlLgorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBncm91cF9mc21fZmluaXNoKHZvaWQpCit7CisKKyAgICBncm91cF9pbnN0ICpjdXJyZW50X2VudHJ5LCAqcF90ZW1wX2VudHJ5OworCisgICAgLyogRnJlZSBhbGwgdGhlIGVudHJpZXMgb24gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICZHUk9VUF9GU01fR1JPVVBfTElTVF9DVFhfUFRSLT5hY3RpdmVfZ3JvdXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfaW5zdF9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBwX3RlbXBfZW50cnkpCisgICAgeworICAgICAgICAvKiBmcmVlIHVwIHRoZSBpbnRlcm5hbCBhbGxvY2F0ZWQgbWVtYmVyIGluZm8gKi8KKyAgICAgICAgaWYoY3VycmVudF9lbnRyeS0+Y3VycmVudF9ncm91cF9pbmZvLmRhdGEubWVtYmVycy52YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoY3VycmVudF9lbnRyeS0+Y3VycmVudF9ncm91cF9pbmZvLmRhdGEubWVtYmVycy52YWwpOworICAgICAgICB9CisgICAgICAgIC8qIFJlbW92ZSBpdCBmcm9tIHRoZSBhY3RpdmUgbGlzdCAqLworICAgICAgICBUQUlMUV9SRU1PVkUoJkdST1VQX0ZTTV9HUk9VUF9MSVNUX0NUWF9QVFItPmFjdGl2ZV9ncm91cF9saXN0LCBjdXJyZW50X2VudHJ5LCBncm91cF9pbnN0X25leHQpOworCisgICAgICAgIGJjbW9zX2ZyZWUoY3VycmVudF9lbnRyeSk7CisKKyAgICB9CisKKyAgICAvKiBGcmVlIGFsbCB0aGUgZW50cmllcyBvbiB0aGUgZnJlZSBsaXN0ICovCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICZHUk9VUF9GU01fR1JPVVBfTElTVF9DVFhfUFRSLT5mcmVlX2dyb3VwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2luc3RfbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgcF90ZW1wX2VudHJ5KQorICAgIHsKKyAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgICAgIFRBSUxRX1JFTU9WRSgmR1JPVVBfRlNNX0dST1VQX0xJU1RfQ1RYX1BUUi0+ZnJlZV9ncm91cF9saXN0LCBjdXJyZW50X2VudHJ5LCBncm91cF9pbnN0X25leHQpOworCisgICAgICAgIGJjbW9zX2ZyZWUoY3VycmVudF9lbnRyeSk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBHcm91cCBGU00gc3RhdGUgcHJvY2Vzc2luZyBleGVjdXRpdmUgZnVuY3Rpb24KKyAqCisgKiBAcGFyYW0gcF9ncm91cF9pbnN0ICBQb2ludGVyIHRvIGEgZ3JvdXAgaW5zdGFuY2UKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgUG9pbnRlciB0byBhIGdyb3VwIGV2ZW50IHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnNtX2V4ZWMoZ3JvdXBfaW5zdCAqcF9ncm91cF9pbnN0LCBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBncm91cF9mc21fc3RhdGUgcHJlX3N0YXRlOworICAgIGdyb3VwX2ZzbV9zdGF0ZV9wcm9jZXNzb3IgZ3JvdXBfc3RhdGVfcHJvY2Vzc29yOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IHBfZ3JvdXBfaW5zdCk7CisgICAgQlVHX09OKE5VTEwgPT0gcF9ldmVudCk7CisKKyAgICAvKiBSZWNvcmQgdGhlIHByZXNlbnQgc3RhdGUgZm9yIGRlYnVnIHByaW50aW5nCisgICAgICovCisgICAgcHJlX3N0YXRlID0gcF9ncm91cF9pbnN0LT5mc21fc3RhdGU7CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbgorICAgICAqLworICAgIGdyb3VwX3N0YXRlX3Byb2Nlc3NvciA9IGdyb3VwX3N0YXRlc1twX2dyb3VwX2luc3QtPmZzbV9zdGF0ZV1bcF9ldmVudC0+ZXZlbnRfdHlwZV07CisKKyAgICAvKgorICAgICAqIElmIHRoZXJlJ3MgYSBzdGF0ZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIGZvciB0aGlzIGV2ZW50IGFuZCBzdGF0ZSwgZXhlY3V0ZSBpdC4KKyAgICAgKiBPdGhlcndpc2UsIHByb2Nlc3MgYSBnZW5lcmljIGVycm9yLgorICAgICAqLworICAgIGlmIChncm91cF9zdGF0ZV9wcm9jZXNzb3IpCisgICAgeworICAgICAgICByZXQgPSBncm91cF9zdGF0ZV9wcm9jZXNzb3IocF9ncm91cF9pbnN0LCBwX2V2ZW50LT5tc2csIHBfZXZlbnQpOworICAgIH0gZWxzZQorICAgIHsKKyAgICAgICAgZ3JvdXBfZnNtX3N0YXRlX2VycihwX2dyb3VwX2luc3QsIHBfZXZlbnQtPm1zZywgcF9ldmVudCk7CisgICAgfQorCisgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZ3JvdXAsICIqKiogRXJyb3IgZGV0ZWN0ZWQgZHVyaW5nIHN0YXRlIHByb2Nlc3NpbmdcbiIpOworICAgICAgICBwX2dyb3VwX2luc3QtPmZzbV9zdGF0ZSA9IHByZV9zdGF0ZTsKKyAgICB9CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZ3JvdXAsICAiKioqIEV2ZW50ICVzLCBTdGF0ZTogJXMgLS0+ICVzXG5cbiIsCisgICAgICAgICAgICBncm91cF9ldmVudF9uYW1lX2dldChwX2V2ZW50LT5ldmVudF90eXBlKSwKKyAgICAgICAgICAgIGdyb3VwX3N0YXRlX25hbWVfZ2V0KHByZV9zdGF0ZSksCisgICAgICAgICAgICBncm91cF9zdGF0ZV9uYW1lX2dldChwX2dyb3VwX2luc3QtPmZzbV9zdGF0ZSkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEdyb3VwIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZvciBhIGdyb3VwIGNyZWF0ZSBjb21tYW5kIHJlY2VpdmVkCisgKiAgICAgICAgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkuCisgKgorICogQHBhcmFtIHBfZ3JvdXBfaW5zdCAgICAgIFBvaW50ZXIgdG8gYSBncm91cCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGEgZ3JvdXAgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBncm91cF9mc21fY3JlYXRlKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgZ3JvdXBfZnNtX3N0YXRlIHByZV9mc21fc3RhdGU7CisKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9ncm91cCwgICJHb3QgU0VUIHJlcXVlc3QgZnJvbSBCQUwgQVBJIC0gY3JlYXRlIGdyb3VwIFxuIik7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogc2F2ZSB0aGUgY3VycmVudCBzdGF0ZSAqLworICAgICAgICBwcmVfZnNtX3N0YXRlID0gcF9ncm91cF9pbnN0LT5mc21fc3RhdGU7CisgICAgICAgIC8qIGNoYW5nZSBHcm91cCBzdGF0ZSB0byBDT05GSUdVUklORyAqLworICAgICAgICBwX2dyb3VwX2luc3QtPmZzbV9zdGF0ZSA9IEdST1VQX0ZTTV9TVEFURV9DT05GSUdVUklORzsKKworICAgICAgICAvKuKAkyBDb3JlIGNhbGxzIFN3aXRjaCBVdGlscyB0byBhZGQgYXBwbGljYWJsZSBDTURzICovCisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IHN3X3V0aWxfZ3JvdXBfc2V0KHBfZ3JvdXBfaW5zdCwgQkFMX1VUSUxfT1BFUl9HUk9VUF9DUkVBVEUpKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAgImVycm9yICVzIGRldGVjdGVkIGJ5IHN3aXRjaCB1dGlsIHdoaWxlIGNyZWF0ZSBncm91cFxuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8q4oCTIENvcmUgY2FsbHMgTWFjIFV0aWxzIGNyZWF0ZSBhcHBsaWNhYmxlIENNRHMgKi8KKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gbWFjX3V0aWxfZ3JvdXBfc2V0KHBfZ3JvdXBfaW5zdCwgQkFMX1VUSUxfT1BFUl9HUk9VUF9DUkVBVEUsIEJDTU9TX1RSVUUpKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAgImVycm9yICVzIGRldGVjdGVkIGJ5IG1hYyB1dGlsXG4iLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKworICAgICAgICAgICAgLyogUmV2ZXJzZSB0aGUgKGp1c3QgY3JlYXRlKSBncm91cCBpbiB0aGUgc3dpdGNoLCBvdGhlcndpc2UgdGhlIHN3aXRjaCB1dGlscworICAgICAgICAgICAgICogd2lsbCBiZSBvdXQgb2Ygc3luYyB3aXRoIENvcmUgYW5kIE1hYy4gIFRoZXJlJ3Mgbm90CisgICAgICAgICAgICAgKiBtdWNoIHdlIGNhbiBkbyBhYm91dCBpdCBpZiByZXZlcnNpbmcgdGhpcyBncm91cCBmYWlscy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSBzd191dGlsX2dyb3VwX3NldChwX2dyb3VwX2luc3QsIEJBTF9VVElMX09QRVJfR1JPVVBfREVTVFJPWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIGRldGVjdGVkIGJ5IHN3aXRjaCB1dGlsIHdoaWxlIHJldmVyc2luZyBjcmVhdGUgZ3JvdXBcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRlICovCisgICAgICAgICAgICAgICAgcF9ncm91cF9pbnN0LT5mc21fc3RhdGUgPSBwcmVfZnNtX3N0YXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSBoYXJkd2FyZSBoYXMgcHJvcGVybHkgYWNjZXB0ZWQgdGhlIG9iamVjdCBpbmZvLCBzbyBjb3B5IG9iamVjdCB0bworICAgICAgICAgKiB0aGUgY3VycmVudCBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIGJjbWJhbF9ncm91cF9vYmplY3Rfb3ZlcmxheSgmcF9ncm91cF9pbnN0LT5hcGlfcmVxX2dyb3VwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm8pOworCisgICAgICAgIEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfU0VUKCYocF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm8pLCBCQ01PU19UUlVFKTsKKworICAgIH13aGlsZSgwKTsKKworICAgIC8qIElmIHRoZXJlIHdlcmUgZXJyb3JzIGR1cmluZyBwcm9jZXNzaW5nLCB0aGVuIHJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIEFQSSAqLworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgIHsKKyAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19pZF9ncm91cCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgR3JvdXAgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZm9yIGEgZ3JvdXAgZGVzdHJveSBjb21tYW5kIHJlY2VpdmVkCisgKiAgICAgICAgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkuCisgKgorICogQHBhcmFtIHBfZ3JvdXBfaW5zdCAgICAgIFBvaW50ZXIgdG8gYSBncm91cCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGEgZ3JvdXAgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBncm91cF9mc21fZGVzdHJveShncm91cF9pbnN0ICpwX2dyb3VwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGdyb3VwX2ZzbV9zdGF0ZSBzYXZfc3RhdGUgPSBwX2dyb3VwX2luc3QtPmZzbV9zdGF0ZTsKKyAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2dyb3VwX2NmZzsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9ncm91cCwgICJHb3QgQ0xFQVIgcmVxdWVzdCBmcm9tIEJBTCBBUEkgLSBkZXN0cm95IGdyb3VwIFxuIik7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogY2hhbmdlIEdyb3VwIHN0YXRlIHRvIENPTkZJR1VSSU5HICovCisgICAgICAgIHBfZ3JvdXBfaW5zdC0+ZnNtX3N0YXRlID0gR1JPVVBfRlNNX1NUQVRFX0RFTEVUSU5HOworCisgICAgICAgIC8qIERlc3Ryb3kgb3BlcmF0aW9uIGlzIGJlc3QgZWZmb3J0LCBhcyBpdCBpcyB1bmxpa2VseSB0byBmYWlsICovCisgICAgICAgIC8q4oCTIENvcmUgY2FsbHMgU3dpdGNoIFV0aWxzIHRvIGFkZCBhcHBsaWNhYmxlIENNRHMgKi8KKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gc3dfdXRpbF9ncm91cF9zZXQocF9ncm91cF9pbnN0LCBCQUxfVVRJTF9PUEVSX0dST1VQX0RFU1RST1kpKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAgImVycm9yICVzIGRldGVjdGVkIGJ5IHN3aXRjaCB1dGlsIHdoaWxlIGRlc3Ryb3kgZ3JvdXBcbiIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgLyogaWYgdGhlIGdyb3VwIGlzIGJ1c3ksIHNvbWUgZmxvdyBzdGlsbCByZWZlcmVuY2UgdGhpcyBncm91cCwgc2tpcCB0aGUgTUFDIGFuZCByZXR1cm4gZXJyb3IKKyAgICAgICAgICAgICAgIG5vIG1lbWJlciBoYXMgYmVlbiBjbGVhbiB1cCAqLworICAgICAgICAgICAgaWYocmV0ID09IEJDTV9FUlJfSU5WQUxJRF9PUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvKSwgQkNNT1NfVFJVRSk7CisgICAgICAgICAgICAgICAgcF9ncm91cF9pbnN0LT5mc21fc3RhdGUgPSBzYXZfc3RhdGU7CisgICAgICAgICAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwgbXNnLCBsb2dfaWRfZ3JvdXApOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKuKAkyBDb3JlIGNhbGxzIE1hYyBVdGlscyBjcmVhdGUgYXBwbGljYWJsZSBDTURzICovCisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IG1hY191dGlsX2dyb3VwX3NldChwX2dyb3VwX2luc3QsIEJBTF9VVElMX09QRVJfR1JPVVBfREVTVFJPWSwgQkNNT1NfVFJVRSkpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZ3JvdXAsICAiZXJyb3IgJXMgZGV0ZWN0ZWQgYnkgbWFjIHV0aWxcbiIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgaGFyZHdhcmUgaGFzIHByb3Blcmx5IGFjY2VwdGVkIHRoZSBvYmplY3QgaW5mbywgc28gY29weSBvYmplY3QgdG8KKyAgICAgICAgICogdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICAgICAqLworCisgICAgICAgIEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfU0VUKCYocF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm8pLCBCQ01PU19UUlVFKTsKKworICAgIH13aGlsZSgwKTsKKyAgICAKKyAgICAvKiBJZiB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgcHJvY2Vzc2luZywgdGhlbiByZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBBUEkgICovCisgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgeworICAgICAgICBtZ210X21zZ19zZW5kX2JhbGFwaV9pbmQocmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19pZF9ncm91cCk7IAorICAgICAgICAvKiBUQkQsIG5lZWQgbG9naWMgdG8gcGVyZm9ybSBlcnJvciByZWNvdmVyeSBpZiBTd2l0Y2hVdGlsIHN1Y2Nlc3MgYW5kIE1hY1V0aWwgZmFpbGVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeyAgICAgICAgICAKKyAgICAgICAvKiB1cGRhdGUgcmVzb3VyY2UgbWFuYWdlciBvbiBzdmNfcG9ydF9pZCB1c2FnZSAtIGtlZXAgZ29pbmcgYXMgdGhlIE1hYyBhbmQgU3dpdGNoIGFscmVhZHkgY2xlYW4gdXAgKi8KKyAgICAgICAgcF9ncm91cF9jZmcgPSAmcF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm87CisgICAgICAgIGZvcihpPTA7IGk8cF9ncm91cF9jZmctPmRhdGEubWVtYmVycy5sZW47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByc2NfbWdyX2dlbV9mcmVlKHBfZ3JvdXBfY2ZnLT5kYXRhLm1lbWJlcnMudmFsW2ldLmludGZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9ncm91cF9jZmctPmRhdGEubWVtYmVycy52YWxbaV0uc3ZjX3BvcnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGRlc3Ryb3kgb2YgZ3JvdXAgcmVzb3VyY2VzIChnZW1faWQ6ICVkLCBpbnRmX2lkOiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcF9ncm91cF9jZmctPmRhdGEubWVtYmVycy52YWxbaV0uc3ZjX3BvcnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBwX2dyb3VwX2NmZy0+ZGF0YS5tZW1iZXJzLnZhbFtpXS5pbnRmX2lkKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfSAKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgR3JvdXAgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZm9yIGEgZ3JvdXAgc2V0IGNvbW1hbmQgcmVjZWl2ZWQKKyAqICAgICAgICBmcm9tIHRoZSBCQUwgUHVibGljIEFQSS4KKyAqCisgKiBAcGFyYW0gcF9ncm91cF9pbnN0ICAgICAgUG9pbnRlciB0byBhIGdyb3VwIGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYSBncm91cCBldmVudCBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGdyb3VwX2ZzbV9zZXQoZ3JvdXBfaW5zdCAqcF9ncm91cF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworCisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBncm91cF9pbnN0IGdyb3VwX2luc3RfcnZ0OworICAgIGJjbWJhbF9ncm91cF9jZmcgKnBfZ3JvdXBfY2ZnOworICAgIGludCBpOworCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfZ3JvdXAsICAiR290IFNFVCByZXF1ZXN0IGZyb20gQkFMIEFQSSAtIHJlcGxhY2UgZ3JvdXAgbWVtYmVyc1xuIik7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogc2F2ZSB0aGUgY3VycmVudCBzdGF0ZSAqLworICAgICAgICBncm91cF9pbnN0X3J2dC5mc21fc3RhdGUgPSBwX2dyb3VwX2luc3QtPmZzbV9zdGF0ZTsKKyAgICAgICAgLyogY2hhbmdlIEdyb3VwIHN0YXRlIHRvIENPTkZJR1VSSU5HICovCisgICAgICAgIHBfZ3JvdXBfaW5zdC0+ZnNtX3N0YXRlID0gR1JPVVBfRlNNX1NUQVRFX0NPTkZJR1VSSU5HOworCisgICAgICAgIC8q4oCTIENvcmUgY2FsbHMgU3dpdGNoIFV0aWxzIHRvIGFkZCBhcHBsaWNhYmxlIENNRHMgKi8KKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gc3dfdXRpbF9ncm91cF9zZXQocF9ncm91cF9pbnN0LCBCQUxfVVRJTF9PUEVSX0dST1VQX1NFVCkpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZ3JvdXAsICAiZXJyb3IgJXMgZGV0ZWN0ZWQgYnkgc3dpdGNoIHV0aWwgd2hpbGUgc2V0IGdyb3VwIG1lbWJlcnNcbiIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKuKAkyBDb3JlIGNhbGxzIE1hYyBVdGlscyBhZGQgYXBwbGljYWJsZSBDTURzICovCisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IG1hY191dGlsX2dyb3VwX3NldChwX2dyb3VwX2luc3QsIEJBTF9VVElMX09QRVJfR1JPVVBfU0VULCBCQ01PU19UUlVFKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwgICJlcnJvciAlcyBkZXRlY3RlZCBieSBtYWMgdXRpbFxuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisKKyAgICAgICAgICAgIGdyb3VwX2luc3RfcnZ0LmN1cnJlbnRfZ3JvdXBfaW5mbyA9IHBfZ3JvdXBfaW5zdC0+YXBpX3JlcV9ncm91cF9pbmZvOworICAgICAgICAgICAgZ3JvdXBfaW5zdF9ydnQuYXBpX3JlcV9ncm91cF9pbmZvID0gcF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm87CisgICAgICAgICAgICAvKiBSZXZlcnNlIHRoZSAoanVzdCBzZXQpIGdyb3VwIGZyb20gdGhlIHN3aXRjaCBvdGhlcndpc2UgdGhlIHN3aXRjaCB1dGlscworICAgICAgICAgICAgICogd2lsbCBiZSBvdXQgb2Ygc3luYyB3aXRoIENvcmUgYW5kIE1hYy4gIFRoZXJlJ3Mgbm90CisgICAgICAgICAgICAgKiBtdWNoIHdlIGNhbiBkbyBhYm91dCBpdCBpZiByZXZlcnNpbmcgdGhpcyBncm91cCBmYWlscy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSBzd191dGlsX2dyb3VwX3NldCgmZ3JvdXBfaW5zdF9ydnQsIEJBTF9VVElMX09QRVJfR1JPVVBfU0VUKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgZGV0ZWN0ZWQgYnkgc3dpdGNoIHV0aWwgd2hpbGUgcmV2ZXJzaW5nIGdyb3VwXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiByZXN0b3JlIHRoZSBvcmlnaW5hbCBzdGF0ZSAqLworICAgICAgICAgICAgICAgIHBfZ3JvdXBfaW5zdC0+ZnNtX3N0YXRlID0gZ3JvdXBfaW5zdF9ydnQuZnNtX3N0YXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiB1cGRhdGUgcmVzb3VyY2UgbWFuYWdlciBvbiBzdmNfcG9ydF9pZCB1c2FnZSAtIGZyZWUgdGhlIGdlbSBvbiBvbGQgbWVtYmVycyAqLworICAgICAgICBwX2dyb3VwX2NmZyA9ICZwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mbzsKKyAgICAgICAgZm9yKGk9MDsgaTxwX2dyb3VwX2NmZy0+ZGF0YS5tZW1iZXJzLmxlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJzY19tZ3JfZ2VtX2ZyZWUocF9ncm91cF9jZmctPmRhdGEubWVtYmVycy52YWxbaV0uaW50Zl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2dyb3VwX2NmZy0+ZGF0YS5tZW1iZXJzLnZhbFtpXS5zdmNfcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgcmVsZWFzZSBvZiBncm91cCByZXNvdXJjZXMgKGdlbV9pZDogJWQsIGludGZfaWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX2dyb3VwX2NmZy0+ZGF0YS5tZW1iZXJzLnZhbFtpXS5zdmNfcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfZ3JvdXBfY2ZnLT5kYXRhLm1lbWJlcnMudmFsW2ldLmludGZfaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAvKiBzZXQgb3BlcmF0aW9uIGNhbiBiZSBtYWRlIHdpdGhvdXQgQ1JFQVRFLCBzbyBmaWxsIGluIHRoZSBub24tbWVtYmVyIGluZm8gKi8KKyAgICAgICAgYmNtYmFsX2dyb3VwX29iamVjdF9vdmVybGF5KCZwX2dyb3VwX2luc3QtPmFwaV9yZXFfZ3JvdXBfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mbyk7CisKKyAgICAgICAgLyogVGhlIGhhcmR3YXJlIGhhcyBwcm9wZXJseSBhY2NlcHRlZCB0aGUgb2JqZWN0IGluZm8sIHNvIHRoZSByZXF1ZXN0IG9iamVjdCBiZWNvbWVzCisgICAgICAgICAqIHRoZSBjdXJyZW50IHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgYmNtYmFsX2dyb3VwX29iamVjdF9tZW1iZXJfcmVwbGFjZSgmcF9ncm91cF9pbnN0LT5hcGlfcmVxX2dyb3VwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvKTsKKworICAgICAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvKSwgQkNNT1NfVFJVRSk7CisKKyAgICB9d2hpbGUoMCk7CisKKyAgICAvKiBJZiB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgcHJvY2Vzc2luZywgdGhlbiByZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBBUEkgKi8KKyAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICB7CisgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfZ3JvdXApOworICAgIH0KKworICAgIHJldHVybiByZXQ7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEdyb3VwIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZvciBhIGdyb3VwIGFkZCBjb21tYW5kIHJlY2VpdmVkCisgKiAgICAgICAgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkuCisgKgorICogQHBhcmFtIHBfZ3JvdXBfaW5zdCAgICAgIFBvaW50ZXIgdG8gYSBncm91cCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGEgZ3JvdXAgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBncm91cF9mc21fYWRkKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgZ3JvdXBfZnNtX3N0YXRlIHByZV9mc21fc3RhdGU7CisKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9ncm91cCwgICJHb3QgU0VUIHJlcXVlc3QgZnJvbSBCQUwgQVBJIC0gYWRkIGdyb3VwIG1lbWJlcnNcbiIpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgKi8KKyAgICAgICAgcHJlX2ZzbV9zdGF0ZSA9IHBfZ3JvdXBfaW5zdC0+ZnNtX3N0YXRlOworICAgICAgICAvKiBjaGFuZ2UgR3JvdXAgc3RhdGUgdG8gQ09ORklHVVJJTkcgKi8KKyAgICAgICAgcF9ncm91cF9pbnN0LT5mc21fc3RhdGUgPSBHUk9VUF9GU01fU1RBVEVfQ09ORklHVVJJTkc7CisKKyAgICAgICAgLyrigJMgQ29yZSBjYWxscyBTd2l0Y2ggVXRpbHMgdG8gYWRkIGFwcGxpY2FibGUgQ01EcyAqLworICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBzd191dGlsX2dyb3VwX3NldChwX2dyb3VwX2luc3QsIEJBTF9VVElMX09QRVJfR1JPVVBfQUREKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwgICJlcnJvciAlcyBkZXRlY3RlZCBieSBzd2l0Y2ggdXRpbCB3aGlsZSBhZGQgZ3JvdXAgbWVtYmVyc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8q4oCTIENvcmUgY2FsbHMgTWFjIFV0aWxzIGFkZCBhcHBsaWNhYmxlIENNRHMgKi8KKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gbWFjX3V0aWxfZ3JvdXBfc2V0KHBfZ3JvdXBfaW5zdCwgQkFMX1VUSUxfT1BFUl9HUk9VUF9BREQsIEJDTU9TX1RSVUUpKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAgImVycm9yICVzIGRldGVjdGVkIGJ5IG1hYyB1dGlsXG4iLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKworICAgICAgICAgICAgLyogUmV2ZXJzZSB0aGUgKGp1c3QgYWRkKSBncm91cCBtZW1iZXIgZnJvbSB0aGUgc3dpdGNoLCBvdGhlcndpc2UgdGhlIHN3aXRjaCB1dGlscworICAgICAgICAgICAgICogd2lsbCBiZSBvdXQgb2Ygc3luYyB3aXRoIENvcmUgYW5kIE1hYy4gIFRoZXJlJ3Mgbm90CisgICAgICAgICAgICAgKiBtdWNoIHdlIGNhbiBkbyBhYm91dCBpdCBpZiByZXZlcnNpbmcgdGhpcyBncm91cCBmYWlscy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSBzd191dGlsX2dyb3VwX3NldChwX2dyb3VwX2luc3QsIEJBTF9VVElMX09QRVJfR1JPVVBfUkVNT1ZFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgZGV0ZWN0ZWQgYnkgc3dpdGNoIHV0aWwgd2hpbGUgcmV2ZXJzaW5nIGFkZCBncm91cFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBwX2dyb3VwX2luc3QtPmZzbV9zdGF0ZSA9IHByZV9mc21fc3RhdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogYWRkIG9wZXJhdGlvbiBjYW4gYmUgbWFkZSB3aXRob3V0IENSRUFURSwgc28gZmlsbCBpbiB0aGUgbm9uLW1lbWJlciBpbmZvICovCisgICAgICAgIGJjbWJhbF9ncm91cF9vYmplY3Rfb3ZlcmxheSgmcF9ncm91cF9pbnN0LT5hcGlfcmVxX2dyb3VwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm8pOworCisgICAgICAgIC8qIFRoZSBoYXJkd2FyZSBoYXMgcHJvcGVybHkgYWNjZXB0ZWQgdGhlIG9iamVjdCBpbmZvLCBzbyBhZGQgb2JqZWN0IG1lbWJlcnMgdG8KKyAgICAgICAgICogdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBiY21iYWxfZ3JvdXBfb2JqZWN0X21lbWJlcl9hZGQoJnBfZ3JvdXBfaW5zdC0+YXBpX3JlcV9ncm91cF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvKTsKKworICAgICAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvKSwgQkNNT1NfVFJVRSk7CisKKyAgICB9d2hpbGUoMCk7CisKKyAgICAvKiBJZiB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgcHJvY2Vzc2luZywgdGhlbiByZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBBUEkgKi8KKyAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICB7CisgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfZ3JvdXApOworICAgIH0KKworICAgIHJldHVybiByZXQ7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEdyb3VwIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZvciBhIGdyb3VwIHJlbW92ZSBjb21tYW5kIHJlY2VpdmVkCisgKiAgICAgICAgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkuCisgKgorICogQHBhcmFtIHBfZ3JvdXBfaW5zdCAgICAgIFBvaW50ZXIgdG8gYSBncm91cCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGEgZ3JvdXAgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBncm91cF9mc21fcmVtb3ZlKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgZ3JvdXBfZnNtX3N0YXRlIHByZV9mc21fc3RhdGU7CisgICAgYmNtYmFsX2dyb3VwX2NmZyAqcF9ncm91cF9jZmc7CisgICAgaW50IGk7CisKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9ncm91cCwgICJHb3QgU0VUIHJlcXVlc3QgZnJvbSBCQUwgQVBJIC0gcmVtb3ZlIGdyb3VwIG1lbWJlcnNcbiIpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgKi8KKyAgICAgICAgcHJlX2ZzbV9zdGF0ZSA9IHBfZ3JvdXBfaW5zdC0+ZnNtX3N0YXRlOworICAgICAgICAvKiBjaGFuZ2UgR3JvdXAgc3RhdGUgdG8gQ09ORklHVVJJTkcgKi8KKyAgICAgICAgcF9ncm91cF9pbnN0LT5mc21fc3RhdGUgPSBHUk9VUF9GU01fU1RBVEVfQ09ORklHVVJJTkc7CisKKyAgICAgICAgLyrigJMgQ29yZSBjYWxscyBTd2l0Y2ggVXRpbHMgdG8gYWRkIGFwcGxpY2FibGUgQ01EcyAqLworICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBzd191dGlsX2dyb3VwX3NldChwX2dyb3VwX2luc3QsIEJBTF9VVElMX09QRVJfR1JPVVBfUkVNT1ZFKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwgICJlcnJvciAlcyBkZXRlY3RlZCBieSBzd2l0Y2ggdXRpbCB3aGlsZSByZW1vdmUgZ3JvdXAgbWVtYmVyc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8q4oCTIENvcmUgY2FsbHMgTWFjIFV0aWxzIGFkZCBhcHBsaWNhYmxlIENNRHMgKi8KKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gbWFjX3V0aWxfZ3JvdXBfc2V0KHBfZ3JvdXBfaW5zdCwgQkFMX1VUSUxfT1BFUl9HUk9VUF9SRU1PVkUsIEJDTU9TX1RSVUUpKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAgImVycm9yICVzIGRldGVjdGVkIGJ5IG1hYyB1dGlsXG4iLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKworICAgICAgICAgICAgLyogUmV2ZXJzZSB0aGUgKGp1c3QgcmVtb3ZlKSBncm91cCBtZW1iZXIgZnJvbSB0aGUgc3dpdGNoLCBvdGhlcndpc2UgdGhlIHN3aXRjaCB1dGlscworICAgICAgICAgICAgICogd2lsbCBiZSBvdXQgb2Ygc3luYyB3aXRoIENvcmUgYW5kIE1hYy4gIFRoZXJlJ3Mgbm90CisgICAgICAgICAgICAgKiBtdWNoIHdlIGNhbiBkbyBhYm91dCBpdCBpZiByZXZlcnNpbmcgdGhpcyBncm91cCBmYWlscy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSBzd191dGlsX2dyb3VwX3NldChwX2dyb3VwX2luc3QsIEJBTF9VVElMX09QRVJfR1JPVVBfQUREKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgZGV0ZWN0ZWQgYnkgc3dpdGNoIHV0aWwgd2hpbGUgcmV2ZXJzaW5nIHJlbW92ZSBncm91cFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBwX2dyb3VwX2luc3QtPmZzbV9zdGF0ZSA9IHByZV9mc21fc3RhdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogdXBkYXRlIHJlc291cmNlIG1hbmFnZXIgb24gc3ZjX3BvcnRfaWQgdXNhZ2UgKi8KKyAgICAgICAgcF9ncm91cF9jZmcgPSAmcF9ncm91cF9pbnN0LT5hcGlfcmVxX2dyb3VwX2luZm87CisgICAgICAgIGZvcihpPTA7IGk8cF9ncm91cF9jZmctPmRhdGEubWVtYmVycy5sZW47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogaWYgaW50ZXJmYWNlIGlzIG5vdCBhIG1lbWJlciAoZS5nLiBhbHJlYWR5IHJlbW92ZWQpLCBza2lwIGl0ICovCisgICAgICAgICAgICBpZihwX2dyb3VwX2NmZy0+ZGF0YS5tZW1iZXJzLnZhbFtpXS5zdmNfcG9ydF9pZCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcnNjX21ncl9nZW1fZnJlZShwX2dyb3VwX2NmZy0+ZGF0YS5tZW1iZXJzLnZhbFtpXS5pbnRmX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZ3JvdXBfY2ZnLT5kYXRhLm1lbWJlcnMudmFsW2ldLnN2Y19wb3J0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAiIGVycm9yIGVuY291bnRlcmVkIGR1cmluZyByZWxlYXNlIG9mIGdyb3VwIHJlc291cmNlcyAoZ2VtX2lkOiAlZCwgaW50Zl9pZDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfZ3JvdXBfY2ZnLT5kYXRhLm1lbWJlcnMudmFsW2ldLnN2Y19wb3J0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgcF9ncm91cF9jZmctPmRhdGEubWVtYmVycy52YWxbaV0uaW50Zl9pZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgaGFyZHdhcmUgaGFzIHByb3Blcmx5IGFjY2VwdGVkIHRoZSBvYmplY3QgaW5mbywgc28gcmVtb3ZlIG9iamVjdCBtZW1iZXJzIGZyb20KKyAgICAgICAgICogdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBiY21iYWxfZ3JvdXBfb2JqZWN0X21lbWJlcl9yZW1vdmUoJnBfZ3JvdXBfaW5zdC0+YXBpX3JlcV9ncm91cF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvKTsKKworICAgICAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvKSwgQkNNT1NfVFJVRSk7CisKKyAgICB9d2hpbGUoMCk7CisKKyAgICAvKiBJZiB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgcHJvY2Vzc2luZywgdGhlbiByZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBBUEkgKi8KKyAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICB7CisgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfZ3JvdXApOworCisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgR3JvdXAgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gaWdub3JlIGEgcmVjZWl2ZWQgbWVzc2FnZS4KKyAqCisgKiBAcGFyYW0gcF9ncm91cF9pbnN0ICAgICBQb2ludGVyIHRvIGEgZ3JvdXAgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSQorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhIGdyb3VwIGV2ZW50IHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnNtX2lnbm9yZV9hcGlfbXNnKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9ncm91cCwgICJJZ25vcmluZyBtZXNzYWdlIGZyb20gQkFMIEFQSSB3aGVuIGluICVzIHN0YXRlIFxuIiwgZ3JvdXBfc3RhdGVfbmFtZV9nZXQocF9ncm91cF9pbnN0LT5mc21fc3RhdGUpKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgR3JvdXAgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gcHJvY2VzcyBhIG1lc3NhZ2UgZnJvbQorICogICAgICAgIG9uZSBvZiB0aGUgQkFMIGFwcHMgcmVjZWl2ZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGdyb3VwIGluc3RhbmNlIEZTTQorICogICAgICAgIGlzIGluIHRoZSBDT05GSUdVUklORyBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gcF9ncm91cF9pbnN0ICAgICBQb2ludGVyIHRvIGEgZ3JvdXAgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9uZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCBhcHBzLgorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhIGdyb3VwIGV2ZW50IHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnNtX2NvbmZpZ3VyaW5nX3V0aWxfbXNnKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0OworICAgIGJhbF91dGlsX21zZ19pbmQgKmluZF9tc2c7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKE5VTEwgPT0gcF9ncm91cF9pbnN0KTsKKyAgICBCVUdfT04oTlVMTCA9PSBtc2cpOworICAgIEJVR19PTihOVUxMID09IHBfZXZlbnQpOworCisgICAgaW5kX21zZyA9IChiYWxfdXRpbF9tc2dfaW5kICopbXNnOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2dyb3VwLAorICAgICAgICAgICAgIiBSZWNlaXZlZCBhbiBJTkQgbWVzc2FnZSBmcm9tIEJBTCBVVElMICglcykgZHVyaW5nIENPTkZJR1VSSU5HIHN0YXRlXG4iLAorICAgICAgICAgICAgc3Vic3lzdGVtX3N0cltiY21iYWxfc2VuZGVyX2dldChtc2cpXSk7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZ3JvdXAsCisgICAgICAgICAgICAiJXMsIHRocmVhZCAlcywgbW9kdWxlICVkXG4iLCBfX0ZVTkNUSU9OX18sIGJjbW9zX3Rhc2tfY3VycmVudCgpLT5uYW1lLCBiY21vc19tb2R1bGVfY3VycmVudCgpKTsKKworICAgIC8qIEhhbmRsZSBpbmRpY2F0aW9uICovCisgICAgcmV0ID0gaW5kX21zZy0+c3RhdHVzOworCisgICAgLyogUmVmbGVjdCB0aGUgZXhlY3V0aW9uIHN0YXR1cyBpbiB0aGUgb2JqZWN0IGJlaW5nIHJldHVybmVkIGluIHRoZSBpbmRpY2F0aW9uCisgICAgICovCisgICAgaWYoQkNNX0VSUl9PSyA9PSByZXQpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgZ3JvdXAgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWQKKyAgICAgICAgICovCisgICAgICAgIHBfZ3JvdXBfaW5zdC0+ZnNtX3N0YXRlID0gR1JPVVBfRlNNX1NUQVRFX0NPTkZJR1VSRUQ7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAgIkdyb3VwICVkOiBGYWlsZWQgaW4gc3RhdGUgJXMuIEVycm9yICVzXG5cbiIsCisgICAgICAgICAgICAgICAgcF9ncm91cF9pbnN0LT5hcGlfcmVxX2dyb3VwX2luZm8ua2V5Lmdyb3VwX2lkLAorICAgICAgICAgICAgICAgIGdyb3VwX3N0YXRlX25hbWVfZ2V0KHBfZ3JvdXBfaW5zdC0+ZnNtX3N0YXRlKSwKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICB9CisKKyAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvKSwgQkNNT1NfRkFMU0UpOworICAgIHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvLmhkci5oZHIuc3RhdHVzID0gcmV0OworCisgICAgLyoKKyAgICAgKiBTZW5kIHRoZSBpbmRpY2F0aW9uIGJhY2sgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGhlcmUKKyAgICAgKi8KKyAgICBtZ210X21zZ19zZW5kX2JhbGFwaV9pbmQocmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm8uaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfZ3JvdXApOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEdyb3VwIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRvIHByb2Nlc3MgYQorICogICAgICAgIG1lc3NhZ2UgZnJvbSBvbmUgb2YgdGhlIEJBTCBhcHBzIHJlY2VpdmVkIHdoZW4gdGhlIHNwZWNpZmllZAorICogICAgICAgIGdyb3VwIGluc3RhbmNlIEZTTSBpcyBpbiB0aGUgREVMRVRJTkcgc3RhdGUuCisgKgorICogQHBhcmFtIHBfZ3JvdXBfaW5zdCAgICAgUG9pbnRlciB0byBhbiBncm91cCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gb25lIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQkFMIGFwcHMuCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGEgZ3JvdXAgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBncm91cF9mc21fZGVsZXRpbmdfdXRpbF9tc2coZ3JvdXBfaW5zdCAqcF9ncm91cF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJhbF91dGlsX21zZ19pbmQgKmluZF9tc2c7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKE5VTEwgPT0gcF9ncm91cF9pbnN0KTsKKyAgICBCVUdfT04oTlVMTCA9PSBtc2cpOworICAgIEJVR19PTihOVUxMID09IHBfZXZlbnQpOworCisgICAgaW5kX21zZyA9IChiYWxfdXRpbF9tc2dfaW5kICopbXNnOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2dyb3VwLAorICAgICAgICAgICAgIiBSZWNlaXZlZCBhbiBJTkQgbWVzc2FnZSBmcm9tIEJBTCBVVElMICglcykgZHVyaW5nIERFTEVUSU5HIHN0YXRlXG4iLAorICAgICAgICAgICAgc3Vic3lzdGVtX3N0cltiY21iYWxfc2VuZGVyX2dldChtc2cpXSk7CisKKworICAgIC8qIEhhbmRsZSBpbmRpY2F0aW9uICovCisgICAgcmV0ID0gaW5kX21zZy0+c3RhdHVzOworCisgICAgLyogUmVmbGVjdCB0aGUgZXhlY3V0aW9uIHN0YXR1cyBpbiB0aGUgb2JqZWN0IGJlaW5nIHJldHVybmVkIGluIHRoZSBpbmRpY2F0aW9uCisgICAgICovCisgICAgaWYoQkNNX0VSUl9PSyA9PSByZXQpCisgICAgeworICAgICAgICBwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mby5oZHIuaGRyLnN0YXR1cyA9IHJldDsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgZ3JvdXAgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlc3Ryb3kKKyAgICAgICAgICovCisgICAgICAgIHBfZ3JvdXBfaW5zdC0+ZnNtX3N0YXRlID0gR1JPVVBfRlNNX1NUQVRFX05VTEw7CisKKyAgICAgICAgQkNNQkFMX09CSl9JTl9QUk9HUkVTU19TRVQoJihwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mbyksIEJDTU9TX0ZBTFNFKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VuZCB0aGUgaW5kaWNhdGlvbiBiYWNrIHRvIHRoZSBCQUwgcHVibGljIEFQSQorICAgICAgICAgKi8KKyAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mby5oZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfZ3JvdXApOworICAgICAgICAKKyAgICAgICAgLyogZnJlZSB1cCB0aGUgbWVtYmVyIG1lbW9yeSAqLworICAgICAgICBpZiggcF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm8uZGF0YS5tZW1iZXJzLnZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZnJlZShwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mby5kYXRhLm1lbWJlcnMudmFsKTsKKyAgICAgICAgICAgIHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvLmRhdGEubWVtYmVycy52YWwgPSBOVUxMOworICAgICAgICAgICAgcF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm8uZGF0YS5tZW1iZXJzLmxlbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgIAorICAgICAgICAvKiBSZXR1cm4gdGhlIGdyb3VwIHRvIHRoZSBmcmVlIHBvb2wgKi8KKyAgICAgICAgZ3JvdXBfZnJlZV9ieV9lbnRyeShwX2dyb3VwX2luc3QpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVycm9yICovCisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwgICJHcm91cCAlZDogRmFpbGVkIGluIHN0YXRlICVzLiBFcnJvciAlc1xuXG4iLAorICAgICAgICAgICAgICAgIHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvLmtleS5ncm91cF9pZCwKKyAgICAgICAgICAgICAgICBncm91cF9zdGF0ZV9uYW1lX2dldChwX2dyb3VwX2luc3QtPmZzbV9zdGF0ZSksCisgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICBwX2dyb3VwX2luc3QtPmZzbV9zdGF0ZSA9IEdST1VQX0ZTTV9TVEFURV9DT05GSUdVUkVEOworCisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIEdyb3VwIEZTTSBmdW5jdGlvbiB3aGljaCBpcyBleGVjdXRlZCB3aGVuIGFuIGVycm9yCisgKiAgICAgICAgaXMgZW5jb3VudGVyZWQgZHVyaW5nIEZTTSBwcm9jZXNzaW5nLgorICoKKyAqIEBwYXJhbSBwX2dyb3VwX2luc3QgICAgIFBvaW50ZXIgdG8gYSBncm91cCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gb25lIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQkFMIGFwcHMuCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGEgZ3JvdXAgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBncm91cF9mc21fc3RhdGVfZXJyKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9JTlZBTElEX09QOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX2dyb3VwLAorICAgICAgICAgICAgIkVycm9yIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgR1JPVVAgRlNNIgorICAgICAgICAgICAgIiAtIEJBRCBFVkVOVCAoKVxuIik7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgY29yZSB3b3JrZXIgdGhyZWFkIHRvIHByb2Nlc3MgYW4KKyAqICAgICAgICBncm91cCBvYmplY3QgbWVzc2FnZSAoU0VULCBHRVQsIENMRUFSLCBTVEFUUykgcmVjZWl2ZWQKKyAqICAgICAgICBmcm9tIHRoZSBCQUwgUHVibGljIEFQSS4KKyAqCisgKiBAcGFyYW0gbXNnX3BheWxvYWQgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEJBTCBQdWJsaWMgQVBJLgorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBwcm9jZXNzX2dyb3VwX29iamVjdCh2b2lkICptc2dfcGF5bG9hZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LLCByc3BfcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2dyb3VwX2NmZyA9IChiY21iYWxfZ3JvdXBfY2ZnICopbXNnX3BheWxvYWQ7CisgICAgZ3JvdXBfaW5zdCAqcF9ncm91cF9pbnN0ID0gTlVMTDsKKyAgICBncm91cF9mc21fZXZlbnQgZnNtX2V2ZW50OworICAgIGJjbWJhbF9ncm91cF9rZXkgKnBfZ3JvdXBfa2V5OworICAgIGJjbWJhbF9vYmpfbXNnX3R5cGUgb3Blcl90eXBlOworICAgIGludCBpLCBqLCBudW1fc3ZjX3BvcnRfYWxsb2NhdGVkID0gMDsKKworICAgIEJVR19PTihOVUxMID09IG1zZ19wYXlsb2FkKTsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9ncm91cCwgICJQcm9jZXNzaW5nIGEgZ3JvdXAgb2JqZWN0XG4iKTsKKworICAgIHBfZ3JvdXBfa2V5ID0gJnBfZ3JvdXBfY2ZnLT5rZXk7CisKKyAgICBvcGVyX3R5cGUgPSBwX2dyb3VwX2NmZy0+aGRyLmhkci50eXBlOworCisgICAgLyoKKyAgICAgKiBBIG1lc3NhZ2UgcG9pbnRlciBtYXkgYmUgcGFzc2VkIGluc2lkZSB0aGUgZXZlbnQgc3RydWN0dXJlLgorICAgICAqLworICAgIGZzbV9ldmVudC5tc2cgPSBtc2dfcGF5bG9hZDsKKworICAgIC8qIFNFVCBvciBHRVQgb3IgQ0xFQVIuLi4/ICovCisgICAgc3dpdGNoIChvcGVyX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIChCQ01CQUxfT0JKX01TR19UWVBFX1NFVCk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgYl9nZW5lcmF0ZV9ldmVudCA9IEJDTU9TX0ZBTFNFOworCisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzaW5nIGEgZ3JvdXAgU0VUIFJFUSBtZ210IG1lc3NhZ2VcbiIpOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKEJDTUJBTF9TVEFUVVNfVVAgIT0gYWNjX3Rlcm1fc3RhdHVzX2dldCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFUlJPUiAtIEFjY2Vzcy10ZXJtaW5hbCBpcyBub3QgVVAuICBObyBmdXJ0aGVyIHByb2Nlc3NpbmdcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1NUQVRFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBGaW5kIG9yIGNyZWF0ZSB0aGUgc3BlY2lmaWVkIGdyb3VwIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcF9ncm91cF9pbnN0ID0gZ3JvdXBfaW5zdF9nZXQocF9ncm91cF9rZXksIEdST1VQX0ZMQUdfQU5ZKTsKKyAgICAgICAgICAgICAgICBpZihOVUxMID09IHBfZ3JvdXBfaW5zdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYSBmYXRhbCBlcnJvciBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVJST1IgLSBHcm91cCBub3QgZm91bmQuICBObyBmdXJ0aGVyIHByb2Nlc3NpbmdcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHN0YXRlIG9mIHRoaXMgZ3JvdXAgaXMgaW4gZmx1eCwgdGhlbiByZWplY3QgdGhlIFNFVCByZXF1ZXN0ICovCisgICAgICAgICAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX0dFVCgmKHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOX1BST0dSRVNTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBpZiBuZWVkZWQsIHJlcXVlc3QvdmFsaWRhdGUgc3ZjX3BvcnRfaWQgZnJvbSByZXNvdXJjZSBtYW5hZ2VyIC0gYmVmb3JlIHZhbGlkYXRpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2dyb3VwX2NmZywgZ3JvdXAsIG1lbWJlcnNfY21kKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihwX2dyb3VwX2NmZy0+ZGF0YS5tZW1iZXJzX2NtZCA9PSBCQ01CQUxfR1JPVVBfTUVNQkVSX0NNRF9SRU1fTUVNQkVSUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgc2VydmljZSBpZCBpcyBub3Qgc3BlY2lmaWVkLCBmaWxsZWQgaW4gd2l0aCBjdXJyZW50IGNvbmZpZyBpbmZvICovCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHBfZ3JvdXBfY2ZnLT5kYXRhLm1lbWJlcnMubGVuOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcV9pbnRmID0gcF9ncm91cF9jZmctPmRhdGEubWVtYmVycy52YWxbaV0uaW50Zl9pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwX2dyb3VwX2NmZy0+ZGF0YS5tZW1iZXJzLnZhbFtpXS5zdmNfcG9ydF9pZCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDsgajxwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mby5kYXRhLm1lbWJlcnMubGVuOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdXJfaW50ZiA9IHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvLmRhdGEubWVtYmVycy52YWxbal0uaW50Zl9pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjdXJfaW50ZiA9PSByZXFfaW50ZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2dyb3VwX2NmZy0+ZGF0YS5tZW1iZXJzLnZhbFtpXS5zdmNfcG9ydF9pZCA9IHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvLmRhdGEubWVtYmVycy52YWxbal0uc3ZjX3BvcnRfaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIGdyb3VwIGFscmVhZHkgaGFzIG93bmVyLCBhbGxvYyB0aGUgc3ZjX3BvcnQgZm9yIGFkZGl0aW9uIG9yIHJlcGxhY2VtZW50IG1lbWJlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJDTUJBTF9HUk9VUF9PV05FUl9OT05FICE9IHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvLmRhdGEub3duZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgeyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgb3duZXIgdG8gdGhlIHJlcXVlc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKHBfZ3JvdXBfY2ZnLCBncm91cCwgb3duZXIsIHBfZ3JvdXBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvLmRhdGEub3duZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIEdFTSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHBfZ3JvdXBfY2ZnLT5kYXRhLm1lbWJlcnMubGVuOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQkNNQkFMX0dST1VQX09XTkVSX01VTFRJQ0FTVCAhPSBwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mby5kYXRhLm93bmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByc2NfbWdyX2dlbV9hbGxvY19tdWx0aWNhc3QocF9ncm91cF9jZmctPmRhdGEubWVtYmVycy52YWxbaV0uaW50Zl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfZ3JvdXBfY2ZnLT5kYXRhLm1lbWJlcnMudmFsW2ldLnN2Y19wb3J0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgLyogcmVxdWVzdCBnZW0gcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQkNNQkFMX0dST1VQX09XTkVSX1VOSUNBU1QgIT0gcF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm8uZGF0YS5vd25lcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcnNjX21ncl9nZW1fYWxsb2NfYnJvYWRjYXN0KHBfZ3JvdXBfY2ZnLT5kYXRhLm1lbWJlcnMudmFsW2ldLmludGZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2dyb3VwX2NmZy0+ZGF0YS5tZW1iZXJzLnZhbFtpXS5zdmNfcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgIC8qIHJlcXVlc3QgZ2VtIHJhbmdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1lbWJlciBob3cgbWFueSBzZXJ2aWNlIHBvcnQgcmVxdWVzdCBiZWVuIG1hZGUgdG8gcmVzb3VyY2UgbWFuYWdlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zdmNfcG9ydF9hbGxvY2F0ZWQgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGVycm9yIGVuY291bnRlcmVkIGR1cmluZyBhbGxvY2F0ZSBvZiBncm91cCByZXNvdXJjZXMgKGludGZfaWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2dyb3VwX2NmZy0+ZGF0YS5tZW1iZXJzLnZhbFtpXS5pbnRmX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRmlsbCBpbiB0aGUgbG9jYWwgZ3JvdXAgaW5mbyBkYXRhIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAqIE5vdGljZSB0aGF0IGFueSBtZW1vcnkgYWxsb2NhdGVkIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2Ugd2lsbCBiZSBmcmVlIGluCisgICAgICAgICAgICAgICAgICogcHJvY2Vzc19tZ210X21zZygpIG9mIHdvcmtlciB0aHJlYWQuIElmIG5lZWRlZCwgR1JPVVAgRlNNIG5lZWQgdG8gY2xvbmUgYW55CisgICAgICAgICAgICAgICAgICogcmVxdWVzdCBpbmZvIGludG8gcF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm8gYmVmb3JlIHJldHVybiAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwX2dyb3VwX2luc3QtPmFwaV9yZXFfZ3JvdXBfaW5mbyA9ICpwX2dyb3VwX2NmZzsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogUHJvY2VzcyB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBQZXJmb3JtIHRoZSB2YWxpZGF0aW9uIGNoZWNrKHMpIHRoYXQgdGhlIHV0aWxzIHJlcXVpcmUKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBtYWNfdXRpbF9ncm91cF9pbmZvX3ZhbGlkYXRlKCZwX2dyb3VwX2luc3QtPmFwaV9yZXFfZ3JvdXBfaW5mbykpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAiRmFpbGVkIEdST1VQIG1hYyB2YWxpZGF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gc3dfdXRpbF9ncm91cF9pbmZvX3ZhbGlkYXRlKCZwX2dyb3VwX2luc3QtPmFwaV9yZXFfZ3JvdXBfaW5mbykpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAiRmFpbGVkIHN3aXRjaCBncm91cCB2YWxpZGF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAvKiBzZXQgdGhlIGV2ZW50IGJhc2VkIG9uIHJlcXVlc3QgY29tbWFuZCAqLworICAgICAgICAgICAgICAgYl9nZW5lcmF0ZV9ldmVudCA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICBpZiAoIEJDTU9TX1RSVUUgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmcF9ncm91cF9pbnN0LT5hcGlfcmVxX2dyb3VwX2luZm8sIGdyb3VwLCBtZW1iZXJzX2NtZCkgKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHN3aXRjaChwX2dyb3VwX2luc3QtPmFwaV9yZXFfZ3JvdXBfaW5mby5kYXRhLm1lbWJlcnNfY21kKQorICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX0dST1VQX01FTUJFUl9DTURfQUREX01FTUJFUlM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNtX2V2ZW50LmV2ZW50X3R5cGUgPSBHUk9VUF9GU01fRVZFTlRfVFlQRV9BREQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9HUk9VUF9NRU1CRVJfQ01EX1JFTV9NRU1CRVJTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzbV9ldmVudC5ldmVudF90eXBlID0gR1JPVVBfRlNNX0VWRU5UX1RZUEVfUkVNT1ZFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfR1JPVVBfTUVNQkVSX0NNRF9TRVRfTUVNQkVSUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc21fZXZlbnQuZXZlbnRfdHlwZSA9IEdST1VQX0ZTTV9FVkVOVF9UWVBFX1NFVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNtX2V2ZW50LmV2ZW50X3R5cGUgPSBHUk9VUF9GU01fRVZFTlRfVFlQRV9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfZ2VuZXJhdGVfZXZlbnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgZnNtX2V2ZW50LmV2ZW50X3R5cGUgPSBHUk9VUF9GU01fRVZFTlRfVFlQRV9DUkVBVEU7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH13aGlsZSgwKTsKKworICAgICAgICAgICAgLyogaWYgYW55dGhpbmcgZ28gd3JvbmcsIGluZm9ybSByZXNvdXJjZSBtYW5hZ2VyIHRvIGZyZWUgdXAgdGhlIHNlcnZpY2UgcG9ydCAqLworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmV0ICYmCisgICAgICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2dyb3VwX2NmZywgZ3JvdXAsIG1lbWJlcnNfY21kKSAmJgorICAgICAgICAgICAgICAgIHBfZ3JvdXBfY2ZnLT5kYXRhLm1lbWJlcnNfY21kICE9IEJDTUJBTF9HUk9VUF9NRU1CRVJfQ01EX1JFTV9NRU1CRVJTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8bnVtX3N2Y19wb3J0X2FsbG9jYXRlZDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcnNwX3JldCA9IHJzY19tZ3JfZ2VtX2ZyZWUocF9ncm91cF9jZmctPmRhdGEubWVtYmVycy52YWxbaV0uaW50Zl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9ncm91cF9jZmctPmRhdGEubWVtYmVycy52YWxbaV0uc3ZjX3BvcnRfaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBiZXN0IGVmZm9ydCB0byBmcmVlIHVwICovCisgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcnNwX3JldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgYWxsb2NhdGUgb2YgZ3JvdXAgcmVzb3VyY2VzIChpbnRmX2lkOiVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfZ3JvdXBfY2ZnLT5kYXRhLm1lbWJlcnMudmFsW2ldLmludGZfaWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogV2UgcmVzcG9uZCB0byB0aGUgQkFMIHB1YmxpYyBBUEkgYmFja2VuZCB3aXRoIGEgcmVzdWx0LiBXZSBhbHdheXMKKyAgICAgICAgICAgICAqIHNlbmQgYSBjb21wbGV0ZSBtc2dfcGF5bG9hZCBiYWNrIHRvIHRoZSBBUEksIGJ1dCB0aGUgZGF0YSBwb3J0aW9uCisgICAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiBhIEdFVCBvciBHRVQtU1RBVFMgaGFzIGJlZW4gcmVxdWVzdGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByc3BfcmV0ID0gbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsIG9wZXJfdHlwZSwgbG9nX2lkX2dyb3VwKTsKKworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByc3BfcmV0IHx8IEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHRoZSBtZ210X21zZ19zZW5kX2JhbGFwaV9yc3AgZnVuY3Rpb24gYWJvdmUgbG9ncyBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgdGhlcmUgKi8KKyAgICAgICAgICAgICAgICByZXQgPSAoQkNNX0VSUl9PSyAhPSByc3BfcmV0KSA/IHJzcF9yZXQgOiByZXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAvKiBJZiB0aGVyZSB3YXMgYW4gZXZlbnQgZ2VuZXJhdGVkLCBjYWxsIHRoZSBzdGF0ZSBtYWNoaW5lIGV4ZWMgKi8KKyAgICAgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gYl9nZW5lcmF0ZV9ldmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJ1biB0aGUgZ3JvdXAgRlNNIHRvIHByb2Nlc3MgdGhpcyBldmVudAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHJldCA9IGdyb3VwX2ZzbV9leGVjKHBfZ3JvdXBfaW5zdCwgJmZzbV9ldmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgKEJDTUJBTF9PQkpfTVNHX1RZUEVfR0VUKToKKyAgICAgICAgeworCisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZ3JvdXAsICAiUHJvY2Vzc2luZyBhIGdyb3VwIEdFVCBSRVEgbWdtdCBtZXNzYWdlXG4iKTsKKworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihCQ01CQUxfU1RBVFVTX1VQICE9IGFjY190ZXJtX3N0YXR1c19nZXQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVJST1IgLSBBY2Nlc3MtdGVybWluYWwgaXMgbm90IFVQLiAgTm8gZnVydGhlciBwcm9jZXNzaW5nXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9TVEFURTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogRmluZCB0aGUgc3BlY2lmaWVkIGdyb3VwIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBwX2dyb3VwX2luc3QgPSBncm91cF9pbnN0X2dldChwX2dyb3VwX2tleSwgR1JPVVBfRkxBR19BQ1RJVkUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcF9ncm91cF9pbnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9TVEFURSAhPSByZXQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgbm90IGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwgICJFUlJPUiAtIFNwZWNpZmllZCBncm91cCAoJWQpIG5vdCBmb3VuZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9ncm91cF9rZXktPmdyb3VwX2lkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBXZSByZXNwb25kIHRvIHRoZSBCQUwgcHVibGljIEFQSSBiYWNrZW5kIHdpdGggYSByZXN1bHQuIFdlIGFsd2F5cworICAgICAgICAgICAgICAgICAqIHNlbmQgYSBjb21wbGV0ZSBtc2dfcGF5bG9hZCBiYWNrIHRvIHRoZSBBUEksIGJ1dCB0aGUgZGF0YSBwb3J0aW9uCisgICAgICAgICAgICAgICAgICogb2YgdGhlIG9iamVjdCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gYSBHRVQgb3IgR0VULVNUQVRTIGhhcyBiZWVuIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mby5oZHIuaGRyLmNvbW1faGRyID0gKChiY21iYWxfb2JqICopbXNnX3BheWxvYWQpLT5jb21tX2hkcjsKKyAgICAgICAgICAgICAgICAqKChiY21iYWxfZ3JvdXBfY2ZnICopbXNnX3BheWxvYWQpID0gcF9ncm91cF9pbnN0LT5jdXJyZW50X2dyb3VwX2luZm87CisKKyAgICAgICAgICAgIH0gd2hpbGUgKDApOworCisgICAgICAgICAgICBtZ210X21zZ19zZW5kX2JhbGFwaV9yc3AocmV0LCBtc2dfcGF5bG9hZCwgb3Blcl90eXBlLCBsb2dfaWRfZ3JvdXApOworCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAoQkNNQkFMX09CSl9NU0dfVFlQRV9DTEVBUik6CisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9ncm91cCwgICJQcm9jZXNzaW5nIGEgZ3JvdXAgQ0xFQVIgUkVRIG1nbXQgbWVzc2FnZVxuIik7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoQkNNQkFMX1NUQVRVU19VUCAhPSBhY2NfdGVybV9zdGF0dXNfZ2V0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVSUk9SIC0gQWNjZXNzLXRlcm1pbmFsIGlzIG5vdCBVUC4gIE5vIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRmluZCB0aGUgc3BlY2lmaWVkIGdyb3VwIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcF9ncm91cF9pbnN0ID0gZ3JvdXBfaW5zdF9nZXQocF9ncm91cF9rZXksIEdST1VQX0ZMQUdfQUNUSVZFKTsKKworICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcF9ncm91cF9pbnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAgIkVSUk9SIC0gU3BlY2lmaWVkIGdyb3VwICglZDogbm90IGZvdW5kXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZ3JvdXBfa2V5LT5ncm91cF9pZCk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUoMCk7CisKKyAgICAgICAgICAgIC8qIFdlIHJlc3BvbmQgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGJhY2tlbmQgd2l0aCBhIHJlc3VsdC4gV2UgYWx3YXlzCisgICAgICAgICAgICAgKiBzZW5kIGEgY29tcGxldGUgbXNnX3BheWxvYWQgYmFjayB0byB0aGUgQVBJLCBidXQgdGhlIGRhdGEgcG9ydGlvbgorICAgICAgICAgICAgICogb2YgdGhlIG9iamVjdCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gYSBHRVQgb3IgR0VULVNUQVRTIGhhcyBiZWVuIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcnNwX3JldCA9IG1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChyZXQsIG1zZ19wYXlsb2FkLCBvcGVyX3R5cGUsIGxvZ19pZF9ncm91cCk7CisKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcnNwX3JldCB8fCBCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB0aGUgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwIGZ1bmN0aW9uIGFib3ZlIGxvZ3MgYW55IGVycm9ycyB0aGF0IG9jY3VyIHRoZXJlICovCisgICAgICAgICAgICAgICAgcmV0ID0gKEJDTV9FUlJfT0sgIT0gcnNwX3JldCkgPyByc3BfcmV0IDogcmV0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUnVuIHRoZSBncm91cCBGU00gdG8gcHJvY2VzcyB0aGlzIGV2ZW50CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZzbV9ldmVudC5ldmVudF90eXBlID0gR1JPVVBfRlNNX0VWRU5UX1RZUEVfREVTVFJPWTsKKworICAgICAgICAgICAgICAgIHJldCA9IGdyb3VwX2ZzbV9leGVjKHBfZ3JvdXBfaW5zdCwgJmZzbV9ldmVudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAgIlVuc3VwcG9ydGVkIG9wZXJhdGlvbiBvbiBncm91cCBvYmplY3QgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgb3Blcl90eXBlICk7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisKKyAgICAgICAgICAgIC8qIFdlIHJlc3BvbmQgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGJhY2tlbmQgd2l0aCBhIHJlc3VsdC4gV2UgYWx3YXlzCisgICAgICAgICAgICAgKiBzZW5kIGEgY29tcGxldGUgbXNnX3BheWxvYWQgYmFjayB0byB0aGUgQVBJLCBidXQgdGhlIGRhdGEgcG9ydGlvbgorICAgICAgICAgICAgICogb2YgdGhlIG9iamVjdCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gYSBHRVQgb3IgR0VULVNUQVRTIGhhcyBiZWVuIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsIG9wZXJfdHlwZSwgbG9nX2lkX2dyb3VwKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZ3JvdXAsICIlcyByZXR1cm5zXG4iLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRvIHByb2Nlc3MgYSBncm91cCBvYmplY3QgZXZlbnQgcmVjZWl2ZWQKKyAqICAgICAgICBmcm9tIG9uZSBvZiB0aGUgQkFMIGFwcHMuCisgKgorICogQHBhcmFtIG1zZ19wYXlsb2FkICBBIHBvaW50ZXIgdG8gdGhlIHV0aWwgbWVzc2FnZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBwcm9jZXNzX2dyb3VwX3V0aWxfbXNnKHZvaWQgKm1zZ19wYXlsb2FkKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgZ3JvdXBfaW5zdCAqcF9ncm91cF9pbnN0OworICAgIGdyb3VwX2ZzbV9ldmVudCBmc21fZXZlbnQ7CisgICAgYmNtYmFsX21zZ190eXBlIHR5cGU7CisgICAgYmNtYmFsX2dyb3VwX2tleSBrZXk7CisKKyAgICB0eXBlID0gYmNtYmFsX3R5cGVfbWlub3JfZ2V0KG1zZ19wYXlsb2FkKTsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9ncm91cCwgICJwcm9jZXNzaW5nIGEgZ3JvdXAgJXMgdXRpbCBtZXNzYWdlIGZyb20gJXNcbiIsCisgICAgICAgICAgICBiY21iYWxfbXNnX3Rfc3RyW3R5cGVdLAorICAgICAgICAgICAgc3Vic3lzdGVtX3N0cltiY21iYWxfc2VuZGVyX2dldChtc2dfcGF5bG9hZCldKTsKKworICAgIC8qIHJlY292ZXIgdGhlIGtleSBmcm9tIHRoZSBtZXNzYWdlICovCisgICAga2V5ID0gKChiYWxfdXRpbF9tc2dfaW5kICopbXNnX3BheWxvYWQpLT5vYmpfa2V5Lmdyb3VwX2tleTsKKworICAgIGRvCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZ3JvdXAsICAiR290IGdyb3VwIGtleSBpZCAoJWQpIGZyb20gdXRpbCBtZXNzYWdlXG4iLCBrZXkuZ3JvdXBfaWQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgZ3JvdXAgaW5zdGFuY2UgdGhhdCdzIGJlaW5nIHJlZmVyZW5jZWQKKyAgICAgICAgICovCisgICAgICAgIGlmKE5VTEwgPT0gKHBfZ3JvdXBfaW5zdCA9IGdyb3VwX2luc3RfZ2V0KCZrZXksIEdST1VQX0ZMQUdfQUNUSVZFKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwgICJpbnZhbGlkIGdyb3VwICglZCkgZm91bmQgd2hpbGUgcHJvY2Vzc2luZyBhIHV0aWwgbWVzc2FnZSBmcm9tICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBrZXkuZ3JvdXBfaWQsCisgICAgICAgICAgICAgICAgICAgIHN1YnN5c3RlbV9zdHJbYmNtYmFsX3NlbmRlcl9nZXQobXNnX3BheWxvYWQpXSk7CisKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVjb3JkIHRoZSBtc2cgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBhY2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIGZzbV9ldmVudC5tc2cgPSBtc2dfcGF5bG9hZDsKKworICAgICAgICBpZiAoQkFMX01TR19UWVBFX0lORCA9PSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBmc21fZXZlbnQuZXZlbnRfdHlwZSA9IEdST1VQX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBtZXNzYWdlIHR5cGUgcmVjZWl2ZWQgZnJvbSB0aGUgVVRJTCIKKyAgICAgICAgICAgICAgICAgICAgIiAobm90IElORCkgKHR5cGU6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUnVuIHRoZSBHcm91cCBGU00gdG8gcHJvY2VzcyB0aGlzIGV2ZW50CisgICAgICAgICAqLworICAgICAgICBpZihCQ01fRVJSX09LID09IHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gZ3JvdXBfZnNtX2V4ZWMocF9ncm91cF9pbnN0LCAmZnNtX2V2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb25zCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byByZXRyaWV2ZSBhIGdyb3VwIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICBjbGFzcy4KKyAqCisgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBrZXkgb2YgdGhlIGdyb3VwIGJlaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZAorICogQHBhcmFtIHNlYXJjaF9mbGFnICAgIEEgZmxhZyBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGdyb3VwCisgKiAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgdG8gYmUgcmV0cmlldmVkCisgKgorICogQHJldHVybnMgZ3JvdXBfaW5zdF90KiBBIHBvaW50ZXIgdG8gdGhlIGZvdW5kIGdyb3VwIGluc3RhbmNlLAorICogICAgICAgICAgICAgICAgICAgICAgIG9yIE5VTEwgaWYgb25lIGlzIG5vdCBmb3VuZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGdyb3VwX2luc3QgKmdyb3VwX2luc3RfZ2V0KGJjbWJhbF9ncm91cF9rZXkgKmtleSwgZ3JvdXBfZmxhZyBzZWFyY2hfZmxhZykKK3sKKyAgICBncm91cF9pbnN0ICpjdXJyZW50X2VudHJ5ID0gTlVMTDsKKworICAgIC8qCisgICAgICogRmlyc3QsIGNoZWNrIHRoZSBhY3RpdmUgbGlzdCBpZiB0aGUgY2FsbGVyIGhhcyBjaG9zZW4gdG8gZG8gc28KKyAgICAgKi8KKyAgICBpZihHUk9VUF9GTEFHX0FDVElWRSAmIHNlYXJjaF9mbGFnKQorICAgIHsKKyAgICAgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICZHUk9VUF9GU01fR1JPVVBfTElTVF9DVFhfUFRSLT5hY3RpdmVfZ3JvdXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICBncm91cF9pbnN0X25leHQpCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYoY3VycmVudF9lbnRyeS0+YXBpX3JlcV9ncm91cF9pbmZvLmtleS5ncm91cF9pZCA9PSBrZXktPmdyb3VwX2lkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9ncm91cCwgICJGb3VuZCBhY3RpdmUgZ3JvdXBcbiIpOworICAgICAgICAgICAgICAgIC8qIFRoZSBncm91cCBpbnN0YW5jZSBwb2ludGVyIGlzIGluIGN1cnJlbnRfZW50cnkgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogTmV4dCwgY2hlY2sgdGhlIGZyZWUgbGlzdCBpZiB0aGUgY2FsbGVyIGhhcyBjaG9zZW4gdG8gZG8gc28KKyAgICAgKi8KKyAgICBpZigoR1JPVVBfRkxBR19GUkVFICYgc2VhcmNoX2ZsYWcpICYmIChOVUxMID09IGN1cnJlbnRfZW50cnkpKQorICAgIHsKKyAgICAgICAgLyogTm93IGNoZWNrIHRoZSBmcmVlIGxpc3QgKi8KKyAgICAgICAgaWYoIVRBSUxRX0VNUFRZKCZHUk9VUF9GU01fR1JPVVBfTElTVF9DVFhfUFRSLT5mcmVlX2dyb3VwX2xpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBKdXN0IGdyYWIgdGhlIGZpcnN0IGVudHJ5ICovCisgICAgICAgICAgICBjdXJyZW50X2VudHJ5ID0gVEFJTFFfRklSU1QoJkdST1VQX0ZTTV9HUk9VUF9MSVNUX0NUWF9QVFItPmZyZWVfZ3JvdXBfbGlzdCk7CisKKyAgICAgICAgICAgIC8qIFJlbW92ZSBpdCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KKyAgICAgICAgICAgIFRBSUxRX1JFTU9WRSgmR1JPVVBfRlNNX0dST1VQX0xJU1RfQ1RYX1BUUi0+ZnJlZV9ncm91cF9saXN0LCBjdXJyZW50X2VudHJ5LCBncm91cF9pbnN0X25leHQpOworCisgICAgICAgICAgICAvKiBBbmQgYWRkIGl0IHRvIHRoZSBhY3RpdmUgbGlzdCAqLworICAgICAgICAgICAgVEFJTFFfSU5TRVJUX1RBSUwoJkdST1VQX0ZTTV9HUk9VUF9MSVNUX0NUWF9QVFItPmFjdGl2ZV9ncm91cF9saXN0LCBjdXJyZW50X2VudHJ5LCBncm91cF9pbnN0X25leHQpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSW5pdGlhbGl6ZSB0aGUgZnNtIHN0YXRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGN1cnJlbnRfZW50cnktPmZzbV9zdGF0ZSA9IEdST1VQX0ZTTV9TVEFURV9OVUxMOworCisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfZ3JvdXAsICAiVXNpbmcgbmV3IGdyb3VwXG4iKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgaWYoKEdST1VQX0ZMQUdfQU5ZICYgc2VhcmNoX2ZsYWcpICYmIChOVUxMID09IGN1cnJlbnRfZW50cnkpKQorICAgIHsKKyAgICAgICAgLypBIGdyb3VwIHdhcyBub3QgZm91bmQgb24gZWl0aGVyIGxpc3QqLworCisgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9ncm91cCwgICIqKioqKioqKioqKioqKiBFUlJPUjogbm8gZ3JvdXAgZm91bmRcbiIpOworICAgIH0KKworICAgIHJldHVybiBjdXJyZW50X2VudHJ5OworfQorCisKKyNpZmRlZiBHRVRfR1JPVVBfQ0ZHX0JZX0tFWV9TVVBQT1JURUQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgZ3JvdXAgaW5mbyBmb3IgdGhlIHNwZWNpZmllZAorICogICAgICAgIGdyb3VwIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSBrZXkgICAgQSBncm91cCBrZXkKKyAqCisgKiBAcmV0dXJucyBiY21iYWxfZ3JvdXBfY2ZnKiBBIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZ3JvdXAgaW5mbyBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBncm91cCwgb3IgTlVMTCBpZiB0aGUgZ3JvdXAgaXMgbm90IGZvdW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtYmFsX2dyb3VwX2NmZyAqZ3JvdXBfZ2V0X2N1cnJlbnRfaW5mb19ieV9rZXkoYmNtYmFsX2dyb3VwX2tleSBrZXkpCit7CisgICAgZ3JvdXBfaW5zdCAqY3VycmVudF9lbnRyeSA9IE5VTEw7CisKKyAgICAvKgorICAgICAqIENoZWNrIHRoZSBhY3RpdmUgbGlzdAorICAgICAqLworICAgIFRBSUxRX0ZPUkVBQ0goY3VycmVudF9lbnRyeSwKKyAgICAgICAgJkdST1VQX0ZTTV9HUk9VUF9MSVNUX0NUWF9QVFItPmFjdGl2ZV9ncm91cF9saXN0LAorICAgICAgICBncm91cF9pbnN0X25leHQpCisgICAgeworCisgICAgICAgIGlmKGN1cnJlbnRfZW50cnktPmN1cnJlbnRfZ3JvdXBfaW5mby5rZXkuZ3JvdXBfaWQgPT0ga2V5Lmdyb3VwX2lkKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgZ3JvdXAgaW5zdGFuY2UgcG9pbnRlciBpcyBpbiBjdXJyZW50X2VudHJ5ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGN1cnJlbnRfZW50cnkpCisgICAgeworICAgICAgICByZXR1cm4gJihjdXJyZW50X2VudHJ5LT5jdXJyZW50X2dyb3VwX2luZm8pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byBmcmVlIGEgZ3JvdXAgaW5zdGFuY2Ugc3BlY2lmaWVkIGJ5IGEgdGhlIHN1cHBsaWVkCisgKiAgICAgICAgZW50cnkgcG9pbnRlci4KKyAqCisgKiBAcGFyYW0gcF9lbnRyeSBBIHBvaW50ZXIgdG8gdGhlIGVudHJ5IHRvIGJlIGZyZWVkCisgKgorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gZ3JvdXBfZnJlZV9ieV9lbnRyeShncm91cF9pbnN0ICpwX2VudHJ5KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgZ3JvdXBfaW5zdCAqY3VycmVudF9lbnRyeTsKKyAgICBncm91cF9pbnN0ICpwX3RlbXBfZW50cnk7CisKKyAgICAvKgorICAgICAqIEZpcnN0LCBjaGVjayB0aGUgYWN0aXZlIGxpc3QgKGFuIGFjdGl2ZSBncm91cCBjYW4gYmUgaW4gdGhlIGFkZGluZyBvciByZW1vdmluZyBzdGF0ZSkKKyAgICAgKi8KKyAgICBUQUlMUV9GT1JFQUNIX1NBRkUoY3VycmVudF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgJkdST1VQX0ZTTV9HUk9VUF9MSVNUX0NUWF9QVFItPmFjdGl2ZV9ncm91cF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBncm91cF9pbnN0X25leHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBfdGVtcF9lbnRyeSkKKyAgICB7CisgICAgICAgIGlmKGN1cnJlbnRfZW50cnkgPT0gcF9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgYWN0aXZlIGxpc3QgKi8KKyAgICAgICAgICAgIFRBSUxRX1JFTU9WRSgmR1JPVVBfRlNNX0dST1VQX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX2dyb3VwX2xpc3QsIGN1cnJlbnRfZW50cnksIGdyb3VwX2luc3RfbmV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFuZCBhZGQgaXQgdG8gdGhlIGZyZWUgbGlzdCAqLworICAgIHBfZW50cnktPmZzbV9zdGF0ZSA9IEdST1VQX0ZTTV9TVEFURV9OVUxMOworCisgICAgLyogQW5kIGluaXRpYWxpemUgdGhlIGN1cnJlbnQgb2JqZWN0IGluIHRoZSBncm91cCBpbnN0YW5jZSAqLworICAgIGdyb3VwX2luc3RfZW50cnlfb2JqX2luaXQocF9lbnRyeSk7CisKKyAgICBUQUlMUV9JTlNFUlRfVEFJTCgmR1JPVVBfRlNNX0dST1VQX0xJU1RfQ1RYX1BUUi0+ZnJlZV9ncm91cF9saXN0LCBwX2VudHJ5LCBncm91cF9pbnN0X25leHQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byByZW1vdmUgZ3JvdXAgbWVtYmVycyBzcGVjaWZpZWQgaW4gYSByZXF1ZXN0ZWQgZ3JvdXAKKyAqICAgICAgICBmcm9tIGEgdGFyZ2V0IGdyb3VwCisgKgorICogQHBhcmFtIHBfcmVxX2dyb3VwICAgIEEgcG9pbnRlciB0byB0aGUgZ3JvdXAgY29uZmlnIHRoYXQgaG9sZHMgdGhlIG1lbWJlcnMgdG8gYmUgcmVtb3ZlZAorICogQHBhcmFtIHBfY3VyX2dyb3VwICAgIEEgcG9pbnRlciB0byB0aGUgZ3JvdXAgY29uZmlnIHRoYXQgaG9sZHMgdGhlIGN1cnJlbnQgbWVtYmVycworICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2dyb3VwX29iamVjdF9tZW1iZXJfcmVtb3ZlKGJjbWJhbF9ncm91cF9jZmcgKnBfcmVxX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2N1cl9ncm91cCkKK3sKKyAgICBpbnQgaSwgaiwgaywgbnVtX21lbWJlcnMsIG1lbWJlcl9tYXRjaDsKKyAgICBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gICpwX25ld19tZW1iZXJfaW5mbzsKKyAgICBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTYgIG5ld19tZW1iZXJzOworCisgICAgbnVtX21lbWJlcnMgPSAwOworICAgIC8qIGZpcnN0IGNhbGN1bGF0ZSB0aGUgZmluYWwgbnVtYmVyIG9mIG1lbWJlcnMgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLmxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgbWVtYmVyX21hdGNoID0gMDsKKyAgICAgICAgLyogY2hlY2sgaWYgaXQgaXMgaW4gdGhlIHJlbW92ZSBsaXN0ICovCisgICAgICAgIGZvcihqID0gMDsgaiA8IHBfcmVxX2dyb3VwLT5kYXRhLm1lbWJlcnMubGVuOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLnZhbFtpXS5pbnRmX2lkID09IHBfcmVxX2dyb3VwLT5kYXRhLm1lbWJlcnMudmFsW2pdLmludGZfaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtYmVyX21hdGNoID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBubyBtYXRjaCwgd2UgbmVlZCB0byBrZWVwIGl0ICovCisgICAgICAgIGlmKCFtZW1iZXJfbWF0Y2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIG51bV9tZW1iZXJzKys7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogaWYgYWxsIHJlcXVlc3RlZCBtZW1iZXJzIGFscmVhZHkgYmVlbiByZW1vdmVkLCBubyBjaGFuZ2UsIGp1c3QgcmV0dXJuICovCisgICAgaWYoIG51bV9tZW1iZXJzID09IHBfY3VyX2dyb3VwLT5kYXRhLm1lbWJlcnMubGVuKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIC8qIGlmIG5vIG1lbWJlciBsZWZ0LCBqdXN0IGNsZWFuIHVwIGFuZCBsZWF2ZSAqLworICAgIGlmKG51bV9tZW1iZXJzID09IDApCisgICAgeworICAgICAgICBiY21vc19mcmVlKHBfY3VyX2dyb3VwLT5kYXRhLm1lbWJlcnMudmFsKTsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX0NMRUFSKHBfY3VyX2dyb3VwLCBncm91cCwgbWVtYmVycyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8qIGFsbG9jIG1lbW9yeSBmb3IgbmV3IGxpc3QgKi8KKyAgICBwX25ld19tZW1iZXJfaW5mbyA9IGJjbW9zX2NhbGxvYyggbnVtX21lbWJlcnMgKiBzaXplb2YoYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvKSk7CisgICAgaWYocF9uZXdfbWVtYmVyX2luZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwgICJjYWxsb2MgZmFpbGVkIHdoZW4gcmVtb3ZlIG1lbWJlcnMgZnJvbSBncm91cCBvYmplY3RcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKyAgICB9CisKKyAgICAvKiBmaWxsIGluIHRoZSBuZXcgbGlzdCAqLworICAgIGs9MDsKKyAgICBmb3IoaSA9IDA7IGkgPCBwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLmxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgbWVtYmVyX21hdGNoID0gMDsKKyAgICAgICAgLyogY2hlY2sgaWYgaXQgaXMgaW4gdGhlIHJlbW92ZSBsaXN0ICovCisgICAgICAgIGZvcihqID0gMDsgaiA8IHBfcmVxX2dyb3VwLT5kYXRhLm1lbWJlcnMubGVuOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLnZhbFtpXS5pbnRmX2lkID09IHBfcmVxX2dyb3VwLT5kYXRhLm1lbWJlcnMudmFsW2pdLmludGZfaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtYmVyX21hdGNoID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBubyBtYXRjaCwgd2UgbmVlZCB0byBrZWVwIGl0ICovCisgICAgICAgIGlmKCFtZW1iZXJfbWF0Y2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfbmV3X21lbWJlcl9pbmZvW2srK10gPSBwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLnZhbFtpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGZyZWUgdXAgdGhlIG9sZCBsaXN0ICovCisgICAgYmNtb3NfZnJlZShwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLnZhbCk7CisKKyAgICAvKiBhc3NpZ24gbmV3IGxpc3QgKi8KKyAgICBuZXdfbWVtYmVycy52YWwgPSBwX25ld19tZW1iZXJfaW5mbzsKKyAgICBuZXdfbWVtYmVycy5sZW4gPSBudW1fbWVtYmVyczsKKyAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKHBfY3VyX2dyb3VwLCBncm91cCwgbWVtYmVycywgbmV3X21lbWJlcnMpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gYWRkIGdyb3VwIG1lbWJlcnMgc3BlY2lmaWVkIGluIGEgcmVxdWVzdGVkIGdyb3VwCisgKiAgICAgICAgdG8gYSB0YXJnZXQgZ3JvdXAKKyAqCisgKiBAcGFyYW0gcF9yZXFfZ3JvdXAgICAgQSBwb2ludGVyIHRvIHRoZSBncm91cCBjb25maWcgdGhhdCBob2xkcyB0aGUgbWVtYmVycyB0byBiZSBhZGRlZAorICogQHBhcmFtIHBfY3VyX2dyb3VwICAgIEEgcG9pbnRlciB0byB0aGUgZ3JvdXAgY29uZmlnIHRoYXQgaG9sZHMgdGhlIGN1cnJlbnQgbWVtYmVycworICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2dyb3VwX29iamVjdF9tZW1iZXJfYWRkKGJjbWJhbF9ncm91cF9jZmcgKnBfcmVxX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2N1cl9ncm91cCkKK3sKKyAgICBpbnQgaSwgaiwgaywgbnVtX21lbWJlcnMsIG1lbWJlcl9tYXRjaDsKKyAgICBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gICpwX25ld19tZW1iZXJfaW5mbzsKKyAgICBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTYgIG5ld19tZW1iZXJzOworCisgICAgbnVtX21lbWJlcnMgPSAwOworICAgIC8qIGZpcnN0IGNhbGN1bGF0ZSB0aGUgZmluYWwgbnVtYmVyIG9mIG1lbWJlcnMgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBwX3JlcV9ncm91cC0+ZGF0YS5tZW1iZXJzLmxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgbWVtYmVyX21hdGNoID0gMDsKKyAgICAgICAgLyogY2hlY2sgaWYgaXQgaXMgaW4gdGhlIGN1cnJlbnQgbGlzdCAqLworICAgICAgICBmb3IoaiA9IDA7IGogPCBwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLmxlbjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcF9yZXFfZ3JvdXAtPmRhdGEubWVtYmVycy52YWxbaV0uaW50Zl9pZCA9PSBwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLnZhbFtqXS5pbnRmX2lkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbWJlcl9tYXRjaCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbm8gbWF0Y2gsIHdlIG5lZWQgdG8gYWRkIGl0ICovCisgICAgICAgIGlmKCFtZW1iZXJfbWF0Y2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIG51bV9tZW1iZXJzKys7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogaWYgYWxsIHJlcXVlc3RlZCBtZW1iZXJzIGFscmVhZHkgaW4gdGhlIGxpc3QsIG5vIGNoYW5nZSwganVzdCByZXR1cm4gKi8KKyAgICBpZiggbnVtX21lbWJlcnMgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICAvKiBhbGxvYyBtZW1vcnkgZm9yIG5ldyBsaXN0ICovCisgICAgcF9uZXdfbWVtYmVyX2luZm8gPSBiY21vc19jYWxsb2MoIChudW1fbWVtYmVycyArIHBfY3VyX2dyb3VwLT5kYXRhLm1lbWJlcnMubGVuKSAqIHNpemVvZihiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8pICk7CisgICAgaWYocF9uZXdfbWVtYmVyX2luZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwgICJjYWxsb2MgZmFpbGVkIHdoZW4gYWRkIG1lbWJlcnMgdG8gZ3JvdXAgb2JqZWN0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisgICAgfQorCisgICAgLyogZmlsbCBpbiB0aGUgbmV3IGxpc3QgKi8KKyAgICBrPTA7CisgICAgZm9yKGogPSAwOyBqIDwgcF9jdXJfZ3JvdXAtPmRhdGEubWVtYmVycy5sZW47IGorKykKKyAgICB7CisgICAgICAgIHBfbmV3X21lbWJlcl9pbmZvW2srK10gPSBwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLnZhbFtqXTsKKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBwX3JlcV9ncm91cC0+ZGF0YS5tZW1iZXJzLmxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgbWVtYmVyX21hdGNoID0gMDsKKyAgICAgICAgLyogY2hlY2sgaWYgaXQgaXMgaW4gdGhlIGN1cnJlbnQgbGlzdCAqLworICAgICAgICBmb3IoaiA9IDA7IGogPCBwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLmxlbjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcF9yZXFfZ3JvdXAtPmRhdGEubWVtYmVycy52YWxbaV0uaW50Zl9pZCA9PSBwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLnZhbFtqXS5pbnRmX2lkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbWJlcl9tYXRjaCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbm8gbWF0Y2gsIHdlIG5lZWQgdG8gYWRkIGl0ICovCisgICAgICAgIGlmKCFtZW1iZXJfbWF0Y2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfbmV3X21lbWJlcl9pbmZvW2srK10gPSBwX3JlcV9ncm91cC0+ZGF0YS5tZW1iZXJzLnZhbFtpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGZyZWUgdXAgdGhlIG9sZCBsaXN0ICovCisgICAgYmNtb3NfZnJlZShwX2N1cl9ncm91cC0+ZGF0YS5tZW1iZXJzLnZhbCk7CisKKyAgICAvKiBhc3NpZ24gbmV3IGxpc3QgKi8KKyAgICBuZXdfbWVtYmVycy52YWwgPSBwX25ld19tZW1iZXJfaW5mbzsKKyAgICBuZXdfbWVtYmVycy5sZW4gPSBrOworICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQocF9jdXJfZ3JvdXAsIGdyb3VwLCBtZW1iZXJzLCBuZXdfbWVtYmVycyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byByZXBsYWNlIGdyb3VwIG1lbWJlcnMgc3BlY2lmaWVkIGluIGEgdGFyZ2V0ZWQgZ3JvdXAKKyAqICAgICAgICB3aXRoIGEgcmVxdWVzdGVkIGdyb3VwCisgKgorICogQHBhcmFtIHBfcmVxX2dyb3VwICAgIEEgcG9pbnRlciB0byB0aGUgZ3JvdXAgY29uZmlnIHRoYXQgaG9sZHMgdGhlIG1lbWJlcnMgdG8gYmUgcmVwbGFjZWQKKyAqIEBwYXJhbSBwX2N1cl9ncm91cCAgICBBIHBvaW50ZXIgdG8gdGhlIGdyb3VwIGNvbmZpZyB0aGF0IGhvbGRzIHRoZSBjdXJyZW50IG1lbWJlcnMKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9ncm91cF9vYmplY3RfbWVtYmVyX3JlcGxhY2UoYmNtYmFsX2dyb3VwX2NmZyAqcF9yZXFfZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2N1cl9ncm91cCkKK3sKKyAgICBpbnQgaiwgazsKKyAgICBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gICpwX25ld19tZW1iZXJfaW5mbzsKKyAgICBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTYgIG5ld19tZW1iZXJzOworCisgICAgLyogYWxsb2MgbWVtb3J5IGZvciBuZXcgbGlzdCAqLworICAgIHBfbmV3X21lbWJlcl9pbmZvID0gYmNtb3NfY2FsbG9jKCBwX3JlcV9ncm91cC0+ZGF0YS5tZW1iZXJzLmxlbiAqIHNpemVvZihiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8pICk7CisgICAgaWYocF9uZXdfbWVtYmVyX2luZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwgICJjYWxsb2MgZmFpbGVkIHdoZW4gcmVwbGFjZSBtZW1iZXJzIHRvIGdyb3VwIG9iamVjdFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworICAgIH0KKworICAgIC8qIGZpbGwgaW4gdGhlIG5ldyBsaXN0ICovCisgICAgaz0wOworICAgIGZvcihqID0gMDsgaiA8IHBfcmVxX2dyb3VwLT5kYXRhLm1lbWJlcnMubGVuOyBqKyspCisgICAgeworICAgICAgICBwX25ld19tZW1iZXJfaW5mb1trKytdID0gcF9yZXFfZ3JvdXAtPmRhdGEubWVtYmVycy52YWxbal07CisgICAgfQorCisgICAgLyogZnJlZSB1cCB0aGUgb2xkIGxpc3QgKi8KKyAgICBiY21vc19mcmVlKHBfY3VyX2dyb3VwLT5kYXRhLm1lbWJlcnMudmFsKTsKKworICAgIC8qIGFzc2lnbiBuZXcgbGlzdCAqLworICAgIG5ld19tZW1iZXJzLnZhbCA9IHBfbmV3X21lbWJlcl9pbmZvOworICAgIG5ld19tZW1iZXJzLmxlbiA9IGs7CisgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2N1cl9ncm91cCwgZ3JvdXAsIG1lbWJlcnMsIG5ld19tZW1iZXJzKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRvIG92ZXJsYXkgZ3JvdXAgaW5mbyBzcGVjaWZpZWQgaW4gYSByZXF1ZXN0ZWQgZ3JvdXAKKyAqICAgICAgICB0byBhIHRhcmdldCBncm91cCAoIGV4Y2x1ZGUgdGhlIG1lbWJlciBpbmZvIGFzIGl0IHdpbGwgYmUgbWFuYWdlZCBieQorICAgICAgICAgIGJjbWJhbF9ncm91cF9vYmplY3RfbWVtYmVyX3h4eCBmdW5jdGlvbnMpCisgKgorICogQHBhcmFtIHBfcmVxX2dyb3VwICAgIEEgcG9pbnRlciB0byB0aGUgcmVxdWVzdGVkIGdyb3VwIGNvbmZpZworICogQHBhcmFtIHBfY3VyX2dyb3VwICAgIEEgcG9pbnRlciB0byB0aGUgZ3JvdXAgY29uZmlnIHRoYXQgdG8gYmUgb3ZlcmxheQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2dyb3VwX29iamVjdF9vdmVybGF5KGJjbWJhbF9ncm91cF9jZmcgKnBfcmVxX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2N1cl9ncm91cCkKK3sKKyAgICBCVUdfT04oTlVMTCA9PSBwX2N1cl9ncm91cCk7CisgICAgQlVHX09OKE5VTEwgPT0gcF9yZXFfZ3JvdXApOworCisgICAgYmNtYmFsX3ByZXNlbmNlX21hc2sgY3VyX3ByZXNlbmNlX21hc2s7CisKKyAgICAvKiBGaXJzdCwgY29weSB0aGUgY29tbW9uIG9iamVjdCBhbmQga2V5cyBpbiB0aGVpciBlbnRpcmV0eSwgZXhjZXB0IGZvciBwcmVzZXJ2aW5nIHRoZSBwcmVzZW5jZV9tYXNrICovCisgICAgY3VyX3ByZXNlbmNlX21hc2sgPSBwX2N1cl9ncm91cC0+aGRyLmhkci5wcmVzZW5jZV9tYXNrOworICAgIHBfY3VyX2dyb3VwLT5oZHIgPSBwX3JlcV9ncm91cC0+aGRyOworICAgIHBfY3VyX2dyb3VwLT5rZXkgPSBwX3JlcV9ncm91cC0+a2V5OworICAgIHBfY3VyX2dyb3VwLT5oZHIuaGRyLnByZXNlbmNlX21hc2sgPSBjdXJfcHJlc2VuY2VfbWFzazsKKworICAgIC8qIE5vdyBjb3B5IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgb2JqZWN0ICovCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX3JlcV9ncm91cCwgZ3JvdXAsIG1lbWJlcnNfY21kKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQocF9jdXJfZ3JvdXAsIGdyb3VwLCBtZW1iZXJzX2NtZCwgcF9yZXFfZ3JvdXAtPmRhdGEubWVtYmVyc19jbWQpOworICAgIH0KKworICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9yZXFfZ3JvdXAsIGdyb3VwLCBjb29raWUpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2N1cl9ncm91cCwgZ3JvdXAsIGNvb2tpZSwgcF9yZXFfZ3JvdXAtPmRhdGEuY29va2llKTsKKyAgICB9CisgICAKKyAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfcmVxX2dyb3VwLCBncm91cCwgb3duZXIpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2N1cl9ncm91cCwgZ3JvdXAsIG93bmVyLCBwX3JlcV9ncm91cC0+ZGF0YS5vd25lcik7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRvIHRlc3QgaWYgdGhlIHNwZWNpZmllZCBncm91cCBpcyBhY3RpdmUKKyAqCisgKiBAcGFyYW0gcF9ncm91cF9rZXkgICAgQSBwb2ludGVyIHRvIHRoZSBncm91cCBrZXkgdG8gYmUgdGVzdGVkCisgKgorICogQHJldHVybnMgYmNtb3NfYm9vbCAgIEJDTU9TX1RSVUUgaWYgc3BlY2lmaWVkIGdyb3VwIGlzIGFjdGl2ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBncm91cF9pc19hY3RpdmUoYmNtYmFsX2dyb3VwX2tleSAqcF9ncm91cF9rZXkpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICByZXR1cm4gKE5VTEwgPT0gZ3JvdXBfaW5zdF9nZXQocF9ncm91cF9rZXksIEdST1VQX0ZMQUdfQUNUSVZFKSkgPyBCQ01PU19GQUxTRSA6IEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gcmV0cml2ZSB0aGUgZ3JvdXAgb3duZXIKKyAqCisgKiBAcGFyYW0gZ3JvdXBfa2V5ICAgICAgdGhlIGdyb3VwIGtleSAKKyAqIEBwYXJhbSBwX2dyb3VwX293bmVyICBBIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJldHJpZXZlIG93bmVyCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBncm91cF9vd25lcl9nZXQoYmNtYmFsX2dyb3VwX2tleSBncm91cF9rZXksIGJjbWJhbF9ncm91cF9vd25lciAqcF9ncm91cF9vd25lcikKK3sgCisgICAgIGdyb3VwX2luc3QgKnBfZ3JvdXA7CisgICAgIAorICAgICBwX2dyb3VwID0gZ3JvdXBfaW5zdF9nZXQoJmdyb3VwX2tleSwgR1JPVVBfRkxBR19BQ1RJVkUpOworICAgICBpZiAocF9ncm91cCkKKyAgICAgeworICAgICAgICAqcF9ncm91cF9vd25lciA9IHBfZ3JvdXAtPmN1cnJlbnRfZ3JvdXBfaW5mby5kYXRhLm93bmVyOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgICAgICAgIAorICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byBzZXQgdGhlIGdyb3VwIG93bmVyCisgKiAgICAgICAgV2hlbiB0aGUgb3duZXIgaXMgc2V0LCB0aGUgc2VydmljZSBwb3J0IG9mIHRoZSBtZW1iZXIgaXMgYWxzbyBhbGxvY2F0ZWQKKyAqCisgKiBAcGFyYW0gZ3JvdXBfa2V5ICAgICAgZ3JvdXAga2V5IAorICogQHBhcmFtIGdycF9vd25lciAgICAgIG93bmVyCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBncm91cF9vd25lcl9zZXQoYmNtYmFsX2dyb3VwX2tleSBncm91cF9rZXksIGJjbWJhbF9ncm91cF9vd25lciBncnBfb3duZXIpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICAKKyAgICAvKiBpZiBncm91cCBoYXMgbm8gb3duZXIsIHNldCB0aGUgR1JPVVAgb3duZXIgYW5kIGFsbG9jYXRlIHRoZSBHRU0gZm9yIGVhY2ggR1JPVVAgbWVtYmVyIAorICAgICAKKyAgICAgIDEuIGZsaXAgdGhlIGN1cnJlbnQgaW5mbyB3aXRoIHJlcXVlc3QgaW5mbworICAgICAgMi4gYWxsb2NhdGUgR0VNIGZvciBlYWNoIGdyb3VwIG1lbWJlcgorICAgICAgMy4gQ2FsbCBzd2l0Y2hfdXRpbCB0byB1cGRhdGUgdGhlIGdyb3VwIChTRVQgd2l0aCBuZXcgR0VNIGluZm8pCisgICAgICA0LiBDYWxsIG1hY191dGlsIHRvIHVwZGF0ZSB0aGUgZ3JvdXAgKFNFVCB3aXRoIG5ldyBHRU0gaW5mbykKKyAgICAgIDUuIGZsaXAgYmFjayB0aGUgY3VycmVudCBpbmZvCisgICAgICBlbHNlCisgICAgICAgICAgZG8gbm90aGluZyBhbmQgbGV0IHV0aWwgdmFsaWRhdGUgdGhlIGdyb3VwIG93bmVyCisgICAgICBlbmQtaWYKKyAgICAgIGxhdGVyLCBmb2xsb3cgdGhlIHJlZ3VsYXIgRkxPVyBmc20gdG8gU0VUIEZMT1cgaW4gc3dpdGNoX3V0aWwgYW5kIE1hY191dGlsCisgICAqLyAgCisgICAKKyAgICBncm91cF9pbnN0ICpwX2dyb3VwOworICAgIAorICAgIHBfZ3JvdXAgPSBncm91cF9pbnN0X2dldCgmZ3JvdXBfa2V5LCBHUk9VUF9GTEFHX0FDVElWRSk7CisgICAgCisgICAgaWYgKHBfZ3JvdXAgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9ncm91cCwgICJGYWlsZWQgdG8gZ2V0IGdyb3VwIGluc3RhbmNlLCBncm91cF9pZCAlZFxuIiwgZ3JvdXBfa2V5Lmdyb3VwX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7ICAKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKCBCQ01CQUxfR1JPVVBfT1dORVJfTk9ORSA9PSBwX2dyb3VwLT5jdXJyZW50X2dyb3VwX2luZm8uZGF0YS5vd25lcikKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2dyb3VwX3JlcSA9ICYocF9ncm91cC0+YXBpX3JlcV9ncm91cF9pbmZvKTsKKyAgICAgICAgYmNtYmFsX2dyb3VwX2NmZyAqcF9ncm91cF9jdXIgPSAmKHBfZ3JvdXAtPmN1cnJlbnRfZ3JvdXBfaW5mbyk7CisgICAgICAgICAgICAKKyAgICAgICAgZG8KKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIHN0ZXAgMSAqLworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2dyb3VwX3JlcSwgZ3JvdXAsIG93bmVyLCBncnBfb3duZXIpOworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2dyb3VwX3JlcSwgZ3JvdXAsIG1lbWJlcnNfY21kLCBCQUxfVVRJTF9PUEVSX0dST1VQX1NFVCk7CisgICAgICAgICAgICBwX2dyb3VwX3JlcS0+ZGF0YS5tZW1iZXJzLmxlbiA9ICBwX2dyb3VwX2N1ci0+ZGF0YS5tZW1iZXJzLmxlbjsKKyAgICAgICAgICAgIHBfZ3JvdXBfcmVxLT5kYXRhLm1lbWJlcnMudmFsID0gIHBfZ3JvdXBfY3VyLT5kYXRhLm1lbWJlcnMudmFsOyAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcF9ncm91cF9jdXItPmRhdGEubWVtYmVycy5sZW4gPSAwOworICAgICAgICAgICAgcF9ncm91cF9jdXItPmRhdGEubWVtYmVycy52YWwgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIHN0ZXAgMiAqLworICAgICAgICAgICAgZm9yKGk9MDsgaTxwX2dyb3VwX3JlcS0+ZGF0YS5tZW1iZXJzLmxlbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKGdycF9vd25lciA9PSBCQ01CQUxfR1JPVVBfT1dORVJfVU5JQ0FTVCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSByc2NfbWdyX2dlbV9hbGxvY19icm9hZGNhc3QocF9ncm91cF9yZXEtPmRhdGEubWVtYmVycy52YWxbaV0uaW50Zl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9ncm91cF9yZXEtPmRhdGEubWVtYmVycy52YWxbaV0uc3ZjX3BvcnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgIC8qIHJlcXVlc3QgZ2VtIHJhbmdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGdycF9vd25lciA9PSBCQ01CQUxfR1JPVVBfT1dORVJfTVVMVElDQVNUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcnNjX21ncl9nZW1fYWxsb2NfbXVsdGljYXN0KHBfZ3JvdXBfcmVxLT5kYXRhLm1lbWJlcnMudmFsW2ldLmludGZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfZ3JvdXBfcmVxLT5kYXRhLm1lbWJlcnMudmFsW2ldLnN2Y19wb3J0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAvKiByZXF1ZXN0IGdlbSByYW5nZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAgIkZhaWxlZCB0byBhbGxvYyBncm91cCBHRU0sIGludGVyZmFjZT0lZFxuIiwgcF9ncm91cF9yZXEtPmRhdGEubWVtYmVycy52YWxbaV0uaW50Zl9pZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICAvKiBzdGVwIDMgKi8KKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IHN3X3V0aWxfZ3JvdXBfc2V0KHBfZ3JvdXAsIEJBTF9VVElMX09QRVJfR1JPVVBfU0VUKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciAlcyB3aGlsZSB1cGRhdGluZyBncm91cCBHRU0gaW4gc3dpdGNoXG4iLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHN0ZXAgNCAtIHJlcXVlc3Qgbm8gaW5kaWNhaXRvbiBzZW5kIGJhY2sgKi8gCisgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBtYWNfdXRpbF9ncm91cF9zZXQocF9ncm91cCwgQkFMX1VUSUxfT1BFUl9HUk9VUF9TRVQsIEJDTU9TX0ZBTFNFKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yICVzIHdoaWxlIHVwZGF0aW5nIGdyb3VwIEdFTSBpbiBtYWMgXG4iLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICAvKiBzdGVwIDUgLSBmbGlwIGJhY2sgKi8KKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQocF9ncm91cF9jdXIsIGdyb3VwLCBvd25lciwgZ3JwX293bmVyKTsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQocF9ncm91cF9jdXIsIGdyb3VwLCBtZW1iZXJzX2NtZCwgQkFMX1VUSUxfT1BFUl9HUk9VUF9TRVQpOworICAgICAgICAgICAgcF9ncm91cF9jdXItPmRhdGEubWVtYmVycy5sZW4gPSAgcF9ncm91cF9yZXEtPmRhdGEubWVtYmVycy5sZW47CisgICAgICAgICAgICBwX2dyb3VwX2N1ci0+ZGF0YS5tZW1iZXJzLnZhbCA9ICBwX2dyb3VwX3JlcS0+ZGF0YS5tZW1iZXJzLnZhbDsgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBfZ3JvdXBfcmVxLT5kYXRhLm1lbWJlcnMubGVuID0gMDsKKyAgICAgICAgICAgIHBfZ3JvdXBfcmVxLT5kYXRhLm1lbWJlcnMudmFsID0gTlVMTDsgICAgICAgCisgICAgICAgICAgICAgCisgICAgICAgIH13aGlsZSgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlIAorICAgIHsKKyAgICAgICAgLyogaWYgR1JPVVAgYWxyZWFkeSBoYXMgb3duZXIgLCBtYWtlIHN1cmUgaXQgaXMgdGhlIHNhbWUgdHlwZSAqLworICAgICAgICBpZiAoIGdycF9vd25lciAhPSBwX2dyb3VwLT5jdXJyZW50X2dyb3VwX2luZm8uZGF0YS5vd25lcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX2dyb3VwLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBncm91cCBhbHJlYWR5IGhhcyBvd25lciAlZCwgY2FuIG5vdCByZWFzc2lnbiB0byAlZCBcbiIsIHBfZ3JvdXAtPmN1cnJlbnRfZ3JvdXBfaW5mby5kYXRhLm93bmVyLCBncnBfb3duZXIpOyAKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7ICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorICAKKyAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9ncm91cF9mc20uaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vZ3JvdXBfZnNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlYmU1NwotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vZ3JvdXBfZnNtLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIGdyb3VwX2ZzbS5oCisgKiBAYnJpZWYgQ29kZSB0byBzdXBwb3J0IHRoZSBCQUwgR3JvdXAgRlNNCisgKgorICovCisKKyNpZm5kZWYgR1JPVVBfRlNNX0gKKyNkZWZpbmUgR1JPVVBfRlNNX0gKKworLypAeyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiYWxfYXBpLmg+CisKKy8qIHNldCB0aGUgdG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSBncm91cCB0byA0ayAqLworI2RlZmluZSBHUk9VUF9BTExPQ0FUSU9OX0JMT0NLX1NJWkUgICg0MDk1KQorCit0eXBlZGVmIGVudW0KK3sKKyAgICBHUk9VUF9GU01fRVZFTlRfVFlQRV9OT05FICAgICAgID0gLTEsCisgICAgR1JPVVBfRlNNX0VWRU5UX1RZUEVfQ1JFQVRFICAgICAsCisgICAgR1JPVVBfRlNNX0VWRU5UX1RZUEVfREVTVFJPWSAgICAsCisgICAgR1JPVVBfRlNNX0VWRU5UX1RZUEVfQUREICAgICAgICAsCisgICAgR1JPVVBfRlNNX0VWRU5UX1RZUEVfUkVNT1ZFICAgICAsCisgICAgR1JPVVBfRlNNX0VWRU5UX1RZUEVfU0VUICAgICAgICAsCisgICAgR1JPVVBfRlNNX0VWRU5UX1RZUEVfVVRJTF9NU0cgICAsCisKKyAgICBHUk9VUF9GU01fRVZFTlRfVFlQRV9fTEFTVCwKKyAgICBHUk9VUF9GU01fRVZFTlRfVFlQRV9fTlVNX09GCit9IGdyb3VwX2ZzbV9ldmVudF90eXBlOworCisKKwordHlwZWRlZiBlbnVtCit7CisgICAgR1JPVVBfRlNNX1NUQVRFX05PTkUgPSAgICAgLTEsCisgICAgR1JPVVBfRlNNX1NUQVRFX05VTEwgICAgICAgICAsCisgICAgR1JPVVBfRlNNX1NUQVRFX0NPTkZJR1VSSU5HICAsCisgICAgR1JPVVBfRlNNX1NUQVRFX0NPTkZJR1VSRUQgICAsCisgICAgR1JPVVBfRlNNX1NUQVRFX0RFTEVUSU5HICAgICAsCisgCisgICAgR1JPVVBfRlNNX1NUQVRFX19MQVNULAorICAgIEdST1VQX0ZTTV9TVEFURV9fTlVNX09GCit9IGdyb3VwX2ZzbV9zdGF0ZTsKKworCit0eXBlZGVmIGVudW0KK3sKKyAgICBHUk9VUF9GTEFHX0FDVElWRSA9ICAgICAxPDwwLCAgICAvKio8IEEgZ3JvdXAgaXMgb24gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgR1JPVVBfRkxBR19GUkVFID0gICAgICAgMTw8MSwgICAgLyoqPCBBIGdyb3VwIGlzIG9uIHRoZSBmcmVlIGxpc3QgKi8KKyAgICBHUk9VUF9GTEFHX0FOWSA9ICAgICAgICAoR1JPVVBfRkxBR19BQ1RJVkUgfCBHUk9VUF9GTEFHX0ZSRUUpLCAgICAvKio8IEEgZ3JvdXAgaXMgb24gZWl0aGVyIHRoZSBhY3RpdmUgb3IgZnJlZSBsaXN0ICovCit9IGdyb3VwX2ZsYWc7CisKKwordHlwZWRlZiBzdHJ1Y3QgZ3JvdXBfZnNtX2V2ZW50X3QKK3sKKyAgICBncm91cF9mc21fZXZlbnRfdHlwZSBldmVudF90eXBlOyAgIC8qKjwgVGhlIGdyb3VwIGZzbSBldmVudHMgKi8KKyAgICB2b2lkICAgICAgICAgICAgICptc2c7CisKKyAgICAvKiBvdGhlciBuZWNlc3NhcnkgaW5mb3JtYXRpb24gKi8KK30gZ3JvdXBfZnNtX2V2ZW50OworCisKK3R5cGVkZWYgc3RydWN0IGdyb3VwX2luc3QgZ3JvdXBfaW5zdDsKK3N0cnVjdCBncm91cF9pbnN0Cit7CisgICAgYmNtYmFsX2dyb3VwX2NmZyAgICBjdXJyZW50X2dyb3VwX2luZm87ICAgLyoqPCBUaGUgY3VycmVudCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBncm91cCAodXNlZCBmb3IgR0VUKSAqLworICAgIGJjbWJhbF9ncm91cF9jZmcgICAgYXBpX3JlcV9ncm91cF9pbmZvOyAgIC8qKjwgVGhlIGxhc3QgZ3JvdXAgb2JqZWN0IGluZm8gcmVjZWl2ZWQgZnJvbSB0aGUgUHVibGljIEFQSSAqLworICAgIGdyb3VwX2ZzbV9zdGF0ZSAgICAgZnNtX3N0YXRlOyAgICAgICAgICAvKio8IFRoZSBncm91cCBGU00gc3RhdGUgKi8KKyAgICBiY21vc190aW1lciAgICAgICAgIHRpbWVyX2luZm87ICAgICAgIC8qKjwgQSBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIHN0YXRlIG1hY2hpbmUgdGltZW91dCB0aW1lciAqLworICAgIFRBSUxRX0VOVFJZKGdyb3VwX2luc3QpIGdyb3VwX2luc3RfbmV4dCA7IC8qKjwgVEFJTFEgbGluayAqLworfTsKKworCisvKiAKKyAqIEdyb3VwIEZTTSBkYXRhIHN0cnVjdHVyZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZ3JvdXBfZnNtX2N0eAoreworICAgIC8qIExpc3RzIG9mIGZyZWUgZ3JvdXAgZW50cmllcyBhbmQgYWN0aXZlIGdyb3VwIGVudHJpZXMKKyAgICAgKi8KKyAgICBUQUlMUV9IRUFEKGZyZWVfZ3JvdXBfbGlzdF9oZWFkLCBncm91cF9pbnN0KSBmcmVlX2dyb3VwX2xpc3Q7CisKKyAgICBUQUlMUV9IRUFEKGFjdGl2ZV9ncm91cF9saXN0X2hlYWQsIGdyb3VwX2luc3QpIGFjdGl2ZV9ncm91cF9saXN0OworCit9IGdyb3VwX2ZzbV9jdHg7CisKKworLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zICovCisKK2V4dGVybiBiY21vc19lcnJubyBncm91cF9mc21faW5pdCh2b2lkKTsKK2V4dGVybiBiY21vc19lcnJubyBncm91cF9mc21fZmluaXNoKHZvaWQpOworZXh0ZXJuIGJjbW9zX2Vycm5vIHByb2Nlc3NfZ3JvdXBfdXRpbF9tc2codm9pZCAqbXNnX3BheWxvYWQpOworZXh0ZXJuIGJjbW9zX2Vycm5vIHByb2Nlc3NfZ3JvdXBfb2JqZWN0KHZvaWQgKm1zZ19wYXlsb2FkKTsKK2V4dGVybiBiY21vc19ib29sICBncm91cF9pc19hY3RpdmUoYmNtYmFsX2dyb3VwX2tleSAqcF9ncm91cF9rZXkpOworZXh0ZXJuIGJjbW9zX2Vycm5vIGdyb3VwX293bmVyX3NldChiY21iYWxfZ3JvdXBfa2V5IGdyb3VwX2tleSwgYmNtYmFsX2dyb3VwX293bmVyIGdyb3VwX293bmVyKTsKK2V4dGVybiBiY21vc19lcnJubyBncm91cF9vd25lcl9nZXQoYmNtYmFsX2dyb3VwX2tleSBncm91cF9rZXksIGJjbWJhbF9ncm91cF9vd25lciAqcF9ncm91cF9vd25lcik7CisKKy8qQH0qLworCisjZW5kaWYgLypHUk9VUF9GU01fSCAqLworCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL3N1Yl90ZXJtX2ZzbS5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9zdWJfdGVybV9mc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjMyYTI4Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi9zdWJfdGVybV9mc20uYwpAQCAtMCwwICsxLDIxODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIHN1Yl90ZXJtX2ZzbS5jCisgKiBAYnJpZWYgQ29kZSB0byBzdXBwb3J0IHRoZSBCQUwgc3Vic2NyaWJlci10ZXJtaW5hbCBGU00KKyAqCisgKiBAYWRkdG9ncm91cCBzdWJfdGVybWluYWwKKyAqCisgKi8KKworLypAeyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiYWxfbXNnLmg+CisjaW5jbHVkZSA8YmFsX29zbXNnLmg+CisjaW5jbHVkZSAiYmFsX3dvcmtlci5oIgorI2luY2x1ZGUgImJhbF9tYWNfdXRpbC5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfdXRpbC5oIgorI2luY2x1ZGUgInN1Yl90ZXJtX2ZzbS5oIgorI2luY2x1ZGUgInRtX3NjaGVkX2ZzbS5oIgorCisjaW5jbHVkZSA8YmFsX29ianMuaD4KKyNpbmNsdWRlIDxmc21fY29tbW9uLmg+CisKKyNpZmRlZiBFTkFCTEVfTE9HCisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKworLyoKKyAqIEBicmllZiBMb2dnaW5nIGRldmljZSBpZCBmb3IgdGhlIHN1YnNjcmliZXItdGVybWluYWwKKyAqLworc3RhdGljIGRldl9sb2dfaWQgbG9nX2lkX3N1Yl90ZXJtOworI2VuZGlmCisKKy8qIGxvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gc3ViX3Rlcm1fZnNtX2FkbWluX3VwX3N0YXJ0KHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fYWRtaW5fdXBfZXJyb3Ioc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2ZzbV9hZG1pbl9kbl9zdGFydChzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gc3ViX3Rlcm1fZnNtX2FkbWluX2RuX29rKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fYWRtaW5fZG5fZXJyb3Ioc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2ZzbV9yZW1vdmluZ19zdGFydChzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gc3ViX3Rlcm1fZnNtX2lnbm9yZV91dGlsX21zZyhzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKKworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2ZzbV9yZW1vdmluZ19wcm9jZXNzX3V0aWxfbXNnKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gc3ViX3Rlcm1fZnNtX3JlbW92aW5nX3Byb2Nlc3NfdXRpbF9hdXRvX21zZyhzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gc3ViX3Rlcm1fZnNtX2NvbmZpZ3VyaW5nX3Byb2Nlc3NfdXRpbF9tc2coc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fbnVsbF9wcm9jZXNzX3V0aWxfYXV0b19tc2coc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2ZzbV9jb25maWd1cmVkX3Byb2Nlc3NfdXRpbF9tc2coc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gc3ViX3Rlcm1fZnNtX2NvbmZpZ3VyaW5nX3Byb2Nlc3NfdXRpbF9hdXRvX21zZyhzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fc3RhdGVfZXJyKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2ZzbV9leGVjKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2ZyZWVfYnlfZW50cnkoc3ViX3Rlcm1faW5zdCAqcF9lbnRyeSk7CisKKworc3RhdGljIGJjbW9zX2Vycm5vIGFnZ19wb3J0X2lkX2xpc3RfZmlsbChzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4ICphZ2dfcG9ydF9pZF9saXN0KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIHN2Y19wb3J0X2lkX2xpc3RfZmlsbChzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggKnN2Y19wb3J0X2lkX2xpc3QpOworCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX3N1Yl90ZXJtX3RtX3NjaGVkc19zZXQoY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpwX3N1Yl90ZXJtX2NmZyk7CisKKy8qCisgKkBicmllZiAgR2xvYmFsIHN1Yl90ZXJtIGZzbSBjb250ZXh0IGRhdGEgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBzdWJfdGVybV9mc21fY3R4IGdfc3ViX3Rlcm1fZnNtX3N1Yl90ZXJtX2xpc3RfY3R4OworCisvKgorICogTWFjcm9zIGZvciBzdWJfdGVybSBjdHggYWNjZXNzCisgKi8KKyNkZWZpbmUgU1VCX1RFUk1fRlNNX1NVQl9URVJNX0xJU1RfQ1RYICAgICAgKGdfc3ViX3Rlcm1fZnNtX3N1Yl90ZXJtX2xpc3RfY3R4KQorI2RlZmluZSBTVUJfVEVSTV9GU01fU1VCX1RFUk1fTElTVF9DVFhfUFRSICAoJmdfc3ViX3Rlcm1fZnNtX3N1Yl90ZXJtX2xpc3RfY3R4KQorCisvKgorICogQGJyaWVmIFRoZSBkZWZpbml0aW9uIG9mIGEgc3ViX3Rlcm0gc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbgorICovCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqIHN1Yl90ZXJtX2ZzbV9zdGF0ZV9wcm9jZXNzb3IpKHN1Yl90ZXJtX2luc3QgKiwgdm9pZCAqLCBzdWJfdGVybV9mc21fZXZlbnQgKik7CisKKy8qCisgKiBAYnJpZWYgVGhlIFN1YnNjcmliZXIgVGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgYXJyYXkKKyAqLworc3RhdGljIHN1Yl90ZXJtX2ZzbV9zdGF0ZV9wcm9jZXNzb3Igc3ViX3Rlcm1fc3RhdGVzW1NVQl9URVJNX0ZTTV9TVEFURV9fTlVNX09GXVtTVUJfVEVSTV9GU01fRVZFTlRfVFlQRV9fTlVNX09GXSA9Cit7CisgCisgICAgW1NVQl9URVJNX0ZTTV9TVEFURV9OVUxMXSA9IAorICAgIHsgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBOZXh0IHN0YXRlOiBDT05GSUdVUklORworICAgICAgICAgKi8gCisgICAgICAgIFtTVUJfVEVSTV9GU01fRVZFTlRfVFlQRV9BRE1JTl9VUF0gICAgID0gc3ViX3Rlcm1fZnNtX2FkbWluX3VwX3N0YXJ0LCAgIAorCisgICAgICAgIC8qIAorICAgICAgICAgKiBOZXh0IHN0YXRlOiBOVUxMIAorICAgICAgICAgKi8gICAKKyAgICAgICAgW1NVQl9URVJNX0ZTTV9FVkVOVF9UWVBFX0FETUlOX0ROXSAgICAgPSBzdWJfdGVybV9mc21fYWRtaW5fZG5fb2ssCisKKyAgICAgICAgLyogCisgICAgICAgICAqIE5leHQgc3RhdGU6IE5VTEwgCisgICAgICAgICAqLworICAgICAgICBbU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfVVRJTF9NU0ddICAgICAgPSBzdWJfdGVybV9mc21faWdub3JlX3V0aWxfbXNnLAorCisgICAgICAgIC8qIAorICAgICAgICAgKiBOZXh0IHN0YXRlOiBOVUxMIAorICAgICAgICAgKi8KKyAgICAgICAgW1NVQl9URVJNX0ZTTV9FVkVOVF9UWVBFX1VUSUxfQVVUT19NU0ddID0gc3ViX3Rlcm1fZnNtX251bGxfcHJvY2Vzc191dGlsX2F1dG9fbXNnLAorICAgIH0sCisKKyAgICBbU1VCX1RFUk1fRlNNX1NUQVRFX0NPTkZJR1VSSU5HXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHsgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV4dCBzdGF0ZTogQ09ORklHVVJJTkcKKyAgICAgICAgICovIAorICAgICAgICBbU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfQURNSU5fVVBdICAgICA9IHN1Yl90ZXJtX2ZzbV9hZG1pbl91cF9lcnJvciwgICAKKworICAgICAgICAvKiAKKyAgICAgICAgICogTmV4dCBzdGF0ZTogQ09ORklHVVJJTkcgCisgICAgICAgICAqLyAgIAorICAgICAgICBbU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfQURNSU5fRE5dICAgICA9IHN1Yl90ZXJtX2ZzbV9hZG1pbl9kbl9lcnJvciwKKworICAgICAgICAvKiAKKyAgICAgICAgICogTmV4dCBzdGF0ZTogUkVNT1ZJTkcKKyAgICAgICAgICovCisgICAgICAgIFtTVUJfVEVSTV9GU01fRVZFTlRfVFlQRV9SRU1PVkVdICAgICAgID0gc3ViX3Rlcm1fZnNtX3JlbW92aW5nX3N0YXJ0LAorCisgICAgICAgIC8qIAorICAgICAgICAgKiBOZXh0IHN0YXRlOiBDT05GSUdVUklORyB8IENPTkZJR1VSRUQgCisgICAgICAgICAqLworICAgICAgICBbU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfVVRJTF9NU0ddICAgICAgPSBzdWJfdGVybV9mc21fY29uZmlndXJpbmdfcHJvY2Vzc191dGlsX21zZywKKworICAgICAgICAvKiAKKyAgICAgICAgICogTmV4dCBzdGF0ZTogQ09ORklHVVJJTkcgCisgICAgICAgICAqLworICAgICAgICBbU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfVVRJTF9BVVRPX01TR10gPSBzdWJfdGVybV9mc21fY29uZmlndXJpbmdfcHJvY2Vzc191dGlsX2F1dG9fbXNnLAorCisgICAgfSwKKworICAgIFtTVUJfVEVSTV9GU01fU1RBVEVfQ09ORklHVVJFRF0gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgeyAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTkZJR1VSRUQKKyAgICAgICAgICovIAorICAgICAgICBbU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfQURNSU5fVVBdICAgICA9IHN1Yl90ZXJtX2ZzbV9hZG1pbl91cF9zdGFydCwgICAKKworICAgICAgICAvKiAKKyAgICAgICAgICogTmV4dCBzdGF0ZTogQ09ORklHVVJJTkcKKyAgICAgICAgICovICAgCisgICAgICAgIFtTVUJfVEVSTV9GU01fRVZFTlRfVFlQRV9BRE1JTl9ETl0gICAgID0gc3ViX3Rlcm1fZnNtX2FkbWluX2RuX3N0YXJ0LAorCisgICAgICAgIC8qIAorICAgICAgICAgKiBOZXh0IHN0YXRlOiBSRU1PVklORworICAgICAgICAgKi8KKyAgICAgICAgW1NVQl9URVJNX0ZTTV9FVkVOVF9UWVBFX1JFTU9WRV0gICAgICAgPSBzdWJfdGVybV9mc21fcmVtb3Zpbmdfc3RhcnQsCisKKyAgICAgICAgLyogCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTkZJR1VSSU5HCisgICAgICAgICAqLworICAgICAgICBbU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfVVRJTF9NU0ddICAgICA9IHN1Yl90ZXJtX2ZzbV9jb25maWd1cmVkX3Byb2Nlc3NfdXRpbF9tc2csCisKKyAgICAgICAgLyogCisgICAgICAgICAqIE5leHQgc3RhdGU6IENPTkZJR1VSRUQKKyAgICAgICAgICovCisgICAgICAgIFtTVUJfVEVSTV9GU01fRVZFTlRfVFlQRV9VVElMX0FVVE9fTVNHXSA9IHN1Yl90ZXJtX2ZzbV9pZ25vcmVfdXRpbF9tc2csCisKKyAgICB9LAorCisgICAgW1NVQl9URVJNX0ZTTV9TVEFURV9SRU1PVklOR10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgeyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIE5leHQgc3RhdGU6IFJFTU9WSU5HIAorICAgICAgICAgKi8gCisgICAgICAgIFtTVUJfVEVSTV9GU01fRVZFTlRfVFlQRV9BRE1JTl9VUF0gICAgID0gc3ViX3Rlcm1fZnNtX2FkbWluX3VwX2Vycm9yLCAgIAorCisgICAgICAgIC8qIAorICAgICAgICAgKiBOZXh0IHN0YXRlOiBSRU1PVklORyAKKyAgICAgICAgICovICAgCisgICAgICAgIFtTVUJfVEVSTV9GU01fRVZFTlRfVFlQRV9BRE1JTl9ETl0gICAgID0gc3ViX3Rlcm1fZnNtX2FkbWluX2RuX2Vycm9yLAorCisgICAgICAgICAvKiAKKyAgICAgICAgICogTmV4dCBzdGF0ZTogUkVNT1ZJTkcgfCBOVUxMIAorICAgICAgICAgKi8KKyAgICAgICAgW1NVQl9URVJNX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHXSAgICAgID0gc3ViX3Rlcm1fZnNtX3JlbW92aW5nX3Byb2Nlc3NfdXRpbF9tc2csCisKKyAgICAgICAgLyogCisgICAgICAgICAqIE5leHQgc3RhdGU6IFJFTU9WSU5HIAorICAgICAgICAgKi8KKyAgICAgICAgW1NVQl9URVJNX0ZTTV9FVkVOVF9UWVBFX1VUSUxfQVVUT19NU0ddID0gc3ViX3Rlcm1fZnNtX3JlbW92aW5nX3Byb2Nlc3NfdXRpbF9hdXRvX21zZywKKyAgICB9LAorfTsKKworc3RhdGljIGNoYXIgKnN0YXRlX25hbWVfc3RyW10gPSAKK3sKKyAgICAiU1VCX1RFUk1fRlNNX1NUQVRFX05VTEwiLAorICAgICJTVUJfVEVSTV9GU01fU1RBVEVfQ09ORklHVVJJTkciLAorICAgICJTVUJfVEVSTV9GU01fU1RBVEVfQ09ORklHVVJFRCIsCisgICAgIlNVQl9URVJNX0ZTTV9TVEFURV9SRU1PVklORyIsCit9OworCisvKiBFbnN1cmUgdGhhdCB0aGUgbmFtZSBhcnJheSBzaXplIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgZW51bSAqLworQkFMX1NUQVRJQ19BU1NFUlQgKFNVQl9URVJNX0ZTTV9TVEFURV9fTEFTVCA9PSAoc2l6ZW9mIChzdGF0ZV9uYW1lX3N0cikgLyBzaXplb2YgKGNoYXIgKikpLCBzdWJfdGVybV9mc21fc3RhdGUpOworCitzdGF0aWMgY2hhciAqc3ViX3Rlcm1fc3RhdGVfbmFtZV9nZXQoc3ViX3Rlcm1fZnNtX3N0YXRlIHN0YXRlKQoreworICAgIGlmKHN0YXRlIDwgU1VCX1RFUk1fRlNNX1NUQVRFX19MQVNUKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlX25hbWVfc3RyW3N0YXRlXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuICJTVUJfVEVSTV9VTktOT1dOIjsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICpldmVudF9uYW1lX3N0cltdID0gCit7CisgICAgIlNVQl9URVJNX0ZTTV9BRE1JTl9VUF9FVkVOVCIsCisgICAgIlNVQl9URVJNX0ZTTV9BRE1JTl9ETl9FVkVOVCIsCisgICAgIlNVQl9URVJNX0ZTTV9SRU1PVkVfRVZFTlQiLAorICAgICJTVUJfVEVSTV9GU01fVVRJTF9NU0dfRVZFTlQiLAorICAgICJTVUJfVEVSTV9GU01fVVRJTF9BVVRPX0lORF9FVkVOVCIsCit9OworCisvKiBFbnN1cmUgdGhhdCB0aGUgbmFtZSBhcnJheSBzaXplIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgZW51bSAqLworQkFMX1NUQVRJQ19BU1NFUlQgKFNVQl9URVJNX0ZTTV9FVkVOVF9UWVBFX19MQVNUID09IChzaXplb2YgKGV2ZW50X25hbWVfc3RyKSAvIHNpemVvZiAoY2hhciAqKSksIHN1Yl90ZXJtX2ZzbV9ldmVudF90eXBlKTsKKworc3RhdGljIGNoYXIgKnN1Yl90ZXJtX2V2ZW50X25hbWVfZ2V0KHN1Yl90ZXJtX2ZzbV9ldmVudF90eXBlIGV2ZW50KQoreworICAgIGlmKGV2ZW50IDwgU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfX0xBU1QpCisgICAgeworICAgICAgICByZXR1cm4gZXZlbnRfbmFtZV9zdHJbZXZlbnRdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gIlNVQl9URVJNX0VWVF9VTktOT1dOIjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgY3VycmVudCBzdWJfdGVybV9pbmZvIG9iamVjdCBvZiB0aGUgCisgKiAgICAgICAgc3VwcGxpZWQgZW50cnkuCisgKgorICogQHBhcmFtIHBfZW50cnkgQSBwb2ludGVyIHRvIHRoZSBlbnRyeSB0byBiZSBpbml0aWFsaXplZAorICoKKyAqCisgKiBAcmV0dXJucyB2b2lkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzdWJfdGVybV9pbnN0X2VudHJ5X29ial9pbml0KHN1Yl90ZXJtX2luc3QgKnBfZW50cnkpCit7CisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5IGtleSA9IHsgLnN1Yl90ZXJtX2lkID0gMCwgLmludGZfaWQgPSAwIH07CisgICAgQkNNQkFMX0NGR19JTklUKCZwX2VudHJ5LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8sCisgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfdGVybWluYWwsCisgICAgICAgICAgICAgICAgICAgIGtleSk7CisKKyAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZwX2VudHJ5LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8sIAorICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBhZG1pbl9zdGF0ZSwgQkNNQkFMX1NUQVRFX0RPV04pOworCisgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmcF9lbnRyeS0+Y3VycmVudF9zdWJfdGVybV9pbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcl90ZXJtaW5hbCwgb3Blcl9zdGF0dXMsIEJDTUJBTF9TVEFUVVNfTk9UX1BSRVNFTlQpOworICAgIAorICAgIEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfU0VUKCYocF9lbnRyeS0+Y3VycmVudF9zdWJfdGVybV9pbmZvKSwgQkNNT1NfRkFMU0UpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gY2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIHN1YnNjcmliZXItdGVybWluYWwgRlNNIAorICogICAgICAgIGluZnJhc3RydWN0dXJlLiAKKyAqCisgKiAgICAgICAgTk9URTogVGhpcyBpcyBjYWxsZWQgb25jZSBvbiBzdGFydHVwIGFuZCBOT1QgZm9yIGVhY2ggRlNNIGluc3RhbmNlLgorICoKKyAqIEByZXR1cm5zIHZvaWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIHN1Yl90ZXJtX2ZzbV9pbml0KHZvaWQpCit7CisgICAgaW50IGlpOworICAgIHN1Yl90ZXJtX2luc3QgKm5ld19lbnRyeTsKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisjaWZkZWYgRU5BQkxFX0xPRworICAgIGxvZ19pZF9zdWJfdGVybSA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJTVUJfVEVSTSIsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIEJVR19PTihsb2dfaWRfc3ViX3Rlcm0gPT0gREVWX0xPR19JTlZBTElEX0lEKTsKKyNlbmRpZgorCisgICAgLyogSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIHN1Yl90ZXJtIHF1ZXVlcyAqLworICAgIFRBSUxRX0lOSVQoJlNVQl9URVJNX0ZTTV9TVUJfVEVSTV9MSVNUX0NUWF9QVFItPmZyZWVfc3ViX3Rlcm1fbGlzdCk7CisgICAgVEFJTFFfSU5JVCgmU1VCX1RFUk1fRlNNX1NVQl9URVJNX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX3N1Yl90ZXJtX2xpc3QpOworCisgICAgLyogUG9wdWxhdGUgdGhlIGZyZWUgbGlzdCB3aXRoIGl0J3Mgc2V0IG9mIHN1Yl90ZXJtIGluc3RhbmNlIGVudHJpZXMgKi8gCisgICAgZm9yKGlpPTA7IGlpPE5VTV9TVVBQT1JURURfU1VCX1RFUk1TOyBpaSsrKQorICAgIHsKKyAgICAgICAgCisgICAgICAgIG5ld19lbnRyeSA9IGJjbW9zX2NhbGxvYyhzaXplb2Yoc3ViX3Rlcm1faW5zdCkpOworCisgICAgICAgIGlmIChOVUxMID09IG5ld19lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhGQVRBTCwgbG9nX2lkX3N1Yl90ZXJtLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHN1Yl90ZXJtIGZyZWUgbGlzdCAtIEZBVEFMXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogQW5kIGFkZCBpdCB0byB0aGUgZnJlZSBsaXN0ICovCisgICAgICAgIHN1Yl90ZXJtX2ZyZWVfYnlfZW50cnkobmV3X2VudHJ5KTsKKworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gdW4taW5pdGlhbGl6ZSB0aGUgc3Vic2NyaWJlci10ZXJtaW5hbCBGU00gaW5mcmFzdHJ1Y3R1cmUuCisgKiAgCisgKiAgICAgICAgTk9URTogVGhpcyBpcyBjYWxsZWQgb25jZSBvbiBzaHV0ZG93biBhbmQgTk9UIGZvciBlYWNoIEZTTSBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gc3ViX3Rlcm1fZnNtX2ZpbmlzaCh2b2lkKQoreworCisgICAgc3ViX3Rlcm1faW5zdCAqY3VycmVudF9lbnRyeSwgKnBfdGVtcF9lbnRyeTsKKyAgICBhZ2dfcG9ydF9pZF9lbnRyeSAqYWdnX3BvcnRfZW50cnk7CisgICAgc3ZjX3BvcnRfaWRfZW50cnkgKnN2Y19wb3J0X2VudHJ5OworCisgICAgLyogRnJlZSBhbGwgdGhlIGVudHJpZXMgb24gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksIAorICAgICAgICAgICAgICAgICAgICAgICAmU1VCX1RFUk1fRlNNX1NVQl9URVJNX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX3N1Yl90ZXJtX2xpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9pbnN0X25leHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBfdGVtcF9lbnRyeSkKKyAgICB7CisgICAgICAgIC8qIGZyZWUgdGhlIGFnZ3JlZ2F0aW9uIHBvcnQgbGlzdCAqLyAKKyAgICAgICAgVEFJTFFfRk9SRUFDSChhZ2dfcG9ydF9lbnRyeSwgCisgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnRfZW50cnktPmFnZ19wb3J0X2lkX2xpc3QsIAorICAgICAgICAgICAgICAgICAgICAgIG5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgCisgICAgICAgICAgICAgYmNtb3NfZnJlZShhZ2dfcG9ydF9lbnRyeSk7IAorICAgICAgICB9IAorCisgICAgICAgIC8qIGZyZWUgdGhlIHNlcnZpY2UgcG9ydCBsaXN0ICovCisgICAgICAgIFRBSUxRX0ZPUkVBQ0goc3ZjX3BvcnRfZW50cnksIAorICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50X2VudHJ5LT5zdmNfcG9ydF9pZF9saXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICBuZXh0KQorICAgICAgICB7CisgICAgICAgICAgICAgYmNtb3NfZnJlZShzdmNfcG9ydF9lbnRyeSk7IAorICAgICAgICB9CisKKyAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgICAgIFRBSUxRX1JFTU9WRSgmU1VCX1RFUk1fRlNNX1NVQl9URVJNX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX3N1Yl90ZXJtX2xpc3QsIAorICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9lbnRyeSwgc3ViX3Rlcm1faW5zdF9uZXh0KTsKKworICAgICAgICBiY21vc19mcmVlKGN1cnJlbnRfZW50cnkpOworCisgICAgfQorCisgICAgLyogRnJlZSBhbGwgdGhlIGVudHJpZXMgb24gdGhlIGZyZWUgbGlzdCAqLworICAgIFRBSUxRX0ZPUkVBQ0hfU0FGRShjdXJyZW50X2VudHJ5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgJlNVQl9URVJNX0ZTTV9TVUJfVEVSTV9MSVNUX0NUWF9QVFItPmZyZWVfc3ViX3Rlcm1fbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2luc3RfbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgcF90ZW1wX2VudHJ5KQorICAgIHsKKyAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgICAgIFRBSUxRX1JFTU9WRSgmU1VCX1RFUk1fRlNNX1NVQl9URVJNX0xJU1RfQ1RYX1BUUi0+ZnJlZV9zdWJfdGVybV9saXN0LCAKKyAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZW50cnksIHN1Yl90ZXJtX2luc3RfbmV4dCk7CisKKyAgICAgICAgYmNtb3NfZnJlZShjdXJyZW50X2VudHJ5KTsKKworICAgIH0KKyAgICAgCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBTdWJzY3JpYmVyIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGV4ZWN1dGl2ZSBmdW5jdGlvbgorICoKKyAqIEBwYXJhbSBwX3N1Yl90ZXJtX2luc3QgIFBvaW50ZXIgdG8gYW4gc3Vic2NyaWJlciB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBzdWJzY3JpYmVyIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fZXhlYyhzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIHN1Yl90ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgc3ViX3Rlcm1fZnNtX3N0YXRlIHByZV9zdGF0ZTsgCisgICAgc3ViX3Rlcm1fZnNtX3N0YXRlIGZzbV9zdGF0ZTsgCisgICAgc3ViX3Rlcm1fZnNtX3N0YXRlX3Byb2Nlc3NvciBzdWJfdGVybV9zdGF0ZV9wcm9jZXNzb3I7ICAgICAKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04oTlVMTCA9PSBwX2V2ZW50KTsKKworICAgIC8qIFJlY29yZCB0aGUgcHJlc2VudCBzdGF0ZSBmb3IgZGVidWcgcHJpbnRpbmcKKyAgICAgKi8KKyAgICBwcmVfc3RhdGUgPSAoTlVMTCA9PSBwX3N1Yl90ZXJtX2luc3QpID8gU1VCX1RFUk1fRlNNX1NUQVRFX05VTEwgOiBwX3N1Yl90ZXJtX2luc3QtPmZzbV9zdGF0ZTsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBzdGF0ZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIAorICAgICAqLworICAgIHN1Yl90ZXJtX3N0YXRlX3Byb2Nlc3NvciA9IHN1Yl90ZXJtX3N0YXRlc1twcmVfc3RhdGVdW3BfZXZlbnQtPmV2ZW50X3R5cGVdOworCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSdzIGEgc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbiBmb3IgdGhpcyBldmVudCBhbmQgc3RhdGUsIGV4ZWN1dGUgaXQuCisgICAgICogT3RoZXJ3aXNlLCBwcm9jZXNzIGEgZ2VuZXJpYyBlcnJvci4KKyAgICAgKi8KKyAgICBpZiAoc3ViX3Rlcm1fc3RhdGVfcHJvY2Vzc29yKQorICAgIHsKKyAgICAgICAgcmV0ID0gc3ViX3Rlcm1fc3RhdGVfcHJvY2Vzc29yKHBfc3ViX3Rlcm1faW5zdCwgcF9ldmVudC0+bXNnLCBwX2V2ZW50KTsKKyAgICB9IGVsc2UgICAgICAgIAorICAgIHsKKyAgICAgICAgc3ViX3Rlcm1fZnNtX3N0YXRlX2VycihwX3N1Yl90ZXJtX2luc3QsIHBfZXZlbnQtPm1zZywgcF9ldmVudCk7CisgICAgfQorICAgIAorICAgIC8qIEFuZCBnZXQgdGhlIG5ldyBzdGF0ZSBmb3IgZGVidWcgcHJpbnRpbmcgKi8KKyAgICBmc21fc3RhdGUgPSAoTlVMTCA9PSBwX3N1Yl90ZXJtX2luc3QpID8gU1VCX1RFUk1fRlNNX1NUQVRFX05VTEwgOiBwX3N1Yl90ZXJtX2luc3QtPmZzbV9zdGF0ZTsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAiKioqIEV2ZW50ICVzLCBTdGF0ZTogJXMgLS0+ICVzXG4iLCAKKyAgICAgICAgICAgIHN1Yl90ZXJtX2V2ZW50X25hbWVfZ2V0KHBfZXZlbnQtPmV2ZW50X3R5cGUpLAorICAgICAgICAgICAgc3ViX3Rlcm1fc3RhdGVfbmFtZV9nZXQocHJlX3N0YXRlKSwgc3ViX3Rlcm1fc3RhdGVfbmFtZV9nZXQoZnNtX3N0YXRlKSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgY29yZSB3b3JrZXIgdGhyZWFkIHRvIHByb2Nlc3MgYW4gCisgKiAgICAgICAgc3Vic2NyaWJlci10ZXJtaW5hbCBvYmplY3QgbWVzc2FnZSAoU0VULCBHRVQsIENMRUFSLCBTVEFUUykgcmVjZWl2ZWQgCisgKiAgICAgICAgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkuCisgKgorICogQHBhcmFtIG1zZ19wYXlsb2FkICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgQkFMIFB1YmxpYyBBUEkuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gcHJvY2Vzc19zdWJzY3JpYmVyX3Rlcm1pbmFsX29iamVjdCh2b2lkICptc2dfcGF5bG9hZCkKK3sKKworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgCisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpwX3N1Yl90ZXJtX2NmZyA9IChiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgKiltc2dfcGF5bG9hZDsKKyAgICBzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3Q7CisgICAgc3ViX3Rlcm1fZnNtX2V2ZW50IGZzbV9ldmVudDsKKyAgICBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgKnN1Yl90ZXJtX2tleTsKKyAgICBiY21iYWxfb2JqX21zZ190eXBlIG9wZXJfdHlwZTsKKyAgICAgICAgICAKKyAgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IG1zZ19wYXlsb2FkKTsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zdWJfdGVybSwgIlByb2Nlc3NpbmcgYSBzdWJfdGVybSBvYmplY3RcbiIpOworCisgICAgc3ViX3Rlcm1fa2V5ID0gJnBfc3ViX3Rlcm1fY2ZnLT5rZXk7CisKKyAgICBvcGVyX3R5cGUgPSBwX3N1Yl90ZXJtX2NmZy0+aGRyLmhkci50eXBlOworICAgICAgICAKKyAgICAvKgorICAgICAqIEEgbWVzc2FnZSBwb2ludGVyIG1heSBiZSBwYXNzZWQgaW5zaWRlIHRoZSBldmVudCBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgZnNtX2V2ZW50Lm1zZyA9IG1zZ19wYXlsb2FkOworCisgICAgLyogU0VUIG9yIEdFVCBvciBDTEVBUiA/ICovCisgICAgc3dpdGNoIChvcGVyX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIChCQ01CQUxfT0JKX01TR19UWVBFX1NFVCk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgYl9nZW5lcmF0ZV9ldmVudCA9IEJDTU9TX0ZBTFNFOworCisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3ViX3Rlcm0sICJQcm9jZXNzaW5nIGEgc3ViX3Rlcm0gU0VUIFJFUSBtZ210IG1lc3NhZ2VcbiIpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRmluZCBvciBjcmVhdGUgdGhlIHNwZWNpZmllZCBzdWJfdGVybSBpbnN0YW5jZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwX3N1Yl90ZXJtX2luc3QgPSBzdWJfdGVybV9pbnN0X2dldChzdWJfdGVybV9rZXksIFNVQl9URVJNX0ZMQUdfQU5ZKTsKKworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcF9zdWJfdGVybV9pbnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N1Yl90ZXJtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3BlY2lmaWVkIHN1Yl90ZXJtIG5vdCBmb3VuZC4gIE5vIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgc3RhdGUgb2YgdGhpcyBzdWJfdGVybSBpcyBpbiBmbHV4LCB0aGVuIHJlamVjdCB0aGUgU0VUIHJlcXVlc3QgKi8KKyAgICAgICAgICAgICAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfR0VUKCYocF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8pKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHN1YnNjcmliZXJfdGVybWluYWwgaXMgaW4tcHJvZ3Jlc3MsIFNFVHMgYXJlIG5vdCBhbGxvd2VkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisJCQkJaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gYmNtYmFsX3N1Yl90ZXJtX3RtX3NjaGVkc19zZXQocF9zdWJfdGVybV9jZmcpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IHNldCBzdWJzY3JpYmVyIHRlcm1pbmFsIGFzIG93bmVyIG9mIHNwZWNpZmllZCB0bSBzY2hlZHNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRmlsbCBpbiB0aGUgbG9jYWwgc3ViX3Rlcm0gaW5zdGFuY2UgQVBJIHJlcXVlc3QgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwX3N1Yl90ZXJtX2luc3QtPmFwaV9yZXFfc3ViX3Rlcm1faW5mbyA9ICpwX3N1Yl90ZXJtX2NmZzsKKworICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zdWJfdGVybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdWJfdGVybSBhZG1pbiBzdGF0ZSBpczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoQkNNQkFMX1NUQVRFX1VQID09IHBfc3ViX3Rlcm1faW5zdC0+YXBpX3JlcV9zdWJfdGVybV9pbmZvLmRhdGEuYWRtaW5fc3RhdGUpID8gIlVQIiA6ICJET1dOIik7CisKKyAKKyAgICAgICAgICAgICAgICAgLyogSWYgdGhlcmUncyBubyBzdGF0ZSBjaGFuZ2UsIHRoZW4gd2UncmUgZG9uZSAqLworICAgICAgICAgICAgICAgIGlmKHBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvLmRhdGEuYWRtaW5fc3RhdGUgPT0gCisgICAgICAgICAgICAgICAgICAgcF9zdWJfdGVybV9pbnN0LT5hcGlfcmVxX3N1Yl90ZXJtX2luZm8uZGF0YS5hZG1pbl9zdGF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgLyogRm9yIHN1YnNjcmliZXIgdGVybWluYWxzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCBhbmQgdGhlbiBtYWRlIGRvcm1hbnQsIG1lcmdlIHRoZQorICAgICAgICAgICAgICAgICAqIHJlcXVlc3RlZCBkYXRhIHdpdGggdGhlIGN1cnJlbnQgZGF0YSwgYW5kIHRoaXMgaXMgdGhlIG5ldyByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKEJDTUJBTF9TVEFUVVNfRE9XTiA9PSBwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mby5kYXRhLm9wZXJfc3RhdHVzKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBiY21iYWxfc3ViX3Rlcm1fb2JqZWN0X292ZXJsYXlfd19kc3RfcHJpb3JpdHkoJnBfc3ViX3Rlcm1faW5zdC0+YXBpX3JlcV9zdWJfdGVybV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvKTsgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDaGVjayBpZiB0aGUgbWFuZGF0b3J5IHN1YnNjcmliZXIgdGVybWluYWwgIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldCwgYW5kIHJhbmdlIGNoZWNrIHdoZXJlCisgICAgICAgICAgICAgICAgICogYXBwbGljYWJsZS4KKyAgICAgICAgICAgICAgICAgKi8KKworCisgICAgICAgICAgICAgICAgLyogVGhlIGFkbWluIHN0YXRlIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkgKi8KKyAgICAgICAgICAgICAgICBpZihCQ01PU19GQUxTRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZwX3N1Yl90ZXJtX2luc3QtPmFwaV9yZXFfc3ViX3Rlcm1faW5mbywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfdGVybWluYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbl9zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX01BTkRBVE9SWV9QQVJNX0lTX01JU1NJTkc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogUGVyZm9ybSB0aGUgdmFsaWRhdGlvbiBjaGVjayhzKSB0aGF0IHRoZSB1dGlscyByZXF1aXJlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAKKyAgICAgICAgICAgICAgICAgICAocmV0ID0gbWFjX3V0aWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmZvX3ZhbGlkYXRlKCZwX3N1Yl90ZXJtX2luc3QtPmFwaV9yZXFfc3ViX3Rlcm1faW5mbykpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSgwKTsKKworICAgICAgICAgICAgLyogV2UgcmVzcG9uZCB0byB0aGUgQkFMIHB1YmxpYyBBUEkgYmFja2VuZCB3aXRoIGEgcmVzdWx0LiBXZSBhbHdheXMgCisgICAgICAgICAgICAgKiBzZW5kIGEgY29tcGxldGUgbXNnX3BheWxvYWQgYmFjayB0byB0aGUgQVBJLCBidXQgdGhlIGRhdGEgcG9ydGlvbiAKKyAgICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgaXMgb25seSByZWxldmFudCB3aGVuIGEgR0VUIG9yIEdFVC1TVEFUUyBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChyZXQsIG1zZ19wYXlsb2FkLCBvcGVyX3R5cGUsIGxvZ19pZF9zdWJfdGVybSk7CisKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSW5pdGlhbCBjaGVja3MgY29tcGxldGUuICBQcm9jZXNzIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYoKEJDTUJBTF9TVEFURV9VUCA9PSBwX3N1Yl90ZXJtX2luc3QtPmFwaV9yZXFfc3ViX3Rlcm1faW5mby5kYXRhLmFkbWluX3N0YXRlKQorICAgICAgICAgICAgICAgJiYgKEJDTUJBTF9TVEFURV9VUCAhPSBwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mby5kYXRhLmFkbWluX3N0YXRlKSkKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmcF9zdWJfdGVybV9pbnN0LT5hcGlfcmVxX3N1Yl90ZXJtX2luZm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyX3Rlcm1pbmFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZjX3BvcnRfaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9rZXktPnN1Yl90ZXJtX2lkKTsKKworICAgICAgICAgICAgICAgIHBfc3ViX3Rlcm1faW5zdC0+YXBpX3JlcV9zdWJfdGVybV9pbmZvLmRhdGEuYWRtaW5fc3RhdGUgPSBCQ01CQUxfU1RBVEVfVVA7CisKKyAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGV4cGVjdGVkIHN0YXRlIG9mIHRoZSBvcGVyX3N0YXR1cyB1cG9uIHN1Y2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBwX3N1Yl90ZXJtX2luc3QtPmFwaV9yZXFfc3ViX3Rlcm1faW5mby5kYXRhLm9wZXJfc3RhdHVzID0gQkNNQkFMX1NUQVRVU19VUDsKKworICAgICAgICAgICAgICAgIGZzbV9ldmVudC5ldmVudF90eXBlID0gU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfQURNSU5fVVA7CisgICAgICAgICAgICAgICAgYl9nZW5lcmF0ZV9ldmVudCA9IEJDTU9TX1RSVUU7CisKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAgICAgICAgICAgICAiKioqVXNpbmcgR0VNICVkIGZvciBzdWJzY3JpYmVyIHRlcm1pbmFsIE9NQ0kgY2hhbm5lbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc3ViX3Rlcm1faW5zdC0+YXBpX3JlcV9zdWJfdGVybV9pbmZvLmRhdGEuc3ZjX3BvcnRfaWQpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKChCQ01CQUxfU1RBVEVfRE9XTiA9PSBwX3N1Yl90ZXJtX2luc3QtPmFwaV9yZXFfc3ViX3Rlcm1faW5mby5kYXRhLmFkbWluX3N0YXRlKQorICAgICAgICAgICAgICAgICAgICAmJiAoQkNNQkFMX1NUQVRFX0RPV04gIT0gcF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8uZGF0YS5hZG1pbl9zdGF0ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8uZGF0YS5hZG1pbl9zdGF0ZSA9IEJDTUJBTF9TVEFURV9ET1dOOworIAorICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgZXhwZWN0ZWQgc3RhdGUgb2YgdGhlIG9wZXJfc3RhdHVzIHVwb24gc3VjY2VzcyAqLworICAgICAgICAgICAgICAgIHBfc3ViX3Rlcm1faW5zdC0+YXBpX3JlcV9zdWJfdGVybV9pbmZvLmRhdGEub3Blcl9zdGF0dXMgPSBCQ01CQUxfU1RBVFVTX0RPV047CisKKyAgICAgICAgICAgICAgICBmc21fZXZlbnQuZXZlbnRfdHlwZSA9IFNVQl9URVJNX0ZTTV9FVkVOVF9UWVBFX0FETUlOX0ROOworICAgICAgICAgICAgICAgIGJfZ2VuZXJhdGVfZXZlbnQgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEB0b2RvIGltcGxlbWVudCBhIE1PRElGWSBoZXJlICovCisgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3ViX3Rlcm0sICJubyBzdGF0ZSBjaGFuZ2UuLi5kb25lXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsgICAvKiBubyBzdGF0ZSBjaGFuZ2UgZGV0ZWN0ZWQgLSBkbyBub3RoaW5nIGZvciBub3cgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgdGhlcmUgd2FzIGFuIGV2ZW50IGdlbmVyYXRlZCwgY2FsbCB0aGUgc3RhdGUgbWFjaGluZSBleGVjICovCisgICAgICAgICAgICBpZihCQ01PU19UUlVFID09IGJfZ2VuZXJhdGVfZXZlbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBSdW4gdGhlIHN1Yl90ZXJtIEZTTSB0byBwcm9jZXNzIHRoaXMgZXZlbnQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXQgPSBzdWJfdGVybV9mc21fZXhlYyhwX3N1Yl90ZXJtX2luc3QsICZmc21fZXZlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIChCQ01CQUxfT0JKX01TR19UWVBFX0dFVCk6CisgICAgICAgIHsKKworICAgICAgICAgICAgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OCBhZ2dfcG9ydF9pZF9saXN0ID0ge307CisgICAgICAgICAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggc3ZjX3BvcnRfaWRfbGlzdCA9IHt9OworCisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3ViX3Rlcm0sICJQcm9jZXNzaW5nIGEgc3ViX3Rlcm0gR0VUIFJFUSBtZ210IG1lc3NhZ2VcbiIpOworCisgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAqIEp1c3QgcmV0dXJuIHRoZSBzdWJfdGVybSBkYXRhIGluZm8gdGhhdCB3ZSBoYXZlIG9uIHJlY29yZCBmb3IgCisgICAgICAgICAgICAgKiB0aGlzIHN1Yl90ZXJtIGluc3RhbmNlCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZpbmQgdGhlIHNwZWNpZmllZCBzdWJfdGVybSBpbnN0YW5jZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwX3N1Yl90ZXJtX2luc3QgPSBzdWJfdGVybV9pbnN0X2dldChzdWJfdGVybV9rZXksIFNVQl9URVJNX0ZMQUdfQUNUSVZFKTsKKworICAgICAgICAgICAgaWYoTlVMTCA9PSBwX3N1Yl90ZXJtX2luc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBub3QgYSBmYXRhbCBlcnJvciBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3ViX3Rlcm0sICJTcGVjaWZpZWQgc3ViX3Rlcm0gbm90IGZvdW5kIG9uIEdFVFxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBhZ2dfcG9ydF9pZCBsaXN0IGlmIHJlcXVlc3RlZCAqLworICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfQ0xFQVIoJnBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcl90ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ19wb3J0X2lkX2xpc3QpOworCisgCisgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSB1c2VyIHJlcXVlc3RlZCB0aGUgbGlzdCBvZiBhZ2dfcG9ydF9pZHMgZm9yIHRoaXMgc3Vic2NyaWJlciB0ZXJtaW5hbAorICAgICAgICAgICAgICAgICAgICAgKiB0aGVuIHJldHVybiB0aGUgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9zdWJfdGVybV9jZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcl90ZXJtaW5hbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdnX3BvcnRfaWRfbGlzdCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gYWdnX3BvcnRfaWRfbGlzdF9maWxsKHBfc3ViX3Rlcm1faW5zdCwgJmFnZ19wb3J0X2lkX2xpc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IFRoZSByZXR1cm5lZCBsaXN0IG1heSBiZSBlbXB0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcl90ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ19wb3J0X2lkX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dfcG9ydF9pZF9saXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3ViX3Rlcm0sICJFcnJvciB0cnlpbmcgdG8gZmlsbCBhZ2dfcG9ydCBsaXN0IHRvIHJldHVyblxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBzdmNfcG9ydF9pZCBsaXN0IGlmIHJlcXVlc3RlZCAqLworICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfQ0xFQVIoJnBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcl90ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Y19wb3J0X2lkX2xpc3QpOworCisgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSB1c2VyIHJlcXVlc3RlZCB0aGUgbGlzdCBvZiBzdWJfdGVybV9pZHMgZm9yIHRoaXMgc3Vic2NyaWJlciB0ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICogdGhlbiByZXR1cm4gdGhlIGxpc3QuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfc3ViX3Rlcm1fY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJfdGVybWluYWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Y19wb3J0X2lkX2xpc3QpKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gc3ZjX3BvcnRfaWRfbGlzdF9maWxsKHBfc3ViX3Rlcm1faW5zdCwgJnN2Y19wb3J0X2lkX2xpc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IFRoZSByZXR1cm5lZCBsaXN0IG1heSBiZSBlbXB0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcl90ZXJtaW5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2Y19wb3J0X2lkX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmNfcG9ydF9pZF9saXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3ViX3Rlcm0sICJFcnJvciB0cnlpbmcgdG8gZmlsbCBzdmNfcG9ydCBsaXN0IHRvIHJldHVyblxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfXdoaWxlICgwKTsKKworICAgICAgICAgICAgICAgIC8qIFdlIHJlc3BvbmQgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGJhY2tlbmQgd2l0aCBhIHJlc3VsdC4gV2UgYWx3YXlzIAorICAgICAgICAgICAgICAgICAqIHNlbmQgYSBjb21wbGV0ZSBtc2dfcGF5bG9hZCBiYWNrIHRvIHRoZSBBUEksIGJ1dCB0aGUgZGF0YSBwb3J0aW9uIAorICAgICAgICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgaXMgb25seSByZWxldmFudCB3aGVuIGEgR0VUIG9yIEdFVC1TVEFUUyBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgICAgICovCisgCisgICAgICAgICAgICAgICAgcF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8uaGRyLmhkci5jb21tX2hkciA9ICgoYmNtYmFsX29iaiAqKW1zZ19wYXlsb2FkKS0+Y29tbV9oZHI7CisgICAgICAgICAgICAgICAgKigoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICopbXNnX3BheWxvYWQpID0gcF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChyZXQsIG1zZ19wYXlsb2FkLCBvcGVyX3R5cGUsIGxvZ19pZF9zdWJfdGVybSk7CisKKyAgICAgICAgICAgIC8qIEZyZWUgdGhlIHRlbXBvcmFyeSBsaXN0cyBpZiB0aGV5IHdlcmUgdXNlZCAqLworICAgICAgICAgICAgaWYoc3ZjX3BvcnRfaWRfbGlzdC52YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShzdmNfcG9ydF9pZF9saXN0LnZhbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGFnZ19wb3J0X2lkX2xpc3QudmFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX2ZyZWUoYWdnX3BvcnRfaWRfbGlzdC52YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAgICAgICAgICAKKworICAgICAgICBjYXNlIChCQ01CQUxfT0JKX01TR19UWVBFX0NMRUFSKToKKyAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZpbmQgdGhlIHNwZWNpZmllZCBzdWJfdGVybSBpbnN0YW5jZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwX3N1Yl90ZXJtX2luc3QgPSBzdWJfdGVybV9pbnN0X2dldChzdWJfdGVybV9rZXksIFNVQl9URVJNX0ZMQUdfQUNUSVZFKTsKKworICAgICAgICAgICAgaWYoTlVMTCA9PSBwX3N1Yl90ZXJtX2luc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBub3QgYSBmYXRhbCBlcnJvciBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3ViX3Rlcm0sICJTcGVjaWZpZWQgc3ViX3Rlcm0gbm90IGZvdW5kIG9uIENMRUFSXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRmlsbCBpbiB0aGUgbG9jYWwgc3ViX3Rlcm0gaW5zdGFuY2UgQVBJIHJlcXVlc3QgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwX3N1Yl90ZXJtX2luc3QtPmFwaV9yZXFfc3ViX3Rlcm1faW5mbyA9ICpwX3N1Yl90ZXJtX2NmZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAvKiBXZSByZXNwb25kIHRvIHRoZSBCQUwgcHVibGljIEFQSSBiYWNrZW5kIHdpdGggYSByZXN1bHQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChyZXQsIG1zZ19wYXlsb2FkLCBvcGVyX3R5cGUsIGxvZ19pZF9zdWJfdGVybSk7CisKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZzbV9ldmVudC5ldmVudF90eXBlID0gU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfUkVNT1ZFOworCisgICAgICAgICAgICAgICAgLyogUnVuIHRoZSBzdWJfdGVybSBGU00gdG8gcHJvY2VzcyB0aGlzIGV2ZW50ICovCisgICAgICAgICAgICAgICAgcmV0ID0gc3ViX3Rlcm1fZnNtX2V4ZWMocF9zdWJfdGVybV9pbnN0LCAmZnNtX2V2ZW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3ViX3Rlcm0sIAorICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uIG9uIHN1Yl90ZXJtIG9iamVjdCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBiY21iYWxfbXNnX2lkX29wZXJfZ2V0KG1zZ19wYXlsb2FkKSApOworCisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisKKyAgICAgICAgICAgIC8qIFdlIHJlc3BvbmQgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGJhY2tlbmQgd2l0aCBhIHJlc3VsdC4gV2UgYWx3YXlzIAorICAgICAgICAgICAgICogc2VuZCBhIGNvbXBsZXRlIG1zZ19wYXlsb2FkIGJhY2sgdG8gdGhlIEFQSSwgYnV0IHRoZSBkYXRhIHBvcnRpb24gCisgICAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiBhIEdFVCBvciBHRVQtU1RBVFMgaGFzIGJlZW4gcmVxdWVzdGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtZ210X21zZ19zZW5kX2JhbGFwaV9yc3AocmV0LCBtc2dfcGF5bG9hZCwgb3Blcl90eXBlLCBsb2dfaWRfc3ViX3Rlcm0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgCisgICAgcmV0dXJuIHJldDsKK30KKworCitiY21vc19lcnJubyBwcm9jZXNzX3N1YnNjcmliZXJfdGVybWluYWxfdXRpbF9tc2codm9pZCAqbXNnX3BheWxvYWQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QgPSBOVUxMOworICAgIGJjbWJhbF9tc2dfdHlwZSB0eXBlOworICAgIHN1Yl90ZXJtX2ZzbV9ldmVudCBzdWJfdGVybV9ldmVudDsKKyAgICBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkga2V5OworCisgICAgQlVHX09OKE5VTEwgPT0gbXNnX3BheWxvYWQpOworCisgICAgdHlwZSA9IGJjbWJhbF90eXBlX21pbm9yX2dldChtc2dfcGF5bG9hZCk7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3ViX3Rlcm0sCisgICAgICAgICAgICAiUHJvY2Vzc2luZyBhIHN1Yl90ZXJtICVzIHV0aWwgbWVzc2FnZSBmcm9tICVzXG4iLAorICAgICAgICAgICAgYmNtYmFsX21zZ190X3N0clt0eXBlXSwKKyAgICAgICAgICAgIHN1YnN5c3RlbV9zdHJbYmNtYmFsX3NlbmRlcl9nZXQobXNnX3BheWxvYWQpXSk7CisKKyAgICAvKiByZWNvdmVyIHRoZSBrZXkgZnJvbSB0aGUgbWVzc2FnZSAqLworICAgIGtleSA9ICgoYmFsX3V0aWxfbXNnX2luZCAqKW1zZ19wYXlsb2FkKS0+b2JqX2tleS5zdWJfdGVybV9rZXk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N1Yl90ZXJtLCAiR290IHN1Yl90ZXJtIGtleSBpZCBmcm9tIHV0aWwgKElEJWQsIFBPTiAlZClcbiIsCisgICAgICAgICAgICAgICAga2V5LnN1Yl90ZXJtX2lkLCBrZXkuaW50Zl9pZCk7CisKKyAgICAgICAgLyogRG9uJ3QgYm90aGVyIHRvIGxvb2sgdXAgdGhlIHN1Yl90ZXJtIGluc3RhbmNlIGZvciBESVNDT1ZFUlkgbWVzc2FnZXMgZnJvbSB0aGUgCisgICAgICAgICAqIG1hYyB1dGlsIHdoZXJlIHRoZSBzdWJfdGVybV9pZCBpcyB1bmtub3duLiAgVGhpcyBpcyBhIG5ldyBPTlUsIHNvIGl0IHdpbGwgbm90CisgICAgICAgICAqIGJlIGZvdW5kIGluIHRoZSBBQ1RJVkUgdGFibGUuCisgICAgICAgICAqLworICAgICAgICBpZigoQkFMX01TR19UWVBFX0FVVE9fSU5EICE9IChiY21iYWxfbXNnX3R5cGUpdHlwZSkgfHwgCisgICAgICAgICAgIChCQUxfTVNHX1RZUEVfQVVUT19JTkQgPT0gKGJjbWJhbF9tc2dfdHlwZSl0eXBlICYmIEJDTUJBTF9TVUJfSURfVU5LTk9XTiAhPSBrZXkuc3ViX3Rlcm1faWQpKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogR2V0IHRoZSBzdWJfdGVybSBpbnN0YW5jZSB0aGF0J3MgYmVpbmcgcmVmZXJlbmNlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwX3N1Yl90ZXJtX2luc3QgPSBzdWJfdGVybV9pbnN0X2dldCgma2V5LCBTVUJfVEVSTV9GTEFHX0FDVElWRSk7CisgICAgICAgICAgICBpZihOVUxMID09IHBfc3ViX3Rlcm1faW5zdCkKKyAgICAgICAgICAgIHsgIAorICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBzdWJfdGVybSAoSUQlZCwgUE9OJWQpIGZvdW5kIHdoaWxlIHByb2Nlc3NpbmcgYSB1dGlsIG1lc3NhZ2UgdHlwZSAlcyBmcm9tICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAga2V5LnN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAga2V5LmludGZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfbXNnX3Rfc3RyW3R5cGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3lzdGVtX3N0cltiY21iYWxfc2VuZGVyX2dldChtc2dfcGF5bG9hZCldKTsKKworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFJlY29yZCB0aGUgbXNnIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgYWNjZXNzCisgICAgICAgICAqLworICAgICAgICBzdWJfdGVybV9ldmVudC5tc2cgPSBtc2dfcGF5bG9hZDsKKworICAgICAgICBpZiAoQkFMX01TR19UWVBFX0lORCA9PSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBzdWJfdGVybV9ldmVudC5ldmVudF90eXBlID0gU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfVVRJTF9NU0c7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoQkFMX01TR19UWVBFX0FVVE9fSU5EID09IHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1Yl90ZXJtX2V2ZW50LmV2ZW50X3R5cGUgPSBTVUJfVEVSTV9GU01fRVZFTlRfVFlQRV9VVElMX0FVVE9fTVNHOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N1Yl90ZXJtLCAKKyAgICAgICAgICAgICAgICAgICAgIlVua25vd24gbWVzc2FnZSB0eXBlIHJlY2VpdmVkIGZyb20gdGhlIEFQUCAobm90IG9uZSBvZiBSU1A6QUNLOklORDpBVVRPX0lORCkgKHR5cGU6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICB0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwX3N1Yl90ZXJtX2luc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zdWJfdGVybSwgInBfc3ViX3Rlcm1faW5zdC0+ZnNtX3N0YXRlPSVkICwgc3ViX3Rlcm1fZXZlbnQuZXZlbnRfdHlwZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgcF9zdWJfdGVybV9pbnN0LT5mc21fc3RhdGUsIHN1Yl90ZXJtX2V2ZW50LmV2ZW50X3R5cGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEJBTF9NU0dfVFlQRV9JTkQgPT0gdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zdWJfdGVybSwgInBfc3ViX3Rlcm1faW5zdCBpcyBOVUxMXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBSdW4gdGhlIFN1Yl9UZXJtIEZTTSB0byBwcm9jZXNzIHRoaXMgZXZlbnQKKyAgICAgICAgICovCisgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBzdWJfdGVybV9mc21fZXhlYyhwX3N1Yl90ZXJtX2luc3QsICZzdWJfdGVybV9ldmVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIFN1YnNjcmliZXIgdGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZm9yIGEgc3Vic2NyaWJlci10ZXJtaW5hbCAKKyAqICAgICAgICBhZG1pbi11cCBjb21tYW5kIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJIHdoZW4gdGhlIHNwZWNpZmllZAorICogICAgICAgIHN1YnNjcmliZXItdGVybWluYWwgaW5zdGFuY2UgaXMgaW4gdGhlIGFkbWluLWRvd24gc3RhdGUgKGkuZS4gd2hlbgorICogICAgICAgIHRoZSBzdWJzY3JpYmVyLXRlcm1pbmFsIGluc3RhbmNlIEZTTSBpcyBpbiB0aGUgTlVMTCBvciBSRU1PVkVEIHN0YXRlKS4KKyAqCisgKiBAcGFyYW0gcF9zdWJfdGVybV9pbnN0ICBQb2ludGVyIHRvIGFuIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSQorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBzdWJzY3JpYmVyIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fYWRtaW5fdXBfc3RhcnQoc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KQoreworCisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N1Yl90ZXJtLCAKKyAgICAgICAgICAgICJSZWNlaXZlZCBhIGFkbWluIFVQIHJlcXVlc3QgZnJvbSBCQUwgQVBJIC0gYnJpbmdpbmcgdXAgU1VCX1RFUk1cbiIpOworCisgICAgLyogY2hhbmdlIHN1YnNjcmliZXIgdGVybWluYWwgc3RhdGUgdG8gQ09ORklHVVJJTkcgKi8KKyAgICBwX3N1Yl90ZXJtX2luc3QtPmZzbV9zdGF0ZSA9IFNVQl9URVJNX0ZTTV9TVEFURV9DT05GSUdVUklORzsKKworICAgIC8q4oCTIENvcmUgY2FsbHMgTWFjIFV0aWxzIHRvIHNldCB0aGUgc3Vic2NyaWJlci10ZXJtaW5hbCBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBhcHBsaWNhYmxlIFNESyBjYWxscyAgICovCisgICAgcmV0ID0gbWFjX3V0aWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zZXQocF9zdWJfdGVybV9pbnN0LCBCQUxfVVRJTF9PUEVSX1NVQl9URVJNX0FERCwgQkNNT1NfRkFMU0UpOworCisgICAgZG8KKyAgICB7CisKKyAgICAgICAgLyogY2hlY2sgZm9yIG9iamVjdCBpbiB3cm9uZyBzdGF0ZSwgdGhpcyBpcyBub3QgYW4gYWN0dWFsIGVycm9yICovCisgICAgICAgIGlmKEJDTV9FUlJfU1RBVEUgPT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAgICAgICAgICJtYWNfdXRpbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3NldCgpIHN1YnNjcmliZXJfdGVybWluYWwgY291bGQgbm90IGJlIGFjdGl2YXRlZCBhdCB0aGlzIHRpbWVcbiIpOworICAgIAorICAgICAgICB9CisgICAgICAgIC8qIGNoZWNrIGZvciBlcnJvcnMgKi8KKyAgICAgICAgZWxzZSBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N1Yl90ZXJtLCAKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIGRldGVjdGVkIGluIG1hY191dGlsX3N1YnNjcmliZXJfdGVybWluYWxfc2V0KCk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIAorICAgICAgICB9CisgICAKKyAgICAgICAgLyogVGhlIGhhcmR3YXJlIGhhcyBwcm9wZXJseSBhY2NlcHRlZCB0aGUgb2JqZWN0IGluZm8sIHNvIHRoZSByZXF1ZXN0IG9iamVjdCBiZWNvbWVzCisgICAgICAgICAqIHRoZSBjdXJyZW50IHN0YXRlLCBleGNlcHQgZm9yIHRoZSBvcGVyX3N0YXR1cy4KKyAgICAgICAgICovCisgICAgICAgIGJjbWJhbF9zdWJfdGVybV9vYmplY3Rfb3ZlcmxheV93X3NyY19wcmlvcml0eSgmcF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9zdWJfdGVybV9pbnN0LT5hcGlfcmVxX3N1Yl90ZXJtX2luZm8pOworICAgICAgICAKKyAgICAgICAgLyogQWRkIHRoaXMgc3Vic2NyaWJlcl90ZXJtaW5hbCB0byB0aGUgbGlzdCBvZiBzdWJzY3JpYmVyX3Rlcm1pbmFscyBhc3NvY2lhdGVkIHdpdGggaXQncyBpbnRlcmZhY2UgKi8KKyAgICAgICAgYmNtYmFsX2ludGVyZmFjZV9zdWJfdGVybV9saXN0X2VudHJ5X2FkZChwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mby5rZXkpOworCisgICAgICAgIC8qIFJlY29yZCB0aGF0IHRoaXMgb2JqZWN0IGlzIGluIHByb2dyZXNzICovCisgICAgICAgIEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfU0VUKCYocF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8pLCBCQ01PU19UUlVFKTsKKworICAgIH0gd2hpbGUoMCk7CisKKyAgICAvKiBJZiB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgcHJvY2Vzc2luZywgdGhlbiByZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBBUEkgKi8KKyAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICB7CisgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2lkX3N1Yl90ZXJtKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBzdWJzY3JpYmVyIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZvciBhIHN1YnNjcmliZXIgdGVybWluYWwKKyAqICAgICAgICBhZG1pbi11cCBjb21tYW5kIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJIHdoZW4gdGhlIHNwZWNpZmllZAorICogICAgICAgIHN1YnNjcmliZXIgdGVybWluYWwgRlNNIGlzIGFscmVhZHkgaW4gdGhlIFJFTU9WSU5HIHN0YXRlLgorICoKKyAqIEBwYXJhbSBwX3N1Yl90ZXJtX2luc3QgIFBvaW50ZXIgdG8gYSBzdWJzY3JpYmVyIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gc3Vic2NyaWJlciB0ZXJtaW5hbCBldmVudCBzdHJ1Y3R1cmUKKyAqIAorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gc3ViX3Rlcm1fZnNtX2FkbWluX3VwX2Vycm9yKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfU1RBVEU7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3ViX3Rlcm0sIAorICAgICAgICAgICAgIlJlY2VpdmVkIGEgYWRtaW4gVVAgcmVxdWVzdCBmcm9tIEJBTCBBUEkgLSByZXR1cm5pbmcgRVJST1IgdG8gdGhlIEFQSSIKKyAgICAgICAgICAgICIgLSBubyBmdXJ0aGVyIGZ1bmN0aW9uXG4iKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBTdWJzY3JpYmVyIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZvciBhbiBzdWJzY3JpYmVyLXRlcm1pbmFsIAorICogICAgICAgIGFkbWluLWRvd24gY29tbWFuZCByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSSB3aGVuIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICBzdWJzY3JpYmVyLXRlcm1pbmFsIGlzIGFkbWluLXVwIChpLmUgd2hlbiB0aGUgc3BlY2lmaWVkIHN1YnNjcmliZXItdGVybWluYWwKKyAqICAgICAgICBpbnN0YW5jZSBGU00gaXMgaW4gdGhlIENPTkZJR1VSRUQgc3RhdGUpLgorICoKKyAqIEBwYXJhbSBwX3N1Yl90ZXJtX2luc3QgIFBvaW50ZXIgdG8gYW4gc3Vic2NyaWJlciB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGFuIHN1YnNjcmliZXIgdGVybWluYWwgZXZlbnQgc3RydWN0dXJlCisgKiAKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2ZzbV9hZG1pbl9kbl9zdGFydChzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N1Yl90ZXJtLCAKKyAgICAgICAgICAgICJSZWNlaXZlZCBhIGFkbWluIERPV04gcmVxdWVzdCBmcm9tIEJBTCBBUEkgLSBicmluZ2luZyBkb3duIFNVQl9URVJNXG4iKTsKKworICAgIC8qIGNoYW5nZSBzdWJzY3JpYmVyIHRlcm1pbmFsIHN0YXRlIHRvIENPTkZJR1VSSU5HICovCisgICAgcF9zdWJfdGVybV9pbnN0LT5mc21fc3RhdGUgPSBTVUJfVEVSTV9GU01fU1RBVEVfQ09ORklHVVJJTkc7CisKKyAgICAvKuKAkyBDb3JlIGNhbGxzIE1hYyBVdGlscyB0byBzZXQgdGhlIHN1YnNjcmliZXItdGVybWluYWwgcGFyYW1ldGVycyB1c2luZyB0aGUgYXBwbGljYWJsZSBTREsgY2FsbHMgICAqLworICAgIHJldCA9IG1hY191dGlsX3N1YnNjcmliZXJfdGVybWluYWxfc2V0KHBfc3ViX3Rlcm1faW5zdCwgQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9SRU1PVkUsIEJDTU9TX0ZBTFNFKTsKKworICAgIC8qIGNoZWNrIGZvciBlcnJvcnMgKi8KKyAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAgICAgIkVycm9yIGRldGVjdGVkIGluIG1hY191dGlsX3N1YnNjcmliZXJfdGVybWluYWxfc2V0KCk6ICVzXG4iLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJldCkpOworCisgICAgICAgIC8qIHJlcG9ydCB0aGUgc3RhdHVzIHRvIHRoZSBBUEkgKi8KKyAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfc3ViX3Rlcm0pOworIAorICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBOT1RFOiBUaGUgaGFyZHdhcmUgaGFzIHByb3Blcmx5IGFjY2VwdGVkIHRoZSBvYmplY3QgaW5mbyBidXQgd2UgZG8KKyAgICAgICAgICogbm90IG92ZXJ3cml0ZSB0aGUgY3VycmVudCBzdWJzY3JpYmVyIHRlcm1pbmFsIGRhdGEgYXMgdGhlcmUgaXMgbm90aGluZyBpbiB0aGUgcmVxdWVzdAorICAgICAgICAgKiB0aGF0IGlzIHJlbGV2YW50IGJlc2lkZXMgdGhlIGFkbWluX3N0YXRlLiAgV2UgbWVyZWx5IHNldCB0aGUgb2JqZWN0IHRvIGluX3Byb2dyZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgQkNNQkFMX09CSl9JTl9QUk9HUkVTU19TRVQoJihwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mbyksIEJDTU9TX1RSVUUpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBTdWJzY3JpYmVyIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZvciBhbiBzdWJzY3JpYmVyLXRlcm1pbmFsIAorICogICAgICAgIGNsZWFyIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqCisgKiBAcGFyYW0gcF9zdWJfdGVybV9pbnN0ICBQb2ludGVyIHRvIGFuIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSQorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBzdWJzY3JpYmVyIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fcmVtb3Zpbmdfc3RhcnQoc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAiUmVjZWl2ZWQgYSBSRU1PVkUgcmVxdWVzdCBmcm9tIEJBTCBBUEkgLSByZW1vdmluZyBTVUJfVEVSTVxuIik7CisKKyAgICAvKiBjaGFuZ2Ugc3Vic2NyaWJlciB0ZXJtaW5hbCBzdGF0ZSB0byBSRU1PVklORyAqLworICAgIHBfc3ViX3Rlcm1faW5zdC0+ZnNtX3N0YXRlID0gU1VCX1RFUk1fRlNNX1NUQVRFX1JFTU9WSU5HOworCisgICAgLyrigJMgQ29yZSBjYWxscyBNYWMgVXRpbHMgdG8gc2V0IHRoZSBzdWJzY3JpYmVyLXRlcm1pbmFsIHBhcmFtZXRlcnMgdXNpbmcgdGhlIGFwcGxpY2FibGUgU0RLIGNhbGxzICAgKi8KKyAgICByZXQgPSBtYWNfdXRpbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3NldChwX3N1Yl90ZXJtX2luc3QsIEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQ0xFQVIsIEJDTU9TX0ZBTFNFKTsKKworICAgIC8qIGNoZWNrIGZvciBlcnJvcnMgKi8KKyAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAgICAgIkVycm9yIGRldGVjdGVkIGluIG1hY191dGlsX3N1YnNjcmliZXJfdGVybWluYWxfc2V0KCk6ICVzXG4iLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgIAorICAgICAgICAvKiByZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBBUEkgKi8KKyAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfc3ViX3Rlcm0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUaGUgaGFyZHdhcmUgaGFzIHByb3Blcmx5IGFjY2VwdGVkIHRoZSBvYmplY3QgaW5mbywgc28gdGhlIHJlcXVlc3Qgb2JqZWN0IGJlY29tZXMKKyAgICAgICAgICogdGhlIGN1cnJlbnQgc3RhdGUsIGV4Y2VwdCBmb3IgdGhlIG9wZXJfc3RhdHVzLgorICAgICAgICAgKi8KKyAgICAgICAgYmNtYmFsX3N1Yl90ZXJtX29iamVjdF9vdmVybGF5X3dfc3JjX3ByaW9yaXR5KCZwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX3N1Yl90ZXJtX2luc3QtPmFwaV9yZXFfc3ViX3Rlcm1faW5mbyk7CisKKyAgICAgICAgQkNNQkFMX09CSl9JTl9QUk9HUkVTU19TRVQoJihwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mbyksIEJDTU9TX1RSVUUpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBTdWJzY3JpYmVyIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZvciBzdWJzY3JpYmVyLXRlcm1pbmFsCisgKiAgICAgICAgYWRtaW4tZG93biBjb21tYW5kIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJIHdoZW4gdGhlIHNwZWNpZmllZAorICogICAgICAgIHN1YnNjcmliZXItdGVybWluYWwgaXMgYWxyZWFkeSBhZG1pbi1kb3duLgorICoKKyAqIEBwYXJhbSBwX3N1Yl90ZXJtX2luc3QgIFBvaW50ZXIgdG8gYW4gc3Vic2NyaWJlciB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGFuIHN1YnNjcmliZXIgdGVybWluYWwgZXZlbnQgc3RydWN0dXJlCisgKiAKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2ZzbV9hZG1pbl9kbl9vayhzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAiUmVjZWl2ZWQgYSBhZG1pbiBET1dOIHJlcXVlc3QgZnJvbSBCQUwgQVBJIC0gcmV0dXJuaW5nIE9LIHRvIHRoZSBBUEkiCisgICAgICAgICAgICAiIC0gbm8gZnVydGhlciBmdW5jdGlvblxuIik7CisKKyAgICBtZ210X21zZ19zZW5kX2JhbGFwaV9pbmQocmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfc3ViX3Rlcm0pOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIHN1YnNjcmliZXIgdGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZm9yIGEgc3Vic2NyaWJlciB0ZXJtaW5hbAorICogICAgICAgIGFkbWluLWRvd24gY29tbWFuZCByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSSB3aGVuIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICBzdWJzY3JpYmVyIHRlcm1pbmFsIEZTTSBpcyBhbHJlYWR5IGluIHRoZSBSRU1PVklORyBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gcF9zdWJfdGVybV9pbnN0ICBQb2ludGVyIHRvIGEgc3Vic2NyaWJlciB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGFuIHN1YnNjcmliZXIgdGVybWluYWwgZXZlbnQgc3RydWN0dXJlCisgKiAKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2ZzbV9hZG1pbl9kbl9lcnJvcihzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX1NUQVRFOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N1Yl90ZXJtLCAKKyAgICAgICAgICAgICJSZWNlaXZlZCBhIGFkbWluIERPV04gcmVxdWVzdCBmcm9tIEJBTCBBUEkgLSByZXR1cm5pbmcgRVJST1IgdG8gdGhlIEFQSSIKKyAgICAgICAgICAgICIgLSBubyBmdXJ0aGVyIGZ1bmN0aW9uXG4iKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBTdWJzY3JpYmVyIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRvIGlnbm9yZSBhIAorICogICAgICAgIHJlY2VpdmVkIG1lc3NhZ2UuCisgKgorICogQHBhcmFtIHBfc3ViX3Rlcm1faW5zdCAgUG9pbnRlciB0byBhbiBzdWJzY3JpYmVyIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gc3Vic2NyaWJlciB0ZXJtaW5hbCBldmVudCBzdHJ1Y3R1cmUKKyAqIAorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gc3ViX3Rlcm1fZnNtX2lnbm9yZV91dGlsX21zZyhzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N1Yl90ZXJtLCAgIklnbm9yaW5nIG1lc3NhZ2UgZnJvbSBCQUwgdXRpbHNcbiIpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSBTdWJzY3JpYmVyIHRlcm1pbmFsIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZ1bmN0aW9uIHRvIHByb2Nlc3MgYW4KKyAqICAgICAgICBBVVRPIElORCBtZXNzYWdlIGZyb20gb25lIG9mIHRoZSBCQUwgYXBwcyB3aGlsZSBpbiB0aGUgTlVMTCBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gcF9zdWJfdGVybV9pbnN0ICBQb2ludGVyIHRvIGFuIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9uZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCBhcHBzLgorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBzdWJzY3JpYmVyIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fbnVsbF9wcm9jZXNzX3V0aWxfYXV0b19tc2coc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICAgICAgICAgIHN1YnNjcmliZXJfdGVybWluYWxfb2JqOworICAgIGJjbWJhbF9zZXJpYWxfbnVtYmVyIHNlcmlhbCA9IHt9OworICAgIGJhbF91dGlsX21zZ19pbmQgKmluZF9tc2c7CisKKyAgICAvKiBQcm9jZXNzIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IG1zZyk7CisgICAgQlVHX09OKE5VTEwgPT0gcF9ldmVudCk7CisKKyAgICBpbmRfbXNnID0gKGJhbF91dGlsX21zZ19pbmQgKiltc2c7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3ViX3Rlcm0sICJSZWNlaXZlZCBhIEFVVE8gSU5EIGluIHRoZSBudWxsIHN0YXRlXG4iKTsKKyAgICAKKyAgICAvKgorICAgICAqIFNldCB0aGUga2V5IGluIHRoZSBzdWJzY3JpYmVyX3Rlcm1pbmFsIG9iamVjdAorICAgICAqLworICAgIEJDTUJBTF9DRkdfSU5JVCgmc3Vic2NyaWJlcl90ZXJtaW5hbF9vYmosIHN1YnNjcmliZXJfdGVybWluYWwsIGluZF9tc2ctPm9ial9rZXkuc3ViX3Rlcm1fa2V5KTsKKyAgICAKKyAgICAgLyoKKyAgICAgKiBTZXQgdGhlIHNlcmlhbCBudW1iZXIgaW4gdGhlIHN1YnNjcmliZXJfdGVybWluYWwgb2JqZWN0CisgICAgICovCisgICAgbWVtY3B5KCZzZXJpYWwsIGluZF9tc2ctPmRhdGEsIHNpemVvZihiY21iYWxfc2VyaWFsX251bWJlcikpOworICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnN1YnNjcmliZXJfdGVybWluYWxfb2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBzZXJpYWxfbnVtYmVyLCBzZXJpYWwpOworCisgICAgLyogQW5kIG1hcmsgaXQncyBzdGF0dXMgYXMgRE9XTiAqLworICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnN1YnNjcmliZXJfdGVybWluYWxfb2JqLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBvcGVyX3N0YXR1cywgQkNNQkFMX1NUQVRVU19ET1dOKTsKKworICAgIC8qCisgICAgICogU2VuZCB0aGUgaW5kaWNhdGlvbiBiYWNrIHRvIHRoZSBCQUwgcHVibGljIEFQSSBoZXJlCisgICAgICovCisgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmc3Vic2NyaWJlcl90ZXJtaW5hbF9vYmouaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfc3ViX3Rlcm0pOworICAgCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIFN1YnNjcmliZXIgdGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gcHJvY2VzcyBhbgorICogICAgICAgIEFVVE8gSU5EIG1lc3NhZ2UgZnJvbSBvbmUgb2YgdGhlIEJBTCBhcHBzIHdoaWxlIGluIHRoZSBDT05GSUdVUklORyBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gcF9zdWJfdGVybV9pbnN0ICBQb2ludGVyIHRvIGFuIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9uZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCBhcHBzLgorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBzdWJzY3JpYmVyIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fY29uZmlndXJpbmdfcHJvY2Vzc191dGlsX21zZyhzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldDsKKyAgICBiYWxfdXRpbF9tc2dfaW5kICppbmRfbXNnOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IHBfc3ViX3Rlcm1faW5zdCk7CisgICAgQlVHX09OKE5VTEwgPT0gbXNnKTsKKyAgICBCVUdfT04oTlVMTCA9PSBwX2V2ZW50KTsKKworICAgIGluZF9tc2cgPSAoYmFsX3V0aWxfbXNnX2luZCAqKW1zZzsKKworICAgIC8qCisgICAgICogTk9URTogQVVUT19JTkQgbWVzc2FnZXMgYXJlIG5vdCBwcm9jZXNzZWQgaW4gdGhpcyBmdW5jdGlvbiwKKyAgICAgKiBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnNpZGVyIHRoZW0gaW4gdGhpcyBsb2dpYy4KKyAgICAgKi8KKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAiIFJlY2VpdmVkIGEgSU5EIG1lc3NhZ2UgZnJvbSBCQUwgVVRJTCAoJXMpIGR1cmluZyBDT05GSUdVUklORyBzdGF0ZVxuIiwKKyAgICAgICAgICAgICBzdWJzeXN0ZW1fc3RyW2JjbWJhbF9zZW5kZXJfZ2V0KG1zZyldKTsKKworICAgIC8qIEhhbmRsZSByZXNwb25zZSAqLworICAgIHJldCA9IGluZF9tc2ctPnN0YXR1czsKKyAgICAKKyAgICBpZihCQ01fRVJSX09LID09IHJldCkKKyAgICB7CisKKyAgICAgICAgLyogSWYgdGhpcyBpbmRpY2F0aW9uIGlzIGZvciBhIHN1YnNjcmliZXIgdGVybWluYWwgdGhhdCBoYXMgYmVlbiBBRERFRCBhbmQgaXMgQURNSU5fVVAsCisgICAgICAgICAqIE9SIGZvciBhIHN1YnNjcmliZXIgdGVybWluYWwgdGhhdCBoYXMgYmVlbiBSRU1PVkVEIGFuZCBpcyBBRE1JTl9ET1dOIAorICAgICAgICAgKiB0aGVuIGNvbXBsZXRlIHRoZSBzdGF0ZSB0cmFuc2l0aW9uLgorICAgICAgICAgKi8KKyAKKyAgICAgICAgaWYoKEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQUREID09IGJjbWJhbF9tc2dfaWRfb3Blcl9nZXQobXNnKSAmJiAKKyAgICAgICAgICAgIEJDTUJBTF9TVEFURV9VUCA9PSBwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mby5kYXRhLmFkbWluX3N0YXRlKSB8fAorICAgICAgICAgICAgKEJBTF9VVElMX09QRVJfU1VCX1RFUk1fUkVNT1ZFID09IGJjbWJhbF9tc2dfaWRfb3Blcl9nZXQobXNnKSAmJgorICAgICAgICAgICAgIEJDTUJBTF9TVEFURV9ET1dOID09IHBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvLmRhdGEuYWRtaW5fc3RhdGUpKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmIChiY21fdG9wb19wb25fZ2V0X3Bvbl9mYW1pbHkocF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8ua2V5LmludGZfaWQpID09IEJDTV9UT1BPX1BPTl9GQU1JTFlfRVBPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCB0dW5uZWxfaWQ7CisKKyAgICAgICAgICAgICAgICAvKiBSZWNvdmVyIHRoZSB0dW5uZWxfaWQgZnJvbSB0aGUgaW5kaWNhdGlvbiBtZXNzYWdlICovCisgICAgICAgICAgICAgICAgbWVtY3B5KCZ0dW5uZWxfaWQsIGluZF9tc2ctPmRhdGEsIHNpemVvZih0dW5uZWxfaWQpKTsKKworICAgICAgICAgICAgICAgIC8qIEFuZCBzdG9yZSBpdCBpbiB0aGUgc3ViX3Rlcm0gaW5zdGFuY2UsIHRvIGJlIHVzZWQgYnkgdGhlIHN3aXRjaCAqLworICAgICAgICAgICAgICAgIHBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvLmRhdGEuc3ZjX3BvcnRfaWQgPSB0dW5uZWxfaWQ7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgcF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8uZGF0YS5vcGVyX3N0YXR1cyA9CisgICAgICAgICAgICAgICAgcF9zdWJfdGVybV9pbnN0LT5hcGlfcmVxX3N1Yl90ZXJtX2luZm8uZGF0YS5vcGVyX3N0YXR1czsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzdWJzY3JpYmVyIHRlcm1pbmFsIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb25maWd1cmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBfc3ViX3Rlcm1faW5zdC0+ZnNtX3N0YXRlID0gU1VCX1RFUk1fRlNNX1NUQVRFX0NPTkZJR1VSRUQ7CisKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVycm9yICovCisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAgICAgIkZhaWxlZCBpbiBzdGF0ZSAlczslc1xuIiwKKyAgICAgICAgICAgICAgICBzdWJfdGVybV9zdGF0ZV9uYW1lX2dldChwX3N1Yl90ZXJtX2luc3QtPmZzbV9zdGF0ZSksCisgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgfQorCisgICAgQkNNQkFMX09CSl9JTl9QUk9HUkVTU19TRVQoJihwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mbyksIEJDTU9TX0ZBTFNFKTsKKworICAgIC8qCisgICAgICogU2VuZCB0aGUgaW5kaWNhdGlvbiBiYWNrIHRvIHRoZSBCQUwgcHVibGljIEFQSSBoZXJlCisgICAgICovCisgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8uaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfc3ViX3Rlcm0pOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIFN1YnNjcmliZXIgdGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gcHJvY2VzcyBhbgorICogICAgICAgIElORCBtZXNzYWdlIGZyb20gb25lIG9mIHRoZSBCQUwgYXBwcyB3aGlsZSBpbiB0aGUgQ09ORklHVVJFRCBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gcF9zdWJfdGVybV9pbnN0ICBQb2ludGVyIHRvIGFuIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9uZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCBhcHBzLgorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBzdWJzY3JpYmVyIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fY29uZmlndXJlZF9wcm9jZXNzX3V0aWxfbXNnKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBQcm9jZXNzIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IHBfc3ViX3Rlcm1faW5zdCk7CisgICAgQlVHX09OKE5VTEwgPT0gbXNnKTsKKyAgICBCVUdfT04oTlVMTCA9PSBwX2V2ZW50KTsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAiIFJlY2VpdmVkIGEgSU5EIG1lc3NhZ2UgZnJvbSBCQUwgVVRJTCAoJXMpIGR1cmluZyBDT05GSUdVUkVEIHN0YXRlXG4iLAorICAgICAgICAgICAgIHN1YnN5c3RlbV9zdHJbYmNtYmFsX3NlbmRlcl9nZXQobXNnKV0pOworCisgICAgaWYoKEJBTF9VVElMX09QRVJfU1VCX1RFUk1fUkVNT1ZFICE9IGJjbWJhbF9tc2dfaWRfb3Blcl9nZXQobXNnKSkgJiYKKyAgICAgICAoQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9DTEVBUiAhPSBiY21iYWxfbXNnX2lkX29wZXJfZ2V0KG1zZykpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N1Yl90ZXJtLCAKKyAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgYW4gdW5yZWNvZ25pemVkIElORCAoJXUpIHJlY2VpdmVkIGluIHRoZSBjb25maWd1cmVkIHN0YXRlIgorICAgICAgICAgICAgICAgICItIG5vIGZ1cnRoZXIgZnVuY3Rpb25cbiIsIGJjbWJhbF9tc2dfaWRfb3Blcl9nZXQobXNnKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisKKworICAgICAgICAvKiBjaGFuZ2Ugc3Vic2NyaWJlciB0ZXJtaW5hbCBzdGF0ZSB0byBDT05GSUdVUklORyAqLworICAgICAgICBwX3N1Yl90ZXJtX2luc3QtPmZzbV9zdGF0ZSA9IFNVQl9URVJNX0ZTTV9TVEFURV9DT05GSUdVUklORzsKKyAKKyAgICAgICAgLyogU2V0IHRoZSBvcGVyX3N0YXR1cyB1cG9uIHN1Y2Nlc3MgKi8KKyAgICAgICAgcF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8uZGF0YS5vcGVyX3N0YXR1cyA9IEJDTUJBTF9TVEFUVVNfTk9UX1BSRVNFTlQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VuZCB0aGUgaW5kaWNhdGlvbiBiYWNrIHRvIHRoZSBCQUwgcHVibGljIEFQSSBoZXJlCisgICAgICAgICAqLworICAgICAgICBtZ210X21zZ19zZW5kX2JhbGFwaV9pbmQocmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvLmhkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfc3ViX3Rlcm0pOworICAgIH0KKyAKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgU3Vic2NyaWJlciB0ZXJtaW5hbCBGU00gc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbiB0byBwcm9jZXNzIGFuCisgKiAgICAgICAgQVVUTyBJTkQgbWVzc2FnZSBmcm9tIG9uZSBvZiB0aGUgQkFMIGFwcHMgd2hpbGUgaW4gdGhlIENPTkZJR1VSRUQgc3RhdGUuCisgKgorICogQHBhcmFtIHBfc3ViX3Rlcm1faW5zdCAgUG9pbnRlciB0byBhbiBzdWJzY3JpYmVyIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBvbmUgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBCQUwgYXBwcy4KKyAqIEBwYXJhbSBwX2V2ZW50ICAgICAgICAgIFBvaW50ZXIgdG8gYW4gc3Vic2NyaWJlciB0ZXJtaW5hbCBldmVudCBzdHJ1Y3R1cmUKKyAqIAorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gc3ViX3Rlcm1fZnNtX2NvbmZpZ3VyaW5nX3Byb2Nlc3NfdXRpbF9hdXRvX21zZyhzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisgICAgLyogUHJvY2VzcyBjaGVja3MgKi8KKyAgICBCVUdfT04oTlVMTCA9PSBwX3N1Yl90ZXJtX2luc3QpOworICAgIEJVR19PTihOVUxMID09IG1zZyk7CisgICAgQlVHX09OKE5VTEwgPT0gcF9ldmVudCk7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3ViX3Rlcm0sIAorICAgICAgICAgICAgIiBSZWNlaXZlZCBhIEFVVE8gSU5EIG1lc3NhZ2UgZnJvbSBCQUwgVVRJTCAoJXMpIGR1cmluZyBDT05GSUdVUklORyBzdGF0ZVxuIiwKKyAgICAgICAgICAgICBzdWJzeXN0ZW1fc3RyW2JjbWJhbF9zZW5kZXJfZ2V0KG1zZyldKTsKKworICAgIGlmKEJBTF9VVElMX09QRVJfU1VCX1RFUk1fRElTQ09WRVJZICE9IGJjbWJhbF9tc2dfaWRfb3Blcl9nZXQobXNnKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAgICAgIlJlY2VpdmVkIGFuIHVucmVjb2duaXplZCBBVVRPIElORCBpbiB0aGUgY29uZmlndXJpbmcgc3RhdGUiCisgICAgICAgICAgICAgICAgIi0gbm8gZnVydGhlciBmdW5jdGlvblxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8q4oCTIENvcmUgY2FsbHMgTWFjIFV0aWxzIHRvIHNldCB0aGUgc3Vic2NyaWJlci10ZXJtaW5hbCBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBhcHBsaWNhYmxlIFNESyBjYWxscyAgICovCisgICAgICAgIC8qIHNlbmQgVFJVRSBpbiBsYXN0IGFyZ3VtZW50IHRvIGluZGljYXRlIHRoZSByZXF1ZXN0IGlzIGFmdGVyIGEgT05VIERpc2NvdmVyeSAqLworICAgICAgICByZXQgPSBtYWNfdXRpbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3NldChwX3N1Yl90ZXJtX2luc3QsIEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQURELCBCQ01PU19UUlVFKTsKKyAgICB9CisgICAgCisgICAgLyogSWYgdGhlcmUgd2VyZSBlcnJvcnMgZHVyaW5nIHByb2Nlc3NpbmcsIHRoZW4gcmVwb3J0IHRoZSBlcnJvciB0byB0aGUgQVBJICovCisgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgeworCisgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mby5oZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2lkX3N1Yl90ZXJtKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIFN1YnNjcmliZXIgdGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gcHJvY2VzcyBhCisgKiAgICAgICAgbWVzc2FnZSBmcm9tIG9uZSBvZiB0aGUgQkFMIGFwcHMgd2hpbGUgaW4gdGhlIFJFTU9WSU5HIHN0YXRlLgorICoKKyAqIEBwYXJhbSBwX3N1Yl90ZXJtX2luc3QgIFBvaW50ZXIgdG8gYW4gc3Vic2NyaWJlciB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gb25lIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQkFMIGFwcHMuCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGFuIHN1YnNjcmliZXIgdGVybWluYWwgZXZlbnQgc3RydWN0dXJlCisgKiAKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX2ZzbV9yZW1vdmluZ19wcm9jZXNzX3V0aWxfbXNnKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0OworICAgIGJhbF91dGlsX21zZ19pbmQgKmluZF9tc2c7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKE5VTEwgPT0gcF9zdWJfdGVybV9pbnN0KTsKKyAgICBCVUdfT04oTlVMTCA9PSBtc2cpOworICAgIEJVR19PTihOVUxMID09IHBfZXZlbnQpOworCisgICAgaW5kX21zZyA9IChiYWxfdXRpbF9tc2dfaW5kICopbXNnOworCisgICAgLyoKKyAgICAgKiBOT1RFOiBBVVRPX0lORCBtZXNzYWdlcyBhcmUgbm90IHByb2Nlc3NlZCBpbiB0aGlzIGZ1bmN0aW9uLAorICAgICAqIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29uc2lkZXIgdGhlbSBpbiB0aGlzIGxvZ2ljLgorICAgICAqLworCisgICAgLyogSGFuZGxlIGluZGljYXRpb24gKi8KKyAgICByZXQgPSBpbmRfbXNnLT5zdGF0dXM7CisKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAiUmVjZWl2ZWQgYSAlcyBtZXNzYWdlIGZyb20gQkFMIEFQUCAoJXMpIGR1cmluZyBSRU1PVklORyBzdGF0ZVxuIiwKKyAgICAgICAgICAgIChCQUxfTVNHX1RZUEVfSU5EID09IGJjbWJhbF90eXBlX21pbm9yX2dldChtc2cpKSA/ICJJTkQiIDogIlJTUCIsCisgICAgICAgICAgICBzdWJzeXN0ZW1fc3RyW2JjbWJhbF9zZW5kZXJfZ2V0KG1zZyldKTsKKworICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgIHsKKyAgICAgICAgLyogU2V0IHRoZSBhZG1pbl9zdGF0ZSBhbmQgb3Blcl9zdGF0dXMgdG8gYmUgRE9XTiBhbmQgTk9UX1BSRVNFTlQgcmVzcGVjdGl2ZWx5LCAKKyAgICAgICAgICogc2luY2Ugd2UgYXJlIGNsZWFyaW5nIHRoaXMgb2JqZWN0IGFueXdheS4gIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHNldCBpbiB0aGUgZnJlZSBmdW5jdGlvbiwKKyAgICAgICAgICogYnV0IHRoZXkgbmVlZCB0byBiZSBzZXQgaGVyZSBmb3IgdGhlIGluZGljYXRpb24gYmVsb3cgdG8gYmUgY29ycmVjdCAqLworICAgICAgICBwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mby5kYXRhLmFkbWluX3N0YXRlID0gQkNNQkFMX1NUQVRFX0RPV047CisgICAgICAgIHBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvLmRhdGEub3Blcl9zdGF0dXMgPSBCQ01CQUxfU1RBVFVTX05PVF9QUkVTRU5UOworICAgIH0KKworICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgIHsKKworICAgICAgICAvKiBSZW1vdmUgdGhpcyBzdWJzY3JpYmVyX3Rlcm1pbmFsIGZyb20gdGhlIGxpc3Qgb2Ygc3Vic2NyaWJlcl90ZXJtaW5hbHMgYXNzb2NpYXRlZCB3aXRoIGl0J3MgaW50ZXJmYWNlICovCisgICAgICAgIGJjbWJhbF9pbnRlcmZhY2Vfc3ViX3Rlcm1fbGlzdF9lbnRyeV9yZW1vdmUocF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8ua2V5KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZW5kIHRoZSBzdWNjZXNzIGluZGljYXRpb24gYmFjayB0byB0aGUgQkFMIHB1YmxpYyBBUEkgaGVyZQorICAgICAgICAgKi8KKyAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mby5oZHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2lkX3N1Yl90ZXJtKTsKKworICAgICAgICAvKiBSZXR1cm4gdGhlIHN1YnNjcmliZXIgdGVybWluYWwgdG8gdGhlIGZyZWUgcG9vbCAqLworICAgICAgICBzdWJfdGVybV9mcmVlX2J5X2VudHJ5KHBfc3ViX3Rlcm1faW5zdCk7CisKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N1Yl90ZXJtLCAic3ViIHRlcm0gZnJlZWRcbiIpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBfc3ViX3Rlcm1faW5zdC0+ZnNtX3N0YXRlID0gU1VCX1RFUk1fRlNNX1NUQVRFX0NPTkZJR1VSRUQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VuZCB0aGUgZmFpbHVyZSBpbmRpY2F0aW9uIGJhY2sgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGhlcmUKKyAgICAgICAgICovCisgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8uaGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19pZF9zdWJfdGVybSk7CisKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N1Yl90ZXJtLCAKKyAgICAgICAgICAgICAgICAiRXJyb3IgZW5jb3VudGVyZWQgaW4gUkVNT1ZJTkcgc3RhdGUgKHN0YXR1cyBpcyAlcylcbiIsCisgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmV0KSk7ICAgICAgCisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIFN1YnNjcmliZXIgdGVybWluYWwgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gdG8gcHJvY2VzcyBhbgorICogICAgICAgIEFVVE8gSU5EIG1lc3NhZ2UgZnJvbSBvbmUgb2YgdGhlIEJBTCBhcHBzIHdoaWxlIGluIHRoZSBSRU1PVklORyBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gcF9zdWJfdGVybV9pbnN0ICBQb2ludGVyIHRvIGFuIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9uZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCBhcHBzLgorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBzdWJzY3JpYmVyIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fcmVtb3ZpbmdfcHJvY2Vzc191dGlsX2F1dG9fbXNnKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IHBfc3ViX3Rlcm1faW5zdCk7CisgICAgQlVHX09OKE5VTEwgPT0gbXNnKTsKKyAgICBCVUdfT04oTlVMTCA9PSBwX2V2ZW50KTsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAiUmVjZWl2ZWQgYSBBVVRPIElORCBpbiB0aGUgcmVtb3Zpbmcgc3RhdGUiCisgICAgICAgICAgICAiIC0gbm8gZnVydGhlciBmdW5jdGlvblxuIik7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgU3Vic2NyaWJlciB0ZXJtaW5hbCBGU00gZnVuY3Rpb24gd2hpY2ggaXMgZXhlY3V0ZWQgd2hlbiBhbiBlcnJvciAKKyAqICAgICAgICBpcyBlbmNvdW50ZXJlZCBkdXJpbmcgRlNNIHByb2Nlc3NpbmcuCisgKgorICogQHBhcmFtIHBfc3ViX3Rlcm1faW5zdCAgUG9pbnRlciB0byBhbiBzdWJzY3JpYmVyIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gbXNnICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBvbmUgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBCQUwgYXBwcworICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhbiBzdWJzY3JpYmVyIHRlcm1pbmFsIGV2ZW50IHN0cnVjdHVyZQorICogCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mc21fc3RhdGVfZXJyKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfSU5WQUxJRF9PUDsKKworICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAiRXJyb3IgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBTVUJfVEVSTSBGU00gLSBCQUQgRVZFTlQgKClcbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCisvKgorICogSGVscGVyIGZ1bmN0aW9ucworICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gcmV0cmlldmUgYSBzdWJzY3JpYmVyLXRlcm1pbmFsIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICBjbGFzcy4KKyAqCisgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBrZXkgb2YgdGhlIHN1YnNjcmliZXItdGVybWluYWwgYmVpbmcgCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZAorICogQHBhcmFtIHNlYXJjaF9mbGFnICAgIEEgZmxhZyBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIHN1YnNjcmliZXItdGVybWluYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSB0byBiZSByZXRyaWV2ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQHJldHVybnMgc3ViX3Rlcm1faW5zdF90KiAgQSBwb2ludGVyIHRvIHRoZSBmb3VuZCBzdWJzY3JpYmVyLXRlcm1pbmFsIGluc3RhbmNlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiBvbmUgaXMgbm90IGZvdW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdWJfdGVybV9pbnN0ICpzdWJfdGVybV9pbnN0X2dldChiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgKmtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9mbGFnIHNlYXJjaF9mbGFnKQoreworICAgIHN1Yl90ZXJtX2luc3QgKmN1cnJlbnRfZW50cnkgPSBOVUxMOworICAgIHN1Yl90ZXJtX2luc3QgKnBfdGVtcF9lbnRyeTsKKworICAgIC8qCisgICAgICogRmlyc3QsIGNoZWNrIHRoZSBhY3RpdmUgbGlzdAorICAgICAqLworICAgIFRBSUxRX0ZPUkVBQ0goY3VycmVudF9lbnRyeSwgCisgICAgICAgICAgICAgICAgICAmU1VCX1RFUk1fRlNNX1NVQl9URVJNX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX3N1Yl90ZXJtX2xpc3QsIAorICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1faW5zdF9uZXh0KQorICAgIHsKKyAgICAgICAgaWYoKGN1cnJlbnRfZW50cnktPmFwaV9yZXFfc3ViX3Rlcm1faW5mby5rZXkuc3ViX3Rlcm1faWQgPT0ga2V5LT5zdWJfdGVybV9pZCkgJiYKKyAgICAgICAgICAgKGN1cnJlbnRfZW50cnktPmFwaV9yZXFfc3ViX3Rlcm1faW5mby5rZXkuaW50Zl9pZCA9PSBrZXktPmludGZfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgc3ViX3Rlcm0gaW5zdGFuY2UgcG9pbnRlciBpcyBpbiBjdXJyZW50X2VudHJ5ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAKKworICAgIGlmKChTVUJfVEVSTV9GTEFHX0FOWSA9PSBzZWFyY2hfZmxhZykgJiYgKE5VTEwgPT0gY3VycmVudF9lbnRyeSkpCisgICAgeworICAgICAgICAvKiBOb3cgY2hlY2sgdGhlIGZyZWUgbGlzdCAqLworICAgICAgICBUQUlMUV9GT1JFQUNIX1NBRkUoY3VycmVudF9lbnRyeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmU1VCX1RFUk1fRlNNX1NVQl9URVJNX0xJU1RfQ1RYX1BUUi0+ZnJlZV9zdWJfdGVybV9saXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2luc3RfbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGVtcF9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGZyZWUgbGlzdCAqLworICAgICAgICAgICAgVEFJTFFfUkVNT1ZFKCZTVUJfVEVSTV9GU01fU1VCX1RFUk1fTElTVF9DVFhfUFRSLT5mcmVlX3N1Yl90ZXJtX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9lbnRyeSwgc3ViX3Rlcm1faW5zdF9uZXh0KTsKKworICAgICAgICAgICAgLyogQW5kIGFkZCBpdCB0byB0aGUgYWN0aXZlIGxpc3QgKi8KKyAgICAgICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZTVUJfVEVSTV9GU01fU1VCX1RFUk1fTElTVF9DVFhfUFRSLT5hY3RpdmVfc3ViX3Rlcm1fbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2VudHJ5LCBzdWJfdGVybV9pbnN0X25leHQpOworIAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEluaXRpYWxpemUgdGhlIHN1Yl90ZXJtIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY3VycmVudF9lbnRyeS0+ZnNtX3N0YXRlID0gU1VCX1RFUk1fRlNNX1NUQVRFX05VTEw7CisgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihOVUxMID09IGN1cnJlbnRfZW50cnkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBBIHN1Yl90ZXJtIHdhcyBub3QgZm91bmQgb24gZWl0aGVyIGxpc3QqLworCisgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zdWJfdGVybSwgIm5vIHN1Yl90ZXJtIGZvdW5kXG4iKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGN1cnJlbnRfZW50cnk7Cit9CisKK2JjbW9zX2Vycm5vIHN1Yl90ZXJtX3N2Y19wb3J0X2lkX2dldChiY21iYWxfc3ViX2lkIHN1Yl90ZXJtX2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBhY2Nlc3NfaW50X2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkICpwX3N2Y19wb3J0X2lkKQoreworICAgIHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdDsKKyAgICBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgc3ViX3Rlcm1fa2V5OworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBCVUdfT04oTlVMTCA9PSBwX3N2Y19wb3J0X2lkKTsKKworICAgIC8qIENyZWF0ZSB0aGUga2V5IHRvIGZpbmQgdGhlIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2UgYmVpbmcgcmVmZXJlbmNlZCAqLworICAgIHN1Yl90ZXJtX2tleS5zdWJfdGVybV9pZCA9IHN1Yl90ZXJtX2lkOworICAgIHN1Yl90ZXJtX2tleS5pbnRmX2lkID0gYWNjZXNzX2ludF9pZDsKKworICAgIGlmKE5VTEwgPT0gKHBfc3ViX3Rlcm1faW5zdCA9IHN1Yl90ZXJtX2luc3RfZ2V0KCZzdWJfdGVybV9rZXksIFNVQl9URVJNX0ZMQUdfQUNUSVZFKSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3ViX3Rlcm0sICJTcGVjaWZpZWQgc3ViX3Rlcm0gKHN1YjolZCBvbiBpbnQ6JWQpIG5vdCBmb3VuZFxuIiwKKyAgICAgICAgICAgICAgICBzdWJfdGVybV9pZCwgYWNjZXNzX2ludF9pZCk7CisgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwX3N2Y19wb3J0X2lkID0gcF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8uZGF0YS5zdmNfcG9ydF9pZDsKKyAgICB9CisgICAgICAgIAorICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gZnJlZSBhIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2Ugc3BlY2lmaWVkCisgKiAgICAgICAgYnkgYSB0aGUgc3VwcGxpZWQgZW50cnkgcG9pbnRlci4KKyAqCisgKiBAcGFyYW0gcF9lbnRyeSBBIHBvaW50ZXIgdG8gdGhlIGVudHJ5IHRvIGJlIGZyZWVkCisgKiAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBAcmV0dXJucyBiY21vc19lcnJubyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBzdWJfdGVybV9mcmVlX2J5X2VudHJ5KHN1Yl90ZXJtX2luc3QgKnBfZW50cnkpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBzdWJfdGVybV9pbnN0ICpjdXJyZW50X2VudHJ5OworICAgIHN1Yl90ZXJtX2luc3QgKnBfdGVtcF9lbnRyeTsKKworICAgIEJVR19PTihOVUxMID09IHBfZW50cnkpOworCisgICAgLyoKKyAgICAgKiBGaXJzdCwgY2hlY2sgdGhlIGFjdGl2ZSBsaXN0IChhbiBhY3RpdmUgc3ViX3Rlcm0gY2FuIGJlIGluIHRoZSBhZGRpbmcgb3IgcmVtb3Zpbmcgc3RhdGUpCisgICAgICovCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksIAorICAgICAgICAgICAgICAgICAgICAgICAmU1VCX1RFUk1fRlNNX1NVQl9URVJNX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX3N1Yl90ZXJtX2xpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9pbnN0X25leHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBfdGVtcF9lbnRyeSkKKyAgICB7CisgICAgICAgIGlmKGN1cnJlbnRfZW50cnkgPT0gcF9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgICAgICAgICBUQUlMUV9SRU1PVkUoJlNVQl9URVJNX0ZTTV9TVUJfVEVSTV9MSVNUX0NUWF9QVFItPmFjdGl2ZV9zdWJfdGVybV9saXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2VudHJ5LCBzdWJfdGVybV9pbnN0X25leHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgc3ZjX3BvcnRfaWQgYW5kIGFnZ19wb3J0X2lkIGxpc3RzICovCisgICAgcF9lbnRyeS0+bnVtX3N2Y19wb3J0X2lkcyA9IDA7CisgICAgVEFJTFFfSU5JVCgmcF9lbnRyeS0+c3ZjX3BvcnRfaWRfbGlzdCk7CisgICAgIAorICAgIHBfZW50cnktPm51bV9hZ2dfcG9ydF9pZHMgPSAwOworICAgIFRBSUxRX0lOSVQoJnBfZW50cnktPmFnZ19wb3J0X2lkX2xpc3QpOworCisgICAgLyogQW5kIGFkZCB0aGUgZW50cnkgdG8gdGhlIGZyZWUgbGlzdCAqLworICAgIHBfZW50cnktPmZzbV9zdGF0ZSA9IFNVQl9URVJNX0ZTTV9TVEFURV9OVUxMOworCisgICAgLyogQW5kIGluaXRpYWxpemUgdGhlIGN1cnJlbnQgb2JqZWN0IGluIHRoZSBzdWJfdGVybSBpbnN0YW5jZSAqLworICAgIHN1Yl90ZXJtX2luc3RfZW50cnlfb2JqX2luaXQocF9lbnRyeSk7CisgICAgCisgICAgVEFJTFFfSU5TRVJUX1RBSUwoJlNVQl9URVJNX0ZTTV9TVUJfVEVSTV9MSVNUX0NUWF9QVFItPmZyZWVfc3ViX3Rlcm1fbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgcF9lbnRyeSwgc3ViX3Rlcm1faW5zdF9uZXh0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbWJhbF9zdWJfdGVybV9zdmNfcG9ydF9pZF9saXN0X2VudHJ5X2FkZChzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCBzdmNfcG9ydF9pZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIHN2Y19wb3J0X2lkX2VudHJ5ICpjdXJyZW50X2VudHJ5OworCisgICAgZG8KKyAgICB7CisgICAgICAgIGlmKE5VTEwgPT0gcF9zdWJfdGVybV9pbnN0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3ViX3Rlcm0sIAorICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGluZyB0byBhZGQgYSBzdmNfcG9ydF9pZCAoJXUpIGVudHJ5ICIKKyAgICAgICAgICAgICAgICAgICAgInRvIE5VTEwgc3Vic2NyaWJlciB0ZXJtaW5hbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc3ZjX3BvcnRfaWQpOworCisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBpZiB0aGUgaWQgaXMgYWxyZWFkeSBvbiB0aGUgbGlzdCBiZWZvcmUgYWRkaW5nIGl0ICovCisgICAgICAgIFRBSUxRX0ZPUkVBQ0goY3VycmVudF9lbnRyeSwgCisgICAgICAgICAgICAgICAgICAgICAgJnBfc3ViX3Rlcm1faW5zdC0+c3ZjX3BvcnRfaWRfbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgbmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY3VycmVudF9lbnRyeS0+c3ZjX3BvcnRfaWQgPT0gc3ZjX3BvcnRfaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9BTFJFQURZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBHZXQgYSBuZXcgZW50cnkgYW5kIGNvbmZpZ3VyZSBpdCAqLworICAgICAgICAgICAgY3VycmVudF9lbnRyeSA9IGJjbW9zX2NhbGxvYyhzaXplb2Yoc3ZjX3BvcnRfaWRfZW50cnkpKTsKKyAKKyAgICAgICAgICAgIGlmIChOVUxMID09IGN1cnJlbnRfZW50cnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N1Yl90ZXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1lbW9yeSBhdmFpbGFibGVcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgCisgICAgICAgICAgICBjdXJyZW50X2VudHJ5LT5zdmNfcG9ydF9pZCA9IHN2Y19wb3J0X2lkOworIAorICAgICAgICAgICAgLyogU2F2ZSB0aGUgZW50cnkgb24gdGhlIGxpc3Qgb2Ygc3Vic2NyaWJlci10ZXJtaW5hbCBpZHMgb24gdGhpcyBpbnRlcmZhY2UgKi8KKyAgICAgICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZwX3N1Yl90ZXJtX2luc3QtPnN2Y19wb3J0X2lkX2xpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9lbnRyeSwgbmV4dCk7CisKKyAgICAgICAgICAgIChwX3N1Yl90ZXJtX2luc3QtPm51bV9zdmNfcG9ydF9pZHMpKys7CisgICAgICAgIH0KKyAgCisgICAgICAgIGN1cnJlbnRfZW50cnktPnJlZl9jb3VudCsrOworCisgICAgfSB3aGlsZSAoMCk7CisKKyAgICByZXR1cm4gcmV0OworCit9CisKK2JjbW9zX2Vycm5vIGJjbWJhbF9zdWJfdGVybV9zdmNfcG9ydF9pZF9saXN0X2VudHJ5X3JlbW92ZShzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCBzdmNfcG9ydF9pZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX05PRU5UOworICAgIHN2Y19wb3J0X2lkX2VudHJ5ICpjdXJyZW50X2VudHJ5LCAqcF90ZW1wX2VudHJ5OworICAgICAKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYoTlVMTCA9PSBwX3N1Yl90ZXJtX2luc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIHJlbW92ZSBhIHN2Y19wb3J0X2lkICgldSkgZW50cnkgIgorICAgICAgICAgICAgICAgICAgICAiZnJvbSBhIE5VTEwgc3Vic2NyaWJlciB0ZXJtaW5hbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc3ZjX3BvcnRfaWQpOworCisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBpZiB0aGUgaWQgaXMgb24gdGhlIGxpc3QgKi8KKyAgICAgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfc3ViX3Rlcm1faW5zdC0+c3ZjX3BvcnRfaWRfbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90ZW1wX2VudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBpZihjdXJyZW50X2VudHJ5LT5zdmNfcG9ydF9pZCA9PSBzdmNfcG9ydF9pZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigwID09IC0tY3VycmVudF9lbnRyeS0+cmVmX2NvdW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgYWdnX3BvcnRfaWRzIG9uIHRoaXMgc3Vic2NyaWJlciB0ZXJtaW5hbCAqLworICAgICAgICAgICAgICAgICAgICBUQUlMUV9SRU1PVkUoJnBfc3ViX3Rlcm1faW5zdC0+c3ZjX3BvcnRfaWRfbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2VudHJ5LCBuZXh0KTsKKworICAgICAgICAgICAgICAgICAgICBiY21vc19mcmVlKGN1cnJlbnRfZW50cnkpOworCisgICAgICAgICAgICAgICAgICAgIChwX3N1Yl90ZXJtX2luc3QtPm51bV9zdmNfcG9ydF9pZHMpLS07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gICAgICAgCisgICAgICAgIH0KKyAgICB9IHdoaWxlICgwKTsKKyAKKyAgICByZXR1cm4gcmV0OworfQorCitiY21vc19lcnJubyBiY21iYWxfc3ViX3Rlcm1fYWdnX3BvcnRfaWRfbGlzdF9lbnRyeV9hZGQoIHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBhZ2dfcG9ydF9pZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGFnZ19wb3J0X2lkX2VudHJ5ICpjdXJyZW50X2VudHJ5OworCisgICAgZG8KKyAgICB7CisgICAgICAgIGlmKE5VTEwgPT0gcF9zdWJfdGVybV9pbnN0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3ViX3Rlcm0sIAorICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGluZyB0byBhZGQgYSBzdmNfcG9ydF9pZCAoJXUpIGVudHJ5ICIKKyAgICAgICAgICAgICAgICAgICAgInRvIGEgTlVMTCBzdWJzY3JpYmVyIHRlcm1pbmFsXG4iLAorICAgICAgICAgICAgICAgICAgICBhZ2dfcG9ydF9pZCk7CisKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGlmIHRoZSBpZCBpcyBhbHJlYWR5IG9uIHRoZSBsaXN0IGJlZm9yZSBhZGRpbmcgaXQgKi8KKyAgICAgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X2VudHJ5LCAKKyAgICAgICAgICAgICAgICAgICAgICAmcF9zdWJfdGVybV9pbnN0LT5hZ2dfcG9ydF9pZF9saXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICBuZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihjdXJyZW50X2VudHJ5LT5hZ2dfcG9ydF9pZCA9PSBhZ2dfcG9ydF9pZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSAgQkNNX0VSUl9BTFJFQURZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBHZXQgYSBuZXcgZW50cnkgYW5kIGNvbmZpZ3VyZSBpdCAqLworICAgICAgICAgICAgY3VycmVudF9lbnRyeSA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYWdnX3BvcnRfaWRfZW50cnkpKTsKKworICAgICAgICAgICAgaWYgKE5VTEwgPT0gY3VycmVudF9lbnRyeSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3ViX3Rlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbWVtb3J5IGF2YWlsYWJsZVxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VycmVudF9lbnRyeS0+YWdnX3BvcnRfaWQgPSBhZ2dfcG9ydF9pZDsKKyAKKyAgICAgICAgICAgIC8qIFNhdmUgdGhlIGVudHJ5IG9uIHRoZSBsaXN0IG9mIHN1YnNjcmliZXItdGVybWluYWwgaWRzIG9uIHRoaXMgaW50ZXJmYWNlICovCisgICAgICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmcF9zdWJfdGVybV9pbnN0LT5hZ2dfcG9ydF9pZF9saXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZW50cnksIG5leHQpOworCisgICAgICAgICAgICAocF9zdWJfdGVybV9pbnN0LT5udW1fYWdnX3BvcnRfaWRzKSsrOworICAgICAgICB9CisKKyAgICAgICAgKGN1cnJlbnRfZW50cnktPnJlZl9jb3VudCkrKzsKKworICAgIH0gd2hpbGUgKDApOworCisgICAgcmV0dXJuIHJldDsKKworfQorCitiY21vc19lcnJubyBiY21iYWxfc3ViX3Rlcm1fYWdnX3BvcnRfaWRfbGlzdF9lbnRyeV9yZW1vdmUoc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkIGFnZ19wb3J0X2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgYWdnX3BvcnRfaWRfZW50cnkgKmN1cnJlbnRfZW50cnksICpwX3RlbXBfZW50cnk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYoTlVMTCA9PSBwX3N1Yl90ZXJtX2luc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0aW5nIHRvIHJlbW92ZSBhIGFnZ19wb3J0X2lkICgldSkgZW50cnkgIgorICAgICAgICAgICAgICAgICAgICAiZnJvbSBhIE5VTEwgc3Vic2NyaWJlciB0ZXJtaW5hbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgYWdnX3BvcnRfaWQpOworCisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBpZiB0aGUgaWQgaXMgb24gdGhlIGxpc3QgKi8KKyAgICAgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfc3ViX3Rlcm1faW5zdC0+YWdnX3BvcnRfaWRfbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90ZW1wX2VudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBpZihjdXJyZW50X2VudHJ5LT5hZ2dfcG9ydF9pZCA9PSBhZ2dfcG9ydF9pZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigwID09IC0tY3VycmVudF9lbnRyeS0+cmVmX2NvdW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qgb2YgYWdnX3BvcnRfaWRzIG9uIHRoaXMgc3Vic2NyaWJlciB0ZXJtaW5hbCAqLworICAgICAgICAgICAgICAgICAgICBUQUlMUV9SRU1PVkUoJnBfc3ViX3Rlcm1faW5zdC0+YWdnX3BvcnRfaWRfbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2VudHJ5LCBuZXh0KTsKKworICAgICAgICAgICAgICAgICAgICBiY21vc19mcmVlKGN1cnJlbnRfZW50cnkpOworCisgICAgICAgICAgICAgICAgICAgIChwX3N1Yl90ZXJtX2luc3QtPm51bV9hZ2dfcG9ydF9pZHMpLS07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gICAgICAgCisgICAgICAgIH0KKyAgICB9IHdoaWxlICgwKTsKKyAKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gc3ZjX3BvcnRfaWRfbGlzdF9maWxsKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91OCAqc3ZjX3BvcnRfaWRfbGlzdCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIHN2Y19wb3J0X2lkX2VudHJ5ICpjdXJyZW50X2VudHJ5ID0gTlVMTDsKKyAgICBpbnQgaWkgPSAwOyAKKworICAgIGRvCisgICAgeworICAgICAgICAvKiBUcmF2ZXJzZSB0aGUgbGlzdCBvZiBzdmNfcG9ydF9pZHMgcmVjb3JkZWQgYW5kIGZpbGwgaW4gdGhlIGxpc3QgdG8gYmUgcmV0dXJuZWQgKi8KKyAgICAgICAgc3ZjX3BvcnRfaWRfbGlzdC0+bGVuID0gcF9zdWJfdGVybV9pbnN0LT5udW1fc3ZjX3BvcnRfaWRzOworICAgICAgICBzdmNfcG9ydF9pZF9saXN0LT52YWwgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQpICogc3ZjX3BvcnRfaWRfbGlzdC0+bGVuKTsKKworICAgICAgICBpZiAoTlVMTCA9PSBzdmNfcG9ydF9pZF9saXN0LT52YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwKKyAgICAgICAgICAgICAgICAgICAgIk5vIG1lbW9yeSBhdmFpbGFibGVcbiIpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X2VudHJ5LCAKKyAgICAgICAgICAgICAgICAgICAgICAmcF9zdWJfdGVybV9pbnN0LT5zdmNfcG9ydF9pZF9saXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICBuZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBzdmNfcG9ydF9pZF9saXN0LT52YWxbaWkrK10gPSBjdXJyZW50X2VudHJ5LT5zdmNfcG9ydF9pZDsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYWdnX3BvcnRfaWRfbGlzdF9maWxsKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdTggKmFnZ19wb3J0X2lkX2xpc3QpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBhZ2dfcG9ydF9pZF9lbnRyeSAqY3VycmVudF9lbnRyeSA9IE5VTEw7CisgICAgaW50IGlpID0gMDsgCisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogVHJhdmVyc2UgdGhlIGxpc3Qgb2Ygc3ZjX3BvcnRfaWRzIHJlY29yZGVkIGFuZCBmaWxsIGluIHRoZSBsaXN0IHRvIGJlIHJldHVybmVkICovCisgICAgICAgIGFnZ19wb3J0X2lkX2xpc3QtPmxlbiA9IHBfc3ViX3Rlcm1faW5zdC0+bnVtX2FnZ19wb3J0X2lkczsKKyAgICAgICAgYWdnX3BvcnRfaWRfbGlzdC0+dmFsID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCkgKiBhZ2dfcG9ydF9pZF9saXN0LT5sZW4pOworCisgICAgICAgIGlmIChOVUxMID09IGFnZ19wb3J0X2lkX2xpc3QtPnZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N1Yl90ZXJtLAorICAgICAgICAgICAgICAgICAgICAiTm8gbWVtb3J5IGF2YWlsYWJsZVxuIik7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBUQUlMUV9GT1JFQUNIKGN1cnJlbnRfZW50cnksIAorICAgICAgICAgICAgICAgICAgICAgICZwX3N1Yl90ZXJtX2luc3QtPmFnZ19wb3J0X2lkX2xpc3QsIAorICAgICAgICAgICAgICAgICAgICAgIG5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFnZ19wb3J0X2lkX2xpc3QtPnZhbFtpaSsrXSA9IGN1cnJlbnRfZW50cnktPmFnZ19wb3J0X2lkOworICAgICAgICB9CisKKyAgICB9IHdoaWxlICgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbWJhbF9zdWJfdGVybV9jaGVja19zdmNfcG9ydF9pbl91c2Uoc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkIHN2Y19wb3J0X2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgc3ZjX3BvcnRfaWRfZW50cnkgKmN1cnJlbnRfZW50cnkgPSBOVUxMOworICAgIAorICAgIGRvCisgICAgeworICAgICAgICBpZihOVUxMID09IHBfc3ViX3Rlcm1faW5zdCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N1Yl90ZXJtLCAKKyAgICAgICAgICAgICAgICAgICAgIk5VTEwgc3Vic2NyaWJlciB0ZXJtaW5hbFxuIik7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGlkIGlzIG9uIHRoZSBsaXN0ICovCisgICAgICAgIFRBSUxRX0ZPUkVBQ0goY3VycmVudF9lbnRyeSwgCisgICAgICAgICAgICAgICAgICAgICAgJnBfc3ViX3Rlcm1faW5zdC0+c3ZjX3BvcnRfaWRfbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgbmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY3VycmVudF9lbnRyeS0+c3ZjX3BvcnRfaWQgPT0gc3ZjX3BvcnRfaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKDApOworCisgICAgcmV0dXJuIHJldDsKK30KKyAgIAorYmNtb3NfZXJybm8gYmNtYmFsX3N1Yl90ZXJtX2NoZWNrX2FnZ19wb3J0X2luX3VzZShzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkIGFnZ19wb3J0X2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgYWdnX3BvcnRfaWRfZW50cnkgKmN1cnJlbnRfZW50cnkgPSBOVUxMOworICAgIAorICAgIGRvCisgICAgeworICAgICAgICBpZihOVUxMID09IHBfc3ViX3Rlcm1faW5zdCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N1Yl90ZXJtLCAKKyAgICAgICAgICAgICAgICAgICAgIk5VTEwgc3Vic2NyaWJlciB0ZXJtaW5hbFxuIik7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGlkIGlzIG9uIHRoZSBsaXN0ICovCisgICAgICAgIFRBSUxRX0ZPUkVBQ0goY3VycmVudF9lbnRyeSwgCisgICAgICAgICAgICAgICAgICAgICAgJnBfc3ViX3Rlcm1faW5zdC0+YWdnX3BvcnRfaWRfbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgbmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY3VycmVudF9lbnRyeS0+YWdnX3BvcnRfaWQgPT0gYWdnX3BvcnRfaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKDApOworCisgICAgcmV0dXJuIHJldDsKK30KKyAgICAKKworCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX3N1Yl90ZXJtX3RtX3NjaGVkc19zZXQoY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpwX3N1Yl90ZXJtX2NmZykKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJjbWJhbF90bV9zY2hlZF9rZXkgdG1fc2NoZWRfa2V5OworICAgIAorICAgIGRvCisgICAgeworICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfc3ViX3Rlcm1fY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCB1c190bSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtX3NjaGVkX2tleS5kaXIgPSBCQ01CQUxfVE1fU0NIRURfRElSX1VTOworICAgICAgICAgICAgdG1fc2NoZWRfa2V5LmlkID0gcF9zdWJfdGVybV9jZmctPmRhdGEudXNfdG07CisgICAgICAgICAgICBpZihCQ01fRVJSX09LIT0gKHJldCA9IGJjbWJhbF90bV9zY2hlZF9zZXRfc3ViX3Rlcm1fb3duZXIodG1fc2NoZWRfa2V5LCBwX3N1Yl90ZXJtX2NmZykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHN1YiB0ZXJtIHVzX3RtLCByZXQgPSAlcyIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9zdWJfdGVybV9jZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIGRzX3RtKSkKKyAgICAgICAgewkJCisgICAgICAgICAgICB0bV9zY2hlZF9rZXkuZGlyID0gQkNNQkFMX1RNX1NDSEVEX0RJUl9EUzsKKyAgICAgICAgICAgIHRtX3NjaGVkX2tleS5pZCA9IHBfc3ViX3Rlcm1fY2ZnLT5kYXRhLmRzX3RtOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZihCQ01fRVJSX09LIT0gKHJldCA9IGJjbWJhbF90bV9zY2hlZF9zZXRfc3ViX3Rlcm1fb3duZXIodG1fc2NoZWRfa2V5LCBwX3N1Yl90ZXJtX2NmZykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zdWJfdGVybSwgCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2V0IHN1YiB0ZXJtIGRzX3RtLCByZXQgPSAlcyIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKkB9Ki8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vc3ViX3Rlcm1fZnNtLmggYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL3N1Yl90ZXJtX2ZzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNkN2NmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL3N1Yl90ZXJtX2ZzbS5oCkBAIC0wLDAgKzEsMTgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBzdWJfdGVybV9mc20uaAorICogQGJyaWVmIENvZGUgdG8gc3VwcG9ydCB0aGUgQkFMIFN1YnNjcmliZXIgVGVybWluYWwgRlNNCisgKgorICogQGRlZmdyb3VwIHN1Yl90ZXJtaW5hbCBTdWJzY3JpYmVyIFRlcm1pbmFsCisgKiBAaW5ncm91cCBjb3JlCisgKi8KKworCisjaWZuZGVmIFNVQl9URVJNX0ZTTV9ICisjZGVmaW5lIFNVQl9URVJNX0ZTTV9ICisKKy8qQHsqLworCisjaW5jbHVkZSA8YmFsX2FwaS5oPgorCisvKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBhIGdsb2JhbCBwb29sIG9mCisgKiBPTlUgaW5zdGFuY2VzLgorICovCisjZGVmaW5lIE5VTV9TVVBQT1JURURfU1VCX1RFUk1TICg0MDk2KQorCit0eXBlZGVmIGVudW0KK3sKKyAgICBTVUJfVEVSTV9GU01fRVZFTlRfVFlQRV9OT05FICAgICAgICAgICAgICAgICA9IC0xLAorICAgIFNVQl9URVJNX0ZTTV9FVkVOVF9UWVBFX0FETUlOX1VQICAgICAgICAgICAgICAgICAsCisgICAgU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfQURNSU5fRE4gICAgICAgICAgICAgICAgICwKKyAgICBTVUJfVEVSTV9GU01fRVZFTlRfVFlQRV9SRU1PVkUgICAgICAgICAgICAgICAgICAgLAorICAgIFNVQl9URVJNX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHICAgICAgICAgICAgICAgICAsCisgICAgU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfVVRJTF9BVVRPX01TRyAgICAgICAgICAgICwKKworCisgICAgU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfX0xBU1QsCisgICAgU1VCX1RFUk1fRlNNX0VWRU5UX1RZUEVfX05VTV9PRgorfSBzdWJfdGVybV9mc21fZXZlbnRfdHlwZTsKKworCisKK3R5cGVkZWYgZW51bQoreworICAgIFNVQl9URVJNX0ZTTV9TVEFURV9OT05FICAgICA9IC0xLAorICAgIFNVQl9URVJNX0ZTTV9TVEFURV9OVUxMICAgICAgICAgLAorICAgIFNVQl9URVJNX0ZTTV9TVEFURV9DT05GSUdVUklORyAgLAorICAgIFNVQl9URVJNX0ZTTV9TVEFURV9DT05GSUdVUkVEICAgLAorICAgIFNVQl9URVJNX0ZTTV9TVEFURV9SRU1PVklORyAgICAgLAorIAorCisgICAgU1VCX1RFUk1fRlNNX1NUQVRFX19MQVNULAorICAgIFNVQl9URVJNX0ZTTV9TVEFURV9fTlVNX09GCit9IHN1Yl90ZXJtX2ZzbV9zdGF0ZTsKKworCit0eXBlZGVmIGVudW0KK3sKKyAgICBTVUJfVEVSTV9GTEFHX0FOWSAgPSAxLCAgICAgICAgICAgIC8qKjwgT05MWSBVU0VEIGluIHRoZSBzdWJfdGVybSBnZXQgYXJndW1lbnQgKi8KKyAgICBTVUJfVEVSTV9GTEFHX0FDVElWRSAgLCAgICAgICAgICAgIC8qKjwgQSBzdWJfdGVybSBpcyBvbiB0aGUgYWN0aXZlIGxpc3QgKi8KKyAgICBTVUJfVEVSTV9GTEFHX0ZSRUUgICAgICAgICAgICAgICAgIC8qKjwgQSBzdWJfdGVybSBpcyBvbiB0aGUgZnJlZSBsaXN0ICovCit9IHN1Yl90ZXJtX2ZsYWc7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc3ViX3Rlcm1fZnNtX2V2ZW50Cit7CisgICAgc3ViX3Rlcm1fZnNtX2V2ZW50X3R5cGUgZXZlbnRfdHlwZTsgICAvKio8IFRoZSBzdWJfdGVybSBGU00gZXZlbnQgKi8KKyAgICB2b2lkICAgICAgICAgICAgICptc2c7Cit9IHN1Yl90ZXJtX2ZzbV9ldmVudDsKKworCit0eXBlZGVmIHN0cnVjdCBzdmNfcG9ydF9pZF9lbnRyeQoreworICAgIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgc3ZjX3BvcnRfaWQ7CisgICAgdWludDhfdCByZWZfY291bnQ7ICAgICAgICAgICAgICAgICAgICAvKio8IEEgY291bnQgb2YgdGhlIG51bWJlciBvZiByZS11c2VzIG9mIHRoaXMgc3ZjX3BvcnRfaWQgb24gdGhpcyBzdWJzY3JpYmVyIHRlcm1pbmFsICovCisgICAgVEFJTFFfRU5UUlkoc3ZjX3BvcnRfaWRfZW50cnkpIG5leHQgOyAvKio8IFRBSUxRIGxpbmsgKi8gICAgCit9c3ZjX3BvcnRfaWRfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IGFnZ19wb3J0X2lkX2VudHJ5Cit7CisgICAgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQgYWdnX3BvcnRfaWQ7CisgICAgdWludDhfdCByZWZfY291bnQ7ICAgICAgICAgICAgICAgICAgICAvKio8IEEgY291bnQgb2YgdGhlIG51bWJlciBvZiByZS11c2VzIG9mIHRoaXMgYWdnX3BvcnRfaWQgb24gdGhpcyBzdWJzY3JpYmVyIHRlcm1pbmFsICovCisgICAgVEFJTFFfRU5UUlkoYWdnX3BvcnRfaWRfZW50cnkpIG5leHQgOyAvKio8IFRBSUxRIGxpbmsgKi8gICAgCit9YWdnX3BvcnRfaWRfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IHN1Yl90ZXJtX2luc3Qgc3ViX3Rlcm1faW5zdDsKK3N0cnVjdCBzdWJfdGVybV9pbnN0Cit7CisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICBjdXJyZW50X3N1Yl90ZXJtX2luZm87ICAvKio8IFRoZSBjdXJyZW50IGluZm9ybWF0aW9uIGZvciB0aGlzIHN1Yl90ZXJtICh1c2VkIGZvciBHRVQpICovCisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICBhcGlfcmVxX3N1Yl90ZXJtX2luZm87ICAvKio8IFRoZSBsYXN0IHN1Yl90ZXJtIG9iamVjdCBpbmZvIHJlY2VpdmVkIGZyb20gdGhlIFB1YmxpYyBBUEkgKi8KKyAgICBzdWJfdGVybV9mc21fc3RhdGUgICAgICAgICAgICAgIGZzbV9zdGF0ZTsgICAgICAgICAgICAgIC8qKjwgVGhlIHN1Yl90ZXJtIGluc3RhbmNlIEZTTSBzdGF0ZSAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3N2Y19wb3J0X2lkczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJlYXJlciB0cmFmZmljIEdFTXMgb24gdGhpcyBzdWJzY3JpYmVyIHRlcm1pbmFsICovCisgICAgVEFJTFFfSEVBRChzdmNfcG9ydF9pZF9saXN0X2hlYWQsIHN2Y19wb3J0X2lkX2VudHJ5KSBzdmNfcG9ydF9pZF9saXN0OyAvKiBBIGxpc3Qgb2Ygc3ZjX3BvcnRfaWRzIG9uIHRoaXMgc3Vic2NyaWJlciB0ZXJtaW5hbCAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2FnZ19wb3J0X2lkczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGFsbG9jIGlkcyBvbiB0aGlzIHN1YnNjcmliZXIgdGVybWluYWwgKi8KKyAgICBUQUlMUV9IRUFEKGFnZ19wb3J0X2lkX2xpc3RfaGVhZCwgYWdnX3BvcnRfaWRfZW50cnkpIGFnZ19wb3J0X2lkX2xpc3Q7IC8qIEEgbGlzdCBvZiBzdmNfcG9ydF9pZHMgb24gdGhpcyBzdWJzY3JpYmVyIHRlcm1pbmFsICovCisgICAgVEFJTFFfRU5UUlkoc3ViX3Rlcm1faW5zdCkgICAgICBzdWJfdGVybV9pbnN0X25leHQgOyAgICAvKio8IFRBSUxRIGxpbmsgZm9yIGFjdGl2ZSBsaXN0IGFuZCBmcmVlIGxpc3QgbWFuYWdlbWVudCAqLworfTsKKworCisvKiAKKyAqIFN1Yl9UZXJtIEZTTSBkYXRhIHN0cnVjdHVyZXMKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3ViX3Rlcm1fZnNtX2N0eAoreworICAgIC8qIExpc3RzIG9mIGZyZWUgc3ViX3Rlcm0gZW50cmllcyBhbmQgYWN0aXZlIHN1Yl90ZXJtIGVudHJpZXMKKyAgICAgKi8KKyAgICBUQUlMUV9IRUFEKGZyZWVfc3ViX3Rlcm1fbGlzdF9oZWFkLCBzdWJfdGVybV9pbnN0KSBmcmVlX3N1Yl90ZXJtX2xpc3Q7ICAKKworICAgIFRBSUxRX0hFQUQoYWN0aXZlX3N1Yl90ZXJtX2xpc3RfaGVhZCwgc3ViX3Rlcm1faW5zdCkgYWN0aXZlX3N1Yl90ZXJtX2xpc3Q7ICAKKworfSBzdWJfdGVybV9mc21fY3R4OworCisKKy8qIAorICogRnVuY3Rpb24gZGVjbGFyYXRpb25zIAorICovCitleHRlcm4gYmNtb3NfZXJybm8gc3ViX3Rlcm1fZnNtX2luaXQodm9pZCk7CisKK2V4dGVybiBiY21vc19lcnJubyBzdWJfdGVybV9mc21fZmluaXNoKHZvaWQpOworCitleHRlcm4gYmNtb3NfZXJybm8gcHJvY2Vzc19zdWJzY3JpYmVyX3Rlcm1pbmFsX29iamVjdCh2b2lkICptc2dfcGF5bG9hZCk7CisKK2V4dGVybiBiY21vc19lcnJubyBwcm9jZXNzX3N1YnNjcmliZXJfdGVybWluYWxfdXRpbF9tc2codm9pZCAqbXNnX3BheWxvYWQpOworCitleHRlcm4gc3ViX3Rlcm1faW5zdCAqc3ViX3Rlcm1faW5zdF9nZXQoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5ICprZXksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fZmxhZyBzdWJfdGVybV9mbGFnKTsKKworZXh0ZXJuIGJjbW9zX2Vycm5vIHN1Yl90ZXJtX3N2Y19wb3J0X2lkX2dldChiY21iYWxfc3ViX2lkIHN1Yl90ZXJtX2lkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYWNjZXNzX2ludF9pZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgKnBfc3ZjX3BvcnRfaWQpOworCitleHRlcm4gYmNtb3NfZXJybm8gYmNtYmFsX3N1Yl90ZXJtX3N2Y19wb3J0X2lkX2xpc3RfZW50cnlfYWRkKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCBzdmNfcG9ydF9pZCk7CisKK2V4dGVybiBiY21vc19lcnJubyBiY21iYWxfc3ViX3Rlcm1fc3ZjX3BvcnRfaWRfbGlzdF9lbnRyeV9yZW1vdmUoc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkIHN2Y19wb3J0X2lkKTsKKworYmNtb3NfZXJybm8gYmNtYmFsX3N1Yl90ZXJtX2FnZ19wb3J0X2lkX2xpc3RfZW50cnlfYWRkKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBhZ2dfcG9ydF9pZCk7CisKK2JjbW9zX2Vycm5vIGJjbWJhbF9zdWJfdGVybV9hZ2dfcG9ydF9pZF9saXN0X2VudHJ5X3JlbW92ZShzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQgYWdnX3BvcnRfaWQpOworCitiY21vc19lcnJubyBiY21iYWxfc3ViX3Rlcm1fY2hlY2tfYWdnX3BvcnRfaW5fdXNlKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQgYWdnX3BvcnRfaWQpOworCitiY21vc19lcnJubyBiY21iYWxfc3ViX3Rlcm1fY2hlY2tfc3ZjX3BvcnRfaW5fdXNlKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCBzdmNfcG9ydF9pZCk7CisKKworCisvKkB9Ki8KKworI2VuZGlmIC8qU1VCX1RFUk1fRlNNX0ggKi8KKworCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL3RtX3F1ZXVlX2ZzbS5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi90bV9xdWV1ZV9mc20uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOTk5OWNiCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi90bV9xdWV1ZV9mc20uYwpAQCAtMCwwICsxLDk4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgdG1fcXVldWVfZnNtLmMKKyAqIEBicmllZiBDb2RlIHRvIHN1cHBvcnQgdGhlIEJBTCB0bV9xdWV1ZSBGU00KKyAqCisgKgorICovCisKKy8qQHsqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8dG1fcXVldWVfZnNtLmg+CisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgPGJhbF9vc21zZy5oPgorI2luY2x1ZGUgImJhbF93b3JrZXIuaCIKKyNpbmNsdWRlICJiYWxfbWFjX3V0aWwuaCIKKyNpbmNsdWRlICJiYWxfc3dpdGNoX3V0aWwuaCIKKyNpbmNsdWRlICJyc2NfbWdyLmgiCisKKyNpbmNsdWRlIDxiYWxfb2Jqcy5oPgorI2luY2x1ZGUgPGZzbV9jb21tb24uaD4KKworI2lmZGVmIEVOQUJMRV9MT0cKKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorCisgLyoKKyAqIEBicmllZiBUaGUgbG9nZ2luZyBkZXZpY2UgaWQgZm9yIHRtIHF1ZXVlCisgKi8KK3N0YXRpYyBkZXZfbG9nX2lkIGxvZ19pZF90bV9xdWV1ZTsKKyNlbmRpZgorCisvKiBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKworc3RhdGljIGJjbW9zX2Vycm5vIHRtX3F1ZXVlX2ZyZWVfYnlfZW50cnkodG1fcXVldWVfaW5zdCAqcF9lbnRyeSk7CitzdGF0aWMgYmNtb3NfZXJybm8gdG1fcXVldWVfZnNtX3N0YXRlX2Vycih0bV9xdWV1ZV9pbnN0ICpwX3RtX3F1ZXVlX2luc3QsIHZvaWQgKm1zZywgdG1fcXVldWVfZnNtX2V2ZW50ICpwX2V2ZW50KTsKK3N0YXRpYyB2b2lkIHRtX3F1ZXVlX2luc3RfZW50cnlfb2JqX2luaXQodG1fcXVldWVfaW5zdCAqcF9lbnRyeSk7CisKKy8qCisgKiBAYnJpZWYgVGhlIEdsb2JhbCB0bV9xdWV1ZSBmc20gY29udGV4dCBkYXRhIHN0cnVjdHVyZQorICovCitzdGF0aWMgdG1fcXVldWVfZnNtX2N0eCBnX3RtX3F1ZXVlX2ZzbV90bV9xdWV1ZV9saXN0X2N0eDsKKworLyoKKyAqIE1hY3JvcyBmb3IgdG1fcXVldWUgY3R4IGFjY2VzcworICovCisjZGVmaW5lIFRNX1FVRVVFX0ZTTV9UTV9RVUVVRV9MSVNUX0NUWCAgICAgIChnX3RtX3F1ZXVlX2ZzbV90bV9xdWV1ZV9saXN0X2N0eCkKKyNkZWZpbmUgVE1fUVVFVUVfRlNNX1RNX1FVRVVFX0xJU1RfQ1RYX1BUUiAgKCZnX3RtX3F1ZXVlX2ZzbV90bV9xdWV1ZV9saXN0X2N0eCkKKworCisvKgorICogIEBicmllZiBUaGUgZGVmaW5pdGlvbiBvZiBhIHRtX3F1ZXVlIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGZ1bmN0aW9uCisgKi8KK3R5cGVkZWYgYmNtb3NfZXJybm8gKCogdG1fcXVldWVfZnNtX3N0YXRlX3Byb2Nlc3NvcikodG1fcXVldWVfaW5zdCAqLCB2b2lkICosIHRtX3F1ZXVlX2ZzbV9ldmVudCAqKTsKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfdG1fcXVldWVfY3JlYXRlKHRtX3F1ZXVlX2luc3QgKnBfdG1fcXVldWVfaW5zdCwgCisJCQkJCQkJCQkJICAgdm9pZCAqbXNnLCAKKwkJCQkJCQkJCQkgICB0bV9xdWV1ZV9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX3RtX3F1ZXVlX2FjdGl2ZV9kZXN0cm95ICh0bV9xdWV1ZV9pbnN0ICpwX3RtX3F1ZXVlX2luc3QsIAorCQkJCQkJCQkJCSAgIHZvaWQgKm1zZywgCisJCQkJCQkJCQkJICAgdG1fcXVldWVfZnNtX2V2ZW50ICpwX2V2ZW50KTsKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfdG1fcXVldWVfaW5hY3RpdmVfZGVzdHJveSh0bV9xdWV1ZV9pbnN0ICpwX3RtX3F1ZXVlX2luc3QsIAorCQkJCQkJCQkJCSAgIHZvaWQgKm1zZywgCisJCQkJCQkJCQkJICAgdG1fcXVldWVfZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworCitzdGF0aWMgdG1fcXVldWVfZnNtX3N0YXRlX3Byb2Nlc3NvciB0bV9xdWV1ZV9zdGF0ZXNbVE1fUVVFVUVfRlNNX1NUQVRFX19OVU1fT0ZdW1RNX1FVRVVFX0ZTTV9FVkVOVF9UWVBFX19OVU1fT0ZdID0gCit7CisgICAgW1RNX1FVRVVFX0ZTTV9TVEFURV9OVUxMXSA9IAorICAgIHsKKyAgICAgICAgW1RNX1FVRVVFX0ZTTV9FVkVOVF9UWVBFX0NSRUFURV0gPSBiY21iYWxfdG1fcXVldWVfY3JlYXRlLAorICAgIH0sCisgICAgW1RNX1FVRVVFX0ZTTV9TVEFURV9JTkFDVElWRV0gPSAKKyAgICB7CisgICAgICAgIFtUTV9RVUVVRV9GU01fRVZFTlRfVFlQRV9ERVNUUk9ZXSA9IGJjbWJhbF90bV9xdWV1ZV9pbmFjdGl2ZV9kZXN0cm95LAorICAgIH0sCisgICAgW1RNX1FVRVVFX0ZTTV9TVEFURV9BQ1RJVkVdID0gCisgICAgeworICAgICAgICBbVE1fUVVFVUVfRlNNX0VWRU5UX1RZUEVfREVTVFJPWV0gPSBiY21iYWxfdG1fcXVldWVfYWN0aXZlX2Rlc3Ryb3ksCisgICAgfSwKKworfTsKKworc3RhdGljIGNoYXIgKnN0YXRlX25hbWVfc3RyW10gPQoreworICAgICJUTV9RVUVVRV9GU01fU1RBVEVfTlVMTCIsCisgICAgIlRNX1FVRVVFX0ZTTV9TVEFURV9JTkFDVElWRSIsCQorICAgICJUTV9RVUVVRV9GU01fU1RBVEVfQUNUSVZFIiwKKyAgICAiVE1fUVVFVUVfRlNNX1NUQVRFX0lOX1VTRSIsCisgICAgIlRNX1FVRVVFX0ZTTV9TVEFURV9ERUxFVElORyIsCit9OworCisvKiBFbnN1cmUgdGhhdCB0aGUgbmFtZSBhcnJheSBzaXplIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgZW51bSAqLworQkFMX1NUQVRJQ19BU1NFUlQoVE1fUVVFVUVfRlNNX1NUQVRFX19MQVNUID09IChzaXplb2YgKHN0YXRlX25hbWVfc3RyKSAvIHNpemVvZiAoY2hhciAqKSksIHRtX3F1ZXVlX2ZzbV9zdGF0ZSk7CisKK3N0YXRpYyBjaGFyICp0bV9xdWV1ZV9zdGF0ZV9uYW1lX2dldCh0bV9xdWV1ZV9mc21fc3RhdGUgc3RhdGUpCit7CisgICAgaWYoc3RhdGUgPCBUTV9RVUVVRV9GU01fU1RBVEVfX0xBU1QpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdGVfbmFtZV9zdHJbc3RhdGVdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gIlRNX1FVRVVFX1VOS05PV04iOworICAgIH0KK30KKworc3RhdGljIGNoYXIgKmV2ZW50X25hbWVfc3RyW10gPQoreworICAgICJUTV9RVUVVRV9GU01fQ1JFQVRFX0VWRU5UIiwKKyAgICAiVE1fUVVFVUVfRlNNX0RFU1RST1lfRVZFTlQiLAorICAgICJGTE9XX0ZTTV9VVElMX01TR19FVkVOVCIsCit9OworCisvKiBFbnN1cmUgdGhhdCB0aGUgbmFtZSBhcnJheSBzaXplIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgZW51bSAqLworQkFMX1NUQVRJQ19BU1NFUlQoVE1fUVVFVUVfRlNNX0VWRU5UX1RZUEVfX0xBU1QgPT0gKHNpemVvZiAoZXZlbnRfbmFtZV9zdHIpIC8gc2l6ZW9mIChjaGFyICopKSwgdG1fcXVldWVfZnNtX2V2ZW50X3R5cGUpOworCitzdGF0aWMgY2hhciAqdG1fcXVldWVfZXZlbnRfbmFtZV9nZXQodG1fcXVldWVfZnNtX2V2ZW50X3R5cGUgZXZlbnQpCit7CisgICAgaWYoZXZlbnQgPCBUTV9RVUVVRV9GU01fRVZFTlRfVFlQRV9fTEFTVCkKKyAgICB7CisgICAgICAgIHJldHVybiBldmVudF9uYW1lX3N0cltldmVudF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAiVE1fUVVFVUVfRVZUX1VOS05PV04iOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIFRtIHF1ZXVlIEZTTSBmdW5jdGlvbiB3aGljaCBpcyBleGVjdXRlZCB3aGVuIGFuIGVycm9yCisgKiAgICAgICAgaXMgZW5jb3VudGVyZWQgZHVyaW5nIEZTTSBwcm9jZXNzaW5nLgorICoKKyAqIEBwYXJhbSBwX3RtX3F1ZXVlX2luc3QgICAgIFBvaW50ZXIgdG8gYSB0bV9xdWV1ZSBpbnN0YW5jZQorICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIEJBTCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gb25lIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgQkFMIGFwcHMuCisgKiBAcGFyYW0gcF9ldmVudCAgICAgICAgICBQb2ludGVyIHRvIGEgdG1fcXVldWUgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyB0bV9xdWV1ZV9mc21fc3RhdGVfZXJyKHRtX3F1ZXVlX2luc3QgKnBfdG1fcXVldWVfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bV9xdWV1ZV9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9JTlZBTElEX09QOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3F1ZXVlLAorICAgICAgICAgICAgIkVycm9yIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgVE1fcXVldWUgRlNNIgorICAgICAgICAgICAgIiAtIEJBRCBFVkVOVCAoKVxuIik7CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgVG0gUXVldWUgRlNNIGluZnJhc3RydWN0dXJlLgorICoKKyAqICAgICAgICBOT1RFOiBUaGlzIGlzIGNhbGxlZCBvbmNlIG9uIHN0YXJ0dXAgYW5kIE5PVCBmb3IgZWFjaCBGU00gaW5zdGFuY2UuCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIHRtX3F1ZXVlX2ZzbV9pbml0KHZvaWQpCit7CisgICAgaW50IGlpOworICAgIHRtX3F1ZXVlX2luc3QgKm5ld19lbnRyeTsKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisjaWZkZWYgRU5BQkxFX0xPRworICAgIGxvZ19pZF90bV9xdWV1ZSA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJUTV9RVUVVRSIsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIEJVR19PTihsb2dfaWRfdG1fcXVldWUgPT0gREVWX0xPR19JTlZBTElEX0lEKTsKKyNlbmRpZgorCisgICAgLyogSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIHRtX3F1ZXVlIHF1ZXVlcyAqLworICAgIFRBSUxRX0lOSVQoJlRNX1FVRVVFX0ZTTV9UTV9RVUVVRV9MSVNUX0NUWF9QVFItPmZyZWVfdG1fcXVldWVfbGlzdCk7CisgICAgVEFJTFFfSU5JVCgmVE1fUVVFVUVfRlNNX1RNX1FVRVVFX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX3RtX3F1ZXVlX2xpc3QpOworCisgICAgLyogUG9wdWxhdGUgdGhlIGZyZWUgbGlzdCB3aXRoIGl0J3MgaW5pdGlhbCBzZXQgb2YgdG1fcXVldWVzCisgICAgICovCisgICAgZm9yKGlpPTA7IGlpPFRNX1FVRVVFX0FMTE9DQVRJT05fQkxPQ0tfU0laRTsgaWkrKykKKyAgICB7CisgICAgICAgIG5ld19lbnRyeSA9IGJjbW9zX2NhbGxvYyhzaXplb2YodG1fcXVldWVfaW5zdCkpOworICAgICAgICBpZihOVUxMID09IG5ld19lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhGQVRBTCwgbG9nX2lkX3RtX3F1ZXVlLCAgIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB0bV9xdWV1ZSBmcmVlIGxpc3QgLSBGQVRBTFxuIik7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICB0bV9xdWV1ZV9mcmVlX2J5X2VudHJ5KG5ld19lbnRyeSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gdW4taW5pdGlhbGl6ZSB0aGUgVG0gUXVldWUgRlNNIGluZnJhc3RydWN0dXJlLgorICoKKyAqICAgICAgICBOT1RFOiBUaGlzIGlzIGNhbGxlZCBvbmNlIG9uIHNodXRkb3duIGFuZCBOT1QgZm9yIGVhY2ggRlNNIGluc3RhbmNlLgorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyB0bV9xdWV1ZV9mc21fZmluaXNoKHZvaWQpCit7CisKKyAgICB0bV9xdWV1ZV9pbnN0ICpjdXJyZW50X2VudHJ5LCAqcF90ZW1wX2VudHJ5OworCisgICAgLyogRnJlZSBhbGwgdGhlIGVudHJpZXMgb24gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICZUTV9RVUVVRV9GU01fVE1fUVVFVUVfTElTVF9DVFhfUFRSLT5hY3RpdmVfdG1fcXVldWVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdG1fcXVldWVfaW5zdF9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBwX3RlbXBfZW50cnkpCisgICAgeworICAgICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgYWN0aXZlIGxpc3QgKi8KKyAgICAgICAgVEFJTFFfUkVNT1ZFKCZUTV9RVUVVRV9GU01fVE1fUVVFVUVfTElTVF9DVFhfUFRSLT5hY3RpdmVfdG1fcXVldWVfbGlzdCwgY3VycmVudF9lbnRyeSwgdG1fcXVldWVfaW5zdF9uZXh0KTsKKworICAgICAgICBiY21vc19mcmVlKGN1cnJlbnRfZW50cnkpOworCisgICAgfQorCisgICAgLyogRnJlZSBhbGwgdGhlIGVudHJpZXMgb24gdGhlIGZyZWUgbGlzdCAqLworICAgIFRBSUxRX0ZPUkVBQ0hfU0FGRShjdXJyZW50X2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAmVE1fUVVFVUVfRlNNX1RNX1FVRVVFX0xJU1RfQ1RYX1BUUi0+ZnJlZV90bV9xdWV1ZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICB0bV9xdWV1ZV9pbnN0X25leHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBfdGVtcF9lbnRyeSkKKyAgICB7CisgICAgICAgIC8qIFJlbW92ZSBpdCBmcm9tIHRoZSBhY3RpdmUgbGlzdCAqLworICAgICAgICBUQUlMUV9SRU1PVkUoJlRNX1FVRVVFX0ZTTV9UTV9RVUVVRV9MSVNUX0NUWF9QVFItPmZyZWVfdG1fcXVldWVfbGlzdCwgY3VycmVudF9lbnRyeSwgdG1fcXVldWVfaW5zdF9uZXh0KTsKKworICAgICAgICBiY21vc19mcmVlKGN1cnJlbnRfZW50cnkpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCB0bV9xdWV1ZV9pbnN0X2VudHJ5X29ial9pbml0KHRtX3F1ZXVlX2luc3QgKnBfZW50cnkpCit7CisgICAgLyogVGhlIGFjdHVhbCBrZXkgY29udGVudCBpcyBpcnJlbGV2YW50IGZvciBmcmVlIHRtX3F1ZXVlcyAqLworICAgIGJjbWJhbF90bV9xdWV1ZV9rZXkga2V5ID0geyAuaWQgPSAwLCAuc2NoZWRfaWQgPSAwLCAuc2NoZWRfZGlyID0gQkNNQkFMX1RNX1NDSEVEX0RJUl9VU307CisKKyAgICAvKiBBbmQgYWRkIGl0IHRvIHRoZSBmcmVlIGxpc3QgKi8KKyAgICBwX2VudHJ5LT5mc21fc3RhdGUgPSBUTV9RVUVVRV9GU01fU1RBVEVfTlVMTDsKKworICAgIEJDTUJBTF9DRkdfSU5JVCgmcF9lbnRyeS0+Y3VycmVudF90bV9xdWV1ZV9pbmZvLAorICAgICAgICAgICAgICAgICAgICB0bV9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAga2V5KTsKKworICAgIEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfU0VUKCYocF9lbnRyeS0+Y3VycmVudF90bV9xdWV1ZV9pbmZvKSwgQkNNT1NfRkFMU0UpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byBmcmVlIGEgdG1fcXVldWUgaW5zdGFuY2Ugc3BlY2lmaWVkIGJ5IGEgdGhlIHN1cHBsaWVkCisgKiAgICAgICAgZW50cnkgcG9pbnRlci4KKyAqCisgKiBAcGFyYW0gcF9lbnRyeSBBIHBvaW50ZXIgdG8gdGhlIGVudHJ5IHRvIGJlIGZyZWVkCisgKgorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gdG1fcXVldWVfZnJlZV9ieV9lbnRyeSh0bV9xdWV1ZV9pbnN0ICpwX2VudHJ5KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgdG1fcXVldWVfaW5zdCAqY3VycmVudF9lbnRyeTsKKyAgICB0bV9xdWV1ZV9pbnN0ICpwX3RlbXBfZW50cnk7CisKKyAgICAvKgorICAgICAqIEZpcnN0LCBjaGVjayB0aGUgYWN0aXZlIGxpc3QgKGFuIGFjdGl2ZSB0bV9xdWV1ZSBjYW4gYmUgaW4gdGhlIGFkZGluZyBvciByZW1vdmluZyBzdGF0ZSkKKyAgICAgKi8KKyAgICBUQUlMUV9GT1JFQUNIX1NBRkUoY3VycmVudF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgJlRNX1FVRVVFX0ZTTV9UTV9RVUVVRV9MSVNUX0NUWF9QVFItPmFjdGl2ZV90bV9xdWV1ZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICB0bV9xdWV1ZV9pbnN0X25leHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBfdGVtcF9lbnRyeSkKKyAgICB7CisgICAgICAgIGlmKGN1cnJlbnRfZW50cnkgPT0gcF9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgYWN0aXZlIGxpc3QgKi8KKyAgICAgICAgICAgIFRBSUxRX1JFTU9WRSgmVE1fUVVFVUVfRlNNX1RNX1FVRVVFX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX3RtX3F1ZXVlX2xpc3QsIGN1cnJlbnRfZW50cnksIHRtX3F1ZXVlX2luc3RfbmV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwl0bV9xdWV1ZV9pbnN0X2VudHJ5X29ial9pbml0KHBfZW50cnkpOworICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZUTV9RVUVVRV9GU01fVE1fUVVFVUVfTElTVF9DVFhfUFRSLT5mcmVlX3RtX3F1ZXVlX2xpc3QsIHBfZW50cnksIHRtX3F1ZXVlX2luc3RfbmV4dCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgVG0gcXVldWUgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZXhlY3V0aXZlIGZ1bmN0aW9uCisgKiBAcGFyYW0gcF90bV9xdWV1ZV9pbnN0ICBQb2ludGVyIHRvIGEgdG1fcXVldSBpbnN0YW5jZQorICogQHBhcmFtIHBfZXZlbnQgICAgICBQb2ludGVyIHRvIGEgdG1fUXVldWUgZXZlbnQgc3RydWN0dXJlCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyB0bV9xdWV1ZV9mc21fZXhlYyh0bV9xdWV1ZV9pbnN0ICpwX3RtX3F1ZXVlX2luc3QsIHRtX3F1ZXVlX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIHRtX3F1ZXVlX2ZzbV9zdGF0ZSBwcmVfc3RhdGU7CisgICAgdG1fcXVldWVfZnNtX3N0YXRlX3Byb2Nlc3NvciB0bV9xdWV1ZV9zdGF0ZV9wcm9jZXNzb3I7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKE5VTEwgPT0gcF90bV9xdWV1ZV9pbnN0KTsKKyAgICBCVUdfT04oTlVMTCA9PSBwX2V2ZW50KTsKKworICAgIC8qIFJlY29yZCB0aGUgcHJlc2VudCBzdGF0ZSBmb3IgZGVidWcgcHJpbnRpbmcKKyAgICAgKi8KKyAgICBwcmVfc3RhdGUgPSBwX3RtX3F1ZXVlX2luc3QtPmZzbV9zdGF0ZTsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBzdGF0ZSBwcm9jZXNzaW5nIGZ1bmN0aW9uCisgICAgICovCisgICAgdG1fcXVldWVfc3RhdGVfcHJvY2Vzc29yID0gdG1fcXVldWVfc3RhdGVzW3BfdG1fcXVldWVfaW5zdC0+ZnNtX3N0YXRlXVtwX2V2ZW50LT5ldmVudF90eXBlXTsKKworICAgIC8qCisgICAgICogSWYgdGhlcmUncyBhIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24gZm9yIHRoaXMgZXZlbnQgYW5kIHN0YXRlLCBleGVjdXRlIGl0LgorICAgICAqIE90aGVyd2lzZSwgcHJvY2VzcyBhIGdlbmVyaWMgZXJyb3IuCisgICAgICovCisgICAgaWYodG1fcXVldWVfc3RhdGVfcHJvY2Vzc29yKQorICAgIHsKKyAgICAgICAgcmV0ID0gdG1fcXVldWVfc3RhdGVfcHJvY2Vzc29yKHBfdG1fcXVldWVfaW5zdCwgcF9ldmVudC0+bXNnLCBwX2V2ZW50KTsKKyAgICB9IAorCWVsc2UKKyAgICB7CisgICAgICAgIHRtX3F1ZXVlX2ZzbV9zdGF0ZV9lcnIocF90bV9xdWV1ZV9pbnN0LCBwX2V2ZW50LT5tc2csIHBfZXZlbnQpOworICAgIH0KKworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLCAiKioqIEVycm9yIGRldGVjdGVkIGR1cmluZyBzdGF0ZSBwcm9jZXNzaW5nXG4iKTsKKyAgICAgICAgcF90bV9xdWV1ZV9pbnN0LT5mc21fc3RhdGUgPSBwcmVfc3RhdGU7CisgICAgfQorCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3F1ZXVlLCAgIioqKiBFdmVudCAlcywgU3RhdGU6ICVzIC0tPiAlc1xuXG4iLAorICAgICAgICAgICAgdG1fcXVldWVfZXZlbnRfbmFtZV9nZXQocF9ldmVudC0+ZXZlbnRfdHlwZSksCisgICAgICAgICAgICB0bV9xdWV1ZV9zdGF0ZV9uYW1lX2dldChwcmVfc3RhdGUpLAorICAgICAgICAgICAgdG1fcXVldWVfc3RhdGVfbmFtZV9nZXQocF90bV9xdWV1ZV9pbnN0LT5mc21fc3RhdGUpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gcmV0cmlldmUgYSB0bV9xdWV1ZSBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgorICoKKyAqIEBwYXJhbSBrZXkgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGtleSBvZiB0aGUgdG1fcXVldWUgYmVpbmcgcmVmZXJlbmNlZAorICogQHBhcmFtIHNlYXJjaF9mbGFnICAgIEEgZmxhZyBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIHRtX3F1ZXVlCisgKiAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgdG8gYmUgcmV0cmlldmVkCisgKgorICogQHJldHVybnMgdG1fcXVldWVfaW5zdF90KiBBIHBvaW50ZXIgdG8gdGhlIGZvdW5kIHRtX3F1ZXVlIGluc3RhbmNlLAorICogICAgICAgICAgICAgICAgICAgICAgIG9yIE5VTEwgaWYgb25lIGlzIG5vdCBmb3VuZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordG1fcXVldWVfaW5zdCAqdG1fcXVldWVfaW5zdF9nZXQoYmNtYmFsX3RtX3F1ZXVlX2tleSBrZXksIHRtX3F1ZXVlX2ZsYWcgc2VhcmNoX2ZsYWcpCit7CisgICAgdG1fcXVldWVfaW5zdCAqY3VycmVudF9lbnRyeSA9IE5VTEw7CisKKyAgICAvKgorICAgICAqIEZpcnN0LCBjaGVjayB0aGUgYWN0aXZlIGxpc3QgaWYgdGhlIGNhbGxlciBoYXMgY2hvc2VuIHRvIGRvIHNvCisgICAgICovCisgICAgaWYoVE1fUVVFVUVfRkxBR19BQ1RJVkUgJiBzZWFyY2hfZmxhZykKKyAgICB7CisgICAgICAgIFRBSUxRX0ZPUkVBQ0goY3VycmVudF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAmVE1fUVVFVUVfRlNNX1RNX1FVRVVFX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX3RtX3F1ZXVlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgdG1fcXVldWVfaW5zdF9uZXh0KQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmKGN1cnJlbnRfZW50cnktPmFwaV9yZXFfdG1fcXVldWVfaW5mby5rZXkuaWQgPT0ga2V5LmlkCisJCQkJJiYgY3VycmVudF9lbnRyeS0+YXBpX3JlcV90bV9xdWV1ZV9pbmZvLmtleS5zY2hlZF9pZCA9PSBrZXkuc2NoZWRfaWQKKyAgICAgICAgICAgICAgICAmJiBjdXJyZW50X2VudHJ5LT5hcGlfcmVxX3RtX3F1ZXVlX2luZm8ua2V5LnNjaGVkX2RpciA9PSBrZXkuc2NoZWRfZGlyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF90bV9xdWV1ZSwgICJGb3VuZCBhY3RpdmUgdG1fcXVldWVcbiIpOworICAgICAgICAgICAgICAgIC8qIFRoZSB0bV9xdWV1ZSBpbnN0YW5jZSBwb2ludGVyIGlzIGluIGN1cnJlbnRfZW50cnkgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICAqIE5leHQsIGNoZWNrIHRoZSBmcmVlIGxpc3QgaWYgdGhlIGNhbGxlciBoYXMgY2hvc2VuIHRvIGRvIHNvCisgICAgICovCisgICAgaWYoKFRNX1FVRVVFX0ZMQUdfRlJFRSAmIHNlYXJjaF9mbGFnKSAmJiAoTlVMTCA9PSBjdXJyZW50X2VudHJ5KSkKKyAgICB7CisgICAgICAgIC8qIE5vdyBjaGVjayB0aGUgZnJlZSBsaXN0ICovCisgICAgICAgIGlmKCFUQUlMUV9FTVBUWSgmVE1fUVVFVUVfRlNNX1RNX1FVRVVFX0xJU1RfQ1RYX1BUUi0+ZnJlZV90bV9xdWV1ZV9saXN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogSnVzdCBncmFiIHRoZSBmaXJzdCBlbnRyeSAqLworICAgICAgICAgICAgY3VycmVudF9lbnRyeSA9IFRBSUxRX0ZJUlNUKCZUTV9RVUVVRV9GU01fVE1fUVVFVUVfTElTVF9DVFhfUFRSLT5mcmVlX3RtX3F1ZXVlX2xpc3QpOworCisgICAgICAgICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgZnJlZSBsaXN0ICovCisgICAgICAgICAgICBUQUlMUV9SRU1PVkUoJlRNX1FVRVVFX0ZTTV9UTV9RVUVVRV9MSVNUX0NUWF9QVFItPmZyZWVfdG1fcXVldWVfbGlzdCwgY3VycmVudF9lbnRyeSwgdG1fcXVldWVfaW5zdF9uZXh0KTsKKworICAgICAgICAgICAgLyogQW5kIGFkZCBpdCB0byB0aGUgYWN0aXZlIGxpc3QgKi8KKyAgICAgICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZUTV9RVUVVRV9GU01fVE1fUVVFVUVfTElTVF9DVFhfUFRSLT5hY3RpdmVfdG1fcXVldWVfbGlzdCwgY3VycmVudF9lbnRyeSwgdG1fcXVldWVfaW5zdF9uZXh0KTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEluaXRpYWxpemUgdGhlIGZzbSBzdGF0ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjdXJyZW50X2VudHJ5LT5mc21fc3RhdGUgPSBUTV9RVUVVRV9GU01fU1RBVEVfTlVMTDsKKworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3F1ZXVlLCAgIlVzaW5nIG5ldyB0bV9xdWV1ZVxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZigoVE1fUVVFVUVfRkxBR19BTlkgJiBzZWFyY2hfZmxhZykgJiYgKE5VTEwgPT0gY3VycmVudF9lbnRyeSkpCisgICAgeworICAgICAgICAvKkEgdG1fcXVldWUgd2FzIG5vdCBmb3VuZCBvbiBlaXRoZXIgbGlzdCovCisKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3F1ZXVlLCAgIioqKioqKioqKioqKioqIEVSUk9SOiBubyB0bV9xdWV1ZSBmb3VuZFxuIik7CisgICAgfQorCisgICAgcmV0dXJuIGN1cnJlbnRfZW50cnk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfdG1fcXVldWVfdmFsaWRhdGUoYmNtYmFsX3RtX3F1ZXVlX2NmZyAqcF90bV9xdWV1ZV9jZmcpCit7CisgICAgYmNtb3NfZXJybm8gIHJldCA9IEJDTV9FUlJfT0s7CisgICAgYmNtYmFsX3RtX3NjaGVkX2tleSB0bV9zY2hlZF9rZXkgPSB7LmlkID0gcF90bV9xdWV1ZV9jZmctPmtleS5zY2hlZF9pZCwgLmRpciA9IHBfdG1fcXVldWVfY2ZnLT5rZXkuc2NoZWRfZGlyfTsKKyAgICB0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QgPSBOVUxMOworICAgIGRvCisgICAgeworICAgICAgICAvKmdldCB0aGUgdG0gc2NoZWQgaW5zdGFuY2UqLworICAgICAgICBwX3RtX3NjaGVkX2luc3QgPSB0bV9zY2hlZF9pbnN0X2dldCh0bV9zY2hlZF9rZXksIFRNX1NDSEVEX0ZMQUdfQUNUSVZFKTsKKyAgICAgICAgaWYoTlVMTCA9PSBwX3RtX3NjaGVkX2luc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgICJFUlJPUjogbm8gcmVsYXRlZCB0bV9zY2hlZCBmb3VuZCAoaWQgPSAlZCBkaXIgPSAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtX3NjaGVkX2tleS5pZCwgVE1fU0NIRURfRElSX1RPX1NUUih0bV9zY2hlZF9rZXkuZGlyKSk7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLypjaGVjayBpdCBpcyBub3QgYW4gYWdnIHBvcnQgdG0gc2NoZWQgLSBhcyB0aGVyZSBhcmUgbm8gcXVldWVzIHRvIHN1Y2ggbm9kZSovICAgICAgCisgICAgICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJnBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8sIHRtX3NjaGVkLCBvd25lcikpCisJCXsKKyAgICAgICAgICAgIGlmKEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0FHR19QT1JUID09IHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgICJFUlJPUjogc2hvdWxkIG5vdCBhdHRhY2ggcXVldWUgdG8gbm9kZSB3aGljaCBpcyBvd25lZCBieSBhZ2cgcG9ydCAoaWQgPSAlZCBkaXIgPSAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bV9zY2hlZF9rZXkuaWQsIFRNX1NDSEVEX0RJUl9UT19TVFIodG1fc2NoZWRfa2V5LmRpcikpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0JCQkJCisJCX0KKworICAgICAgICAvKnNjaGVkIGxldmVsIHNob3VsZCBiZSAncXVldWUnKi8KKyAgICAgICAgaWYoQkNNQkFMX1RNX1NDSEVEX0NISUxEX1RZUEVfUVVFVUUgIT0gcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLnNjaGVkX2NoaWxkX3R5cGUpCQkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLCAgIkVSUk9SOiB0bSBzY2hlZCBzY2hlZCBsZXZlbCBpcyBpbnZhbGlkICglZCksIHNob3VsZCBiZSBCQ01CQUxfVE1fU0NIRURfQ0hJTERfVFlQRV9RVUVVRVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLnNjaGVkX2NoaWxkX3R5cGUpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKmJhc2VkIG9uIHNjaGVkIHR5cGUsIGNoZWNrIHByaW9yaXR5IC8gd2VpZ2h0IGlzIHNldCBhbmQgaXMgdmFsaWQgKi8KKyAgICAgICAgaWYoQkNNQkFMX1RNX1NDSEVEX1RZUEVfU1AgPT0gcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLnNjaGVkX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfdG1fcXVldWVfY2ZnLCB0bV9xdWV1ZSwgcHJpb3JpdHkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgIlF1ZXVlIG11c3QgYmUgc2V0IHdpdGggYSBwcmlvcml0eSwgYXMgaXRzIHNjaGVkdWxlcicgc2NoZWRfdHlwZSBpcyBzcFxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX3RtX3F1ZXVlX2NmZywgdG1fcXVldWUsIHdlaWdodCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLCAiUXVldWUgY2FuIG5vdCBiZSBzZXQgd2l0aCBhIHdlaWdodCwgYXMgaXRzIHNjaGVkdWxlcicgc2NoZWRfdHlwZSBpcyBzcFxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocF90bV9xdWV1ZV9jZmctPmRhdGEucHJpb3JpdHkgPj0gcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLm51bV9wcmlvcml0aWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgIlF1ZXVlIHByaW9yaXR5ICglZCkgaXMgaGlnaGVyIHRoYW4gdGhlIGFsbG93ZWQgYXQgcGFyZW50IHNjaGVkdWxlciAoaWQgPSAlZCBkaXIgPSAlcyBudW0gb2YgcHJpb3JpdGllcyA9ICVkIClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX3RtX3F1ZXVlX2NmZy0+ZGF0YS5wcmlvcml0eSAsIHRtX3NjaGVkX2tleS5pZCwgVE1fU0NIRURfRElSX1RPX1NUUih0bV9zY2hlZF9rZXkuZGlyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5udW1fcHJpb3JpdGllcyk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYoQkNNQkFMX1RNX1NDSEVEX1RZUEVfV0ZRID09IHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5zY2hlZF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfdG1fcXVldWVfY2ZnLCB0bV9xdWV1ZSwgd2VpZ2h0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgIlF1ZXVlIG11c3QgYmUgc2V0IHdpdGggYSB3ZWlnaHQsIGFzIGl0cyBzY2hlZHVsZXInIHNjaGVkX3R5cGUgc2NoZWRfdHlwZSBpcyB3ZnFcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfdG1fcXVldWVfY2ZnLCB0bV9xdWV1ZSwgcHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLCAiUXVldWUgY2FuIG5vdCBiZSBzZXQgd2l0aCBhIHByaW9yaXR5LCBhcyBpdHMgc2NoZWR1bGVyJyBzY2hlZF90eXBlIHNjaGVkX3R5cGUgaXMgd2ZxIFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZihCQ01CQUxfVE1fU0NIRURfVFlQRV9TUF9XRlEgPT0gcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLnNjaGVkX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX3RtX3F1ZXVlX2NmZywgdG1fcXVldWUsIHByaW9yaXR5KQorICAgICAgICAgICAgICAgICAgICAmJiBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfdG1fcXVldWVfY2ZnLCB0bV9xdWV1ZSwgd2VpZ2h0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgIlF1ZXVlIG11c3QgYmUgc2V0IHdpdGggZWl0aGVyIHdlaWdodCBvciBwcmlvcml0eSwgbm90IGJvdGguIGFzIGl0cyBzY2hlZHVsZXInIHNjaGVkX3R5cGUgaXMgc3Bfd2ZxXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAKKyAgICAgICAgICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX3RtX3F1ZXVlX2NmZywgdG1fcXVldWUsIHByaW9yaXR5KQorICAgICAgICAgICAgICAgICAgICAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX3RtX3F1ZXVlX2NmZywgdG1fcXVldWUsIHdlaWdodCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fcXVldWUsICJRdWV1ZSBtdXN0IGJlIHNldCB3aXRoIGVpdGhlciB3ZWlnaHQgb3IgcHJpb3JpdHksIGFzIGl0cyBzY2hlZHVsZXInIHNjaGVkX3R5cGUgaXMgc3Bfd2ZxXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH13aGlsZSgwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgY29yZSB3b3JrZXIgdGhyZWFkIHRvIHByb2Nlc3MgYW4KKyAqICAgICAgICB0bV9xdWV1ZSBvYmplY3QgbWVzc2FnZSAoU0VULCBHRVQsIENMRUFSLCBTVEFUUykgcmVjZWl2ZWQKKyAqICAgICAgICBmcm9tIHRoZSBCQUwgUHVibGljIEFQSS4KKyAqCisgKiBAcGFyYW0gbXNnX3BheWxvYWQgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEJBTCBQdWJsaWMgQVBJLgorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBwcm9jZXNzX3RtX3F1ZXVlX29iamVjdCh2b2lkICptc2dfcGF5bG9hZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOwkKKyAgICBiY21iYWxfdG1fcXVldWVfY2ZnICpwX3RtX3F1ZXVlX2NmZyA9IChiY21iYWxfdG1fcXVldWVfY2ZnICopbXNnX3BheWxvYWQ7CisgICAgdG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0ID0gTlVMTDsKKyAgICB0bV9xdWV1ZV9mc21fZXZlbnQgZnNtX2V2ZW50OworICAgIGJjbWJhbF90bV9xdWV1ZV9rZXkgdG1fcXVldWVfa2V5OworICAgIGJjbWJhbF9vYmpfbXNnX3R5cGUgb3Blcl90eXBlOworICAgIGJjbWJhbF90bV9zY2hlZF9rZXkgdG1fc2NoZWRfa2V5OyAgICAKKyAgICB0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QgPSBOVUxMOworICAgIGJjbWJhbF9pbnRlcmZhY2Vfa2V5IGludGZfa2V5OworICAgIGJjbWJhbF90bV9zY2hlZF9vd25lciBvd25lcjsKKwkKKyAgICBCVUdfT04oTlVMTCA9PSBtc2dfcGF5bG9hZCk7CisgICAgCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3F1ZXVlLCAgIlByb2Nlc3NpbmcgYSB0bSBxdWV1ZSBvYmplY3RcbiIpOworICAgIAorICAgIHRtX3F1ZXVlX2tleSA9IHBfdG1fcXVldWVfY2ZnLT5rZXk7ICAgCisgICAgb3Blcl90eXBlID0gcF90bV9xdWV1ZV9jZmctPmhkci5oZHIudHlwZTsKKyAgICAKKyAgICAvKgorICAgICogQSBtZXNzYWdlIHBvaW50ZXIgbWF5IGJlIHBhc3NlZCBpbnNpZGUgdGhlIGV2ZW50IHN0cnVjdHVyZS4KKyAgICAqLworICAgIGZzbV9ldmVudC5tc2cgPSBtc2dfcGF5bG9hZDsKKyAgICAKKyAgICAvKiBTRVQgb3IgR0VUIG9yIENMRUFSLi4uPyAqLworICAgIHN3aXRjaChvcGVyX3R5cGUpCisgICAgeworICAgICAgICBjYXNlKEJDTUJBTF9PQkpfTVNHX1RZUEVfU0VUKToKKyAgICAgICAgeworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fcXVldWUsICAiUHJvY2Vzc2luZyBhIHRtIHF1ZXVlIFNFVCBSRVEgbWdtdCBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgICAgICBpZihCQ01CQUxfU1RBVFVTX1VQICE9IGFjY190ZXJtX3N0YXR1c19nZXQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgIkVSUk9SIC0gQWNjZXNzLXRlcm1pbmFsIGlzIG5vdCBVUC4gTm8gZnVydGhlciBwcm9jZXNzaW5nXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLypGaW5kIHRoZSBzcGVjaWZpZWQgdG1fcXVldWUgaW5zdGFuY2UgaXMgYWxyZWFkeSBjcmVhdGVkICovCisgICAgICAgICAgICAgICAgcF90bV9xdWV1ZV9pbnN0ID0gdG1fcXVldWVfaW5zdF9nZXQodG1fcXVldWVfa2V5LCBUTV9RVUVVRV9GTEFHX0FDVElWRSk7CisJCQkJCisgICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBwX3RtX3F1ZXVlX2luc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIGEgZmF0YWwgZXJyb3IgY29uZGl0aW9uICovCisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFUlJPUiAtIHRtIHF1ZXVlIGZvdW5kLiAgU2V0IGFmdGVyIGNyZWF0ZSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4gTm8gZnVydGhlciBwcm9jZXNzaW5nXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisJCQkJCisgICAgICAgICAgICAgICAgcF90bV9xdWV1ZV9pbnN0ID0gdG1fcXVldWVfaW5zdF9nZXQodG1fcXVldWVfa2V5LCBUTV9RVUVVRV9GTEFHX0ZSRUUpOworICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcF90bV9xdWV1ZV9pbnN0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYSBmYXRhbCBlcnJvciBjb25kaXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVSUk9SIC0gdG0gcXVldWUgbm90IGZvdW5kLiAgTm8gZnVydGhlciBwcm9jZXNzaW5nXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCQkJCWlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IGJjbWJhbF90bV9xdWV1ZV92YWxpZGF0ZShwX3RtX3F1ZXVlX2NmZykpKQorCQkJCQkJCQkgIHsKKwkJCQkJCQkJCSAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLCAidG1fcXVldWUgZnNtIHZhbGlkYXRpb24gRmFpbGVkICglZClcbiIsIHJldCk7CisJCQkJCQkJCQkgIHRtX3F1ZXVlX2ZyZWVfYnlfZW50cnkocF90bV9xdWV1ZV9pbnN0KTsKKwkJCQkJCQkJCSAgYnJlYWs7CisJCQkJCQkJCSAgfQorCQkJCQkJCQkgIAorCQkJCQkJCQkgIAorCQkJCQkJCQkgIC8qIFBlcmZvcm0gdGhlIHZhbGlkYXRpb24gY2hlY2socykgdGhhdCB0aGUgdXRpbHMgcmVxdWlyZSAqLworCQkJCQkJCQkgIGlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IHN3X3V0aWxfdG1fcXVldWVfdmFsaWRhdGUocF90bV9xdWV1ZV9jZmcpKSkKKwkJCQkJCQkJICB7CisJCQkJCQkJCQkgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgInRtX3F1ZXVlIHN3aXRjaCB2YWxpZGF0aW9uIEZhaWxlZCAoJWQpXG4iLCByZXQpOworCQkJCQkJCQkJICB0bV9xdWV1ZV9mcmVlX2J5X2VudHJ5KHBfdG1fcXVldWVfaW5zdCk7CisJCQkJCQkJCQkgIGJyZWFrOworCQkJCQkJCQkgIH0KKworCQkJCQorCisJCQkJQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3F1ZXVlLAorCQkJCQkiQ3JlYXRpbmcgYSBuZXcgdG0gcXVldWVcbiIpOworCQkJCisgICAgICAgICAgICB9d2hpbGUoMCk7CisJCQkKKyAgICAgICAgICAgIHJldCA9IG1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChyZXQsIG1zZ19wYXlsb2FkLCBvcGVyX3R5cGUsIGxvZ19pZF90bV9xdWV1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwkJCQorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX3RtX3F1ZXVlX2NmZywgdG1fcXVldWUsIGNyZWF0aW9uX21vZGUsIEJDTUJBTF9UTV9DUkVBVElPTl9NT0RFX01BTlVBTCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJjbWJhbF90bV9xdWV1ZV9vYmplY3Rfb3ZlcmxheSgmcF90bV9xdWV1ZV9pbnN0LT5hcGlfcmVxX3RtX3F1ZXVlX2luZm8sIHBfdG1fcXVldWVfY2ZnKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZnNtX2V2ZW50LmV2ZW50X3R5cGUgPSBUTV9RVUVVRV9GU01fRVZFTlRfVFlQRV9DUkVBVEU7CisgICAgICAgICAgICBmc21fZXZlbnQubXNnID0gbXNnX3BheWxvYWQ7CisgICAgICAgICAgICByZXQgPSB0bV9xdWV1ZV9mc21fZXhlYyhwX3RtX3F1ZXVlX2luc3QsJmZzbV9ldmVudCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisJCQorICAgICAgICBjYXNlKEJDTUJBTF9PQkpfTVNHX1RZUEVfR0VUKToKKyAgICAgICAgeyAgICAgICAgCisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fcXVldWUsICAiUHJvY2Vzc2luZyBhIHRtIHF1ZXVlIEdFVCBSRVEgbWdtdCBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgIGlmKEJDTUJBTF9TVEFUVVNfVVAgIT0gYWNjX3Rlcm1fc3RhdHVzX2dldCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgIkVSUk9SIC0gQWNjZXNzLXRlcm1pbmFsIGlzIG5vdCBVUC4gIE5vIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpbmQgdGhlIHNwZWNpZmllZCB0bV9xdWV1ZSBpbnN0YW5jZSAqLworICAgICAgICAgICAgICAgIHBfdG1fcXVldWVfaW5zdCA9IHRtX3F1ZXVlX2luc3RfZ2V0KHRtX3F1ZXVlX2tleSwgVE1fUVVFVUVfRkxBR19BQ1RJVkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZihOVUxMID09IHBfdG1fcXVldWVfaW5zdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fcXVldWUsICAiRVJST1IgLSBTcGVjaWZpZWQgdG1fcXVldWUgKCVkKSBub3QgZm91bmRcbiIsIHRtX3F1ZXVlX2tleS5pZCk7CisgICAgICAgICAgICAgICAgcmV0ID0gIEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgIAl9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogV2UgcmVzcG9uZCB0byB0aGUgQkFMIHB1YmxpYyBBUEkgYmFja2VuZCB3aXRoIGEgcmVzdWx0LiBXZSBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNlbmQgYSBjb21wbGV0ZSBtc2dfcGF5bG9hZCBiYWNrIHRvIHRoZSBBUEksIGJ1dCB0aGUgZGF0YSBwb3J0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiBhIEdFVCBvciBHRVQtU1RBVFMgaGFzIGJlZW4gcmVxdWVzdGVkICovCisgICAgICAgICAgICAgICAgcF90bV9xdWV1ZV9pbnN0LT5hcGlfcmVxX3RtX3F1ZXVlX2luZm8uaGRyLmhkci5jb21tX2hkciA9ICgoYmNtYmFsX29iaiAqKW1zZ19wYXlsb2FkKS0+Y29tbV9oZHI7CisgICAgICAgICAgICAgICAgKigoYmNtYmFsX3RtX3F1ZXVlX2NmZyAqKW1zZ19wYXlsb2FkKSA9IHBfdG1fcXVldWVfaW5zdC0+YXBpX3JlcV90bV9xdWV1ZV9pbmZvOworICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsIG9wZXJfdHlwZSwgbG9nX2lkX3RtX3F1ZXVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGNhc2UoQkNNQkFMX09CSl9NU0dfVFlQRV9DTEVBUik6CisgICAgICAgIHsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3F1ZXVlLCAgIlByb2Nlc3NpbmcgYSB0bSBxdWV1ZSBDTEVBUiBSRVEgbWdtdCBtZXNzYWdlXG4iKTsKKyAgICAgICAgICAgICAgICBpZihCQ01CQUxfU1RBVFVTX1VQICE9IGFjY190ZXJtX3N0YXR1c19nZXQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgIkVSUk9SIC0gQWNjZXNzLXRlcm1pbmFsIGlzIG5vdCBVUC4gIE5vIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICogRmluZCB0aGUgc3BlY2lmaWVkIHRtX3F1ZXVlIGluc3RhbmNlCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwX3RtX3F1ZXVlX2luc3QgPSB0bV9xdWV1ZV9pbnN0X2dldCh0bV9xdWV1ZV9rZXksIFRNX1FVRVVFX0ZMQUdfQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZihOVUxMID09IHBfdG1fcXVldWVfaW5zdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgIlNwZWNpZmllZCB0bV9xdWV1ZSBub3QgZm91bmQgb24gQ0xFQVJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorCQkJCQorCisgICAgICAgICAgICAgICAgaWYoVE1fUVVFVUVfRlNNX1NUQVRFX0lOX1VTRSA9PSBwX3RtX3F1ZXVlX2luc3QtPmZzbV9zdGF0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgIlNwZWNpZmllZCB0bV9xdWV1ZSBpcyBpbiB1c2UgYW5kIGNhbiBub3QgYmUgcmVtb3ZlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisJCQkJLypUTV9RVUVVRXMgKGVpdGhlciBhdXRvIG9yIG1hbnVhbGx5IGNyZWF0ZWQpIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIFRNX05PREUgd2l0aCBvd25lciBpbnRlcmZhY2UgCisJCQkJbWF5IG9ubHkgYmUgZGVsZXRlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIGludGVyZmFjZSBpcyBpbiB0aGUgQURNSU4tRE9XTiBzdGF0ZSovCisJCQkgICAgdG1fc2NoZWRfa2V5LmlkID0gdG1fcXVldWVfa2V5LnNjaGVkX2lkOworCQkJCXRtX3NjaGVkX2tleS5kaXIgPSB0bV9xdWV1ZV9rZXkuc2NoZWRfZGlyOworCQkJCQorCQkJCXBfdG1fc2NoZWRfaW5zdCA9IHRtX3NjaGVkX2luc3RfZ2V0KHRtX3NjaGVkX2tleSwgVE1fU0NIRURfRkxBR19BQ1RJVkUpOworCQkJCWlmKE5VTEwgPT0gcF90bV9zY2hlZF9pbnN0KQorICAgICAgICAgICAgICAgIHsKKwkJCQkJQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLCAgIkVSUk9SOiBubyByZWxhdGVkIHRtX3NjaGVkIGZvdW5kIChpZCA9ICVkIGRpciA9ICVzKVxuIiwKKwkJCQkJCQkJCQkJCQkgICB0bV9zY2hlZF9rZXkuaWQsIFRNX1NDSEVEX0RJUl9UT19TVFIodG1fc2NoZWRfa2V5LmRpcikpOworCQkJCQlyZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisJCQkJaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmKHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8pLCB0bV9zY2hlZCwgb3duZXIpKQorCQkJCXsKKwkJCQkJb3duZXIgPSBwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXI7CisJCQkJCXN3aXRjaChvd25lci50eXBlKQorCQkJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0lOVEVSRkFDRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKwkJCQkJCQlpbnRmX2tleS5pbnRmX3R5cGUgPSBvd25lci51LmludGVyZmFjZS5pbnRmX3R5cGU7CisJCQkJCQkJaW50Zl9rZXkuaW50Zl9pZCA9IG93bmVyLnUuaW50ZXJmYWNlLmludGZfaWQ7CisJCQkJCQkJaWYoQkNNQkFMX1NUQVRVU19ET1dOICE9IGJjbWJhbF9pbnRlcmZhY2Vfc3RhdHVzX2dldChpbnRmX2tleSkpCisJCQkJCQkJeworCQkJCQkJCQlCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fcXVldWUsICJTcGVjaWZpZWQgdG1fcXVldWUgaXMgYXR0YWNoZWQgdG8gc2NoZWQgdGhhdCBpcyBvd25lZCBieSBpbnRlcmZhY2UgdGhhdCBpcyBub3QgYWRtaW4gZG93biwgYW5kIGNhbiBiZSByZW1vdmVkIG9ubHkgd2hlbiB0aGUgYXNzb2NpYXRlZCBpbnRlcmZhY2UgaXMgaW4gdGhlIEFETUlOLURPV04gc3RhdGVcbiIpOworCQkJCQkJCQlyZXQgPSBCQ01fRVJSX1BBUk07CisJCQkJCQkJCWJyZWFrOwkgICAKKwkJCQkJCQl9CQkKKyAgICAgICAgICAgICAgICAgICAgICAgCX0KKwkJCQkJCWJyZWFrOworCisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisgICAgICAgICAgICAgICAgLypnZW5lcmF0ZSBkZXN0cm95IGV2ZW50Ki8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmc21fZXZlbnQuZXZlbnRfdHlwZSA9IFRNX1FVRVVFX0ZTTV9FVkVOVF9UWVBFX0RFU1RST1k7CisgICAgICAgICAgICAgICAgZnNtX2V2ZW50Lm1zZyA9IG1zZ19wYXlsb2FkOworICAgICAgICAgICAgICAgIHJldCA9IHRtX3F1ZXVlX2ZzbV9leGVjKHBfdG1fcXVldWVfaW5zdCwmZnNtX2V2ZW50KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH13aGlsZSgwKTsKKyAgICAgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChyZXQsIG1zZ19wYXlsb2FkLCBvcGVyX3R5cGUsIGxvZ19pZF90bV9xdWV1ZSk7CQkJCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLCAgIlVuc3VwcG9ydGVkIG9wZXJhdGlvbiBvbiB0bSBxdWV1ZSBvYmplY3QgKCVkKVxuIiwgb3Blcl90eXBlICk7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIFdlIHJlc3BvbmQgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGJhY2tlbmQgd2l0aCBhIHJlc3VsdC4gV2UgYWx3YXlzCisgICAgICAgICAgICAqIHNlbmQgYSBjb21wbGV0ZSBtc2dfcGF5bG9hZCBiYWNrIHRvIHRoZSBBUEksIGJ1dCB0aGUgZGF0YSBwb3J0aW9uCisgICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgaXMgb25seSByZWxldmFudCB3aGVuIGEgR0VUIG9yIEdFVC1TVEFUUyBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsIG9wZXJfdHlwZSwgbG9nX2lkX3RtX3F1ZXVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fcXVldWUsICIlcyByZXR1cm5zXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiByZXQ7CisKK30KKworYmNtb3NfZXJybm8gYmNtYmFsX3RtX3F1ZXVlX2F1dG9fY3JlYXRlKGJjbWJhbF90bV9xdWV1ZV9jZmcgY2ZnKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgdG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0ID0gTlVMTDsKKyAgICBkbworICAgIHsKKyAgICAgICAgLypGaW5kIGEgZnJlZSB0bV9xdWV1ZSBpbnN0YW5jZSAqLworICAgICAgICBwX3RtX3F1ZXVlX2luc3QgPSB0bV9xdWV1ZV9pbnN0X2dldChjZmcua2V5LCBUTV9RVUVVRV9GTEFHX0ZSRUUpOworICAgICAgICBpZihOVUxMID09IHBfdG1fcXVldWVfaW5zdCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBpcyBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbiovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fcXVldWUsIkVSUk9SIC0gdG0gcXVldWUgbm90IGZvdW5kLiAgTm8gZnVydGhlciBwcm9jZXNzaW5nXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwX3RtX3F1ZXVlX2luc3QtPmFwaV9yZXFfdG1fcXVldWVfaW5mbyA9IGNmZzsKKyAgICAgICAgcmV0ID0gYmNtYmFsX3RtX3F1ZXVlX2NyZWF0ZShwX3RtX3F1ZXVlX2luc3QsTlVMTCwgTlVMTCk7CisgICAgfXdoaWxlKDApOworICAgIHJldHVybiByZXQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbWJhbF90bV9xdWV1ZV9hY3RpdmF0ZSh0bV9xdWV1ZV9pbnN0ICpwX3RtX3F1ZXVlX2luc3QpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBkbworICAgIHsKKworICAgICAgICByZXQgPSBzd191dGlsX3RtX3F1ZXVlX3NldChwX3RtX3F1ZXVlX2luc3QpOworICAgICAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLCAicXVldWUJY291bGQgbm90IGJlIHNldCBieSBzd2l0Y2hcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwX3RtX3F1ZXVlX2luc3QtPmZzbV9zdGF0ZSA9IFRNX1FVRVVFX0ZTTV9TVEFURV9BQ1RJVkU7IAorICAgICAgICAvKiBUaGUgaGFyZHdhcmUgaGFzIHByb3Blcmx5IGFjY2VwdGVkIHRoZSBvYmplY3QgaW5mbywgc28gdGhlIHJlcXVlc3Qgb2JqZWN0IGJlY29tZXMKKyAgICAgICAgKiB0aGUgY3VycmVudCBzdGF0ZS4KKyAgICAgICAgKi8KKyAgICAgICAgYmNtYmFsX3RtX3F1ZXVlX29iamVjdF9vdmVybGF5KCZwX3RtX3F1ZXVlX2luc3QtPmN1cnJlbnRfdG1fcXVldWVfaW5mbywKKyAgICAgICAgICAgICZwX3RtX3F1ZXVlX2luc3QtPmFwaV9yZXFfdG1fcXVldWVfaW5mbyk7CisgICAgCisgICAgfXdoaWxlKDApOworICAgIHJldHVybiByZXQ7CisKK30KKworYmNtb3NfZXJybm8gYmNtYmFsX3RtX3F1ZXVlX2RlYWN0aXZhdGUodG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgCisgICAgQlVHX09OKE5VTEwgPT0gcF90bV9xdWV1ZV9pbnN0KTsKKyAgICAKKyAgICBkbworICAgIHsKKyAgICAgICAgcmV0ID0gc3dfdXRpbF90bV9xdWV1ZV9jbGVhcihwX3RtX3F1ZXVlX2luc3QpOworICAgICAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLCAicXVldWUJY291bGQgbm90IGJlIHNldCBieSBzd2l0Y2hcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcF90bV9xdWV1ZV9pbnN0LT5mc21fc3RhdGUgPSBUTV9RVUVVRV9GU01fU1RBVEVfSU5BQ1RJVkU7ICAgICAKKyAgICB9d2hpbGUoMCk7CisgICAgcmV0dXJuIHJldDsKKworfQorc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF90bV9xdWV1ZV9jcmVhdGUodG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0LCAKKwkJCQkJCQkJCQkgICB2b2lkICptc2csIAorCQkJCQkJCQkJCSAgIHRtX3F1ZXVlX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGRvCisgICAgeworICAgICAgICBwX3RtX3F1ZXVlX2luc3QtPmZzbV9zdGF0ZSA9IFRNX1FVRVVFX0ZTTV9TVEFURV9JTkFDVElWRTsKKworICAgICAgICAvKnJlZmVyZW5jZWQgdG0gc2NoZWQgZXhpc3QgZm9yIHN1cmUgYXMgaXQgd2FzIGFscmVhZHkgdmFsaWRhdGVkKi8KKyAgICAgICAgcmV0ID0gYmNtYmFsX3RtX3NjaGVkX3NldF9xdWV1ZShwX3RtX3F1ZXVlX2luc3QpOyAgICAgICAgCisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fcXVldWUsICJxdWV1ZSAgY291bGQgbm90IGJlIGF0dGNoZWQgdG8gbm9kZSBcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9d2hpbGUoMCk7CisgICAgcmV0dXJuIHJldDsKKworfQorCitiY21vc19lcnJubyBiY21iYWxfdG1fcXVldWVfc2V0X293bmVyKGJjbWJhbF90bV9xdWV1ZV9rZXkga2V5KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgdG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0OworICAgIGRvCisgICAgeworICAgICAgICBwX3RtX3F1ZXVlX2luc3QgPSB0bV9xdWV1ZV9pbnN0X2dldChrZXksVE1fUVVFVUVfRkxBR19BQ1RJVkUpOworICAgICAgICBpZihOVUxMID09IHBfdG1fcXVldWVfaW5zdCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLCJFUlJPUiAtIHRtIHF1ZXVlIG5vdCBmb3VuZC4gIE5vIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuIik7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gYmNtYmFsX3RtX3F1ZXVlX2FjdGl2YXRlKHBfdG1fcXVldWVfaW5zdCk7CisgICAgfXdoaWxlKDApOworICAgIHJldHVybiByZXQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbWJhbF90bV9xdWV1ZV91bnNldF9vd25lcihiY21iYWxfdG1fcXVldWVfa2V5IGtleSkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOyAgICAKKyAgICB0bV9xdWV1ZV9pbnN0ICpwX3RtX3F1ZXVlX2luc3Q7CisgICAgZG8KKyAgICB7CisgICAgICAgIHBfdG1fcXVldWVfaW5zdCA9IHRtX3F1ZXVlX2luc3RfZ2V0KGtleSxUTV9RVUVVRV9GTEFHX0FDVElWRSk7CisgICAgICAgIGlmKE5VTEwgPT0gcF90bV9xdWV1ZV9pbnN0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fcXVldWUsIkVSUk9SIC0gdG0gcXVldWUgbm90IGZvdW5kLiAgTm8gZnVydGhlciBwcm9jZXNzaW5nXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBiY21iYWxfdG1fcXVldWVfZGVhY3RpdmF0ZShwX3RtX3F1ZXVlX2luc3QpOworICAgIAorICAgIH13aGlsZSgwKTsKKyAgICAKKyAgICByZXR1cm4gcmV0OworfQorCitiY21vc19lcnJubyBiY21iYWxfdG1fcXVldWVfdXNlX3NldCh0bV9xdWV1ZV9pbnN0ICpwX3RtX3F1ZXVlX2luc3QsIGJjbW9zX2Jvb2wgaXNfaW5fdXNlKQoreworICAgIGJjbW9zX2Vycm5vICByZXQgPSBCQ01fRVJSX09LOworICAgIAorICAgIEJVR19PTihOVUxMID09IHBfdG1fcXVldWVfaW5zdCk7CisgICAgaWYoaXNfaW5fdXNlKQorICAgIHsKKyAgICAgICAgLypxdWV1ZSBtaWdodCBhbHJlYWR5IGluIHJlcXVlc3RlZCBzdGF0ZSovCisgICAgICAgIHBfdG1fcXVldWVfaW5zdC0+ZnNtX3N0YXRlID0gVE1fUVVFVUVfRlNNX1NUQVRFX0lOX1VTRTsKKyAgICAgICAgcF90bV9xdWV1ZV9pbnN0LT5hcGlfcmVxX3RtX3F1ZXVlX2luZm8uZGF0YS5yZWZfY291bnQrKzsKKyAgICB9ICAgIAorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHBfdG1fcXVldWVfaW5zdC0+YXBpX3JlcV90bV9xdWV1ZV9pbmZvLmRhdGEucmVmX2NvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBwX3RtX3F1ZXVlX2luc3QtPmFwaV9yZXFfdG1fcXVldWVfaW5mby5kYXRhLnJlZl9jb3VudC0tOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZigwID09IHBfdG1fcXVldWVfaW5zdC0+YXBpX3JlcV90bV9xdWV1ZV9pbmZvLmRhdGEucmVmX2NvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfdG1fcXVldWVfaW5zdC0+ZnNtX3N0YXRlID0gVE1fUVVFVUVfRlNNX1NUQVRFX0FDVElWRTsJCQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3F1ZXVlLCAicXVldWUgKHNjaGVkLmlkID0gJWQgc2NoZWQuZGlyID0gJXMgcXVldWUuaWQgPSAlZCkgY291bGQgbm90IGJlIHVuc2V0IGFzIG5vIGZsb3dzIGFzc2lnbiB0byBpdCBcbiIsIHBfdG1fcXVldWVfaW5zdC0+YXBpX3JlcV90bV9xdWV1ZV9pbmZvLmtleS5zY2hlZF9pZCwgVE1fU0NIRURfRElSX1RPX1NUUihwX3RtX3F1ZXVlX2luc3QtPmFwaV9yZXFfdG1fcXVldWVfaW5mby5rZXkuc2NoZWRfZGlyKSwgcF90bV9xdWV1ZV9pbnN0LT5hcGlfcmVxX3RtX3F1ZXVlX2luZm8ua2V5LmlkKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYmNtb3NfZXJybm8gYmNtYmFsX3RtX3F1ZXVlX2Rlc3Ryb3kodG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0LCBiY21vc19ib29sIHJlbW92ZV9mcm9tX25vZGUpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBkbworICAgIHsKKyAgICAgICAgcF90bV9xdWV1ZV9pbnN0LT5mc21fc3RhdGUgPSBUTV9RVUVVRV9GU01fU1RBVEVfREVMRVRJTkc7CisgICAgICAgIGlmKHJlbW92ZV9mcm9tX25vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IGJjbWJhbF90bV9zY2hlZF9yZW1vdmVfcXVldWUocF90bV9xdWV1ZV9pbnN0KTsKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9xdWV1ZSwgInF1ZXVlIGNvdWxkIG5vdCBiZSBjbGVhYXJlZCBmcm9tIGl0cyB0bSBzY2hlZFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQkKKyAgICAgICAgcmV0ID0gdG1fcXVldWVfZnJlZV9ieV9lbnRyeShwX3RtX3F1ZXVlX2luc3QpOworICAgIH13aGlsZSgwKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX3RtX3F1ZXVlX2luYWN0aXZlX2Rlc3Ryb3kodG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0LCAKKwkJCQkJCQkJCQkgICB2b2lkICptc2csIAorCQkJCQkJCQkJCSAgIHRtX3F1ZXVlX2ZzbV9ldmVudCAqcF9ldmVudCkKK3sKKyAgICByZXR1cm4gYmNtYmFsX3RtX3F1ZXVlX2Rlc3Ryb3kocF90bV9xdWV1ZV9pbnN0LCBCQ01PU19UUlVFKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF90bV9xdWV1ZV9hY3RpdmVfZGVzdHJveSh0bV9xdWV1ZV9pbnN0ICpwX3RtX3F1ZXVlX2luc3QsIAorCQkJCQkJCQkJCSAgIHZvaWQgKm1zZywgCisJCQkJCQkJCQkJICAgdG1fcXVldWVfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgZG8KKyAgICB7CisgICAgICAgIHBfdG1fcXVldWVfaW5zdC0+ZnNtX3N0YXRlID0gVE1fUVVFVUVfRlNNX1NUQVRFX0RFTEVUSU5HOworICAgICAgICByZXQgPSBzd191dGlsX3RtX3F1ZXVlX2NsZWFyKHBfdG1fcXVldWVfaW5zdCk7CisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fcXVldWUsICJxdWV1ZSBjb3VsZCBub3QgYmUgY2xlYWFyZWQgZnJvbSB0aGUgc3dpdGNoXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldCA9IGJjbWJhbF90bV9xdWV1ZV9pbmFjdGl2ZV9kZXN0cm95KHBfdG1fcXVldWVfaW5zdCwgbXNnLCBwX2V2ZW50KTsKKyAgICB9d2hpbGUoMCk7CisgICAgcmV0dXJuIHJldDsKK30KKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi90bV9xdWV1ZV9mc20uaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vdG1fcXVldWVfZnNtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTI0MGNmMQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL21haW4vdG1fcXVldWVfZnNtLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIHRtX3F1ZXVlX2ZzbS5oCisgKiBAYnJpZWYgQ29kZSB0byBzdXBwb3J0IHRoZSBCQUwgdG1fcXVldWUgRlNNCisgKgorICovCisKKyNpZm5kZWYgVE1fUVVFVUVfRlNNX0gKKyNkZWZpbmUgVE1fUVVFVUVfRlNNX0gKKworLypAeyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiYWxfYXBpLmg+CisKKy8qIHNldCB0aGUgdG90YWwgcG9vbCBzaXplIG9mIGF2YWlsYWJsZSB0bSBxdWV1ZSB0byA0ayAqLworI2RlZmluZSBUTV9RVUVVRV9BTExPQ0FUSU9OX0JMT0NLX1NJWkUgICg0MDk2KQorCit0eXBlZGVmIGVudW0KK3sKKyAgICBUTV9RVUVVRV9GU01fRVZFTlRfVFlQRV9OT05FICAgICAgID0gLTEsCisgICAgVE1fUVVFVUVfRlNNX0VWRU5UX1RZUEVfQ1JFQVRFICAgICAsCisgICAgVE1fUVVFVUVfRlNNX0VWRU5UX1RZUEVfREVTVFJPWSAgICAsCisgICAgVE1fUVVFVUVfRlNNX0VWRU5UX1RZUEVfVVRJTF9NU0cgICAsCisKKyAgICBUTV9RVUVVRV9GU01fRVZFTlRfVFlQRV9fTEFTVCwKKyAgICBUTV9RVUVVRV9GU01fRVZFTlRfVFlQRV9fTlVNX09GCit9IHRtX3F1ZXVlX2ZzbV9ldmVudF90eXBlOworCisKKwordHlwZWRlZiBlbnVtCit7CisgICAgVE1fUVVFVUVfRlNNX1NUQVRFX05PTkUgPSAgICAgLTEsCisgICAgVE1fUVVFVUVfRlNNX1NUQVRFX05VTEwgICAgICAgICAsCisgICAgVE1fUVVFVUVfRlNNX1NUQVRFX0lOQUNUSVZFICAgICAsCisgICAgVE1fUVVFVUVfRlNNX1NUQVRFX0FDVElWRSAgICAgICAsCisgICAgVE1fUVVFVUVfRlNNX1NUQVRFX0lOX1VTRSAgICAgICAsCisgICAgVE1fUVVFVUVfRlNNX1NUQVRFX0RFTEVUSU5HICAgICAsCisgCisgICAgVE1fUVVFVUVfRlNNX1NUQVRFX19MQVNULAorICAgIFRNX1FVRVVFX0ZTTV9TVEFURV9fTlVNX09GCit9IHRtX3F1ZXVlX2ZzbV9zdGF0ZTsKKworCit0eXBlZGVmIGVudW0KK3sKKyAgICBUTV9RVUVVRV9GTEFHX0FDVElWRSA9ICAgICAxPDwwLCAgICAvKio8IEEgdG1fcXVldWUgaXMgb24gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgVE1fUVVFVUVfRkxBR19GUkVFID0gICAgICAgMTw8MSwgICAgLyoqPCBBIHRtX3F1ZXVlIGlzIG9uIHRoZSBmcmVlIGxpc3QgKi8KKyAgICBUTV9RVUVVRV9GTEFHX0FOWSA9ICAgICAgICAoVE1fUVVFVUVfRkxBR19BQ1RJVkUgfCBUTV9RVUVVRV9GTEFHX0ZSRUUpLCAgICAvKio8IEEgdG1fcXVldWUgaXMgb24gZWl0aGVyIHRoZSBhY3RpdmUgb3IgZnJlZSBsaXN0ICovCit9IHRtX3F1ZXVlX2ZsYWc7CisKKwordHlwZWRlZiBzdHJ1Y3QgdG1fcXVldWVfZnNtX2V2ZW50X3QKK3sKKyAgICB0bV9xdWV1ZV9mc21fZXZlbnRfdHlwZSBldmVudF90eXBlOyAgIC8qKjwgVGhlIHRtX3F1ZXVlIGZzbSBldmVudHMgKi8KKyAgICB2b2lkICAgICAgICAgICAgICptc2c7CisKKyAgICAvKiBvdGhlciBuZWNlc3NhcnkgaW5mb3JtYXRpb24gKi8KK30gdG1fcXVldWVfZnNtX2V2ZW50OworCisKK3R5cGVkZWYgc3RydWN0IHRtX3F1ZXVlX2luc3QgdG1fcXVldWVfaW5zdDsKK3N0cnVjdCB0bV9xdWV1ZV9pbnN0Cit7CisgICAgYmNtYmFsX3RtX3F1ZXVlX2NmZyAgICBjdXJyZW50X3RtX3F1ZXVlX2luZm87ICAgLyoqPCBUaGUgY3VycmVudCBpbmZvcm1hdGlvbiBmb3IgdGhpcyB0bSBxdWV1ZSAodXNlZCBmb3IgR0VUKSAqLworICAgIGJjbWJhbF90bV9xdWV1ZV9jZmcgICAgYXBpX3JlcV90bV9xdWV1ZV9pbmZvOyAgIC8qKjwgVGhlIHRtIHF1ZXVlICBvYmplY3QgaW5mbyByZWNlaXZlZCBmcm9tIHRoZSBQdWJsaWMgQVBJICovCisgICAgdG1fcXVldWVfZnNtX3N0YXRlICAgICBmc21fc3RhdGU7ICAgICAgICAgIC8qKjwgVGhlIHRtIHF1ZXVlIEZTTSBzdGF0ZSAqLworCisgICAgVEFJTFFfRU5UUlkodG1fcXVldWVfaW5zdCkgdG1fcXVldWVfaW5zdF9uZXh0OyAvKio8IFRBSUxRIGxpbmsgKi8KK307CisKKworLyogCisgKiB0bV9xdWV1ZSBGU00gZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3R5cGVkZWYgc3RydWN0IHRtX3F1ZXVlX2ZzbV9jdHgKK3sKKyAgICAvKiBMaXN0cyBvZiBmcmVlIHRtX3F1ZXVlIGVudHJpZXMgYW5kIGFjdGl2ZSB0bV9xdWV1ZSBlbnRyaWVzCisgICAgICovCisgICAgVEFJTFFfSEVBRChmcmVlX3RtX3F1ZXVlX2xpc3RfaGVhZCwgdG1fcXVldWVfaW5zdCkgZnJlZV90bV9xdWV1ZV9saXN0OworCisgICAgVEFJTFFfSEVBRChhY3RpdmVfdG1fcXVldWVfbGlzdF9oZWFkLCB0bV9xdWV1ZV9pbnN0KSBhY3RpdmVfdG1fcXVldWVfbGlzdDsKKworfSB0bV9xdWV1ZV9mc21fY3R4OworCisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworCitleHRlcm4gYmNtb3NfZXJybm8gdG1fcXVldWVfZnNtX2luaXQodm9pZCk7CitleHRlcm4gYmNtb3NfZXJybm8gdG1fcXVldWVfZnNtX2ZpbmlzaCh2b2lkKTsKK2V4dGVybiBiY21vc19lcnJubyBwcm9jZXNzX3RtX3F1ZXVlX29iamVjdCh2b2lkICptc2dfcGF5bG9hZCk7CisKK2V4dGVybiB0bV9xdWV1ZV9pbnN0ICp0bV9xdWV1ZV9pbnN0X2dldChiY21iYWxfdG1fcXVldWVfa2V5IGtleSwgdG1fcXVldWVfZmxhZyBzZWFyY2hfZmxhZyk7CitleHRlcm4gYmNtb3NfZXJybm8gYmNtYmFsX3RtX3F1ZXVlX2F1dG9fY3JlYXRlKGJjbWJhbF90bV9xdWV1ZV9jZmcgdG1fcXVldWVfZGVmYXVsdF9jZmcpOworZXh0ZXJuIGJjbW9zX2Vycm5vIGJjbWJhbF90bV9xdWV1ZV9zZXRfb3duZXIoYmNtYmFsX3RtX3F1ZXVlX2tleSBrZXkpOworZXh0ZXJuIGJjbW9zX2Vycm5vIGJjbWJhbF90bV9xdWV1ZV91bnNldF9vd25lcihiY21iYWxfdG1fcXVldWVfa2V5IGtleSk7CisKK2V4dGVybiBiY21vc19lcnJubyBiY21iYWxfdG1fcXVldWVfYWN0aXZhdGUodG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0KTsKK2V4dGVybiBiY21vc19lcnJubyBiY21iYWxfdG1fcXVldWVfZGVhY3RpdmF0ZSh0bV9xdWV1ZV9pbnN0ICpwX3RtX3F1ZXVlX2luc3QpOworZXh0ZXJuIGJjbW9zX2Vycm5vIGJjbWJhbF90bV9xdWV1ZV91c2Vfc2V0KHRtX3F1ZXVlX2luc3QgKnBfdG1fcXVldWVfaW5zdCwgYmNtb3NfYm9vbCBpc19pbl91c2UpOworZXh0ZXJuIGJjbW9zX2Vycm5vIGJjbWJhbF90bV9xdWV1ZV9kZXN0cm95KHRtX3F1ZXVlX2luc3QgKnBfdG1fcXVldWVfaW5zdCwgYmNtb3NfYm9vbCByZW1vdmVfZnJvbV9ub2RlKTsKKworCisKKy8qQH0qLworCisjZW5kaWYgLypUTV9RVUVVRV9GU01fSCAqLworCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL3RtX3NjaGVkX2ZzbS5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi90bV9zY2hlZF9mc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDQyNGNiCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi90bV9zY2hlZF9mc20uYwpAQCAtMCwwICsxLDIyMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIHRtX3NjaGVkX2ZzbS5jCisgKiBAYnJpZWYgQ29kZSB0byBzdXBwb3J0IHRoZSBCQUwgdG1fc2NoZWQgRlNNCisgKgorICoKKyAqLworCisvKkB7Ki8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPHRtX3NjaGVkX2ZzbS5oPgorI2luY2x1ZGUgPGJhbF9tc2cuaD4KKyNpbmNsdWRlIDxiYWxfb3Ntc2cuaD4KKyNpbmNsdWRlICJiYWxfd29ya2VyLmgiCisjaW5jbHVkZSAiYmFsX21hY191dGlsLmgiCisjaW5jbHVkZSAiYmFsX3N3aXRjaF91dGlsLmgiCisjaW5jbHVkZSA8YmFsX2FwaS5oPgorLy8jaW5jbHVkZSA8YmFsX21hY191dGlsX2NvbW1vbl9pdHVfcG9uLmg+CisKKworI2luY2x1ZGUgPGJhbF9vYmpzLmg+CisjaW5jbHVkZSA8ZnNtX2NvbW1vbi5oPgorCisjaWZkZWYgRU5BQkxFX0xPRworI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisKKyAvKgorICogQGJyaWVmIFRoZSBsb2dnaW5nIGRldmljZSBpZCBmb3IgdG0gc2NoZWQKKyAqLworc3RhdGljIGRldl9sb2dfaWQgbG9nX2lkX3RtX3NjaGVkOworI2VuZGlmCisKKy8qIGxvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gdG1fc2NoZWRfZnNtX2NyZWF0ZSh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bV9zY2hlZF9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gdG1fc2NoZWRfZnJlZV9ieV9lbnRyeSh0bV9zY2hlZF9pbnN0ICpwX2VudHJ5KTsKK3N0YXRpYyB2b2lkIHRtX3NjaGVkX2luc3RfZW50cnlfb2JqX2luaXQodG1fc2NoZWRfaW5zdCAqcF9lbnRyeSk7CitzdGF0aWMgYmNtb3NfZXJybm8gcXVldWVzX2xpc3RfZmlsbCh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4ICpxdWV1ZXNfbGlzdCk7CisKKworc3RhdGljIGJjbW9zX2Vycm5vIHRtX3NjaGVkX2ZzbV9zdGF0ZV9lcnIodG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtX3NjaGVkX2ZzbV9ldmVudCAqcF9ldmVudCk7CitzdGF0aWMgYmNtb3NfZXJybm8gdG1fc2NoZWRfZnNtX2Fzc2lnbmVkX3Byb2Nlc3NfdXRpbF9tc2codG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtX3NjaGVkX2ZzbV9ldmVudCAqcF9ldmVudCk7CitzdGF0aWMgYmNtb3NfZXJybm8gdG1fc2NoZWRfZnNtX2RlbGV0aW5nX3Byb2Nlc3NfdXRpbF9tc2codG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtX3NjaGVkX2ZzbV9ldmVudCAqcF9ldmVudCk7CisKK3N0YXRpYyBiY21vc19lcnJubyB0bV9zY2hlZF9mc21faW5hY3RpdmVfZGVzdHJveSh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1fc2NoZWRfZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIHRtX3NjaGVkX2ZzbV9hY3RpdmVfZGVzdHJveSh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1fc2NoZWRfZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIHRtX3NjaGVkX2ZzbV9hc3NpZ25lZF9kZXN0cm95KHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bV9zY2hlZF9mc21fZXZlbnQgKnBfZXZlbnQpOworCitzdGF0aWMgYmNtb3NfZXJybm8gdG1fc2NoZWRfZnNtX2Rlc3Ryb3kodG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZF9pbnN0KTsKKworc3RhdGljIGJjbW9zX2Vycm5vIHRtX3NjaGVkX2ZzbV9leGVjKHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCwgdG1fc2NoZWRfZnNtX2V2ZW50ICpwX2V2ZW50KTsKKworc3RhdGljIHRtX3NjaGVkX2luc3QqIHRtX3NjaGVkX2ZpbmRfYnlfb3duZXIoYmNtYmFsX3RtX3NjaGVkX293bmVyIG93bmVyKTsKKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF90bV9zY2hlZF9zdWJfc2NoZWRzX2xpc3RfZW50cnlfYWRkKHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCwgYmNtYmFsX3RtX3NjaGVkX2lkIHNjaGVkX2lkKTsKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfc3ViX3NjaGVkc19saXN0X2VudHJ5X3JlbW92ZSh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsIGJjbWJhbF90bV9zY2hlZF9pZCBzY2hlZF9pZCk7CisKK3N0YXRpYyBiY21vc19lcnJubyBzdWJfc2NoZWRzX2xpc3RfZmlsbCh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsIGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4ICpzdWJfc2NoZWRzX2xpc3QpOworLyoKKyAqIEBicmllZiBUaGUgR2xvYmFsIHRtX3NjaGVkIGZzbSBjb250ZXh0IGRhdGEgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB0bV9zY2hlZF9mc21fY3R4IGdfdG1fc2NoZWRfZnNtX3RtX3NjaGVkX2xpc3RfY3R4OworCisvKgorICogTWFjcm9zIGZvciB0bV9zY2hlZCBjdHggYWNjZXNzCisgKi8KKyNkZWZpbmUgVE1fU0NIRURfRlNNX1RNX1NDSEVEX0xJU1RfQ1RYICAgICAgKGdfdG1fc2NoZWRfZnNtX3RtX3NjaGVkX2xpc3RfY3R4KQorI2RlZmluZSBUTV9TQ0hFRF9GU01fVE1fU0NIRURfTElTVF9DVFhfUFRSICAoJmdfdG1fc2NoZWRfZnNtX3RtX3NjaGVkX2xpc3RfY3R4KQorCisKKy8qCisgKiAgQGJyaWVmIFRoZSBkZWZpbml0aW9uIG9mIGEgdG1fc2NoZWQgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24KKyAqLwordHlwZWRlZiBiY21vc19lcnJubyAoKiB0bV9zY2hlZF9mc21fc3RhdGVfcHJvY2Vzc29yKSh0bV9zY2hlZF9pbnN0ICosIHZvaWQgKiwgdG1fc2NoZWRfZnNtX2V2ZW50ICopOworLyoKKyAqICBAYnJpZWYgVGhlIHRtIHNjaGVkIEZTTSBzdGF0ZSBwcm9jZXNzaW5nIGFycmF5CisgKi8KK3N0YXRpYyB0bV9zY2hlZF9mc21fc3RhdGVfcHJvY2Vzc29yIHRtX3NjaGVkX3N0YXRlc1tUTV9TQ0hFRF9GU01fU1RBVEVfX05VTV9PRl1bVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfX05VTV9PRl0gPQoreworCisgICAgW1RNX1NDSEVEX0ZTTV9TVEFURV9OVUxMXSA9CisgICAgeworICAgICAgICBbVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfQ1JFQVRFXSAgPSB0bV9zY2hlZF9mc21fY3JlYXRlLAorICAgICAgICBbVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfREVTVFJPWV0gPSB0bV9zY2hlZF9mc21fc3RhdGVfZXJyLAorICAgICAgICBbVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfQVNTSUdOXSA9IHRtX3NjaGVkX2ZzbV9zdGF0ZV9lcnIsCisgICAgICAgIFtUTV9TQ0hFRF9GU01fRVZFTlRfVFlQRV9VVElMX01TR10gID0gdG1fc2NoZWRfZnNtX3N0YXRlX2VyciwKKworICAgIH0sCisgICAgW1RNX1NDSEVEX0ZTTV9TVEFURV9JTkFDVElWRV0gPQorICAgIHsKKyAgICAgICAgW1RNX1NDSEVEX0ZTTV9FVkVOVF9UWVBFX0NSRUFURV0gID0gdG1fc2NoZWRfZnNtX3N0YXRlX2VyciwKKyAgICAgICAgW1RNX1NDSEVEX0ZTTV9FVkVOVF9UWVBFX0RFU1RST1ldID0gdG1fc2NoZWRfZnNtX2luYWN0aXZlX2Rlc3Ryb3ksCisgICAgICAgIFtUTV9TQ0hFRF9GU01fRVZFTlRfVFlQRV9BU1NJR05dID0gdG1fc2NoZWRfZnNtX3N0YXRlX2VyciwKKyAgICAgICAgW1RNX1NDSEVEX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHXSAgPSB0bV9zY2hlZF9mc21fc3RhdGVfZXJyLAorICAgIH0sCisgICAgW1RNX1NDSEVEX0ZTTV9TVEFURV9BU1NJR05FRF0gPQorICAgIHsKKyAgICAgICAgW1RNX1NDSEVEX0ZTTV9FVkVOVF9UWVBFX0NSRUFURV0gID0gdG1fc2NoZWRfZnNtX3N0YXRlX2VyciwKKyAgICAgICAgW1RNX1NDSEVEX0ZTTV9FVkVOVF9UWVBFX0RFU1RST1ldID0gdG1fc2NoZWRfZnNtX2Fzc2lnbmVkX2Rlc3Ryb3ksCisgICAgICAgIFtUTV9TQ0hFRF9GU01fRVZFTlRfVFlQRV9BU1NJR05dID0gdG1fc2NoZWRfZnNtX3N0YXRlX2VyciwKKyAgICAgICAgW1RNX1NDSEVEX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHXSAgPSB0bV9zY2hlZF9mc21fYXNzaWduZWRfcHJvY2Vzc191dGlsX21zZywKKyAgICB9LAorCVtUTV9TQ0hFRF9GU01fU1RBVEVfQUNUSVZFXSA9CisJeworCQlbVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfQ1JFQVRFXSAgPSB0bV9zY2hlZF9mc21fc3RhdGVfZXJyLAorCQlbVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfREVTVFJPWV0gPSB0bV9zY2hlZF9mc21fYWN0aXZlX2Rlc3Ryb3ksCisJCVtUTV9TQ0hFRF9GU01fRVZFTlRfVFlQRV9BU1NJR05dID0gdG1fc2NoZWRfZnNtX3N0YXRlX2VyciwKKwkJW1RNX1NDSEVEX0ZTTV9FVkVOVF9UWVBFX1VUSUxfTVNHXSAgPSB0bV9zY2hlZF9mc21fc3RhdGVfZXJyLAorCX0sCisKKyAgICBbVE1fU0NIRURfRlNNX1NUQVRFX0RFTEVUSU5HXSA9CisgICAgeworICAgICAgICBbVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfQ1JFQVRFXSAgPSB0bV9zY2hlZF9mc21fc3RhdGVfZXJyLAorICAgICAgICBbVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfREVTVFJPWV0gPSB0bV9zY2hlZF9mc21fc3RhdGVfZXJyLAorICAgICAgICBbVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfQVNTSUdOXSA9IHRtX3NjaGVkX2ZzbV9zdGF0ZV9lcnIsCisgICAgICAgIFtUTV9TQ0hFRF9GU01fRVZFTlRfVFlQRV9VVElMX01TR10gID0gdG1fc2NoZWRfZnNtX2RlbGV0aW5nX3Byb2Nlc3NfdXRpbF9tc2csCisKKyAgICB9LAorCit9OworCitzdGF0aWMgY2hhciAqc3RhdGVfbmFtZV9zdHJbXSA9Cit7CisgICAgIlRNX1NDSEVEX0ZTTV9TVEFURV9OVUxMIiwKKyAgICAiVE1fU0NIRURfRlNNX1NUQVRFX0lOQUNUSVZFIiwJCQorICAgICJUTV9TQ0hFRF9GU01fU1RBVEVfQVNTSUdORUQiLAorICAgICJUTV9TQ0hFRF9GU01fU1RBVEVfQUNUSVZFIiwKKyAgICAiVE1fU0NIRURfRlNNX1NUQVRFX0RFTEVUSU5HIiwKK307CisKKy8qIEVuc3VyZSB0aGF0IHRoZSBuYW1lIGFycmF5IHNpemUgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBlbnVtICovCitCQUxfU1RBVElDX0FTU0VSVChUTV9TQ0hFRF9GU01fU1RBVEVfX0xBU1QgPT0gKHNpemVvZiAoc3RhdGVfbmFtZV9zdHIpIC8gc2l6ZW9mIChjaGFyICopKSwgdG1fc2NoZWRfZnNtX3N0YXRlKTsKKworc3RhdGljIGNoYXIgKnRtX3NjaGVkX3N0YXRlX25hbWVfZ2V0KHRtX3NjaGVkX2ZzbV9zdGF0ZSBzdGF0ZSkKK3sKKyAgICBpZihzdGF0ZSA8IFRNX1NDSEVEX0ZTTV9TVEFURV9fTEFTVCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0ZV9uYW1lX3N0cltzdGF0ZV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAiVE1fU0NIRURfVU5LTk9XTiI7CisgICAgfQorfQorCitzdGF0aWMgY2hhciAqZXZlbnRfbmFtZV9zdHJbXSA9Cit7CisgICAgIlRNX1NDSEVEX0ZTTV9DUkVBVEVfRVZFTlQiLAorICAgICJUTV9TQ0hFRF9GU01fREVTVFJPWV9FVkVOVCIsCisgICAgIlRNX1NDSEVEX0ZTTV9BU1NJR05fRVZFTlQiLAorICAgICJGTE9XX0ZTTV9VVElMX01TR19FVkVOVCIsCit9OworCisvKiBFbnN1cmUgdGhhdCB0aGUgbmFtZSBhcnJheSBzaXplIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgZW51bSAqLworQkFMX1NUQVRJQ19BU1NFUlQoVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfX0xBU1QgPT0gKHNpemVvZiAoZXZlbnRfbmFtZV9zdHIpIC8gc2l6ZW9mIChjaGFyICopKSwgdG1fc2NoZWRfZnNtX2V2ZW50X3R5cGUpOworCitzdGF0aWMgY2hhciAqdG1fc2NoZWRfZXZlbnRfbmFtZV9nZXQodG1fc2NoZWRfZnNtX2V2ZW50X3R5cGUgZXZlbnQpCit7CisgICAgaWYoZXZlbnQgPCBUTV9TQ0hFRF9GU01fRVZFTlRfVFlQRV9fTEFTVCkKKyAgICB7CisgICAgICAgIHJldHVybiBldmVudF9uYW1lX3N0cltldmVudF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAiVE1fU0NIRURfRVZUX1VOS05PV04iOworICAgIH0KK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSB0bSBzY2hlZCBGU00gaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogICAgICAgIE5PVEU6IFRoaXMgaXMgY2FsbGVkIG9uY2Ugb24gc3RhcnR1cCBhbmQgTk9UIGZvciBlYWNoIEZTTSBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gdG1fc2NoZWRfZnNtX2luaXQodm9pZCkKK3sKKyAgICBpbnQgaWk7CisgICAgdG1fc2NoZWRfaW5zdCAqbmV3X2VudHJ5OworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgbG9nX2lkX3RtX3NjaGVkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoIlRNX1NDSEVEIiwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgQlVHX09OKGxvZ19pZF90bV9zY2hlZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpOworI2VuZGlmCisKKyAgICAvKiBJbml0aWFsaXplIGFsbCBvZiB0aGUgdG1fc2NoZWQgcXVldWVzICovCisgICAgVEFJTFFfSU5JVCgmVE1fU0NIRURfRlNNX1RNX1NDSEVEX0xJU1RfQ1RYX1BUUi0+ZnJlZV90bV9zY2hlZF9saXN0KTsKKyAgICBUQUlMUV9JTklUKCZUTV9TQ0hFRF9GU01fVE1fU0NIRURfTElTVF9DVFhfUFRSLT5hY3RpdmVfdG1fc2NoZWRfbGlzdCk7CisKKyAgICAvKiBQb3B1bGF0ZSB0aGUgZnJlZSBsaXN0IHdpdGggaXQncyBpbml0aWFsIHNldCBvZiB0bV9zY2hlZHMgKi8KKyAgICBmb3IoaWk9MDsgaWk8VE1fU0NIRURfQUxMT0NBVElPTl9CTE9DS19TSVpFOyBpaSsrKQorICAgIHsKKworICAgICAgICBuZXdfZW50cnkgPSBiY21vc19jYWxsb2Moc2l6ZW9mKHRtX3NjaGVkX2luc3QpKTsKKworICAgICAgICBpZihOVUxMID09IG5ld19lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhGQVRBTCwgbG9nX2lkX3RtX3NjaGVkLCAgIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB0bV9zY2hlZCBmcmVlIGxpc3QgLSBGQVRBTFxuIik7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgIHRtX3NjaGVkX2ZyZWVfYnlfZW50cnkobmV3X2VudHJ5KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRvIHVuLWluaXRpYWxpemUgdGhlIHRtIHNjaGVkIEZTTSBpbmZyYXN0cnVjdHVyZS4KKyAqCisgKiAgICAgICAgTk9URTogVGhpcyBpcyBjYWxsZWQgb25jZSBvbiBzaHV0ZG93biBhbmQgTk9UIGZvciBlYWNoIEZTTSBpbnN0YW5jZS4KKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gdG1fc2NoZWRfZnNtX2ZpbmlzaCh2b2lkKQoreworCisgICAgdG1fc2NoZWRfaW5zdCAqY3VycmVudF9lbnRyeSwgKnBfdGVtcF9lbnRyeTsKKworICAgIC8qIEZyZWUgYWxsIHRoZSBlbnRyaWVzIG9uIHRoZSBhY3RpdmUgbGlzdCAqLworICAgIFRBSUxRX0ZPUkVBQ0hfU0FGRShjdXJyZW50X2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAmVE1fU0NIRURfRlNNX1RNX1NDSEVEX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX3RtX3NjaGVkX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIHRtX3NjaGVkX2luc3RfbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgcF90ZW1wX2VudHJ5KQorICAgIHsKKyAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgICAgIFRBSUxRX1JFTU9WRSgmVE1fU0NIRURfRlNNX1RNX1NDSEVEX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX3RtX3NjaGVkX2xpc3QsIGN1cnJlbnRfZW50cnksIHRtX3NjaGVkX2luc3RfbmV4dCk7CisKKyAgICAgICAgYmNtb3NfZnJlZShjdXJyZW50X2VudHJ5KTsKKworICAgIH0KKworICAgIC8qIEZyZWUgYWxsIHRoZSBlbnRyaWVzIG9uIHRoZSBmcmVlIGxpc3QgKi8KKyAgICBUQUlMUV9GT1JFQUNIX1NBRkUoY3VycmVudF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgJlRNX1NDSEVEX0ZTTV9UTV9TQ0hFRF9MSVNUX0NUWF9QVFItPmZyZWVfdG1fc2NoZWRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdG1fc2NoZWRfaW5zdF9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBwX3RlbXBfZW50cnkpCisgICAgeworICAgICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgYWN0aXZlIGxpc3QgKi8KKyAgICAgICAgVEFJTFFfUkVNT1ZFKCZUTV9TQ0hFRF9GU01fVE1fU0NIRURfTElTVF9DVFhfUFRSLT5mcmVlX3RtX3NjaGVkX2xpc3QsIGN1cnJlbnRfZW50cnksIHRtX3NjaGVkX2luc3RfbmV4dCk7CisKKyAgICAgICAgYmNtb3NfZnJlZShjdXJyZW50X2VudHJ5KTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byByZXRyaWV2ZSBhIHRtX3NjaGVkIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCisgKgorICogQHBhcmFtIGtleSAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUga2V5IG9mIHRoZSB0bV9zY2hlZCBiZWluZyByZWZlcmVuY2VkCisgKiBAcGFyYW0gc2VhcmNoX2ZsYWcgICAgQSBmbGFnIHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgdG1fc2NoZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSB0byBiZSByZXRyaWV2ZWQKKyAqCisgKiBAcmV0dXJucyB0bV9zY2hlZF9pbnN0X3QqIEEgcG9pbnRlciB0byB0aGUgZm91bmQgdG1fc2NoZWQgaW5zdGFuY2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3IgTlVMTCBpZiBvbmUgaXMgbm90IGZvdW5kCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0bV9zY2hlZF9pbnN0ICp0bV9zY2hlZF9pbnN0X2dldChiY21iYWxfdG1fc2NoZWRfa2V5IGtleSwgdG1fc2NoZWRfZmxhZyBzZWFyY2hfZmxhZykKK3sKKyAgICB0bV9zY2hlZF9pbnN0ICpjdXJyZW50X2VudHJ5ID0gTlVMTDsKKworICAgIC8qCisgICAgICogRmlyc3QsIGNoZWNrIHRoZSBhY3RpdmUgbGlzdCBpZiB0aGUgY2FsbGVyIGhhcyBjaG9zZW4gdG8gZG8gc28KKyAgICAgKi8KKyAgICBpZihUTV9TQ0hFRF9GTEFHX0FDVElWRSAmIHNlYXJjaF9mbGFnKQorICAgIHsKKyAgICAgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICZUTV9TQ0hFRF9GU01fVE1fU0NIRURfTElTVF9DVFhfUFRSLT5hY3RpdmVfdG1fc2NoZWRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICB0bV9zY2hlZF9pbnN0X25leHQpCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYoY3VycmVudF9lbnRyeS0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmlkID09IGtleS5pZAorCQkJCSYmIGN1cnJlbnRfZW50cnktPnJlcV90bV9zY2hlZF9pbmZvLmtleS5kaXIgPT0ga2V5LmRpcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fc2NoZWQsICAiRm91bmQgYWN0aXZlIHRtX3NjaGVkXG4iKTsKKyAgICAgICAgICAgICAgICAvKiBUaGUgdG1fc2NoZWQgaW5zdGFuY2UgcG9pbnRlciBpcyBpbiBjdXJyZW50X2VudHJ5ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIE5leHQsIGNoZWNrIHRoZSBmcmVlIGxpc3QgaWYgdGhlIGNhbGxlciBoYXMgY2hvc2VuIHRvIGRvIHNvCisgICAgICovCisgICAgaWYoKFRNX1NDSEVEX0ZMQUdfRlJFRSAmIHNlYXJjaF9mbGFnKSAmJiAoTlVMTCA9PSBjdXJyZW50X2VudHJ5KSkKKyAgICB7CisgICAgICAgIC8qIE5vdyBjaGVjayB0aGUgZnJlZSBsaXN0ICovCisgICAgICAgIGlmKCFUQUlMUV9FTVBUWSgmVE1fU0NIRURfRlNNX1RNX1NDSEVEX0xJU1RfQ1RYX1BUUi0+ZnJlZV90bV9zY2hlZF9saXN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogSnVzdCBncmFiIHRoZSBmaXJzdCBlbnRyeSAqLworICAgICAgICAgICAgY3VycmVudF9lbnRyeSA9IFRBSUxRX0ZJUlNUKCZUTV9TQ0hFRF9GU01fVE1fU0NIRURfTElTVF9DVFhfUFRSLT5mcmVlX3RtX3NjaGVkX2xpc3QpOworCisgICAgICAgICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgZnJlZSBsaXN0ICovCisgICAgICAgICAgICBUQUlMUV9SRU1PVkUoJlRNX1NDSEVEX0ZTTV9UTV9TQ0hFRF9MSVNUX0NUWF9QVFItPmZyZWVfdG1fc2NoZWRfbGlzdCwgY3VycmVudF9lbnRyeSwgdG1fc2NoZWRfaW5zdF9uZXh0KTsKKworICAgICAgICAgICAgLyogQW5kIGFkZCBpdCB0byB0aGUgYWN0aXZlIGxpc3QgKi8KKyAgICAgICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZUTV9TQ0hFRF9GU01fVE1fU0NIRURfTElTVF9DVFhfUFRSLT5hY3RpdmVfdG1fc2NoZWRfbGlzdCwgY3VycmVudF9lbnRyeSwgdG1fc2NoZWRfaW5zdF9uZXh0KTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEluaXRpYWxpemUgdGhlIGZzbSBzdGF0ZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjdXJyZW50X2VudHJ5LT5mc21fc3RhdGUgPSBUTV9TQ0hFRF9GU01fU1RBVEVfTlVMTDsKKworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3NjaGVkLCAgIlVzaW5nIG5ldyB0bV9zY2hlZFxuIik7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKChUTV9TQ0hFRF9GTEFHX0FOWSAmIHNlYXJjaF9mbGFnKSAmJiAoTlVMTCA9PSBjdXJyZW50X2VudHJ5KSkKKyAgICB7CisgICAgICAgIC8qQSB0bV9zY2hlZCB3YXMgbm90IGZvdW5kIG9uIGVpdGhlciBsaXN0ICovCisKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3NjaGVkLCAgIioqKioqKioqKioqKioqIEVSUk9SOiBubyB0bV9zY2hlZCBmb3VuZFxuIik7CisgICAgfQorCisgICAgcmV0dXJuIGN1cnJlbnRfZW50cnk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfdmFsaWRhdGVfc2NoZWRfcGFyZW50KGNvbnN0IGJjbWJhbF90bV9zY2hlZF9jZmcgKnBfdG1fc2NoZWRfY2ZnLCB0bV9zY2hlZF9pbnN0ICoqcF9wYXJlbnRfdG1fc2NoZWRfaW5zdCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJjbWJhbF90bV9zY2hlZF9rZXkgdG1fc2NoZWRfa2V5OworICAgIHRtX3NjaGVkX2tleS5kaXIgPSBwX3RtX3NjaGVkX2NmZy0+a2V5LmRpcjsKKyAgICB0bV9zY2hlZF9rZXkuaWQgPSBwX3RtX3NjaGVkX2NmZy0+ZGF0YS5zY2hlZF9wYXJlbnQuc2NoZWRfaWQ7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgKCpwX3BhcmVudF90bV9zY2hlZF9pbnN0KSA9IHRtX3NjaGVkX2luc3RfZ2V0KHRtX3NjaGVkX2tleSwgVE1fU0NIRURfRkxBR19BQ1RJVkUpOworICAgICAgICBpZihOVUxMID09ICgqcF9wYXJlbnRfdG1fc2NoZWRfaW5zdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgIlNjaGVkIHBhcmVudCBkaXIgPSAlcyBpZCA9ICVkIGRvZXMgbm90IGV4aXN0IGFuZCB0aGVyZWZvciBjYW4gbm90IGJlIHNldCBhdCB0aGUgdG0gc2NoZWQgcGFyZW50XG4iLAorICAgICAgICAgICAgVE1fU0NIRURfRElSX1RPX1NUUih0bV9zY2hlZF9rZXkuZGlyKSwgdG1fc2NoZWRfa2V5LmlkKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qY2hlY2sgd2VpZ2h0L3ByaW9yaXR5IHNldHRpbmcgYmFzZWQgb24gcGFyZW50IHNjaGVkX3R5cGUqLworICAgICAgICBpZihCQ01CQUxfVE1fU0NIRURfVFlQRV9TUCA9PSAoKnBfcGFyZW50X3RtX3NjaGVkX2luc3QpLT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLnNjaGVkX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCYocF90bV9zY2hlZF9jZmctPmRhdGEuc2NoZWRfcGFyZW50KSwgdG1fc2NoZWRfcGFyZW50LCBwcmlvcml0eSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAiU2NoZWQgcGFyZW50IG11c3QgYmUgc2V0IHdpdGggYSBwcmlvcml0eSwgYXMgaXRzIHNjaGVkX3BhcmVudCcgc2NoZWRfdHlwZSBpcyBzcFxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmKHBfdG1fc2NoZWRfY2ZnLT5kYXRhLnNjaGVkX3BhcmVudCksIHRtX3NjaGVkX3BhcmVudCwgd2VpZ2h0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsICJTY2hlZCBwYXJlbnQgY2FuIG5vdCBiZSBzZXQgd2l0aCBhIHdlaWdodCwgYXMgaXRzIHNjaGVkX3BhcmVudCcgc2NoZWRfdHlwZSBpcyBzcFxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocF90bV9zY2hlZF9jZmctPmRhdGEuc2NoZWRfcGFyZW50LnByaW9yaXR5ID49ICgqcF9wYXJlbnRfdG1fc2NoZWRfaW5zdCktPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEubnVtX3ByaW9yaXRpZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAgInNjaGVkIHByaW9yaXR5ICglZCkgaXMgaGlnaGVyIHRoYW4gdGhlIGFsbG93ZWQgYXQgcGFyZW50IHNjaGVkIChpZCA9ICVkIGRpciA9ICVzIG51bSBvZiBwcmlvcml0aWVzID0gJWQgKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfY2ZnLT5kYXRhLnNjaGVkX3BhcmVudC5wcmlvcml0eSAsIHRtX3NjaGVkX2tleS5pZCwgVE1fU0NIRURfRElSX1RPX1NUUih0bV9zY2hlZF9rZXkuZGlyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgqcF9wYXJlbnRfdG1fc2NoZWRfaW5zdCktPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEubnVtX3ByaW9yaXRpZXMpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmKEJDTUJBTF9UTV9TQ0hFRF9UWVBFX1dGUSA9PSAoKnBfcGFyZW50X3RtX3NjaGVkX2luc3QpLT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLnNjaGVkX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIUJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJihwX3RtX3NjaGVkX2NmZy0+ZGF0YS5zY2hlZF9wYXJlbnQpLCB0bV9zY2hlZF9wYXJlbnQsIHdlaWdodCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsICJTY2hlZCBwYXJlbnQgbXVzdCBiZSBzZXQgd2l0aCBhIHdlaWdodCwgYXMgaXRzIHNjaGVkX3BhcmVudCcgc2NoZWRfdHlwZSBpcyB3cnJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCYocF90bV9zY2hlZF9jZmctPmRhdGEuc2NoZWRfcGFyZW50KSwgdG1fc2NoZWRfcGFyZW50LCBwcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsICJTY2hlZCBwYXJlbnQgY2FuIG5vdCBiZSBzZXQgd2l0aCBhIHByaW9yaXR5LCBhcyBpdHMgc2NoZWRfcGFyZW50JyBzY2hlZF90eXBlIGlzIHdyciBcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYoQkNNQkFMX1RNX1NDSEVEX1RZUEVfU1BfV0ZRID09ICgqcF9wYXJlbnRfdG1fc2NoZWRfaW5zdCktPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEuc2NoZWRfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCYocF90bV9zY2hlZF9jZmctPmRhdGEuc2NoZWRfcGFyZW50KSwgdG1fc2NoZWRfcGFyZW50LCBwcmlvcml0eSkKKyAgICAgICAgICAgICAgICAgICAgJiYgQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmKHBfdG1fc2NoZWRfY2ZnLT5kYXRhLnNjaGVkX3BhcmVudCksIHRtX3NjaGVkX3BhcmVudCwgd2VpZ2h0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgIlNjaGVkIHBhcmVudCBtdXN0IGJlIHNldCB3aXRoIGVpdGhlciB3ZWlnaHQgb3IgcHJpb3JpdHksIG5vdCBib3RoLiBhcyBpdHMgc2NoZWRfcGFyZW50JyBzY2hlZF90eXBlIGlzIHNwX3dyclxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoIUJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJihwX3RtX3NjaGVkX2NmZy0+ZGF0YS5zY2hlZF9wYXJlbnQpLCB0bV9zY2hlZF9wYXJlbnQsIHByaW9yaXR5KQorICAgICAgICAgICAgICAgICAgICAmJiAhQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmKHBfdG1fc2NoZWRfY2ZnLT5kYXRhLnNjaGVkX3BhcmVudCksIHRtX3NjaGVkX3BhcmVudCwgd2VpZ2h0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgIlNjaGVkIHBhcmVudCBtdXN0IGJlIHNldCB3aXRoIGVpdGhlciB3ZWlnaHQgb3IgcHJpb3JpdHksIGFzIGl0cyBzY2hlZF9wYXJlbnQnIHNjaGVkX3R5cGUgaXMgc3Bfd3JyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgfXdoaWxlKDApOworCQorICAgIHJldHVybiByZXQ7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgdG1fc2NoZWRfZnNtX2luZm9fdmFsaWRhdGUKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byB2YWxpZGF0ZSBhbGwgaW5wdXQgYXR0cmlidXRlcyByZXF1aXJlZCBmb3IgYSB0bV9zY2hlZAorICogc2V0dGluZ3MKKyAqCisgKiBAcGFyYW0gcF90bV9zY2hlZF9jZmcgICAgIEEgcG9pbnRlciB0byBhIHRtIHNjaGVkIG9iamVjdAorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIHRtX3NjaGVkX2ZzbV9pbmZvX3ZhbGlkYXRlKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9jZmcgKnBfdG1fc2NoZWRfY2ZnKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgYmNtYmFsX3RtX3NjaGVkX293bmVyIG93bmVyID0gcF90bV9zY2hlZF9jZmctPmRhdGEub3duZXI7CisgICAgYmNtYmFsX2ludGVyZmFjZV9rZXkgaW50Zl9rZXk7CisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5IHN1Yl90ZXJtX2tleTsKKyAgICBzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QgPSBOVUxMOworICAgIHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdDsKKyAgICBiY21vc19ib29sIGlzX3NjaGVkX3R5cGVfYW5kX2xldmVsX21hbmRhdG9yeSA9IEJDTU9TX1RSVUU7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYoIV9yc2NfbWdyX3RtX3NjaGVkX2lkX3ZhbGlkYXRlKHBfdG1fc2NoZWRfY2ZnLT5rZXkuaWQpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgdG0gc2NoZWQgaWQgKHJlc2VydmVkIGZvciBhdXRvIGNyZWF0ZWQpIFxuIik7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX3RtX3NjaGVkX2NmZywgdG1fc2NoZWQsIG93bmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKG93bmVyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9BR0dfUE9SVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qdG0gc2NoZWQgb3duZWQgYnkgYWdnIHBvcnQgaXMgIHRoZSBvbmx5IGNhc2Ugc2NoZWQgdHlwZSBtaWdodCBiZSB1bnNldCovCisgICAgICAgICAgICAgICAgICAgIGlzX3NjaGVkX3R5cGVfYW5kX2xldmVsX21hbmRhdG9yeSA9IEJDTU9TX0ZBTFNFOworCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNQkFMX1RNX1NDSEVEX0RJUl9VUyAhPSBwX3RtX3NjaGVkX2NmZy0+a2V5LmRpcikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bSBzY2hlZCBvd25lZCBieSBhZ2cgcG9ydCBtdXN0IGJlIG9mIFVTIGRpcmVjdGlvbiwgd2hpbGUgdG0gc2NoZWQgaWQgPSAlZCBpcyBub3RcbiIsIHBfdG1fc2NoZWRfY2ZnLT5rZXkuZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyphZ2cgcG9ydCBvd25lZCB0bSBzY2hlZCBjYW4gbm90IGJlIHBhcnQgb2YgaHFvcywgdGhlcmVmb3IgY2FuIG5vdCBoYXZlIHNjaGVkIHBhcmVudCBzZXQqLworICAgICAgICAgICAgICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfdG1fc2NoZWRfY2ZnLCB0bV9zY2hlZCwgc2NoZWRfcGFyZW50KSkJCQkJCQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtIHNjaGVkIG93bmVkIGJ5IGFnZyBwb3J0IGlzIGEgdHNhbmQgYWxvbmUgYW5kIGNhbiBub3QgaGF2ZSBzY2hlZF9wYXJlbnQgc2V0IHRvIGl0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qdmFsaWRhdGUgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIHNldCovCisgICAgICAgICAgICAgICAgICAgIGlmKChvd25lci51LmFnZ19wb3J0LmludGZfaWQgPT0gQkFMX0FQSV9NQVhfSU5URl9JRCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKG93bmVyLnUuYWdnX3BvcnQuc3ViX3Rlcm1faWQgPT0gQkNNQkFMX1NVQl9JRF9VTktOT1dOKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIG93bmVyIGFnZyBwb3J0IHNldHRpbmdzIGludGZfaWQgPSAlZCBzdWJfaWQgPSAlZCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBvd25lci51LmFnZ19wb3J0LmludGZfaWQsIG93bmVyLnUuYWdnX3BvcnQuc3ViX3Rlcm1faWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLyp2YWxpZGF0ZSBpbnRlcmZhY2UgaXMgdXAqLworICAgICAgICAgICAgICAgICAgICBpbnRmX2tleS5pbnRmX2lkID0gb3duZXIudS5hZ2dfcG9ydC5pbnRmX2lkOworICAgICAgICAgICAgICAgICAgICBpbnRmX2tleS5pbnRmX3R5cGUgPSBCQ01CQUxfSU5URl9UWVBFX1BPTjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmKGJjbWJhbF9pbnRlcmZhY2Vfc3RhdHVzX2dldChpbnRmX2tleSkhPSBCQ01CQUxfU1RBVFVTX1VQKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGYgPSAlZCBpcyBub3QgVVBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRmX2tleS5pbnRmX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9DT05ORUNURUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qdmFsaWRhdGUgc3ViIHRlcm1pbmFsIGV4aXN0Ki8KKyAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fa2V5LmludGZfaWQgPSBvd25lci51LmFnZ19wb3J0LmludGZfaWQ7CisgICAgICAgICAgICAgICAgICAgIHN1Yl90ZXJtX2tleS5zdWJfdGVybV9pZCA9IG93bmVyLnUuYWdnX3BvcnQuc3ViX3Rlcm1faWQ7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBwX3N1Yl90ZXJtX2luc3QgPSBzdWJfdGVybV9pbnN0X2dldCgmc3ViX3Rlcm1fa2V5LCBTVUJfVEVSTV9GTEFHX0FDVElWRSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZighcF9zdWJfdGVybV9pbnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgc3Vic2NyaWJlciB0ZXJtaW5hbCB3aXRoIGludGYgPSAlZCBpZCA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fa2V5LmludGZfaWQsIHN1Yl90ZXJtX2tleS5zdWJfdGVybV9pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1VOSToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qdmFsaWRhdGUgc3ViIHRlcm1pbmFsIGV4aXN0Ki8KKyAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fa2V5LmludGZfaWQgPSBvd25lci51LnVuaS5pbnRmX2lkOworICAgICAgICAgICAgICAgICAgICBzdWJfdGVybV9rZXkuc3ViX3Rlcm1faWQgPSBvd25lci51LnVuaS5zdWJfdGVybV9pZDsKKworICAgICAgICAgICAgICAgICAgICBwX3N1Yl90ZXJtX2luc3QgPSBzdWJfdGVybV9pbnN0X2dldCgmc3ViX3Rlcm1fa2V5LCBTVUJfVEVSTV9GTEFHX0FDVElWRSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZighcF9zdWJfdGVybV9pbnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgc3Vic2NyaWJlciB0ZXJtaW5hbCB3aXRoIGludGYgPSAlZCBpZCA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3Rlcm1fa2V5LmludGZfaWQsIHN1Yl90ZXJtX2tleS5zdWJfdGVybV9pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkKKyAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBpc19zY2hlZF90eXBlX2FuZF9sZXZlbF9tYW5kYXRvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfdG1fc2NoZWRfY2ZnLCB0bV9zY2hlZCwgc2NoZWRfdHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAiU2NoZWQgdHlwZSBpcyBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZm9yIHNldHRpbmcgdG0gc2NoZWRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTUFOREFUT1JZX1BBUk1fSVNfTUlTU0lORzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qaWYgc2NoZWQgdHlwZSBpcyBzcCBvciB3cnJfc3AsIG51bV9vZl9wcmlvcml0aWVzIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciovCisgICAgICAgICAgICBpZihCQ01CQUxfVE1fU0NIRURfVFlQRV9TUCA9PSBwX3RtX3NjaGVkX2NmZy0+ZGF0YS5zY2hlZF90eXBlCisgICAgICAgICAgICAgIHx8IEJDTUJBTF9UTV9TQ0hFRF9UWVBFX1NQX1dGUSA9PSBwX3RtX3NjaGVkX2NmZy0+ZGF0YS5zY2hlZF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfdG1fc2NoZWRfY2ZnLCB0bV9zY2hlZCwgbnVtX3ByaW9yaXRpZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAibnVtX3ByaW9yaXRpZXMgaXMgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIGZvciBzZXR0aW5nIHRtIHNjaGVkIHdpdGggc2NoZWQgdHlwZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfVE1fU0NIRURfVFlQRV9TUCA9PSBwX3RtX3NjaGVkX2NmZy0+ZGF0YS5zY2hlZF90eXBlID8gInNwIiA6ICJzcF93cnIiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9NQU5EQVRPUllfUEFSTV9JU19NSVNTSU5HOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX3RtX3NjaGVkX2NmZywgdG1fc2NoZWQsIHNjaGVkX2NoaWxkX3R5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgIlNjaGVkIGNoaWxkIHR5cGUgaXMgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIGZvciBzZXR0aW5nIHRtIHNjaGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX01BTkRBVE9SWV9QQVJNX0lTX01JU1NJTkc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfdG1fc2NoZWRfY2ZnLCB0bV9zY2hlZCwgc2NoZWRfcGFyZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyA9PSAocmV0ID0gYmNtYmFsX3RtX3NjaGVkX3ZhbGlkYXRlX3NjaGVkX3BhcmVudChwX3RtX3NjaGVkX2NmZywgJnBfdG1fc2NoZWRfaW5zdCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IGJjbWJhbF90bV9zY2hlZF9zdWJfc2NoZWRzX2xpc3RfZW50cnlfYWRkKHBfdG1fc2NoZWRfaW5zdCwgcF90bV9zY2hlZF9jZmctPmtleS5pZCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLAkiY291bGQgbm90IHNldCBzY2hlZHVsZXIgZGlyID0gJXMgaWQgPSAlZCBhcyBwYXJlbnQgb2Ygc2NoZWQgZGlyID0gJXMgaWQgPSAlZCAoZXJyPSAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBUTV9TQ0hFRF9ESVJfVE9fU1RSKHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmRpciksIHBfdG1fc2NoZWRfY2ZnLT5kYXRhLnNjaGVkX3BhcmVudC5zY2hlZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRNX1NDSEVEX0RJUl9UT19TVFIocF90bV9zY2hlZF9jZmctPmtleS5kaXIpLCBwX3RtX3NjaGVkX2NmZy0+a2V5LmlkLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCSJjb3VsZCBub3QgdmFsaWRhdGUgc2NoZWR1bGVyIGRpciA9ICVzIGlkID0gJWQgYXMgcGFyZW50IG9mIHNjaGVkIGRpciA9ICVzIGlkID0gJWQgKGVycj0gJXMpXG4iLAorICAgICAgICAgICAgICAgIFRNX1NDSEVEX0RJUl9UT19TVFIocF90bV9zY2hlZF9jZmctPmtleS5kaXIpLCBwX3RtX3NjaGVkX2NmZy0+ZGF0YS5zY2hlZF9wYXJlbnQuc2NoZWRfaWQsCisgICAgICAgICAgICAgICAgVE1fU0NIRURfRElSX1RPX1NUUihwX3RtX3NjaGVkX2NmZy0+a2V5LmRpciksIHBfdG1fc2NoZWRfY2ZnLT5rZXkuaWQsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAgIAorICAgICAgICB9CisKKyAgICB9d2hpbGUoMCk7CisKKyAgICByZXR1cm4gcmV0OworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgY29yZSB3b3JrZXIgdGhyZWFkIHRvIHByb2Nlc3MgYW4KKyAqICAgICAgICB0bV9zY2hlZCBvYmplY3QgbWVzc2FnZSAoU0VULCBHRVQsIENMRUFSLCBTVEFUUykgcmVjZWl2ZWQKKyAqICAgICAgICBmcm9tIHRoZSBCQUwgUHVibGljIEFQSS4KKyAqCisgKiBAcGFyYW0gbXNnX3BheWxvYWQgICAgICBQb2ludGVyIHRvIGEgQkFMIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEJBTCBQdWJsaWMgQVBJLgorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBwcm9jZXNzX3RtX3NjaGVkX29iamVjdCh2b2lkICptc2dfcGF5bG9hZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LLCByc3BfcmV0ID0gQkNNX0VSUl9PSzsJCisgICAgYmNtYmFsX3RtX3NjaGVkX2NmZyAqcF90bV9zY2hlZF9jZmcgPSAoYmNtYmFsX3RtX3NjaGVkX2NmZyAqKW1zZ19wYXlsb2FkOworICAgIHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCA9IE5VTEw7CisgICAgdG1fc2NoZWRfZnNtX2V2ZW50IGZzbV9ldmVudDsKKyAgICBiY21iYWxfdG1fc2NoZWRfa2V5IHRtX3NjaGVkX2tleTsKKyAgICBiY21iYWxfb2JqX21zZ190eXBlIG9wZXJfdHlwZTsKKyAgICBiY21iYWxfdG1fc2NoZWRfb3duZXIgb3duZXI7CisgICAgdWludDMyX3QgcmVmX2NvdW50OyAKKyAgICBxdWV1ZV9lbnRyeSAqY3VycmVudF9xdWV1ZV9lbnRyeTsKKyAgICBiY21iYWxfdG1fcXVldWVfa2V5IGN1cnJlbnRfcXVldWVfa2V5OworICAgIHRtX3F1ZXVlX2luc3QgKmN1cnJlbnRfcXVldWVfaW5zdDsKKyAgICBiY21iYWxfaW50ZXJmYWNlX2tleSBpbnRmX2tleTsKKwkKKyAgICBkbworICAgIHsKKyAgICAgICAgQlVHX09OKE5VTEwgPT0gbXNnX3BheWxvYWQpOworICAgICAgICAKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3NjaGVkLCAgIlByb2Nlc3NpbmcgYSB0bSBzY2hlZCBvYmplY3RcbiIpOworICAgICAgICAKKyAgICAgICAgdG1fc2NoZWRfa2V5ID0gcF90bV9zY2hlZF9jZmctPmtleTsKKyAgICAgICAgb3Blcl90eXBlID0gcF90bV9zY2hlZF9jZmctPmhkci5oZHIudHlwZTsKKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICogQSBtZXNzYWdlIHBvaW50ZXIgbWF5IGJlIHBhc3NlZCBpbnNpZGUgdGhlIGV2ZW50IHN0cnVjdHVyZS4KKyAgICAgICAgKi8KKyAgICAgICAgZnNtX2V2ZW50Lm1zZyA9IG1zZ19wYXlsb2FkOworICAgICAgICAKKyAgICAgICAgLyogU0VUIG9yIEdFVCBvciBDTEVBUi4uLj8gKi8KKyAgICAgICAgc3dpdGNoKG9wZXJfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZShCQ01CQUxfT0JKX01TR19UWVBFX1NFVCk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3NjaGVkLCAgIlByb2Nlc3NpbmcgYSB0bSBzY2hlZCBTRVQgUkVRIG1nbXQgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKEJDTUJBTF9TVEFUVVNfVVAgIT0gYWNjX3Rlcm1fc3RhdHVzX2dldCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVJST1IgLSBBY2Nlc3MtdGVybWluYWwgaXMgbm90IFVQLiAgTm8gZnVydGhlciBwcm9jZXNzaW5nXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLypGaW5kIHRoZSBzcGVjaWZpZWQgdG1fc2NoZWQgaW5zdGFuY2UgaXMgYWxyZWFkeSBjcmVhdGVkICovCisgICAgICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdCA9IHRtX3NjaGVkX2luc3RfZ2V0KHRtX3NjaGVkX2tleSwgVE1fU0NIRURfRkxBR19BQ1RJVkUpOworCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBwX3RtX3NjaGVkX2luc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYSBmYXRhbCBlcnJvciBjb25kaXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVJST1IgLSB0bSBzY2hlZCBmb3VuZC4gIFNldCBhZnRlciBjcmVhdGUgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuIE5vIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgcF90bV9zY2hlZF9pbnN0ID0gdG1fc2NoZWRfaW5zdF9nZXQodG1fc2NoZWRfa2V5LCBUTV9TQ0hFRF9GTEFHX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICBpZihOVUxMID09IHBfdG1fc2NoZWRfaW5zdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFUlJPUiAtIHRtIHNjaGVkIG5vdCBmb3VuZC4gIE5vIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworCQkJCQlCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fc2NoZWQsCisJCQkJCQkiQ3JlYXRpbmcgYSBuZXcgdG0gc2NoZWRcbiIpOworCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX3RtX3NjaGVkX2NmZywgdG1fc2NoZWQsIGNyZWF0aW9uX21vZGUsIEJDTUJBTF9UTV9DUkVBVElPTl9NT0RFX01BTlVBTCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogRmlsbCBpbiBnaXZlbiBjZmcgd2l0aCBjdXJyZW50IHRtIHNjaGVkIGluc3RhbmNlIEFQSSByZXF1ZXN0IGRhdGEgc3RydWN0dXJlIGFuZCB2YWxpZGF0ZSBpdCovCisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF90bV9zY2hlZF9vYmplY3Rfb3ZlcmxheV93X3NyY19wcmlvcml0eSgmcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mbywgcF90bV9zY2hlZF9jZmcpOworCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG1hbmRhdG9yeSB0bSBzY2hlZCBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQsIGFuZCByYW5nZSBjaGVjayB3aGVyZSBhcHBsaWNhYmxlICovCisgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IHRtX3NjaGVkX2ZzbV9pbmZvX3ZhbGlkYXRlKHBfdG1fc2NoZWRfY2ZnKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgInRtX3NjaGVkIGZzbSB2YWxpZGF0aW9uIEZhaWxlZCAoJWQpXG4iLCByZXQpOworCQkJCQkJdG1fc2NoZWRfZnJlZV9ieV9lbnRyeShwX3RtX3NjaGVkX2luc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiBQZXJmb3JtIHRoZSB2YWxpZGF0aW9uIGNoZWNrKHMpIHRoYXQgdGhlIHV0aWxzIHJlcXVpcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gc3dfdXRpbF90bV9zY2hlZF92YWxpZGF0ZShwX3RtX3NjaGVkX2NmZykpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsICJ0bV9zY2hlZCBzd2l0Y2ggdmFsaWRhdGlvbiBGYWlsZWQgKCVkKVxuIiwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtX3NjaGVkX2ZyZWVfYnlfZW50cnkocF90bV9zY2hlZF9pbnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH13aGlsZSgwKTsKKyAgICAgICAgICAgICAgICAvKiBXZSByZXNwb25kIHRvIHRoZSBCQUwgcHVibGljIEFQSSBiYWNrZW5kIHdpdGggYSByZXN1bHQuIFdlIGFsd2F5cworICAgICAgICAgICAgICAgICogc2VuZCBhIGNvbXBsZXRlIG1zZ19wYXlsb2FkIGJhY2sgdG8gdGhlIEFQSSwgYnV0IHRoZSBkYXRhIHBvcnRpb24KKyAgICAgICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgaXMgb25seSByZWxldmFudCB3aGVuIGEgR0VUIG9yIEdFVC1TVEFUUyBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByc3BfcmV0ID0gbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsIG9wZXJfdHlwZSwgbG9nX2lkX3RtX3NjaGVkKTsKKyAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJzcF9yZXQgfHwgQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqIEluaXRpYWwgY2hlY2tzIGNvbXBsZXRlLglQcm9jZXNzIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmc21fZXZlbnQuZXZlbnRfdHlwZSA9IFRNX1NDSEVEX0ZTTV9FVkVOVF9UWVBFX0NSRUFURTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICogUnVuIHRoZSB0bSBzY2hlZCBGU00gdG8gcHJvY2VzcyB0aGlzIGV2ZW50CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXQgPSB0bV9zY2hlZF9mc21fZXhlYyhwX3RtX3NjaGVkX2luc3QsICZmc21fZXZlbnQpOyAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgfS8vU0VUCisgICAgICAgICAgICBicmVhazsKKwkJCQorICAgICAgICAgICAgY2FzZShCQ01CQUxfT0JKX01TR19UWVBFX0dFVCk6CisgICAgICAgICAgICB7ICAgICAgICAKKyAgICAgICAgICAgICAgICBiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OCBxdWV1ZXNfbGlzdCA9IHt9OworICAgICAgICAgICAgICAgIGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4IHN1Yl9zY2hlZHNfbGlzdCA9IHt9OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF90bV9zY2hlZCwJIlByb2Nlc3NpbmcgYSB0bSBzY2hlZCBHRVQgUkVRIG1nbXQgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogSnVzdCByZXR1cm4gdGhlIHRtIHNjaGVkIGRhdGEgaW5mbyB0aGF0IHdlIGhhdmUgb24gcmVjb3JkIGZvciB0bSBzY2hlZCBpbnN0YW5jZSAqLworICAgICAgICAgICAgICAgIC8qRmluZCB0aGUgc3BlY2lmaWVkIHRtIHNjaGVkICBpbnN0YW5jZSAgICAgICAqLworICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdCA9IHRtX3NjaGVkX2luc3RfZ2V0KHRtX3NjaGVkX2tleSwgVE1fU0NIRURfRkxBR19BQ1RJVkUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcF90bV9zY2hlZF9pbnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAiU3BlY2lmaWVkIHRtX3NjaGVkIG5vdCBmb3VuZCBvbiBHRVRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIHF1ZXVlcyBsaXN0IGlmIHJlcXVlc3RlZCAqLworICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfQ0xFQVIoJnBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICB0bV9zY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlcyk7CisJCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHVzZXIgcmVxdWVzdGVkIHRoZSBsaXN0IG9mIHF1ZXVlcyBmb3IgdGhpcyB0bSBzY2hlZCB0aGVuIHJldHVybiB0aGUgbGlzdC4qLworICAgICAgICAgICAgICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfdG1fc2NoZWRfY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgdG1fc2NoZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVzKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyA9PSBxdWV1ZXNfbGlzdF9maWxsKHBfdG1fc2NoZWRfaW5zdCwgJnF1ZXVlc19saXN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT1RFOiBUaGUgcmV0dXJuZWQgbGlzdCBtYXkgYmUgZW1wdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bV9zY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZXNfbGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAiRXJyb3IgdHJ5aW5nIHRvIGZpbGwgcXVldWVzIGxpc3QgdG8gcmV0dXJuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiBSZXR1cm4gdGhlIHN1YiBzY2hlZHMgbGlzdCBpZiByZXF1ZXN0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0NMRUFSKCZwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJfc2NoZWRzKTsKKwkJCQkJCQorICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgdXNlciByZXF1ZXN0ZWQgdGhlIGxpc3Qgb2Ygc3ViIHNjaGVkcyBmb3IgdGhpcyB0bSBzY2hlZCB0aGVuIHJldHVybiB0aGUgbGlzdC4qLworICAgICAgICAgICAgICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfdG1fc2NoZWRfY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgdG1fc2NoZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3NjaGVkcykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gc3ViX3NjaGVkc19saXN0X2ZpbGwocF90bV9zY2hlZF9pbnN0LCAmc3ViX3NjaGVkc19saXN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT1RFOiBUaGUgcmV0dXJuZWQgbGlzdCBtYXkgYmUgZW1wdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bV9zY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3NjaGVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3NjaGVkc19saXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsICJFcnJvciB0cnlpbmcgdG8gZmlsbCBzdWJfc2NoZWRzIGxpc3QgdG8gcmV0dXJuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFdlIHJlc3BvbmQgdG8gdGhlIEJBTCBwdWJsaWMgQVBJIGJhY2tlbmQgd2l0aCBhIHJlc3VsdC4gV2UgYWx3YXlzIAorICAgICAgICAgICAgICAgICAgICAqIHNlbmQgYSBjb21wbGV0ZSBtc2dfcGF5bG9hZCBiYWNrIHRvIHRoZSBBUEksIGJ1dCB0aGUgZGF0YSBwb3J0aW9uIAorICAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgaXMgb25seSByZWxldmFudCB3aGVuIGEgR0VUIG9yIEdFVC1TVEFUUyBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmhkci5oZHIuY29tbV9oZHIgPSAoKGJjbWJhbF9vYmogKiltc2dfcGF5bG9hZCktPmNvbW1faGRyOworICAgICAgICAgICAgICAgICAgICAqKChiY21iYWxfdG1fc2NoZWRfY2ZnICopbXNnX3BheWxvYWQpID0gcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mbzsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorCQkJCW1nbXRfbXNnX3NlbmRfYmFsYXBpX3JzcChyZXQsIG1zZ19wYXlsb2FkLCBvcGVyX3R5cGUsIGxvZ19pZF90bV9zY2hlZCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogRnJlZSB0aGUgdGVtcG9yYXJ5IGxpc3RzIGlmIHRoZXkgd2VyZSB1c2VkICovCisgICAgICAgICAgICAgICAgaWYocXVldWVzX2xpc3QudmFsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShxdWV1ZXNfbGlzdC52YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0vL0dFVAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UoQkNNQkFMX09CSl9NU0dfVFlQRV9DTEVBUik6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF90bV9zY2hlZCwgICJQcm9jZXNzaW5nIGEgdG0gc2NoZWQgQ0xFQVIgUkVRIG1nbXQgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgICAgICAgIC8qRmluZCB0aGUgc3BlY2lmaWVkIHRtIHNjaGVkICBpbnN0YW5jZSAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBwX3RtX3NjaGVkX2luc3QgPSB0bV9zY2hlZF9pbnN0X2dldCh0bV9zY2hlZF9rZXksIFRNX1NDSEVEX0ZMQUdfQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcF90bV9zY2hlZF9pbnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsICJTcGVjaWZpZWQgdG1fc2NoZWQgbm90IGZvdW5kIG9uIENsZWFyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgLyp1c2VyIGNhbiBub3QgY2xlYXIgYXV0byBjcmVhdGVkIHNjaGVkIG93bmVkIGJ5IGFnZyBwb3J0Ki8KKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mbywgdG1fc2NoZWQsIG93bmVyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIgPSBwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9BR0dfUE9SVCA9PSBvd25lci50eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBCQ01CQUxfVE1fQ1JFQVRJT05fTU9ERV9BVVRPID09IHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5jcmVhdGlvbl9tb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgIlNwZWNpZmllZCB0bV9zY2hlZCBpcyBhdXRvIGNyZWF0ZWQsIHRoZXJlZm9yIGNhbiBub3QgYmUgbWFudWFsbHkgZGVsZXRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qY2hlY2sgdGhhdCBhIHRtIGlzIG5vdCBhY3RpdmUsIAorICAgICAgICAgICAgICAgICAgICAgaWYgdGhhdCB0bSBvd25lZCBieSBpbnRlcmZhY2UsIGl0IGlzIGFjdGl2ZSBpZiBhbnkgb2YgaXRzIHF1ZXVlIGlzIGFjdGl2ZS4KKyAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIG93bmVkIGJ5IGFnZyBwb3J0LCBpdCBpcyBhY3RpdmUgaWYgdGhlIGFnZyBwb3J0IGlkIGhhcyByZWYgY291bnQgPiAxICovCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChvd25lci50eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0FHR19QT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzY19tZ3JfYWxsb2NfaWRfZ2V0X3JlZl9jb3VudChvd25lci51LmFnZ19wb3J0LmludGZfaWQsb3duZXIudS5hZ2dfcG9ydC5hZ2dfcG9ydF9pZCwmcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZWZfY291bnQgPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAiU3BlY2lmaWVkIHRtX3NjaGVkIGlzIGFjdGl2ZSBhbmQgdGhlcmVmb3IgY2FuIG5vdCBiZSBkZWxldGVkIChpZiA9ICVkIGFnZyBpZCA9ICVkLCByZWYgY291bnQgPSAlZCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lci51LmFnZ19wb3J0LmludGZfaWQsb3duZXIudS5hZ2dfcG9ydC5hZ2dfcG9ydF9pZCwgcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0vL0JDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0FHR19QT1JUCisJCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfSU5URVJGQUNFOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBSUxRX0ZPUkVBQ0goY3VycmVudF9xdWV1ZV9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfdG1fc2NoZWRfaW5zdC0+cXVldWVzX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihOVUxMICE9IGN1cnJlbnRfcXVldWVfZW50cnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcXVldWVfa2V5LnNjaGVkX2lkID0gcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5rZXkuaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3F1ZXVlX2tleS5zY2hlZF9kaXIgPSBwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmtleS5kaXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3F1ZXVlX2tleS5pZCA9IGN1cnJlbnRfcXVldWVfZW50cnktPnF1ZXVlX2lkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9xdWV1ZV9pbnN0ID0gdG1fcXVldWVfaW5zdF9nZXQoY3VycmVudF9xdWV1ZV9rZXksIFRNX1FVRVVFX0ZMQUdfQUNUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gY3VycmVudF9xdWV1ZV9pbnN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihUTV9RVUVVRV9GU01fU1RBVEVfSU5fVVNFID09IGN1cnJlbnRfcXVldWVfaW5zdC0+ZnNtX3N0YXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgIlNwZWNpZmllZCB0bV9zY2hlZCBpcyBhY3RpdmUgKGhhcyBhbiBpbiB1c2UgcXVldWUpIGFuZCB0aGVyZWZvciBjYW4gbm90IGJlIGRlbGV0ZWQgKHF1ZXVlIGlkID0gJWQgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9xdWV1ZV9rZXkuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ly9UQUlMUV9GT1JFQUNICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyA9PSByZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRNX1NDSEVEcyAgKGVpdGhlciBhdXRvIG9yIG1hbnVhbGx5IGNyZWF0ZWQpIHdpdGggb3duZXIgaW50ZXJmYWNlIG1heSBvbmx5IGJlIGRlbGV0ZWQgdGhlcmUgYXJlIG5vIGF0dGFjaGVkIFRNX1FVRVVFcywgYW5kIG9ubHkgd2hlbiB0aGUgYXNzb2NpYXRlZCBpbnRlcmZhY2UgaXMgaW4gdGhlIEFETUlOLURPV04gc3RhdGUqLworICAgICAJCQkJCQkJaW50Zl9rZXkuaW50Zl90eXBlID0gb3duZXIudS5pbnRlcmZhY2UuaW50Zl90eXBlOworCSAgICAJCQkJCQlpbnRmX2tleS5pbnRmX2lkID0gb3duZXIudS5pbnRlcmZhY2UuaW50Zl9pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQkNNQkFMX1NUQVRVU19ET1dOICE9IGJjbWJhbF9pbnRlcmZhY2Vfc3RhdHVzX2dldChpbnRmX2tleSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgIlNwZWNpZmllZCB0bV9zY2hlZCBpcyBvd25lZCBieSBpbnRlcmZhY2UgdGhhdCBpcyBub3QgYWRtaW4gZG93biwgYW5kIGNhbiBiZSByZW1vdmVkIG9ubHkgd2hlbiB0aGUgYXNzb2NpYXRlZCBpbnRlcmZhY2UgaXMgaW4gdGhlIEFETUlOLURPV04gc3RhdGVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAkgICAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0vL0JDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0lOVEVSRkFDRQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfS8vc3dpdGNoIG93bmVyLnR5cGUKKwkJCQl9Ly9vd25lciBpcyBzZXQKKyAgICAgICAgICAgICAgICAvKmdlbmVyYXRlIGRlc3Ryb3kgZXZlbnQqLworICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnNtX2V2ZW50LmV2ZW50X3R5cGUgPSBUTV9TQ0hFRF9GU01fRVZFTlRfVFlQRV9ERVNUUk9ZOworICAgICAgICAgICAgICAgICAgICBmc21fZXZlbnQubXNnID0gbXNnX3BheWxvYWQ7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRtX3NjaGVkX2ZzbV9leGVjKHBfdG1fc2NoZWRfaW5zdCwmZnNtX2V2ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9d2hpbGUoMCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfcnNwKHJldCwgbXNnX3BheWxvYWQsIG9wZXJfdHlwZSwgbG9nX2lkX3RtX3NjaGVkKTsJCQkgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9Ly9DTEVBUgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAgIlVuc3VwcG9ydGVkIG9wZXJhdGlvbiBvbiB0bSBzY2hlZCBvYmplY3QgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBvcGVyX3R5cGUpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fc2NoZWQsICIlcyByZXR1cm5zXG4iLCBfX0ZVTkNUSU9OX18pOworCQorICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQgdG1fc2NoZWRfaW5zdF9lbnRyeV9vYmpfaW5pdCh0bV9zY2hlZF9pbnN0ICpwX2VudHJ5KQoreworICAgIC8qIFRoZSBhY3R1YWwga2V5IGNvbnRlbnQgaXMgaXJyZWxldmFudCBmb3IgZnJlZSB0bV9zY2hlZHMgKi8KKyAgICBiY21iYWxfdG1fc2NoZWRfa2V5IGtleSA9IHsgLmlkID0gMCwgLmRpciA9IEJDTUJBTF9UTV9TQ0hFRF9ESVJfRFN9OworCisgICAgQkNNQkFMX0NGR19JTklUKCZwX2VudHJ5LT5jdXJyZW50X3RtX3NjaGVkX2luZm8sCisgICAgICAgICAgICAgICAgICAgIHRtX3NjaGVkLAorICAgICAgICAgICAgICAgICAgICBrZXkpOworICAgIHBfZW50cnktPmZzbV9zdGF0ZSA9IFRNX1NDSEVEX0ZTTV9TVEFURV9OVUxMOwkKKyAgICAvKiBJbml0aWFsaXplIHRoZSBxdWV1ZXMgYW5kIHN1YyBzY2hlZHMgbGlzdHMgKi8KKyAgICBwX2VudHJ5LT5udW1fcXVldWVzX29uX25vZGUgPSAwOworICAgIFRBSUxRX0lOSVQoJnBfZW50cnktPnF1ZXVlc19saXN0KTsKKyAgICAgCisgICAgcF9lbnRyeS0+bnVtX3N1Yl9zY2hlZHNfb25fbm9kZSA9IDA7CisgICAgVEFJTFFfSU5JVCgmcF9lbnRyeS0+c3ViX3NjaGVkc19saXN0KTsKKworICAgIEJDTUJBTF9PQkpfSU5fUFJPR1JFU1NfU0VUKCYocF9lbnRyeS0+Y3VycmVudF90bV9zY2hlZF9pbmZvKSwgQkNNT1NfRkFMU0UpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byBmcmVlIGEgdG1fc2NoZWQgaW5zdGFuY2Ugc3BlY2lmaWVkIGJ5IGEgdGhlIHN1cHBsaWVkCisgKiAgICAgICAgZW50cnkgcG9pbnRlci4KKyAqCisgKiBAcGFyYW0gcF9lbnRyeSBBIHBvaW50ZXIgdG8gdGhlIGVudHJ5IHRvIGJlIGZyZWVkCisgKgorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gdG1fc2NoZWRfZnJlZV9ieV9lbnRyeSh0bV9zY2hlZF9pbnN0ICpwX2VudHJ5KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgdG1fc2NoZWRfaW5zdCAqY3VycmVudF9lbnRyeTsKKyAgICB0bV9zY2hlZF9pbnN0ICpwX3RlbXBfZW50cnk7CisgICAgLyoKKyAgICAgKiBGaXJzdCwgY2hlY2sgdGhlIGFjdGl2ZSBsaXN0IChhbiBhY3RpdmUgdG1fc2NoZWQgY2FuIGJlIGluIHRoZSBhZGRpbmcgb3IgcmVtb3Zpbmcgc3RhdGUpCisgICAgICovCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICZUTV9TQ0hFRF9GU01fVE1fU0NIRURfTElTVF9DVFhfUFRSLT5hY3RpdmVfdG1fc2NoZWRfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdG1fc2NoZWRfaW5zdF9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBwX3RlbXBfZW50cnkpCisgICAgeworICAgICAgICBpZihjdXJyZW50X2VudHJ5ID09IHBfZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGFjdGl2ZSBsaXN0ICovCisgICAgICAgICAgICBUQUlMUV9SRU1PVkUoJlRNX1NDSEVEX0ZTTV9UTV9TQ0hFRF9MSVNUX0NUWF9QVFItPmFjdGl2ZV90bV9zY2hlZF9saXN0LCBjdXJyZW50X2VudHJ5LCB0bV9zY2hlZF9pbnN0X25leHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgdG1fc2NoZWRfaW5zdF9lbnRyeV9vYmpfaW5pdChwX2VudHJ5KTsKKworICAgIC8qIEFuZCBhZGQgaXQgdG8gdGhlIGZyZWUgbGlzdCAqLworICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZUTV9TQ0hFRF9GU01fVE1fU0NIRURfTElTVF9DVFhfUFRSLT5mcmVlX3RtX3NjaGVkX2xpc3QsIHBfZW50cnksIHRtX3NjaGVkX2luc3RfbmV4dCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGUgdG0gc2NoZWQgRlNNIHN0YXRlIHByb2Nlc3NpbmcgZXhlY3V0aXZlIGZ1bmN0aW9uCisgKgorICogQHBhcmFtIHBfdG1fc2NoZWRfaW5zdCAgUG9pbnRlciB0byBhIHRtX3NjaGVkIGluc3RhbmNlCisgKiBAcGFyYW0gcF9ldmVudCAgICAgIFBvaW50ZXIgdG8gYSB0bV9zY2hlZCBldmVudCBzdHJ1Y3R1cmUKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIHRtX3NjaGVkX2ZzbV9leGVjKHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCwgdG1fc2NoZWRfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgdG1fc2NoZWRfZnNtX3N0YXRlIHByZV9zdGF0ZTsKKyAgICB0bV9zY2hlZF9mc21fc3RhdGVfcHJvY2Vzc29yIHRtX3NjaGVkX3N0YXRlX3Byb2Nlc3NvcjsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04oTlVMTCA9PSBwX3RtX3NjaGVkX2luc3QpOworICAgIEJVR19PTihOVUxMID09IHBfZXZlbnQpOworCisgICAgLyogUmVjb3JkIHRoZSBwcmVzZW50IHN0YXRlIGZvciBkZWJ1ZyBwcmludGluZworICAgICAqLworICAgIHByZV9zdGF0ZSA9IHBfdG1fc2NoZWRfaW5zdC0+ZnNtX3N0YXRlOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIHN0YXRlIHByb2Nlc3NpbmcgZnVuY3Rpb24KKyAgICAgKi8KKyAgICB0bV9zY2hlZF9zdGF0ZV9wcm9jZXNzb3IgPSB0bV9zY2hlZF9zdGF0ZXNbcF90bV9zY2hlZF9pbnN0LT5mc21fc3RhdGVdW3BfZXZlbnQtPmV2ZW50X3R5cGVdOworCisgICAgLyoKKyAgICAgKiBJZiB0aGVyZSdzIGEgc3RhdGUgcHJvY2Vzc2luZyBmdW5jdGlvbiBmb3IgdGhpcyBldmVudCBhbmQgc3RhdGUsIGV4ZWN1dGUgaXQuCisgICAgICogT3RoZXJ3aXNlLCBwcm9jZXNzIGEgZ2VuZXJpYyBlcnJvci4KKyAgICAgKi8KKyAgICBpZih0bV9zY2hlZF9zdGF0ZV9wcm9jZXNzb3IpCisgICAgeworICAgICAgICByZXQgPSB0bV9zY2hlZF9zdGF0ZV9wcm9jZXNzb3IocF90bV9zY2hlZF9pbnN0LCBwX2V2ZW50LT5tc2csIHBfZXZlbnQpOworICAgIH0gCisJZWxzZQorICAgIHsKKyAgICAgICAgdG1fc2NoZWRfZnNtX3N0YXRlX2VycihwX3RtX3NjaGVkX2luc3QsIHBfZXZlbnQtPm1zZywgcF9ldmVudCk7CisgICAgfQorCisgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsICIqKiogRXJyb3IgZGV0ZWN0ZWQgZHVyaW5nIHN0YXRlIHByb2Nlc3NpbmdcbiIpOworICAgICAgICBwX3RtX3NjaGVkX2luc3QtPmZzbV9zdGF0ZSA9IHByZV9zdGF0ZTsKKyAgICB9CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fc2NoZWQsICAiKioqIEV2ZW50ICVzLCBTdGF0ZTogJXMgLS0+ICVzXG5cbiIsCisgICAgICAgICAgICB0bV9zY2hlZF9ldmVudF9uYW1lX2dldChwX2V2ZW50LT5ldmVudF90eXBlKSwKKyAgICAgICAgICAgIHRtX3NjaGVkX3N0YXRlX25hbWVfZ2V0KHByZV9zdGF0ZSksCisgICAgICAgICAgICB0bV9zY2hlZF9zdGF0ZV9uYW1lX2dldChwX3RtX3NjaGVkX2luc3QtPmZzbV9zdGF0ZSkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFRoZSB0bSBzY2hlZCBGU00gZnVuY3Rpb24gd2hpY2ggaXMgZXhlY3V0ZWQgd2hlbiBhbiBlcnJvcgorICogICAgICAgIGlzIGVuY291bnRlcmVkIGR1cmluZyBGU00gcHJvY2Vzc2luZy4KKyAqCisgKiBAcGFyYW0gcF90bV9zY2hlZF9pbnN0ICAgICBQb2ludGVyIHRvIGEgdG1fc2NoZWQgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIG9uZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEJBTCBhcHBzLgorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhIHRtX3NjaGVkIGV2ZW50IHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gdG1fc2NoZWRfZnNtX3N0YXRlX2Vycih0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1fc2NoZWRfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfSU5WQUxJRF9PUDsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF90bV9zY2hlZCwKKyAgICAgICAgICAgICJFcnJvciBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIFRNX1NDSEVEIEZTTSIKKyAgICAgICAgICAgICIgLSBCQUQgRVZFTlQgKClcbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQSBmdW5jdGlvbiB0byBwcm9jZXNzIGEgdG0gc2NoZWQgb2JqZWN0IGV2ZW50IHJlY2VpdmVkCisgKiAgICAgICAgZnJvbSBvbmUgb2YgdGhlIEJBTCBhcHBzLgorICoKKyAqIEBwYXJhbSBtc2dfcGF5bG9hZCAgQSBwb2ludGVyIHRvIHRoZSB1dGlsIG1lc3NhZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQHJldHVybnMgYmNtb3NfZXJybm8gCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBwcm9jZXNzX3RtX3NjaGVkX3V0aWxfbXNnKHZvaWQgKm1zZ19wYXlsb2FkKQoreworCisKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJjbWJhbF9tc2dfdHlwZSB0eXBlOworICAgIGJjbWJhbF90bV9zY2hlZF9rZXkga2V5OworCXRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdDsKKyAgICB0bV9zY2hlZF9mc21fZXZlbnQgdG1fc2NoZWRfZXZlbnQ7CisKKworICAgIEJVR19PTihOVUxMID09IG1zZ19wYXlsb2FkKTsKKyAgICBkbworICAgIHsKKyAgICAgICAgdHlwZSA9IGJjbWJhbF90eXBlX21pbm9yX2dldChtc2dfcGF5bG9hZCk7CQorICAgIAorCSAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgIlByb2Nlc3NpbmcgYSB0bSBzY2hlZCAlcyB1dGlsIG1lc3NhZ2UgZnJvbSAlc1xuIiwKKyAgICAgICAgICAgICAgICBiY21iYWxfbXNnX3Rfc3RyW3R5cGVdLAorICAgICAgICAgICAgICAgIHN1YnN5c3RlbV9zdHJbYmNtYmFsX3NlbmRlcl9nZXQobXNnX3BheWxvYWQpXSk7CisgICAgCisgICAgICAgIGlmKEJBTF9NU0dfVFlQRV9JTkQgPT0gdHlwZSkKKyAgICAJeworCSAgICAKKyAgICAgICAgLyogcmVjb3ZlciB0aGUga2V5IGZyb20gdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAga2V5ID0gKChiYWxfdXRpbF9tc2dfaW5kICopbXNnX3BheWxvYWQpLT5vYmpfa2V5LnRtX3NjaGVkX2tleTsKKyAgICAKKwkgICAgCisgICAgCS8qCisJICAgICAqIEdldCB0aGUgc3ViX3Rlcm0gaW5zdGFuY2UgdGhhdCdzIGJlaW5nIHJlZmVyZW5jZWQKKyAgICAJICovCisJICAgIHBfdG1fc2NoZWRfaW5zdCA9IHRtX3NjaGVkX2luc3RfZ2V0KGtleSwgVE1fU0NIRURfRkxBR19BQ1RJVkUpOworICAgIAorCSAgICBpZihOVUxMID09IHBfdG1fc2NoZWRfaW5zdCkKKyAgICAJeyAgCisJCSAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsIAorCQkJCSAgICAiaW52YWxpZCB0bSBzY2hlZCAoZGlyICVzIGlkICVkKSBmb3VuZCB3aGlsZSBwcm9jZXNzaW5nIGEgdXRpbCBtZXNzYWdlIHR5cGUgJXMgZnJvbSAlc1xuIiwKKyAgICAJCQkJVE1fU0NIRURfRElSX1RPX1NUUihrZXkuZGlyKSwKKwkJCQkgICAga2V5LmlkLAorICAgIAkJCQliY21iYWxfbXNnX3Rfc3RyW3R5cGVdLAorCQkJCSAgICBzdWJzeXN0ZW1fc3RyW2JjbWJhbF9zZW5kZXJfZ2V0KG1zZ19wYXlsb2FkKV0pOworCQkgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAJCWJyZWFrOworCSAgICB9CisgICAgCXRtX3NjaGVkX2V2ZW50Lm1zZyA9IG1zZ19wYXlsb2FkOwkKKwkgICAgCisJCSAgICB0bV9zY2hlZF9ldmVudC5ldmVudF90eXBlID0gVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfVVRJTF9NU0c7CisgICAgCQkKKyAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fc2NoZWQsICJwX3RtX3NjaGVkX2luc3QtPmZzbV9zdGF0ZT0lZCwgdG1fc2NoZWRfZXZlbnQuZXZlbnRfdHlwZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdC0+ZnNtX3N0YXRlLCAgdG1fc2NoZWRfZXZlbnQuZXZlbnRfdHlwZSk7CisJCSAgICAgICAgICAgIC8qUnVuIHRoZSB0bSBzY2hlZCBGU00gdG8gcHJvY2VzcyB0aGlzIGV2ZW50ICovCisgICAgICAgICAgICBpZihCQ01fRVJSX09LID09IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSB0bV9zY2hlZF9mc21fZXhlYyhwX3RtX3NjaGVkX2luc3QsICZ0bV9zY2hlZF9ldmVudCk7CisgICAgICAgICAgICB9CisJICAgIH0KKyAgICAJCisJICAgIGVsc2UKKyAgICAJeworCQkgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIAkJQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAKKwkJCQkgICAgIlVua25vd24gbWVzc2FnZSB0eXBlIHJlY2VpdmVkIGZyb20gdGhlIEFQUCAobm90IG9uZSBvZiBSU1A6QUNLOklORDpBVVRPX0lORCkgKHR5cGU6JWQpXG4iLAorICAgIAkJCQl0eXBlKTsKKwkgICAgfQorICAgIH13aGlsZSgwKTsJCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgVGhlIHRtIHNjaGVkICBGU00gc3RhdGUgcHJvY2Vzc2luZyBmb3IgYSB0bSBzY2hlZCBjcmVhdGUgY29tbWFuZCByZWNlaXZlZAorICogICAgICAgIGZyb20gdGhlIEJBTCBQdWJsaWMgQVBJLgorICoKKyAqIEBwYXJhbSBwX3RtX3NjaGVkX2luc3QgICAgICBQb2ludGVyIHRvIGEgdG0gc2NoZWQgaW5zdGFuY2UKKyAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBCQUwgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBCQUwgUHVibGljIEFQSQorICogQHBhcmFtIHBfZXZlbnQgICAgICAgICAgUG9pbnRlciB0byBhIHRtIHNjaGVkIGV2ZW50IHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gdG1fc2NoZWRfZnNtX2NyZWF0ZSh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bV9zY2hlZF9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIHBfdG1fc2NoZWRfaW5zdC0+ZnNtX3N0YXRlID0gVE1fU0NIRURfRlNNX1NUQVRFX0lOQUNUSVZFOworCisgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mbywgdG1fc2NoZWQsb3duZXIpKQorICAgIHsKKyAgICAgICAgcmV0ID0gYmNtYmFsX3RtX3NjaGVkX3NldF9vd25lcihwX3RtX3NjaGVkX2luc3QpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbWJhbF90bV9zY2hlZF9zZXRfb3duZXIodG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZF9pbnN0KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisJYmNtYmFsX3RtX3NjaGVkX293bmVyIG93bmVyOworICAgIGJjbWJhbF90bV9xdWV1ZV9rZXkgdG1fcXVldWVfa2V5OyAJCisgICAgYmNtYmFsX3RtX3NjaGVkX2tleSB0bV9zY2hlZF9rZXkgPSBwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmtleTsKKyAgICBxdWV1ZV9lbnRyeSAqY3VycmVudF9xdWV1ZV9lbnRyeTsKKworCisgICAgQlVHX09OKE5VTEwgPT0gcF90bV9zY2hlZF9pbnN0KTsKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYoCUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJnBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8sIHRtX3NjaGVkLG93bmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcF90bV9zY2hlZF9pbnN0LT5mc21fc3RhdGUgPSBUTV9TQ0hFRF9GU01fU1RBVEVfQVNTSUdORUQ7CisgICAgICAgICAgICBvd25lciA9IHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lcjsKKyAgICAgICAgICAgIHN3aXRjaChvd25lci50eXBlKQorICAgICAgICAgICAgeyAgICAKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0lOVEVSRkFDRToKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1NVQl9URVJNOgorICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfVU5JOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypubyBuZWVkIHRvIHZhbGlkYXRlIG93bmVyIGF0dHJpYnV0ZXMgYXMgdGhlc2UgYXJlIHJlYWQgb25seSBhbmQgc2V0IGJ5IFZBTElEIGludGVybmFsIG9iamVjdHMqLworICAgICAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBzd191dGlsX3RtX3NjaGVkX3NldChwX3RtX3NjaGVkX2luc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAgImVycm9yICVzIGRldGVjdGVkIGJ5IHN3aXRjaCB1dGlsIHdoaWxlIGFkZGluZyB0bSBzY2hlZFxuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBUaGUgaGFyZHdhcmUgaGFzIHByb3Blcmx5IGFjY2VwdGVkIHRoZSBvYmplY3QgaW5mbywgc28gdGhlIHJlcXVlc3Qgb2JqZWN0IGJlY29tZXMgIHRoZSBjdXJyZW50IHN0YXRlLiAqLworICAgICAgICAgICAgICAgICAgICBiY21iYWxfdG1fc2NoZWRfb2JqZWN0X292ZXJsYXlfd19zcmNfcHJpb3JpdHkoJnBfdG1fc2NoZWRfaW5zdC0+Y3VycmVudF90bV9zY2hlZF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdC0+ZnNtX3N0YXRlID0gVE1fU0NIRURfRlNNX1NUQVRFX0FDVElWRTsKKyAgICAgICAgICAgICAgICAgICAgLypjb25maWd1cmUgYWxsIGFzc2lnbmVkIHF1ZXVlcyovCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBUQUlMUV9GT1JFQUNIKGN1cnJlbnRfcXVldWVfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAmcF90bV9zY2hlZF9pbnN0LT5xdWV1ZXNfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtX3F1ZXVlX2tleS5pZCA9IGN1cnJlbnRfcXVldWVfZW50cnktPnF1ZXVlX2lkOworICAgICAgICAgICAgICAgICAgICAgICAgdG1fcXVldWVfa2V5LnNjaGVkX2lkID0gdG1fc2NoZWRfa2V5LmlkOworICAgICAgICAgICAgICAgICAgICAgICAgdG1fcXVldWVfa2V5LnNjaGVkX2RpciA9IHRtX3NjaGVkX2tleS5kaXI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBiY21iYWxfdG1fcXVldWVfc2V0X293bmVyKHRtX3F1ZXVlX2tleSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgIkNvdWxkIG5vdCBzZXQgcXVldWUgc2NoZWQgaWQgPSAlZCBzY2hlZCBkaXIgPSAlcyBxdWV1ZSBpZCA9ICVkIG9mIHRoZSB0bSBzY2hlZCAoJXMpXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtX3F1ZXVlX2tleS5zY2hlZF9pZCwgVE1fU0NIRURfRElSX1RPX1NUUih0bV9xdWV1ZV9rZXkuc2NoZWRfZGlyKSwgdG1fcXVldWVfa2V5LmlkLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBCQ01CQUxfT0JKX0lOX1BST0dSRVNTX1NFVCgmKHBfdG1fc2NoZWRfaW5zdC0+Y3VycmVudF90bV9zY2hlZF9pbmZvKSwgQkNNT1NfRkFMU0UpOworICAgICAgICAgICAgICAgICAgICBwX3RtX3NjaGVkX2luc3QtPmN1cnJlbnRfdG1fc2NoZWRfaW5mby5oZHIuaGRyLnN0YXR1cyA9IHJldDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9BR0dfUE9SVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9pbnRlcmZhY2Vfa2V5IGludGZfa2V5ID0gey5pbnRmX3R5cGUgPSBCQ01CQUxfSU5URl9UWVBFX1BPTiwgLmludGZfaWQgPSBvd25lci51LmFnZ19wb3J0LmludGZfaWR9OworICAgICAgICAgICAgICAgICAgICBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgc3ViX2tleSA9IHsuc3ViX3Rlcm1faWQgPSBvd25lci51LmFnZ19wb3J0LnN1Yl90ZXJtX2lkLCAuaW50Zl9pZCA9IGludGZfa2V5LmludGZfaWR9OworICAgICAgICAgICAgICAgICAgICAvKmZvciBhZ2cgcG9ydCwgc2hvdWxkIHZhbGlkYXRlIGludGYgYW5kIHN1YiB0ZXJtIHZhbGlkaXR5Ki8KKyAgICAgICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBzdWJfdGVybV9pbnN0X2dldCgmc3ViX2tleSwgU1VCX1RFUk1fRkxBR19BQ1RJVkUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCSJDYW4gbm90IHNldCBhbiBhZ2cgcG9ydCBmb3Igb251IChpZi0lZCBpZC0lZCkgd2hpY2ggZG9lcyBub3QgZXhpc3RcbiIsIGludGZfa2V5LmludGZfaWQsIHN1Yl9rZXkuc3ViX3Rlcm1faWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF90bV9zY2hlZCwJIkdldHRpbmcgYSBuZXcgQUxMT0MgSUQgZnJvbSByZXNvdXJjZSBtYW5hZ2VyXG4iKTsJCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBvd25lci51LmFnZ19wb3J0LmFnZ19wb3J0X2lkID0gMDsgLyogMCBpcyBhIG1hZ2ljIG51bWJlciB0ZWxsaW5nIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRoYXQgaXQgc2hvdWxkIHByb3ZpZGUgdGhlIGluaXRpYWwgYWxsb2NhdGlvbiBvZiB0aGUgQUxMT0MgSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcnNjX21ncl9hbGxvY19pZF9hbGxvYyhpbnRmX2tleS5pbnRmX2lkLCAmb3duZXIudS5hZ2dfcG9ydC5hZ2dfcG9ydF9pZCwgMSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQW4gZXJyb3IgaGFzIG9jY3VycmVkIHRyeWluZyB0byBnZXQgbWFuZGF0b3J5IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwJIkZhaWxlZCB0byBnZXQgQUxMT0MgSUQgZnJvbSByZXNvdXJjZSBtYW5hZ2VyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9SRVM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsJCQorICAgICAgICAgICAgICAgICAgICB9CisJCQkJCS8qc2V0IHRoZSBhZ2cgcG9ydCBpZCBpbnRvIHRoZSBpbnN0Ki8KKwkJCQkJQkNNQkFMX0NGR19QUk9QX1NFVCgmcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mbywgdG1fc2NoZWQsIG93bmVyLCBvd25lcik7CisJCQkJCQorICAgICAgICAgICAgICAgICAgICByZXQgPSBtYWNfdXRpbF9hZ2dfcG9ydF9zZXQocF90bV9zY2hlZF9pbnN0LCBCQUxfVVRJTF9PUEVSX0FHR19QT1JUX0FERCk7CQorICAgICAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQW4gZXJyb3IgaGFzIG9jY3VycmVkIHRyeWluZyB0byBjb25maWd1cmUgbWFjKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwJIkZhaWxlZCB0byBjb25maWd1cmUgQUxMT0MgSUQgYXQgbWFjICglcylcbiIsYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsJCQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9WSVJUVUFMOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgIm5vdGhpbmcgdG8gZG8gd2l0aCBvd25lciB0eXBlICVkIFxuIiwgcF90bV9zY2hlZF9pbnN0LT5jdXJyZW50X3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworYmNtb3NfZXJybm8gYmNtYmFsX3RtX3NjaGVkX3Vuc2V0X293bmVyKHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJjbWJhbF90bV9zY2hlZF9vd25lciAqb3duZXI7CisgICAgYmNtYmFsX3RtX3F1ZXVlX2tleSB0bV9xdWV1ZV9rZXk7CQorICAgIHF1ZXVlX2VudHJ5ICpjdXJyZW50X3F1ZXVlX2VudHJ5OworCXRtX3NjaGVkX2luc3QgKnBfcGFyZW50X3RtX3NjaGVkX2luc3Q7CisJCisgICAgQlVHX09OKE5VTEwgPT0gcF90bV9zY2hlZF9pbnN0KTsKKworICAgIHRtX3F1ZXVlX2tleS5zY2hlZF9pZCA9IHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmlkOworICAgIHRtX3F1ZXVlX2tleS5zY2hlZF9kaXIgPSBwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmtleS5kaXI7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYoIEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJnBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8sIHRtX3NjaGVkLCBvd25lcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIG93bmVyID0gJihwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXIpOworICAgICAgICAgICAgc3dpdGNoKG93bmVyLT50eXBlKQorICAgICAgICAgICAgewkgCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9JTlRFUkZBQ0U6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKnJlbW92ZSBhbGwgYXNzaWduZWQgcXVldWVzKi8KKyAgICAgICAgICAgICAgICAgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X3F1ZXVlX2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgJnBfdG1fc2NoZWRfaW5zdC0+cXVldWVzX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bV9xdWV1ZV9rZXkuaWQgPSBjdXJyZW50X3F1ZXVlX2VudHJ5LT5xdWV1ZV9pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gKHJldCA9IGJjbWJhbF90bV9xdWV1ZV91bnNldF9vd25lcih0bV9xdWV1ZV9rZXkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCSJDb3VsZCBub3QgdW5zZXQgcXVldWUgc2NoZWQgaWQgPSAlZCBzY2hlZCBkaXIgPSAlcyBxdWV1ZSBpZCA9ICVkIG9mIHRoZSB0bSBzY2hlZCAoJXMpIFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtX3F1ZXVlX2tleS5zY2hlZF9pZCwgVE1fU0NIRURfRElSX1RPX1NUUih0bV9xdWV1ZV9rZXkuc2NoZWRfZGlyKSwgdG1fcXVldWVfa2V5LmlkLCBiY21vc19zdHJlcnJvcihyZXQpKTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKnVuc2V0IGZyb20gcGFyZW50IHNjaGVkdWxlciovCisgICAgICAgICAgICAgICAgICAgIGlmKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJihwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvKSwgdG1fc2NoZWQsIHNjaGVkX3BhcmVudCkpCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyA9PSAocmV0ID0gYmNtYmFsX3RtX3NjaGVkX3ZhbGlkYXRlX3NjaGVkX3BhcmVudCgmKHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8pLCAmcF9wYXJlbnRfdG1fc2NoZWRfaW5zdCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gKHJldCA9IGJjbWJhbF90bV9zY2hlZF9zdWJfc2NoZWRzX2xpc3RfZW50cnlfcmVtb3ZlKHBfcGFyZW50X3RtX3NjaGVkX2luc3QsIHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmlkKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCSJjb3VsZCBub3QgcmVtb3ZlIHNjaGVkdWxlciBkaXIgPSAlcyBpZCA9ICVkIGFzIHBhcmVudCBvZiBzY2hlZCBkaXIgPSAlcyBpZCA9ICVkIChlcnI9ICVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTV9TQ0hFRF9ESVJfVE9fU1RSKHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmRpciksIHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5zY2hlZF9wYXJlbnQuc2NoZWRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1fU0NIRURfRElSX1RPX1NUUihwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmtleS5kaXIpLCBwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmtleS5pZCwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwJImNvdWxkIG5vdCB2YWxpZGF0ZSBzY2hlZHVsZXIgZGlyID0gJXMgaWQgPSAlZCBhcyBwYXJlbnQgb2Ygc2NoZWQgZGlyID0gJXMgaWQgPSAlZCAoZXJyPSAlcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTV9TQ0hFRF9ESVJfVE9fU1RSKHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmRpciksIHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5zY2hlZF9wYXJlbnQuc2NoZWRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTV9TQ0hFRF9ESVJfVE9fU1RSKHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmRpciksIHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmlkLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgLypubyBuZWVkIHRvIHZhbGlkYXRlIG93bmVyIGF0dHJpYnV0ZXMgYXMgdGhlc2UgYXJlIHJlYWQgb25seSBhbmQgc2V0IGJ5IFZBTElEIGludGVybmFsIG9iamVjdHMqLworICAgICAgICAgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBzd191dGlsX3RtX3NjaGVkX2NsZWFyKHBfdG1fc2NoZWRfaW5zdCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCSJlcnJvciAlcyBkZXRlY3RlZCBieSBzd2l0Y2ggdXRpbCB3aGlsZSBjbGVhcmluZyB0bSBzY2hlZFxuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwX3RtX3NjaGVkX2luc3QtPmZzbV9zdGF0ZSA9IFRNX1NDSEVEX0ZTTV9TVEFURV9JTkFDVElWRTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0FHR19QT1JUOgorICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfU1VCX1RFUk06CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9VTkk6CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9WSVJUVUFMOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisJCQkJeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsICJub3RoaW5nIHRvIGRvIHdpdGggdW5zZXR0aW5nIG93bmVyIHR5cGUgJWQgXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdC0+Y3VycmVudF90bV9zY2hlZF9pbmZvLmRhdGEub3duZXIudHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKwkJCQl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9d2hpbGUoMCk7CisgICAgcmV0dXJuIHJldDsKKworfQorCisvKmZvciB0aGUgYXV0byBjcmVhdGUsIG9ubHkga2V5IGRpciBpcyBzZXQsIGlkIHdpbGwgYmUgYWxsb2NhdGVkIGZyb20gcnNjIG1nciovCitiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfYXV0b19jcmVhdGUoYmNtYmFsX3RtX3NjaGVkX2NmZyBjZmcsIHRtX3NjaGVkX2luc3QgKipwX3RtX3NjaGVkX2luc3QpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBkbworICAgIHsKKyAgICAgICAgY2ZnLmtleS5pZCA9IDA7ICAvKiAwIGlzIGEgbWFnaWMgbnVtYmVyIHRlbGxpbmcgdGhlIHJlc291cmNlIG1hbmFnZXIgdGhhdCBpdCBzaG91bGQgcHJvdmlkZSB0aGUgaW5pdGlhbCBhbGxvY2F0aW9uIG9mIHRoZSAgdG0gc2NoZWQgaWQqLworICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBfcnNjX21ncl90bV9zY2hlZF9hdXRvX2lkX2FsbG9jKCZjZmcua2V5LmlkKSkpCisgICAgICAgIHsgICAgCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsIkNvdWxkIG5vdCBhbGxvY2F0ZSBhIHRtIHNjaGVkIGF1dG8gaWQgXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICpwX3RtX3NjaGVkX2luc3QgPSB0bV9zY2hlZF9pbnN0X2dldChjZmcua2V5LCBUTV9TQ0hFRF9GTEFHX0ZSRUUpOworICAgICAgICBpZihOVUxMID09IHBfdG1fc2NoZWRfaW5zdCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBpcyBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbiAqLworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLAorICAgICAgICAgICAgICAgICJFUlJPUiAtIGNvdWxkIG5vdCBhbGxvY2F0ZSB0bSBzY2hlZCBObyBmdXJ0aGVyIHByb2Nlc3NpbmdcbiIpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF90bV9zY2hlZCwKKyAgICAgICAgICAgICJcbiBUbSBTY2hlZCBpZCAlZCBkaXIgJXMgd2FzIGNyZWF0ZWQgXG4iLCBjZmcua2V5LmlkLCBUTV9TQ0hFRF9ESVJfVE9fU1RSKGNmZy5rZXkuZGlyKSk7CisgICAgICAgIAorICAgICAgICAoKnBfdG1fc2NoZWRfaW5zdCktPnJlcV90bV9zY2hlZF9pbmZvID0gY2ZnOworICAgICAgICByZXQgPSB0bV9zY2hlZF9mc21fY3JlYXRlKCpwX3RtX3NjaGVkX2luc3QsIE5VTEwsTlVMTCk7CQorICAgIH13aGlsZSgwKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX3RtX3NjaGVkX3F1ZXVlc19saXN0X2VudHJ5X2FkZCh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsIGJjbWJhbF90bV9xdWV1ZV9rZXkgcXVldWVfa2V5KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgcXVldWVfZW50cnkgKmN1cnJlbnRfZW50cnk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGlkIGlzIGFscmVhZHkgb24gdGhlIGxpc3QgYmVmb3JlIGFkZGluZyBpdCAqLworICAgICAgICBUQUlMUV9GT1JFQUNIKGN1cnJlbnRfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgJnBfdG1fc2NoZWRfaW5zdC0+cXVldWVzX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgbmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY3VycmVudF9lbnRyeS0+cXVldWVfaWQgPT0gcXVldWVfa2V5LmlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgYSBuZXcgZW50cnkgYW5kIGNvbmZpZ3VyZSBpdCAqLworICAgICAgICBjdXJyZW50X2VudHJ5ID0gYmNtb3NfY2FsbG9jKHNpemVvZihxdWV1ZV9lbnRyeSkpOworCisgICAgICAgIGlmKE5VTEwgPT0gY3VycmVudF9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLAorICAgICAgICAgICAgICAgICAgICAiTm8gbWVtb3J5IGF2YWlsYWJsZSB0byBhZGQgcXVldWVcbiIpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudF9lbnRyeS0+cXVldWVfaWQgID0gcXVldWVfa2V5LmlkOworCisgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF90bV9zY2hlZCwKKyAgICAgICAgICAgICAgICAiYWRkaW5nIHF1ZXVlIGlkICV1IHRvIHRtIHNjaGVkICV1XG4iLCBxdWV1ZV9rZXkuaWQsIHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmlkKTsKKworICAgICAgICAvKiBTYXZlIHRoZSBlbnRyeSBvbiB0aGUgbGlzdCBvZiBxdWV1ZXMgaWRzIG9uIHRoaXMgc2NoZWQqLworICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmcF90bV9zY2hlZF9pbnN0LT5xdWV1ZXNfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9lbnRyeSwgbmV4dCk7CisgICAgICAgIChwX3RtX3NjaGVkX2luc3QtPm51bV9xdWV1ZXNfb25fbm9kZSkrKzsKKyAgICB9IHdoaWxlKDApOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfcXVldWVzX2xpc3RfZW50cnlfcmVtb3ZlKHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCwgYmNtYmFsX3RtX3F1ZXVlX2tleSBxdWV1ZV9rZXkpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9OT0VOVDsKKyAgICBxdWV1ZV9lbnRyeSAqY3VycmVudF9lbnRyeSwgKnBfdGVtcF9lbnRyeTsKKworICAgIGRvCisgICAgeworCisgICAgICAgIC8qIENoZWNrIGlmIHRoZSBpZCBpcyBvbiB0aGUgbGlzdCAqLworICAgICAgICBUQUlMUV9GT1JFQUNIX1NBRkUoY3VycmVudF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX3RtX3NjaGVkX2luc3QtPnF1ZXVlc19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGVtcF9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY3VycmVudF9lbnRyeS0+cXVldWVfaWQgPT0gcXVldWVfa2V5LmlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIHF1ZXVlcyBpZHMgb24gdGhpcyBzY2hlZCovCisgICAgICAgICAgICAgICAgVEFJTFFfUkVNT1ZFKCZwX3RtX3NjaGVkX2luc3QtPnF1ZXVlc19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2VudHJ5LCBuZXh0KTsKKworICAgICAgICAgICAgICAgIGJjbW9zX2ZyZWUoY3VycmVudF9lbnRyeSk7CisKKyAgICAgICAgICAgICAgICAocF90bV9zY2hlZF9pbnN0LT5udW1fcXVldWVzX29uX25vZGUpLS07CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBxdWV1ZXNfbGlzdF9maWxsKHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdTggKnF1ZXVlc19saXN0KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgcXVldWVfZW50cnkgKmN1cnJlbnRfZW50cnkgPSBOVUxMOworICAgIGludCBpaSA9IDA7CisKKyAgICBkbworICAgIHsKKyAgICAgCisgICAgICAgIC8qIFRyYXZlcnNlIHRoZSBsaXN0IG9mIHF1ZXVlcyByZWNvcmRlZCBhbmQgZmlsbCBpbiB0aGUgbGlzdCB0byBiZSByZXR1cm5lZCAqLworICAgICAgICBxdWV1ZXNfbGlzdC0+bGVuID0gcF90bV9zY2hlZF9pbnN0LT5udW1fcXVldWVzX29uX25vZGU7CisgICAgICAgIHF1ZXVlc19saXN0LT52YWwgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWJhbF90bV9xdWV1ZV9pZCkgKiBxdWV1ZXNfbGlzdC0+bGVuKTsKKworICAgICAgICBpZihOVUxMID09IHF1ZXVlc19saXN0LT52YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgIk5vIG1lbW9yeSBhdmFpbGFibGVcbiIpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICBUQUlMUV9GT1JFQUNIKGN1cnJlbnRfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgJnBfdG1fc2NoZWRfaW5zdC0+cXVldWVzX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgbmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3NjaGVkLAorICAgICAgICAgICAgICAgICAgICAiYWRkaW5nIHF1ZXVlICVkIHRvIHJlc3BvbnNlIGF0IGFycmF5IGxvY2F0aW9uICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2VudHJ5LT5xdWV1ZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgaWkpOworICAgICAgICAgICAgcXVldWVzX2xpc3QtPnZhbFtpaSsrXSA9IGN1cnJlbnRfZW50cnktPnF1ZXVlX2lkOworICAgICAgICB9CisgICAgfSB3aGlsZSgwKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX3RtX3NjaGVkX3N1Yl9zY2hlZHNfbGlzdF9lbnRyeV9hZGQodG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZF9pbnN0LCBiY21iYWxfdG1fc2NoZWRfaWQgc2NoZWRfaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBzdWJfc2NoZWRfZW50cnkgKmN1cnJlbnRfZW50cnk7CisKKwlCVUdfT04oTlVMTCA9PSBwX3RtX3NjaGVkX2luc3QpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIENoZWNrIGlmIHRoZSBpZCBpcyBhbHJlYWR5IG9uIHRoZSBsaXN0IGJlZm9yZSBhZGRpbmcgaXQgKi8KKyAgICAgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICZwX3RtX3NjaGVkX2luc3QtPnN1Yl9zY2hlZHNfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICBuZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBpZihjdXJyZW50X2VudHJ5LT5zY2hlZF9pZCA9PSBzY2hlZF9pZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IGEgbmV3IGVudHJ5IGFuZCBjb25maWd1cmUgaXQgKi8KKyAgICAgICAgY3VycmVudF9lbnRyeSA9IGJjbW9zX2NhbGxvYyhzaXplb2Yoc3ViX3NjaGVkX2VudHJ5KSk7CisKKyAgICAgICAgaWYoTlVMTCA9PSBjdXJyZW50X2VudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICJObyBtZW1vcnkgYXZhaWxhYmxlIHRvIGFkZCBzdWIgc2NoZWRcbiIpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY3VycmVudF9lbnRyeS0+c2NoZWRfaWQgPSBzY2hlZF9pZDsKKworICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgImFkZGluZyBzdWIgc2NoZWQgaWQgJXUgdG8gdG0gc2NoZWQgZGlyID0gJXMgaWQgPSAldVxuIiwgCisgICAgICAgICAgICAgICAgc2NoZWRfaWQsIFRNX1NDSEVEX0RJUl9UT19TVFIocF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5rZXkuZGlyKSwgcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5rZXkuaWQpOworCisgICAgICAgIC8qIFNhdmUgdGhlIGVudHJ5IG9uIHRoZSBsaXN0IG9mIHN1Yl9zY2hlZHMgb24gdGhhdCB0bSBzY2hlZCAqLworICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmcF90bV9zY2hlZF9pbnN0LT5zdWJfc2NoZWRzX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZW50cnksIG5leHQpOworICAgICAgICAocF90bV9zY2hlZF9pbnN0LT5udW1fc3ViX3NjaGVkc19vbl9ub2RlKSsrOworCQkKKyAgICB9IHdoaWxlKDApOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfc3ViX3NjaGVkc19saXN0X2VudHJ5X3JlbW92ZSh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsIGJjbWJhbF90bV9zY2hlZF9pZCBzY2hlZF9pZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX05PRU5UOworICAgIHN1Yl9zY2hlZF9lbnRyeSAqY3VycmVudF9lbnRyeSwgKnBfdGVtcF9lbnRyeTsKKworICAgIGRvCisgICAgeworCisgICAgICAgIC8qIENoZWNrIGlmIHRoZSBpZCBpcyBvbiB0aGUgbGlzdCAqLworICAgICAgICBUQUlMUV9GT1JFQUNIX1NBRkUoY3VycmVudF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX3RtX3NjaGVkX2luc3QtPnN1Yl9zY2hlZHNfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RlbXBfZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGN1cnJlbnRfZW50cnktPnNjaGVkX2lkID09IHNjaGVkX2lkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIHN1Yl9zY2hlZHMgaWRzIG9uIHRoaXMgc2NoZWQqLworICAgICAgICAgICAgICAgIFRBSUxRX1JFTU9WRSgmcF90bV9zY2hlZF9pbnN0LT5zdWJfc2NoZWRzX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZW50cnksIG5leHQpOworCisgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShjdXJyZW50X2VudHJ5KTsKKworICAgICAgICAgICAgICAgIChwX3RtX3NjaGVkX2luc3QtPm51bV9zdWJfc2NoZWRzX29uX25vZGUpLS07CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBzdWJfc2NoZWRzX2xpc3RfZmlsbCh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4ICpzdWJfc2NoZWRzX2xpc3QpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBzdWJfc2NoZWRfZW50cnkgKmN1cnJlbnRfZW50cnkgPSBOVUxMOworICAgIGludCBpaSA9IDA7CisKKyAgICBkbworICAgIHsKKyAgICAgCisgICAgICAgIC8qIFRyYXZlcnNlIHRoZSBsaXN0IG9mIHN1Yl9zY2hlZHNfaWRzIHJlY29yZGVkIGFuZCBmaWxsIGluIHRoZSBsaXN0IHRvIGJlIHJldHVybmVkICovCisgICAgICAgIHN1Yl9zY2hlZHNfbGlzdC0+bGVuID0gcF90bV9zY2hlZF9pbnN0LT5udW1fc3ViX3NjaGVkc19vbl9ub2RlOworICAgICAgICBzdWJfc2NoZWRzX2xpc3QtPnZhbCA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYmNtYmFsX3RtX3NjaGVkX2lkKSAqIHN1Yl9zY2hlZHNfbGlzdC0+bGVuKTsKKworICAgICAgICBpZihOVUxMID09IHN1Yl9zY2hlZHNfbGlzdC0+dmFsKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICJObyBtZW1vcnkgYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICZwX3RtX3NjaGVkX2luc3QtPnN1Yl9zY2hlZHNfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICBuZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICJhZGRpbmcgc3ViIHNjaGVkICVkIHRvIHJlc3BvbnNlIGF0IGFycmF5IGxvY2F0aW9uICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2VudHJ5LT5zY2hlZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgaWkpOworICAgICAgICAgICAgc3ViX3NjaGVkc19saXN0LT52YWxbaWkrK10gPSBjdXJyZW50X2VudHJ5LT5zY2hlZF9pZDsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSgwKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbWJhbF90bV9zY2hlZF9zZXRfcXVldWUodG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0KQoreworCWJjbW9zX2Vycm5vICByZXQgPSBCQ01fRVJSX09LOworCXRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCA9IE5VTEw7CisJYmNtYmFsX3RtX3NjaGVkX2tleSB0bV9zY2hlZF9rZXk7CisJQlVHX09OKE5VTEwgPT0gcF90bV9xdWV1ZV9pbnN0KTsKKwlkbworICAgIHsKKyAgICAgICAgdG1fc2NoZWRfa2V5LmlkID0gcF90bV9xdWV1ZV9pbnN0LT5hcGlfcmVxX3RtX3F1ZXVlX2luZm8ua2V5LnNjaGVkX2lkOworICAgICAgICB0bV9zY2hlZF9rZXkuZGlyPSBwX3RtX3F1ZXVlX2luc3QtPmFwaV9yZXFfdG1fcXVldWVfaW5mby5rZXkuc2NoZWRfZGlyOworICAgICAgICBwX3RtX3NjaGVkX2luc3QgPSB0bV9zY2hlZF9pbnN0X2dldCh0bV9zY2hlZF9rZXksIFRNX1NDSEVEX0ZMQUdfQUNUSVZFKTsKKwkJCisgICAgICAgIGlmKE5VTEwgPT0gcF90bV9zY2hlZF9pbnN0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICJFUlJPUiAtIGNvdWxkIG5vdCBmaW5kIGFuIGFjdGl2ZSB0bSBzY2hlZCAoZGlyID0gJXMgaWQgPSAlZCkgdG8gYXR0YWNoIHRoZSBxdWV1ZSAoaWQgPSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgIFRNX1NDSEVEX0RJUl9UT19TVFIodG1fc2NoZWRfa2V5LmRpciksIHRtX3NjaGVkX2tleS5pZCxwX3RtX3F1ZXVlX2luc3QtPmFwaV9yZXFfdG1fcXVldWVfaW5mby5rZXkuaWQpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldCA9IGJjbWJhbF90bV9zY2hlZF9xdWV1ZXNfbGlzdF9lbnRyeV9hZGQocF90bV9zY2hlZF9pbnN0LCBwX3RtX3F1ZXVlX2luc3QtPmFwaV9yZXFfdG1fcXVldWVfaW5mby5rZXkpOworICAgICAgICBpZihCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAJeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLAorICAgICAgICAgICAgICAgICAgICAiRVJST1IgLSBjb3VsZCBub3QgYWRkIHRoZSBxdWV1ZSBlbnRyeSB0byB0aGUgc2NoZWRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYoVE1fU0NIRURfRlNNX1NUQVRFX0FDVElWRSA9PSBwX3RtX3NjaGVkX2luc3QtPmZzbV9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSAocmV0ID0gYmNtYmFsX3RtX3F1ZXVlX2FjdGl2YXRlKHBfdG1fcXVldWVfaW5zdCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFUlJPUiAtIGNvdWxkIG5vdCBhY3RpdmF0ZSB0aGUgbmV3bHkgYWRkZWQgcXVldWUgXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKyAgICByZXR1cm4gcmV0OworfQorCitiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfcmVtb3ZlX3F1ZXVlKHRtX3F1ZXVlX2luc3QgKnBfdG1fcXVldWVfaW5zdCkKK3sKKyAgICBiY21vc19lcnJubyAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICB0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QgPSBOVUxMOworICAgIGJjbWJhbF90bV9zY2hlZF9rZXkgdG1fc2NoZWRfa2V5OworICAgIEJVR19PTihOVUxMID09IHBfdG1fcXVldWVfaW5zdCk7CisgICAgZG8KKyAgICB7CisgICAgICAgIHRtX3NjaGVkX2tleS5pZCA9IHBfdG1fcXVldWVfaW5zdC0+YXBpX3JlcV90bV9xdWV1ZV9pbmZvLmtleS5zY2hlZF9pZDsKKyAgICAgICAgdG1fc2NoZWRfa2V5LmRpcj0gcF90bV9xdWV1ZV9pbnN0LT5hcGlfcmVxX3RtX3F1ZXVlX2luZm8ua2V5LnNjaGVkX2RpcjsKKyAgICAgICAgcF90bV9zY2hlZF9pbnN0ID0gdG1fc2NoZWRfaW5zdF9nZXQodG1fc2NoZWRfa2V5LCBUTV9TQ0hFRF9GTEFHX0FDVElWRSk7CisgICAgICAgIAorICAgICAgICBpZihOVUxMID09IHBfdG1fc2NoZWRfaW5zdCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLAorICAgICAgICAgICAgICAgICAgICAiRVJST1IgLSBjb3VsZCBub3QgZmluZCBhbiBhY3RpdmUgdG0gc2NoZWQgKGRpciA9ICVzIGlkID0gJWQpIHRvIGF0dGFjaCB0aGUgcXVldWUgKGlkID0gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBUTV9TQ0hFRF9ESVJfVE9fU1RSKHRtX3NjaGVkX2tleS5kaXIpLCB0bV9zY2hlZF9rZXkuaWQscF90bV9xdWV1ZV9pbnN0LT5hcGlfcmVxX3RtX3F1ZXVlX2luZm8ua2V5LmlkKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZihCQ01fRVJSX09LICE9IChyZXQgPSBiY21iYWxfdG1fc2NoZWRfcXVldWVzX2xpc3RfZW50cnlfcmVtb3ZlKHBfdG1fc2NoZWRfaW5zdCwgcF90bV9xdWV1ZV9pbnN0LT5hcGlfcmVxX3RtX3F1ZXVlX2luZm8ua2V5KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwKKyAgICAgICAgICAgICAgICAiRVJST1IgLSBjb3VsZCBub3QgcmVtb3ZlIHRoZSBxdWV1ZSBlbnRyeSBmcm9tIHRoZSBzY2hlZFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIAorICAgIH13aGlsZSgwKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKnRtX3NjaGVkX2ZpbmRfYnlfb3duZXIgLSBjdXJyZW50bHkgbWlnaHQgYmUgY2FsbGVkIGZvciBhZ2cgcG9ydCBhbmQgdW5pIHBvcnQgb25seSovCitzdGF0aWMgdG1fc2NoZWRfaW5zdCogdG1fc2NoZWRfZmluZF9ieV9vd25lcihiY21iYWxfdG1fc2NoZWRfb3duZXIgb3duZXIpCit7CisgICAgdG1fc2NoZWRfaW5zdCAqY3VycmVudF9lbnRyeSA9IE5VTEw7CisgICAgCisgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X2VudHJ5LAorICAgICAgICAmVE1fU0NIRURfRlNNX1RNX1NDSEVEX0xJU1RfQ1RYX1BUUi0+YWN0aXZlX3RtX3NjaGVkX2xpc3QsCisgICAgICAgIHRtX3NjaGVkX2luc3RfbmV4dCkKKyAgICB7ICAgIAorICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjdXJyZW50X2VudHJ5LT5yZXFfdG1fc2NoZWRfaW5mbywgdG1fc2NoZWQsb3duZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goY3VycmVudF9lbnRyeS0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfQUdHX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZigob3duZXIudS5hZ2dfcG9ydC5pbnRmX2lkID09IGN1cnJlbnRfZW50cnktPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXIudS5hZ2dfcG9ydC5pbnRmX2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG93bmVyLnUuYWdnX3BvcnQuYWdnX3BvcnRfaWQgPT0gY3VycmVudF9lbnRyeS0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci51LmFnZ19wb3J0LmFnZ19wb3J0X2lkKSkKKyAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3NjaGVkLCAgIkZvdW5kIGFjdGl2ZSB0bV9zY2hlZCBkaXIgPSB1cyBpZD0gJWQgZm9yIGFnZ19wb3J0X2lkICVkIGludGZfaWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9lbnRyeS0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmlkLCBvd25lci51LmFnZ19wb3J0LmFnZ19wb3J0X2lkLCBvd25lci51LmFnZ19wb3J0LmludGZfaWQpOworCQkJCSAgICAgICAgcmV0dXJuIGN1cnJlbnRfZW50cnk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgIAkJY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9VTkk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZigob3duZXIudS51bmkuaW50Zl9pZCA9PSBjdXJyZW50X2VudHJ5LT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLm93bmVyLnUudW5pLmludGZfaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAob3duZXIudS51bmkuc3ViX3Rlcm1faWQgPT0gY3VycmVudF9lbnRyeS0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci51LnVuaS5zdWJfdGVybV9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChvd25lci51LnVuaS5pZHggPT0gY3VycmVudF9lbnRyeS0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci51LnVuaS5pZHgpKQorICAgICAgICAgICAgICAgICAgICB7ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3NjaGVkLCAiRm91bmQgYWN0aXZlIHRtX3NjaGVkIGlkID0gJWQgZm9yIHVuaSBpbnRmX2lkID0gJWQgc3ViX2lkID0gJWQgdW5pX2lkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9lbnRyeS0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmlkLCBvd25lci51LnVuaS5pbnRmX2lkLCBvd25lci51LnVuaS5zdWJfdGVybV9pZCwgb3duZXIudS51bmkuaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50X2VudHJ5OworICAgICAgICAgICAgICAgICAgICB9CQkJCQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCQkKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjdXJyZW50X2VudHJ5OworfQorCit0bV9zY2hlZF9pbnN0KiB0bV9zY2hlZF9maW5kX2FnZ19wb3J0X25vZGUodWludDhfdCBpbnRmX2lkLCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBhZ2dfcG9ydF9pZCkKK3sKKyAgICBiY21iYWxfdG1fc2NoZWRfb3duZXIgb3duZXI7CisJb3duZXIudHlwZSA9IEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0FHR19QT1JUOworCW93bmVyLnUuYWdnX3BvcnQuaW50Zl9pZCA9IGludGZfaWQ7CisJb3duZXIudS5hZ2dfcG9ydC5hZ2dfcG9ydF9pZCA9IGFnZ19wb3J0X2lkOworCisJcmV0dXJuIHRtX3NjaGVkX2ZpbmRfYnlfb3duZXIob3duZXIpOworfQorCisKKworc3RhdGljIGJjbW9zX2Vycm5vIHRtX3NjaGVkX2ZzbV9hc3NpZ25lZF9wcm9jZXNzX3V0aWxfbXNnKHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCwgdm9pZCAqbXNnLCB0bV9zY2hlZF9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisKKyAgICBiY21vc19lcnJubyByZXQ7CisgICAgYmFsX3V0aWxfbXNnX2luZCAqaW5kX21zZzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04oTlVMTCA9PSBwX3RtX3NjaGVkX2luc3QpOworICAgIEJVR19PTihOVUxMID09IG1zZyk7CisgICAgQlVHX09OKE5VTEwgPT0gcF9ldmVudCk7CisKKyAgICBpbmRfbXNnID0gKGJhbF91dGlsX21zZ19pbmQgKiltc2c7CisJCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3RtX3NjaGVkLCAKKyAgICAgICAgICAgICIgUmVjZWl2ZWQgYSBJTkQgbWVzc2FnZSBmcm9tIEJBTCBVVElMICglcykgZHVyaW5nICVzIHN0YXRlXG4iLAorICAgICAgICAgICAgIHN1YnN5c3RlbV9zdHJbYmNtYmFsX3NlbmRlcl9nZXQobXNnKV0sCisgICAgICB0bV9zY2hlZF9zdGF0ZV9uYW1lX2dldChwX3RtX3NjaGVkX2luc3QtPmZzbV9zdGF0ZSkpOworCisgICAgLyogSGFuZGxlIHJlc3BvbnNlICovCisgICAgcmV0ID0gaW5kX21zZy0+c3RhdHVzOworICAgIAorICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgIHsKKyAgICAgICAgcF90bV9zY2hlZF9pbnN0LT5mc21fc3RhdGUgPSBUTV9TQ0hFRF9GU01fU1RBVEVfQUNUSVZFOworICAgICAgICBiY21iYWxfdG1fc2NoZWRfb2JqZWN0X292ZXJsYXlfd19zcmNfcHJpb3JpdHkoJnBfdG1fc2NoZWRfaW5zdC0+Y3VycmVudF90bV9zY2hlZF9pbmZvLAorCQkJCQkJCQkJICAmcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mbyk7CisgICAJfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIEVycm9yICovCisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgCisgICAgICAgICAgICAgICAgIkZhaWxlZCBpbiBzdGF0ZSAlczslc1xuIiwKKyAgICAgICAgICAgICAgICB0bV9zY2hlZF9zdGF0ZV9uYW1lX2dldChwX3RtX3NjaGVkX2luc3QtPmZzbV9zdGF0ZSksCisgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgfQorCisgICAgbWdtdF9tc2dfc2VuZF9iYWxhcGlfaW5kKHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcF90bV9zY2hlZF9pbnN0LT5jdXJyZW50X3RtX3NjaGVkX2luZm8uaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaWRfdG1fc2NoZWQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLypjdXJyZW50bHkgaGFuZGxpbmcgdXRpbCBtc2cgb2YgYWxsb2MgaWQgc2V0dGluZyBjb21wbGV0ZSBvbmx5IGZvciBhZ2cgcG9ydCB0bSBzY2hlZCBvbmx5Ki8KK3N0YXRpYyBiY21vc19lcnJubyB0bV9zY2hlZF9mc21fZGVsZXRpbmdfcHJvY2Vzc191dGlsX21zZyh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1fc2NoZWRfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJldDsKKyAgICBiYWxfdXRpbF9tc2dfaW5kICppbmRfbXNnOworICAgIAorICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04oTlVMTCA9PSBwX3RtX3NjaGVkX2luc3QpOworICAgIEJVR19PTihOVUxMID09IG1zZyk7CisgICAgQlVHX09OKE5VTEwgPT0gcF9ldmVudCk7CisgICAgCisgICAgZG8KKyAgICB7CisgICAgICAgIGluZF9tc2cgPSAoYmFsX3V0aWxfbXNnX2luZCAqKW1zZzsKKwkJCisgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF90bV9zY2hlZCwgCisgICAgICAgICAgICAgICAgICAgICIgUmVjZWl2ZWQgYSBJTkQgbWVzc2FnZSBmcm9tIEJBTCBVVElMICglcykgZHVyaW5nICVzIHN0YXRlXG4iLAorICAgICAgICAgICAgICAgICAgICBzdWJzeXN0ZW1fc3RyW2JjbWJhbF9zZW5kZXJfZ2V0KG1zZyldLAorICAgICAgICAgICAgICAgICAgICB0bV9zY2hlZF9zdGF0ZV9uYW1lX2dldChwX3RtX3NjaGVkX2luc3QtPmZzbV9zdGF0ZSkpOworICAgICAgICAKKyAgICAgICAgLyogSGFuZGxlIHJlc3BvbnNlICovCisgICAgICAgIHJldCA9IGluZF9tc2ctPnN0YXR1czsKKyAgICAgICAgCisgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICAgcmV0ID0gdG1fc2NoZWRfZnNtX2Rlc3Ryb3kocF90bV9zY2hlZF9pbnN0KTsgICAKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsIAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIGluIHN0YXRlICVzOyVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0bV9zY2hlZF9zdGF0ZV9uYW1lX2dldChwX3RtX3NjaGVkX2luc3QtPmZzbV9zdGF0ZSksCisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICB9ICAgIAorICAgIH13aGlsZSgwKTsJCQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB0bV9zY2hlZF9mc21fZGVzdHJveSh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QpCit7CisgICAgcXVldWVfZW50cnkgKmN1cnJlbnRfZW50cnkgPSBOVUxMOworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgYmNtYmFsX3RtX3F1ZXVlX2tleSB0bV9xdWV1ZV9rZXk7IAkKKyAgICB0bV9xdWV1ZV9pbnN0ICpwX3RtX3F1ZXVlX2luc3Q7CisgICAgaW50IGk9MDsJCisgICAgYmNtYmFsX3RtX3NjaGVkX293bmVyIG93bmVyOworCQorICAgIGRvCisgICAgeworICAgICAgICBzd2l0Y2gocF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLm93bmVyLnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfQUdHX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF90bV9zY2hlZF9pbnN0LT5mc21fc3RhdGUgPSBUTV9TQ0hFRF9GU01fU1RBVEVfTlVMTDsKKyAgICAgICAgICAgICAgICBvd25lciA9IHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lcjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldCA9IHJzY19tZ3JfYWxsb2NfaWRfZnJlZShvd25lci51LmFnZ19wb3J0LmludGZfaWQsIG93bmVyLnUuYWdnX3BvcnQuYWdnX3BvcnRfaWQsIE5VTEwpOworICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZyZWUgYWxsb2MgaWQgaWY9JWQgaWQ9JWQgYXQgcmVzb3VyY2UgbWFuYWdlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyLnUuYWdnX3BvcnQuaW50Zl9pZCwgb3duZXIudS5hZ2dfcG9ydC5hZ2dfcG9ydF9pZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXQgPSB0bV9zY2hlZF9mc21fZGVzdHJveShwX3RtX3NjaGVkX2luc3QpOworICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZyZWUgYXV0byBjcmVhdGVkIHRtIHNjaGVkIGlkLCAgaWQ9JWQgYXQgcmVzb3VyY2UgbWFuYWdlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9JTlRFUkZBQ0U6CisgICAgICAgICAgICB7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdG1fcXVldWVfa2V5LnNjaGVkX2lkID0gcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5rZXkuaWQ7CisgICAgICAgICAgICAgICAgdG1fcXVldWVfa2V5LnNjaGVkX2RpciA9IHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmRpcjsKKyAgICAgICAgICAgIAorCQkJLypkZWxldGUgYWxsIGF0dGFjaGVkIHF1ZXVlcyovCisgICAgICAgICAgICAgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAmcF90bV9zY2hlZF9pbnN0LT5xdWV1ZXNfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgbmV4dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfdG1fc2NoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgcXVldWUgJXUgKGxvY2F0aW9uICV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZW50cnktPnF1ZXVlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgICAgIHRtX3F1ZXVlX2tleS5pZCA9IGN1cnJlbnRfZW50cnktPnF1ZXVlX2lkOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcF90bV9xdWV1ZV9pbnN0ID0gdG1fcXVldWVfaW5zdF9nZXQodG1fcXVldWVfa2V5LCBUTV9RVUVVRV9GTEFHX0FDVElWRSk7CisgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gcF90bV9xdWV1ZV9pbnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsIkVSUk9SIC0gdG0gcXVldWUgbm90IGZvdW5kLiAgTm8gZnVydGhlciBwcm9jZXNzaW5nXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXQgPSBiY21iYWxfdG1fcXVldWVfZGVzdHJveShwX3RtX3F1ZXVlX2luc3QsIEJDTU9TX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwiRVJST1IgLSBjb3VsZCBub3QgZGVzdHJveSB0bSBxdWV1ZSAlZCAgLk5vIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuIiwKKwkJCQkJCQkgICAgdG1fcXVldWVfa2V5LmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBiY21vc19mcmVlKGN1cnJlbnRfZW50cnkpOyAKKyAgICAgICAgICAgICAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJCQkKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZihwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEuY3JlYXRpb25fbW9kZSA9PSBCQ01CQUxfVE1fQ1JFQVRJT05fTU9ERV9BVVRPKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBfcnNjX21ncl90bV9zY2hlZF9hdXRvX2lkX2ZyZWUocF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5rZXkuaWQpOworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmcmVlIGF1dG8gY3JlYXRlZCB0bSBzY2hlZCBpZCwgaWQ9JWQgYXQgcmVzb3VyY2UgbWFuYWdlciAiLAorICAgICAgICAgICAgICAgICAgICAgICBwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmtleS5pZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJCisgICAgICAgIG1nbXRfbXNnX3NlbmRfYmFsYXBpX2luZChyZXQsCisgICAgICAgICAgICAodm9pZCAqKSZwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmhkciwKKyAgICAgICAgICAgIGxvZ19pZF90bV9zY2hlZCk7CisgICAgICAgIAorICAgICAgICByZXQgPSB0bV9zY2hlZF9mcmVlX2J5X2VudHJ5KHBfdG1fc2NoZWRfaW5zdCk7CisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsIAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZnJlZSB0bSBzY2hlZCBpZD0lZCBkaXIgPSAlcyIscF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5rZXkuaWQsCisgICAgICAgICAgICAgICAgVE1fU0NIRURfRElSX1RPX1NUUihwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmtleS5kaXIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfXdoaWxlKDApOworICAgIHJldHVybiByZXQ7CisKK30KKwkKK3N0YXRpYyBiY21vc19lcnJubyB0bV9zY2hlZF9mc21faW5hY3RpdmVfZGVzdHJveSh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QsIHZvaWQgKm1zZywgdG1fc2NoZWRfZnNtX2V2ZW50ICpwX2V2ZW50KQoreworICAgIHJldHVybiB0bV9zY2hlZF9mc21fZGVzdHJveShwX3RtX3NjaGVkX2luc3QpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdG1fc2NoZWRfZnNtX2FjdGl2ZV9kZXN0cm95KHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCwgdm9pZCAqbXNnLCB0bV9zY2hlZF9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisgICAgcmV0dXJuIGJjbWJhbF90bV9zY2hlZF9mc21fYWN0aXZlX2Rlc3Ryb3kocF90bV9zY2hlZF9pbnN0KTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHRtX3NjaGVkX2ZzbV9hc3NpZ25lZF9kZXN0cm95KHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCwgdm9pZCAqbXNnLCB0bV9zY2hlZF9mc21fZXZlbnQgKnBfZXZlbnQpCit7CisJYmNtb3NfZXJybm8gcmV0ID0gYmNtYmFsX3RtX3NjaGVkX2ZzbV9hY3RpdmVfZGVzdHJveShwX3RtX3NjaGVkX2luc3QpOworCWlmIChCQ01fRVJSX09LID09IHJldCkKKwkJcmV0ID0gdG1fc2NoZWRfZnNtX2Rlc3Ryb3kocF90bV9zY2hlZF9pbnN0KTsKKworICAgIHJldHVybiByZXQ7CisJCit9CitiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfZnNtX2FjdGl2ZV9kZXN0cm95KHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJjbWJhbF90bV9zY2hlZF9vd25lciBvd25lciA9IHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lcjsKKyAgICBiY21iYWxfaW50ZXJmYWNlX2tleSBpbnRmX2tleTsKKworCQkKKyAgICBzd2l0Y2gob3duZXIudHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfQUdHX1BPUlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlZl9jb3VudDsKKyAgICAgICAgICAgIHJldCA9IHJzY19tZ3JfYWxsb2NfaWRfZ2V0X3JlZl9jb3VudChwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXIudS5hZ2dfcG9ydC5pbnRmX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lci51LmFnZ19wb3J0LmFnZ19wb3J0X2lkLCAmcmVmX2NvdW50KTsKKyAgICAgICAgICAgIGlmKDEhPSByZWZfY291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAiQ2FudCBkZXN0cm95IHRtIHNjaGVkIG93bmVkIGJ5IGFnZyBwb3J0IChpZiAlZCBpZCAlZCkgIgorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCByZWZlcmVuY2UgY291bnQgJWQgKGdyZWF0ZWQgdGhhbiAxKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLm93bmVyLnUuYWdnX3BvcnQuaW50Zl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5kYXRhLm93bmVyLnUuYWdnX3BvcnQuYWdnX3BvcnRfaWQsIHJlZl9jb3VudCk7CisJCQkJcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICBicmVhazsJCQorICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBtYWNfdXRpbF9hZ2dfcG9ydF9zZXQocF90bV9zY2hlZF9pbnN0LCBCQUxfVVRJTF9PUEVSX0FHR19QT1JUX1JFTU9WRSk7CQorICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQW4gZXJyb3IgaGFzIG9jY3VycmVkIHRyeWluZyB0byBjb25maWd1cmUgbWFjKi8KKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsCSJGYWlsZWQgdG8gcmVtb3ZlIEFMTE9DIElEIGF0IG1hYyAoJXMpXG4iLGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgICAgIGJyZWFrOwkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF90bV9zY2hlZF9pbnN0LT5mc21fc3RhdGUgPSBUTV9TQ0hFRF9GU01fU1RBVEVfREVMRVRJTkc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0lOVEVSRkFDRToKKyAgICAgICAgeworICAgICAgICAgICAgLypyZW1vdmUgdGhlIHNldHRpbmcgb2YgdGhlIHNjaGVkIGZyb20gdGhlIG93bmVyIGNvbmZpZ3VyYXRpb24qLworICAgICAgICAgICAgaW50Zl9rZXkuaW50Zl90eXBlID0gb3duZXIudS5pbnRlcmZhY2UuaW50Zl90eXBlOworICAgICAgICAgICAgaW50Zl9rZXkuaW50Zl9pZCA9IG93bmVyLnUuaW50ZXJmYWNlLmludGZfaWQ7CisgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfdG1fc2NoZWRfdW5zZXQoaW50Zl9rZXksIHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5KTsKKyAgICAgICAgICAgIHRtX3NjaGVkX2ZzbV9kZXN0cm95KHBfdG1fc2NoZWRfaW5zdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0JCisgICAgcmV0dXJuIHJldDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBBIGZ1bmN0aW9uIHRvIHNldCBhbiBpbnRlcmZhY2UgYXMgYSB0bSBzY2hlZCBvd25lcgorICoKKyAqIEBwYXJhbSBpbnRlcmZhY2Vfa2V5ICB0aGUgaW50ZXJmYWNlIHRvIGJlY29tZSB0aGUgb3duZXIKKyAqIEBwYXJhbSBwX3RtX3NjaGVkX2luc3QgICAgICAgICAgdGhlIHRtIHNjaGVkIGluc3RhbmNlIHRvIGJlIHNldAorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfc2V0X2ludGVyZmFjZV9vd25lcihiY21iYWxfaW50ZXJmYWNlX2tleSBpbnRlcmZhY2Vfa2V5LCB0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QpCit7CisgICAgQlVHX09OKE5VTEwgPT0gcF90bV9zY2hlZF9pbnN0KTsKKyAgICAKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJjbWJhbF90bV9zY2hlZF9vd25lciBvd25lcjsKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYoQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mbywgdG1fc2NoZWQsIG93bmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3duZXIgPSBwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmRhdGEub3duZXI7CisgICAgICAgICAgICBpZiAoQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfSU5URVJGQUNFIT0gb3duZXIudHlwZSApCisgICAgICAgICAgICB7ICAgIAorICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgInRtIHNjaGVkICVzJWQgaXMgYWxyZWFkeSBhc3NpZ25lZCB3aXRoIGFuIG93bmVyIG9mIHR5cGUgJWQiLCAJCQkJCisgICAgICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdC0+Y3VycmVudF90bV9zY2hlZF9pbmZvLmtleS5kaXIgPT0gQkNNQkFMX1RNX1NDSEVEX0RJUl9VUyA/ICJ1cyIgOiAiZHMiLAorICAgICAgICAgICAgICAgICAgICBwX3RtX3NjaGVkX2luc3QtPmN1cnJlbnRfdG1fc2NoZWRfaW5mby5rZXkuaWQsCW93bmVyLnR5cGUgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG93bmVyLnUuaW50ZXJmYWNlLmludGZfdHlwZSAhPSBpbnRlcmZhY2Vfa2V5LmludGZfdHlwZQorICAgICAgICAgICAgICAgfHwgb3duZXIudS5pbnRlcmZhY2UuaW50Zl9pZCAhPSBpbnRlcmZhY2Vfa2V5LmludGZfaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAidG0gc2NoZWQgJXMlZCBpcyBhbHJlYWR5IGFzc2lnbmVkIHdpdGggYW4gaW50ZXJmYWNlIG93bmVyIiwgCisgICAgICAgICAgICAgICAgICAgIHBfdG1fc2NoZWRfaW5zdC0+Y3VycmVudF90bV9zY2hlZF9pbmZvLmtleS5kaXIgPT0gQkNNQkFMX1RNX1NDSEVEX0RJUl9VUyA/ICJ1cyIgOiAiZHMiLAorICAgICAgICAgICAgICAgICAgICBwX3RtX3NjaGVkX2luc3QtPmN1cnJlbnRfdG1fc2NoZWRfaW5mby5rZXkuaWQpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfQUxSRUFEWTsJCQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3duZXIudHlwZSA9IEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0lOVEVSRkFDRTsKKyAgICAgICAgICAgIG93bmVyLnUuaW50ZXJmYWNlLmludGZfdHlwZSA9IGludGVyZmFjZV9rZXkuaW50Zl90eXBlOworICAgICAgICAgICAgb3duZXIudS5pbnRlcmZhY2UuaW50Zl9pZCA9IGludGVyZmFjZV9rZXkuaW50Zl9pZDsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8sIHRtX3NjaGVkLCBvd25lciwgb3duZXIpOworICAgICAgICAgICAgcmV0ID0gYmNtYmFsX3RtX3NjaGVkX3NldF9vd25lcihwX3RtX3NjaGVkX2luc3QpOworICAgICAgICB9CisgICAgfXdoaWxlKDApOworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgQkNNQkFMX0lOVEVSRkFDRV9ERUZBVUxUX05VTV9PRl9UTV9RVUVVRVMgNAorI2RlZmluZSBCQ01CQUxfSU5URVJGQUNFX0RFRkFVTFRfU0NIRURfVFlQRSBCQ01CQUxfVE1fU0NIRURfVFlQRV9TUF9XRlEKKyNkZWZpbmUgQkNNQkFMX0lOVEVSRkFDRV9ERUZBVUxUX1NDSEVEX0NISUxEX1RZUEUgQkNNQkFMX1RNX1NDSEVEX0NISUxEX1RZUEVfUVVFVUUKKworI2RlZmluZSBCQ01CQUxfVE1fUVVFVUVfQVVUT19ERUZBVUxUX1NJWkUgMTI4CisjZGVmaW5lIEJDTUJBTF9UTV9RVUVVRV9BVVRPX0RFRkFVTFRfU0JSIDEyOAorI2RlZmluZSBCQ01CQUxfVE1fUVVFVUVfQVVUT19ERUZBVUxUX1BCUiAxMjgKKyNkZWZpbmUgQkNNQkFMX1RNX1FVRVVFX0FVVE9fREVGQVVMVF9CVVJTVF9TSVpFIDEyOAorCitiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfaW50ZXJmYWNlX3RtX2F1dG9fY3JlYXRlKGJjbWJhbF9pbnRlcmZhY2VfY2ZnICpwX2ludGVyZmFjZV9pbmZvKQoreworCisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICB0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QgPSBOVUxMOworICAgIGJjbWJhbF90bV9zY2hlZF9jZmcgdG1fc2NoZWRfZGVmYXVsdF9jZmc7CisgICAgYmNtYmFsX3RtX3F1ZXVlX2NmZyB0bV9xdWV1ZV9kZWZhdWx0X2NmZzsKKyAgICBiY21iYWxfdG1fc2hhcGluZyBkZWZhdWx0X3NoYXBpbmc7CisgICAgYmNtYmFsX3RtX3NjaGVkX2tleSB0bV9zY2hlZF9rZXk7CisgICAgYmNtYmFsX3RtX3F1ZXVlX2tleSB0bV9xdWV1ZV9rZXk7CisgICAgaW50IGk7CisKKyAgICAgZG8KKyAgICB7CisJICAgIC8qY3JlYXRlIHRoZSBhdXRvIHRtIHNjaGVkKi8KKyAgICAJdG1fc2NoZWRfa2V5LmRpciA9IHBfaW50ZXJmYWNlX2luZm8tPmtleS5pbnRmX3R5cGUgPT0gQkNNQkFMX0lOVEZfVFlQRV9QT04gPyBCQ01CQUxfVE1fU0NIRURfRElSX0RTIDogQkNNQkFMX1RNX1NDSEVEX0RJUl9VUzsKKwkgICAgQkNNQkFMX0NGR19JTklUKCZ0bV9zY2hlZF9kZWZhdWx0X2NmZywgdG1fc2NoZWQsIHRtX3NjaGVkX2tleSk7CisgICAgCUJDTUJBTF9DRkdfUFJPUF9TRVQoJnRtX3NjaGVkX2RlZmF1bHRfY2ZnLCB0bV9zY2hlZCwgc2NoZWRfdHlwZSwgQkNNQkFMX0lOVEVSRkFDRV9ERUZBVUxUX1NDSEVEX1RZUEUpOworCSAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZ0bV9zY2hlZF9kZWZhdWx0X2NmZywgdG1fc2NoZWQsIHNjaGVkX2NoaWxkX3R5cGUsIEJDTUJBTF9JTlRFUkZBQ0VfREVGQVVMVF9TQ0hFRF9DSElMRF9UWVBFKTsKKyAgICAJQkNNQkFMX0NGR19QUk9QX1NFVCgmdG1fc2NoZWRfZGVmYXVsdF9jZmcsIHRtX3NjaGVkLCBudW1fcHJpb3JpdGllcywgQkNNQkFMX0lOVEVSRkFDRV9ERUZBVUxUX05VTV9PRl9UTV9RVUVVRVMpOworCSAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZ0bV9zY2hlZF9kZWZhdWx0X2NmZywgdG1fc2NoZWQsIGNyZWF0aW9uX21vZGUsIEJDTUJBTF9UTV9DUkVBVElPTl9NT0RFX0FVVE8pOworCisJICAgIGlmIChCQ01fRVJSX09LICE9IChyZXQgPSBiY21iYWxfdG1fc2NoZWRfYXV0b19jcmVhdGUodG1fc2NoZWRfZGVmYXVsdF9jZmcsICZwX3RtX3NjaGVkX2luc3QpKSkKKyAgICAJeworCQkgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCJDb3VsZCBub3QgY3JlYXRlIHRoZSBhdXRvIHRtIHNjaGVkIFxuIik7CisgICAgCQlicmVhazsKKwkgICAgfQorCSAgICBpZiAodG1fc2NoZWRfa2V5LmRpciA9PSBCQ01CQUxfVE1fU0NIRURfRElSX1VTKQorICAgIAl7CisJCSAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKHBfaW50ZXJmYWNlX2luZm8sIGludGVyZmFjZSwgdXNfdG0sIHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8ua2V5LmlkKTsKKwkgICAgfQorICAgIAllbHNlCisJICAgIHsKKwkJICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQocF9pbnRlcmZhY2VfaW5mbywgaW50ZXJmYWNlLCBkc190bSwgcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5rZXkuaWQpOworCSAgICB9CisKKwkgICAgLypTRVQgVEhFIERFRkFVTFQgQVRUUklCVVRFUyBGT1IgQVVUTyBDUkVBVEVEIFFVRVVFKi8KKyAgICAJdG1fcXVldWVfa2V5LnNjaGVkX2lkID0gcF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5rZXkuaWQ7CisJICAgIHRtX3F1ZXVlX2tleS5zY2hlZF9kaXIgPSBwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmtleS5kaXI7CisJCWRlZmF1bHRfc2hhcGluZy5zYnIgPSAodWludDhfdClCQ01CQUxfVE1fUVVFVUVfQVVUT19ERUZBVUxUX1NCUjsKKwkJZGVmYXVsdF9zaGFwaW5nLnBiciA9ICh1aW50OF90KUJDTUJBTF9UTV9RVUVVRV9BVVRPX0RFRkFVTFRfUEJSOworCQlkZWZhdWx0X3NoYXBpbmcuYnVyc3QgPSAodWludDhfdClCQ01CQUxfVE1fUVVFVUVfQVVUT19ERUZBVUxUX0JVUlNUX1NJWkU7CisJICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJnRtX3F1ZXVlX2RlZmF1bHRfY2ZnLCB0bV9xdWV1ZSwgcmF0ZSwgZGVmYXVsdF9zaGFwaW5nKTsKKyAgICAJQkNNQkFMX0NGR19QUk9QX1NFVCgmdG1fc2NoZWRfZGVmYXVsdF9jZmcsIHRtX3F1ZXVlLCBjcmVhdGlvbl9tb2RlLCBCQ01CQUxfVE1fQ1JFQVRJT05fTU9ERV9BVVRPKTsKKworICAgIAkvKmNyZWF0ZSBpdHMgcXVldWVzKi8KKwkgICAgZm9yKGk9MDsgaTxCQ01CQUxfSU5URVJGQUNFX0RFRkFVTFRfTlVNX09GX1RNX1FVRVVFUzsgaSsrKQorICAgICAgICB7CisJCSAgICB0bV9xdWV1ZV9rZXkuaWQgPSBpOworICAgIAkJQkNNQkFMX0NGR19JTklUKCZ0bV9xdWV1ZV9kZWZhdWx0X2NmZywgdG1fcXVldWUsIHRtX3F1ZXVlX2tleSk7CisKKyAgICAJCUJDTUJBTF9DRkdfUFJPUF9TRVQoJnRtX3F1ZXVlX2RlZmF1bHRfY2ZnLCB0bV9xdWV1ZSwgcHJpb3JpdHksIGkpOworCQkgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmdG1fcXVldWVfZGVmYXVsdF9jZmcsIHRtX3F1ZXVlLCByYXRlLCBkZWZhdWx0X3NoYXBpbmcpOworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gKHJldCA9IGJjbWJhbF90bV9xdWV1ZV9hdXRvX2NyZWF0ZSh0bV9xdWV1ZV9kZWZhdWx0X2NmZykpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwiQ291bGQgbm90IGNyZWF0ZSB0aGUgJWQgdG0gcXVldWVcbiIsIGkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYmNtYmFsX3RtX3NjaGVkX3NldF9pbnRlcmZhY2Vfb3duZXIocF9pbnRlcmZhY2VfaW5mby0+a2V5LCBwX3RtX3NjaGVkX2luc3QpOworCisgICAgfXdoaWxlKDApOworCisgICAgcmV0dXJuIHJldDsKK30KKworYmNtb3NfZXJybm8gYmNtYmFsX3RtX3NjaGVkX3NldF9zdWJfdGVybV9vd25lcigJYmNtYmFsX3RtX3NjaGVkX2tleSB0bV9zY2hlZF9rZXksIGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZyAqcF9zdWJfdGVybV9jZmcpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICB0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3Q7CisgICAgYmNtYmFsX3RtX3NjaGVkX293bmVyIG93bmVyOworICAgIAorICAgIGRvCisgICAgeworICAgICAgICBwX3RtX3NjaGVkX2luc3QgPSB0bV9zY2hlZF9pbnN0X2dldCh0bV9zY2hlZF9rZXksIFRNX1NDSEVEX0ZMQUdfQUNUSVZFKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcF90bV9zY2hlZF9pbnN0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsIAorICAgICAgICAgICAgICAgICJ0bSBzY2hlZCBkaXIgPSAlcyBpZCA9ICVkIHdoaWNoIGlzIHNldCBhcyB0aGUgc3Vic2NyaWJlciB0bSBkb2VzIG5vdCBleGlzdCBcbiIsCisgICAgICAgICAgICAgICAgVE1fU0NIRURfRElSX1RPX1NUUih0bV9zY2hlZF9rZXkuZGlyKSwgdG1fc2NoZWRfa2V5LmlkKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICBicmVhazsJCQkKKyAgICAgICAgfQorICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLCB0bV9zY2hlZCwgb3duZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAvKmNoZWNrIGlmIGl0IGlzIGFscmVhZHkgb3duZWQgYnkgdGhhdCBzdWIgdGVybSovCisgICAgICAgICAgICBvd25lciA9IHBfdG1fc2NoZWRfaW5zdC0+cmVxX3RtX3NjaGVkX2luZm8uZGF0YS5vd25lcjsKKyAgICAgICAgICAgIGlmIChvd25lci50eXBlICE9IEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1NVQl9URVJNKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF90bV9zY2hlZCwgCisgICAgICAgICAgICAgICAgICAgICJ0bSBzY2hlZCBkaXIgPSAlcyBpZCA9ICVkIHdoaWNoIGlzIHNldCBhcyB0aGUgc3Vic2NyaWJlciB0bSBhbHJlYWR5IG93bmVkIHdpdGggb3duZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgVE1fU0NIRURfRElSX1RPX1NUUih0bV9zY2hlZF9rZXkuZGlyKSwgdG1fc2NoZWRfa2V5LmlkLCBvd25lci50eXBlKTsKKyAgICAgICAgICAgICAgICByZXQgPSAgQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOwkJCQorICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3duZXIudS5zdWJfdGVybS5pbnRmX2lkICE9IHBfc3ViX3Rlcm1fY2ZnLT5rZXkuaW50Zl9pZAorICAgICAgICAgICAgICAgIHx8IG93bmVyLnUuc3ViX3Rlcm0uc3ViX3Rlcm1faWQgIT0gcF9zdWJfdGVybV9jZmctPmtleS5zdWJfdGVybV9pZCkKKyAgICAgICAgICAgIHsJCisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3RtX3NjaGVkLCAKKyAgICAgICAgICAgICAgICAgICAgInRtIHNjaGVkIGRpciA9ICVzIGlkID0gJWQgd2hpY2ggaXMgc2V0IGFzIHRoZSBzdWJzY3JpYmVyIHRtIGFscmVhZHkgb3duZWQgYnkgc3ViX3Rlcm0gaW50Zl9pZCA9ICVkIHN1Yl90ZXJtX2lkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIFRNX1NDSEVEX0RJUl9UT19TVFIodG1fc2NoZWRfa2V5LmRpciksIHRtX3NjaGVkX2tleS5pZCwgb3duZXIudS5zdWJfdGVybS5pbnRmX2lkLCBvd25lci51LnN1Yl90ZXJtLnN1Yl90ZXJtX2lkKTsKKyAgICAgICAgICAgICAgICByZXQgPSAgQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOwkJCQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3duZXIudHlwZSA9IEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1NVQl9URVJNOworICAgICAgICAgICAgb3duZXIudS5zdWJfdGVybS5pbnRmX2lkID0gcF9zdWJfdGVybV9jZmctPmtleS5pbnRmX2lkOworICAgICAgICAgICAgb3duZXIudS5zdWJfdGVybS5zdWJfdGVybV9pZCA9IHBfc3ViX3Rlcm1fY2ZnLT5rZXkuc3ViX3Rlcm1faWQ7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLCB0bV9zY2hlZCwgb3duZXIsIG93bmVyKTsKKwkJCQorICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0shPSAocmV0ID0gYmNtYmFsX3RtX3NjaGVkX3NldF9vd25lcihwX3RtX3NjaGVkX2luc3QpKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfdG1fc2NoZWQsIAorICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IHNldCBzdWIgdGVybSBpbnRmX2lkID0gJWQgc3ViX3Rlcm1faWQgPSAlZCBhcyB0aGUgb3duZXIgb2YgdG0gc2NoZWQgZGlyID0gJXMgaWQgPSAlZCB3aGljaCBpcyBzZXQgYXMgdGhlIHN1YnNjcmliZXIgdG0gXG4iLAorICAgICAgICAgICAgICAgICAgICBvd25lci51LnN1Yl90ZXJtLmludGZfaWQsIG93bmVyLnUuc3ViX3Rlcm0uc3ViX3Rlcm1faWQsIFRNX1NDSEVEX0RJUl9UT19TVFIodG1fc2NoZWRfa2V5LmRpciksIHRtX3NjaGVkX2tleS5pZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CQkJCisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgIH13aGlsZSAoMCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLypAfSovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS9tYWluL3RtX3NjaGVkX2ZzbS5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi90bV9zY2hlZF9mc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTM5YTRmCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvbWFpbi90bV9zY2hlZF9mc20uaApAQCAtMCwwICsxLDE1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgdG1fc2NoZWRfZnNtLmgKKyAqIEBicmllZiBDb2RlIHRvIHN1cHBvcnQgdGhlIEJBTCBUTSBTY2hlZCBGU00KKyAqCisgKi8KKworI2lmbmRlZiBUTV9TQ0hFRF9GU01fSAorI2RlZmluZSBUTV9TQ0hFRF9GU01fSAorCisvKkB7Ki8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJhbF9hcGkuaD4KKyNpbmNsdWRlIDx0bV9xdWV1ZV9mc20uaD4KKworLyogc2V0IHRoZSB0b3RhbCBwb29sIHNpemUgb2YgYXZhaWxhYmxlIHRtIHNjaGVkIGluc3RhbmNlcyB0byA0ayAqLworI2RlZmluZSBUTV9TQ0hFRF9BTExPQ0FUSU9OX0JMT0NLX1NJWkUgICg0MDk2KQorCit0eXBlZGVmIGVudW0KK3sKKyAgICBUTV9TQ0hFRF9GU01fRVZFTlRfVFlQRV9OT05FICAgICAgID0gLTEsCisgICAgVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfQ1JFQVRFICAgICAsCisgICAgVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfREVTVFJPWSAgICAsCisgICAgVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfQVNTSUdOICAgICAgICAsCisgICAgVE1fU0NIRURfRlNNX0VWRU5UX1RZUEVfVVRJTF9NU0cgICAsCisKKyAgICBUTV9TQ0hFRF9GU01fRVZFTlRfVFlQRV9fTEFTVCwKKyAgICBUTV9TQ0hFRF9GU01fRVZFTlRfVFlQRV9fTlVNX09GCit9IHRtX3NjaGVkX2ZzbV9ldmVudF90eXBlOworCisKKwordHlwZWRlZiBlbnVtCit7CisgICAgVE1fU0NIRURfRlNNX1NUQVRFX05PTkUgPSAgICAgLTEsCisgICAgVE1fU0NIRURfRlNNX1NUQVRFX05VTEwgICAgICAgICAsCisgICAgVE1fU0NIRURfRlNNX1NUQVRFX0lOQUNUSVZFICAgLAorICAgIFRNX1NDSEVEX0ZTTV9TVEFURV9BU1NJR05FRCAgICwKKyAgICBUTV9TQ0hFRF9GU01fU1RBVEVfQUNUSVZFICAgLAorICAgIFRNX1NDSEVEX0ZTTV9TVEFURV9ERUxFVElORyAgICAgLAorIAorICAgIFRNX1NDSEVEX0ZTTV9TVEFURV9fTEFTVCwKKyAgICBUTV9TQ0hFRF9GU01fU1RBVEVfX05VTV9PRgorfSB0bV9zY2hlZF9mc21fc3RhdGU7CisKKwordHlwZWRlZiBlbnVtCit7CisgICAgVE1fU0NIRURfRkxBR19BQ1RJVkUgPSAgICAgMTw8MCwgICAgLyoqPCBBIHRtX3NjaGVkIGlzIG9uIHRoZSBhY3RpdmUgbGlzdCAqLworICAgIFRNX1NDSEVEX0ZMQUdfRlJFRSA9ICAgICAgIDE8PDEsICAgIC8qKjwgQSB0bV9zY2hlZCBpcyBvbiB0aGUgZnJlZSBsaXN0ICovCisgICAgVE1fU0NIRURfRkxBR19BTlkgPSAgICAgICAgKFRNX1NDSEVEX0ZMQUdfQUNUSVZFIHwgVE1fU0NIRURfRkxBR19GUkVFKSwgICAgLyoqPCBBIHRtX3NjaGVkIGlzIG9uIGVpdGhlciB0aGUgYWN0aXZlIG9yIGZyZWUgbGlzdCAqLworfSB0bV9zY2hlZF9mbGFnOworCisKK3R5cGVkZWYgc3RydWN0IHRtX3NjaGVkX2ZzbV9ldmVudF90Cit7CisgICAgdG1fc2NoZWRfZnNtX2V2ZW50X3R5cGUgZXZlbnRfdHlwZTsgICAvKio8IFRoZSB0bV9zY2hlZCBmc20gZXZlbnRzICovCisgICAgdm9pZCAgICAgICAgICAgICAqbXNnOworCisgICAgLyogb3RoZXIgbmVjZXNzYXJ5IGluZm9ybWF0aW9uICovCit9IHRtX3NjaGVkX2ZzbV9ldmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgcXVldWVfZW50cnkKK3sKKyAgICBiY21iYWxfdG1fcXVldWVfaWQgcXVldWVfaWQ7CisgICAgVEFJTFFfRU5UUlkocXVldWVfZW50cnkpIG5leHQ7IC8qKjwgVEFJTFEgbGluayAqLyAgICAKK31xdWV1ZV9lbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3Qgc3ViX3NjaGVkX2VudHJ5Cit7CisgICAgYmNtYmFsX3RtX3NjaGVkX2lkIHNjaGVkX2lkOworICAgIFRBSUxRX0VOVFJZKHN1Yl9zY2hlZF9lbnRyeSkgbmV4dDsgLyoqPCBUQUlMUSBsaW5rICovICAgIAorfXN1Yl9zY2hlZF9lbnRyeTsKKwordHlwZWRlZiBzdHJ1Y3QgdG1fc2NoZWRfaW5zdCB0bV9zY2hlZF9pbnN0Oworc3RydWN0IHRtX3NjaGVkX2luc3QKK3sKKyAgICBiY21iYWxfdG1fc2NoZWRfY2ZnICAgIGN1cnJlbnRfdG1fc2NoZWRfaW5mbzsgICAvKio8IFRoZSBjdXJyZW50IGluZm9ybWF0aW9uIGZvciB0aGlzIHRtX3NjaGVkICh1c2VkIGZvciBHRVQpICovCisgICAgYmNtYmFsX3RtX3NjaGVkX2NmZyAgICByZXFfdG1fc2NoZWRfaW5mbzsgICAvKio8IFRoZSBsYXN0IHRtX3NjaGVkIG9iamVjdCBpbmZvIHJlY2VpdmVkIGZyb20gdGhlIFB1YmxpYyBBUEkgKi8JCisgICAgdWludDE2X3QgICAgICAgICAgICAgbnVtX3F1ZXVlc19vbl9ub2RlOyAgIC8qKjwgVGhlIG51bWJlciBvZiBxdWV1ZXMgYXR0YWNoZWQgdG8gdGhpcyBub2RlICovCisgICAgVEFJTFFfSEVBRChxdWV1ZXNfbGlzdF9oZWFkLCBxdWV1ZV9lbnRyeSkgcXVldWVzX2xpc3Q7CQorICAgIHVpbnQxNl90ICAgICAgICAgICAgIG51bV9zdWJfc2NoZWRzX29uX25vZGU7ICAgLyoqPCBUaGUgbnVtYmVyIG9mIHN1YiBzY2hlZHVsZXJzIGZvciB0aGlzIHRtIHNjaGVkICovCisgICAgVEFJTFFfSEVBRChzdWJfc2NoZWRzX2xpc3RfaGVhZCwgc3ViX3NjaGVkX2VudHJ5KSBzdWJfc2NoZWRzX2xpc3Q7CisgICAgdG1fc2NoZWRfZnNtX3N0YXRlICAgICBmc21fc3RhdGU7ICAgICAgICAgIC8qKjwgVGhlIHRtX3NjaGVkIEZTTSBzdGF0ZSAqLworICAgIFRBSUxRX0VOVFJZKHRtX3NjaGVkX2luc3QpIHRtX3NjaGVkX2luc3RfbmV4dDsgLyoqPCBUQUlMUSBsaW5rICovCit9OworCisKKy8qIAorICogR3JvdXAgRlNNIGRhdGEgc3RydWN0dXJlcworICovCit0eXBlZGVmIHN0cnVjdCB0bV9zY2hlZF9mc21fY3R4Cit7CisgICAgLyogTGlzdHMgb2YgZnJlZSB0bV9zY2hlZCBlbnRyaWVzIGFuZCBhY3RpdmUgdG1fc2NoZWQgZW50cmllcworICAgICAqLworICAgIFRBSUxRX0hFQUQoZnJlZV90bV9zY2hlZF9saXN0X2hlYWQsIHRtX3NjaGVkX2luc3QpIGZyZWVfdG1fc2NoZWRfbGlzdDsKKworICAgIFRBSUxRX0hFQUQoYWN0aXZlX3RtX3NjaGVkX2xpc3RfaGVhZCwgdG1fc2NoZWRfaW5zdCkgYWN0aXZlX3RtX3NjaGVkX2xpc3Q7CisKK30gdG1fc2NoZWRfZnNtX2N0eDsKKworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKworZXh0ZXJuIGJjbW9zX2Vycm5vIHRtX3NjaGVkX2ZzbV9pbml0KHZvaWQpOworZXh0ZXJuIGJjbW9zX2Vycm5vIHRtX3NjaGVkX2ZzbV9maW5pc2godm9pZCk7CitleHRlcm4gYmNtb3NfZXJybm8gcHJvY2Vzc190bV9zY2hlZF91dGlsX21zZyh2b2lkICptc2dfcGF5bG9hZCk7CitleHRlcm4gYmNtb3NfZXJybm8gcHJvY2Vzc190bV9zY2hlZF9vYmplY3Qodm9pZCAqbXNnX3BheWxvYWQpOworCit0bV9zY2hlZF9pbnN0ICp0bV9zY2hlZF9pbnN0X2dldChiY21iYWxfdG1fc2NoZWRfa2V5IGtleSwgdG1fc2NoZWRfZmxhZyBzZWFyY2hfZmxhZyk7CitiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfYXV0b19jcmVhdGUoYmNtYmFsX3RtX3NjaGVkX2NmZyBjZmcsIHRtX3NjaGVkX2luc3QgKipwX3RtX3NjaGVkX2luc3QpOworYmNtb3NfZXJybm8gYmNtYmFsX3RtX3NjaGVkX3NldF9vd25lcih0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QpOworYmNtb3NfZXJybm8gYmNtYmFsX3RtX3NjaGVkX3Vuc2V0X293bmVyKHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCk7CitiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfc2V0X3F1ZXVlKHRtX3F1ZXVlX2luc3QgKnBfdG1fcXVldWVfaW5zdCk7CitiY21vc19lcnJubyBiY21iYWxfdG1fc2NoZWRfcmVtb3ZlX3F1ZXVlKHRtX3F1ZXVlX2luc3QgKnBfdG1fcXVldWVfaW5zdCk7Cit0bV9zY2hlZF9pbnN0ICogdG1fc2NoZWRfZmluZF9hZ2dfcG9ydF9ub2RlKHVpbnQ4X3QgaW50Zl9pZCwgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQgYWdnX3BvcnRfaWQpOworYmNtb3NfZXJybm8gYmNtYmFsX3RtX3NjaGVkX2ZzbV9hY3RpdmVfZGVzdHJveSh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QpOworCisKKworI2RlZmluZSBUTV9TQ0hFRF9ESVJfVE9fU1RSKGRpcikgKChkaXIpID09IEJDTUJBTF9UTV9TQ0hFRF9ESVJfRFMgPyAiZHMiIDogInVzIikKKy8qQH0qLworCisjZW5kaWYgLypUTV9TQ0hFRF9GU01fSCAqLworCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS9wbGF0Zm9ybS9iY21vc19wbGF0Zm9ybS5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvcGxhdGZvcm0vYmNtb3NfcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmU5NWI0Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvcGxhdGZvcm0vYmNtb3NfcGxhdGZvcm0uaApAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorI2lmbmRlZiBCQ01PU19QTEFURk9STV9IXworI2RlZmluZSBCQ01PU19QTEFURk9STV9IXworCisjaWZuZGVmIEJDTU9TX1NZU1RFTV9IXworI2Vycm9yIFBsZWFzZSBkbyBub3QgaW5jbHVkZSBiY21vc19wbGF0Zm9ybS5oIGRpcmVjdGx5LiBJbmNsdWRlIGJjbW9zX3N5c3RlbS5oCisjZW5kaWYKKworI2luY2x1ZGUgPGJhbF9vc21zZy5oPgorCisvKiogQkFMIENPUkUgQ1BVIGNvcmUKKyAqIFxpbmdyb3VwIHN5c3RlbV90YXNrICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PU19DUFVfQ09SRV9BTlksICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQW55IGNvcmUgKi8KKworICAgIEJDTU9TX0NQVV9DT1JFX19OVU1fT0YgPSAxLCAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY29yZXMgKi8KK30gYmNtb3NfY29yZTsKKworLyoKKyAqIEJBTCBDT1JFIG1vZHVsZXMKKyAqCisgKiBcaW5ncm91cCBzeXN0ZW1fbW9kdWxlCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9TX01PRFVMRV9JRF9OT05FLCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBubyBtb2R1bGUgKi8KKworICAgIEJDTU9TX01PRFVMRV9JRF9XT1JLRVJfTUdNVCwgICAgICAgICAgICAgICAgLyoqIHdvcmtlciBtb2R1bGUgZm9yIE1HTVQgbWVzc2FnZSBoYW5kbGluZyAqLworICAgIEJDTU9TX01PRFVMRV9JRF9XT1JLRVJfQVBJX0lORCwgICAgICAgICAgICAgLyoqIHdvcmtlciBtb2R1bGUgZm9yIEJBTCBBUEkgSU5ESUNBVElPTiBtZXNzYWdlIGhhbmRsaW5nICovCisgICAgQkNNT1NfTU9EVUxFX0lEX1dPUktFUl9CQUxfQ09SRV9GT1JfQUdFTlQsICAvKiogd29ya2VyIG1vZHVsZSBmb3IgdGhlIEJBTCBDT1JFIHdoZW4gcnVubmluZyBhcyBhbiBPRiBhZ2VudCAqLworICAgIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRU9OLCAgICAgICAgICAgICAgLyoqIEVPTiBtb2R1bGUgKi8KKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VQT05fT0FNLCAgICAgICAgIC8qKiBFUE9OIE9BTSBtb2R1bGUgKi8KKyAgICBCQ01PU19NT0RVTEVfSURfT0ZQQUwsICAgICAgICAgICAgICAgICAgICAgIC8qKiBPRi1QQUwgbW9kdWxlICovCisJQkNNT1NfTU9EVUxFX0lEX09NQ0lfVFJBTlNQT1JULCAgICAgICAgIC8qKiBPTUNJIFRyYW5zcG9ydCBtb2R1bGUgKi8KKworICAgIEJDTU9TX01PRFVMRV9JRF9fTlVNX09GLCAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgbW9kdWxlcyAqLworICAgIEJDTU9TX01PRFVMRV9JRF9JTlZBTElEID0gQkNNT1NfTU9EVUxFX0lEX05PTkUKK30gYmNtb3NfbW9kdWxlX2lkOworCisvKgorICogQkFMIENPUkUgZXZlbnQgZ3JvdXAuIEVhY2ggZ3JvdXAgc3VwcG9ydHMgdXAgdG8gMzIgZXZlbnRzLgorICoKKyAqIFxpbmdyb3VwIHN5c3RlbV9ldmVudAorICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PU19FVkVOVF9GSVJTVCwKKworICAgIEJDTU9TX0VWRU5UX0lEX19OVU1fT0YsICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZXZlbnQgZ3JvdXBzICovCit9IGJjbW9zX2V2ZW50X2lkOworCisvKiogTWVzc2FnZSBoYXNoIHNpemUKKyAqIFxpbmdyb3VwIHN5c3RlbV9tc2cKKyAqLworI2RlZmluZSBCQ01PU19NU0dfSEFTSF9TSVpFICAgICA1MTIKKworLyoKKyAqIFRhc2sgcHJpb3JpdGllcworICovCisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfSVBDX1JYICAgICAgICAgICAgCUJDTU9TX1RBU0tfUFJJT1JJVFlfMworI2RlZmluZSBUQVNLX1BSSU9SSVRZX0NMSSAgICAgICAgICAgICAgCQlCQ01PU19UQVNLX1BSSU9SSVRZXzE1CisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfV09SS0VSICAgICAgICAgICAgCUJDTU9TX1RBU0tfUFJJT1JJVFlfMTYKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfRU9OICAgICAJQkNNT1NfVEFTS19QUklPUklUWV8xNworI2RlZmluZSBUQVNLX1BSSU9SSVRZX09GUEFMICAgICAgICAgICAgCQlCQ01PU19UQVNLX1BSSU9SSVRZXzE4CisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfT01DSV9UUkFOU1BPUlQgICAgICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMjAKKyNkZWZpbmUgVEFTS19QUklPUklUWV9ERVZfTE9HICAgICAgICAgICAJQkNNT1NfVEFTS19QUklPUklUWV8zMAorCisjZW5kaWYgLyogQkNNT1NfUExBVEZPUk1fSF8gKi8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL01ha2VmaWxlIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5NGQyMAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorIworIyAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisjICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisjCisjICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisjICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisjICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyMgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorIyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyMKKyMgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyMgICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorIyAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorIyAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorIyAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisjICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisjICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworIyAgICAgb2YgdGhlIHNvZnR3YXJlLgorIworIyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisjICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyMgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisjICB3cml0dGVuIGNvbnNlbnQuCisjCisjICA6PgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCQUwgY29yZSBDTEkgYXBwbGljYXRpb24KKyMKK01PRF9OQU1FID0gYmFsX21hY191dGlsCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSBkZXZfbG9nIHV0aWxzIG1hcGxlX3NkayBvc19jbGkgYmFsX2FwaSBiYWxfYXBwX3V0aWxzIGJhbHV0aWxzIHRvcG9sb2d5CitFWFRSQV9DRkxBR1MgKz0gLUkkKFNSQ19ESVIpLy4uLy4uL21haW4KKworc3JjcyA9IGJhbF9tYWNfdXRpbC5jIGJhbF9tYWNfdXRpbF9ncG9uLmMgYmFsX21hY191dGlsX3hncG9uLmMgYmFsX21hY191dGlsX2NvbW1vbl9pdHVfcG9uLmMgYmFsX21hY191dGlsX2RiX2FwaXMuYyBiYWxfbWFjX3V0aWxfbG9vcGJhY2suYyBiYWxfbWFjX3V0aWxfZXBvbi5jCisKK2lmZXEgKCIkKFNXSVRDSCkiLCAicWF4IikKKyAgICAgICBNT0RfREVGUyArPSAtRFFBWF9TV0lUQ0gKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbC5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvYmFsX21hY191dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyNDk5NgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbC5jCkBAIC0wLDAgKzEsMjQ2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKgorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKgorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEBmaWxlIGJhbF9tYWNfdXRpbC5jCisgKgorICogQGJyaWVmIG1hYyB1dGlsIGludGVyZmFjZXMgZGVmaW5pdGlvbiB1c2VkIGJ5IEJhbCBDb3JlCisgKgorICogVGhpcyBmaWxlIGV4cG9zZSB0aGUgQVBJcyB0byB0aGUgY29yZSB0byBjb25maWd1cmUgdGhlIG1hYworICogd2l0aCByZWdhcmRpbmcgdG8gdGhlIG9wZXJhdGlvbiBvZiBhY2Nlc3MgdGVybWluYWwsIGludGVyZmFjZSwgc3Vic2NyaWJlciB0ZXJtaW5hbCBhbmQgZmxvdy4KKyAqCisgKiBAYWRkdG9ncm91cCBtYWNfdXRpbAorICovCisKKy8qQHsqLworCisjaW5jbHVkZSA8YmFsX21hY191dGlsLmg+CisjaW5jbHVkZSA8YmFsX21hY191dGlsX2NvbW1vbl9pdHVfcG9uLmg+CisjaW5jbHVkZSA8YmFsX21hY191dGlsX2Vwb24uaD4KKworI2luY2x1ZGUgPGJhbF93b3JrZXIuaD4KKyNpbmNsdWRlIDxiYWxfY29yZS5oPgorI2luY2x1ZGUgPGJhbF9jbGkuaD4KKworI2lmZGVmIEJPQVJECisjaW5jbHVkZSA8YmNtb2x0X2JvYXJkLmg+CisjaW5jbHVkZSA8YmNtb2x0X2JvYXJkX2NsaS5oPgorI2VuZGlmCisjaW5jbHVkZSA8YmNtX2FwaV9jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfZGV2X3NlbGVjdG9yLmg+CisjaW5jbHVkZSA8YmNtb2x0X2hvc3Rfc3dfdmVyc2lvbi5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF9yZXZpc2lvbi5oPgorCisjaWZkZWYgRU5BQkxFX0xPRworCisjZGVmaW5lIElOQk9MRF9CQUQoYSkgIlwwMzNbMzFtImEiXDAzM1swbSIKKy8qCisgKiBtYWMgdXRpbCBsb2dnaW5nIGZvciBnZW5lcmljIGxvZ2dpbmcsIGFzIHdlbGwgYXMgb24gcGVyIFBPTiBiYXNpcworICovCitkZXZfbG9nX2lkICAgbG9nX2lkX21hY191dGlsOworZGV2X2xvZ19pZCAgIGxvZ19pZF9tYWNfdXRpbF9wb25faWZbTlVNX1NVUFBPUlRFRF9TVUJTQ1JJQkVSX0lOVEVSRkFDRVNdOworCisvKiogQGRlZiBzaXplIG9mIGxvZyBJZCBzdHJpbmcgKi8KKyNkZWZpbmUgTUFDX1VUSUxfTE9HX1NUUl9TWiA2NAorCisvKiogQGRlZiB0byBtYWtlIGEgbG9nIHN0cmluZyBmb3IgYSBQT04gaW50ZXJmYWNlLCB0byByZWdpc3RlciB3aXRoIGxvZ2dpbmcgbW9kdWxlIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBNQUNfVVRJTF9NQUtFX0xPR19TVFJfRk9SX1BPTl9JRihfcG9uX2lmX2lkLCBfYnVmLCBfYnVmX3N6KSBcCisgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG4gPSBzbnByaW50ZigoX2J1ZiksIChfYnVmX3N6KSwgIk1BQ19VVElMX1BPTl8lZCIsIChfcG9uX2lmX2lkKSk7ICAgICBcCisgICAgICAgIEJVR19PTigoMCA+IG4pIHx8ICgoX2J1Zl9zeikgPD0gbikpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfcmVnaXN0ZXJfbG9nZ2luZ19wZXJfcG9uICh2b2lkKTsKKyNlbmRpZiAgLy9FTkFCTEVfTE9HCisKKy8qIFRoaXMgaXMgbm90IGV4cG9zZWQgaW4gdGhlIG9iamVjdCBtb2RlbCwgc28gd2UgY2FuIHVzZSBCQ01PTFRfU1lTVEVNX01PREVfX05VTV9PRiBhcyBhIHNwZWNpYWwgdmFsdWUgZm9yIGxvb3BiYWNrLiAqLworI2RlZmluZSBCQ01PTFRfU1lTVEVNX01PREVfTE9PUEJBQ0sgQkNNT0xUX1NZU1RFTV9NT0RFX19OVU1fT0YKKyNkZWZpbmUgQkNNX1RPUE9fUE9OX01PREVfTE9PUEJBQ0sgQkNNX1RPUE9fUE9OX01PREVfX05VTV9PRgorCitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVfZm9yX2RldmljZSAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpOworc3RhdGljIGJjbW9zX2Vycm5vIG1hY191dGlsX3N5c3RlbV9tb2RlX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKKworLyogTWFwbGUgQ0xJIGRpcmVjdG9yeSAqLworc3RhdGljIGJjbWNsaV9lbnRyeSAqbWFwbGVfZGlyOworCisvKiogQGJyaWVmIGFycmF5IHN0b3JlcyB0aGUgbGlzdCBvZiBkZXZpY2UgcmVsYXRlZCBhdXRvIGluZGljYXRpb25zIGZyb20gTWFwbGUgdG8gc3Vic2NyaWJlICovCitzdGF0aWMgbWFjX3V0aWxfaW5kX29ial9hbmRfaGFuZGxlcnMgbWFjX3V0aWxfZGV2aWNlX2luZF9oYW5kbGVyc1tdID0KK3sKKyAgICB7QkNNT0xUX09CSl9JRF9ERVZJQ0UsICAgICAgICAgICJCQ01PTFRfT0JKX0lEX0RFVklDRSIsIG1hY191dGlsX2luZGljYXRpb25faGFuZGxlX2Zvcl9kZXZpY2V9Cit9OworCisKKworI2lmICFkZWZpbmVkKFdSWF9CVUlMRCkKKy8qIGV4dGVybmFsIHN0cnVjdHVyZXMgdG8gYmUgdXNlZCB3aXRoIGJjbW9zX3RyCisgKiBzcGVjaWZ5aW5nIElQOlBvcnQgYXNzaWdubWVudHMgb2YgdGhlIHJlbW90ZSBtYWMgZGV2aWNlICovCitleHRlcm4gdWludDMyX3QgYmNtdHJfb2x0X2lwW0JDTVRSX01BWF9PTFRTXTsKK2V4dGVybiB1aW50MTZfdCBiY210cl9vbHRfdWRwX3BvcnRbQkNNVFJfTUFYX09MVFNdOworZXh0ZXJuIHVpbnQxNl90IGJjbXRyX2hvc3RfdWRwX3BvcnQ7CisjZW5kaWYKKworCisKKy8qKgorICogQGJyaWVmIEJBTCByZXF1ZXN0IGhhbmRsZXJzIGZvciBzeXN0ZW0gbW9kZSBzcGVjaWZpYyBzZXQgJiB2YWxpZGF0ZQorICoqLworc3RhdGljIG1hY191dGlsX2JhbF9yZXFfaGFuZGxlcnNfZm9yX3N5c3RlbV9tb2RlX3QgbWFjX3V0aWxfYmFsX3JlcV9oYW5kbGVyc19mb3Jfc3lzdGVtX21vZGVbXSA9Cit7CisgICAgW0JDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YXSA9CisgICAgeworICAgICAgICAuYWNjX3Rlcm1fc2V0ID0gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfZ3Bvbl8xNiwKKyAgICAgICAgLmFjY190ZXJtX3Bvc3RfaW5kaWNhdGlvbl9zZXQgPSBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfcG9zdF9pbmRpY2F0aW9uX3NldF9mb3JfZ3BvbgorICAgIH0sCisgICAgW0JDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1hdID0KKyAgICB7CisgICAgICAgIC5hY2NfdGVybV9zZXQgPSBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9ncG9uXzgsCisgICAgICAgIC5hY2NfdGVybV9wb3N0X2luZGljYXRpb25fc2V0ID0gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3Bvc3RfaW5kaWNhdGlvbl9zZXRfZm9yX2dwb24KKyAgICB9LAorICAgIFtCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fOF9YXSA9CisgICAgeworICAgICAgICAuYWNjX3Rlcm1fc2V0ID0gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfeGdwb25fOCwKKyAgICAgICAgLmFjY190ZXJtX3Bvc3RfaW5kaWNhdGlvbl9zZXQgPSBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfcG9zdF9pbmRpY2F0aW9uX3NldF9mb3JfeGdwb25feGdzCisgICAgfSwKKyAgICBbQkNNT0xUX1NZU1RFTV9NT0RFX1hHU19fMl9YXzEwX0ddID0KKyAgICB7CisgICAgICAgIC5hY2NfdGVybV9zZXQgPSBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl94Z3MsCisgICAgICAgIC5hY2NfdGVybV9wb3N0X2luZGljYXRpb25fc2V0ID0gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3Bvc3RfaW5kaWNhdGlvbl9zZXRfZm9yX3hncG9uX3hncworICAgIH0sCisgICAgW0JDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQV0gPQorICAgIHsKKyAgICAgICAgLmFjY190ZXJtX3NldCA9IG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXRfZm9yX2Vwb25fOF90ZG1hLAorICAgICAgICAuYWNjX3Rlcm1fcG9zdF9pbmRpY2F0aW9uX3NldCA9IE5VTEwKKyAgICB9LAorICAgIFtCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUFdID0KKyAgICB7CisgICAgICAgIC5hY2NfdGVybV9zZXQgPSBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzRfdGRtYSwKKyAgICAgICAgLmFjY190ZXJtX3Bvc3RfaW5kaWNhdGlvbl9zZXQgPSBOVUxMCisgICAgfSwKKyAgICBbQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1hdID0KKyAgICB7CisgICAgICAgIC5hY2NfdGVybV9zZXQgPSBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzE2XzFnLAorICAgICAgICAuYWNjX3Rlcm1fcG9zdF9pbmRpY2F0aW9uX3NldCA9IE5VTEwKKyAgICB9LAorICAgIFtCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YXSA9CisgICAgeworICAgICAgICAuYWNjX3Rlcm1fc2V0ID0gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfZXBvbl84XzFnLAorICAgICAgICAuYWNjX3Rlcm1fcG9zdF9pbmRpY2F0aW9uX3NldCA9IE5VTEwKKyAgICB9LAorICAgIFtCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YXSA9CisgICAgeworICAgICAgICAuYWNjX3Rlcm1fc2V0ID0gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfZXBvbl80XzFnLAorICAgICAgICAuYWNjX3Rlcm1fcG9zdF9pbmRpY2F0aW9uX3NldCA9IE5VTEwKKyAgICB9LAorICAgIFtCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YXzEwX0ddID0KKyAgICB7CisgICAgICAgIC5hY2NfdGVybV9zZXQgPSBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzhfMTBnLAorICAgICAgICAuYWNjX3Rlcm1fcG9zdF9pbmRpY2F0aW9uX3NldCA9IE5VTEwKKyAgICB9LAorICAgIFtCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YXzEwX0ddID0KKyAgICB7CisgICAgICAgIC5hY2NfdGVybV9zZXQgPSBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzRfMTBnLAorICAgICAgICAuYWNjX3Rlcm1fcG9zdF9pbmRpY2F0aW9uX3NldCA9IE5VTEwKKyAgICB9LAorICAgIFtCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0ddID0KKyAgICB7CisgICAgICAgIC5hY2NfdGVybV9zZXQgPSBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzJfMTBnLAorICAgICAgICAuYWNjX3Rlcm1fcG9zdF9pbmRpY2F0aW9uX3NldCA9IE5VTEwKKyAgICB9LAorICAgIFtCQ01PTFRfU1lTVEVNX01PREVfTE9PUEJBQ0tdID0KKyAgICB7CisgICAgICAgIC5hY2NfdGVybV9zZXQgPSBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9sb29wYmFjaywKKyAgICAgICAgLmFjY190ZXJtX3Bvc3RfaW5kaWNhdGlvbl9zZXQgPSBOVUxMCisgICAgfQorfTsKKworLyoqCisgKiBAYnJpZWYgQkFMIHJlcXVlc3QgaGFuZGxlcnMgZm9yIFBPTiBwcm90b2NvbCBzcGVjaWZpYyBzZXQgJiB2YWxpZGF0ZQorICoKKyAqIEBub3RlIFRoZSBoYW5kbGluZyB3b3VsZCBiZSBsaWtlIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZy4gVGhlIGNvbW1vbgorICogaGFuZGxpbmcgd291bGQgYmUgZG9uZSBpbiB0aGUgdG9wIGxldmVsIGNhbGwuIEFuZCB0aGVuIGJhc2VkIG9uIHByb3RvY29sLAorICogdGhlIG1hYyBzcGVjaWZpYyBoYW5kbGluZyB3aWxsIGJlIGRvbmUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbWFjIHNwZWNpZmljCisgKiBoYW5kbGVyIGZ1bmN0aW9ucy4KKyAqKi8KK21hY191dGlsX2hhbmRsZXJzX3Blcl9wb25fbW9kZV90IG1hY191dGlsX2JhbF9yZXFfaGFuZGxlcnNfZm9yX3Bvbl9tb2RlIFtCQ01fVE9QT19QT05fTU9ERV9fTlVNX09GICsgMV0gPQoreworICAgIFtCQ01fVE9QT19QT05fTU9ERV9HUE9OXSA9CisgICAgeworICAgICAgICAuaWZfdmFsaWRhdGUgPSBOVUxMLAorICAgICAgICAuaWZfc2V0ID0gbWFjX3V0aWxfaW50ZXJmYWNlX3NldF9mb3JfZ3BvbiwKKyAgICAgICAgLnN1Yl90ZXJtX3ZhbGlkYXRlID0gbWFjX3V0aWxfdmFsaWRhdGVfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmZvX2Zvcl9ncG9uLAorICAgICAgICAuc3ViX3Rlcm1fc2V0ID0gbWFjX3V0aWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zZXRfZm9yX2dwb24sCisgICAgICAgIC5mbG93X3ZhbGlkYXRlID0gbWFjX3V0aWxfdmFsaWRhdGVfZmxvd19pbmZvX2Zvcl9ncG9uLAorICAgICAgICAuZmxvd19zZXQgPSBtYWNfdXRpbF9mbG93X3NldF9mb3JfZ3BvbiwKKyAgICAgICAgLmdyb3VwX3ZhbGlkYXRlID0gTlVMTCwKKyAgICAgICAgLmdyb3VwX3NldCA9IG1hY191dGlsX2dyb3VwX3NldF9mb3JfZ3BvbiwKKyAgICAgICAgLnNsYV91c19yYXRlX2ZhY3RvciA9IDEKKyAgICB9LAorICAgIFtCQ01fVE9QT19QT05fTU9ERV9YR1BPTl0gPQorICAgIHsKKyAgICAgICAgLmlmX3ZhbGlkYXRlID0gTlVMTCwKKyAgICAgICAgLmlmX3NldCA9IG1hY191dGlsX2ludGVyZmFjZV9zZXRfZm9yX3hncG9uLAorICAgICAgICAuc3ViX3Rlcm1fdmFsaWRhdGUgPSBtYWNfdXRpbF92YWxpZGF0ZV9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZm9fZm9yX3hncG9uLAorICAgICAgICAuc3ViX3Rlcm1fc2V0ID0gbWFjX3V0aWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zZXRfZm9yX3hncG9uLAorICAgICAgICAuZmxvd192YWxpZGF0ZSA9IG1hY191dGlsX3ZhbGlkYXRlX2Zsb3dfaW5mb19mb3JfeGdwb24sCisgICAgICAgIC5mbG93X3NldCA9IG1hY191dGlsX2Zsb3dfc2V0X2Zvcl94Z3BvbiwKKyAgICAgICAgLmdyb3VwX3ZhbGlkYXRlID0gTlVMTCwKKyAgICAgICAgLmdyb3VwX3NldCA9IG1hY191dGlsX2dyb3VwX3NldF9mb3JfeGdwb24sCisgICAgICAgIC5zbGFfdXNfcmF0ZV9mYWN0b3IgPSAyCisgICAgfSwKKyAgICBbQkNNX1RPUE9fUE9OX01PREVfWEdTXSA9CisgICAgeworICAgICAgICAuaWZfdmFsaWRhdGUgPSBOVUxMLAorICAgICAgICAuaWZfc2V0ID0gbWFjX3V0aWxfaW50ZXJmYWNlX3NldF9mb3JfeGdwb24sCisgICAgICAgIC5zdWJfdGVybV92YWxpZGF0ZSA9IG1hY191dGlsX3ZhbGlkYXRlX3N1YnNjcmliZXJfdGVybWluYWxfaW5mb19mb3JfeGdwb24sCisgICAgICAgIC5zdWJfdGVybV9zZXQgPSBtYWNfdXRpbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3NldF9mb3JfeGdwb24sCisgICAgICAgIC5mbG93X3ZhbGlkYXRlID0gbWFjX3V0aWxfdmFsaWRhdGVfZmxvd19pbmZvX2Zvcl94Z3BvbiwKKyAgICAgICAgLmZsb3dfc2V0ID0gbWFjX3V0aWxfZmxvd19zZXRfZm9yX3hncG9uLAorICAgICAgICAuZ3JvdXBfdmFsaWRhdGUgPSBOVUxMLAorICAgICAgICAuZ3JvdXBfc2V0ID0gbWFjX3V0aWxfZ3JvdXBfc2V0X2Zvcl94Z3BvbiwKKyAgICAgICAgLnNsYV91c19yYXRlX2ZhY3RvciA9IDgKKyAgICB9LAorICAgIFtCQ01fVE9QT19QT05fTU9ERV9FUE9OX1RETUFdID0KKyAgICB7CisgICAgICAgIC5pZl92YWxpZGF0ZSA9IE5VTEwsCisgICAgICAgIC5pZl9zZXQgPSBtYWNfdXRpbF9pbnRlcmZhY2Vfc2V0X2Zvcl9lcG9uLAorICAgICAgICAuc3ViX3Rlcm1fdmFsaWRhdGUgPSBOVUxMLAorICAgICAgICAuc3ViX3Rlcm1fc2V0ID0gTlVMTCwKKyAgICAgICAgLmZsb3dfdmFsaWRhdGUgPSBOVUxMLAorICAgICAgICAuZmxvd19zZXQgPSBOVUxMLAorICAgICAgICAuZ3JvdXBfdmFsaWRhdGUgPSBOVUxMLAorICAgICAgICAuZ3JvdXBfc2V0ID0gTlVMTCwKKyAgICAgICAgLnNsYV91c19yYXRlX2ZhY3RvciA9IDAKKyAgICB9LAorICAgIFtCQ01fVE9QT19QT05fTU9ERV9FUE9OXzFHXSA9CisgICAgeworICAgICAgICAuaWZfdmFsaWRhdGUgPSBOVUxMLAorICAgICAgICAuaWZfc2V0ID0gbWFjX3V0aWxfaW50ZXJmYWNlX3NldF9mb3JfZXBvbiwKKyAgICAgICAgLnN1Yl90ZXJtX3ZhbGlkYXRlID0gTlVMTCwKKyAgICAgICAgLnN1Yl90ZXJtX3NldCA9IE5VTEwsCisgICAgICAgIC5mbG93X3ZhbGlkYXRlID0gTlVMTCwKKyAgICAgICAgLmZsb3dfc2V0ID0gTlVMTCwKKyAgICAgICAgLmdyb3VwX3ZhbGlkYXRlID0gTlVMTCwKKyAgICAgICAgLmdyb3VwX3NldCA9IE5VTEwsCisgICAgICAgIC5zbGFfdXNfcmF0ZV9mYWN0b3IgPSAwCisgICAgfSwKKyAgICBbQkNNX1RPUE9fUE9OX01PREVfRVBPTl8xMEddID0KKyAgICB7CisgICAgICAgIC5pZl92YWxpZGF0ZSA9IE5VTEwsCisgICAgICAgIC5pZl9zZXQgPSBtYWNfdXRpbF9pbnRlcmZhY2Vfc2V0X2Zvcl9lcG9uLAorICAgICAgICAuc3ViX3Rlcm1fdmFsaWRhdGUgPSBOVUxMLAorICAgICAgICAuc3ViX3Rlcm1fc2V0ID0gTlVMTCwKKyAgICAgICAgLmZsb3dfdmFsaWRhdGUgPSBOVUxMLAorICAgICAgICAuZmxvd19zZXQgPSBOVUxMLAorICAgICAgICAuZ3JvdXBfdmFsaWRhdGUgPSBOVUxMLAorICAgICAgICAuZ3JvdXBfc2V0ID0gTlVMTCwKKyAgICAgICAgLnNsYV91c19yYXRlX2ZhY3RvciA9IDAKKyAgICB9LAorICAgIFtCQ01fVE9QT19QT05fTU9ERV9MT09QQkFDS10gPQorICAgIHsKKyAgICAgICAgLmlmX3ZhbGlkYXRlID0gTlVMTCwKKyAgICAgICAgLmlmX3NldCA9IG1hY191dGlsX2ludGVyZmFjZV9zZXRfZm9yX2xvb3BiYWNrLAorICAgICAgICAuc3ViX3Rlcm1fdmFsaWRhdGUgPSBOVUxMLAorICAgICAgICAuc3ViX3Rlcm1fc2V0ID0gbWFjX3V0aWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zZXRfZm9yX2xvb3BiYWNrLAorICAgICAgICAuZmxvd192YWxpZGF0ZSA9IE5VTEwsCisgICAgICAgIC5mbG93X3NldCA9IG1hY191dGlsX2Zsb3dfc2V0X2Zvcl9sb29wYmFjaywKKyAgICAgICAgLmdyb3VwX3ZhbGlkYXRlID0gTlVMTCwKKyAgICAgICAgLmdyb3VwX3NldCA9IE5VTEwsCisgICAgICAgIC5zbGFfdXNfcmF0ZV9mYWN0b3IgPSAxCisgICAgfQorfTsKKworc3RhdGljIGZfYmNtb2x0X21zZ19oYW5kbGVyIGdfaW5kaWNhdGlvbl9oYW5kbGVyOworCitzdGF0aWMgYmNtX3RvcG9fcG9uX21vZGUgbWFjX3V0aWxfZ2V0X3Bvbl9tb2RlKHVpbnQzMl90IGxvZ2ljYWxfaW50Zl9pZCkKK3sKKyAgICBiY21fdG9wb19wb25fbW9kZSBtb2RlOworICAgIGlmIChiY21iYWxfaXNfbWFjX2luX2xvb3BiYWNrKCkpCisgICAgICAgIG1vZGUgPSBCQ01fVE9QT19QT05fTU9ERV9MT09QQkFDSzsKKyAgICBlbHNlCisgICAgICAgIG1vZGUgPSBiY21fdG9wb19wb25fZ2V0X3Bvbl9tb2RlKGxvZ2ljYWxfaW50Zl9pZCk7CisgICAgcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBvcGVyX3N0YXR1c19mcm9tX3Bvbl9zdGF0ZV9nZXQodWludDMyX3QgbG9naWNhbF9pbnRmX2lkLCB1aW50MTZfdCBzdGF0ZSkKK3sKKyAgICB1aW50MTZfdCBvcGVyX3N0YXR1czsKKyAgICBiY21fdG9wb19wb25fZmFtaWx5IHBvbl9mYW1pbHk7CisKKyAgICBwb25fZmFtaWx5ID0gYmNtX3RvcG9fcG9uX2dldF9wb25fZmFtaWx5KGxvZ2ljYWxfaW50Zl9pZCk7CisKKyAgICBzd2l0Y2ggKHBvbl9mYW1pbHkpCisgICAgeworICAgICAgICBjYXNlIEJDTV9UT1BPX1BPTl9GQU1JTFlfRVBPTjoKKyAgICAgICAgICAgIG9wZXJfc3RhdHVzID0gKCgoYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUpc3RhdGUgPT0gQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRU5BQkxFRCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFMX1VUSUxfT1BFUl9JRl9VUCA6IEJBTF9VVElMX09QRVJfSUZfRE9XTik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJDTV9UT1BPX1BPTl9GQU1JTFlfR1BPTjoKKyAgICAgICAgICAgIG9wZXJfc3RhdHVzID0gKCgoYmNtb2x0X3Bvbl9zdGF0ZSlzdGF0ZSA9PSBCQ01PTFRfUE9OX1NUQVRFX0FDVElWRV9XT1JLSU5HKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfVVRJTF9PUEVSX0lGX1VQIDogQkFMX1VUSUxfT1BFUl9JRl9ET1dOKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNX1RPUE9fUE9OX0ZBTUlMWV9JTlZBTElEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJVbmtub3duIFBPTiBmYW1pbHkgb24gaW50ZiAldTogJWRcbiIsIGxvZ2ljYWxfaW50Zl9pZCwgcG9uX2ZhbWlseSk7CisgICAgICAgICAgICBvcGVyX3N0YXR1cyA9IEJBTF9VVElMX09QRVJfSUZfRE9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBvcGVyX3N0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgRnVuY3Rpb24gdG8gc2VuZCBhIHV0aWwgaW5kaWNhdGlvbiBtZXNzYWdlIHRvIHRoZSBjb3JlCisgKgorICogQHBhcmFtIG1zZ19wYXlsb2FkIEEgcG9pbnRlciB0byBhIHdlbGwgZm9ybWVkIE1BQyB1dGlsIGluZGljYXRpb24gbWVzc2FnZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vID09IEJDTV9FUlJfT0sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfaW5kX3NlbmQoYmFsX3V0aWxfbXNnX2luZCAqbXNnX3BheWxvYWQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IGJjbW9zX21zZ19kaXNwYXRjaChiY21iYWxfYmNtb3NfaGRyX2dldChtc2dfcGF5bG9hZCksIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7CisKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICAgICAgICAgIkNvdWxkbid0IGRpc3BhdGNoIGluZGljYXRpb24gbWVzc2FnZSBmcm9tIE1BQyB1dGlsICglZDolZClcbiIsCisgICAgICAgICAgICAgICAgKGludCkoYmNtYmFsX2JjbW9zX2hkcl9nZXQobXNnX3BheWxvYWQpKS0+dHlwZSwKKyAgICAgICAgICAgICAgICAoaW50KShiY21iYWxfYmNtb3NfaGRyX2dldChtc2dfcGF5bG9hZCkpLT5pbnN0YW5jZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBGdW5jdGlvbiB0byBzZW5kIGEgdXRpbCBhdXRvIGluZGljYXRpb24gbWVzc2FnZSB0byB0aGUgY29yZQorICoKKyAqIEBwYXJhbSBtc2dfcGF5bG9hZCBBIHBvaW50ZXIgdG8gYSB3ZWxsIGZvcm1lZCBNQUMgdXRpbCBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubyA9PSBCQ01fRVJSX09LCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hY191dGlsX2F1dG9faW5kX3NlbmQoYmFsX3V0aWxfbXNnX2F1dG9faW5kICptc2dfcGF5bG9hZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtb3NfbXNnX2Rpc3BhdGNoKGJjbWJhbF9iY21vc19oZHJfZ2V0KG1zZ19wYXlsb2FkKSwgQkNNT1NfTVNHX1NFTkRfQVVUT19GUkVFKTsKKworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKyAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZGlzcGF0Y2ggYXV0byBpbmRpY2F0aW9uIG1lc3NhZ2UgZnJvbSBNQUMgdXRpbCAoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgIChpbnQpKGJjbWJhbF9iY21vc19oZHJfZ2V0KG1zZ19wYXlsb2FkKSktPnR5cGUsCisgICAgICAgICAgICAgICAgKGludCkoYmNtYmFsX2JjbW9zX2hkcl9nZXQobXNnX3BheWxvYWQpKS0+aW5zdGFuY2UpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyogUmVwb3J0IGFjY190ZXJtIGV2ZW50ICovCit2b2lkIG1hY191dGlsX3JlcG9ydF9hY2NfdGVybV9ldmVudCh1aW50MTZfdCBldmVudCkKK3sKKyAgICBiYWxfdXRpbF9tc2dfaW5kICpwX2JhbF91dGlsX2luZF9tc2c7CisKKyAgICBpZihOVUxMICE9IChwX2JhbF91dGlsX2luZF9tc2cgPSBiY21iYWxfbXNnX2NhbGxvYyhzaXplb2YoYmFsX3V0aWxfbXNnX2luZCkpKSkKKyAgICB7CisgICAgICAgIHBfYmFsX3V0aWxfaW5kX21zZy0+dmVyc2lvbiA9IEJBTF9VVElMX01TR19WRVJTSU9OOworCisgICAgICAgIC8qIGRldmljZSBjb25uZWN0ICovCisgICAgICAgIGlmIChCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9DT01QTEVURSA9PSBldmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgcF9iYWxfdXRpbF9pbmRfbXNnLT5zdGF0dXMgPSBCQ01fRVJSX09LOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcF9iYWxfdXRpbF9pbmRfbXNnLT5zdGF0dXMgPSBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBiY21iYWxfbXNnX2hkcl9zZXQocF9iYWxfdXRpbF9pbmRfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX01BQ19VVElMX01TRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTF9NU0dfVFlQRV9JTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfU1VCU1lTVEVNX01BQ19VVElMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX09CSl9JRF9BQ0NFU1NfVEVSTUlOQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfVVRJTF9PUEVSX0FDQ19URVJNX0NPTk5FQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9tYWNfdXRpbCwgIlJlcG9ydGluZyB0byBDb3JlOiBCQUxfVVRJTF9PUEVSX0FDQ19URVJNX0NPTk5FQ1QgaW5kaWNhdGlvbi4gU3RhdHVzPSVzXG4iLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHBfYmFsX3V0aWxfaW5kX21zZy0+c3RhdHVzKSk7CisKKyAgICAgICAgbWFjX3V0aWxfaW5kX3NlbmQocF9iYWxfdXRpbF9pbmRfbXNnKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhY2Nlc3MtdGVybWluYWwgSU5EIG1lc3NhZ2VcbiIpOworICAgIH0KK30KKworCisvKioKKyAqIEBicmllZiBSZXBvcnQgaW50ZXJmYWNlIGV2ZW50CisgKiBAbm90ZSB3ZSBjb25zaWRlciBib3RoIGVyciBhbmQgcmVzdWx0IGZvciByZXBvcnRpbmcgdGhlIHN0YXR1cyB0byBDb3JlCisgKiAqLwordm9pZCBtYWNfdXRpbF9yZXBvcnRfaWZfZXZlbnQoYmNtYmFsX2ludGZfaWQgaW50Zl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9pbnRmX3R5cGUgaW50Zl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfZXJybm8gZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3Jlc3VsdCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfcG9uX3N0YXRlIG5ld19zdGF0ZSkKK3sKKyAgICBiYWxfdXRpbF9tc2dfaW5kICpwX2JhbF91dGlsX2luZF9tc2c7CisKKyAgICBpZihOVUxMICE9IChwX2JhbF91dGlsX2luZF9tc2cgPSBiY21iYWxfbXNnX2NhbGxvYyhzaXplb2YoYmFsX3V0aWxfbXNnX2luZCkpKSkKKyAgICB7CisKKyAgICAgICAgLyoqIEB0b2RvIHZhbGlkYXRlIGluZl9pZCBpcyB3aXRoaW4gcmFuZ2UgYmFzZWQgb24gaW50Zl90eXBlICovCisgICAgICAgIHBfYmFsX3V0aWxfaW5kX21zZy0+dmVyc2lvbiA9IEJBTF9VVElMX01TR19WRVJTSU9OOworICAgICAgICBwX2JhbF91dGlsX2luZF9tc2ctPm9ial9rZXkuaWZfa2V5LmludGZfaWQgPSBpbnRmX2lkOworICAgICAgICBwX2JhbF91dGlsX2luZF9tc2ctPm9ial9rZXkuaWZfa2V5LmludGZfdHlwZSA9IGludGZfdHlwZTsKKworICAgICAgICBpZiAoKEJDTV9FUlJfT0sgPT0gZXJyKSAmJiAoQkNNT0xUX1JFU1VMVF9TVUNDRVNTICE9IHJlc3VsdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICAgICAgcF9iYWxfdXRpbF9pbmRfbXNnLT5zdGF0dXMgPSBlcnI7CisKKyAgICAgICAgYmNtYmFsX21zZ19oZHJfc2V0KHBfYmFsX3V0aWxfaW5kX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9NQUNfVVRJTF9NU0csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfTVNHX1RZUEVfSU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFMX1NVQlNZU1RFTV9NQUNfVVRJTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9PQkpfSURfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blcl9zdGF0dXNfZnJvbV9wb25fc3RhdGVfZ2V0KGludGZfaWQsIG5ld19zdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgICAgICBCQ01fTE9HKERFQlVHLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaW50Zl9pZCksICJSZXBvcnRpbmcgdG8gQ29yZTogaW50ZXJmYWNlIGlkICVkICVzIGluZGljYXRpb246ICVzXG4iLAorICAgICAgICAgICAgICAgIGludGZfaWQsCisgICAgICAgICAgICAgICAgKEJBTF9VVElMX09QRVJfSUZfVVAgPT0gb3Blcl9zdGF0dXNfZnJvbV9wb25fc3RhdGVfZ2V0KGludGZfaWQsIG5ld19zdGF0ZSkpID8gIlVQIiA6ICJET1dOIiwKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihwX2JhbF91dGlsX2luZF9tc2ctPnN0YXR1cykpOworCisKKyAgICAgICAgbWFjX3V0aWxfaW5kX3NlbmQocF9iYWxfdXRpbF9pbmRfbXNnKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaW50Zl9pZCksCisgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGludGVyZmFjZSBJTkQgbWVzc2FnZVxuIik7CisgICAgfQorfQorCisvKiBSZXBvcnQgc3Vic2NyaWJlciB0ZXJtaW5hbCBldmVudCAqLworCisvKioKKyAqIEBub3RlIHBfc2VyaWFsX251bWJlciBtYXkgYmUgTlVMTCBhbmQgaXMgb25seSB2YWxpZCB3aGVuIGFuIE9OVQorICogaXMgYmVpbmcgcmVwb3J0ZWQgYXMgRElTQ09WRVJFRAorICogQG5vdGUgcmVzdWx0IGlzIGNvbmZpZyBzdGF0dXMgcmVwb3J0ZWQgYnkgTWFwbGUsIHdoZXJlYXMgZXJyIGlzIG1lc3NhZ2luZyBzdGF0dXMKKyAqIGJldHdlZW4gdGhlIE1BQyB1dGlsICYgTWFwbGUKKyAqICovCit2b2lkIG1hY191dGlsX3JlcG9ydF9zdWJfdGVybV9ldmVudChiY21iYWxfaW50Zl9pZCBwb25fbmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfc3ViX2lkIG9udV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyICpwX3NlcmlhbF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxfdXRpbF9vcGVyX3N1Yl90ZXJtIG9wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19lcnJubyBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfcmVzdWx0IHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fdHVubmVsX2lkIHR1bm5lbF9pZCkKK3sKKyAgICBiYWxfdXRpbF9tc2dfaW5kICpwX2JhbF91dGlsX2luZF9tc2c7CisgICAgdWludDE2X3QgdG90YWxfbXNnbGVuOworICAgIGJjbV90b3BvX3Bvbl9mYW1pbHkgcG9uX2ZhbWlseTsKKworICAgIHRvdGFsX21zZ2xlbiA9IHNpemVvZihiYWxfdXRpbF9tc2dfaW5kKTsKKworICAgIHBvbl9mYW1pbHkgPSBiY21fdG9wb19wb25fZ2V0X3Bvbl9mYW1pbHkocG9uX25pKTsKKyAgICAvKioKKyAgICAgKiBAbm90ZSBpZiBwb24gbW9kZSBpcyBpbnZhbGlkIHRoZW4gdGhpcyBlcnJvciBzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCBpbiB0aGUgdmFsaWRhdGlvbiBzdGFnZSBpdHNlbGYuCisgICAgICogICAgSG93ZXZlciwgc3RpbGwgY2hlY2tpbmcgaGVyZSB0byBtYWtlIHN1cmUgYW5kIHJlcG9ydCBhbiBlcnJvciBpZiBuZWVkZWQuCisgICAgICovCisgICAgaWYgKHBvbl9mYW1pbHkgPT0gQkNNX1RPUE9fUE9OX0ZBTUlMWV9JTlZBTElEKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gQkNNT0xUX1JFU1VMVF9GQUlMOworICAgIH0KKworICAgIGlmIChwb25fZmFtaWx5ID09IEJDTV9UT1BPX1BPTl9GQU1JTFlfRVBPTikKKyAgICB7CisgICAgICAgIHRvdGFsX21zZ2xlbiArPSBzaXplb2YoYmNtb2x0X2Vwb25fdHVubmVsX2lkKTsKKyAgICB9CisgICAgZWxzZSBpZihOVUxMICE9IHBfc2VyaWFsX251bWJlcikKKyAgICB7CisgICAgICAgIHRvdGFsX21zZ2xlbiArPSBzaXplb2YoYmNtYmFsX3NlcmlhbF9udW1iZXIpOworICAgIH0KKworCisgICAgLyogY29uc29saWRhdGUgImVyciIgYW5kICJyZXN1bHQiIGludG8gb25lIHJlcG9ydCBzdGF0dXMgKi8KKyAgICBpZiAoKEJDTV9FUlJfT0sgPT0gZXJyKSAmJiAoQkNNT0xUX1JFU1VMVF9TVUNDRVNTICE9IHJlc3VsdCkpCisgICAgeworICAgICAgICBlcnIgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworCisgICAgaWYoTlVMTCAhPSAocF9iYWxfdXRpbF9pbmRfbXNnID0gYmNtYmFsX21zZ19jYWxsb2ModG90YWxfbXNnbGVuKSkpCisgICAgeworICAgICAgICAvKiBzZXQgdGhlIG9iamVjdCBrZXkgKi8KKyAgICAgICAgcF9iYWxfdXRpbF9pbmRfbXNnLT5vYmpfa2V5LnN1Yl90ZXJtX2tleS5pbnRmX2lkID0gcG9uX25pOworICAgICAgICBwX2JhbF91dGlsX2luZF9tc2ctPm9ial9rZXkuc3ViX3Rlcm1fa2V5LnN1Yl90ZXJtX2lkID0gb251X2lkOworCisgICAgICAgIC8qIHNldCBiYWwgdXRpbCBtc2cgdmVyc2lvbiAqLworICAgICAgICBwX2JhbF91dGlsX2luZF9tc2ctPnZlcnNpb24gPSBCQUxfVVRJTF9NU0dfVkVSU0lPTjsKKworICAgICAgICBiY21iYWxfbXNnX2hkcl9zZXQocF9iYWxfdXRpbF9pbmRfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX01BQ19VVElMX01TRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX1NVQl9URVJNX0RJU0NPVkVSWSA9PSBvcGVyKSA/IEJBTF9NU0dfVFlQRV9BVVRPX0lORCA6IEJBTF9NU0dfVFlQRV9JTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfU1VCU1lTVEVNX01BQ19VVElMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCBhbGwgdGhlIG1lc3NhZ2UgaGVhZGVyIHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIGlmICgoQkNNX0VSUl9PSyA9PSBlcnIpICYmCisgICAgICAgICAgICAgICAgKCgoQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9BREQgPT0gb3BlcikgJiYgKGZhaWxfcmVhc29uID09IEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX05PTkUpKSB8fAorICAgICAgICAgICAgICAgICAoKEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQUREICE9IG9wZXIpICYmIChmYWlsX3JlYXNvbiA9PSBNQUNfVVRJTF9ERUFDVElWQVRJT05fRkFJTF9SRUFTT05fTk9ORSkpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwb25fbmkpLAorICAgICAgICAgICAgICAgICAgICAiUmVwb3J0aW5nIHRvIENvcmU6ICVzICIKKyAgICAgICAgICAgICAgICAgICAgImluZGljYXRpb24gZnJvbSBtYWMgdXRpbDogU3VjY2Vzc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgKEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQUREID09IG9wZXIpID8gIkJBTF9VVElMX09QRVJfU1VCX1RFUk1fQUREIiA6CisgICAgICAgICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX1NVQl9URVJNX1JFTU9WRSA9PSBvcGVyKSA/ICJCQUxfVVRJTF9PUEVSX1NVQl9URVJNX1JFTU9WRSIgOgorICAgICAgICAgICAgICAgICAgICAiQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9ESVNDT1ZFUlkiKTsKKworICAgICAgICAgICAgcF9iYWxfdXRpbF9pbmRfbXNnLT5zdGF0dXMgPSBCQ01fRVJSX09LOworCisgICAgICAgICAgICBpZiAocG9uX2ZhbWlseSA9PSBCQ01fVE9QT19QT05fRkFNSUxZX0VQT04pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZwX2JhbF91dGlsX2luZF9tc2ctPmRhdGEsICZ0dW5uZWxfaWQsIHNpemVvZihiY21vbHRfZXBvbl90dW5uZWxfaWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKE5VTEwgIT0gcF9zZXJpYWxfbnVtYmVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFRoaXMgYXNzdW1lcyBhbiBpZGVudGljYWwgZGVmaW5pdGlvbiBvZiBzZXJpYWwgbnVtYmVyIGJldHdlZW4gQkFMIGFuZCBNQVBMRSAqLworICAgICAgICAgICAgICAgIG1lbWNweSgmcF9iYWxfdXRpbF9pbmRfbXNnLT5kYXRhLCBwX3NlcmlhbF9udW1iZXIsIHNpemVvZihiY21iYWxfc2VyaWFsX251bWJlcikpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwX2JhbF91dGlsX2luZF9tc2ctPnN0YXR1cyA9IGVycjsKKworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBvbl9uaSksCisgICAgICAgICAgICAgICAgICAgICJSZXBvcnRpbmcgdG8gQ29yZTogJXMgSW5kaWNhdGlvbiBmcm9tIG1hYyB1dGlsOiBGYWlsdXJlLCB3aXRoIHN0YXR1cyA9ICVzLCBmYWlsX3JlYXNvbiA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAoKEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQUREID09IG9wZXIpID8gIkJBTF9VVElMX09QRVJfU1VCX1RFUk1fQUREIiA6CisgICAgICAgICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX1NVQl9URVJNX1JFTU9WRSA9PSBvcGVyKSA/ICJCQUxfVVRJTF9PUEVSX1NVQl9URVJNX1JFTU9WRSIgOgorICAgICAgICAgICAgICAgICAgICAiQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9ESVNDT1ZFUlkiKSwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IoZXJyKSwgZmFpbF9yZWFzb24pOworICAgICAgICB9CisKKyAgICAgICAgbWFjX3V0aWxfaW5kX3NlbmQocF9iYWxfdXRpbF9pbmRfbXNnKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocG9uX25pKSwKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc3Vic2NyaWJlci10ZXJtaW5hbCBJTkQgbWVzc2FnZVxuIik7CisgICAgfQorfQorCisKKy8qKgorICogTm90aWZ5IGNvcmUgZmxvdyBGU00gdGhhdCBmbG93IGFkZC9tb2RpZnkvcmVtb3ZlIHdhcyBzdWNjZXNzIG9yIGZhaWxlZAorICoKKyAqIEBwYXJhbSAgZmxvd19rZXkKKyAqIEBwYXJhbSAgcG9uX2lmICAgcG9uIGludGVyZmFjZQorICogQHBhcmFtICBvcF90eXBlICBBREQsIFJFTU9WRSwgTU9ESUZZCisgKiBAcGFyYW0gIGVyciAgICAgIGVycm9yIGNvZGUgdG8gYmUgc2VudCB1cAorICoKKyAqKi8KK3N0YXRpYyB2b2lkIF9tYWNfdXRpbF9yZXBvcnRfZmxvd19zZXRfaW5kaWNhdGlvbihiY21iYWxfZmxvd19rZXkgZmxvd19rZXksIHVpbnQzMl90IHBvbl9pZiwgYmFsX3V0aWxfb3Blcl9mbG93IG9wX3R5cGUsIGJjbW9zX2Vycm5vIGVycikKK3sKKyAgICBiYWxfdXRpbF9tc2dfaW5kICpwX2JhbF91dGlsX2luZF9tc2c7CisKKyAgICBpZihOVUxMICE9IChwX2JhbF91dGlsX2luZF9tc2cgPSBiY21iYWxfbXNnX2NhbGxvYyhzaXplb2YoYmFsX3V0aWxfbXNnX2luZCkpKSkKKyAgICB7CisKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocG9uX2lmKSwgIlJlcG9ydGluZyB0byBDb3JlOiBmbG93ICVkLCAlcyAlcywgcmVzdWx0PSVzXG4iLAorICAgICAgICAgICAgICAgIGZsb3dfa2V5LmZsb3dfaWQsCisgICAgICAgICAgICAgICAgKEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPT0gZmxvd19rZXkuZmxvd190eXBlID8gInVwc3RyZWFtIiA6CisgICAgICAgICAgICAgICAgIEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSA9PSBmbG93X2tleS5mbG93X3R5cGUgPyAiZG93bnN0cmVhbSIgOgorICAgICAgICAgICAgICAgICBCQ01CQUxfRkxPV19UWVBFX01VTFRJQ0FTVCA9PSBmbG93X2tleS5mbG93X3R5cGUgPyAibXVsdGljYXN0IiA6ImJyb2FkY2FzdCIpLAorICAgICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX0ZMT1dfQUREID09IG9wX3R5cGUgPyAiRkxPVyBBREQiOgorICAgICAgICAgICAgICAgICAoQkFMX1VUSUxfT1BFUl9GTE9XX1JFTU9WRSA9PSBvcF90eXBlID8gIkZMT1cgUkVNT1ZFIiA6ICJGTE9XX0NMRUFSIikpLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKGVycikpOworCisKKyAgICAgICAgLyogc2V0IGJhbCBhcHAgcF9tc2cgdmVyc2lvbiAqLworICAgICAgICBwX2JhbF91dGlsX2luZF9tc2ctPnZlcnNpb24gPSBCQUxfVVRJTF9NU0dfVkVSU0lPTjsKKyAgICAgICAgcF9iYWxfdXRpbF9pbmRfbXNnLT5vYmpfa2V5LmZsb3dfa2V5ID0gZmxvd19rZXk7CisgICAgICAgIHBfYmFsX3V0aWxfaW5kX21zZy0+c3RhdHVzID0gZXJyOyAvKiBzZXQgdGhlIGVycm9yIGNvZGUgKi8KKworICAgICAgICBiY21iYWxfbXNnX2hkcl9zZXQocF9iYWxfdXRpbF9pbmRfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX01BQ19VVElMX01TRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTF9NU0dfVFlQRV9JTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfU1VCU1lTVEVNX01BQ19VVElMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX09CSl9JRF9GTE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisKKyAgICAgICAgbWFjX3V0aWxfaW5kX3NlbmQocF9iYWxfdXRpbF9pbmRfbXNnKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBvbl9pZiksICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBmbG93IElORCBtZXNzYWdlXG4iKTsKKyAgICB9Cit9CisKK3ZvaWQgbWFjX3V0aWxfcmVwb3J0X3RtX3NjaGVkX3NldF9pbmRpY2F0aW9uKGJjbWJhbF90bV9zY2hlZF9rZXkgdG1fc2NoZWRfa2V5LCBiY21vc19lcnJubyBlcnIsIGJjbW9sdF9yZXN1bHQgaW5kX3Jlc3VsdCkKK3sKKyAgICBiYWxfdXRpbF9tc2dfaW5kICpwX2JhbF91dGlsX2luZF9tc2c7CisKKyAgICBpZiAoKEJDTV9FUlJfT0sgPT0gZXJyKSAmJiAoQkNNT0xUX1JFU1VMVF9TVUNDRVNTICE9IGluZF9yZXN1bHQpKQorICAgIHsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICBpZihOVUxMICE9IChwX2JhbF91dGlsX2luZF9tc2cgPSBiY21iYWxfbXNnX2NhbGxvYyhzaXplb2YoYmFsX3V0aWxfbXNnX2luZCkpKSkKKyAgICB7CisKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfbWFjX3V0aWwsICJSZXBvcnRpbmcgdG8gQ29yZTogdG0gc2NoZWQgJWQsICVzLCByZXN1bHQ9JXNcbiIsCisgICAgICAgICAgICAgICAgdG1fc2NoZWRfa2V5LmlkLAorICAgICAgICAgICAgICAgIChCQ01CQUxfVE1fU0NIRURfRElSX1VTID09IHRtX3NjaGVkX2tleS5kaXIgPyAidXBzdHJlYW0iIDoiZG93bnN0cmVhbSIpLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKGVycikpOworCisKKyAgICAgICAgLyogc2V0IGJhbCBhcHAgcF9tc2cgdmVyc2lvbiAqLworICAgICAgICBwX2JhbF91dGlsX2luZF9tc2ctPnZlcnNpb24gPSBCQUxfVVRJTF9NU0dfVkVSU0lPTjsKKyAgICAgICAgcF9iYWxfdXRpbF9pbmRfbXNnLT5vYmpfa2V5LnRtX3NjaGVkX2tleSA9IHRtX3NjaGVkX2tleTsKKyAgICAgICAgcF9iYWxfdXRpbF9pbmRfbXNnLT5zdGF0dXMgPSBlcnI7IC8qIHNldCB0aGUgZXJyb3IgY29kZSAqLworCisgICAgICAgIGJjbWJhbF9tc2dfaGRyX3NldChwX2JhbF91dGlsX2luZF9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfTUFDX1VUSUxfTVNHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFMX01TR19UWVBFX0lORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTF9TVUJTWVNURU1fTUFDX1VUSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfT0JKX0lEX1RNX1NDSEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFMX1VUSUxfT1BFUl9BR0dfUE9SVF9BREQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworCisgICAgICAgIG1hY191dGlsX2luZF9zZW5kKHBfYmFsX3V0aWxfaW5kX21zZyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRtIHNjaGVkIElORCBtZXNzYWdlXG4iKTsKKyAgICB9Cit9CisKKy8qKgorICogTm90aWZ5IGNvcmUgZ3JvdXAgRlNNIHRoYXQgZ3JvdXAgc2V0IHJlcXVlc3Qgd2FzIHN1Y2Nlc3Mgb3IgZmFpbGVkCisgKgorICogQHBhcmFtICBncm91cF9rZXkKKyAqIEBwYXJhbSAgb3BfdHlwZSAgQURELCBSRU1PVkUsIFNFVCwgQ1JFQVRFLCBERVNUUk9ZCisgKiBAcGFyYW0gIGVyciAgICAgIGVycm9yIGNvZGUgdG8gYmUgc2VudCB1cAorICoKKyAqKi8KK3N0YXRpYyB2b2lkIF9tYWNfdXRpbF9yZXBvcnRfZ3JvdXBfc2V0X2luZGljYXRpb24gKGJjbWJhbF9ncm91cF9rZXkgZ3JvdXBfa2V5LCBiYWxfdXRpbF9vcGVyX2dyb3VwIG9wX3R5cGUsIGJjbW9zX2Vycm5vIGVycikKK3sKKyAgICBiYWxfdXRpbF9tc2dfaW5kICpwX2JhbF91dGlsX2luZF9tc2c7CisKKyAgICBpZihOVUxMICE9IChwX2JhbF91dGlsX2luZF9tc2cgPSBiY21iYWxfbXNnX2NhbGxvYyhzaXplb2YoYmFsX3V0aWxfbXNnX2luZCkpKSkKKyAgICB7CisKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfbWFjX3V0aWwsICJSZXBvcnRpbmcgdG8gQ29yZTogZ3JvdXAgJWQsICVzLCByZXN1bHQ9JXNcbiIsCisgICAgICAgICAgICAgICAgZ3JvdXBfa2V5Lmdyb3VwX2lkLAorICAgICAgICAgICAgICAgIEJDTUJBTF9VVElMX0dST1VQX09QRVJfU1RSX0dFVChvcF90eXBlKSwKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihlcnIpKTsKKworCisgICAgICAgIC8qIHNldCBiYWwgYXBwIHBfbXNnIHZlcnNpb24gKi8KKyAgICAgICAgcF9iYWxfdXRpbF9pbmRfbXNnLT52ZXJzaW9uID0gQkFMX1VUSUxfTVNHX1ZFUlNJT047CisgICAgICAgIHBfYmFsX3V0aWxfaW5kX21zZy0+b2JqX2tleS5ncm91cF9rZXkgPSBncm91cF9rZXk7CisgICAgICAgIHBfYmFsX3V0aWxfaW5kX21zZy0+c3RhdHVzID0gZXJyOyAvKiBzZXQgdGhlIGVycm9yIGNvZGUgKi8KKworICAgICAgICBiY21iYWxfbXNnX2hkcl9zZXQocF9iYWxfdXRpbF9pbmRfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX01BQ19VVElMX01TRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTF9NU0dfVFlQRV9JTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfU1VCU1lTVEVNX01BQ19VVElMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX09CSl9JRF9HUk9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworCisgICAgICAgIG1hY191dGlsX2luZF9zZW5kKHBfYmFsX3V0aWxfaW5kX21zZyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdyb3VwIElORCBtZXNzYWdlXG4iKTsKKyAgICB9Cit9CisKKy8qKgorICogTm90aWZ5IGNvcmUgZmxvdyBGU00gdGhhdCBmbG93IG9wZXJhdGlvbmFsIHN0YXRlIHdhcyBjaGFuZ2VkCisgKgorICogQHBhcmFtICBwb25faWYgLSB0aGUgZmxvdyBpbnRlcmZhY2UKKyAqIEBwYXJhbSAgZmxvd19rZXkKKyAqIEBwYXJhbSAgb3BfdHlwZSAtIHJlbGV2YW50IGZsb3cgbGF0ZXN0IG9wZXJhdGlvbgorICogQHBhcmFtICBpbmQgLSBzdWNjZXNzL2ZhaWwgcmVwcmVzZW50IGN1cnJlbnQgZmxvdyBzdGF0ZSBpcyB1cC9kb3duCisgKgorICoqLworCit2b2lkIG1hY191dGlsX3JlcG9ydF9mbG93X2F1dG9faW5kICh1aW50MzJfdCBwb25faWYsIGJjbWJhbF9mbG93X2tleSAgZmxvd19rZXkgLGJhbF91dGlsX29wZXJfZmxvdyBvcF90eXBlLCBiYWxfdXRpbF9mbG93X2luZCBpbmQpCit7CisgICAgYmFsX3V0aWxfbXNnX2F1dG9faW5kICpwX2JhbF91dGlsX2F1dG9faW5kX21zZzsKKworICAgIGlmKE5VTEwgIT0gKHBfYmFsX3V0aWxfYXV0b19pbmRfbXNnID0gYmNtYmFsX21zZ19jYWxsb2Moc2l6ZW9mKGJhbF91dGlsX21zZ19hdXRvX2luZCkgKyBzaXplb2YoYmNtYmFsX3N0YXR1cykpKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBvbl9pZiksICJSZXBvcnRpbmcgdG8gQ29yZTogZmxvdyAlZCwgJXMgJXMsIGNoYW5nZSB0byAlc1xuIiwKKyAgICAgICAgICAgIGZsb3dfa2V5LmZsb3dfaWQsCisgICAgICAgICAgICAoQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSA9PSBmbG93X2tleS5mbG93X3R5cGUgPyAidXBzdHJlYW0iIDoKKyAgICAgICAgICAgIEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSA9PSBmbG93X2tleS5mbG93X3R5cGUgPyAiZG93bnN0cmVhbSIgOgorICAgICAgICAgICAgQkNNQkFMX0ZMT1dfVFlQRV9NVUxUSUNBU1QgPT0gZmxvd19rZXkuZmxvd190eXBlID8gIm11bHRpY2FzdCIgOiJicm9hZGNhc3QiKSwKKyAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX0ZMT1dfQUREID09IG9wX3R5cGUgPyAiRkxPVyBBREQiOgorICAgICAgICAgICAgKEJBTF9VVElMX09QRVJfRkxPV19SRU1PVkUgPT0gb3BfdHlwZSA/ICJGTE9XIFJFTU9WRSIgOiAiRkxPV19DTEVBUiIpKSwKKyAgICAgICAgICAgIGluZCA9PSBCQUxfVVRJTF9GTE9XX0lORF9TRU5EX0ZBSUwgPyAiZmFpbCIgOiAic3VjY2VzcyIpOworCisgICAgICAgIC8qIHNldCBiYWwgYXBwIHBfbXNnIHZlcnNpb24gKi8KKyAgICAgICAgcF9iYWxfdXRpbF9hdXRvX2luZF9tc2ctPnZlcnNpb24gPSBCQUxfVVRJTF9NU0dfVkVSU0lPTjsKKyAgICAgICAgcF9iYWxfdXRpbF9hdXRvX2luZF9tc2ctPm9ial9rZXkuZmxvd19rZXkgPSBmbG93X2tleTsKKworICAgICAgICAvKmRhdGEgd2lsbCBpbmRpY2F0ZSB0aGUgbmV3IG9wZXJhdGlvbmFsIHN0YXRlKi8KKyAgICAgICAgKihwX2JhbF91dGlsX2F1dG9faW5kX21zZy0+ZGF0YSkgPSAoKGluZCA9PSBCQUxfVVRJTF9GTE9XX0lORF9TRU5EX0ZBSUwpID8gQkNNQkFMX1NUQVRVU19ET1dOIDogQkNNQkFMX1NUQVRVU19VUCk7CisgICAgICAgIHBfYmFsX3V0aWxfYXV0b19pbmRfbXNnLT5zdGF0dXMgPSBCQ01fRVJSX09LOworCisgICAgICAgIGJjbWJhbF9tc2dfaGRyX3NldChwX2JhbF91dGlsX2F1dG9faW5kX21zZywKKyAgICAgICAgICAgIEJDTUJBTF9NQUNfVVRJTF9NU0csCisgICAgICAgICAgICBCQUxfTVNHX1RZUEVfQVVUT19JTkQsCisgICAgICAgICAgICBCQUxfU1VCU1lTVEVNX01BQ19VVElMLAorICAgICAgICAgICAgQkNNQkFMX09CSl9JRF9GTE9XLAorICAgICAgICAgICAgb3BfdHlwZSwKKyAgICAgICAgICAgIDApOworCisgICAgICAgIG1hY191dGlsX2F1dG9faW5kX3NlbmQocF9iYWxfdXRpbF9hdXRvX2luZF9tc2cpOworICAgIH0KK30KKworCisvKiogQGJyaWVmIFdyYXBwZXIgcm91dGluZSB0byBOb3RpZnkgY29yZSBmbG93IEZTTSB0aGF0IGZsb3cgQUREIFN1Y2Nlc3MgKi8KK3ZvaWQgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfYWRkX3N1Y2Nlc3MoYmNtYmFsX2Zsb3dfa2V5IGZsb3dfa2V5LCB1aW50MzJfdCBwb25faWYpCit7CisgICAgX21hY191dGlsX3JlcG9ydF9mbG93X3NldF9pbmRpY2F0aW9uKGZsb3dfa2V5LCBwb25faWYsIEJBTF9VVElMX09QRVJfRkxPV19BREQsIEJDTV9FUlJfT0spOworfQorCisvKiogQGJyaWVmIFdyYXBwZXIgcm91dGluZSB0byBOb3RpZnkgY29yZSBmbG93IEZTTSB0aGF0IGZsb3cgQWRkIGZhaWxlZCwgYmFzZWQgb24gcmVzdWx0IGluIGluZGljYXRpb24gbXNnIGZyb20gTWFwbGUgKi8KK3ZvaWQgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfYWRkX2ZhaWxlZChiY21iYWxfZmxvd19rZXkgZmxvd19rZXksIHVpbnQzMl90IHBvbl9pZiwgYmNtb3NfZXJybm8gZXJyKQoreworICAgIF9tYWNfdXRpbF9yZXBvcnRfZmxvd19zZXRfaW5kaWNhdGlvbihmbG93X2tleSwgcG9uX2lmLCBCQUxfVVRJTF9PUEVSX0ZMT1dfQURELCBlcnIpOworfQorCisvKiogQGJyaWVmIFdyYXBwZXIgcm91dGluZSB0byBOb3RpZnkgY29yZSBmbG93IEZTTSB0aGF0IGZsb3cgUkVNT1ZFIGlzIFN1Y2Nlc3MgKi8KK3ZvaWQgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfcmVtb3ZlX3N1Y2Nlc3MoYmNtYmFsX2Zsb3dfa2V5IGZsb3dfa2V5LCB1aW50MzJfdCBwb25faWYsIGJhbF91dGlsX29wZXJfZmxvdyBvcF90eXBlKQoreworICAgIF9tYWNfdXRpbF9yZXBvcnRfZmxvd19zZXRfaW5kaWNhdGlvbihmbG93X2tleSwgcG9uX2lmLCBvcF90eXBlLCBCQ01fRVJSX09LKTsKK30KKworLyoqIEBicmllZiBXcmFwcGVyIHJvdXRpbmUgdG8gTm90aWZ5IGNvcmUgZmxvdyBGU00gdGhhdCBmbG93IFJlbW92ZSBmYWlsZWQsIGJhc2VkIG9uIHJlc3VsdCBpbiBpbmRpY2F0aW9uIG1zZyBmcm9tIE1hcGxlICovCit2b2lkIG1hY191dGlsX3JlcG9ydF9mbG93X3JlbW92ZV9mYWlsZWQoYmNtYmFsX2Zsb3dfa2V5IGZsb3dfa2V5LCB1aW50MzJfdCBwb25faWYsIGJhbF91dGlsX29wZXJfZmxvdyBvcF90eXBlLCBiY21vc19lcnJubyBlcnIpCit7CisgICAgX21hY191dGlsX3JlcG9ydF9mbG93X3NldF9pbmRpY2F0aW9uKGZsb3dfa2V5LCBwb25faWYsIG9wX3R5cGUsIGVycik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9pbmZvX3ZhbGlkYXRlCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gdmFsaWRhdGUgYWxsIGlucHV0IGF0dHJpYnV0ZXMgcmVxdWlyZWQgZm9yIGFuIGFjYyB0ZXJtCisgKiBzZXR0aW5nIHJlY2VpdmVkIGZyb20gdGhlIGNvcmUuCisgKgorICogQHBhcmFtIHBfYWNjX3Rlcm1fcmVxICAgICAgICAgdGhlIGFjYyB0ZXJtIHJlcXVlc3QgaW5mbworICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX2luZm9fdmFsaWRhdGUoY29uc3QgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmcgKnBfYWNjX3Rlcm1fcmVxKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmIChCQ01PU19UUlVFICE9IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9hY2NfdGVybV9yZXEsIGFjY2Vzc190ZXJtaW5hbCwgaXdmX21vZGUpKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhpcyBpcyBhbiBlcnJvciBiZWNhdXNlIHRoZSBpd2YgbW9kZSBpcyBpbXBsaWNpdGx5IHNldCBieSB0aGUgY29yZSwgYmFzZWQKKyAgICAgICAgICogZWl0aGVyIG9uIGEgcGFyYW1ldGVyIGluIHRoZSBiYWxfY29uZmlnLnR4dCBmaWxlLCBvciBpdCBpcyBhc3NpZ25lZCBhCisgICAgICAgICAqIGRlZmF1bHQgdmFsdWUuIEVpdGhlciB3YXksIHRoaXMgcHJvcGVydHkgbXVzdCBiZSBzZXQgd2hlbiB0aGlzIGNvZGUKKyAgICAgICAgICogZXhlY3V0ZXMuCisgICAgICAgICAqLworICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgY2hlY2tfc2VuZF9mbG93X2JhbF9pbmRfbXNnCisgKiB0aGUgcm91dGluZSBjaGVja3MgdGhlIGluZGljYXRpb24gc3RhdHVzIG9mIGEgc3BlY2lmaWMgZ2l2ZW4gZmxvdywgd2hpY2ggaXRzIGVudHJ5IHdhcyBqdXN0IHVwZGF0ZWQKKyAqIEFzIGZsb3dzIG1heSBiZSAnd2FpdGluZycgZm9yIGEgc2luZ2xlIG9mIGZldyBtYXBsZSBnZW0gcG9ydCBjb25maWd1cmF0aW9uIGNvbXBsZXRlIGluZGljYXRpb25zCisgKiBiZWZvcmUgYW4gaW5kaWNhdGlvbiBvZiBjb21wbGV0ZSBmbG93IHNldHVwIGNhbiBiZSBpbmRpY2F0ZWQgdG8gYmFsX2NvcmUKKyAqCisgKiBAbm90ZSB0aGlzIHNlbmQgcm91dGluZSBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzY2VuYXJpbyBtdWx0aXBsZSBmbG93cyBwZXIgR0VNL0FsbG9jIElkLgorICoKKyAqIEB0b2RvIHRoaXMgcm91dGluZSBjdXJyZW50bHkgYXNzdW1lcyBqdXN0IGZsb3cgYWRkLiBUaGlzIHNob3VsZCBoYW5kbGUgYSBmbG93IFJlbW92ZSBjYXNlIHRvbworICoKKyAqIEBwYXJhbSBwX2Zsb3cgICAgICAtIGZsb3cgaW5zdGFuY2UgcG9pbnRlciBmcm9tIG1hYyB1dGlsIERCCisgKiBAcGFyYW0gZXJyICAgICAgICAgLSByZW1vdGUgZXJyb3IgaW4gbXNnIGZyb20gTWFwbGUKKyAqIEBwYXJhbSBpbmRfcmVzdWx0ICAtIHRoZSBzdGF0dXMoQkNNT0xUX1JFU1VMVF9TVUNDRVNTL0JDTU9MVF9SRVNVTFRfRkFJTCkgb2YgaW5kaWNhdGlvbiBmcm9tIE1hcGxlCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBjaGVja19zZW5kX2Zsb3dfYmFsX2luZF9tc2cgKGZsb3dfbGlzdF9lbnRyeSAqcF9mbG93LCBiY21vc19lcnJubyBlcnIsIGJjbW9sdF9yZXN1bHQgaW5kX3Jlc3VsdCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb3NfYm9vbCBzZW5kX2luZCA9IEJDTU9TX1RSVUU7CisKKyAgICAvKiBmb3IgYSBkcyBmbG93LCBpbmRpY2F0aW9uIHNob3VsZCBiZSBzZW50IG9ubHkgaWYgYWxsIGNvbnN0cmFpbnRzIGZ1bGZpbGxlZDoKKyAgICAgICBpbmRpY2F0aW9uIHdhcyBub3Qgc2VudCB5ZXQKKyAgICAgICBmbG93IGNvbmZpZ3VyYXRpb24gY29tcGxldGVkIC0gYWxsIHJlbGF0ZWQgZ2VtIHBvcnRzIHdlcmUgY29uZmlndXJlZCB0byBtYXBsZQorICAgICAgIGFsbCByZWxhdGVkIGdlbSBwb3J0cyBjb25maWd1cmF0aW9uIGNvbXBsZXRlIGluZGljYXRpb24gd2VyZSByZWNlaXZlZCBmcm9tIGRldmljZQorICAgICAgICovCisgICAgaWYgKE5VTEwgPT0gcF9mbG93KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLCAiJXM6IE5VTEwgZmxvdyBwYXNzZWQgaW46IGZsb3dcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChCQ01PU19GQUxTRSA9PSBwX2Zsb3ctPmlzX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkCisgICAgICAgICAgICB8fCBCQ01PU19UUlVFID09IHBfZmxvdy0+aXNfd2FpdGluZ19mb3Jfc3ZjX3BvcnRfYWN0aXZlCisgICAgICAgICAgICB8fCBCQUxfVVRJTF9GTE9XX0lORF9TRU5EX05PTkUgIT0gcF9mbG93LT5pbmRfc2VudCkKKyAgICAgICAgeworICAgICAgICAgICAgIHNlbmRfaW5kID0gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLy9lbHNlIGFsbCBjb25kaXRpb25zIHNhdGlzZmllZCBmb3Igc2VuZGluZyBhbiBpbmRpY2F0aW9uIHVwIHRvIENvcmUuCisgICAgfQorCisgICAgaWYgKChCQ01fRVJSX09LID09IGVycikgJiYgKEJDTU9MVF9SRVNVTFRfU1VDQ0VTUyAhPSBpbmRfcmVzdWx0KSkKKyAgICB7CisgICAgICAgIGVyciA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorCisgICAgaWYgKEJDTU9TX1RSVUUgPT0gc2VuZF9pbmQpCisgICAgeworICAgICAgICBzd2l0Y2ggKHBfZmxvdy0+b3BfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQUxfVVRJTF9PUEVSX0ZMT1dfQUREOgorICAgICAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJlcG9ydCBmbG93IGZhaWxlZCB0byBDb3JlOyBJdCBpcyB1cHRvIHRoZSBjb3JlIHRvIGNsZWFudXAgdGhlIGZsb3dzICovCisKKyAgICAgICAgICAgICAgICAgICAgcF9mbG93LT5pbmRfc2VudCA9IEJBTF9VVElMX0ZMT1dfSU5EX1NFTkRfRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfYWRkX2ZhaWxlZChwX2Zsb3ctPmJhbF9mbG93X2tleSwgcF9mbG93LT5pZl9pZCwgZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBwX2Zsb3ctPmluZF9zZW50ID0gQkFMX1VUSUxfRkxPV19JTkRfU0VORF9TVUNDRVNTOworICAgICAgICAgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfZmxvd19hZGRfc3VjY2VzcyhwX2Zsb3ctPmJhbF9mbG93X2tleSwgcF9mbG93LT5pZl9pZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQkFMX1VUSUxfT1BFUl9GTE9XX1JFTU9WRToKKyAgICAgICAgICAgIGNhc2UgQkFMX1VUSUxfT1BFUl9GTE9XX0NMRUFSOgorICAgICAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJlcG9ydCBmbG93IGZhaWxlZCB0byBDb3JlOyBJdCBpcyB1cHRvIHRoZSBjb3JlIHRvIGNsZWFudXAgdGhlIGZsb3dzICovCisKKyAgICAgICAgICAgICAgICAgICAgcF9mbG93LT5pbmRfc2VudCA9IEJBTF9VVElMX0ZMT1dfSU5EX1NFTkRfRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfcmVtb3ZlX2ZhaWxlZChwX2Zsb3ctPmJhbF9mbG93X2tleSwgcF9mbG93LT5pZl9pZCwgcF9mbG93LT5vcF90eXBlLCBlcnIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIHBfZmxvdy0+aW5kX3NlbnQgPSBCQUxfVVRJTF9GTE9XX0lORF9TRU5EX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgICAgIG1hY191dGlsX3JlcG9ydF9mbG93X3JlbW92ZV9zdWNjZXNzKHBfZmxvdy0+YmFsX2Zsb3dfa2V5LCBwX2Zsb3ctPmlmX2lkLCBwX2Zsb3ctPm9wX3R5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIE9uZSBtb3JlIHN0ZXAgZm9yIEZsb3cgUmVtb3ZlOiByZW1vdmUgZnJvbSBEQiAmIEZyZWUgdGhlIGZsb3cgKi8KKyAgICAgICAgICAgICAgICBfbWFjX3V0aWxfZGJfZmxvd19yZW1vdmUgKHBfZmxvdy0+aWZfaWQsIHBfZmxvdyk7CisgICAgICAgICAgICAgICAgX21hY191dGlsX2RiX2Zsb3dfZnJlZSAocF9mbG93LT5pZl9pZCwgcF9mbG93KTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiBtYWNfdXRpbF9pbmRpY2F0aW9uX2NiCisgKiB0aGlzIHJvdXRpbmUgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgcmVnaXN0ZXJlZCBieSBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZXJfcmVnaXN0ZXIoKQorICogdG8gaGFuZGxlIGFueSBpbmRpY2F0aW9ucyBjb21pbmcgZnJvbSBtYXBsZSBkZXZpY2UKKyAqIHRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgZGV2aWNlIHRvd2FyZHMgbWFjX3V0aWwvYmFsCisgKgorICogQHBhcmFtIGRldmljZV9pZCB0aGUgbWFwbGUgZGV2aWNlIGlkIGdlbmVyYXRpbmcgdGhlIGN1cnJlbnQgaW5kaWNhdGlvbgorICogQHBhcmFtIHBfbXNnIHBvaW50ZXIgdG8gdGhlIG1hcGxlIGluZGljYXRpb24gbWVzc2FnZQorICoKKyAqIEByZXR1cm4gdm9pZAorICoKKyAqIEB0b2RvICBOb3RlIHRoYXQgdGhlIHBvbiBpbnRlcmZhY2UgaW4gQXV0byBJbmRpY2F0aW9uIG1zZ3MgZnJvbSBNYXBsZSBpcyBhIHBoeXNpY2FsIGludGVyZmFjZQorICogb24gYSBkZXZpY2UuIFRoZSBQT04gaW50ZXJmYWNlIHRoYXQgaXMgdXNlZCBieSBDb3JlIGluIGl0J3MgcmVxdWVzdHMgdG8gTUFDIFV0aWwsCisgKiBhbmQgc3RvcmVkIGluIGxvY2FsIERCcyB3aWxsIGJlIGxvZ2ljYWwgaW50ZXJmYWNlLgorICogU28gdGhlIHJ1bGUgb2YgdGh1bWIgd291bGQgYmUgYW55dGhpbmcgY29taW5nIGZyb20gTWFwbGUgc2lkZSwgdHJhbnNsYXRlIChkZXZpY2UgKyBwaHlzaWNhbCBJbnRlcmZhY2UpCisgKiB0byBMb2dpY2FsIGludGVyZmFjZSBhbmQgdXNlIGZvciBsb2dnaW5nLCBpbnRlcm5hbCBEQiBhY2Nlc3MgZXRjLgorICovCit2b2lkIG1hY191dGlsX2luZGljYXRpb25fY2IoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgc3dpdGNoIChwX21zZy0+b2JqX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVWSUNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVfZm9yX2RldmljZSAoZGV2aWNlX2lkLCBwX21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9OSToKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fT05VOgorICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBtYWNfdXRpbF9oYW5kbGVfYWxsX29sdF9pbmRfZm9yX2dwb24gKGRldmljZV9pZCwgcF9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX05JOgorICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fT05VOgorICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0M6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbWFjX3V0aWxfaGFuZGxlX2FsbF9vbHRfaW5kX2Zvcl94Z3BvbiAoZGV2aWNlX2lkLCBwX21zZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9tYWNfdXRpbCwgIlVuaGFuZGxlZCBtZXNzYWdlIGluZGljYXRpb24gZm9yIG9iaiB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgIHBfbXNnLT5vYmpfdHlwZSk7CisKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLCAiRXJyb3IgaGFuZGxpbmcgQXV0byBJbmRpY2F0aW9uIGZyb20gTWFwbGUgZm9yIG9iaiB0eXBlICVkXG4iLCBwX21zZy0+b2JqX3R5cGUpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworCisKKy8qKgorICogQGJyaWVmIGdldCBzdHJpbmcgZm9yIHRoZSBpbmRpY2F0aW9uIG9iamVjdCB0eXBlIGZvciBkZXZpY2UKKyAqLworc3RhdGljIGNoYXIgKm1hY191dGlsX2luZGljYXRpb25fZ2V0X29ial90eXBlX3N0cl9mb3JfZGV2aWNlIChiY21vbHRfb2JqX2lkIG9ial90eXBlKQoreworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGk9MDsgaSA8IEJDTV9TSVpFT0ZBUlJBWShtYWNfdXRpbF9kZXZpY2VfaW5kX2hhbmRsZXJzKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKG9ial90eXBlID09IG1hY191dGlsX2RldmljZV9pbmRfaGFuZGxlcnNbaV0ub2JqX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtYWNfdXRpbF9kZXZpY2VfaW5kX2hhbmRsZXJzW2ldLm9ial90eXBlX3N0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAiVW5oYW5kbGVkIjsKK30KKworLyoqCisgKiBAYnJpZWYgY2hlY2sgaWYgbWFjIHV0aWwgc2hvdWxkIHJlcG9ydCBhY2Nlc3MgdGVybWluYWwgY29ubmVjdCBldmVudCB0byBjb3JlLgorICogZXZlbnQgd2lsbCBiZSBzZW50IG9ubHkgd2hlbiBhbGwgZGV2aWNlcyBhcmUgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseQorICAqCisgKiBAcmV0dXJuIGJjbW9zX2Jvb2wKKyAqLworCitzdGF0aWMgYmNtb3NfYm9vbCBtYWNfdXRpbF9jaGVja19hY2NfdGVybV9yZXBvcnRfZXZlbnQgKHZvaWQpCit7CisKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworCisgICAgQkNNX1RPUE9fRk9SX0VBQ0hfREVWKGRldmljZV9pZCkKKyAgICB7CisgICAgICAgIGlmICghYWNjX3Rlcm1fY29ubmVjdGl2aXR5LmRldmljZXNbZGV2aWNlX2lkXS5pc19jb25uZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqCisgKiBAYnJpZWYgSGFuZGxlciBmdW5jdGlvbiBmb3IgTWFwbGUgYXV0byBpbmRpY2F0aW9ucyBmb3IgYSBPTFQgRGV2aWNlCisgKgorICogQHBhcmFtIGRldmljZV9pZCB0aGUgbWFwbGUgZGV2aWNlIGlkIGdlbmVyYXRpbmcgdGhlIGN1cnJlbnQgaW5kaWNhdGlvbgorICogQHBhcmFtIHBfbXNnIHBvaW50ZXIgdG8gdGhlIG1hcGxlIGluZGljYXRpb24gbWVzc2FnZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hY191dGlsX2luZGljYXRpb25faGFuZGxlX2Zvcl9kZXZpY2UgKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9tc2cgKnBfbXNnKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9tYWNfdXRpbCwKKyAgICAgICAgIm1hY191dGlsX2luZGljYXRpb25fY2IgcmVjZWl2ZWQgaW5kaWNhdGlvbiBvYmo9JWQvJXMgZ3JvdXA9JWQgc3ViZ3JvdXA9JWRcbiIsCisgICAgICAgIHBfbXNnLT5vYmpfdHlwZSwgbWFjX3V0aWxfaW5kaWNhdGlvbl9nZXRfb2JqX3R5cGVfc3RyX2Zvcl9kZXZpY2UocF9tc2ctPm9ial90eXBlKSwKKyAgICAgICAgcF9tc2ctPmdyb3VwLCBwX21zZy0+c3ViZ3JvdXApOworCisgICAgaWYgKEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0NPTVBMRVRFID09IHBfbXNnLT5zdWJncm91cCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX21hY191dGlsLCAiRGV2aWNlICV1IGlzIHJlYWR5LlxuIiwgZGV2aWNlX2lkKTsKKworICAgICAgICBhY2NfdGVybV9jb25uZWN0aXZpdHkuZGV2aWNlc1tkZXZpY2VfaWRdLmlzX2Nvbm5lY3RlZCA9IEJDTU9TX1RSVUU7CisKKyAgICAgICAgaWYgKG1hY191dGlsX2NoZWNrX2FjY190ZXJtX3JlcG9ydF9ldmVudCgpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFjX3V0aWxfcmVwb3J0X2FjY190ZXJtX2V2ZW50KHBfbXNnLT5zdWJncm91cCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFjX3V0aWxfYmFsX3JlcV9oYW5kbGVyc19mb3Jfc3lzdGVtX21vZGVbYWNjX3Rlcm1fY29ubmVjdGl2aXR5LmRldmljZXNbZGV2aWNlX2lkXS5zeXN0ZW1fbW9kZV0uYWNjX3Rlcm1fcG9zdF9pbmRpY2F0aW9uX3NldCkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtYWNfdXRpbF9iYWxfcmVxX2hhbmRsZXJzX2Zvcl9zeXN0ZW1fbW9kZVthY2NfdGVybV9jb25uZWN0aXZpdHkuZGV2aWNlc1tkZXZpY2VfaWRdLnN5c3RlbV9tb2RlXS5hY2NfdGVybV9wb3N0X2luZGljYXRpb25fc2V0KGRldmljZV9pZCk7CisgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsICIlczogcG9zdCBpbmRpY2F0aW9uIHNldCBGQUlMRUQ6IHJjID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRkFJTFVSRSA9PSBwX21zZy0+c3ViZ3JvdXApCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9tYWNfdXRpbCwgIkRldmljZSAldSBjb25uZWN0aW9uIGZhaWxlZC5cbiIsIGRldmljZV9pZCk7CisgICAgICAgIGlmKCFhY2NfdGVybV9jb25uZWN0aXZpdHkuZmFpbF9yZXBvcnRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgbWFjX3V0aWxfcmVwb3J0X2FjY190ZXJtX2V2ZW50KHBfbXNnLT5zdWJncm91cCk7CisgICAgICAgIH0KKyAgICAgICAgYWNjX3Rlcm1fY29ubmVjdGl2aXR5LmZhaWxfcmVwb3J0ZWQgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiAgQ29tbW9uIHJvdXRpbmUgdG8gZ2V0IHN0cmluZyBvZiBpbmRpY2F0aW9uIG9iamVjdAorICoKKyAqIEBwYXJhbSBvYmpfdHlwZSAgICAgICAgICAgICAgICAgICAgICBvYmogdHlwZSB0byBnZXQgc3RyaW5nIGZvcgorICogQHBhcmFtIG9ial90eXBlc19hbmRfaGFuZGxlcnMgICAgICAgIG9iaiB0eXBlcyBhcnJheQorICogQHBhcmFtIG51bV9vYmpfdHlwZXMgICAgICAgICAgICAgICAgIG51bSBvYmogdHlwZXMKKyAqCisgKiBAcmV0dXJuIGNoYXIqCisgKi8KK2NoYXIgKl9tYWNfdXRpbF9nZXRfb2JqX3R5cGVfc3RyX2Zvcl9pbmRpY2F0aW9ucyAoIGJjbW9sdF9vYmpfaWQgb2JqX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNfdXRpbF9pbmRfb2JqX2FuZF9oYW5kbGVycyBvYmpfdHlwZXNfYW5kX2hhbmRsZXJzW10sIHVpbnQxNl90IG51bV9vYmpfdHlwZXMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX29ial90eXBlczsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKG9ial90eXBlID09IG9ial90eXBlc19hbmRfaGFuZGxlcnNbaV0ub2JqX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvYmpfdHlwZXNfYW5kX2hhbmRsZXJzW2ldLm9ial90eXBlX3N0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAiVW5oYW5kbGVkIjsKK30KKworCisvKioKKyAqIEBicmllZiAgQ29tbW9uIHJvdXRpbmUgdG8gcmVnaXN0ZXIgZm9yIE1hcGxlIGF1dG8gaW5kaWNhdGlvbnMKKyAqCisgKiBAcGFyYW0gcF9yeF9jZmcgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciBjb25maWcgc3RydWN0dXJlCisgKiBAcGFyYW0gb2JqX3R5cGVzX2FuZF9oYW5kbGVycyAgICAgICAgb2JqIHR5cGVzIHRvIHN1YnNjcmliZQorICogQHBhcmFtIG51bV9vYmpfdHlwZXMgICAgICAgICAgICAgICAgIG51bSBvYmogdHlwZXMKKyAqIEBwYXJhbSBkZXZpY2VfaWQgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgZGV2aWNlIGlkIChmb3IgbXVsdGlwbGUgZGV2aWNlcyBzdXBwb3J0KQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqCisgKiBAdG9kbyB3aXRoIG11bHRpcGxlIGRldmljZXMgaW4gZnV0dXJlIHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBvbiBwZXIgZGV2aWNlIGJhc2lzIGFuZCBiYXNlZCBvbiBlcG9uIG9yIGdwb24gbW9kZQorICovCitiY21vc19lcnJubyBfbWFjX3V0aWxfcmVnaXN0ZXJfZm9yX2F1dG9faW5kaWNhdGlvbnMgKHN0cnVjdCBiY21vbHRfcnhfY2ZnICpwX3J4X2NmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNfdXRpbF9pbmRfb2JqX2FuZF9oYW5kbGVycyBvYmpfdHlwZXNfYW5kX2hhbmRsZXJzW10sIHVpbnQxNl90IG51bV9vYmpfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX29ial90eXBlczsgaSsrKQorICAgIHsKKyAgICAgICAgLyogc2V0IHRvIHNwZWNpZmljIGF1dG8gaW5kaWNhdGlvbiBvYmplY3QgdHlwZSAqLworICAgICAgICBwX3J4X2NmZy0+b2JqX3R5cGUgPSBvYmpfdHlwZXNfYW5kX2hhbmRsZXJzW2ldLm9ial90eXBlOworICAgICAgICByYyA9IGJjbW9sdF9hdXRvX3J4X2NiX3NldChkZXZpY2VfaWQsIHBfcnhfY2ZnKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qKgorICogQGJyaWVmICBNYXBsZSBhdXRvIGluZGljYXRpb24gcmVnaXN0ZXIgZm9yIHNwZWNpZmljIGRldmljZSBiYXNlZCBpbmRpY2F0aW9ucworICoKKyAqIEBwYXJhbSBwX3J4X2NmZyAgICAgICAgICAgaGFuZGxlciBjb25maWcgc3RydWN0dXJlCisgICpAcGFyYW0gIGRldmljZV9pZCAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBkZXZpY2UgaWQgKGZvciBtdWx0aXBsZSBkZXZpY2VzIHN1cHBvcnQpCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitiY21vc19lcnJubyBtYWNfdXRpbF9yZWdpc3Rlcl9mb3JfZGV2aWNlX2F1dG9faW5kaWNhdGlvbnMgKHN0cnVjdCBiY21vbHRfcnhfY2ZnICpwX3J4X2NmZywgYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICByZXR1cm4gX21hY191dGlsX3JlZ2lzdGVyX2Zvcl9hdXRvX2luZGljYXRpb25zIChwX3J4X2NmZywgbWFjX3V0aWxfZGV2aWNlX2luZF9oYW5kbGVycywgQkNNX1NJWkVPRkFSUkFZKG1hY191dGlsX2RldmljZV9pbmRfaGFuZGxlcnMpLGRldmljZV9pZCk7Cit9CisKKworLyoqCisgKiBAYnJpZWYgbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVyX3JlZ2lzdGVyCisgKiB0aGlzIGxvY2FsIHJvdXRpbmUgcmVnaXN0ZXJzIHRoZSBsb2NhbCBmdW5jdGlvbiAnbWFjX3V0aWxfaW5kaWNhdGlvbl9jYicKKyAqIGFzIHRoZSBjYWxsYmFjayBmb3IgYW55IGluZGljYXRpb25zIGNvbWluZyBmcm9tIG1hcGxlIGRldmljZQorICoKKyAgKkBwYXJhbSAgZGV2aWNlX2lkICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGRldmljZSBpZCAoZm9yIG11bHRpcGxlIGRldmljZXMgc3VwcG9ydCkKKyAgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVyX3JlZ2lzdGVyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgc3RydWN0IGJjbW9sdF9yeF9jZmcgcnhfY2ZnID0KKyAgICB7CisgICAgICAgIC5vYmpfdHlwZSA9IEJDTU9MVF9PQkpFQ1RfQU5ZLAorICAgICAgICAucnhfY2IgPSBnX2luZGljYXRpb25faGFuZGxlciwKKyAgICAgICAgLmZsYWdzID0gQkNNT0xUX0FVVE9fRkxBR1NfRElTUEFUQ0gsCisgICAgICAgIC5tb2R1bGUgPSBCQ01PU19NT0RVTEVfSURfV09SS0VSX01HTVQsCisgICAgICAgIC5wb25fbmlfbWFzayA9IDAgIC8qKiBCaXRtYXNrIG9mIHBvbl9uaSBpbnRlcmZhY2VzIHRoZSByZWdpc3RyYXRpb24gYXBwbGllcyB0by4gIDA9YWxsIGludGVyZmFjZXMuICovCisgICAgfTsKKworCisgICAgcmMgPSAgbWFjX3V0aWxfcmVnaXN0ZXJfZm9yX2RldmljZV9hdXRvX2luZGljYXRpb25zKCZyeF9jZmcsIGRldmljZV9pZCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmMgPSAgbWFjX3V0aWxfcmVnaXN0ZXJfZm9yX2dwb25fYXV0b19pbmRpY2F0aW9ucygmcnhfY2ZnLCBkZXZpY2VfaWQpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJjID0gIG1hY191dGlsX3JlZ2lzdGVyX2Zvcl94Z3Bvbl9hdXRvX2luZGljYXRpb25zKCZyeF9jZmcsIGRldmljZV9pZCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyoqCisgKiBAYnJpZWYgcmVzZXQgbWFjX3V0aWwgYWNjZXNzIHRlcm1pbmFsIGludGVybmFsIGRiCisgKiBhbGwgZGV2aWNlcyBtYXJrZWQgYXMgZGlzY29ubmVjdGVkCisgKi8KKworc3RhdGljIHZvaWQgbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3Jlc2V0ICh2b2lkKQoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisKKyAgICBCQ01fVE9QT19GT1JfRUFDSF9ERVYoZGV2aWNlX2lkKQorICAgIHsKKyAgICAgICAgYWNjX3Rlcm1fY29ubmVjdGl2aXR5LmRldmljZXNbZGV2aWNlX2lkXS5pc19jb25uZWN0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBhY2NfdGVybV9jb25uZWN0aXZpdHkuZmFpbF9yZXBvcnRlZCA9IEJDTU9TX0ZBTFNFOworfQorCisvKioKKyAqIEBicmllZiByZXNldCBhIHNpbmdsZSBtYXBsZSBkZXZpY2UKKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIHRoZSBtYXBsZSBkZXZpY2UgaWQgdG8gYmUgcmVzZXQKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KKworc3RhdGljIGJjbW9zX2Vycm5vIHJlc2V0X2RldmljZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0ge307CisgICAgYmNtb2x0X2RldmljZV9yZXNldCBvcGVyOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCByZXNldCwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCByZXNldCwgbW9kZSwgQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0RFVklDRSk7CisKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCAsICZvcGVyLmhkcik7Cit9CisKKy8qKgorICAqIEBicmllZiAgY29tbW9uIGNvbmZpZyBhY3Jvc3MgbWFjIG1vZGVzIGR1cmluZyBhY2Nlc3MgdGVybWluYWwgc2V0LgorICAqIGN1cnJlbnRseSBvbmx5IHRoZSBhZG1pbiB1cCBjYXNlIGlzIHN1cHBvcnRlZCAob3BfdHlwZSBpcyBpZ25vcmVkKSkKKyAgKiBAbm90ZSAgIHRoaXMgaXMgY2FsbGVkIGZyb20gaW5kaXZpZHVhbCBtYWMgaGFuZGxlciBmaWxlcyByYXRoZXIgdGhhbiBjYWxsaW5nIHVwZnJvbnQgaGVyZSBpbiB0aGlzIGZpbGUKKyAgKiAgICAgICAgIGluIGFjY2Vzc190ZXJtaW5hbF9zZXQoKSwgYmVjYXVzZSB0aGlzIGlzIG5vdCB0byBiZSBjYWxsZWQgZm9yIGxvb3BiYWNrIG1vZGUuCisgICoKKyAgKgorICAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAgKi8KKworYmNtb3NfZXJybm8gbWFwbGVfYWNjZXNzX3Rlcm1pbmFsX3NldF9jb21tb24gKGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSwgYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKworICAgIHJjID0gcmVzZXRfZGV2aWNlKGRldmljZV9pZCk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsICJGYWlsZWQgdG8gcmVzZXQgZGV2aWNlICVkICglcylcbiIsIGRldmljZV9pZCwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICAvKiBCZWNhdXNlIHRoZXJlIGlzIG5vIGluZGljYXRpb24gY29taW5nIGZyb20gTWFwbGUgdGhhdCBkZXZpY2UgcmVzZXQgaXMgY29tcGxldGUsIHdlIHNob3VsZCBzbGVlcCBoZXJlLiAxIHNlY29uZCBzaG91bGQgYmUgZW5vdWdoLiAqLworICAgIGJjbW9zX3VzbGVlcCgxMDAwMDAwKTsKKworICAgIC8qIHJlZ2lzdGVyIGZvciBtYXBsZSBpbmRpY2F0aW9ucyAtIGRvaW5nIGl0IGFmdGVyIHJlc2V0IHRvIGF2b2lkIGNhdGNoaW5nIHN0YWxlIGluZGljYXRpb25zICovCisgICAgcmMgPSBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZXJfcmVnaXN0ZXIoZGV2aWNlX2lkKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwgIkZhaWxlZCB0byByZWdpc3RlciBmb3IgZGV2aWNlICVkIGluZGljYXRpb25zICglcylcbiIsIGRldmljZV9pZCwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICAvKiB1c2luZyAxIHNlY29uZCBkZWxheSBiZXR3ZWVuIHRoZSBpbmRpY2F0aW9uIHJlZ2lzdHJhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBzZXR1cAorICAgICAgIHRvIGxldCB0aGUgbWFwbGUgcHJveHkgcXVldWUgZ2V0IGVtcHR5ICovCisgICAgYmNtb3NfdXNsZWVwKDEwMDAwMDApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIG1hcGxlX2FjY2Vzc190ZXJtaW5hbF9jb25uZWN0X2NvbW1vbiAoYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZGV2aWNlX2Nvbm5lY3QgZGV2X2Nvbm5lY3Rfb3BlcjsKKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7fTsKKworICAgIC8qIGludm9raW5nIHRoZSBjb25uZWN0IG9wZXJhdGlvbiAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJmRldl9jb25uZWN0X29wZXIsIGRldmljZSwgY29ubmVjdCwga2V5KTsKKworICAgIHJjID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJmRldl9jb25uZWN0X29wZXIuaGRyKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwgIkZhaWxlZCB0byBzdWJtaXQgY29ubmVjdCBvcGVyYXRpb24gZm9yIGRldmljZSAlZCAoJXMpLCBlcnJfdGV4dCA9ICVzXG4iLAorICAgICAgICAgICAgZGV2aWNlX2lkLCBiY21vc19zdHJlcnJvcihyYyksIGRldl9jb25uZWN0X29wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBEZXJpdmUgYSBzcGVjaWZpYyBkZXZpY2Ugc3lzdGVtIG1vZGUgZnJvbSB0b3BvbG9neSBhbmQgc3RvcmUgaXQgYXQgdGhlIGludGVybmFsIGRiKi8KK3N0YXRpYyBiY21vc19lcnJubyBtYWNfdXRpbF9zeXN0ZW1fbW9kZV9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICB1aW50MzJfdCBsb2dpY2FsX3BvbjsKKyAgICB1aW50MzJfdCBwb25fbW9kZTJtYXhfcGh5c2ljYWxfcG9uc1tCQ01fVE9QT19QT05fTU9ERV9fTlVNX09GXSA9IHt9OworCisgICAgQkNNX1RPUE9fREVWX0ZPUl9FQUNIX1BPTihkZXZpY2VfaWQsIGxvZ2ljYWxfcG9uKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgcGh5c2ljYWxfcG9uOworICAgICAgICBiY21fdG9wb19wb25fbW9kZSBwb25fbW9kZTsKKworICAgICAgICBwb25fbW9kZSA9IGJjbV90b3BvX3Bvbl9nZXRfcG9uX21vZGUobG9naWNhbF9wb24pOworICAgICAgICBiY21fdG9wb19wb25fZ2V0X2xvZ2ljYWwycGh5c2ljYWwobG9naWNhbF9wb24sICZkZXZpY2VfaWQsICZwaHlzaWNhbF9wb24pOworICAgICAgICAvKiBHZXQgdGhlIG51bWJlciBvZiBwaHlzaWNhbCBQT05zIG1hcHBlZC4KKyAgICAgICAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSB1c2VyIG1hcHBlZCBvbmx5IDQgcGh5c2ljYWwgUE9OcyBvdXQgb2YgMTYgaW4gR1BPTiBtb2RlLCBhbmQgdGhlIG1heGltdW0gcGh5c2ljYWwgUE9OIG1hcHBlZCB3YXMgMTEsIHRoZW4gdGhlIHN5c3RlbSBtb2RlIHNob3VsZCBiZSBHUE9OeDE2LCBub3QgR1BPTng4LiAqLworICAgICAgICBwb25fbW9kZTJtYXhfcGh5c2ljYWxfcG9uc1twb25fbW9kZV0gPSBNQVgocG9uX21vZGUybWF4X3BoeXNpY2FsX3BvbnNbcG9uX21vZGVdLCBwaHlzaWNhbF9wb24gKyAxKTsKKworICAgIH0KKworICAgIGlmIChiY21iYWxfaXNfbWFjX2luX2xvb3BiYWNrKCkpCisgICAgICAgIGFjY190ZXJtX2Nvbm5lY3Rpdml0eS5kZXZpY2VzW2RldmljZV9pZF0uc3lzdGVtX21vZGUgPSBCQ01PTFRfU1lTVEVNX01PREVfTE9PUEJBQ0s7CisgICAgZWxzZSBpZiAocG9uX21vZGUybWF4X3BoeXNpY2FsX3BvbnNbQkNNX1RPUE9fUE9OX01PREVfR1BPTl0pCisgICAgeworICAgICAgICBpZiAocG9uX21vZGUybWF4X3BoeXNpY2FsX3BvbnNbQkNNX1RPUE9fUE9OX01PREVfR1BPTl0gPD0gOCkKKyAgICAgICAgICAgIGFjY190ZXJtX2Nvbm5lY3Rpdml0eS5kZXZpY2VzW2RldmljZV9pZF0uc3lzdGVtX21vZGUgPSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhY2NfdGVybV9jb25uZWN0aXZpdHkuZGV2aWNlc1tkZXZpY2VfaWRdLnN5c3RlbV9tb2RlID0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1g7CisgICAgfQorICAgIGVsc2UgaWYgKHBvbl9tb2RlMm1heF9waHlzaWNhbF9wb25zW0JDTV9UT1BPX1BPTl9NT0RFX1hHUE9OXSkKKyAgICAgICAgYWNjX3Rlcm1fY29ubmVjdGl2aXR5LmRldmljZXNbZGV2aWNlX2lkXS5zeXN0ZW1fbW9kZSA9IEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX184X1g7CisgICAgZWxzZSBpZiAocG9uX21vZGUybWF4X3BoeXNpY2FsX3BvbnNbQkNNX1RPUE9fUE9OX01PREVfWEdTXSkKKyAgICAgICAgYWNjX3Rlcm1fY29ubmVjdGl2aXR5LmRldmljZXNbZGV2aWNlX2lkXS5zeXN0ZW1fbW9kZSA9IEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HOworICAgIGVsc2UgaWYgKHBvbl9tb2RlMm1heF9waHlzaWNhbF9wb25zW0JDTV9UT1BPX1BPTl9NT0RFX0VQT05fVERNQV0pCisgICAgeworICAgICAgICBpZiAocG9uX21vZGUybWF4X3BoeXNpY2FsX3BvbnNbQkNNX1RPUE9fUE9OX01PREVfRVBPTl9URE1BXSA8PSA0KQorICAgICAgICAgICAgYWNjX3Rlcm1fY29ubmVjdGl2aXR5LmRldmljZXNbZGV2aWNlX2lkXS5zeXN0ZW1fbW9kZSA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWNjX3Rlcm1fY29ubmVjdGl2aXR5LmRldmljZXNbZGV2aWNlX2lkXS5zeXN0ZW1fbW9kZSA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQTsKKyAgICB9CisgICAgZWxzZSBpZiAocG9uX21vZGUybWF4X3BoeXNpY2FsX3BvbnNbQkNNX1RPUE9fUE9OX01PREVfRVBPTl8xR10pCisgICAgeworICAgICAgICBpZiAocG9uX21vZGUybWF4X3BoeXNpY2FsX3BvbnNbQkNNX1RPUE9fUE9OX01PREVfRVBPTl8xR10gPD0gNCkKKyAgICAgICAgICAgIGFjY190ZXJtX2Nvbm5lY3Rpdml0eS5kZXZpY2VzW2RldmljZV9pZF0uc3lzdGVtX21vZGUgPSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YOworICAgICAgICBlbHNlIGlmIChwb25fbW9kZTJtYXhfcGh5c2ljYWxfcG9uc1tCQ01fVE9QT19QT05fTU9ERV9FUE9OXzFHXSA8PSA4KQorICAgICAgICAgICAgYWNjX3Rlcm1fY29ubmVjdGl2aXR5LmRldmljZXNbZGV2aWNlX2lkXS5zeXN0ZW1fbW9kZSA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFjY190ZXJtX2Nvbm5lY3Rpdml0eS5kZXZpY2VzW2RldmljZV9pZF0uc3lzdGVtX21vZGUgPSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMTZfWDsKKyAgICB9CisgICAgZWxzZSBpZiAocG9uX21vZGUybWF4X3BoeXNpY2FsX3BvbnNbQkNNX1RPUE9fUE9OX01PREVfRVBPTl8xMEddKQorICAgIHsKKyAgICAgICAgaWYgKHBvbl9tb2RlMm1heF9waHlzaWNhbF9wb25zW0JDTV9UT1BPX1BPTl9NT0RFX0VQT05fMTBHXSA8PSAyKQorICAgICAgICAgICAgYWNjX3Rlcm1fY29ubmVjdGl2aXR5LmRldmljZXNbZGV2aWNlX2lkXS5zeXN0ZW1fbW9kZSA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18yX1hfMTBfRzsKKyAgICAgICAgZWxzZSBpZiAocG9uX21vZGUybWF4X3BoeXNpY2FsX3BvbnNbQkNNX1RPUE9fUE9OX01PREVfRVBPTl8xMEddIDw9IDQpCisgICAgICAgICAgICBhY2NfdGVybV9jb25uZWN0aXZpdHkuZGV2aWNlc1tkZXZpY2VfaWRdLnN5c3RlbV9tb2RlID0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhY2NfdGVybV9jb25uZWN0aXZpdHkuZGV2aWNlc1tkZXZpY2VfaWRdLnN5c3RlbV9tb2RlID0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HOworICAgIH0KKyAgICBlbHNlIGlmIChwb25fbW9kZTJtYXhfcGh5c2ljYWxfcG9uc1tCQ01fVE9QT19QT05fTU9ERV9MT09QQkFDS10pCisgICAgICAgIGFjY190ZXJtX2Nvbm5lY3Rpdml0eS5kZXZpY2VzW2RldmljZV9pZF0uc3lzdGVtX21vZGUgPSBCQ01PTFRfU1lTVEVNX01PREVfTE9PUEJBQ0s7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLCAiQ2Fubm90IGRldGVybWluZSBzeXN0ZW0gbW9kZSBmcm9tIHRvcG9sb2d5XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgQ29tbWFuZCBTZXQgc2V0dXAgcm91dGluZSBmb3IgYWNjZXNzIHRlcm1pbmFsIGNvbm5lY3QgdG8gdGhlIG1hYyBkZXZpY2VzCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBhY2NfdGVybV9mc20gaW4gdGhlIEJBTCBjb3JlLCBhdCBhbiBhZG1pbiB1cCBvcGVyYXRpb24KKyAqIGFuZCB3aWxsIHJlc3VsdCBpbiBzZXR0aW5nIGFuZCBjb25uZWN0aW5nIGFsbCB0aGUgYWNjZXNzIHRlcm1pbmFsIGRldmljZXMKKyAqCisgKiBAcGFyYW0gcF9hY2NfdGVybSAgIFBvaW50ZXIgdG8gYWNjZXNzIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gb3BfdHlwZSAgICAgT3BlcmF0aW9uIHR5cGUgb24gYWNjZXNzIHRlcm1pbmFsIGluc3RhbmNlCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICoKKyAqIEB0b2RvIHRoaXMgY29kZSB3aWxsIGNoYW5nZSB3aXRoIG11bHRpcGxlIGRldmljZXMKKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldChhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtLCBiYWxfdXRpbF9vcGVyX2FjY190ZXJtIG9wX3R5cGUpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgYmNtb3NfYm9vbCBpc193YWl0X2Zvcl9yZXBvcnQgPSBCQ01PU19GQUxTRTsKKworICAgIEJDTV9UT1BPX0ZPUl9FQUNIX0RFVihkZXZpY2VfaWQpCisgICAgeworICAgICAgICAvKndpbGwgcmVzZXQgYW5kIGNvbm5lY3QsIGluIGNhc2UgdGhlIGRldmljZSBpcyBub3QgYWxyZWFkeSBjb25uZWN0ZWQqLworICAgICAgICBpZiAoIWFjY190ZXJtX2Nvbm5lY3Rpdml0eS5kZXZpY2VzW2RldmljZV9pZF0uaXNfY29ubmVjdGVkKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBBZGQgdGltZW91dCBiZXR3ZWVuIGJyaW5naW5nIHVwIG1hcGxlIGRldmljZXMuCisgICAgICAgICAgICAgKiBPdGhlcndpc2UsIG1hcGxlIEFQSXMgY2FuIHRpbWUgb3V0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChpc193YWl0X2Zvcl9yZXBvcnQpCisgICAgICAgICAgICAgICAgYmNtb3NfdXNsZWVwKDEwMDAwMDAwKTsKKyAgICAgICAgICAgIGlzX3dhaXRfZm9yX3JlcG9ydCA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICAvKiBtYWMgbW9kZSBzcGVjaWZpYyBhY2MgdGVybSBzZXQgKi8KKyAgICAgICAgICAgIGlmIChtYWNfdXRpbF9iYWxfcmVxX2hhbmRsZXJzX2Zvcl9zeXN0ZW1fbW9kZVthY2NfdGVybV9jb25uZWN0aXZpdHkuZGV2aWNlc1tkZXZpY2VfaWRdLnN5c3RlbV9tb2RlXS5hY2NfdGVybV9zZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBtYWNfdXRpbF9iYWxfcmVxX2hhbmRsZXJzX2Zvcl9zeXN0ZW1fbW9kZVthY2NfdGVybV9jb25uZWN0aXZpdHkuZGV2aWNlc1tkZXZpY2VfaWRdLnN5c3RlbV9tb2RlXS5hY2NfdGVybV9zZXQocF9hY2NfdGVybSwgb3BfdHlwZSwgZGV2aWNlX2lkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLCAiJXM6IEZBSUxFRDogcmMgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWlzX3dhaXRfZm9yX3JlcG9ydCkKKyAgICB7CisgICAgICAgIG1hY191dGlsX3JlcG9ydF9hY2NfdGVybV9ldmVudChCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9DT01QTEVURSk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1pbnRlcmZhY2Ugc2V0IGhhbmRsaW5nLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbW1hbmQgU2V0IHNldHVwIHJvdXRpbmUgZm9yIGludGVyZmFjZSB1cCB0byBtYWMgYXBwbGljYXRpb24KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IGlmX2ZzbSBpbiB0aGUgQkFMIGNvcmUgdG8gaW5pdGlhbGl6ZSB0aGUgY29tbWFuZAorICogc2V0IHRvIHVwIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIG1hYyBhcHBsaWNhdGlvbi4gVGhlIGNtZHNldCBhY3R1YWxseQorICogY29uc2lzdHMgb2YgdHdvIGNvbW1hbmRzLCBvbmUgaXMgdG8gc2VuZCB0aGUgaWYgdXAgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBtYWMKKyAqIEFwcCBhbmQgaGFuZGxlIHRoZSByZWxldmFudCByZXNwb25zZSwgdGhlIG90aGVyIGlzIHRvIGhhbmRsZSB0aGUgaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBmcm9tIHRoZSBtYWMgQVBQIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuCisgKgorICogQHBhcmFtIHBfaW50ZXJmYWNlX2luc3QgICAgUG9pbnRlciB0byBpbnRlcmZhY2UgaW5zdGFuY2UKKyAqIEBwYXJhbSBvcF90eXBlICAgIE9wZXJhdGlvbiB0eXBlIG9uIGludGVyZmFjZSBpbnN0YW5jZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqCisgKiBAdG9kbyAgc3lzdGVtIG1vZGUgdG8gaWRlbnRpZnkgaGFuZGxlciBmdW5jdGlvbiBpcyBnbG9iYWwgYWNyb3NzIG9sdCBub3cuCisgKiAgICAgICAgVGhpcyBzaG91bGQgYmUgcXVlcmllZCBmb3IgcGVyIHBvbiBpbnRlcmZhY2UgYW5kIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHByb3RvY29sCisgKiAgICAgICAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRsZXIuCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2ludGVyZmFjZV9zZXQoYWNjX3Rlcm1faW50ZXJmYWNlICpwX2ludGVyZmFjZV9pbnN0LCBiYWxfdXRpbF9vcGVyX2lmIG9wX3R5cGUpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihOVUxMID09IHBfaW50ZXJmYWNlX2luc3QpOworCisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbWJhbF9pbnRlcmZhY2Vfa2V5IGludGZfa2V5ID0gcF9pbnRlcmZhY2VfaW5zdC0+YXBpX3JlcV9pbnRfb2JqX2luZm8ua2V5OworICAgIGJjbV90b3BvX3Bvbl9tb2RlIHBvbl9tb2RlOworCisgICAgIC8qIEZpcnN0IGNoZWNrIGlmIGl0IGlzIGZvciBQT04gaW50ZXJmYWNlLiBJZiBub3QgKGkuZS4gTk5JKSwgdGhlbiBqdXN0IHJldHVybiBhIHN1Y2Nlc3Mgd2l0aG91dAorICAgICAqIGZvcndhcmRpbmcgYW55dGhpbmcgdG8gTUFDIGhhcmR3YXJlLgorICAgICAqLworICAgIGlmIChCQ01CQUxfSU5URl9UWVBFX1BPTiAhPSBpbnRmX2tleS5pbnRmX3R5cGUpCisgICAgeworICAgICAgICBtYWNfdXRpbF9yZXBvcnRfaWZfZXZlbnQoaW50Zl9rZXkuaW50Zl9pZCwKKyAgICAgICAgICAgICAgICBpbnRmX2tleS5pbnRmX3R5cGUsCisgICAgICAgICAgICAgICAgQkNNX0VSUl9PSywgQkNNT0xUX1JFU1VMVF9TVUNDRVNTLAorICAgICAgICAgICAgICAgICgoQkFMX1VUSUxfT1BFUl9JRl9VUCA9PSBvcF90eXBlKSA/IEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkcgOiBCQ01PTFRfUE9OX1NUQVRFX0lOQUNUSVZFKSk7CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgQkNNX0xPRyhERUJVRywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGludGZfa2V5LmludGZfaWQpLAorICAgICAgICAgICAgIlNFVCBpZiAlcyAsIGludGZfdHlwZTogJXMsIGludGZfaWQ6ICVkXG4iLAorICAgICAgICAgICAgKEJBTF9VVElMX09QRVJfSUZfVVAgPT0gb3BfdHlwZSA/ICJVUCIgOiAiRE9XTiIpLAorICAgICAgICAgICAgKEJDTUJBTF9JTlRGX1RZUEVfUE9OID09IGludGZfa2V5LmludGZfdHlwZSA/ICJQT04iOiJOTkkiKSwKKyAgICAgICAgICAgIGludGZfa2V5LmludGZfaWQpOworCisgICAgLyogcXVlcnkgUE9OIG1vZGUgKi8KKyAgICBwb25fbW9kZSA9IG1hY191dGlsX2dldF9wb25fbW9kZShpbnRmX2tleS5pbnRmX2lkKTsKKyAgICBpZiAocG9uX21vZGUgPT0gQkNNX1RPUE9fUE9OX01PREVfSU5WQUxJRCkKKyAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworCisgICAgLyogc3lzdGVtIG1vZGUgc3BlY2lmaWMgaW50ZXJmYWNlIHNldCAqLworICAgIGlmICgoQkNNX0VSUl9PSyA9PSByYykgJiYgbWFjX3V0aWxfYmFsX3JlcV9oYW5kbGVyc19mb3JfcG9uX21vZGVbcG9uX21vZGVdLmlmX3NldCkKKyAgICB7CisgICAgICAgIHJjID0gbWFjX3V0aWxfYmFsX3JlcV9oYW5kbGVyc19mb3JfcG9uX21vZGVbcG9uX21vZGVdLmlmX3NldChwX2ludGVyZmFjZV9pbnN0LCBvcF90eXBlKTsKKyAgICB9CisKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpbnRmX2tleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAiRmFpbGVkIElOVEVSRkFDRS0lcyBvcGVyYXRpb24gZm9yIElGICVkXG4iLAorICAgICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX0lGX1VQID09IG9wX3R5cGUpID8gIlVQIiA6ICJET1dOIiwgaW50Zl9rZXkuaW50Zl9pZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgbWFjX3V0aWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmZvX3ZhbGlkYXRlCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gdmFsaWRhdGUgYWxsIGlucHV0IGF0dHJpYnV0ZXMgcmVxdWlyZWQgZm9yIGEgc3ViIHRlcm0gc2V0dGluZworICogcmVjZWl2ZWQgZnJvbSBjb3JlCisgKgorICogQHBhcmFtIHBfc3ViX3Rlcm1fcmVxICAgICAgIEEgcG9pbnRlciB0byBhIHN1YnNjcmliZXIgdGVybWluYWwgb2JqZWN0CisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBtYWNfdXRpbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZm9fdmFsaWRhdGUoY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpwX3N1Yl90ZXJtX3JlcSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtX3RvcG9fcG9uX21vZGUgcG9uX21vZGU7CisKKyAgICAvKiBxdWVyeSBzeXN0ZW0gbW9kZSAqLworICAgIHBvbl9tb2RlID0gbWFjX3V0aWxfZ2V0X3Bvbl9tb2RlKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCk7CisgICAgaWYgKHBvbl9tb2RlID09IEJDTV9UT1BPX1BPTl9NT0RFX0lOVkFMSUQpCisgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKworICAgIC8qIHZhbGlkYXRlIHN5c3RlbSBtb2RlIHNwZWNpZmljIHRoaW5ncyAqLworICAgIGlmICgoQkNNX0VSUl9PSyA9PSByYykgJiYgbWFjX3V0aWxfYmFsX3JlcV9oYW5kbGVyc19mb3JfcG9uX21vZGVbcG9uX21vZGVdLnN1Yl90ZXJtX3ZhbGlkYXRlKQorICAgIHsKKyAgICAgICAgcmMgPSBtYWNfdXRpbF9iYWxfcmVxX2hhbmRsZXJzX2Zvcl9wb25fbW9kZVtwb25fbW9kZV0uc3ViX3Rlcm1fdmFsaWRhdGUocF9zdWJfdGVybV9yZXEpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1zdWJzY3JpYmVyIHRlcm1pbmFsIHNldCBoYW5kbGluZy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ29tbWFuZCBTZXQgc2V0dXAgcm91dGluZSBmb3Igc3Vic2NyaWJlciB0ZXJtaW5hbCBjb25uZWN0IHRvIG1hYyBhcHBsaWNhdGlvbgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgc3ViX3Rlcm1fZnNtIGluIHRoZSBCQUwgY29yZSB0byBpbml0aWFsaXplIHRoZSBjb21tYW5kCisgKiBzZXQgdG8gY29ubmVjdCB0aGUgc3Vic2NyaWJlciB0ZXJtaW5hbCBvZiB0aGUgbWFjIGFwcGxpY2F0aW9uLiBUaGUgY21kc2V0IGFjdHVhbGx5CisgKiBjb25zaXN0cyBvZiB0d28gY29tbWFuZHMsIG9uZSBpcyB0byBzZW5kIHRoZSBzdWJfdGVybSByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIG1hYworICogQXBwIGFuZCBoYW5kbGUgdGhlIHJlbGV2YW50IHJlc3BvbnNlLCB0aGUgb3RoZXIgaXMgdG8gaGFuZGxlIHRoZSBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqIGZyb20gdGhlIG1hYyBBUFAgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4KKyAqCisgKiBAcGFyYW0gcF9zdWJfdGVybV9pbnN0ICAgQSBwb2ludGVyIHRvIGEgc3Vic2NyaWJlciB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIG9wX3R5cGUgICAgICAgICAgVHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIG9uIHRoZSBzdWJzY3JpYmVyIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gaXNfcG9zdF9kaXNjb3ZlcnkgVXNlZCBmb3IgQURELCBpbmRpY2F0ZXMgaWYgdGhpcyByZXF1ZXN0IGlzIGFmdGVyIGEgT05VIERpc2NvdmVyeQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworCitiY21vc19lcnJubyBtYWNfdXRpbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3NldChzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIGJhbF91dGlsX29wZXJfc3ViX3Rlcm0gb3BfdHlwZSwgYmNtb3NfYm9vbCBpc19wb3N0X2Rpc2NvdmVyeSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpwX3N1Yl90ZXJtX3JlcSA9ICZwX3N1Yl90ZXJtX2luc3QtPmFwaV9yZXFfc3ViX3Rlcm1faW5mbzsKKyAgICBiY21fdG9wb19wb25fbW9kZSBwb25fbW9kZTsKKworICAgIEJDTV9MT0coREVCVUcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQpLAorICAgICAgICAgICAgIklOIDogJXMgcG9uX2lkID0gJWQgb251X2lkPSAlZCAiCisgICAgICAgICAgICAib21jaV9nZW1fcG9ydCA9ICVkXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgcF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkLAorICAgICAgICAgICAgcF9zdWJfdGVybV9yZXEtPmtleS5zdWJfdGVybV9pZCwgcF9zdWJfdGVybV9yZXEtPmRhdGEuc3ZjX3BvcnRfaWQpOworCisgICAgaWYgKChCQUxfVVRJTF9PUEVSX1NVQl9URVJNX0FERCAhPSBvcF90eXBlKQorICAgICAgICAmJiAoQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9SRU1PVkUgIT0gb3BfdHlwZSkKKyAgICAgICAgJiYgKEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQ0xFQVIgIT0gb3BfdHlwZSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uICVkIGZvciBzdWJfdGVybSAldVxuIiwKKyAgICAgICAgICAgICAgICBvcF90eXBlLCBwX3N1Yl90ZXJtX3JlcS0+a2V5LnN1Yl90ZXJtX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKworICAgIC8qIHF1ZXJ5IHN5c3RlbSBtb2RlICovCisgICAgcG9uX21vZGUgPSBtYWNfdXRpbF9nZXRfcG9uX21vZGUocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKTsKKyAgICBpZiAocG9uX21vZGUgPT0gQkNNX1RPUE9fUE9OX01PREVfSU5WQUxJRCkKKyAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworCisgICAgLyogc3lzdGVtIG1vZGUgc3BlY2lmaWMgc3ViIHRlcm0gc2V0ICovCisgICAgaWYgKChCQ01fRVJSX09LID09IHJjKSAmJiBtYWNfdXRpbF9iYWxfcmVxX2hhbmRsZXJzX2Zvcl9wb25fbW9kZVtwb25fbW9kZV0uc3ViX3Rlcm1fc2V0KQorICAgIHsKKyAgICAgICAgcmMgPSBtYWNfdXRpbF9iYWxfcmVxX2hhbmRsZXJzX2Zvcl9wb25fbW9kZVtwb25fbW9kZV0uc3ViX3Rlcm1fc2V0KHBfc3ViX3Rlcm1faW5zdCwgb3BfdHlwZSwgaXNfcG9zdF9kaXNjb3ZlcnkpOworICAgIH0KKworCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZDogcmMgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLWdyb3VwIHNldCBoYW5kbGluZyBHUk9VUCByb3V0aW5lcyBhbmQgaGVscGVyIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBtYWNfdXRpbF9ncm91cF9pbmZvX3ZhbGlkYXRlCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gdmFsaWRhdGUgYWxsIGlucHV0IGF0dHJpYnV0ZXMgcmVxdWlyZWQgZm9yIGEgZ3JvdXAKKyAqIHNldHRpbmcgcmVjZWl2ZWQgZnJvbSBjb3JlCisgKgorICogQHBhcmFtIHBfZ3JvdXBfcmVxICAgICBBIHBvaW50ZXIgdG8gYSBncm91cCBvYmplY3QKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2dyb3VwX2luZm9fdmFsaWRhdGUoY29uc3QgYmNtYmFsX2dyb3VwX2NmZyAqcF9ncm91cF9yZXEpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGludCBpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGlmIHRoZSBncm91cCBoYXMgbm8gb3duZXIsIG5vIG5lZWQgdG8gY2hlY2sgYXMgc2VydmljZSBwb3J0IHdpbGwgbm90IGJlIGFzc2lnbmVkICovCisgICAgICAgIGlmIChwX2dyb3VwX3JlcS0+ZGF0YS5vd25lciA9PSBCQ01CQUxfR1JPVVBfT1dORVJfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgZ3JvdXAgbWVtYmVyIGNvbW1hbmQgaXMgc2V0LCB0aGVyZSBoYXMgdG8gYmUgbWVtYmVyIGluZm8sCisgICAgICAgICAgIGZvciByZW1vdmUsIHNlcnZpY2UgcG9ydCBpcyBhbiBvcHRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmIChCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZ3JvdXBfcmVxLCBncm91cCwgbWVtYmVyc19jbWQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwX2dyb3VwX3JlcS0+ZGF0YS5tZW1iZXJzLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPCBwX2dyb3VwX3JlcS0+ZGF0YS5tZW1iZXJzLmxlbjsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYWxsIG1lbWJlcnMgc2hvdWxkIGhhdmUgdGhlIHNlcnZpY2UgcG9ydCBhcyBub24temVybyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIXBfZ3JvdXBfcmVxLT5kYXRhLm1lbWJlcnMudmFsW2ldLnN2Y19wb3J0X2lkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN2Y19wb3J0X2lkIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciBmb3IgYSBncm91cCBtZW1iZXIsIGFuZCBpdCBjYW4gbm90IHNldCB0byB6ZXJvXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9NQU5EQVRPUllfUEFSTV9JU19NSVNTSU5HOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH13aGlsZSgwKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqCisgKiBAYnJpZWYgQ29yZSBpbnRlcmZhY2U6IHNldHVwIHJvdXRpbmUgZm9yIGdyb3VwCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBncm91cF9mc20gaW4gdGhlIEJBTCBjb3JlIHRvCisgKiBhZGQvcmVtb3ZlL3NldCBncm91cCBpbiB0aGUgbWFjIGFwcGxpY2F0aW9uLiBVbmxpa2UgZmxvdyByZXF1ZXN0LAorICogdGhlIG1hYyBkcml2ZXIgZG9lcyBub3Qgc2VuZCBpbmRpY2F0aW9uIG1lc3NhZ2VzIGJhY2sgdXBvbiBjb21wbGV0aW9uLgorICogVGhpcyByb3V0aW5lIG5lZWRzIHRvIGZha2UgYW4gaW5kaWNhdGlvbiBtZXNzYWdlIHRvIGNvcmUgdG8gdHJpZ2dlciB0aGUgZ3JvdXBfZnNtLgorICoKKyAqIEBwYXJhbSBwX2dycF9pbnN0ICBQb2ludGVyIHRvIGdyb3VwIGluc3RhbmNlCisgKiBAcGFyYW0gb3BfdHlwZSAgICAgT3BlcmF0aW9uIHR5cGUgb24gZ3JvdXAgaW5zdGFuY2UKKyAqIEBwYXJhbSBzZW5kX2luZCAgICBUUlVFIC0gc2VuZCBpbmRpY2F0aW9uLCBGQUxTRSAtIGRvbid0IHNlbmQgaW5kaWNhdGlvbgorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfZ3JvdXBfc2V0KGdyb3VwX2luc3QgKnBfZ3JwX2luc3QsIGJhbF91dGlsX29wZXJfZ3JvdXAgb3BfdHlwZSwgYmNtb3NfYm9vbCBzZW5kX2luZCkKK3sKKyAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2dyb3VwX3JlcSA9ICZwX2dycF9pbnN0LT5hcGlfcmVxX2dyb3VwX2luZm87CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbWJhbF9ncm91cF9jZmcgKnBfZ3JvdXBfbG9va3VwX2luZm8gPSBOVUxMOworICAgIGJjbV90b3BvX3Bvbl9tb2RlIHBvbl9tb2RlOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGlmIHRoZSBncm91cCBoYXMgbm8gb3duZXIsIG5vIG5lZWQgdG8gYWNjZXNzIHRoZSBIVyBhcyBzZXJ2aWNlIHBvcnQgd2lsbCBub3QgYmUgc2V0ICovCisgICAgICAgIGlmIChwX2dyb3VwX3JlcS0+ZGF0YS5vd25lciA9PSBCQ01CQUxfR1JPVVBfT1dORVJfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBXaGVuIHdlIGFyZSBkb2luZyBhIEdST1VQX0FERCwgdGhlIEFQSSByZXF1ZXN0IGhhcyB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCwKKyAgICAgICAgICogV2hlbiB3ZSBhcmUgZG9pbmcgYSBHUk9VUF9ERVNUUk9ZLCB0aGUgY3VycmVudCBncm91cCBpbmZvIGhhcyB0aGlzIGluZm9ybWF0aW9uIChiZWNhdXNlCisgICAgICAgICAqIHRoZSBHUk9VUF9ERVNUUk9ZIHJlcXVlc3Qgb25seSBoYXMgdGhlIGdyb3VwIGtleSBwb3B1bGF0ZWQuIFRoZSBjdXJyZW50IGZsb3cgaW5mbyBoYXMKKyAgICAgICAgICogYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIHVzZWQgd2hlbiBjcmVhdGUgdGhlIGdyb3VwLgorICAgICAgICAgKi8KKyAgICAgICAgcF9ncm91cF9sb29rdXBfaW5mbyA9IChCQUxfVVRJTF9PUEVSX0dST1VQX0RFU1RST1kgPT0gb3BfdHlwZSkgPyAmcF9ncnBfaW5zdC0+Y3VycmVudF9ncm91cF9pbmZvIDogcF9ncm91cF9yZXE7CisKKyAgICAgICAgQkNNX0xPRyhJTkZPLCAgbG9nX2lkX21hY191dGlsLCAiJXMgZ3JvdXBfaWQgPSAlZCB3aXRoIG9wZXIgdHlwZSAlc1xuICIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHBfZ3JvdXBfbG9va3VwX2luZm8tPmtleS5ncm91cF9pZCwKKyAgICAgICAgICAgICAgICBCQ01CQUxfVVRJTF9HUk9VUF9PUEVSX1NUUl9HRVQob3BfdHlwZSkKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgIC8qIG1hYyBvbmx5IG5lZWQgdG8gcmVzcG9uc2UgdG8gc2V0IG1lbWJlciB3aGVuIG9wX3R5cGUgaXMgQUREL1JFTU9WRS9TRVQgLSBjb25maWd1cmUgbXVsdGljYXN0IHNlcnZpY2UgcG9ydHMgKi8KKyAgICAgICAgaWYgKChCQUxfVVRJTF9PUEVSX0dST1VQX0FERCAgICAgPT0gb3BfdHlwZSB8fAorICAgICAgICAgICAgIEJBTF9VVElMX09QRVJfR1JPVVBfUkVNT1ZFICA9PSBvcF90eXBlIHx8CisgICAgICAgICAgICAgQkFMX1VUSUxfT1BFUl9HUk9VUF9TRVQgICAgID09IG9wX3R5cGUgICApICYmCisgICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2dyb3VwX3JlcSwgZ3JvdXAsIG1lbWJlcnMpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhc3N1bWUgYWxsIG1lbWJlcnMgYXJlIG9mIHNhbWUgbW9kZSAqLworICAgICAgICAgICAgLyogcXVlcnkgc3lzdGVtIG1vZGUgKi8KKyAgICAgICAgICAgIHBvbl9tb2RlID0gbWFjX3V0aWxfZ2V0X3Bvbl9tb2RlKHBfZ3JvdXBfcmVxLT5kYXRhLm1lbWJlcnMudmFsWzBdLmludGZfaWQpOworICAgICAgICAgICAgaWYgKHBvbl9tb2RlID09IEJDTV9UT1BPX1BPTl9NT0RFX0lOVkFMSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogc3lzdGVtIG1vZGUgc3BlY2lmaWMgZ3JvdXAgc2V0ICovCisgICAgICAgICAgICBlbHNlIGlmICggbWFjX3V0aWxfYmFsX3JlcV9oYW5kbGVyc19mb3JfcG9uX21vZGVbcG9uX21vZGVdLmdyb3VwX3NldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IG1hY191dGlsX2JhbF9yZXFfaGFuZGxlcnNfZm9yX3Bvbl9tb2RlW3Bvbl9tb2RlXS5ncm91cF9zZXQocF9ncm91cF9yZXEsIG9wX3R5cGUsIHBfZ3JwX2luc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKiBzcGVjaWFsIGNhc2UgLSBkZXN0cm95IHdpdGggdmFsaWQgbWVtYmVycywgdGhlbiBuZWVkIHRvIHJlbW92ZSBhbGwgbWVtYmVycyAqLworICAgICAgICBlbHNlIGlmICgoQkFMX1VUSUxfT1BFUl9HUk9VUF9ERVNUUk9ZICA9PSBvcF90eXBlICYmICBwX2dyb3VwX2xvb2t1cF9pbmZvLT5kYXRhLm1lbWJlcnMubGVuICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBxdWVyeSBzeXN0ZW0gbW9kZSAtIHVzZSBmaXJzdCBtZW1iZXIgYXMgZGVmYXVsdCAqLworICAgICAgICAgICAgcG9uX21vZGUgPSBtYWNfdXRpbF9nZXRfcG9uX21vZGUocF9ncm91cF9sb29rdXBfaW5mby0+ZGF0YS5tZW1iZXJzLnZhbFswXS5pbnRmX2lkKTsKKyAgICAgICAgICAgIGlmIChwb25fbW9kZSA9PSBCQ01fVE9QT19QT05fTU9ERV9JTlZBTElEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHN5c3RlbSBtb2RlIHNwZWNpZmljIGdyb3VwIHNldCAqLworICAgICAgICAgICAgZWxzZSBpZiAoIG1hY191dGlsX2JhbF9yZXFfaGFuZGxlcnNfZm9yX3Bvbl9tb2RlW3Bvbl9tb2RlXS5ncm91cF9zZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBtYWNfdXRpbF9iYWxfcmVxX2hhbmRsZXJzX2Zvcl9wb25fbW9kZVtwb25fbW9kZV0uZ3JvdXBfc2V0KHBfZ3JvdXBfbG9va3VwX2luZm8sIEJBTF9VVElMX09QRVJfR1JPVVBfUkVNT1ZFLCBwX2dycF9pbnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKworICAgIC8qIHJldHVybiBhbiBpbmRpY2F0aW9uIG1lc3NhZ2UgdG8gY29yZSAqLworICAgIGlmKHNlbmRfaW5kKQorICAgIHsKKyAgICAgICAgX21hY191dGlsX3JlcG9ydF9ncm91cF9zZXRfaW5kaWNhdGlvbihwX2dyb3VwX3JlcS0+a2V5LCBvcF90eXBlLCByYyk7CisgICAgfQorCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICAgICAgICAgIiVzIEZhaWxlZDogcmMgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS1mbG93IHNldCBoYW5kbGluZyBJbnRlcmZhY2Ugcm91dGluZXMgYW5kIGhlbHBlciBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIG1hY191dGlsX2Zsb3dfaW5mb192YWxpZGF0ZQorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHZhbGlkYXRlIGFsbCBpbnB1dCBhdHRyaWJ1dGVzIHJlcXVpcmVkIGZvciBhIGZsb3cKKyAqIHNldHRpbmcgcmVjZWl2ZWQgZnJvbSBjb3JlCisgKgorICogQHBhcmFtIHBfZmxvd19yZXEgICAgIEEgcG9pbnRlciB0byBhIGZsb3cgb2JqZWN0CisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBtYWNfdXRpbF9mbG93X2luZm9fdmFsaWRhdGUoY29uc3QgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21fdG9wb19wb25fbW9kZSBwb25fbW9kZTsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiAocF9mbG93X3JlcS0+a2V5LmZsb3dfdHlwZSA9PSBCQ01CQUxfRkxPV19UWVBFX01VTFRJQ0FTVCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyBpbiBtdWx0aWNhc3QgRkxPVyAtIHZhbGlkYXRlIGluIEdST1VQKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChwX2Zsb3dfcmVxLT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSAmJgorICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3dfcmVxLCBmbG93LCBncm91cF9pZCkgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyBpbiBEUyBOOjEgRkxPVyAtIHZhbGlkYXRlIGluIEdST1VQICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3dfcmVxLCBmbG93LCBhY2Nlc3NfaW50X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorICAgICAgICAgICAgICAgICAgICAiYWNjZXNzIGlmIGlkIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciBmb3IgYSBmbG93LCBhbmQgaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfTUFOREFUT1JZX1BBUk1fSVNfTUlTU0lORzsKKworICAgICAgICAgICAgYnJlYWs7IC8qIGlmIGludGVyZmFjZSBpZCBub3Qgc2V0IHRoZW4gc2tpcCByZXN0IG9mIHRoZSBjaGVja3MgKi8KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwX2Zsb3dfcmVxLT5rZXkuZmxvd190eXBlICE9IEJDTUJBTF9GTE9XX1RZUEVfQlJPQURDQVNUKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93X3JlcSwgZmxvdywgc3ViX3Rlcm1faWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsICBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdWIgdGVybSBpZCBpcyBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZm9yIGEgZmxvdywgYW5kIGl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9NQU5EQVRPUllfUEFSTV9JU19NSVNTSU5HOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvd19yZXEsIGZsb3csIHN2Y19wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgICAgICJzdmNfcG9ydF9pZCBpcyBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZm9yIGEgZmxvdywgYW5kIGl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX01BTkRBVE9SWV9QQVJNX0lTX01JU1NJTkc7CisgICAgICAgIH0KKworICAgICAgICAvKiB2YWxpZGF0ZSBmbG93IGlkICovCisgICAgICAgIGlmIChCQ01PU19GQUxTRSA9PSBNQUNfVVRJTF9GTE9XX0RCX0ZMT1dfSURfSVNfVkFMSUQocF9mbG93X3JlcS0+a2V5LmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwKKyAgICAgICAgICAgICAgICAgICAgImZsb3cgSWQgZnJvbSB1c2VyIGlzIG5vdCB3aXRoaW4gcmFuZ2U6ICVkIDw9IGZsb3cgaWQgPD0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIE1BQ19VVElMX0ZMT1dfREJfRkxPV19JRF9TVEFSVF9WQUwsIE1BQ19VVElMX0ZMT1dfREJfRkxPV19JRF9NQVhfVkFMKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKworCisgICAgICAgIC8qIHF1ZXJ5IHN5c3RlbSBtb2RlICovCisgICAgICAgIHBvbl9tb2RlID0gbWFjX3V0aWxfZ2V0X3Bvbl9tb2RlKHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCk7CisgICAgICAgIGlmIChwb25fbW9kZSA9PSBCQ01fVE9QT19QT05fTU9ERV9JTlZBTElEKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBnZXQgc3lzdGVtIG1vZGUgZm9yIHBvbiBpbnRlcmZhY2VcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogc3lzdGVtIG1vZGUgc3BlY2lmaWMgdmFsaWRhdGlvbiAqLworICAgICAgICBpZiAoKEJDTV9FUlJfT0sgPT0gcmMpICYmIG1hY191dGlsX2JhbF9yZXFfaGFuZGxlcnNfZm9yX3Bvbl9tb2RlW3Bvbl9tb2RlXS5mbG93X3ZhbGlkYXRlKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1hY191dGlsX2JhbF9yZXFfaGFuZGxlcnNfZm9yX3Bvbl9tb2RlW3Bvbl9tb2RlXS5mbG93X3ZhbGlkYXRlKHBfZmxvd19yZXEpOworICAgICAgICAgICAgLyogdGhlIGNhbGxlZCBmdW5jdGlvbiB3aWxsIGxvZyBhbnkgcHJvdG9jb2wgc3BlY2lmaWMgdmFsaWRhdGlvbiBlcnJvcnMgKi8KKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoMCk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKgorICogQGJyaWVmIENvcmUgaW50ZXJmYWNlOiBzZXR1cCByb3V0aW5lIGZvciBmbG93CisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBmbG93X2ZzbSBpbiB0aGUgQkFMIGNvcmUgdG8gaW5pdGlhbGl6ZSB0aGUgY29tbWFuZAorICogdG8gYWRkIGZsb3cgdG8gdGhlIG1hYyBhcHBsaWNhdGlvbi4gVGhlIGNtZHNldCBhY3R1YWxseQorICogY29uc2lzdHMgb2YgdHdvIGNvbW1hbmRzLCBvbmUgaXMgdG8gc2VuZCB0aGUgZmxvdyByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIG1hYworICogQXBwIGFuZCBoYW5kbGUgdGhlIHJlbGV2YW50IHJlc3BvbnNlLCB0aGUgb3RoZXIgaXMgdG8gaGFuZGxlIHRoZSBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqIGZyb20gdGhlIG1hYyBBUFAgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4KKyAqCisgKiBAcGFyYW0gcF9mbG93X2NvcmUgICBQb2ludGVyIHRvIGZsb3cgaW5zdGFuY2UgZnJvbSBjb3JlIGZzbQorICogQHBhcmFtIG9wX3R5cGUgICAgICAgT3BlcmF0aW9uIHR5cGUgb24gZmxvdyBpbnN0YW5jZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfZmxvd19zZXQoZmxvd19pbnN0ICpwX2Zsb3dfY29yZSwgYmFsX3V0aWxfb3Blcl9mbG93IG9wX3R5cGUpCit7CisgICAgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxID0gJnBfZmxvd19jb3JlLT5hcGlfcmVxX2Zsb3dfaW5mbzsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBiY21iYWxfZmxvd19jZmcgKnBfZmxvd19sb29rdXBfaW5mbyA9IE5VTEw7CisgICAgYmNtX3RvcG9fcG9uX21vZGUgcG9uX21vZGU7CisKKyAgICAvKgorICAgICAqIFdoZW4gd2UgYXJlIGRvaW5nIGEgRkxPV19BREQsIHRoZSBBUEkgcmVxdWVzdCBoYXMgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQsCisgICAgICogV2hlbiB3ZSBhcmUgZG9pbmcgYSBGTE9XX1JFTU9WRSwgdGhlIGN1cnJlbnQgZmxvdyBpbmZvIGhhcyB0aGlzIGluZm9ybWF0aW9uIChiZWNhdXNlCisgICAgICogdGhlIEZMT1dfUkVNT1ZFIHJlcXVlc3Qgb25seSBoYXMgdGhlIGZsb3cga2V5IHBvcHVsYXRlZC4gVGhlIGN1cnJlbnQgZmxvdyBpbmZvIGhhcworICAgICAqIGFsbCBvZiB0aGUgYXR0cmlidXRlcyB1c2VkIHRvIGNyZWF0ZSB0aGUgZmxvdyBpbiB0aGUgZmlyc3QgcGxhY2UuCisgICAgICovCisgICAgcF9mbG93X2xvb2t1cF9pbmZvID0gKEJBTF9VVElMX09QRVJfRkxPV19BREQgPT0gb3BfdHlwZSkgPyBwX2Zsb3dfcmVxIDogJnBfZmxvd19jb3JlLT5jdXJyZW50X2Zsb3dfaW5mbzsKKworICAgIGJjbW9zX2Jvb2wgZmxvd19pc19kZXN0aW5lZF90b19ob3N0ID0gQkFMX1VUSUxfT1BFUl9GTE9XX0FERCA9PSBvcF90eXBlID8KKworICAgICAgICAoKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJnBfZmxvd19jb3JlLT5hcGlfcmVxX2Zsb3dfaW5mbywgZmxvdywgYWN0aW9uKSAmJgorICAgICAgICAgIChwX2Zsb3dfY29yZS0+YXBpX3JlcV9mbG93X2luZm8uZGF0YS5hY3Rpb24uY21kc19iaXRtYXNrICYKKyAgICAgICAgICAgQkNNQkFMX0FDVElPTl9DTURfSURfVFJBUF9UT19IT1NUKSkgPyBCQ01PU19UUlVFIDogQkNNT1NfRkFMU0UpIDoKKworICAgICAgICAoKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJnBfZmxvd19jb3JlLT5jdXJyZW50X2Zsb3dfaW5mbywgZmxvdywgYWN0aW9uKSAmJgorICAgICAgICAgIChwX2Zsb3dfY29yZS0+Y3VycmVudF9mbG93X2luZm8uZGF0YS5hY3Rpb24uY21kc19iaXRtYXNrICYKKyAgICAgICAgICAgQkNNQkFMX0FDVElPTl9DTURfSURfVFJBUF9UT19IT1NUKSkgPyBCQ01PU19UUlVFIDogQkNNT1NfRkFMU0UpOworCisgICAgLyogVGhlcmUncyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIHdpdGggdGhlIE1BQyBpbiBkb3duc3RyZWFtIGZsb3dzIHRoYXQKKyAgICAgKiB0aGF0IGFyZSBkZXN0aW5lZCB0byB0aGUgaG9zdCBDUFUgKGkuZS4gTk5JLT5DUFUpCisgICAgICovCisgICAgaWYoKChCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU0gPT0gcF9mbG93X3JlcS0+a2V5LmZsb3dfdHlwZSkgJiYKKyAgICAgICAgIGZsb3dfaXNfZGVzdGluZWRfdG9faG9zdCkpCisgICAgeworICAgICAgICAvKiBXaGVuIHRoZSBmbG93IGlzIGRvd25zdHJlYW0gYW5kIGRlc3RpbmVkIHRvIHRoZSBob3N0IChpLmUuIE5OSS0+Q1BVKSwgdGhlbiB0aGVyZQorICAgICAgICAgKiBpcyBub3RoaW5nIHRvIGRvIGluIHRoZSBNQUMsIHNvIGp1c3QgcmV0dXJuIGFuIGluZGljYXRpb24gdG8gYWxsb3cgdGhlIEZTTSB0byBjb250aW51ZSBvbi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChCQUxfVVRJTF9PUEVSX0ZMT1dfQUREID09IG9wX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hY191dGlsX3JlcG9ydF9mbG93X2FkZF9zdWNjZXNzKHBfZmxvd19yZXEtPmtleSwgcF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoQkFMX1VUSUxfT1BFUl9GTE9XX1JFTU9WRSA9PSBvcF90eXBlKSB8fCAoQkFMX1VUSUxfT1BFUl9GTE9XX0NMRUFSID09IG9wX3R5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfZmxvd19yZW1vdmVfc3VjY2VzcyhwX2Zsb3dfcmVxLT5rZXksIHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCwgb3BfdHlwZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogZm9yIG11bHRpY2FzdCBmbG93IGFsbCB3b3JrcyBhcmUgZG9uZSBpbiBHUk9VUCBvYmplY3QsIHNpbXBseSBzZW5kIHRoZSBpbmRpY2F0aW9uIHRvIENvcmUgKi8KKyAgICBlbHNlIGlmIChCQ01CQUxfRkxPV19UWVBFX01VTFRJQ0FTVCA9PSBwX2Zsb3dfcmVxLT5rZXkuZmxvd190eXBlKQorICAgIHsKKyAgICAgICAgLyogdGhlcmUgaXMgbm8gYWNjZXNzX2ludF9pZCBmb3IgbXVsdGljYXN0IGZsb3csIHBhc3MgMCBhcyBwYXJhbWV0ZXIuCisgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgbnVtYmVyIGlzIGp1c3QgdXNlZCBmb3IgbG9nZ2luZyBwdXJwb3NlIGluIHRoZSBpbmRpY2F0aW9uIEFQSSAqLworICAgICAgICAgX21hY191dGlsX3JlcG9ydF9mbG93X3NldF9pbmRpY2F0aW9uKHBfZmxvd19yZXEtPmtleSwgMCwgb3BfdHlwZSwgcmMpOworICAgIH0KKyAgICAvKiBmb3IgZG93bnN0cmVhbSBuOjEgZmxvdyBhbGwgd29ya3MgYXJlIGRvbmUgaW4gR1JPVVAgb2JqZWN0LCBzaW1wbHkgc2VuZCB0aGUgaW5kaWNhdGlvbiB0byBDb3JlICovCisgICAgZWxzZSBpZiAoQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNID09IHBfZmxvd19yZXEtPmtleS5mbG93X3R5cGUgICAgICAgJiYKKyAgICAgICAgICAgICAoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3dfcmVxLCBmbG93LCBncm91cF9pZCkpICAgICAgICAgICAgICkKKyAgICB7CisgICAgICAgIC8qIHRoZXJlIGlzIG5vIGFjY2Vzc19pbnRfaWQgZm9yIERTIE46MSBmbG93LCBwYXNzIDAgYXMgcGFyYW1ldGVyLgorICAgICAgICAgICBUaGUgaW50ZXJmYWNlIG51bWJlciBpcyBqdXN0IHVzZWQgZm9yIGxvZ2dpbmcgcHVycG9zZSBpbiB0aGUgaW5kaWNhdGlvbiBBUEkgKi8KKyAgICAgICAgIF9tYWNfdXRpbF9yZXBvcnRfZmxvd19zZXRfaW5kaWNhdGlvbihwX2Zsb3dfcmVxLT5rZXksIDAsIG9wX3R5cGUsIHJjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgICBCQ01fTE9HKElORk8sICBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwKKyAgICAgICAgICAgICAgICAiJXMgZmxvd19pZCA9ICVkIGRpciA9ICVzLCBwb25faWQgPSAlZCAiCisgICAgICAgICAgICAgICAgIm9udV9pZD0gJWQgYWxsb2NfaWQgPSAlZCBnZW1fcG9ydCA9ICVkLCBvcF90eXBlID0gJXNcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHBfZmxvd19sb29rdXBfaW5mby0+a2V5LmZsb3dfaWQsCisgICAgICAgICAgICAgICAgcF9mbG93X2xvb2t1cF9pbmZvLT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPyAidXAiOiJkb3duIiwKKyAgICAgICAgICAgICAgICBwX2Zsb3dfbG9va3VwX2luZm8tPmRhdGEuYWNjZXNzX2ludF9pZCwKKyAgICAgICAgICAgICAgICBwX2Zsb3dfbG9va3VwX2luZm8tPmRhdGEuc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgcF9mbG93X2xvb2t1cF9pbmZvLT5kYXRhLmFnZ19wb3J0X2lkLAorICAgICAgICAgICAgICAgIHBfZmxvd19sb29rdXBfaW5mby0+ZGF0YS5zdmNfcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAoQkFMX1VUSUxfT1BFUl9GTE9XX0FERCA9PSBvcF90eXBlID8gIkZMT1dfQUREIjoKKyAgICAgICAgICAgICAgICAgKEJBTF9VVElMX09QRVJfRkxPV19SRU1PVkUgPT0gb3BfdHlwZSA/ICJGTE9XX1JFTU9WRSIgOiAiRkxPV19DTEVBUiIpKSk7CisKKyAgICAgICAgLyogcXVlcnkgc3lzdGVtIG1vZGUgKi8KKyAgICAgICAgcG9uX21vZGUgPSBtYWNfdXRpbF9nZXRfcG9uX21vZGUocF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKTsKKyAgICAgICAgaWYgKHBvbl9tb2RlID09IEJDTV9UT1BPX1BPTl9NT0RFX0lOVkFMSUQpCisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisKKyAgICAgICAgLyogc3lzdGVtIG1vZGUgc3BlY2lmaWMgZmxvdyBzZXQgKi8KKyAgICAgICAgaWYgKChCQ01fRVJSX09LID09IHJjKSAmJiBtYWNfdXRpbF9iYWxfcmVxX2hhbmRsZXJzX2Zvcl9wb25fbW9kZVtwb25fbW9kZV0uZmxvd19zZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbWFjX3V0aWxfYmFsX3JlcV9oYW5kbGVyc19mb3JfcG9uX21vZGVbcG9uX21vZGVdLmZsb3dfc2V0KHBfZmxvd19sb29rdXBfaW5mbywgb3BfdHlwZSwgcF9mbG93X2NvcmUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICIlcyBGYWlsZWQ6IHJjID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBtYWNfdXRpbF90bSBzY2hlZF9pbmZvX3ZhbGlkYXRlCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gdmFsaWRhdGUgYWxsIGlucHV0IGF0dHJpYnV0ZXMgcmVxdWlyZWQgZm9yIGEgdG0gc2NoZWQKKyAqIHNldHRpbmcgcmVjZWl2ZWQgZnJvbSBjb3JlCisgKgorICogQHBhcmFtIHBfdG1fc2NoZWRfcmVxICAgICBBIHBvaW50ZXIgdG8gYSB0bSBzY2hlZCBvYmplY3QKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX3RtX3NjaGVkX2luZm9fdmFsaWRhdGUoY29uc3QgYmNtYmFsX3RtX3NjaGVkX2NmZyAqcF90bV9zY2hlZF9yZXEpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbV90b3BvX3Bvbl9tb2RlIHBvbl9tb2RlOworICAgIGRvCisgICAgeworICAgICAgICBpZiAoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF90bV9zY2hlZF9yZXEsIHRtX3NjaGVkLCBvd25lcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gaW4gTUFDICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBfdG1fc2NoZWRfcmVxLT5kYXRhLm93bmVyLnR5cGUgIT0gQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfQUdHX1BPUlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gaW4gTUFDICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogcXVlcnkgc3lzdGVtIG1vZGUgKi8KKyAgICAgICAgcG9uX21vZGUgPSBtYWNfdXRpbF9nZXRfcG9uX21vZGUocF90bV9zY2hlZF9yZXEtPmRhdGEub3duZXIudS5hZ2dfcG9ydC5pbnRmX2lkKTsKKyAgICAgICAgaWYgKHBvbl9tb2RlID09IEJDTV9UT1BPX1BPTl9NT0RFX0lOVkFMSUQpCisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIAorICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfdG1fc2NoZWRfcmVxLT5kYXRhLm93bmVyLnUuYWdnX3BvcnQuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZ2V0IHN5c3RlbSBtb2RlIGZvciBwb24gaW50ZXJmYWNlXG4iKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKDApOwkKKyAgICByZXR1cm4gcmM7Cit9CisKK2JjbW9zX2Vycm5vIG1hY191dGlsX2FnZ19wb3J0X3NldCh0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkLCBiYWxfdXRpbF9vcGVyX2FnZ19wb3J0IG9wX3R5cGUpCit7CisgICAgYmNtYmFsX3RtX3NjaGVkX2NmZyAqcF9hZ2dfcG9ydF9yZXEgPSAmcF90bV9zY2hlZC0+cmVxX3RtX3NjaGVkX2luZm87CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisKKyAgICBiY21fdG9wb19wb25fbW9kZSBwb25fbW9kZTsKKyAgICBkbworICAgIHsKKworICAgICAgICAvKiBxdWVyeSBzeXN0ZW0gbW9kZSAqLworICAgICAgICBwb25fbW9kZSA9IG1hY191dGlsX2dldF9wb25fbW9kZShwX2FnZ19wb3J0X3JlcS0+ZGF0YS5vd25lci51LmFnZ19wb3J0LmludGZfaWQpOworICAgICAgICBpZiAocG9uX21vZGUgPT0gQkNNX1RPUE9fUE9OX01PREVfSU5WQUxJRCkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBtYXBsZV9tYWNfdXRpbF9hZ2dfcG9ydF9zZXQocF9hZ2dfcG9ydF9yZXEsIG9wX3R5cGUsIHBfdG1fc2NoZWQpOworCisgICAgfXdoaWxlKDApOworICAgIHJldHVybiByYzsKK30KKworI2lmICFkZWZpbmVkKFdSWF9CVUlMRCkKKy8qIEludGVybmFsIGZ1bmN0aW9uIHRoYXQgZmluZHMgVURQIHBvcnQgdG8gYmluZCB0byAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9tYWNfdXRpbF9maW5kX2ZyZWVfdWRwX3BvcnQodWludDE2X3QgKnBfcG9ydCkKK3sKKyNkZWZpbmUgTUFYX1VEUF9QT1JUX1RSWV9JVEVSICAgMTAwIC8qIFRyeSAxMDAgdGltZXMsIHRoZW4gZ2l2ZSB1cCAqLworI2RlZmluZSBNQVhfVURQX1BPUlQgICAgICAgICAgICA2MDAwMAorI2RlZmluZSBNSU5fVURQX1BPUlQgICAgICAgICAgICAoTUFYX1VEUF9QT1JUIC8gMikKKyAgICB1aW50MTZfdCBwb3J0OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKyAgICBpbnQgc29jazsKKyAgICBpbnQgYmluZF9yYzsKKyAgICBpbnQgaSA9IDA7CisKKyAgICAvKiBPcGVuIFVEUCBzb2NrZXQgKi8KKyAgICBzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIGlmIChzb2NrIDwgMCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJDYW4ndCBjcmVhdGUgVURQIHNvY2tldC4gZXJyb3IgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorCisgICAgbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisgICAgc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgc2Euc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworICAgIGRvCisgICAgeworICAgICAgICBwb3J0ID0gcmFuZCgpICUgTUFYX1VEUF9QT1JUOworICAgICAgICBpZiAocG9ydCA8IE1JTl9VRFBfUE9SVCkKKyAgICAgICAgICAgIHBvcnQgKz0gTUlOX1VEUF9QT1JUOworICAgICAgICBzYS5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgICAgICBiaW5kX3JjID0gYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Yoc2EpKTsKKyAgICB9IHdoaWxlIChiaW5kX3JjIDwgMCAmJiArK2kgPCBNQVhfVURQX1BPUlRfVFJZX0lURVIpOworCisgICAgLyogWWVzLCB5ZXMuIFRoZXJlIGlzIGEgcG9zc2libGUgcmFjZSBjb25kaXRpb24gdGhhdCBzb21lb25lIHdpbGwgdGFrZSB0aGUgcG9ydCB3ZSd2ZSBqdXN0IGZvdW5kCisgICAgICogYmVmb3JlIHdlIGhhZCBhIGNoYW5jZSB0byBiaW5kIGl0IGFnYWluLgorICAgICAqIEluIHRoaXMgdW5saWtlbHkgY2FzZSBCQUwgYXBwbGljYXRpb24gd2lsbCBmYWlsIG9uIHN0YXJ0dXAgYW5kIHdpbGwgaGF2ZSB0byBiZSByZXN0YXJ0ZWQuCisgICAgICovCisgICAgY2xvc2Uoc29jayk7CisKKyAgICBpZiAoYmluZF9yYyA8IDApCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT1JFUywgIkNvdWxkbid0IGZpbmQgdW51c2VkIFVEUCBwb3J0IGFmdGVyICVkIHRyaWVzLiBHaXZpbmcgdXAuXG4iLCBpKTsKKyAgICB9CisKKyAgICAqcF9wb3J0ID0gcG9ydDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGJhbF9pbmRpY2F0aW9uX2NiKGJjbW9sdF9kZXZpZCBvbHQsIGJjbW9sdF9tc2cgKnBfbXNnKQoreworICAgIG1hY191dGlsX2luZGljYXRpb25fY2Iob2x0LCBwX21zZyk7CisKKyAgICBiY21vbHRfbXNnX2ZyZWUocF9tc2cpOworfQorCisjaWZkZWYgRU5BQkxFX0xPRworLyoqCisgKiBAYnJpZWYgcm91dGluZSB0byByZWdpc3RlciBwZXIgcG9uIGxvZyBzdHJpbmdzIHdpdGggbG9nZ2VyCisgKgorICogQHBhcmFtIHN5c3RlbV9tb2RlICAtT0xUIHN5c3RlbSBtb2RlCisgKgorICogQHJldHVybiAgYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hY191dGlsX3JlZ2lzdGVyX2xvZ2dpbmdfcGVyX3BvbiAodm9pZCkKK3sKKyAgICBjaGFyIGxvZ19zdHJfYnVmW01BQ19VVElMX0xPR19TVFJfU1pdID0gezB9OworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgdWludDMyX3QgbG9naWNhbF9wb247CisKKyAgICAvKiogQG5vdGUgaWYgYnkgYW55IGNoYW5jZSB0aGUgc3lzdGVtIG1vZGUgaXMgc2V0IG11bHRpcGxlIHRpbWVzLCB0aGVuIHdlIHdhbnQgdG8gYXZvaWQKKyAgICAgKiByZS1yZWdpc3RlcmluZyBhbHJlYWR5IHJlZ2lzdGVyZWQgcG9uIGludGVyZmFjZXMsIGJlY2F1c2UgdGhlcmUgaXMgY3VycmVudGx5IG5vIHdheQorICAgICAqIHRvIGRlLXJlZ2lzdGVyIHRob3NlIGludGVyZmFjZXMgZmlyc3QuIFdlIHdpbGwganVzdCByZWdpc3RlciB0aGUgbm90LXJlZ2lzdGVyZWQgb25lcy4KKyAgICAgKi8KKyAgICAvKiByZWdpc3RlciBsb2cgSWRzIGZvciBlYWNoIFBPTiBpbnRlcmZhY2UsIHRoYXQgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZCAqLworICAgIEJDTV9UT1BPX0ZPUl9FQUNIX1BPTihkZXZpY2VfaWQsIGxvZ2ljYWxfcG9uKQorICAgIHsKKyAgICAgICAgaWYgKDAgIT0gbG9nX2lkX21hY191dGlsX3Bvbl9pZltsb2dpY2FsX3Bvbl0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogbWFrZSBhIGxvZyBpZCBzdHJpbmcgKi8KKyAgICAgICAgTUFDX1VUSUxfTUFLRV9MT0dfU1RSX0ZPUl9QT05fSUYobG9naWNhbF9wb24sIGxvZ19zdHJfYnVmLCBzaXplb2YobG9nX3N0cl9idWYpKTsKKyAgICAgICAgLyogcmVnaXN0ZXIgbG9nIGlkIHN0cmluZyBmb3IgcG9uIGludGVyZmFjZSAqLworICAgICAgICBsb2dfaWRfbWFjX3V0aWxfcG9uX2lmW2xvZ2ljYWxfcG9uXSA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGxvZ19zdHJfYnVmLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICAgICAgQlVHX09OKGxvZ19pZF9tYWNfdXRpbF9wb25faWZbbG9naWNhbF9wb25dID09IERFVl9MT0dfSU5WQUxJRF9JRCk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKworCisKKy8qKgorICogQGJyaWVmIGdldCBpcCAmIHBvcnQgZm9yIE1BQy9NYXBsZQorICovCitiY21vc19lcnJubyBtYWNfdXRpbF9pbml0X3BhcnNlX21hY19pcF9hbmRfcG9ydCAoY29uc3QgY2hhciAqbWFwbGVfYWRkcmVzcykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyNpZiAhZGVmaW5lZChXUlhfQlVJTEQpCisgICAgcmMgPSBhcHBfdXRpbF9wYXJzZV9pcF9wb3J0KG1hcGxlX2FkZHJlc3MsICZiY210cl9vbHRfaXBbMF0sICZiY210cl9vbHRfdWRwX3BvcnRbMF0pOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBzcmFuZChiY21vc190aW1lc3RhbXAoKSk7CisgICAgcmMgPSBfbWFjX3V0aWxfZmluZF9mcmVlX3VkcF9wb3J0KCZiY210cl9ob3N0X3VkcF9wb3J0KTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJjOworfQorCisKKy8qKgorICogQGJyaWVmIG1hY191dGlsX2luaXQgIHJvdXRpbmUgZm9yIG1hYyBhcHBsaWNhdGlvbgorICogQHBhcmFtIG1hcGxlX2FkZHJlc3MgIC0gcG9pbnRlciB0byBtYXBsZSBkZXZpY2UgaW5zdGFuY2UKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfaW5pdChjb25zdCBjaGFyICptYXBsZV9hZGRyZXNzKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworCisgICAgZG8KKyAgICB7CisjaWZkZWYgRU5BQkxFX0xPRworICAgICAgICAvKiByZWdpc3RlciBhIGdlbmVyaWMgTUFDIHV0aWwgbG9nIElkIHRvbywgZm9yIHVzZSBvdGhlciB0aGFuIFBPTiBJZiByZWxhdGVkIGxvZ3MgKi8KKyAgICAgICAgbG9nX2lkX21hY191dGlsID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoIk1BQ19VVElMIiwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgICAgIEJVR19PTihsb2dfaWRfbWFjX3V0aWwgPT0gREVWX0xPR19JTlZBTElEX0lEKTsKKyNlbmRpZgorCisgICAgICAgIGlmICghYmNtYmFsX2lzX21hY19pbl9sb29wYmFjaygpKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1hY191dGlsX2luaXRfcGFyc2VfbWFjX2lwX2FuZF9wb3J0IChtYXBsZV9hZGRyZXNzKTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZ19pbmRpY2F0aW9uX2hhbmRsZXIgPSBiYWxfaW5kaWNhdGlvbl9jYjsKKworICAgICAgICBCQ01fVE9QT19GT1JfRUFDSF9ERVYoZGV2aWNlX2lkKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1hY191dGlsX3N5c3RlbV9tb2RlX2dldChkZXZpY2VfaWQpOworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLCAiJXM6IHN5c3RlbSBtb2RlIGdldCBmb3IgZGV2aWNlICVkIEZBSUxFRDogcmMgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZV9pZCwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgLyogcmVnaXN0ZXIgbG9nZ2luZyBmb3IgZWFjaCBQT04gYmFzZWQgb24gbWFjIG1vZGUqLworICAgICAgICBtYWNfdXRpbF9yZWdpc3Rlcl9sb2dnaW5nX3Blcl9wb24oKTsKKyNlbmRpZgorCisgICAgICAgIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9yZXNldCgpOworCisgICAgfSB3aGlsZSgwKTsKKworICAgIHJldHVybiByYzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBoZWxwZXIgZm9yIHRoZSBtYWMgYXBwIHByaW50X2Zsb3dzIENMSSBjb21tYW5kIGJhY2tlbmQKKyAqICAgICAgICB3aGljaCBwcmludCB0aGUgZnVsbCBpbnRlcm5hbCBmbG93cyBsaXN0CisgKgorICogQHBhcmFtIHNlc3MgICBQb2ludGVyIHRvIHRoZSBjdXJyZW50IGNsaSBzZXNzaW9uCisgKiBAcGFyYW0gcGFybSAgIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgZnJvbSB0aGUgQ0xJIGNvbW1hbmQsIHdoaWNoIHdpbGwgYmUgZW1wdHkgb24gdGhhdCBubyBwYXJhbWV0ZXJzIGNvbW1hbmQgY2FzZQorICogQHBhcmFtIG5QYXJtcyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBwYXJtIGFycmF5IChhYm92ZSkgdGhhdCBoYXZlCisgKiAgICAgICAgICAgICAgIHZhbGlkIGRhdGEsIHdoaWNoIHdpbGwgYmUgMCBvbiB0aGF0IGNhc2UuCisgKgorICogQHJldHVybnMgQkNNX0VSUl9PSyBvbiBzdWNjZXNzLCBvdGhlciBiY21vc19lcnJubyBjb2RlcyBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gX2NtZF9mbG93c19wcmludChiY21jbGlfc2Vzc2lvbiAqc2VzcywgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgblBhcm1zKQoreworICAgIGZsb3dfbGlzdF9lbnRyeSAqcF9jdXJyZW50X2VudHJ5ID0gTlVMTDsKKyAgICBmbG93X2xpc3RfZW50cnkgKnBfbmV4dF9lbnRyeSA9IE5VTEw7CisgICAgdWludDMyX3QgaWZfaWQgPSAwOworCisgICAgcHJpbnRmKCJGbG93IERCOiBzdGFydGluZyBmbG93IGlkPSVkLCBtYXggZmxvdyBpZD0lZFxuIiwKKyAgICAgICAgICAgIE1BQ19VVElMX0ZMT1dfREJfRkxPV19JRF9TVEFSVF9WQUwsIE1BQ19VVElMX0ZMT1dfREJfRkxPV19JRF9NQVhfVkFMKTsKKworICAgIGZvciAoaWZfaWQ9MDsgaWZfaWQgPCBOVU1fU1VQUE9SVEVEX1NVQlNDUklCRVJfSU5URVJGQUNFUzsgaWZfaWQrKykKKyAgICB7CisgICAgICAgIC8qIGJlZm9yZSBldmVyeSBkYiBzZWdtZW50LCBOVUxMIHRoZSBjdXJyZW50IGVudHJ5ICovCisgICAgICAgIHBfY3VycmVudF9lbnRyeSA9IE5VTEw7CisgICAgICAgIHBfbmV4dF9lbnRyeSA9IE5VTEw7CisKKyAgICAgICAgLyogZ2V0IGZpcnN0ICovCisgICAgICAgIHBfY3VycmVudF9lbnRyeSA9IF9tYWNfdXRpbF9kYl9mbG93X2dldF9uZXh0X3dfZmxvd19rZXkgKGlmX2lkLCBwX2N1cnJlbnRfZW50cnksICZwX25leHRfZW50cnkpOworICAgICAgICB3aGlsZSAoTlVMTCAhPSBwX2N1cnJlbnRfZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICAgICAgcHJpbnRmICgiXG5mbG93X2lkID0gJWQgZmxvd190eXBlID0gJWRcbiIsIHBfY3VycmVudF9lbnRyeS0+YmFsX2Zsb3dfa2V5LmZsb3dfaWQsIHBfY3VycmVudF9lbnRyeS0+YmFsX2Zsb3dfa2V5LmZsb3dfdHlwZSk7CisgICAgICAgICAgICBwcmludGYgKCJcbiBpZl9pZCA9ICVkIHN1Yl90ZXJtX2lkID0gJWQgc3ZjX3BvcnRfaWQgPSAlZCBhZ2dfaWQgPSAlZCB2bGFuX2lkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgcF9jdXJyZW50X2VudHJ5LT5pZl9pZCwgcF9jdXJyZW50X2VudHJ5LT5zdWJfdGVybV9pZCwgcF9jdXJyZW50X2VudHJ5LT5zdmNfcG9ydF9pZCwgcF9jdXJyZW50X2VudHJ5LT5hZ2dfaWQsIHBfY3VycmVudF9lbnRyeS0+dmxhbl9pZCk7CisgICAgICAgICAgICBwcmludGYoIlxuIGlzX3dhaXRpbmdfZm9yX3N2Y19wb3J0X2FjdGl2ZSA9ICVzIGlzX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkPSVzIGluZF9zZW50ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgcF9jdXJyZW50X2VudHJ5LT5pc193YWl0aW5nX2Zvcl9zdmNfcG9ydF9hY3RpdmU9PUJDTU9TX1RSVUUgPyAidHJ1ZSIgOiAiZmFsc2UiLAorICAgICAgICAgICAgICAgIHBfY3VycmVudF9lbnRyeS0+aXNfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQ9PUJDTU9TX1RSVUUgPyAidHJ1ZSIgOiAiZmFsc2UiLAorICAgICAgICAgICAgICAgIHBfY3VycmVudF9lbnRyeS0+aW5kX3NlbnQpOworICAgICAgICAgICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKyAgICAgICAgICAgIC8qIGdldCBuZXh0ICovCisgICAgICAgICAgICBwX2N1cnJlbnRfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X2Zsb3dfa2V5IChpZl9pZCwgcF9jdXJyZW50X2VudHJ5LCAmcF9uZXh0X2VudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2NtZF9mbG93c19wcmludF9mb3JfZ2VtKGJjbWNsaV9zZXNzaW9uICpzZXNzLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuUGFybXMpCit7CisgICAgZmxvd19saXN0X2VudHJ5ICpwX2N1cnJlbnRfZW50cnkgPSBOVUxMOworICAgIHZvaWQgKnBfcnNjX21ncl9jdXJyX2VudHJ5ID0gTlVMTDsKKyAgICB2b2lkICpwX3JzY19tZ3JfbmV4dF9lbnRyeSA9IE5VTEw7CisKKyAgICB1aW50MzJfdCBpZl9pZCA9IDA7CisKKyAgICBwcmludGYoIkZsb3cgREIgZm9yIGEgR0VNIHBvcnQgWyVsZF06IHN0YXJ0aW5nIGZsb3cgaWQ9JWQsIG1heCBmbG93IGlkPSVkXG4iLAorICAgICAgICAgICAgcGFybVswXS52YWx1ZS51bnVtYmVyLCBNQUNfVVRJTF9GTE9XX0RCX0ZMT1dfSURfU1RBUlRfVkFMLCBNQUNfVVRJTF9GTE9XX0RCX0ZMT1dfSURfTUFYX1ZBTCk7CisKKyAgICBmb3IgKGlmX2lkPTA7IGlmX2lkIDwgTlVNX1NVUFBPUlRFRF9TVUJTQ1JJQkVSX0lOVEVSRkFDRVM7IGlmX2lkKyspCisgICAgeworICAgICAgICAvKiBiZWZvcmUgZXZlcnkgZGIgc2VnbWVudCwgTlVMTCB0aGUgY3VycmVudCBlbnRyeSAqLworICAgICAgICBwX2N1cnJlbnRfZW50cnkgPSBOVUxMOworCisgICAgICAgIC8qIGdldCBmaXJzdCAqLworICAgICAgICBwX2N1cnJlbnRfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X2dlbSAoaWZfaWQsIHBhcm1bMF0udmFsdWUudW51bWJlciwgJnBfcnNjX21ncl9jdXJyX2VudHJ5LCAmcF9yc2NfbWdyX25leHRfZW50cnkpOworICAgICAgICB3aGlsZSAoTlVMTCAhPSBwX2N1cnJlbnRfZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICAgICAgcHJpbnRmICgiXG5mbG93X2lkID0gJWQgZmxvd190eXBlID0gJWRcbiIsIHBfY3VycmVudF9lbnRyeS0+YmFsX2Zsb3dfa2V5LmZsb3dfaWQsIHBfY3VycmVudF9lbnRyeS0+YmFsX2Zsb3dfa2V5LmZsb3dfdHlwZSk7CisgICAgICAgICAgICBwcmludGYgKCJcbiBpZl9pZCA9ICVkIHN1Yl90ZXJtX2lkID0gJWQgc3ZjX3BvcnRfaWQgPSAlZCBhZ2dfaWQgPSAlZCB2bGFuX2lkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgcF9jdXJyZW50X2VudHJ5LT5pZl9pZCwgcF9jdXJyZW50X2VudHJ5LT5zdWJfdGVybV9pZCwgcF9jdXJyZW50X2VudHJ5LT5zdmNfcG9ydF9pZCwgcF9jdXJyZW50X2VudHJ5LT5hZ2dfaWQsIHBfY3VycmVudF9lbnRyeS0+dmxhbl9pZCk7CisgICAgICAgICAgICBwcmludGYoIlxuIGlzX3dhaXRpbmdfZm9yX3N2Y19wb3J0X2FjdGl2ZSA9ICVzIGlzX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkPSVzIGluZF9zZW50ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgcF9jdXJyZW50X2VudHJ5LT5pc193YWl0aW5nX2Zvcl9zdmNfcG9ydF9hY3RpdmU9PUJDTU9TX1RSVUUgPyAidHJ1ZSIgOiAiZmFsc2UiLAorICAgICAgICAgICAgICAgIHBfY3VycmVudF9lbnRyeS0+aXNfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQ9PUJDTU9TX1RSVUUgPyAidHJ1ZSIgOiAiZmFsc2UiLAorICAgICAgICAgICAgICAgIHBfY3VycmVudF9lbnRyeS0+aW5kX3NlbnQpOworICAgICAgICAgICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKyAgICAgICAgICAgIC8qIGdldCBuZXh0ICovCisgICAgICAgICAgICBwX2N1cnJlbnRfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X2dlbSAoaWZfaWQsIHBhcm1bMF0udmFsdWUudW51bWJlciwgJnBfcnNjX21ncl9jdXJyX2VudHJ5LCAmcF9yc2NfbWdyX25leHRfZW50cnkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworc3RhdGljIGJjbW9zX2Vycm5vIF9jbWRfZmxvd3NfcHJpbnRfZm9yX2FsbG9jX2lkKGJjbWNsaV9zZXNzaW9uICpzZXNzLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuUGFybXMpCit7CisgICAgZmxvd19saXN0X2VudHJ5ICpwX2N1cnJlbnRfZW50cnkgPSBOVUxMOworICAgIHZvaWQgKnBfcnNjX21ncl9jdXJyX2VudHJ5ID0gTlVMTDsKKyAgICB2b2lkICpwX3JzY19tZ3JfbmV4dF9lbnRyeSA9IE5VTEw7CisKKyAgICB1aW50MzJfdCBpZl9pZCA9IDA7CisKKyAgICBwcmludGYoIkZsb3cgREIgZm9yIGEgQWxsb2MgSWQgWyVsZF06IHN0YXJ0aW5nIGZsb3cgaWQ9JWQsIG1heCBmbG93IGlkPSVkXG4iLAorICAgICAgICAgICAgcGFybVswXS52YWx1ZS51bnVtYmVyLCBNQUNfVVRJTF9GTE9XX0RCX0ZMT1dfSURfU1RBUlRfVkFMLCBNQUNfVVRJTF9GTE9XX0RCX0ZMT1dfSURfTUFYX1ZBTCk7CisKKyAgICBmb3IgKGlmX2lkPTA7IGlmX2lkIDwgTlVNX1NVUFBPUlRFRF9TVUJTQ1JJQkVSX0lOVEVSRkFDRVM7IGlmX2lkKyspCisgICAgeworICAgICAgICAvKiBiZWZvcmUgZXZlcnkgZGIgc2VnbWVudCwgTlVMTCB0aGUgY3VycmVudCBlbnRyeSAqLworICAgICAgICBwX2N1cnJlbnRfZW50cnkgPSBOVUxMOworCisgICAgICAgIC8qIGdldCBmaXJzdCAqLworICAgICAgICBwX2N1cnJlbnRfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X2FsbG9jX2lkIChpZl9pZCwgcGFybVswXS52YWx1ZS51bnVtYmVyLCAmcF9yc2NfbWdyX2N1cnJfZW50cnksICZwX3JzY19tZ3JfbmV4dF9lbnRyeSk7CisgICAgICAgIHdoaWxlIChOVUxMICE9IHBfY3VycmVudF9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgICAgICBwcmludGYgKCJcbmZsb3dfaWQgPSAlZCBmbG93X3R5cGUgPSAlZFxuIiwgcF9jdXJyZW50X2VudHJ5LT5iYWxfZmxvd19rZXkuZmxvd19pZCwgcF9jdXJyZW50X2VudHJ5LT5iYWxfZmxvd19rZXkuZmxvd190eXBlKTsKKyAgICAgICAgICAgIHByaW50ZiAoIlxuIGlmX2lkID0gJWQgc3ViX3Rlcm1faWQgPSAlZCBzdmNfcG9ydF9pZCA9ICVkIGFnZ19pZCA9ICVkIHZsYW5faWQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICBwX2N1cnJlbnRfZW50cnktPmlmX2lkLCBwX2N1cnJlbnRfZW50cnktPnN1Yl90ZXJtX2lkLCBwX2N1cnJlbnRfZW50cnktPnN2Y19wb3J0X2lkLCBwX2N1cnJlbnRfZW50cnktPmFnZ19pZCwgcF9jdXJyZW50X2VudHJ5LT52bGFuX2lkKTsKKyAgICAgICAgICAgIHByaW50ZigiXG4gaXNfd2FpdGluZ19mb3Jfc3ZjX3BvcnRfYWN0aXZlID0gJXMgaXNfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQ9JXMgaW5kX3NlbnQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICBwX2N1cnJlbnRfZW50cnktPmlzX3dhaXRpbmdfZm9yX3N2Y19wb3J0X2FjdGl2ZT09QkNNT1NfVFJVRSA/ICJ0cnVlIiA6ICJmYWxzZSIsCisgICAgICAgICAgICAgICAgcF9jdXJyZW50X2VudHJ5LT5pc19jb25maWd1cmF0aW9uX2NvbXBsZXRlZD09QkNNT1NfVFJVRSA/ICJ0cnVlIiA6ICJmYWxzZSIsCisgICAgICAgICAgICAgICAgcF9jdXJyZW50X2VudHJ5LT5pbmRfc2VudCk7CisgICAgICAgICAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworICAgICAgICAgICAgLyogZ2V0IG5leHQgKi8KKyAgICAgICAgICAgIHBfY3VycmVudF9lbnRyeSA9IF9tYWNfdXRpbF9kYl9mbG93X2dldF9uZXh0X3dfYWxsb2NfaWQgKGlmX2lkLCBwYXJtWzBdLnZhbHVlLnVudW1iZXIsICZwX3JzY19tZ3JfY3Vycl9lbnRyeSwgJnBfcnNjX21ncl9uZXh0X2VudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qIFVwZGF0ZSBDTEkgYmFzZWQgb24gdGhlIHN5c3RlbSBtb2RlICovCitzdGF0aWMgdm9pZCBoYW5kbGVfc3lzdGVtX21vZGVfY2hhbmdlKGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgaWYgKGRldiA9PSBjdXJyZW50X2RldmljZSkKKyAgICB7CisgICAgICAgIGJjbWNsaV9lbnRyeSAqY3VyX2RpciA9IGJjbWNsaV9kaXJfZ2V0KGN1cnJlbnRfc2Vzc2lvbik7CisgICAgICAgIGNoYXIgb2xkX2Rpcl9uYW1lWzMyXSA9ICIiOworCisgICAgICAgIGlmIChjdXJfZGlyKQorICAgICAgICAgICAgc3RybmNweShvbGRfZGlyX25hbWUsIGJjbWNsaV90b2tlbl9uYW1lKGN1cl9kaXIpLCBzaXplb2Yob2xkX2Rpcl9uYW1lKSAtIDEpOworCisgICAgICAgIGJjbWNsaV9kaXJfc2V0KGN1cnJlbnRfc2Vzc2lvbiwgbWFwbGVfZGlyKTsKKyAgICAgICAgYXBpX2NsaV9zZXRfY29tbWFuZHMoY3VycmVudF9zZXNzaW9uKTsKKworICAgICAgICAvKiBSZXN0b3JlIGN1cnJlbnQgQ0xJIGRpcmVjdG9yeSAqLworICAgICAgICBjdXJfZGlyID0gYmNtY2xpX2Rpcl9maW5kKE5VTEwsIG9sZF9kaXJfbmFtZSk7CisgICAgICAgIGJjbWNsaV9kaXJfc2V0KGN1cnJlbnRfc2Vzc2lvbiwgY3VyX2Rpcik7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIG1hY191dGlsX2NsaV9pbml0CisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIG1haW4gdG8gaW5pdGlhbGl6ZSB0aGUgbWFjX2FwcCBjbGksCisgKnRoYXQgaXMgdXNlZCBmb3IgaW50ZXJuYWwgdW5pdCB0ZXN0aW5nLgorICoKKyAqIEBwYXJhbSBjbGlfZGlyIC0gYSBwb2ludGVyIHRvIHRoZSBjbGkgZGlyZWN0b3J5IHRvIGluaXQgdGhhdCBjbGkgaW4KKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICpjbGlfZGlyKQoreworICAgIGJjbWNsaV9lbnRyeSAqcF9jbGlfZGlyOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGRvCisgICAgeworICAgICAgICBwX2NsaV9kaXIgPSBiY21jbGlfZGlyX2FkZChjbGlfZGlyLCAiTWFjX1V0aWwiLCAiTWFjIFV0aWwgKGRlYnVnKSIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworCisgICAgICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0ocF9jbGlfZGlyLCAicHJpbnRfZmxvd3MiLCAicHJpbnQgbWFjIGFwcCBmbG93cyBsaXN0IiwgX2NtZF9mbG93c19wcmludCk7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChwX2NsaV9kaXIsICJwcmludF9mbG93c19mb3JfZ2VtIiwgInByaW50IG1hYyBmbG93cyBzaGFyaW5nIGEgR0VNIHBvcnQiLCBfY21kX2Zsb3dzX3ByaW50X2Zvcl9nZW0sCisgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZ2VtX3BvcnRfaWQiLCAiR0VNIFBvcnQgSWQiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSk7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChwX2NsaV9kaXIsICJwcmludF9mbG93c19mb3JfYWxsb2NfaWQiLCAicHJpbnQgbWFjIGZsb3dzIHNoYXJpbmcgYW4gQWxsb2MgSWQiLCBfY21kX2Zsb3dzX3ByaW50X2Zvcl9hbGxvY19pZCwKKyAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhbGxvY19pZCIsICJBbGxvYyBJZCIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApKTsKKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBiYWwgYXBpIGNsaSBVSSAqLworICAgICAgICBtYXBsZV9kaXIgPSBiY21jbGlfZGlyX2FkZChOVUxMLCAibWFwbGUiLCAiTWFwbGUgQVBJIGFjY2VzcyIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworCisgICAgICAgIHNtX2NoYW5nZV9jYiA9IGhhbmRsZV9zeXN0ZW1fbW9kZV9jaGFuZ2U7CisKKyAgICAgICAgLyogSW5pdCBkZXZpY2Ugc2VsZWN0b3IgKi8KKyAgICAgICAgcmMgPSBiY21vbHRfZGV2X3NlbF9pbml0KG1hcGxlX2Rpcik7CisKKyAgICAgICAgLyogQWRkIE1hcGxlIEFQSSBjb21tYW5kcyAqLworICAgICAgICByYyA9IHJjID8gcmMgOiBhcGlfY2xpX2luaXQobWFwbGVfZGlyLCBjdXJyZW50X3Nlc3Npb24pOworCisjaWZkZWYgQk9BUkQKKyAgICAgICAgcmMgPSByYyA/IHJjIDogYmNtX2JvYXJkX2luaXQoKTsKKyAgICAgICAgcmMgPSByYyA/IHJjIDogYmNtX2JvYXJkX2NsaV9pbml0KE5VTEwpOworI2VuZGlmCisgICAgICAgIHJjID0gcmMgPyByYyA6IGJjbXRyX2luaXQoKTsKKyAgICAgICAgcmMgPSByYyA/IHJjIDogYmNtdHJfY2xkX2NsaV9pbml0KCk7CisgICAgICAgIHJjID0gcmMgPyByYyA6IGJjbXRyX2NsaV9pbml0KCk7CisKKyAgICB9IHdoaWxlKDApOworCisgICAgcmV0dXJuIHJjOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFVuLWluaXRpYWxpemUgdGhlIG1hYyB1dGlsIGludGVybmFsIGRhdGEgc3RydWN0dXJlcworICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vID09IEJDTV9FUlJfT0sKKyAqCisgKiBAbm90ZSB0aGlzIHJvdXRpbmUgZG9lcyBub3Qgc2VlbSB0byBiZSB1c2VkIGN1cnJlbnRseQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfZmluaXNoKHZvaWQpCit7CisgICAgZmxvd19saXN0X2VudHJ5ICpwX2N1cnJlbnRfZW50cnkgPSBOVUxMLCAqcF9uZXh0X2VudHJ5ID0gTlVMTDsKKyAgICB1aW50MzJfdCBpZl9pZCA9IDA7CisKKyAgICBmb3IgKGlmX2lkPTA7IGlmX2lkIDwgTlVNX1NVUFBPUlRFRF9TVUJTQ1JJQkVSX0lOVEVSRkFDRVM7IGlmX2lkKyspCisgICAgeworICAgICAgICAvKiBiZWZvcmUgZXZlcnkgZGIgc2VnbWVudCwgTlVMTCB0aGUgY3VycmVudCBlbnRyeSAqLworICAgICAgICBwX2N1cnJlbnRfZW50cnkgPSBOVUxMOworICAgICAgICBwX25leHRfZW50cnkgPSBOVUxMOworCisgICAgICAgIC8qIEZyZWUgYWxsIHRoZSBlbnRyaWVzIG9uIHRoZSBmbG93cyBsaXN0ICovCisgICAgICAgIC8qIGdldCBmaXJzdCAqLworICAgICAgICBwX2N1cnJlbnRfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X2Zsb3dfa2V5IChpZl9pZCwgcF9jdXJyZW50X2VudHJ5LCAmcF9uZXh0X2VudHJ5KTsKKyAgICAgICAgd2hpbGUgKE5VTEwgIT0gcF9jdXJyZW50X2VudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCwgYW5kIGZyZWUgbWVtb3J5ICovCisgICAgICAgICAgICBfbWFjX3V0aWxfZGJfZmxvd19yZW1vdmUgKGlmX2lkLCBwX2N1cnJlbnRfZW50cnkpOworICAgICAgICAgICAgX21hY191dGlsX2RiX2Zsb3dfZnJlZSAoaWZfaWQsIHBfY3VycmVudF9lbnRyeSk7CisKKyAgICAgICAgICAgIC8qIGdldCBuZXh0ICovCisgICAgICAgICAgICBwX2N1cnJlbnRfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X2Zsb3dfa2V5IChpZl9pZCwgcF9jdXJyZW50X2VudHJ5LCAmcF9uZXh0X2VudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zd192ZXJzaW9uX3ZhbGlkYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisJYmNtb2x0X2RldmljZV9jZmcgY2ZnID0ge307CisJYmNtb2x0X2RldmljZV9rZXkga2V5ID0ge307CisJYmNtb3NfZXJybm8gcmM7CisKKwlCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGV2aWNlLCBrZXkpOworCUJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pOworCXJjID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmY2ZnLmhkcik7CisJaWYgKHJjICE9IEJDTV9FUlJfT0spCisJeworCQlCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsICJVbmFibGUgdG8gZ2V0IE9MVCBTVyB2ZXJzaW9uXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX21hY191dGlsLAorICAgICAgICAiQWN0dWFsIE9MVCBTVyB2ZXJzaW9uICVkLiVkLiVYIChPYmplY3QgbW9kZWwgcmV2aXNpb24gJWQpXG4iLAorCQljZmcuZGF0YS5ob3N0X3N3X3ZlcnNpb24ubWFqb3IsCisJCWNmZy5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5taW5vciwKKwkJY2ZnLmRhdGEuaG9zdF9zd192ZXJzaW9uLnJldmlzaW9uLAorCQljZmcuZGF0YS5ob3N0X3N3X3ZlcnNpb24ubW9kZWwpOworCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICJCQUwgT0xUIFNXIHZlcnNpb24gJWQuJWQuJVggKE9iamVjdCBtb2RlbCByZXZpc2lvbiAlZClcbiIsCisgICAgICAgIEJDTU9MVF9IT1NUX01BSk9SX1ZFUiwKKyAgICAgICAgQkNNT0xUX0hPU1RfTUlOT1JfVkVSLAorICAgICAgICBCQ01PTFRfSE9TVF9SRVZJU0lPTl9WRVIsCisgICAgICAgIEJDTU9MVF9NT0RFTF9SRVZJU0lPTik7CisKKyAgICAvKiBDaGVjayBmb3IgdmVyc2lvbnMgbWlzbWF0Y2ggKi8KKyAgICBpZiAoY2ZnLmRhdGEuaG9zdF9zd192ZXJzaW9uLm1ham9yICE9IEJDTU9MVF9IT1NUX01BSk9SX1ZFUiB8fAorICAgIAljZmcuZGF0YS5ob3N0X3N3X3ZlcnNpb24ubWlub3IgIT0gQkNNT0xUX0hPU1RfTUlOT1JfVkVSIHx8CisJCWNmZy5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5yZXZpc2lvbiAhPSBCQ01PTFRfSE9TVF9SRVZJU0lPTl9WRVIgfHwKKwkJY2ZnLmRhdGEuaG9zdF9zd192ZXJzaW9uLm1vZGVsICE9IEJDTU9MVF9NT0RFTF9SRVZJU0lPTikKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwgSU5CT0xEX0JBRCgKKyAgICAgICAgIlNXIHZlcnNpb25zIG1pc21hdGNoOiBCQUwgd2FzIGNvbXBsaWVkIHdpdGggT1RMIFNXIHZlcnNpb24gJWQuJWQuJVggKE9iamVjdCBtb2RlbCByZXZpc2lvbiAlZCksICIKKyAgICAgICAgIndoaWxlIGFjdHVhbCBPTFQgU1cgdmVyc2lvbiBpcyAlZC4lZC4lWCAoT2JqZWN0IG1vZGVsIHJldmlzaW9uICVkKVxuIiksCisgICAgICAgIEJDTU9MVF9IT1NUX01BSk9SX1ZFUiwKKyAgICAgICAgQkNNT0xUX0hPU1RfTUlOT1JfVkVSLAorICAgICAgICBCQ01PTFRfSE9TVF9SRVZJU0lPTl9WRVIsCisgICAgICAgIEJDTU9MVF9NT0RFTF9SRVZJU0lPTiwKKwkJY2ZnLmRhdGEuaG9zdF9zd192ZXJzaW9uLm1ham9yLAorCQljZmcuZGF0YS5ob3N0X3N3X3ZlcnNpb24ubWlub3IsCisJCWNmZy5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5yZXZpc2lvbiwKKwkJY2ZnLmRhdGEuaG9zdF9zd192ZXJzaW9uLm1vZGVsKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfU1RBVEU7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvYmFsX21hY191dGlsLmggYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL21hYy9iYWxfbWFjX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMGJmNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvYmFsX21hY191dGlsLmgKQEAgLTAsMCArMSwyOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKgorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICoKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKgorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICoKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBAZmlsZSBiYWxfbWFjX3V0aWwuaAorICoKKyAqIEBicmllZiBNYWMgdXRpbCBpbnRlcmZhY2VzIGhlYWRlciBmaWxlCisgKgorICogVGhpcyBmaWxlIGV4cG9zZSB0aGUgQVBJcyB0byB0aGUgY29yZSB0byBjb25maWd1cmUgdGhlIG1hYworICogd2l0aCByZWdhcmRpbmcgdG8gdGhlIG9wZXJhdGlvbiBvZiBhY2Nlc3MgdGVybWluYWwsIGludGVyZmFjZSwgc3Vic2NyaWJlciB0ZXJtaW5hbCBhbmQgZmxvdy4KKyAqCisgKiBAZGVmZ3JvdXAgbWFjX3V0aWwgTWFjIFV0aWwKKyAqIEBpbmdyb3VwIGNvcmUKKyAqLworCisjaWZuZGVmIEJBTF9NQUNfVVRJTF9ICisjZGVmaW5lIEJBTF9NQUNfVVRJTF9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisjaW5jbHVkZSA8YWNjX3Rlcm1fZnNtLmg+CisjaW5jbHVkZSA8c3ViX3Rlcm1fZnNtLmg+CisjaW5jbHVkZSA8Zmxvd19mc20uaD4KKyNpbmNsdWRlIDxncm91cF9mc20uaD4KKyNpbmNsdWRlIDx0bV9zY2hlZF9mc20uaD4KKyNpbmNsdWRlIDxiYWxfdXRpbHNfbXNnLmg+CisKKyNpbmNsdWRlIDxiYWxfY29tbW9uLmg+CisjaW5jbHVkZSA8YmFsX21hY191dGlsLmg+CisjaW5jbHVkZSA8cnNjX21nci5oPgorI2luY2x1ZGUgPGJhbF9hcHBfY29tbW9uX3V0aWxzLmg+CisjaW5jbHVkZSA8YmFsX3V0aWxzLmg+CisjaW5jbHVkZSA8YmFsX3dvcmtlci5oPgorI2luY2x1ZGUgPGJhbF9tc2cuaD4KKyNpbmNsdWRlIDxiY21fdG9wby5oPgorCisjaWZkZWYgRU5BQkxFX0xPRworI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmNtdHJfZGVidWdfY2xpLmg+CisjZW5kaWYgLy9FTkFCTEVfTE9HCisKKworLypAeyovCisKKy8qKiBAYnJpZWYgbm9uZSBmYWlsIHJlYXNvbiBmb3Igc3ViIHRlcm0gZGVhY3RpdmF0aW9uLiBEZWZpbmVkIGxvY2FsbHksIHNpbmNlIE1hcGxlIFNESyBkb2VzIG5vdCBkZWZpbmUgdGhpcy4gKi8KKyNkZWZpbmUgTUFDX1VUSUxfREVBQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX05PTkUgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fTk9ORQorCisvKioKKyAqIEBicmllZiBUaGUgZm9sbG93aW5nIG1hY3JvcyBkZWZpbmUgdGhlIG1heCBhbmQgbWluIHVzZXIgZmxvdyBJZCB2YWx1ZXMgYW5kIHRoZSBjaGVjayBmb3IgYSB2YWxpZCBmbG93IElkLgorICovCitleHRlcm4gdWludDMyX3QgbWFjX3V0aWxfZmxvd19pZF9zdGFydF92YWw7CisjZGVmaW5lIE1BQ19VVElMX0ZMT1dfREJfRkxPV19JRF9TVEFSVF9WQUwgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWNfdXRpbF9mbG93X2lkX3N0YXJ0X3ZhbCkKKyNkZWZpbmUgTUFDX1VUSUxfRkxPV19EQl9GTE9XX0lEX01BWF9WQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1BQ19VVElMX0ZMT1dfREJfRkxPV19JRF9TVEFSVF9WQUwrQkFMX0FDQ19URVJNX01BWF9GTE9XUy0xKQorCisjZGVmaW5lIE1BQ19VVElMX0ZMT1dfREJfRkxPV19JRF9TVEFSVF9WQUxfQ09ORklHKF9zdGFydF92YWwpICAgICAgIChtYWNfdXRpbF9mbG93X2lkX3N0YXJ0X3ZhbCA9IChfc3RhcnRfdmFsKSkKKworI2RlZmluZSBNQUNfVVRJTF9GTE9XX0RCX0ZMT1dfSURfSVNfVkFMSUQoX2Zsb3dfaWQpICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKF9mbG93X2lkKSA+PSBNQUNfVVRJTF9GTE9XX0RCX0ZMT1dfSURfU1RBUlRfVkFMKSAmJiAgICAgIFwKKyAgICAgICAgICAgICAgKChfZmxvd19pZCkgPD0gTUFDX1VUSUxfRkxPV19EQl9GTE9XX0lEX01BWF9WQUwpKQorCit0eXBlZGVmIHN0cnVjdCBtYWNfdXRpbF9zbGEgbWFjX3V0aWxfc2xhOworc3RydWN0IG1hY191dGlsX3NsYQoreworICAgIHVpbnQ2NF90IG1pbl9yYXRlOyAvKiBtaW5fcmF0ZSAodGhpcyBpcyBhIHVpbnQ2NF90IGFzIHRoZSB1bml0cyBhcmUgYnl0ZXMgcGVyIHNlY29uZCkgKi8KKyAgICB1aW50NjRfdCBtYXhfcmF0ZTsgLyogbWF4X3JhdGUgKHRoaXMgaXMgYSB1aW50NjRfdCBhcyB0aGUgdW5pdHMgYXJlIGJ5dGVzIHBlciBzZWNvbmQpICovCit9OworCisvKiBmbG93IGVudHJ5IHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgZmxvd19saXN0X2VudHJ5IGZsb3dfbGlzdF9lbnRyeTsKK3N0cnVjdCBmbG93X2xpc3RfZW50cnkKK3sKKyAgICBUQUlMUV9FTlRSWShmbG93X2xpc3RfZW50cnkpIG5leHQ7CisgICAgYmNtYmFsX2Zsb3dfa2V5IGJhbF9mbG93X2tleTsgICAgICAgICAgIC8qIGJhbCBmbG93IGtleSAqLworICAgIHVpbnQzMl90IGlmX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb25fbmkgaWQgKi8KKyAgICB1aW50MzJfdCBzdWJfdGVybV9pZDsgICAgICAgICAgICAgICAgICAgLyogb251X2lkICovCisgICAgdWludDE2X3Qgc3ZjX3BvcnRfaWQ7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBmbG93IHJlbGF0ZWQgZ2VtIHBvcnQgaWQgKi8KKyAgICB1aW50MTZfdCBhZ2dfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGZsb3cgcmVsYXRlZCBhbGxvYy1pZCAqLworICAgIHVpbnQxNl90IHZsYW5faWQ7CisgICAgYmNtb3NfYm9vbCBpc193YWl0aW5nX2Zvcl9zdmNfcG9ydF9hY3RpdmU7IC8qIGluZGljYXRlcyB3aGV0aGVyIHdhaXRpbmcgZm9yIGEgZ2VtIHBvcnQgdG8gYmVjb21lIGFjdGl2ZSAqLworICAgIGJjbW9zX2Jvb2wgaXNfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQ7CisgICAgYmFsX3V0aWxfZmxvd19pbmQgIGluZF9zZW50OyAgICAvKiBpbmRpY2F0ZXMgd2hldGhlciBhbiBpbmRpY2F0aW9uIHdhcyBzZW50IHRvIGNvcmUgbm9uZS9zdWNjZXNzL2ZhaWwgKi8KKyAgICBtYWNfdXRpbF9zbGEgc2xhOyAgICAgICAgICAgICAgIC8qIGl0IHNhdmVzIGEgY29udmVydGVkIHZhbHVlIGZvciB0aGUgU0xBczsgd2UgbWF5IHJldGFpbiB0aGlzIGluIG1hYyB1dGlsICovCisgICAgYmFsX3V0aWxfb3Blcl9mbG93ICBvcF90eXBlOyAgICAvKiBPcGVyYXRpb24gdHlwZTogRkxPV19BREQgb3IgRkxPV19SRU1PVkUgKi8KK307CisKKyNkZWZpbmUgUlNSQ19NR1JfS0VFUFNfRkxPV19MSVNUX1BFUl9HRU0gICAgQkNNT1NfRkFMU0UKKworZXh0ZXJuIGRldl9sb2dfaWQgICBsb2dfaWRfbWFjX3V0aWw7CitleHRlcm4gZGV2X2xvZ19pZCAgIGxvZ19pZF9tYWNfdXRpbF9wb25faWZbXTsKKy8qKiBAZGVmIGdldCBsb2cgSWQgZm9yIHBvbiBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKF9wb25faWZfaWQpICAgKGxvZ19pZF9tYWNfdXRpbF9wb25faWZbKF9wb25faWZfaWQpXSkKKworCisvKiogQGRlZiBzeXN0ZW0gZGVmYXVsdCB0cmFuc2NlaXZlciB0eXBlICovCisjZGVmaW5lIEJDTUJBTF9NQUNfVVRJTF9UUlhfVFlQRV9ERUZBVUxUX0dQT04gQkNNQkFMX1RSWF9UWVBFX0dQT05fTFRFXzM2ODBfTQorI2RlZmluZSBCQ01CQUxfTUFDX1VUSUxfVFJYX1RZUEVfREVGQVVMVF9YR1BPTiBCQ01CQUxfVFJYX1RZUEVfWEdQT05fTFRIXzcyMjJfUEMKKyNkZWZpbmUgQkNNQkFMX01BQ19VVElMX1RSWF9UWVBFX0RFRkFVTFRfWEdTIEJDTUJBTF9UUlhfVFlQRV9YR1BPTl9MVEhfNTMwMl9QQworCisKKy8qKgorICogQGJyaWVmIGlzIHZhbGlkIHBvbiBpbnRlcmZhY2UgaWQKKyAqIEB0b2RvIHNlZSBpZiBpdCBpcyBmZWFzaWJsZSB0byB0aWUgaXQgdXAgd2l0aCBzeXN0ZW0gbW9kZS4gSG93ZXZlcgorICoga2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBjaGVjayB3b3VsZCBiZSBjYWxsZWQgZm9yIGV2ZXJ5IGRiIGFwaSBjYWxsLgorICovCisjZGVmaW5lIElTX1ZBTElEX1BPTl9JRihfcG9uX2lmKSAgIChOVU1fU1VQUE9SVEVEX1NVQlNDUklCRVJfSU5URVJGQUNFUyA+IChfcG9uX2lmKSkKKworCisvKiBGdW5jdGlvbiBQcm90b3R5cGVzIGZvciBleHRlcm5hbCAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3N3X3ZlcnNpb25fdmFsaWRhdGUoYmNtb2x0X2RldmlkIGRldmljZSk7CitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0KGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSk7CitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfaW5mb192YWxpZGF0ZShjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZyAqcF9hY2NfdGVybV9yZXEpOworCitiY21vc19lcnJubyBtYWNfdXRpbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3NldChzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtLCBiYWxfdXRpbF9vcGVyX3N1Yl90ZXJtIG9wX3R5cGUsIGJjbW9zX2Jvb2wgaXNfcG9zdF9kaXNjb3ZlcnkpOworYmNtb3NfZXJybm8gbWFjX3V0aWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmZvX3ZhbGlkYXRlKGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZyAqcF9zdWJfdGVybV9yZXEpOworCitiY21vc19lcnJubyBtYWNfdXRpbF9pbnRlcmZhY2Vfc2V0KGFjY190ZXJtX2ludGVyZmFjZSAqcF9pbnRlcmZhY2VfaW5zdCwgYmFsX3V0aWxfb3Blcl9pZiBvcF90eXBlKTsKKworYmNtb3NfZXJybm8gbWFjX3V0aWxfZmxvd19zZXQoZmxvd19pbnN0ICpwX2Zsb3dfY29yZSwgYmFsX3V0aWxfb3Blcl9mbG93IG9wX3R5cGUpOworYmNtb3NfZXJybm8gbWFjX3V0aWxfZmxvd19pbmZvX3ZhbGlkYXRlKGNvbnN0IGJjbWJhbF9mbG93X2NmZyAqcF9mbG93X3JlcSk7CisKK2JjbW9zX2Vycm5vIG1hY191dGlsX2dyb3VwX3NldChncm91cF9pbnN0ICpwX2Zsb3csIGJhbF91dGlsX29wZXJfZ3JvdXAgb3BfdHlwZSwgYmNtb3NfYm9vbCBzZW5kX2luZCk7CitiY21vc19lcnJubyBtYWNfdXRpbF9ncm91cF9pbmZvX3ZhbGlkYXRlKGNvbnN0IGJjbWJhbF9ncm91cF9jZmcgKnBfZ3JvdXBfcmVxKTsKKworYmNtb3NfZXJybm8gbWFjX3V0aWxfdG1fc2NoZWRfaW5mb192YWxpZGF0ZShjb25zdCBiY21iYWxfdG1fc2NoZWRfY2ZnICpwX3RtX3NjaGVkX3JlcSk7CitiY21vc19lcnJubyBtYWNfdXRpbF9hZ2dfcG9ydF9zZXQodG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZCwgYmFsX3V0aWxfb3Blcl9hZ2dfcG9ydCBvcF90eXBlKTsKKworCitiY21vc19lcnJubyBtYWNfdXRpbF9pbml0KGNvbnN0IGNoYXIgKm1hcGxlX2FkZHJlc3MpOworCitiY21vc19lcnJubyBtYWNfdXRpbF9jbGlfaW5pdChiY21jbGlfZW50cnkgKnBfY2xpX2Rpcik7CisKK3ZvaWQgbWFjX3V0aWxfaW5kaWNhdGlvbl9jYihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZyk7CisKK2JjbW9zX2Vycm5vIG1hY191dGlsX2ZpbmlzaCh2b2lkKTsKKworLyogcmVwb3J0aW5nIGZ1bmN0aW9ucyB0byBjb3JlICovCit2b2lkIG1hY191dGlsX3JlcG9ydF9mbG93X2FkZF9zdWNjZXNzKGJjbWJhbF9mbG93X2tleSBmbG93X2tleSwgdWludDMyX3QgcG9uX2lmKTsKK3ZvaWQgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfYWRkX2ZhaWxlZChiY21iYWxfZmxvd19rZXkgZmxvd19rZXksIHVpbnQzMl90IHBvbl9pZiwgYmNtb3NfZXJybm8gZXJyKTsKK3ZvaWQgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfcmVtb3ZlX3N1Y2Nlc3MoYmNtYmFsX2Zsb3dfa2V5IGZsb3dfa2V5LCB1aW50MzJfdCBwb25faWYsIGJhbF91dGlsX29wZXJfZmxvdyBvcF90eXBlKTsKK3ZvaWQgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfcmVtb3ZlX2ZhaWxlZChiY21iYWxfZmxvd19rZXkgZmxvd19rZXksIHVpbnQzMl90IHBvbl9pZiwgYmFsX3V0aWxfb3Blcl9mbG93IG9wX3R5cGUsIGJjbW9zX2Vycm5vIGVycik7CisKK3ZvaWQgbWFjX3V0aWxfcmVwb3J0X3RtX3NjaGVkX3NldF9pbmRpY2F0aW9uIChiY21iYWxfdG1fc2NoZWRfa2V5IHRtX3NjaGVkX2tleSwgYmNtb3NfZXJybm8gZXJyLCBiY21vbHRfcmVzdWx0IGluZF9yZXN1bHQpOworCisvKiogQGJyaWVmIGhhbmRsZXIgcm91dGluZSB0eXBlIGZvciBtYXBsZSBpbmRpY2F0aW9uIGhhbmRsZXJzICovCit0eXBlZGVmIGJjbW9zX2Vycm5vIChtYWNfdXRpbF9vbHRfaW5kX2hhbmRsZXIpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9tc2cgKnBfbXNnKTsKKworLyoqIEBicmllZiBnZW5lcmljIHN0cnVjdCBmb3IgbWFwbGUgaW5kaWNhdGlvbiBvYmplY3QgdHlwZXMgYW5kIGhhbmRsZXJzIHRoYXQgd291bGQgYmUgYmUgaGFuZGxlZCBpbiBtYWMgdXRpbCAqLwordHlwZWRlZiBzdHJ1Y3QgbWFjX3V0aWxfb2x0X2luZF9vYmpfYW5kX2hhbmRsZXJzCit7CisgICAgYmNtb2x0X29ial9pZCBvYmpfdHlwZTsKKyAgICBjaGFyICAgICAgICAgIG9ial90eXBlX3N0cls1MF07CisgICAgbWFjX3V0aWxfb2x0X2luZF9oYW5kbGVyICppbmRfaGFuZGxlcjsKK30gbWFjX3V0aWxfaW5kX29ial9hbmRfaGFuZGxlcnM7CisKKworY2hhciAqX21hY191dGlsX2dldF9vYmpfdHlwZV9zdHJfZm9yX2luZGljYXRpb25zICggYmNtb2x0X29ial9pZCBvYmpfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY191dGlsX2luZF9vYmpfYW5kX2hhbmRsZXJzIG9ial90eXBlc19hbmRfaGFuZGxlcnNbXSwgdWludDE2X3QgbnVtX29ial90eXBlcyk7CisKKy8qIG1hcGxlIGluZGljYXRpb24gaGFuZGxlcnMgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2hhbmRsZV9hbGxfb2x0X2luZF9mb3JfZ3BvbiAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpOworYmNtb3NfZXJybm8gbWFjX3V0aWxfaGFuZGxlX2FsbF9vbHRfaW5kX2Zvcl94Z3BvbiAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpOworCisKKy8qIGZsb3cgbWdtdCB3cmFwcGVyIGZ1bmN0aW9ucyAqLworZmxvd19saXN0X2VudHJ5ICpfbWFjX3V0aWxfZGJfZmxvd19hbGxvYyAodm9pZCk7CitiY21vc19lcnJubyBfbWFjX3V0aWxfZGJfZmxvd19mcmVlICh1aW50MzJfdCBwb25faWYsIGZsb3dfbGlzdF9lbnRyeSAqcF9lbnRyeSk7CisKK2JjbW9zX2Vycm5vIF9tYWNfdXRpbF9kYl9mbG93X2FkZCAodWludDMyX3QgcG9uX2lmLCBmbG93X2xpc3RfZW50cnkgKnBfZW50cnkpOworYmNtb3NfZXJybm8gX21hY191dGlsX2RiX2Zsb3dfcmVtb3ZlICh1aW50MzJfdCBwb25faWYsIGZsb3dfbGlzdF9lbnRyeSAqcF9lbnRyeSk7CisKK2Zsb3dfbGlzdF9lbnRyeSAqX21hY191dGlsX2RiX2Zsb3dfZ2V0X3dfZmxvd19rZXkgKHVpbnQzMl90IHBvbl9pZiwgYmNtYmFsX2Zsb3dfa2V5ICpwX2Zsb3dfa2V5KTsKK2Zsb3dfbGlzdF9lbnRyeSAqX21hY191dGlsX2RiX2Zsb3dfZ2V0X25leHRfd19mbG93X2tleSAodWludDMyX3QgcG9uX2lmLCBmbG93X2xpc3RfZW50cnkgKnBfY3Vycl9lbnRyeSwgZmxvd19saXN0X2VudHJ5ICoqcHBfbmV4dF9lbnRyeSk7CisKKworZmxvd19saXN0X2VudHJ5ICpfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X3N1Yl90ZXJtX2lkICh1aW50MzJfdCBwb25faWYsIHVpbnQzMl90IHN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfbGlzdF9lbnRyeSAqcF9jdXJyX2VudHJ5LCBmbG93X2xpc3RfZW50cnkgKipwcF9uZXh0X2VudHJ5KTsKKworCitiY21vc19lcnJubyBfbWFjX3V0aWxfZGJfZmxvd19jb3VudF93X2dlbSAodWludDMyX3QgcG9uX2lmLCB1aW50MTZfdCBnZW1fcG9ydF9pZCwgdWludDMyX3QgKnBfY291bnQpOworZmxvd19saXN0X2VudHJ5ICpfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X2dlbSAodWludDMyX3QgcG9uX2lmLCB1aW50MTZfdCBnZW1fcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipwcF9yc2NfbWdyX2N1cnJfZW50cnksIHZvaWQgKipwcF9yc2NfbWdyX25leHRfZW50cnkpOworCitiY21vc19lcnJubyBfbWFjX3V0aWxfZGJfZmxvd19jb3VudF93X2FsbG9jX2lkICh1aW50MzJfdCBwb25faWYsIHVpbnQxNl90IGFsbG9jX2lkLCB1aW50MzJfdCAqcF9jb3VudCk7CitmbG93X2xpc3RfZW50cnkgKl9tYWNfdXRpbF9kYl9mbG93X2dldF9uZXh0X3dfYWxsb2NfaWQgKHVpbnQzMl90IHBvbl9pZiwgdWludDE2X3QgYWxsb2NfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipwcF9yc2NfbWdyX2N1cnJfZW50cnksIHZvaWQgKipwcF9yc2NfbWdyX25leHRfZW50cnkpOworCisvKiBpbnRlcmZhY2Ugc2V0ICovCitiY21vc19lcnJubyBtYWNfdXRpbF9pbnRlcmZhY2Vfc2V0X2Zvcl9ncG9uKGFjY190ZXJtX2ludGVyZmFjZSAqcF9pbnRlcmZhY2VfaW5zdCwgYmFsX3V0aWxfb3Blcl9pZiBvcF90eXBlKTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX2ludGVyZmFjZV9zZXRfZm9yX3hncG9uKGFjY190ZXJtX2ludGVyZmFjZSAqcF9pbnRlcmZhY2VfaW5zdCwgYmFsX3V0aWxfb3Blcl9pZiBvcF90eXBlKTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX2ludGVyZmFjZV9zZXRfZm9yX2xvb3BiYWNrKGFjY190ZXJtX2ludGVyZmFjZSAqcF9pbnRlcmZhY2VfaW5zdCwgYmFsX3V0aWxfb3Blcl9pZiBvcF90eXBlKTsKKworLyogc3ViIHRlcm0gdmFsaWRhdGUgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX3ZhbGlkYXRlX3N1YnNjcmliZXJfdGVybWluYWxfaW5mb19mb3JfZ3Bvbihjb25zdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgKnBfc3ViX3Rlcm1fcmVxKTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX3ZhbGlkYXRlX3N1YnNjcmliZXJfdGVybWluYWxfaW5mb19mb3JfeGdwb24oY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpwX3N1Yl90ZXJtX3JlcSk7CisKKy8qIHN1YiB0ZXJtIHNldCAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zZXRfZm9yX2dwb24oc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LCBiYWxfdXRpbF9vcGVyX3N1Yl90ZXJtIG9wX3R5cGUsIGJjbW9zX2Jvb2wgaXNfcG9zdF9kaXNjb3ZlcnkpOworYmNtb3NfZXJybm8gbWFjX3V0aWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zZXRfZm9yX3hncG9uKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgYmFsX3V0aWxfb3Blcl9zdWJfdGVybSBvcF90eXBlLCBiY21vc19ib29sIGlzX3Bvc3RfZGlzY292ZXJ5KTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX3N1YnNjcmliZXJfdGVybWluYWxfc2V0X2Zvcl9sb29wYmFjayhzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIGJhbF91dGlsX29wZXJfc3ViX3Rlcm0gb3BfdHlwZSwgYmNtb3NfYm9vbCBpc19wb3N0X2Rpc2NvdmVyeSk7CisKKy8qIGZsb3cgdmFsaWRhdGVzICovCitiY21vc19lcnJubyBtYWNfdXRpbF92YWxpZGF0ZV9mbG93X2luZm9fZm9yX2dwb24oY29uc3QgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxKTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX3ZhbGlkYXRlX2Zsb3dfaW5mb19mb3JfeGdwb24oY29uc3QgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxKTsKKworCisvKiBmbG93IHNldHMgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2Zsb3dfc2V0X2Zvcl9ncG9uIChiY21iYWxfZmxvd19jZmcgKnBfZmxvd19yZXEsIGJhbF91dGlsX29wZXJfZmxvdyBvcF90eXBlLCBmbG93X2luc3QgKnBfZmxvd19jb3JlKTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX2Zsb3dfc2V0X2Zvcl94Z3BvbiAoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxLCBiYWxfdXRpbF9vcGVyX2Zsb3cgb3BfdHlwZSwgZmxvd19pbnN0ICpwX2Zsb3dfY29yZSk7CitiY21vc19lcnJubyBtYWNfdXRpbF9mbG93X3NldF9mb3JfbG9vcGJhY2soYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxLCBiYWxfdXRpbF9vcGVyX2Zsb3cgb3BfdHlwZSwgZmxvd19pbnN0ICpwX2Zsb3dfY29yZSk7CisKKy8qIGdyb3VwIHNldHMgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2dyb3VwX3NldF9mb3JfZ3BvbiAoYmNtYmFsX2dyb3VwX2NmZyAqcF9ncm91cF9yZXEsIGJhbF91dGlsX29wZXJfZ3JvdXAgb3BfdHlwZSwgZ3JvdXBfaW5zdCAqcF9ncm91cF9jb250ZXh0KTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX2dyb3VwX3NldF9mb3JfeGdwb24gKGJjbWJhbF9ncm91cF9jZmcgKnBfZ3JvdXBfcmVxLCBiYWxfdXRpbF9vcGVyX2dyb3VwIG9wX3R5cGUsIGdyb3VwX2luc3QgKnBfZ3JvdXBfY29udGV4dCk7CisKK2JjbW9zX2Vycm5vIG1hcGxlX2FjY2Vzc190ZXJtaW5hbF9zZXRfY29tbW9uIChhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtLCBiYWxfdXRpbF9vcGVyX2FjY190ZXJtIG9wX3R5cGUsIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpOworYmNtb3NfZXJybm8gbWFwbGVfYWNjZXNzX3Rlcm1pbmFsX2Nvbm5lY3RfY29tbW9uIChiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX2luaXRfcGFyc2VfbWFjX2lwX2FuZF9wb3J0IChjb25zdCBjaGFyICptYXBsZV9hZGRyZXNzKTsKKworCisvKiBSZXBvcnQgZXZlbnRzIHRvIGNvcmUgKi8KK3ZvaWQgbWFjX3V0aWxfcmVwb3J0X2FjY190ZXJtX2V2ZW50KHVpbnQxNl90IGV2ZW50KTsKK3ZvaWQgbWFjX3V0aWxfcmVwb3J0X2lmX2V2ZW50KGJjbWJhbF9pbnRmX2lkIGludGZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfaW50Zl90eXBlIGludGZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX2Vycm5vIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9yZXN1bHQgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3Bvbl9zdGF0ZSBuZXdfc3RhdGUpOworYmNtb3NfZXJybm8gY2hlY2tfc2VuZF9mbG93X2JhbF9pbmRfbXNnKGZsb3dfbGlzdF9lbnRyeSAqcF9mbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX2Vycm5vIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfcmVzdWx0IGluZF9yZXN1bHQpOworCit2b2lkIG1hY191dGlsX3JlcG9ydF9zdWJfdGVybV9ldmVudChiY21iYWxfaW50Zl9pZCBwb25fbmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfc3ViX2lkIG9udV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyICpwX3NlcmlhbF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxfdXRpbF9vcGVyX3N1Yl90ZXJtIG9wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19lcnJubyBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfcmVzdWx0IHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fdHVubmVsX2lkIHR1bm5lbF9pZCk7CisKKworCit2b2lkIG1hY191dGlsX3JlcG9ydF9mbG93X2F1dG9faW5kICh1aW50MzJfdCBwb25faWYsCisgICAgYmNtYmFsX2Zsb3dfa2V5ICBmbG93X2tleSAsYmFsX3V0aWxfb3Blcl9mbG93ICBvcF90eXBlLCBiYWxfdXRpbF9mbG93X2luZCBpbmQpOworCisKKyNkZWZpbmUgTUFDX1VUSUxfRFVNTVlfT05VX0lEX0ZPUl9NVUxUSUNBU1RfR0VNIEJDTU9MVF9HUE9OX09OVV9JRF9BTlkKKworI2RlZmluZSBHRVRfREVWSUNFX0lEX0FORF9QSFlTSUNBTF9JRF9GUk9NX0lGX0lEKF9pZl9pZCwgX2RldmljZV9pZCwgX3BoeXNpY2FsX2lmX2lkKSBcCisgICAgZG8gXAorICAgIHsgXAorICAgICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9sb2dpY2FsMnBoeXNpY2FsKF9pZl9pZCwgJihfZGV2aWNlX2lkKSwgJihfcGh5c2ljYWxfaWZfaWQpKTsgXAorICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKSBcCisgICAgICAgeyBcCisgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihfaWZfaWQpLCBcCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgcGh5c2ljYWwgaWYgZnJvbSBsb2dpY2FsIGlmICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7IFwKKyAgICAgICAgICAgcmV0dXJuIHJjOyBcCisgICAgICAgfSBcCisgICAgfSBcCisgICAgd2hpbGUgKDApCisKKworLypAfSovCisjZW5kaWYgLyogQkFMX01BQ19VVElMX0ggKi8KKworCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbF9jb21tb25faXR1X3Bvbi5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvYmFsX21hY191dGlsX2NvbW1vbl9pdHVfcG9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0YTU3NAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbF9jb21tb25faXR1X3Bvbi5jCkBAIC0wLDAgKzEsMTMzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX21hY191dGlsX2NvbW1vbl9pdHVfcG9uLmMKKyAqCisgKiBAYnJpZWYgbWFjIHV0aWwgaW50ZXJmYWNlcyBkZWZpbml0aW9uIHVzZWQgYnkgQmFsIENvcmUsIGZvciBJVFUgUE9OIGZsYXZvcnMgOiBHUE9OLCBYRy1QT04xLCBYR1MtUE9OICwgTkctUE9OMgorICoKKyAqIFRoaXMgZmlsZSBleHBvc2UgdGhlIEFQSXMgdG8gdGhlIGNvcmUgdG8gY29uZmlndXJlIHRoZSBtYWMgCisgKiB3aXRoIHJlZ2FyZGluZyB0byB0aGUgb3BlcmF0aW9uIG9mIGFjY2VzcyB0ZXJtaW5hbCwgaW50ZXJmYWNlLCBzdWJzY3JpYmVyIHRlcm1pbmFsIGFuZCBmbG93LgorICoKKyAqIEBhZGR0b2dyb3VwIG1hY191dGlsCisgKi8KKworLypAeyovCisKKyNpbmNsdWRlIDxiYWxfbWFjX3V0aWwuaD4KKyNpbmNsdWRlIDxiYWxfbWFjX3V0aWxfY29tbW9uX2l0dV9wb24uaD4KKyNpbmNsdWRlIDxiY21fdG9wby5oPgorCisKKworLyoqCisgKiBAYnJpZWYgZ2V0IHN0cmluZyBmb3IgdGhlIGluZGljYXRpb24gb2JqZWN0IHR5cGUKKyAqLworY2hhciAqbWFjX3V0aWxfaW5kaWNhdGlvbl9nZXRfb2JqX3R5cGVfc3RyKGJjbW9sdF9vYmpfaWQgb2JqX3R5cGUsIG1hY191dGlsX2luZF9vYmpfYW5kX2hhbmRsZXJzIGhhbmRsZXJzW10sIHNpemVfdCBoYW5kbGVyc19zaXplKQoreworICAgIHJldHVybiBfbWFjX3V0aWxfZ2V0X29ial90eXBlX3N0cl9mb3JfaW5kaWNhdGlvbnMob2JqX3R5cGUsIGhhbmRsZXJzLCBoYW5kbGVyc19zaXplKTsKK30KKworCisvKioKKyAqIEBicmllZiBoYW5kbGUgaW5kaWNhdGlvbnMgZm9yIGFueSBQT04gSVRVIGZsYXZvci4KKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfaGFuZGxlX2luZGljYXRpb24oYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2csIG1hY191dGlsX2luZF9vYmpfYW5kX2hhbmRsZXJzIGhhbmRsZXJzW10sIHNpemVfdCBoYW5kbGVyc19zaXplKQoreworICAgIGludCBpID0gMDsKKyAgICBmb3IoaT0wOyBpIDwgaGFuZGxlcnNfc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICBpZihwX21zZy0+b2JqX3R5cGUgPT0gaGFuZGxlcnNbaV0ub2JqX3R5cGUpCisgICAgICAgeworICAgICAgICAgICBpZihOVUxMICE9IGhhbmRsZXJzW2ldLmluZF9oYW5kbGVyKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcnNbaV0uaW5kX2hhbmRsZXIoZGV2aWNlX2lkLCBwX21zZyk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorICAgIC8qIGxvZyBhbiBlcnJvciBpZiB1bmhhbmRsZWQgKi8KKyAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKK30KKworCisKKy8qKgorICogQGJyaWVmIGNoZWNrcyBpZiBhIGdlbSBwb3J0IGlzIGNvbmZpZ3VyZWQgaW4gT0xUIGFscmVhZHkgZm9yIHRoZSBzYW1lIFBPTiBJZiBhbmQgT05VCisgKgorICogQHBhcmFtIHN2Y19wb3J0X2lkICAgZ2VtIHBvcnQKKyAqIEBwYXJhbSBpZl9pZCAgICAgICAgIFBPTiBOSQorICogQHBhcmFtIG9udV9pZCAgICAgICAgT05VIElkCisgKiBAcGFyYW0gaXNfY29uZmlnX3JlcXVpcmVkIFRSVUUvRkFMU0UKKyAqIEBwYXJhbSBpc193YWl0X2Zvcl9pbmRpY2F0aW9uIFRSVUUvRkFMU0UKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKgorICogQHRvZG8gd2l0aCBtdWx0aS10aHJlYWQgc3VwcG9ydCBpbiBmdXR1cmUsIHRoZSBjb2RlIGZyb20gY2hlY2tpbmcgdGhlIG1hcGxlIG9iamVjdAorICogdG8gdGhlIGFjdHVhbCBjb25maWcgd2lsbCBuZWVkIHRvIGJlIGF0b21pYyhpLmUuIHVzaW5nIG11dGV4KS4gVGhpcywgdG8gYXZvaWQgY2xvc2VseSBwYXJhbGxlbCB0aHJlYWRzCisgKiBmcm9tIGdldHRpbmcgYSBzdGF0ZSBvZiBnZW0gc2xpZ2h0bHkgYmVmb3JlIGEgbmV3IGNvbmZpZyBhbm90aGVyIHRocmVhZCB3b3VsZCBtYWtlIG9uIHRoZSBzYW1lIGdlbSwKKyAqIGJlZm9yZSB0aGlzIHRocmVhZCBjb3VsZCBjb25maWd1cmUgaXQuIFRoaXMgYXBwbGllcyB0byBib3RoIGdlbSBhbmQgYWxsb2MgaWQgY2hlY2tzLgorICoKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hcGxlX21hY19jaGVja19nZW1fcG9ydF9pZF9jb25maWcodWludDE2X3Qgc3ZjX3BvcnRfaWQsIHVpbnQzMl90IGlmX2lkLCB1aW50MzJfdCBvbnVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX2Jvb2wgKmlzX2NvbmZpZ19yZXF1aXJlZCwgYmNtb3NfYm9vbCAqaXNfd2FpdF9mb3JfaW5kaWNhdGlvbikKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisJYmNtX3RvcG9fcG9uX3N1Yl9mYW1pbHkgcG9uX3N1Yl9mYW1pbHk7CisgICAgYmNtb3NfYm9vbCBpc19jb25maWd1cmVkID0gQkNNT1NfRkFMU0UsIGlzX2FjdGl2YXRlZCA9IEJDTU9TX0ZBTFNFOworCisgICAgLyogYXNzdW1lIGNvbmZpZyBpcyBub3QgcmVxdWlyZWQsIGlmIHRoZXJlIGlzIGFuIGVycm9yICovCisgICAgKmlzX2NvbmZpZ19yZXF1aXJlZCA9IEJDTU9TX0ZBTFNFOworICAgICppc193YWl0X2Zvcl9pbmRpY2F0aW9uID0gQkNNT1NfRkFMU0U7CisKKyAgICBwb25fc3ViX2ZhbWlseSA9IGJjbV90b3BvX3Bvbl9nZXRfcG9uX3N1Yl9mYW1pbHkoaWZfaWQpOworICAgIHN3aXRjaChwb25fc3ViX2ZhbWlseSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNX1RPUE9fUE9OX1NVQl9GQU1JTFlfR1BPTjoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtYXBsZV9ncG9uX21hY19jaGVja19nZW1fcG9ydF9pZChpZl9pZCwgb251X2lkLCBzdmNfcG9ydF9pZCwgJmlzX2NvbmZpZ3VyZWQsICZpc19hY3RpdmF0ZWQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisJICAgIGNhc2UgQkNNX1RPUE9fUE9OX1NVQl9GQU1JTFlfWEdQT046CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbWFwbGVfeGdwb25fbWFjX2NoZWNrX2dlbV9wb3J0X2lkKGlmX2lkLCBvbnVfaWQsIHN2Y19wb3J0X2lkLCAmaXNfY29uZmlndXJlZCwgJmlzX2FjdGl2YXRlZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGlmX2lkKSwgIiVzIGZhaWxlZCB3aXRoIGVycm9yICVzXG4iLF9fRlVOQ1RJT05fXywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKwkqaXNfY29uZmlnX3JlcXVpcmVkID0gIWlzX2NvbmZpZ3VyZWQ7CisJKmlzX3dhaXRfZm9yX2luZGljYXRpb24gPSAhaXNfYWN0aXZhdGVkOworCisgICAgaWYoQkNNT1NfRkFMU0UgPT0gKmlzX2NvbmZpZ19yZXF1aXJlZCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGlmX2lkKSwKKyAgICAgICAgICAgICAgICAiJXM6IGdlbSBwb3J0IGlkIGlzIGFscmVhZHkgY29uZmlndXJlZDogaWZfaWQgPSAlZCBvbnVfaWQgPSAlZCBzdmNfcG9ydF9pZCA9ICVkICBpc193YWl0X2Zvcl9pbmRpY2F0aW9uID0gJXNcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGlmX2lkLCBvbnVfaWQsc3ZjX3BvcnRfaWQsCisgICAgICAgICAgICAgICAoKmlzX3dhaXRfZm9yX2luZGljYXRpb24gPT0gQkNNT1NfVFJVRSA/ICJUUlVFIjoiRkFMU0UiKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisKKy8qKgorICogQGJyaWVmIENoZWNrcyBpZiBhIGdlbSBwb3J0IG5lZWRzIHRvIGJlIGFjdHVhbGx5IGRlY29uZmlndXJlZC4KKyAqICAgICAgICAgIFRoaXMgd291bGQgYmUgdXNlZCBkdXJpbmcgZmxvdyByZW1vdmUuCisgKgorICogQHBhcmFtIHN2Y19wb3J0X2lkICAgZ2VtIHBvcnQKKyAqIEBwYXJhbSBpZl9pZCAgICAgICAgIFBPTiBOSQorICogQHBhcmFtIG9udV9pZCAgICAgICAgT05VIElkCisgKiBAcGFyYW0gaXNfZGVjb25maWdfcmVxdWlyZWQgVFJVRS9GQUxTRQorICogQHBhcmFtIGlzX3dhaXRfZm9yX2luZGljYXRpb24gVFJVRS9GQUxTRQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hcGxlX21hY19jaGVja19nZW1fcG9ydF9pZF9kZWNvbmZpZyh1aW50MTZfdCBzdmNfcG9ydF9pZCwgdWludDMyX3QgaWZfaWQsIHVpbnQzMl90IG9udV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfYm9vbCAqaXNfZGVjb25maWdfcmVxdWlyZWQsIGJjbW9zX2Jvb2wgKmlzX3dhaXRfZm9yX2luZGljYXRpb24pCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIHVpbnQzMl90IHJlZl9jb3VudCA9IDA7CisgICAgYmNtX3RvcG9fcG9uX21vZGUgcG9uX21vZGU7CisgICAgYmNtb3NfYm9vbCBpc19jb25maWd1cmVkID0gQkNNT1NfRkFMU0UsIGlzX2FjdGl2YXRlZCA9IEJDTU9TX0ZBTFNFOworCisgICAgLyogYXNzdW1lIERlLWNvbmZpZyBub3QgcmVxdWlyZWQsIGluIGNhc2Ugb2YgYW4gZXJyb3IgKi8KKyAgICAqaXNfZGVjb25maWdfcmVxdWlyZWQgPSBCQ01PU19GQUxTRTsKKyAgICAqaXNfd2FpdF9mb3JfaW5kaWNhdGlvbiA9IEJDTU9TX0ZBTFNFOworCisgICAgcG9uX21vZGUgPSBiY21fdG9wb19wb25fZ2V0X3Bvbl9tb2RlKGlmX2lkKTsKKyAgICBpZihwb25fbW9kZSA9PSBCQ01fVE9QT19QT05fTU9ERV9HUE9OKQorICAgIHsKKyAgICAgICAgcmMgPSBtYXBsZV9ncG9uX21hY19jaGVja19nZW1fcG9ydF9pZChpZl9pZCwgb251X2lkLCBzdmNfcG9ydF9pZCwgJmlzX2NvbmZpZ3VyZWQsICZpc19hY3RpdmF0ZWQpOworICAgIH0KKyAgICBlbHNlIGlmKEJDTV9UT1BPX1BPTl9TVUJfRkFNSUxZX1hHUE9OID09IGJjbV90b3BvX3Bvbl9nZXRfcG9uX3N1Yl9mYW1pbHkoaWZfaWQpKQorICAgIHsKKyAgICAgICAgcmMgPSBtYXBsZV94Z3Bvbl9tYWNfY2hlY2tfZ2VtX3BvcnRfaWQoaWZfaWQsIG9udV9pZCwgc3ZjX3BvcnRfaWQsICZpc19jb25maWd1cmVkLCAmaXNfYWN0aXZhdGVkKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpZl9pZCksICIlcyBmYWlsZWQgd2l0aCBlcnJvciAlc1xuIixfX0ZVTkNUSU9OX18sIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKwlpZighaXNfY29uZmlndXJlZCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpZl9pZCksCisgICAgICAgICAgICAiJXMgZXJyb3IgaW4gZ3BvbiBnZW0gcG9ydCBzdGF0ZTogc3ZjX3BvcnRfaWQgPSAlZCBpZl9pZCA9ICVkIG9udV9pZCA9ICVkLCBnZW0gc3RhdGU6IE5PVF9DT05GSUdVUkVEXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgc3ZjX3BvcnRfaWQsIGlmX2lkLCBvbnVfaWQpOworCisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKyAgICAKKworICAgIC8qKiBGaXJzdDogQ2hlY2sgaWYgZ2VtIGRlY29uZmlnIGlzIHJlcXVpcmVkOgorICAgICAqIGdlbSBkZWNvbmZpZyBpcyBub3QgbmVlZGVkIGlmIG90aGVyIGZsb3dzIGFyZSBzdGlsbCB1c2luZyB0aGUgc2FtZSBnZW0sIG9yIGl0IGlzIGFscmVhZHkgYmVpbmcgZGVjb25maWd1cmVkLgorICAgICAqLworI2lmIFJTUkNfTUdSX0tFRVBTX0ZMT1dfTElTVF9QRVJfR0VNCisgICAgLyoqIEB0b2RvIHRoZSByc3JjIG1nciByZWYgY291bnQgd2lsbCBub3Qgd29yayBmb3Igbm93IHNpbmNlIGNvcmUgZnNtIGtlZXBzIHRoZSBmbG93IHdpdGggYWRtaW4gZG93biwKKyAgICAgKiB0aG91Z2ggbWFjIHV0aWwgZG9lcyBhIGNsZWFyIG9uIHRoZSBnZW0uCisgICAgICovCisgICAgLyogZ2V0IHRoZSByZWYgY291bnQgZm9yIHRoZSBnZW0gZnJvbSByc2MgbWdyICovCisgICAgcmMgPSByc2NfbWdyX2dlbV9sb29rdXAoaWZfaWQsIHN2Y19wb3J0X2lkLCAmcmVmX2NvdW50KTsKKyAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisjZWxzZQorICAgIHJjID0gX21hY191dGlsX2RiX2Zsb3dfY291bnRfd19nZW0oaWZfaWQsIHN2Y19wb3J0X2lkLCAmcmVmX2NvdW50KTsKKyAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyNlbmRpZgorCisgICAgLyogaWYgbW9yZSB0aGFuIDEgZmxvdyBpcyB1c2luZyB0aGUgZ2VtIGluIHdoYXRldmVyIHN0YXRlLCBza2lwIGRlY29uZmlnICovCisgICAgaWYoMSA8IHJlZl9jb3VudCkKKyAgICB7CisgICAgICAgICppc19kZWNvbmZpZ19yZXF1aXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqaXNfZGVjb25maWdfcmVxdWlyZWQgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIC8qIEdlbSBwb3J0IGNvbmZpZ3VyYXRpb24gaW5kaWNhdGlvbnMgYXJlIGF2YWlsYWJsZSBvbiBHUE9OIG9ubHkgKi8KKyAgICBpZihwb25fbW9kZSA9PSBCQ01fVE9QT19QT05fTU9ERV9HUE9OKQorICAgIHsKKyAgICAgICAgLyoqIE5leHQ6IENoZWNrIGlmIG5lZWQgdG8gd2FpdCBmb3IgaW5kaWNhdGlvbiAqLworICAgICAgICBpZihCQ01PU19UUlVFID09ICppc19kZWNvbmZpZ19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIWlzX2FjdGl2YXRlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICppc193YWl0X2Zvcl9pbmRpY2F0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmlzX3dhaXRfZm9yX2luZGljYXRpb24gPSBCQ01PU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmlzX3dhaXRfZm9yX2luZGljYXRpb24gPSBCQ01PU19GQUxTRTsKKworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICppc193YWl0X2Zvcl9pbmRpY2F0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisKKyAgICBpZihCQ01PU19GQUxTRSA9PSAqaXNfZGVjb25maWdfcmVxdWlyZWQpCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpZl9pZCksCisgICAgICAgICAgICAgICAgIlNraXAgZ2VtIHBvcnQgZGVjb25maWc6IGlzX2RlY29uZmlnX3JlcXVpcmVkID0gJXMsIGlzX3dhaXRfZm9yX2luZGljYXRpb24gPSAlcywgc3ZjX3BvcnRfaWQgPSAlZCBpZl9pZCA9ICVkIG9udV9pZCA9ICVkLCBbcmVmX2NvdW50PSVkLCBnZW1faXMgY29uZmlndXJlZD0lZCwgZ2VtX2lzX2FjdGl2YXRlZD0lZF1cbiIsCisgICAgICAgICAgICAgICAoKmlzX2RlY29uZmlnX3JlcXVpcmVkID09IEJDTU9TX1RSVUUgPyAiVFJVRSI6IkZBTFNFIiksCisgICAgICAgICAgICAgICAoKmlzX3dhaXRfZm9yX2luZGljYXRpb24gPT0gQkNNT1NfVFJVRSA/ICJUUlVFIjoiRkFMU0UiKSwKKyAgICAgICAgICAgICAgICBzdmNfcG9ydF9pZCwgaWZfaWQsIG9udV9pZCwKKyAgICAgICAgICAgICAgICByZWZfY291bnQsIGlzX2NvbmZpZ3VyZWQsIGlzX2FjdGl2YXRlZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisKKy8qKgorICogQGJyaWVmIG1hcGxlX2dlbV9wb3J0X2lkX2FkZAorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBjb25maWd1cmluZyBhdCBtYXBsZSBhIHNwZWNpZmljIGdlbSBwb3J0IGlkIG9uIGEgZ2l2ZW4gcG9uIGludGVyZmFjZQorICogYW5kIGFzc2lnbiBpdCB0byBhIGdpdmVuIG9udSBpZAorICogY3VycmVudGx5IGFsbCBzbGEgcHJvcGVydGllcyBhcmUgaGFyZCBjb2RlZAorICoKKyAqIEBwYXJhbSBzdmNfcG9ydF9pZCAgICAgICB0aGUgZ2VtIHBvcnQgaWQKKyAqIEBwYXJhbSBpZl9pZCAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJmYWNlIGlkCisgKiBAcGFyYW0gb251X2lkICAgICAgICAgICAgICAgdGhlIG9udSBpZCBpdCB3aWxsIGFzc2lnbiB0bworICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hcGxlX2dlbV9wb3J0X2lkX2FkZCh1aW50MTZfdCBzdmNfcG9ydF9pZCwgdWludDMyX3QgaWZfaWQsIHVpbnQzMl90IG9udV9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHt9OworICAgIGJjbV90b3BvX3Bvbl9tb2RlIHBvbl9tb2RlOworCisgICAgaWYob251X2lkIDwgTUFDX1VUSUxfRFVNTVlfT05VX0lEX0ZPUl9NVUxUSUNBU1RfR0VNKQorICAgIHsKKyAgICAgICAgY29uZmlndXJhdGlvbi5kaXJlY3Rpb24gPSBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX0JJRElSRUNUSU9OQUw7CisgICAgICAgIGNvbmZpZ3VyYXRpb24udHlwZSA9IEJDTU9MVF9HRU1fUE9SVF9UWVBFX1VOSUNBU1Q7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNvbmZpZ3VyYXRpb24uZGlyZWN0aW9uID0gQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9ET1dOU1RSRUFNOworICAgICAgICBjb25maWd1cmF0aW9uLnR5cGUgPSBCQ01PTFRfR0VNX1BPUlRfVFlQRV9NVUxUSUNBU1Q7CisgICAgfQorCisgICAgcG9uX21vZGUgPSBiY21fdG9wb19wb25fZ2V0X3Bvbl9tb2RlKGlmX2lkKTsKKyAgICBpZihwb25fbW9kZSA9PSBCQ01fVE9QT19QT05fTU9ERV9HUE9OKQorICAgIHsKKyAgICAgICAgcmMgPSBtYXBsZV9ncG9uX2dlbV9wb3J0X2lkX2FkZChpZl9pZCwgc3ZjX3BvcnRfaWQsIG9udV9pZCwgJmNvbmZpZ3VyYXRpb24pOworICAgIH0KKyAgICBlbHNlIGlmKEJDTV9UT1BPX1BPTl9TVUJfRkFNSUxZX1hHUE9OID09IGJjbV90b3BvX3Bvbl9nZXRfcG9uX3N1Yl9mYW1pbHkoaWZfaWQpKQorICAgIHsKKyAgICAgICAgcmMgPSBtYXBsZV94Z3Bvbl9nZW1fcG9ydF9pZF9hZGQoaWZfaWQsIHN2Y19wb3J0X2lkLCBvbnVfaWQsICZjb25maWd1cmF0aW9uKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpZl9pZCksICIlcyBmYWlsZWQgd2l0aCBlcnJvciAlc1xuIixfX0ZVTkNUSU9OX18sIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisKKy8qKgorICogQGJyaWVmIG1hcGxlX2dlbV9wb3J0X2lkX3JlbW92ZQorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIENsZWFyIGEgc3BlY2lmaWMgZ2VtIHBvcnQgaWQgY29uZmlnIGluIE9MVCBvbiBhIGdpdmVuIHBvbiBpbnRlcmZhY2UuCisgKgorICogQHBhcmFtIHN2Y19wb3J0X2lkICAgICAgIHRoZSBnZW0gcG9ydCBpZAorICogQHBhcmFtIGlmX2lkICAgICAgICAgICAgIHRoZSBpbnRlcmZhY2UgaWQKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKgorICogQHRvZG8gZG8gd2UgbmVlZCB0byBmaWxsIGluIGFsbCBwYXJhbWV0ZXJzIHRvIGRpc2FibGUgR0VNIG9yIGp1c3QgdGhlIGdlbSBrZXkgPworICovCitzdGF0aWMgYmNtb3NfZXJybm8gbWFwbGVfZ2VtX3BvcnRfaWRfcmVtb3ZlKHVpbnQxNl90IHN2Y19wb3J0X2lkLCB1aW50MzJfdCBpZl9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtX3RvcG9fcG9uX21vZGUgcG9uX21vZGU7CisKKyAgICBwb25fbW9kZSA9IGJjbV90b3BvX3Bvbl9nZXRfcG9uX21vZGUoaWZfaWQpOworICAgIGlmKHBvbl9tb2RlID09IEJDTV9UT1BPX1BPTl9NT0RFX0dQT04pCisgICAgeworICAgICAgICByYyA9IG1hcGxlX2dwb25fZ2VtX3BvcnRfaWRfcmVtb3ZlKGlmX2lkLCBzdmNfcG9ydF9pZCk7CisgICAgfQorICAgIGVsc2UgaWYoQkNNX1RPUE9fUE9OX1NVQl9GQU1JTFlfWEdQT04gPT0gYmNtX3RvcG9fcG9uX2dldF9wb25fc3ViX2ZhbWlseShpZl9pZCkpCisgICAgeworICAgICAgICByYyA9IG1hcGxlX3hncG9uX2dlbV9wb3J0X2lkX3JlbW92ZShpZl9pZCwgc3ZjX3BvcnRfaWQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGlmX2lkKSwKKyAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY2xlYXIgZ2VtIHBvcnQgY29uZmlndXJhdGlvbiglcykgaW4gT0xUXG4iLAorICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBAYnJpZWYgY2hlY2tzIGlmIGEgYWxsb2MgaWQgaXMgY29uZmlndXJlZCBpbiBPTFQgYWxyZWFkeSBmb3IgdGhlIHNhbWUgUE9OIElmIGFuZCBPTlUKKyAqCisgKiBAcGFyYW0gYWdnX2lkICAgICAgICBhbGxvYyBpZAorICogQHBhcmFtIGlmX2lkICAgICAgICAgUE9OIE5JCisgKiBAcGFyYW0gb251X2lkICAgICAgICBPTlUgSWQKKyAqIEBwYXJhbSBwX2FsbG9jX2lkX3N0YXRlIGFsbG9jIGlkIGN1cnJlbnQgc3RhdGUKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBtYXBsZV9tYWNfY2hlY2tfYWxsb2NfaWRfc3RhdGUodWludDE2X3QgYWdnX2lkLCB1aW50MzJfdCBpZl9pZCwgdWludDMyX3Qgb251X2lkLCBiY21vbHRfYWxsb2Nfc3RhdGUgKnBfYWxsb2NfaWRfc3RhdGUpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbV90b3BvX3Bvbl9tb2RlIHBvbl9tb2RlOworCQkKKyAgICBwb25fbW9kZSA9IGJjbV90b3BvX3Bvbl9nZXRfcG9uX21vZGUoaWZfaWQpOworICAgIGlmKHBvbl9tb2RlID09IEJDTV9UT1BPX1BPTl9NT0RFX0dQT04pCisgICAgeworICAgICAgICByYyA9IG1hcGxlX2dwb25fbWFjX2dldF9hbGxvY19pZF9jb25maWcoaWZfaWQsIG9udV9pZCwgYWdnX2lkLCBwX2FsbG9jX2lkX3N0YXRlKTsKKyAgICB9CisgICAgZWxzZSBpZihCQ01fVE9QT19QT05fU1VCX0ZBTUlMWV9YR1BPTiA9PSBiY21fdG9wb19wb25fZ2V0X3Bvbl9zdWJfZmFtaWx5KGlmX2lkKSkKKyAgICB7CisgICAgICAgIHJjID0gbWFwbGVfeGdwb25fbWFjX2dldF9hbGxvY19pZF9jb25maWcoaWZfaWQsIG9udV9pZCwgYWdnX2lkLCBwX2FsbG9jX2lkX3N0YXRlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorCQorICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaWZfaWQpLCAiJXMgZmFpbGVkIHdpdGggZXJyb3IgJXNcbiIsX19GVU5DVElPTl9fLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCQorICAgIHJldHVybiByYzsKK30KKworCQorCitzdGF0aWMgYmNtb3NfZXJybm8gbWFwbGVfbWFjX2NoZWNrX2FsbG9jX2lkX2NvbmZpZyh1aW50MTZfdCBhZ2dfaWQsIHVpbnQzMl90IGlmX2lkLCB1aW50MzJfdCBvbnVfaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2FsbG9jX3N0YXRlIGFsbG9jX2lkX3N0YXRlOworICAgIAorICAgIAorICAgIHJjID0gbWFwbGVfbWFjX2NoZWNrX2FsbG9jX2lkX3N0YXRlKGFnZ19pZCwgaWZfaWQsIG9udV9pZCwgJmFsbG9jX2lkX3N0YXRlKTsKKyAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGlmX2lkKSwgIiVzIGZhaWxlZCB3aXRoIGVycm9yICVzXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBpZihCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQgIT0gYWxsb2NfaWRfc3RhdGUpCisgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgIHJldHVybiByYzsKK30KK3N0YXRpYyBiY21vc19lcnJubyBtYXBsZV9tYWNfY2hlY2tfYWxsb2NfaWRfYWN0aXZlKHVpbnQxNl90IGFnZ19pZCwgdWludDMyX3QgaWZfaWQsIHVpbnQzMl90IG9udV9pZCwgYmNtb3NfYm9vbCAqaXNfYWxsb2NfaWRfd2FpdF9mb3JfaW5kKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9sdF9hbGxvY19zdGF0ZSBhbGxvY19pZF9zdGF0ZTsKKyAgICAKKyAgICByYyA9IG1hcGxlX21hY19jaGVja19hbGxvY19pZF9zdGF0ZShhZ2dfaWQsIGlmX2lkLCBvbnVfaWQsICZhbGxvY19pZF9zdGF0ZSk7CisgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpZl9pZCksICIlcyBmYWlsZWQgd2l0aCBlcnJvciAlc1xuIixfX0ZVTkNUSU9OX18sIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgKmlzX2FsbG9jX2lkX3dhaXRfZm9yX2luZCA9IEJDTU9MVF9BTExPQ19TVEFURV9BQ1RJVkUgIT0gYWxsb2NfaWRfc3RhdGU7CisgICAgcmV0dXJuIHJjOworfQorCisvKioKKyAqIEBicmllZiBoZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgZmxvdyB3aXRoIGRvdWJsZSB0YWcgYW5kIHdpdGggYWN0aW9uIHJlbW92ZSBvdXRlciB0YWcuCisgKiAgVXNlZCBmb3IgdmFsaWRhdGlvbiBhcyB3ZWxsIGFzIGZsb3cgY29uZmlnLgorICoKKyAqIEBwYXJhbSBwX2Zsb3dfcmVxICAgICBBIHBvaW50ZXIgdG8gYSBmbG93IG9iamVjdAorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfYm9vbCAgbWFjX3V0aWxfY2hlY2tfZmxvd19pc19kb3VibGVfdGFnX3JlbW92ZV9vX3RhZyhjb25zdCBiY21iYWxfZmxvd19jZmcgKnBfZmxvd19yZXEpCit7CisgICAgaWYoTlVMTCAhPSBwX2Zsb3dfcmVxKQorICAgIHsKKyAgICAgICAgaWYoQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNID09IHBfZmxvd19yZXEtPmtleS5mbG93X3R5cGUgJiYKKyAgICAgICAgICAgIEJDTU9TX1RSVUUgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3dfcmVxLCBmbG93LCBhY3Rpb24pICYmCisgICAgICAgICAgIChwX2Zsb3dfcmVxLT5kYXRhLmFjdGlvbi5jbWRzX2JpdG1hc2sgJiBCQ01CQUxfQUNUSU9OX0NNRF9JRF9SRU1PVkVfT1VURVJfVEFHKSAmJgorICAgICAgICAgICAocF9mbG93X3JlcS0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSA9PSBCQ01CQUxfUEtUX1RBR19UWVBFX0RPVUJMRV9UQUcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworCisvKioKKyAqIEBicmllZiBtYXBsZV9tYWNfdW5pY2FzdF9mbG93X2FkZAorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBhIGZsb3cgYXQgdGhlIGludGVybmFsIGZsb3dzIGxpc3QgdG8KKyAqIGhhbmRsZSBpbmNvbWluZyBhbmQgb3V0Z29pbmcgcmVsZXZhbnQgaW5kaWNhdGlvbnMuCisgKiB0aGUgZmxvdyBzdmNfcG9ydCBpcyBkZWZpbmVkIHVzaW5nIGEgc2luZ2xlIGdlbSBwb3J0IGJ5IGEgYmFzZV9nZW1fcG9ydAorICogYW5kIHNpbmdsZSBwYml0KD0wIGluIGNhc2Ugb2YgcGJpdCBpcyBub3QgYXZhaWxhYmxlKQorICogaXQgd2lsbCBhbHNvIGNvbmZpZ3VyZSBnZW0gcG9ydCBhbmQgYWxsb2MgaWQgYXQgdGhlIGRldmljZSBpZiByZXF1aXJlZC4KKyAqCisgKiAKKyAqIEBwYXJhbSBpZl9pZCAtIHRoZSBwb24gaW50ZXJmYWNlIGlkIAorICogQHBhcmFtIG9udV9pZCAtICB0aGUgb251IGlkIAorICogQHBhcmFtIGFnZ19pZCAtICB0aGUgYWxsb2MgaWQgCisgKiBAcGFyYW0gc2xhIC0gIHRoZSBzbGEgY29uZmlndXJhdGlvbiBvZiB0aGUgYWxsb2MgaWQKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vICBtYXBsZV9tYWNfYWdnX3BvcnRfYWRkKHVpbnQzMl90IGlmX2lkLCB1aW50MzJfdCBvbnVfaWQsIHVpbnQxNl90IGFnZ19pZCwgYmNtb2x0X3Bvbl9hbGxvY19zbGEgc2xhKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21fdG9wb19wb25fbW9kZSBwb25fbW9kZTsKKyAgICBkbworICAgIHsKKyAgICAgICAgcmMgPSBtYXBsZV9tYWNfY2hlY2tfYWxsb2NfaWRfY29uZmlnKGFnZ19pZCwgaWZfaWQsIG9udV9pZCk7CisgICAgICAgIAorICAgICAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaWZfaWQpLAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcXVlcnkgYWxsb2Mgc3RhdGVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwkJCisJCXBvbl9tb2RlID0gYmNtX3RvcG9fcG9uX2dldF9wb25fbW9kZShpZl9pZCk7CisJCWlmKHBvbl9tb2RlID09IEJDTV9UT1BPX1BPTl9NT0RFX0dQT04pCisJCXsKKwkJCXJjID0gbWFwbGVfZ3Bvbl91c19hbGxvY19pZF9hZGQoaWZfaWQsIG9udV9pZCwgYWdnX2lkLCBzbGEpOworCQl9CisJCWVsc2UgaWYoQkNNX1RPUE9fUE9OX1NVQl9GQU1JTFlfWEdQT04gPT0gYmNtX3RvcG9fcG9uX2dldF9wb25fc3ViX2ZhbWlseShpZl9pZCkpCisJCXsKKwkJCXJjID0gbWFwbGVfeGdwb25fdXNfYWxsb2NfaWRfYWRkKGlmX2lkLCBvbnVfaWQsIGFnZ19pZCwgc2xhKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJjID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworCQl9CisJCQorCQlpZihCQ01fRVJSX09LICE9IHJjKQorCQl7CisJCQlCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaWZfaWQpLCAiJXMgZmFpbGVkIHdpdGggZXJyb3IgJXNcbiIsX19GVU5DVElPTl9fLCBiY21vc19zdHJlcnJvcihyYykpOworCQl9ICAKKyAgICB9d2hpbGUoMCk7CisgICAgcmV0dXJuIHJjOworfQorCisvKioKKyAqIEBicmllZiBtYXBsZV9tYWNfYWdnX3BvcnRfcmVtb3ZlCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIERlLWNvbmZpZ3VyaW5nIGF0IG1hcGxlIGEgIHNwZWNpZmljIGFsbG9jX2lkIG9uIGEgZ2l2ZW4gcG9uIGludGVyZmFjZQorICoKKyAqIEBwYXJhbSBpZl9pZCAtIHRoZSBwb24gaW50ZXJmYWNlIGlkIAorICoKKyAqIEBwYXJhbSBhZ2dfaWQgLQl0aGUgYWxsb2MgaWQgCisgKgorICogQHJldHVybiBiY21vc19lcnJubyAKKyAqLworYmNtb3NfZXJybm8gIG1hcGxlX21hY19hZ2dfcG9ydF9yZW1vdmUodWludDMyX3QgaWZfaWQsIHVpbnQxNl90IGFnZ19pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtX3RvcG9fcG9uX21vZGUgcG9uX21vZGU7CisKKyAgICBwb25fbW9kZSA9IGJjbV90b3BvX3Bvbl9nZXRfcG9uX21vZGUoaWZfaWQpOworICAgIGlmKHBvbl9tb2RlID09IEJDTV9UT1BPX1BPTl9NT0RFX0dQT04pCisgICAgeworICAgICAgICByYyA9IG1hcGxlX2dwb25fdXNfYWxsb2NfaWRfcmVtb3ZlKGlmX2lkLCBhZ2dfaWQpOworICAgIH0KKyAgICBlbHNlIGlmKEJDTV9UT1BPX1BPTl9TVUJfRkFNSUxZX1hHUE9OID09IGJjbV90b3BvX3Bvbl9nZXRfcG9uX3N1Yl9mYW1pbHkoaWZfaWQpKQorICAgIHsKKyAgICAgICAgcmMgPSBtYXBsZV94Z3Bvbl91c19hbGxvY19pZF9yZW1vdmUoaWZfaWQsIGFnZ19pZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaWZfaWQpLCAiJXMgZmFpbGVkIHdpdGggZXJyb3IgJXNcbiIsX19GVU5DVElPTl9fLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gbWFwbGVfbWFjX3VuaWNhc3RfZmxvd19hZGQoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3csIHVpbnQxNl90IHBiaXQsIHVpbnQxNl90IHBlcl9mbG93X21vZGVfdmxhbl9pZCwgYmFsX3V0aWxfb3Blcl9mbG93IG9wX3R5cGUsIAkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2xpc3RfZW50cnkgKipwcF9tYWNfdXRpbF9mbG93X2VudHJ5KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vc19ib29sIGlzX2dlbV9jb25maWdfcmVxdWlyZWQgPSBCQ01PU19UUlVFOworICAgIGJjbW9zX2Jvb2wgaXNfZ2VtX3dhaXRfZm9yX2luZCA9IEJDTU9TX1RSVUUgLCBpc19hbGxvY19pZF93YWl0X2Zvcl9pbmQgPSBCQ01PU19UUlVFOworICAgIGZsb3dfbGlzdF9lbnRyeSAqcF9uZXdfZmxvd19lbnRyeSA9IE5VTEw7CisKKworICAgICpwcF9tYWNfdXRpbF9mbG93X2VudHJ5ID0gTlVMTDsKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgJiBhZGQgdGhlIG5ldyBmbG93IHRvIHRoZSBmbG93IGxpc3QgdG8gZm9sbG93IGluZGljYXRpb25zL2dlbSByZXVzZS9hbGxvYyByZXVzZSAqLworICAgICAgICBwX25ld19mbG93X2VudHJ5ID0gX21hY191dGlsX2RiX2Zsb3dfYWxsb2MoKTsKKyAgICAgICAgaWYoTlVMTCA9PSBwX25ld19mbG93X2VudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBmbG93IGVudHJ5XG4iKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KCZwX25ld19mbG93X2VudHJ5LT5iYWxfZmxvd19rZXksICZwX2Zsb3ctPmtleSwKKyAgICAgICAgICAgIHNpemVvZihiY21iYWxfZmxvd19rZXkpKTsKKyAgICAgICAgcF9uZXdfZmxvd19lbnRyeS0+aWZfaWQgPSBwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZDsKKyAgICAgICAgcF9uZXdfZmxvd19lbnRyeS0+c3ViX3Rlcm1faWQgPSBwX2Zsb3ctPmRhdGEuc3ViX3Rlcm1faWQ7CisgICAgICAgIHBfbmV3X2Zsb3dfZW50cnktPnN2Y19wb3J0X2lkID0gcF9mbG93LT5kYXRhLnN2Y19wb3J0X2lkOworICAgICAgICBpZihCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNID09IHBfZmxvdy0+a2V5LmZsb3dfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcF9uZXdfZmxvd19lbnRyeS0+YWdnX2lkID0gcF9mbG93LT5kYXRhLmFnZ19wb3J0X2lkOworICAgICAgICB9CisgICAgICAgIHBfbmV3X2Zsb3dfZW50cnktPnZsYW5faWQgPSBwZXJfZmxvd19tb2RlX3ZsYW5faWQ7CisgICAgICAgIHBfbmV3X2Zsb3dfZW50cnktPmlzX3dhaXRpbmdfZm9yX3N2Y19wb3J0X2FjdGl2ZSA9IEJDTU9TX1RSVUU7CisgICAgICAgIHBfbmV3X2Zsb3dfZW50cnktPmluZF9zZW50ICA9IEJBTF9VVElMX0ZMT1dfSU5EX1NFTkRfTk9ORTsKKyAgICAgICAgcF9uZXdfZmxvd19lbnRyeS0+aXNfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKworCisgICAgICAgIC8qIHNhdmUgdGhlIG9wZXJhdGlvbiB0eXBlIHNvIGFzIHRvIHJlcG9ydCBiYWNrIHRoZSByaWdodCBpbmRpY2F0aW9uIHR5cGUgdG8gY29yZSBvbiBhbiBpbmRpY2F0aW9uIGZyb20gTWFwbGUgKi8KKyAgICAgICAgcF9uZXdfZmxvd19lbnRyeS0+b3BfdHlwZSA9IG9wX3R5cGU7CisKKyAgICAgICAgLyogY2hlY2sgaWYgZ2VtIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQgb3IgaXQgd2FzIGFscmVhZHkgY29uZmlndXJlZCwKKyAgICAgICAgICAgY291bGQgaGFwcGVuIGluIGNhc2Ugb2YgdXMgZmxvdyBjb25maWd1cmVkIGFmdGVyIGEgZHMgZmxvdyh3aXRoIHRoZSBzYW1lIGZsb3dfaWQpCisgICAgICAgICAgIGFuZCB2aXNlIHZlcnN1cywgb3IgaWYgdGhhdCBpcyBhIGNhc2Ugb2YgZGlmZmVyZW50IGZsb3cgc2hhcmluZyB0aGUgc2FtZSBnZW0gcG9ydCBpZCAqLworICAgICAgICBpZihCQ01PU19UUlVFID09IGlzX2dlbV9jb25maWdfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbWFwbGVfbWFjX2NoZWNrX2dlbV9wb3J0X2lkX2NvbmZpZyhwX25ld19mbG93X2VudHJ5LT5zdmNfcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9uZXdfZmxvd19lbnRyeS0+aWZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbmV3X2Zsb3dfZW50cnktPnN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNfZ2VtX2NvbmZpZ19yZXF1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzX2dlbV93YWl0X2Zvcl9pbmQpOworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmcmVlIHRoZSBmbG93IGVudHJ5ICovCisgICAgICAgICAgICAgICAgX21hY191dGlsX2RiX2Zsb3dfZnJlZShwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCwgcF9uZXdfZmxvd19lbnRyeSk7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBzZXQgd2FpdCBmb3IgaW5kIGZsYWcgKi8KKyAgICAgICAgICAgIHBfbmV3X2Zsb3dfZW50cnktPmlzX3dhaXRpbmdfZm9yX3N2Y19wb3J0X2FjdGl2ZSA9IGlzX2dlbV93YWl0X2Zvcl9pbmQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiB0aGF0J3MgYW4gdXMgZmxvdywgY2hlY2sgaWYgYWxsb2MgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZCBvciBpdCB3YXMgYWxyZWFkeSBjb25maWd1cmVkICovCisgICAgICAgIGlmKHBfbmV3X2Zsb3dfZW50cnktPmJhbF9mbG93X2tleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtYXBsZV9tYWNfY2hlY2tfYWxsb2NfaWRfYWN0aXZlKHBfbmV3X2Zsb3dfZW50cnktPmFnZ19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9uZXdfZmxvd19lbnRyeS0+aWZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbmV3X2Zsb3dfZW50cnktPnN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNfYWxsb2NfaWRfd2FpdF9mb3JfaW5kKTsKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZnJlZSB0aGUgZmxvdyBlbnRyeSAqLworICAgICAgICAgICAgICAgIF9tYWNfdXRpbF9kYl9mbG93X2ZyZWUocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQsIHBfbmV3X2Zsb3dfZW50cnkpOworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisJCQorICAgICAgICAvKiBhZGQgdGhlIG5ldyBmbG93IHRvIHRoZSBmbG93IERCICovCisgICAgICAgIHJjID0gX21hY191dGlsX2RiX2Zsb3dfYWRkKHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkLCBwX25ld19mbG93X2VudHJ5KTsKKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgLyogZnJlZSB0aGUgZmxvdyBlbnRyeSAqLworICAgICAgICAgICAgX21hY191dGlsX2RiX2Zsb3dfZnJlZShwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCwgcF9uZXdfZmxvd19lbnRyeSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvbmZpZ3VyZSB0aGUgZ2VtIHBvcnQgaWQgaWYgcmVxdWlyZWQgKi8KKyAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBpc19nZW1fY29uZmlnX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1hcGxlX2dlbV9wb3J0X2lkX2FkZChwX25ld19mbG93X2VudHJ5LT5zdmNfcG9ydF9pZCwgcF9uZXdfZmxvd19lbnRyeS0+aWZfaWQsIHBfbmV3X2Zsb3dfZW50cnktPnN1Yl90ZXJtX2lkKTsKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gd2hpbGUoMCk7CisJCisgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgIiVzIEZhaWxlZDogcmMgPSAlcyglZCksIGZsb3cgSWQvVHlwZT0lZC8lZCwgcGJpdD0lZCwgaWZfaWQ9JWQsIHN1Yl90ZXJtX2lkPSVkLCAiCisgICAgICAgICAgICAgICAgInN2Y19wb3J0X2lkPSVkLCBhZ2dfaWQ9JWQsIHZsYW5faWQ9JWQsIG9wIHR5cGU9JXNcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMsCisgICAgICAgICAgICAgICAgcF9mbG93LT5rZXkuZmxvd19pZCwgcF9mbG93LT5rZXkuZmxvd190eXBlLCAgcGJpdCwKKyAgICAgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCwgcF9mbG93LT5kYXRhLnN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5zdmNfcG9ydF9pZCwgcF9mbG93LT5kYXRhLmFnZ19wb3J0X2lkLCBwZXJfZmxvd19tb2RlX3ZsYW5faWQsCisgICAgICAgICAgICAgICAoQkFMX1VUSUxfT1BFUl9GTE9XX0FERCA9PSBvcF90eXBlID8gIkZMT1dfQUREIjoiSU5WQUxJRCIpKTsKKyAgICB9CisKKyAgICAvKiBzZXQgdGhlIGFyZyB0byByZXR1cm4gdGhlIGxvY2FsIGZsb3cgZW50cnkgdG8gY2FsbGVyICovCisgICAgKnBwX21hY191dGlsX2Zsb3dfZW50cnkgPSBwX25ld19mbG93X2VudHJ5OworCisgICAgcmV0dXJuIHJjOworfQorCisKKy8qKgorICogQGJyaWVmIHV0aWxpdHkgcm91dGluZSB0byBjb3JyZWN0bHkgYXNzaWduIHRoZSBTTEFzICB0byBuZXcgdG0gc2NoZWQgb3duZWQgYnkgYWdnIHBvcnQKKyAqICBUaGlzIHJvdXRpbmUgYWRqdXN0cyB0aGUgQlcgdmFsdWVzIHRvIGJlIGFsaWduZWQgd2l0aCA4S0J5dGVzL3NlYyBib3VuZGFyeS4gSXQgYWxzbworICogIGFkanVzdHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwYnIgJiBzYnIgdG8gYmUgYXQgbGVhc3QgMzJLQnl0ZXMvc2VjCisgKgorICogQHBhcmFtIHBfdG1fc2NoZWRfcmVxICAgICAgICBuZXcgdG0gc2NoZWQgaW5zdGFuY2UKKyAqIEBwYXJhbSBwX2FnZ19zbGEgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHNsYSBjb25maWd1cmF0aW9uCisgKgorICogQG5vdGUgRm9yIE1hcGxlIHRvIGFjY2VwdCB0aGUgc2xhIGNvbmZpZzoKKyAqICAgICAoMSkgdGhlIHNiciBhbmQgcGJyIHZhbHVlcyBmcm9tIEJBTCB1c2VyIHNob3VsZCBiZSBpbiBpbmNyZW1lbnRzIG9mIDI1NiBLQml0cy9zZWMuCisgKiAgICAgKDIpIEFsc28sIHRoZSBzYnIgIHNob3VsZCBiZSBhdCBsZWFzdCAyNTYgS2JpdHMvc2VjIGxlc3MgdGhhbiB0aGUgcGJyLgorICogICAgICgzKSBzYnIgdmFsdWUgY2FuIGJlIDAgb3IgZWxzZSBhdCBsZWFzdCAyNTYgS2JpdHMvc2VjCisgKiAgICAgKDQpIHBiciB2YWx1ZSBjYW4gYmUgMjU2IEtiaXRzL3NlYyBvciBhYm92ZQorICoKKyAqIEBub3RlICBUaGUgU0xBIGlzIHVzZWQgZm9yIHRoZSB1cHN0cmVhbSBhbGxvY19pZCByZWFsbHksIGV2ZW4gdGhvdWdoIHRoaXMgaXMgYmVpbmcgY2FsbGVkIGZvciBkb3duc3RyZWFtIGFuZCB1cHN0cmVhbS4KKyAqCisgKi8KK3ZvaWQgbWFjX3V0aWxfYXNzaWduX2FnZ19wb3J0X3NsYShiY21iYWxfdG1fc2NoZWRfY2ZnICpwX3RtX3NjaGVkX3JlcSwgYmNtb2x0X3Bvbl9hbGxvY19zbGEgKnBfYWdnX3NsYSkKK3sKKworICAgIEJVR19PTihOVUxMID09IHBfdG1fc2NoZWRfcmVxKTsKKworICAgIGlmKEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfdG1fc2NoZWRfcmVxLT5kYXRhLnJhdGUsdG1fc2hhcGluZywgc2JyKSkKKyAgICB7CisgICAgICAgIHBfYWdnX3NsYS0+Z3VhcmFudGVlZF9idyA9IEtJTE9CSVRTX1BFUl9TRUMyQllURVNfUEVSX1NFQyhwX3RtX3NjaGVkX3JlcS0+ZGF0YS5yYXRlLnNicik7CisgICAgICAgIC8qIEFsaWduIHRoZSBCVyB0byA4S0J5dGVzIGdyYW51bGFyaXR5KGFsd2F5cyB1cHdhcmQgYWRqdXN0bWVudCkgKi8KKyAgICAgICAgcF9hZ2dfc2xhLT5ndWFyYW50ZWVkX2J3ID0gU0xBX0JXX05LQllURVNfQUxJR05FRChwX2FnZ19zbGEtPmd1YXJhbnRlZWRfYncsIE1BQ19VVElMX1BNREIocF90bV9zY2hlZF9yZXEtPmRhdGEub3duZXIudS5hZ2dfcG9ydC5pbnRmX2lkKS5zbGFfdXNfcmF0ZV9mYWN0b3IpOworICAgICAgICBpZihCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX3RtX3NjaGVkX3JlcS0+ZGF0YS5yYXRlLCB0bV9zaGFwaW5nLCBwYnIpKQorICAgICAgICB7CisgICAgICAgICAgICBwX2FnZ19zbGEtPm1heGltdW1fYncgPSBLSUxPQklUU19QRVJfU0VDMkJZVEVTX1BFUl9TRUMocF90bV9zY2hlZF9yZXEtPmRhdGEucmF0ZS5wYnIpOworICAgICAgICAgICAgLyogbWF4IHJhdGUgc2hvdWxkIGJlIGJpZ2dlciBieSAzMktCeXRlcy9zZWMgdGhhbiBndWFyYW50ZWVkIHJhdGUgKi8KKyAgICAgICAgICAgIGlmKE1BUExFX01JTl9CWVRFU19QRVJfU0VDX0ZPUl9ERUZBVUxUX0FMTE9DX0lEID4ocF9hZ2dfc2xhLT5tYXhpbXVtX2J3IC0gcF9hZ2dfc2xhLT5ndWFyYW50ZWVkX2J3KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX2FnZ19zbGEtPm1heGltdW1fYncgPSBwX2FnZ19zbGEtPmd1YXJhbnRlZWRfYncgKyBNQVBMRV9NSU5fQllURVNfUEVSX1NFQ19GT1JfREVGQVVMVF9BTExPQ19JRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFbHNlLCBhbGlnbiB0aGUgQlcgdG8gOEtCeXRlcyBncmFudWxhcml0eShhbHdheXMgdXB3YXJkIGFkanVzdG1lbnQpICovCisgICAgICAgICAgICAgICAgcF9hZ2dfc2xhLT5tYXhpbXVtX2J3ID0gU0xBX0JXX05LQllURVNfQUxJR05FRChwX2FnZ19zbGEtPm1heGltdW1fYncsIE1BQ19VVElMX1BNREIocF90bV9zY2hlZF9yZXEtPmRhdGEub3duZXIudS5hZ2dfcG9ydC5pbnRmX2lkKS5zbGFfdXNfcmF0ZV9mYWN0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogbWF4IHJhdGUgc2hvdWxkIGJlIGJpZ2dlciBieSAzMktCeXRlcy9zZWMgdGhhbiBndWFyYW50ZWVkIHJhdGUgKi8KKyAgICAgICAgICAgIHBfYWdnX3NsYS0+bWF4aW11bV9idyA9IHBfYWdnX3NsYS0+Z3VhcmFudGVlZF9idyArIE1BUExFX01JTl9CWVRFU19QRVJfU0VDX0ZPUl9ERUZBVUxUX0FMTE9DX0lEOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF90bV9zY2hlZF9yZXEtPmRhdGEucmF0ZSwgdG1fc2hhcGluZywgcGJyKSkKKyAgICB7CisgICAgICAgIHBfYWdnX3NsYS0+bWF4aW11bV9idyA9IEtJTE9CSVRTX1BFUl9TRUMyQllURVNfUEVSX1NFQyhwX3RtX3NjaGVkX3JlcS0+ZGF0YS5yYXRlLnBicik7CisKKyAgICAgICAgLyogQWxpZ24gdGhlIEJXIHRvIDhLQnl0ZXMgZ3JhbnVsYXJpdHkoYWx3YXlzIHVwd2FyZCBhZGp1c3RtZW50KSAqLworICAgICAgICBwX2FnZ19zbGEtPm1heGltdW1fYncgID0gU0xBX0JXX05LQllURVNfQUxJR05FRChwX2FnZ19zbGEtPm1heGltdW1fYncgLCBNQUNfVVRJTF9QTURCKHBfdG1fc2NoZWRfcmVxLT5kYXRhLm93bmVyLnUuYWdnX3BvcnQuaW50Zl9pZCkuc2xhX3VzX3JhdGVfZmFjdG9yKTsKKyAgICAgICAgLyogc2luY2Ugb25seSBtYXhfcmF0ZSB3YXMgc3BlY2lmaWVkLCBpdCBpcyBiZXN0IGVmZm9ydCwgc28gc2V0IHRoZSBtaW4gcmF0ZSA9IDAgKi8KKyAgICAgICAgcF9hZ2dfc2xhLT5ndWFyYW50ZWVkX2J3ID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgICAvKiBOb3RoaW5nIGlzIHNldCwgc28gYXNzaWduIHRoZSBkZWZhdWx0cyh0aGF0IHN1aXRzIEdQT04pIHRpbWVzIHRoZSBTTEEgVVMgcmF0ZSBmYWN0b3IoR1BPTj0xLCBYRy1QT04xPTIsIFhHUy1QT04sTkctUE9OMj04KSAqLworICAgICAgICBwX2FnZ19zbGEtPmd1YXJhbnRlZWRfYncgPSBTTEFfR1VBUkFOVEVFRF9CV19ERUZBVUxUX0JZVEVTX1BFUl9TRUMgKiBNQUNfVVRJTF9QTURCKHBfdG1fc2NoZWRfcmVxLT5kYXRhLm93bmVyLnUuYWdnX3BvcnQuaW50Zl9pZCkuc2xhX3VzX3JhdGVfZmFjdG9yOworICAgICAgICBwX2FnZ19zbGEtPm1heGltdW1fYncgPSBTTEFfTUFYX0JXX0RFRkFVTFRfQllURVNfUEVSX1NFQyAqIE1BQ19VVElMX1BNREIocF90bV9zY2hlZF9yZXEtPmRhdGEub3duZXIudS5hZ2dfcG9ydC5pbnRmX2lkKS5zbGFfdXNfcmF0ZV9mYWN0b3I7CisgICAgfQorICAgIGlmKEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfdG1fc2NoZWRfcmVxLT5kYXRhLnRjb250X3NsYSwgdG1fdGNvbnRfc2xhLCBucnRfY2JyKSkKKyAgICB7CisgICAgICAgIC8qIEFsaWduIHRoZSBCVyB0byA4S0J5dGVzIGdyYW51bGFyaXR5KGFsd2F5cyB1cHdhcmQgYWRqdXN0bWVudCkgKi8KKyAgICAgICAgcF9hZ2dfc2xhLT5jYnJfbnJ0X2J3ID0gU0xBX0JXX05LQllURVNfQUxJR05FRChwX3RtX3NjaGVkX3JlcS0+ZGF0YS50Y29udF9zbGEubnJ0X2NiciwgTUFDX1VUSUxfUE1EQihwX3RtX3NjaGVkX3JlcS0+ZGF0YS5vd25lci51LmFnZ19wb3J0LmludGZfaWQpLnNsYV91c19yYXRlX2ZhY3Rvcik7CQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwX2FnZ19zbGEtPmNicl9ucnRfYncgPSAwOworICAgIH0KKworICAgIGlmKEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfdG1fc2NoZWRfcmVxLT5kYXRhLnRjb250X3NsYSwgdG1fdGNvbnRfc2xhLCBydF9jYnIpKQorICAgIHsKKyAgICAgICAgLyogQWxpZ24gdGhlIEJXIHRvIDhLQnl0ZXMgZ3JhbnVsYXJpdHkoYWx3YXlzIHVwd2FyZCBhZGp1c3RtZW50KSAqLworICAgICAgICBwX2FnZ19zbGEtPmNicl9ydF9idyA9IFNMQV9CV19OS0JZVEVTX0FMSUdORUQocF90bV9zY2hlZF9yZXEtPmRhdGEudGNvbnRfc2xhLnJ0X2NiciwgTUFDX1VUSUxfUE1EQihwX3RtX3NjaGVkX3JlcS0+ZGF0YS5vd25lci51LmFnZ19wb3J0LmludGZfaWQpLnNsYV91c19yYXRlX2ZhY3Rvcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBfYWdnX3NsYS0+Y2JyX3J0X2J3ID0gMDsKKyAgICB9CisKKyAgICBpZihCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX3RtX3NjaGVkX3JlcS0+ZGF0YS50Y29udF9zbGEsIHRtX3Rjb250X3NsYSwgZXh0cmFfYndfZWxpZykpCisgICAgeworICAgICAgICBwX2FnZ19zbGEtPmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgPSBwX3RtX3NjaGVkX3JlcS0+ZGF0YS50Y29udF9zbGEuZXh0cmFfYndfZWxpZzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcF9hZ2dfc2xhLT5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ID0gQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfQkVTVF9FRkZPUlQ7CisgICAgfQorICAgIAorICAgIGlmKEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfdG1fc2NoZWRfcmVxLT5kYXRhLnRjb250X3NsYSwgdG1fdGNvbnRfc2xhLCBydF9wcm9maWxlKSkKKyAgICB7CisgICAgICAgIHBfYWdnX3NsYS0+Y2JyX3J0X2FwX2luZGV4ID0gcF90bV9zY2hlZF9yZXEtPmRhdGEudGNvbnRfc2xhLnJ0X3Byb2ZpbGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBfYWdnX3NsYS0+Y2JyX3J0X2FwX2luZGV4ID0gMDsKKyAgICB9CisgICAgCisgICAgaWYoQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF90bV9zY2hlZF9yZXEtPmRhdGEudGNvbnRfc2xhLCB0bV90Y29udF9zbGEsIG5ydF9wcm9maWxlKSkKKyAgICB7CisgICAgICAgIHBfYWdnX3NsYS0+Y2JyX25ydF9hcF9pbmRleCA9IHBfdG1fc2NoZWRfcmVxLT5kYXRhLnRjb250X3NsYS5ucnRfcHJvZmlsZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcF9hZ2dfc2xhLT5jYnJfbnJ0X2FwX2luZGV4ID0gMDsKKyAgICB9CisgICAgCisgICAgcF9hZ2dfc2xhLT5hbGxvY190eXBlID0gQkNNT0xUX0FMTE9DX1RZUEVfTlNSOworICAgIHBfYWdnX3NsYS0+Y2JyX3J0X2NvbXBlbnNhdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIHBfYWdnX3NsYS0+d2VpZ2h0ID0gMDsKKyAgICBwX2FnZ19zbGEtPnByaW9yaXR5ID0gMDsKKyAKK30KKworCisvKioKKyAqIEBicmllZiBtYXJrX2Zsb3dfY29uZmlnX2NvbXBsZXRlCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gbWFyayBhbGwgcmVsYXRlZCBmbG93IGVudHJpZXMsIHRoYXQgdGhlIGZsb3cgY29uZmlndXJhdGlvbiByZXF1ZXN0cyB0byBkZXZpY2Ugd2FzIGNvbXBsZXRlZCwKKyAqIG1lYW5pbmcgbm93IGl0IGlzIHJlYWR5IHRvIGJlIGNoZWNrZWQgZm9yIGNvbmZpZ3VyYXRpb24gY29tcGxldGlvbiBpbmRpY2F0aW9uIGZyb20gZGV2aWNlLCBhbmQgdG8gYmUgaW5kaWNhdGVkIHRvIGNvcmUuCisgKgorICogQHBhcmFtIHBfZmxvd19lbnRyeSAgcG9pbnRlciB0byBtYWMgdXRpbCBmbG93IGluc3RhbmNlCisgKgorICogQHJldHVybiB2b2lkCisgKi8KK3ZvaWQgbWFjX3V0aWxfbWFya19mbG93X2NvbmZpZ19jb21wbGV0ZShmbG93X2xpc3RfZW50cnkgKnBfZmxvd19lbnRyeSkKK3sKKyAgICBpZihOVUxMICE9IHBfZmxvd19lbnRyeSkKKyAgICB7CisgICAgICAgIHBfZmxvd19lbnRyeS0+aXNfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSBCQ01PU19UUlVFOworICAgIH0KK30KKworCisvKioKKyAqIEBicmllZiBtYXBsZV9tYWNfYnJvYWRjYXN0X2Zsb3dfYWRkCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIHNldHRpbmcgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBmb3IgYSBuZXcgYnJvYWRjYXN0IGZsb3cgOgorICogZ2VtIHBvcnQgaWQsIGl3ZiBkcyBmbG93IGFuZCBjb25maWd1cmUgaXQgYXMgYSBtaXNzIGZhbGxiYWNrIG9mIGl0cyBhc3NpZ25lZCBpbnRlcmZhY2UuCisgKiBpdCB3aWxsIGFsc28gY3JlYXRlIGFuIGVudHJ5IGZvciB0aGUgbmV3IGZsb3cgYXQgdGhlIGludGVybmFsIGZsb3dzIGxpc3QgdG8gZm9sbG93IHJlbGV2YW50IGluZGljYXRpb24KKyAqCisgKiBAcGFyYW0gcF9mbG93ICAgICAgIEEgcG9pbnRlciB0byBhIGZsb3cgb2JqZWN0CisgKiBAcGFyYW0gcGVyX2Zsb3dfbW9kZV92bGFuX2lkIHZsYW4gaWQgdXNlZCBmb3IgR0VNIHBvcnQgbWFwcGluZyBpbiBwZXIgZmxvdyBtb2RlCisgKiBAcGFyYW0gb3BfdHlwZSAgICAgIGZsb3cgImFkZCIgb3IgIm1vZGlmeSIKKyAqIEBwYXJhbSBwcF9tYWNfdXRpbF9mbG93X2VudHJ5ICAgIGFkZHIgb2YgcG9pbnRlciB0byBmbG93IGVudHJ5IGluIG1hYyB1dGlsIERCCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitiY21vc19lcnJubyBtYXBsZV9tYWNfYnJvYWRjYXN0X2Zsb3dfYWRkKGJjbWJhbF9mbG93X2NmZyAqcF9mbG93LCB1aW50MTZfdCBwZXJfZmxvd19tb2RlX3ZsYW5faWQsIGJhbF91dGlsX29wZXJfZmxvdyBvcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfbGlzdF9lbnRyeSAqKnBwX21hY191dGlsX2Zsb3dfZW50cnkpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX1BBUk07CisgICAgZmxvd19saXN0X2VudHJ5ICpwX25ld19mbG93X2VudHJ5ID0gTlVMTDsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBpbl9rZXk7CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgaW5fY2ZnOworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgZWdyX2tleTsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnIGVncl9jZmc7CisgICAgYmNtb2x0X2dwb25faXdmX2tleSBpd2Zfa2V5OworICAgIGJjbW9sdF9ncG9uX2l3Zl9jZmcgZ2V0X2l3Zl9jZmcsIHNldF9pd2ZfY2ZnOworICAgIGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiBtYWNfdGFibGVfY29uZmlndXJhdGlvbjsKKyAgICBiY21vc19ib29sIGlzX2dlbV9jb25maWdfcmVxdWlyZWQgPSBCQ01PU19UUlVFOworICAgIGJjbW9zX2Jvb2wgaXNfZ2VtX3dhaXRfZm9yX2luZCA9IEJDTU9TX1RSVUU7CisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9pZl9pZDsKKyAgICBiY21fdG9wb19wb25fbW9kZSBwb25fbW9kZTsKKworICAgICpwcF9tYWNfdXRpbF9mbG93X2VudHJ5ID0gTlVMTDsKKworICAgIC8qIGFkZCB0aGUgbmV3IGZsb3cgdG8gdGhlIGZsb3cgbGlzdCAqLworICAgIHBfbmV3X2Zsb3dfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19hbGxvYygpOworICAgIGlmKE5VTEwgPT0gcF9uZXdfZmxvd19lbnRyeSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgZmxvdyBlbnRyeVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIG1lbWNweSgmcF9uZXdfZmxvd19lbnRyeS0+YmFsX2Zsb3dfa2V5LCAmcF9mbG93LT5rZXksIHNpemVvZihiY21iYWxfZmxvd19rZXkpKTsKKyAgICBwX25ld19mbG93X2VudHJ5LT5pZl9pZCA9IHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkOworICAgIHBfbmV3X2Zsb3dfZW50cnktPnN1Yl90ZXJtX2lkID0gcF9mbG93LT5kYXRhLnN1Yl90ZXJtX2lkOworICAgIHBfbmV3X2Zsb3dfZW50cnktPnN2Y19wb3J0X2lkID0gcF9mbG93LT5kYXRhLnN2Y19wb3J0X2lkOworICAgIC8qIGJyb2FkY2FzdCBnZW0gYXJlIGFjdGl2ZSBieSBkZWZhdWx0IG9uY2UgdGhleSBhcmUgc2V0LCBubyBpbmRpY2F0aW9ucyAqLworICAgIHBfbmV3X2Zsb3dfZW50cnktPmlzX3dhaXRpbmdfZm9yX3N2Y19wb3J0X2FjdGl2ZSA9IEJDTU9TX0ZBTFNFOworICAgIHBfbmV3X2Zsb3dfZW50cnktPmluZF9zZW50ICA9IEJBTF9VVElMX0ZMT1dfSU5EX1NFTkRfTk9ORTsKKyAgICBwX25ld19mbG93X2VudHJ5LT5pc19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworCisgICAgLyogbWFrZSBzdXJlIHRoZSBicm9hZGNhc3QgZ2VtIHBvcnQgaXMgbm90IGFscmVhZHkgY29uZmlndXJlZCAvIGFzc2lnbmVkIHRvIGFueSBvbnUgb24gdGhlIGlmICovCisgICAgcmMgPSBtYXBsZV9tYWNfY2hlY2tfZ2VtX3BvcnRfaWRfY29uZmlnKHBfbmV3X2Zsb3dfZW50cnktPnN2Y19wb3J0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9uZXdfZmxvd19lbnRyeS0+aWZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX25ld19mbG93X2VudHJ5LT5zdWJfdGVybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc19nZW1fY29uZmlnX3JlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzX2dlbV93YWl0X2Zvcl9pbmQpOworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICAvKiBmcmVlIHRoZSBmbG93ICovCisgICAgICAgIF9tYWNfdXRpbF9kYl9mbG93X2ZyZWUocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQsIHBfbmV3X2Zsb3dfZW50cnkpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGlmKEJDTU9TX0ZBTFNFID09IGlzX2dlbV9jb25maWdfcmVxdWlyZWQpCisgICAgeworICAgICAgICAvKiBzb21lIGVycm9yLCBjYW4ndCBoYXZlIHRoZSBicm9hZGNhc3QgZmxvdyBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yIHRoZSBvbnUgKi8KKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwKKyAgICAgICAgICAgICAgICAgICAgIkdlbSAlZCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgb24gaWYgJWQoYXNzaWduZWQgdG8gb251X2lkICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcF9uZXdfZmxvd19lbnRyeS0+c3ZjX3BvcnRfaWQsIHBfbmV3X2Zsb3dfZW50cnktPmlmX2lkLCBwX25ld19mbG93X2VudHJ5LT5zdWJfdGVybV9pZCk7CisKKyAgICAgICAgLyogZnJlZSB0aGUgZmxvdyAqLworICAgICAgICBfbWFjX3V0aWxfZGJfZmxvd19mcmVlKHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkLCBwX25ld19mbG93X2VudHJ5KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBhZGQgdGhlIG5ldyBmbG93IHRvIHRoZSBsb2NhbCBmbG93cyBsaXN0ICovCisgICAgcmMgPSBfbWFjX3V0aWxfZGJfZmxvd19hZGQocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQsIHBfbmV3X2Zsb3dfZW50cnkpOworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogYSBicm9hZGNhc3QgZ2VtIHBvcnQgaXMgJ2Fzc2lnbmVkJyB0byB0aGUgc3BlY2lhbCBNQUNfVVRJTF9EVU1NWV9PTlVfSURfRk9SX01VTFRJQ0FTVF9HRU0gb251IGlkICovCisgICAgcmMgPSBtYXBsZV9nZW1fcG9ydF9pZF9hZGQocF9uZXdfZmxvd19lbnRyeS0+c3ZjX3BvcnRfaWQsIHBfbmV3X2Zsb3dfZW50cnktPmlmX2lkLCBNQUNfVVRJTF9EVU1NWV9PTlVfSURfRk9SX01VTFRJQ0FTVF9HRU0pOworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogZ2V0IHBoeXNpY2FsIGludGVyZmFjZSBmcm9tIGxvZ2ljYWwgaW50ZXJmYWNlICovCisgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X2xvZ2ljYWwycGh5c2ljYWwocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQsICZkZXZpY2VfaWQsICZwaHlzaWNhbF9pZl9pZCk7CisgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgcGh5c2ljYWwgaWYgZnJvbSBsb2dpY2FsIGlmKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8qIEludGVyLXdvcmtpbmcoSVdGKSBzdHVmZiBpcyByZWxldmFudCBmb3IgR1BPTiBvbmx5ICovCisgICAgcG9uX21vZGUgPSBiY21fdG9wb19wb25fZ2V0X3Bvbl9tb2RlKHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkKTsKKyAgICBpZihwb25fbW9kZSA9PSBCQ01fVE9QT19QT05fTU9ERV9HUE9OKQorICAgIHsKKyAgICAgICAgLyogY29uZmlndXJlIHRoZSBpbmdyZXNzIGZsb3cgYXMgZGVmYXVsdCBmYWxsYmFjayBpbmdyZXNzIGZsb3cgKi8KKyAgICAgICAgaW5fa2V5LnBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOworICAgICAgICBpbl9rZXkudmxhbl9pZCA9IHBlcl9mbG93X21vZGVfdmxhbl9pZDsKKyAgICAgICAgQkNNT0xUX0NGR19JTklUKCZpbl9jZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgaW5fa2V5KTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmaW5fY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kLAorICAgICAgICAgICAgQkNNT0xUX1ZMQU5fVE9fRkxPV19NQVBQSU5HX01FVEhPRF9NQUNQTFVTVklEKTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmaW5fY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnLAorICAgICAgICAgICAgQkNNT0xUX01BUFBJTkdfVEFHX01FVEhPRF9PVVRFUl9WSUQpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZpbl9jZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgdmxhbl9hY3Rpb24sIEJDTU9MVF9EU19WTEFOX0FDVElPTl9UUkFOU1BBUkVOVCk7CisKKworICAgICAgICByYyA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmluX2NmZy5oZHIpOworICAgICAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBpbmdyZXNzIGZsb3cgcG9uX25pID0gJWQgdmxhbl9pZCA9ICVkIHJjID0gJXMoJWQpLCBlcnJfdGV4dCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBpbl9rZXkucG9uX25pLCBpbl9rZXkudmxhbl9pZCwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYywgaW5fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgLyogY29uZmlndXJlIHRoZSBlZ3Jlc3MgZmxvdyBhcyBkZWZhdWx0IGZhbGxiYWNrIGVncmVzcyBmbG93ICovCisgICAgICAgIGVncl9rZXkucG9uX25pID0gcGh5c2ljYWxfaWZfaWQ7CisgICAgICAgIGVncl9rZXkuZmxvd19pZCA9IHBfZmxvdy0+ZGF0YS5zdmNfcG9ydF9pZDsKKworICAgICAgICAvKiBDb25maWd1cmUgRFMgZWdyZXNzIGhhbmRsaW5nOiBmbG93IC0+IEdFTSAqLworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmVncl9jZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBlZ3Jfa2V5KTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmZWdyX2NmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0LCBwX2Zsb3ctPmRhdGEuc3ZjX3BvcnRfaWQpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZlZ3JfY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgcGJpdF9jb250cm9sLCBCQ01PU19GQUxTRSk7CisKKyAgICAgICAgcmMgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZlZ3JfY2ZnLmhkcik7CisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29uZmlndXJlIGVncmVzcyBmbG93IHBvbl9uaSA9ICVkLCByYyA9ICVzKCVkKSwgZXJyX3RleHQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgZWdyX2tleS5wb25fbmksIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMsIGVncl9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKworICAgICAgICAvKiB1cGRhdGUgdGhlIGlmIG1pc3MgZmFsbGJhY2sgZmxvdyAqLworICAgICAgICBpd2Zfa2V5LnBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmdldF9pd2ZfY2ZnLCBncG9uX2l3ZiwgaXdmX2tleSk7CisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmc2V0X2l3Zl9jZmcsIGdwb25faXdmLCBpd2Zfa2V5KTsKKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZnZXRfaXdmX2NmZywgZ3Bvbl9pd2YsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgcmMgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZnZXRfaXdmX2NmZy5oZHIpOworICAgICAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKworICAgICAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbiA9IGdldF9pd2ZfY2ZnLmRhdGEubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb247CisgICAgICAgIG1hY190YWJsZV9jb25maWd1cmF0aW9uLm1pc3NfZmFsbGJhY2sgPSBCQ01PTFRfTUFDX1RBQkxFX01JU1NfRkFMTEJBQ0tfREVGQVVMVF9GTE9XOworICAgICAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5kZWZhdWx0X2Zsb3dfaWQgPSBlZ3Jfa2V5LmZsb3dfaWQ7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJnNldF9pd2ZfY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIG1hY190YWJsZV9jb25maWd1cmF0aW9uKTsKKworICAgICAgICByYyA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJnNldF9pd2ZfY2ZnLmhkcik7CisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29uZmlndXJlIGl3ZjogIHBvbl9uaSA9ICVkLCByYyA9ICVzKCVkKSwgZXJyX3RleHQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaXdmX2tleS5wb25fbmksIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMsIHNldF9pd2ZfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgcF9uZXdfZmxvd19lbnRyeS0+aXNfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSBCQ01PU19UUlVFOworCisgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgIiVzIEZhaWxlZDogcmMgPSAlcyglZCksIGZsb3cgSWQvVHlwZT0lZC8lZCwgaWZfaWQ9JWQsIHN1Yl90ZXJtX2lkPSVkLCAiCisgICAgICAgICAgICAgICAgInN2Y19wb3J0X2lkPSVkLCBhZ2dfaWQ9JWQsIHZsYW5faWQ9JWQsIG9wIHR5cGU9JXNcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMsCisgICAgICAgICAgICAgICAgcF9mbG93LT5rZXkuZmxvd19pZCwgcF9mbG93LT5rZXkuZmxvd190eXBlLAorICAgICAgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkLCBwX2Zsb3ctPmRhdGEuc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgcF9mbG93LT5kYXRhLnN2Y19wb3J0X2lkLCBwX2Zsb3ctPmRhdGEuYWdnX3BvcnRfaWQsIHBlcl9mbG93X21vZGVfdmxhbl9pZCwKKyAgICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX0ZMT1dfQUREID09IG9wX3R5cGUgPyAiRkxPV19BREQiOiAiSU5WQUxJRCIpKTsKKyAgICB9CisKKyAgICAvKiBzZXQgdGhlIGFyZyB0byByZXR1cm4gdGhlIGxvY2FsIGZsb3cgZW50cnkgdG8gY2FsbGVyICovCisgICAgKnBwX21hY191dGlsX2Zsb3dfZW50cnkgPSBwX25ld19mbG93X2VudHJ5OworCisgICAgcmV0dXJuIHJjOworfQorCisKKy8qKgorICogQGJyaWVmIG1hcGxlX21hY19icm9hZGNhc3RfZmxvd19yZW1vdmUKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgcmVtb3ZlcyBhIGJyb2FkY2FzdCBmbG93IGZyb20gTWFwbGUKKyAqCisgKiBAcGFyYW0gcF9mbG93ICAgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gYSBmbG93IG9iamVjdAorICogQHBhcmFtIHBlcl9mbG93X21vZGVfdmxhbl9pZCAgICAgdmxhbiBpZCBmb3IgcGVyIGZsb3cgbW9kZQorICogQHBhcmFtIG9wX3R5cGUgICAgICAgICAgICAgICAgICAgZmxvdyAicmVtb3ZlIiBvciAiY2xlYXIiCisgKiBAcGFyYW0gcF9tYWNfdXRpbF9mbG93X2VudHJ5ICAgICBtYWMgdXRpbCBmbG93IGVudHJ5CisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitiY21vc19lcnJubyBtYXBsZV9tYWNfYnJvYWRjYXN0X2Zsb3dfcmVtb3ZlKGJjbWJhbF9mbG93X2NmZyAqcF9mbG93LCB1aW50MTZfdCBwZXJfZmxvd19tb2RlX3ZsYW5faWQsIGJhbF91dGlsX29wZXJfZmxvdyBvcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dfbGlzdF9lbnRyeSAqcF9tYWNfdXRpbF9mbG93X2VudHJ5KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBmbG93X2xpc3RfZW50cnkgKnBfdGFyZ2V0X2Zsb3dfZW50cnkgPSBOVUxMOworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGluX2tleTsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBpbl9jZmc7CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBlZ3Jfa2V5OworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgZWdyX2NmZzsKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGl3Zl9rZXk7CisgICAgYmNtb2x0X2dwb25faXdmX2NmZyBzZXRfaXdmX2NmZzsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IHBoeXNpY2FsX2lmX2lkOworICAgIGJjbV90b3BvX3Bvbl9tb2RlIHBvbl9tb2RlOworCisgICAgLyogRmlyc3QgZmluZCB0aGUgZmxvdyBpbiBsb2NhbCBkYXRhYmFzZSAqLworICAgIHBfdGFyZ2V0X2Zsb3dfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfd19mbG93X2tleShwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCwgJihwX2Zsb3ctPmtleSkpOworCisgICAgaWYoTlVMTCA9PSBwX3RhcmdldF9mbG93X2VudHJ5KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwKKyAgICAgICAgICAgICAgICAiJXM6IEZhaWxlZCB0byBmaW5kIHRoZSBmbG93IGVudHJ5OiBmbG93IGlkOiAlZCwgZmxvd190eXBlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgcF9mbG93LT5rZXkuZmxvd19pZCwKKyAgICAgICAgICAgICAgIChwX2Zsb3ctPmtleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9CUk9BRENBU1QgPyAiYnJvYWRjYXN0IjoidW5pY2FzdC9tdWx0aWNhc3QiKSk7CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorCisKKyAgICAvKiBicm9hZGNhc3QgZ2VtIGFyZSBhY3RpdmUgYnkgZGVmYXVsdCBvbmNlIHRoZXkgYXJlIHNldCwgbm8gaW5kaWNhdGlvbnMgKi8KKyAgICBwX3RhcmdldF9mbG93X2VudHJ5LT5pc193YWl0aW5nX2Zvcl9zdmNfcG9ydF9hY3RpdmUgPSBCQ01PU19GQUxTRTsKKyAgICBwX3RhcmdldF9mbG93X2VudHJ5LT5pbmRfc2VudCAgPSBCQUxfVVRJTF9GTE9XX0lORF9TRU5EX05PTkU7CisgICAgcF90YXJnZXRfZmxvd19lbnRyeS0+aXNfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKworCisKKyAgICAvKiBjbGVhciBicm9hZGNhc3QgZ2VtIHBvcnQgKi8KKyAgICByYyA9IG1hcGxlX2dlbV9wb3J0X2lkX3JlbW92ZShwX3RhcmdldF9mbG93X2VudHJ5LT5zdmNfcG9ydF9pZCwgcF90YXJnZXRfZmxvd19lbnRyeS0+aWZfaWQpOworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogZ2V0IHBoeXNpY2FsIGludGVyZmFjZSBmcm9tIGxvZ2ljYWwgaW50ZXJmYWNlICovCisgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X2xvZ2ljYWwycGh5c2ljYWwocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQsICZkZXZpY2VfaWQsICZwaHlzaWNhbF9pZl9pZCk7CisgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgcGh5c2ljYWwgaWYgZnJvbSBsb2dpY2FsIGlmKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8qIEludGVyLXdvcmtpbmcoSVdGKSBzdHVmZiBpcyByZWxldmFudCBmb3IgR1BPTiBvbmx5ICovCisgICAgcG9uX21vZGUgPSBiY21fdG9wb19wb25fZ2V0X3Bvbl9tb2RlKHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkKTsKKyAgICBpZihwb25fbW9kZSA9PSBCQ01fVE9QT19QT05fTU9ERV9HUE9OKQorICAgIHsKKyAgICAgICAgLyogY2xlYXIgdGhlIGluZ3Jlc3MgZmxvdyBhcyBkZWZhdWx0IGZhbGxiYWNrIGluZ3Jlc3MgZmxvdyAqLworICAgICAgICBpbl9rZXkucG9uX25pID0gcGh5c2ljYWxfaWZfaWQ7CisgICAgICAgIGluX2tleS52bGFuX2lkID0gcGVyX2Zsb3dfbW9kZV92bGFuX2lkOworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmluX2NmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBpbl9rZXkpOworCisgICAgICAgIHJjID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZpbl9jZmcuaGRyKTsKKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNsZWFyIGluZ3Jlc3MgZmxvdyBwb25fbmkgPSAlZCB2bGFuX2lkID0gJWQgcmMgPSAlcyglZClcbiIsCisgICAgICAgICAgICAgICAgICAgIGluX2tleS5wb25fbmksIGluX2tleS52bGFuX2lkLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgLyogY2xlYXIgdGhlIGVncmVzcyBmbG93IGFzIGRlZmF1bHQgZmFsbGJhY2sgZWdyZXNzIGZsb3cgKi8KKyAgICAgICAgZWdyX2tleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICAgICAgZWdyX2tleS5mbG93X2lkID0gcF9mbG93LT5kYXRhLnN2Y19wb3J0X2lkOworICAgICAgICAvKiBDb25maWd1cmUgRFMgZWdyZXNzIGhhbmRsaW5nOiBmbG93IC0+IEdFTSAqLworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmVncl9jZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBlZ3Jfa2V5KTsKKworICAgICAgICByYyA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmZWdyX2NmZy5oZHIpOworICAgICAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY2xlYXIgZWdyZXNzIGZsb3cgcG9uX25pID0gJWQgZ2VtIHBvcnQgPSAlZCByYyA9ICVzKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZWdyX2tleS5wb25fbmksIGVncl9rZXkuZmxvd19pZCwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVwZGF0ZSB0aGUgaWYgbWlzcyBmYWxsYmFjayBmbG93ICovCisgICAgICAgIGl3Zl9rZXkucG9uX25pID0gcGh5c2ljYWxfaWZfaWQ7CisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmc2V0X2l3Zl9jZmcsIGdwb25faXdmLCBpd2Zfa2V5KTsKKworICAgICAgICByYyA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmc2V0X2l3Zl9jZmcuaGRyKTsKKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNsZWFyIGl3ZiBmbG93IHBvbl9uaSA9ICVkIHJjID0gJXMoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBpd2Zfa2V5LnBvbl9uaSwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGFsbCBEZS1jb25maWcgZG9uZSAqLworICAgIHBfdGFyZ2V0X2Zsb3dfZW50cnktPmlzX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkID0gQkNNT1NfVFJVRTsKKworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICIlcyBGYWlsZWQ6IHJjID0gJXMoJWQpLCBmbG93IElkL1R5cGU9JWQvJWQsIGlmX2lkPSVkLCBzdWJfdGVybV9pZD0lZCwgIgorICAgICAgICAgICAgICAgICJzdmNfcG9ydF9pZD0lZCwgYWdnX2lkPSVkLCB2bGFuX2lkPSVkLCBvcCB0eXBlPSVzXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksIHJjLAorICAgICAgICAgICAgICAgIHBfZmxvdy0+a2V5LmZsb3dfaWQsIHBfZmxvdy0+a2V5LmZsb3dfdHlwZSwKKyAgICAgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCwgcF9mbG93LT5kYXRhLnN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5zdmNfcG9ydF9pZCwgcF9mbG93LT5kYXRhLmFnZ19wb3J0X2lkLCBwZXJfZmxvd19tb2RlX3ZsYW5faWQsCisgICAgICAgICAgICAgICAoQkFMX1VUSUxfT1BFUl9GTE9XX1JFTU9WRSA9PSBvcF90eXBlID8gIkZMT1dfUkVNT1ZFIjooQkFMX1VUSUxfT1BFUl9GTE9XX0NMRUFSID09IG9wX3R5cGUgPyAiRkxPV19DTEVBUiI6IklOVkFMSUQiKSkpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiBtYXBsZV9tYWNfdW5pY2FzdF9mbG93X3JlbW92ZQorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIERlLWNvbmZpZ3VyZSBhIGZsb3cgYXQgdGhlIGludGVybmFsIGZsb3dzIGxpc3QgdG8KKyAqIGhhbmRsZSBpbmNvbWluZyBhbmQgb3V0Z29pbmcgcmVsZXZhbnQgaW5kaWNhdGlvbnMuCisgKiBJdCB3aWxsIGFsc28gRGUtY29uZmlndXJlIGdlbSBwb3J0IGFuZCBhbGxvYyBpZCBhdCB0aGUgZGV2aWNlIGlmIHJlcXVpcmVkLgorICoKKyAqIEBwYXJhbSBwX2Zsb3cgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZmxvdyBpbmZvCisgKiBAcGFyYW0gb3BfdHlwZSAgICAgICAgICAgICAgIEZsb3cgb3BlcmF0aW9uIHR5cGUgaS5lLiBGTE9XX1JFTU9WRSwgRkxPV19DTEVBUgorICogQHBhcmFtIHBfbWFjX3V0aWxfZmxvd19lbnRyeSBQb2ludGVyIHRvIG1hYyB1dGlsIGZsb3cgZW50cnkKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIG1hcGxlX21hY191bmljYXN0X2Zsb3dfcmVtb3ZlKGJjbWJhbF9mbG93X2NmZyAqcF9mbG93LCBiYWxfdXRpbF9vcGVyX2Zsb3cgb3BfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2xpc3RfZW50cnkgKnBfbWFjX3V0aWxfZmxvd19lbnRyeSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb3NfYm9vbCBpc19nZW1fZGVjb25maWdfcmVxdWlyZWQgPSBCQ01PU19UUlVFOworICAgIGJjbW9zX2Jvb2wgaXNfZ2VtX3dhaXRfZm9yX2luZCA9IEJDTU9TX1RSVUU7CisgICAgZmxvd19saXN0X2VudHJ5ICpwX3RhcmdldF9mbG93X2VudHJ5ID0gTlVMTDsKKyAgICAKKyAgICBCVUdfT04oTlVMTCA9PSBwX21hY191dGlsX2Zsb3dfZW50cnkpOworICAgCisgICAgZG8KKyAgICB7CisgICAgICAgIHBfdGFyZ2V0X2Zsb3dfZW50cnkgPSBwX21hY191dGlsX2Zsb3dfZW50cnk7ICAgICAgIAorICAgICAgICBwX3RhcmdldF9mbG93X2VudHJ5LT5pc193YWl0aW5nX2Zvcl9zdmNfcG9ydF9hY3RpdmUgPSBCQ01PU19UUlVFOworICAgICAgICBwX3RhcmdldF9mbG93X2VudHJ5LT5pbmRfc2VudCAgPSBCQUxfVVRJTF9GTE9XX0lORF9TRU5EX05PTkU7CisgICAgICAgIHBfdGFyZ2V0X2Zsb3dfZW50cnktPmlzX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgICAgIC8qIHNhdmUgdGhlIG9wZXJhdGlvbiB0eXBlIHNvIGFzIHRvIHJlcG9ydCBiYWNrIHRoZSByaWdodCBpbmRpY2F0aW9uIHR5cGUgdG8gY29yZSBvbiBhbiBpbmRpY2F0aW9uIGZyb20gTWFwbGUgKi8KKyAgICAgICAgcF90YXJnZXRfZmxvd19lbnRyeS0+b3BfdHlwZSA9IG9wX3R5cGU7CisgICAgICAgIAorICAgICAgICAvKiBjaGVjayBpZiBnZW0gY29uZmlndXJhdGlvbiBpcyB1c2VkIGJ5IG90aGVyIGZsb3dzIHN0aWxsLgorICAgICAgICBjb3VsZCBoYXBwZW4gaW4gY2FzZSBvZiB1cyBmbG93IGNvbmZpZ3VyZWQgYWZ0ZXIgYSBkcyBmbG93KHdpdGggdGhlIHNhbWUgZmxvd19pZCkKKyAgICAgICAgYW5kIHZpY2UgdmVyc2EsIG9yIGlmIHRoYXQgaXMgYSBjYXNlIG9mIGRpZmZlcmVudCBmbG93IHNoYXJpbmcgdGhlIHNhbWUgZ2VtIHBvcnQgaWQgKi8KKyAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBpc19nZW1fZGVjb25maWdfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbWFwbGVfbWFjX2NoZWNrX2dlbV9wb3J0X2lkX2RlY29uZmlnKHBfdGFyZ2V0X2Zsb3dfZW50cnktPnN2Y19wb3J0X2lkLAorICAgICAgICAgICAgICAgIHBfdGFyZ2V0X2Zsb3dfZW50cnktPmlmX2lkLAorICAgICAgICAgICAgICAgIHBfdGFyZ2V0X2Zsb3dfZW50cnktPnN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgICZpc19nZW1fZGVjb25maWdfcmVxdWlyZWQsCisgICAgICAgICAgICAgICAgJmlzX2dlbV93YWl0X2Zvcl9pbmQpOworICAgICAgICAgICAgLyogc2V0IHdhaXQgZm9yIGluZCBmbGFnICovCisgICAgICAgICAgICBwX3RhcmdldF9mbG93X2VudHJ5LT5pc193YWl0aW5nX2Zvcl9zdmNfcG9ydF9hY3RpdmUgPSBpc19nZW1fd2FpdF9mb3JfaW5kOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBkbyBub3QgcmVtb3ZlIHRoZSBmbG93IGVudHJ5IGZyb20gbG9jYWwgZmxvd3MgbGlzdCB5ZXQ7IHdhaXQgZm9yIGluZGljYXRpb24gYmVmb3JlIHJlbW92aW5nICovICAgICAgICAKKyAgICAgICAgLyogRGUtY29uZmlndXJlIHRoZSBnZW0gcG9ydCBpZCBpZiByZXF1aXJlZCAqLworICAgICAgICBpZihCQ01PU19UUlVFID09IGlzX2dlbV9kZWNvbmZpZ19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtYXBsZV9nZW1fcG9ydF9pZF9yZW1vdmUocF90YXJnZXRfZmxvd19lbnRyeS0+c3ZjX3BvcnRfaWQsIHBfdGFyZ2V0X2Zsb3dfZW50cnktPmlmX2lkKTsKKyAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlKDApOworICAgIAorICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBpZighKChCQ01fRVJSX05PRU5UID09IHJjKSAmJihCQUxfVVRJTF9PUEVSX0ZMT1dfQ0xFQVIgPT0gb3BfdHlwZSkpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICIlcyBGYWlsZWQ6IHJjID0gJXMoJWQpLCBmbG93IElkL1R5cGU9JWQvJWQsIGlmX2lkPSVkLCBzdWJfdGVybV9pZD0lZCwgIgorICAgICAgICAgICAgICAgICJzdmNfcG9ydF9pZD0lZCwgYWdnX2lkPSVkLCBvcCB0eXBlPSVzXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksIHJjLAorICAgICAgICAgICAgICAgIHBfZmxvdy0+a2V5LmZsb3dfaWQsIHBfZmxvdy0+a2V5LmZsb3dfdHlwZSwKKyAgICAgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCwgcF9mbG93LT5kYXRhLnN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5zdmNfcG9ydF9pZCwgcF9mbG93LT5kYXRhLmFnZ19wb3J0X2lkLAorICAgICAgICAgICAgICAgKEJBTF9VVElMX09QRVJfRkxPV19SRU1PVkUgPT0gb3BfdHlwZSA/ICJGTE9XX1JFTU9WRSI6KEJBTF9VVElMX09QRVJfRkxPV19DTEVBUiA9PSBvcF90eXBlID8gIkZMT1dfQ0xFQVIiOiJJTlZBTElEIikpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmM7CisKK30KK2JjbW9zX2Vycm5vIG1hY191dGlsX3VwZGF0ZV9mbG93c193X3N1Yl90ZXJtX3VwZGF0ZSh1aW50MzJfdCBwb25faWYsIHVpbnQzMl90IHN1Yl90ZXJtX2lkLCBtYXBsZV9tYWNfY2hlY2tfZ2VtX3BvcnRfaWQgY2hlY2tfZ2VtX3BvcnRfaWRfZnVuYywgbWFwbGVfbWFjX2NoZWNrX2FnZ19wb3J0X2lkIGNoZWNrX2FnZ19wb3J0X2lkX2Z1bmMpCit7CisgICAgZmxvd19saXN0X2VudHJ5ICpwX2N1cnJlbnRfZW50cnkgPSBOVUxMOworICAgIGZsb3dfbGlzdF9lbnRyeSAqcF9uZXh0X2VudHJ5ID0gTlVMTDsKKyAgICBiY21vc19ib29sIGR1bW15OworICAgIGJjbW9zX2Jvb2wgCWlzX2dlbV9hY3RpdmF0ZWQ7CisgICAgYmNtb3NfYm9vbCAJaXNfd2FpdF9mb3JfZ2VtX2FjdGl2YXRlZDsKKyAgICBiY21vbHRfYWxsb2Nfc3RhdGUgYWxsb2NfaWRfc3RhdGU7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLypmaW5kIGFsbCByZWxhdGVkIGZsb3dzLCBjaGVjayB0aGVpciBzdGF0ZSBhbmQgdXBkYXRlIGlmIG5lZWRlZCovCisgICAgZG8KKyAgICB7CisgICAgICAgIHBfY3VycmVudF9lbnRyeSA9IF9tYWNfdXRpbF9kYl9mbG93X2dldF9uZXh0X3dfc3ViX3Rlcm1faWQocG9uX2lmLCBzdWJfdGVybV9pZCwgcF9jdXJyZW50X2VudHJ5LCAmcF9uZXh0X2VudHJ5KTsKKyAgICAgICAgaWYoTlVMTCA9PSBwX2N1cnJlbnRfZW50cnkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIHJjID0gY2hlY2tfZ2VtX3BvcnRfaWRfZnVuYyhwb25faWYsc3ViX3Rlcm1faWQsIHBfY3VycmVudF9lbnRyeS0+c3ZjX3BvcnRfaWQsICZkdW1teSwgJmlzX2dlbV9hY3RpdmF0ZWQpOworICAgICAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocG9uX2lmKSwgIiVzIGZhaWxlZCB3aXRoIGVycm9yICVzXG4iLF9fRlVOQ1RJT05fXywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpc193YWl0X2Zvcl9nZW1fYWN0aXZhdGVkID0gIWlzX2dlbV9hY3RpdmF0ZWQ7CisgICAgICAgIAorICAgICAgICBpZihwX2N1cnJlbnRfZW50cnktPmFnZ19pZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBjaGVja19hZ2dfcG9ydF9pZF9mdW5jKHBvbl9pZiwgc3ViX3Rlcm1faWQsIHBfY3VycmVudF9lbnRyeS0+YWdnX2lkLCAmYWxsb2NfaWRfc3RhdGUpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwb25faWYpLCAiJXMgZmFpbGVkIHdpdGggZXJyb3IgJXNcbiIsX19GVU5DVElPTl9fLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKmlmIHNvbWV0aGluZyB3YXMgY2hhbmdlZC4uLi4uKi8KKyAgICAgICAgaWYocF9jdXJyZW50X2VudHJ5LT5pc193YWl0aW5nX2Zvcl9zdmNfcG9ydF9hY3RpdmUgIT0gaXNfd2FpdF9mb3JfZ2VtX2FjdGl2YXRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyp1cGRhdGUgY3VycmVudCBmbG93IGVudHJ5Ki8KKyAgICAgICAgICAgIHBfY3VycmVudF9lbnRyeS0+aXNfd2FpdGluZ19mb3Jfc3ZjX3BvcnRfYWN0aXZlID0gaXNfd2FpdF9mb3JfZ2VtX2FjdGl2YXRlZDsJCQkJCQorICAgICAgICAgICAgCisgICAgICAgICAgICAvKmNoZWNrIGlmIGEgZmxvdyBiZWNhbWUgdXAqLworICAgICAgICAgICAgaWYocF9jdXJyZW50X2VudHJ5LT5vcF90eXBlID09IEJBTF9VVElMX09QRVJfRkxPV19BREQKKyAgICAgICAgICAgICAgICAmJihpc193YWl0X2Zvcl9nZW1fYWN0aXZhdGVkKQorICAgICAgICAgICAgICAgICYmIEJBTF9VVElMX0ZMT1dfSU5EX1NFTkRfRkFJTCAhPSBwX2N1cnJlbnRfZW50cnktPmluZF9zZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hY191dGlsX3JlcG9ydF9mbG93X2F1dG9faW5kKHBvbl9pZixwX2N1cnJlbnRfZW50cnktPmJhbF9mbG93X2tleSxwX2N1cnJlbnRfZW50cnktPm9wX3R5cGUsIEJBTF9VVElMX0ZMT1dfSU5EX1NFTkRfRkFJTCk7CisgICAgICAgICAgICAgICAgcF9jdXJyZW50X2VudHJ5LT5pbmRfc2VudCA9IEJBTF9VVElMX0ZMT1dfSU5EX1NFTkRfRkFJTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qY2hlY2sgaWYgYSBmbG93IGJlY2FtZSBkb3duKi8KKyAgICAgICAgICAgIGlmKHBfY3VycmVudF9lbnRyeS0+b3BfdHlwZSA9PSBCQUxfVVRJTF9PUEVSX0ZMT1dfQURECisgICAgICAgICAgICAgICAgJiYoIWlzX3dhaXRfZm9yX2dlbV9hY3RpdmF0ZWQpCisgICAgICAgICAgICAgICAgJiYoQkFMX1VUSUxfRkxPV19JTkRfU0VORF9TVUNDRVNTICE9IHBfY3VycmVudF9lbnRyeS0+aW5kX3NlbnQpKQkJCQkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfYXV0b19pbmQocG9uX2lmLHBfY3VycmVudF9lbnRyeS0+YmFsX2Zsb3dfa2V5LHBfY3VycmVudF9lbnRyeS0+b3BfdHlwZSwgQkFMX1VUSUxfRkxPV19JTkRfU0VORF9TVUNDRVNTKTsKKyAgICAgICAgICAgICAgICBwX2N1cnJlbnRfZW50cnktPmluZF9zZW50ID0gQkFMX1VUSUxfRkxPV19JTkRfU0VORF9TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICB9CisJCS8qIGdvIHRocm91Z2ggYWxsIGZsb3dzKGFzc2lnbmVkIHdpdGggdGhlIGdpdmVuIHN1YiB0ZXJtKSB1bnRpbCBicmVhayBieSAKKwkJICAgX21hY191dGlsX2RiX2Zsb3dfZ2V0X25leHRfd19zdWJfdGVybV9pZCByZXR1cm5pbmcgTlVMTCovCisgICAgfXdoaWxlKDEpOworICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqCisgKiBAYnJpZWYgYWdnX3BvcnQgc2V0IAorICogQHBhcmFtIHBfdG1fc2NoZWRfcmVxICBwb2ludGVyIHRvIHRtX3NjaGVkIHJlcXVlc3Qgc3RydWN0dXJlIGZyb20gY29yZQorICogQHBhcmFtIG9wX3R5cGUgICAgICBBREQsIFJFTU9WRSBvciBDTEVBUgorICogQHBhcmFtIHBfdG1fc2NoZWRfaW5zdCBwb2ludGVyIHRvIHRoZSBjb3JlIHRtIHNjaGVkIE9iamVjdCBpbnN0YW5jZQorICoKKyAqIEByZXR1cm4gZXJybm8gICAgZXJyb3IKKyAqCisgKi8KK2JjbW9zX2Vycm5vICBtYXBsZV9tYWNfdXRpbF9hZ2dfcG9ydF9zZXQoYmNtYmFsX3RtX3NjaGVkX2NmZyAqcF90bV9zY2hlZF9yZXEsIGJhbF91dGlsX29wZXJfYWdnX3BvcnQgb3BfdHlwZSwgdG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZF9pbnN0KQoreworCWJjbW9zX2Vycm5vICByZXQgPSBCQ01fRVJSX09LOworICAgIGRvCisgICAgeworICAgICAgICAvKiBDaGVjayB0aGUgb3BlcmF0aW9uIGlkICovCisgICAgICAgIGlmKChCQUxfVVRJTF9PUEVSX0FHR19QT1JUX0FERCAhPSBvcF90eXBlKSAgICAmJgorICAgICAgICAgICAoQkFMX1VUSUxfT1BFUl9BR0dfUE9SVF9SRU1PVkUgIT0gb3BfdHlwZSkgJiYKKyAgICAgICAgICAgKEJBTF9VVElMX09QRVJfQUdHX1BPUlRfUkVNT1ZFICE9IG9wX3R5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF90bV9zY2hlZF9yZXEtPmRhdGEub3duZXIudS5hZ2dfcG9ydC5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBtYWNfdXRpbCBhZ2cgcG9ydCBvcGVyYXRpb24gJWQgXG4iLCBvcF90eXBlKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBhZ2cgcG9ydCBBZGQgb3IgTW9kaWZ5ICovCisgICAgICAgIGlmKEJBTF9VVElMX09QRVJfQUdHX1BPUlRfQUREID09IG9wX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9wb25fYWxsb2Nfc2xhIGFnZ19zbGE7ICAgIAorICAgICAgICAgICAgbWFjX3V0aWxfYXNzaWduX2FnZ19wb3J0X3NsYShwX3RtX3NjaGVkX3JlcSwgJmFnZ19zbGEpOworICAgICAgICAgICAgcmV0ID0gbWFwbGVfbWFjX2FnZ19wb3J0X2FkZChwX3RtX3NjaGVkX3JlcS0+ZGF0YS5vd25lci51LmFnZ19wb3J0LmludGZfaWQsIHBfdG1fc2NoZWRfcmVxLT5kYXRhLm93bmVyLnUuYWdnX3BvcnQuc3ViX3Rlcm1faWQsIHBfdG1fc2NoZWRfcmVxLT5kYXRhLm93bmVyLnUuYWdnX3BvcnQuYWdnX3BvcnRfaWQsIGFnZ19zbGEpOworICAgICAgICB9CisgICAgICAgIGlmKEJBTF9VVElMX09QRVJfQUdHX1BPUlRfUkVNT1ZFPT0gb3BfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gbWFwbGVfbWFjX2FnZ19wb3J0X3JlbW92ZShwX3RtX3NjaGVkX3JlcS0+ZGF0YS5vd25lci51LmFnZ19wb3J0LmludGZfaWQsIHBfdG1fc2NoZWRfcmVxLT5kYXRhLm93bmVyLnUuYWdnX3BvcnQuYWdnX3BvcnRfaWQpOworICAgICAgICB9CisgICAgCisgICAgfXdoaWxlKDApOworICAgIHJldHVybiByZXQ7CisKK30KKworLypAfSovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL21hYy9iYWxfbWFjX3V0aWxfY29tbW9uX2l0dV9wb24uaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbF9jb21tb25faXR1X3Bvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMGY3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL21hYy9iYWxfbWFjX3V0aWxfY29tbW9uX2l0dV9wb24uaApAQCAtMCwwICsxLDIwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKgorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKgorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEBmaWxlIGJhbF9tYWNfdXRpbF9jb21tb25faXR1X3Bvbi5oCisgKgorICogQGJyaWVmIG1hYyB1dGlsIGludGVyZmFjZXMgZGVmaW5pdGlvbiB1c2VkIGJ5IEJhbCBDb3JlLCBmb3IgSVRVIFBPTjogR1BPTiwgWEctUE9OMSwgWEdTLVBPTgorICoKKyAqIFRoaXMgZmlsZSBleHBvc2UgdGhlIEFQSXMgdG8gdGhlIGNvcmUgdG8gY29uZmlndXJlIHRoZSBtYWMKKyAqIHdpdGggcmVnYXJkaW5nIHRvIHRoZSBvcGVyYXRpb24gb2YgYWNjZXNzIHRlcm1pbmFsLCBpbnRlcmZhY2UsIHN1YnNjcmliZXIgdGVybWluYWwgYW5kIGZsb3cuCisgKgorICogQGFkZHRvZ3JvdXAgbWFjX3V0aWwKKyAqLworCisvKkB7Ki8KKworI2luY2x1ZGUgPGJhbF9tYWNfdXRpbC5oPgorCisvKioKKyAqIEBicmllZiBNYXBsZSBTTEEgYmFuZHdpZHRoIGNvbmZpZyByZXF1ZXN0IGlzIGFsaWduZWQgdG8gODAwMCBCeXRlcy9zZWMKKyAqCisgKiBAbm90ZSBzaW1pbGFyIG1hY3JvcyBhcmUgZGVmaW5lZCBpbiBiY21fY29tbW9uX2dwb24uaCBlbWJlZGRlZCBjb2RlLgorICovCisjZGVmaW5lIE1BUExFX0JXX0dSQU5VTEFSSVRZX0JZVEVTIDgwMDAKKyNkZWZpbmUgTUFQTEVfQldfR1JBTlVMQVJJVFlfQllURVNfMTBHIDE2MDAwCisjZGVmaW5lIE1BUExFX01JTl9CWVRFU19QRVJfU0VDX0ZPUl9ERUZBVUxUX0FMTE9DX0lEIDMyMDAwCisjZGVmaW5lIFNMQV9CV19OS0JZVEVTX0FMSUdORUQoX3JhdGUsIF91c19yYXRlX2ZhY3RvcikgICAgXAorICAgIChfdXNfcmF0ZV9mYWN0b3IpID09IDggPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCgoKF9yYXRlKSArIE1BUExFX0JXX0dSQU5VTEFSSVRZX0JZVEVTXzEwRy0xKSAvIE1BUExFX0JXX0dSQU5VTEFSSVRZX0JZVEVTXzEwRykgKiBNQVBMRV9CV19HUkFOVUxBUklUWV9CWVRFU18xMEcpIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKChfcmF0ZSkgKyBNQVBMRV9CV19HUkFOVUxBUklUWV9CWVRFUy0xKSAvIE1BUExFX0JXX0dSQU5VTEFSSVRZX0JZVEVTKSAqIE1BUExFX0JXX0dSQU5VTEFSSVRZX0JZVEVTKQorCisvKiBUaGUgdGh1bWItcnVsZSBpcyBHUE9OIFBPTiBjYXBhY2l0eSAoMTU1NTIwMDAwIEJwcykgZGl2aWRlZCBieSB0aGUgbWF4aW11bSBudW1iZXIgb2YgT05VcyAoMTI4KSwgcm91bmRlZCBieSBncmFudWxhcml0eSBjb25zdHJhaW50LiAqLworI2RlZmluZSBTTEFfR1VBUkFOVEVFRF9CV19ERUZBVUxUX0JZVEVTX1BFUl9TRUMgMTIwODAwMAorLyogTGlrZSB0aGUgZGVmYXVsdCBndWFyYW50ZWVkIEJXLCBidXQgc2luY2Ugd2UgYXJlIGdvaW5nIHRvIGNvbmZpZ3VyZSBiZXN0LWVmZm9ydCBjbGFzcywgYWRkaXRpb25hbCBCVyBtdXN0IGJlIGJpZ2dlciB0aGFuIGd1YXJhbnRlZWQgQlcgaW4gYXQgbGVhc3QgMzIwMDAuICovCisjZGVmaW5lIFNMQV9NQVhfQldfREVGQVVMVF9CWVRFU19QRVJfU0VDIChTTEFfR1VBUkFOVEVFRF9CV19ERUZBVUxUX0JZVEVTX1BFUl9TRUMgKyBNQVBMRV9NSU5fQllURVNfUEVSX1NFQ19GT1JfREVGQVVMVF9BTExPQ19JRCkKKyNkZWZpbmUgS0lMT0JJVFNfUEVSX1NFQzJCWVRFU19QRVJfU0VDKHgpICgodWludDY0X3QpKHgpICogMTAwMCAvIDgpCisKKworY2hhciAqbWFjX3V0aWxfaW5kaWNhdGlvbl9nZXRfb2JqX3R5cGVfc3RyIChiY21vbHRfb2JqX2lkIG9ial90eXBlLCBtYWNfdXRpbF9pbmRfb2JqX2FuZF9oYW5kbGVycyBoYW5kbGVyc1tdLCBzaXplX3QgaGFuZGxlcnNfc2l6ZSk7CitiY21vc19lcnJubyBtYWNfdXRpbF9oYW5kbGVfaW5kaWNhdGlvbiAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2csIG1hY191dGlsX2luZF9vYmpfYW5kX2hhbmRsZXJzIGhhbmRsZXJzW10sIHNpemVfdCBoYW5kbGVyc19zaXplKTsKK2JjbW9zX2Jvb2wgIG1hY191dGlsX2NoZWNrX2Zsb3dfaXNfZG91YmxlX3RhZ19yZW1vdmVfb190YWcgKGNvbnN0IGJjbWJhbF9mbG93X2NmZyAqcF9mbG93X3JlcSk7Cit2b2lkIG1hY191dGlsX2Fzc2lnbl9hZ2dfcG9ydF9zbGEgKGJjbWJhbF90bV9zY2hlZF9jZmcgKnBfdG1fc2NoZWRfcmVxLCBiY21vbHRfcG9uX2FsbG9jX3NsYSAqcF9hZ2dfc2xhKTsKKworYmNtb3NfZXJybm8gbWFwbGVfbWFjX3VuaWNhc3RfZmxvd19hZGQgKGJjbWJhbF9mbG93X2NmZyAqcF9mbG93LCB1aW50MTZfdCBwYml0LCB1aW50MTZfdCBwZXJfZmxvd19tb2RlX3ZsYW5faWQsIGJhbF91dGlsX29wZXJfZmxvdyBvcF90eXBlLCBmbG93X2xpc3RfZW50cnkgKipwcF9tYWNfdXRpbF9mbG93X2VudHJ5KTsKK2JjbW9zX2Vycm5vIG1hcGxlX21hY191bmljYXN0X2Zsb3dfcmVtb3ZlIChiY21iYWxfZmxvd19jZmcgKnBfZmxvdywgYmFsX3V0aWxfb3Blcl9mbG93IG9wX3R5cGUsIGZsb3dfbGlzdF9lbnRyeSAqcF9tYWNfdXRpbF9mbG93X2VudHJ5KTsKK2JjbW9zX2Vycm5vIG1hcGxlX21hY19icm9hZGNhc3RfZmxvd19hZGQgKGJjbWJhbF9mbG93X2NmZyAqcF9mbG93LCB1aW50MTZfdCBwZXJfZmxvd19tb2RlX3ZsYW5faWQsIGJhbF91dGlsX29wZXJfZmxvdyBvcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2xpc3RfZW50cnkgKipwcF9tYWNfdXRpbF9mbG93X2VudHJ5KTsKK2JjbW9zX2Vycm5vIG1hcGxlX21hY19icm9hZGNhc3RfZmxvd19yZW1vdmUgKGJjbWJhbF9mbG93X2NmZyAqcF9mbG93LCB1aW50MTZfdCBwZXJfZmxvd19tb2RlX3ZsYW5faWQsIGJhbF91dGlsX29wZXJfZmxvdyBvcF90eXBlLCBmbG93X2xpc3RfZW50cnkgKnBfbWFjX3V0aWxfZmxvd19lbnRyeSk7Cit2b2lkIG1hY191dGlsX21hcmtfZmxvd19jb25maWdfY29tcGxldGUoZmxvd19saXN0X2VudHJ5ICpwX2Zsb3dfZW50cnkpOworYmNtb3NfZXJybm8gbWFwbGVfZ3Bvbl9tYWNfY2hlY2tfZ2VtX3BvcnRfaWQodWludDMyX3QgaWZfaWQsIHVpbnQzMl90IG9udV9pZCwgdWludDE2X3Qgc3ZjX3BvcnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfYm9vbCAqaXNfY29uZmlndXJlZCwgYmNtb3NfYm9vbCAqaXNfYWN0aXZhdGVkKTsKK2JjbW9zX2Vycm5vIG1hcGxlX3hncG9uX21hY19jaGVja19nZW1fcG9ydF9pZCh1aW50MzJfdCBpZl9pZCwgdWludDMyX3Qgb251X2lkLCB1aW50MTZfdCBzdmNfcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX2Jvb2wgKmlzX2NvbmZpZ3VyZWQsIGJjbW9zX2Jvb2wgKmlzX2FjdGl2YXRlZCk7CitiY21vc19lcnJubyBtYXBsZV9ncG9uX2dlbV9wb3J0X2lkX2FkZCh1aW50MzJfdCBpZl9pZCwgdWludDE2X3Qgc3ZjX3BvcnRfaWQsIHVpbnQzMl90IG9udV9pZCwgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gKmNvbmZpZ3VyYXRpb24pOworYmNtb3NfZXJybm8gbWFwbGVfeGdwb25fZ2VtX3BvcnRfaWRfYWRkKHVpbnQzMl90IGlmX2lkLCB1aW50MTZfdCBzdmNfcG9ydF9pZCwgdWludDMyX3Qgb251X2lkLCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiAqY29uZmlndXJhdGlvbik7CitiY21vc19lcnJubyBtYXBsZV9ncG9uX2dlbV9wb3J0X2lkX3JlbW92ZSh1aW50MzJfdCBpZl9pZCwgdWludDE2X3Qgc3ZjX3BvcnRfaWQpOworYmNtb3NfZXJybm8gbWFwbGVfeGdwb25fZ2VtX3BvcnRfaWRfcmVtb3ZlKHVpbnQzMl90IGlmX2lkLCB1aW50MTZfdCBzdmNfcG9ydF9pZCk7CitiY21vc19lcnJubyBtYXBsZV9ncG9uX21hY19nZXRfYWxsb2NfaWRfY29uZmlnICh1aW50MzJfdCBpZl9pZCwgdWludDMyX3Qgb251X2lkLCB1aW50MTZfdCBhZ2dfaWQsIGJjbW9sdF9hbGxvY19zdGF0ZSAqYWxsb2NfaWRfc3RhdGUpOworCitiY21vc19lcnJubyBtYXBsZV94Z3Bvbl9tYWNfZ2V0X2FsbG9jX2lkX2NvbmZpZyAodWludDMyX3QgaWZfaWQsIHVpbnQzMl90IG9udV9pZCwgdWludDE2X3QgYWdnX2lkLCBiY21vbHRfYWxsb2Nfc3RhdGUgKmFsbG9jX2lkX3N0YXRlKTsKKworCitiY21vc19lcnJubyBtYXBsZV9ncG9uX3VzX2FsbG9jX2lkX2FkZCh1aW50MzJfdCBpZl9pZCwgdWludDMyX3Qgb251X2lkLCB1aW50MTZfdCBhZ2dfaWQsIGJjbW9sdF9wb25fYWxsb2Nfc2xhIGFnZ19zbGEpOworYmNtb3NfZXJybm8gbWFwbGVfeGdwb25fdXNfYWxsb2NfaWRfYWRkKHVpbnQzMl90IGlmX2lkLCB1aW50MzJfdCBvbnVfaWQsIHVpbnQxNl90IGFnZ19pZCwgYmNtb2x0X3Bvbl9hbGxvY19zbGEgYWdnX3NsYSk7CitiY21vc19lcnJubyBtYXBsZV9ncG9uX3VzX2FsbG9jX2lkX3JlbW92ZSh1aW50MzJfdCBpZl9pZCwgdWludDE2X3QgYWdnX2lkKTsKK2JjbW9zX2Vycm5vIG1hcGxlX3hncG9uX3VzX2FsbG9jX2lkX3JlbW92ZSh1aW50MzJfdCBpZl9pZCwgdWludDE2X3QgYWdnX2lkKTsKKworYmNtb3NfZXJybm8gIG1hcGxlX21hY19hZ2dfcG9ydF9hZGQodWludDMyX3QgaWZfaWQsIHVpbnQzMl90IG9udV9pZCwgdWludDE2X3QgYWdnX2lkLCBiY21vbHRfcG9uX2FsbG9jX3NsYSBzbGEpOworYmNtb3NfZXJybm8gIG1hcGxlX21hY19hZ2dfcG9ydF9yZW1vdmUodWludDMyX3QgaWZfaWQsIHVpbnQxNl90IGFnZ19pZCk7CisKKworCisvKiBmdW5jdGlvbnMgdG8gcmVnaXN0ZXIgZm9yIHNwZWNpZmljIGF1dG8gaW5kaWNhdGlvbnMgZnJvbSBtYXBsZSAqLworYmNtb3NfZXJybm8gX21hY191dGlsX3JlZ2lzdGVyX2Zvcl9hdXRvX2luZGljYXRpb25zIChzdHJ1Y3QgYmNtb2x0X3J4X2NmZyAqcF9yeF9jZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjX3V0aWxfaW5kX29ial9hbmRfaGFuZGxlcnMgb2JqX3R5cGVzX2FuZF9oYW5kbGVyc1tdLCB1aW50MTZfdCBudW1fb2JqX3R5cGVzLCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX3JlZ2lzdGVyX2Zvcl9kZXZpY2VfYXV0b19pbmRpY2F0aW9ucyAoc3RydWN0IGJjbW9sdF9yeF9jZmcgKnBfcnhfY2ZnLCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX3JlZ2lzdGVyX2Zvcl9ncG9uX2F1dG9faW5kaWNhdGlvbnMgKHN0cnVjdCBiY21vbHRfcnhfY2ZnICpwX3J4X2NmZywgYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CitiY21vc19lcnJubyBtYWNfdXRpbF9yZWdpc3Rlcl9mb3JfeGdwb25fYXV0b19pbmRpY2F0aW9ucyAoc3RydWN0IGJjbW9sdF9yeF9jZmcgKnBfcnhfY2ZnLCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKKworCisvKiogQGJyaWVmIGdlbmVyaWMgc3RydWN0IGZvciBvYmplY3Qgc2V0L3ZhbGlkYXRlIGhhbmRsZXJzIGJhc2VkIG9uIG1hYyBwcm90b2NvbHMgKi8KK3R5cGVkZWYgYmNtb3NfZXJybm8gKCptYWNfdXRpbF9iYWxfZ3JvdXBfdmFsaWRhdGVfaGFuZGxlcikgKGNvbnN0IGJjbWJhbF9ncm91cF9jZmcgKnBfZ3JvdXBfcmVxKTsKK3R5cGVkZWYgYmNtb3NfZXJybm8gKCptYWNfdXRpbF9iYWxfZ3JvdXBfc2V0X2hhbmRsZXIpIChiY21iYWxfZ3JvdXBfY2ZnICpwX2dyb3VwX3JlcSwgYmFsX3V0aWxfb3Blcl9ncm91cCBvcF90eXBlLCBncm91cF9pbnN0ICpwX2dyb3VwX2NvbnRleHQpOwordHlwZWRlZiBiY21vc19lcnJubyAoKm1hY191dGlsX2JhbF9mbG93X3ZhbGlkYXRlX2hhbmRsZXIpIChjb25zdCBiY21iYWxfZmxvd19jZmcgKnBfZmxvd19yZXEpOwordHlwZWRlZiBiY21vc19lcnJubyAoKm1hY191dGlsX2JhbF9mbG93X3NldF9oYW5kbGVyKSAoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxLCBiYWxfdXRpbF9vcGVyX2Zsb3cgb3BfdHlwZSwgZmxvd19pbnN0ICpwX2Zsb3dfY29yZSk7Cit0eXBlZGVmIGJjbW9zX2Vycm5vICgqbWFjX3V0aWxfYmFsX3N1Yl90ZXJtX3ZhbGlkYXRlX2hhbmRsZXIpIChjb25zdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgKnBfc3ViX3Rlcm1fcmVxKTsKK3R5cGVkZWYgYmNtb3NfZXJybm8gKCptYWNfdXRpbF9iYWxfc3ViX3Rlcm1fc2V0X2hhbmRsZXIpIChzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIGJhbF91dGlsX29wZXJfc3ViX3Rlcm0gb3BfdHlwZSwgYmNtb3NfYm9vbCBpc19wb3N0X2Rpc2NvdmVyeSk7Cit0eXBlZGVmIGJjbW9zX2Vycm5vICgqbWFjX3V0aWxfYmFsX2lmX3ZhbGlkYXRlX2hhbmRsZXIpIChhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtLCBiYWxfdXRpbF9vcGVyX2lmIG9wX3R5cGUpOwordHlwZWRlZiBiY21vc19lcnJubyAoKm1hY191dGlsX2JhbF9pZl9zZXRfaGFuZGxlcikgKGFjY190ZXJtX2ludGVyZmFjZSAqcF9pbnRlcmZhY2VfaW5zdCwgYmFsX3V0aWxfb3Blcl9pZiBvcF90eXBlKTsKK3R5cGVkZWYgYmNtb3NfZXJybm8gKCptYWNfdXRpbF9iYWxfYWNjX3Rlcm1fc2V0X2hhbmRsZXIpIChhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtLCBiYWxfdXRpbF9vcGVyX2FjY190ZXJtIG9wX3R5cGUsIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpOwordHlwZWRlZiBiY21vc19lcnJubyAoKm1hY191dGlsX2JhbF9hY2NfdGVybV9wb3N0X2luZGljYXRpb25fc2V0X2hhbmRsZXIpIChiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKKworCisvKioKKyAqIFN0cnVjdHVyZSBmb3IgaGFuZGxlciByb3V0aW5lcyBmb3IgZGlmZmVyZW50IHBvbiBtb2RlcyBhbmQgbG9vcGJhY2sgbW9kZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIG1hY191dGlsX2JhbF9pZl92YWxpZGF0ZV9oYW5kbGVyICAgICAgICBpZl92YWxpZGF0ZTsKKyAgICBtYWNfdXRpbF9iYWxfaWZfc2V0X2hhbmRsZXIgICAgICAgICAgICAgaWZfc2V0OworCisgICAgbWFjX3V0aWxfYmFsX3N1Yl90ZXJtX3ZhbGlkYXRlX2hhbmRsZXIgIHN1Yl90ZXJtX3ZhbGlkYXRlOworICAgIG1hY191dGlsX2JhbF9zdWJfdGVybV9zZXRfaGFuZGxlciAgICAgICBzdWJfdGVybV9zZXQ7CisKKyAgICBtYWNfdXRpbF9iYWxfZmxvd192YWxpZGF0ZV9oYW5kbGVyICAgICAgZmxvd192YWxpZGF0ZTsKKyAgICBtYWNfdXRpbF9iYWxfZmxvd19zZXRfaGFuZGxlciAgICAgICAgICAgZmxvd19zZXQ7CisKKyAgICBtYWNfdXRpbF9iYWxfZ3JvdXBfdmFsaWRhdGVfaGFuZGxlciAgICAgZ3JvdXBfdmFsaWRhdGU7CisgICAgbWFjX3V0aWxfYmFsX2dyb3VwX3NldF9oYW5kbGVyICAgICAgICAgIGdyb3VwX3NldDsKKworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGFfdXNfcmF0ZV9mYWN0b3I7Cit9IG1hY191dGlsX2hhbmRsZXJzX3Blcl9wb25fbW9kZV90OworCisKK3R5cGVkZWYgYmNtb3NfZXJybm8gKCogbWFwbGVfbWFjX2NoZWNrX2dlbV9wb3J0X2lkKSh1aW50MzJfdCBpZl9pZCwgdWludDMyX3Qgb251X2lkLCB1aW50MTZfdCBzdmNfcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfYm9vbCAqaXNfY29uZmlndXJlZCwgYmNtb3NfYm9vbCAqaXNfYWN0aXZhdGVkKTsKKwordHlwZWRlZiBiY21vc19lcnJubyAoKiBtYXBsZV9tYWNfY2hlY2tfYWdnX3BvcnRfaWQpKHVpbnQzMl90IGlmX2lkLCB1aW50MzJfdCBvbnVfaWQsIHVpbnQxNl90IGFnZ19pZCwgYmNtb2x0X2FsbG9jX3N0YXRlICphbGxvY19pZF9zdGF0ZSk7CisKKworCisvKiogYWNjZXNzIHRlcm1pbmFsIHNldCAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfZ3Bvbl8xNiAoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXRfZm9yX2dwb25fOCAoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXRfZm9yX3hncG9uXzggKGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSwgYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl94Z3MgKGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSwgYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl8xMEdfaXR1X3BvbiAoYmNtb2x0X2RldmljZV9jZmcgZGV2X2NmZywgYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CisKK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9wb3N0X2luZGljYXRpb25fc2V0X2Zvcl9ncG9uKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpOworYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3Bvc3RfaW5kaWNhdGlvbl9zZXRfZm9yX3hncG9uX3hncyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKKworYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfbG9vcGJhY2sgKGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSwgYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CisKK2JjbW9zX2Vycm5vIG1hY191dGlsX3VwZGF0ZV9mbG93c193X3N1Yl90ZXJtX3VwZGF0ZSh1aW50MzJfdCBwb25faWYsIHVpbnQzMl90IHN1Yl90ZXJtX2lkLCBtYXBsZV9tYWNfY2hlY2tfZ2VtX3BvcnRfaWQgY2hlY2tfZ2VtX3BvcnRfaWRfZnVuYywgbWFwbGVfbWFjX2NoZWNrX2FnZ19wb3J0X2lkIGNoZWNrX2FnZ19wb3J0X2lkX2Z1bmMpOworYmNtb3NfZXJybm8gIG1hcGxlX21hY191dGlsX2FnZ19wb3J0X3NldChiY21iYWxfdG1fc2NoZWRfY2ZnICpwX3RtX3NjaGVkX3JlcSwgYmFsX3V0aWxfb3Blcl9hZ2dfcG9ydCBvcF90eXBlLCB0bV9zY2hlZF9pbnN0ICpwX3RtX3NjaGVkX2luc3QpOworCisKKworLyoqCisgKiBTdHJ1Y3R1cmUgZm9yIGhhbmRsZXIgcm91dGluZXMgZm9yIGRpZmZyZW50IHN5c3RlbSBtb2RlcyBhbmQgbG9vcGJhY2sgbW9kZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIG1hY191dGlsX2JhbF9hY2NfdGVybV9zZXRfaGFuZGxlciAgICAgICBhY2NfdGVybV9zZXQ7CisgICAgbWFjX3V0aWxfYmFsX2FjY190ZXJtX3Bvc3RfaW5kaWNhdGlvbl9zZXRfaGFuZGxlciBhY2NfdGVybV9wb3N0X2luZGljYXRpb25fc2V0OworfSBtYWNfdXRpbF9iYWxfcmVxX2hhbmRsZXJzX2Zvcl9zeXN0ZW1fbW9kZV90OworI2RlZmluZSBNQUNfVVRJTF9QTURCKHBvbikgbWFjX3V0aWxfYmFsX3JlcV9oYW5kbGVyc19mb3JfcG9uX21vZGVbYmNtX3RvcG9fcG9uX2dldF9wb25fbW9kZSgocG9uKSldCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X2l3Zl9tb2RlIGl3Zl9tb2RlOworfSBtYWNfdXRpbF90b3BvX3Bvbl9jb250ZXh0OworCisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisgICAgYmNtb3NfYm9vbCBpc19jb25uZWN0ZWQ7Cit9IG1hY191dGlsX2RldmljZV9jb250ZXh0OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIG1hY191dGlsX2RldmljZV9jb250ZXh0IGRldmljZXNbQkNNX1RPUE9fTUFYX05VTV9PRl9ERVZTXTsKKyAgICBiY21vc19ib29sIGZhaWxfcmVwb3J0ZWQ7ICAgLyptb3JlIHRoYXQgb25lIGRldmljZSBtYXkgZmFpbCB0byBjb25uZWN0LCB3ZSB3b3VsZCBsaWtlIHRvIHNlbmQgdGhlIGZhaWwgZXZlbnQgdG8gY29yZSBvbmx5IG9uY2UqLworfSBtYWNfdXRpbF9hY2NfdGVybV9jb25uZWN0aXZpdHk7CisKK21hY191dGlsX2FjY190ZXJtX2Nvbm5lY3Rpdml0eSBhY2NfdGVybV9jb25uZWN0aXZpdHk7CisKK2V4dGVybiBtYWNfdXRpbF9oYW5kbGVyc19wZXJfcG9uX21vZGVfdCBtYWNfdXRpbF9iYWxfcmVxX2hhbmRsZXJzX2Zvcl9wb25fbW9kZVtdOworCisvKkB9Ki8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbF9kYl9hcGlzLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL21hYy9iYWxfbWFjX3V0aWxfZGJfYXBpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhODRjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL21hYy9iYWxfbWFjX3V0aWxfZGJfYXBpcy5jCkBAIC0wLDAgKzEsNTQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfbWFjX3V0aWxfZGJfYXBpcy5jCisgKgorICogQGJyaWVmIFRoaXMgZmlsZSBoYXMgdGhlIHdyYXBwZXIgZnVuY3Rpb25zIGFuZCB0aGUgY2FsbHMgdG8gZGF0YWJhc2UgQVBJIGZ1bmN0aW9ucy4gCisgKiBUaGVzZSB3cmFwcGVyIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJ5IG1hYyB1dGlsIGNvZGUgZm9yIERCIG9wZXJhdGlvbnMuCisgKgorICogQGFkZHRvZ3JvdXAgbWFjX3V0aWwKKyAqLworCisvKkB7Ki8KKworI2luY2x1ZGUgPGJhbF9tYWNfdXRpbC5oPgorCisKKy8qKiAKKyAqIEBicmllZiBmbG93IERCIG1hY3JvcworICogKi8KKy8qKiBAYnJpZWYgbWF4IG51bWJlciBvZiBmbG93IHR5cGVzIHN0b3JlZCBpbiB0aGUgREIuCisgKiAgQGRldGFpbHMgZm9yIG5vdyB1cHN0cmVhbSAmIGRvd25zdHJlYW0gdW5pY2FzdCBmbG93cyBvbmx5IGFyZSBzdG9yZWQgaW4gdGhlIGZsb3cgREIgCisgKiAqLworI2RlZmluZSBNQUNfVVRJTF9GTE9XX0RCX01BWF9GTE9XX1RZUEVTIDIKKworLyoqIEBicmllZiBjaGVjayBpZiBmbG93IHR5cGUga2V5IGlzIHZhbGlkICovCisjZGVmaW5lIE1BQ19VVElMX0ZMT1dfREJfRkxPV19UWVBFX0lTX1ZBTElEKF9mbG93X3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKF9mbG93X3R5cGUpID49IEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoX2Zsb3dfdHlwZSkgPD0gTUFDX1VUSUxfRkxPV19EQl9NQVhfRkxPV19UWVBFUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKworLyoqIAorICogQGJyaWVmIG1hcHMge2Zsb3cgSWQsIGZsb3dfdHlwZX0gS2V5IHBhaXIgdG8gYW4ge0luZGV4LCBzdWItSW5kZXh9IHBhaXIgdG8gYWNjZXNzIGEgZmxvdyBlbnRyeSBpbiB0aGUgQXJyYXkgREIuCisgKiAqLworI2RlZmluZSBNQUNfVVRJTF9GTE9XX0RCX0ZMT1dfSURfVFlQRTJBUlJfSU5ERVhfU1VCX0lOREVYKF9mbG93X2lkLCBfZmxvd190eXBlLCBfaW5kZXgsIF9zdWJfaW5kZXgpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9pbmRleCkgPSAoX3N1Yl9pbmRleCkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoTUFDX1VUSUxfRkxPV19EQl9GTE9XX0lEX0lTX1ZBTElEKF9mbG93X2lkKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKE1BQ19VVElMX0ZMT1dfREJfRkxPV19UWVBFX0lTX1ZBTElEKF9mbG93X3R5cGUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoX2luZGV4KSA9IChfZmxvd19pZCkgLSBtYWNfdXRpbF9mbG93X2lkX3N0YXJ0X3ZhbCsxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoX3N1Yl9pbmRleCkgPSAoX2Zsb3dfdHlwZSkgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKworLyoqIEBicmllZiBsb29rdXAgYW4gZW50cnkgZnJvbSB0aGUgQXJyYXkgYmFzZWQgb24gZmxvdyBJZCAmIHR5cGUga2V5IHBhaXIgKi8KKyNkZWZpbmUgTUFDX1VUSUxfRkxPV19EQl9FTlRSWV9HRVQoX2Zsb3dfaWQsIF9mbG93X3R5cGUsIF9mbG93X2VudHJ5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKF9mbG93X2VudHJ5KSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDMyX3QgX2luZGV4LCBfc3ViX2luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUFDX1VUSUxfRkxPV19EQl9GTE9XX0lEX1RZUEUyQVJSX0lOREVYX1NVQl9JTkRFWCgoX2Zsb3dfaWQpLCAoX2Zsb3dfdHlwZSksIChfaW5kZXgpLCAoX3N1Yl9pbmRleCkpOyBcCisgICAgICAgIGlmICghX2luZGV4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9mbG93X2VudHJ5ID0gbWFjX3V0aWxfZGJfZmxvd3NfbGlzdFtfaW5kZXhdW19zdWJfaW5kZXhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisKKy8qKiBAYnJpZWYgR2V0IEZpcnN0IG5vbi1OVUxMIGZsb3cgZW50cnkgZnJvbSB0aGUgQXJyYXkgKi8KKyNkZWZpbmUgTUFDX1VUSUxfRkxPV19EQl9FTlRSWV9HRVRfRklSU1QoX3BfZmlyc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IF9pLCBfajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChfaT0xOyBfaTw9QkFMX0FDQ19URVJNX01BWF9GTE9XUzsgX2krKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX2o9MDsgX2o8TUFDX1VUSUxfRkxPV19EQl9NQVhfRkxPV19UWVBFUzsgX2orKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKF9wX2ZpcnN0KSA9IG1hY191dGlsX2RiX2Zsb3dzX2xpc3RbX2ldW19qXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKF9wX2ZpcnN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoX3BfZmlyc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKworLyoqIEBicmllZiBHZXQgTmV4dCBub24tTlVMTCBmbG93IGVudHJ5IGZyb20gdGhlIEFycmF5ICovCisjZGVmaW5lIE1BQ19VVElMX0ZMT1dfREJfRU5UUllfR0VUX05FWFQoX3BfY3VyciwgX3BwX25leHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IF9pLCBfaiwgX2N1cnJfaSwgX2N1cnJfajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICooX3BwX25leHQpID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChfcF9jdXJyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNQUNfVVRJTF9GTE9XX0RCX0ZMT1dfSURfVFlQRTJBUlJfSU5ERVhfU1VCX0lOREVYKF9wX2N1cnItPmJhbF9mbG93X2tleS5mbG93X2lkLCBfcF9jdXJyLT5iYWxfZmxvd19rZXkuZmxvd190eXBlLCBfY3Vycl9pLCBfY3Vycl9qKTtcCisgICAgICAgICAgICBmb3IgKF9pID0gKF9jdXJyX2o8TUFDX1VUSUxfRkxPV19EQl9NQVhfRkxPV19UWVBFUy0xID9fY3Vycl9pIDogX2N1cnJfaSsxKTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBfaTw9QkFMX0FDQ19URVJNX01BWF9GTE9XUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBfaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yIChfaj0gKF9jdXJyX2o8TUFDX1VUSUxfRkxPV19EQl9NQVhfRkxPV19UWVBFUy0xID8gX2N1cnJfaisxIDogMCk7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBfajxNQUNfVVRJTF9GTE9XX0RCX01BWF9GTE9XX1RZUEVTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBfaisrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICooX3BwX25leHQpID0gbWFjX3V0aWxfZGJfZmxvd3NfbGlzdFtfaV1bX2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmICgqKF9wcF9uZXh0KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCooX3BwX25leHQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCisvKiogQGJyaWVmIFNldCBhIGZsb3cgZW50cnkgaW4gdGhlIEFycmF5ICovCisjZGVmaW5lIE1BQ19VVElMX0ZMT1dfREJfRU5UUllfU0VUKF9mbG93X2lkLCBfZmxvd190eXBlLCBfZmxvd19lbnRyeSwgX3JjKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IF9pbmRleCwgX3N1Yl9pbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1BQ19VVElMX0ZMT1dfREJfRkxPV19JRF9UWVBFMkFSUl9JTkRFWF9TVUJfSU5ERVgoKF9mbG93X2lkKSwgKF9mbG93X3R5cGUpLCAoX2luZGV4KSwgKF9zdWJfaW5kZXgpKTsgXAorICAgICAgICBpZiAoIV9pbmRleCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKF9yYykgPSBCQ01fRVJSX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYWNfdXRpbF9kYl9mbG93c19saXN0W19pbmRleF1bX3N1Yl9pbmRleF0gPSAoX2Zsb3dfZW50cnkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKworLyoqIAorICogQGJyaWVmIGZsb3cgSWQgc3RhcnRpbmcgdmFsdWUgdGhhdCBjYW4gdXNlZCBieSBTRE4gVXNlciBhcHBsaWNhdGlvbi4KKyAqIEBkZXRhaWxzIEJ5IGRlZmF1bHQgdGhlIHN0YXJ0aW5nIGZsb3cgSWQgaXMgYXNzdW1lZCB0byBiZSAxLgorICovCit1aW50MzJfdCBtYWNfdXRpbF9mbG93X2lkX3N0YXJ0X3ZhbCA9IDE7CisKKy8qKiAKKyAqIEBicmllZiBmbG93IERCIEFycmF5CisgKiBAZGV0YWlscyBUaGlzIEFycmF5IGlzIGZvciB1cHN0cmVhbSAmIGRvd25zdHJlYW0gZmxvd3MgYW5kIGNhbiBzdG9yZSBCQUxfQUNDX1RFUk1fTUFYX0ZMT1dTIGZsb3dzLgorICogICAgICAgICAgVGhpcyBhcnJheSBpcyBpbmRleGVkIGJ5IEJBTCBmbG93IElkLgorICoKKyAqIEBub3RlIEZpcnN0IGVudHJ5IHN0YXJ0cyBhdCBpbmRleCAxOyAoMCBpcyBub3QgdXNlZCkuCisgKgorICogQG5vdGUgVXBzdHJlYW0gJiBEb3duc3RyZWFtIGZsb3cgdHlwZXMgb2YgYSBwYWlyIG1heSB1c2UgdGhlIHNhbWUgRmxvdyBJZC5IZW5jZSB0aGVyZSBpcyBhIHN1Yi1hcnJheQorICogb2YgZWFjaCBvZiBGbG93IElkIGVudHJ5LiBUaGUgc3ViIGFycmF5IGhhcyB1cHN0cmVhbSBmbG93IGVudHJ5IGluIGluZGV4IDAgYW5kIGRvd25zdHJlYW0gYXQgaW5kZXggMS4KKyAqIEhlbmNlLCBhIGZsb3cgZW50cnkgaXMgYWNjZXNzaWJsZSBieSB0aGUga2V5IHBhaXIge2Zsb3dJZCwgZmxvd3R5cGV9LgorICogKi8KK3N0YXRpYyBmbG93X2xpc3RfZW50cnkgKm1hY191dGlsX2RiX2Zsb3dzX2xpc3RbQkFMX0FDQ19URVJNX01BWF9GTE9XUyArIDFdW01BQ19VVElMX0ZMT1dfREJfTUFYX0ZMT1dfVFlQRVNdOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBGbG93IERCIHdyYXBwZXIgRnVuY3Rpb25zICovCisKKy8qKiBAdG9kbyBpbiBmdXR1cmUgd2l0aCBhIG5ldyBEQiBkYXRhIHN0cnVjdHVyZSwgdGhlc2Ugd3JhcHBlciBmdW5jdGlvbnMgd291bGQKKyAqIGJlIG1pZ3JhdGVkIHRvIGNhbGwgdGhvc2UgREIgYXBpcy4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEBicmllZiBBbGxvY2F0ZSBhIG5ldyBmbG93IAorICoKKyAqIEByZXR1cm4gIGZsb3dfbGlzdF9lbnRyeSAgcG9pbnRlciB0byBhIG5ldyBmbG93IGVudHJ5CisgKi8KK2Zsb3dfbGlzdF9lbnRyeSAqX21hY191dGlsX2RiX2Zsb3dfYWxsb2MgKHZvaWQpCit7CisgICAgZmxvd19saXN0X2VudHJ5ICpwX2Zsb3cgPSBOVUxMOworCisgICAgcF9mbG93ID0gYmNtb3NfY2FsbG9jKHNpemVvZihmbG93X2xpc3RfZW50cnkpKTsKKyAgICAvKiBiY21vc19jYWxsb2MgYWxyZWFkeSBpbml0aWFsaXplcyB0aGUgbWVtb3J5IHRvIDAgKi8KKworICAgIHJldHVybiBwX2Zsb3c7Cit9CisKKy8qKgorICogQGJyaWVmIEZyZWUgYSBmbG93IChmcmVlIHRoZSBtZW1vcnkgb3IgcmV0dXJuIGl0IHRvIGZyZWUgcG9vbCkgCisgKgorICogQHBhcmFtIHBvbl9pZiAgICAgICAgICAgIHBvbiBpbnRlcmZhY2UgaWQKKyAqIEBwYXJhbSBwX2VudHJ5ICAgICAgICAgICBwb2ludGVyIHRvIGEgZmxvdyBlbnRyeQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIGJjbSBlcnJubworICoKKyAqIEBub3RlIGl0IGNoZWNrcyBpZiB0aGUgZmxvdyBiZWluZyBmcmVlZCBpcyBhbHJlYWR5IHJlbW92ZWQgZnJvbSBmbG93IERCCisgKi8KK2JjbW9zX2Vycm5vIF9tYWNfdXRpbF9kYl9mbG93X2ZyZWUgKHVpbnQzMl90IHBvbl9pZiwgZmxvd19saXN0X2VudHJ5ICpwX2VudHJ5KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmICghSVNfVkFMSURfUE9OX0lGKHBvbl9pZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGlmIChOVUxMID09IHBfZW50cnkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGZyZWUgdGhlIG1lbW9yeSAqLworICAgIGJjbW9zX2ZyZWUocF9lbnRyeSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKgorICogQGJyaWVmIEFkZCBhbiBhbHJlYWR5IGFsbG9jYXRlZCBmbG93IHRvIGZsb3cgREIgCisgKgorICogQHBhcmFtIHBvbl9pZiAgICAgICAgICAgIHBvbiBpbnRlcmZhY2UgaWQKKyAqIEBwYXJhbSBwX2VudHJ5ICAgICAgICAgICBwb2ludGVyIHRvIGEgbmV3IGZsb3cgZW50cnkKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubyBiY20gZXJybm8KKyAqCisgKiBAdG9kbyBpbiBwcm9wZXIgREIsIGl0IHNob3VsZCBjaGVjayBpZiB0aGUgZW50cnkgaXMgYWxyZWFkeSBpbiB0aGUgbGlzdCBvciBub3QKKyAqLworYmNtb3NfZXJybm8gX21hY191dGlsX2RiX2Zsb3dfYWRkICh1aW50MzJfdCBwb25faWYsIGZsb3dfbGlzdF9lbnRyeSAqcF9lbnRyeSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBpZiAoIUlTX1ZBTElEX1BPTl9JRihwb25faWYpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgaWYgKCFwX2VudHJ5KQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgTUFDX1VUSUxfRkxPV19EQl9FTlRSWV9TRVQocF9lbnRyeS0+YmFsX2Zsb3dfa2V5LmZsb3dfaWQsIHBfZW50cnktPmJhbF9mbG93X2tleS5mbG93X3R5cGUsIHBfZW50cnksIHJjKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqCisgKiBAYnJpZWYgUmVtb3ZlIGEgZmxvdyBlbnRyeSBmcm9tIGZsb3cgREIgCisgKgorICogQHBhcmFtIHBvbl9pZiAgICAgICAgICAgIHBvbiBpbnRlcmZhY2UgaWQKKyAqIEBwYXJhbSBwX2VudHJ5ICAgICAgICAgICBwb2ludGVyIHRvIGEgZmxvdyBlbnRyeQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIGJjbSBlcnJubworICoKKyAqIEB0b2RvIHRoaXMgQVBJIHdpbGwgIGJlIHBvcnRlZCB0byBkaWZmZXJlbnQgREIgd2hlbiB3ZSBoYXZlIG9uZQorICovCitiY21vc19lcnJubyBfbWFjX3V0aWxfZGJfZmxvd19yZW1vdmUgKHVpbnQzMl90IHBvbl9pZiwgZmxvd19saXN0X2VudHJ5ICpwX2VudHJ5KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmICghSVNfVkFMSURfUE9OX0lGKHBvbl9pZikpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoIXBfZW50cnkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBNQUNfVVRJTF9GTE9XX0RCX0VOVFJZX1NFVChwX2VudHJ5LT5iYWxfZmxvd19rZXkuZmxvd19pZCwgcF9lbnRyeS0+YmFsX2Zsb3dfa2V5LmZsb3dfdHlwZSwgTlVMTCwgcmMpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioKKyAqIEBicmllZiBMb29rdXAgYSBmbG93IGJhc2VkIG9uIGEgZmxvdyBpZCBhbmQgcG9uIGlmCisgKgorICogQHBhcmFtIHBvbl9pZiAgICAgICAgICAgICAgICBwb24gaW50ZXJmYWNlIGlkCisgKiBAcGFyYW0gcF9mbG93X2tleSAgICAgICAgICAgIHBvaW50ZXIgdG8gZmxvdyBrZXkKKyAqCisgKiBAcmV0dXJucyBmbG93X2xpc3RfZW50cnkgICAgIHBvaW50ZXIgYSBmbG93IGVudHJ5IGluIGxpc3QKKyAqLworZmxvd19saXN0X2VudHJ5ICpfbWFjX3V0aWxfZGJfZmxvd19nZXRfd19mbG93X2tleSAodWludDMyX3QgcG9uX2lmLCBiY21iYWxfZmxvd19rZXkgKnBfZmxvd19rZXkpCit7CisgICAgZmxvd19saXN0X2VudHJ5ICpwX2Zsb3cgPSBOVUxMOworCisgICAgaWYgKCFJU19WQUxJRF9QT05fSUYocG9uX2lmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE1BQ19VVElMX0ZMT1dfREJfRU5UUllfR0VUKHBfZmxvd19rZXktPmZsb3dfaWQsIHBfZmxvd19rZXktPmZsb3dfdHlwZSwgcF9mbG93KTsKKworICAgIHJldHVybiBwX2Zsb3c7Cit9CisKKy8qKgorICogQGJyaWVmIGdldCBuZXh0IGZsb3cgYmFzZWQgb24gZmxvdyBpZCBhbmQgcG9uX2lmCisgKgorICogQHBhcmFtIHBvbl9pZiAgICAgICAgICAgIHBvbiBpbnRlcmZhY2UgaWQKKyAqIEBwYXJhbSBwX2N1cnJfZW50cnkgICBwb2ludGVyIHRvIGN1cnJlbnQgZmxvdyBlbnRyeQorICogQHBhcmFtIHBwX25leHRfZW50cnkgIGRvdWJsZSBwb2ludGVyIHRvIG5leHQgZmxvdyBlbnRyeQorICoKKyAqIEByZXR1cm5zICBmbG93X2xpc3RfZW50cnkgIHBvaW50ZXIgdG8gbmV4dCBmbG93IGVudHJ5IGluIERCCisgKi8KK2Zsb3dfbGlzdF9lbnRyeSAqX21hY191dGlsX2RiX2Zsb3dfZ2V0X25leHRfd19mbG93X2tleSAodWludDMyX3QgcG9uX2lmLCBmbG93X2xpc3RfZW50cnkgKnBfY3Vycl9lbnRyeSwgZmxvd19saXN0X2VudHJ5ICoqcHBfbmV4dF9lbnRyeSkKK3sKKyAgICBmbG93X2xpc3RfZW50cnkgKnBfdG1wX2VudHJ5ID0gcF9jdXJyX2VudHJ5OworCisgICAgaWYgKCFJU19WQUxJRF9QT05fSUYocG9uX2lmKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsbG9nX2lkX21hY191dGlsLCJJbnZhbGlkIHBvbl9pZiAlZCAhIiwgcG9uX2lmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyoqIEBub3RlIHRoaXMgd2hpbGUgbG9vcCBpcyB0byBjb250aW51ZSB0byBpdGVyYXRlIHRocm91Z2ggdGhlIERCIHVudGlsIGFuIGVudHJ5IHdpdGggbWF0Y2hpbmcgcG9uIElmIGlzIGZvdW5kICovCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBpZiAoTlVMTCA9PSBwX3RtcF9lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZ2V0IGZpcnN0IGZsb3cgKi8KKyAgICAgICAgICAgIE1BQ19VVElMX0ZMT1dfREJfRU5UUllfR0VUX0ZJUlNUKHBfdG1wX2VudHJ5KTsKKyAgICAgICAgICAgIGlmIChwX3RtcF9lbnRyeSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNQUNfVVRJTF9GTE9XX0RCX0VOVFJZX0dFVF9ORVhUKHBfdG1wX2VudHJ5LCBwcF9uZXh0X2VudHJ5KTsKKworICAgICAgICAgICAgICAgIGlmIChwX3RtcF9lbnRyeSAmJiAocG9uX2lmID09IHBfdG1wX2VudHJ5LT5pZl9pZCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwX3RtcF9lbnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsgIC8qIGF0IHRoZSBlbmQgb2YgbGlzdCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKE5VTEwgIT0gKnBwX25leHRfZW50cnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF90bXBfZW50cnkgPSAqcHBfbmV4dF9lbnRyeTsKKyAgICAgICAgICAgICAgICBNQUNfVVRJTF9GTE9XX0RCX0VOVFJZX0dFVF9ORVhUKHBfdG1wX2VudHJ5LCBwcF9uZXh0X2VudHJ5KTsKKworICAgICAgICAgICAgICAgIGlmIChwb25faWYgPT0gcF90bXBfZW50cnktPmlmX2lkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcF90bXBfZW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7ICAvKiBhdCB0aGUgZW5kIG9mIGxpc3QgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAgTlVMTDsKK30KKworCisvKioKKyAqIEBicmllZiBnZXQgbmV4dCBmbG93IGJhc2VkIG9uIHN1YiB0ZXJtaW5hbCBpZAorICoKKyAqIEBwYXJhbSBwb25faWYgICAgICAgICAgICBwb24gaW50ZXJmYWNlIGlkCisgKiBAcGFyYW0gc3ViX3Rlcm1faWQgICAgICAgc3ViIHRlcm0gaWQgYXMgdGhlIGtleQorICogQHBhcmFtIHBfY3Vycl9lbnRyeSAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBmbG93IGVudHJ5CisgKiBAcGFyYW0gcHBfbmV4dF9lbnRyeSAgICAgZG91YmxlIHBvaW50ZXIgdG8gbmV4dCBmbG93IGVudHJ5CisgKgorICogQHJldHVybnMgIGZsb3dfbGlzdF9lbnRyeSAgcG9pbnRlciB0byBuZXh0IGZsb3cgZW50cnkgIGluIERCCisgKiAKKyAqLworZmxvd19saXN0X2VudHJ5ICpfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X3N1Yl90ZXJtX2lkICh1aW50MzJfdCBwb25faWYsIHVpbnQzMl90IHN1Yl90ZXJtX2lkLCAKKwkJCQkJCQkJCQkJCQkgICBmbG93X2xpc3RfZW50cnkgKnBfY3Vycl9lbnRyeSwgZmxvd19saXN0X2VudHJ5ICoqcHBfbmV4dF9lbnRyeSkKK3sKKyAgICBmbG93X2xpc3RfZW50cnkgKnBfdG1wX2VudHJ5ID0gTlVMTDsKKworICAgIGlmICghSVNfVkFMSURfUE9OX0lGKHBvbl9pZikpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLGxvZ19pZF9tYWNfdXRpbCwiSW52YWxpZCBwb25faWYgJWQgISIsIHBvbl9pZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBfdG1wX2VudHJ5ID0gX21hY191dGlsX2RiX2Zsb3dfZ2V0X25leHRfd19mbG93X2tleSAocG9uX2lmLCBwX2N1cnJfZW50cnksIHBwX25leHRfZW50cnkpOworCisgICAgd2hpbGUgKE5VTEwgIT0gcF90bXBfZW50cnkpCisgICAgeworICAgICAgICBpZiAoc3ViX3Rlcm1faWQgPT0gcF90bXBfZW50cnktPnN1Yl90ZXJtX2lkKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmb3VuZCBzdWJfdGVybSAgbWF0Y2ggKi8KKyAgICAgICAgICAgIHJldHVybiBwX3RtcF9lbnRyeTsKKyAgICAgICAgfQorICAgICAgICAvKiogQG5vdGUgcGFzc2luZyB0bXAgZW50cnkgaGVyZSBiZWNhdXNlIHRoaXMgaXMgYSBnZXRuZXh0IGxvb3AgaW50ZXJuYWwgdG8gdGhpcyByb3V0aW5lICovCisgICAgICAgIHBfdG1wX2VudHJ5ID0gX21hY191dGlsX2RiX2Zsb3dfZ2V0X25leHRfd19mbG93X2tleSAocG9uX2lmLCBwX3RtcF9lbnRyeSwgcHBfbmV4dF9lbnRyeSk7CisgICAgfQorCisgICAgcmV0dXJuICBOVUxMOworfQorCisvKioKKyAqIEBicmllZiBjb3VudCBvZiBmbG93cyB1c2luZyBhIGdlbSBwb3J0IGFuZCBwb25faWYKKyAqCisgKiBAcGFyYW0gcG9uX2lmICAgICAgICAgICAgcG9uIGludGVyZmFjZSBpZAorICogQHBhcmFtIGdlbV9wb3J0X2lkICAgICAgIGdlbSBwb3J0IGlkIGFzIHRoZSBrZXkKKyAqIEBwYXJhbSBwX2NvdW50ICAgICAgICAgICBwb2ludGVyIHRvIFUzMiB0byBzYXZlIGNvdW50IG9mIGZsb3dzIHVzaW5nIHRoZSBzYW1lIGdlbSBwb3J0CisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8gYmNtIGVycm5vCisgKgorICovCitiY21vc19lcnJubyBfbWFjX3V0aWxfZGJfZmxvd19jb3VudF93X2dlbSAodWludDMyX3QgcG9uX2lmLCB1aW50MTZfdCBnZW1fcG9ydF9pZCwgdWludDMyX3QgKnBfY291bnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGZsb3dfbGlzdF9lbnRyeSAqcF90bXBfZW50cnkgPSBOVUxMOworICAgIHZvaWQgKnBfcnNjX21ncl9jdXJyX2VudHJ5ID0gTlVMTDsKKyAgICB2b2lkICpwX3JzY19tZ3JfbmV4dF9lbnRyeSA9IE5VTEw7CisKKyAgICBCVUdfT04oTlVMTCA9PSBwX2NvdW50KTsKKworICAgIGlmICghSVNfVkFMSURfUE9OX0lGKHBvbl9pZikpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLGxvZ19pZF9tYWNfdXRpbCwiSW52YWxpZCBwb25faWYgJWQgISIsIHBvbl9pZik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgcF90bXBfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X2dlbSAocG9uX2lmLCBnZW1fcG9ydF9pZCwgJnBfcnNjX21ncl9jdXJyX2VudHJ5LCAmcF9yc2NfbWdyX25leHRfZW50cnkpOworICAgIHdoaWxlIChOVUxMICE9IHBfdG1wX2VudHJ5KQorICAgIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgcF90bXBfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X2dlbSAocG9uX2lmLCBnZW1fcG9ydF9pZCwgJnBfcnNjX21ncl9jdXJyX2VudHJ5LCAmcF9yc2NfbWdyX25leHRfZW50cnkpOworICAgIH0KKworICAgICpwX2NvdW50ID0gY291bnQ7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyoqCisgKiBAYnJpZWYgZ2V0IG5leHQgZmxvdyBiYXNlZCBvbiBnZW0gYW5kIHBvbiBpZgorICoKKyAqIEBwYXJhbSBwb25faWYgICAgICAgICAgICBwb24gaW50ZXJmYWNlIGlkCisgKiBAcGFyYW0gZ2VtX3BvcnRfaWQgICAgICAgZ2VtIHBvcnQgaWQgYXMgdGhlIGtleQorICogQHBhcmFtICoqcHBfcnNjX21ncl9jdXJyX2VudHJ5ICAgZG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBlbnRyeSBpbiBSc3JjIE1nciBEYXRhYmFzZQorICogQHBhcmFtICoqcHBfcnNjX21ncl9uZXh0X2VudHJ5ICAgZG91YmxlIHBvaW50ZXIgdG8gbmV4dCBlbnRyeSBpbiBSc3JjIE1nciBEYXRhYmFzZQorICoKKyAqIEByZXR1cm5zICBmbG93X2xpc3RfZW50cnkgIHBvaW50ZXIgdG8gbmV4dCBmbG93IGVudHJ5ICBpbiBEQgorICoKKyAqIEBub3RlIHRoaXMgcXVlcmllcyByZXNvdXJjZSBtZ3IgREIKKyAqLworZmxvd19saXN0X2VudHJ5ICpfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X2dlbSAodWludDMyX3QgcG9uX2lmLCB1aW50MTZfdCBnZW1fcG9ydF9pZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnBwX3JzY19tZ3JfY3Vycl9lbnRyeSwgdm9pZCAqKnBwX3JzY19tZ3JfbmV4dF9lbnRyeSkKK3sKKyAgICBmbG93X2luc3QgKnBfY29yZV9mbG93X2VudHJ5ID0gTlVMTDsKKyAgICBmbG93X2xpc3RfZW50cnkgKnBfZmxvd19lbnRyeSA9IE5VTEw7CisKKyAgICBpZiAoIUlTX1ZBTElEX1BPTl9JRihwb25faWYpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUixsb2dfaWRfbWFjX3V0aWwsIkludmFsaWQgcG9uX2lmICVkICEiLCBwb25faWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwX2NvcmVfZmxvd19lbnRyeSA9IHJzY19tZ3JfZ2VtX2dldF9uZXh0X3VzZXJfZGF0YSAocG9uX2lmLCBnZW1fcG9ydF9pZCwgcHBfcnNjX21ncl9jdXJyX2VudHJ5LCBwcF9yc2NfbWdyX25leHRfZW50cnkpOworCisgICAgd2hpbGUgKE5VTEwgIT0gcF9jb3JlX2Zsb3dfZW50cnkpCisgICAgeworICAgICAgICBwX2Zsb3dfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfd19mbG93X2tleShwb25faWYsICZwX2NvcmVfZmxvd19lbnRyeS0+Y3VycmVudF9mbG93X2luZm8ua2V5KTsKKyAgICAgICAgaWYgKHBfZmxvd19lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZm91bmQgZ2VtIG1hdGNoICovCisgICAgICAgICAgICByZXR1cm4gcF9mbG93X2VudHJ5OworICAgICAgICB9CisgICAgICAgIHBfY29yZV9mbG93X2VudHJ5ID0gcnNjX21ncl9nZW1fZ2V0X25leHRfdXNlcl9kYXRhIChwb25faWYsIGdlbV9wb3J0X2lkLCBwcF9yc2NfbWdyX2N1cnJfZW50cnksIHBwX3JzY19tZ3JfbmV4dF9lbnRyeSk7CisgICAgfQorCisgICAgcmV0dXJuICBOVUxMOworfQorCisvKioKKyAqIEBicmllZiBjb3VudCBvZiBmbG93cyB1c2luZyBhbiBhbGxvYyBpZCBhbmQgcG9uIGlmCisgKgorICogQHBhcmFtIHBvbl9pZiAgICAgICAgICAgIHBvbiBpbnRlcmZhY2UgaWQKKyAqIEBwYXJhbSBhbGxvY19pZCAgICAgICAgICBhbGxvYyBpZCBhcyB0aGUga2V5CisgKiBAcGFyYW0gcF9jb3VudCAgICAgICAgICAgcG9pbnRlciB0byBVMzIgdGhhdCBzYXZlIHRoZSBjb3VudCBvZiBmbG93cyB1c2luZyB0aGUgc2FtZSBhbGxvYyBpZAorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vIGJjbSBlcnJubworICovCitiY21vc19lcnJubyBfbWFjX3V0aWxfZGJfZmxvd19jb3VudF93X2FsbG9jX2lkICh1aW50MzJfdCBwb25faWYsIHVpbnQxNl90IGFsbG9jX2lkLCB1aW50MzJfdCAqcF9jb3VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgZmxvd19saXN0X2VudHJ5ICpwX3RtcF9lbnRyeSA9IE5VTEw7CisgICAgdm9pZCAqcF9yc2NfbWdyX2N1cnJfZW50cnkgPSBOVUxMOworICAgIHZvaWQgKnBfcnNjX21ncl9uZXh0X2VudHJ5ID0gTlVMTDsKKworICAgIEJVR19PTiggTlVMTCA9PSBwX2NvdW50KTsKKworICAgIGlmICghSVNfVkFMSURfUE9OX0lGKHBvbl9pZikpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLGxvZ19pZF9tYWNfdXRpbCwiSW52YWxpZCBwb25faWYgJWQgISIsIHBvbl9pZik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgcF90bXBfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfbmV4dF93X2FsbG9jX2lkIChwb25faWYsIGFsbG9jX2lkLCAmcF9yc2NfbWdyX2N1cnJfZW50cnksICZwX3JzY19tZ3JfbmV4dF9lbnRyeSk7CisgICAgd2hpbGUgKE5VTEwgIT0gcF90bXBfZW50cnkpCisgICAgeworICAgICAgICBjb3VudCsrOworICAgICAgICBwX3RtcF9lbnRyeSA9IF9tYWNfdXRpbF9kYl9mbG93X2dldF9uZXh0X3dfYWxsb2NfaWQgKHBvbl9pZiwgYWxsb2NfaWQsICZwX3JzY19tZ3JfY3Vycl9lbnRyeSwgJnBfcnNjX21ncl9uZXh0X2VudHJ5KTsKKyAgICB9CisKKyAgICAqcF9jb3VudCA9IGNvdW50OworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioKKyAqIEBicmllZiBnZXQgbmV4dCBmbG93IGJhc2VkIG9uIHVwc3RyZWFtIGFsbG9jIGlkIGFuZCBwb24gaWYKKyAqCisgKiBAcGFyYW0gcG9uX2lmICAgICAgICAgICAgcG9uIGludGVyZmFjZSBpZAorICogQHBhcmFtIGFsbG9jX2lkICAgICAgICAgIGFsbG9jIGlkIGFzIHRoZSBrZXkKKyAqIEBwYXJhbSAqKnBwX3JzY19tZ3JfY3Vycl9lbnRyeSAgIGRvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgZW50cnkgaW4gUnNyYyBNZ3IgRGF0YWJhc2UKKyAqIEBwYXJhbSAqKnBwX3JzY19tZ3JfbmV4dF9lbnRyeSAgIGRvdWJsZSBwb2ludGVyIHRvIG5leHQgZW50cnkgaW4gUnNyYyBNZ3IgRGF0YWJhc2UKKyAqCisgKiBAcmV0dXJucyAgZmxvd19saXN0X2VudHJ5ICBwb2ludGVyIHRvIG5leHQgZmxvdyBlbnRyeSAgaW4gREIKKyAqCisgKiBAbm90ZSB0aGlzIHF1ZXJpZXMgcmVzb3VyY2UgbWdyIERCCisgKi8KK2Zsb3dfbGlzdF9lbnRyeSAqX21hY191dGlsX2RiX2Zsb3dfZ2V0X25leHRfd19hbGxvY19pZCAodWludDMyX3QgcG9uX2lmLCB1aW50MTZfdCBhbGxvY19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnBwX3JzY19tZ3JfY3Vycl9lbnRyeSwgdm9pZCAqKnBwX3JzY19tZ3JfbmV4dF9lbnRyeSkKK3sKKyAgICBmbG93X2luc3QgKnBfY29yZV9mbG93X2VudHJ5ID0gTlVMTDsKKyAgICBmbG93X2xpc3RfZW50cnkgKnBfZmxvd19lbnRyeSA9IE5VTEw7CisKKyAgICBpZiAoIUlTX1ZBTElEX1BPTl9JRihwb25faWYpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUixsb2dfaWRfbWFjX3V0aWwsIkludmFsaWQgcG9uX2lmICVkICEiLCBwb25faWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwX2NvcmVfZmxvd19lbnRyeSA9IHJzY19tZ3JfYWxsb2NfaWRfZ2V0X25leHRfdXNlcl9kYXRhKHBvbl9pZiwgYWxsb2NfaWQsIHBwX3JzY19tZ3JfY3Vycl9lbnRyeSwgcHBfcnNjX21ncl9uZXh0X2VudHJ5KTsKKworICAgIHdoaWxlIChOVUxMICE9IHBfY29yZV9mbG93X2VudHJ5KQorICAgIHsKKyAgICAgICAgcF9mbG93X2VudHJ5ID0gX21hY191dGlsX2RiX2Zsb3dfZ2V0X3dfZmxvd19rZXkocG9uX2lmLCAmcF9jb3JlX2Zsb3dfZW50cnktPmN1cnJlbnRfZmxvd19pbmZvLmtleSk7CisgICAgICAgIGlmIChwX2Zsb3dfZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZvdW5kIGFsbG9jIGlkIG1hdGNoICovCisgICAgICAgICAgICByZXR1cm4gcF9mbG93X2VudHJ5OworICAgICAgICB9CisgICAgICAgIHBfY29yZV9mbG93X2VudHJ5ID0gcnNjX21ncl9hbGxvY19pZF9nZXRfbmV4dF91c2VyX2RhdGEocG9uX2lmLCBhbGxvY19pZCwgcHBfcnNjX21ncl9jdXJyX2VudHJ5LCBwcF9yc2NfbWdyX25leHRfZW50cnkpOworICAgIH0KKworICAgIHJldHVybiAgTlVMTDsKK30KKworLypAfSovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL21hYy9iYWxfbWFjX3V0aWxfZXBvbi5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvYmFsX21hY191dGlsX2Vwb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWU4ZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvYmFsX21hY191dGlsX2Vwb24uYwpAQCAtMCwwICsxLDEwNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKgorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICoKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKgorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICoKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBAZmlsZSBiYWxfbWFjX3V0aWxfZXBvbi5jCisgKgorICogQGJyaWVmIG1hYyB1dGlsIGludGVyZmFjZXMgZGVmaW5pdGlvbiB1c2VkIGJ5IEJhbCBDb3JlIGZvciBFUE9OCisgKgorICogVGhpcyBmaWxlIGV4cG9zZSB0aGUgQVBJcyB0byB0aGUgY29yZSB0byBjb25maWd1cmUgdGhlIG1hYworICogd2l0aCByZWdhcmRpbmcgdG8gdGhlIG9wZXJhdGlvbiBvZiBhY2Nlc3MgdGVybWluYWwsIGludGVyZmFjZSwgc3Vic2NyaWJlciB0ZXJtaW5hbCBhbmQgZmxvdy4KKyAqCisgKiBAYWRkdG9ncm91cCBtYWNfdXRpbAorICovCisKKy8qQHsqLworCisjaW5jbHVkZSA8YmFsX21hY191dGlsLmg+CisjaW5jbHVkZSA8YmFsX21hY191dGlsX2Vwb24uaD4KKworI2lmIEJBTF9FUE9OX0VYQ0xVREUKKyNpbmNsdWRlIDxiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmg+CisjaW5jbHVkZSA8YmFsX29hbV91dGlsLmg+CisjaW5jbHVkZSA8YmNtb2x0X2Vvbi5oPgorCitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVfZm9yX2Vwb25fbGluayAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpOworc3RhdGljIGJjbW9zX2Vycm5vIG1hY191dGlsX2luZGljYXRpb25faGFuZGxlX2Zvcl9lcG9uX25pIChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZyk7CisKKworLyoqIEBicmllZiBhcnJheSBzdG9yZXMgdGhlIGxpc3Qgb2YgRVBPTiByZWxhdGVkIGF1dG8gaW5kaWNhdGlvbnMgZnJvbSBNYXBsZSB0byBzdWJzY3JpYmUgKi8KK3N0YXRpYyBtYWNfdXRpbF9pbmRfb2JqX2FuZF9oYW5kbGVycyBtYWNfdXRpbF9lcG9uX2luZF9oYW5kbGVyc1tdID0KK3sKKyAgICB7QkNNT0xUX09CSl9JRF9FUE9OX0xJTkssICAgICAgICJCQ01PTFRfT0JKX0lEX0VQT05fTElOSyIsICBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZV9mb3JfZXBvbl9saW5rfSwKKyAgICB7QkNNT0xUX09CSl9JRF9FUE9OX05JLCAgICAgICAgICJCQ01PTFRfT0JKX0lEX0VQT05fTkkiLCAgICBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZV9mb3JfZXBvbl9uaX0KK307CisKKworLyogZXBvbiBvbnUgZW50cnkgc3RydWN0dXJlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBPQU1fUFJPVklTSU9OX1NUQVRFX0lETEUgPSAwLCAgICAgICAgICAvKio8IGlkbGUgLSBkaWQgbm90IHN0YXJ0IHlldCAqLworICAgIE9BTV9QUk9WSVNJT05fU1RBVEVfU1RBUlRFRCwgICAgICAgICAgICAvKio8IHN0YXJ0ZWQgLSB3YWl0aW5nIHRvIGNvbmZpZ3VyZSB0cmFmZmljIGNiIHRvIHNlbmQgYmFsIGNvcmUgZmxvdyB1cCBpbmRpY2F0aW9uICovCisgICAgT0FNX1BST1ZJU0lPTl9TVEFURV9DT01QTEVURUQsICAvKio8IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KKyAgICBPQU1fUFJPVklTSU9OX1NUQVRFX0ZBSUwvKio8IGZhaWxlZCB0byBjb21wbGV0ZSBvYW0gcHJvdmlzaW9uICovCit9IG9hbV9wcm92aXNpb25fc3RhdGU7CisKKyNkZWZpbmUgTUFDX1VUSUxfTUFYX1dBSVRJTkdfRkxPV1NfUEVSX01BQyAxNgordHlwZWRlZiBzdHJ1Y3QgZXBvbl9vbnVfbGlzdF9lbnRyeSBlcG9uX29udV9saXN0X2VudHJ5Oworc3RydWN0IGVwb25fb251X2xpc3RfZW50cnkKK3sKKyAgICBUQUlMUV9FTlRSWShlcG9uX29udV9saXN0X2VudHJ5KSBuZXh0OworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSBiYWxfb251X2tleTsgICAgICAgICAgICAgICAgICAgLyogYmFsIG9udSBrZXkgKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsKKyAgICBvYW1fcHJvdmlzaW9uX3N0YXRlIG9hbV9wcm92aXNpb25fc3RhdGU7CisgICAgdWludDhfdCB3YWl0aW5nX2Zsb3dzX251bTsKKyAgICBiY21iYWxfZmxvd19rZXkgZmxvd19rZXlzW01BQ19VVElMX01BWF9XQUlUSU5HX0ZMT1dTX1BFUl9NQUNdOworICAgIHVpbnQzMl90IHR1bm5lbF9pZDsKK307CisKKworc3RhdGljIFRBSUxRX0hFQUQoZXBvbl9vbnVfbGlzdF9oZWFkX3QsIGVwb25fb251X2xpc3RfZW50cnkpIGVwb25fb251X2xpc3Q7CisKKworLyoqIEB0b2RvIG5lZWRzIHRvIGJlIHBvcnRlZCB0byB0aGUgdG9wb2xvZ3kgc3R1YiBmdW5jdGlvbiAqLworc3RhdGljIGJjbW9sdF9kZXZpZCBtYXBsZV9kZXZpY2VfZnJvbV9pbnRlcmZhY2VfZ2V0KHVpbnQxNl90IGFjY2Vzc19pbnRfaWQpCit7CisgICAgLyogRm9yIG5vdywgYWxsIGludGVyZmFjZXMgbWFwIHRvIGRldmljZSAwICovCisgICAgcmV0dXJuIChiY21vbHRfZGV2aWQpMDsKKworfQorCisKK3N0YXRpYyB2b2lkIGVwb25fb251X2xpc3RfYWRkKGVwb25fb251X2xpc3RfZW50cnkgKmVwb25fb251X2VudHJ5KTsKK3N0YXRpYyBlcG9uX29udV9saXN0X2VudHJ5ICplcG9uX29udV9saXN0X2ZpbmRfYnlfbWFjKGNvbnN0IGJjbW9zX21hY19hZGRyZXNzICptYWNfYWRkcmVzcyk7CitzdGF0aWMgZXBvbl9vbnVfbGlzdF9lbnRyeSAqZXBvbl9vbnVfbGlzdF9maW5kX2J5X2tleShiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgKmtleSk7CitzdGF0aWMgdm9pZCBlcG9uX29udV9saXN0X3JlbW92ZV9ieV9rZXkoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5ICprZXkpOworCitzdGF0aWMgdm9pZCBtYWNfdXRpbF9jb25maWd1cmVfdHJhZmZpY19jYih2b2lkICpjb250ZXh0LAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwKKyAgICBjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqbWFjX2FkZHJlc3MsCisgICAgYmNtb3NfZXJybm8gcmVzdWx0KTsKKworc3RhdGljIHZvaWQgbWFjX3V0aWxfdW5jb25maWd1cmVfdHJhZmZpY19jYih2b2lkICpjb250ZXh0LAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwKKyAgICBjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqbWFjX2FkZHJlc3MsCisgICAgYmNtb3NfZXJybm8gcmVzdWx0KTsKKworCisjZGVmaW5lIF9tYWNfYWRkcl9mbXRfc3RyICI8JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng+IgorI2RlZmluZSBfbWFjX2FkZHJfZGF0YShtYWMpIFwKKyAgICAobWFjKS51OFswXSwgXAorICAgIChtYWMpLnU4WzFdLCBcCisgICAgKG1hYykudThbMl0sIFwKKyAgICAobWFjKS51OFszXSwgXAorICAgIChtYWMpLnU4WzRdLCBcCisgICAgKG1hYykudThbNV0KKworCitzdGF0aWMgdm9pZCBtYWNfdXRpbF9vYW1fbmVnb3RpYXRpb25fY2Iodm9pZCAqY29udGV4dCwgYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwgY29uc3QgYmNtb3NfbWFjX2FkZHJlc3MgKm1hY19hZGRyZXNzLCBiY21vc19lcnJubyByZXN1bHQpCit7CisKKyAgICBlcG9uX29udV9saXN0X2VudHJ5ICpwX29udV9lbnRyeSA9IGNvbnRleHQ7CisgICAgdWludDMyX3QgbG9naWNhbF9wb247CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBkbworICAgIHsKKworICAgICAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfcGh5c2ljYWwybG9naWNhbChkZXZpY2VfaWQsIGVwb25fbmksICZsb2dpY2FsX3Bvbik7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgIHsKKyAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGxvZ2ljYWwgaWYgZnJvbSBwaHlzaWNhbCBpZiAoZGV2aWNlX2lkICVkIHBoeXNpY2FsICVkICkgKCVzKVxuIiwgZGV2aWNlX2lkLCBlcG9uX25pLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoZXBvbl9uaSksCisgICAgICAgICAgICAgICAgImRldmljZV9pZD0ldSwgZXBvbl9uaT0ldSwgbWFjX2FkZHJlc3M9IiBfbWFjX2FkZHJfZm10X3N0ciAiIHJlc3VsdD0nJXMnXG4iLAorICAgICAgICAgICAgICAgIGRldmljZV9pZCwgZXBvbl9uaSwgX21hY19hZGRyX2RhdGEoKm1hY19hZGRyZXNzKSwgcmVzdWx0ID09IEJDTV9FUlJfT0sgPyAic3VjY2VzcyIgOiAiZmFpbCIpOworCisKKyAgICAgICAgbWFjX3V0aWxfcmVwb3J0X3N1Yl90ZXJtX2V2ZW50KGxvZ2ljYWxfcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9vbnVfZW50cnktPmJhbF9vbnVfa2V5LnN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJjbW9sdF9zZXJpYWxfbnVtYmVyICopTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQURELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID09IEJDTV9FUlJfT0sgPyBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MgOiBCQ01PTFRfUkVTVUxUX0ZBSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID09IEJDTV9FUlJfT0sgPyBwX29udV9lbnRyeS0+dHVubmVsX2lkIDogQkNNQkFMX0lOVkFMSURfVFVOTkVMX0lEKTsKKworICAgIH0KKyAgICB3aGlsZSgwKTsKKworfQorCisvKioKKyAqIEBicmllZiBnZXQgc3RyaW5nIGZvciB0aGUgaW5kaWNhdGlvbiBvYmplY3QgdHlwZSBmb3IgZXBvbgorICovCitzdGF0aWMgY2hhciAqbWFjX3V0aWxfaW5kaWNhdGlvbl9nZXRfb2JqX3R5cGVfc3RyX2Zvcl9lcG9uIChiY21vbHRfb2JqX2lkIG9ial90eXBlKQoreworICAgIHJldHVybiBfbWFjX3V0aWxfZ2V0X29ial90eXBlX3N0cl9mb3JfaW5kaWNhdGlvbnMgKG9ial90eXBlLCBtYWNfdXRpbF9lcG9uX2luZF9oYW5kbGVycywgQkNNX1NJWkVPRkFSUkFZKG1hY191dGlsX2Vwb25faW5kX2hhbmRsZXJzKSk7Cit9CisKKy8qKgorICogQGJyaWVmIGFsbCB0aGUgbWFwbGUgaW5kaWNhdGlvbiBoYW5kbGVycyBmb3IgZXBvbgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgdGhlIG1hcGxlIGRldmljZSBpZCBnZW5lcmF0aW5nIHRoZSBjdXJyZW50IGluZGljYXRpb24KKyAqIEBwYXJhbSBwX21zZyBwb2ludGVyIHRvIHRoZSBtYXBsZSBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2hhbmRsZV9hbGxfb2x0X2luZF9mb3JfZXBvbiAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpCit7CisgICAgaW50IGkgPSAwOworCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX21hY191dGlsLAorICAgICAgICAibWFjX3V0aWxfaW5kaWNhdGlvbl9jYiByZWNlaXZlZCBpbmRpY2F0aW9uIG9iaj0lZC8lcyBncm91cD0lZCBzdWJncm91cD0lZFxuIiwKKyAgICAgICAgcF9tc2ctPm9ial90eXBlLCBtYWNfdXRpbF9pbmRpY2F0aW9uX2dldF9vYmpfdHlwZV9zdHJfZm9yX2Vwb24ocF9tc2ctPm9ial90eXBlKSwKKyAgICAgICAgcF9tc2ctPmdyb3VwLCBwX21zZy0+c3ViZ3JvdXApOworCisgICAgZm9yIChpPTA7IGkgPCBCQ01fU0laRU9GQVJSQVkobWFjX3V0aWxfZXBvbl9pbmRfaGFuZGxlcnMpOyBpKyspCisgICAgeworICAgICAgICBpZiAocF9tc2ctPm9ial90eXBlID09IG1hY191dGlsX2Vwb25faW5kX2hhbmRsZXJzW2ldLm9ial90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWFjX3V0aWxfZXBvbl9pbmRfaGFuZGxlcnNbaV0uaW5kX2hhbmRsZXIgKGRldmljZV9pZCwgcF9tc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogbG9nIGFuIGVycm9yIGlmIHVuaGFuZGxlZCAqLworICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworfQorCisKKy8qKgorICogQGJyaWVmIEhhbmRsZXIgZnVuY3Rpb24gZm9yIE1hcGxlIGF1dG8gaW5kaWNhdGlvbnMgZm9yIEVQT04gTGluaworICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgdGhlIG1hcGxlIGRldmljZSBpZCBnZW5lcmF0aW5nIHRoZSBjdXJyZW50IGluZGljYXRpb24KKyAqIEBwYXJhbSBwX21zZyBwb2ludGVyIHRvIHRoZSBtYXBsZSBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZV9mb3JfZXBvbl9saW5rIChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgbG9naWNhbF9wb247CisKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYgKEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX0RJU0NPVkVSRUQgPT0gcF9tc2ctPnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgICAgICBlcG9uX29udV9saXN0X2VudHJ5ICpwX29udV9lbnRyeTsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkICogcF9pbmQgPSAoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWQqKXBfbXNnOworCisgICAgICAgICAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfcGh5c2ljYWwybG9naWNhbChkZXZpY2VfaWQsIHBfaW5kLT5rZXkuZXBvbl9uaSwgJmxvZ2ljYWxfcG9uKTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGxvZ2ljYWwgaWYgZnJvbSBwaHlzaWNhbCBpZiAoZGV2aWNlX2lkICVkIHBoeXNpY2FsICVkICkgKCVzKVxuIiwgZGV2aWNlX2lkLCBwX2luZC0+a2V5LmVwb25fbmksIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihsb2dpY2FsX3BvbiksCisgICAgICAgICAgICAgICAgICAgICJsbGlkIGluZGljYXRpb24gcmVjZWl2ZWQgb2JqPSVkIGdyb3VwPSVkIHN1Ymdyb3VwPSVkIGVycj0lZDsgIgorICAgICAgICAgICAgICAgICAgICAibGlua19zdGF0dXMgPSAlcyAoJWQpLCBsbGlkID0gKDB4JTA0eCkgdHVubmVsX2lkID0gKDB4JTA4eClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5vYmpfdHlwZSwgcF9tc2ctPmdyb3VwLCBwX21zZy0+c3ViZ3JvdXAsIHBfbXNnLT5lcnIsCisgICAgICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLmxpbmtfaW5mby5saW5rX3N0YXR1cz09QkNNT0xUX0VQT05fTElOS19TVEFUVVNfRElTQ09WRVJFRCA/ICJEaXNjb3ZlcmVkIiA6ICJvdGhlciIsCisgICAgICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLmxpbmtfaW5mby5saW5rX3N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgcF9pbmQtPmRhdGEubGlua19pbmZvLmxsaWQsCisgICAgICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLmxpbmtfaW5mby50dW5uZWxfaWQpOworCisKKworICAgICAgICAgICAgaWYoTlVMTCA9PSAocF9vbnVfZW50cnkgPSBlcG9uX29udV9saXN0X2ZpbmRfYnlfbWFjKCYocF9pbmQtPmtleS5tYWNfYWRkcmVzcykpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYobG9naWNhbF9wb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmaW5kIGVwb24gb251IHJlbGF0ZWQgdG8gcmVjZWl2ZWQgZnJhbWUgY2FwdHVyZWRcbiIpOworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHBfb251X2VudHJ5LT50dW5uZWxfaWQgPSBwX2luZC0+ZGF0YS5saW5rX2luZm8udHVubmVsX2lkOworICAgICAgICAgICAgICAgIGJhbF9vYW1fc3RhcnRfb2FtX25lZ290aWF0aW9uKGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2luZC0+a2V5LmVwb25fbmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfaW5kLT5rZXkubWFjX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjX3V0aWxfb2FtX25lZ290aWF0aW9uX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfb251X2VudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSgwKTsKKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiBIYW5kbGVyIGZ1bmN0aW9uIGZvciBNYXBsZSBhdXRvIGluZGljYXRpb25zIGZvciBFUE9OIE5JCisgKgorICogQHBhcmFtIGRldmljZV9pZCB0aGUgbWFwbGUgZGV2aWNlIGlkIGdlbmVyYXRpbmcgdGhlIGN1cnJlbnQgaW5kaWNhdGlvbgorICogQHBhcmFtIHBfbXNnIHBvaW50ZXIgdG8gdGhlIG1hcGxlIGluZGljYXRpb24gbWVzc2FnZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hY191dGlsX2luZGljYXRpb25faGFuZGxlX2Zvcl9lcG9uX25pIChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgbG9naWNhbF9wb247CisgICAgZG8KKyAgICB7CisKKyAgICAgICAgaWYgKEJDTU9MVF9FUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCA9PSBwX21zZy0+c3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgKiBwX2luZCA9IChiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkICopcF9tc2c7CisgICAgICAgICAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfcGh5c2ljYWwybG9naWNhbChkZXZpY2VfaWQsIHBfaW5kLT5rZXkuZXBvbl9uaSwgJmxvZ2ljYWxfcG9uKTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGxvZ2ljYWwgaWYgZnJvbSBwaHlzaWNhbCBpZiAoZGV2aWNlX2lkICVkIHBoeXNpY2FsICVkICkgKCVzKVxuIiwgZGV2aWNlX2lkLCBwX2luZC0+a2V5LmVwb25fbmksIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGxvZ2ljYWxfcG9uKSwgIlBvbiBpZiAlZCBpcyAlcy5cbiIsIGxvZ2ljYWxfcG9uLAorICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9FTkFCTEVEID09IHBfaW5kLT5kYXRhLm5ld19zdGF0ZSA/ICJ1cCIgOiAiZG93biIpOworCisgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfaWZfZXZlbnQobG9naWNhbF9wb24sIEJDTUJBTF9JTlRGX1RZUEVfUE9OLCBwX21zZy0+ZXJyLAorICAgICAgICAgICAgICAgIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUywgcF9pbmQtPmRhdGEubmV3X3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGp1c3QgZ2V0IHRoZSBwb24ga2V5IGJ5IHR5cGVjYXN0aW5nIHRvIGEgZHVtbXkgc3RydWN0dXJlICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9uaV9rZXkgKnBfcG9uX2tleSA9ICYoKChiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKilwX21zZyktPmtleSk7CisKKyAgICAgICAgICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9waHlzaWNhbDJsb2dpY2FsKGRldmljZV9pZCwgcF9wb25fa2V5LT5lcG9uX25pLCAmbG9naWNhbF9wb24pOworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbG9naWNhbCBpZiBmcm9tIHBoeXNpY2FsIGlmIChkZXZpY2VfaWQgJWQgcGh5c2ljYWwgJWQgKSAoJXMpXG4iLCBkZXZpY2VfaWQsIHBfcG9uX2tleS0+ZXBvbl9uaSwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGxvZ2ljYWxfcG9uKSwKKyAgICAgICAgICAgICAgICAgICAgIlVuaGFuZGxlZCBtZXNzYWdlIGluZGljYXRpb24gZm9yIG9iaiBFcG9uX05JIGdyb3VwICVkICIKKyAgICAgICAgICAgICAgICAgICAgInN1Ymdyb3VwICVkIChJZ25vcmVkKVxuIiwgcF9tc2ctPmdyb3VwLCBwX21zZy0+c3ViZ3JvdXApOworICAgICAgICB9CisKKworCisgICAgfQorICAgIHdoaWxlKDApOworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiAgTWFwbGUgYXV0byBpbmRpY2F0aW9uIHJlZ2lzdGVyIGZvciBzcGVjaWZpYyBFUE9OIGJhc2VkIGluZGljYXRpb25zCisgKgorICogQHBhcmFtIHBfcnhfY2ZnICAgICAgICAgaGFuZGxlciBjb25maWcgc3RydWN0dXJlCisgKiBAcGFyYW0gIGRldmljZV9pZCAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBkZXZpY2UgaWQgKGZvciBtdWx0aXBsZSBkZXZpY2VzIHN1cHBvcnQpCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX3JlZ2lzdGVyX2Zvcl9lcG9uX2F1dG9faW5kaWNhdGlvbnMgKHN0cnVjdCBiY21vbHRfcnhfY2ZnICpwX3J4X2NmZywgYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICByZXR1cm4gX21hY191dGlsX3JlZ2lzdGVyX2Zvcl9hdXRvX2luZGljYXRpb25zIChwX3J4X2NmZywgbWFjX3V0aWxfZXBvbl9pbmRfaGFuZGxlcnMsIEJDTV9TSVpFT0ZBUlJBWShtYWNfdXRpbF9lcG9uX2luZF9oYW5kbGVycyksIGRldmljZV9pZCk7Cit9CisjZW5kaWYgLyogQkFMX0VQT05fRVhDTFVERSAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfZXBvbl9hY2Nlc3NfdGVybWluYWxfc2V0KAorICAgIGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sCisgICAgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlLAorICAgIGJjbW9sdF9ubmlfc3BlZWQgbm5pX3NwZWVkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7fTsKKyAgICBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCBubmlfc3BlZWRfY2ZnOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGRldl9jZmc7CisKKyAgICByYyA9IG1hcGxlX2FjY2Vzc190ZXJtaW5hbF9zZXRfY29tbW9uKHBfYWNjX3Rlcm0sIG9wX3R5cGUsIGRldmljZV9pZCk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHJldHVybiByYzsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmZGV2X2NmZywgZGV2aWNlLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmRldl9jZmcsIGRldmljZSwgc3lzdGVtX21vZGUsIHN5c3RlbV9tb2RlKTsKKworICAgIG5uaV9zcGVlZF9jZmcuZmlyc3RfaGFsZiA9IG5uaV9zcGVlZDsKKyAgICBubmlfc3BlZWRfY2ZnLnNlY29uZF9oYWxmID0gbm5pX3NwZWVkOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmRldl9jZmcsIGRldmljZSwgbm5pX3NwZWVkLCBubmlfc3BlZWRfY2ZnKTsKKworICAgIC8qKiBAdG9kbyB3aXRoIG11bHRpcGxlIGRldmljZXMgdGhlIG1lY2hhbmlzbSB0byBjb25maWd1cmUgYWNjZXMgdGVybSAgd2lsbCBjaGFuZ2UgKi8KKyAgICByYyA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmRldl9jZmcuaGRyKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcmV0dXJuIG1hcGxlX2FjY2Vzc190ZXJtaW5hbF9jb25uZWN0X2NvbW1vbihkZXZpY2VfaWQpOworfQorCitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzhfdGRtYSgKKyAgICBhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtLAorICAgIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSwKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIHJldHVybiBtYWNfdXRpbF9lcG9uX2FjY2Vzc190ZXJtaW5hbF9zZXQoCisgICAgICAgIHBfYWNjX3Rlcm0sCisgICAgICAgIG9wX3R5cGUsCisgICAgICAgIGRldmljZV9pZCwKKyAgICAgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF9DT0VYSVNURU5DRV9URE1BLAorICAgICAgICBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTJQNSk7Cit9CisKK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXRfZm9yX2Vwb25fNF90ZG1hKAorICAgIGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sCisgICAgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgcmV0dXJuIG1hY191dGlsX2Vwb25fYWNjZXNzX3Rlcm1pbmFsX3NldCgKKyAgICAgICAgcF9hY2NfdGVybSwKKyAgICAgICAgb3BfdHlwZSwKKyAgICAgICAgZGV2aWNlX2lkLAorICAgICAgICBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUEsCisgICAgICAgIEJDTU9MVF9OTklfU1BFRURfR0JQU18xMlA1KTsKK30KKworYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfZXBvbl8xNl8xZygKKyAgICBhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtLAorICAgIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSwKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIHJldHVybiBtYWNfdXRpbF9lcG9uX2FjY2Vzc190ZXJtaW5hbF9zZXQoCisgICAgICAgIHBfYWNjX3Rlcm0sCisgICAgICAgIG9wX3R5cGUsCisgICAgICAgIGRldmljZV9pZCwKKyAgICAgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1gsCisgICAgICAgIEJDTU9MVF9OTklfU1BFRURfR0JQU18yUDUpOworfQorCitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzhfMWcoCisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwKKyAgICBiYWxfdXRpbF9vcGVyX2FjY190ZXJtIG9wX3R5cGUsCisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICByZXR1cm4gbWFjX3V0aWxfZXBvbl9hY2Nlc3NfdGVybWluYWxfc2V0KAorICAgICAgICBwX2FjY190ZXJtLAorICAgICAgICBvcF90eXBlLAorICAgICAgICBkZXZpY2VfaWQsCisgICAgICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1gsCisgICAgICAgIEJDTU9MVF9OTklfU1BFRURfR0JQU18yUDUpOworfQorCitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzRfMWcoCisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwKKyAgICBiYWxfdXRpbF9vcGVyX2FjY190ZXJtIG9wX3R5cGUsCisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICByZXR1cm4gbWFjX3V0aWxfZXBvbl9hY2Nlc3NfdGVybWluYWxfc2V0KAorICAgICAgICBwX2FjY190ZXJtLAorICAgICAgICBvcF90eXBlLAorICAgICAgICBkZXZpY2VfaWQsCisgICAgICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1gsCisgICAgICAgIEJDTU9MVF9OTklfU1BFRURfR0JQU18yUDUpOworfQorCitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzhfMTBnKAorICAgIGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sCisgICAgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgcmV0dXJuIG1hY191dGlsX2Vwb25fYWNjZXNzX3Rlcm1pbmFsX3NldCgKKyAgICAgICAgcF9hY2NfdGVybSwKKyAgICAgICAgb3BfdHlwZSwKKyAgICAgICAgZGV2aWNlX2lkLAorICAgICAgICBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YXzEwX0csCisgICAgICAgIEJDTU9MVF9OTklfU1BFRURfR0JQU18xMlA1KTsKK30KKworYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfZXBvbl80XzEwZygKKyAgICBhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtLAorICAgIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSwKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIHJldHVybiBtYWNfdXRpbF9lcG9uX2FjY2Vzc190ZXJtaW5hbF9zZXQoCisgICAgICAgIHBfYWNjX3Rlcm0sCisgICAgICAgIG9wX3R5cGUsCisgICAgICAgIGRldmljZV9pZCwKKyAgICAgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HLAorICAgICAgICBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTJQNSk7Cit9CisKK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXRfZm9yX2Vwb25fMl8xMGcoCisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwKKyAgICBiYWxfdXRpbF9vcGVyX2FjY190ZXJtIG9wX3R5cGUsCisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICByZXR1cm4gbWFjX3V0aWxfZXBvbl9hY2Nlc3NfdGVybWluYWxfc2V0KAorICAgICAgICBwX2FjY190ZXJtLAorICAgICAgICBvcF90eXBlLAorICAgICAgICBkZXZpY2VfaWQsCisgICAgICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18yX1hfMTBfRywKKyAgICAgICAgQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEyUDUpOworfQorCisvKioKKyAqIEBicmllZiBDb21tYW5kIFNldCBzZXR1cCByb3V0aW5lIGZvciBpbnRlcmZhY2UgdXAgdG8gbWFjIGFwcGxpY2F0aW9uIGZvciBFUE9OCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBpZl9mc20gaW4gdGhlIEJBTCBjb3JlIHRvIGluaXRpYWxpemUgdGhlIGNvbW1hbmQKKyAqIHNldCB0byB1cCB0aGUgaW50ZXJmYWNlIG9mIHRoZSBtYWMgYXBwbGljYXRpb24uIFRoZSBjbWRzZXQgYWN0dWFsbHkKKyAqIGNvbnNpc3RzIG9mIHR3byBjb21tYW5kcywgb25lIGlzIHRvIHNlbmQgdGhlIGlmIHVwIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbWFjCisgKiBBcHAgYW5kIGhhbmRsZSB0aGUgcmVsZXZhbnQgcmVzcG9uc2UsIHRoZSBvdGhlciBpcyB0byBoYW5kbGUgdGhlIGluZGljYXRpb24gbWVzc2FnZQorICogZnJvbSB0aGUgbWFjIEFQUCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLgorICoKKyAqIEBwYXJhbSBwX2ludGVyZmFjZV9pbnN0ICBQb2ludGVyIHRvIGludGVyZmFjZSBpbnN0YW5jZQorICogQHBhcmFtIG9wX3R5cGUgICAgICAgICAgIE9wZXJhdGlvbiB0eXBlIG9uIGFjY2VzcyB0ZXJtaW5hbC9pbnRlcmZhY2UgaW5zdGFuY2UKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKgorICovCitiY21vc19lcnJubyBtYWNfdXRpbF9pbnRlcmZhY2Vfc2V0X2Zvcl9lcG9uKGFjY190ZXJtX2ludGVyZmFjZSAqcF9pbnRlcmZhY2VfaW5zdCwgYmFsX3V0aWxfb3Blcl9pZiBvcF90eXBlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21iYWxfaW50ZXJmYWNlX2tleSBpbnRmX2tleSA9IHBfaW50ZXJmYWNlX2luc3QtPmFwaV9yZXFfaW50X29ial9pbmZvLmtleTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IHBoeXNpY2FsX2lmX2lkOworCisgICAgLyogZ2V0IHBoeXNpY2FsIGludGVyZmFjZSBmcm9tIGxvZ2ljYWwgaW50ZXJmYWNlICovCisgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X2xvZ2ljYWwycGh5c2ljYWwoaW50Zl9rZXkuaW50Zl9pZCwgJmRldmljZV9pZCwgJnBoeXNpY2FsX2lmX2lkKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpbnRmX2tleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBwaHlzaWNhbCBpZiBmcm9tIGxvZ2ljYWwgaWYgKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7CisgICAgYmNtb2x0X2Vwb25fbmlfY2ZnIGNmZzsKKyAgICBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZSBvcGVyOworCisgICAga2V5LmVwb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX25pLCBrZXkpOworCisgICAgaWYgKEJBTF9VVElMX09QRVJfSUZfVVAgPT0gb3BfdHlwZSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yLCBCQ01PTFRfUkVHSVNUUkFUSU9OX0JFSEFWSU9SX05PVElGWV9VTktOT1dOKTsKKworICAgICAgICBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpbnRmX2tleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byAlcyAoc2V0KSBwb24gaW50ZXJmYWNlICglZCkgLSAlcywgZXJyX3RleHQ9JXNcbiIsCisgICAgICAgICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX0lGX1VQID09IG9wX3R5cGUpID8gImFjdGl2YXRlIiA6ICJkZWFjdGl2YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgc2V0X2Vwb25fbmlfZW5fc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHNldF9lcG9uX25pX2VuX3N0YXRlLCBuZXdfc3RhdGUsCisgICAgICAgIChCQUxfVVRJTF9PUEVSX0lGX1VQID09IG9wX3R5cGUgPworICAgICAgICBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9FTkFCTEVEIDogQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRElTQUJMRUQpKTsKKworICAgIHJjID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGludGZfa2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gJXMgKHN1Ym1pdCkgcG9uIGludGVyZmFjZSAoJWQpIC0gJXMsIGVycl90ZXh0PSVzXG4iLAorICAgICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX0lGX1VQID09IG9wX3R5cGUpID8gImFjdGl2YXRlIiA6ICJkZWFjdGl2YXRlIiwKKyAgICAgICAgICAgICAgICByYywgYmNtb3Nfc3RyZXJyb3IocmMpLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaW50Zl9rZXkuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgIlN1Ym1pdHRlZCBJTlRFUkZBQ0UtJXMgb3BlcmF0aW9uIGZvciBJRiAlZFxuIiwKKyAgICAgICAgICAgICAgICAoQkFMX1VUSUxfT1BFUl9JRl9VUCA9PSBvcF90eXBlKSA/ICJVUCIgOiAiRE9XTiIsIGludGZfa2V5LmludGZfaWQpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisKKworCisjaWYgQkFMX0VQT05fRVhDTFVERQorLyoqCisgKiBAYnJpZWYgbWFjX3V0aWxfdmFsaWRhdGVfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmZvX2Zvcl9lcG9uCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gdmFsaWRhdGUgYWxsIGlucHV0IGF0dHJpYnV0ZXMgcmVxdWlyZWQgZm9yIGEgc3ViIHRlcm0gc2V0dGluZworICogcmVjZWl2ZWQgZnJvbSBjb3JlIGZvciBFUE9OCisgKgorICogQHBhcmFtIHBfc3ViX3Rlcm1fcmVxICAgICAgIEEgcG9pbnRlciB0byBhIHN1YnNjcmliZXIgdGVybWluYWwgb2JqZWN0CisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBtYWNfdXRpbF92YWxpZGF0ZV9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZm9fZm9yX2Vwb24oY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpwX3N1Yl90ZXJtX3JlcSkKK3sKKyAgICBpZihCQ01CQUxfU1RBVEVfVVAgPT0gcF9zdWJfdGVybV9yZXEtPmRhdGEuYWRtaW5fc3RhdGUpCisgICAgeworICAgICAgICBpZiAoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9zdWJfdGVybV9yZXEsIHN1YnNjcmliZXJfdGVybWluYWwsIG1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgICAgICJtYWNfYWRkcmVzcyBpcyBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZm9yIGFuIGVwb24gc3Vic2NyaWJlciB0ZXJtaW5hbCwgYW5kIGl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTUFOREFUT1JZX1BBUk1fSVNfTUlTU0lORzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qKgorICogQGJyaWVmIENvbW1hbmQgU2V0IHNldHVwIHJvdXRpbmUgZm9yIHN1YnNjcmliZXIgdGVybWluYWwgY29ubmVjdCB0byBtYWMgYXBwbGljYXRpb24gZm9yIEVQT04KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHN1Yl90ZXJtX2ZzbSBpbiB0aGUgQkFMIGNvcmUgdG8gaW5pdGlhbGl6ZSB0aGUgY29tbWFuZAorICogc2V0IHRvIGNvbm5lY3QgdGhlIHN1YnNjcmliZXIgdGVybWluYWwgb2YgdGhlIG1hYyBhcHBsaWNhdGlvbi4gVGhlIGNtZHNldCBhY3R1YWxseQorICogY29uc2lzdHMgb2YgdHdvIGNvbW1hbmRzLCBvbmUgaXMgdG8gc2VuZCB0aGUgc3ViX3Rlcm0gcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBtYWMKKyAqIEFwcCBhbmQgaGFuZGxlIHRoZSByZWxldmFudCByZXNwb25zZSwgdGhlIG90aGVyIGlzIHRvIGhhbmRsZSB0aGUgaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBmcm9tIHRoZSBtYWMgQVBQIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuCisgKgorICogQHBhcmFtIHBfc3ViX3Rlcm1faW5zdCAgIEEgcG9pbnRlciB0byBhIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBvcF90eXBlICAgICAgICAgIFR5cGUgb2Ygb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCBvbiB0aGUgc3Vic2NyaWJlciB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIGlzX3Bvc3RfZGlzY292ZXJ5IFRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgZm9yIGVwb24KKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX3N1YnNjcmliZXJfdGVybWluYWxfc2V0X2Zvcl9lcG9uKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgYmFsX3V0aWxfb3Blcl9zdWJfdGVybSBvcF90eXBlLCBiY21vc19ib29sIGlzX3Bvc3RfZGlzY292ZXJ5KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZyAqcF9zdWJfdGVybV9yZXEgPSAmcF9zdWJfdGVybV9pbnN0LT5hcGlfcmVxX3N1Yl90ZXJtX2luZm87CisKKworICAgIEJDTV9MT0coREVCVUcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQpLAorICAgICAgICAgICAgIklOIDogJXMgcG9uX2lkID0gJWQgb251X2lkPSAlZCAiCisgICAgICAgICAgICAib21jaV9nZW1fcG9ydCA9ICVkXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgcF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkLAorICAgICAgICAgICAgcF9zdWJfdGVybV9yZXEtPmtleS5zdWJfdGVybV9pZCwgcF9zdWJfdGVybV9yZXEtPmRhdGEuc3ZjX3BvcnRfaWQpOworCisgICAgaWYgKChCQUxfVVRJTF9PUEVSX1NVQl9URVJNX0FERCAhPSBvcF90eXBlKQorICAgICAgICAmJiAoQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9SRU1PVkUgIT0gb3BfdHlwZSkKKyAgICAgICAgJiYgKEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQ0xFQVIgIT0gb3BfdHlwZSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uICVkIGZvciBzdWJfdGVybSAldVxuIiwKKyAgICAgICAgICAgICAgICBvcF90eXBlLCBwX3N1Yl90ZXJtX3JlcS0+a2V5LnN1Yl90ZXJtX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBkbworICAgIHsKKyAgICAgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKKyAgICAgICAgdWludDMyX3QgcGh5c2ljYWxfaWZfaWQ7CisKKyAgICAgICAgLyogZ2V0IHBoeXNpY2FsIGludGVyZmFjZSBmcm9tIGxvZ2ljYWwgaW50ZXJmYWNlICovCisgICAgICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9sb2dpY2FsMnBoeXNpY2FsIChwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQsICZkZXZpY2VfaWQsICZwaHlzaWNhbF9pZl9pZCk7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgcGh5c2ljYWwgaWYgZnJvbSBsb2dpY2FsIGlmICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGVwb25fb251X2xpc3RfZW50cnkgKiBwX25ld19lcG9uX29udV9lbnRyeTsKKyAgICAgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsKKyAgICAgICAgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmsgb3BlcjsKKworICAgICAgICBrZXkuZXBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOworICAgICAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBhZGRfbGluaywga2V5KTsKKworICAgICAgICBpZihCQUxfVVRJTF9PUEVSX1NVQl9URVJNX0FERCA9PSBvcF90eXBlKQorICAgICAgICB7CisKKyAgICAgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfbGluaywgbWFjX2FkZHJlc3MsIHBfc3ViX3Rlcm1fcmVxLT5kYXRhLm1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfbGluaywgcmF0ZSwgQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU4pOworICAgICAgICAgICAgcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworCisgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVnaXN0ZXIgZXBvbiBvbnUgZXBvbl9uaSA9ICVkIG1hYyA6ICJfbWFjX2FkZHJfZm10X3N0ciIgcmMgPSAlZCAoJXMpLCBlcnJfdGV4dD0lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleS5lcG9uX25pLCBfbWFjX2FkZHJfZGF0YShwX3N1Yl90ZXJtX3JlcS0+ZGF0YS5tYWNfYWRkcmVzcyksIHJjLCBiY21vc19zdHJlcnJvcihyYyksCisgICAgICAgICAgICAgICAgICAgICAgICBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogYWRkIHRoZSBuZXcgZXBvbiBvbnUgdG8gdGhlIGVwb24gb251IGxpc3QgdG8gZm9sbG93IGluZGljYXRpb25zIGFuZCBvYW0gc2VuZGluZyAqLworICAgICAgICAgICAgcF9uZXdfZXBvbl9vbnVfZW50cnkgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGVwb25fb251X2xpc3RfZW50cnkpKTsKKyAgICAgICAgICAgIGlmIChOVUxMID09IHBfbmV3X2Vwb25fb251X2VudHJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgZXBvbiBvbnUgZW50cnlcbiIpOworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KCZwX25ld19lcG9uX29udV9lbnRyeS0+YmFsX29udV9rZXksICZwX3N1Yl90ZXJtX3JlcS0+a2V5LAorICAgICAgICAgICAgICAgICAgIHNpemVvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkpKTsKKyAgICAgICAgICAgIHBfbmV3X2Vwb25fb251X2VudHJ5LT5tYWNfYWRkcmVzcyA9IHBfc3ViX3Rlcm1fcmVxLT5kYXRhLm1hY19hZGRyZXNzOworICAgICAgICAgICAgcF9uZXdfZXBvbl9vbnVfZW50cnktPm9hbV9wcm92aXNpb25fc3RhdGUgPSBPQU1fUFJPVklTSU9OX1NUQVRFX0lETEU7CisgICAgICAgICAgICBwX25ld19lcG9uX29udV9lbnRyeS0+d2FpdGluZ19mbG93c19udW0gPSAwOworCisgICAgICAgICAgICBlcG9uX29udV9saXN0X2FkZChwX25ld19lcG9uX29udV9lbnRyeSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfc3ViX3Rlcm1fZXZlbnQocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3ViX3Rlcm1fcmVxLT5rZXkuc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJjbW9sdF9zZXJpYWxfbnVtYmVyICopTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfVVRJTF9PUEVSX1NVQl9URVJNX1JFTU9WRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fRVJSX09LLCBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDX1VUSUxfREVBQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX05PTkUsIEJDTUJBTF9JTlZBTElEX1RVTk5FTF9JRCk7CisKKyAgICAgICAgICAgZXBvbl9vbnVfbGlzdF9yZW1vdmVfYnlfa2V5KCZwX3N1Yl90ZXJtX3JlcS0+a2V5KTsKKworICAgICAgICB9CisgICAgfSB3aGlsZSAoMCk7CisKKyAgICBCQ01fTE9HKERFQlVHLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICJPVVQgOiBnb2luZyBvdXQgb2YgJXMgcmMgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisKKworICAgIHJldHVybiByYzsKK30KKworCisKKworCitzdGF0aWMgYmNtb3NfZXJybm8gbWFwbGVfdXNfc2xhX2NvbmZpZ3VyZV9lcG9uKGJjbWJhbF9mbG93X2NmZyAqZmxvd19lbnRyeSwgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBlcG9uX2xpbmtfa2V5OworICAgIGJjbW9sdF9lcG9uX2xpbmtfY2ZnIGVwb25fbGlua19jZmc7CisgICAgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gdXNfYndfZGlzdCA9IHt9OworCisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9pZl9pZDsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBnZXQgcGh5c2ljYWwgaW50ZXJmYWNlIGZyb20gbG9naWNhbCBpbnRlcmZhY2UgKi8KKyAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfbG9naWNhbDJwaHlzaWNhbCAoZmxvd19lbnRyeS0+ZGF0YS5hY2Nlc3NfaW50X2lkLCAmZGV2aWNlX2lkLCAmcGh5c2ljYWxfaWZfaWQpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGZsb3dfZW50cnktPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHBoeXNpY2FsIGlmIGZyb20gbG9naWNhbCBpZiAoJXMpXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIGVwb25fbGlua19rZXkuZXBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOworICAgICAgICBlcG9uX2xpbmtfa2V5Lm1hY19hZGRyZXNzID0gKm1hYzsKKyAgICAgICAgQkNNT0xUX0NGR19JTklUKCZlcG9uX2xpbmtfY2ZnLCBlcG9uX2xpbmssIGVwb25fbGlua19rZXkpOworCisgICAgICAgIHVzX2J3X2Rpc3QucG9sbGluZ19pbnRlcnZhbF91cyA9IEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX0FVVE9NQVRJQzsKKyAgICAgICAgaWYgKEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJmZsb3dfZW50cnktPmRhdGEuc2xhLCBzbGEsIG1pbl9yYXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNfYndfZGlzdC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gZmxvd19lbnRyeS0+ZGF0YS5zbGEubWluX3JhdGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJmZsb3dfZW50cnktPmRhdGEuc2xhLCBzbGEsIG1heF9yYXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgdXNfYndfZGlzdC5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gZmxvd19lbnRyeS0+ZGF0YS5zbGEubWF4X3JhdGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB1c19id19kaXN0Lm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAxMDAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICB1c19id19kaXN0Lm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSA3OworCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmVwb25fbGlua19jZmcsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoLCB1c19id19kaXN0KTsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmVwb25fbGlua19jZmcuaGRyKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworCisKKworCisvKioKKyAqIEBicmllZiBmbG93IHNldCBmb3IgRVBPTgorICoKKyAqIEBwYXJhbSBwX2Zsb3dfcmVxICAgIHBvaW50ZXIgdG8gZmxvdyByZXF1ZXN0IHN0cnVjdHVyZSBmcm9tIGNvcmUKKyAqIEBwYXJhbSBvcF90eXBlICAgICAgQURELCBSRU1PVkUgb3IgQ0xFQVIKKyAqIEBwYXJhbSBwX2Zsb3dfY29yZSBsb2NhbCBEQiBmbG93IGNvbnRleHQgcGFzc2VkIGFzIGEgY29va2llCisgKgorICogQHJldHVybiBlcnJubyAgICBlcnJvcgorICovCitiY21vc19lcnJubyBtYWNfdXRpbF9mbG93X3NldF9mb3JfZXBvbiAoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxLCBiYWxfdXRpbF9vcGVyX2Zsb3cgb3BfdHlwZSwgZmxvd19pbnN0ICpwX2Zsb3dfY29yZSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBlcG9uX29udV9saXN0X2VudHJ5ICpwX29udV9lbnRyeTsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWM7CisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5IGtleTsKKworCisgICAga2V5LmludGZfaWQgPSBwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQ7CisgICAga2V5LnN1Yl90ZXJtX2lkID0gcF9mbG93X3JlcS0+ZGF0YS5zdWJfdGVybV9pZDsKKworICAgIGlmKE5VTEwgIT0gKHBfb251X2VudHJ5ID0gZXBvbl9vbnVfbGlzdF9maW5kX2J5X2tleSgma2V5KSkpCisgICAgeworICAgICAgICAgICAgbWFjID0gcF9vbnVfZW50cnktPm1hY19hZGRyZXNzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoa2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY29uZmlndXJlIGZsb3csICIKKyAgICAgICAgICAgICAgICAic3Vic2NyaWJlciB0ZXJtaW5hbCBpZj0lZCBzdWItdGVybSBpZCA9ICVkIHdhcyBub3QgZm91bmQgLSBubyBzdWNoIGRldmljZVxuIiwKKyAgICAgICAgICAgICAgICBwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQsIHBfZmxvd19yZXEtPmRhdGEuc3ViX3Rlcm1faWQpOworCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKworCisKKyAgICBpZiAoQkFMX1VUSUxfT1BFUl9GTE9XX0FERCA9PSBvcF90eXBlKQorICAgIHsKKworICAgICAgICBCQ01fTE9HKERFQlVHLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoa2V5LmludGZfaWQpLCAiYWRkLCBjb250ZXh0IGlzICVwXG4iLCBwX2Zsb3dfY29udGV4dCk7CisKKyAgICAgICAgc3dpdGNoIChwX29udV9lbnRyeS0+b2FtX3Byb3Zpc2lvbl9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBPQU1fUFJPVklTSU9OX1NUQVRFX0lETEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9vbnVfZW50cnktPmZsb3dfa2V5c1twX29udV9lbnRyeS0+d2FpdGluZ19mbG93c19udW0rK10gPSBwX2Zsb3dfcmVxLT5rZXk7CisKKyAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoa2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgImFkZCBwX29udV9lbnRyeS0+ICVwLCB3YWl0aW5nIGZsb3dzOiAlZCBjb250ZXh0IGlzICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcF9vbnVfZW50cnksIHBfb251X2VudHJ5LT53YWl0aW5nX2Zsb3dzX251bSwgcF9mbG93X2NvbnRleHQpOworCisgICAgICAgICAgICAgICAgcmMgPSBtYXBsZV91c19zbGFfY29uZmlndXJlX2Vwb24ocF9mbG93X3JlcSwgJm1hYyk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoa2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY29uZmlndXJlIEVQT04gVVMgU0xBICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcF9vbnVfZW50cnktPm9hbV9wcm92aXNpb25fc3RhdGUgPSBPQU1fUFJPVklTSU9OX1NUQVRFX1NUQVJURUQ7CisKKyAgICAgICAgICAgICAgICBiYWxfb2FtX2NvbmZpZ3VyZV90cmFmZmljKG1hcGxlX2RldmljZV9mcm9tX2ludGVyZmFjZV9nZXQocF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PU19UUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjX3V0aWxfY29uZmlndXJlX3RyYWZmaWNfY2IsIHBfZmxvd19jb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgIGNhc2UgT0FNX1BST1ZJU0lPTl9TVEFURV9TVEFSVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwX29udV9lbnRyeS0+d2FpdGluZ19mbG93c19udW0gPCBNQUNfVVRJTF9NQVhfV0FJVElOR19GTE9XU19QRVJfTUFDKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9vbnVfZW50cnktPmZsb3dfa2V5c1twX29udV9lbnRyeS0+d2FpdGluZ19mbG93c19udW0rK10gPSBwX2Zsb3dfcmVxLT5rZXk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNvbmZpZ3VyZSBmbG93IGZvciB0aGF0IG1hYywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBmbG93cyBhbHJlYWR5IHdhaXRpbmcgZm9yIG9hbSBjb25maWd1cmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOU1VGRklDSUVOVF9MSVNUX01FTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICBjYXNlIE9BTV9QUk9WSVNJT05fU1RBVEVfQ09NUExFVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hY191dGlsX3JlcG9ydF9mbG93X2FkZF9zdWNjZXNzKHBfZmxvd19yZXEtPmtleSwgcF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgIGNhc2UgT0FNX1BST1ZJU0lPTl9TVEFURV9GQUlMOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoa2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjb25maWd1cmUgb2FtIHRyYWZmaWMgZm9yIHRoYXQgbWFjLFxuIik7IC8qIGN1cnJlbnRseSBubyBmYWlsdXJlIGluZGljYXRpb25zICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIFJFTU9WRSBvciBDTEVBUiBGTE9XICovCisgICAgeworCisgICAgICAgIEJDTV9MT0coREVCVUcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihrZXkuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgImRlbGV0ZSBwX29udV9lbnRyeS0+ICVwLCB3YWl0aW5nIGZsb3dzOiAlZCwgcHJvdmlzaW9uZWQgc3RhdGUgaXMgJWQsIGNvbnRleHQgaXMgJXBcbiIsCisgICAgICAgICAgICAgICAgcF9vbnVfZW50cnksCisgICAgICAgICAgICAgICAgcF9vbnVfZW50cnktPndhaXRpbmdfZmxvd3NfbnVtLAorICAgICAgICAgICAgICAgIHBfb251X2VudHJ5LT5vYW1fcHJvdmlzaW9uX3N0YXRlLAorICAgICAgICAgICAgICAgIHBfZmxvd19jb250ZXh0KTsKKworICAgICAgICBzd2l0Y2ggKHBfb251X2VudHJ5LT5vYW1fcHJvdmlzaW9uX3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIE9BTV9QUk9WSVNJT05fU1RBVEVfSURMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfZmxvd19yZW1vdmVfc3VjY2VzcyhwX2Zsb3dfcmVxLT5rZXksIHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCwgb3BfdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPQU1fUFJPVklTSU9OX1NUQVRFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoa2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxpbmcgYmFsX29hbV9jb25maWd1cmVfdHJhZmZpYyB3LyBcIkRpc2FibGVcIiBzdGF0ZVxuIik7CisKKyAgICAgICAgICAgICAgICBiYWxfb2FtX2NvbmZpZ3VyZV90cmFmZmljKG1hcGxlX2RldmljZV9mcm9tX2ludGVyZmFjZV9nZXQocF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PU19GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY191dGlsX3VuY29uZmlndXJlX3RyYWZmaWNfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPQU1fUFJPVklTSU9OX1NUQVRFX0ZBSUw6CisgICAgICAgICAgICBjYXNlIE9BTV9QUk9WSVNJT05fU1RBVEVfU1RBUlRFRDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gdW5jb25maWd1cmUgb2FtIHRyYWZmaWMgZm9yIHRoYXQgbWFjLFxuIik7IC8qIGN1cnJlbnRseSBubyBmYWlsdXJlIGluZGljYXRpb25zICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbWFjX3V0aWxfY29uZmlndXJlX3RyYWZmaWNfY2Iodm9pZCAqY29udGV4dCwKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgIGJjbW9sdF9lcG9uX25pIGVwb25fbmksCisgICAgY29uc3QgYmNtb3NfbWFjX2FkZHJlc3MgKm1hY19hZGRyZXNzLAorICAgIGJjbW9zX2Vycm5vIHJlc3VsdCkKK3sKKyAgICBlcG9uX29udV9saXN0X2VudHJ5ICpwX29udV9lbnRyeTsKKyAgICBpbnQgaTsKKworICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGVwb25fbmkpLAorICAgICAgICAiY29uZmlndXJlIGRldmljZV9pZD0ldSwgZXBvbl9uaT0ldSwgbWFjX2FkZHJlc3M9IiBfbWFjX2FkZHJfZm10X3N0ciAiIHJlc3VsdD0nJXMnXG4iLAorICAgICAgICBkZXZpY2VfaWQsIGVwb25fbmksIF9tYWNfYWRkcl9kYXRhKCptYWNfYWRkcmVzcyksIHJlc3VsdCA9PSBCQ01fRVJSX09LID8gInN1Y2Nlc3MiIDogImZhaWwiKTsKKworCisgICAgaWYoTlVMTCA9PSAocF9vbnVfZW50cnkgPSBlcG9uX29udV9saXN0X2ZpbmRfYnlfbWFjKG1hY19hZGRyZXNzKSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCAgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGVwb25fbmkpLAorICAgICAgICAgICAgICAgICJGQUlMIC0gcmVjZWl2ZWQgY29uZmlndXJlIHRyYWZmaWMgY2IgZm9yIG1hYyB0aGF0IHdhcyBub3QgY29uZmlndXJlZCAiIF9tYWNfYWRkcl9mbXRfc3RyICJcbiIsCisgICAgICAgICAgICAgICAgX21hY19hZGRyX2RhdGEoKm1hY19hZGRyZXNzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoT0FNX1BST1ZJU0lPTl9TVEFURV9TVEFSVEVEICE9IHBfb251X2VudHJ5LT5vYW1fcHJvdmlzaW9uX3N0YXRlKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihlcG9uX25pKSwKKyAgICAgICAgICAgICAgICAiRkFJTCAtIHJlY2VpdmVkIGNvbmZpZ3VyZSB0cmFmZmljIGNiIGZvciBtYWMgdGhhdCBpcyBpbiB0aGUgd3Jvbmcgc3RhdGUgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBwX29udV9lbnRyeS0+b2FtX3Byb3Zpc2lvbl9zdGF0ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBwX29udV9lbnRyeS0+b2FtX3Byb3Zpc2lvbl9zdGF0ZSA9IE9BTV9QUk9WSVNJT05fU1RBVEVfQ09NUExFVEVEOworCisgICAgICAgIEJDTV9MT0coSU5GTywgIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihlcG9uX25pKSwgIk1vdmVkIE9OVSB0byBPQU0gQ09NUExFVEVEIHN0YXRlXG4iKTsKKworICAgICAgICBmb3IgKGk9MDsgaTxwX29udV9lbnRyeS0+d2FpdGluZ19mbG93c19udW07IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfYWRkX3N1Y2Nlc3MocF9vbnVfZW50cnktPmZsb3dfa2V5c1tpXSwgZXBvbl9uaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcF9vbnVfZW50cnktPm9hbV9wcm92aXNpb25fc3RhdGUgPSBPQU1fUFJPVklTSU9OX1NUQVRFX0ZBSUw7CisgICAgfQorCisgICAgcF9vbnVfZW50cnktPndhaXRpbmdfZmxvd3NfbnVtID0gMDsgLyogY3VycmVudGx5IHdlIGRvbnQgc2VuZCBmYWlsIGluZGljYXRpb24gKi8KK30KKworLyoqIEVQT04gc3BlY2lmaWMgdHJhZmZpYyB1bmNvbmZpZ3VyZTsgTm90IHVzZWQgZm9yIEdQT04gbW9kZSAqLworc3RhdGljIHZvaWQgbWFjX3V0aWxfdW5jb25maWd1cmVfdHJhZmZpY19jYih2b2lkICpjb250ZXh0LAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwKKyAgICBjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqbWFjX2FkZHJlc3MsCisgICAgYmNtb3NfZXJybm8gcmVzdWx0KQoreworICAgIGZsb3dfaW5zdCAqcF9mbG93X2NvcmUgPSAoZmxvd19pbnN0ICopKGNvbnRleHQpOworICAgIGVwb25fb251X2xpc3RfZW50cnkgKnBfb251X2VudHJ5OworCisgICAgQkNNX0xPRyhJTkZPLCAgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGVwb25fbmkpLAorICAgICAgICAgICAgInVuY29uZmlndXJlIGRldmljZV9pZD0ldSwgZXBvbl9uaT0ldSwgbWFjX2FkZHJlc3M9IiBfbWFjX2FkZHJfZm10X3N0ciAiIHJlc3VsdD0nJXMnXG4iLAorICAgICAgICAgICAgZGV2aWNlX2lkLAorICAgICAgICAgICAgZXBvbl9uaSwKKyAgICAgICAgICAgIF9tYWNfYWRkcl9kYXRhKCptYWNfYWRkcmVzcyksCisgICAgICAgICAgICByZXN1bHQgPT0gQkNNX0VSUl9PSyA/ICJzdWNjZXNzIiA6ICJmYWlsIik7CisKKworICAgIC8qKiBAdG9kbyBuZWVkIHRvIHBhc3Mgb24gdGhlIGFjdHVhbCBvcCB0eXBlIChSRU1PVkUgb3IgQ0xFQVIpICovCisgICAgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfcmVtb3ZlX3N1Y2Nlc3MocF9mbG93X2NvcmUtPmN1cnJlbnRfZmxvd19pbmZvLmtleSwgZXBvbl9uaSwgQkFMX1VUSUxfT1BFUl9GTE9XX1JFTU9WRSk7CisKKyAgICBpZihOVUxMICE9IChwX29udV9lbnRyeSA9IGVwb25fb251X2xpc3RfZmluZF9ieV9tYWMobWFjX2FkZHJlc3MpKSkKKyAgICB7CisgICAgICAgIHBfb251X2VudHJ5LT5vYW1fcHJvdmlzaW9uX3N0YXRlID0gT0FNX1BST1ZJU0lPTl9TVEFURV9JRExFOworICAgIH0KK30KKworCisKKy8qKgorICogQGJyaWVmIHVzZWQgZm9yIGVwb24gb2FtIG1lc3NhZ2UgaGFuZGxpbmcKKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkICAgYmNtIGRldiBpZAorICogQHBhcmFtIHBfbXNnIG9hbSBtc2cgcG9pbnRlcgorICovCit2b2lkIGJhbF9wcm94eV9yeF9jYl9mb3JfZXBvbiAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpCit7CisgICAgYmNtb2x0X3Byb3h5X3J4ICpwcm94eV9yeCA9IChiY21vbHRfcHJveHlfcnggKilwX21zZzsKKworICAgIGJjbW9sdF91c2VyX2FwcGxfZW9uX3Byb2Nlc3NfcngoZGV2aWNlX2lkLCBwcm94eV9yeCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcngoZGV2aWNlX2lkLCBwcm94eV9yeCwgYmFsX29hbV9wcm94eV9yeF9jYik7CisKKyAgICAvKiogQG5vdGUgdGhlIGZyZWUgb2YgcF9tc2cgaXMgZG9uZSBpbiBjYWxsZXIgZnVuY3Rpb24gKi8KK30KKworCisvKioKKyAqIEBicmllZiBpbml0IGZvciBlcG9uIG9hbSBhbmQgZW9uCisgKgorICovCitzdGF0aWMgdm9pZCBtYWNfdXRpbF9pbml0X29hbV9mb3JfZXBvbiAodm9pZCkKK3sKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2luaXQoKTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vvbl9pbml0KCk7Cit9CisKKworCisKK3N0YXRpYyB2b2lkIGVwb25fb251X2xpc3RfYWRkKGVwb25fb251X2xpc3RfZW50cnkgKmVwb25fb251X2VudHJ5KQoreworICAgIFRBSUxRX0lOU0VSVF9IRUFEKCZlcG9uX29udV9saXN0LCBlcG9uX29udV9lbnRyeSwgbmV4dCk7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBlcG9uX29udV9saXN0X3JlbW92ZV9ieV9rZXkoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5ICprZXkpCit7CisgICAgZXBvbl9vbnVfbGlzdF9lbnRyeSAqcF9vbnVfZW50cnkgPSBOVUxMOworCisgICAgaWYoTlVMTCAhPSAocF9vbnVfZW50cnkgPSBlcG9uX29udV9saXN0X2ZpbmRfYnlfa2V5KGtleSkpKQorICAgIHsKKyAgICAgICAgVEFJTFFfUkVNT1ZFKCZlcG9uX29udV9saXN0LCBwX29udV9lbnRyeSwgbmV4dCk7CisgICAgICAgIGJjbW9zX2ZyZWUocF9vbnVfZW50cnkpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIGVwb25fb251X2xpc3RfZW50cnkgKmVwb25fb251X2xpc3RfZmluZF9ieV9tYWMoY29uc3QgYmNtb3NfbWFjX2FkZHJlc3MgKm1hY19hZGRyZXNzKQoreworICAgIGVwb25fb251X2xpc3RfZW50cnkgKnBfb251X2VudHJ5ID0gTlVMTDsKKyAgICBlcG9uX29udV9saXN0X2VudHJ5ICpjdXJyZW50X29udV9lbnRyeTsKKworICAgIFRBSUxRX0ZPUkVBQ0goY3VycmVudF9vbnVfZW50cnksICZlcG9uX29udV9saXN0LCBuZXh0KQorICAgIHsKKyAgICAgICAgaWYgKG1lbWNtcCgmY3VycmVudF9vbnVfZW50cnktPm1hY19hZGRyZXNzLCBtYWNfYWRkcmVzcywgc2l6ZW9mKGJjbW9zX21hY19hZGRyZXNzKSk9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfb251X2VudHJ5ID0gY3VycmVudF9vbnVfZW50cnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwX29udV9lbnRyeTsKK30KKworc3RhdGljIGVwb25fb251X2xpc3RfZW50cnkgKmVwb25fb251X2xpc3RfZmluZF9ieV9rZXkoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5ICprZXkpCit7CisgICAgZXBvbl9vbnVfbGlzdF9lbnRyeSAqcF9vbnVfZW50cnkgPSBOVUxMOworICAgIGVwb25fb251X2xpc3RfZW50cnkgKmN1cnJlbnRfb251X2VudHJ5OworCisgICAgVEFJTFFfRk9SRUFDSChjdXJyZW50X29udV9lbnRyeSwgJmVwb25fb251X2xpc3QsIG5leHQpCisgICAgeworICAgICAgICBpZiAoKGN1cnJlbnRfb251X2VudHJ5LT5iYWxfb251X2tleS5pbnRmX2lkID09IGtleS0+aW50Zl9pZCkgJiYKKyAgICAgICAgICAgIChjdXJyZW50X29udV9lbnRyeS0+YmFsX29udV9rZXkuc3ViX3Rlcm1faWQgPT0ga2V5LT5zdWJfdGVybV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfb251X2VudHJ5ID0gY3VycmVudF9vbnVfZW50cnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwX29udV9lbnRyeTsKK30KKyNlbmRpZiAvKiBCQUxfRVBPTl9FWENMVURFICovCisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvYmFsX21hY191dGlsX2Vwb24uaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbF9lcG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkYTBkZgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbF9lcG9uLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKg0KKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQNCisgKg0KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20NCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZA0KKyAqDQorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UNCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZA0KKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDINCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsDQorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6DQorICoNCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQ0KKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQNCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cg0KKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50DQorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLg0KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzDQorICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zDQorICogICAgIG9mIHRoZSBzb2Z0d2FyZS4NCisgKg0KKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUNCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkDQorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yDQorICogIHdyaXR0ZW4gY29uc2VudC4NCisgKg0KKyAqICA6Pg0KKyAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKy8qKg0KKyAqIEBmaWxlIGJhbF9tYWNfdXRpbF9lcG9uLmgNCisgKg0KKyAqIEBicmllZiBtYWMgdXRpbCBpbnRlcmZhY2VzIGRlZmluaXRpb24gdXNlZCBieSBCYWwgQ29yZSwgZm9yIEVQT04NCisgKg0KKyAqIFRoaXMgZmlsZSBleHBvc2UgdGhlIEFQSXMgdG8gdGhlIGNvcmUgdG8gY29uZmlndXJlIHRoZSBtYWMNCisgKiB3aXRoIHJlZ2FyZGluZyB0byB0aGUgb3BlcmF0aW9uIG9mIGFjY2VzcyB0ZXJtaW5hbCwgaW50ZXJmYWNlLCBzdWJzY3JpYmVyIHRlcm1pbmFsIGFuZCBmbG93Lg0KKyAqDQorICogQGFkZHRvZ3JvdXAgbWFjX3V0aWwNCisgKi8NCisNCisvKkB7Ki8NCisNCisjaW5jbHVkZSA8YmFsX21hY191dGlsLmg+DQorDQorLyogVGVtcG9yYXJpbHkgZXhjbHVkZSBzb21lIGNvZGUgdG8gZ2V0IHRoaXMgbW9kdWxlIGNvbXBpbGluZyBhZ2FpbiAtIHdlIHNob3VsZCBnZXQgcmlkIG9mIHRoaXMgQVNBUCAqLw0KKyNkZWZpbmUgQkFMX0VQT05fRVhDTFVERSAwDQorDQorI2lmIEJBTF9FUE9OX0VYQ0xVREUNCitiY21vc19lcnJubyBtYWNfdXRpbF9oYW5kbGVfYWxsX29sdF9pbmRfZm9yX2Vwb24gKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9tc2cgKnBfbXNnKTsNCisNCitiY21vc19lcnJubyBtYWNfdXRpbF9yZWdpc3Rlcl9mb3JfZXBvbl9hdXRvX2luZGljYXRpb25zKHN0cnVjdCBiY21vbHRfcnhfY2ZnICpwX3J4X2NmZywgYmNtb2x0X2RldmlkIGRldmljZV9pZCk7DQorI2VuZGlmIC8qIEJBTF9FUE9OX0VYQ0xVREUgKi8NCisNCitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzhfdGRtYSgNCisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwNCisgICAgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLA0KKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsNCisNCitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzRfdGRtYSgNCisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwNCisgICAgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLA0KKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsNCisNCitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzE2XzFnKA0KKyAgICBhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtLA0KKyAgICBiYWxfdXRpbF9vcGVyX2FjY190ZXJtIG9wX3R5cGUsDQorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpOw0KKw0KK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXRfZm9yX2Vwb25fOF8xZygNCisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwNCisgICAgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLA0KKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsNCisNCitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzRfMWcoDQorICAgIGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sDQorICAgIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSwNCisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZCk7DQorDQorYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfZXBvbl84XzEwZygNCisgICAgYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwNCisgICAgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLA0KKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsNCisNCitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0X2Zvcl9lcG9uXzRfMTBnKA0KKyAgICBhY2NfdGVybV9pbnN0ICpwX2FjY190ZXJtLA0KKyAgICBiYWxfdXRpbF9vcGVyX2FjY190ZXJtIG9wX3R5cGUsDQorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpOw0KKw0KK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXRfZm9yX2Vwb25fMl8xMGcoDQorICAgIGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sDQorICAgIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSwNCisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZCk7DQorDQorYmNtb3NfZXJybm8gbWFjX3V0aWxfaW50ZXJmYWNlX3NldF9mb3JfZXBvbihhY2NfdGVybV9pbnRlcmZhY2UgKnBfaW50ZXJmYWNlX2luc3QsIGJhbF91dGlsX29wZXJfaWYgb3BfdHlwZSk7DQorDQorI2lmIEJBTF9FUE9OX0VYQ0xVREUNCitiY21vc19lcnJubyBtYWNfdXRpbF92YWxpZGF0ZV9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZm9fZm9yX2Vwb24oY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpwX3N1Yl90ZXJtX3JlcSk7DQorDQorYmNtb3NfZXJybm8gbWFjX3V0aWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zZXRfZm9yX2Vwb24oc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LCBiYWxfdXRpbF9vcGVyX3N1Yl90ZXJtIG9wX3R5cGUsIGJjbW9zX2Jvb2wgaXNfcG9zdF9kaXNjb3ZlcnkpOw0KKw0KK2JjbW9zX2Vycm5vIG1hY191dGlsX2Zsb3dfc2V0X2Zvcl9lcG9uIChiY21iYWxfZmxvd19jZmcgKnBfZmxvd19yZXEsIGJhbF91dGlsX29wZXJfZmxvdyBvcF90eXBlLCBmbG93X2luc3QgKnBfZmxvd19jb3JlKTsNCisNCit2b2lkIGJhbF9wcm94eV9yeF9jYl9mb3JfZXBvbiAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpOw0KKyNlbmRpZiAvKiBCQUxfRVBPTl9FWENMVURFICovDQorDQorLypAfSovDQorDQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvYmFsX21hY191dGlsX2dwb24uYyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbF9ncG9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4ZWZkNgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbF9ncG9uLmMKQEAgLTAsMCArMSwxOTYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfbWFjX3V0aWxfZ3Bvbi5jCisgKgorICogQGJyaWVmIG1hYyB1dGlsIGludGVyZmFjZXMgZGVmaW5pdGlvbiB1c2VkIGJ5IEJhbCBDb3JlLCBmb3IgR1BPTgorICoKKyAqIFRoaXMgZmlsZSBleHBvc2UgdGhlIEFQSXMgdG8gdGhlIGNvcmUgdG8gY29uZmlndXJlIHRoZSBtYWMgCisgKiB3aXRoIHJlZ2FyZGluZyB0byB0aGUgb3BlcmF0aW9uIG9mIGFjY2VzcyB0ZXJtaW5hbCwgaW50ZXJmYWNlLCBzdWJzY3JpYmVyIHRlcm1pbmFsIGFuZCBmbG93LgorICoKKyAqIEBhZGR0b2dyb3VwIG1hY191dGlsCisgKi8KKworLypAeyovCisKKyNpbmNsdWRlIDxiYWxfbWFjX3V0aWwuaD4KKyNpbmNsdWRlIDxiYWxfbWFjX3V0aWxfY29tbW9uX2l0dV9wb24uaD4KKworc3RhdGljIGJjbW9zX2Vycm5vIG1hY191dGlsX2luZGljYXRpb25faGFuZGxlX2Zvcl9ncG9uX25pIChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZyk7CitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVfZm9yX2dwb25fb251IChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZyk7CitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVfZm9yX2dwb25fYWxsb2NfaWQgKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9tc2cgKnBfbXNnKTsKK3N0YXRpYyBiY21vc19lcnJubyBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZV9mb3JfZ3Bvbl9nZW1fcG9ydCAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpOworCisvKiogQGJyaWVmIGFycmF5IHN0b3JlcyB0aGUgbGlzdCBvZiBHUE9OIHJlbGF0ZWQgYXV0byBpbmRpY2F0aW9ucyBmcm9tIE1hcGxlIHRvIHN1YnNjcmliZSAqLworc3RhdGljIG1hY191dGlsX2luZF9vYmpfYW5kX2hhbmRsZXJzIG1hY191dGlsX2dwb25faW5kX2hhbmRsZXJzW10gPQoreworICAgIHtCQ01PTFRfT0JKX0lEX0dQT05fTkksICAgICAgICAgIkJDTU9MVF9PQkpfSURfR1BPTl9OSSIsICAgICAgIG1hY191dGlsX2luZGljYXRpb25faGFuZGxlX2Zvcl9ncG9uX25pfSwKKyAgICB7QkNNT0xUX09CSl9JRF9HUE9OX09OVSwgICAgICAgICJCQ01PTFRfT0JKX0lEX0dQT05fT05VIiwgICAgICBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZV9mb3JfZ3Bvbl9vbnV9LAorICAgIHtCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsICAgICAgIkJDTU9MVF9PQkpfSURfR1BPTl9BTExPQyIsICAgIG1hY191dGlsX2luZGljYXRpb25faGFuZGxlX2Zvcl9ncG9uX2FsbG9jX2lkfSwKKyAgICB7QkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCAgICJCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQiLCBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZV9mb3JfZ3Bvbl9nZW1fcG9ydH0KK307CisKKworLyoqCisgKiBAYnJpZWYgTWFwIGJhbCBHUE9OIHRyYW5zY2VpdmVyIHR5cGUgdG8gYmNtNjg2MjAgdHJhbnNjZWl2ZXIgdHlwZQorICovCitzdGF0aWMgYmNtb2x0X3RyeF90eXBlIG1hY19ncG9uX2JhbF90cnhfdHlwZTJiY202ODYyMF90cnhfdHlwZShiY21iYWxfdHJ4X3R5cGUgYmFsX3RyeF90eXBlLCBiY21iYWxfaW50Zl9pZCBpbnRmX2lkKQoreworICAgIGJjbW9sdF90cnhfdHlwZSB0cnhfdHlwZSA9IEJDTU9MVF9UUlhfVFlQRV9fTlVNX09GOworCisgICAgc3dpdGNoIChiYWxfdHJ4X3R5cGUpCisgICAgeworICAgIGNhc2UgQkNNQkFMX1RSWF9UWVBFX0dQT05fU1BTXzQzXzQ4OgorICAgICAgICB0cnhfdHlwZSA9IEJDTU9MVF9UUlhfVFlQRV9TUFNfNDNfNDhfSF9IUF9DREVfU0RfMjAxMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01CQUxfVFJYX1RZUEVfR1BPTl9TUFNfU09HXzQzMjE6CisgICAgICAgIHRyeF90eXBlID0gQkNNT0xUX1RSWF9UWVBFX1NPR180MzIxX1BTR0I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNQkFMX1RSWF9UWVBFX0dQT05fTFRFXzM2ODBfTToKKyAgICAgICAgdHJ4X3R5cGUgPSBCQ01PTFRfVFJYX1RZUEVfTFRFXzM2ODBfTTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01CQUxfVFJYX1RZUEVfR1BPTl9TT1VSQ0VfUEhPVE9OSUNTOgorICAgICAgICB0cnhfdHlwZSA9IEJDTU9MVF9UUlhfVFlQRV9TT1VSQ0VfUEhPVE9OSUNTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTUJBTF9UUlhfVFlQRV9HUE9OX0xURV8zNjgwX1A6CisgICAgICAgIHRyeF90eXBlID0gQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfVFlQRV9DX1BMVVM7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpbnRmX2lkKSwgIkludmFsaWQgdHJ4X3R5cGUgJWRcbiIsIGJhbF90cnhfdHlwZSk7CisgICAgfQorICAgIHJldHVybiB0cnhfdHlwZTsKK30KKworCisKKworLyoqCisgKiBAYnJpZWYgYWxsIHRoZSBtYXBsZSBpbmRpY2F0aW9uIGhhbmRsZXJzIGZvciBncG9uCisgKgorICogQHBhcmFtIGRldmljZV9pZCB0aGUgbWFwbGUgZGV2aWNlIGlkIGdlbmVyYXRpbmcgdGhlIGN1cnJlbnQgaW5kaWNhdGlvbgorICogQHBhcmFtIHBfbXNnIHBvaW50ZXIgdG8gdGhlIG1hcGxlIGluZGljYXRpb24gbWVzc2FnZQorICoKKyAqLyAKK2JjbW9zX2Vycm5vIG1hY191dGlsX2hhbmRsZV9hbGxfb2x0X2luZF9mb3JfZ3BvbiAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpCit7CisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX21hY191dGlsLAorICAgICAgICAibWFjX3V0aWxfaW5kaWNhdGlvbl9jYiByZWNlaXZlZCBpbmRpY2F0aW9uIG9iaj0lZC8lcyBncm91cD0lZCBzdWJncm91cD0lZFxuIiwKKyAgICAgICAgcF9tc2ctPm9ial90eXBlLCBtYWNfdXRpbF9pbmRpY2F0aW9uX2dldF9vYmpfdHlwZV9zdHIocF9tc2ctPm9ial90eXBlLCBtYWNfdXRpbF9ncG9uX2luZF9oYW5kbGVycywgIEJDTV9TSVpFT0ZBUlJBWShtYWNfdXRpbF9ncG9uX2luZF9oYW5kbGVycykpLAorICAgICAgICBwX21zZy0+Z3JvdXAsIHBfbXNnLT5zdWJncm91cCk7CisKKyAgICByZXR1cm4gbWFjX3V0aWxfaGFuZGxlX2luZGljYXRpb24oZGV2aWNlX2lkLCBwX21zZywgbWFjX3V0aWxfZ3Bvbl9pbmRfaGFuZGxlcnMsIEJDTV9TSVpFT0ZBUlJBWShtYWNfdXRpbF9ncG9uX2luZF9oYW5kbGVycykpOworfQorCisvKioKKyAqIEBicmllZiBIYW5kbGVyIGZ1bmN0aW9uIGZvciBNYXBsZSBhdXRvIGluZGljYXRpb25zIGZvciBHUE9OIE5JCisgKgorICogQHBhcmFtIGRldmljZV9pZCB0aGUgbWFwbGUgZGV2aWNlIGlkIGdlbmVyYXRpbmcgdGhlIGN1cnJlbnQgaW5kaWNhdGlvbgorICogQHBhcmFtIHBfbXNnIHBvaW50ZXIgdG8gdGhlIG1hcGxlIGluZGljYXRpb24gbWVzc2FnZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hY191dGlsX2luZGljYXRpb25faGFuZGxlX2Zvcl9ncG9uX25pIChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisJdWludDMyX3QgbG9naWNhbF9wb247CisKKyAgICBkbworICAgCXsKKworICAgICAgICAvKiBQT04gYWN0aXZhdGlvbiAqLworICAgICAgICBpZiAoQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEID09IHBfbXNnLT5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqIHBfaW5kID0gKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQqKXBfbXNnOworICAgIAorCQkgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X3BoeXNpY2FsMmxvZ2ljYWwoZGV2aWNlX2lkLCBwX2luZC0+a2V5LnBvbl9uaSwgJmxvZ2ljYWxfcG9uKTsJCQkJCisgICAgCQlpZiAoQkNNX0VSUl9PSyAhPSByYykKKwkJICAgIHsKKwkJCSAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisJCQkJCSAgICAiRmFpbGVkIHRvIGdldCBsb2dpY2FsIGlmIGZyb20gcGh5c2ljYWwgaWYgKGRldmljZV9pZCAlZCBwaHlzaWNhbCAlZCApICglcylcbiIsIGRldmljZV9pZCwgcF9pbmQtPmtleS5wb25fbmksIGJjbW9zX3N0cmVycm9yKHJjKSk7CisJCQkgICAgYnJlYWs7CisJCSAgICB9CisgICAgCQkKKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGxvZ2ljYWxfcG9uKSwgIlBvbiBpZiAlZCBpcyAlcy5cbiIsIGxvZ2ljYWxfcG9uLAorICAgICAgICAgICAgICAgIEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkcgPT0gcF9pbmQtPmRhdGEubmV3X3N0YXRlID8gInVwIiA6ICJkb3duIik7CisgICAgCisgICAgICAgICAgICAvKiBpZiB3ZSBnb3Qgc29tZXRoaW5nIGZyb20gTUFDIEhXLCB0aGVuIGl0IGhhcyB0byBiZSBQT04gaW50ZXJmYWNlICovCisgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfaWZfZXZlbnQobG9naWNhbF9wb24sIEJDTUJBTF9JTlRGX1RZUEVfUE9OLCBwX21zZy0+ZXJyLAorICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLnJlc3VsdCwgcF9pbmQtPmRhdGEubmV3X3N0YXRlKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQgPT0gcF9tc2ctPnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZCAqcF9pbmQgPQorICAgICAgICAgICAgICAgIChiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZCAqKXBfbXNnOworICAgIAorCQkgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X3BoeXNpY2FsMmxvZ2ljYWwoZGV2aWNlX2lkLCBwX2luZC0+a2V5LnBvbl9uaSwgJmxvZ2ljYWxfcG9uKTsJCQkJCisgICAgCQlpZiAoQkNNX0VSUl9PSyAhPSByYykKKwkJICAgIHsKKwkJCSAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisJCQkJCSAgICAiRmFpbGVkIHRvIGdldCBsb2dpY2FsIGlmIGZyb20gcGh5c2ljYWwgaWYgKGRldmljZV9pZCAlZCBwaHlzaWNhbCAlZCApICglcylcbiIsIGRldmljZV9pZCwgcF9pbmQtPmtleS5wb25fbmksIGJjbW9zX3N0cmVycm9yKHJjKSk7CisJCQkgICAgYnJlYWs7CisJCSAgICB9CisgICAgCQkKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihsb2dpY2FsX3BvbiksCisgICAgICAgICAgICAgICAgICAgICJQb24gaWYgJWQgKE9OVUlEOiVkKSBmb3VuZCBPTlUgc2VyaWFsIG51bWJlciAiCisgICAgICAgICAgICAgICAgICAgICIlYyVjJWMlYyVkJWQlZCVkJWQlZCVkJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxfcG9uLAorICAgICAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5vbnVfaWQsCisgICAgICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLnNlcmlhbF9udW1iZXIudmVuZG9yX2lkWzBdLAorICAgICAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZFsxXSwKKyAgICAgICAgICAgICAgICAgICAgcF9pbmQtPmRhdGEuc2VyaWFsX251bWJlci52ZW5kb3JfaWRbMl0sCisgICAgICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLnNlcmlhbF9udW1iZXIudmVuZG9yX2lkWzNdLAorICAgICAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpY1swXT4+NCAmIDB4MGYsCisgICAgICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljWzBdICYgMHgwZiwKKyAgICAgICAgICAgICAgICAgICAgcF9pbmQtPmRhdGEuc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWNbMV0+PjQgJiAweDBmLAorICAgICAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpY1sxXSAmIDB4MGYsCisgICAgICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljWzJdPj40ICYgMHgwZiwKKyAgICAgICAgICAgICAgICAgICAgcF9pbmQtPmRhdGEuc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWNbMl0gJiAweDBmLAorICAgICAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpY1szXT4+NCAmIDB4MGYsCisgICAgICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljWzNdICYgMHgwZgorICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgICAgICAgICAgYmNtX3RvcG9fcG9uX2dldF9waHlzaWNhbDJsb2dpY2FsKGRldmljZV9pZCwgcF9pbmQtPmtleS5wb25fbmksICZsb2dpY2FsX3Bvbik7CisgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfc3ViX3Rlcm1fZXZlbnQobG9naWNhbF9wb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9pbmQtPmRhdGEub251X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX2luZC0+ZGF0YS5zZXJpYWxfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTF9VVElMX09QRVJfU1VCX1RFUk1fRElTQ09WRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbXNnLT5lcnIsIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fTk9ORSwgQkNNQkFMX0lOVkFMSURfVFVOTkVMX0lEKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGp1c3QgZ2V0IHRoZSBwb24ga2V5IGJ5IHR5cGVjYXN0aW5nIHRvIGEgZHVtbXkgc3RydWN0dXJlICovCisgICAgICAgICAgICBiY21vbHRfZ3Bvbl9uaV9rZXkgKnBfcG9uX2tleSA9ICYoKChiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKilwX21zZyktPmtleSk7CisgICAgCisJCSAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfcGh5c2ljYWwybG9naWNhbChkZXZpY2VfaWQsIHBfcG9uX2tleS0+cG9uX25pLCAmbG9naWNhbF9wb24pOwkJCQkKKyAgICAJCWlmIChCQ01fRVJSX09LICE9IHJjKQorCQkgICAgeworCQkJICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKwkJCQkJICAgICJGYWlsZWQgdG8gZ2V0IGxvZ2ljYWwgaWYgZnJvbSBwaHlzaWNhbCBpZiAoZGV2aWNlX2lkICVkIHBoeXNpY2FsICVkICkgKCVzKVxuIiwgZGV2aWNlX2lkLCBwX3Bvbl9rZXktPnBvbl9uaSwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKwkJCSAgICBicmVhazsKKwkJICAgIH0KKyAgICAKKyAgICAgICAgICAgIEJDTV9MT0coV0FSTklORywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGxvZ2ljYWxfcG9uKSwKKyAgICAgICAgICAgICAgICAiVW5oYW5kbGVkIG1lc3NhZ2UgaW5kaWNhdGlvbiBmb3Igb2JqIEdwb25fTkkgZ3JvdXAgJWQgIgorICAgICAgICAgICAgICAgICJzdWJncm91cCAlZCAoSWdub3JlZClcbiIsIHBfbXNnLT5ncm91cCwgcF9tc2ctPnN1Ymdyb3VwKTsKKyAgICAgICAgfQorICAgICAgIAkKKyAgIAl9CisJd2hpbGUoMCk7CisgICAgcmV0dXJuIHJjOworfQorCisKKworLyoqCisgKiBAYnJpZWYgSGFuZGxlciBmdW5jdGlvbiBmb3IgTWFwbGUgYXV0byBpbmRpY2F0aW9ucyBmb3IgR1BPTiBPTlUKKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIHRoZSBtYXBsZSBkZXZpY2UgaWQgZ2VuZXJhdGluZyB0aGUgY3VycmVudCBpbmRpY2F0aW9uCisgKiBAcGFyYW0gcF9tc2cgcG9pbnRlciB0byB0aGUgbWFwbGUgaW5kaWNhdGlvbiBtZXNzYWdlCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVfZm9yX2dwb25fb251IChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisJdWludDMyX3QgbG9naWNhbF9wb247CisKKwkvKiBqdXN0IGdldCB0aGUgcG9uIGtleSBieSB0eXBlY2FzdGluZyB0byBhIGR1bW15IHN0cnVjdHVyZSAqLworCWJjbW9sdF9ncG9uX29udV9rZXkgKnBfZ3Bvbl9vbnVfa2V5ID0gJigoKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQqKXBfbXNnKS0+a2V5KTsKKworICAgIGRvCisgICAgewkJCisgICAgICAgIGlmIChCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEID09IHBfbXNnLT5zdWJncm91cCkKKwkgICAgeworCQkgICAgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCAqcF9pbmQgPSAoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCopIHBfbXNnOworICAgIAkKKwkJICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9waHlzaWNhbDJsb2dpY2FsKGRldmljZV9pZCwgcF9pbmQtPmtleS5wb25fbmksICZsb2dpY2FsX3Bvbik7CQkJCQorICAgIAkJaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisJCSAgICB7CisJCQkgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorCQkJCQkgICAgIkZhaWxlZCB0byBnZXQgbG9naWNhbCBpZiBmcm9tIHBoeXNpY2FsIGlmIChkZXZpY2VfaWQgJWQgcGh5c2ljYWwgJWQgKSAoJXMpXG4iLCBkZXZpY2VfaWQsIHBfaW5kLT5rZXkucG9uX25pLCBiY21vc19zdHJlcnJvcihyYykpOworCQkJICAgIGJyZWFrOworCQkgICAgfQorICAgIAkKKwkJICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfaW5kLT5rZXkucG9uX25pKSwKKwkJCQkgICAgInN1Yl90ZXJtICVkIChQT04lZCkgYWN0aXZhdGlvbiBpbmRpY2F0aW9uICglcylcbiIsCisgICAgCQkJCXBfaW5kLT5rZXkub251X2lkLAorCQkJCSAgICBwX2luZC0+a2V5LnBvbl9uaSwKKwkJCQkgICAgIGJjbW9zX3N0cmVycm9yKHBfbXNnLT5lcnIpKTsKKyAgICAKKyAgICAgICAgICAgIG1hY191dGlsX3JlcG9ydF9zdWJfdGVybV9ldmVudChsb2dpY2FsX3BvbiwKKyAgICAgICAgICAgICAgICBwX2luZC0+a2V5Lm9udV9pZCwKKyAgICAgICAgICAgICAgICAoYmNtb2x0X3NlcmlhbF9udW1iZXIgKilOVUxMLAorICAgICAgICAgICAgICAgIEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQURELAorICAgICAgICAgICAgICAgIHBfbXNnLT5lcnIsIHBfaW5kLT5kYXRhLnN0YXR1cywKKyAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5mYWlsX3JlYXNvbiwgQkNNQkFMX0lOVkFMSURfVFVOTkVMX0lEKTsKKworCSAgICB9CisgICAgCWVsc2UgaWYoQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEID09IHBfbXNnLT5zdWJncm91cCkKKwkgICAgeworCQkgICAgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkICpwX2luZCA9IChiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQqKSBwX21zZzsKKyAgICAJCisJCSAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfcGh5c2ljYWwybG9naWNhbChkZXZpY2VfaWQsIHBfaW5kLT5rZXkucG9uX25pLCAmbG9naWNhbF9wb24pOwkJCQkKKyAgICAJCWlmIChCQ01fRVJSX09LICE9IHJjKQorCQkgICAgeworCQkJICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKwkJCQkJICAgICJGYWlsZWQgdG8gZ2V0IGxvZ2ljYWwgaWYgZnJvbSBwaHlzaWNhbCBpZiAoZGV2aWNlX2lkICVkIHBoeXNpY2FsICVkICkgKCVzKVxuIiwgZGV2aWNlX2lkLCBwX2luZC0+a2V5LnBvbl9uaSwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKwkJCSAgICBicmVhazsKKwkJICAgIH0KKyAgICAJCisJCSAgICBCQ01fTE9HKElORk8sIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihsb2dpY2FsX3BvbiksCisJCQkJICAgICJzdWJfdGVybSAlZCAoUE9OJWQpIGRlYWN0aXZhdGlvbiBpbmRpY2F0aW9uICglcylcbiIsCisgICAgCQkJCXBfaW5kLT5rZXkub251X2lkLAorCQkJCSAgICBsb2dpY2FsX3BvbiwKKyAgICAJCQkJYmNtb3Nfc3RyZXJyb3IocF9tc2ctPmVycikpOworICAgICAgICAgICAgbWFjX3V0aWxfcmVwb3J0X3N1Yl90ZXJtX2V2ZW50KGxvZ2ljYWxfcG9uLAorICAgICAgICAgICAgICAgIHBfaW5kLT5rZXkub251X2lkLAorICAgICAgICAgICAgICAgIChiY21vbHRfc2VyaWFsX251bWJlciAqKU5VTEwsCisgICAgICAgICAgICAgICAgQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9SRU1PVkUsCisgICAgICAgICAgICAgICAgcF9tc2ctPmVyciwgcF9pbmQtPmRhdGEuc3RhdHVzLAorICAgICAgICAgICAgICAgIE1BQ19VVElMX0RFQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FLCBCQ01CQUxfSU5WQUxJRF9UVU5ORUxfSUQpOworCSAgICAgfQorCSAgICBlbHNlCisgICAgCXsJICAgIAorCQkgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X3BoeXNpY2FsMmxvZ2ljYWwoZGV2aWNlX2lkLCBwX2dwb25fb251X2tleS0+cG9uX25pLCAmbG9naWNhbF9wb24pOwkJCQkKKyAgICAJCWlmIChCQ01fRVJSX09LICE9IHJjKQorCQkgICAgeworCQkJICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKwkJCQkJICAgICJGYWlsZWQgdG8gZ2V0IGxvZ2ljYWwgaWYgZnJvbSBwaHlzaWNhbCBpZiAoZGV2aWNlX2lkICVkIHBoeXNpY2FsICVkICkgKCVzKVxuIiwgZGV2aWNlX2lkLCBwX2dwb25fb251X2tleS0+cG9uX25pLCBiY21vc19zdHJlcnJvcihyYykpOworCQkJICAgIGJyZWFrOworCQkgICAgfQorICAgIAkKKwkJICAgIEJDTV9MT0coREVCVUcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihsb2dpY2FsX3BvbiksCisJCQkJICAgICJVbmhhbmRsZWQgbWVzc2FnZSBpbmRpY2F0aW9uIGZvciBvYmogR1BPTl9PTlUgZ3JvdXAgJWQgIgorICAgIAkJCQkic3ViZ3JvdXAgJWQgKElnbm9yZWQpXG4iLCBwX21zZy0+Z3JvdXAsIHBfbXNnLT5zdWJncm91cCk7CisJCQlicmVhazsKKwkgICAgfQorCisJCXJjID0gbWFjX3V0aWxfdXBkYXRlX2Zsb3dzX3dfc3ViX3Rlcm1fdXBkYXRlKGxvZ2ljYWxfcG9uLCBwX2dwb25fb251X2tleS0+b251X2lkLCBtYXBsZV9ncG9uX21hY19jaGVja19nZW1fcG9ydF9pZCwgbWFwbGVfZ3Bvbl9tYWNfZ2V0X2FsbG9jX2lkX2NvbmZpZyk7CisJCWlmIChCQ01fRVJSX09LICE9IHJjKQorCQl7CisJCQlCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisJCQkJCSJGYWlsZWQgdG8gdXBkYXRlIHJlbGF0ZWQgZmxvd3MgcG9uX2lkID0gJWQgb251X2lkID0gJWQgKCVzKVxuIiwgbG9naWNhbF9wb24sIHBfZ3Bvbl9vbnVfa2V5LT5vbnVfaWQsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisJCQlicmVhazsKKwkJfQorICAgICAgICAKKyAgIAl9CisgICAgd2hpbGUoMCk7CisgICAgcmV0dXJuIHJjOworfQorCisKKy8qKgorICogQGJyaWVmIEhhbmRsZXIgZnVuY3Rpb24gZm9yIE1hcGxlIGF1dG8gaW5kaWNhdGlvbnMgZm9yIEdQT04gQWxsb2MgSWQKKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkIHRoZSBtYXBsZSBkZXZpY2UgaWQgZ2VuZXJhdGluZyB0aGUgY3VycmVudCBpbmRpY2F0aW9uCisgKiBAcGFyYW0gcF9tc2cgcG9pbnRlciB0byB0aGUgbWFwbGUgaW5kaWNhdGlvbiBtZXNzYWdlCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVfZm9yX2dwb25fYWxsb2NfaWQgKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9tc2cgKnBfbXNnKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICB1aW50MzJfdCBsb2dpY2FsX3BvbjsKKyAgICB0bV9zY2hlZF9pbnN0KiBwX3RtX3NjaGVkX2luc3QgPSBOVUxMOwkKKyAgICBkbworICAgIHsJCQorICAgICAgICBpZiAoQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgPT0gcF9tc2ctPnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqcF9pbmQgPSAoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQqKSBwX21zZzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X3BoeXNpY2FsMmxvZ2ljYWwoZGV2aWNlX2lkLCBwX2luZC0+a2V5LnBvbl9uaSwgJmxvZ2ljYWxfcG9uKTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBsb2dpY2FsIGlmIGZyb20gcGh5c2ljYWwgaWYgKGRldmljZV9pZCAlZCBwaHlzaWNhbCAlZCApICglcylcbiIsIGRldmljZV9pZCwgcF9pbmQtPmtleS5wb25fbmksIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIEZpbmQgdG5fbW9kZSBpbnN0IG93bmVkIGJ5IHRoYXQgYWxsb2NfaWQgYW5kIG5pICovCisgICAgICAgICAgICBwX3RtX3NjaGVkX2luc3QgPSAgdG1fc2NoZWRfZmluZF9hZ2dfcG9ydF9ub2RlKGxvZ2ljYWxfcG9uLCBwX2luZC0+a2V5LmFsbG9jX2lkKTsKKyAgICAgICAgICAgIGlmIChOVUxMID09IHBfdG1fc2NoZWRfaW5zdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZmluZCB0bSBzY2hlZCBvd25lZCBieSB0aGF0IGFnZyBwb3J0IChpbnRmICVkIGlkICVkKVxuIiwgbG9naWNhbF9wb24scF9pbmQtPmtleS5hbGxvY19pZCk7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyp0aGUgdG0gb3duZWQgYnkgdGhhdCBhbGxvYyBmb3VuZCwgdXBkYXRlIGl0IHdpdGggdGhlIGluZCovCisgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfdG1fc2NoZWRfc2V0X2luZGljYXRpb24ocF90bV9zY2hlZF9pbnN0LT5yZXFfdG1fc2NoZWRfaW5mby5rZXkgLHBfbXNnLT5lcnIsIHBfaW5kLT5kYXRhLnN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBqdXN0IGdldCB0aGUgcG9uIGtleSBieSB0eXBlY2FzdGluZyB0byBhIGR1bW15IHN0cnVjdHVyZSAqLworICAgICAgICAgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5ICpwX3Bvbl9rZXkgPSAmKCgoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQqKXBfbXNnKS0+a2V5KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X3BoeXNpY2FsMmxvZ2ljYWwoZGV2aWNlX2lkLCBwX3Bvbl9rZXktPnBvbl9uaSwgJmxvZ2ljYWxfcG9uKTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGxvZ2ljYWwgaWYgZnJvbSBwaHlzaWNhbCBpZiAoZGV2aWNlX2lkICVkIHBoeXNpY2FsICVkICkgKCVzKVxuIiwgZGV2aWNlX2lkLCBwX3Bvbl9rZXktPnBvbl9uaSwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihsb2dpY2FsX3BvbiksCisgICAgICAgICAgICAgICAgICAgICJVbmhhbmRsZWQgbWVzc2FnZSBpbmRpY2F0aW9uIGZvciBvYmogR1BPTl9BTExPQyBncm91cCAlZCAiCisgICAgICAgICAgICAgICAgICAgICJzdWJncm91cCAlZCAoSWdub3JlZClcbiIsIHBfbXNnLT5ncm91cCwgcF9tc2ctPnN1Ymdyb3VwKTsKKyAgICAgICAgfQorICAgIH13aGlsZSAoMCk7CisgICAgcmV0dXJuIHJjOworfQorCQorCisvKioKKyAqIEBicmllZiBIYW5kbGVyIGZ1bmN0aW9uIGZvciBNYXBsZSBhdXRvIGluZGljYXRpb25zIGZvciBHUE9OIEdFTSBQb3J0CisgKgorICogQHBhcmFtIGRldmljZV9pZCB0aGUgbWFwbGUgZGV2aWNlIGlkIGdlbmVyYXRpbmcgdGhlIGN1cnJlbnQgaW5kaWNhdGlvbgorICogQHBhcmFtIHBfbXNnIHBvaW50ZXIgdG8gdGhlIG1hcGxlIGluZGljYXRpb24gbWVzc2FnZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hY191dGlsX2luZGljYXRpb25faGFuZGxlX2Zvcl9ncG9uX2dlbV9wb3J0IChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisJdWludDMyX3QgbG9naWNhbF9wb247CisgICAgZmxvd19saXN0X2VudHJ5ICpwX2N1cnJlbnRfZW50cnkgPSBOVUxMOworICAgIHZvaWQgKnBfcnNjX21ncl9jdXJyX2VudHJ5ID0gTlVMTDsKKyAgICB2b2lkICpwX3JzY19tZ3JfbmV4dF9lbnRyeSA9IE5VTEw7CisJCisgICAgZG8KKyAgIAl7CisKKyAgICAgICAgaWYgKEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEID09IHBfbXNnLT5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKnBfaW5kID0KKyAgICAgICAgICAgICAgICAoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKikgcF9tc2c7CisgICAgCisKKwkJICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9waHlzaWNhbDJsb2dpY2FsKGRldmljZV9pZCwgcF9pbmQtPmtleS5wb25fbmksICZsb2dpY2FsX3Bvbik7CQkJCQorICAgIAkJaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisJCSAgICB7CisJCQkgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorCQkJCQkgICAgIkZhaWxlZCB0byBnZXQgbG9naWNhbCBpZiBmcm9tIHBoeXNpY2FsIGlmIChkZXZpY2VfaWQgJWQgcGh5c2ljYWwgJWQgKSAoJXMpXG4iLCBkZXZpY2VfaWQsIHBfaW5kLT5rZXkucG9uX25pLCBiY21vc19zdHJlcnJvcihyYykpOworCQkJICAgIGJyZWFrOworCQkgICAgfQorICAgIAorICAgICAgICAgICAgLyogRmluZCBhbGwgZW50cmllcyBpbiBmbG93cyBsaXN0IG1hdGNoaW5nIHRoZSBnZW0gcG9ydCBpZCBhbmQgcG9uIG5pICovCisgICAgICAgICAgICAvKiB1c2Ugc2FmZSB3YWxrIGhlcmUgYmVjYXVzZSBhbiBlbnRyeSBjYW4gYmUgcmVtb3ZlZCBmcm9tIGxpc3QgZHVyaW5nIHRoZSB3YWxrICovCisgICAgICAgICAgICAvKiBnZXQgZmlyc3QgKi8KKyAgICAgICAgICAgIHBfY3VycmVudF9lbnRyeSA9IF9tYWNfdXRpbF9kYl9mbG93X2dldF9uZXh0X3dfZ2VtIChsb2dpY2FsX3BvbiwgcF9pbmQtPmtleS5nZW1fcG9ydF9pZCwgJnBfcnNjX21ncl9jdXJyX2VudHJ5LCAmcF9yc2NfbWdyX25leHRfZW50cnkpOworICAgICAgICAgICAgd2hpbGUgKE5VTEwgIT0gcF9jdXJyZW50X2VudHJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKiBAbm90ZSBGb3Igbm93IHRoaXMgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIG9wIHR5cGUgKGFkZCBvciByZW1vdmUpICwKKyAgICAgICAgICAgICAgICAgKiB0aGF0IGFsbCB0aGUgZmxvd3MgaW4gYW4gb251IGFyZSB3YWl0aW5nIGZvci4gV2UgY2FuIG5vdCBoYXZlIGZsb3dzIHdhaXRpbmcgb24gc2FtZQorICAgICAgICAgICAgICAgICAqIGdlbSBmb3IgbXVsdGlwbGUgb3AgdHlwZXMsIGJlY2F1c2UgTWFwbGUgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgY29uZmlncyB3aXRoCisgICAgICAgICAgICAgICAgICogZGlmZmVyZW50IG9wIHR5cGVzIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIGdlbSBwb3J0IGNvbXBsZXRlIGNvbmZpZ3VyYXRpb24gaW5kaWNhdGlvbiByZWNlaXZlZCAqLworICAgICAgICAgICAgICAgIHBfY3VycmVudF9lbnRyeS0+aXNfd2FpdGluZ19mb3Jfc3ZjX3BvcnRfYWN0aXZlID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgc2hvdWxkIHNlbmQgZmxvdyBjb25maWd1cmF0aW9uIGluZGljYXRpb24gY29tcGxldGUgdG8gYmFsIGNvcmUgKi8KKyAgICAgICAgICAgICAgICByYyA9IGNoZWNrX3NlbmRfZmxvd19iYWxfaW5kX21zZyhwX2N1cnJlbnRfZW50cnksIHBfbXNnLT5lcnIsIHBfaW5kLT5kYXRhLnN0YXR1cyk7CisKKyAgICAgICAgICAgICAgICAvKiBhbnkgREIgY2xlYW51cCBmb3IgZXJyb3Igc2hvdWxkIGJlIHRyaWdnZXJlZCBieSBDb3JlIGZzbQorICAgICAgICAgICAgICAgICAqIChtYWMgdXRpbCBzaG91bGQgbm90IGNsZWFudXAgb24gaXRzIG93bikKKyAgICAgICAgICAgICAgICAgKiAqLworICAgICAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGxvZ2ljYWxfcG9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNlbmQgZmxvdyBjb25maWd1cmVkIGluZDogRXJyb3IgJXMsIGdlbSBwb3J0IGlkID0gJWQsIHBvbiBuaSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwgcF9pbmQtPmtleS5nZW1fcG9ydF9pZCwgbG9naWNhbF9wb24pOworICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBicmVhaywgYnV0IGNvbnRpbnVlIHRvIGNoZWNrIGlmIG1vcmUgZmxvd3MgdXNlIHRoZSBzYW1lIGdlbSBwb3J0IGlkICovCisgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgIC8qIGdldCBuZXh0ICovCisgICAgICAgICAgICAgICAgcF9jdXJyZW50X2VudHJ5ID0gX21hY191dGlsX2RiX2Zsb3dfZ2V0X25leHRfd19nZW0gKGxvZ2ljYWxfcG9uLCBwX2luZC0+a2V5LmdlbV9wb3J0X2lkLCAmcF9yc2NfbWdyX2N1cnJfZW50cnksICZwX3JzY19tZ3JfbmV4dF9lbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBqdXN0IGdldCB0aGUgcG9uIGtleSBieSB0eXBlY2FzdGluZyB0byBhIGR1bW15IHN0cnVjdHVyZSAqLworICAgICAgICAgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5ICpwX3Bvbl9rZXkgPSAmKCgoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQqKXBfbXNnKS0+a2V5KTsKKworCQkgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X3BoeXNpY2FsMmxvZ2ljYWwoZGV2aWNlX2lkLCBwX3Bvbl9rZXktPnBvbl9uaSwgJmxvZ2ljYWxfcG9uKTsJCQkJCisgICAgCQlpZiAoQkNNX0VSUl9PSyAhPSByYykKKwkJICAgIHsKKwkJCSAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisJCQkJCSAgICAiRmFpbGVkIHRvIGdldCBsb2dpY2FsIGlmIGZyb20gcGh5c2ljYWwgaWYgKGRldmljZV9pZCAlZCBwaHlzaWNhbCAlZCApICglcylcbiIsIGRldmljZV9pZCwgcF9wb25fa2V5LT5wb25fbmksIGJjbW9zX3N0cmVycm9yKHJjKSk7CisJCQkgICAgYnJlYWs7CisJCSAgICB9CisgICAgCisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYobG9naWNhbF9wb24pLAorICAgICAgICAgICAgICAgICAgICAiVW5oYW5kbGVkIG1lc3NhZ2UgaW5kaWNhdGlvbiBmb3Igb2JqIEdQT05fR0VNX1BPUlQgZ3JvdXAgJWQgIgorICAgICAgICAgICAgICAgICAgICAic3ViZ3JvdXAgJWQgKElnbm9yZWQpXG4iLCBwX21zZy0+Z3JvdXAsIHBfbXNnLT5zdWJncm91cCk7CisgICAgICAgIH0KKyAgICAgICAJCisgICAJfQorICAgIHdoaWxlKDApOwkKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKgorICogQGJyaWVmICBNYXBsZSBhdXRvIGluZGljYXRpb24gcmVnaXN0ZXIgZm9yIHNwZWNpZmljIEdQT04gYmFzZWQgaW5kaWNhdGlvbnMKKyAqCisgKiBAcGFyYW0gcF9yeF9jZmcgICAgICAgICBoYW5kbGVyIGNvbmZpZyBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAgZGV2aWNlX2lkICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGRldmljZSBpZCAoZm9yIG11bHRpcGxlIGRldmljZXMgc3VwcG9ydCkgIAorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfcmVnaXN0ZXJfZm9yX2dwb25fYXV0b19pbmRpY2F0aW9ucyAoc3RydWN0IGJjbW9sdF9yeF9jZmcgKnBfcnhfY2ZnLCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIHJldHVybiBfbWFjX3V0aWxfcmVnaXN0ZXJfZm9yX2F1dG9faW5kaWNhdGlvbnMgKHBfcnhfY2ZnLCBtYWNfdXRpbF9ncG9uX2luZF9oYW5kbGVycywgQkNNX1NJWkVPRkFSUkFZKG1hY191dGlsX2dwb25faW5kX2hhbmRsZXJzKSwgZGV2aWNlX2lkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgTWFwIGl3Zl9tb2RlIHRvIGJjbW9sdF9pd2ZfbW9kZQorICoKKyAqIEBwYXJhbSBiYWxfaXdmX21vZGUgICAgIEJBTCBpd2Ztb2RlCisgKiBAcmV0dXJuIGJjbTY4NjIwIGl3ZiBtb2RlCisgKi8KK3N0YXRpYyBiY21vbHRfaXdmX21vZGUgYmFsX2l3Zl9tb2RlMml3Zl9tb2RlKGJjbWJhbF9pd2ZfbW9kZSBiYWxfaXdmX21vZGUpCit7CisgICAgYmNtb2x0X2l3Zl9tb2RlIGl3Zl9tb2RlID0gQkNNT0xUX0lXRl9NT0RFX19OVU1fT0Y7CisgICAgc3dpdGNoIChiYWxfaXdmX21vZGUpCisgICAgeworICAgIGNhc2UgQkNNQkFMX0lXRl9NT0RFX0RJUkVDVF9NQVBQSU5HOgorICAgICAgICBpd2ZfbW9kZSA9IEJDTU9MVF9JV0ZfTU9ERV9ESVJFQ1RfTUFQUElOR19NT0RFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTUJBTF9JV0ZfTU9ERV9QRVJfRkxPVzoKKyAgICAgICAgaXdmX21vZGUgPSBCQ01PTFRfSVdGX01PREVfUEVSX0ZMT1dfTU9ERTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLCAiSW52YWxpZCBpd2ZfbW9kZSAlZFxuIiwgYmFsX2l3Zl9tb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIGl3Zl9tb2RlOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfZ3BvbiAoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLCBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGUsIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0ge307CisgICAgYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgbm5pX3NwZWVkX2NmZzsKKyAgICBiY21vbHRfZGV2aWNlX2NmZyBkZXZfY2ZnOworICAgIGJjbW9sdF9pd2ZfbW9kZSBpd2ZfbW9kZTsKKyAgICB1aW50MzJfdCBsb2dpY2FsX3BvbjsKKworICAgIGlmIChCQ01PU19UUlVFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJihwX2FjY190ZXJtLT5hcGlfcmVxX2FjY190ZXJtX29ial9pbmZvKSwgYWNjZXNzX3Rlcm1pbmFsLCBpd2ZfbW9kZSkpCisgICAgeworICAgICAgICBpd2ZfbW9kZSA9IGJhbF9pd2ZfbW9kZTJpd2ZfbW9kZShwX2FjY190ZXJtLT5hcGlfcmVxX2FjY190ZXJtX29ial9pbmZvLmRhdGEuaXdmX21vZGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpd2ZfbW9kZSA9IEJDTU9MVF9JV0ZfTU9ERV9ESVJFQ1RfTUFQUElOR19NT0RFOworICAgIH0KKworICAgIEJDTV9UT1BPX0RFVl9GT1JfRUFDSF9QT04oZGV2aWNlX2lkLCBsb2dpY2FsX3BvbikKKyAgICB7CisgICAgICAgIG1hY191dGlsX3RvcG9fcG9uX2NvbnRleHQgKnRvcG9fY29udGV4dCwgKm9sZF90b3BvX2NvbnRleHQ7CisKKyAgICAgICAgb2xkX3RvcG9fY29udGV4dCA9IGJjbV90b3BvX3Bvbl9nZXRfY29udGV4dChsb2dpY2FsX3BvbiwgQkNNX1RPUE9fUE9OX0NPTlRFWFRfSURfTUFDX1VUSUwpOworICAgICAgICBpZiAob2xkX3RvcG9fY29udGV4dCkKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUob2xkX3RvcG9fY29udGV4dCk7CisKKyAgICAgICAgdG9wb19jb250ZXh0ID0gYmNtb3NfY2FsbG9jKHNpemVvZigqdG9wb19jb250ZXh0KSk7CisgICAgICAgIHRvcG9fY29udGV4dC0+aXdmX21vZGUgPSBpd2ZfbW9kZTsKKyAgICAgICAgYmNtX3RvcG9fcG9uX3NldF9jb250ZXh0KGxvZ2ljYWxfcG9uLCBCQ01fVE9QT19QT05fQ09OVEVYVF9JRF9NQUNfVVRJTCwgdG9wb19jb250ZXh0KTsKKyAgICB9CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmRldl9jZmcsIGRldmljZSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZkZXZfY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlLCBhY2NfdGVybV9jb25uZWN0aXZpdHkuZGV2aWNlc1tkZXZpY2VfaWRdLnN5c3RlbV9tb2RlKTsKKworI2lmZGVmIFFBWF9TV0lUQ0gKKyAgICAvKiB1bnRpbCBzcGVlZCBpcyBjb25maWd1cmFibGUgdGhyb3VnaCB0b3BvbG9neSBzZXR0aW5ncyBoYXJkY29kZSBpdCBiYXNlZCBvbiBzd2l0Y2ggdHlwZSAqLyAKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9tYWNfdXRpbCwgIm5uaSBzcGVlZCBpczogMTBHXG4iKTsKKyAgICBubmlfc3BlZWRfY2ZnLmZpcnN0X2hhbGYgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTA7CisgICAgbm5pX3NwZWVkX2NmZy5zZWNvbmRfaGFsZiA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18xMDsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZkZXZfY2ZnLCBkZXZpY2UsIG5uaV9zcGVlZCwgbm5pX3NwZWVkX2NmZyk7CisjZW5kaWYKKworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZkZXZfY2ZnLmhkcik7Cit9CisKKy8qKgorICogQGJyaWVmIGFjY2VzcyB0ZXJtaW5hbCBzZXQgZm9yIGdwb25fMTYKKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfZ3Bvbl8xNiAoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHJjID0gbWFwbGVfYWNjZXNzX3Rlcm1pbmFsX3NldF9jb21tb24ocF9hY2NfdGVybSwgb3BfdHlwZSwgZGV2aWNlX2lkKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIHJjOworICAgIHJjID0gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfZ3BvbihwX2FjY190ZXJtLCBvcF90eXBlLCBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fMTZfWCwgZGV2aWNlX2lkKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIHJjOworICAgIHJldHVybiBtYXBsZV9hY2Nlc3NfdGVybWluYWxfY29ubmVjdF9jb21tb24oZGV2aWNlX2lkKTsKKwkKK30KKworLyoqCisgKiBAYnJpZWYgYWNjZXNzIHRlcm1pbmFsIHNldCBmb3IgZ3Bvbl84CisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXRfZm9yX2dwb25fOCAoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIAorICAgIHJjID0gbWFwbGVfYWNjZXNzX3Rlcm1pbmFsX3NldF9jb21tb24ocF9hY2NfdGVybSwgb3BfdHlwZSwgZGV2aWNlX2lkKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIHJjOworICAgIHJjID0gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfZ3BvbihwX2FjY190ZXJtLCBvcF90eXBlLCBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YLCBkZXZpY2VfaWQpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gcmM7CisgICAgcmV0dXJuIG1hcGxlX2FjY2Vzc190ZXJtaW5hbF9jb25uZWN0X2NvbW1vbihkZXZpY2VfaWQpOworfQorCisvKiogCisgICogQGJyaWVmIHBvc3QgYWNjZXNzIHRlcm1pbmFsIHVwIGNvbmZpZ3VyYXRpb25zIG9uIE1hcGxlCisgICovCitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfcG9zdF9pbmRpY2F0aW9uX3NldF9mb3JfZ3BvbihiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZGV2aWQgZHVtbXk7CisgICAgdWludDMyX3QgcGh5c2ljYWxfaWZfaWQ7CisgICAgdWludDMyX3QgbG9naWNhbF9wb24gPSBCQ01fVE9QT19QT05fSU5WQUxJRDsKKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkgbmlfa2V5ID0ge307CisgICAgYmNtb2x0X2dwb25fbmlfY2ZnIG5pX2NmZyA9IHt9OworICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIHNuX2FjcXVpc2l0aW9uX2NmZyA9IHt9OworICAgIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnIGdwb25fbmlfYXV0b19jZmcgPSB7fTsgIC8qIG1haW4gYXV0byBjZmcgYXBpIHN0cnVjdCAqLworCisgICAgLyogY29uZmlndXJlIG9uZSB0aW1lIHNldHRpbmdzIGZvciBhbGwgdGhlIGludGVyZmFjZXMgb24gdGhpcyBkZXZpY2UgKi8KKyAgICBCQ01fVE9QT19ERVZfRk9SX0VBQ0hfUE9OKGRldmljZV9pZCwgbG9naWNhbF9wb24pCisgICAgeworICAgICAgICAvKiBnZXQgcGh5c2ljYWwgaW50ZXJmYWNlIGZyb20gbG9naWNhbCBpbnRlcmZhY2UgKi8KKyAgICAgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X2xvZ2ljYWwycGh5c2ljYWwgKGxvZ2ljYWxfcG9uLCAmZHVtbXksICZwaHlzaWNhbF9pZl9pZCk7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYobG9naWNhbF9wb24pLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBwaHlzaWNhbCBpZiBmcm9tIGxvZ2ljYWwgaWYgKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbmlfa2V5LnBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOyAKKworCisgICAgICAgIC8qIFNldCB0aGUgU04gYWNxdWlzaXRpb24gbW9kZSB0byBlbmFibGUgKi8KKyAgICAgICAgQkNNT0xUX0NGR19JTklUKCZuaV9jZmcsIGdwb25fbmksIG5pX2tleSk7CisKKyAgICAgICAgc25fYWNxdWlzaXRpb25fY2ZnLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgICAgIHNuX2FjcXVpc2l0aW9uX2NmZy5pbnRlcnZhbCA9IDUwMDA7CisgICAgICAgIHNuX2FjcXVpc2l0aW9uX2NmZy5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSA9IEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9OT05FOworICAgICAgICAKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmbmlfY2ZnLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgc25fYWNxdWlzaXRpb25fY2ZnKTsKKworICAgICAgICByYyA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJm5pX2NmZy5oZHIpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGxvZ2ljYWxfcG9uKSwgCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IHNuIGFjcXVpc2l0aW9uIGNvbmZpZ3VyYXRpb24gKCVzKSwgZXJyX3RleHQ9JXMpXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCBuaV9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKworICAgICAgICAvKiB0dXJuIG9mZiB0aGUgYXV0byBpbmRpY2F0aW9uIG1lc3NhZ2VzIGZvciBncG9uX25pLnNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQgICovCisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZncG9uX25pX2F1dG9fY2ZnLCBncG9uX25pLCBuaV9rZXkpOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmdwb25fbmlfYXV0b19jZmcsIGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsIEJDTU9TX0ZBTFNFKTsKKyAgICAgICAgcmMgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmdwb25fbmlfYXV0b19jZmcuaGRyKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihsb2dpY2FsX3BvbiksIAorICAgICAgICAgICAgICAgICAgICAiYmNtb2x0X2F1dG9fY2ZnX3NldCBmb3IgZ3Bvbl9uaS5zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0LCBGYWlsZWQgKCVzKSwgZXJyX3RleHQ9JXMpXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCBncG9uX25pX2F1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworCisgICAgICAgICAgICAvKiBpZ25vcmUgYW55IGVycm9yLCBqdXN0IGNvbnRpbnVlIGFueXdheSAqLworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioKKyAqIEBicmllZiBDb21tYW5kIFNldCBzZXR1cCByb3V0aW5lIGZvciBpbnRlcmZhY2UgdXAgdG8gbWFjIGFwcGxpY2F0aW9uIGZvciBHUE9OCisgKiAKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgaWZfZnNtIGluIHRoZSBCQUwgY29yZSB0byBpbml0aWFsaXplIHRoZSBjb21tYW5kCisgKiBzZXQgdG8gdXAgdGhlIGludGVyZmFjZSBvZiB0aGUgbWFjIGFwcGxpY2F0aW9uLiBUaGUgY21kc2V0IGFjdHVhbGx5IAorICogY29uc2lzdHMgb2YgdHdvIGNvbW1hbmRzLCBvbmUgaXMgdG8gc2VuZCB0aGUgaWYgdXAgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBtYWMKKyAqIEFwcCBhbmQgaGFuZGxlIHRoZSByZWxldmFudCByZXNwb25zZSwgdGhlIG90aGVyIGlzIHRvIGhhbmRsZSB0aGUgaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBmcm9tIHRoZSBtYWMgQVBQIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuIAorICogCisgKiBAcGFyYW0gcF9pbnRlcmZhY2VfaW5zdCAgUG9pbnRlciB0byBpbnRlcmZhY2UgaW5zdGFuY2UKKyAqIEBwYXJhbSBvcF90eXBlICAgICAgICAgICBPcGVyYXRpb24gdHlwZSBvbiBhY2Nlc3MgdGVybWluYWwvaW50ZXJmYWNlIGluc3RhbmNlCisgKiAKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8gCisgKgorICovCitiY21vc19lcnJubyBtYWNfdXRpbF9pbnRlcmZhY2Vfc2V0X2Zvcl9ncG9uKGFjY190ZXJtX2ludGVyZmFjZSAqcF9pbnRlcmZhY2VfaW5zdCwgYmFsX3V0aWxfb3Blcl9pZiBvcF90eXBlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGJjbWJhbF9pbnRlcmZhY2VfY2ZnICpwX2ludGVyZmFjZV9yZXEgPSAmKHBfaW50ZXJmYWNlX2luc3QtPmFwaV9yZXFfaW50X29ial9pbmZvKTsKKyAgICBiY21iYWxfaW50ZXJmYWNlX2tleSBpbnRmX2tleSA9IHBfaW50ZXJmYWNlX3JlcS0+a2V5OworICAgIG1hY191dGlsX3RvcG9fcG9uX2NvbnRleHQgKnRvcG9fY29udGV4dDsKKworICAgIGRvCisgICAgeworICAgICAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgICAgICB1aW50MzJfdCBwaHlzaWNhbF9pZl9pZDsKKyAgICAgICAgLyogZ2V0IHBoeXNpY2FsIGludGVyZmFjZSBmcm9tIGxvZ2ljYWwgaW50ZXJmYWNlICovCisgICAgICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9sb2dpY2FsMnBoeXNpY2FsIChpbnRmX2tleS5pbnRmX2lkLCAmZGV2aWNlX2lkLCAmcGh5c2ljYWxfaWZfaWQpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGludGZfa2V5LmludGZfaWQpLCAKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgcGh5c2ljYWwgaWYgZnJvbSBsb2dpY2FsIGlmICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZSBvcGVyX25pOworICAgICAgICBiY21vbHRfZ3Bvbl9uaV9rZXkgbmlfa2V5ID0geyAucG9uX25pID0gcGh5c2ljYWxfaWZfaWQgfTsKKyAgICAgICAgYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmcgPSB7fTsKKyAgICAgICAgYmNtb2x0X2dwb25fdHJ4X2tleSB0cnhfa2V5ID0geyAucG9uX25pID0gcGh5c2ljYWxfaWZfaWQgfTsKKyAgICAgICAgYmNtb2x0X3RyeF90eXBlIHRyeF90eXBlOworICAgICAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGl3Zl9rZXkgPSB7IC5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZCB9OworICAgICAgICBiY21vbHRfZ3Bvbl9pd2ZfY2ZnIGl3Zl9jZmcgPSB7fTsKKyAgICAgICAgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIG1hY190YWJsZV9jb25maWd1cmF0aW9uID0ge307CisKKyAgICAgICAgaWYgKEJBTF9VVElMX09QRVJfSUZfVVAgPT0gb3BfdHlwZSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKiBzZXQgdGhlIHBvbl9uaSB0cmFuc2NlaXZlciBjb25maWd1cmF0aW9uICovCisgICAgICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl90cngsIHRyeF9rZXkpOworCisgICAgICAgICAgICAvKiBJZiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBhIHRyYW5zY2VpdmVyLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCAqLworICAgICAgICAgICAgaWYgKEJDTU9TX1RSVUUgIT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2ludGVyZmFjZV9yZXEsIGludGVyZmFjZSwgdHJhbnNjZWl2ZXJfdHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVGhlIHVzZXIgZGlkbid0IGNob29zZSBhIHRyYW5zY2VpdmVyIHR5cGUsIHNvIG92ZXJyaWRlIGl0IGhlcmUKKyAgICAgICAgICAgICAgICAgKiB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBHUE9OCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2ludGVyZmFjZV9yZXEsIGludGVyZmFjZSwgdHJhbnNjZWl2ZXJfdHlwZSwgQkNNQkFMX01BQ19VVElMX1RSWF9UWVBFX0RFRkFVTFRfR1BPTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNldCB0aGUgKGRlZmF1bHQgb3IgY2hvc2VuKSB0cmFuc2NlaXZlciBjb25maWd1cmF0aW9uIGludG8gdGhlIE1BQyBkZXZpY2UgKi8KKyAgICAgICAgICAgIHRyeF90eXBlID0gbWFjX2dwb25fYmFsX3RyeF90eXBlMmJjbTY4NjIwX3RyeF90eXBlKHBfaW50ZXJmYWNlX3JlcS0+ZGF0YS50cmFuc2NlaXZlcl90eXBlLCBpbnRmX2tleS5pbnRmX2lkKTsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsIHRyeF90eXBlKTsKKworICAgICAgICAgICAgcmMgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpbnRmX2tleS5pbnRmX2lkKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCB0cnggY29uZmlndXJhdGlvbiAoJXMpLCBlcnJfdGV4dD0lc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLyogQ29uZmlndXJlIHBvbl9uaSBpbnRlcndvcmtpbmcgYW5kIG1hYyB0YWJsZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBzeXN0ZW0gZ2xvYmFsIGludGVyd29ya2luZyBtb2RlCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogV2Ugb25seSBoYXZlIHRvIGNoYW5nZSB0aGUgbW9kZSBpZiB0aGUgdXNlciBoYXMgY2hvc2VuIHBlci1mbG93LCBiZWNhdXNlIGRpcmVjdCBtb2RlIGlzIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgKiBpd2YgbW9kZSBpbiBNQVBMRQorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0b3BvX2NvbnRleHQgPSBiY21fdG9wb19wb25fZ2V0X2NvbnRleHQoaW50Zl9rZXkuaW50Zl9pZCwgQkNNX1RPUE9fUE9OX0NPTlRFWFRfSURfTUFDX1VUSUwpOworICAgICAgICAgICAgaWYgKEJDTU9MVF9JV0ZfTU9ERV9QRVJfRkxPV19NT0RFID09IHRvcG9fY29udGV4dC0+aXdmX21vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc2V0IHRoZSBpd2YgY29uZmlndXJhdGlvbiAqLworICAgICAgICAgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmaXdmX2NmZywgZ3Bvbl9pd2YsIGl3Zl9rZXkpOworICAgICAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJml3Zl9jZmcsIGdwb25faXdmLCBpd2ZfbW9kZSwgQkNNT0xUX0lXRl9NT0RFX1BFUl9GTE9XX01PREUpOworICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgbWFjIHRhYmxlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgICAgICAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hZ2luZ190aW1lID0gMTAwMDA7CisgICAgICAgICAgICAgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19tb3ZlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICAgICAgICAgICAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfc3RhdGljX21vZGUgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgICAgICAgICAgICAgIG1hY190YWJsZV9jb25maWd1cmF0aW9uLmRlZmF1bHRfZmxvd19pZCA9IDA7CisgICAgICAgICAgICAgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubGVhcm5pbmdfbW9kZSA9IEJDTU9MVF9NQUNfVEFCTEVfTEVBUk5JTkdfTU9ERV9OT1JNQUw7CisgICAgICAgICAgICAgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubWlzc19mYWxsYmFjayA9IEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19EUk9QOworICAgICAgICAgICAgICAgIG1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbGVhcm5pbmcgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgICAgICAgICAgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19hZ2luZyA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKKyAgICAgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZpd2ZfY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIG1hY190YWJsZV9jb25maWd1cmF0aW9uKTsKKworICAgICAgICAgICAgICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmaXdmX2NmZy5oZHIpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGludGZfa2V5LmludGZfaWQpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCBpd2YgLyBtYWMgdGFibGUgY29uZmlndXJhdGlvbiAoJXMpLCBlcnJfdGV4dD0lcylcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCBpd2ZfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8qIGludm9rZSB0aGUgcG9uX25pIHN0YXRlIGNoYW5nZSB0byB0aGUgcmVxdWVzdGVkIHN0YXRlICovCisgICAgICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXJfbmksIGdwb25fbmksIHNldF9wb25fc3RhdGUsIG5pX2tleSk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyX25pLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsCisgICAgICAgICAgICAoQkFMX1VUSUxfT1BFUl9JRl9VUCA9PSBvcF90eXBlKSA/IAorICAgICAgICAgICAgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1dPUktJTkcgOiBCQ01PTFRfUE9OX09QRVJBVElPTl9JTkFDVElWRSk7CisgICAgICAgIHJjID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXJfbmkuaGRyKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpbnRmX2tleS5pbnRmX2lkKSwgCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gJXMgKHN1Ym1pdCkgcG9uIGludGVyZmFjZSAoJXMpLCBlcnJfdGV4dD0lc1xuIiwgCisgICAgICAgICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX0lGX1VQID09IG9wX3R5cGUpID8gImFjdGl2YXRlIiA6ICJkZWFjdGl2YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCBvcGVyX25pLmhkci5oZHIuZXJyX3RleHQpOworICAgICAgICB9CisKKyAgICB9IHdoaWxlICgwKTsKKworICAgIGlmIChCQ01fRVJSX09LID09IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGludGZfa2V5LmludGZfaWQpLCAKKyAgICAgICAgICAgICAgICAiU3VibWl0dGVkIElOVEVSRkFDRS0lcyBvcGVyYXRpb24gZm9yIElGICVkXG4iLAorICAgICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX0lGX1VQID09IG9wX3R5cGUpID8gIlVQIiA6ICJET1dOIiwKKyAgICAgICAgICAgICAgICBpbnRmX2tleS5pbnRmX2lkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBAYnJpZWYgbWFwbGVfbWFjX2RzX2l3Zl9jZmcKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIHJlbGV2YW50IGRvd25zdHJlYW0gaW5ncmVzcyBhbmQgZWdyZXNzIGl3ZiBhdCB0aGUgZGV2aWNlCisgKgorICogQHBhcmFtIHBfZmxvdyAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmbG93IGluZm8KKyAqIEBwYXJhbSBwZXJfZmxvd19tb2RlX3ZsYW5faWQgICAgdmxhbiBpZCBmb3IgR0VNIHBvcnQgbWFwcGluZyBpbiBwZXIgZmxvdyBtb2RlCisgKiBAcGFyYW0gaXNfcGJpdF9lbmFibGVkICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byByZXNvbHZlIHBiaXRzIHRvIEdFTSBJRHMKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBtYXBsZV9tYWNfZHNfaXdmX2NmZyhiY21iYWxfZmxvd19jZmcgKnBfZmxvdywgdWludDE2X3QgcGVyX2Zsb3dfbW9kZV92bGFuX2lkLCBiY21vc19ib29sIGlzX3BiaXRfZW5hYmxlZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgaW5fa2V5ID0ge307CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgaW5fY2ZnID0ge307CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBlZ3Jfa2V5ID0ge307CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBlZ3JfY2ZnID0ge307CisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9pZl9pZDsKKworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGdldCBwaHlzaWNhbCBpbnRlcmZhY2UgZnJvbSBsb2dpY2FsIGludGVyZmFjZSAqLworICAgICAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfbG9naWNhbDJwaHlzaWNhbCAocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQsICZkZXZpY2VfaWQsICZwaHlzaWNhbF9pZl9pZCk7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBwaHlzaWNhbCBpZiBmcm9tIGxvZ2ljYWwgaWYgKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogY29uZmlndXJlIHRoZSBuZXcgZHMgaW5ncmVzcyBmbG93ICovCisgICAgICAgIGluX2tleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICAgICAgaW5fa2V5LnZsYW5faWQgPSBwZXJfZmxvd19tb2RlX3ZsYW5faWQ7CisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmaW5fY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGluX2tleSk7CisgICAgICAgIGlmIChCQ01PU19UUlVFID09IHBfZmxvdy0+ZGF0YS5yZXNvbHZlX21hYykKKyAgICAgICAgeworICAgICAgICAgICAgLyogbWFwcGluZyBtZXRob2QgKi8KKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmluX2NmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCwKKyAgICAgICAgICAgICAgICBCQ01PTFRfVkxBTl9UT19GTE9XX01BUFBJTkdfTUVUSE9EX01BQ1BMVVNWSUQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogbWFwcGluZyBtZXRob2QgKi8KKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmluX2NmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCwKKyAgICAgICAgICAgICAgICBCQ01PTFRfVkxBTl9UT19GTE9XX01BUFBJTkdfTUVUSE9EX1ZJRCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBtYXBwaW5nIHRhZyAqLworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZpbl9jZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ190YWcsCisgICAgICAgICAgICBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX09VVEVSX1ZJRCk7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmluX2NmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbiwgQkNNT0xUX0RTX1ZMQU5fQUNUSU9OX1RSQU5TUEFSRU5UKTsKKworICAgICAgICByYyA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmluX2NmZy5oZHIpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29uZmlndXJlIGluZ3Jlc3MgZmxvdyBwb25fbmkgPSAlZCB2bGFuX2lkID0gJWQgcmMgPSAlcyAoJWQpLCBlcnJfdGV4dD0lc1xuIiwKKyAgICAgICAgICAgICAgICBpbl9rZXkucG9uX25pLAorICAgICAgICAgICAgICAgIGluX2tleS52bGFuX2lkLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwKKyAgICAgICAgICAgICAgICByYywKKyAgICAgICAgICAgICAgICBpbl9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyogY29uZmlndXJlIHRoZSBuZXcgZHMgZWdyZXNzIGZsb3cgKi8KKyAgICAgICAgZWdyX2tleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICAgICAgZWdyX2tleS5mbG93X2lkID0gcF9mbG93LT5kYXRhLnN2Y19wb3J0X2lkOworCisgICAgICAgIC8qIENvbmZpZ3VyZSBEUyBlZ3Jlc3MgaGFuZGxpbmc6IGZsb3cgLT4gR0VNICovCisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmZWdyX2NmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGVncl9rZXkpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZlZ3JfY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQsIHBfZmxvdy0+ZGF0YS5zdmNfcG9ydF9pZCk7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmVncl9jZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBwYml0X2NvbnRyb2wsIGlzX3BiaXRfZW5hYmxlZCk7CisKKyAgICAgICAgcmMgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZlZ3JfY2ZnLmhkcik7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29uZmlndXJlIGVncmVzcyBmbG93IHBvbl9uaSA9ICVkIGZsb3dfaWQgPSAlZCByYyA9ICVzICglZCksIGVycl90ZXh0PSVzXG4iLAorICAgICAgICAgICAgICAgIGVncl9rZXkucG9uX25pLAorICAgICAgICAgICAgICAgIGVncl9rZXkuZmxvd19pZCwKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksCisgICAgICAgICAgICAgICAgcmMsCisgICAgICAgICAgICAgICAgZWdyX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoMCk7CisKKyAgICBCQ01fTE9HKERFQlVHLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgImdvaW5nIG91dCBvZiAlcyByYyA9ICVzICglZClcbiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBAYnJpZWYgbWFwbGVfbWFjX2RzX2l3Zl9jZmdfcmVtb3ZlCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcmVtb3ZlIGNvbmZpZ3VyYXRpb24gZnJvbSBNYXBsZSBvZiB0aGUgcmVsZXZhbnQgZG93bnN0cmVhbSBpbmdyZXNzIGFuZCBlZ3Jlc3MgaXdmCisgKgorICogQHBhcmFtIHBfZmxvdyAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmbG93IGluZm8KKyAqIEBwYXJhbSBwZXJfZmxvd19tb2RlX3ZsYW5faWQgICAgdmxhbiBpZCBmb3IgcGVyIGZsb3cgbW9kZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hcGxlX21hY19kc19pd2ZfY2ZnX3JlbW92ZShiY21iYWxfZmxvd19jZmcgKnBfZmxvdywgdWludDE2X3QgcGVyX2Zsb3dfbW9kZV92bGFuX2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBpbl9rZXkgPSB7fTsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBpbl9jZmcgPSB7fTsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGVncl9rZXkgPSB7fTsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnIGVncl9jZmcgPSB7fTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IHBoeXNpY2FsX2lmX2lkOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGNvbmZpZyBjbGVhciBkcyBpbmdyZXNzIGZsb3cgKi8KKyAgICAgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X2xvZ2ljYWwycGh5c2ljYWwgKHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkLCAmZGV2aWNlX2lkLCAmcGh5c2ljYWxfaWZfaWQpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgcGh5c2ljYWwgaWYgZnJvbSBsb2dpY2FsIGlmICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGluX2tleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICAgICAgaW5fa2V5LnZsYW5faWQgPSBwZXJfZmxvd19tb2RlX3ZsYW5faWQ7CisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmaW5fY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGluX2tleSk7CisKKyAgICAgICAgcmMgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmluX2NmZy5oZHIpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gQ2xlYXIgaW5ncmVzcyBmbG93IHBvbl9uaSA9ICVkIHZsYW5faWQgPSAlZCByYyA9ICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgaW5fa2V5LnBvbl9uaSwKKyAgICAgICAgICAgICAgICBpbl9rZXkudmxhbl9pZCwKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksCisgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIGNvbmZpZyBjbGVhciBkcyBlZ3Jlc3MgZmxvdyAqLworICAgICAgICBlZ3Jfa2V5LnBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOworICAgICAgICBlZ3Jfa2V5LmZsb3dfaWQgPSBwX2Zsb3ctPmRhdGEuc3ZjX3BvcnRfaWQ7CisKKyAgICAgICAgLyogQ29uZmlndXJlIERTIGVncmVzcyBoYW5kbGluZzogZmxvdyAtPiBHRU0gKi8KKyAgICAgICAgQkNNT0xUX0NGR19JTklUKCZlZ3JfY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZWdyX2tleSk7CisKKyAgICAgICAgcmMgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmVncl9jZmcuaGRyKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBDbGVhciBlZ3Jlc3MgZmxvdyBwb25fbmkgPSAlZCBmbG93X2lkID0gJWQgcmMgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgIGVncl9rZXkucG9uX25pLAorICAgICAgICAgICAgICAgIGVncl9rZXkuZmxvd19pZCwKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksCisgICAgICAgICAgICAgICAgcmMpOworICAgICAgICB9CisKKyAgICB9IHdoaWxlICgwKTsKKworICAgIEJDTV9MT0coREVCVUcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAiJXM6IGNvbmZpZyBjbGVhcjogcmMgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBAYnJpZWYgbWFwbGVfbWFjX3VzX2l3Zl9jZmcKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIHJlbGV2YW50IHVwc3RyZWFtIGl3ZiBhdCB0aGUgZGV2aWNlCisgKgorICogQHBhcmFtIHBfZmxvdyAgICAgICBBIHBvaW50ZXIgdG8gYSBmbG93IG9iamVjdAorICoKKyAqIEBwYXJhbSBwYml0ICAgICAgICAgQSBwYml0IHZhbHVlIGJlaW5nIGNvbmZpZ3VyZWQgZm9yIHRoZSBzcGVjaWZpZWQgZmxvdworICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hcGxlX21hY191c19pd2ZfY2ZnKGJjbWJhbF9mbG93X2NmZyAqcF9mbG93LCB1aW50OF90IHBiaXQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX1BBUk07CisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5IHVzX2tleSA9IHt9OworICAgIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZyB1c19jZmcgPSB7fTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IHBoeXNpY2FsX2lmX2lkOworCisgICAgLyogZ2V0IHBoeXNpY2FsIGludGVyZmFjZSBmcm9tIGxvZ2ljYWwgaW50ZXJmYWNlICovCisgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X2xvZ2ljYWwycGh5c2ljYWwgKHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkLCAmZGV2aWNlX2lkLCAmcGh5c2ljYWxfaWZfaWQpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBwaHlzaWNhbCBpZiBmcm9tIGxvZ2ljYWwgaWYgKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogY29uZmlndXJlIHRoZSByZWxhdGVkIGl3ZiB1cyBmbG93ICovCisgICAgICAgIHVzX2tleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICAgICAgdXNfa2V5LmdlbV9wb3J0X2lkID0gcF9mbG93LT5kYXRhLnN2Y19wb3J0X2lkOworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJnVzX2NmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdXNfa2V5KTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmdXNfY2ZnLCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkLCBwX2Zsb3ctPmRhdGEuc3ZjX3BvcnRfaWQpOworICAgICAgICBpZiAoQkNNT1NfVFJVRSA9PSBwX2Zsb3ctPmRhdGEucmVzb2x2ZV9tYWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJnVzX2NmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nLCBCQ01PU19UUlVFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJnVzX2NmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nLCBCQ01PU19GQUxTRSk7CisgICAgICAgIH0KKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmdXNfY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbiwgQkNNT0xUX1VTX1ZMQU5fQUNUSU9OX1RSQU5TUEFSRU5UKTsKKworICAgICAgICByYyA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJnVzX2NmZy5oZHIpOworICAgIH0KKworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICIlcyBGQUlMRUQsIHJjID0gJXMgKCVkKSwgZXJyX3RleHQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCByYywgdXNfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBAYnJpZWYgbWFwbGVfbWFjX3VzX2l3Zl9jZmdfcmVtb3ZlCisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcmVtb3ZlIGNvbmZpZ3VyYXRpb24gZnJvbSBNYXBsZSBvZiB0aGUgcmVsZXZhbnQgdXBzdHJlYW0gaXdmCisgKgorICogQHBhcmFtIHBfZmxvdyAgICAgICBBIHBvaW50ZXIgdG8gYSBmbG93IG9iamVjdAorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hcGxlX21hY191c19pd2ZfY2ZnX3JlbW92ZShiY21iYWxfZmxvd19jZmcgKnBfZmxvdykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgdXNfa2V5ID0ge307CisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIHVzX2NmZyA9IHt9OworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgdWludDMyX3QgcGh5c2ljYWxfaWZfaWQ7CisKKyAgICAvKiBjb25maWd1cmUgdGhlIHJlbGF0ZWQgaXdmIHVzIGZsb3cgKi8KKyAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfbG9naWNhbDJwaHlzaWNhbCAocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQsICZkZXZpY2VfaWQsICZwaHlzaWNhbF9pZl9pZCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgcGh5c2ljYWwgaWYgZnJvbSBsb2dpY2FsIGlmICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICB1c19rZXkucG9uX25pID0gcGh5c2ljYWxfaWZfaWQ7CisgICAgdXNfa2V5LmdlbV9wb3J0X2lkID0gcF9mbG93LT5kYXRhLnN2Y19wb3J0X2lkOworICAgIEJDTU9MVF9DRkdfSU5JVCgmdXNfY2ZnLCBncG9uX2l3Zl91c19mbG93LCB1c19rZXkpOworCisgICAgcmMgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJnVzX2NmZy5oZHIpOworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICIlcyBGQUlMRUQsIHJjID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisKKy8qKgorICogQGJyaWVmIG1hY191dGlsX3ZhbGlkYXRlX3N1YnNjcmliZXJfdGVybWluYWxfaW5mb19mb3JfZ3BvbgorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHZhbGlkYXRlIGFsbCBpbnB1dCBhdHRyaWJ1dGVzIHJlcXVpcmVkIGZvciBhIHN1YiB0ZXJtIHNldHRpbmcKKyAqIHJlY2VpdmVkIGZyb20gY29yZSBmb3IgR1BPTgorICoKKyAqIEBwYXJhbSBwX3N1Yl90ZXJtX3JlcSAgICAgICBBIHBvaW50ZXIgdG8gYSBzdWJzY3JpYmVyIHRlcm1pbmFsIG9iamVjdAorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfdmFsaWRhdGVfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmZvX2Zvcl9ncG9uKGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZyAqcF9zdWJfdGVybV9yZXEpCit7CisgICAgaWYoQkNNQkFMX1NUQVRFX1VQID09IHBfc3ViX3Rlcm1fcmVxLT5kYXRhLmFkbWluX3N0YXRlKQorICAgIHsKKyAgICAgICAgaWYgKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUIChwX3N1Yl90ZXJtX3JlcSwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgc2VyaWFsX251bWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQpLCAKKyAgICAgICAgICAgICAgICAgICAgIlNlcmlhbCBudW1iZXIgaXMgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIGZvciBhIGdwb24gc3Vic2NyaWJlciB0ZXJtaW5hbCwgYW5kIGl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTUFOREFUT1JZX1BBUk1fSVNfTUlTU0lORzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX3N1Yl90ZXJtX3JlcSwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcGFzc3dvcmQpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwgCisgICAgICAgICAgICAgICAgICAgICJQYXNzd29yZCBpcyBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgZm9yIGEgZ3BvbiBzdWJzY3JpYmVyIHRlcm1pbmFsLCBhbmQgaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9NQU5EQVRPUllfUEFSTV9JU19NSVNTSU5HOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyoqCisgKiBAYnJpZWYgQ29tbWFuZCBTZXQgc2V0dXAgcm91dGluZSBmb3Igc3Vic2NyaWJlciB0ZXJtaW5hbCBjb25uZWN0IHRvIG1hYyBhcHBsaWNhdGlvbiBmb3IgR1BPTgorICogCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHN1Yl90ZXJtX2ZzbSBpbiB0aGUgQkFMIGNvcmUgdG8gaW5pdGlhbGl6ZSB0aGUgY29tbWFuZAorICogc2V0IHRvIGNvbm5lY3QgdGhlIHN1YnNjcmliZXIgdGVybWluYWwgb2YgdGhlIG1hYyBhcHBsaWNhdGlvbi4gVGhlIGNtZHNldCBhY3R1YWxseSAKKyAqIGNvbnNpc3RzIG9mIHR3byBjb21tYW5kcywgb25lIGlzIHRvIHNlbmQgdGhlIHN1Yl90ZXJtIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbWFjCisgKiBBcHAgYW5kIGhhbmRsZSB0aGUgcmVsZXZhbnQgcmVzcG9uc2UsIHRoZSBvdGhlciBpcyB0byBoYW5kbGUgdGhlIGluZGljYXRpb24gbWVzc2FnZQorICogZnJvbSB0aGUgbWFjIEFQUCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLiAKKyAqIAorICogQHBhcmFtIHBfc3ViX3Rlcm1faW5zdCAgIEEgcG9pbnRlciB0byBhIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBvcF90eXBlICAgICAgICAgIFR5cGUgb2Ygb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCBvbiB0aGUgc3Vic2NyaWJlciB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIGlzX3Bvc3RfZGlzY292ZXJ5ICBVc2VkIGZvciBBREQsIGluZGljYXRlcyBpZiB0aGlzIGlzIGEgcmVxdWVzdCBhZnRlciBhIE9OVSBkaXNjb3ZlcnkKKyAqIAorICogQHJldHVybiBiY21vc19lcnJubyAKKyAqCisgKiBAbm90ZSB3ZSBjb25maWd1cmUgTWFwbGUgZm9yIE9OVSBpbiAyIHN0YWdlczoKKyAqICBcbGkgU3RhZ2UgMTogZG8gY2ZnX3NldCB3aXRoIHRoZSBzZXJpYWwgbnVtLCBwYXNzd29yZCwgb21jaSBwb3J0LCBhcyBwYXJ0IG9mIGZpcnN0IHN1Yl90ZXJtX3NldCBmcm9tIENvcmUKKyAqICBcbGkgU3RhZ2UgMjogc2V0IHRoZSBPTlUgc3RhdGUgdG8gQUNUSVZFIHVzaW5nIG9wZXJfc3VibWl0LCBhcyBwYXJ0IG9mIHNlY29uZCBzdWJfdGVybV9zZXQgZnJvbSBDb3JlIChhZnRlciAKKyAqICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nIGEgRGlzY292ZXJ5IGluZGljYXRpb24pCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX3N1YnNjcmliZXJfdGVybWluYWxfc2V0X2Zvcl9ncG9uKHN1Yl90ZXJtX2luc3QgKnBfc3ViX3Rlcm1faW5zdCwgYmFsX3V0aWxfb3Blcl9zdWJfdGVybSBvcF90eXBlLCBiY21vc19ib29sIGlzX3Bvc3RfZGlzY292ZXJ5KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZyAqcF9zdWJfdGVybV9yZXEgPSAmcF9zdWJfdGVybV9pbnN0LT5hcGlfcmVxX3N1Yl90ZXJtX2luZm87CisKKyAgICBkbworICAgIHsgCisgICAgICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgICAgIHVpbnQzMl90IHBoeXNpY2FsX2lmX2lkOworICAgICAgICAvKiBnZXQgcGh5c2ljYWwgaW50ZXJmYWNlIGZyb20gbG9naWNhbCBpbnRlcmZhY2UgKi8KKyAgICAgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X2xvZ2ljYWwycGh5c2ljYWwgKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCwgJmRldmljZV9pZCwgJnBoeXNpY2FsX2lmX2lkKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQpLCAKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgcGh5c2ljYWwgaWYgZnJvbSBsb2dpY2FsIGlmICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnID0ge307CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9jZmcgb251X2NmZ19nZXQgPSB7fTsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUgb3BlciA9IHt9OworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHt9OworICAgICAgICBiY21vbHRfb251X29wZXJhdGlvbiBuZXdfb251X3N0YXRlOworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmcgZ3Bvbl9vbnVfYXV0b19jZmcgPSB7fTsgIC8qIG1haW4gYXV0byBjZmcgYXBpIHN0cnVjdCAqLworCisgICAgICAgIC8qIHNldCB0aGUgb251IGtleSAtIHNldCBpdCB0byB0aGUgcGh5c2ljYWwgaWYgaWQgKi8KKyAgICAgICAga2V5LnBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOworICAgICAgICBrZXkub251X2lkID0gcF9zdWJfdGVybV9yZXEtPmtleS5zdWJfdGVybV9pZDsKKworICAgICAgICAvKiBzZXQgdGhlIG9udSBrZXkgKi8KKyAgICAgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworCisgICAgICAgLyogaW52b2tlIG9udSBzdGF0ZSBjaGFuZ2Ugb3BlcmF0aW9uIHRvIHRoZSBuZXcgc3RhdGUgKi8KKyAgICAgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisKKyAgICAgICAgaWYoQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9DTEVBUiA9PSBvcF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBEZWxldGUgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIE9OVSAqLworICAgICAgICAgICAgcmMgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCksIAorICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjbGVhciBvbnUgY29uZmlndXJhdGlvbiglcylcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTm8gaW5kaWNhdGlvbiBmcm9tIE1hcGxlIHdpbGwgcmVzdWx0IGZyb20gdGhlIGNsZWFyIG9wZXJhdGlvbgorICAgICAgICAgICAgICogc28gZmFrZSBpdCBoZXJlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1hY191dGlsX3JlcG9ydF9zdWJfdGVybV9ldmVudChwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdWJfdGVybV9yZXEtPmtleS5zdWJfdGVybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmNtb2x0X3NlcmlhbF9udW1iZXIgKilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQ0xFQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMsIHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ19VVElMX0RFQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FLCBCQ01CQUxfSU5WQUxJRF9UVU5ORUxfSUQpOworCisgICAgICAgICAgICAvKiBObyBmdXJ0aGVyIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQgZm9yIHRoZSBDTEVBUiBvcGVyYXRpb24gKi8KKyAgICAgICAgICAgIGJyZWFrOworIAorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihCQUxfVVRJTF9PUEVSX1NVQl9URVJNX0FERCA9PSBvcF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmaXJzdCBkbyBhIGdldCwgdG8gc2VlIGlmIG9udSBpcyBpbiBhY3RpdmUgc3RhdGUgYWxyZWFkeSAqLworICAgICAgICAgICAgQkNNT0xUX0NGR19JTklUKCZvbnVfY2ZnX2dldCwgZ3Bvbl9vbnUsIGtleSk7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZvbnVfY2ZnX2dldCwgZ3Bvbl9vbnUsIG9udV9zdGF0ZSk7CisgICAgICAgICAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJm9udV9jZmdfZ2V0Lmhkcik7CisgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCBvbnUgY29uZmlndXJhdGlvbiglcyksIGVycl90ZXh0PSVzLCAuLi4gY29udGludWUgdG8gY29uZmlndXJlXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwgb251X2NmZ19nZXQuaGRyLmhkci5lcnJfdGV4dCk7CisKKyAgICAgICAgICAgICAgICAvKiBkb24ndCBicmVhaywgYnV0IGNvbnRpbnVlIHdpdGggdGhlIHNldCBhbnl3YXlzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogT05VIHN0YXRlID0gJWQsIFtwb25fbmk9JWQsIG9udV9pZD0lZF0sIEJFRk9SRSBkb2luZyBjZmdfc2V0IG9uIE1hcGxlXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9udV9jZmdfZ2V0LmRhdGEub251X3N0YXRlLCBvbnVfY2ZnX2dldC5rZXkucG9uX25pLCBvbnVfY2ZnX2dldC5rZXkub251X2lkKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoKEJDTV9FUlJfT0sgPT0gcmMpICYmIChCQ01PTFRfT05VX1NUQVRFX0FDVElWRSA9PSBvbnVfY2ZnX2dldC5kYXRhLm9udV9zdGF0ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IE9OVSBhbHJlYWR5IGluIGFjdGl2ZSBzdGF0ZSBkdXJpbmcgQURELiBTa2lwcGluZyBmdXJ0aGVyIGNvbmZpZ1xuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgICAgICAgICAgbWFjX3V0aWxfcmVwb3J0X3N1Yl90ZXJtX2V2ZW50KHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3ViX3Rlcm1fcmVxLT5rZXkuc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmNtb2x0X3NlcmlhbF9udW1iZXIgKilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9BREQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYywgcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FLCBCQ01CQUxfSU5WQUxJRF9UVU5ORUxfSUQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qIHNldCB0aGUgIHNuICYgcGFzc3dvcmQgb25seSBpZiBpdCBiZWluZyBjb25maWd1cmVkIGZvciB0aGUgZmlyc3QgdGltZSAqLworICAgICAgICAgICAgaWYgKEJDTU9TX0ZBTFNFID09IGlzX3Bvc3RfZGlzY292ZXJ5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoYmNtb2x0X3NlcmlhbF9udW1iZXIgKikmcF9zdWJfdGVybV9yZXEtPmRhdGEuc2VyaWFsX251bWJlcikpOworCisgICAgICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcGFzc3dvcmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoYmNtb2x0X2Fycl91OF8xMCAqKSZwX3N1Yl90ZXJtX3JlcS0+ZGF0YS5wYXNzd29yZCkpOworCisgICAgICAgICAgICAgICAgLyogc2V0IHRoZSBvbnUgY29uZmlndXJhdGlvbiAqLworICAgICAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGF1dG9fcGFzc3dvcmRfbGVhcm5pbmcsIEJDTU9TX1RSVUUpOworICAgICAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHVzX2ZlYywgQkNNT1NfRkFMU0UpOworCisgICAgICAgICAgICAgICAgLyogc2V0IHRoZSBvbnUgbWFuYWdlbWVudCBjaGFubmVsIHBvcnQgKi8KKyAgICAgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWQsIHBfc3ViX3Rlcm1fcmVxLT5kYXRhLnN2Y19wb3J0X2lkKTsKKyAKKworICAgICAgICAgICAgICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgb251IGNvbmZpZ3VyYXRpb24oJXMpLCBlcnJfdGV4dD0lc1xuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIEBub3RlIElmIHRoaXMgaXMgZmlyc3QgdGltZSBzZXQgZm9yIEFERCwgdGhlbiBza2lwIHNldHRpbmcgdGhlIE9OVSBzdGF0ZSBmb3Igbm93LiAKKyAgICAgICAgICAgICAgICAgKiBXYWl0IHVudGlsIE9OVSBEaXNjb3ZlcnkgaXMgcmVjZWl2ZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLyogdHVybiBvZmYgdGhlIGF1dG8gaW5kaWNhdGlvbiBtZXNzYWdlcyBmb3IgZ3Bvbl9vbnUucmVpICovCisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmZ3Bvbl9vbnVfYXV0b19jZmcsIGdwb25fb251LCBrZXkpOworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZncG9uX29udV9hdXRvX2NmZywgZ3Bvbl9vbnUsIHJlaSwgQkNNT1NfRkFMU0UpOworICAgICAgICAgICAgcmMgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmdwb25fb251X2F1dG9fY2ZnLmhkcik7CisgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAiYmNtb2x0X2F1dG9fY2ZnX3NldCBmb3IgZ3Bvbl9vbnUucmVpICBGYWlsZWQgKCVzKSwgZXJyX3RleHQ9JXMpXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwgZ3Bvbl9vbnVfYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisKKyAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIG5vdCBmYXRhbCwgc28ganVzdCBjb250aW51ZSBhbnl3YXkgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgbmV3IG9udSBzdGF0ZSBmb3IgdGhlIEFERCBvcGVyYXRpb24KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nIE9OVSBzdGF0ZSB0byBhY3RpdmVcbiIpOworCisgICAgICAgICAgICBuZXdfb251X3N0YXRlID0gQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFOyAKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChCQUxfVVRJTF9PUEVSX1NVQl9URVJNX1JFTU9WRSA9PSBvcF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiB0aGUgT05VIGlzIG5vdCBwcmVzZW50LCB0aGVuIGl0IHdpbGwgbmV2ZXIgcmVzcG9uZCB0byB0aGUgZGVhY3RpdmF0ZSBjb21tYW5kCisgICAgICAgICAgICAgKiB3aXRoIGFuIGluZGljYXRpb24sIHNvIGp1c3QgYWxsb3cgdGhlIEZTTSB0byBjb250aW51ZSBhcyBpZiBpdCBkaWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKEJDTUJBTF9TVEFUVVNfTk9UX1BSRVNFTlQgIT0gcF9zdWJfdGVybV9pbnN0LT5jdXJyZW50X3N1Yl90ZXJtX2luZm8uZGF0YS5vcGVyX3N0YXR1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgbmV3IG9udSBzdGF0ZSBmb3IgdGhlIFJFTU9WRSBvcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nIE9OVSBzdGF0ZSB0byBJTi1hY3RpdmVcbiIpOworCisgICAgICAgICAgICAgICAgbmV3X29udV9zdGF0ZSA9IEJDTU9MVF9PTlVfT1BFUkFUSU9OX0lOQUNUSVZFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwgIkJhZCByZXF1ZXN0IGZyb20gY29yZVxuIik7IAorICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBEbyBvcGVyX3N1Ym1pdCB0byBzZXQgdGhlIE9OVSBzdGF0ZSAqLworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgbmV3X29udV9zdGF0ZSk7CisgICAgICAgIHJjID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQpLCAKKyAgICAgICAgICAgICAgICAgICAgImJjbW9sdF9vcGVyX3N1Ym1pdCBGYWlsZWQgZm9yIG9udSBzdGF0ZSAgRmFpbGVkICglcyksIGVycl90ZXh0PSVzXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCAmKG9wZXIuaGRyLmhkci5lcnJfdGV4dFswXSkpOworICAgICAgICB9CisKKworICAgICAgICAvKiBJZiB0aGUgT05VIGlzIG5vdCBwcmVzZW50LCB0aGVuIGl0IHdpbGwgbmV2ZXIgcmVzcG9uZCB0byB0aGUgZGVhY3RpdmF0ZSBjb21tYW5kCisgICAgICAgICAqIHdpdGggYW4gaW5kaWNhdGlvbiwgc28ganVzdCBhbGxvdyB0aGUgRlNNIHRvIGNvbnRpbnVlIGFzIGlmIGl0IGRpZC4KKyAgICAgICAgICovCisgICAgICAgIGlmKChCQ01PTFRfT05VX09QRVJBVElPTl9JTkFDVElWRSA9PSBuZXdfb251X3N0YXRlKSAmJgorICAgICAgICAgICAoQkNNQkFMX1NUQVRVU19OT1RfUFJFU0VOVCA9PSBwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mby5kYXRhLm9wZXJfc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWFjX3V0aWxfcmVwb3J0X3N1Yl90ZXJtX2V2ZW50KHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N1Yl90ZXJtX3JlcS0+a2V5LnN1Yl90ZXJtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiY21vbHRfc2VyaWFsX251bWJlciAqKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9SRU1PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMsIHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ19VVElMX0RFQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FLCBCQ01CQUxfSU5WQUxJRF9UVU5ORUxfSUQpOworICAgICAgICB9CisKKyAgICB9IHdoaWxlICgwKTsKKworCisKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9TVEFURSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCksIAorICAgICAgICAgICAgICAgICIlcyBmYWlsZWQgdG8gc2V0IHN0YXRlLCBwb3NzaWJseSBiZWNhdXNlIGludGVyZmFjZSBpcyBub3QgY29uZmlndXJlZCB5ZXQsIHBvbiBmaWJlciBkaXNjb25uZWN0LCBvciBvbnUgZGlzY29ubmVjdDogcmMgPSAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICB9CisgICAgZWxzZSBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQpLCAKKyAgICAgICAgICAgICAgICAiJXMgRmFpbGVkOiByYyA9ICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiB2YWxpZGF0ZV9mbG93X2luZm8gZm9yIGdwb24KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byB2YWxpZGF0ZSBhbGwgaW5wdXQgYXR0cmlidXRlcyByZXF1aXJlZCBmb3IgYSBmbG93CisgKiBzZXR0aW5nIHJlY2VpdmVkIGZyb20gY29yZSBmb3IgR1BPTgorICoKKyAqIEBwYXJhbSBwX2Zsb3dfcmVxICAgICBBIHBvaW50ZXIgdG8gYSBmbG93IG9iamVjdAorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfdmFsaWRhdGVfZmxvd19pbmZvX2Zvcl9ncG9uIChjb25zdCBiY21iYWxfZmxvd19jZmcgKnBfZmxvd19yZXEpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIG1hY191dGlsX3RvcG9fcG9uX2NvbnRleHQgKnRvcG9fY29udGV4dDsKKworICAgIHRvcG9fY29udGV4dCA9IGJjbV90b3BvX3Bvbl9nZXRfY29udGV4dChwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQsIEJDTV9UT1BPX1BPTl9DT05URVhUX0lEX01BQ19VVElMKTsKKyAgICBpZiAoKEJDTV9FUlJfT0sgPT0gcmMpICYmIChCQ01PTFRfSVdGX01PREVfUEVSX0ZMT1dfTU9ERSA9PSB0b3BvX2NvbnRleHQtPml3Zl9tb2RlKSkKKyAgICB7CisgICAgICAgIGlmIChCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJihwX2Zsb3dfcmVxLT5kYXRhLmNsYXNzaWZpZXIpLCBjbGFzc2lmaWVyLCBvX3ZpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGlmIHRoZSBmbG93IGhhcyBhbiBhY3Rpb24gdG8gcmVtb3ZlIHRoZSBvdXRlciB0YWcgZnJvbSBhIGRvdWJsZSB0YWdnZWQgT0xUIGRvd25zdHJlYW0gcGFja2V0cywKKyAgICAgICAgICAgICAgIHRoZSBvdXRlciB0YWcgd2lsbCBiZSByZW1vdmVkIGJ5IHRoZSBTV0lUQ0ggaW4gZnJvbnQgb2YgdGhlIE1BQywgdGhlIE1BQyBzaG91bGQgdGFrZSB0aGUgaW5uZXIKKyAgICAgICAgICAgICAgIHRhZyB2aWQgZm9yIEdFTSBkZWNpc2lvbi4gIFNlcC0yOC0yMDE1IElMCisgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKEJDTU9TX1RSVUUgPT0gbWFjX3V0aWxfY2hlY2tfZmxvd19pc19kb3VibGVfdGFnX3JlbW92ZV9vX3RhZyAocF9mbG93X3JlcSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEJDTU9TX1RSVUUgIT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmKHBfZmxvd19yZXEtPmRhdGEuY2xhc3NpZmllciksIGNsYXNzaWZpZXIsIGlfdmlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzaWZpZXIgaV92aWQgaWQgaXMgYSBtYW5kYXRvcnkgZG93bnN0cmVhbSBwYXJhbWV0ZXIgZm9yIGRvdWJsZSB0YWdnZWQgYWN0aW9uLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBpdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX01BTkRBVE9SWV9QQVJNX0lTX01JU1NJTkc7CisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQpLCAKKyAgICAgICAgICAgICAgICAgICAgIm9fdmlkIGlkIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciBmb3IgYSBmbG93IGNsYXNzaWZpZXIsIGFuZCBpdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9NQU5EQVRPUllfUEFSTV9JU19NSVNTSU5HOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBfZmxvd19yZXEtPmtleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSkKKyAgICB7CisgICAgICAgIGlmICghQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3dfcmVxLCBmbG93LCBhZ2dfcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQpLCAKKyAgICAgICAgICAgICAgICAgICAgImFnZyBwb3J0IGlkIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciBmb3IgYW4gVVMgZmxvdywgYW5kIGl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX01BTkRBVE9SWV9QQVJNX0lTX01JU1NJTkc7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiBmbG93IHNldCBmb3IgR1BPTgorICoKKyAqIEBwYXJhbSBwX2Zsb3dfcmVxICAgIHBvaW50ZXIgdG8gZmxvdyByZXF1ZXN0IHN0cnVjdHVyZSBmcm9tIGNvcmUKKyAqIEBwYXJhbSBvcF90eXBlICAgICAgIEFERCwgUkVNT1ZFIG9yIENMRUFSCisgKiBAcGFyYW0gcF9mbG93X2NvcmUgICBsb2NhbCBEQiBmbG93IGNvbnRleHQgcGFzc2VkIGFzIGEgY29va2llCisgKgorICogQHJldHVybiBlcnJubyAgICBlcnJvcgorICovCitiY21vc19lcnJubyBtYWNfdXRpbF9mbG93X3NldF9mb3JfZ3BvbiAoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxLCBiYWxfdXRpbF9vcGVyX2Zsb3cgb3BfdHlwZSwgZmxvd19pbnN0ICpwX2Zsb3dfY29yZSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBiY21vc19ib29sIGlzX3BiaXRfZW5hYmxlZCA9IEJDTU9TX0ZBTFNFOworICAgIHVpbnQxNl90IHBlcl9mbG93X21vZGVfdmxhbl9pZCA9IDA7IC8qIGhvbGQgdGhlIHZhbHVlIG9mIHRoZSB2bGFuIHRhZyB0byB1c2UgaW4gcGVyLWZsb3cgbW9kZSAqLworICAgIHVpbnQ4X3QgcGJpdHNfdmFsID0gMDsKKyAgICBtYWNfdXRpbF90b3BvX3Bvbl9jb250ZXh0ICp0b3BvX2NvbnRleHQ7CisgICAgZmxvd19saXN0X2VudHJ5ICpwX21hY191dGlsX2Zsb3dfZW50cnkgPSBOVUxMOworCisgICAgdG9wb19jb250ZXh0ID0gYmNtX3RvcG9fcG9uX2dldF9jb250ZXh0KHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCwgQkNNX1RPUE9fUE9OX0NPTlRFWFRfSURfTUFDX1VUSUwpOworICAgIGlmIChCQ01PTFRfSVdGX01PREVfUEVSX0ZMT1dfTU9ERSA9PSB0b3BvX2NvbnRleHQtPml3Zl9tb2RlKQorICAgIHsKKyAgICAgICAgcGVyX2Zsb3dfbW9kZV92bGFuX2lkID0gMDsgLyogc2V0IHRvIGRlZmF1bHQgKi8KKworICAgICAgICBpZiAoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCYocF9mbG93X3JlcS0+ZGF0YS5jbGFzc2lmaWVyKSwgY2xhc3NpZmllciwgb192aWQpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiB0aGUgZmxvdyBoYXMgYW4gYWN0aW9uIHRvIHJlbW92ZSB0aGUgb3V0ZXIgdGFnIGZyb20gYSBkb3VibGUgdGFnZ2VkIE9MVCBkb3duc3RyZWFtIHBhY2tldHMsCisgICAgICAgICAgICAgICB0aGUgb3V0ZXIgdGFnIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgU1dJVENIIGluIGZyb250IG9mIHRoZSBNQUMsIHRoZSBNQUMgc2hvdWxkIHRha2UgdGhlIGlubmVyCisgICAgICAgICAgICAgICB0YWcgdmlkIGZvciBHRU0gZGVjaXNpb24uICBTZXAtMjgtMjAxNSBJTAorICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChCQ01PU19UUlVFID09IG1hY191dGlsX2NoZWNrX2Zsb3dfaXNfZG91YmxlX3RhZ19yZW1vdmVfb190YWcgKHBfZmxvd19yZXEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJihwX2Zsb3dfcmVxLT5kYXRhLmNsYXNzaWZpZXIpLCBjbGFzc2lmaWVyLCBpX3ZpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwZXJfZmxvd19tb2RlX3ZsYW5faWQgPSBwX2Zsb3dfcmVxLT5kYXRhLmNsYXNzaWZpZXIuaV92aWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vZWxzZSBzaG91bGQgbm90IGhhcHBlbiBoZXJlIHJlYWxseSwgc2luY2UgdGhpcyB3YXMgdmFsaWRhdGVkIGluIGEgcHJldmlvdXMgc3RlcAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBlcl9mbG93X21vZGVfdmxhbl9pZCA9IHBfZmxvd19yZXEtPmRhdGEuY2xhc3NpZmllci5vX3ZpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL2Vsc2Ugc2hvdWxkIG5vdCBoYXBwZW4gaGVyZSByZWFsbHksIHNpbmNlIHRoaXMgd2FzIHZhbGlkYXRlZCBpbiBhIHByZXZpb3VzIHN0ZXAKKyAgICB9CisKKworICAgIC8qIENoZWNrIHRoZSBvcGVyYXRpb24gaWQgKi8KKyAgICBpZiAoKEJBTF9VVElMX09QRVJfRkxPV19BREQgIT0gb3BfdHlwZSkgICAgJiYgCisgICAgICAgIChCQUxfVVRJTF9PUEVSX0ZMT1dfUkVNT1ZFICE9IG9wX3R5cGUpICYmIAorICAgICAgICAoQkFMX1VUSUxfT1BFUl9GTE9XX0NMRUFSICE9IG9wX3R5cGUpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgbWFjX3V0aWwgZmxvdyBvcGVyYXRpb24gJWQgXG4iLCBvcF90eXBlKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBmbG93IEFkZCBvciBNb2RpZnkgKi8KKyAgICBpZiAoQkFMX1VUSUxfT1BFUl9GTE9XX0FERCA9PSBvcF90eXBlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChwX2Zsb3dfcmVxLT5rZXkuZmxvd190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB1bmljYXN0IGZsb3dzICovCisgICAgICAgICAgICBjYXNlIEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU06CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocF9mbG93X3JlcS0+ZGF0YS5jbGFzc2lmaWVyLm9fcGJpdHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBvX3BiaXRzICBjYW4gb25seSB0YWtlIG9uZSBwLWJpdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICBwYml0c192YWwgPSBwX2Zsb3dfcmVxLT5kYXRhLmNsYXNzaWZpZXIub19wYml0czsKKyAgICAgICAgICAgICAgICAgICAgaXNfcGJpdF9lbmFibGVkID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGJpdHNfdmFsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaXNfcGJpdF9lbmFibGVkID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogY3JlYXRlIGEgZ2VtIHBvcnQgaWQgYW5kIHJlbGV2YW50IGZsb3cgZm9yIGEgc2luZ2xlIHBiaXQsIG9yIHdpdGggbm8gcGJpdCAqLworICAgICAgICAgICAgICAgIC8qIHBhc3Mgb24gdGhlIG9wIHR5cGUgYWxzbyB0byBzcGVjaWZ5IGlmIGl0IGlzIEZMT1dfQUREIE9SIEZMT1dfTU9ESUZZICovCisgICAgICAgICAgICAgICAgcmMgPSBtYXBsZV9tYWNfdW5pY2FzdF9mbG93X2FkZChwX2Zsb3dfcmVxLCBwYml0c192YWwsIHBlcl9mbG93X21vZGVfdmxhbl9pZCwgb3BfdHlwZSwgJnBfbWFjX3V0aWxfZmxvd19lbnRyeSk7CisgICAgICAgICAgICAgICAgaWYgKChCQ01fRVJSX09LICE9IHJjKSB8fCAoTlVMTCA9PSBwX21hY191dGlsX2Zsb3dfZW50cnkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvKiBjb25maWd1cmUgaXdmIGZsb3dzIGluIGNhc2Ugb2YgcGVyIGZsb3cgaW50ZXJ3b3JraW5nIG1vZGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoQkNNT0xUX0lXRl9NT0RFX1BFUl9GTE9XX01PREUgPT0gdG9wb19jb250ZXh0LT5pd2ZfbW9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU0gPT0gcF9mbG93X3JlcS0+a2V5LmZsb3dfdHlwZSkgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gbWFwbGVfbWFjX2RzX2l3Zl9jZmcocF9mbG93X3JlcSwgcGVyX2Zsb3dfbW9kZV92bGFuX2lkLCBpc19wYml0X2VuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZMT1dfVFlQRV9VUFNUUkVBTSAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IG1hcGxlX21hY191c19pd2ZfY2ZnKHBfZmxvd19yZXEsIHBiaXRzX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhZGQgaXdmIGZsb3dzIGluIHBlciBmbG93IG1vZGUgKCVzKSlcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBtYXJrIGZsb3cgY29uZmlndXJhdGlvbiB0byBkZXZpY2UgY29tcGxldGVkICovCisgICAgICAgICAgICAgICAgbWFjX3V0aWxfbWFya19mbG93X2NvbmZpZ19jb21wbGV0ZShwX21hY191dGlsX2Zsb3dfZW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0ZMT1dfVFlQRV9CUk9BRENBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBtYXBsZV9tYWNfYnJvYWRjYXN0X2Zsb3dfYWRkKHBfZmxvd19yZXEsIHBlcl9mbG93X21vZGVfdmxhbl9pZCwgb3BfdHlwZSwgJnBfbWFjX3V0aWxfZmxvd19lbnRyeSk7CisgICAgICAgICAgICAgICAgaWYgKChCQ01fRVJSX09LICE9IHJjKSB8fCAoTlVMTCA9PSBwX21hY191dGlsX2Zsb3dfZW50cnkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBmbG93IHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcmVxLT5rZXkuZmxvd190eXBlKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoQkFMX1VUSUxfT1BFUl9GTE9XX1JFTU9WRSA9PSBvcF90eXBlKSB8fAorICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX0ZMT1dfQ0xFQVIgPT0gb3BfdHlwZSkpCisgICAgeworICAgICAgICAvKiBmaW5kIHRoZSBmbG93ICovCisgICAgICAgIHBfbWFjX3V0aWxfZmxvd19lbnRyeSA9IF9tYWNfdXRpbF9kYl9mbG93X2dldF93X2Zsb3dfa2V5KHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCwgJihwX2Zsb3dfcmVxLT5rZXkpKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gcF9tYWNfdXRpbF9mbG93X2VudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICBpZiAoQkFMX1VUSUxfT1BFUl9GTE9XX0NMRUFSICE9IG9wX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgICAgICIlczogTlVMTCBtYWMgdXRpbCBmbG93IGVudHJ5IHRvIHJlbW92ZTogZmxvdyBpZDogJWQsIGZsb3dfdHlwZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgcF9mbG93X3JlcS0+a2V5LmZsb3dfaWQsCisgICAgICAgICAgICAgICAgICAgIChwX2Zsb3dfcmVxLT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPyAidXAiOiJkb3duIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHBfZmxvd19yZXEtPmtleS5mbG93X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHVuaWNhc3QgZmxvd3MgKi8KKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTToKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEZpcnN0IERlLWNvbmZpZ3VyZSBJV0YgZmxvd3MgaW4gY2FzZSBvZiBwZXIgZmxvdyBpbnRlcndvcmtpbmcgbW9kZSAqLworICAgICAgICAgICAgICAgIGlmIChCQ01PTFRfSVdGX01PREVfUEVSX0ZMT1dfTU9ERSA9PSB0b3BvX2NvbnRleHQtPml3Zl9tb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSA9PSBwX2Zsb3dfcmVxLT5rZXkuZmxvd190eXBlKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBtYXBsZV9tYWNfZHNfaXdmX2NmZ19yZW1vdmUocF9mbG93X3JlcSwgcGVyX2Zsb3dfbW9kZV92bGFuX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gbWFwbGVfbWFjX3VzX2l3Zl9jZmdfcmVtb3ZlKHBfZmxvd19yZXEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVtb3ZlIGl3ZiBmbG93cyBpbiBwZXIgZmxvdyBtb2RlICglcykpXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvKiogVGhlbiByZW1vdmUgdW5pY2FzdCBHRU0vQWxsb2MgSWQgZnJvbSBNYXBsZSBhbmQgZmxvdyBlbnRyeSBmcm9tIGxvY2FsIGRhdGFiYXNlICovCisgICAgICAgICAgICAgICAgcmMgPSBtYXBsZV9tYWNfdW5pY2FzdF9mbG93X3JlbW92ZShwX2Zsb3dfcmVxLCBvcF90eXBlLCBwX21hY191dGlsX2Zsb3dfZW50cnkpOworICAgICAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogbWFyayBmbG93IERlLWNvbmZpZ3VyYXRpb24gdG8gZGV2aWNlIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgIG1hY191dGlsX21hcmtfZmxvd19jb25maWdfY29tcGxldGUocF9tYWNfdXRpbF9mbG93X2VudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEJDTUJBTF9GTE9XX1RZUEVfQlJPQURDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gbWFwbGVfbWFjX2Jyb2FkY2FzdF9mbG93X3JlbW92ZShwX2Zsb3dfcmVxLCBwZXJfZmxvd19tb2RlX3ZsYW5faWQsIG9wX3R5cGUsIHBfbWFjX3V0aWxfZmxvd19lbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBmbG93IHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcmVxLT5rZXkuZmxvd190eXBlKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfSAKKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwgCisgICAgICAgICAgICAgICAgIlVua25vd24gZmxvdyBvcCB0eXBlICVkIGZvciBmbG93IGlkL3R5cGUgPSAlZC8lZFxuIiwKKyAgICAgICAgICAgICAgICBvcF90eXBlLCBwX2Zsb3dfcmVxLT5rZXkuZmxvd19pZCwgcF9mbG93X3JlcS0+a2V5LmZsb3dfdHlwZSk7CisgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgIH0KKworZXhpdDoKKyAgICBpZiAoQkNNX0VSUl9PSyA9PSByYykKKyAgICB7CisgICAgICAgIC8qIAorICAgICAgICAgKiBDaGVjayBmbG93IGVudHJ5IGZsYWdzIHRvIHNlZSBpZiBhbiBpbmRpY2F0aW9uIHRvIENvcmUgc2hvdWxkIGJlIHRyaWdnZXJlZCBpbW1lZGlhdGVseToKKyAgICAgICAgICogIChTcGVjaWFsIGhhbmRsaW5nIGZvciBmbG93IGNvbmZpZ3VyYXRpb24sIGZvciB0aGUgY2FzZSBubyBkZXZpY2UgY29uZmlndXJhdGlvbiBpcyBuZWVkZWQsIAorICAgICAgICAgKiAgYW5kL29yIG5vIGluZGljYXRpb24gZnJvbSBkZXZpY2UgaXMgZXhwZWN0ZWQgLSBjb3VsZCBiZSB0aGUgY2FzZSBvZiBhIHNpbmdsZS9tdWx0aXBsZSAKKyAgICAgICAgICogIGdlbSBwb3J0cyB1c2VkIGZvciB1cyBhbmQgZHMsIGFuZCB1cyB3YXMgYWxyZWFkeSBjb25maWd1cmVkLgorICAgICAgICAgKiAgLSBzZW5kIHRoZSBmbG93IGluZCBpbW1lZGlhdGVseSAKKyAgICAgICAgICovCisgICAgICAgIGNoZWNrX3NlbmRfZmxvd19iYWxfaW5kX21zZyhwX21hY191dGlsX2Zsb3dfZW50cnksIEJDTV9FUlJfT0ssIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICgoQkNNX0VSUl9OT0VOVCA9PSByYykgJiYgKEJBTF9VVElMX09QRVJfRkxPV19DTEVBUiA9PSBvcF90eXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZvciBmbG93IENMRUFSLCBhbmQgaWYgbm8gZmxvdyBlbnRyeSBpcyBmb3VuZCwgdGhlbiBmYWtlIGFuIGluZGljYXRpb24gc3VjY2VzcyB0byBDb3JlLAorICAgICAgICAgICAgICogZm9yIGl0IHRvIGV4ZWN1dGUgdGhlIGZsb3cgc3RhdGUgbWFjaGluZS4KKyAgICAgICAgICAgICAqIFRoZSByZWFzb25zIGZvciBmbG93IGVudHJ5IG5vdCBmb3VuZCBjb3VsZCBiZSBiZWNhdXNlIHRoZSBmbG93IHdhcyBhbHJlYWR5IGFkbWluLWVkIERvd24uCisgICAgICAgICAgICAgKiBBZG1pbi1kb3duIG9mIGEgZmxvdyBjYXVzZXMgbWFjIHV0aWwgdG8gY2xlYXIgZmxvdyBjb25maWcgYW5kIGZsb3cgaW5zdGFuY2UgZnJvbSBpdHNlbGYKKyAgICAgICAgICAgICAqIGFuZCB0aGUgbWFwbGUgSFcuIEhvd2V2ZXIsIENvcmUgRlNNIHN0aWxsIGtlZXBzIGl0J3MgZmxvdyBpbnN0YW5jZSBkdXJpbmcgYWRtaW4gZG93biBzdGF0ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfcmVtb3ZlX3N1Y2Nlc3MgKHBfZmxvd19yZXEtPmtleSwgcF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkLCBvcF90eXBlKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvL2Vsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyBjb25maWcsIGp1c3QgcmV0dXJuIGEgZmFpbHVyZTsgbm8gbmVlZCB0byBzZW5kIGJhY2sgaW5kaWNhdGlvbiBmb3IgdGhhdC4KKworCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyBtYXBsZV9ncG9uX21hY19jaGVja19nZW1fcG9ydF9pZCh1aW50MzJfdCBpZl9pZCwgdWludDMyX3Qgb251X2lkLCB1aW50MTZfdCBzdmNfcG9ydF9pZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfYm9vbCAqaXNfY29uZmlndXJlZCwgYmNtb3NfYm9vbCAqaXNfYWN0aXZhdGVkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgZ2VtX2tleSA9IHt9OworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZyBnZW1fY2ZnID0ge307CisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9pZl9pZDsKKyAgICAKKyAgICBHRVRfREVWSUNFX0lEX0FORF9QSFlTSUNBTF9JRF9GUk9NX0lGX0lEKGlmX2lkLCBkZXZpY2VfaWQsIHBoeXNpY2FsX2lmX2lkKTsKKyAgICAKKyAgICAvKiBzZXQgdGhlIGdlbSBwb3J0IG9iamVjdCBrZXkgKi8KKyAgICBnZW1fa2V5LnBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOworICAgIGdlbV9rZXkuZ2VtX3BvcnRfaWQgPSBzdmNfcG9ydF9pZDsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmdlbV9jZmcsIGdwb25fZ2VtX3BvcnQsIGdlbV9rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmdlbV9jZmcsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmdlbV9jZmcuaGRyKTsKKyAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGlmX2lkKSwKKyAgICAgICAgICAgICIlcyBGQUlMRUQgaW4gYmNtb2x0X2NmZ19nZXQ6IHN2Y19wb3J0X2lkID0gJWQgaWZfaWQgPSAlZCBvbnVfaWQgPSAlZFxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIHN2Y19wb3J0X2lkLCBpZl9pZCwgb251X2lkKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgCisgICAgCisgICAgLyogbWF5IGJlIGNvbmZpZ3VyZWQ7IGRvZXMgZ2VtIGJlbG9uZyB0byBzYW1lIG9udSA/ICovCisgICAgaWYgKEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX05PVF9DT05GSUdVUkVEICE9IGdlbV9jZmcuZGF0YS5nZW1fcG9ydF9zdGF0ZSAmJiBvbnVfaWQgIT0gZ2VtX2NmZy5kYXRhLm9udV9pZCkKKyAgICB7CQorICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaWZfaWQpLAorICAgICAgICAgICAgIiVzIEZBSUxFRCwgb251IGlkIG1pc21hdGNoOiBzdmNfcG9ydF9pZCA9ICVkIGlmX2lkID0gJWQgaXMgYWxyZWFkeSBhc3NpZ25lZCB0byBvbnVfaWQgPSAlZCAobm90IHRvIG9udSBpZCAlZCkgXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgc3ZjX3BvcnRfaWQsIGlmX2lkLCBnZW1fY2ZnLmRhdGEub251X2lkLCBvbnVfaWQpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgKmlzX2NvbmZpZ3VyZWQgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRCAhPSBnZW1fY2ZnLmRhdGEuZ2VtX3BvcnRfc3RhdGU7CisgICAgKmlzX2FjdGl2YXRlZCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0FDVElWRSA9PSBnZW1fY2ZnLmRhdGEuZ2VtX3BvcnRfc3RhdGU7CisgICAgCisgICAgcmV0dXJuIHJjOworfQorCisKK2JjbW9zX2Vycm5vIG1hcGxlX2dwb25fZ2VtX3BvcnRfaWRfYWRkKHVpbnQzMl90IGlmX2lkLCB1aW50MTZfdCBzdmNfcG9ydF9pZCwgdWludDMyX3Qgb251X2lkLCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiAqY29uZmlndXJhdGlvbikKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGdlbV9rZXkgPSB7fTsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgZ2VtX2NmZyA9IHt9OworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgdWludDMyX3QgcGh5c2ljYWxfaWZfaWQ7CisKKyAgICBHRVRfREVWSUNFX0lEX0FORF9QSFlTSUNBTF9JRF9GUk9NX0lGX0lEKGlmX2lkLCBkZXZpY2VfaWQsIHBoeXNpY2FsX2lmX2lkKTsKKworICAgIC8qIHNldCB0aGUgZ2VtIHBvcnQgb2JqZWN0IGtleSAqLworICAgIGdlbV9rZXkucG9uX25pID0gcGh5c2ljYWxfaWZfaWQ7CisgICAgZ2VtX2tleS5nZW1fcG9ydF9pZCA9IHN2Y19wb3J0X2lkOworICAgIEJDTU9MVF9DRkdfSU5JVCgmZ2VtX2NmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX2tleSk7CisKKyAgICAvKiBzZXQgdGhlIGdlbSBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBpZiAob251X2lkIDwgTUFDX1VUSUxfRFVNTVlfT05VX0lEX0ZPUl9NVUxUSUNBU1RfR0VNKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmZ2VtX2NmZywgZ3Bvbl9nZW1fcG9ydCwgb251X2lkLCBvbnVfaWQpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZnZW1fY2ZnLCBncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwKKyAgICAgICAgICAgIEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9EQVRBKTsKKyAgICB9CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmZ2VtX2NmZywgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUsCisgICAgICAgIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEUpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmdlbV9jZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sICpjb25maWd1cmF0aW9uKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZnZW1fY2ZnLCBncG9uX2dlbV9wb3J0LCBjb250cm9sLCBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEUpOworCisgICAgcmMgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZnZW1fY2ZnLmhkcik7CisgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpZl9pZCksCisgICAgICAgICAgICAgICAgIiVzIEZBSUxFRDogcmM9JXMgKCVkKSwgc3ZjX3BvcnRfaWQgPSAlZCBkZXZfaWQgPSAlZCBpZl9pZCA9ICVkIG9udV9pZCA9ICVkLCBlcnJfdGV4dD0lc1xuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCByYywgc3ZjX3BvcnRfaWQsIGRldmljZV9pZCwgaWZfaWQsIG9udV9pZCwgZ2VtX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworYmNtb3NfZXJybm8gbWFwbGVfZ3Bvbl9nZW1fcG9ydF9pZF9yZW1vdmUodWludDMyX3QgaWZfaWQsIHVpbnQxNl90IHN2Y19wb3J0X2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgZ2VtX2tleSA9IHt9OworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZyBnZW1fY2ZnID0ge307CisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9pZl9pZDsKKworICAgIEdFVF9ERVZJQ0VfSURfQU5EX1BIWVNJQ0FMX0lEX0ZST01fSUZfSUQoaWZfaWQsIGRldmljZV9pZCwgcGh5c2ljYWxfaWZfaWQpOworCisgICAgZ2VtX2tleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICBnZW1fa2V5LmdlbV9wb3J0X2lkID0gc3ZjX3BvcnRfaWQ7CisgICAgQkNNT0xUX0NGR19JTklUKCZnZW1fY2ZnLCBncG9uX2dlbV9wb3J0LCBnZW1fa2V5KTsKKyAgICByYyA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmZ2VtX2NmZy5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGlmX2lkKSwgIiVzIGlkPSVkLCBnZW09JWQsIGZhaWxlZCB3aXRoIGVycm9yICVzXG4iLF9fRlVOQ1RJT05fXywgaWZfaWQsIHN2Y19wb3J0X2lkLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIH0KKworCisgICAgcmV0dXJuIHJjOworfQorCisKK2JjbW9zX2Vycm5vIG1hcGxlX2dwb25fbWFjX2dldF9hbGxvY19pZF9jb25maWcgKHVpbnQzMl90IGlmX2lkLCB1aW50MzJfdCBvbnVfaWQsIHVpbnQxNl90IGFnZ19pZCwgYmNtb2x0X2FsbG9jX3N0YXRlICphbGxvY19pZF9zdGF0ZSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGFsbG9jX2tleSA9IHt9OworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2NmZyBhbGxvY19jZmcgPSB7fTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IHBoeXNpY2FsX2lmX2lkOworCisgICAgR0VUX0RFVklDRV9JRF9BTkRfUEhZU0lDQUxfSURfRlJPTV9JRl9JRChpZl9pZCwgZGV2aWNlX2lkLCBwaHlzaWNhbF9pZl9pZCk7CisKKyAgICAvKiBzZXQgdGhlIGFsbG9jLWlkIGtleSAqLworICAgIGFsbG9jX2tleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICBhbGxvY19rZXkuYWxsb2NfaWQgPSBhZ2dfaWQ7CisgICAgQkNNT0xUX0NGR19JTklUKCZhbGxvY19jZmcsIGdwb25fYWxsb2MsIGFsbG9jX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmYWxsb2NfY2ZnLCBncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7CisKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmFsbG9jX2NmZy5oZHIpOworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaWZfaWQpLAorICAgICAgICAgICAgICAgICIlczogRkFJTEVEIGluIGJjbW9sdF9jZmdfZ2V0IHJjID0gJXMsIGFnZ19pZCA9ICVkIGlmX2lkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwgYWdnX2lkLCBpZl9pZCk7CisKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKwkKKyAgICAvKiBtYXkgYmUgY29uZmlndXJlZDsgZG9lcyBhbGxvYyBpZCBiZWxvbmcgdG8gdGhlIGV4cGVjdGVkIG9udSA/ICovCisgICAgaWYgKGFsbG9jX2NmZy5kYXRhLnN0YXRlICE9IEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRAorCQkmJiBhbGxvY19jZmcuZGF0YS5vbnVfaWQgIT0gb251X2lkKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGlmX2lkKSwKKyAgICAgICAgICAgICAgICAiJXMgRkFJTEVELCBvbnUgaWQgbWlzbWF0Y2g6IGFnZ19pZCA9ICVkIGlmX2lkID0gJWQgaXMgc2V0IHRvIG9udSAlZCBOT1QgdG8gb251X2lkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGFnZ19pZCwgaWZfaWQsIGFsbG9jX2NmZy5kYXRhLm9udV9pZCwgb251X2lkKTsKKworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgICphbGxvY19pZF9zdGF0ZSA9IGFsbG9jX2NmZy5kYXRhLnN0YXRlOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworYmNtb3NfZXJybm8gbWFwbGVfZ3Bvbl91c19hbGxvY19pZF9hZGQodWludDMyX3QgaWZfaWQsIHVpbnQzMl90IG9udV9pZCwgdWludDE2X3QgYWdnX2lkLCBiY21vbHRfcG9uX2FsbG9jX3NsYSBhZ2dfc2xhKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkgYWxsb2Nfa2V5ID0ge307CisgICAgYmNtb2x0X2dwb25fYWxsb2NfY2ZnIGFsbG9jX2NmZyA9IHt9OworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgdWludDMyX3QgcGh5c2ljYWxfaWZfaWQ7CisKKyAgICBHRVRfREVWSUNFX0lEX0FORF9QSFlTSUNBTF9JRF9GUk9NX0lGX0lEKGlmX2lkLCBkZXZpY2VfaWQsIHBoeXNpY2FsX2lmX2lkKTsKKworICAgIC8qIHNldCB0aGUgYWxsb2MtaWQga2V5ICovCisgICAgYWxsb2Nfa2V5LnBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOworICAgIGFsbG9jX2tleS5hbGxvY19pZCA9IGFnZ19pZDsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmFsbG9jX2NmZywgZ3Bvbl9hbGxvYywgYWxsb2Nfa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZhbGxvY19jZmcsIGdwb25fYWxsb2MsIHNsYSwgYWdnX3NsYSk7CisgICAgLyogc2V0IHRoZSBhbGxvYy1pZCAtIG9udSBhc3NpZ25tZW50ICovCisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmYWxsb2NfY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQsIG9udV9pZCk7CisKKyAgICByYyA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmFsbG9jX2NmZy5oZHIpOworICAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGlmX2lkKSwKKyAgICAgICAgICAgICAgICAiJXM6IHJjID0gJXMsIGFnZ19pZCA9ICVkIGlmX2lkID0gJWQsIGVycl90ZXh0ID0gJXMgXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksIGFnZ19pZCwgaWZfaWQsIGFsbG9jX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworCit9CisKKworYmNtb3NfZXJybm8gbWFwbGVfZ3Bvbl91c19hbGxvY19pZF9yZW1vdmUodWludDMyX3QgaWZfaWQsIHVpbnQxNl90IGFnZ19pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGFsbG9jX2tleSA9IHt9OworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2NmZyBhbGxvY19jZmcgPSB7fTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IHBoeXNpY2FsX2lmX2lkOworCisgICAgR0VUX0RFVklDRV9JRF9BTkRfUEhZU0lDQUxfSURfRlJPTV9JRl9JRChpZl9pZCwgZGV2aWNlX2lkLCBwaHlzaWNhbF9pZl9pZCk7CisKKyAgICAvKiBzZXQgdGhlIGFsbG9jLWlkIGtleSAqLworICAgIGFsbG9jX2tleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICBhbGxvY19rZXkuYWxsb2NfaWQgPSBhZ2dfaWQ7CisgICAgQkNNT0xUX0NGR19JTklUKCZhbGxvY19jZmcsIGdwb25fYWxsb2MsIGFsbG9jX2tleSk7CisKKyAgICByYyA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmYWxsb2NfY2ZnLmhkcik7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaWZfaWQpLCAiJXMgZmFpbGVkIHdpdGggZXJyb3IgJXNcbiIsX19GVU5DVElPTl9fLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyoqCisgKiBAYnJpZWYgZ3JvdXAgc2V0IGZvciBncG9uIAorICogQHBhcmFtIHBfZ3JvdXBfcmVxICBwb2ludGVyIHRvIGdyb3VwIHJlcXVlc3Qgc3RydWN0dXJlIGZyb20gY29yZQorICogQHBhcmFtIG9wX3R5cGUgICAgICBBREQsIFJFTU9WRSBvciBTRVQKKyAqIEBwYXJhbSBwX2dyb3VwX2luc3QgcG9pbnRlciB0byB0aGUgQ29yZSBHcm91cCBPYmplY3QgaW5zdGFuY2UKKyAqCisgKiBAcmV0dXJuIGVycm5vICAgIGVycm9yCisgKgorICogQHRvZG8gc2hpZnQgdGhpcyBvdXQgdG8gbWFjIHNwZWNpZmljIGZpbGVzCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2dyb3VwX3NldF9mb3JfZ3BvbiAoYmNtYmFsX2dyb3VwX2NmZyAqcF9ncm91cF9yZXEsIGJhbF91dGlsX29wZXJfZ3JvdXAgb3BfdHlwZSwgZ3JvdXBfaW5zdCAqcF9ncm91cF9pbnN0KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICB1aW50MTZfdCBzdmNfcG9ydF9pZDsKKyAgICB1aW50MzJfdCBpZl9pZCwgaSwgcmVmX2NvdW50OworICAgIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSB7MH07CisKKyAgICAvKiBDaGVjayB0aGUgb3BlcmF0aW9uIGlkICovCisgICAgaWYgKChCQUxfVVRJTF9PUEVSX0dST1VQX0FERCAhPSBvcF90eXBlKSAgICAmJgorICAgICAgICAoQkFMX1VUSUxfT1BFUl9HUk9VUF9SRU1PVkUgIT0gb3BfdHlwZSkgJiYKKyAgICAgICAgKEJBTF9VVElMX09QRVJfR1JPVVBfU0VUICE9IG9wX3R5cGUpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIG1hY191dGlsIGdwb24gZ3JvdXAgb3BlcmF0aW9uICVkIFxuIiwgb3BfdHlwZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgICAgICAKKyAgICBjb25maWd1cmF0aW9uLmRpcmVjdGlvbiA9IEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fRE9XTlNUUkVBTTsKKyAgICBjb25maWd1cmF0aW9uLnR5cGUgPSBCQ01PTFRfR0VNX1BPUlRfVFlQRV9NVUxUSUNBU1Q7CisgICAgICAgIAorICAgIC8qIGZvciBncm91cCBTRVQgb3BlcmF0aW9uLCBmaXJzdCByZW1vdmUgdGhlIG9sZCBtdWx0aWNhc3QgR0VNICovCisgICAgaWYgKEJBTF9VVElMX09QRVJfR1JPVVBfU0VUID09IG9wX3R5cGUpCisgICAgeworICAgICAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2dyb3VwX3JlbV9yZXE7CisgICAgICAgIC8qIHVzZSB0aGUgQ29yZSBEQiBmb3IgZXhpc3RpbmcgbWVtYmVycyAtIHN0b3JlIGluIGN1cnJlbnRfZmxvd19pbmZvICovCisgICAgICAgIHBfZ3JvdXBfcmVtX3JlcSA9ICZwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mbzsKKyAgICAgICAgZm9yKGk9MDsgaTwgcF9ncm91cF9yZW1fcmVxLT5kYXRhLm1lbWJlcnMubGVuOyBpKyspCisgICAgICAgIHsgIAorICAgICAgICAgICAgaWZfaWQgPSBwX2dyb3VwX3JlbV9yZXEtPmRhdGEubWVtYmVycy52YWxbaV0uaW50Zl9pZDsKKyAgICAgICAgICAgIHN2Y19wb3J0X2lkID0gcF9ncm91cF9yZW1fcmVxLT5kYXRhLm1lbWJlcnMudmFsW2ldLnN2Y19wb3J0X2lkOworICAgICAgICAgICAgLyogc3ZjX3BvcnRfaWQgY2FuIGJlIDAgKG5vdCBhc3NpZ25lZCkgd2hlbiBncm91cCBoYWQgbm8gb3duZXIsIG5vIG5lZWQgdG8gcmVtb3ZlICAqLworICAgICAgICAgICAgaWYoc3ZjX3BvcnRfaWQpCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIHJjID0gcnNjX21ncl9nZW1fZ2V0X3JlZl9jb3VudChpZl9pZCwgc3ZjX3BvcnRfaWQsICZyZWZfY291bnQpOworICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICAgICAgICAgICAgICJtYWNfdXRpbCBncG9uIGdyb3VwIGdldCByZWZlcmVuY2UgY291bnQgb24gaW50ZXJmYWNlICVkIChnZW0gJWQpIGZhaWxlZCBcbiIsIGlmX2lkLCBzdmNfcG9ydF9pZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogaWYgb3RoZXIgZ3JvdXAgaXMgcmVmZXJlbmNpbmcgdGhlIHNhbWUgR0VNIChyZWZfY291bnQgPiAxKSwgZG8gbm90IGNhbGwgTWFjIEFQSSB0byByZW1vdmUgaXQuCisgICAgICAgICAgICAgICAgICAgVGhlIGNvcmUgd2lsbCBhc2sgUmVzb3VyY2UgTWFuZ2VyIHRvIGRlY3JlYXNlIHRoZSBjb3VudGVyIGlmIGV2ZXJ5dGhpbmcgaXMgZ29vZCAqLworICAgICAgICAgICAgICAgIGlmICggcmVmX2NvdW50ID09IDEpCisgICAgICAgICAgICAgICAgeyAgCisgICAgICAgICAgICAgICAgICAgIHJjID0gbWFwbGVfZ3Bvbl9nZW1fcG9ydF9pZF9yZW1vdmUoaWZfaWQsIHN2Y19wb3J0X2lkKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1hY191dGlsIGdwb24gZ3JvdXAgc2V0IG9wZXJhdGlvbiBTRVQgb24gcmVtb3ZlIGludGVyZmFjZSAlZCAoZ2VtICVkKSBmYWlsZWQgXG4iLCBpZl9pZCwgc3ZjX3BvcnRfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCByZWZfY291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICB7ICAKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAibWFjX3V0aWwgZ3BvbiBncm91cCBzZXQgb3BlcmF0aW9uIFNFVCBvbiBpbnRlcmZhY2UgJWQgKGdlbSAlZCkgcmVtb3ZlIHdpdGggMCByZWZlcmVuY2UgY291bnRlciBcbiIsIGlmX2lkLCBzdmNfcG9ydF9pZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogd2FsayB0aHJvdWdoIGV2ZXJ5IG1lbWJlciBpbnRlcmZhY2UgKi8KKyAgICBmb3IoaT0wOyBpPCBwX2dyb3VwX3JlcS0+ZGF0YS5tZW1iZXJzLmxlbjsgaSsrKQorICAgIHsgIAorICAgICAgICBpZl9pZCA9IHBfZ3JvdXBfcmVxLT5kYXRhLm1lbWJlcnMudmFsW2ldLmludGZfaWQ7CisgICAgICAgIHN2Y19wb3J0X2lkID0gcF9ncm91cF9yZXEtPmRhdGEubWVtYmVycy52YWxbaV0uc3ZjX3BvcnRfaWQ7CisgICAgICAgIC8qIGdyb3VwIEFkZCAqLworICAgICAgICBpZiAoQkFMX1VUSUxfT1BFUl9HUk9VUF9BREQgPT0gb3BfdHlwZSB8fCBCQUxfVVRJTF9PUEVSX0dST1VQX1NFVCA9PSBvcF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1hcGxlX2dwb25fZ2VtX3BvcnRfaWRfYWRkKGlmX2lkLCBzdmNfcG9ydF9pZCwgTUFDX1VUSUxfRFVNTVlfT05VX0lEX0ZPUl9NVUxUSUNBU1RfR0VNLCAmY29uZmlndXJhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoQkFMX1VUSUxfT1BFUl9HUk9VUF9SRU1PVkUgPT0gb3BfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSByc2NfbWdyX2dlbV9nZXRfcmVmX2NvdW50KGlmX2lkLCBzdmNfcG9ydF9pZCwgJnJlZl9jb3VudCk7CisgICAgICAgICAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKyAgICAgICAgICAgICAgICAibWFjX3V0aWwgZ3BvbiBncm91cCBvcGVyYXRpb24gUkVNIG9uIGludGVyZmFjZSAlZCAoZ2VtICVkKSBmYWlsZWQgXG4iLCBpZl9pZCwgc3ZjX3BvcnRfaWQpOworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGlmIG90aGVyIGdyb3VwIGlzIHJlZmVyZW5jaW5nIHRoZSBzYW1lIEdFTSAocmVmX2NvdW50ID4gMSksIGRvIG5vdCBjYWxsIE1hYyBBUEkgdG8gcmVtb3ZlIGl0LgorICAgICAgICAgICAgICAgVGhlIGNvcmUgd2lsbCBhc2sgUmVzb3VyY2UgTWFuZ2VyIHRvIGRlY3JlYXNlIHRoZSBjb3VudGVyIGlmIGV2ZXJ5dGhpbmcgaXMgZ29vZCAqLworICAgICAgICAgICAgaWYgKCByZWZfY291bnQgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IG1hcGxlX2dwb25fZ2VtX3BvcnRfaWRfcmVtb3ZlKGlmX2lkLCBzdmNfcG9ydF9pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggcmVmX2NvdW50ID09IDApCisgICAgICAgICAgICB7ICAKKyAgICAgICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9tYWNfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIm1hY191dGlsIGdwb24gZ3JvdXAgb3BlcmF0aW9uIFJFTSBvbiBpbnRlcmZhY2UgJWQgKGdlbSAlZCkgd2l0aCAwIHJlZmVyZW5jZSBjb3VudCBcbiIsIGlmX2lkLCBzdmNfcG9ydF9pZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAKKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorICAgICAgICAgICAgIm1hY191dGlsIGdwb24gZ3JvdXAgc2V0IG9mIG9wZXJhdGlvbiAlZCBvbiBpbnRlcmZhY2UgJWQgKGdlbSAlZCkgZmFpbGVkIFxuIiwgb3BfdHlwZSwgaWZfaWQsIHN2Y19wb3J0X2lkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKkB9Ki8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbF9sb29wYmFjay5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvYmFsX21hY191dGlsX2xvb3BiYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0YzI4MgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvbWFjL2JhbF9tYWNfdXRpbF9sb29wYmFjay5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfbWFjX3V0aWxfbG9vcGJhY2suYworICoKKyAqIEBicmllZiBtYWMgdXRpbCBoYW5kbGluZyBmb3IgTUFDIGluIGxvb3BiYWNrIG1vZGUKKyAqCisgKiBUaGUgbG9vcGJhY2sgbW9kZSBpcyBoYW5kbGVkIGxpa2UgYSBtYWMgcHJvdG9jb2wsIHdpdGggbG9vcGJhY2sgc3BlY2lmaWMgaGFuZGxpbmcgCisgKiAgZG9uZSBhcyBzdWItcm91dGluZSBjYWxscyBmcm9tIHRoZSB0b3AgbGV2ZWwgaGFuZGxlciBmdW5jdGlvbnMuIAorICoKKyAqIEBhZGR0b2dyb3VwIG1hY191dGlsCisgKi8KKworLypAeyovCisKKyNpbmNsdWRlIDxiYWxfbWFjX3V0aWwuaD4KKyNpbmNsdWRlIDxiYWxfbWFjX3V0aWxfY29tbW9uX2l0dV9wb24uaD4KKyNpbmNsdWRlIDxiYWxfd29ya2VyLmg+CisKKworLyoqCisgKiBAYnJpZWYgYWNjZXNzIHRlcm1pbmFsIHNldCBmb3IgbG9vcGJhY2sKKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfbG9vcGJhY2sgKGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSwgYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBiY21vc191c2xlZXAoMTAwMDAwMCk7CisgICAgbWFjX3V0aWxfcmVwb3J0X2FjY190ZXJtX2V2ZW50KEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0NPTVBMRVRFKTsKKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiBzZXQgaW50ZXJmYWNlIGZvciBsb29wYmFjayBtb2RlCisgKiAKKyAqIEBwYXJhbSBwX2ludGVyZmFjZV9pbnN0ICBQb2ludGVyIHRvIGludGVyZmFjZSBpbnN0YW5jZQorICogQHBhcmFtIG9wX3R5cGUgICAgICAgICAgIE9wZXJhdGlvbiB0eXBlIG9uIGFjY2VzcyB0ZXJtaW5hbC9pbnRlcmZhY2UgaW5zdGFuY2UKKyAqIAorICogQHJldHVybiBiY21vc19lcnJubyAKKyAqCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2ludGVyZmFjZV9zZXRfZm9yX2xvb3BiYWNrKGFjY190ZXJtX2ludGVyZmFjZSAqcF9pbnRlcmZhY2VfaW5zdCwgYmFsX3V0aWxfb3Blcl9pZiBvcF90eXBlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21iYWxfaW50ZXJmYWNlX2tleSBpbnRmX2tleSA9IHBfaW50ZXJmYWNlX2luc3QtPmFwaV9yZXFfaW50X29ial9pbmZvLmtleTsKKyAgICBiY21iYWxfaW50ZXJmYWNlX2NmZyAqcF9pbnRlcmZhY2VfcmVxID0gJihwX2ludGVyZmFjZV9pbnN0LT5hcGlfcmVxX2ludF9vYmpfaW5mbyk7CisKKyAgICBwX2ludGVyZmFjZV9yZXEgPSAmKHBfaW50ZXJmYWNlX2luc3QtPmFwaV9yZXFfaW50X29ial9pbmZvKTsKKworICAgIC8qIElmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgdHJhbnNjZWl2ZXIsIHRoZW4gdXNlIHRoZSBkZWZhdWx0ICovCisgICAgaWYgKEJDTU9TX0ZBTFNFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9pbnRlcmZhY2VfcmVxLCBpbnRlcmZhY2UsIHRyYW5zY2VpdmVyX3R5cGUpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2ludGVyZmFjZV9yZXEsIGludGVyZmFjZSwgdHJhbnNjZWl2ZXJfdHlwZSwgQkNNQkFMX01BQ19VVElMX1RSWF9UWVBFX0RFRkFVTFRfR1BPTik7CisgICAgfQorCisgICAgbWFjX3V0aWxfcmVwb3J0X2lmX2V2ZW50KGludGZfa2V5LmludGZfaWQsIAorICAgICAgICAgICAgaW50Zl9rZXkuaW50Zl90eXBlLAorICAgICAgICAgICAgQkNNX0VSUl9PSywgQkNNT0xUX1JFU1VMVF9TVUNDRVNTLCAKKyAgICAgICAgICAgICgoQkFMX1VUSUxfT1BFUl9JRl9VUCA9PSBvcF90eXBlKSA/IEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkcgOiBCQ01PTFRfUE9OX1NUQVRFX0lOQUNUSVZFKSk7CisKKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiBTZXQgc3Vic2NyaWJlciB0ZXJtaW5hbCBmb3IgbG9vcGJhY2sgbW9kZQorICogCisgKiBAcGFyYW0gcF9zdWJfdGVybV9pbnN0ICAgQSBwb2ludGVyIHRvIGEgc3Vic2NyaWJlciB0ZXJtaW5hbCBpbnN0YW5jZQorICogQHBhcmFtIG9wX3R5cGUgICAgICAgICAgVHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIG9uIHRoZSBzdWJzY3JpYmVyIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gaXNfcG9zdF9kaXNjb3ZlcnkgVXNlZCBmb3IgQURELCBpbmRpY2F0ZXMgaWYgdGhpcyByZXF1ZXN0IGlzIGFmdGVyIGEgT05VIERpc2NvdmVyeQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8gCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX3N1YnNjcmliZXJfdGVybWluYWxfc2V0X2Zvcl9sb29wYmFjayhzdWJfdGVybV9pbnN0ICpwX3N1Yl90ZXJtX2luc3QsIGJhbF91dGlsX29wZXJfc3ViX3Rlcm0gb3BfdHlwZSwgYmNtb3NfYm9vbCBpc19wb3N0X2Rpc2NvdmVyeSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpwX3N1Yl90ZXJtX3JlcSA9ICZwX3N1Yl90ZXJtX2luc3QtPmFwaV9yZXFfc3ViX3Rlcm1faW5mbzsKKworCisgICAgbWFjX3V0aWxfcmVwb3J0X3N1Yl90ZXJtX2V2ZW50KHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCwKKyAgICAgICAgcF9zdWJfdGVybV9yZXEtPmtleS5zdWJfdGVybV9pZCwgCisgICAgICAgIChiY21vbHRfc2VyaWFsX251bWJlciAqKU5VTEwsCisgICAgICAgIChCQUxfVVRJTF9PUEVSX1NVQl9URVJNX0FERCA9PSBvcF90eXBlID8gQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9BREQgOiBCQUxfVVRJTF9PUEVSX1NVQl9URVJNX1JFTU9WRSksCisgICAgICAgIEJDTV9FUlJfT0ssIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUywKKyAgICAgICAgKEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQUREID09IG9wX3R5cGUgPyBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FIDogQkNNT0xUX1JFU1VMVF9TVUNDRVNTKSwgQkNNQkFMX0lOVkFMSURfVFVOTkVMX0lEKTsKKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiBzZXQgZmxvdyBmb3IgbG9vcGJhY2sgbW9kZQorICovCitiY21vc19lcnJubyBtYWNfdXRpbF9mbG93X3NldF9mb3JfbG9vcGJhY2soYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxLCBiYWxfdXRpbF9vcGVyX2Zsb3cgb3BfdHlwZSwgZmxvd19pbnN0ICpwX2Zsb3dfY29yZSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBpZiAoQkFMX1VUSUxfT1BFUl9GTE9XX0FERCA9PSBvcF90eXBlKQorICAgIHsKKyAgICAgICAgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfYWRkX3N1Y2Nlc3MocF9mbG93X3JlcS0+a2V5LCBwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQpOworICAgIH0KKyAgICBlbHNlIGlmICgoQkFMX1VUSUxfT1BFUl9GTE9XX1JFTU9WRSA9PSBvcF90eXBlKSB8fCAoQkFMX1VUSUxfT1BFUl9GTE9XX0NMRUFSID09IG9wX3R5cGUpKQorICAgIHsKKyAgICAgICAgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfcmVtb3ZlX3N1Y2Nlc3MocF9mbG93X3JlcS0+a2V5LCBwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQsIG9wX3R5cGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfSU5WQUxJRF9PUDsKKyAgICB9CisKKworICAgIHJldHVybiByYzsKK30KKworCisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvYmFsX21hY191dGlsX3hncG9uLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL21hYy9iYWxfbWFjX3V0aWxfeGdwb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDliM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9tYWMvYmFsX21hY191dGlsX3hncG9uLmMKQEAgLTAsMCArMSwxNDkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfbWFjX3V0aWxfeGdwb24uYworICoKKyAqIEBicmllZiBtYWMgdXRpbCBpbnRlcmZhY2VzIGRlZmluaXRpb24gdXNlZCBieSBCYWwgQ29yZSwgZm9yIHhncG9uCisgKgorICogVGhpcyBmaWxlIGV4cG9zZSB0aGUgQVBJcyB0byB0aGUgY29yZSB0byBjb25maWd1cmUgdGhlIG1hYyAKKyAqIHdpdGggcmVnYXJkaW5nIHRvIHRoZSBvcGVyYXRpb24gb2YgYWNjZXNzIHRlcm1pbmFsLCBpbnRlcmZhY2UsIHN1YnNjcmliZXIgdGVybWluYWwgYW5kIGZsb3cuCisgKgorICogQGFkZHRvZ3JvdXAgbWFjX3V0aWwKKyAqLworCisvKkB7Ki8KKworI2luY2x1ZGUgPGJhbF9tYWNfdXRpbC5oPgorI2luY2x1ZGUgPGJhbF9tYWNfdXRpbF9jb21tb25faXR1X3Bvbi5oPgorCisKK3N0YXRpYyBiY21vc19lcnJubyBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZV9mb3JfeGdwb25fbmkgKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9tc2cgKnBfbXNnKTsKK3N0YXRpYyBiY21vc19lcnJubyBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZV9mb3JfeGdwb25fb251IChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZyk7CitzdGF0aWMgYmNtb3NfZXJybm8gbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVfZm9yX3hncG9uX2FsbG9jX2lkIChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZyk7CisKKy8qIE9uIFhHLVBPTjEgdGhlcmUgaXMgbm8gaW5kaWNhdGlvbiBzdWNoIGFzIEdFTSBwb3J0IGNvbmZpZ3VyYXRpb24gY29tcGxldGVkLgorICogR0VNIGNvbmZpZ3VyYXRpb24gYXQgdGhlIE9OVSBpcyB0YWtlbiBjYXJlIG9mIGNvbXBsZXRlbHkgYnkgT01DSSB3aXRob3V0IGFueSBQTE9BTSBzZW50IGZyb20gdGhlIE9MVAorICogKi8KKworLyoqCisgKiBAYnJpZWYgYXJyYXkgc3RvcmVzIHRoZSBsaXN0IG9mIHhncG9uIChYRy1QT04xKSByZWxhdGVkIGF1dG8gaW5kaWNhdGlvbnMgZnJvbSBNYXBsZSB0byBzdWJzY3JpYmUKKyAqLworc3RhdGljIG1hY191dGlsX2luZF9vYmpfYW5kX2hhbmRsZXJzIG1hY191dGlsX3hncG9uX2luZF9oYW5kbGVyc1tdID0KK3sKKyAgICB7QkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgICAgICAgICJCQ01PTFRfT0JKX0lEX1hHUE9OX05JIiwgICAgbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVfZm9yX3hncG9uX25pfSwKKyAgICB7QkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsICAgICAgICJCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSIsICAgbWFjX3V0aWxfaW5kaWNhdGlvbl9oYW5kbGVfZm9yX3hncG9uX29udX0sCisgICAge0JDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsICAgICAiQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQyIsIG1hY191dGlsX2luZGljYXRpb25faGFuZGxlX2Zvcl94Z3Bvbl9hbGxvY19pZH0sCit9OworCisvKioKKyAqIEBicmllZiBNYXAgYmFsIFhHUE9OIHRyYW5zY2VpdmVyIHR5cGUgdG8gYmNtNjg2MjAgdHJhbnNjZWl2ZXIgdHlwZQorICovCitzdGF0aWMgYmNtb2x0X3hncG9uX3RyeF90eXBlIG1hY194Z3Bvbl9iYWxfdHJ4X3R5cGUyYmNtNjg2MjBfdHJ4X3R5cGUoYmNtYmFsX3RyeF90eXBlIGJhbF90cnhfdHlwZSkKK3sKKyAgICBiY21vbHRfeGdwb25fdHJ4X3R5cGUgdHJ4X3R5cGUgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfX05VTV9PRjsKKworICAgIGlmIChCQ01CQUxfVFJYX1RZUEVfWEdQT05fTFRIXzcyMjJfUEMgPT0gYmFsX3RyeF90eXBlKQorICAgIHsKKyAgICAgICAgdHJ4X3R5cGUgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRIXzcyMjJfUEM7CisgICAgfQorICAgIGVsc2UgaWYgKEJDTUJBTF9UUlhfVFlQRV9YR1BPTl9MVEhfNzIyNl9QQyA9PSBiYWxfdHJ4X3R5cGUpCisgICAgeworICAgICAgICB0cnhfdHlwZSA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVEhfNzIyNl9QQzsKKyAgICB9CisgICAgZWxzZSBpZiAoQkNNQkFMX1RSWF9UWVBFX1hHUE9OX0xUSF81MzAyX1BDID09IGJhbF90cnhfdHlwZSkKKyAgICB7CisgICAgICAgIHRyeF90eXBlID0gQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUSF81MzAyX1BDOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0cnhfdHlwZSA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9VU0VSX0RFRklORUQ7CisgICAgfQorCisgICAgcmV0dXJuIHRyeF90eXBlOworfQorCisvKioKKyAqIEBicmllZiBhbGwgdGhlIG1hcGxlIGluZGljYXRpb24gaGFuZGxlcnMgZm9yIHhncG9uCisgKgorICogQHBhcmFtIGRldmljZV9pZCB0aGUgbWFwbGUgZGV2aWNlIGlkIGdlbmVyYXRpbmcgdGhlIGN1cnJlbnQgaW5kaWNhdGlvbgorICogQHBhcmFtIHBfbXNnIHBvaW50ZXIgdG8gdGhlIG1hcGxlIGluZGljYXRpb24gbWVzc2FnZQorICoKKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfaGFuZGxlX2FsbF9vbHRfaW5kX2Zvcl94Z3BvbiAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpCit7CisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX21hY191dGlsLAorICAgICAgICAibWFjX3V0aWxfaW5kaWNhdGlvbl9jYiByZWNlaXZlZCBpbmRpY2F0aW9uIG9iaj0lZC8lcyBncm91cD0lZCBzdWJncm91cD0lZFxuIiwKKyAgICAgICAgcF9tc2ctPm9ial90eXBlLCBtYWNfdXRpbF9pbmRpY2F0aW9uX2dldF9vYmpfdHlwZV9zdHIocF9tc2ctPm9ial90eXBlLCBtYWNfdXRpbF94Z3Bvbl9pbmRfaGFuZGxlcnMsIEJDTV9TSVpFT0ZBUlJBWShtYWNfdXRpbF94Z3Bvbl9pbmRfaGFuZGxlcnMpKSwKKyAgICAgICAgcF9tc2ctPmdyb3VwLCBwX21zZy0+c3ViZ3JvdXApOworCisgICAgcmV0dXJuIG1hY191dGlsX2hhbmRsZV9pbmRpY2F0aW9uKGRldmljZV9pZCwgcF9tc2csIG1hY191dGlsX3hncG9uX2luZF9oYW5kbGVycywgQkNNX1NJWkVPRkFSUkFZKG1hY191dGlsX3hncG9uX2luZF9oYW5kbGVycykpOworfQorCisKKy8qKgorICogQGJyaWVmIEhhbmRsZXIgZnVuY3Rpb24gZm9yIE1hcGxlIGF1dG8gaW5kaWNhdGlvbnMgZm9yIHhncG9uIChYRy1QT04xKSBOSQorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgdGhlIG1hcGxlIGRldmljZSBpZCBnZW5lcmF0aW5nIHRoZSBjdXJyZW50IGluZGljYXRpb24KKyAqIEBwYXJhbSBwX21zZyBwb2ludGVyIHRvIHRoZSBtYXBsZSBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZV9mb3JfeGdwb25fbmkgKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9tc2cgKnBfbXNnKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKwl1aW50MzJfdCBsb2dpY2FsX3BvbjsKKworICAgIGRvCisgICAJeworICAgCisgICAgIC8qIFBPTiBhY3RpdmF0aW9uICovCisgICAgICAgIGlmIChCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEID09IHBfbXNnLT5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgKiBwX2luZCA9IChiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCopcF9tc2c7CisKKwkJICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9waHlzaWNhbDJsb2dpY2FsKGRldmljZV9pZCwgcF9pbmQtPmtleS5wb25fbmksICZsb2dpY2FsX3Bvbik7CQkJCQorICAgIAkJaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisJCSAgICB7CisJCQkgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorCQkJCQkgICAgIkZhaWxlZCB0byBnZXQgbG9naWNhbCBpZiBmcm9tIHBoeXNpY2FsIGlmIChkZXZpY2VfaWQgJWQgcGh5c2ljYWwgJWQgKSAoJXMpXG4iLCBkZXZpY2VfaWQsIHBfaW5kLT5rZXkucG9uX25pLCBiY21vc19zdHJlcnJvcihyYykpOworCQkJICAgIGJyZWFrOworCQkgICAgfQorICAgIAorICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYobG9naWNhbF9wb24pLCAiUG9uIGlmICVkIGlzICVzLlxuIiwgbG9naWNhbF9wb24sCisgICAgICAgICAgICAgICAgQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfV09SS0lORyA9PSBwX2luZC0+ZGF0YS5uZXdfc3RhdGUgPyAidXAiIDogImRvd24iKTsKKyAgICAKKyAgICAgICAgICAgIG1hY191dGlsX3JlcG9ydF9pZl9ldmVudChsb2dpY2FsX3BvbiwgQkNNQkFMX0lOVEZfVFlQRV9QT04sIHBfbXNnLT5lcnIsCisgICAgICAgICAgICAgICAgcF9pbmQtPmRhdGEucmVzdWx0LCBwX2luZC0+ZGF0YS5uZXdfc3RhdGUpOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQgPT0gcF9tc2ctPnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWQgKnBfaW5kID0KKyAgICAgICAgICAgICAgICAoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkICopcF9tc2c7CisKKwkJICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9waHlzaWNhbDJsb2dpY2FsKGRldmljZV9pZCwgcF9pbmQtPmtleS5wb25fbmksICZsb2dpY2FsX3Bvbik7CQkJCQorICAgIAkJaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisJCSAgICB7CisJCQkgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorCQkJCQkgICAgIkZhaWxlZCB0byBnZXQgbG9naWNhbCBpZiBmcm9tIHBoeXNpY2FsIGlmIChkZXZpY2VfaWQgJWQgcGh5c2ljYWwgJWQgKSAoJXMpXG4iLCBkZXZpY2VfaWQsIHBfaW5kLT5rZXkucG9uX25pLCBiY21vc19zdHJlcnJvcihyYykpOworCQkJICAgIGJyZWFrOworCQkgICAgfQorICAgIAorICAgIAorICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGxvZ2ljYWxfcG9uKSwKKyAgICAgICAgICAgICAgICAgICAgIlBvbiBpZiAlZCBmb3VuZCBPTlUgc2VyaWFsIG51bWJlciAiCisgICAgICAgICAgICAgICAgICAgICIlYyVjJWMlYyVkJWQlZCVkJWQlZCVkJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxfcG9uLAorICAgICAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZFswXSwKKyAgICAgICAgICAgICAgICAgICAgcF9pbmQtPmRhdGEuc2VyaWFsX251bWJlci52ZW5kb3JfaWRbMV0sCisgICAgICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLnNlcmlhbF9udW1iZXIudmVuZG9yX2lkWzJdLAorICAgICAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZFszXSwKKyAgICAgICAgICAgICAgICAgICAgcF9pbmQtPmRhdGEuc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWNbMF0+PjQgJiAweDBmLAorICAgICAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpY1swXSAmIDB4MGYsCisgICAgICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljWzFdPj40ICYgMHgwZiwKKyAgICAgICAgICAgICAgICAgICAgcF9pbmQtPmRhdGEuc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWNbMV0gJiAweDBmLAorICAgICAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpY1syXT4+NCAmIDB4MGYsCisgICAgICAgICAgICAgICAgICAgIHBfaW5kLT5kYXRhLnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljWzJdICYgMHgwZiwKKyAgICAgICAgICAgICAgICAgICAgcF9pbmQtPmRhdGEuc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWNbM10+PjQgJiAweDBmLAorICAgICAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpY1szXSAmIDB4MGYKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAgICAgICAgIC8qIGlmIHdlIGdvdCBzb21ldGhpbmcgZnJvbSBNQUMgSFcsIHRoZW4gaXQgaGFzIHRvIGJlIFBPTiBpbnRlcmZhY2UgKi8KKyAgICAgICAgICAgIG1hY191dGlsX3JlcG9ydF9zdWJfdGVybV9ldmVudChsb2dpY2FsX3BvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5vbnVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfaW5kLT5kYXRhLnNlcmlhbF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9ESVNDT1ZFUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tc2ctPmVyciwgQkNNX0VSUl9PSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FLCBCQ01CQUxfSU5WQUxJRF9UVU5ORUxfSUQpOworICAgICAgICB9CisKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBqdXN0IGdldCB0aGUgcG9uIGtleSBieSB0eXBlY2FzdGluZyB0byBhIGR1bW15IHN0cnVjdHVyZSAqLworICAgICAgICAgICAgYmNtb2x0X3hncG9uX25pX2tleSAqcF9wb25fa2V5ID0gJigoKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKilwX21zZyktPmtleSk7CisKKyAgICAgICAgICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9waHlzaWNhbDJsb2dpY2FsKGRldmljZV9pZCwgcF9wb25fa2V5LT5wb25fbmksICZsb2dpY2FsX3Bvbik7CQkJCQorICAgIAkJaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisJCSAgICB7CisJCQkgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorCQkJCQkgICAgIkZhaWxlZCB0byBnZXQgbG9naWNhbCBpZiBmcm9tIHBoeXNpY2FsIGlmIChkZXZpY2VfaWQgJWQgcGh5c2ljYWwgJWQgKSAoJXMpXG4iLCBkZXZpY2VfaWQsIHBfcG9uX2tleS0+cG9uX25pLCBiY21vc19zdHJlcnJvcihyYykpOworCQkJICAgIGJyZWFrOworCQkgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihsb2dpY2FsX3BvbiksCisgICAgICAgICAgICAgICAgIlVuaGFuZGxlZCBtZXNzYWdlIGluZGljYXRpb24gZm9yIG9iaiBYR1BPTl9OSSBncm91cCAlZCAiCisgICAgICAgICAgICAgICAgInN1Ymdyb3VwICVkIChJZ25vcmVkKVxuIiwgcF9tc2ctPmdyb3VwLCBwX21zZy0+c3ViZ3JvdXApOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlKDApOwkKKwkKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBAYnJpZWYgSGFuZGxlciBmdW5jdGlvbiBmb3IgTWFwbGUgYXV0byBpbmRpY2F0aW9ucyBmb3IgeGdwb24gKFhHLVBPTjEpIE9OVQorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgdGhlIG1hcGxlIGRldmljZSBpZCBnZW5lcmF0aW5nIHRoZSBjdXJyZW50IGluZGljYXRpb24KKyAqIEBwYXJhbSBwX21zZyBwb2ludGVyIHRvIHRoZSBtYXBsZSBpbmRpY2F0aW9uIG1lc3NhZ2UKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBtYWNfdXRpbF9pbmRpY2F0aW9uX2hhbmRsZV9mb3JfeGdwb25fb251IChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfbXNnICpwX21zZykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgbG9naWNhbF9wb247CisgICAgCisgICAgLyoganVzdCBnZXQgdGhlIHBvbiBrZXkgYnkgdHlwZWNhc3RpbmcgdG8gYSBkdW1teSBzdHJ1Y3R1cmUgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSAqcF94Z3Bvbl9vbnVfa2V5ID0gJigoKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkKilwX21zZyktPmtleSk7CisgICAgZG8KKyAgICB7ICAgIAorICAgICAgICBpZiAoQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQgPT0gcF9tc2ctPnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCAqcF9pbmQgPSAoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQqKSBwX21zZzsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X3BoeXNpY2FsMmxvZ2ljYWwoZGV2aWNlX2lkLCBwX2luZC0+a2V5LnBvbl9uaSwgJmxvZ2ljYWxfcG9uKTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbG9naWNhbCBpZiBmcm9tIHBoeXNpY2FsIGlmIChkZXZpY2VfaWQgJWQgcGh5c2ljYWwgJWQgKSAoJXMpXG4iLCBkZXZpY2VfaWQsIHBfaW5kLT5rZXkucG9uX25pLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGxvZ2ljYWxfcG9uKSwKKyAgICAgICAgICAgICAgICAic3ViX3Rlcm0gJWQgKFBPTiVkKSBhY3RpdmF0aW9uIGluZGljYXRpb24gKCVzKVxuIiwKKyAgICAgICAgICAgICAgICBwX2luZC0+a2V5Lm9udV9pZCwKKyAgICAgICAgICAgICAgICBsb2dpY2FsX3BvbiwKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihwX21zZy0+ZXJyKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1hY191dGlsX3JlcG9ydF9zdWJfdGVybV9ldmVudChsb2dpY2FsX3BvbiwKKyAgICAgICAgICAgICAgICBwX2luZC0+a2V5Lm9udV9pZCwKKyAgICAgICAgICAgICAgICAoYmNtb2x0X3NlcmlhbF9udW1iZXIgKilOVUxMLAorICAgICAgICAgICAgICAgIEJBTF9VVElMX09QRVJfU1VCX1RFUk1fQURELAorICAgICAgICAgICAgICAgIHBfbXNnLT5lcnIsIHBfaW5kLT5kYXRhLnN0YXR1cywKKyAgICAgICAgICAgICAgICBwX2luZC0+ZGF0YS5mYWlsX3JlYXNvbiwgQkNNQkFMX0lOVkFMSURfVFVOTkVMX0lEKTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCA9PSBwX21zZy0+c3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgKnBfaW5kID0gKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQqKSBwX21zZzsKKyAgICAgICAgICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9waHlzaWNhbDJsb2dpY2FsKGRldmljZV9pZCwgcF9pbmQtPmtleS5wb25fbmksICZsb2dpY2FsX3Bvbik7CQkKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgbG9naWNhbCBpZiBmcm9tIHBoeXNpY2FsIGlmIChkZXZpY2VfaWQgJWQgcGh5c2ljYWwgJWQgKSAoJXMpXG4iLCBkZXZpY2VfaWQsIHBfaW5kLT5rZXkucG9uX25pLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGxvZ2ljYWxfcG9uKSwKKyAgICAgICAgICAgICAgICAic3ViX3Rlcm0gJWQgKFBPTiVkKSBkZWFjdGl2YXRpb24gaW5kaWNhdGlvbiAoJXMpXG4iLAorICAgICAgICAgICAgICAgIHBfaW5kLT5rZXkub251X2lkLAorICAgICAgICAgICAgICAgIHBfaW5kLT5rZXkucG9uX25pLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHBfbXNnLT5lcnIpKTsKKyAgICAgICAgCisgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfc3ViX3Rlcm1fZXZlbnQobG9naWNhbF9wb24sCisgICAgICAgICAgICAgICAgcF9pbmQtPmtleS5vbnVfaWQsCisgICAgICAgICAgICAgICAgKGJjbW9sdF9zZXJpYWxfbnVtYmVyICopTlVMTCwKKyAgICAgICAgICAgICAgICBCQUxfVVRJTF9PUEVSX1NVQl9URVJNX1JFTU9WRSwKKyAgICAgICAgICAgICAgICBwX21zZy0+ZXJyLCBwX2luZC0+ZGF0YS5zdGF0dXMsCisgICAgICAgICAgICAgICAgTUFDX1VUSUxfREVBQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX05PTkUsIEJDTUJBTF9JTlZBTElEX1RVTk5FTF9JRCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfcGh5c2ljYWwybG9naWNhbChkZXZpY2VfaWQsIHBfeGdwb25fb251X2tleS0+cG9uX25pLCAmbG9naWNhbF9wb24pOwkJCisgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGxvZ2ljYWwgaWYgZnJvbSBwaHlzaWNhbCBpZiAoZGV2aWNlX2lkICVkIHBoeXNpY2FsICVkICkgKCVzKVxuIiwgZGV2aWNlX2lkLCBwX3hncG9uX29udV9rZXktPnBvbl9uaSwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGxvZ2ljYWxfcG9uKSwKKyAgICAgICAgICAgICAgICAiVW5oYW5kbGVkIG1lc3NhZ2UgaW5kaWNhdGlvbiBmb3Igb2JqIFhHUE9OX09OVSBncm91cCAlZCAiCisgICAgICAgICAgICAgICAgInN1Ymdyb3VwICVkIChJZ25vcmVkKVxuIiwgcF9tc2ctPmdyb3VwLCBwX21zZy0+c3ViZ3JvdXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCQlyYyA9IG1hY191dGlsX3VwZGF0ZV9mbG93c193X3N1Yl90ZXJtX3VwZGF0ZShsb2dpY2FsX3BvbiwgcF94Z3Bvbl9vbnVfa2V5LT5vbnVfaWQsIG1hcGxlX3hncG9uX21hY19jaGVja19nZW1fcG9ydF9pZCwgbWFwbGVfeGdwb25fbWFjX2dldF9hbGxvY19pZF9jb25maWcpOworCQlpZiAoQkNNX0VSUl9PSyAhPSByYykKKwkJeworCQkJQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorCQkJCQkiRmFpbGVkIHRvIHVwZGF0ZSByZWxhdGVkIGZsb3dzIHBvbl9pZCA9ICVkIG9udV9pZCA9ICVkICglcylcbiIsIGxvZ2ljYWxfcG9uLCBwX3hncG9uX29udV9rZXktPm9udV9pZCwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKwkJCWJyZWFrOworCQl9CisJCQorICAgIH13aGlsZSgwKTsKKyAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBAYnJpZWYgSGFuZGxlciBmdW5jdGlvbiBmb3IgTWFwbGUgYXV0byBpbmRpY2F0aW9ucyBmb3IgeGdwb24gKFhHLVBPTjEpIEFsbG9jIElkCisgKgorICogQHBhcmFtIGRldmljZV9pZCB0aGUgbWFwbGUgZGV2aWNlIGlkIGdlbmVyYXRpbmcgdGhlIGN1cnJlbnQgaW5kaWNhdGlvbgorICogQHBhcmFtIHBfbXNnIHBvaW50ZXIgdG8gdGhlIG1hcGxlIGluZGljYXRpb24gbWVzc2FnZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1hY191dGlsX2luZGljYXRpb25faGFuZGxlX2Zvcl94Z3Bvbl9hbGxvY19pZCAoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqcF9tc2cpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIHVpbnQzMl90IGxvZ2ljYWxfcG9uOworICAgIHRtX3NjaGVkX2luc3QqIHBfdG1fc2NoZWRfaW5zdCA9IE5VTEw7CQorCWRvCisJeyAgICAJCisgICAgICAgIGlmIChCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgPT0gcF9tc2ctPnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKnBfaW5kID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCopIHBfbXNnOworICAgICAgICAgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X3BoeXNpY2FsMmxvZ2ljYWwoZGV2aWNlX2lkLCBwX2luZC0+a2V5LnBvbl9uaSwgJmxvZ2ljYWxfcG9uKTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9tYWNfdXRpbCwKKwkJCQkgICAgIkZhaWxlZCB0byBnZXQgbG9naWNhbCBpZiBmcm9tIHBoeXNpY2FsIGlmIChkZXZpY2VfaWQgJWQgcGh5c2ljYWwgJWQgKSAoJXMpXG4iLCBkZXZpY2VfaWQsIHBfaW5kLT5rZXkucG9uX25pLCBiY21vc19zdHJlcnJvcihyYykpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEZpbmQgdG5fbW9kZSBpbnN0IG93bmVkIGJ5IHRoYXQgYWxsb2NfaWQgYW5kIG5pICovCisgICAgICAgICAgICBwX3RtX3NjaGVkX2luc3QgPSAgdG1fc2NoZWRfZmluZF9hZ2dfcG9ydF9ub2RlKGxvZ2ljYWxfcG9uLCBwX2luZC0+a2V5LmFsbG9jX2lkKTsKKyAgICAgICAgICAgIGlmIChOVUxMID09IHBfdG1fc2NoZWRfaW5zdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorCQkJCSAgICAiRmFpbGVkIHRvIGZpbmQgdG0gc2NoZWQgb3duZWQgYnkgdGhhdCBhZ2cgcG9ydCAoaW50ZiAlZCBpZCAlZClcbiIsIGxvZ2ljYWxfcG9uLHBfaW5kLT5rZXkuYWxsb2NfaWQpOworCQkJCXJjID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICAgICAJfQorCisgICAgICAgICAgICAvKnRoZSB0bSBvd25lZCBieSB0aGF0IGFsbG9jIGZvdW5kLCB1cGRhdGUgaXQgd2l0aCB0aGUgaW5kKi8KKyAgICAgICAgICAgIG1hY191dGlsX3JlcG9ydF90bV9zY2hlZF9zZXRfaW5kaWNhdGlvbihwX3RtX3NjaGVkX2luc3QtPnJlcV90bV9zY2hlZF9pbmZvLmtleSAscF9tc2ctPmVyciwgcF9pbmQtPmRhdGEuc3RhdHVzKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoganVzdCBnZXQgdGhlIHBvbiBrZXkgYnkgdHlwZWNhc3RpbmcgdG8gYSBkdW1teSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgKnBfcG9uX2tleSA9ICYoKChiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQqKXBfbXNnKS0+a2V5KTsKKyAgICAKKyAgICAgICAgICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9waHlzaWNhbDJsb2dpY2FsKGRldmljZV9pZCwgcF9wb25fa2V5LT5wb25fbmksICZsb2dpY2FsX3Bvbik7CisgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IGxvZ2ljYWwgaWYgZnJvbSBwaHlzaWNhbCBpZiAoZGV2aWNlX2lkICVkIHBoeXNpY2FsICVkICkgKCVzKVxuIiwgZGV2aWNlX2lkLCBwX3Bvbl9rZXktPnBvbl9uaSwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihsb2dpY2FsX3BvbiksCisgICAgICAgICAgICAgICAgICAgICJVbmhhbmRsZWQgbWVzc2FnZSBpbmRpY2F0aW9uIGZvciBvYmogWEdQT05fQUxMT0MgZ3JvdXAgJWQgIgorICAgICAgICAgICAgICAgICAgICAic3ViZ3JvdXAgJWQgKElnbm9yZWQpXG4iLCBwX21zZy0+Z3JvdXAsIHBfbXNnLT5zdWJncm91cCk7CisgICAgICAgIH0KKworCX0KKwl3aGlsZSAoMCk7CisgICAgcmV0dXJuIHJjOworfQorCisKKy8qKgorICogQGJyaWVmICBNYXBsZSBhdXRvIGluZGljYXRpb24gcmVnaXN0ZXIgZm9yIHNwZWNpZmljIHhncG9uIChYRy1QT04xKSBiYXNlZCBpbmRpY2F0aW9ucworICoKKyAqIEBwYXJhbSBwX3J4X2NmZyAgICAgICAgIGhhbmRsZXIgY29uZmlnIHN0cnVjdHVyZQorICogQHBhcmFtICBkZXZpY2VfaWQgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgZGV2aWNlIGlkIChmb3IgbXVsdGlwbGUgZGV2aWNlcyBzdXBwb3J0KSAKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX3JlZ2lzdGVyX2Zvcl94Z3Bvbl9hdXRvX2luZGljYXRpb25zIChzdHJ1Y3QgYmNtb2x0X3J4X2NmZyAqcF9yeF9jZmcsIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgcmV0dXJuIF9tYWNfdXRpbF9yZWdpc3Rlcl9mb3JfYXV0b19pbmRpY2F0aW9ucyAocF9yeF9jZmcsIG1hY191dGlsX3hncG9uX2luZF9oYW5kbGVycywgQkNNX1NJWkVPRkFSUkFZKG1hY191dGlsX3hncG9uX2luZF9oYW5kbGVycyksZGV2aWNlX2lkKTsKK30KKworCisvKioKKyAqIEBicmllZiBjb21tb24gYWNjZXNzIHRlcm1pbmFsIHNldCBmb3IgMTBHIHBvbiBpZgorICovCisKK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXRfZm9yXzEwR19pdHVfcG9uIChiY21vbHRfZGV2aWNlX2NmZyBkZXZfY2ZnLCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIG5uaV9zcGVlZF9jZmc7CisKKyNpZmRlZiBRQVhfU1dJVENICisJCS8qIHVudGlsIHNwZWVkIGlzIGNvbmZpZ3VyYWJsZSB0aHJvdWdoIHRvcG9sb2d5IHNldHRpbmdzIGhhcmRjb2RlIGl0IGJhc2VkIG9uIHN3aXRjaCB0eXBlICovIAorCQlCQ01fTE9HKElORk8sIGxvZ19pZF9tYWNfdXRpbCwgIm5uaSBzcGVlZCBpczogMTBHXG4iKTsKKwkJbm5pX3NwZWVkX2NmZy5maXJzdF9oYWxmID0gQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEwOworCQlubmlfc3BlZWRfY2ZnLnNlY29uZF9oYWxmID0gQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEwOworCQlCQ01PTFRfQ0ZHX1BST1BfU0VUKCZkZXZfY2ZnLCBkZXZpY2UsIG5uaV9zcGVlZCwgbm5pX3NwZWVkX2NmZyk7CisjZW5kaWYKKwkKKwkJcmMgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZkZXZfY2ZnLmhkcik7CisKKwkJcmV0dXJuIHJjOworfQorCisKKy8qKgorICogQGJyaWVmIGFjY2VzcyB0ZXJtaW5hbCBzZXQgZm9yIHhncG9uMV84CisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXRfZm9yX3hncG9uXzggKGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3BfdHlwZSwgYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7fTsKKyAgICBiY21vbHRfZGV2aWNlX2NmZyBkZXZfY2ZnOworCisgICAgcmMgPSBtYXBsZV9hY2Nlc3NfdGVybWluYWxfc2V0X2NvbW1vbihwX2FjY190ZXJtLCBvcF90eXBlLCBkZXZpY2VfaWQpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmRldl9jZmcsIGRldmljZSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZkZXZfY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlLCBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fOF9YKTsKKworICAgIHJjID0gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfMTBHX2l0dV9wb24oZGV2X2NmZyxkZXZpY2VfaWQpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQkKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcmV0dXJuIG1hcGxlX2FjY2Vzc190ZXJtaW5hbF9jb25uZWN0X2NvbW1vbihkZXZpY2VfaWQpOworfQorCisKKy8qKgorICogQGJyaWVmIGFjY2VzcyB0ZXJtaW5hbCBzZXQgZm9yIHhnc18yXzEwCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2FjY2Vzc190ZXJtaW5hbF9zZXRfZm9yX3hncyAoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSwgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcF90eXBlLCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHt9OworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGRldl9jZmc7CisKKyAgICByYyA9IG1hcGxlX2FjY2Vzc190ZXJtaW5hbF9zZXRfY29tbW9uKHBfYWNjX3Rlcm0sIG9wX3R5cGUsIGRldmljZV9pZCk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHJldHVybiByYzsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmZGV2X2NmZywgZGV2aWNlLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmRldl9jZmcsIGRldmljZSwgc3lzdGVtX21vZGUsIEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HKTsKKworICAgIHJjID0gbWFjX3V0aWxfYWNjZXNzX3Rlcm1pbmFsX3NldF9mb3JfMTBHX2l0dV9wb24oZGV2X2NmZywgZGV2aWNlX2lkKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykJCisgICAgICAgIHJldHVybiByYzsKKworICAgIHJldHVybiBtYXBsZV9hY2Nlc3NfdGVybWluYWxfY29ubmVjdF9jb21tb24oZGV2aWNlX2lkKTsKK30KKworCisvKiogCisgICogQGJyaWVmIHBvc3QgYWNjZXNzIHRlcm1pbmFsIHVwIGNvbmZpZ3VyYXRpb25zIG9uIE1hcGxlCisgICovCitiY21vc19lcnJubyBtYWNfdXRpbF9hY2Nlc3NfdGVybWluYWxfcG9zdF9pbmRpY2F0aW9uX3NldF9mb3JfeGdwb25feGdzKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9kZXZpZCBkdW1teTsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9pZl9pZDsKKyAgICB1aW50MzJfdCBsb2dpY2FsX3BvbiA9IEJDTV9UT1BPX1BPTl9JTlZBTElEOworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkgbmlfa2V5ID0ge307CisgICAgYmNtb2x0X3hncG9uX25pX2NmZyBuaV9jZmcgPSB7fTsKKyAgICBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gID0ge307CisgICAgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIHNuX2FjcXVpc2l0aW9uX2NmZyA9IHt9OworICAgIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZyB4Z3Bvbl9uaV9hdXRvX2NmZyA9IHt9OyAgLyogbWFpbiBhdXRvIGNmZyBhcGkgc3RydWN0ICovCisKKyAgICAvKiBjb25maWd1cmUgb25lIHRpbWUgc2V0dGluZ3MgZm9yIGFsbCB0aGUgaW50ZXJmYWNlcyBvbiB0aGlzIGRldmljZSAqLworICAgIEJDTV9UT1BPX0RFVl9GT1JfRUFDSF9QT04oZGV2aWNlX2lkLCBsb2dpY2FsX3BvbikKKyAgICB7CisgICAgICAgIC8qIGdldCBwaHlzaWNhbCBpbnRlcmZhY2UgZnJvbSBsb2dpY2FsIGludGVyZmFjZSAqLworICAgICAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfbG9naWNhbDJwaHlzaWNhbCAobG9naWNhbF9wb24sICZkdW1teSwgJnBoeXNpY2FsX2lmX2lkKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihsb2dpY2FsX3BvbiksCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHBoeXNpY2FsIGlmIGZyb20gbG9naWNhbCBpZiAoJXMpXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBuaV9rZXkucG9uX25pID0gcGh5c2ljYWxfaWZfaWQ7IAorCisgICAgICAgIC8qIFNldCB0aGUgU04gYWNxdWlzaXRpb24gbW9kZSB0byBlbmFibGUgKi8KKyAgICAgICAgQkNNT0xUX0NGR19JTklUKCZuaV9jZmcsIHhncG9uX25pLCBuaV9rZXkpOworCisgICAgICAgIHNuX2FjcXVpc2l0aW9uX2NmZy5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOworICAgICAgICBzbl9hY3F1aXNpdGlvbl9jZmcuaW50ZXJ2YWwgPSA1MDAwOworICAgICAgICBzbl9hY3F1aXNpdGlvbl9jZmcub251X3Bvc3RfZGlzY292ZXJ5X21vZGUgPSBCQ01PTFRfT05VX1BPU1RfRElTQ09WRVJZX01PREVfTk9ORTsKKyAgICAgICAgc25fYWNxdWlzaXRpb25fY2ZnLmJ1cnN0X3Byb2ZpbGUgPSAwOyAgLyogUmFuZ2luZyBidXJzdCBwcm9maWxlIC0gTm8gRkVDICovCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJm5pX2NmZywgeGdwb25fbmksIHNuX2FjcXVpc2l0aW9uLCBzbl9hY3F1aXNpdGlvbl9jZmcpOworCisgICAgICAgIC8qIFVubGlrZSBHUE9OLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvbiBNYXBsZSBmb3IgWEctUE9OMSBpcyBub3QgdG8gZGVhY3RpdmF0ZSB0aGUgT05VIGluIHRoZSBiZWxvdyBjYXNlcworICAgICAgICAgKiBzbyBoZXJlIHdlIHNwZWNpZmljYWxseSBjb25maWd1cmUgdGhlIE1hcGxlIHRvIGJlaGF2ZSBvbiBYRy1QT04xIGFzIGl0IGRvZXMgb24gR1BPTiAqLworICAgICAgICBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5hY2tfdGltZW91dCA9IEJDTU9TX1RSVUU7CisgICAgICAgIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxva2kgPSBCQ01PU19UUlVFOworICAgICAgICBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb3MgPSBCQ01PU19UUlVFOworICAgICAgICBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5vbnVfYWxhcm1zID0gQkNNT1NfVFJVRTsKKyAgICAgICAgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uc2ZpID0gQkNNT1NfVFJVRTsKKyAgICAgICAgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24udGl3aSA9IEJDTU9TX1RSVUU7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJm5pX2NmZywgeGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbik7CisKKyAgICAgICAgcmMgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZuaV9jZmcuaGRyKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihsb2dpY2FsX3BvbiksCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IHNuIGFjcXVpc2l0aW9uIGFuZCBhdXRvbWF0aWMgb251IGRlYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uICglcyksIgorICAgICAgICAgICAgICAgICAgICAiIGRldmljZV9pZD0lZCwgbmlfa2V5LnBvbl9uaT0lZCwgZXJyX3RleHQ9JXMpXG4iLAorICAgICAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksIGRldmljZV9pZCwgbmlfa2V5LnBvbl9uaSwgbmlfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIHR1cm4gb2ZmIHRoZSBhdXRvIGluZGljYXRpb24gbWVzc2FnZXMgZm9yIHhncG9uX25pLnNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQgICovCisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZ4Z3Bvbl9uaV9hdXRvX2NmZywgeGdwb25fbmksIG5pX2tleSk7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmeGdwb25fbmlfYXV0b19jZmcsIHhncG9uX25pLCBzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0LCBCQ01PU19GQUxTRSk7CisgICAgICAgIHJjID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZ4Z3Bvbl9uaV9hdXRvX2NmZy5oZHIpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYobG9naWNhbF9wb24pLAorICAgICAgICAgICAgICAgICAgICAiYmNtb2x0X2F1dG9fY2ZnX3NldCBmb3IgeGdwb25fbmkuc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwgRmFpbGVkICglcyksIGVycl90ZXh0PSVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCB4Z3Bvbl9uaV9hdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKworICAgICAgICAgICAgLyogaWdub3JlIGFueSBlcnJvciwganVzdCBjb250aW51ZSBhbnl3YXkgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiBDb21tYW5kIFNldCBzZXR1cCByb3V0aW5lIGZvciBpbnRlcmZhY2UgdXAgdG8gbWFjIGFwcGxpY2F0aW9uIGZvciB4Z3BvbiAoWEctUE9OMSkKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IGlmX2ZzbSBpbiB0aGUgQkFMIGNvcmUgdG8gaW5pdGlhbGl6ZSB0aGUgY29tbWFuZAorICogc2V0IHRvIHVwIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIG1hYyBhcHBsaWNhdGlvbi4gVGhlIGNtZHNldCBhY3R1YWxseQorICogY29uc2lzdHMgb2YgdHdvIGNvbW1hbmRzLCBvbmUgaXMgdG8gc2VuZCB0aGUgaWYgdXAgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBtYWMKKyAqIEFwcCBhbmQgaGFuZGxlIHRoZSByZWxldmFudCByZXNwb25zZSwgdGhlIG90aGVyIGlzIHRvIGhhbmRsZSB0aGUgaW5kaWNhdGlvbiBtZXNzYWdlCisgKiBmcm9tIHRoZSBtYWMgQVBQIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuCisgKgorICogQHBhcmFtIHBfaW50ZXJmYWNlX2luc3QgIFBvaW50ZXIgdG8gaW50ZXJmYWNlIGluc3RhbmNlCisgKiBAcGFyYW0gb3BfdHlwZSAgICAgICAgICAgT3BlcmF0aW9uIHR5cGUgb24gYWNjZXNzIHRlcm1pbmFsL2ludGVyZmFjZSBpbnN0YW5jZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2ludGVyZmFjZV9zZXRfZm9yX3hncG9uKGFjY190ZXJtX2ludGVyZmFjZSAqcF9pbnRlcmZhY2VfaW5zdCwgYmFsX3V0aWxfb3Blcl9pZiBvcF90eXBlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGJjbWJhbF9pbnRlcmZhY2VfY2ZnICpwX2ludGVyZmFjZV9yZXEgPSAmKHBfaW50ZXJmYWNlX2luc3QtPmFwaV9yZXFfaW50X29ial9pbmZvKTsKKyAgICBiY21iYWxfaW50ZXJmYWNlX2tleSBpbnRmX2tleSA9IHBfaW50ZXJmYWNlX3JlcS0+a2V5OworCisgICAgZG8KKyAgICB7CisgICAgICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgICAgIHVpbnQzMl90IHBoeXNpY2FsX2lmX2lkOworCisgICAgICAgIC8qIGdldCBwaHlzaWNhbCBpbnRlcmZhY2UgZnJvbSBsb2dpY2FsIGludGVyZmFjZSAqLworICAgICAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfbG9naWNhbDJwaHlzaWNhbCAoaW50Zl9rZXkuaW50Zl9pZCwgJmRldmljZV9pZCwgJnBoeXNpY2FsX2lmX2lkKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpbnRmX2tleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgcGh5c2ljYWwgaWYgZnJvbSBsb2dpY2FsIGlmICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlIG9wZXJfbmk7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkgbmlfa2V5ID0geyAucG9uX25pID0gcGh5c2ljYWxfaWZfaWQgfTsKKyAgICAgICAgYmNtb2x0X3hncG9uX3RyeF9jZmcgY2ZnID0ge307CisgICAgICAgIGJjbW9sdF94Z3Bvbl90cnhfa2V5IHRyeF9rZXkgPSB7IC5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZCB9OworICAgICAgICBiY21vbHRfeGdwb25fdHJ4X3R5cGUgdHJ4X3R5cGU7CisKKyAgICAgICAgaWYgKEJBTF9VVElMX09QRVJfSUZfVVAgPT0gb3BfdHlwZSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKiBzZXQgdGhlIHBvbl9uaSB0cmFuc2NlaXZlciBjb25maWd1cmF0aW9uICovCisgICAgICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fdHJ4LCB0cnhfa2V5KTsKKworICAgICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgYnVyc3QgcHJvZmlsZXMgKi8KKyAgICAgICAgICAgIHJjID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaW50Zl9rZXkuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCB0cnggY29uZmlndXJhdGlvbiAoJXMpLCBlcnJfdGV4dD0lc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgdHJhbnNjZWl2ZXIsIHRoZW4gdXNlIHRoZSBkZWZhdWx0ICovCisgICAgICAgICAgICBpZiAoQkNNT1NfVFJVRSAhPSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfaW50ZXJmYWNlX3JlcSwgaW50ZXJmYWNlLCB0cmFuc2NlaXZlcl90eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihCQ01fVE9QT19QT05fTU9ERV9YR1BPTiA9PSBiY21fdG9wb19wb25fZ2V0X3Bvbl9tb2RlKGludGZfa2V5LmludGZfaWQpKQorICAgICAgICAgICAgICAJeworICAgICAgICAgICAgICAgICAgICAvKiBUaGUgdXNlciBkaWRuJ3QgY2hvb3NlIGEgdHJhbnNjZWl2ZXIgdHlwZSwgc28gb3ZlcnJpZGUgaXQgaGVyZQorICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBYR1BPTgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2ludGVyZmFjZV9yZXEsIGludGVyZmFjZSwgdHJhbnNjZWl2ZXJfdHlwZSwgQkNNQkFMX01BQ19VVElMX1RSWF9UWVBFX0RFRkFVTFRfWEdQT04pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChCQ01fVE9QT19QT05fTU9ERV9YR1MgPT0gYmNtX3RvcG9fcG9uX2dldF9wb25fbW9kZShpbnRmX2tleS5pbnRmX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB1c2VyIGRpZG4ndCBjaG9vc2UgYSB0cmFuc2NlaXZlciB0eXBlLCBzbyBvdmVycmlkZSBpdCBoZXJlCisgICAgICAgICAgICAgICAgICAgICAqIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUgZm9yIFhHUworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2ludGVyZmFjZV9yZXEsIGludGVyZmFjZSwgdHJhbnNjZWl2ZXJfdHlwZSwgQkNNQkFMX01BQ19VVElMX1RSWF9UWVBFX0RFRkFVTFRfWEdTKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTZXQgdGhlIChkZWZhdWx0IG9yIGNob3NlbikgdHJhbnNjZWl2ZXIgY29uZmlndXJhdGlvbiBpbnRvIHRoZSBNQUMgZGV2aWNlICovCisKKyAgICAgICAgICAgIHRyeF90eXBlID0gbWFjX3hncG9uX2JhbF90cnhfdHlwZTJiY202ODYyMF90cnhfdHlwZShwX2ludGVyZmFjZV9yZXEtPmRhdGEudHJhbnNjZWl2ZXJfdHlwZSk7CisKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlLCB0cnhfdHlwZSk7CisKKyAgICAgICAgICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaW50Zl9rZXkuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCB0cnggY29uZmlndXJhdGlvbiAoJXMpLCBlcnJfdGV4dD0lc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE5vIG5lZWQgdG8gQ29uZmlndXJlIHBvbl9uaSBJbnRlci13b3JraW5nIG9uIFhHLVBPTjEgYXMgCisgICAgICAgICAgICAgKiBkaXJlY3QgbW9kZSBpcyB0aGUgb25seSBvcHRpb24gYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtIG1vZGUgCisgICAgICAgICAgICAgKi8KKyAgICAgICAgfQorCisKKyAgICAgICAgLyogaW52b2tlIHRoZSBwb25fbmkgc3RhdGUgY2hhbmdlIHRvIHRoZSByZXF1ZXN0ZWQgc3RhdGUgKi8KKyAgICAgICAgQkNNT0xUX09QRVJfSU5JVCgmb3Blcl9uaSwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIG5pX2tleSk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyX25pLCB4Z3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwgcG9uX3N0YXRlLAorICAgICAgICAgICAgKEJBTF9VVElMX09QRVJfSUZfVVAgPT0gb3BfdHlwZSkgPworICAgICAgICAgICAgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1dPUktJTkcgOiBCQ01PTFRfUE9OX09QRVJBVElPTl9JTkFDVElWRSk7CisKKyAgICAgICAgcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blcl9uaS5oZHIpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGludGZfa2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvICVzIChzdWJtaXQpIHBvbiBpbnRlcmZhY2UgKCVzKSwgZXJyX3RleHQ9JXNcbiIsCisgICAgICAgICAgICAgICAgICAgIChCQUxfVVRJTF9PUEVSX0lGX1VQID09IG9wX3R5cGUpID8gImFjdGl2YXRlIiA6ICJkZWFjdGl2YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCBvcGVyX25pLmhkci5oZHIuZXJyX3RleHQpOworICAgICAgICB9CisKKyAgICB9IHdoaWxlICgwKTsKKworICAgIGlmIChCQ01fRVJSX09LID09IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGludGZfa2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICJTdWJtaXR0ZWQgSU5URVJGQUNFLSVzIG9wZXJhdGlvbiBmb3IgSUYgJWRcbiIsCisgICAgICAgICAgICAgICAgKEJBTF9VVElMX09QRVJfSUZfVVAgPT0gb3BfdHlwZSkgPyAiVVAiIDogIkRPV04iLAorICAgICAgICAgICAgICAgIGludGZfa2V5LmludGZfaWQpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiBtYWNfdXRpbF92YWxpZGF0ZV9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZm9fZm9yX3hncG9uIChYRy1QT04xKQorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHZhbGlkYXRlIGFsbCBpbnB1dCBhdHRyaWJ1dGVzIHJlcXVpcmVkIGZvciBhIHN1YiB0ZXJtIHNldHRpbmcKKyAqIHJlY2VpdmVkIGZyb20gY29yZSBmb3IgR1BPTgorICoKKyAqIEBwYXJhbSBwX3N1Yl90ZXJtX3JlcSAgICAgICBBIHBvaW50ZXIgdG8gYSBzdWJzY3JpYmVyIHRlcm1pbmFsIG9iamVjdAorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gbWFjX3V0aWxfdmFsaWRhdGVfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmZvX2Zvcl94Z3Bvbihjb25zdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgKnBfc3ViX3Rlcm1fcmVxKQoreworICAgIGlmKEJDTUJBTF9TVEFURV9VUCA9PSBwX3N1Yl90ZXJtX3JlcS0+ZGF0YS5hZG1pbl9zdGF0ZSkKKyAgICB7CisgICAgICAgIGlmICghQkNNQkFMX0NGR19QUk9QX0lTX1NFVCAocF9zdWJfdGVybV9yZXEsIHN1YnNjcmliZXJfdGVybWluYWwsIHNlcmlhbF9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgIlNlcmlhbCBudW1iZXIgaXMgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIGZvciBhIHhncG9uIHN1YnNjcmliZXIgdGVybWluYWwsIGFuZCBpdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX01BTkRBVE9SWV9QQVJNX0lTX01JU1NJTkc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9zdWJfdGVybV9yZXEsIHN1YnNjcmliZXJfdGVybWluYWwsIHJlZ2lzdHJhdGlvbl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICAgICAiUmVnaXN0cmF0aW9uIGlkIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciBmb3IgYSB4Z3BvbiBzdWJzY3JpYmVyIHRlcm1pbmFsLCBhbmQgaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9NQU5EQVRPUllfUEFSTV9JU19NSVNTSU5HOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyoqCisgKiBAYnJpZWYgQ29tbWFuZCBTZXQgc2V0dXAgcm91dGluZSBmb3Igc3Vic2NyaWJlciB0ZXJtaW5hbCBjb25uZWN0IHRvIG1hYyBhcHBsaWNhdGlvbiBmb3IgeGdwb24gKFhHLVBPTjEpCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBzdWJfdGVybV9mc20gaW4gdGhlIEJBTCBjb3JlIHRvIGluaXRpYWxpemUgdGhlIGNvbW1hbmQKKyAqIHNldCB0byBjb25uZWN0IHRoZSBzdWJzY3JpYmVyIHRlcm1pbmFsIG9mIHRoZSBtYWMgYXBwbGljYXRpb24uIFRoZSBjbWRzZXQgYWN0dWFsbHkKKyAqIGNvbnNpc3RzIG9mIHR3byBjb21tYW5kcywgb25lIGlzIHRvIHNlbmQgdGhlIHN1Yl90ZXJtIHJlcXVlc3QgbWVzc2FnZSB0byB0aGUgbWFjCisgKiBBcHAgYW5kIGhhbmRsZSB0aGUgcmVsZXZhbnQgcmVzcG9uc2UsIHRoZSBvdGhlciBpcyB0byBoYW5kbGUgdGhlIGluZGljYXRpb24gbWVzc2FnZQorICogZnJvbSB0aGUgbWFjIEFQUCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLgorICoKKyAqIEBwYXJhbSBwX3N1Yl90ZXJtX2luc3QgICBBIHBvaW50ZXIgdG8gYSBzdWJzY3JpYmVyIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gb3BfdHlwZSAgICAgICAgICBUeXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQgb24gdGhlIHN1YnNjcmliZXIgdGVybWluYWwgaW5zdGFuY2UKKyAqIEBwYXJhbSBpc19wb3N0X2Rpc2NvdmVyeSAgVXNlZCBmb3IgQURELCBpbmRpY2F0ZXMgaWYgdGhpcyBpcyBhIHJlcXVlc3QgYWZ0ZXIgYSBPTlUgZGlzY292ZXJ5CisgKgorICogQHJldHVybiBiY21vc19lcnJubworICoKKyAqIEBub3RlIHdlIGNvbmZpZ3VyZSBNYXBsZSBmb3IgT05VIGluIDIgc3RhZ2VzOgorICogIFxsaSBTdGFnZSAxOiBkbyBjZmdfc2V0IHdpdGggdGhlIHNlcmlhbCBudW0sIHBhc3N3b3JkLCBvbWNpIHBvcnQsIGFzIHBhcnQgb2YgZmlyc3Qgc3ViX3Rlcm1fc2V0IGZyb20gQ29yZQorICogIFxsaSBTdGFnZSAyOiBzZXQgdGhlIE9OVSBzdGF0ZSB0byBBQ1RJVkUgdXNpbmcgb3Blcl9zdWJtaXQsIGFzIHBhcnQgb2Ygc2Vjb25kIHN1Yl90ZXJtX3NldCBmcm9tIENvcmUgKGFmdGVyCisgKiAgICAgICAgICAgICAgICAgIHJlY2VpdmluZyBhIERpc2NvdmVyeSBpbmRpY2F0aW9uKQorICovCitiY21vc19lcnJubyBtYWNfdXRpbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3NldF9mb3JfeGdwb24oc3ViX3Rlcm1faW5zdCAqcF9zdWJfdGVybV9pbnN0LCBiYWxfdXRpbF9vcGVyX3N1Yl90ZXJtIG9wX3R5cGUsIGJjbW9zX2Jvb2wgaXNfcG9zdF9kaXNjb3ZlcnkpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnICpwX3N1Yl90ZXJtX3JlcSA9ICZwX3N1Yl90ZXJtX2luc3QtPmFwaV9yZXFfc3ViX3Rlcm1faW5mbzsKKworICAgIGRvCisgICAgeworICAgICAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgICAgICB1aW50MzJfdCBwaHlzaWNhbF9pZl9pZDsKKyAgICAgICAgLyogZ2V0IHBoeXNpY2FsIGludGVyZmFjZSBmcm9tIGxvZ2ljYWwgaW50ZXJmYWNlICovCisgICAgICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9sb2dpY2FsMnBoeXNpY2FsIChwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQsICZkZXZpY2VfaWQsICZwaHlzaWNhbF9pZl9pZCk7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgcGh5c2ljYWwgaWYgZnJvbSBsb2dpY2FsIGlmICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZyA9IHt9OworICAgICAgICBiY21vbHRfeGdwb25fb251X2NmZyBvbnVfY2ZnX2dldCA9IHt9OworICAgICAgICBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUgb3BlciA9IHt9OworICAgICAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7fTsKKyAgICAgICAgYmNtb2x0X29udV9vcGVyYXRpb24gbmV3X29udV9zdGF0ZTsKKworICAgICAgICAvKiBzZXQgdGhlIG9udSBrZXkgLSBzZXQgaXQgdG8gdGhlIHBoeXNpY2FsIGlmIGlkICovCisgICAgICAgIGtleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICAgICAga2V5Lm9udV9pZCA9IHBfc3ViX3Rlcm1fcmVxLT5rZXkuc3ViX3Rlcm1faWQ7CisKKyAgICAgICAgLyogc2V0IHRoZSBvbnUga2V5ICovCisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisKKyAgICAgICAvKiBpbnZva2Ugb251IHN0YXRlIGNoYW5nZSBvcGVyYXRpb24gdG8gdGhlIG5ldyBzdGF0ZSAqLworICAgICAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisKKyAgICAgICAgaWYoQkFMX1VUSUxfT1BFUl9TVUJfVEVSTV9DTEVBUiA9PSBvcF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBEZWxldGUgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIE9OVSAqLworICAgICAgICAgICAgcmMgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNsZWFyIG9udSBjb25maWd1cmF0aW9uKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE5vIGluZGljYXRpb24gZnJvbSBNYXBsZSB3aWxsIHJlc3VsdCBmcm9tIHRoZSBjbGVhciBvcGVyYXRpb24KKyAgICAgICAgICAgICAqIHNvIGZha2UgaXQgaGVyZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfc3ViX3Rlcm1fZXZlbnQocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3ViX3Rlcm1fcmVxLT5rZXkuc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJjbW9sdF9zZXJpYWxfbnVtYmVyICopTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfVVRJTF9PUEVSX1NVQl9URVJNX0NMRUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjLCByYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNfVVRJTF9ERUFDVElWQVRJT05fRkFJTF9SRUFTT05fTk9ORSwgQkNNQkFMX0lOVkFMSURfVFVOTkVMX0lEKTsKKworICAgICAgICAgICAgLyogTm8gZnVydGhlciBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkIGZvciB0aGUgQ0xFQVIgb3BlcmF0aW9uICovCisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihCQUxfVVRJTF9PUEVSX1NVQl9URVJNX0FERCA9PSBvcF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmaXJzdCBkbyBhIGdldCwgdG8gc2VlIGlmIG9udSBpcyBpbiBhY3RpdmUgc3RhdGUgYWxyZWFkeSAqLworICAgICAgICAgICAgQkNNT0xUX0NGR19JTklUKCZvbnVfY2ZnX2dldCwgeGdwb25fb251LCBrZXkpOworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmb251X2NmZ19nZXQsIHhncG9uX29udSwgb251X3N0YXRlKTsKKyAgICAgICAgICAgIHJjID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmb251X2NmZ19nZXQuaGRyKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgb251IGNvbmZpZ3VyYXRpb24oJXMpLCBlcnJfdGV4dD0lcywgLi4uIGNvbnRpbnVlIHRvIGNvbmZpZ3VyZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwgb251X2NmZ19nZXQuaGRyLmhkci5lcnJfdGV4dCk7CisKKyAgICAgICAgICAgICAgICAvKiBkb24ndCBicmVhaywgYnV0IGNvbnRpbnVlIHdpdGggdGhlIHNldCBhbnl3YXlzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBPTlUgc3RhdGUgPSAlZCwgW3Bvbl9uaT0lZCwgb251X2lkPSVkXSwgQkVGT1JFIGRvaW5nIGNmZ19zZXQgb24gTWFwbGVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvbnVfY2ZnX2dldC5kYXRhLm9udV9zdGF0ZSwgb251X2NmZ19nZXQua2V5LnBvbl9uaSwgb251X2NmZ19nZXQua2V5Lm9udV9pZCk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKChCQ01fRVJSX09LID09IHJjKSAmJiAoQkNNT0xUX09OVV9TVEFURV9BQ1RJVkUgPT0gb251X2NmZ19nZXQuZGF0YS5vbnVfc3RhdGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IE9OVSBhbHJlYWR5IGluIGFjdGl2ZSBzdGF0ZSBkdXJpbmcgQURELiBTa2lwcGluZyBmdXJ0aGVyIGNvbmZpZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfc3ViX3Rlcm1fZXZlbnQocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdWJfdGVybV9yZXEtPmtleS5zdWJfdGVybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiY21vbHRfc2VyaWFsX251bWJlciAqKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfVVRJTF9PUEVSX1NVQl9URVJNX0FERCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjLCByYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX05PTkUsIEJDTUJBTF9JTlZBTElEX1RVTk5FTF9JRCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLyogc2V0IHRoZSBTTiAmIFJlZ2lzdHJhdGlvbiBJRCBvbmx5IGlmIGl0IGJlaW5nIGNvbmZpZ3VyZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovCisgICAgICAgICAgICBpZiAoQkNNT1NfRkFMU0UgPT0gaXNfcG9zdF9kaXNjb3ZlcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChiY21vbHRfc2VyaWFsX251bWJlciAqKSZwX3N1Yl90ZXJtX3JlcS0+ZGF0YS5zZXJpYWxfbnVtYmVyKSk7CisKKyAgICAgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoYmNtb2x0X2Fycl91OF8zNiAqKSZwX3N1Yl90ZXJtX3JlcS0+ZGF0YS5yZWdpc3RyYXRpb25faWQpKTsKKworICAgICAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZywgQkNNT1NfVFJVRSk7CisKKyAgICAgICAgICAgICAgICAvKiBSYW5naW5nIGJ1cnN0IHByb2ZpbGUgLSBObyBGRUMgKi8KKyAgICAgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlLCAwKTsKKworICAgICAgICAgICAgICAgIC8qIERhdGEgYnVyc3QgcHJvZmlsZSAtIE5vIEZFQyAqLworICAgICAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUsIDEpOworCisKKyAgICAgICAgICAgICAgICAvKiBYRy1QT04xIC0gTm8gbmVlZCB0byBzZXQgVVMgRkVDIC0gaXQgaXMgcGFydCBvZiB0aGUgYnVyc3QgcHJvZmlsZSAqLworICAgICAgICAgICAgICAgIC8qIFhHLVBPTjEgLSBObyBuZWVkIHRvIHNldCBPTlUgbWFuYWdlbWVudCBjaGFubmVsIHBvcnQgYXMgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBPTlUgSUQqLworCisgICAgICAgICAgICAgICAgcmMgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX3N1Yl90ZXJtX3JlcS0+a2V5LmludGZfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IG9udSBjb25maWd1cmF0aW9uKCVzKSwgZXJyX3RleHQ9JXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIEBub3RlIElmIHRoaXMgaXMgZmlyc3QgdGltZSBzZXQgZm9yIEFERCwgdGhlbiBza2lwIHNldHRpbmcgdGhlIE9OVSBzdGF0ZSBmb3Igbm93LgorICAgICAgICAgICAgICAgICAqIFdhaXQgdW50aWwgT05VIERpc2NvdmVyeSBpcyByZWNlaXZlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgbmV3IG9udSBzdGF0ZSBmb3IgdGhlIEFERCBvcGVyYXRpb24KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nIE9OVSBzdGF0ZSB0byBhY3RpdmVcbiIpOworCisgICAgICAgICAgICBuZXdfb251X3N0YXRlID0gQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEJBTF9VVElMX09QRVJfU1VCX1RFUk1fUkVNT1ZFID09IG9wX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBPTlUgaXMgbm90IHByZXNlbnQsIHRoZW4gaXQgd2lsbCBuZXZlciByZXNwb25kIHRvIHRoZSBkZWFjdGl2YXRlIGNvbW1hbmQKKyAgICAgICAgICAgICAqIHdpdGggYW4gaW5kaWNhdGlvbiwgc28ganVzdCBhbGxvdyB0aGUgRlNNIHRvIGNvbnRpbnVlIGFzIGlmIGl0IGRpZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoQkNNQkFMX1NUQVRVU19OT1RfUFJFU0VOVCAhPSBwX3N1Yl90ZXJtX2luc3QtPmN1cnJlbnRfc3ViX3Rlcm1faW5mby5kYXRhLm9wZXJfc3RhdHVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBuZXcgb251IHN0YXRlIGZvciB0aGUgUkVNT1ZFIG9wZXJhdGlvbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfc3ViX3Rlcm1fcmVxLT5rZXkuaW50Zl9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyBPTlUgc3RhdGUgdG8gSU4tYWN0aXZlXG4iKTsKKworICAgICAgICAgICAgICAgIG5ld19vbnVfc3RhdGUgPSBCQ01PTFRfT05VX09QRVJBVElPTl9JTkFDVElWRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsICJCYWQgcmVxdWVzdCBmcm9tIGNvcmVcbiIpOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBEbyBvcGVyX3N1Ym1pdCB0byBzZXQgdGhlIE9OVSBzdGF0ZSAqLworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIG5ld19vbnVfc3RhdGUpOworICAgICAgICByYyA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgImJjbW9sdF9vcGVyX3N1Ym1pdCBGYWlsZWQgZm9yIG9udSBzdGF0ZSAgRmFpbGVkICglcyksIGVycl90ZXh0PSVzXG4iLAorICAgICAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksICYob3Blci5oZHIuaGRyLmVycl90ZXh0WzBdKSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIElmIHRoZSBPTlUgaXMgbm90IHByZXNlbnQsIHRoZW4gaXQgd2lsbCBuZXZlciByZXNwb25kIHRvIHRoZSBkZWFjdGl2YXRlIGNvbW1hbmQKKyAgICAgICAgICogd2l0aCBhbiBpbmRpY2F0aW9uLCBzbyBqdXN0IGFsbG93IHRoZSBGU00gdG8gY29udGludWUgYXMgaWYgaXQgZGlkLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoKEJDTU9MVF9PTlVfT1BFUkFUSU9OX0lOQUNUSVZFID09IG5ld19vbnVfc3RhdGUpICYmCisgICAgICAgICAgIChCQ01CQUxfU1RBVFVTX05PVF9QUkVTRU5UID09IHBfc3ViX3Rlcm1faW5zdC0+Y3VycmVudF9zdWJfdGVybV9pbmZvLmRhdGEub3Blcl9zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICBtYWNfdXRpbF9yZXBvcnRfc3ViX3Rlcm1fZXZlbnQocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3ViX3Rlcm1fcmVxLT5rZXkuc3ViX3Rlcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJjbW9sdF9zZXJpYWxfbnVtYmVyICopTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfVVRJTF9PUEVSX1NVQl9URVJNX1JFTU9WRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYywgcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDX1VUSUxfREVBQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX05PTkUsIEJDTUJBTF9JTlZBTElEX1RVTk5FTF9JRCk7CisgICAgICAgIH0KKworICAgIH0gd2hpbGUgKDApOworCisKKworICAgIGlmIChyYyA9PSBCQ01fRVJSX1NUQVRFKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAiJXMgZmFpbGVkIHRvIHNldCBzdGF0ZSwgcG9zc2libHkgYmVjYXVzZSBpbnRlcmZhY2UgaXMgbm90IGNvbmZpZ3VyZWQgeWV0LCBwb24gZmliZXIgZGlzY29ubmVjdCwgb3Igb251IGRpc2Nvbm5lY3Q6IHJjID0gJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgfQorICAgIGVsc2UgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9zdWJfdGVybV9yZXEtPmtleS5pbnRmX2lkKSwKKyAgICAgICAgICAgICAgICAiJXMgRmFpbGVkOiByYyA9ICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIEBicmllZiB2YWxpZGF0ZV9mbG93X2luZm8gZm9yIHhncG9uIChYRy1QT04xKQorICoKKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHZhbGlkYXRlIGFsbCBpbnB1dCBhdHRyaWJ1dGVzIHJlcXVpcmVkIGZvciBhIGZsb3cKKyAqIHNldHRpbmcgcmVjZWl2ZWQgZnJvbSBjb3JlIGZvciBYRy1QT04xCisgKgorICogQHBhcmFtIHBfZmxvd19yZXEgICAgIEEgcG9pbnRlciB0byBhIGZsb3cgb2JqZWN0CisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitiY21vc19lcnJubyBtYWNfdXRpbF92YWxpZGF0ZV9mbG93X2luZm9fZm9yX3hncG9uIChjb25zdCBiY21iYWxfZmxvd19jZmcgKnBfZmxvd19yZXEpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgaWYgKHBfZmxvd19yZXEtPmtleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSkKKyAgICB7CisgICAgICAgIGlmICghQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3dfcmVxLCBmbG93LCBhZ2dfcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICAgICAiYWdnIHBvcnQgaWQgaXMgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIGZvciBhbiBVUyBmbG93LCBhbmQgaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfTUFOREFUT1JZX1BBUk1fSVNfTUlTU0lORzsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorLyogQXMgdGhlcmUgaXMgbm8gaW5kaWNhdGlvbiBvbiBnZW0gcG9ydCBjb25maWd1cmF0aW9uIGNvbXBsZXRpb24sIGZvciB4Z3BvbgorICAgIHdlIHdpbGwgaGF2ZSB0byBpbml0aWF0ZSBxdWVyeWluZyBpdCByaWdodCBhZnRlciBjb25maWd1cmluZyBpdCBhbmQgcmV0cmlldmUgdGhlIGdlbSBwb3J0IHN0YXRlLgorICAgIHdlIGNhbiBub3QgYXNzdW1lIGl0IGlzIGFjdGl2YXRlZCAoZm9yIGV4YW1wbGUgaWYgdGhlIG9udSBpcyBub3QgcHJlc2VudCkKKyovCitzdGF0aWMgYmNtb3NfZXJybm8gbWFwbGVfbWFjX3hncG9uX3VwZGF0ZV9zdmNfcG9ydF9pbmRfZmxhZyAoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxLCBmbG93X2xpc3RfZW50cnkgKnBfbWFjX3V0aWxfZmxvd19lbnRyeSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBnZW1fa2V5ID0ge307CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBnZW1fY2ZnID0ge307CisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9pZl9pZDsKKyAgICAKKyAgICBHRVRfREVWSUNFX0lEX0FORF9QSFlTSUNBTF9JRF9GUk9NX0lGX0lEKHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCwgZGV2aWNlX2lkLCBwaHlzaWNhbF9pZl9pZCk7CisgICAgCisgICAgLyogc2V0IHRoZSBnZW0gcG9ydCBvYmplY3Qga2V5ICovCisgICAgZ2VtX2tleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICBnZW1fa2V5LmdlbV9wb3J0X2lkID0gcF9mbG93X3JlcS0+ZGF0YS5zdmNfcG9ydF9pZDsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmdlbV9jZmcsIHhncG9uX2dlbV9wb3J0LCBnZW1fa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZnZW1fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpOworICAgIAorICAgIHJjID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmZ2VtX2NmZy5oZHIpOworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYocF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwKKyAgICAgICAgICAgICIlcyBGQUlMRUQgdG8gZ2VtIHhncG9uX2dlbV9wb3J0IGNvbmZpZ3VyYXRpb24gOiBkZXZpY2VfaWQgPSAlZCBpZl9pZCA9ICVkIGdlbV9wb3J0X2lkID0gJWQgXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgZGV2aWNlX2lkLCBwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQsIHBfZmxvd19yZXEtPmRhdGEuc3ZjX3BvcnRfaWQpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICAKKyAgICBpZiAoIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkUgPT0gZ2VtX2NmZy5kYXRhLmdlbV9wb3J0X3N0YXRlKQorICAgIHsKKyAgICAgICAgcF9tYWNfdXRpbF9mbG93X2VudHJ5LT5pc193YWl0aW5nX2Zvcl9zdmNfcG9ydF9hY3RpdmUgPSBCQ01PU19GQUxTRTsgICAgCisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyoqCisgKiBAYnJpZWYgZmxvdyBzZXQgZm9yIHhncG9uIChYRy1QT04xKQorICogQHBhcmFtIHBfZmxvd19yZXEgICBwb2ludGVyIHRvIGZsb3cgcmVxdWVzdCBzdHJ1Y3R1cmUgZnJvbSBjb3JlCisgKiBAcGFyYW0gb3BfdHlwZSAgICAgIEFERCwgUkVNT1ZFIG9yIENMRUFSCisgKiBAcGFyYW0gcF9mbG93X2NvcmUgIGNvcmUgRlNNIERCIGZsb3cgY29udGV4dCBwYXNzZWQgYXMgYSBjb29raWUKKyAqCisgKiBAcmV0dXJuIGVycm5vICAgIGVycm9yCisgKgorICogQHRvZG8gc2hpZnQgdGhpcyBvdXQgdG8gbWFjIHNwZWNpZmljIGZpbGVzCisgKi8KK2JjbW9zX2Vycm5vIG1hY191dGlsX2Zsb3dfc2V0X2Zvcl94Z3BvbiAoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmVxLCBiYWxfdXRpbF9vcGVyX2Zsb3cgb3BfdHlwZSwgZmxvd19pbnN0ICpwX2Zsb3dfY29yZSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDE2X3QgcGVyX2Zsb3dfbW9kZV92bGFuX2lkID0gMDsgLyogaG9sZCB0aGUgdmFsdWUgb2YgdGhlIHZsYW4gdGFnIHRvIHVzZSBpbiBwZXItZmxvdyBtb2RlICovCisgICAgdWludDhfdCBwYml0c192YWwgPSAwOworICAgIGZsb3dfbGlzdF9lbnRyeSAqcF9tYWNfdXRpbF9mbG93X2VudHJ5ID0gTlVMTDsKKworICAgIC8qIENoZWNrIHRoZSBvcGVyYXRpb24gaWQgKi8KKyAgICBpZiAoKEJBTF9VVElMX09QRVJfRkxPV19BREQgIT0gb3BfdHlwZSkgICAgJiYKKyAgICAgICAgKEJBTF9VVElMX09QRVJfRkxPV19SRU1PVkUgIT0gb3BfdHlwZSkgJiYKKyAgICAgICAgKEJBTF9VVElMX09QRVJfRkxPV19DTEVBUiAhPSBvcF90eXBlKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIG1hY191dGlsIGZsb3cgb3BlcmF0aW9uICVkIFxuIiwgb3BfdHlwZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogZmxvdyBBZGQgb3IgTW9kaWZ5ICovCisgICAgaWYgKEJBTF9VVElMX09QRVJfRkxPV19BREQgPT0gb3BfdHlwZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAocF9mbG93X3JlcS0+a2V5LmZsb3dfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogdW5pY2FzdCBmbG93cyAqLworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNOgorICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBfZmxvd19yZXEtPmRhdGEuY2xhc3NpZmllci5vX3BiaXRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogb19wYml0cyAgY2FuIG9ubHkgdGFrZSBvbmUgcC1iaXQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgcGJpdHNfdmFsID0gcF9mbG93X3JlcS0+ZGF0YS5jbGFzc2lmaWVyLm9fcGJpdHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBiaXRzX3ZhbCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogY3JlYXRlIGEgZ2VtIHBvcnQgaWQgYW5kIHJlbGV2YW50IGZsb3cgZm9yIGEgc2luZ2xlIHBiaXQsIG9yIHdpdGggbm8gcGJpdCAqLworICAgICAgICAgICAgICAgIC8qIHBhc3Mgb24gdGhlIG9wIHR5cGUgYWxzbyB0byBzcGVjaWZ5IGlmIGl0IGlzIEZMT1dfQUREIE9SIEZMT1dfTU9ESUZZICovCisgICAgICAgICAgICAgICAgcmMgPSBtYXBsZV9tYWNfdW5pY2FzdF9mbG93X2FkZChwX2Zsb3dfcmVxLCBwYml0c192YWwsIHBlcl9mbG93X21vZGVfdmxhbl9pZCwgb3BfdHlwZSwgJnBfbWFjX3V0aWxfZmxvd19lbnRyeSk7CisgICAgICAgICAgICAgICAgaWYgKChCQ01fRVJSX09LICE9IHJjKSB8fCAoTlVMTCA9PSBwX21hY191dGlsX2Zsb3dfZW50cnkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogbWFyayBmbG93IGNvbmZpZ3VyYXRpb24gdG8gZGV2aWNlIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgIG1hY191dGlsX21hcmtfZmxvd19jb25maWdfY29tcGxldGUocF9tYWNfdXRpbF9mbG93X2VudHJ5KTsKKyAgICAgICAgICAgICAgICByYyA9IG1hcGxlX21hY194Z3Bvbl91cGRhdGVfc3ZjX3BvcnRfaW5kX2ZsYWcgKHBfZmxvd19yZXEsIHBfbWFjX3V0aWxfZmxvd19lbnRyeSk7CisJCQkJCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX0JST0FEQ0FTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IG1hcGxlX21hY19icm9hZGNhc3RfZmxvd19hZGQocF9mbG93X3JlcSwgcGVyX2Zsb3dfbW9kZV92bGFuX2lkLCBvcF90eXBlLCAmcF9tYWNfdXRpbF9mbG93X2VudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gZmxvdyB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcF9mbG93X3JlcS0+a2V5LmZsb3dfdHlwZSk7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKEJBTF9VVElMX09QRVJfRkxPV19SRU1PVkUgPT0gb3BfdHlwZSkgfHwKKyAgICAgICAgICAgICAoQkFMX1VUSUxfT1BFUl9GTE9XX0NMRUFSID09IG9wX3R5cGUpKQorICAgIHsKKyAgICAgICAgLyogZmluZCB0aGUgZmxvdyAqLworICAgICAgICBwX21hY191dGlsX2Zsb3dfZW50cnkgPSBfbWFjX3V0aWxfZGJfZmxvd19nZXRfd19mbG93X2tleShwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQsICYocF9mbG93X3JlcS0+a2V5KSk7CisgICAgICAgIGlmIChOVUxMID09IHBfbWFjX3V0aWxfZmxvd19lbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgaWYgKEJBTF9VVElMX09QRVJfRkxPV19DTEVBUiAhPSBvcF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICAgICAiJXM6IE5VTEwgbWFjIHV0aWwgZmxvdyBlbnRyeSB0byByZW1vdmU6IGZsb3cgaWQ6ICVkLCBmbG93X3R5cGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHBfZmxvd19yZXEtPmtleS5mbG93X2lkLAorICAgICAgICAgICAgICAgICAgICAocF9mbG93X3JlcS0+a2V5LmZsb3dfdHlwZSA9PSBCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNID8gInVwIjoiZG93biIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChwX2Zsb3dfcmVxLT5rZXkuZmxvd190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB1bmljYXN0IGZsb3dzICovCisgICAgICAgICAgICBjYXNlIEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU06CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiogUmVtb3ZlIHVuaWNhc3QgR0VNL0FsbG9jIElkIGZyb20gTWFwbGUgYW5kIGZsb3cgZW50cnkgZnJvbSBsb2NhbCBkYXRhYmFzZSAqLworICAgICAgICAgICAgICAgIHJjID0gbWFwbGVfbWFjX3VuaWNhc3RfZmxvd19yZW1vdmUocF9mbG93X3JlcSwgb3BfdHlwZSwgcF9tYWNfdXRpbF9mbG93X2VudHJ5KTsKKyAgICAgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIG1hcmsgZmxvdyBEZS1jb25maWd1cmF0aW9uIHRvIGRldmljZSBjb21wbGV0ZWQgKi8KKyAgICAgICAgICAgICAgICBtYWNfdXRpbF9tYXJrX2Zsb3dfY29uZmlnX2NvbXBsZXRlKHBfbWFjX3V0aWxfZmxvd19lbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX0JST0FEQ0FTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IG1hcGxlX21hY19icm9hZGNhc3RfZmxvd19yZW1vdmUocF9mbG93X3JlcSwgcGVyX2Zsb3dfbW9kZV92bGFuX2lkLCBvcF90eXBlLCBwX21hY191dGlsX2Zsb3dfZW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKHBfZmxvd19yZXEtPmRhdGEuYWNjZXNzX2ludF9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBmbG93IHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3dfcmVxLT5rZXkuZmxvd190eXBlKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfSAvKiBGbG93IFJlbW92ZSAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihwX2Zsb3dfcmVxLT5kYXRhLmFjY2Vzc19pbnRfaWQpLAorICAgICAgICAgICAgICAgICJVbmtub3duIGZsb3cgb3AgdHlwZSAlZCBmb3IgZmxvdyBpZC90eXBlID0gJWQvJWRcbiIsCisgICAgICAgICAgICAgICAgb3BfdHlwZSwgcF9mbG93X3JlcS0+a2V5LmZsb3dfaWQsIHBfZmxvd19yZXEtPmtleS5mbG93X3R5cGUpOworICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICB9CisKK2V4aXQ6CisgICAgaWYgKEJDTV9FUlJfT0sgPT0gcmMpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayBmbG93IGVudHJ5IGZsYWdzIHRvIHNlZSBpZiBhbiBpbmRpY2F0aW9uIHRvIENvcmUgc2hvdWxkIGJlIHRyaWdnZXJlZCBpbW1lZGlhdGVseToKKyAgICAgICAgICogIChTcGVjaWFsIGhhbmRsaW5nIGZvciBmbG93IGNvbmZpZ3VyYXRpb24sIGZvciB0aGUgY2FzZSBubyBkZXZpY2UgY29uZmlndXJhdGlvbiBpcyBuZWVkZWQsCisgICAgICAgICAqICBhbmQvb3Igbm8gaW5kaWNhdGlvbiBmcm9tIGRldmljZSBpcyBleHBlY3RlZCAtIGNvdWxkIGJlIHRoZSBjYXNlIG9mIGEgc2luZ2xlL211bHRpcGxlCisgICAgICAgICAqICBnZW0gcG9ydHMgdXNlZCBmb3IgdXMgYW5kIGRzLCBhbmQgdXMgd2FzIGFscmVhZHkgY29uZmlndXJlZC4KKyAgICAgICAgICogIC0gc2VuZCB0aGUgZmxvdyBpbmQgaW1tZWRpYXRlbHkKKyAgICAgICAgICovCisgICAgICAgIGNoZWNrX3NlbmRfZmxvd19iYWxfaW5kX21zZyhwX21hY191dGlsX2Zsb3dfZW50cnksIEJDTV9FUlJfT0ssIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICgoQkNNX0VSUl9OT0VOVCA9PSByYykgJiYgKEJBTF9VVElMX09QRVJfRkxPV19DTEVBUiA9PSBvcF90eXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZvciBmbG93IENMRUFSLCBhbmQgaWYgbm8gZmxvdyBlbnRyeSBpcyBmb3VuZCwgdGhlbiBmYWtlIGFuIGluZGljYXRpb24gc3VjY2VzcyB0byBDb3JlLAorICAgICAgICAgICAgICogZm9yIGl0IHRvIGV4ZWN1dGUgdGhlIGZsb3cgc3RhdGUgbWFjaGluZS4KKyAgICAgICAgICAgICAqIFRoZSByZWFzb25zIGZvciBmbG93IGVudHJ5IG5vdCBmb3VuZCBjb3VsZCBiZSBiZWNhdXNlIHRoZSBmbG93IHdhcyBhbHJlYWR5IGFkbWluLWVkIERvd24uCisgICAgICAgICAgICAgKiBBZG1pbi1kb3duIG9mIGEgZmxvdyBjYXVzZXMgbWFjIHV0aWwgdG8gY2xlYXIgZmxvdyBjb25maWcgYW5kIGZsb3cgaW5zdGFuY2UgZnJvbSBpdHNlbGYKKyAgICAgICAgICAgICAqIGFuZCB0aGUgbWFwbGUgSFcuIEhvd2V2ZXIsIENvcmUgRlNNIHN0aWxsIGtlZXBzIGl0J3MgZmxvdyBpbnN0YW5jZSBkdXJpbmcgYWRtaW4gZG93biBzdGF0ZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbWFjX3V0aWxfcmVwb3J0X2Zsb3dfcmVtb3ZlX3N1Y2Nlc3MgKHBfZmxvd19yZXEtPmtleSwgcF9mbG93X3JlcS0+ZGF0YS5hY2Nlc3NfaW50X2lkLCBvcF90eXBlKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvL2Vsc2UgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyBjb25maWcsIGp1c3QgcmV0dXJuIGEgZmFpbHVyZTsgbm8gbmVlZCB0byBzZW5kIGJhY2sgaW5kaWNhdGlvbiBmb3IgdGhhdC4KKworCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyBtYXBsZV94Z3Bvbl9tYWNfY2hlY2tfZ2VtX3BvcnRfaWQodWludDMyX3QgaWZfaWQsIHVpbnQzMl90IG9udV9pZCwgdWludDE2X3Qgc3ZjX3BvcnRfaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19ib29sICppc19jb25maWd1cmVkLCBiY21vc19ib29sICppc19hY3RpdmF0ZWQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkgZ2VtX2tleSA9IHt9OworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmcgZ2VtX2NmZyA9IHt9OworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgdWludDMyX3QgcGh5c2ljYWxfaWZfaWQ7CisgICAgCisgICAgR0VUX0RFVklDRV9JRF9BTkRfUEhZU0lDQUxfSURfRlJPTV9JRl9JRChpZl9pZCwgZGV2aWNlX2lkLCBwaHlzaWNhbF9pZl9pZCk7CisgICAgCisgICAgLyogc2V0IHRoZSBnZW0gcG9ydCBvYmplY3Qga2V5ICovCisgICAgZ2VtX2tleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICBnZW1fa2V5LmdlbV9wb3J0X2lkID0gc3ZjX3BvcnRfaWQ7CisgICAgQkNNT0xUX0NGR19JTklUKCZnZW1fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZ2VtX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZ2VtX2NmZywgeGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmdlbV9jZmcuaGRyKTsKKyAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGlmX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgIiVzIEZBSUxFRCB0byBnZW0geGdwb25fZ2VtX3BvcnQgY29uZmlndXJhdGlvbiA6IGRldmljZV9pZCA9ICVkIGlmX2lkID0gJWQgZ2VtX3BvcnRfaWQgPSAlZCBcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2lkLCBpZl9pZCwgc3ZjX3BvcnRfaWQpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIAorICAgIC8qIG1heSBiZSBjb25maWd1cmVkOyBkb2VzIGdlbSBiZWxvbmcgdG8gc2FtZSBvbnUgPyAqLworICAgIGlmIChCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVEVfTk9UX0NPTkZJR1VSRUQgIT0gZ2VtX2NmZy5kYXRhLmdlbV9wb3J0X3N0YXRlICYmIG9udV9pZCAhPSBnZW1fY2ZnLmRhdGEub251X2lkKQorICAgIHsJCisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpZl9pZCksCisgICAgICAgICAgICAgICAgICAgICIlcyBGQUlMRUQsIG9udSBpZCBtaXNtYXRjaDogc3ZjX3BvcnRfaWQgPSAlZCBpZl9pZCA9ICVkIGlzIGFscmVhZHkgYXNzaWduZWQgdG8gb251X2lkID0gJWQgKG5vdCB0byBvbnUgaWQgJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdmNfcG9ydF9pZCwgaWZfaWQsIGdlbV9jZmcuZGF0YS5vbnVfaWQsIG9udV9pZCk7ICAgIAorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICAqaXNfY29uZmlndXJlZCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRCAhPSBnZW1fY2ZnLmRhdGEuZ2VtX3BvcnRfc3RhdGU7CisgICAgKmlzX2FjdGl2YXRlZCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkUgPT0gZ2VtX2NmZy5kYXRhLmdlbV9wb3J0X3N0YXRlOworICAgIAorICAgIHJldHVybiByYzsKK30KKworCitiY21vc19lcnJubyBtYXBsZV94Z3Bvbl9nZW1fcG9ydF9pZF9hZGQodWludDMyX3QgaWZfaWQsIHVpbnQxNl90IHN2Y19wb3J0X2lkLCB1aW50MzJfdCBvbnVfaWQsIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uICpjb25maWd1cmF0aW9uKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGdlbV9rZXkgPSB7fTsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnIGdlbV9jZmcgPSB7fTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IHBoeXNpY2FsX2lmX2lkOworCisgICAgR0VUX0RFVklDRV9JRF9BTkRfUEhZU0lDQUxfSURfRlJPTV9JRl9JRChpZl9pZCwgZGV2aWNlX2lkLCBwaHlzaWNhbF9pZl9pZCk7CisKKyAgICAvKiBzZXQgdGhlIGdlbSBwb3J0IG9iamVjdCBrZXkgKi8KKyAgICBnZW1fa2V5LnBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOworICAgIGdlbV9rZXkuZ2VtX3BvcnRfaWQgPSBzdmNfcG9ydF9pZDsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmdlbV9jZmcsIHhncG9uX2dlbV9wb3J0LCBnZW1fa2V5KTsKKworICAgIC8qIHNldCB0aGUgZ2VtIHBvcnQgY29uZmlndXJhdGlvbiAqLworICAgIGlmIChvbnVfaWQgPCBCQ01PTFRfWEdQT05fT05VX0lEX0FOWSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmdlbV9jZmcsIHhncG9uX2dlbV9wb3J0LCBvbnVfaWQsIG9udV9pZCk7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmdlbV9jZmcsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwKKyAgICAgICAgICAgIEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9EQVRBKTsKKyAgICB9CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmZ2VtX2NmZywgeGdwb25fZ2VtX3BvcnQsIGVuY3J5cHRpb25fbW9kZSwKKyAgICAgICAgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmZ2VtX2NmZywgeGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sICpjb25maWd1cmF0aW9uKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZnZW1fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29udHJvbCwgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFKTsKKworICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmZ2VtX2NmZy5oZHIpOworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaWZfaWQpLAorICAgICAgICAgICAgICAgICIlcyBGQUlMRUQ6IHJjPSVzICglZCksIHN2Y19wb3J0X2lkID0gJWQgaWZfaWQgPSAlZCBvbnVfaWQgPSAlZCwgZXJyX3RleHQ9JXNcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMsIHN2Y19wb3J0X2lkLCBpZl9pZCwgb251X2lkLCBnZW1fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCitiY21vc19lcnJubyBtYXBsZV94Z3Bvbl9nZW1fcG9ydF9pZF9yZW1vdmUodWludDMyX3QgaWZfaWQsIHVpbnQxNl90IHN2Y19wb3J0X2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGdlbV9rZXkgPSB7fTsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnIGdlbV9jZmcgPSB7fTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IHBoeXNpY2FsX2lmX2lkOworCisgICAgR0VUX0RFVklDRV9JRF9BTkRfUEhZU0lDQUxfSURfRlJPTV9JRl9JRChpZl9pZCwgZGV2aWNlX2lkLCBwaHlzaWNhbF9pZl9pZCk7CisKKyAgICBnZW1fa2V5LnBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOworICAgIGdlbV9rZXkuZ2VtX3BvcnRfaWQgPSBzdmNfcG9ydF9pZDsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmdlbV9jZmcsIHhncG9uX2dlbV9wb3J0LCBnZW1fa2V5KTsKKyAgICByYyA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmZ2VtX2NmZy5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGlmX2lkKSwgIiVzIGZhaWxlZCB3aXRoIGVycm9yICVzXG4iLF9fRlVOQ1RJT05fXywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworYmNtb3NfZXJybm8gbWFwbGVfeGdwb25fbWFjX2dldF9hbGxvY19pZF9jb25maWcgKHVpbnQzMl90IGlmX2lkLCB1aW50MzJfdCBvbnVfaWQsIHVpbnQxNl90IGFnZ19pZCwgYmNtb2x0X2FsbG9jX3N0YXRlICphbGxvY19pZF9zdGF0ZSkKKwkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBhbGxvY19rZXkgPSB7fTsKKyAgICBiY21vbHRfeGdwb25fYWxsb2NfY2ZnIGFsbG9jX2NmZyA9IHt9OworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgdWludDMyX3QgcGh5c2ljYWxfaWZfaWQ7CisKKyAgICBHRVRfREVWSUNFX0lEX0FORF9QSFlTSUNBTF9JRF9GUk9NX0lGX0lEKGlmX2lkLCBkZXZpY2VfaWQsIHBoeXNpY2FsX2lmX2lkKTsKKworICAgIC8qIHNldCB0aGUgYWxsb2MtaWQga2V5ICovCisgICAgYWxsb2Nfa2V5LnBvbl9uaSA9IHBoeXNpY2FsX2lmX2lkOworICAgIGFsbG9jX2tleS5hbGxvY19pZCA9IGFnZ19pZDsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmFsbG9jX2NmZywgeGdwb25fYWxsb2MsIGFsbG9jX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmYWxsb2NfY2ZnLCB4Z3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpOworCisgICAgcmMgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZhbGxvY19jZmcuaGRyKTsKKyAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgTUFDX1VUSUxfR0VUX0xPR19JRF9GT1JfUE9OX0lGKGlmX2lkKSwKKyAgICAgICAgICAgICAgICAiJXM6IEZBSUxFRCBpbiBiY21vbHRfY2ZnX2dldCByYyA9ICVzLCBhZ2dfaWQgPSAlZCBpZl9pZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksIGFnZ19pZCwgaWZfaWQpOworCisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisJCisgICAgLyogbWF5IGJlIGNvbmZpZ3VyZWQ7IGRvZXMgYWxsb2MgaWQgYmVsb25nIHRvIHRoZSBleHBlY3RlZCBvbnUgPyAqLworICAgIGlmIChhbGxvY19jZmcuZGF0YS5zdGF0ZSAhPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQKKwkJJiYgYWxsb2NfY2ZnLmRhdGEub251X2lkICE9IG9udV9pZCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpZl9pZCksCisgICAgICAgICAgICAgICAgIiVzIEZBSUxFRCwgb251IGlkIG1pc21hdGNoOiBhZ2dfaWQgPSAlZCBpZl9pZCA9ICVkIGlzIHNldCB0byBvbnUgJWQgTk9UIHRvIG9udV9pZCA9ICVkXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBhZ2dfaWQsIGlmX2lkLCBhbGxvY19jZmcuZGF0YS5vbnVfaWQsIG9udV9pZCk7CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgKmFsbG9jX2lkX3N0YXRlID0gYWxsb2NfY2ZnLmRhdGEuc3RhdGU7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCitiY21vc19lcnJubyBtYXBsZV94Z3Bvbl91c19hbGxvY19pZF9hZGQodWludDMyX3QgaWZfaWQsIHVpbnQzMl90IG9udV9pZCwgdWludDE2X3QgYWdnX2lkLCBiY21vbHRfcG9uX2FsbG9jX3NsYSBhZ2dfc2xhKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGFsbG9jX2tleSA9IHt9OworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcgYWxsb2NfY2ZnID0ge307CisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9pZl9pZDsKKworICAgIEdFVF9ERVZJQ0VfSURfQU5EX1BIWVNJQ0FMX0lEX0ZST01fSUZfSUQoaWZfaWQsIGRldmljZV9pZCwgcGh5c2ljYWxfaWZfaWQpOworCisKKyAgICAvKiBzZXQgdGhlIGFsbG9jLWlkIGtleSAqLworICAgIGFsbG9jX2tleS5wb25fbmkgPSBwaHlzaWNhbF9pZl9pZDsKKyAgICBhbGxvY19rZXkuYWxsb2NfaWQgPSBhZ2dfaWQ7CisgICAgQkNNT0xUX0NGR19JTklUKCZhbGxvY19jZmcsIHhncG9uX2FsbG9jLCBhbGxvY19rZXkpOworCisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmYWxsb2NfY2ZnLCB4Z3Bvbl9hbGxvYywgc2xhLCBhZ2dfc2xhKTsKKyAgICAvKiBzZXQgdGhlIGFsbG9jLWlkIC0gb251IGFzc2lnbm1lbnQgKi8KKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZhbGxvY19jZmcsIHhncG9uX2FsbG9jLCBvbnVfaWQsIG9udV9pZCk7CisKKyAgICByYyA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmFsbG9jX2NmZy5oZHIpOworICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaWZfaWQpLAorICAgICAgICAgICAgICAgICIlczogcmMgPSAlcywgYWdnX2lkID0gJWQgaWZfaWQgPSAlZCwgc2xhID0ge2cgYnc6ICVkLCBtYXggYnc6ICVkLCBjYl9ucnRfYnc6ICVkLCBjYl9ydF9idzogJWR9XG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksIGFnZ19pZCwgaWZfaWQsIAorICAgICAgICAgICAgICAgIGFnZ19zbGEuZ3VhcmFudGVlZF9idywgYWdnX3NsYS5tYXhpbXVtX2J3LCBhZ2dfc2xhLmNicl9ucnRfYncsIGFnZ19zbGEuY2JyX3J0X2J3KTsKKworICAgICAgICBCQ01fTE9HKEVSUk9SLCBNQUNfVVRJTF9HRVRfTE9HX0lEX0ZPUl9QT05fSUYoaWZfaWQpLAorICAgICAgICAgICAgICAgICJlcnJfdGV4dCA9ICVzXG4iLAorICAgICAgICAgICAgICAgIGFsbG9jX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisKK2JjbW9zX2Vycm5vIG1hcGxlX3hncG9uX3VzX2FsbG9jX2lkX3JlbW92ZSh1aW50MzJfdCBpZl9pZCwgdWludDE2X3QgYWdnX2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGFsbG9jX2tleSA9IHt9OworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcgYWxsb2NfY2ZnID0ge307CisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9pZl9pZDsKKworICAgIEdFVF9ERVZJQ0VfSURfQU5EX1BIWVNJQ0FMX0lEX0ZST01fSUZfSUQoaWZfaWQsIGRldmljZV9pZCwgcGh5c2ljYWxfaWZfaWQpOworCisgICAgLyogc2V0IHRoZSBhbGxvYy1pZCBrZXkgKi8KKyAgICBhbGxvY19rZXkucG9uX25pID0gcGh5c2ljYWxfaWZfaWQ7CisgICAgYWxsb2Nfa2V5LmFsbG9jX2lkID0gYWdnX2lkOworICAgIEJDTU9MVF9DRkdfSU5JVCgmYWxsb2NfY2ZnLCB4Z3Bvbl9hbGxvYywgYWxsb2Nfa2V5KTsKKworICAgIHJjID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZhbGxvY19jZmcuaGRyKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIE1BQ19VVElMX0dFVF9MT0dfSURfRk9SX1BPTl9JRihpZl9pZCksICIlcyBmYWlsZWQgd2l0aCBlcnJvciAlc1xuIixfX0ZVTkNUSU9OX18sIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyoqCisgKiBAYnJpZWYgZ3JvdXAgc2V0IGZvciB4Z3BvbiAoWEctUE9OMSkKKyAqIEBwYXJhbSBwX2dyb3VwX3JlcSAgcG9pbnRlciB0byBncm91cCByZXF1ZXN0IHN0cnVjdHVyZSBmcm9tIGNvcmUKKyAqIEBwYXJhbSBvcF90eXBlICAgICAgQURELCBSRU1PVkUgb3IgU0VUCisgKiBAcGFyYW0gcF9ncm91cF9pbnN0IHBvaW50ZXIgdG8gdGhlIENvcmUgR3JvdXAgT2JqZWN0IGluc3RhbmNlCisgKgorICogQHJldHVybiBlcnJubyAgICBlcnJvcgorICoKKyAqIEB0b2RvIHNoaWZ0IHRoaXMgb3V0IHRvIG1hYyBzcGVjaWZpYyBmaWxlcworICovCitiY21vc19lcnJubyBtYWNfdXRpbF9ncm91cF9zZXRfZm9yX3hncG9uIChiY21iYWxfZ3JvdXBfY2ZnICpwX2dyb3VwX3JlcSwgYmFsX3V0aWxfb3Blcl9ncm91cCBvcF90eXBlLCBncm91cF9pbnN0ICpwX2dyb3VwX2luc3QpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIHVpbnQxNl90IHN2Y19wb3J0X2lkOworICAgIHVpbnQzMl90IGlmX2lkLCBpLCByZWZfY291bnQ7CisgICAgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHswfTsKKworICAgIC8qIENoZWNrIHRoZSBvcGVyYXRpb24gaWQgKi8KKyAgICBpZiAoKEJBTF9VVElMX09QRVJfR1JPVVBfQUREICE9IG9wX3R5cGUpICAgICYmCisgICAgICAgIChCQUxfVVRJTF9PUEVSX0dST1VQX1JFTU9WRSAhPSBvcF90eXBlKSAmJgorICAgICAgICAoQkFMX1VUSUxfT1BFUl9HUk9VUF9TRVQgIT0gb3BfdHlwZSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgbWFjX3V0aWwgeGdwb24gZ3JvdXAgb3BlcmF0aW9uICVkIFxuIiwgb3BfdHlwZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgICAgICAKKyAgICBjb25maWd1cmF0aW9uLmRpcmVjdGlvbiA9IEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fRE9XTlNUUkVBTTsKKyAgICBjb25maWd1cmF0aW9uLnR5cGUgPSBCQ01PTFRfR0VNX1BPUlRfVFlQRV9NVUxUSUNBU1Q7CisgICAgICAgIAorICAgIC8qIGZvciBncm91cCBTRVQgb3BlcmF0aW9uLCBmaXJzdCByZW1vdmUgdGhlIG9sZCBtdWx0aWNhc3QgR0VNICovCisgICAgaWYgKEJBTF9VVElMX09QRVJfR1JPVVBfU0VUID09IG9wX3R5cGUpCisgICAgeworICAgICAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2dyb3VwX3JlbV9yZXE7CisgICAgICAgIC8qIHVzZSB0aGUgQ29yZSBEQiBmb3IgZXhpc3RpbmcgbWVtYmVycyAtIHN0b3JlIGluIGN1cnJlbnRfZmxvd19pbmZvICovCisgICAgICAgIHBfZ3JvdXBfcmVtX3JlcSA9ICZwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mbzsKKyAgICAgICAgZm9yKGk9MDsgaTwgcF9ncm91cF9yZW1fcmVxLT5kYXRhLm1lbWJlcnMubGVuOyBpKyspCisgICAgICAgIHsgIAorICAgICAgICAgICAgaWZfaWQgPSBwX2dyb3VwX3JlbV9yZXEtPmRhdGEubWVtYmVycy52YWxbaV0uaW50Zl9pZDsKKyAgICAgICAgICAgIHN2Y19wb3J0X2lkID0gcF9ncm91cF9yZW1fcmVxLT5kYXRhLm1lbWJlcnMudmFsW2ldLnN2Y19wb3J0X2lkOworICAgICAgICAgICAgLyogc3ZjX3BvcnRfaWQgbWF5IGJlIDAgaW4gdGhlIGN1cnJlbnQgaW5mbyB3aGVuIHRoZSBncm91cCBoYWQgbm8gb3duZXIuCisgICAgICAgICAgICAgICBza2lwIHRoZSByZW1vdmUgaWYgdGhhdCBpcyB0aGUgY2FzZSAqLworICAgICAgICAgICAgaWYoc3ZjX3BvcnRfaWQpCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIHJjID0gcnNjX21ncl9nZW1fZ2V0X3JlZl9jb3VudChpZl9pZCwgc3ZjX3BvcnRfaWQsICZyZWZfY291bnQpOworICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICAgICAgICAgICAgICJtYWNfdXRpbCB4Z3BvbiBncm91cCBnZXQgcmVmZXJlbmNlIGNvdW50IG9uIGludGVyZmFjZSAlZCAoZ2VtICVkKSBmYWlsZWQgXG4iLCBpZl9pZCwgc3ZjX3BvcnRfaWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGlmIG90aGVyIGdyb3VwIGlzIHJlZmVyZW5jaW5nIHRoZSBzYW1lIEdFTSAocmVmX2NvdW50ID4gMSksIGRvIG5vdCBjYWxsIE1hYyBBUEkgdG8gcmVtb3ZlIGl0LgorICAgICAgICAgICAgICAgICAgIFRoZSBjb3JlIHdpbGwgYXNrIFJlc291cmNlIE1hbmdlciB0byBkZWNyZWFzZSB0aGUgY291bnRlciBpZiBldmVyeXRoaW5nIGlzIGdvb2QgKi8KKyAgICAgICAgICAgICAgICBpZiAoIHJlZl9jb3VudCA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBtYXBsZV94Z3Bvbl9nZW1fcG9ydF9pZF9yZW1vdmUoaWZfaWQsIHN2Y19wb3J0X2lkKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX21hY191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1hY191dGlsIHhncG9uIGdyb3VwIHNldCBvcGVyYXRpb24gU0VUIG9uIHJlbW92ZSBpbnRlcmZhY2UgJWQgKGdlbSAlZCkgZmFpbGVkIFxuIiwgaWZfaWQsIHN2Y19wb3J0X2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggcmVmX2NvdW50ID09IDApCisgICAgICAgICAgICAgICAgeyAgCisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX21hY191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1hY191dGlsIHhncG9uIGdyb3VwIG9wZXJhdGlvbiBTRVQgb24gaW50ZXJmYWNlICVkIChnZW0gJWQpIHJlbW92ZSB3aXRoIDAgcmVmZXJlbmNlIGNvdW50IFxuIiwgaWZfaWQsIHN2Y19wb3J0X2lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogd2FsayB0aHJvdWdoIGV2ZXJ5IG1lbWJlciBpbnRlcmZhY2UgKi8KKyAgICBmb3IoaT0wOyBpPCBwX2dyb3VwX3JlcS0+ZGF0YS5tZW1iZXJzLmxlbjsgaSsrKQorICAgIHsgIAorICAgICAgICBpZl9pZCA9IHBfZ3JvdXBfcmVxLT5kYXRhLm1lbWJlcnMudmFsW2ldLmludGZfaWQ7CisgICAgICAgIHN2Y19wb3J0X2lkID0gcF9ncm91cF9yZXEtPmRhdGEubWVtYmVycy52YWxbaV0uc3ZjX3BvcnRfaWQ7CisgICAgICAgIC8qIGdyb3VwIEFkZCAqLworICAgICAgICBpZiAoQkFMX1VUSUxfT1BFUl9HUk9VUF9BREQgPT0gb3BfdHlwZSB8fCBCQUxfVVRJTF9PUEVSX0dST1VQX1NFVCA9PSBvcF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1hcGxlX3hncG9uX2dlbV9wb3J0X2lkX2FkZChpZl9pZCwgc3ZjX3BvcnRfaWQsIE1BQ19VVElMX0RVTU1ZX09OVV9JRF9GT1JfTVVMVElDQVNUX0dFTSwgJmNvbmZpZ3VyYXRpb24pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEJBTF9VVElMX09QRVJfR1JPVVBfUkVNT1ZFID09IG9wX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gcnNjX21ncl9nZW1fZ2V0X3JlZl9jb3VudChpZl9pZCwgc3ZjX3BvcnRfaWQsICZyZWZfY291bnQpOworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICAgICAgICAgIm1hY191dGlsIHhncG9uIGdyb3VwIFJFTSBnZXQgcmVmZXJlbmNlIGNvdW50IG9uIGludGVyZmFjZSAlZCAoZ2VtICVkKSBmYWlsZWQgXG4iLCBpZl9pZCwgc3ZjX3BvcnRfaWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaWYgb3RoZXIgZ3JvdXAgaXMgcmVmZXJlbmNpbmcgdGhlIHNhbWUgR0VNIChyZWZfY291bnQgPiAxKSwgZG8gbm90IGNhbGwgTWFjIEFQSSB0byByZW1vdmUgaXQuCisgICAgICAgICAgICAgICBUaGUgY29yZSB3aWxsIGFzayBSZXNvdXJjZSBNYW5nZXIgdG8gZGVjcmVhc2UgdGhlIGNvdW50ZXIgaWYgZXZlcnl0aGluZyBpcyBnb29kICovCisgICAgICAgICAgICBpZiAoIHJlZl9jb3VudCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gbWFwbGVfeGdwb25fZ2VtX3BvcnRfaWRfcmVtb3ZlKGlmX2lkLCBzdmNfcG9ydF9pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggcmVmX2NvdW50ID09IDApCisgICAgICAgICAgICB7ICAKKyAgICAgICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9tYWNfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIm1hY191dGlsIHhncG9uIGdyb3VwIG9wZXJhdGlvbiBSRU0gb24gaW50ZXJmYWNlICVkIChnZW0gJWQpIHJlbW92ZSB3aXRoIDAgcmVmZXJlbmNlIGNvdW50IFxuIiwgaWZfaWQsIHN2Y19wb3J0X2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIAorICAgICAgICBpZihCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfbWFjX3V0aWwsCisgICAgICAgICAgICAibWFjX3V0aWwgeGdwb24gZ3JvdXAgc2V0IG9mIG9wZXJhdGlvbiAlZCBvbiBpbnRlcmZhY2UgJWQgKGdlbSAlZCkgZmFpbGVkIFxuIiwgb3BfdHlwZSwgaWZfaWQsIHN2Y19wb3J0X2lkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vTWFrZWZpbGUgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODdkM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vTWFrZWZpbGUKQEAgLTAsMCArMSw0MCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisjICAKKyMgICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorIyAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyAgCisjICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisjICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisjICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyMgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorIyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyMgIAorIyAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorIyAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisjICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisjICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisjICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyMgICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyMgICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisjICAgICBvZiB0aGUgc29mdHdhcmUuCisjICAKKyMgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorIyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisjICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorIyAgd3JpdHRlbiBjb25zZW50LgorIyAgCisjICA6PgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCQUwgY29yZSBDTEkgYXBwbGljYXRpb24KKyMKK01PRF9OQU1FID0gYmFsX29hbV91dGlsCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSBtYXBsZV9zZGsgYmNtX3VzZXJfYXBwbF9lcG9uX29hbSBiY21fdXNlcl9hcHBsX2VvbgorCitzcmNzID0gYmFsX29hbV91dGlsLmMKKworRVhUUkFfQ0ZMQUdTICs9IC1JJChTUkNfRElSKS8uLi8uLi9tYWluCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2JhbF9vYW1fdXRpbC5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vYmFsX29hbV91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwNTFmOQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2JhbF9vYW1fdXRpbC5jCkBAIC0wLDAgKzEsNDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfb2FtX3V0aWwuYworICoKKyAqIEBicmllZiBPQU0gdXRpbCBpbnRlcmZhY2VzIGRlZmluaXRpb24gdXNlZCBieSBCYWwgQ29yZQorICoKKyAqIFRoaXMgZmlsZSBleHBvc2UgdGhlIEFQSXMgdG8gdGhlIGNvcmUgdG8gY29uZmlndXJlIE9OVSB2aWEgRVBPTiBPQU0gCisgKgorICogQGFkZHRvZ3JvdXAgb2FtX3V0aWwKKyAqLworCisvKkB7Ki8KKworI2luY2x1ZGUgImJhbF9vYW1fdXRpbC5oIgorI2luY2x1ZGUgPGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfZW9uLmg+CisjaW5jbHVkZSA8YmNtb2x0X2Vvbl9sb2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfZXBvbl9vYW1fdHlwZXMuaD4KKworI2RlZmluZSBCQUxfT0FNX1RJTUVPVVRfVVMgMTAwMDAwMCAvKiAxIHNlY29uZCAqLyAKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkFMX09BTV9TVEFURV9JRExFLAorICAgIEJBTF9PQU1fU1RBVEVfU0VUX09BTV9SQVRFLAorICAgIEJBTF9PQU1fU1RBVEVfQ0xFQVJfSU5HUkVTU19SVUxFU19ORVRXT1JLX1BPTiwKKyAgICBCQUxfT0FNX1NUQVRFX0NMRUFSX0lOR1JFU1NfUlVMRVNfVVNFUl9QT1JULAorICAgIEJBTF9PQU1fU1RBVEVfU0VUX0JBU0lDX1FVRVVFX0NPTkZJRywKKyAgICBCQUxfT0FNX1NUQVRFX0FERF9JTkdSRVNTX1JVTEVTX05FVFdPUktfUE9OLAorICAgIEJBTF9PQU1fU1RBVEVfQUREX0lOR1JFU1NfUlVMRVNfVVNFUl9QT1JULAorICAgIEJBTF9PQU1fU1RBVEVfU0VUX1JFUE9SVF9USFJFU0hPTERTLAorICAgIEJBTF9PQU1fU1RBVEVfRU5BQkxFX1VTRVJfVFJBRkZJQywKKyAgICBCQUxfT0FNX1NUQVRFX0RJU0FCTEVfVVNFUl9UUkFGRklDLAorICAgIEJBTF9PQU1fU1RBVEVfX05VTV9PRiwKK30gYmFsX29hbV9zdGF0ZTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkFMX09BTV9FVkVOVF9BQ0ssCisgICAgQkFMX09BTV9FVkVOVF9USU1FT1VULAorICAgIEJBTF9PQU1fRVZFTlRfX05VTV9PRiwKK30gYmFsX29hbV9ldmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgYmFsX29hbV9jb250ZXh0Cit7CisgICAgVEFJTFFfRU5UUlkoYmFsX29hbV9jb250ZXh0KSBuZXh0OworICAgIGJhbF9vYW1fY2IgY2I7CisgICAgdm9pZCAqY29udGV4dDsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIGJjbW9sdF9lcG9uX25pIGVwb25fbmk7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjOworICAgIGJjbW9zX3RpbWVyIHRpbWVyOworICAgIGJhbF9vYW1fc3RhdGUgc3RhdGU7Cit9IGJhbF9vYW1fY29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgbTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIGJjbW9sdF9lcG9uX25pIGVwb25fbmk7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjOworfSBiYWxfb2FtX3RpbWVvdXRfbXNnOworCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmFsX29hbV9zbV9jYikoYmFsX29hbV9jb250ZXh0ICpjb250ZXh0KTsKKworc3RhdGljIFRBSUxRX0hFQUQoLCBiYWxfb2FtX2NvbnRleHQpIGJhbF9vYW1fY29udGV4dHMgPSBUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGJhbF9vYW1fY29udGV4dHMpOworCitzdGF0aWMgYmFsX29hbV9jb250ZXh0ICpiYWxfb2FtX2dldF9jb250ZXh0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9lcG9uX25pIGVwb25fbmksIGNvbnN0IGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgYmFsX29hbV9jb250ZXh0ICppdGVyOworCisgICAgVEFJTFFfRk9SRUFDSChpdGVyLCAmYmFsX29hbV9jb250ZXh0cywgbmV4dCkKKyAgICB7CisgICAgICAgIGlmIChkZXZpY2VfaWQgPT0gaXRlci0+ZGV2aWNlX2lkICYmIGVwb25fbmkgPT0gaXRlci0+ZXBvbl9uaSAmJiAhbWVtY21wKG1hYywgJml0ZXItPm1hYywgc2l6ZW9mKCptYWMpKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gaXRlcjsKK30KKworc3RhdGljIHZvaWQgYmFsX29hbV9uZWdvdGlhdGlvbl9yZXN1bHRfY2Iodm9pZCAqY29udGV4dCwgY29uc3QgZW9uX2xpbmtfa2V5X3QgKmxpbmtfa2V5LCBiY21vc19lcnJubyByZXN1bHQpCit7CisgICAgYmFsX29hbV9jb250ZXh0ICpfY29udGV4dCA9IGNvbnRleHQ7CisKKyAgICBfY29udGV4dC0+Y2IoX2NvbnRleHQtPmNvbnRleHQsIF9jb250ZXh0LT5kZXZpY2VfaWQsIF9jb250ZXh0LT5lcG9uX25pLCAmX2NvbnRleHQtPm1hYywgcmVzdWx0KTsKKworICAgIGJjbW9zX2ZyZWUoX2NvbnRleHQpOworfQorCitiY21vc19lcnJubyBiYWxfb2FtX3N0YXJ0X29hbV9uZWdvdGlhdGlvbihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfZXBvbl9uaSBlcG9uX25pLCBiY21vc19tYWNfYWRkcmVzcyAqbWFjLCBiYWxfb2FtX2NiIGNiLCB2b2lkICpjb250ZXh0KQoreworICAgIGVvbl9saW5rX2tleV90IGxpbmtfa2V5ID0ge307CisgICAgYmFsX29hbV9jb250ZXh0ICpfY29udGV4dDsKKworICAgIGxpbmtfa2V5LmRldmljZV9pZCA9IGRldmljZV9pZDsKKyAgICBsaW5rX2tleS5lcG9uX25pID0gZXBvbl9uaTsKKyAgICBsaW5rX2tleS5tYWNfYWRkcmVzcyA9ICptYWM7CisKKyAgICBfY29udGV4dCA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKl9jb250ZXh0KSk7CisgICAgX2NvbnRleHQtPmNiID0gY2I7CisgICAgX2NvbnRleHQtPmNvbnRleHQgPSBjb250ZXh0OworICAgIF9jb250ZXh0LT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisgICAgX2NvbnRleHQtPmVwb25fbmkgPSBlcG9uX25pOworICAgIF9jb250ZXh0LT5tYWMgPSAqbWFjOworCisgICAgcmV0dXJuIGJjbW9sdF91c2VyX2FwcGxfZW9uX3N0YXJ0KCZsaW5rX2tleSwgZW9uX29hbV9zZXRfaWRfZHBvZSwgYmFsX29hbV9uZWdvdGlhdGlvbl9yZXN1bHRfY2IsIF9jb250ZXh0LCBCQ01PU19UUlVFKTsKK30KKworc3RhdGljIHZvaWQgYmFsX29hbV9jb25maWd1cmVfdHJhZmZpY19jb21wbGV0ZShiYWxfb2FtX2NvbnRleHQgKmNvbnRleHQsIGJjbW9zX2Vycm5vIHJlc3VsdCkKK3sKKyAgICBjb250ZXh0LT5jYihjb250ZXh0LT5jb250ZXh0LCBjb250ZXh0LT5kZXZpY2VfaWQsIGNvbnRleHQtPmVwb25fbmksICZjb250ZXh0LT5tYWMsIHJlc3VsdCk7CisKKyAgICBiY21vc190aW1lcl9kZXN0cm95KCZjb250ZXh0LT50aW1lcik7CisKKyAgICBUQUlMUV9SRU1PVkUoJmJhbF9vYW1fY29udGV4dHMsIGNvbnRleHQsIG5leHQpOworCisgICAgLyogTm8gbmVlZCB0byBzZXQgY29udGV4dC0+c3RhdGUgdG8gQkFMX09BTV9TVEFURV9JRExFIC0gaXQgaXMgZ29pbmcgdG8gYmUgZGVzdHJveWVkIGhlcmUgYW55d2F5LiAqLworICAgIGJjbW9zX2ZyZWUoY29udGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkIGJhbF9vYW1fdGltZW91dF9tc2dfY2IoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICptc2cpCit7CisgICAgYmFsX29hbV90aW1lb3V0X21zZyAqdGltZW91dF9tc2cgPSAoYmFsX29hbV90aW1lb3V0X21zZyAqKW1zZzsKKyAgICBiYWxfb2FtX2NvbnRleHQgKmNvbnRleHQgPSBiYWxfb2FtX2dldF9jb250ZXh0KHRpbWVvdXRfbXNnLT5kZXZpY2VfaWQsIHRpbWVvdXRfbXNnLT5lcG9uX25pLCAmdGltZW91dF9tc2ctPm1hYyk7CisKKyAgICBiYWxfb2FtX2NvbmZpZ3VyZV90cmFmZmljX2NvbXBsZXRlKGNvbnRleHQsIEJDTV9FUlJfVElNRU9VVCk7CisKKyAgICBiY21vc19tc2dfZnJlZShtc2cpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX29hbV9zdGF0ZV9hbnlfZXZlbnRfdGltZW91dChiYWxfb2FtX2NvbnRleHQgKmNvbnRleHQpCit7CisgICAgYmFsX29hbV90aW1lb3V0X21zZyAqbXNnOworCisgICAgLyogV2Ugc2hvdWxkIG5vdCBkaXJlY3RseSBjYWxsIGJhbF9vYW1fY29uZmlndXJlX3RyYWZmaWNfY29tcGxldGUoKSBmcm9tIHdpdGhpbiB0aW1lciBjb250ZXh0LCBiZWNhdXNlIGluIGJhbF9vYW1fY29uZmlndXJlX3RyYWZmaWNfY29tcGxldGUoKSB3ZSBmcmVlIHRoZSBtZW1vcnkgaW4gd2hpY2ggdGhlIHRpbWVyCisgICAgICogcmVzaWRlcy4gVG8gb3ZlcmNvbWUgdGhpcywgd2UgdXNlIGEgbWVzc2FnZSAtIHRoZSB0aW1lciB3aWxsIGZpbmlzaCBleGVjdXRpbmcgYW5kIG9ubHkgdGhlbiB0aGUgbWVzc2FnZSBoYW5kbGVyIHdpbGwgZXhlY3V0ZS4gKi8KKyAgICBtc2cgPSBiY21vc19jYWxsb2Moc2l6ZW9mKCptc2cpKTsgCisgICAgbXNnLT5kZXZpY2VfaWQgPSBjb250ZXh0LT5kZXZpY2VfaWQ7CisgICAgbXNnLT5lcG9uX25pID0gY29udGV4dC0+ZXBvbl9uaTsKKyAgICBtc2ctPm1hYyA9IGNvbnRleHQtPm1hYzsKKyAgICBtc2ctPm0uaGFuZGxlciA9IGJhbF9vYW1fdGltZW91dF9tc2dfY2I7CisgICAgYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9XT1JLRVJfTUdNVCwgJm1zZy0+bSwgMCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9vYW1fc3RhdGVfc2V0X29hbV9yYXRlX2V2ZW50X2FjayhiYWxfb2FtX2NvbnRleHQgKmNvbnRleHQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBDbGVhciBFUE9OIHBvcnQgaW5ncmVzcy4gKi8KKyAgICByYyA9IGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19uZXR3b3JrX3Bvbihjb250ZXh0LT5kZXZpY2VfaWQsIGNvbnRleHQtPmVwb25fbmksICZjb250ZXh0LT5tYWMpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmFsX29hbV9jb25maWd1cmVfdHJhZmZpY19jb21wbGV0ZShjb250ZXh0LCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgCisgICAgYmNtb3NfdGltZXJfc3RhcnQoJmNvbnRleHQtPnRpbWVyLCBCQUxfT0FNX1RJTUVPVVRfVVMpOworCisgICAgY29udGV4dC0+c3RhdGUgPSBCQUxfT0FNX1NUQVRFX0NMRUFSX0lOR1JFU1NfUlVMRVNfTkVUV09SS19QT047CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9vYW1fc3RhdGVfY2xlYXJfaW5ncmVzc19ydWxlc19uZXR3b3JrX3Bvbl9ldmVudF9hY2soYmFsX29hbV9jb250ZXh0ICpjb250ZXh0KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogQ2xlYXIgVU5JIHBvcnQgaW5ncmVzcyBydWxlcy4gKi8KKyAgICByYyA9IGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc191c2VyX3BvcnQoY29udGV4dC0+ZGV2aWNlX2lkLCBjb250ZXh0LT5lcG9uX25pLCAmY29udGV4dC0+bWFjKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJhbF9vYW1fY29uZmlndXJlX3RyYWZmaWNfY29tcGxldGUoY29udGV4dCwgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgYmNtb3NfdGltZXJfc3RhcnQoJmNvbnRleHQtPnRpbWVyLCBCQUxfT0FNX1RJTUVPVVRfVVMpOworCisgICAgY29udGV4dC0+c3RhdGUgPSBCQUxfT0FNX1NUQVRFX0NMRUFSX0lOR1JFU1NfUlVMRVNfVVNFUl9QT1JUOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiYWxfb2FtX3N0YXRlX2NsZWFyX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0X2V2ZW50X2FjayhiYWxfb2FtX2NvbnRleHQgKmNvbnRleHQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBTZXQgT05VIHF1ZXVlIGNvbmZpZ3VyYXRpb24uICovCisgICAgcmMgPSBlcG9uX29hbV9kcG9lX3NldF9iYXNpY19xdWV1ZV9jb25maWcoY29udGV4dC0+ZGV2aWNlX2lkLCBjb250ZXh0LT5lcG9uX25pLCAmY29udGV4dC0+bWFjLCAyNTUsIDI1NSk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiYWxfb2FtX2NvbmZpZ3VyZV90cmFmZmljX2NvbXBsZXRlKGNvbnRleHQsIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZjb250ZXh0LT50aW1lciwgQkFMX09BTV9USU1FT1VUX1VTKTsKKworICAgIGNvbnRleHQtPnN0YXRlID0gQkFMX09BTV9TVEFURV9TRVRfQkFTSUNfUVVFVUVfQ09ORklHOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiYWxfb2FtX3N0YXRlX3NldF9iYXNpY19xdWV1ZV9jb25maWdfZXZlbnRfYWNrKGJhbF9vYW1fY29udGV4dCAqY29udGV4dCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIEFkZCBFUE9OIHBvcnQgaW5ncmVzcyBydWxlcyAqLworICAgIHJjID0gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19uZXR3b3JrX3Bvbihjb250ZXh0LT5kZXZpY2VfaWQsIGNvbnRleHQtPmVwb25fbmksICZjb250ZXh0LT5tYWMsIERQT0VfUlVMRV9WTEFOX01PREVfTk9ORSwgTlVMTCk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiYWxfb2FtX2NvbmZpZ3VyZV90cmFmZmljX2NvbXBsZXRlKGNvbnRleHQsIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICAKKyAgICBiY21vc190aW1lcl9zdGFydCgmY29udGV4dC0+dGltZXIsIEJBTF9PQU1fVElNRU9VVF9VUyk7CisgICAgCisgICAgY29udGV4dC0+c3RhdGUgPSBCQUxfT0FNX1NUQVRFX0FERF9JTkdSRVNTX1JVTEVTX05FVFdPUktfUE9OOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiYWxfb2FtX3N0YXRlX2FkZF9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uX2V2ZW50X2FjayhiYWxfb2FtX2NvbnRleHQgKmNvbnRleHQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBBZGQgVU5JIHBvcnQgaW5ncmVzcyBydWxlcy4gKi8KKyAgICByYyA9IGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0KGNvbnRleHQtPmRldmljZV9pZCwgY29udGV4dC0+ZXBvbl9uaSwgJmNvbnRleHQtPm1hYywgRFBPRV9SVUxFX1ZMQU5fTU9ERV9OT05FLCBOVUxMKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJhbF9vYW1fY29uZmlndXJlX3RyYWZmaWNfY29tcGxldGUoY29udGV4dCwgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIAorICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZjb250ZXh0LT50aW1lciwgQkFMX09BTV9USU1FT1VUX1VTKTsKKworICAgIGNvbnRleHQtPnN0YXRlID0gQkFMX09BTV9TVEFURV9BRERfSU5HUkVTU19SVUxFU19VU0VSX1BPUlQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9vYW1fc3RhdGVfYWRkX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0X2V2ZW50X2FjayhiYWxfb2FtX2NvbnRleHQgKmNvbnRleHQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2Vwb25fb2FtX3F1ZXVlX3NldHMgcXVldWVfc2V0cyA9CisgICAgeworICAgICAgICBbMF0gPSB7MTYyNTZ9LAorICAgICAgICBbMV0gPSB7MzI1MTJ9LAorICAgICAgICBbMl0gPSB7NDg3Njh9LAorICAgICAgICBbM10gPSB7NjUwMjR9LAorICAgIH07CisKKyAgICAvKiBTZXQgT05VIHJlcG9ydCB0aHJlc2hvbGRzLiAqLworICAgIHJjID0gZXBvbl9vYW1fZHBvZV9zZXRfcmVwb3J0X3RocmVzaG9sZHMoY29udGV4dC0+ZGV2aWNlX2lkLCBjb250ZXh0LT5lcG9uX25pLCAmY29udGV4dC0+bWFjLCAxLCBxdWV1ZV9zZXRzLCA0KTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJhbF9vYW1fY29uZmlndXJlX3RyYWZmaWNfY29tcGxldGUoY29udGV4dCwgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIAorICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZjb250ZXh0LT50aW1lciwgQkFMX09BTV9USU1FT1VUX1VTKTsKKworICAgIGNvbnRleHQtPnN0YXRlID0gQkFMX09BTV9TVEFURV9TRVRfUkVQT1JUX1RIUkVTSE9MRFM7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9vYW1fc3RhdGVfc2V0X3JlcG9ydF90aHJlc2hvbGRzX2V2ZW50X2FjayhiYWxfb2FtX2NvbnRleHQgKmNvbnRleHQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBFbmFibGUgdXNlciB0cmFmZmljLiAqLworICAgIHJjID0gZXBvbl9vYW1fZHBvZV9lbmFibGVfdXNlcl90cmFmZmljKGNvbnRleHQtPmRldmljZV9pZCwgY29udGV4dC0+ZXBvbl9uaSwgJmNvbnRleHQtPm1hYyk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiYWxfb2FtX2NvbmZpZ3VyZV90cmFmZmljX2NvbXBsZXRlKGNvbnRleHQsIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICAKKyAgICBiY21vc190aW1lcl9zdGFydCgmY29udGV4dC0+dGltZXIsIEJBTF9PQU1fVElNRU9VVF9VUyk7CisgICAgCisgICAgY29udGV4dC0+c3RhdGUgPSBCQUxfT0FNX1NUQVRFX0VOQUJMRV9VU0VSX1RSQUZGSUM7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9vYW1fc3RhdGVfZW5hYmxlX3VzZXJfdHJhZmZpY19ldmVudF9hY2soYmFsX29hbV9jb250ZXh0ICpjb250ZXh0KQoreworICAgIGJhbF9vYW1fY29uZmlndXJlX3RyYWZmaWNfY29tcGxldGUoY29udGV4dCwgQkNNX0VSUl9PSyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9vYW1fc3RhdGVfZGlzYWJsZV91c2VyX3RyYWZmaWNfZXZlbnRfYWNrKGJhbF9vYW1fY29udGV4dCAqY29udGV4dCkKK3sKKyAgICBiYWxfb2FtX2NvbmZpZ3VyZV90cmFmZmljX2NvbXBsZXRlKGNvbnRleHQsICBCQ01fRVJSX09LKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmFsX29hbV9zbV9jYiBiYWxfb2FtX3N0YXRlX21hY2hpbmVbQkFMX09BTV9TVEFURV9fTlVNX09GXVtCQUxfT0FNX0VWRU5UX19OVU1fT0ZdID0KK3sKKyAgICBbQkFMX09BTV9TVEFURV9TRVRfT0FNX1JBVEVdID0KKyAgICB7CisgICAgICAgIFtCQUxfT0FNX0VWRU5UX1RJTUVPVVRdID0gYmFsX29hbV9zdGF0ZV9hbnlfZXZlbnRfdGltZW91dCwKKyAgICAgICAgW0JBTF9PQU1fRVZFTlRfQUNLXSA9IGJhbF9vYW1fc3RhdGVfc2V0X29hbV9yYXRlX2V2ZW50X2FjaywKKyAgICB9LAorICAgIFtCQUxfT0FNX1NUQVRFX0NMRUFSX0lOR1JFU1NfUlVMRVNfTkVUV09SS19QT05dID0KKyAgICB7CisgICAgICAgIFtCQUxfT0FNX0VWRU5UX1RJTUVPVVRdID0gYmFsX29hbV9zdGF0ZV9hbnlfZXZlbnRfdGltZW91dCwKKyAgICAgICAgW0JBTF9PQU1fRVZFTlRfQUNLXSA9IGJhbF9vYW1fc3RhdGVfY2xlYXJfaW5ncmVzc19ydWxlc19uZXR3b3JrX3Bvbl9ldmVudF9hY2ssCisgICAgfSwKKyAgICBbQkFMX09BTV9TVEFURV9DTEVBUl9JTkdSRVNTX1JVTEVTX1VTRVJfUE9SVF0gPQorICAgIHsKKyAgICAgICAgW0JBTF9PQU1fRVZFTlRfVElNRU9VVF0gPSBiYWxfb2FtX3N0YXRlX2FueV9ldmVudF90aW1lb3V0LAorICAgICAgICBbQkFMX09BTV9FVkVOVF9BQ0tdID0gYmFsX29hbV9zdGF0ZV9jbGVhcl9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydF9ldmVudF9hY2ssCisgICAgfSwKKyAgICBbQkFMX09BTV9TVEFURV9TRVRfQkFTSUNfUVVFVUVfQ09ORklHXSA9CisgICAgeworICAgICAgICBbQkFMX09BTV9FVkVOVF9USU1FT1VUXSA9IGJhbF9vYW1fc3RhdGVfYW55X2V2ZW50X3RpbWVvdXQsCisgICAgICAgIFtCQUxfT0FNX0VWRU5UX0FDS10gPSBiYWxfb2FtX3N0YXRlX3NldF9iYXNpY19xdWV1ZV9jb25maWdfZXZlbnRfYWNrLAorICAgIH0sCisgICAgW0JBTF9PQU1fU1RBVEVfQUREX0lOR1JFU1NfUlVMRVNfTkVUV09SS19QT05dID0KKyAgICB7CisgICAgICAgIFtCQUxfT0FNX0VWRU5UX1RJTUVPVVRdID0gYmFsX29hbV9zdGF0ZV9hbnlfZXZlbnRfdGltZW91dCwKKyAgICAgICAgW0JBTF9PQU1fRVZFTlRfQUNLXSA9IGJhbF9vYW1fc3RhdGVfYWRkX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb25fZXZlbnRfYWNrLAorICAgIH0sCisgICAgW0JBTF9PQU1fU1RBVEVfQUREX0lOR1JFU1NfUlVMRVNfVVNFUl9QT1JUXSA9CisgICAgeworICAgICAgICBbQkFMX09BTV9FVkVOVF9USU1FT1VUXSA9IGJhbF9vYW1fc3RhdGVfYW55X2V2ZW50X3RpbWVvdXQsCisgICAgICAgIFtCQUxfT0FNX0VWRU5UX0FDS10gPSBiYWxfb2FtX3N0YXRlX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydF9ldmVudF9hY2ssCisgICAgfSwKKyAgICBbQkFMX09BTV9TVEFURV9TRVRfUkVQT1JUX1RIUkVTSE9MRFNdID0KKyAgICB7CisgICAgICAgIFtCQUxfT0FNX0VWRU5UX1RJTUVPVVRdID0gYmFsX29hbV9zdGF0ZV9hbnlfZXZlbnRfdGltZW91dCwKKyAgICAgICAgW0JBTF9PQU1fRVZFTlRfQUNLXSA9IGJhbF9vYW1fc3RhdGVfc2V0X3JlcG9ydF90aHJlc2hvbGRzX2V2ZW50X2FjaywKKyAgICB9LAorICAgIFtCQUxfT0FNX1NUQVRFX0VOQUJMRV9VU0VSX1RSQUZGSUNdID0KKyAgICB7CisgICAgICAgIFtCQUxfT0FNX0VWRU5UX1RJTUVPVVRdID0gYmFsX29hbV9zdGF0ZV9hbnlfZXZlbnRfdGltZW91dCwKKyAgICAgICAgW0JBTF9PQU1fRVZFTlRfQUNLXSA9IGJhbF9vYW1fc3RhdGVfZW5hYmxlX3VzZXJfdHJhZmZpY19ldmVudF9hY2ssCisgICAgfSwKKyAgICBbQkFMX09BTV9TVEFURV9ESVNBQkxFX1VTRVJfVFJBRkZJQ10gPQorICAgIHsKKyAgICAgICAgW0JBTF9PQU1fRVZFTlRfVElNRU9VVF0gPSBiYWxfb2FtX3N0YXRlX2FueV9ldmVudF90aW1lb3V0LAorICAgICAgICBbQkFMX09BTV9FVkVOVF9BQ0tdID0gYmFsX29hbV9zdGF0ZV9kaXNhYmxlX3VzZXJfdHJhZmZpY19ldmVudF9hY2ssCisgICAgfSwKK307CisKK3N0YXRpYyB2b2lkIGJhbF9vYW1fc21fcnVuKGJhbF9vYW1fY29udGV4dCAqY29udGV4dCwgYmFsX29hbV9ldmVudCBldmVudCkKK3sKKyAgICBiYWxfb2FtX3NtX2NiIGNiID0gYmFsX29hbV9zdGF0ZV9tYWNoaW5lW2NvbnRleHQtPnN0YXRlXVtldmVudF07CisKKyAgICBjYihjb250ZXh0KTsKK30KKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIGJhbF9vYW1fdGltZW91dF9jYihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiYWxfb2FtX2NvbnRleHQgKmNvbnRleHQgPSAoYmFsX29hbV9jb250ZXh0ICopZGF0YTsKKworICAgIGJhbF9vYW1fc21fcnVuKGNvbnRleHQsIEJBTF9PQU1fRVZFTlRfVElNRU9VVCk7CisKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJhbF9vYW1fY29uZmlndXJlX3RyYWZmaWMoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywgYmNtb3NfYm9vbCBpc19lbmFibGVkLCBiYWxfb2FtX2NiIGNiLCB2b2lkICpjb250ZXh0KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJhbF9vYW1fY29udGV4dCAqX2NvbnRleHQ7CisgICAgYmNtb3NfdGltZXJfcGFybSB0aW1lcl9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiYmFsX29hbV90aW1lciIsCisgICAgICAgIC5vd25lciA9IEJDTU9TX01PRFVMRV9JRF9XT1JLRVJfTUdNVCwKKyAgICAgICAgLmhhbmRsZXIgPSBiYWxfb2FtX3RpbWVvdXRfY2IsCisgICAgfTsKKworICAgIF9jb250ZXh0ID0gYmNtb3NfY2FsbG9jKHNpemVvZigqX2NvbnRleHQpKTsKKyAgICBfY29udGV4dC0+Y2IgPSBjYjsKKyAgICBfY29udGV4dC0+Y29udGV4dCA9IGNvbnRleHQ7CisgICAgX2NvbnRleHQtPmRldmljZV9pZCA9IGRldmljZV9pZDsKKyAgICBfY29udGV4dC0+ZXBvbl9uaSA9IGVwb25fbmk7CisgICAgX2NvbnRleHQtPm1hYyA9ICptYWM7CisgICAgVEFJTFFfSU5TRVJUX1RBSUwoJmJhbF9vYW1fY29udGV4dHMsIF9jb250ZXh0LCBuZXh0KTsKKworICAgIGlmIChpc19lbmFibGVkKQorICAgIHsKKyAgICAgICAgLyogU2V0IE9BTSByYXRlLiAqLworICAgICAgICByYyA9IGVwb25fb2FtX2Rwb2Vfc2V0X29hbV9yYXRlKGRldmljZV9pZCwgZXBvbl9uaSwgbWFjLCAxMCwgMyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIERpc2FibGUgdXNlciB0cmFmZmljLiAqLworICAgICAgICByYyA9IGVwb25fb2FtX2Rwb2VfZGlzYWJsZV91c2VyX3RyYWZmaWMoZGV2aWNlX2lkLCBlcG9uX25pLCBtYWMpOworICAgIH0KKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJhbF9vYW1fY29uZmlndXJlX3RyYWZmaWNfY29tcGxldGUoX2NvbnRleHQsIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHRpbWVyX3BhcmFtcy5kYXRhID0gKGxvbmcpX2NvbnRleHQ7CisgICAgYmNtb3NfdGltZXJfY3JlYXRlKCZfY29udGV4dC0+dGltZXIsICZ0aW1lcl9wYXJhbXMpOworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZfY29udGV4dC0+dGltZXIsIEJBTF9PQU1fVElNRU9VVF9VUyk7CisKKyAgICBpZiAoaXNfZW5hYmxlZCkKKyAgICAgICAgX2NvbnRleHQtPnN0YXRlID0gQkFMX09BTV9TVEFURV9TRVRfT0FNX1JBVEU7CisgICAgZWxzZQorICAgICAgICBfY29udGV4dC0+c3RhdGUgPSBCQUxfT0FNX1NUQVRFX0RJU0FCTEVfVVNFUl9UUkFGRklDOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFRPRE86IEN1cnJlbnRseSB3ZSBpZ25vcmUgcmMuIEJ1dCB3ZSBtYXkgd2FudCB0byBjaGVjayBpdC4gKi8KK3ZvaWQgYmFsX29hbV9wcm94eV9yeF9jYihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfZXBvbl9uaSBlcG9uX25pLCBjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqbWFjLCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX3J4X2lkIGlkLCBiY21vc19lcnJubyByYykKK3sKKyAgICBiYWxfb2FtX2NvbnRleHQgKmNvbnRleHQ7CisKKyAgICBpZiAoaWQgIT0gQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EUE9FX1NFVF9SRVNQT05TRSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogSWYgYXBwbHlpbmcgc2V0IGNvbW1hbmQgbm90IGZyb20gd2l0aGluIGJhbF9vYW1fY29uZmlndXJlX3RyYWZmaWMoKSAoZm9yIGV4YW1wbGUsIGZyb20gQkFMIENMSSksIGNvbnRleHQgbWlnaHQgYmUgTlVMTC4gKi8KKyAgICBjb250ZXh0ID0gYmFsX29hbV9nZXRfY29udGV4dChkZXZpY2VfaWQsIGVwb25fbmksIG1hYyk7CisgICAgaWYgKCFjb250ZXh0KQorICAgICAgICByZXR1cm47CisKKyAgICBiYWxfb2FtX3NtX3J1bihjb250ZXh0LCBCQUxfT0FNX0VWRU5UX0FDSyk7Cit9CisKKy8qQH0qLworCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9iYWxfb2FtX3V0aWwuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2JhbF9vYW1fdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YWYxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9iYWxfb2FtX3V0aWwuaApAQCAtMCwwICsxLDEwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX29hbV91dGlsLmgKKyAqCisgKiBAYnJpZWYgT0FNIHV0aWwgaW50ZXJmYWNlcyBoZWFkZXIgZmlsZQorICoKKyAqIFRoaXMgZmlsZSBleHBvc2UgdGhlIEFQSXMgdG8gdGhlIGNvcmUgdG8gY29uZmlndXJlIE9OVSB2aWEgRVBPTiBPQU0KKyAqCisgKiBAZGVmZ3JvdXAgb2FtX3V0aWwgT0FNIFV0aWwKKyAqIEBpbmdyb3VwIGNvcmUKKyAqLworIAorI2lmbmRlZiBCQUxfT0FNX1VUSUxfSAorI2RlZmluZSBCQUxfT0FNX1VUSUxfSAorCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5oPgorCit0eXBlZGVmIHZvaWQgKCpiYWxfb2FtX2NiKSh2b2lkICpjb250ZXh0LCBiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfZXBvbl9uaSBlcG9uX25pLCBjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqbWFjX2FkZHJlc3MsIGJjbW9zX2Vycm5vIHJlc3VsdCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIFN0YXJ0IE9BTSBuZWdvdGlhdGlvbiBmb3IgYSBnaXZlbiBNQUMgYWRkcmVzcy4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2lkICAgRGV2aWNlIElEIGZvciB3aGljaCB3ZSBzdGFydCBPQU0gbmVnb3RpYXRpb24KKyAqIEBwYXJhbSBlcG9uX25pICAgICBFUE9OIE5JIGZvciB3aGljaCB3ZSBzdGFydCBPQU0gbmVnb3RpYXRpb24KKyAqIEBwYXJhbSBtYWMgICAgICAgICBNQUMgYWRkcmVzcyBmb3Igd2hpY2ggd2Ugc3RhcnQgT0FNIG5lZ290aWF0aW9uCisgKiBAcGFyYW0gY2IgICAgICAgICAgQ2FsbGJhY2sgY2FsbGVkIHVwb24gY29tcGxldGlvbiwgd2l0aCBzdWNjZXNzIG9yIGZhaWx1cmUKKyAqICAgICAgICAgICAgICAgICAgICBjb2RlLiBJZiBvbWl0dGVkLCBhIGRlZmF1bHQgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCBqdXN0IGxvZyB0aGUgcmV0dXJuIGNvZGUKKyAqIEBwYXJhbSBjb250ZXh0ICAgICBjb250ZXh0IGZvciB0aGUgYWJvdmUgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgIAorICoKKyAqIEByZXR1cm5zIEJDTV9FUlJfT0sgb24gc3VjY2Vzcywgb3RoZXIgYmNtb3NfZXJybm8gY29kZXMgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmFsX29hbV9zdGFydF9vYW1fbmVnb3RpYXRpb24oYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywgYmFsX29hbV9jYiBjYiwgdm9pZCAqY29udGV4dCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEVuYWJsZSB0cmFmZmljIGZvciBhIGdpdmVuIE1BQyBhZGRyZXNzLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgICBEZXZpY2UgSUQgZm9yIHdoaWNoIHdlIGVuYWJsZS9kaXNhYmxlIHRyYWZmaWMKKyAqIEBwYXJhbSBlcG9uX25pICAgICBFUE9OIE5JIGZvciB3aGljaCB3ZSBlbmFibGUvZGlzYWJsZSB0cmFmZmljIAorICogQHBhcmFtIG1hYyAgICAgICAgIE1BQyBhZGRyZXNzIGZvciB3aGljaCB3ZSBlbmFibGUvZGlzYWJsZSB0cmFmZmljIAorICogQHBhcmFtIGlzX2VuYWJsZWQgIFdoZXRoZXIgd2Ugc2hvdWxkIGVuYWJsZSBvciBkaXNhYmxlIHRyYWZmaWMgCisgKiBAcGFyYW0gY2IgICAgICAgICAgQ2FsbGJhY2sgY2FsbGVkIHVwb24gY29tcGxldGlvbiwgd2l0aCBzdWNjZXNzIG9yIGZhaWx1cmUKKyAqICAgICAgICAgICAgICAgICAgICBjb2RlLiBJZiBvbWl0dGVkLCBhIGRlZmF1bHQgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCBqdXN0IGxvZyB0aGUgcmV0dXJuIGNvZGUKKyAqIEBwYXJhbSBjb250ZXh0ICAgICBjb250ZXh0IGZvciB0aGUgYWJvdmUgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgIAorICoKKyAqIEByZXR1cm5zIEJDTV9FUlJfT0sgb24gc3VjY2Vzcywgb3RoZXIgYmNtb3NfZXJybm8gY29kZXMgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmFsX29hbV9jb25maWd1cmVfdHJhZmZpYyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfZXBvbl9uaSBlcG9uX25pLCBiY21vc19tYWNfYWRkcmVzcyAqbWFjLCBiY21vc19ib29sIGlzX2VuYWJsZWQsIGJhbF9vYW1fY2IgY2IsIHZvaWQgKmNvbnRleHQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBDYWxsYmFjayBiZWluZyBjYWxsZWQgd2hlbmV2ZXIgYW4gT0FNIG1lc3NhZ2UgKHByb3h5IHJ4KSBhcnJpdmVzIGFuZAorICogICAgICAgIHByb2Nlc3NlZCBieSBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9wcm94eV9yeCgpLgorICoKKyAqIEBwYXJhbSBkZXZpY2VfaWQgICBEZXZpY2UgSUQgZm9yIHdoaWNoIHdlIGdvdCB0aGUgbWVzc2FnZQorICogQHBhcmFtIGVwb25fbmkgICAgIEVQT04gTkkgZm9yIHdoaWNoIHdlIGdvdCB0aGUgbWVzc2FnZQorICogQHBhcmFtIG1hYyAgICAgICAgIE1BQyBhZGRyZXNzIGZvciB3aGljaCB3ZSBnb3QgdGhlIG1lc3NhZ2UKKyAqIEBwYXJhbSBpZCAgICAgICAgICBUaGUgdHlwZSBvZiBtZXNzYWdlICAgICAgICAgICAgICAgICAgICAKKyAqIEBwYXJhbSByYyAgICAgICAgICBPQU0gcmVzcG9uc2Ugc3VjY2Vzcy9mYWlsIGNvZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJhbF9vYW1fcHJveHlfcnhfY2IoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwgY29uc3QgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9yeF9pZCBpZCwgYmNtb3NfZXJybm8gcmMpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vY29tbW9uX2Vwb25fb2FtIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vY29tbW9uX2Vwb25fb2FtCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjUzNzZiZTcKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9jb21tb25fZXBvbl9vYW0KQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vvbi9NYWtlZmlsZSBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vvbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzk0YWJlCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsNTcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorIyAgCisjICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyMgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgIAorIyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorIyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorIyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisjICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyMgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisjICAKKyMgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyMgICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorIyAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorIyAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorIyAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisjICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisjICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworIyAgICAgb2YgdGhlIHNvZnR3YXJlLgorIyAgCisjICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyMgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorIyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyMgIHdyaXR0ZW4gY29uc2VudC4KKyMgIAorIyAgOj4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRVBPTiBPQU0gTmVnb3RpYXRpb24gdXNlciBhcHBsaWNhdGlvbgorCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKworCU1PRF9OQU1FID0gYmNtX3VzZXJfYXBwbF9lb24KKwlNT0RfVFlQRSA9IGxpYgorCU1PRF9ERVBTID0gYmFsX2FwaSBjb21tb25fZXBvbl9vYW0gYmNtX3VzZXJfYXBwbF9lcG9uX29hbQorCisJaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisJCU1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKwllbmRpZgorCisJc3JjcyA9IGJjbW9sdF9lb24uYyBiY21vbHRfZW9uX2xvZy5jIGJjbW9sdF9vYW1faGVhcnRiZWF0LmMKKworCUVOQUJMRV9EUE9FX09BTSA/PSB5CisJaWZlcSAoIiQoRU5BQkxFX0RQT0VfT0FNKSIsICJ5IikKKwkJRVhUUkFfREVGSU5FUyArPSAtREVPTl9PQU1fU0VUX0RQT0VfU1VQUE9SVEVECisJCXNyY3MgKz0gb2FtX3NldHMvZHBvZS9kcG9lLmMKKwllbmRpZiAjIEVOQUJMRV9EUE9FX09BTQorCisJRU5BQkxFX0JSQ01fT0FNID89IHkKKwlpZmVxICgiJChFTkFCTEVfQlJDTV9PQU0pIiwgInkiKQorCQlFWFRSQV9ERUZJTkVTICs9IC1ERU9OX09BTV9TRVRfQlJDTV9TVVBQT1JURUQKKwkJc3JjcyArPSBvYW1fc2V0cy9icmNtL2JyY20uYworCWVuZGlmICMgRU5BQkxFX0JSQ01fT0FNCisKK2VuZGlmCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lb24vYmNtb2x0X2Vvbi5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2JjbW9sdF9lb24uYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44ZjMwMDNkCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2JjbW9sdF9lb24uYwpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lb24vYmNtb2x0X2Vvbi5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2JjbW9sdF9lb24uaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5kN2Y4NTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2JjbW9sdF9lb24uaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lb24vYmNtb2x0X2Vvbl9sb2cuYyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vvbi9iY21vbHRfZW9uX2xvZy5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjczYzVjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lb24vYmNtb2x0X2Vvbl9sb2cuYwpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uX2xvZy5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2JjbW9sdF9lb25fbG9nLmggYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lb24vYmNtb2x0X2Vvbl9sb2cuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4xNjRiYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2JjbW9sdF9lb25fbG9nLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbl9sb2cuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vvbi9iY21vbHRfZW9uX3ByaXZhdGUuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vvbi9iY21vbHRfZW9uX3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zNDE3ZWExCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2JjbW9sdF9lb25fcHJpdmF0ZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uLy4uLzNyZHBhcnR5L21hcGxlL3Nkay9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL2JjbW9sdF9lb25fcHJpdmF0ZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2JjbW9sdF9vYW1faGVhcnRiZWF0LmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lb24vYmNtb2x0X29hbV9oZWFydGJlYXQuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lZTk2ZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2JjbW9sdF9vYW1faGVhcnRiZWF0LmMKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X29hbV9oZWFydGJlYXQuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vvbi9iY21vbHRfb2FtX2hlYXJ0YmVhdC5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2JjbW9sdF9vYW1faGVhcnRiZWF0LmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTQ1YzFjZAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vvbi9iY21vbHRfb2FtX2hlYXJ0YmVhdC5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uLy4uLzNyZHBhcnR5L21hcGxlL3Nkay9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL2JjbW9sdF9vYW1faGVhcnRiZWF0LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lb24vZG9jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2RvYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45YTA3NmM2Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZW9uL2RvYwpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9kb2MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lb24vb2FtX3NldHMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lb24vb2FtX3NldHMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTk5MjZlOAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vvbi9vYW1fc2V0cwpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vwb25fb2FtL01ha2VmaWxlIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZXBvbl9vYW0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5MzUyYQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vwb25fb2FtL01ha2VmaWxlCkBAIC0wLDAgKzEsNDIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorIyAgCisjICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyMgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgIAorIyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorIyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorIyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisjICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyMgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisjICAKKyMgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyMgICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorIyAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorIyAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorIyAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisjICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisjICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworIyAgICAgb2YgdGhlIHNvZnR3YXJlLgorIyAgCisjICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyMgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorIyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyMgIHdyaXR0ZW4gY29uc2VudC4KKyMgIAorIyAgOj4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorICAgIE1PRF9OQU1FID0gYmNtX3VzZXJfYXBwbF9lcG9uX29hbQorICAgIE1PRF9UWVBFID0gbGliCisJTU9EX0RFUFMgPSB1dGlscyBkZXZfbG9nIGNvbW1vbl9lcG9uX29hbSBiYWxfYXBpCisKKwlzcmNzID0gYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5jCisKKyAgICBpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKwlNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisgICAgZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uYyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45MGZiZmVlCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZXBvbl9vYW0vYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5jCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uLy4uLzNyZHBhcnR5L21hcGxlL3Nkay9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0vYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZXBvbl9vYW0vYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9vYW0vZXBvbl9vYW0vYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmVkOTdjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lcG9uX29hbS9iY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vLi4vM3JkcGFydHkvbWFwbGUvc2RrL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbS9iY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lcG9uX29hbV9jbGkgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL29hbS9lcG9uX29hbV9jbGkKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjc1ODM4MgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvb2FtL2Vwb25fb2FtX2NsaQpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi8zcmRwYXJ0eS9tYXBsZS9zZGsvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtX2NsaQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL01ha2VmaWxlIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmM2FhZQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL01ha2VmaWxlCkBAIC0wLDAgKzEsNDYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorIyAgCisjICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyMgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgIAorIyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorIyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorIyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisjICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyMgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisjICAKKyMgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyMgICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorIyAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorIyAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorIyAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisjICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisjICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworIyAgICAgb2YgdGhlIHNvZnR3YXJlLgorIyAgCisjICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyMgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorIyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyMgIHdyaXR0ZW4gY29uc2VudC4KKyMgIAorIyAgOj4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQkFMIFN3aXRjaCBVdGlsICAKK01PRF9OQU1FID0gYmFsX3N3aXRjaF91dGlsCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSBkZXZfbG9nIHV0aWxzIGJhbF9hcGkgYmFsX2FwcF91dGlscyBzd2l0Y2hfdXRpbF9kcHAgc3dpdGNoX3V0aWxfZXN3IAorc3JjcyA9IGJhbF9zd2l0Y2hfdXRpbC5jIGJhbF9zd2l0Y2hfYWNjX3Rlcm0uYyBiYWxfc3dpdGNoX2Zsb3cuYyBiYWxfc3dpdGNoX2NsaS5jIGJhbF9zd2l0Y2hfaW50ZXJmYWNlLmMgYmFsX3N3aXRjaF9ncm91cC5jIGJhbF9zd2l0Y2hfdG1fc2NoZWQuYyBiYWxfc3dpdGNoX3RtX3F1ZXVlLmMKK0VYVFJBX0NGTEFHUyArPSAtSSQoU1JDX0RJUikvLi4vLi4vbWFpbgorCitpZmVxICgiJChURVNUX1NXX1VUSUxfTE9PUEJBQ0spIiwgInkiKQorCU1PRF9ERUZTICs9IC1EVEVTVF9TV19VVElMX0xPT1BCQUNLCitlbHNlCQorCU1PRF9ERVBTICs9ICBzd2l0Y2hfc2RrCitlbmRpZgorCitpZmVxICgiJChTV0lUQ0gpIiwgImt0MiIpCisgICAgICAgTU9EX0RFRlMgKz0gLURFU1dfU1dJVENICitlbmRpZgpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF9hY2NfdGVybS5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF9hY2NfdGVybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMWJlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX2FjY190ZXJtLmMKQEAgLTAsMCArMSwxMDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICoKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxiYWxfY29tbW9uLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiYWxfbXNnLmg+CisjaW5jbHVkZSAiYmFsX3N3aXRjaF91dGlsLmgiCisjaW5jbHVkZSAiYmFsX3N3aXRjaF9hY2NfdGVybS5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfZmxvdy5oIgorI2luY2x1ZGUgPGJhbF93b3JrZXIuaD4KKy8qIGRlY2xhcmUgRU5WIHNvIHRoYXQgdGhlIGJjbS9yeC5oIGluIHRoZSBiYWxfZHBwX2FjY190ZXJtLmggY2FuIGNyZWF0ZSB0aGUgY29ycmVjdCBiY21fcGt0X3Qgc3RydWN0dXJlICovCisjaWZkZWYgRVNXX1NXSVRDSAorI2RlZmluZSBCQ01fRVNXX1NVUFBPUlQgMQorI2Vsc2UKKyNkZWZpbmUgQkNNX0ROWF9TVVBQT1JUICAxCisjZW5kaWYKKyNpbmNsdWRlICJlc3cvYmFsX2Vzd19hY2NfdGVybS5oIgorI2luY2x1ZGUgImRwcC9iYWxfZHBwX2FjY190ZXJtLmgiCisvKiBCZWxvdyBsb2NhbCBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIHJlYWwgbG9naWMgb25seSAqLworI2lmbmRlZiBURVNUX1NXX1VUSUxfTE9PUEJBQ0sKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxiY20vaW5pdC5oPgorI2luY2x1ZGUgPGJjbS90eXBlcy5oPgorI2luY2x1ZGUgPGJjbS9wb3J0Lmg+CisjaW5jbHVkZSA8YXBwbC9kaWFnL3NoZWxsLmg+ICAgICAvKiBmb3IgLnNvYyBsb2FkaW5nICovCisKK2V4dGVybiBpbnQgc29jZGlhZ19tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pOworCisvKioKKyAqIEBmaWxlIGJhbF9zd2l0Y2hfYWNjX3Rlcm0uYworICogQGJyaWVmIEJBTCBTd2l0Y2ggdXRpbCBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgYWNjZXNzIHRlcm1pbmFsIHJlcXVlc3RzCisgKiBAYWRkdG9ncm91cCBzd191dGlsCisgKgorICovCisKKy8qQHsqLworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgc3dfdXRpbF9iY21fcnhfY2IgKGludCB1bml0LCBpbnQgcG9ydCwgaW50IHJlYXNvbiwgdW5zaWduZWQgY2hhciAqcF9wYXlsb2FkLCBpbnQgcGF5bG9hZF9sZW4pOworCisvKiBkZWZpbmUgYSBjdXN0b21pemVkIGRwcCBwYWNrZXRJbiByZWNlaXZlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbi4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgSFcgdHJhcCBhIENQVSBib3VuZCBwYWNrZXQKKyAqLworc3RhdGljIGJjbV9yeF90IGRwcF9yeF9jYl9yZWdpc3RlcihpbnQgdW5pdCwgYmNtX3BrdF90ICpwa3QsIHZvaWQgKmNvb2tpZSkKK3sKKyAgICBpbnQgc3JjX3BvcnQsIHJlYXNvbl9jb2RlLCBwYXlsb2FkX2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpwX3BheWxvYWQ7CisKKyAgICAvKiBleHRyYWN0IHRyYXAgY29kZSwgaW5ncmVzcyBwb3J0IGFuZCBwYXlsb2FkIGluZm8gKi8KKyAgICBzcmNfcG9ydCAgICA9IHBrdC0+c3JjX3BvcnQgJiAweGZmOworICAgIHJlYXNvbl9jb2RlID0gcGt0LT5yeF90cmFwX2RhdGE7CisgICAgcF9wYXlsb2FkID0gcGt0LT5fcGt0X2RhdGEuZGF0YSArIChwa3QtPnRvdF9sZW4gLSBwa3QtPnBrdF9sZW4pOworICAgIHBheWxvYWRfbGVuID0gcGt0LT5wa3RfbGVuOworCisgICAgLyogY2FsbCBzd191dGlsX2JjbV9yeF9jYiB0byBzZW5kIHBhY2tldCB0byB0aGUgQkFMIGNsaWVudCAqLworICAgIHN3X3V0aWxfYmNtX3J4X2NiKHVuaXQsIHNyY19wb3J0LCByZWFzb25fY29kZSwgcF9wYXlsb2FkLCBwYXlsb2FkX2xlbik7CisgICAgcmV0dXJuIEJDTV9SWF9IQU5ETEVEOworfQorCisvKiBUaGUgZGVmYXVsdCBzd2l0Y2ggZGV2aWNlIHRoZSBzd2l0Y2ggYXBwIGlzIG1hbmFnZWQgKi8KKyNpZmRlZiBDT05GSUdfU1dJVENIX1JQQworc3RhdGljIHVpbnQzMl90IGdfZGZ0X2Rldl9pZCA9IDI7CisjZWxzZQorc3RhdGljIHVpbnQzMl90IGdfZGZ0X2Rldl9pZCA9IDA7CisjZW5kaWYKK3N0YXRpYyB1aW50MzJfdCBnX2l3Zl9tb2RlID0gMDsKK3N0YXRpYyB1aW50MzJfdCBnX2wyX2FnZV90aW1lID0gMzAwOworCisvKiBmbGFnIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIFJQQyBmb3Igc3dpdGNoIGNvbW11bmljYXRpb24gKi8KKyNpZmRlZiBDT05GSUdfU1dJVENIX1JQQworc3RhdGljIHVpbnQzMl90IGdfdXNlX3JwYyA9IDE7CisjZWxzZQorc3RhdGljIHVpbnQzMl90IGdfdXNlX3JwYyA9IDA7CisjZW5kaWYKKworLyogU29ja2V0IHRvIGJlIGNvbm5lY3RlZCB0byB0aGUgc3dpdGNoIGRyaXZlciBtc2cgcmVjZWl2aW5nIFVEUCBwb3J0ICovCitiY21vc19ib29sIGdfcGt0X3NlbmRfaXNfaW5pdGlhbGl6ZWQgPSBCQ01PU19GQUxTRTsKKworc3RhdGljIHRyYXBfdGFyZ2V0IHNfdGFyZ2V0X2RldmljZTsKKworLyogSW5kZXggdG8gZGV0ZXJtaW5lIHdoaWNoIGludGVyZmFjZSBtYXBwaW5nIHRhYmxlIHNob3VsZCBiZSB1c2VkLgorICogVGhlIG1hcHBpbmcgdGFibGUgaXMgSFcgc3BlY2lmaWMgYW5kIGRlcGVuZCBvbiBob3cgcGh5c2ljYWwgd2lyZXMgYXJlIGxheSBvdXQKKyAqIEFueSBjdXN0b21pemVkIGJvYXJkIG1heSBuZWVkIGEgZGlmZmVyZW50IHRhYmxlIGVudHJ5IHRvIHJlZmxlY3QgdGhlIGNvbm5lY3Rpb25zCisgKi8KK3N0YXRpYyBiYWxfc3dhcHBfcG9ydF9tYXBfaW5keCBnX2ludGZfbWFwdGFibGUgPSBCQUxfU1dBUFBfUE9SVF9NQVBfR1BPTjsKKworIC8qIHRoZSBsb2dpY2FsIGludGVyZmFjZSB0byBLVDIgcG9ydCBtYXBwaW5nIHRhYmxlCisgICAgdGhlIHRhYmxlcyBpcyBpbmRleCBieSB0ZWNobm9sb2d5IHRoZW4gbG9naWNhbCBpbnRlcmZhY2UgbnVtYmVyIHRoYXQgdXNlZCBpbiB0aGUgQkFMIENMSQorICAgIHRoZSBkYXRhIGlzIHRoZSBzd2l0Y2ggcG9ydC1iaXQtbWFwIG51bWJlciBhbmQgZGV2aWNlIG51bWJlcgorKi8KKworLyogdGFibGUgd2l0aCBncG9uIHRlY2hub2xvZ3kKKyAgIGJhc2VkIG9uIEtUMiBwb3J0IGNvbmZpZyBvcHRpb24gNCAtIHNlZSBwYWdlIDIyIG9uIEtUMiBkYXRhIHNoZWV0ICovCisvKiBncG9uIG5ldHdvcmsgaW50ZXJmYWNlIG1hcHBpbmcgLQorICogS1QyIGlzIGZvciBCcm9hZGNvbSBleHBlcmltZW50IHB1cnBvc2UgLSBub3QgYWxsIGZ1bmN0aW9uIHdpbGwgd29yayAqLworYmFsX3N3YXBwX3BvcnQgbmV0X2luZl9tYXBfZ3BvbltdID0geworICAgICAgICAgeyAyNywgICAgLyogeGUwICovICAgMH0sCisgICAgICAgICB7IDI4LCAgICAvKiB4ZTEgKi8gICAwfSwKKyAgICAgICAgIHsgMzAsICAgIC8qIHhlMiAqLyAgIDB9LAorICAgICAgICAgeyAzMywgICAgLyogeGUzICovICAgMH0sCisgICAgICAgICB7IDQwLCAgICAvKiBnZTI0ICovICAwfSwKKyAgICAgICAgIHsgLTEsICAgICAvKiBlbmQgKi8gICAwfQorICAgICAgICAgfTsKKy8qIEFSQUQgdGVtcCBtYXBwaW5nIHhlMTI4IC0geGUxMzEgYXMgbm5pIHBvcnRzICovCisvKiBBUkFEIGlzIGZvciBCcm9hZGNvbSBleHBlcmltZW50IHB1cnBvc2UgLSBub3QgYWxsIGZ1bmN0aW9uIHdpbGwgd29yayAqLworYmFsX3N3YXBwX3BvcnQgbmV0X2luZl9tYXBfZXhwW10gPSB7CisgICAgICAgICB7IDEyOCwgICAgLyogeGUxMjggKi8gICAwfSwKKyAgICAgICAgIHsgMTI5LCAgICAvKiB4ZTEyOSAqLyAgIDB9LAorICAgICAgICAgeyAxMzAsICAgIC8qIHhlMTMwICovICAgMH0sCisgICAgICAgICB7IDEzMSwgICAgLyogeGUxMzEgKi8gICAwfSwKKyAgICAgICAgIHsgLTEsICAgICAgLyogZW5kICovICAgMH0KKyAgICAgICAgIH07CisvKiBRQVggdGVtcCBtYXBwaW5nIHhlMTI4LTEzMiBhcyBubmkgcG9ydHMgMC00ICovCitiYWxfc3dhcHBfcG9ydCBuZXRfaW5mX21hcF9leHAyW10gPSB7CisgICAgICAgICB7IDEyOCwgICAgLyogeGUxMjggKi8gICAwfSwKKyAgICAgICAgIHsgMTI5LCAgICAvKiB4ZTEyOSAqLyAgIDB9LAorICAgICAgICAgeyAxMzAsICAgIC8qIHhlMTMwICovICAgMH0sCisgICAgICAgICB7IDEzMSwgICAgLyogeGUxMzEgKi8gICAwfSwKKyAgICAgICAgIHsgMTMyLCAgICAvKiB4ZTEzMiAqLyAgIDB9LAorICAgICAgICAgeyAtMSwgICAgICAvKiBlbmQgKi8gICAwfQorICAgICAgICAgfTsKKworLyogc3ZrNCBtYXBwaW5nIHhlMTI4LTEzMyBhcyBubmkgcG9ydHMgMC01ICovCitiYWxfc3dhcHBfcG9ydCBuZXRfaW5mX21hcF9zdms0W10gPSB7CisgICAgICAgICB7IDEyOCwgICAgLyogeGUxMjggKi8gICAwfSwKKyAgICAgICAgIHsgMTI5LCAgICAvKiB4ZTEyOSAqLyAgIDB9LAorICAgICAgICAgeyAxMzAsICAgIC8qIHhlMTMwICovICAgMH0sCisgICAgICAgICB7IDEzMSwgICAgLyogeGUxMzEgKi8gICAwfSwKKyAgICAgICAgIHsgMTMyLCAgICAvKiB4ZTEzMiAqLyAgIDB9LAorICAgICAgICAgeyAxMzMsICAgIC8qIHhlMTMzICovICAgMH0sCisgICAgICAgICB7IC0xLCAgICAgIC8qIGVuZCAqLyAgIDB9CisgICAgICAgICB9OworCisvKiBlcG9uIDEwZy1jYXBhYmxlIG1hcHBpbmcgeGUxMjgtMTM1IGFzIG5uaSBwb3J0cyAwLTcgKGJlc3QgZ3Vlc3MgLSBuZWVkcyB0byBiZSB0ZXN0ZWQpICovCitiYWxfc3dhcHBfcG9ydCBuZXRfaW5mX21hcF9lcG9uX3RkbWFfMTBnW10gPSB7CisgICAgeyAxMjgsICAgIC8qIHhlMTI4ICovICAgMH0sCisgICAgeyAxMjksICAgIC8qIHhlMTI5ICovICAgMH0sCisgICAgeyAxMzAsICAgIC8qIHhlMTMwICovICAgMH0sCisgICAgeyAxMzEsICAgIC8qIHhlMTMxICovICAgMH0sCisgICAgeyAxMzIsICAgIC8qIHhlMTMyICovICAgMH0sCisgICAgeyAxMzMsICAgIC8qIHhlMTMzICovICAgMH0sCisgICAgeyAxMzQsICAgIC8qIHhlMTM0ICovICAgMH0sCisgICAgeyAxMzUsICAgIC8qIHhlMTM1ICovICAgMH0sCisgICAgeyAgLTEsICAgIC8qIGVuZCAqLyAgICAgMH0KK307CisKKy8qIGVwb24gMWcgb25seSBtYXBwaW5nIC0gY29waWVkIGZyb20gZ3BvbiBLVDIgZXhhbXBsZSBhYm92ZSAoYmVzdCBndWVzcyAtIG5lZWRzIHRvIGJlIHRlc3RlZCkgKi8KK2JhbF9zd2FwcF9wb3J0IG5ldF9pbmZfbWFwX2Vwb25fMWdbXSA9IHsKKyAgICB7IDI3LCAgICAvKiB4ZTAgKi8gIDB9LAorICAgIHsgMjgsICAgIC8qIHhlMSAqLyAgMH0sCisgICAgeyAzMCwgICAgLyogeGUyICovICAwfSwKKyAgICB7IDMzLCAgICAvKiB4ZTMgKi8gIDB9LAorICAgIHsgNDAsICAgIC8qIGdlMjQgKi8gMH0sCisgICAgeyAtMSwgICAgLyogZW5kICovICAwfQorfTsKKworLyogZ3BvbiBwb24gaW50ZXJmYWNlIG1hcHBpbmcgKi8KK2JhbF9zd2FwcF9wb3J0IHBvbl9pbmZfbWFwX2dwb25bXSA9IHsKKyAgICAgICAgIHsgNSwgICAgLyogZ2U0ICovICAgMH0sCisgICAgICAgICB7IDYsICAgIC8qIGdlNSAqLyAgIDB9LAorICAgICAgICAgeyAyLCAgICAvKiBnZTEgKi8gICAwfSwKKyAgICAgICAgIHsgMSwgICAgLyogZ2UwICovICAgMH0sCisgICAgICAgICB7IDgsICAgIC8qIGdlNyAqLyAgIDB9LAorICAgICAgICAgeyA3LCAgICAvKiBnZTYgKi8gICAwfSwKKyAgICAgICAgIHsgNCwgICAgLyogZ2UzICovICAgMH0sCisgICAgICAgICB7IDMsICAgIC8qIGdlMiAqLyAgIDB9LAorICAgICAgICAgeyAxMiwgICAvKiBnZTExICovICAwfSwKKyAgICAgICAgIHsgMTksICAgLyogZ2UxOCAqLyAgMH0sCisgICAgICAgICB7IDEwLCAgIC8qIGdlOSAqLyAgIDB9LAorICAgICAgICAgeyAxNSwgICAvKiBnZTE0ICovICAwfSwKKyAgICAgICAgIHsgMTEsICAgLyogZ2UxMCAqLyAgMH0sCisgICAgICAgICB7IDE3LCAgIC8qIGdlMTYgKi8gIDB9LAorICAgICAgICAgeyA5LCAgICAvKiBnZTggKi8gICAwfSwKKyAgICAgICAgIHsgMTMsICAgLyogZ2UxMiAqLyAgMH0sCisgICAgICAgICB7IC0xLCAgICAvKiBlbmQgKi8gICAwfQorICAgICAgICAgfTsKK2JhbF9zd2FwcF9wb3J0IHBvbl9pbmZfbWFwX2dwb25fdjNbXSA9IHsKKyAgICAgICAgIHsgOCwgICAgLyogZ2U3ICovICAgMH0sCisgICAgICAgICB7IDcsICAgIC8qIGdlNiAqLyAgIDB9LAorICAgICAgICAgeyA0LCAgICAvKiBnZTMgKi8gICAwfSwKKyAgICAgICAgIHsgMywgICAgLyogZ2UyICovICAgMH0sCisgICAgICAgICB7IDYsICAgIC8qIGdlNSAqLyAgIDB9LAorICAgICAgICAgeyA1LCAgICAvKiBnZTQgKi8gICAwfSwKKyAgICAgICAgIHsgMiwgICAgLyogZ2UxICovICAgMH0sCisgICAgICAgICB7IDEsICAgIC8qIGdlMCAqLyAgIDB9LAorICAgICAgICAgeyAxNSwgICAvKiBnZTE0ICovICAwfSwKKyAgICAgICAgIHsgMTYsICAgLyogZ2UxNSAqLyAgMH0sCisgICAgICAgICB7IDExLCAgIC8qIGdlMTAgKi8gIDB9LAorICAgICAgICAgeyAxMiwgICAvKiBnZTExICovICAwfSwKKyAgICAgICAgIHsgMTMsICAgLyogZ2UxMiAqLyAgMH0sCisgICAgICAgICB7IDE0LCAgIC8qIGdlMTMgKi8gIDB9LAorICAgICAgICAgeyA5LCAgICAvKiBnZTggKi8gICAwfSwKKyAgICAgICAgIHsgMTAsICAgLyogZ2U5ICovICAgMH0sCisgICAgICAgICB7IC0xLCAgICAvKiBlbmQgKi8gICAwfQorICAgICAgICAgfTsKKy8qIEFSQUQgdGVtcCBtYXBwaW5nIHhlMCAtIHhlMyBhcyBQT04gcG9ydHMgKi8KK2JhbF9zd2FwcF9wb3J0IHBvbl9pbmZfbWFwX2V4cFtdID0geworICAgICAgICAgeyAwLCAgICAvKiB4ZTAgKi8gICAwfSwKKyAgICAgICAgIHsgMSwgICAgLyogeGUxICovICAgMH0sCisgICAgICAgICB7IDIsICAgIC8qIHhlMiAqLyAgIDB9LAorICAgICAgICAgeyAzLCAgICAvKiB4ZTMgKi8gICAwfSwKKyAgICAgICAgIHsgLTEsICAgIC8qIGVuZCAqLyAgIDB9CisgICAgICAgICB9OworLyogUUFYIHRlbXAgbWFwcGluZyB4ZTEtNiwgYXMgUE9OIHBvcnRzIDAtNSAqLworYmFsX3N3YXBwX3BvcnQgcG9uX2luZl9tYXBfZXhwMltdID0geworICAgICAgICAgeyAxLCAgICAgLyogeGUxICovICAgMH0sCisgICAgICAgICB7IDIsICAgICAvKiB4ZTIgKi8gICAwfSwKKyAgICAgICAgIHsgMywgICAgIC8qIHhlMyAqLyAgIDB9LAorICAgICAgICAgeyA0LCAgICAgLyogeGU0ICovICAgMH0sCisgICAgICAgICB7IDUsICAgICAvKiB4ZTUgKi8gICAwfSwKKyAgICAgICAgIHsgNiwgICAgIC8qIHhlNiAqLyAgIDB9LAorICAgICAgICAgeyAtMSwgICAgLyogZW5kICovICAgMH0KKyAgICAgICAgIH07CisKKy8qIHN2azQgbWFwcGluZyB4ZTEtNCwgYXMgUE9OIHBvcnRzIDAtMyAqLworYmFsX3N3YXBwX3BvcnQgcG9uX2luZl9tYXBfc3ZrNFtdID0geworICAgICAgICAgeyAxLCAgICAgLyogeGUxICovICAgMH0sCisgICAgICAgICB7IDIsICAgICAvKiB4ZTIgKi8gICAwfSwKKyAgICAgICAgIHsgMywgICAgIC8qIHhlMyAqLyAgIDB9LAorICAgICAgICAgeyA0LCAgICAgLyogeGU0ICovICAgMH0sCisgICAgICAgICB7IC0xLCAgICAvKiBlbmQgKi8gICAwfQorICAgICAgICAgfTsKKworLyogZXBvbiAxMGctY2FwYWJsZSBtYXBwaW5nIHhlMS04LCBhcyBQT04gcG9ydHMgMC03IChiZXN0IGd1ZXNzIC0gdW50ZXN0ZWQpICovCitiYWxfc3dhcHBfcG9ydCBwb25faW5mX21hcF9lcG9uX3RkbWFfMTBnW10gPSB7CisgICAgeyAxLCAgICAvKiB4ZTEgKi8gICAwfSwKKyAgICB7IDIsICAgIC8qIHhlMiAqLyAgIDB9LAorICAgIHsgMywgICAgLyogeGUzICovICAgMH0sCisgICAgeyA0LCAgICAvKiB4ZTQgKi8gICAwfSwKKyAgICB7IDUsICAgIC8qIHhlNSAqLyAgIDB9LAorICAgIHsgNiwgICAgLyogeGU2ICovICAgMH0sCisgICAgeyA3LCAgICAvKiB4ZTcgKi8gICAwfSwKKyAgICB7IDgsICAgIC8qIHhlOCAqLyAgIDB9LAorICAgIHsgLTEsICAgLyogZW5kICovICAgMH0KK307CisKKy8qIGVwb24gMWcgbWFwcGluZyB4ZTEtMTYsIGFzIFBPTiBwb3J0cyAwLTE1IChiZXN0IGd1ZXNzIC0gdW50ZXN0ZWQpICovCitiYWxfc3dhcHBfcG9ydCBwb25faW5mX21hcF9lcG9uXzFnW10gPSB7CisgICAgeyAxLCAgICAvKiB4ZTEgKi8gICAwfSwKKyAgICB7IDIsICAgIC8qIHhlMiAqLyAgIDB9LAorICAgIHsgMywgICAgLyogeGUzICovICAgMH0sCisgICAgeyA0LCAgICAvKiB4ZTQgKi8gICAwfSwKKyAgICB7IDUsICAgIC8qIHhlNSAqLyAgIDB9LAorICAgIHsgNiwgICAgLyogeGU2ICovICAgMH0sCisgICAgeyA3LCAgICAvKiB4ZTcgKi8gICAwfSwKKyAgICB7IDgsICAgIC8qIHhlOCAqLyAgIDB9LAorICAgIHsgOSwgICAgLyogeGU5ICovICAgMH0sCisgICAgeyAxMCwgICAvKiB4ZTEwICovICAwfSwKKyAgICB7IDExLCAgIC8qIHhlMTEgKi8gIDB9LAorICAgIHsgMTIsICAgLyogeGUxMiAqLyAgMH0sCisgICAgeyAxMywgICAvKiB4ZTEzICovICAwfSwKKyAgICB7IDE0LCAgIC8qIHhlMTQgKi8gIDB9LAorICAgIHsgMTUsICAgLyogeGUxNSAqLyAgMH0sCisgICAgeyAxNiwgICAvKiB4ZTE2ICovICAwfSwKKyAgICB7IC0xLCAgIC8qIGVuZCAqLyAgIDB9Cit9OworCisvKiBuZXR3b3JrIGludGVyZmFjZSBtYXBwaW5nIHRhYmxlICovCitiYWxfc3dhcHBfcG9ydCAqZ19uZXRfaW5mX21hcF90YWJsZVtCQUxfU1dBUFBfUE9SVF9NQVBfX05VTV9PRl0gPSB7CisgICAgbmV0X2luZl9tYXBfZ3BvbiwgICAgICAgICAgIC8qIEJBTF9TV0FQUF9QT1JUX01BUF9HUE9OICovCisgICAgbmV0X2luZl9tYXBfZ3BvbiwgICAgICAgICAgIC8qIEJBTF9TV0FQUF9QT1JUX01BUF9HUE9OX1YzICovCisgICAgbmV0X2luZl9tYXBfZXhwLCAgICAgICAgICAgIC8qIEJBTF9TV0FQUF9QT1JUX01BUF9FWFAgKi8KKyAgICBuZXRfaW5mX21hcF9leHAyLCAgICAgICAgICAgLyogQkFMX1NXQVBQX1BPUlRfTUFQX0VYUDIgKi8KKyAgICBuZXRfaW5mX21hcF9zdms0LCAgICAgICAgICAgLyogQkFMX1NXQVBQX1BPUlRfTUFQX1NWSzQgKi8KKyAgICBuZXRfaW5mX21hcF9lcG9uX3RkbWFfMTBnLCAgLyogQkFMX1NXQVBQX1BPUlRfTUFQX0VQT05fVERNQSAqLworICAgIG5ldF9pbmZfbWFwX2Vwb25fMWcsICAgICAgICAvKiBCQUxfU1dBUFBfUE9SVF9NQVBfRVBPTl8xRyAqLworICAgIG5ldF9pbmZfbWFwX2Vwb25fdGRtYV8xMGcsICAvKiBCQUxfU1dBUFBfUE9SVF9NQVBfRVBPTl8xMEcgKi8KK307CisvKiBwb24gaW50ZXJmYWNlIG1hcHBpbmcgdGFibGUgKi8KK2JhbF9zd2FwcF9wb3J0ICpnX3Bvbl9pbmZfbWFwX3RhYmxlW0JBTF9TV0FQUF9QT1JUX01BUF9fTlVNX09GXSA9IHsKKyAgICBwb25faW5mX21hcF9ncG9uLCAgICAgICAgICAgLyogQkFMX1NXQVBQX1BPUlRfTUFQX0dQT04gKi8KKyAgICBwb25faW5mX21hcF9ncG9uX3YzLCAgICAgICAgLyogQkFMX1NXQVBQX1BPUlRfTUFQX0dQT05fVjMgKi8KKyAgICBwb25faW5mX21hcF9leHAsICAgICAgICAgICAgLyogQkFMX1NXQVBQX1BPUlRfTUFQX0VYUCAqLworICAgIHBvbl9pbmZfbWFwX2V4cDIsICAgICAgICAgICAvKiBCQUxfU1dBUFBfUE9SVF9NQVBfRVhQMiAqLworICAgIHBvbl9pbmZfbWFwX3N2azQsICAgICAgICAgICAvKiBCQUxfU1dBUFBfUE9SVF9NQVBfU1ZLNCAqLworICAgIHBvbl9pbmZfbWFwX2Vwb25fdGRtYV8xMGcsICAvKiBCQUxfU1dBUFBfUE9SVF9NQVBfRVBPTl9URE1BICovCisgICAgcG9uX2luZl9tYXBfZXBvbl8xZywgICAgICAgIC8qIEJBTF9TV0FQUF9QT1JUX01BUF9FUE9OXzFHICovCisgICAgcG9uX2luZl9tYXBfZXBvbl90ZG1hXzEwZywgIC8qIEJBTF9TV0FQUF9QT1JUX01BUF9FUE9OXzEwRyAqLworfTsKKworLyogbmV0d29yayBpbnRlcmZhY2UgbWFwcGluZyB0YWJsZSBzaXplICovCitpbnQgZ19uZXRfaW5mX21hcF90YWJsZV9zaXplW0JBTF9TV0FQUF9QT1JUX01BUF9fTlVNX09GXSA9IHsKKyAgICBzaXplb2YobmV0X2luZl9tYXBfZ3Bvbikvc2l6ZW9mKG5ldF9pbmZfbWFwX2dwb25bMF0pLCAgICAgICAgICAgICAgICAgICAvKiBCQUxfU1dBUFBfUE9SVF9NQVBfR1BPTiAqLworICAgIHNpemVvZihuZXRfaW5mX21hcF9ncG9uKS9zaXplb2YobmV0X2luZl9tYXBfZ3BvblswXSksICAgICAgICAgICAgICAgICAgIC8qIEJBTF9TV0FQUF9QT1JUX01BUF9HUE9OX1YzICovCisgICAgc2l6ZW9mKG5ldF9pbmZfbWFwX2V4cCkvc2l6ZW9mKG5ldF9pbmZfbWFwX2V4cFswXSksICAgICAgICAgICAgICAgICAgICAgLyogQkFMX1NXQVBQX1BPUlRfTUFQX0VYUCAqLworICAgIHNpemVvZihuZXRfaW5mX21hcF9leHAyKS9zaXplb2YobmV0X2luZl9tYXBfZXhwMlswXSksICAgICAgICAgICAgICAgICAgIC8qIEJBTF9TV0FQUF9QT1JUX01BUF9FWFAyICovCisgICAgc2l6ZW9mKG5ldF9pbmZfbWFwX3N2azQpL3NpemVvZihuZXRfaW5mX21hcF9zdms0WzBdKSwgICAgICAgICAgICAgICAgICAgLyogQkFMX1NXQVBQX1BPUlRfTUFQX1NWSzQgKi8KKyAgICBzaXplb2YobmV0X2luZl9tYXBfZXBvbl90ZG1hXzEwZykvc2l6ZW9mKG5ldF9pbmZfbWFwX2Vwb25fdGRtYV8xMGdbMF0pLCAvKiBCQUxfU1dBUFBfUE9SVF9NQVBfRVBPTl9URE1BICovCisgICAgc2l6ZW9mKG5ldF9pbmZfbWFwX2Vwb25fMWcpL3NpemVvZihuZXRfaW5mX21hcF9lcG9uXzFnWzBdKSwgICAgICAgICAgICAgLyogQkFMX1NXQVBQX1BPUlRfTUFQX0VQT05fMUcgKi8KKyAgICBzaXplb2YobmV0X2luZl9tYXBfZXBvbl90ZG1hXzEwZykvc2l6ZW9mKG5ldF9pbmZfbWFwX2Vwb25fdGRtYV8xMGdbMF0pLCAvKiBCQUxfU1dBUFBfUE9SVF9NQVBfRVBPTl8xMEcgKi8KK307CisvKiBwb24gaW50ZXJmYWNlIG1hcHBpbmcgdGFibGUgc2l6ZSAqLworaW50IGdfcG9uX2luZl9tYXBfdGFibGVfc2l6ZVtCQUxfU1dBUFBfUE9SVF9NQVBfX05VTV9PRl0gPSB7CisgICAgc2l6ZW9mKHBvbl9pbmZfbWFwX2dwb24pL3NpemVvZihwb25faW5mX21hcF9ncG9uWzBdKSwgICAgICAgICAgICAgICAgICAgLyogQkFMX1NXQVBQX1BPUlRfTUFQX0dQT04gKi8KKyAgICBzaXplb2YocG9uX2luZl9tYXBfZ3Bvbl92Mykvc2l6ZW9mKHBvbl9pbmZfbWFwX2dwb25fdjNbMF0pLCAgICAgICAgICAgICAvKiBCQUxfU1dBUFBfUE9SVF9NQVBfR1BPTl9WMyAqLworICAgIHNpemVvZihwb25faW5mX21hcF9leHApL3NpemVvZihwb25faW5mX21hcF9leHBbMF0pLCAgICAgICAgICAgICAgICAgICAgIC8qIEJBTF9TV0FQUF9QT1JUX01BUF9FWFAgKi8KKyAgICBzaXplb2YocG9uX2luZl9tYXBfZXhwMikvc2l6ZW9mKHBvbl9pbmZfbWFwX2V4cDJbMF0pLCAgICAgICAgICAgICAgICAgICAvKiBCQUxfU1dBUFBfUE9SVF9NQVBfRVhQMiAqLworICAgIHNpemVvZihwb25faW5mX21hcF9zdms0KS9zaXplb2YocG9uX2luZl9tYXBfc3ZrNFswXSksICAgICAgICAgICAgICAgICAgIC8qIEJBTF9TV0FQUF9QT1JUX01BUF9TVks0ICovCisgICAgc2l6ZW9mKHBvbl9pbmZfbWFwX2Vwb25fdGRtYV8xMGcpL3NpemVvZihwb25faW5mX21hcF9lcG9uX3RkbWFfMTBnWzBdKSwgLyogQkFMX1NXQVBQX1BPUlRfTUFQX0VQT05fVERNQSAqLworICAgIHNpemVvZihwb25faW5mX21hcF9lcG9uXzFnKS9zaXplb2YocG9uX2luZl9tYXBfZXBvbl8xZ1swXSksICAgICAgICAgICAgIC8qIEJBTF9TV0FQUF9QT1JUX01BUF9FUE9OXzFHICovCisgICAgc2l6ZW9mKHBvbl9pbmZfbWFwX2Vwb25fdGRtYV8xMGcpL3NpemVvZihwb25faW5mX21hcF9lcG9uX3RkbWFfMTBnWzBdKSwgLyogQkFMX1NXQVBQX1BPUlRfTUFQX0VQT05fMTBHICovCit9OworCisvKioKKyAgKiBAYnJpZWYgZ2V0IHRoZSBudW1iZXIgb2YgdmFsaWQgbmV0d29yayBpbnRlcmZhY2UKKyAgKiBAcmV0dXJuIG51bV9ubmkgIG51bWJlciBvZiBubmkgaW50ZXJmYWNlcworICAqLworaW50IGJhbF9iY21fbmV0X2luZl9tYXBfc2l6ZV9nZXQoKQoreworICAgIHJldHVybiBnX25ldF9pbmZfbWFwX3RhYmxlX3NpemVbZ19pbnRmX21hcHRhYmxlXTsKK307CisKKyAvKioKKyAgKiBAYnJpZWYgZ2V0IHRoZSBudW1iZXIgb2YgdmFsaWQgcG9uIGludGVyZmFjZQorICAqIEByZXR1cm4gbnVtX25uaSAgbnVtYmVyIG9mIHBvbiBpbnRlcmZhY2VzCisgICovCitpbnQgYmFsX2JjbV9wb25faW5mX21hcF9zaXplX2dldCgpCit7CisgICAgcmV0dXJuIGdfcG9uX2luZl9tYXBfdGFibGVfc2l6ZVtnX2ludGZfbWFwdGFibGVdOworfTsKKworLyoqCisgICogQGJyaWVmIGdldCBLVDIgUEJNIG9mIGEgbmV0d29yayBpbnRlcmZhY2UgZnJvbSBjdXJyZW50IG1hcHBpbmcgdGFibGUKKyAgKgorICAqIEBwYXJhbSBuZXRfaW5mX2lkICAgbG9naWNhbCBubmkgaW50ZXJmYWNlIG51bWJlciBmcm9tIENMSQorICAqCisgICogQHJldHVybiBwYm0gICAgICAgICBQb3J0Qml0TWFwIHRoYXQgd2lsbCBiZSB1c2VkIGluIGJjbSBhcGkgY2FsbHMKKyAgKi8KK3VpbnQzMl90IGJhbF9iY21fbmV0X2luZl9wYm1fZ2V0KHVpbnQzMl90IG5ldF9pbmZfaWQpCit7CisgICAgYmFsX3N3YXBwX3BvcnQgKnBvcnQgPSAoZ19uZXRfaW5mX21hcF90YWJsZVtnX2ludGZfbWFwdGFibGVdICsgbmV0X2luZl9pZCk7CisgICAgcmV0dXJuIHBvcnQtPnBibV9pZDsKK307CisKKy8qKgorICAqIEBicmllZiBnZXQgYmFsIG5uaSBwb3J0IG51bWJlciAoaW5kZXggb2YgdGhlIG1hcHBpbmcgdGFibGUpIG9mIGEgcGh5c2ljYWwgbm5pIGludGVyZmFjZQorICAqCisgICogQHBhcmFtIG5uaV9pZCAgIHBoeXNpY2FsIG5uaSBpbnRlcmZhY2UgaW4gdGhlIHN3aXRjaAorICAqCisgICogQHJldHVybiBpbmRleCAgIGluZGV4IHRvIFBvcnRCaXRNYXAgdGhhdCBjb250YWlucyB0aGUgcGh5c2ljYWwgaW50ZXJmYWNlIG51bWJlcgorICAqLworaW50IGJhbF9iY21fbmV0X2luZl9pZHhfZ2V0KHVpbnQzMl90IG5uaV9pZCkKK3sKKyAgICAgaW50IGluZHg7CisgICAgIGJhbF9zd2FwcF9wb3J0ICpwb3J0ID0gZ19uZXRfaW5mX21hcF90YWJsZVtnX2ludGZfbWFwdGFibGVdOworICAgICBmb3IoIGluZHggPSAwOyBwb3J0LT5wYm1faWQgIT0gLTE7IGluZHgrKykKKyAgICAgeworICAgICAgICAgaWYgKHBvcnQtPnBibV9pZCA9PSBubmlfaWQpCisgICAgICAgICB7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICBwb3J0Kys7CisgICAgIH0KKyAgICAgaWYgKHBvcnQtPnBibV9pZCA9PSAtMSkKKyAgICAgeworICAgICAgICAgcmV0dXJuIC0xOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICAgcmV0dXJuIGluZHg7CisgICAgIH0KK30KKworLyoqCisgICogQGJyaWVmIGdldCBLVDIgZGV2aWNlIGlkIG9mIGEgbmV0d29yayBpbnRlcmZhY2UgZnJvbSBjdXJyZW50IG1hcHBpbmcgdGFibGUKKyAgKgorICAqIEBwYXJhbSBuZXRfaW5mX2lkICAgbG9naWNhbCBubmkgaW50ZXJmYWNlIG51bWJlciBmcm9tIENMSQorICAqCisgICogQHJldHVybiBwYm0gICAgICAgICBkZXZpY2UgbnVtYmVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIGJjbSBhcGkgY2FsbHMKKyAgKi8KK2ludCBiYWxfYmNtX25ldF9pbmZfZGV2X2dldCh1aW50MzJfdCBuZXRfaW5mX2lkKQoreworICAgIGlmKG5ldF9pbmZfaWQgPiBzaXplb2YoZ19uZXRfaW5mX21hcF90YWJsZSkpCisgICAgeworICAgICAgICByZXR1cm4gYmFsX2JjbV9kZnRfZGV2X2dldCgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiYWxfc3dhcHBfcG9ydCAqcG9ydCA9IChnX25ldF9pbmZfbWFwX3RhYmxlW2dfaW50Zl9tYXB0YWJsZV0gKyBuZXRfaW5mX2lkKTsKKyAgICAgICAgcmV0dXJuIHBvcnQtPmRldmljZV9pZDsKKyAgICB9Cit9OworCisvKioKKyAgKiBAYnJpZWYgZ2V0IEtUMiBQQk0gb2YgYSBwb24gaW50ZXJmYWNlIGZyb20gY3VycmVudCBtYXBwaW5nIHRhYmxlCisgICoKKyAgKiBAcGFyYW0gcG9uX2luZl9pZCAgIGxvZ2ljYWwgcG9uIGludGVyZmFjZSBudW1iZXIgZnJvbSBDTEkKKyAgKgorICAqIEByZXR1cm4gcGJtICAgICAgICAgUG9ydEJpdE1hcCB0aGF0IHdpbGwgYmUgdXNlZCBpbiBiY20gYXBpIGNhbGxzCisgICovCit1aW50MzJfdCBiYWxfYmNtX3Bvbl9pbmZfcGJtX2dldCh1aW50MzJfdCBwb25faW5mX2lkKQoreworICAgICAgYmFsX3N3YXBwX3BvcnQgKnBvcnQgPSAoZ19wb25faW5mX21hcF90YWJsZVtnX2ludGZfbWFwdGFibGVdICsgcG9uX2luZl9pZCk7CisgICAgICByZXR1cm4gcG9ydC0+cGJtX2lkOworfTsKKworLyoqCisgICogQGJyaWVmIGdldCBiYWwgcG9uIHBvcnQgbnVtYmVyIChpbmRleCBvZiB0aGUgbWFwcGluZyB0YWJsZSkgb2YgYSBwaHlzaWNhbCBwb24gaW50ZXJmYWNlCisgICoKKyAgKiBAcGFyYW0gcG9uX2lkICAgcGh5c2ljYWwgcG9uIGludGVyZmFjZSBpbiB0aGUgc3dpdGNoCisgICoKKyAgKiBAcmV0dXJuIGluZGV4ICAgaW5kZXggdG8gUG9ydEJpdE1hcCB0aGF0IGNvbnRhaW5zIHRoZSBwaHlzaWNhbCBpbnRlcmZhY2UgbnVtYmVyCisgICovCitpbnQgYmFsX2JjbV9wb25faW5mX2lkeF9nZXQodWludDMyX3QgcG9uX2lkKQoreworICAgICBpbnQgaW5keDsKKyAgICAgYmFsX3N3YXBwX3BvcnQgKnBvcnQgPSBnX3Bvbl9pbmZfbWFwX3RhYmxlW2dfaW50Zl9tYXB0YWJsZV07CisgICAgIGZvciggaW5keCA9IDA7IHBvcnQtPnBibV9pZCAhPSAtMTsgaW5keCsrKQorICAgICB7CisgICAgICAgICBpZiAocG9ydC0+cGJtX2lkID09IHBvbl9pZCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIHBvcnQrKzsKKyAgICAgfQorICAgICBpZiAocG9ydC0+cGJtX2lkID09IC0xKQorICAgICB7CisgICAgICAgICByZXR1cm4gLTE7CisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgICByZXR1cm4gaW5keDsKKyAgICAgfQorfQorCisvKioKKyAgKiBAYnJpZWYgZ2V0IEtUMiBkZXZpY2UgbnVtYmVyIG9mIGEgcG9uIGludGVyZmFjZSBmcm9tIGN1cnJlbnQgbWFwcGluZyB0YWJsZQorICAqCisgICogQHBhcmFtIHBvbl9pbmZfaWQgICBsb2dpY2FsIHBvbiBpbnRlcmZhY2UgbnVtYmVyIGZyb20gQ0xJCisgICoKKyAgKiBAcmV0dXJuIHBibSAgICAgICAgIGRldmljZSBudW1iZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gYmNtIGFwaSBjYWxscworICAqLworaW50IGJhbF9iY21fcG9uX2luZl9kZXZfZ2V0KHVpbnQzMl90IHBvbl9pbmZfaWQpCit7CisgICAgaWYocG9uX2luZl9pZCA+IHNpemVvZihnX3Bvbl9pbmZfbWFwX3RhYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiYWxfYmNtX2RmdF9kZXZfZ2V0KCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJhbF9zd2FwcF9wb3J0ICpwb3J0ID0gKGdfcG9uX2luZl9tYXBfdGFibGVbZ19pbnRmX21hcHRhYmxlXSArIHBvbl9pbmZfaWQpOworICAgICAgICByZXR1cm4gcG9ydC0+ZGV2aWNlX2lkOworICAgIH0KK307CisKKy8qKgorICAqIEBicmllZiBzZXR0aW5nIHRoZSBsb2NhbCBkZWZhdWx0IGRldmljZSBpZAorICAqLwordm9pZCBiYWxfYmNtX2RmdF9kZXZfc2V0KHVpbnQzMl90IGlkKQoreworICAgIGdfZGZ0X2Rldl9pZCA9IChpbnQpaWQ7Cit9CisKKy8qKgorICAqIEBicmllZiBnZXR0aW5nIHRoZSBsb2NhbCBkZWZhdWx0IGRldmljZSBpZAorICAqLwordWludDMyX3QgYmFsX2JjbV9kZnRfZGV2X2dldCgpCit7CisgICAgcmV0dXJuIGdfZGZ0X2Rldl9pZDsKK30KKworLyoqCisgICogQGJyaWVmIHNldHRpbmcgdGhlIEwyIHRhYmxlIGFnaW5nIHRpbWUgKHNlY29uZHMpCisgICovCit2b2lkIGJhbF9iY21fbDJfYWdlX3RpbWVfc2V0KHVpbnQzMl90IGFnZV90aW1lKQoreworICAgIGdfbDJfYWdlX3RpbWUgPSBhZ2VfdGltZTsKK30KKworLyoqCisgICogQGJyaWVmIGdldHRpbmcgY3VycmVudCBMMiB0YWJsZSBhZ2luZyB0aW1lIHZhbHVlCisgICovCit1aW50MzJfdCBiYWxfYmNtX2wyX2FnZV90aW1lX2dldCgpCit7CisgICAgcmV0dXJuIGdfbDJfYWdlX3RpbWU7Cit9CisKKy8qKgorICAqIEBicmllZiBnZXR0aW5nIHRoZSBkZXZpY2UgdHlwZQorICAqLwordWludDMyX3QgYmFsX2JjbV9kZXZfdHlwZV9nZXQodWludDMyX3QgaWQpCit7CisgICAgaW50IHJjOworICAgIGJjbV9pbmZvX3QgZGV2X2luZm87CisKKyAgICByYyA9IGJjbV9pbmZvX2dldChpZCwgJmRldl9pbmZvKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIGRldl9pbmZvLmRldmljZTsKK30KKworLyoqCisgICogQGJyaWVmIGdldHRpbmcgdGhlIGl3ZiBtb2RlIG9mIGFuIGFjY2VzcyB0ZXJtaW5hbAorICAqLwordWludDMyX3QgYmFsX2JjbV9pd2ZfbW9kZV9nZXQoKQoreworICAgIC8qIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgb25lIGFjY2VzcyB0ZXJtaW5hbCAqLworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zd191dGlsLCAiIEdldCBpd2YgbW9kZSBmb3IgYWNjX3Rlcm1cbiIpOworICAgIHJldHVybiBnX2l3Zl9tb2RlOworfQorCisvKioKKyAgKiBAYnJpZWYgc2V0dGluZyB0aGUgdXNlIG9mIFJQQyAocmVtb3RlKSBvciBub3QgKGxvY2FsKQorICAqLwordm9pZCBiYWxfYmNtX3VzZV9ycGNfc2V0KHVpbnQzMl90IHVzZV9ycGMpCit7CisgICAgZ191c2VfcnBjID0gKGludCl1c2VfcnBjOworfQorCisvKioKKyAgKiBAYnJpZWYgZ2V0dGluZyB0aGUgdXNlIG9mIFJQQyAocmVtb3RlKSBvciBub3QgKGxvY2FsKQorICAqLworYmNtb3NfYm9vbCBiYWxfYmNtX3VzZV9ycGNfZ2V0KHZvaWQpCit7CisgICAgaWYgKGdfdXNlX3JwYykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzd191dGlsX2JjbV9yeF9jYiAoaW50IHVuaXQsIGludCBwb3J0LCBpbnQgcmVhc29uLCB1bnNpZ25lZCBjaGFyICpwX3BheWxvYWQsIGludCBwYXlsb2FkX2xlbikKK3sKKyAgICBpbnQgaSwgbGVuLCBvYmpfbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKnBheWxvYWQ7CisgICAgY2hhciBieXRlc3RyWzMyXTsKKyAgICBjaGFyICpwX2J5dGVzdHIgPSBieXRlc3RyOworCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkJBTDogQ2FwdHVyZWQgcGFja2V0IGZyb20gZGF0YXBhdGggKGxlbjogJWQgYnl0ZXMpXG4iLCBwYXlsb2FkX2xlbik7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3dfdXRpbCwgIiAgICAgaW5ncmVzcyBwb3J0ICVkXG4iLCBwb3J0KTsKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3dfdXRpbCwgIiAgICAgcmN2IHJlYXNvbiAgIDB4JXhcbiIsIHJlYXNvbik7CisKKyAgICBsZW4gPSAgKHBheWxvYWRfbGVuID4gNjQpPyA2NCA6IHBheWxvYWRfbGVuOworCisgICAgLyogZHVtcCBvdXQgdGhlIGNhcHR1cmVkIHBhY2tldCAqLworICAgIHBheWxvYWQgPSBwX3BheWxvYWQ7CisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N3X3V0aWwsICIgICAgIHBheWxvYWQ6IChmaXJzdCAlZCBieXRlcyBzaG93bikiLCBsZW4pOworICAgIGZvcihpPTA7IGk8bGVuOyBpKyspCisgICAgeworICAgICAgICBpZiAoIGklOCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzcHJpbnRmKHBfYnl0ZXN0ciwgIlxuIik7CisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3dfdXRpbCwgIiVzIiwgYnl0ZXN0cik7CisgICAgICAgICAgICBwX2J5dGVzdHIgPSBieXRlc3RyOworCisgICAgICAgIH0KKyAgICAgICAgc3ByaW50ZihwX2J5dGVzdHIsICIgJTAyeCIsICpwYXlsb2FkKyspOworICAgICAgICBwX2J5dGVzdHIgKz0gMzsKKyAgICB9CisKKyAgICAvKiBMb2cgdGhlIHN0cmluZyBiZWluZyBjcmFmdGVkIHdoZW4gdGhlIGxvb3AgdGVybWluYXRlZCAqLworICAgIHNwcmludGYocF9ieXRlc3RyLCAiXG4iKTsKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3dfdXRpbCwgIiVzIiwgYnl0ZXN0cik7CisKKyAgICAvKiBTZW5kIEF1dG8gSW5kaWNhdGlvbiAqLworICAgIGlmICggcF9iYWxfY29yZV90b19hcGlfaW5kX3F1ZXVlICkKKyAgICB7CisgICAgICAgYmNtYmFsX3BhY2tldF9jZmcgKnBfaW5kX21zZyA9IE5VTEw7CisgICAgICAgYmNtYmFsX3BhY2tldF9rZXkga2V5OworICAgICAgIGJhbF9zd19mbG93ICpwX2Zsb3dfZWxtOworICAgICAgIGludCB0bXBfcG9ydDsKKworICAgICAgIC8qIGZpbmQgdGhlIGZsb3cgaW5mbyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgdHJhcCBSRUFTT04gKi8KKyAgICAgICBwX2Zsb3dfZWxtID0gYmFsX3N3X3V0aWxfZmxvd19saXN0X2dldF9ieV90cmFwX2NvZGUocmVhc29uKTsKKyAgICAgICBpZihwX2Zsb3dfZWxtID09IE5VTEwpCisgICAgICAgeworICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLCAiIFRyYXBDYWxsQmFjazogQ2FuJ3QgbWF0Y2ggdHJhcCBjb2RlIDB4JXggdG8gZWxlbWVudCBpbiBmbG93IGxpc3RcbiIsIHJlYXNvbik7CisgICAgICAgICAgIHJldHVybjsKKyAgICAgICB9CisKKyAgICAgICAvKiBUaGUgcGFja2V0IGluZGljYXRpb24gb2JqZWN0IGNvbnRhaW5zIHRoZSBiY21iYWxfcGFja2V0X2NmZyBzdHJ1Y3R1cmUgcGx1cyB0aGUgY2FwdHVyZWQgcGFja2V0CisgICAgICAgICogY29udGVudAorICAgICAgICAqLworICAgICAgIG9ial9sZW4gPSBwYXlsb2FkX2xlbiArIHNpemVvZihiY21iYWxfcGFja2V0X2NmZyk7CisKKyAgICAgICBwX2luZF9tc2cgPSBiY21iYWxfbXNnX2NhbGxvYyhvYmpfbGVuKTsKKworICAgICAgIGlmKHBfaW5kX21zZyA9PSBOVUxMKQorICAgICAgIHsKKyAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgVHJhcENhbGxCYWNrOiBObyBtZW1vcnkgdG8gc2VuZCBpbmRpY2F0aW9uXG4iKTsKKyAgICAgICAgICAgcmV0dXJuOworICAgICAgIH0KKworICAgICAgIGtleS5wYWNrZXRfc2VuZF9kZXN0LnR5cGUgPSBCQ01CQUxfREVTVF9UWVBFX0hPU1Q7CisKKyAgICAgICBCQ01CQUxfQ0ZHX0lOSVQocF9pbmRfbXNnLCBwYWNrZXQsIGtleSk7CisKKyAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKHBfaW5kX21zZywgcGFja2V0LCBmbG93X2lkLCBwX2Zsb3dfZWxtLT5pZCk7CisgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2luZF9tc2csIHBhY2tldCwgc3ZjX3BvcnQsIHBfZmxvd19lbG0tPnN2Y19wb3J0KTsKKyAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKHBfaW5kX21zZywgcGFja2V0LCBmbG93X2Nvb2tpZSwgcF9mbG93X2VsbS0+Zmxvd19jb29raWUpOworCisgICAgICAgLyogZmlyc3Qgc2VhcmNoIHRoZSBQT04gdGFibGUgKi8KKyAgICAgICB0bXBfcG9ydCA9IGJhbF9iY21fcG9uX2luZl9pZHhfZ2V0KHBvcnQpOworICAgICAgIGlmKCB0bXBfcG9ydCAhPSAtMSkKKyAgICAgICB7CisgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQocF9pbmRfbXNnLCBwYWNrZXQsIGZsb3dfdHlwZSwgQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSk7CisgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQocF9pbmRfbXNnLCBwYWNrZXQsIGludGZfaWQsIHRtcF9wb3J0KTsKKyAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX2luZF9tc2csIHBhY2tldCwgaW50Zl90eXBlLCBCQ01CQUxfSU5URl9UWVBFX1BPTik7CisgICAgICAgfQorICAgICAgIGVsc2UgLyogaWYgZmFpbGVkLCBzZWFyY2ggZm9yIE5OSSB0YWJsZSAqLworICAgICAgIHsKKyAgICAgICAgICAgdG1wX3BvcnQgPSBiYWxfYmNtX25ldF9pbmZfaWR4X2dldChwb3J0KTsKKyAgICAgICAgICAgaWYoIHRtcF9wb3J0ICE9IC0xKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKHBfaW5kX21zZywgcGFja2V0LCBmbG93X3R5cGUsIEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSk7CisgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKHBfaW5kX21zZywgcGFja2V0LCBpbnRmX2lkLCB0bXBfcG9ydCk7CisgICAgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKHBfaW5kX21zZywgcGFja2V0LCBpbnRmX3R5cGUsIEJDTUJBTF9JTlRGX1RZUEVfTk5JKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICAvKiBpZiBib3RoIGZhaWxlZCwgcmV0dXJuICovCisgICAgICAgaWYodG1wX3BvcnQgPT0gLTEpCisgICAgICAgeworICAgICAgICAgICAvKiBzb21ldGhpbmcgd2VudCB3cm9uZywgZnJlZSB1cCB0aGUgbWVzc2FnZSAqLworICAgICAgICAgICBiY21iYWxfbXNnX2ZyZWUocF9pbmRfbXNnKTsKKyAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgVHJhcENhbGxCYWNrOiBjYW4ndCBtYXRjaCBpbmdyZXNzIHBvcnQgdG8gYmFsIHBvcnQgdGFibGVzXG4iKTsKKyAgICAgICAgICAgcmV0dXJuOworICAgICAgIH0KKworICAgICAgICgoYmNtYmFsX29iaiAqKXBfaW5kX21zZyktPnN0YXR1cyA9IEJDTV9FUlJfT0s7CisgICAgICAgKChiY21iYWxfb2JqICopcF9pbmRfbXNnKS0+b2JqX3R5cGUgPSBCQ01CQUxfT0JKX0lEX1BBQ0tFVDsKKyAgICAgICAoKGJjbWJhbF9vYmogKilwX2luZF9tc2cpLT5ncm91cCA9IEJDTUJBTF9NR1RfR1JPVVBfQVVUTzsKKworICAgICAgIC8qIG5vdyBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgcGFja2V0ICovCisgICAgICAgcF9pbmRfbXNnLT5kYXRhLnBrdC52YWwgPSAodWludDhfdCAqKShwX2luZF9tc2cgKyAxKTsKKyAgICAgICBtZW1jcHkocF9pbmRfbXNnLT5kYXRhLnBrdC52YWwsIHBfcGF5bG9hZCwgcGF5bG9hZF9sZW4pOworCisgICAgICAgLyogYW5kIHJlY29yZCB0aGUgbGVuZ3RoIG9mIHRoZSBjYXB0dXJlZCBwYWNrZXQgKi8KKyAgICAgICBwX2luZF9tc2ctPmRhdGEucGt0LmxlbiA9IHBheWxvYWRfbGVuOworCisgICAgICAgQkNNQkFMX1BST1BfU0VUX1BSRVNFTlQocF9pbmRfbXNnLCBwYWNrZXQsIF9jZmcsIHBrdCk7CisKKyAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIFRyYXBDYWxsQmFjazogRmxvdyBpZCA9ICVkLCB0eXBlPSVkLCBJbnRlcmZhY2UgaWQgPSAlZCwgdHlwZT0lZCwgc3ZjX3BvcnQ9JWRcbiIsCisgICAgICAgICAgICAgICBwX2luZF9tc2ctPmRhdGEuZmxvd19pZCwgcF9pbmRfbXNnLT5kYXRhLmZsb3dfdHlwZSwKKyAgICAgICAgICAgICAgIHBfaW5kX21zZy0+ZGF0YS5pbnRmX2lkLCBwX2luZF9tc2ctPmRhdGEuaW50Zl90eXBlLAorICAgICAgICAgICAgICAgcF9pbmRfbXNnLT5kYXRhLnN2Y19wb3J0KTsKKworICAgICAgIC8qIFNlbmQgdGhpcyBpbmRpY2F0aW9uIHN0cmFpZ2h0IHRvIHRoZSBBUEkgY2xpZW50CisgICAgICAgICovCisgICAgICAgYmNtYmFsX21zZ19oZHJfc2V0KHBfaW5kX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX01HTVRfQVBJX0lORF9NU0csCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTF9NU0dfVFlQRV9BVVRPX0lORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQkFMX1NVQlNZU1RFTV9DT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfT0JKX0lEX1BBQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAvKiBvcGVyYXRpb24gY29kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgIC8qIGV4Y2hhbmdlIGlkICovCisKKyAgICAgICBpZihCQ01fRVJSX09LICE9IGJjbWJhbF9tc2dfc2VuZChwX2JhbF9jb3JlX3RvX2FwaV9pbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9pbmRfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSkpCisgICAgICAgeworICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBUcmFwQ2FsbEJhY2s6IHNlbmQgYXV0byBpbmRpY2F0aW9uIGZhaWxlZFxuIik7CisgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zd191dGlsLCAiIFRyYXBDYWxsQmFjazogYXV0byBpbmRpY2F0aW9uIHNlbnRcbiIpOworICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgVHJhcENhbGxCYWNrOiBubyBhdXRvIGluZGljYXRpb24gcXVldWVcbiIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy8qKgorICogQGJyaWVmIENvbm5lY3QgYWNjZXNzIHRlcm1pbmFsCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBhY2NfdGVybV9mc20gaW4gdGhlIEJBTCBjb3JlCisgKiBVcG9uIHJlY2VpdmluZyB0aGUgcmVxdWVzdCBmcm9tIHRoZSBjb3JlLCB0aGlzIGZ1bmN0aW9uCisgKiBhc3NpZ24gdGhlIGRldmljZSBudW1iZXIgdGhhdCBlYWNoIGxvZ2ljYWwgbm5pIG9yIHBvbiBpbnRlcmZhY2UgYmVsb25nCisgKiBhbmQgcmVzdHJpY3QgdGhlIGVncmVzcyBwb3J0cyBvZiBlYWNoIGludGVyZmFjZS4gVGhpcyBtYXBwaW5nIGlzIGhpZ2hseQorICogdG9wb2xvZ3kgZGVwZW5kZW50IGFuZCBzaG91bGQgYmUgY3VzdG9taXplZCBhY2NvcmRpbmcgdG8gdGhlIGFjdHVhbCBoYXJkd2FyZQorICogbGF5b3V0LgorICogQHBhcmFtIHBfYWNjX3Rlcm0gICBQb2ludGVyIHRvIGFjY2VzcyB0ZXJtaW5hbCBpbnN0YW5jZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIHN3X3V0aWxfYWNjZXNzX3Rlcm1pbmFsX2Nvbm5lY3QoYWNjX3Rlcm1faW5zdCAqcF9hY2NfdGVybSkKK3sKKyAgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgaW50IHJjOworICAgICBiYWxfc3dhcHBfcG9ydCAqcG9ydDsKKyAgICAgY2hhciAqYXJndltdID0geyAic29jZGlhZyIsIE5VTEwgfTsKKyAgICAgdWludDMyX3QgZGV2X3R5cGU7CisKKyAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBHb3QgYSBhY2Nlc3MgdGVybWluYWwgU0VUXG4iKTsKKworICAgICAvKiBtYWtlIHN1cmUgdGhlIGFic3RyYWN0aW9uIGxheWVyIGlzIGluaXRpYWxpemVkIC0gbm8gaGFybSB0byBpbml0aWFsaXplIG11bHRpcGxlIHRpbWUgKi8KKyAgICAgYmNtb3NfaW5pdCgpOworCisgICAgIC8qIEluaXRpYWxpemUgU0RLICovCisgICAgIHJjID0gc29jZGlhZ19tYWluKDEsIGFyZ3YpOworICAgICBpZiAocmMpCisgICAgIHsKKyAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiIEluaXQgQkNNIFNESyBmYWlsZWQgLSAlZFxuIiwgcmMpOworICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgIH0KKworICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiICVzIFJQQ1xuIiwgKDEgPT0gZ191c2VfcnBjKSA/ICJVc2luZyIgOiAiTm90IHVzaW5nIiApOworCisgICAgIC8qIHVzZSBhIHNvYyBzY3JpcHQgdG8gZXN0YWJsaXNoIHJwYyBjb25uZWN0aW9uIGlmIHN3aXRjaCBpcyByZW1vdGVseSBsb2NhdGVkICovCisgICAgIGlmIChiYWxfYmNtX3VzZV9ycGNfZ2V0KCkpCisgICAgIHsKKyAgICAgICAgICBzbGVlcCgzKTsgLyogYWxsb3cgcmVtb3RlIGRldmljZSB0byBzZXR0bGUgKi8KKworICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICIgc3RhcnRpbmcgUlBDIGNvbm5lY3Rpb25cbiIpOworICAgICAgICAgIHJjID0gc2hfcmNsb2FkX2ZpbGUoLTEsIE5VTEwsICJycGMuc29jIiwgMCk7CisgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgc3RhcnQgUlBDIGNvbm5lY3Rpb24gZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgfQorCisgICAgIH0KKworICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIFVzaW5nIGludGVyZmFjZSB0YWJsZTogJWQgRGV2aWNlOiAlZFxuIiwgZ19pbnRmX21hcHRhYmxlLCBnX2RmdF9kZXZfaWQgKTsKKworICAgICAvKiBzZXR1cCB0aGUgZGV2aWNlIElEICAtIFRoaXMgaXMgdmVyeSBoYXJkd2FyZSBzcGVjaWZpYyAqLworICAgICBwb3J0ID0gZ19uZXRfaW5mX21hcF90YWJsZVtnX2ludGZfbWFwdGFibGVdOworICAgICAvKiAtMSBpbmRpY2F0ZSBlbmQgb2YgdGFibGUgKi8KKyAgICAgd2hpbGUocG9ydC0+cGJtX2lkICE9IC0xKQorICAgICB7CisgICAgICAgICBwb3J0LT5kZXZpY2VfaWQgPSBnX2RmdF9kZXZfaWQ7CisgICAgICAgICBwb3J0Kys7CisgICAgIH0KKworICAgICBwb3J0ID0gZ19wb25faW5mX21hcF90YWJsZVtnX2ludGZfbWFwdGFibGVdOworICAgICB3aGlsZShwb3J0LT5wYm1faWQgIT0gLTEpCisgICAgIHsKKyAgICAgICAgIHBvcnQtPmRldmljZV9pZCA9IGdfZGZ0X2Rldl9pZDsKKyAgICAgICAgIHBvcnQrKzsKKyAgICAgfQorICAgICAvKiBnZXQgdGhlIHN3aXRjaCBtb2RlbCBmcm9tIHRoZSBjaGlwICovCisgICAgIGRldl90eXBlID0gYmFsX2JjbV9kZXZfdHlwZV9nZXQoZ19kZnRfZGV2X2lkKTsKKyAgICAgaWYgKGRldl90eXBlID09IDApCisgICAgIHsKKyAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiIEVycm9yIHJldHJpZXZpbmcgZGV2aWNlIHR5cGUgb24gYWNjZXNzLXRlcm1pbmFsIGNvbm5lY3Q6IDB4JXhcbiIsIGRldl90eXBlKTsKKyAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICB9CisKKyAgICAvKiBzZXQgdXAgdGhlIHZhbGlkIGVncmVzcyBwb3J0cyBmb3IgbmV0L3BvbiBmYWNpbmcgcG9ydHMgKi8KKyAgICAgaWYgKGRldl90eXBlID09IEJDTV9ERVZJQ0VfS1QyKQorICAgICB7CisgICAgICAgICByZXQgPSBzd191dGlsX2Vzd19hY2NfdGVybV9jb25uZWN0KGdfbmV0X2luZl9tYXBfdGFibGVbZ19pbnRmX21hcHRhYmxlXSwgZ19wb25faW5mX21hcF90YWJsZVtnX2ludGZfbWFwdGFibGVdKTsKKyAgICAgfQorICAgICBlbHNlIGlmIChkZXZfdHlwZSA9PSBCQ01fREVWSUNFX0FSQUQgfHwgZGV2X3R5cGUgPT0gQkNNX0RFVklDRV9BUkFEX1BMVVMgfHwgZGV2X3R5cGUgPT0gQkNNX0RFVklDRV9RQVgpCisgICAgIHsKKyAgICAgICAgIC8qIGZvciBycGMgY2FzZSwgZHBwIHVzZSBhIHNwZWNpYWwgYXBpIHRvIHJlZ2lzdGVyIHJ4IGNhbGxiYWNrLgorICAgICAgICAgICAgZm9yIG5vbi1ycGMgdXNlIGNhc2UsIHVzZSBiY21fcnhfcmVnaXN0ZXIoKSB0byByZWdpc3RlciB0aGUgcnggY2FsbGJhY2sKKyAgICAgICAgICAqLworICAgICAgICBpZiAoYmFsX2JjbV91c2VfcnBjX2dldCgpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiB0aGUgdHJhcCByZWNlaXZlIHVkcCBwb3J0IGluIGJhbF9jb25maWcuaW5pIGlzIG5vdCB6ZXJvLCBzdGFydCBhIHJlY2VpdmluZyB0aHJlYWQgKi8KKyAgICAgICAgICAgIGlmKGJhbF9iY21fdHJhcF9yY3ZfcG9ydF9nZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd191dGlsX2RwcF9yeF9jYl9yZWdpc3RlcihiYWxfYmNtX2RmdF9kZXZfZ2V0KCksIHN3X3V0aWxfYmNtX3J4X2NiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIk1pc3NpbmcgVURQIHBvcnQgbnVtYmVyIGZvciBSUEMgcGFja2V0IEluIHJlY2VpdmVyIFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21fcnhfcmVnaXN0ZXIoYmFsX2JjbV9kZnRfZGV2X2dldCgpLCAiQmFsIENwdSBUcmFwcyIsIGRwcF9yeF9jYl9yZWdpc3RlciwgNTAsIE5VTEwsIEJDTV9SQ09fRl9BTExfQ09TKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHN3X3V0aWxfZHBwX2FjY190ZXJtX2Nvbm5lY3QoZ19uZXRfaW5mX21hcF90YWJsZVtnX2ludGZfbWFwdGFibGVdLCBnX3Bvbl9pbmZfbWFwX3RhYmxlW2dfaW50Zl9tYXB0YWJsZV0pOworICAgICB9CisKKyAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBSZXR1cm4gYWNjZXNzIHRlcm1pbmFsIGNvbm5lY3QgcmVxdWVzdCB3aXRoICVkIG9uIGRldmljZSAweCV4XG4iLCByZXQsIGRldl90eXBlICk7CisKKyAgICAgLyogZm9yIG5vdywgb25seSBzdXBwb3J0IG9uZSBpd2YgKi8KKyAgICAgZ19pd2ZfbW9kZSA9ICh1aW50MzJfdClwX2FjY190ZXJtLT5hcGlfcmVxX2FjY190ZXJtX29ial9pbmZvLmRhdGEuaXdmX21vZGU7CisKKyAgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgICogQGJyaWVmIGdldHRpbmcgdGhlIGludGVyZmFjZSBtYXBwaW5nIHRhYmxlIHRoYXQgYXBwbGllZCB0byB0aGUgSFcgY29ubmVjdGlvbnMKKyAgKi8KK2JhbF9zd2FwcF9wb3J0X21hcF9pbmR4IGJhbF9iY21faW50Zl9tYXB0YWJsZV9nZXQoKQoreworICAgIHJldHVybiBnX2ludGZfbWFwdGFibGU7Cit9CisKKy8qKgorICogQGJyaWVmIFNXSVRDSCBtb2R1bGU6IGludGVybmFsIHBhY2tldF9zZW5kIGZ1bmN0aW9uCisgKgorICogVGhpcyByb3V0aW5lIGRpc3RyaWJ1dGUgdGhlIFNFTkQgZnVuY3Rpb24gdG8gc3VwcG9ydGVkIHN3aXRjaCBmYW1pbHkKKyAqCisgKiBAcGFyYW0gZHN0X3BvcnRfaWQgIFN3aXRjaCBwb3J0IGlkIHRoZSBwYWNrZXQgaXMgZ29pbmcgdG8gYmUgc2VudCBvdXQKKyAqIEBwYXJhbSByZWFzb24gICAgICAgUkVBU09OX1NFTkRfVE9fTk5JIG9yIFJFQVNPTl9TRU5EX1RPX1BPTgorICogQHBhcmFtIHBheWxvYWQgICAgICBwb2ludGVyIHRvIHRoZSBkYXRhCisgKiBAcGFyYW0gcGF5bG9hZF9sZW4gIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKyAqIEBwYXJhbSB0dW5uZWxfaWQgICAgcG9uIHBvcnQgdHVubmVsIGlkIGlmIFJFQVNPTl9TRU5EX1RPX1BPTgorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIHN3X3V0aWxfcGt0X3NlbmRfaW50bChpbnQgZHN0X3BvcnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXlsb2FkX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0dW5uZWxfaWQpCit7CisgICAgIHVpbnQzMl90IGRldl90eXBlOworICAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisgICAgLyogZ2V0IHRoZSBzd2l0Y2ggY2hpcCB0eXBlIGZyb20gZGVmYXVsdCBkZXZpY2UgaWQKKyAgICAgICBUQkQgLSBpbiB0aGUgZnV0dXJlLCB0aGUgZGV2aWNlIGlkIHNob3VsZCBiZSBvYnRhaW5lZCBmcm9tIHBvcnQgbWFwcGluZyB0YWJsZSAqLworICAgICBkZXZfdHlwZSA9IGJhbF9iY21fZGV2X3R5cGVfZ2V0KGdfZGZ0X2Rldl9pZCk7CisgICAgIGlmIChkZXZfdHlwZSA9PSAwKQorICAgICB7CisgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBFcnJvciByZXRyaWV2aW5nIGRldmljZSB0eXBlIG9uIHBrdCBzZW5kOiAweCV4XG4iLCBkZXZfdHlwZSk7CisgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgfQorCisgICAgLyogc2V0IHVwIHRoZSB2YWxpZCBlZ3Jlc3MgcG9ydHMgZm9yIG5ldC9wb24gZmFjaW5nIHBvcnRzICovCisgICAgIGlmIChkZXZfdHlwZSA9PSBCQ01fREVWSUNFX0tUMikKKyAgICAgeworICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgfQorICAgICBlbHNlIGlmIChkZXZfdHlwZSA9PSBCQ01fREVWSUNFX0FSQUQgfHwgZGV2X3R5cGUgPT0gQkNNX0RFVklDRV9BUkFEX1BMVVMgfHwgZGV2X3R5cGUgPT0gQkNNX0RFVklDRV9RQVgpCisgICAgIHsKKyAgICAgICAgIHJldCA9ICBzd191dGlsX2RwcF9wa3Rfc2VuZChkc3RfcG9ydF9pZCwgcmVhc29uLCBwYXlsb2FkLCBwYXlsb2FkX2xlbiwgc190YXJnZXRfZGV2aWNlLCB0dW5uZWxfaWQpOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICB9CisKKyAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBSZXR1cm4gYWNjZXNzIHRlcm1pbmFsIGNvbm5lY3QgcmVxdWVzdCB3aXRoICVkIG9uIGRldmljZSAweCV4XG4iLCByZXQsIGRldl90eXBlICk7CisKKyAgICAgcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qICNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLICovCisKKy8qIHRoZSBsaXN0ZW5pbmcgVURQIHBvcnQgdGhhdCB0aGUgc3dpdGNoIHdpbGwgc2VuZCB0aGUgdHJhcHBlZCBtZXNzYWdlcyAqLworc3RhdGljIHVpbnQzMl90IGdfdHJhcF9yY3ZfcG9ydCA9IDA7CisKKy8qKgorICAqIEBicmllZiBzZXQgdGhlIHJlY2VpdmluZyBVRFAgcG9ydCBmb3IgdHJhcCBwYWNrZXRzIC0gZnJvbSBjb25maWcgZmlsZQorICAqLwordWludDMyX3QgYmFsX2JjbV90cmFwX3Jjdl9wb3J0X3NldCh1aW50MzJfdCB1ZHBfcG9ydCkKK3sKKyAgICBnX3RyYXBfcmN2X3BvcnQgPSB1ZHBfcG9ydDsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgICogQGJyaWVmIGdldHRpbmcgdGhlIHJlY2VpdmluZyBVRFAgcG9ydCBmb3IgdHJhcCBwYWNrZXRzCisgICovCit1aW50MzJfdCBiYWxfYmNtX3RyYXBfcmN2X3BvcnRfZ2V0KCkKK3sKKyAgICByZXR1cm4gZ190cmFwX3Jjdl9wb3J0OworfQorCisKKy8qIHRoZSBnbG9iYWwgcG9ydENoYW5uZWwgRG93blN0cmVhbSBNYXggcmF0ZSBzY2hlZHVsaW5nIG1vZGUgKi8KK3N0YXRpYyB1aW50MzJfdCBnX2RzX3NjaGVkX21vZGUgPSAwOyAgLyogZGVmYXVsdCB0byBzdHJpY3QgcHJpb3JpdHkgKi8KKworLyoqCisgICogQGJyaWVmIHNldCB0aGUgRFMgbWF4IHJhdGUgc2NoZWR1bGluZyBtb2RlIC0gZnJvbSBjb25maWcgZmlsZQorICAqLwordWludDMyX3QgYmFsX2JjbV9kc19zY2hlZF9tb2RlX3NldCh1aW50MzJfdCBzY2hlZF9tb2RlKQoreworICAgIGdfZHNfc2NoZWRfbW9kZSA9IHNjaGVkX21vZGU7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICAqIEBicmllZiBnZXR0aW5nIHRoZSBEUyBtYXggcmF0ZSBzY2hlZHVsaW5nIG1vZGUKKyAgKi8KK3VpbnQzMl90IGJhbF9iY21fZHNfc2NoZWRfbW9kZV9nZXQoKQoreworICAgIHJldHVybiBnX2RzX3NjaGVkX21vZGU7Cit9CisKKy8qKgorICogQGJyaWVmIFNXSVRDSCBtb2R1bGU6IGFjY2VzcyB0ZXJtaW5hbCBTRVQgaGFuZGxlcgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgYWNjX3Rlcm1fZnNtIGluIHRoZSBCQUwgY29yZSB1cG9uCisgKiBTRVQgcmVxdWVzdCBmb3IgYWNjX3Rlcm1pbmFsIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gcF9hY2NfdGVybSAgIFBvaW50ZXIgdG8gYWNjZXNzIHRlcm1pbmFsIGluc3RhbmNlCisgKiBAcGFyYW0gb3B0X3R5cGUgICAgIE9wZXJhdGlvbiB0eXBlIG9uIGFjY2VzcyB0ZXJtaW5hbCBpbnN0YW5jZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gc3dfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0KGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsX3V0aWxfb3Blcl9hY2NfdGVybSBvcHRfdHlwZSkKK3sKKyAgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgICBpZiAob3B0X3R5cGUgIT0gQkFMX1VUSUxfT1BFUl9BQ0NfVEVSTV9DT05ORUNUKQorICAgICB7CisgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBBY2Nlc3MgdGVybWluYWwgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgQ09OTkVDVCByZXF1ZXN0XG4iKTsKKyAgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgIH0KKworI2lmbmRlZiBURVNUX1NXX1VUSUxfTE9PUEJBQ0sKKyAgICAgcmV0ID0gc3dfdXRpbF9hY2Nlc3NfdGVybWluYWxfY29ubmVjdChwX2FjY190ZXJtKTsKKyNlbHNlCisgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICIgZHVtbXkgU1VDQ0VTU1xuIik7CisjZW5kaWYKKworICAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAgKiBAYnJpZWYgc2V0dGluZyB0aGUgaW50ZXJmYWNlIG1hcHBpbmcgdGFibGUgdGhhdCBhcHBsaWVkIHRvIHRoZSBIVyBjb25uZWN0aW9ucworICAqLworaW50IGJhbF9iY21faW50Zl9tYXB0YWJsZV9zZXQodWludDMyX3QgaW50Zl9tYXB0YWJsZSkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLCisgICAgc3dpdGNoKGludGZfbWFwdGFibGUpCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnX2ludGZfbWFwdGFibGUgPSAgQkFMX1NXQVBQX1BPUlRfTUFQX0dQT047CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnX2ludGZfbWFwdGFibGUgPSAgQkFMX1NXQVBQX1BPUlRfTUFQX0dQT05fVjM7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBnX2ludGZfbWFwdGFibGUgPSAgQkFMX1NXQVBQX1BPUlRfTUFQX0VYUDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGdfaW50Zl9tYXB0YWJsZSA9ICBCQUxfU1dBUFBfUE9SVF9NQVBfRVhQMjsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGdfaW50Zl9tYXB0YWJsZSA9ICBCQUxfU1dBUFBfUE9SVF9NQVBfU1ZLNDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIGdfaW50Zl9tYXB0YWJsZSA9ICBCQUxfU1dBUFBfUE9SVF9NQVBfRVBPTl9URE1BOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZ19pbnRmX21hcHRhYmxlID0gIEJBTF9TV0FQUF9QT1JUX01BUF9FUE9OXzFHOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZ19pbnRmX21hcHRhYmxlID0gIEJBTF9TV0FQUF9QT1JUX01BUF9FUE9OXzEwRzsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBNYXBwaW5nIFRhYmxlIElkICVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGludGZfbWFwdGFibGUpOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEBicmllZiBTV0lUQ0ggbW9kdWxlOiBwYWNrZXRfc2VuZAorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgd29yayB0aHJlYWQgaW4gdGhlIEJBTCBjb3JlIHVwb24KKyAqIHVzZXIgcmVxdWVzdCB0byBzZW5kIGEgcmF3IHBhY2tldCBvdXQgb2YgYSBzd2l0Y2ggcG9ydC4KKyAqCisgKiBAcGFyYW0gZHN0X3BvcnRfaWQgIFN3aXRjaCBwb3J0IGlkIHRoZSBwYWNrZXQgaXMgZ29pbmcgdG8gYmUgc2VudCBvdXQKKyAqIEBwYXJhbSByZWFzb24gICAgICAgUkVBU09OX1NFTkRfVE9fTk5JIG9yIFJFQVNPTl9TRU5EX1RPX1BPTgorICogQHBhcmFtIHBheWxvYWQgICAgICBwb2ludGVyIHRvIHRoZSBkYXRhCisgKiBAcGFyYW0gcGF5bG9hZF9sZW4gIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKyAqIEBwYXJhbSB0dW5uZWxfaWQgICAgcG9uIHR1bm5lbF9pZAorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gc3dfdXRpbF9wa3Rfc2VuZChpbnQgZHN0X3BvcnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXlsb2FkX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR1bm5lbF9pZCkKK3sKKyAgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgICBpZiAoIHJlYXNvbiAhPSBSRUFTT05fU0VORF9UT19OTkkgJiYgcmVhc29uICE9IFJFQVNPTl9TRU5EX1RPX1BPTikKKyAgICAgeworICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgcGt0X3NlbmQgY3VycmVudGx5ICBkb2VzIG5vdCBzdXBwb3J0IHJlYXNvbiAlZFxuIiwgcmVhc29uKTsKKyAgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgIH0KKworICAgICBpZiAoIHJlYXNvbiA9PSBSRUFTT05fU0VORF9UT19OTkkgJiYgQkNNT1NfRkFMU0UgPT0gYmNtX3RvcG9fbm5pX2lzX3ZhbGlkKGRzdF9wb3J0X2lkKSkKKyAgICAgeworICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgcGt0X3NlbmQgdG8gaW52YWxpZCBubmkgcG9ydCAlZFxuIiwgZHN0X3BvcnRfaWQpOworICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgfQorCisjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSworICAgICByZXQgPSBzd191dGlsX3BrdF9zZW5kX2ludGwoZHN0X3BvcnRfaWQsIHJlYXNvbiwgcGF5bG9hZCwgcGF5bG9hZF9sZW4sIHR1bm5lbF9pZCk7CisjZWxzZQorICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIGR1bW15IFNVQ0NFU1NcbiIpOworI2VuZGlmCisKKyAgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIGJhbF9jb3JlIHRvIHNldCB1cCB0aGUgcGFja2V0IG91dCBzZXJ2ZXIgSVA6cG9ydCAoaS5lLiB0aGUgYmNtX3VzZXIgcHJvY2VzcyBsb2NhdGlvbikKKyAqIHdoZW4gU3dpdGNoIGlzIG9uIHRoZSBzYW1lIGJvYXJkIHdoZXJlIHRoZSBjb3JlIGlzIHJ1biwgdGhlcmUgaXMgbm8gUlBDIGFuZCB0aGlzIGluaXQgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQKKyAqLworYmNtb3NfZXJybm8gc3dfdXRpbF9wa3Rfc2VuZF9pbml0KGNvbnN0IGNoYXIgKnBrdF9zZW5kX3NlcnZlcl9pcCwgdWludDE2X3QgcGt0X3NlbmRfc2VydmVyX2xpc3Rlbl9wb3J0KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLCisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogSWYgdGhlIHBhY2tldF9vdXQgaW50ZXJmYWNlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQsIGp1c3QgcmV0dXJuIE9LICovCisgICAgICAgIGlmKGdfcGt0X3NlbmRfaXNfaW5pdGlhbGl6ZWQgPT0gQkNNT1NfRkFMU0UpCisgICAgICAgIHsKKyNpZmRlZiBDT05GSUdfU1dJVENIX1JQQworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB1cCB0aGUgc29ja2V0IHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgInBhY2tldCBzZW5kIiBtZXNzYWdlcworICAgICAgICAgICAgICogdG8gdGhlIGJjbS51c2VyIHNlcnZlcgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZigoc190YXJnZXRfZGV2aWNlLnNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCkpIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PUkVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzX3RhcmdldF9kZXZpY2UuYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgICAgIGluZXRfcHRvbihzX3RhcmdldF9kZXZpY2UuYWRkci5zaW5fZmFtaWx5LCBwa3Rfc2VuZF9zZXJ2ZXJfaXAsICZzX3RhcmdldF9kZXZpY2UuYWRkci5zaW5fYWRkci5zX2FkZHIpOworICAgICAgICAgICAgc190YXJnZXRfZGV2aWNlLmFkZHIuc2luX3BvcnQgPSBodG9ucyhwa3Rfc2VuZF9zZXJ2ZXJfbGlzdGVuX3BvcnQpOworI2VuZGlmIC8qIENPTkZJR19TV0lUQ0hfUlBDICovCisgICAgICAgICAgICBnX3BrdF9zZW5kX2lzX2luaXRpYWxpemVkID0gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorCisgICAgfQorICAgIHdoaWxlKDApOworCisjZW5kaWYgLypURVNUX1NXX1VUSUxfTE9PUEJBQ0sqLworCisgICAgcmV0dXJuIHJldDsKK30KKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF9hY2NfdGVybS5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF9hY2NfdGVybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MGI5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX2FjY190ZXJtLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKgorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICoKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKgorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICoKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBAZmlsZSBiYWxfc3dpdGNoX2FjY190ZXJtLmgKKyAqCisgKiBAYnJpZWYgYmFsIHN3aXRjaCB1dGlsIGFjY2VzcyB0ZXJtaW5hbCBzZXJ2aWNlIGZ1bmN0aW9uIGhlYWRlciBmaWxlCisgKgorICogQGFkZHRvZ3JvdXAgc3dfdXRpbAorICovCisKKyNpZm5kZWYgIF9CQUxfQkNNX0FDQ19URVJNX0hfCisjZGVmaW5lICBfQkFMX0JDTV9BQ0NfVEVSTV9IXworCisvKkB7Ki8KKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorCisjZGVmaW5lIEJBTF9CQ01fTUFYX0lOVEYgICAgMzIKKworLyogc3RydWN0dXJlIG9mIGVhY2ggZW50cnkgaW4gdGhlIHBvcnQgbWFwcGluZyB0YWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QgYmFsX3N3YXBwX3BvcnRfdAoreworICAgIHVpbnQzMl90ICBwYm1faWQ7CisgICAgaW50ICAgICAgIGRldmljZV9pZDsKK30gYmFsX3N3YXBwX3BvcnQ7CisKKy8qIEluZGV4IG9mIGRpZmZlcmVudCB0YWJsZXMgdGhhdCBtYXAgY29yZSBpbnRlcmZhY2UgbnVtYmVyIHRvIHBoeXNpY2FsIHBvcnRzIG9uIHRoZSBkZXZpY2UKKyAqIGZvciBleGFtcGxlLCBHUE9OIG1hcHBpbmcgdGFibGUgd2lsbCBiZSB0YWJsZVswXSwgRVBPTiBtYXBwaW5nIHRhYmxlIHdpbGwgYmUgdGFibGVbMl0KKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkFMX1NXQVBQX1BPUlRfTUFQX0dQT04sCisgICAgQkFMX1NXQVBQX1BPUlRfTUFQX0dQT05fVjMsCisgICAgQkFMX1NXQVBQX1BPUlRfTUFQX0VYUCwKKyAgICBCQUxfU1dBUFBfUE9SVF9NQVBfRVhQMiwKKyAgICBCQUxfU1dBUFBfUE9SVF9NQVBfU1ZLNCwKKyAgICBCQUxfU1dBUFBfUE9SVF9NQVBfRVBPTl9URE1BLAorICAgIEJBTF9TV0FQUF9QT1JUX01BUF9FUE9OXzFHLAorICAgIEJBTF9TV0FQUF9QT1JUX01BUF9FUE9OXzEwRywKKyAgICBCQUxfU1dBUFBfUE9SVF9NQVBfX05VTV9PRiwKK30gYmFsX3N3YXBwX3BvcnRfbWFwX2luZHg7CisKKy8qCisgKiBAYnJpZWYgUGFja2V0IHNlbmQgc3RydWN0dXJlcyBhbmQgZGVmaW5lcworICovCitlbnVtCit7CisgICAgUkVBU09OX1NFTkRfVE9fTk5JID0gMSwKKyAgICBSRUFTT05fU0VORF9UT19QT04KK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IHNvY2tldDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKK30gdHJhcF90YXJnZXQ7CisKK2V4dGVybiBiY21vc19lcnJubyBiYWxfYmNtX2FjY190ZXJtX2Nvbm5lY3Qodm9pZCk7CitleHRlcm4gdm9pZCBiYWxfYmNtX2RmdF9kZXZfc2V0KHVpbnQzMl90IGlkKTsKK2V4dGVybiB1aW50MzJfdCBiYWxfYmNtX2RmdF9kZXZfZ2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgYmFsX2JjbV9sMl9hZ2VfdGltZV9zZXQodWludDMyX3QgdGltZSk7CitleHRlcm4gdWludDMyX3QgYmFsX2JjbV9sMl9hZ2VfdGltZV9nZXQodm9pZCk7CitleHRlcm4gdWludDMyX3QgYmFsX2JjbV9kZXZfdHlwZV9nZXQodWludDMyX3QgaWQpOworZXh0ZXJuIHZvaWQgYmFsX2JjbV91c2VfcnBjX3NldCh1aW50MzJfdCB1c2VfcnBjKTsKK2V4dGVybiBpbnQgYmFsX2JjbV9pbnRmX21hcHRhYmxlX3NldCh1aW50MzJfdCBpbnRmX21hcHRhYmxlKTsKK2V4dGVybiB1aW50MzJfdCBiYWxfYmNtX25ldF9pbmZfcGJtX2dldCh1aW50MzJfdCBuZXRfaW5mX2lkKTsKK2V4dGVybiB1aW50MzJfdCBiYWxfYmNtX3Bvbl9pbmZfcGJtX2dldCh1aW50MzJfdCBwb25faW5mX2lkKTsKK2V4dGVybiBpbnQgYmFsX2JjbV9uZXRfaW5mX2Rldl9nZXQodWludDMyX3QgbmV0X2luZl9pZCk7CitleHRlcm4gaW50IGJhbF9iY21fcG9uX2luZl9kZXZfZ2V0KHVpbnQzMl90IHBvbl9pbmZfaWQpOworZXh0ZXJuIHVpbnQzMl90IGJhbF9iY21faXdmX21vZGVfZ2V0KHZvaWQpOworZXh0ZXJuIGJjbW9zX2Jvb2wgYmFsX2JjbV91c2VfcnBjX2dldCh2b2lkKTsKK2V4dGVybiB1aW50MzJfdCBiYWxfYmNtX3RyYXBfcmN2X3BvcnRfZ2V0KHZvaWQpOworZXh0ZXJuIHVpbnQzMl90IGJhbF9iY21fdHJhcF9yY3ZfcG9ydF9zZXQodWludDMyX3QgdWRwX3BvcnQpOworZXh0ZXJuIGludCBiYWxfYmNtX3Bvbl9pbmZfaWR4X2dldCh1aW50MzJfdCBwb25faWQpOworZXh0ZXJuIGludCBiYWxfYmNtX25ldF9pbmZfaWR4X2dldCh1aW50MzJfdCBubmlfaWQpOworZXh0ZXJuIGJhbF9zd2FwcF9wb3J0X21hcF9pbmR4IGJhbF9iY21faW50Zl9tYXB0YWJsZV9nZXQodm9pZCk7CitleHRlcm4gdWludDMyX3QgYmFsX2JjbV9kc19zY2hlZF9tb2RlX2dldCh2b2lkKTsKK2V4dGVybiB1aW50MzJfdCBiYWxfYmNtX2RzX3NjaGVkX21vZGVfc2V0KHVpbnQzMl90IHNjaGVkX21vZGUpOworZXh0ZXJuIGJjbW9zX2Vycm5vIHN3X3V0aWxfcGt0X3NlbmQoaW50IGRzdF9wb3J0X2lkLCBpbnQgcmVhc29uLCB1bnNpZ25lZCBjaGFyICpwYXlsb2FkLCBpbnQgcGF5bG9hZF9sZW4sIGludCB0dW5uZWxfaWQpOworZXh0ZXJuIGJjbW9zX2Vycm5vIHN3X3V0aWxfcGt0X3NlbmRfaW5pdChjb25zdCBjaGFyICpwa3Rfc2VuZF9zZXJ2ZXJfaXAsIHVpbnQxNl90IHBrdF9zZW5kX3NlcnZlcl9saXN0ZW5fcG9ydCk7CitleHRlcm4gaW50IGJhbF9iY21fbmV0X2luZl9tYXBfc2l6ZV9nZXQodm9pZCk7CitleHRlcm4gaW50IGJhbF9iY21fcG9uX2luZl9tYXBfc2l6ZV9nZXQodm9pZCk7CisvKkB9Ki8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX2NsaS5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzlmMTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF9jbGkuYwpAQCAtMCwwICsxLDE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX3N3aXRjaF9jbGkuYworICogQGJyaWVmIFNhbXBsZSBDTEkgZm9yIHN3aXRjaCBpbnRlZ3JhdGlvbiBtb2R1bGUKKyAqCisgKi8KKworLypAeyovCisKKyNpbmNsdWRlIDxiYWxfY29tbW9uLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiYWxfbXNnLmg+CisjaW5jbHVkZSAiYmFsX3N3aXRjaF91dGlsLmgiCisjaW5jbHVkZSA8YmNtY2xpLmg+CisKKy8qIEJlbG93IGxvY2FsIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgcmVhbCBsb2dpYyBvbmx5ICovCisjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSworCisjaW5jbHVkZSAiYmFsX3N3aXRjaF9hY2NfdGVybS5oIgorI2luY2x1ZGUgPGJjbS90eXBlcy5oPgorI2luY2x1ZGUgPGJjbS9wb3J0Lmg+CisjaW5jbHVkZSA8YXBwbC9kaWFnL3NoZWxsLmg+CisKK3N0YXRpYyBiY21jbGlfZW50cnkgKnN3aXRjaF9jbGlfZGlyOworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKworLyoKKyAqIENMSSBiYWNrZW5kIGhlbHBlciBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3aXRjaF9kZXZpY2UoYmNtY2xpX3Nlc3Npb24gKnNlc3MsIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5QYXJtcykKK3sKKyAgICBiYWxfYmNtX2RmdF9kZXZfc2V0KHBhcm1bMF0udmFsdWUubnVtYmVyKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9zd2l0Y2hfbDJfYWdlX3RpbWUoYmNtY2xpX3Nlc3Npb24gKnNlc3MsIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5QYXJtcykKK3sKKyAgICBiYWxfYmNtX2wyX2FnZV90aW1lX3NldChwYXJtWzBdLnZhbHVlLm51bWJlcik7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiYWxfc3dpdGNoX3JwY19tb2RlKGJjbWNsaV9zZXNzaW9uICpzZXNzLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuUGFybXMpCit7CisgICAgYmFsX2JjbV91c2VfcnBjX3NldChwYXJtWzBdLnZhbHVlLm51bWJlcik7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiYWxfc3dpdGNoX2ludGZfbWFwKGJjbWNsaV9zZXNzaW9uICpzZXNzLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuUGFybXMpCit7CisgICAgYmFsX2JjbV9pbnRmX21hcHRhYmxlX3NldChwYXJtWzBdLnZhbHVlLm51bWJlcik7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiYWxfc3dpdGNoX3RyYXBfdWRwX3BvcnQoYmNtY2xpX3Nlc3Npb24gKnNlc3MsIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5QYXJtcykKK3sKKyAgICBiYWxfYmNtX3RyYXBfcmN2X3BvcnRfc2V0KHBhcm1bMF0udmFsdWUubnVtYmVyKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9zd2l0Y2hfc2hlbGwoYmNtY2xpX3Nlc3Npb24gKnNlc3MsIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5QYXJtcykKK3sKKyAgICBzaF9wcm9jZXNzKC0xLCAiQkNNIiwgVFJVRSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisvKiBhbGxvdyBDTEkgdG8gc2VuZCBhIHRlc3RpbmcgcGFja2V0IG91dCBvZiBOTkkgaW50ZXJmYWNlLCBpbnB1dCBpcyBpbnRlcmZhY2VfbnVtYmVyICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3aXRjaF9wa3Rfb3V0KGJjbWNsaV9zZXNzaW9uICpzZXNzLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuUGFybXMpCit7CisgICAgaW50IG91dF9wb3J0ID0gcGFybVswXS52YWx1ZS5udW1iZXI7CisgICAgdW5zaWduZWQgY2hhciBwa3RfdGFnZ2VkX2RhdGFbNjRdID0geworICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgLyogREEgKi8KKyAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIC8qIFNBICovCisgICAgICAgICAgICAgICAgICAgICAweDgxLCAweDAwLCAweDAwLCAweDAxLCAvKiBUUElEICsgVklEICovCisgICAgICAgICAgICAgICAgICAgICAweDA4LCAweDAwLCAweDQ1LCAweDEwLCAweDAwLCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDMyLCAweDA2LAorICAgICAgICAgICAgICAgICAgICAgMHg4MiwgMHhhYiwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgIDB4MDMsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDEsIDB4MDAsIDB4NTYsIDB4ZjEsIDB4MzksIDB4MDAsIDB4MDAsCisgICAgICAgICAgICAgICAgICAgICAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2fTsKKworICAgIHN3X3V0aWxfcGt0X3NlbmQob3V0X3BvcnQsIFJFQVNPTl9TRU5EX1RPX05OSSwgcGt0X3RhZ2dlZF9kYXRhLCA2NCwgMCk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIGFsbG93IENMSSB0byBzZW5kIGEgdGVzdGluZyBwYWNrZXQgb3V0IG9mIFBPTiBpbnRlcmZhY2UsIGlucHV0cyBhcmUgaW50ZXJmYWNlX251bWJlciBhbmQgdHVubmVsX2lkICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3aXRjaF9wb25fb3V0KGJjbWNsaV9zZXNzaW9uICpzZXNzLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuUGFybXMpCit7CisgICAgaW50IG91dF9wb3J0ID0gcGFybVswXS52YWx1ZS5udW1iZXI7CisgICAgaW50IHR1bm5lbF9pZCA9IHBhcm1bMV0udmFsdWUubnVtYmVyOworICAgIHVuc2lnbmVkIGNoYXIgcGt0X3RhZ2dlZF9kYXRhWzY0XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIC8qIERBICovCisgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAvKiBTQSAqLworICAgICAgICAgICAgICAgICAgICAgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMSwgLyogVFBJRCArIFZJRCAqLworICAgICAgICAgICAgICAgICAgICAgMHgwOCwgMHgwMCwgMHg0NSwgMHgxMCwgMHgwMCwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMiwgMHgwNiwKKyAgICAgICAgICAgICAgICAgICAgIDB4ODIsIDB4YWIsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsCisgICAgICAgICAgICAgICAgICAgICAweDAzLCAweDA0LCAweDAwLCAweDA0LCAweDAxLCAweDAwLCAweDU2LCAweGYxLCAweDM5LCAweDAwLCAweDAwLAorICAgICAgICAgICAgICAgICAgICAgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2Nn07CisKKyAgICBzd191dGlsX3BrdF9zZW5kKG91dF9wb3J0LCBSRUFTT05fU0VORF9UT19QT04sIHBrdF90YWdnZWRfZGF0YSwgNjQsIHR1bm5lbF9pZCk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKyNlbmRpZgorCisvKiBDcmVhdGUgQ0xJIGRpcmVjdG9yeSAqLworYmNtb3NfZXJybm8gc3dfdXRpbF9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSworICAgIGlmIChzd2l0Y2hfY2xpX2RpcikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgfQorICAgIHN3aXRjaF9jbGlfZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgInN3aXRjaCIsICJTd2l0Y2ggQ0xJIGNvbW1hbmRzIiwgQkNNQ0xJX0FDQ0VTU19HVUVTVCwgTlVMTCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKCFzd2l0Y2hfY2xpX2RpciwgQkNNX0VSUl9JTlRFUk5BTCk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoc3dpdGNoX2NsaV9kaXIsICJkZXZpY2UiLCAiU2V0IGRlZmF1bHQgZGV2aWNlIiwgYmFsX3N3aXRjaF9kZXZpY2UsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImluZGV4IiwgIkRldmljZSBpbmRleCIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSk7CisgICAgICAgIAorICAgIEJDTUNMSV9NQUtFX0NNRChzd2l0Y2hfY2xpX2RpciwgImwyX2FnZXRpbWUiLCAiU2V0IEwyIHRhYmxlIGFnaW5nIHRpbWUiLCBiYWxfc3dpdGNoX2wyX2FnZV90aW1lLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ0aW1lIiwgIkwyIEFnaW5nIFRpbWUiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKHN3aXRjaF9jbGlfZGlyLCAicnBjX21vZGUiLCAiU2V0IFJQQyBtb2RlIiwgYmFsX3N3aXRjaF9ycGNfbW9kZSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJlbmFibGUiLCAiRW5hYmxlIFJQQyBtb2RlIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoc3dpdGNoX2NsaV9kaXIsICJpbnRmX21hcF90YWJsZSIsICJTZWxlY3QgaW50ZXJmYWNlIG1hcHBpbmcgdGFibGUiLCBiYWxfc3dpdGNoX2ludGZfbWFwLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ0YWJsZSIsICJJbnRlcmZhY2UgTWFwcGluZyBUYWJsZSBOdW1iZXIiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSkpOworICAgIAorICAgIEJDTUNMSV9NQUtFX0NNRChzd2l0Y2hfY2xpX2RpciwgInRyYXBfdWRwX3BvcnQiLCAiU2V0IHRyYXAgcGFja2V0IHJlY2VpdmluZyB1ZHAgcG9ydCIsIGJhbF9zd2l0Y2hfdHJhcF91ZHBfcG9ydCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9ydCIsICJSZWNlaXZpbmcgUG9ydCBudW1iZXIiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKHN3aXRjaF9jbGlfZGlyLCAibm5pX3BhY2tldF9vdXQiLCAiU2VuZCBleGFtcGxlIHBhY2tldCB2aWQ9MSB0byBzd2l0Y2ggbm5pIHBvcnQiLCBiYWxfc3dpdGNoX3BrdF9vdXQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInBvcnQiLCAiU2VuZGluZyBQb3J0IG51bWJlciIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoc3dpdGNoX2NsaV9kaXIsICJwb25fcGFja2V0X291dCIsICJTZW5kIGV4YW1wbGUgcGFja2V0IHZpZD0xIHRvIHN3aXRjaCBwb24gcG9ydCIsIGJhbF9zd2l0Y2hfcG9uX291dCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9ydCIsICJTZW5kaW5nIFBvcnQgbnVtYmVyIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ0dW5uZWwiLCAiU2VuZGluZyBUdW5uZWwgSWQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShzd2l0Y2hfY2xpX2RpciwgInNoZWxsIiwgIlN3aXRjaCBTREsgc2hlbGwiLCBiYWxfc3dpdGNoX3NoZWxsKTsKKyNlbmRpZgorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKkB9Ki8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2JhbF9zd2l0Y2hfZmxvdy5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF9mbG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiODVkMwotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2JhbF9zd2l0Y2hfZmxvdy5jCkBAIC0wLDAgKzEsNjY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfc3dpdGNoX2Zsb3cuYworICogQGJyaWVmIEJBTCBTd2l0Y2ggdXRpbCBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgZmxvdyByZXF1ZXN0cworICogQGFkZHRvZ3JvdXAgc3dfdXRpbAorICovCisgCisgLypAeyovCisjaW5jbHVkZSA8YmFsX2NvbW1vbi5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfZmxvdy5oIgorI2luY2x1ZGUgImZsb3dfZnNtLmgiCisjaW5jbHVkZSAiYmNtb3NfZXJybm8uaCIKKyNpbmNsdWRlICJiYWxfc3dpdGNoX3V0aWwuaCIKKworI2lmbmRlZiBURVNUX1NXX1VUSUxfTE9PUEJBQ0sKKyNpbmNsdWRlIDxiY20vdHlwZXMuaD4KKyNpbmNsdWRlIDxzYWwvY29yZS9saWJjLmg+CisjaWZuZGVmIHNhbF9tZW1zZXQKKyNkZWZpbmUgc2FsX21lbXNldCBtZW1zZXQKKyNlbmRpZgorI2luY2x1ZGUgPGJjbS9wb3J0Lmg+CisjaW5jbHVkZSA8YmNtL3ZsYW4uaD4KKyNpbmNsdWRlIDxiY20vZmllbGQuaD4KKyNpbmNsdWRlIDxiY20vZXJyb3IuaD4KKyNpbmNsdWRlIDxzYWwvY29yZS9saWJjLmg+CisKKyNpbmNsdWRlICJiYWxfc3dpdGNoX2FjY190ZXJtLmgiCisjaW5jbHVkZSAiZXN3L2JhbF9lc3dfZmxvdy5oIgorI2luY2x1ZGUgImRwcC9iYWxfZHBwX2Zsb3cuaCIKKyNpbmNsdWRlICJkcHAvYmFsX2RwcF92c3dpdGNoLmgiCisKKyNlbmRpZiAvKiAjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSyAqLworCisvKiBBIGdvbGJhbCBsaW5rIGxpc3QgdG8ga2VlcCB0cmFjayBvZiBmbG93cyBpbiB0aGUgc3dpdGNoICovCitUQUlMUV9IRUFEKGJhbF9zd19mbG93X2xpc3RfaGVhZCwgYmFsX3N3X2Zsb3cpIGdfc3d1dGlsX2Zsb3dfbGlzdDsKKworc3RhdGljIHZvaWQgc3dfdXRpbF9mbG93X2R1bXBfY2xhc3NpZmllcihiY21iYWxfZmxvd19jZmcgKnBfZmxvdykKK3sKKyAgICBjaGFyIGRzdF9pcF9zdHJbMTZdOworCisgICAgYmNtb3NfaW5ldF9udG9hKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5kc3RfaXAsIGRzdF9pcF9zdHIpOworCisgICAgLyogRG8gbm90IHVzZSBub3JtYWwgQkNNX0xPRygpIChidXQgQkNNX0xPR19DQUxMRVJfRk1UKCkpLCBhcyBJUCBhZGRyZXNzIGlzIGEgc3RhY2sgdmFyaWFibGUuICovCisgICAgQkNNX0xPR19DQUxMRVJfRk1UKERFQlVHLCBsb2dfaWRfc3dfdXRpbCwgICAKKyAgICAgICAgIiBjbGFzc2lmaWVyIC0gIG90cGlkPTB4JXggaXRwaWQ9MHgleCBvdmlkPTB4JXggaXZpZD0weCV4IG9wY3A9MHgleCwgaXBjcD0weCV4ICIKKyAgICAgICAgImV0aGVyX3R5cGU9MHgleCBkc3RfbWFjPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IGlwX3Byb3RvPTB4JXggZHN0X2lwPSVzIHNyY19wb3J0PSV1IGRzdF9wb3J0PSV1IGF0dHJfbWFzaz0weCV4XG4iLCAKKyAgICAgICAgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIub190cGlkLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5pX3RwaWQsCisgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fdmlkLCAgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuaV92aWQsCisgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fcGJpdHMsCisgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmlfcGJpdHMsCisgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmV0aGVyX3R5cGUsCisgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmRzdF9tYWMudThbMF0sIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmRzdF9tYWMudThbMV0sIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmRzdF9tYWMudThbMl0sCisgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmRzdF9tYWMudThbM10sIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmRzdF9tYWMudThbNF0sIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmRzdF9tYWMudThbNV0sCisgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmlwX3Byb3RvLAorICAgICAgICBkc3RfaXBfc3RyLAorICAgICAgICBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5zcmNfcG9ydCwKKyAgICAgICAgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuZHN0X3BvcnQsCisgICAgICAgICh1bnNpZ25lZCBpbnQpcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIucHJlc2VuY2VfbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHN3X3V0aWxfZmxvd19kdW1wX3NsYShiY21iYWxfZmxvd19jZmcgKnBfZmxvdykKK3sKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3dfdXRpbCwgIiBzbGEgLSBtaW5fcmF0ZT0ldSBtYXhfcmF0ZT0ldSBhdHRyX21hc2s9MHgleFxuIiwKKyAgICAgICAgcF9mbG93LT5kYXRhLnNsYS5taW5fcmF0ZSwKKyAgICAgICAgcF9mbG93LT5kYXRhLnNsYS5tYXhfcmF0ZSwKKyAgICAgICAgKHVuc2lnbmVkIGludClwX2Zsb3ctPmRhdGEuc2xhLnByZXNlbmNlX21hc2spOworfQorCisjZGVmaW5lIE9VVEVSX1ZMQU5fVEFHX1JFUV9CSVRNQVNLIChCQ01CQUxfQUNUSU9OX0NNRF9JRF9SRU1PVkVfT1VURVJfVEFHIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9DTURfSURfWExBVEVfT1VURVJfVEFHIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9DTURfSURfWExBVEVfVFdPX1RBR1MgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9SRU1PVkVfVFdPX1RBR1MgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9SRU1BUktfUEJJVFMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9DT1BZX1BCSVRTIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9DTURfSURfUkVWRVJTRV9DT1BZX1BCSVRTIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9DTURfSURfRFNDUF9UT19QQklUUykKKworI2RlZmluZSBOT1RfV09SS0lOR19BQ1RJT05fQklUTUFTSyAoQkNNQkFMX0FDVElPTl9DTURfSURfQUREX1RXT19UQUdTIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9DTURfSURfUkVNT1ZFX1RXT19UQUdTIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9DTURfSURfWExBVEVfVFdPX1RBR1MgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9ESVNDQVJEX0RTX0JDQVNUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9DTURfSURfRElTQ0FSRF9EU19VTktOT1dOIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0FDVElPTl9DTURfSURfQ09QWV9QQklUUyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1JFVkVSU0VfQ09QWV9QQklUUyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX0RTQ1BfVE9fUEJJVFMpCisKKy8qKgorICogQGJyaWVmIFRoZSBmbG93IGNoZWNrIGZ1bmN0aW9uIHZhbGlkYXRlIHRoZSBmbG93IHBhcmFtZXRlcnMgZnJvbSB0aGUgY29yZQorICogCisgKiBAcGFyYW0gcF9tc2cgICAgQSBwb2ludGVyIHRvIHRoZSBmbG93IG9iamVjdCB0byB2YWxpZGF0ZQorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIHN3X3V0aWxfZmxvd19pbmZvX3ZhbGlkYXRlKHZvaWQgKnBfbXNnKQoreworICAgIGJjbWJhbF9mbG93X2NmZyAqcF9mbG93ID0gKGJjbWJhbF9mbG93X2NmZyAqKXBfbXNnOworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBpZiAocF9mbG93ID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTm8gZmxvdyBzcGVjaWZpZWQgZHVyaW5nIHZhbGlkYXRpb25cbiIgKTsgCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgIiBHb3QgYSBmbG93IHJlcXVlc3QgLSBmbG93X2lkPSVkIHN1Yl9wb3J0PSVkIHN2Y19pZD0lZCwgYXR0cl9tYXNrPTB4JXhcbiIsIAorICAgICAgICAgICAgICAgIHBfZmxvdy0+a2V5LmZsb3dfaWQsIHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkLAorICAgICAgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5zdmNfcG9ydF9pZCwgKHVuc2lnbmVkIGludClwX2Zsb3ctPmhkci5oZHIucHJlc2VuY2VfbWFzayk7CisKKyAgICAgICAgc3dfdXRpbF9mbG93X2R1bXBfY2xhc3NpZmllcihwX2Zsb3cpOworICAgICAgICBpZiAocF9mbG93LT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSkKKyAgICAgICAgICAgIHN3X3V0aWxfZmxvd19kdW1wX3NsYShwX2Zsb3cpOworICAgIH0KKworICAgIC8qIHZhbGlkYXRlIHRoZSBOTkkgcmFuZ2UgKi8KKyAgICBpZigoQkNNT1NfVFJVRSAgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3csIGZsb3csIG5ldHdvcmtfaW50X2lkKSkgJiYKKyAgICAgICAoQkNNT1NfRkFMU0UgPT0gYmNtX3RvcG9fbm5pX2lzX3ZhbGlkKHBfZmxvdy0+ZGF0YS5uZXR3b3JrX2ludF9pZCApKSAgICkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IG1heF9ubmlfcG9ydHMgPSAwOworCisjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSyAgICAgICAgICAgCisgICAgICAgIGJjbV90b3BvX2Rldl9nZXRfbWF4X25uaShiYWxfYmNtX25ldF9pbmZfZGV2X2dldChwX2Zsb3ctPmRhdGEubmV0d29ya19pbnRfaWQpLCAmbWF4X25uaV9wb3J0cyk7CisjZWxzZQorICAgICAgICBiY21fdG9wb19kZXZfZ2V0X21heF9ubmkoMCwgJm1heF9ubmlfcG9ydHMpOworI2VuZGlmCisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAKKyAgICAgICAgICAgICAgICAiIFJlcXVlc3QgIG5ldHdvcmsgaW50ZXJmYWNlICVkIGlzIG91dCBvZiBtYXggcmFuZ2UgJWRcbiIscF9mbG93LT5kYXRhLm5ldHdvcmtfaW50X2lkLCBtYXhfbm5pX3BvcnRzICk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRCBmb3IgYWN0aW9ucyB0aGF0IGhhcyBub3QgeWV0IGltcGxlbWVudGVkICovCisgICAgaWYoKEJDTU9TX1RSVUUgID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93LCBmbG93LCBhY3Rpb24pKSAmJgorICAgICAgIChwX2Zsb3ctPmRhdGEuYWN0aW9uLmNtZHNfYml0bWFzayAmIE5PVF9XT1JLSU5HX0FDVElPTl9CSVRNQVNLKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAKKyAgICAgICAgICAgICAgICAiIFJlcXVlc3QgQWN0aW9uIENvbW1hbmQgMHgleCBub3Qgc3VwcG9ydGVkIHlldFxuIixwX2Zsb3ctPmRhdGEuYWN0aW9uLmNtZHNfYml0bWFzayAgKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBpZihCQ01PU19GQUxTRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgY2xhc3NpZmllcikpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgCisgICAgICAgICAgICAgICAgIiBhIGNsYXNzaWZpZXIgbXVzdCBiZSBzcGVjaWZpZWQgaW4gYSBmbG93XG4iICk7CisgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIElORyBTREsgYWxsb3dzIHByaW9yaXR5IHJhbmdlIGZyb20gMHg3ZmZmZmZmZiB0byAwICovCisgICAgICAgIC8qIE5lZWQgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gcmFuZ2UgaWYgdW5pdDMyX3QgaXMgdXNlZCBmb3IgdGhlIGF0dHJpYnV0ZSAqLworCisgICAgICAgIC8qIEFuIG91dGVyIHZpZCBpcyByZXF1aXJlZCBpbiB0aGUgY2xhc3NpZmllciBmb3IgYWxsIGFjdGlvbnMgdGhhdCBvcGVyYXRlIG9uIHRoZSBvdXRlciB2bGFuIHRhZyAqLworICAgICAgICBpZihCQ01PU19GQUxTRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgb192aWQpICYmCisgICAgICAgICAgICgoQkNNT1NfVFJVRSAgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3csIGZsb3csIGFjdGlvbikpICYmCisgICAgICAgICAgICAocF9mbG93LT5kYXRhLmFjdGlvbi5jbWRzX2JpdG1hc2sgJiBPVVRFUl9WTEFOX1RBR19SRVFfQklUTUFTSykpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgCisgICAgICAgICAgICAgICAgICAgICIgb192aWQgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBhY3Rpb25zIHJlcXVpcmluZyBhbiBvdXRlciB2bGFuIHRhZyBpcyBzcGVjaWZpZWRcbiIgKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsgCisgICAgICAgIH0KKyAgICAgCisgICAgICAgIC8qQW4gb3V0ZXIgdmlkIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gYW4gaW5uZXIgdmlkIGlzIHNwZWNpZmllZCAqLworICAgICAgICBpZigoQkNNT1NfRkFMU0UgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIG9fdmlkKSkgJiYKKyAgICAgICAgICAgKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGlfdmlkKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAKKyAgICAgICAgICAgICAgICAgICAgIiBvX3ZpZCBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIGlfdmlkIGlzIHNwZWNpZmllZFxuIiApOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOyAKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIHRoYXQgdXNlciBoYXMgc3BlY2lmaWVkIHBiaXRzIHdoZW4gdGhlIGFjdGlvbiBpcyBwYml0IHJlbWFya2luZyAqLworICAgICAgICBpZigoQkNNT1NfVFJVRSAgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3csIGZsb3csIGFjdGlvbikpICYmCisgICAgICAgICAgIChwX2Zsb3ctPmRhdGEuYWN0aW9uLmNtZHNfYml0bWFzayAmIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1JFTUFSS19QQklUUykgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChCQ01PU19GQUxTRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgb192aWQpKSB8fAorICAgICAgICAgICAgICAgKEJDTU9TX0ZBTFNFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5hY3Rpb24sIGFjdGlvbiwgb19wYml0cykpICAgICAgICAgICkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgIiBvX3ZpZCBpbiBjbGFzc2lmaWVyIGFuZCBvX3BpYnRzIGluIGFjdGlvbiBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIG91dGVyIHBiaXQgcmVtYXJraW5nIGlzIHNwZWNpZmllZFxuIiApOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07IAorICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgfQorICAgICAgIAorICAgICAgICAvKiBDaGVjayB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYSB2YWxpZCBwYWNrZXQgdGFnIHR5cGUgZ2l2ZW4gdGhlIG9fdmlkIGFuZCBpX3ZpZCBjaG9pY2VzIChpZiBhbnkpKi8KKyAgICAgICAgaWYoKChCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBvX3ZpZCkpIHx8CisgICAgICAgICAgICAoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgaV92aWQpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChCQ01PU19GQUxTRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgcGt0X3RhZ190eXBlKSkgfHwKKyAgICAgICAgICAgICAgICgoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgcGt0X3RhZ190eXBlKSkgJiYKKyAgICAgICAgICAgICAgICAoQkNNQkFMX1BLVF9UQUdfVFlQRV9VTlRBR0dFRCA9PSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5wa3RfdGFnX3R5cGUpKSkgICAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAiIHBrdF90YWdfdHlwZSBtdXN0IGJlIGVpdGhlciBTSU5HTEUgb3IgRE9VQkxFIHRhZ2dlZCB3aGVuIG9fdmlkIG9yIGlfdmlkIGFyZSBzcGVjaWZpZWRcbiIgKTsKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBwa3RfdGFnX3R5cGUgaXMgbm90IHNwZWNpZmllZCBPUiB0aGUgcGt0X3RhZ190eXBlIGlzIG5vdCBVTlRBR0dFRCAoYW5kIGl0J3Mgbm90IGRlc3RpbmVkCisgICAgICAgICAgICAgKiB0byB0aGUgaG9zdCBDUFUpLCB0aGVuIGl0J3MgYW4gZXJyb3IgCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKCEoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgYWN0aW9uKSAmJiAKKyAgICAgICAgICAgICAgICAgKHBfZmxvdy0+ZGF0YS5hY3Rpb24uY21kc19iaXRtYXNrICYgQkNNQkFMX0FDVElPTl9DTURfSURfVFJBUF9UT19IT1NUKSkpCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoQkNNT1NfRkFMU0UgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIHBrdF90YWdfdHlwZSkgfHwgCisgICAgICAgICAgICAgICAgICAgKCEoQkNNQkFMX1BLVF9UQUdfVFlQRV9VTlRBR0dFRCA9PSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5wa3RfdGFnX3R5cGUpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHBrdF90YWdfdHlwZSBtdXN0IGJlIFVOVEFHR0VEIHdoZW4gbmVpdGhlciBvX3ZpZCBub3IgaV92aWQgYXJlIHNwZWNpZmllZFxuIiApOworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAgIAorICAgICAgICB9CisKKyAgICAgICAgLyogTm93IHRlc3QgdGhlIG11bHRpY2FzdCBmbG93IGNhc2VzICovCisgICAgICAgIGlmIChCQ01PU19UUlVFID09IChCQ01CQUxfRkxPV19UWVBFX01VTFRJQ0FTVCA9PSBwX2Zsb3ctPmtleS5mbG93X3R5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihCQ01PU19UUlVFICA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgYWN0aW9uKSAmJiAKKyAgICAgICAgICAgICAgIChwX2Zsb3ctPmRhdGEuYWN0aW9uLmNtZHNfYml0bWFzayAmIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1RSQVBfVE9fSE9TVCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgQSBtdWx0aWNhc3QgZmxvdyBtdXN0IG5vdCB0ZXJtaW5hdGUgaW4gdGhlIGhvc3RcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQSBNdWx0aWNhc3QgZmxvdyBtdXN0IGhhdmUgYSBncm91cF9pZCB0aGF0IGlzIHZhbGlkIChpLmUuIGFuIGFjdGl2ZSBncm91cCkgKi8KKyAgICAgICAgICAgIGlmKEJDTU9TX0ZBTFNFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93LCBmbG93LCBncm91cF9pZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgQSBtdWx0aWNhc3QgZmxvdyBtdXN0IGhhdmUgYSBzcGVjaWZpZWQgZ3JvdXBfaWRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBOb3cgY2hlY2sgdGhhdCB0aGUgcmVmZXJlbmNlZCBncm91cCBpcyB2YWxpZCAqLyAgIAorICAgICAgICAgICAgICAgIGJjbWJhbF9ncm91cF9rZXkgZ3JvdXBfa2V5ID0geyAuZ3JvdXBfaWQgPSBwX2Zsb3ctPmRhdGEuZ3JvdXBfaWQgfTsKKyAgICAgICAgICAgICAgICBiY21iYWxfZ3JvdXBfb3duZXIgZ3JvdXBfb3duZXI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGUgZ3JvdXAgb3duZXIgaXMgbXVsdGljYXN0ICovCisgICAgICAgICAgICAgICAgIGlmKEJDTV9FUlJfT0sgPT0gZ3JvdXBfb3duZXJfZ2V0KGdyb3VwX2tleSwgJmdyb3VwX293bmVyKSkKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgaWYgKCBCQ01CQUxfR1JPVVBfT1dORVJfTVVMVElDQVNUICE9IGdyb3VwX293bmVyKQorICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEEgbXVsdGljYXN0IGZsb3cgbXVzdCBoYXZlIGdyb3VwIG93bmVyIG9mIHR5cGUgTXVsdGljYXN0LCBncm91cF9pZDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfa2V5Lmdyb3VwX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQSBtdWx0aWNhc3QgZmxvdyBtdXN0IGhhdmUgYW4gdmFsaWQgZ3JvdXBfaWQgKEFjdGl2ZSBncm91cF9pZDolZCBub3QgZm91bmQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2tleS5ncm91cF9pZCk7CisgICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBjaGVjayBOOjEgc2VydmljZSBHcm91cCBPd25lciB0byBiZSBVTklDQVNUICovCisgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3csIGZsb3csIGdyb3VwX2lkKSAmJiAKKyAgICAgICAgICAgKEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSA9PSBwX2Zsb3ctPmtleS5mbG93X3R5cGUgfHwKKyAgICAgICAgICAgIEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPT0gcF9mbG93LT5rZXkuZmxvd190eXBlICAgICkKKyAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5vdyBjaGVjayB0aGF0IHRoZSByZWZlcmVuY2VkIGdyb3VwIGlzIHZhbGlkICovICAgCisgICAgICAgICAgICBiY21iYWxfZ3JvdXBfa2V5IGdyb3VwX2tleSA9IHsgLmdyb3VwX2lkID0gcF9mbG93LT5kYXRhLmdyb3VwX2lkIH07CisgICAgICAgICAgICBiY21iYWxfZ3JvdXBfb3duZXIgZ3JvdXBfb3duZXI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgdGhlIGdyb3VwIG93bmVyIGlzIHVuaWNhc3QgKi8KKyAgICAgICAgICAgICBpZihCQ01fRVJSX09LID09IGdyb3VwX293bmVyX2dldChncm91cF9rZXksICZncm91cF9vd25lcikpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBpZiAoIEJDTUJBTF9HUk9VUF9PV05FUl9VTklDQVNUICE9IGdyb3VwX293bmVyKQorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEEgTjoxIGZsb3cgbXVzdCBoYXZlIGdyb3VwIG93bmVyIG9mIHR5cGUgdW5pY2FzdCwgZ3JvdXBfaWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfa2V5Lmdyb3VwX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgIiBBIE46MSBmbG93IG11c3QgaGF2ZSBhbiB2YWxpZCBncm91cF9pZCAoQWN0aXZlIGdyb3VwX2lkOiVkIG5vdCBmb3VuZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9rZXkuZ3JvdXBfaWQpOworICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgfQorICAgICAgICB9IAorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIEJlbG93IGxvY2FsIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgcmVhbCBsb2dpYyBvbmx5ICovCisjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSworCisvKioKKyAqIEBicmllZiBUaGUgZmxvdyBhZGQgZnVuY3Rpb24gcHJvZ3JhbSB0aGUgc3dpdGNoIHRvIGZvcndhcmQgcGFja2V0cyB0aGF0IGhhdmUKKyAqIHNwZWNpZmllZCBhdHRyaWJ1dGVzIHRvIHRoZSBkZXNpZ25hdGVkIHBvcnRzLgorICogVGhlIHBhY2tldHMgaXMgbW9kaWZpZWQgYmVmb3JlIGVncmVzcworICogT24gdGhlIGRvd25zdHJlYW0sIGFuIGFjY2VzcyBpZCAob3V0ZXIgdmxhbiB0YWcpIGlzIGFkZGVkIHRvIHRoZSBwYWNrZXRzCisgKiBPbiB0aGUgdXBzdHJlYW0sIG91dGVyIHZsYW4gdGFnIChhY2Nlc3MgaWQpIGlzIHJlbW92ZWQgZnJvbSB0aGUgcGFja2V0cworICoKKyAqIEBwYXJhbSBwX2Zsb3dfaW5zdCBBIHBvaW50ZXIgdG8gdGhlIGZsb3cgaW5zdGFuY2UgYmVpbmcgcmVmZXJlbmNlZAorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiYWxfc3dfdXRpbF9mbG93X2FkZChmbG93X2luc3QgKnBfZmxvd19pbnN0KQoreworICAgIGJjbWJhbF9mbG93X2NmZyAqcF9mbG93ID0gJnBfZmxvd19pbnN0LT5hcGlfcmVxX2Zsb3dfaW5mbzsKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGludCB1bml0OworICAgIHVpbnQzMl90IGRldl90eXBlOworICAgIGJjbWJhbF9pd2ZfbW9kZSBpd2ZfbW9kZTsKKyAgICAKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgIiBHb3QgYSBmbG93IHJlcXVlc3QgLSBmbG93X2lkPSVkICBzdWJfcG9ydD0lZCBzdmNfaWQ9JWRcbiIsCisgICAgICAgICAgICBwX2Zsb3ctPmtleS5mbG93X2lkLCBwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCwgcF9mbG93LT5kYXRhLnN2Y19wb3J0X2lkKTsKKyAgCisgICAgdW5pdCA9IGJhbF9iY21fcG9uX2luZl9kZXZfZ2V0KHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkKTsKKyAgICBkZXZfdHlwZSA9IGJhbF9iY21fZGV2X3R5cGVfZ2V0KHVuaXQpOworICAgIGl3Zl9tb2RlID0gYmFsX2JjbV9pd2ZfbW9kZV9nZXQoKTsKKyAgICAKKyAgICAgLyogY2FsbCB0aGUgZmxvdyBhZGQgZnVuY3Rpb24gYmFzZWQgb24gZGV2aWNlIHR5cGUgKi8KKyAgICAgaWYgKGRldl90eXBlID09IEJDTV9ERVZJQ0VfS1QyKSAKKyAgICAgeworICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZXN3X2Zsb3dfYWRkKGl3Zl9tb2RlLCBwX2Zsb3cpOworICAgICB9CisgICAgIGVsc2UgaWYgKGRldl90eXBlID09IEJDTV9ERVZJQ0VfQVJBRCB8fCBkZXZfdHlwZSA9PSBCQ01fREVWSUNFX0FSQURfUExVUyB8fCBkZXZfdHlwZSA9PSBCQ01fREVWSUNFX1FBWCkKKyAgICAgeworICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX2Zsb3dfYWRkKGl3Zl9tb2RlLCBwX2Zsb3cpOyAgCisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBVbmtub3duIGRldmljZSB0eXBlIGZvdW5kIG9uIGZsb3cgYWRkOiAweCV4XG4iLCBkZXZfdHlwZSApOworICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgfQorICAgICAKKyAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBSZXR1cm4gZmxvdyBhZGQgcmVxdWVzdCB3aXRoICVkIG9uIGRldmljZSAweCV4XG4iLCByZXQsIGRldl90eXBlICk7ICAKKyAgICAgICAgICAKKyAgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIGZsb3cgcmVtb3ZlIGZ1bmN0aW9uIHByb2dyYW0gc3dpdGNoIHRvIHJlbGVhc2UgcmVzb3VyY2UgdGhhdCBoYXZlCisgKiBiZWVuIGFsbG9jYXRlZCBkdXJpbmcgdGhlIGZsb3cgYWRkIG9wZXJhdGlvbi4KKyAqCisgKiBAcGFyYW0gcF9mbG93X2luc3QgQSBwb2ludGVyIHRvIHRoZSBmbG93IGluc3RhbmNlIGJlaW5nIHJlZmVyZW5jZWQKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZmxvd19yZW1vdmUoZmxvd19pbnN0ICpwX2Zsb3dfaW5zdCkKK3sKKyAgICBiY21iYWxfZmxvd19jZmcgKnBfZmxvdyA9ICZwX2Zsb3dfaW5zdC0+YXBpX3JlcV9mbG93X2luZm87CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBpbnQgdW5pdDsKKyAgICB1aW50MzJfdCBkZXZfdHlwZTsKKyAgICBiY21iYWxfaXdmX21vZGUgaXdmX21vZGU7CisgICAgCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICIgR290IGEgZmxvdyByZW1vdmUgcmVxdWVzdCAtIGZsb3dfaWQ9JWQgIHN1Yl9wb3J0PSVkIHN2Y19pZD0lZFxuIiwKKyAgICAgICAgICAgIHBfZmxvdy0+a2V5LmZsb3dfaWQsIHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkLCBwX2Zsb3ctPmRhdGEuc3ZjX3BvcnRfaWQpOworICAKKyAgICB1bml0ID0gYmFsX2JjbV9wb25faW5mX2Rldl9nZXQocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpOworICAgIGRldl90eXBlID0gYmFsX2JjbV9kZXZfdHlwZV9nZXQodW5pdCk7CisgICAgaXdmX21vZGUgPSBiYWxfYmNtX2l3Zl9tb2RlX2dldCgpOworICAgIAorICAgICAvKiBjYWxsIHRoZSBmbG93IGFkZCBmdW5jdGlvbiBiYXNlZCBvbiBkZXZpY2UgdHlwZSAqLworICAgICBpZiAoZGV2X3R5cGUgPT0gQkNNX0RFVklDRV9LVDIpIAorICAgICB7CisgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9lc3dfZmxvd19yZW1vdmUoaXdmX21vZGUsIHBfZmxvdyk7CisgICAgIH0KKyAgICAgZWxzZSBpZiAoZGV2X3R5cGUgPT0gQkNNX0RFVklDRV9BUkFEIHx8IGRldl90eXBlID09IEJDTV9ERVZJQ0VfQVJBRF9QTFVTIHx8IGRldl90eXBlID09IEJDTV9ERVZJQ0VfUUFYKQorICAgICB7CisgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfZmxvd19yZW1vdmUoaXdmX21vZGUsIHBfZmxvdyk7ICAKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiIFVua25vd24gZGV2aWNlIHR5cGUgZm91bmQgb24gZmxvdyByZW1vdmU6IDB4JXhcbiIsIGRldl90eXBlICk7CisgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICB9CisgICAgIAorICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIFJldHVybiBmbG93IHJlbW92ZSByZXF1ZXN0IHdpdGggJWQgb24gZGV2aWNlIDB4JXhcbiIsIHJldCwgZGV2X3R5cGUgKTsgIAorICAgICAgICAgIAorICAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEBicmllZiBUaGUgZmxvdyBsaXN0IGluaXQgZnVuY3Rpb24gcHJlcGFyZSBhIGxpbmsgbGlzdCB0byBrZWVwIHRyYWNrIG9mIGZsb3dzIGluIHRoZSBzd2l0Y2ggdXRpbAorICogCisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9zd191dGlsX2Zsb3dfbGlzdF9pbml0KHZvaWQpCit7CisgICAgVEFJTFFfSU5JVCgmZ19zd3V0aWxfZmxvd19saXN0KTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIGZsb3cgbGlzdCBmaW5pc2ggZnVuY3Rpb24gcmVsZWFzZSBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBpbiB0aGUgZmxvdyBsaXN0CisgKiAKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZmxvd19saXN0X2ZpbmlzaCh2b2lkKQoreworCWJhbF9zd19mbG93ICpjdXJyZW50X2VudHJ5LCAqcF90ZW1wX2VudHJ5OworCisgICAgLyogRnJlZSBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgKi8KKyAgICBUQUlMUV9GT1JFQUNIX1NBRkUoY3VycmVudF9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmdfc3d1dGlsX2Zsb3dfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvd19uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBwX3RlbXBfZW50cnkpCisgICAgeworICAgICAgICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCAqLworICAgICAgICBUQUlMUV9SRU1PVkUoJmdfc3d1dGlsX2Zsb3dfbGlzdCwgY3VycmVudF9lbnRyeSwgZmxvd19uZXh0KTsKKworICAgICAgICBiY21vc19mcmVlKGN1cnJlbnRfZW50cnkpOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIGZsb3cgbGlzdCBzZWFyY2ggZnVuY3Rpb24gYnkgZmxvdyBpZAorICogCisgKiBAcGFyYW0gaWQgRmxvdyBpZCB0aGF0IG5lZWQgdG8gbWF0Y2ggdGhlIGVudHJ5IGluIHRoZSBsaXN0CisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gYW4gZWxlbWVudCBpbiB0aGUgbGlzdAorICovCitiYWxfc3dfZmxvdyAqYmFsX3N3X3V0aWxfZmxvd19saXN0X2dldF9ieV9pZCh1aW50MzJfdCBpZCkKK3sKKyAgICBiYWxfc3dfZmxvdyAqcF9lbnRyeSwgKnBfdGVtcDsKKyAgICBUQUlMUV9GT1JFQUNIX1NBRkUocF9lbnRyeSwgJmdfc3d1dGlsX2Zsb3dfbGlzdCwgZmxvd19uZXh0LCBwX3RlbXApCisgICAgeworICAgICAgICBpZiggcF9lbnRyeS0+aWQgPT0gaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIC8qIGlmIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGxpc3QsIFRBSUxRX0ZPUkVBQ0hfU0FGRSBzZXQgdGhlIHBfZW50cnkgdG8gTlVMTCAqLworICAgIHJldHVybiBwX2VudHJ5OworfQorCisvKioKKyAqIEBicmllZiBUaGUgZmxvdyBsaXN0IHNlYXJjaCBmdW5jdGlvbiBieSBmbG93IGlkCisgKiAKKyAqIEBwYXJhbSB0cmFwX2NvZGUgVHJhcCBpZCB0aGF0IG5lZWQgdG8gbWF0Y2ggdGhlIGVudHJ5IGluIHRoZSBsaXN0CisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gYW4gZWxlbWVudCBpbiB0aGUgbGlzdAorICovCitiYWxfc3dfZmxvdyAqYmFsX3N3X3V0aWxfZmxvd19saXN0X2dldF9ieV90cmFwX2NvZGUodWludDMyX3QgdHJhcF9jb2RlKQoreworICAgIGJhbF9zd19mbG93ICpwX2VudHJ5LCAqcF90ZW1wOworICAgIAorICAgIGlmICh0cmFwX2NvZGUgPT0gMCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX3N3X3V0aWwsICJJbnZhbGlkIHRyYXAgY29kZSAlZCBpbiBGbG93IGxpc3Qgc2VhcmNoIGJ5IHRyYXAgY29kZVxuIiwgdHJhcF9jb2RlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFRBSUxRX0ZPUkVBQ0hfU0FGRShwX2VudHJ5LCAmZ19zd3V0aWxfZmxvd19saXN0LCBmbG93X25leHQsIHBfdGVtcCkKKyAgICB7CisgICAgICAgIGlmKCBwX2VudHJ5LT50cmFwX2NvZGUgPT0gdHJhcF9jb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBpZiByZWFjaCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBUQUlMUV9GT1JFQUNIX1NBRkUgc2V0IHRoZSBwX2VudHJ5IHRvIE5VTEwgKi8KKyAgICByZXR1cm4gcF9lbnRyeTsKK30KKworLyoKKyAqIEBicmllZiBUaGUgZmxvdyBsaXN0IGluc2VydCBmdW5jdGlvbgorICogCisgKiBAcGFyYW0gZW50cnkgIHRoZSBlbGVtZW50IHRvIGJlIGFkZGVkIGluIHRoZSBsaW5rIGxpc3QKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorKi8KK2JjbW9zX2Vycm5vIGJhbF9zd191dGlsX2Zsb3dfbGlzdF9pbnNlcnQoYmFsX3N3X2Zsb3cgZW50cnkpCit7CisgICAgYmFsX3N3X2Zsb3cgKnBfbmV3X2VudHJ5OworICAgIAorICAgIHBfbmV3X2VudHJ5ID0gYmNtb3NfY2FsbG9jKHNpemVvZihiYWxfc3dfZmxvdykpOworICAgIGlmKE5VTEwgPT0gcF9uZXdfZW50cnkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkZsb3cgbGlzdCBpbnNlcnQgb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICAqcF9uZXdfZW50cnkgPSBlbnRyeTsKKyAgICBUQUlMUV9JTlNFUlRfVEFJTCgmZ19zd3V0aWxfZmxvd19saXN0LCBwX25ld19lbnRyeSwgZmxvd19uZXh0KTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoKKyAqIEBicmllZiBUaGUgZmxvdyBsaXN0IHJlbW92ZSBmdW5jdGlvbgorICogCisgKiBAcGFyYW0gcF9lbnRyeSBQb2ludGVyIHRvIHRoZSBlbGVtZW50IGluIHRoZSBsaW5rIGxpc3QgcmVzdWx0IGZyb20gb25lIG9mIHRoZSBzZWFyY2ggZnVuY3Rpb25zCisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyovCitiY21vc19lcnJubyBiYWxfc3dfdXRpbF9mbG93X2xpc3RfcmVtb3ZlKGJhbF9zd19mbG93ICpwX2VudHJ5KQoreworICAgIFRBSUxRX1JFTU9WRSgmZ19zd3V0aWxfZmxvd19saXN0LCBwX2VudHJ5LCBmbG93X25leHQpOworICAgIGJjbW9zX2ZyZWUocF9lbnRyeSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyoKKyAqIEBicmllZiBkb3duIFN0cmVhbSBGbG93IGNsYXNzaWZpZXIgY2hlY2sgdG8gc2VlIGlmIGFuIEFDTCBydWxlIGlzIG5lZWRlZCBmb3IgY2xhc3NpZmljYXRpb24gCisgKiAKKyAqICBJbiBJTkcgU0RLLCB2c3dpdGNoIExJRiBpcyBtb3N0bHkgdXNlZCB0byBjbGFzc2lmeSBWTEFOIGFuZCBpbmdyZXNzIHBvcnQgb25seS4KKyAqICBBbnkgcGFja2V0IGNsYXNzaWZpY2F0aW9uIG1vcmUgdGhhbiB0aGF0IHJlcXVpcmVzIGFuIEFDTCBydWxlIHRvIGZpbHRlciB0aGUKKyAqICB0cmFmZmljcy4gVGhpcyByb3V0aW5lIGNoZWNrIGlmIGFuIEFDTCBpcyBuZWVkZWQuCisgKiAgSWYgb25seSBWTEFOIGlkcyBhcmUgY2xhc3NpZnksIHJldHVybiBGQUxTRSwgb3RoZXJ3aXNlIHJldHVybiBUUlVFCisgKgorICogQHBhcmFtIHBfZmxvdyBQb2ludGVyIHRvIHRoZSBmbG93IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzc2lmaWVyCisgKiBAcmV0dXJuIFRSVUUgb3IgRkFMU0UKKyovCitiY21vc19ib29sICBiYWxfc3dfdXRpbF9mbG93X2RzX2FjbF9jbHNfY2hrKGJjbWJhbF9mbG93X2NmZyAqcF9mbG93KQoreworICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgZXRoZXJfdHlwZSkgfHwKKyAgICAgIEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGlwX3Byb3RvKSAgIHx8CisgICAgICBCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBzcmNfcG9ydCkgICB8fAorICAgICAgQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgZHN0X3BvcnQpICAgfHwKKyAgICAgIEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIG9fcGJpdHMpICAgIHx8CisgICAgICBCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBpX3BiaXRzKSAgICB8fAorICAgICAgQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgZHN0X21hYykgICAgfHwKKyAgICAgIEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIHNyY19tYWMpICAgIHx8CisgICAgICBCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBzcmNfaXApICAgICB8fAorICAgICAgQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgZHN0X2lwKSAgICAgCisgICAgICApCisgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKKy8qCisgKiBAYnJpZWYgVXAgU3RyZWFtIEZsb3cgY2xhc3NpZmllciBjaGVjayB0byBzZWUgaWYgYW4gQUNMIHJ1bGUgaXMgbmVlZGVkIGZvciBjbGFzc2lmaWNhdGlvbiAKKyAqIAorICogIEluIElORyBTREssIHZzd2l0Y2ggTElGIGlzIG1vc3RseSB1c2VkIHRvIGNsYXNzaWZ5IFZMQU4gYW5kIGluZ3Jlc3MgcG9ydCBvbmx5LgorICogIEFueSBwYWNrZXQgY2xhc3NpZmljYXRpb24gbW9yZSB0aGFuIHRoYXQgcmVxdWlyZXMgYW4gQUNMIHJ1bGUgdG8gZmlsdGVyIHRoZQorICogIHRyYWZmaWNzLiBUaGlzIHJvdXRpbmUgY2hlY2sgaWYgYW4gQUNMIGlzIG5lZWRlZC4KKyAqICBJZiBvbmx5IFZMQU4gaWRzIGFyZSBjbGFzc2lmeSwgcmV0dXJuIEZBTFNFLCBvdGhlcndpc2UgcmV0dXJuIFRSVUUKKyAqCisgKiBAcGFyYW0gcF9mbG93IFBvaW50ZXIgdG8gdGhlIGZsb3cgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNsYXNzaWZpZXIKKyAqIEByZXR1cm4gVFJVRSBvciBGQUxTRQorKi8KK2JjbW9zX2Jvb2wgIGJhbF9zd191dGlsX2Zsb3dfdXNfYWNsX2Nsc19jaGsoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3cpCit7CisgICAvKiBVcCBTdHJlYW0gT3V0ZXIgUGJpdHMgY2xhc3NpZmljYXRpb24gaXMgZG9uZSB1c2luZyBQT04gTElGLCBubyBuZWVkIHRvIHVzZSBBQ0wgKi8KKyAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGV0aGVyX3R5cGUpIHx8CisgICAgICBCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBpcF9wcm90bykgICB8fAorICAgICAgQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgc3JjX3BvcnQpICAgfHwKKyAgICAgIEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGRzdF9wb3J0KSAgIHx8CisgICAgICBCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBpX3BiaXRzKSAgICB8fAorICAgICAgQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgZHN0X21hYykgICAgfHwKKyAgICAgIEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIHNyY19tYWMpICAgIHx8CisgICAgICBCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBzcmNfaXApICAgICB8fAorICAgICAgQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgZHN0X2lwKSAgICAgCisgICAgICApCisgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnX2Zsb3dfaW5pdGVkID0gMDsKKworI2VuZGlmIC8qICNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLICovCisvKioKKyAqIEBicmllZiBTV0lUQ0ggbW9kdWxlOiBmbG93IFNFVCBoYW5kbGVyCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBmbG93X2ZzbSBpbiB0aGUgQkFMIGNvcmUgdXBvbgorICogU0VUIHJlcXVlc3QgZm9yIGZsb3cgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBwX2Zsb3cgICAgICAgUG9pbnRlciB0byBmbG93IGluc3RhbmNlCisgKiBAcGFyYW0gb3B0X3R5cGUgICAgIE9wZXJhdGlvbiB0eXBlIG9uIGZsb3cgaW5zdGFuY2UKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIHN3X3V0aWxfZmxvd19zZXQoZmxvd19pbnN0ICpwX2Zsb3csIGJhbF91dGlsX29wZXJfZmxvdyBvcHRfdHlwZSkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOyAgIAorICAgCisjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSyAKKyAgICBiYWxfc3dfdXRpbF92c2lfbGlzdF9pbml0KCk7ICAKKyAgICBpZiAob3B0X3R5cGUgPT0gQkFMX1VUSUxfT1BFUl9GTE9XX0FERCkKKyAgICB7CisgICAgICAgIGlmIChnX2Zsb3dfaW5pdGVkID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGluaXRpYWxpemVkIHRoZSBpbnRlcm5hbCBmbG93IGxpbmsgbGlzdCAqLworICAgICAgICAgICAgYmFsX3N3X3V0aWxfZmxvd19saXN0X2luaXQoKTsKKyAgICAgICAgICAgIC8qIGNhbGwgZmxvd19pbml0IGluIHN3aXRjaCBkZXZpY2UgKi8KKyAgICAgICAgICAgIGJhbF9zd191dGlsX2RwcF9mbG93X2luaXQoKTsKKyAgICAgICAgICAgIGdfZmxvd19pbml0ZWQgPSAxOworICAgICAgICB9CisgICAgICAgIHJldCA9IGJhbF9zd191dGlsX2Zsb3dfYWRkKHBfZmxvdyk7CisgICAgfQorICAgIGVsc2UgaWYoIEJBTF9VVElMX09QRVJfRkxPV19SRU1PVkUgPT0gb3B0X3R5cGUgKQorICAgIHsgCisgICAgICAgIHJldCA9IGJhbF9zd191dGlsX2Zsb3dfcmVtb3ZlKHBfZmxvdyk7CisgICAgfQorICAgIGVsc2UgaWYoIEJBTF9VVElMX09QRVJfRkxPV19DTEVBUiA9PSBvcHRfdHlwZSApCisgICAgeyAKKyAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZmxvd19yZW1vdmUocF9mbG93KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJPbmx5IEFERC9SRU1PVkUvQ0xFQVIgcmVxdWVzdCBpcyBzdXBwb3J0ZWQgZm9yIEZMT1cgb2JqZWN0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsgICAgICAgIAorICAgIH0KKyNlbHNlCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgImR1bW15IGZsb3cgJXMgU1VDQ0VTU1xuIiwgCisgICAgICAgICAgICAoIEJBTF9VVElMX09QRVJfRkxPV19BREQgPT0gb3B0X3R5cGUgKSA/ICJmbG93IGFkZCIgOiAiZmxvdyByZW1vdmUiKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBAYnJpZWYgU1dJVENIIG1vZHVsZTogZmxvdyBjbGVhbiB1cCBmdW5jdGlvbgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgYmFsX3N3aXRjaF91dGlsKCkgd2hlbiB0aGUgQkFMIGNvcmUgaXNzdWUgZmluaXNoIHJlcXVlc3QKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIHN3X3V0aWxfZmxvd19maW5pc2goKQorewkKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOyAgIAorICAgCisjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSyAgIAorICAgIGlmIChnX2Zsb3dfaW5pdGVkICkKKyAgICB7CisgICAgICAgIC8qIHJlbGVhc2UgdGhlIGludGVybmFsIGZsb3cgbGluayBsaXN0ICovCisgICAgICAgIGJhbF9zd191dGlsX2Zsb3dfbGlzdF9maW5pc2goKTsKKwkJCisgICAgICAgIGdfZmxvd19pbml0ZWQgPSAwOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiByZXQ7Cit9CQorLypAfSovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX2Zsb3cuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2JhbF9zd2l0Y2hfZmxvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDg0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX2Zsb3cuaApAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfc3dpdGNoX2Zsb3cuaAorICoKKyAqIEBicmllZiBTd2l0Y2ggZmxvdyBpbnRlcmZhY2VzIGhlYWRlciBmaWxlCisgKgorICogVGhpcyBmaWxlIGV4cG9zZSB0aGUgQVBJcyB0byB0aGUgY29yZSB0byBjb25maWd1cmUgdGhlIHN3aXRjaGVzCisgKiB3aXRoIHJlZ2FyZGluZyB0byB0aGUgb3BlcmF0aW9uIG9mIGEgZmxvdy4KKyAqCisgKiBAZGVmZ3JvdXAgc3dfdXRpbCBTd2l0Y2ggVXRpbAorICogQGluZ3JvdXAgY29yZQorICovCisKKyNpZm5kZWYgIF9CQUxfU1dJVENIX0ZMT1dfSF8KKyNkZWZpbmUgIF9CQUxfU1dJVENIX0ZMT1dfSF8KKworI2luY2x1ZGUgPGJhbF91dGlsc19tc2cuaD4KKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImZsb3dfZnNtLmgiCisKKy8qQHsqLyAKKworLyogRGF0YSBzdHJ1Y3R1cmUgdG8ga2VlcCBhIGxpbmsgbGlzdCBvZiBmbG93IHRoYXQgaGFzIGJlZW4gcHJvZ3JhbW1lZCBpbiB0aGUgc3dpdGNoICovCisvKiByZXNlcnZlIDE2IHBhaXJzIG9mIHVuaS1kaXJlY3Rpb24gcG9ydHMgKi8KKyNkZWZpbmUgTUFYX1BPTl9QT1JUICAzMiAgCisjZGVmaW5lIE1BWF9ORVRfUE9SVCAgMzIgCisjZGVmaW5lIE1BWF9GSUVMRF9FSUQgNjQgCisKKyNkZWZpbmUgQkFMX1NXX0ZMT1dfVFlQRV9OT05FICAgICAgICAgICAgMAorI2RlZmluZSBCQUxfU1dfRkxPV19UWVBFX0RPV05TVFJFQU0gICAgICgxIDw8IEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSkKKyNkZWZpbmUgQkFMX1NXX0ZMT1dfVFlQRV9VUFNUUkVBTSAgICAgICAoMSA8PCBCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNKQorI2RlZmluZSBCQUxfU1dfRkxPV19UWVBFX01VTFRJQ0FTVCAgICAgICgxIDw8IEJDTUJBTF9GTE9XX1RZUEVfTVVMVElDQVNUKQorIAordHlwZWRlZiBzdHJ1Y3QgYmFsX3N3X2Zsb3cgYmFsX3N3X2Zsb3c7CitzdHJ1Y3QgYmFsX3N3X2Zsb3cKK3sKKyAgICB1aW50MzJfdCBpZDsgICAgICAgICAgLyogZmxvdyBpZCAqLworICAgIHVpbnQzMl90IHR5cGU7ICAgICAgICAvKiBkb3duc3RyZWFtIG9yIHVwc3RyZWFtICovCisgICAgdWludDMyX3QgZGV2aWNlOyAgICAgIC8qIGRldmljZSBpZCwgYWthIHVuaXQgb2YgdGhlIGRldmljZSAqLworICAgIHVpbnQzMl90IHRyYXBfY29kZTsgICAvKiBpZCBmb3IgdHJhcCByZWFzb24gKi8KKyAgICB1aW50MzJfdCB0cmFwX3BvcnQ7ICAgLyogdHJhcCBncG9ydCAqLworICAgIHVpbnQzMl90IG51bV9laWQ7ICAgICAKKyAgICB1aW50MzJfdCBmaWVsZF9lbnRyeV9pZFtNQVhfRklFTERfRUlEXTsgIC8qIGZpZWxkIGVudHJ5IGZvciBBQ0wgcnVsZXMgKi8KKyAgICB2b2lkICAgICAqcF92c2lfc3ZjOyAgLyogdnN3aXRjaCBlbnRyeSBpbiB0aGUgdnNpIGxpc3QgKi8KKyAgICB1aW50MzJfdCB2c2lfc3ZjX2luZHg7IC8qIGluZGV4IHRvIHRoZSBzZXJ2aWNlIHdpdGhpbiB0aGUgdnN3aXRjaCB0aGlzIGZsb3cgaXMgdXNpbmcgKi8KKyAgICB1aW50MzJfdCBzdmNfcG9ydDsgICAgLyogTExJZCBvciBHRU1JRCAqLworICAgIHVpbnQzMl90IG51bV9wb247CisgICAgdWludDMyX3QgcG9uX3BvcnRbTUFYX1BPTl9QT1JUXTsgLyogcG9uIGdwb3J0IGF0dGFjaGVkIHRvIHZzd2l0Y2ggKi8KKyAgICB1aW50MzJfdCBudW1fbmV0OworICAgIHVpbnQzMl90IG5ldF9wb3J0W01BWF9ORVRfUE9SVF07IC8qIG5uaSBncG9ydCBhdHRhY2hlZCB0byB2c3dpdGNoICovCisgICAgYmNtYmFsX2Nvb2tpZSBmbG93X2Nvb2tpZTsKKyAgICB2b2lkICAgICAqcF9zZXJ2aWNlX2NmZzsKKyAgICB1aW50MzJfdCBncm91cF9pZDsKKyAgICB1aW50MzJfdCB2YWxpZDsgICAgCisgICAgVEFJTFFfRU5UUlkoYmFsX3N3X2Zsb3cpIGZsb3dfbmV4dDsKK307CisKK2V4dGVybiBiY21vc19lcnJubyBiYWxfc3dfdXRpbF9mbG93X2xpc3RfaW5zZXJ0KGJhbF9zd19mbG93IGVudHJ5KTsKK2V4dGVybiBiY21vc19lcnJubyBiYWxfc3dfdXRpbF9mbG93X2xpc3RfcmVtb3ZlKGJhbF9zd19mbG93ICpwX2VudHJ5KTsKK2V4dGVybiBiYWxfc3dfZmxvdyAqYmFsX3N3X3V0aWxfZmxvd19saXN0X2dldF9ieV9pZCh1aW50MzJfdCBpZCk7CitleHRlcm4gYmFsX3N3X2Zsb3cgKmJhbF9zd191dGlsX2Zsb3dfbGlzdF9nZXRfYnlfdHJhcF9jb2RlKHVpbnQzMl90IHRyYXBfY29kZSk7CitleHRlcm4gYmNtb3NfYm9vbCAgYmFsX3N3X3V0aWxfZmxvd19kc19hY2xfY2xzX2NoayhiY21iYWxfZmxvd19jZmcgKnBfZmxvdyk7CitleHRlcm4gYmNtb3NfYm9vbCAgYmFsX3N3X3V0aWxfZmxvd191c19hY2xfY2xzX2NoayhiY21iYWxfZmxvd19jZmcgKnBfZmxvdyk7CisKKy8qQH0qLworCisjZW5kaWYgLyogX0JBTF9TV0lUQ0hfRkxPV19IXyAqLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF9ncm91cC5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF9ncm91cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYzAyMGUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX2dyb3VwLmMKQEAgLTAsMCArMSwzOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIGJhbF9zd2l0Y2hfZ3JvdXAuYworICogQGJyaWVmIEJBTCBTd2l0Y2ggdXRpbCBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgZ3JvdXAgcmVxdWVzdHMKKyAqIEBhZGR0b2dyb3VwIHN3X3V0aWwKKyAqLworIAorIC8qQHsqLworI2luY2x1ZGUgPGJhbF9jb21tb24uaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJhbF9tc2cuaD4KKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfdXRpbC5oIiAgLyogaW5jbHVkZSBiYWxfdXRpbC5tc2cuaCBmb3IgYmFsX3V0aWxfb3Blcl9ncm91cCAqLworI2luY2x1ZGUgImdyb3VwX2ZzbS5oIiAgICAgICAgLyogZm9yIHN0cnVjdCBncm91cF9pbnN0ICovCisKKworI2luY2x1ZGUgImJhbF9kcHBfZ3JvdXAuaCIKKyNpbmNsdWRlICJiYWxfc3dpdGNoX2FjY190ZXJtLmgiCisKKyNpZmRlZiBURVNUX1NXX1VUSUxfTE9PUEJBQ0sKKy8qIG5vdGhpbmcgdG8gY2hlY2sgaW4gbG9vcCBiYWNrIG1vZGUgKi8KK2JjbW9zX2Vycm5vIHN3X3V0aWxfZ3JvdXBfaW5mb192YWxpZGF0ZSh2b2lkICpwX21zZykKK3sKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsgICAgCit9CisKKyNlbHNlCisvKioKKyAqIEBicmllZiBUaGUgZ3JvdXAgY2hlY2sgZnVuY3Rpb24gdmFsaWRhdGUgdGhlIGdyb3VwIHBhcmFtZXRlcnMgZnJvbSB0aGUgY29yZQorICogCisgKiBAcGFyYW0gcF9tc2cgICAgQSBwb2ludGVyIHRvIHRoZSBncm91cCBvYmplY3QgdG8gdmFsaWRhdGUKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBzd191dGlsX2dyb3VwX2luZm9fdmFsaWRhdGUodm9pZCAqcF9tc2cpCit7CisgICAgYmNtYmFsX2dyb3VwX2NmZyAqcF9ncnAgPSAoYmNtYmFsX2dyb3VwX2NmZyAqKXBfbXNnOworICAgIGludCBpLCBudW1fb2ZfcG9uOworCisgICAgaWYgKHBfZ3JwID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTm8gZ3JvdXAgc3BlY2lmaWVkIGR1cmluZyB2YWxpZGF0aW9uXG4iICk7IAorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKiBpZiBtZW1iZXJzIGZpZWxkIGlzIHNldCwgbWFrZSBzdXJlIHRoZSBQT04gaW50ZXJmYWNlcyBhcmUgdmFsaWQgKi8KKyAgICBpZiAoQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2dycCwgZ3JvdXAsIG1lbWJlcnMpKQorICAgIHsKKyAgICAgICAgbnVtX29mX3BvbiA9IGJhbF9iY21fcG9uX2luZl9tYXBfc2l6ZV9nZXQoKTsKKyAgICAgICAgZm9yKGk9MDsgaTxwX2dycC0+ZGF0YS5tZW1iZXJzLmxlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gKnBfbWVtYmVyID0gJnBfZ3JwLT5kYXRhLm1lbWJlcnMudmFsW2ldOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChwX21lbWJlci0+aW50Zl9pZCA+PSBudW1fb2ZfcG9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBncm91cCBtZW1iZXIgd2l0aCBwb24gaWQgPSAlZFxuIiwgcF9tZW1iZXItPmludGZfaWQgKTsgCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG1lbWJlciBhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB5ZXQgKi8gCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7ICAgIAorfQorCisvKioKKyAqIEBicmllZiBUaGUgZ3JvdXAgcmVtb3ZlIGZ1bmN0aW9uIHByb2dyYW0gc3dpdGNoIHRvIHJlbGVhc2UgcmVzb3VyY2UgdGhhdCBoYXZlCisgKiBiZWVuIGFsbG9jYXRlZCBkdXJpbmcgdGhlIGdyb3VwIGFkZCBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIHBfZ3JvdXBfaW5zdCBBIHBvaW50ZXIgdG8gdGhlIGdyb3VwIGluc3RhbmNlIGJlaW5nIHJlZmVyZW5jZWQKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZ3JvdXBfcmVtb3ZlKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCkKK3sKKyAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2dyb3VwID0gJnBfZ3JvdXBfaW5zdC0+YXBpX3JlcV9ncm91cF9pbmZvOworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgaW50IHVuaXQ7CisgICAgdWludDMyX3QgZGV2X3R5cGU7CisgICAgCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICIgR290IGEgZ3JvdXAgcmVtb3ZlIHJlcXVlc3QgLSBncm91cF9pZD0lZCBcbiIsIHBfZ3JvdXAtPmtleS5ncm91cF9pZCk7CisgICAgCisgICAgLyogcmVtb3ZlIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbWVtYmVyICovCisgICAgaWYocF9ncm91cC0+ZGF0YS5tZW1iZXJzLmxlbiA9PSAwKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJncm91cCByZW1vdmUgcmVxdWVzdCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1lbWJlclxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07IAorICAgIH0KKyAgICAKKyAgICB1bml0ID0gYmFsX2JjbV9wb25faW5mX2Rldl9nZXQocF9ncm91cC0+ZGF0YS5tZW1iZXJzLnZhbFswXS5pbnRmX2lkKTsKKyAgICBkZXZfdHlwZSA9IGJhbF9iY21fZGV2X3R5cGVfZ2V0KHVuaXQpOworICAgIAorICAgIC8qIGNhbGwgdGhlIGdyb3VwIGFkZCBmdW5jdGlvbiBiYXNlZCBvbiBkZXZpY2UgdHlwZSAqLworICAgICBpZiAoZGV2X3R5cGUgPT0gQkNNX0RFVklDRV9BUkFEIHx8IGRldl90eXBlID09IEJDTV9ERVZJQ0VfQVJBRF9QTFVTIHx8IGRldl90eXBlID09IEJDTV9ERVZJQ0VfUUFYKQorICAgICB7CisgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfcmVtKHVuaXQsIHBfZ3JvdXApOyAgCisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBVbmtub3duIGRldmljZSB0eXBlIGZvdW5kIG9uIGdyb3VwIHJlbW92ZTogMHgleFxuIiwgZGV2X3R5cGUgKTsKKyAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgIH0KKyAgICAgCisgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICIgUmV0dXJuIGdyb3VwIHJlbW92ZSByZXF1ZXN0IHdpdGggJWQgb24gZGV2aWNlIDB4JXhcbiIsIHJldCwgZGV2X3R5cGUgKTsgIAorICAgICAgICAgIAorICAgICByZXR1cm4gcmV0OworfQorLyoqCisgKiBAYnJpZWYgVGhlIGdyb3VwIGFkZCBmdW5jdGlvbiBwcm9ncmFtIHN3aXRjaCB0byBhZGQgYSBtZW1iZXIgaW50ZXJmYWNlIHRvIHRoZSBncm91cAorICoKKyAqIEBwYXJhbSBwX2dyb3VwX2luc3QgQSBwb2ludGVyIHRvIHRoZSBncm91cCBpbnN0YW5jZSBiZWluZyByZWZlcmVuY2VkCisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9zd191dGlsX2dyb3VwX2FkZChncm91cF9pbnN0ICpwX2dyb3VwX2luc3QpCit7CisgICAgYmNtYmFsX2dyb3VwX2NmZyAqcF9ncm91cCA9ICZwX2dyb3VwX2luc3QtPmFwaV9yZXFfZ3JvdXBfaW5mbzsKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGludCB1bml0OworICAgIHVpbnQzMl90IGRldl90eXBlOworICAgIAorICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAiIEdvdCBhIGdyb3VwIGFkZCByZXF1ZXN0IC0gZ3JvdXBfaWQ9JWQgXG4iLCBwX2dyb3VwLT5rZXkuZ3JvdXBfaWQpOworICAgIAorICAgIC8qIGFkZCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1lbWJlciAqLworICAgIGlmKHBfZ3JvdXAtPmRhdGEubWVtYmVycy5sZW4gPT0gMCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgYWRkIHJlcXVlc3QgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBtZW1iZXJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOyAKKyAgICB9CisgICAgCisgICAgdW5pdCA9IGJhbF9iY21fcG9uX2luZl9kZXZfZ2V0KHBfZ3JvdXAtPmRhdGEubWVtYmVycy52YWxbMF0uaW50Zl9pZCk7CisgICAgZGV2X3R5cGUgPSBiYWxfYmNtX2Rldl90eXBlX2dldCh1bml0KTsKKyAgICAKKyAgICAvKiBjYWxsIHRoZSBncm91cCBhZGQgZnVuY3Rpb24gYmFzZWQgb24gZGV2aWNlIHR5cGUgKi8KKyAgICAgaWYgKGRldl90eXBlID09IEJDTV9ERVZJQ0VfQVJBRCB8fCBkZXZfdHlwZSA9PSBCQ01fREVWSUNFX0FSQURfUExVUyB8fCBkZXZfdHlwZSA9PSBCQ01fREVWSUNFX1FBWCkKKyAgICAgeworICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX2dyb3VwX2FkZCh1bml0LCBwX2dyb3VwKTsgIAorICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgVW5rbm93biBkZXZpY2UgdHlwZSBmb3VuZCBvbiBncm91cCBhZGQ6IDB4JXhcbiIsIGRldl90eXBlICk7CisgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICB9CisgICAgIAorICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIFJldHVybiBncm91cCBhZGQgcmVxdWVzdCB3aXRoICVkIG9uIGRldmljZSAweCV4XG4iLCByZXQsIGRldl90eXBlICk7ICAKKyAgICAgICAgICAKKyAgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIGdyb3VwIHNldCBmdW5jdGlvbiBwcm9ncmFtIHN3aXRjaCB0byByZXBsYWNlIG1lbWJlciBpbnRlcmZhY2VzIG9mIGEgZ3JvdXAKKyAqCisgKiBAcGFyYW0gcF9ncm91cF9pbnN0IEEgcG9pbnRlciB0byB0aGUgZ3JvdXAgaW5zdGFuY2UgYmVpbmcgcmVmZXJlbmNlZAorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiYWxfc3dfdXRpbF9ncm91cF9zZXQoZ3JvdXBfaW5zdCAqcF9ncm91cF9pbnN0KQoreworICAgIGJjbWJhbF9ncm91cF9jZmcgKnBfZ3JvdXAgPSAmcF9ncm91cF9pbnN0LT5hcGlfcmVxX2dyb3VwX2luZm87CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBpbnQgdW5pdDsKKyAgICB1aW50MzJfdCBkZXZfdHlwZTsKKyAgICAKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgIiBHb3QgYSBncm91cCBzZXQgcmVxdWVzdCAtIGdyb3VwX2lkPSVkIFxuIiwgcF9ncm91cC0+a2V5Lmdyb3VwX2lkKTsKKyAgICAKKyAgICBpZihwX2dyb3VwLT5kYXRhLm1lbWJlcnMubGVuID09IDApCisgICAgeworICAgICAgICB1bml0ID0gYmFsX2JjbV9kZnRfZGV2X2dldCgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1bml0ID0gYmFsX2JjbV9wb25faW5mX2Rldl9nZXQocF9ncm91cC0+ZGF0YS5tZW1iZXJzLnZhbFswXS5pbnRmX2lkKTsKKyAgICB9CisgICAgZGV2X3R5cGUgPSBiYWxfYmNtX2Rldl90eXBlX2dldCh1bml0KTsKKyAgICAKKyAgICAvKiBjYWxsIHRoZSBncm91cCBzZXQgZnVuY3Rpb24gYmFzZWQgb24gZGV2aWNlIHR5cGUgKi8KKyAgICAgaWYgKGRldl90eXBlID09IEJDTV9ERVZJQ0VfQVJBRCB8fCBkZXZfdHlwZSA9PSBCQ01fREVWSUNFX0FSQURfUExVUyB8fCBkZXZfdHlwZSA9PSBCQ01fREVWSUNFX1FBWCkKKyAgICAgeworICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX2dyb3VwX3NldCh1bml0LCBwX2dyb3VwKTsgIAorICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgVW5rbm93biBkZXZpY2UgdHlwZSBmb3VuZCBvbiBncm91cCBzZXQ6IDB4JXhcbiIsIGRldl90eXBlICk7CisgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICB9CisgICAgIAorICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIFJldHVybiBncm91cCBzZXQgcmVxdWVzdCB3aXRoICVkIG9uIGRldmljZSAweCV4XG4iLCByZXQsIGRldl90eXBlICk7ICAKKyAgICAgICAgICAKKyAgICAgcmV0dXJuIHJldDsKK30KKy8qKgorICogQGJyaWVmIFRoZSBncm91cCBjcmVhdGUgZnVuY3Rpb24gcHJvZ3JhbSBzd2l0Y2ggdG8gY3JlYXRlIGFuIGVtcHR5IGdyb3VwCisgKgorICogQHBhcmFtIHBfZ3JvdXBfaW5zdCBBIHBvaW50ZXIgdG8gdGhlIGdyb3VwIGluc3RhbmNlIGJlaW5nIHJlZmVyZW5jZWQKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZ3JvdXBfY3JlYXRlKGdyb3VwX2luc3QgKnBfZ3JvdXBfaW5zdCkKK3sKKyAgICBiY21iYWxfZ3JvdXBfY2ZnICpwX2dyb3VwID0gJnBfZ3JvdXBfaW5zdC0+YXBpX3JlcV9ncm91cF9pbmZvOworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgaW50IHVuaXQ7CisgICAgdWludDMyX3QgZGV2X3R5cGU7CisgICAgCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICIgR290IGEgZ3JvdXAgY3JlYXRlIHJlcXVlc3QgLSBncm91cF9pZD0lZCBcbiIsIHBfZ3JvdXAtPmtleS5ncm91cF9pZCk7CisgICAgCisKKyAgICAvKiBGb3Igbm93LCBvbmx5IG9uZSBzd2l0Y2ggZGV2aWNlIGZvciBhIHN5c3RlbS4gSWYgbXVsdGlwbGUgZGV2aWNlcyBzdXBwb3J0IGlzIHJlcXVpcmVkLAorICAgICAgIG5lZWQgdG8gbG9vcCB0aHJvdWdoIGFsbCBkZXZpY2VzIHRvIGNyZWF0ZSB0aGUgZ3JvdXAgKi8gICAgCisgICAgdW5pdCA9IGJhbF9iY21fZGZ0X2Rldl9nZXQoKTsKKyAgICBkZXZfdHlwZSA9IGJhbF9iY21fZGV2X3R5cGVfZ2V0KHVuaXQpOworICAgIAorICAgIC8qIGNhbGwgdGhlIGdyb3VwIGNyZWF0ZSBmdW5jdGlvbiBiYXNlZCBvbiBkZXZpY2UgdHlwZSAqLworICAgICBpZiAoZGV2X3R5cGUgPT0gQkNNX0RFVklDRV9BUkFEIHx8IGRldl90eXBlID09IEJDTV9ERVZJQ0VfQVJBRF9QTFVTIHx8IGRldl90eXBlID09IEJDTV9ERVZJQ0VfUUFYKQorICAgICB7CisgICAgICAgICBpZiggTlVMTCA9PSBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfY3JlYXRlKHVuaXQsIHBfZ3JvdXApKQorICAgICAgICAgeworICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiIHN3aXRjaCBncm91cCBjcmVhdGUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOyAgICAgICAgICAgICAKKyAgICAgICAgIH0gICAgICAgICAgICAgCisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBVbmtub3duIGRldmljZSB0eXBlIGZvdW5kIG9uIGdyb3VwIGNyZWF0ZTogMHgleFxuIiwgZGV2X3R5cGUgKTsKKyAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgIH0KKyAgICAgCisgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICIgUmV0dXJuIGdyb3VwIGNyZWF0ZSByZXF1ZXN0IHdpdGggJWQgb24gZGV2aWNlIDB4JXhcbiIsIHJldCwgZGV2X3R5cGUgKTsgIAorICAgICAgICAgIAorICAgICByZXR1cm4gcmV0OworfQorLyoqCisgKiBAYnJpZWYgVGhlIGdyb3VwIGRlc3Ryb3kgZnVuY3Rpb24gcHJvZ3JhbSBzd2l0Y2ggdG8gcmVsZWFzZSBhbGwgcmVzb3VyY2UgdXNlZCBpbiBhIGdyb3VwCisgKgorICogQHBhcmFtIHBfZ3JvdXBfaW5zdCBBIHBvaW50ZXIgdG8gdGhlIGdyb3VwIGluc3RhbmNlIGJlaW5nIHJlZmVyZW5jZWQKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZ3JvdXBfZGVzdHJveShncm91cF9pbnN0ICpwX2dyb3VwX2luc3QpCit7CisgICAgYmNtYmFsX2dyb3VwX2NmZyAqcF9ncm91cCA9ICZwX2dyb3VwX2luc3QtPmN1cnJlbnRfZ3JvdXBfaW5mbzsKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGludCB1bml0OworICAgIHVpbnQzMl90IGRldl90eXBlOworICAgIAorICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAiIEdvdCBhIGdyb3VwIGRlc3Ryb3kgcmVxdWVzdCAtIGdyb3VwX2lkPSVkIFxuIiwgcF9ncm91cC0+a2V5Lmdyb3VwX2lkKTsKKyAgICAKKworICAgIC8qIEZvciBub3csIG9ubHkgb25lIHN3aXRjaCBkZXZpY2UgZm9yIGEgc3lzdGVtLiBJZiBtdWx0aXBsZSBkZXZpY2VzIHN1cHBvcnQgaXMgcmVxdWlyZWQsCisgICAgICAgbmVlZCB0byBsb29wIHRocm91Z2ggYWxsIGRldmljZXMgdG8gY3JlYXRlIHRoZSBncm91cCAqLyAgICAKKyAgICB1bml0ID0gYmFsX2JjbV9kZnRfZGV2X2dldCgpOworICAgIGRldl90eXBlID0gYmFsX2JjbV9kZXZfdHlwZV9nZXQodW5pdCk7CisgICAgCisgICAgLyogY2FsbCB0aGUgZ3JvdXAgZGVzdHJveSBmdW5jdGlvbiBiYXNlZCBvbiBkZXZpY2UgdHlwZSAqLworICAgICBpZiAoZGV2X3R5cGUgPT0gQkNNX0RFVklDRV9BUkFEIHx8IGRldl90eXBlID09IEJDTV9ERVZJQ0VfQVJBRF9QTFVTIHx8IGRldl90eXBlID09IEJDTV9ERVZJQ0VfUUFYKQorICAgICB7CisgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfZGVzdHJveSh1bml0LCBwX2dyb3VwKTsgIAorICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgVW5rbm93biBkZXZpY2UgdHlwZSBmb3VuZCBvbiBncm91cCBkZXN0cm95OiAweCV4XG4iLCBkZXZfdHlwZSApOworICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgfQorICAgICAKKyAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBSZXR1cm4gZ3JvdXAgZGVzdHJveSByZXF1ZXN0IHdpdGggJWQgb24gZGV2aWNlIDB4JXhcbiIsIHJldCwgZGV2X3R5cGUgKTsgIAorICAgICAgICAgIAorICAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdWludDMyX3QgZ19ncm91cF9pbml0ZWQgPSAwOworCisjZW5kaWYKKy8qKgorICogQGJyaWVmIFNXSVRDSCBtb2R1bGU6IGdyb3VwIFNFVCBoYW5kbGVyCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBncm91cF9mc20gaW4gdGhlIEJBTCBjb3JlIHVwb24KKyAqIFNFVCByZXF1ZXN0IGZvciBncm91cCBvYmplY3QuCisgKgorICogQHBhcmFtIHBfZ3JvdXBfaW5zdCAgICAgIFBvaW50ZXIgdG8gZ3JvdXAgaW5zdGFuY2UKKyAqIEBwYXJhbSBvcHRfdHlwZSAgICAgICAgICBPcGVyYXRpb24gdHlwZSBvbiBncm91cCBpbnN0YW5jZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gc3dfdXRpbF9ncm91cF9zZXQoZ3JvdXBfaW5zdCAqcF9ncm91cF9pbnN0LCBiYWxfdXRpbF9vcGVyX2dyb3VwIG9wdF90eXBlKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7ICAgCisgICAKKyNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLICAKKyAgICBiYWxfc3dfdXRpbF92c2lfbGlzdF9pbml0KCk7IAorICAgIGlmIChnX2dyb3VwX2luaXRlZCA9PSAwKQorICAgIHsKKyAgICAgICAgLyogaW5pdGlhbGl6ZWQgdGhlIGludGVybmFsIGdyb3VwIGxpbmsgbGlzdCAqLworICAgICAgICBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfbGlzdF9pbml0KCk7CisgCisgICAgICAgIGdfZ3JvdXBfaW5pdGVkID0gMTsKKyAgICB9CisgICAgCisgICAgaWYocF9ncm91cF9pbnN0ID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImdyb3VwIHNldCByZXF1ZXN0IHdpdGggTlVMTCBwb2ludGVyIHRvIHRoZSBncm91cCBpbnN0YW5jZVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07ICAgICAgICAKKyAgICB9CisgICAgCisgICAgaWYgKG9wdF90eXBlID09IEJBTF9VVElMX09QRVJfR1JPVVBfQ1JFQVRFKQorICAgIHsKKyAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZ3JvdXBfY3JlYXRlKHBfZ3JvdXBfaW5zdCk7CisgICAgfQorICAgIGVsc2UgaWYgKG9wdF90eXBlID09IEJBTF9VVElMX09QRVJfR1JPVVBfQUREKQorICAgIHsKKyAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZ3JvdXBfYWRkKHBfZ3JvdXBfaW5zdCk7CisgICAgfQorICAgIGVsc2UgaWYoIEJBTF9VVElMX09QRVJfR1JPVVBfUkVNT1ZFID09IG9wdF90eXBlICkKKyAgICB7IAorICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9ncm91cF9yZW1vdmUocF9ncm91cF9pbnN0KTsKKyAgICB9CisgICAgZWxzZSBpZiggQkFMX1VUSUxfT1BFUl9HUk9VUF9TRVQgPT0gb3B0X3R5cGUgKQorICAgIHsgCisgICAgICAgIHJldCA9IGJhbF9zd191dGlsX2dyb3VwX3NldChwX2dyb3VwX2luc3QpOworICAgIH0KKyAgICBlbHNlIGlmKCBCQUxfVVRJTF9PUEVSX0dST1VQX0RFU1RST1kgPT0gb3B0X3R5cGUgKQorICAgIHsgCisgICAgICAgIHJldCA9IGJhbF9zd191dGlsX2dyb3VwX2Rlc3Ryb3kocF9ncm91cF9pbnN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJPbmx5IENSRUFURS9BREQvUkVNT1ZFL1NFVC9ERVNUUk9ZIHJlcXVlc3QgaXMgc3VwcG9ydGVkIGZvciBHUk9VUCBvYmplY3RcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOyAgICAgICAgCisgICAgfQorI2Vsc2UKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiZHVtbXkgZ3JvdXAgJXMgU1VDQ0VTU1xuIiwgCisgICAgICAgICAgICBCQ01CQUxfVVRJTF9HUk9VUF9PUEVSX1NUUl9HRVQob3B0X3R5cGUpKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBAYnJpZWYgU1dJVENIIG1vZHVsZTogZ3JvdXAgY2xlYW4gdXAgZnVuY3Rpb24KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gdGhlIGJhbF9zd2l0Y2hfdXRpbCgpIHdoZW4gQ29yZSBjYWxscyB0aGUgZmluaXNoIGZ1bmN0aW9uLgorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gc3dfdXRpbF9ncm91cF9maW5pc2goKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7ICAgCisgICAKKyNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLICAKKyAgICBpZiAoZ19ncm91cF9pbml0ZWQpCisgICAgeworICAgICAgICAvKiByZWxlYXNlIHRoZSBpbnRlcm5hbCBncm91cCBsaW5rIGxpc3QgKi8KKyAgICAgICAgYmFsX3N3X3V0aWxfZHBwX2dyb3VwX2xpc3RfZmluaXNoKCk7CisgCisgICAgICAgIGdfZ3JvdXBfaW5pdGVkID0gMDsKKyAgICB9CisjZW5kaWYJCisJcmV0dXJuIHJldDsKK30KKy8qQH0qLworCisgCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX2ludGVyZmFjZS5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmQ5ZjFiCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF9pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKyNpbmNsdWRlIDxiYWxfY29tbW9uLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiYWxfbXNnLmg+CisjaW5jbHVkZSAiYmFsX3N3aXRjaF91dGlsLmgiCisjaW5jbHVkZSAiYmFsX3N3aXRjaF9hY2NfdGVybS5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZHBwL2JhbF9kcHBfaW50ZXJmYWNlLmgiCisKKyNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLCisjaW5jbHVkZSA8YmNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtL3BvcnQuaD4KKworLyoqCisgKiBAZmlsZSBiYWxfZHBwX2ludGVyZmFjZS5jCisgKiBAYnJpZWYgQkFMIFN3aXRjaCB1dGlsIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBpbnRlcmZhY2UgcmVxdWVzdHMgb24gRFVORSBQQUNLRVQgUFJPQ0VTU09SIAorICogQGFkZHRvZ3JvdXAgc3dfdXRpbAorICoKKyAqLworCisvKkB7Ki8KKworCisvKioKKyAqIEBicmllZiBTZXQgdXAgcG9uIGludGVyZmFjZSB3aXRoIERQUCAKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHN3X3V0aWxfaW50ZXJmYWNlX3NldCBpbiB0aGUgQkFMIGNvcmUKKyAqIHRvIGV4ZWN1dGUgRFBQIHNwZWNpZmljIEFQSSBmb3IgcG9uIGludGVyZmFjZSByZXF1ZXN0CisgKiAKKyAqIEBwYXJhbSBwX2ludGVyZmFjZV9pbnN0ICAgUG9pbnRlciB0byBpbnRlcmZhY2UgaW5zdGFuY2UKKyAqIEBwYXJhbSBvcHRfdHlwZSAgICAgICAgICAgVVAvRE9XTi9SRVNUQVJUIHRoZSBpbnRlcmZhY2UgCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIGJhbF9zd191dGlsX2ludGVyZmFjZV9zZXQoYWNjX3Rlcm1faW50ZXJmYWNlICpwX2ludGVyZmFjZV9pbnN0LCBiYWxfdXRpbF9vcGVyX2lmIG9wdF90eXBlICkKK3sKKyAgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsgICAgCisgICAgIGJjbWJhbF9pbnRlcmZhY2Vfa2V5IGludGZfa2V5ID0gcF9pbnRlcmZhY2VfaW5zdC0+YXBpX3JlcV9pbnRfb2JqX2luZm8ua2V5OworICAgICBpbnQgdW5pdCwgaW50Zl9pZDsgICAKKyAgICAgdWludDMyX3QgZGV2X3R5cGU7CisgICAgIAorICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgIiBHb3QgYSBpbnRlcmZhY2UgcmVxdWVzdCAtIGludGVyZmFjZV9pZD0lZCBcbiIsIGludGZfa2V5LmludGZfaWQpOyAgICAgICAgICAgIAorICAgCisgICAgIHVuaXQgPSBiYWxfYmNtX3Bvbl9pbmZfZGV2X2dldChpbnRmX2tleS5pbnRmX2lkKTsKKyAgICAgaW50Zl9pZCA9IGJhbF9iY21fcG9uX2luZl9wYm1fZ2V0KGludGZfa2V5LmludGZfaWQpOworICAgICBkZXZfdHlwZSA9IGJhbF9iY21fZGV2X3R5cGVfZ2V0KHVuaXQpOyAgICAKKworICAgICAvKiBjYWxsIHRoZSBpbnRlcmZhY2Ugc2V0IGZ1bmN0aW9uIGJhc2VkIG9uIGRldmljZSB0eXBlICovCisgICAgIGlmIChkZXZfdHlwZSA9PSBCQ01fREVWSUNFX0tUMikKKyAgICAgeworICAgICAgICAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICAgfQorICAgICBlbHNlIGlmIChkZXZfdHlwZSA9PSBCQ01fREVWSUNFX0FSQUQgfHwgZGV2X3R5cGUgPT0gQkNNX0RFVklDRV9BUkFEX1BMVVMgfHwgZGV2X3R5cGUgPT0gQkNNX0RFVklDRV9RQVgpCisgICAgIHsKKyAgICAgICAgIHJldCA9IGJhbF9zd191dGlsX2RwcF9pbnRlcmZhY2Vfc2V0KHBfaW50ZXJmYWNlX2luc3QsIG9wdF90eXBlKTsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiIFVua25vd24gZGV2aWNlIHR5cGUgKDB4JXgpZm91bmQgb24gaW50ZXJmYWNlIHNldFxuIiwgZGV2X3R5cGUgKTsKKyAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgIH0KKworICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3dfdXRpbCwgIiBSZXR1cm4gaW50ZXJmYWNlIHNldCByZXF1ZXN0IHdpdGggJWQgb24gJXMgMHgleFxuIiwgcmV0LCAKKyAgICAgICAgICAgICAoaW50Zl9rZXkuaW50Zl90eXBlID09IEJDTUJBTF9JTlRGX1RZUEVfUE9OID8gInBvbiIgOiAibm5pIiksIGludGZfaWQpOworCisgICAgIHJldHVybiByZXQ7Cit9CisKKy8qQH0qLworI2VuZGlmIC8qICNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLICovCisKKy8qKgorICogQGJyaWVmIFNXSVRDSCBtb2R1bGU6IGludGVyZmFjZSBTRVQgaGFuZGxlcgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgaW50ZXJmYWNlX2ZzbSBpbiB0aGUgQkFMIGNvcmUgdXBvbgorICogU0VUIHJlcXVlc3QgZm9yIGludGVyZmFjZSBvYmplY3QuCisgKgorICogQHBhcmFtIHBfaW50ZXJmYWNlX2luc3QgICBQb2ludGVyIHRvIGludGVyZmFjZSBpbnN0YW5jZQorICogQHBhcmFtIG9wdF90eXBlICAgICAgICAgICBVUC9ET1dOL1JFU1RBUlQgdGhlIGludGVyZmFjZSAKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gc3dfdXRpbF9pbnRlcmZhY2Vfc2V0KGFjY190ZXJtX2ludGVyZmFjZSAqcF9pbnRlcmZhY2VfaW5zdCwgYmFsX3V0aWxfb3Blcl9pZiBvcHRfdHlwZSkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOyAgCisKKyNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLCisgICAgIHJldCA9IGJhbF9zd191dGlsX2ludGVyZmFjZV9zZXQocF9pbnRlcmZhY2VfaW5zdCwgb3B0X3R5cGUpOworI2Vsc2UKKyAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgImR1bW15IFNVQ0NFU1NcbiIpOworI2VuZGlmCisKKyAgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2JhbF9zd2l0Y2hfaW50ZXJmYWNlLmggYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZDU0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIGJhbF9zd2l0Y2hfaW50ZXJmYWNlLmgKKyAqCisgKiBAYnJpZWYgYmFsIHN3aXRjaCBpbnRlcmZhY2Ugc2VydmljZSBmdW5jdGlvbiBoZWFkZXIgZmlsZQorICoKKyAqIEBhZGR0b2dyb3VwIHN3X3V0aWwKKyAqLworIAorI2lmbmRlZiAgX0JBTF9CQ01fSU5URVJGQUNFX0hfCisjZGVmaW5lICBfQkFMX0JDTV9JTlRFUkZBQ0VfSF8KKworLypAeyovCisjaW5jbHVkZSAiYmNtb3NfZXJybm8uaCIKKworCitleHRlcm4gYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfaW50ZXJmYWNlX3NldChhY2NfdGVybV9pbnRlcmZhY2UgKnBfaW50ZXJmYWNlX2luc3QsIGJhbF91dGlsX29wZXJfaWYgb3B0X3R5cGUpOworCisKKy8qQH0qLworIAorI2VuZGlmCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX3RtX3F1ZXVlLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX3RtX3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWM0YWEwOQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2JhbF9zd2l0Y2hfdG1fcXVldWUuYwpAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfc3dpdGNoX3RtX3F1ZXVlLmMKKyAqIEBicmllZiBCQUwgU3dpdGNoIHV0aWwgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHRtIHJlcXVlc3RzCisgKiBAYWRkdG9ncm91cCBzd191dGlsCisgKi8KKyAKKyAvKkB7Ki8KKyNpbmNsdWRlIDxiYWxfY29tbW9uLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiYWxfbXNnLmg+CisjaW5jbHVkZSAiYmNtb3NfZXJybm8uaCIKKyNpbmNsdWRlICJiYWxfc3dpdGNoX3V0aWwuaCIgIAorI2luY2x1ZGUgInRtX3NjaGVkX2ZzbS5oIiAKKworCisvKiAgc3dfdXRpbF90bV9xdWV1ZV92YWxpZGF0ZSgpIGlzIGNhbGxlZCBieSB0aGUgQ29yZSB0byB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdG1fcXVldWUgb2JqZWN0CisqICBwX21zZyAgYSBwb2ludGVyIHRvIHRoZSBvYmplY3QgYmNtYmFsX3RtX3F1ZXVlX2NmZworKi8KK2JjbW9zX2Vycm5vIHN3X3V0aWxfdG1fcXVldWVfdmFsaWRhdGUodm9pZCAqcF9tc2cpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qICBzd191dGlsX3RtX3F1ZXVlX3NldCgpIGlzIGNhbGxlZCBieSB0aGUgQ29yZSB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVE0gUXVldWUgaW4gdGhlIHN3aXRjaAorKiAgcF90bV9xdWV1ZV9pbnN0ICBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgc3RydWN0dXJlIHRtX3F1ZXVlX2luc3QgdGhhdCB1c2VkIGluIHRoZSBDb3JlIHRvIG1hbmFnZQorKiAgICAgICAgICAgICAgICAgICB0aGUgcmVjZWl2ZWQgdG1fcXVldWUgY29uZmlndXJhdGlvbiByZXF1ZXN0IGZyb20gdGhlIEJBTCBjbGllbnQKKyoKKyogIFJlcXVpcmVkIGF0dHJpYnV0ZXMKKyogIEtleSAgICAgICAgICAgICAgLSBrZXkgdG8gdW5pcXVlIGlkZW50aWZ5IHRoZSBUTSBxdWV1ZSBhbmQgdGhlIHBhcmVudCBzY2hlZHVsZXIKKyogIE1heCBzaXplICAgICAgICAgLSBxdWV1ZSBzaXplCisqICBQcmlvcml0eSAgICAgICAgIC0gU1AgcHJpb3JpdHksIGlmIHBhcmVudCBzY2hlZHVsZXIgaXMgb2YgdHlwZSBTUAorKiAgV2VpZ2h0ICAgICAgICAgICAtIFdGUSB3ZWlnaHQsIGlmIHBhcmVudCBzY2hlZHVsZXIgaXMgb2YgdHlwZSBXRlEKKyoKKyogIE9wdGlvbmFsCisqICBSYXRlICAgICAgICAgICAgIC0gZm9yIHJhdGUgbGltaXQsIGlmIG5vdCBzcGVjaWZpZWQgZGVmYXVsdCB0byBGVUxMIHJhdGUKKyovCitiY21vc19lcnJubyBzd191dGlsX3RtX3F1ZXVlX3NldCh0bV9xdWV1ZV9pbnN0ICpwX3RtX3F1ZXVlX2luc3QpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qICBzd191dGlsX3RtX3F1ZXVlX2NsZWFyKCkgaXMgY2FsbGVkIGJ5IHRoZSBDb3JlIHRvIHJlbW92ZSBhbiBpbnN0YW5jZSBvZiBUTSBxdWV1ZSBpbiB0aGUgc3dpdGNoCisqICBwX3RtX3F1ZXVlX2luc3QgIGEgcG9pbnRlciB0byB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG1fcXVldWVfaW5zdCB0aGF0IHVzZWQgaW4gdGhlIENvcmUgdG8gbWFuYWdlCisqICAgICAgICAgICAgICAgICAgIHRoZSByZWNlaXZlZCB0bV9xdWV1ZSBjb25maWd1cmF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgQkFMIGNsaWVudAorKgorKiAgUmVxdWlyZWQgYXR0cmlidXRlcworKiAgS2V5ICAgICAgICAgICAgIC0ga2V5IHRvIHVuaXF1ZSBpZGVudGlmeSB0aGUgVE0gcXVldWUKKyoKKyogIE5vdGU6ICBDTEVBUiByZXF1ZXN0IHNob3VsZCBiZSByZWplY3RlZCBpZiBhbnkgZmxvdyBpcyBzdGlsbCByZWZlcmVuY2luZyBpdAorKi8KK2JjbW9zX2Vycm5vIHN3X3V0aWxfdG1fcXVldWVfY2xlYXIodG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0KQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKkB9Ki8KKworIApkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF90bV9zY2hlZC5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF90bV9zY2hlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MTJmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX3RtX3NjaGVkLmMKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX3N3aXRjaF90bV9zY2hlZC5jCisgKiBAYnJpZWYgQkFMIFN3aXRjaCB1dGlsIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0bSByZXF1ZXN0cworICogQGFkZHRvZ3JvdXAgc3dfdXRpbAorICovCisgCisgLypAeyovCisgCisjaW5jbHVkZSA8YmFsX2NvbW1vbi5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgImJjbW9zX2Vycm5vLmgiCisjaW5jbHVkZSAiYmFsX3N3aXRjaF91dGlsLmgiCisKKyNpbmNsdWRlICJ0bV9zY2hlZF9mc20uaCIgCisKKworIAorLyogIHN3X3V0aWxfdG1fc2NoZWRfdmFsaWRhdGUoKSBpcyBjYWxsZWQgYnkgdGhlIENvcmUgdG8gdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHRtX3NjaGVkIG9iamVjdAorICogIHBfbXNnICBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCBiY21iYWxfdG1fc2NoZWRfY2ZnCisgKi8KK2JjbW9zX2Vycm5vIHN3X3V0aWxfdG1fc2NoZWRfdmFsaWRhdGUodm9pZCAqcF9tc2cpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisgCisvKiAgc3dfdXRpbF90bV9zY2hlZF9zZXQoKSBpcyBjYWxsZWQgYnkgdGhlIENvcmUgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIFRNIHNjaGVkdWxlciBpbiB0aGUgc3dpdGNoCisgKiAgcF90bV9zY2hlZF9pbnN0ICBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgc3RydWN0dXJlIHRtX3NjaGVkX2luc3QgdGhhdCB1c2VkIGluIHRoZSBDb3JlIHRvIG1hbmFnZQorICogICAgICAgICAgICAgICAgICAgdGhlIHJlY2VpdmVkIHRtX3NjaGVkIGNvbmZpZ3VyYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBCQUwgY2xpZW50CisgKgorICogIFJlcXVpcmVkIGF0dHJpYnV0ZXMKKyAqICBLZXkgICAgICAgICAgICAgIC0ga2V5IHRvIHVuaXF1ZSBpZGVudGlmeSB0aGUgVE0gc2NoZWQKKyAqICBPd25lciB0eXBlcyAgICAgIC0gSW50ZXJmYWNlLCBTdWJzY3JpYmVyX1Rlcm1pbmFsCisqKiAgT3duZXIgaWQgICAgICAgICAtIGlkIG9mIGludGVyZmFjZSBvciBzdWJzY3JpYmVyIHRlcm1pbmFsCisgKiAgU2NoZWR1bGUgdHlwZXMgICAtIFNQLCBXRlEsIFNQX1dGUQorKiogIE51bV9vZl9wcmlvcml0eSAgLSAxIC0gMTYgICAKKyogVE0gb2JqZWN0cyBpbiB0aGUgc2NoZWR1bGVfbGV2ZWwgdGhpcyBUTSBzY2hlZCBjYW4gc3VwcG9ydCAqLworYmNtb3NfZXJybm8gc3dfdXRpbF90bV9zY2hlZF9zZXQodG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZF9pbnN0KQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiAgc3dfdXRpbF90bV9zY2hlZF9jbGVhcigpIGlzIGNhbGxlZCBieSB0aGUgQ29yZSB0byByZW1vdmUgYW4gaW5zdGFuY2Ugb2YgVE0gc2NoZWR1bGVyIGluIHRoZSBzd2l0Y2gKKyogIHBfdG1fc2NoZWRfaW5zdCAgYSBwb2ludGVyIHRvIHRoZSBkYXRhIHN0cnVjdHVyZSB0bV9zY2hlZF9pbnN0IHRoYXQgdXNlZCBpbiB0aGUgQ29yZSB0byBtYW5hZ2UKKyogICAgICAgICAgICAgICAgICAgdGhlIHJlY2VpdmVkIHRtX3NjaGVkIGNvbmZpZ3VyYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBCQUwgY2xpZW50CisqCisqICBSZXF1aXJlZCBhdHRyaWJ1dGVzCisqICBLZXkgICAgICAgICAgICAgLSBrZXkgdG8gdW5pcXVlIGlkZW50aWZ5IHRoZSBUTSBzY2hlZAorKi8KK2JjbW9zX2Vycm5vIHN3X3V0aWxfdG1fc2NoZWRfY2xlYXIodG1fc2NoZWRfaW5zdCAqcF90bV9zY2hlZF9pbnN0KQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorLypAfSovCisKKyAKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF91dGlsLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9iYWxfc3dpdGNoX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTYyOTVmCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF91dGlsLmMKQEAgLTAsMCArMSw4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX3N3aXRjaF91dGlsLmMKKyAqCisgKiBAYnJpZWYgU3dpdGNoIEFwcCBpbnRlcmZhY2VzIGRlZmluaXRpb24gdXNlZCBieSBCYWwgQ29yZQorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBDbWRTZXQgbWVzc2FnZSBoYW5kbGVyIGZ1bmN0aW9ucyB3aXRoIHJlbGV2YW50ICAKKyAqIGJhbCBvYmplY3Qgb3BlcmF0aW9ucyBvZiBhY2Nlc3MgdGVybWluYWwgYW5kIGZsb3cuCisgKiAKKyAqIEBhZGR0b2dyb3VwIHN3X3V0aWwKKyAqCisgKi8KKworLypAeyovCisKKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJhbF9jb21tb24uaD4KKyNpbmNsdWRlIDxiYWxfbXNnLmg+CisjaW5jbHVkZSAiYmFsX3N3aXRjaF91dGlsLmgiCisKKy8qCisgKiBMb2dnaW5nIGRldmljZSBpZAorICovCitkZXZfbG9nX2lkIGxvZ19pZF9zd191dGlsOworCisvKioKKyogQGJyaWVmIHN3X3V0aWxfaW5pdCAgcm91dGluZSB0byBpbml0aWFsaXplIHRoZSBzd2l0Y2ggdXRpbCBiZWZvcmUgYW55IHVzZSAKKyogQHJldHVybiBiY21vc19lcnJubyAKKyovCitiY21vc19lcnJubyBzd191dGlsX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBsb2dfaWRfc3dfdXRpbCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJTV19VVElMIiwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgQlVHX09OKGxvZ19pZF9zd191dGlsPT0gREVWX0xPR19JTlZBTElEX0lEKTsKKworICAgIHJldHVybiByYzsgCit9CisKKy8qKgorKiBAYnJpZWYgc3dfdXRpbF9maW5pc2ggIHJvdXRpbmUgdG8gcmVsZWFzZSBhbnkgcmVzb3VyY2UgdXNlZCBieSB0aGUgc3dpdGNoIHV0aWwgYmVmb3JlIGV4aXQgCisqIEByZXR1cm4gYmNtb3NfZXJybm8gCisqLworYmNtb3NfZXJybm8gc3dfdXRpbF9maW5pc2godm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiByZWxlYXNlIGFueSBpbnRlcm5hbCBhbGxvY2F0ZWQgREIgLSBiZXN0IGVmZm9ydCBhcyB3ZSBhcmUgZXhpdGluZyBhbnl3YXkgKi8KKwkvKiBmbG93ICovCisJc3dfdXRpbF9mbG93X2ZpbmlzaCgpOworCSAKKwkvKiBncm91cCAqLworCXN3X3V0aWxfZ3JvdXBfZmluaXNoKCk7IAorCisgICAgcmV0dXJuIHJjOyAKK30KKworLypAfSovCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2JhbF9zd2l0Y2hfdXRpbC5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvYmFsX3N3aXRjaF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzYTJhYwotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2JhbF9zd2l0Y2hfdXRpbC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIGJhbF9zd2l0Y2hfdXRpbC5oCisgKgorICogQGJyaWVmIFN3aXRjaCBBcHAgaW50ZXJmYWNlcyBoZWFkZXIgZmlsZQorICoKKyAqIFRoaXMgZmlsZSBleHBvc2UgdGhlIEFQSXMgdG8gdGhlIGNvcmUgdG8gY29uZmlndXJlIHRoZSBzd2l0Y2hzCisgKiB3aXRoIHJlZ2FyZGluZyB0byB0aGUgb3BlcmF0aW9uIG9mIGFjY2VzcyB0ZXJtaW5hbCBhbmQgZmxvdy4KKyAqCisgKiBAZGVmZ3JvdXAgc3dfdXRpbCBTd2l0Y2ggVXRpbAorICogQGluZ3JvdXAgY29yZQorICovCisKKyNpZm5kZWYgIF9CQUxfU1dJVENIX1VUSUxfSF8KKyNkZWZpbmUgIF9CQUxfU1dJVENIX1VUSUxfSF8KKworLypAeyovIAorCisjaW5jbHVkZSA8YWNjX3Rlcm1fZnNtLmg+CisjaW5jbHVkZSA8Zmxvd19mc20uaD4KKyNpbmNsdWRlIDxncm91cF9mc20uaD4KKyNpbmNsdWRlIDx0bV9zY2hlZF9mc20uaD4KKyNpbmNsdWRlIDx0bV9xdWV1ZV9mc20uaD4KKworCisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8YmFsX3V0aWxzX21zZy5oPgorCisjZGVmaW5lIEJDTV9ERVZJQ0VfS1QyICAgICAgIDB4YjQ1MAorI2RlZmluZSBCQ01fREVWSUNFX0FSQURfUExVUyAweDg2NjAKKyNkZWZpbmUgQkNNX0RFVklDRV9BUkFEICAgICAgMHg4NjUwCisjZGVmaW5lIEJDTV9ERVZJQ0VfUUFYICAgICAgIDB4ODQ3MAorCisvKiBGdW5jdGlvbiBQcm90b3R5cGVzIGZvciBleHRlcm5hbCAqLworYmNtb3NfZXJybm8gc3dfdXRpbF9hY2Nlc3NfdGVybWluYWxfc2V0KGFjY190ZXJtX2luc3QgKnBfYWNjX3Rlcm0sIGJhbF91dGlsX29wZXJfYWNjX3Rlcm0gb3B0X3R5cGUpOworYmNtb3NfZXJybm8gc3dfdXRpbF9mbG93X2luZm9fdmFsaWRhdGUodm9pZCAqcF9tc2cpOworYmNtb3NfZXJybm8gc3dfdXRpbF9mbG93X3NldChmbG93X2luc3QgKnBfZmxvdywgYmFsX3V0aWxfb3Blcl9mbG93IG9wdF90eXBlKTsKK2JjbW9zX2Vycm5vIHN3X3V0aWxfZmxvd19maW5pc2godm9pZCk7CitiY21vc19lcnJubyBzd191dGlsX2ludGVyZmFjZV9zZXQoYWNjX3Rlcm1faW50ZXJmYWNlICpwX2ludGVyZmFjZV9pbnN0LCBiYWxfdXRpbF9vcGVyX2lmIG9wdF90eXBlKTsKK2JjbW9zX2Vycm5vIHN3X3V0aWxfZ3JvdXBfaW5mb192YWxpZGF0ZSh2b2lkICpwX21zZyk7CitiY21vc19lcnJubyBzd191dGlsX2dyb3VwX3NldChncm91cF9pbnN0ICpwX2dyb3VwX2luc3QsIGJhbF91dGlsX29wZXJfZ3JvdXAgb3B0X3R5cGUpOworYmNtb3NfZXJybm8gc3dfdXRpbF9ncm91cF9maW5pc2godm9pZCk7CitiY21vc19lcnJubyBzd191dGlsX2luaXQodm9pZCk7CitiY21vc19lcnJubyBzd191dGlsX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CitiY21vc19lcnJubyBzd191dGlsX2ZpbmlzaCh2b2lkKTsKKworCitiY21vc19lcnJubyBzd191dGlsX3RtX3NjaGVkX3ZhbGlkYXRlKHZvaWQgKnBfbXNnKTsKK2JjbW9zX2Vycm5vIHN3X3V0aWxfdG1fc2NoZWRfc2V0KHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCk7CitiY21vc19lcnJubyBzd191dGlsX3RtX3NjaGVkX2NsZWFyKHRtX3NjaGVkX2luc3QgKnBfdG1fc2NoZWRfaW5zdCk7ICAgCisKK2JjbW9zX2Vycm5vIHN3X3V0aWxfdG1fcXVldWVfdmFsaWRhdGUodm9pZCAqcF9tc2cpOworYmNtb3NfZXJybm8gc3dfdXRpbF90bV9xdWV1ZV9zZXQodG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0KTsKK2JjbW9zX2Vycm5vIHN3X3V0aWxfdG1fcXVldWVfY2xlYXIodG1fcXVldWVfaW5zdCAqcF90bV9xdWV1ZV9pbnN0KTsKKworCisvKiBzd2l0Y2ggdXRpbCBsb2cgaWQgKi8KK2V4dGVybiBkZXZfbG9nX2lkIGxvZ19pZF9zd191dGlsOworCisvKkB9Ki8KKworI2VuZGlmIC8qIF9CQUxfU1dJVENIX1VUSUxfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL01ha2VmaWxlIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTAwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvTWFrZWZpbGUKQEAgLTAsMCArMSw0NiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisjICAKKyMgICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorIyAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyAgCisjICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisjICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisjICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyMgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorIyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyMgIAorIyAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorIyAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisjICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisjICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisjICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyMgICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyMgICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisjICAgICBvZiB0aGUgc29mdHdhcmUuCisjICAKKyMgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorIyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisjICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorIyAgd3JpdHRlbiBjb25zZW50LgorIyAgCisjICA6PgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCQUwgU3dpdGNoIFV0aWwgRFBQICAKK01PRF9OQU1FID0gc3dpdGNoX3V0aWxfZHBwCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSBkZXZfbG9nIHV0aWxzIGJhbF9hcGkgYmFsX2FwcF91dGlscworc3JjcyA9IGJhbF9kcHBfYWNjX3Rlcm0uYyBiYWxfZHBwX2Zsb3cuYyBiYWxfZHBwX2ludGVyZmFjZS5jIGJhbF9kcHBfcW9zLmMgYmFsX2RwcF9xb3NfbWFwLmMgYmFsX2RwcF92c3dpdGNoLmMgYmFsX2RwcF9ncm91cC5jCitFWFRSQV9DRkxBR1MgKz0gLUkkKFNSQ19ESVIpLy4uLy4uLy4uL21haW4gLUkkKFNSQ19ESVIpLy4uCisKK2lmZXEgKCIkKFRFU1RfU1dfVVRJTF9MT09QQkFDSykiLCAieSIpCisJTU9EX0RFRlMgKz0gLURURVNUX1NXX1VUSUxfTE9PUEJBQ0sKK2Vsc2UJCisJTU9EX0RFUFMgKz0gc3dpdGNoX3NkaworZW5kaWYKKworaWZlcSAoIiQoU1dJVENIKSIsICJxYXgiKQorICAgICAgIE1PRF9ERUZTICs9IC1EUUFYX1NXSVRDSAorZW5kaWYKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX2FjY190ZXJtLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9hY2NfdGVybS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQyYTllOTUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9hY2NfdGVybS5jCkBAIC0wLDAgKzEsNjI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorI2lmbmRlZiBURVNUX1NXX1VUSUxfTE9PUEJBQ0sKKworI2luY2x1ZGUgPGJhbF9jb21tb24uaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJhbF9tc2cuaD4KKyNpbmNsdWRlICJiYWxfc3dpdGNoX3V0aWwuaCIKKyNpbmNsdWRlICJiYWxfc3dpdGNoX2FjY190ZXJtLmgiCisjaW5jbHVkZSAiYmFsX2RwcF9hY2NfdGVybS5oIgorI2luY2x1ZGUgImJhbF9kcHBfcW9zLmgiCisjaW5jbHVkZSAiYmFsX2RwcF9xb3NfbWFwLmgiCisKKyNpbmNsdWRlIDxiY20vdHlwZXMuaD4KKyNpbmNsdWRlIDxiY20vcG9ydC5oPgorI2luY2x1ZGUgPGJjbS9yeC5oPiAgIC8qIGZvciBkcHAgcnBjIHJ4IHJlZ2lzdGVyIGNhbGxiYWNrICovCisjaW5jbHVkZSA8YmNtL3N3aXRjaC5oPgorI2luY2x1ZGUgPGJjbS9sMi5oPgorCisvKioKKyAqIEBmaWxlIGJhbF9kcHBfYWNjX3Rlcm0uYworICogQGJyaWVmIEJBTCBTd2l0Y2ggdXRpbCBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgYWNjZXNzIHRlcm1pbmFsIHJlcXVlc3RzIG9uIERVTkUgUEFDS0VUIFBST0NFU1NPUiAKKyAqIEBhZGR0b2dyb3VwIHN3X3V0aWwKKyAqCisgKi8KKworLypAeyovCisgCisgLyogQGJyaWVmIEwyIFRhYmxlIE9wZXJhdGlvbiBDb250cm9sCisgKgorICogVGhpcyByb3V0aW5lIHNldCB0aGUgSFcgTDIgbGVhcm5pbmcgYW5kIGFnaW5nIAorICogCisgKiBAcGFyYW0gdW5pdCAgICBUaGUgZGV2aWNlIGlkCisgKiBAcGFyYW0gZmxhZ3MgICBPcGVyYXRpb24gZmxhZ3MKKyAqICAgICAgICAgICAgICAgIEJDTV9MMl9MRUFSTl9DUFUgICAgMHgyMAorICogICAgICAgICAgICAgICAgQkNNX0wyX0lOR1JFU1NfRElTVCAweDAyCisgKiAgICAgICAgICAgICAgICBCQ01fTDJfSU5HUkVTU19DRU5UIDB4MDEgCisgKiBAcGFyYW0gYWdlX3NlY29uZHMgICBMMiBlbnRyeSBhZ2Ugb3V0IHRpbWUgaW4gc2Vjb25kcworICogQHJldHVybiAgICAgICAgQkNNIGVycm9yIGNvZGUgCisgKi8gICAgCitzdGF0aWMgaW50IHN3X3V0aWxfZHBwX2wyX2VudHJ5X2NvbnRyb2xfc2V0KGludCB1bml0LCBpbnQgZmxhZ3MsIGludCBhZ2Vfc2Vjb25kcykKK3sKKyAgICBpbnQgcnYgPSAwOworCisgICAgcnYgPSBiY21fc3dpdGNoX2NvbnRyb2xfc2V0KHVuaXQsIGJjbVN3aXRjaEwyTGVhcm5Nb2RlLCBmbGFncyk7CisgICAgaWYgKHJ2KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgYmNtX3N3aXRjaF9jb250cm9sX3NldCBmYWlsZWQgcmV0ID0gJWRcbiIsIHJ2KTsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKworICAgIC8qIHNldCBhZ2luZyB0aW1lICovCisgICAgcnYgPSBiY21fbDJfYWdlX3RpbWVyX3NldCh1bml0LCBhZ2Vfc2Vjb25kcyk7CisgICAgaWYgKHJ2KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgYmNtX2wyX2FnZV90aW1lcl9zZXQgZmFpbGVkIHJldCA9ICVkXG4iLCBydik7CisgICAgICAgIHJldHVybiBydjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBTZXQgTDIgdGFibGUgYWdpbmcgdGltZSB0byAlZCBzZWNvbmRzXG4iLCBhZ2Vfc2Vjb25kcyk7IAorICAgIH0KKworICAgIHJldHVybiBydjsKKworfQorCisKKy8qKgorICogQGJyaWVmIEwyIFRhYmxlIGV2ZW50IGhhbmRsZXIKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgYSBjYWxsYmFjayB0cmlnZ2VyZWQgYnkgSFcgTDIgVGFibGUgZXZlbnRzIAorICogCisgKiBAcGFyYW0gdW5pdCAgICAgICAgVGhlIGRldmljZSBpZAorICogQHBhcmFtIHBfbDJhZGRyICAgIFBvaW50ZXIgdG8gdGhlIEwyIGVudHJ5IHdoZXJlIHRoZSBldmVudCBpcyBoYXBwZW4gCisgKiBAcGFyYW0gb3BlcmF0aW9uICAgVGhlIHR5cGUgb2YgZXZlbnQKKyAqIEBwYXJhbSB1c2VyZGF0YSAgICBQb2ludGVyIHRvIGEgdXNlciBwcm92aWRlZCBkYXRhIHdoZW4gdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCAKKyAqLworc3RhdGljIHZvaWQgc3dfdXRpbF9kcHBfbDJfZW50cnlfZXZlbnRfaGFuZGxlcihpbnQgdW5pdCwgYmNtX2wyX2FkZHJfdCAqcF9sMmFkZHIsIGludCBvcGVyYXRpb24sIHZvaWQgKnVzZXJkYXRhKQoreworCisgICAgaWYgKHBfbDJhZGRyID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBMMiBlbnRyeSBjYWxsYmFjayB3aXRoIE5VTEwgTDIgYWRkcmVzcywgb3AgPSAlZFxuIiwgb3BlcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAob3BlcmF0aW9uID09IEJDTV9MMl9DQUxMQkFDS19MRUFSTl9FVkVOVCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zd191dGlsLCAiIEJDTV9MMl9DQUxMQkFDS19MRUFSTl9FVkVOVCBoYW5kbGVyXG4iKTsKKyAgICB9CisgICAgZWxzZSBpZiAob3BlcmF0aW9uID09IEJDTV9MMl9DQUxMQkFDS19NT1ZFX0VWRU5UKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N3X3V0aWwsICIgQkNNX0wyX0NBTExCQUNLX01PVkVfRVZFTlQgaGFuZGxlclxuIik7CisgICAgfQorICAgIGVsc2UgaWYgKG9wZXJhdGlvbiA9PSBCQ01fTDJfQ0FMTEJBQ0tfQUdFX0VWRU5UKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N3X3V0aWwsICIgQkNNX0wyX0NBTExCQUNLX0FHRV9FVkVOVCBoYW5kbGVyXG4iKTsKKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zd191dGlsLCAiIEJDTV9MMl9DQUxMQkFDS19PUEVSQVRJT04gJWQgaGFuZGxlclxuIiwgb3BlcmF0aW9uKTsKKyAgICB9CisgICAgIAorICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zd191dGlsLCAiICAgICBNQUMgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZiAmIHBfbDJhZGRyLT5tYWNbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmYgJiBwX2wyYWRkci0+bWFjWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweGZmICYgcF9sMmFkZHItPm1hY1syXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZiAmIHBfbDJhZGRyLT5tYWNbM10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmYgJiBwX2wyYWRkci0+bWFjWzRdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweGZmICYgcF9sMmFkZHItPm1hY1s1XSkgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYoIShwX2wyYWRkci0+ZmxhZ3MgJiBCQ01fTDJfTUNBU1QpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N3X3V0aWwsICIgICAgIFVDIFZJRD0weCV4fCBQT1JUPTB4JTA4eFxuIiwgcF9sMmFkZHItPnZpZCwgcF9sMmFkZHItPnBvcnQpOworICAgICAgICAvKiBwcmludF9ncG9ydF9wYXJ0IC0gcF9sMmFkZHItPnBvcnQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGEgPSAtMSwgYiA9IDA7CisgICAgICAgICAgICBjaGFyKiB0eXBlID0gIiI7CisgICAgICAgICAgICBpZiAoYT09LTEpeworICAgICAgICAgICAgICAgIGE9QkNNX0dQT1JUX0xPQ0FMX0dFVChwX2wyYWRkci0+cG9ydCk7CisgICAgICAgICAgICAgICAgdHlwZSA9ImxvY2FsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhPT0tMSl7CisgICAgICAgICAgICAgICAgYT1CQ01fR1BPUlRfTU9EUE9SVF9NT0RJRF9HRVQocF9sMmFkZHItPnBvcnQpOworICAgICAgICAgICAgICAgIGI9QkNNX0dQT1JUX01PRFBPUlRfUE9SVF9HRVQocF9sMmFkZHItPnBvcnQpOworICAgICAgICAgICAgICAgIHR5cGUgPSJtb2Rwb3J0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhPT0tMSl7CisgICAgICAgICAgICAgICAgYT1CQ01fR1BPUlRfVFJVTktfR0VUKHBfbDJhZGRyLT5wb3J0KTsKKyAgICAgICAgICAgICAgICB0eXBlID0idHJ1bmsiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGE9PS0xKXsKKyAgICAgICAgICAgICAgICBhPUJDTV9HUE9SVF9NQ0FTVF9HRVQocF9sMmFkZHItPnBvcnQpOworICAgICAgICAgICAgICAgIHR5cGUgPSJtYWN0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhPT0tMSl7CisgICAgICAgICAgICAgICAgYT1CQ01fR1BPUlRfTVBMU19QT1JUX0lEX0dFVChwX2wyYWRkci0+cG9ydCk7CisgICAgICAgICAgICAgICAgdHlwZSA9Im1wbHNfcG9ydCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYT09LTEpeworICAgICAgICAgICAgICAgIGE9QkNNX0dQT1JUX1ZMQU5fUE9SVF9JRF9HRVQocF9sMmFkZHItPnBvcnQpOworICAgICAgICAgICAgICAgIHR5cGUgPSJ2bGFuX3BvcnQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGE9PS0xKXsKKyAgICAgICAgICAgICAgICBhPUJDTV9HUE9SVF9TWVNURU1fUE9SVF9JRF9HRVQocF9sMmFkZHItPnBvcnQpOworICAgICAgICAgICAgICAgIHR5cGUgPSJzeXNfcG9ydCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYT09LTEpeworICAgICAgICAgICAgICAgIGE9QkNNX0dQT1JUX01JUlJPUl9HRVQocF9sMmFkZHItPnBvcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N3X3V0aWwsICIgICAgIEdQT1JUICVzIDwweCV4LCVkPlxuIiwgdHlwZSwgYSwgYik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N3X3V0aWwsICIgICAgIE1DIDB4JTA4eFxuIixwX2wyYWRkci0+bDJtY19ncm91cCk7CisgICAgfQorICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zd191dGlsLCAiICAgICBzdGF0aWMgJWR8XG4iLCAocF9sMmFkZHItPmZsYWdzICYgQkNNX0wyX1NUQVRJQykhPTAgKTsKKyAgICAKK30KKworLyoqCisgKiBAYnJpZWYgQ29ubmVjdCBhY2Nlc3MgdGVybWluYWwgd2l0aCBEUFAgYXMgcGFydCBvZiB0aGUgY29tcG9uZW50cworICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgc3dfdXRpbF9hY2Nlc3NfdGVybWluYWxfY29ubmVjdCBpbiB0aGUgQkFMIGNvcmUKKyAqIHRvIGV4ZWN1dGUgRFBQIHNwZWNpZmljIEFQSSBmb3IgYWNjZXNzX3Rlcm1pbmFsX2Nvbm5lY3QgcmVxdWVzdAorICogCisgKiBAcGFyYW0gcF9uZXRfbWFwICAgIFBvaW50ZXIgdG8gdGhlIG5ldCBwb3J0cyBtYXBwaW5nIGZyb20gbG9naWNhbCBudW1icmVyIHRvIHBoeXNpY2FsIG51bWJlcgorICogQHBhcmFtIHBfcG9uX21hcCAgICBQb2ludGVyIHRvIHRoZSBwb24gcG9ydHMgbWFwcGluZyBmcm9tIGxvZ2ljYWwgbnVtYnJlciB0byBwaHlzaWNhbCBudW1iZXIKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gc3dfdXRpbF9kcHBfYWNjX3Rlcm1fY29ubmVjdChiYWxfc3dhcHBfcG9ydCAqcF9uZXRfbWFwLCBiYWxfc3dhcHBfcG9ydCAqcF9wb25fbWFwICkKK3sKKyAgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICAgaW50ICAgICAgcmMgPSAwOyAKKyAgICAgYmFsX3N3YXBwX3BvcnQgKnBvcnQ7CisgICAgIAorICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIERQUCAtIEdvdCBhIGFjY2VzcyB0ZXJtaW5hbCBDT05ORUNUXG4iKTsKKworICAgICBkbworICAgICB7CisgICAgICAgICAvKiBzZXR1cCB0aGUgZGV2aWNlIElEICAtIFRoaXMgaXMgdmVyeSBoYXJkd2FyZSBzcGVjaWZpYyAqLworICAgICAgICAgcG9ydCA9IHBfbmV0X21hcDsKKyAgICAgICAgIC8qIC0xIGluZGljYXRlIHRoZSBlbmQgb2YgdGFibGUgKi8KKyAgICAgICAgIHdoaWxlKHBvcnQtPnBibV9pZCAhPSAtMSkKKyAgICAgICAgIHsgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgICAgICAgIC8qIHRoZSBkZWZhdWx0IFRQSUQgaXMgMHg4MTAwLCBhZGQgMHg4OGE4IHRvIHRoZSBhbGxvdyBUUElEICovCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgcmMgPSBiY21fcG9ydF90cGlkX2RlbGV0ZV9hbGwocG9ydC0+ZGV2aWNlX2lkLCBwb3J0LT5wYm1faWQpOworICAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgRFBQIC0gZmFpbCB0byBjbGVhciB0aGUgbm5pIFRQSUQgbGlzdCBvbiBpbnRlcmZhY2UgJWRcbiIsIHBvcnQtPnBibV9pZCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsgICAgICAKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcmMgPSBiY21fcG9ydF90cGlkX2FkZChwb3J0LT5kZXZpY2VfaWQsIHBvcnQtPnBibV9pZCwgMHg4MTAwLCAwKTsKKyAgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiIERQUCAtIGZhaWwgdG8gYWRkIDB4ODEwMCB0byB0aGUgbm5pIFRQSUQgbGlzdCBvbiBpbnRlcmZhY2UgJWRcbiIsIHBvcnQtPnBibV9pZCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsgICAgICAgICAgICAKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcmMgPSBiY21fcG9ydF90cGlkX2FkZChwb3J0LT5kZXZpY2VfaWQsIHBvcnQtPnBibV9pZCwgMHg4OGE4LCAwKTsKKyAgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiIERQUCAtIGZhaWwgdG8gYWRkIDB4ODhhOCB0byB0aGUgbm5pIFRQSUQgbGlzdCBvbiBpbnRlcmZhY2UgJWRcbiIsIHBvcnQtPnBibV9pZCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsgICAgICAgICAgICAKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgCisgICAgICAgICAgICAgcG9ydCsrOyAgICAgICAgIAorICAgICAgICAgfSAgICAKKyAgICAgCisgICAgICAgICBwb3J0ID0gcF9wb25fbWFwOworICAgICAgICAgd2hpbGUocG9ydC0+cGJtX2lkICE9IC0xKQorICAgICAgICAgeyAgICAgICAgCisKKyAgICAgICAgICAgICAvKiB0aGUgZGVmYXVsdCBUUElEIGlzIDB4ODEwMCwgYWRkIDB4ODhhOCB0byB0aGUgYWxsb3cgVFBJRCAqLworICAgICAgICAgICAgIAorICAgICAgICAgICAgIHJjID0gYmNtX3BvcnRfdHBpZF9kZWxldGVfYWxsKHBvcnQtPmRldmljZV9pZCwgcG9ydC0+cGJtX2lkKTsKKyAgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiIERQUCAtIGZhaWwgdG8gY2xlYXIgdGhlIHBvbiBUUElEIGxpc3Qgb24gaW50ZXJmYWNlICVkXG4iLCBwb3J0LT5wYm1faWQpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7ICAgICAgCisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHJjID0gYmNtX3BvcnRfdHBpZF9hZGQocG9ydC0+ZGV2aWNlX2lkLCBwb3J0LT5wYm1faWQsIDB4ODEwMCwgMCk7CisgICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBEUFAgLSBmYWlsIHRvIGFkZCAweDgxMDAgdG8gdGhlIHBvbiBUUElEIGxpc3Qgb24gaW50ZXJmYWNlICVkXG4iLCBwb3J0LT5wYm1faWQpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7ICAgICAgICAgICAgCisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHJjID0gYmNtX3BvcnRfdHBpZF9hZGQocG9ydC0+ZGV2aWNlX2lkLCBwb3J0LT5wYm1faWQsIDB4ODhhOCwgMCk7CisgICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBEUFAgLSBmYWlsIHRvIGFkZCAweDg4YTggdG8gdGhlIHBvbiBUUElEIGxpc3Qgb24gaW50ZXJmYWNlICVkXG4iLCBwb3J0LT5wYm1faWQpOyAKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOyAgICAgICAgICAgIAorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICBwb3J0Kys7ICAgICAgICAgCisgICAgICAgICB9IAorICAgICAgICAKKyAgICAgICAgIGlmKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgeworICAgICAgICAgICAgIC8qIGV4aXQgaWYgcG9ydCBpbml0IGZhaWxlZCAqLworICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgIC8qIFJlbW92ZSBhbGwgcG9ydHMgZnJvbSBWTEFOIDEsIHNvIHRoZSBMMiBicm9hZGNhc3Qgd29uJ3Qgc2VuZCB0byBDUFUgcG9ydCBieSBkZWZhdWx0ICovCisgICAgICAgICBiY21fdmxhbl9ncG9ydF9kZWxldGVfYWxsKGJhbF9iY21fZGZ0X2Rldl9nZXQoKSwgMSk7CisgICAgICAgICAKKyAgICAgICAgLyogY29uZmlndXJlIGFsbCBxb3MgbWFwIHRhYmxlcyAqLworICAgICAgICAgcmV0ID0gYmFsX3N3X2RwcF9wY3BfcmVtYXJrX21hcHNfaW5pdChiYWxfYmNtX2RmdF9kZXZfZ2V0KCkpOworICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX3N3X3V0aWwsICIgRFBQIC0gZmFpbCB0byBpbml0IHFvcyBtYXAgdGFibGVzXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAvKiBpbml0IHRoZSBEUyBRT1MgaGllcmFyY2hpY2FsIHNjaGVkdWxpbmcgLSBpZ25vcmUgZXJyb3IgaWYgSFcgZG9zIG5vdCBzdXBwb3J0IFFPUyAqLyAgICAgICAgICAKKyAgICAgICAgIHJldCA9YmFsX3N3X2RwcF9xb3NfaW5pdChiYWxfYmNtX2RmdF9kZXZfZ2V0KCksIGJhbF9iY21faW50Zl9tYXB0YWJsZV9nZXQoKSk7CisgICAgICAgICBpZiAocmV0KQorICAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwgIiBEUFAgLSBmYWlsIHRvIGluaXQgcW9zIEhSIHNjaGVkdWxlclxuIik7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgIH0KKyAgICAgICAgICAgICAKKyAgICAgICAgIHJjID0gYmNtX2wyX2FkZHJfcmVnaXN0ZXIoYmFsX2JjbV9kZnRfZGV2X2dldCgpLCBzd191dGlsX2RwcF9sMl9lbnRyeV9ldmVudF9oYW5kbGVyLCBOVUxMKTsKKyAgICAgICAgIGlmIChyYykKKyAgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX3N3X3V0aWwsICIgRFBQIC0gZmFpbCB0byByZWdpc3RlciBsMl9hZGRyIGNhbGxiYWNrIFxuIik7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgIHJjID0gc3dfdXRpbF9kcHBfbDJfZW50cnlfY29udHJvbF9zZXQoYmFsX2JjbV9kZnRfZGV2X2dldCgpLCBCQ01fTDJfTEVBUk5fQ1BVfEJDTV9MMl9JTkdSRVNTX0RJU1QsIGJhbF9iY21fbDJfYWdlX3RpbWVfZ2V0KCkpOworICAgICAgICAgaWYgKHJjKQorICAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwgIiBEUFAgLSBmYWlsIHRvIHNldCBsMl9hZGRyIGNvbnRyb2wgXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0KKyAgICAgfXdoaWxlKDApOworICAgICByZXR1cm4gcmV0OworfQorCisvKiBpbnRlcm5hbCBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgdHJhcCByZWNlaXZpbmcgdGhyZWFkICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICBpbnQgdWRwX3BvcnQ7CisgICAgcHRocmVhZF90IHRocmVhZGlkOworICAgIGRwcF9yeF9jYl9mIGNhbGxiYWNrOworfSB0cmFwX2NvbnRleHQ7CisKK3N0YXRpYyB0cmFwX2NvbnRleHQgZ190cmFwX2N0eCA9IHswfTsKKworLyogdGhlIGFkanVzdG1lbnQgbmVlZGVkIGZvciBJTkcgdHJhcCBwYWNrZXQgaGVhZGVyICovIAorI2RlZmluZSBERUZBVUxUX1NPUF9BREogICAgMgorI2RlZmluZSBERUZBVUxUX1JFQVNPTl9BREogNAorLyogY29tcGlsZXIgcmVzdGlyY3QgdGhlIHRvdGFsIGxvY2FsIHZhcmlhYmxlcyBzaXplIDwgMTYzODQgKi8KKyNkZWZpbmUgREVGQVVMVF9UUkFQX0JVRl9TSVpFICgxMCAqMTAyNCkgCisvKgorICAgdGhlIGxpc3RlbmVyIHRocmVhZCB0aGF0IHdhaXQgZm9yIHRoZSB0cmFwIHBhY2tldF9pbiBtZXNzYWdlIGZyb20gdGhlIHN3aXRjaAorKi8gICAKK3N0YXRpYyB2b2lkICp0cmFwX3JlY2VpdmUodm9pZCAqcF91c2VyX2RhdGEpCit7CisgICAgaW50IHJjOworICAgIGludCBzVURQU29ja2V0OworICAgIHVuc2lnbmVkIGNoYXIgY0J1ZmZlcltERUZBVUxUX1RSQVBfQlVGX1NJWkVdOworICAgIGludCBuQnl0ZXNSZWN2ID0gMDsKKyAgICBpbnQgbkJ1ZlNpemUgPSBERUZBVUxUX1RSQVBfQlVGX1NJWkU7CisgICAgc29ja2xlbl90IG5SZWNlaXZlQWRkclNpemUgPSAwOworICAgIGludCBtYXhmZDsKKyAgICBmZF9zZXQgcmVhZF9mZHM7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgdWludDE2X3QgdG1wX3NyY19wb3J0LCBzcmNfcG9ydDsKKyAgICB0cmFwX2NvbnRleHQgKnBfdHJhcF9jdHggPSAodHJhcF9jb250ZXh0ICopcF91c2VyX2RhdGE7IAorICAgIHVpbnQzMl90IHRtcF9yZWFzb24sIHJlYXNvbjsKKyAgICAvKiBDcmVhdGUgYSBjb25uZWN0aW9ubGVzcyBzb2NrZXQgKi8KKyAgICBzVURQU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKyAgICAvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHZhbGlkIHNvY2tldCAqLworICAgIGlmKHNVRFBTb2NrZXQgPCAwKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgRFBQIC0gdHJhcF9yZWNlaXZlOmNyZWF0ZSBzb2NrZXQgZmFpbGVkXG4iKTsgCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgICAvLyBTZXR1cCBhIGJpbmQgb24gdGhlIHNvY2tldCwgdGVsbGluZyB1cyB3aGF0IHBvcnQgYW5kCisgICAgIC8vIGFkYXB0ZXIgdG8gcmVjZWl2ZSBkYXRhZ3JhbXMgb24uIAorICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc1JlY2VpdmVGcm9tQWRkcjsKKyAgICAgbWVtc2V0KCZzUmVjZWl2ZUZyb21BZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisKKyAgICAgc1JlY2VpdmVGcm9tQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgc1JlY2VpdmVGcm9tQWRkci5zaW5fcG9ydCA9IGh0b25zKHBfdHJhcF9jdHgtPnVkcF9wb3J0KTsKKyAgICAgc1JlY2VpdmVGcm9tQWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKworICAgICByYyA9IGJpbmQoc1VEUFNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzUmVjZWl2ZUZyb21BZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKyAgICAgaWYgKHJjIDwgMCkKKyAgICAgeyAKKyAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBEUFAgLSB0cmFwX3JlY2VpdmU6YmluZCBmYWlsZWRcbiIpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICB9CisKKyAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBEUFAgLSB0cmFwX3JlY2VpdmUgc3RhcnQgbGlzdGVuIGF0ICVkXG4iLCBwX3RyYXBfY3R4LT51ZHBfcG9ydCk7CisgICAgIAorICAgICAvLyBSZWNlaXZlIGEgZGF0YWdyYW0gZnJvbSBhbm90aGVyIGRldmljZQorICAgICB3aGlsZSgxKQorICAgICB7CisgICAgICAgICAgRkRfWkVSTygmcmVhZF9mZHMpOworICAgICAgICAgIEZEX1NFVChzVURQU29ja2V0LCAmcmVhZF9mZHMpOworICAgICAgICAgIG1heGZkID0gc1VEUFNvY2tldDsKKyAgICAgICAgICAvKiBTZXQgdGhlIHRpbWVvdXQgKi8KKyAgICAgICAgICB0di50dl9zZWMgID0gMzsKKyAgICAgICAgICB0di50dl91c2VjID0gMDsgIC8qICAzIHNlY29uZHMgKi8KKyAgICAgICAgICByYyA9IHNlbGVjdChtYXhmZCArIDEsICZyZWFkX2ZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKworICAgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgeworICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBEUFAgLSB0cmFwX3JlY2VpdmU6c2VsZWN0IGZhaWxlZCBlcnIgPSAlZFxuIiwgcmMpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHJjID09IDApIC8qIHRpbWVvdXQgKi8KKyAgICAgICAgICB7IAorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gR2V0IHRoZSBkYXRhZ3JhbWEKKyAgICAgICAgICBuQnl0ZXNSZWN2ID0gcmVjdmZyb20oc1VEUFNvY2tldCwgY0J1ZmZlciwgbkJ1ZlNpemUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNSZWNlaXZlRnJvbUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuUmVjZWl2ZUFkZHJTaXplKTsKKyAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBEUFAgLSBHb3QgJWQgYnl0ZXMgbWVzc2FnZSBcbiIsIG5CeXRlc1JlY3YpOworCisgICAgICAgICAgLyogdGhlIGZpcnN0IDQgYnl0ZXMgYXJlIHJlYXNvbiAqLyAKKyAgICAgICAgICAvKiBjb21waWxlciAgZ2VuZXJhdGUgY2FzdC1hbGlnbiB3YXJuaW5nIC0+IHBfcmVhc29uID0gKHVpbnQzMl90ICopKGNCdWZmZXIpOyAqLworICAgICAgICAgIG1lbWNweSgmdG1wX3JlYXNvbiwgY0J1ZmZlciwgc2l6ZW9mKHVpbnQzMl90KSApOworICAgICAgICAgIHJlYXNvbiA9IG50b2hsKHRtcF9yZWFzb24pOworICAgICAgICAgIC8qIHRoZSBuZXh0IDIgYnl0ZXMgYXJlIHNyb3VjZSBwb3J0ICovCisgICAgICAgICAgLyogY29tcGlsZXIgZ2VuZXJhdGUgY2FzdC1hbGlnbiB3YXJuaW5nIC0+IHBfc3JjX3BvcnQgPSAodWludDE2ICopKGNCdWZmZXIgKyBERUZBVUxUX1JFQVNPTl9BREopOyAqLworICAgICAgICAgIG1lbWNweSgmdG1wX3NyY19wb3J0LCBjQnVmZmVyICsgREVGQVVMVF9SRUFTT05fQURKLCBzaXplb2YodWludDE2X3QpKTsgICAgICAgIAorICAgICAgICAgIHNyY19wb3J0ID0gbnRvaHModG1wX3NyY19wb3J0KTsKKworICAgICAgICAgIC8qIGNhbGwgdGhlIHJlZ2lzdGVyIGNhbGxiYWNrIGhlcmUgLSBzZXQgdW5pdCB0byAwIGFzIGl0IGlzIGRvbid0IGNhcmUgKi8KKyAgICAgICAgICBpZihwX3RyYXBfY3R4LT5jYWxsYmFjaykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHBfdHJhcF9jdHgtPmNhbGxiYWNrKDAsIHNyY19wb3J0LCByZWFzb24sIGNCdWZmZXIrREVGQVVMVF9TT1BfQURKK0RFRkFVTFRfUkVBU09OX0FESiwgbkJ5dGVzUmVjdi1ERUZBVUxUX1NPUF9BREotREVGQVVMVF9SRUFTT05fQURKKTsKKyAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGNsb3NlKHNVRFBTb2NrZXQpOworCisgICAgICAgcmV0dXJuIE5VTEw7IAorfQorCisvKioKKyAqIEBicmllZiBTdGFydCBhIHJlY2VpdmluZyB0aHJlYWQgYW5kIGFkZCB0aGUgY2FsbGJjayB0byBwcm9jZXNzIENQVSB0cmFwcGVkIHBhY2tldHMgIAorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgc3dfdXRpbF9hY2Nlc3NfdGVybWluYWxfY29ubmVjdCBpbiB0aGUgQkFMIGNvcmUKKyAqIHRvIGV4ZWN1dGUgRFBQIHNwZWNpZmljIEFQSSBmb3IgcHJvY2VzcyB0aGUgdHJhcHBpbmcgcGFja2V0cworICogCisgKiBAcGFyYW0gdW5pdCAgIHRoZSBzd2l0Y2ggZGV2aWNlIG51bWJlciB0aGUgY2FsbGJhY2sgYXBwbGllZCAKKyAqIEBwYXJhbSBjYl9mICAgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHByb2Nlc3MgdGhlIHRyYXBwZWQgcGFja2V0cyAKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gc3dfdXRpbF9kcHBfcnhfY2JfcmVnaXN0ZXIodWludDMyX3QgdW5pdCwgZHBwX3J4X2NiX2YgY2JfZikKK3sKKyAgICBpbnQgcmV0OworICAgIAorICAgIC8qIGlmIHRoZSByZWNlaXZpbmcgdGhyZWFkIGFscmVhZHkgc3RhcnRlZCwgcmV0dXJuIGVycm9yICovCisgICAgaWYgKGdfdHJhcF9jdHgudGhyZWFkaWQpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIiBEUFAgLSBUaGVyZSBpcyBhbiBleGlzdGluZyB0cmFwIHJlY2VpdmluZyB0aHJlYWRcbiIpOyAKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7ICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBnX3RyYXBfY3R4LnVkcF9wb3J0ID0gYmFsX2JjbV90cmFwX3Jjdl9wb3J0X2dldCgpOworICAgIGdfdHJhcF9jdHguY2FsbGJhY2sgPSBjYl9mOworICAgIAorICAgIC8qIHVzZSBkZWZhdWx0IGF0dHJpYnV0ZSB0byBjcmVhdGUgdGhlIHRocmVhZCAqLworICAgIHJldCA9IHB0aHJlYWRfY3JlYXRlKCZnX3RyYXBfY3R4LnRocmVhZGlkLCBOVUxMLCAmdHJhcF9yZWNlaXZlLCAmZ190cmFwX2N0eCk7CisgICAgCisgICAgaWYocmV0KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgRFBQIC0gZmFpbCB0byBjcmVhdGUgdHJhcCByZWNlaXZpbmcgdGhyZWFkIC0gJWRcbiIsIHJldCk7IAorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsgICAgIAorICAgIH0KKyAgICAKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogVG8gbWFrZSBjb21waWxlciBoYXBweSB3aGVuIGJ1aWxkIHdpdGggRVNXIHN3aXRjaCBvbmx5ICovCisjaWZkZWYgRVNXX1NXSVRDSAordm9pZCBkcHBfZGZ0X3J4X2NiKGludCB1bml0LCBpbnQgZHN0X3BvcnQsIGludCByZWFzb24sIHVuc2lnbmVkIGNoYXIgKnBheWxvYWQsIGludCBwYXlsb2FkX2xlbikKK3sgCisgICAgcmV0dXJuOworfQorI2Vsc2UKK2V4dGVybiB2b2lkIGRwcF9kZnRfcnhfY2IoaW50IHVuaXQsIGludCBkc3RfcG9ydCwgaW50IHJlYXNvbiwgdW5zaWduZWQgY2hhciAqcGF5bG9hZCwgaW50IHBheWxvYWRfbGVuKTsKKyNlbmRpZgorCisjZGVmaW5lIEwyX0hFQURFUl9TSVpFICAgICAgICAgICAgICAgICAgICgxMikgLyogYnl0ZXMgKi8KKworI2RlZmluZSBUVU5ORUxfVEFHX1RQSURfTEVOICAgICAgICAgICAgICAoMikgIC8qIGJ5dGVzIC0gVFBJRCAoMiBieXRlcykgKi8KKyNkZWZpbmUgVFVOTkVMX1RBR19QQklUU19DRklfVkxBTl9JRF9MRU4gKDIpICAvKiBQQklUUytDRkkrVkxBTiBJRCAoMiBieXRlcykgKi8KKyNkZWZpbmUgVFVOTkVMX1RBR19TSVpFICAgICAgICAgICAgICAgICAgKFRVTk5FTF9UQUdfVFBJRF9MRU4gKyBUVU5ORUxfVEFHX1BCSVRTX0NGSV9WTEFOX0lEX0xFTikgCisKK2JjbW9zX2Vycm5vIHN3X3V0aWxfZHBwX3BrdF9zZW5kKGludCB0YXJnZXRfcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwX3VzZXJfcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZXJfcGt0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYXBfdGFyZ2V0IHRhcmdldF9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0X3R1bm5lbF9pZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGNoYXIgKnBfcGt0b3V0X21zZzsgCisgICAgdWludDhfdCBkc3RfcG9ydF9pZDsKKyAgICBpbnQgZHN0X2RldmljZV9pZDsKKyAgICBjaGFyICpwX3BrdG91dF9wdHI7CisgICAgdWludDMyX3QgdG90YWxfbXNnX3NpemU7ICAgCisgICAgdWludDMyX3QgdWludDMyX251bTsKKyAgICB1aW50MTZfdCB1aW50MTZfbnVtOyAgICAKKworICAgLyoKKyAgICAqIEFsbG9jYXRlIGEgbWVzc2FnZSB0byBiZSBzZW50IHRvIHRoZSBiY20udXNlciBpbnN0YW5jZS4gIFRoaXMgd2lsbCBjb250YWluCisgICAgKiB0aGUgcGFja2V0IHRvIGJlIHNlbnQgb3V0IG9mIHRoZSBzd2l0Y2gsIGFzIHdlbGwgaGFzIGhlYWRlciBtZXRhZGF0YS4KKyAgICAqLworICAgIHBfcGt0b3V0X21zZyA9IGJjbW9zX2NhbGxvYyh1c2VyX3BrdF9sZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1NPUF9BREogKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1JFQVNPTl9BREogKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVU5ORUxfVEFHX1NJWkUpOworCisgICAgaWYoTlVMTCA9PSBwX3BrdG91dF9tc2cpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICAvKiB0cmFuc2xhdGUgdGhlIG91dHB1dCBwb3J0IHRvIHRoZSBiY20udXNlcidzIG1hcHBpbmcgKi8KKyAgICBzd2l0Y2gocmVhc29uKQorICAgIHsgICAKKyAgICAgICAgY2FzZSBSRUFTT05fU0VORF9UT19OTkk6CisgICAgICAgICAgICBkc3RfcG9ydF9pZCA9IGJhbF9iY21fbmV0X2luZl9wYm1fZ2V0KHRhcmdldF9wb3J0X2lkKTsKKyAgICAgICAgICAgIGRzdF9kZXZpY2VfaWQgPSBiYWxfYmNtX25ldF9pbmZfZGV2X2dldCh0YXJnZXRfcG9ydF9pZCk7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFQVNPTl9TRU5EX1RPX1BPTjoKKyAgICAgICAgICAgIGRzdF9wb3J0X2lkID0gYmFsX2JjbV9wb25faW5mX3BibV9nZXQodGFyZ2V0X3BvcnRfaWQpOworICAgICAgICAgICAgZHN0X2RldmljZV9pZCA9IGJhbF9iY21fcG9uX2luZl9kZXZfZ2V0KHRhcmdldF9wb3J0X2lkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICBicmVhazsgICAgICAgICAgCisgICAgfQorICAKKyAgICAvKiBGb3JtYXQgb2YgdGhlIG1lc3NhZ2UgdG8gdGhlIGJjbS51c2VyIGluc3RhbmNlIGlzOgorICAgICAqCisgICAgICogcmVhc29uIGNvZGU6IDQgYnl0ZXMKKyAgICAgKiBkc3RfcG9ydDogMiBieXRlcworICAgICAqIHVzZXIgcGFja2V0OiBwa3Rfc2l6ZSBieXRlcworICAgICAqLworCisgICAgLyogSW5zZXJ0IHRoZSA0IGJ5dGVzIHdpdGggcmVhc29uIGNvZGUgKi8KKyAgICB1aW50MzJfbnVtID0gKGh0b25sKHJlYXNvbikpOworICAgIG1lbWNweShwX3BrdG91dF9tc2csICZ1aW50MzJfbnVtLCBzaXplb2YodWludDMyX251bSkpOworCisgICAgLyogUmVwbGFjZSAyIGJ5dGVzIHdpdGggcGFja2V0X291dCBkZXN0aW5hdGlvbiBwb3J0IGluZm8uICBUaGlzIGlzIHRoZSBiY20udXNlcidzCisgICAgICogbWFwcGluZyBvZiBvdXRwdXQgcG9ydCAoTk5JIG9yIFBPTikgdG8gQkNNIFNESyBwb3J0IG1hcHBpbmcgKi8KKyAgICB1aW50MTZfbnVtID0gaHRvbnMoZHN0X3BvcnRfaWQgJiAweGZmKTsgLyogZHN0X3BvcnQgY29udGVudHMgaXMgYWN0dWFsbHkgb25seSAxIGJ5dGUgKi8KKyAgICBtZW1jcHkoJnBfcGt0b3V0X21zZ1tERUZBVUxUX1JFQVNPTl9BREpdLCAmdWludDE2X251bSwgc2l6ZW9mKHVpbnQxNl9udW0pKTsKKworICAgIC8qIENvcHkgaW4gdGhlIHVzZXIgcGFja2V0IHRvIHNlbmQgdG8gdGhlIGJjbS51c2VyIGZvciB0cmFuc21pc3Npb24gb3V0IG9mIHRoZSBzd2l0Y2guCisgICAgICogUmVtZW1iZXIgdG8gaW5zZXJ0IHRoZSBwcm9wZXIgdHVubmVsIHRhZyBpbiB0aGUgbWVzc2FnZSBmb3Igb3V0X3BvcnRzIHRoYXQgYXJlCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBQT04KKyAgICAgKi8KKyAgICBwX3BrdG91dF9wdHIgPSBwX3BrdG91dF9tc2cgKyBERUZBVUxUX1JFQVNPTl9BREogKyBERUZBVUxUX1NPUF9BREo7CisgICAgdG90YWxfbXNnX3NpemUgPSB1c2VyX3BrdF9sZW4gKyBERUZBVUxUX1JFQVNPTl9BREogKyBERUZBVUxUX1NPUF9BREo7CisgIAorICAgIGlmKHJlYXNvbiA9PSBSRUFTT05fU0VORF9UT19OTkkpCisgICAgeworICAgICAgICAvKiBDb3B5IGluIHRoZSBlbnRpcmUgcGFja2V0IGFzLWlzICovCisgICAgICAgIG1lbWNweShwX3BrdG91dF9wdHIsIHBfdXNlcl9wa3QsIHVzZXJfcGt0X2xlbik7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgICAgIAorICAgICAgICB1aW50MTZfdCBwa3RvdXRfb2Zmc2V0ID0gMDsKKworICAgICAgICAvKiBDb3B5IGluIHRoZSBMMiBoZWFkZXIgKE1BQyBEQS9TQSkgKi8KKyAgICAgICAgbWVtY3B5KCZwX3BrdG91dF9wdHJbcGt0b3V0X29mZnNldF0sIHBfdXNlcl9wa3QsIEwyX0hFQURFUl9TSVpFKTsKKworICAgICAgICAvKiBQb2ludCB0byB0aGUgdHVubmVsIHRhZyBhcmVhIGluIHRoZSBvdXRnb2luZyBtZXNzYWdlICovCisgICAgICAgIHBrdG91dF9vZmZzZXQgKz0gTDJfSEVBREVSX1NJWkU7CisKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBUUElEIGluIHRoZSB0YWcgZm9yIHRoZSBvdXRwdXQgZGVzdGluYXRpb24gKi8KKyAgICAgICAgdWludDE2X251bSA9IGh0b25zKDB4ODEwMCk7CisgICAgICAgIG1lbWNweSgmcF9wa3RvdXRfcHRyW3BrdG91dF9vZmZzZXRdLCAmdWludDE2X251bSwgc2l6ZW9mKHVpbnQxNl9udW0pKTsKKworICAgICAgICAvKiBQb2ludCB0byB0aGUgcmVtYWluZGVyIG9mIHRoZSBvdXRnb2luZyBtZXNzYWdlICovCisgICAgICAgIHBrdG91dF9vZmZzZXQgKz0gVFVOTkVMX1RBR19UUElEX0xFTjsKKyAgICAgICAgLyogSW5zZXJ0IHRoZSB0dW5uZWwgdGFnIHZsYW4gSUQgZm9yIHRoZSBvdXRwdXQgZGVzdGluYXRpb24gKi8KKyAgICAgICAgdWludDE2X251bSA9IGh0b25zKHRhcmdldF90dW5uZWxfaWQpOworICAgICAgICBtZW1jcHkoJnBfcGt0b3V0X3B0cltwa3RvdXRfb2Zmc2V0XSwgJnVpbnQxNl9udW0sIHNpemVvZih1aW50MTZfbnVtKSk7CisKKyAgICAgICAgLyogUG9pbnQgdG8gdGhlIHJlbWFpbmRlciBvZiB0aGUgb3V0Z29pbmcgbWVzc2FnZSAqLworICAgICAgICBwa3RvdXRfb2Zmc2V0ICs9IFRVTk5FTF9UQUdfUEJJVFNfQ0ZJX1ZMQU5fSURfTEVOOworCisgICAgICAgIC8qIENvcHkgaW4gdGhlIHJlc3Qgb2YgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgbWVtY3B5KCZwX3BrdG91dF9wdHJbcGt0b3V0X29mZnNldF0sCisgICAgICAgICAgICAgICAocF91c2VyX3BrdCArIEwyX0hFQURFUl9TSVpFKSwKKyAgICAgICAgICAgICAgICh1c2VyX3BrdF9sZW4gLSBMMl9IRUFERVJfU0laRSkpOworCisgICAgICAgIHRvdGFsX21zZ19zaXplICs9IFRVTk5FTF9UQUdfU0laRTsKKyAgICB9CisKKworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zd191dGlsLCAiUGFja2V0IHNlbmQgKHVzZXIgcGt0X3NpemU6JWQpIGRlc3RpbmVkIGZvciAlcyBwb3J0ICVkXG4iLAorICAgICAgICAgICAgdXNlcl9wa3RfbGVuLAorICAgICAgICAgICAgKHJlYXNvbiA9PSBSRUFTT05fU0VORF9UT19QT04pID8gIlBPTiIgOiAiTk5JIiwKKyAgICAgICAgICAgIGRzdF9wb3J0X2lkKTsKKworICAgIGlmKHJlYXNvbiA9PSBSRUFTT05fU0VORF9UT19QT04pCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3dfdXRpbCwgIlNlbmRpbmcgdmlhIEdFTSAlZFxuIiwgdGFyZ2V0X3R1bm5lbF9pZCk7CisgICAgfQorCisgICAgaWYgKGJhbF9iY21fdXNlX3JwY19nZXQoKSkgCisgICAgeworICAgICAgICAvKiBPbiBzeXN0ZW1zIHdoZXJlIEJBTCBydW5zIHJlbW90ZWx5IGZyb20gdGhlIHN3aXRjaCBoYXJkd2FyZSwgd2UKKyAgICAgICAgICogc2VuZCB0aGUgcGFja2V0IG91dCBtZXNzYWdlIHRvIHRoZSByZW1vdGUgYmNtLnVzZXIgcHJvY2Vzcy4gIAorICAgICAgICAgKiBUaGF0IHByb2Nlc3MgdGhlbiBzZW5kcyB0aGUgYXR0YWNoZWQgdXNlciBwYWNrZXQgdG8gdGhlIHNwZWNpZmllZCBzd2l0Y2ggcG9ydC4KKyAgICAgICAgICovCisKKyAgICAgICAgc2VuZHRvKHRhcmdldF9kZXZpY2Uuc29ja2V0LAorICAgICAgICAgICAgICAgcF9wa3RvdXRfbXNnLAorICAgICAgICAgICAgICAgdG90YWxfbXNnX3NpemUsIDAsCisgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopICYodGFyZ2V0X2RldmljZS5hZGRyKSwKKyAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBPbiBzeXN0ZW1zIHdoZXJlIEJBTCBydW5zIG9uIHRoZSBDUFUgY28tbG9jYXRlZCB3aXRoIHRoZSBzd2l0Y2ggaGFyZHdhcmUsCisgICAgICAgICAqIHdlIHNlbmQgdGhlIGF0dGFjaGVkIHVzZXIgcGFja2V0IHRvIHRoZSBzcGVjaWZpZWQgc3dpdGNoIHBvcnQgZGlyZWN0bHkuCisgICAgICAgICAqLworCisgICAgICAgIHRvdGFsX21zZ19zaXplID0gdG90YWxfbXNnX3NpemUgLSAoIERFRkFVTFRfUkVBU09OX0FESiArIERFRkFVTFRfU09QX0FESiApOworICAgICAgICBkcHBfZGZ0X3R4X2NiKGRzdF9kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgZHN0X3BvcnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopcF9wa3RvdXRfcHRyLAorICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX21zZ19zaXplKTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKHBfcGt0b3V0X21zZyk7CisKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiQ1BVIHBhY2tldCBtc2cgc2VudCB0byBiY20udXNlciBmb3IgcGFja2V0IHdpdGggbXNnIHNpemUgb2YgJWQgKHBheWxvYWQgc2l6ZTogJWQpXG4iLAorICAgICAgICAgICAgdG90YWxfbXNnX3NpemUsIHVzZXJfcGt0X2xlbik7CisgIAorICAgIHJldHVybiByZXQ7Cit9CisKKy8qQH0qLworI2VuZGlmIC8qICNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9hY2NfdGVybS5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfYWNjX3Rlcm0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZjcxNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfYWNjX3Rlcm0uaApAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfZHBwX2FjY190ZXJtLmgKKyAqCisgKiBAYnJpZWYgYmFsIHN3aXRjaCB1dGlsIGFjY2VzcyB0ZXJtaW5hbCBzZXJ2aWNlIGZ1bmN0aW9uIGhlYWRlciBmaWxlIGZvciBEVU5FIFBBQ0tFVCBQUk9DRVNTT1IKKyAqCisgKiBAYWRkdG9ncm91cCBzd191dGlsCisgKi8KKyAKKyNpZm5kZWYgIF9CQUxfRFBQX0FDQ19URVJNX0hfCisjZGVmaW5lICBfQkFMX0RQUF9BQ0NfVEVSTV9IXworCisvKkB7Ki8KKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfdXRpbC5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfYWNjX3Rlcm0uaCIKKworZXh0ZXJuIGJjbW9zX2Vycm5vIHN3X3V0aWxfZHBwX2FjY190ZXJtX2Nvbm5lY3QoYmFsX3N3YXBwX3BvcnQgKnBfbmV0X21hcCwgYmFsX3N3YXBwX3BvcnQgKnBfcG9uX21hcCk7CisKKyNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLCisjaW5jbHVkZSA8YmNtL3J4Lmg+ICAgLyogZm9yIGRwcCBycGMgcnggcmVnaXN0ZXIgY2FsbGJhY2sgKi8KK2V4dGVybiBiY21vc19lcnJubyBzd191dGlsX2RwcF9yeF9jYl9yZWdpc3Rlcih1aW50MzJfdCB1bml0LCBkcHBfcnhfY2JfZiBjYl9mKTsKKworYmNtb3NfZXJybm8gc3dfdXRpbF9kcHBfcGt0X3NlbmQoaW50IGRzdF9wb3J0X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGF5bG9hZF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFwX3RhcmdldCB0YXJnZXRfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldF90dW5uZWxfaWQpOworI2VuZGlmIC8qIFRFU1RfU1dfVVRJTF9MT09QQkFDSyAqLworLypAfSovCisgCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX2Zsb3cuYyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX2Zsb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZjgwNjdjCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfZmxvdy5jCkBAIC0wLDAgKzEsMjYxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX2RwcF9mbG93LmMKKyAqIEBicmllZiBCQUwgU3dpdGNoIHV0aWwgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGZsb3cgcmVxdWVzdHMKKyAqIEBhZGR0b2dyb3VwIHN3X3V0aWwKKyAqLworIAorIC8qQHsqLworI2luY2x1ZGUgPGJhbF9jb21tb24uaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJhbF9tc2cuaD4KKyNpbmNsdWRlIDxiYWxfdXRpbHNfbXNnLmg+CisjaW5jbHVkZSAiYmFsX3N3aXRjaF9mbG93LmgiCisjaW5jbHVkZSAiZmxvd19mc20uaCIKKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfdXRpbC5oIgorI2luY2x1ZGUgImJhbF9kcHBfcW9zX21hcC5oIgorCisjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSworI2RlZmluZSBfU0hSX1BCTVBfV0lEVEggNTY3ICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggdGhlIFdJRFRIIHNpemUgb2YgYmNtX2ZpZWxkX2dyb3VwX2NvbmZpZ190IGluIGJjbS9maWVsZC5oIHdpdGggQVJBRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBidWlsZCBzd2ljaF91dGlsIHdpdGhvdXQgI2RlZmluZSBjcmVhdGVkIGJ5IHRoZSBzZGsgbWFrZS9NYWtlLmxvY2FsICovICAKKyNpbmNsdWRlIDxiY20vdHlwZXMuaD4KKyNpbmNsdWRlIDxzYWwvY29yZS9saWJjLmg+CisjaWZuZGVmIHNhbF9tZW1zZXQKKyNkZWZpbmUgc2FsX21lbXNldCBtZW1zZXQKKyNlbmRpZgorI2luY2x1ZGUgPGJjbS9wb3J0Lmg+CisjaW5jbHVkZSA8YmNtL3ZsYW4uaD4KKyNpbmNsdWRlIDxiY20vZmllbGQuaD4KKyNpbmNsdWRlIDxiY20vZXJyb3IuaD4KKyNpbmNsdWRlIDxiY20vdnN3aXRjaC5oPgorI2luY2x1ZGUgPGJjbS9xb3MuaD4KKyNpbmNsdWRlIDxiY20vbDIuaD4KKworI2luY2x1ZGUgImJhbF9zd2l0Y2hfYWNjX3Rlcm0uaCIKKyNpbmNsdWRlICJiYWxfZHBwX2Zsb3cuaCIKKyNpbmNsdWRlICJiYWxfZHBwX3Fvcy5oIgorI2luY2x1ZGUgImJhbF9kcHBfdnN3aXRjaC5oIgorI2luY2x1ZGUgImJhbF9kcHBfZ3JvdXAuaCIKKworLyoqIExvY2FsIHJvdXRpbmVzIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9zd191dGlsX3JldmVyc2VfZmxvd19jcmVhdGUoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3csIGJjbWJhbF9mbG93X2NmZyAqcF9mbG93X3Jldik7CitzdGF0aWMgYmNtb3NfYm9vbCBiYWxfc3dfdXRpbF9pc19zeW1tZXRyeV9mbG93cyhiY21iYWxfZmxvd19jZmcgKnBfZmxvdywgYmNtYmFsX2Zsb3dfY2ZnICpwX3JlZl9mbG93KTsKKworLyogcGVyZm9ybSBpbml0aWFsaXphdGlvbiBiZWZvcmUgYW55IGRwcCBmbG93IGZ1bmN0aW9uIGNhbGxzICovCit2b2lkIGJhbF9zd191dGlsX2RwcF9mbG93X2luaXQodm9pZCkKK3sKKyAgIC8qIG5vdGhpbmcgdG8gZG8gaGVyZSB5ZXQsIHBsYWNlIGhvbGRlciAqLyAKKyAgIHJldHVybjsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIGNyZWF0ZSB0cmFwIGdwb3J0IGZ1bmN0aW9uIGNyZWF0ZSBhIHRyYXAgcG9ydCB0aGF0IGFsbG93IFRSQVAgYWN0aW9uIHRvCisgKiAgICAgICAgYXNzb2NpYXRlIHdpdGggYW5kIHBlcmZvcm0gcGFja2V0IHRyYXBwaW5nIHRvIHRoZSBDUFUgcG9ydC4KKyAqIAorICogQHBhcmFtIHVuaXQgICAgICAgICAgdGhlIHN3aXRjaCB1bml0IHRoaXMgdHJhcCBwb3J0IHRvIGJlIGNyZWF0ZWQKKyAqIEBwYXJhbSBwX3RyYXBfZ3BvcnQgIGEgcG9pbnRlciB0aGF0IHRoZSBjcmVhdGVkIGdwb3J0IHdpbGwgYmUgcmV0dXJuICAKKyAqIEBwYXJhbSBwX3RyYXBfY29kZSAgIGEgcG9pbnRlciB0aGF0IHRoZSBjcmVhdGVkIHRyYXAgY29kZSB3aWxsIGJlIHJldHVybiAgCisgKiBAcmV0dXJuIGJjbSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYmFsX3N3X3V0aWxfY3JlYXRlX3RyYXBfZ3BvcnQoaW50IHVuaXQsIGJjbV9ncG9ydF90ICpwX3RyYXBfZ3BvcnQsIHVpbnQzMl90ICpwX3RyYXBfY29kZSkKK3sKKyAgICBpbnQgcmV0LCB0cmFwX2lkOworICAgIGJjbV9yeF90cmFwX2NvbmZpZ190IHRyYXBfY29uZmlnOworICAgIAorICAgIHJldCA9IGJjbV9yeF90cmFwX3R5cGVfY3JlYXRlKHVuaXQsIDAsIGJjbVJ4VHJhcFVzZXJEZWZpbmUsICZ0cmFwX2lkKTsKKyAgICBpZihyZXQgIT0gQkNNX0VfTk9ORSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiY3JlYXRlIHRyYXAgdHlwZSByZXR1cm4gJWRcbiIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIAorICAgIGJjbV9yeF90cmFwX2NvbmZpZ190X2luaXQoJnRyYXBfY29uZmlnKTsKKyAgICB0cmFwX2NvbmZpZy5mbGFncyA9IChCQ01fUlhfVFJBUF9VUERBVEVfREVTVCB8IEJDTV9SWF9UUkFQX1RSQVAgfCBCQ01fUlhfVFJBUF9SRVBMQUNFKTsKKyAgICB0cmFwX2NvbmZpZy50cmFwX3N0cmVuZ3RoID0gMDsKKyAgICB0cmFwX2NvbmZpZy5kZXN0X3BvcnQgPSBCQ01fR1BPUlRfTE9DQUxfQ1BVOworICAgIHJldCA9IGJjbV9yeF90cmFwX3NldCh1bml0LCB0cmFwX2lkLCAmdHJhcF9jb25maWcpOworICAgIGlmKHJldCAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJzZXQgcnggdHJhcCByZXR1cm4gJWRcbiIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIEJDTV9HUE9SVF9UUkFQX1NFVCgqcF90cmFwX2dwb3J0LCB0cmFwX2lkLCA3IC8qIHRyYXBfc3RyZW5ndGggKi8sIDApOyAKKyAgICAqcF90cmFwX2NvZGUgPSB0cmFwX2lkOyAgICAKKyAgICByZXR1cm4gcmV0OyAgICAKK30KKy8qIGRpc2FibGUgdGhlIGZpZWxkIGdyb3VwIChGRykgc291cmNlIGlwIHN1cHBvcnQgdG8gcmVzdHJpY3QgdGhlIEZHIHNpemUgKi8gCisjZGVmaW5lIEJBTF9BQ0xfRkdfU1JDX0lQX0VOQUJMRSAwCisvKiBjcmVhdGUgYSBkZWZhdWx0IGZpZWxkIGdyb3VwIHRoYXQgdXNlZCBieSBhbGwgZGVmYXVsdCBBQ0wuIAorICAgV2hlbiBhIEZMT1cgaXMgY3JlYXRlZCxhIExJRiBpcyBjcmVhdGVkIHRvIGRpcmVjdCB0aGUgcGFja2V0cyB0byBhIFZTd2l0Y2guCisgICBUaGUgTElGIGNhbiBvbmx5IG1hdGNoIHBhY2tldCB3aXRoIGluZ3Jlc3MgcG9ydCBhbmQgVklELgorICAgSWYgYSBGTE9XIG5lZWRzIHRvIGJlIGNsYXNzaWZpZWQgd2l0aCBtb3JlIGF0dHJpYnV0ZXMsIGFuIEFDTCBpcyBjcmVhdGVkIHRvIG92ZXJyaWRlIHRoZSBMSUYuCisgICBBIGRlZmF1bHQgQUNMIGhhcyB0aGUgc2FtZSBwYWNrZXQgY2xhc3NpZmljYXRpb24gYXMgdGhlIExJRiBidXQgaGFzIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIG92ZXJsYXBwZWQgQUNMLgorICAgVGhlIGRlZmF1bHQgQUNMIGRyb3BwZWQgcGFja2V0cyB0aGF0IG1hdGNoIHRoZSBMSUYgYnV0IGRvIG5vdCBtYXRjaCB0aGUgQUNMLiBUaGlzIGVuZm9yY2UgdGhlIEZMT1cKKyAgIHRvIG9ubHkgZm9yd2FyZCBwYWNrZXRzIHdpdGggZXhhY3QgbWF0Y2ggKi8KK3N0YXRpYyBiY21fZmllbGRfZ3JvdXBfdCBkcHBfZGZ0X2dyb3VwX2lkID0gMTsKKy8qIGNyZWF0ZSBhIGZpZWxkIGdyb3VwIHRoYXQgdXNlZCBieSBhbGwgQUNMICovCitzdGF0aWMgYmNtX2ZpZWxkX2dyb3VwX3QgZHBwX2dyb3VwX2lkID0gMDsKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhIGZpZWxkIGdyb3VwIGluIHRoZSBzd2l0Y2ggSUNBUCwgCisgKiAgICAgICAgVGhlIGZpZWxkIGdyb3VwIGFsbG93IGZsb3cgY2xhc3NpZmllciB0byBjcmVhdGUgQUNMIHJ1bGVzCisgKiAKKyAqIEBwYXJhbSB1bml0ICAgIHRoZSBzd2l0Y2ggdW5pdCB0aGlzIHJ1bGUgaXMgdG8gYmUgYWRkZWQKKyAqIEBwYXJhbSBwX2dyb3VwX2lkICBhIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0aGF0IHJldHVybiB0aGUgY3JlYXRlZCBncm91cCBpZCAgCisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyAqLworIHN0YXRpYyBiY21vc19lcnJubyBiYWxfc3dfdXRpbF9kcHBfZmdfY3JlYXRlKGludCB1bml0LCBiY21fZmllbGRfZ3JvdXBfdCAqcF9ncm91cF9pZCkKKyB7CisgICAgYmNtX2ZpZWxkX2dyb3VwX3N0YXR1c190IGZnX3N0YXR1czsgICAgCisgICAgYmNtX2ZpZWxkX2dyb3VwX2NvbmZpZ190IGdycDsgCisgICAgaW50MzJfdCByZXQgPSAwOworICAgIAorICAgIC8qIFZDQVAgLSBiY21GaWVsZFF1YWxpZnlTdGFnZUxvb2t1cCwgSUNBUCAtIGJjbUZpZWxkUXVhbGlmeVN0YWdlSW5ncmVzcywgRUNBUCAtIGJjbUZpZWxkUXVhbGlmeVN0YWdlRWdyZXNzICovCisgICAgLyogVGhlIERQUCByZXNvdXJjZXMgYWxsb3cgb25seSBsaW1pdCBudW1iZXIgb2YgcXNldCAtIGluZGV4ZWQgYnkgZHBwX2dyb3VwX2lkLCBjcmVhdGUgcXNldCB3aGVuIG5lY2Vzc2FyeSAqLworICAgIC8qIGNyZWF0ZSBvbmUgaWYgbm90IGV4aXN0ICovCisgICAgaWYgKEJDTV9FX05PVF9GT1VORCA9PSBiY21fZmllbGRfZ3JvdXBfc3RhdHVzX2dldCh1bml0LCAqcF9ncm91cF9pZCwgJmZnX3N0YXR1cykpCisgICAgeyAgICAgIAorICAgICAgICBiY21fZmllbGRfZ3JvdXBfY29uZmlnX3RfaW5pdCgmZ3JwKTsKKyAgICAgICAgCisgICAgICAgIEJDTV9GSUVMRF9RU0VUX0lOSVQoZ3JwLnFzZXQpOyAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRDQU0gZW50cnkgbGltaXQgdG8gODAgYml0cyBwZXIgc2xpY2UsIGJ1dCB1cCB0byA0IHNsaWNlcyBmb3IgYSBncm91cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBNb2RlQXV0byB0byBhdXRvbWF0aWNhbGx5IGFkanVzdCBpdCAqLworICAgICAgICBCQ01fRklFTERfUVNFVF9BREQoZ3JwLnFzZXQsIGJjbUZpZWxkUXVhbGlmeUluUG9ydCk7ICAgICAgICAgIC8qIDMyIGJpdHMgKi8KKyAgICAgICAgQkNNX0ZJRUxEX1FTRVRfQUREKGdycC5xc2V0LCBiY21GaWVsZFF1YWxpZnlEc3RNYWMpOyAgICAgICAgICAvKiA0OCBiaXRzICovCisgICAgICAgIEJDTV9GSUVMRF9RU0VUX0FERChncnAucXNldCwgYmNtRmllbGRRdWFsaWZ5U3JjTWFjKTsgICAgICAgICAgLyogNDggYml0cyAqLworICAgICAgICBCQ01fRklFTERfUVNFVF9BREQoZ3JwLnFzZXQsIGJjbUZpZWxkUXVhbGlmeURzdElwKTsgICAgICAgICAgIC8qIDMyIGJpdHMgKi8KKyNpZiAoQkFMX0FDTF9GR19TUkNfSVBfRU5BQkxFID09IDEpICAgICAgIAorICAgICAgICAvKiBzYXZlIHNvdXJjZSBJUCBzcGFjZSBmb3Igb3RoZXIgY2xhc3NpZmllciwgdHJ5IHRvIGtlZXAgdG90YWwgc2l6ZSB1bmRlciA0IHNsaWNlcyAqLyAKKyAgICAgICAgQkNNX0ZJRUxEX1FTRVRfQUREKGdycC5xc2V0LCBiY21GaWVsZFF1YWxpZnlTcmNJcCk7ICAgICAgICAgICAvKiAzMiBiaXRzICovCisjZW5kaWYgICAgICAgIAorICAgICAgICBCQ01fRklFTERfUVNFVF9BREQoZ3JwLnFzZXQsIGJjbUZpZWxkUXVhbGlmeUV0aGVyVHlwZSk7ICAgICAgIC8qIDE2IGJpdHMgKi8KKyAgICAgICAgQkNNX0ZJRUxEX1FTRVRfQUREKGdycC5xc2V0LCBiY21GaWVsZFF1YWxpZnlJcFByb3RvY29sKTsgICAgICAvKiAgOCBiaXRzICovCisgICAgICAgIEJDTV9GSUVMRF9RU0VUX0FERChncnAucXNldCwgYmNtRmllbGRRdWFsaWZ5TDREc3RQb3J0KTsgICAgICAgLyogMTYgYml0cyAqLworICAgICAgICBCQ01fRklFTERfUVNFVF9BREQoZ3JwLnFzZXQsIGJjbUZpZWxkUXVhbGlmeUw0U3JjUG9ydCk7ICAgICAgIC8qIDE2IGJpdHMgKi8KKyAgICAgICAgQkNNX0ZJRUxEX1FTRVRfQUREKGdycC5xc2V0LCBiY21GaWVsZFF1YWxpZnlPdXRlclZsYW5JZCk7ICAgICAvKiAxNiBiaXRzICovCisgICAgICAgIEJDTV9GSUVMRF9RU0VUX0FERChncnAucXNldCwgYmNtRmllbGRRdWFsaWZ5T3V0ZXJWbGFuUHJpKTsgICAgLyogIDggYml0cyAqLworICAgICAgICBCQ01fRklFTERfUVNFVF9BREQoZ3JwLnFzZXQsIGJjbUZpZWxkUXVhbGlmeUlubmVyVmxhbklkKTsgICAgIC8qIDE2IGJpdHMgKi8KKyAgICAgICAgQkNNX0ZJRUxEX1FTRVRfQUREKGdycC5xc2V0LCBiY21GaWVsZFF1YWxpZnlJbm5lclZsYW5QcmkpOyAgICAvKiAgOCBiaXRzICovCisgICAgICAgIEJDTV9GSUVMRF9RU0VUX0FERChncnAucXNldCwgYmNtRmllbGRRdWFsaWZ5SW5WUG9ydCk7ICAgICAgICAgLyogMzIgYml0cyAqLworICAgICAgICBCQ01fRklFTERfUVNFVF9BREQoZ3JwLnFzZXQsIGJjbUZpZWxkUXVhbGlmeVBhY2tldFJlcyk7ICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgQkNNX0ZJRUxEX1FTRVRfQUREKGdycC5xc2V0LCBiY21GaWVsZFF1YWxpZnlTdGFnZUluZ3Jlc3MpOworICAgICAgICAKKyAgICAgICAgQkNNX0ZJRUxEX0FTRVRfSU5JVChncnAuYXNldCk7CisgICAgICAgIEJDTV9GSUVMRF9BU0VUX0FERChncnAuYXNldCwgYmNtRmllbGRBY3Rpb25UcmFwKTsKKyAgICAgICAgQkNNX0ZJRUxEX0FTRVRfQUREKGdycC5hc2V0LCBiY21GaWVsZEFjdGlvbkRyb3ApOworICAgICAgICBCQ01fRklFTERfQVNFVF9BREQoZ3JwLmFzZXQsIGJjbUZpZWxkQWN0aW9uUmVkaXJlY3QpOworICAgICAgICBCQ01fRklFTERfQVNFVF9BREQoZ3JwLmFzZXQsIGJjbUZpZWxkQWN0aW9uVnBvcnROZXcpOworICAgICAgICAKKyAgICAgICAgZ3JwLnByaW9yaXR5ID0gMTI7IC8qIHRoZSBoaWdoZXIgdGhlIG51bWJlciB0aGUgaGlnaGVyIHRoZSBwcmlvcml0eSAqLworICAgICAgICBncnAuZmxhZ3MgPSAoQkNNX0ZJRUxEX0dST1VQX0NSRUFURV9XSVRIX01PREUgfCBCQ01fRklFTERfR1JPVVBfQ1JFQVRFX1dJVEhfQVNFVCk7CisgICAgICAgIGdycC5tb2RlID0gYmNtRmllbGRHcm91cE1vZGVBdXRvOworICAgICAgICAKKyAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX2dyb3VwX2NvbmZpZ19jcmVhdGUodW5pdCwgJmdycCk7CisgICAgICAgIAorICAgICAgICBpZiAocmV0ICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZsb3cgZmFpbCB0byBjcmVhdGUgZmllbGQgLSAlZFxuIiwgcmV0ICk7CisgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAqcF9ncm91cF9pZCA9IGdycC5ncm91cDsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkZpZWxkIEdyb3VwICVkIGNyZWF0ZWRcbiIsICpwX2dyb3VwX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7IAorIH0KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIGEgZGVmYXVsdCBmaWVsZCBncm91cCBpbiB0aGUgc3dpdGNoIElDQVAsIAorICogICAgICAgIFRoaXMgZmllbGQgZ3JvdXAgYWxsb3cgZmxvdyBjbGFzc2lmaWVyIHRvIGNyZWF0ZSBkZWZhdWx0IEFDTCBydWxlcworICogCisgKiBAcGFyYW0gdW5pdCAgICB0aGUgc3dpdGNoIHVuaXQgdGhpcyBydWxlIGlzIHRvIGJlIGFkZGVkCisgKiBAcGFyYW0gcF9ncm91cF9pZCAgYSBwb2ludGVyIHRvIGEgdmFyaWFibGUgdGhhdCByZXR1cm4gdGhlIGNyZWF0ZWQgZ3JvdXAgaWQgIAorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KKyBzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2RmdF9mZ19jcmVhdGUoaW50IHVuaXQsIGJjbV9maWVsZF9ncm91cF90ICpwX2dyb3VwX2lkKQorIHsKKyAgICBiY21fZmllbGRfZ3JvdXBfc3RhdHVzX3QgZmdfc3RhdHVzOyAgICAKKyAgICBiY21fZmllbGRfZ3JvdXBfY29uZmlnX3QgZ3JwOyAKKyAgICBpbnQzMl90IHJldCA9IDA7CisgICAgCisgICAgLyogVkNBUCAtIGJjbUZpZWxkUXVhbGlmeVN0YWdlTG9va3VwLCBJQ0FQIC0gYmNtRmllbGRRdWFsaWZ5U3RhZ2VJbmdyZXNzLCBFQ0FQIC0gYmNtRmllbGRRdWFsaWZ5U3RhZ2VFZ3Jlc3MgKi8KKyAgICAvKiBUaGUgRFBQIHJlc291cmNlcyBhbGxvdyBvbmx5IGxpbWl0IG51bWJlciBvZiBxc2V0IC0gaW5kZXhlZCBieSBkcHBfZ3JvdXBfaWQsIGNyZWF0ZSBxc2V0IHdoZW4gbmVjZXNzYXJ5ICovCisgICAgLyogY3JlYXRlIG9uZSBpZiBub3QgZXhpc3QgKi8KKyAgICBpZiAoQkNNX0VfTk9UX0ZPVU5EID09IGJjbV9maWVsZF9ncm91cF9zdGF0dXNfZ2V0KHVuaXQsICpwX2dyb3VwX2lkLCAmZmdfc3RhdHVzKSkKKyAgICB7ICAgICAgCisgICAgICAgIGJjbV9maWVsZF9ncm91cF9jb25maWdfdF9pbml0KCZncnApOworICAgICAgICAKKyAgICAgICAgQkNNX0ZJRUxEX1FTRVRfSU5JVChncnAucXNldCk7ICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVENBTSBlbnRyeSBsaW1pdCB0byA4MCBiaXRzIHBlciBzbGljZSwgYnV0IHVwIHRvIDQgc2xpY2VzIGZvciBhIGdyb3VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIE1vZGVBdXRvIHRvIGF1dG9tYXRpY2FsbHkgYWRqdXN0IGl0ICovCisgICAKKyAgICAgICAgQkNNX0ZJRUxEX1FTRVRfQUREKGdycC5xc2V0LCBiY21GaWVsZFF1YWxpZnlJblZQb3J0KTsgICAgICAgICAvKiAzMiBiaXRzICovICAgICAgICAgICAgCQkgCisgICAgICAgIEJDTV9GSUVMRF9RU0VUX0FERChncnAucXNldCwgYmNtRmllbGRRdWFsaWZ5UGFja2V0UmVzKTsgCisgICAgICAgIAorICAgICAgICBCQ01fRklFTERfUVNFVF9BREQoZ3JwLnFzZXQsIGJjbUZpZWxkUXVhbGlmeVN0YWdlSW5ncmVzcyk7IAorICAgICAgICAKKyAgICAgICAgQkNNX0ZJRUxEX0FTRVRfSU5JVChncnAuYXNldCk7CisgICAgICAgIEJDTV9GSUVMRF9BU0VUX0FERChncnAuYXNldCwgYmNtRmllbGRBY3Rpb25Ecm9wKTsKKyAgICAgICAKKyAgICAgICAgZ3JwLnByaW9yaXR5ID0gMTA7IC8qIHRoZSBoaWdoZXIgdGhlIG51bWJlciB0aGUgaGlnaGVyIHRoZSBwcmlvcml0eSAqLworICAgICAgICBncnAuZmxhZ3MgPSAoQkNNX0ZJRUxEX0dST1VQX0NSRUFURV9XSVRIX01PREUgfCBCQ01fRklFTERfR1JPVVBfQ1JFQVRFX1dJVEhfQVNFVCk7CisgICAgICAgIGdycC5tb2RlID0gYmNtRmllbGRHcm91cE1vZGVBdXRvOworICAgICAgICAKKyAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX2dyb3VwX2NvbmZpZ19jcmVhdGUodW5pdCwgJmdycCk7CisgICAgICAgIAorICAgICAgICBpZiAocmV0ICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZsb3cgZmFpbCB0byBjcmVhdGUgZGVmYXVsdCBmaWVsZCAtICVkXG4iLCByZXQgKTsKKyAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgICAgCisgICAgICAgICpwX2dyb3VwX2lkID0gZ3JwLmdyb3VwOworICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiRGVmYXVsdCBGaWVsZCBHcm91cCAlZCBjcmVhdGVkXG4iLCAqcF9ncm91cF9pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOyAKKyB9IAorIAorLyoqCisgKiBAYnJpZWYgVGhlIGFjbCBhZGQgZnVuY3Rpb24gYWRkIGFuIEFjY2VzcyBDb250cm9sIFJ1bGUgaW4gdGhlIHN3aXRjaCAgVkNBUC9JQ0FQL0VDQVAKKyAqICAgICAgICB0byBwZXJmb3JtIGFjdGlvbiBiYXNlZCBvbiBmbG93IGNsYXNzaWZpZXIKKyAqIAorICogQHBhcmFtIHVuaXQgICAgdGhlIHN3aXRjaCB1bml0IHRoaXMgcnVsZSBpcyB0byBiZSBhZGRlZAorICogQHBhcmFtIHBfZmxvdyAgYSBwb2ludGVyIHRvIHRoZSBmbG93IGRlZmluaXRpb24gdGhlIGNyZWF0ZWQgcnVsZSB3aWxsIGJlIGJhc2VkIG9uIAorICogQHBhcmFtIHBfZmxvd19lbG0gIGEgcG9pbnRlciB0byB0aGUgc3dpdGNoIGludGVybmFsIGZsb3cgbGlzdCAgCisgKiBAcGFyYW0gaW5fZ3BvcnQgIGluZ3Jlc3MgdmlydHVhbCBwb3J0IChMSUYpIHRoaXMgYWNsIGFwcGxpZWQgCisgKiBAcGFyYW0gb3V0X2dwb3J0IGVncmVzcyB2aXJ0dWFsIHBvcnQgKExJRikgdGhpcyBhY2wgYXBwbGllZCAKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2FjbF9hZGQoaW50IHVuaXQsIGJjbWJhbF9mbG93X2NmZyAqcF9mbG93LCBiYWxfc3dfZmxvdyAqcF9mbG93X2VsbSwgdWludDMyX3QgaW5fZ3BvcnQsIHVpbnQzMl90IG91dF9ncG9ydCkKK3sKKyAgICAgaW50MzJfdCByZXQgPSAwOworICAgICB1aW50MTZfdCB1ZHBfcG9ydCwgZmxvd19wcmk7CisgICAgIGJjbV9maWVsZF9lbnRyeV90IGVpZDsKKyAgICAgYmNtX2dwb3J0X3QgdHJhcF9ncG9ydDsgICAgICAgICAgICAKKyAgICAgYmNtX21hY190IGRzdF9tYWMsIHNyY19tYWM7CisgICAgIGJjbV9tYWNfdCBtYWNfbWFzayA9ICB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07ICAgIAorICAgICB1aW50MzJfdCB0cmFwX2NvZGUgPSAwOworICAgICBiY21vc19lcnJubyBlcnI7CisgICAgICAKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgIiBBZGQgYW4gQUNMIHRvIGEgZmxvdyB3IHR5cGUgPSAlZFxuIiwgcF9mbG93LT5rZXkuZmxvd190eXBlKTsgICAgICAgICAgICAgICAgICAKKyAKKyAgICBpZihwX2Zsb3dfZWxtLT5udW1fZWlkID49IE1BWF9GSUVMRF9FSUQpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIlRvbyBtYW55IEFDTCBydWxlcyBpbiBmbG93IGlkICVkXG4iLCBwX2Zsb3dfZWxtLT5pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworICAgIH0gCisJCisgICAgZXJyID0gYmFsX3N3X3V0aWxfZHBwX2ZnX2NyZWF0ZSh1bml0LCAmZHBwX2dyb3VwX2lkKTsKKyAKKyAgICBpZiAoQkNNX0VSUl9BTFJFQURZICE9IGVyciAmJiBCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRmllbGQgR3JvdXAgJWQgY3JlYXRlIGZhaWxlZFxuIiwgZHBwX2dyb3VwX2lkKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBmaWxsIGluIHRoZSBtYXRjaCBmaWVsZHMgKi8KKyAgICBkbworICAgIHsgCisgICAgICAgIHJldCA9IGJjbV9maWVsZF9lbnRyeV9jcmVhdGUodW5pdCwgZHBwX2dyb3VwX2lkLCAmZWlkKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZF9lbnRyeV9jcmVhdGUgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBpZiB1cHN0cmVhbSwgbWF0Y2ggaW5ncmVzcyBwb3J0ICovCisgICAgICAgIGlmKHBfZmxvdy0+a2V5LmZsb3dfdHlwZSA9PSBCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNICYmICBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgYWNjZXNzX2ludF9pZCkpCisgICAgICAgIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldCA9IGJjbV9maWVsZF9xdWFsaWZ5X0luUG9ydCh1bml0LCBlaWQsIGJhbF9iY21fcG9uX2luZl9wYm1fZ2V0KHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkKSwgMHhmZmZmZmZmZik7CisgICAgICAgICAgICBpZiAoQkNNX0VfTk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZF9xdWFsaWZ5X0luUG9ydCBmYWlsZWQgLSAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiQWRkIEluUG9ydCAlZCB0byBxdWFsaWZpZXJcbiIsIGJhbF9iY21fcG9uX2luZl9wYm1fZ2V0KHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkKSk7CisgICAgICAgICAgICB9CisgCisgICAgICAgIH0KKyAgICAgICAgLyogaWYgZG93bnN0cmVhbSwgbWF0Y2ggaW5ncmVzcyBubmkgcG9ydCAqLworICAgICAgICBpZihwX2Zsb3ctPmtleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNICYmIEJDTU9TX1RSVUUgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3csIGZsb3csIG5ldHdvcmtfaW50X2lkKSkKKyAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX3F1YWxpZnlfSW5Qb3J0KHVuaXQsIGVpZCwgYmFsX2JjbV9uZXRfaW5mX3BibV9nZXQocF9mbG93LT5kYXRhLm5ldHdvcmtfaW50X2lkKSwgMHhmZmZmZmZmZik7CisgICAgICAgICAgICBpZiAoQkNNX0VfTk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZF9xdWFsaWZ5X0luUG9ydCBmYWlsZWQgLSAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiQWRkIG5ldHdvcmsgcG9ydCAlZCB0byBxdWFsaWZpZXJcbiIsIGJhbF9iY21fbmV0X2luZl9wYm1fZ2V0KHBfZmxvdy0+ZGF0YS5uZXR3b3JrX2ludF9pZCkpOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAvKiBtYXRjaCBldGhlciB0eXBlICovCisgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGV0aGVyX3R5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfcXVhbGlmeV9FdGhlclR5cGUodW5pdCwgZWlkLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5ldGhlcl90eXBlLCAweGZmZmYpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkX3F1YWxpZnlfRXRoZXJUeXBlIGZhaWxlZCAtICVkXG4iLCByZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICJBZGQgZXRoZXIgdHlwZSAweCV4IHRvIHF1YWxpZmllclxuIiwgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuZXRoZXJfdHlwZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGFkZCBJUCBwcm90b2NvbCB0byBtYXRjaCBydWxlICovCisgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGlwX3Byb3RvKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX3F1YWxpZnlfSXBQcm90b2NvbCh1bml0LCBlaWQsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmlwX3Byb3RvLCAweGZmKTsKKyAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZF9xdWFsaWZ5X0lwUHJvdG9jb2wgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkFkZCBpcCBwcm90b2NvbCAweCV4IHRvIHF1YWxpZmllclxuIiwgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuaXBfcHJvdG8gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBhZGQgTDMgc291cmNlIHBvcnQgdG8gbWF0Y2ggcnVsZSAtIERvbid0IGJlIGNvbmZ1c2VkIGJ5IHRoZSBBUEkgbmFtZSAqLworICAgICAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBzcmNfcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVkcF9wb3J0ID0gcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuc3JjX3BvcnQ7CisgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfcXVhbGlmeV9MNFNyY1BvcnQodW5pdCwgZWlkLCB1ZHBfcG9ydCwgMHhmZmZmKTsKKyAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZF9xdWFsaWZ5X0w0U3JjUG9ydCBmYWlsZWQgLSAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiQWRkIHNyYyBwb3J0ICVkIHRvIHF1YWxpZmllclxuIiwgdWRwX3BvcnQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBhZGQgTDMgZGVzdGluYXRpb24gcG9ydCB0byBtYXRjaCBydWxlICovCisgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGRzdF9wb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgdWRwX3BvcnQgPSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5kc3RfcG9ydDsKKyAgICAgICAgICAgIHJldCA9IGJjbV9maWVsZF9xdWFsaWZ5X0w0RHN0UG9ydCh1bml0LCBlaWQsIHVkcF9wb3J0LCAweGZmZmYpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkX3F1YWxpZnlfTDREc3RQb3J0IGZhaWxlZCAtICVkXG4iLCByZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICJBZGQgZHN0IHBvcnQgJWQgdG8gcXVhbGlmaWVyXG4iLCB1ZHBfcG9ydCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGFkZCBPdXRlciB2aWQgdG8gbWF0Y2ggcnVsZSAqLworICAgICAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBvX3ZpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IGJjbV9maWVsZF9xdWFsaWZ5X091dGVyVmxhbklkKHVuaXQsIGVpZCwgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIub192aWQsIDB4MGZmZik7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZmllbGRfcXVhbGlmeV9PdXRlclZsYW5JZCBmYWlsZWQgLSAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiQWRkIG91dGVyIHZpZCAweCV4IHRvIHF1YWxpZmllclxuIiwgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIub192aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBhZGQgSW5uZXIgdmlkIHRvIG1hdGNoIHJ1bGUgKi8KKyAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgaV92aWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfcXVhbGlmeV9Jbm5lclZsYW5JZCh1bml0LCBlaWQsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmlfdmlkLCAweDBmZmYpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkX3F1YWxpZnlfSW5uZXJWbGFuSWQgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkFkZCBJbm5lciB2aWQgMHgleCB0byBxdWFsaWZpZXJcbiIsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmlfdmlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogYWRkIE91dGVyIHByaW9yaXR5IHRvIG1hdGNoIHJ1bGUgIC0gb25seSBhY2NlcHQgMyBiaXRzICovCisgICAgICAgIC8qIHVzZSBBQ0wgZm9yIGRvd25zdHJlYW0sIHVwc3RyZWFtIHBiaXQgY2xhc3NpZmljYXRpb24gd2lsbCBiZSBkb25lIHRocm91Z2ggUE9OIExJRiAqLworICAgICAgICBpZihwX2Zsb3ctPmtleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNICYmCisgICAgICAgICAgIEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIG9fcGJpdHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfcXVhbGlmeV9PdXRlclZsYW5QcmkodW5pdCwgZWlkLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3BiaXRzLCAweDcpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkX3F1YWxpZnlfT3V0ZXJWbGFuUHJpIGZhaWxlZCAtICVkXG4iLCByZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICJBZGQgb3V0ZXIgcHJpIDB4JXggdG8gcXVhbGlmaWVyXG4iLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3BiaXRzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogYWRkIElubmVyIHByaW9yaXR5IHRvIG1hdGNoIHJ1bGUgIC0gb25seSBhY2NlcHQgMyBiaXRzICovCisgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGlfcGJpdHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfcXVhbGlmeV9Jbm5lclZsYW5QcmkodW5pdCwgZWlkLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5pX3BiaXRzLCAweDcpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkX3F1YWxpZnlfSW5uZXJWbGFuUHJpIGZhaWxlZCAtICVkXG4iLCByZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICJBZGQgaW5uZXIgcHJpIDB4JXggdG8gcXVhbGlmaWVyXG4iLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5pX3BiaXRzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogYWRkIERzdCBNYWMgdG8gbWF0Y2ggcnVsZSAqLworICAgICAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBkc3RfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCZkc3RfbWFjLCAmKHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmRzdF9tYWMpLCBzaXplb2YoYmNtX21hY190KSk7CisgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfcXVhbGlmeV9Ec3RNYWModW5pdCwgZWlkLCBkc3RfbWFjLCBtYWNfbWFzayk7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZmllbGRfcXVhbGlmeV9Ec3RNYWMgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkFkZCBEc3RNYWMgJXg6JXg6JXg6JXg6JXg6JXggdG8gcXVhbGlmaWVyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5kc3RfbWFjLnU4WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5kc3RfbWFjLnU4WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5kc3RfbWFjLnU4WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5kc3RfbWFjLnU4WzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5kc3RfbWFjLnU4WzRdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5kc3RfbWFjLnU4WzVdICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogYWRkIFNyYyBNYWMgdG8gbWF0Y2ggcnVsZSAqLworICAgICAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBzcmNfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCZzcmNfbWFjLCAmKHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnNyY19tYWMpLCBzaXplb2YoYmNtX21hY190KSk7CisgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfcXVhbGlmeV9TcmNNYWModW5pdCwgZWlkLCBzcmNfbWFjLCBtYWNfbWFzayk7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZmllbGRfcXVhbGlmeV9TcmNNYWMgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkFkZCBTcmNNYWNbNV0gMHgleCB0byBxdWFsaWZpZXJcbiIsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnNyY19tYWMudThbNV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBhZGQgRHN0IElQIHRvIG1hdGNoIHJ1bGUgKi8KKyAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgZHN0X2lwKSkKKyAgICAgICAgeyAgICAgICAgICAgCisgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfcXVhbGlmeV9Ec3RJcCh1bml0LCBlaWQsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmRzdF9pcC51MzIsIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkX3F1YWxpZnlfRHN0SXAgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkFkZCBEc3RJcCAweCV4IHRvIHF1YWxpZmllclxuIiwgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuZHN0X2lwLnUzMiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAKKyAgICAgICAgLyogYWRkIFNyYyBJUCB0byBtYXRjaCBydWxlICovICAgICAgICAKKyAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgc3JjX2lwKSkKKyAgICAgICAgeyAgICAgICAgICAgCisgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfcXVhbGlmeV9TcmNJcCh1bml0LCBlaWQsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnNyY19pcC51MzIsIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkX3F1YWxpZnlfU3JjSXAgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkFkZCBTcmNJcCAweCV4IHRvIHF1YWxpZmllclxuIiwgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuc3JjX2lwLnUzMiApOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgLyogc2V0IEFDTCBwcmlvcml0eSAqLworICAgICAgICBpZihCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgcHJpb3JpdHkpKQorICAgICAgICB7CisgICAgICAgICAgICBmbG93X3ByaSA9IHBfZmxvdy0+ZGF0YS5wcmlvcml0eTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGRlZmF1bHQgdG8gMTAsIHZhbGlkIHJhbmdlIDAgLSA2NTUzNSAqLworICAgICAgICB7CisgICAgICAgICAgICBmbG93X3ByaSA9IEJBTF9GTE9XX0RFRkFVTFRfUFJJT1JJVFk7CisgICAgICAgICAgICAvKiBzZXQgdGhlIHByZXNlbmNlIG9mIHByaW9yaXR5IGJpdCBpbiB0aGUgZmxvdyB0byByZWZsZWN0IGluc2VydGlvbiBvZiBERUZBVUxUX1BSSU9SSVRZICovCisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKHBfZmxvdywgZmxvdywgcHJpb3JpdHksIGZsb3dfcHJpKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIHJldCA9IGJjbV9maWVsZF9lbnRyeV9wcmlvX3NldCh1bml0LCBlaWQsIGZsb3dfcHJpKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZCBlbnRyeSBwcmlvcml0eSBmYWlsZWQgLSAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkIGVudHJ5IHByaW9yaXR5IHNldCB0byAtICVkXG4iLCBmbG93X3ByaSk7CisgICAgICAgIH0KKyAgICAgCisgICAgfXdoaWxlKDApOworICAgICAgICAKKyAgICBpZiAoQkNNX0VfTk9ORSA9PSByZXQpIC8qIG1ha2Ugc3VyZSB0aGUgZmllbGQgcXVhbGlmaWVyIHNldHRpbmdzIGFyZSBnb29kICovCisgICAgeworICAgICAgICBpZiggQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3csIGZsb3csIGFjdGlvbikgICYmCisgICAgICAgICAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9JU19TRVQoICYocF9mbG93LT5kYXRhLmFjdGlvbiksIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1RSQVBfVE9fSE9TVCkgICAgKSAgICAgICAgICAgICAgICAKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICIgR290IGEgZmxvdyBhY3Rpb24gY21kPTB4JXggXG4iLCBwX2Zsb3ctPmRhdGEuYWN0aW9uLmNtZHNfYml0bWFzayk7ICAgIAorICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9jcmVhdGVfdHJhcF9ncG9ydCh1bml0LCAmdHJhcF9ncG9ydCwgJnRyYXBfY29kZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiY3JlYXRlX3RyYXBfZ3BvcnQgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBxdWFsaWZ5IHdpdGggaW4gTElGICovCisgICAgICAgICAgICAgICAgaWYoaW5fZ3BvcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBhZGQgdlBvcnQgdG8gbWF0Y2ggcnVsZSAqLworICAgICAgICAgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfcXVhbGlmeV9JblZQb3J0MzIodW5pdCwgZWlkLCBpbl9ncG9ydCwgMHhmZmZmKTsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZF9xdWFsaWZ5X0luVlBvcnQgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX2FjdGlvbl9hZGQodW5pdCwgZWlkLCBiY21GaWVsZEFjdGlvblRyYXAsIHRyYXBfZ3BvcnQsIDApOworICAgICAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkIGFjdGlvbiBhZGQgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX2VudHJ5X2luc3RhbGwodW5pdCwgZWlkKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZF9lbnRyeV9pbnN0YWxsICVkIGZhaWxlZCAtICVkXG4iLCBlaWQsIHJldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkFkZCBydWxlICVkIFN1Y2Nlc3NcbiIsIGVpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfXdoaWxlKDApOworICAgICAgICB9CisgICAgICAgIC8qIHJlZ3VsYXIgZm9yd2FyZGluZyBBQ0wgKi8KKyAgICAgICAgZWxzZSAKKyAgICAgICAgeyAgICAgCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJlZGlyZWN0IHRvIHRoZSBlZ3Jlc3MgTElGICovCisgICAgICAgICAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX2FjdGlvbl9hZGQodW5pdCwgZWlkLCBiY21GaWVsZEFjdGlvblJlZGlyZWN0LCAgMCwgIG91dF9ncG9ydCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZmllbGQgYWN0aW9uIGFkZCBmYWlsZWQgLSAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAvKiB0cmlnZ2VyIHZsYW4gdHJhbnNsYXRpb24gYXQgdGhlIGVncmVzcyBMSUYgKi8KKyAgICAgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfYWN0aW9uX2FkZCh1bml0LCBlaWQsIGJjbUZpZWxkQWN0aW9uVnBvcnROZXcsICBvdXRfZ3BvcnQsIDApOworICAgICAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkIGFjdGlvbiBhZGQgbmV3IHZwb3J0IGZhaWxlZCAtICVkXG4iLCByZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX2VudHJ5X2luc3RhbGwodW5pdCwgZWlkKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZF9lbnRyeV9pbnN0YWxsICVkIGZhaWxlZCAtICVkXG4iLCBlaWQsIHJldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkFkZCBydWxlICVkIHRvIGdwb3J0IDB4JXggU3VjY2Vzc1xuIiwgZWlkLCBvdXRfZ3BvcnQpOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAorICAgICAgICAgICAgfXdoaWxlKDApOworICAgICAgICB9CisgICAgfSAgCisgICAgCisgICAgaWYgKHJldCAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICAgIC8qIFRCRCAtIHJlbGVhc2UgdGhlIGVpZCBhbmQgdHJhcCBwb3J0IHJlc291cmNlICovCisgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogYWRkIGZsb3cgaW5mbyBpbnRvIHRoZSBpbnRlcm5hbCBsaW5rIGxpc3QgKi8KKyAgICAgICAgcF9mbG93X2VsbS0+dHJhcF9jb2RlID0gdHJhcF9jb2RlOworICAgICAgICBwX2Zsb3dfZWxtLT50cmFwX3BvcnQgPSB0cmFwX2dwb3J0OworICAgICAgICBwX2Zsb3dfZWxtLT5maWVsZF9lbnRyeV9pZFtwX2Zsb3dfZWxtLT5udW1fZWlkXSA9IGVpZDsgCisgICAgICAgIHBfZmxvd19lbG0tPm51bV9laWQgKz0gMTsgICAgICAgIAorICAgICAgICBwX2Zsb3dfZWxtLT52YWxpZCA9IDE7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KK30KKworLyoqCisgKiBAYnJpZWYgVGhlIGRlZmF1bHQgYWNsIGFkZCBmdW5jdGlvbiBhZGQgYSBEUk9QIEFjY2VzcyBDb250cm9sIFJ1bGUgb24gdGhlIGluZ3Jlc3MgTElGCisgKiAKKyAqIEBwYXJhbSB1bml0ICAgIHRoZSBzd2l0Y2ggdW5pdCB0aGlzIHJ1bGUgaXMgdG8gYmUgYWRkZWQKKyAqIEBwYXJhbSBwX2Zsb3cgIGEgcG9pbnRlciB0byB0aGUgZmxvdyBkZWZpbml0aW9uIHRoZSBjcmVhdGVkIHJ1bGUgd2lsbCBiZSBiYXNlZCBvbiAKKyAqIEBwYXJhbSBwX2Zsb3dfZWxtICBhIHBvaW50ZXIgdG8gdGhlIHN3aXRjaCBpbnRlcm5hbCBmbG93IGxpc3QgIAorICogQHBhcmFtIGluX2dwb3J0ICBpbmdyZXNzIHZpcnR1YWwgcG9ydCAoTElGKSB0aGlzIGFjbCBhcHBsaWVkICAKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2RmdF9hY2xfYWRkKGludCB1bml0LCBiY21iYWxfZmxvd19jZmcgKnBfZmxvdywgYmFsX3N3X2Zsb3cgKnBfZmxvd19lbG0sIHVpbnQzMl90IGluX2dwb3J0KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21fZmllbGRfZW50cnlfdCBkZnRfZWlkID0gMDsKKyAgICBpbnQzMl90IHJldCA9IDA7CisgIAorICAgIGlmKHBfZmxvd19lbG0tPm51bV9laWQgPj0gTUFYX0ZJRUxEX0VJRCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiVG9vIG1hbnkgZGZ0IEFDTCBydWxlcyBpbiBmbG93IGlkICVkXG4iLCBwX2Zsb3dfZWxtLT5pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworICAgIH0KKwkKKyAgICBlcnIgPSBiYWxfc3dfdXRpbF9kcHBfZGZ0X2ZnX2NyZWF0ZSh1bml0LCAmZHBwX2dyb3VwX2lkKTsKKyAKKyAgICBpZiAoQkNNX0VSUl9BTFJFQURZICE9IGVyciAmJiBCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRmllbGQgRGVmYXVsdCBHcm91cCAlZCBjcmVhdGUgZmFpbGVkXG4iLCBkcHBfZGZ0X2dyb3VwX2lkKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZG8KKyAgICB7CisgICAgICAgICAvKiBJbnN0YWxsIGEgZGVmYXVsdCBkcm9wIEFDTCBhdCBsb3dlc3QgcHJpb3JpdHkoMCkuIAorICAgICAgICAgICBUaGlzIHdpbGwgZHJvcCB1bm1hdGNoIHBhY2tldHMgcmVjZWl2ZWQgb24gdGhlIHNhbWUgaW5ncmVzcyBMSUYgCisgICAgICAgICAqLyAgIAorICAgICAgICAKKyAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX2VudHJ5X2NyZWF0ZSh1bml0LCBkcHBfZ3JvdXBfaWQsICZkZnRfZWlkKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZF9lbnRyeV9jcmVhdGUgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgCisgICAgICAgIC8qIGFkZCB2UG9ydCB0byBtYXRjaCBydWxlICovCisgICAgICAgIHJldCA9IGJjbV9maWVsZF9xdWFsaWZ5X0luVlBvcnQzMih1bml0LCBkZnRfZWlkLCBpbl9ncG9ydCwgMHhmZmZmKTsgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZF9xdWFsaWZ5X0luVlBvcnQgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAKKworCQkvKiBhZGQgUGFja2V0IHR5cGUgdG8gbWF0Y2ggcnVsZSwgZHJvcCBvbmx5IHVuaWNhc3QgKi8KKyAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX3F1YWxpZnlfUGFja2V0UmVzKHVuaXQsIGRmdF9laWQsIEJDTV9GSUVMRF9QS1RfUkVTX0wyVUMsIDApOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAocmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkX3F1YWxpZnlfUGFja2V0UmVzIGZhaWxlZCAtICVkXG4iLCByZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gCisJCQorICAgICAgICAKKyAgICAgICAgLyogc2V0IHRvIGxvd2VzdCBwcmlvcml0eSAwICovIAorICAgICAgICByZXQgPSBiY21fZmllbGRfZW50cnlfcHJpb19zZXQodW5pdCwgZGZ0X2VpZCwgMCk7ICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAocmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkIGVudHJ5IHByaW9yaXR5IGZhaWxlZCAtICVkXG4iLCByZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07CisKKyAgICAgICAgLyogRHJvcCB0aGUgcGFja2V0ICovCisgICAgICAgIHJldCA9IGJjbV9maWVsZF9hY3Rpb25fYWRkKHVuaXQsIGRmdF9laWQsIGJjbUZpZWxkQWN0aW9uRHJvcCwgIDAsICAwKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJmaWVsZCBhY3Rpb24gYWRkIGZhaWxlZCAtICVkXG4iLCByZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07CisgICAgICAgIHJldCA9IGJjbV9maWVsZF9lbnRyeV9pbnN0YWxsKHVuaXQsIGRmdF9laWQpOworICAgICAgICBpZiAocmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImZpZWxkX2VudHJ5X2luc3RhbGwgJWQgZmFpbGVkIC0gJWRcbiIsIGRmdF9laWQsIHJldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiQWRkIGRlZmF1bHQgcnVsZSAlZCBTdWNjZXNzXG4iLCBkZnRfZWlkKTsKKyAgICAgICAgfSAgCisgICAgfXdoaWxlKDApOyAgCisgICAgaWYgKHJldCAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBfZmxvd19lbG0tPmZpZWxkX2VudHJ5X2lkW3BfZmxvd19lbG0tPm51bV9laWRdID0gZGZ0X2VpZDsgCisgICAgICAgIHBfZmxvd19lbG0tPm51bV9laWQgKz0gMTsgCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0gICAgCit9CisKKy8qKgorICogQGJyaWVmIFRoZSBpbmdyZXNzIHZsYW4gdHJhbnNsYXRpb24gZnVuY3Rpb24gbW9kaWZpZWQgdGhlIHBhY2tldCBWTEFOIHRhZyAKKyAqICAgICAgICBiZWZvcmUgc2VuZGluZyBpdCBvdXQgCisgKiAKKyAqIEBwYXJhbSB1bml0ICAgIHRoZSBzd2l0Y2ggdW5pdCB0aGlzIHJ1bGUgaXMgdG8gYmUgYWRkZWQKKyAqIEBwYXJhbSBwX2Zsb3cgIGEgcG9pbnRlciB0byB0aGUgZmxvdyBkZWZpbml0aW9uIHRoZSBjcmVhdGVkIHJ1bGUgd2lsbCBiZSBiYXNlZCBvbiAKKyAqIEBwYXJhbSBpbmdwb3J0ICB0aGUgZ3BvcnQgdGhlIHRyYW5zbGF0aW9uIHdpbGwgYmUgYXBwbGllZCAKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2ludmxhbngoaW50IHVuaXQsIGJjbWJhbF9mbG93X2NmZyAqcF9mbG93LCB1aW50MzJfdCBpbmdwb3J0KQoreworICAgIGludCBydiA9IDA7CisgICAgYmNtX3ZsYW5fYWN0aW9uX3NldF90IGFjdGlvbjsKKyAgICBiY21fdmxhbl9hY3Rpb25fc2V0X3RfaW5pdCgmYWN0aW9uKTsKKyAgICBiY21vc19lcnJubyByZXQ7CisgICAgCisgICAgaWYoQkNNQkFMX0FDVElPTl9DTURfSURfSVNfU0VUKCAmKHBfZmxvdy0+ZGF0YS5hY3Rpb24pLCBCQ01CQUxfQUNUSU9OX0NNRF9JRF9SRU1BUktfUEJJVFMpKSAgICAgICAKKyAgICB7ICAKKyAgICAgICAgaW50IHFvc19tYXBfaWQsIGlfcHJpLCBvX3ByaTsKKyAgICAgICAKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9QS1RfVEFHX1RZUEVfRE9VQkxFX1RBRzogCisgICAgICAgICAgICAgICAgICAgIC8qIHNob3VsZCBiZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmR0X291dGVyX3BrdF9wcmlvID0gYmNtVmxhbkFjdGlvblJlcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5uZXdfb3V0ZXJfdmxhbiA9IHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fdmlkOzsKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmR0X291dGVyID0gYmNtVmxhbkFjdGlvblJlcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpdCBkb2VzIG5vdCBzZWVtcyB0byB3b3JrLiBVc2luZyBvdF9vdXRlciBzZWVtcyB0byBhbHNvIHdvcmsgZm9yIGRvdWJsZSB0YWdnZWQgcGFja2V0cyAKKyAgICAgICAgICAgICAgICAgICAgKi8gICAKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uLm90X291dGVyX3BrdF9wcmlvID0gYmNtVmxhbkFjdGlvblJlcGxhY2U7IAorICAgICAgICAgICAgICAgICAgICBhY3Rpb24ubmV3X291dGVyX3ZsYW4gPSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3ZpZDsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uLm90X291dGVyID0gYmNtVmxhbkFjdGlvblJlcGxhY2U7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9TSU5HTEVfVEFHOgorICAgICAgICAgICAgICAgICAgICBhY3Rpb24ub3Rfb3V0ZXJfcGt0X3ByaW8gPSBiY21WbGFuQWN0aW9uUmVwbGFjZTsgCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5uZXdfb3V0ZXJfdmxhbiA9IHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fdmlkOworICAgICAgICAgICAgICAgICAgICBhY3Rpb24ub3Rfb3V0ZXIgPSBiY21WbGFuQWN0aW9uUmVwbGFjZTsgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yLCBwYml0cyB0cmFuc2xhdGlvbiBvbiB1bnRhZ2dlZCBwYWNrZXRzXG4iKTsgCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLyogcGVyZm9ybSBvX3BiaXRzIHRyYW5zbGF0aW9uICovCisgICAgICAgICAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBvX3BiaXRzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpX3ByaSA9IHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fcGJpdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbWFyayB0aGUgc291cmNlIHBjcCBET05UQ0FSRSAqLworICAgICAgICAgICAgICAgIGlfcHJpID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBmbG93IHZhbGlkYXRpb24gYWxyZWFkeSBtYWtlIHN1cmUgdGhlIGFjdGlvbi5vX3BiaXRzIGlzIHNldCBmb3IgUkVNQVJLX1BCSVRTICovCisgICAgICAgICAgICBvX3ByaSA9IHBfZmxvdy0+ZGF0YS5hY3Rpb24ub19wYml0czsgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICByZXQgPSBiYWxfc3dfZHBwX3BjcF9yZW1hcmtfbWFwX2dldChpX3ByaSwgb19wcmksICZxb3NfbWFwX2lkKTsKKyAgICAgICAKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciwgZmFpbGUgdG8gb2J0YWluIHBjcCBtYXAgaWQsIHJldCA9ICVkXG4iLCByZXQpOworICAgICAgICAgICAgICAgIHJ2ID0gQkNNX0VfVU5BVkFJTDsgICAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBydiA9IGJjbV9xb3NfcG9ydF9tYXBfc2V0KHVuaXQsIGluZ3BvcnQsIHFvc19tYXBfaWQsIC0xKTsgICAgIAorICAgICAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IsIHBiaXRzIHRyYW5zbGF0aW9uIGJjbV9xb3NfcG9ydF9tYXBfc2V0IHJldCA9ICVkXG4iLCBydik7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIHNldCB0aGUgYWN0aW9uIHByaW9yaXR5IHByb2ZpbGUgKi8KKyAgICAgICAgICAgIGFjdGlvbi5wcmlvcml0eSA9IHFvc19tYXBfaWQ7CisgICAgICAgICAgICBhY3Rpb24ubmV3X2lubmVyX3BrdF9wcmlvID0gcW9zX21hcF9pZDsgICAgICAgICAgICAKKyAgICAgICAgfXdoaWxlKDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBub3RoaW5nIHRvIGRvLCByZXR1cm4gT0sgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIGlmKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisgICAgCisgICAgcnYgPSBiY21fdmxhbl90cmFuc2xhdGVfYWN0aW9uX2NyZWF0ZSh1bml0LCBpbmdwb3J0LCBiY21WbGFuVHJhbnNsYXRlS2V5UG9ydE91dGVyLCBCQ01fVkxBTl9JTlZBTElELCBCQ01fVkxBTl9OT05FLCAmYWN0aW9uKTsKKyAgICBpZiggcnYgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICJQZXJmb3JtIGluZ3Jlc3MgdmxhbiB0cmFuc2xhdGlvbiB3ICVzIGFjdGlvbiBvbiBncG9ydCAweCV4XG4iLAorICAgICAgICAgICAgICAgIChwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5wa3RfdGFnX3R5cGUgPT0gQkNNQkFMX1BLVF9UQUdfVFlQRV9ET1VCTEVfVEFHKT8gIkRUIjogIlNUIiwKKyAgICAgICAgICAgICAgICBpbmdwb3J0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorfQorLyoqCisgKiBAYnJpZWYgVGhlIGVncmVzcyB2bGFuIHRyYW5zbGF0aW9uIGZ1bmN0aW9uIG1vZGlmaWVkIHRoZSBwYWNrZXQgVkxBTiB0YWcgCisgKiAgICAgICAgYmVmb3JlIHNlbmRpbmcgaXQgb3V0IAorICogCisgKiBAcGFyYW0gdW5pdCAgICB0aGUgc3dpdGNoIHVuaXQgdGhpcyBydWxlIGlzIHRvIGJlIGFkZGVkCisgKiBAcGFyYW0gcF9mbG93ICBhIHBvaW50ZXIgdG8gdGhlIGZsb3cgZGVmaW5pdGlvbiB0aGUgY3JlYXRlZCBydWxlIHdpbGwgYmUgYmFzZWQgb24gCisgKiBAcGFyYW0gZWdwb3J0ICB0aGUgZ3BvcnQgdGhlIHRyYW5zbGF0aW9uIHdpbGwgYmUgYXBwbGllZCAKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2V2bGFueChpbnQgdW5pdCwgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3csIHVpbnQzMl90IGVncG9ydCkKK3sKKyAgICBpbnQgcnYgPSAwOworICAgIGJjbV92bGFuX2FjdGlvbl9zZXRfdCBhY3Rpb247CisgICAgYmNtX3ZsYW5fYWN0aW9uX3NldF90X2luaXQoJmFjdGlvbik7CisKKyAgICBpZihCQ01CQUxfQUNUSU9OX0NNRF9JRF9JU19TRVQoICYocF9mbG93LT5kYXRhLmFjdGlvbiksIEJDTUJBTF9BQ1RJT05fQ01EX0lEX0FERF9PVVRFUl9UQUcpKSAgIAorICAgIHsKKyAgICAgICAgYWN0aW9uLm5ld19vdXRlcl92bGFuID0gcF9mbG93LT5kYXRhLmFjdGlvbi5vX3ZpZDsKKyAgICAgICAgYWN0aW9uLnByaW9yaXR5ID0gMDsKKyAgICAgICAgc3dpdGNoKHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfUEtUX1RBR19UWVBFX1VOVEFHR0VEOgorICAgICAgICAgICAgICAgIGFjdGlvbi51dF9vdXRlciA9IGJjbVZsYW5BY3Rpb25BZGQ7CisgICAgICAgICAgICAgICAgYWN0aW9uLnV0X291dGVyX3BrdF9wcmlvID0gYmNtVmxhbkFjdGlvbkFkZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfUEtUX1RBR19UWVBFX1NJTkdMRV9UQUc6CisgICAgICAgICAgICAgICAgYWN0aW9uLm90X291dGVyID0gYmNtVmxhbkFjdGlvbkFkZDsKKyAgICAgICAgICAgICAgICBhY3Rpb24ub3Rfb3V0ZXJfcGt0X3ByaW8gPSBiY21WbGFuQWN0aW9uQWRkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFjdGlvbi5uZXdfb3V0ZXJfdmxhbiA9IDA7CisgICAgICAgICAgICAgICAgYWN0aW9uLm90X291dGVyID0gYmNtVmxhbkFjdGlvbk5vbmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIAorICAgICAgICBpZiggcF9mbG93LT5kYXRhLmFjdGlvbi5vX3RwaWQgKQorICAgICAgICB7CisgICAgICAgICAgICBhY3Rpb24ub3V0ZXJfdHBpZF9hY3Rpb24gPSBiY21WbGFuVHBpZEFjdGlvbk1vZGlmeTsKKyAgICAgICAgICAgIGFjdGlvbi5vdXRlcl90cGlkID0gcF9mbG93LT5kYXRhLmFjdGlvbi5vX3RwaWQ7CisgICAgICAgIH0KKwkJCisgICAgfQorICAgIGVsc2UgaWYoQkNNQkFMX0FDVElPTl9DTURfSURfSVNfU0VUKCAmKHBfZmxvdy0+ZGF0YS5hY3Rpb24pLCBCQ01CQUxfQUNUSU9OX0NNRF9JRF9SRU1PVkVfT1VURVJfVEFHKSkKKyAgICB7ICAgCisgICAgICAgIHN3aXRjaChwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5wa3RfdGFnX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9ET1VCTEVfVEFHOgorICAgICAgICAgICAgICAgIC8qIHNob3VsZCBiZSBhY3Rpb24uZHRfb3V0ZXIgPSBiY21WbGFuQWN0aW9uRGVsZXRlLCAKKyAgICAgICAgICAgICAgICAgICBidXQgaXQgZG9lcyBub3Qgc2VlbXMgdG8gd29yay4gVXNpbmcgb3Rfb3V0ZXIgc2VlbXMgdG8gYWxzbyB3b3JrIGZvciBkb3VibGUgdGFnZ2VkIHBhY2tldHMgKi8gCisgICAgICAgICAgICAgICAgYWN0aW9uLm90X291dGVyID0gYmNtVmxhbkFjdGlvbkRlbGV0ZTsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfUEtUX1RBR19UWVBFX1NJTkdMRV9UQUc6CisgICAgICAgICAgICAgICAgYWN0aW9uLm90X291dGVyID0gYmNtVmxhbkFjdGlvbkRlbGV0ZTsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhY3Rpb24udXRfb3V0ZXIgPSBiY21WbGFuQWN0aW9uTm9uZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgfQorICAgIGVsc2UgaWYgKEJDTUJBTF9BQ1RJT05fQ01EX0lEX0lTX1NFVCggJihwX2Zsb3ctPmRhdGEuYWN0aW9uKSwgQkNNQkFMX0FDVElPTl9DTURfSURfWExBVEVfT1VURVJfVEFHKSkKKyAgICB7CisgICAgICAgIGFjdGlvbi5uZXdfb3V0ZXJfdmxhbiA9IHBfZmxvdy0+ZGF0YS5hY3Rpb24ub192aWQ7CisgICAgICAgIHN3aXRjaChwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5wa3RfdGFnX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9ET1VCTEVfVEFHOgorICAgICAgICAgICAgICAgIC8qIHNob3VsZCBiZSBhY3Rpb24uZHRfb3V0ZXIgPSBiY21WbGFuQWN0aW9uUmVwbGFjZSwgCisgICAgICAgICAgICAgICAgICAgYnV0IGl0IGRvZXMgbm90IHNlZW1zIHRvIHdvcmsuIFVzaW5nIG90X291dGVyIHNlZW1zIHRvIGFsc28gd29yayBmb3IgZG91YmxlIHRhZ2dlZCBwYWNrZXRzICovIAorICAgICAgICAgICAgICAgIGFjdGlvbi5vdF9vdXRlciA9IGJjbVZsYW5BY3Rpb25SZXBsYWNlOyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9QS1RfVEFHX1RZUEVfU0lOR0xFX1RBRzoKKyAgICAgICAgICAgICAgICBhY3Rpb24ub3Rfb3V0ZXIgPSBiY21WbGFuQWN0aW9uUmVwbGFjZTsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhY3Rpb24udXRfb3V0ZXIgPSBiY21WbGFuQWN0aW9uTm9uZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9ICAgICAgIAorCisgICAgICAgIC8qKiBAdG9kbyB0cGlkIGlzIG5vdCB0cmFuc2xhdGVkIGZvciBub3cgKi8KKyAgICAgICAgLyoqIEBub3RlIHRoZSB2aWQgdHJhbnNsYXRlZCBmcm9tIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgYXBpIGNhbGwgKi8KKyAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogbm90aGluZyB0byBkbywgcmV0dXJuIE9LICovCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIHJ2ID0gYmNtX3ZsYW5fdHJhbnNsYXRlX2VncmVzc19hY3Rpb25fYWRkKHVuaXQsIGVncG9ydCwgQkNNX1ZMQU5fTk9ORSwgQkNNX1ZMQU5fTk9ORSwgJmFjdGlvbik7CisgICAgaWYoIHJ2ICkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiYmNtX3ZsYW5fdHJhbnNsYXRlX2VncmVzc19hY3Rpb25fYWRkIGZhaWxlZCAlZCBvbiBncG9ydCAweCV4XG4iLCBydiwgZWdwb3J0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICJQZXJmb3JtIGVncmVzcyB2bGFuIHRyYW5zbGF0aW9uIG9uIGdwb3J0IDB4JXhcbiIsIGVncG9ydCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KK30KKy8qKgorICogQGJyaWVmIE11bHRpY2FzdCBmbG93IGFkZCBmdW5jdGlvbiBmb3J3YXJkIHRoZSBzcGVjaWZpZWQgbXVsdGljYXN0IHBhY2tldHMgdG8gYSBtdWx0aWNhc3QgZ3JvdXAuCisgKiAgICAgICAgVGhlIG11bHRpY2FzdCBncm91cCBoYXMgdG8gYmUgY3JlYXRlZCBwcmlvIHRvIHRoZSBtY19mbG93IGFkZCBvcGVyYXRpb24KKyAqIAorICogQHBhcmFtIHBfZmxvdyAgYSBwb2ludGVyIHRvIHRoZSBmbG93IGRlZmluaXRpb24gdGhlIGNyZWF0ZWQgcnVsZSB3aWxsIGJlIGJhc2VkIG9uIAorICogQHBhcmFtIHNlcnZpY2VfdHlwZSBpZCB0aGlzIG11bHRpY2FzdCBmbG93IGlzIGZvciBtdWx0aWNhc3Qgb3IgZG93bnN0cmVhbSBOOjEgc2VydmljZQorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiYWxfc3dfdXRpbF9kcHBfbWNfZmxvd19hZGQoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3csIHVpbnQzMl90IHNlcnZpY2VfdHlwZSkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJjbV9ncG9ydF90IG5uaV9ncG9ydDsKKyAgICBpbnQgaWksIHVuaXQsIHJ2OyAgICAgIAorICAgIGludCBubmk7IAorICAgIGJjbV92bGFuX3QgdnNpOworICAgIGJhbF9zd19mbG93ICpwX2Zsb3dfZWxtOyAgIAorICAgIGJhbF9zd19mbG93IGZsb3dfZWxtOyAgCisgICAgYmFsX3N3X3ZzaV9zZXJ2aWNlICpwX3ZzaV9zdmM7CisgICAgYmFsX3N3X2dyb3VwX2xpc3QgKnBfZ3JvdXBfbGlzdDsKKyAgICB1aW50MzJfdCBzdmNfdGFnX2luZHg7CisgICAgCisgICAgLyogZ2V0IGEgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIGdyb3VwIGluc3RhbmNlICovCisgICAgcF9ncm91cF9saXN0ID0gYmFsX3N3X3V0aWxfZHBwX2dyb3VwX2xpc3RfZ2V0X2J5X2lkKHBfZmxvdy0+ZGF0YS5ncm91cF9pZCk7CisgCisgICAgaWYgKCBwX2dyb3VwX2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICIgRVJST1I6IGdyb3VwICVkIG5vdCBmb3VuZFxuIiwgcF9mbG93LT5kYXRhLmdyb3VwX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7ICAgCisgICAgfQorICAgIAorICAgIHVuaXQgPSBwX2dyb3VwX2xpc3QtPmRldmljZTsgCisKKyAgICAvKiBtYWtlIHN1cmUgdGhpcyBmbG93IGlkIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgKi8KKyAgICBwX2Zsb3dfZWxtID0gYmFsX3N3X3V0aWxfZmxvd19saXN0X2dldF9ieV9pZChwX2Zsb3ctPmtleS5mbG93X2lkKTsKKyAgICBpZiAocF9mbG93X2VsbSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICIgRVJST1I6IGZsb3cgaWQgJWQgdHlwZSAlZCBhbHJlYWR5IGV4aXN0XG4iLHBfZmxvdy0+a2V5LmZsb3dfaWQsIHBfZmxvdy0+a2V5LmZsb3dfdHlwZSk7IAorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisgICAgICAgIAorICAgIGRvIAorICAgIHsgICAgICAgIAorICAgICAgICAvKiBpbml0aWFsaXplIGxpbmsgbGlzdCBmbG93IGVsZW1lbnQgKi8gICAgICAgICAKKyAgICAgICAgbWVtc2V0KCZmbG93X2VsbSwgMCwgc2l6ZW9mIChiYWxfc3dfZmxvdykpOworICAgICAgICAvKiBmaWxsIGluIHRoZSBiYXNpYyBpbmZvICovCisgICAgICAgIGZsb3dfZWxtLmlkID0gcF9mbG93LT5rZXkuZmxvd19pZDsKKyAgICAgICAgZmxvd19lbG0uZGV2aWNlID0gdW5pdDsKKyAgICAgICAgZmxvd19lbG0uZ3JvdXBfaWQgPSBwX2Zsb3ctPmRhdGEuZ3JvdXBfaWQ7CisgICAgICAgIGZsb3dfZWxtLmZsb3dfY29va2llID0gcF9mbG93LT5kYXRhLmNvb2tpZTsgICAgICAgIAorICAKKyAgICAgICAgLyogcGFja2V0IHRhZyB0eXBlIGFyZSByZXF1aXJlZCBmaWVsZHMgd2hlbiBjcmVhdGUgTk5JIExJRiAqLworICAgICAgICAvKiBIZXJlIG1ha2Ugc3VyZSBpdCBpcyB0aGUgc3VwcG9ydGVkIHR5cGUgKi8gICAgICAgIAorICAgICAgICBpZihwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5wa3RfdGFnX3R5cGUgIT0gQkNNQkFMX1BLVF9UQUdfVFlQRV9VTlRBR0dFRCAmJgorICAgICAgICAgICBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5wa3RfdGFnX3R5cGUgIT0gQkNNQkFMX1BLVF9UQUdfVFlQRV9TSU5HTEVfVEFHICYmCisgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSAhPSBCQ01CQUxfUEtUX1RBR19UWVBFX0RPVUJMRV9UQUcpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAiIEVSUk9SOiBNQyBjbGFzc2lmaWVyIHBhY2tldCB0YWcgdHlwZSAweCV4IGlzIGludmFsaWRcbiIsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSk7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAgICAgICAgCisgCisgICAgICAgIC8qIHJldHJpZXZlIHRoZSB2c3dpdGNoIGluc3RhbmNlICovCisgICAgICAgIHBfdnNpX3N2YyA9IHBfZ3JvdXBfbGlzdC0+cF92c2k7CisgICAgICAgIGlmKHBfdnNpX3N2YyA9PSBOVUxMKQorICAgICAgICB7ICAgCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBNQzogdnNpIG5vdCBjcmVhdGVkXG4iKTsgICAgICAgICAKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBicmVhazsgICAgICAKKyAgICAgICAgfQorICAgICAgICB2c2kgPSBwX3ZzaV9zdmMtPnZzd2l0Y2g7CisgICAgICAgIAorICAgICAgICAvKiBhZGQgZmxvdyB0byB0aGUgdnNpIHNlcnZpY2UgdGFnIGxpc3QgKi8KKyAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX3ZzaV9zZXJ2aWNlX3RhZ19hZGQodW5pdCwgcF92c2lfc3ZjLCBwX2Zsb3csICZzdmNfdGFnX2luZHgpOworICAgICAgICBpZiAocmV0ICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGZhaWwgdG8gYWRkIGZsb3cgdG8gdnNpIHNlcnZpY2UgdGFnIGxpc3RcbiIpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWkgPSAwOyAgLyogU3RhcnQgd2l0aCB0aGUgZmlyc3QgTk5JIGxvZ2ljYWwgaW50ZXJmYWNlICovCisgICAgICAgIC8qIGxvb3AgdGhyb3VnaCBhbGwgbm5pIHBvcnQsIGFkZCB0aGVtIHRvIHZzd2l0Y2gsIC0xIGluZGljYXRlIGVuZCBvZiB0YWJsZSAqLworICAgICAgICAvKiBDb25maWd1cmUgdGhlIHN3aXRjaCBubmkgTElGIGJhc2VkIG9uIGNsYXNzaWZpZXIgaW4gdGhlIGZsb3cuICovICAgICAgICAgICAKKyAgICAgICAgd2hpbGUoLTEgIT0gKG5uaSA9IGJhbF9iY21fbmV0X2luZl9wYm1fZ2V0KGlpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNraXAgbm5pIHBvcnQgdGhhdCBpcyBub3QgaW4gdGhlIHNhbWUgZGV2aWNlIG9yIG5vdCB2YWxpZCAqLworICAgICAgICAgICAgaWYgKCBiYWxfYmNtX25ldF9pbmZfZGV2X2dldChpaSkgIT0gdW5pdCAgIHx8CisgICAgICAgICAgICAgICAgIEJDTU9TX0ZBTFNFID09IGJjbV90b3BvX25uaV9pc192YWxpZChpaSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWkrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgICAvKiBpZiBubmkgcG9ydCBpcyBzcGVjaWZpZWQgaW4gdGhlIGZsb3csIHNraXAgdGhlIG90aGVyIG5uaSBwb3J0cyAqLworICAgICAgICAgICAgaWYgKCBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgbmV0d29ya19pbnRfaWQpICYmCisgICAgICAgICAgICAgICAgIGlpICE9IHBfZmxvdy0+ZGF0YS5uZXR3b3JrX2ludF9pZAorICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlpKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBjcmVhdGUgZ3BvcnQgYmFzZWQgb24gbm5pIHBoeXNpY2FsIHBvcnQgbnVtYmVyICovCisgICAgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfcG9ydF9hZGQodW5pdCwgcF92c2lfc3ZjLCBzdmNfdGFnX2luZHgsIG5uaSwgJm5uaV9ncG9ydCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgZmFpbCB0byBhZGQgbm5pICVkIHRvIHZzaVxuIiwgbm5pKTsKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBpZiBETUFDIGlzIHNldCwgY3JlYXRlIGEgTDIgZW50cnksIG90aGVyd2lzZSBmbG9vZCB1bmtub3duIHRvIHRoZSBncm91cCAqLworICAgICAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgZHN0X21hYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYWRkIHN0YXRpYyBNQyAwMTowMDo1RTowMDowMDpzdGFydF9tYyB0byB0aGUgZG93c3RyZWFtIE1DIGdyb3VwICovCisgICAgICAgICAgICAgICAgYmNtX2wyX2FkZHJfdCBsMmFkZHI7CisgICAgICAgICAgICAgICAgYmNtX21hY190IG1jX21hYzsKKworICAgICAgICAgICAgICAgIC8qIEFkZCBtYyBtYWMgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgIG1lbWNweSgmbWNfbWFjLCAmKHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmRzdF9tYWMpLCBzaXplb2YoYmNtX21hY190KSk7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBiY21fbDJfYWRkcl90X2luaXQoJmwyYWRkciwgbWNfbWFjLCB2c2kpOyAKKyAgICAgICAgICAgICAgICBsMmFkZHIuZmxhZ3MgPSBCQ01fTDJfU1RBVElDIHwgQkNNX0wyX01DQVNUOworICAgICAgICAgICAgICAgIC8qIGRpcmVjdCBvdXRwdXQgdG8gdGhlIE1DIGdyb3VwICovCisgICAgICAgICAgICAgICAgbDJhZGRyLmwybWNfZ3JvdXAgPSBwX2dyb3VwX2xpc3QtPmwyX2dycF9pZDsgCisKKyAgICAgICAgICAgICAgICBydiA9IGJjbV9sMl9hZGRyX2FkZCh1bml0LCAmbDJhZGRyKTsKKyAgICAgICAgICAgICAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCJFcnJvcjogYmNtX2wyX2FkZHJfYWRkIE1DIHJldHVybmVkICVzIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbV9lcnJtc2cocnYpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcnYgPSBiY21fcG9ydF9jb250cm9sX3NldCh1bml0LCBubmlfZ3BvcnQsIGJjbVBvcnRDb250cm9sRmxvb2RVbmtub3duTWNhc3RHcm91cCwgQkFMX0RQUF9NQ19PRkZTRVQpOworICAgICAgICAgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgTUM6IGJjbV9wb3J0X2NvbnRyb2xfc2V0IGZvciBubmkgZmFpbGVkICVkXG4iLCBydik7ICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZmxvd19lbG0ubnVtX25ldCsrOworICAgICAgICAgICAgZmxvd19lbG0ubmV0X3BvcnRbaWldID0gbm5pX2dwb3J0OworICAgICAgICAgICAKKyAgICAgICAgICAgIGlpKys7IC8qIE5leHQgTk5JICovICAgICAgICAgICAgCisgICAgICAgIH0gCisgICAgICAgIC8qIHNraXAgdGhlIHJlc3QgaWYgYW55dGhpbmcgZ29lcyB3cm9uZyAqLyAgICAgICAgCisgICAgICAgIGlmKCByZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgIC8qIHBlcmZvcm0gdmxhbiB0cmFuc2xhdGlvbiBvbiBubmkgcG9ydCAqLyAKKyAgICAgICAgaWYgKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3csIGZsb3csIGFjdGlvbikpIAorICAgICAgICB7IAorICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwgIldhcm5pbmcsIGFjdGlvbiBmb3IgbXVsdGljYXN0IGZsb3cgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfSB3aGlsZSgwKTsKKworICAgIGlmKCByZXQgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIGluY3JlYXNlIHRoZSBncm91cCByZWZlcmVuY2UgY291bnQgKi8KKyAgICAgICAgcF9ncm91cF9saXN0LT51c2VfY291bnQrKzsKKyAgICAgICAgLyogaW5jcmVhc2UgdGhlIHZzaSByZWZlcmVuY2UgY291bnQgKi8KKyAgICAgICAgcF92c2lfc3ZjLT51c2VfY291bnQrKzsKKyAgICAgICAgLyogYWRkIHRoZSBmbG93IGluZm8gdG8gdGhlIGZsb3cgbGluayBsaXN0ICovICAgICAgICAgCisgICAgICAgIGZsb3dfZWxtLnBfdnNpX3N2YyA9IHBfdnNpX3N2YzsKKyAgICAgICAgZmxvd19lbG0ubnVtX3BvbiA9IDA7CisgICAgICAgIGZsb3dfZWxtLnR5cGUgPSBzZXJ2aWNlX3R5cGU7CisgICAgICAgIC8qIG5uaSBwb3J0cyBhcmUgZG9uZSBpbiB0aGUgbm5pIGxvb3AgKi8KKyAgICAgICAgZmxvd19lbG0udmFsaWQgPSAxOworICAgICAgICBiYWxfc3dfdXRpbF9mbG93X2xpc3RfaW5zZXJ0KGZsb3dfZWxtKTsgICAKKyAgICAgICAKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkFkZCBmbG93X2VsbSAlZCAgdHlwZSAlZCwgdnN3aXRjaCAweCV4LCBncm91cF9pZCAlZCBTdWNjZXNzXG4iLCBmbG93X2VsbS5pZCwgZmxvd19lbG0udHlwZSwgcF92c2lfc3ZjLT52c3dpdGNoLCBmbG93X2VsbS5ncm91cF9pZCk7ICAgICAgICAKKyAgICB9ICAgICAgICAKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBIVyBsaW1pdGF0aW9uIG9uIG1heCBidXJzdCByYXRlIC0gYnBzICovCisjZGVmaW5lIEJBTF9NQVhfQlVSU1RfUkFURSAoMSA8PCAxNikKKworLyoqCisgKiBAYnJpZWYgVGhlIGZsb3cgYWRkIGZ1bmN0aW9uIHByb2dyYW0gRFBQIHRvIGZvcndhcmQgcGFja2V0cyB0aGF0IGhhdmUKKyAqIHNwZWNpZmllZCBhdHRyaWJ1dGVzIHRvIHRoZSBkZXNpZ25hdGVkIHBvcnRzLgorICogVGhlIHBhY2tldHMgaXMgbW9kaWZpZWQgYmVmb3JlIGVncmVzcworICogSW4gY2FzZSBJV0YgaXMgaW4gRElSRUNUIE1PREUsIAorICogT24gdGhlIGRvd25zdHJlYW0sIGEgdHVubmVsIGlkIChvdXRlciB2bGFuIHRhZykgaXMgYWRkZWQgdG8gdGhlIHBhY2tldHMKKyAqIE9uIHRoZSB1cHN0cmVhbSwgb3V0ZXIgdmxhbiB0YWcgKHR1bm5lbCBpZCkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBwYWNrZXRzCisgKiBJbiBjYXNlIElXRiBpcyBpbiBQRVJfRkxPV19NT0RFLCBjdXJyZW50bHkgbm90IHN1cHBvcnRlZAorICoKKyAqIEBub3RlIGEgZmxvdyBjYW4gYmUgY3JlYXRlZCB3aGljaCBkb2VzIFZJRCB0cmFuc2xhdGlvbiBiZXR3ZWVuIFYgJiBVIChyZWZlciB0byBUUjE1NikgaW50ZXJmYWNlcy4KKyAqCisgKiBAbm90ZSBUaGlzIHJvdXRpbmUgYWRkcyBmbG93IGZvciBib3RoIHVwc3RyZWFtIGFuZCBkb3duc3RyZWFtIGRpcmVjdGlvbiBpLmUuIGNyZWF0ZSBQT04gJiBOTkkgTElGcworICogZm9yIGJvdGggZGlyZWN0aW9ucyBpbiBhIHNhbWUgY2FsbCB0byB0aGlzIHJvdXRpbmUgLSBhbmQgYWxsIHRoaXMgYXMgcGFydCBvZiBhIHNpbmdsZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gCisgKiBmcm9tIHRoZSBhcHBsaWNhdGlvbiBtb2R1bGUgb3IgQ0xJLiAKKyAqIEl0IGFsc28gcHJvZ3JhbXMgdGhlIGVncmVzcyB2bGFuIHRyYW5zbGF0aW9uIG1vZHVsZXMgZm9yIGJvdGggdXBzdHJlYW0gYW5kIGRvd25zdHJlYW0uIAorICoKKyAqIEBub3RlICBUaGUgZ2VuZXJhbCBzZXF1ZW5jZSBpczoKKyAqICBcbGkgY3JlYXRlIFBPTiBMSUYgd2l0aCBtYXRjaGluZyBpbmdyZXNzIHR1bm5lbCBpZCAoYW5kIHZsYW4gaWQsIGlmIHVwc3RyZWFtIHBrdHMgYXJlIHZsYW4gdGFnZ2VkKQorICogIFxsaSBuZXh0LCBjb25maWd1cmUgZWdyZXNzIHZsYW4gdHJhbnNsYXRpb24gb24gUE9OIHNpZGUgKGZvciBkb3duc3RyZWFtIHBrdHMpCisgKiAgXGxpIGNyZWF0ZSBOTkkgTElGIHdpdGggbWF0Y2hpbmcgaW5ncmVzcyB2bGFuIGlkIChjdXJyZW50bHkgYnkgZGVmYXVsdCBpdCBhc3N1bWVzIGRvd25zdHJlYW0gcGFja2V0cyBhcmUgdGFnZ2VkKQorICogIFxsaSBuZXh0LCBjb25maWd1cmUgZWdyZXNzIHZsYW4gdHJhbnNsYXRpb24gb24gTk5JIHNpZGUgKGZvciB1cHN0cmVhbSBwa3RzKQorICoKKyAqIEBwYXJhbSBpd2ZfbW9kZSBUaGUgSW50ZXJXb3JraW5nIEZ1bmN0aW9uIG1vZGUgLSBESVJFQ1Qgb3IgUEVSLUZMT1cKKyAqIEBwYXJhbSBwX2Zsb3cgQSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgYWRkIGZsb3cgaW5mbworICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJhbF9zd191dGlsX2RwcF9mbG93X2FkZChiY21iYWxfaXdmX21vZGUgaXdmX21vZGUsICBiY21iYWxfZmxvd19jZmcgKnBfZmxvdykKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJjbV9ncG9ydF90IHBvbl9ncG9ydCwgbm5pX2dwb3J0OworICAgIGJjbV92bGFuX3QgdHVubmVsX2lkOyAgICAKKyAgICBpbnQgaWksIHVuaXQsIHJ2OyAgICAgIAorICAgIGJjbV92bGFuX3BvcnRfdCB2cDsKKyAgICBpbnQgcG9uLCBubmksIHN5c19wb247IAorICAgIGJjbV92bGFuX3QgdnNpOworICAgIGludCBwb25fZW5jYXBfaWQ7ICAKKyAgICBiYWxfc3dfZmxvdyAqcF9mbG93X2VsbTsKKyAgICB1aW50MzJfdCBmbG93X3R5cGUsIG1heF9idXJzdCwgc3ZjX3RhZ19pbmR4OyAgIAorICAgIGJhbF9zd19mbG93IGZsb3dfZWxtOyAgCisgICAgYmFsX3N3X2RwcF9xb3Nfc2VydmljZV9jZmcgKnBfc2VydmljZV9jZmcgPSBOVUxMOyAgIAorICAgIGJjbWJhbF9mbG93X2NmZyBmbG93X3JldjsgIC8qIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24gaW4gb3Bwb3NpdGUgZGlyZWN0aW9uICovCisgICAgYmNtYmFsX2Zsb3dfY2ZnICpwX3VzX2Zsb3csICpwX2RzX2Zsb3c7CisgICAgYmFsX3N3X3ZzaV9zZXJ2aWNlICpwX3ZzaV9zdmM7CisgICAgICAgIAorICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAiIEdvdCBhbiBEUFAgZmxvdyByZXF1ZXN0IC0gaXdmX21vZGU9JWQgZmxvd19pZD0lZCBmbG93X3R5cGU9JWQsICBzdWJfcG9ydD0lZCBzdmNfaWQ9JWRcbiIsCisgICAgICAgICAgICBpd2ZfbW9kZSwgCisgICAgICAgICAgICBwX2Zsb3ctPmtleS5mbG93X2lkLCBwX2Zsb3ctPmtleS5mbG93X3R5cGUsIHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkLCBwX2Zsb3ctPmRhdGEuc3ZjX3BvcnRfaWQpOworICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgIiBjbGFzc2lmaWVyIC0gbWFzaz0weCV4IG90cGlkPSV4IGl0cGlkPSV4IG92aWQ9JXggaXZpZD0leFxuIiwKKyAgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnByZXNlbmNlX21hc2ssCisgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3RwaWQsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmlfdHBpZCwKKyAgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fdmlkLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5pX3ZpZCk7CisgICAgCisgICAgCisgICAgaWYgKCBpd2ZfbW9kZSAhPSBCQ01CQUxfSVdGX01PREVfRElSRUNUX01BUFBJTkcpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIiBFUlJPUjogbm90IHN1cHBvcnRlZCBJV0YgbW9kZSAtICVkXG4iLCBpd2ZfbW9kZSk7IAorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIGlmIChCQ01PU19UUlVFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93LCBmbG93LCBhY3Rpb24pKSAKKyAgICB7CisgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICIgYWN0aW9uLnBhcmFtczogLmNtZHNfYml0bWFzaz0weCV4LCAuaW5wdXRfcGt0X3RhZ190eXBlPTB4JXhcbiIsIAorICAgICAgICAgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuYWN0aW9uLmNtZHNfYml0bWFzaywgCisgICAgICAgICAgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSk7CisgICAgfQorCisgICAgaWYgKHBfZmxvdy0+a2V5LmZsb3dfdHlwZSA9PSBCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU0gJiYKKyAgICAgICAgQkNNT1NfVFJVRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgc2xhKSAmJgorICAgICAgICBwX2Zsb3ctPmRhdGEuc2xhLm1heF9yYXRlIDwgcF9mbG93LT5kYXRhLnNsYS5taW5fcmF0ZSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAiIEVSUk9SOiBNYXggcmF0ZSAlZCBrYnBzIGlzIG5vdCA+PSBNaW4gcmF0ZSAlZCBrYnBzXG4iLCBwX2Zsb3ctPmRhdGEuc2xhLm1heF9yYXRlLCBwX2Zsb3ctPmRhdGEuc2xhLm1pbl9yYXRlICk7IAorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KKyAgICAKKyAgICBzd2l0Y2gocF9mbG93LT5rZXkuZmxvd190eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU06CisgICAgICAgICAgICBmbG93X3R5cGUgPSBCQUxfU1dfRkxPV19UWVBFX0RPV05TVFJFQU07CisgICAgICAgICAgICAvKiBmb3IgZG93bnN0cmVhbSBOOjEgc2VydmljZSwgc2FtZSBmbG9vZCBzZXR0aW5ncyBhcyBtdWx0aWNhc3QgZmxvdyAqLworICAgICAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgZ3JvdXBfaWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAgYmFsX3N3X3V0aWxfZHBwX21jX2Zsb3dfYWRkKHBfZmxvdywgQkFMX1NXX0ZMT1dfVFlQRV9ET1dOU1RSRUFNKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNOgorICAgICAgICAgICAgZmxvd190eXBlID0gQkFMX1NXX0ZMT1dfVFlQRV9VUFNUUkVBTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9GTE9XX1RZUEVfTVVMVElDQVNUOgorICAgICAgICAgICAgcmV0dXJuICBiYWxfc3dfdXRpbF9kcHBfbWNfZmxvd19hZGQocF9mbG93LCBCQ01CQUxfRkxPV19UWVBFX01VTFRJQ0FTVCk7ICAgICAgIAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsgICAgICAgICAgICAKKyAgICB9CisgICAgCisgICAgdW5pdCA9IGJhbF9iY21fcG9uX2luZl9kZXZfZ2V0KHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkKTsgCisgICAgLyogV2UgcHJvZ3JhbSBhIGZsb3cgd2l0aCAzIHN3aXRjaCBjb21wb25lbnRzLCBpbkxJRiwgdlN3aXRjaCBhbmQgb3V0TElGLiAKKyAgICAgICBMSUYgaXMgYWx3YXlzIGJpLWRpcmVjdGlvbmFsIG9wZXJhdGlvbiwgc28gZm9yIHVuaS1kaXJlY3Rpb25hbCBmbG93IHdlIHByb2dyYW1tZWQgYW4gaW5ncmVzcyBvciBlZ3Jlc3MgRFJPUAorICAgICAgIG9uIFBPTiBiYXNlZCBvbiB0aGUgQkFMIGZsb3cgZGlyZWN0aW9uLiBMYXRlciwgd2hlbiB0aGUgQkFMIGZsb3cgZnJvbSB0aGUgb3RoZXIgZGlyZWN0aW9uIGlzIFNFVCwgd2UKKyAgICAgICByZW1vdmUgdGhlIERST1AgZnJvbSB0aGUgUE9OLgorICAgICAgIFRoaXMgaW1wbHkgdGhhdCB0d28gQkFMIGZsb3dzIHdpdGggc2FtZSBpZCBtdXN0IGhhdmUgc3ltbWV0cnkgdmxhbiBtYW5pcHVsYXRpb24gb3BlcmF0aW9ucy4KKyAgICAqLworICAgIHBfZmxvd19lbG0gPSBiYWxfc3dfdXRpbF9mbG93X2xpc3RfZ2V0X2J5X2lkKHBfZmxvdy0+a2V5LmZsb3dfaWQpOworICAgIGlmIChwX2Zsb3dfZWxtKQorICAgIHsKKyAgICAgICAgLyogQ2hlY2sgaWYgZmxvdyB3aXRoIHNhbWUgaWQgYW5kIHR5cGUgZXhpc3Qgb3Igbm90LiAKKyAgICAgICAgICAgSWYgZG93bnN0cmVhbSBleGlzdCwgcmVtb3ZlIHRoZSBESVNDQVJEX0lOR1JFU1MgZnJvbSBQT04gcG9ydCBieSBzZXQgaXQgdG8gRElTQ0FSRF9OT05FLgorICAgICAgICAgICBJZiB1cHN0cmVhbSBleGlzdCwgICByZW1vdmUgdGhlIERJU0NBUkRfRUdSRVNTIGZyb20gUE9OIHBvcnQgYnkgc2V0IGl0IHRvIERJU0NBUkRfTk9ORS4gICAgICAgICAgICAKKyAgICAgICAgICAgQXN5bW1ldHJ5IG9wZXJhdGlvbnMgbmVlZCB0d28gZmxvd3Mgd2l0aCBkaWZmZXJlbnQgSUQgLSBlYWNoIGZsb3cgaW4gdW5pLWRpcmVjdGlvbiAqLyAgICAgICAgCisgICAgICAgIGlmKCEocF9mbG93X2VsbS0+dHlwZSAmIGZsb3dfdHlwZSkpCisgICAgICAgIHsgIAorICAgICAgICAgICAgYmNtYmFsX2Zsb3dfY2ZnICpwX3JlZl9mbG93ID0gTlVMTDsKKyAgICAgICAgICAgIGJjbWJhbF9mbG93X2tleSBrZXk7CisgICAgICAgICAgICAvKiByZXRyaWV2ZSB0aGUgY2xhc3NpZmllciBvbiB0aGUgb3RoZXIgZmxvdyBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgIGtleS5mbG93X2lkID0gcF9mbG93LT5rZXkuZmxvd19pZDsKKyAgICAgICAgICAgIGtleS5mbG93X3R5cGUgPSAocF9mbG93LT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSk/IEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gOiBCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU07CisgICAgICAgICAgICBwX3JlZl9mbG93ID0gZmxvd19nZXRfY3VycmVudF9pbmZvX2J5X2tleShrZXkpOworICAgICAgICAgICAgaWYoTlVMTCA9PSBwX3JlZl9mbG93KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgIiBFUlJPUjogQ2FuJ3QgbG9jYXRlIGZsb3cgJWQgdHlwZSAlZCBpbmZvIGZyb20gbWFpbiBEQlxuIiwga2V5LmZsb3dfaWQsIGtleS5mbG93X3R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIGNoZWNrIHRoZSBzeW1tZXRyaWNhbCBwcm9wZXJ0aWVzIGJldHdlZW4gdHdvIGZsb3dzICovCisgICAgICAgICAgICBpZiAoQkNNT1NfRkFMU0UgPT0gYmFsX3N3X3V0aWxfaXNfc3ltbWV0cnlfZmxvd3MocF9mbG93LCBwX3JlZl9mbG93KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgRVJST1I6IEZsb3cgJWQgZG9lcyBub3QgaGF2ZSBzeW1tZXRyeSBjbGFzc2lmaWVyc1xuIiwga2V5LmZsb3dfaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogaWYgdGhlcmUgaXMgU0xBIGluIGRvd25zdHJlYW0sIHJlbW92ZSB0aGUgVVMgZmxvdyAoIExJRnMgJiBWU1dJVENIKSBhbmQgYnVpbGQgYSBuZXcgYmktZGlyZWN0aW9uIGZsb3cuCisgICAgICAgICAgICAgICBUaGlzIGlzIGJlY2F1c2UgTElGIGlzIGFsd2F5cyBiaS1kaXJlY3Rpb25hbCBhbmQgd2hlbiB0aGUgVVMgZmxvdyBpcyBjcmVhdGVkIHRoZSBQT04gTElGIGhhcyBubyBkb3duc3RyZWFtIFZPUS4KKyAgICAgICAgICAgICAgIE9uZSBuZWVkcyB0byBjcmVhdGUgYSBuZXcgUE9OIExJRiB3aXRoIFZPUSBmb3IgU0xBLiBUaGVyZSBpcyBubyBlYXN5IHdheSB0byBhZGQgVk9RIHRvIGFuIGV4aXN0aW5nIExJRi4gKi8KKyAgICAgICAgICAgIGlmKCBwX2Zsb3ctPmtleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNICYmCisgICAgICAgICAgICAgICAgQkNNT1NfVFJVRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgc2xhKSAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHJlbW92ZSB0aGUgZXhpc3RpbmcgVVMgZmxvdyAqLyAKKyAgICAgICAgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfZmxvd19yZW1vdmVfaW50KHBfZmxvd19lbG0pOworICAgICAgICAgICAgICAgIGlmKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBFUlJPUjogZmFpbCB0byByZW1vdmUgZmxvdyAlZCBmcm9tIHRoZSBsaXN0XG4iLCBwX2Zsb3ctPmtleS5mbG93X2lkKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZmxvd190eXBlID0gQkFMX1NXX0ZMT1dfVFlQRV9ET1dOU1RSRUFNIHwgQkFMX1NXX0ZMT1dfVFlQRV9VUFNUUkVBTTsKKyAgICAgICAgICAgICAgICAvKiBnb3RvIHJlZ3VsYXIgcGF0aCB0byBjcmVhdGUgYmktZGlyZWN0aW9uYWwgZmxvdyAqLworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAvKiBpZiBubyBTTEEgYW5kIHRoZSBjbGFzc2lmaWVyIGlzIG1vcmUgdGhhbiBqdXN0IHBvcnQgKyBWTEFOIHRhZ3MsIGFkZCBBQ0wgcnVsZSB0byByZS1kaXJlY3QgcGFja2V0IHRvIGVncmVzcyBwb3J0LgorICAgICAgICAgICAgICAgVGhpcyBieXBhc3MgdGhlIGluZ3Jlc3MgTElGIGFzIExJRiBjaGVjayBWSUQgb25seS4gCisgICAgICAgICAgICAgICBVcHN0cmVhbSBjbGFzc2lmaWNhdGlvbiBpcyBleHBlY3RlZCB0byBiZSBkb25lIGluIE9OVSAob251IGFkZCBHRU0gYmFzZWQgb24gY2xhc3NpZmllcnMgZm9yIHVwc3RyZWFtKSwgCisgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VzcyBhZnRlciBjb21wbGV0ZSBhcyB0aGVyZSBpcyBubyBvdGhlciBjaGFuZ2VzIG5lZWRlZCBmb3IgZXhpc3RpbmcgZmxvdy4KKyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgYmNtb3NfYm9vbCBpc19ubmlfc2V0ID0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3csIGZsb3csIG5ldHdvcmtfaW50X2lkKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggcF9mbG93LT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSAgJiYKKyAgICAgICAgICAgICAgICAgICAgYmFsX3N3X3V0aWxfZmxvd19kc19hY2xfY2xzX2NoayhwX2Zsb3cpID09IEJDTU9TX1RSVUUgICAgICkKKyAgICAgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7ICBpIDwgcF9mbG93X2VsbS0+bnVtX3BvbjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaWk9MDsgaWkgPCBwX2Zsb3dfZWxtLT5udW1fbmV0OyBpaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgZ2V0IHRoZSBJTkcgbG9naWNhbCBwb3J0IGZyb20gZ3BvcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21fdmxhbl9wb3J0X3QgdG1wX3ZwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbV92bGFuX3BvcnRfdF9pbml0KCZ0bXBfdnApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF92cC52bGFuX3BvcnRfaWQgPSBwX2Zsb3dfZWxtLT5uZXRfcG9ydFtpaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYmNtX3ZsYW5fcG9ydF9maW5kKHVuaXQsICZ0bXBfdnApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBXYXJuaW5nOiBmYWlsIHRvIHJldHJpZXZlIGxvZ2ljYWwgcG9ydCBmcm9tIGdwb3J0IDB4JXhcbiIsIHBfZmxvd19lbG0tPm5ldF9wb3J0W2lpXSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBubmkgcG9ydCBpcyBzcGVjaWZpZWQgaW4gdGhlIGZsb3csIHNraXAgdGhlIG90aGVyIG5uaSBwb3J0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggQkNNT1NfVFJVRSA9PSBpc19ubmlfc2V0ICYmICB0bXBfdnAucG9ydCAhPSBiYWxfYmNtX25ldF9pbmZfcGJtX2dldChwX2Zsb3ctPmRhdGEubmV0d29ya19pbnRfaWQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIG5uaSBpcyBzZXQsIGl0IGhhcyB0byBiZSBpbiB0aGUgbm5pIGxpc3Qgb2YgdGhlIG9wcG9zaXQgRkxPVyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdGhlIHJldHVybiB0byBCQ01fRVJSX0lOVEVSTkFMLCBpbiBjYXNlIGl0IHJlYWNoIHRoZSBlbmQgb2YgZm9yLWxvb3AuICovIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUnVsZSBuZWVkIHRvIG1hdGNoIHRoZSBpbmdyZXNzIHBvcnQsIG90aGVyd2lzZSwgaXQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgLSBubmkgYW5kIHBvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggQkNNT1NfVFJVRSAhPSBpc19ubmlfc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQocF9mbG93LCBmbG93LCBuZXR3b3JrX2ludF9pZCwgYmFsX2JjbV9uZXRfaW5mX2lkeF9nZXQodG1wX3ZwLnBvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX2FjbF9hZGQodW5pdCwgcF9mbG93LCBwX2Zsb3dfZWxtLCAgcF9mbG93X2VsbS0+bmV0X3BvcnRbaWldLCBwX2Zsb3dfZWxtLT5wb25fcG9ydFtpXSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggQkNNT1NfVFJVRSAhPSBpc19ubmlfc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0NMRUFSKHBfZmxvdywgZmxvdywgbmV0d29ya19pbnRfaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGZhaWwgdG8gYWRkIGZvcndhcmRpbmcgYWNsIG9uIG5uaSAlZCwgcmV0ID0gJWRcbiIsIHJldCwgaWkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkIGEgZGZ0IGRyb3AgcnVsZSAocHJpb3JpdHkgMCkgb24gdGhlIExJRiB0byBkcm9wIHBhY2tldHMgdGhhdCBtYXRjaCBWSUQgYnV0IG5vIG1hdGNoIGZvciBvdGhlciBmaWVsZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfZGZ0X2FjbF9hZGQodW5pdCwgcF9mbG93LCBwX2Zsb3dfZWxtLCBwX2Zsb3dfZWxtLT5uZXRfcG9ydFtpaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGZhaWwgdG8gYWRkIGRlZmF1bHQgYWNsIG9uIG5uaT0weCV4LCByZXQgPSAlZFxuIiwgcF9mbG93X2VsbS0+bmV0X3BvcnRbaWldLCByZXQpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZihyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgRVJST1I6IGZhaWwgdG8gYWRkIERTIEFDTCB0byBubmlfJWQgaW4gZmxvdyBpZCAlZCBmcm9tIHRoZSBsaXN0XG4iLCBpaSxwX2Zsb3ctPmtleS5mbG93X2lkKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIC8qIElmIHRoZSBVUyBhbmQgRFMgaGFzIGFzeW1tZXRyaWNhbCBuYXR1cmUsIHdlIG9ubHkgcHJvZ3JhbSBjb21tb24gcGFydCAoVklEKSB3aGVuIGNyZWF0ZSB0aGUgTElGCisgICAgICAgICAgICAgICAgICAgV2UgbmVlZCBhbiBBQ0wgcnVsZSB0byBwZXJmb3JtIHVwc3RyZWFtIHNwZWNpZmljIGNsYXNzaWZpY2F0aW9uIGFuZCBmb3J3YXJkaW5nLgorICAgICAgICAgICAgICAgICAgIEluIGFkZGl0aW9uLCBBQ0wgYWxsb3cgdXBzdHJlYW0gZmxvd3MgdG8gYmUgcHJpb3JpdGl6ZWQgYmFzZWQgb24gcHJpb3JpdHkgZmllbGQuKi8KKyAgICAgICAgICAgICAgICBpZiggcF9mbG93LT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gICYmCisgICAgICAgICAgICAgICAgICAgIGJhbF9zd191dGlsX2Zsb3dfdXNfYWNsX2Nsc19jaGsocF9mbG93KSA9PSBCQ01PU19UUlVFICAmJgorICAgICAgICAgICAgICAgICAgIC8qIHRoZXJlIGFyZSBpc3N1ZXMgdXNpbmcgdHJhZGl0aW9uYWwgQVBJIGZvciBQT04gYXBwbGljYXRpb24gd2hlbiBlZ3Jlc3MgdmxhbiB0cmFuc2xhdGlvbiBhbmQgaW5ncmVzcyBBQ0wgYXJlIGJvdGggYWN0aXZlLgorICAgICAgICAgICAgICAgICAgICAgICBFbmFibGUgdGhlIEFDTCBvbmx5IHdoZW4gdGhlcmUgaXMgbm8gdmxhbiBhY3Rpb24gLSBUQkQgKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNT1NfRkFMU0UgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3csIGZsb3csIGFjdGlvbikpCisgICAgICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIEJDTU9TX0ZBTFNFID09IGlzX25uaV9zZXQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEVSUk9SOiBVcHN0cmVhbSBjbGFzc2lmaWVyIGluIGFkZGl0aW9uIHRvIFZJRCB3aXRob3V0IHNldHRpbmcgTk5JIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgIGkgPCBwX2Zsb3dfZWxtLT5udW1fcG9uOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGJhbF9zd191dGlsX2RwcF9hY2xfYWRkKHVuaXQsIHBfZmxvdywgcF9mbG93X2VsbSwgIHBfZmxvd19lbG0tPnBvbl9wb3J0W2ldLCBwX2Zsb3dfZWxtLT5uZXRfcG9ydFtwX2Zsb3ctPmRhdGEubmV0d29ya19pbnRfaWRdKTsgCisJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgZmFpbCB0byBhZGQgZm9yd2FyZGluZyBhY2wgb24gcG9uICVkLCByZXQgPSAlZFxuIiwgcmV0LCBpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCBhIGRlZmF1bHQgZHJvcCBydWxlIChwcmlvcml0eSAwKSBvbiB0aGUgTElGIHRvIGRyb3AgcGFja2V0cyB0aGF0IG1hdGNoIFZJRCBidXQgbm8gbWF0Y2ggZm9yIG90aGVyIGZpZWxkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX2RmdF9hY2xfYWRkKHVuaXQsIHBfZmxvdywgcF9mbG93X2VsbSwgcF9mbG93X2VsbS0+cG9uX3BvcnRbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGZhaWwgdG8gYWRkIGRlZmF1bHQgYWNsIG9uIHBvbj0weCV4LCByZXQgPSAlZFxuIiwgcF9mbG93X2VsbS0+cG9uX3BvcnRbaV0sIHJldCk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgIAorICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZihyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgRVJST1I6IGZhaWwgdG8gYWRkIFVTIEFDTCB0byBwb25fJWQgaW4gZmxvdyBpZCAlZCBmcm9tIHRoZSBsaXN0XG4iLCBpLCBwX2Zsb3ctPmtleS5mbG93X2lkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgfSAJCQkJCisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgcmVtb3ZlIHBhY2tldCBkaXNjYXJkIGZ1bmN0aW9uIGZyb20gUE9OIGluIGZsb3cgaWQgJWQgXG4iLHBfZmxvdy0+a2V5LmZsb3dfaWQpOworICAgICAgICAgICAgICAgIC8qIHJlbW92ZSB0aGUgUE9OIHBvcnRzIGZyb20gRElTQ0FSRF9YWFggbW9kZSAgKi8KKyAgICAgICAgICAgICAgICBmb3IoaWk9MDsgaWk8cF9mbG93X2VsbS0+bnVtX3BvbjsgaWkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHBfZmxvd19lbG0tPnBvbl9wb3J0W2lpXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBQT04gTElGIGlzIGRlbGV0ZWQsIHRoZW4gY29udGludWUgdG8gdGhlIG5leHQgb25lICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJldCA9IGJjbV9wb3J0X2Rpc2NhcmRfc2V0KHBfZmxvd19lbG0tPmRldmljZSwgcF9mbG93X2VsbS0+cG9uX3BvcnRbaWldLCBCQ01fUE9SVF9ESVNDQVJEX05PTkUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgICAgICBpZihyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgRVJST1I6IGZhaWwgdG8gcmVtb3ZlIHBhY2tldCBkaXNjYXJkIGZyb20gcG9uXyVkIGluIGZsb3cgaWQgJWQgZnJvbSB0aGUgbGlzdFxuIiwgaWkscF9mbG93LT5rZXkuZmxvd19pZCk7IAorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsgIAorICAgICAgICAgICAgICAgICAgICAvKiBhZGQgZmxvdyB0eXBlIHRvIHRoZSBleGlzdCBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgIHBfZmxvd19lbG0tPnR5cGUgfD0gZmxvd190eXBlOyAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgLyogc2FtZSBpZCBhbmQgdHlwZSBpcyBhbiBlcnJvciAgLSB3ZSBkbyBub3QgY2hlY2sgaWYgY29udGVudHMgYXJlIHRoZSBzYW1lIG9yIG5vdCAqLworICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIiBFUlJPUjogZmxvdyBpZCAlZCB0eXBlICVkIGFscmVhZHkgZXhpc3RcbiIscF9mbG93LT5rZXkuZmxvd19pZCwgcF9mbG93LT5rZXkuZmxvd190eXBlKTsgCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgLyogCisgICAgICogRmlyc3QsIHZhbGlkYXRlIHRoYXQgdGhlIHNwZWNpZmllZCBQT04gaGFzIGF0IGxlYXN0IG9uZSBOTkkgcG9ydCBvbiB0aGUgc2FtZSBkZXZpY2UuCisgICAgICogSWYgbm90LCByZXR1cm4gYW4gZXJyb3IsIGFzIHRoaXMgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBpaSA9IDA7CisgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIC8qIHdhbGsgdGhyb3VnaCB0aGUgZW50aXJlIG1hcHBpbmcgdGFibGUgKi8KKyAgICB3aGlsZSgtMSAhPSBiYWxfYmNtX25ldF9pbmZfcGJtX2dldChpaSkpCisgICAgeworICAgICAgICBpZihiYWxfYmNtX25ldF9pbmZfZGV2X2dldChpaSkgPT0gdW5pdCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlpKys7IC8qIE5leHQgTk5JICovCisgICAgfQorCisgICAgZG8gCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayByZXR1cm4gY29kZSBmcm9tIGRldmljZSBjaGVjayBhYm92ZS4gIFJldHVybiBpZiB0aGVyZSB3YXMgbm8gbG9jYWwgUE9OIC4KKyAgICAgICAgICovCisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIiBFUlJPUjogbm8gbmV0d29yayBwb3J0IGlzIG9uIHRoZSBzYW1lIGRldmljZSBhcyBhY2Nlc3MgcG9ydCAlZFxuIiwgcF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIGluaXRpYWxpemUgbGluayBsaXN0IGZsb3cgZWxlbWVudCAqLyAgICAgICAgIAorICAgICAgICBtZW1zZXQoJmZsb3dfZWxtLCAwLCBzaXplb2YgKGJhbF9zd19mbG93KSk7CisgICAgICAgIC8qIGZpbGwgaW4gdGhlIGJhc2ljIGluZm8gKi8KKyAgICAgICAgZmxvd19lbG0uaWQgPSBwX2Zsb3ctPmtleS5mbG93X2lkOworICAgICAgICBmbG93X2VsbS5kZXZpY2UgPSB1bml0OworICAgICAgICBmbG93X2VsbS50eXBlID0gZmxvd190eXBlOworICAgICAgICBmbG93X2VsbS5zdmNfcG9ydCA9IHBfZmxvdy0+ZGF0YS5zdmNfcG9ydF9pZDsKKyAgICAgICAgZmxvd19lbG0uZmxvd19jb29raWUgPSBwX2Zsb3ctPmRhdGEuY29va2llOyAgICAgICAgCisgCisgICAgICAgIHR1bm5lbF9pZCA9IChiY21fdmxhbl90KXBfZmxvdy0+ZGF0YS5zdmNfcG9ydF9pZDsKKyAgICAgICAgcG9uID0gYmFsX2JjbV9wb25faW5mX3BibV9nZXQocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpOworICAgICAgICAKKyAgICAgICAgLyogTWFwIHRoZSB0dW5uZWwgSUQgdG8gYSBQT04gY2hhbm5lbCBPVE0gcG9ydCAqLworICAgICAgICBydiA9IGJjbV9wb3J0X3Bvbl90dW5uZWxfbWFwX3NldCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1bm5lbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9uKTsKKyAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsgCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yLCBiY21fcG9ydF9wb25fdHVubmVsX21hcF9zZXQgb24gcG9uICVkIGZhaWxlZCAlZCIKKyAgICAgICAgICAgICAgICAgICAgIiAoaGF2ZSB5b3UgY2hvc2VuIHRoZSBjb3JyZWN0IGludGZfbWFwdGFibGU/KVxuIiwgcG9uLCBydik7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICAKKyAgICAgICAgLyogRm9yIFRSQVAgdG8gSE9TVCBhY3Rpb24sIGl0IGNhbiBiZSBlaXRoZXIgdXBzdHJlYW0gb3IgZG93bnN0ZXJhbSwKKyAgICAgICAgICAgVGhlcmUgaXMgbm8gcGFja2V0IG1hbmlwdWxhdGlvbiwganVzdCBpbnNlcnQgYW4gQUNMIGFuZCByZXR1cm4uCisgICAgICAgICAgIEZvciBmbG93IGFjdGlvbiBlcXVhbCBUUkFQX1RPX0hPU1QsIERTIGZsb3cgaGFzIHRvIHVzZSBkaWZmZXJlbnQgZmxvdyBpZCBldmVuIGlmIHRoZSBjbGFzc2lmaWVyIGlzIHRoZSBzYW1lIGFzIHRoZSBVUy4KKyAgICAgICAgICAgVGhpcyBpcyB0byBzaW1wbGlmeSB0aGUgUkVNT1ZFL0RFTEVURSBvcGVyYXRpb24gaW4gdGhlIHN3aXRjaC4KKyAgICAgICAgKi8gICAKKyAgICAgICAgaWYgKChCQ01PU19UUlVFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93LCBmbG93LCBhY3Rpb24pKSAgJiYgICAgICAgICAgICAKKyAgICAgICAgICAgIChwX2Zsb3ctPmRhdGEuYWN0aW9uLmNtZHNfYml0bWFzayAmIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1RSQVBfVE9fSE9TVCkgCisgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRm9yIFVTLCBjcmVhdGUgYW4gaW4gTElGIGZvciBtYXRjaGluZywgdGhpcyBhbGxvdyB0cmFwcGluZyBvZiBkaWZmZXJlbnQgdHVubmVsX2lkIG9uIHRoZSBzYW1lIFBPTi4KKyAgICAgICAgICAgICAgIFR1bm5lbF9pZCBpcyBzdHJpcHBlZCBiZWZvcmUgcGFja2V0cyBhcmUgZm9yd2FyZGluZyB0byB0aGUgaG9zdCAqLworICAgICAgICAgICAgaWYocF9mbG93LT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoQkNNT1NfRkFMU0UgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIHBrdF90YWdfdHlwZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01CQUxfQVRUUklCVVRFX1BST1BfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgcGt0X3RhZ190eXBlLCBCQ01CQUxfUEtUX1RBR19UWVBFX1VOVEFHR0VEKTsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwgIlRhZyBUeXBlIGZvciBVcHN0cmVhbSBQYWNrZXQgVHJhcHBpbmcgaXMgbm90IHNldCwgZGVmYXVsdCB0byBVTlRBR0dFRFxuIik7ICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJjbV92bGFuX3BvcnRfdF9pbml0KCZ2cCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogcHJlc2VydmUgYW55IGluY29taW5nIHBhY2tldCB2bGFuIHRhZ3MgKi8KKyAgICAgICAgICAgICAgICB2cC5mbGFncyA9ICBCQ01fVkxBTl9QT1JUX09VVEVSX1ZMQU5fUFJFU0VSVkUgIHwgQkNNX1ZMQU5fUE9SVF9JTk5FUl9WTEFOX1BSRVNFUlZFIHwgQkNNX1ZMQU5fUE9SVF9GT1JXQVJEX0dST1VQOyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzd2l0Y2gocF9mbG93LT5kYXRhLmNsYXNzaWZpZXIucGt0X3RhZ190eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfUEtUX1RBR19UWVBFX1NJTkdMRV9UQUc6CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBib3RoIHR1bm5lbCBhbmQgb3V0ZXIgdGFnIG9uIGluZ3Jlc3MgUE9OICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdnAuY3JpdGVyaWEgPSBCQ01fVkxBTl9QT1JUX01BVENIX1BPUlRfVFVOTkVMX1ZMQU47ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAorICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9QS1RfVEFHX1RZUEVfRE9VQkxFX1RBRzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIHR1bm5lbCBhbmQgYm90aCBvdXRlciBhbmQgaW5uZXIgdGFncyBvbiBpbmdyZXNzIFBPTiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHZwLmNyaXRlcmlhID0gQkNNX1ZMQU5fUE9SVF9NQVRDSF9QT1JUX1RVTk5FTF9WTEFOX1NUQUNLRUQ7ICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9VTlRBR0dFRDogCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIGp1c3QgdG8gbWFrZSBjb21waWxlciBoYXBweSAqLyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCB0dW5uZWwgdGFnIG9uIGluZ3Jlc3MgUE9OICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdnAuY3JpdGVyaWEgPSBCQ01fVkxBTl9QT1JUX01BVENIX1BPUlRfVFVOTkVMOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdnAucG9ydCA9IHBvbjsgICAgICAgIAorICAgICAgICAgICAgICAgIHZwLm1hdGNoX3R1bm5lbF92YWx1ZSA9IHR1bm5lbF9pZDsKKyAgICAgICAgICAgICAgICB2cC5lZ3Jlc3NfdHVubmVsX3ZhbHVlID0gdHVubmVsX2lkOworICAgICAgICAgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIG9fdmlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZwLm1hdGNoX3ZsYW4gPSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3ZpZDsgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGlfdmlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZwLm1hdGNoX2lubmVyX3ZsYW4gPSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5pX3ZpZDsgIAorICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgdnAudnNpID0gMDsgLyogd2lsbCBiZSBwb3B1bGF0ZWQgd2hlbiB0aGUgZ3BvcnQgaXMgYWRkZWQgdG8gc2VydmljZSwgdXNpbmcgdnN3aXRjaF9wb3J0X2FkZCAqLworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSB2bGFuIHBvcnQgKGkuZS4sIFBPTiBMSUYpICovCisgICAgICAgICAgICAgICAgcnYgPSBiY21fdmxhbl9wb3J0X2NyZWF0ZSh1bml0LCAmdnApOworICAgICAgICAgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgYmNtX3ZsYW5fcG9ydF9jcmVhdGUgcG9uICVkIGZhaWxlZCAlZFxuIiwgcG9uLCBydik7ICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfYWNsX2FkZCh1bml0LCBwX2Zsb3csICZmbG93X2VsbSwgdnAudmxhbl9wb3J0X2lkLCAwKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHJldCA9IGJhbF9zd191dGlsX2RwcF9hY2xfYWRkKHVuaXQsIHBfZmxvdywgJmZsb3dfZWxtLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgRVJST1I6IGZhaWwgdG8gYWRkICVzIGFjbCBydWxlIG9uIHRyYXBcbiIsIChwX2Zsb3ctPmtleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSk/ICJVUyI6IkRTIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCA9IGJhbF9zd191dGlsX2Zsb3dfbGlzdF9pbnNlcnQoZmxvd19lbG0pOworICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICJBZGQgZmxvd19lbG0gJWQgIHR5cGUgJWQsIHRyYXBfY29kZSAweCV4LCBlaWQ9JWQgU3VjY2Vzc1xuIiwgZmxvd19lbG0uaWQsIGZsb3dfZWxtLnR5cGUsIGZsb3dfZWxtLnRyYXBfY29kZSwgZmxvd19lbG0uZmllbGRfZW50cnlfaWRbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSAvKiBlbmRpZiBUUkFQX1RPX0hPU1QgQUNUSU9OICovICAgICAgICAgCisgIAorICAgICAgICAvKiBGb3IgVFItMTU2IDE6MSwgc2luZ2xlIHRhZ2dlZCBvbiBWIGFuZCBSL1MgaW50ZXJmYWNlLgorICAgICAgICAgICBUaGUgdnN3aXRjaCB3aWxsIHB1c2ggYSB0dW5uZWwgdGFnIG9uIHRoZSBkb3duIHN0cmVhbSBwYWNrZXRzLgorICAgICAgICAgICBUaGUgdnN3aXRjaCB3aWxsIHBvcCB0aGUgdHVubmVsIHRhZyBmcm9tIHRoZSB1cHN0cmVhbSBwYWNrZXRzLgorICAgICAgIAorICAgICAgICAgICBUQkQgRm9yIFRSLTE1NiAxOjEsIGRvdWJsZSB0YWdnZWQgb24gViBpbnRlcmZhY2UgYW5kIHNpbmdsZSB0YWdnZWQgb24gUi9TIGludGVyZmFjZS4gICAgICAgICAgIAorICAgICAgICAgICBUaGUgdnN3aXRjaCB3aWxsIHJlcGxhY2UgdGhlIG91dGVyIHRhZyB3aXRoIHR1bm5lbCB0YWcgb24gdGhlIGRvd24gc3RyZWFtIHBhY2tldHMuCisgICAgICAgICAgIFRoZSB2c3dpdGNoIHdpbGwgcmVwbGFjZSB0aGUgdHVubmVsIHRhZyB3aXRoIG91dGVyIHZpZCBvbiB1cHN0cmVhbSBwYWNrZXRzLiAgICAgICAgICAgCisgICAgICAgICAgIAorICAgICAgICAgICBGb3IgVFItMTU2IE46MSwgc2luZ2xlIHRhZ2dlZCBvbiBWIGFuZCBSL1MgaW50ZXJmYWNlLgorICAgICAgICAgICBUaGUgdnN3aXRjaCB3aWxsIGxlYXJuIHRoZSB1cHN0cmVhbSBzb3VyY2UgTUFDIGZvciBkb3duc3RyZWFtIGZvcndhcmRpbmcKKyAgICAgICAgKi8gCisgIAorICAgICAgICAvKiBwYWNrZXQgdGFnIHR5cGUgYW5kIHNlcnZpY2UgcG9ydCBpZCBhcmUgcmVxdWlyZWQgZmllbGRzIHdoZW4gdGhlcmUgaXMgbm8gYWN0aW9uIC0gY2hlY2tlZCBpbiB2YWxpZGF0aW9uIHN0YWdlICovCisgICAgICAgIC8qIEhlcmUgbWFrZSBzdXJlIGl0IGlzIHRoZSBzdXBwb3J0ZWQgdHlwZSAqLyAgICAgICAgCisgICAgICAgIGlmKHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSAhPSBCQ01CQUxfUEtUX1RBR19UWVBFX1VOVEFHR0VEICYmCisgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSAhPSBCQ01CQUxfUEtUX1RBR19UWVBFX1NJTkdMRV9UQUcgJiYKKyAgICAgICAgICAgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIucGt0X3RhZ190eXBlICE9IEJDTUJBTF9QS1RfVEFHX1RZUEVfRE9VQkxFX1RBRykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICIgRVJST1I6IGNsYXNzaWZpZXIgcGFja2V0IHRhZyB0eXBlIDB4JXggaXMgaW52YWxpZFxuIiwgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIucGt0X3RhZ190eXBlKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9ICAgICAgICAgCisKKyAgICAgICAgLyogY3JlYXRlIGEgbG9jYWwgcmV2ZXJzZSBmbG93IGZvciBzeW1tZXRyeSBjb25maWd1cmF0aW9ucyAqLworICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9yZXZlcnNlX2Zsb3dfY3JlYXRlKHBfZmxvdywgJmZsb3dfcmV2KTsKKyAgICAgICAgaWYgKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCAoaW50ZXJuYWwgZmFpbHVyZSk6IGZhaWwgdG8gcmV2ZXJzZSBmbG93XG4iKTsgCisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKHBfZmxvdy0+a2V5LmZsb3dfdHlwZSA9PSBCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNKQorICAgICAgICB7CisgICAgICAgICAgICBwX3VzX2Zsb3cgPSBwX2Zsb3c7CisgICAgICAgICAgICBwX2RzX2Zsb3cgPSAmZmxvd19yZXY7ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgICAgcF91c19mbG93ID0gJmZsb3dfcmV2OworICAgICAgICAgICAgcF9kc19mbG93ID0gcF9mbG93OworICAgICAgICB9ICAgICAgICAgICAKKyAKKyAKKyAgICAgICAgLyogY3JlYXRlIHRoZSB2c3dpdGNoICovCisgICAgICAgIC8qIGlmIGZsb3cgaXMgYXNzb2NpYXRlZCB3aXRoIGEgR1JPVVAsIHVzZSB0aGUgdnN3aXRjaCBmcm9tIHRoZSBHUk9VUCAqLworICAgICAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93LCBmbG93LCBncm91cF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhbF9zd19ncm91cF9saXN0ICpwX2dyb3VwX2xpc3Q7CisgICAgICAgICAgICAvKiBnZXQgYSBwb2ludGVyIHRvIHRoZSBzcGVjaWZpZWQgZ3JvdXAgaW5zdGFuY2UgKi8KKyAgICAgICAgICAgIHBfZ3JvdXBfbGlzdCA9IGJhbF9zd191dGlsX2RwcF9ncm91cF9saXN0X2dldF9ieV9pZChwX2Zsb3ctPmRhdGEuZ3JvdXBfaWQpOworIAorICAgICAgICAgICAgaWYgKCBwX2dyb3VwX2xpc3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgRVJST1I6IGdyb3VwICVkIG5vdCBmb3VuZFxuIiwgcF9mbG93LT5kYXRhLmdyb3VwX2lkKTsKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOyAgIAorICAgICAgICAgICAgfQorIAorICAgICAgICAgICAgLyogcmV0cmlldmUgdGhlIHZzd2l0Y2ggaW5zdGFuY2UgKi8KKyAgICAgICAgICAgIHBfdnNpX3N2YyA9IHBfZ3JvdXBfbGlzdC0+cF92c2k7CisgICAgICAgICAgICB2c2kgPSAocF9ncm91cF9saXN0LT5wX3ZzaSktPnZzd2l0Y2g7CisgICAgICAgICAgICAvKiBhZGQgZmxvdyB0byB0aGUgdnNpIHNlcnZpY2UgdGFnIGxpc3QgKi8KKyAgICAgICAgICAgIHJldCA9IGJhbF9zd191dGlsX2RwcF92c2lfc2VydmljZV90YWdfYWRkKHVuaXQsIHBfdnNpX3N2YywgcF9mbG93LCAmc3ZjX3RhZ19pbmR4KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBmbG93IGZhaWwgdG8gYWRkIHNlcnZpY2UgdG8gdnNpIHNlcnZpY2UgdGFnIGxpc3RcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogc2V0IHRoZSBtYWMgbGVhcm5pbmcgZGlzdHJpYnV0aW9uIGxpc3QgKi8KKyAgICAgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3csIGZsb3csIHJlc29sdmVfbWFjKSAmJgorICAgICAgICAgICAgICAgQkNNT1NfVFJVRSA9PSBwX2Zsb3ctPmRhdGEucmVzb2x2ZV9tYWMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtX2wyX2FkZHJfZGlzdHJpYnV0ZV90IGRpc3Q7CisgICAgCisgICAgICAgICAgICAgICAgYmNtX2wyX2FkZHJfZGlzdHJpYnV0ZV90X2luaXQoJmRpc3QpOworICAgICAgICAgICAgICAgIGRpc3QudmlkID0gdnNpOworICAgICAgICAgICAgICAgIGRpc3QuZmxhZ3MgID0gQkNNX0wyX0FERFJfRElTVF9TRVRfQ1BVX0RNQV9ESVNUUklCVVRFUiB8IEJDTV9MMl9BRERSX0RJU1RfU0VUX0xFQVJOX0RJU1RSSUJVVEVSOworICAgICAgICAgICAgICAgIGRpc3QuZmxhZ3MgfD0gQkNNX0wyX0FERFJfRElTVF9MRUFSTl9FVkVOVCB8IEJDTV9MMl9BRERSX0RJU1RfQUdFRF9PVVRfRVZFTlQgfCBCQ01fTDJfQUREUl9ESVNUX1NUQVRJT05fTU9WRV9FVkVOVDsKKyAgICAgICAgICAgICAgICBydiA9IGJjbV9sMl9hZGRyX21zZ19kaXN0cmlidXRlX3NldCh1bml0LCAmZGlzdCk7CisgICAgICAgICAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBiY21fbDJfYWRkcl9tc2dfZGlzdHJpYnV0ZV9zZXQiKTsgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogdnNpIHNlcnZpY2UgbmVlZHMgZG93biBzdHJlYW0gaW5mbyBmb3IgaW4gTElGIFZMQU4gaW5mbyAqLworICAgICAgICAgICAgcF92c2lfc3ZjID0gYmFsX3N3X3V0aWxfZHBwX3ZzaV9zZXJ2aWNlX2NyZWF0ZSh1bml0LCBwX2RzX2Zsb3csICZzdmNfdGFnX2luZHgpOworICAgICAgICAgICAgaWYocF92c2lfc3ZjID09IE5VTEwpCisgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgdnNpIGNyZWF0ZSBmYWlsZWRcbiIpOyAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICB2c2kgPSBwX3ZzaV9zdmMtPnZzd2l0Y2g7CisgICAgICAgIH0KKyAgICAgICAgLyogPT09IGNyZWF0ZSBhIFBPTiBMSUYgPT09ICovIAorCisgICAgICAgIC8qIGlmIERTIFNMQSBpcyBzZXQsIGNyZWF0ZSBhIFZPUSBpZCwgb3RoZXJ3aXNlIHVzZSBsb2NhbCBwb3J0IGlkICovCisgICAgICAgIC8qKiBAbm90ZSBRb1MgZnJvbSB0aGUgRG93bnN0cmVhbSBmbG93IGNvbmZpZyBpcyB0YWtlbiB0byBjb25maWd1cmUgU0xBIGluIHRoZSBzd2l0Y2guIFVwc3RyZWFtIGlzIGRvbmUgaW4gTUFDLgorICAgICAgICAgKi8gICAgICAgIAorICAgICAgICBpZiAoKHBfZmxvdy0+a2V5LmZsb3dfdHlwZSA9PSBCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU0pICYmIChCQ01PU19UUlVFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93LCBmbG93LCBzbGEpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYmFsX3N3X2RwcF9xb3Nfc2VydmljZV9jZmcpKTsKKyAgICAgICAgICAgIGlmIChwX3NlcnZpY2VfY2ZnID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgZmFpbCB0byBhbGxvYyBhIGJhbF9zd19kcHBfcW9zX3NlcnZpY2VfY2ZnX3RcbiIpOyAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+c2VydmljZV90eXBlID0gQkFMX0JDTV9TVkNfVFlQRV9JUDsKKyAgICAgICAgICAgIHBfc2VydmljZV9jZmctPmJhbF9mbG93X2lkID0gcF9mbG93LT5rZXkuZmxvd19pZDsKKyAgICAgICAgICAgIHBfc2VydmljZV9jZmctPnBvbl9wb3J0ID0gcF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQ7IAorICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+dHVubmVsX2lkID0gdHVubmVsX2lkOworICAgICAgICAgICAgLyogVEJEIC0gY2hhbm5lbGl6ZSBwb3J0IGNvbmZpZyAqLworICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLnBvbl9jaGFuID0gMDsKKyAgICAgICAgICAgIHBfc2VydmljZV9jZmctPmRzX3Fvcy5taW4ucmF0ZSA9IHBfZmxvdy0+ZGF0YS5zbGEubWluX3JhdGU7CisgICAgICAgICAgICAvKiBidXJzdCAtIHNldCBpdCB0byB0d2ljZSB0aGUgcmF0ZSAqLyAKKyAgICAgICAgICAgIG1heF9idXJzdCA9ICggKDIqcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1pbi5yYXRlKSA8IEJBTF9NQVhfQlVSU1RfUkFURSApPyAoMipwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWluLnJhdGUpOiBCQUxfTUFYX0JVUlNUX1JBVEU7CisgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWluLmJ1cnN0ID0gbWF4X2J1cnN0OworICAgICAgICAgICAgLyogVEJEIHByaW9yaXR5ICovCisgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWluLnRyYWZmaWNfcHJpb3JpdHkgPSAyOworICAgICAgICAgICAgCisgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWF4LnJhdGUgPSBwX2Zsb3ctPmRhdGEuc2xhLm1heF9yYXRlIC0gcF9mbG93LT5kYXRhLnNsYS5taW5fcmF0ZTsKKyAgICAgICAgICAgIC8qIGJ1cnN0IC0gc2V0IGl0IHRvIHR3aWNlIHRoZSByYXRlICovCisgICAgICAgICAgICBtYXhfYnVyc3QgPSAoICgyKnBfc2VydmljZV9jZmctPmRzX3Fvcy5tYXgucmF0ZSkgPCBCQUxfTUFYX0JVUlNUX1JBVEUgKT8gKDIqcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1heC5yYXRlKTogQkFMX01BWF9CVVJTVF9SQVRFOyAgICAgICAgICAgIAorICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1heC5idXJzdCA9IG1heF9idXJzdDsKKyAgICAgICAgICAgIC8qIFRCRCBwcmlvcml0eSAqLworICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1heC50cmFmZmljX3ByaW9yaXR5ID0gMjsKKyAgICAgICAgICAgIHJldCA9IGJhbF9zd19kcHBfbGxpZF9xb3NfY29uZmlnKHVuaXQsIHBfc2VydmljZV9jZmcpOworICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGVycm9ycyAqLworICAgICAgICAgICAgaWYgKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEZhaWx1cmUgKi8KKyAgICAgICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb3duc3RyZWFtIFFvUyBjb25maWd1cmF0aW9uIGZhaWxlZCBmb3IgcG9uICV1IHRpZCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCwgdHVubmVsX2lkKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBCQ01fR1BPUlRfVU5JQ0FTVF9RVUVVRV9HUk9VUF9TRVQocG9uLCBwX3NlcnZpY2VfY2ZnLT5kc19xb3Mudm9xX2Zsb3dfaWQpOworICAgICAgICAgICAgc3lzX3BvbiA9IHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfZ3BvcnQ7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIHVzZSB2b3FfaWQgMHgleCBxdWV1ZSBncm91cCAweCV4LCB2b3FfZ3BvcnQgMHgleCB0byBjcmVhdGUgUE9OIExJRlRcbiIsIHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfZmxvd19pZCwgcG9uLCBzeXNfcG9uKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogY2xlYXIgdGhlIFZPUSBzdGF0cyBoZXJlICovCisgICAgICAgICAgICBiYWxfc3dfZHBwX3Fvc19jbGVhcl92b3Ffc3RhdHModW5pdCwgc3lzX3Bvbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAgICAgCisgICAgICAgICAgICBzeXNfcG9uID0gcG9uOworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiB1c2UgcHAgcG9ydCAweCV4IHRvIGNyZWF0ZSBQT04gTElGVFxuIiwgcG9uKTsKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAvKiBDb25maWd1cmUgdGhlIHN3aXRjaCBwb24gTElGIGJhc2VkIG9uIGNsYXNzaWZpZXIgaW4gdGhlIGZsb3cuCisgICAgICAgICAgICBUaGUgcG9uIExJRiBmaWx0ZXIgdGhlIGluZ3Jlc3MgcGFja2V0cyBmcm9tIFBPTiwgc28gdXNlIHRoZSBjbGFzc2lmaWVyIGluIHRoZSBVUyBkaXJlY3Rpb24uCisgICAgICAgICAgICBUaGlzIG1lYW5zLCBpZiB0aGUgb3JpZ2luYWwgZmxvdyBjb25maWd1cmF0aW9uIGlzIGZvciBEb3duc3RyZWFtLCB1c2UgdGhlIHJldmVyc2UgZmxvdyB0aGF0IGxvY2FsbHkgY3JlYXRlZCAgKi8gCisgICAgICAgIAorICAgICAgICBiY21fdmxhbl9wb3J0X3RfaW5pdCgmdnApOworICAgICAgICAKKyAgICAgICAgLyogcHJlc2VydmUgYW55IGluY29taW5nIHBhY2tldCB2bGFuIHRhZ3MsIGlmIHZsYW4gYWN0aW9ucyBhcmUgcmVxdWlyZWQsIGRvIGl0IHVzaW5nIGVncmVzcyB0cmFuc2xhdGlvbiAqLworICAgICAgICB2cC5mbGFncyA9ICBCQ01fVkxBTl9QT1JUX09VVEVSX1ZMQU5fUFJFU0VSVkUgIHwgQkNNX1ZMQU5fUE9SVF9JTk5FUl9WTEFOX1BSRVNFUlZFOyAgICAgICAgCisgICAgICAgIC8qIEl0IGlzIHJlcXVpcmVkIHRvIHNldCB0aGUgRkVDIGZsYWcgc28gdGhhdCB0aGUgZWdyZXNzIHJlZGlyZWN0aW9uIGFjdGlvbiBmcm9tIHRoZSBEUyBjbGFzc2lmaWNhdGlvbiBjYW4gCisgICAgICAgICAgIHNlbGVjdCB0aGUgY29ycmVjdCBQT04gTElGIHRvIGZvcndhcmQgdGhlIHBhY2tldCAqLworICAgICAgICB2cC5mbGFncyB8PSBCQ01fVkxBTl9QT1JUX0ZPUldBUkRfR1JPVVA7ICAgICAgICAKKyAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIHN3aXRjaChwX3VzX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5wa3RfdGFnX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9TSU5HTEVfVEFHOgorICAgICAgICAgICAgICAgIC8qIG1hdGNoIGJvdGggdHVubmVsIGFuZCBvdXRlciB0YWcgb24gaW5ncmVzcyBQT04gICovCisgICAgICAgICAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX3VzX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgb19wYml0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2cC5jcml0ZXJpYSA9IEJDTV9WTEFOX1BPUlRfTUFUQ0hfUE9SVF9UVU5ORUxfUENQX1ZMQU47IAorICAgICAgICAgICAgICAgICAgICB2cC5tYXRjaF9wY3AgPSBwX3VzX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3BiaXRzOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZwLmNyaXRlcmlhID0gQkNNX1ZMQU5fUE9SVF9NQVRDSF9QT1JUX1RVTk5FTF9WTEFOOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFrOyAKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9ET1VCTEVfVEFHOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSBtYXRjaCBib3RoIHR1bm5lbCBhbmQgYm90aCBvdXRlciBhbmQgaW5uZXIgdGFncyBvbiBpbmdyZXNzIFBPTiAgKi8KKyAgICAgICAgICAgICAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfdXNfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBvX3BiaXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZwLmNyaXRlcmlhID0gQkNNX1ZMQU5fUE9SVF9NQVRDSF9QT1JUX1RVTk5FTF9QQ1BfVkxBTl9TVEFDS0VEOworICAgICAgICAgICAgICAgICAgICB2cC5tYXRjaF9wY3AgPSBwX3VzX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3BiaXRzOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZwLmNyaXRlcmlhID0gQkNNX1ZMQU5fUE9SVF9NQVRDSF9QT1JUX1RVTk5FTF9WTEFOX1NUQUNLRUQ7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9VTlRBR0dFRDoKKyAgICAgICAgICAgICAvKiBPdGhlcndpc2UgbWF0Y2ggdHVubmVsIHRhZyBvbiBpbmdyZXNzIFBPTiAgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZwLmNyaXRlcmlhID0gQkNNX1ZMQU5fUE9SVF9NQVRDSF9QT1JUX1RVTk5FTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBicmVhazsgCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgLyogc2hvdWxkIG5vdCByZWFjaCBoZXJlICovCisgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIFVuc3VwcG9ydGVkIHBhY2tldCB0eXBlICVkIGZvciBwb24gTElGXG4iLHBfdXNfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSApOworICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIAorICAgICAgICAKKyAgICAgICAgdnAucG9ydCA9IHBvbjsgICAgICAgIAorICAgICAgICB2cC5tYXRjaF90dW5uZWxfdmFsdWUgPSB0dW5uZWxfaWQ7CisgICAgICAgIHZwLmVncmVzc190dW5uZWxfdmFsdWUgPSB0dW5uZWxfaWQ7CisgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF91c19mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIG9fdmlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgdnAubWF0Y2hfdmxhbiA9IHBfdXNfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fdmlkOyAgICAgICAKKyAgICAgICAgfQorICAgICAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfdXNfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBpX3ZpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZwLm1hdGNoX2lubmVyX3ZsYW4gPSBwX3VzX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5pX3ZpZDsgIAorICAgICAgICB9IAorICAgICAgICB2cC52c2kgPSAwOyAvKiB3aWxsIGJlIHBvcHVsYXRlZCB3aGVuIHRoZSBncG9ydCBpcyBhZGRlZCB0byBzZXJ2aWNlLCB1c2luZyB2c3dpdGNoX3BvcnRfYWRkICovCisgICAgICAgCisgICAgICAgIC8qIENyZWF0ZSB0aGUgdmxhbiBwb3J0IChpLmUuLCBQT04gTElGKSAqLworICAgICAgICBydiA9IGJjbV92bGFuX3BvcnRfY3JlYXRlKHVuaXQsICZ2cCk7CisgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBiY21fdmxhbl9wb3J0X2NyZWF0ZSBwb24gJWQgZmFpbGVkICVkXG4iLCBwb24sIHJ2KTsgICAgICAgICAKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBicmVhazsgIAorICAgICAgICB9CisgCisgICAgICAgIHBvbl9ncG9ydCA9IHZwLnZsYW5fcG9ydF9pZDsKKyAgICAgICAgLyogc2V0IHBvbiBncG9ydCB0byBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheSAqLworICAgICAgICBmbG93X2VsbS5wb25fcG9ydFswXSA9IHBvbl9ncG9ydDsKKyAgICAgICAgCisgICAgICAgIC8qIHNldCBQT04gcG9ydCBESVNDQVJEIG1vZGUgdG8gcmVmbGVjdCB0aGUgZmxvdyBkaXJlY3Rpb24uIFdoZW4gdHdvIEJBTCBmbG93cyB3aXRoIHNhbWUgaWQgIGFuZCBkaWZmZXJlbnQgZGlyZWN0aW9ucworICAgICAgICAgICBhcmUgY29uZmlndXJlZCwgdGhlIERJU0NBUkQgbW9kZSB3aWxsIGJlIHNldCBiYWNrIHRvIE5PTkUgKi8KKyAgICAgICAgaWYgKGZsb3dfZWxtLnR5cGUgPT0gQkFMX1NXX0ZMT1dfVFlQRV9ET1dOU1RSRUFNKSAgICAgICAgIAorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiSW5mbywgYmNtX3BvcnRfZGlzY2FyZF9zZXQgcG9uIDB4JXggdG8gRElTQ0FSRF9JTkdSRVNTXG4iLCBwb25fZ3BvcnQpOyAgCisgICAgICAgICAgICBydiA9IGJjbV9wb3J0X2Rpc2NhcmRfc2V0KHVuaXQsIHBvbl9ncG9ydCwgQkNNX1BPUlRfRElTQ0FSRF9JTkdSRVNTKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmbG93X2VsbS50eXBlID09IEJBTF9TV19GTE9XX1RZUEVfVVBTVFJFQU0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGFsbG93IGJpLWRpcmVjdGlvbiBmb3IgTjoxIHNlcnZpY2UgKi8KKyAgICAgICAgICAgIGlmKCBCQ01PU19UUlVFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF91c19mbG93LCBmbG93LCBncm91cF9pZCkgJiYKKyAgICAgICAgICAgICAgICBCQ01PU19UUlVFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF91c19mbG93LCBmbG93LCByZXNvbHZlX21hYykgJiYKKyAgICAgICAgICAgICAgICBCQ01PU19UUlVFID09IHBfdXNfZmxvdy0+ZGF0YS5yZXNvbHZlX21hYykKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBydiA9IEJDTV9FX05PTkU7ICAgCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkluZm8sIGJjbV9wb3J0X2Rpc2NhcmRfc2V0IHBvbiAweCV4IHRvIERJU0NBUkRfRUdSRVNTXG4iLCBwb25fZ3BvcnQpOyAKKyAgICAgICAgICAgICAgICAgICBydiA9IGJjbV9wb3J0X2Rpc2NhcmRfc2V0KHVuaXQsIHBvbl9ncG9ydCwgQkNNX1BPUlRfRElTQ0FSRF9FR1JFU1MpOworICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcnYgPSBCQ01fRV9OT05FOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGJjbV9wb3J0X2Rpc2NhcmRfc2V0IGZhaWxlZCAlZFxuIiwgcnYpOworICAgICAgICAgICAgIC8qIEFSQUQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgRElTQ0FSRCBmdW5jdGlvbiBhcyBvZiA2LjUuNCAqLyAgICAgICAgICAgICAKKyNpZmRlZiBRQVhfU1dJVENIICAgICAgICAgICAgIAorICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgICAgICAgICAgICAgCisgICAgICAgIH0gCisgICAgICAgIAorICAgICAgICAvLyBhZGQgcG9uIGdwb3J0IHRvIHZzd2l0Y2gKKyAgICAgICAgcnYgPSBiY21fdnN3aXRjaF9wb3J0X2FkZCh1bml0LCB2c2ksIHBvbl9ncG9ydCk7CisgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgYmNtX3Zzd2l0Y2hfcG9ydF9hZGQgZm9yIHBvbiAweCV4IGZhaWxlZCAlZFxuIiwgcG9uLCBydik7ICAgICAgICAgCisgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICBicmVhazsgIAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkluZm8sIGJjbV92c3dpdGNoX3BvcnRfYWRkIGZvciBwb24gMHgleCwgZ3BvcnQgMHgleFxuIiwgcG9uLCBwb25fZ3BvcnQpOyAgIAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93LCBmbG93LCBncm91cF9pZCkgICAgJiYKKyAgICAgICAgICAgQkNNT1NfVFJVRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgcmVzb2x2ZV9tYWMpICYmCisgICAgICAgICAgIEJDTU9TX1RSVUUgPT0gcF9mbG93LT5kYXRhLnJlc29sdmVfbWFjKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBmb3IgZmxvd3MgdGhhdCBuZWVkIHRvIHJlc29sdmUgbWFjLCBkb24ndCBmb3J3YXJkIHVua25vd24gdHJhZmZpY3MgKi8KKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9zd191dGlsLCAicG9uICVkOjB4JXggYnlwYXNzIGRvd25zdHJlYW0gTUMgZ3JvdXAgam9pblxuIiwgcG9uLCBwb25fZ3BvcnQpOyAKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG9idGFpbiBlbmNhcHN1bGF0aW9uIElEIGZvciBsZWdhY3kgcmVhc29uLCB1c2VkIGluIEFERCBBUEkgICovCisgICAgICAgICAgICBydiA9IGJjbV9tdWx0aWNhc3Rfdmxhbl9lbmNhcF9nZXQodW5pdCwgcF92c2lfc3ZjLT5kc19mbG9vZF9ncnBfaWQsIHN5c19wb24sIHBvbl9ncG9ydCwgJnBvbl9lbmNhcF9pZCk7CisgICAgICAgICAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgYmNtX211bHRpY2FzdF92bGFuX2VuY2FwX2dldCBmb3IgcG9uIGZhaWxlZCAlZFxuIiwgcnYpOyAgICAgICAgIAorICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgICBicmVhazsgCisgICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogam9pbiB0aGUgZG93bnN0cmVhbSBtdWx0aWNhc3QgZ3JvdXAgYXMgYSBtZW1iZXIgb2YgcmVwbGljYXRpb24gbGlzdCAqLyAKKyAgICAgICAgICAgIHJ2ID0gYmNtX211bHRpY2FzdF9pbmdyZXNzX2FkZCh1bml0LCBwX3ZzaV9zdmMtPmRzX2Zsb29kX2dycF9pZCwgc3lzX3BvbiwgcG9uX2VuY2FwX2lkKTsKKyAgICAgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBiY21fbXVsdGljYXN0X2luZ3Jlc3NfYWRkIGZvciBwb24gZmFpbGVkICVkXG4iLCBydik7ICAgICAgICAgCisgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogbm93IHNldCB0aGUgdHlwZSBvZiBwYWNrZXRzIHRoYXQgZ29lcyB0byB0aGUgdXBzdHJlYW0gZmxvb2RpbmcgZ3JvdXAgKG9mZnNldCAwKSAqLyAgICAgICAgCisgICAgICAgICAgICBydiA9IGJjbV9wb3J0X2NvbnRyb2xfc2V0KHVuaXQsIHBvbl9ncG9ydCwgYmNtUG9ydENvbnRyb2xGbG9vZFVua25vd25VY2FzdEdyb3VwLCBCQUxfRFBQX1VTX0ZMT09EX09GRlNFVCk7CisgICAgICAgICAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgYmNtX3BvcnRfY29udHJvbF9zZXQgdWNhc3QgZm9yIHBvbiBmYWlsZWQgJWRcbiIsIHJ2KTsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcnYgPSBiY21fcG9ydF9jb250cm9sX3NldCh1bml0LCBwb25fZ3BvcnQsIGJjbVBvcnRDb250cm9sRmxvb2RVbmtub3duTWNhc3RHcm91cCwgQkFMX0RQUF9VU19GTE9PRF9PRkZTRVQpOworICAgICAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGJjbV9wb3J0X2NvbnRyb2xfc2V0IG1jYXN0IGZvciBwb24gZmFpbGVkICVkXG4iLCBydik7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJ2ID0gYmNtX3BvcnRfY29udHJvbF9zZXQodW5pdCwgcG9uX2dwb3J0LCBiY21Qb3J0Q29udHJvbEZsb29kQnJvYWRjYXN0R3JvdXAsIEJBTF9EUFBfVVNfRkxPT0RfT0ZGU0VUKTsKKyAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBiY21fcG9ydF9jb250cm9sX3NldCBiY2FzdCBmb3IgcG9uIGZhaWxlZCAlZFxuIiwgcnYpOyAKKyAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgLyogcGVyZm9ybSB2bGFuIHRyYW5zbGF0aW9uIG9uIHBvbiBwb3J0LCBwb24gZWdyZXNzIGluZm8gaXMgaW4gdGhlIERvd25zdHJlYW0gY29uZmlndXJhdGlvbiAqLyAKKyAgICAgICAgaWYgKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2RzX2Zsb3csIGZsb3csIGFjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IGJhbF9zd191dGlsX2RwcF9pbnZsYW54KHVuaXQsIHBfdXNfZmxvdywgcG9uX2dwb3J0KTsgCisgICAgICAgICAgICBpZiAocmV0ICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgZmFpbCB0byBwZXJmb3JtIGluZ3Jlc3MgdmxhbiB0cmFuc2xhdGlvbiBvbiBwb24gJWRcbiIsIHBvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX2V2bGFueCh1bml0LCBwX2RzX2Zsb3csIHBvbl9ncG9ydCk7IAorICAgICAgICAgICAgaWYgKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGZhaWwgdG8gcGVyZm9ybSBlZ3Jlc3MgdmxhbiB0cmFuc2xhdGlvbiBvbiBwb24gJWRcbiIsIHBvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gIAorICAgICAgICB9ICAgIAorICAgICAgICAvKiA9PT0gUE9OIExJRiBjcmVhdGVkID09PSAqLworICAgICAgICAgCisgICAgICAgIGlpID0gMDsgIC8qIFN0YXJ0IHdpdGggdGhlIGZpcnN0IE5OSSBsb2dpY2FsIGludGVyZmFjZSAqLworICAgICAgICAvKiBsb29wIHRocm91Z2ggYWxsIG5uaSBwb3J0LCBhZGQgdGhlbSB0byB2c3dpdGNoLCAtMSBpbmRpY2F0ZSBlbmQgb2YgdGFibGUgKi8KKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBzd2l0Y2ggbm5pIExJRiBiYXNlZCBvbiBjbGFzc2lmaWVyIGluIHRoZSBmbG93LgorICAgICAgICAgICBUaGUgbm5pIExJRiBmaWx0ZXIgdGhlIGluZ3Jlc3MgcGFja2V0cyBmcm9tIE5ldHdvcmssIHNvIHVzZSB0aGUgY2xhc3NpZmllciBpbiB0aGUgRFMgZGlyZWN0aW9uLgorICAgICAgICAgICBUaGlzIG1lYW5zLCBpZiB0aGUgb3JpZ2luYWwgZmxvdyBjb25maWd1cmF0aW9uIGlzIGZvciBVcHN0cmVhbSwgdXNlIHRoZSByZXZlcnNlIGZsb3cgdGhhdCBsb2NhbGx5IGNyZWF0ZWQgICovIAorICAgICAgICB3aGlsZSgtMSAhPSAobm5pID0gYmFsX2JjbV9uZXRfaW5mX3BibV9nZXQoaWkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2tpcCBubmkgcG9ydCB0aGF0IGlzIG5vdCBpbiB0aGUgc2FtZSBkZXZpY2Ugb3Igbm90IHZhbGlkICovCisgICAgICAgICAgICBpZiAoIGJhbF9iY21fbmV0X2luZl9kZXZfZ2V0KGlpKSAhPSB1bml0ICAgfHwKKyAgICAgICAgICAgICAgICAgQkNNT1NfRkFMU0UgPT0gYmNtX3RvcG9fbm5pX2lzX3ZhbGlkKGlpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpaSsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAgIC8qIGlmIG5uaSBwb3J0IGlzIHNwZWNpZmllZCBpbiB0aGUgZmxvdywgc2tpcCB0aGUgb3RoZXIgbm5pIHBvcnRzICovCisgICAgICAgICAgICBpZiAoIEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9kc19mbG93LCBmbG93LCBuZXR3b3JrX2ludF9pZCkgJiYKKyAgICAgICAgICAgICAgICAgaWkgIT0gcF9kc19mbG93LT5kYXRhLm5ldHdvcmtfaW50X2lkCisgICAgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWkrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIGNyZWF0ZSBncG9ydCBiYXNlZCBvbiBubmkgcGh5c2ljYWwgcG9ydCBudW1iZXIgKi8KKworICAgICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX3ZzaV9zZXJ2aWNlX3BvcnRfYWRkKHVuaXQsIHBfdnNpX3N2Yywgc3ZjX3RhZ19pbmR4LCBubmksICZubmlfZ3BvcnQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGZhaWwgdG8gYWRkIG5uaSAlZCB0byB2c2lcbiIsIG5uaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZmxvd19lbG0ubmV0X3BvcnRbZmxvd19lbG0ubnVtX25ldF0gPSBubmlfZ3BvcnQ7CisgICAgICAgICAgICBmbG93X2VsbS5udW1fbmV0Kys7CisJCQkKKyAgICAgICAgICAgIC8qIHBlcmZvcm0gdmxhbiB0cmFuc2xhdGlvbiBvbiBubmkgcG9ydCwgbm5pIGVncmVzcyBpbmZvIGlzIGluIHRoZSBVcHN0cmVhbSBjb25maWd1cmF0aW9uICovIAorICAgICAgICAgICAgaWYgKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX3VzX2Zsb3csIGZsb3csIGFjdGlvbikpIAorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBydiA9IGJjbV92bGFuX2NvbnRyb2xfcG9ydF9zZXQodW5pdCwgbm5pX2dwb3J0LCBiY21WbGFuUG9ydFRyYW5zbGF0ZUtleUZpcnN0LCBiY21WbGFuVHJhbnNsYXRlS2V5UG9ydE91dGVyKTsgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGZhaWwgdG8gcGVyZm9ybSB2bGFuIGNvbnRyb2wgcG9ydCBzZXQgb24gbm5pICVkXG4iLCBubmkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX2ludmxhbngodW5pdCwgcF9kc19mbG93LCBubmlfZ3BvcnQpOyAKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBmYWlsIHRvIHBlcmZvcm0gaW5ncmVzcyB2bGFuIHRyYW5zbGF0aW9uIG9uIG5uaSAlZFxuIiwgbm5pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9ICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX2V2bGFueCh1bml0LCBwX3VzX2Zsb3csIG5uaV9ncG9ydCk7IAorICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGZhaWwgdG8gcGVyZnJvbSBlZ3Jlc3MgdmxhbiB0cmFuc2xhdGlvbiBvbiBubmkgJWRcbiIsIG5uaSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaWYgY2xhc3NpZmllciBpcyBtb3JlIHRoYW4ganVzdCBwb3J0ICsgVkxBTiB0YWdzLCBhZGQgQUNMIHJ1bGUgdG8gcmUtZGlyZWN0IHBhY2tldCB0byBlZ3Jlc3MgcG9ydC4KKyAgICAgICAgICAgICAgIFRoaXMgYnlwYXNzIHRoZSBpbmdyZXNzIExJRiBhcyBMSUYgY2hlY2sgVklEIG9ubHkuIAorICAgICAgICAgICAgICAgVXBzdHJlYW0gY2xhc3NpZmljYXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgZG9uZSBpbiBPTlUgKG9udSBhZGQgR0VNIGJhc2VkIG9uIGNsYXNzaWZpZXJzIGZvciB1cHN0cmVhbSkgKi8KKyAgICAgICAgICAgIGlmKCBwX2Zsb3ctPmtleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNICAmJgorICAgICAgICAgICAgICAgIGJhbF9zd191dGlsX2Zsb3dfZHNfYWNsX2Nsc19jaGsocF9kc19mbG93KSA9PSBCQ01PU19UUlVFICkKKyAgICAgICAgICAgIHsgIAorICAgICAgICAgICAgICAgIC8qIGFkZCByZS1kaXJlY3QgcnVsZSAqLyAKKyAgICAgICAgICAgICAgICBpZiggQkNNT1NfVFJVRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZHNfZmxvdywgZmxvdywgbmV0d29ya19pbnRfaWQpKQorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfYWNsX2FkZCh1bml0LCBwX2RzX2Zsb3csICZmbG93X2VsbSwgIG5uaV9ncG9ydCwgcG9uX2dwb3J0KTsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLyogUnVsZSBuZWVkIHRvIG1hdGNoIHRoZSBuZXR3b3JrIHBvcnQsIG90aGVyd2lzZSwgaXQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgLSBubmkgYW5kIHBvbiAqLworICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQocF9kc19mbG93LCBmbG93LCBuZXR3b3JrX2ludF9pZCwgaWkpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfYWNsX2FkZCh1bml0LCBwX2RzX2Zsb3csICZmbG93X2VsbSwgIG5uaV9ncG9ydCwgcG9uX2dwb3J0KTsgCisgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9DTEVBUihwX2RzX2Zsb3csIGZsb3csIG5ldHdvcmtfaW50X2lkKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBmYWlsIHRvIGFkZCBmb3J3YXJkaW5nIGFjbCBvbiBubmkgJWQsIHJldCA9ICVkXG4iLCByZXQsIGlpKTsgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGFkZCBhIGRmdCBkcm9wIHJ1bGUgKHByaW9yaXR5IDApIG9uIHRoZSBMSUYgdG8gZHJvcCBwYWNrZXRzIHRoYXQgbWF0Y2ggVklEIGJ1dCBubyBtYXRjaCBmb3Igb3RoZXIgZmllbGRzICovCisgICAgICAgICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX2RmdF9hY2xfYWRkKHVuaXQsIHBfZHNfZmxvdywgJmZsb3dfZWxtLCBubmlfZ3BvcnQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGZhaWwgdG8gYWRkIGRlZmF1bHQgYWNsIG9uIG5uaT0weCV4LCByZXQgPSAlZFxuIiwgbm5pX2dwb3J0LCByZXQpOyAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgdGhlIHVzZXIgbmVlZHMgdG8gcGVyZnJvbSB1cHN0cmVhbSBjbGFzc2lmaWNhdGlvbiAoaW4gYWRkaXRpb24gdG8gVklEKSwKKyAgICAgICAgICAgICAgIEFkZCBhbiBBQ0wgcnVsZSB0byByZS1kaXJlY3QgcGFja2V0cy4gVGhlIEFDTCBhbHNvIGFsbG93IHVwc3RyZWFtIGZsb3dzIHRvIGJlIHByaW9yaXRpemVkIGJhc2VkIG9uIHByaW9yaXR5IGZpZWxkICovIAorICAgICAgICAgICAgaWYoIHBfZmxvdy0+a2V5LmZsb3dfdHlwZSA9PSBCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNICAmJgorICAgICAgICAgICAgICAgIGJhbF9zd191dGlsX2Zsb3dfdXNfYWNsX2Nsc19jaGsocF91c19mbG93KSA9PSBCQ01PU19UUlVFICAmJgorICAgICAgICAgICAgICAgIC8qIHRoZXJlIGFyZSBpc3N1ZXMgdXNpbmcgdHJhZGl0aW9uYWwgQVBJIGZvciBQT04gYXBwbGljYXRpb24gd2hlbiBlZ3Jlc3MgdmxhbiB0cmFuc2xhdGlvbiBhbmQgaW5ncmVzcyBBQ0wgYXJlIGJvdGggYWN0aXZlLgorICAgICAgICAgICAgICAgICAgIEVuYWJsZSB0aGUgQUNMIG9ubHkgd2hlbiB0aGVyZSBpcyBubyB2bGFuIGFjdGlvbiAtIFRCRCAqLworICAgICAgICAgICAgICAgIEJDTU9TX0ZBTFNFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93LCBmbG93LCBhY3Rpb24pKQorICAgICAgICAgICAgeyAgCisgICAgICAgICAgICAgICAgLyogQUNMIHJlcXVpcmVzIGFuIGFjdGlvbiwgY3VycmVudGx5IHN1cHBvcnQgdHJhcCBvciByZS1kaXJlY3QgdGhlIGZsb3cuCisgICAgICAgICAgICAgICAgICAgVFJBUCBoYXMgYmVlbiBoYW5kbGUgaW4gb3RoZXIgcGF0aCwgaGVyZSB3ZSByZXF1aXJlIHVzZXIgdG8gc3BlY2lmeSB3aGljaCBwb3J0IHRvIHJlLWRpcmVjdC4KKyAgICAgICAgICAgICAgICAgICBPdGhlciBvcHRpb25zIHdpbGwgYmUgYWRkaW5nIG11bHRpcGxlIEFDTCB0byBjb3ZlciBhbGwgcG9zc2libGUgZWdyZXNzIHBvcnRzIC0gVEJEICovIAorICAgICAgICAgICAgICAgIGlmKCBCQ01PU19GQUxTRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfdXNfZmxvdywgZmxvdywgbmV0d29ya19pbnRfaWQpKQorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBVcHN0cmVhbSBjbGFzc2lmaWVyIGluIGFkZGl0aW9uIHRvIFZJRCB3aXRob3V0IE5OSSBwb3J0IHNldCBpcyBub3Qgc3VwcG90cmVkXG4iKTsgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfYWNsX2FkZCh1bml0LCBwX3VzX2Zsb3csICZmbG93X2VsbSwgIHBvbl9ncG9ydCwgbm5pX2dwb3J0KTsgCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgZmFpbCB0byBhZGQgZm9yd2FyZGluZyBhY2wgb24gcG9uICVkLCByZXQgPSAlZFxuIiwgcmV0LCBwb24pOyAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogYWRkIGEgZGVmYXVsdCBkcm9wIHJ1bGUgKHByaW9yaXR5IDApIG9uIHRoZSBMSUYgdG8gZHJvcCBwYWNrZXRzIHRoYXQgbWF0Y2ggVklEIGJ1dCBubyBtYXRjaCBmb3Igb3RoZXIgZmllbGRzICovCisgICAgICAgICAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX2RmdF9hY2xfYWRkKHVuaXQsIHBfdXNfZmxvdywgJmZsb3dfZWxtLCBwb25fZ3BvcnQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGZhaWwgdG8gYWRkIGRlZmF1bHQgYWNsIG9uIHBvbj0weCV4LCByZXQgPSAlZFxuIiwgcG9uX2dwb3J0LCByZXQpOyAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAKKyAgICAgICAgICAgIGlpKys7IC8qIE5leHQgTk5JICovICAgICAgICAgICAgCisgICAgICAgIH0gCisgICAgICAgIC8qIHNraXAgdGhlIHJlc3QgaWYgYW55dGhpbmcgZ29lcyB3cm9uZyAqLyAgICAgICAgCisgICAgICAgIGlmKCByZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogQ29uZmlndXJlIFBDUC9Db3MgdG8gVHJhZmZpYyBDbGFzcyBtYXBwaW5nLiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIHRoZSBOTkkgTElGcyBhcmUgY3JlYXRlZCAqLyAKKyAgICAgICAgaWYgKHBfZmxvdy0+a2V5LmZsb3dfdHlwZSA9PSBCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU0gJiYgQkNNT1NfVFJVRSA9PSBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgc2xhKSkKKyAgICAgICAgeworICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+bnVtX25uaV9ncG9ydCA9IGZsb3dfZWxtLm51bV9uZXQ7CisgICAgICAgICAgICBmb3IoIGlpID0gMDsgaWkgPCBwX3NlcnZpY2VfY2ZnLT5udW1fbm5pX2dwb3J0OyBpaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfc2VydmljZV9jZmctPm5uaV9ncG9ydFtpaV0gPSBmbG93X2VsbS5uZXRfcG9ydFtpaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBiYWxfc3dfZHBwX2xsaWRfc2V0X3Fvc19wb3J0X21hcCh1bml0LCBwX3NlcnZpY2VfY2ZnKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBmYWlsIHRvIHBlcmZyb20gbm5pIHFvcyBwb3J0IG1hcCwgcmV0ID0gJWRcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgIH0gd2hpbGUoMCk7CisKKyAgICBpZiggcmV0ID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBhZGQgdGhlIGZsb3cgaW5mbyB0byB0aGUgbGluayBsaXN0ICovICAgICAgICAgCisgICAgICAgIGZsb3dfZWxtLnBfdnNpX3N2YyA9IHBfdnNpX3N2YzsKKyAgICAgICAgZmxvd19lbG0udnNpX3N2Y19pbmR4ID0gc3ZjX3RhZ19pbmR4OworICAgICAgICBmbG93X2VsbS5udW1fcG9uID0gMTsKKyAgICAgICAgZmxvd19lbG0ucF9zZXJ2aWNlX2NmZyA9ICBwX3NlcnZpY2VfY2ZnOworICAKKyAgICAgICAgLyogbm5pIHBvcnRzIGFyZSBkb25lIGluIHRoZSBubmkgbG9vcCAqLworICAgICAgICBmbG93X2VsbS52YWxpZCA9IDE7CisgICAgICAgIGJhbF9zd191dGlsX2Zsb3dfbGlzdF9pbnNlcnQoZmxvd19lbG0pOyAgIAorICAgICAgIAorICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiQWRkIGZsb3dfZWxtICVkICB0eXBlICVkLCB2c3dpdGNoIDB4JXgsIFN1Y2Nlc3NcbiIsIGZsb3dfZWxtLmlkLCBmbG93X2VsbS50eXBlLCBwX3ZzaV9zdmMtPnZzd2l0Y2gpOyAgICAgICAgCisgICAgfSAgICAgICAgCisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIEBicmllZiBUaGUgaW50ZXJuYWwgZmxvdyByZW1vdmUgZnVuY3Rpb24gcHJvZ3JhbSBEUFAgdG8gcmVsZWFzZSByZXNvdXJjZSB0aGF0CisgKiB3ZXJlIGFsbG9jYXRlZCBkdXJpbmcgdGhlIEFERCBvcGVyYXRpb24KKyAqCisgKiBAcGFyYW0gcF9mbG93X2VsbSAgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBmbG93IGxpc3QKKyAqCisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2Zsb3dfcmVtb3ZlX2ludChiYWxfc3dfZmxvdyAqcF9mbG93X2VsbSkKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGludCBydiwgaSwgZmxvd19pZDsKKyAgICBiYWxfc3dfdnNpX3NlcnZpY2UgKnBfdnNpX3N2YzsKKyAgICBiYWxfc3dfZ3JvdXBfbGlzdCAqcF9ncm91cF9saXN0OworICAgIAorICAgIGlmKHBfZmxvd19lbG0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiIGludmFsaWQgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgZmxvdyBsaXN0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorICAgIHBfdnNpX3N2YyA9IChiYWxfc3dfdnNpX3NlcnZpY2UgKikgcF9mbG93X2VsbS0+cF92c2lfc3ZjOyAgIAorICAgIC8qIGlmIGFueXRoaW5nIGdvIHdyb25nLCBsb2cgYSB3YXJuaW5nIGFuZCBjb250aW51ZSByZWxlYXNlIHJlc291cmNlcyAqLworICAgIGZvcihpID0gMDsgaSA8cF9mbG93X2VsbS0+bnVtX3BvbjsgaSsrKQorICAgIHsgICAgICAgCisgICAgICAgIHJ2ID0gYmNtX3Zzd2l0Y2hfcG9ydF9kZWxldGUocF9mbG93X2VsbS0+ZGV2aWNlLCBwX3ZzaV9zdmMtPnZzd2l0Y2gsIHBfZmxvd19lbG0tPnBvbl9wb3J0W2ldKTsKKyAgICAgICAgaWYocnYpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX3N3X3V0aWwsICIgdnN3aXRjaCBwb24gcG9ydCAweCV4IGRlbGV0ZSBmYWlsZWQgJWRcbiIsIHBfZmxvd19lbG0tPnBvbl9wb3J0W2ldLCBydik7CisgICAgICAgIH0KKyAgICAgICAgcnYgPSBiY21fdmxhbl9wb3J0X2Rlc3Ryb3kocF9mbG93X2VsbS0+ZGV2aWNlLCBwX2Zsb3dfZWxtLT5wb25fcG9ydFtpXSk7IAorICAgICAgICBpZihydikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwgIiB2c3dpdGNoIHBvbiBwb3J0IDB4JXggZGVzdHJveSBmYWlsZWQgJWRcbiIsIHBfZmxvd19lbG0tPnBvbl9wb3J0W2ldLCBydik7CisgICAgICAgIH0gCisgICAgICAgIHBfZmxvd19lbG0tPnBvbl9wb3J0W2ldID0gMDsgICAgICAgIAorICAgIH0KKyAgICBwX2Zsb3dfZWxtLT5udW1fcG9uID0gMDsKKyAgICAKKyAgICBmb3IoaSA9IDA7IGkgPHBfZmxvd19lbG0tPm51bV9uZXQ7IGkrKykKKyAgICB7ICAgIAorICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfcG9ydF9yZW0ocF9mbG93X2VsbS0+ZGV2aWNlLCBwX2Zsb3dfZWxtLT5wX3ZzaV9zdmMsIHBfZmxvd19lbG0tPnZzaV9zdmNfaW5keCwgcF9mbG93X2VsbS0+bmV0X3BvcnRbaV0pOworICAgICAgICBpZihyZXQgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwgIiB2c2kgc2VydmljZSBwb3J0IDB4JXggcmVtb3ZlIGZhaWxlZCAlZFxuIiwgcF9mbG93X2VsbS0+bmV0X3BvcnRbaV0sIHJldCk7CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICBwX2Zsb3dfZWxtLT5uZXRfcG9ydFtpXSA9IDA7ICAgICAgICAKKyAgICB9CisgICAgcF9mbG93X2VsbS0+bnVtX25ldCA9IDA7CisgICAgCisgICAgLyogcmVsZWFzZSB2c3dpdGNoICovCisgICAgaWYgKHBfdnNpX3N2YykKKyAgICB7CisgICAgICAgIC8qIHJlbW92ZSB0aGUgdnNpIGlmIG5vIG1vcmUgc2VydmljZSwgZGVzdHJveSBmdW5jdGlvbiB3aWxsIGRvIHRoZSBjb3VudGluZyAqLworICAgICAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfZGVzdHJveShwX2Zsb3dfZWxtLT5kZXZpY2UsIHBfdnNpX3N2Yyk7CisgICAgICAgIGlmKHJldCAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLCAiIHZzaSBzZXJ2aWNlIGRlc3Ryb3kgZmFpbGVkICVkXG4iLCByZXQpOworICAgICAgICB9ICAgICAgICAgICAKKyAgICB9CisgICAgICAgIC8qIGRlY3JlbWVudCB0aGUgZ3JvdXAgcmVmZXJlbmNlIGNvdW50ZXIgaW4gdGhlIGdyb3VwIGxpc3QgKi8KKyAgICBpZiAocF9mbG93X2VsbS0+Z3JvdXBfaWQpCisgICAgeworICAgICAgICBwX2dyb3VwX2xpc3QgPSBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfbGlzdF9nZXRfYnlfaWQocF9mbG93X2VsbS0+Z3JvdXBfaWQpOworICAgICAgICBpZiAoIHBfZ3JvdXBfbGlzdCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAiIFdBUk5JTkc6IE1DIGZsb3cgcmVtb3ZlIGNhbid0IGZpbmQgdGhlIG1jIGdyb3VwICVkIGluIHRoZSBsaXN0XG4iLCBwX2Zsb3dfZWxtLT5ncm91cF9pZCk7ICAgICAgICAgICAgCisgICAgICAgIH0gICAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihwX2dyb3VwX2xpc3QtPnVzZV9jb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX2dyb3VwX2xpc3QtPnVzZV9jb3VudC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICIgV0FSTklORzogTUMgZmxvdyByZW1vdmUgZmluZCB0aGUgbWMgZ3JvdXAgJWQgaW4gdGhlIGxpc3QgaGFzIG5vIHVzZV9jb3VudFxuIiwgcF9mbG93X2VsbS0+Z3JvdXBfaWQpOyAgCisgICAgICAgICAgICB9CisgICAgICAgIH0gCisgICAgfQorICAgIAorICAgIC8qIHJlbGVzZSB0cmFwICovCisgICAgaWYgKHBfZmxvd19lbG0tPnRyYXBfY29kZSkKKyAgICB7CisgICAgICAgIHJ2ID0gYmNtX3J4X3RyYXBfdHlwZV9kZXN0cm95KHBfZmxvd19lbG0tPmRldmljZSwgcF9mbG93X2VsbS0+dHJhcF9jb2RlKTsKKyAgICAgICAgaWYocnYpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX3N3X3V0aWwsICIgcnggdHJhcCAlZCBkZXN0cm95IGZhaWxlZCAlZFxuIiwgcF9mbG93X2VsbS0+dHJhcF9jb2RlLCBydik7CisgICAgICAgIH0KKyAgICAgICAgcF9mbG93X2VsbS0+dHJhcF9jb2RlID0gMDsKKyAgICAgICAgcF9mbG93X2VsbS0+dHJhcF9wb3J0ID0gMDsKKyAgICB9CisgICAgCisgICAgLyogcmVsZWFzZSBhY2wsIGlmIGFueSAqLworICAgIGZvcihpID0gMDsgaSA8cF9mbG93X2VsbS0+bnVtX2VpZDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZmxvd19lbG0tPmZpZWxkX2VudHJ5X2lkW2ldKQorICAgICAgICB7CisgICAgICAgICAgICBydiA9IGJjbV9maWVsZF9lbnRyeV9yZW1vdmUocF9mbG93X2VsbS0+ZGV2aWNlLCBwX2Zsb3dfZWxtLT5maWVsZF9lbnRyeV9pZFtpXSk7CisgICAgICAgICAgICBpZihydikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLCAiIGZpZWxkIGVudHJ5ICVkIHJlbW92ZSBmYWlsZWQgJWRcbiIsIHBfZmxvd19lbG0tPmZpZWxkX2VudHJ5X2lkW2ldLCBydik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydiA9IGJjbV9maWVsZF9lbnRyeV9kZXN0cm95KHBfZmxvd19lbG0tPmRldmljZSwgcF9mbG93X2VsbS0+ZmllbGRfZW50cnlfaWRbaV0pOworICAgICAgICAgICAgaWYocnYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwgIiBmaWVsZCBlbnRyeSAlZCBkZXN0cm95IGZhaWxlZCAlZFxuIiwgcF9mbG93X2VsbS0+ZmllbGRfZW50cnlfaWRbaV0sIHJ2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfZmxvd19lbG0tPmZpZWxkX2VudHJ5X2lkW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwX2Zsb3dfZWxtLT5udW1fZWlkID0gMDsKKyAgIAorICAgIC8qIHJlbGVhc2UgbGxpZCBxb3MsIGlmIGFueSAqLworICAgIGlmIChwX2Zsb3dfZWxtLT5wX3NlcnZpY2VfY2ZnKQorICAgIHsKKyAgICAgICAgLyogYW55IGVycm9yIGR1cmluZyBjbGVhbnVwIHdpbGwgYmUgcmVwb3J0ZWQsIGJ1dCBjb250aW51ZSBhbnl3YXkgKi8KKyAgICAgICAgYmFsX3N3X2RwcF9sbGlkX3Fvc19jbGVhbnVwKHBfZmxvd19lbG0tPmRldmljZSwgKGJhbF9zd19kcHBfcW9zX3NlcnZpY2VfY2ZnICopcF9mbG93X2VsbS0+cF9zZXJ2aWNlX2NmZyk7IAorICAgICAgICBiY21vc19mcmVlKHBfZmxvd19lbG0tPnBfc2VydmljZV9jZmcpOworICAgICAgICBwX2Zsb3dfZWxtLT5wX3NlcnZpY2VfY2ZnID0gTlVMTDsKKyAgICB9CisgICAgCisgICAgLyogcmVtb3ZlIGZyb20gdGhlIGludGVybmFsIGxpbmsgbGlzdCAqLworICAgIGZsb3dfaWQgPSBwX2Zsb3dfZWxtLT5pZDsKKyAgICByZXQgPSBiYWxfc3dfdXRpbF9mbG93X2xpc3RfcmVtb3ZlKHBfZmxvd19lbG0pOworICAgIGlmKHJldCA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBmbG93ICVkIGlzIHJlbW92ZWRcbiIsIGZsb3dfaWQpOworICAgICAgICByZXQgPSBCQ01fRVJSX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLCAiIGZhaWwgdG8gcmVtb3ZlIGZsb3cgJWQgdyByZXQgPSAlZFxuIiwgZmxvd19pZCwgcmV0KTsKKyAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIGZsb3cgcmVtb3ZlIGZ1bmN0aW9uIHByb2dyYW0gRFBQIHRvIHJlbGVhc2UgcmVzb3VyY2UgdGhhdAorICogd2VyZSBhbGxvY2F0ZWQgZHVyaW5nIHRoZSBBREQgb3BlcmF0aW9uCisgKgorICogQHBhcmFtIGl3Zl9tb2RlIFRoZSBJbnRlcldvcmtpbmcgRnVuY3Rpb24gbW9kZSAtIERJUkVDVCBvciBQRVItRkxPVworICogQHBhcmFtIHBfZmxvdyBBIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3RlZCBhZGQgZmxvdyBpbmZvCisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2Zsb3dfcmVtb3ZlKGJjbWJhbF9pd2ZfbW9kZSBpd2ZfbW9kZSwgIGJjbWJhbF9mbG93X2NmZyAqcF9mbG93KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgYmFsX3N3X2Zsb3cgKnBfZmxvd19lbG07CisgICAgaW50IGlpLCBydjsKKyAgICBiY21fcG9ydF9kaXNjYXJkX3QgZGlzY2FyZF90eXBlID0gQkNNX1BPUlRfRElTQ0FSRF9OT05FOworIAorICAgIGlmKHBfZmxvdyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgaW52YWxpZCBwb2ludGVyIHRvIHRoZSBiYWwgZmxvd1xuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0gICAKKyAgICAKKyAgICAvKiBtYWtlIHN1cmUgdGhlIGZsb3cgaWQgaXMgaW4gdGhlIGxpbmsgbGlzdCwgaWYgbm90IHJldHVybiBzdWNjZXNzIGFueXdheSAocHJvYmFibHkgY2xlYXJpbmcgYSBET1dOIGZsb3cpICovCisgICAgcF9mbG93X2VsbSA9IGJhbF9zd191dGlsX2Zsb3dfbGlzdF9nZXRfYnlfaWQgKHBfZmxvdy0+a2V5LmZsb3dfaWQpOworICAgIGlmKHBfZmxvd19lbG0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX3N3X3V0aWwsICIgZmxvdyAlZCBub3QgZXhpc3QgdGhlIGxpbmsgbGlzdFxuIiwgcF9mbG93LT5rZXkuZmxvd19pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0gIAorCisgICAgLyogaWYgZmxvd19lbG0gaGFzIHRoZSByZXF1ZXN0ZWQgZGlyZWN0aW9uLCBzZXQgc3dpdGNoIHRvIGRpc2NhcmQgcGFja2V0cyBmcm9tIHRoZSByZXF1ZXN0ZWQgZGlyZWN0aW9uLiAqLyAgICAgICAKKyAgICBpZiggKHBfZmxvd19lbG0tPnR5cGUgJiBCQUxfU1dfRkxPV19UWVBFX0RPV05TVFJFQU0pICAgICAgICAmJgorICAgICAgICAocF9mbG93LT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSkKKyAgICAgICkgICAgICAgIAorICAgIHsKKyAgICAgICAgZGlzY2FyZF90eXBlID0gQkNNX1BPUlRfRElTQ0FSRF9FR1JFU1M7CisgICAgfSAKKyAgICBlbHNlIGlmICgocF9mbG93X2VsbS0+dHlwZSAmIEJBTF9TV19GTE9XX1RZUEVfVVBTVFJFQU0pICAgICAgJiYKKyAgICAgICAgICAgICAocF9mbG93LT5rZXkuZmxvd190eXBlID09IEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0pICAgCisgICAgICAgICAgICApCisgICAgeworICAgICAgICBkaXNjYXJkX3R5cGUgPSBCQ01fUE9SVF9ESVNDQVJEX0lOR1JFU1M7CisgICAgfQorICAgIGVsc2UgaWYgKHBfZmxvd19lbG0tPnR5cGUgJiBCQUxfU1dfRkxPV19UWVBFX01VTFRJQ0FTVCkKKyAgICB7CisgICAgICAgIC8qIGNsZWFyIHJoZSB0eXBlIHNvIHRoYXQgaXQgY2FuIHJlbW92ZSB0aGUgZmxvdyBiZWxvdyAqLworICAgICAgICBwX2Zsb3dfZWxtLT50eXBlICY9IH5CQUxfU1dfRkxPV19UWVBFX01VTFRJQ0FTVDsKKyAgICB9ICAgICAgICAKKyAgICAKKyAgICBpZiAoZGlzY2FyZF90eXBlICE9IEJDTV9QT1JUX0RJU0NBUkRfTk9ORSkKKyAgICB7CisgICAgICAgIGZvcihpaT0wOyBpaTxwX2Zsb3dfZWxtLT5udW1fcG9uOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwX2Zsb3dfZWxtLT5wb25fcG9ydFtpaV0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBpZiBQT04gTElGIGlzIGRlbGV0ZWQsIHRoZW4gY29udGludWUgdG8gdGhlIG5leHQgcG9uICovCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydiA9IGJjbV9wb3J0X2Rpc2NhcmRfc2V0KHBfZmxvd19lbG0tPmRldmljZSwgcF9mbG93X2VsbS0+cG9uX3BvcnRbaWldLCBkaXNjYXJkX3R5cGUpOworICAgICAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbWFyayBhbiBlcnJvciwgYnV0IGNvbnRpbnVlICovCisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgYmNtX3BvcnRfZGlzY2FyZF9zZXQgZmFpbGVkICVkIG9uIHBvbiAweCV4XG4iLCBydiwgcF9mbG93X2VsbS0+cG9uX3BvcnRbaWldKTsgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGlmIChCQ01fRVJSX09LID09IHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHBfZmxvdy0+a2V5LmZsb3dfdHlwZSA9PSBCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9mbG93X2VsbS0+dHlwZSAmPSB+QkFMX1NXX0ZMT1dfVFlQRV9ET1dOU1RSRUFNOworICAgICAgICAgICAgfSAgCisgICAgICAgICAgICBlbHNlIGlmIChwX2Zsb3ctPmtleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSkKKyAgICAgICAgICAgIHsgIAorICAgICAgICAgICAgICAgIHBfZmxvd19lbG0tPnR5cGUgJj0gfkJBTF9TV19GTE9XX1RZUEVfVVBTVFJFQU07ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICIgU3VjY2VzcyByZW1vdmUgZmxvdyAlZCB3aXRoIHR5cGUgJWRcbiIsIHBfZmxvdy0+a2V5LmZsb3dfaWQsIHBfZmxvdy0+a2V5LmZsb3dfdHlwZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogcmVtb3ZlIHRoZSBmbG93IGZyb20gdGhlIGxpc3QgaWYgZXZlcnl0aGluZyBpcyBjbGVhbnVwICovCisgICAgaWYoQkFMX1NXX0ZMT1dfVFlQRV9OT05FID09IHBfZmxvd19lbG0tPnR5cGUpIAorICAgIHsKKyAgICAgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX2Zsb3dfcmVtb3ZlX2ludChwX2Zsb3dfZWxtKTsKKyAgICB9CisgICAKKyAgICByZXR1cm4gcmV0OworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBIZWxwZXIgcm91dGluZXMgYmVsb3cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgSGVscGVyIHJvdXRpbmUgdG8gcmV2ZXJzZSBhIGZsb3cgaS5lLiBhbiB1cHN0cmVhbSBmbG93IGlzIG1hZGUgYSBkb3duc3RyZWFtIGZsb3cKKyAqIGFuZCB2aWNlIHZlcnNhCisgKgorICogQHBhcmFtIHBfZmxvdyBBIHBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGZsb3cKKyAqIEBwYXJhbSBwX2Zsb3dfcmV2IEEgcG9pbnRlciB0byB0aGUgcmV2ZXJzZWQgZmxvdworICogQHJldHVybiBlcnJvciBjb2RlCisgKgorICogQG5vdGUgZm9yIG5vdyBpdCBhc3N1bWVzIGFuIHVudGFnZ2VkIG9yIHNpbmdsZSB0YWdnZWQgdmxhbiBmbG93IHdpdGggc2luZ2xlIHZsYW4gdGFnIGNsYXNzaWZpY2lhdGlvbgorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfcmV2ZXJzZV9mbG93X2NyZWF0ZShiY21iYWxfZmxvd19jZmcgKnBfZmxvdywgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3dfcmV2KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBpZiAoKHBfZmxvdyA9PSBOVUxMKSB8fCAocF9mbG93X3JldiA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworICAgIC8qIHJldmVyc2UgcGFyYW1ldGVycyBpbiBmbG93ICovCisgICAgbWVtY3B5KHBfZmxvd19yZXYsIHBfZmxvdywgc2l6ZW9mKGJjbWJhbF9mbG93X2NmZykpOworCisgICAgcF9mbG93X3Jldi0+a2V5LmZsb3dfdHlwZSA9IChwX2Zsb3ctPmtleS5mbG93X3R5cGUgPT0gQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSA/CisgICAgICAgIEJDTUJBTF9GTE9XX1RZUEVfRE9XTlNUUkVBTSA6IEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0pOworICAgIAorICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGRzdF9tYWMpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0FUVFJJQlVURV9QUk9QX1NFVCgmcF9mbG93X3Jldi0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBzcmNfbWFjLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5kc3RfbWFjKTsgICAgICAgIAorICAgIH0KKyAgICBlbHNlIC8qIGNsZWFyIHRoZSBzcmNfbWFjIHByZXNlbmNlIG1hc2sgaW4gdGhlIHJldmVyc2UgZmxvdyAqLworICAgIHsKKyAgICAgICAgQkNNQkFMX0FUVFJJQlVURV9QUk9QX0NMRUFSKCZwX2Zsb3dfcmV2LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIHNyY19tYWMpOworICAgIH0KKyAgICAKKyAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBzcmNfbWFjKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9TRVQoJnBfZmxvd19yZXYtPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgZHN0X21hYywgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuc3JjX21hYyk7ICAgICAgICAKKyAgICB9CisgICAgZWxzZSAvKiBjbGVhciB0aGUgZHN0X21hYyBwcmVzZW5jZSBtYXNrIGluIHRoZSByZXZlcnNlIGZsb3cgKi8KKyAgICB7CisgICAgICAgIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9DTEVBUigmcF9mbG93X3Jldi0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBkc3RfbWFjKTsKKyAgICB9CisKKyAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBkc3RfcG9ydCkpCisgICAgeworICAgICAgICBCQ01CQUxfQVRUUklCVVRFX1BST1BfU0VUKCZwX2Zsb3dfcmV2LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIHNyY19wb3J0LCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5kc3RfcG9ydCk7ICAgICAgICAKKyAgICB9CisgICAgZWxzZSAvKiBjbGVhciB0aGUgc3JjX3BvcnQgcHJlc2VuY2UgbWFzayBpbiB0aGUgcmV2ZXJzZSBmbG93ICovCisgICAgeworICAgICAgICBCQ01CQUxfQVRUUklCVVRFX1BST1BfQ0xFQVIoJnBfZmxvd19yZXYtPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgc3JjX3BvcnQpOworICAgIH0KKyAgICAKKyAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBzcmNfcG9ydCkpCisgICAgeworICAgICAgICBCQ01CQUxfQVRUUklCVVRFX1BST1BfU0VUKCZwX2Zsb3dfcmV2LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGRzdF9wb3J0LCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5zcmNfcG9ydCk7ICAgICAgICAKKyAgICB9IAorICAgIGVsc2UgLyogY2xlYXIgdGhlIGRzdF9wb3J0IHByZXNlbmNlIG1hc2sgaW4gdGhlIHJldmVyc2UgZmxvdyAqLworICAgIHsKKyAgICAgICAgQkNNQkFMX0FUVFJJQlVURV9QUk9QX0NMRUFSKCZwX2Zsb3dfcmV2LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGRzdF9wb3J0KTsKKyAgICB9CisgICAgICAgCisgICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgZHN0X2lwKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9TRVQoJnBfZmxvd19yZXYtPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgc3JjX2lwLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5kc3RfaXApOyAgICAgICAgCisgICAgfQorICAgIGVsc2UgLyogY2xlYXIgdGhlIHNyY19pcCBwcmVzZW5jZSBtYXNrIGluIHRoZSByZXZlcnNlIGZsb3cgKi8KKyAgICB7CisgICAgICAgIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9DTEVBUigmcF9mbG93X3Jldi0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBzcmNfaXApOworICAgIH0KKyAgICAKKyAgICBpZihCQ01PU19UUlVFID09IEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBzcmNfaXApKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0FUVFJJQlVURV9QUk9QX1NFVCgmcF9mbG93X3Jldi0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBkc3RfaXAsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnNyY19pcCk7ICAgICAgICAKKyAgICB9CisgICAgZWxzZSAvKiBjbGVhciB0aGUgZHN0X2lwIHByZXNlbmNlIG1hc2sgaW4gdGhlIHJldmVyc2UgZmxvdyAqLworICAgIHsKKyAgICAgICAgQkNNQkFMX0FUVFJJQlVURV9QUk9QX0NMRUFSKCZwX2Zsb3dfcmV2LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGRzdF9pcCk7CisgICAgfQorICAgICAgICAKKworICAgIGlmIChCQ01CQUxfQUNUSU9OX0NNRF9JRF9JU19TRVQoJihwX2Zsb3ctPmRhdGEuYWN0aW9uKSwgQkNNQkFMX0FDVElPTl9DTURfSURfQUREX09VVEVSX1RBRykpCisgICAgeworICAgICAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9DTEVBUigmKHBfZmxvd19yZXYtPmRhdGEuYWN0aW9uKSwgQkNNQkFMX0FDVElPTl9DTURfSURfQUREX09VVEVSX1RBRyk7CisgICAgICAgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1NFVCgmKHBfZmxvd19yZXYtPmRhdGEuYWN0aW9uKSwgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1JFTU9WRV9PVVRFUl9UQUcpOworCisgICAgICAgIC8qIHJlbW92ZSBvX3ZpZCBmcm9tIGFjdGlvbiAqLyAgICAgICAKKyAgICAgICAgQkNNQkFMX0FUVFJJQlVURV9QUk9QX0NMRUFSKCZwX2Zsb3dfcmV2LT5kYXRhLmFjdGlvbiwgYWN0aW9uLCBvX3ZpZCk7CisgICAgICAgIAorICAgICAgICBzd2l0Y2gocF9mbG93LT5kYXRhLmNsYXNzaWZpZXIucGt0X3RhZ190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9QS1RfVEFHX1RZUEVfVU5UQUdHRUQ6CisgICAgICAgICAgICAgICAgLyogQUREIG9uIHVudGFnZ2VkIHBhY2tldCByZXN1bHQgdG8gc2luZ2xlIHRhZ2dlZCBvbiByZXZlcnQgZGlyZWN0aW9uICovCisgICAgICAgICAgICAgICAgcF9mbG93X3Jldi0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSA9IEJDTUJBTF9QS1RfVEFHX1RZUEVfU0lOR0xFX1RBRzsKKyAgICAgICAgICAgICAgICBCQ01CQUxfQVRUUklCVVRFX1BST1BfU0VUKCZwX2Zsb3dfcmV2LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIG9fdmlkLCBwX2Zsb3ctPmRhdGEuYWN0aW9uLm9fdmlkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9TSU5HTEVfVEFHOgorICAgICAgICAgICAgICAgIC8qIEFERCBvbiBzaW5nbGUgdGFnZ2VkIHBhY2tldCByZXN1bHQgdG8gZG91YmxlIHRhZ2dlZCBvbiByZXZlcnQgZGlyZWN0aW9uICovCisgICAgICAgICAgICAgICAgcF9mbG93X3Jldi0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSA9IEJDTUJBTF9QS1RfVEFHX1RZUEVfRE9VQkxFX1RBRzsKKyAgICAgICAgICAgICAgICBwX2Zsb3dfcmV2LT5kYXRhLmNsYXNzaWZpZXIub192aWQgPSBwX2Zsb3ctPmRhdGEuYWN0aW9uLm9fdmlkOworICAgICAgICAgICAgICAgIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9TRVQoJnBfZmxvd19yZXYtPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgaV92aWQsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fdmlkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9ET1VCTEVfVEFHOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvKiBzaG91bGQgbm90IHJlYWNoIGhlcmUgKi8KKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZSBpZiAoQkNNQkFMX0FDVElPTl9DTURfSURfSVNfU0VUKCYocF9mbG93LT5kYXRhLmFjdGlvbiksICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9SRU1PVkVfT1VURVJfVEFHKSkgCisgICAgeworICAgICAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9DTEVBUigmKHBfZmxvd19yZXYtPmRhdGEuYWN0aW9uKSwgQkNNQkFMX0FDVElPTl9DTURfSURfUkVNT1ZFX09VVEVSX1RBRyk7CisgICAgICAgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1NFVCgmKHBfZmxvd19yZXYtPmRhdGEuYWN0aW9uKSwgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX0FERF9PVVRFUl9UQUcpOworCisgICAgICAgIC8qIGFkZCBvX3ZpZCB0byBhY3Rpb24gKi8gICAgICAgIAorICAgICAgICBCQ01CQUxfQVRUUklCVVRFX1BST1BfU0VUKCZwX2Zsb3dfcmV2LT5kYXRhLmFjdGlvbiwgYWN0aW9uLCBvX3ZpZCwgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIub192aWQpOworICAgICAgICBzd2l0Y2gocF9mbG93LT5kYXRhLmNsYXNzaWZpZXIucGt0X3RhZ190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9QS1RfVEFHX1RZUEVfRE9VQkxFX1RBRzoKKyAgICAgICAgICAgICAgICAvKiBSRU1PVkUgb24gZG91YmxlIHRhZ2dlZCBwYWNrZXQgcmVzdWx0IHRvIHNpbmdsZSB0YWdnZWQgb24gcmV2ZXJ0IGRpcmVjdGlvbiAqLworICAgICAgICAgICAgICAgIHBfZmxvd19yZXYtPmRhdGEuY2xhc3NpZmllci5wa3RfdGFnX3R5cGUgPSBCQ01CQUxfUEtUX1RBR19UWVBFX1NJTkdMRV9UQUc7CisgICAgICAgICAgICAgICAgcF9mbG93X3Jldi0+ZGF0YS5jbGFzc2lmaWVyLm9fdmlkID0gcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuaV92aWQ7CisgICAgICAgICAgICAgICAgQkNNQkFMX0FUVFJJQlVURV9QUk9QX0NMRUFSKCZwX2Zsb3dfcmV2LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGlfdmlkKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9QS1RfVEFHX1RZUEVfU0lOR0xFX1RBRzoKKyAgICAgICAgICAgICAgICAvKiBSRU1PVkUgb24gc2luZ2xlIHRhZ2dlZCBwYWNrZXQgcmVzdWx0IHRvIHVudGFnZ2VkIG9uIHJldmVydCBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICBwX2Zsb3dfcmV2LT5kYXRhLmNsYXNzaWZpZXIucGt0X3RhZ190eXBlID0gQkNNQkFMX1BLVF9UQUdfVFlQRV9VTlRBR0dFRDsKKyAgICAgICAgICAgICAgICBCQ01CQUxfQVRUUklCVVRFX1BST1BfQ0xFQVIoJnBfZmxvd19yZXYtPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgb192aWQpOyAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9VTlRBR0dFRDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLyogc2hvdWxkIG5vdCByZWFjaCBoZXJlICovCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAKKyAgICAgICAgLyogaWYgdGhlIHJlbW92ZSBjbGFzc2lmaWVyIGhhcyB0cGlkIGF0dHJpYnV0ZSwgc2V0IGl0IHdoZW4gQUREIGluIHJldmVyc2UgZGlyZWN0aW9uICovCisgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIG9fdHBpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgQkNNQkFMX0FUVFJJQlVURV9QUk9QX1NFVCgmcF9mbG93X3Jldi0+ZGF0YS5hY3Rpb24sIGFjdGlvbiwgb190cGlkLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3RwaWQpOworICAgICAgICAgICAgICBCQ01CQUxfQVRUUklCVVRFX1BST1BfQ0xFQVIoJnBfZmxvd19yZXYtPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgb190cGlkKTsKKyAgICAgICAgfQkJCQorICAgIH0KKyAgICBlbHNlIGlmIChCQ01CQUxfQUNUSU9OX0NNRF9JRF9JU19TRVQoJihwX2Zsb3ctPmRhdGEuYWN0aW9uKSwgIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1hMQVRFX09VVEVSX1RBRykpIAorICAgIHsKKyAgICAgICAgLyogc3dhcCBvdXRwdXQgdmlkIGFuZCBjbGFzc2lmaWVyIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgcF9mbG93X3Jldi0+ZGF0YS5hY3Rpb24ub192aWQgPSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3ZpZDsgCisgICAgICAgIHBfZmxvd19yZXYtPmRhdGEuY2xhc3NpZmllci5vX3ZpZCA9IHBfZmxvdy0+ZGF0YS5hY3Rpb24ub192aWQ7CisgICAgfQorICAgIAorICAgIGlmIChCQ01CQUxfQUNUSU9OX0NNRF9JRF9JU19TRVQoJihwX2Zsb3ctPmRhdGEuYWN0aW9uKSwgQkNNQkFMX0FDVElPTl9DTURfSURfUkVNQVJLX1BCSVRTKSkKKyAgICB7CisgICAgICAgIC8qIHN3YXAgb3V0cHV0IHBiaXRzIGFuZCBjbGFzc2lmaWVyIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgb19wYml0cykpCisgICAgICAgIHsgICAgICAgICAgICAgCisgICAgICAgICAgICBCQ01CQUxfQVRUUklCVVRFX1BST1BfU0VUKCZwX2Zsb3dfcmV2LT5kYXRhLmFjdGlvbiwgYWN0aW9uLCBvX3BiaXRzLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3BiaXRzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGlmIHRoZSBwYml0cyByZW1hcmsgaXMgZm9yIHBhY2tldHMgd2l0aCBhbnkgb19waWJ0cywgdGhlbiB0aGVyZSBpcyBubyBjbGVhciBSRVZFUlNFIG9wZXJhdGlvbi4KKyAgICAgICAgICAgICAgIFNldCB0aGUgcmV2ZXJzZSB0byBOTyBwYml0cyBhY3Rpb24uIGkuZSBwYml0cyBpcyBhIHBhc3N0aHJvdWdoCisgICAgICAgICAgICAgKi8gICAgICAgICAgIAorICAgICAgICAgICAgQkNNQkFMX0FUVFJJQlVURV9QUk9QX0NMRUFSKCZwX2Zsb3dfcmV2LT5kYXRhLmFjdGlvbiwgYWN0aW9uLCBvX3BiaXRzKTsgCisgICAgICAgICAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9DTEVBUigmKHBfZmxvd19yZXYtPmRhdGEuYWN0aW9uKSwgQkNNQkFMX0FDVElPTl9DTURfSURfUkVNQVJLX1BCSVRTKTsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQkNNQkFMX0FUVFJJQlVURV9QUk9QX1NFVCgmcF9mbG93X3Jldi0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBvX3BiaXRzLCBwX2Zsb3ctPmRhdGEuYWN0aW9uLm9fcGJpdHMpOyAgICAgICAgCisgICAgfQorICAgIC8vZWxzZSB0YmQgCisKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQGJyaWVmIEhlbHBlciByb3V0aW5lIHRvIGNvbXBhcmUgdHdvIGZsb3dzIGZvciBzeW1tZXRyeQorICoKKyAqIEBwYXJhbSBwX2Zsb3cgQSBwb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBmbG93CisgKiBAcGFyYW0gcF9yZWZfZmxvdyBBIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBmbG93CisgKiBAcmV0dXJuIFRSVUUgb3IgRkFMU0UgCisgKi8KK2JjbW9zX2Jvb2wgYmFsX3N3X3V0aWxfaXNfc3ltbWV0cnlfZmxvd3MoYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3csIGJjbWJhbF9mbG93X2NmZyAqcF9yZWZfZmxvdykKK3sKKyAgICBiY21vc19ib29sIHJldCA9IEJDTU9TX1RSVUU7CisgCisgICAgLyogY29tcGFyZSB0aGUgYWNjZXNzIGludGVyZmFjZSAqLworICAgIGlmKCBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgYWNjZXNzX2ludF9pZCkgIT0KKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX3JlZl9mbG93LCBmbG93LCBhY2Nlc3NfaW50X2lkKSAgKQorICAgIHsgCisgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICIgYWNjZXNzIGludGVyZmFjZSBTRVQgbm90IHRoZSBzYW1lIGZvciBmbG93ICVkXG4iLCBwX2Zsb3ctPmtleS5mbG93X2lkKTsgICAgICAgICAgICAgICAgCisgICAgICAgIHJldCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93LCBmbG93LCBhY2Nlc3NfaW50X2lkKSB8fCBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfcmVmX2Zsb3csIGZsb3csIGFjY2Vzc19pbnRfaWQpKSAgJiYKKyAgICAgICAgICAgIChwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCAhPSBwX3JlZl9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpICAgKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIGZsb3cgJWQgZG93bnN0cmVhbS91cHN0cmVhbSBhY2Nlc3MgaW50ZXJmYWNlICVkICE9ICVkIFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvdy0+a2V5LmZsb3dfaWQsIHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkLCBwX3JlZl9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQgKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICByZXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBjb21wYXJlIHRoZSBuZXR3b3JrIGludGVyZmFjZSAqLworICAgIGlmKCBCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfZmxvdywgZmxvdywgbmV0d29ya19pbnRfaWQpICE9CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9yZWZfZmxvdywgZmxvdywgbmV0d29ya19pbnRfaWQpICApCisgICAgeyAKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBuZXR3b3JrIGludGVyZmFjZSBTRVQgbm90IHRoZSBzYW1lIGZvciBmbG93ICVkXG4iLCBwX2Zsb3ctPmtleS5mbG93X2lkKTsgICAgICAgICAgICAgICAgCisgICAgICAgIHJldCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggKEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93LCBmbG93LCBuZXR3b3JrX2ludF9pZCkgfHxCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKHBfcmVmX2Zsb3csIGZsb3csIG5ldHdvcmtfaW50X2lkKSkgICYmCisgICAgICAgICAgICAocF9mbG93LT5kYXRhLm5ldHdvcmtfaW50X2lkICE9IHBfcmVmX2Zsb3ctPmRhdGEubmV0d29ya19pbnRfaWQpICAgKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIGZsb3cgJWQgZG93bnN0cmVhbS91cHN0cmVhbSBhY2Nlc3MgaW50ZXJmYWNlICVkICE9ICVkIFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvdy0+a2V5LmZsb3dfaWQsIHBfZmxvdy0+ZGF0YS5uZXR3b3JrX2ludF9pZCwgcF9yZWZfZmxvdy0+ZGF0YS5uZXR3b3JrX2ludF9pZCApOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfSAKKyAgCisgICAgLyogaWYgdGhlcmUgaXMgbm8gYWN0aW9uIGZvciB0aGUgZmxvdywgcGFja2V0IHR5cGUgYW5kIFZJRHMgc2hvdWxkIGJlIHRoZSBzYW1lICovICAgIAorICAgIC8qIGNvbXBhcmUgdGhlIElQdjQgYWRkcmVzc2VzICovCisgICAgaWYoQkNNT1NfRkFMU0UgPT0gQkNNQkFMX0NGR19QUk9QX0lTX1NFVChwX2Zsb3csIGZsb3csIGFjdGlvbikgICAmJgorICAgICAgIEJDTU9TX0ZBTFNFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9yZWZfZmxvdywgZmxvdywgYWN0aW9uKSkgCisgICAgeworICAgICAgICAvKiBjaGVjayBwYWNrZXQgdHlwZSAqLworICAgICAgICBpZiggQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIHBrdF90YWdfdHlwZSkgIT0KKyAgICAgICAgICAgIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfcmVmX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgcGt0X3RhZ190eXBlKSAgKQorICAgICAgICB7IAorICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBwYWNrZXQgdHlwZSBTRVQgbm90IHRoZSBzYW1lIGZvciBmbG93ICVkXG4iLCBwX2Zsb3ctPmtleS5mbG93X2lkKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICByZXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgcGt0X3RhZ190eXBlKSAgICYmCisgICAgICAgICAgICAgICAgKHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSAhPSBwX3JlZl9mbG93LT5kYXRhLmNsYXNzaWZpZXIucGt0X3RhZ190eXBlKSAgICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIGZsb3cgJWQgZG93bnN0cmVhbS91cHN0cmVhbSBwYWNrZXQgdHlwZSAlZCAhPSAlZCBcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mbG93LT5rZXkuZmxvd19pZCwgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIucGt0X3RhZ190eXBlLCBwX3JlZl9mbG93LT5kYXRhLmNsYXNzaWZpZXIucGt0X3RhZ190eXBlICk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldCA9IEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBjaGVjayB0aGUgb3V0ZXIgVklEICovICAgICAgICAKKyAgICAgICAgaWYoIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBvX3ZpZCkgIT0KKyAgICAgICAgICAgIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfcmVmX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgb192aWQpICApCisgICAgICAgIHsgCisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIG91dGVyIHZpZCBTRVQgbm90IHRoZSBzYW1lIGZvciBmbG93ICVkXG4iLCBwX2Zsb3ctPmtleS5mbG93X2lkKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICByZXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBCQ01CQUxfQVRUUklCVVRFX1BST1BfSVNfU0VUKCZwX2Zsb3ctPmRhdGEuY2xhc3NpZmllciwgY2xhc3NpZmllciwgb192aWQpICAgJiYKKyAgICAgICAgICAgICAgICAocF9mbG93LT5kYXRhLmNsYXNzaWZpZXIub192aWQgIT0gcF9yZWZfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fdmlkKSAgICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIGZsb3cgJWQgZG93bnN0cmVhbS91cHN0cmVhbSBvdXRlciB2aWQgJWQgIT0gJWQgXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvdy0+a2V5LmZsb3dfaWQsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fdmlkLCBwX3JlZl9mbG93LT5kYXRhLmNsYXNzaWZpZXIub192aWQgKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gCisgICAgICAgIC8qIGNoZWNrIHRoZSBpbm5lciBWSUQgKi8gICAgICAgIAorICAgICAgICBpZiggQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIsIGNsYXNzaWZpZXIsIGlfdmlkKSAhPQorICAgICAgICAgICAgQkNNQkFMX0FUVFJJQlVURV9QUk9QX0lTX1NFVCgmcF9yZWZfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBpX3ZpZCkgICkKKyAgICAgICAgeyAKKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICIgaW5uZXIgdmlkIFNFVCBub3QgdGhlIHNhbWUgZm9yIGZsb3cgJWRcbiIsIHBfZmxvdy0+a2V5LmZsb3dfaWQpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIEJDTUJBTF9BVFRSSUJVVEVfUFJPUF9JU19TRVQoJnBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLCBjbGFzc2lmaWVyLCBpX3ZpZCkgICAmJgorICAgICAgICAgICAgICAgIChwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5pX3ZpZCAhPSBwX3JlZl9mbG93LT5kYXRhLmNsYXNzaWZpZXIuaV92aWQpICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICIgZmxvdyAlZCBkb3duc3RyZWFtL3Vwc3RyZWFtIGlubmVyIHZpZCAlZCAhPSAlZCBcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9mbG93LT5rZXkuZmxvd19pZCwgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuaV92aWQsIHBfcmVmX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5pX3ZpZCApOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAKKyAgICB9CisgICAgZWxzZSAgLyogaWYgdGhlcmUgaXMgYW4gYWN0aW9uIC0gYWN0aW9uIGZvciBWSUQgbXVzdCBiZSBzeW1tZXRyaWNhbCAqLworICAgIHsKKyAgICAgICAgaWYoQkNNT1NfVFJVRSA9PSBCQ01CQUxfQUNUSU9OX0NNRF9JRF9JU19TRVQoJihwX2Zsb3ctPmRhdGEuYWN0aW9uKSwgQkNNQkFMX0FDVElPTl9DTURfSURfQUREX09VVEVSX1RBRykgJiYgCisgICAgICAgICAgIEJDTU9TX0ZBTFNFID09IEJDTUJBTF9BQ1RJT05fQ01EX0lEX0lTX1NFVCgmKHBfcmVmX2Zsb3ctPmRhdGEuYWN0aW9uKSwgQkNNQkFMX0FDVElPTl9DTURfSURfUkVNT1ZFX09VVEVSX1RBRykgKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIGZsb3cgJWQgZG93bnN0cmVhbS91cHN0cmVhbSBvdXRlciB2bGFuIGFjdGlvbiBub3Qgc3ltbWV0cmljYWwgXG4iLCBwX2Zsb3ctPmtleS5mbG93X2lkICk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0ID0gQkNNT1NfRkFMU0U7IAorICAgICAgICB9CisgICAgICAgIGlmKEJDTU9TX1RSVUUgPT0gQkNNQkFMX0FDVElPTl9DTURfSURfSVNfU0VUKCYocF9mbG93LT5kYXRhLmFjdGlvbiksIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1JFTU9WRV9PVVRFUl9UQUcpICYmIAorICAgICAgICAgICBCQ01PU19GQUxTRSA9PSBCQ01CQUxfQUNUSU9OX0NNRF9JRF9JU19TRVQoJihwX3JlZl9mbG93LT5kYXRhLmFjdGlvbiksIEJDTUJBTF9BQ1RJT05fQ01EX0lEX0FERF9PVVRFUl9UQUcpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIGZsb3cgJWQgdXBzdHJlYW0vZG93bnN0cmVhbSBvdXRlciB2bGFuIGFjdGlvbiBub3Qgc3ltbWV0cmljYWwgXG4iLCBwX2Zsb3ctPmtleS5mbG93X2lkICk7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0ID0gQkNNT1NfRkFMU0U7IAorICAgICAgICB9CisgICAgICAgIGlmKEJDTUJBTF9BQ1RJT05fQ01EX0lEX0lTX1NFVCgmKHBfZmxvdy0+ZGF0YS5hY3Rpb24pLCBCQ01CQUxfQUNUSU9OX0NNRF9JRF9YTEFURV9PVVRFUl9UQUcpICE9IAorICAgICAgICAgICBCQ01CQUxfQUNUSU9OX0NNRF9JRF9JU19TRVQoJihwX3JlZl9mbG93LT5kYXRhLmFjdGlvbiksIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1hMQVRFX09VVEVSX1RBRykpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsICIgZmxvdyAlZCB1cHN0cmVhbS9kb3duc3RyZWFtIG91dGVyIHZsYW4gdHJhbnNsYXRpb24gbm90IHN5bW1ldHJpY2FsIFxuIiwgcF9mbG93LT5rZXkuZmxvd19pZCApOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldCA9IEJDTU9TX0ZBTFNFOyAKKyAgICAgICAgfSAgIAorICAgICAgICAKKyAgICB9ICAgIAorICAgIAorICAgIHJldHVybiByZXQ7Cit9CisgICAKKyNlbmRpZiAvKiAjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSyAqLworCisvKkB9Ki8KKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfZmxvdy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfZmxvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5YmQ4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9mbG93LmgKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX2RwcF9mbG93LmgKKyAqCisgKiBAYnJpZWYgRnVuY3Rpb24gUHJvdG90eXBlIGZvciBzd2l0Y2ggYXBwIGZsb3cgZnVuY3Rpb25zIGZvciBEUFAgCisgKgorICogQGluZ3JvdXAgc3dpdGNoX2FwcAorICovCisKKyNpZm5kZWYgIF9CQUxfRFBQX0ZMT1dfSF8KKyNkZWZpbmUgIF9CQUxfRFBQX0ZMT1dfSF8KKworI2luY2x1ZGUgImJhbF9zd2l0Y2hfdXRpbC5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfZmxvdy5oIgorCisvKkB7Ki8KKworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2Zsb3dfYWRkKGJjbWJhbF9pd2ZfbW9kZSBpd2ZfbW9kZSwgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3cpOworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2Zsb3dfcmVtb3ZlKGJjbWJhbF9pd2ZfbW9kZSBpd2ZfbW9kZSwgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3cpOworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2Zsb3dfcmVtb3ZlX2ludChiYWxfc3dfZmxvdyAqcF9mbG93X2VsbSk7Cit2b2lkICAgICAgICBiYWxfc3dfdXRpbF9kcHBfZmxvd19pbml0KHZvaWQpOyAKKy8qQH0qLworIAorI2VuZGlmCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9ncm91cC5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfZ3JvdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTg5NGZkCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfZ3JvdXAuYwpAQCAtMCwwICsxLDcwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKyAvKioKKyAqIEBmaWxlIGJhbF9kcHBfZ3JvdXAuYworICogQGJyaWVmIEJBTCBTd2l0Y2ggdXRpbCBoZWxwZXIgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGdyb3VwIHJlcXVlc3RzCisgKiBAYWRkdG9ncm91cCBzd191dGlsCisgKi8KKworLypAeyovCisjaW5jbHVkZSA8YmFsX2NvbW1vbi5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgPGJhbF91dGlsc19tc2cuaD4KKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorCisjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSworI2luY2x1ZGUgPGJjbS90eXBlcy5oPgorI2luY2x1ZGUgPHNhbC9jb3JlL2xpYmMuaD4KKyNpZm5kZWYgc2FsX21lbXNldAorI2RlZmluZSBzYWxfbWVtc2V0IG1lbXNldAorI2VuZGlmCisjaW5jbHVkZSA8YmNtL3BvcnQuaD4KKyNpbmNsdWRlIDxiY20vdmxhbi5oPgorI2luY2x1ZGUgPGJjbS9lcnJvci5oPgorI2luY2x1ZGUgPGJjbS9tdWx0aWNhc3QuaD4KKworI2luY2x1ZGUgImJhbF9kcHBfZ3JvdXAuaCIKKyNpbmNsdWRlICJiYWxfc3dpdGNoX2FjY190ZXJtLmgiDQorI2luY2x1ZGUgImJhbF9kcHBfdnN3aXRjaC5oIgorDQorDQorCisvKiBBIGxvY2FsIGxpbmsgbGlzdCB0byBrZWVwIHRyYWNrIG9mIGdyb3VwIGxpc3QgKi8KK1RBSUxRX0hFQUQoYmFsX3N3X2dyb3VwX2xpc3RfaGVhZCwgYmFsX3N3X2dyb3VwX2xpc3QpIGdfc3d1dGlsX2dyb3VwX2xpc3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSBncm91cCBsaXN0IGluaXQgZnVuY3Rpb24gcHJlcGFyZSBhIGxpbmsgbGlzdCB0byBrZWVwIHRyYWNrIG9mIAorICogICAgICAgIG11bHRpY2FzdCBncm91cCBpbiB0aGUgc3dpdGNoIHV0aWwKKyAqCisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2dyb3VwX2xpc3RfaW5pdCh2b2lkKQoreworICAgIFRBSUxRX0lOSVQoJmdfc3d1dGlsX2dyb3VwX2xpc3QpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioKKyAqIEBicmllZiBUaGUgZ3JvdXAgbGlzdCBmaW5pc2ggZnVuY3Rpb24gcmVsZWFzZSBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBpbiB0aGUgbGlzdAorICoKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfbGlzdF9maW5pc2godm9pZCkKK3sKKwliYWxfc3dfZ3JvdXBfbGlzdCAqY3VycmVudF9lbnRyeSwgKnBfdGVtcF9lbnRyeTsKKworICAgIC8qIEZyZWUgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBsaXN0ICovCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICZnX3N3dXRpbF9ncm91cF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2dycCwKKyAgICAgICAgICAgICAgICAgICAgICAgcF90ZW1wX2VudHJ5KQorICAgIHsKKyAgICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QgKi8KKyAgICAgICAgVEFJTFFfUkVNT1ZFKCZnX3N3dXRpbF9ncm91cF9saXN0LCBjdXJyZW50X2VudHJ5LCBuZXh0X2dycCk7CisKKyAgICAgICAgYmNtb3NfZnJlZShjdXJyZW50X2VudHJ5KTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIGdyb3VwIGxpc3Qgc2VhcmNoIGZ1bmN0aW9uIGJ5IEJBTCBncm91cCBpZAorICoKKyAqIEBwYXJhbSBncnBfaWQgdGhlIGdyb3VwIGlkIHRoYXQgbmVlZCB0byBtYXRjaCB0aGUgZW50cnkgaW4gdGhlIGxpc3QKKyAqIEByZXR1cm4gcG9pbnRlciB0byBhbiBlbGVtZW50IGluIHRoZSBsaXN0LCBOVUxMIGlmIHNlYXJjaCBmYWlsZWQKKyAqLworYmFsX3N3X2dyb3VwX2xpc3QgKmJhbF9zd191dGlsX2RwcF9ncm91cF9saXN0X2dldF9ieV9pZCh1aW50MzJfdCBncnBfaWQpCit7CisgICAgYmFsX3N3X2dyb3VwX2xpc3QgKnBfZW50cnksICpwX3RlbXA7CisgICAgCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKHBfZW50cnksICZnX3N3dXRpbF9ncm91cF9saXN0LCBuZXh0X2dycCwgcF90ZW1wKQorICAgIHsgICAgICAgCisgICAgICAgIGlmKCBwX2VudHJ5LT5iYWxfZ3JwX2lkID09IGdycF9pZCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogaWYgcmVhY2ggdGhlIGVuZCBvZiB0aGUgbGlzdCwgVEFJTFFfRk9SRUFDSF9TQUZFIHNldCB0aGUgcF9lbnRyeSB0byBOVUxMICovCisgICAgcmV0dXJuIHBfZW50cnk7CisgICAKK30KKworLyoKKyAqIEBicmllZiBUaGUgZ3JvdXAgbGlzdCBpbnNlcnQgZnVuY3Rpb24KKyAqCisgKiBAcGFyYW0gZW50cnkgIHRoZSBncm91cCBlbGVtZW50IHRvIGJlIGFkZGVkIGluIHRoZSBsaW5rIGxpc3QKKyAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgbmV3bHkgaW5zZXJ0ZWQgZ3JvdXAgaW4gdGhlIGxpc3QsIE5VTEwgaWYgb3BlcmF0aW9uIGZhaWxlZCAKKyovCitzdGF0aWMgYmFsX3N3X2dyb3VwX2xpc3QgKmJhbF9zd191dGlsX2dyb3VwX2xpc3RfaW5zZXJ0KGJhbF9zd19ncm91cF9saXN0IGVudHJ5KQoreworICAgIGJhbF9zd19ncm91cF9saXN0ICpwX25ld19lbnRyeTsKKworICAgIHBfbmV3X2VudHJ5ID0gYmNtb3NfY2FsbG9jKHNpemVvZihiYWxfc3dfZ3JvdXBfbGlzdCkpOworICAgIGlmKE5VTEwgPT0gcF9uZXdfZW50cnkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkdST1VQIGxpc3QgaW5zZXJ0IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgKnBfbmV3X2VudHJ5ID0gZW50cnk7CisgICAgVEFJTFFfSU5TRVJUX1RBSUwoJmdfc3d1dGlsX2dyb3VwX2xpc3QsIHBfbmV3X2VudHJ5LCBuZXh0X2dycCk7CisgICAgcmV0dXJuIHBfbmV3X2VudHJ5OworfQorCisvKgorICogQGJyaWVmIFRoZSBncm91cCBsaXN0IHJlbW92ZSBmdW5jdGlvbgorICoKKyAqIEBwYXJhbSBwX2VudHJ5IFBvaW50ZXIgdG8gdGhlIGdyb3VwIGVsZW1lbnQgaW4gdGhlIGxpbmsgbGlzdCByZXN1bHQgZnJvbSB0aGUgc2VhcmNoIGZ1bmN0aW9ucworICogQHJldHVybiBlcnJvciBjb2RlCisqLworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9zd191dGlsX2dyb3VwX2xpc3RfcmVtb3ZlKGJhbF9zd19ncm91cF9saXN0ICpwX2VudHJ5KQoreworICAgIFRBSUxRX1JFTU9WRSgmZ19zd3V0aWxfZ3JvdXBfbGlzdCwgcF9lbnRyeSwgbmV4dF9ncnApOworICAgIGJjbW9zX2ZyZWUocF9lbnRyeSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKgorICogQGJyaWVmIFRoZSBncm91cCBsaXN0IG1lbWJlcnNoaXAgY2hlY2sgZnVuY3Rpb24gYnkgcG9ydAorICogICAgICAgIFZhbGlkYXRlIGlmIGludGVyZmFjZS9zdmVydmljZV9wb3J0IGlzIGFscmVhZHkgYSBtZW1iZXIgCisgKgorICogQHBhcmFtIHBfZ3JwX3BvcnQgdGhlIGludGVyZmFjZSB0aGF0IG5lZWQgdG8gYmUgbWF0Y2hlZCBpbiB0aGUgbGlzdAorICogQHBhcmFtIHBfZW50cnkgcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZ3JvdXAgbGlzdAorICogQHJldHVybiBpbmRleCB0byB0aGUgcG9ydCBtZW1iZXIsIC0xIGlmIG5vdCBmb3VuZAorICovCitzdGF0aWMgaW50IGJhbF9zd191dGlsX2RwcF9ncm91cF9saXN0X21lbWJlcnNoaXBfY2hlY2soYmFsX3N3X2dyb3VwX2xpc3QgKnBfZW50cnksIGJhbF9zd19ncm91cF9wb3J0ICpwX2dycF9wb3J0KQoreworICAgIGludCBpOworICAgIAorICAgIGlmKHBfZW50cnkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgbWVtYmVyc2hpcCBjaGVjayB3aXRoIE5VTEwgcGFyYW1ldGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKyAgICAKKyAgICBmb3IoaT0wOyBpPHBfZW50cnktPm51bV9wb3J0OyBpKyspCisgICAgeworICAgICAgICBpZihwX2VudHJ5LT5wb3J0W2ldLnBvcnQgPT0gcF9ncnBfcG9ydC0+cG9ydCAmJgorICAgICAgICAgICBwX2VudHJ5LT5wb3J0W2ldLnN2Y19wb3J0ID09IHBfZ3JwX3BvcnQtPnN2Y19wb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBwX2dycF9wb3J0LT5ncG9ydCA9IHBfZW50cnktPnBvcnRbaV0uZ3BvcnQ7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKy8qKgorICogQGJyaWVmIFRoZSBncm91cCBsaXN0IG1lbWJlcnNoaXAgcmVtb3ZlIGZ1bmN0aW9uIGJ5IHBvcnQKKyAqICAgICAgICByZW1vdmUgaW50ZXJmYWNlL3N2ZXJ2aWNlX3BvcnQgZnJvbSB0aGUgZ3JvdXAgbWVtYmVyc2hpcCAKKyAqCisgKiBAcGFyYW0gZ3JwX3BvcnQgdGhlIGludGVyZmFjZSB0aGF0IG5lZWQgdG8gYmUgbWF0Y2hlZCBpbiB0aGUgbGlzdAorICogQHBhcmFtIHBfZW50cnkgcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZ3JvdXAgbGlzdAorICogQHJldHVybiBib29sZW4gVFJVRSBvciBGQUxTRQorICovCitzdGF0aWMgYmNtb3NfYm9vbCBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfbGlzdF9tZW1iZXJzaGlwX3JlbShiYWxfc3dfZ3JvdXBfbGlzdCAqcF9lbnRyeSwgYmFsX3N3X2dyb3VwX3BvcnQgZ3JwX3BvcnQpCit7CisgICAgaW50IGksIHJ2OworICAgIAorICAgIGlmKHBfZW50cnkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgbWVtYmVyc2hpcCByZW1vdmUgd2l0aCBOVUxMIHBhcmFtZXRlclxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisgICAgCisgICAgZm9yKGk9MDsgaTxwX2VudHJ5LT5udW1fcG9ydDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYocF9lbnRyeS0+cG9ydFtpXS5wb3J0ID09IGdycF9wb3J0LnBvcnQgJiYKKyAgICAgICAgICAgcF9lbnRyeS0+cG9ydFtpXS5zdmNfcG9ydCA9PSBncnBfcG9ydC5zdmNfcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZGVzdHJveSB0aGUgdmxhbiBwb3J0IChpLmUuLCBQT04gTElGKSAqLworICAgICAgICAgICAgaWYocF9lbnRyeS0+cG9ydFtpXS5ncG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBydiA9IGJjbV92bGFuX3BvcnRfZGVzdHJveShwX2VudHJ5LT5kZXZpY2UsIHBfZW50cnktPnBvcnRbaV0uZ3BvcnQpOworICAgICAgICAgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwgIldhcm5pbmcsIEdST1VQOmJjbV92bGFuX3BvcnRfZGVzdHJveSBwb24gJWQgZmFpbGVkICVkXG4iLCBwX2VudHJ5LT5wb3J0W2ldLmdwb3J0LCBydik7ICAKKyAgICAgICAgICAgICAgICAgICAgLyogTGlrZWx5IGEgYnVnIGluIHRoZSA2LjUuNCByZWxlYXNlLCBpZ25vcmUgZm9yIG5vdyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOyAgCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX2VudHJ5LT5wb3J0W2ldLmdwb3J0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIGlmIGNhbid0IGZpbmQgdGhlIHBvcnQsIGp1c3QgcmV0dXJuIE9LICovCisgICAgaWYoaSAhPSBwX2VudHJ5LT5udW1fcG9ydCkKKyAgICB7CisgICAgICAgIC8qIHBhY2sgdGhlIGxpc3QgKi8KKyAgICAgICAgYmFsX3N3X2dyb3VwX3BvcnQgbnVsbF9wb3J0PXswfTsgICAgICAgCisgICAgICAgIGZvcig7IGk8cF9lbnRyeS0+bnVtX3BvcnQtMTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwX2VudHJ5LT5wb3J0W2ldID0gcF9lbnRyeS0+cG9ydFtpKzFdOworICAgICAgICB9CisgICAgICAgIHBfZW50cnktPnBvcnRbaV0gPSBudWxsX3BvcnQ7CisgICAgICAgIHBfZW50cnktPm51bV9wb3J0LS07CisgICAgfQorICAgICAgIAorICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisKKy8qKgorICogQGJyaWVmIFRoZSBncm91cCBjcmVhdGUgZnVuY3Rpb24gY3JlYXRlIGEgbXVsdGljYXN0IGdyb3VwIHRoYXQgY29udGFpbnMgZWdyZXNzIExJRi4gCisgKiAgICAgICAgVGhpcyBncm91cCBjYW4gbGF0ZXIgY29ubmVjdHMgdG8gdmlydHVhbCBzd2l0Y2ggaW4gbXVsdGlwbGUgRkxPV3MuICAKKyAqICAgICAgICAKKyAqICAgICAgICBUaGUgcG9pbnRlciBvZiB0aGUgY3JlYXRlZCBncm91cCB3aWxsIGJlIHJldHVybmVkCisgKiAgCisgKiBAcGFyYW0gdW5pdCAgICAgICBzd2l0Y2ggZGV2aWNlIGlkIAorICogQHBhcmFtIHBfZ3JwICAgICAgYSBwb2ludGVyIHRvIHRoZSBtdWx0aWNhc3QgZ3JvdXAgZGVmaW5pdGlvbgorICogCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIGdyb3VwIGxpc3QgZW50cnksIE5VTEwgaWYgb3BlcmF0aW9uIGZhaWxlZAorICovCisKK2JhbF9zd19ncm91cF9saXN0ICpiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfY3JlYXRlKGludCB1bml0LCBiY21iYWxfZ3JvdXBfY2ZnICpwX2dycCkKK3sKKyAgICBiYWxfc3dfZ3JvdXBfbGlzdCAqcF9ncnBfbGlzdCwgZ3JwX2xpc3RfZWxtOworICAgIGludDMyX3QgbXVsdGljYXN0X2lkOw0KKyAgICB1aW50MzJfdCBzdmNfaW5keDsKKyAgICBpbnQgcnYsIGZsYWdzOworICAgIGJhbF9zd192c2lfc2VydmljZSAqcF92c2lfc2VydmljZTsNCisgICAgCisgICAgaWYocF9ncnAgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgY3JlYXRlIHdpdGggTlVMTCBwYXJhbWV0ZXJcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogY2hlY2sgZ3JvdXAgbGlzdCAqLworICAgIHBfZ3JwX2xpc3QgPSBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfbGlzdF9nZXRfYnlfaWQocF9ncnAtPmtleS5ncm91cF9pZCk7CisgICAgaWYocF9ncnBfbGlzdCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgY3JlYXRlIHdpdGggZ3JvdXAgaWQgJWQgYWxyZWFkeSBleGlzdGVkXG4iLCBwX2dycC0+a2V5Lmdyb3VwX2lkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIGFsbG9jIGFuIGVudHJ5IGluIHRoZSBncm91cCBsaXN0Ki8KKyAgICBtZW1zZXQoJmdycF9saXN0X2VsbSwgMCwgc2l6ZW9mKGJhbF9zd19ncm91cF9saXN0KSk7CisgICAgZ3JwX2xpc3RfZWxtLmRldmljZSA9IHVuaXQ7CisgICAgZ3JwX2xpc3RfZWxtLmJhbF9ncnBfaWQgPSBwX2dycC0+a2V5Lmdyb3VwX2lkOworICAgIHBfZ3JwX2xpc3QgPSBiYWxfc3dfdXRpbF9ncm91cF9saXN0X2luc2VydChncnBfbGlzdF9lbG0pOworICAgIGlmKHBfZ3JwX2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgY3JlYXRlIGZhaWxlZCBpbnNlcnQgdG8gZ3JvdXAgbGlzdFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKw0KKyAgICAvKiBjcmVhdGUgYSB2c3dpdGNoIHdpdGggZW1wdHkgc2VydmljZSwgd2UgbmVlZCB2c2kgdG8gY3JlYXRlIHRoZSBNQyBmbG9vZGluZyBncm91cCBmb3IgZWdyZXNzICovDQorICAgIHBfdnNpX3NlcnZpY2UgPSBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfY3JlYXRlKHVuaXQsIE5VTEwsICZzdmNfaW5keCk7DQorICAgIGlmKE5VTEwgPT0gcF92c2lfc2VydmljZSkNCisgICAgew0KKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJjcmVhdGUgdnNpIHNlcnZpY2UgZm9yIGdyb3VwIGZhaWxlZCBcbiIpOw0KKyAgICAgICAgYmFsX3N3X3V0aWxfZ3JvdXBfbGlzdF9yZW1vdmUocF9ncnBfbGlzdCk7DQorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgIA0KKyAgICB9DQorICAgIA0KKyAgICBwX2dycF9saXN0LT5wX3ZzaSA9IHBfdnNpX3NlcnZpY2U7DQorICAgIA0KKyAgICBtdWx0aWNhc3RfaWQgPSBwX3ZzaV9zZXJ2aWNlLT52c3dpdGNoICsgQkFMX0RQUF9NQ19PRkZTRVQ7DQorICAgIAorICAgIHJ2ID0gYmNtX211bHRpY2FzdF9ncm91cF9pc19mcmVlKHVuaXQsIG11bHRpY2FzdF9pZCk7CisgICAgaWYgKHJ2ID09IEJDTV9FX0VYSVNUUykKKyAgICB7CisgICAgICAgIHJ2ID0gYmNtX211bHRpY2FzdF9kZXN0cm95KHVuaXQsIG11bHRpY2FzdF9pZCk7CisgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIk1DOiBiY21fbXVsdGljYXN0X2Rlc3Ryb3kgMHgleCBmYWlsZWQgJWQgXG4iLCBtdWx0aWNhc3RfaWQsIHJ2KTsKKyAgICAgICAgICAgIGJhbF9zd191dGlsX2dyb3VwX2xpc3RfcmVtb3ZlKHBfZ3JwX2xpc3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIGZsYWdzID0gQkNNX01VTFRJQ0FTVF9JTkdSRVNTX0dST1VQIHwgQkNNX01VTFRJQ0FTVF9XSVRIX0lEIHwgQkNNX01VTFRJQ0FTVF9UWVBFX0wyOworICAgIHJ2ID0gYmNtX211bHRpY2FzdF9jcmVhdGUodW5pdCwgZmxhZ3MsICZtdWx0aWNhc3RfaWQpOworICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIk1DOiBpbiBiY21fbXVsdGljYXN0X2NyZWF0ZSAweCV4IHcgaW5ncmVzcyBmYWlsZWQgJWQgXG4iLCBtdWx0aWNhc3RfaWQsIHJ2KTsKKyAgICAgICBiYWxfc3dfdXRpbF9ncm91cF9saXN0X3JlbW92ZShwX2dycF9saXN0KTsKKyAgICAgICAKKyAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiTUM6IHZzd2l0Y2ggZmxvb2QgZ3JvdXAgMHgleCBjcmVhdGVkXG4iLCBtdWx0aWNhc3RfaWQpOworICAgIH0KKyAgICAKKyAgICAvKiB1cGRhdGUgdGhlIGdyb3VwIGxpc3QgaW5mbyAqLworICAgIHBfZ3JwX2xpc3QtPmwyX2dycF9pZCA9IG11bHRpY2FzdF9pZDsKKyAgICByZXR1cm4gcF9ncnBfbGlzdDsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIGdyb3VwIGFkZCBmdW5jdGlvbiBhZGQgbWVtYmVycyB0byB0aGUgbXVsdGljYXN0IGdyb3VwLgorICogICAgICAgIEluIHRoaXMgZnVuY3Rpb24sIGdvdXJwIG1lbWJlcnMgYXJlIFBPTiBpbnRlcmZhY2VzICAKKyAqICAgICAgIAorICogQHBhcmFtIHVuaXQgICAgICAgc3dpdGNoIGRldmljZSBpZCAKKyAqIEBwYXJhbSBwX2dycCAgICAgIGEgcG9pbnRlciB0byB0aGUgbXVsdGljYXN0IGdyb3VwIGRlZmluaXRpb24KKyAqIAorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KKworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2dyb3VwX2FkZChpbnQgdW5pdCwgYmNtYmFsX2dyb3VwX2NmZyAqcF9ncnApCit7CisgICAgYmFsX3N3X2dyb3VwX2xpc3QgKnBfZ3JwX2xpc3Q7CisgICAgaW50IGksIHBvbiwgcnYsIGluZHg7IAorICAgIGJjbV9ncG9ydF90IHBvbl9ncG9ydDsKKyAgICBiY21vc19lcnJubyByZXQ7CisgICAgaW50IHBvbl9lbmNhcF9pZDsKKyAgICBiY21fdmxhbl9wb3J0X3QgdnA7CisgICAgdWludDMyX3QgZmxvb2RfZ3JwOworICAgIAorICAgIGlmKHBfZ3JwID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImdyb3VwIGFkZCB3aXRoIE5VTEwgcGFyYW1ldGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgLyogY2hlY2sgaWYgTDIgZ3JvdXAgaGFzIGJlZW4gY3JlYXRlZCAqLworICAgIHBfZ3JwX2xpc3QgPSBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfbGlzdF9nZXRfYnlfaWQocF9ncnAtPmtleS5ncm91cF9pZCk7CisgICAgaWYoIXBfZ3JwX2xpc3QpCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgYWRkIHdpbGwgYWxsb2MgYSBMMiBNQyBncm91cCwgZ3JvdXAgaWQgJWQgXG4iLCBwX2dycC0+a2V5Lmdyb3VwX2lkKTsKKyAgICAgICAgcF9ncnBfbGlzdCA9IGJhbF9zd191dGlsX2RwcF9ncm91cF9jcmVhdGUodW5pdCwgcF9ncnApOworICAgICAgICBpZihwX2dycF9saXN0ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgYWRkIGZhaWxlZCBjcmVhdGUgTDIgTWMgZ3JvdXBcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisgICAgICAgIH0KKyAgICB9IAorCisgICAgCisgICAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICAgICAKKyAgICBmb3IoaT0wOyBpPHBfZ3JwLT5kYXRhLm1lbWJlcnMubGVuOyBpKyspCisgICAgeworICAgICAgICBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gKnBfbWVtYmVyID0gJnBfZ3JwLT5kYXRhLm1lbWJlcnMudmFsW2ldOworICAgICAgICBiYWxfc3dfZ3JvdXBfcG9ydCBwb3J0X21lbWJlcjsKKyAgICAgICAgCisgICAgICAgIC8qIGZpbmQgdGhlIEwyIGxvZ2ljYWwgaW50ZXJmYWNlIG51bWJlciAqLworICAgICAgICBwb24gPSBiYWxfYmNtX3Bvbl9pbmZfcGJtX2dldChwX21lbWJlci0+aW50Zl9pZCk7CisgICAgICAgIAorICAgICAgICAvKiBjaGVjayBpZiBpbnRlcmZhY2UgaXMgYWxyZWFkeSBhIG1lbWJlciBpbiB0aGUgZ3JvdXAgbGlzdCAqLworICAgICAgICBwb3J0X21lbWJlci5wb3J0ICAgICA9IHBvbjsKKyAgICAgICAgcG9ydF9tZW1iZXIuc3ZjX3BvcnQgPSBwX21lbWJlci0+c3ZjX3BvcnRfaWQ7CisgICAgICAgIGlmKCAtMSAhPSBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfbGlzdF9tZW1iZXJzaGlwX2NoZWNrKHBfZ3JwX2xpc3QsICZwb3J0X21lbWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgInBvbiBpbnRlcmZhY2UgJWQgd2l0aCBzZXJ2aWNlIHBvcnQgJWQgYWxyZWFkeSBhIG1lbWJlclxuIixwX21lbWJlci0+aW50Zl9pZCwgcF9tZW1iZXItPnN2Y19wb3J0X2lkKTsKKyAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAKKyAgICAgICAgLyogY2hlY2sgaWYgaW50ZXJmYWNlIGFscmVhZHkgaGFzIGFuIGVudHJ5IGluIHRoZSBncm91cCBsaXN0ICovCisgICAgICAgIHBvcnRfbWVtYmVyLnBvcnQgICAgID0gcG9uOworICAgICAgICBwb3J0X21lbWJlci5zdmNfcG9ydCA9IDA7CisgICAgICAgIGluZHggPSBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfbGlzdF9tZW1iZXJzaGlwX2NoZWNrKHBfZ3JwX2xpc3QsICZwb3J0X21lbWJlcik7CisgICAgICAgIGlmKCAtMSA9PSBpbmR4KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBtYWtlIHN1cmUgdGhlcmUgaXMgc3RpbGwgcm9vbSBpbiB0aGUgZ3JvdXAgbGlzdCBmb3IgbmV3IG1lbWJlciAqLworICAgICAgICAgICAgaWYocF9ncnBfbGlzdC0+bnVtX3BvcnQgPj0gTUFYX1BPTl9QT1JUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IsIEdST1VQOiBSZWFjaCBtYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzaGlwIGluIHRoZSBncm91cCBsaXN0XG4iKTsgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PUkVTOworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgZ3JvdXAgaGFzIGEgb3duZXIsIGNyZWF0ZSBhIExJRiBmb3IgZWFjaCBtZW1iZXIgKi8gIAorICAgICAgICBpZihwX2dycC0+ZGF0YS5vd25lciAhPSBCQ01CQUxfR1JPVVBfT1dORVJfTk9ORSkKKyAgICAgICAgeyAgICAgICAKKyAgICAgICAgICAgLyogTWFwIHRoZSB0dW5uZWwgSUQgdG8gYSBQT04gY2hhbm5lbCBPVE0gcG9ydCAqLworICAgICAgICAgICAgcnYgPSBiY21fcG9ydF9wb25fdHVubmVsX21hcF9zZXQodW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWVtYmVyLT5zdmNfcG9ydF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbik7CisgICAgICAgICAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IsIEdST1VQOmJjbV9wb3J0X3Bvbl90dW5uZWxfbWFwX3NldCBvbiBwb24gJWQgZmFpbGVkICVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAoaGF2ZSB5b3UgY2hvc2VuIHRoZSBjb3JyZWN0IGludGZfbWFwdGFibGU/KVxuIiwgcG9uLCBydik7CisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBwb24gTElGIHRvIGJlIERTIG9ubHkgICovCisgICAgICAgICAgICBiY21fdmxhbl9wb3J0X3RfaW5pdCgmdnApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBwcmVzZXJ2ZSBhbnkgaW5jb21pbmcgcGFja2V0IHZsYW4gdGFncywgaWYgdmxhbiBhY3Rpb25zIGFyZSByZXF1aXJlZCwgZG8gaXQgdXNpbmcgZWdyZXNzIHRyYW5zbGF0aW9uICovCisgICAgICAgICAgICB2cC5mbGFncyA9ICBCQ01fVkxBTl9QT1JUX09VVEVSX1ZMQU5fUFJFU0VSVkUgIHwgQkNNX1ZMQU5fUE9SVF9JTk5FUl9WTEFOX1BSRVNFUlZFOyAgICAgICAgCisgICAgICAgICAgICAvKiBJdCBpcyByZXF1aXJlZCB0byBzZXQgdGhlIEZFQyBmbGFnIHNvIHRoYXQgdGhlIGVncmVzcyByZWRpcmVjdGlvbiBhY3Rpb24gZnJvbSB0aGUgRFMgY2xhc3NpZmljYXRpb24gY2FuIAorICAgICAgICAgICAgICAgc2VsZWN0IHRoZSBjb3JyZWN0IFBPTiBMSUYgdG8gZm9yd2FyZCB0aGUgcGFja2V0ICovCisgICAgICAgICAgICB2cC5mbGFncyB8PSBCQ01fVkxBTl9QT1JUX0ZPUldBUkRfR1JPVVA7IAorICAgICAgICAgICAgCisgICAgICAgICAgICB2cC5jcml0ZXJpYSA9IEJDTV9WTEFOX1BPUlRfTUFUQ0hfUE9SVF9UVU5ORUw7CisgICAgICAKKyAgICAgICAgICAgIHZwLnBvcnQgPSBwb247ICAgICAgICAKKyAgICAgICAgICAgIHZwLm1hdGNoX3R1bm5lbF92YWx1ZSA9IHBfbWVtYmVyLT5zdmNfcG9ydF9pZDsKKyAgICAgICAgICAgIHZwLmVncmVzc190dW5uZWxfdmFsdWUgPSBwX21lbWJlci0+c3ZjX3BvcnRfaWQ7CisgICAgICAKKyAgICAgICAgICAgIHZwLnZzaSA9IDA7IC8qIHdpbGwgYmUgcG9wdWxhdGVkIHdoZW4gdGhlIGdwb3J0IGlzIGFkZGVkIHRvIHNlcnZpY2UsIHVzaW5nIHZzd2l0Y2hfcG9ydF9hZGQgKi8KKyAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDcmVhdGUgdGhlIHZsYW4gcG9ydCAoaS5lLiwgUE9OIExJRikgKi8KKyAgICAgICAgICAgIHJ2ID0gYmNtX3ZsYW5fcG9ydF9jcmVhdGUodW5pdCwgJnZwKTsKKyAgICAgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIEdST1VQOmJjbV92bGFuX3BvcnRfY3JlYXRlIHBvbiAlZCBmYWlsZWQgJWRcbiIsIHBvbiwgcnYpOyAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiSW5mbywgR1JPVVA6YmNtX3ZsYW5fcG9ydF9jcmVhdGUgcG9uICVkIHdpdGggdHVubmVsICVkIHN1Y2Nlc3NcbiIsIHBvbiwgcF9tZW1iZXItPnN2Y19wb3J0X2lkKTsgCisgICAgICAgICAgICB9CisgICAgIAorICAgICAgICAgICAgcG9uX2dwb3J0ID0gdnAudmxhbl9wb3J0X2lkOworICAgICAgICAgICAgcnYgPSBiY21fcG9ydF9kaXNjYXJkX3NldCh1bml0LCBwb25fZ3BvcnQsIEJDTV9QT1JUX0RJU0NBUkRfSU5HUkVTUyk7CisgICAgICAgICAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBHUk9VUDpiY21fcG9ydF9kaXNjYXJkX3NldCBvbiBwb24gJWQgZmFpbGVkICVkXG4iLCBwb24sIHJ2KTsgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOyAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBzZWxlY3QgdGhlIGZsb29kaW5nIGdyb3VwICovCisgICAgICAgICAgICBpZihwX2dycC0+ZGF0YS5vd25lciA9PSBCQ01CQUxfR1JPVVBfT1dORVJfTVVMVElDQVNUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb29kX2dycCA9IHBfZ3JwX2xpc3QtPmwyX2dycF9pZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9vZF9ncnAgPSAocF9ncnBfbGlzdC0+cF92c2kpLT5kc19mbG9vZF9ncnBfaWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBqb2luIHRoZSBMMiBtdWx0aWNhc3QgZ3JvdXAgKi8KKyAgICAgICAgICAgIHJ2ID0gYmNtX211bHRpY2FzdF92bGFuX2VuY2FwX2dldCh1bml0LCBmbG9vZF9ncnAsIHBvbiwgcG9uX2dwb3J0LCAmcG9uX2VuY2FwX2lkKTsKKyAgICAgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIEdST1VQOmJjbV92bGFuX2VuY2FwX2dldCBvbiBwb24gJWQgZmFpbGVkICVkXG4iLCBwb24sIHJ2KTsgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOyAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnYgPSBiY21fbXVsdGljYXN0X2luZ3Jlc3NfYWRkKHVuaXQsIGZsb29kX2dycCwgcG9uLCBwb25fZW5jYXBfaWQpOworICAgICAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgR1JPVVA6YmNtX211bHRpY2FzdF9pbmdyZXNzX2FkZCBvbiBwb24gJWQgZmFpbGVkICVkXG4iLCBwb24sIHJ2KTsgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOyAgICAgICAgICAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkluZm8sIEdST1VQOnBvbiAlZCBqb2luIGwyIG1jIGdyb3VwIDB4JXggc3VjY2Vzc1xuIiwgcG9uLCBmbG9vZF9ncnApOyAKKyAgICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgZ3JvdXAgbGlzdCBtZW1iZXJzaGlwICovCisgICAgICAgICAgICBwb3J0X21lbWJlci5ncG9ydCA9IHBvbl9ncG9ydDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcnRfbWVtYmVyLmdwb3J0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBwX2dycF9saXN0LT5wb3J0W3BfZ3JwX2xpc3QtPm51bV9wb3J0XSA9IHBvcnRfbWVtYmVyOworICAgICAgICBwX2dycF9saXN0LT5udW1fcG9ydCsrOworICAgICAgICAKKyAgICB9CisgICAgCisgICAKKyAgICByZXR1cm4gcmV0OyAgICAgCit9CisKKworLyoqCisgKiBAYnJpZWYgVGhlIGdyb3VwIHJlbW92ZSBmdW5jdGlvbiByZW1vdmUgbWVtYmVycyBmcm9tIHRoZSBtdWx0aWNhc3QgZ3JvdXAuCisgKiAgICAgICAgSW4gdGhpcyBmdW5jdGlvbiwgZ3JvdXAgbWVtYmVycyBhcmUgUE9OIGludGVyZmFjZXMgIAorICogICAgICAgCisgKiBAcGFyYW0gdW5pdCAgICAgICBzd2l0Y2ggZGV2aWNlIGlkIAorICogQHBhcmFtIHBfZ3JwICAgICAgYSBwb2ludGVyIHRvIHRoZSBtdWx0aWNhc3QgZ3JvdXAgZGVmaW5pdGlvbgorICogCisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyAqLworCitiY21vc19lcnJubyBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfcmVtKGludCB1bml0LCBiY21iYWxfZ3JvdXBfY2ZnICpwX2dycCkKK3sKKyAgICBiYWxfc3dfZ3JvdXBfbGlzdCAqcF9ncnBfbGlzdDsKKyAgICBpbnQgaSwgcG9uLCBydjsgCisgICAgYmNtb3NfZXJybm8gcmV0OworICAgIGludCBwb25fZW5jYXBfaWQ7CisgICAgCisgICAgaWYocF9ncnAgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgcmVtb3ZlIHdpdGggTlVMTCBwYXJhbWV0ZXJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICAvKiBjaGVjayBpZiBMMiBncm91cCBoYXMgYmVlbiBjcmVhdGVkICovCisgICAgcF9ncnBfbGlzdCA9IGJhbF9zd191dGlsX2RwcF9ncm91cF9saXN0X2dldF9ieV9pZChwX2dycC0+a2V5Lmdyb3VwX2lkKTsKKyAgICBpZighcF9ncnBfbGlzdCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgcmVtb3ZlIGNhbiBub3QgZmluZCBMMiBNYyBncm91cCAlZFxuIiwgcF9ncnAtPmtleS5ncm91cF9pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0gCisKKyAgICAvKiByZW1vdmUgTElGIGZvciBlYWNoIG1lbWJlciAqLyAgCisgICAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBmb3IoaT0wOyBpPHBfZ3JwLT5kYXRhLm1lbWJlcnMubGVuOyBpKyspCisgICAgeworICAgICAgICBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gKnBfbWVtYmVyID0gJnBfZ3JwLT5kYXRhLm1lbWJlcnMudmFsW2ldOworICAgICAgICBiYWxfc3dfZ3JvdXBfcG9ydCBwb3J0X21lbWJlcjsKKyAgICAgICAgCisgICAgICAgIC8qIGZpbmQgdGhlIEwyIGxvZ2ljYWwgaW50ZXJmYWNlIG51bWJlciAqLworICAgICAgICBwb24gPSBiYWxfYmNtX3Bvbl9pbmZfcGJtX2dldChwX21lbWJlci0+aW50Zl9pZCk7CisgICAgICAgIAorICAgICAgICAvKiBjaGVjayBpZiBpbnRlcmZhY2UgaXMgYWxyZWFkeSByZW1vdmVkIGZyb20gdGhlIGdyb3VwIGxpc3QgKi8KKyAgICAgICAgcG9ydF9tZW1iZXIucG9ydCAgICAgPSBwb247CisgICAgICAgIHBvcnRfbWVtYmVyLnN2Y19wb3J0ID0gcF9tZW1iZXItPnN2Y19wb3J0X2lkOworICAgICAgICBpZiggLTEgPT0gYmFsX3N3X3V0aWxfZHBwX2dyb3VwX2xpc3RfbWVtYmVyc2hpcF9jaGVjayhwX2dycF9saXN0LCAmcG9ydF9tZW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAicG9uIGludGVyZmFjZSAlZCB3aXRoIHNlcnZpY2UgcG9ydCAlZCBpcyBub3QgYSBtZW1iZXJcbiIscF9tZW1iZXItPmludGZfaWQsIHBfbWVtYmVyLT5zdmNfcG9ydF9pZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogaWYgdGhlIG1lbWJlciBoYXMgYSBMSUYgYXNzaWduZWQsIHJlbW92ZSBpdCBmcm9tIHRoZSBzd2l0Y2ggbXVsdGljYXN0IGdyb3VwICovCisgICAgICAgIGlmKHBvcnRfbWVtYmVyLmdwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBsZWF2ZSB0aGUgTDIgbXVsdGljYXN0IGdyb3VwICovICAgICAgICAKKyAgICAgICAgICAgICBydiA9IGJjbV9tdWx0aWNhc3Rfdmxhbl9lbmNhcF9nZXQodW5pdCwgcF9ncnBfbGlzdC0+bDJfZ3JwX2lkLCBwb24sIHBvcnRfbWVtYmVyLmdwb3J0LCAmcG9uX2VuY2FwX2lkKTsKKyAgICAgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIEdST1VQOmJjbV92bGFuX2VuY2FwX2dldCBvbiBwb24gJWQgZmFpbGVkICVkXG4iLCBwb24sIHJ2KTsgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOyAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnYgPSBiY21fbXVsdGljYXN0X2luZ3Jlc3NfZGVsZXRlKHVuaXQsIHBfZ3JwX2xpc3QtPmwyX2dycF9pZCwgcG9uLCBwb25fZW5jYXBfaWQpOworICAgICAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgR1JPVVA6YmNtX211bHRpY2FzdF9pbmdyZXNzX2RlbGV0ZSBvbiBwb24gJWQgZmFpbGVkICVkXG4iLCBwb24sIHJ2KTsgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOyAgICAgICAgICAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggQkNNT1NfRkFMU0UgPT0gYmFsX3N3X3V0aWxfZHBwX2dyb3VwX2xpc3RfbWVtYmVyc2hpcF9yZW0ocF9ncnBfbGlzdCwgcG9ydF9tZW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAicG9uIGludGVyZmFjZSAlZCB3aXRoIHNlcnZpY2UgcG9ydCAlZCBtZW1iZXJzaGlwIHJlbW92ZSBmYWlsZWRcbiIscF9tZW1iZXItPmludGZfaWQsIHBfbWVtYmVyLT5zdmNfcG9ydF9pZCk7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgYnJlYWs7ICAKKyAgICAgICAgfSAgCisgICAgfQorICAKKyAgICByZXR1cm4gcmV0OyAgICAgCit9CisKKy8qKgorICogQGJyaWVmIFRoZSBncm91cCBzZXQgZnVuY3Rpb24gcmVwbGFjZSBtZW1iZXJzIGZyb20gdGhlIG11bHRpY2FzdCBncm91cC4KKyAqICAgICAgICBJbiB0aGlzIGZ1bmN0aW9uLCBncm91cCBtZW1iZXJzIGFyZSBQT04gaW50ZXJmYWNlcyAgCisgKiAgICAgICAKKyAqIEBwYXJhbSB1bml0ICAgICAgIHN3aXRjaCBkZXZpY2UgaWQgCisgKiBAcGFyYW0gcF9ncnAgICAgICBhIHBvaW50ZXIgdG8gdGhlIG11bHRpY2FzdCBncm91cCBkZWZpbml0aW9uCisgKiAKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCisKK2JjbW9zX2Vycm5vIGJhbF9zd191dGlsX2RwcF9ncm91cF9zZXQoaW50IHVuaXQsIGJjbWJhbF9ncm91cF9jZmcgKnBfZ3JwKQoreworICAgIGJhbF9zd19ncm91cF9saXN0ICpwX2dycF9saXN0OworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgaW50IHBvbl9lbmNhcF9pZDsKKyAgICAKKyAgICBpZihwX2dycCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJncm91cCByZXBsYWNlIHdpdGggTlVMTCBwYXJhbWV0ZXJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICAvKiBjaGVjayBpZiBMMiBncm91cCBoYXMgYmVlbiBjcmVhdGVkICovCisgICAgcF9ncnBfbGlzdCA9IGJhbF9zd191dGlsX2RwcF9ncm91cF9saXN0X2dldF9ieV9pZChwX2dycC0+a2V5Lmdyb3VwX2lkKTsKKyAgICBpZighcF9ncnBfbGlzdCkKKyAgICB7CisgICAgICAgIC8qIG1hcmsgaXQgT0sgdG8gY3JlYXRlIGdyb3VwIGF0IHRoZSBlbmQgKi8KKyAgICAgICAgcmV0ID0gQkNNX0VSUl9PSzsKKyAgICB9IAorICAgIGVsc2UgaWYocF9ncnBfbGlzdC0+bnVtX3BvcnQpCisgICAgeworICAgICAgICAvKiByZW1vdmUgYWxsIG1lbWJlcnMgZnJvbSB0aGUgZ3JvdXAgKi8KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHBfZ3JwX2xpc3QtPnBvcnRbMF0uZ3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZWF2ZSB0aGUgTDIgbXVsdGljYXN0IGdyb3VwICovICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoQkNNX0VfTk9ORSAhPSBiY21fbXVsdGljYXN0X3ZsYW5fZW5jYXBfZ2V0KHVuaXQsIHBfZ3JwX2xpc3QtPmwyX2dycF9pZCwgcF9ncnBfbGlzdC0+cG9ydFswXS5wb3J0LCBwX2dycF9saXN0LT5wb3J0WzBdLmdwb3J0LCAmcG9uX2VuY2FwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIEdST1VQOmJjbV92bGFuX2VuY2FwX2dldCBvbiBwb24gJWQgZmFpbGVkXG4iLCBwX2dycF9saXN0LT5wb3J0WzBdLnBvcnQpOyAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOyAgICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKEJDTV9FX05PTkUgIT0gYmNtX211bHRpY2FzdF9pbmdyZXNzX2RlbGV0ZSh1bml0LCBwX2dycF9saXN0LT5sMl9ncnBfaWQsIHBfZ3JwX2xpc3QtPnBvcnRbMF0ucG9ydCwgcG9uX2VuY2FwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIEdST1VQOmJjbV9tdWx0aWNhc3RfaW5ncmVzc19kZWxldGUgb24gcG9uICVkIGZhaWxlZFxuIiwgcF9ncnBfbGlzdC0+cG9ydFswXS5wb3J0KTsgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBCQ01PU19GQUxTRSA9PSBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfbGlzdF9tZW1iZXJzaGlwX3JlbShwX2dycF9saXN0LCBwX2dycF9saXN0LT5wb3J0WzBdKSkKKyAgICAgICAgICAgIHsgICAgICAgICAgCisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJncm91cCBzZXQgZmFpbCB0byByZW1vdmUgZXhpc3RpbmcgbWVtYmVyIGludGVyZmFjZSAlZFxuIixwX2dycF9saXN0LT5wb3J0WzBdLnBvcnQgKTsKKyAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gICAgICAKKyAgICAgICAgfXdoaWxlKHBfZ3JwX2xpc3QtPm51bV9wb3J0KTsKKyAgICB9CisgIAorICAgIGlmKHJldCA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogY3JlYXRlL2FkZCB0aGUgZ3JvdXAgKi8KKyAgICAgICAgcmV0dXJuIGJhbF9zd191dGlsX2RwcF9ncm91cF9hZGQodW5pdCwgcF9ncnApOworICAgIH0KKyAgICByZXR1cm4gcmV0OyAgICAgCit9CisKKy8qKgorICogQGJyaWVmIFRoZSBncm91cCBkZXN0cm95IGZ1bmN0aW9uIGZyZWUgdXAgYSBtdWx0aWNhc3QgZ3JvdXAuCisgKiAgICAgICAgVGhlIGdyb3VwIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBncm91cCBsaXN0LiAKKyAqICAgICAgICBBbGwgTDIgcmVzb3VyY2VzIGFjY29jaWF0ZWQgd2l0aCB0aGUgZ3JvdXAgd2lsbCBiZSBmcmVlLiAgICAgICAgIAorICogIAorICogQHBhcmFtIHVuaXQgICAgICAgc3dpdGNoIGRldmljZSBpZCAKKyAqIEBwYXJhbSBwX2dycCAgICAgIGEgcG9pbnRlciB0byB0aGUgbXVsdGljYXN0IGdyb3VwIGRlZmluaXRpb24KKyAqIAorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KKworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2dyb3VwX2Rlc3Ryb3koaW50IHVuaXQsIGJjbWJhbF9ncm91cF9jZmcgKnBfZ3JwKQoreworICAgIGJhbF9zd19ncm91cF9saXN0ICpwX2dycF9saXN0OworICAgIGludCBydjsKKyAgICBiY21vc19lcnJubyByZXQ7CisgICAgCisgICAgaWYocF9ncnAgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgZGVzdHJveSB3aXRoIE5VTEwgcGFyYW1ldGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgLyogY2hlY2sgZ3JvdXAgbGlzdCAqLworICAgIHBfZ3JwX2xpc3QgPSBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfbGlzdF9nZXRfYnlfaWQocF9ncnAtPmtleS5ncm91cF9pZCk7CisgICAgaWYoIXBfZ3JwX2xpc3QpCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgZGVzdHJveSB3aXRoIGdyb3VwIGlkICVkIGRvZXMgbm90IGV4aXN0ZWRcbiIsIHBfZ3JwLT5rZXkuZ3JvdXBfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgLyogY2FuJ3QgZGVzdHJveSBpZiBhbnkgZmxvdyBpcyBzdGlsbCByZWZlcmVuY2UgaXQgKi8KKyAgICBpZihwX2dycF9saXN0LT51c2VfY291bnQpCisgICAgeworICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLCAiZ3JvdXAgZGVzdHJveSB3aXRoIGdyb3VwIGlkICVkIGlzIGJ1c3lcbiIsIHBfZ3JwLT5rZXkuZ3JvdXBfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlZBTElEX09QOworICAgIH0KKyAgICAKKyAgICAvKiBEbyBvdXIgYmVzdCB0byBjbGVhbiB1cCAqLworICAgIC8qIGZyZWUgcmVzb3VyY2VzIHVzZWQgYnkgYWxsIG1lbWJlcnMgKi8KKyAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfcmVtKHVuaXQsIHBfZ3JwKTsKKyAgICBpZiAocmV0ICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiTUM6ICBkZXN0cm95IGdyb3VwIDB4JXggZmFpbGVkIHRvIGZyZWUgbWVtYmVycyBcbiIsIHBfZ3JwX2xpc3QtPmwyX2dycF9pZCk7CisgICAgfQorICAgIAorICAgIC8qIGZyZWUgdGhlIEwyIG11bHRpY2FzdCBncm91cCAqLworICAgIHJ2ID0gYmNtX211bHRpY2FzdF9kZXN0cm95KHVuaXQsIHBfZ3JwX2xpc3QtPmwyX2dycF9pZCk7CisgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgeworICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiTUM6IGluIGJjbV9tdWx0aWNhc3RfZGVzdHJveSAweCV4IGZhaWxlZCAlZCBcbiIsIHBfZ3JwX2xpc3QtPmwyX2dycF9pZCwgcnYpOworICAgIH0KKyAgICAKKyAgICAvKiBjbGVhbiB1cCB0aGUgdnNpICovDQorICAgIGJhbF9zd191dGlsX2RwcF92c2lfc2VydmljZV9kZXN0cm95KHVuaXQsIHBfZ3JwX2xpc3QtPnBfdnNpKTsNCisgICAgLyogcmVtb3ZlIGZyb20gdGhlIGxpc3QgKi8KKyAgICBiYWxfc3dfdXRpbF9ncm91cF9saXN0X3JlbW92ZShwX2dycF9saXN0KTsKKyAgCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKyNlbmRpZiAvKiBMT09QQkFDSyAqLworLypAfSovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9ncm91cC5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfZ3JvdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDU1N2ZlCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfZ3JvdXAuaApAQCAtMCwwICsxLDgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorIC8qKgorICogQGZpbGUgYmFsX2RwcF9ncm91cC5oCisgKiBAYnJpZWYgQkFMIFN3aXRjaCB1dGlsIGhlbHBlciBmdW5jdGlvbnMgcHJvdG90eXBlCisgKiBAYWRkdG9ncm91cCBzd191dGlsCisgKi8KKyNpZm5kZWYgX0JBTF9EUFBfR1JPVVBfSF8KKyNkZWZpbmUgX0JBTF9EUFBfR1JPVVBfSF8KKworI2luY2x1ZGUgImJhbF9kcHBfdnN3aXRjaC5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfdXRpbC5oIgorCisvKkB7Ki8KKyNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLCisKK3R5cGVkZWYgc3RydWN0IGJhbF9zd19ncm91cF9wb3J0IGJhbF9zd19ncm91cF9wb3J0Oworc3RydWN0IGJhbF9zd19ncm91cF9wb3J0Cit7CisgICAgdWludDMyX3QgcG9ydDsgICAgICAgIC8qIGdyb3VwIG1lbWJlciBwaHlzaWNhbCBwb3J0IG51bWJlciAqLworICAgIHVpbnQzMl90IGdwb3J0OyAgICAgICAvKiBncm91cCBtZW1iZXIgZ3BvcnQgaWQsIGkuZSByZXNvdXJjZSByZWZlcmVuY2UgaW4gdGhlIHN3aXRjaCAqLworICAgIHVpbnQzMl90IHN2Y19wb3J0OyAgICAvKiBncm91cCBtZW1iZXIgR0VNIGlkLCBpbiB0aGUgUE9OIHdvcmxkICovCit9OworCisKK3R5cGVkZWYgc3RydWN0IGJhbF9zd19ncm91cF9saXN0IGJhbF9zd19ncm91cF9saXN0Oworc3RydWN0IGJhbF9zd19ncm91cF9saXN0Cit7CisgICAgdWludDMyX3QgZGV2aWNlOyAgICAgICAgICAgICAgICAvKiBzd2l0Y2ggZGV2aWNlIGlkIHdoZXJlIHRoZSBncm91cCBhcHBsaWVkICovCisgICAgdWludDMyX3QgYmFsX2dycF9pZDsgICAgICAgICAgICAvKiBpZCByZWZlcmVuY2UgaW4gQkFMICovCisgICAgdWludDMyX3QgbnVtX3BvcnQ7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdGhlIG1lbWJlciAqLworICAgIGJhbF9zd19ncm91cF9wb3J0IHBvcnRbTUFYX1BPTl9QT1JUXTsgIC8qIG1lbWJlciBpbmZvIHN0cnVjdHVyZSAqLworICAgIHVpbnQzMl90IGwyX2dycF9pZDsgICAgICAgICAgICAgLyogbXVsdGljYXN0IGlkIGluIEwyIHRhYmxlICovCisgICAgdWludDMyX3QgdXNlX2NvdW50OyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZmxvd3MgdGhhdCByZWZlcmVuY2UgdGhpcyBncm91cCAqLworICAgIGJhbF9zd192c2lfc2VydmljZSAqcF92c2k7ICAgICAgLyogdnN3aXRjaCBzZXJ2aWNlIHVzZWQgYnkgdGhpcyBHUk9VUCAqLworICAgIFRBSUxRX0VOVFJZKGJhbF9zd19ncm91cF9saXN0KSBuZXh0X2dycDsKK307CisKKworZXh0ZXJuIGJjbW9zX2Vycm5vIGJhbF9zd191dGlsX2RwcF9ncm91cF9saXN0X2luaXQodm9pZCk7CitleHRlcm4gYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2dyb3VwX2xpc3RfZmluaXNoKHZvaWQpOworZXh0ZXJuIGJhbF9zd19ncm91cF9saXN0ICpiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfbGlzdF9nZXRfYnlfaWQodWludDMyX3QgZ3JwX2lkKTsKK2V4dGVybiBiYWxfc3dfZ3JvdXBfbGlzdCAqYmFsX3N3X3V0aWxfZHBwX2dyb3VwX2NyZWF0ZShpbnQgdW5pdCwgYmNtYmFsX2dyb3VwX2NmZyAqcF9ncnApOworZXh0ZXJuIGJjbW9zX2Vycm5vIGJhbF9zd191dGlsX2RwcF9ncm91cF9kZXN0cm95KGludCB1bml0LCBiY21iYWxfZ3JvdXBfY2ZnICpwX2dycCk7CitleHRlcm4gYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2dyb3VwX3NldChpbnQgdW5pdCwgYmNtYmFsX2dyb3VwX2NmZyAqcF9ncnApOworZXh0ZXJuIGJjbW9zX2Vycm5vIGJhbF9zd191dGlsX2RwcF9ncm91cF9yZW0oaW50IHVuaXQsIGJjbWJhbF9ncm91cF9jZmcgKnBfZ3JwKTsKK2V4dGVybiBiY21vc19lcnJubyBiYWxfc3dfdXRpbF9kcHBfZ3JvdXBfYWRkKGludCB1bml0LCBiY21iYWxfZ3JvdXBfY2ZnICpwX2dycCk7CisKKyNlbmRpZiAvKiBURVNUX1NXX1VUSUxfTE9PUEJBQ0sgKi8KKy8qQH0qLworI2VuZGlmCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9pbnRlcmZhY2UuYyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX2ludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNDMzYTMKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKgorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKgorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSworCisjaW5jbHVkZSA8YmFsX2NvbW1vbi5oPgorI2luY2x1ZGUgPGJhbF9jb3JlLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiYWxfbXNnLmg+CisjaW5jbHVkZSAiYmFsX3N3aXRjaF9hY2NfdGVybS5oIgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfdXRpbC5oIgorI2luY2x1ZGUgImJhbF9kcHBfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlIDxiY20vdHlwZXMuaD4KKyNpbmNsdWRlIDxiY20vcG9ydC5oPgorCisvKioKKyAqIEBmaWxlIGJhbF9kcHBfaW50ZXJmYWNlLmMKKyAqIEBicmllZiBCQUwgU3dpdGNoIHV0aWwgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIGludGVyZmFjZSByZXF1ZXN0cyBvbiBEVU5FIFBBQ0tFVCBQUk9DRVNTT1IKKyAqIEBhZGR0b2dyb3VwIHN3X3V0aWwKKyAqCisgKi8KKworLypAeyovCisKKworLyoqCisgKiBAYnJpZWYgU2V0IHVwIHBvbiBpbnRlcmZhY2Ugd2l0aCBEUFAKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHN3X3V0aWxfaW50ZXJmYWNlX3NldCBpbiB0aGUgQkFMIGNvcmUKKyAqIHRvIGV4ZWN1dGUgRFBQIHNwZWNpZmljIEFQSSBmb3IgcG9uIGludGVyZmFjZSByZXF1ZXN0CisgKgorICogQHBhcmFtIHBfaW50ZXJmYWNlX2luc3QgICBQb2ludGVyIHRvIGludGVyZmFjZSBpbnN0YW5jZQorICogQHBhcmFtIG9wdF90eXBlICAgICAgICAgICBVUC9ET1dOL1JFU1RBUlQgdGhlIGludGVyZmFjZQorICogQHJldHVybiBiY21vc19lcnJubworICovCitiY21vc19lcnJubyBiYWxfc3dfdXRpbF9kcHBfaW50ZXJmYWNlX3NldChhY2NfdGVybV9pbnRlcmZhY2UgKnBfaW50ZXJmYWNlX2luc3QsIGJhbF91dGlsX29wZXJfaWYgb3B0X3R5cGUgKQoreworICAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgICBpbnQgICAgICByYyA9IDA7CisgICAgIGJjbWJhbF9pbnRlcmZhY2Vfa2V5IGludGZfa2V5ID0gcF9pbnRlcmZhY2VfaW5zdC0+YXBpX3JlcV9pbnRfb2JqX2luZm8ua2V5OworICAgICBpbnQgdW5pdCwgcG9ydDsKKworICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiIERQUCAtIEdvdCBhIGludGVyZmFjZSBTRVQ6IGludGZfdHlwZTogJXMsIGludGZfaWQ6ICVkLCBvcHRfdHlwZTogJXNcbiIsCisgICAgICAgICAgICAgKGludGZfa2V5LmludGZfdHlwZSA9PSBCQ01CQUxfSU5URl9UWVBFX1BPTiA/ICJQT04iOiJOTkkiKSwKKyAgICAgICAgICAgICBpbnRmX2tleS5pbnRmX2lkLAorICAgICAgICAgICAgIChvcHRfdHlwZSA9PSBCQUxfVVRJTF9PUEVSX0lGX0RPV04gPyAiRE9XTiI6IlVQIikpOworCisgICAgIC8qIGJhc2VkIG9uIGludGVyZmFjZSB0eXBlIGdldCB0aGUgZGV2aWNlIG51bWJlciBhbmQgcGh5c2ljYWwgcG9ydCBudW1iZXIgZnJvbSBhc3NvY2lhdGVkIHRhYmxlICovCisgICAgIHN3aXRjaChpbnRmX2tleS5pbnRmX3R5cGUpCisgICAgIHsKKyAgICAgICAgIGNhc2UgQkNNQkFMX0lOVEZfVFlQRV9QT046CisgICAgICAgICAgICAgdW5pdCA9IGJhbF9iY21fcG9uX2luZl9kZXZfZ2V0KGludGZfa2V5LmludGZfaWQpOworICAgICAgICAgICAgIHBvcnQgPSBiYWxfYmNtX3Bvbl9pbmZfcGJtX2dldChpbnRmX2tleS5pbnRmX2lkKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBCQ01CQUxfSU5URl9UWVBFX05OSToKKyAgICAgICAgICAgICB1bml0ID0gYmFsX2JjbV9uZXRfaW5mX2Rldl9nZXQoaW50Zl9rZXkuaW50Zl9pZCk7CisgICAgICAgICAgICAgcG9ydCA9IGJhbF9iY21fbmV0X2luZl9wYm1fZ2V0KGludGZfa2V5LmludGZfaWQpOworICAgICAgICAgYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIFVucmVjb2duaXplZCBpbnRlcmZhY2UgdHlwZSAlZFxuIiwgaW50Zl9rZXkuaW50Zl90eXBlKTsKKyAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgIGJyZWFrOworICAgICB9CisKKyAgICAgc3dpdGNoIChvcHRfdHlwZSkKKyAgICAgeworICAgICAgICAgY2FzZSBCQUxfVVRJTF9PUEVSX0lGX0RPV046CisgICAgICAgICAgICAgcmMgPSBiY21fcG9ydF9lbmFibGVfc2V0KHVuaXQsIHBvcnQsIDApOworICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIEJBTF9VVElMX09QRVJfSUZfVVA6CisgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgIC8qIGRpc2FibGUgKi8KKyAgICAgICAgICAgICByYyA9IGJjbV9wb3J0X2VuYWJsZV9zZXQodW5pdCwgcG9ydCwgMCk7CisgICAgICAgICAgICAgLyogc2xlZXAgMzAwIG1zICovCisgICAgICAgICAgICAgdXNsZWVwKDMwMDAwMCk7CisgICAgICAgICAgICAgLyogZW5hYmxlICovCisgICAgICAgICAgICAgcmMgPSBiY21fcG9ydF9lbmFibGVfc2V0KHVuaXQsIHBvcnQsIDEpOworICAgICAgICAgICAgIC8qIEVuYWJsZSBhdXRvLW5lZ290aWF0aW9uIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgIGlmIChpbnRmX2tleS5pbnRmX3R5cGUgPT0gQkNNQkFMX0lOVEZfVFlQRV9OTkkgJiYKKyAgICAgICAgICAgICAgICAgYmNtYmFsX2lzX25uaV9hdXRvbmVnX29uKGludGZfa2V5LmludGZfaWQpKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgLyogc2xlZXAgNDAwIG1zICovCisgICAgICAgICAgICAgICAgIHVzbGVlcCg0MDAwMDApOworICAgICAgICAgICAgICAgICByYyA9IHJjID8gcmMgOiBiY21fcG9ydF9hdXRvbmVnX3NldCh1bml0LCBwb3J0LCAxKTsKKyAgICAgICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIkVuYWJsZWQgYXV0b25lZyBvbiBOTkkgdW5pdDpwb3J0ICVkOiVkLiByYz0lZFxuIiwgdW5pdCwgcG9ydCwgcmMpOworICAgICAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICB9CisgICAgIGlmIChyYykKKyAgICAgeworICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgYmNtX3BvcnRfZW5hYmxlX3NldCBmb3IgcG9uIGZhaWxlZCAlZFxuIiwgcmMpOworICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgfQorICAgICByZXR1cm4gcmV0OworfQorCisvKkB9Ki8KKyNlbmRpZiAvKiAjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSyAqLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfaW50ZXJmYWNlLmggYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFlNWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX2RwcF9pbnRlcmZhY2UuaAorICoKKyAqIEBicmllZiBGdW5jdGlvbiBQcm90b3R5cGUgZm9yIHN3aXRjaCBhcHAgaW50ZXJmYWNlIGZ1bmN0aW9ucyBmb3IgRFBQIAorICoKKyAqIEBpbmdyb3VwIHN3aXRjaF9hcHAKKyAqLworCisjaWZuZGVmICBfQkFMX0RQUF9JTlRFUkZBQ0VfSF8KKyNkZWZpbmUgIF9CQUxfRFBQX0lOVEVSRkFDRV9IXworCisjaW5jbHVkZSAiYmFsX3N3aXRjaF91dGlsLmgiCisKKy8qQHsqLworCitleHRlcm4gYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX2ludGVyZmFjZV9zZXQoYWNjX3Rlcm1faW50ZXJmYWNlICpwX2ludGVyZmFjZV9pbnN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxfdXRpbF9vcGVyX2lmIG9wdF90eXBlKTsKKyAKKy8qQH0qLworIAorI2VuZGlmCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9xb3MuYyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX3Fvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NjdmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9xb3MuYwpAQCAtMCwwICsxLDIzOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKgorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICoKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKgorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICoKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBAZmlsZSBiYWxfZHBwX3Fvcy5jCisgKiBAYnJpZWYgQkFMIFN3aXRjaCBVdGlsIFFvUyBjb25maWd1cmF0aW9uIEFQSQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgZm9yCisgKiBjb25maWd1cmluZyBhbmQgbWFuYWdpbmcgUXVhbGl0eSBvZiBTZXJ2aWNlIChRb1MpIGZvciBzZXJ2aWNlcyBvbgorICogRFVORSBQYWNrIFByb2Nlc3NvciAoRFBQKS4KKyAqCisgKiBUaGUgc2NoZWR1bGVyIHNldHVwIGlzIHByZXNlbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24gdG8gc2V0dGluZyB1cAorICogdGhlIHNjaGVkdWxpbmcgZWxlbWVudHMgKFNFcyksIHRoZSBCQUxfRFBQX1FPUyBjb25maWd1cmVzIGFuIGVncmVzcworICogcG9ydCBzaGFwZXIgb24gZWFjaCBQT04tc2lkZSBwb3J0LCBhcyB3ZWxsIGFzIGEgcGVyLUFjY2VzcyBMaW5rIChHRU1JRC9MTElEKQorICogc2hhcGVyIHRvIGltcGxlbWVudCB0aGUgZG93bnN0cmVhbSBTTEEgZm9yIHRoZSBzdWJzY3JpYmVyIHNlcnZpY2UuCisgKgorICogQ3VycmVudGx5IHRoZSBCQUxfRFBQX1FPUyBjb25maWd1cmVzIGRvd25zdHJlYW0gUW9TIG9ubHkgKG92ZXIgdGhlCisgKiBQT04pLiBNYXBsZSBQT04gTGluayBTTEFzIGFyZSB1c2VkIHRvIGltcGxlbWVudCB1cHN0cmVhbSBTTEFzIGZvcgorICogdGhlIHN1YnNjcmliZXIgc2VydmljZSBpbiB0aGUgQkFMK01hcGxlK0RQUAorICogYXJjaGl0ZWN0dXJlLiBBZGRpdGlvbmFsIHVwc3RyZWFtIFFvUyBmb3IgVE0gd2l0aGluIERQUCAob3ZlciB0aGUKKyAqIE5OSXMpIGFyZSBjb25zaWRlcmVkIGFuIE9FTSBTeXN0ZW0gdmVuZG9yIHJlc3BvbnNpYmlsaXR5LiBObworICogaW1wbGVtZW50YXRpb24gZm9yIHVwc3RyZWFtIFFvUyBpcyBwcm92aWRlZCBieSB0aGUgQkFMX0RQUF9RT1MuCisgKgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICovCisKKy8qQHsqLworI2lmbmRlZiBURVNUX1NXX1VUSUxfTE9PUEJBQ0sKKworI2RlZmluZSBCQ01fUEVUUkFfU1VQUE9SVCAxICAgIC8qIFRCRCAtIHRoaXMgc2hvdWxkIGJlIGRlZmluZSBpbiB0aGUgTWFrZWZpbGUgb2YgdGhlIH4vZHBwIGRpcmVjdG9yeSAqLworI2RlZmluZSBMSU5LX0FSQURfTElCUkFSSUVTIDEgIC8qIFNESyBNYWtlLmNvbmZpZyAtIEJDTV84ODY1MF9BMCAqLworI2RlZmluZSBMSU5LX1BQRF9MSUJSQVJJRVMgMSAgIC8qIFNESyBNYWtlLmNvbmZpZyAtIEJDTV84ODY1MF9BMCAqLworI2RlZmluZSBJTkNMVURFX0wzIDEgICAgICAgICAgIC8qIGJjbS9sMy5oIHN1cHBvcnQgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPiAgICAgICAgICAgIC8qIGZvciBjb21waWxlciBkZWZpbmVkIGludDY0X3QgYW5kIHVpbnQ2NF90ICovCisKKyNpbmNsdWRlICJwaHltb2RfY3VzdG9tX2NvbmZpZy5oIiAgLyogcmVzb2x2ZSBQSFlNT0RfeHh4IGluIHBoeW1vZF9zeXN0ZW0uaCAqLworI2luY2x1ZGUgImJjbS9kZWJ1Zy5oIgorI2luY2x1ZGUgImJjbS9lcnJvci5oIgorI2luY2x1ZGUgImJjbS9sMi5oIgorI2luY2x1ZGUgImJjbS9tcGxzLmgiCisjaW5jbHVkZSAiYmNtL3Fvcy5oIgorI2luY2x1ZGUgImJjbS92bGFuLmgiCisjaW5jbHVkZSAiYmNtL3Zzd2l0Y2guaCIKKyNpbmNsdWRlIDxzb2MvbWNtL2FsbGVudW0uaD4KKyNpbmNsdWRlICJiY20vZmllbGQuaCIKKyNpbmNsdWRlIDxiY20vY29zcS5oPgorI2luY2x1ZGUgPGJjbS9zdGFjay5oPgorI2luY2x1ZGUgPGJjbV9pbnQvZHBwL2FsbG9jX21uZ3IuaD4KKyNpbmNsdWRlIDxiY21faW50L2RwcC9xb3MuaD4KKyNpbmNsdWRlIDxiY21faW50L2RwcC9lcnJvci5oPgorI2luY2x1ZGUgPGJjbV9pbnQvZHBwL3V0aWxzLmg+CisjaW5jbHVkZSA8YmNtX2ludC9kcHAvcW9zLmg+CisjaW5jbHVkZSA8c29jL2RwcC9QUEQvcHBkX2FwaV9lZ192bGFuX2VkaXQuaD4KKworI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtb3NfZXJybm8uaCIKKyNpbmNsdWRlICJiYWxfc3dpdGNoX2FjY190ZXJtLmgiCisjaW5jbHVkZSAiYmFsX3N3aXRjaF9mbG93LmgiCisjaW5jbHVkZSAiYmFsX3N3aXRjaF91dGlsLmgiCisjaW5jbHVkZSAiYmFsX2RwcF9xb3MuaCIKKworLyoqIEBicmllZiBBIGdsb2JhbCBRb1MgY29uZmlndXJhdGlvbiBjb250ZXh0ICovCitiYWxfc3dfcW9zX2NmZyBnX2JhbF9iY21fcW9zX2NmZyA9IHswfTsKKworLyoqIEBicmllZiBQb2ludGVyIHRvIGdsb2JhbCBRb1MgY29uZmlndXJhdGlvbiBjb250ZXh0ICovCitiYWxfc3dfcW9zX2NmZyAqZ3BfYmFsX2JjbV9xb3NfY2ZnID0gJmdfYmFsX2JjbV9xb3NfY2ZnOworCisvKioKKyAqICBAYnJpZWYgTnVtYmVyIG9mIHRyYWZmaWMgY2xhc3NlcworICovCisjZGVmaW5lIEJBTF9CQ01fUU9TX1RDX05VTSA4CisKKy8qKgorICogIEBicmllZiBQQ1AvQ29TIG1hcHBpbmcgdG8gaW50ZXJuYWwgVHJhZmZpYyBDbGFzcyAoVEMpCisgKgorICogIFRoZSBtYXBwaW5nIGlzIGFzIGZvbGxvd3MsIHdoZXJlIFRDIDAgbWFwcyB0byB0aGUgbG93ZXN0IHByaW9yaXR5CisgKiAgYW5kIFRDIDMgbWFwcyB0byB0aGUgaGlnaGVzdCBwcmlvcml0eS4KKyAqCisgKiAgUENQL0RFSSAgICBUQworICogIC0tLS0tLS0gICAgLS0KKyAqICAgIDAvMCAgICAgICAwCisgKiAgICAwLzEgICAgICAgMAorICogICAgMS8wICAgICAgIDAKKyAqICAgIDEvMSAgICAgICAwCisgKiAgICAyLzAgICAgICAgMQorICogICAgMi8xICAgICAgIDEKKyAqICAgIDMvMCAgICAgICAxCisgKiAgICAzLzEgICAgICAgMQorICogICAgNC8wICAgICAgIDIKKyAqICAgIDQvMSAgICAgICAyCisgKiAgICA1LzAgICAgICAgMgorICogICAgNS8xICAgICAgIDIKKyAqICAgIDYvMCAgICAgICAzCisgKiAgICA2LzEgICAgICAgMworICogICAgNy8wICAgICAgIDMKKyAqICAgIDcvMSAgICAgICAzCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENQIHZhbHVlczogIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcKKyAqLworY29uc3QgaW50IGdfYmFsX2JjbV9xb3NfdGNfbWFwW0JBTF9CQ01fUU9TX1RDX05VTV0gPSB7MCwgMCwgMSwgMSwgMiwgMiwgMywgM307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorIC8vICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFFPUyBGbG93L1ZPUSBJRCByZXNvdXJjZSBwb29sCisgKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgUU9TIEZsb3cvVk9RIElEIHJlc291cmNlIHBvb2wsIHdoaWNoCisgKiBjb25zaXN0cyBvZiBhbiBhdHRyaWJ1dGUgcmVwcmVzZW50aW5nIHRoZSBuZXh0IElEIHZhbHVlIHRvIGFsbG9jYXRlCisgKiBhbmQgYSB0YWJsZSBjb250YWluaW5nIGZyZWUgdm9xIElEIHZhbHVlcy4KKyAqCisgKiBUaGUgQkFMX0RQUF9RT1MgYXNzdW1lcyBmb3VyIHF1ZXVlcyBhcmUgYXNzaWduZWQgdG8gZWFjaCBhY2Nlc3MgcG9ydCAoR0VNSUQvTExJRCkgaW4KKyAqIHRoZSBkb3duc3RyZWFtIGRpcmVjdGlvbi4gRm91ciBxdWV1ZXMgcGVyIGFjY2VzcyBwb3J0IGlzIHRoZSBzbWFsbGVzdAorICogdmFsdWUgb2YgcXVldWVzIHBlciBhY2Nlc3MgcG9ydCBzdXBwb3J0ZWQgYnkgdGhlIERQUCBkZXZpY2UuCisgKgorICogTm90ZSwgaW4gdGhlIEJBTF9EUFBfUU9TLCB0aGUgcW9zIEZsb3cgYW5kIFZPUSBJRCBhcmUgc2V0IHRvIHRoZQorICogc2FtZSB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gcF9wb29sICAgICAgICAgUG9pbnRlciB0byBhIHZvcSBJRCBwb29sCisgKiBAcGFyYW0gaW5pdF92YWx1ZSAgICAgVGhlIGluaXRpYWwgdmFsdWUgdG8gdXNlIGR1cmluZyB2b3EgSUQgYWxsb2NhdGlvbgorICogQHBhcmFtIG1heF92YWx1ZSAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGFzc2lnbmVkIGJ5IHRoaXMgcG9vbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJhbF9zd19kcHBfaW5pdF9mbG93X2lkX3Bvb2woYmFsX3N3X2RwcF9xb3NfZmxvd2lkX3Bvb2wgKnBfcG9vbCwgdWludDMyX3QgaW5pdF92YWx1ZSwgdWludDMyX3QgbWF4X3ZhbHVlKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04ocF9wb29sID09IE5VTEwpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgICBtZW1zZXQocF9wb29sLCAwLCBzaXplb2YoYmFsX3N3X2RwcF9xb3NfZmxvd2lkX3Bvb2wpKTsKKworICAgIC8qIFN0b3JlIHRoZSBmaXJzdCB2YWx1ZSB0byBiZSB1c2VkIGFzIHRoZSB2b3EgSUQgKi8KKyAgICBwX3Bvb2wtPm5leHRfZmxvd19pZF92YWx1ZSA9IGluaXRfdmFsdWU7CisKKyAgICAvKiBTdG9yZSB0aGUgbWF4aW11bSB2YWx1ZSBhc3NpZ25lZCBieSB0aGUgcG9vbCAqLworICAgIHBfcG9vbC0+bWF4X3ZhbHVlID0gbWF4X3ZhbHVlOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZnJlZSBwb29sIHRhYmxlICovCisgICAgVEFJTFFfSU5JVCgmcF9wb29sLT5mcmVlX3RhYmxlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQ2xlYW4gdXAgdGhlIHFvcyBGbG93L1ZPUSBJRCByZXNvdXJjZSBwb29sCisgKgorICogVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgdGhlIHFvcyBGbG93L1ZPUSBJRCByZXNvdXJjZSBwb29sLiBJdCBmcmVlcyBhbGwKKyAqIG9mIHRoZSBtZW1vcnkgdXNlZCBmb3IgYmFsX3N3X2RwcF9xb3NfZmxvd2lkX3Bvb2xfZW50cnlfdCdzCisgKgorICogQHBhcmFtIHBfcG9vbCAgICAgICAgIFBvaW50ZXIgdG8gYSB2b3EgSUQgcG9vbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGJhbF9zd19kcHBfY2xlYW51cF9mbG93X2lkX3Bvb2woYmFsX3N3X2RwcF9xb3NfZmxvd2lkX3Bvb2wgKnBfcG9vbCkKK3sKKyAgICBiYWxfc3dfZHBwX3Fvc19mbG93aWRfcG9vbF9lbnRyeSAqcF9wb29sX2VudHJ5ID0gTlVMTDsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04ocF9wb29sID09IE5VTEwpOworCisgICAgd2hpbGUgKChwX3Bvb2xfZW50cnkgPSBUQUlMUV9GSVJTVCgmcF9wb29sLT5mcmVlX3RhYmxlKSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIFJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgZnJlZSBwb29sIHRhYmxlLiAqLworICAgICAgICBUQUlMUV9SRU1PVkUoJnBfcG9vbC0+ZnJlZV90YWJsZSwgcF9wb29sX2VudHJ5LCBlbnRyeSk7CisKKyAgICAgICAgLyogRnJlZSB0aGUgZW50cnkgKi8KKyAgICAgICAgc2FsX2ZyZWUocF9wb29sX2VudHJ5KTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEFsbG9jYXRlIGEgcW9zIEZsb3cvVk9RIElEIGZyb20gdGhlIHBvb2wKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIEZsb3cvVk9RIElEIGZyb20gdGhlIHJlc291cmNlIHBvb2wuIElmCisgKiB0aGVyZSBpcyBhIGZyZWUgdm9xIElEIGVudHJ5IGluIHRoZSBmcmVlIHBvb2wsIHRoZSB2b3EgSUQgZnJvbQorICogdGhlIGVudHJ5IGlzIHVzZWQgKGkuZS4sIHJldHVybmVkIHRvIHRoZSBjYWxsZXIpIGFuZCB0aGUgZW50cnkgaXMKKyAqIGZyZWVkLiBPdGhlcndpc2UsIGEgbmV3IHZvcSBJRCB2YWx1ZSBpcyBhbGxvY2F0ZWQgYW5kCisgKiByZXR1cm5lZC4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZXJlIGFyZSBubyB2b3EgSURzCisgKiBhdmFpbGFibGUuCisgKgorICogQHBhcmFtIHBfcG9vbCAgICBQb2ludGVyIHRvIGEgdm9xIElEIHBvb2wKKyAqIEBwYXJhbSBwX2Zsb3dfaWQgIFBvaW50ZXIgdG8gdGhlIHZvcSBJRCAodmFsdWUgcmV0dXJuZWQgdG8gY2FsbGVyKQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3X2RwcF9xb3NfYWxsb2NfZmxvd19pZChiYWxfc3dfZHBwX3Fvc19mbG93aWRfcG9vbCAqcF9wb29sLCBpbnQgKnBfZmxvd19pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmFsX3N3X2RwcF9xb3NfZmxvd2lkX3Bvb2xfZW50cnkgKnBfcG9vbF9lbnRyeSA9IE5VTEw7CisgICAgdWludDMyX3QgZmxvd19pZCA9IDA7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKHBfcG9vbCA9PSBOVUxMKTsKKyAgICBCVUdfT04ocF9mbG93X2lkID09IE5VTEwpOworCisgICAgLyogR2V0IGFuIGVudHJ5IGZyb20gdGhlIGZyZWUgcG9vbCAqLworICAgIHBfcG9vbF9lbnRyeSA9IFRBSUxRX0ZJUlNUKCZwX3Bvb2wtPmZyZWVfdGFibGUpOworCisgICAgLyogSWYgYW4gZW50cnkgZXhpc3RzIGZyb20gdGhlIGZyZWUgcG9vbCwgdXNlIHRoZSB2b3EgSUQgZnJvbSB0aGUKKyAgICAgKiBlbnRyeS4KKyAgICAgKi8KKyAgICBpZiAocF9wb29sX2VudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGZyZWUgcG9vbC4gKi8KKyAgICAgICAgVEFJTFFfUkVNT1ZFKCZwX3Bvb2wtPmZyZWVfdGFibGUsIHBfcG9vbF9lbnRyeSwgZW50cnkpOworCisgICAgICAgIC8qIFVzZSB0aGUgdm9xIElEIGZyb20gdGhlIGVudHJ5ICovCisgICAgICAgIGZsb3dfaWQgPSBwX3Bvb2xfZW50cnktPmZsb3dfaWQ7CisKKyAgICAgICAgLyogRnJlZSB0aGUgZW50cnkgKi8KKyAgICAgICAgc2FsX2ZyZWUocF9wb29sX2VudHJ5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogT3RoZXJ3aXNlLCB1c2UgdGhlIG5leHQgdm9xIElEIHZhbHVlIChpZiBhdmFpbGFibGUpICovCisgICAgICAgIGlmIChwX3Bvb2wtPm5leHRfZmxvd19pZF92YWx1ZSA8PSBwX3Bvb2wtPm1heF92YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVXNlIHRoZSBuZXh0IGF2YWlsYWJsZSB2b3EgSUQgdmFsdWUgKi8KKyAgICAgICAgICAgIGZsb3dfaWQgPSBwX3Bvb2wtPm5leHRfZmxvd19pZF92YWx1ZTsKKworICAgICAgICAgICAgLyogSW5jcmVtZW50IHRoZSBuZXh0X2Zsb3dfaWRfdmFsdWUgcGFyYW1ldGVyICovCisgICAgICAgICAgICBwX3Bvb2wtPm5leHRfZmxvd19pZF92YWx1ZSArPSBCQUxfQkNNX1FPU19RVUVVRVNfUEVSX0xMSUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayB0byBzZWUgaWYgYSB2b3EgSUQgdmFsdWUgd2FzIGF2YWlsYWJsZS4gKi8KKyAgICBpZiAoZmxvd19pZCA9PSAwKQorICAgIHsKKyAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIlcygpOiBObyB2b3EgSURzIGF2YWlsYWJsZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgKnBfZmxvd19pZCA9IDA7CisgICAgICAgIHJjID0gQkNNX0VSUl9OT1JFUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBfZmxvd19pZCA9IGZsb3dfaWQ7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBGcmVlIGEgcW9zIEZsb3cvVk9RIElEIGFuZCByZXR1cm4gaXQgdG8gdGhlIHJlc291cmNlIHBvb2wKKyAqCisgKiBUaGlzIGZ1bmN0aW9uICJmcmVlcyIgYSBGbG93L1ZPUSBJRCBhbmQgcmV0dXJucyBpdCB0byB0aGUgZnJlZQorICogcG9vbC4gVGhlIGZyZWUgcG9vbCBjb25zaXN0cyBvZiBhIGxpbmtlZCBsaXN0IG9mIHZvcSBJRCB2YWx1ZXMKKyAqIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgcmV1c2UuIFdoZW4gYSB2b3EgSUQgaXMgZnJlZWQsIG1lbW9yeSBpcworICogYWxsb2NhdGVkIHRvIHN0b3JlIHRoZSBmcmVlIHZvcSBJRCB2YWx1ZSwgd2hpY2ggaXMgYXBwZW5kZWQgdG8gdGhlCisgKiBsaW5rIGxpc3QgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGZyZWUgcG9vbC4KKyAqCisgKiBAcGFyYW0gcF9wb29sICAgIFBvaW50ZXIgdG8gYSB2b3EgSUQgcG9vbAorICogQHBhcmFtIHBfZmxvd19pZCAgUG9pbnRlciB0byB0aGUgdm9xIElEIHRvIGZyZWUKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9zd19kcHBfcW9zX2ZyZWVfZmxvd19pZChiYWxfc3dfZHBwX3Fvc19mbG93aWRfcG9vbCAqcF9wb29sLCBpbnQgKnBfZmxvd19pZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmFsX3N3X2RwcF9xb3NfZmxvd2lkX3Bvb2xfZW50cnkgKnBfcG9vbF9lbnRyeSA9IE5VTEw7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKHBfcG9vbCA9PSBOVUxMKTsKKyAgICBCVUdfT04ocF9mbG93X2lkID09IE5VTEwpOworCisgICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIHNvbWV0aGluZyB0byBmcmVlICovCisgICAgaWYgKCpwX2Zsb3dfaWQgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZnJlZSAtIGp1c3QgcmV0dXJuICovCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYSBmcmVlIHBvb2wgZW50cnkgKi8KKyAgICBwX3Bvb2xfZW50cnkgPSBzYWxfYWxsb2Moc2l6ZW9mKGJhbF9zd19kcHBfcW9zX2Zsb3dpZF9wb29sX2VudHJ5KSwgInZvcSBJRCBGcmVlIFBvb2wgRW50cnkiKTsKKyAgICBpZiAocF9wb29sX2VudHJ5ID09IE5VTEwpCisgICAgeworICAgICAgICAvKiBFcnJvciAqLworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIiVzKCk6IE5vIG1lbW9yeSBmb3IgYmFsX3N3X2RwcF9xb3NfZmxvd2lkX3Bvb2xfZW50cnlfdCBmb3Igdm9xIElEICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICpwX2Zsb3dfaWQpOworCisgICAgICAgIHJjID0gQkNNX0VSUl9OT1JFUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgZW50cnkgKi8KKyAgICAgICAgbWVtc2V0KHBfcG9vbF9lbnRyeSwgMCwgc2l6ZW9mKGJhbF9zd19kcHBfcW9zX2Zsb3dpZF9wb29sX2VudHJ5KSk7CisKKyAgICAgICAgLyogU3RvcmUgdGhlIHZvcSBJRCAqLworICAgICAgICBwX3Bvb2xfZW50cnktPmZsb3dfaWQgPSAqcF9mbG93X2lkOworCisgICAgICAgIC8qIEFkZCB0aGUgc2VydmljZSBlbnRyeSB0byB0aGUgdGFibGUgKi8KKyAgICAgICAgVEFJTFFfSU5TRVJUX1RBSUwoJnBfcG9vbC0+ZnJlZV90YWJsZSwgcF9wb29sX2VudHJ5LCBlbnRyeSk7CisKKyAgICAgICAgLyogQ2xlYXIgdGhlIHZvcSBJRCBlbnRyeSAqLworICAgICAgICAqcF9mbG93X2lkID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIENyZWF0ZSB0aGUgUENQIGFuZCBERUkgdG8gVHJhZmZpYyBDbGFzcyAoVEMpIG1hcHBpbmcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIG1hcHBpbmcgZnJvbSBQQ1AvQ29TIGFuZCBERUkgYml0cyBpbiB0aGUKKyAqIGZyYW1lcyByZWNlaXZlZCBieSBEUFAgdG8gdGhlIGludGVybmFsIHRyYWZmaWMgY2xhc3MgKFRDKSBpbgorICogRFBQLiBUaGUgVEMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIFZPUSBmb3IgdGhlCisgKiBmcmFtZS4KKyAqCisgKiBQbGVhc2Ugc2VlIGNvbW1lbnRzIGZvciBAcmVmIGdfYmFsX2JjbV9xb3NfdGNfbWFwIGZvciBhIGRlc2NyaXB0aW9uIG9mCisgKiBtYXBwaW5nLgorICoKKyAqIEBwYXJhbSB1bml0ICAgIFNESyB1bml0IG51bWJlcgorICogQHBhcmFtIHBfdGNfbWFwICBQb2ludGVyIHRvIFBDUC9ERUkgdG8gVEMgbWFwIGFycmF5CisgKgorICogQHJldHVybiBiY21vc19lcnJubworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiYWxfc3dfZHBwX3Fvc190Y19tYXBfY3JlYXRlKGludCB1bml0LCBjb25zdCBpbnQgKnBfdGNfbWFwKQoreworICAgIGJjbV9lcnJvcl90IHNka19yYyA9IEJDTV9FX05PTkU7CisgICAgYmNtX3Fvc19tYXBfdCBsMl9pbl9tYXA7CisgICAgaW50IHBjcCA9IDA7CisgICAgaW50IGRlaSA9IDA7CisgICAgaW50MzJfdCBxb3NfbWFwX2lkOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihwX3RjX21hcCA9PSBOVUxMKTsKKworICAgIC8qIENyZWF0ZSB0aGUgVEMgbWFwIG9iamVjdCAqLworICAgIHNka19yYyA9IGJjbV9xb3NfbWFwX2NyZWF0ZSh1bml0LCBCQ01fUU9TX01BUF9JTkdSRVNTLCAmcW9zX21hcF9pZCk7CisgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fcW9zX21hcF9jcmVhdGUgZmFpbGVkIHdpdGggJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpKTsKKworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgYSBtYXBwaW5nIGZvciBlYWNoIFBDUC9Db1MgYW5kIERFSSBiaXQgdmFsdWUuICovCisgICAgZm9yIChwY3AgPSAwOyBwY3AgPCBCQUxfQkNNX1FPU19UQ19OVU07IHBjcCsrKQorICAgIHsKKyAgICAgICAgZm9yIChkZWkgPSAwOyBkZWkgPCAyOyBkZWkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtX3Fvc19tYXBfdF9pbml0KCZsMl9pbl9tYXApOworCisgICAgICAgICAgICAvKiBJbmdyZXNzIFBDUC9Db1MgdmFsdWUgKi8KKyAgICAgICAgICAgIGwyX2luX21hcC5wa3RfcHJpID0gcGNwOworCisgICAgICAgICAgICAvKiBERUkgQml0ICovCisgICAgICAgICAgICBsMl9pbl9tYXAucGt0X2NmaSA9IGRlaTsKKworICAgICAgICAgICAgLyogU2V0IGludGVybmFsIHByaW9yaXR5IGZvciB0aGlzIGluZ3Jlc3MgcHJpICovCisgICAgICAgICAgICBsMl9pbl9tYXAuaW50X3ByaSA9IHBfdGNfbWFwW3BjcF07CisKKyAgICAgICAgICAgIC8qIFNldCBjb2xvciBmb3IgdGhpcyBpbmdyZXNzIFByaW9yaXR5ICAqLworICAgICAgICAgICAgbDJfaW5fbWFwLmNvbG9yID0gYmNtQ29sb3JHcmVlbjsKKworICAgICAgICAgICAgc2RrX3JjID0gYmNtX3Fvc19tYXBfYWRkKHVuaXQsIEJDTV9RT1NfTUFQX0wyLCAmbDJfaW5fbWFwLCBxb3NfbWFwX2lkKTsKKyAgICAgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fcW9zX21hcF9hZGQgZmFpbGVkIHdpdGggJXMsIGZvciBwY3AgJWQsIGRlaSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcGNwLCBkZWkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBncF9iYWxfYmNtX3Fvc19jZmctPnFvc19wb3J0X21hcF9pZCA9IHFvc19tYXBfaWQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQ2xlYW4gdXAgdGhlIFBDUCBhbmQgREVJIHRvIFRyYWZmaWMgQ2xhc3MgKFRDKSBtYXAKKyAqCisgKiBAcGFyYW0gdW5pdCAgU0RLIHVuaXQgbnVtYmVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYmFsX3N3X2RwcF9xb3NfdGNfbWFwX2NsZWFudXAoaW50IHVuaXQpCit7CisgICAgYmNtX2Vycm9yX3Qgc2RrX3JjID0gQkNNX0VfTk9ORTsKKyAgICBiY21fcW9zX21hcF90IGwyX2luX21hcDsKKyAgICBpbnQgcGNwID0gMDsKKyAgICBpbnQgZGVpID0gMDsKKworICAgIC8qIERlbGV0ZSBhbGwgbWFwcGluZyBlbnRyaWVzICovCisgICAgZm9yIChwY3AgPSAwOyBwY3AgPCBCQUxfQkNNX1FPU19UQ19OVU07IHBjcCsrKQorICAgIHsKKyAgICAgICAgZm9yIChkZWkgPSAwOyBkZWkgPCAyOyBkZWkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtX3Fvc19tYXBfdF9pbml0KCZsMl9pbl9tYXApOworCisgICAgICAgICAgICAvKiBJbmdyZXNzIFBDUC9Db1MgdmFsdWUgKi8KKyAgICAgICAgICAgIGwyX2luX21hcC5wa3RfcHJpID0gcGNwOworCisgICAgICAgICAgICAvKiBERUkgQml0ICovCisgICAgICAgICAgICBsMl9pbl9tYXAucGt0X2NmaSA9IGRlaTsKKworICAgICAgICAgICAgc2RrX3JjID0gYmNtX3Fvc19tYXBfZGVsZXRlKHVuaXQsIEJDTV9RT1NfTUFQX0wyLCAmbDJfaW5fbWFwLCBncF9iYWxfYmNtX3Fvc19jZmctPnFvc19wb3J0X21hcF9pZCk7CisgICAgICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX3Fvc19tYXBfZGVsZXRlIGZhaWxlZCB3aXRoICVzLCBmb3IgcGNwICVkLCBkZWkgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYyksIHBjcCwgZGVpKTsKKworICAgICAgICAgICAgICAgIC8qIENvbnRpbnVlIHByb2Nlc3NpbmcgLSBkb24ndCBoYWx0IGJlY2F1c2Ugb2YgZXJyb3JzIGR1cmluZyBjbGVhcm4gdXAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIERlbGV0ZSB0aGUgVEMgbWFwIG9iamVjdCAqLworICAgIHNka19yYyA9IGJjbV9xb3NfbWFwX2Rlc3Ryb3kodW5pdCwgZ3BfYmFsX2JjbV9xb3NfY2ZnLT5xb3NfcG9ydF9tYXBfaWQpOworICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICB7CisgICAgICAgIC8qIEVycm9yICovCisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX3Fvc19tYXBfZGVzdHJveSBmYWlsZWQgd2l0aCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYykpOworCisgICAgICAgIC8qIENvbnRpbnVlIHByb2Nlc3NpbmcgLSBkb24ndCBoYWx0IGJlY2F1c2Ugb2YgZXJyb3JzIGR1cmluZyBjbGVhcm4gdXAgKi8KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEluaXRpYWxpemUgdGhlIEJBTCBEUFAgUW9TIE1vZHVsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFFvUyBtb2R1bGUgZm9yIHRoZSBCQUwgQkNNIFN3aXRjaCBVdGlsLgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZ2xvYmFsIFFvUyBjb250ZXh0LCBhbmQKKyAqIHNldHMgdXAgZG93bnN0cmVhbSBzY2hlZHVsaW5nIGhpZXJhcmNoeSBvbiBlYWNoIGNoYW5uZWxpemVkCisgKiBQT04tc2lkZSBwb3J0LiBTY2hlZHVsaW5nL1FvUyBpcyBhcHBsaWVkIHRvIHBhY2tldHMgdGhhdCBlZ3Jlc3MgdGhlCisgKiBwb3J0LgorICoKKyAqIEBwYXJhbSB1bml0ICBTREsgdW5pdCBudW1iZXIKKyAqIEBwYXJhbSBwb25fbW9kZSBwb24gaW50ZXJmYWNlIG1vZGUKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmFsX3N3X2RwcF9xb3NfaW5pdChpbnQgdW5pdCwgYmFsX3N3YXBwX3BvcnRfbWFwX2luZHggcG9uX21vZGUpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbV9lcnJvcl90IHNka19yYyA9IEJDTV9FX05PTkU7CisgICAgYmFsX3N3X2RwcF9xb3Nfc2NoZWRfcG9uX2NoYW4gcG9uX2NoYW47CisgICAgdWludDMyX3QgcG9ydF9yYXRlLCBwcmlfY2hhbm5lbF9yYXRlLCBzZWNfY2hhbm5lbF9yYXRlOworICAgIGludCBpaSwgcG9ydF9udW07CisKKyAgICAvKiBJbml0aWFsaXphdGlvbiAqLworICAgIG1lbXNldChncF9iYWxfYmNtX3Fvc19jZmcsIDAsIHNpemVvZigqZ3BfYmFsX2JjbV9xb3NfY2ZnKSk7CisKKyAgICBkbyAvKiBFeGNlcHRpb24gQmxvY2sgU3RhcnQgKi8KKyAgICB7CisgICAgICAgIHJjID0gYmFsX3N3X2RwcF9xb3NfdGNfbWFwX2NyZWF0ZSh1bml0LCBnX2JhbF9iY21fcW9zX3RjX21hcCk7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgZGVmYXVsdCBRb1MgVEMgbWFwXG4iKTsKKworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgdGhpcyBtb2R1bGUgSUQgZm9yIHRoaXMgQVJBRCBkZXZpY2UuIFRoaXMgaXMgdXNlZCBieQorICAgICAgICAgKiBzZXZlcmFsIG9mIHRoZSBiY20gQVBJIGNhbGxzIGR1cmluZyBRb1Mgc2V0dXBzLgorICAgICAgICAgKi8KKyAgICAgICAgc2RrX3JjID0gYmNtX3N0a19tb2RpZF9nZXQodW5pdCwgJmdwX2JhbF9iY21fcW9zX2NmZy0+bW9kX2lkKTsKKyAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX3N0a19tb2RpZF9nZXQgZmFpbGVkIHdpdGggJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSk7CisKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IHRoZSBwb3J0IHJhdGUgYmFzZWQgb24gYm9hcmQgdHlwZSAqLworICAgICAgICBzd2l0Y2gocG9uX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkFMX1NXQVBQX1BPUlRfTUFQX0dQT046CisgICAgICAgICAgICBjYXNlIEJBTF9TV0FQUF9QT1JUX01BUF9HUE9OX1YzOgorICAgICAgICAgICAgICAgIHBvcnRfcmF0ZSA9IDI1MDAwMDA7ICAvKiAyLjVHICovCisgICAgICAgICAgICAgICAgcHJpX2NoYW5uZWxfcmF0ZSA9IDI1MDAwMDA7ICAvKiAyLjVHICovCisgICAgICAgICAgICAgICAgc2VjX2NoYW5uZWxfcmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgZ3BfYmFsX2JjbV9xb3NfY2ZnLT5udW1fY2hhbm5lbHNfcGVyX3BvbiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkFMX1NXQVBQX1BPUlRfTUFQX0VYUDoKKyAgICAgICAgICAgIGNhc2UgQkFMX1NXQVBQX1BPUlRfTUFQX0VYUDI6CisgICAgICAgICAgICBjYXNlIEJBTF9TV0FQUF9QT1JUX01BUF9TVks0OgorICAgICAgICAgICAgICAgIHBvcnRfcmF0ZSA9IDEwMDAwMDAwOyAgLyogMTBHICovCisgICAgICAgICAgICAgICAgcHJpX2NoYW5uZWxfcmF0ZSA9IDEwMDAwMDAwOyAgLyogMTBHICovCisgICAgICAgICAgICAgICAgc2VjX2NoYW5uZWxfcmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgZ3BfYmFsX2JjbV9xb3NfY2ZnLT5udW1fY2hhbm5lbHNfcGVyX3BvbiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkFMX1NXQVBQX1BPUlRfTUFQX0VQT05fVERNQToKKyAgICAgICAgICAgICAgICBwb3J0X3JhdGUgPSBCQUxfQkNNX1FPU19ERUZBVUxUX1BPUlRfUkFURTsgIC8qIDEyLjVHICovCisgICAgICAgICAgICAgICAgcHJpX2NoYW5uZWxfcmF0ZSA9IEJBTF9CQ01fUU9TX0RFRkFVTFRfMTBHX0NIQU5fUkFURTsgIC8qIDEwLjI1RyAqLworICAgICAgICAgICAgICAgIHNlY19jaGFubmVsX3JhdGUgPSBCQUxfQkNNX1FPU19ERUZBVUxUXzFHX0NIQU5fUkFURTsgLyogMi4yNUcgKi8KKyAgICAgICAgICAgICAgICBncF9iYWxfYmNtX3Fvc19jZmctPm51bV9jaGFubmVsc19wZXJfcG9uID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQUxfU1dBUFBfUE9SVF9NQVBfRVBPTl8xRzoKKyAgICAgICAgICAgICAgICBwb3J0X3JhdGUgPSAyNTAwMDAwOyAgLyogMi41RyAqLworICAgICAgICAgICAgICAgIHByaV9jaGFubmVsX3JhdGUgPSBCQUxfQkNNX1FPU19ERUZBVUxUXzFHX0NIQU5fUkFURTsgIC8qIDIuMjVHICovCisgICAgICAgICAgICAgICAgc2VjX2NoYW5uZWxfcmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgZ3BfYmFsX2JjbV9xb3NfY2ZnLT5udW1fY2hhbm5lbHNfcGVyX3BvbiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkFMX1NXQVBQX1BPUlRfTUFQX0VQT05fMTBHOgorICAgICAgICAgICAgICAgIHBvcnRfcmF0ZSA9IEJBTF9CQ01fUU9TX0RFRkFVTFRfUE9SVF9SQVRFOyAgLyogMTIuNUcgKi8KKyAgICAgICAgICAgICAgICBwcmlfY2hhbm5lbF9yYXRlID0gQkFMX0JDTV9RT1NfREVGQVVMVF8xMEdfQ0hBTl9SQVRFOyAgLyogMTAuMjVHICovCisgICAgICAgICAgICAgICAgc2VjX2NoYW5uZWxfcmF0ZSA9IDA7CisgICAgICAgICAgICAgICAgZ3BfYmFsX2JjbV9xb3NfY2ZnLT5udW1fY2hhbm5lbHNfcGVyX3BvbiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogcG9uIG1vZGUgJWQgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcG9uX21vZGUpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogIEluaXRpYWxpemUgdGhlIGVncmVzcyBzY2hlZHVsaW5nIGZvciBkb3duc3RyZWFtIFFvUyBvbiBlYWNoCisgICAgICAgICAqICBQT04tc2lkZSBwb3J0LgorICAgICAgICAgKi8KKyAgICAgICAgaWkgPSAwOyAgLyogU3RhcnQgd2l0aCB0aGUgZmlyc3QgUE9OIGxvZ2ljYWwgaW50ZXJmYWNlICovCisgICAgICAgIC8qIGxvb3AgdGhyb3VnaCBhbGwgcG9uIHBvcnQsIC0xIGluZGljYXRlIGVuZCBvZiB0YWJsZSAqLworICAgICAgICB3aGlsZSgtMSAhPSAocG9ydF9udW0gPSBiYWxfYmNtX3Bvbl9pbmZfcGJtX2dldChpaSkpKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRGVmYXVsdCBwb3J0IHNldHRpbmdzCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogU2V0IHRoZSBwb3J0IHNoYXBlciB0byByYXRlIGJhc2VkIG9uIHBoeXNpY2FsIGxheW91dCBvbiBlYWNoIGJvYXJkLgorICAgICAgICAgICAgICogT24gRXBvbiwgdGhlcmUgYXJlIDIgY2hhbm5lbHMgb24gZWFjaCBwb3J0LgorICAgICAgICAgICAgICogVGhlIGNoYW5uZWwgaW50ZXJmYWNlIHNoYXBlcnMgYXJlIHNldCB0byAxMEcgYW5kIDJHIGZvciB0aGUgMTBHIGFuZCAxRworICAgICAgICAgICAgICogY2hhbm5lbHMgcmVzcGVjdGl2ZWx5LiBEUFAgd2lsbCByZWx5IG9uIGZsb3cgY29udHJvbCBmcm9tCisgICAgICAgICAgICAgKiBNYXBsZSBmb3IgYmFjayBwcmVzc3VyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYmFsX3N3X2RwcF9xb3Nfc2V0X3BvcnRfYmFuZHdpZHRoKHVuaXQsIHBvcnRfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X3JhdGUsIEJBTF9CQ01fUU9TX0RFRkFVTFRfTUFYX0JVUlNUKTsKKyAgICAgICAgICAgIGJhbF9zd19kcHBfcW9zX3NldF9wb3J0Y2hhbl9iYW5kd2lkdGgodW5pdCwgcG9ydF9udW0sIEJBTF9CQ01fU0NIRURfUE9OX0NIQU5fMTBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlfY2hhbm5lbF9yYXRlLCBCQUxfQkNNX1FPU19ERUZBVUxUX01BWF9CVVJTVCk7CisgICAgICAgICAgICBpZihncF9iYWxfYmNtX3Fvc19jZmctPm51bV9jaGFubmVsc19wZXJfcG9uID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYWxfc3dfZHBwX3Fvc19zZXRfcG9ydGNoYW5fYmFuZHdpZHRoKHVuaXQsIHBvcnRfbnVtLCBCQUxfQkNNX1NDSEVEX1BPTl9DSEFOXzFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNfY2hhbm5lbF9yYXRlLCBCQUxfQkNNX1FPU19ERUZBVUxUX01BWF9CVVJTVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHBvbl9jaGFuID0gMDsgcG9uX2NoYW4gPCBncF9iYWxfYmNtX3Fvc19jZmctPm51bV9jaGFubmVsc19wZXJfcG9uOyBwb25fY2hhbisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHBhc3MgdGhlIGxvZ2ljYWwgcG9ydCBudW1iZXIgLSBpaSwgdG8gdGhlIHBvcnQgcW9zIGluaXQgZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICogIHRoZSBsb2dpY2FsIHBvcnQgbnVtYmVyIGFuZCB0aGUgY2hhbm5lbCBudW1iZXIgd2lsbCBiZSBtYXBwZWQgdG8KKyAgICAgICAgICAgICAgICAgKiAgcGFja2V0IHByb2Nlc3MgcG9ydCBudW1iZXIgdGhhdCB1c2VkIGluIHFvcyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmMgPSBiYWxfc3dfZHBwX3BvcnRfcW9zX2luaXQodW5pdCwgaWksIHBvbl9jaGFuKTsKKworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRb1Mgc2V0dXAgZmFpbGVkIGZvciBwb3J0ICV1IHBvbl9jaGFuICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X251bSwgcG9uX2NoYW4pOworCisgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBFeGNlcHRpb24gQmxvY2sgLSBjaGVjayBmb3IgZXJyb3JzIGZyb20gdGhlIHByZXZpb3VzIGxvb3AgKi8KKyAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpaSsrOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIGVycm9ycyAqLworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBGbG93L1ZPUSBJRCBwb29scyAqLworICAgICAgICBiYWxfc3dfZHBwX2luaXRfZmxvd19pZF9wb29sKCZncF9iYWxfYmNtX3Fvc19jZmctPmZsb3dfaWRfcG9vbF8xMGcsCisgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUU9TX1ZPUV9CQVNFXzEwRywKKyAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9RT1NfVk9RX01BWF8xMEcpOworCisgICAgICAgIGJhbF9zd19kcHBfaW5pdF9mbG93X2lkX3Bvb2woJmdwX2JhbF9iY21fcW9zX2NmZy0+Zmxvd19pZF9wb29sXzFnLAorICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1FPU19WT1FfQkFTRV8xRywKKyAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9RT1NfVk9RX01BWF8xRyk7CisKKyAgICB9IHdoaWxlKDApOyAvKiBFeGNlcHRpb24gQmxvY2sgLSBFbmQgKi8KKworICAgIC8qIENoZWNrIGZvciBlcnJvcnMgKi8KKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIEZhaWx1cmUgKi8KKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICJCQUwgQkNNIEFwcCBub3QgaW5pdGlhbGl6ZWQsIGZhaWxlZCBzZXR0aW5nIHVwIHRoZSBRb1MgbW9kdWxlXG4iKTsKKworICAgICAgICAvKiBDbGVhbnVwICovCisgICAgICAgIGJhbF9zd19kcHBfcW9zX2NsZWFudXAodW5pdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFN1Y2Nlc3MgKi8KKyAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIlN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCB0aGUgUW9TIG1vZHVsZVxuIik7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBDbGVhbnVwIHRoZSBCQUwgQkNNIEFQUCBRb1MgTW9kdWxlCisgKgorICogQHBhcmFtIHVuaXQgIFNESyB1bml0IG51bWJlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmFsX3N3X2RwcF9xb3NfY2xlYW51cChpbnQgdW5pdCkKK3sKKyAgICBiY21fcG9ydF90IHBvcnRfbnVtOworICAgIGJhbF9zd19kcHBfcW9zX3NjaGVkX3Bvbl9jaGFuIHBvbl9jaGFuOworICAgIGludCBpaTsKKyAgICAvKgorICAgICAqICBDbGVhbnVwIHRoZSBlZ3Jlc3Mgc2NoZWR1bGluZyBmb3IgZG93bnN0cmVhbSBRb1Mgb24gZWFjaAorICAgICAqICBQT04tc2lkZSBwb3J0LgorICAgICAqLworICAgIGlpID0gMDsgIC8qIFN0YXJ0IHdpdGggdGhlIGZpcnN0IFBPTiBsb2dpY2FsIGludGVyZmFjZSAqLworICAgIC8qIGxvb3AgdGhyb3VnaCBhbGwgcG9uIHBvcnQsIC0xIGluZGljYXRlIGVuZCBvZiB0YWJsZSAqLworICAgIHdoaWxlKC0xICE9IChwb3J0X251bSA9IGJhbF9iY21fcG9uX2luZl9wYm1fZ2V0KGlpKSkpCisgICAgeworICAgICAgICAvKiBDbGVhbiB1cCBlYWNoIGNoYW5uZWxpemVkIHBvcnQgKi8KKyAgICAgICAgZm9yIChwb25fY2hhbiA9IDA7IHBvbl9jaGFuIDwgZ3BfYmFsX2JjbV9xb3NfY2ZnLT5udW1fY2hhbm5lbHNfcGVyX3BvbjsgcG9uX2NoYW4rKykKKyAgICAgICAgeworICAgICAgICAgICAgYmFsX3N3X2RwcF9wb3J0X3Fvc19jbGVhbnVwKHVuaXQsIGlpLCBwb25fY2hhbik7CisgICAgICAgIH0KKyAgICAgICAgaWkrKzsKKyAgICB9CisKKyAgICAvKiBDbGVhbiB1cCB0aGUgVEMgbWFwICovCisgICAgYmFsX3N3X2RwcF9xb3NfdGNfbWFwX2NsZWFudXAodW5pdCk7CisKKyAgICAvKiBGcmVlIG1lbW9yeSB0aGF0IHdhcyB1c2VkIGZvciB0aGUgRmxvdy9WT1EgSUQgcG9vbHMgKi8KKyAgICBiYWxfc3dfZHBwX2NsZWFudXBfZmxvd19pZF9wb29sKCZncF9iYWxfYmNtX3Fvc19jZmctPmZsb3dfaWRfcG9vbF8xMGcpOworICAgIGJhbF9zd19kcHBfY2xlYW51cF9mbG93X2lkX3Bvb2woJmdwX2JhbF9iY21fcW9zX2NmZy0+Zmxvd19pZF9wb29sXzFnKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQ29uZmlndXJlIHRoZSByYXRlIHNoYXBlciBmb3IgYSBQT04gcG9ydAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgcmF0ZSBzaGFwZXIgKGkuZS4sIHJhdGUgbGltaXQpIGZvciBhCisgKiBQT04gc2lkZSBwb3J0LiBUaGUgcmF0ZSBsaW1pdCBhbmQgbWF4aW11bSBidXJzdCBzaXplIGlzIHNldCB0byB0aGUKKyAqIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgZnVuY3Rpb24gY2FsbC4gVGhlIG1heGltdW0gYnVyc3Qgc2l6ZSBpcworICogb25seSBzZXQgZm9yIG1heF9idXJzdCB2YWx1ZXMgZ3JlYXRlciB0aGFuICcwJy4KKyAqCisgKiBAcGFyYW0gdW5pdCAgICAgICBTREsgdW5pdCBudW1iZXIKKyAqIEBwYXJhbSBwb25fcG9ydCAgIFBPTiBwb3J0IG51bWJlcgorICogQHBhcmFtIGJhbmR3aWR0aCAgU2hhcGVyIGRhdGEgcmF0ZSBpbiBrYnBzCisgKiBAcGFyYW0gbWF4X2J1cnN0ICAgU2hhcGVyIG1heGltdW0gYnVyc3Qgc2l6ZSBpbiBieXRlcworICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiYWxfc3dfZHBwX3Fvc19zZXRfcG9ydF9iYW5kd2lkdGgoaW50IHVuaXQsIGJjbV9wb3J0X3QgcG9uX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYW5kd2lkdGgsIHVpbnQzMl90IG1heF9idXJzdCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtX2Vycm9yX3Qgc2RrX3JjID0gQkNNX0VfTk9ORTsKKyAgICBiY21fZ3BvcnRfdCBlMmVfcG9uX2dwb3J0OworICAgIGJjbV9ncG9ydF90IGUyZV9wYXJlbnRfZ3BvcnQ7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKHBvbl9wb3J0ID4gQkFMX0JDTV9NQVhfUE9OX05VTSk7CisKKyAgICAvKiBHZXQgdGhlIGdwb3J0IG9iamVjdCBmb3IgdGhlIEUyRSBpbnRlcmZhY2UgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBwb25fcG9ydAorICAgICAqLworICAgIEJDTV9DT1NRX0dQT1JUX0UyRV9QT1JUX1NFVChlMmVfcG9uX2dwb3J0LCBwb25fcG9ydCk7CisKKyAgICBkbyAvKiBFeGNlcHRpb24gQmxvY2sgU3RhcnQgKi8KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgZ3BvcnQgZm9yIHRoZSBFMkUgSW50ZXJmYWNlCisgICAgICAgICAqLworICAgICAgICBzZGtfcmMgPSBiY21fZmFicmljX3BvcnRfZ2V0KHVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTJlX3Bvbl9ncG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlMmVfcGFyZW50X2dwb3J0KTsKKyAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2ZhYnJpY19wb3J0X2dldCBmb3IgRWdyZXNzIFBvcnQgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCk7CisKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHJhdGUgb24gdGhlIEUyRSBJbnRlcmZhY2UKKyAgICAgICAgICovCisgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2JhbmR3aWR0aF9zZXQodW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMmVfcGFyZW50X2dwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IGJjbV9jb3NxX2dwb3J0X2JhbmR3aWR0aF9zZXQgZm9yIEVncmVzcyBQb3J0IGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcG9uX3BvcnQpOworCisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qICBTZXQgdGhlIEJ1cnN0ICovCisgICAgICAgIGlmIChtYXhfYnVyc3QgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9jb250cm9sX3NldCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTJlX3BhcmVudF9ncG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21Db3NxQ29udHJvbEJhbmR3aWR0aEJ1cnN0TWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2J1cnN0KTsKKyAgICAgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9jb250cm9sX3NldCBmb3IgTWF4QnVyc3QgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcG9uX3BvcnQpOworCisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IHdoaWxlKDApOyAvKiBFeGNlcHRpb24gQmxvY2sgLSBFbmQgKi8KKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQ29uZmlndXJlIHRoZSByYXRlIHNoYXBlciBmb3IgYSBQT04gY2hhbm5lbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgcmF0ZSBzaGFwZXIgKGkuZS4sIHJhdGUgbGltaXQpIGZvciBhCisgKiBQT04gY2hhbm5lbCAxMEcuIHZzLiAxRy4gVGhlIHJhdGUgbGltaXQgYW5kIG1heGltdW0gYnVyc3Qgc2l6ZSBpcworICogc2V0IHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGZ1bmN0aW9uIGNhbGwuIFRoZSBtYXhpbXVtIGJ1cnN0CisgKiBzaXplIGlzIG9ubHkgc2V0IGZvciBtYXhfYnVyc3QgdmFsdWVzIGdyZWF0ZXIgdGhhbiAnMCcuCisgKgorICogQHBhcmFtIHVuaXQgICAgICAgU0RLIHVuaXQgbnVtYmVyCisgKiBAcGFyYW0gcG9uX3BvcnQgICBQT04gcG9ydCBudW1iZXIKKyAqIEBwYXJhbSBwb25fY2hhbiAgICBQT04gY2hhbm5lbCAoMTBHIHZzLiAxRykKKyAqIEBwYXJhbSBiYW5kd2lkdGggIFNoYXBlciBkYXRhIHJhdGUgaW4ga2JwcworICogQHBhcmFtIG1heF9idXJzdCAgIFNoYXBlciBtYXhpbXVtIGJ1cnN0IHNpemUgaW4gYnl0ZXMKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmFsX3N3X2RwcF9xb3Nfc2V0X3BvcnRjaGFuX2JhbmR3aWR0aChpbnQgdW5pdCwgYmNtX3BvcnRfdCBwb25fcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbF9zd19kcHBfcW9zX3NjaGVkX3Bvbl9jaGFuIHBvbl9jaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmFuZHdpZHRoLCB1aW50MzJfdCBtYXhfYnVyc3QpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbV9lcnJvcl90IHNka19yYyA9IEJDTV9FX05PTkU7CisgICAgYmNtX3BvcnRfdCBwcF9wb3J0OworICAgIGJjbV9ncG9ydF90IGUyZV9ncG9ydDsKKyAgICBiY21fZ3BvcnRfdCBsb2NhbF9ncG9ydDsKKyAgICBiY21fZ3BvcnRfdCBlMmVfdGNfZ3BvcnQ7CisgICAgYmNtX2dwb3J0X3QgbG9jYWxfdGNfZ3BvcnQ7CisgICAgdWludDMyX3QgYWRqX2JhbmR3aWR0aDsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04ocG9uX3BvcnQgPiAgQkFMX0JDTV9NQVhfUE9OX05VTSk7CisgICAgQlVHX09OKHBvbl9jaGFuICA+PSBCQUxfQkNNX1NDSEVEX1BPTl9DSEFOX05VTSk7CisKKyAgICAvKiBHZXQgdGhlIGxvY2FsIHBvcnQgbnVtYmVyIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZSBQT04gcG9ydCBudW1iZXIgYW5kIGNoYW5uZWwgKi8KKyAgICBwcF9wb3J0ID0gQkFMX0JDTV9HRVRfUFBfUE9SVChwb25fcG9ydCwgcG9uX2NoYW4pOworCisgICAgZG8gLyogRXhjZXB0aW9uIEJsb2NrIFN0YXJ0ICovCisgICAgeworICAgICAgICAvKiBBcHBseSBhIHJhdGUgYWRqdXN0bWVudCB0byB0aGUgY3JlZGl0IGdlbmVyYXRvciAqLworICAgICAgICBhZGpfYmFuZHdpZHRoID0gYmFuZHdpZHRoICsgKCh1aW50MzJfdCkoYmFuZHdpZHRoICogQkFMX0JDTV9RT1NfQ1JFRElUX1JBVEVfQURKKSk7CisKKyAgICAgICAgQkNNX0NPU1FfR1BPUlRfRTJFX1BPUlRfU0VUKGUyZV9ncG9ydCwgcHBfcG9ydCk7CisgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2JhbmR3aWR0aF9zZXQodW5pdCwgZTJlX2dwb3J0LCAwLCAwLCBhZGpfYmFuZHdpZHRoLCAwKTsKKyAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfYmFuZHdpZHRoX3NldCBmb3IgZTJlX2dwb3J0IGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgY2hhbiAldSBwcF9wb3J0ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYyksIHBvbl9wb3J0LCBwb25fY2hhbiwgcHBfcG9ydCk7CisKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogQXBwbHkgYSByYXRlIGFkanVzdG1lbnQgdG8gdGhlIHNoYXBlciAqLworICAgICAgICBhZGpfYmFuZHdpZHRoID0gYmFuZHdpZHRoICsgKCh1aW50MzJfdCkoYmFuZHdpZHRoICogQkFMX0JDTV9RT1NfU0hBUEVSX1JBVEVfQURKKSk7CisKKyAgICAgICAgQkNNX0dQT1JUX0xPQ0FMX1NFVChsb2NhbF9ncG9ydCwgcHBfcG9ydCk7CisgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2JhbmR3aWR0aF9zZXQodW5pdCwgbG9jYWxfZ3BvcnQsIDAsIDAsIGFkal9iYW5kd2lkdGgsIDApOworICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9iYW5kd2lkdGhfc2V0IGZvciBsb2NhbF9ncG9ydCBmYWlsZWQgd2l0aCAlcyBmb3IgcG9uICV1IGNoYW4gJXUgcHBfcG9ydCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCwgcG9uX2NoYW4sIHBwX3BvcnQpOworCisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEJDTV9DT1NRX0dQT1JUX0UyRV9QT1JUX1RDX1NFVChlMmVfdGNfZ3BvcnQsIHBwX3BvcnQpOworICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9iYW5kd2lkdGhfc2V0KHVuaXQsIGUyZV90Y19ncG9ydCwgMCwgMCwgYmFuZHdpZHRoLCAwKTsKKyAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfYmFuZHdpZHRoX3NldCBmb3IgZTJlX3RjX2dwb3J0IGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgY2hhbiAldSBwcF9wb3J0ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYyksIHBvbl9wb3J0LCBwb25fY2hhbiwgcHBfcG9ydCk7CisKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQkNNX0NPU1FfR1BPUlRfUE9SVF9UQ19TRVQobG9jYWxfdGNfZ3BvcnQsIHBwX3BvcnQpOworICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9iYW5kd2lkdGhfc2V0KHVuaXQsIGxvY2FsX3RjX2dwb3J0LCAwLCAwLCBiYW5kd2lkdGgsIDApOworICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9iYW5kd2lkdGhfc2V0IGZvciBsb2NhbF90Y19ncG9ydCBmYWlsZWQgd2l0aCAlcyBmb3IgcG9uICV1IGNoYW4gJXUgcHBfcG9ydCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCwgcG9uX2NoYW4sIHBwX3BvcnQpOworCisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSgwKTsgLyogRXhjZXB0aW9uIEJsb2NrIC0gRW5kICovCisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIENvbmZpZ3VyZSBTUCBvciBXRlEgc2NoZWR1bGluZyBmb3IgYSBQT04gY2hhbm5lbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBzY2hlZHVsaW5nIGZvciBhIFBPTiBjaGFubmVsICgxMEcKKyAqIHZzLiAxRykuIElmIGFsbCBvZiB0aGUgc3BlY2lmaWVkIHdlaWdodCB2YWx1ZXMgYXJlIG5vbi16ZXJvLCB0aGVuCisgKiBXRlEgaXMgZW5hYmxlZCBvbiB0aGUgUE9OIGNoYW5uZWwuIE90aGVyd2lzZSwgaWYgb25lIG9yIG1vcmUgb2YgdGhlCisgKiB3ZWlnaHQgdmFsdWVzIGlzIHplcm8sIHN0cmljdCBwcmlvcml0eSAoU1ApIHNjaGVkdWxpbmcgd2lsbCBiZSB1c2VkCisgKiBvbiB0aGlzIHBvcnQuCisgKgorICogQHBhcmFtIHVuaXQgICAgICAgU0RLIHVuaXQgbnVtYmVyCisgKiBAcGFyYW0gcG9uX3BvcnQgICBQT04gcG9ydCBudW1iZXIKKyAqIEBwYXJhbSBwb25fY2hhbiAgICBQT04gY2hhbm5lbCAoMTBHIHZzLiAxRykKKyAqIEBwYXJhbSBwX3dmcV9jZmcgICAgUG9pbnRlciB0byB0aGUgV0ZRIHNjaGVkdWxlciBjb25maWd1cmF0aW9uCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJhbF9zd19kcHBfcW9zX3NldF9wb25jaGFuX3dmcV9jZmcoaW50IHVuaXQsIGJjbV9wb3J0X3QgcG9uX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxfc3dfZHBwX3Fvc19zY2hlZF9wb25fY2hhbiBwb25fY2hhbiwgYmFsX3N3X2RwcF9xb3Nfd2ZxX2NmZyAqcF93ZnFfY2ZnKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21fZXJyb3JfdCBzZGtfcmMgPSBCQ01fRV9OT05FOworICAgIGJhbF9zd19kcHBfcG9ydF9xb3NfY2ZnICpwX3BvcnRfcW9zID0gTlVMTDsKKyAgICB1aW50OF90IHdmcV9sdmw7CisgICAgdWludDMyX3Qgd2VpZ2h0OworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihwb25fcG9ydCA+PSBCQUxfQkNNX1FPU19OVU1fUE9OX1BPUlRTKTsKKyAgICBCVUdfT04ocG9uX2NoYW4gID49IEJBTF9CQ01fU0NIRURfUE9OX0NIQU5fTlVNKTsKKworICAgIC8qIEdldCB0aGUgc2NoZWR1bGVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwb3J0LiAqLworICAgIHBfcG9ydF9xb3MgPSAmZ3BfYmFsX2JjbV9xb3NfY2ZnLT5wb25bcG9uX3BvcnRdW3Bvbl9jaGFuXTsKKworICAgIC8qIEFzc3VtZSBXRlEgaXMgdXNlZCB1bnRpbCBhIHplcm8gd2VpZ2h0IHZhbHVlIGlzIGVuY291bnRlcmVkLiAqLworICAgIHBfcG9ydF9xb3MtPnNjaGVkX3R5cGUgPSBCQUxfQkNNX1NDSEVEX1RZUEVfV0ZROworICAgIGZvciAod2ZxX2x2bD0wOyB3ZnFfbHZsPEJBTF9CQ01fU0NIRURfV0ZRX1BSSV9OVU07IHdmcV9sdmwrKykKKyAgICB7CisgICAgICAgIGlmIChwX3dmcV9jZmctPndlaWdodHNbd2ZxX2x2bF0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVXNlIHN0cmljdCBwcmlvcml0eSAqLworICAgICAgICAgICAgbWVtc2V0KCZwX3BvcnRfcW9zLT5wb25fY2hhbl93ZWlnaHRfY2ZnLCAwLCBzaXplb2YocF9wb3J0X3Fvcy0+cG9uX2NoYW5fd2VpZ2h0X2NmZykpOworICAgICAgICAgICAgcF9wb3J0X3Fvcy0+c2NoZWRfdHlwZSA9IEJBTF9CQ01fU0NIRURfVFlQRV9TUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcF9wb3J0X3Fvcy0+cG9uX2NoYW5fd2VpZ2h0X2NmZ1t3ZnFfbHZsXSA9IHBfd2ZxX2NmZy0+d2VpZ2h0c1t3ZnFfbHZsXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIFdGUSBpcyBiZWluZyB1c2VkLCB1cGRhdGUgdGhlIHdlaWdodCB2YWx1ZXMgaW4gdGhlIFBPTgorICAgICAqIGNoYW5uZWwncyBTRS4gT3RoZXJ3aXNlLCB0aGUgc2NoZWR1bGluZyB0eXBlIGlzIFNQIGFuZCB0aGVyZSBpcworICAgICAqIG5vdGhpbmcgZWxzZSB0byBkby4KKyAgICAgKi8KKyAgICBpZiAocF9wb3J0X3Fvcy0+c2NoZWRfdHlwZSA9PSBCQUxfQkNNX1NDSEVEX1RZUEVfV0ZRKQorICAgIHsKKyAgICAgICAgLyogQXBwbHkgdGhlIHdlaWdodCBjb25maWd1cmF0aW9uIGZvciBlYWNoIFdGUSBzY2hlZHVsaW5nCisgICAgICAgICAqIGxldmVsIHRvIHRoZSBoYXJkd2FyZS4KKyAgICAgICAgICovCisgICAgICAgIGZvciAod2ZxX2x2bD0wOyB3ZnFfbHZsPEJBTF9CQ01fU0NIRURfV0ZRX1BSSV9OVU07IHdmcV9sdmwrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGhlIHdlaWdodCBjYW5ub3QgZXhjZWVkIDRLIG9uIEFSQUQgKi8KKyAgICAgICAgICAgIHdlaWdodCA9IHBfcG9ydF9xb3MtPnBvbl9jaGFuX3dlaWdodF9jZmdbd2ZxX2x2bF07CisgICAgICAgICAgICBpZiAod2VpZ2h0ID4gQkFMX0JDTV9TQ0hFRF9XRlFfTUFYX1dFSUdIVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25maWd1cmVkIHdlaWdodCB2YWx1ZSAldSBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgYnkgQVJBRCwgY2FwcGluZyB2YWx1ZSB0byAldSwgcG9uICV1LCBjaGFuICV1LCB3ZnFfbHZsICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCwgQkFMX0JDTV9TQ0hFRF9XRlFfTUFYX1dFSUdIVCwgcG9uX3BvcnQsIHBvbl9jaGFuLCB3ZnFfbHZsKTsKKworICAgICAgICAgICAgICAgIC8qIElmIHRoZSB3ZWlnaHQgdmFsdWUgZXhjZWVkcyBtYXgsIGNhcCB0aGF0IHZhbHVlIGF0IDRLLiAqLworICAgICAgICAgICAgICAgIHdlaWdodCA9IEJBTF9CQ01fU0NIRURfV0ZRX01BWF9XRUlHSFQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIENvbmZpZ3VyZSB0aGUgaGFyZHdhcmUgKi8KKyAgICAgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X3NjaGVkX3NldCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9xb3MtPndmcV9zY2hlZHVsZXJbd2ZxX2x2bF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fQ09TUV9TUDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0KTsKKyAgICAgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9zY2hlZF9zZXQgZm9yIFBPTiBDaGFubmVsIFdGUSBTRSBmYWlsZWQgd2l0aCAlcyBmb3IgcG9uICV1LCBjaGFuICV1LCB3ZnFfbHZsICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCwgcG9uX2NoYW4sIHdmcV9sdmwpOworCisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplIGRvd25zdHJlYW0gUW9TIGZvciBhIGNoYW5uZWxpemVkIFBPTiBwb3J0CisgKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBkb3duc3RyZWFtIFFvUyBmb3IgYSBjaGFubmVsaXplZCBQT04KKyAqIHBvcnQsIHdoZXJlIHNjaGVkdWxpbmcvUW9TIGlzIGFwcGxpZWQgdG8gcGFja2V0cyB0aGF0IGVncmVzcyB0aGUKKyAqIHBvcnQuIFBsZWFzZSByZWZlciB0byB0aGUgIlNDSEVEVUxFUiBNT0RFTCIgZGlhZ3JhbSBhdCB0aGUgdG9wIG9mCisgKiB0aGlzIGZpbGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBQb3J0LXJlbGF0ZWQgc2NoZWR1bGluZyBlbGVtZW50cworICogKFNFcyksIGluY2x1ZGluZyB0aGUgUE9OIGNoYW5uZWwgKDEwRyB2cy4gMUcpIEhpZ2ggUmVzb2x1dGlvbgorICogRGlmZi1zZXJ2ZSAoSFIpIFNFLiBDSVIgZmxvd3MgYXJlIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBjaGFubmVsCisgKiBIUi4gU3RyaWN0IFByaW9yaXR5IChTUCkgYW5kIFdlaWdodGVkLUZhaXIgUXVldWUgKFdGUSkgU0VzIGFyZQorICogY3JlYXRlZCB0byBpbXBsZW1lbnQgRE9DU0lTIFRyYWZmaWMgUHJpb3JpdHkgZm9yIEVJUiBmbG93cy4gQWZ0ZXIKKyAqIGNyZWF0aW5nIHRoZSBTRXMsIGVhY2ggU0UgaXMgY29ubmVjdGVkIHRvIHRoZSBoaWVyYXJjaHkgYXMgc2hvd24gaW4KKyAqIHRoZSBkaWFncmFtLgorICoKKyAqIEBwYXJhbSB1bml0ICAgICAgU0RLIHVuaXQgbnVtYmVyCisgKiBAcGFyYW0gbG9nX3BvbiAgIGxvZ2ljYWwgUE9OIHBvcnQgbnVtYmVyCisgKiBAcGFyYW0gcG9uX2NoYW4gICBQT04gY2hhbm5lbCAoMTBHIHZzLiAxRykKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmFsX3N3X2RwcF9wb3J0X3Fvc19pbml0KGludCB1bml0LCBiY21fcG9ydF90IGxvZ19wb24sIGJhbF9zd19kcHBfcW9zX3NjaGVkX3Bvbl9jaGFuIHBvbl9jaGFuKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21fZXJyb3JfdCBzZGtfcmMgPSBCQ01fRV9OT05FOworICAgIGJhbF9zd19kcHBfcG9ydF9xb3NfY2ZnICpwX3BvcnRfcW9zID0gTlVMTDsKKyAgICBiY21fZ3BvcnRfdCBtb2RfZ3BvcnQ7CisgICAgaW50IGZsYWdzID0gMDsKKyAgICBpbnQgd2ZxX2x2bDsKKyAgICBiY21fcG9ydF90IHBwX3BvcnQsIHBvbl9wb3J0OworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsb2dfcG9uID49IEJBTF9CQ01fUU9TX05VTV9QT05fUE9SVFMpOworICAgIEJVR19PTihwb25fY2hhbiA+PSBCQUxfQkNNX1NDSEVEX1BPTl9DSEFOX05VTSk7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAiJXMoKTogaW5pdGlhbGl6aW5nIFFvUyBvbiBwb3J0ICVkLCAlcyBjaGFubmVsIHcgc2NoZSBtb2RlICVzXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbG9nX3BvbiwgKHBvbl9jaGFuID09IEJBTF9CQ01fU0NIRURfUE9OX0NIQU5fMTBHKSA/ICIxMEciIDogIjFHIiwKKyAgICAgICAgICAgICAgICAoYmFsX2JjbV9kc19zY2hlZF9tb2RlX2dldCgpKSA/ICJXRlEiIDogIlNQIik7CisKKyAgICAvKiBSZXRyaWV2ZSB0aGUgUW9TIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCwgaW5kZXggYnkgbG9naWNhbCBwb24gbnVtYmVyICovCisgICAgcF9wb3J0X3FvcyA9ICZncF9iYWxfYmNtX3Fvc19jZmctPnBvbltsb2dfcG9uXVtwb25fY2hhbl07CisKKyAgICAvKiBHZXQgTWF4IHJhdGUgc2NoZWR1bGluZyBtb2RlIGZyb20gZ2xvYmFsIHNldHRpbmcgKi8KKyAgICAvKiBUQkQgLSB0aGUgc2NoZWR1bGluZyBtb2RlIGNhbiBiZSBkaWZmZXJlbnQgZm9yIGVhY2ggcG9ydCAqLworICAgIHBfcG9ydF9xb3MtPnNjaGVkX3R5cGUgPSBiYWxfYmNtX2RzX3NjaGVkX21vZGVfZ2V0KCk7CisKKyAgICAvKiBnZXQgdGhlIHBwIHBvcnQgZnJvbSB0aGUgZGV2aWNlIHBvcnQgbnVtYmVyICovCisgICAgcG9uX3BvcnQgPSBiYWxfYmNtX3Bvbl9pbmZfcGJtX2dldChsb2dfcG9uKTsKKyAgICBwcF9wb3J0ID0gQkFMX0JDTV9HRVRfUFBfUE9SVChwb25fcG9ydCwgcG9uX2NoYW4pOworCisgICAgLyoKKyAgICAgKiBTZXR1cCBkb3duc3RyZWFtIHNjaGVkdWxpbmcgdGhpcyBjaGFubmVsaXplZCBwb3J0CisgICAgICovCisKKyAgICBkbyAvKiBFeGNlcHRpb24gQmxvY2sgU3RhcnQgKi8KKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbW9kIHBvcnQgZm9yIHRoaXMgY2hhbm5lbC4KKyAgICAgICAgICovCisgICAgICAgIEJDTV9HUE9SVF9NT0RQT1JUX1NFVChtb2RfZ3BvcnQsIGdwX2JhbF9iY21fcW9zX2NmZy0+bW9kX2lkLCBwcF9wb3J0KTsKKyAgICAgICAgcF9wb3J0X3Fvcy0+bW9kX2dwb3J0ID0gbW9kX2dwb3J0OworCisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNoYW5uZWwgd2VpZ2h0cyB0byBkZWZhdWx0cyB2YWx1ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEJ5IGRlZmF1bHQgc3RyaWN0IHByaW9yaXR5IGlzIHVzZWQsIHNvIHRoZXNlIHdlaWdodCB2YWx1ZXMKKyAgICAgICAgICogYXJlIG5vdCAiYWN0aXZlIi4gSG93ZXZlciwgd2UgbmVlZCB0byBzZXQgdGhlIHdlaWdodHMgdG8KKyAgICAgICAgICogc29tZXRoaW5nIG5vbi16ZXJvIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGRlZmF1bHQgY2hhbm5lbCB3ZWlnaHRzIGFyZS4uLgorICAgICAgICAgKiAgIDMyLCA2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgNDA5NgorICAgICAgICAgKi8KKyAgICAgICAgcF9wb3J0X3Fvcy0+cG9uX2NoYW5fd2VpZ2h0X2NmZ1swXSA9IDMyOworICAgICAgICBmb3IgKHdmcV9sdmw9MTsgd2ZxX2x2bDxCQUxfQkNNX1NDSEVEX1dGUV9QUklfTlVNOyB3ZnFfbHZsKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfcG9ydF9xb3MtPnBvbl9jaGFuX3dlaWdodF9jZmdbd2ZxX2x2bF0gPSAyICogcF9wb3J0X3Fvcy0+cG9uX2NoYW5fd2VpZ2h0X2NmZ1t3ZnFfbHZsLTFdOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hhbm5lbCBIUiAobGV2ZWwgMSkKKyAgICAgICAgICoKKyAgICAgICAgICogR2V0IHRoZSBPVE0gcG9ydCBIUiBmb3IgdGhpcyBQT04gY2hhbm5lbC4gVGhlIHJlc3Qgb2YKKyAgICAgICAgICogdGhlIGRvd25zdHJlYW0gc2NoZWR1bGluZyBoaWVyYXJjaHkgaXMgYXR0YWNoZWQgdG8gdGhpcworICAgICAgICAgKiBIUi4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlICdCQ01fQ09TUV9HUE9SVF9SRVBMQUNFJyBmbGFnIGlzIHBhc3NlZCBpbnRvIHRoZQorICAgICAgICAgKiBiY21fY29zcV9ncG9ydF9hZGQoKSBmdW5jdGlvbiBjYWxsLCB3aGljaCBjaGFuZ2VzIHRoZQorICAgICAgICAgKiBzY2hlZHVsaW5nIHR5cGUgZnJvbSB0aGUgZGVmYXVsdCBtb2RlIHRvIGEgU0lOR0xFX1dGUQorICAgICAgICAgKiBtb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgQkNNX0NPU1FfR1BPUlRfRTJFX1BPUlRfU0VUKHBfcG9ydF9xb3MtPnBvbl9jaGFuX3NjaGVkdWxlciwgcHBfcG9ydCk7CisgICAgICAgIGZsYWdzID0gQkNNX0NPU1FfR1BPUlRfU0NIRURVTEVSIHwgQkNNX0NPU1FfR1BPUlRfU0NIRURVTEVSX0hSX1NJTkdMRV9XRlEgfCBCQ01fQ09TUV9HUE9SVF9SRVBMQUNFOworICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9hZGQodW5pdCwgcHBfcG9ydCwgMSwgZmxhZ3MsICZwX3BvcnRfcW9zLT5wb25fY2hhbl9zY2hlZHVsZXIpOworICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9hZGQgKHdpdGggUkVQTEFDRSkgZm9yIFBPTiBDaGFubmVsIEhSIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgY2hhbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCwgcG9uX2NoYW4pOworCisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfYWRkICh3aXRoIFJFUExBQ0UpIGZvciBQT04gQ2hhbm5lbCBIUiAtIGdwb3J0IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBfcG9ydF9xb3MtPnBvbl9jaGFuX3NjaGVkdWxlcik7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogU3RyaWN0IFByaW9yaXR5IEhSIChsZXZlbCAyKQorICAgICAgICAgKgorICAgICAgICAgKiBTZXQgdXAgYSBTdHJpY3QgUHJpb3JpdHkgSFIgc2NoZWR1bGVyIGZvciBFSVIgKE1BWCBSYXRlKQorICAgICAgICAgKiBmbG93cy4gVGhpcyBTRSBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgUE9OIGNoYW5uZWwgaXMgcnVubmluZworICAgICAgICAgKiBpbiBTdHJpY3QgUHJpb3JpdHkgbW9kZS4KKyAgICAgICAgICovCisKKyAgICAgICAgLyogQ3JlYXRlIHRoZSBzY2hlZHVsZXIgb2JqZWN0ICovCisgICAgICAgIGZsYWdzID0gQkNNX0NPU1FfR1BPUlRfU0NIRURVTEVSIHwgQkNNX0NPU1FfR1BPUlRfU0NIRURVTEVSX0hSX0VOSEFOQ0VEOworICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9hZGQodW5pdCwgMCwgMSwgZmxhZ3MsICZwX3BvcnRfcW9zLT5zcF9zY2hlZHVsZXIpOworICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9hZGQgZm9yIE1BWCBSYXRlIFNQIEhSIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgY2hhbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCwgcG9uX2NoYW4pOworCisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfYWRkIGZvciBNQVggUmF0ZSBTUCBIUiAtIGdwb3J0IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBfcG9ydF9xb3MtPnNwX3NjaGVkdWxlcik7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb25maWd1cmUgdGhlIHByaW9yaXR5IGZvciB0aGlzIHNjaGVkdWxlci4gVGhlIFNQIFNFIGlzCisgICAgICAgICAqIGF0dGFjaGVkIGF0IHByaW9yaXR5ICcyJy4KKyAgICAgICAgICovCisgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X3NjaGVkX3NldCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X3Fvcy0+c3Bfc2NoZWR1bGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9DT1NRX1NQMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9zY2hlZF9zZXQgZm9yIE1BWCBSYXRlIFNQIEhSIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgY2hhbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCwgcG9uX2NoYW4pOworCisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEF0dGFjaCB0aGUgU1Agc2NoZWR1bGVyIHRvIHRoZSBDaGFubmVsIEhSLiAqLworICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9hdHRhY2godW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9xb3MtPnBvbl9jaGFuX3NjaGVkdWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9xb3MtPnNwX3NjaGVkdWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9hdHRhY2ggZm9yIE1BWCBSYXRlIFNQIEhSIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgY2hhbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCwgcG9uX2NoYW4pOworCisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdGUSAobGV2ZWwgMikKKyAgICAgICAgICoKKyAgICAgICAgICogQ3JlYXRlIEZRIHNjaGVkdWxpbmcgZWxlbWVudHMgYW5kIGF0dGFjaCBvbmUgdG8gZWFjaAorICAgICAgICAgKiBXRlEgbGV2ZWwuIFRoaXMgaXMgdXNlZCB0byBzY2hlZHVsZSBFSVIgKE1BWCBSYXRlKQorICAgICAgICAgKiBmbG93cyB3aGVuIHRoZSBQT04gY2hhbm5lbCBpcyBydW5uaW5nIGluIFdGUSBtb2RlLgorICAgICAgICAgKi8KKworICAgICAgICAvKiBDcmVhdGUgYSBGUSBzY2hlZHVsZXIgZm9yIGVhY2ggV0ZRIGxldmVsICovCisgICAgICAgIGZvciAod2ZxX2x2bD0wOyB3ZnFfbHZsPEJBTF9CQ01fU0NIRURfV0ZRX1BSSV9OVU07IHdmcV9sdmwrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBzY2hlZHVsZXIgb2JqZWN0ICovCisgICAgICAgICAgICBmbGFncyA9IEJDTV9DT1NRX0dQT1JUX1NDSEVEVUxFUiB8IEJDTV9DT1NRX0dQT1JUX1NDSEVEVUxFUl9GUTsKKyAgICAgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2FkZCh1bml0LCAwLCAxLCBmbGFncywgJnBfcG9ydF9xb3MtPndmcV9zY2hlZHVsZXJbd2ZxX2x2bF0pOworICAgICAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IGJjbV9jb3NxX2dwb3J0X2FkZCBmb3IgTUFYIFJhdGUgV0ZRIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgY2hhbiAldSB3ZnFfbHZsICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCwgcG9uX2NoYW4sIHdmcV9sdmwpOworCisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb25maWd1cmUgdGhlIHByaW9yaXR5IGZvciB0aGlzIFNFLiAoV0ZRIGlzIFNQMyBvbgorICAgICAgICAgICAgICogdGhlIENoYW5uZWwgSFIuKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9zY2hlZF9zZXQodW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfcW9zLT53ZnFfc2NoZWR1bGVyW3dmcV9sdmxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0NPU1FfU1AzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9xb3MtPnBvbl9jaGFuX3dlaWdodF9jZmdbd2ZxX2x2bF0pOworICAgICAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IGJjbV9jb3NxX2dwb3J0X3NjaGVkX3NldCBmb3IgTUFYIFJhdGUgV0ZRIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgY2hhbiAldSB3ZnFfbHZsICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCwgcG9uX2NoYW4sIHdmcV9sdmwpOworCisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiAgQXR0YWNoIHRoZSBGUSBzY2hlZHVsZXIgdGhlIFdGUSBvbiB0aGUgQ2hhbm5lbCBIUi4gKi8KKyAgICAgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2F0dGFjaCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9xb3MtPnBvbl9jaGFuX3NjaGVkdWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfcW9zLT53ZnFfc2NoZWR1bGVyW3dmcV9sdmxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IGJjbV9jb3NxX2dwb3J0X2F0dGFjaCBmb3IgTUFYIFJhdGUgV0ZRIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgY2hhbiAldSB3ZnFfbHZsICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCwgcG9uX2NoYW4sIHdmcV9sdmwpOworCisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IHdoaWxlKDApOyAvKiBFeGNlcHRpb24gQmxvY2sgLSBFbmQgKi8KKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQ2xlYW4gdXAgUW9TIGZvciBhIFBPTi1zaWRlIHBvcnQKKyAqCisgKiBFYWNoIFNFIG11c3QgYmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIGhpZXJhcmNoeSBiZWZvcmUgZnJlZWluZyB0aGUKKyAqIFNFLgorICoKKyAqIEBwYXJhbSB1bml0ICAgICAgU0RLIHVuaXQgbnVtYmVyCisgKiBAcGFyYW0gcG9uX3BvcnQgIFBPTiBwb3J0IG51bWJlcgorICogQHBhcmFtIHBvbl9jaGFuICAgUE9OIGNoYW5uZWwgKDEwRyB2cy4gMUcpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiYWxfc3dfZHBwX3BvcnRfcW9zX2NsZWFudXAoaW50IHVuaXQsIGJjbV9wb3J0X3QgcG9uX3BvcnQsIGJhbF9zd19kcHBfcW9zX3NjaGVkX3Bvbl9jaGFuIHBvbl9jaGFuKQoreworICAgIGJjbV9lcnJvcl90IHNka19yYyA9IEJDTV9FX05PTkU7CisgICAgYmFsX3N3X2RwcF9wb3J0X3Fvc19jZmcgKnBfcG9ydF9xb3MgPSBOVUxMOworICAgIGludCB3ZnFfbHZsOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihwb25fcG9ydCA+PSBCQUxfQkNNX1FPU19OVU1fUE9OX1BPUlRTKTsKKyAgICBCVUdfT04ocG9uX2NoYW4gID49IEJBTF9CQ01fU0NIRURfUE9OX0NIQU5fTlVNKTsKKworICAgIC8qIFJldHJpZXZlIHRoZSBRb1MgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwb3J0ICovCisgICAgcF9wb3J0X3FvcyA9ICZncF9iYWxfYmNtX3Fvc19jZmctPnBvbltwb25fcG9ydF1bcG9uX2NoYW5dOworCisgICAgLyoKKyAgICAgKiBDbGVhbiB1cCBXRlEKKyAgICAgKi8KKyAgICBmb3IgKHdmcV9sdmw9MDsgd2ZxX2x2bDxCQUxfQkNNX1NDSEVEX1dGUV9QUklfTlVNOyB3ZnFfbHZsKyspCisgICAgeworICAgICAgICAvKiBEaXNjb25uZWN0IHRoZSBzY2hlZHVsZXIgZnJvbSB0aGUgb25lIGFib3ZlICovCisgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2RldGFjaCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X3Fvcy0+cG9uX2NoYW5fc2NoZWR1bGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X3Fvcy0+d2ZxX3NjaGVkdWxlclt3ZnFfbHZsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9kZXRhY2ggZm9yIE1BWCBSYXRlIFdGUSBmYWlsZWQgd2l0aCAlcyBmb3IgcG9uICV1IHBvbl9jaGFuICV1IHdmcV9sdmwgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcG9uX3BvcnQsIHBvbl9jaGFuLCB3ZnFfbHZsKTsKKworICAgICAgICAgICAgLyogQ29udGludWUgY2xlYW51cCwgZG9uJ3QgaGFsdCBwcm9jZXNzaW5nIGJlY2F1c2Ugb2YgdGhpcyBlcnJvciAqLworICAgICAgICB9CisKKyAgICAgICAgc2RrX3JjID0gYmNtX2Nvc3FfZ3BvcnRfZGVsZXRlKHVuaXQsIHBfcG9ydF9xb3MtPndmcV9zY2hlZHVsZXJbd2ZxX2x2bF0pOworICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9kZWxldGUgZm9yIE1BWCBSYXRlIFdGUSBmYWlsZWQgd2l0aCAlcyBmb3IgcG9uICV1IHBvbl9jaGFuICV1IHdmcV9sdmwgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcG9uX3BvcnQsIHBvbl9jaGFuLCB3ZnFfbHZsKTsKKworICAgICAgICAgICAgLyogQ29udGludWUgY2xlYW51cCwgZG9uJ3QgaGFsdCBwcm9jZXNzaW5nIGJlY2F1c2Ugb2YgdGhpcyBlcnJvciAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGVhbiB1cCBTUCBIUgorICAgICAqLworCisgICAgLyogRGlzY29ubmVjdCB0aGUgc2NoZWR1bGVyIGZyb20gdGhlIG9uZSBhYm92ZSAqLworICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2RldGFjaCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfcW9zLT5wb25fY2hhbl9zY2hlZHVsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9xb3MtPnNwX3NjaGVkdWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9kZXRhY2ggZm9yIE1BWCBSYXRlIFNQIEhSIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgcG9uX2NoYW4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwb25fcG9ydCwgcG9uX2NoYW4pOworCisgICAgICAgIC8qIENvbnRpbnVlIGNsZWFudXAsIGRvbid0IGhhbHQgcHJvY2Vzc2luZyBiZWNhdXNlIG9mIHRoaXMgZXJyb3IgKi8KKyAgICB9CisKKyAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9kZWxldGUodW5pdCwgcF9wb3J0X3Fvcy0+c3Bfc2NoZWR1bGVyKTsKKyAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgeworICAgICAgICAvKiBFcnJvciAqLworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIiVzKCk6IGJjbV9jb3NxX2dwb3J0X2RlbGV0ZSBmb3IgTUFYIFJhdGUgU1AgSFIgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldSBwb25fY2hhbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYyksIHBvbl9wb3J0LCBwb25fY2hhbik7CisKKyAgICAgICAgLyogQ29udGludWUgY2xlYW51cCwgZG9uJ3QgaGFsdCBwcm9jZXNzaW5nIGJlY2F1c2Ugb2YgdGhpcyBlcnJvciAqLworICAgIH0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgYSByYXRlIHNoYXBlciBhbmQgbWF4aW11bSBidXJzdCBzaXplIGZvciBhIFBPTiBMaW5rCisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSByYXRlIGFuZCBtYXhpbXVtIGJ1cnN0IHNpemUgZm9yIHRoZQorICogc3BlY2lmaWVkIHNoYXBlciAoTUlOIFJhdGUgdnMuIE1BWCBSYXRlKSBmb3IgYSBQT04gTGluayAoTExJRCkuCisgKgorICogQHBhcmFtIHVuaXQgICAgICAgICBTREsgdW5pdCBudW1iZXIKKyAqIEBwYXJhbSBwX3NlcnZpY2VfY2ZnICBQb2ludGVyIHRvIHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZW50cnkKKyAqIEBwYXJhbSBzbGFfdHlwZSAgICAgIFNoYXBlciB0eXBlIChNSU4gdnMuIE1BWCkKKyAqIEBwYXJhbSBiYW5kd2lkdGggICAgRGF0YSByYXRlIGluIEticHMgKGkuZS4sIHRva2VuIGJ1Y2tldCBmaWxsIHJhdGUpCisgKiBAcGFyYW0gbWF4X2J1cnN0ICAgICBNYXhpbXVtIGJ1cnN0IHNpemUgaW4gYnl0ZXMgKGkuZS4sIHRva2VuIGJ1Y2tldCBzaXplKQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiYWxfc3dfZHBwX3Fvc19zZXRfbGxpZF9iYW5kd2lkdGgoaW50IHVuaXQsIGJhbF9zd19kcHBfcW9zX3NlcnZpY2VfY2ZnICpwX3NlcnZpY2VfY2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsX3N3X2RwcF9xb3Nfc2NoZWRfc2xhX3R5cGUgc2xhX3R5cGUsIHVpbnQzMl90IGJhbmR3aWR0aCwgdWludDMyX3QgbWF4X2J1cnN0KQoreworICAgIGJjbV9lcnJvcl90IHNka19yYyA9IEJDTV9FX05PTkU7CisgICAgYmNtX2dwb3J0X3Qgc2NoZWR1bGVyX2dwb3J0OworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihwX3NlcnZpY2VfY2ZnID09IE5VTEwpOworCisgICAgLyogR2V0IHRoZSBzY2hlZHVsZXIgZ3BvcnQgdGhhdCB0aGUgVk9RcyBhcmUgYXR0YWNoZWQgdG8gKE1JTiB2cy4gTUFYKSAqLworICAgIGlmIChzbGFfdHlwZSA9PSBCQUxfQkNNX1NDSEVEX1NMQV9NSU5fUkFURSkKKyAgICB7CisgICAgICAgIHNjaGVkdWxlcl9ncG9ydCA9IHBfc2VydmljZV9jZmctPmRzX3Fvcy5taW4uc2NoZWR1bGVyX2dwb3J0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzY2hlZHVsZXJfZ3BvcnQgPSBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWF4LnNjaGVkdWxlcl9ncG9ydDsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIFJhdGUgLSBkcmFpbiByYXRlICovCisgICAgc2RrX3JjID0gYmNtX2Nvc3FfZ3BvcnRfYmFuZHdpZHRoX3NldCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVyX2dwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgeworICAgICAgICAvKiBFcnJvciAqLworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIiVzKCk6IGJjbV9jb3NxX2dwb3J0X2JhbmR3aWR0aF9zZXQgZmFpbGVkIHdpdGggJXMgZm9yICVzIGdwb3J0IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCAoc2xhX3R5cGUgPT0gQkFMX0JDTV9TQ0hFRF9TTEFfTUlOX1JBVEUpPyAiU0xBX01JTl9SQVRFIjoiU0xBX01BWF9SQVRFIiwgc2NoZWR1bGVyX2dwb3J0KTsKKworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIiVzKCkgc2V0IGdwb3J0IDB4JXggd2l0aCAlcyBvZiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzY2hlZHVsZXJfZ3BvcnQsKHNsYV90eXBlID09IEJBTF9CQ01fU0NIRURfU0xBX01JTl9SQVRFKT8gIlNMQV9NSU5fUkFURSI6IlNMQV9NQVhfUkFURSIsIGJhbmR3aWR0aCk7CisgICAgfQorCisgICAgLyogIFNldCB0aGUgQnVyc3QgLSBidWNrZXQgc2l6ZSB0aGF0IGhvbGQgdGhlIGluY29taW5nIGZyYW1lcyAqLworICAgIHNka19yYyA9IGJjbV9jb3NxX2NvbnRyb2xfc2V0KHVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVyX2dwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtQ29zcUNvbnRyb2xCYW5kd2lkdGhCdXJzdE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYnVyc3QpOworICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICB7CisgICAgICAgIC8qIEVycm9yICovCisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfY29udHJvbF9zZXQgZm9yIE1heEJ1cnN0IGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIENvbmZpZ3VyZSBkb3duc3RyZWFtIFFvUyBmb3IgYSBQT04gTGluayAoTExJRCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgZG93bnN0cmVhbSBRb1MgZm9yIGEgUE9OIExpbmsgKExMSUQpLAorICogd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgYSB0dW5uZWwgSUQgaW4gQVJBRC4gUGxlYXNlIHJlZmVyIHRvIHRoZQorICogIlNDSEVEVUxFUiBNT0RFTCIgZGlhZ3JhbSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4gVGhpcyBmdW5jdGlvbgorICogY29uZmlndXJlcyB0aGUgUE9OIExpbmsgU0UgYW5kIHF1ZXVlcyAoVk9RICsgVk9RIENvbm5lY3RvcikgZm9yIHRoZQorICogTGluay4gVGhlIFBPTiBMaW5rIHNjaGVkdWxlciBwcm9jZXNzZXMgcXVldWVzIHVzaW5nIHN0cmljdAorICogcHJpb3JpdHkuIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBmb3VyIHF1ZXVlcyBmb3IgdGhlIExpbmssIHdoaWNoCisgKiBpcyB0aGUgc21hbGxlc3QgbnVtYmVyIG9mIHF1ZXVlcyBwZXIgTExJRCBzdXBwb3J0ZWQgYnkKKyAqIEFSQUQuIEhvd2V2ZXIsIHRoZSBCQUwgQkNNIEFwcCBjdXJyZW50bHkgb25seSBtYWtlcyB1c2Ugb2YgYSBzaW5nbGUKKyAqIHF1ZXVlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBNSU4gKENJUikgYW5kIE1BWCAoRUlSKSByYXRlIHNoYXBlcnMuIElmCisgKiB0aGUgTUlOIHJhdGUgaXMgZGlzYWJsZWQgKGkuZS4sIGJhbmR3aWR0aCBjb25maWd1cmVkIHdpdGggYSB2YWx1ZQorICogb2YgJzAnIGticHMpLCB0aGUgc2hhcGVyIGlzIG5vdCAiY29ubmVjdGVkIiB0byB0aGUgcG9ydCdzIE1JTiBSYXRlCisgKiBTRS4KKyAqCisgKiBAcGFyYW0gdW5pdCAgICAgICAgIFNESyB1bml0IG51bWJlcgorICogQHBhcmFtIHBfc2VydmljZV9jZmcgIFBvaW50ZXIgdG8gdGhlIHNlcnZpY2UgY29uZmlndXJhdGlvbiBlbnRyeQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiYWxfc3dfZHBwX2xsaWRfcW9zX2NvbmZpZyhpbnQgdW5pdCwgYmFsX3N3X2RwcF9xb3Nfc2VydmljZV9jZmcgKnBfc2VydmljZV9jZmcpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbV9lcnJvcl90IHNka19yYyA9IEJDTV9FX05PTkU7CisgICAgYmFsX3N3X2RwcF9wb3J0X3Fvc19jZmcgKnBfcG9ydF9xb3MgPSBOVUxMOworICAgIGludCBmbGFncyA9IDA7CisgICAgaW50IGNvc3E7CisgICAgYmNtX2Nvc3FfZ3BvcnRfY29ubmVjdGlvbl90IGNvbm5lY3Rpb247CisgICAgYmFsX3N3X2RwcF9xb3Nfc2NoZWRfcG9uX2NoYW4gZHNfcG9uX2NoYW47CisgICAgYmNtX2dwb3J0X3Qgc2NoZWR1bGVyX2dwb3J0OworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihwX3NlcnZpY2VfY2ZnID09IE5VTEwpOworCisgICAgLyogU3RvcmUgdGhlIGRvd25zdHJlYW0gUE9OIHJhdGUsIHdoaWNoIHdpbGwgYmUgdXNlZCBpbiBzZXZlcmFsCisgICAgICogcGxhY2VzIHRocm91Z2hvdXQgdGhpcyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBkc19wb25fY2hhbiA9IHBfc2VydmljZV9jZmctPmRzX3Fvcy5wb25fY2hhbjsKKworICAgIC8qIFJldHJpZXZlIHRoZSBRb1MgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwb3J0ICovCisgICAgcF9wb3J0X3FvcyA9ICZncF9iYWxfYmNtX3Fvc19jZmctPnBvbltwX3NlcnZpY2VfY2ZnLT5wb25fcG9ydF1bZHNfcG9uX2NoYW5dOworCisgICAgZG8gLyogRXhjZXB0aW9uIEJsb2NrIFN0YXJ0ICovCisgICAgeworICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgdm9xIElEIGZyb20gdGhlIGZyZWUgcG9vbCAqLworICAgICAgICBpZiAoZHNfcG9uX2NoYW4gPT0gQkFMX0JDTV9TQ0hFRF9QT05fQ0hBTl8xMEcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gYmFsX3N3X2RwcF9xb3NfYWxsb2NfZmxvd19pZCgmZ3BfYmFsX2JjbV9xb3NfY2ZnLT5mbG93X2lkX3Bvb2xfMTBnLCAmcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLnZvcV9mbG93X2lkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gYmFsX3N3X2RwcF9xb3NfYWxsb2NfZmxvd19pZCgmZ3BfYmFsX2JjbV9xb3NfY2ZnLT5mbG93X2lkX3Bvb2xfMWcsICZwX3NlcnZpY2VfY2ZnLT5kc19xb3Mudm9xX2Zsb3dfaWQpOworICAgICAgICB9CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogVW5hYmxlIHRvIGFsbG9jYXRlIHZvcSBJRCBmb3IgcG9uICV1IHRpZCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogSW4gdGhlIEJBTCBCQ00gQXBwLCB0aGUgVk9RIElEIGlzIGVxdWFsIHRvIHRoZSB2b3EgSUQgKi8KKyAgICAgICAgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLnZvcV9pZCA9IHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfZmxvd19pZDsKKworICAgICAgICAvKgorICAgICAgICAgKiBQT04gTGluayBzY2hlZHVsZXIgKGxldmVsIDIpCisgICAgICAgICAqLworICAgICAgICBpZiAocF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1pbi5yYXRlID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ3JlYXRlIGEgY29tcG9zaXRlLCBzdHJpY3QgcHJpb3JpdHkgc2NoZWR1bGVyIGZvciB0aGlzIFBPTgorICAgICAgICAgICAgICogTGluay4gVGhpcyBpcyB1c2VkIHRvIHNjaGVkdWxlIGJldHdlZW4gdGhlIHF1ZXVlcyBhc3NpZ25lZCB0bworICAgICAgICAgICAgICogdGhpcyBQT04gTGluay4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZmxhZ3MgPSBCQ01fQ09TUV9HUE9SVF9TQ0hFRFVMRVIgfCBCQ01fQ09TUV9HUE9SVF9TQ0hFRFVMRVJfQ0xBU1NfTU9ERTFfNFNQIHwgQkNNX0NPU1FfR1BPUlRfQ09NUE9TSVRFOworICAgICAgICAgICAgc2RrX3JjID0gYmNtX2Nvc3FfZ3BvcnRfYWRkKHVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgIC8qIE51bWJlciBvZiBDb1MgbGV2ZWxzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfc2VydmljZV9jZmctPmRzX3Fvcy5taW4uc2NoZWR1bGVyX2dwb3J0KTsKKyAgICAgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9hZGQgZm9yIFBPTiBMaW5rIFNFIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwX3NlcnZpY2VfY2ZnLT5wb25fcG9ydCwgcF9zZXJ2aWNlX2NmZy0+dHVubmVsX2lkKTsKKworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQSBzaW5nbGUgcHJpb3JpdHkgb24gdGhlIENoYW5uZWwgSFIgaGFuZGxlcyBhbGwgTUlOIFJhdGVzIChDSVJzKS4gICovCisgICAgICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9zY2hlZF9zZXQodW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWluLnNjaGVkdWxlcl9ncG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9DT1NRX1NQMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9zY2hlZF9zZXQgZm9yIE1pbiBSYXRlIFNFIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwX3NlcnZpY2VfY2ZnLT5wb25fcG9ydCwgcF9zZXJ2aWNlX2NmZy0+dHVubmVsX2lkKTsKKworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQXR0YWNoIHRoZSBQT04gTGluayBzY2hlZHVsZXIgdG8gdGhlIENoYW5uZWwgSFIuICovCisgICAgICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9hdHRhY2godW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfcW9zLT5wb25fY2hhbl9zY2hlZHVsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1pbi5zY2hlZHVsZXJfZ3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfYXR0YWNoIGZvciBNaW4gUmF0ZSBTRSBmYWlsZWQgd2l0aCAlcyBmb3IgcG9uICV1IHRpZCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNhdmUgdGhlIGdwb3J0IG9mIHRoZSBwYXJlbnQgU0UgKHVzZWQgZm9yIGNsZWFudXApICovCisgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWluLnBhcmVudF9ncG9ydCA9IHBfcG9ydF9xb3MtPnBvbl9jaGFuX3NjaGVkdWxlcjsKKworICAgICAgICAgICAgLyogQ29uZmlndXJlIHRoZSBNSU4gUmF0ZSBzaGFwZXIgKi8KKyAgICAgICAgICAgIHJjID0gYmFsX3N3X2RwcF9xb3Nfc2V0X2xsaWRfYmFuZHdpZHRoKHVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfQkNNX1NDSEVEX1NMQV9NSU5fUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWluLnJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1pbi5idXJzdCk7CisgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBTZXQgTUlOIFJhdGUgc2hhcGVyIGZhaWxlZCBmb3IgcG9uICV1IHRpZCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBfc2VydmljZV9jZmctPnBvbl9wb3J0LCBwX3NlcnZpY2VfY2ZnLT50dW5uZWxfaWQpOworCisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTZXQgdGhlIGdwb3J0IGZvciB0aGUgTUFYIFJhdGUgc2NoZWR1bGVyICovCisgICAgICAgICAgICBCQ01fQ09TUV9HUE9SVF9DT01QT1NJVEVfU0YyX1NFVChwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWF4LnNjaGVkdWxlcl9ncG9ydCwgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1pbi5zY2hlZHVsZXJfZ3BvcnQpOworCisgICAgICAgICAgICAvKiBTZXQgdGhlIHNjaGVkdWxlciBncG9ydCB0aGF0IHRoZSBWT1FzIGFyZSBhdHRhY2hlZCB0byAqLworICAgICAgICAgICAgc2NoZWR1bGVyX2dwb3J0ID0gcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1pbi5zY2hlZHVsZXJfZ3BvcnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIE1BWCBSYXRlIG9ubHkgKGxldmVsIDIpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZsYWdzID0gQkNNX0NPU1FfR1BPUlRfU0NIRURVTEVSIHwgQkNNX0NPU1FfR1BPUlRfU0NIRURVTEVSX0NMQVNTX01PREUxXzRTUDsKKyAgICAgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2FkZCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAvKiBOdW1iZXIgb2YgQ29TIGxldmVscyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWF4LnNjaGVkdWxlcl9ncG9ydCk7CisgICAgICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfYWRkIGZvciBQT04gTGluayBTRSBmYWlsZWQgd2l0aCAlcyBmb3IgcG9uICV1IHRpZCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNldCB0aGUgc2NoZWR1bGVyIGdwb3J0IHRoYXQgdGhlIFZPUXMgYXJlIGF0dGFjaGVkIHRvICovCisgICAgICAgICAgICBzY2hlZHVsZXJfZ3BvcnQgPSBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWF4LnNjaGVkdWxlcl9ncG9ydDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSB0eXBlIG9mIE1BWCBSYXRlIHNjaGVkdWxpbmcgZGVwZW5kcyBvbiB3aGF0IHNjaGVkdWxpbmcKKyAgICAgICAgICogbW9kZSBpcyBjb25maWd1cmVkIG9uIHRoZSBQT04gY2hhbm5lbCAoU1AgdnMuIFdGUSkuCisgICAgICAgICAqLworICAgICAgICBpZiAocF9wb3J0X3Fvcy0+c2NoZWRfdHlwZSA9PSBCQUxfQkNNX1NDSEVEX1RZUEVfU1ApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgU3RyaWN0IFByaW9yaXR5IChTUCkgc2NoZWR1bGluZyBpcyBiZWluZyB1c2VkCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgLyogU2V0IHRoZSBwcmlvcml0eSB1c2VkIGZvciB0aGUgYXR0YWNobWVudCB0byB0aGUgU1AgSFIgKi8KKyAgICAgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X3NjaGVkX3NldCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9jZmctPmRzX3Fvcy5tYXguc2NoZWR1bGVyX2dwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0NPU1FfU1AwICsgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1heC50cmFmZmljX3ByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IGJjbV9jb3NxX2dwb3J0X3NjaGVkX3NldCBmb3IgTWF4IFJhdGUgU0UgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldSB0aWQgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYyksIHBfc2VydmljZV9jZmctPnBvbl9wb3J0LCBwX3NlcnZpY2VfY2ZnLT50dW5uZWxfaWQpOworCisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBdHRhY2ggdGhlIFBPTiBMaW5rIHNjaGVkdWxlciB0byB0aGUgU1AgSFIuICovCisgICAgICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9hdHRhY2godW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfcW9zLT5zcF9zY2hlZHVsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1heC5zY2hlZHVsZXJfZ3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfYXR0YWNoIGZvciBNYXggUmF0ZSBTRSBmYWlsZWQgd2l0aCAlcyBmb3IgcG9uICV1IHRpZCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNhdmUgdGhlIGdwb3J0IG9mIHRoZSBwYXJlbnQgU0UgKHVzZWQgZm9yIGNsZWFudXApICovCisgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWF4LnBhcmVudF9ncG9ydCA9IHBfcG9ydF9xb3MtPnNwX3NjaGVkdWxlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgV2VpZ2h0ZWQgRmFpciBRdWV1aW5nIChXRlEpIHNjaGVkdWxpbmcgaXMgYmVpbmcgdXNlZAorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8qIFNldCB0aGUgcHJpb3JpdHkgdXNlZCBmb3IgdGhlIGF0dGFjaG1lbnQgdG8gdGhlIEZRLiAqLworICAgICAgICAgICAgc2RrX3JjID0gYmNtX2Nvc3FfZ3BvcnRfc2NoZWRfc2V0KHVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1heC5zY2hlZHVsZXJfZ3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01fQ09TUV9TUDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfc2NoZWRfc2V0IGZvciBNYXggUmF0ZSBTRSBmYWlsZWQgd2l0aCAlcyBmb3IgcG9uICV1IHRpZCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEF0dGFjaCB0aGUgUE9OIExpbmsgc2NoZWR1bGVyIHRvIHRoZSBGUS4gKi8KKyAgICAgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2F0dGFjaCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9xb3MtPndmcV9zY2hlZHVsZXJbcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1heC50cmFmZmljX3ByaW9yaXR5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWF4LnNjaGVkdWxlcl9ncG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9hdHRhY2ggZm9yIE1heCBSYXRlIFNFIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwX3NlcnZpY2VfY2ZnLT5wb25fcG9ydCwgcF9zZXJ2aWNlX2NmZy0+dHVubmVsX2lkKTsKKworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2F2ZSB0aGUgZ3BvcnQgb2YgdGhlIHBhcmVudCBTRSAodXNlZCBmb3IgY2xlYW51cCkgKi8KKyAgICAgICAgICAgIHBfc2VydmljZV9jZmctPmRzX3Fvcy5tYXgucGFyZW50X2dwb3J0ID0gcF9wb3J0X3Fvcy0+d2ZxX3NjaGVkdWxlcltwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWF4LnRyYWZmaWNfcHJpb3JpdHldOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29uZmlndXJlIHRoZSBNQVggUmF0ZSBzaGFwZXIgKi8KKyAgICAgICAgcmMgPSBiYWxfc3dfZHBwX3Fvc19zZXRfbGxpZF9iYW5kd2lkdGgodW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9jZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfQkNNX1NDSEVEX1NMQV9NQVhfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9jZmctPmRzX3Fvcy5tYXgucmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9jZmctPmRzX3Fvcy5tYXguYnVyc3QpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IFNldCBNQVggUmF0ZSBzaGFwZXIgZmFpbGVkIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwX3NlcnZpY2VfY2ZnLT5wb25fcG9ydCwgcF9zZXJ2aWNlX2NmZy0+dHVubmVsX2lkKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAgQ3JlYXRlIGEgVk9RIGNvbm5lY3RvciAobGV2ZWwgMykKKyAgICAgICAgICovCisKKyAgICAgICAgLyogQ3JlYXRlIHRoZSBWT1EgY29ubmVjdG9yIG9iamVjdCBmb3IgYSBidW5kbGUgb2YgZm91ciBxdWV1ZXMgKi8KKyAgICAgICAgZmxhZ3MgPSBCQ01fQ09TUV9HUE9SVF9WT1FfQ09OTkVDVE9SIHwgQkNNX0NPU1FfR1BPUlRfV0lUSF9JRDsKKyAgICAgICAgQkNNX0NPU1FfR1BPUlRfVk9RX0NPTk5FQ1RPUl9TRVQocF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLnZvcV9jb25uZWN0b3JfZ3BvcnQsIHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfZmxvd19pZCk7CisgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2FkZCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X3Fvcy0+bW9kX2dwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFMX0JDTV9RT1NfUVVFVUVTX1BFUl9MTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLnZvcV9jb25uZWN0b3JfZ3BvcnQpOworICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9hZGQgZm9yIFZPUSBDb25uZWN0b3IgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldSB0aWQgJXUgdm9xIElEICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYyksCisgICAgICAgICAgICAgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT5wb25fcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfZmxvd19pZCk7CisKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IHRoZSB0cmFmZmljIGNsYXNzIGZvciBlYWNoIHF1ZXVlIGFuZCBhdHRhY2ggdGhlIFZPUQorICAgICAgICAgKiBjb25uZWN0b3IgdG8gdGhlIFBPTiBMaW5rIHNjaGVkdWxlci4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoY29zcSA9IDA7IGNvc3EgPCBCQUxfQkNNX1FPU19RVUVVRVNfUEVSX0xMSUQ7IGNvc3ErKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2V0IHRoZSB0cmFmZmljIGNsYXNzIGZvciB0aGUgcXVldWUgKi8KKyAgICAgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X3NjaGVkX3NldCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfY29ubmVjdG9yX2dwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNX0NPU1FfU1AzIC0gY29zcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9zY2hlZF9zZXQgZm9yIFZPUSBDb25uZWN0b3IgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldSB0aWQgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYyksIHBfc2VydmljZV9jZmctPnBvbl9wb3J0LCBwX3NlcnZpY2VfY2ZnLT50dW5uZWxfaWQpOworCisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBdHRhY2ggdGhlIGNvbm5lY3Rpb24gZm9yIGVhY2ggcXVldWUgdG8gdGhlIFBPTiBMaW5rCisgICAgICAgICAgICAgKiBzY2hlZHVsZXIsIGJhc2VkIG9uIHRoZSB0cmFmZmljIGNsYXNzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9hdHRhY2godW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZXJfZ3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLnZvcV9jb25uZWN0b3JfZ3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zcSk7CisgICAgICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfYXR0YWNoIGZvciBWT1EgQ29ubmVjdG9yIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwX3NlcnZpY2VfY2ZnLT5wb25fcG9ydCwgcF9zZXJ2aWNlX2NmZy0+dHVubmVsX2lkKTsKKworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEV4Y2VwdGlvbiBCbG9jayAtIGNoZWNrIGZvciBlcnJvcnMgZnJvbSB0aGUgcHJldmlvdXMgbG9vcCAqLworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIENyZWF0ZSBhIFZPUSAobGV2ZWwgMykKKyAgICAgICAgICovCisgICAgICAgIGZsYWdzID0gQkNNX0NPU1FfR1BPUlRfVUNBU1RfUVVFVUVfR1JPVVAgfCBCQ01fQ09TUV9HUE9SVF9UTV9GTE9XX0lEIHwgQkNNX0NPU1FfR1BPUlRfV0lUSF9JRDsKKyAgICAgICAgQkNNX0dQT1JUX1VOSUNBU1RfUVVFVUVfR1JPVVBfU0VUKHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfZ3BvcnQsIHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfaWQpOworICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9hZGQodW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcG9ydF9xb3MtPm1vZF9ncG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTF9CQ01fUU9TX1FVRVVFU19QRVJfTExJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfZ3BvcnQpOworICAgICAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9hZGQgZm9yIFZPUSBmYWlsZWQgd2l0aCAlcyBmb3Igdm9xIGlkICV1LCB2b3EgZ3BvcnQgMHgleCwgcG9uICV1IHRpZCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwX3NlcnZpY2VfY2ZnLT5kc19xb3Mudm9xX2lkLCBwX3NlcnZpY2VfY2ZnLT5kc19xb3Mudm9xX2dwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIFFBWCBub3Qgc3VwcG9ydCBwZXIgUXVldWUgY29tcGVuc2F0aW9uICAqLworI2lmbmRlZiBRQVhfU1dJVENICisgICAgICAgLyogU3RhcnQgLSBoZWFkZXIgYWRqdXN0ICovCisgICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJZiBuZWNlc3NhcnksIGFkanVzdCB0aGUgcGFja2V0IGhlYWRlciBvdmVyaGVhZCB0byBtYXRjaAorICAgICAgICAgKiB0aGUgY29uZmlndXJlZCB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIGludDMyX3QgdmFsID0gMDsKKyAgICAgICAgaW50MzJfdCBjZmdfZHBwX2hkcl9zaXplID0gMDsKKworICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIGV4cGVjdGVkIERQUCBoZWFkZXIgc2l6ZSwgd2hpY2ggZGVwZW5kcyBvbgorICAgICAgICAgKiB3aGV0aGVyIG9yIG5vdCB0cmFmZmljIGlzIHVudGFnZ2VkLCBQQiB0YWdnZWQsIElDVAorICAgICAgICAgKiB0YWdnZWQsIG9yIFNoYXJlZCBWbGFuIHRhZ2dlZC4gSWYgdGhlIHRyYWZmaWMgaXMgdGFnZ2VkCisgICAgICAgICAqIChlaXRoZXIgUEIsIElDVCwgb3IgU2hhcmVkIFZsYW4pLCB0aGVyZSBhcmUgZml2ZSBmZXdlcgorICAgICAgICAgKiBieXRlcyBpbiB0aGUgRFBQIGhlYWRlci4KKyAgICAgICAgICovCisgICAgICAgIGNmZ19kcHBfaGRyX3NpemUgPSBERUZBVUxUX1FPU19EUFBfUEtUX0hEUl9TSVpFOworICAgICAgICBpZiAocF9zZXJ2aWNlX2NmZy0+c2VydmljZV90eXBlICE9IEJBTF9CQ01fU1ZDX1RZUEVfSVApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNmZ19kcHBfaGRyX3NpemUgLT0gQkFMX0JDTV9EUFBfRkxPV0lEX0hEUl9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlIHRyYWZmaWMgaXMgSUNUIHN0YWNrIG1vZGUgb3IgU2hhcmVkIFZsYW4gdGFnZ2VkLCB3ZQorICAgICAgICAgKiBuZWVkIHRvIGV4Y2x1ZGUgdGhlIFZsYW4gdGFnIG92ZXJoZWFkIGZyb20gdGhlIGJhbmR3aWR0aAorICAgICAgICAgKiBjYWxjdWxhdGlvbiAoaS5lLiwgYWRkIGZvdXIgYnl0ZXMgb2Ygb3ZlcmhlYWQpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCgocF9zZXJ2aWNlX2NmZy0+c2VydmljZV90eXBlID09IEJBTF9CQ01fU1ZDX1RZUEVfSUNUKSAvKiYmIChwX3NlcnZpY2VfY2ZnLT5pY3RTdGtUeXBlICE9IEJBTF9CQ01fSUNUX1NUQUNLX1RZUEVfTk9ORSkqLyl8fAorICAgICAgICAgICAgKHBfc2VydmljZV9jZmctPnNlcnZpY2VfdHlwZSA9PSBCQUxfQkNNX1NWQ19UWVBFX1NIVkxBTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNmZ19kcHBfaGRyX3NpemUgKz0gQkFMX0JDTV9RT1NfU0lOR0xFX1ZMQU5fVEFHX0hEUl9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IHRoZSBoZWFkZXIgbGVuZ3RoICovCisgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2NvbnRyb2xfZ2V0KHVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfZ3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbUNvc3FDb250cm9sUGFja2V0TGVuZ3RoQWRqdXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsKTsKKyAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfY29udHJvbF9nZXQgZm9yIGJjbUNvc3FDb250cm9sUGFja2V0TGVuZ3RoQWRqdXN0IGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYyksIHBfc2VydmljZV9jZmctPnBvbl9wb3J0LCBwX3NlcnZpY2VfY2ZnLT50dW5uZWxfaWQpOworCisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIGN1cnJlbnQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHRoZSBjb25maWd1cmVkIGxlbmd0aCwKKyAgICAgICAgICogY29uZmlndXJlIGl0IG5vdy4KKyAgICAgICAgICovCisgICAgICAgIGlmICh2YWwgIT0gY2ZnX2RwcF9oZHJfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRGVidWcgKi8KKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogbW9kaWZ5aW5nIHZhbHVlIG9mIGJjbUNvc3FDb250cm9sUGFja2V0TGVuZ3RoQWRqdXN0IGZyb20gJXUgdG8gJXUgZm9yIHBvbiAldSB0aWQgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjZmdfZHBwX2hkcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT50dW5uZWxfaWQpOworCisgICAgICAgICAgICAvKiBBZGp1c3QgdGhlIHBhY2tldCBsZW5ndGggY2FsY3VsYXRlZCBhYm92ZS4gVGhpcyBoYXMgdG8KKyAgICAgICAgICAgICAqIGJlIGNvbmZpZ3VyZWQgZm9yIGVhY2ggcXVldWUgKGNvc3EpIGluIHRoZSB2b3EKKyAgICAgICAgICAgICAqIGdyb3VwLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGNvc3EgPSAwOyBjb3NxIDwgQkFMX0JDTV9RT1NfUVVFVUVTX1BFUl9MTElEOyBjb3NxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQWRqdXN0IHRoZSBwYWNrZXQgbGVuZ3RoIGNhbGN1bGF0ZWQgYWJvdmUuICovCisgICAgICAgICAgICAgICAgc2RrX3JjID0gYmNtX2Nvc3FfY29udHJvbF9zZXQodW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT5kc19xb3Mudm9xX2dwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtQ29zcUNvbnRyb2xQYWNrZXRMZW5ndGhBZGp1c3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnX2RwcF9oZHJfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9jb250cm9sX3NldCBmb3IgYmNtQ29zcUNvbnRyb2xQYWNrZXRMZW5ndGhBZGp1c3QgZm9yIGNvc3EgJWQgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldSB0aWQgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY29zcSwgYmNtX2Vycm1zZyhzZGtfcmMpLCBwX3NlcnZpY2VfY2ZnLT5wb25fcG9ydCwgcF9zZXJ2aWNlX2NmZy0+dHVubmVsX2lkKTsKKworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogRXhjZXB0aW9uIEJsb2NrIC0gY2hlY2sgZm9yIGVycm9ycyBmcm9tIHRoZSBwcmV2aW91cyBsb29wICovCisgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIH0gLyogRW5kIC0gaGVhZGVyIGFkanVzdG1lbnQgKi8KKyNlbmRpZgorICAgICAgICAvKgorICAgICAgICAgKiAgQ29ubmVjdCBhIFZPUSB0byBhIFZPUSBjb25uZWN0b3IKKyAgICAgICAgICovCisKKyAgICAgICAgLyogQ29ubmVjdCBWT1EgdG8gdGhlIFZPUSBjb25uZWN0b3IgZm9yIHRoZSBpbmdyZXNzIGRpcmVjdGlvbiAqLworICAgICAgICBjb25uZWN0aW9uLmZsYWdzID0gQkNNX0NPU1FfR1BPUlRfQ09OTkVDVElPTl9JTkdSRVNTOworICAgICAgICBjb25uZWN0aW9uLnJlbW90ZV9tb2RpZCA9IGdwX2JhbF9iY21fcW9zX2NmZy0+bW9kX2lkOworICAgICAgICBjb25uZWN0aW9uLnZvcSA9IHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfZ3BvcnQ7CisgICAgICAgIGNvbm5lY3Rpb24udm9xX2Nvbm5lY3RvciA9IHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfY29ubmVjdG9yX2dwb3J0OworCisgICAgICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2Nvbm5lY3Rpb25fc2V0KHVuaXQsICZjb25uZWN0aW9uKTsKKyAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfY29ubmVjdGlvbl9zZXQgZm9yIElOR1JFU1MgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldSB0aWQgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29ubmVjdCBWT1EgdG8gdGhlIFZPUSBjb25uZWN0b3IgZm9yIHRoZSBlZ3Jlc3MgZGlyZWN0aW9uICovCisgICAgICAgIGNvbm5lY3Rpb24uZmxhZ3MgPSBCQ01fQ09TUV9HUE9SVF9DT05ORUNUSU9OX0VHUkVTUzsKKyAgICAgICAgY29ubmVjdGlvbi5yZW1vdGVfbW9kaWQgPSBncF9iYWxfYmNtX3Fvc19jZmctPm1vZF9pZDsKKyAgICAgICAgY29ubmVjdGlvbi52b3EgPSBwX3NlcnZpY2VfY2ZnLT5kc19xb3Mudm9xX2dwb3J0OworICAgICAgICBjb25uZWN0aW9uLnZvcV9jb25uZWN0b3IgPSBwX3NlcnZpY2VfY2ZnLT5kc19xb3Mudm9xX2Nvbm5lY3Rvcl9ncG9ydDsKKworICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9jb25uZWN0aW9uX3NldCh1bml0LCAmY29ubmVjdGlvbik7CisgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IGJjbV9jb3NxX2dwb3J0X2Nvbm5lY3Rpb25fc2V0IGZvciBFR1JFU1MgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldSB0aWQgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9IHdoaWxlKDApOyAvKiBFeGNlcHRpb24gQmxvY2sgLSBFbmQgKi8KKworICAgIC8qIENoZWNrIGZvciBlcnJvcnMgKi8KKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIEZhaWx1cmUgKi8KKyAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIkRvd25zdHJlYW0gUW9TIHNldHVwIGZhaWxlZCBmb3IgcG9uICV1IHRpZCAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgLyogQ2xlYW51cCAqLworICAgICAgICBiYWxfc3dfZHBwX2xsaWRfcW9zX2NsZWFudXAodW5pdCwgcF9zZXJ2aWNlX2NmZyk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBDb25maWd1cmUgZG93bnN0cmVhbSBRb1MgUG9ydCBNYXAgZm9yIGEgUE9OIExpbmsgKExMSUQpCisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIGRvd25zdHJlYW0gUW9TIFBvcnQgTWFwIGZvciBhIFBPTiBMaW5rCisgKiAoTExJRCksIHdoaWNoIGlzIHJlcHJlc2VudGVkIGJ5IGEgdHVubmVsIElEIGluIEFSQUQuIFRoaXMgc2V0cyB0aGUKKyAqIGRlZmF1bHQgdHJhZmZpYyBjbGFzcyAoVEMpIHZhbHVlIGZvciBWTEFOIHRhZ3MgYmVpbmcgaW5zZXJ0ZWQgb3IKKyAqIG1vZGlmaWVkLgorICoKKyAqIEBwYXJhbSB1bml0ICAgICAgICAgU0RLIHVuaXQgbnVtYmVyCisgKiBAcGFyYW0gcF9zZXJ2aWNlX2NmZyAgUG9pbnRlciB0byB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uIGVudHJ5CisgKgorICogQHJldHVybiBiY21vc19lcnJubworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJhbF9zd19kcHBfbGxpZF9zZXRfcW9zX3BvcnRfbWFwKGludCB1bml0LCBiYWxfc3dfZHBwX3Fvc19zZXJ2aWNlX2NmZyAqcF9zZXJ2aWNlX2NmZykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtX2Vycm9yX3Qgc2RrX3JjID0gQkNNX0VfTk9ORTsKKyAgICBpbnQgaTsKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKHBfc2VydmljZV9jZmcgPT0gTlVMTCk7CisKKyAgICAvKiBTZXQgdGhlIFFvUyBQb3J0IE1hcCBmb3IgdGhlIE5OSSBMSUYgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBwX3NlcnZpY2VfY2ZnLT5udW1fbm5pX2dwb3J0OyBpKyspCisgICAgeworICAgICAgICBzZGtfcmMgPSBiY21fcW9zX3BvcnRfbWFwX3NldCh1bml0LCBwX3NlcnZpY2VfY2ZnLT5ubmlfZ3BvcnRbaV0sIGdwX2JhbF9iY21fcW9zX2NmZy0+cW9zX3BvcnRfbWFwX2lkLCAtMSk7CisgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6ICBiY21fcW9zX3BvcnRfbWFwX3NldCBmb3Igbm5pX2luZGV4ICVkIHJldHVybmVkIHdpdGggZmFpbHVyZSBjb2RlICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGksIGJjbV9lcnJtc2coc2RrX3JjKSk7CisKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAYnJpZWYgQ2xlYW4gdXAgUW9TIGZvciBhIFBPTiBMaW5rIChMTElEKQorICoKKyAqIEVhY2ggU0UgYW5kIFZPUSBtdXN0IGJlIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBoaWVyYXJjaHkgYmVmb3JlCisgKiBmcmVlaW5nIHRoZSBTRSBhbmQgVk9RIG9iamVjdHMuCisgKgorICogQHBhcmFtIHVuaXQgICAgICAgICBTREsgdW5pdCBudW1iZXIKKyAqIEBwYXJhbSBwX3NlcnZpY2VfY2ZnICBQb2ludGVyIHRvIHRoZSBzZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZW50cnkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJhbF9zd19kcHBfbGxpZF9xb3NfY2xlYW51cChpbnQgdW5pdCwgYmFsX3N3X2RwcF9xb3Nfc2VydmljZV9jZmcgKnBfc2VydmljZV9jZmcpCit7CisgICAgYmNtX2Vycm9yX3Qgc2RrX3JjID0gQkNNX0VfTk9ORTsKKyAgICBpbnQgY29zcTsKKyAgICBiY21fY29zcV9ncG9ydF9jb25uZWN0aW9uX3QgY29ubmVjdGlvbjsKKyAgICBiYWxfc3dfZHBwX3Fvc19zY2hlZF9wb25fY2hhbiBkc19wb25fY2hhbjsKKyAgICBiY21fZ3BvcnRfdCBzY2hlZHVsZXJfZ3BvcnQ7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKHBfc2VydmljZV9jZmcgPT0gTlVMTCk7CisKKyAgICAvKiBTdG9yZSB0aGUgZG93bnN0cmVhbSBQT04gcmF0ZSwgd2hpY2ggd2lsbCBiZSB1c2VkIGluIHNldmVyYWwKKyAgICAgKiBwbGFjZXMgdGhyb3VnaG91dCB0aGlzIGZ1bmN0aW9uLgorICAgICAqLworICAgIGRzX3Bvbl9jaGFuID0gcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLnBvbl9jaGFuOworCisgICAgLyogR2V0IHRoZSBzY2hlZHVsZXIgZ3BvcnQgdGhhdCB0aGUgVk9RcyBhcmUgYXR0YWNoZWQgdG8gKi8KKyAgICBpZiAocF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1pbi5yYXRlID4gMCkKKyAgICB7CisgICAgICAgIHNjaGVkdWxlcl9ncG9ydCA9IHBfc2VydmljZV9jZmctPmRzX3Fvcy5taW4uc2NoZWR1bGVyX2dwb3J0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzY2hlZHVsZXJfZ3BvcnQgPSBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWF4LnNjaGVkdWxlcl9ncG9ydDsKKyAgICB9CisKKyAgICAvKiBEaXNjb25uZWN0IFZPUSBmcm9tIHRoZSBWT1EgY29ubmVjdG9yIGZvciB0aGUgZWdyZXNzIGRpcmVjdGlvbiAqLworICAgIGNvbm5lY3Rpb24uZmxhZ3MgPSBCQ01fQ09TUV9HUE9SVF9DT05ORUNUSU9OX0VHUkVTUyB8IEJDTV9DT1NRX0dQT1JUX0NPTk5FQ1RJT05fSU5WQUxJRDsKKyAgICBjb25uZWN0aW9uLnJlbW90ZV9tb2RpZCA9IGdwX2JhbF9iY21fcW9zX2NmZy0+bW9kX2lkOworICAgIGNvbm5lY3Rpb24udm9xID0gcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLnZvcV9ncG9ydDsKKyAgICBjb25uZWN0aW9uLnZvcV9jb25uZWN0b3IgPSBwX3NlcnZpY2VfY2ZnLT5kc19xb3Mudm9xX2Nvbm5lY3Rvcl9ncG9ydDsKKworICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2Nvbm5lY3Rpb25fc2V0KHVuaXQsICZjb25uZWN0aW9uKTsKKyAgICBpZiAoc2RrX3JjICE9IEJDTV9FX05PTkUpCisgICAgeworICAgICAgICAvKiBFcnJvciAqLworICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfY29ubmVjdGlvbl9zZXQgZm9yIERJU0NPTk5FQ1QgRUdSRVNTIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgLyogQ29udGludWUgY2xlYW51cCwgZG9uJ3QgaGFsdCBwcm9jZXNzaW5nIGJlY2F1c2Ugb2YgdGhpcyBlcnJvciAqLworICAgIH0KKworICAgIC8qIERpc2Nvbm5lY3QgVk9RIGZyb20gdGhlIFZPUSBjb25uZWN0b3IgZm9yIHRoZSBpbmdyZXNzIGRpcmVjdGlvbiAqLworICAgIGNvbm5lY3Rpb24uZmxhZ3MgPSBCQ01fQ09TUV9HUE9SVF9DT05ORUNUSU9OX0lOR1JFU1MgfCBCQ01fQ09TUV9HUE9SVF9DT05ORUNUSU9OX0lOVkFMSUQ7CisgICAgY29ubmVjdGlvbi5yZW1vdGVfbW9kaWQgPSBncF9iYWxfYmNtX3Fvc19jZmctPm1vZF9pZDsKKyAgICBjb25uZWN0aW9uLnZvcSA9IHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfZ3BvcnQ7CisgICAgY29ubmVjdGlvbi52b3FfY29ubmVjdG9yID0gcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLnZvcV9jb25uZWN0b3JfZ3BvcnQ7CisKKyAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9jb25uZWN0aW9uX3NldCh1bml0LCAmY29ubmVjdGlvbik7CisgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIiVzKCk6IGJjbV9jb3NxX2dwb3J0X2Nvbm5lY3Rpb25fc2V0IGZvciBESVNDT05ORUNUIElOR1JFU1MgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldSB0aWQgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwX3NlcnZpY2VfY2ZnLT5wb25fcG9ydCwgcF9zZXJ2aWNlX2NmZy0+dHVubmVsX2lkKTsKKworICAgICAgICAvKiBDb250aW51ZSBjbGVhbnVwLCBkb24ndCBoYWx0IHByb2Nlc3NpbmcgYmVjYXVzZSBvZiB0aGlzIGVycm9yICovCisgICAgfQorCisgICAgLyogRGVsZXRlIHRoZSBWT1EgKi8KKyAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9kZWxldGUodW5pdCwgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLnZvcV9ncG9ydCk7CisgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIiVzKCk6IGJjbV9jb3NxX2dwb3J0X2RlbGV0ZSBmb3IgVk9RIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgLyogQ29udGludWUgY2xlYW51cCwgZG9uJ3QgaGFsdCBwcm9jZXNzaW5nIGJlY2F1c2Ugb2YgdGhpcyBlcnJvciAqLworICAgIH0KKworICAgIC8qIERpc2Nvbm5lY3QgdGhlIFZPUSBjb25uZWN0b3IgKi8KKyAgICBmb3IgKGNvc3EgPSAwOyBjb3NxIDwgQkFMX0JDTV9RT1NfUVVFVUVTX1BFUl9MTElEOyBjb3NxKyspCisgICAgeworICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9kZXRhY2godW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlcl9ncG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfY29ubmVjdG9yX2dwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zcSk7CisgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogYmNtX2Nvc3FfZ3BvcnRfZGV0YWNoIGZvciBWT1EgQ29ubmVjdG9yIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYyksIHBfc2VydmljZV9jZmctPnBvbl9wb3J0LCBwX3NlcnZpY2VfY2ZnLT50dW5uZWxfaWQpOworCisgICAgICAgICAgICAvKiBDb250aW51ZSBjbGVhbnVwLCBkb24ndCBoYWx0IHByb2Nlc3NpbmcgYmVjYXVzZSBvZiB0aGlzIGVycm9yICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEZWxldGUgdGhlIFZPUSBjb25uZWN0b3IgKi8KKyAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9kZWxldGUodW5pdCwgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLnZvcV9jb25uZWN0b3JfZ3BvcnQpOworICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICB7CisgICAgICAgIC8qIEVycm9yICovCisgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9kZWxldGUgZm9yIFZPUSBDb25uZWN0b3IgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldSB0aWQgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwX3NlcnZpY2VfY2ZnLT5wb25fcG9ydCwgcF9zZXJ2aWNlX2NmZy0+dHVubmVsX2lkKTsKKworICAgICAgICAvKiBDb250aW51ZSBjbGVhbnVwLCBkb24ndCBoYWx0IHByb2Nlc3NpbmcgYmVjYXVzZSBvZiB0aGlzIGVycm9yICovCisgICAgfQorCisgICAgLyogSWYgYSBNSU4gcmF0ZSB3YXMgY29uZmlndXJlZCBmb3IgdGhpcyBQT04gTGluaywgZGlzY29ubmVjdCB0aGUKKyAgICAgKiBQT04gTGluayBzY2hlZHVsZXIgZnJvbSB0aGUgTUlOIFJhdGUgc2NoZWR1bGVyLgorICAgICAqLworICAgIGlmIChwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWluLnJhdGUgPiAwKQorICAgIHsKKyAgICAgICAgLyogRGV0YWNoIGZyb20gdGhlIHBhcmVudCBTRSAqLworICAgICAgICBzZGtfcmMgPSBiY21fY29zcV9ncG9ydF9kZXRhY2godW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2VydmljZV9jZmctPmRzX3Fvcy5taW4ucGFyZW50X2dwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1pbi5zY2hlZHVsZXJfZ3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9kZXRhY2ggZm9yIE1JTiBSYXRlIFNFIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiY21fZXJybXNnKHNka19yYyksIHBfc2VydmljZV9jZmctPnBvbl9wb3J0LCBwX3NlcnZpY2VfY2ZnLT50dW5uZWxfaWQpOworCisgICAgICAgICAgICAvKiBDb250aW51ZSBjbGVhbnVwLCBkb24ndCBoYWx0IHByb2Nlc3NpbmcgYmVjYXVzZSBvZiB0aGlzIGVycm9yICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEaXNjb25uZWN0IHRoZSBQT04gTGluayBzY2hlZHVsZXIgZnJvbSB0aGUgTUFYIFJhdGUgc2NoZWR1bGVyLiAqLworICAgIHNka19yYyA9IGJjbV9jb3NxX2dwb3J0X2RldGFjaCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NlcnZpY2VfY2ZnLT5kc19xb3MubWF4LnBhcmVudF9ncG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zZXJ2aWNlX2NmZy0+ZHNfcW9zLm1heC5zY2hlZHVsZXJfZ3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkKKyAgICB7CisgICAgICAgIC8qIEVycm9yICovCisgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICIlcygpOiBiY21fY29zcV9ncG9ydF9kZXRhY2ggZm9yIE1BWCBSYXRlIFNFIGZhaWxlZCB3aXRoICVzIGZvciBwb24gJXUgdGlkICV1XG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbV9lcnJtc2coc2RrX3JjKSwgcF9zZXJ2aWNlX2NmZy0+cG9uX3BvcnQsIHBfc2VydmljZV9jZmctPnR1bm5lbF9pZCk7CisKKyAgICAgICAgLyogQ29udGludWUgY2xlYW51cCwgZG9uJ3QgaGFsdCBwcm9jZXNzaW5nIGJlY2F1c2Ugb2YgdGhpcyBlcnJvciAqLworICAgIH0KKworICAgIC8qIERlbGV0ZSB0aGUgUE9OIExpbmsgc2NoZWR1bGVyICovCisgICAgc2RrX3JjID0gYmNtX2Nvc3FfZ3BvcnRfZGVsZXRlKHVuaXQsIHNjaGVkdWxlcl9ncG9ydCk7CisgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICAgLyogRXJyb3IgKi8KKyAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIiVzKCk6IGJjbV9jb3NxX2dwb3J0X2RlbGV0ZSBmb3IgUE9OIExpbmsgU0UgZmFpbGVkIHdpdGggJXMgZm9yIHBvbiAldSB0aWQgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYmNtX2Vycm1zZyhzZGtfcmMpLCBwX3NlcnZpY2VfY2ZnLT5wb25fcG9ydCwgcF9zZXJ2aWNlX2NmZy0+dHVubmVsX2lkKTsKKworICAgICAgICAvKiBDb250aW51ZSBjbGVhbnVwLCBkb24ndCBoYWx0IHByb2Nlc3NpbmcgYmVjYXVzZSBvZiB0aGlzIGVycm9yICovCisgICAgfQorCisgICAgLyogRnJlZSB0aGUgdm9xIElEIHRvIHRoZSBmcmVlIHBvb2wgKi8KKyAgICBpZiAoZHNfcG9uX2NoYW4gPT0gQkFMX0JDTV9TQ0hFRF9QT05fQ0hBTl8xMEcpCisgICAgeworICAgICAgICBiYWxfc3dfZHBwX3Fvc19mcmVlX2Zsb3dfaWQoJmdwX2JhbF9iY21fcW9zX2NmZy0+Zmxvd19pZF9wb29sXzEwZywgJnBfc2VydmljZV9jZmctPmRzX3Fvcy52b3FfZmxvd19pZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJhbF9zd19kcHBfcW9zX2ZyZWVfZmxvd19pZCgmZ3BfYmFsX2JjbV9xb3NfY2ZnLT5mbG93X2lkX3Bvb2xfMWcsICZwX3NlcnZpY2VfY2ZnLT5kc19xb3Mudm9xX2Zsb3dfaWQpOworICAgIH0KK30KKworLyoqCisgKiBAYnJpZWYgQ2xlYXIgc3RhdGlzdGljcyBmb3IgYSBWT1EKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xlYXIgVk9RIGNvdW50ZXJzCisgKgorICogQHBhcmFtIHVuaXQgICAgICAgU0RLIHVuaXQgbnVtYmVyCisgKiBAcGFyYW0gZ3BvcnQgICAgICBWT1EgZ3BvcnQgUE9OIHBvcnQgbnVtYmVyCisgKgorICovCit2b2lkIGJhbF9zd19kcHBfcW9zX2NsZWFyX3ZvcV9zdGF0cyhpbnQgdW5pdCwgYmNtX2dwb3J0X3QgZ3BvcnQpCit7CisgICAgaW50IGNvc3E7CisKKyAgICAvKiBDbGVhciBhbGwgVk9RIGNvdW50ZXJzIGZvciB0aGUgVk9RIGdyb3VwICovCisgICAgZm9yIChjb3NxID0gMDsgY29zcSA8IEJBTF9CQ01fUU9TX1FVRVVFU19QRVJfTExJRDsgY29zcSsrKQorICAgIHsKKyAgICAgICAgYmNtX2Nvc3FfZ3BvcnRfc3RhdF9zZXQodW5pdCwgZ3BvcnQsIGNvc3EsIGJjbUNvc3FHcG9ydFJlY2VpdmVkQnl0ZXMsIDApOworICAgICAgICBiY21fY29zcV9ncG9ydF9zdGF0X3NldCh1bml0LCBncG9ydCwgY29zcSwgYmNtQ29zcUdwb3J0UmVjZWl2ZWRQa3RzLCAwKTsKKyAgICAgICAgYmNtX2Nvc3FfZ3BvcnRfc3RhdF9zZXQodW5pdCwgZ3BvcnQsIGNvc3EsIGJjbUNvc3FHcG9ydEVucXVldWVkQnl0ZXMsIDApOworICAgICAgICBiY21fY29zcV9ncG9ydF9zdGF0X3NldCh1bml0LCBncG9ydCwgY29zcSwgYmNtQ29zcUdwb3J0RW5xdWV1ZWRQa3RzLCAwKTsKKyAgICAgICAgYmNtX2Nvc3FfZ3BvcnRfc3RhdF9zZXQodW5pdCwgZ3BvcnQsIGNvc3EsIGJjbUNvc3FHcG9ydERyb3BwZWRCeXRlcywgMCk7CisgICAgICAgIGJjbV9jb3NxX2dwb3J0X3N0YXRfc2V0KHVuaXQsIGdwb3J0LCBjb3NxLCBiY21Db3NxR3BvcnREcm9wcGVkUGt0cywgMCk7CisgICAgfQorfQorCisvKioKKyAqIEBicmllZiBEaXNwbGF5IHRoZSBxb3MgY29uZmlndXJhdGlvbiBmb3IgZWFjaCBvbiB0aGUgY29uc29sZSAoc3Rkb3V0KQorICovCit2b2lkIGJhbF9zd19kcHBfcHJpbnRfYWxsX3BvcnRfcW9zKGludCB1bml0KQoreworICAgIGJhbF9zd19kcHBfcG9ydF9xb3NfY2ZnICpwX3BvcnRfcW9zID0gTlVMTDsKKyAgICB1aW50OF90IHBvcnRfbnVtOworICAgIHVpbnQ4X3QgcG9uX2NoYW47CisgICAgYmNtX2dwb3J0X3QgZTJlX3Bvbl9ncG9ydDsKKyAgICBiY21fZ3BvcnRfdCBlMmVfcGFyZW50X2dwb3J0OworICAgIHVpbnQzMl90IG1pbiwgZmxhZ3M7CisgICAgdWludDMyX3QgYmFuZHdpZHRoOworICAgIGludDMyX3QgbWF4X2J1cnN0OworICAgIGludDMyX3QgbW9kZTsKKyAgICBpbnQzMl90IHdlaWdodDsKKyAgICB1aW50OF90IHdmcV9sdmw7CisKKyAgICAvKiBEaXNwbGF5IGhlYWRlciAqLworICAgIHByaW50ZigiUG9ydFxcQ2hhblx0Z3BvcnRcdFx0UmF0ZSAoa2JwcylcdE1heEJ1cnN0IChieXRlcylcdFdlaWdodFxuIik7CisgICAgcHJpbnRmKCItLS0tLS0tLS1cdC0tLS0tXHRcdC0tLS0tLS0tLS0tXHQtLS0tLS0tLS0tLS0tLS0tXHQtLS0tLS1cbiIpOworCisgICAgZm9yIChwb3J0X251bT1CQUxfUE9OX1BPUlRfU1RBUlQ7IHBvcnRfbnVtPD1CQUxfUE9OX1BPUlRfRU5EOyBwb3J0X251bSsrKQorICAgIHsKKyAgICAgICAgLyogRGlzcGxheSBQb3J0IGluZm8gKi8KKworCisgICAgICAgIEJDTV9DT1NRX0dQT1JUX0UyRV9QT1JUX1NFVChlMmVfcG9uX2dwb3J0LCBwb3J0X251bSk7CisKKyAgICAgICAgaWYgKEJDTV9FX05PTkUgPT0gYmNtX2ZhYnJpY19wb3J0X2dldCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUyZV9wb25fZ3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZTJlX3BhcmVudF9ncG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhbmR3aWR0aCA9IDA7CisgICAgICAgICAgICBtYXhfYnVyc3QgPSAwOworICAgICAgICAgICAgd2VpZ2h0ID0gMDsKKworICAgICAgICAgICAgYmNtX2Nvc3FfZ3BvcnRfYmFuZHdpZHRoX2dldCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMmVfcGFyZW50X2dwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFuZHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworCisgICAgICAgICAgICBwcmludGYoIlBvcnQgJXVcdDB4JTA4WFx0JTExdVx0JTE2ZFx0JTZkXG4iLAorICAgICAgICAgICAgICAgICAgIHBvcnRfbnVtLAorICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgYmFuZHdpZHRoLAorICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIERpc3BsYXkgUE9OIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLworICAgICAgICBmb3IgKHBvbl9jaGFuID0gMDsgcG9uX2NoYW4gPCBCQUxfQkNNX1NDSEVEX1BPTl9DSEFOX05VTTsgcG9uX2NoYW4rKykKKyAgICAgICAgeworICAgICAgICAgICAgcF9wb3J0X3FvcyA9ICZncF9iYWxfYmNtX3Fvc19jZmctPnBvbltwb3J0X251bV1bcG9uX2NoYW5dOworCisgICAgICAgICAgICBiYW5kd2lkdGggPSAwOworICAgICAgICAgICAgbWF4X2J1cnN0ID0gMDsKKyAgICAgICAgICAgIHdlaWdodCA9IDA7CisKKyAgICAgICAgICAgIC8qIEJhbmR3aWR0aCAocmF0ZSkgKi8KKyAgICAgICAgICAgIGJjbV9jb3NxX2dwb3J0X2JhbmR3aWR0aF9nZXQodW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X3Fvcy0+cG9uX2NoYW5fc2NoZWR1bGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFuZHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgICAgICAgICAgLyogTWF4IEJ1cnN0ICovCisgICAgICAgICAgICBiY21fY29zcV9jb250cm9sX2dldCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X3Fvcy0+cG9uX2NoYW5fc2NoZWR1bGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbUNvc3FDb250cm9sQmFuZHdpZHRoQnVyc3RNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4X2J1cnN0KTsKKworICAgICAgICAgICAgcHJpbnRmKCIlOXNcdDB4JTA4WFx0JTExdVx0JTE2ZFx0JTZkXG4iLAorICAgICAgICAgICAgICAgICAgIChwb25fY2hhbiA9PSBCQUxfQkNNX1NDSEVEX1BPTl9DSEFOXzEwRykgPyAiMTBHIiA6ICIxRyIsCisgICAgICAgICAgICAgICAgICAgcF9wb3J0X3Fvcy0+cG9uX2NoYW5fc2NoZWR1bGVyLAorICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aCwKKyAgICAgICAgICAgICAgICAgICBtYXhfYnVyc3QsCisgICAgICAgICAgICAgICAgICAgd2VpZ2h0KTsKKworICAgICAgICAgICAgcHJpbnRmKCIlOXNcdDB4JTA4WFx0JTExdVx0JTE2ZFx0JTZkXG4iLAorICAgICAgICAgICAgICAgICAgICJNSU4iLAorICAgICAgICAgICAgICAgICAgIHBfcG9ydF9xb3MtPnBvbl9jaGFuX3NjaGVkdWxlciwKKyAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICAgICAgICAgIGlmIChwX3BvcnRfcW9zLT5zY2hlZF90eXBlID09IEJBTF9CQ01fU0NIRURfVFlQRV9TUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiU5c1x0MHglMDhYXHQlMTF1XHQlMTZkXHQlNmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICIgICAgTUFYIChTUCkiLAorICAgICAgICAgICAgICAgICAgICAgICBwX3BvcnRfcW9zLT5zcF9zY2hlZHVsZXIsCisgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiJTlzXHQweCUwOFhcdCUxMXVcdCUxNmRcdCU2ZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgICBNQVggKFdGUSkiLAorICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgICAgICAgICAgICAgIHByaW50ZigiICAgIFdGUSB3ZWlnaHQgWyIpOworICAgICAgICAgICAgICAgIGZvciAod2ZxX2x2bD0wOyB3ZnFfbHZsPEJBTF9CQ01fU0NIRURfV0ZRX1BSSV9OVU07IHdmcV9sdmwrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbV9jb3NxX2dwb3J0X3NjaGVkX2dldCh1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wb3J0X3Fvcy0+d2ZxX3NjaGVkdWxlclt3ZnFfbHZsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3ZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigidyV1PSV1KCV1KSIsIHdmcV9sdmwsIHBfcG9ydF9xb3MtPnBvbl9jaGFuX3dlaWdodF9jZmdbd2ZxX2x2bF0sIHdlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdmcV9sdmwgIT0gQkFMX0JDTV9TQ0hFRF9XRlFfUFJJX05VTSAtIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGYoIl1cbiIpOworCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgV0ZRIGdwb3J0cyBbIik7CisgICAgICAgICAgICAgICAgZm9yICh3ZnFfbHZsPTA7IHdmcV9sdmw8QkFMX0JDTV9TQ0hFRF9XRlFfUFJJX05VTTsgd2ZxX2x2bCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ3JXU9MHglMDhYIiwgd2ZxX2x2bCwgcF9wb3J0X3Fvcy0+d2ZxX3NjaGVkdWxlclt3ZnFfbHZsXSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdmcV9sdmwgIT0gQkFMX0JDTV9TQ0hFRF9XRlFfUFJJX05VTSAtIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGYoIl1cbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KK30KKworLyoqCisgKiBAYnJpZWYgRGlzcGxheSB0aGUgRmxvdy9WT1EgSUQgcG9vbCBpbmZvcm1hdGlvbgorICovCit2b2lkIGJhbF9zd19kcHBfcW9zX3ByaW50X2Zsb3dpZF9wb29sKGludCB1bml0KQoreworICAgIGJhbF9zd19kcHBfcW9zX2Zsb3dpZF9wb29sX2VudHJ5ICpwX3Bvb2xfZW50cnkgPSBOVUxMOworICAgIHVpbnQ4X3QgY291bnQsIGZyZWVfY291bnQ7CisgICAgaW50IHNka1ZhbDsKKworICAgIHByaW50ZigiXG52b3EgSUQgSW5mb3JtYXRpb246XG4iKTsKKyAgICBwcmludGYoIiAgTWluIDEwRyB2b3EgSUQgPSAldVxuIiwgREVGQVVMVF9RT1NfVk9RX0JBU0VfMTBHKTsKKyAgICBwcmludGYoIiAgTWF4IDEwRyB2b3EgSUQgPSAldVxuIiwgREVGQVVMVF9RT1NfVk9RX01BWF8xMEcpOworICAgIHByaW50ZigiICBNaW4gMUcgdm9xIElEID0gJXVcbiIsIERFRkFVTFRfUU9TX1ZPUV9CQVNFXzFHKTsKKyAgICBwcmludGYoIiAgTWF4IDFHIHZvcSBJRCA9ICV1XG4iLCBERUZBVUxUX1FPU19WT1FfTUFYXzFHKTsKKyAgICBiY21fZmFicmljX2NvbnRyb2xfZ2V0KHVuaXQsIGJjbUZhYnJpY1F1ZXVlTWluLCAmc2RrVmFsKTsKKyAgICBwcmludGYoIiAgTWluIFZPUSBJRCA9ICVkXG4iLCBzZGtWYWwpOworICAgIGJjbV9mYWJyaWNfY29udHJvbF9nZXQodW5pdCAsYmNtRmFicmljUXVldWVNYXgsICZzZGtWYWwpOworICAgIHByaW50ZigiICBNYXggVk9RIElEID0gJWRcbiIsIHNka1ZhbCk7CisKKyAgICBwcmludGYoIlxuMTBHIHZvcSBJRCBUYWJsZSBJbmZvOlxuIik7CisgICAgcHJpbnRmKCIgIG5leHRfZmxvd19pZF92YWx1ZSA9ICV1XG4iLCBncF9iYWxfYmNtX3Fvc19jZmctPmZsb3dfaWRfcG9vbF8xMGcubmV4dF9mbG93X2lkX3ZhbHVlKTsKKyAgICBwcmludGYoIiAgbWF4X3ZhbHVlID0gJXVcbiIsIGdwX2JhbF9iY21fcW9zX2NmZy0+Zmxvd19pZF9wb29sXzEwZy5tYXhfdmFsdWUpOworICAgIHByaW50ZigiICBGcmVlIDEwZyB2b3EgSURzID0gIik7CisKKyAgICBwcmludGYoIiAgIik7CisgICAgY291bnQgPSAwOworICAgIGZyZWVfY291bnQgPSAwOworICAgIFRBSUxRX0ZPUkVBQ0gocF9wb29sX2VudHJ5LCAmZ3BfYmFsX2JjbV9xb3NfY2ZnLT5mbG93X2lkX3Bvb2xfMTBnLmZyZWVfdGFibGUsIGVudHJ5KQorICAgIHsKKyAgICAgICAgcHJpbnRmKCIlZCwgIiwgcF9wb29sX2VudHJ5LT5mbG93X2lkKTsKKworICAgICAgICBpZiAoY291bnQgPCAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4gICIpOworICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICB9CisgICAgICAgIGZyZWVfY291bnQrKzsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiICBOdW1iZXIgb2YgRnJlZSAxMGcgdm9xIElEcyA9ICVkXG4iLCBmcmVlX2NvdW50KTsKKworICAgIHByaW50ZigiXG4xRyB2b3EgSUQgVGFibGUgSW5mbzpcbiIpOworICAgIHByaW50ZigiICBuZXh0X2Zsb3dfaWRfdmFsdWUgPSAldVxuIiwgZ3BfYmFsX2JjbV9xb3NfY2ZnLT5mbG93X2lkX3Bvb2xfMWcubmV4dF9mbG93X2lkX3ZhbHVlKTsKKyAgICBwcmludGYoIiAgbWF4X3ZhbHVlID0gJXVcbiIsIGdwX2JhbF9iY21fcW9zX2NmZy0+Zmxvd19pZF9wb29sXzFnLm1heF92YWx1ZSk7CisgICAgcHJpbnRmKCIgIEZyZWUgMWcgdm9xIElEcyA9ICIpOworCisgICAgcHJpbnRmKCIgICIpOworICAgIGNvdW50ID0gMDsKKyAgICBmcmVlX2NvdW50ID0gMDsKKyAgICBUQUlMUV9GT1JFQUNIKHBfcG9vbF9lbnRyeSwgJmdwX2JhbF9iY21fcW9zX2NmZy0+Zmxvd19pZF9wb29sXzFnLmZyZWVfdGFibGUsIGVudHJ5KQorICAgIHsKKyAgICAgICAgcHJpbnRmKCIlZCwgIiwgcF9wb29sX2VudHJ5LT5mbG93X2lkKTsKKworICAgICAgICBpZiAoY291bnQgPCAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4gICIpOworICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICB9CisgICAgICAgIGZyZWVfY291bnQrKzsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiICBOdW1iZXIgb2YgRnJlZSAxZyB2b3EgSURzID0gJWRcbiIsIGZyZWVfY291bnQpOworfQorCisjZW5kaWYgIC8qIFRFU1RfU1dfVVRJTF9MT09QQkFDSyAqLworCisvKkB9Ki8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX3Fvcy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfcW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjN2UzNgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX3Fvcy5oCkBAIC0wLDAgKzEsNDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfZHBwX3Fvcy5oCisgKiBAYnJpZWYgQkFMIFN3aXRjaCBVdGlsIFFvUyBjb25maWd1cmF0aW9uIEFQSQorICoKKyAqIFRoaXMgaW5jbHVkZSBmaWxlIGNvbnRhaW5zIHRoZSBkYXRhIHN0cnVjdHVyZXMgYW5kIEFQSSBmb3IKKyAqIGNvbmZpZ3VyaW5nIGFuZCBtYW5hZ2luZyBRdWFsaXR5IG9mIFNlcnZpY2UgKFFvUykgZm9yIHNlcnZpY2VzIG9uCisgKiBEUFAgKERVTkUgUGFja2V0IFByb2Nlc3NvcikuCisgKgorICoKKyAqLworCisvKkB7Ki8KKworI2lmbmRlZglfQkFMX0RQUF9RT1NfSF8KKyNkZWZpbmUJX0JBTF9EUFBfUU9TX0hfCisKKy8qIC0tLSBwcm9qZWN0IGluY2x1ZGVzIC0tLSAqLworCisjaW5jbHVkZSAiZmxvd19mc20uaCIKKworLyogLS0tIGxvY2FsIHN0YXRpYyBjb25zdGFudHMgLS0tKi8KKworLyoqCisgKiBAYnJpZWYgVmFsdWUgcmVwcmVzZW50aW5nIDEwRyBpbiB1bml0cyBvZiBrYnBzCisgKi8KKyNkZWZpbmUgQkFMX0JDTV9RT1NfMTBHX2ticHMgMTAwMDAwMDAKKworLyoqCisgKiBAYnJpZWYgVmFsdWUgcmVwcmVzZW50aW5nIDJHIChUdXJibyBNb2RlKSBpbiB1bml0cyBvZiBrYnBzCisgKi8KKyNkZWZpbmUgQkFMX0JDTV9RT1NfMkdfa2JwcyAgIDIwMDAwMDAKKworLyoqCisgKiBAYnJpZWYgVmFsdWUgcmVwcmVzZW50aW5nIDFHIGluIHVuaXRzIG9mIGticHMKKyAqLworI2RlZmluZSBCQUxfQkNNX1FPU18xR19rYnBzICAgMTAwMDAwMAorCisvKioKKyAqIEBicmllZiBTY2hlZHVsZXIgd2VpZ2h0IGZvciAxMEcgcG9ydCBzY2hlZHVsZXIKKyAqLworI2RlZmluZSBCQUxfQkNNX1NDSEVEX1dFSUdIVF8xMEcgMTAKKworLyoqCisgKiBAYnJpZWYgU2NoZWR1bGVyIHdlaWdodCBmb3IgMUcgcG9ydCBzY2hlZHVsZXIgd2hlbiBUdXJibyBNb2RlIGlzIGVuYWJsZWQKKyAqLworI2RlZmluZSBCQUxfQkNNX1NDSEVEX1dFSUdIVF8yRyAyCisKKy8qKgorICogQGJyaWVmIFNjaGVkdWxlciB3ZWlnaHQgZm9yIDFHIHBvcnQgc2NoZWR1bGVyICh3aGVuIFR1cmJvIE1vZGUgaXMgZGlzYWJsZWQpCisgKi8KKyNkZWZpbmUgQkFMX0JDTV9TQ0hFRF9XRUlHSFRfMUcgMQorCisvKioKKyAqIEBicmllZiBTY2hlZHVsZXIgd2VpZ2h0IHVzZWQgZm9yIE1JTiBSYXRlIHNjaGVkdWxlcnMKKyAqLworI2RlZmluZSBCQUxfQkNNX1NDSEVEX1dFSUdIVF9NSU5fUkFURSAgMQorCisvKioKKyAqIEBicmllZiBTY2hlZHVsZXIgd2VpZ2h0IHVzZWQgZm9yIE1BWCBSYXRlIHNjaGVkdWxlcnMKKyAqLworI2RlZmluZSBCQUxfQkNNX1NDSEVEX1dFSUdIVF9NQVhfUkFURSAgMQorCisvKioKKyAqIEBicmllZiBOdW1iZXIgb2YgUE9OIHBvcnQgc2NoZWR1bGVycworICovCisjZGVmaW5lIEJBTF9CQ01fUU9TX05VTV9QT05fUE9SVFMgMTYKKworLyoqCisgKiBAYnJpZWYgUE9OIHBvcnQgTWF4IHZhbHVlIGFzIGRlZmluZWQgaW4gY29uZmlnLmJjbQorICovCisjZGVmaW5lIEJBTF9CQ01fTUFYX1BPTl9OVU0gMTYKKworLyoqCisgKiBAYnJpZWYgTnVtYmVyIG9mIHF1ZXVlcyBwZXIgUE9OIExpbmsgKExMSUQpCisgKi8KKyNkZWZpbmUgQkFMX0JDTV9RT1NfUVVFVUVTX1BFUl9MTElEIDQKKworLyoqCisgKiBAYnJpZWYgRGVmYXVsdCBDb1MgbGV2ZWwgZm9yIHVudGFnZ2VkIGZyYW1lcyBmb3IgMTBHIHF1ZXVlcworICovCisjZGVmaW5lIEJBTF9CQ01fUU9TX1VOVEFHR0VEX0RFRkFVTFRfQ09TXzEwRyAwCisKKy8qKgorICogQGJyaWVmIERlZmF1bHQgQ29TIGxldmVsIGZvciB1bnRhZ2dlZCBmcmFtZXMgZm9yIDFHIHF1ZXVlcworICovCisjZGVmaW5lIEJBTF9CQ01fUU9TX1VOVEFHR0VEX0RFRkFVTFRfQ09TXzFHIDQKKworLyoqCisgKiBAYnJpZWYgU2l6ZSBvZiBJQ1QgYW5kIFNoYXJlZCBWbGFuIHRhZyBvdmVyaGVhZCAoaW4gYnl0ZXMpIAorICovCisjZGVmaW5lIEJBTF9CQ01fUU9TX1NJTkdMRV9WTEFOX1RBR19IRFJfU0laRSA0CisKKy8qKgorICogQGJyaWVmIEJhc2UgdmFsdWUgZm9yIFZPUSBJRHMgYXNzaWduZWQgdG8gdGhlIDFHIGNoYW5uZWwKKyAqCisgKiBBbGwgVk9RIElEcyBjb25maWd1cmVkIG9uIHRoZSAxRyBjaGFubmVsIGFyZSBjb25maWd1cmVkIHdpdGggYW4KKyAqIElEIHZhbHVlIG9mIDB4NDAwMCAoMTYzODQpIGFuZCBsYXJnZXIuIAorICovCisjZGVmaW5lIEJBTF9CQ01fUU9TX1ZPUV9JRF8xR19CQVNFIDB4NDAwMAorCisvKioKKyAqIEBicmllZiBXRlEgbWF4aW11bSB2YWx1ZSBmb3IgYSB3ZWlnaHQKKyAqLworI2RlZmluZSBCQUxfQkNNX1NDSEVEX1dGUV9NQVhfV0VJR0hUIDQwOTYKKworLyoqCisgKiBAYnJpZWYgTnVtYmVyIG9mIFdGUSBzY2hlZHVsaW5nIHByaW9yaXR5IGxldmVscworICovCisjZGVmaW5lIEJBTF9CQ01fU0NIRURfV0ZRX1BSSV9OVU0gOAorCisvKioKKyAqIEBicmllZiBEZWZhdWx0IHJhdGUgZm9yIFBPTiBwb3J0IHNoYXBlciBpbiBrYnBzICgxMi41R2JwcykKKyAqLworI2RlZmluZSBCQUxfQkNNX1FPU19ERUZBVUxUX1BPUlRfUkFURSAxMjUwMDAwMAorCisvKioKKyAqIEBicmllZiBEZWZhdWx0IHJhdGUgZm9yIDEwRyBQT04gY2hhbm5lbCBzaGFwZXIgaW4ga2JwcyAoMTAuMjVHYnBzKQorICoKKyAqIFRoZSBleHRyYSAwLjI1IEdicHMgYWxsb3dzIGZvciBzb21lIG92ZXJoZWFkIChmbG93IGNvbnRyb2wgZnJhbWVzLCBldGMuKQorICovCisjZGVmaW5lIEJBTF9CQ01fUU9TX0RFRkFVTFRfMTBHX0NIQU5fUkFURSAxMDI1MDAwMAorCisvKioKKyAqIEBicmllZiBEZWZhdWx0IHJhdGUgZm9yIDFHIFBPTiBjaGFubmVsIHNoYXBlciBpbiBrYnBzICgyLjI1R2JwcykKKyAqCisgKiBUaGlzIGlzIHNldCB0byAyRyB0byBhbGxvdyBmb3IgVHVyYm8gTW9kZSBjb25maWd1cmF0aW9ucy4KKyAqCisgKiBUaGUgZXh0cmEgMC4yNSBHYnBzIGFsbG93cyBmb3Igc29tZSBvdmVyaGVhZCAoZmxvdyBjb250cm9sIGZyYW1lcywgZXRjLikKKyAqLworI2RlZmluZSBCQUxfQkNNX1FPU19ERUZBVUxUXzFHX0NIQU5fUkFURSAyMjUwMDAwCisKKy8qKgorICogQGJyaWVmIENyZWRpdCBhZGp1c3RtZW50IHRvIGFjY291bnQgZm9yIHNjaGVkdWxlciBvdmVyaGVhZCAocGVyY2VudGFnZSkKKyAqCisgKiBUaGUgYWRqdXN0bWVudCBpcyBmaXZlIHBlcmNlbnQgYmFzZWQgb24gdGhlIHJlY29tbWVuZGF0aW9uIGZyb20gdGhlCisgKiBEdW5lIHRlYW0uCisgKi8KKyNkZWZpbmUgQkFMX0JDTV9RT1NfQ1JFRElUX1JBVEVfQURKIDAuMDUKKworLyoqCisgKiBAYnJpZWYgU2hhcGVyIGFkanVzdG1lbnQgdG8gYWNjb3VudCBmb3Igc2NoZWR1bGVyIG92ZXJoZWFkIChwZXJjZW50YWdlKQorICoKKyAqIFRoZSBhZGp1c3RtZW50IGlzIG9uZSBwZXJjZW50IGJhc2VkIG9uIHRoZSByZWNvbW1lbmRhdGlvbiBmcm9tIHRoZQorICogRHVuZSB0ZWFtLgorICovCisjZGVmaW5lIEJBTF9CQ01fUU9TX1NIQVBFUl9SQVRFX0FESiAwLjAxCisKKy8qKgorICogQGJyaWVmIERlZmF1bHQgbWF4aW11bSBidXN0IHNpemUgZm9yIFBPTiBwb3J0IHNoYXBlciBpbiBieXRlcyAoMCA9IGRpc2FibGVkKQorICovCisjZGVmaW5lIEJBTF9CQ01fUU9TX0RFRkFVTFRfTUFYX0JVUlNUIDAKKworLyoqCisgKiBAYnJpZWYgUEZDIGZsb3cgY29udHJvbCBwcmlvcml0eSB2YWx1ZSBmb3IgdGhlIDEwRyBjaGFubmVsCisgKi8KKyNkZWZpbmUgQkFMX0JDTV9RT1NfMTBHX0NIQU5fUEZDIDAKKworLyoqCisgKiBAYnJpZWYgUEZDIGZsb3cgY29udHJvbCBwcmlvcml0eSB2YWx1ZSBmb3IgdGhlIDFHIGNoYW5uZWwKKyAqLworI2RlZmluZSBCQUxfQkNNX1FPU18xR19DSEFOX1BGQyAxCisKKy8qKgorICogQGJyaWVmIEZpcnN0IGxvZ2ljYWwgUE9OIHBvcnQgbnVtYmVyCisgKi8KKyNkZWZpbmUgQkFMX1BPTl9QT1JUX1NUQVJUICAwCisKKy8qKgorICogQGJyaWVmIExhc3QgbG9naWNhbCBQT04gcG9ydCBudW1iZXIKKyAqLworI2RlZmluZSBCQUxfUE9OX1BPUlRfRU5EICAgIDcKKworLyoqCisgKiBAYnJpZWYgVGhlIHRvdGFsIG51bWJlciBvZiBQT04gcG9ydHMKKyAqLworI2RlZmluZSBOVU1fUE9OX1BPUlRTICAoQkFMX1BPTl9QT1JUX0VORCAtIEJBTF9QT05fUE9SVF9TVEFSVCArIDEpCisKKy8qKgorICogQGJyaWVmIERlZmF1bHQgRFBQIGhlYWRlciBzaXplIHVzZWQgYnkgc2NoZWR1bGVyIGFuZCByYXRlCisgKiBjYWxjdWxhdGlvbnMuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9RT1NfRFBQX1BLVF9IRFJfU0laRSAxOSAvKiBieXRlcyAqLworCisvKioKKyAqIEBicmllZiBTaXplIG9mIHRoZSBEdW5lIFBQIGhlYWRlciB1c2VkIHRvIHJlcG9ydCB0aGUgRmxvdyBJRCAoZm9yCisgKiBRb1MpIGluIHBhY2tldHMgdHJhcHBlZCB0byB0aGUgQ1BVLgorICovCisjZGVmaW5lIEJBTF9CQ01fRFBQX0ZMT1dJRF9IRFJfU0laRSA1CisKKy8qKgorICogQGJyaWVmIFNpemUgb2YgSUNUIGFuZCBTaGFyZWQgVmxhbiB0YWcgb3ZlcmhlYWQgKGluIGJ5dGVzKSAKKyAqLworI2RlZmluZSBCQUxfQkNNX1FPU19TSU5HTEVfVkxBTl9UQUdfSERSX1NJWkUgNAorCisKKy8qKgorICogQGJyaWVmIERlZmF1bHQgVk9RIElkZW50aWZpZXIgQmFzZSBWYWx1ZSBmb3IgMTBHIGZsb3dzCisgKgorICogMTBHIFZPUS9GbG93IElEcyBjYW4gcmFuZ2UgZnJvbSAzMDAwLi4xNjM4My4gVGhpcyBtZWFucyB0aGUgYmxvY2tzCisgKiB3aWxsIGJlIGFsbG9jYXRlZCBpbiBncm91cHMgb2YgZm91ciBhcyBmb2xsb3dzLgorICoKKyAqICAgYmxrIDEgPSAzMDAwLCAzMDAxLCAzMDAyLCAzMDAzCisgKiAgIGJsayAyID0gMzAwNCwgMzAwNSwgMzAwNiwgMzAwNworICogICAuLi4KKyAqICAgYmxrIGxhc3QgPSAxNjM4MCwgMTYzODEsIDE2MzgyLCAxNjM4MworICoKKyAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgbGFzdCBJRCB1c2VkIHRvIGFsbG9jYXRlIGEgMTBHIFZPUSBncm91cCB3aWxsCisgKiBiZSAxNjM4MC4KKyAqCisgKiBWT1EvZmxvdyBJRHMgc3RhcnQgYXQgMzAwMCBiZWNhdXNlIHRoZSBTREsgYXNzaWducyBJRCB2YWx1ZXMKKyAqIGJldHdlZW4gMC4uMjAwMCsgdG8gcG9ydCBxdWV1ZXMuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9RT1NfVk9RX0JBU0VfMTBHIDMwMDAKKworLyoqCisgKiBAYnJpZWYgRGVmYXVsdCBWT1EgSWRlbnRpZmllciBNYXhpbXVtIFZhbHVlIGZvciAxMEcgZmxvd3MKKyAqCisgKiBUaGUgbGFzdCBhdmFpbGFibGUgdmFsdWUgZm9yIDEwRyBmbG93cyBpcyAxNjM4NCAtIDQuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9RT1NfVk9RX01BWF8xMEcgMTYzODAKKworLyoqCisgKiBAYnJpZWYgRGVmYXVsdCBWT1EgSWRlbnRpZmllciBCYXNlIFZhbHVlIGZvciAxRyBmbG93cworICoKKyAqIDFHIFZPUS9GbG93IElEcyBjYW4gcmFuZ2UgZnJvbSAxNjM4NC4uMzI3NjcuIFRoaXMgbWVhbnMgdGhlIGJsb2NrcworICogd2lsbCBiZSBhbGxvY2F0ZWQgaW4gZ3JvdXBzIG9mIGZvdXIgYXMgZm9sbG93cy4KKyAqCisgKiAgIGJsayAxID0gMTYzODQsIDE2Mzg1LCAxNjM4NiwgMTYzODcKKyAqICAgYmxrIDIgPSAxNjM4OCwgMTYzODksIDE2MzkwLCAxNjM5MgorICogICAuLi4KKyAqICAgYmxrIGxhc3QgPSAzMjc2NCwgMzI3NjUsIDMyNzY2LCAzMjc2NworICoKKyAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgbGFzdCBJRCB1c2VkIHRvIGFsbG9jYXRlIGEgMUcgVk9RIGdyb3VwIHdpbGwgYmUKKyAqIDMyNzY0LgorICovCisjZGVmaW5lIERFRkFVTFRfUU9TX1ZPUV9CQVNFXzFHIDE2Mzg0CisKKy8qKgorICogQGJyaWVmIERlZmF1bHQgVk9RIElkZW50aWZpZXIgTWF4aW11bSBWYWx1ZSBmb3IgMUcgZmxvd3MKKyAqCisgKiBUaGUgbGFzdCBhdmFpbGFibGUgdmFsdWUgZm9yIDFHIGZsb3dzIGlzIDMyNzY4IC0gNC4KKyAqLworI2RlZmluZSBERUZBVUxUX1FPU19WT1FfTUFYXzFHIDMyNzY0CisKKy8qKgorICogQGJyaWVmIEdldCB0aGUgUFAgcG9ydCBudW1iZXIgZm9yIHRoZSBzcGVjaWZpZWQgUE9OIHBvcnQgYW5kCisgKiBjaGFubmVsICgxMEcgdnMuIDFHKQorICovCisjZGVmaW5lIEJBTF9CQ01fR0VUX1BQX1BPUlQocG9uLCBjaGFuKSAoKHBvbikgKyAoTlVNX1BPTl9QT1JUUyAqIChjaGFuKSkpCisKKy8qKgorICogQGJyaWVmIFBPTiBjaGFubmVsIChhLmsuYSBzcGVlZCwgMTBHIHZzLiAxRykKKyAqCisgKiBUaGUgMUcgUE9OIGNoYW5uZWwgdmFsdWUgaXMgYWxzbyB1c2VkIHRvIHJlcHJlc2VudCAyRyBUdXJibyBNb2RlCisgKiB3aGVuIGVuYWJsZWQuCisgKi8KK3R5cGVkZWYgZW51bSBiYWxfc3dfZHBwX3Fvc19zY2hlZF9wb25fY2hhbgoreworICAgIEJBTF9CQ01fU0NIRURfUE9OX0NIQU5fMTBHID0gMCwgLyoqPCAxMEcgUE9OIGNoYW5uZWwgKi8KKyAgICBCQUxfQkNNX1NDSEVEX1BPTl9DSEFOXzFHICA9IDEsIC8qKjwgMUcgUE9OIGNoYW5uZWwgKi8KKyAgICBCQUxfQkNNX1NDSEVEX1BPTl9DSEFOX05VTQorfSBiYWxfc3dfZHBwX3Fvc19zY2hlZF9wb25fY2hhbjsKKworLyoqCisgKiBAYnJpZWYgU0xBIFR5cGUgKE1JTiB2cy4gTUFYKQorICovCit0eXBlZGVmIGVudW0gYmFsX3N3X2RwcF9xb3Nfc2NoZWRfc2xhX3R5cGUKK3sKKyAgICBCQUxfQkNNX1NDSEVEX1NMQV9NSU5fUkFURSA9IDAsIC8qKjwgTUlOIFJhdGUgKi8KKyAgICBCQUxfQkNNX1NDSEVEX1NMQV9NQVhfUkFURSA9IDEsIC8qKjwgTUFYIFJhdGUgKi8KKyAgICBCQUxfQkNNX1NDSEVEX1NMQV9UWVBFX05VTQorfSBiYWxfc3dfZHBwX3Fvc19zY2hlZF9zbGFfdHlwZTsKKworLyoqCisgKiBAYnJpZWYgU2NoZWR1bGluZyBUeXBlCisgKi8KK3R5cGVkZWYgZW51bSBiYWxfc3dfZHBwX3Fvc19zY2hlZF90eXBlCit7CisgICAgQkFMX0JDTV9TQ0hFRF9UWVBFX1NQICA9IDAsIC8qKjwgU3RyaWN0IHByaW9yaXR5IHNjaGVkdWxpbmcgKi8KKyAgICBCQUxfQkNNX1NDSEVEX1RZUEVfV0ZRID0gMSwgLyoqPCBXZWlnaHRlZCBGYWlyIFF1ZXVpbmcgKi8KKyAgICBCQUxfQkNNX1NDSEVEX1RZUEVfTlVNCit9IGJhbF9zd19kcHBfcW9zX3NjaGVkX3R5cGU7CisKKy8qKgorICogQGJyaWVmIFNMQSBzY2hlZHVsZXIgY29uZmlndXJhdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCBiYWxfc3dfZHBwX3Fvc19zY2hlZF9zbGEKK3sKKyAgICBiY21fZ3BvcnRfdCBzY2hlZHVsZXJfZ3BvcnQ7ICAvKio8IFNjaGVkdWxlciBvYmplY3QgZ3BvcnQqLworICAgIGJjbV9ncG9ydF90IHBhcmVudF9ncG9ydDsgICAgIC8qKjwgUGFyZW50IHNjaGVkdWxlciBncG9ydCAqLworICAgIHVpbnQzMl90IHJhdGU7ICAgICAgICAgICAgICAgICAgICAvKio8IFJhdGUgKG9yIGJhbmR3aWR0aCkgaW4gS2JwcyAqLworICAgIHVpbnQzMl90IGJ1cnN0OyAgICAgICAgICAgICAgICAgICAvKio8IE1heCBidXJzdCBpbiBLYml0cyAqLworICAgIHVpbnQ4X3QgdHJhZmZpY19wcmlvcml0eTsgICAgICAgICAgLyoqPCBUcmFmZmljIHByaW9yaXR5ICovCit9IGJhbF9zd19kcHBfcW9zX3NjaGVkX3NsYTsKKworLyoqCisgKiBAYnJpZWYgUW9TIGNvbmZpZ3VyYXRpb24gZm9yIGEgUE9OIExpbmsgKExMSUQpCisgKi8KK3R5cGVkZWYgc3RydWN0IGJhbF9zd19kcHBfbGxpZF9xb3MKK3sKKyAgICBiYWxfc3dfZHBwX3Fvc19zY2hlZF9wb25fY2hhbiBwb25fY2hhbjsgLyoqPCBQT04gQ2hhbm5lbCAob3Igc3BlZWQpIHRoZSBsaW5rIGlzIGNvbm5lY3RlZCB0byAqLworICAgIGJhbF9zd19kcHBfcW9zX3NjaGVkX3NsYSBtaW47ICAgLyoqPCBNSU4gUmF0ZSBjb25maWd1cmF0aW9uICovCisgICAgYmFsX3N3X2RwcF9xb3Nfc2NoZWRfc2xhIG1heDsgICAvKio8IE1BWCBSYXRlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21fZ3BvcnRfdCB2b3FfY29ubmVjdG9yX2dwb3J0OyAvKio8IFZPUSBDb25uZWN0b3IgZ3BvcnQgICovCisgICAgYmNtX2dwb3J0X3Qgdm9xX2dwb3J0OyAgLyoqPCBWT1EgZ3BvcnQgICovCisgICAgaW50IHZvcV9mbG93X2lkOyAgICAgICAgIC8qKjwgVk9RIEZsb3cgSUQgKi8KKyAgICBpbnQgdm9xX2lkOyAgICAgICAgICAgICAvKio8IFZPUSBJRCAqLworfSBiYWxfc3dfZHBwX2xsaWRfcW9zOworCisvKioKKyAqIEBicmllZiBRb1MgY29uZmlndXJhdGlvbiBmb3IgYSBjaGFubmVsaXplZCBQT04gcG9ydAorICovCit0eXBlZGVmIHN0cnVjdCBiYWxfc3dfZHBwX3BvcnRfcW9zX2NmZworeworICAgIGJjbV9ncG9ydF90IG1vZF9ncG9ydDsgICAgICAgICAvKio8IE1PRCBwb3J0IGZvciBhIGNoYW5uZWxpemVkIFBPTiBpbnRlcmZhY2UgKi8KKyAgICBiYWxfc3dfZHBwX3Fvc19zY2hlZF90eXBlIHNjaGVkX3R5cGU7ICAgLyoqPCBTY2hlZHVsaW5nIHR5cGUgdXNlZCBvbiB0aGUgUE9OIGNoYW5uZWwgKFNQIHZzLiBXRlEpICovCisgICAgYmNtX2dwb3J0X3QgcG9uX2NoYW5fc2NoZWR1bGVyOyAvKio8IFBPTiBjaGFubmVsIHNjaGVkdWxlciAqLworICAgIGJjbV9ncG9ydF90IHNwX3NjaGVkdWxlcjsgICAgICAvKio8IFN0cmljdCBQcmlvcml0eSBzY2hlZHVsZXIgZm9yIE1BWCByYXRlcyAoRUlScykgKi8KKyAgICBiY21fZ3BvcnRfdCB3ZnFfc2NoZWR1bGVyW0JBTF9CQ01fU0NIRURfV0ZRX1BSSV9OVU1dOyAvKio8IFdGUStGUSBzY2hlZHVsZXJzIGZvciBNQVggcmF0ZXMgKEVJUnMpICovCisgICAgaW50MzJfdCBwb25fY2hhbl93ZWlnaHRfY2ZnW0JBTF9CQ01fU0NIRURfV0ZRX1BSSV9OVU1dOyAgICAgLyoqPCBXZWlnaHQgY29uZmlndXJhdGlvbiBmb3IgV0ZRIHNjaGVkdWxlciAqLworfSBiYWxfc3dfZHBwX3BvcnRfcW9zX2NmZzsKKworLyoqCisgKiBAYnJpZWYgRmxvdy9WT1EgSUQgUG9vbCBFbnRyeQorICovCit0eXBlZGVmIHN0cnVjdCBiYWxfc3dfZHBwX3Fvc19mbG93aWRfcG9vbF9lbnRyeQoreworICAgIHVpbnQzMl90ICBmbG93X2lkOyAgICAvKio8IEZsb3cvVk9RIElEIHZhbHVlICovCisgICAgVEFJTFFfRU5UUlkoYmFsX3N3X2RwcF9xb3NfZmxvd2lkX3Bvb2xfZW50cnkpIGVudHJ5OyAvKio8IExpbmsgaW50byB0aGUgcG9vbCB0YWJsZSAqLworfSBiYWxfc3dfZHBwX3Fvc19mbG93aWRfcG9vbF9lbnRyeTsKKworLyoqCisgKiBAYnJpZWYgRmxvdy9WT1EgSUQgcmVzb3VyY2UgcG9vbAorICovCit0eXBlZGVmIHN0cnVjdCBiYWxfc3dfZHBwX3Fvc19mbG93aWRfcG9vbAoreworICAgIHVpbnQzMl90IG5leHRfZmxvd19pZF92YWx1ZTsgLyoqPCBOZXh0IGZsb3cgSUQgdG8gYmUgYWxsb2NhdGVkICovCisgICAgdWludDMyX3QgbWF4X3ZhbHVlOyAgICAgICAgLyoqPCBNYXhpbXVtIHZhbHVlIGZvciB0aGUgZmxvdyBJRHMgaW4gdGhpcyBwb29sICovCisgICAgVEFJTFFfSEVBRChiYWxfc3dfZHBwX3Fvc19mbG93aWRfcG9vbF9mcmVlX2hlYWQsIGJhbF9zd19kcHBfcW9zX2Zsb3dpZF9wb29sX2VudHJ5KSBmcmVlX3RhYmxlOyAvKio8IEZsb3cvVk9RIElEIGZyZWUgcG9vbCAqLworfSBiYWxfc3dfZHBwX3Fvc19mbG93aWRfcG9vbDsKKworLyoqCisgKiBAYnJpZWYgRE1MIEJDTSBBUFAgUW9TIGNvbmZpZ3VyYXRpb24gY29udGV4dCBkZWZpbml0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IGJhbF9zd19xb3NfY2ZnCit7CisgICAgaW50MzJfdCBtb2RfaWQ7IC8qKjwgTW9kdWxlIElEIGZvciB0aGlzIEFSQUQgZGV2aWNlICovCisgICAgaW50MzJfdCBxb3NfcG9ydF9tYXBfaWQ7IC8qKjwgUW9TIFBvcnQgTWFwIElkZW50aWZpZXIgKi8KKyAgICBiYWxfc3dfZHBwX3BvcnRfcW9zX2NmZyBwb25bQkFMX0JDTV9RT1NfTlVNX1BPTl9QT1JUU11bQkFMX0JDTV9TQ0hFRF9QT05fQ0hBTl9OVU1dOyAgLyoqPCBEUyBRb1MgY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbGl6ZWQgUE9OIHBvcnRzICovCisgICAgYmFsX3N3X2RwcF9xb3NfZmxvd2lkX3Bvb2wgZmxvd19pZF9wb29sXzEwZzsgLyoqPCBGbG93L1ZPUSBJRCByZXNvdXJjZSBwb29sIGZvciAxMEcgZmxvd3MgKi8KKyAgICBiYWxfc3dfZHBwX3Fvc19mbG93aWRfcG9vbCBmbG93X2lkX3Bvb2xfMWc7ICAvKio8IEZsb3cvVk9RIElEIHJlc291cmNlIHBvb2wgZm9yIDFHIGZsb3dzICovCisgICAgaW50IG51bV9jaGFubmVsc19wZXJfcG9uOyAKK30gYmFsX3N3X3Fvc19jZmc7CisKKy8qKgorICogQGJyaWVmIFdGUSBzY2hlZHVsaW5nIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB3ZWlnaHQgdmFsdWVzIHBlciBzY2hlZHVsZXIKKyAqIGxldmVsIChpLmUuLCBET0NTSVMgVHJhZmZpYyBQcmlvcml0eSkuIFRoZSByYW5nZSBvZiB3ZWlnaHQgdmFsdWVzCisgKiBpcyAwOjRLLCB3aGVyZSB2YWx1ZXMgMTo0SyBhcmUgdXNlZCBmb3IgV0ZRIHNjaGVkdWxpbmcgYW5kIGEgdmFsdWUKKyAqIG9mICcwJyBpcyB1c2VkIGZvciBzdHJpY3QgcHJpb3JpdHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGJhbF9zd19kcHBfcW9zX3dmcV9jZmcKK3sKKyAgICB1aW50MzJfdCB3ZWlnaHRzW0JBTF9CQ01fU0NIRURfV0ZRX1BSSV9OVU1dOworfSBiYWxfc3dfZHBwX3Fvc193ZnFfY2ZnOworCitleHRlcm4gYmFsX3N3X3Fvc19jZmcgKmdwX2JhbF9iY21fcW9zX2NmZzsKKworLyoqCisgKiBAYnJpZWYgTWF4IE51bWJlciBvZiBOTkkgcG9ydHMKKyAqLworI2RlZmluZSBCQUxfQkNNX1FPU19OVU1fTk5JX1BPUlRTIDE2CisKKy8qKgorICogQGJyaWVmIFNlcnZpY2UgQ29uZmlndXJhdGlvbiBFbnRyeSBUeXBlCisgKgorICogVGhlIHR5cGUgb2Ygc2VydmljZSBjb25maWd1cmF0aW9uIHRoYXQgdGhlIERtbEJjbVNlcnZpY2VDZmdUIGVudHJ5CisgKiByZXByZXNlbnRzLgorICovCit0eXBlZGVmIGVudW0gYmFsX3N3X3NlcnZpY2VfdHlwZQoreworICAgIEJBTF9CQ01fU1ZDX1RZUEVfTk9ORSwgIC8qKjwgTm9uZS91bmluaXRpYWxpemVkICovCisgICAgQkFMX0JDTV9TVkNfVFlQRV9JQ1QsICAgLyoqPCBJbnRyYS1jaGFzc2lzIFRhZ2dlZCAqLworICAgIEJBTF9CQ01fU1ZDX1RZUEVfSVAsICAgIC8qKjwgSVAoSFNEKSAqLworICAgIEJBTF9CQ01fU1ZDX1RZUEVfUEIsICAgIC8qKjwgTUVGIFByb3ZpZGVyIEJyaWRnaW5nIChWTEFOIHRhZ2dlZCkgKi8KKyAgICBCQUxfQkNNX1NWQ19UWVBFX1NIVkxBTiwvKio8IFNoYXJlZCBWTEFOICovCisgICAgQkFMX0JDTV9TVkNfVFlQRV9MQVNUICAgLyoqPCBOdW1iZXIgb2YgYmFsX3N3X3NlcnZpY2VfdHlwZV90IHZhbHVlcyAqLworfSBiYWxfc3dfc2VydmljZV90eXBlOworCisvKiAtLS0gZm9yd2FyZCBkZWNsYXJhdGlvbnMgLS0tICovCisKK3R5cGVkZWYgc3RydWN0IGJhbF9zd19kcHBfcW9zX3NlcnZpY2VfY2ZnCit7CisgICAgdWludDMyX3QgYmFsX2Zsb3dfaWQ7CisgICAgYmNtX3BvcnRfdCBwb25fcG9ydDsgICAgICAgICAvKiBsb2dpY2FsIHBvcnQgbnVtYmVyIGZyb20gYmFsIGZsb3cgY29uZmlnICovCisgICAgdWludDMyX3QgbnVtX25uaV9ncG9ydDsKKyAgICBiY21fZ3BvcnRfdCBubmlfZ3BvcnRbQkFMX0JDTV9RT1NfTlVNX05OSV9QT1JUU107CisgICAgdWludDMyX3QgdHVubmVsX2lkOworICAgIGJhbF9zd19kcHBfbGxpZF9xb3MgZHNfcW9zOyAKKyAgICBiYWxfc3dfc2VydmljZV90eXBlIHNlcnZpY2VfdHlwZTsgICAgCit9IGJhbF9zd19kcHBfcW9zX3NlcnZpY2VfY2ZnOworCisKKy8qIC0tLSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLSAqLworCitiY21vc19lcnJubyBiYWxfc3dfZHBwX3Fvc19pbml0KGludCB1bml0LCBiYWxfc3dhcHBfcG9ydF9tYXBfaW5keCBwb25fbW9kZSk7Cit2b2lkICAgICAgICBiYWxfc3dfZHBwX3Fvc19jbGVhbnVwKGludCB1bml0KTsKK2JjbW9zX2Vycm5vIGJhbF9zd19kcHBfcG9ydF9xb3NfaW5pdChpbnQgdW5pdCwgYmNtX3BvcnRfdCBwb25fcG9ydCwgYmFsX3N3X2RwcF9xb3Nfc2NoZWRfcG9uX2NoYW4gcG9uX2NoYW4pOwordm9pZCAgICAgICAgYmFsX3N3X2RwcF9wb3J0X3Fvc19jbGVhbnVwKGludCB1bml0LCBiY21fcG9ydF90IHBvbl9wb3J0LCBiYWxfc3dfZHBwX3Fvc19zY2hlZF9wb25fY2hhbiBwb25fY2hhbik7CitiY21vc19lcnJubyBiYWxfc3dfZHBwX3Fvc19zZXRfcG9ydF9iYW5kd2lkdGgoaW50IHVuaXQsIGJjbV9wb3J0X3QgcG9uX3BvcnQsIHVpbnQzMl90IGJhbmR3aWR0aCwgdWludDMyX3QgbWF4X2J1cnN0KTsKK2JjbW9zX2Vycm5vIGJhbF9zd19kcHBfcW9zX3NldF9wb3J0Y2hhbl9iYW5kd2lkdGgoaW50IHVuaXQsIGJjbV9wb3J0X3QgcG9uX3BvcnQsIGJhbF9zd19kcHBfcW9zX3NjaGVkX3Bvbl9jaGFuIHBvbl9jaGFuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhbmR3aWR0aCwgdWludDMyX3QgbWF4X2J1cnN0KTsKK2JjbW9zX2Vycm5vIGJhbF9zd19kcHBfcW9zX3NldF9wb25jaGFuX3dmcV9jZmcoaW50IHVuaXQsIGJjbV9wb3J0X3QgcG9uX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxfc3dfZHBwX3Fvc19zY2hlZF9wb25fY2hhbiBwb25fY2hhbiwgYmFsX3N3X2RwcF9xb3Nfd2ZxX2NmZyAqcF93ZnFfY2ZnKTsKK2JjbW9zX2Vycm5vIGJhbF9zd19kcHBfcW9zX3NldF9sbGlkX2JhbmR3aWR0aChpbnQgdW5pdCwgYmFsX3N3X2RwcF9xb3Nfc2VydmljZV9jZmcgKnBfc2VydmljZV9jZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxfc3dfZHBwX3Fvc19zY2hlZF9zbGFfdHlwZSBzbGFfdHlwZSwgdWludDMyX3QgYmFuZHdpZHRoLCB1aW50MzJfdCBtYXhfYnVyc3QpOworYmNtb3NfZXJybm8gYmFsX3N3X2RwcF9sbGlkX3Fvc19jb25maWcoaW50IHVuaXQsIGJhbF9zd19kcHBfcW9zX3NlcnZpY2VfY2ZnICpwX3NlcnZpY2VfY2ZnX2VudHJ5KTsKK2JjbW9zX2Vycm5vIGJhbF9zd19kcHBfbGxpZF9zZXRfcW9zX3BvcnRfbWFwKGludCB1bml0LCBiYWxfc3dfZHBwX3Fvc19zZXJ2aWNlX2NmZyAqcF9zZXJ2aWNlX2NmZ19lbnRyeSk7Cit2b2lkICAgICAgICBiYWxfc3dfZHBwX2xsaWRfcW9zX2NsZWFudXAoaW50IHVuaXQsIGJhbF9zd19kcHBfcW9zX3NlcnZpY2VfY2ZnICpwX3NlcnZpY2VfY2ZnX2VudHJ5KTsKK3ZvaWQgICAgICAgIGJhbF9zd19kcHBfcW9zX2NsZWFyX3ZvcV9zdGF0cyhpbnQgdW5pdCwgYmNtX2dwb3J0X3QgZ3BvcnQpOwordm9pZCAgICAgICAgYmFsX3N3X2RwcF9wcmludF9hbGxfcG9ydF9xb3MoaW50IHVuaXQpOwordm9pZCAgICAgICAgYmFsX3N3X2RwcF9xb3NfcHJpbnRfZmxvd2lkX3Bvb2woaW50IHVuaXQpOworCisjZW5kaWYgLyogI2lmbmRlZiBfQkFMX0RQUF9RT1NfSF8gKi8KKworLypAfSovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9xb3NfbWFwLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF9xb3NfbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxNGI3YwotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX3Fvc19tYXAuYwpAQCAtMCwwICsxLDIzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX2RwcF9xb3NfbWFwLmMKKyAqIEBicmllZiBCQUwgU3dpdGNoIFV0aWwgUW9TIG1hcCBtYW5hZ2VtZW50IEFQSQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgZm9yCisgKiBjb25maWd1cmluZyBhbmQgbWFuYWdpbmcgdGhlIHBjcCBiaXRzIHRyYW5zbGF0aW9uIHNlcnZpY2VzIGZvcgorICogRFVORSBQYWNrIFByb2Nlc3NvciAoRFBQKS4gCisgKgorICogVGhlIHBjcCB0cmFuc2xhdGlvbiBzZXJ2aWNlIGlzIGFjY29tcGxpc2hlZCB1c2luZyBJTkcgaW5ncmVzcyB2bGFuIHRyYW5zbGF0aW9uIEFQSQorICogVGhlIEFQSSByZXF1aXJlZCBhIFFvcyBtYXAgdGFibGUgZm9yIHBjcCB0cmFuc2xhdGluIG9uIGEgTElGLgorICogVGhpcyBmaWxlIGRlZmluZXMgMTUgcHJlLW1hcCB0YWJsZXMgZm9yIGFsbCBrbm93biB1c2UgY2FzZXMuCisgKgorICogQSBzZXQgb2YgdXRpbGl0aWVzIEFQSSBhcmUgaW5jbHVkZWQgZm9yIGNhbGxlcnMgdG8gZGV0ZXJtaW5lIHdoaWNoIHRhYmxlIHRvIHVzZQorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICovCisKKy8qQHsqLworI2lmbmRlZiBURVNUX1NXX1VUSUxfTE9PUEJBQ0sKKworI2luY2x1ZGUgPHN0ZGludC5oPiAKKworI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtb3NfZXJybm8uaCIKKyNpbmNsdWRlICJiYWxfZHBwX3Fvc19tYXAuaCIKKworI2luY2x1ZGUgImJhbF9zd2l0Y2hfdXRpbC5oIiAgLyogZm9yIGRlZmluaXRpb24gb2YgbG9nX2lkX3N3X3V0aWwgKi8KKworI2luY2x1ZGUgImJjbS9lcnJvci5oIgorI2luY2x1ZGUgImJjbS9xb3MuaCIKKworI2RlZmluZSBCQUxfQkNNX1BDUF9NQVBfTlVNICAgICAgICAxNQorI2RlZmluZSBCQUxfQkNNX1BDUF9NQVBfRU5UUklFUyAgICAgOAorI2RlZmluZSBCQUxfQkNNX01BWF9QQ1BfVkFMVUUgICAgICAgNworI2RlZmluZSBCQUxfQkNNX0ZJWEVEX1BDUF9NQVBfTlVNICAgOAorCisKK2NvbnN0IGludCBnX2JhbF9iY21fcW9zX3BjcF9tYXBbQkFMX0JDTV9QQ1BfTUFQX05VTV1bQkFMX0JDTV9QQ1BfTUFQX0VOVFJJRVNdID0KK3sKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sICAgICAvKiAwLTcgLS0+IDAgKi8KKyAgICB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sICAgICAvKiAwLTcgLS0+IDEgKi8KKyAgICB7MiwgMiwgMiwgMiwgMiwgMiwgMiwgMn0sICAgICAvKiAwLTcgLS0+IDIgKi8KKyAgICB7MywgMywgMywgMywgMywgMywgMywgM30sICAgICAvKiAwLTcgLS0+IDMgKi8KKyAgICB7NCwgNCwgNCwgNCwgNCwgNCwgNCwgNH0sICAgICAvKiAwLTcgLS0+IDQgKi8KKyAgICB7NSwgNSwgNSwgNSwgNSwgNSwgNSwgNX0sICAgICAvKiAwLTcgLS0+IDUgKi8KKyAgICB7NiwgNiwgNiwgNiwgNiwgNiwgNiwgNn0sICAgICAvKiAwLTcgLS0+IDYgKi8KKyAgICB7NywgNywgNywgNywgNywgNywgNywgN30sICAgICAvKiAwLTcgLS0+IDcgKi8KKyAgICB7MSwgMiwgMywgNCwgNSwgNiwgNywgMH0sICAgICAvKiAwLTYgLS0+IDEtNywgNyAgLT4wICAgIG9mZnNldCA9IDEgb3IgLTcgKi8KKyAgICB7MiwgMywgNCwgNSwgNiwgNywgMCwgMX0sICAgICAvKiAwLTUgLS0+IDItNywgNi03LT4wLTEgIG9mZnNldCA9IDIgb3IgLTYgKi8KKyAgICB7MywgNCwgNSwgNiwgNywgMCwgMSwgMn0sICAgICAvKiAwLTQgLS0+IDMtNywgNS03LT4wLTIgIG9mZnNldCA9IDMgb3IgLTUgKi8KKyAgICB7NCwgNSwgNiwgNywgMCwgMSwgMiwgM30sICAgICAvKiAwLTMgLS0+IDQtNywgNC03LT4wLTMgIG9mZnNldCA9IDQgb3IgLTQgKi8KKyAgICB7NSwgNiwgNywgMCwgMSwgMiwgMywgNH0sICAgICAvKiAwLTIgLS0+IDUtNywgMy03LT4wLTQgIG9mZnNldCA9IDUgb3IgLTMgKi8KKyAgICB7NiwgNywgMCwgMSwgMiwgMywgNCwgNX0sICAgICAvKiAwLTEgLS0+IDYtNywgMi03LT4wLTUgIG9mZnNldCA9IDYgb3IgLTIgKi8KKyAgICB7NywgMCwgMSwgMiwgMywgNCwgNSwgNn0sICAgICAvKiAwICAgLS0+IDcsICAgMS03LT4wLTYgIG9mZnNldCA9IDcgb3IgLTEgKi8gIAorfTsKKworc3RhdGljIGludCBnX2JhbF9iY21fcGNwX3JlbWFya19tYXBfaWRbQkFMX0JDTV9QQ1BfTUFQX05VTV07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIENyZWF0ZSB0aGUgUENQIHJlbWFyayBtYXBwaW5nIHRhYmxlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgbWFwcGluZyBmcm9tIFBDUCBiaXRzIGluIHRoZQorICogZnJhbWVzIHJlY2VpdmVkIGJ5IERQUCB0byB0aGUgaW50ZXJuYWwgcHJpb3JpdHkgaW4KKyAqIERQUC4gVGhlIGNyZWF0ZWQgbWFwIGlkIGFyZSB1c2VkIGluIHRoZSBpbmdyZXNzIHZsYW4gdHJhbnNsYXRpb24gQVBJCisgKiB0byBwZXJmb3JtIFBDUCBiaXRzIHJlcGxhY2VtZW50LgorICoKKyAqIAorICogQHBhcmFtIHVuaXQgICAgU0RLIHVuaXQgbnVtYmVyCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgICAgICAgICAgICAgCQorYmNtb3NfZXJybm8gYmFsX3N3X2RwcF9wY3BfcmVtYXJrX21hcHNfaW5pdChpbnQgdW5pdCkKK3sKKyAgICBiY21fZXJyb3JfdCBzZGtfcmMgPSBCQ01fRV9OT05FOworICAgIGJjbV9xb3NfbWFwX3QgbDJfaW5fbWFwOworICAgIGludCBtYXBfaWQsIHBjcDsgICAgCisgICAgaW50MzJfdCBxb3NfbWFwX2lkOworCisgIAorICAgIGZvcihtYXBfaWQ9MDsgbWFwX2lkIDwgQkFMX0JDTV9QQ1BfTUFQX05VTTsgbWFwX2lkKyspCisgICAgeworICAgICAgICAvKiBpbiBjYXNlIGFueXRoaW5nIGdvZXMgd3JvbmcgKi8KKyAgICAgICAgZ19iYWxfYmNtX3BjcF9yZW1hcmtfbWFwX2lkW21hcF9pZF0gPSBCQUxfQkNNX0lOVkFMSURfUENQX01BUF9JRDsKKyAgICAgICAgCisgICAgICAgIC8qIENyZWF0ZSBhIG1hcCBvYmplY3QgKi8KKyAgICAgICAgc2RrX3JjID0gYmNtX3Fvc19tYXBfY3JlYXRlKHVuaXQsIEJDTV9RT1NfTUFQX0lOR1JFU1N8IEJDTV9RT1NfTUFQX0wyX1ZMQU5fUENQLCAmcW9zX21hcF9pZCk7CisgICAgICAgIGlmIChzZGtfcmMgIT0gQkNNX0VfTk9ORSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEVycm9yICovCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJiY21fcW9zX21hcF9jcmVhdGUgZmFpbGVkIHdpdGggJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmNtX2Vycm1zZyhzZGtfcmMpKTsKKworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKworICAgICAgICAvKiBDcmVhdGUgYSBtYXBwaW5nIGZvciBlYWNoIFBDUCBiaXRzIHZhbHVlLiAqLworICAgICAgICBmb3IgKHBjcCA9IDA7IHBjcCA8IEJBTF9CQ01fUENQX01BUF9FTlRSSUVTOyBwY3ArKykgCisgICAgICAgIHsgICAgICAgICAKKyAgICAgICAgICAgIGJjbV9xb3NfbWFwX3RfaW5pdCgmbDJfaW5fbWFwKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogSW5ncmVzcyBQQ1AvQ29TIHZhbHVlICovCisgICAgICAgICAgICBsMl9pbl9tYXAucGt0X3ByaSA9IGdfYmFsX2JjbV9xb3NfcGNwX21hcFttYXBfaWRdW3BjcF07ICAgICAgCisgCisgICAgICAgICAgICAvKiBTZXQgaW50ZXJuYWwgcHJpb3JpdHkgZm9yIHRoaXMgaW5ncmVzcyBwcmkgKi8KKyAgICAgICAgICAgIGwyX2luX21hcC5pbnRfcHJpID0gcGNwOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBTZXQgY29sb3IgZm9yIHRoaXMgaW5ncmVzcyBQcmlvcml0eSAgKi8KKyAgICAgICAgICAgIGwyX2luX21hcC5jb2xvciA9IGJjbUNvbG9yR3JlZW47CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNka19yYyA9IGJjbV9xb3NfbWFwX2FkZCh1bml0LCBCQ01fUU9TX01BUF9MMl9PVVRFUl9UQUd8QkNNX1FPU19NQVBfTDJ8QkNNX1FPU19NQVBfTDJfVkxBTl9QQ1AsICZsMl9pbl9tYXAsIHFvc19tYXBfaWQpOworICAgICAgICAgICAgaWYgKHNka19yYyAhPSBCQ01fRV9OT05FKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBFcnJvciAqLworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiY21fcW9zX21hcF9hZGQgZmFpbGVkIHdpdGggJXMsIGZvciBwY3AgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbV9lcnJtc2coc2RrX3JjKSwgcGNwKTsKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIH0KKworICAgICAgICBnX2JhbF9iY21fcGNwX3JlbWFya19tYXBfaWRbbWFwX2lkXSA9IHFvc19tYXBfaWQ7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBSZXRyaWV2ZSBQQ1AgcmVtYXJrIG1hcHBpbmcgdGFibGUgSUQgYWNjb3JkaW5nIHRvIHRoZSB0cmFuc2xhdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmUgdGhlIHByZS1jcmVhdGVkIG1hcHBpbmcgdGFibGUgaWQgYXNzb2NpYXRlIHdpdGgKKyAqIHRoZSB0cmFuc2xhdGlvbi4KKyAqIFRoZSBjcmVhdGVkIG1hcCBpZCBjYW4gYmUgdXNlZCBpbiB0aGUgaW5ncmVzcyB2bGFuIHRyYW5zbGF0aW9uIEFQSQorICogdG8gcGVyZm9ybSBQQ1AgYml0cyByZXBsYWNlbWVudC4KKyAqCisgKiBAcGFyYW0gc3JjX3BjcCAgICB0aGUgcGNwIHZhbHVlIHRoYXQgbmVlZCB0byBiZSB0cmFuc2xhdGVkLCBvciAtMSBmb3IgRE9OVENBUkUKKyAqIEBwYXJhbSBkc3RfcGNwICAgIHRoZSB0cmFuc2xhdGVkIHBjcCB2YWx1ZQorICogQHBhcmFtIHBfbWFwX2lkICAgcG9pbnRlciBmb3IgdGhlIHJldHJpZXZlZCBpZAorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiYWxfc3dfZHBwX3BjcF9yZW1hcmtfbWFwX2dldChpbnQgc3JjX3BjcCwgaW50IGRzdF9wY3AsIGludCAqcF9tYXBfaWQpCit7CisgICAgaW50IG9mZnNldDsKKyAgICB1bnNpZ25lZCBpbnQgaW5keDsKKyAgICAKKyAgICBpZihkc3RfcGNwIDwgMCB8fCBkc3RfcGNwID4gQkFMX0JDTV9NQVhfUENQX1ZBTFVFKQorICAgIHsKKyAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICIlcygpOiBpbnZhbGlkIGRlc3RpbmF0aW9uIHBjcCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGRzdF9wY3ApOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICAvKiBpZiBzb3VyY2UgaXMgRE9OVENBUkUsIGkuZSBtYXAgdG8gYSBmaXhlZCBQQ1AsIHVzZSB0aGUgZmlyc3QgOCBtYXAgdGFibGVzICovCisgICAgaWYoc3JjX3BjcCA9PSAtMSkKKyAgICB7CisgICAgICAgICpwX21hcF9pZCA9IGdfYmFsX2JjbV9wY3BfcmVtYXJrX21hcF9pZFtkc3RfcGNwXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoc3JjX3BjcCA8IDAgfHwgc3JjX3BjcCA+IEJBTF9CQ01fTUFYX1BDUF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgIiVzKCk6IGludmFsaWQgc291cmNlIHBjcCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNyY19wY3ApOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgICAgICAvKiBmaW5kIG91dCB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIHNyY19wY3AgYW5kIGRzdF9wY3AgKi8KKyAgICAgICAgb2Zmc2V0ID0gZHN0X3BjcCAtIHNyY19wY3A7CisgICAgICAgIGlmIChvZmZzZXQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgIiVzKCk6IHNvdXJjZSBwY3AgJWQgPT0gZGVzdGluYXRpb24gcGNwICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNyY19wY3AsIGRzdF9wY3ApOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfSAgICAgIAorICAgICAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRoZSBhYm92ZSBtYXAgdGFibGVzICovCisgICAgICAgICAgICBvZmZzZXQgKz0gQkFMX0JDTV9QQ1BfTUFQX0VOVFJJRVM7CisgICAgICAgIH0KKworICAgICAgICBpbmR4ID0gb2Zmc2V0ICsgQkFMX0JDTV9GSVhFRF9QQ1BfTUFQX05VTSAtIDE7CisgICAgICAgIGlmKGluZHggPj0gQkFMX0JDTV9QQ1BfTUFQX05VTSkKKyAgICAgICAgeworICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAiJXMoKTogc29tZXRoaW5nIGlzIHdyb25nLCBpbnZhbGlkIG1hcCBpbmRleCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGluZHgpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICAgICAgLyogaW5kZXggaXMgMCBiYXNlZCAqLworICAgICAgICAqcF9tYXBfaWQgPSBnX2JhbF9iY21fcGNwX3JlbWFya19tYXBfaWRbaW5keF07CisgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgIiVzKCk6IHBiaXRzIHRyYW5zbGF0ZSAlZCAtPiAlZCB1c2luZyBiYWwgcW9zIG1hcCB0YWJsZSAlZCwgaWQgMHgleFxuIiwgX19GVU5DVElPTl9fLCBzcmNfcGNwLCBkc3RfcGNwLCBpbmR4LCAqcF9tYXBfaWQpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjZW5kaWYgIC8qIFRFU1RfU1dfVVRJTF9MT09QQkFDSyAqLworCisvKkB9Ki8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX3Fvc19tYXAuaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX3Fvc19tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzNlNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfcW9zX21hcC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIGJhbF9kcHBfcW9zX21hcC5oCisgKgorICogQGJyaWVmIGJhbCBxb3MgbWFwIHNlcnZpY2UgZnVuY3Rpb24gaGVhZGVyIGZpbGUgZm9yIERVTkUgUEFDS0VUIFBST0NFU1NPUgorICogCisgKi8KKyAKKyNpZm5kZWYgIF9CQUxfRFBQX1FPU19NQVBfSF8KKyNkZWZpbmUgIF9CQUxfRFBQX1FPU19NQVBfSF8KKy8qQHsqLworCisjaW5jbHVkZSAiYmNtb3NfZXJybm8uaCIKKworI2RlZmluZSBCQUxfQkNNX0lOVkFMSURfUENQX01BUF9JRCAgIC0xCisKK2JjbW9zX2Vycm5vIGJhbF9zd19kcHBfcGNwX3JlbWFya19tYXBzX2luaXQoaW50IHVuaXQpOworYmNtb3NfZXJybm8gYmFsX3N3X2RwcF9wY3BfcmVtYXJrX21hcF9nZXQoaW50IHNyY19wY3AsIGludCBkc3RfcGNwLCBpbnQgKnBfbWFwX2lkKTsKKworLypAfSovCisgCisjZW5kaWYgLyogX0JBTF9EUFBfUU9TX01BUF9IICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF92c3dpdGNoLmMgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9kcHAvYmFsX2RwcF92c3dpdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4MWUxZgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX3Zzd2l0Y2guYwpAQCAtMCwwICsxLDc4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKyAvKioKKyAqIEBmaWxlIGJhbF9kcHBfdnN3aXRjaC5jCisgKiBAYnJpZWYgQkFMIFN3aXRjaCB1dGlsIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgdnN3aXRjaCBzZXJ2aWNlIHJlcXVlc3RzCisgKiBAYWRkdG9ncm91cCBzd191dGlsCisgKi8KKworLypAeyovCisjaW5jbHVkZSA8YmFsX2NvbW1vbi5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgPGJhbF91dGlsc19tc2cuaD4KKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorCisjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSworI2luY2x1ZGUgPGJjbS90eXBlcy5oPgorI2luY2x1ZGUgPHNhbC9jb3JlL2xpYmMuaD4KKyNpZm5kZWYgc2FsX21lbXNldAorI2RlZmluZSBzYWxfbWVtc2V0IG1lbXNldAorI2VuZGlmCisjaW5jbHVkZSA8YmNtL3BvcnQuaD4KKyNpbmNsdWRlIDxiY20vdmxhbi5oPgorI2luY2x1ZGUgPGJjbS9lcnJvci5oPgorI2luY2x1ZGUgPGJjbS92c3dpdGNoLmg+CisKKyNpbmNsdWRlICJiYWxfc3dpdGNoX2Zsb3cuaCIKKyNpbmNsdWRlICJiYWxfZHBwX3Zzd2l0Y2guaCIKKyNpbmNsdWRlICJiYWxfc3dpdGNoX3V0aWwuaCIKKworLyogQSBsb2NhbCBsaW5rIGxpc3QgdG8ga2VlcCB0cmFrIG9mIHZpcnR1YWwgc3dpdGNoIHNlcnZpY2UgKi8KK1RBSUxRX0hFQUQoYmFsX3N3X3ZzaV9saXN0X2hlYWQsIGJhbF9zd192c2lfc2VydmljZSkgZ19zd3V0aWxfdnNpX2xpc3Q7CisKKy8qKgorICogQGJyaWVmIFRoZSB2c2kgbGlzdCBpbml0IGZ1bmN0aW9uIHByZXBhcmUgYSBsaW5rIGxpc3QgdG8ga2VlcCB0cmFjayBvZiAKKyAqICAgICAgICB2c2kgc2VydmljZSBpbiB0aGUgc3dpdGNoIHV0aWwKKyAqCisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfdnNpX2xpc3RfaW5pdCh2b2lkKQoreworICAgIHN0YXRpYyB1aW50MzJfdCBnX3ZzaV9pbml0ZWQgPSAwOworICAgIGlmKGdfdnNpX2luaXRlZCA9PSAwKQorICAgIHsKKyAgICAgICAgVEFJTFFfSU5JVCgmZ19zd3V0aWxfdnNpX2xpc3QpOworICAgICAgICBnX3ZzaV9pbml0ZWQgPSAxOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIHZzaSBsaXN0IHNlYXJjaCBmdW5jdGlvbiBieSBMSUYgdGFnCisgKgorICogQHBhcmFtIHBfbGlmX3RhZyBhIHBvaW50ZXIgdG8gdGhlIHBhY2tldCB0YWcgdGhhdCBuZWVkIHRvIG1hdGNoIHRoZSBlbnRyeSBpbiB0aGUgbGlzdAorICogQHBhcmFtIHBfc3ZjX2luZHggIGEgcG9pbnRlciB0byBzdG9yZSB0aGUgY3JlYXRlZCBzZXJ2aWNlIHRhZyBpbmRleCB3aXRoaW4gdGhlIHZzaSAKKyAKKyAqIEByZXR1cm4gcG9pbnRlciB0byBhbiBlbGVtZW50IGluIHRoZSBsaXN0LCBOVUxMIGlmIGZhaWxlZAorICovCitzdGF0aWMgYmFsX3N3X3ZzaV9zZXJ2aWNlICpiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfZ2V0X2J5X3RhZyhiYWxfc3dfbGlmX3BrdF90YWcgKnBfbGlmX3RhZywgdWludDMyX3QgKnBfc3ZjX2luZHgpCit7CisgICAgYmFsX3N3X3ZzaV9zZXJ2aWNlICpwX2VudHJ5LCAqcF90ZW1wOworICAgIGludCBsaWZfbWF0Y2ggPSAwLCBzdmNfaWR4OworICAgIAorICAgIGlmKHBfc3ZjX2luZHggPT0gTlVMTCkKKyAgICB7IAorICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgImNhbGwgVlNJIHNlcnZpY2UgZ2V0IHRhZyB3aXRoIGludmFsaWQgcGFyYW1ldGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIAorICAgIC8qIGNsZWFyIHRoZSBzdG9yYWdlIGFyZWEgKi8KKyAgICAqcF9zdmNfaW5keCA9IDA7CisgICAgCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKHBfZW50cnksICZnX3N3dXRpbF92c2lfbGlzdCwgbmV4dF9zZXJ2aWNlLCBwX3RlbXApCisgICAgeyAgCisgICAgICAgIGZvcihzdmNfaWR4ID0gMDsgc3ZjX2lkeCA8IHBfZW50cnktPm51bV90YWc7IHN2Y19pZHgrKykKKyAgICAgICAgeyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIHBfZW50cnktPnBrdF90YWdbc3ZjX2lkeF0udHlwZSA9PSBwX2xpZl90YWctPnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwX2xpZl90YWctPnR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9TSU5HTEVfVEFHOgorICAgICAgICAgICAgICAgICAgICBpZiggcF9saWZfdGFnLT5vX3ZpZCA9PSBwX2VudHJ5LT5wa3RfdGFnW3N2Y19pZHhdLm9fdmlkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaWZfbWF0Y2ggPSAxOworICAgICAgICAgICAgICAgICAgICB9ICAgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BLVF9UQUdfVFlQRV9ET1VCTEVfVEFHOgorICAgICAgICAgICAgICAgICAgICBpZiggcF9saWZfdGFnLT5vX3ZpZCA9PSBwX2VudHJ5LT5wa3RfdGFnW3N2Y19pZHhdLm9fdmlkICYmIHBfbGlmX3RhZy0+aV92aWQgPT0gcF9lbnRyeS0+cGt0X3RhZ1tzdmNfaWR4XS5pX3ZpZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlmX21hdGNoID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9QS1RfVEFHX1RZUEVfVU5UQUdHRUQ6CisgICAgICAgICAgICAgICAgICAgIGxpZl9tYXRjaCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiVW5zdXBwb3J0ZWQgcGFja2V0IHR5cGUgJWQgaW4gTElGIGluZm9cbiIsIHBfbGlmX3RhZy0+dHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihsaWZfbWF0Y2gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZihwX3N2Y19pbmR4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdmNfaW5keCA9IHN2Y19pZHg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBfZW50cnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgcmVhY2ggdGhlIGVuZCBvZiB0aGUgbGlzdCwgVEFJTFFfRk9SRUFDSF9TQUZFIHNldCB0aGUgcF9lbnRyeSB0byBOVUxMICovCisgICAgcmV0dXJuIE5VTEw7CisgICAKK30KKworLyoKKyAqIEBicmllZiBUaGUgdnNpIGxpc3QgaW5zZXJ0IGZ1bmN0aW9uCisgKgorICogQHBhcmFtIGVudHJ5ICB0aGUgdnNpIGVsZW1lbnQgdG8gYmUgYWRkZWQgaW4gdGhlIGxpbmsgbGlzdAorICogQHJldHVybiBlcnJvciBjb2RlCisqLworc3RhdGljIGJhbF9zd192c2lfc2VydmljZSAqYmFsX3N3X3V0aWxfdnNpX2xpc3RfaW5zZXJ0KGJhbF9zd192c2lfc2VydmljZSAgKnBfZW50cnkpCit7CisgICAgYmFsX3N3X3ZzaV9zZXJ2aWNlICpwX25ld19lbnRyeTsKKworICAgIHBfbmV3X2VudHJ5ID0gYmNtb3NfY2FsbG9jKHNpemVvZihiYWxfc3dfdnNpX3NlcnZpY2UpKTsKKyAgICBpZihOVUxMID09IHBfbmV3X2VudHJ5KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJWU0kgbGlzdCBpbnNlcnQgb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAqcF9uZXdfZW50cnkgPSAqcF9lbnRyeTsKKyAgICBUQUlMUV9JTlNFUlRfVEFJTCgmZ19zd3V0aWxfdnNpX2xpc3QsIHBfbmV3X2VudHJ5LCBuZXh0X3NlcnZpY2UpOworICAgIHJldHVybiBwX25ld19lbnRyeTsKK30KKworLyoKKyAqIEBicmllZiBUaGUgdnNpIGxpc3QgcmVtb3ZlIGZ1bmN0aW9uCisgKgorICogQHBhcmFtIHBfZW50cnkgUG9pbnRlciB0byB0aGUgdnNpIGVsZW1lbnQgaW4gdGhlIGxpbmsgbGlzdCByZXN1bHQgZnJvbSB0aGUgc2VhcmNoIGZ1bmN0aW9ucworICogQHJldHVybiBlcnJvciBjb2RlCisqLworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9zd191dGlsX3ZzaV9saXN0X3JlbW92ZShiYWxfc3dfdnNpX3NlcnZpY2UgKnBfZW50cnkpCit7CisgICAgVEFJTFFfUkVNT1ZFKCZnX3N3dXRpbF92c2lfbGlzdCwgcF9lbnRyeSwgbmV4dF9zZXJ2aWNlKTsKKyAgICBiY21vc19mcmVlKHBfZW50cnkpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioKKyAqIEBicmllZiBUaGUgdnNpIGNyZWF0ZSBmdW5jdGlvbiBjcmVhdGUgYSB2aXJ0dWFsIHN3aXRjaCBzZXJ2aWNlIHRoYXQgY29udGFpbnMgaW5ncmVzcyBMSUYgCisgKiAgICAgICAgYW5kIHZpcnR1YWwgc3dpdGNoLiBUaGlzIHNlcnZpY2UgY2FuIGxhdGVyIGJlIGNvbm5lY3RlZCB0byBtdWx0aXBsZSBlZ3Jlc3MgTElGIG9mIG11bHRpcGxlIEZMT1dzLiAgCisgKiAgICAgICAgVGhlIGZ1bmN0aW9uIHVzZSB0aGUgc291cmNlIHBvcnQgYW5kIHZpZCBpbmZvcm1hdGlvbiBpbiB0aGUgYmNtYmFsX2Zsb3dfY2ZnIGFzIGlucHV0CisgKiAgICAgICAgVGhlIHBvaW50ZXIgb2YgdGhlIGNyZWF0ZWQgdnNpIHdpbGwgYmUgcmV0dXJuZWQKKyAqICAgICAgICBTaW5jZSBhIHZzaSBjYW4gcHJvdmlkZSBtdWx0aXBsZSBzcmV2aWNlcywgdGhlIGluZGV4IHRvIHRoZSBjcmVhdGVkIHNlcnZpY2UgdGFnIGlzIHJldHVybiBoZXJlCisgKiAgCisgKiBAcGFyYW0gdW5pdCAgICAgICAgc3dpdGNoIGRldmljZSBpZCAKKyAqIEBwYXJhbSBwX2Zsb3cgICAgICBhIHBvaW50ZXIgdG8gdGhlIGZsb3cgZGVmaW5pdGlvbiB3aGljaCB0aGUgY3JlYXRlZCBzZXJ2aWNlIHdpbGwgYmUgYmFzZWQgb24KKyAqIEBwYXJhbSBwX3N2Y19pbmR4ICBhIHBvaW50ZXIgdG8gc3RvcmUgdGhlIGNyZWF0ZWQgc2VydmljZSB0YWcgaW5kZXggd2l0aGluIHRoZSB2c2kgIAorICogCisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIHZzaSBzZXJ2aWNlIGxpc3QgZW50cnksIE5VTEwgaWYgb3BlcmF0aW9uIGZhaWxlZAorICovCisKK2JhbF9zd192c2lfc2VydmljZSAqYmFsX3N3X3V0aWxfZHBwX3ZzaV9zZXJ2aWNlX2NyZWF0ZShpbnQgdW5pdCwgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3csIHVpbnQzMl90ICpwX3N2Y19pbmR4KQoreworICAgIGludCBydjsKKyAgICBiYWxfc3dfbGlmX3BrdF90YWcgc3ZjX3BrdF90YWcgPSB7MH07CisgICAgYmFsX3N3X3ZzaV9zZXJ2aWNlICpwX3ZzaV9zZXJ2aWNlLCB2c2lfc3ZjX2VsbTsKKyAgICBiY21fdmxhbl90IHZzaTsKKyAgICBpbnQgbXVsdGljYXN0X2lkLCBmbGFnczsKKyAgICAKKyAgICAvKiBwX2Zsb3cgY2FuIGJlIE5VTEwgd2hlbiBjcmVhdGUgdnN3aXRjaCBmb3IgbXVsdGljYXN0IGdyb3VwLCBzZXJ2aWNlIHRhZyB3aWxsIGJlIGFkZGVkIHdoZW4gbXVsdGljYXN0IGZsb3cgaXMgY3JlYXRlZCAqLworICAgIGlmIChwX2Zsb3cgPT0gTlVMTCkgCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiY3JlYXRlIHZzaSBzZXJ2aWNlIHdpdGggbm8gc2VydmljZSB0YWcgXG4iKTsKKyAgICAgICAgcF92c2lfc2VydmljZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGZpbmQgb3V0IGlmIHRoZSB2c2kgc2VydmljZSBhbHJlYWR5IGV4aXN0ICovCisgICAgICAgIHN2Y19wa3RfdGFnLnR5cGUgPSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5wa3RfdGFnX3R5cGU7CisgICAgICAgIHN2Y19wa3RfdGFnLm9fdmlkID0gcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIub192aWQ7CisgICAgICAgIHN2Y19wa3RfdGFnLmlfdmlkID0gcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuaV92aWQ7CisgICAgICAgIHBfdnNpX3NlcnZpY2UgPSBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfZ2V0X2J5X3RhZygmc3ZjX3BrdF90YWcsIHBfc3ZjX2luZHgpOworICAgIH0KKyAgICAKKyAgICAvKiBpZiBubyBzZXJ2aWNlLCBjcmVhdGUgb25lICovCisgICAgaWYocF92c2lfc2VydmljZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogaW5pdGlhbGl6ZSBsaW5rIGxpc3QgdnNpIGVsZW1lbnQgKi8KKyAgICAgICAgbWVtc2V0KCZ2c2lfc3ZjX2VsbSwgMCwgc2l6ZW9mIChiYWxfc3dfdnNpX3NlcnZpY2UpKTsKKyAgICAgICAgLyogaWYgZmxvdyAoc2VydmljZSB0YWcpIGlzIHNwZWNpZmllZCwgZmlsbCBpbiB0aGUgYmFzaWMgaW5mbywgc2luY2UgaXQgaXMgbmV3LCBhZGQgaXQgdG8gdGhlIGZpcnN0IHRhZyAqLworICAgICAgICBpZihwX2Zsb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZzaV9zdmNfZWxtLnBrdF90YWdbMF0gPSBzdmNfcGt0X3RhZzsKKyAgICAgICAgICAgIHZzaV9zdmNfZWxtLm51bV90YWcgPSAxOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBydiA9IGJjbV92c3dpdGNoX2NyZWF0ZSh1bml0LCAmdnNpKTsKKyAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiYmNtX3Zzd2l0Y2hfY3JlYXRlIGZhaWxlZCAlZCBcbiIsIHJ2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiB2c3dpdGNoIDB4JXggY3JlYXRlZFxuIiwgdnNpKTsKKyAgICAgICAgfQorICAgICAgICB2c2lfc3ZjX2VsbS52c3dpdGNoID0gdnNpOworICAgICAgICAvKiBjcmVhdGUgdHdvIG11bHRpY2FzdCBncm91cHMgKGEuay5hLiBmbG9vZGluZyBncm91cCksIG9uZSBmb3IgdXBzdHJlYW0gYW5kIG9uZSBmb3IgZG93bnN0cmVhbQorICAgICAgICAgICBjbGVhbiB1cCBmaXJzdCwgaXQgaXMgT0sgdGhlcmUgaXMgbm90aGluZyB0byBkZXN0cm95ICovCisKKyAgICAgICAgLyogQ3JlYXRlIHRoZSBtdWx0aWNhc3QgZ3JvdXAgdXNlZCBmb3IgdXBzdHJlYW0gZmxvb2RpbmcKKyAgICAgICAgICogKFBPTi0tPk5OSSkuIEZvciB0aGUgdXBzdHJlYW0gbWNhc3QgZ3JvdXAsIHRoZSBRQVggaGFyZHdhcmUKKyAgICAgICAgICogcmVxdWlyZXMgdGhlIElEIHRvIGJlIHNldCB0byBhIHZhbHVlIGVxdWFsIHRvIHRoZSBWU0kgSUQKKyAgICAgICAgICogY3JlYXRlZCBhYm92ZS4KKyAgICAgICAgICovCisgICAgICAgIG11bHRpY2FzdF9pZCA9IHZzaSArIEJBTF9EUFBfVVNfRkxPT0RfT0ZGU0VUOworICAgICAgICBydiA9IGJjbV9tdWx0aWNhc3RfZ3JvdXBfaXNfZnJlZSh1bml0LCBtdWx0aWNhc3RfaWQpOworICAgICAgICBpZiAocnYgPT0gQkNNX0VfRVhJU1RTKQorICAgICAgICB7CisgICAgICAgICAgICBydiA9IGJjbV9tdWx0aWNhc3RfZGVzdHJveSh1bml0LCBtdWx0aWNhc3RfaWQpOworICAgICAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJVUzogYmNtX211bHRpY2FzdF9kZXN0cm95IDB4JXggZmFpbGVkICVkIFxuIiwgbXVsdGljYXN0X2lkLCBydik7CisgICAgICAgICAgICAgICAgYmNtX3Zzd2l0Y2hfZGVzdHJveSh1bml0LCB2c2kpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBmbGFncyA9IGluZ3Jlc3MgcmVwbGljYXRpb24gKyBmaXhlZCBpZCArIEwyIG11bHRpY2FzdCAqLworICAgICAgICBmbGFncyA9IEJDTV9NVUxUSUNBU1RfSU5HUkVTU19HUk9VUCB8IEJDTV9NVUxUSUNBU1RfV0lUSF9JRCB8IEJDTV9NVUxUSUNBU1RfVFlQRV9MMjsKKyAgICAgICAgcnYgPSBiY21fbXVsdGljYXN0X2NyZWF0ZSh1bml0LCBmbGFncywgJm11bHRpY2FzdF9pZCk7CisgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiVVM6IGluIGJjbV9tdWx0aWNhc3RfY3JlYXRlIDB4JXggdyBpbmdyZXNzIGZhaWxlZCAlZCBcbiIsIG11bHRpY2FzdF9pZCwgcnYpOworICAgICAgICAgICBiY21fdnN3aXRjaF9kZXN0cm95KHVuaXQsIHZzaSk7CisgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiVVM6IHZzd2l0Y2ggZmxvb2QgZ3JvdXAgMHgleCBjcmVhdGVkXG4iLCBtdWx0aWNhc3RfaWQpOworICAgICAgICB9CisgICAgICAgIHZzaV9zdmNfZWxtLnVzX2Zsb29kX2dycF9pZCA9IG11bHRpY2FzdF9pZDsKKworICAgICAgICAvKiBkb3duc3RyZWFtIGZsb29kaW5nIGdyb3VwICovCisgICAgICAgIG11bHRpY2FzdF9pZCA9IHZzaSArIEJBTF9EUFBfRFNfRkxPT0RfT0ZGU0VUOworICAgICAgICBydiA9IGJjbV9tdWx0aWNhc3RfZ3JvdXBfaXNfZnJlZSh1bml0LCBtdWx0aWNhc3RfaWQpOworICAgICAgICBpZiAocnYgPT0gQkNNX0VfRVhJU1RTKQorICAgICAgICB7CisgICAgICAgICAgICBydiA9IGJjbV9tdWx0aWNhc3RfZGVzdHJveSh1bml0LCBtdWx0aWNhc3RfaWQpOworICAgICAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJEUzogYmNtX211bHRpY2FzdF9kZXN0cm95IDB4JXggZmFpbGVkICVkIFxuIiwgbXVsdGljYXN0X2lkLCBydik7CisgICAgICAgICAgICAgICAgYmNtX211bHRpY2FzdF9kZXN0cm95KHVuaXQsIHZzaV9zdmNfZWxtLnVzX2Zsb29kX2dycF9pZCk7CisgICAgICAgICAgICAgICAgYmNtX3Zzd2l0Y2hfZGVzdHJveSh1bml0LCB2c2kpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IEJDTV9NVUxUSUNBU1RfSU5HUkVTU19HUk9VUCB8IEJDTV9NVUxUSUNBU1RfV0lUSF9JRCB8IEJDTV9NVUxUSUNBU1RfVFlQRV9MMjsKKyAgICAgICAgcnYgPSBiY21fbXVsdGljYXN0X2NyZWF0ZSh1bml0LCBmbGFncywgJm11bHRpY2FzdF9pZCk7CisgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRFM6IGluIGJjbV9tdWx0aWNhc3RfY3JlYXRlIDB4JXggdyBpbmdyZXNzIDIgZmFpbGVkICVkIFxuIiwgbXVsdGljYXN0X2lkLCBydik7CisgICAgICAgICAgIGJjbV9tdWx0aWNhc3RfZGVzdHJveSh1bml0LCB2c2lfc3ZjX2VsbS51c19mbG9vZF9ncnBfaWQpOworICAgICAgICAgICBiY21fdnN3aXRjaF9kZXN0cm95KHVuaXQsIHZzaSk7CisgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiRFM6IHZzd2l0Y2ggZmxvb2QgZ3JvdXAgMHgleCBjcmVhdGVkXG4iLCBtdWx0aWNhc3RfaWQpOworICAgICAgICB9CisgICAgICAgIHZzaV9zdmNfZWxtLmRzX2Zsb29kX2dycF9pZCA9IG11bHRpY2FzdF9pZDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLyogYWRkIHZzaSBzZXJ2aWNlIHRvIHRoZSB2c2kgbGlzdCAqLworICAgICAgICBwX3ZzaV9zZXJ2aWNlID0gYmFsX3N3X3V0aWxfdnNpX2xpc3RfaW5zZXJ0KCZ2c2lfc3ZjX2VsbSk7CisgICAgICAgIGlmIChwX3ZzaV9zZXJ2aWNlID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiVlNJOiBmYWlsIHRvIGluc2VydCBuZXcgdnNpIHRvIHRoZSBzZXJ2aWNlIGxpc3RcbiIpOworICAgICAgICAgICAgYmNtX211bHRpY2FzdF9kZXN0cm95KHVuaXQsIHZzaV9zdmNfZWxtLnVzX2Zsb29kX2dycF9pZCk7CisgICAgICAgICAgICBiY21fbXVsdGljYXN0X2Rlc3Ryb3kodW5pdCwgdnNpX3N2Y19lbG0uZHNfZmxvb2RfZ3JwX2lkKTsKKyAgICAgICAgICAgIGJjbV92c3dpdGNoX2Rlc3Ryb3kodW5pdCwgdnNpX3N2Y19lbG0udnN3aXRjaCk7ICAgCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgCisgICAgICAgIH0KKyAgICAgICAgIHBfdnNpX3NlcnZpY2UtPnVzZV9jb3VudCA9IDE7CisgICAgfSAKKyAgICBlbHNlCisgICAgeworICAgICAgICBwX3ZzaV9zZXJ2aWNlLT51c2VfY291bnQrKzsKKyAgICB9ICAgICAgICAgCisKKyAgICByZXR1cm4gcF92c2lfc2VydmljZTsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIHZzaSBkZXN0cm95IGZ1bmN0aW9uIGZyZWUgdXAgSGFyZGFyZSByZXNvdXJjZSBvZiBhIHZpcnR1YWwgc3dpdGNoLiAKKyAqICAgICAgICBJdCBhbHNvIHJlbW92ZSB0aGUgdnNpIGZyb210IHRoZSBzZXJ2aWNlIGxpc3QKKyAqCisgKiBAcGFyYW0gdW5pdCAgICAgICAgc3dpdGNoIGRldmljZSBpZCAKKyAqIEBwYXJhbSBwX3ZzaV9zdmMgICBhIHBvaW50ZXIgdG8gdGhlIHZzaSBzZXJ2aWNlCisgKiAKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCisKK2JjbW9zX2Vycm5vIGJhbF9zd191dGlsX2RwcF92c2lfc2VydmljZV9kZXN0cm95KGludCB1bml0LCBiYWxfc3dfdnNpX3NlcnZpY2UgKnBfdnNpX3N2YykKK3sKKyAgICBpbnQgcnY7CisgICAgCisgICAgIC8qIGlucHV0IHZhbGlkYXRpb24gKi8KKyAgICBpZiAocF92c2lfc3ZjID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJkZXN0cm95IHZzaSBzZXJ2aWNlIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzIFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIAorICAgIC8qIG9ubHkgY2xlYW4gdXAgd2hlbiBubyBtb3JlIHVzZXJzICovCisgICAgaWYocF92c2lfc3ZjLT51c2VfY291bnQgPiAxKQorICAgIHsKKyAgICAgICAgcF92c2lfc3ZjLT51c2VfY291bnQtLTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7ICAgCisgICAgfQorICAgIAorICAgIC8qIGZyZWUgdXAgSFcgcmVzb3VyY2UsIGNvbnRpbnVlIGV2ZW4gaWYgYW55IGZhaWxlZCAqLworICAgIHJ2ID0gYmNtX211bHRpY2FzdF9kZXN0cm95KHVuaXQsIHBfdnNpX3N2Yy0+dXNfZmxvb2RfZ3JwX2lkKTsKKyAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coV0FSTklORywgbG9nX2lkX3N3X3V0aWwsICJiY21fbXVsdGljYXN0X2Rlc3Ryb3kgVVMgMHgleCBmYWlsZWQgJWQgXG4iLCBwX3ZzaV9zdmMtPnVzX2Zsb29kX2dycF9pZCwgcnYpOworICAgIH0KKyAgICBydiA9IGJjbV9tdWx0aWNhc3RfZGVzdHJveSh1bml0LCBwX3ZzaV9zdmMtPmRzX2Zsb29kX2dycF9pZCk7CisgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgeworICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLCAiYmNtX211bHRpY2FzdF9kZXN0cm95IERTIDB4JXggZmFpbGVkICVkIFxuIiwgcF92c2lfc3ZjLT5kc19mbG9vZF9ncnBfaWQsIHJ2KTsKKyAgICB9CisgICAgcnYgPSBiY21fdnN3aXRjaF9kZXN0cm95KHVuaXQsIHBfdnNpX3N2Yy0+dnN3aXRjaCk7CisgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgeworICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLCAiYmNtX211bHRpY2FzdF9kZXN0cm95IHZzd2l0Y2ggMHgleCBmYWlsZWQgJWQgXG4iLCBwX3ZzaV9zdmMtPnZzd2l0Y2gsIHJ2KTsKKyAgICB9ICAgIAorICAgIAorICAgIC8qIHJlbW92ZSBmcm9tIHRoZSBzZXJ2aWNlIGxpc3QgKi8KKyAgICBydiA9IGJhbF9zd191dGlsX3ZzaV9saXN0X3JlbW92ZShwX3ZzaV9zdmMpOworICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBsb2dfaWRfc3dfdXRpbCwgImJjbV9tdWx0aWNhc3RfZGVzdHJveSBWU0kgZW50cnkgZmFpbGVkICVkIFxuIiwgcnYpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKioKKyAqIEBicmllZiBUaGUgdnNpIHBvcnRfZmluZCBmdW5jdGlvbiBzZWFyY2ggYSBwb3J0IGZyb20gdGhlIHBvcnQgbGlzdCBvZiBhIHZzaSBzZXJ2aWNlIGVudHJ5LiAKKyAqCisgKiBAcGFyYW0gcF92c2lfc3ZjICAgYSBwb2ludGVyIHRvIHRoZSB2c2kgc2VydmljZQorICogQHBhcmFtIHN2Y190YWdfaW5keCBhbiBpbmRleCB0byB0aGUgc2VydmljZSB3aXRoaW4gdGhlIHZzaSB0aGF0IGEgcG9ydCBuZWVkIHRvIGJlIHNlYXJjaGVkCisgKiBAcGFyYW0gcG9ydCAgICAgICAgdGhlIGluZ3Jlc3MgcG9ydCB0aGF0IG5lZWRzIHRvIGJlIGxvY2F0ZWQKKyAqIEBwYXJhbSBpZHggICAgICAgICBwb2ludGVyIHRvIGEgc3RvcmFnZSB3aGVyZSB0aGUgYXJyYXkgaW5kZXggb2YgdGhlIGZvdW5kIHBvcnQgd2lsbCBiZSByZXR1cm4KKyAqIAorICogQHJldHVybiAgICAgICAgICAgZXJyb3IgY29kZQorICovCisKK3N0YXRpYyBiY21vc19lcnJubyBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfcG9ydF9maW5kKGJhbF9zd192c2lfc2VydmljZSAqcF92c2lfc3ZjLCB1aW50MzJfdCBzdmNfdGFnX2luZHgsIHVpbnQzMl90IHBvcnQsIHVpbnQzMl90ICppZHgpCit7CisgICAgaW50IGk7CisgICAgCisgICAgLyogaW5wdXQgdmFsaWRhdGlvbiAqLworICAgIGlmIChwX3ZzaV9zdmMgPT0gTlVMTCkgCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgInZzaSBzZXJ2aWNlIHBvcnQgZmluZCBmdW5jdGlvbiB3aXRoIGludmFsaWQgcGFyYW1ldGVycyBcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICAvKiBsb29wIHRocm91Z2ggdGhlIGxpc3QgKi8KKyAgICBmb3IoIGk9MDsgaTxwX3ZzaV9zdmMtPnBrdF90YWdbc3ZjX3RhZ19pbmR4XS5udW1fcG9ydDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYocF92c2lfc3ZjLT5wa3RfdGFnW3N2Y190YWdfaW5keF0ucG9ydFtpXS5wb3J0ID09IHBvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IHBfdnNpX3N2Yy0+cGt0X3RhZ1tzdmNfdGFnX2luZHhdLm51bV9wb3J0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorICAgICppZHggPSBpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioKKyAqIEBicmllZiBUaGUgdnNpIHBvcnRfZmluZCBmdW5jdGlvbiBzZWFyY2ggYSBncG9ydCBmcm9tIHRoZSBwb3J0IGxpc3Qgb2YgYSB2c2kgc2VydmljZSBlbnRyeS4gCisgKgorICogQHBhcmFtIHBfdnNpX3N2YyAgIGEgcG9pbnRlciB0byB0aGUgdnNpIHNlcnZpY2UKKyAqIEBwYXJhbSBzdmNfdGFnX2luZHggYW4gaW5kZXggdG8gdGhlIHNlcnZpY2Ugd2l0aGluIHRoZSB2c2kgdGhhdCBhIGdwb3J0IG5lZWQgdG8gYmUgc2VhcmNoZWQKKyAqIEBwYXJhbSBncG9ydCAgICAgICB0aGUgaW5ncmVzcyBncG9ydCB0aGF0IG5lZWRzIHRvIGJlIGxvY2F0ZWQKKyAqIEBwYXJhbSBpZHggICAgICAgICBwb2ludGVyIHRvIGEgc3RvcmFnZSB3aGVyZSB0aGUgYXJyYXkgaW5kZXggb2YgdGhlIGZvdW5kIHBvcnQgd2lsbCBiZSByZXR1cm4KKyAqIAorICogQHJldHVybiAgICAgICAgICAgZXJyb3IgY29kZQorICovCisKK3N0YXRpYyBiY21vc19lcnJubyBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfZ3BvcnRfZmluZChiYWxfc3dfdnNpX3NlcnZpY2UgKnBfdnNpX3N2YywgdWludDMyX3Qgc3ZjX3RhZ19pbmR4LCB1aW50MzJfdCBncG9ydCwgdWludDMyX3QgKmlkeCkKK3sKKyAgICBpbnQgaTsKKyAgICAKKyAgICAvKiBpbnB1dCB2YWxpZGF0aW9uICovCisgICAgaWYgKHBfdnNpX3N2YyA9PSBOVUxMKSAKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAidnNpIHNlcnZpY2UgcG9ydCBmaW5kIGZ1bmN0aW9uIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzIFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIC8qIGxvb3AgdGhyb3VnaCB0aGUgbGlzdCAqLworICAgIGZvciggaT0wOyBpPHBfdnNpX3N2Yy0+cGt0X3RhZ1tzdmNfdGFnX2luZHhdLm51bV9wb3J0OyBpKyspCisgICAgeworICAgICAgICBpZihwX3ZzaV9zdmMtPnBrdF90YWdbc3ZjX3RhZ19pbmR4XS5wb3J0W2ldLmdwb3J0ID09IGdwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBwX3ZzaV9zdmMtPnBrdF90YWdbc3ZjX3RhZ19pbmR4XS5udW1fcG9ydCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKyAgICAqaWR4ID0gaTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqCisgKiBAYnJpZWYgVGhlIHZzaSBwb3J0X2FkZCBmdW5jdGlvbiBhZGQgYW4gaW5ncmVzcyBwb3J0IHRvIHRoZSB2c2kgc2VydmljZS4KKyAgICAgICAgICBJZiB0aGUgcG9ydCBpcyBhbHJlYWR5IGluIHRoZSB2c2ksIGp1c3QgaW5jcmVhc2UgdGhlIGNvdW50ZXIKKyAgICAgICAgICBJZiB0aGUgcG9ydCBpcyBub3QgaW4gdGhlIHZzaSwgY3JlYXRlIGEgZ3BvcnQgYW5kIGFkZCBpdCB0byB0aGUgVVMgZmxvb2RpbmcgZ3JvdXAuCisgICAgICAgICAgVGhpcyBhbGxvd3MgdGhlIFVTIFNQRUFLX0ZJUlNUIHBhY2tldHMgdG8gYmUgZm9yd2FyZGVkIHRvIHRoZSBuZXR3b3JrLiAgIAorICoKKyAqIEBwYXJhbSB1bml0ICAgICAgICBzd2l0Y2ggZGV2aWNlIGlkIAorICogQHBhcmFtIHBfdnNpX3N2YyAgIGEgcG9pbnRlciB0byB0aGUgdnNpIHNlcnZpY2UKKyAqIEBwYXJhbSBzdmNfdGFnX2luZHggYW4gaW5kZXggdG8gdGhlIHNlcnZpY2Ugd2l0aGluIHRoZSB2c2kgdGhhdCBhIHBvcnQgbmVlZCB0byBiZSBhZGRlZAorICogQHBhcmFtIHBvcnQgICAgICAgIHRoZSBpbmdyZXNzIHBvcnQgdGhhdCBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgdnNpIHNlcnZpY2UKKyAqIEBwYXJhbSBwX2dwb3J0ICAgICBhIHZhbGlkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQvZXhpc3RpbmcgZ3BvcnQgd2lsbCBiZSByZXR1cm5lZC4KKyAqICAgICAgICAgICAgICAgICAgICBOVUxMLCBpZiBjYWxsZXIgZG9uJ3QgY2FyZSB0aGUgZ3BvcnQgIAorICogCisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyAqLworCitiY21vc19lcnJubyBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfcG9ydF9hZGQoaW50IHVuaXQsIGJhbF9zd192c2lfc2VydmljZSAqcF92c2lfc3ZjLCB1aW50MzJfdCBzdmNfdGFnX2luZHgsIHVpbnQzMl90IHBvcnQsIGludDMyX3QgKnBfZ3BvcnQpCit7CisgICAgYmNtX3ZsYW5fcG9ydF90IHZwOworICAgIHVpbnQzMl90IGlkeDsKKyAgICBpbnQgaW5kLCBydjsKKyAgICBpbnQzMl90IGdwb3J0OworICAgIGJjbW9zX2Vycm5vIHJldDsKKyAgICBpbnQgcG9ydF9lbmNhcF9pZDsKKworICAgIC8qIGlucHV0IHZhbGlkYXRpb24gKi8KKyAgICBpZiAocF92c2lfc3ZjID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJ2c2kgc2VydmljZSBwb3J0IGFkZCBmdW5jdGlvbiB3aXRoIGludmFsaWQgcGFyYW1ldGVycyBcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICAvKiBjaGVjayBpZiB0aGUgcG9ydCBhbHJlYWR5IGluIHRoZSB2c2kgKi8KKyAgICByZXQgPSBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfcG9ydF9maW5kKHBfdnNpX3N2Yywgc3ZjX3RhZ19pbmR4LCBwb3J0LCAmaWR4KTsKKyAgICAvKiBpZiBwb3J0IGFscmVhZHkgaW4gdGhlIHZzaSwganVzdCBpbmNyZWFzZSB0aGUgY291bnRlciAqLworICAgIGlmKHJldCA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgaWYocF9ncG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgKnBfZ3BvcnQgPSBwX3ZzaV9zdmMtPnBrdF90YWdbc3ZjX3RhZ19pbmR4XS5wb3J0W2lkeF0uZ3BvcnQ7CisgICAgICAgIH0KKyAgICAgICAgKHBfdnNpX3N2Yy0+cGt0X3RhZ1tzdmNfdGFnX2luZHhdLnBvcnRbaWR4XS51c2VfY291bnQpKys7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICAKKyAgICAvKiBjcmVhdGUgdGhlIExJRiAqLworICAgIGJjbV92bGFuX3BvcnRfdF9pbml0KCZ2cCk7CisgICAgdnAucG9ydCA9IHBvcnQ7CisgICAgLyogY29uZmlndXJlIGZyYW1lIG1hdGNoIGFjY29yZGluZyB0byB0aGUgc2VydmljZSBwYWNrZXQgdGFncyAqLworICAgIHN3aXRjaChwX3ZzaV9zdmMtPnBrdF90YWdbc3ZjX3RhZ19pbmR4XS50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01CQUxfUEtUX1RBR19UWVBFX1VOVEFHR0VEOgorICAgICAgICAgICAgdnAuY3JpdGVyaWEgPSBCQ01fVkxBTl9QT1JUX01BVENIX1BPUlQ7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9QS1RfVEFHX1RZUEVfU0lOR0xFX1RBRzoKKyAgICAgICAgICAgIHZwLmNyaXRlcmlhID0gQkNNX1ZMQU5fUE9SVF9NQVRDSF9QT1JUX1ZMQU47CisgICAgICAgICAgICB2cC5tYXRjaF92bGFuID0gcF92c2lfc3ZjLT5wa3RfdGFnW3N2Y190YWdfaW5keF0ub192aWQ7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9QS1RfVEFHX1RZUEVfRE9VQkxFX1RBRzoKKyAgICAgICAgICAgIHZwLmNyaXRlcmlhID0gQkNNX1ZMQU5fUE9SVF9NQVRDSF9QT1JUX1ZMQU5fU1RBQ0tFRDsKKyAgICAgICAgICAgIHZwLm1hdGNoX3ZsYW4gPSBwX3ZzaV9zdmMtPnBrdF90YWdbc3ZjX3RhZ19pbmR4XS5vX3ZpZDsKKyAgICAgICAgICAgIHZwLm1hdGNoX2lubmVyX3ZsYW4gPSBwX3ZzaV9zdmMtPnBrdF90YWdbc3ZjX3RhZ19pbmR4XS5pX3ZpZDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBzaG91bGQgbm90IHJlYWNoIGhlcmUgKi8KKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiVlNJOiBVbnN1cHBvcnRlZCBwYWNrZXQgdHlwZSAlZCBcbiIscF92c2lfc3ZjLT5wa3RfdGFnW3N2Y190YWdfaW5keF0udHlwZSApOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICB2cC52c2kgPSAwOyAvKiB3aWxsIGJlIHBvcHVsYXRlZCB3aGVuIHRoZSBncG9ydCBpcyBhZGRlZCB0byBzZXJ2aWNlLCB1c2luZyB2c3dpdGNoX3BvcnRfYWRkICovICAgICAgCisgICAgdnAuZmxhZ3MgPSBCQ01fVkxBTl9QT1JUX09VVEVSX1ZMQU5fUFJFU0VSVkUgIHwgQkNNX1ZMQU5fUE9SVF9JTk5FUl9WTEFOX1BSRVNFUlZFOworCisgICAgcnYgPSBiY21fdmxhbl9wb3J0X2NyZWF0ZSh1bml0LCAmdnApOworICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiVlNJOiBiY21fdmxhbl9wb3J0X2NyZWF0ZSBwb3J0ICVkLCBmYWlsZWQgJWRcbiIsIHBvcnQsIHJ2KTsKKyAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworICAgIGdwb3J0ID0gdnAudmxhbl9wb3J0X2lkOworCisgICAgLy8gYWRkIGdwb3J0IHRvIHZzd2l0Y2gKKyAgICBydiA9IGJjbV92c3dpdGNoX3BvcnRfYWRkKHVuaXQsIHBfdnNpX3N2Yy0+dnN3aXRjaCwgZ3BvcnQpOworICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgIHsKKyAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiVlNJLCBiY21fdnN3aXRjaF9wb3J0X2FkZCBmb3IgcG9ydCAlZCBmYWlsZWQgJWRcbiIsIHBvcnQsIHJ2KTsKKyAgICAgICAgIGJjbV92bGFuX3BvcnRfZGVzdHJveSh1bml0LCBncG9ydCk7ICAgICAgICAgCisgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsgICAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLCAiVlNJOiBiY21fdnN3aXRjaF9wb3J0X2FkZCBmb3IgcG9ydCAlZCwgZ3BvcnQgMHgleFxuIiwgcG9ydCwgZ3BvcnQpOworICAgIH0KKyAgICAvKiBpZiBjYWxsZXIgcmVxdXJlIGZvciB0aGUgZ3BvcnQgaW5mbywgcmV0dXJuIHRoZSBncG9ydCAqLworICAgIGlmKHBfZ3BvcnQpCisgICAgeworICAgICAgICAqcF9ncG9ydCA9IGdwb3J0OworICAgIH0KKyAgICAvKiByZWNvcmQgdGhlIGdwb3J0IGludG8gdGhlIHZzaSAqLworICAgIGluZCA9IHBfdnNpX3N2Yy0+cGt0X3RhZ1tzdmNfdGFnX2luZHhdLm51bV9wb3J0OworICAgIGlmIChpbmQgPT0gTUFYX05FVF9QT1JUKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJWU0ksIHJlYWNoIG1heCBwb3J0IGFsbG93XG4iKTsKKyAgICAgICAgYmNtX3Zzd2l0Y2hfcG9ydF9kZWxldGUodW5pdCwgcF92c2lfc3ZjLT52c3dpdGNoLCBncG9ydCk7CisgICAgICAgIGJjbV92bGFuX3BvcnRfZGVzdHJveSh1bml0LCBncG9ydCk7ICAgICAgICAgCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOyAgICAgICAgICAKKyAgICB9CisgICAgcF92c2lfc3ZjLT5wa3RfdGFnW3N2Y190YWdfaW5keF0ucG9ydFtpbmRdLnBvcnQgPSBwb3J0OworICAgIHBfdnNpX3N2Yy0+cGt0X3RhZ1tzdmNfdGFnX2luZHhdLnBvcnRbaW5kXS5ncG9ydCA9IGdwb3J0OworICAgIHBfdnNpX3N2Yy0+cGt0X3RhZ1tzdmNfdGFnX2luZHhdLnBvcnRbaW5kXS51c2VfY291bnQgPSAxOworICAgIHBfdnNpX3N2Yy0+cGt0X3RhZ1tzdmNfdGFnX2luZHhdLm51bV9wb3J0ID0gKytpbmQ7CisKKyAgICByZXQgPSBCQ01fRVJSX09LOworICAgIGRvCisgICAgeworICAgICAgICAvLyB1cGRhdGUgZmxvb2RpbmcgZ3JvdXAgd2l0aCBwaHlfcG9ydC9ncG9ydCBhcyBpbmdyZXNzIHBvcnQKKyAgICAgICAgcnYgPSBiY21fbXVsdGljYXN0X3ZsYW5fZW5jYXBfZ2V0KHVuaXQsIHBfdnNpX3N2Yy0+dXNfZmxvb2RfZ3JwX2lkLCBwb3J0LCBncG9ydCwgJnBvcnRfZW5jYXBfaWQpOworICAgICAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGJjbV9tdWx0aWNhc3Rfdmxhbl9lbmNhcF9nZXQgZm9yIHBvcnQgZmFpbGVkICVkXG4iLCBydik7CisgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgLyogYmUgYSBtZW1iZXIgb2YgdGhlIHVwc3RyZWFtIGZsb29kaW5nIGdyb3VwICovCisgICAgICAgIHJ2ID0gYmNtX211bHRpY2FzdF9pbmdyZXNzX2FkZCh1bml0LCBwX3ZzaV9zdmMtPnVzX2Zsb29kX2dycF9pZCwgcG9ydCwgcG9ydF9lbmNhcF9pZCk7CisgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgYmNtX211bHRpY2FzdF9pbmdyZXNzX2FkZCBmb3IgcG9ydCBmYWlsZWQgJWRcbiIsIHJ2KTsgICAgIAorICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIG5vdyBzZXQgdGhlIHR5cGUgb2YgcGFja2V0cyB0aGF0IGdvZXMgdG8gdGhlIGRvd25zdHJlYW0gZmxvb2RpbmcgZ3JvdXAgKi8KKyAgICAgICAgLyogZm9yd2FyZCB1bmtub3duIHVuaWNhc3QgKi8gICAgICAgIAorICAgICAgICBydiA9IGJjbV9wb3J0X2NvbnRyb2xfc2V0KHVuaXQsIGdwb3J0LCBiY21Qb3J0Q29udHJvbEZsb29kVW5rbm93blVjYXN0R3JvdXAsIEJBTF9EUFBfRFNfRkxPT0RfT0ZGU0VUKTsKKyAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBiY21fcG9ydF9jb250cm9sX3NldCB1Y2FzdCBmb3Igbm5pIGZhaWxlZCAlZFxuIiwgcnYpOworICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogZHJvcCB1bmtub3duIG11bHRpY2FzdCAqLworICAgICAgICBydiA9IGJjbV9wb3J0X2NvbnRyb2xfc2V0KHVuaXQsIGdwb3J0LCBiY21Qb3J0Q29udHJvbEZsb29kVW5rbm93bk1jYXN0R3JvdXAsIEJDTV9HUE9SVF9CTEFDS19IT0xFKTsKKyAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBiY21fcG9ydF9jb250cm9sX3NldCBtY2FzdCBmb3Igbm5pIGZhaWxlZCAlZFxuIiwgcnYpOworICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIGZvcndhcmQgYnJvYWRjYXN0ICovCisgICAgICAgIHJ2ID0gYmNtX3BvcnRfY29udHJvbF9zZXQodW5pdCwgZ3BvcnQsIGJjbVBvcnRDb250cm9sRmxvb2RCcm9hZGNhc3RHcm91cCwgQkFMX0RQUF9EU19GTE9PRF9PRkZTRVQpOworICAgICAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGJjbV9wb3J0X2NvbnRyb2xfc2V0IGJjYXN0IGZvciBubmkgZmFpbGVkICVkXG4iLCBydik7CisgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH13aGlsZSgwKTsKKyAgICAKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEBicmllZiBUaGUgdnNpIHBvcnRfcmVtIGZ1bmN0aW9uIHJlbW92ZSBhbiBpbmdyZXNzIHBvcnQgdG8gdGhlIHZzaSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB1bml0ICAgICAgICBzd2l0Y2ggZGV2aWNlIGlkIAorICogQHBhcmFtIHBfdnNpX3N2YyAgIGEgcG9pbnRlciB0byB0aGUgdnNpIHNlcnZpY2UKKyAqIEBwYXJhbSBzdmNfdGFnX2luZHggYW4gaW5kZXggdG8gdGhlIHNlcnZpY2Ugd2l0aGluIHRoZSB2c2kgdGhhdCBhIHBvcnQgbmVlZCB0byBiZSByZW1vdmVkCisgKiBAcGFyYW0gZ3BvcnQgICAgICAgdGhlIGluZ3Jlc3MgZ3BvcnQgdGhhdCBuZWVkcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIHZzaSBzZXJ2aWNlCisgKgorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KKworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX3ZzaV9zZXJ2aWNlX3BvcnRfcmVtKGludCB1bml0LCBiYWxfc3dfdnNpX3NlcnZpY2UgKnBfdnNpX3N2YywgdWludDMyX3Qgc3ZjX3RhZ19pbmR4LCB1aW50MzJfdCBncG9ydCkKK3sKKyAgICB1aW50MzJfdCBpZHg7OworICAgIGludCBwb3J0X2VuY2FwX2lkLCBydiwgaTsKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGludCBwb3J0OworICAgIC8qIGlucHV0IHZhbGlkYXRpb24gKi8KKyAgICBpZiAocF92c2lfc3ZjID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJ2c2kgc2VydmljZSBwb3J0IHJlbSBmdW5jdGlvbiB3aXRoIGludmFsaWQgcGFyYW1ldGVycyBcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICAvKiBjaGVjayBpZiB0aGUgcG9ydCBpbiB0aGUgdnNpICovCisgICAgcmV0ID0gYmFsX3N3X3V0aWxfZHBwX3ZzaV9zZXJ2aWNlX2dwb3J0X2ZpbmQocF92c2lfc3ZjLCBzdmNfdGFnX2luZHgsIGdwb3J0LCAmaWR4KTsKKyAgICBpZihyZXQgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIHZzaSBzZXJ2aWNlIHBvcnQgZmluZCBmb3IgZ3BvcnQgJWQgZmFpbGVkXG4iLCBncG9ydCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIC8qIG9ubHkgcmVtb3ZlIGZyb20gdGhlIGFycmF5IHdoZW4gbm8gZmxvdyByZWZlcmVuY2UgaXQgKi8KKyAgICBpZihwX3ZzaV9zdmMtPnBrdF90YWdbc3ZjX3RhZ19pbmR4XS5wb3J0W2lkeF0udXNlX2NvdW50ID4gMSkKKyAgICB7IAorICAgICAgICAocF92c2lfc3ZjLT5wa3RfdGFnW3N2Y190YWdfaW5keF0ucG9ydFtpZHhdLnVzZV9jb3VudCktLTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgCisgICAgcG9ydCA9IHBfdnNpX3N2Yy0+cGt0X3RhZ1tzdmNfdGFnX2luZHhdLnBvcnRbaWR4XS5wb3J0OworICAgIAorICAgIC8qIGNvbXBhY3QgdGhlIHBvcnQgbGlzdCAqLworICAgIGZvcihpPWlkeDsgaTxwX3ZzaV9zdmMtPnBrdF90YWdbc3ZjX3RhZ19pbmR4XS5udW1fcG9ydC0xOyBpKyspCisgICAgeworICAgICAgICBwX3ZzaV9zdmMtPnBrdF90YWdbc3ZjX3RhZ19pbmR4XS5wb3J0W2ldID0gcF92c2lfc3ZjLT5wa3RfdGFnW3N2Y190YWdfaW5keF0ucG9ydFtpKzFdOworICAgIH0KKyAgICBtZW1zZXQoJnBfdnNpX3N2Yy0+cGt0X3RhZ1tzdmNfdGFnX2luZHhdLnBvcnRbaV0sIDAsIHNpemVvZiAoYmFsX3N3X2xpZl9wb3J0KSk7CisgICAgCisgICAgKHBfdnNpX3N2Yy0+cGt0X3RhZ1tzdmNfdGFnX2luZHhdLm51bV9wb3J0KS0tOyAKKyAgICAKKyAgICByZXQgPSBCQ01fRVJSX09LOworICAgIGRvCisgICAgeworICAgICAgICAvKiBmaW5kIHRoZSBlbmNhcF9pZCAqLworICAgICAgICBydiA9IGJjbV9tdWx0aWNhc3Rfdmxhbl9lbmNhcF9nZXQodW5pdCwgcF92c2lfc3ZjLT51c19mbG9vZF9ncnBfaWQsIHBvcnQsIGdwb3J0LCAmcG9ydF9lbmNhcF9pZCk7CisgICAgICAgIGlmIChydiAhPSBCQ01fRV9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJFcnJvciwgYmNtX211bHRpY2FzdF92bGFuX2VuY2FwX2dldCBmb3IgcG9ydCAlZCBmYWlsZWQgJWRcbiIsIHBvcnQsIHJ2KTsKKyAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAvKiByZW1vdmUgZnJvbSB0aGUgdXBzdHJlYW0gZmxvb2RpbmcgZ3JvdXAgKi8KKyAgICAgICAgcnYgPSBiY21fbXVsdGljYXN0X2luZ3Jlc3NfZGVsZXRlKHVuaXQsIHBfdnNpX3N2Yy0+dXNfZmxvb2RfZ3JwX2lkLCBwb3J0LCBwb3J0X2VuY2FwX2lkKTsKKyAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgIkVycm9yLCBiY21fbXVsdGljYXN0X2luZ3Jlc3NfZGVsZXRlIGZvciBwb3J0ICVkIGZhaWxlZCAlZFxuIiwgcG9ydCwgcnYpOyAgICAgCisgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBydiA9IGJjbV92c3dpdGNoX3BvcnRfZGVsZXRlKHVuaXQsIHBfdnNpX3N2Yy0+dnN3aXRjaCwgZ3BvcnQpOworICAgICAgICBpZiAocnYgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGJjbV92c3dpdGNoX3BvcnRfZGVsZXRlIGZvciBwb3J0ICVkIGZhaWxlZCAlZFxuIiwgcG9ydCwgcnYpOworICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9FTlQ7CisgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIHJ2ID0gYmNtX3ZsYW5fcG9ydF9kZXN0cm95KHVuaXQsIGdwb3J0KTsKKyAgICAgICAgaWYgKHJ2ICE9IEJDTV9FX05PTkUpCisgICAgICAgIHsKKyAgICAgICAgICAgICBCQ01fTE9HKFdBUk5JTkcsIGxvZ19pZF9zd191dGlsLCAiRXJyb3IsIGJjbV92bGFuX3BvcnRfZGVzdHJveSBmb3IgcG9ydCAlZCBmYWlsZWQgJWRcbiIsIHBvcnQsIHJ2KTsKKyAgICAgICAgICAgICAvKiBMaWtlbHkgYSBidWcgaW4gdGhlIDYuNS40IHJlbGVhc2UsIGlnb3JlIGZvciBub3cKKyAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX05PRU5UOworICAgICAgICAgICAgIGJyZWFrOyAgCisgICAgICAgICAgICAgKi8gICAgICAgICAgICAgCisgICAgICAgIH0gICAgCisgICAgfXdoaWxlKDApOworICAgIHJldHVybiAgcmV0OworfQorCisvKioKKyAqIEBicmllZiBUaGUgdnNpX3NlcnZpY2VfdGFnX2FkZCBmdW5jdGlvbiBhZGQgdGhlIHNlcnZpY2UgdGFnIG9mIGEgZmxvdyB0byBhIHZzaSB0YXJnZXQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdW5pdCAgICAgICAgICAgc3dpdGNoIGRldmljZSBpZCAKKyAqIEBwYXJhbSBwX3ZzaV90YXJnZXQgICBhIHBvaW50ZXIgdG8gdGhlIHZzaSBzZXJ2aWNlCisgKiBAcGFyYW0gcF9mbG93ICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmxvdyB0aGF0IGRlZmluZSB0aGUgc2VydmljZSB0YWcgbmVlZCB0byBiZSBhZGRlZAorICogQHBhcmFtIHBfc3ZjX3RhZ19pbmR4IGEgcG9pbnRlciB0byBzdG9yZSB0aGUgcmV0dXJuIHNlcnZpY2UgdGFnIGluZGV4IHRoYXQganVzdCBhZGRlZAorICoKKyAqIEByZXR1cm4gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfdGFnX2FkZChpbnQgdW5pdCwgYmFsX3N3X3ZzaV9zZXJ2aWNlICpwX3ZzaV90YXJnZXQsIGJjbWJhbF9mbG93X2NmZyAqcF9mbG93LCB1aW50MzJfdCAqcF9zdmNfdGFnX2luZHgpCit7CisgICAgYmFsX3N3X2xpZl9wa3RfdGFnIHN2Y19wa3RfdGFnID0gezB9OworICAgIGJhbF9zd192c2lfc2VydmljZSAqcF92c2lfc2VydmljZTsKKyAgICAKKyAgICAvKiBpbnB1dCBwYXJhbWV0ZXJzIGNoZWNraW5nICovCisgICAgaWYgKHBfZmxvdyA9PSBOVUxMIHx8IHBfdnNpX3RhcmdldCA9PSBOVUxMIHx8IHBfc3ZjX3RhZ19pbmR4ID09IE5VTEwpIAorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICJpbnZhbGlkIHBhcmFtZXRlcnMgd2hlbiBhZGRpbmcgdnNpIHNlcnZpY2UgdGFnIFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfSAgICAKKyAgICAKKyAgICAvKiBmaW5kIG91dCBpZiB0aGUgc2VydmljZSB0YWcgYWxyZWFkeSBleGlzdCAqLworICAgIHN2Y19wa3RfdGFnLnR5cGUgPSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5wa3RfdGFnX3R5cGU7CisgICAgc3ZjX3BrdF90YWcub192aWQgPSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3ZpZDsKKyAgICBzdmNfcGt0X3RhZy5pX3ZpZCA9IHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmlfdmlkOworICAgIHBfdnNpX3NlcnZpY2UgPSBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfZ2V0X2J5X3RhZygmc3ZjX3BrdF90YWcsIHBfc3ZjX3RhZ19pbmR4KTsKKyAgICBpZiAocF92c2lfc2VydmljZSkKKyAgICB7CisgICAgICAgIC8qIGlmIHRoZSBzZXJ2aWNlIHRhZyBhbHJlYWR5IGV4aXN0IGluIHRoZSBzeXN0ZW0sIGl0IGhhcyB0byBiZSB3aXRoaW4gdGhlIHNhbWUgdnNpLgorICAgICAgICAgICBXZSBkb24ndCBhbGxvdyBzYW1lIHNlcnZpY2UgdGFnIHRvIGJlIHNlcnZpY2VkIGJ5IG1vcmUgdGhhbiBvbmUgdnNpCisgICAgICAgICAqLworICAgICAgICBpZihwX3ZzaV9zZXJ2aWNlICE9IHBfdnNpX3RhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisKKyAgICAvKiBub3cgYWRkIHRoZSB0YWcgdG8gdGhlIGxpc3QgKi8gICAgICAgCisgICAgcF92c2lfdGFyZ2V0LT5wa3RfdGFnW3BfdnNpX3RhcmdldC0+bnVtX3RhZ10gPSBzdmNfcGt0X3RhZzsKKyAgICAqcF9zdmNfdGFnX2luZHggPSBwX3ZzaV90YXJnZXQtPm51bV90YWc7CisgICAgcF92c2lfdGFyZ2V0LT5udW1fdGFnICsrOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioKKyAqIEBicmllZiBUaGUgdnNpX3NlcnZpY2VfdGFnX3JlbSBmdW5jdGlvbiByZW1vdmUgdGhlIHNlcnZpY2UgdGFnIGluZGV4IGJ5IHN2Y190YWdfaW5keCBmcm9tIGEgdnNpIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHVuaXQgICAgICAgICAgIHN3aXRjaCBkZXZpY2UgaWQgCisgKiBAcGFyYW0gcF92c2lfc3ZjICAgICAgYSBwb2ludGVyIHRvIHRoZSB2c2kgc2VydmljZQorICogQHBhcmFtIHN2Y190YWdfaW5keCAgIGEgc2VydmljZSB0YWcgaW5kZXggcG9pbnQgdG8gdGhlIHNlcnZpY2UgdGFnIGxpc3QgdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQKKyAqCisgKiBAcmV0dXJuIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX3ZzaV9zZXJ2aWNlX3RhZ19yZW0oaW50IHVuaXQsIGJhbF9zd192c2lfc2VydmljZSAqcF92c2lfc3ZjLCB1aW50MzJfdCBzdmNfdGFnX2luZHgpCit7CisgICAgaW50IGk7CisgICAgICAgLyogaW5wdXQgcGFyYW1ldGVycyBjaGVja2luZyAqLworICAgIGlmIChwX3ZzaV9zdmMgPT0gTlVMTCB8fCBwX3ZzaV9zdmMtPm51bV90YWcgPD0gc3ZjX3RhZ19pbmR4KSAKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLCAiaW52YWxpZCBwYXJhbWV0ZXJzIHdoZW4gcmVtb3ZpbmcgdnNpIHNlcnZpY2UgdGFnIFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfSAKKyAgICAvKiBjb21wYWN0IHRoZSB0YWcgbGlzdCAqLworICAgIGZvcihpPXN2Y190YWdfaW5keDsgaTxwX3ZzaV9zdmMtPm51bV90YWctMTsgaSsrKQorICAgIHsKKyAgICAgICAgcF92c2lfc3ZjLT5wa3RfdGFnW2ldID0gcF92c2lfc3ZjLT5wa3RfdGFnW2krMV07CisgICAgfQorICAgIG1lbXNldCgmcF92c2lfc3ZjLT5wa3RfdGFnW2ldLCAwLCBzaXplb2YgKGJhbF9zd19saWZfcGt0X3RhZykpOworICAgIAorICAgIChwX3ZzaV9zdmMtPm51bV90YWcpLS07ICAKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsgICAgCit9CisKKyNlbmRpZiAvKiAjaWZuZGVmIFRFU1RfU1dfVVRJTF9MT09QQkFDSyAqLworLypAfSovCisKKyAKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX3Zzd2l0Y2guaCBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2RwcC9iYWxfZHBwX3Zzd2l0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RkZDkzCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZHBwL2JhbF9kcHBfdnN3aXRjaC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisgLyoqCisgKiBAZmlsZSBiYWxfZHBwX3Zzd2l0Y2guaAorICogQGJyaWVmIEJBTCBTd2l0Y2ggdXRpbCBoZWxwZXIgZnVuY3Rpb25zIHByb3RvdHlwZQorICogQGFkZHRvZ3JvdXAgc3dfdXRpbAorICovCisjaWZuZGVmIF9CQUxfRFBQX1ZTV0lUQ0hfSF8KKyNkZWZpbmUgX0JBTF9EUFBfVlNXSVRDSF9IXworCisjaW5jbHVkZSAiYmFsX3N3aXRjaF9mbG93LmgiCisKKy8qIERQUCBtdWx0aWNhc3QgZ3JvdXAgb2Zmc2V0cyAtIHVzZSB2c2kgYXMgYmFzZSAqLworLyogVGhlIG1jIGdyb3VwIHNob3VsZCBub3Qgb3ZlcmxhcCwgc28gdGhlIGZvbGxvd2luZyBzZXR0aW5nIGxpbWl0IHN5c3RlbSB0byAweDEwMDAgdnNpICovIAorI2RlZmluZSAgQkFMX0RQUF9VU19GTE9PRF9PRkZTRVQgIDB4MAorI2RlZmluZSAgQkFMX0RQUF9EU19GTE9PRF9PRkZTRVQgIDB4MTAwMAorI2RlZmluZSAgQkFMX0RQUF9NQ19PRkZTRVQgICAgICAgIDB4MjAwMAorCisjZGVmaW5lICBNQVhfU1ZDX1BFUl9WU0kgICAgICAgICAgOAorCisvKkB7Ki8KKyNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLCisKK3R5cGVkZWYgc3RydWN0IGJhbF9zd19saWZfcG9ydCBiYWxfc3dfbGlmX3BvcnQ7CitzdHJ1Y3QgYmFsX3N3X2xpZl9wb3J0Cit7CisgICAgdWludDMyX3QgcG9ydDsKKyAgICB1aW50MzJfdCBncG9ydDsKKyAgICBpbnQzMl90ICB1c2VfY291bnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBiYWxfc3dfbGlmX3BrdF90YWcgYmFsX3N3X2xpZl9wa3RfdGFnOworc3RydWN0IGJhbF9zd19saWZfcGt0X3RhZworeworICAgIHVpbnQzMl90IHR5cGU7CisgICAgdWludDMyX3Qgb192aWQ7CisgICAgdWludDMyX3QgaV92aWQ7CisgICAgdWludDMyX3QgbnVtX3BvcnQ7CisgICAgYmFsX3N3X2xpZl9wb3J0IHBvcnRbTUFYX05FVF9QT1JUXTsKK307CisKK3R5cGVkZWYgc3RydWN0IGJhbF9zd192c2lfc2VydmljZSBiYWxfc3dfdnNpX3NlcnZpY2U7CitzdHJ1Y3QgYmFsX3N3X3ZzaV9zZXJ2aWNlCit7CisgICAgdWludDMyX3QgbnVtX3RhZzsKKyAgICBiYWxfc3dfbGlmX3BrdF90YWcgcGt0X3RhZ1tNQVhfU1ZDX1BFUl9WU0ldOyAgCisgICAgdWludDMyX3QgdnN3aXRjaDsKKyAgICB1aW50MzJfdCB1c19mbG9vZF9ncnBfaWQ7CisgICAgdWludDMyX3QgZHNfZmxvb2RfZ3JwX2lkOworICAgIGludDMyX3QgIHVzZV9jb3VudDsgICAgCisgICAgVEFJTFFfRU5UUlkoYmFsX3N3X3ZzaV9zZXJ2aWNlKSBuZXh0X3NlcnZpY2U7Cit9OworCitleHRlcm4gYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX3ZzaV9zZXJ2aWNlX3BvcnRfYWRkKGludCB1bml0LCBiYWxfc3dfdnNpX3NlcnZpY2UgKnBfdnNpX3N2YywgdWludDMyX3Qgc3ZjX3RhZ19pbmR4LCB1aW50MzJfdCBwb3J0LCBpbnQzMl90ICpwX2dwb3J0KTsKK2V4dGVybiBiY21vc19lcnJubyBiYWxfc3dfdXRpbF9kcHBfdnNpX3NlcnZpY2VfcG9ydF9yZW0oaW50IHVuaXQsIGJhbF9zd192c2lfc2VydmljZSAqcF92c2lfc3ZjLCB1aW50MzJfdCBzdmNfdGFnX2luZHgsIHVpbnQzMl90IHBvcnQpOworZXh0ZXJuIGJjbW9zX2Vycm5vIGJhbF9zd191dGlsX2RwcF92c2lfc2VydmljZV90YWdfYWRkKGludCB1bml0LCBiYWxfc3dfdnNpX3NlcnZpY2UgKnBfdnNpX3N2YywgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3csIHVpbnQzMl90ICpwX3N2Y190YWdfaW5keCk7CitleHRlcm4gYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX3ZzaV9zZXJ2aWNlX3RhZ19yZW0oaW50IHVuaXQsIGJhbF9zd192c2lfc2VydmljZSAqcF92c2lfc3ZjLCB1aW50MzJfdCBzdmNfdGFnX2luZHgpOworZXh0ZXJuIGJhbF9zd192c2lfc2VydmljZSAqYmFsX3N3X3V0aWxfZHBwX3ZzaV9zZXJ2aWNlX2NyZWF0ZShpbnQgdW5pdCwgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3csIHVpbnQzMl90ICpwX3N2Y190YWdfaW5keCk7CitleHRlcm4gYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZHBwX3ZzaV9zZXJ2aWNlX2Rlc3Ryb3koaW50IHVuaXQsIGJhbF9zd192c2lfc2VydmljZSAqcF92c2lfc3ZjKTsKK2V4dGVybiBiY21vc19lcnJubyBiYWxfc3dfdXRpbF92c2lfbGlzdF9pbml0KHZvaWQpOworCisjZW5kaWYgLyogVEVTVF9TV19VVElMX0xPT1BCQUNLICovCisvKkB9Ki8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZXN3L01ha2VmaWxlIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZXN3L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDczZjcKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9lc3cvTWFrZWZpbGUKQEAgLTAsMCArMSw0MyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisjICAKKyMgICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorIyAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyAgCisjICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisjICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisjICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyMgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorIyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyMgIAorIyAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorIyAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisjICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisjICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisjICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyMgICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyMgICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisjICAgICBvZiB0aGUgc29mdHdhcmUuCisjICAKKyMgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorIyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisjICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorIyAgd3JpdHRlbiBjb25zZW50LgorIyAgCisjICA6PgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCQUwgU3dpdGNoIFV0aWwgRVNXICAKK01PRF9OQU1FID0gc3dpdGNoX3V0aWxfZXN3CitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSBkZXZfbG9nIHV0aWxzIGJhbF9hcGkgYmFsX2FwcF91dGlscworc3JjcyA9IGJhbF9lc3dfYWNjX3Rlcm0uYyBiYWxfZXN3X2Zsb3cuYyAKK0VYVFJBX0NGTEFHUyArPSAtSSQoU1JDX0RJUikvLi4vLi4vLi4vbWFpbiAtSSQoU1JDX0RJUikvLi4KKworaWZlcSAoIiQoVEVTVF9TV19VVElMX0xPT1BCQUNLKSIsICJ5IikKKwlNT0RfREVGUyArPSAtRFRFU1RfU1dfVVRJTF9MT09QQkFDSworZWxzZQkKKwlNT0RfREVQUyArPSBzd2l0Y2hfc2RrCitlbmRpZgorCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9lc3cvYmFsX2Vzd19hY2NfdGVybS5jIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZXN3L2JhbF9lc3dfYWNjX3Rlcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZjlkZWQzCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZXN3L2JhbF9lc3dfYWNjX3Rlcm0uYwpAQCAtMCwwICsxLDEzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKyNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLCisKKyNpbmNsdWRlIDxiYWxfY29tbW9uLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiYWxfbXNnLmg+CisjaW5jbHVkZSAiYmFsX3N3aXRjaF91dGlsLmgiCisjaW5jbHVkZSAiYmFsX3N3aXRjaF9hY2NfdGVybS5oIgorI2luY2x1ZGUgImJhbF9lc3dfYWNjX3Rlcm0uaCIKKworI2luY2x1ZGUgPGJjbS90eXBlcy5oPgorI2luY2x1ZGUgPGJjbS9wb3J0Lmg+CisKKy8qKgorICogQGZpbGUgYmFsX2Vzd19hY2NfdGVybS5jCisgKiBAYnJpZWYgQkFMIFN3aXRjaCB1dGlsIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSBhY2Nlc3MgdGVybWluYWwgcmVxdWVzdHMgb24gRW50ZXJwcmlzZSBTV2l0Y2ggCisgKiBAYWRkdG9ncm91cCBzd191dGlsCisgKgorICovCisKKy8qQHsqLworCisKKy8qKgorICogQGJyaWVmIENvbm5lY3QgYWNjZXNzIHRlcm1pbmFsIHdpdGggRVNXIGFzIHBhcnQgb2YgdGhlIGNvbXBvbmVudHMKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHN3X3V0aWxfYWNjZXNzX3Rlcm1pbmFsX2Nvbm5lY3QgaW4gdGhlIEJBTCBjb3JlCisgKiB0byBleGVjdXRlIEVTVyBzcGVjaWZpYyBBUEkgZm9yIGFjY2Vzc190ZXJtaW5hbF9jb25uZWN0IHJlcXVlc3QKKyAqIAorICogQHBhcmFtIHBfbmV0X21hcCAgICBQb2ludGVyIHRvIHRoZSBuZXQgcG9ydHMgbWFwcGluZyBmcm9tIGxvZ2ljYWwgbnVtYnJlciB0byBwaHlzaWNhbCBudW1iZXIKKyAqIEBwYXJhbSBwX3Bvbl9tYXAgICAgUG9pbnRlciB0byB0aGUgcG9uIHBvcnRzIG1hcHBpbmcgZnJvbSBsb2dpY2FsIG51bWJyZXIgdG8gcGh5c2ljYWwgbnVtYmVyCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIHN3X3V0aWxfZXN3X2FjY190ZXJtX2Nvbm5lY3QoYmFsX3N3YXBwX3BvcnQgKnBfbmV0X21hcCwgYmFsX3N3YXBwX3BvcnQgKnBfcG9uX21hcCApCit7CisgICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgIGludCAgICAgIHJjID0gMDsKKyAgICAgYmFsX3N3YXBwX3BvcnQgKnBvcnQ7CisgICAgIGJjbV9wYm1wX3QgcG9uX3BibXAsIG5ldF9wYm1wOyAgIAorICAgICAKKyAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwgIiBLVDIgLSBHb3QgYSBhY2Nlc3MgdGVybWluYWwgQ09OTkVDVFxuIik7CisKKyAgICAgQkNNX1BCTVBfQ0xFQVIocG9uX3BibXApOworICAgICBCQ01fUEJNUF9DTEVBUihuZXRfcGJtcCk7CisgCisgICAgIC8qIHNldHVwIHRoZSBkZXZpY2UgSUQgIC0gVGhpcyBpcyB2ZXJ5IGhhcmR3YXJlIHNwZWNpZmljICovCisgICAgIHBvcnQgPSBwX25ldF9tYXA7CisgICAgIC8qIC0xIGluZGljYXRlIHRoZSBlbmQgb2YgdGFibGUgKi8KKyAgICAgd2hpbGUocG9ydC0+cGJtX2lkICE9IC0xKQorICAgICB7ICAgICAgICAKKyAgICAgICAgIC8qIGFkZCBwb3J0IHRvIHRoZSBuZXQgbGlzdCAqLworICAgICAgICAgQkNNX1BCTVBfUE9SVF9BREQobmV0X3BibXAsIHBvcnQtPnBibV9pZCk7CisgICAgICAgICBwb3J0Kys7ICAgICAgICAgCisgICAgIH0gICAgCisgCisgICAgIHBvcnQgPSBwX3Bvbl9tYXA7CisgICAgIHdoaWxlKHBvcnQtPnBibV9pZCAhPSAtMSkKKyAgICAgeyAgICAgICAgCisgICAgICAgICAvKiBhZGQgcG9ydCB0byB0aGUgcG9uIGxpc3QgKi8KKyAgICAgICAgIEJDTV9QQk1QX1BPUlRfQUREKHBvbl9wYm1wLCBwb3J0LT5wYm1faWQpOworICAgICAgICAgcG9ydCsrOyAgICAgICAgIAorICAgICB9IAorICAgICAKKyAgICAvKiBzZXQgdXAgdGhlIHZhbGlkIGVncmVzcyBwb3J0cyBmb3IgcG9uIGZhY2luZyBwb3J0cyAqLworICAgICBwb3J0ID0gcF9wb25fbWFwOworICAgICB3aGlsZShwb3J0LT5wYm1faWQgIT0gLTEpCisgICAgIHsgICAgIAorICAgICAgICAgcmMgPSBiY21fcG9ydF9lZ3Jlc3Nfc2V0KHBvcnQtPmRldmljZV9pZCwgcG9ydC0+cGJtX2lkLCAwLCAvKiBtb2RpZCAqLyBuZXRfcGJtcCk7CisgICAgICAgICBpZiAocmMpCisgICAgICAgICB7CisgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsICIgRVNXIC0gQWRkIHBvcnQgJWQgdG8gcG9uIGludGVyZmFjZSBmYWlsZWRcbiIsIHBvcnQtPnBibV9pZCApOworICAgICAgICAgfQorICAgICAgICAgcG9ydCsrOworICAgICB9ICAgCisgICAgCisgICAgIC8qIHNldCB1cCB0aGUgdmFsaWQgZWdyZXNzIHBvcnRzIGZvciBuZXQgZmFjaW5nIHBvcnRzICovCisgICAgIHBvcnQgPSBwX25ldF9tYXA7CisgICAgIHdoaWxlKHBvcnQtPnBibV9pZCAhPSAtMSkKKyAgICAgeyAgICAgCisgICAgICAgICByYyA9IGJjbV9wb3J0X2VncmVzc19zZXQocG9ydC0+ZGV2aWNlX2lkLCBwb3J0LT5wYm1faWQsIDAsIC8qIG1vZGlkICovIHBvbl9wYm1wKTsKKyAgICAgICAgIGlmIChyYykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgIiBFU1cgLSBBZGQgcG9ydCAlZCB0byBuZXQgaW50ZXJmYWNlIGZhaWxlZFxuIiwgcG9ydC0+cGJtX2lkICk7CisgICAgICAgICB9CisgICAgICAgICBwb3J0Kys7CisgICAgIH0KKyAgICAgICAgICAgICAKKyAgICAgLyogdHJhbnNsYXRlIElORyBlcnJvciBjb2RlIHRvIEJBTCBlcnJvciBjb2RlICovIAorICAgICBpZiAocmMpCisgICAgIHsKKyAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgIH0KKyAgICAgZWxzZQorICAgICB7CisgICAgICAgICByZXQgPSBCQ01fRVJSX09LOworICAgICB9CisgICAgIHJldHVybiByZXQ7Cit9CisKKy8qQH0qLworI2VuZGlmIC8qICNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9lc3cvYmFsX2Vzd19hY2NfdGVybS5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZXN3L2JhbF9lc3dfYWNjX3Rlcm0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMzQzZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZXN3L2JhbF9lc3dfYWNjX3Rlcm0uaApAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfZXN3X2FjY190ZXJtLmgKKyAqCisgKiBAYnJpZWYgYmFsIHN3aXRjaCBlc3cgdXRpbCBhY2Nlc3MgdGVybWluYWwgc2VydmljZSBmdW5jdGlvbiBoZWFkZXIgZmlsZQorICoKKyAqIEBhZGR0b2dyb3VwIHN3X3V0aWwKKyAqLworIAorI2lmbmRlZiAgX0JBTF9FU1dfQUNDX1RFUk1fSF8KKyNkZWZpbmUgIF9CQUxfRVNXX0FDQ19URVJNX0hfCisKKy8qQHsqLworI2luY2x1ZGUgImJjbW9zX2Vycm5vLmgiCisjaW5jbHVkZSAiYmFsX3N3aXRjaF91dGlsLmgiCisjaW5jbHVkZSAiYmFsX3N3aXRjaF9hY2NfdGVybS5oIgorCitleHRlcm4gYmNtb3NfZXJybm8gc3dfdXRpbF9lc3dfYWNjX3Rlcm1fY29ubmVjdChiYWxfc3dhcHBfcG9ydCAqcF9uZXRfbWFwLCBiYWxfc3dhcHBfcG9ydCAqcF9wb25fbWFwKTsKKworLypAfSovCisgCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2Vzdy9iYWxfZXN3X2Zsb3cuYyBiL2JhbF9yZWxlYXNlL3NyYy9jb3JlL3V0aWwvc3dpdGNoL2Vzdy9iYWxfZXN3X2Zsb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yN2QzM2FmCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZXN3L2JhbF9lc3dfZmxvdy5jCkBAIC0wLDAgKzEsNTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfZXN3X2Zsb3cuYworICogQGJyaWVmIEJBTCBTd2l0Y2ggdXRpbCBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgZmxvdyByZXF1ZXN0cworICogQGFkZHRvZ3JvdXAgc3dfdXRpbAorICovCisgCisgLypAeyovCisjaW5jbHVkZSA8YmFsX2NvbW1vbi5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgImJhbF9zd2l0Y2hfZmxvdy5oIgorI2luY2x1ZGUgImZsb3dfZnNtLmgiCisjaW5jbHVkZSAiYmNtb3NfZXJybm8uaCIKKyNpbmNsdWRlICJiYWxfc3dpdGNoX3V0aWwuaCIKKworI2lmbmRlZiBURVNUX1NXX1VUSUxfTE9PUEJBQ0sKKyNpbmNsdWRlIDxiY20vdHlwZXMuaD4KKyNpbmNsdWRlIDxzYWwvY29yZS9saWJjLmg+CisjaWZuZGVmIHNhbF9tZW1zZXQKKyNkZWZpbmUgc2FsX21lbXNldCBtZW1zZXQKKyNlbmRpZgorI2luY2x1ZGUgPGJjbS9wb3J0Lmg+CisjaW5jbHVkZSA8YmNtL3ZsYW4uaD4KKyNpbmNsdWRlIDxiY20vZmllbGQuaD4KKyNpbmNsdWRlIDxiY20vZXJyb3IuaD4KKyNpbmNsdWRlIDxzYWwvY29yZS9saWJjLmg+CisKKyNpbmNsdWRlICJiYWxfc3dpdGNoX2FjY190ZXJtLmgiCisjaW5jbHVkZSAiYmFsX2Vzd19mbG93LmgiCisvKioKKyAqIEBicmllZiBUaGUgYWNsIGFkZCBmdW5jdGlvbiBhZGQgYW4gQWNjZXNzIENvbnRyb2wgUnVsZSBpbiB0aGUgc3dpdGNoICBWQ0FQL0lDQVAvRUNBUAorICogICAgICAgIHRvIHBlcmZvcm0gYWN0aW9uIGJhc2VkIG9uIGZsb3cgY2xhc3NpZmllcgorICogCisgKiBAcGFyYW0gdW5pdCAgICB0aGUgc3dpdGNoIHVuaXQgdGhpcyBydWxlIGlzIHRvIGJlIGFkZGVkCisgKiBAcGFyYW0gcF9mbG93ICBhIHBvaW50ZXIgdG8gdGhlIGZsb3cgZGVmaW5pdGlvbiB0aGUgY3JlYXRlZCBydWxlIHdpbGwgYmUgYmFzZWQgb24gIAorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBiY21fZmllbGRfZ3JvdXBfdCBlc3dfZ3JvdXBfaWQgPSAwOworLyogYWRkIGFuIGluZ3Jlc3MgQUNMIHJ1bGUgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiYWxfc3dhcHBfZXN3X2FjbF9hZGQoaW50IHVuaXQsIGJjbWJhbF9mbG93X2NmZyAqcF9mbG93KQoreworICAgICB1aW50MzJfdCByZXQsIGo7IAorICAgICB1aW50MzJfdCBubmlfcGh5OworICAgICBpbnQgdmlkOworICAgICBiY21fZmllbGRfcXNldF90IHFzZXQ7CisgICAgIGJjbV9maWVsZF9lbnRyeV90IGVpZDsKKyAgICAgYmNtX21hY190IGJjYXN0X21hYyA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKyAgICAgYmNtX21hY190IGRzdF9tYXNrID0gIHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKKyAgIAorICAgIGRvIAorICAgIHsgICAgICAgIAorICAgICAgICB2aWQgPSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3ZpZDsKKyAKKyAgICAgICAgLyogVkNBUCAtIGJjbUZpZWxkUXVhbGlmeVN0YWdlTG9va3VwLCBJQ0FQIC0gYmNtRmllbGRRdWFsaWZ5U3RhZ2VJbmdyZXNzLCBFQ0FQIC0gYmNtRmllbGRRdWFsaWZ5U3RhZ2VFZ3Jlc3MgKi8KKyAgICAgICAgLyogVGhlIEtUMiByZXNvdXJjZXMgYWxsb3cgb25seSBsaW1pdCBudW1iZXIgb2YgcXNldCAtIGluZGV4ZWQgYnkgZXN3X2dyb3VwX2lkLCBjcmVhdGUgcXNldCB3aGVuIG5lY2Vzc2FyeSAqLworICAgICAgICBpZiAoMCA9PSBlc3dfZ3JvdXBfaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9GSUVMRF9RU0VUX0lOSVQocXNldCk7CisgICAgICAgICAgICBCQ01fRklFTERfUVNFVF9BREQocXNldCwgYmNtRmllbGRRdWFsaWZ5U3RhZ2VMb29rdXApOworICAgICAgICAgICAgQkNNX0ZJRUxEX1FTRVRfQUREKHFzZXQsIGJjbUZpZWxkUXVhbGlmeU91dGVyVmxhbik7CisgICAgICAgICAgICBCQ01fRklFTERfUVNFVF9BREQocXNldCwgYmNtRmllbGRRdWFsaWZ5SW5Qb3J0KTsKKyAgICAgICAgICAgIEJDTV9GSUVMRF9RU0VUX0FERChxc2V0LCBiY21GaWVsZFF1YWxpZnlEc3RNYWMpOworICAgICAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX2dyb3VwX2NyZWF0ZSh1bml0LCBxc2V0LCBCQ01fRklFTERfR1JPVVBfUFJJT19BTlksICZlc3dfZ3JvdXBfaWQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmbG93IGZhaWwgdG8gY3JlYXRlIGZpZWxkIC0gJWRcbiIsIHJldCApOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIGFjdGlvbiBpcyB0byBkcm9wIGJyb2FkY2FzdCwgYWRkIGFuIEFDTCBpbiBubmkgVkNBUCB0byAgZHJvcCBpdCAqLworICAgICAgICBpZiAoIHBfZmxvdy0+ZGF0YS5hY3Rpb24uY21kc19iaXRtYXNrICYgQkNNQkFMX0FDVElPTl9DTURfSURfRElTQ0FSRF9EU19CQ0FTVCkKKyAgICAgICAgeyAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIGxvb3AgdGhyb3VnaCBhbGwgbm5pIHBvcnRzICovCisgICAgICAgICAgICBmb3Ioaj0wOyAtMSAhPSAobm5pX3BoeSA9IGJhbF9iY21fbmV0X2luZl9wYm1fZ2V0KGopKTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggYmFsX2JjbV9uZXRfaW5mX2Rldl9nZXQoaikgIT0gdW5pdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfZW50cnlfY3JlYXRlKHVuaXQsIGVzd19ncm91cF9pZCwgJmVpZCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmxvdyBmYWlsIHRvIGNyZWF0ZSBmaWVsZCBlbnRyeSBmb3IgcG9ydCAlZCAtIHJldCA9ICVkXG4iLCBubmlfcGh5LCByZXQgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0ID0gYmNtX2ZpZWxkX3F1YWxpZnlfRHN0TWFjKHVuaXQsIGVpZCwgYmNhc3RfbWFjLCBkc3RfbWFzayk7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmbG93IGZhaWwgdG8gc2V0IGZpZWxkIGRzdCBtYWMgcXVhbGlmaWVyICVkIC0gcmV0ID0gJWRcbiIsIG5uaV9waHksIHJldCApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldCA9IGJjbV9maWVsZF9xdWFsaWZ5X091dGVyVmxhbklkKHVuaXQsIGVpZCwgdmlkLCAweGZmZmYpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmxvdyBmYWlsIHRvIHNldCBmaWVsZCBvdXRlciB2bGFuIHF1YWxpZmllciAlZCAtIHJldCA9ICVkXG4iLCBubmlfcGh5LCByZXQgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldCA9IGJjbV9maWVsZF9hY3Rpb25fYWRkKHVuaXQsIGVpZCwgYmNtRmllbGRBY3Rpb25Ecm9wLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEJDTV9FX05PTkUpCisgICAgICAgICAgICAgICAgeyAgICAKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmbG93IGZhaWwgdG8gYWRkIGFjdGlvbiB0byB0aGUgZmllbGQgZW50cnkgJWQgLSByZXQgPSAlZFxuIiwgbm5pX3BoeSwgcmV0ICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXQgPSBiY21fZmllbGRfZW50cnlfaW5zdGFsbCh1bml0LCBlaWQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmxvdyBmYWlsIHRvIGluc3RhbGwgZmllbGQgZW50cnkgJWQgLSByZXQgPSAlZFxuIiwgbm5pX3BoeSwgcmV0ICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gICAgICAKKyAgICAgICAgICAgIH0gLyogZm9yIGxvb3AgKi8KKyAgICAgICAgfSAvKiBpZiBkcm9wIGJjYXN0ICovCisgICAgfSB3aGlsZSgwKTsKKyAgIAorICAgICAKKyAgICAgaWYgKHJldCAhPSBCQ01fRV9OT05FKQorICAgICB7CisgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgfQorICAgICAKKyAgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKgorICogQGJyaWVmIFRoZSBpbmdyZXNzIHZsYW4gdHJhbnNsYXRpb24gZnVuY3Rpb24gcHJvZ3JhbSBzd2l0Y2ggdG8KKyAqICB0cmFuc2xhdGUgcGFja2V0IHZsYW4gYXR0cmlidXRlcyBiZWZvcmUgdGhlIHN3aXRjaCB2YWlkYXRlIHRoZQorICogIHZsYW4gbWVtYmVyc2hpcCBvZiB0aGUgcGFja2V0cworICogQHBhcmFtIHVuaXQgICAgdGhlIHN3aXRjaCB1bml0IHRoaXMgdHJhbnNsYXRpb24gaXMgcGVyZnJvbWVkCisgKiBAcGFyYW0gcF9mbG93ICBhIHBvaW50ZXIgdG8gdGhlIGZsb3cgdGhhdCBjb250YWlucyB0cmFuc2xhdGlvbiBhY3Rpb24gIAorICogQHJldHVybiAgICAgICAgZXJyb3IgY29kZQorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmFsX3N3YXBwX2Vzd19pdmxhbngoaW50IHVuaXQsIGJjbWJhbF9mbG93X2NmZyAqcF9mbG93KQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7ICAgIAorICAgIGJjbV9ncG9ydF90IHBvbl9ncG9ydDsKKyAgICB1aW50MzJfdCBwb25fcGh5X3BibTsgICAgCisgICAgaW50IGJjbV9yYzsgICAgCisgCisgICAgLyogZmluZCBvdXQgd2hpY2ggUE9OIHRoaXMgYWN0aW9uIGlzIHRvIGJlIHBlcmZvcm1lZCAqLworICAgIC8qIG1hcCBwb24gbG9naWNhbCBwb3J0IHRvIHBoeXNpY2FsIHBvcnQgKi8KKyAgICBwb25fcGh5X3BibSA9IGJhbF9iY21fcG9uX2luZl9wYm1fZ2V0KHBfZmxvdy0+ZGF0YS5hY2Nlc3NfaW50X2lkKTsKKyAgICAvKiBjcmVhdGUgbG9jYWwgZ3BvcnQgYmFzZWQgb24gcG9uIHBoeXNpY2FsIHBvcnQgbnVtYmVyICovCisgICAgQkNNX0dQT1JUX0xPQ0FMX1NFVChwb25fZ3BvcnQsIHBvbl9waHlfcGJtKTsgCisgICAgCisgICAgZG8gCisgICAgeyAgICAgCisgICAgICAgIC8qIEZvciBUUi0xNTYgMToxIHVwdHJlYW0gc2luZ2xlIHRhZ2dlZCBwYWNrZXRzLAorICAgICAgICAgICBTLXRhZyBhZGQgYWN0b24gaXMgcGVyZm9ybWVkIGluIHRoZSBJTkdSRVNTIHZsYW4gdHJhbnNsYXRvci4gICAKKyAgICAgICAgKi8KKyAgICAgICBpZiAoQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSA9PSBwX2Zsb3ctPmtleS5mbG93X3R5cGUpCisgICAgICAgeworICAgICAgICAgICBpZiAoIHBfZmxvdy0+ZGF0YS5hY3Rpb24uY21kc19iaXRtYXNrICYgQkNNQkFMX0FDVElPTl9DTURfSURfQUREX09VVEVSX1RBRyApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHVpbnQzMl90IHVfb3ZpZCwgdV9pdmlkOworICAgICAgICAgICAgICAgYmNtX3ZsYW5fYWN0aW9uX3NldF90IHVfYWN0aW9uOworICAgICAgICAgICAgICAgYmNtX3ZsYW5fYWN0aW9uX3NldF90X2luaXQoJnVfYWN0aW9uKTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAvKiBzZXQgZ3BvbiBpbmdyZXNzIHRyYW5zbGF0b24gdG8gYWRkIG91dGVyIHRhZyBvbiB1cHN0cmVhbSBwYWNrZXRzICovCisgICAgICAgICAgICAgICB1X2FjdGlvbi5uZXdfb3V0ZXJfdmxhbiA9IHBfZmxvdy0+ZGF0YS5hY3Rpb24ub192aWQ7CisgICAgICAgICAgICAgICB1X2FjdGlvbi5wcmlvcml0eSAgICAgICA9IHBfZmxvdy0+ZGF0YS5hY3Rpb24ub19wYml0czsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgc3dpdGNoKHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9QS1RfVEFHX1RZUEVfU0lOR0xFX1RBRzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVfYWN0aW9uLm90X291dGVyICAgICAgICAgID0gYmNtVmxhbkFjdGlvbkFkZDsgCisgICAgICAgICAgICAgICAgICAgICAgICB1X2FjdGlvbi5vdF9vdXRlcl9wa3RfcHJpbyA9IGJjbVZsYW5BY3Rpb25SZXBsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgdV9vdmlkICAgICAgICAgICAgICAgICAgICAgPSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3ZpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVfaXZpZCAgICAgICAgICAgICAgICAgICAgID0gQkNNX1ZMQU5fTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogbm90IHN1cHBvcnRlZCwgZ290byB3aGlsZSgwKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgdV9vdmlkICAgICAgICAgICAgICAgICAgICAgPSBCQ01fVkxBTl9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgdV9pdmlkICAgICAgICAgICAgICAgICAgICAgPSBCQ01fVkxBTl9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgICAgIC8qIGVuYWJsZSBpbmdyZXNzIHZsYW4gdHJhbnNsYXRpb24gb24gc3BlY2lmaWVkIHBvcnQgKi8gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICBiY21fcmMgPSBiY21fdmxhbl9jb250cm9sX3BvcnRfc2V0KHVuaXQsIHBvbl9ncG9ydCwgYmNtVmxhblRyYW5zbGF0ZUluZ3Jlc3NFbmFibGUsIDEpOworICAgICAgICAgICAgICAgaWYgKGJjbV9yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmbG93IGZhaWwgdG8gZW5hYmxlIGluZ3Jlc3MgdmxhbiB0cmFuc2xhdGlvbiBvbiBwb3J0ICVkIC0gJWRcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9uX3BoeV9wYm0sIGJjbV9yYyApOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgLyogc2V0IHRoZSBvdXRlciB2bGFuIGlkIGFzIGxvb2t1cCBrZXkgLSBpLmUuIHBhY2tldCBmaWx0ZXJpbmcga2V5ICovCisgICAgICAgICAgICAgICBiY21fcmMgPSBiY21fdmxhbl9jb250cm9sX3BvcnRfc2V0KHVuaXQsIHBvbl9ncG9ydCwgYmNtVmxhblBvcnRUcmFuc2xhdGVLZXlGaXJzdCwgYmNtVmxhblRyYW5zbGF0ZUtleU91dGVyKTsKKyAgICAgICAgICAgICAgIGlmIChiY21fcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmxvdyBmYWlsIHRvIHNldCB1cHN0cmVhbSBsb29rdXAga2V5IG9uIHBvcnQgJWQgLSAlZFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwb25fcGh5X3BibSwgYmNtX3JjICk7ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAvKiBpbnN0YWxsIHRoZSBhY3Rpb24gaW50byBpbmdyZXNzIHZsYW4gdHJhbnNsYXRpb24gdGFibGUgKi8KKyAgICAgICAgICAgICAgIGJjbV9yYyA9IGJjbV92bGFuX3RyYW5zbGF0ZV9hY3Rpb25fYWRkKHVuaXQsIHBvbl9ncG9ydCwgYmNtVmxhblRyYW5zbGF0ZUtleU91dGVyLCB1X292aWQsIHVfaXZpZCwgJnVfYWN0aW9uKTsKKyAgICAgICAgICAgICAgIGlmIChiY21fcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmxvdyBmYWlsIHRvIHNldCBpbmdyZXNzIGFjdGlvbiBvbiBwb3J0ICVkIC0gJWRcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9uX3BoeV9wYm0sIGJjbV9yYyApOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9ICAgICAKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlIAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIiBmbG93IHVwc3RyZWFtIGFjdGlvbiAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsIHBfZmxvdy0+ZGF0YS5hY3Rpb24uY21kc19iaXRtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOyAgICAgICAgIAorICAgICAgICAgICB9ICAgCisgICAgICAgfQorICAKKyAgICB9IHdoaWxlKDApOworICAgICAKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEBicmllZiBUaGUgZW5ncmVzcyB2bGFuIHRyYW5zbGF0aW9uIGZ1bmN0aW9uIHByb2dyYW0gc3dpdGNoIHRvCisgKiAgdHJhbnNsYXRlIHBhY2tldCB2bGFuIGF0dHJpYnV0ZXMgYmVmb3JlIHRoZSBwYWNrZXRzIHdlcmUgc2VudCBvdXQKKyAqICAKKyAqIEBwYXJhbSB1bml0ICAgIHRoZSBzd2l0Y2ggdW5pdCB0aGlzIHRyYW5zbGF0aW9uIGlzIHBlcmZyb21lZAorICogQHBhcmFtIHBfZmxvdyAgYSBwb2ludGVyIHRvIHRoZSBmbG93IHRoYXQgY29udGFpbnMgdHJhbnNsYXRpb24gYWN0aW9uICAKKyAqIEByZXR1cm4gICAgICAgIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJhbF9zd2FwcF9lc3dfZXZsYW54KGludCB1bml0LCBiY21iYWxfZmxvd19jZmcgKnBfZmxvdykKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOyAgICAKKyAgICBiY21fZ3BvcnRfdCBwb25fZ3BvcnQ7CisgICAgdWludDMyX3QgcG9uX3BoeV9wYm07ICAgIAorICAgIGludCBiY21fcmM7ICAgIAorIAorICAgIC8qIGZpbmQgb3V0IHdoaWNoIFBPTiB0aGlzIGFjdGlvbiBpcyB0byBiZSBwZXJmb3JtZWQgKi8gCisgICAgLyogbWFwIHBvbiBsb2dpY2FsIHBvcnQgdG8gcGh5c2ljYWwgcG9ydCAqLworICAgIHBvbl9waHlfcGJtID0gYmFsX2JjbV9wb25faW5mX3BibV9nZXQocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpOworICAgIC8qIGNyZWF0ZSBsb2NhbCBncG9ydCBiYXNlZCBvbiBwb24gcGh5c2ljYWwgcG9ydCBudW1iZXIgKi8KKyAgICBCQ01fR1BPUlRfTE9DQUxfU0VUKHBvbl9ncG9ydCwgcG9uX3BoeV9wYm0pOyAKKyAgICAKKyAgICBkbyAKKyAgICB7ICAgICAKKyAgICAgICAgLyogRm9yIFRSLTE1NiAxOjEgZG93bnN0cmVhbSBkb3VibGUgdGFnZ2VkIHBhY2tldHMsCisgICAgICAgICAgIFMtdGFnIHJlbW92ZSBhY3RvbiBpcyBwZXJmb3JtZWQgaW4gdGhlIEVHUkVTUyB2bGFuIHRyYW5zbGF0b3IuICAgCisgICAgICAgICovCisgICAgICAgIGlmIChCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU0gPT0gcF9mbG93LT5rZXkuZmxvd190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIHBfZmxvdy0+ZGF0YS5hY3Rpb24uY21kc19iaXRtYXNrICYgQkNNQkFMX0FDVElPTl9DTURfSURfUkVNT1ZFX09VVEVSX1RBRyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc2V0IGdwb24gZWdyZXNzIHRyYW5zbGF0b24gdG8gZHJvcCBvdXRlciB0YWcgb2YgZG91YmxlIHRhZyBkb3duc3RyZWFtIHBhY2tldHMgKi8KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkX292aWQsIGRfaXZpZDsKKyAgICAgICAgICAgICAgICBiY21fdmxhbl9hY3Rpb25fc2V0X3QgZF9hY3Rpb247CisgICAgICAgICAgICAgICAgYmNtX3ZsYW5fYWN0aW9uX3NldF90X2luaXQoJmRfYWN0aW9uKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocF9mbG93LT5kYXRhLmNsYXNzaWZpZXIucGt0X3RhZ190eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfUEtUX1RBR19UWVBFX0RPVUJMRV9UQUc6CisgICAgICAgICAgICAgICAgICAgICAgICBkX2FjdGlvbi5kdF9vdXRlciA9IGJjbVZsYW5BY3Rpb25EZWxldGU7CisgICAgICAgICAgICAgICAgICAgICAgICBkX292aWQgPSBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3ZpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRfaXZpZCA9IHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmlfdmlkOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIG5vdCBzdXBwb3J0ZWQsIGdvdG8gd2hpbGUoMCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRfb3ZpZCAgID0gQkNNX1ZMQU5fTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRfaXZpZCAgID0gQkNNX1ZMQU5fTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgICAgICAvKiBlbmFibGUgZWdyZXNzIHZsYW4gdHJhbnNsYXRpb24gb24gc3BlY2lmaWVkIHBvcnQgKi8gICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBiY21fcmMgPSBiY21fdmxhbl9jb250cm9sX3BvcnRfc2V0KHVuaXQsIHBvbl9ncG9ydCwgYmNtVmxhblRyYW5zbGF0ZUVncmVzc0VuYWJsZSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKGJjbV9yYyAhPSBCQ01fRV9OT05FKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmbG93IGZhaWwgdG8gZW5hYmxlIGVncmVzcyB2bGFuIHRyYW5zbGF0aW9uIG9uIHBvcnQgJWQgLSAlZFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9uX3BoeV9wYm0sIGJjbV9yYyApOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgCisgICAgICAgICAgICAgICAgLyogaW5zdGFsbCB0aGUgYWN0aW9uIGludG8gZWdyZXNzIHZsYW4gdHJhbnNsYXRpb24gdGFibGUgKi8gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJjbV9yYyA9IGJjbV92bGFuX3RyYW5zbGF0ZV9lZ3Jlc3NfYWN0aW9uX2FkZCh1bml0LCBwb25fZ3BvcnQsIGRfb3ZpZCwgZF9pdmlkLCAmZF9hY3Rpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChiY21fcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmxvdyBmYWlsIHRvIHNldCBlZ3Jlc3MgYWN0aW9uIG9uIHBvcnQgJWQgLSAlZFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9uX3BoeV9wYm0sIGJjbV9yYyApOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgCisgICAgICAgICAgIH0KKyAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICAgICIgZmxvdyBkb3duc3RyZWFtIGFjdGlvbiAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsIHBfZmxvdy0+ZGF0YS5hY3Rpb24uY21kc19iaXRtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsgICAgICAgICAKKyAgICAgICAgICAgfSAgIAorICAgICAgICAKKyAgICAgICB9CisgIAorICAgIH0gd2hpbGUoMCk7CisgICAgIAorICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiBAYnJpZWYgVGhlIGZsb3cgYWRkIGZ1bmN0aW9uIHByb2dyYW0gS1QyIHRvIGZvcndhcmQgcGFja2V0cyB0aGF0IGhhdmUKKyAqIHNwZWNpZmllZCBhdHRyaWJ1dGVzIHRvIHRoZSBkZXNpZ25hdGVkIHBvcnRzLgorICogVGhlIHBhY2tldHMgaXMgbW9kaWZpZWQgYmVmb3JlIGVncmVzcworICogT24gdGhlIGRvd25zdHJlYW0sIGFuIGFjY2VzcyBpZCAob3V0ZXIgdmxhbiB0YWcpIGlzIGFkZGVkIHRvIHRoZSBwYWNrZXRzCisgKiBPbiB0aGUgdXBzdHJlYW0sIG91dGVyIHZsYW4gdGFnIChhY2Nlc3MgaWQpIGlzIHJlbW92ZWQgZnJvbSB0aGUgcGFja2V0cworICoKKyAqIEBwYXJhbSBpd2ZfbW9kZSBUaGUgSW50ZXJXb3JraW5nIEZ1bmN0aW9uIG1vZGUgLSBESVJFQ1Qgb3IgUEVSLUZMT1cKKyAqIEBwYXJhbSBwX2Zsb3cgQSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgYWRkIGZsb3cgaW5mbworICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJhbF9zd191dGlsX2Vzd19mbG93X2FkZChiY21iYWxfaXdmX21vZGUgaXdmX21vZGUsICBiY21iYWxfZmxvd19jZmcgKnBfZmxvdykKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIGJjbV9ncG9ydF90IHBvbl9ncG9ydDsKKyAgICB1aW50MzJfdCBwb25fcGh5X3BibTsKKyAgICBiY21fdmxhbl90IHZsYW5faWQ7CisgICAgYmNtX2dwb3J0X3Qgbm5pX2dwb3J0OworICAgIHVpbnQzMl90IG5uaV9waHlfcGJtOworICAgIGludCBpaTsKKyAgICBpbnQgYmNtX3JjOworICAgIGludCB1bml0ID0gYmFsX2JjbV9wb25faW5mX2Rldl9nZXQocF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQpOworCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICIgR290IGFuIEVTVyBmbG93IHJlcXVlc3QgLSBpd2ZfbW9kZT0lZCBmbG93X2lkPSVkICBzdWJfcG9ydD0lZCBzdmNfaWQ9JWRcbiIsCisgICAgICAgICAgICBpd2ZfbW9kZSwgCisgICAgICAgICAgICBwX2Zsb3ctPmtleS5mbG93X2lkLCBwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCwgcF9mbG93LT5kYXRhLnN2Y19wb3J0X2lkKTsKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICIgY2xhc3NpZmllciAtIG1hc2s9MHglbGx4IG90cGlkPSV4IGl0cGlkPSV4IG92aWQ9JXggaXZpZD0leFxuIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIucHJlc2VuY2VfbWFzaywKKyAgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fdHBpZCwgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIuaV90cGlkLAorICAgICAgICAgICAgcF9mbG93LT5kYXRhLmNsYXNzaWZpZXIub192aWQsIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmlfdmlkKTsKKworICAgIC8qIAorICAgICAqIEZpcnN0LCB2YWxpZGF0ZSB0aGF0IHRoZSBzcGVjaWZpZWQgUE9OIGhhcyBhdCBsZWFzdCBvbmUgTk5JIHBvcnQgb24gdGhlIHNhbWUgZGV2aWNlLgorICAgICAqIElmIG5vdCwgcmV0dXJuIGFuIGVycm9yLCBhcyB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICovCisgICAgaWkgPSAwOworICAgIHJldCA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAvKiB3YWxrIHRocm91Z2ggdGhlIGVudGlyZSBtYXBwaW5nIHRhYmxlICovCisgICAgd2hpbGUoLTEgIT0gYmFsX2JjbV9uZXRfaW5mX3BibV9nZXQoaWkpKQorICAgIHsKKyAgICAgICAgaWYoYmFsX2JjbV9uZXRfaW5mX2Rldl9nZXQoaWkpID09IHVuaXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfT0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpaSsrOyAvKiBOZXh0IE5OSSAqLworICAgIH0KKworICAgIGRvIAorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgcmV0dXJuIGNvZGUgZnJvbSBkZXZpY2UgY2hlY2sgYWJvdmUuICBSZXR1cm4gaWYgdGhlcmUgd2FzIGFuIGVycm9yLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAiIEVSUk9SOiBubyBuZXR3b3JrIHBvcnQgaXMgb24gdGhlIHNhbWUgZGV2aWNlIGFzIGFjY2VzcyBwb3J0ICVkXG4iLCBwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNyZWF0ZSB2bGFuIGRvbWFpbiBmb3IgdGhpcyBmbG93ICovICAgICAgICAKKyAgICAgICAgdmxhbl9pZCA9IChiY21fdmxhbl90KXBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLm9fdmlkOworICAgICAgICBiY21fcmMgPSBiY21fdmxhbl9jcmVhdGUodW5pdCwgdmxhbl9pZCk7CisKKyAgICAgICAgLyogaWYgT0sgb3IgYWxyZWFkeSBleGlzdGVkLCBjb250aW51ZSAqLworICAgICAgICBpZiAoYmNtX3JjICE9IEJDTV9FX05PTkUgJiYgYmNtX3JjICE9IEJDTV9FX0VYSVNUUykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICIgZmFpbGVkIHRvIGNyZWF0ZSB2bGFuICVkIG9uIHVuaXQgJWQgLSBiY21fcmM6JWRcbiIsIHZsYW5faWQsIHVuaXQsIGJjbV9yYyApOworICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgIiB2bGFuICVkICVzIG9uIHVuaXQgJWQgLSBiY21fcmM6JWRcbiIsIAorICAgICAgICAgICAgICAgICAgICB2bGFuX2lkLCAKKyAgICAgICAgICAgICAgICAgICAgKEJDTV9FX0VYSVNUUyA9PSBiY21fcmMpID8gInJldXNlZCIgOiAiY3JlYXRlZCIsCisgICAgICAgICAgICAgICAgICAgIHVuaXQsIAorICAgICAgICAgICAgICAgICAgICBiY21fcmMgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG1hcCBwb24gbG9naWNhbCBwb3J0IHRvIHBoeXNpY2FsIHBvcnQgKi8KKyAgICAgICAgcG9uX3BoeV9wYm0gPSBiYWxfYmNtX3Bvbl9pbmZfcGJtX2dldChwX2Zsb3ctPmRhdGEuYWNjZXNzX2ludF9pZCk7CisKKyAgICAgICAgLyogY3JlYXRlIGdwb3J0IGJhc2VkIG9uIHBvbiBwaHlzaWNhbCBwb3J0IG51bWJlciAqLworICAgICAgICBCQ01fR1BPUlRfTE9DQUxfU0VUKHBvbl9ncG9ydCwgcG9uX3BoeV9wYm0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIC8qIGFkZCB0aGUgc3BlY2lmaWVkIHBvbiB0byB2bGFuICovCisgICAgICAgIGJjbV9yYyA9IGJjbV92bGFuX2dwb3J0X2FkZCh1bml0LCB2bGFuX2lkLCBwb25fZ3BvcnQsIEJDTV9WTEFOX0dQT1JUX0FERF9WUF9WTEFOX01FTUJFUlNISVApOworCisgICAgICAgIGlmIChiY21fcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3N3X3V0aWwsCisgICAgICAgICAgICAgICAgICAgICIgZmxvdyBmYWlsIHRvIGFkZCBwb24gJWQgKHBibSAlZCwgZ3BvcnQgJWQpIGludG8gdmxhbiAlZCAtICVkXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgcF9mbG93LT5kYXRhLmFjY2Vzc19pbnRfaWQsIHBvbl9waHlfcGJtLCBwb25fZ3BvcnQsIHZsYW5faWQsIGJjbV9yYyApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBBZGQgYWxsIHRoZSBOTkkgcG9ydHMgdGhhdCBhcmUgb24gdGhlIHNhbWUgZGV2aWNlIHRvIHRoZSB2bGFuIGFzIHdlbGwgKi8KKworICAgICAgICBpaSA9IDA7ICAvKiBTdGFydCB3aXRoIHRoZSBmaXJzdCBOTkkgbG9naWNhbCBpbnRlcmZhY2UgKi8KKworICAgICAgICAvKiBtYXAgbm5pIGxvZ2ljYWwgcG9ydHMgdG8gcGh5c2ljYWwgcG9ydHMgKi8KKyAgICAgICAgd2hpbGUoLTEgIT0gKG5uaV9waHlfcGJtID0gYmFsX2JjbV9uZXRfaW5mX3BibV9nZXQoaWkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBiYWxfYmNtX25ldF9pbmZfZGV2X2dldChpaSkgIT0gdW5pdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjcmVhdGUgZ3BvcnQgYmFzZWQgb24gbm5pIHBoeXNpY2FsIHBvcnQgbnVtYmVyICovCisgICAgICAgICAgICBCQ01fR1BPUlRfTE9DQUxfU0VUKG5uaV9ncG9ydCwgbm5pX3BoeV9wYm0pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYmNtX3JjID0gYmNtX3ZsYW5fZ3BvcnRfYWRkKHVuaXQsIHZsYW5faWQsIG5uaV9ncG9ydCwgQkNNX1ZMQU5fR1BPUlRfQUREX1ZQX1ZMQU5fTUVNQkVSU0hJUCk7CisKKyAgICAgICAgICAgIGlmIChiY21fcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZmxvdyBmYWlsIHRvIGFkZCBubmkgJWQgKHBibSAlZCwgZ3BvcnQgJWQpIGludG8gdmxhbiAlZCAtICVkXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlpLCBubmlfcGh5X3BibSwgbm5pX2dwb3J0LCB2bGFuX2lkLCBiY21fcmMgKTsKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWkrKzsgLyogTmV4dCBOTkkgKi8KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogcGVyZm9ybSB0aGUgQUNUSU9OICovCisgICAgICAgIGlmIChCQ01PU19UUlVFID09IEJDTUJBTF9DRkdfUFJPUF9JU19TRVQocF9mbG93LCBmbG93LCBhY3Rpb24pIAorICAgICAgICAgICAgLyogJiYgQkNNT1NfVFJVRSA9PSBCQ01CQUxfQVRUUklCVVRFX0NGR19QUk9QX0lTX1NFVCgmcF9mbG93LT5kYXRhLmFjdGlvbiwgYWN0aW9uLCBhY3Rpb25fY21kc19iaXRtYXNrKSAqLworICAgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGxvZ19pZF9zd191dGlsLAorICAgICAgICAgICAgICAgICAgICAiIEdvdCBhIGZsb3cgYWN0aW9uIC0gZmxvdyB0eXBlID0gJWQsIGNtZD0lZCBpbl9vdmlkPSVkLCBvdXRfb3ZpZD0lZFxuIiwgCisgICAgICAgICAgICAgICAgICAgIHBfZmxvdy0+a2V5LmZsb3dfdHlwZSwgcF9mbG93LT5kYXRhLmFjdGlvbi5jbWRzX2JpdG1hc2ssCisgICAgICAgICAgICAgICAgICAgIHBfZmxvdy0+ZGF0YS5jbGFzc2lmaWVyLmlfdmlkLCBwX2Zsb3ctPmRhdGEuY2xhc3NpZmllci5vX3ZpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIGVuYWJsZSB2bGFuIHRyYW5zbGF0aW9uICovCisgICAgICAgICAgICBiY21fcmMgPSBiY21fdmxhbl9jb250cm9sX3NldCh1bml0LCBiY21WbGFuVHJhbnNsYXRlLCAxKTsKKyAgICAgICAgICAgIGlmIChiY21fcmMgIT0gQkNNX0VfTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfc3dfdXRpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZmxvdyBmYWlsIHRvIGVuYWJsZSB2bGFuIHRyYW5zbGF0aW9uIC0gJWRcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgYmNtX3JjICk7ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0ID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIEZvciBUUi0xNTYgMToxIGRvd25zdHJlYW0sCisgICAgICAgICAgICAgICBBQ1RJT05zIGFyZSBwZXJmb3JtZWQgb24gdGhlIEVHUkVTUyB2bGFuIHRyYW5zbGF0b3IuCisgICAgICAgICAgICAgICBGb3IgVFItMTU2IDE6MSB1cHN0cmVhbSwKKyAgICAgICAgICAgICAgIEFDVElPTnMgYXJlIHBlcmZvcm0gb24gdGhlIElOR1JFU1MgdmxhbiB0cmFuc2xhdG9yLiAKKyAgICAgICAgICAgICAgIEZvciBUUi0xNTYgTjoxIHRoZXJlIGlzIG5vIGFjdGlvbnMgZm9yIHN3aXRjaAorICAgICAgICAgICAgICAgVGhlIG91dGVyIHRhZyBhZGRpbmcgaXMgcGVyIFBPTiBiYXNlLCBpLmUuIHVwc3RyZWFtIHBhY2tldHMgd2l0aCBzYW1lCisgICAgICAgICAgICAgICBpbm5lciB2aWQgY2FuIGFkZCBkaWZmZXJlbnQgb3V0ZXIgdmlkIGJhc2VkIG9uIHJlY2VpdmluZyBQT04gCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKEJDTUJBTF9GTE9XX1RZUEVfVVBTVFJFQU0gPT0gcF9mbG93LT5rZXkuZmxvd190eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcF9mbG93LT5kYXRhLmFjdGlvbi5jbWRzX2JpdG1hc2sgJiBCQ01CQUxfQUNUSU9OX0NNRF9JRF9BRERfT1VURVJfVEFHICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGJhbF9zd2FwcF9lc3dfaXZsYW54KHVuaXQsIHBfZmxvdyk7IAorICAgICAgICAgICAgICAgIH0gICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU0gPT0gcF9mbG93LT5rZXkuZmxvd190eXBlKS8qIGRvd25zdHJlYW0gKi8KKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgaWYgKCBwX2Zsb3ctPmRhdGEuYWN0aW9uLmNtZHNfYml0bWFzayAmIEJDTUJBTF9BQ1RJT05fQ01EX0lEX1JFTU9WRV9PVVRFUl9UQUcgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gYmFsX3N3YXBwX2Vzd19ldmxhbngodW5pdCwgcF9mbG93KTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgIC8qIGJyb2FkY2FzdCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICggcF9mbG93LT5kYXRhLmFjdGlvbi5jbWRzX2JpdG1hc2sgJiBCQ01CQUxfQUNUSU9OX0NNRF9JRF9ESVNDQVJEX0RTX0JDQVNUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gYmFsX3N3YXBwX2Vzd19hY2xfYWRkKHVuaXQsIHBfZmxvdyk7CisgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSAgIAorICAgICAgICB9IC8qIGVuZCBpZiBBQ1RJT04gc2V0ICovCisKKyAgICB9IHdoaWxlKDApOworCisgICAgICAgIAorICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQGJyaWVmIFRoZSBmbG93IHJlbW92ZSBmdW5jdGlvbiByZW1vdmUgc3dpdGNoIHJlc291cmNlIHRoYXQgd2VyZSBhbGxvY2F0ZWQgZHVyaW5nIEFERAorICoKKyAqIEBwYXJhbSBpd2ZfbW9kZSBUaGUgSW50ZXJXb3JraW5nIEZ1bmN0aW9uIG1vZGUgLSBESVJFQ1Qgb3IgUEVSLUZMT1cKKyAqIEBwYXJhbSBwX2Zsb3cgQSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgYWRkIGZsb3cgaW5mbworICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJhbF9zd191dGlsX2Vzd19mbG93X3JlbW92ZShiY21iYWxfaXdmX21vZGUgaXdmX21vZGUsICBiY21iYWxfZmxvd19jZmcgKnBfZmxvdykKK3sKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2VuZGlmIC8qICNpZm5kZWYgVEVTVF9TV19VVElMX0xPT1BCQUNLICovCisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZXN3L2JhbF9lc3dfZmxvdy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2NvcmUvdXRpbC9zd2l0Y2gvZXN3L2JhbF9lc3dfZmxvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxNDYyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvY29yZS91dGlsL3N3aXRjaC9lc3cvYmFsX2Vzd19mbG93LmgKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX2Vzd19mbG93LmgKKyAqCisgKiBAYnJpZWYgRnVuY3Rpb24gUHJvdG90eXBlIGZvciBzd2l0Y2ggYXBwIGZsb3cgZnVuY3Rpb25zIGZvciBFU1cgCisgKgorICogQGluZ3JvdXAgc3dpdGNoX2FwcAorICovCisKKyNpZm5kZWYgIF9CQUxfRVNXX0ZMT1dfSF8KKyNkZWZpbmUgIF9CQUxfRVNXX0ZMT1dfSF8KKworI2luY2x1ZGUgImJhbF9zd2l0Y2hfdXRpbC5oIgorCisvKkB7Ki8KKworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZXN3X2Zsb3dfYWRkKGJjbWJhbF9pd2ZfbW9kZSBpd2ZfbW9kZSwgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3cpOworYmNtb3NfZXJybm8gYmFsX3N3X3V0aWxfZXN3X2Zsb3dfcmVtb3ZlKGJjbWJhbF9pd2ZfbW9kZSBpd2ZfbW9kZSwgYmNtYmFsX2Zsb3dfY2ZnICpwX2Zsb3cpOworIAorLypAfSovCisgCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9kYXRhbW9kZWwvYmFsLm9ianNldCBiL2JhbF9yZWxlYXNlL3NyYy9kYXRhbW9kZWwvYmFsLm9ianNldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgwMWNmCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2RhdGFtb2RlbC9iYWwub2Jqc2V0CkBAIC0wLDAgKzEsMzkwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxFbGVtZW50U2V0IFZlcnNpb249IjIuMSI+CisgPEtleVZhbHVlUGFpcnM+CisgIDxLZXlWYWx1ZVBhaXI+CisgICA8S2V5PlN1cHBvcnRzQXV0b0NmZzwvS2V5PgorICAgPFZhbHVlPkZhbHNlPC9WYWx1ZT4KKyAgPC9LZXlWYWx1ZVBhaXI+CisgPC9LZXlWYWx1ZVBhaXJzPgorIDxMYWJlbD4KKyAgPFNob3J0TmFtZT5iYWw8L1Nob3J0TmFtZT4KKyAgPExvbmdOYW1lPkJBTDwvTG9uZ05hbWU+CisgIDxEZXNjcmlwdGlvbj5CQUwgT2JqZWN0IE1vZGVsPC9EZXNjcmlwdGlvbj4KKyA8L0xhYmVsPgorIDxDdXN0b21UeXBlcz4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUFsaWFzIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPmFjY2Vzc19pZDwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5BY2Nlc3MgSUQ8L0xvbmdOYW1lPgorICAgPC9MYWJlbD4KKyAgIDxCYXNlVHlwZT4KKyAgICA8V2lkdGg+NDwvV2lkdGg+CisgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgPC9CYXNlVHlwZT4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlU3RydWN0dXJlIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPmFjdGlvbjwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5hY3Rpb248L0xvbmdOYW1lPgorICAgPC9MYWJlbD4KKyAgIDxPcHRpb25zPlByZXNlbmNlTWFzazwvT3B0aW9ucz4KKyAgIDxGaWVsZHM+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmNtZHNfYml0bWFzazwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPkNvbW1hbmRzIGJpdG1hc2s8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICA8U2hvcnROYW1lPmFjdGlvbl9jbWRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+b192aWQ8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5PdXRlciB2aWQ8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICA8V2lkdGg+MjwvV2lkdGg+CisgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPm9fcGJpdHM8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5PdXRlciBwYml0czwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+b190cGlkPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+T3V0ZXIgdHBpZDwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgIDxXaWR0aD4yPC9XaWR0aD4KKyAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+aV92aWQ8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5Jbm5lciB2aWQ8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICA8V2lkdGg+MjwvV2lkdGg+CisgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmlfcGJpdHM8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5Jbm5lciBwYml0czwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+aV90cGlkPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+SW5uZXIgdHBpZDwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgIDxXaWR0aD4yPC9XaWR0aD4KKyAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgIDwvRmllbGRzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVFbnVtIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPmFjdGlvbl9jbWRfaWQ8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+YWN0aW9uX2NtZF9pZDwvTG9uZ05hbWU+CisgICA8L0xhYmVsPgorICAgPEZsYWdzPlRydWU8L0ZsYWdzPgorICAgPEJhc2VUeXBlPgorICAgIDxXaWR0aD40PC9XaWR0aD4KKyAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICA8L0Jhc2VUeXBlPgorICAgPEVudHJpZXM+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5hZGRfb3V0ZXJfdGFnPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+QWRkIG91dGVyIHRhZzwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4xPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnJlbW92ZV9vdXRlcl90YWc8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5SZW1vdmUgb3V0ZXIgdGFnPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjI8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+eGxhdGVfb3V0ZXJfdGFnPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+VHJhbnNsYXRlIG91dGVyIHRhZzwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT40PC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnhsYXRlX3R3b190YWdzPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+VHJhbnNsYXRlIHR3byB0YWdzPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjg8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+ZGlzY2FyZF9kc19iY2FzdDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPkRpc2NhcmQgZG93bnN0cmVhbSBicm9hZGNhc3Q8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlVzZWQgdG8gc2F0aXNmeSBUUi0xNTYgSXNzdWUgMyBSLTExMTwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4xNjwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5kaXNjYXJkX2RzX3Vua25vd248L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5EaXNjYXJkIGRvd25zdHJlYW0gdW5rbm93bjwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+VXNlZCB0byBzYXRpc2Z5IFRSLTE1NiBJc3N1ZSAzIFItMTA5PC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjMyPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmFkZF90d29fdGFnczwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPkFkZCB0d28gdGFnczwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT42NDwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5yZW1vdmVfdHdvX3RhZ3M8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5SZW1vdmUgdHdvIHRhZ3M8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MTI4PC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnJlbWFya19wYml0czwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPlJlbWFyayBwYml0czwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+U2V0IHRoZSBvdXRlciB0YWcgcGJpdHM8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MjU2PC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmNvcHlfcGJpdHM8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5Db3B5IHBiaXRzPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5Db3B5IHRoZSBpbm5lciBwYml0cyB0byBvdXRlciBwYml0czwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT41MTI8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+cmV2ZXJzZV9jb3B5X3BiaXRzPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+UmV2ZXJzZSBjb3B5IHBiaXRzPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5Db3B5IHRoZSBvdXRlciBwYml0cyB0byBpbm5lciBwYml0czwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4xMDI0PC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmRzY3BfdG9fcGJpdHM8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5Ec2NwIHRvIHBiaXRzPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5Db3B5IHRoZSBMNCBEU0NQIHRvIG91dGVyIHBiaXRzPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjIwNDg8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+dHJhcF90b19ob3N0PC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+VHJhcCB0byBob3N0PC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5Ob3QgYSB2YWxpZCBhY3Rpb24gZm9yIGEgZ3JvdXAgb2JqZWN0IG1lbWJlcjwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT40MDk2PC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgIDwvRW50cmllcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlQWxpYXMiPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+YWdncmVnYXRpb25fcG9ydF9pZDwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5BZ2dyZWdhdGlvbiBwb3J0IGlkPC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjI8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZVN0cnVjdHVyZSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5jbGFzc2lmaWVyPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPmNsYXNzaWZpZXI8L0xvbmdOYW1lPgorICAgPC9MYWJlbD4KKyAgIDxPcHRpb25zPlByZXNlbmNlTWFzazwvT3B0aW9ucz4KKyAgIDxGaWVsZHM+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPm9fdHBpZDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPk91dGVyIHRwaWQ8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPk91dGVyIFRQSUQgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgPFdpZHRoPjI8L1dpZHRoPgorICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5vX3ZpZDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPk91dGVyIHZpZDwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+T3V0ZXIgVklEIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgIDxXaWR0aD4yPC9XaWR0aD4KKyAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+aV90cGlkPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+SW5uZXIgdHBpZDwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+SW5uZXIgVFBJRCBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQ8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICA8V2lkdGg+MjwvV2lkdGg+CisgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmlfdmlkPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+SW5uZXIgdmlkPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5Jbm5lciBWSUQgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgPFdpZHRoPjI8L1dpZHRoPgorICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5vX3BiaXRzPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+T3V0ZXIgUGJpdHM8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPk91dGVyIFBCSVRTIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+aV9wYml0czwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPklubmVyIFBiaXRzPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5Jbm5lciBQQklUUyBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQ8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICA8V2lkdGg+MTwvV2lkdGg+CisgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmV0aGVyX3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5FdGhlciB0eXBlPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5FdGhlcnR5cGUgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgPFdpZHRoPjI8L1dpZHRoPgorICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5kc3RfbWFjPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+RGVzdGluYXRpb24gbWFjPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5EZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQ8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVdlbGxLbm93biI+CisgICAgICA8V2VsbEtub3duVHlwZT5NYWNBZGRyZXNzPC9XZWxsS25vd25UeXBlPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5zcmNfbWFjPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+U291cmNlIG1hYzwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+U291cmNlIE1BQyBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlV2VsbEtub3duIj4KKyAgICAgIDxXZWxsS25vd25UeXBlPk1hY0FkZHJlc3M8L1dlbGxLbm93blR5cGU+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmlwX3Byb3RvPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+SVAgUHJvdG9jb2w8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPklQIHByb3RvY29sIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+ZHN0X2lwPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+RGVzdGluYXRpb24gSVAgYWRkcmVzczwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+RGVzdGluYXRpb24gSVAgYWRkcmVzcyBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQ8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVdlbGxLbm93biI+CisgICAgICA8V2VsbEtub3duVHlwZT5JUHY0QWRkcmVzczwvV2VsbEtub3duVHlwZT4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+c3JjX2lwPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+U291cmNlIElQIGFkZHJlc3M8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlNvdXJjZSBJUCBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlV2VsbEtub3duIj4KKyAgICAgIDxXZWxsS25vd25UeXBlPklQdjRBZGRyZXNzPC9XZWxsS25vd25UeXBlPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5zcmNfcG9ydDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPlNvdXJjZSBwb3J0PC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5Tb3VyY2UgcG9ydCBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQ8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICA8V2lkdGg+MjwvV2lkdGg+CisgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmRzdF9wb3J0PC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+RGVzdGluYXRpb24gcG9ydDwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+RGVzdGluYXRpb24gcG9ydCBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQ8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICA8V2lkdGg+MjwvV2lkdGg+CisgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnBrdF90YWdfdHlwZTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPlBhY2tldCB0YWcgdHlwZTwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+VGhlIHRhZyB0eXBlIG9mIHRoZSBpbmdyZXNzIHBhY2tldHM8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICA8U2hvcnROYW1lPnBrdF90YWdfdHlwZTwvU2hvcnROYW1lPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgPC9GaWVsZHM+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUVudW0iPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+Y29udHJvbDwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5jb250cm9sPC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+R2VuZXJpYyBlbmFibGUvZGlzYWJsZSBlbnVtZXJhdGlvbjwvRGVzY3JpcHRpb24+CisgICA8L0xhYmVsPgorICAgPEJhc2VUeXBlPgorICAgIDxXaWR0aD40PC9XaWR0aD4KKyAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICA8L0Jhc2VUeXBlPgorICAgPEVudHJpZXM+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5kaXNhYmxlPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+ZGlzYWJsZTwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4wPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmVuYWJsZTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmVuYWJsZTwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4xPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgIDwvRW50cmllcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlQWxpYXMiPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+Y29va2llPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPmNvb2tpZTwvTG9uZ05hbWU+CisgICA8L0xhYmVsPgorICAgPEJhc2VUeXBlPgorICAgIDxXaWR0aD44PC9XaWR0aD4KKyAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICA8L0Jhc2VUeXBlPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVDbGFzc2lmaWVkU3RydWN0dXJlIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPmRlc3Q8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+UGFja2V0IGRlc3RpbmF0aW9uPC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8T3B0aW9ucz5WYWx1ZVR5cGU8L09wdGlvbnM+CisgICA8Q29tbW9uRmllbGRzPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT50eXBlPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+cGFja2V0IGRlc3RpbmF0aW9uPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgPFNob3J0TmFtZT5kZXN0X3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgIDwvQ29tbW9uRmllbGRzPgorICAgPENsYXNzaWZpZXJGaWVsZE5hbWU+dHlwZTwvQ2xhc3NpZmllckZpZWxkTmFtZT4KKyAgIDxDbGFzc2lmaWVkU3RydWN0dXJlcz4KKyAgICA8Q2xhc3NpZmllZFN0cnVjdHVyZT4KKyAgICAgPENsYXNzaWZpZXJWYWx1ZT5ubmk8L0NsYXNzaWZpZXJWYWx1ZT4KKyAgICAgPEVtYmVkZGVkU3RydWN0dXJlPgorICAgICAgPExhYmVsPgorICAgICAgIDxTaG9ydE5hbWU+PC9TaG9ydE5hbWU+CisgICAgICAgPExvbmdOYW1lPjwvTG9uZ05hbWU+CisgICAgICA8L0xhYmVsPgorICAgICAgPE9wdGlvbnM+VmFsdWVUeXBlPC9PcHRpb25zPgorICAgICAgPEZpZWxkcz4KKyAgICAgICA8RmllbGQ+CisgICAgICAgIDxMYWJlbD4KKyAgICAgICAgIDxTaG9ydE5hbWU+aW50X2lkPC9TaG9ydE5hbWU+CisgICAgICAgICA8TG9uZ05hbWU+SW50ZXJmYWNlIElEPC9Mb25nTmFtZT4KKyAgICAgICAgPC9MYWJlbD4KKyAgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICAgPFNob3J0TmFtZT5pbnRmX2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDwvRmllbGQ+CisgICAgICA8L0ZpZWxkcz4KKyAgICAgPC9FbWJlZGRlZFN0cnVjdHVyZT4KKyAgICA8L0NsYXNzaWZpZWRTdHJ1Y3R1cmU+CisgICAgPENsYXNzaWZpZWRTdHJ1Y3R1cmU+CisgICAgIDxDbGFzc2lmaWVyVmFsdWU+c3ViX3Rlcm08L0NsYXNzaWZpZXJWYWx1ZT4KKyAgICAgPEVtYmVkZGVkU3RydWN0dXJlPgorICAgICAgPExhYmVsPgorICAgICAgIDxTaG9ydE5hbWU+PC9TaG9ydE5hbWU+CisgICAgICAgPExvbmdOYW1lPjwvTG9uZ05hbWU+CisgICAgICA8L0xhYmVsPgorICAgICAgPE9wdGlvbnM+VmFsdWVUeXBlPC9PcHRpb25zPgorICAgICAgPEZpZWxkcz4KKyAgICAgICA8RmllbGQ+CisgICAgICAgIDxMYWJlbD4KKyAgICAgICAgIDxTaG9ydE5hbWU+c3ViX3Rlcm1faWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgIDxMb25nTmFtZT5TdWJzY3JpYmVyIHRlcm1pbmFsIElEPC9Mb25nTmFtZT4KKyAgICAgICAgPC9MYWJlbD4KKyAgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICAgPFNob3J0TmFtZT5zdWJfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPC9GaWVsZD4KKyAgICAgICA8RmllbGQ+CisgICAgICAgIDxMYWJlbD4KKyAgICAgICAgIDxTaG9ydE5hbWU+c3ViX3Rlcm1fdW5pPC9TaG9ydE5hbWU+CisgICAgICAgICA8TG9uZ05hbWU+U3Vic2NyaWJlciB0ZXJtaW5hbCBVTkk8L0xvbmdOYW1lPgorICAgICAgICA8L0xhYmVsPgorICAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgICA8V2lkdGg+MjwvV2lkdGg+CisgICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDwvRmllbGQ+CisgICAgICAgPEZpZWxkPgorICAgICAgICA8TGFiZWw+CisgICAgICAgICA8U2hvcnROYW1lPmludF9pZDwvU2hvcnROYW1lPgorICAgICAgICAgPExvbmdOYW1lPkludGVyZmFjZSBJRDwvTG9uZ05hbWU+CisgICAgICAgIDwvTGFiZWw+CisgICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgIDxXaWR0aD4yPC9XaWR0aD4KKyAgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPC9GaWVsZD4KKyAgICAgIDwvRmllbGRzPgorICAgICA8L0VtYmVkZGVkU3RydWN0dXJlPgorICAgIDwvQ2xhc3NpZmllZFN0cnVjdHVyZT4KKyAgICA8Q2xhc3NpZmllZFN0cnVjdHVyZT4KKyAgICAgPENsYXNzaWZpZXJWYWx1ZT5ob3N0PC9DbGFzc2lmaWVyVmFsdWU+CisgICAgIDxFbWJlZGRlZFN0cnVjdHVyZT4KKyAgICAgIDxMYWJlbD4KKyAgICAgICA8U2hvcnROYW1lPjwvU2hvcnROYW1lPgorICAgICAgIDxMb25nTmFtZT48L0xvbmdOYW1lPgorICAgICAgPC9MYWJlbD4KKyAgICAgIDxPcHRpb25zPlZhbHVlVHlwZTwvT3B0aW9ucz4KKyAgICAgPC9FbWJlZGRlZFN0cnVjdHVyZT4KKyAgICA8L0NsYXNzaWZpZWRTdHJ1Y3R1cmU+CisgICA8L0NsYXNzaWZpZWRTdHJ1Y3R1cmVzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVFbnVtIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPmRlc3RfdHlwZTwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5EZXN0aW5hdGlvbiB0eXBlPC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8RW50cmllcz4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPm5uaTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPm5uaTwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+Zm9yIHBhY2tldHMgYmVpbmcgc2VudCB0byB0aGUgTk5JPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjE8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+c3ViX3Rlcm08L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5zdWJzY3JpYmVyIHRlcm1pbmFsPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5mb3IgcGFja2V0cyBiZWluZyBzZW50IHRvIGEgc3Vic2NyaWJlciB0ZXJtaW5hbDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4yPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmhvc3Q8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5ob3N0PC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj4gZm9yIHBhY2tldCBpbmRpY2F0aW9ucyByZWNlaXZlZCBmcm9tIE5OSSBvciBTVUJfVEVSTSBhbmQgYmVpbmcgc2VudCB0byB0aGUgaG9zdDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4zPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgIDwvRW50cmllcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlRW51bSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5kc19taXNzX21vZGU8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+RG93bnN0cmVhbiBhY3Rpb24gZm9yIHVua25vd24gcGFja2V0czwvTG9uZ05hbWU+CisgICA8L0xhYmVsPgorICAgPEJhc2VUeXBlPgorICAgIDxXaWR0aD40PC9XaWR0aD4KKyAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICA8L0Jhc2VUeXBlPgorICAgPEVudHJpZXM+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5kaXNjYXJkPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+RGlzY2FyZDwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4wPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmJyb2FkY2FzdDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPkJyb2FkY2FzdDwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4xPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnZpZDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPlZpZDwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4yPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgIDwvRW50cmllcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlRW51bSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5leHRyYV9id19lbGlnaWJpbGl0eV90eXBlPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPmV4dHJhX2J3X2VsaWdpYmlsaXR5X3R5cGU8L0xvbmdOYW1lPgorICAgIDxEZXNjcmlwdGlvbj5FeHRyYSBCVyBFbGlnaWJpbGl0eSBUeXBlPC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8RW50cmllcz4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPm5vbmU8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5ub25lPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5Ob25lPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjA8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+bm90X2Fzc3VyZWQ8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5ub3RfYXNzdXJlZDwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+Tm90IGFzc3VyZWQ8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MTwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5iZXN0X2VmZm9ydDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmJlc3RfZWZmb3J0PC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5CZXN0IGVmZm9ydDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4yPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgIDwvRW50cmllcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlQWxpYXMiPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+Zmxvd19pZDwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5mbG93IGlkPC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUVudW0iPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+Zmxvd190eXBlPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPkZsb3cgVHlwZTwvTG9uZ05hbWU+CisgICA8L0xhYmVsPgorICAgPEJhc2VUeXBlPgorICAgIDxXaWR0aD40PC9XaWR0aD4KKyAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICA8L0Jhc2VUeXBlPgorICAgPEVudHJpZXM+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT51cHN0cmVhbTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPlVwc3RyZWFtIGZsb3c8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlVwc3RyZWFtIGZsb3c8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MTwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5kb3duc3RyZWFtPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+RG93bnN0cmVhbSBmbG93PC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5Eb3duc3RyZWFtIEZsb3c8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MjwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5icm9hZGNhc3Q8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5Ccm9hZGNhc3QgZmxvdzwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+QnJvYWRjYXN0IEZsb3c8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MzwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5tdWx0aWNhc3Q8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5NdWx0aWNhc3QgZmxvdzwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+TXVsdGljYXN0IEZsb3c8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+NDwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICA8L0VudHJpZXM+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUFsaWFzIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPmdyb3VwX2lkPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPmdyb3VwIGlkPC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUVudW0iPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+Z3JvdXBfbWVtYmVyX2NtZDwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5NZW1iZXIgb3BlcmF0aW9uIHR5cGU8L0xvbmdOYW1lPgorICAgPC9MYWJlbD4KKyAgIDxCYXNlVHlwZT4KKyAgICA8V2lkdGg+NDwvV2lkdGg+CisgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgPC9CYXNlVHlwZT4KKyAgIDxFbnRyaWVzPgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+YWRkX21lbWJlcnM8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5BZGQgbmV3IG1lbWJlcnM8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MTwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5yZW1fbWVtYmVyczwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPlJlbW92ZSBleGlzdGluZyBtZW1iZXJzPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjI8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+c2V0X21lbWJlcnM8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5SZXBsYWNlIG1lbWJlcnMgd2l0aCBuZXcgc2V0PC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjM8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgPC9FbnRyaWVzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVTdHJ1Y3R1cmUiPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+Z3JvdXBfbWVtYmVyX2luZm88L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+R3JvdXAgTWVtYmVyIEluZm88L0xvbmdOYW1lPgorICAgPC9MYWJlbD4KKyAgIDxGaWVsZHM+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmludGZfaWQ8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5BY2Nlc3MgSW50ZXJmYWNlIElEPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5BY2Nlc3MgaW50ZXJmYWNlIGlkIGZvciB0aGlzIG1lbWJlcjwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgIDxTaG9ydE5hbWU+aW50Zl9pZDwvU2hvcnROYW1lPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5zdmNfcG9ydF9pZDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPlNlcnZpY2UgUG9ydCBJRDwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+VGhlIG11bHRpY2FzdCAiR0VNIiBmb3IgdGhpcyBtZW1iZXI8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICA8U2hvcnROYW1lPnNlcnZpY2VfcG9ydF9pZDwvU2hvcnROYW1lPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5hY3Rpb248L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5WTEFOIEFjdGlvbnM8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlZMQU4gYWN0aW9uczwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgIDxTaG9ydE5hbWU+YWN0aW9uPC9TaG9ydE5hbWU+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnF1ZXVlPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+RWdyZXNzIHF1ZXVlPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5FZ3Jlc3MgcXVldWU8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICA8U2hvcnROYW1lPnRtX3F1ZXVlX3JlZjwvU2hvcnROYW1lPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgPC9GaWVsZHM+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUVudW0iPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+Z3JvdXBfb3duZXI8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+Z3JvdXBfb3duZXI8L0xvbmdOYW1lPgorICAgIDxEZXNjcmlwdGlvbj5vd25lciBvZiB0aGUgZ3JvdXA8L0Rlc2NyaXB0aW9uPgorICAgPC9MYWJlbD4KKyAgIDxCYXNlVHlwZT4KKyAgICA8V2lkdGg+MTwvV2lkdGg+CisgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgPC9CYXNlVHlwZT4KKyAgIDxFbnRyaWVzPgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+bm9uZTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmdyb3VwX293bmVyX25vbmU8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPm5vIG93bmVyPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjA8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+bXVsdGljYXN0PC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+Z3JvdXBfb3duZXJfbXVsdGljYXN0PC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj51c2VkIGFzIG11bHRpY2FzdCBncm91cDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4xPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnVuaWNhc3Q8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5ncm91cF9vd25lcl91bmljYXN0PC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj51c2VkIGFzIHVuaWNhc3QgZ3JvdXA8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MjwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICA8L0VudHJpZXM+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUFsaWFzIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPmludGZfaWQ8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+SW50ZXJmYWNlIElEPC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUVudW0iPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+aW50Zl90eXBlPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPkludGVyZmFjZSB0eXBlPC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8RW50cmllcz4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPm5uaTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPk5OSSBJbnRlcmZhY2U8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MDwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5wb248L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5QT0lOIEludGVyZmFjZTwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4xPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgIDwvRW50cmllcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlRW51bSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5pd2ZfbW9kZTwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5JbnRlcndvcmtpbmcgRnVuY3Rpb24gTW9kZTwvTG9uZ05hbWU+CisgICA8L0xhYmVsPgorICAgPEJhc2VUeXBlPgorICAgIDxXaWR0aD40PC9XaWR0aD4KKyAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICA8L0Jhc2VUeXBlPgorICAgPEVudHJpZXM+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5kaXJlY3RfbWFwcGluZzwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPkRpcmVjdCBtYXBwaW5nPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjA8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+cGVyX2Zsb3c8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5QZXIgZmxvdyA8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MTwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICA8L0VudHJpZXM+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZVN0cnVjdHVyZSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5wYXNzd29yZDwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5QYXNzd29yZDwvTG9uZ05hbWU+CisgICA8L0xhYmVsPgorICAgPEZpZWxkcz4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+YXJyPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+QXJyYXk8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZUxpc3QiPgorICAgICAgPEVsZW1lbnRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgIDwvRWxlbWVudFR5cGU+CisgICAgICA8TWluaW11bUxlbmd0aD4xMDwvTWluaW11bUxlbmd0aD4KKyAgICAgIDxNYXhpbXVtTGVuZ3RoPjEwPC9NYXhpbXVtTGVuZ3RoPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgPC9GaWVsZHM+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUFsaWFzIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPnBlcmNlbnQ8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+cGVyY2VudDwvTG9uZ05hbWU+CisgICAgPERlc2NyaXB0aW9uPlBlcmNlbnQ8L0Rlc2NyaXB0aW9uPgorICAgPC9MYWJlbD4KKyAgIDxCYXNlVHlwZT4KKyAgICA8V2lkdGg+MTwvV2lkdGg+CisgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgPC9CYXNlVHlwZT4KKyAgIDxNaW5pbXVtVmFsdWU+MDwvTWluaW11bVZhbHVlPgorICAgPE1heGltdW1WYWx1ZT4xMDA8L01heGltdW1WYWx1ZT4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlRW51bSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5wa3RfdGFnX3R5cGU8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+UGFja2V0IHRhZyB0eXBlPC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8RmxhZ3M+VHJ1ZTwvRmxhZ3M+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8RW50cmllcz4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnVudGFnZ2VkPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+VW50YWdnZWQ8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MTwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5zaW5nbGVfdGFnPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+U2luZ2xlIHRhZzwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4yPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmRvdWJsZV90YWc8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5Eb3VibGUgdGFnPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjQ8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgPC9FbnRyaWVzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVTdHJ1Y3R1cmUiPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+cmVnaXN0cmF0aW9uX2lkPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPlJlZ2lzdHJhdGlvbiBpZDwvTG9uZ05hbWU+CisgICA8L0xhYmVsPgorICAgPEZpZWxkcz4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+YXJyPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+QXJyYXk8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPk9OVSByZWdpc3RyYXRpb24gSUQ8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZUxpc3QiPgorICAgICAgPEVsZW1lbnRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgIDwvRWxlbWVudFR5cGU+CisgICAgICA8TWluaW11bUxlbmd0aD4zNjwvTWluaW11bUxlbmd0aD4KKyAgICAgIDxNYXhpbXVtTGVuZ3RoPjM2PC9NYXhpbXVtTGVuZ3RoPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgPC9GaWVsZHM+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZVN0cnVjdHVyZSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5zZXJpYWxfbnVtYmVyPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPlNlcmlhbCBudW1iZXI8L0xvbmdOYW1lPgorICAgPC9MYWJlbD4KKyAgIDxGaWVsZHM+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnZlbmRvcl9pZDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPnZlbmRvciBpZDwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTGlzdCI+CisgICAgICA8RWxlbWVudFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICA8V2lkdGg+MTwvV2lkdGg+CisgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgPC9FbGVtZW50VHlwZT4KKyAgICAgIDxNaW5pbXVtTGVuZ3RoPjQ8L01pbmltdW1MZW5ndGg+CisgICAgICA8TWF4aW11bUxlbmd0aD40PC9NYXhpbXVtTGVuZ3RoPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT52ZW5kb3Jfc3BlY2lmaWM8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT52ZW5kb3Igc3BlY2lmaWM8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZUxpc3QiPgorICAgICAgPEVsZW1lbnRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgIDwvRWxlbWVudFR5cGU+CisgICAgICA8TWluaW11bUxlbmd0aD40PC9NaW5pbXVtTGVuZ3RoPgorICAgICAgPE1heGltdW1MZW5ndGg+NDwvTWF4aW11bUxlbmd0aD4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgIDwvRmllbGRzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVBbGlhcyI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5zZXJ2aWNlX3BvcnRfaWQ8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+U2VydmljZSBwb3J0IGlkPC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjI8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZVN0cnVjdHVyZSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5zbGE8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+U0xBPC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8T3B0aW9ucz5QcmVzZW5jZU1hc2s8L09wdGlvbnM+CisgICA8RmllbGRzPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5taW5fcmF0ZTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPk1pbmltdW0gcmF0ZTwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+VGhlIG1pbmltYWwgcmF0ZSBmb3IgdGhpcyBmbG93LCBpbiBraWxvYml0cyBwZXIgc2Vjb25kIChvcHRpb25hbCk8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICA8V2lkdGg+NDwvV2lkdGg+CisgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPm1heF9yYXRlPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+TWF4aW11bSByYXRlPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5UaGUgbWF4aW11bSByYXRlIGZvciB0aGlzIGZsb3csIGluIGtpbG9iaXRzIHBlciBzZWNvbmQgKG9wdGlvbmFsKTwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgIDxXaWR0aD40PC9XaWR0aD4KKyAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgIDwvRmllbGRzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVFbnVtIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPnN0YXRlPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPnN0YXRlPC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+QWRtaW4gc3RhdGUgdmFsdWVzIGZvciBhY2Nlc3MgdGVybWluYWwgb2JqZWN0PC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8RW50cmllcz4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnVwPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+VXA8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPkFkbWluIHN0YXRlIHVwPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjE8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+ZG93bjwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPkRvd248L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPkFkbWluIHN0YXRlIGRvd248L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MjwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT50ZXN0aW5nPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+VGVzdGluZzwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+QWRtaW4gc3RhdGUgdGVzdGluZzwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4zPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgIDwvRW50cmllcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlRW51bSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5zdGF0dXM8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+c3RhdHVzPC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+T3BlciBzdGF0dXMgdmFsdWVzPC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8RW50cmllcz4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnVwPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+VXA8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPk9wZXIgc3RhdHVzIHVwPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjE8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+ZG93bjwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPkRvd248L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPk9wZXIgc3RhdHVzIGRvd248L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MjwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT50ZXN0aW5nPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+VGVzdGluZzwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+T3BlciBzdGF0dXMgdGVzdGluZzwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4zPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPm5vdF9wcmVzZW50PC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+Tm90IHByZXNlbnQ8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPk9wZXIgc3RhdHVzIG5vdCBwcmVzZW50PC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjQ8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+bG93ZXJfbGF5ZXJfZG93bjwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPkxvd2VyIGxheWVyIGRvd248L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPk9wZXIgc3RhdHVzIGxvd2VyIGxheWVyIGRvd248L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+NTwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT51bmtub3duPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+VW5rbm93bjwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+T3BlciBzdGF0dXMgdW5rbm93bjwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT42PC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgIDwvRW50cmllcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlQWxpYXMiPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+c3ViX2lkPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPlN1YnRlcm1pbmFsIFRlcm1pbmFsIElEPC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8Q29uc3RhbnRzPgorICAgIDxBbGlhc0NvbnN0YW50RW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+dW5rbm93bjwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPlVua25vd248L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MHhGRkZGPC9WYWx1ZT4KKyAgICA8L0FsaWFzQ29uc3RhbnRFbnRyeT4KKyAgIDwvQ29uc3RhbnRzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVDbGFzc2lmaWVkU3RydWN0dXJlIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPnRtX2JhYzwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT50bV9iYWM8L0xvbmdOYW1lPgorICAgIDxEZXNjcmlwdGlvbj5RdWV1ZSBCdWZmZXIgQWRtaXNzaW9uIENvbnRyb2w8L0Rlc2NyaXB0aW9uPgorICAgPC9MYWJlbD4KKyAgIDxDb21tb25GaWVsZHM+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnR5cGU8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT50eXBlPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5CdWZmZXIgQWRtaXNzaW9uIENvbnRyb2wgVHlwZTwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgIDxTaG9ydE5hbWU+dG1fYmFjX3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgIDwvQ29tbW9uRmllbGRzPgorICAgPENsYXNzaWZpZXJGaWVsZE5hbWU+dHlwZTwvQ2xhc3NpZmllckZpZWxkTmFtZT4KKyAgIDxDbGFzc2lmaWVkU3RydWN0dXJlcz4KKyAgICA8Q2xhc3NpZmllZFN0cnVjdHVyZT4KKyAgICAgPENsYXNzaWZpZXJWYWx1ZT50YWlsZHJvcDwvQ2xhc3NpZmllclZhbHVlPgorICAgICA8RW1iZWRkZWRTdHJ1Y3R1cmU+CisgICAgICA8TGFiZWw+CisgICAgICAgPFNob3J0TmFtZT48L1Nob3J0TmFtZT4KKyAgICAgICA8TG9uZ05hbWU+PC9Mb25nTmFtZT4KKyAgICAgIDwvTGFiZWw+CisgICAgICA8RmllbGRzPgorICAgICAgIDxGaWVsZD4KKyAgICAgICAgPExhYmVsPgorICAgICAgICAgPFNob3J0TmFtZT5tYXhfc2l6ZTwvU2hvcnROYW1lPgorICAgICAgICAgPExvbmdOYW1lPm1heF9zaXplPC9Mb25nTmFtZT4KKyAgICAgICAgIDxEZXNjcmlwdGlvbj5tYXggbnVtYmVyIG9mIHBhY2tldHMgaW4gdGhlIHF1ZXVlPC9EZXNjcmlwdGlvbj4KKyAgICAgICAgPC9MYWJlbD4KKyAgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8L0ZpZWxkPgorICAgICAgPC9GaWVsZHM+CisgICAgIDwvRW1iZWRkZWRTdHJ1Y3R1cmU+CisgICAgPC9DbGFzc2lmaWVkU3RydWN0dXJlPgorICAgIDxDbGFzc2lmaWVkU3RydWN0dXJlPgorICAgICA8Q2xhc3NpZmllclZhbHVlPnJlZDwvQ2xhc3NpZmllclZhbHVlPgorICAgICA8RW1iZWRkZWRTdHJ1Y3R1cmU+CisgICAgICA8TGFiZWw+CisgICAgICAgPFNob3J0TmFtZT48L1Nob3J0TmFtZT4KKyAgICAgICA8TG9uZ05hbWU+PC9Mb25nTmFtZT4KKyAgICAgIDwvTGFiZWw+CisgICAgICA8RmllbGRzPgorICAgICAgIDxGaWVsZD4KKyAgICAgICAgPExhYmVsPgorICAgICAgICAgPFNob3J0TmFtZT5yZWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgIDxMb25nTmFtZT5yZWQ8L0xvbmdOYW1lPgorICAgICAgICAgPERlc2NyaXB0aW9uPlJhbmRvbSBFYXJseSBEaXNjYXJkIGNvbmZpZ3VyYXRpb248L0Rlc2NyaXB0aW9uPgorICAgICAgICA8L0xhYmVsPgorICAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgICA8U2hvcnROYW1lPnRtX3JlZDwvU2hvcnROYW1lPgorICAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8L0ZpZWxkPgorICAgICAgPC9GaWVsZHM+CisgICAgIDwvRW1iZWRkZWRTdHJ1Y3R1cmU+CisgICAgPC9DbGFzc2lmaWVkU3RydWN0dXJlPgorICAgIDxDbGFzc2lmaWVkU3RydWN0dXJlPgorICAgICA8Q2xhc3NpZmllclZhbHVlPndyZWQ8L0NsYXNzaWZpZXJWYWx1ZT4KKyAgICAgPEVtYmVkZGVkU3RydWN0dXJlPgorICAgICAgPExhYmVsPgorICAgICAgIDxTaG9ydE5hbWU+PC9TaG9ydE5hbWU+CisgICAgICAgPExvbmdOYW1lPjwvTG9uZ05hbWU+CisgICAgICA8L0xhYmVsPgorICAgICAgPEZpZWxkcz4KKyAgICAgICA8RmllbGQ+CisgICAgICAgIDxMYWJlbD4KKyAgICAgICAgIDxTaG9ydE5hbWU+Z3JlZW48L1Nob3J0TmFtZT4KKyAgICAgICAgIDxMb25nTmFtZT5ncmVlbjwvTG9uZ05hbWU+CisgICAgICAgICA8RGVzY3JpcHRpb24+R3JlZW4gUmFuZG9tIEVhcmx5IERpc2NhcmQgQ29uZmlndXJhdGlvbjwvRGVzY3JpcHRpb24+CisgICAgICAgIDwvTGFiZWw+CisgICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgIDxTaG9ydE5hbWU+dG1fcmVkPC9TaG9ydE5hbWU+CisgICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDwvRmllbGQ+CisgICAgICAgPEZpZWxkPgorICAgICAgICA8TGFiZWw+CisgICAgICAgICA8U2hvcnROYW1lPnllbGxvdzwvU2hvcnROYW1lPgorICAgICAgICAgPExvbmdOYW1lPnllbGxvdzwvTG9uZ05hbWU+CisgICAgICAgICA8RGVzY3JpcHRpb24+WWVsbG93IFJhbmRvbSBFYXJseSBEaXNjYXJkIENvbmZpZ3VyYXRpb248L0Rlc2NyaXB0aW9uPgorICAgICAgICA8L0xhYmVsPgorICAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgICA8U2hvcnROYW1lPnRtX3JlZDwvU2hvcnROYW1lPgorICAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8L0ZpZWxkPgorICAgICAgIDxGaWVsZD4KKyAgICAgICAgPExhYmVsPgorICAgICAgICAgPFNob3J0TmFtZT5yZWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgIDxMb25nTmFtZT5yZWQ8L0xvbmdOYW1lPgorICAgICAgICAgPERlc2NyaXB0aW9uPlJlZCBSYW5kb20gRWFybHkgRGlzY2FyZCBDb25maWd1cmF0aW9uPC9EZXNjcmlwdGlvbj4KKyAgICAgICAgPC9MYWJlbD4KKyAgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICAgPFNob3J0TmFtZT50bV9yZWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPC9GaWVsZD4KKyAgICAgIDwvRmllbGRzPgorICAgICA8L0VtYmVkZGVkU3RydWN0dXJlPgorICAgIDwvQ2xhc3NpZmllZFN0cnVjdHVyZT4KKyAgIDwvQ2xhc3NpZmllZFN0cnVjdHVyZXM+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUVudW0iPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+dG1fYmFjX3R5cGU8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+dG1fYmFjX3R5cGU8L0xvbmdOYW1lPgorICAgIDxEZXNjcmlwdGlvbj5CdWZmZXIgQWRtaXNzaW9uIENvbnRyb2wgVHlwZTwvRGVzY3JpcHRpb24+CisgICA8L0xhYmVsPgorICAgPEJhc2VUeXBlPgorICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICA8L0Jhc2VUeXBlPgorICAgPEVudHJpZXM+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT50YWlsZHJvcDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPnRhaWxkcm9wPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5UYWlsZHJvcCA8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MDwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT53dGFpbGRyb3A8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT53dGFpbGRyb3A8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPldlaWdodGVkIHRhaWxkcm9wPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjE8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+cmVkPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+cmVkPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5SYW5kb20gRWFybHkgRGlzY2FyZDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4yPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPndyZWQ8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT53cmVkPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5XZWlnaHRlZCBSYW5kb20gRWFybHkgRGlzY2FyZDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4zPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgIDwvRW50cmllcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlRW51bSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT50bV9jcmVhdGlvbl9tb2RlPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPnRtX2NyZWF0aW9uX21vZGU8L0xvbmdOYW1lPgorICAgIDxEZXNjcmlwdGlvbj5UTSBDcmVhdGlvbiBNb2RlPC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8RW50cmllcz4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPm1hbnVhbDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPm1hbnVhbDwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+dG0gb2JqZWN0IGNyZWF0ZWQgbWFudWFsbHk8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MDwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5hdXRvPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+YXV0bzwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+dG0gb2JqZWN0IGNyZWF0ZWQgYXV0b21hdGljYWxseTwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4xPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgIDwvRW50cmllcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlQWxpYXMiPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+dG1fcHJpb3JpdHk8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+dG1fcHJpb3JpdHk8L0xvbmdOYW1lPgorICAgIDxEZXNjcmlwdGlvbj5TY2hlZHVsaW5nIFByaW9yaXR5PC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUFsaWFzIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPnRtX3F1ZXVlX2lkPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPnRtX3F1ZXVlX2lkPC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+UXVldWUgSUQ8L0Rlc2NyaXB0aW9uPgorICAgPC9MYWJlbD4KKyAgIDxCYXNlVHlwZT4KKyAgICA8V2lkdGg+MTwvV2lkdGg+CisgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgPC9CYXNlVHlwZT4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlU3RydWN0dXJlIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPnRtX3F1ZXVlX3JlZjwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT50bV9xdWV1ZV9yZWY8L0xvbmdOYW1lPgorICAgIDxEZXNjcmlwdGlvbj5RdWV1ZSBSZWZlcmVuY2U8L0Rlc2NyaXB0aW9uPgorICAgPC9MYWJlbD4KKyAgIDxGaWVsZHM+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnNjaGVkX2lkPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+U2NoZWR1bGVyIElEPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5TY2hlZHVsZXIgKHRtX3NjaGVkKSBJRDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+cXVldWVfaWQ8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5RdWV1ZSBJRDwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+UXVldWUgSUQ8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICA8U2hvcnROYW1lPnRtX3F1ZXVlX2lkPC9TaG9ydE5hbWU+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICA8L0ZpZWxkcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlU3RydWN0dXJlIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPnRtX3JlZDwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT50bV9yZWQ8L0xvbmdOYW1lPgorICAgIDxEZXNjcmlwdGlvbj5SYW5kb20gRWFybHkgRGlzY2FyZCBDb25maWd1cmF0aW9uPC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8RmllbGRzPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5taW5fdGhyZXNob2xkPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+bWluX3RocmVzaG9sZDwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+TWluIHRocmVzaG9sZCBpbiBwZXJjZW50IG9mIG1heCBxdWV1ZSBzaXplPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgPFNob3J0TmFtZT5wZXJjZW50PC9TaG9ydE5hbWU+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPm1heF90aHJlc2hvbGQ8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5tYXhfdGhyZXNob2xkPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5NYXggdGhyZXNob2xkIGluIHBlcmNlbnQgb2YgbWF4IHF1ZXVlIHNpemU8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICA8U2hvcnROYW1lPnBlcmNlbnQ8L1Nob3J0TmFtZT4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+bWF4X3Byb2JhYmlsaXR5PC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+bWF4X3Byb2JhYmlsaXR5PC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5EaXNjYXJkIHByb2JhYmlsaXR5IGZvciBvY2N1cGFuY3kgYmV0d2VlbiBtaW5fdGhyZXNob2xkIGFuZCBtYXhfdGhyZXNob2xkPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgPFNob3J0TmFtZT5wZXJjZW50PC9TaG9ydE5hbWU+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICA8L0ZpZWxkcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlRW51bSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT50bV9zY2hlZF9jaGlsZF90eXBlPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPnRtX3NjaGVkX2NoaWxkX3R5cGU8L0xvbmdOYW1lPgorICAgIDxEZXNjcmlwdGlvbj5TY2hlZHVsaW5nIExldmVsIGZvciB0aGUgQ2hpbGRyZW4gVE0gPC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8RW50cmllcz4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnF1ZXVlPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+cXVldWU8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlF1ZXVlLWxldmVsIHNjaGVkdWxlcjwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4wPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnNjaGVkPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+c2NoZWQ8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlNjaGVkdWxlci1sZXZlbCBzY2hlZHVsZXI8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MTwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICA8L0VudHJpZXM+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZUVudW0iPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfZGlyPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPnRtX3NjaGVkX2RpcjwvTG9uZ05hbWU+CisgICAgPERlc2NyaXB0aW9uPlRyYWZmaWMgRGlyZWN0aW9uPC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8RW50cmllcz4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnVzPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+dXBzdHJlYW08L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlVwc3RyZWFtPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjE8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+ZHM8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5kb3duc3RyZWFtPC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5Eb3duc3RyZWFtPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjI8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgPC9FbnRyaWVzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVBbGlhcyI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT50bV9zY2hlZF9pZDwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT50bV9zY2hlZF9pZDwvTG9uZ05hbWU+CisgICAgPERlc2NyaXB0aW9uPlRNIFNjaGVkdWxlciBJRDwvRGVzY3JpcHRpb24+CisgICA8L0xhYmVsPgorICAgPEJhc2VUeXBlPgorICAgIDxXaWR0aD40PC9XaWR0aD4KKyAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICA8L0Jhc2VUeXBlPgorICAgPENvbnN0YW50cz4KKyAgICA8QWxpYXNDb25zdGFudEVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnVua25vd248L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5Vbmtub3duPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjY1NTM1PC9WYWx1ZT4KKyAgICA8L0FsaWFzQ29uc3RhbnRFbnRyeT4KKyAgIDwvQ29uc3RhbnRzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVBbGlhcyI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT50bV9zY2hlZF9pZF9pbmRleDwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT50bSBub2RlIGlkIGluZGV4PC9Mb25nTmFtZT4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjI8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8TWluaW11bVZhbHVlPjA8L01pbmltdW1WYWx1ZT4KKyAgIDxNYXhpbXVtVmFsdWU+MjA0ODwvTWF4aW11bVZhbHVlPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVDbGFzc2lmaWVkU3RydWN0dXJlIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPnRtX3NjaGVkX293bmVyPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPnRtX3NjaGVkX293bmVyPC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+VE0gU2NoZWR1bGVyIE93bmVyPC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8Q29tbW9uRmllbGRzPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT50eXBlPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+dHlwZTwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+T3duZXIgdHlwZTwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfb3duZXJfdHlwZTwvU2hvcnROYW1lPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgPC9Db21tb25GaWVsZHM+CisgICA8Q2xhc3NpZmllckZpZWxkTmFtZT50eXBlPC9DbGFzc2lmaWVyRmllbGROYW1lPgorICAgPENsYXNzaWZpZWRTdHJ1Y3R1cmVzPgorICAgIDxDbGFzc2lmaWVkU3RydWN0dXJlPgorICAgICA8Q2xhc3NpZmllclZhbHVlPmludGVyZmFjZTwvQ2xhc3NpZmllclZhbHVlPgorICAgICA8RW1iZWRkZWRTdHJ1Y3R1cmU+CisgICAgICA8TGFiZWw+CisgICAgICAgPFNob3J0TmFtZT48L1Nob3J0TmFtZT4KKyAgICAgICA8TG9uZ05hbWU+PC9Mb25nTmFtZT4KKyAgICAgIDwvTGFiZWw+CisgICAgICA8RmllbGRzPgorICAgICAgIDxGaWVsZD4KKyAgICAgICAgPExhYmVsPgorICAgICAgICAgPFNob3J0TmFtZT5pbnRmX3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgICAgIDxMb25nTmFtZT5pbnRmX3R5cGU8L0xvbmdOYW1lPgorICAgICAgICAgPERlc2NyaXB0aW9uPkludGVyZmFjZSBUeXBlPC9EZXNjcmlwdGlvbj4KKyAgICAgICAgPC9MYWJlbD4KKyAgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICAgPFNob3J0TmFtZT5pbnRmX3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPC9GaWVsZD4KKyAgICAgICA8RmllbGQ+CisgICAgICAgIDxMYWJlbD4KKyAgICAgICAgIDxTaG9ydE5hbWU+aW50Zl9pZDwvU2hvcnROYW1lPgorICAgICAgICAgPExvbmdOYW1lPmludGZfaWQ8L0xvbmdOYW1lPgorICAgICAgICAgPERlc2NyaXB0aW9uPkludGVyZmFjZSBJRDwvRGVzY3JpcHRpb24+CisgICAgICAgIDwvTGFiZWw+CisgICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgIDxTaG9ydE5hbWU+aW50Zl9pZDwvU2hvcnROYW1lPgorICAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8L0ZpZWxkPgorICAgICAgPC9GaWVsZHM+CisgICAgIDwvRW1iZWRkZWRTdHJ1Y3R1cmU+CisgICAgPC9DbGFzc2lmaWVkU3RydWN0dXJlPgorICAgIDxDbGFzc2lmaWVkU3RydWN0dXJlPgorICAgICA8Q2xhc3NpZmllclZhbHVlPnN1Yl90ZXJtPC9DbGFzc2lmaWVyVmFsdWU+CisgICAgIDxFbWJlZGRlZFN0cnVjdHVyZT4KKyAgICAgIDxMYWJlbD4KKyAgICAgICA8U2hvcnROYW1lPjwvU2hvcnROYW1lPgorICAgICAgIDxMb25nTmFtZT48L0xvbmdOYW1lPgorICAgICAgPC9MYWJlbD4KKyAgICAgIDxGaWVsZHM+CisgICAgICAgPEZpZWxkPgorICAgICAgICA8TGFiZWw+CisgICAgICAgICA8U2hvcnROYW1lPmludGZfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgIDxMb25nTmFtZT5pbnRmX2lkPC9Mb25nTmFtZT4KKyAgICAgICAgIDxEZXNjcmlwdGlvbj5QT04gaW50ZXJmYWNlIGlkPC9EZXNjcmlwdGlvbj4KKyAgICAgICAgPC9MYWJlbD4KKyAgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICAgPFNob3J0TmFtZT5pbnRmX2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDwvRmllbGQ+CisgICAgICAgPEZpZWxkPgorICAgICAgICA8TGFiZWw+CisgICAgICAgICA8U2hvcnROYW1lPnN1Yl90ZXJtX2lkPC9TaG9ydE5hbWU+CisgICAgICAgICA8TG9uZ05hbWU+c3ViX3Rlcm1faWQ8L0xvbmdOYW1lPgorICAgICAgICAgPERlc2NyaXB0aW9uPlN1YnNjcmliZXIgdGVybWluYWwgSUQ8L0Rlc2NyaXB0aW9uPgorICAgICAgICA8L0xhYmVsPgorICAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgICA8U2hvcnROYW1lPnN1Yl9pZDwvU2hvcnROYW1lPgorICAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8L0ZpZWxkPgorICAgICAgPC9GaWVsZHM+CisgICAgIDwvRW1iZWRkZWRTdHJ1Y3R1cmU+CisgICAgPC9DbGFzc2lmaWVkU3RydWN0dXJlPgorICAgIDxDbGFzc2lmaWVkU3RydWN0dXJlPgorICAgICA8Q2xhc3NpZmllclZhbHVlPmFnZ19wb3J0PC9DbGFzc2lmaWVyVmFsdWU+CisgICAgIDxFbWJlZGRlZFN0cnVjdHVyZT4KKyAgICAgIDxMYWJlbD4KKyAgICAgICA8U2hvcnROYW1lPjwvU2hvcnROYW1lPgorICAgICAgIDxMb25nTmFtZT48L0xvbmdOYW1lPgorICAgICAgPC9MYWJlbD4KKyAgICAgIDxPcHRpb25zPlByZXNlbmNlTWFzazwvT3B0aW9ucz4KKyAgICAgIDxGaWVsZHM+CisgICAgICAgPEZpZWxkPgorICAgICAgICA8TGFiZWw+CisgICAgICAgICA8U2hvcnROYW1lPmludGZfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgIDxMb25nTmFtZT5pbnRmX2lkPC9Mb25nTmFtZT4KKyAgICAgICAgIDxEZXNjcmlwdGlvbj5QT04gaW50ZXJmYWNlIGlkPC9EZXNjcmlwdGlvbj4KKyAgICAgICAgPC9MYWJlbD4KKyAgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8L0ZpZWxkPgorICAgICAgIDxGaWVsZD4KKyAgICAgICAgPExhYmVsPgorICAgICAgICAgPFNob3J0TmFtZT5zdWJfdGVybV9pZDwvU2hvcnROYW1lPgorICAgICAgICAgPExvbmdOYW1lPnN1Yl90ZXJtX2lkPC9Mb25nTmFtZT4KKyAgICAgICAgIDxEZXNjcmlwdGlvbj5TdWJzY3JpYmVyIHRlcm1pbmFsIGlkPC9EZXNjcmlwdGlvbj4KKyAgICAgICAgPC9MYWJlbD4KKyAgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICAgPFNob3J0TmFtZT5zdWJfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPC9GaWVsZD4KKyAgICAgICA8RmllbGQ+CisgICAgICAgIDxMYWJlbD4KKyAgICAgICAgIDxTaG9ydE5hbWU+YWdnX3BvcnRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgIDxMb25nTmFtZT5hZ2dfcG9ydF9pZDwvTG9uZ05hbWU+CisgICAgICAgICA8RGVzY3JpcHRpb24+QWdncmVnYXRpb24gcG9ydCBpZDwvRGVzY3JpcHRpb24+CisgICAgICAgIDwvTGFiZWw+CisgICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgIDxTaG9ydE5hbWU+YWdncmVnYXRpb25fcG9ydF9pZDwvU2hvcnROYW1lPgorICAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICAgPE9wdGlvbnM+UmVhZE9ubHk8L09wdGlvbnM+CisgICAgICAgPC9GaWVsZD4KKyAgICAgIDwvRmllbGRzPgorICAgICA8L0VtYmVkZGVkU3RydWN0dXJlPgorICAgIDwvQ2xhc3NpZmllZFN0cnVjdHVyZT4KKyAgICA8Q2xhc3NpZmllZFN0cnVjdHVyZT4KKyAgICAgPENsYXNzaWZpZXJWYWx1ZT51bmk8L0NsYXNzaWZpZXJWYWx1ZT4KKyAgICAgPEVtYmVkZGVkU3RydWN0dXJlPgorICAgICAgPExhYmVsPgorICAgICAgIDxTaG9ydE5hbWU+PC9TaG9ydE5hbWU+CisgICAgICAgPExvbmdOYW1lPjwvTG9uZ05hbWU+CisgICAgICA8L0xhYmVsPgorICAgICAgPEZpZWxkcz4KKyAgICAgICA8RmllbGQ+CisgICAgICAgIDxMYWJlbD4KKyAgICAgICAgIDxTaG9ydE5hbWU+aW50Zl9pZDwvU2hvcnROYW1lPgorICAgICAgICAgPExvbmdOYW1lPmludGZfaWQ8L0xvbmdOYW1lPgorICAgICAgICAgPERlc2NyaXB0aW9uPlBPTiBpbnRlcmZhY2UgaWQ8L0Rlc2NyaXB0aW9uPgorICAgICAgICA8L0xhYmVsPgorICAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgICA8V2lkdGg+MTwvV2lkdGg+CisgICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDwvRmllbGQ+CisgICAgICAgPEZpZWxkPgorICAgICAgICA8TGFiZWw+CisgICAgICAgICA8U2hvcnROYW1lPnN1Yl90ZXJtX2lkPC9TaG9ydE5hbWU+CisgICAgICAgICA8TG9uZ05hbWU+c3ViX3Rlcm1faWQ8L0xvbmdOYW1lPgorICAgICAgICAgPERlc2NyaXB0aW9uPlN1YnNjcmliZXIgdGVybWluYWwgaWQ8L0Rlc2NyaXB0aW9uPgorICAgICAgICA8L0xhYmVsPgorICAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgICA8U2hvcnROYW1lPnN1Yl9pZDwvU2hvcnROYW1lPgorICAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8L0ZpZWxkPgorICAgICAgIDxGaWVsZD4KKyAgICAgICAgPExhYmVsPgorICAgICAgICAgPFNob3J0TmFtZT5pbmRleDwvU2hvcnROYW1lPgorICAgICAgICAgPExvbmdOYW1lPmluZGV4PC9Mb25nTmFtZT4KKyAgICAgICAgIDxEZXNjcmlwdGlvbj5JbmRleCBhdCBzdWJzY3JpYmVyIHRlcm1pbmFsPC9EZXNjcmlwdGlvbj4KKyAgICAgICAgPC9MYWJlbD4KKyAgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8L0ZpZWxkPgorICAgICAgPC9GaWVsZHM+CisgICAgIDwvRW1iZWRkZWRTdHJ1Y3R1cmU+CisgICAgPC9DbGFzc2lmaWVkU3RydWN0dXJlPgorICAgIDxDbGFzc2lmaWVkU3RydWN0dXJlPgorICAgICA8Q2xhc3NpZmllclZhbHVlPnZpcnR1YWw8L0NsYXNzaWZpZXJWYWx1ZT4KKyAgICAgPEVtYmVkZGVkU3RydWN0dXJlPgorICAgICAgPExhYmVsPgorICAgICAgIDxTaG9ydE5hbWU+PC9TaG9ydE5hbWU+CisgICAgICAgPExvbmdOYW1lPjwvTG9uZ05hbWU+CisgICAgICA8L0xhYmVsPgorICAgICAgPEZpZWxkcz4KKyAgICAgICA8RmllbGQ+CisgICAgICAgIDxMYWJlbD4KKyAgICAgICAgIDxTaG9ydE5hbWU+aW5kZXg8L1Nob3J0TmFtZT4KKyAgICAgICAgIDxMb25nTmFtZT5pbmRleDwvTG9uZ05hbWU+CisgICAgICAgICA8RGVzY3JpcHRpb24+T3duZXIgaW5kZXg8L0Rlc2NyaXB0aW9uPgorICAgICAgICA8L0xhYmVsPgorICAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgICA8V2lkdGg+NDwvV2lkdGg+CisgICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDwvRmllbGQ+CisgICAgICA8L0ZpZWxkcz4KKyAgICAgPC9FbWJlZGRlZFN0cnVjdHVyZT4KKyAgICA8L0NsYXNzaWZpZWRTdHJ1Y3R1cmU+CisgICA8L0NsYXNzaWZpZWRTdHJ1Y3R1cmVzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVFbnVtIj4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPnRtX3NjaGVkX293bmVyX3R5cGU8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+dG1fc2NoZWR1bGVyX293bmVyX3R5cGU8L0xvbmdOYW1lPgorICAgIDxEZXNjcmlwdGlvbj5UTSBTY2hlZHVsZXIgT3duZXIgVHlwZTwvRGVzY3JpcHRpb24+CisgICA8L0xhYmVsPgorICAgPEJhc2VUeXBlPgorICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICA8L0Jhc2VUeXBlPgorICAgPEVudHJpZXM+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT51bmRlZmluZWQ8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT51bmRlZmluZWQ8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlVuZGVmaW5lZDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4wPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmludGVyZmFjZTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmludGVyZmFjZTwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+SW50ZXJmYWNlPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjE8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+c3ViX3Rlcm08L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5zdWJzX3Rlcm08L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlN1YnNjcmliZXIgdGVybWluYWw8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MjwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5hZ2dfcG9ydDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmFnZ19wb3J0PC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5UTSBzY2hlZHVsZXIgaXMgb3duZWQgYnkgYWdncmVnYXRpb24gcG9ydDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4zPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnVuaTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPnVuaTwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+VE0gc2NoZWR1bGVyIGlzIG93bmVkIGJ5IFVOSSBwb3J0PC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjQ8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+dmlydHVhbDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPnZpcnR1YWw8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPk90aGVyIHVuc3BlY2lmaWVkIG93bmVyPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjU8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgPC9FbnRyaWVzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVTdHJ1Y3R1cmUiPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfcGFyZW50PC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPnRtX3NjaGVkX3BhcmVudDwvTG9uZ05hbWU+CisgICAgPERlc2NyaXB0aW9uPlNjaGVkdWxpbmcgUGFyZW50IENvbm5lY3QgUG9pbnQ8L0Rlc2NyaXB0aW9uPgorICAgPC9MYWJlbD4KKyAgIDxPcHRpb25zPlByZXNlbmNlTWFzazwvT3B0aW9ucz4KKyAgIDxGaWVsZHM+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnNjaGVkX2lkPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+c2NoZWRfaWQ8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlBhcmVudCBzY2hlZHVsZXIgaWQ8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICA8U2hvcnROYW1lPnRtX3NjaGVkX2lkPC9TaG9ydE5hbWU+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnByaW9yaXR5PC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+cHJpb3JpdHk8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlByaW9yaXR5PC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgPFNob3J0TmFtZT50bV9wcmlvcml0eTwvU2hvcnROYW1lPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT53ZWlnaHQ8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT53ZWlnaHQ8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPldlaWdodDwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgIDxTaG9ydE5hbWU+dG1fd2VpZ2h0PC9TaG9ydE5hbWU+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICA8L0ZpZWxkcz4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlRW51bSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT50bV9zY2hlZF90eXBlPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPnRtX3NjaGVkX3R5cGU8L0xvbmdOYW1lPgorICAgIDxEZXNjcmlwdGlvbj5TY2hlZHVsZXIgVHlwZTwvRGVzY3JpcHRpb24+CisgICA8L0xhYmVsPgorICAgPEJhc2VUeXBlPgorICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICA8L0Jhc2VUeXBlPgorICAgPEVudHJpZXM+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5ub25lPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+bm9uZTwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+Tk8gc2NoZWR1bGluZzwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4wPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPndmcTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPndmcTwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+V2VpZ2h0ZWQgRmFpciBRdWV1ZTwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4xPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnNwPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+c3A8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlN0cmljdCBQcmlvcml0eTwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT4yPC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnNwX3dmcTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPnNwX3dmcTwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+SHlicmlkIFNQICsgV0ZRPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjM8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgPC9FbnRyaWVzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVTdHJ1Y3R1cmUiPgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+dG1fc2hhcGluZzwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT50bV9zaGFwaW5nPC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+U2hhcGluZyBQYXJhbWV0ZXJzPC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8T3B0aW9ucz5QcmVzZW5jZU1hc2s8L09wdGlvbnM+CisgICA8RmllbGRzPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5zYnI8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5zYnI8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlN1c3RhaW5lZCBCaXQgUmF0ZSAoa2Jwcyk8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICA8V2lkdGg+NDwvV2lkdGg+CisgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnBicjwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPnBicjwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+UGVhayBCaXQgUmF0ZSAoa2Jwcyk8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICA8V2lkdGg+NDwvV2lkdGg+CisgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmJ1cnN0PC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+YnVyc3Q8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPk1heCBCdXJzdCBCeXRlcyBhdCBQZWFrIEJpdCBSYXRlPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgPC9GaWVsZHM+CisgIDwvQ3VzdG9tVHlwZT4KKyAgPEN1c3RvbVR5cGUgVHlwZT0iQ3VzdG9tVHlwZVN0cnVjdHVyZSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT50bV90Y29udF9zbGE8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+dG1fdGNvbnRfc2xhPC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+SVRVLVBPTiBFeHRlbmRlZCBTTEEgUGFyYW1ldGVyczwvRGVzY3JpcHRpb24+CisgICA8L0xhYmVsPgorICAgPE9wdGlvbnM+UHJlc2VuY2VNYXNrPC9PcHRpb25zPgorICAgPEZpZWxkcz4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+ZXh0cmFfYndfZWxpZzwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmV4dHJhX2J3X2VsaWc8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPkV4dHJhIEJXIGVsaWdpYmlsaXR5IHR5cGU8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICA8U2hvcnROYW1lPmV4dHJhX2J3X2VsaWdpYmlsaXR5X3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+bnJ0X2NicjwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPm5ydF9jYnI8L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPk5SVCBDQlI8L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICA8V2lkdGg+MTwvV2lkdGg+CisgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgIDwvRmllbGRUeXBlPgorICAgIDwvRmllbGQ+CisgICAgPEZpZWxkPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnJ0X2NicjwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPnJ0X2NicjwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+UlRfQ0JSPC9EZXNjcmlwdGlvbj4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICA8L0ZpZWxkVHlwZT4KKyAgICA8L0ZpZWxkPgorICAgIDxGaWVsZD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5ydF9wcm9maWxlPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+cnRfcHJvZmlsZTwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+UlQgUHJvZmlsZTwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgICA8RmllbGQ+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+bnJ0X3Byb2ZpbGU8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5rZXk6PC9Mb25nTmFtZT4KKyAgICAgIDxEZXNjcmlwdGlvbj5OUlQgUHJvZmlsZTwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgPC9GaWVsZFR5cGU+CisgICAgPC9GaWVsZD4KKyAgIDwvRmllbGRzPgorICA8L0N1c3RvbVR5cGU+CisgIDxDdXN0b21UeXBlIFR5cGU9IkN1c3RvbVR5cGVBbGlhcyI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT50bV93ZWlnaHQ8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+dG1fd2VpZ2h0PC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+U2NoZWR1bGluZyBXZWlnaHQ8L0Rlc2NyaXB0aW9uPgorICAgPC9MYWJlbD4KKyAgIDxCYXNlVHlwZT4KKyAgICA8V2lkdGg+MTwvV2lkdGg+CisgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgPC9CYXNlVHlwZT4KKyAgPC9DdXN0b21UeXBlPgorICA8Q3VzdG9tVHlwZSBUeXBlPSJDdXN0b21UeXBlRW51bSI+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT50cnhfdHlwZTwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5UcmFuc2NlaXZlciB0eXBlczwvTG9uZ05hbWU+CisgICAgPERlc2NyaXB0aW9uPlRyYW5zY2VpdmVyIHR5cGVzPC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8QmFzZVR5cGU+CisgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgIDwvQmFzZVR5cGU+CisgICA8RW50cmllcz4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmdwb25fc3BzXzQzXzQ4PC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+Z3Bvbl9zcHNfNDNfNDg8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+MDwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5ncG9uX3Nwc19zb2dfNDMyMTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmdwb25fc3BzX3NvZ180MzIxPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjE8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+Z3Bvbl9sdGVfMzY4MF9tPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+Z3Bvbl9sdGVfMzY4MF9tPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjI8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+Z3Bvbl9zb3VyY2VfcGhvdG9uaWNzPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+Z3Bvbl9zb3VyY2VfcGhvdG9uaWNzPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjM8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+Z3Bvbl9sdGVfMzY4MF9wPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+Z3Bvbl9sdGVfMzY4MF9wPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjQ8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgIDxFbnVtRW50cnk+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+eGdwb25fbHRoXzcyMjJfcGM8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT54Z3Bvbl9sdGhfNzIyMl9wYzwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxWYWx1ZT41PC9WYWx1ZT4KKyAgICA8L0VudW1FbnRyeT4KKyAgICA8RW51bUVudHJ5PgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnhncG9uX2x0aF83MjI2X3BjPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+eGdwb25fbHRoXzcyMjZfcGM8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VmFsdWU+NjwvVmFsdWU+CisgICAgPC9FbnVtRW50cnk+CisgICAgPEVudW1FbnRyeT4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT54Z3Bvbl9sdGhfNTMwMl9wYzwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPnhncG9uX2x0aF81MzAyX3BjPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFZhbHVlPjc8L1ZhbHVlPgorICAgIDwvRW51bUVudHJ5PgorICAgPC9FbnRyaWVzPgorICA8L0N1c3RvbVR5cGU+CisgPC9DdXN0b21UeXBlcz4KKyA8T21PYmplY3RzPgorICA8T2JqZWN0TW9kZWwuT21PYmplY3Q+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5hY2Nlc3NfdGVybWluYWw8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+QkFMIEFjY2VzcyBUZXJtaW5hbDwvTG9uZ05hbWU+CisgICAgPERlc2NyaXB0aW9uPkJBTCBBY2Nlc3MgVGVybWluYWwgT2JqZWN0PC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8R3JvdXBzPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmtleTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmtleTwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZHM+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmFjY2Vzc190ZXJtX2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5hY2Nlc3NfdGVybV9pZDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5SZXNlcnZlZCAoc2V0IHRvIDApPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5hY2Nlc3NfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8RGVmYXVsdFZhbHVlPjE8L0RlZmF1bHRWYWx1ZT4KKyAgICAgICA8TWluaW11bVZhbHVlPjE8L01pbmltdW1WYWx1ZT4KKyAgICAgICA8TWF4aW11bVZhbHVlPjE8L01heGltdW1WYWx1ZT4KKyAgICAgICA8T3B0aW9ucz5SZXNlcnZlZCwgSXNJbnN0YW5jZU51bWJlcjwvT3B0aW9ucz4KKyAgICAgIDwvRmllbGQ+CisgICAgIDwvRmllbGRzPgorICAgIDwvT2JqZWN0TW9kZWwuT21Hcm91cD4KKyAgICA8T2JqZWN0TW9kZWwuT21Hcm91cD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5jZmc8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5jZmc8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VHlwZT5Db25maWd1cmF0aW9uPC9UeXBlPgorICAgICA8RmllbGRzPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5hZG1pbl9zdGF0ZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+QWRtaW5pc3RyYXRpdmUgc3RhdGU8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW5pc3RyYXRpdmUgc3RhdGU8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnN0YXRlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5vcGVyX3N0YXR1czwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+T3BlcmF0aW9uYWwgc3RhdHVzPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPk9wZXJhdGlvbmFsIHN0YXR1czwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+c3RhdHVzPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPE9wdGlvbnM+UmVhZE9ubHk8L09wdGlvbnM+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5pd2ZfbW9kZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+SW50ZXJ3b3JraW5nIGZ1bmN0aW9uIG1vZGU8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+VGhlIGludGVyd29ya2luZyBtb2RlPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5pd2ZfbW9kZTwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDxPcHRpb25zPlJlYWRPbmx5PC9PcHRpb25zPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmluZDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPkFjY2VzcyBUZXJtaW5hbCBJbmRpY2F0aW9uPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFR5cGU+SW5kaWNhdGlvbjwvVHlwZT4KKyAgICAgPEZpZWxkcz4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+YWRtaW5fc3RhdGU8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkFkbWluaXN0cmF0aXZlIHN0YXRlPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkN1cnJlbnQgYWRtaW5pc3RyYXRpdmUgc3RhdGU8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnN0YXRlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5vcGVyX3N0YXR1czwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+T3BlcmF0aW9uYWwgc3RhdHVzPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkN1cnJlbnQgb3BlcmF0aW9uYWwgc3RhdHVzPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5zdGF0dXM8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPml3Zl9tb2RlPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5JbnRlcndvcmtpbmcgZnVuY3Rpb24gbW9kZTwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgaW50ZXJ3b3JraW5nIG1vZGU8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPml3Zl9tb2RlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICA8L0ZpZWxkcz4KKyAgICA8L09iamVjdE1vZGVsLk9tR3JvdXA+CisgICA8L0dyb3Vwcz4KKyAgPC9PYmplY3RNb2RlbC5PbU9iamVjdD4KKyAgPE9iamVjdE1vZGVsLk9tT2JqZWN0PgorICAgPExhYmVsPgorICAgIDxTaG9ydE5hbWU+ZmxvdzwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5CQUwgRmxvdzwvTG9uZ05hbWU+CisgICA8L0xhYmVsPgorICAgPEdyb3Vwcz4KKyAgICA8T2JqZWN0TW9kZWwuT21Hcm91cD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5jZmc8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5jZmc8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VHlwZT5Db25maWd1cmF0aW9uPC9UeXBlPgorICAgICA8RmllbGRzPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5hZG1pbl9zdGF0ZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+QWRtaW5pc3RyYXRpdmUgc3RhdGU8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW5pc3RyYXRpdmUgc3RhdGU8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnN0YXRlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5vcGVyX3N0YXR1czwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+T3BlcmF0aW9uYWwgc3RhdHVzPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPk9wZXJhdGlvbmFsIHN0YXR1czwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+c3RhdHVzPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPE9wdGlvbnM+UmVhZE9ubHk8L09wdGlvbnM+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5hY2Nlc3NfaW50X2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5BY2Nlc3MgSW50ZXJmYWNlIElEPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBJRCBvZiB0aGUgc3Vic2NyaWJlciBzaWRlIGludGVyZmFjZTsgaS5lLiBQT048L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPmludGZfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPm5ldHdvcmtfaW50X2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5OZXR3b3JrIEludGVyZmFjZSBJRDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgSUQgb2YgdGhlIG5ldHdvcmsgc2lkZSBpbnRlcmZhY2U7IGkuZS4gTk5JPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5pbnRmX2lkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5zdWJfdGVybV9pZDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+U3Vic2NyaWJlciBUZXJtaW5hbCBJRDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgSUQgb2YgdGhlIHN1YnNjY3JpYmVyIHRlcm1pbmFsIGRldmljZTwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+c3ViX2lkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5zdWJfdGVybV91bmlfaWR4PC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5TdWJzY3JpYmVyIFRlcm1pbmFsIHVuaSBwb3J0IGluZGV4PC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBpbmRleCBvZiB0aGUgc3Vic2NjcmliZXIgdGVybWluYWwgdW5pIHBvcnQgdGhlIGZsb3cgaXMgcmVsYXRlZCB0bzwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+c3ZjX3BvcnRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlNlcnZpY2UgUG9ydCBJRDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgSUQgb2YgdGhlIHNlcnZpY2UgcG9ydCAoZm9yIEdQT04vWEdQT04gLSBHRU0gSUQpPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5zZXJ2aWNlX3BvcnRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmFnZ19wb3J0X2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5BZ2dyZWdhdGUgcG9ydCBJRDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgSUQgb2YgdGhlIGFnZ3JlZ2F0ZSBwb3J0IChmb3IgR1BPTi9YR1BPTiAtIEFMTE9DIElEKTwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+YWdncmVnYXRpb25fcG9ydF9pZDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+cmVzb2x2ZV9tYWM8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlJlc29sdmUgbWFjPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkEgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBNQUMgYWRkcmVzcyB0YWJsZSBzaG91bGQgYmUgdXNlZCBpbiBEUyBHRU0gcmVzb2x1dGlvbjwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZUJvb2xlYW4iIC8+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5jbGFzc2lmaWVyPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5DbGFzc2lmaWVyPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBjbGFzc2lmaWVyIGZvciB0aGlzIGZsb3c8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPmNsYXNzaWZpZXI8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmFjdGlvbjwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+QWN0aW9uPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBmbG93PC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5hY3Rpb248L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnNsYTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+U0xBPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlNMQSBwYXJhbWV0ZXJzIGZvciB0aGlzIGZsb3c8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnNsYTwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+Y29va2llPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5Db29raWU8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+QXBwbGljYXRpb24gY29va2llPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5jb29raWU8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnByaW9yaXR5PC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5Qcmlvcml0eTwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5Qcmlvcml0eSBmb3IgdGhpcyBmbG93IGluIGNhc2Ugb2YgbXVsdGlwbGUgbWF0Y2guCitIaWdoZXIgdmFsdWUgcHJlY2VkbmVjZSBvdmVyIGxvd2VyIHZhbHVlLjwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD4yPC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDxNaW5pbXVtVmFsdWU+MTwvTWluaW11bVZhbHVlPgorICAgICAgIDxNYXhpbXVtVmFsdWU+MjU1PC9NYXhpbXVtVmFsdWU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5ncm91cF9pZDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+R3JvdXAgSUQ8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+UlcgLSBUaGUgbXVsdGljYXN0IGdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZsb3csIHZhbGlkIGZvciB0eXBlIE1VTFRJQ0FTVCBvbmx5PC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5ncm91cF9pZDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+cXVldWU8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkVncmVzcyBxdWV1ZTwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5FZ3Jlc3MgcXVldWU8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnRtX3F1ZXVlX3JlZjwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmtleTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmtleTwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZHM+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmZsb3dfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkZsb3cgSUQ8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+VGhlIElEIG9mIHRoZSBmbG93IG9iamVjdCBpbnN0YW5jZSBiZWluZyByZWZlcmVuY2VkPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5mbG93X2lkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPE9wdGlvbnM+SXNJbnN0YW5jZU51bWJlcjwvT3B0aW9ucz4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmZsb3dfdHlwZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+RmxvdyB0eXBlPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSB0eXBlIG9mIHRoZSBmbG93LCBVcHN0cmVhbSwgRG93bnN0cmVhbSwgQnJvYWRjYXN0IG9yIE11bHRpY2FzdDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+Zmxvd190eXBlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICA8L0ZpZWxkcz4KKyAgICA8L09iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgPE9iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+c3RhdDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPnN0YXQ8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VHlwZT5TdGF0aXN0aWNzPC9UeXBlPgorICAgICA8RmllbGRzPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5yeF9wYWNrZXRzPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5SZWNlaXZlZCBwYWNrZXRzPC9Mb25nTmFtZT4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgPFdpZHRoPjg8L1dpZHRoPgorICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5yeF9ieXRlczwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+UmVjZWl2ZWQgYnl0ZXM8L0xvbmdOYW1lPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+ODwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnR4X3BhY2tldHM8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlRyYW5zbWl0dGVkIHBhY2tldHM8L0xvbmdOYW1lPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+ODwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnR4X2J5dGVzPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5UcmFuc21pdHRlZCBieXRlczwvTG9uZ05hbWU+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD44PC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmluZDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPkZsb3cgSW5kaWNhdGlvbjwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxUeXBlPkluZGljYXRpb248L1R5cGU+CisgICAgIDxGaWVsZHM+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmFkbWluX3N0YXRlPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5BZG1pbmlzdHJhdGl2ZSBzdGF0ZTwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbmlzdHJhdGl2ZSBzdGF0ZTwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+c3RhdGU8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPm9wZXJfc3RhdHVzPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5PcGVyYXRpb25hbCBzdGF0dXM8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+T3BlcmF0aW9uYWwgU3RhdHVzPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5zdGF0dXM8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmFjY2Vzc19pbnRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkFjY2VzcyBpbnRlcmZhY2UgSUQ8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+VGhlIElEIG9mIHRoZSBzdWJzY3JpYmVyIHNpZGUgaW50ZXJmYWNlOyBpLmUuIFBPTjwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD4yPC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+bmV0d29ya19pbnRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPk5ldHdvcmsgSW50ZXJmYWNlIElEPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBJRCBvZiB0aGUgbmV0d29yayBzaWRlIGludGVyZmFjZTsgaS5lLiBOTkk8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+MjwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnN1Yl90ZXJtX2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5TdWJzY3JpYmVyIHRlcm1pbmFsIElEPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBJRCBvZiB0aGUgc3Vic2NjcmliZXIgdGVybWluYWwgZGV2aWNlPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5zdmNfcG9ydF9pZDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+U2VydmljZSBwb3J0IElEPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBJRCBvZiB0aGUgc2VydmljZSBwb3J0IChmb3IgR1BPTi9YR1BPTiAtIEdFTSBJRCk8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+MjwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmFnZ19wb3J0X2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5BZ2dyZWdhdGUgcG9ydCBJRDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgSUQgb2YgdGhlIGFnZ3JlZ2F0ZSBwb3J0IChmb3IgR1BPTi9YR1BPTiAtIEFMTE9DIElEKTwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD4yPC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+cmVzb2x2ZV9tYWM8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlJlc29sdmUgbWFjPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkEgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBNQUMgYWRkcmVzcyB0YWJsZSBzaG91bGQgYmUgdXNlZCBpbiBEUyBHRU0gcmVzb2x1dGlvbjwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZUJvb2xlYW4iIC8+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5iYXNlX3RjX2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5CYXNlIFRDT05UIElEPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBiYXNlIGluZGV4IG9mIHRoZSBUQyBvYmplY3QocykgdG8gYmUgdXNlZCBmb3IgdGhpcyBmbG93PC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgPFdpZHRoPjI8L1dpZHRoPgorICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5jbGFzc2lmaWVyPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5DbGFzc2lmaWVyPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBjbGFzc2lmaWVyIGZvciB0aGlzIGZsb3c8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPmNsYXNzaWZpZXI8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmFjdGlvbjwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+QWN0aW9uPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBmbG93PC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5hY3Rpb248L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnNsYTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+U0xBPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlNMQSBwYXJhbWV0ZXJzIGZvciB0aGlzIGZsb3c8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnNsYTwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+Y29va2llPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5Db29raWU8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+QXBwbGljYXRpb24gY29va2llPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5wcmlvcml0eTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+UHJpb3JpdHk8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+UHJpb3JpdHkgZm9yIHRoaXMgZmxvdyBpbiBjYXNlIG9mIG11bHRpcGxlIG1hdGNoLgorSGlnaGVyIHZhbHVlIHByZWNlZG5lY2Ugb3ZlciBsb3dlciB2YWx1ZS48L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+MjwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8TWluaW11bVZhbHVlPjE8L01pbmltdW1WYWx1ZT4KKyAgICAgICA8TWF4aW11bVZhbHVlPjI1NTwvTWF4aW11bVZhbHVlPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgPC9Hcm91cHM+CisgIDwvT2JqZWN0TW9kZWwuT21PYmplY3Q+CisgIDxPYmplY3RNb2RlbC5PbU9iamVjdD4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPmdyb3VwPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPkJBTCBHcm91cDwvTG9uZ05hbWU+CisgICA8L0xhYmVsPgorICAgPEdyb3Vwcz4KKyAgICA8T2JqZWN0TW9kZWwuT21Hcm91cD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5jZmc8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5jZmc8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VHlwZT5Db25maWd1cmF0aW9uPC9UeXBlPgorICAgICA8RmllbGRzPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5tZW1iZXJzX2NtZDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+TWVtYmVyc2hpcCBvcGVyYXRpb24gY29tbWFuZHM8L0xvbmdOYW1lPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPmdyb3VwX21lbWJlcl9jbWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPm1lbWJlcnM8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPk1lbWJlcjwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgbGlzdCBvZiBtZW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdyb3VwPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTGlzdCI+CisgICAgICAgIDxFbGVtZW50VHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICAgPFNob3J0TmFtZT5ncm91cF9tZW1iZXJfaW5mbzwvU2hvcnROYW1lPgorICAgICAgICA8L0VsZW1lbnRUeXBlPgorICAgICAgICA8QXV0b0NvdW50RmllbGRUeXBlPgorICAgICAgICAgPFdpZHRoPjI8L1dpZHRoPgorICAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgICA8L0F1dG9Db3VudEZpZWxkVHlwZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmNvb2tpZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+QXBwbGljYXRpb24gY29va2llPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkFwcGxpY2F0aW9uIGNvb2tpZTwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+Y29va2llPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5mbG93czwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+TGlzdCBvZiBmbG93cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdyb3VwIDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5MaXN0IG9mIGZsb3dzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdyb3VwPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTGlzdCI+CisgICAgICAgIDxFbGVtZW50VHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICAgPFNob3J0TmFtZT5mbG93X2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDwvRWxlbWVudFR5cGU+CisgICAgICAgIDxBdXRvQ291bnRGaWVsZFR5cGU+CisgICAgICAgICA8V2lkdGg+NDwvV2lkdGg+CisgICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgIDwvQXV0b0NvdW50RmllbGRUeXBlPgorICAgICAgICA8TWluaW11bUxlbmd0aD4wPC9NaW5pbXVtTGVuZ3RoPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDxPcHRpb25zPlJlYWRPbmx5PC9PcHRpb25zPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+b3duZXI8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPk93bmVyIG9mIHRoZSBncm91cDwvTG9uZ05hbWU+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+Z3JvdXBfb3duZXI8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8T3B0aW9ucz5SZWFkT25seTwvT3B0aW9ucz4KKyAgICAgIDwvRmllbGQ+CisgICAgIDwvRmllbGRzPgorICAgIDwvT2JqZWN0TW9kZWwuT21Hcm91cD4KKyAgICA8T2JqZWN0TW9kZWwuT21Hcm91cD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5rZXk8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5rZXk8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRzPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5ncm91cF9pZDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+R3JvdXAgSUQ8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+VGhlIElEIG9mIHRoZSBncm91cCBvYmplY3QgaW5zdGFuY2UgYmVpbmcgcmVmZXJlbmNlZDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+Z3JvdXBfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8T3B0aW9ucz5Jc0luc3RhbmNlTnVtYmVyPC9PcHRpb25zPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgPC9Hcm91cHM+CisgIDwvT2JqZWN0TW9kZWwuT21PYmplY3Q+CisgIDxPYmplY3RNb2RlbC5PbU9iamVjdD4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPmludGVyZmFjZTwvU2hvcnROYW1lPgorICAgIDxMb25nTmFtZT5CQUwgSW50ZXJmYWNlPC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+QkFMIGludGVyZmFjZSBvYmplY3Q8L0Rlc2NyaXB0aW9uPgorICAgPC9MYWJlbD4KKyAgIDxHcm91cHM+CisgICAgPE9iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+a2V5PC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+a2V5PC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkcz4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+aW50Zl9pZDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+aW50Zl9pZDwvTG9uZ05hbWU+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD40PC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDxPcHRpb25zPklzSW5zdGFuY2VOdW1iZXI8L09wdGlvbnM+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5pbnRmX3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPmludGZfdHlwZTwvTG9uZ05hbWU+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+aW50Zl90eXBlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICA8L0ZpZWxkcz4KKyAgICA8L09iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgPE9iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+Y2ZnPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+Y2ZnPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFR5cGU+Q29uZmlndXJhdGlvbjwvVHlwZT4KKyAgICAgPEZpZWxkcz4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+YWRtaW5fc3RhdGU8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkFkbWluaXN0cmF0aXZlIHN0YXRlPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkFkbWluaXN0cmF0aXZlIHN0YXRlPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5zdGF0ZTwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+b3Blcl9zdGF0dXM8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPk9wZXJhdGlvbmFsIHN0YXR1czwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5PcGVyYXRpb25hbCBzdGF0dXM8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnN0YXR1czwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDxPcHRpb25zPlJlYWRPbmx5PC9PcHRpb25zPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+bWluX2RhdGFfYWdnX3BvcnRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPk1pbmltdW0gYWdncmVnYXRlIHBvcnQgSUQ8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+VGhlIG1pbmltdW0gYWdnX3BvcnRfaWQgdGhhdCBpcyBhbGxvd2VkIGluIHRoZSBzeXN0ZW08L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPmFnZ3JlZ2F0aW9uX3BvcnRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPm1pbl9kYXRhX3N2Y19wb3J0X2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5NaW5pbXVtIHNlcnZpY2UgcG9ydCBJRDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgbWluaW11bSBzdmNfcG9ydF9pZCB0aGF0IGlzIGFsbG93ZWQgaW4gdGhlIHN5c3RlbTwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+c2VydmljZV9wb3J0X2lkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT50cmFuc2NlaXZlcl90eXBlPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5UcmFuc2NlaXZlciB0eXBlPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSB0cmFuc2NlaXZlciB0eXBlIHVzZWQgb24gYW4gaW50ZXJmYWNlPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT50cnhfdHlwZTwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+ZHNfbWlzc19tb2RlPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5Eb3duc3RyZWFtIHVua25vd24gcGFja2V0IGFjdGlvbjwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5EZWZpbmVzIHRoZSBhY3Rpb24gdG8gdGFrZSBmb3IgdW5rbm93biBkb3duc3RyZWFtIHBhY2tldHM8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPmRzX21pc3NfbW9kZTwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+bXR1PC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5NVFU8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+VGhlIE1UVSBmb3IgYW4gaW50ZXJmYWNlPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgPFdpZHRoPjI8L1dpZHRoPgorICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5mbG93X2NvbnRyb2w8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkZsb3cgY29udHJvbDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5GbG93IGNvbnRyb2wgZW5hYmxlIG9yIGRpc2FibGU8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPmNvbnRyb2w8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmRzX3RtPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5Eb3duc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkRvd25zdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXI8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnRtX3NjaGVkX2lkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT51c190bTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+VXBzdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXI8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+VXBzdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXI8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnRtX3NjaGVkX2lkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5zdWJfdGVybV9pZF9saXN0PC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5TdWItdGVybSBpZCBsaXN0PC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkEgbGlzdCBvZiBzdWJzY3JpYmVyIHRlcm1pbmFsIGlkcyBjb25maWd1cmVkIG9uIHRoaXMgaW50ZXJmYWNlPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTGlzdCI+CisgICAgICAgIDxFbGVtZW50VHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICAgPFNob3J0TmFtZT5zdWJfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPC9FbGVtZW50VHlwZT4KKyAgICAgICAgPEF1dG9Db3VudEZpZWxkVHlwZT4KKyAgICAgICAgIDxXaWR0aD4yPC9XaWR0aD4KKyAgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICAgPC9BdXRvQ291bnRGaWVsZFR5cGU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPE9wdGlvbnM+UmVhZE9ubHk8L09wdGlvbnM+CisgICAgICA8L0ZpZWxkPgorICAgICA8L0ZpZWxkcz4KKyAgICA8L09iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgPE9iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+c3RhdDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPnN0YXQ8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VHlwZT5TdGF0aXN0aWNzPC9UeXBlPgorICAgICA8RmllbGRzPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5yeF9wYWNrZXRzPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5SZWNpZXZlZCBwYWNrZXRzPC9Mb25nTmFtZT4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgPFdpZHRoPjg8L1dpZHRoPgorICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5yeF9ieXRlczwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+UmVjZWl2ZWQgYnl0ZXM8L0xvbmdOYW1lPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+ODwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnR4X3BhY2tldHM8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlRyYW5zbWl0dGVkIHBhY2tldHM8L0xvbmdOYW1lPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+ODwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnR4X2J5dGVzPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5UcmFuc21pdHRlZCBieXRlczwvTG9uZ05hbWU+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD44PC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmluZDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPkludGVyZmFjZSBJbmRpY2F0aW9uPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFR5cGU+SW5kaWNhdGlvbjwvVHlwZT4KKyAgICAgPEZpZWxkcz4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+YWRtaW5fc3RhdGU8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkFkbWluaXN0cmF0aXZlIHN0YXRlPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkN1cnJlbnQgYWRtaW5pc3RyYXRpdmUgc3RhdGU8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnN0YXRlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5vcGVyX3N0YXR1czwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+T3BlcmF0aW9uYWwgc3RhdHVzPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkN1cnJlbnQgb3BlcmF0aW9uYWwgc3RhdGU8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnN0YXR1czwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+bWluX2RhdGFfYWdnX3BvcnRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPk1pbmltdW0gYWdncmVnYXRlIHBvcnQgSUQ8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+VGhlIG1pbmltdW0gYWdnX3BvcnRfaWQgdGhhdCBpcyBhbGxvd2VkIGluIHRoZSBzeXN0ZW08L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+MjwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPm1pbl9kYXRhX3N2Y19wb3J0X2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5NaW5pbXVtIHNlcnZpY2UgcG9ydCBJRDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgbWluaW11bSBzdmNfcG9ydF9pZCB0aGF0IGlzIGFsbG93ZWQgaW4gdGhlIHN5c3RlbTwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD4yPC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+dHJhbnNjZWl2ZXJfdHlwZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+VHJhbnNjZWl2ZXIgdHlwZTwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgdHJhbnNjZWl2ZXIgdHlwZSB1c2VkIG9uIGFuIGludGVyZmFjZTwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+dHJ4X3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmRzX21pc3NfbW9kZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+RG93bnN0cmVhbSB1bmtub3duIHBhY2tldCBhY3Rpb248L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+RGVmaW5lcyB0aGUgYWN0aW9uIHRvIHRha2UgZm9yIERTIHVua25vd24gcGFja2V0czwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+ZHNfbWlzc19tb2RlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5tdHU8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPk1UVTwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgTVRVIGZvciBhbiBpbnRlcmZhY2U8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+MjwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmZsb3dfY29udHJvbDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+RmxvdyBjb250cm9sPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkZsb3cgY29udHJvbCBlbmFibGUgb3IgZGlzYWJsZTwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+Y29udHJvbDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+ZHNfdG08L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkRvd25zdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXI8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+RG93bnN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlcjwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnVzX3RtPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5VcHN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlcjwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5VcHN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlcjwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgIDwvRmllbGRzPgorICAgIDwvT2JqZWN0TW9kZWwuT21Hcm91cD4KKyAgIDwvR3JvdXBzPgorICA8L09iamVjdE1vZGVsLk9tT2JqZWN0PgorICA8T2JqZWN0TW9kZWwuT21PYmplY3Q+CisgICA8TGFiZWw+CisgICAgPFNob3J0TmFtZT5wYWNrZXQ8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+cGFja2V0PC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+UGFja2V0IHRoYXQgY2FuIGJlIHRyYW5zbWl0dGVkIG9yIHJlY2VpdmVkPC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8R3JvdXBzPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmNmZzwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmNmZzwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxUeXBlPkNvbmZpZ3VyYXRpb248L1R5cGU+CisgICAgIDxGaWVsZHM+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmZsb3dfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkZsb3cgSWQ8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+Ti9BIGZvciBzZW5kaW5nIGEgcGFja2V0PC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5mbG93X2lkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5mbG93X3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkZsb3cgVHlwZTwvTG9uZ05hbWU+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+Zmxvd190eXBlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5pbnRmX2lkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5JbnRlcmZhY2UgSUQ8L0xvbmdOYW1lPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPmludGZfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmludGZfdHlwZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+SW50ZXJmYWNlIFR5cGU8L0xvbmdOYW1lPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPmludGZfdHlwZTwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+c3ZjX3BvcnQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlNlcnZpY2UgUG9ydDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5OL0EgZm9yIHNlbmRpbmcgYSBwYWNrZXQ8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnNlcnZpY2VfcG9ydF9pZDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+Zmxvd19jb29raWU8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkZsb3cgQ29va2llPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPk4vQSBmb3Igc2VuZGluZyBhIHBhY2tldDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+Y29va2llPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5wa3Q8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlBhY2tldCBEYXRhPC9Mb25nTmFtZT4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTGlzdCI+CisgICAgICAgIDxFbGVtZW50VHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICAgPFdpZHRoPjE8L1dpZHRoPgorICAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgICA8L0VsZW1lbnRUeXBlPgorICAgICAgICA8QXV0b0NvdW50RmllbGRUeXBlPgorICAgICAgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgICA8L0F1dG9Db3VudEZpZWxkVHlwZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgIDwvRmllbGRzPgorICAgIDwvT2JqZWN0TW9kZWwuT21Hcm91cD4KKyAgICA8T2JqZWN0TW9kZWwuT21Hcm91cD4KKyAgICAgPExhYmVsPgorICAgICAgPFNob3J0TmFtZT5rZXk8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5rZXk8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8RmllbGRzPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5yZXNlcnZlZDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+UmVzZXJ2ZWQga2V5IGZpZWxkPC9Mb25nTmFtZT4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgPFdpZHRoPjQ8L1dpZHRoPgorICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPE9wdGlvbnM+SXNJbnN0YW5jZU51bWJlcjwvT3B0aW9ucz4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnBhY2tldF9zZW5kX2Rlc3Q8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlBhY2tldCBkZXN0aW5hdGlvbjwvTG9uZ05hbWU+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+ZGVzdDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmluZDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPlBhY2tldCBpbmRpY2F0aW9uPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFR5cGU+SW5kaWNhdGlvbjwvVHlwZT4KKyAgICAgPEZpZWxkcz4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+Zmxvd19pZDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+RmxvdyBJZDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5OL0EgZm9yIHNlbmRpbmcgYSBwYWNrZXQ8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPmZsb3dfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmZsb3dfdHlwZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+RmxvdyBUeXBlPC9Mb25nTmFtZT4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5mbG93X3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmludGZfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkludGVyZmFjZSBJRDwvTG9uZ05hbWU+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+aW50Zl9pZDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+aW50Zl90eXBlPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5JbnRlcmZhY2UgVHlwZTwvTG9uZ05hbWU+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+aW50Zl90eXBlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5zdmNfcG9ydDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+U2VydmljZSBQb3J0PC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPk4vQSBmb3Igc2VuZGluZyBhIHBhY2tldDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+c2VydmljZV9wb3J0X2lkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5mbG93X2Nvb2tpZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+RmxvdyBDb29raWU8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+Ti9BIGZvciBzZW5kaW5nIGEgcGFja2V0PC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5jb29raWU8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnBrdDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+UGFja2V0IERhdGE8L0xvbmdOYW1lPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVMaXN0Ij4KKyAgICAgICAgPEVsZW1lbnRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgICA8V2lkdGg+MTwvV2lkdGg+CisgICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgIDwvRWxlbWVudFR5cGU+CisgICAgICAgIDxBdXRvQ291bnRGaWVsZFR5cGU+CisgICAgICAgICA8V2lkdGg+NDwvV2lkdGg+CisgICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgIDwvQXV0b0NvdW50RmllbGRUeXBlPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgPC9Hcm91cHM+CisgIDwvT2JqZWN0TW9kZWwuT21PYmplY3Q+CisgIDxPYmplY3RNb2RlbC5PbU9iamVjdD4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPnN1YnNjcmliZXJfdGVybWluYWw8L1Nob3J0TmFtZT4KKyAgICA8TG9uZ05hbWU+QkFMIFN1YnNjcmliZXIgVGVybWluYWw8L0xvbmdOYW1lPgorICAgPC9MYWJlbD4KKyAgIDxHcm91cHM+CisgICAgPE9iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+a2V5PC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+a2V5PC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkcz4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+c3ViX3Rlcm1faWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPnN1Yl90ZXJtX2lkPC9Mb25nTmFtZT4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5zdWJfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8T3B0aW9ucz5Jc0luc3RhbmNlTnVtYmVyPC9PcHRpb25zPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+aW50Zl9pZDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+aW50Zl9pZDwvTG9uZ05hbWU+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+aW50Zl9pZDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmNmZzwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmNmZzwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxUeXBlPkNvbmZpZ3VyYXRpb248L1R5cGU+CisgICAgIDxGaWVsZHM+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmFkbWluX3N0YXRlPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5BZG1pbmlzdHJhdGl2ZSBzdGF0ZTwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbmlzdHJhdGl2ZSBzdGF0ZTwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+c3RhdGU8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPm9wZXJfc3RhdHVzPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5PcGVyYXRpb25hbCBzdGF0dXM8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+T3BlcmF0aW9uYWwgc3RhdHVzPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5zdGF0dXM8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8T3B0aW9ucz5SZWFkT25seTwvT3B0aW9ucz4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnNlcmlhbF9udW1iZXI8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlNlcmlhbCBudW1iZXI8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+VGhlIHNlcmlhbCBudW1iZXIgb2YgYW4gIElUVSBQT04gKEdQT04vWEctUE9OMS9YR1MtUE9OL05HLVBPTjIpIHN1YnNjcmliZXIgdGVybWluYWw8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnNlcmlhbF9udW1iZXI8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnBhc3N3b3JkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5QYXNzd29yZDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgcGFzc3dvcmQgb2YgYSBHUE9OIHN1YnNjcmliZXIgdGVybWluYWw8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnBhc3N3b3JkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5yZWdpc3RyYXRpb25faWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlJlZ2lzdHJhdGlvbiBpZDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5PTlUgcmVnaXN0cmF0aW9uIElEIG9mIGFuICBJVFUgUE9OIChYRy1QT04xL1hHUy1QT04vTkctUE9OMikgc3Vic2NyaWJlciB0ZXJtaW5hbDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+cmVnaXN0cmF0aW9uX2lkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5zdmNfcG9ydF9pZDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+U2VydmljZSBwb3J0IElEPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBtYW5hZ2VtZW50IHNlcnZpY2UgcG9ydCBJRCAoZm9yIFBPTiwgdGhlIE9OVSBJRCk8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnNlcnZpY2VfcG9ydF9pZDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDxPcHRpb25zPlJlYWRPbmx5PC9PcHRpb25zPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+bWFjX2FkZHJlc3M8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPk1BQyBhZGRyZXNzPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBFdGhlcm5ldCBNQUMgYWRkcmVzcyBvZiBhbiBFUE9OIHN1YnNjcmliZXIgdGVybWluYWw8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVXZWxsS25vd24iPgorICAgICAgICA8V2VsbEtub3duVHlwZT5NYWNBZGRyZXNzPC9XZWxsS25vd25UeXBlPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+ZHNfdG08L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkRvd25zdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXI8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+RG93bnN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlcjwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnVzX3RtPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5VcHN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlcjwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5VcHN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlcjwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnN2Y19wb3J0X2lkX2xpc3Q8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPnN2Y19wb3J0X2lkIGxpc3Q8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+QSBsaXN0IG9mIGJlYXJlciB0cmFmZmljIHN2Y19wb3J0X2lkcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzY3JpYmVyIHRlcm1pbmFsPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTGlzdCI+CisgICAgICAgIDxFbGVtZW50VHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICAgPFNob3J0TmFtZT5zZXJ2aWNlX3BvcnRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPC9FbGVtZW50VHlwZT4KKyAgICAgICAgPEF1dG9Db3VudEZpZWxkVHlwZT4KKyAgICAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICAgPC9BdXRvQ291bnRGaWVsZFR5cGU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPE9wdGlvbnM+UmVhZE9ubHk8L09wdGlvbnM+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5hZ2dfcG9ydF9pZF9saXN0PC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5hZ2dfcG9ydF9pZCBsaXN0PC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkEgbGlzdCBvZiBhZ2dyX3BvcnRfaWRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNjcmliZXIgdGVybWluYWw8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVMaXN0Ij4KKyAgICAgICAgPEVsZW1lbnRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgICA8U2hvcnROYW1lPmFnZ3JlZ2F0aW9uX3BvcnRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPC9FbGVtZW50VHlwZT4KKyAgICAgICAgPEF1dG9Db3VudEZpZWxkVHlwZT4KKyAgICAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICAgPC9BdXRvQ291bnRGaWVsZFR5cGU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPE9wdGlvbnM+UmVhZE9ubHk8L09wdGlvbnM+CisgICAgICA8L0ZpZWxkPgorICAgICA8L0ZpZWxkcz4KKyAgICA8L09iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgPE9iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+c3RhdDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPnN0YXQ8L0xvbmdOYW1lPgorICAgICA8L0xhYmVsPgorICAgICA8VHlwZT5TdGF0aXN0aWNzPC9UeXBlPgorICAgICA8RmllbGRzPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5yeF9wYWNrZXRzPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5SZWNlaXZlZCAgcGFja2V0czwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5SZWNlaXZlZCBwYWNrZXRzIG9uIHNwZWNpZmllZCBvYmplY3Q8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+ODwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnJ4X2J5dGVzPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5SZWNlaXZlZCBieXRlczwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5SZWNlaXZlZCBieXRlcyBvbiBzcGVjaWZpZWQgb2JqZWN0PC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgPFdpZHRoPjg8L1dpZHRoPgorICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT50eF9wYWNrZXRzPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5UcmFuc21pdHRlZCBwYWNrZXRzPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRyYW5zbWl0dGVkIHBhY2tldHMgb24gc3BlY2lmaWVkIG9iamVjdDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD44PC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+dHhfYnl0ZXM8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlRyYW5zbWl0dGVkIGJ5dGVzPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRyYW5zbWl0dHRlZCBieXRlcyBvbiBzcGVjaWZpZWQgb2JqZWN0PC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgPFdpZHRoPjg8L1dpZHRoPgorICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICA8L0ZpZWxkcz4KKyAgICA8L09iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgPE9iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+aW5kPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+U3Vic2NyaWJlciBUZXJtaW5hbCBJbmRpY2F0aW9uPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFR5cGU+SW5kaWNhdGlvbjwvVHlwZT4KKyAgICAgPEZpZWxkcz4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+YWRtaW5fc3RhdGU8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPkFkbWluaXN0cmF0aXZlIHN0YXRlPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkN1cnJlbnQgYWRtaW5pc3RyYXRpdmUgc3RhdGU8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnN0YXRlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5vcGVyX3N0YXR1czwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+T3BlcmF0aW9uYWwgc3RhdHVzPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPkN1cnJlbnQgb3BlcmF0aW9uYWwgc3RhdHVzPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT5zdGF0dXM8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnNlcmlhbF9udW1iZXI8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlNlcmlhbCBudW1iZXI8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+VGhlIHNlcmlhbCBudW1iZXIgb2YgYW4gIElUVSBQT04gKEdQT04vWEctUE9OMS9YR1MtUE9OL05HLVBPTjIpIHN1YnNjcmliZXIgdGVybWluYWw8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnNlcmlhbF9udW1iZXI8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnBhc3N3b3JkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5QYXNzd29yZDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5UaGUgcGFzc3dvcmQgb2YgYSBHUE9OIHN1YnNjcmliZXIgdGVybWluYWw8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnBhc3N3b3JkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5yZWdpc3RyYXRpb25faWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlJlZ2lzdHJhdGlvbiBpZDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5PTlUgcmVnaXN0cmF0aW9uIElEIG9mIGFuICBJVFUgUE9OIChYRy1QT04xL1hHUy1QT04vTkctUE9OMikgc3Vic2NyaWJlciB0ZXJtaW5hbDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+cmVnaXN0cmF0aW9uX2lkPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5zdmNfcG9ydF9pZDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+U2VydmljZSBwb3J0IElEPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRoZSBzZXJ2aWNlIHBvcnQgSUQgKGZvciBQT04sIHRoZSBPTlUgSUQpPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgPFdpZHRoPjI8L1dpZHRoPgorICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5tYWNfYWRkcmVzczwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+TUFDIGFkZHJlc3M8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+VGhlIEV0aGVybmV0IE1BQyBhZGRyZXNzIG9mIGFuIGVwb24gc3Vic2NyaWJlciB0ZXJtaW5hbDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVdlbGxLbm93biI+CisgICAgICAgIDxXZWxsS25vd25UeXBlPk1hY0FkZHJlc3M8L1dlbGxLbm93blR5cGU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5kc190bTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+RG93bnN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlcjwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5Eb3duc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT50bV9zY2hlZF9pZDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+dXNfdG08L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPlVwc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlVwc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT50bV9zY2hlZF9pZDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgPC9Hcm91cHM+CisgIDwvT2JqZWN0TW9kZWwuT21PYmplY3Q+CisgIDxPYmplY3RNb2RlbC5PbU9iamVjdD4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPnRtX3F1ZXVlPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPnRtX3F1ZXVlPC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+VHJhbnNtaXQgcXVldWU8L0Rlc2NyaXB0aW9uPgorICAgPC9MYWJlbD4KKyAgIDxHcm91cHM+CisgICAgPE9iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+a2V5PC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+a2V5PC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPEZpZWxkcz4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+c2NoZWRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPnNjaGVkX2lkPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlNjaGVkdWxlciB0aGF0IG93bnMgdGhlIHF1ZXVlPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT50bV9zY2hlZF9pZDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+c2NoZWRfZGlyPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5zY2hlZCBkaXI8L0xvbmdOYW1lPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnRtX3NjaGVkX2RpcjwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+aWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPmlkPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlF1ZXVlIGlkPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT50bV9xdWV1ZV9pZDwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDxPcHRpb25zPklzSW5zdGFuY2VOdW1iZXI8L09wdGlvbnM+CisgICAgICA8L0ZpZWxkPgorICAgICA8L0ZpZWxkcz4KKyAgICA8L09iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgPE9iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+Y2ZnPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+Y2ZnPC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFR5cGU+Q29uZmlndXJhdGlvbjwvVHlwZT4KKyAgICAgPEZpZWxkcz4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+cHJpb3JpdHk8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPnByaW9yaXR5PC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlNjaGVkdWxpbmcgcHJpb3JpdHk8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnRtX3ByaW9yaXR5PC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT53ZWlnaHQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPndlaWdodDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5TY2hlZHVsaW5nIHdlaWdodDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+dG1fd2VpZ2h0PC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5yYXRlPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5yYXRlPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlJhdGUgc2hhcGluZyBwYXJhbWV0ZXJzPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT50bV9zaGFwaW5nPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5iYWM8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPmJhYzwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5CdWZmZXIgYWRtaXNzaW9uIGNvbnRyb2w8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnRtX2JhYzwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+Y3JlYXRpb25fbW9kZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+Y3JlYXRpb25fbW9kZTwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5DcmVhdGlvbiBtb2RlPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT50bV9jcmVhdGlvbl9tb2RlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPE9wdGlvbnM+UmVhZE9ubHk8L09wdGlvbnM+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5yZWZfY291bnQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPnJlZl9jb3VudDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5yZWZlcmVuY2UgY291bnQgKGZsb3dzKTwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgIDxPcHRpb25zPlJlYWRPbmx5PC9PcHRpb25zPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPnN0YXQ8L1Nob3J0TmFtZT4KKyAgICAgIDxMb25nTmFtZT5zdGF0PC9Mb25nTmFtZT4KKyAgICAgPC9MYWJlbD4KKyAgICAgPFR5cGU+U3RhdGlzdGljczwvVHlwZT4KKyAgICAgPEZpZWxkcz4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+cGFja2V0c19vazwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+cGFja2V0c19vazwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5QYWNrZXRzIHRyYW5zbWl0dGVkIHN1Y2Nld3NzZnVsbHk8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+ODwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmJ5dGVzX29rPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5ieXRlc19vazwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5CeXRlcyB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHk8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+ODwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnBhY2tldHNfZGlzY2FyZGVkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5wYWNrZXRzX2Rpc2NhcmRlZDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5QYWNrZXRzIGRpc2NhcmRlZDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD44PC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+Ynl0ZXNfZGlzY2FyZGVkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5ieXRlc19kaXNjYXJkZWQ8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+Qnl0ZXMgZGlzY2FyZGVkPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlTnVtYmVyIj4KKyAgICAgICAgPFdpZHRoPjg8L1dpZHRoPgorICAgICAgICA8U2lnbmVkPkZhbHNlPC9TaWduZWQ+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICA8L0ZpZWxkcz4KKyAgICA8L09iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgPE9iamVjdE1vZGVsLk9tR3JvdXA+CisgICAgIDxMYWJlbD4KKyAgICAgIDxTaG9ydE5hbWU+aW5kPC9TaG9ydE5hbWU+CisgICAgICA8TG9uZ05hbWU+VG0gUXVldWUgSW5kaWNhdGlvbjwvTG9uZ05hbWU+CisgICAgICA8RGVzY3JpcHRpb24+VG0gUXVldWUgSW5kaWNhdGlvbjwvRGVzY3JpcHRpb24+CisgICAgIDwvTGFiZWw+CisgICAgIDxUeXBlPkluZGljYXRpb248L1R5cGU+CisgICAgIDxGaWVsZHM+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnJldDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+cmV0PC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPnJldDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD40PC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgPC9Hcm91cHM+CisgIDwvT2JqZWN0TW9kZWwuT21PYmplY3Q+CisgIDxPYmplY3RNb2RlbC5PbU9iamVjdD4KKyAgIDxMYWJlbD4KKyAgICA8U2hvcnROYW1lPnRtX3NjaGVkPC9TaG9ydE5hbWU+CisgICAgPExvbmdOYW1lPnRtX3NjaGVkPC9Mb25nTmFtZT4KKyAgICA8RGVzY3JpcHRpb24+U2NoZWR1bGluZyBub2RlPC9EZXNjcmlwdGlvbj4KKyAgIDwvTGFiZWw+CisgICA8R3JvdXBzPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmtleTwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmtleTwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxGaWVsZHM+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmRpcjwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+ZGlyPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlRyYWZmaWMgZGlyZWN0aW9uPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT50bV9zY2hlZF9kaXI8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPmlkPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5pZDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5JRDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgICA8T3B0aW9ucz5Jc0luc3RhbmNlTnVtYmVyPC9PcHRpb25zPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmNmZzwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPmNmZzwvTG9uZ05hbWU+CisgICAgIDwvTGFiZWw+CisgICAgIDxUeXBlPkNvbmZpZ3VyYXRpb248L1R5cGU+CisgICAgIDxGaWVsZHM+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPm93bmVyPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5vd25lcjwvTG9uZ05hbWU+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfb3duZXI8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnNjaGVkX3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPnR5cGU8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+U2NoZWR1bGVyIHR5cGU8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnRtX3NjaGVkX3R5cGU8L1Nob3J0TmFtZT4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgICA8RmllbGQ+CisgICAgICAgPExhYmVsPgorICAgICAgICA8U2hvcnROYW1lPnNjaGVkX3BhcmVudDwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+cGFyZW50PC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlNjaGVkdWxpbmcgcGFyYW1ldGVycyBmb3IgcGFyZW50IHNjaGVkdWxlcjwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfcGFyZW50PC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5zY2hlZF9jaGlsZF90eXBlPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5jaGlsZF90eXBlPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlNjaGVkdWxpbmcgbGV2ZWwgZm9yIGNoaWxkcmVuIHRtIDwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfY2hpbGRfdHlwZTwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+cmF0ZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+cmF0ZTwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5SYXRlIHNoYXBpbmcgcGFyYW1ldGVyczwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZVJlZmVyZW5jZSI+CisgICAgICAgIDxTaG9ydE5hbWU+dG1fc2hhcGluZzwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+dGNvbnRfc2xhPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT50Y29udF9zbGE8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+QWRkaXRpb25hbCBTTEEgcGFyYW1ldGVycyBmb3IgYWdnX3BvcnQgb3duZXI8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVSZWZlcmVuY2UiPgorICAgICAgICA8U2hvcnROYW1lPnRtX3Rjb250X3NsYTwvU2hvcnROYW1lPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgIDxGaWVsZD4KKyAgICAgICA8TGFiZWw+CisgICAgICAgIDxTaG9ydE5hbWU+Y3JlYXRpb25fbW9kZTwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+Y3JlYXRpb25fbW9kZTwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5DcmVhdGlvbiBtb2RlPC9EZXNjcmlwdGlvbj4KKyAgICAgICA8L0xhYmVsPgorICAgICAgIDxGaWVsZFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgPFNob3J0TmFtZT50bV9jcmVhdGlvbl9tb2RlPC9TaG9ydE5hbWU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPE9wdGlvbnM+UmVhZE9ubHk8L09wdGlvbnM+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5xdWV1ZXM8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPnF1ZXVlczwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5TdWJzaWRpYXJ5IHF1ZXVlczwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZUxpc3QiPgorICAgICAgICA8RWxlbWVudFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgIDxTaG9ydE5hbWU+dG1fcXVldWVfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPC9FbGVtZW50VHlwZT4KKyAgICAgICAgPEF1dG9Db3VudEZpZWxkVHlwZT4KKyAgICAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICAgPC9BdXRvQ291bnRGaWVsZFR5cGU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPE9wdGlvbnM+UmVhZE9ubHk8L09wdGlvbnM+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5zdWJfc2NoZWRzPC9TaG9ydE5hbWU+CisgICAgICAgIDxMb25nTmFtZT5zdWJfc2NoZWRzPC9Mb25nTmFtZT4KKyAgICAgICAgPERlc2NyaXB0aW9uPlN1YnNpZGlhcnkgc2NoZWR1bGVyczwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZUxpc3QiPgorICAgICAgICA8RWxlbWVudFR5cGUgVHlwZT0iRmllbGRUeXBlUmVmZXJlbmNlIj4KKyAgICAgICAgIDxTaG9ydE5hbWU+dG1fc2NoZWRfaWQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPC9FbGVtZW50VHlwZT4KKyAgICAgICAgPEF1dG9Db3VudEZpZWxkVHlwZT4KKyAgICAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICAgPC9BdXRvQ291bnRGaWVsZFR5cGU+CisgICAgICAgPC9GaWVsZFR5cGU+CisgICAgICAgPE9wdGlvbnM+UmVhZE9ubHk8L09wdGlvbnM+CisgICAgICA8L0ZpZWxkPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5udW1fcHJpb3JpdGllczwvU2hvcnROYW1lPgorICAgICAgICA8TG9uZ05hbWU+bnVtX3ByaW9yaXRpZXM8L0xvbmdOYW1lPgorICAgICAgICA8RGVzY3JpcHRpb24+TWF4IG51bWJlciBvZiBzdHJpY3QgcHJpb3JpdHkgc2NoZWR1bGluZyBlbGVtZW50czwvRGVzY3JpcHRpb24+CisgICAgICAgPC9MYWJlbD4KKyAgICAgICA8RmllbGRUeXBlIFR5cGU9IkZpZWxkVHlwZU51bWJlciI+CisgICAgICAgIDxXaWR0aD4xPC9XaWR0aD4KKyAgICAgICAgPFNpZ25lZD5GYWxzZTwvU2lnbmVkPgorICAgICAgIDwvRmllbGRUeXBlPgorICAgICAgPC9GaWVsZD4KKyAgICAgPC9GaWVsZHM+CisgICAgPC9PYmplY3RNb2RlbC5PbUdyb3VwPgorICAgIDxPYmplY3RNb2RlbC5PbUdyb3VwPgorICAgICA8TGFiZWw+CisgICAgICA8U2hvcnROYW1lPmluZDwvU2hvcnROYW1lPgorICAgICAgPExvbmdOYW1lPlRtIFNjaGVkIEluZGljYXRpb248L0xvbmdOYW1lPgorICAgICAgPERlc2NyaXB0aW9uPlRtIFNjaGVkIEluZGljYXRpb248L0Rlc2NyaXB0aW9uPgorICAgICA8L0xhYmVsPgorICAgICA8VHlwZT5JbmRpY2F0aW9uPC9UeXBlPgorICAgICA8RmllbGRzPgorICAgICAgPEZpZWxkPgorICAgICAgIDxMYWJlbD4KKyAgICAgICAgPFNob3J0TmFtZT5yZXQ8L1Nob3J0TmFtZT4KKyAgICAgICAgPExvbmdOYW1lPnJldDwvTG9uZ05hbWU+CisgICAgICAgIDxEZXNjcmlwdGlvbj5yZXQ8L0Rlc2NyaXB0aW9uPgorICAgICAgIDwvTGFiZWw+CisgICAgICAgPEZpZWxkVHlwZSBUeXBlPSJGaWVsZFR5cGVOdW1iZXIiPgorICAgICAgICA8V2lkdGg+NDwvV2lkdGg+CisgICAgICAgIDxTaWduZWQ+RmFsc2U8L1NpZ25lZD4KKyAgICAgICA8L0ZpZWxkVHlwZT4KKyAgICAgIDwvRmllbGQ+CisgICAgIDwvRmllbGRzPgorICAgIDwvT2JqZWN0TW9kZWwuT21Hcm91cD4KKyAgIDwvR3JvdXBzPgorICA8L09iamVjdE1vZGVsLk9tT2JqZWN0PgorIDwvT21PYmplY3RzPgorPC9FbGVtZW50U2V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvY29tbW9uL3BsYWNlaG9sZGVyIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9jb21tb24vcGxhY2Vob2xkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvY29tbW9uL3BsYWNlaG9sZGVyCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaS9NYWtlZmlsZSBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliYmFsYXBpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZmVhODQKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaS9NYWtlZmlsZQpAQCAtMCwwICsxLDM4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyMgIAorIyAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisjICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisjICAKKyMgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyMgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyMgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorIyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisjICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorIyAgCisjICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisjICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyMgICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyMgICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyMgICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorIyAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworIyAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyMgICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyMgIAorIyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisjICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyMgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisjICB3cml0dGVuIGNvbnNlbnQuCisjICAKKyMgIDo+CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitNT0RfTkFNRSA9IGJhbF9hcGkKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGNvbW1vbl9pbmNsdWRlIGRldl9sb2cgbWFwbGVfc2RrIGJhbG9iam1zZyAKK2lmZXEgKCIkKEJBTF9NT05PTElUSElDKSIsICJ5IikKK01PRF9ERVBTICs9IGJhbF9jb3JlCitlbmRpZgorCitzcmNzID0gYmFsX2FwaS5jIGJhbF9hcGlfd29ya2VyLmMKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliYmFsYXBpL2JhbF9hcGkuYyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliYmFsYXBpL2JhbF9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzc0ZmQyCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGkvYmFsX2FwaS5jCkBAIC0wLDAgKzEsNjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfYXBpLmMKKyAqIEBicmllZiBUaGUgQkFMIFB1YmxpYyBBUEkKKyAqCisgKiBAYWRkdG9ncm91cCBhcGkKKyAqLworCisvKkB7Ki8KKworLyogUHJvamVjdCBpbmNsdWRlcyAqLworI2luY2x1ZGUgImJhbF9hcGkuaCIKKyNpbmNsdWRlICJiYWxfbXNnLmgiCisjaW5jbHVkZSAiYmFsX2FwaV93b3JrZXIuaCIKKyNpbmNsdWRlICJiYWxfb2JqX21zZ19wYWNrX3VucGFjay5oIgorI2lmZGVmIEJBTF9NT05PTElUSElDCisjaW5jbHVkZSA8YmFsX3dvcmtlci5oPgorI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfTE9HCisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKworLyoKKyAqIEBicmllZiBUaGUgbG9nZ2luZyBkZXZpY2UgaWQgZm9yIHRoZSBCQUwgcHVibGljIEFQSQorICovCitkZXZfbG9nX2lkIGxvZ19pZF9wdWJsaWNfYXBpOworI2VuZGlmCisKKy8qCisgKiBAYnJpZWYgVGhlIGdsb2JhbCBtZ210IHF1ZXVlcyAKKyAqIAorICogVGhlc2UgYXJlIHRoZSBxdWV1ZXMgdGhyb3VnaCB3aGljaCB0aGUgQkFMIEFQSSBjb21tdW5pY2F0ZXMgd2l0aAorICogdGhlIGNvcmUsIGFuZCB2aWNlIHZlcnNhLgorICovCitzdGF0aWMgYmNtb3NfbXNnX3F1ZXVlIGJhbGFwaV9yc3BfcXVldWU7CitzdGF0aWMgYmNtb3NfbXNnX3F1ZXVlIGJhbGFwaV90b19jb3JlX3F1ZXVlOworCitiY21vc19tc2dfcXVldWUgKnBfYmFsYXBpX3JzcF9xdWV1ZTsKK2JjbW9zX21zZ19xdWV1ZSAqcF9iYWxhcGlfdG9fY29yZV9xdWV1ZTsKKworc3RhdGljIGJjbW9zX211dGV4IGJhbGFwaV9sb2NrOworc3RhdGljIHVpbnQzMl90IGJhbGFwaV9leGNoYW5nZV9pZDsKK3N0YXRpYyBTVEFJTFFfSEVBRChwZW5kaW5nX3JlcV9saXN0LCBiY21vc19tc2cpIHBlbmRpbmdfcmVxX2xpc3Q7CisKK3N0YXRpYyBiY21vc190YXNrIGFwaV9yc3BfcnhfdGhyZWFkOworc3RhdGljIGludCBfYmFsX2lwY19hcGlfcnhfaGFuZGxlcihsb25nIGRhdGEpOworCisvKiBSeCBwb2xsaW5nIHRpbWVvdXQgKHVzKSAqLworI2RlZmluZSBCQUxfQVBJX1JYX1BPTExfVElNRU9VVCAgICAgICAgIDEwMDAwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRpYWxpemUgdGhlIEJBTCBQdWJsaWMgQVBJIGludGVybmFsIGRhdGEgc3RydWN0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtYmFsX2FwaV9pbml0KGNvbnN0IGNoYXIgKmJhbGFwaV9tZ210X2lwX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29yZV9tZ210X2lwX3BvcnQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKyAgICBiY21vc19tc2dfcXVldWVfcGFybSBtc2dfcV9wID0ge307CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2tfcCA9IHt9OworCisjaWZkZWYgRU5BQkxFX0xPRworICAgIGxvZ19pZF9wdWJsaWNfYXBpID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoIkJBTF9BUEkiLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICBCVUdfT04obG9nX2lkX3B1YmxpY19hcGkgPT0gREVWX0xPR19JTlZBTElEX0lEKTsKKyNlbmRpZgorCisgICAgZG8KKyAgICB7CisgICAgICAgIFNUQUlMUV9JTklUKCZwZW5kaW5nX3JlcV9saXN0KTsKKworICAgICAgICByZXQgPSBiY21vc19tdXRleF9jcmVhdGUoJmJhbGFwaV9sb2NrLCAwLCAiYmFsX2FwaSIpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9wdWJsaWNfYXBpLCAiQ291bGRuJ3QgY3JlYXRlIEJBTCBBUEkgcHJvdGVjdGlvbiBtdXRleFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENyZWF0ZSBCQUwgQVBJIFJYIG1hbmFnZW1lbnQgcXVldWUgLSB0aGUgQkFMIFB1YmxpYyBBUEkKKyAgICAgICAgICogZXhjaGFuZ2VzIG1hbmFnZW1lbnQgbWVzc2FnZXMgd2l0aCB0aGUgQkFMIGNvcmUgdXNpbmcgdGhpcyBxdWV1ZS4KKyAgICAgICAgICovCisgICAgICAgIG1zZ19xX3AubmFtZSA9ICJiYWxhcGlfbWdtdF9xIjsKKyAgICAgICAgaWYgKE5VTEwgIT0gYmFsYXBpX21nbXRfaXBfcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgbXNnX3FfcC5sb2NhbF9lcF9hZGRyZXNzID0gYmFsYXBpX21nbXRfaXBfcG9ydDsKKyAgICAgICAgICAgIG1zZ19xX3AucmVtb3RlX2VwX2FkZHJlc3MgPSBOVUxMOworICAgICAgICAgICAgbXNnX3FfcC5lcF90eXBlID0gQkNNT1NfTVNHX1FVRVVFX0VQX1VEUF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtc2dfcV9wLmVwX3R5cGUgPSBCQ01PU19NU0dfUVVFVUVfRVBfTE9DQUw7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gYmNtb3NfbXNnX3F1ZXVlX2NyZWF0ZSgmYmFsYXBpX3JzcF9xdWV1ZSwgJm1zZ19xX3ApOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9wdWJsaWNfYXBpLCAiQ291bGRuJ3QgY3JlYXRlIEJBTCBBUEkgbWdtdCBxdWV1ZVxuIik7CisgICAgICAgICAgICByZXQgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcF9iYWxhcGlfcnNwX3F1ZXVlID0gJmJhbGFwaV9yc3BfcXVldWU7CisjaWZkZWYgQkFMX01PTk9MSVRISUMKKyAgICAgICAgaWYgKE5VTEwgPT0gYmFsYXBpX21nbXRfaXBfcG9ydCkKKyAgICAgICAgICAgIHBfYmFsX2NvcmVfdG9fYXBpX3F1ZXVlID0gcF9iYWxhcGlfcnNwX3F1ZXVlOworI2VuZGlmCisKKyAgICAgICAgLyogQ3JlYXRlIHF1ZXVlIGZvciBzZW5kaW5nIEFQSSByZXF1ZXN0cyB0byB0aGUgY29yZS4gT25seSBkbyBpdCBpZiBBUEkgYW5kIGNvcmUgaW50ZXJhY3QgdmlhIFVEUAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKE5VTEwgIT0gY29yZV9tZ210X2lwX3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZ19xX3AubmFtZSA9ICJiYWxhcGlfdG9fY29yZV9xIjsKKyAgICAgICAgICAgIG1zZ19xX3AubG9jYWxfZXBfYWRkcmVzcyA9IE5VTEw7CisgICAgICAgICAgICBtc2dfcV9wLnJlbW90ZV9lcF9hZGRyZXNzID0gY29yZV9tZ210X2lwX3BvcnQ7CisgICAgICAgICAgICBtc2dfcV9wLmVwX3R5cGUgPSBCQ01PU19NU0dfUVVFVUVfRVBfVURQX1NPQ0tFVDsKKworICAgICAgICAgICAgcmV0ID0gYmNtb3NfbXNnX3F1ZXVlX2NyZWF0ZSgmYmFsYXBpX3RvX2NvcmVfcXVldWUsICZtc2dfcV9wKTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfcHVibGljX2FwaSwgIkNvdWxkbid0IGNyZWF0ZSBCQUwgQVBJIG1nbXQgcXVldWVcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2JhbGFwaV90b19jb3JlX3F1ZXVlID0gJmJhbGFwaV90b19jb3JlX3F1ZXVlOworICAgICAgICB9CisKKyAgICAgICAgLyogQ3JlYXRlIEJBTCBBUEkgUlggdGhyZWFkICovCisgICAgICAgIHRhc2tfcC5uYW1lID0gImlwY19hcGlfcnNwX3J4X3RocmVhZCI7CisgICAgICAgIHRhc2tfcC5wcmlvcml0eSA9IFRBU0tfUFJJT1JJVFlfSVBDX1JYOworICAgICAgICB0YXNrX3AuaGFuZGxlciA9IF9iYWxfaXBjX2FwaV9yeF9oYW5kbGVyOworICAgICAgICB0YXNrX3AuZGF0YSA9IChsb25nKXBfYmFsYXBpX3JzcF9xdWV1ZTsKKworICAgICAgICByZXQgPSBiY21vc190YXNrX2NyZWF0ZSgmYXBpX3JzcF9yeF90aHJlYWQsICZ0YXNrX3ApOworICAgICAgICBpZiAocmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfcHVibGljX2FwaSwgIkNvdWxkbid0IGNyZWF0ZSBCQUwgQVBJIHJlc3BvbnNlIFJYIHRocmVhZFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYWxpemUgdGhlIEJBTCBQdWJsaWMgQVBJIGJhY2tlbmQgd29ya2VyIGFuZCByeCB0aHJlYWRzLiAgVGhlc2UKKyAgICAgICAgICogdGhyZWFkcyBhcmUgdXNlZCB0byByZWNlaXZlIGFzeW5jaHJvbm91cyBpbmRpY2F0aW9ucyBmcm9tIHRoZSBjb3JlLgorICAgICAgICAgKi8KKyAgICAgICAgZW5hYmxlX2JhbF9hcGlfaW5kaWNhdGlvbnMoYmFsYXBpX21nbXRfaXBfcG9ydCk7CisKKyAgICB9CisgICAgd2hpbGUoMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVuLWluaXRpYWxpemUgdGhlIEJBTCBQdWJsaWMgQVBJIGludGVybmFsIGRhdGEgc3RydWN0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtYmFsX2FwaV9maW5pc2godm9pZCkKK3sKKyAgICBiY21vc190YXNrX2Rlc3Ryb3koJmFwaV9yc3BfcnhfdGhyZWFkKTsKKyAgICBiY21vc19tc2dfcXVldWVfZGVzdHJveSgmYmFsYXBpX3JzcF9xdWV1ZSk7CisgICAgaWYgKHBfYmFsYXBpX3RvX2NvcmVfcXVldWUgPT0gJmJhbGFwaV90b19jb3JlX3F1ZXVlKQorICAgICAgICBiY21vc19tc2dfcXVldWVfZGVzdHJveSgmYmFsYXBpX3RvX2NvcmVfcXVldWUpOworCisgICAgYmFsX2FwaV9pbmRpY2F0aW9uc19maW5pc2goKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBGaW5kIHBlbmRpbmcgcmVxdWVzdCBtYXRjaGluZyByZXNwb25zZSAqLworc3RhdGljIGJhbF9jb21tX21zZ19oZHIgKl9iYWxfYXBpX2dldF9yZXF1ZXN0X2J5X2V4X2lkKHVpbnQzMl90IGV4X2lkKQoreworICAgIGJjbW9zX21zZyAqcmVxX21zZywgKnRtcF9tc2c7CisgICAgYmFsX2NvbW1fbXNnX2hkciAqY29tbV9oZHIgPSBOVUxMOworCisgICAgU1RBSUxRX0ZPUkVBQ0hfU0FGRShyZXFfbXNnLCAmcGVuZGluZ19yZXFfbGlzdCwgbmV4dCwgdG1wX21zZykKKyAgICB7CisgICAgICAgIGNvbW1faGRyID0gYmNtYmFsX2JhbF9oZHJfZ2V0X2J5X2JjbW9zX2hkcihyZXFfbXNnKTsKKyAgICAgICAgaWYgKGNvbW1faGRyLT5leF9pZCA9PSBleF9pZCkKKyAgICAgICAgeworICAgICAgICAgICAgU1RBSUxRX1JFTU9WRSgmcGVuZGluZ19yZXFfbGlzdCwgcmVxX21zZywgYmNtb3NfbXNnLCBuZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXFfbXNnID8gY29tbV9oZHIgOiBOVUxMOworfQorCisvKiBDaGVjayBpZiBhbnkgcGVuZGluZyByZXF1ZXN0IHRpbWVkIG91dCAqLworc3RhdGljIHZvaWQgX2JhbF9hcGlfY2hlY2tfcmVxX3RpbWVvdXQodm9pZCkKK3sKKyAgICBiY21vc19tc2cgKnJlcV9tc2csICp0bXBfbXNnOworICAgIGJhbF9jb21tX21zZ19oZHIgKmNvbW1faGRyOworICAgIGJjbWJhbF9vYmogKnJlcV9vYmo7CisgICAgdWludDMyX3QgdHMgPSBiY21vc190aW1lc3RhbXAoKTsKKworICAgIFNUQUlMUV9GT1JFQUNIX1NBRkUocmVxX21zZywgJnBlbmRpbmdfcmVxX2xpc3QsIG5leHQsIHRtcF9tc2cpCisgICAgeworICAgICAgICBjb21tX2hkciA9IGJjbWJhbF9iYWxfaGRyX2dldF9ieV9iY21vc19oZHIocmVxX21zZyk7CisgICAgICAgIGlmICh0cyAtIGNvbW1faGRyLT50aW1lc3RhbXAgPj0gQkNNQkFMX01TR19USU1FT1VUXzFfU0VDKQorICAgICAgICB7CisgICAgICAgICAgICBTVEFJTFFfUkVNT1ZFKCZwZW5kaW5nX3JlcV9saXN0LCByZXFfbXNnLCBiY21vc19tc2csIG5leHQpOworICAgICAgICAgICAgcmVxX29iaiA9IChiY21iYWxfb2JqICopYmNtYmFsX3BheWxvYWRfcHRyX2dldChjb21tX2hkcik7CisgICAgICAgICAgICAvKiBSZWxlYXNlIHBlbmRpbmcgQVBJIGNhbGwgKi8KKyAgICAgICAgICAgIHJlcV9vYmotPnN0YXR1cyA9IEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9wdWJsaWNfYXBpLCAiVGltaW5nIG91dCByZXF1ZXN0ICVwXG4iLCBjb21tX2hkcik7CisgICAgICAgICAgICBiY21vc19zZW1fcG9zdCgmY29tbV9oZHItPnNlbSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIEFQSSByZXNwb25zZSBoYW5kbGVyICovCitzdGF0aWMgaW50IF9iYWxfaXBjX2FwaV9yeF9oYW5kbGVyKGxvbmcgZGF0YSkKK3sKKyAgICBzdGF0aWMgdWludDMyX3QgbGFzdF90aW1lb3V0X2NoZWNrX3RzOworICAgIGJjbW9zX21zZ19xdWV1ZSAqcnhxID0gKGJjbW9zX21zZ19xdWV1ZSAqKWRhdGE7CisgICAgYmNtb3NfdGFzayAqbXlfdGFzayA9IGJjbW9zX3Rhc2tfY3VycmVudCgpOworICAgIGJjbW9zX21zZyAqbXNnOworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgZXhfaWQ7CisgICAgYmFsX2NvbW1fbXNnX2hkciAqcmVxOworICAgIGJjbWJhbF9vYmogKnJlcV9vYmo7CisKKyAgICBsYXN0X3RpbWVvdXRfY2hlY2tfdHMgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICB3aGlsZSAoIW15X3Rhc2stPmRlc3Ryb3lfcmVxdWVzdCkKKyAgICB7CisgICAgICAgIC8qIFdhaXQgZm9yIHJlc3BvbnNlICovCisgICAgICAgIG1zZyA9IE5VTEw7CisgICAgICAgIHJlcSA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gYmNtb3NfbXNnX3JlY3YocnhxLCBCQUxfQVBJX1JYX1BPTExfVElNRU9VVCwgJm1zZyk7CisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0ICYmIEJDTV9FUlJfVElNRU9VVCAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9wdWJsaWNfYXBpLAorICAgICAgICAgICAgICAgICJlcnJvciBkdXJpbmcgYmNtb3NfbXNnX3JlY3YgKGVycm9yOiVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBQZWVrIGV4Y2hhbmdlIGlkICovCisgICAgICAgIGlmIChtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCA9IGJjbWJhbF9iYWxfbXNnX3BlZWtfZXhfaWQobXNnLCAmZXhfaWQpOworICAgICAgICAgICAgaWYoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3B1YmxpY19hcGksCisgICAgICAgICAgICAgICAgICAgICJiYWQgbWVzc2FnZS4gQ2FuJ3QgZmluZCBleGNoYW5nZSBpZCAoZXJyb3I6JXMpXG4iLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgICAgICAgICAgICAgIG1zZyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3B1YmxpY19hcGksICJSZWNlaXZlZCBtZXNzYWdlIHdpdGggZXhfaWQ9JXVcbiIsIGV4X2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vdyBmaW5kIHBlbmRpbmcgcmVxdWVzdCBhbmQgYWxzbyBjaGVjayBpZiBhbnkgcGVuZGluZyByZXF1ZXN0KHMpIHRpbWVkIG91dCAqLworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZiYWxhcGlfbG9jayk7CisgICAgICAgIGlmIChtc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcSA9IF9iYWxfYXBpX2dldF9yZXF1ZXN0X2J5X2V4X2lkKGV4X2lkKTsKKyAgICAgICAgICAgIGlmIChOVUxMID09IHJlcSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfcHVibGljX2FwaSwKKyAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3Qgd2l0aCBleF9pZD0ldSBpcyBub3QgZm91bmQuIFByb2JhYmx5IGV4cGlyZWQuIFJlc3BvbnNlIGRpc2NhcmRlZFxuIiwgZXhfaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9wdWJsaWNfYXBpLCAiRm91bmQgcmVxdWVzdCAlcFxuIiwgcmVxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYmNtb3NfdGltZXN0YW1wKCkgLSBsYXN0X3RpbWVvdXRfY2hlY2tfdHMgPj0gQkNNQkFMX01TR19USU1FT1VUXzFfU0VDKQorICAgICAgICB7CisgICAgICAgICAgICBfYmFsX2FwaV9jaGVja19yZXFfdGltZW91dCgpOworICAgICAgICAgICAgbGFzdF90aW1lb3V0X2NoZWNrX3RzID0gYmNtb3NfdGltZXN0YW1wKCk7CisgICAgICAgIH0KKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiYWxhcGlfbG9jayk7CisKKyAgICAgICAgLyogR290IGEgbWVzc2FnZS4gTm93IHVucGFjayBpdCAqLworICAgICAgICBpZiAocmVxKQorICAgICAgICB7CisgICAgICAgICAgICByZXFfb2JqID0gKGJjbWJhbF9vYmogKiliY21iYWxfcGF5bG9hZF9wdHJfZ2V0KHJlcSk7CisgICAgICAgICAgICByZXQgPSBiY21iYWxfb2JqX21zZ191bnBhY2sobXNnLCAmcmVxKTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfcHVibGljX2FwaSwgIkVycm9yIGR1cmluZyBtZXNzYWdlIHVucGFjazogJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgICAgIHJlcV9vYmotPnN0YXR1cyA9IHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFJlbGVhc2UgcGVuZGluZyBBUEkgKi8KKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9wdWJsaWNfYXBpLCAiUG9zdGluZyByZXF1ZXN0IHNlbWFwaG9yZSBmb3IgJXBcbiIsIHJlcSk7CisgICAgICAgICAgICBiY21vc19zZW1fcG9zdCgmcmVxLT5zZW0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1zZykKKyAgICAgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7IC8qIHJlbGVhc2UgcGFja2VkIG1lc3NhZ2UuIEl0IGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KKyAgICB9CisKKyAgICBteV90YXNrLT5kZXN0cm95ZWQgPSBCQ01PU19UUlVFOworCisgICAgcmV0dXJuIChCQ01fRVJSX09LID09IHJldCkgPyAwIDogLUVJTlZBTDsKK30KKworc3RhdGljIGJjbWJhbF9tZ210X29wZXJfaWQgX2JjbWJhbF9vYmpfdG9fb3Blcl9pZChjb25zdCBiY21iYWxfb2JqICpvYmppbmZvKQoreworICAgIGlmIChvYmppbmZvLT5ncm91cCA9PSBCQ01CQUxfTUdUX0dST1VQX1NUQVQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNQkFMX01HTVRfT1BFUl9JRF9HRVRfU1RBVFM7CisgICAgfQorICAgIGVsc2UgaWYgKChvYmppbmZvLT50eXBlICYgQkNNQkFMX09CSl9NU0dfVFlQRV9HRVQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTUJBTF9NR01UX09QRVJfSURfR0VUOworICAgIH0KKyAgICBlbHNlIGlmICgob2JqaW5mby0+dHlwZSAmIEJDTUJBTF9PQkpfTVNHX1RZUEVfQ0xFQVIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTUJBTF9NR01UX09QRVJfSURfQ0xFQVI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01CQUxfTUdNVF9PUEVSX0lEX1NFVDsKKyAgICB9Cit9CisKKyNkZWZpbmUgQkFMQVBJX09QRVJfVElNRU9VVCAoMzAwMDAwMDApIC8qIDMwIHNlY29uZHMgKi8KKworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21iYWxfb3BlcihiY21iYWxfb2JqICpvYmppbmZvKQoreworICAgIGJhbF9jb21tX21zZ19oZHIgKmNvbW1faGRyID0gYmNtYmFsX2JhbF9oZHJfZ2V0KG9iamluZm8pOworICAgIGJjbW9zX21zZyAqb3NfbXNnOworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICAvKgorICAgICAqIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIGNvcmUgZm9yIHByb2Nlc3NpbmcKKyAgICAgKi8KKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04oTlVMTCA9PSBvYmppbmZvKTsKKworICAgIC8qIENoZWNrIHRoZSBtYWdpYyBudW1iZXIgdG8gYmUgc3VyZSB0aGF0IHRoZSBvYmplY3QgaGFzIGJlZW4gcHJvcGVybHkgaW5pdGlhbGl6ZWQgKi8KKyAgICBpZihCQ01CQUxfT0JKX0lOSVRfVkFMICE9IG9iamluZm8tPm9ial9pbml0X3ZhbCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9wdWJsaWNfYXBpLCAKKyAgICAgICAgICAgICAgICAiT2JqZWN0IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZDogbXVzdCB1c2UgYSBCQ01CQUwgSU5JVCBtYWNybyBvbiB0aGUgb2JqZWN0IGJlZm9yZSBjYWxsaW5nIHRoZSBCQUwgQVBJXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICByZXQgPSBiY21vc19zZW1fY3JlYXRlKCZjb21tX2hkci0+c2VtLCAwLCAwLCAiYXBpX3JlcSIpOworICAgIGlmIChyZXQpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfcHVibGljX2FwaSwgIkNhbid0IGNyZWF0ZSBzZW1hcGhvcmU6ICVzXG4iLCBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgLyogcmV0dXJuIGhlcmUuIFdlIGRvbid0IHdhbnQgdG8gZGVzdHJveSBzZW1hcGhvcmUgdGhhdCB3YXNuJ3QgY3JlYXRlZCAqLworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGRvCisgICAgeworICAgICAgICBiY21iYWxfbXNnX2hkcl9zZXQob2JqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUJBTF9NR01UX01TRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBTF9NU0dfVFlQRV9SRVEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCQUxfU1VCU1lTVEVNX1BVQkxJQ19BUEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmppbmZvLT5vYmpfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iY21iYWxfb2JqX3RvX29wZXJfaWQob2JqaW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfcHVibGljX2FwaSwgImFib3V0IHRvIHNlbmQgJXBcbiIsIG9iamluZm8pOworCisgICAgICAgIGJjbW9zX211dGV4X2xvY2soJmJhbGFwaV9sb2NrKTsKKyAgICAgICAgYmNtYmFsX2V4X2lkX3NldChvYmppbmZvLCArK2JhbGFwaV9leGNoYW5nZV9pZCk7CisgICAgICAgIG9zX21zZyA9IGJjbWJhbF9iY21vc19oZHJfZ2V0KG9iamluZm8pOworICAgICAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnBlbmRpbmdfcmVxX2xpc3QsIG9zX21zZywgbmV4dCk7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmYmFsYXBpX2xvY2spOworCisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IChyZXQgPSBiY21iYWxfbXNnX3NlbmQocF9iYWxhcGlfdG9fY29yZV9xdWV1ZSwgb2JqaW5mbywgQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUikpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfcHVibGljX2FwaSwgIm1lc3NhZ2Ugc2VuZCBmYWlsZWQgd2l0aCBlcnJvcjogJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3B1YmxpY19hcGksICJSRVEgbWVzc2FnZSBzZW50IHRvIGNvcmVcbiIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFdlJ3ZlIHNlbnQgdGhlIG1lc3NhZ2UgdG8gdGhlIGNvcmUsIG5vdywgd2FpdCBmb3IgdGhlIHJlc3BvbnNlIChvciB0aW1lb3V0KQorICAgICAgICAgKi8KKyAgICAgICAgcmV0ID0gYmNtb3Nfc2VtX3dhaXQoJmNvbW1faGRyLT5zZW0sIEJBTEFQSV9PUEVSX1RJTUVPVVQpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9wdWJsaWNfYXBpLCAicnNwIG1lc3NhZ2UgcmVjZWl2ZSBmb3IgZmFpbGVkIHdpdGggZXJyb3I6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9wdWJsaWNfYXBpLCAiUlNQIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBjb3JlXG4iKTsKKworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9wdWJsaWNfYXBpLCAiZmFpbGVkIHRvIHByb2Nlc3MgcnNwIG1zZ1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gb2JqaW5mby0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfcHVibGljX2FwaSwgInJlbW90ZSBtZXNzYWdlIGNvbW1hbmQgc3RhdHVzIGlzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBiY21vc19zdHJlcnJvcihvYmppbmZvLT5zdGF0dXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFBhc3MgdGhlIGNvbW1hbmQgc3RhdHVzIHJlY2VpdmVkIGZyb20gdGhlIGNvcmUgYmFjayB0byB0aGUgY2FsbGVyCisgICAgICAgICAqLworICAgICAgICByZXQgPSBvYmppbmZvLT5zdGF0dXM7CisgICAgfQorICAgIHdoaWxlKDApOworCisgICAgYmNtb3Nfc2VtX2Rlc3Ryb3koJmNvbW1faGRyLT5zZW0pOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCQUwgUHVibGljIEFQSSBTZXQgKG9yIG1vZGlmeSkgY29tbWFuZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9jZmdfc2V0KGJjbWJhbF9jZmcgKm9iamluZm8pCit7CisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3B1YmxpY19hcGksICJCQUwgUFVCTElDIEFQSSAtIEJDTUJBTF9TRVRcbiIpOworCisgICAgaWYoQkNNQkFMX09CSl9JRF9QQUNLRVQgPT0gb2JqaW5mby0+aGRyLm9ial90eXBlKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3B1YmxpY19hcGksICJ1bnN1cHBvcnRlZCBvYmplY3QgaWQgZGV0ZWN0ZWQgJWRcbiIsIG9iamluZm8tPmhkci5vYmpfdHlwZSk7CisgICAgICAgIHJldCA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvYmppbmZvLT5oZHIudHlwZSA9IEJDTUJBTF9PQkpfTVNHX1RZUEVfU0VUOworICAgICAgICByZXQgPSBfYmNtYmFsX29wZXIoJm9iamluZm8tPmhkcik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBCQ01CQUxfTUFYX1BST1hZX1BBQ0tFVF9TSVpFICAoMTYwMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCQUwgUHVibGljIEFQSSBQYWNrZXQgU2VuZCBmdW5jdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9wa3Rfc2VuZChiY21iYWxfZGVzdCBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhY2tldF90b19zZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBhY2tldF9sZW4pCit7CisgICAgLyogQ29udmVydCB0aGUgdXNlciBwYWNrZXQgaW50byBhIEJBTCBvYmplY3QgKi8KKyAgICBiY21iYWxfcGFja2V0X2NmZyAqcF9wYWNrZXRfb2JqOworICAgIGJjbWJhbF9wYWNrZXRfa2V5IGtleTsKKyAgICBiY21iYWxfdThfbGlzdF91MzIgcGt0OworICAgIGJjbW9zX2Vycm5vIHJldDsKKworICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3B1YmxpY19hcGksICJCQUwgUFVCTElDIEFQSSAtIEJDTUJBTF9TRU5EIHRvICVzXG4iLAorICAgICAgICAgICAgKEJDTUJBTF9ERVNUX1RZUEVfTk5JID09IGRlc3QudHlwZSkgPyAiTk5JIiA6ICJTVUItVEVSTSIpOworCisgICAgaWYoQkNNQkFMX01BWF9QUk9YWV9QQUNLRVRfU0laRSA8IHBhY2tldF9sZW4pCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfcHVibGljX2FwaSwgInVzZXIgcGFja2V0IGxlbmd0aCAoJWQpIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJWRcbiIsCisgICAgICAgICAgICAgICAgcGFja2V0X2xlbiwKKyAgICAgICAgICAgICAgICBCQ01CQUxfTUFYX1BST1hZX1BBQ0tFVF9TSVpFKTsKKworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIEJDTV9MT0coSU5GTywgbG9nX2lkX3B1YmxpY19hcGksICJ1c2VyIHBhY2tldCBmaXJzdCA4IGJ5dGVzICUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAorICAgICAgICAgICAgcGFja2V0X3RvX3NlbmRbMF0sIHBhY2tldF90b19zZW5kWzFdLCBwYWNrZXRfdG9fc2VuZFsyXSwgcGFja2V0X3RvX3NlbmRbM10sCisgICAgICAgICAgICBwYWNrZXRfdG9fc2VuZFs0XSwgcGFja2V0X3RvX3NlbmRbNV0sIHBhY2tldF90b19zZW5kWzZdLCBwYWNrZXRfdG9fc2VuZFs3XSk7CisKKyAgICAvKiBTZXQgdXAgdGhlIG9iamVjdCBrZXkgKi8KKyAgICBrZXkucGFja2V0X3NlbmRfZGVzdCA9IGRlc3Q7CisKKyAgICAvKiBBbGxvY2F0ZSByb29tIGZvciB0aGUgcGFja2V0IG9iamVjdCBpbmNsdWRpbmcgdGhlIHVzZXIgcGFja2V0ICovCisgICAgcF9wYWNrZXRfb2JqID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21iYWxfcGFja2V0X2NmZykgKyBwYWNrZXRfbGVuKTsKKworICAgIEJDTUJBTF9DRkdfSU5JVChwX3BhY2tldF9vYmosIHBhY2tldCwga2V5KTsKKworICAgIC8qIE5vdyBmaWxsIGluIHVzZXIgcGFja2V0IGRhdGEgaW50byB0aGUgb2JqZWN0ICovCisgICAgcGt0LmxlbiA9IHBhY2tldF9sZW47CisgICAgcGt0LnZhbCA9ICh1aW50OF90ICopJnBfcGFja2V0X29ialsxXTsKKyAgICBtZW1jcHkocGt0LnZhbCwgcGFja2V0X3RvX3NlbmQsIHBhY2tldF9sZW4pOworCisgICAgQkNNQkFMX0NGR19QUk9QX1NFVChwX3BhY2tldF9vYmosIHBhY2tldCwgcGt0LCBwa3QpOworCisgICAgcF9wYWNrZXRfb2JqLT5oZHIuaGRyLnR5cGUgPSBCQ01CQUxfT0JKX01TR19UWVBFX1NFVDsgLyogaW50ZXJuYWxseSBwYWNrZXQgU0VORCBpcyBtb2RlbGVkIGFzIGEgY29uZmlnIFNFVCAqLworICAgIHJldCA9IF9iY21iYWxfb3BlcigmKHBfcGFja2V0X29iai0+aGRyLmhkcikpOworICAgIGJjbW9zX2ZyZWUocF9wYWNrZXRfb2JqKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQkFMIFB1YmxpYyBBUEkgR2V0IGNvbW1hbmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21iYWxfY2ZnX2dldChiY21iYWxfY2ZnICpvYmppbmZvKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfcHVibGljX2FwaSwgIkJBTCBQVUJMSUMgQVBJIC0gQkNNQkFMX0dFVFxuIik7CisKKyAgICBpZihCQ01CQUxfT0JKX0lEX1BBQ0tFVCA9PSBvYmppbmZvLT5oZHIub2JqX3R5cGUpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfcHVibGljX2FwaSwgInVuc3VwcG9ydGVkIG9iamVjdCBpZCBkZXRlY3RlZCAlZFxuIiwgb2JqaW5mby0+aGRyLm9ial90eXBlKTsKKyAgICAgICAgcmV0ID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG9iamluZm8tPmhkci50eXBlID0gQkNNQkFMX09CSl9NU0dfVFlQRV9HRVQ7CisgICAgICAgIHJldCA9IF9iY21iYWxfb3BlcigmKG9iamluZm8tPmhkcikpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQkFMIFB1YmxpYyBBUEkgQ2xlYXIgY29tbWFuZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9jZmdfY2xlYXIoYmNtYmFsX2NmZyAqb2JqaW5mbykKK3sKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisgICAgQkNNX0xPRyhJTkZPLCBsb2dfaWRfcHVibGljX2FwaSwgIkJBTCBQVUJMSUMgQVBJIC0gQkNNQkFMX0NMRUFSXG4iKTsKKworICAgIGlmKEJDTUJBTF9PQkpfSURfUEFDS0VUID09IG9iamluZm8tPmhkci5vYmpfdHlwZSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9wdWJsaWNfYXBpLCAidW5zdXBwb3J0ZWQgb2JqZWN0IGlkIGRldGVjdGVkICVkXG4iLCBvYmppbmZvLT5oZHIub2JqX3R5cGUpOworICAgICAgICByZXQgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb2JqaW5mby0+aGRyLnR5cGUgPSBCQ01CQUxfT0JKX01TR19UWVBFX0NMRUFSOworICAgICAgICByZXQgPSBfYmNtYmFsX29wZXIoJm9iamluZm8tPmhkcik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBAYnJpZWYgQkFMIFB1YmxpYyBBUEkgR2V0IFN0YXRzIGNvbW1hbmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21iYWxfc3RhdF9nZXQoYmNtYmFsX3N0YXQgKm9iamluZm8pCit7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKE5VTEwgPT0gb2JqaW5mbyk7CisKKyAgICAvKgorICAgICAqIEB0b2RvIEZpbmlzaCB0aGUgc3RhdHMgZnVuY3Rpb24KKyAgICAgKi8KKworICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9wdWJsaWNfYXBpLCAiYmFsIGdldCBzdGF0cyBBUEkgbm90IHN1cHBvcnRlZFxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJBTCBQdWJsaWMgQVBJIGluZGljYXRpb24gc3Vic2NyaXB0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtYmFsX3N1YnNjcmliZV9pbmQoYmNtYmFsX2NiX2NmZyAqY2JfY2ZnKQoreworCisgICAgYmNtb3NfZXJybm8gcmV0ID0gQkNNX0VSUl9PSzsKKworICAgIC8qCisgICAgICogVGhlIGluZGljYXRpb24gc3Vic2NyaXB0aW9uIGZ1bmN0aW9uCisgICAgICovCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3B1YmxpY19hcGksICJCQUwgaW5kaWNhdGlvbiBzdWJzY3JpcHRpb24gZm9yIHR5cGU6ICVzICglZClcbiIsCisgICAgICAgICAgICBiY21iYWxfb2JqdHlwZV9zdHIoY2JfY2ZnLT5vYmpfdHlwZSksIGNiX2NmZy0+b2JqX3R5cGUpOworCisgICAgcmV0ID0gX21hbmFnZV9hcGlfaW5kX2xpc3RlbmVyKElORF9DQl9TVUJTQ1JJQkUsIGNiX2NmZyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJBTCBQdWJsaWMgQVBJIGluZGljYXRpb24gdW4tc3Vic2NyaXB0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtYmFsX3Vuc3Vic2NyaWJlX2luZChiY21iYWxfY2JfY2ZnICpjYl9jZmcpCit7CisKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisgICAgQlVHX09OKE5VTEwgPT0gY2JfY2ZnKTsKKworICAgIC8qCisgICAgICogVGhlIGluZGljYXRpb24gc3Vic2NyaXB0aW9uIGZ1bmN0aW9uCisgICAgICovCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3B1YmxpY19hcGksICJCQUwgaW5kaWNhdGlvbiB1bi1zdWJzY3JpcHRpb24gZm9yIHR5cGU6ICVzICglZClcbiIsCisgICAgICAgICAgICBiY21iYWxfb2JqdHlwZV9zdHIoY2JfY2ZnLT5vYmpfdHlwZSksIGNiX2NmZy0+b2JqX3R5cGUpOworCisgICAgcmV0ID0gX21hbmFnZV9hcGlfaW5kX2xpc3RlbmVyKElORF9DQl9VTlNVQlNDUklCRSwgY2JfY2ZnKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIEEgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludGVyZmFjZSB0eXBlCisgKgorICogQHBhcmFtIGludF90eXBlICAgICAgICAgIFRoZSBpbnRlcmZhY2UgdHlwZSB0byBnZXQKKyAqCisgKiBAcmV0dXJucyBjb25zdCBjaGFyICogICAgQSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGludGVyZmFjZSB0eXBlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yICJJTlZBTElEIiwgaWYgbm90IGEgdmFsaWQgdHlwZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICpiY21iYWxfZ2V0X2ludGVyZmFjZV90eXBlX3N0cihiY21iYWxfaW50Zl90eXBlIGludF90eXBlKQoreworICAgIGNvbnN0IGNoYXIgKnR5cGVfc3RyOworCisgICAgc3dpdGNoIChpbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UoQkNNQkFMX0lOVEZfVFlQRV9QT04pOgorICAgICAgICB7CisgICAgICAgICAgICB0eXBlX3N0ciA9ICJwb24iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UoQkNNQkFMX0lOVEZfVFlQRV9OTkkpOgorICAgICAgICB7CisgICAgICAgICAgICB0eXBlX3N0ciA9ICJubmkiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVfc3RyID0gIklOVkFMSUQiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgfQorCisgICAgcmV0dXJuIHR5cGVfc3RyOworfQorCisKKy8qQH0qLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGkvYmFsX2FwaS5kb3ggYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaS9iYWxfYXBpLmRveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRiMDExCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGkvYmFsX2FwaS5kb3gKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBCQUwgUHJvZ3JhbW1lcnMgR3VpZGUgLSBpbnRyb2R1Y3Rpb24KKyAqLworCisvKiogXG1haW5wYWdlIEJBTCBQdWJsaWMgSW50ZXJmYWNlIENvbmNlcHQKKworXHNlY3Rpb24gaW50cm8gSW50cm9kdWN0aW9uCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgQkFMIHVzZXIgaW50ZXJmYWNlLiBUaGUgdXNlciBpbnRlcmZhY2UgaXMgY29uc3RydWN0ZWQgZnJvbSBhCitzbWFsbCBzZXQgb2YgcHVibGljIEFQSXMgYW5kIGFuIG9iamVjdHMgbW9kZWwuCisKK1RoZSBvYmplY3RzIG1vZGVsIGlzIGRlc2lnbmVkIHRvIG1hbmFnZSBkaWZmZXJlbnQgZW50aXRpZXMgaW4gdGhlIHN5c3RlbSwgYW5kIGVuYWJsZXMgYSBzaW1wbGUgYW5kIGludHVpdGl2ZQorYXBwcm9hY2ggZm9yIG1hbmFnaW5nIGxpbmUgY2FyZC4KKworVGhlIEFQSSBsYXllciBpcyBkZXNpZ25lZCB0byBlbmFibGUgdGhlIG1hbmFnZW1lbnQgb2YgbGluZSBjYXJkIGNvbnRhaW5pbmcgbXV1bHRpcGxlIE1BQyBhbmQgU1dJVENIIGRldmljZXMKK2FuZCBzdXBwb3J0IGFueSBob3N0IGFwcGxpY2F0aW9uIGFyY2hpdGVjdHVyZS4gSXQgaW5jbHVkZXMgYSBzZXQgb2YgQVBJcyB0byBhY2Nlc3MgdGhlIGxpbmUgY2FyZCBjb25maWd1cmF0aW9uIGFuZAorYXN5bmNocm9ub3VzIGluZGljYXRpb25zIHRvIHNlbmQgZXZlbnRzIHRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLgorCitUaGUgQVBJIGxheWVyIGlzIHBhcnQgb2YgdGhlIEJyb2FkY29twq4gQkFMIFNESywgd2hpY2ggaXMgcHJvdmlkZWQgYXMgQyBzb3VyY2UgY29kZSwgd2hpY2ggaXMKK2luZGVwZW5kZW50IG9mIHRoZSBDUFUgYW5kIG9wZXJhdGluZyBzeXN0ZW0gYmVpbmcgdXNlZC4KKworXHNlY3Rpb24gb2JqZWN0X21vZGVsX3RhYmxlIEJBTCBPYmplY3QgTW9kZWwKKworVGhlIHN5c3RlbSBpcyBtb2RlbGVkIGFzIGEgc2V0IG9mIG1hbmFnZWQgb2JqZWN0cy4gVGhlIHRlcm0g4oCcb2JqZWN04oCdIGhlcmUgZG9lc27igJl0IGltcGx5IGFueSBpbmhlcml0YW5jZSwgaXQKK21lYW5zIGFuIGVudGl0eSB0aGF0IGNhbiBiZSBhZGRyZXNzZWQgaW5kaXZpZHVhbGx5IGFuZCBoYXMgYSBzZXQgb2YgcHJvcGVydGllcyAoYXR0cmlidXRlcykgYW5kIG1ldGhvZHMKKyhvcGVyYXRpb25zKSwgZm9yIGV4YW1wbGUsIGFjY2Vzc190ZXJtaW5hbCwgZmxvdywgZXRjLgorCitFYWNoIG9iamVjdCBjYW4gaGF2ZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIChha2EgYXR0cmlidXRlcyksIHdoZXJlYXMgYSBwcm9wZXJ0eSBpcyBhbiBvYmplY3QgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIHNldCBvcgorcmV0cmlldmVkIGluZGVwZW5kZW50bHkuCisJLSBBIHByb3BlcnR5IGlzIGEgc2ltcGxlIHR5cGUgb3IgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBvbmUgb3IgbW9yZSBmaWVsZHMsIHdoZXJlIGZpZWxkcyBjYW4gdGhlbXNlbHZlcyBiZQorc3RydWN0dXJlcworCS0gRWFjaCBwcm9wZXJ0eSBoYXMgYSBzcGVjaWZpYyBwZXJtaXNzaW9uIHR5cGUsIHN1Y2ggYXMgUmVhZC1Pbmx5IChSTykgYW5kIFJlYWQtV3JpdGUgKFJXKS4KKworT2JqZWN0IHByb3BlcnRpZXMgYXJlIGdyb3VwZWQgaW50byBzZWN0aW9ucy9tYW5hZ2VtZW50IGdyb3Vwcy4gVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBjYW4gY29udGFpbiB6ZXJvIG9yCittb3JlIHByb3BlcnRpZXM6CisJLSBLZXnigJRGaWVsZChzKSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBvYmplY3QgaW5zdGFuY2UgKGZvciBleGFtcGxlLCBzdWJzY3JpYmVyX3Rlcm1pbmFsIGtleSA9IHtzdWJzX2lkLCBpbnRmX2lkfSkuCisJLSBDb25maWd1cmF0aW9uCisJICAgIC0gUmVhZC1Xcml0ZSwgUmVhZC1Pbmx5IGFuZCBXcml0ZS1Pbmx5IGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcworCS0gU3RhdGlzdGljcworCQktIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgY291bnRlcnMKKwkJLSBEZWJ1ZyBjb3VudGVycworCS0gQXV0b25vbW91cyBJbmRpY2F0aW9ucworCQktIE5vdGlmaWNhdGlvbnMgdGhhdCBhcmUgZ2VuZXJhdGVkIGFzeW5jaHJvbm91c2x5LgorCQkgIEluZGljYXRpb25zIGNhbiBiZSBlaXRoZXIgYXV0b25vbW91cyAoc3VjaCBhcyBhbGFybXMpIG9yIGFzeW5jaHJvbm91cyByZXNwb25zZXMgdG8gcHJldmlvdXNseQorICAgICAgICAgIHN1Ym1pdHRlZCBjb25maWd1cmF0aW9uIGNoYW5nZSAoZm9yIGluc3RhbmNlLCBzdWJzY3JpYmVyX3Rlcm1pbmFsIGFkbWluX3N0YXRlPXVwIHJlcXVlc3QpLgorCitcc2VjdGlvbiBvYmplY3RfbW9kZWxfcHJvcCBPYmplY3QgYW5kIFByb3BlcnRpZXMgSW1wbGVtZW50YXRpb24KKworXHN1YnNlY3Rpb24gb2JqZWN0X21vZGVsX3N0cnVjdHMgT2JqZWN0IFN0cnVjdHVyZXMKKworVGhlIG1haW4gaW5wdXQgcGFyYW1ldGVyIG9mIGFsbCB0aGUgQVBJcyBpcyBhbiBvYmplY3Qgc3RydWN0dXJlLCByZWZlcnJlZCB0byBhcyB0aGUgT2JqZWN0IFJlcXVlc3QgTWVzc2FnZS4gRWFjaAorb2JqZWN0IHNlY3Rpb24gaGFzIGEgZGlmZmVyZW50IHN0cnVjdHVyZSB0aGF0IGluY2x1ZGVzIGEgZ2VuZXJpYyBoZWFkZXIsIG9iamVjdCBrZXksIGFuZCBhIHNwZWNpZmljIHNlY3Rpb24gc3RydWN0dXJlCithY2NvcmRpbmcgdG8gdGhlIHNlY3Rpb24gdHlwZSAoZm9yIGV4YW1wbGUsIGNvbmZpZ3VyYXRpb24sIHN0YXRpY3MsIGV0YykuCisJLSBHZW5lcmljIGhlYWRlcjogQSBiYXNpYyBjb21wb25lbnQgb2YgYWxsIHRoZSBkaWZmZXJlbnQgc2VjdGlvbiBzdHJ1Y3R1cmVzIGlzIHRoZSBvYmplY3QgZ2VuZXJpYyBoZWFkZXIKKwkgIFxyZWYgYmNtYmFsX29iagorCisJLSBUaGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgYmNtYmFsX3h4X2NmZyBjb250YWluczoKKwkJLSBUaGUgZ2VuZXJpYyBoZWFkZXIgXHJlZiBiY21iYWxfY2ZnCisJCS0gVGhlIG9iamVjdCBrZXksIGlmIGFueQorCQktIFRoZSBzdHJ1Y3R1cmUgYmNtYmFsX3h4X2NmZ19kYXRhLCBjb250YWluaW5nIGFsbCBvYmplY3QgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCisKKwktIFRoaXMgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgYmNtYmFsX3h4X3N0YXQgY29udGFpbnM6CisJCS0gVGhlIGdlbmVyaWMgaGVhZGVyIFxyZWYgYmNtYmFsX3N0YXQKKwkJLSBUaGUgb2JqZWN0IGtleSwgaWYgYW55CisJCS0gVGhlIHN0cnVjdHVyZSBiY21iYWxfeHhfc3RhdF9kYXRhLCBjb250YWluaW5nIGFsbCB0aGUgb2JqZWN0IHN0YXRpc3RpY3MKKworCS0gVGhlIHBlci1hdXRvbm9tb3VzIGluZGljYXRpb24gc3RydWN0dXJlIGJjbWJhbF94eF9hdXRvX3l5IGNvbnRhaW5zOgorCQktIFRoZSBnZW5lcmljIGhlYWRlciBccmVmIGJjbWJhbF9hdXRvCisJCQktIFRoZSBhdXRvbm9tb3VzIG1lc3NhZ2UgSUQgaXMgc3RvcmVkIGluIHRoZSBzdWJncm91cCBmaWVsZC4KKwkJLSBUaGUgb2JqZWN0IGtleSwgaWYgYW55CisJCS0gVGhlIHN0cnVjdHVyZSBiY21iYWxfeHhfYXV0b195eV9kYXRhLCBjb250YWluaW5nIGFsbCBpbmRpY2F0aW9uIHByb3BlcnRpZXMsIGlmIGFueQorCitcc3Vic2VjdGlvbiBvYmplY3RfbW9kZWxfaW5pdF9tYWNyb3MgU3RydWN0dXJlIEluaXRpYWxpemF0aW9uIE1hY3JvcworVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHVzZWQgZm9yIGluaXRpYWxpemluZyBvYmplY3RzOgorCS0gXHJlZiBCQ01CQUxfQ0ZHX0lOSVQoY2ZnX21zZywgX29iamVjdCwgX2tleSkKKwktIFxyZWYgQkNNQkFMX1NUQVRfSU5JVChzdGF0X21zZywgX29iamVjdCwgX2tleSkKKworVGhlIG1hY3JvcyBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6CisJLSBDaGVjayB0aGF0IHRoZSBzdHJ1Y3R1cmUgbWF0Y2hlcyB0aGUgb2JqZWN0IHNlY3Rpb24uCisJLSBDbGVhciBhbGwgY29udHJvbCBmaWVsZHMgaW4gdGhlIGdlbmVyaWMgaGVhZGVyIFxyZWYgYmNtYmFsX29iai4KKworXHN1YnNlY3Rpb24gb2JqZWN0X21vZGVsX3Byb3BfbWFjcm9zIFByb3BlcnR5IFByZXNlbmNlIE1hc2sgTWFuaXB1bGF0aW9uIE1hY3JvcworVGhlIHByZXNlbmNlIG1hc2sgaW5kaWNhdGVzIHdoaWNoIG9mIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBvYmplY3Qgc3RydWN0dXJlIG5lZWQgdG8gYmUgYWNjZXNzZWQgKHNldC9nZXQsIGV0Yy4pCitUaGUgbWFzayBpcyBhIGJpdCBmaWVsZCwgd2hlcmVpbiBlYWNoIGJpdCBjb3JyZXNwb25kcyB0byBhIHNwZWNpZmljIHByb3BlcnR5LiBUaGUgZm9sbG93aW5nIG1hY3JvcyBzaG91bGQgYmUgdXNlZAorZm9yIHNldHRpbmcgdGhlIHByZXNlbmNlIG1hc2s6CisKKyAtIFNldCBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB2YWx1ZTpcbgorCVxyZWYgQkNNQkFMX0NGR19QUk9QX1NFVChfbXNnLCBfb2JqZWN0LCBfcGFybV9uYW1lLCBfcGFybV92YWx1ZSkKKyAtIEluZGljYXRlIHRoYXQgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBmZXRjaGVkIGJ5IGEgYmNtb2x0X2NmZ19nZXQoKSByZXF1ZXN0OlxuCisJXHJlZiBCQ01CQUxfQ0ZHX1BST1BfR0VUKF9tc2csIF9vYmplY3QsIF9wYXJtX25hbWUpCisgLSBJbmRpY2F0ZSB0aGF0IHRoZSBzdGF0aXN0aWMgc2hvdWxkIGJlIGZldGNoZWQgYnkgYSBiY21vbHRfc3RhdF9nZXQoKSByZXF1ZXN0OlxuCisJXHJlZiBCQ01CQUxfU1RBVF9QUk9QX0dFVChfbXNnLCBfb2JqZWN0LCBfcGFybV9uYW1lKQorCitcc3Vic2VjdGlvbiBvYmplY3RfbW9kZWxfZW51bXMgRW51bWVyYXRpb25zCitJbiB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9ucywgWFggaXMgdGhlIG9iamVjdCBuYW1lIGFuZCBZWSBpcyB0aGUgcHJvcGVydHkgbmFtZSBmcm9tIHRoZSBYTUwgbW9kZWwuCisKK1RoZSBzeXN0ZW0gbW9kZWwgaW5jbHVkZXMgdGhlIGVudW1lcmF0aW9uczoKKwktIFRoZSBiY21iYWxfb2JqX2lkIGVudW1lcmF0aW9uIGxpc3RzIGFsbCBvYmplY3RzLiBJdCBpbmNsdWRlcyBwZXItb2JqZWN0IEJDTUJBTF9PQkpfSURfWFggY29uc3RhbnRzLAorCQl3aGVyZSBYWCBpcyB0aGUgb2JqZWN0IG5hbWUgZnJvbSB0aGUgWE1MIG1vZGVsLgorCS0gVGhlIGJjbWJhbF94eF9jZmdfaWQgZW51bWVyYXRpb24gbGlzdHMgYWxsIFhYIG9iamVjdHMnIHByb3BlcnRpZXMgZnJvbSB0aGUg4oCcQ29uZmlndXJhdGlvbuKAnSBzZWN0aW9uIGluIHRoZQorCQlYTUwgbW9kZWwuIEl0IGluY2x1ZGVzIHRoZSBCQ01CQUxfWFhfQ0ZHX0lEX1lZIGNvbnN0YW50cy4KKwktIFRoZSBiY21iYWxfeHhfc3RhdF9pZCBlbnVtZXJhdGlvbiBsaXN0cyBhbGwgWFggb2JqZWN0J3MgcHJvcGVydGllcyBmcm9tIHRoZSDigJxTdGF0aXN0aWNz4oCdIHNlY3Rpb24gaW4gdGhlIFhNTAorCQltb2RlbC4gSXQgaW5jbHVkZXMgdGhlIEJDTUJBTF9YWF9TVEFUX0lEX1lZIGNvbnN0YW50cy4KKwktIFRoZSBiY21iYWxfeHhfYXV0b19pZCBlbnVtZXJhdGlvbiBsaXN0cyBhbGwgWFggb2JqZWN0J3MgaW5kaWNhdGlvbnMgZnJvbSB0aGUg4oCcQXV0b25vbW91cyBJbmRpY2F0aW9uc+KAnQorCQlzZWN0aW9uIGluIHRoZSBYTUwgbW9kZWwuIEl0IGluY2x1ZGVzIHRoZSBCQ01CQUxfWFhfQVVUT19JRF9ZWSBjb25zdGFudHMuCisKK1xzZWN0aW9uIGFwaV9zZWN0aW9uIEJBTCBQdWJsaWMgQVBJCisgIFNlZSBccmVmIGFwaSBpbiBBUEkgUmVmZXJlbmNlIGNoYXB0ZXIKKyovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaS9iYWxfYXBpLmggYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaS9iYWxfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmMWUwYgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliYmFsYXBpL2JhbF9hcGkuaApAQCAtMCwwICsxLDI4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX2FwaS5oCisgKiBAYnJpZWYgRnVuY3Rpb24gZGVjbGFyYXRpb25zIGFuZCBhbGwgaW5jbHVzaW9ucyByZXF1aXJlZCBmb3IgdGhlIEJBTCBQdWJsaWMgQVBJCisgKgorICogQGRlZmdyb3VwIGFwaSBCQUwgUHVibGljIEFQSQorICovCisjaWZuZGVmIEJDTUJBTF9BUElfSAorI2RlZmluZSBCQ01CQUxfQVBJX0gKKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCisjaW5jbHVkZSA8YmFsX29ianMuaD4KKworCisvKkB7Ki8KKworLyoKKyAqIFRoaXMgZXhhbXBsZSBvbmx5IGNvbnRyb2xzIHRoZSBkZWZhdWx0IGFjY2VzcyB0ZXJtaW5hbAorICovCisjZGVmaW5lIERFRkFVTFRfQVRFUk1fSUQgICAgICAgICAgICgwKQorCisvKiBNYXggbnVtYmVyIG9mIGFjY2Vzcy10ZXJtaW5hbHMgc3VwcG9ydGVkIGJ5IEJBTCAqLworI2RlZmluZSBNQVhfQUNDX1RFUk1fSUQgICAgICAgICAgICAoMjU1KQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2VlIHRoZSBiYWxfb2Jqcy5oIGZpbGUgZm9yIHRoZSBCQUwgb2JqZWN0cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIEJBTCBtZ210IG9wZXJhdGlvbnMKKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNQkFMX01HTVRfT1BFUl9JRF9TRVQgPSAxIDw8IDAsCisgICAgQkNNQkFMX01HTVRfT1BFUl9JRF9HRVQgPSAxIDw8IDEsCisgICAgQkNNQkFMX01HTVRfT1BFUl9JRF9HRVRfU1RBVFMgPSAxIDw8IDIsCisgICAgQkNNQkFMX01HTVRfT1BFUl9JRF9DTEVBUiA9IDEgPDwgMywKKyAgICBCQ01CQUxfTUdNVF9PUEVSX0lEX19OVU1fT0YgPSAxIDw8IDQsCisgICAgQkNNQkFMX01HTVRfT1BFUl9JRF9BTEwgPSBCQ01CQUxfTUdNVF9PUEVSX0lEX19OVU1fT0YgLSAxLAorfSBiY21iYWxfbWdtdF9vcGVyX2lkOworCisKKy8qIGFjY2Vzc190ZXJtaW5hbDprZXk6YWNjX3Rlcm1faWQgbWF4IHZhbHVlICovCisjZGVmaW5lIEJBTF9BUElfTUFYX0FDQ19URVJNX0lEICAgICAgICAgICAoMjU1KQorCisvKiBmbG93OmtleTpmbG93X2lkIG1heCB2YWx1ZSAqLworI2RlZmluZSBCQUxfQVBJX01BWF9GTE9XX0lEICAgICAgICAgICAgICAgKDY1NTM1KQorCisvKiBpbnRlcmZhY2U6bXR1IGxpbWl0cyAqLworI2RlZmluZSBCQUxfQVBJX01JTl9JTlRGX01UVV9TSVpFICAgICAgICAgKDY0KQorI2RlZmluZSBCQUxfQVBJX01BWF9JTlRGX01UVV9TSVpFICAgICAgICAgKDkyMTYpCisKKy8qIE1heCBudW1iZXIgb2YgaW50ZXJmYWNlcyBwZXIgaW50ZXJmYWNlOnR5cGUgaW4gQkFMICovCisjZGVmaW5lIEJBTF9BUElfTUFYX0lOVEZfSUQgICAgICAgICAgICAgICAoMTUpCisKKy8qIE1heCBzdWJfdGVybV9pZCBwZXIgaW50ZXJmYWNlIGZvciB0aGUgdmFyaW91cyBtb2RlcyAqLworI2RlZmluZSBCQUxfQVBJX01BWF9TVUJfVEVSTV9JRF9HUE9OICAgICAgKDEyNykKKyNkZWZpbmUgQkFMX0FQSV9NQVhfU1VCX1RFUk1fSURfRVBPTiAgICAgICgyNTYpCisjZGVmaW5lIEJBTF9BUElfTUFYX1NVQl9URVJNX0lEX1hHUE9OICAgICAoNTExKQorCisvKiBNYXggYW5kIG1pbiB2YWx1ZXMgZm9yIGludGVyZmFjZSBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEJBTF9BUElfTUlOX0xPV19EQVRBX0FHR19QT1JUX0lEICAgICAgKDI1NikKKyNkZWZpbmUgQkFMX0FQSV9NQVhfTE9XX0RBVEFfQUdHX1BPUlRfSUQgICAgICAoMTQ1OTEpCisKKyNkZWZpbmUgQkFMX0FQSV9NSU5fTE9XX0RBVEFfU1ZDX1BPUlRfSUQgICAgICAoMTAyNCkKKyNkZWZpbmUgQkFMX0FQSV9NQVhfTE9XX0RBVEFfU1ZDX1BPUlRfSUQgICAgICAoNTc1OTgpCisKKworLyogTWF4IGFuZCBNaW4gdmFsdWVzIGZvciBhZ2dfcG9ydF9pZCBhbmQgc3ZjX3BvcnRfaWQgKi8KKyNkZWZpbmUgQkFMX0FQSV9NSU5fREFUQV9TVkNfUE9SVF9JRCAgICAgICgyNTYpCisjZGVmaW5lIEJBTF9BUElfTUFYX0RBVEFfU1ZDX1BPUlRfSUQgICAgICAoMTYzODMpCisKKy8qIE1heCBhbmQgTWluIHZhbHVlcyBmb3IgYWdnX3BvcnRfaWQgYW5kIHN2Y19wb3J0X2lkICovCisjZGVmaW5lIEJBTF9BUElfTUlOX0RBVEFfQUdHX1BPUlRfSUQgICAgICAoMjU2KQorI2RlZmluZSBCQUxfQVBJX01BWF9EQVRBX0FHR19QT1JUX0lEICAgICAgKDE2MzgzKQorCisvKiBNYXggdmFsdWUgZm9yIHBiaXRzICovCisjZGVmaW5lIE1BWF9QQklUU19WQUxVRSAgICAgICAgICAgICAgICAgICAoNykKKworLyoKKyAqIEJBTCBDTEkgbWF4IHZhbHVlcworICovCisvKiogTWF4IG51bWJlciBvZiBzdXBwb3J0ZWQgT0xUcyAqLworI2RlZmluZSBNQVhfU1VQUE9SVEVEX09MVFMgICAgICAgICAgKEJBTF9BUElfTUFYX0FDQ19URVJNX0lEKzEpCisKKy8qKiBNYXggbnVtYmVyIG9mIHN1cHBvcnRlZCBzdWJzY3JpYmVyIHRlcm1pbmFscyAoT05VcykgKi8KKyNkZWZpbmUgTUFYX1NVUFBPUlRFRF9TVUJTICAgICAgICAgIChCQUxfQVBJX01BWF9TVUJfVEVSTV9JRF9YR1BPTisxKQorCisvKiogTWF4IG51bWJlciBvZiBzdXBwb3J0ZWQgZmxvd3MgKi8KKyNkZWZpbmUgTUFYX1NVUFBPUlRFRF9GTE9XUyAgICAgICAgIChCQUxfQVBJX01BWF9GTE9XX0lEKzEpCisKKy8qKiBNYXggbnVtYmVyIG9mIHN1cHBvcnRlZCBQT04gYW5kIE5OSSBpbnRlcmZhY2VzICovCisjZGVmaW5lIE1BWF9TVVBQT1JURURfSU5URiAgICAgICAgICAoQkFMX0FQSV9NQVhfSU5URl9JRCsxKQorCisvKiogQkFMIEluZGljYXRpb24gY2FsbGJhY2sgaGFuZGxlciBmdW5jdGlvbiBwcm90b3R5cGUgKi8KK3R5cGVkZWYgdm9pZCAoKmZfYmNtYmFsX2luZF9oYW5kbGVyKShiY21iYWxfb2JqICpvYmopOworCisvKiogQkFMIEluZGljYXRpb24gY2FsbGJhY2sgcmVnaXN0cmF0aW9uIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9jYl9jZmcKK3sKKyAgICBiY21iYWxfb2JqX2lkICAgICAgICAgIG9ial90eXBlOyAJICAgICAgIC8qKjwgT2JqZWN0IHR5cGUgKi8KKyAgICBmX2JjbWJhbF9pbmRfaGFuZGxlciAgIGluZF9jYl9oZGxyOyAgICAgICAgLyoqPCBJbmRpY2F0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uLiBOVUxMPXVucmVnaXN0ZXIgKi8KKyAgICBiY21vc19tb2R1bGVfaWQgICAgICAgIG1vZHVsZTsgICAgICAgICAgICAgLyoqPCBUYXJnZXQgbW9kdWxlIGlkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBpdCBpcyBCQ01PU19NT0RVTEVfSURfTk9ORSAoMCksIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBCQUwncyBjb250ZXh0LiBPdGhlcndpc2UsIGl0IHdpbGwgYmUgY2FsbGVkIGluIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSdzIGNvbnRleHQgKi8KK30gYmNtYmFsX2NiX2NmZzsgLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgcGFzc2luZyB0aGUgbWdtdCBxdWV1ZQorCisgKiBJUDpwb3J0IGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIGNvcmUgbWFpbiB0aHJlYWQgYW5kCisgKiBjb3JlIHdvcmtlciB0aHJlYWQgYW5kIGJhbCBBUEkuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1nbXRfcXVldWVfYWRkcl9wb3J0cworeworICAgIGNvbnN0IGNoYXIgKmNvcmVfbWdtdF9pcF9wb3J0OworICAgIGNvbnN0IGNoYXIgKmJhbGFwaV9tZ210X2lwX3BvcnQ7Cit9IG1nbXRfcXVldWVfYWRkcl9wb3J0czsKKworZXh0ZXJuIGRldl9sb2dfaWQgbG9nX2lkX3B1YmxpY19hcGk7CisKK2NvbnN0IGNoYXIgKmJjbWJhbF9nZXRfaW50ZXJmYWNlX3R5cGVfc3RyKGJjbWJhbF9pbnRmX3R5cGUgaW50X3R5cGUpOworCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBAYnJpZWYgVGhlIEJBTCBQdWJsaWMgQVBJCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplIHRoZSBCQUwgUHVibGljIEFQSSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKiBAcGFyYW0gYmFsYXBpX21nbXRfaXBfcG9ydCBUaGUgSVA6cG9ydCBvZiB0aGUgQkFMIEFQSSBtYW5hZ2VtZW50IHF1ZXVlCisgKgorICogQHBhcmFtIGNvcmVfbWdtdF9pcF9wb3J0ICAgVGhlIElQOnBvcnQgb2YgdGhlIGNvcmUgbWFuYWdlbWVudCBxdWV1ZQorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKgorICoqLworYmNtb3NfZXJybm8gYmNtYmFsX2FwaV9pbml0KGNvbnN0IGNoYXIgKmJhbGFwaV9tZ210X2lwX3BvcnQsIGNvbnN0IGNoYXIgKmNvcmVfbWdtdF9pcF9wb3J0KTsKKworLyoqCisgKiBAYnJpZWYgVW4taW5pdGlhbGl6ZSB0aGUgQkFMIFB1YmxpYyBBUEkgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8gPT0gQkNNX0VSUl9PSworICoKKyAqKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9hcGlfZmluaXNoKHZvaWQpOworCisvKioKKyAqIEBicmllZiBCQUwgUHVibGljIEFQSSBTZXQgKG9yIG1vZGlmeSkgY29tbWFuZC4KKyAqCisgKiBTZXQgKG9yIG1vZGlmeSkgdGhlIHNwZWNpZmllZCBvYmplY3QgaW5zdGFuY2UgKHdpdGggaW1wbGljaXQgY3JlYXRpb24KKyAqIG9mIGR5bmFtaWMgb2JqZWN0cykgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgYWNjZXNzLXRlcm1pbmFsIGRldmljZS4KKyAqCisgKiBAcGFyYW0gb2JqaW5mbyBBIHBvaW50ZXIgdG8gYSBCQUwgb2JqZWN0CisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqCisgKiovCitiY21vc19lcnJubyBiY21iYWxfY2ZnX3NldChiY21iYWxfY2ZnICpvYmppbmZvKTsKKworLyoqCisgKiBAYnJpZWYgQkFMIFB1YmxpYyBBUEkgR2V0IGNvbW1hbmQuCisgKgorICogR2V0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IGluc3RhbmNlCisgKgorICogQHBhcmFtIG9iamluZm8gQSBwb2ludGVyIHRvIGEgQkFMIG9iamVjdAorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKgorICovCitiY21vc19lcnJubyBiY21iYWxfY2ZnX2dldChiY21iYWxfY2ZnICpvYmppbmZvKTsKKworLyoqCisgKiBAYnJpZWYgQkFMIFB1YmxpYyBBUEkgUGFja2V0IFNlbmQgZnVuY3Rpb24uCisgKgorICogU2VuZCBhIHBhY2tldCB0byB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uCisgKgorICogQHBhcmFtIGRlc3QgICAgVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSB1c2VyIHBhY2tldAorICoKKyAqIEBwYXJhbSBwYWNrZXRfdG9fc2VuZCBBIHBvaW50ZXIgdG8gdGhlIHVzZXIgcGFja2V0IHRvIHNlbmQgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbgorICoKKyAqIEBwYXJhbSBwYWNrZXRfbGVuIFRoZSBsZW5ndGggb2YgdGhlICB1c2VyIHBhY2tldCAobXVzdCBiZSA8PTE2MDAgYnl0ZXMpCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqCisgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9wa3Rfc2VuZChiY21iYWxfZGVzdCBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhY2tldF90b19zZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBhY2tldF9sZW4pOworCisvKioKKyAqIEBicmllZiBCQUwgUHVibGljIEFQSSBDbGVhciBjb21tYW5kLgorICoKKyAqIFNldCBhbGwgYXR0cmlidXRlcyB0byBkZWZhdWx0IChvciByZW1vdmUgdGhlIG9iamVjdCBpbnN0YW5jZSBmb3IKKyAqIGR5bmFtaWMgb2JqZWN0cykgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGluc3RhbmNlCisgKgorICogQHBhcmFtIG9iamluZm8gQSBwb2ludGVyIHRvIGEgQkFMIG9iamVjdAorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKgorICovCitiY21vc19lcnJubyBiY21iYWxfY2ZnX2NsZWFyKGJjbWJhbF9jZmcgKiBvYmppbmZvKTsKKworLyoqCisgKiBAYnJpZWYgQkFMIFB1YmxpYyBBUEkgR2V0IFN0YXRzIGNvbW1hbmQuCisgKgorICogR2V0IChhbmQgY2xlYXIpIHRoZSBzdGF0cyBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIG9iamVjdCBpbnN0YW5jZQorICoKKyAqIEBwYXJhbSBvYmppbmZvIEEgcG9pbnRlciB0byBhIEJBTCBvYmplY3QKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICoKKyAqLworYmNtb3NfZXJybm8gYmNtYmFsX3N0YXRfZ2V0KGJjbWJhbF9zdGF0ICpvYmppbmZvKTsKKworLyoqCisgKiBAYnJpZWYgQkFMIFB1YmxpYyBBUEkgaW5kaWNhdGlvbiBzdWJzY3JpcHRpb24uCisgKgorICogU3Vic2NyaXB0aW9uIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGluZGljYXRpb25zCisgKgorICogQHBhcmFtIGNiX2NmZyAgQSBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZQorICogICAgICAgICAgICAgICAgb2JqZWN0IGluZGljYXRpb25zIGJlaW5nIHN1YnNjcmliZWQgdG8uCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqCisgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9zdWJzY3JpYmVfaW5kKGJjbWJhbF9jYl9jZmcgKmNiX2NmZyk7CisKKy8qKgorICogQGJyaWVmIEJBTCBQdWJsaWMgQVBJIGluZGljYXRpb24gdW4tc3Vic2NyaXB0aW9uLgorICoKKyAqIFVuLXN1YnNjcmlwdGlvbiBmdW5jdGlvbiBmb3IgdGhlIHNwZWNpZmllZCAob3IgYWxsKSBpbmRpY2F0aW9ucworICoKKyAqIEBwYXJhbSBjYl9jZmcgIEEgcG9pbnRlciB0byB0aGUgY2FsbGJhY2sgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUKKyAqICAgICAgICAgICAgICAgIG9iamVjdCBpbmRpY2F0aW9ucyBiZWluZyB1bi1zdWJzY3JpYmVkIGZyb20uCisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqCisgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF91bnN1YnNjcmliZV9pbmQoYmNtYmFsX2NiX2NmZyAqY2JfY2ZnKTsKKworLyoqCisgKiBAYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgTk5JIHBvcnRzIHN1cHBvcnRlZCBieSB0aGUgcnVubmluZyBzeXN0ZW0KKyAqCisgKiBAcmV0dXJucyBOdW1iZXIgb2YgTk5JIHBvcnRzCisgKi8KK3VpbnQxNl90IGJjbWJhbF9udW1fbm5pX3BvcnRzX2dldCh2b2lkKTsKKworLypAfSovCisKKyNlbmRpZiAvKiBCQ01CQUxfQVBJX0ggKi8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliYmFsYXBpL2JhbF9hcGlfd29ya2VyLmMgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaS9iYWxfYXBpX3dvcmtlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODA2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaS9iYWxfYXBpX3dvcmtlci5jCkBAIC0wLDAgKzEsNTEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfYXBpX3dvcmtlci5jCisgKiBAYnJpZWYgTWFpbiBwcm9jZXNzaW5nIGxvb3AgZm9yIHRoZSB3b3JrZXIgdGhyZWFkIHRoYXQgaGFuZGxlcyBJTkRpY2F0aW9ucworICogICAgICAgIHNlbnQgZnJvbSB0aGUgY29yZSB0byB0aGUgQkFMIHB1YmxpYyBBUEkgCisgKgorICovCisKKy8qCisgKiBXZSBuZWVkIGFjY2VzcyB0byB0aGUgQkFMIHN1YnN5c3RlbSBuYW1lcworICovCisjZGVmaW5lIEJBTF9TVUJTWVNURU1fU1RSX1JFUQorCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgPGJhbF9vYmpfbXNnX3BhY2tfdW5wYWNrLmg+CisjaW5jbHVkZSA8YmFsX29zbXNnLmg+CisjaW5jbHVkZSA8YmFsX2FwaS5oPgorI2luY2x1ZGUgImJhbF9hcGlfd29ya2VyLmgiCisjaWZkZWYgQkFMX01PTk9MSVRISUMKKyNpbmNsdWRlIDxiYWxfd29ya2VyLmg+CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfTE9HCisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNlbmRpZgorCisvKiBUaGlzIHJ4IHRocmVhZCBhbmQgd29ya2VyIHRocmVhZCBhcmUgdXNlZCB0byBwcm9jZXNzIGluZGljYXRpb25zIGZyb20gdGhlIGNvcmUKKyAqLworc3RhdGljIGJjbW9zX3Rhc2sgYXBpX2luZF9yeF90aHJlYWQ7CitzdGF0aWMgYmNtb3NfdGFzayBhcGlfaW5kX3dvcmtlcl90aHJlYWQ7CisKKy8qIExvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGludCBfYmFsX2lwY19hcGlfaW5kX3J4X2hhbmRsZXIobG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGJhbF9pcGNfYXBpX2luZGljYXRpb25faGFuZGxlcihiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm1zZyk7CisKKyAgCit0eXBlZGVmIHN0cnVjdCBpbmRpY2F0aW9uX3N1YnNjcmlwdGlvbl9pbnN0IGluZGljYXRpb25fc3Vic2NyaXB0aW9uX2luc3Q7CitzdHJ1Y3QgaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25faW5zdAoreworICAgIGJjbWJhbF9jYl9jZmcgY2JfY2ZnOworICAgIC8qKjwgVEFJTFEgbGluayBmb3IgbGlzdCBtYW5hZ2VtZW50ICovCisgICAgVEFJTFFfRU5UUlkoaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25faW5zdCkgaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25faW5zdF9uZXh0OworfTsKKworVEFJTFFfSEVBRChpbmRpY2F0aW9uX3N1YnNjcmlwdGlvbl9saXN0X2hlYWQsIGluZGljYXRpb25fc3Vic2NyaXB0aW9uX2luc3QpIGluZGljYXRpb25fc3Vic2NyaXB0aW9uX2xpc3Q7CisKKy8qCisgKiBUaGUgcXVldWUgdGhyb3VnaCB3aGljaCB0aGUgY29yZSBjb252ZXJzZXMgd2l0aCAKKyAqIHRoZSBiYWNrZW5kIG9mIHRoZSBQdWJsaWMgQVBJIGZvciBpbmRpY2F0aW9ucy4gCisgKi8KK3N0YXRpYyBiY21vc19tc2dfcXVldWUgYmFsX2FwaV9pbmRfYmFja2VuZF9xdWV1ZTsKK2JjbW9zX21zZ19xdWV1ZSAqcF9iYWxfYXBpX2luZF9xdWV1ZTsKKworLyogQ3JlYXRlIEFQSSBiYWNrZW5kIG1lc3NhZ2UgcXVldWUgKi8KK2JjbW9zX2Vycm5vIGJhbF9hcGlfaW5kX21zZ19xdWV1ZV9jcmVhdGUobWdtdF9xdWV1ZV9hZGRyX3BvcnRzICptZ210X3F1ZXVlX2luZm8pCit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gbXNnX3FfcCA9IHt9OworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogQ3JlYXRlIEJBTCBBUEkgaW5kaWNhdGlvbiByZWNlaXZlIHF1ZXVlIC0gdGhlIGNvcmUgc2VuZHMgSU5EIG1lc3NhZ2VzCisgICAgICAgICAqIHRvIHRoZSBCQUwgcHVibGljIEFQSSAgdXNpbmcgdGhpcyBxdWV1ZS4KKyAgICAgICAgICovCisgICAgICAgIG1zZ19xX3AubmFtZSA9ICJhcGlfaW5kX3J4X3EiOworCisgICAgICAgIGlmIChOVUxMICE9IG1nbXRfcXVldWVfaW5mby0+YmFsYXBpX21nbXRfaXBfcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgcG9ydG51bTsKKyAgICAgICAgICAgIGNoYXIgKnBfaW5kX3BvcnRudW1fc3RyOworICAgICAgICAgICAgY2hhciBiYWxhcGlfaW5kX3BvcnRfc3RyWzI1Nl07CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBtYWtlIGEgY29weSBvZiB0aGUgdXNlciBjaG9zZW4gYmFsIGFwaSBtZ210IHBvcnQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3RyY3B5KGJhbGFwaV9pbmRfcG9ydF9zdHIsIG1nbXRfcXVldWVfaW5mby0+YmFsYXBpX21nbXRfaXBfcG9ydCk7CisKKyAgICAgICAgICAgIC8qIEZpbmQgdGhlIHBvcnQgbnVtYmVyICovCisgICAgICAgICAgICBwX2luZF9wb3J0bnVtX3N0ciA9IHN0cmNocihiYWxhcGlfaW5kX3BvcnRfc3RyLCAnOicpICsgMTsKKworICAgICAgICAgICAgLyogY29udmVydCB0byBhbiBpbnRlZ2VyIGFuZCBpbmNyZW1lbnQgaXQgYnkgb25lICovCisgICAgICAgICAgICBwb3J0bnVtID0gYXRvaShwX2luZF9wb3J0bnVtX3N0cikgKyAxOworCisgICAgICAgICAgICAvKiBjcmVhdGUgdGhlIG5ldyBzdHJpbmcgZGVmaW5pbmcgdGhlIEJBTCBBUEkgaW5kaWNhdGlvbiBwb3J0ICovCisgICAgICAgICAgICBzcHJpbnRmKHBfaW5kX3BvcnRudW1fc3RyLCIlZCIsIHBvcnRudW0pOworCisgICAgICAgICAgICAvKiBTZXQgdXAgdGhlIEJBTCBBUEkgaW5kaWNhdGlvbiBJUDpwb3J0IGFjY2VzcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbXNnX3FfcC5sb2NhbF9lcF9hZGRyZXNzID0gYmFsYXBpX2luZF9wb3J0X3N0cjsKKyAgICAgICAgICAgIG1zZ19xX3AucmVtb3RlX2VwX2FkZHJlc3MgPSBOVUxMOworICAgICAgICAgICAgbXNnX3FfcC5lcF90eXBlID0gQkNNT1NfTVNHX1FVRVVFX0VQX1VEUF9TT0NLRVQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtc2dfcV9wLmVwX3R5cGUgPSBCQ01PU19NU0dfUVVFVUVfRVBfTE9DQUw7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBiY21vc19tc2dfcXVldWVfY3JlYXRlKCZiYWxfYXBpX2luZF9iYWNrZW5kX3F1ZXVlLCAmbXNnX3FfcCk7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3B1YmxpY19hcGksICJDb3VsZG4ndCBCQUwgQVBJIHJ4IGluZGljYXRpb24gcXVldWVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwX2JhbF9hcGlfaW5kX3F1ZXVlID0gJmJhbF9hcGlfaW5kX2JhY2tlbmRfcXVldWU7CisjaWZkZWYgQkFMX01PTk9MSVRISUMKKyAgICAgICAgaWYgKE5VTEwgPT0gbWdtdF9xdWV1ZV9pbmZvLT5iYWxhcGlfbWdtdF9pcF9wb3J0KQorICAgICAgICAgICAgcF9iYWxfY29yZV90b19hcGlfaW5kX3F1ZXVlID0gcF9iYWxfYXBpX2luZF9xdWV1ZTsKKyNlbmRpZgorICAgIH0gd2hpbGUgKDApOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogV29ya2VyIG1vZHVsZSBpbml0IGZ1bmN0aW9uLgorICogUmVnaXN0ZXIgZm9yIG1lc3NhZ2VzIHRoaXMgbW9kdWxlIGlzIGV4cGVjdGVkIHRvIHJlY2VpdmUKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iYWxfd29ya2VyX21vZHVsZV9iYWxfYXBpX2luaXQobG9uZyBkYXRhKQoreworICAgIGJjbW9zX3Rhc2tfcGFybSB0YXNrX3AgPSB7fTsKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworCisgICAgQlVHX09OKDAgPT0gZGF0YSk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogQ3JlYXRlIEJBTCBBUEkgaW5kaWNhdGlvbiBSWCB0aHJlYWQgKi8KKyAgICAgICAgdGFza19wLm5hbWUgPSAiaXBjX2FwaV9pbmRfcnhfdGhyZWFkIjsKKyAgICAgICAgdGFza19wLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9JUENfUlg7CisgICAgICAgIHRhc2tfcC5oYW5kbGVyID0gX2JhbF9pcGNfYXBpX2luZF9yeF9oYW5kbGVyOworICAgICAgICB0YXNrX3AuZGF0YSA9IChsb25nKSZiYWxfYXBpX2luZF9iYWNrZW5kX3F1ZXVlOworCisgICAgICAgIHJldCA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZhcGlfaW5kX3J4X3RocmVhZCwgJnRhc2tfcCk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9wdWJsaWNfYXBpLCAiQ291bGRuJ3QgY3JlYXRlIEJBTCBBUEkgaW5kaWNhdGlvbiBSWCB0aHJlYWRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWdpc3RlciB0aGUgbWVzc2FnZSB0eXBlcyB0byBiZSBoYW5kbGVkIGJ5IHRoZSBtZ210IG1vZHVsZQorICAgICAgICAgKi8KKyAgICAgICAgYmNtb3NfbXNnX3JlZ2lzdGVyKEJDTUJBTF9NR01UX0FQSV9JTkRfTVNHLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT1NfTU9EVUxFX0lEX1dPUktFUl9BUElfSU5ELCBiYWxfaXBjX2FwaV9pbmRpY2F0aW9uX2hhbmRsZXIpOworCisgICAgfQorICAgIHdoaWxlKDApOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfYmFsX2lwY19hcGlfaW5kX3J4X2hhbmRsZXIobG9uZyBkYXRhKQoreworICAgIGJjbW9zX21zZ19xdWV1ZSAqcnhxID0gKGJjbW9zX21zZ19xdWV1ZSAqKWRhdGE7CisgICAgYmNtb3NfdGFzayAqbXlfdGFzayA9IGJjbW9zX3Rhc2tfY3VycmVudCgpOworICAgIGJjbW9zX21zZyAqbXNnOworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgdm9pZCAqcGF5bG9hZDsKKworICAgIHdoaWxlICghbXlfdGFzay0+ZGVzdHJveV9yZXF1ZXN0KQorICAgIHsKKyAgICAgICAgcGF5bG9hZCA9IE5VTEw7CisgICAgICAgIHJldCA9IGJjbWJhbF9tc2dfcmVjdihyeHEsIEJDTU9TX1dBSVRfRk9SRVZFUiwgJnBheWxvYWQpOworICAgICAgICBpZiAocmV0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBVbmV4cGVjdGVkIGZhaWx1cmUgKi8KKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9wdWJsaWNfYXBpLCAiYmNtYmFsX21zZ19yZWN2KCkgLT4gJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBNZXNzYWdlIHJlY2VpdmVkICovCisgICAgICAgIEJDTV9MT0coREVCVUcsIGxvZ19pZF9wdWJsaWNfYXBpLCAiYmNtYmFsX21zZ19yZWN2KCVwKSAtPiAlc1xuIiwgcGF5bG9hZCwgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR290IGEgbWVzc2FnZSwgc28gbm93IGRpc3BhdGNoIGl0LiAgVGhpcyB3aWxsIHJlc3VsdCBpbiBvbmUKKyAgICAgICAgICogb2YgdGhlIG1vZHVsZXMgKHJlZ2lzdGVyZWQgZm9yIHRoZSBtZXNzYWdlIGJlaW5nIHByb2Nlc3NlZCkKKyAgICAgICAgICogZXhlY3V0aW5nIGl0cyBtZXNzYWdlIGNhbGxiYWNrIGhhbmRsZXIuCisgICAgICAgICAqLworICAgICAgICBtc2cgPSBiY21iYWxfYmNtb3NfaGRyX2dldChwYXlsb2FkKTsKKyAgICAgICAgcmV0ID0gYmNtb3NfbXNnX2Rpc3BhdGNoKG1zZywgQkNNT1NfTVNHX1NFTkRfQVVUT19GUkVFKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3B1YmxpY19hcGksIAorICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZGlzcGF0Y2ggbWVzc2FnZSAlZDolZFxuIiwgCisgICAgICAgICAgICAgICAgICAgIChpbnQpbXNnLT50eXBlLCAoaW50KW1zZy0+aW5zdGFuY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgbXlfdGFzay0+ZGVzdHJveWVkID0gQkNNT1NfVFJVRTsKKworICAgIHJldHVybiAoQkNNX0VSUl9PSyA9PSByZXQpID8gMCA6IC1FSU5WQUw7Cit9CisKKworLyogTWVzc2FnZSB3cmFwcGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gaW5kaWNhdGlvbiBpcyBkZWxpdmVyZWQgaW4gYXBwbGljYXRpb24gbW9kdWxlJ3MgY29udGV4dCAqLworc3RhdGljIHZvaWQgX2ludF9kZWxpdmVyX3dyYXBwZXJfY2IoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICptc2cpCit7CisgICAgdm9pZCAqbXNnX3BheWxvYWQgPSBiY21iYWxfcGF5bG9hZF9wdHJfZ2V0KGJjbWJhbF9iYWxfaGRyX2dldF9ieV9iY21vc19oZHIobXNnKSk7CisgICAgZl9iY21iYWxfaW5kX2hhbmRsZXIgaGFuZGxlciA9IChmX2JjbWJhbF9pbmRfaGFuZGxlciliY21iYWxfc2NyYXRjaHBhZF9nZXQobXNnX3BheWxvYWQpOworCisgICAgaGFuZGxlcigoYmNtYmFsX29iaiAqKW1zZ19wYXlsb2FkKTsKKyAgICBiY21iYWxfbXNnX2ZyZWUoKGJjbWJhbF9vYmogKiltc2dfcGF5bG9hZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbGlzdGVuZXJfY2FsbGJhY2tzKGJjbWJhbF9vYmogKm9iaikKK3sKKworICAgIGluZGljYXRpb25fc3Vic2NyaXB0aW9uX2luc3QgKmN1cnJlbnRfZW50cnksICpwX3RlbXBfZW50cnk7CisgICAgCisgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3B1YmxpY19hcGksICJpbnNwZWN0aW5nIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZm9yIG9iamVjdCAlZFxuIiwgCisgICAgICAgICAgICAgICAgICAgIG9iai0+b2JqX3R5cGUpOworCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksIAorICAgICAgICAgICAgICAgICAgICAgICAmaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25fbGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRpb25fc3Vic2NyaXB0aW9uX2luc3RfbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgcF90ZW1wX2VudHJ5KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgbG9nX2lkX3B1YmxpY19hcGksICJlbnRyeSBvYmp0eXBlICVkXG4iLCBjdXJyZW50X2VudHJ5LT5jYl9jZmcub2JqX3R5cGUpOworCisgICAgICAgIGlmKChCQ01CQUxfT0JKX0lEX0FOWSA9PSBjdXJyZW50X2VudHJ5LT5jYl9jZmcub2JqX3R5cGUpIHx8IAorICAgICAgICAgICAoY3VycmVudF9lbnRyeS0+Y2JfY2ZnLm9ial90eXBlID09IG9iai0+b2JqX3R5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfcHVibGljX2FwaSwgCisgICAgICAgICAgICAgICAgICAgICJDYWxsaW5nIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZm9yIG9iamVjdCAlZFxuIiwgCisgICAgICAgICAgICAgICAgICAgIG9iai0+b2JqX3R5cGUpOworCisgICAgICAgICAgICAvKiBjYWxsIHRoZSByZWdpc3RlcmVkIGZ1bmN0aW9uIGRpcmVjdGx5IG9yIGluIHRoZSB0YXJnZXQgbW9kdWxlJ3MgY29udGV4dCAqLworICAgICAgICAgICAgaWYgKEJDTU9TX01PRFVMRV9JRF9OT05FID09IGN1cnJlbnRfZW50cnktPmNiX2NmZy5tb2R1bGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VycmVudF9lbnRyeS0+Y2JfY2ZnLmluZF9jYl9oZGxyKG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtYmFsX29iaiAqY2xvbmUgPSBiY21iYWxfbXNnX2Nsb25lKG9iaik7CisgICAgICAgICAgICAgICAgYmNtb3NfZXJybm8gZXJyOworICAgICAgICAgICAgICAgIGlmIChOVUxMID09IGNsb25lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3B1YmxpY19hcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNsb25lIG1lc3NhZ2UgZm9yIG9iamVjdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmotPm9ial90eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJjbWJhbF9zY3JhdGNocGFkX3NldChjbG9uZSwgY3VycmVudF9lbnRyeS0+Y2JfY2ZnLmluZF9jYl9oZGxyKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBiY21iYWxfbXNnX2NhbGwoY2xvbmUsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZW50cnktPmNiX2NmZy5tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgIF9pbnRfZGVsaXZlcl93cmFwcGVyX2NiLAorICAgICAgICAgICAgICAgICAgICBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOworICAgICAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZF9wdWJsaWNfYXBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBkZWxpdmVyIG1lc3NhZ2UgZm9yIG9iamVjdCAlZCB0byBtb2R1bGUgJWQuIEVycm9yICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai0+b2JqX3R5cGUsIGN1cnJlbnRfZW50cnktPmNiX2NmZy5tb2R1bGUsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGhhbmRsZXIgZm9yIGluZGljYXRpb24gbWVzc2FnZXMgcmVjZWl2ZWQgYnkgdGhlIEJBTCBQdWJsaWMgQVBJCisgKiBiYWNrZW5kIGZyb20gdGhlIGNvcmUuICBXZSBuZWVkIHRvIHNlZSB3aG8gaGFzIHN1YnNjcmliZWQgZm9yIHRoZXNlIG1lc3NhZ2VzLAorICogYW5kIGNhbGwgdGhvc2UgcmVnaXN0ZXJlZCBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkIGJhbF9pcGNfYXBpX2luZGljYXRpb25faGFuZGxlcihiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm1zZykKK3sKKworICAgIHZvaWQgKm1zZ19wYXlsb2FkOworCisgICAgbXNnX3BheWxvYWQgPSBiY21iYWxfcGF5bG9hZF9wdHJfZ2V0KGJjbWJhbF9iYWxfaGRyX2dldF9ieV9iY21vc19oZHIobXNnKSk7CisKKyAgICAvKgorICAgICAqIFRPLURPIAorICAgICAqIHZhbGlkYXRlIHRoZSBtZXNzYWdlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIGlzIGNvcnJlY3QKKyAgICAgKi8KKworICAgIGRvCisgICAgeworICAgICAgICBpZihCQUxfU1VCU1lTVEVNX0NPUkUgIT0gYmNtYmFsX3NlbmRlcl9nZXQobXNnX3BheWxvYWQpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfcHVibGljX2FwaSwgIk1nbXQgSU5EIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB3cm9uZyBzdWJzeXN0ZW0gKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgc3Vic3lzdGVtX3N0cltiY21iYWxfc2VuZGVyX2dldChtc2dfcGF5bG9hZCldKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYoQkNNQkFMX01HTVRfQVBJX0lORF9NU0cgIT0gYmNtYmFsX3R5cGVfbWFqb3JfZ2V0KG1zZ19wYXlsb2FkKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3B1YmxpY19hcGksIk1nbXQgSU5EIG1lc3NhZ2UgcmVjZWl2ZWQgd2l0aCB3cm9uZyBtYWpvciB0eXBlICglZClcbiIsIAorICAgICAgICAgICAgICAgICAgICBiY21iYWxfdHlwZV9tYWpvcl9nZXQobXNnX3BheWxvYWQpKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAvKiBMb29rIHRocm91Z2ggdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBzdWJzY3JpYmVycyBmb3IgdGhpcyBpbmRpY2F0aW9uCisgICAgICAgICAqIGFuZCBjYWxsIHRoZW0uCisgICAgICAgICAqLworICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfcHVibGljX2FwaSwKKyAgICAgICAgICAgICAgICAiUHJvY2Vzc2luZyBpbmRpY2F0aW9uIGxpc3RlbmVyc1xuIik7CisKKyAgICAgICAgcHJvY2Vzc19saXN0ZW5lcl9jYWxsYmFja3MoKGJjbWJhbF9vYmogKiltc2dfcGF5bG9hZCk7CisKKyAgICB9CisgICAgd2hpbGUoMCk7CisKKyAgICBiY21iYWxfbXNnX2ZyZWUobXNnX3BheWxvYWQpOworCisgICAgcmV0dXJuOworfQorCit2b2lkIGVuYWJsZV9iYWxfYXBpX2luZGljYXRpb25zKGNvbnN0IGNoYXIgKmJhbGFwaV9tZ210X2lwX3BvcnQpCit7CisKKyAgICBiY21vc190YXNrX3Bhcm0gdGFza19wID0ge307CisgICAgYmNtb3NfbW9kdWxlX3Bhcm0gbW9kdWxlX3AgPSB7fTsKKyAgICBiY21vc19lcnJubyByZXQgPSBCQ01fRVJSX09LOworICAgIG1nbXRfcXVldWVfYWRkcl9wb3J0cyBtZ210X3F1ZXVlX2luZm87CisgICAgCisgICAgVEFJTFFfSU5JVCgmaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25fbGlzdCk7CisgCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIENyZWF0ZSBxdXVlcyBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIEJBTCBBUEkgYW5kIHRoZSBjb3JlICovCisgICAgICAgIG1nbXRfcXVldWVfaW5mby5iYWxhcGlfbWdtdF9pcF9wb3J0ID0gYmFsYXBpX21nbXRfaXBfcG9ydDsKKyAgICAgICAgcmV0ID0gYmFsX2FwaV9pbmRfbXNnX3F1ZXVlX2NyZWF0ZSgmbWdtdF9xdWV1ZV9pbmZvKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBsb2dfaWRfcHVibGljX2FwaSwgIkNvdWxkbid0IGNyZWF0ZSBCQUwgQVBJIGluZGljYXRpb24gcXVldWVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtb2R1bGVfcC5xcGFybS5uYW1lID0gImJhbF9hcGlfaW5kX3dvcmtlcl9tb2R1bGUiOworICAgICAgICBtb2R1bGVfcC5pbml0ID0gX2JhbF93b3JrZXJfbW9kdWxlX2JhbF9hcGlfaW5pdDsKKyAgICAgICAgbW9kdWxlX3AuZGF0YSA9IChsb25nKSZtZ210X3F1ZXVlX2luZm87IC8qIElQIGFkZHJlc3MgYW5kIHBvcnQgaW5mb3JtYXRpb24gKi8KKworICAgICAgICAvKiBDcmVhdGUgd29ya2VyIHRocmVhZCAmIG1vZHVsZXMgZm9yIEJBTCBpbmRpY2F0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIGNvcmUgKi8KKyAgICAgICAgdGFza19wLm5hbWUgPSAiYmFsX2FwaV9pbmRfd29ya2VyIjsKKyAgICAgICAgdGFza19wLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9XT1JLRVI7CisKKyAgICAgICAgcmV0ID0gYmNtb3NfdGFza19jcmVhdGUoJmFwaV9pbmRfd29ya2VyX3RocmVhZCwgJnRhc2tfcCk7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3B1YmxpY19hcGksICJDb3VsZG4ndCBjcmVhdGUgQkFMIEFQSSBpbmRpY2F0aW9uIHdvcmtlciB0aHJlYWRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBiY21vc19tb2R1bGVfY3JlYXRlKEJDTU9TX01PRFVMRV9JRF9XT1JLRVJfQVBJX0lORCwgJmFwaV9pbmRfd29ya2VyX3RocmVhZCwgJm1vZHVsZV9wKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkX3B1YmxpY19hcGksICJDb3VsZG4ndCBjcmVhdGUgQkFMIEFQSSBpbmRpY2F0aW9uIHdvcmtlciBtb2R1bGVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBCQ01fTE9HKERFQlVHLCBsb2dfaWRfcHVibGljX2FwaSwgIkJBTCBBUEkgaW5kaWNhdGlvbiBoYW5kbGVyIHJlZ2lzdGVyZWRcbiIpOworCisgICAgfQorICAgIHdoaWxlKDApOworCisgICAgcmV0dXJuOworfQorCisKKy8qKiBOT1RFOiB3aGVuIGNiX2NmZy0+b2JqX3R5cGUgaXMgQkNNQkFMX09CSl9JRF9BTlkgQU5EIHR5cGUgaXMgVU4tU1VCU0NSSUJFLCB0aGVuIHRoaXMgaXMgdW5zdWJzY3JpYmUgYWxsICovCitiY21vc19lcnJubyBfbWFuYWdlX2FwaV9pbmRfbGlzdGVuZXIoYmNtYmFsX2luZF9jYl9tYW5hZ2VtZW50X3R5cGUgdHlwZSwgYmNtYmFsX2NiX2NmZyAqY2JfY2ZnKQoreworICAgIAorICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisgICAgaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25faW5zdCAqbmV3X2luZF9lbnRyeTsKKyAgICBpbmRpY2F0aW9uX3N1YnNjcmlwdGlvbl9pbnN0ICpjdXJyZW50X2VudHJ5LCAqcF90ZW1wX2VudHJ5OworICAgIGJjbW9zX2Jvb2wgaXNfdW5zdWJzY3JpYmU7CisKKyAgICBCVUdfT04oTlVMTCA9PSBjYl9jZmcpOworICAgIEJVR19PTihOVUxMID09IGNiX2NmZy0+aW5kX2NiX2hkbHIpOworICAgIAorICAgIGlzX3Vuc3Vic2NyaWJlID0gKElORF9DQl9VTlNVQlNDUklCRSA9PSB0eXBlKTsKKworICAgIEJDTV9MT0coREVCVUcsbG9nX2lkX3B1YmxpY19hcGksIAorICAgICAgICAgICAgIiVzOiAlcyBmb3IgQkFMIEFQSSBpbmRpY2F0aW9uc1xuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIGlzX3Vuc3Vic2NyaWJlID8gIlVuc3Vic2NyaWJpbmciIDogIlN1YnNjcmliaW5nIik7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCBiX2ZvdW5kX2V4aXN0aW5nX2VudHJ5ID0gQkNNT1NfRkFMU0U7CisKKyAgICAgICAgVEFJTFFfRk9SRUFDSF9TQUZFKGN1cnJlbnRfZW50cnksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGljYXRpb25fc3Vic2NyaXB0aW9uX2xpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25faW5zdF9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90ZW1wX2VudHJ5KQorICAgICAgICB7CisgICAgICAgICAgICBpZigKKyAgICAgICAgICAgICAgICAoKGlzX3Vuc3Vic2NyaWJlICYmIChCQ01CQUxfT0JKX0lEX0FOWSA9PSBjYl9jZmctPm9ial90eXBlKSkgPyBCQ01PU19UUlVFIDoKKyAgICAgICAgICAgICAgICAgKGN1cnJlbnRfZW50cnktPmNiX2NmZy5vYmpfdHlwZSA9PSBjYl9jZmctPm9ial90eXBlKSkgJiYKKyAgICAgICAgICAgICAgICAoY3VycmVudF9lbnRyeS0+Y2JfY2ZnLmluZF9jYl9oZGxyID09IGNiX2NmZy0+aW5kX2NiX2hkbHIpICYmCisgICAgICAgICAgICAgICAgKGN1cnJlbnRfZW50cnktPmNiX2NmZy5tb2R1bGUgPT0gY2JfY2ZnLT5tb2R1bGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsbG9nX2lkX3B1YmxpY19hcGksIAorICAgICAgICAgICAgICAgICAgICAgICAgIkZvdW5kIGV4aXN0aW5nIHJlZ2lzdHJhdGlvblxuIik7CisKKyAgICAgICAgICAgICAgICBpZihpc191bnN1YnNjcmliZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsbG9nX2lkX3B1YmxpY19hcGksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZW1vdmluZyByZWdpc3RyYXRpb25cbiIpOworICAgICAgICAgICAgICAgICAgICBUQUlMUV9SRU1PVkUoJmluZGljYXRpb25fc3Vic2NyaXB0aW9uX2xpc3QsIGN1cnJlbnRfZW50cnksIGluZGljYXRpb25fc3Vic2NyaXB0aW9uX2luc3RfbmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX2ZyZWUoY3VycmVudF9lbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBiX2ZvdW5kX2V4aXN0aW5nX2VudHJ5ID0gQkNNT1NfVFJVRTsKKworICAgICAgICAgICAgICAgIC8qIERvbid0IHN0b3AgbG9va2luZyBmb3IgbWF0Y2hlcyBpZiB3ZSBhcmUgdW5zdWJzY3JpYmluZyBmcm9tIEFOWSBpbmRpY2F0aW9ucywgdGhlcmUgY291bGQgYmUgbWFueQorICAgICAgICAgICAgICAgICAqIGFzc2lnbmVkIHRvIGEgc2luZ2xlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICAgaWYoIShpc191bnN1YnNjcmliZSAmJiAoQkNNQkFMX09CSl9JRF9BTlkgPT0gY2JfY2ZnLT5vYmpfdHlwZSkpKSBicmVhazsKKyAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB3ZSBhcmUgc3Vic2NyaWJpbmcgdG8gaW5kaWNhdGlvbiBhbmQgd2UgaGF2ZSBhbHJlYWR5IHJlY29yZGVkCisgICAgICAgICAqIHRoaXMgc3Vic2NyaXB0aW9uLCBPUiB3ZSBhcmUgdW4tc3Vic2NyaWJpbmcgKHdoZXRoZXIgb3Igbm90IHdlCisgICAgICAgICAqIGZvdW5kIGEgc3Vic2NyaXB0aW9uIHRvIHJlbW92ZSksIHRoZW4gcmV0dXJuIHJpZ2h0IGF3YXkgd2l0aCBPSworICAgICAgICAgKi8KKyAgICAgICAgaWYoKEJDTU9TX1RSVUUgPT0gYl9mb3VuZF9leGlzdGluZ19lbnRyeSkgfHwgaXNfdW5zdWJzY3JpYmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgCisgICAgICAgIEJDTV9MT0coREVCVUcsbG9nX2lkX3B1YmxpY19hcGksIAorICAgICAgICAgICAgICAgICJSZWdpc3RlcmluZyBORVcgc3Vic2NyaWJlciBmb3IgQkFMIEFQSSBpbmRpY2F0aW9uc1xuIik7CisKKyAgICAgICAgLyogVGhpcyBpcyBhIG5ldyBzdWJzY3JpcHRpb24gKi8KKyAgICAgICAgbmV3X2luZF9lbnRyeSA9IGJjbW9zX2NhbGxvYyhzaXplb2YoaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25faW5zdCkpOworCisgICAgICAgIGlmIChOVUxMID09IG5ld19pbmRfZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRkFUQUwsIGxvZ19pZF9wdWJsaWNfYXBpLCAgCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVnaXN0ZXIgYXBpIGluZGljYXRpb24gc3Vic2NyaXB0aW9uXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbmV3X2luZF9lbnRyeS0+Y2JfY2ZnID0gKmNiX2NmZzsKKworICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25fbGlzdCwgbmV3X2luZF9lbnRyeSwgaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25faW5zdF9uZXh0KTsKKworICAgIH0gd2hpbGUoMCk7CisKKyAgICByZXR1cm4gcmV0OworIAorfQorCitzdGF0aWMgdm9pZCBmcmVlX2FsbF9pbmRpY2F0aW9uX3N1YnNjcmlwdGlvbnModm9pZCkKK3sKKyAgICBpbmRpY2F0aW9uX3N1YnNjcmlwdGlvbl9pbnN0ICpjdXJyZW50X2VudHJ5LCAqcF90ZW1wX2VudHJ5OworICAgIAorICAgIFRBSUxRX0ZPUkVBQ0hfU0FGRShjdXJyZW50X2VudHJ5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgJmluZGljYXRpb25fc3Vic2NyaXB0aW9uX2xpc3QsIAorICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0aW9uX3N1YnNjcmlwdGlvbl9pbnN0X25leHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBfdGVtcF9lbnRyeSkKKyAgICB7CisgICAgICAgIFRBSUxRX1JFTU9WRSgmaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25fbGlzdCwgY3VycmVudF9lbnRyeSwgaW5kaWNhdGlvbl9zdWJzY3JpcHRpb25faW5zdF9uZXh0KTsKKyAgICAgICAgYmNtb3NfZnJlZShjdXJyZW50X2VudHJ5KTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKwordm9pZCBiYWxfYXBpX2luZGljYXRpb25zX2ZpbmlzaCh2b2lkKQoreworICAgIGZyZWVfYWxsX2luZGljYXRpb25fc3Vic2NyaXB0aW9ucygpOworCisgICAgYmNtb3NfbXNnX3VucmVnaXN0ZXIoQkNNQkFMX01HTVRfQVBJX0lORF9NU0csIAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9TX01PRFVMRV9JRF9XT1JLRVJfQVBJX0lORCk7CisKKyAgICBiY21vc19tc2dfcXVldWVfZGVzdHJveSgmYmFsX2FwaV9pbmRfYmFja2VuZF9xdWV1ZSk7CisKKyAgICBiY21vc19tb2R1bGVfZGVzdHJveShCQ01PU19NT0RVTEVfSURfV09SS0VSX0FQSV9JTkQpOworCisgICAgYmNtb3NfdGFza19kZXN0cm95KCZhcGlfaW5kX3J4X3RocmVhZCk7CisKKyAgICBiY21vc190YXNrX2Rlc3Ryb3koJmFwaV9pbmRfd29ya2VyX3RocmVhZCk7CisKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaS9iYWxfYXBpX3dvcmtlci5oIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGkvYmFsX2FwaV93b3JrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTI1OGNhCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGkvYmFsX2FwaV93b3JrZXIuaApAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqCisgKiBAZmlsZSBiYWxfd29ya2VyLmgKKyAqIAorICogQGJyaWVmIEJhbCB3b3JrZXIgdGhyZWFkIGluY2x1ZGVkCisgKiAKKyAqIE1vZHVsZSBjb250YWlucyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgdXNlZCB0byBzdXBwb3J0IHRoZSAKKyAqIEJBTCBjb3JlIHdvcmtlciB0aHJlYWQuCisgKi8KKworI2lmbmRlZglCQUxfQVBJX1dPUktFUl9ICisjZGVmaW5lCUJBTF9BUElfV09SS0VSX0gKKworI2luY2x1ZGUgPGJjbW9zX2Vycm5vLmg+CisKK2V4dGVybiBiY21vc19tc2dfcXVldWUgKnBfYmFsYXBpX3RvX2NvcmVfcXVldWU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgSU5EX0NCX1NVQlNDUklCRSwKKyAgICBJTkRfQ0JfVU5TVUJTQ1JJQkUKK31iY21iYWxfaW5kX2NiX21hbmFnZW1lbnRfdHlwZTsKKworLyoKKyAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucworICovCitleHRlcm4gYmNtb3NfZXJybm8gYmFsX2FwaV9pbmRfbXNnX3F1ZXVlX2NyZWF0ZShtZ210X3F1ZXVlX2FkZHJfcG9ydHMgKm1nbXRfcXVldWVfaW5mbyk7CitleHRlcm4gdm9pZCBlbmFibGVfYmFsX2FwaV9pbmRpY2F0aW9ucyhjb25zdCBjaGFyICpiYWxhcGlfbWdtdF9pcF9wb3J0KTsKK2V4dGVybiBiY21vc19lcnJubyBfbWFuYWdlX2FwaV9pbmRfbGlzdGVuZXIoYmNtYmFsX2luZF9jYl9tYW5hZ2VtZW50X3R5cGUgdHlwZSwgYmNtYmFsX2NiX2NmZyAqY2JfY2ZnKTsKK2V4dGVybiB2b2lkIGJhbF9hcGlfaW5kaWNhdGlvbnNfZmluaXNoKHZvaWQpOworCisKKyNlbmRpZiAvKiBCQUxfQVBJX1dPUktFUl9IICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaWNsaS9NYWtlZmlsZSBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliYmFsYXBpY2xpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YjdiYWMKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaWNsaS9NYWtlZmlsZQpAQCAtMCwwICsxLDM3IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyMgIAorIyAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisjICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisjICAKKyMgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyMgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyMgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorIyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisjICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorIyAgCisjICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisjICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyMgICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyMgICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyMgICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorIyAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworIyAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyMgICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyMgIAorIyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisjICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyMgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisjICB3cml0dGVuIGNvbnNlbnQuCisjICAKKyMgIDo+CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitNT0RfTkFNRSA9IGJhbF9hcGlfY2xpCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSBjbGkgYmFsX2FwaQorTU9EX0lOQ19ESVJTID0gJChTUkNfRElSKSAkKE9VVF9ESVIpCisKK3NyY3MgPSBiYWxfYXBpX2NsaS5jIGJhbF9hcGlfY2xpX2R1bXAuYyAKK2dlbl9iYWxfc3JjcyA9IGJhbF9hcGlfY2xpX2hlbHBlcnMuYyBiYWxfYXBpX2NsaV9oYW5kbGVycy5jCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaWNsaS9iYWxfYXBpX2NsaS5jIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmJlOTczCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGkuYwpAQCAtMCwwICsxLDEwNTkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiYWxfYXBpLmg+CisjaW5jbHVkZSAiYmFsX2FwaV9jbGkuaCIKKyNpbmNsdWRlICJiYWxfYXBpX2NsaV9oZWxwZXJzLmgiCisjaW5jbHVkZSAiYmFsX2FwaV9jbGlfaGFuZGxlcnMuaCIKKworI2RlZmluZSBCQ01CQUxfQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChwLCB0eXBlKSAgICAgICAodHlwZSkoKGxvbmcpKHApKQorCisvKiBib29sIGVudW0gdGFibGUgKi8KK3N0YXRpYyBiY21jbGlfZW51bV92YWwgYm9vbF9lbnVtW10gPQoreworICAgIHsgLm5hbWUgPSAieWVzIiwgLnZhbCA9IDEgfSwKKyAgICB7IC5uYW1lID0gIm5vIiwgLnZhbCA9IDAgfSwKKyAgICBCQ01DTElfRU5VTV9MQVNUCit9OworCitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIGJvb2xfdHlwZV9kZXNjciA9IHsKKyAgICAubmFtZSA9ICJib29sIiwKKyAgICAuZGVzY3IgPSAiQm9vbGVhbiIsCisgICAgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sCisgICAgLnNpemUgPSBzaXplb2YoYmNtb3NfYm9vbCksCisgICAgLnggPSB7LmUgPSBib29sX2VudW19Cit9OworCisvKiBwYXJhbWV0ZXIgZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKnByb3A7ICAgICAgLyogcHJvcGVydHkgKi8KKyAgICBjb25zdCBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyICpmaWVsZDsgICAgLyogZmllbGQgb3IgTlVMTCAqLworICAgIGNvbnN0IGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgKmFycmF5X2ZkOyAvKiBhcnJheSBmaWVsZCBkZXNjcmlwdG9yIG9yIE5VTEwgKi8KKyAgICB1aW50MTZfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb3BlcnR5ICovCisgICAgdWludDE2X3QgYXJyYXlfZmRfb2Zmc2V0OyAgICAgICAgICAgICAgICAvKiBvZmZzZXQgb2YgYXJyYXlfZmQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9wZXJ0eSAqLworICAgIGJjbWJhbF9tZ3RfZ3JvdXAgZ3JvdXA7ICAgICAgICAgICAgICAgICAgLyogbWFuYWdlbWVudCBncm91cCAqLworfSBiY21iYWxfYXBpY2xpX3Bhcm1fZGF0YTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNQkFMX0FQSUNMSV9GTEFHU19OT05FID0gMCwKKyAgICBCQ01CQUxfQVBJQ0xJX0ZMQUdTX0lHTk9SRV9GSUVMRFMgPSAxIDw8IDAKK30gYmNtYmFsX2FwaWNsaV9mbGFnczsKKworLyogQ3VycmVudCBzZXNzaW9uICovCitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gKmN1cnJlbnRfc2Vzc2lvbjsKKworLyoKKyAqIGhlbHBlcnMKKyAqLworCisvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0eXBlICovCitzdGF0aWMgdWludDMyX3QgYmNtYmFsX2FwaWNsaV9nZXRfbnVtX2ZpZWxkc19pbl90eXBlKGNvbnN0IGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciAqdGQpCit7CisgICAgdWludDE2X3QgZjsKKyAgICB1aW50MzJfdCBuZiA9IDA7CisKKworICAgIHN3aXRjaCAodGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfU1RSVUNUOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXRkLT54LnMubnVtX2ZpZWxkcykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIEJVR19PTighdGQtPngucy5maWVsZHMpOworICAgICAgICAgICAgZm9yIChmID0gMDsgZiA8IHRkLT54LnMubnVtX2ZpZWxkczsgZisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5mICs9ICBiY21iYWxfYXBpY2xpX2dldF9udW1fZmllbGRzX2luX3R5cGUodGQtPngucy5maWVsZHNbZl0udHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfVU5JT046CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVuaW9uLiBDb3VudCBvbmx5IGNvbW1vbiBmaWVsZHMgKi8KKyAgICAgICAgICAgIG5mID0gdGQtPngudS5udW1fY29tbW9uX2ZpZWxkczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG5mID0gYmNtYmFsX2FwaWNsaV9nZXRfbnVtX2ZpZWxkc19pbl90eXBlKHRkLT54LmFycl9maXhlZC5lbGVtX3R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0FSUl9EWU46CisgICAgICAgIHsKKyAgICAgICAgICAgIG5mID0gYmNtYmFsX2FwaWNsaV9nZXRfbnVtX2ZpZWxkc19pbl90eXBlKHRkLT54LmFycl9keW4uZWxlbV90eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgbmYgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmY7Cit9CisKKy8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgcHJvcGVydHkgZmllbGRzIGZvciBnaXZlbiBvYmplY3QrZ3JvdXArc3ViZ3JvdXArYWNjZXNzLiBzaW1wbGUgcHJvcGVydHk9c2luZ2xlIGZpZWxkICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2FwaWNsaV9nZXRfbnVtX2ZpZWxkc19pbl9ncm91cChiY21iYWxfb2JqX2lkIG8sIGJjbWJhbF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLAorICAgIGJjbWJhbF9hcGljbGlfcHJvcF9hY2Nlc3NfaWQgYWNjZXNzX2xldmVsLCB1aW50MzJfdCAqbmZpZWxkcykKK3sKKyAgICB1aW50MzJfdCBuZiA9IDA7CisgICAgaW50IGk7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgZm9yIChpID0gMDsgcmMgIT0gQkNNX0VSUl9SQU5HRTsgaSsrKQorICAgIHsKKyAgICAgICAgY29uc3QgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICpwZDsKKyAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX29iamVjdF9wcm9wZXJ0eShvLCBncm91cCwgc3ViZ3JvdXAsIGksICZwZCk7CisgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LICYmIChwZC0+YWNjZXNzICYgYWNjZXNzX2xldmVsKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIG51bWJlciBvZiBmaWVsZHMgaWYgd3JpdGUgYWNjZXNzLiBDb3VudCBvbmx5IHByb3BlcnRpZXMgZm9yIHJlYWQgYWNjZXNzICovCisgICAgICAgICAgICBpZiAoKGFjY2Vzc19sZXZlbCAmIEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfVykgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCVUdfT04oIXBkLT50eXBlKTsKKyAgICAgICAgICAgICAgICBuZiArPSBiY21iYWxfYXBpY2xpX2dldF9udW1fZmllbGRzX2luX3R5cGUocGQtPnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrbmY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgKm5maWVsZHMgPSBuZjsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKgorICogQ29tbWFuZCBoYW5kbGVycworICovCisKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX29iamVjdHNfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGludCByYzsKKyAgICBiY21iYWxfb2JqX2lkIG87CisgICAgY29uc3QgY2hhciAqbmFtZSwgKmRlc2NyOworCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJTeXN0ZW0gT2JqZWN0IFR5cGVzOlxuIik7CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiSWQgICBOYW1lICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uXG4iKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgZm9yIChvID0gMDsgbyA8IEJDTUJBTF9PQkpfSURfX05VTV9PRjsgbysrKQorICAgIHsKKyAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX29iamVjdF9uYW1lKG8sICZuYW1lLCAmZGVzY3IpOworICAgICAgICBpZiAoIXJjKQorICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLjRkICUtMjJzICVzXG4iLCBvLCBuYW1lLCBkZXNjcik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX3NldF9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbWJhbF9hcGljbGlfY2FsbChCQ01CQUxfTUdUX0dST1VQX0NGRywgQkNNQkFMX09CSl9NU0dfVFlQRV9TRVQsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2FwaWNsaV9nZXRfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21iYWxfYXBpY2xpX2NhbGwoQkNNQkFMX01HVF9HUk9VUF9DRkcsIEJDTUJBTF9PQkpfTVNHX1RZUEVfR0VULCBzZXNzaW9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfY2xlYXJfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21iYWxfYXBpY2xpX2NhbGwoQkNNQkFMX01HVF9HUk9VUF9DRkcsIEJDTUJBTF9PQkpfTVNHX1RZUEVfQ0xFQVIsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2FwaWNsaV9zdGF0X2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtYmFsX2FwaWNsaV9jYWxsKEJDTUJBTF9NR1RfR1JPVVBfU1RBVCwgQkNNQkFMX09CSl9NU0dfVFlQRV9HRVQsIHNlc3Npb24pOworfQorCisvKgorICogSW5pdC10aW1lIGhlbHBlcnMKKyAqLworCisvKiBtYXAgdG8gQ0xJIHR5cGUgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX21hcF90eXBlKAorICAgIGNvbnN0IGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciAqdGQsCisgICAgY29uc3QgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyICphcnJheV90ZCwKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNtZF9wYXJtKQoreworICAgIGJjbWJhbF9hcGljbGlfcGFybV9kYXRhICpwYXJtX2RhdGEgPSBjbWRfcGFybS0+dXNlcl9kYXRhOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE1hcCB0eXBlICovCisgICAgc3dpdGNoKHRkLT5iYXNlX3R5cGUpCisgICAgeworICAgIGNhc2UgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfU05VTToKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9OVU1CRVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfVU5VTToKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9VTlVNQkVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOVU1fSEVYOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0hFWDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9CT09MOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0VOVU07CisgICAgICAgIGNtZF9wYXJtLT5lbnVtX3RhYmxlID0gYm9vbF9lbnVtOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0ZMT0FUOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IHRkLT5zaXplID09IHNpemVvZihkb3VibGUpID8gQkNNQ0xJX1BBUk1fRE9VQkxFIDogQkNNQ0xJX1BBUk1fRkxPQVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfU1RSSU5HOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX1NUUklORzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9JUFY0OgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0lQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX01BQzoKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9NQUM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTToKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9FTlVNOworICAgICAgICBjbWRfcGFybS0+ZW51bV90YWJsZSA9IHRkLT54LmU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTV9NQVNLOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0VOVU1fTUFTSzsKKyAgICAgICAgY21kX3Bhcm0tPmVudW1fdGFibGUgPSB0ZC0+eC5lOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBiY21jbGlfcHJpbnQoY3VycmVudF9zZXNzaW9uLCAiKioqIGNhbid0IG1hcCB0eXBlICVzICglZClcbiIsIHRkLT5uYW1lLCAoaW50KXRkLT5iYXNlX3R5cGUpOworICAgICAgICByYyA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogTWFwIHVpbnQ4X3QgYXJyYXkgdG8gYnVmZmVyIGlmIGl0IGlzIGluZGVwZW5kZW50IChub3Qgc3RydWN0dXJlIGZpZWxkKSAqLworICAgIGlmIChhcnJheV90ZCAmJgorICAgICAgICB0ZC0+c2l6ZSA9PSAxICYmCisgICAgICAgICh0ZC0+YmFzZV90eXBlID09IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOVU0gfHwgdGQtPmJhc2VfdHlwZSA9PSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9VTlVNX0hFWCkgJiYKKyAgICAgICAgKHBhcm1fZGF0YS0+YXJyYXlfZmQgPT0gcGFybV9kYXRhLT5maWVsZCB8fCAhcGFybV9kYXRhLT5maWVsZCkpCisgICAgeworICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0JVRkZFUjsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgbmFtZSBhbmQgZGVzY3JpcHRpb24gYW5kIGNvcHkgdG8gdG8gcGFybSAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfY29weV9wYXJtX25hbWUoYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZXNjcikKK3sKKyAgICBwYXJtLT5uYW1lID0gYmNtb3NfYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7CisgICAgcGFybS0+ZGVzY3JpcHRpb24gPSBiY21vc19hbGxvYyhzdHJsZW4oZGVzY3IpICsgMSk7CisgICAgaWYgKChwYXJtLT5uYW1lID09IE5VTEwpIHx8IChwYXJtLT5kZXNjcmlwdGlvbiA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIC8qIFN1Y2Nlc3NmdWwgYWxsb2NhdGlvbiBpZiBhbnkgd2lsbCBiZSByZWxlYXNlZCBieSBjb21tb24gY2xlYW51cAorICAgICAgICAgKiBhbG9uZyB3aXRoIHRoZSByZXN0IG9mIGR5bmFtaWMgcGFyYW1ldGVyIGZpZWxkcyAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgc3RyY3B5KEJDTUJBTF9BUElDTElfQ0FTVF9ESVNDQVJEX0NPTlNUKHBhcm0tPm5hbWUsIHZvaWQgKiksIG5hbWUpOworICAgIHN0cmNweShCQ01CQUxfQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChwYXJtLT5kZXNjcmlwdGlvbiwgdm9pZCAqKSwgZGVzY3IpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBwb3B1bGF0ZSBzaW5nbGUgcGFyYW1ldGVyICovCitzdGF0aWMgaW50IGJjbWJhbF9hcGljbGlfcG9wdWxhdGVfcGFybTEoCisgICAgY29uc3QgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICpwZCwKKyAgICBjb25zdCBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyICpmZCwKKyAgICBjb25zdCBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIGNvbnN0IGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgKmFycmF5X2ZkLAorICAgIHVpbnQzMl90IG9mZnNldCwKKyAgICB1aW50MzJfdCBhcnJheV9mZF9vZmZzZXQsCisgICAgYmNtY2xpX2NtZF9wYXJtICpjbWRfcGFybSwKKyAgICB1aW50MzJfdCBjbWRfZmxhZ3MsCisgICAgY2hhciAqbmFtZSwKKyAgICBjaGFyICpoZWxwKQoreworICAgIGJjbWJhbF9hcGljbGlfcGFybV9kYXRhICpwYXJtX2RhdGEgPSBjbWRfcGFybS0+dXNlcl9kYXRhOworICAgIGludCByYzsKKworICAgIHBhcm1fZGF0YS0+cHJvcCA9IHBkOworICAgIHBhcm1fZGF0YS0+ZmllbGQgPSBmZDsKKyAgICBwYXJtX2RhdGEtPm9mZnNldCA9IG9mZnNldDsKKyAgICBwYXJtX2RhdGEtPmFycmF5X2ZkID0gYXJyYXlfZmQ7CisgICAgcGFybV9kYXRhLT5hcnJheV9mZF9vZmZzZXQgPSBhcnJheV9mZF9vZmZzZXQ7CisKKyAgICByYyA9IGJjbWJhbF9hcGljbGlfY29weV9wYXJtX25hbWUoY21kX3Bhcm0sIG5hbWUsIGhlbHApOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgY21kX3Bhcm0tPmZsYWdzID0gY21kX2ZsYWdzOworICAgIGlmICh0ZC0+bWluX3ZhbCAhPSB0ZC0+bWF4X3ZhbCB8fCB0ZC0+bWluX3ZhbCkKKyAgICB7CisgICAgICAgIGNtZF9wYXJtLT5mbGFncyB8PSBCQ01DTElfUEFSTV9GTEFHX1JBTkdFOworICAgICAgICBjbWRfcGFybS0+bG93X3ZhbCA9IHRkLT5taW5fdmFsOworICAgICAgICBjbWRfcGFybS0+aGlfdmFsID0gdGQtPm1heF92YWw7CisgICAgfQorICAgIHJjID0gYmNtYmFsX2FwaWNsaV9tYXBfdHlwZSh0ZCwgYXJyYXlfZmQgPyBhcnJheV9mZC0+dHlwZSA6IE5VTEwsIGNtZF9wYXJtKTsKKyAgICBpZiAocmMgPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8qIEFycmF5cyByZXF1aXJlIG1vcmUgd29yay4KKyAgICAgKiAtIENhbGN1bGF0ZSBzaXplLiBLbm93biBmb3IgZml4ZWQgYXJyYXlzLCBoYXJkLWNvZGVkIG1heCBmb3IgZHluYW1pYworICAgICAqIC0gQWxsb2NhdGUgZWl0aGVyIGJ1ZmZlciBvciBhcnJheSBvZiB2YWx1ZXMgYmFzZWQgb24gQ0xJIHBhcmFtZXRlciB0eXBlCisgICAgICogLSBDYWxjdWxhdGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSBlbnRyeQorICAgICAqLworICAgIGlmIChhcnJheV9mZCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGFycmF5X3NpemU7CisKKyAgICAgICAgaWYgKGFycmF5X2ZkLT50eXBlLT5iYXNlX3R5cGUgPT0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfQVJSX0ZJWEVEKQorICAgICAgICB7CisgICAgICAgICAgICBhcnJheV9zaXplID0gYXJyYXlfZmQtPnR5cGUtPnguYXJyX2ZpeGVkLnNpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcnJheV9zaXplID0gYXJyYXlfZmQtPnR5cGUtPnguYXJyX2R5bi5tYXhfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFycmF5X3NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChjdXJyZW50X3Nlc3Npb24sICIqKiogRXJyb3IgaW4gJXMgYXJyYXkgZGVzY3JpcHRvci4gU2l6ZSBpcyBub3Qgc2V0LlxuIiwgYXJyYXlfZmQtPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtZF9wYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX0JVRkZFUikKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBiY21iYWxfYnVmX2FsbG9jKCZjbWRfcGFybS0+dmFsdWUuYnVmZmVyLCBhcnJheV9zaXplKTsKKyAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjbWRfcGFybS0+dmFsdWVzID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfcGFybV92YWx1ZSkgKiBhcnJheV9zaXplKTsKKyAgICAgICAgICAgIGlmICghY21kX3Bhcm0tPnZhbHVlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtZF9wYXJtLT5tYXhfYXJyYXlfc2l6ZSA9IGFycmF5X3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworCisvKiBwb3B1bGF0ZSBuYW1lIGJ1ZiBhbmQgaGVscCBidWYgKi8KK3N0YXRpYyB2b2lkIGJjbWJhbF9hcGljbGlfcG9wdWxhdGVfbmFtZV9oZWxwKGNvbnN0IGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgKmZsZCwgY2hhciAqbmFtZV9idWYwLCBjaGFyICpoZWxwX2J1ZjAsCisgICAgY2hhciAqbmFtZV9idWYsIGNoYXIgKmhlbHBfYnVmKQoreworICAgIG5hbWVfYnVmWzBdID0gMDsKKyAgICBoZWxwX2J1ZlswXSA9IDA7CisgICAgYmNtY2xpX3N0cm5jcHkobmFtZV9idWYsIG5hbWVfYnVmMCwgQkNNQkFMX0FQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSCk7CisgICAgaWYgKHN0cmxlbihuYW1lX2J1ZikpCisgICAgICAgIGJjbWNsaV9zdHJuY2F0KG5hbWVfYnVmLCAiLiIsIEJDTUJBTF9BUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEgpOworICAgIGJjbWNsaV9zdHJuY2F0KG5hbWVfYnVmLCBmbGQtPmNsaV9uYW1lID8gZmxkLT5jbGlfbmFtZSA6IGZsZC0+bmFtZSwgQkNNQkFMX0FQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSCk7CisgICAgYmNtY2xpX3N0cm5jcHkoaGVscF9idWYsIGhlbHBfYnVmMCwgQkNNQkFMX0FQSUNMSV9NQVhfUEFSTV9IRUxQX0xFTkdUSCk7CisgICAgYmNtY2xpX3N0cm5jYXQoaGVscF9idWYsICIgLSAiLCBCQ01CQUxfQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIKTsKKyAgICBiY21jbGlfc3RybmNhdChoZWxwX2J1ZiwgZmxkLT5kZXNjciA/IGZsZC0+ZGVzY3IgOiBmbGQtPm5hbWUsIEJDTUJBTF9BUElDTElfTUFYX1BBUk1fSEVMUF9MRU5HVEgpOworfQorCisvKiBBbGxvY2F0ZSBDTEkgcGFyYW1ldGVyIGFycmF5LiBTZXQgdXAgcGFybS0+ZGF0YSAqLworc3RhdGljIGJjbWNsaV9jbWRfcGFybSAqYmNtYmFsX2FwaWNsaV9wYXJtX2FsbG9jKGludCBucGFybXMpCit7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm1zOworICAgIGJjbWJhbF9hcGljbGlfcGFybV9kYXRhICpwYXJtX2RhdGE7CisgICAgaW50IGk7CisKKyAgICAvKiBBbGxvY2F0ZSBwYXJhbWV0ZXIgdGFibGUgYW5kIHBvcHVsYXRlIGl0ICovCisgICAgc2l6ZSA9IChzaXplb2YoYmNtY2xpX2NtZF9wYXJtKSArIHNpemVvZihiY21iYWxfYXBpY2xpX3Bhcm1fZGF0YSkpICogKG5wYXJtcyArIDEpOworICAgIHBhcm1zID0gYmNtb3NfY2FsbG9jKHNpemUpOworICAgIGlmICghcGFybXMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogQXNzb2NpYXRlIHBhcmFtZXRlcl9kYXRhIHN0cnVjdHMgd2l0aCBwYXJhbWV0ZXJzICovCisgICAgcGFybV9kYXRhID0gKGJjbWJhbF9hcGljbGlfcGFybV9kYXRhICopKHBhcm1zICsgbnBhcm1zICsgMSk7CisgICAgZm9yIChpID0gMDsgaSA8IG5wYXJtczsgaSsrKQorICAgIHsKKyAgICAgICAgcGFybXNbaV0udXNlcl9kYXRhID0gJnBhcm1fZGF0YVtpXTsKKyAgICB9CisgICAgcmV0dXJuIHBhcm1zOworfQorCisvKiBjbG9uZSBlbnVtIHRhYmxlICovCitzdGF0aWMgYmNtY2xpX2VudW1fdmFsICpiY21iYWxfYXBpY2xpX2Nsb25lX2VudW1fdGFibGUoYmNtY2xpX2NtZF9wYXJtICpwYXJtKQoreworICAgIGJjbWNsaV9lbnVtX3ZhbCAqb3JnX3RhYmxlID0gcGFybS0+ZW51bV90YWJsZTsKKyAgICBiY21jbGlfZW51bV92YWwgKnZhbCA9IG9yZ190YWJsZTsKKyAgICBiY21jbGlfZW51bV92YWwgKmNsb25lX3RhYmxlID0gb3JnX3RhYmxlOworICAgIGludCBpLCBuOworCisgICAgQlVHX09OKHBhcm0tPnR5cGUgIT0gQkNNQ0xJX1BBUk1fRU5VTSk7CisgICAgd2hpbGUgKHZhbCAmJiB2YWwtPm5hbWUpCisgICAgeworICAgICAgICArK3ZhbDsKKyAgICB9CisgICAgbiA9IHZhbCAtIG9yZ190YWJsZTsKKworICAgIGNsb25lX3RhYmxlID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfZW51bV92YWwpICogKG4gKyAxKSk7CisgICAgaWYgKCFjbG9uZV90YWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKyAgICAgICAgY2xvbmVfdGFibGVbaV0ubmFtZSA9IG9yZ190YWJsZVtpXS5uYW1lOworICAgICAgICBjbG9uZV90YWJsZVtpXS52YWwgPSBvcmdfdGFibGVbaV0udmFsOworICAgIH0KKyAgICByZXR1cm4gY2xvbmVfdGFibGU7Cit9CisKKworLyogcG9wdWxhdGUgQ0xJIHBhcmFtZXRlcihzKSBmcm9tIGEgc2luZ2xlIHByb3BlcnR5LiBDYW4gYmUgbXVsdGlwbGUgcGFyYW1ldGVycworICogaWYgcHJvcGVydHkgY29udGFpbnMgbXVsdGlwbGUgZmllbGRzLgorICogUmV0dXJucyBudW1iZXIgb2YgcGFyYW1ldGVycyBwb3B1bGF0ZWQgPj0gMCBvciBlcnJvciA8IDAKKyAqLworc3RhdGljIGludCBiY21iYWxfYXBpY2xpX3BvcHVsYXRlX3Bhcm1zX2Zyb21fcHJvcGVydHkoY29uc3QgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICpwZCwgCisgICAgY29uc3QgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciAqZmQsIGNvbnN0IGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgKmFycmF5X2ZkLCB1aW50MzJfdCBvZmZzZXQsCisgICAgdWludDMyX3QgYXJyYXlfZmRfb2Zmc2V0LCBiY21jbGlfY21kX3Bhcm0gKnBhcm1zLCBiY21iYWxfYXBpY2xpX3Byb3BfYWNjZXNzX2lkIGFjY2Vzc19sZXZlbCwgdWludDMyX3QgY21kX2ZsYWdzLAorICAgIGNoYXIgKm5hbWVfYnVmMCwgY2hhciAqaGVscF9idWYwKQoreworICAgIGNvbnN0IGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciAqdGQgPSBmZCA/IGZkLT50eXBlIDogcGQtPnR5cGU7CisgICAgdWludDMyX3QgbmYgPSAwOworICAgIGNoYXIgbmFtZV9idWZbQkNNQkFMX0FQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSF07CisgICAgY2hhciBoZWxwX2J1ZltCQ01CQUxfQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIXTsKKyAgICBpbnQgcmMgPSAwOworCisgICAgLyogcHJlc2VuY2UgbWFza3MgYXJlIG5vdCBzZXQgZGlyZWN0bHksIHRoZXkgYXJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gb3RoZXIgZmllbGRzICovCisgICAgaWYgKGZkICE9IE5VTEwgJiYgKGZkLT5mbGFncyAmIEJDTUJBTF9BUElDTElfRklFTERfREVTQ1JfRkxBR1NfUFJFU0VOQ0VfTUFTSykgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JFQURfT05MWTsKKyAgICB9CisKKyAgICAvKiBBdCB0b3AgbGV2ZWwgdGFrZSBuYW1lIGZyb20gcHJvcGVydHkgKi8KKyAgICBpZiAodGQgPT0gcGQtPnR5cGUpCisgICAgeworICAgICAgICAvKiBJbiBjYXNlIHRoZXJlJ3MgYSBnbG9iYWwgcHJlZml4ICovCisgICAgICAgIGNoYXIgKnRvcF9uYW1lX2J1ZiA9IG5hbWVfYnVmMDsKKyAgICAgICAgdWludDMyX3QgdG9wX25hbWVfYnVmX2xlbiA9IEJDTUJBTF9BUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEg7CisgICAgICAgIHVpbnQzMl90IHByZWZpeF9sZW4gPSBzdHJsZW4obmFtZV9idWYwKTsKKyAgICAgICAgaWYgKHByZWZpeF9sZW4gPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB0b3BfbmFtZV9idWYgKz0gcHJlZml4X2xlbjsKKyAgICAgICAgICAgIHRvcF9uYW1lX2J1Zl9sZW4gLT0gcHJlZml4X2xlbjsKKyAgICAgICAgfQorCisgICAgICAgIGJjbWNsaV9zdHJuY3B5KHRvcF9uYW1lX2J1ZiwgcGQtPmNsaV9uYW1lID8gcGQtPmNsaV9uYW1lIDogcGQtPm5hbWUsIHRvcF9uYW1lX2J1Zl9sZW4pOworICAgICAgICBiY21jbGlfc3RybmNweShoZWxwX2J1ZjAsIHBkLT5kZXNjciA/IHBkLT5kZXNjciA6IHBkLT5uYW1lLCBCQ01CQUxfQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIKTsKKyAgICB9CisKKyAgICAvKiBGb3IgcmVhZCBhY2Nlc3Mgd2Ugb25seSBtYXJrIHdoZXRoZXIgcmVhZCBwcm9wZXJ0eSBvciBub3QuIEl0IGlzIG5vdCBmaWVsZC1ieS1maWVsZCBvcGVyYXRpb24gKi8KKyAgICBpZiAoYWNjZXNzX2xldmVsID09IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUikKKyAgICB7CisgICAgICAgIHRkID0gJmJvb2xfdHlwZV9kZXNjcjsKKyAgICB9CisKKyAgICAvKiBJbiBjYXNlIG9mIGFycmF5cyB3ZSBzaG91bGQKKyAgICAgKiAtIGNoZWNrIHRoYXQgdGhlcmUgaXMgbm8gYXJyYXkgaW4gYXJyYXkuIEl0IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiAtIHN0b3JlIGFycmF5IHR5cGUgZGVzY3JpcHRvciBGRlUgYW5kIHJlcGxhY2UgdGhlICJjdXJyZW50IiB0eXBlIGRlc2NyaXB0b3Igd2l0aCBlbGVtZW50IHR5cGUKKyAgICAgKiAtIHJlc2V0IG9mZnNldCBiZWNhdXNlIGZvciBhcnJheSBmaWVsZHMgaXQgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgZnJvbSBhcnJheSBiYXNlIHJhdGhlciB0aGFuIHByb3BlcnR5CisgICAgICovCisgICAgaWYgKHRkLT5iYXNlX3R5cGUgPT0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfQVJSX0RZTiB8fCB0ZC0+YmFzZV90eXBlID09IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCkKKyAgICB7CisgICAgICAgIGlmIChhcnJheV9mZCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KAorICAgICAgICAgICAgICAgIGN1cnJlbnRfc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAiKioqICVzIGluICVzOiBhcnJheXMtaW4tYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkXG4iLAorICAgICAgICAgICAgICAgIHBkLT5uYW1lLAorICAgICAgICAgICAgICAgIGFycmF5X2ZkLT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgLyogc3RvcmUgYXJyYXkgdHlwZSBhbmQgZmV0Y2ggZWxlbWVudCB0eXBlICovCisgICAgICAgIGFycmF5X2ZkID0gZmQgPyBmZCA6IChjb25zdCBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyICopcGQ7CisgICAgICAgIGlmICh0ZC0+YmFzZV90eXBlID09IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0FSUl9EWU4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRkID0gdGQtPnguYXJyX2R5bi5lbGVtX3R5cGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0ZCA9IHRkLT54LmFycl9maXhlZC5lbGVtX3R5cGU7CisgICAgICAgIH0KKyAgICAgICAgYXJyYXlfZmRfb2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBvZmZzZXQgPSAwOworICAgIH0KKworICAgIGlmICh0ZC0+YmFzZV90eXBlID09IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGY7CisgICAgICAgIGlmICghdGQtPngucy5udW1fZmllbGRzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEJVR19PTighdGQtPngucy5maWVsZHMpOworICAgICAgICBmb3IgKGYgPSAwOyBmIDwgdGQtPngucy5udW1fZmllbGRzOyBmKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgKmZsZCA9ICZ0ZC0+eC5zLmZpZWxkc1tmXTsKKyAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcG9wdWxhdGVfbmFtZV9oZWxwKGZsZCwgbmFtZV9idWYwLCBoZWxwX2J1ZjAsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShwZCwgZmxkLCBhcnJheV9mZCwgb2Zmc2V0K2ZsZC0+b2Zmc2V0LAorICAgICAgICAgICAgICAgIGFycmF5X2ZkX29mZnNldCwgJnBhcm1zW25mXSwgYWNjZXNzX2xldmVsLCBjbWRfZmxhZ3MsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgICAgICBpZiAocmMgPiAwKQorICAgICAgICAgICAgICAgIG5mICs9ICByYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0ZC0+YmFzZV90eXBlID09IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOSU9OKQorICAgIHsKKyAgICAgICAgLyogVW5pb24gKi8KKyAgICAgICAgdWludDE2X3QgZjsKKyAgICAgICAgY29uc3QgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciAqZmxkOworICAgICAgICBiY21jbGlfY21kX3Bhcm0gKnNlbF9wYXJtOworICAgICAgICBiY21iYWxfYXBpY2xpX3Bhcm1fZGF0YSAqc2VsX2RhdGE7CisgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqZTsKKworICAgICAgICBpZiAoIXRkLT54LnUubnVtX2NvbW1vbl9maWVsZHMpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQlVHX09OKCF0ZC0+eC51LmNvbW1vbl9maWVsZHMpOworCisgICAgICAgIC8qIFBvcHVsYXRlIHBhcmFtZXRlcnMgcHJlY2VkaW5nIHRoZSB1bmlvbiBzZWxlY3RvciAqLworICAgICAgICBmb3IgKGYgPSAwOyBmIDwgdGQtPngudS5jbGFzc2lmaWVyX2lkeDsgZisrKQorICAgICAgICB7CisgICAgICAgICAgICBmbGQgPSAmdGQtPngudS5jb21tb25fZmllbGRzW2ZdOworICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wb3B1bGF0ZV9uYW1lX2hlbHAoZmxkLCBuYW1lX2J1ZjAsIGhlbHBfYnVmMCwgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIHJjID0gIGJjbWJhbF9hcGljbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShwZCwgZmxkLCBhcnJheV9mZCwKKyAgICAgICAgICAgICAgICBvZmZzZXQrZmxkLT5vZmZzZXQsIGFycmF5X2ZkX29mZnNldCwgJnBhcm1zW25mXSwgYWNjZXNzX2xldmVsLCBjbWRfZmxhZ3MsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgICAgICBpZiAocmMgPiAwKQorICAgICAgICAgICAgICAgIG5mICs9IHJjOworICAgICAgICB9CisKKyAgICAgICAgLyogTm93IHBvcHVsYXRlIHBhcmFtZXRlciBmb3Igc2VsZWN0b3IgKi8KKyAgICAgICAgc2VsX3Bhcm0gPSAmcGFybXNbbmZdOworICAgICAgICBmbGQgPSAmdGQtPngudS5jb21tb25fZmllbGRzW2ZdOworICAgICAgICBiY21iYWxfYXBpY2xpX3BvcHVsYXRlX25hbWVfaGVscChmbGQsIG5hbWVfYnVmMCwgaGVscF9idWYwLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShwZCwgZmxkLCBhcnJheV9mZCwKKyAgICAgICAgICAgIG9mZnNldCtmbGQtPm9mZnNldCwgYXJyYXlfZmRfb2Zmc2V0LCBzZWxfcGFybSwgYWNjZXNzX2xldmVsLCBjbWRfZmxhZ3MsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICBuZiArPSByYzsKKyAgICAgICAgLyogQ2xvbmUgZW51bSB0YWJsZSBpbiBvcmRlciB0byBhbGxvdyBtb2RpZnlpbmcgaXQgKi8KKyAgICAgICAgaWYgKHJjID49IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbF9wYXJtLT5lbnVtX3RhYmxlID0gYmNtYmFsX2FwaWNsaV9jbG9uZV9lbnVtX3RhYmxlKHNlbF9wYXJtKTsKKyAgICAgICAgICAgIGlmICghc2VsX3Bhcm0tPmVudW1fdGFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogTm93IHNldC11cCBzZWxlY3RvciAqLworICAgICAgICBzZWxfcGFybS0+ZmxhZ3MgfD0gQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUjsKKyAgICAgICAgc2VsX2RhdGEgPSBzZWxfcGFybS0+dXNlcl9kYXRhOworICAgICAgICBlID0gc2VsX3Bhcm0tPmVudW1fdGFibGU7CisgICAgICAgIHdoaWxlIChlICYmIGUtPm5hbWUgJiYgcmMgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZmxkID0gJnRkLT54LnUudW5pb25fZmllbGRzW2UgLSBzZWxfcGFybS0+ZW51bV90YWJsZV07CisgICAgICAgICAgICBpZiAoZmxkLT50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBucCA9IGJjbWJhbF9hcGljbGlfZ2V0X251bV9maWVsZHNfaW5fdHlwZShmbGQtPnR5cGUpOworICAgICAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICAgICAgZS0+cGFybXMgPSBiY21iYWxfYXBpY2xpX3Bhcm1fYWxsb2MobnApOworICAgICAgICAgICAgICAgIGlmICghZS0+cGFybXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnA7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcGFybV9kYXRhICpkYXRhID0gZS0+cGFybXNbaV0udXNlcl9kYXRhOworICAgICAgICAgICAgICAgICAgICBkYXRhLT5ncm91cCA9IHNlbF9kYXRhLT5ncm91cDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogQ29sbGFwc2Ugc3Vic3RydWN0dXJlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoZmxkLT50eXBlLT5iYXNlX3R5cGUgPT0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfU1RSVUNUIHx8CisgICAgICAgICAgICAgICAgICAgIGZsZC0+dHlwZS0+YmFzZV90eXBlID09IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOSU9OKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkobmFtZV9idWYsIG5hbWVfYnVmMCwgc2l6ZW9mKG5hbWVfYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGhlbHBfYnVmLCBoZWxwX2J1ZjAsIHNpemVvZihoZWxwX2J1ZikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3BvcHVsYXRlX25hbWVfaGVscChmbGQsIG5hbWVfYnVmMCwgaGVscF9idWYwLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShwZCwgZmxkLCBhcnJheV9mZCwKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0K2ZsZC0+b2Zmc2V0LCBhcnJheV9mZF9vZmZzZXQsIGUtPnBhcm1zLCBhY2Nlc3NfbGV2ZWwsIGNtZF9mbGFncywgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmFsbHkgcG9wdWxhdGUgcGFyYW1ldGVycyBmb2xsb3dpbmcgdGhlIHNlbGVjdG9yIHBhcmFtZXRlciAqLworICAgICAgICBmb3IgKGYgPSB0ZC0+eC51LmNsYXNzaWZpZXJfaWR4ICsgMTsgZiA8IHRkLT54LnUubnVtX2NvbW1vbl9maWVsZHMgJiYgcmMgPj0gMDsgZisrKQorICAgICAgICB7CisgICAgICAgICAgICBmbGQgPSAmdGQtPngudS5jb21tb25fZmllbGRzW2ZdOworICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wb3B1bGF0ZV9uYW1lX2hlbHAoZmxkLCBuYW1lX2J1ZjAsIGhlbHBfYnVmMCwgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIHJjID0gYmNtYmFsX2FwaWNsaV9wb3B1bGF0ZV9wYXJtc19mcm9tX3Byb3BlcnR5KHBkLCBmbGQsIGFycmF5X2ZkLAorICAgICAgICAgICAgICAgIG9mZnNldCtmbGQtPm9mZnNldCwgYXJyYXlfZmRfb2Zmc2V0LCAmcGFybXNbbmZdLCBhY2Nlc3NfbGV2ZWwsIGNtZF9mbGFncywgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICAgICAgbmYgKz0gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRmluYWxseSEgU2ltcGxlIHR5cGUgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIENMSSBwYXJhbWV0ZXIgKi8KKyAgICAgICAgbmYgPSBiY21iYWxfYXBpY2xpX3BvcHVsYXRlX3Bhcm0xKHBkLCBmZCwgdGQsIGFycmF5X2ZkLCBvZmZzZXQsIGFycmF5X2ZkX29mZnNldCwKKyAgICAgICAgICAgICZwYXJtc1swXSwgY21kX2ZsYWdzLCBuYW1lX2J1ZjAsIGhlbHBfYnVmMCk7CisgICAgfQorICAgIHJldHVybiAocmMgPj0gMCkgPyBuZiA6IHJjOworfQorCisvKiBwb3B1bGF0ZSBDTEkgcGFyYW1ldGVyIHRhYmxlICovCitzdGF0aWMgaW50IGJjbWJhbF9hcGljbGlfcG9wdWxhdGVfcGFybXMoCisgICAgYmNtYmFsX29ial9pZCBvLAorICAgIGJjbWJhbF9tZ3RfZ3JvdXAgZ3JvdXAsCisgICAgdWludDE2X3Qgc3ViZ3JvdXAsCisgICAgYmNtYmFsX2FwaWNsaV9wcm9wX2FjY2Vzc19pZCBhY2Nlc3NfbGV2ZWwsCisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtcywKKyAgICB1aW50MzJfdCBjbWRfZmxhZ3MsCisgICAgY29uc3QgY2hhciAqcHJlZml4KQoreworICAgIGludCBuZiA9IDA7CisgICAgaW50IGk7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgZm9yIChpID0gMDsgcmMgIT0gQkNNX0VSUl9SQU5HRTsgaSsrKQorICAgIHsKKyAgICAgICAgY29uc3QgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICpwZDsKKyAgICAgICAgY2hhciBuYW1lX2J1ZltCQ01CQUxfQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIXSA9ICIiOworICAgICAgICBjaGFyIGhlbHBfYnVmW0JDTUJBTF9BUElDTElfTUFYX1BBUk1fSEVMUF9MRU5HVEhdID0gIiI7CisKKyAgICAgICAgc3RybmNweShuYW1lX2J1ZiwgcHJlZml4LCBCQ01CQUxfQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RILTEpOworICAgICAgICBuYW1lX2J1ZltCQ01CQUxfQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RILTFdID0gMDsKKworICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfb2JqZWN0X3Byb3BlcnR5KG8sIGdyb3VwLCBzdWJncm91cCwgaSwgJnBkKTsKKyAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0sgJiYgKHBkLT5hY2Nlc3MgJiBhY2Nlc3NfbGV2ZWwpKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShwZCwgTlVMTCwgTlVMTCwgMCwgMCwgJnBhcm1zW25mXSwKKyAgICAgICAgICAgICAgICBhY2Nlc3NfbGV2ZWwsIGNtZF9mbGFncywgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICAgICAgbmYgKz0gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5mOworfQorCisKKy8qIGNvbXBhY3Qgc2VsZWN0b3IgdGFibGUuIHNxdWVlemUgb3V0IHZhbHVlcyB0aGF0IGRvbid0IGhhdmUgcGFyYW1ldGVyIHRhYmxlIGF0dGFjaGVkICovCitzdGF0aWMgdm9pZCBiY21iYWxfYXBpY2xpX2NvbXBhY3Rfc2VsZWN0b3IoYmNtY2xpX2VudW1fdmFsICpzZWxlY3RvciwgaW50IHNpemUpCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCFzZWxlY3RvcltpXS5wYXJtcykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggaiA9IGkgKyAxOyBqIDwgc2l6ZSAmJiAhc2VsZWN0b3Jbal0ucGFybXM7IGogKyspCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgaWYgKGogPCBzaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbWNweSgmc2VsZWN0b3JbaV0sICZzZWxlY3RvcltqXSwgc2l6ZW9mKGJjbWNsaV9lbnVtX3ZhbCkpOworICAgICAgICAgICAgICAgIG1lbXNldCgmc2VsZWN0b3Jbal0sIDAsIHNpemVvZihiY21jbGlfZW51bV92YWwpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnNlbGVjdG9yW2ldLCAwLCBzaXplb2YoYmNtY2xpX2VudW1fdmFsKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIEZyZWUgQ0xJIHBhcmFtZXRlcnMuIGJvdGggbmFtZSBhbmQgZGVzY3JpcHRpb24gYXJlIGFsbG9jYXRlZCBkeW5hbWljYWxseSAqLworc3RhdGljIHZvaWQgYmNtYmFsX2FwaWNsaV9mcmVlX3Bhcm1zKGJjbWNsaV9jbWRfcGFybSAqcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwID0gcGFybXM7CisKKyAgICB3aGlsZSAocC0+bmFtZSkKKyAgICB7CisgICAgICAgIGlmICgocC0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX1NFTEVDVE9SKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVtb3ZlIHNlbGVjdG9yIHRhYmxlICovCisgICAgICAgICAgICBiY21jbGlfZW51bV92YWwgKnNlbCA9IHAtPmVudW1fdGFibGU7CisgICAgICAgICAgICBpZiAoc2VsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqZSA9IHNlbDsKKyAgICAgICAgICAgICAgICB3aGlsZShlLT5uYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUtPnBhcm1zKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX2ZyZWVfcGFybXMoZS0+cGFybXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShzZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwLT5kZXNjcmlwdGlvbikKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoQkNNQkFMX0FQSUNMSV9DQVNUX0RJU0NBUkRfQ09OU1QocC0+ZGVzY3JpcHRpb24sIHZvaWQgKikpOworICAgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoQkNNQkFMX0FQSUNMSV9DQVNUX0RJU0NBUkRfQ09OU1QocC0+bmFtZSwgdm9pZCAqKSk7CisgICAgICAgIGlmIChwLT5tYXhfYXJyYXlfc2l6ZSAmJiBwLT52YWx1ZXMpCisgICAgICAgICAgICBiY21vc19mcmVlKHAtPnZhbHVlcyk7CisgICAgICAgIGlmIChwLT52YWx1ZS5idWZmZXIuc3RhcnQpCisgICAgICAgICAgICBiY21iYWxfYnVmX2ZyZWUoJnAtPnZhbHVlLmJ1ZmZlcik7CisKKyAgICAgICAgKytwOworICAgIH0KKyAgICBiY21vc19mcmVlKHBhcm1zKTsKK30KKworc3RhdGljIHVpbnQ4X3QgYmNtYmFsX2FwaWNsaV9nZXRfbnVtX2NtZF9wYXJtcyhiY21iYWxfbWd0X2dyb3VwIGdyb3VwLCBiY21iYWxfYXBpY2xpX2ZsYWdzIGZsYWdzKQoreworICAgIGlmIChncm91cCA9PSBCQ01CQUxfTUdUX0dST1VQX1NUQVQpCisgICAgICAgIHJldHVybiAyOyAvKiBvYmplY3QgKyBzdGF0IElEICovCisgICAgZWxzZQorICAgICAgICByZXR1cm4gMTsgLyogb2JqZWN0ICovCit9CisKKy8qIFJlYWQgZ2VuZXJhdGVkIGluZm8gYW5kIGFkZCBDTEkgY29tbWFuZCAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfYWRkKGJjbWNsaV9lbnRyeSAqZGlyLCBjb25zdCBjaGFyICpjbWRfbmFtZSwgY29uc3QgY2hhciAqY21kX2Rlc2NyLAorICAgIGJjbWJhbF9tZ3RfZ3JvdXAgZ3JvdXAsIGJjbWJhbF9hcGljbGlfcHJvcF9hY2Nlc3NfaWQgYWNjZXNzX2xldmVsLCBiY21jbGlfY21kX2NiIGNtZF9oYW5kbGVyLCAKKyAgICBiY21iYWxfYXBpY2xpX2ZsYWdzIGZsYWdzKQoreworICAgIGJjbWNsaV9jbWRfZXh0cmFfcGFybSBjbWRfZXh0cmFzID0geyAuZnJlZV9wYXJtcyA9IGJjbWJhbF9hcGljbGlfZnJlZV9wYXJtcyB9OworICAgIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm1zOworICAgIGJjbWNsaV9lbnVtX3ZhbCAqb2JqX3NlbGVjdG9yOworICAgIGJjbWJhbF9vYmpfaWQgbzsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgY21kX2ZsYWdzID0gMDsKKyAgICB1aW50OF90IG51bV9jbWRfcGFybXMgPSBiY21iYWxfYXBpY2xpX2dldF9udW1fY21kX3Bhcm1zKGdyb3VwLCBmbGFncyk7CisgICAgaW50IG5fb2JqOworICAgIGludCBpOworCisgICAgLyogQ29tbWFuZCBmbGFnczogcGFyYW1ldGVycyBpbiB0aGUgZm9sbG93aW5nIGdyb3VwcyBhcmUgb3B0aW9uYWwgKi8KKyAgICBpZiAoZ3JvdXAgPT0gQkNNQkFMX01HVF9HUk9VUF9DRkcgfHwgZ3JvdXAgPT0gQkNNQkFMX01HVF9HUk9VUF9TVEFUIHx8IGdyb3VwID09IEJDTUJBTF9NR1RfR1JPVVBfQVVUT19DRkcpCisgICAgICAgIGNtZF9mbGFncyA9IEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUw7CisKKyAgICAvKiBjb21tYW5kIHBhcmFtZXRlcnMgYXJlOgorICAgICAqIC0gb2JqZWN0X25hbWUgKHNlbGVjdG9yKQorICAgICAqIC0gb2JqZWN0X2tleV9maWVsZHMKKyAgICAgKiAtIG9iamVjdF9wZXJfZ3JvdXBfZmllbGRzIGZpbHRlcmVkIGJ5IGFjY2VzcworICAgICAqIFRoZXJlZm9yZSwgdGhlcmUgaXMgMSB0b3AtbGV2ZWwgZW51bSBwYXJhbWV0ZXIgKG9iamVjdCB0eXBlKSB3aXRoIHBlci12YWx1ZSBwYXJhbWV0ZXIgdGFibGVzCisgICAgICogSW4gdGhlIGNhc2Ugb2Ygb3BlcmF0aW9ucyBvciBwcm94eSBtZXNzYWdlcywgdGhlcmUgaXMgYWxzbyBhIHRvcC1sZXZlbCBlbnVtIHBhcmFtZXRlciBmb3IgdGhlIG9wZXIvcHJveHkgbmFtZQorICAgICAqLworCisgICAgLyogQWxsb2NhdGUgZW51bSB0YWJsZSBiYXNlZCBvbiBtYXggbnVtYmVyIG9mIG9iamVjdHMuIFdpbGwgYmUgY29tcGFjdGVkIGluIHRoZSBlbmQgKi8KKyAgICBjbWRfcGFybXMgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9jbWRfcGFybSkgKiAobnVtX2NtZF9wYXJtcyArIDEpKTsKKyAgICBpZiAoIWNtZF9wYXJtcykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisKKyAgICAvKiBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIGFsbCBvYmplY3QgZW50cmllcyBhcyB3ZWxsIGFzIGEgdGVybWluYXRvciBlbnRyeSAod2hpY2ggaXMgbGVmdCBOVUxMKSAqLworICAgIG9ial9zZWxlY3RvciA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYmNtY2xpX2VudW1fdmFsKSAqIChCQ01CQUxfT0JKX0lEX19OVU1fT0YgKyAxKSk7CisgICAgaWYgKCFvYmpfc2VsZWN0b3IpCisgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKworICAgIC8qIEFsbG9jYXRlIHBhcmFtZXRlciB0YWJsZSAqLworICAgIG5fb2JqID0gMDsKKyAgICBmb3IgKG8gPSAwOyBvIDwgQkNNQkFMX09CSl9JRF9fTlVNX09GOyBvKyspCisgICAgeworICAgICAgICB1aW50MzJfdCBua2V5ZmllbGRzID0gMDsKKyAgICAgICAgdWludDMyX3QgbmZpZWxkcyA9IDA7CisgICAgICAgIHVpbnQzMl90IG5maWx0ZXJmaWVsZHMgPSAwOworICAgICAgICB1aW50MzJfdCBzaXplOworICAgICAgICB1aW50MTZfdCBzOworICAgICAgICB1aW50MTZfdCBzdWJncm91cF9jb3VudCA9IGJjbWJhbF9hcGljbGlfZ2V0X3N1Ymdyb3VwX2NvdW50KG8sIGdyb3VwKTsKKyAgICAgICAgYmNtY2xpX2VudW1fdmFsICpzdWJfc2VsZWN0b3I7CisKKyAgICAgICAgaWYgKHN1Ymdyb3VwX2NvdW50ID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnZhbCA9IG87CisgICAgICAgIHJjID0gYmNtYmFsX2FwaWNsaV9vYmplY3RfbmFtZShvLCAmb2JqX3NlbGVjdG9yW25fb2JqXS5uYW1lLCBOVUxMKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogR2V0IG51bWJlciBvZiBrZXkgZmllbGRzIGFuZCBzYXZlIGl0ICovCisgICAgICAgIGlmIChncm91cCA9PSBCQ01CQUxfTUdUX0dST1VQX0FVVE9fQ0ZHKQorICAgICAgICB7CisgICAgICAgICAgICBua2V5ZmllbGRzID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfZ2V0X251bV9maWVsZHNfaW5fZ3JvdXAoCisgICAgICAgICAgICAgICAgbywgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfVywgJm5rZXlmaWVsZHMpOworICAgICAgICB9CisKKyAgICAgICAgLyogQWxsb2NhdGUgc3ViZ3JvdXAgZW51bSB0YWJsZSAqLworICAgICAgICBzdWJfc2VsZWN0b3IgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9lbnVtX3ZhbCkgKiAoc3ViZ3JvdXBfY291bnQgKyAxKSk7CisgICAgICAgIGlmICghc3ViX3NlbGVjdG9yKQorICAgICAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworCisgICAgICAgIC8qIEFsbG9jYXRlIHNpbmdsZSBzdWJncm91cCBjb21tYW5kIHBhcmFtZXRlciAqLworICAgICAgICBzaXplID0gc2l6ZW9mKGJjbWNsaV9jbWRfcGFybSkgKiAyOworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zID0gYmNtb3NfY2FsbG9jKHNpemUpOworICAgICAgICBpZiAoIW9ial9zZWxlY3RvcltuX29ial0ucGFybXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoc3ViX3NlbGVjdG9yKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldHVwIHNpbmdsZSBzdWJncm91cCBjb21tYW5kIHBhcmFtZXRlciAqLworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zWzBdLnR5cGUgPSBCQ01DTElfUEFSTV9FTlVNOworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zWzBdLmZsYWdzID0gQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUjsKKyAgICAgICAgb2JqX3NlbGVjdG9yW25fb2JqXS5wYXJtc1swXS5lbnVtX3RhYmxlID0gc3ViX3NlbGVjdG9yOworICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfY29weV9wYXJtX25hbWUoJm9ial9zZWxlY3RvcltuX29ial0ucGFybXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ViIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJncm91cCAoc3BlY2lmaWMgb3BlcmF0aW9uIC8gcHJveHkgbXNnKSIpOworICAgICAgICBpZiAocmMpCisgICAgICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisKKyAgICAgICAgZm9yIChzID0gMDsgcyA8IHN1Ymdyb3VwX2NvdW50OyArK3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1Yl9uYW1lOworICAgICAgICAgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtX3B0cjsKKworICAgICAgICAgICAgLyogR2V0IG5hbWUgb2Ygc3BlY2lmaWMgc3ViZ3JvdXAgKi8KKyAgICAgICAgICAgIHJjID0gYmNtYmFsX2FwaWNsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShvLCBncm91cCwgcywgJnN1Yl9uYW1lLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLyogU2V0dXAgZW50cnkgaW4gc3ViZ3JvdXAgZW51bSB0YWJsZSAqLworICAgICAgICAgICAgc3ViX3NlbGVjdG9yW3NdLm5hbWUgPSBzdWJfbmFtZTsKKyAgICAgICAgICAgIHN1Yl9zZWxlY3RvcltzXS52YWwgPSBzOworCisgICAgICAgICAgICAvKiBHZXQgbnVtYmVyIG9mIGdyb3VwIGZpZWxkcyAqLworICAgICAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX2dldF9udW1fZmllbGRzX2luX2dyb3VwKG8sIGdyb3VwLCBzLCBhY2Nlc3NfbGV2ZWwsICZuZmllbGRzKTsKKyAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKChmbGFncyAmIEJDTUJBTF9BUElDTElfRkxBR1NfSUdOT1JFX0ZJRUxEUykgIT0gQkNNQkFMX0FQSUNMSV9GTEFHU19OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5maWx0ZXJmaWVsZHMgPSAwOworICAgICAgICAgICAgICAgIG5maWVsZHMgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBbGxvY2F0ZSBwYXJhbWV0ZXIgdGFibGUgYW5kIHBvcHVsYXRlIGl0ICovCisgICAgICAgICAgICBzdWJfc2VsZWN0b3Jbc10ucGFybXMgPSBiY21iYWxfYXBpY2xpX3Bhcm1fYWxsb2MobmZpZWxkcyArIG5rZXlmaWVsZHMgKyBuZmlsdGVyZmllbGRzKTsKKyAgICAgICAgICAgIGlmICghc3ViX3NlbGVjdG9yW3NdLnBhcm1zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmtleWZpZWxkcyArIG5maWVsZHMgKyBuZmlsdGVyZmllbGRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wYXJtX2RhdGEgKnBhcm1fZGF0YSA9IHN1Yl9zZWxlY3RvcltzXS5wYXJtc1tpXS51c2VyX2RhdGE7CisgICAgICAgICAgICAgICAgcGFybV9kYXRhLT5ncm91cCA9IChpIDwgbmtleWZpZWxkcykgPyBCQ01CQUxfTUdUX0dST1VQX0tFWSA6IGdyb3VwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJtX3B0ciA9IHN1Yl9zZWxlY3RvcltzXS5wYXJtczsKKyAgICAgICAgICAgIGlmIChua2V5ZmllbGRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gYmNtYmFsX2FwaWNsaV9wb3B1bGF0ZV9wYXJtcygKKyAgICAgICAgICAgICAgICAgICAgbywgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfVywgcGFybV9wdHIsIDAsICIiKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisgICAgICAgICAgICAgICAgcGFybV9wdHIgKz0gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmZpbHRlcmZpZWxkcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfcG9wdWxhdGVfcGFybXMoCisgICAgICAgICAgICAgICAgICAgIG8sIGdyb3VwLCBzLCBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCBwYXJtX3B0ciwgY21kX2ZsYWdzLCAiZmlsdGVyLiIpOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICAgICAgICAgICAgICBwYXJtX3B0ciArPSByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZmllbGRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gYmNtYmFsX2FwaWNsaV9wb3B1bGF0ZV9wYXJtcyhvLCBncm91cCwgcywgYWNjZXNzX2xldmVsLCBwYXJtX3B0ciwgY21kX2ZsYWdzLCAiIik7CisgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworICAgICAgICAgICAgICAgIHBhcm1fcHRyICs9IHJjOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcGFjdCBzdWJfc2VsZWN0b3IgZW51bS4gUmVtb3ZlcyBob2xlcyAodmFsdWVzIHdpdGhvdXQgcGFyYW1ldGVyIHRhYmxlKSAqLworICAgICAgICBiY21iYWxfYXBpY2xpX2NvbXBhY3Rfc2VsZWN0b3Ioc3ViX3NlbGVjdG9yLCBzdWJncm91cF9jb3VudCk7CisKKyAgICAgICAgLyogSWYgdGhlIGdyb3VwIHR5cGUgZG9lc24ndCBzdXBwb3J0IHN1Ymdyb3VwcywgcmVtb3ZlIHRoZSBzdWJncm91cCBwYXJhbSBlbnRyeSAqLworICAgICAgICBpZiAoZ3JvdXAgPT0gQkNNQkFMX01HVF9HUk9VUF9DRkcgfHwgZ3JvdXAgPT0gQkNNQkFMX01HVF9HUk9VUF9TVEFUIHx8IGdyb3VwID09IEJDTUJBTF9NR1RfR1JPVVBfQVVUT19DRkcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZyZWUgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIChzaW5nbGUpIHN1Ymdyb3VwIHBhcmFtICovCisgICAgICAgICAgICBiY21vc19mcmVlKEJDTUJBTF9BUElDTElfQ0FTVF9ESVNDQVJEX0NPTlNUKG9ial9zZWxlY3RvcltuX29ial0ucGFybXNbMF0ubmFtZSwgdm9pZCAqKSk7CisgICAgICAgICAgICBiY21vc19mcmVlKEJDTUJBTF9BUElDTElfQ0FTVF9ESVNDQVJEX0NPTlNUKG9ial9zZWxlY3RvcltuX29ial0ucGFybXNbMF0uZGVzY3JpcHRpb24sIHZvaWQgKikpOworICAgICAgICAgICAgYmNtb3NfZnJlZShvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zKTsKKyAgICAgICAgICAgIC8qIEFzc2lnbiB0aGUgc3ViZ3JvdXAgcGFyYW1zIHRvIHRoZSByb290IG9iamVjdCBwYXJhbXMgKi8KKyAgICAgICAgICAgIG9ial9zZWxlY3RvcltuX29ial0ucGFybXMgPSBzdWJfc2VsZWN0b3JbMF0ucGFybXM7CisgICAgICAgICAgICBiY21vc19mcmVlKHN1Yl9zZWxlY3Rvcik7CisgICAgICAgIH0KKworICAgICAgICArK25fb2JqOyAvKiBudW1iZXIgb2YgY29uZmlndXJlZCBvYmplY3RzICovCisgICAgfQorCisgICAgLyogQ29tcGFjdCBvYmpfc2VsZWN0b3IgZW51bS4gUmVtb3ZlcyBob2xlcyAodmFsdWVzIHdpdGhvdXQgcGFyYW1ldGVyIHRhYmxlKSAqLworICAgIGJjbWJhbF9hcGljbGlfY29tcGFjdF9zZWxlY3RvcihvYmpfc2VsZWN0b3IsIEJDTUJBTF9PQkpfSURfX05VTV9PRik7CisKKyAgICAvKiBBZGQgYSAnY2xlYXIgb24gcmVhZCcgdG8gc3RhdHMgZ3JvdXAgKi8KKyAgICBpZiAoZ3JvdXAgPT0gQkNNQkFMX01HVF9HUk9VUF9TVEFUKQorICAgIHsKKyAgICAgICAgY21kX3Bhcm1zWzBdLnR5cGUgPSBCQ01DTElfUEFSTV9FTlVNOworICAgICAgICBjbWRfcGFybXNbMF0uZW51bV90YWJsZSA9IGJvb2xfZW51bTsKKyAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX2NvcHlfcGFybV9uYW1lKCZjbWRfcGFybXNbMF0sICJjbGVhciIsICJjbGVhciBvbiByZWFkIik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICB9CisKKyAgICAvKiBXZSBhcmUgcmVhZHkgdG8gYWRkIHRoaXMgY29tbWFuZCAqLworICAgIGNtZF9wYXJtc1tudW1fY21kX3Bhcm1zIC0gMV0udHlwZSA9IEJDTUNMSV9QQVJNX0VOVU07CisgICAgY21kX3Bhcm1zW251bV9jbWRfcGFybXMgLSAxXS5mbGFncyA9IEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1I7CisgICAgY21kX3Bhcm1zW251bV9jbWRfcGFybXMgLSAxXS5lbnVtX3RhYmxlID0gb2JqX3NlbGVjdG9yOworICAgIHJjID0gYmNtYmFsX2FwaWNsaV9jb3B5X3Bhcm1fbmFtZSgmY21kX3Bhcm1zW251bV9jbWRfcGFybXMgLSAxXSwgIm9iamVjdCIsICJPYmplY3QgVHlwZSIpOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworICAgIHJjID0gYmNtY2xpX2NtZF9hZGQoZGlyLCBjbWRfbmFtZSwgY21kX2hhbmRsZXIsIGNtZF9kZXNjciwKKyAgICAgICAgKGFjY2Vzc19sZXZlbCA9PSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1cpID8gQkNNQ0xJX0FDQ0VTU19BRE1JTiA6IEJDTUNMSV9BQ0NFU1NfR1VFU1QsCisgICAgICAgICZjbWRfZXh0cmFzLCBjbWRfcGFybXMpOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworICAgIHJldHVybiAwOworCitub21lbV9jbGVhbnVwOgorICAgIGlmIChvYmpfc2VsZWN0b3IpCisgICAgeworICAgICAgICBmb3IgKG8gPSAwOyBvIDwgQkNNQkFMX09CSl9JRF9fTlVNX09GOyBvKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvYmpfc2VsZWN0b3Jbb10ucGFybXMpCisgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9mcmVlX3Bhcm1zKG9ial9zZWxlY3RvcltvXS5wYXJtcyk7CisgICAgICAgIH0KKyAgICAgICAgYmNtb3NfZnJlZShvYmpfc2VsZWN0b3IpOworICAgIH0KKyAgICBiY21vc19mcmVlKGNtZF9wYXJtcyk7CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gKmJjbWJhbF9hcGljbGlfbG9nOworc3RhdGljIEZJTEUgKmJjbWJhbF9hcGljbGlfbG9nX2ZpbGU7CisKK3N0YXRpYyBpbnQgYmNtYmFsX2FwaWNsaV9sb2dfd3JpdGVfY2IoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBpZiAoYmNtYmFsX2FwaWNsaV9sb2dfZmlsZSA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICBmd3JpdGUoYnVmLCAxLCBzaXplLCBiY21iYWxfYXBpY2xpX2xvZ19maWxlKTsKKyAgICBmZmx1c2goYmNtYmFsX2FwaWNsaV9sb2dfZmlsZSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEVuYWJsZS9kaXNhYmxlIEFQSSBsb2dnaW5nCisgKiAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJmaWxlIiwgIkxvZyBmaWxlLiBVc2UgXCItXCIgdG8gZGlzYWJsZSBsb2dnaW5nIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSk7CisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX2xvZ19oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgY29uc3QgY2hhciAqZm5hbWUgPSBwYXJtWzBdLnZhbHVlLnN0cmluZzsKKyAgICBiY21jbGlfc2Vzc2lvbl9wYXJtIHNlc3Npb25fcGFyYW1zID0KKyAgICB7CisgICAgICAgIC53cml0ZSA9IGJjbWJhbF9hcGljbGlfbG9nX3dyaXRlX2NiLAorICAgICAgICAubmFtZSA9ICJhcGlfbG9nIgorICAgIH07CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgdGltZV90IHN0YXJ0X3RpbWU7CisKKyAgICAvKiBDbG9zZSBleGlzdGluZyBsb2cgc2Vzc2lvbiBpZiBhbnkgKi8KKyAgICBpZiAoYmNtYmFsX2FwaWNsaV9sb2cpCisgICAgeworICAgICAgICBiY21jbGlfbG9nX3NldChCQ01DTElfTE9HX05PTkUsIE5VTEwpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9jbG9zZShiY21iYWxfYXBpY2xpX2xvZyk7CisgICAgICAgIGZjbG9zZShiY21iYWxfYXBpY2xpX2xvZ19maWxlKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2cgPSBOVUxMOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19maWxlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcChmbmFtZSwgIi0iKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICAvKiBTdGFydGluZyBhIG5ldyBsb2cgc2Vzc2lvbiAqLworICAgIGJjbWJhbF9hcGljbGlfbG9nX2ZpbGUgPSBmb3BlbihmbmFtZSwgImEiKTsKKyAgICBpZiAoYmNtYmFsX2FwaWNsaV9sb2dfZmlsZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJDYW4ndCBvcGVuIGZpbGUgJXMgZm9yIGxvZ2dpbmdcbiIsIGZuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgcmMgPSBiY21jbGlfc2Vzc2lvbl9vcGVuX3VzZXIoJnNlc3Npb25fcGFyYW1zLCAmYmNtYmFsX2FwaWNsaV9sb2cpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGZjbG9zZShiY21iYWxfYXBpY2xpX2xvZ19maWxlKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfZmlsZSA9IE5VTEw7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiQ2FuJ3Qgb3BlbiBsb2cgc2Vzc2lvbi4gRXJyb3IgJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgdGltZSgmc3RhcnRfdGltZSk7CisgICAgYmNtY2xpX2xvZ19zZXQoQkNNQ0xJX0xPR19DX0NPTU1FTlQsIGJjbWJhbF9hcGljbGlfbG9nKTsKKyAgICBiY21jbGlfbG9nKCIvKiBBUEkgbG9nZ2luZyBzZXNzaW9uIHN0YXJ0ZWQuICVzICovXG4iLCBjdGltZSgmc3RhcnRfdGltZSkpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBiY21iYWxfYXBpY2xpX2ZpbmRfZGVsX2NtZChiY21jbGlfZW50cnkgKmRpciwgY29uc3QgY2hhciAqY21kX25hbWUpCit7CisgICAgYmNtY2xpX2VudHJ5ICpjbWQ7CisgICAgY21kID0gYmNtY2xpX2NtZF9maW5kKGRpciwgY21kX25hbWUpOworICAgIGlmIChjbWQpCisgICAgeworICAgICAgICBiY21jbGlfdG9rZW5fZGVzdHJveShjbWQpOworICAgIH0KK30KKworLyogVW5yZWdpc3RlcnMgY29tbWFuZHMgYW5kIGRpcmVjdG9yaWVzICovCit2b2lkIGJjbWJhbF9hcGljbGlfZGVsX2NvbW1hbmRzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21jbGlfZW50cnkgKmFwaV9kaXIpCit7CisgICAgYmNtYmFsX2FwaWNsaV9maW5kX2RlbF9jbWQoYXBpX2RpciwgInNldCIpOworICAgIGJjbWJhbF9hcGljbGlfZmluZF9kZWxfY21kKGFwaV9kaXIsICJnZXQiKTsKKyAgICBiY21iYWxfYXBpY2xpX2ZpbmRfZGVsX2NtZChhcGlfZGlyLCAiY2xlYXIiKTsKKyAgICBiY21iYWxfYXBpY2xpX2ZpbmRfZGVsX2NtZChhcGlfZGlyLCAic3RhdCIpOworICAgIGJjbWJhbF9hcGljbGlfZmluZF9kZWxfY21kKGFwaV9kaXIsICJvYmplY3RzIik7CisgICAgYmNtYmFsX2FwaWNsaV9maW5kX2RlbF9jbWQoYXBpX2RpciwgImxvZyIpOworfQorCisvKiBSZWdpc3RlcnMgY29tbWFuZHMgYW5kIGRpcmVjdG9yaWVzICovCitiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX2FkZF9jb21tYW5kcyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICphcGlfZGlyKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgY3VycmVudF9zZXNzaW9uID0gc2Vzc2lvbjsKKworICAgIC8qIE5vdyBnZW5lcmF0ZSBhbmQgYWRkIGNvbW1hbmRzICovCisgICAgcmMgPSBiY21iYWxfYXBpY2xpX2FkZChhcGlfZGlyLCAic2V0IiwgIlNldCBvYmplY3QgY29uZmlndXJhdGlvbiIsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLAorICAgICAgICBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1csIGJjbWJhbF9hcGljbGlfc2V0X2hhbmRsZXIsIEJDTUJBTF9BUElDTElfRkxBR1NfTk9ORSk7CisgICAgcmMgPSByYyA/IHJjIDogYmNtYmFsX2FwaWNsaV9hZGQoYXBpX2RpciwgImdldCIsICJHZXQgb2JqZWN0IGNvbmZpZ3VyYXRpb24iLCBCQ01CQUxfTUdUX0dST1VQX0NGRywKKyAgICAgICAgQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SLCBiY21iYWxfYXBpY2xpX2dldF9oYW5kbGVyLCBCQ01CQUxfQVBJQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IGJjbWJhbF9hcGljbGlfYWRkKGFwaV9kaXIsICJjbGVhciIsICJDbGVhciBvYmplY3QgY29uZmlndXJhdGlvbiIsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLAorICAgICAgICBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1IsIGJjbWJhbF9hcGljbGlfY2xlYXJfaGFuZGxlciwgQkNNQkFMX0FQSUNMSV9GTEFHU19JR05PUkVfRklFTERTKTsKKyAgICByYyA9IHJjID8gcmMgOiBiY21iYWxfYXBpY2xpX2FkZChhcGlfZGlyLCAic3RhdCIsICJHZXQgc3RhdGlzdGljcyIsIEJDTUJBTF9NR1RfR1JPVVBfU1RBVCwKKyAgICAgICAgQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SLCBiY21iYWxfYXBpY2xpX3N0YXRfaGFuZGxlciwgQkNNQkFMX0FQSUNMSV9GTEFHU19OT05FKTsKKworICAgIC8qIExpc3QgYWxsIHN5c3RlbSBvYmplY3RzICovCisgICAgcmMgPSByYyA/IHJjIDogYmNtY2xpX2NtZF9hZGQoYXBpX2RpciwgIm9iamVjdHMiLCBiY21iYWxfYXBpY2xpX29iamVjdHNfaGFuZGxlciwKKyAgICAgICAgIk9iamVjdCBUeXBlcyIsIEJDTUNMSV9BQ0NFU1NfR1VFU1QsIE5VTEwsIE5VTEwpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGFwaV9kaXIsICJsb2ciLCAiTG9nIEFQSSBjYWxscyIsIGJjbWJhbF9hcGljbGlfbG9nX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImZpbGUiLCAiTG9nIGZpbGUuIFVzZSBcIi1cIiB0byBkaXNhYmxlIGxvZ2dpbmciLCBCQ01DTElfUEFSTV9TVFJJTkcsIDApKTsKKworICAgIHJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliYmFsYXBpY2xpL2JhbF9hcGlfY2xpLmggYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaWNsaS9iYWxfYXBpX2NsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhY2MyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaWNsaS9iYWxfYXBpX2NsaS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNQkFMX0FQSUNMSV9IXworI2RlZmluZSBCQ01CQUxfQVBJQ0xJX0hfCisKKyNpbmNsdWRlIDxiY21jbGkuaD4KKwordm9pZCBiY21iYWxfYXBpY2xpX2RlbF9jb21tYW5kcyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICphcGlfZGlyKTsKKworLyogQWRkIEJBTCBDTEkgY29tbWFuZHMgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfYWRkX2NvbW1hbmRzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21jbGlfZW50cnkgKmFwaV9kaXIpOworCisjZW5kaWYgLyogQkNNQkFMX0FQSUNMSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGlfZHVtcC5jIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGlfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMzQ5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaWNsaS9iYWxfYXBpX2NsaV9kdW1wLmMKQEAgLTAsMCArMSw4MjMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiYWxfb2JqLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSAiYmFsX2FwaV9jbGlfaGVscGVycy5oIgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01CQUxfQVBJQ0xJX09VVFBVVF9TVFlMRV9TVEQsCisgICAgQkNNQkFMX0FQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUCit9IGJjbWJhbF9hcGljbGlfb3V0cHV0X3N0eWxlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNvbnN0IGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciAqdHlwZTsKKyAgICB2b2lkICpkYXRhOworICAgIHVpbnQ4X3QgYml0OworfSBiY21iYWxfYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbzsKKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfZHVtcF9hcnJheSgKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICBjb25zdCBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIHZvaWQgKmRhdGEsCisgICAgdWludDMyX3Qgc2l6ZSwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGJjbWJhbF9hcGljbGlfb3V0cHV0X3N0eWxlIHN0eWxlLAorICAgIGNvbnN0IGJjbWJhbF9hcGljbGlfcHJlc2VuY2VfbWFza19pbmZvICpwcmVzZW5jZV9tYXNrKTsKKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfcmVhZF9zbnVtKAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgKnRkLCB2b2lkICpkYXRhLCBpbnQ2NF90ICpuKQoreworICAgIHN3aXRjaCAodGQtPnNpemUpCisgICAgeworICAgIGNhc2UgMToKKyAgICB7CisgICAgICAgIGludDhfdCBuMSA9ICooaW50OF90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMjoKKyAgICB7CisgICAgICAgIGludDE2X3QgbjIgPSAqKGludDE2X3QgKilkYXRhOworICAgICAgICAqbiA9IG4yOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA0OgorICAgIHsKKyAgICAgICAgaW50MzJfdCBuNCA9ICooaW50MzJfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDg6CisgICAgeworICAgICAgICBtZW1jcHkobiwgZGF0YSwgc2l6ZW9mKCpuKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKiBudW1iZXIgc2l6ZSAldSBpcyBub3Qgc3VwcG9ydGVkXG4iLCB0ZC0+c2l6ZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2FwaWNsaV9yZWFkX3VudW0oCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciAqdGQsIHZvaWQgKmRhdGEsIHVpbnQ2NF90ICpuKQoreworICAgIHN3aXRjaCAodGQtPnNpemUpCisgICAgeworICAgIGNhc2UgMToKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgbjEgPSAqKHVpbnQ4X3QgKilkYXRhOworICAgICAgICAqbiA9IG4xOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOgorICAgIHsKKyAgICAgICAgdWludDE2X3QgbjIgPSAqKHVpbnQxNl90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDoKKyAgICB7CisgICAgICAgIHVpbnQzMl90IG40ID0gKih1aW50MzJfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDg6CisgICAgeworICAgICAgICBtZW1jcHkobiwgZGF0YSwgc2l6ZW9mKCpuKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKiBudW1iZXIgc2l6ZSAldSBpcyBub3Qgc3VwcG9ydGVkXG4iLCB0ZC0+c2l6ZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBiY21iYWxfYXBpY2xpX3N0cmNhdF91cHBlcihjaGFyICpkZXN0LCB1aW50MzJfdCBkZXN0X2xlbiwgY29uc3QgY2hhciAqc3JjLCB1aW50MzJfdCBzcmNfbGVuKQoreworICAgIHVpbnQzMl90IHNyY19pZHg7CisgICAgdWludDMyX3QgZGVzdF9pZHg7CisKKyAgICBmb3IgKGRlc3RfaWR4ID0gMDsgZGVzdF9pZHggPCBkZXN0X2xlbiAtIDE7ICsrZGVzdF9pZHgpCisgICAgeworICAgICAgICBpZiAoZGVzdFtkZXN0X2lkeF0gPT0gJ1wwJykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNyY19pZHggPSAwOyBzcmNfaWR4IDwgc3JjX2xlbiAmJiBkZXN0X2lkeCA8IGRlc3RfbGVuIC0gMTsgKytzcmNfaWR4LCArK2Rlc3RfaWR4KQorICAgIHsKKyAgICAgICAgZGVzdFtkZXN0X2lkeF0gPSBzcmNbc3JjX2lkeF07CisgICAgICAgIGlmIChkZXN0W2Rlc3RfaWR4XSA+PSAnYScgJiYgZGVzdFtkZXN0X2lkeF0gPD0gJ3onKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0W2Rlc3RfaWR4XSA9ICdBJyArIChkZXN0W2Rlc3RfaWR4XSAtICdhJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZXN0W2Rlc3RfaWR4XSA9ICdcMCc7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpiY21iYWxfYXBpY2xpX2dldF9jX2VudW1faWQoY29uc3QgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyICp0ZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBzdGF0aWMgY2hhciBmdWxsX25hbWVfYnVmWzI1Nl07CisgICAgZnVsbF9uYW1lX2J1ZlswXSA9ICdcMCc7CisgICAgYmNtYmFsX2FwaWNsaV9zdHJjYXRfdXBwZXIoZnVsbF9uYW1lX2J1Ziwgc2l6ZW9mKGZ1bGxfbmFtZV9idWYpLCB0ZC0+bmFtZSwgc3RybGVuKHRkLT5uYW1lKSk7CisgICAgYmNtYmFsX2FwaWNsaV9zdHJjYXRfdXBwZXIoZnVsbF9uYW1lX2J1Ziwgc2l6ZW9mKGZ1bGxfbmFtZV9idWYpLCAiXyIsIDEpOworICAgIGJjbWJhbF9hcGljbGlfc3RyY2F0X3VwcGVyKGZ1bGxfbmFtZV9idWYsIHNpemVvZihmdWxsX25hbWVfYnVmKSwgbmFtZSwgc3RybGVuKG5hbWUpKTsKKyAgICByZXR1cm4gZnVsbF9uYW1lX2J1ZjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfZHVtcF9zaW1wbGVfZGF0YV90eXBlKAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgIGNvbnN0IGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciAqdGQsCisgICAgdm9pZCAqZGF0YSwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGJjbWJhbF9hcGljbGlfb3V0cHV0X3N0eWxlIHN0eWxlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIHN3aXRjaCAodGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TTlVNOiAgICAgICAvKiBzaWduZWQgbnVtYmVyICovCisgICAgeworICAgICAgICBpbnQ2NF90IG4gPSAwOworICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfcmVhZF9zbnVtKHNlc3Npb24sIHRkLCBkYXRhLCAmbik7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJWxsZCIsIChsb25nIGxvbmcpbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfVU5VTTogICAgICAgLyogdW5zaWduZWQgbnVtYmVyICovCisgICAgeworICAgICAgICB1aW50NjRfdCBuID0gMDsKKyAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX3JlYWRfdW51bShzZXNzaW9uLCB0ZCwgZGF0YSwgJm4pOworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKW4pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOVU1fSEVYOiAgIC8qIHVuc2lnbmVkIG51bWJlciBwcmludGVkIGluIGhleCAqLworICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIHJjID0gYmNtYmFsX2FwaWNsaV9yZWFkX3VudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKW4pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0ZMT0FUOiAgICAgIC8qIGZsb2F0aW5nLXBvaW50IG51bWJlciAqLworICAgIHsKKyAgICAgICAgaWYgKHRkLT5zaXplID09IHNpemVvZihmbG9hdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJWYiLCAqKGZsb2F0ICopZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGQtPnNpemUgPT0gc2l6ZW9mKGRvdWJsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJWYiLCAqKGRvdWJsZSAqKWRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKiogZmxvYXRpbmctcG9pbnQgbnVtYmVyIG9mIHdpZHRoICV1IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIHRkLT5zaXplKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfQk9PTDoKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5vX3N0ciA9IHN0eWxlID09IEJDTUJBTF9BUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCA/ICJCQ01PU19GQUxTRSIgOiAibm8iOworICAgICAgICBjb25zdCBjaGFyICp5ZXNfc3RyID0gc3R5bGUgPT0gQkNNQkFMX0FQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUID8gIkJDTU9TX1RSVUUiIDogInllcyI7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfcmVhZF91bnVtKHNlc3Npb24sIHRkLCBkYXRhLCAmbik7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMiLCBuID09IDAgPyBub19zdHIgOiB5ZXNfc3RyKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJJTkc6ICAgICAvKiBzdHJpbmcgKi8KKyAgICB7CisgICAgICAgIGlmICh0ZC0+c2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlwiJXNcIiIsIChjaGFyICopZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBrbm93IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiXCIlLipzXCIiLCB0ZC0+c2l6ZSwgKGNoYXIgKilkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0lQVjQ6ICAgICAgIC8qIElQdjQgYWRkcmVzcyAqLworICAgIHsKKyAgICAgICAgdWludDMyX3QgaXA7CisgICAgICAgIG1lbWNweSgmaXAsIGRhdGEsIHNpemVvZihpcCkpOworICAgICAgICBiY21jbGlfcHJpbnQoCisgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgc3R5bGUgPT0gQkNNQkFMX0FQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUID8gInsgJWQsJWQsJWQsJWQgfSIgOiAiJWQuJWQuJWQuJWQiLAorICAgICAgICAgICAgKGlwID4+IDI0KSAmIDB4ZmYsIChpcCA+PiAxNikgJiAweGZmLCAoaXAgPj4gOCkgJiAweGZmLCBpcCAmIDB4ZmYpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX01BQzogICAgICAgIC8qIE1BQyBhZGRyZXNzICovCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBtYWM7CisgICAgICAgIG1lbWNweShtYWMudTgsIGRhdGEsIHNpemVvZihtYWMudTgpKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KAorICAgICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgIHN0eWxlID09IEJDTUJBTF9BUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCA/CisgICAgICAgICAgICAgICAgInt7IDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4IH19IiA6CisgICAgICAgICAgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgIG1hYy51OFswXSwgbWFjLnU4WzFdLCBtYWMudThbMl0sIG1hYy51OFszXSwgbWFjLnU4WzRdLCBtYWMudThbNV0pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU06ICAgICAgIC8qIGVudW0gKi8KKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICBjb25zdCBjaGFyICpzOworICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfcmVhZF91bnVtKHNlc3Npb24sIHRkLCBkYXRhLCAmbik7CisgICAgICAgIEJVR19PTih0ZC0+eC5lID09IE5VTEwpOworICAgICAgICBzID0gYmNtY2xpX2VudW1fc3RyaW5ndmFsKHRkLT54LmUsIChsb25nKW4pOworICAgICAgICBpZiAoc3R5bGUgPT0gQkNNQkFMX0FQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgICAgICB7CisgICAgICAgICAgICBzID0gYmNtYmFsX2FwaWNsaV9nZXRfY19lbnVtX2lkKHRkLCBzKTsKKyAgICAgICAgfQorICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiVzIiwgcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTV9NQVNLOgorICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICAgIGNvbnN0IGNoYXIgKm5vbmUgPSBOVUxMOworICAgICAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlID0gdGQtPnguZTsKKyAgICAgICAgYmNtb3NfYm9vbCBmaXJzdCA9IEJDTU9TX1RSVUU7CisgICAgICAgIEJVR19PTih2YWx1ZSA9PSBOVUxMKTsKKyAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX3JlYWRfdW51bShzZXNzaW9uLCB0ZCwgZGF0YSwgJm4pOworICAgICAgICB3aGlsZSAodmFsdWUtPm5hbWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlLT52YWwgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub25lID0gdmFsdWUtPm5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHZhbHVlLT52YWwgJiBuKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMgPSB2YWx1ZS0+bmFtZTsKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQkNNQkFMX0FQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IGJjbWJhbF9hcGljbGlfZ2V0X2NfZW51bV9pZCh0ZCwgcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMlcyIsIGZpcnN0ID8gIiIgOiAoc3R5bGUgPT0gQkNNQkFMX0FQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUID8gInwiIDogQkNNQ0xJX0VOVU1fTUFTS19ERUxfU1RSKSwgcyk7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICBuIC09IHZhbHVlLT52YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3ZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlcyIsIChzdHlsZSA9PSBCQ01CQUxfQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpIHx8IChOVUxMID09IG5vbmUpID8gIjAiIDogbm9uZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKiogdHlwZSAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCAoaW50KXRkLT5iYXNlX3R5cGUpOworICAgICAgICByYyA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworCisvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzICovCitzdGF0aWMgaW50IGJjbWJhbF9hcGljbGlfZ2V0X251bV9lbnVtX3ZhbHMoY29uc3QgYmNtY2xpX2VudW1fdmFsICp2YWxzKQoreworICAgIGNvbnN0IGJjbWNsaV9lbnVtX3ZhbCAqdiA9IHZhbHM7CisgICAgd2hpbGUgKHYgJiYgdi0+bmFtZSkKKyAgICB7CisgICAgICAgICsrdjsKKyAgICB9CisgICAgcmV0dXJuICh2IC0gdmFscyk7Cit9CisKKy8qIGhlbHBlciBmdW5jdGlvbiB0byBza2lwIHRoZSAidS4iIGluIGZyb250IG9mIHVuaW9uIGZpZWxkIG5hbWVzICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmJjbWJhbF9hcGljbGlfc2tpcF91bmlvbl9wcmVmaXgoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpZiAobmFtZVswXSA9PSAndScgJiYgbmFtZVsxXSA9PSAnLicpCisgICAgeworICAgICAgICBuYW1lICs9IDI7CisgICAgfQorICAgIHJldHVybiBuYW1lOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBiY21iYWxfYXBpY2xpX2lzX3ZhbHVlX3NldCgKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICBjb25zdCBiY21iYWxfYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbyAqcHJlc2VuY2VfbWFzaykKK3sKKyAgICB1aW50NjRfdCBwbV92YWx1ZV9udW0gPSAwOworICAgIGlmICghcHJlc2VuY2VfbWFzayB8fCAhcHJlc2VuY2VfbWFzay0+dHlwZSkKKyAgICB7CisgICAgICAgIC8qIG5vIHByZXNlbmNlIG1hc2sgLSBhbGwgdmFsdWVzIGFyZSBpbXBsaWNpdGx5IHNldCAqLworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgYmNtYmFsX2FwaWNsaV9yZWFkX3VudW0oc2Vzc2lvbiwgcHJlc2VuY2VfbWFzay0+dHlwZSwgcHJlc2VuY2VfbWFzay0+ZGF0YSwgJnBtX3ZhbHVlX251bSk7CisgICAgcmV0dXJuICgocG1fdmFsdWVfbnVtID4+IHByZXNlbmNlX21hc2stPmJpdCkgJiAxKSAhPSAwOworfQorCisvKiBEdW1wIGRhdGEgdHlwZSAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICB2b2lkICpkYXRhLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgdWludDMyX3QgbnVtX2VudHJpZXMsCisgICAgdWludDMyX3QgZW50cnlfc2l6ZSwKKyAgICBiY21iYWxfYXBpY2xpX291dHB1dF9zdHlsZSBzdHlsZSwKKyAgICBjb25zdCBiY21iYWxfYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbyAqcHJlc2VuY2VfbWFzaykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBzd2l0Y2ggKHRkLT5iYXNlX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVDoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZjsKKyAgICAgICAgICAgIGNoYXIgZnVsbF9uYW1lW0JDTUJBTF9BUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEhdOworICAgICAgICAgICAgaWYgKCF0ZC0+eC5zLm51bV9maWVsZHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBCVUdfT04oIXRkLT54LnMuZmllbGRzKTsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBCQ01CQUxfQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJ7ICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChmID0gMDsgZiA8IHRkLT54LnMubnVtX2ZpZWxkczsgZisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgKmZsZCA9ICZ0ZC0+eC5zLmZpZWxkc1tmXTsKKyAgICAgICAgICAgICAgICB2b2lkICpmZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBmbGQtPm9mZnNldCk7CisgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmVzZW5jZV9tYXNrX2luZm8gZmllbGRfcG0gPSB7fTsKKyAgICAgICAgICAgICAgICBpZiAoKCh0ZC0+eC5zLmZpZWxkc1swXS5mbGFncyAmIEJDTUJBTF9BUElDTElfRklFTERfREVTQ1JfRkxBR1NfUFJFU0VOQ0VfTUFTSykgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUgIT0gQkNNQkFMX0FQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIHN0cnVjdCBoYXMgYSBwcmVzZW5jZSBtYXNrLCBza2lwIHRoZSBwcmVzZW5jZSBtYXNrIGZpZWxkIGl0c2VsZiwgdGhlbiByZWNvcmQgdGhlIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBwcmVzZW5jZSBtYXNrIHNvIHdlIGNhbiBjaGVjayBpdCBsYXRlciBmb3IgZWFjaCBlbnRyeS4gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGYgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaWVsZF9wbS50eXBlID0gdGQtPngucy5maWVsZHNbMF0udHlwZTsKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfcG0uZGF0YSA9ICh1aW50OF90ICopZGF0YSArIHRkLT54LnMuZmllbGRzWzBdLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfcG0uYml0ID0gKHVpbnQ4X3QpKGYgLSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0eWxlID09IEJDTUJBTF9BUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCAmJiBmID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoZnVsbF9uYW1lLCBuYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCAiLiIsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIHJjID0gYmNtYmFsX2FwaWNsaV9kdW1wX2RhdGFfdHlwZShzZXNzaW9uLCBmbGQtPnR5cGUsIGZkYXRhLCBmdWxsX25hbWUsIG51bV9lbnRyaWVzLCBlbnRyeV9zaXplLCBzdHlsZSwgJmZpZWxkX3BtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBCQ01CQUxfQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIgfSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOSU9OOgorICAgICAgICB7CisgICAgICAgICAgICAvKiBQcmludCBmaWVsZHMgdXAgdG8gc2VsZWN0b3IsIHRoZW4gc2VsZWN0b3IsIHRoZW4gc2VsZWN0ZWQgc3ViLXN0cnVjdHVyZSAqLworICAgICAgICAgICAgdWludDE2X3QgZjsKKyAgICAgICAgICAgIGNoYXIgZnVsbF9uYW1lW0JDTUJBTF9BUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEhdOworICAgICAgICAgICAgY29uc3QgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciAqZmxkOworICAgICAgICAgICAgdm9pZCAqZmRhdGE7CisgICAgICAgICAgICBpbnQ2NF90IHNlbGVjdG9yX3ZhbCA9IDA7CisgICAgICAgICAgICBpbnQgbnVtX3VuaW9uX3ZhbHM7CisKKyAgICAgICAgICAgIGlmICghdGQtPngudS5udW1fY29tbW9uX2ZpZWxkcykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIEJVR19PTighdGQtPngudS5jb21tb25fZmllbGRzKTsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBCQ01CQUxfQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJ7ICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogQ29tbW9uIGZpZWxkcywgaW5jbHVkaW5nIHNlbGVjdG9yICovCisgICAgICAgICAgICBmb3IgKGYgPSAwOyBmIDw9IHRkLT54LnUuY2xhc3NpZmllcl9pZHggJiYgIXJjOyBmKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgICAgICAgICBmZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBmbGQtPm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNweShmdWxsX25hbWUsIG5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxkLT5uYW1lICYmIHN0cmxlbihmbGQtPm5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCAiLiIsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCBmbGQtPm5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX2R1bXBfZGF0YV90eXBlKHNlc3Npb24sIGZsZC0+dHlwZSwgZmRhdGEsIGZ1bGxfbmFtZSwgbnVtX2VudHJpZXMsIGVudHJ5X3NpemUsIHN0eWxlLCBwcmVzZW5jZV9tYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAoZiA9PSB0ZC0+eC51LmNsYXNzaWZpZXJfaWR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSByYyA/IHJjIDogYmNtYmFsX2FwaWNsaV9yZWFkX3NudW0oc2Vzc2lvbiwgZmxkLT50eXBlLCBmZGF0YSwgJnNlbGVjdG9yX3ZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBCQ01CQUxfQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiKioqaW50ZXJuYWwgZXJyb3Igd2hlbiBkdW1waW5nIGZpZWxkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0ZC0+eC51LmNvbW1vbl9maWVsZHNbZl0ubmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW1fdW5pb25fdmFscyA9IGJjbWJhbF9hcGljbGlfZ2V0X251bV9lbnVtX3ZhbHModGQtPngudS5jb21tb25fZmllbGRzW3RkLT54LnUuY2xhc3NpZmllcl9pZHhdLnR5cGUtPnguZSk7CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXNlbGVjdG9yX3ZhbCA+PSBudW1fdW5pb25fdmFscykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKmludmFsaWQgdW5pb24gc2VsZWN0b3IgdmFsdWUgJWxsZFxuIiwgKGxvbmcgbG9uZylzZWxlY3Rvcl92YWwpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb21tb24gZmllbGRzIGZvbGxvd2luZyBzZWxlY3RvciAqLworICAgICAgICAgICAgZm9yICg7IGYgPCB0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzOyBmKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgICAgICAgICBmZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBmbGQtPm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQkNNQkFMX0FQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNweShmdWxsX25hbWUsIG5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxkLT5uYW1lICYmIHN0cmxlbihmbGQtPm5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCAiLiIsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCBmbGQtPm5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX2R1bXBfZGF0YV90eXBlKHNlc3Npb24sIGZsZC0+dHlwZSwgZmRhdGEsIGZ1bGxfbmFtZSwgbnVtX2VudHJpZXMsIGVudHJ5X3NpemUsIHN0eWxlLCBwcmVzZW5jZV9tYXNrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2VsZWN0ZWQgZmllbGQgKi8KKyAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LnVuaW9uX2ZpZWxkc1tzZWxlY3Rvcl92YWxdOworICAgICAgICAgICAgaWYgKGZsZC0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQkNNQkFMX0FQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJ7IC4lcyA9ICIsIGJjbWJhbF9hcGljbGlfc2tpcF91bmlvbl9wcmVmaXgoZmxkLT5uYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZkYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGZsZC0+b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGZ1bGxfbmFtZSwgbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChmbGQtPm5hbWUgJiYgc3RybGVuKGZsZC0+bmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgZmxkLT50eXBlLCBmZGF0YSwgZnVsbF9uYW1lLCBudW1fZW50cmllcywgZW50cnlfc2l6ZSwgc3R5bGUsIHByZXNlbmNlX21hc2spOworICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBCQ01CQUxfQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiB9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0eWxlID09IEJDTUJBTF9BUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiB9Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfQVJSX0ZJWEVEOiAvKiBmaXhlZCBhcnJheSAqLworICAgICAgICB7CisgICAgICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfZHVtcF9hcnJheShzZXNzaW9uLCB0ZC0+eC5hcnJfZml4ZWQuZWxlbV90eXBlLCBkYXRhLCB0ZC0+eC5hcnJfZml4ZWQuc2l6ZSwgbmFtZSwgc3R5bGUsIHByZXNlbmNlX21hc2spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0FSUl9EWU46ICAgLyogZHluYW1pYyBhcnJheSB0aGF0IHNob3VsZCBiZSBwcmludGVkIGFzIGJ1ZmZlciAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBSZWFkIGxlbmd0aCAqLworICAgICAgICAgICAgdWludDMyX3QgYXJyYXlfc2l6ZTsKKyAgICAgICAgICAgIGxvbmcgYmFzZV9wdHI7CisKKyAgICAgICAgICAgIHN3aXRjaCAodGQtPnguYXJyX2R5bi5sZW5fc2l6ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiBhcnJheV9zaXplID0gKih1aW50OF90ICopZGF0YTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBhcnJheV9zaXplID0gKih1aW50MTZfdCAqKWRhdGE7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogYXJyYXlfc2l6ZSA9ICoodWludDMyX3QgKilkYXRhOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKiogJXM6IGR5biBhcnJheSBsZW5fc2l6ZSAldSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBuYW1lLCB0ZC0+eC5hcnJfZHluLmxlbl9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJhc2VfcHRyID0gQkNNT1NfUk9VTkRfVVAoKGxvbmcpZGF0YSArIHRkLT54LmFycl9keW4ubGVuX3NpemUsIHNpemVvZih2b2lkICopKTsKKyAgICAgICAgICAgIEJVR19PTighYmFzZV9wdHIpOworICAgICAgICAgICAgZGF0YSA9ICoodm9pZCAqKiliYXNlX3B0cjsKKyAgICAgICAgICAgIHJjID0gYmNtYmFsX2FwaWNsaV9kdW1wX2FycmF5KHNlc3Npb24sIHRkLT54LmFycl9keW4uZWxlbV90eXBlLCBkYXRhLCBhcnJheV9zaXplLCBuYW1lLCBzdHlsZSwgcHJlc2VuY2VfbWFzayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZpbmFsbHkhIFNpbXBsZSB0eXBlIHRoYXQgbWFwcyB0byBhIHNpbmdsZSBDTEkgcGFyYW1ldGVyICovCisgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJlc2VuY2VfbWFza19pbmZvIGxvY2FsX3BtOworCisgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgc2luZ2xlIHZhbHVlIGFuZCB0aGF0IHZhbHVlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcHJlc2VuY2UgbWFzaywganVzdCBza2lwIGl0IGVudGlyZWx5ICovCisgICAgICAgICAgICBpZiAobnVtX2VudHJpZXMgPT0gMSAmJiAhYmNtYmFsX2FwaWNsaV9pc192YWx1ZV9zZXQoc2Vzc2lvbiwgcHJlc2VuY2VfbWFzaykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHlsZSAhPSBCQ01CQUxfQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiAgICVzPSIsIG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW51bV9lbnRyaWVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sIEJDTUNMSV9BUlJBWV9FTVBUWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEdW1wIHNpbXBsZSB2YWx1ZSBvciBhcnJheSBvZiBzaW1wbGUgdmFsdWVzICovCisgICAgICAgICAgICBsb2NhbF9wbSA9IHByZXNlbmNlX21hc2sgPyAqcHJlc2VuY2VfbWFzayA6IChiY21iYWxfYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbyl7fTsKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBudW1fZW50cmllczsgbisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIsIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHByZXNlbmNlIG1hc2ssIG1ha2Ugc3VyZSB0byBwcmludCBhIHNwZWNpYWwgdG9rZW4gaWYgdGhlIHZhbHVlIGlzIHVuc2V0ICovCisgICAgICAgICAgICAgICAgaWYgKGJjbWJhbF9hcGljbGlfaXNfdmFsdWVfc2V0KHNlc3Npb24sICZsb2NhbF9wbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfZHVtcF9zaW1wbGVfZGF0YV90eXBlKHNlc3Npb24sIHRkLCBkYXRhLCBuYW1lLCBzdHlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCBCQ01DTElfUEFSTV9OT19WQUxVRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgZW50cnlfc2l6ZSk7CisgICAgICAgICAgICAgICAgbG9jYWxfcG0uZGF0YSA9ICh2b2lkICopKChsb25nKWxvY2FsX3BtLmRhdGEgKyBlbnRyeV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHlsZSAhPSBCQ01CQUxfQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiBEdW1wIGFycmF5ICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2FwaWNsaV9kdW1wX2FycmF5KAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgIGNvbnN0IGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciAqdGQsCisgICAgdm9pZCAqZGF0YSwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgYmNtYmFsX2FwaWNsaV9vdXRwdXRfc3R5bGUgc3R5bGUsCisgICAgY29uc3QgYmNtYmFsX2FwaWNsaV9wcmVzZW5jZV9tYXNrX2luZm8gKnByZXNlbmNlX21hc2spCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogUHJpbnQgYXMgYnVmZmVyIG9yIGVsZW1lbnQgYnkgZWxlbWVudCA/ICovCisgICAgaWYgKHN0eWxlID09IEJDTUJBTF9BUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAieyAiKTsKKyAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX2R1bXBfZGF0YV90eXBlKHNlc3Npb24sIHRkLCBkYXRhLCBuYW1lLCBzaXplLCB0ZC0+c2l6ZSwgc3R5bGUsIHByZXNlbmNlX21hc2spOworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiB9Iik7CisgICAgfQorICAgIGVsc2UgaWYgKCh0ZC0+YmFzZV90eXBlID09IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOVU0gfHwKKyAgICAgICAgdGQtPmJhc2VfdHlwZSA9PSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9VTlVNX0hFWCkgJiYgdGQtPnNpemUgPT0gMSkKKyAgICB7CisgICAgICAgIGlmIChiY21iYWxfYXBpY2xpX2lzX3ZhbHVlX3NldChzZXNzaW9uLCBwcmVzZW5jZV9tYXNrKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIgICAlcz1cbiIsIG5hbWUpOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25faGV4ZHVtcChzZXNzaW9uLCBkYXRhLCAwLCBzaXplLCAiICAgICAgIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX2R1bXBfZGF0YV90eXBlKHNlc3Npb24sIHRkLCBkYXRhLCBuYW1lLCBzaXplLCB0ZC0+c2l6ZSwgc3R5bGUsIHByZXNlbmNlX21hc2spOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIER1bXAgcHJvcGVydHkgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfZHVtcF9wcm9wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKnBkLCB2b2lkICpwcm9wX2RhdGEpCit7CisgICAgcmV0dXJuIGJjbWJhbF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoCisgICAgICAgIHNlc3Npb24sIHBkLT50eXBlLCBwcm9wX2RhdGEsIHBkLT5uYW1lLCAxLCAwLCBCQ01CQUxfQVBJQ0xJX09VVFBVVF9TVFlMRV9TVEQsIE5VTEwpOworfQorCisvKiBEdW1wIGEgc2luZ2xlIHByb3BlcnR5IHZhbHVlIGluIEMgaW5pdGlhbGl6ZXIgZm9ybWF0ICovCitiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX2R1bXBfcHJvcF9pbml0aWFsaXplcigKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICpwZCwgdm9pZCAqcHJvcF9kYXRhKQoreworICAgIHJldHVybiBiY21iYWxfYXBpY2xpX2R1bXBfZGF0YV90eXBlKAorICAgICAgICBzZXNzaW9uLCBwZC0+dHlwZSwgcHJvcF9kYXRhLCBwZC0+bmFtZSwgMSwgMCwgQkNNQkFMX0FQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklULCBOVUxMKTsKK30KKworLyogQ2FsY3VsYXRlIHByb3BlcnR5IHBvaW50ZXIgZ2l2ZW4gdGhlIGdyb3VwIGRhdGEgcG9pbnRlciBhbmQgcHJvcGVydHkgZGVzY3JpcHRpb24gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqYmNtYmFsX2FwaWNsaV9wcm9wX2RhdGFfcHRyKHZvaWQgKmdyb3VwX3B0ciwgY29uc3QgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICpwZCkKK3sKKyAgICByZXR1cm4gKHZvaWQgKikoKGxvbmcpZ3JvdXBfcHRyICsgcGQtPm9mZnNldCk7Cit9CisKKy8qIER1bXAgb2JqZWN0IGRhdGEgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX2R1bXBfZGF0YShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtYmFsX29iaiAqbXNnLCB2b2lkICpkYXRhLCB1aW50MzJfdCBkYXRhX3NpemUpCit7CisgICAgdWludDE2X3QgcHJvcDsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgY29uc3QgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICpwZDsKKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiZGF0YTpcbiIpOworICAgIGZvciAocHJvcCA9IDA7CisgICAgICAgICBiY21iYWxfYXBpY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICB2b2lkICpwcm9wX2RhdGEgPSBiY21iYWxfYXBpY2xpX3Byb3BfZGF0YV9wdHIoZGF0YSwgcGQpOworICAgICAgICBpZiAoIShtc2ctPnByZXNlbmNlX21hc2sgJiAoMUxMIDw8IHByb3ApKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIXByb3BfZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQlVHX09OKHBkLT5vZmZzZXQgPiBkYXRhX3NpemUpOworICAgICAgICByYyA9IGJjbWJhbF9hcGljbGlfZHVtcF9wcm9wKHNlc3Npb24sIHBkLCBwcm9wX2RhdGEpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiBEdW1wIG9iamVjdCBrZXkgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX2R1bXBfa2V5KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21iYWxfb2JqICptc2csIHZvaWQgKmtleSwgdWludDMyX3Qga2V5X3NpemUpCit7CisgICAgdWludDE2X3QgcHJvcDsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgY29uc3QgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICpwZDsKKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAia2V5OlxuIik7CisgICAgZm9yIChwcm9wID0gMDsKKyAgICAgICAgIGJjbWJhbF9hcGljbGlfb2JqZWN0X3Byb3BlcnR5KG1zZy0+b2JqX3R5cGUsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICB2b2lkICpwcm9wX2RhdGEgPSBiY21iYWxfYXBpY2xpX3Byb3BfZGF0YV9wdHIoa2V5LCBwZCk7CisgICAgICAgIGlmICghcHJvcF9kYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBCVUdfT04ocGQtPm9mZnNldCA+IGtleV9zaXplKTsKKyAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX2R1bXBfcHJvcChzZXNzaW9uLCBwZCwgcHJvcF9kYXRhKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworY29uc3QgY2hhciAqYmNtYmFsX2FwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKGJjbWJhbF9tZ3RfZ3JvdXAgZ3JvdXApCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnN0cl90YWJsZVtCQ01CQUxfTUdUX0dST1VQX19OVU1fT0ZdID0KKyAgICB7CisgICAgICAgIFtCQ01CQUxfTUdUX0dST1VQX0tFWV0gICAgICA9ICJrZXkiLAorICAgICAgICBbQkNNQkFMX01HVF9HUk9VUF9DRkddICAgICAgPSAiY2ZnIiwKKyAgICAgICAgW0JDTUJBTF9NR1RfR1JPVVBfU1RBVF0gICAgID0gInN0YXQiLAorICAgICAgICBbQkNNQkFMX01HVF9HUk9VUF9BVVRPXSAgICAgPSAiYXV0byIsCisgICAgICAgIFtCQ01CQUxfTUdUX0dST1VQX0FVVE9fQ0ZHXSA9ICJhdXRvX2NmZyIsCisgICAgfTsKKyAgICByZXR1cm4gKGdyb3VwID49IEJDTUJBTF9NR1RfR1JPVVBfX05VTV9PRikgPyAiPHVua25vd24+IiA6IHN0cl90YWJsZVtncm91cF07Cit9CisKKy8qIER1bXAgbWVzc2FnZSAqLworYmNtb3NfZXJybm8gYmNtYmFsX2FwaWNsaV9tc2dfZHVtcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtYmFsX29iaiAqbXNnKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGNvbnN0IGNoYXIgKm5hbWUsICpkZXNjcjsKKyAgICB1aW50MzJfdCBrZXlfc2l6ZTsKKyAgICB1aW50MzJfdCBrZXlfb2Zmc2V0OworICAgIHVpbnQzMl90IGRhdGFfc2l6ZSA9IDA7CisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQ7CisgICAgdm9pZCAqa2V5ID0gTlVMTDsKKyAgICB2b2lkICpkYXRhID0gTlVMTDsKKworICAgIHJjID0gYmNtYmFsX2FwaWNsaV9vYmplY3RfbmFtZShtc2ctPm9ial90eXBlLCAmbmFtZSwgJmRlc2NyKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBnb3RvIGR1bXBfZXJyb3I7CisgICAgfQorCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJvYmplY3Q6ICIpOworICAgIGlmIChuYW1lKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlcyIsIG5hbWUpOworICAgIH0KKyAgICBpZiAoZGVzY3IpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiAtICVzIiwgZGVzY3IpOworICAgIH0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlxuIik7CisgICAgcmMgPSBiY21iYWxfYXBpY2xpX29iamVjdF9zdHJ1Y3Rfc2l6ZShtc2ctPm9ial90eXBlLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgJmtleV9zaXplLCAma2V5X29mZnNldCwgJmRhdGFfc2l6ZSwgJmRhdGFfb2Zmc2V0KTsKKyAgICByYyA9IHJjID8gcmMgOiBiY21iYWxfYXBpY2xpX29iamVjdF9zdHJ1Y3Rfc2l6ZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAma2V5X3NpemUsICZrZXlfb2Zmc2V0LCAmZGF0YV9zaXplLCAmZGF0YV9vZmZzZXQpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGdvdG8gZHVtcF9lcnJvcjsKKyAgICB9CisKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgKG1zZy0+dHlwZSAmIEJDTUJBTF9PQkpfTVNHX1RZUEVfR0VUKSAhPSAwID8gImdldCIgOiAic2V0Iik7CisgICAgaWYgKChtc2ctPnR5cGUgJiBCQ01CQUxfT0JKX01TR19UWVBFX0NMRUFSKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIsY2xlYXIiKTsKKyAgICB9CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIgJXMgIiwgYmNtYmFsX2FwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKG1zZy0+Z3JvdXApKTsKKworICAgIGlmIChtc2ctPmdyb3VwICE9IEJDTUJBTF9NR1RfR1JPVVBfQ0ZHICYmIAorICAgICAgICBtc2ctPmdyb3VwICE9IEJDTUJBTF9NR1RfR1JPVVBfU1RBVCAmJiAKKyAgICAgICAgbXNnLT5ncm91cCAhPSBCQ01CQUxfTUdUX0dST1VQX0FVVE9fQ0ZHKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqc3ViX25hbWUsICpzdWJfZGVzY3I7CisgICAgICAgIC8qIEdldCBuYW1lIG9mIHNwZWNpZmljIHN1Ymdyb3VwICovCisgICAgICAgIHJjID0gYmNtYmFsX2FwaWNsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAmc3ViX25hbWUsICZzdWJfZGVzY3IpOworICAgICAgICBpZiAocmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gZHVtcF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInN1Ymdyb3VwOiAlcy0lcyAiLCBzdWJfbmFtZSA/IHN1Yl9uYW1lIDogIj8iLCBzdWJfZGVzY3IgPyBzdWJfZGVzY3IgOiAiIik7CisgICAgfQorICAgIGlmIChtc2ctPmRpciA9PSBCQ01CQUxfT0JKX01TR19ESVJfUkVRVUVTVCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAicmVxdWVzdFxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAicmVzcG9uc2U6ICVzXG4iLCBiY21vc19zdHJlcnJvcihtc2ctPnN0YXR1cykpOworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgImlzIGluLXByb2dyZXNzOiAlc1xuIiwgKG1zZy0+aXNfaW5wcm9ncmVzcyA9PSBCQ01PU19UUlVFKSA/ICJ5ZXMiIDogIm5vIik7CisgICAgfQorCisgICAgaWYgKChtc2ctPmdyb3VwICE9IEJDTUJBTF9NR1RfR1JPVVBfQVVUT19DRkcpICYmIGtleV9zaXplKQorICAgIHsKKyAgICAgICAga2V5ID0gKHZvaWQgKikoKGxvbmcpbXNnICsgc2l6ZW9mKGJjbWJhbF9vYmopKTsKKyAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX2R1bXBfa2V5KHNlc3Npb24sIG1zZywga2V5LCBrZXlfc2l6ZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBkdW1wX2Vycm9yOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkYXRhX3NpemUgJiYKKyAgICAgICAgICggICgobXNnLT5kaXIgPT0gQkNNQkFMX09CSl9NU0dfRElSX1JFUVVFU1QpICYmIChtc2ctPnR5cGUgJiBCQ01CQUxfT0JKX01TR19UWVBFX1NFVCkpICB8fAorICAgICAgICAgICAgKChtc2ctPmRpciA9PSBCQ01CQUxfT0JKX01TR19ESVJfUkVTUE9OU0UpICYmIChtc2ctPnR5cGUgJiBCQ01CQUxfT0JKX01TR19UWVBFX0dFVCkpIHx8CisgICAgICAgICAgICAobXNnLT5ncm91cCA9PSBCQ01CQUxfTUdUX0dST1VQX0FVVE8pCisgICAgICAgICApCisgICAgICAgKQorICAgIHsKKyAgICAgICAgZGF0YSA9ICh2b2lkICopKChsb25nKW1zZyArIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgcmMgPSBiY21iYWxfYXBpY2xpX2R1bXBfZGF0YShzZXNzaW9uLCBtc2csIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBkdW1wX2Vycm9yOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworCitkdW1wX2Vycm9yOgorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiKioqIE9iamVjdCBkdW1wIGVycm9yICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgIHJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGlfaGFuZGxlcnMuYyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliYmFsYXBpY2xpL2JhbF9hcGlfY2xpX2hhbmRsZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5MGJiZgotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliYmFsYXBpY2xpL2JhbF9hcGlfY2xpX2hhbmRsZXJzLmMKQEAgLTAsMCArMSw0NTE2IEBACisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmFsX2FwaS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgImJhbF9hcGlfY2xpX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJiYWxfYXBpX2NsaV9oYW5kbGVycy5oIgorCitiY21jbGlfc2Vzc2lvbiAqYmNtYmFsX2FwaWNsaV9sb2dfc2Vzc2lvbiA9IE5VTEw7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDMyX3QgdXNlZDsKK30gYmNtYmFsX2FwaWNsaV9ieXRlX3Bvb2w7CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX2J5dGVfcG9vbF9jcmVhdGUoYmNtYmFsX2FwaWNsaV9ieXRlX3Bvb2wgKmJ1ZikKK3sKKyAgICBidWYtPnVzZWQgPSAwOworICAgIGJ1Zi0+c3RhcnQgPSBiY21vc19jYWxsb2MoQkNNQkFMX0FQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIHJldHVybiAoYnVmLT5zdGFydCA9PSBOVUxMKSA/IEJDTV9FUlJfTk9NRU0gOiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBiY21iYWxfYXBpY2xpX2J5dGVfcG9vbF9kZXN0cm95KGJjbWJhbF9hcGljbGlfYnl0ZV9wb29sICpidWYpCit7CisgICAgYmNtb3NfZnJlZShidWYtPnN0YXJ0KTsKK30KKworc3RhdGljIHZvaWQgKmJjbWJhbF9hcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhiY21iYWxfYXBpY2xpX2J5dGVfcG9vbCAqYnVmLCB1aW50MzJfdCBudW1fYnl0ZXMpCit7CisgICAgdm9pZCAqcmV0OworICAgIGlmIChidWYtPnVzZWQgKyBudW1fYnl0ZXMgPiBCQ01CQUxfQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSkKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldCA9IGJ1Zi0+c3RhcnQgKyBidWYtPnVzZWQ7CisgICAgYnVmLT51c2VkICs9IG51bV9ieXRlczsKKyAgICBtZW1zZXQocmV0LCAwLCBudW1fYnl0ZXMpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTdGFydC9lbmQgYmFubmVycyAtIHRoZXNlIGFyZSBzcGVjaWFsbHkgZm9ybWF0dGVkIHNvIGxpc3RlbmluZyBhcHBzIGNhbiBlYXNpbHkgdGVsbCB3aGVyZSBBUEkgaGFuZGxpbmcgc3RhcnRzL2VuZHMuCisgKi8KK3N0YXRpYyB2b2lkIGJjbWJhbF9hcGljbGlfcHJpbnRfc3RhcnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmFwaV9uYW1lKQoreworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiWy0tIEFQSSBTdGFydDogJXMgLS1dXG4iLCBhcGlfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbWJhbF9hcGljbGlfcHJpbnRfZGF0YV9zdGFydChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlstLSBBUEkgTWVzc2FnZSBEYXRhIC0tXVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9zX2Vycm5vIGVyciwgY29uc3QgY2hhciAqZXJyX3RleHQpCit7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LICYmIGVycl90ZXh0ICE9IE5VTEwgJiYgZXJyX3RleHRbMF0gIT0gJ1wwJykKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiRVJST1I6ICVzIiwgZXJyX3RleHQpOworICAgIH0KKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiWy0tIEFQSSBDb21wbGV0ZTogJWQgKCVzKSAtLV1cbiIsIGVyciwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7Cit9CisKK3N0YXRpYyBpbnQgYmNtYmFsX2FwaWNsaV9zZXNzaW9uX3dyaXRlX2NiKGJjbWNsaV9zZXNzaW9uICpjbGlfc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIGJjbWNsaV9sb2coYnVmLCAiJS4qcyIsIHNpemUsIGJ1Zik7CisgICAgcmV0dXJuIChpbnQpc2l6ZTsKK30KKworLyogTG9ncyBhIHByb3BlcnR5IHZhbHVlIHRvIHRoZSBDTEkgbG9nIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBpcyBhIHZhbGlkIFJIUyBpbiBhbiBpbml0aWFsaXplci4gIEZvciBhIHByaW1pdHZlLCB0aGlzCisgKiB3aWxsIGp1c3QgcHJpbnQgdGhlIHZhbHVlIChlLmcuICI0MiIpLiAgRm9yIGEgc3RydWN0LCBpdCB3aWxsIGVtaXQgYWxsIG1lbWJlcnMgaW4gYmV0d2VlbiBjdXJseSBicmFjZXMuICovCitzdGF0aWMgdm9pZCBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X21ndF9ncm91cCBncm91cCwgdWludDE2X3Qgc3ViZ3JvdXAsIHVpbnQxNl90IHByb3AsIHZvaWQgKnZhbHVlKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKnByb3BfZGVzY3I7CisKKyAgICBpZiAoYmNtYmFsX2FwaWNsaV9sb2dfc2Vzc2lvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdGljIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc2Vzc2lvbl9wYXJhbXMgPSB7IC53cml0ZSA9IGJjbWJhbF9hcGljbGlfc2Vzc2lvbl93cml0ZV9jYiB9OworCisgICAgICAgIGVyciA9IGJjbWNsaV9zZXNzaW9uX29wZW4oJnNlc3Npb25fcGFyYW1zLCAmYmNtYmFsX2FwaWNsaV9sb2dfc2Vzc2lvbik7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvciBvcGVuaW5nIHNlc3Npb246ICVzIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSBiY21iYWxfYXBpY2xpX29iamVjdF9wcm9wZXJ0eShvYmosIGdyb3VwLCBzdWJncm91cCwgcHJvcCwgJnByb3BfZGVzY3IpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3IgZ2V0dGluZyBpbmZvIGZvciBwcm9wZXJ0eTogJXMiLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVyciA9IGJjbWJhbF9hcGljbGlfZHVtcF9wcm9wX2luaXRpYWxpemVyKGJjbWJhbF9hcGljbGlfbG9nX3Nlc3Npb24sIHByb3BfZGVzY3IsIHZhbHVlKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yIHByaW50aW5nIHByb3BlcnR5OiAlcyIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBiY21vc19pcHY0X2FkZHJlc3MgYmNtYmFsX2FwaWNsaV91bnVtYmVyX3RvX2lwdjQodWludDMyX3QgbnVtKQoreworICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBpcCA9IHsgLnUzMiA9IG51bSB9OworICAgIHJldHVybiBpcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfY2xpX2FjY2Vzc190ZXJtaW5hbF9jZmdfZ2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtYmFsX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgYWNjZXNzX3Rlcm1pbmFsLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfSU5JVCgmY2ZnLCBhY2Nlc3NfdGVybWluYWwsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWRtaW5fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGFjY2Vzc190ZXJtaW5hbCwgYWRtaW5fc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBhY2Nlc3NfdGVybWluYWwsIGFkbWluX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcGVyX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgYWNjZXNzX3Rlcm1pbmFsLCBvcGVyX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGFjY2Vzc190ZXJtaW5hbCwgb3Blcl9zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIml3Zl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBhY2Nlc3NfdGVybWluYWwsIGl3Zl9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgYWNjZXNzX3Rlcm1pbmFsLCBpd2ZfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBhY2Nlc3NfdGVybWluYWwsIGFkbWluX3N0YXRlKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBhY2Nlc3NfdGVybWluYWwsIG9wZXJfc3RhdHVzKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBhY2Nlc3NfdGVybWluYWwsIGl3Zl9tb2RlKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgYWNjZXNzX3Rlcm1pbmFsLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgYWNjZXNzX3Rlcm1pbmFsLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9jZmdfZ2V0KCZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfY2ZnX2dldCgmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGJjbWJhbF9hcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfY2xpX2FjY2Vzc190ZXJtaW5hbF9jZmdfc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtYmFsX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgYWNjZXNzX3Rlcm1pbmFsLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfSU5JVCgmY2ZnLCBhY2Nlc3NfdGVybWluYWwsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWRtaW5fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21iYWxfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBhY2Nlc3NfdGVybWluYWwsIGFkbWluX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGFjY2Vzc190ZXJtaW5hbCwgYWRtaW5fc3RhdGUsICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0FDQ0VTU19URVJNSU5BTCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfQ0ZHX0lEX0FETUlOX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtYmFsX2NmZ19zZXQoJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9jZmdfc2V0KCZjZmcuaGRyKTtcbiIpOworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBOVUxMKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9jbGlfYWNjZXNzX3Rlcm1pbmFsX2NmZ19jbGVhcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIGFjY2Vzc190ZXJtaW5hbCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgYWNjZXNzX3Rlcm1pbmFsLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9jZmdfY2xlYXIoJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9jZmdfY2xlYXIoJmNmZy5oZHIpO1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIE5VTEwpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2NsaV9mbG93X2NmZ19nZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtYmFsX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21iYWxfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF9mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfZmxvd19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbWJhbF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfaWQgPSAoYmNtYmFsX2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZsb3dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZsb3dfaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19JRCwgJmtleS5mbG93X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfdHlwZSA9IChiY21iYWxfZmxvd190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmxvd190eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5mbG93X3R5cGUgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19UWVBFLCAma2V5LmZsb3dfdHlwZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIGZsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19JTklUKCZjZmcsIGZsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWRtaW5fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGZsb3csIGFkbWluX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgYWRtaW5fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBmbG93LCBvcGVyX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGZsb3csIG9wZXJfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY2Nlc3NfaW50X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBmbG93LCBhY2Nlc3NfaW50X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgYWNjZXNzX2ludF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibmV0d29ya19pbnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGZsb3csIG5ldHdvcmtfaW50X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgbmV0d29ya19pbnRfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1Yl90ZXJtX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBmbG93LCBzdWJfdGVybV9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGZsb3csIHN1Yl90ZXJtX2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWJfdGVybV91bmlfaWR4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBmbG93LCBzdWJfdGVybV91bmlfaWR4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgc3ViX3Rlcm1fdW5pX2lkeCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ZjX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGZsb3csIHN2Y19wb3J0X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgc3ZjX3BvcnRfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFnZ19wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBmbG93LCBhZ2dfcG9ydF9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGZsb3csIGFnZ19wb3J0X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZXNvbHZlX21hYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgcmVzb2x2ZV9tYWMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBmbG93LCByZXNvbHZlX21hYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xhc3NpZmllciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgY2xhc3NpZmllcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGZsb3csIGNsYXNzaWZpZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgYWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgYWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGZsb3csIHNsYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGZsb3csIHNsYSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29va2llIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBmbG93LCBjb29raWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBmbG93LCBjb29raWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByaW9yaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBmbG93LCBwcmlvcml0eSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGZsb3csIHByaW9yaXR5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncm91cF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgZ3JvdXBfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBmbG93LCBncm91cF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicXVldWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGZsb3csIHF1ZXVlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgcXVldWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZmxvdywgYWRtaW5fc3RhdGUpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGZsb3csIG9wZXJfc3RhdHVzKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBmbG93LCBhY2Nlc3NfaW50X2lkKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBmbG93LCBuZXR3b3JrX2ludF9pZCkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZmxvdywgc3ViX3Rlcm1faWQpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGZsb3csIHN1Yl90ZXJtX3VuaV9pZHgpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGZsb3csIHN2Y19wb3J0X2lkKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBmbG93LCBhZ2dfcG9ydF9pZCkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZmxvdywgcmVzb2x2ZV9tYWMpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGZsb3csIGNsYXNzaWZpZXIpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGZsb3csIGFjdGlvbikgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZmxvdywgc2xhKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBmbG93LCBjb29raWUpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGZsb3csIHByaW9yaXR5KSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBmbG93LCBncm91cF9pZCkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZmxvdywgcXVldWUpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBmbG93LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZmxvdywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21iYWxfY2ZnX2dldCgmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2NmZ19nZXQoJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBiY21iYWxfYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIE5VTEwpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2NsaV9mbG93X2NmZ19zZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtYmFsX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21iYWxfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF9mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfZmxvd19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbWJhbF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfaWQgPSAoYmNtYmFsX2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZsb3dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZsb3dfaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19JRCwgJmtleS5mbG93X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfdHlwZSA9IChiY21iYWxfZmxvd190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmxvd190eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5mbG93X3R5cGUgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19UWVBFLCAma2V5LmZsb3dfdHlwZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIGZsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19JTklUKCZjZmcsIGZsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWRtaW5fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21iYWxfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBhZG1pbl9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBhZG1pbl9zdGF0ZSwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfRkxPVywgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9GTE9XX0NGR19JRF9BRE1JTl9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFjY2Vzc19pbnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9pbnRmX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbWJhbF9pbnRmX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBhY2Nlc3NfaW50X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGZsb3csIGFjY2Vzc19pbnRfaWQsICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfRkxPV19DRkdfSURfQUNDRVNTX0lOVF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5ldHdvcmtfaW50X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfaW50Zl9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21iYWxfaW50Zl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgZmxvdywgbmV0d29ya19pbnRfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgZmxvdywgbmV0d29ya19pbnRfaWQsICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfRkxPV19DRkdfSURfTkVUV09SS19JTlRfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWJfdGVybV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX3N1Yl9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21iYWxfc3ViX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBzdWJfdGVybV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBzdWJfdGVybV9pZCwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfRkxPVywgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9GTE9XX0NGR19JRF9TVUJfVEVSTV9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1Yl90ZXJtX3VuaV9pZHgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBzdWJfdGVybV91bmlfaWR4LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGZsb3csIHN1Yl90ZXJtX3VuaV9pZHgsICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfRkxPV19DRkdfSURfU1VCX1RFUk1fVU5JX0lEWCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN2Y19wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGZsb3csIHN2Y19wb3J0X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGZsb3csIHN2Y19wb3J0X2lkLCAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9GTE9XLCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NWQ19QT1JUX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWdnX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBhZ2dfcG9ydF9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBhZ2dfcG9ydF9pZCwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfRkxPVywgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9GTE9XX0NGR19JRF9BR0dfUE9SVF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlc29sdmVfbWFjIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCByZXNvbHZlX21hYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCByZXNvbHZlX21hYywgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfRkxPVywgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9GTE9XX0NGR19JRF9SRVNPTFZFX01BQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjbGFzc2lmaWVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX2NsYXNzaWZpZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsYXNzaWZpZXIub190cGlkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub190cGlkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB2YWwucHJlc2VuY2VfbWFzayA9IHZhbC5wcmVzZW5jZV9tYXNrIHwgQkNNQkFMX0NMQVNTSUZJRVJfSURfT19UUElEOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGFzc2lmaWVyLm9fdmlkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub192aWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQ0xBU1NJRklFUl9JRF9PX1ZJRDsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xhc3NpZmllci5pX3RwaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pX3RwaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQ0xBU1NJRklFUl9JRF9JX1RQSUQ7CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsYXNzaWZpZXIuaV92aWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pX3ZpZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9DTEFTU0lGSUVSX0lEX0lfVklEOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGFzc2lmaWVyLm9fcGJpdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vX3BiaXRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB2YWwucHJlc2VuY2VfbWFzayA9IHZhbC5wcmVzZW5jZV9tYXNrIHwgQkNNQkFMX0NMQVNTSUZJRVJfSURfT19QQklUUzsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xhc3NpZmllci5pX3BiaXRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaV9wYml0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9DTEFTU0lGSUVSX0lEX0lfUEJJVFM7CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsYXNzaWZpZXIuZXRoZXJfdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmV0aGVyX3R5cGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQ0xBU1NJRklFUl9JRF9FVEhFUl9UWVBFOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGFzc2lmaWVyLmRzdF9tYWMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kc3RfbWFjID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQ0xBU1NJRklFUl9JRF9EU1RfTUFDOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGFzc2lmaWVyLnNyY19tYWMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zcmNfbWFjID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQ0xBU1NJRklFUl9JRF9TUkNfTUFDOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGFzc2lmaWVyLmlwX3Byb3RvIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXBfcHJvdG8gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQ0xBU1NJRklFUl9JRF9JUF9QUk9UTzsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xhc3NpZmllci5kc3RfaXAiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kc3RfaXAgPSBiY21iYWxfYXBpY2xpX3VudW1iZXJfdG9faXB2NChjbGlfcGFybS0+dmFsdWUudW51bWJlcik7CisgICAgICAgICAgICB2YWwucHJlc2VuY2VfbWFzayA9IHZhbC5wcmVzZW5jZV9tYXNrIHwgQkNNQkFMX0NMQVNTSUZJRVJfSURfRFNUX0lQOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGFzc2lmaWVyLnNyY19pcCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNyY19pcCA9IGJjbWJhbF9hcGljbGlfdW51bWJlcl90b19pcHY0KGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyKTsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQ0xBU1NJRklFUl9JRF9TUkNfSVA7CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsYXNzaWZpZXIuc3JjX3BvcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zcmNfcG9ydCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9DTEFTU0lGSUVSX0lEX1NSQ19QT1JUOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGFzc2lmaWVyLmRzdF9wb3J0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHN0X3BvcnQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQ0xBU1NJRklFUl9JRF9EU1RfUE9SVDsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xhc3NpZmllci5wa3RfdGFnX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wa3RfdGFnX3R5cGUgPSAoYmNtYmFsX3BrdF90YWdfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9DTEFTU0lGSUVSX0lEX1BLVF9UQUdfVFlQRTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgZmxvdywgY2xhc3NpZmllciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbWJhbF9jbGFzc2lmaWVyIHZhbCA9ICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfRkxPV19DRkdfSURfQ0xBU1NJRklFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGZsb3csIGNsYXNzaWZpZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYWN0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FjdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWN0aW9uLmNtZHNfYml0bWFzayIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNtZHNfYml0bWFzayA9IChiY21iYWxfYWN0aW9uX2NtZF9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9BQ1RJT05fSURfQ01EU19CSVRNQVNLOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3Rpb24ub192aWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vX3ZpZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9BQ1RJT05fSURfT19WSUQ7CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFjdGlvbi5vX3BiaXRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub19wYml0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9BQ1RJT05fSURfT19QQklUUzsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWN0aW9uLm9fdHBpZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9fdHBpZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9BQ1RJT05fSURfT19UUElEOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3Rpb24uaV92aWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pX3ZpZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9BQ1RJT05fSURfSV9WSUQ7CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFjdGlvbi5pX3BiaXRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaV9wYml0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9BQ1RJT05fSURfSV9QQklUUzsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWN0aW9uLmlfdHBpZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmlfdHBpZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9BQ1RJT05fSURfSV9UUElEOworICAgICAgICB9CisKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBhY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21iYWxfYWN0aW9uIHZhbCA9ICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfRkxPV19DRkdfSURfQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgZmxvdywgYWN0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInNsYS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9zbGEgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5taW5fcmF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pbl9yYXRlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB2YWwucHJlc2VuY2VfbWFzayA9IHZhbC5wcmVzZW5jZV9tYXNrIHwgQkNNQkFMX1NMQV9JRF9NSU5fUkFURTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLm1heF9yYXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X3JhdGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfU0xBX0lEX01BWF9SQVRFOworICAgICAgICB9CisKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBzbGEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21iYWxfc2xhIHZhbCA9ICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfRkxPV19DRkdfSURfU0xBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgZmxvdywgc2xhLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29va2llIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfY29va2llIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbWJhbF9jb29raWUpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgZmxvdywgY29va2llLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGZsb3csIGNvb2tpZSwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfRkxPVywgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9GTE9XX0NGR19JRF9DT09LSUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmlvcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBwcmlvcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBwcmlvcml0eSwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfRkxPVywgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9GTE9XX0NGR19JRF9QUklPUklUWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdyb3VwX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfZ3JvdXBfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX2dyb3VwX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBncm91cF9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBncm91cF9pZCwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfRkxPVywgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9GTE9XX0NGR19JRF9HUk9VUF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJxdWV1ZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF90bV9xdWV1ZV9yZWYgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInF1ZXVlLnNjaGVkX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2NoZWRfaWQgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicXVldWUuc2NoZWRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJxdWV1ZS5xdWV1ZV9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnF1ZXVlX2lkID0gKGJjbWJhbF90bV9xdWV1ZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInF1ZXVlLnF1ZXVlX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgZmxvdywgcXVldWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21iYWxfdG1fcXVldWVfcmVmIHZhbCA9ICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfRkxPV19DRkdfSURfUVVFVUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBmbG93LCBxdWV1ZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9jZmdfc2V0KCZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfY2ZnX3NldCgmY2ZnLmhkcik7XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfY2xpX2Zsb3dfY2ZnX2NsZWFyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF9mbG93X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtYmFsX2Zsb3dfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21iYWxfZmxvd19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfaWQgPSAoYmNtYmFsX2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZsb3dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZsb3dfaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19JRCwgJmtleS5mbG93X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfdHlwZSA9IChiY21iYWxfZmxvd190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmxvd190eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5mbG93X3R5cGUgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19UWVBFLCAma2V5LmZsb3dfdHlwZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIGZsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19JTklUKCZjZmcsIGZsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtYmFsX2NmZ19jbGVhcigmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2NmZ19jbGVhcigmY2ZnLmhkcik7XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfY2xpX2Zsb3dfc3RhdF9nZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtYmFsX2Zsb3dfc3RhdCBzdGF0OyAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21iYWxfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF9mbG93X3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtYmFsX3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfaWQgPSAoYmNtYmFsX2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZsb3dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZsb3dfaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19JRCwgJmtleS5mbG93X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfdHlwZSA9IChiY21iYWxfZmxvd190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmxvd190eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5mbG93X3R5cGUgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19UWVBFLCAma2V5LmZsb3dfdHlwZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX1NUQVRfSU5JVCgmc3RhdCwgZmxvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01CQUxfU1RBVF9JTklUKCZzdGF0LCBmbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZmxvdywgcnhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZmxvdywgcnhfcGFja2V0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZmxvdywgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGZsb3csIHJ4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGZsb3csIHR4X3BhY2tldHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGZsb3csIHR4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGZsb3csIHR4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCBmbG93LCB0eF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNQkFMX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGZsb3csIHJ4X3BhY2tldHMpICYmICFCQ01CQUxfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZmxvdywgcnhfYnl0ZXMpICYmICFCQ01CQUxfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZmxvdywgdHhfcGFja2V0cykgJiYgIUJDTUJBTF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBmbG93LCB0eF9ieXRlcykpCisgICAgeworICAgICAgICBCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZmxvdywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZmxvdywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21iYWxfc3RhdF9nZXQoJnN0YXQuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfc3RhdF9nZXQoJnN0YXQuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYmNtYmFsX2FwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfY2xpX2dyb3VwX2NmZ19nZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbWJhbF9hcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtYmFsX2dyb3VwX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21iYWxfZ3JvdXBfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21iYWxfZ3JvdXBfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9ncm91cF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtYmFsX2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncm91cF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lmdyb3VwX2lkID0gKGJjbWJhbF9ncm91cF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ3JvdXBfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmdyb3VwX2lkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9HUk9VUCwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9HUk9VUF9LRVlfSURfR1JPVVBfSUQsICZrZXkuZ3JvdXBfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTUJBTF9DRkdfSU5JVCgmY2ZnLCBncm91cCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgZ3JvdXAsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWVtYmVyc19jbWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGdyb3VwLCBtZW1iZXJzX2NtZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGdyb3VwLCBtZW1iZXJzX2NtZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWVtYmVycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZ3JvdXAsIG1lbWJlcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBncm91cCwgbWVtYmVycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29va2llIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBncm91cCwgY29va2llKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZ3JvdXAsIGNvb2tpZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGdyb3VwLCBmbG93cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGdyb3VwLCBmbG93cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3duZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGdyb3VwLCBvd25lcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGdyb3VwLCBvd25lcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncm91cCwgbWVtYmVyc19jbWQpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdyb3VwLCBtZW1iZXJzKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncm91cCwgY29va2llKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncm91cCwgZmxvd3MpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdyb3VwLCBvd25lcikpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGdyb3VwLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgZ3JvdXAsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIHNldCBtZW1vcnkgdG8gdXNlIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGxpc3RfbWVtID0gYmNtYmFsX2FwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQkNNQkFMX0FQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGlmIChsaXN0X21lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibGlzdF9tZW0gPSBiY21vc19jYWxsb2MoQkNNQkFMX0FQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNQkFMX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZ3JvdXAsIGxpc3RfbWVtLCBCQ01CQUxfQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZ3JvdXAsIGxpc3RfbWVtLCBCQ01CQUxfQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtYmFsX2NmZ19nZXQoJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9jZmdfZ2V0KCZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYmNtYmFsX2FwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBOVUxMKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9jbGlfZ3JvdXBfY2ZnX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtYmFsX2FwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21iYWxfZ3JvdXBfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbWJhbF9ncm91cF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2dyb3VwX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfZ3JvdXBfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdyb3VwX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ3JvdXBfaWQgPSAoYmNtYmFsX2dyb3VwX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJncm91cF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ3JvdXBfaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0dST1VQLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX0dST1VQX0tFWV9JRF9HUk9VUF9JRCwgJmtleS5ncm91cF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIGdyb3VwLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfSU5JVCgmY2ZnLCBncm91cCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtZW1iZXJzX2NtZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX2dyb3VwX21lbWJlcl9jbWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX2dyb3VwX21lbWJlcl9jbWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBncm91cCwgbWVtYmVyc19jbWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgZ3JvdXAsIG1lbWJlcnNfY21kLCAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9HUk9VUCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9HUk9VUF9DRkdfSURfTUVNQkVSU19DTUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibWVtYmVycy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBiY21iYWxfYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWVtYmVycy5pbnRmX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1lbWJlcnMuaW50Zl9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0uaW50Zl9pZCA9IChiY21iYWxfaW50Zl9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWVtYmVycy5zdmNfcG9ydF9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtZW1iZXJzLnN2Y19wb3J0X2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5zdmNfcG9ydF9pZCA9IChiY21iYWxfc2VydmljZV9wb3J0X2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtZW1iZXJzLmFjdGlvbi5jbWRzX2JpdG1hc2siKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWVtYmVycy5hY3Rpb24uY21kc19iaXRtYXNrIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtY2xpX3Bhcm1fdmFsdWVfaXNfc2V0KHNlc3Npb24sIGNsaV9wYXJtLCBpMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5hY3Rpb24uY21kc19iaXRtYXNrID0gKGJjbWJhbF9hY3Rpb25fY21kX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0uYWN0aW9uLnByZXNlbmNlX21hc2sgPSB2YWwudmFsW2kwXS5hY3Rpb24ucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9BQ1RJT05fSURfQ01EU19CSVRNQVNLOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWVtYmVycy5hY3Rpb24ub192aWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWVtYmVycy5hY3Rpb24ub192aWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21jbGlfcGFybV92YWx1ZV9pc19zZXQoc2Vzc2lvbiwgY2xpX3Bhcm0sIGkwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLmFjdGlvbi5vX3ZpZCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLmFjdGlvbi5wcmVzZW5jZV9tYXNrID0gdmFsLnZhbFtpMF0uYWN0aW9uLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQUNUSU9OX0lEX09fVklEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWVtYmVycy5hY3Rpb24ub19wYml0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtZW1iZXJzLmFjdGlvbi5vX3BiaXRzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtY2xpX3Bhcm1fdmFsdWVfaXNfc2V0KHNlc3Npb24sIGNsaV9wYXJtLCBpMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5hY3Rpb24ub19wYml0cyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLmFjdGlvbi5wcmVzZW5jZV9tYXNrID0gdmFsLnZhbFtpMF0uYWN0aW9uLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQUNUSU9OX0lEX09fUEJJVFM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtZW1iZXJzLmFjdGlvbi5vX3RwaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWVtYmVycy5hY3Rpb24ub190cGlkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtY2xpX3Bhcm1fdmFsdWVfaXNfc2V0KHNlc3Npb24sIGNsaV9wYXJtLCBpMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5hY3Rpb24ub190cGlkID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0uYWN0aW9uLnByZXNlbmNlX21hc2sgPSB2YWwudmFsW2kwXS5hY3Rpb24ucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9BQ1RJT05fSURfT19UUElEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWVtYmVycy5hY3Rpb24uaV92aWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWVtYmVycy5hY3Rpb24uaV92aWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21jbGlfcGFybV92YWx1ZV9pc19zZXQoc2Vzc2lvbiwgY2xpX3Bhcm0sIGkwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLmFjdGlvbi5pX3ZpZCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLmFjdGlvbi5wcmVzZW5jZV9tYXNrID0gdmFsLnZhbFtpMF0uYWN0aW9uLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQUNUSU9OX0lEX0lfVklEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWVtYmVycy5hY3Rpb24uaV9wYml0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtZW1iZXJzLmFjdGlvbi5pX3BiaXRzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtY2xpX3Bhcm1fdmFsdWVfaXNfc2V0KHNlc3Npb24sIGNsaV9wYXJtLCBpMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5hY3Rpb24uaV9wYml0cyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLmFjdGlvbi5wcmVzZW5jZV9tYXNrID0gdmFsLnZhbFtpMF0uYWN0aW9uLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfQUNUSU9OX0lEX0lfUEJJVFM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtZW1iZXJzLmFjdGlvbi5pX3RwaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWVtYmVycy5hY3Rpb24uaV90cGlkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtY2xpX3Bhcm1fdmFsdWVfaXNfc2V0KHNlc3Npb24sIGNsaV9wYXJtLCBpMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5hY3Rpb24uaV90cGlkID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0uYWN0aW9uLnByZXNlbmNlX21hc2sgPSB2YWwudmFsW2kwXS5hY3Rpb24ucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9BQ1RJT05fSURfSV9UUElEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWVtYmVycy5xdWV1ZS5zY2hlZF9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtZW1iZXJzLnF1ZXVlLnNjaGVkX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5xdWV1ZS5zY2hlZF9pZCA9IChiY21iYWxfdG1fc2NoZWRfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1lbWJlcnMucXVldWUucXVldWVfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWVtYmVycy5xdWV1ZS5xdWV1ZV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0ucXVldWUucXVldWVfaWQgPSAoYmNtYmFsX3RtX3F1ZXVlX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBncm91cCwgbWVtYmVycywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiB2YWwgPSAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9HUk9VUCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9HUk9VUF9DRkdfSURfTUVNQkVSUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGdyb3VwLCBtZW1iZXJzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29va2llIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfY29va2llIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbWJhbF9jb29raWUpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgZ3JvdXAsIGNvb2tpZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBncm91cCwgY29va2llLCAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9HUk9VUCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9HUk9VUF9DRkdfSURfQ09PS0lFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtYmFsX2NmZ19zZXQoJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9jZmdfc2V0KCZjZmcuaGRyKTtcbiIpOworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBOVUxMKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9jbGlfZ3JvdXBfY2ZnX2NsZWFyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF9ncm91cF9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtYmFsX2dyb3VwX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21iYWxfZ3JvdXBfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9ncm91cF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbWJhbF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncm91cF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lmdyb3VwX2lkID0gKGJjbWJhbF9ncm91cF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ3JvdXBfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmdyb3VwX2lkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9HUk9VUCwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9HUk9VUF9LRVlfSURfR1JPVVBfSUQsICZrZXkuZ3JvdXBfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTUJBTF9DRkdfSU5JVCgmY2ZnLCBncm91cCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgZ3JvdXAsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtYmFsX2NmZ19jbGVhcigmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2NmZ19jbGVhcigmY2ZnLmhkcik7XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfY2xpX2ludGVyZmFjZV9jZmdfZ2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21iYWxfYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF9pbnRlcmZhY2VfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbWJhbF9pbnRlcmZhY2Vfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1lbW9yeSBidWZmZXIgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2ludGVyZmFjZV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2ludGVyZmFjZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtYmFsX2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnRmX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW50Zl9pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImludGZfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmludGZfaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRSwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX0lOVEZfSUQsICZrZXkuaW50Zl9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnRmX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pbnRmX3R5cGUgPSAoYmNtYmFsX2ludGZfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImludGZfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaW50Zl90eXBlID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9JTlRFUkZBQ0UsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfSU5URVJGQUNFX0tFWV9JRF9JTlRGX1RZUEUsICZrZXkuaW50Zl90eXBlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgaW50ZXJmYWNlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfSU5JVCgmY2ZnLCBpbnRlcmZhY2UsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWRtaW5fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGludGVyZmFjZSwgYWRtaW5fc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIGFkbWluX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcGVyX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgaW50ZXJmYWNlLCBvcGVyX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGludGVyZmFjZSwgb3Blcl9zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbl9kYXRhX2FnZ19wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIG1pbl9kYXRhX2FnZ19wb3J0X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgaW50ZXJmYWNlLCBtaW5fZGF0YV9hZ2dfcG9ydF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfc3ZjX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGludGVyZmFjZSwgbWluX2RhdGFfc3ZjX3BvcnRfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIG1pbl9kYXRhX3N2Y19wb3J0X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIHRyYW5zY2VpdmVyX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIHRyYW5zY2VpdmVyX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX21pc3NfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgaW50ZXJmYWNlLCBkc19taXNzX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIGRzX21pc3NfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIG10dSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGludGVyZmFjZSwgbXR1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmbG93X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGludGVyZmFjZSwgZmxvd19jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgaW50ZXJmYWNlLCBmbG93X2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX3RtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIGRzX3RtKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgaW50ZXJmYWNlLCBkc190bSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfdG0iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIGludGVyZmFjZSwgdXNfdG0pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIHVzX3RtKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWJfdGVybV9pZF9saXN0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIHN1Yl90ZXJtX2lkX2xpc3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIHN1Yl90ZXJtX2lkX2xpc3QpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgaW50ZXJmYWNlLCBhZG1pbl9zdGF0ZSkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgaW50ZXJmYWNlLCBvcGVyX3N0YXR1cykgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgaW50ZXJmYWNlLCBtaW5fZGF0YV9hZ2dfcG9ydF9pZCkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgaW50ZXJmYWNlLCBtaW5fZGF0YV9zdmNfcG9ydF9pZCkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgaW50ZXJmYWNlLCB0cmFuc2NlaXZlcl90eXBlKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBpbnRlcmZhY2UsIGRzX21pc3NfbW9kZSkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgaW50ZXJmYWNlLCBtdHUpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGludGVyZmFjZSwgZmxvd19jb250cm9sKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBpbnRlcmZhY2UsIGRzX3RtKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBpbnRlcmZhY2UsIHVzX3RtKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBpbnRlcmZhY2UsIHN1Yl90ZXJtX2lkX2xpc3QpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBpbnRlcmZhY2UsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIHNldCBtZW1vcnkgdG8gdXNlIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGxpc3RfbWVtID0gYmNtYmFsX2FwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQkNNQkFMX0FQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGlmIChsaXN0X21lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibGlzdF9tZW0gPSBiY21vc19jYWxsb2MoQkNNQkFMX0FQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNQkFMX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgaW50ZXJmYWNlLCBsaXN0X21lbSwgQkNNQkFMX0FQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGludGVyZmFjZSwgbGlzdF9tZW0sIEJDTUJBTF9BUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21iYWxfY2ZnX2dldCgmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2NmZ19nZXQoJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBiY21iYWxfYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIE5VTEwpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2NsaV9pbnRlcmZhY2VfY2ZnX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtYmFsX2FwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21iYWxfaW50ZXJmYWNlX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21iYWxfaW50ZXJmYWNlX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21iYWxfaW50ZXJmYWNlX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfaW50ZXJmYWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtYmFsX2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnRmX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW50Zl9pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImludGZfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmludGZfaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRSwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX0lOVEZfSUQsICZrZXkuaW50Zl9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnRmX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pbnRmX3R5cGUgPSAoYmNtYmFsX2ludGZfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImludGZfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaW50Zl90eXBlID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9JTlRFUkZBQ0UsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfSU5URVJGQUNFX0tFWV9JRF9JTlRGX1RZUEUsICZrZXkuaW50Zl90eXBlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgaW50ZXJmYWNlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfSU5JVCgmY2ZnLCBpbnRlcmZhY2UsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWRtaW5fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21iYWxfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBpbnRlcmZhY2UsIGFkbWluX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGludGVyZmFjZSwgYWRtaW5fc3RhdGUsICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRSwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0FETUlOX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfYWdnX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBpbnRlcmZhY2UsIG1pbl9kYXRhX2FnZ19wb3J0X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGludGVyZmFjZSwgbWluX2RhdGFfYWdnX3BvcnRfaWQsICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRSwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX01JTl9EQVRBX0FHR19QT1JUX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfc3ZjX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgaW50ZXJmYWNlLCBtaW5fZGF0YV9zdmNfcG9ydF9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBpbnRlcmZhY2UsIG1pbl9kYXRhX3N2Y19wb3J0X2lkLCAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9JTlRFUkZBQ0UsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9NSU5fREFUQV9TVkNfUE9SVF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF90cnhfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21iYWxfdHJ4X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBpbnRlcmZhY2UsIHRyYW5zY2VpdmVyX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgaW50ZXJmYWNlLCB0cmFuc2NlaXZlcl90eXBlLCAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9JTlRFUkZBQ0UsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfbWlzc19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfZHNfbWlzc19tb2RlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbWJhbF9kc19taXNzX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBpbnRlcmZhY2UsIGRzX21pc3NfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBpbnRlcmZhY2UsIGRzX21pc3NfbW9kZSwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfSU5URVJGQUNFLCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfRFNfTUlTU19NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGludGVyZmFjZSwgbXR1LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGludGVyZmFjZSwgbXR1LCAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9JTlRFUkZBQ0UsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9NVFUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmbG93X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9jb250cm9sIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbWJhbF9jb250cm9sKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgaW50ZXJmYWNlLCBmbG93X2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgaW50ZXJmYWNlLCBmbG93X2NvbnRyb2wsICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRSwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX3RtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfdG1fc2NoZWRfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBpbnRlcmZhY2UsIGRzX3RtLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGludGVyZmFjZSwgZHNfdG0sICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRSwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0RTX1RNLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfdG0iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF90bV9zY2hlZF9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21iYWxfdG1fc2NoZWRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIGludGVyZmFjZSwgdXNfdG0sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgaW50ZXJmYWNlLCB1c190bSwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfSU5URVJGQUNFLCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfVVNfVE0sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21iYWxfY2ZnX3NldCgmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2NmZ19zZXQoJmNmZy5oZHIpO1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIE5VTEwpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2NsaV9pbnRlcmZhY2VfY2ZnX2NsZWFyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF9pbnRlcmZhY2VfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbWJhbF9pbnRlcmZhY2Vfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF9pbnRlcmZhY2VfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9pbnRlcmZhY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW50Zl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmludGZfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnRmX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pbnRmX2lkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9JTlRFUkZBQ0UsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfSU5URVJGQUNFX0tFWV9JRF9JTlRGX0lELCAma2V5LmludGZfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW50Zl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW50Zl90eXBlID0gKGJjbWJhbF9pbnRmX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnRmX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmludGZfdHlwZSA9ICIpOworICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfSU5URVJGQUNFLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfSU5URl9UWVBFLCAma2V5LmludGZfdHlwZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIGludGVyZmFjZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgaW50ZXJmYWNlLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9jZmdfY2xlYXIoJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9jZmdfY2xlYXIoJmNmZy5oZHIpO1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIE5VTEwpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2NsaV9pbnRlcmZhY2Vfc3RhdF9nZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtYmFsX2ludGVyZmFjZV9zdGF0IHN0YXQ7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtYmFsX2ludGVyZmFjZV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2ludGVyZmFjZV9zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfaW50ZXJmYWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtYmFsX3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW50Zl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmludGZfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnRmX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pbnRmX2lkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9JTlRFUkZBQ0UsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfSU5URVJGQUNFX0tFWV9JRF9JTlRGX0lELCAma2V5LmludGZfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW50Zl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW50Zl90eXBlID0gKGJjbWJhbF9pbnRmX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnRmX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmludGZfdHlwZSA9ICIpOworICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfSU5URVJGQUNFLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfSU5URl9UWVBFLCAma2V5LmludGZfdHlwZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX1NUQVRfSU5JVCgmc3RhdCwgaW50ZXJmYWNlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9TVEFUX0lOSVQoJnN0YXQsIGludGVyZmFjZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGludGVyZmFjZSwgcnhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgaW50ZXJmYWNlLCByeF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCBpbnRlcmZhY2UsIHJ4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCBpbnRlcmZhY2UsIHJ4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGludGVyZmFjZSwgdHhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgaW50ZXJmYWNlLCB0eF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCBpbnRlcmZhY2UsIHR4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCBpbnRlcmZhY2UsIHR4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01CQUxfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgaW50ZXJmYWNlLCByeF9wYWNrZXRzKSAmJiAhQkNNQkFMX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGludGVyZmFjZSwgcnhfYnl0ZXMpICYmICFCQ01CQUxfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgaW50ZXJmYWNlLCB0eF9wYWNrZXRzKSAmJiAhQkNNQkFMX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGludGVyZmFjZSwgdHhfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGludGVyZmFjZSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgaW50ZXJmYWNlLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9zdGF0X2dldCgmc3RhdC5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9zdGF0X2dldCgmc3RhdC5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBiY21iYWxfYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBOVUxMKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9jbGlfcGFja2V0X2NmZ19nZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbWJhbF9hcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtYmFsX3BhY2tldF9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtYmFsX3BhY2tldF9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgdWludDhfdCAqbGlzdF9tZW07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21iYWxfcGFja2V0X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfcGFja2V0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDhfdCogbGlzdF9tZW07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlc2VydmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucmVzZXJ2ZWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZXNlcnZlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucmVzZXJ2ZWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1BBQ0tFVCwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9QQUNLRVRfS0VZX0lEX1JFU0VSVkVELCAma2V5LnJlc2VydmVkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwYWNrZXRfc2VuZF9kZXN0LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYWNrZXRfc2VuZF9kZXN0LnR5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGtleS5wYWNrZXRfc2VuZF9kZXN0LnR5cGUgPSAoYmNtYmFsX2Rlc3RfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwYWNrZXRfc2VuZF9kZXN0LnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChrZXkucGFja2V0X3NlbmRfZGVzdC50eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9ERVNUX1RZUEVfTk5JOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NlbmRfZGVzdC5pbnRfaWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleS5wYWNrZXRfc2VuZF9kZXN0LnUubm5pLmludF9pZCA9IChiY21iYWxfaW50Zl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGFja2V0X3NlbmRfZGVzdC5pbnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfREVTVF9UWVBFX1NVQl9URVJNOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NlbmRfZGVzdC5zdWJfdGVybV9pZCIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga2V5LnBhY2tldF9zZW5kX2Rlc3QudS5zdWJfdGVybS5zdWJfdGVybV9pZCA9IChiY21iYWxfc3ViX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwYWNrZXRfc2VuZF9kZXN0LnN1Yl90ZXJtX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NlbmRfZGVzdC5zdWJfdGVybV91bmkiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleS5wYWNrZXRfc2VuZF9kZXN0LnUuc3ViX3Rlcm0uc3ViX3Rlcm1fdW5pID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGFja2V0X3NlbmRfZGVzdC5zdWJfdGVybV91bmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYWNrZXRfc2VuZF9kZXN0LmludF9pZCIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga2V5LnBhY2tldF9zZW5kX2Rlc3QudS5zdWJfdGVybS5pbnRfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwYWNrZXRfc2VuZF9kZXN0LmludF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9ERVNUX1RZUEVfSE9TVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBhY2tldF9zZW5kX2Rlc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBhY2tldF9zZW5kX2Rlc3QgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1BBQ0tFVCwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9QQUNLRVRfS0VZX0lEX1BBQ0tFVF9TRU5EX0RFU1QsICZrZXkucGFja2V0X3NlbmRfZGVzdCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIHBhY2tldCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgcGFja2V0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHBhY2tldCwgZmxvd19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHBhY2tldCwgZmxvd19pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBwYWNrZXQsIGZsb3dfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHBhY2tldCwgZmxvd190eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnRmX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBwYWNrZXQsIGludGZfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBwYWNrZXQsIGludGZfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImludGZfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgcGFja2V0LCBpbnRmX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBwYWNrZXQsIGludGZfdHlwZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ZjX3BvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHBhY2tldCwgc3ZjX3BvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBwYWNrZXQsIHN2Y19wb3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmbG93X2Nvb2tpZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgcGFja2V0LCBmbG93X2Nvb2tpZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHBhY2tldCwgZmxvd19jb29raWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBrdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgcGFja2V0LCBwa3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBwYWNrZXQsIHBrdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBwYWNrZXQsIGZsb3dfaWQpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHBhY2tldCwgZmxvd190eXBlKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBwYWNrZXQsIGludGZfaWQpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHBhY2tldCwgaW50Zl90eXBlKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBwYWNrZXQsIHN2Y19wb3J0KSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBwYWNrZXQsIGZsb3dfY29va2llKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBwYWNrZXQsIHBrdCkpCisgICAgeworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHBhY2tldCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHBhY2tldCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogc2V0IG1lbW9yeSB0byB1c2UgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgbGlzdF9tZW0gPSBiY21iYWxfYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBCQ01CQUxfQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJsaXN0X21lbSA9IGJjbW9zX2NhbGxvYyhCQ01CQUxfQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKyAgICBCQ01CQUxfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBwYWNrZXQsIGxpc3RfbWVtLCBCQ01CQUxfQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgcGFja2V0LCBsaXN0X21lbSwgQkNNQkFMX0FQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9jZmdfZ2V0KCZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfY2ZnX2dldCgmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGJjbWJhbF9hcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfY2xpX3BhY2tldF9jZmdfc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21iYWxfYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF9wYWNrZXRfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbWJhbF9wYWNrZXRfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF9wYWNrZXRfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9wYWNrZXRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlc2VydmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucmVzZXJ2ZWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZXNlcnZlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucmVzZXJ2ZWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1BBQ0tFVCwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9QQUNLRVRfS0VZX0lEX1JFU0VSVkVELCAma2V5LnJlc2VydmVkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwYWNrZXRfc2VuZF9kZXN0LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYWNrZXRfc2VuZF9kZXN0LnR5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGtleS5wYWNrZXRfc2VuZF9kZXN0LnR5cGUgPSAoYmNtYmFsX2Rlc3RfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwYWNrZXRfc2VuZF9kZXN0LnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChrZXkucGFja2V0X3NlbmRfZGVzdC50eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9ERVNUX1RZUEVfTk5JOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NlbmRfZGVzdC5pbnRfaWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleS5wYWNrZXRfc2VuZF9kZXN0LnUubm5pLmludF9pZCA9IChiY21iYWxfaW50Zl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGFja2V0X3NlbmRfZGVzdC5pbnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfREVTVF9UWVBFX1NVQl9URVJNOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NlbmRfZGVzdC5zdWJfdGVybV9pZCIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga2V5LnBhY2tldF9zZW5kX2Rlc3QudS5zdWJfdGVybS5zdWJfdGVybV9pZCA9IChiY21iYWxfc3ViX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwYWNrZXRfc2VuZF9kZXN0LnN1Yl90ZXJtX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NlbmRfZGVzdC5zdWJfdGVybV91bmkiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleS5wYWNrZXRfc2VuZF9kZXN0LnUuc3ViX3Rlcm0uc3ViX3Rlcm1fdW5pID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGFja2V0X3NlbmRfZGVzdC5zdWJfdGVybV91bmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYWNrZXRfc2VuZF9kZXN0LmludF9pZCIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga2V5LnBhY2tldF9zZW5kX2Rlc3QudS5zdWJfdGVybS5pbnRfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwYWNrZXRfc2VuZF9kZXN0LmludF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9ERVNUX1RZUEVfSE9TVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBhY2tldF9zZW5kX2Rlc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBhY2tldF9zZW5kX2Rlc3QgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1BBQ0tFVCwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9QQUNLRVRfS0VZX0lEX1BBQ0tFVF9TRU5EX0RFU1QsICZrZXkucGFja2V0X3NlbmRfZGVzdCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIHBhY2tldCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgcGFja2V0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9mbG93X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbWJhbF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBwYWNrZXQsIGZsb3dfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgcGFja2V0LCBmbG93X2lkLCAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9QQUNLRVQsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfUEFDS0VUX0NGR19JRF9GTE9XX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfZmxvd190eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbWJhbF9mbG93X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBwYWNrZXQsIGZsb3dfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBwYWNrZXQsIGZsb3dfdHlwZSwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfUEFDS0VULCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW50Zl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX2ludGZfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX2ludGZfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIHBhY2tldCwgaW50Zl9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBwYWNrZXQsIGludGZfaWQsICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1BBQ0tFVCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0lOVEZfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnRmX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9pbnRmX3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX2ludGZfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIHBhY2tldCwgaW50Zl90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIHBhY2tldCwgaW50Zl90eXBlLCAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9QQUNLRVQsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfUEFDS0VUX0NGR19JRF9JTlRGX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdmNfcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21iYWxfc2VydmljZV9wb3J0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBwYWNrZXQsIHN2Y19wb3J0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIHBhY2tldCwgc3ZjX3BvcnQsICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1BBQ0tFVCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX1NWQ19QT1JULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19jb29raWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9jb29raWUgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX2Nvb2tpZSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBwYWNrZXQsIGZsb3dfY29va2llLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIHBhY2tldCwgZmxvd19jb29raWUsICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1BBQ0tFVCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0ZMT1dfQ09PS0lFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGt0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfdThfbGlzdF91MzIgdmFsID0geyB9OworICAgICAgICB2YWwubGVuID0gYmNtYmFsX2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgIHZhbC52YWwgPSBiY21iYWxfYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwubGVuKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgYmNtYmFsX2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgYmNtYmFsX2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmFsLCB2YWwubGVuKTsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBwYWNrZXQsIHBrdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbWJhbF91OF9saXN0X3UzMiB2YWwgPSAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9QQUNLRVQsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfUEFDS0VUX0NGR19JRF9QS1QsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBwYWNrZXQsIHBrdCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9jZmdfc2V0KCZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfY2ZnX3NldCgmY2ZnLmhkcik7XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfY2xpX3BhY2tldF9jZmdfY2xlYXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtYmFsX3BhY2tldF9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtYmFsX3BhY2tldF9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtYmFsX3BhY2tldF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX3BhY2tldF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbWJhbF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZXNlcnZlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnJlc2VydmVkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmVzZXJ2ZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnJlc2VydmVkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9QQUNLRVQsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfUEFDS0VUX0tFWV9JRF9SRVNFUlZFRCwgJmtleS5yZXNlcnZlZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicGFja2V0X3NlbmRfZGVzdC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NlbmRfZGVzdC50eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBrZXkucGFja2V0X3NlbmRfZGVzdC50eXBlID0gKGJjbWJhbF9kZXN0X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGFja2V0X3NlbmRfZGVzdC50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoa2V5LnBhY2tldF9zZW5kX2Rlc3QudHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfREVTVF9UWVBFX05OSToKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhY2tldF9zZW5kX2Rlc3QuaW50X2lkIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrZXkucGFja2V0X3NlbmRfZGVzdC51Lm5uaS5pbnRfaWQgPSAoYmNtYmFsX2ludGZfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBhY2tldF9zZW5kX2Rlc3QuaW50X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0RFU1RfVFlQRV9TVUJfVEVSTToKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhY2tldF9zZW5kX2Rlc3Quc3ViX3Rlcm1faWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleS5wYWNrZXRfc2VuZF9kZXN0LnUuc3ViX3Rlcm0uc3ViX3Rlcm1faWQgPSAoYmNtYmFsX3N1Yl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGFja2V0X3NlbmRfZGVzdC5zdWJfdGVybV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhY2tldF9zZW5kX2Rlc3Quc3ViX3Rlcm1fdW5pIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrZXkucGFja2V0X3NlbmRfZGVzdC51LnN1Yl90ZXJtLnN1Yl90ZXJtX3VuaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBhY2tldF9zZW5kX2Rlc3Quc3ViX3Rlcm1fdW5pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NlbmRfZGVzdC5pbnRfaWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleS5wYWNrZXRfc2VuZF9kZXN0LnUuc3ViX3Rlcm0uaW50X2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGFja2V0X3NlbmRfZGVzdC5pbnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfREVTVF9UWVBFX0hPU1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwYWNrZXRfc2VuZF9kZXN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wYWNrZXRfc2VuZF9kZXN0ID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9QQUNLRVQsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfUEFDS0VUX0tFWV9JRF9QQUNLRVRfU0VORF9ERVNULCAma2V5LnBhY2tldF9zZW5kX2Rlc3QpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTUJBTF9DRkdfSU5JVCgmY2ZnLCBwYWNrZXQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19JTklUKCZjZmcsIHBhY2tldCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21iYWxfY2ZnX2NsZWFyKCZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfY2ZnX2NsZWFyKCZjZmcuaGRyKTtcbiIpOworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBOVUxMKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9jbGlfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZ2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21iYWxfYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgLyoqPCBkZWNsYXJlIG1lbW9yeSBidWZmZXIgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgYmNtY2xpX2xvZygiYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDhfdCogbGlzdF9tZW07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1Yl90ZXJtX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuc3ViX3Rlcm1faWQgPSAoYmNtYmFsX3N1Yl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViX3Rlcm1faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnN1Yl90ZXJtX2lkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfS0VZX0lEX1NVQl9URVJNX0lELCAma2V5LnN1Yl90ZXJtX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImludGZfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pbnRmX2lkID0gKGJjbWJhbF9pbnRmX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnRmX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pbnRmX2lkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfS0VZX0lEX0lOVEZfSUQsICZrZXkuaW50Zl9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19JTklUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWRtaW5fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIGFkbWluX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgYWRtaW5fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBvcGVyX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIG9wZXJfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBzZXJpYWxfbnVtYmVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgc2VyaWFsX251bWJlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFzc3dvcmQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcGFzc3dvcmQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcmVnaXN0cmF0aW9uX2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcmVnaXN0cmF0aW9uX2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdmNfcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgc3ZjX3BvcnRfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBzdmNfcG9ydF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIG1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgbWFjX2FkZHJlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX3RtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBkc190bSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIGRzX3RtKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c190bSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgdXNfdG0pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCB1c190bSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ZjX3BvcnRfaWRfbGlzdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgc3ZjX3BvcnRfaWRfbGlzdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIHN2Y19wb3J0X2lkX2xpc3QpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFnZ19wb3J0X2lkX2xpc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIGFnZ19wb3J0X2lkX2xpc3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBhZ2dfcG9ydF9pZF9saXN0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIGFkbWluX3N0YXRlKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBvcGVyX3N0YXR1cykgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgc2VyaWFsX251bWJlcikgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcGFzc3dvcmQpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIHJlZ2lzdHJhdGlvbl9pZCkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgc3ZjX3BvcnRfaWQpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIG1hY19hZGRyZXNzKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBkc190bSkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgdXNfdG0pICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIHN2Y19wb3J0X2lkX2xpc3QpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIGFnZ19wb3J0X2lkX2xpc3QpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogc2V0IG1lbW9yeSB0byB1c2UgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgbGlzdF9tZW0gPSBiY21iYWxfYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBCQ01CQUxfQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJsaXN0X21lbSA9IGJjbW9zX2NhbGxvYyhCQ01CQUxfQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKyAgICBCQ01CQUxfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBsaXN0X21lbSwgQkNNQkFMX0FQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIGxpc3RfbWVtLCBCQ01CQUxfQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtYmFsX2NmZ19nZXQoJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9jZmdfZ2V0KCZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYmNtYmFsX2FwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBOVUxMKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9jbGlfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21iYWxfYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZyBjZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1Yl90ZXJtX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuc3ViX3Rlcm1faWQgPSAoYmNtYmFsX3N1Yl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViX3Rlcm1faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnN1Yl90ZXJtX2lkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfS0VZX0lEX1NVQl9URVJNX0lELCAma2V5LnN1Yl90ZXJtX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImludGZfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pbnRmX2lkID0gKGJjbWJhbF9pbnRmX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnRmX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pbnRmX2lkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfS0VZX0lEX0lOVEZfSUQsICZrZXkuaW50Zl9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19JTklUKCZjZmcsIHN1YnNjcmliZXJfdGVybWluYWwsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWRtaW5fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21iYWxfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBhZG1pbl9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBhZG1pbl9zdGF0ZSwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtYmFsX2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtYmFsX2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbWJhbF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZlbmRvcl9pZCwgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21iYWxfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21iYWxfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtYmFsX2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX3NwZWNpZmljLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBzZXJpYWxfbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtYmFsX3NlcmlhbF9udW1iZXIgdmFsID0gIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TRVJJQUxfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgc2VyaWFsX251bWJlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwYXNzd29yZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9wYXNzd29yZCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFzc3dvcmQuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtYmFsX2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcGFzc3dvcmQuYXJyIG11c3QgaGF2ZSAxMCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtYmFsX2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbWJhbF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgMTApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwYXNzd29yZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBwYXNzd29yZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbWJhbF9wYXNzd29yZCB2YWwgPSAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMLCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1BBU1NXT1JELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcGFzc3dvcmQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbWJhbF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDM2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHJlZ2lzdHJhdGlvbl9pZC5hcnIgbXVzdCBoYXZlIDM2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21iYWxfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtYmFsX2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuYXJyLCAzNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9pZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCByZWdpc3RyYXRpb25faWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21iYWxfcmVnaXN0cmF0aW9uX2lkIHZhbCA9ICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1NVQlNDUklCRVJfVEVSTUlOQUwsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfUkVHSVNUUkFUSU9OX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcmVnaXN0cmF0aW9uX2lkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBtYWNfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBtYWNfYWRkcmVzcywgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX3RtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfdG1fc2NoZWRfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBkc190bSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBkc190bSwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9EU19UTSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX3RtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfdG1fc2NoZWRfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCB1c190bSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCB1c190bSwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9VU19UTSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9jZmdfc2V0KCZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfY2ZnX3NldCgmY2ZnLmhkcik7XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfY2xpX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2NsZWFyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbWJhbF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWJfdGVybV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnN1Yl90ZXJtX2lkID0gKGJjbWJhbF9zdWJfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1Yl90ZXJtX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5zdWJfdGVybV9pZCA9ICIpOworICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTCwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0tFWV9JRF9TVUJfVEVSTV9JRCwgJmtleS5zdWJfdGVybV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnRmX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW50Zl9pZCA9IChiY21iYWxfaW50Zl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW50Zl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaW50Zl9pZCA9ICIpOworICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTCwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0tFWV9JRF9JTlRGX0lELCAma2V5LmludGZfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTUJBTF9DRkdfSU5JVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfSU5JVCgmY2ZnLCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9jZmdfY2xlYXIoJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9jZmdfY2xlYXIoJmNmZy5oZHIpO1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIE5VTEwpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2NsaV9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZ2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXQgc3RhdDsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtYmFsX3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViX3Rlcm1faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5zdWJfdGVybV9pZCA9IChiY21iYWxfc3ViX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWJfdGVybV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuc3ViX3Rlcm1faWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1NVQlNDUklCRVJfVEVSTUlOQUwsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfU1VCX1RFUk1fSUQsICZrZXkuc3ViX3Rlcm1faWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW50Zl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmludGZfaWQgPSAoYmNtYmFsX2ludGZfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImludGZfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmludGZfaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1NVQlNDUklCRVJfVEVSTUlOQUwsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfSU5URl9JRCwgJmtleS5pbnRmX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01CQUxfU1RBVF9JTklUKCZzdGF0LCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9TVEFUX0lOSVQoJnN0YXQsIHN1YnNjcmliZXJfdGVybWluYWwsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCByeF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCByeF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCByeF9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcnhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgdHhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgdHhfcGFja2V0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgdHhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHN1YnNjcmliZXJfdGVybWluYWwsIHR4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01CQUxfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgc3Vic2NyaWJlcl90ZXJtaW5hbCwgcnhfcGFja2V0cykgJiYgIUJDTUJBTF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCByeF9ieXRlcykgJiYgIUJDTUJBTF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCB0eF9wYWNrZXRzKSAmJiAhQkNNQkFMX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHN1YnNjcmliZXJfdGVybWluYWwsIHR4X2J5dGVzKSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCBzdWJzY3JpYmVyX3Rlcm1pbmFsLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9zdGF0X2dldCgmc3RhdC5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9zdGF0X2dldCgmc3RhdC5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBiY21iYWxfYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBOVUxMKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9jbGlfdG1fcXVldWVfY2ZnX2dldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21iYWxfdG1fcXVldWVfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21iYWxfdG1fcXVldWVfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21iYWxfdG1fcXVldWVfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF90bV9xdWV1ZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbWJhbF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2NoZWRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5zY2hlZF9pZCA9IChiY21iYWxfdG1fc2NoZWRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNjaGVkX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5zY2hlZF9pZCA9ICIpOworICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfVE1fUVVFVUUsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX1NDSEVEX0lELCAma2V5LnNjaGVkX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNjaGVkX2RpciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnNjaGVkX2RpciA9IChiY21iYWxfdG1fc2NoZWRfZGlyKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2NoZWRfZGlyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5zY2hlZF9kaXIgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1RNX1FVRVVFLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9TQ0hFRF9ESVIsICZrZXkuc2NoZWRfZGlyKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaWQgPSAoYmNtYmFsX3RtX3F1ZXVlX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1RNX1FVRVVFLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9JRCwgJmtleS5pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIHRtX3F1ZXVlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfSU5JVCgmY2ZnLCB0bV9xdWV1ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmlvcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgdG1fcXVldWUsIHByaW9yaXR5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgdG1fcXVldWUsIHByaW9yaXR5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ3ZWlnaHQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3F1ZXVlLCB3ZWlnaHQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9xdWV1ZSwgd2VpZ2h0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9xdWV1ZSwgcmF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3F1ZXVlLCByYXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiYWMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3F1ZXVlLCBiYWMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9xdWV1ZSwgYmFjKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjcmVhdGlvbl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9xdWV1ZSwgY3JlYXRpb25fbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3F1ZXVlLCBjcmVhdGlvbl9tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWZfY291bnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3F1ZXVlLCByZWZfY291bnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9xdWV1ZSwgcmVmX2NvdW50KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHRtX3F1ZXVlLCBwcmlvcml0eSkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgdG1fcXVldWUsIHdlaWdodCkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgdG1fcXVldWUsIHJhdGUpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHRtX3F1ZXVlLCBiYWMpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHRtX3F1ZXVlLCBjcmVhdGlvbl9tb2RlKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB0bV9xdWV1ZSwgcmVmX2NvdW50KSkKKyAgICB7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgdG1fcXVldWUsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9xdWV1ZSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21iYWxfY2ZnX2dldCgmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2NmZ19nZXQoJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBiY21iYWxfYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIE5VTEwpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2NsaV90bV9xdWV1ZV9jZmdfc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF90bV9xdWV1ZV9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbWJhbF90bV9xdWV1ZV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF90bV9xdWV1ZV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX3RtX3F1ZXVlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtYmFsX2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzY2hlZF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnNjaGVkX2lkID0gKGJjbWJhbF90bV9zY2hlZF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2NoZWRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnNjaGVkX2lkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9UTV9RVUVVRSwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfSUQsICZrZXkuc2NoZWRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2NoZWRfZGlyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuc2NoZWRfZGlyID0gKGJjbWJhbF90bV9zY2hlZF9kaXIpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzY2hlZF9kaXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnNjaGVkX2RpciA9ICIpOworICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfVE1fUVVFVUUsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX1NDSEVEX0RJUiwgJmtleS5zY2hlZF9kaXIpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pZCA9IChiY21iYWxfdG1fcXVldWVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImlkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pZCA9ICIpOworICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfVE1fUVVFVUUsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX0lELCAma2V5LmlkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgdG1fcXVldWUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19JTklUKCZjZmcsIHRtX3F1ZXVlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByaW9yaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfdG1fcHJpb3JpdHkgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX3RtX3ByaW9yaXR5KSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9xdWV1ZSwgcHJpb3JpdHksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgdG1fcXVldWUsIHByaW9yaXR5LCAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9UTV9RVUVVRSwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfUFJJT1JJVFksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ3ZWlnaHQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF90bV93ZWlnaHQgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX3RtX3dlaWdodCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgdG1fcXVldWUsIHdlaWdodCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9xdWV1ZSwgd2VpZ2h0LCAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9UTV9RVUVVRSwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfV0VJR0hULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJhdGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfdG1fc2hhcGluZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmF0ZS5zYnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zYnIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfVE1fU0hBUElOR19JRF9TQlI7CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhdGUucGJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucGJyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB2YWwucHJlc2VuY2VfbWFzayA9IHZhbC5wcmVzZW5jZV9tYXNrIHwgQkNNQkFMX1RNX1NIQVBJTkdfSURfUEJSOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYXRlLmJ1cnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYnVyc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfVE1fU0hBUElOR19JRF9CVVJTVDsKKyAgICAgICAgfQorCisgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgdG1fcXVldWUsIHJhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21iYWxfdG1fc2hhcGluZyB2YWwgPSAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9UTV9RVUVVRSwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfUkFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIHRtX3F1ZXVlLCByYXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImJhYy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF90bV9iYWMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJhYy50eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZSA9IChiY21iYWxfdG1fYmFjX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmFjLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh2YWwudHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fQkFDX1RZUEVfVEFJTERST1A6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiYWMubWF4X3NpemUiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LnRhaWxkcm9wLm1heF9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmFjLm1heF9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX0JBQ19UWVBFX1JFRDoKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiYWMucmVkLiIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiYWMucmVkLm1pbl90aHJlc2hvbGQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC51LnJlZC5yZWQubWluX3RocmVzaG9sZCA9IChiY21iYWxfcGVyY2VudCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJhYy5yZWQubWluX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJhYy5yZWQubWF4X3RocmVzaG9sZCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnUucmVkLnJlZC5tYXhfdGhyZXNob2xkID0gKGJjbWJhbF9wZXJjZW50KSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmFjLnJlZC5tYXhfdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmFjLnJlZC5tYXhfcHJvYmFiaWxpdHkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC51LnJlZC5yZWQubWF4X3Byb2JhYmlsaXR5ID0gKGJjbWJhbF9wZXJjZW50KSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmFjLnJlZC5tYXhfcHJvYmFiaWxpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmFjLnJlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9CQUNfVFlQRV9XUkVEOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImJhYy5ncmVlbi4iKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmFjLmdyZWVuLm1pbl90aHJlc2hvbGQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC51LndyZWQuZ3JlZW4ubWluX3RocmVzaG9sZCA9IChiY21iYWxfcGVyY2VudCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJhYy5ncmVlbi5taW5fdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmFjLmdyZWVuLm1heF90aHJlc2hvbGQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC51LndyZWQuZ3JlZW4ubWF4X3RocmVzaG9sZCA9IChiY21iYWxfcGVyY2VudCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJhYy5ncmVlbi5tYXhfdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmFjLmdyZWVuLm1heF9wcm9iYWJpbGl0eSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnUud3JlZC5ncmVlbi5tYXhfcHJvYmFiaWxpdHkgPSAoYmNtYmFsX3BlcmNlbnQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiYWMuZ3JlZW4ubWF4X3Byb2JhYmlsaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJhYy5ncmVlbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiYWMueWVsbG93LiIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiYWMueWVsbG93Lm1pbl90aHJlc2hvbGQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC51LndyZWQueWVsbG93Lm1pbl90aHJlc2hvbGQgPSAoYmNtYmFsX3BlcmNlbnQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiYWMueWVsbG93Lm1pbl90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiYWMueWVsbG93Lm1heF90aHJlc2hvbGQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC51LndyZWQueWVsbG93Lm1heF90aHJlc2hvbGQgPSAoYmNtYmFsX3BlcmNlbnQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiYWMueWVsbG93Lm1heF90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiYWMueWVsbG93Lm1heF9wcm9iYWJpbGl0eSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnUud3JlZC55ZWxsb3cubWF4X3Byb2JhYmlsaXR5ID0gKGJjbWJhbF9wZXJjZW50KSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmFjLnllbGxvdy5tYXhfcHJvYmFiaWxpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmFjLnllbGxvdyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiYWMucmVkLiIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiYWMucmVkLm1pbl90aHJlc2hvbGQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC51LndyZWQucmVkLm1pbl90aHJlc2hvbGQgPSAoYmNtYmFsX3BlcmNlbnQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiYWMucmVkLm1pbl90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiYWMucmVkLm1heF90aHJlc2hvbGQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC51LndyZWQucmVkLm1heF90aHJlc2hvbGQgPSAoYmNtYmFsX3BlcmNlbnQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiYWMucmVkLm1heF90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiYWMucmVkLm1heF9wcm9iYWJpbGl0eSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnUud3JlZC5yZWQubWF4X3Byb2JhYmlsaXR5ID0gKGJjbWJhbF9wZXJjZW50KSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmFjLnJlZC5tYXhfcHJvYmFiaWxpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmFjLnJlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgIH0KKworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIHRtX3F1ZXVlLCBiYWMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21iYWxfdG1fYmFjIHZhbCA9ICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1RNX1FVRVVFLCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9CQUMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9xdWV1ZSwgYmFjLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtYmFsX2NmZ19zZXQoJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9jZmdfc2V0KCZjZmcuaGRyKTtcbiIpOworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBOVUxMKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9jbGlfdG1fcXVldWVfY2ZnX2NsZWFyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF90bV9xdWV1ZV9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbWJhbF90bV9xdWV1ZV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF90bV9xdWV1ZV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX3RtX3F1ZXVlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtYmFsX2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNjaGVkX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuc2NoZWRfaWQgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzY2hlZF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuc2NoZWRfaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1RNX1FVRVVFLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9TQ0hFRF9JRCwgJmtleS5zY2hlZF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzY2hlZF9kaXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5zY2hlZF9kaXIgPSAoYmNtYmFsX3RtX3NjaGVkX2RpcikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNjaGVkX2RpciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuc2NoZWRfZGlyID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9UTV9RVUVVRSwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfRElSLCAma2V5LnNjaGVkX2Rpcik7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmlkID0gKGJjbWJhbF90bV9xdWV1ZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmlkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9UTV9RVUVVRSwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfSUQsICZrZXkuaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTUJBTF9DRkdfSU5JVCgmY2ZnLCB0bV9xdWV1ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgdG1fcXVldWUsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtYmFsX2NmZ19jbGVhcigmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2NmZ19jbGVhcigmY2ZnLmhkcik7XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfY2xpX3RtX3F1ZXVlX3N0YXRfZ2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWJhbF90bV9xdWV1ZV9zdGF0IHN0YXQ7ICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbWJhbF90bV9xdWV1ZV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF90bV9xdWV1ZV9zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfdG1fcXVldWVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzY2hlZF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnNjaGVkX2lkID0gKGJjbWJhbF90bV9zY2hlZF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2NoZWRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnNjaGVkX2lkID0gIik7CisgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9UTV9RVUVVRSwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfSUQsICZrZXkuc2NoZWRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2NoZWRfZGlyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuc2NoZWRfZGlyID0gKGJjbWJhbF90bV9zY2hlZF9kaXIpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzY2hlZF9kaXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnNjaGVkX2RpciA9ICIpOworICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfVE1fUVVFVUUsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX1NDSEVEX0RJUiwgJmtleS5zY2hlZF9kaXIpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pZCA9IChiY21iYWxfdG1fcXVldWVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImlkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pZCA9ICIpOworICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfVE1fUVVFVUUsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX0lELCAma2V5LmlkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01CQUxfU1RBVF9JTklUKCZzdGF0LCB0bV9xdWV1ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01CQUxfU1RBVF9JTklUKCZzdGF0LCB0bV9xdWV1ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYWNrZXRzX29rIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHRtX3F1ZXVlLCBwYWNrZXRzX29rKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCB0bV9xdWV1ZSwgcGFja2V0c19vayk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnl0ZXNfb2siKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgdG1fcXVldWUsIGJ5dGVzX29rKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9TVEFUX1BST1BfR0VUKCZzdGF0LCB0bV9xdWV1ZSwgYnl0ZXNfb2spO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhY2tldHNfZGlzY2FyZGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHRtX3F1ZXVlLCBwYWNrZXRzX2Rpc2NhcmRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgdG1fcXVldWUsIHBhY2tldHNfZGlzY2FyZGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJieXRlc19kaXNjYXJkZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgdG1fcXVldWUsIGJ5dGVzX2Rpc2NhcmRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgdG1fcXVldWUsIGJ5dGVzX2Rpc2NhcmRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNQkFMX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHRtX3F1ZXVlLCBwYWNrZXRzX29rKSAmJiAhQkNNQkFMX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHRtX3F1ZXVlLCBieXRlc19vaykgJiYgIUJDTUJBTF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB0bV9xdWV1ZSwgcGFja2V0c19kaXNjYXJkZWQpICYmICFCQ01CQUxfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgdG1fcXVldWUsIGJ5dGVzX2Rpc2NhcmRlZCkpCisgICAgeworICAgICAgICBCQ01CQUxfU1RBVF9QUk9QX0dFVCgmc3RhdCwgdG1fcXVldWUsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHRtX3F1ZXVlLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9zdGF0X2dldCgmc3RhdC5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9zdGF0X2dldCgmc3RhdC5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBiY21iYWxfYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBOVUxMKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbWJhbF9jbGlfdG1fc2NoZWRfY2ZnX2dldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtYmFsX2FwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21iYWxfdG1fc2NoZWRfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21iYWxfdG1fc2NoZWRfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbWJhbF90bV9zY2hlZF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX3RtX3NjaGVkX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDhfdCogbGlzdF9tZW07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmRpciA9IChiY21iYWxfdG1fc2NoZWRfZGlyKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGlyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5kaXIgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1RNX1NDSEVELCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9ESVIsICZrZXkuZGlyKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaWQgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1RNX1NDSEVELCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9JRCwgJmtleS5pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIHRtX3NjaGVkLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfSU5JVCgmY2ZnLCB0bV9zY2hlZCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvd25lciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgdG1fc2NoZWQsIG93bmVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgdG1fc2NoZWQsIG93bmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzY2hlZF90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9zY2hlZCwgc2NoZWRfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3NjaGVkLCBzY2hlZF90eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzY2hlZF9wYXJlbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3NjaGVkLCBzY2hlZF9wYXJlbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9zY2hlZCwgc2NoZWRfcGFyZW50KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzY2hlZF9jaGlsZF90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9zY2hlZCwgc2NoZWRfY2hpbGRfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3NjaGVkLCBzY2hlZF9jaGlsZF90eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9zY2hlZCwgcmF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3NjaGVkLCByYXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0Y29udF9zbGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3NjaGVkLCB0Y29udF9zbGEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9zY2hlZCwgdGNvbnRfc2xhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjcmVhdGlvbl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9zY2hlZCwgY3JlYXRpb25fbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3NjaGVkLCBjcmVhdGlvbl9tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJxdWV1ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3NjaGVkLCBxdWV1ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9zY2hlZCwgcXVldWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWJfc2NoZWRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9zY2hlZCwgc3ViX3NjaGVkcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3NjaGVkLCBzdWJfc2NoZWRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1fcHJpb3JpdGllcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgdG1fc2NoZWQsIG51bV9wcmlvcml0aWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9HRVQoJmNmZywgdG1fc2NoZWQsIG51bV9wcmlvcml0aWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHRtX3NjaGVkLCBvd25lcikgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgdG1fc2NoZWQsIHNjaGVkX3R5cGUpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHRtX3NjaGVkLCBzY2hlZF9wYXJlbnQpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHRtX3NjaGVkLCBzY2hlZF9jaGlsZF90eXBlKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB0bV9zY2hlZCwgcmF0ZSkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgdG1fc2NoZWQsIHRjb250X3NsYSkgJiYgIUJDTUJBTF9DRkdfUFJPUF9JU19TRVQoJmNmZywgdG1fc2NoZWQsIGNyZWF0aW9uX21vZGUpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHRtX3NjaGVkLCBxdWV1ZXMpICYmICFCQ01CQUxfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHRtX3NjaGVkLCBzdWJfc2NoZWRzKSAmJiAhQkNNQkFMX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB0bV9zY2hlZCwgbnVtX3ByaW9yaXRpZXMpKQorICAgIHsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX0dFVCgmY2ZnLCB0bV9zY2hlZCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01CQUxfQ0ZHX1BST1BfR0VUKCZjZmcsIHRtX3NjaGVkLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGJjbWJhbF9hcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIEJDTUJBTF9BUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAobGlzdF9tZW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEJDTUJBTF9BUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworICAgIEJDTUJBTF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIHRtX3NjaGVkLCBsaXN0X21lbSwgQkNNQkFMX0FQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIHRtX3NjaGVkLCBsaXN0X21lbSwgQkNNQkFMX0FQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9jZmdfZ2V0KCZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfY2ZnX2dldCgmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGJjbWJhbF9hcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21iYWxfY2xpX3RtX3NjaGVkX2NmZ19zZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbWJhbF9hcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtYmFsX3RtX3NjaGVkX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtYmFsX3RtX3NjaGVkX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtYmFsX3RtX3NjaGVkX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfdG1fc2NoZWRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmRpciA9IChiY21iYWxfdG1fc2NoZWRfZGlyKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGlyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5kaXIgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1RNX1NDSEVELCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9ESVIsICZrZXkuZGlyKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaWQgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaWQgPSAiKTsKKyAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1RNX1NDSEVELCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9JRCwgJmtleS5pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNQkFMX0NGR19JTklUKCZjZmcsIHRtX3NjaGVkLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfSU5JVCgmY2ZnLCB0bV9zY2hlZCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib3duZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21iYWxfdG1fc2NoZWRfb3duZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm93bmVyLnR5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlID0gKGJjbWJhbF90bV9zY2hlZF9vd25lcl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm93bmVyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh2YWwudHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9JTlRFUkZBQ0U6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvd25lci5pbnRmX3R5cGUiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmludGVyZmFjZS5pbnRmX3R5cGUgPSAoYmNtYmFsX2ludGZfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm93bmVyLmludGZfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm93bmVyLmludGZfaWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmludGVyZmFjZS5pbnRmX2lkID0gKGJjbWJhbF9pbnRmX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvd25lci5pbnRmX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfU1VCX1RFUk06CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvd25lci5pbnRmX2lkIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5zdWJfdGVybS5pbnRmX2lkID0gKGJjbWJhbF9pbnRmX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvd25lci5pbnRmX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3duZXIuc3ViX3Rlcm1faWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LnN1Yl90ZXJtLnN1Yl90ZXJtX2lkID0gKGJjbWJhbF9zdWJfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm93bmVyLnN1Yl90ZXJtX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfQUdHX1BPUlQ6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvd25lci5pbnRmX2lkIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5hZ2dfcG9ydC5pbnRmX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmFnZ19wb3J0LnByZXNlbmNlX21hc2sgPSB2YWwudS5hZ2dfcG9ydC5wcmVzZW5jZV9tYXNrIHwgQkNNQkFMX1RNX1NDSEVEX09XTkVSX0FHR19QT1JUX0lEX0lOVEZfSUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvd25lci5zdWJfdGVybV9pZCIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUuYWdnX3BvcnQuc3ViX3Rlcm1faWQgPSAoYmNtYmFsX3N1Yl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmFnZ19wb3J0LnByZXNlbmNlX21hc2sgPSB2YWwudS5hZ2dfcG9ydC5wcmVzZW5jZV9tYXNrIHwgQkNNQkFMX1RNX1NDSEVEX09XTkVSX0FHR19QT1JUX0lEX1NVQl9URVJNX0lEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3duZXIuYWdnX3BvcnRfaWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmFnZ19wb3J0LmFnZ19wb3J0X2lkID0gKGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUuYWdnX3BvcnQucHJlc2VuY2VfbWFzayA9IHZhbC51LmFnZ19wb3J0LnByZXNlbmNlX21hc2sgfCBCQ01CQUxfVE1fU0NIRURfT1dORVJfQUdHX1BPUlRfSURfQUdHX1BPUlRfSUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9VTkk6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvd25lci5pbnRmX2lkIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS51bmkuaW50Zl9pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm93bmVyLmludGZfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvd25lci5zdWJfdGVybV9pZCIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUudW5pLnN1Yl90ZXJtX2lkID0gKGJjbWJhbF9zdWJfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm93bmVyLnN1Yl90ZXJtX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3duZXIuaWR4Iik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS51bmkuaWR4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib3duZXIuaWR4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfVklSVFVBTDoKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm93bmVyLmlkeCIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUudmlydHVhbC5pZHggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvd25lci5pZHggaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICB9CisKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9zY2hlZCwgb3duZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21iYWxfdG1fc2NoZWRfb3duZXIgdmFsID0gIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfVE1fU0NIRUQsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX09XTkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgdG1fc2NoZWQsIG93bmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2NoZWRfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX3RtX3NjaGVkX3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX3RtX3NjaGVkX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9zY2hlZCwgc2NoZWRfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9zY2hlZCwgc2NoZWRfdHlwZSwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfVE1fU0NIRUQsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic2NoZWRfcGFyZW50LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX3RtX3NjaGVkX3BhcmVudCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2NoZWRfcGFyZW50LnNjaGVkX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2NoZWRfaWQgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfVE1fU0NIRURfUEFSRU5UX0lEX1NDSEVEX0lEOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzY2hlZF9wYXJlbnQucHJpb3JpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcmlvcml0eSA9IChiY21iYWxfdG1fcHJpb3JpdHkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9UTV9TQ0hFRF9QQVJFTlRfSURfUFJJT1JJVFk7CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNjaGVkX3BhcmVudC53ZWlnaHQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53ZWlnaHQgPSAoYmNtYmFsX3RtX3dlaWdodCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB2YWwucHJlc2VuY2VfbWFzayA9IHZhbC5wcmVzZW5jZV9tYXNrIHwgQkNNQkFMX1RNX1NDSEVEX1BBUkVOVF9JRF9XRUlHSFQ7CisgICAgICAgIH0KKworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIHRtX3NjaGVkLCBzY2hlZF9wYXJlbnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21iYWxfdG1fc2NoZWRfcGFyZW50IHZhbCA9ICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1RNX1NDSEVELCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9QQVJFTlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9zY2hlZCwgc2NoZWRfcGFyZW50LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2NoZWRfY2hpbGRfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9zY2hlZCwgc2NoZWRfY2hpbGRfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9zY2hlZCwgc2NoZWRfY2hpbGRfdHlwZSwgIik7CisgICAgICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfVE1fU0NIRUQsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX0NISUxEX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmF0ZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWJhbF90bV9zaGFwaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYXRlLnNiciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNiciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9UTV9TSEFQSU5HX0lEX1NCUjsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmF0ZS5wYnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wYnIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfVE1fU0hBUElOR19JRF9QQlI7CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhdGUuYnVyc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9UTV9TSEFQSU5HX0lEX0JVUlNUOworICAgICAgICB9CisKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9zY2hlZCwgcmF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbWJhbF90bV9zaGFwaW5nIHZhbCA9ICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1RNX1NDSEVELCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9SQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgdG1fc2NoZWQsIHJhdGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidGNvbnRfc2xhLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtYmFsX3RtX3Rjb250X3NsYSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGNvbnRfc2xhLmV4dHJhX2J3X2VsaWciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5leHRyYV9id19lbGlnID0gKGJjbWJhbF9leHRyYV9id19lbGlnaWJpbGl0eV90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB2YWwucHJlc2VuY2VfbWFzayA9IHZhbC5wcmVzZW5jZV9tYXNrIHwgQkNNQkFMX1RNX1RDT05UX1NMQV9JRF9FWFRSQV9CV19FTElHOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0Y29udF9zbGEubnJ0X2NiciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5ydF9jYnIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfVE1fVENPTlRfU0xBX0lEX05SVF9DQlI7CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRjb250X3NsYS5ydF9jYnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ydF9jYnIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIHZhbC5wcmVzZW5jZV9tYXNrID0gdmFsLnByZXNlbmNlX21hc2sgfCBCQ01CQUxfVE1fVENPTlRfU0xBX0lEX1JUX0NCUjsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGNvbnRfc2xhLnJ0X3Byb2ZpbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ydF9wcm9maWxlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB2YWwucHJlc2VuY2VfbWFzayA9IHZhbC5wcmVzZW5jZV9tYXNrIHwgQkNNQkFMX1RNX1RDT05UX1NMQV9JRF9SVF9QUk9GSUxFOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0Y29udF9zbGEubnJ0X3Byb2ZpbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ucnRfcHJvZmlsZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgdmFsLnByZXNlbmNlX21hc2sgPSB2YWwucHJlc2VuY2VfbWFzayB8IEJDTUJBTF9UTV9UQ09OVF9TTEFfSURfTlJUX1BST0ZJTEU7CisgICAgICAgIH0KKworICAgICAgICBCQ01CQUxfQ0ZHX1BST1BfU0VUKCZjZmcsIHRtX3NjaGVkLCB0Y29udF9zbGEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21iYWxfdG1fdGNvbnRfc2xhIHZhbCA9ICIpOworICAgICAgICBiY21iYWxfYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01CQUxfT0JKX0lEX1RNX1NDSEVELCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9UQ09OVF9TTEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9zY2hlZCwgdGNvbnRfc2xhLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibnVtX3ByaW9yaXRpZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNQkFMX0NGR19QUk9QX1NFVCgmY2ZnLCB0bV9zY2hlZCwgbnVtX3ByaW9yaXRpZXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTUJBTF9DRkdfUFJPUF9TRVQoJmNmZywgdG1fc2NoZWQsIG51bV9wcmlvcml0aWVzLCAiKTsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9sb2dfcHJvcF92YWwoQkNNQkFMX09CSl9JRF9UTV9TQ0hFRCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfTlVNX1BSSU9SSVRJRVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21iYWxfY2ZnX3NldCgmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtYmFsX2NmZ19zZXQoJmNmZy5oZHIpO1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIE5VTEwpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2NsaV90bV9zY2hlZF9jZmdfY2xlYXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtYmFsX3RtX3NjaGVkX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtYmFsX3RtX3NjaGVkX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtYmFsX3RtX3NjaGVkX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21iYWxfdG1fc2NoZWRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21iYWxfYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21iYWxfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZGlyID0gKGJjbWJhbF90bV9zY2hlZF9kaXIpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkaXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmRpciA9ICIpOworICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfVE1fU0NIRUQsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfVE1fU0NIRURfS0VZX0lEX0RJUiwgJmtleS5kaXIpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pZCA9IChiY21iYWxfdG1fc2NoZWRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21iYWxfYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImlkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pZCA9ICIpOworICAgIGJjbWJhbF9hcGljbGlfbG9nX3Byb3BfdmFsKEJDTUJBTF9PQkpfSURfVE1fU0NIRUQsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01CQUxfVE1fU0NIRURfS0VZX0lEX0lELCAma2V5LmlkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01CQUxfQ0ZHX0lOSVQoJmNmZywgdG1fc2NoZWQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNQkFMX0NGR19JTklUKCZjZmcsIHRtX3NjaGVkLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbWJhbF9jZmdfY2xlYXIoJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbWJhbF9jZmdfY2xlYXIoJmNmZy5oZHIpO1xuIik7CisgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIE5VTEwpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX2FwaWNsaV9yb290KGJjbWJhbF9tZ3RfZ3JvdXAgZ3JvdXBfdHlwZSwgYmNtYmFsX29ial9tc2dfdHlwZSBtc2dfdHlwZSwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbWJhbF9hcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21iYWxfb2JqX2lkIG9ial9pZDsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9iamVjdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgb2JqX2lkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtYmFsX2FwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYmplY3QgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgc3dpdGNoIChvYmpfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfQUNDRVNTX1RFUk1JTkFMOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX09CSl9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfYWNjZXNzX3Rlcm1pbmFsX2NmZ19nZXQoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9PQkpfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX2FjY2Vzc190ZXJtaW5hbF9jZmdfc2V0KHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfT0JKX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX2FjY2Vzc190ZXJtaW5hbF9jZmdfY2xlYXIoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfRkxPVzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9PQkpfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX2Zsb3dfY2ZnX2dldChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX09CSl9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfZmxvd19jZmdfc2V0KHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfT0JKX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX2Zsb3dfY2ZnX2NsZWFyKHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX2Zsb3dfc3RhdF9nZXQoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX0dST1VQOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX09CSl9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfZ3JvdXBfY2ZnX2dldChzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfT0JKX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtYmFsX2NsaV9ncm91cF9jZmdfc2V0KHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9PQkpfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfZ3JvdXBfY2ZnX2NsZWFyKHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9PQkpfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX2ludGVyZmFjZV9jZmdfZ2V0KHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9PQkpfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX2ludGVyZmFjZV9jZmdfc2V0KHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9PQkpfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfaW50ZXJmYWNlX2NmZ19jbGVhcihzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtYmFsX2NsaV9pbnRlcmZhY2Vfc3RhdF9nZXQoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX1BBQ0tFVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9PQkpfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX3BhY2tldF9jZmdfZ2V0KHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9PQkpfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX3BhY2tldF9jZmdfc2V0KHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9PQkpfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfcGFja2V0X2NmZ19jbGVhcihzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX09CSl9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZ2V0KHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9PQkpfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX3NldChzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfT0JKX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2NsZWFyKHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21iYWxfY2xpX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9nZXQoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX1RNX1FVRVVFOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX09CSl9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfdG1fcXVldWVfY2ZnX2dldChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX09CSl9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfdG1fcXVldWVfY2ZnX3NldChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX09CSl9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtYmFsX2NsaV90bV9xdWV1ZV9jZmdfY2xlYXIoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfdG1fcXVldWVfc3RhdF9nZXQoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX1RNX1NDSEVEOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX09CSl9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfdG1fc2NoZWRfY2ZnX2dldChzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfT0JKX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtYmFsX2NsaV90bV9zY2hlZF9jZmdfc2V0KHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9PQkpfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbWJhbF9jbGlfdG1fc2NoZWRfY2ZnX2NsZWFyKHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KK30KKworLyogUGVyZm9ybSBhbiBBUEkgY2FsbCBiYXNlZCBvbiBDTEkgaW5wdXQgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfY2FsbChiY21iYWxfbWd0X2dyb3VwIGdyb3VwX3R5cGUsIGJjbWJhbF9vYmpfbXNnX3R5cGUgbXNnX3R5cGUsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21iYWxfYXBpY2xpX2J5dGVfcG9vbCBieXRlX3Bvb2w7CisKKyAgICAvKiBzZXR1cCBtZW1vcnkgcG9vbCBmb3IgZHluYW1pY2FsbHktc2l6ZWQgbGlzdCBtZW1vcnkgYWxsb2NhdGlvbiAqLworICAgIGVyciA9IGJjbWJhbF9hcGljbGlfYnl0ZV9wb29sX2NyZWF0ZSgmYnl0ZV9wb29sKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIGNhbGwgdGhlIHJvb3QgQVBJIGhhbmRsZXIgKi8KKyAgICBlcnIgPSBiY21iYWxfYXBpY2xpX3Jvb3QoZ3JvdXBfdHlwZSwgbXNnX3R5cGUsIHNlc3Npb24sICZieXRlX3Bvb2wpOworCisgICAgLyogZnJlZSBhbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGJjbWJhbF9hcGljbGlfYnl0ZV9wb29sX2Rlc3Ryb3koJmJ5dGVfcG9vbCk7CisKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGlfaGFuZGxlcnMuaCBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliYmFsYXBpY2xpL2JhbF9hcGlfY2xpX2hhbmRsZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3ZjFmYwotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliYmFsYXBpY2xpL2JhbF9hcGlfY2xpX2hhbmRsZXJzLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIEJDTUJBTF9BUElDTElfSEFORExFUlNfSF8KKyNkZWZpbmUgQkNNQkFMX0FQSUNMSV9IQU5ETEVSU19IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmFsX2FwaS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorCisvKiB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgY291bGQgcG9zc2libHkgYnkgdXNlZCBieSBhbGwgdmFyaWFibGUtc2l6ZWQgbGlzdHMgd2l0aGluIGEgR0VUIHJlcXVlc3QgKi8KKyNkZWZpbmUgQkNNQkFMX0FQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUgKDMyICogMTAyNCkKKworLyogUGVyZm9ybSBhbiBBUEkgY2FsbCBiYXNlZCBvbiBDTEkgaW5wdXQgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfY2FsbCgKKyAgICBiY21iYWxfbWd0X2dyb3VwIGdyb3VwX3R5cGUsCisgICAgYmNtYmFsX29ial9tc2dfdHlwZSBtc2dfdHlwZSwKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGlfaGVscGVycy5jIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGlfaGVscGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjZlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaWNsaS9iYWxfYXBpX2NsaV9oZWxwZXJzLmMKQEAgLTAsMCArMSwxOTEzIEBACisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8YmFsX2FwaS5oPgorI2luY2x1ZGUgImJhbF9hcGlfY2xpX2hlbHBlcnMuaCIKKworLyogYWxsb3cgcG9zc2libHkgdW51c2VkIGRlc2NyaXB0b3JzIHRvIG1ha2UgdGhlIGNvZGUgZWFzaWVyIHRvIGdlbmVyYXRlICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgQkNNX0RFU0NSICAgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlCisjZGVmaW5lIEJDTV9ERVNDUgorI2VuZGlmCisKKy8qIFVubGVzcyBzcGVjaWZpZWQgaW4gdGhlIFhNTCBtb2RlbCwgZHluYW1pYyBhcnJheXMgd2lsbCBoYXZlIHRoaXMgbWF4IHNpemUgKGluIGJ5dGVzLCB3aWxsIGRpdmlkZSBieSBlbGVtZW50IHNpemUpICovCisjZGVmaW5lIERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAgICAyMDQ4CisKKy8qID09PT0gQmFzZSBUeXBlIERlc2NyaXB0b3JzID09PT0gKi8KK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDhfdCA9IHsgLm5hbWUgPSAidWludDgiLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfVU5VTSwgLnNpemUgPSBzaXplb2YodWludDhfdCkgfTsKKworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MTZfdCA9IHsgLm5hbWUgPSAidWludDE2IiwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOVU0sIC5zaXplID0gc2l6ZW9mKHVpbnQxNl90KSB9OworCitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQzMl90ID0geyAubmFtZSA9ICJ1aW50MzIiLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfVU5VTSwgLnNpemUgPSBzaXplb2YodWludDMyX3QpIH07CisKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDY0X3QgPSB7IC5uYW1lID0gInVpbnQ2NCIsIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9VTlVNLCAuc2l6ZSA9IHNpemVvZih1aW50NjRfdCkgfTsKKworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2hleCA9IHsgLm5hbWUgPSAidWludDhfaGV4IiwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOVU1fSEVYLCAuc2l6ZSA9IHNpemVvZih1aW50OF90KSB9OworCitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCA9IHsgLm5hbWUgPSAidWludDE2X2hleCIsIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9VTlVNX0hFWCwgLnNpemUgPSBzaXplb2YodWludDE2X3QpIH07CisKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDMyX3RfaGV4ID0geyAubmFtZSA9ICJ1aW50MzJfaGV4IiwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOVU1fSEVYLCAuc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgfTsKKworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50NjRfdF9oZXggPSB7IC5uYW1lID0gInVpbnQ2NF9oZXgiLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfVU5VTV9IRVgsIC5zaXplID0gc2l6ZW9mKHVpbnQ2NF90KSB9OworCitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2ludDhfdCA9IHsgLm5hbWUgPSAiaW50OCIsIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TTlVNLCAuc2l6ZSA9IHNpemVvZihpbnQ4X3QpIH07CisKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfaW50MTZfdCA9IHsgLm5hbWUgPSAiaW50MTYiLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfU05VTSwgLnNpemUgPSBzaXplb2YoaW50MTZfdCkgfTsKKworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9pbnQzMl90ID0geyAubmFtZSA9ICJpbnQzMiIsIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TTlVNLCAuc2l6ZSA9IHNpemVvZihpbnQzMl90KSB9OworCitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2ludDY0X3QgPSB7IC5uYW1lID0gImludDY0IiwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NOVU0sIC5zaXplID0gc2l6ZW9mKGludDY0X3QpIH07CisKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfZmxvYXQgPSB7IC5uYW1lID0gImZsb2F0IiwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0ZMT0FULCAuc2l6ZSA9IHNpemVvZihmbG9hdCkgfTsKKworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9kb3VibGUgPSB7IC5uYW1lID0gImRvdWJsZSIsIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9GTE9BVCwgLnNpemUgPSBzaXplb2YoZG91YmxlKSB9OworCitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWMiLCAuZGVzY3IgPSAiTUFDIGFkZHJlc3MiLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfTUFDLCAuc2l6ZSA9IHNpemVvZihiY21vc19tYWNfYWRkcmVzcykgfTsKKworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vc19pcHY0X2FkZHJlc3MgPSB7IC5uYW1lID0gImlwdjQiLCAuZGVzY3IgPSAiSVB2NCBhZGRyZXNzIiwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0lQVjQsIC5zaXplID0gc2l6ZW9mKGJjbW9zX2lwdjRfYWRkcmVzcykgfTsKKworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vc19ib29sID0geyAubmFtZSA9ICJib29sIiwgLmRlc2NyID0gIkJvb2xlYW4iLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfQk9PTCwgLnNpemUgPSBzaXplb2YoYmNtb3NfYm9vbCkgfTsKKworLyogPT09PSBPYmplY3QgVHlwZSBJbmZvcm1hdGlvbiA9PT09ICovCitzdGF0aWMgY2hhciAqb2JqZWN0X25hbWVbXSA9IHsgImFjY2Vzc190ZXJtaW5hbCIsICJmbG93IiwgImdyb3VwIiwgImludGVyZmFjZSIsICJwYWNrZXQiLCAic3Vic2NyaWJlcl90ZXJtaW5hbCIsICJ0bV9xdWV1ZSIsICJ0bV9zY2hlZCIgfTsKK3N0YXRpYyBjaGFyICpvYmplY3RfZGVzY3JbXSA9IHsgIkJBTCBBY2Nlc3MgVGVybWluYWwgT2JqZWN0IiwgIkJBTCBGbG93IiwgIkJBTCBHcm91cCIsICJCQUwgaW50ZXJmYWNlIG9iamVjdCIsICJQYWNrZXQgdGhhdCBjYW4gYmUgdHJhbnNtaXR0ZWQgb3IgcmVjZWl2ZWQiLCAiQkFMIFN1YnNjcmliZXIgVGVybWluYWwiLCAiVHJhbnNtaXQgcXVldWUiLCAiU2NoZWR1bGluZyBub2RlIiB9OworCisvKiA9PT09IFN1cHBvcnRpbmcgVHlwZXMgPT09PSAqLworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFkbWluX3N0YXRlIiwgLnZhbCA9IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfQ0ZHX0lEX0FETUlOX1NUQVRFIH0sIHsgLm5hbWUgPSAib3Blcl9zdGF0dXMiLCAudmFsID0gQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9DRkdfSURfT1BFUl9TVEFUVVMgfSwgeyAubmFtZSA9ICJpd2ZfbW9kZSIsIC52YWwgPSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9JV0ZfTU9ERSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2lkID0geyAubmFtZSA9ICJiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhY2Nlc3NfdGVybWluYWxfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAudmFsID0gQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfQURNSU5fU1RBVEUgfSwgeyAubmFtZSA9ICJvcGVyX3N0YXR1cyIsIC52YWwgPSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9PUEVSX1NUQVRVUyB9LCB7IC5uYW1lID0gIml3Zl9tb2RlIiwgLnZhbCA9IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfSU5EX0lEX0lXRl9NT0RFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWQgPSB7IC5uYW1lID0gImJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFjY2Vzc190ZXJtaW5hbF9pbmQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWQpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhY2Nlc3NfdGVybV9pZCIsIC52YWwgPSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0tFWV9JRF9BQ0NFU1NfVEVSTV9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X2lkID0geyAubmFtZSA9ICJiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhY2Nlc3NfdGVybWluYWxfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX2FjdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTUJBTF9BQ1RJT05fSURfTk9ORSB9LCB7IC5uYW1lID0gImNtZHNfYml0bWFzayIsIC52YWwgPSBCQ01CQUxfQUNUSU9OX0lEX0NNRFNfQklUTUFTSyB9LCB7IC5uYW1lID0gIm9fdmlkIiwgLnZhbCA9IEJDTUJBTF9BQ1RJT05fSURfT19WSUQgfSwgeyAubmFtZSA9ICJvX3BiaXRzIiwgLnZhbCA9IEJDTUJBTF9BQ1RJT05fSURfT19QQklUUyB9LCB7IC5uYW1lID0gIm9fdHBpZCIsIC52YWwgPSBCQ01CQUxfQUNUSU9OX0lEX09fVFBJRCB9LCB7IC5uYW1lID0gImlfdmlkIiwgLnZhbCA9IEJDTUJBTF9BQ1RJT05fSURfSV9WSUQgfSwgeyAubmFtZSA9ICJpX3BiaXRzIiwgLnZhbCA9IEJDTUJBTF9BQ1RJT05fSURfSV9QQklUUyB9LCB7IC5uYW1lID0gImlfdHBpZCIsIC52YWwgPSBCQ01CQUxfQUNUSU9OX0lEX0lfVFBJRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9hY3Rpb25faWQgPSB7IC5uYW1lID0gImJjbWJhbF9hY3Rpb25faWQiLCAuZGVzY3IgPSAiYWN0aW9uIElEIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2FjdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssIC54ID0geyAuZSA9IGJjbWJhbF9hY3Rpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfYWN0aW9uX2NtZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTUJBTF9BQ1RJT05fQ01EX0lEX05PTkUgfSwgeyAubmFtZSA9ICJhZGRfb3V0ZXJfdGFnIiwgLnZhbCA9IEJDTUJBTF9BQ1RJT05fQ01EX0lEX0FERF9PVVRFUl9UQUcgfSwgeyAubmFtZSA9ICJyZW1vdmVfb3V0ZXJfdGFnIiwgLnZhbCA9IEJDTUJBTF9BQ1RJT05fQ01EX0lEX1JFTU9WRV9PVVRFUl9UQUcgfSwgeyAubmFtZSA9ICJ4bGF0ZV9vdXRlcl90YWciLCAudmFsID0gQkNNQkFMX0FDVElPTl9DTURfSURfWExBVEVfT1VURVJfVEFHIH0sIHsgLm5hbWUgPSAieGxhdGVfdHdvX3RhZ3MiLCAudmFsID0gQkNNQkFMX0FDVElPTl9DTURfSURfWExBVEVfVFdPX1RBR1MgfSwgeyAubmFtZSA9ICJkaXNjYXJkX2RzX2JjYXN0IiwgLnZhbCA9IEJDTUJBTF9BQ1RJT05fQ01EX0lEX0RJU0NBUkRfRFNfQkNBU1QgfSwgeyAubmFtZSA9ICJkaXNjYXJkX2RzX3Vua25vd24iLCAudmFsID0gQkNNQkFMX0FDVElPTl9DTURfSURfRElTQ0FSRF9EU19VTktOT1dOIH0sIHsgLm5hbWUgPSAiYWRkX3R3b190YWdzIiwgLnZhbCA9IEJDTUJBTF9BQ1RJT05fQ01EX0lEX0FERF9UV09fVEFHUyB9LCB7IC5uYW1lID0gInJlbW92ZV90d29fdGFncyIsIC52YWwgPSBCQ01CQUxfQUNUSU9OX0NNRF9JRF9SRU1PVkVfVFdPX1RBR1MgfSwgeyAubmFtZSA9ICJyZW1hcmtfcGJpdHMiLCAudmFsID0gQkNNQkFMX0FDVElPTl9DTURfSURfUkVNQVJLX1BCSVRTIH0sIHsgLm5hbWUgPSAiY29weV9wYml0cyIsIC52YWwgPSBCQ01CQUxfQUNUSU9OX0NNRF9JRF9DT1BZX1BCSVRTIH0sIHsgLm5hbWUgPSAicmV2ZXJzZV9jb3B5X3BiaXRzIiwgLnZhbCA9IEJDTUJBTF9BQ1RJT05fQ01EX0lEX1JFVkVSU0VfQ09QWV9QQklUUyB9LCB7IC5uYW1lID0gImRzY3BfdG9fcGJpdHMiLCAudmFsID0gQkNNQkFMX0FDVElPTl9DTURfSURfRFNDUF9UT19QQklUUyB9LCB7IC5uYW1lID0gInRyYXBfdG9faG9zdCIsIC52YWwgPSBCQ01CQUxfQUNUSU9OX0NNRF9JRF9UUkFQX1RPX0hPU1QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfYWN0aW9uX2NtZF9pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX2FjdGlvbl9jbWRfaWQiLCAuZGVzY3IgPSAiYWN0aW9uX2NtZF9pZCIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9hY3Rpb25fY21kX2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtYmFsX2FjdGlvbl9jbWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9hY3Rpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicHJlc2VuY2VfbWFzayIsIC5kZXNjciA9ICJQcmVzZW5jZSBNYXNrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9hY3Rpb24sIHByZXNlbmNlX21hc2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9hY3Rpb25faWQsIC5mbGFncyA9IEJDTUJBTF9BUElDTElfRklFTERfREVTQ1JfRkxBR1NfUFJFU0VOQ0VfTUFTSyB9LCB7IC5uYW1lID0gImNtZHNfYml0bWFzayIsIC5kZXNjciA9ICJDb21tYW5kcyBiaXRtYXNrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9hY3Rpb24sIGNtZHNfYml0bWFzayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2FjdGlvbl9jbWRfaWQgfSwgeyAubmFtZSA9ICJvX3ZpZCIsIC5kZXNjciA9ICJPdXRlciB2aWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2FjdGlvbiwgb192aWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib19wYml0cyIsIC5kZXNjciA9ICJPdXRlciBwYml0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfYWN0aW9uLCBvX3BiaXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAib190cGlkIiwgLmRlc2NyID0gIk91dGVyIHRwaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2FjdGlvbiwgb190cGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImlfdmlkIiwgLmRlc2NyID0gIklubmVyIHZpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfYWN0aW9uLCBpX3ZpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJpX3BiaXRzIiwgLmRlc2NyID0gIklubmVyIHBiaXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9hY3Rpb24sIGlfcGJpdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJpX3RwaWQiLCAuZGVzY3IgPSAiSW5uZXIgdHBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfYWN0aW9uLCBpX3RwaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2FjdGlvbiA9IHsgLm5hbWUgPSAiYmNtYmFsX2FjdGlvbiIsIC5kZXNjciA9ICJhY3Rpb24iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfYWN0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9hY3Rpb25fZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX2FjdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdTggPSB7IC5uYW1lID0gImJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdTgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgYWdncmVnYXRpb25fcG9ydF9pZCIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdTgpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QsIC5sZW5fc2l6ZSA9IDEsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZihiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCkgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX2NsYXNzaWZpZXJfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01CQUxfQ0xBU1NJRklFUl9JRF9OT05FIH0sIHsgLm5hbWUgPSAib190cGlkIiwgLnZhbCA9IEJDTUJBTF9DTEFTU0lGSUVSX0lEX09fVFBJRCB9LCB7IC5uYW1lID0gIm9fdmlkIiwgLnZhbCA9IEJDTUJBTF9DTEFTU0lGSUVSX0lEX09fVklEIH0sIHsgLm5hbWUgPSAiaV90cGlkIiwgLnZhbCA9IEJDTUJBTF9DTEFTU0lGSUVSX0lEX0lfVFBJRCB9LCB7IC5uYW1lID0gImlfdmlkIiwgLnZhbCA9IEJDTUJBTF9DTEFTU0lGSUVSX0lEX0lfVklEIH0sIHsgLm5hbWUgPSAib19wYml0cyIsIC52YWwgPSBCQ01CQUxfQ0xBU1NJRklFUl9JRF9PX1BCSVRTIH0sIHsgLm5hbWUgPSAiaV9wYml0cyIsIC52YWwgPSBCQ01CQUxfQ0xBU1NJRklFUl9JRF9JX1BCSVRTIH0sIHsgLm5hbWUgPSAiZXRoZXJfdHlwZSIsIC52YWwgPSBCQ01CQUxfQ0xBU1NJRklFUl9JRF9FVEhFUl9UWVBFIH0sIHsgLm5hbWUgPSAiZHN0X21hYyIsIC52YWwgPSBCQ01CQUxfQ0xBU1NJRklFUl9JRF9EU1RfTUFDIH0sIHsgLm5hbWUgPSAic3JjX21hYyIsIC52YWwgPSBCQ01CQUxfQ0xBU1NJRklFUl9JRF9TUkNfTUFDIH0sIHsgLm5hbWUgPSAiaXBfcHJvdG8iLCAudmFsID0gQkNNQkFMX0NMQVNTSUZJRVJfSURfSVBfUFJPVE8gfSwgeyAubmFtZSA9ICJkc3RfaXAiLCAudmFsID0gQkNNQkFMX0NMQVNTSUZJRVJfSURfRFNUX0lQIH0sIHsgLm5hbWUgPSAic3JjX2lwIiwgLnZhbCA9IEJDTUJBTF9DTEFTU0lGSUVSX0lEX1NSQ19JUCB9LCB7IC5uYW1lID0gInNyY19wb3J0IiwgLnZhbCA9IEJDTUJBTF9DTEFTU0lGSUVSX0lEX1NSQ19QT1JUIH0sIHsgLm5hbWUgPSAiZHN0X3BvcnQiLCAudmFsID0gQkNNQkFMX0NMQVNTSUZJRVJfSURfRFNUX1BPUlQgfSwgeyAubmFtZSA9ICJwa3RfdGFnX3R5cGUiLCAudmFsID0gQkNNQkFMX0NMQVNTSUZJRVJfSURfUEtUX1RBR19UWVBFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2NsYXNzaWZpZXJfaWQgPSB7IC5uYW1lID0gImJjbWJhbF9jbGFzc2lmaWVyX2lkIiwgLmRlc2NyID0gImNsYXNzaWZpZXIgSUQiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfY2xhc3NpZmllcl9pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssIC54ID0geyAuZSA9IGJjbWJhbF9jbGFzc2lmaWVyX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX3BrdF90YWdfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTUJBTF9QS1RfVEFHX1RZUEVfTk9ORSB9LCB7IC5uYW1lID0gInVudGFnZ2VkIiwgLnZhbCA9IEJDTUJBTF9QS1RfVEFHX1RZUEVfVU5UQUdHRUQgfSwgeyAubmFtZSA9ICJzaW5nbGVfdGFnIiwgLnZhbCA9IEJDTUJBTF9QS1RfVEFHX1RZUEVfU0lOR0xFX1RBRyB9LCB7IC5uYW1lID0gImRvdWJsZV90YWciLCAudmFsID0gQkNNQkFMX1BLVF9UQUdfVFlQRV9ET1VCTEVfVEFHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3BrdF90YWdfdHlwZSA9IHsgLm5hbWUgPSAiYmNtYmFsX3BrdF90YWdfdHlwZSIsIC5kZXNjciA9ICJQYWNrZXQgdGFnIHR5cGUiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfcGt0X3RhZ190eXBlKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtYmFsX3BrdF90YWdfdHlwZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2NsYXNzaWZpZXJfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicHJlc2VuY2VfbWFzayIsIC5kZXNjciA9ICJQcmVzZW5jZSBNYXNrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9jbGFzc2lmaWVyLCBwcmVzZW5jZV9tYXNrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfY2xhc3NpZmllcl9pZCwgLmZsYWdzID0gQkNNQkFMX0FQSUNMSV9GSUVMRF9ERVNDUl9GTEFHU19QUkVTRU5DRV9NQVNLIH0sIHsgLm5hbWUgPSAib190cGlkIiwgLmRlc2NyID0gIk91dGVyIFRQSUQgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9jbGFzc2lmaWVyLCBvX3RwaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib192aWQiLCAuZGVzY3IgPSAiT3V0ZXIgVklEIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfY2xhc3NpZmllciwgb192aWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiaV90cGlkIiwgLmRlc2NyID0gIklubmVyIFRQSUQgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9jbGFzc2lmaWVyLCBpX3RwaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiaV92aWQiLCAuZGVzY3IgPSAiSW5uZXIgVklEIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfY2xhc3NpZmllciwgaV92aWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib19wYml0cyIsIC5kZXNjciA9ICJPdXRlciBQQklUUyBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2NsYXNzaWZpZXIsIG9fcGJpdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJpX3BiaXRzIiwgLmRlc2NyID0gIklubmVyIFBCSVRTIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfY2xhc3NpZmllciwgaV9wYml0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImV0aGVyX3R5cGUiLCAuZGVzY3IgPSAiRXRoZXJ0eXBlIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfY2xhc3NpZmllciwgZXRoZXJfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJkc3RfbWFjIiwgLmRlc2NyID0gIkRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfY2xhc3NpZmllciwgZHN0X21hYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJzcmNfbWFjIiwgLmRlc2NyID0gIlNvdXJjZSBNQUMgYWRkcmVzcyBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2NsYXNzaWZpZXIsIHNyY19tYWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAiaXBfcHJvdG8iLCAuZGVzY3IgPSAiSVAgcHJvdG9jb2wgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9jbGFzc2lmaWVyLCBpcF9wcm90byksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImRzdF9pcCIsIC5kZXNjciA9ICJEZXN0aW5hdGlvbiBJUCBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfY2xhc3NpZmllciwgZHN0X2lwKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19pcHY0X2FkZHJlc3MgfSwgeyAubmFtZSA9ICJzcmNfaXAiLCAuZGVzY3IgPSAiU291cmNlIElQIGFkZHJlc3Mgb2YgdGhlIHBhY2tldCB0byBiZSBjbGFzc2lmaWVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9jbGFzc2lmaWVyLCBzcmNfaXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2lwdjRfYWRkcmVzcyB9LCB7IC5uYW1lID0gInNyY19wb3J0IiwgLmRlc2NyID0gIlNvdXJjZSBwb3J0IG9mIHRoZSBwYWNrZXQgdG8gYmUgY2xhc3NpZmllZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfY2xhc3NpZmllciwgc3JjX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZHN0X3BvcnQiLCAuZGVzY3IgPSAiRGVzdGluYXRpb24gcG9ydCBvZiB0aGUgcGFja2V0IHRvIGJlIGNsYXNzaWZpZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2NsYXNzaWZpZXIsIGRzdF9wb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInBrdF90YWdfdHlwZSIsIC5kZXNjciA9ICJUaGUgdGFnIHR5cGUgb2YgdGhlIGluZ3Jlc3MgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfY2xhc3NpZmllciwgcGt0X3RhZ190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfcGt0X3RhZ190eXBlIH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2NsYXNzaWZpZXIgPSB7IC5uYW1lID0gImJjbWJhbF9jbGFzc2lmaWVyIiwgLmRlc2NyID0gImNsYXNzaWZpZXIiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfY2xhc3NpZmllciksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfY2xhc3NpZmllcl9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfY2xhc3NpZmllcl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX2NvbnRyb2xfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGlzYWJsZSIsIC52YWwgPSBCQ01CQUxfQ09OVFJPTF9ESVNBQkxFIH0sIHsgLm5hbWUgPSAiZW5hYmxlIiwgLnZhbCA9IEJDTUJBTF9DT05UUk9MX0VOQUJMRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9jb250cm9sID0geyAubmFtZSA9ICJiY21iYWxfY29udHJvbCIsIC5kZXNjciA9ICJHZW5lcmljIGVuYWJsZS9kaXNhYmxlIGVudW1lcmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX2NvbnRyb2xfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfZGVzdF90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5uaSIsIC52YWwgPSBCQ01CQUxfREVTVF9UWVBFX05OSSB9LCB7IC5uYW1lID0gInN1Yl90ZXJtIiwgLnZhbCA9IEJDTUJBTF9ERVNUX1RZUEVfU1VCX1RFUk0gfSwgeyAubmFtZSA9ICJob3N0IiwgLnZhbCA9IEJDTUJBTF9ERVNUX1RZUEVfSE9TVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9kZXN0X3R5cGUgPSB7IC5uYW1lID0gImJjbWJhbF9kZXN0X3R5cGUiLCAuZGVzY3IgPSAiRGVzdGluYXRpb24gdHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9kZXN0X3R5cGUpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX2Rlc3RfdHlwZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2Rlc3RfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidHlwZSIsIC5kZXNjciA9ICJwYWNrZXQgZGVzdGluYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Rlc3QsIHR5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9kZXN0X3R5cGUgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2Rlc3Rfbm5pX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImludF9pZCIsIC5kZXNjciA9ICJJbnRlcmZhY2UgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Rlc3QsIHUubm5pLmludF9pZCkgLSBvZmZzZXRvZihiY21iYWxfZGVzdCwgdS5ubmkuaW50X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9kZXN0X25uaSA9IHsgLm5hbWUgPSAiYmNtYmFsX2Rlc3Rfbm5pIiwgLmRlc2NyID0gIlBhY2tldCBkZXN0aW5hdGlvbiBubmkiLCAuc2l6ZSA9IHNpemVvZigoKGJjbWJhbF9kZXN0ICopMCktPnUubm5pKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9kZXN0X25uaV9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfZGVzdF9ubmlfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2Rlc3Rfc3ViX3Rlcm1fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3ViX3Rlcm1faWQiLCAuZGVzY3IgPSAiU3Vic2NyaWJlciB0ZXJtaW5hbCBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZGVzdCwgdS5zdWJfdGVybS5zdWJfdGVybV9pZCkgLSBvZmZzZXRvZihiY21iYWxfZGVzdCwgdS5zdWJfdGVybS5zdWJfdGVybV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzdWJfdGVybV91bmkiLCAuZGVzY3IgPSAiU3Vic2NyaWJlciB0ZXJtaW5hbCBVTkkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Rlc3QsIHUuc3ViX3Rlcm0uc3ViX3Rlcm1fdW5pKSAtIG9mZnNldG9mKGJjbWJhbF9kZXN0LCB1LnN1Yl90ZXJtLnN1Yl90ZXJtX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImludF9pZCIsIC5kZXNjciA9ICJJbnRlcmZhY2UgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Rlc3QsIHUuc3ViX3Rlcm0uaW50X2lkKSAtIG9mZnNldG9mKGJjbWJhbF9kZXN0LCB1LnN1Yl90ZXJtLnN1Yl90ZXJtX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9kZXN0X3N1Yl90ZXJtID0geyAubmFtZSA9ICJiY21iYWxfZGVzdF9zdWJfdGVybSIsIC5kZXNjciA9ICJQYWNrZXQgZGVzdGluYXRpb24gc3Vic2NyaWJlciB0ZXJtaW5hbCIsIC5zaXplID0gc2l6ZW9mKCgoYmNtYmFsX2Rlc3QgKikwKS0+dS5zdWJfdGVybSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfZGVzdF9zdWJfdGVybV9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfZGVzdF9zdWJfdGVybV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfZGVzdF91bmlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1Lm5uaSIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Rlc3QsIHUubm5pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfZGVzdF9ubmkgfSwgeyAubmFtZSA9ICJ1LnN1Yl90ZXJtIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZGVzdCwgdS5zdWJfdGVybSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2Rlc3Rfc3ViX3Rlcm0gfSwgeyB9LCB7IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2Rlc3QgPSB7IC5uYW1lID0gImJjbWJhbF9kZXN0IiwgLmRlc2NyID0gIlBhY2tldCBkZXN0aW5hdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9kZXN0KSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOSU9OLCAueCA9IHsgLnUgPSB7IC5udW1fY29tbW9uX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9kZXN0X2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5jb21tb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfZGVzdF9maWVsZHMsIC5jbGFzc2lmaWVyX2lkeCA9IDAsIC51bmlvbl9maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF9kZXN0X3VuaW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfZHNfbWlzc19tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRpc2NhcmQiLCAudmFsID0gQkNNQkFMX0RTX01JU1NfTU9ERV9ESVNDQVJEIH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0IiwgLnZhbCA9IEJDTUJBTF9EU19NSVNTX01PREVfQlJPQURDQVNUIH0sIHsgLm5hbWUgPSAidmlkIiwgLnZhbCA9IEJDTUJBTF9EU19NSVNTX01PREVfVklEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2RzX21pc3NfbW9kZSA9IHsgLm5hbWUgPSAiYmNtYmFsX2RzX21pc3NfbW9kZSIsIC5kZXNjciA9ICJEb3duc3RyZWFuIGFjdGlvbiBmb3IgdW5rbm93biBwYWNrZXRzIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2RzX21pc3NfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfZHNfbWlzc19tb2RlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX2V4dHJhX2J3X2VsaWdpYmlsaXR5X3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01CQUxfRVhUUkFfQldfRUxJR0lCSUxJVFlfVFlQRV9OT05FIH0sIHsgLm5hbWUgPSAibm90X2Fzc3VyZWQiLCAudmFsID0gQkNNQkFMX0VYVFJBX0JXX0VMSUdJQklMSVRZX1RZUEVfTk9UX0FTU1VSRUQgfSwgeyAubmFtZSA9ICJiZXN0X2VmZm9ydCIsIC52YWwgPSBCQ01CQUxfRVhUUkFfQldfRUxJR0lCSUxJVFlfVFlQRV9CRVNUX0VGRk9SVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9leHRyYV9id19lbGlnaWJpbGl0eV90eXBlID0geyAubmFtZSA9ICJiY21iYWxfZXh0cmFfYndfZWxpZ2liaWxpdHlfdHlwZSIsIC5kZXNjciA9ICJFeHRyYSBCVyBFbGlnaWJpbGl0eSBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2V4dHJhX2J3X2VsaWdpYmlsaXR5X3R5cGUpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX2V4dHJhX2J3X2VsaWdpYmlsaXR5X3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfZmxvd19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAudmFsID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FETUlOX1NUQVRFIH0sIHsgLm5hbWUgPSAib3Blcl9zdGF0dXMiLCAudmFsID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX09QRVJfU1RBVFVTIH0sIHsgLm5hbWUgPSAiYWNjZXNzX2ludF9pZCIsIC52YWwgPSBCQ01CQUxfRkxPV19DRkdfSURfQUNDRVNTX0lOVF9JRCB9LCB7IC5uYW1lID0gIm5ldHdvcmtfaW50X2lkIiwgLnZhbCA9IEJDTUJBTF9GTE9XX0NGR19JRF9ORVRXT1JLX0lOVF9JRCB9LCB7IC5uYW1lID0gInN1Yl90ZXJtX2lkIiwgLnZhbCA9IEJDTUJBTF9GTE9XX0NGR19JRF9TVUJfVEVSTV9JRCB9LCB7IC5uYW1lID0gInN1Yl90ZXJtX3VuaV9pZHgiLCAudmFsID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NVQl9URVJNX1VOSV9JRFggfSwgeyAubmFtZSA9ICJzdmNfcG9ydF9pZCIsIC52YWwgPSBCQ01CQUxfRkxPV19DRkdfSURfU1ZDX1BPUlRfSUQgfSwgeyAubmFtZSA9ICJhZ2dfcG9ydF9pZCIsIC52YWwgPSBCQ01CQUxfRkxPV19DRkdfSURfQUdHX1BPUlRfSUQgfSwgeyAubmFtZSA9ICJyZXNvbHZlX21hYyIsIC52YWwgPSBCQ01CQUxfRkxPV19DRkdfSURfUkVTT0xWRV9NQUMgfSwgeyAubmFtZSA9ICJjbGFzc2lmaWVyIiwgLnZhbCA9IEJDTUJBTF9GTE9XX0NGR19JRF9DTEFTU0lGSUVSIH0sIHsgLm5hbWUgPSAiYWN0aW9uIiwgLnZhbCA9IEJDTUJBTF9GTE9XX0NGR19JRF9BQ1RJT04gfSwgeyAubmFtZSA9ICJzbGEiLCAudmFsID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NMQSB9LCB7IC5uYW1lID0gImNvb2tpZSIsIC52YWwgPSBCQ01CQUxfRkxPV19DRkdfSURfQ09PS0lFIH0sIHsgLm5hbWUgPSAicHJpb3JpdHkiLCAudmFsID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX1BSSU9SSVRZIH0sIHsgLm5hbWUgPSAiZ3JvdXBfaWQiLCAudmFsID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX0dST1VQX0lEIH0sIHsgLm5hbWUgPSAicXVldWUiLCAudmFsID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX1FVRVVFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2Zsb3dfY2ZnX2lkID0geyAubmFtZSA9ICJiY21iYWxfZmxvd19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZmxvd19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2Zsb3dfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF9mbG93X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfZmxvd19pZF9saXN0X3UzMiA9IHsgLm5hbWUgPSAiYmNtYmFsX2Zsb3dfaWRfbGlzdF91MzIiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZmxvd19pZCIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90LCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtYmFsX2Zsb3dfaWQpIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9mbG93X2luZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhZG1pbl9zdGF0ZSIsIC52YWwgPSBCQ01CQUxfRkxPV19JTkRfSURfQURNSU5fU1RBVEUgfSwgeyAubmFtZSA9ICJvcGVyX3N0YXR1cyIsIC52YWwgPSBCQ01CQUxfRkxPV19JTkRfSURfT1BFUl9TVEFUVVMgfSwgeyAubmFtZSA9ICJhY2Nlc3NfaW50X2lkIiwgLnZhbCA9IEJDTUJBTF9GTE9XX0lORF9JRF9BQ0NFU1NfSU5UX0lEIH0sIHsgLm5hbWUgPSAibmV0d29ya19pbnRfaWQiLCAudmFsID0gQkNNQkFMX0ZMT1dfSU5EX0lEX05FVFdPUktfSU5UX0lEIH0sIHsgLm5hbWUgPSAic3ViX3Rlcm1faWQiLCAudmFsID0gQkNNQkFMX0ZMT1dfSU5EX0lEX1NVQl9URVJNX0lEIH0sIHsgLm5hbWUgPSAic3ZjX3BvcnRfaWQiLCAudmFsID0gQkNNQkFMX0ZMT1dfSU5EX0lEX1NWQ19QT1JUX0lEIH0sIHsgLm5hbWUgPSAiYWdnX3BvcnRfaWQiLCAudmFsID0gQkNNQkFMX0ZMT1dfSU5EX0lEX0FHR19QT1JUX0lEIH0sIHsgLm5hbWUgPSAicmVzb2x2ZV9tYWMiLCAudmFsID0gQkNNQkFMX0ZMT1dfSU5EX0lEX1JFU09MVkVfTUFDIH0sIHsgLm5hbWUgPSAiYmFzZV90Y19pZCIsIC52YWwgPSBCQ01CQUxfRkxPV19JTkRfSURfQkFTRV9UQ19JRCB9LCB7IC5uYW1lID0gImNsYXNzaWZpZXIiLCAudmFsID0gQkNNQkFMX0ZMT1dfSU5EX0lEX0NMQVNTSUZJRVIgfSwgeyAubmFtZSA9ICJhY3Rpb24iLCAudmFsID0gQkNNQkFMX0ZMT1dfSU5EX0lEX0FDVElPTiB9LCB7IC5uYW1lID0gInNsYSIsIC52YWwgPSBCQ01CQUxfRkxPV19JTkRfSURfU0xBIH0sIHsgLm5hbWUgPSAiY29va2llIiwgLnZhbCA9IEJDTUJBTF9GTE9XX0lORF9JRF9DT09LSUUgfSwgeyAubmFtZSA9ICJwcmlvcml0eSIsIC52YWwgPSBCQ01CQUxfRkxPV19JTkRfSURfUFJJT1JJVFkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfZmxvd19pbmRfaWQgPSB7IC5uYW1lID0gImJjbWJhbF9mbG93X2luZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBmbG93X2luZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfZmxvd19pbmRfaWQpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX2Zsb3dfaW5kX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAudmFsID0gQkNNQkFMX0ZMT1dfS0VZX0lEX0ZMT1dfSUQgfSwgeyAubmFtZSA9ICJmbG93X3R5cGUiLCAudmFsID0gQkNNQkFMX0ZMT1dfS0VZX0lEX0ZMT1dfVFlQRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9mbG93X2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX2Zsb3dfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGZsb3dfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9mbG93X2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfZmxvd19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfZmxvd19zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAudmFsID0gQkNNQkFMX0ZMT1dfU1RBVF9JRF9SWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAudmFsID0gQkNNQkFMX0ZMT1dfU1RBVF9JRF9SWF9CWVRFUyB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAudmFsID0gQkNNQkFMX0ZMT1dfU1RBVF9JRF9UWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAudmFsID0gQkNNQkFMX0ZMT1dfU1RBVF9JRF9UWF9CWVRFUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9mbG93X3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbWJhbF9mbG93X3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZmxvd19zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9mbG93X3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX2Zsb3dfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9mbG93X3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidXBzdHJlYW0iLCAudmFsID0gQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTSB9LCB7IC5uYW1lID0gImRvd25zdHJlYW0iLCAudmFsID0gQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNIH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0IiwgLnZhbCA9IEJDTUJBTF9GTE9XX1RZUEVfQlJPQURDQVNUIH0sIHsgLm5hbWUgPSAibXVsdGljYXN0IiwgLnZhbCA9IEJDTUJBTF9GTE9XX1RZUEVfTVVMVElDQVNUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2Zsb3dfdHlwZSA9IHsgLm5hbWUgPSAiYmNtYmFsX2Zsb3dfdHlwZSIsIC5kZXNjciA9ICJGbG93IFR5cGUiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfZmxvd190eXBlKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF9mbG93X3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfZ3JvdXBfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1lbWJlcnNfY21kIiwgLnZhbCA9IEJDTUJBTF9HUk9VUF9DRkdfSURfTUVNQkVSU19DTUQgfSwgeyAubmFtZSA9ICJtZW1iZXJzIiwgLnZhbCA9IEJDTUJBTF9HUk9VUF9DRkdfSURfTUVNQkVSUyB9LCB7IC5uYW1lID0gImNvb2tpZSIsIC52YWwgPSBCQ01CQUxfR1JPVVBfQ0ZHX0lEX0NPT0tJRSB9LCB7IC5uYW1lID0gImZsb3dzIiwgLnZhbCA9IEJDTUJBTF9HUk9VUF9DRkdfSURfRkxPV1MgfSwgeyAubmFtZSA9ICJvd25lciIsIC52YWwgPSBCQ01CQUxfR1JPVVBfQ0ZHX0lEX09XTkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2dyb3VwX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX2dyb3VwX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncm91cF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2dyb3VwX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfZ3JvdXBfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX2dyb3VwX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJncm91cF9pZCIsIC52YWwgPSBCQ01CQUxfR1JPVVBfS0VZX0lEX0dST1VQX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2dyb3VwX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX2dyb3VwX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncm91cF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2dyb3VwX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfZ3JvdXBfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX2dyb3VwX21lbWJlcl9jbWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWRkX21lbWJlcnMiLCAudmFsID0gQkNNQkFMX0dST1VQX01FTUJFUl9DTURfQUREX01FTUJFUlMgfSwgeyAubmFtZSA9ICJyZW1fbWVtYmVycyIsIC52YWwgPSBCQ01CQUxfR1JPVVBfTUVNQkVSX0NNRF9SRU1fTUVNQkVSUyB9LCB7IC5uYW1lID0gInNldF9tZW1iZXJzIiwgLnZhbCA9IEJDTUJBTF9HUk9VUF9NRU1CRVJfQ01EX1NFVF9NRU1CRVJTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2dyb3VwX21lbWJlcl9jbWQgPSB7IC5uYW1lID0gImJjbWJhbF9ncm91cF9tZW1iZXJfY21kIiwgLmRlc2NyID0gIk1lbWJlciBvcGVyYXRpb24gdHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9ncm91cF9tZW1iZXJfY21kKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF9ncm91cF9tZW1iZXJfY21kX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fcXVldWVfcmVmX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNjaGVkX2lkIiwgLmRlc2NyID0gIlNjaGVkdWxlciAodG1fc2NoZWQpIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9yZWYsIHNjaGVkX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInF1ZXVlX2lkIiwgLmRlc2NyID0gIlF1ZXVlIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9yZWYsIHF1ZXVlX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX3JlZiA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3F1ZXVlX3JlZiIsIC5kZXNjciA9ICJRdWV1ZSBSZWZlcmVuY2UiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfcmVmKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9xdWV1ZV9yZWZfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX3JlZl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW50Zl9pZCIsIC5kZXNjciA9ICJBY2Nlc3MgaW50ZXJmYWNlIGlkIGZvciB0aGlzIG1lbWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8sIGludGZfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic3ZjX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIG11bHRpY2FzdCBcIkdFTVwiIGZvciB0aGlzIG1lbWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8sIHN2Y19wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImFjdGlvbiIsIC5kZXNjciA9ICJWTEFOIGFjdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvLCBhY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9hY3Rpb24gfSwgeyAubmFtZSA9ICJxdWV1ZSIsIC5kZXNjciA9ICJFZ3Jlc3MgcXVldWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvLCBxdWV1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX3JlZiB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9ncm91cF9tZW1iZXJfaW5mbyA9IHsgLm5hbWUgPSAiYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvIiwgLmRlc2NyID0gIkdyb3VwIE1lbWJlciBJbmZvIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTYgPSB7IC5uYW1lID0gImJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncm91cF9tZW1iZXJfaW5mbyIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8sIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZihiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8pIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9ncm91cF9vd25lcl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTUJBTF9HUk9VUF9PV05FUl9OT05FIH0sIHsgLm5hbWUgPSAibXVsdGljYXN0IiwgLnZhbCA9IEJDTUJBTF9HUk9VUF9PV05FUl9NVUxUSUNBU1QgfSwgeyAubmFtZSA9ICJ1bmljYXN0IiwgLnZhbCA9IEJDTUJBTF9HUk9VUF9PV05FUl9VTklDQVNUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2dyb3VwX293bmVyID0geyAubmFtZSA9ICJiY21iYWxfZ3JvdXBfb3duZXIiLCAuZGVzY3IgPSAib3duZXIgb2YgdGhlIGdyb3VwIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2dyb3VwX293bmVyKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF9ncm91cF9vd25lcl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFkbWluX3N0YXRlIiwgLnZhbCA9IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0FETUlOX1NUQVRFIH0sIHsgLm5hbWUgPSAib3Blcl9zdGF0dXMiLCAudmFsID0gQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfT1BFUl9TVEFUVVMgfSwgeyAubmFtZSA9ICJtaW5fZGF0YV9hZ2dfcG9ydF9pZCIsIC52YWwgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9NSU5fREFUQV9BR0dfUE9SVF9JRCB9LCB7IC5uYW1lID0gIm1pbl9kYXRhX3N2Y19wb3J0X2lkIiwgLnZhbCA9IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX01JTl9EQVRBX1NWQ19QT1JUX0lEIH0sIHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfdHlwZSIsIC52YWwgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFIH0sIHsgLm5hbWUgPSAiZHNfbWlzc19tb2RlIiwgLnZhbCA9IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0RTX01JU1NfTU9ERSB9LCB7IC5uYW1lID0gIm10dSIsIC52YWwgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9NVFUgfSwgeyAubmFtZSA9ICJmbG93X2NvbnRyb2wiLCAudmFsID0gQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfRkxPV19DT05UUk9MIH0sIHsgLm5hbWUgPSAiZHNfdG0iLCAudmFsID0gQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfRFNfVE0gfSwgeyAubmFtZSA9ICJ1c190bSIsIC52YWwgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9VU19UTSB9LCB7IC5uYW1lID0gInN1Yl90ZXJtX2lkX2xpc3QiLCAudmFsID0gQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfU1VCX1RFUk1fSURfTElTVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkID0geyAubmFtZSA9ICJiY21iYWxfaW50ZXJmYWNlX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBpbnRlcmZhY2VfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX2ludGVyZmFjZV9pbmRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAudmFsID0gQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfQURNSU5fU1RBVEUgfSwgeyAubmFtZSA9ICJvcGVyX3N0YXR1cyIsIC52YWwgPSBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9PUEVSX1NUQVRVUyB9LCB7IC5uYW1lID0gIm1pbl9kYXRhX2FnZ19wb3J0X2lkIiwgLnZhbCA9IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01JTl9EQVRBX0FHR19QT1JUX0lEIH0sIHsgLm5hbWUgPSAibWluX2RhdGFfc3ZjX3BvcnRfaWQiLCAudmFsID0gQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfTUlOX0RBVEFfU1ZDX1BPUlRfSUQgfSwgeyAubmFtZSA9ICJ0cmFuc2NlaXZlcl90eXBlIiwgLnZhbCA9IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX1RSQU5TQ0VJVkVSX1RZUEUgfSwgeyAubmFtZSA9ICJkc19taXNzX21vZGUiLCAudmFsID0gQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfRFNfTUlTU19NT0RFIH0sIHsgLm5hbWUgPSAibXR1IiwgLnZhbCA9IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01UVSB9LCB7IC5uYW1lID0gImZsb3dfY29udHJvbCIsIC52YWwgPSBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9GTE9XX0NPTlRST0wgfSwgeyAubmFtZSA9ICJkc190bSIsIC52YWwgPSBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19UTSB9LCB7IC5uYW1lID0gInVzX3RtIiwgLnZhbCA9IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX1VTX1RNIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2ludGVyZmFjZV9pbmRfaWQgPSB7IC5uYW1lID0gImJjbWJhbF9pbnRlcmZhY2VfaW5kX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGludGVyZmFjZV9pbmQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2ludGVyZmFjZV9pbmRfaWQpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX2ludGVyZmFjZV9pbmRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfaW50ZXJmYWNlX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbnRmX2lkIiwgLnZhbCA9IEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX0lOVEZfSUQgfSwgeyAubmFtZSA9ICJpbnRmX3R5cGUiLCAudmFsID0gQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfSU5URl9UWVBFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2ludGVyZmFjZV9rZXlfaWQgPSB7IC5uYW1lID0gImJjbWJhbF9pbnRlcmZhY2Vfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGludGVyZmFjZV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2ludGVyZmFjZV9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX2ludGVyZmFjZV9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfaW50ZXJmYWNlX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC52YWwgPSBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfUlhfUEFDS0VUUyB9LCB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLnZhbCA9IEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9SWF9CWVRFUyB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAudmFsID0gQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1RYX1BBQ0tFVFMgfSwgeyAubmFtZSA9ICJ0eF9ieXRlcyIsIC52YWwgPSBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfVFhfQllURVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfaW50ZXJmYWNlX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBpbnRlcmZhY2Vfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfaW50ZXJmYWNlX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX2ludGVyZmFjZV9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX2ludGZfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJubmkiLCAudmFsID0gQkNNQkFMX0lOVEZfVFlQRV9OTkkgfSwgeyAubmFtZSA9ICJwb24iLCAudmFsID0gQkNNQkFMX0lOVEZfVFlQRV9QT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfaW50Zl90eXBlID0geyAubmFtZSA9ICJiY21iYWxfaW50Zl90eXBlIiwgLmRlc2NyID0gIkludGVyZmFjZSB0eXBlIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2ludGZfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfaW50Zl90eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX2l3Zl9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRpcmVjdF9tYXBwaW5nIiwgLnZhbCA9IEJDTUJBTF9JV0ZfTU9ERV9ESVJFQ1RfTUFQUElORyB9LCB7IC5uYW1lID0gInBlcl9mbG93IiwgLnZhbCA9IEJDTUJBTF9JV0ZfTU9ERV9QRVJfRkxPVyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9pd2ZfbW9kZSA9IHsgLm5hbWUgPSAiYmNtYmFsX2l3Zl9tb2RlIiwgLmRlc2NyID0gIkludGVyd29ya2luZyBGdW5jdGlvbiBNb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2l3Zl9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF9pd2ZfbW9kZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9wYWNrZXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAudmFsID0gQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19JRCB9LCB7IC5uYW1lID0gImZsb3dfdHlwZSIsIC52YWwgPSBCQ01CQUxfUEFDS0VUX0NGR19JRF9GTE9XX1RZUEUgfSwgeyAubmFtZSA9ICJpbnRmX2lkIiwgLnZhbCA9IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0lOVEZfSUQgfSwgeyAubmFtZSA9ICJpbnRmX3R5cGUiLCAudmFsID0gQkNNQkFMX1BBQ0tFVF9DRkdfSURfSU5URl9UWVBFIH0sIHsgLm5hbWUgPSAic3ZjX3BvcnQiLCAudmFsID0gQkNNQkFMX1BBQ0tFVF9DRkdfSURfU1ZDX1BPUlQgfSwgeyAubmFtZSA9ICJmbG93X2Nvb2tpZSIsIC52YWwgPSBCQ01CQUxfUEFDS0VUX0NGR19JRF9GTE9XX0NPT0tJRSB9LCB7IC5uYW1lID0gInBrdCIsIC52YWwgPSBCQ01CQUxfUEFDS0VUX0NGR19JRF9QS1QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfcGFja2V0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX3BhY2tldF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgcGFja2V0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfcGFja2V0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfcGFja2V0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9wYWNrZXRfaW5kX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAudmFsID0gQkNNQkFMX1BBQ0tFVF9JTkRfSURfRkxPV19JRCB9LCB7IC5uYW1lID0gImZsb3dfdHlwZSIsIC52YWwgPSBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX1RZUEUgfSwgeyAubmFtZSA9ICJpbnRmX2lkIiwgLnZhbCA9IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0lOVEZfSUQgfSwgeyAubmFtZSA9ICJpbnRmX3R5cGUiLCAudmFsID0gQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9UWVBFIH0sIHsgLm5hbWUgPSAic3ZjX3BvcnQiLCAudmFsID0gQkNNQkFMX1BBQ0tFVF9JTkRfSURfU1ZDX1BPUlQgfSwgeyAubmFtZSA9ICJmbG93X2Nvb2tpZSIsIC52YWwgPSBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX0NPT0tJRSB9LCB7IC5uYW1lID0gInBrdCIsIC52YWwgPSBCQ01CQUxfUEFDS0VUX0lORF9JRF9QS1QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfcGFja2V0X2luZF9pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX3BhY2tldF9pbmRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgcGFja2V0X2luZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfcGFja2V0X2luZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfcGFja2V0X2luZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9wYWNrZXRfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLnZhbCA9IEJDTUJBTF9QQUNLRVRfS0VZX0lEX1JFU0VSVkVEIH0sIHsgLm5hbWUgPSAicGFja2V0X3NlbmRfZGVzdCIsIC52YWwgPSBCQ01CQUxfUEFDS0VUX0tFWV9JRF9QQUNLRVRfU0VORF9ERVNUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3BhY2tldF9rZXlfaWQgPSB7IC5uYW1lID0gImJjbWJhbF9wYWNrZXRfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHBhY2tldF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3BhY2tldF9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX3BhY2tldF9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDhfdF9hcnJfMTAgPSB7IC5uYW1lID0gInVpbnQ4X3RbMTBdIiwgLmRlc2NyID0gIkFycmF5IG9mIDEwIGVsZW1lbnRzIG9mIHR5cGUgdWludDhfdCIsIC5zaXplID0gc2l6ZW9mKHVpbnQ4X3RbMTBdKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDEwIH0gfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3Bhc3N3b3JkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFzc3dvcmQsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfMTAgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfcGFzc3dvcmQgPSB7IC5uYW1lID0gImJjbWJhbF9wYXNzd29yZCIsIC5kZXNjciA9ICJQYXNzd29yZCIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9wYXNzd29yZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfcGFzc3dvcmRfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3Bhc3N3b3JkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDhfdF9hcnJfMzYgPSB7IC5uYW1lID0gInVpbnQ4X3RbMzZdIiwgLmRlc2NyID0gIkFycmF5IG9mIDM2IGVsZW1lbnRzIG9mIHR5cGUgdWludDhfdCIsIC5zaXplID0gc2l6ZW9mKHVpbnQ4X3RbMzZdKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDM2IH0gfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiT05VIHJlZ2lzdHJhdGlvbiBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcmVnaXN0cmF0aW9uX2lkLCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzM2IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZCIsIC5kZXNjciA9ICJSZWdpc3RyYXRpb24gaWQiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfcmVnaXN0cmF0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9yZWdpc3RyYXRpb25faWRfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzQgPSB7IC5uYW1lID0gInVpbnQ4X3RbNF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgNCBlbGVtZW50cyBvZiB0eXBlIHVpbnQ4X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50OF90WzRdKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDQgfSB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfc2VyaWFsX251bWJlcl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ2ZW5kb3JfaWQiLCAuZGVzY3IgPSAidmVuZG9yIGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zZXJpYWxfbnVtYmVyLCB2ZW5kb3JfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzQgfSwgeyAubmFtZSA9ICJ2ZW5kb3Jfc3BlY2lmaWMiLCAuZGVzY3IgPSAidmVuZG9yIHNwZWNpZmljIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zZXJpYWxfbnVtYmVyLCB2ZW5kb3Jfc3BlY2lmaWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzQgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAiYmNtYmFsX3NlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAiU2VyaWFsIG51bWJlciIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9zZXJpYWxfbnVtYmVyKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9zZXJpYWxfbnVtYmVyX2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF9zZXJpYWxfbnVtYmVyX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4ID0geyAubmFtZSA9ICJiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2Ygc2VydmljZV9wb3J0X2lkIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4KSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90LCAubGVuX3NpemUgPSAxLCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCkgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX3NsYV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTUJBTF9TTEFfSURfTk9ORSB9LCB7IC5uYW1lID0gIm1pbl9yYXRlIiwgLnZhbCA9IEJDTUJBTF9TTEFfSURfTUlOX1JBVEUgfSwgeyAubmFtZSA9ICJtYXhfcmF0ZSIsIC52YWwgPSBCQ01CQUxfU0xBX0lEX01BWF9SQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3NsYV9pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX3NsYV9pZCIsIC5kZXNjciA9ICJTTEEgSUQiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfc2xhX2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtYmFsX3NsYV9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3NsYV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwcmVzZW5jZV9tYXNrIiwgLmRlc2NyID0gIlByZXNlbmNlIE1hc2siLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3NsYSwgcHJlc2VuY2VfbWFzayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3NsYV9pZCwgLmZsYWdzID0gQkNNQkFMX0FQSUNMSV9GSUVMRF9ERVNDUl9GTEFHU19QUkVTRU5DRV9NQVNLIH0sIHsgLm5hbWUgPSAibWluX3JhdGUiLCAuZGVzY3IgPSAiVGhlIG1pbmltYWwgcmF0ZSBmb3IgdGhpcyBmbG93LCBpbiBraWxvYml0cyBwZXIgc2Vjb25kIChvcHRpb25hbCkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3NsYSwgbWluX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibWF4X3JhdGUiLCAuZGVzY3IgPSAiVGhlIG1heGltdW0gcmF0ZSBmb3IgdGhpcyBmbG93LCBpbiBraWxvYml0cyBwZXIgc2Vjb25kIChvcHRpb25hbCkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3NsYSwgbWF4X3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3NsYSA9IHsgLm5hbWUgPSAiYmNtYmFsX3NsYSIsIC5kZXNjciA9ICJTTEEiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfc2xhKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9zbGFfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3NsYV9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInVwIiwgLnZhbCA9IEJDTUJBTF9TVEFURV9VUCB9LCB7IC5uYW1lID0gImRvd24iLCAudmFsID0gQkNNQkFMX1NUQVRFX0RPV04gfSwgeyAubmFtZSA9ICJ0ZXN0aW5nIiwgLnZhbCA9IEJDTUJBTF9TVEFURV9URVNUSU5HIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3N0YXRlID0geyAubmFtZSA9ICJiY21iYWxfc3RhdGUiLCAuZGVzY3IgPSAiQWRtaW4gc3RhdGUgdmFsdWVzIGZvciBhY2Nlc3MgdGVybWluYWwgb2JqZWN0IiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9zdGF0dXNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidXAiLCAudmFsID0gQkNNQkFMX1NUQVRVU19VUCB9LCB7IC5uYW1lID0gImRvd24iLCAudmFsID0gQkNNQkFMX1NUQVRVU19ET1dOIH0sIHsgLm5hbWUgPSAidGVzdGluZyIsIC52YWwgPSBCQ01CQUxfU1RBVFVTX1RFU1RJTkcgfSwgeyAubmFtZSA9ICJub3RfcHJlc2VudCIsIC52YWwgPSBCQ01CQUxfU1RBVFVTX05PVF9QUkVTRU5UIH0sIHsgLm5hbWUgPSAibG93ZXJfbGF5ZXJfZG93biIsIC52YWwgPSBCQ01CQUxfU1RBVFVTX0xPV0VSX0xBWUVSX0RPV04gfSwgeyAubmFtZSA9ICJ1bmtub3duIiwgLnZhbCA9IEJDTUJBTF9TVEFUVVNfVU5LTk9XTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9zdGF0dXMgPSB7IC5uYW1lID0gImJjbWJhbF9zdGF0dXMiLCAuZGVzY3IgPSAiT3BlciBzdGF0dXMgdmFsdWVzIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfc3RhdHVzX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9zdWJfaWRfbGlzdF91MTYgPSB7IC5uYW1lID0gImJjbWJhbF9zdWJfaWRfbGlzdF91MTYiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2Ygc3ViX2lkIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3N1Yl9pZF9saXN0X3UxNiksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKGJjbWJhbF9zdWJfaWQpIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhZG1pbl9zdGF0ZSIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfQURNSU5fU1RBVEUgfSwgeyAubmFtZSA9ICJvcGVyX3N0YXR1cyIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfT1BFUl9TVEFUVVMgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLnZhbCA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TRVJJQUxfTlVNQkVSIH0sIHsgLm5hbWUgPSAicGFzc3dvcmQiLCAudmFsID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1BBU1NXT1JEIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLnZhbCA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9SRUdJU1RSQVRJT05fSUQgfSwgeyAubmFtZSA9ICJzdmNfcG9ydF9pZCIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfU1ZDX1BPUlRfSUQgfSwgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfTUFDX0FERFJFU1MgfSwgeyAubmFtZSA9ICJkc190bSIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfRFNfVE0gfSwgeyAubmFtZSA9ICJ1c190bSIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfVVNfVE0gfSwgeyAubmFtZSA9ICJzdmNfcG9ydF9pZF9saXN0IiwgLnZhbCA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TVkNfUE9SVF9JRF9MSVNUIH0sIHsgLm5hbWUgPSAiYWdnX3BvcnRfaWRfbGlzdCIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfQUdHX1BPUlRfSURfTElTVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHN1YnNjcmliZXJfdGVybWluYWxfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAudmFsID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX0FETUlOX1NUQVRFIH0sIHsgLm5hbWUgPSAib3Blcl9zdGF0dXMiLCAudmFsID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX09QRVJfU1RBVFVTIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfU0VSSUFMX05VTUJFUiB9LCB7IC5uYW1lID0gInBhc3N3b3JkIiwgLnZhbCA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9QQVNTV09SRCB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfUkVHSVNUUkFUSU9OX0lEIH0sIHsgLm5hbWUgPSAic3ZjX3BvcnRfaWQiLCAudmFsID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1NWQ19QT1JUX0lEIH0sIHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAiZHNfdG0iLCAudmFsID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX0RTX1RNIH0sIHsgLm5hbWUgPSAidXNfdG0iLCAudmFsID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1VTX1RNIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkID0geyAubmFtZSA9ICJiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdWJfdGVybV9pZCIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfU1VCX1RFUk1fSUQgfSwgeyAubmFtZSA9ICJpbnRmX2lkIiwgLnZhbCA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0tFWV9JRF9JTlRGX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X2lkID0geyAubmFtZSA9ICJiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1JYX1BBQ0tFVFMgfSwgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1JYX0JZVEVTIH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1RYX1BBQ0tFVFMgfSwgeyAubmFtZSA9ICJ0eF9ieXRlcyIsIC52YWwgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1RYX0JZVEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBzdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX2JhY190eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRhaWxkcm9wIiwgLnZhbCA9IEJDTUJBTF9UTV9CQUNfVFlQRV9UQUlMRFJPUCB9LCB7IC5uYW1lID0gInd0YWlsZHJvcCIsIC52YWwgPSBCQ01CQUxfVE1fQkFDX1RZUEVfV1RBSUxEUk9QIH0sIHsgLm5hbWUgPSAicmVkIiwgLnZhbCA9IEJDTUJBTF9UTV9CQUNfVFlQRV9SRUQgfSwgeyAubmFtZSA9ICJ3cmVkIiwgLnZhbCA9IEJDTUJBTF9UTV9CQUNfVFlQRV9XUkVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX2JhY190eXBlID0geyAubmFtZSA9ICJiY21iYWxfdG1fYmFjX3R5cGUiLCAuZGVzY3IgPSAiQnVmZmVyIEFkbWlzc2lvbiBDb250cm9sIFR5cGUiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fYmFjX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX3RtX2JhY190eXBlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fcmVkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1pbl90aHJlc2hvbGQiLCAuZGVzY3IgPSAiTWluIHRocmVzaG9sZCBpbiBwZXJjZW50IG9mIG1heCBxdWV1ZSBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9yZWQsIG1pbl90aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJtYXhfdGhyZXNob2xkIiwgLmRlc2NyID0gIk1heCB0aHJlc2hvbGQgaW4gcGVyY2VudCBvZiBtYXggcXVldWUgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcmVkLCBtYXhfdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWF4X3Byb2JhYmlsaXR5IiwgLmRlc2NyID0gIkRpc2NhcmQgcHJvYmFiaWxpdHkgZm9yIG9jY3VwYW5jeSBiZXR3ZWVuIG1pbl90aHJlc2hvbGQgYW5kIG1heF90aHJlc2hvbGQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3JlZCwgbWF4X3Byb2JhYmlsaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3JlZCA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3JlZCIsIC5kZXNjciA9ICJSYW5kb20gRWFybHkgRGlzY2FyZCBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3JlZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfdG1fcmVkX2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF90bV9yZWRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX2JhY19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0eXBlIiwgLmRlc2NyID0gIkJ1ZmZlciBBZG1pc3Npb24gQ29udHJvbCBUeXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9iYWMsIHR5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9iYWNfdHlwZSB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fYmFjX3RhaWxkcm9wX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1heF9zaXplIiwgLmRlc2NyID0gIm1heCBudW1iZXIgb2YgcGFja2V0cyBpbiB0aGUgcXVldWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX2JhYywgdS50YWlsZHJvcC5tYXhfc2l6ZSkgLSBvZmZzZXRvZihiY21iYWxfdG1fYmFjLCB1LnRhaWxkcm9wLm1heF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9iYWNfdGFpbGRyb3AgPSB7IC5uYW1lID0gImJjbWJhbF90bV9iYWNfdGFpbGRyb3AiLCAuZGVzY3IgPSAidG1fYmFjIHRhaWxkcm9wIiwgLnNpemUgPSBzaXplb2YoKChiY21iYWxfdG1fYmFjICopMCktPnUudGFpbGRyb3ApLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtYmFsX3RtX2JhY190YWlsZHJvcF9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfdG1fYmFjX3RhaWxkcm9wX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9iYWNfcmVkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlZCIsIC5kZXNjciA9ICJSYW5kb20gRWFybHkgRGlzY2FyZCBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9iYWMsIHUucmVkLnJlZCkgLSBvZmZzZXRvZihiY21iYWxfdG1fYmFjLCB1LnJlZC5yZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9yZWQgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fYmFjX3JlZCA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX2JhY19yZWQiLCAuZGVzY3IgPSAidG1fYmFjIHJlZCIsIC5zaXplID0gc2l6ZW9mKCgoYmNtYmFsX3RtX2JhYyAqKTApLT51LnJlZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfdG1fYmFjX3JlZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfdG1fYmFjX3JlZF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fYmFjX3dyZWRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZ3JlZW4iLCAuZGVzY3IgPSAiR3JlZW4gUmFuZG9tIEVhcmx5IERpc2NhcmQgQ29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fYmFjLCB1LndyZWQuZ3JlZW4pIC0gb2Zmc2V0b2YoYmNtYmFsX3RtX2JhYywgdS53cmVkLmdyZWVuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fcmVkIH0sIHsgLm5hbWUgPSAieWVsbG93IiwgLmRlc2NyID0gIlllbGxvdyBSYW5kb20gRWFybHkgRGlzY2FyZCBDb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9iYWMsIHUud3JlZC55ZWxsb3cpIC0gb2Zmc2V0b2YoYmNtYmFsX3RtX2JhYywgdS53cmVkLmdyZWVuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fcmVkIH0sIHsgLm5hbWUgPSAicmVkIiwgLmRlc2NyID0gIlJlZCBSYW5kb20gRWFybHkgRGlzY2FyZCBDb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9iYWMsIHUud3JlZC5yZWQpIC0gb2Zmc2V0b2YoYmNtYmFsX3RtX2JhYywgdS53cmVkLmdyZWVuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fcmVkIH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX2JhY193cmVkID0geyAubmFtZSA9ICJiY21iYWxfdG1fYmFjX3dyZWQiLCAuZGVzY3IgPSAidG1fYmFjIHdyZWQiLCAuc2l6ZSA9IHNpemVvZigoKGJjbWJhbF90bV9iYWMgKikwKS0+dS53cmVkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9iYWNfd3JlZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfdG1fYmFjX3dyZWRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX2JhY191bmlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1LnRhaWxkcm9wIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fYmFjLCB1LnRhaWxkcm9wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fYmFjX3RhaWxkcm9wIH0sIHsgfSwgeyAubmFtZSA9ICJ1LnJlZCIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX2JhYywgdS5yZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9iYWNfcmVkIH0sIHsgLm5hbWUgPSAidS53cmVkIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fYmFjLCB1LndyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9iYWNfd3JlZCB9LCB7IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX2JhYyA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX2JhYyIsIC5kZXNjciA9ICJRdWV1ZSBCdWZmZXIgQWRtaXNzaW9uIENvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fYmFjKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOSU9OLCAueCA9IHsgLnUgPSB7IC5udW1fY29tbW9uX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9iYWNfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmNvbW1vbl9maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF90bV9iYWNfZmllbGRzLCAuY2xhc3NpZmllcl9pZHggPSAwLCAudW5pb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfdG1fYmFjX3VuaW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdG1fY3JlYXRpb25fbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtYW51YWwiLCAudmFsID0gQkNNQkFMX1RNX0NSRUFUSU9OX01PREVfTUFOVUFMIH0sIHsgLm5hbWUgPSAiYXV0byIsIC52YWwgPSBCQ01CQUxfVE1fQ1JFQVRJT05fTU9ERV9BVVRPIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX2NyZWF0aW9uX21vZGUgPSB7IC5uYW1lID0gImJjbWJhbF90bV9jcmVhdGlvbl9tb2RlIiwgLmRlc2NyID0gIlRNIENyZWF0aW9uIE1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fY3JlYXRpb25fbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfdG1fY3JlYXRpb25fbW9kZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicHJpb3JpdHkiLCAudmFsID0gQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9QUklPUklUWSB9LCB7IC5uYW1lID0gIndlaWdodCIsIC52YWwgPSBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1dFSUdIVCB9LCB7IC5uYW1lID0gInJhdGUiLCAudmFsID0gQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9SQVRFIH0sIHsgLm5hbWUgPSAiYmFjIiwgLnZhbCA9IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfQkFDIH0sIHsgLm5hbWUgPSAiY3JlYXRpb25fbW9kZSIsIC52YWwgPSBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX0NSRUFUSU9OX01PREUgfSwgeyAubmFtZSA9ICJyZWZfY291bnQiLCAudmFsID0gQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9SRUZfQ09VTlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fcXVldWVfY2ZnX2lkID0geyAubmFtZSA9ICJiY21iYWxfdG1fcXVldWVfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRtX3F1ZXVlX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF90bV9xdWV1ZV9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdTggPSB7IC5uYW1lID0gImJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHRtX3F1ZXVlX2lkIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdTgpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLmxlbl9zaXplID0gMSwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKGJjbWJhbF90bV9xdWV1ZV9pZCkgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3F1ZXVlX2luZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXQiLCAudmFsID0gQkNNQkFMX1RNX1FVRVVFX0lORF9JRF9SRVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fcXVldWVfaW5kX2lkID0geyAubmFtZSA9ICJiY21iYWxfdG1fcXVldWVfaW5kX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRtX3F1ZXVlX2luZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfaW5kX2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF90bV9xdWV1ZV9pbmRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdG1fcXVldWVfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNjaGVkX2lkIiwgLnZhbCA9IEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfSUQgfSwgeyAubmFtZSA9ICJzY2hlZF9kaXIiLCAudmFsID0gQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9TQ0hFRF9ESVIgfSwgeyAubmFtZSA9ICJpZCIsIC52YWwgPSBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3F1ZXVlX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB0bV9xdWV1ZV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3F1ZXVlX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfdG1fcXVldWVfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicGFja2V0c19vayIsIC52YWwgPSBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9QQUNLRVRTX09LIH0sIHsgLm5hbWUgPSAiYnl0ZXNfb2siLCAudmFsID0gQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfQllURVNfT0sgfSwgeyAubmFtZSA9ICJwYWNrZXRzX2Rpc2NhcmRlZCIsIC52YWwgPSBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9QQUNLRVRTX0RJU0NBUkRFRCB9LCB7IC5uYW1lID0gImJ5dGVzX2Rpc2NhcmRlZCIsIC52YWwgPSBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9CWVRFU19ESVNDQVJERUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fcXVldWVfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3F1ZXVlX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgdG1fcXVldWVfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfdG1fcXVldWVfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF90bV9zY2hlZF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib3duZXIiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9PV05FUiB9LCB7IC5uYW1lID0gInNjaGVkX3R5cGUiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9UWVBFIH0sIHsgLm5hbWUgPSAic2NoZWRfcGFyZW50IiwgLnZhbCA9IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU0NIRURfUEFSRU5UIH0sIHsgLm5hbWUgPSAic2NoZWRfY2hpbGRfdHlwZSIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX0NISUxEX1RZUEUgfSwgeyAubmFtZSA9ICJyYXRlIiwgLnZhbCA9IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfUkFURSB9LCB7IC5uYW1lID0gInRjb250X3NsYSIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1RDT05UX1NMQSB9LCB7IC5uYW1lID0gImNyZWF0aW9uX21vZGUiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9DUkVBVElPTl9NT0RFIH0sIHsgLm5hbWUgPSAicXVldWVzIiwgLnZhbCA9IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfUVVFVUVTIH0sIHsgLm5hbWUgPSAic3ViX3NjaGVkcyIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NVQl9TQ0hFRFMgfSwgeyAubmFtZSA9ICJudW1fcHJpb3JpdGllcyIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX05VTV9QUklPUklUSUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3NjaGVkX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB0bV9zY2hlZF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3NjaGVkX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfdG1fc2NoZWRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicXVldWUiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX0NISUxEX1RZUEVfUVVFVUUgfSwgeyAubmFtZSA9ICJzY2hlZCIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfQ0hJTERfVFlQRV9TQ0hFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9jaGlsZF90eXBlID0geyAubmFtZSA9ICJiY21iYWxfdG1fc2NoZWRfY2hpbGRfdHlwZSIsIC5kZXNjciA9ICJTY2hlZHVsaW5nIExldmVsIGZvciB0aGUgQ2hpbGRyZW4gVE0gIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdG1fc2NoZWRfZGlyX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInVzIiwgLnZhbCA9IEJDTUJBTF9UTV9TQ0hFRF9ESVJfVVMgfSwgeyAubmFtZSA9ICJkcyIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfRElSX0RTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX2RpciA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3NjaGVkX2RpciIsIC5kZXNjciA9ICJUcmFmZmljIERpcmVjdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF90bV9zY2hlZF9kaXIpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX3RtX3NjaGVkX2Rpcl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OCA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3NjaGVkX2lkX2xpc3RfdTgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgdG1fc2NoZWRfaWQiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCwgLmxlbl9zaXplID0gMSwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKGJjbWJhbF90bV9zY2hlZF9pZCkgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3NjaGVkX2luZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXQiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX0lORF9JRF9SRVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfaW5kX2lkID0geyAubmFtZSA9ICJiY21iYWxfdG1fc2NoZWRfaW5kX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRtX3NjaGVkX2luZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fc2NoZWRfaW5kX2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF90bV9zY2hlZF9pbmRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdG1fc2NoZWRfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRpciIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfS0VZX0lEX0RJUiB9LCB7IC5uYW1lID0gImlkIiwgLnZhbCA9IEJDTUJBTF9UTV9TQ0hFRF9LRVlfSURfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfa2V5X2lkID0geyAubmFtZSA9ICJiY21iYWxfdG1fc2NoZWRfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRtX3NjaGVkX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fc2NoZWRfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF90bV9zY2hlZF9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdG1fc2NoZWRfb3duZXJfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ1bmRlZmluZWQiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfVU5ERUZJTkVEIH0sIHsgLm5hbWUgPSAiaW50ZXJmYWNlIiwgLnZhbCA9IEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0lOVEVSRkFDRSB9LCB7IC5uYW1lID0gInN1Yl90ZXJtIiwgLnZhbCA9IEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1NVQl9URVJNIH0sIHsgLm5hbWUgPSAiYWdnX3BvcnQiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfQUdHX1BPUlQgfSwgeyAubmFtZSA9ICJ1bmkiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfVU5JIH0sIHsgLm5hbWUgPSAidmlydHVhbCIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9WSVJUVUFMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX3R5cGUgPSB7IC5uYW1lID0gImJjbWJhbF90bV9zY2hlZF9vd25lcl90eXBlIiwgLmRlc2NyID0gIlRNIFNjaGVkdWxlciBPd25lciBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3NjaGVkX293bmVyX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtYmFsX3RtX3NjaGVkX293bmVyX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfT1dORVJfQUdHX1BPUlRfSURfTk9ORSB9LCB7IC5uYW1lID0gImludGZfaWQiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX09XTkVSX0FHR19QT1JUX0lEX0lOVEZfSUQgfSwgeyAubmFtZSA9ICJzdWJfdGVybV9pZCIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfT1dORVJfQUdHX1BPUlRfSURfU1VCX1RFUk1fSUQgfSwgeyAubmFtZSA9ICJhZ2dfcG9ydF9pZCIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfT1dORVJfQUdHX1BPUlRfSURfQUdHX1BPUlRfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWQgPSB7IC5uYW1lID0gImJjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9pZCIsIC5kZXNjciA9ICJ0bV9zY2hlZF9vd25lciBhZ2dfcG9ydCBJRCIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssIC54ID0geyAuZSA9IGJjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInR5cGUiLCAuZGVzY3IgPSAiT3duZXIgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfb3duZXIsIHR5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl90eXBlIH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl9pbnRlcmZhY2VfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW50Zl90eXBlIiwgLmRlc2NyID0gIkludGVyZmFjZSBUeXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9vd25lciwgdS5pbnRlcmZhY2UuaW50Zl90eXBlKSAtIG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9vd25lciwgdS5pbnRlcmZhY2UuaW50Zl90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfaW50Zl90eXBlIH0sIHsgLm5hbWUgPSAiaW50Zl9pZCIsIC5kZXNjciA9ICJJbnRlcmZhY2UgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LmludGVyZmFjZS5pbnRmX2lkKSAtIG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9vd25lciwgdS5pbnRlcmZhY2UuaW50Zl90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl9pbnRlcmZhY2UgPSB7IC5uYW1lID0gImJjbWJhbF90bV9zY2hlZF9vd25lcl9pbnRlcmZhY2UiLCAuZGVzY3IgPSAidG1fc2NoZWRfb3duZXIgaW50ZXJmYWNlIiwgLnNpemUgPSBzaXplb2YoKChiY21iYWxfdG1fc2NoZWRfb3duZXIgKikwKS0+dS5pbnRlcmZhY2UpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX2ludGVyZmFjZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfb3duZXJfaW50ZXJmYWNlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl9zdWJfdGVybV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbnRmX2lkIiwgLmRlc2NyID0gIlBPTiBpbnRlcmZhY2UgaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LnN1Yl90ZXJtLmludGZfaWQpIC0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LnN1Yl90ZXJtLmludGZfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic3ViX3Rlcm1faWQiLCAuZGVzY3IgPSAiU3Vic2NyaWJlciB0ZXJtaW5hbCBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfb3duZXIsIHUuc3ViX3Rlcm0uc3ViX3Rlcm1faWQpIC0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LnN1Yl90ZXJtLmludGZfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX3N1Yl90ZXJtID0geyAubmFtZSA9ICJiY21iYWxfdG1fc2NoZWRfb3duZXJfc3ViX3Rlcm0iLCAuZGVzY3IgPSAidG1fc2NoZWRfb3duZXIgc3Vic190ZXJtIiwgLnNpemUgPSBzaXplb2YoKChiY21iYWxfdG1fc2NoZWRfb3duZXIgKikwKS0+dS5zdWJfdGVybSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfb3duZXJfc3ViX3Rlcm1fZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX3N1Yl90ZXJtX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwcmVzZW5jZV9tYXNrIiwgLmRlc2NyID0gIlByZXNlbmNlIE1hc2siLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LmFnZ19wb3J0LnByZXNlbmNlX21hc2spIC0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LmFnZ19wb3J0LnByZXNlbmNlX21hc2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9pZCwgLmZsYWdzID0gQkNNQkFMX0FQSUNMSV9GSUVMRF9ERVNDUl9GTEFHU19QUkVTRU5DRV9NQVNLIH0sIHsgLm5hbWUgPSAiaW50Zl9pZCIsIC5kZXNjciA9ICJQT04gaW50ZXJmYWNlIGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9vd25lciwgdS5hZ2dfcG9ydC5pbnRmX2lkKSAtIG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9vd25lciwgdS5hZ2dfcG9ydC5wcmVzZW5jZV9tYXNrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAic3ViX3Rlcm1faWQiLCAuZGVzY3IgPSAiU3Vic2NyaWJlciB0ZXJtaW5hbCBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfb3duZXIsIHUuYWdnX3BvcnQuc3ViX3Rlcm1faWQpIC0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LmFnZ19wb3J0LnByZXNlbmNlX21hc2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWdnX3BvcnRfaWQiLCAuZGVzY3IgPSAiQWdncmVnYXRpb24gcG9ydCBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfb3duZXIsIHUuYWdnX3BvcnQuYWdnX3BvcnRfaWQpIC0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LmFnZ19wb3J0LnByZXNlbmNlX21hc2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX2FnZ19wb3J0ID0geyAubmFtZSA9ICJiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnQiLCAuZGVzY3IgPSAidG1fc2NoZWRfb3duZXIgYWdnX3BvcnQiLCAuc2l6ZSA9IHNpemVvZigoKGJjbWJhbF90bV9zY2hlZF9vd25lciAqKTApLT51LmFnZ19wb3J0KSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX3VuaV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbnRmX2lkIiwgLmRlc2NyID0gIlBPTiBpbnRlcmZhY2UgaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LnVuaS5pbnRmX2lkKSAtIG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9vd25lciwgdS51bmkuaW50Zl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInN1Yl90ZXJtX2lkIiwgLmRlc2NyID0gIlN1YnNjcmliZXIgdGVybWluYWwgaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LnVuaS5zdWJfdGVybV9pZCkgLSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfb3duZXIsIHUudW5pLmludGZfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiaWR4IiwgLmRlc2NyID0gIkluZGV4IGF0IHN1YnNjcmliZXIgdGVybWluYWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LnVuaS5pZHgpIC0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX293bmVyLCB1LnVuaS5pbnRmX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX3VuaSA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3NjaGVkX293bmVyX3VuaSIsIC5kZXNjciA9ICJ0bV9zY2hlZF9vd25lciB1bmkiLCAuc2l6ZSA9IHNpemVvZigoKGJjbWJhbF90bV9zY2hlZF9vd25lciAqKTApLT51LnVuaSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfb3duZXJfdW5pX2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl91bmlfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX3ZpcnR1YWxfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaWR4IiwgLmRlc2NyID0gIk93bmVyIGluZGV4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9vd25lciwgdS52aXJ0dWFsLmlkeCkgLSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfb3duZXIsIHUudmlydHVhbC5pZHgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX3ZpcnR1YWwgPSB7IC5uYW1lID0gImJjbWJhbF90bV9zY2hlZF9vd25lcl92aXJ0dWFsIiwgLmRlc2NyID0gInRtX3NjaGVkX293bmVyIHZpcnR1YWwiLCAuc2l6ZSA9IHNpemVvZigoKGJjbWJhbF90bV9zY2hlZF9vd25lciAqKTApLT51LnZpcnR1YWwpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX3ZpcnR1YWxfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX3ZpcnR1YWxfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX3VuaW9uX2ZpZWxkc1tdID0geyB7IH0sIHsgLm5hbWUgPSAidS5pbnRlcmZhY2UiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9vd25lciwgdS5pbnRlcmZhY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl9pbnRlcmZhY2UgfSwgeyAubmFtZSA9ICJ1LnN1Yl90ZXJtIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfb3duZXIsIHUuc3ViX3Rlcm0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl9zdWJfdGVybSB9LCB7IC5uYW1lID0gInUuYWdnX3BvcnQiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9vd25lciwgdS5hZ2dfcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX2FnZ19wb3J0IH0sIHsgLm5hbWUgPSAidS51bmkiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9vd25lciwgdS51bmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl91bmkgfSwgeyAubmFtZSA9ICJ1LnZpcnR1YWwiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9vd25lciwgdS52aXJ0dWFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfb3duZXJfdmlydHVhbCB9LCB7IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyID0geyAubmFtZSA9ICJiY21iYWxfdG1fc2NoZWRfb3duZXIiLCAuZGVzY3IgPSAiVE0gU2NoZWR1bGVyIE93bmVyIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3NjaGVkX293bmVyKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1VOSU9OLCAueCA9IHsgLnUgPSB7IC5udW1fY29tbW9uX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9vd25lcl9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuY29tbW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX2ZpZWxkcywgLmNsYXNzaWZpZXJfaWR4ID0gMCwgLnVuaW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyX3VuaW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX1BBUkVOVF9JRF9OT05FIH0sIHsgLm5hbWUgPSAic2NoZWRfaWQiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX1BBUkVOVF9JRF9TQ0hFRF9JRCB9LCB7IC5uYW1lID0gInByaW9yaXR5IiwgLnZhbCA9IEJDTUJBTF9UTV9TQ0hFRF9QQVJFTlRfSURfUFJJT1JJVFkgfSwgeyAubmFtZSA9ICJ3ZWlnaHQiLCAudmFsID0gQkNNQkFMX1RNX1NDSEVEX1BBUkVOVF9JRF9XRUlHSFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkID0geyAubmFtZSA9ICJiY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkIiwgLmRlc2NyID0gInRtX3NjaGVkX3BhcmVudCBJRCIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF90bV9zY2hlZF9wYXJlbnRfaWQpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTV9NQVNLLCAueCA9IHsgLmUgPSBiY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfcGFyZW50X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInByZXNlbmNlX21hc2siLCAuZGVzY3IgPSAiUHJlc2VuY2UgTWFzayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfcGFyZW50LCBwcmVzZW5jZV9tYXNrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkLCAuZmxhZ3MgPSBCQ01CQUxfQVBJQ0xJX0ZJRUxEX0RFU0NSX0ZMQUdTX1BSRVNFTkNFX01BU0sgfSwgeyAubmFtZSA9ICJzY2hlZF9pZCIsIC5kZXNjciA9ICJQYXJlbnQgc2NoZWR1bGVyIGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9wYXJlbnQsIHNjaGVkX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInByaW9yaXR5IiwgLmRlc2NyID0gIlByaW9yaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9wYXJlbnQsIHByaW9yaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAid2VpZ2h0IiwgLmRlc2NyID0gIldlaWdodCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfcGFyZW50LCB3ZWlnaHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfcGFyZW50ID0geyAubmFtZSA9ICJiY21iYWxfdG1fc2NoZWRfcGFyZW50IiwgLmRlc2NyID0gIlNjaGVkdWxpbmcgUGFyZW50IENvbm5lY3QgUG9pbnQiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fc2NoZWRfcGFyZW50KSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9wYXJlbnRfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3NjaGVkX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01CQUxfVE1fU0NIRURfVFlQRV9OT05FIH0sIHsgLm5hbWUgPSAid2ZxIiwgLnZhbCA9IEJDTUJBTF9UTV9TQ0hFRF9UWVBFX1dGUSB9LCB7IC5uYW1lID0gInNwIiwgLnZhbCA9IEJDTUJBTF9UTV9TQ0hFRF9UWVBFX1NQIH0sIHsgLm5hbWUgPSAic3Bfd2ZxIiwgLnZhbCA9IEJDTUJBTF9UTV9TQ0hFRF9UWVBFX1NQX1dGUSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF90eXBlID0geyAubmFtZSA9ICJiY21iYWxfdG1fc2NoZWRfdHlwZSIsIC5kZXNjciA9ICJTY2hlZHVsZXIgVHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF90bV9zY2hlZF90eXBlKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbWJhbF90bV9zY2hlZF90eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3NoYXBpbmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01CQUxfVE1fU0hBUElOR19JRF9OT05FIH0sIHsgLm5hbWUgPSAic2JyIiwgLnZhbCA9IEJDTUJBTF9UTV9TSEFQSU5HX0lEX1NCUiB9LCB7IC5uYW1lID0gInBiciIsIC52YWwgPSBCQ01CQUxfVE1fU0hBUElOR19JRF9QQlIgfSwgeyAubmFtZSA9ICJidXJzdCIsIC52YWwgPSBCQ01CQUxfVE1fU0hBUElOR19JRF9CVVJTVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9zaGFwaW5nX2lkID0geyAubmFtZSA9ICJiY21iYWxfdG1fc2hhcGluZ19pZCIsIC5kZXNjciA9ICJ0bV9zaGFwaW5nIElEIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3NoYXBpbmdfaWQpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfRU5VTV9NQVNLLCAueCA9IHsgLmUgPSBiY21iYWxfdG1fc2hhcGluZ19pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NoYXBpbmdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicHJlc2VuY2VfbWFzayIsIC5kZXNjciA9ICJQcmVzZW5jZSBNYXNrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zaGFwaW5nLCBwcmVzZW5jZV9tYXNrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fc2hhcGluZ19pZCwgLmZsYWdzID0gQkNNQkFMX0FQSUNMSV9GSUVMRF9ERVNDUl9GTEFHU19QUkVTRU5DRV9NQVNLIH0sIHsgLm5hbWUgPSAic2JyIiwgLmRlc2NyID0gIlN1c3RhaW5lZCBCaXQgUmF0ZSAoa2JwcykiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NoYXBpbmcsIHNiciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJwYnIiLCAuZGVzY3IgPSAiUGVhayBCaXQgUmF0ZSAoa2JwcykiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NoYXBpbmcsIHBiciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJidXJzdCIsIC5kZXNjciA9ICJNYXggQnVyc3QgQnl0ZXMgYXQgUGVhayBCaXQgUmF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2hhcGluZywgYnVyc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NoYXBpbmcgPSB7IC5uYW1lID0gImJjbWJhbF90bV9zaGFwaW5nIiwgLmRlc2NyID0gIlNoYXBpbmcgUGFyYW1ldGVycyIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF90bV9zaGFwaW5nKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9zaGFwaW5nX2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF90bV9zaGFwaW5nX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdG1fdGNvbnRfc2xhX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNQkFMX1RNX1RDT05UX1NMQV9JRF9OT05FIH0sIHsgLm5hbWUgPSAiZXh0cmFfYndfZWxpZyIsIC52YWwgPSBCQ01CQUxfVE1fVENPTlRfU0xBX0lEX0VYVFJBX0JXX0VMSUcgfSwgeyAubmFtZSA9ICJucnRfY2JyIiwgLnZhbCA9IEJDTUJBTF9UTV9UQ09OVF9TTEFfSURfTlJUX0NCUiB9LCB7IC5uYW1lID0gInJ0X2NiciIsIC52YWwgPSBCQ01CQUxfVE1fVENPTlRfU0xBX0lEX1JUX0NCUiB9LCB7IC5uYW1lID0gInJ0X3Byb2ZpbGUiLCAudmFsID0gQkNNQkFMX1RNX1RDT05UX1NMQV9JRF9SVF9QUk9GSUxFIH0sIHsgLm5hbWUgPSAibnJ0X3Byb2ZpbGUiLCAudmFsID0gQkNNQkFMX1RNX1RDT05UX1NMQV9JRF9OUlRfUFJPRklMRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV90Y29udF9zbGFfaWQgPSB7IC5uYW1lID0gImJjbWJhbF90bV90Y29udF9zbGFfaWQiLCAuZGVzY3IgPSAidG1fdGNvbnRfc2xhIElEIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3Rjb250X3NsYV9pZCksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssIC54ID0geyAuZSA9IGJjbWJhbF90bV90Y29udF9zbGFfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV90Y29udF9zbGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicHJlc2VuY2VfbWFzayIsIC5kZXNjciA9ICJQcmVzZW5jZSBNYXNrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV90Y29udF9zbGEsIHByZXNlbmNlX21hc2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV90Y29udF9zbGFfaWQsIC5mbGFncyA9IEJDTUJBTF9BUElDTElfRklFTERfREVTQ1JfRkxBR1NfUFJFU0VOQ0VfTUFTSyB9LCB7IC5uYW1lID0gImV4dHJhX2J3X2VsaWciLCAuZGVzY3IgPSAiRXh0cmEgQlcgZWxpZ2liaWxpdHkgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fdGNvbnRfc2xhLCBleHRyYV9id19lbGlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfZXh0cmFfYndfZWxpZ2liaWxpdHlfdHlwZSB9LCB7IC5uYW1lID0gIm5ydF9jYnIiLCAuZGVzY3IgPSAiTlJUIENCUiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fdGNvbnRfc2xhLCBucnRfY2JyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicnRfY2JyIiwgLmRlc2NyID0gIlJUX0NCUiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fdGNvbnRfc2xhLCBydF9jYnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJydF9wcm9maWxlIiwgLmRlc2NyID0gIlJUIFByb2ZpbGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3Rjb250X3NsYSwgcnRfcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm5ydF9wcm9maWxlIiwgLmRlc2NyID0gIk5SVCBQcm9maWxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV90Y29udF9zbGEsIG5ydF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3Rjb250X3NsYSA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3Rjb250X3NsYSIsIC5kZXNjciA9ICJJVFUtUE9OIEV4dGVuZGVkIFNMQSBQYXJhbWV0ZXJzIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3Rjb250X3NsYSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfdG1fdGNvbnRfc2xhX2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF90bV90Y29udF9zbGFfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbWJhbF90cnhfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJncG9uX3Nwc180M180OCIsIC52YWwgPSBCQ01CQUxfVFJYX1RZUEVfR1BPTl9TUFNfNDNfNDggfSwgeyAubmFtZSA9ICJncG9uX3Nwc19zb2dfNDMyMSIsIC52YWwgPSBCQ01CQUxfVFJYX1RZUEVfR1BPTl9TUFNfU09HXzQzMjEgfSwgeyAubmFtZSA9ICJncG9uX2x0ZV8zNjgwX20iLCAudmFsID0gQkNNQkFMX1RSWF9UWVBFX0dQT05fTFRFXzM2ODBfTSB9LCB7IC5uYW1lID0gImdwb25fc291cmNlX3Bob3RvbmljcyIsIC52YWwgPSBCQ01CQUxfVFJYX1RZUEVfR1BPTl9TT1VSQ0VfUEhPVE9OSUNTIH0sIHsgLm5hbWUgPSAiZ3Bvbl9sdGVfMzY4MF9wIiwgLnZhbCA9IEJDTUJBTF9UUlhfVFlQRV9HUE9OX0xURV8zNjgwX1AgfSwgeyAubmFtZSA9ICJ4Z3Bvbl9sdGhfNzIyMl9wYyIsIC52YWwgPSBCQ01CQUxfVFJYX1RZUEVfWEdQT05fTFRIXzcyMjJfUEMgfSwgeyAubmFtZSA9ICJ4Z3Bvbl9sdGhfNzIyNl9wYyIsIC52YWwgPSBCQ01CQUxfVFJYX1RZUEVfWEdQT05fTFRIXzcyMjZfUEMgfSwgeyAubmFtZSA9ICJ4Z3Bvbl9sdGhfNTMwMl9wYyIsIC52YWwgPSBCQ01CQUxfVFJYX1RZUEVfWEdQT05fTFRIXzUzMDJfUEMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdHJ4X3R5cGUgPSB7IC5uYW1lID0gImJjbWJhbF90cnhfdHlwZSIsIC5kZXNjciA9ICJUcmFuc2NlaXZlciB0eXBlcyIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF90cnhfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21iYWxfdHJ4X3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3U4X2xpc3RfdTMyID0geyAubmFtZSA9ICJiY21iYWxfdThfbGlzdF91MzIiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTgiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdThfbGlzdF91MzIpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKHVpbnQ4X3QpIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogYWNjZXNzX3Rlcm1pbmFsID09PT0gKi8KKworLyogR3JvdXA6IGFjY2Vzc190ZXJtaW5hbCAtIGtleSAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hY2Nlc3NfdGVybWluYWxfa2V5X2FjY2Vzc190ZXJtX2lkID0geyAubmFtZSA9ICJhY2Nlc3NfdGVybV9pZCIsIC5kZXNjciA9ICJSZXNlcnZlZCAoc2V0IHRvIDApIiwgLmFjY2VzcyA9IDAsIC5wcm9wZXJ0eSA9IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfS0VZX0lEX0FDQ0VTU19URVJNX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXksIGFjY2Vzc190ZXJtX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhY2Nlc3NfdGVybWluYWxfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWNjZXNzX3Rlcm1pbmFsX2tleV9hY2Nlc3NfdGVybV9pZCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWNjZXNzX3Rlcm1faWQiLCAuZGVzY3IgPSAiUmVzZXJ2ZWQgKHNldCB0byAwKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSwgYWNjZXNzX3Rlcm1faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXkgPSB7IC5uYW1lID0gImJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFjY2Vzc190ZXJtaW5hbCAtIGNmZyAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hY2Nlc3NfdGVybWluYWxfY2ZnX2FkbWluX3N0YXRlID0geyAubmFtZSA9ICJhZG1pbl9zdGF0ZSIsIC5kZXNjciA9ICJBZG1pbmlzdHJhdGl2ZSBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGEsIGFkbWluX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWNjZXNzX3Rlcm1pbmFsX2NmZ19vcGVyX3N0YXR1cyA9IHsgLm5hbWUgPSAib3Blcl9zdGF0dXMiLCAuZGVzY3IgPSAiT3BlcmF0aW9uYWwgc3RhdHVzIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9DRkdfSURfT1BFUl9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhLCBvcGVyX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3N0YXR1cyB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hY2Nlc3NfdGVybWluYWxfY2ZnX2l3Zl9tb2RlID0geyAubmFtZSA9ICJpd2ZfbW9kZSIsIC5kZXNjciA9ICJUaGUgaW50ZXJ3b3JraW5nIG1vZGUiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9JV0ZfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGEsIGl3Zl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfaXdmX21vZGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWNjZXNzX3Rlcm1pbmFsX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FjY2Vzc190ZXJtaW5hbF9jZmdfYWRtaW5fc3RhdGUsICZwcm9wX2Rlc2NyX2FjY2Vzc190ZXJtaW5hbF9jZmdfb3Blcl9zdGF0dXMsICZwcm9wX2Rlc2NyX2FjY2Vzc190ZXJtaW5hbF9jZmdfaXdmX21vZGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAuZGVzY3IgPSAiQWRtaW5pc3RyYXRpdmUgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YSwgYWRtaW5fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zdGF0ZSB9LCB7IC5uYW1lID0gIm9wZXJfc3RhdHVzIiwgLmRlc2NyID0gIk9wZXJhdGlvbmFsIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhLCBvcGVyX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3N0YXR1cyB9LCB7IC5uYW1lID0gIml3Zl9tb2RlIiwgLmRlc2NyID0gIlRoZSBpbnRlcndvcmtpbmcgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhLCBpd2ZfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2l3Zl9tb2RlIH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhY2Nlc3NfdGVybWluYWwgLSBpbmQgKi8KK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWNjZXNzX3Rlcm1pbmFsX2luZF9hZG1pbl9zdGF0ZSA9IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGEsIGFkbWluX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWNjZXNzX3Rlcm1pbmFsX2luZF9vcGVyX3N0YXR1cyA9IHsgLm5hbWUgPSAib3Blcl9zdGF0dXMiLCAuZGVzY3IgPSAiQ3VycmVudCBvcGVyYXRpb25hbCBzdGF0dXMiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfT1BFUl9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhLCBvcGVyX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3N0YXR1cyB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hY2Nlc3NfdGVybWluYWxfaW5kX2l3Zl9tb2RlID0geyAubmFtZSA9ICJpd2ZfbW9kZSIsIC5kZXNjciA9ICJUaGUgaW50ZXJ3b3JraW5nIG1vZGUiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfSVdGX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhLCBpd2ZfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2l3Zl9tb2RlIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFjY2Vzc190ZXJtaW5hbF9pbmRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hY2Nlc3NfdGVybWluYWxfaW5kX2FkbWluX3N0YXRlLCAmcHJvcF9kZXNjcl9hY2Nlc3NfdGVybWluYWxfaW5kX29wZXJfc3RhdHVzLCAmcHJvcF9kZXNjcl9hY2Nlc3NfdGVybWluYWxfaW5kX2l3Zl9tb2RlIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFkbWluX3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgYWRtaW5pc3RyYXRpdmUgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YSwgYWRtaW5fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zdGF0ZSB9LCB7IC5uYW1lID0gIm9wZXJfc3RhdHVzIiwgLmRlc2NyID0gIkN1cnJlbnQgb3BlcmF0aW9uYWwgc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGEsIG9wZXJfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdHVzIH0sIHsgLm5hbWUgPSAiaXdmX21vZGUiLCAuZGVzY3IgPSAiVGhlIGludGVyd29ya2luZyBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGEsIGl3Zl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfaXdmX21vZGUgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhID0geyAubmFtZSA9ICJiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhIiwgLmRlc2NyID0gIkFjY2VzcyBUZXJtaW5hbCBJbmRpY2F0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZmxvdyA9PT09ICovCisKKy8qIEdyb3VwOiBmbG93IC0gY2ZnICovCitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Zsb3dfY2ZnX2FkbWluX3N0YXRlID0geyAubmFtZSA9ICJhZG1pbl9zdGF0ZSIsIC5kZXNjciA9ICJBZG1pbmlzdHJhdGl2ZSBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19DRkdfSURfQURNSU5fU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgYWRtaW5fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zdGF0ZSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2NmZ19vcGVyX3N0YXR1cyA9IHsgLm5hbWUgPSAib3Blcl9zdGF0dXMiLCAuZGVzY3IgPSAiT3BlcmF0aW9uYWwgc3RhdHVzIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX09QRVJfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEsIG9wZXJfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdHVzIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Zsb3dfY2ZnX2FjY2Vzc19pbnRfaWQgPSB7IC5uYW1lID0gImFjY2Vzc19pbnRfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBzdWJzY3JpYmVyIHNpZGUgaW50ZXJmYWNlOyBpLmUuIFBPTiIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19DRkdfSURfQUNDRVNTX0lOVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2NmZ19kYXRhLCBhY2Nlc3NfaW50X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2NmZ19uZXR3b3JrX2ludF9pZCA9IHsgLm5hbWUgPSAibmV0d29ya19pbnRfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBuZXR3b3JrIHNpZGUgaW50ZXJmYWNlOyBpLmUuIE5OSSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19DRkdfSURfTkVUV09SS19JTlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgbmV0d29ya19pbnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Zsb3dfY2ZnX3N1Yl90ZXJtX2lkID0geyAubmFtZSA9ICJzdWJfdGVybV9pZCIsIC5kZXNjciA9ICJUaGUgSUQgb2YgdGhlIHN1YnNjY3JpYmVyIHRlcm1pbmFsIGRldmljZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19DRkdfSURfU1VCX1RFUk1fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgc3ViX3Rlcm1faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Zsb3dfY2ZnX3N1Yl90ZXJtX3VuaV9pZHggPSB7IC5uYW1lID0gInN1Yl90ZXJtX3VuaV9pZHgiLCAuZGVzY3IgPSAiVGhlIGluZGV4IG9mIHRoZSBzdWJzY2NyaWJlciB0ZXJtaW5hbCB1bmkgcG9ydCB0aGUgZmxvdyBpcyByZWxhdGVkIHRvIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX0NGR19JRF9TVUJfVEVSTV9VTklfSURYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEsIHN1Yl90ZXJtX3VuaV9pZHgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZmxvd19jZmdfc3ZjX3BvcnRfaWQgPSB7IC5uYW1lID0gInN2Y19wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBJRCBvZiB0aGUgc2VydmljZSBwb3J0IChmb3IgR1BPTi9YR1BPTiAtIEdFTSBJRCkiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NWQ19QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEsIHN2Y19wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2NmZ19hZ2dfcG9ydF9pZCA9IHsgLm5hbWUgPSAiYWdnX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBhZ2dyZWdhdGUgcG9ydCAoZm9yIEdQT04vWEdQT04gLSBBTExPQyBJRCkiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FHR19QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEsIGFnZ19wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2NmZ19yZXNvbHZlX21hYyA9IHsgLm5hbWUgPSAicmVzb2x2ZV9tYWMiLCAuZGVzY3IgPSAiQSBmbGFnIGluZGljYXRpbmcgaWYgdGhlIE1BQyBhZGRyZXNzIHRhYmxlIHNob3VsZCBiZSB1c2VkIGluIERTIEdFTSByZXNvbHV0aW9uIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX0NGR19JRF9SRVNPTFZFX01BQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2NmZ19kYXRhLCByZXNvbHZlX21hYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2NmZ19jbGFzc2lmaWVyID0geyAubmFtZSA9ICJjbGFzc2lmaWVyIiwgLmRlc2NyID0gIlRoZSBjbGFzc2lmaWVyIGZvciB0aGlzIGZsb3ciLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX0NMQVNTSUZJRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgY2xhc3NpZmllciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2NsYXNzaWZpZXIgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZmxvd19jZmdfYWN0aW9uID0geyAubmFtZSA9ICJhY3Rpb24iLCAuZGVzY3IgPSAiVGhlIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGZsb3ciLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2NmZ19kYXRhLCBhY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9hY3Rpb24gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZmxvd19jZmdfc2xhID0geyAubmFtZSA9ICJzbGEiLCAuZGVzY3IgPSAiU0xBIHBhcmFtZXRlcnMgZm9yIHRoaXMgZmxvdyIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19DRkdfSURfU0xBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEsIHNsYSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3NsYSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2NmZ19jb29raWUgPSB7IC5uYW1lID0gImNvb2tpZSIsIC5kZXNjciA9ICJBcHBsaWNhdGlvbiBjb29raWUiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX0NPT0tJRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2NmZ19kYXRhLCBjb29raWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Zsb3dfY2ZnX3ByaW9yaXR5ID0geyAubmFtZSA9ICJwcmlvcml0eSIsIC5kZXNjciA9ICJQcmlvcml0eSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19DRkdfSURfUFJJT1JJVFksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgcHJpb3JpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Zsb3dfY2ZnX2dyb3VwX2lkID0geyAubmFtZSA9ICJncm91cF9pZCIsIC5kZXNjciA9ICJSVyAtIFRoZSBtdWx0aWNhc3QgZ3JvdXAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmxvdywgdmFsaWQgZm9yIHR5cGUgTVVMVElDQVNUIG9ubHkiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX0dST1VQX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEsIGdyb3VwX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2NmZ19xdWV1ZSA9IHsgLm5hbWUgPSAicXVldWUiLCAuZGVzY3IgPSAiRWdyZXNzIHF1ZXVlIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX0NGR19JRF9RVUVVRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2NmZ19kYXRhLCBxdWV1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX3JlZiB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBmbG93X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Zsb3dfY2ZnX2FkbWluX3N0YXRlLCAmcHJvcF9kZXNjcl9mbG93X2NmZ19vcGVyX3N0YXR1cywgJnByb3BfZGVzY3JfZmxvd19jZmdfYWNjZXNzX2ludF9pZCwgJnByb3BfZGVzY3JfZmxvd19jZmdfbmV0d29ya19pbnRfaWQsICZwcm9wX2Rlc2NyX2Zsb3dfY2ZnX3N1Yl90ZXJtX2lkLCAmcHJvcF9kZXNjcl9mbG93X2NmZ19zdWJfdGVybV91bmlfaWR4LCAmcHJvcF9kZXNjcl9mbG93X2NmZ19zdmNfcG9ydF9pZCwgJnByb3BfZGVzY3JfZmxvd19jZmdfYWdnX3BvcnRfaWQsICZwcm9wX2Rlc2NyX2Zsb3dfY2ZnX3Jlc29sdmVfbWFjLCAmcHJvcF9kZXNjcl9mbG93X2NmZ19jbGFzc2lmaWVyLCAmcHJvcF9kZXNjcl9mbG93X2NmZ19hY3Rpb24sICZwcm9wX2Rlc2NyX2Zsb3dfY2ZnX3NsYSwgJnByb3BfZGVzY3JfZmxvd19jZmdfY29va2llLCAmcHJvcF9kZXNjcl9mbG93X2NmZ19wcmlvcml0eSwgJnByb3BfZGVzY3JfZmxvd19jZmdfZ3JvdXBfaWQsICZwcm9wX2Rlc2NyX2Zsb3dfY2ZnX3F1ZXVlIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfZmxvd19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZG1pbl9zdGF0ZSIsIC5kZXNjciA9ICJBZG1pbmlzdHJhdGl2ZSBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgYWRtaW5fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zdGF0ZSB9LCB7IC5uYW1lID0gIm9wZXJfc3RhdHVzIiwgLmRlc2NyID0gIk9wZXJhdGlvbmFsIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgb3Blcl9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zdGF0dXMgfSwgeyAubmFtZSA9ICJhY2Nlc3NfaW50X2lkIiwgLmRlc2NyID0gIlRoZSBJRCBvZiB0aGUgc3Vic2NyaWJlciBzaWRlIGludGVyZmFjZTsgaS5lLiBQT04iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEsIGFjY2Vzc19pbnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibmV0d29ya19pbnRfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBuZXR3b3JrIHNpZGUgaW50ZXJmYWNlOyBpLmUuIE5OSSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgbmV0d29ya19pbnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic3ViX3Rlcm1faWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBzdWJzY2NyaWJlciB0ZXJtaW5hbCBkZXZpY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEsIHN1Yl90ZXJtX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInN1Yl90ZXJtX3VuaV9pZHgiLCAuZGVzY3IgPSAiVGhlIGluZGV4IG9mIHRoZSBzdWJzY2NyaWJlciB0ZXJtaW5hbCB1bmkgcG9ydCB0aGUgZmxvdyBpcyByZWxhdGVkIHRvIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2NmZ19kYXRhLCBzdWJfdGVybV91bmlfaWR4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAic3ZjX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBzZXJ2aWNlIHBvcnQgKGZvciBHUE9OL1hHUE9OIC0gR0VNIElEKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgc3ZjX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYWdnX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBhZ2dyZWdhdGUgcG9ydCAoZm9yIEdQT04vWEdQT04gLSBBTExPQyBJRCkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEsIGFnZ19wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInJlc29sdmVfbWFjIiwgLmRlc2NyID0gIkEgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBNQUMgYWRkcmVzcyB0YWJsZSBzaG91bGQgYmUgdXNlZCBpbiBEUyBHRU0gcmVzb2x1dGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgcmVzb2x2ZV9tYWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjbGFzc2lmaWVyIiwgLmRlc2NyID0gIlRoZSBjbGFzc2lmaWVyIGZvciB0aGlzIGZsb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEsIGNsYXNzaWZpZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9jbGFzc2lmaWVyIH0sIHsgLm5hbWUgPSAiYWN0aW9uIiwgLmRlc2NyID0gIlRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBmbG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2NmZ19kYXRhLCBhY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9hY3Rpb24gfSwgeyAubmFtZSA9ICJzbGEiLCAuZGVzY3IgPSAiU0xBIHBhcmFtZXRlcnMgZm9yIHRoaXMgZmxvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgc2xhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc2xhIH0sIHsgLm5hbWUgPSAiY29va2llIiwgLmRlc2NyID0gIkFwcGxpY2F0aW9uIGNvb2tpZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgY29va2llKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInByaW9yaXR5IiwgLmRlc2NyID0gIlByaW9yaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2NmZ19kYXRhLCBwcmlvcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJncm91cF9pZCIsIC5kZXNjciA9ICJSVyAtIFRoZSBtdWx0aWNhc3QgZ3JvdXAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmxvdywgdmFsaWQgZm9yIHR5cGUgTVVMVElDQVNUIG9ubHkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEsIGdyb3VwX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInF1ZXVlIiwgLmRlc2NyID0gIkVncmVzcyBxdWV1ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19jZmdfZGF0YSwgcXVldWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9xdWV1ZV9yZWYgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfZmxvd19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtYmFsX2Zsb3dfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtYmFsX2Zsb3dfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX2Zsb3dfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZmxvdyAtIGtleSAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2tleV9mbG93X2lkID0geyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIlRoZSBJRCBvZiB0aGUgZmxvdyBvYmplY3QgaW5zdGFuY2UgYmVpbmcgcmVmZXJlbmNlZCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2tleSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZmxvd19rZXlfZmxvd190eXBlID0geyAubmFtZSA9ICJmbG93X3R5cGUiLCAuZGVzY3IgPSAiVGhlIHR5cGUgb2YgdGhlIGZsb3csIFVwc3RyZWFtLCBEb3duc3RyZWFtLCBCcm9hZGNhc3Qgb3IgTXVsdGljYXN0IiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX0tFWV9JRF9GTE9XX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19rZXksIGZsb3dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2Zsb3dfdHlwZSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBmbG93X2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Zsb3dfa2V5X2Zsb3dfaWQsICZwcm9wX2Rlc2NyX2Zsb3dfa2V5X2Zsb3dfdHlwZSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2Zsb3dfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBmbG93IG9iamVjdCBpbnN0YW5jZSBiZWluZyByZWZlcmVuY2VkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2tleSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJmbG93X3R5cGUiLCAuZGVzY3IgPSAiVGhlIHR5cGUgb2YgdGhlIGZsb3csIFVwc3RyZWFtLCBEb3duc3RyZWFtLCBCcm9hZGNhc3Qgb3IgTXVsdGljYXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2tleSwgZmxvd190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfZmxvd190eXBlIH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2Zsb3dfa2V5ID0geyAubmFtZSA9ICJiY21iYWxfZmxvd19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2Zsb3dfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9mbG93X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfZmxvd19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZmxvdyAtIHN0YXQgKi8KK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZmxvd19zdGF0X3J4X3BhY2tldHMgPSB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19TVEFUX0lEX1JYX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Zsb3dfc3RhdF9yeF9ieXRlcyA9IHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfU1RBVF9JRF9SWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Zsb3dfc3RhdF90eF9wYWNrZXRzID0geyAubmFtZSA9ICJ0eF9wYWNrZXRzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfU1RBVF9JRF9UWF9QQUNLRVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X3N0YXRfdHhfYnl0ZXMgPSB7IC5uYW1lID0gInR4X2J5dGVzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIGJ5dGVzIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX1NUQVRfSURfVFhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19zdGF0X2RhdGEsIHR4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBmbG93X3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9mbG93X3N0YXRfcnhfcGFja2V0cywgJnByb3BfZGVzY3JfZmxvd19zdGF0X3J4X2J5dGVzLCAmcHJvcF9kZXNjcl9mbG93X3N0YXRfdHhfcGFja2V0cywgJnByb3BfZGVzY3JfZmxvd19zdGF0X3R4X2J5dGVzIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfZmxvd19zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfc3RhdF9kYXRhLCB0eF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfZmxvd19zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbWJhbF9mbG93X3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2Zsb3dfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9mbG93X3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfZmxvd19zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZmxvdyAtIGluZCAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2luZF9hZG1pbl9zdGF0ZSA9IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAuZGVzY3IgPSAiQWRtaW5pc3RyYXRpdmUgc3RhdGUiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfSU5EX0lEX0FETUlOX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfaW5kX2RhdGEsIGFkbWluX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZmxvd19pbmRfb3Blcl9zdGF0dXMgPSB7IC5uYW1lID0gIm9wZXJfc3RhdHVzIiwgLmRlc2NyID0gIk9wZXJhdGlvbmFsIFN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19JTkRfSURfT1BFUl9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19pbmRfZGF0YSwgb3Blcl9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zdGF0dXMgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZmxvd19pbmRfYWNjZXNzX2ludF9pZCA9IHsgLm5hbWUgPSAiYWNjZXNzX2ludF9pZCIsIC5kZXNjciA9ICJUaGUgSUQgb2YgdGhlIHN1YnNjcmliZXIgc2lkZSBpbnRlcmZhY2U7IGkuZS4gUE9OIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX0lORF9JRF9BQ0NFU1NfSU5UX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfaW5kX2RhdGEsIGFjY2Vzc19pbnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Zsb3dfaW5kX25ldHdvcmtfaW50X2lkID0geyAubmFtZSA9ICJuZXR3b3JrX2ludF9pZCIsIC5kZXNjciA9ICJUaGUgSUQgb2YgdGhlIG5ldHdvcmsgc2lkZSBpbnRlcmZhY2U7IGkuZS4gTk5JIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX0lORF9JRF9ORVRXT1JLX0lOVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZF9kYXRhLCBuZXR3b3JrX2ludF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZmxvd19pbmRfc3ViX3Rlcm1faWQgPSB7IC5uYW1lID0gInN1Yl90ZXJtX2lkIiwgLmRlc2NyID0gIlRoZSBJRCBvZiB0aGUgc3Vic2NjcmliZXIgdGVybWluYWwgZGV2aWNlIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX0lORF9JRF9TVUJfVEVSTV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZF9kYXRhLCBzdWJfdGVybV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZmxvd19pbmRfc3ZjX3BvcnRfaWQgPSB7IC5uYW1lID0gInN2Y19wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBJRCBvZiB0aGUgc2VydmljZSBwb3J0IChmb3IgR1BPTi9YR1BPTiAtIEdFTSBJRCkiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfSU5EX0lEX1NWQ19QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfaW5kX2RhdGEsIHN2Y19wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2luZF9hZ2dfcG9ydF9pZCA9IHsgLm5hbWUgPSAiYWdnX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBhZ2dyZWdhdGUgcG9ydCAoZm9yIEdQT04vWEdQT04gLSBBTExPQyBJRCkiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0ZMT1dfSU5EX0lEX0FHR19QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfaW5kX2RhdGEsIGFnZ19wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2luZF9yZXNvbHZlX21hYyA9IHsgLm5hbWUgPSAicmVzb2x2ZV9tYWMiLCAuZGVzY3IgPSAiQSBmbGFnIGluZGljYXRpbmcgaWYgdGhlIE1BQyBhZGRyZXNzIHRhYmxlIHNob3VsZCBiZSB1c2VkIGluIERTIEdFTSByZXNvbHV0aW9uIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX0lORF9JRF9SRVNPTFZFX01BQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZF9kYXRhLCByZXNvbHZlX21hYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2luZF9iYXNlX3RjX2lkID0geyAubmFtZSA9ICJiYXNlX3RjX2lkIiwgLmRlc2NyID0gIlRoZSBiYXNlIGluZGV4IG9mIHRoZSBUQyBvYmplY3QocykgdG8gYmUgdXNlZCBmb3IgdGhpcyBmbG93IiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX0lORF9JRF9CQVNFX1RDX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfaW5kX2RhdGEsIGJhc2VfdGNfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Zsb3dfaW5kX2NsYXNzaWZpZXIgPSB7IC5uYW1lID0gImNsYXNzaWZpZXIiLCAuZGVzY3IgPSAiVGhlIGNsYXNzaWZpZXIgZm9yIHRoaXMgZmxvdyIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19JTkRfSURfQ0xBU1NJRklFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZF9kYXRhLCBjbGFzc2lmaWVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfY2xhc3NpZmllciB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2luZF9hY3Rpb24gPSB7IC5uYW1lID0gImFjdGlvbiIsIC5kZXNjciA9ICJUaGUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmxvdyIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19JTkRfSURfQUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfaW5kX2RhdGEsIGFjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2FjdGlvbiB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9mbG93X2luZF9zbGEgPSB7IC5uYW1lID0gInNsYSIsIC5kZXNjciA9ICJTTEEgcGFyYW1ldGVycyBmb3IgdGhpcyBmbG93IiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX0lORF9JRF9TTEEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19pbmRfZGF0YSwgc2xhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc2xhIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Zsb3dfaW5kX2Nvb2tpZSA9IHsgLm5hbWUgPSAiY29va2llIiwgLmRlc2NyID0gIkFwcGxpY2F0aW9uIGNvb2tpZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfRkxPV19JTkRfSURfQ09PS0lFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfaW5kX2RhdGEsIGNvb2tpZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZmxvd19pbmRfcHJpb3JpdHkgPSB7IC5uYW1lID0gInByaW9yaXR5IiwgLmRlc2NyID0gIlByaW9yaXR5IiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9GTE9XX0lORF9JRF9QUklPUklUWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZF9kYXRhLCBwcmlvcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZmxvd19pbmRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9mbG93X2luZF9hZG1pbl9zdGF0ZSwgJnByb3BfZGVzY3JfZmxvd19pbmRfb3Blcl9zdGF0dXMsICZwcm9wX2Rlc2NyX2Zsb3dfaW5kX2FjY2Vzc19pbnRfaWQsICZwcm9wX2Rlc2NyX2Zsb3dfaW5kX25ldHdvcmtfaW50X2lkLCAmcHJvcF9kZXNjcl9mbG93X2luZF9zdWJfdGVybV9pZCwgJnByb3BfZGVzY3JfZmxvd19pbmRfc3ZjX3BvcnRfaWQsICZwcm9wX2Rlc2NyX2Zsb3dfaW5kX2FnZ19wb3J0X2lkLCAmcHJvcF9kZXNjcl9mbG93X2luZF9yZXNvbHZlX21hYywgJnByb3BfZGVzY3JfZmxvd19pbmRfYmFzZV90Y19pZCwgJnByb3BfZGVzY3JfZmxvd19pbmRfY2xhc3NpZmllciwgJnByb3BfZGVzY3JfZmxvd19pbmRfYWN0aW9uLCAmcHJvcF9kZXNjcl9mbG93X2luZF9zbGEsICZwcm9wX2Rlc2NyX2Zsb3dfaW5kX2Nvb2tpZSwgJnByb3BfZGVzY3JfZmxvd19pbmRfcHJpb3JpdHkgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9mbG93X2luZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFkbWluX3N0YXRlIiwgLmRlc2NyID0gIkFkbWluaXN0cmF0aXZlIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZF9kYXRhLCBhZG1pbl9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3N0YXRlIH0sIHsgLm5hbWUgPSAib3Blcl9zdGF0dXMiLCAuZGVzY3IgPSAiT3BlcmF0aW9uYWwgU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZF9kYXRhLCBvcGVyX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3N0YXR1cyB9LCB7IC5uYW1lID0gImFjY2Vzc19pbnRfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBzdWJzY3JpYmVyIHNpZGUgaW50ZXJmYWNlOyBpLmUuIFBPTiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19pbmRfZGF0YSwgYWNjZXNzX2ludF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJuZXR3b3JrX2ludF9pZCIsIC5kZXNjciA9ICJUaGUgSUQgb2YgdGhlIG5ldHdvcmsgc2lkZSBpbnRlcmZhY2U7IGkuZS4gTk5JIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZF9kYXRhLCBuZXR3b3JrX2ludF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdWJfdGVybV9pZCIsIC5kZXNjciA9ICJUaGUgSUQgb2YgdGhlIHN1YnNjY3JpYmVyIHRlcm1pbmFsIGRldmljZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19pbmRfZGF0YSwgc3ViX3Rlcm1faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic3ZjX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBzZXJ2aWNlIHBvcnQgKGZvciBHUE9OL1hHUE9OIC0gR0VNIElEKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19pbmRfZGF0YSwgc3ZjX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYWdnX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBhZ2dyZWdhdGUgcG9ydCAoZm9yIEdQT04vWEdQT04gLSBBTExPQyBJRCkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfaW5kX2RhdGEsIGFnZ19wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInJlc29sdmVfbWFjIiwgLmRlc2NyID0gIkEgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBNQUMgYWRkcmVzcyB0YWJsZSBzaG91bGQgYmUgdXNlZCBpbiBEUyBHRU0gcmVzb2x1dGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19pbmRfZGF0YSwgcmVzb2x2ZV9tYWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJiYXNlX3RjX2lkIiwgLmRlc2NyID0gIlRoZSBiYXNlIGluZGV4IG9mIHRoZSBUQyBvYmplY3QocykgdG8gYmUgdXNlZCBmb3IgdGhpcyBmbG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZF9kYXRhLCBiYXNlX3RjX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImNsYXNzaWZpZXIiLCAuZGVzY3IgPSAiVGhlIGNsYXNzaWZpZXIgZm9yIHRoaXMgZmxvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19pbmRfZGF0YSwgY2xhc3NpZmllciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2NsYXNzaWZpZXIgfSwgeyAubmFtZSA9ICJhY3Rpb24iLCAuZGVzY3IgPSAiVGhlIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGZsb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfaW5kX2RhdGEsIGFjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2FjdGlvbiB9LCB7IC5uYW1lID0gInNsYSIsIC5kZXNjciA9ICJTTEEgcGFyYW1ldGVycyBmb3IgdGhpcyBmbG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZF9kYXRhLCBzbGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zbGEgfSwgeyAubmFtZSA9ICJjb29raWUiLCAuZGVzY3IgPSAiQXBwbGljYXRpb24gY29va2llIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZF9kYXRhLCBjb29raWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicHJpb3JpdHkiLCAuZGVzY3IgPSAiUHJpb3JpdHkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfaW5kX2RhdGEsIHByaW9yaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9mbG93X2luZF9kYXRhID0geyAubmFtZSA9ICJiY21iYWxfZmxvd19pbmRfZGF0YSIsIC5kZXNjciA9ICJGbG93IEluZGljYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfZmxvd19pbmRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfZmxvd19pbmRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfZmxvd19pbmRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBncm91cCA9PT09ICovCisKKy8qIEdyb3VwOiBncm91cCAtIGNmZyAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncm91cF9jZmdfbWVtYmVyc19jbWQgPSB7IC5uYW1lID0gIm1lbWJlcnNfY21kIiwgLmRlc2NyID0gIk1lbWJlcnNoaXAgb3BlcmF0aW9uIGNvbW1hbmRzIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9HUk9VUF9DRkdfSURfTUVNQkVSU19DTUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZ3JvdXBfY2ZnX2RhdGEsIG1lbWJlcnNfY21kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfZ3JvdXBfbWVtYmVyX2NtZCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncm91cF9jZmdfbWVtYmVycyA9IHsgLm5hbWUgPSAibWVtYmVycyIsIC5kZXNjciA9ICJUaGUgbGlzdCBvZiBtZW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdyb3VwIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9HUk9VUF9DRkdfSURfTUVNQkVSUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9ncm91cF9jZmdfZGF0YSwgbWVtYmVycyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dyb3VwX2NmZ19jb29raWUgPSB7IC5uYW1lID0gImNvb2tpZSIsIC5kZXNjciA9ICJBcHBsaWNhdGlvbiBjb29raWUiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0dST1VQX0NGR19JRF9DT09LSUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZ3JvdXBfY2ZnX2RhdGEsIGNvb2tpZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3JvdXBfY2ZnX2Zsb3dzID0geyAubmFtZSA9ICJmbG93cyIsIC5kZXNjciA9ICJMaXN0IG9mIGZsb3dzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdyb3VwIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNQkFMX0dST1VQX0NGR19JRF9GTE9XUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9ncm91cF9jZmdfZGF0YSwgZmxvd3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9mbG93X2lkX2xpc3RfdTMyIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dyb3VwX2NmZ19vd25lciA9IHsgLm5hbWUgPSAib3duZXIiLCAuZGVzY3IgPSAiT3duZXIgb2YgdGhlIGdyb3VwIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNQkFMX0dST1VQX0NGR19JRF9PV05FUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9ncm91cF9jZmdfZGF0YSwgb3duZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9ncm91cF9vd25lciB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncm91cF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncm91cF9jZmdfbWVtYmVyc19jbWQsICZwcm9wX2Rlc2NyX2dyb3VwX2NmZ19tZW1iZXJzLCAmcHJvcF9kZXNjcl9ncm91cF9jZmdfY29va2llLCAmcHJvcF9kZXNjcl9ncm91cF9jZmdfZmxvd3MsICZwcm9wX2Rlc2NyX2dyb3VwX2NmZ19vd25lciB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2dyb3VwX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1lbWJlcnNfY21kIiwgLmRlc2NyID0gIk1lbWJlcnNoaXAgb3BlcmF0aW9uIGNvbW1hbmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9ncm91cF9jZmdfZGF0YSwgbWVtYmVyc19jbWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9ncm91cF9tZW1iZXJfY21kIH0sIHsgLm5hbWUgPSAibWVtYmVycyIsIC5kZXNjciA9ICJUaGUgbGlzdCBvZiBtZW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdyb3VwIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9ncm91cF9jZmdfZGF0YSwgbWVtYmVycyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2IH0sIHsgLm5hbWUgPSAiY29va2llIiwgLmRlc2NyID0gIkFwcGxpY2F0aW9uIGNvb2tpZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZ3JvdXBfY2ZnX2RhdGEsIGNvb2tpZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmbG93cyIsIC5kZXNjciA9ICJMaXN0IG9mIGZsb3dzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdyb3VwIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9ncm91cF9jZmdfZGF0YSwgZmxvd3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9mbG93X2lkX2xpc3RfdTMyIH0sIHsgLm5hbWUgPSAib3duZXIiLCAuZGVzY3IgPSAiT3duZXIgb2YgdGhlIGdyb3VwIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9ncm91cF9jZmdfZGF0YSwgb3duZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9ncm91cF9vd25lciB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9ncm91cF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtYmFsX2dyb3VwX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9ncm91cF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfZ3JvdXBfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX2dyb3VwX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdyb3VwIC0ga2V5ICovCitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dyb3VwX2tleV9ncm91cF9pZCA9IHsgLm5hbWUgPSAiZ3JvdXBfaWQiLCAuZGVzY3IgPSAiVGhlIElEIG9mIHRoZSBncm91cCBvYmplY3QgaW5zdGFuY2UgYmVpbmcgcmVmZXJlbmNlZCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfR1JPVVBfS0VZX0lEX0dST1VQX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2dyb3VwX2tleSwgZ3JvdXBfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdyb3VwX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dyb3VwX2tleV9ncm91cF9pZCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2dyb3VwX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJncm91cF9pZCIsIC5kZXNjciA9ICJUaGUgSUQgb2YgdGhlIGdyb3VwIG9iamVjdCBpbnN0YW5jZSBiZWluZyByZWZlcmVuY2VkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9ncm91cF9rZXksIGdyb3VwX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9ncm91cF9rZXkgPSB7IC5uYW1lID0gImJjbWJhbF9ncm91cF9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2dyb3VwX2tleSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfZ3JvdXBfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF9ncm91cF9rZXlfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogaW50ZXJmYWNlID09PT0gKi8KKworLyogR3JvdXA6IGludGVyZmFjZSAtIGtleSAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9pbnRlcmZhY2Vfa2V5X2ludGZfaWQgPSB7IC5uYW1lID0gImludGZfaWQiLCAuZGVzY3IgPSAiaW50Zl9pZCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0tFWV9JRF9JTlRGX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9rZXksIGludGZfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9rZXlfaW50Zl90eXBlID0geyAubmFtZSA9ICJpbnRmX3R5cGUiLCAuZGVzY3IgPSAiaW50Zl90eXBlIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX0lOVEZfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2Vfa2V5LCBpbnRmX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9pbnRmX3R5cGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgaW50ZXJmYWNlX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2ludGVyZmFjZV9rZXlfaW50Zl9pZCwgJnByb3BfZGVzY3JfaW50ZXJmYWNlX2tleV9pbnRmX3R5cGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9pbnRlcmZhY2Vfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImludGZfaWQiLCAuZGVzY3IgPSAiaW50Zl9pZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2tleSwgaW50Zl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJpbnRmX3R5cGUiLCAuZGVzY3IgPSAiaW50Zl90eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2Vfa2V5LCBpbnRmX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9pbnRmX3R5cGUgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfaW50ZXJmYWNlX2tleSA9IHsgLm5hbWUgPSAiYmNtYmFsX2ludGVyZmFjZV9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2ludGVyZmFjZV9rZXkpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtYmFsX2ludGVyZmFjZV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX2ludGVyZmFjZV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogaW50ZXJmYWNlIC0gY2ZnICovCitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9jZmdfYWRtaW5fc3RhdGUgPSB7IC5uYW1lID0gImFkbWluX3N0YXRlIiwgLmRlc2NyID0gIkFkbWluaXN0cmF0aXZlIHN0YXRlIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0FETUlOX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSwgYWRtaW5fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zdGF0ZSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9pbnRlcmZhY2VfY2ZnX29wZXJfc3RhdHVzID0geyAubmFtZSA9ICJvcGVyX3N0YXR1cyIsIC5kZXNjciA9ICJPcGVyYXRpb25hbCBzdGF0dXMiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9PUEVSX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEsIG9wZXJfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdHVzIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9jZmdfbWluX2RhdGFfYWdnX3BvcnRfaWQgPSB7IC5uYW1lID0gIm1pbl9kYXRhX2FnZ19wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBtaW5pbXVtIGFnZ19wb3J0X2lkIHRoYXQgaXMgYWxsb3dlZCBpbiB0aGUgc3lzdGVtIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX01JTl9EQVRBX0FHR19QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSwgbWluX2RhdGFfYWdnX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9jZmdfbWluX2RhdGFfc3ZjX3BvcnRfaWQgPSB7IC5uYW1lID0gIm1pbl9kYXRhX3N2Y19wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBtaW5pbXVtIHN2Y19wb3J0X2lkIHRoYXQgaXMgYWxsb3dlZCBpbiB0aGUgc3lzdGVtIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX01JTl9EQVRBX1NWQ19QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSwgbWluX2RhdGFfc3ZjX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9jZmdfdHJhbnNjZWl2ZXJfdHlwZSA9IHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfdHlwZSIsIC5kZXNjciA9ICJUaGUgdHJhbnNjZWl2ZXIgdHlwZSB1c2VkIG9uIGFuIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSwgdHJhbnNjZWl2ZXJfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RyeF90eXBlIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9jZmdfZHNfbWlzc19tb2RlID0geyAubmFtZSA9ICJkc19taXNzX21vZGUiLCAuZGVzY3IgPSAiRGVmaW5lcyB0aGUgYWN0aW9uIHRvIHRha2UgZm9yIHVua25vd24gZG93bnN0cmVhbSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0RTX01JU1NfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEsIGRzX21pc3NfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2RzX21pc3NfbW9kZSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9pbnRlcmZhY2VfY2ZnX210dSA9IHsgLm5hbWUgPSAibXR1IiwgLmRlc2NyID0gIlRoZSBNVFUgZm9yIGFuIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9NVFUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhLCBtdHUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9jZmdfZmxvd19jb250cm9sID0geyAubmFtZSA9ICJmbG93X2NvbnRyb2wiLCAuZGVzY3IgPSAiRmxvdyBjb250cm9sIGVuYWJsZSBvciBkaXNhYmxlIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEsIGZsb3dfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfaW50ZXJmYWNlX2NmZ19kc190bSA9IHsgLm5hbWUgPSAiZHNfdG0iLCAuZGVzY3IgPSAiRG93bnN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlciIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9EU19UTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEsIGRzX3RtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9pbnRlcmZhY2VfY2ZnX3VzX3RtID0geyAubmFtZSA9ICJ1c190bSIsIC5kZXNjciA9ICJVcHN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlciIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9VU19UTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEsIHVzX3RtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9pbnRlcmZhY2VfY2ZnX3N1Yl90ZXJtX2lkX2xpc3QgPSB7IC5uYW1lID0gInN1Yl90ZXJtX2lkX2xpc3QiLCAuZGVzY3IgPSAiQSBsaXN0IG9mIHN1YnNjcmliZXIgdGVybWluYWwgaWRzIGNvbmZpZ3VyZWQgb24gdGhpcyBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9TVUJfVEVSTV9JRF9MSVNULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSwgc3ViX3Rlcm1faWRfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3N1Yl9pZF9saXN0X3UxNiB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBpbnRlcmZhY2VfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfaW50ZXJmYWNlX2NmZ19hZG1pbl9zdGF0ZSwgJnByb3BfZGVzY3JfaW50ZXJmYWNlX2NmZ19vcGVyX3N0YXR1cywgJnByb3BfZGVzY3JfaW50ZXJmYWNlX2NmZ19taW5fZGF0YV9hZ2dfcG9ydF9pZCwgJnByb3BfZGVzY3JfaW50ZXJmYWNlX2NmZ19taW5fZGF0YV9zdmNfcG9ydF9pZCwgJnByb3BfZGVzY3JfaW50ZXJmYWNlX2NmZ190cmFuc2NlaXZlcl90eXBlLCAmcHJvcF9kZXNjcl9pbnRlcmZhY2VfY2ZnX2RzX21pc3NfbW9kZSwgJnByb3BfZGVzY3JfaW50ZXJmYWNlX2NmZ19tdHUsICZwcm9wX2Rlc2NyX2ludGVyZmFjZV9jZmdfZmxvd19jb250cm9sLCAmcHJvcF9kZXNjcl9pbnRlcmZhY2VfY2ZnX2RzX3RtLCAmcHJvcF9kZXNjcl9pbnRlcmZhY2VfY2ZnX3VzX3RtLCAmcHJvcF9kZXNjcl9pbnRlcmZhY2VfY2ZnX3N1Yl90ZXJtX2lkX2xpc3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAuZGVzY3IgPSAiQWRtaW5pc3RyYXRpdmUgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSwgYWRtaW5fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zdGF0ZSB9LCB7IC5uYW1lID0gIm9wZXJfc3RhdHVzIiwgLmRlc2NyID0gIk9wZXJhdGlvbmFsIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhLCBvcGVyX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3N0YXR1cyB9LCB7IC5uYW1lID0gIm1pbl9kYXRhX2FnZ19wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBtaW5pbXVtIGFnZ19wb3J0X2lkIHRoYXQgaXMgYWxsb3dlZCBpbiB0aGUgc3lzdGVtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEsIG1pbl9kYXRhX2FnZ19wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1pbl9kYXRhX3N2Y19wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBtaW5pbXVtIHN2Y19wb3J0X2lkIHRoYXQgaXMgYWxsb3dlZCBpbiB0aGUgc3lzdGVtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEsIG1pbl9kYXRhX3N2Y19wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInRyYW5zY2VpdmVyX3R5cGUiLCAuZGVzY3IgPSAiVGhlIHRyYW5zY2VpdmVyIHR5cGUgdXNlZCBvbiBhbiBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSwgdHJhbnNjZWl2ZXJfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RyeF90eXBlIH0sIHsgLm5hbWUgPSAiZHNfbWlzc19tb2RlIiwgLmRlc2NyID0gIkRlZmluZXMgdGhlIGFjdGlvbiB0byB0YWtlIGZvciB1bmtub3duIGRvd25zdHJlYW0gcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhLCBkc19taXNzX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9kc19taXNzX21vZGUgfSwgeyAubmFtZSA9ICJtdHUiLCAuZGVzY3IgPSAiVGhlIE1UVSBmb3IgYW4gaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEsIG10dSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJmbG93X2NvbnRyb2wiLCAuZGVzY3IgPSAiRmxvdyBjb250cm9sIGVuYWJsZSBvciBkaXNhYmxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEsIGZsb3dfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJkc190bSIsIC5kZXNjciA9ICJEb3duc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEsIGRzX3RtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInVzX3RtIiwgLmRlc2NyID0gIlVwc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEsIHVzX3RtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInN1Yl90ZXJtX2lkX2xpc3QiLCAuZGVzY3IgPSAiQSBsaXN0IG9mIHN1YnNjcmliZXIgdGVybWluYWwgaWRzIGNvbmZpZ3VyZWQgb24gdGhpcyBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSwgc3ViX3Rlcm1faWRfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3N1Yl9pZF9saXN0X3UxNiB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogaW50ZXJmYWNlIC0gc3RhdCAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9pbnRlcmZhY2Vfc3RhdF9yeF9wYWNrZXRzID0geyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLmRlc2NyID0gIlJlY2lldmVkIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1JYX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfaW50ZXJmYWNlX3N0YXRfcnhfYnl0ZXMgPSB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9SWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhLCByeF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfaW50ZXJmYWNlX3N0YXRfdHhfcGFja2V0cyA9IHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9UWF9QQUNLRVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9zdGF0X3R4X2J5dGVzID0geyAubmFtZSA9ICJ0eF9ieXRlcyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBieXRlcyIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfVFhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGludGVyZmFjZV9zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfaW50ZXJmYWNlX3N0YXRfcnhfcGFja2V0cywgJnByb3BfZGVzY3JfaW50ZXJmYWNlX3N0YXRfcnhfYnl0ZXMsICZwcm9wX2Rlc2NyX2ludGVyZmFjZV9zdGF0X3R4X3BhY2tldHMsICZwcm9wX2Rlc2NyX2ludGVyZmFjZV9zdGF0X3R4X2J5dGVzIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLmRlc2NyID0gIlJlY2lldmVkIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSwgdHhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9ieXRlcyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBpbnRlcmZhY2UgLSBpbmQgKi8KK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfaW50ZXJmYWNlX2luZF9hZG1pbl9zdGF0ZSA9IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9BRE1JTl9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEsIGFkbWluX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfaW50ZXJmYWNlX2luZF9vcGVyX3N0YXR1cyA9IHsgLm5hbWUgPSAib3Blcl9zdGF0dXMiLCAuZGVzY3IgPSAiQ3VycmVudCBvcGVyYXRpb25hbCBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9PUEVSX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEsIG9wZXJfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdHVzIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9pbmRfbWluX2RhdGFfYWdnX3BvcnRfaWQgPSB7IC5uYW1lID0gIm1pbl9kYXRhX2FnZ19wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBtaW5pbXVtIGFnZ19wb3J0X2lkIHRoYXQgaXMgYWxsb3dlZCBpbiB0aGUgc3lzdGVtIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01JTl9EQVRBX0FHR19QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YSwgbWluX2RhdGFfYWdnX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9pbmRfbWluX2RhdGFfc3ZjX3BvcnRfaWQgPSB7IC5uYW1lID0gIm1pbl9kYXRhX3N2Y19wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBtaW5pbXVtIHN2Y19wb3J0X2lkIHRoYXQgaXMgYWxsb3dlZCBpbiB0aGUgc3lzdGVtIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01JTl9EQVRBX1NWQ19QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YSwgbWluX2RhdGFfc3ZjX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9pbmRfdHJhbnNjZWl2ZXJfdHlwZSA9IHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfdHlwZSIsIC5kZXNjciA9ICJUaGUgdHJhbnNjZWl2ZXIgdHlwZSB1c2VkIG9uIGFuIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9UUkFOU0NFSVZFUl9UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YSwgdHJhbnNjZWl2ZXJfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RyeF90eXBlIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9pbmRfZHNfbWlzc19tb2RlID0geyAubmFtZSA9ICJkc19taXNzX21vZGUiLCAuZGVzY3IgPSAiRGVmaW5lcyB0aGUgYWN0aW9uIHRvIHRha2UgZm9yIERTIHVua25vd24gcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19NSVNTX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhLCBkc19taXNzX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9kc19taXNzX21vZGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfaW50ZXJmYWNlX2luZF9tdHUgPSB7IC5uYW1lID0gIm10dSIsIC5kZXNjciA9ICJUaGUgTVRVIGZvciBhbiBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfTVRVLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YSwgbXR1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9pbnRlcmZhY2VfaW5kX2Zsb3dfY29udHJvbCA9IHsgLm5hbWUgPSAiZmxvd19jb250cm9sIiwgLmRlc2NyID0gIkZsb3cgY29udHJvbCBlbmFibGUgb3IgZGlzYWJsZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9GTE9XX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhLCBmbG93X2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9jb250cm9sIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2ludGVyZmFjZV9pbmRfZHNfdG0gPSB7IC5uYW1lID0gImRzX3RtIiwgLmRlc2NyID0gIkRvd25zdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfRFNfVE0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhLCBkc190bSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfaW50ZXJmYWNlX2luZF91c190bSA9IHsgLm5hbWUgPSAidXNfdG0iLCAuZGVzY3IgPSAiVXBzdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfVVNfVE0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhLCB1c190bSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgaW50ZXJmYWNlX2luZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2ludGVyZmFjZV9pbmRfYWRtaW5fc3RhdGUsICZwcm9wX2Rlc2NyX2ludGVyZmFjZV9pbmRfb3Blcl9zdGF0dXMsICZwcm9wX2Rlc2NyX2ludGVyZmFjZV9pbmRfbWluX2RhdGFfYWdnX3BvcnRfaWQsICZwcm9wX2Rlc2NyX2ludGVyZmFjZV9pbmRfbWluX2RhdGFfc3ZjX3BvcnRfaWQsICZwcm9wX2Rlc2NyX2ludGVyZmFjZV9pbmRfdHJhbnNjZWl2ZXJfdHlwZSwgJnByb3BfZGVzY3JfaW50ZXJmYWNlX2luZF9kc19taXNzX21vZGUsICZwcm9wX2Rlc2NyX2ludGVyZmFjZV9pbmRfbXR1LCAmcHJvcF9kZXNjcl9pbnRlcmZhY2VfaW5kX2Zsb3dfY29udHJvbCwgJnByb3BfZGVzY3JfaW50ZXJmYWNlX2luZF9kc190bSwgJnByb3BfZGVzY3JfaW50ZXJmYWNlX2luZF91c190bSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZG1pbl9zdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IGFkbWluaXN0cmF0aXZlIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEsIGFkbWluX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdGUgfSwgeyAubmFtZSA9ICJvcGVyX3N0YXR1cyIsIC5kZXNjciA9ICJDdXJyZW50IG9wZXJhdGlvbmFsIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEsIG9wZXJfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdHVzIH0sIHsgLm5hbWUgPSAibWluX2RhdGFfYWdnX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIG1pbmltdW0gYWdnX3BvcnRfaWQgdGhhdCBpcyBhbGxvd2VkIGluIHRoZSBzeXN0ZW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YSwgbWluX2RhdGFfYWdnX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWluX2RhdGFfc3ZjX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIG1pbmltdW0gc3ZjX3BvcnRfaWQgdGhhdCBpcyBhbGxvd2VkIGluIHRoZSBzeXN0ZW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YSwgbWluX2RhdGFfc3ZjX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfdHlwZSIsIC5kZXNjciA9ICJUaGUgdHJhbnNjZWl2ZXIgdHlwZSB1c2VkIG9uIGFuIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhLCB0cmFuc2NlaXZlcl90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdHJ4X3R5cGUgfSwgeyAubmFtZSA9ICJkc19taXNzX21vZGUiLCAuZGVzY3IgPSAiRGVmaW5lcyB0aGUgYWN0aW9uIHRvIHRha2UgZm9yIERTIHVua25vd24gcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhLCBkc19taXNzX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9kc19taXNzX21vZGUgfSwgeyAubmFtZSA9ICJtdHUiLCAuZGVzY3IgPSAiVGhlIE1UVSBmb3IgYW4gaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEsIG10dSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJmbG93X2NvbnRyb2wiLCAuZGVzY3IgPSAiRmxvdyBjb250cm9sIGVuYWJsZSBvciBkaXNhYmxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEsIGZsb3dfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJkc190bSIsIC5kZXNjciA9ICJEb3duc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEsIGRzX3RtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInVzX3RtIiwgLmRlc2NyID0gIlVwc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEsIHVzX3RtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEgPSB7IC5uYW1lID0gImJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEiLCAuZGVzY3IgPSAiSW50ZXJmYWNlIEluZGljYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBwYWNrZXQgPT09PSAqLworCisvKiBHcm91cDogcGFja2V0IC0gY2ZnICovCitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3BhY2tldF9jZmdfZmxvd19pZCA9IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJOL0EgZm9yIHNlbmRpbmcgYSBwYWNrZXQiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEsIGZsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3BhY2tldF9jZmdfZmxvd190eXBlID0geyAubmFtZSA9ICJmbG93X3R5cGUiLCAuZGVzY3IgPSAiRmxvdyBUeXBlIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0ZMT1dfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEsIGZsb3dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2Zsb3dfdHlwZSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9wYWNrZXRfY2ZnX2ludGZfaWQgPSB7IC5uYW1lID0gImludGZfaWQiLCAuZGVzY3IgPSAiSW50ZXJmYWNlIElEIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0lOVEZfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2NmZ19kYXRhLCBpbnRmX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9wYWNrZXRfY2ZnX2ludGZfdHlwZSA9IHsgLm5hbWUgPSAiaW50Zl90eXBlIiwgLmRlc2NyID0gIkludGVyZmFjZSBUeXBlIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0lOVEZfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEsIGludGZfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX2ludGZfdHlwZSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9wYWNrZXRfY2ZnX3N2Y19wb3J0ID0geyAubmFtZSA9ICJzdmNfcG9ydCIsIC5kZXNjciA9ICJOL0EgZm9yIHNlbmRpbmcgYSBwYWNrZXQiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1BBQ0tFVF9DRkdfSURfU1ZDX1BPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2NmZ19kYXRhLCBzdmNfcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfcGFja2V0X2NmZ19mbG93X2Nvb2tpZSA9IHsgLm5hbWUgPSAiZmxvd19jb29raWUiLCAuZGVzY3IgPSAiTi9BIGZvciBzZW5kaW5nIGEgcGFja2V0IiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0ZMT1dfQ09PS0lFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9jZmdfZGF0YSwgZmxvd19jb29raWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3BhY2tldF9jZmdfcGt0ID0geyAubmFtZSA9ICJwa3QiLCAuZGVzY3IgPSAiUGFja2V0IERhdGEiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1BBQ0tFVF9DRkdfSURfUEtULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9jZmdfZGF0YSwgcGt0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdThfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgcGFja2V0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3BhY2tldF9jZmdfZmxvd19pZCwgJnByb3BfZGVzY3JfcGFja2V0X2NmZ19mbG93X3R5cGUsICZwcm9wX2Rlc2NyX3BhY2tldF9jZmdfaW50Zl9pZCwgJnByb3BfZGVzY3JfcGFja2V0X2NmZ19pbnRmX3R5cGUsICZwcm9wX2Rlc2NyX3BhY2tldF9jZmdfc3ZjX3BvcnQsICZwcm9wX2Rlc2NyX3BhY2tldF9jZmdfZmxvd19jb29raWUsICZwcm9wX2Rlc2NyX3BhY2tldF9jZmdfcGt0IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfcGFja2V0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiTi9BIGZvciBzZW5kaW5nIGEgcGFja2V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEsIGZsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZmxvd190eXBlIiwgLmRlc2NyID0gIkZsb3cgVHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2NmZ19kYXRhLCBmbG93X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9mbG93X3R5cGUgfSwgeyAubmFtZSA9ICJpbnRmX2lkIiwgLmRlc2NyID0gIkludGVyZmFjZSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2NmZ19kYXRhLCBpbnRmX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImludGZfdHlwZSIsIC5kZXNjciA9ICJJbnRlcmZhY2UgVHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2NmZ19kYXRhLCBpbnRmX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9pbnRmX3R5cGUgfSwgeyAubmFtZSA9ICJzdmNfcG9ydCIsIC5kZXNjciA9ICJOL0EgZm9yIHNlbmRpbmcgYSBwYWNrZXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9jZmdfZGF0YSwgc3ZjX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZmxvd19jb29raWUiLCAuZGVzY3IgPSAiTi9BIGZvciBzZW5kaW5nIGEgcGFja2V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEsIGZsb3dfY29va2llKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInBrdCIsIC5kZXNjciA9ICJQYWNrZXQgRGF0YSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2NmZ19kYXRhLCBwa3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF91OF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9wYWNrZXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3BhY2tldF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfcGFja2V0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF9wYWNrZXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogcGFja2V0IC0ga2V5ICovCitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3BhY2tldF9rZXlfcmVzZXJ2ZWQgPSB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIGtleSBmaWVsZCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfUEFDS0VUX0tFWV9JRF9SRVNFUlZFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9wYWNrZXRfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfcGFja2V0X2tleV9wYWNrZXRfc2VuZF9kZXN0ID0geyAubmFtZSA9ICJwYWNrZXRfc2VuZF9kZXN0IiwgLmRlc2NyID0gIlBhY2tldCBkZXN0aW5hdGlvbiIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfUEFDS0VUX0tFWV9JRF9QQUNLRVRfU0VORF9ERVNULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9rZXksIHBhY2tldF9zZW5kX2Rlc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9kZXN0IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHBhY2tldF9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9wYWNrZXRfa2V5X3Jlc2VydmVkLCAmcHJvcF9kZXNjcl9wYWNrZXRfa2V5X3BhY2tldF9zZW5kX2Rlc3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9wYWNrZXRfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIGtleSBmaWVsZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2tleSwgcmVzZXJ2ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicGFja2V0X3NlbmRfZGVzdCIsIC5kZXNjciA9ICJQYWNrZXQgZGVzdGluYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9rZXksIHBhY2tldF9zZW5kX2Rlc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9kZXN0IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3BhY2tldF9rZXkgPSB7IC5uYW1lID0gImJjbWJhbF9wYWNrZXRfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9wYWNrZXRfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9wYWNrZXRfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF9wYWNrZXRfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHBhY2tldCAtIGluZCAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9wYWNrZXRfaW5kX2Zsb3dfaWQgPSB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiTi9BIGZvciBzZW5kaW5nIGEgcGFja2V0IiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0ZMT1dfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2luZF9kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9wYWNrZXRfaW5kX2Zsb3dfdHlwZSA9IHsgLm5hbWUgPSAiZmxvd190eXBlIiwgLmRlc2NyID0gIkZsb3cgVHlwZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2luZF9kYXRhLCBmbG93X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9mbG93X3R5cGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfcGFja2V0X2luZF9pbnRmX2lkID0geyAubmFtZSA9ICJpbnRmX2lkIiwgLmRlc2NyID0gIkludGVyZmFjZSBJRCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfUEFDS0VUX0lORF9JRF9JTlRGX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9pbmRfZGF0YSwgaW50Zl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfcGFja2V0X2luZF9pbnRmX3R5cGUgPSB7IC5uYW1lID0gImludGZfdHlwZSIsIC5kZXNjciA9ICJJbnRlcmZhY2UgVHlwZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfUEFDS0VUX0lORF9JRF9JTlRGX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2luZF9kYXRhLCBpbnRmX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9pbnRmX3R5cGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfcGFja2V0X2luZF9zdmNfcG9ydCA9IHsgLm5hbWUgPSAic3ZjX3BvcnQiLCAuZGVzY3IgPSAiTi9BIGZvciBzZW5kaW5nIGEgcGFja2V0IiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9QQUNLRVRfSU5EX0lEX1NWQ19QT1JULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9pbmRfZGF0YSwgc3ZjX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3BhY2tldF9pbmRfZmxvd19jb29raWUgPSB7IC5uYW1lID0gImZsb3dfY29va2llIiwgLmRlc2NyID0gIk4vQSBmb3Igc2VuZGluZyBhIHBhY2tldCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX0NPT0tJRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9wYWNrZXRfaW5kX2RhdGEsIGZsb3dfY29va2llKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9wYWNrZXRfaW5kX3BrdCA9IHsgLm5hbWUgPSAicGt0IiwgLmRlc2NyID0gIlBhY2tldCBEYXRhIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9QQUNLRVRfSU5EX0lEX1BLVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9wYWNrZXRfaW5kX2RhdGEsIHBrdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHBhY2tldF9pbmRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9wYWNrZXRfaW5kX2Zsb3dfaWQsICZwcm9wX2Rlc2NyX3BhY2tldF9pbmRfZmxvd190eXBlLCAmcHJvcF9kZXNjcl9wYWNrZXRfaW5kX2ludGZfaWQsICZwcm9wX2Rlc2NyX3BhY2tldF9pbmRfaW50Zl90eXBlLCAmcHJvcF9kZXNjcl9wYWNrZXRfaW5kX3N2Y19wb3J0LCAmcHJvcF9kZXNjcl9wYWNrZXRfaW5kX2Zsb3dfY29va2llLCAmcHJvcF9kZXNjcl9wYWNrZXRfaW5kX3BrdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3BhY2tldF9pbmRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIk4vQSBmb3Igc2VuZGluZyBhIHBhY2tldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2luZF9kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImZsb3dfdHlwZSIsIC5kZXNjciA9ICJGbG93IFR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9pbmRfZGF0YSwgZmxvd190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfZmxvd190eXBlIH0sIHsgLm5hbWUgPSAiaW50Zl9pZCIsIC5kZXNjciA9ICJJbnRlcmZhY2UgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9pbmRfZGF0YSwgaW50Zl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJpbnRmX3R5cGUiLCAuZGVzY3IgPSAiSW50ZXJmYWNlIFR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9pbmRfZGF0YSwgaW50Zl90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfaW50Zl90eXBlIH0sIHsgLm5hbWUgPSAic3ZjX3BvcnQiLCAuZGVzY3IgPSAiTi9BIGZvciBzZW5kaW5nIGEgcGFja2V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9wYWNrZXRfaW5kX2RhdGEsIHN2Y19wb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImZsb3dfY29va2llIiwgLmRlc2NyID0gIk4vQSBmb3Igc2VuZGluZyBhIHBhY2tldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2luZF9kYXRhLCBmbG93X2Nvb2tpZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJwa3QiLCAuZGVzY3IgPSAiUGFja2V0IERhdGEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9pbmRfZGF0YSwgcGt0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdThfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfcGFja2V0X2luZF9kYXRhID0geyAubmFtZSA9ICJiY21iYWxfcGFja2V0X2luZF9kYXRhIiwgLmRlc2NyID0gIlBhY2tldCBpbmRpY2F0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3BhY2tldF9pbmRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfcGFja2V0X2luZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF9wYWNrZXRfaW5kX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogc3Vic2NyaWJlcl90ZXJtaW5hbCA9PT09ICovCisKKy8qIEdyb3VwOiBzdWJzY3JpYmVyX3Rlcm1pbmFsIC0ga2V5ICovCitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X3N1Yl90ZXJtX2lkID0geyAubmFtZSA9ICJzdWJfdGVybV9pZCIsIC5kZXNjciA9ICJzdWJfdGVybV9pZCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfU1VCX1RFUk1fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXksIHN1Yl90ZXJtX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9pbnRmX2lkID0geyAubmFtZSA9ICJpbnRmX2lkIiwgLmRlc2NyID0gImludGZfaWQiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfS0VZX0lEX0lOVEZfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXksIGludGZfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHN1YnNjcmliZXJfdGVybWluYWxfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfc3ViX3Rlcm1faWQsICZwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X2ludGZfaWQgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdWJfdGVybV9pZCIsIC5kZXNjciA9ICJzdWJfdGVybV9pZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXksIHN1Yl90ZXJtX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImludGZfaWQiLCAuZGVzY3IgPSAiaW50Zl9pZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXksIGludGZfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5ID0geyAubmFtZSA9ICJiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogc3Vic2NyaWJlcl90ZXJtaW5hbCAtIGNmZyAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19hZG1pbl9zdGF0ZSA9IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAuZGVzY3IgPSAiQWRtaW5pc3RyYXRpdmUgc3RhdGUiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX0FETUlOX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIGFkbWluX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfb3Blcl9zdGF0dXMgPSB7IC5uYW1lID0gIm9wZXJfc3RhdHVzIiwgLmRlc2NyID0gIk9wZXJhdGlvbmFsIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9PUEVSX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhLCBvcGVyX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3N0YXR1cyB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gIlRoZSBzZXJpYWwgbnVtYmVyIG9mIGFuICBJVFUgUE9OIChHUE9OL1hHLVBPTjEvWEdTLVBPTi9ORy1QT04yKSBzdWJzY3JpYmVyIHRlcm1pbmFsIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TRVJJQUxfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX3Bhc3N3b3JkID0geyAubmFtZSA9ICJwYXNzd29yZCIsIC5kZXNjciA9ICJUaGUgcGFzc3dvcmQgb2YgYSBHUE9OIHN1YnNjcmliZXIgdGVybWluYWwiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1BBU1NXT1JELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIHBhc3N3b3JkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfcGFzc3dvcmQgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfcmVnaXN0cmF0aW9uX2lkID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiT05VIHJlZ2lzdHJhdGlvbiBJRCBvZiBhbiAgSVRVIFBPTiAoWEctUE9OMS9YR1MtUE9OL05HLVBPTjIpIHN1YnNjcmliZXIgdGVybWluYWwiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhLCByZWdpc3RyYXRpb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9yZWdpc3RyYXRpb25faWQgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfc3ZjX3BvcnRfaWQgPSB7IC5uYW1lID0gInN2Y19wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBtYW5hZ2VtZW50IHNlcnZpY2UgcG9ydCBJRCAoZm9yIFBPTiwgdGhlIE9OVSBJRCkiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfU1ZDX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YSwgc3ZjX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgRXRoZXJuZXQgTUFDIGFkZHJlc3Mgb2YgYW4gRVBPTiBzdWJzY3JpYmVyIHRlcm1pbmFsIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9NQUNfQUREUkVTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZHNfdG0gPSB7IC5uYW1lID0gImRzX3RtIiwgLmRlc2NyID0gIkRvd25zdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX0RTX1RNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIGRzX3RtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ191c190bSA9IHsgLm5hbWUgPSAidXNfdG0iLCAuZGVzY3IgPSAiVXBzdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1VTX1RNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIHVzX3RtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19zdmNfcG9ydF9pZF9saXN0ID0geyAubmFtZSA9ICJzdmNfcG9ydF9pZF9saXN0IiwgLmRlc2NyID0gIkEgbGlzdCBvZiBiZWFyZXIgdHJhZmZpYyBzdmNfcG9ydF9pZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic2NyaWJlciB0ZXJtaW5hbCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TVkNfUE9SVF9JRF9MSVNULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIHN2Y19wb3J0X2lkX2xpc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91OCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19hZ2dfcG9ydF9pZF9saXN0ID0geyAubmFtZSA9ICJhZ2dfcG9ydF9pZF9saXN0IiwgLmRlc2NyID0gIkEgbGlzdCBvZiBhZ2dyX3BvcnRfaWRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1YnNjcmliZXIgdGVybWluYWwiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfQUdHX1BPUlRfSURfTElTVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhLCBhZ2dfcG9ydF9pZF9saXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHN1YnNjcmliZXJfdGVybWluYWxfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfYWRtaW5fc3RhdGUsICZwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX29wZXJfc3RhdHVzLCAmcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19zZXJpYWxfbnVtYmVyLCAmcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19wYXNzd29yZCwgJnByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfcmVnaXN0cmF0aW9uX2lkLCAmcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19zdmNfcG9ydF9pZCwgJnByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RzX3RtLCAmcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ191c190bSwgJnByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfc3ZjX3BvcnRfaWRfbGlzdCwgJnByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfYWdnX3BvcnRfaWRfbGlzdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAuZGVzY3IgPSAiQWRtaW5pc3RyYXRpdmUgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIGFkbWluX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdGUgfSwgeyAubmFtZSA9ICJvcGVyX3N0YXR1cyIsIC5kZXNjciA9ICJPcGVyYXRpb25hbCBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIG9wZXJfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdHVzIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJUaGUgc2VyaWFsIG51bWJlciBvZiBhbiAgSVRVIFBPTiAoR1BPTi9YRy1QT04xL1hHUy1QT04vTkctUE9OMikgc3Vic2NyaWJlciB0ZXJtaW5hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3NlcmlhbF9udW1iZXIgfSwgeyAubmFtZSA9ICJwYXNzd29yZCIsIC5kZXNjciA9ICJUaGUgcGFzc3dvcmQgb2YgYSBHUE9OIHN1YnNjcmliZXIgdGVybWluYWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIHBhc3N3b3JkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfcGFzc3dvcmQgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiT05VIHJlZ2lzdHJhdGlvbiBJRCBvZiBhbiAgSVRVIFBPTiAoWEctUE9OMS9YR1MtUE9OL05HLVBPTjIpIHN1YnNjcmliZXIgdGVybWluYWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZCB9LCB7IC5uYW1lID0gInN2Y19wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBtYW5hZ2VtZW50IHNlcnZpY2UgcG9ydCBJRCAoZm9yIFBPTiwgdGhlIE9OVSBJRCkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIHN2Y19wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBFdGhlcm5ldCBNQUMgYWRkcmVzcyBvZiBhbiBFUE9OIHN1YnNjcmliZXIgdGVybWluYWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gImRzX3RtIiwgLmRlc2NyID0gIkRvd25zdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEsIGRzX3RtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInVzX3RtIiwgLmRlc2NyID0gIlVwc3RyZWFtIHNjaGVkdWxlciBhbmQgc2hhcGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhLCB1c190bSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzdmNfcG9ydF9pZF9saXN0IiwgLmRlc2NyID0gIkEgbGlzdCBvZiBiZWFyZXIgdHJhZmZpYyBzdmNfcG9ydF9pZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic2NyaWJlciB0ZXJtaW5hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YSwgc3ZjX3BvcnRfaWRfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4IH0sIHsgLm5hbWUgPSAiYWdnX3BvcnRfaWRfbGlzdCIsIC5kZXNjciA9ICJBIGxpc3Qgb2YgYWdncl9wb3J0X2lkcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzY3JpYmVyIHRlcm1pbmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhLCBhZ2dfcG9ydF9pZF9saXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHN1YnNjcmliZXJfdGVybWluYWwgLSBzdGF0ICovCitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9yeF9wYWNrZXRzID0geyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldHMgb24gc3BlY2lmaWVkIG9iamVjdCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1JYX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9yeF9ieXRlcyA9IHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMgb24gc3BlY2lmaWVkIG9iamVjdCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1JYX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhLCByeF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X3R4X3BhY2tldHMgPSB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgcGFja2V0cyBvbiBzcGVjaWZpZWQgb2JqZWN0IiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX1NUQVRfSURfVFhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YSwgdHhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X3R4X2J5dGVzID0geyAubmFtZSA9ICJ0eF9ieXRlcyIsIC5kZXNjciA9ICJUcmFuc21pdHR0ZWQgYnl0ZXMgb24gc3BlY2lmaWVkIG9iamVjdCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1RYX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhLCB0eF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X3J4X3BhY2tldHMsICZwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9yeF9ieXRlcywgJnByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X3R4X3BhY2tldHMsICZwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF90eF9ieXRlcyB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0cyBvbiBzcGVjaWZpZWQgb2JqZWN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBieXRlcyBvbiBzcGVjaWZpZWQgb2JqZWN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBwYWNrZXRzIG9uIHNwZWNpZmllZCBvYmplY3QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2J5dGVzIiwgLmRlc2NyID0gIlRyYW5zbWl0dHRlZCBieXRlcyBvbiBzcGVjaWZpZWQgb2JqZWN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHN1YnNjcmliZXJfdGVybWluYWwgLSBpbmQgKi8KK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfYWRtaW5fc3RhdGUgPSB7IC5uYW1lID0gImFkbWluX3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgYWRtaW5pc3RyYXRpdmUgc3RhdGUiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX0FETUlOX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEsIGFkbWluX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfc3RhdGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfb3Blcl9zdGF0dXMgPSB7IC5uYW1lID0gIm9wZXJfc3RhdHVzIiwgLmRlc2NyID0gIkN1cnJlbnQgb3BlcmF0aW9uYWwgc3RhdHVzIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9PUEVSX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhLCBvcGVyX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3N0YXR1cyB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gIlRoZSBzZXJpYWwgbnVtYmVyIG9mIGFuICBJVFUgUE9OIChHUE9OL1hHLVBPTjEvWEdTLVBPTi9ORy1QT04yKSBzdWJzY3JpYmVyIHRlcm1pbmFsIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9TRVJJQUxfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX3Bhc3N3b3JkID0geyAubmFtZSA9ICJwYXNzd29yZCIsIC5kZXNjciA9ICJUaGUgcGFzc3dvcmQgb2YgYSBHUE9OIHN1YnNjcmliZXIgdGVybWluYWwiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1BBU1NXT1JELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEsIHBhc3N3b3JkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfcGFzc3dvcmQgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfcmVnaXN0cmF0aW9uX2lkID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiT05VIHJlZ2lzdHJhdGlvbiBJRCBvZiBhbiAgSVRVIFBPTiAoWEctUE9OMS9YR1MtUE9OL05HLVBPTjIpIHN1YnNjcmliZXIgdGVybWluYWwiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1JFR0lTVFJBVElPTl9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhLCByZWdpc3RyYXRpb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9yZWdpc3RyYXRpb25faWQgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfc3ZjX3BvcnRfaWQgPSB7IC5uYW1lID0gInN2Y19wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBzZXJ2aWNlIHBvcnQgSUQgKGZvciBQT04sIHRoZSBPTlUgSUQpIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9TVkNfUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhLCBzdmNfcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfbWFjX2FkZHJlc3MgPSB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBFdGhlcm5ldCBNQUMgYWRkcmVzcyBvZiBhbiBlcG9uIHN1YnNjcmliZXIgdGVybWluYWwiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kc190bSA9IHsgLm5hbWUgPSAiZHNfdG0iLCAuZGVzY3IgPSAiRG93bnN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlciIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfRFNfVE0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSwgZHNfdG0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX3VzX3RtID0geyAubmFtZSA9ICJ1c190bSIsIC5kZXNjciA9ICJVcHN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlciIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfVVNfVE0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSwgdXNfdG0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHN1YnNjcmliZXJfdGVybWluYWxfaW5kX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfYWRtaW5fc3RhdGUsICZwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX29wZXJfc3RhdHVzLCAmcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9zZXJpYWxfbnVtYmVyLCAmcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9wYXNzd29yZCwgJnByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfcmVnaXN0cmF0aW9uX2lkLCAmcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9zdmNfcG9ydF9pZCwgJnByb3BfZGVzY3Jfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RzX3RtLCAmcHJvcF9kZXNjcl9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF91c190bSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWRtaW5fc3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSwgYWRtaW5fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zdGF0ZSB9LCB7IC5uYW1lID0gIm9wZXJfc3RhdHVzIiwgLmRlc2NyID0gIkN1cnJlbnQgb3BlcmF0aW9uYWwgc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhLCBvcGVyX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3N0YXR1cyB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAiVGhlIHNlcmlhbCBudW1iZXIgb2YgYW4gIElUVSBQT04gKEdQT04vWEctUE9OMS9YR1MtUE9OL05HLVBPTjIpIHN1YnNjcmliZXIgdGVybWluYWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9zZXJpYWxfbnVtYmVyIH0sIHsgLm5hbWUgPSAicGFzc3dvcmQiLCAuZGVzY3IgPSAiVGhlIHBhc3N3b3JkIG9mIGEgR1BPTiBzdWJzY3JpYmVyIHRlcm1pbmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhLCBwYXNzd29yZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3Bhc3N3b3JkIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLmRlc2NyID0gIk9OVSByZWdpc3RyYXRpb24gSUQgb2YgYW4gIElUVSBQT04gKFhHLVBPTjEvWEdTLVBPTi9ORy1QT04yKSBzdWJzY3JpYmVyIHRlcm1pbmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhLCByZWdpc3RyYXRpb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF9yZWdpc3RyYXRpb25faWQgfSwgeyAubmFtZSA9ICJzdmNfcG9ydF9pZCIsIC5kZXNjciA9ICJUaGUgc2VydmljZSBwb3J0IElEIChmb3IgUE9OLCB0aGUgT05VIElEKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSwgc3ZjX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIEV0aGVybmV0IE1BQyBhZGRyZXNzIG9mIGFuIGVwb24gc3Vic2NyaWJlciB0ZXJtaW5hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAiZHNfdG0iLCAuZGVzY3IgPSAiRG93bnN0cmVhbSBzY2hlZHVsZXIgYW5kIHNoYXBlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSwgZHNfdG0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAidXNfdG0iLCAuZGVzY3IgPSAiVXBzdHJlYW0gc2NoZWR1bGVyIGFuZCBzaGFwZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEsIHVzX3RtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhID0geyAubmFtZSA9ICJiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSIsIC5kZXNjciA9ICJTdWJzY3JpYmVyIFRlcm1pbmFsIEluZGljYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiB0bV9xdWV1ZSA9PT09ICovCisKKy8qIEdyb3VwOiB0bV9xdWV1ZSAtIGtleSAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9xdWV1ZV9rZXlfc2NoZWRfaWQgPSB7IC5uYW1lID0gInNjaGVkX2lkIiwgLmRlc2NyID0gIlNjaGVkdWxlciB0aGF0IG93bnMgdGhlIHF1ZXVlIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfa2V5LCBzY2hlZF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fcXVldWVfa2V5X3NjaGVkX2RpciA9IHsgLm5hbWUgPSAic2NoZWRfZGlyIiwgLmRlc2NyID0gInNjaGVkIGRpciIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX1NDSEVEX0RJUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9rZXksIHNjaGVkX2RpciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX2RpciB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9xdWV1ZV9rZXlfaWQgPSB7IC5uYW1lID0gImlkIiwgLmRlc2NyID0gIlF1ZXVlIGlkIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfa2V5LCBpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB0bV9xdWV1ZV9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl90bV9xdWV1ZV9rZXlfc2NoZWRfaWQsICZwcm9wX2Rlc2NyX3RtX3F1ZXVlX2tleV9zY2hlZF9kaXIsICZwcm9wX2Rlc2NyX3RtX3F1ZXVlX2tleV9pZCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzY2hlZF9pZCIsIC5kZXNjciA9ICJTY2hlZHVsZXIgdGhhdCBvd25zIHRoZSBxdWV1ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfa2V5LCBzY2hlZF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzY2hlZF9kaXIiLCAuZGVzY3IgPSAic2NoZWQgZGlyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9rZXksIHNjaGVkX2RpciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX2RpciB9LCB7IC5uYW1lID0gImlkIiwgLmRlc2NyID0gIlF1ZXVlIGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9rZXksIGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX2tleSA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3F1ZXVlX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9xdWV1ZV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB0bV9xdWV1ZSAtIGNmZyAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9xdWV1ZV9jZmdfcHJpb3JpdHkgPSB7IC5uYW1lID0gInByaW9yaXR5IiwgLmRlc2NyID0gIlNjaGVkdWxpbmcgcHJpb3JpdHkiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9QUklPUklUWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSwgcHJpb3JpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fcXVldWVfY2ZnX3dlaWdodCA9IHsgLm5hbWUgPSAid2VpZ2h0IiwgLmRlc2NyID0gIlNjaGVkdWxpbmcgd2VpZ2h0IiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfV0VJR0hULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhLCB3ZWlnaHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fcXVldWVfY2ZnX3JhdGUgPSB7IC5uYW1lID0gInJhdGUiLCAuZGVzY3IgPSAiUmF0ZSBzaGFwaW5nIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9SQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhLCByYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fc2hhcGluZyB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9xdWV1ZV9jZmdfYmFjID0geyAubmFtZSA9ICJiYWMiLCAuZGVzY3IgPSAiQnVmZmVyIGFkbWlzc2lvbiBjb250cm9sIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfQkFDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhLCBiYWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9iYWMgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fcXVldWVfY2ZnX2NyZWF0aW9uX21vZGUgPSB7IC5uYW1lID0gImNyZWF0aW9uX21vZGUiLCAuZGVzY3IgPSAiQ3JlYXRpb24gbW9kZSIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfQ1JFQVRJT05fTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSwgY3JlYXRpb25fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX2NyZWF0aW9uX21vZGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fcXVldWVfY2ZnX3JlZl9jb3VudCA9IHsgLm5hbWUgPSAicmVmX2NvdW50IiwgLmRlc2NyID0gInJlZmVyZW5jZSBjb3VudCAoZmxvd3MpIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9SRUZfQ09VTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGEsIHJlZl9jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB0bV9xdWV1ZV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl90bV9xdWV1ZV9jZmdfcHJpb3JpdHksICZwcm9wX2Rlc2NyX3RtX3F1ZXVlX2NmZ193ZWlnaHQsICZwcm9wX2Rlc2NyX3RtX3F1ZXVlX2NmZ19yYXRlLCAmcHJvcF9kZXNjcl90bV9xdWV1ZV9jZmdfYmFjLCAmcHJvcF9kZXNjcl90bV9xdWV1ZV9jZmdfY3JlYXRpb25fbW9kZSwgJnByb3BfZGVzY3JfdG1fcXVldWVfY2ZnX3JlZl9jb3VudCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInByaW9yaXR5IiwgLmRlc2NyID0gIlNjaGVkdWxpbmcgcHJpb3JpdHkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhLCBwcmlvcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIndlaWdodCIsIC5kZXNjciA9ICJTY2hlZHVsaW5nIHdlaWdodCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGEsIHdlaWdodCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJhdGUiLCAuZGVzY3IgPSAiUmF0ZSBzaGFwaW5nIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhLCByYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fc2hhcGluZyB9LCB7IC5uYW1lID0gImJhYyIsIC5kZXNjciA9ICJCdWZmZXIgYWRtaXNzaW9uIGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhLCBiYWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9iYWMgfSwgeyAubmFtZSA9ICJjcmVhdGlvbl9tb2RlIiwgLmRlc2NyID0gIkNyZWF0aW9uIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhLCBjcmVhdGlvbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fY3JlYXRpb25fbW9kZSB9LCB7IC5uYW1lID0gInJlZl9jb3VudCIsIC5kZXNjciA9ICJyZWZlcmVuY2UgY291bnQgKGZsb3dzKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGEsIHJlZl9jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21iYWxfdG1fcXVldWVfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHRtX3F1ZXVlIC0gc3RhdCAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9xdWV1ZV9zdGF0X3BhY2tldHNfb2sgPSB7IC5uYW1lID0gInBhY2tldHNfb2siLCAuZGVzY3IgPSAiUGFja2V0cyB0cmFuc21pdHRlZCBzdWNjZXdzc2Z1bGx5IiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9UTV9RVUVVRV9TVEFUX0lEX1BBQ0tFVFNfT0ssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhLCBwYWNrZXRzX29rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9xdWV1ZV9zdGF0X2J5dGVzX29rID0geyAubmFtZSA9ICJieXRlc19vayIsIC5kZXNjciA9ICJCeXRlcyB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfQllURVNfT0ssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhLCBieXRlc19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fcXVldWVfc3RhdF9wYWNrZXRzX2Rpc2NhcmRlZCA9IHsgLm5hbWUgPSAicGFja2V0c19kaXNjYXJkZWQiLCAuZGVzY3IgPSAiUGFja2V0cyBkaXNjYXJkZWQiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfUEFDS0VUU19ESVNDQVJERUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhLCBwYWNrZXRzX2Rpc2NhcmRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fcXVldWVfc3RhdF9ieXRlc19kaXNjYXJkZWQgPSB7IC5uYW1lID0gImJ5dGVzX2Rpc2NhcmRlZCIsIC5kZXNjciA9ICJCeXRlcyBkaXNjYXJkZWQiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfQllURVNfRElTQ0FSREVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YSwgYnl0ZXNfZGlzY2FyZGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB0bV9xdWV1ZV9zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfdG1fcXVldWVfc3RhdF9wYWNrZXRzX29rLCAmcHJvcF9kZXNjcl90bV9xdWV1ZV9zdGF0X2J5dGVzX29rLCAmcHJvcF9kZXNjcl90bV9xdWV1ZV9zdGF0X3BhY2tldHNfZGlzY2FyZGVkLCAmcHJvcF9kZXNjcl90bV9xdWV1ZV9zdGF0X2J5dGVzX2Rpc2NhcmRlZCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwYWNrZXRzX29rIiwgLmRlc2NyID0gIlBhY2tldHMgdHJhbnNtaXR0ZWQgc3VjY2V3c3NmdWxseSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhLCBwYWNrZXRzX29rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJ5dGVzX29rIiwgLmRlc2NyID0gIkJ5dGVzIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhLCBieXRlc19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJwYWNrZXRzX2Rpc2NhcmRlZCIsIC5kZXNjciA9ICJQYWNrZXRzIGRpc2NhcmRlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhLCBwYWNrZXRzX2Rpc2NhcmRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJieXRlc19kaXNjYXJkZWQiLCAuZGVzY3IgPSAiQnl0ZXMgZGlzY2FyZGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGEsIGJ5dGVzX2Rpc2NhcmRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB0bV9xdWV1ZSAtIGluZCAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9xdWV1ZV9pbmRfcmV0ID0geyAubmFtZSA9ICJyZXQiLCAuZGVzY3IgPSAicmV0IiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9UTV9RVUVVRV9JTkRfSURfUkVULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhLCByZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHRtX3F1ZXVlX2luZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3RtX3F1ZXVlX2luZF9yZXQgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXQiLCAuZGVzY3IgPSAicmV0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSwgcmV0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhIiwgLmRlc2NyID0gIlRtIFF1ZXVlIEluZGljYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfaW5kX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiB0bV9zY2hlZCA9PT09ICovCisKKy8qIEdyb3VwOiB0bV9zY2hlZCAtIGtleSAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9zY2hlZF9rZXlfZGlyID0geyAubmFtZSA9ICJkaXIiLCAuZGVzY3IgPSAiVHJhZmZpYyBkaXJlY3Rpb24iLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9ESVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfa2V5LCBkaXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9kaXIgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fc2NoZWRfa2V5X2lkID0geyAubmFtZSA9ICJpZCIsIC5kZXNjciA9ICJJRCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfVE1fU0NIRURfS0VZX0lEX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX2tleSwgaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHRtX3NjaGVkX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3RtX3NjaGVkX2tleV9kaXIsICZwcm9wX2Rlc2NyX3RtX3NjaGVkX2tleV9pZCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkaXIiLCAuZGVzY3IgPSAiVHJhZmZpYyBkaXJlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX2tleSwgZGlyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfZGlyIH0sIHsgLm5hbWUgPSAiaWQiLCAuZGVzY3IgPSAiSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX2tleSwgaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX2tleSA9IHsgLm5hbWUgPSAiYmNtYmFsX3RtX3NjaGVkX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fc2NoZWRfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9rZXlfZmllbGRzKSAvIHNpemVvZihiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB0bV9zY2hlZCAtIGNmZyAqLworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9zY2hlZF9jZmdfb3duZXIgPSB7IC5uYW1lID0gIm93bmVyIiwgLmRlc2NyID0gIm93bmVyIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfT1dORVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEsIG93bmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfb3duZXIgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fc2NoZWRfY2ZnX3NjaGVkX3R5cGUgPSB7IC5uYW1lID0gInNjaGVkX3R5cGUiLCAuZGVzY3IgPSAiU2NoZWR1bGVyIHR5cGUiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhLCBzY2hlZF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfdHlwZSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9zY2hlZF9jZmdfc2NoZWRfcGFyZW50ID0geyAubmFtZSA9ICJzY2hlZF9wYXJlbnQiLCAuZGVzY3IgPSAiU2NoZWR1bGluZyBwYXJhbWV0ZXJzIGZvciBwYXJlbnQgc2NoZWR1bGVyIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU0NIRURfUEFSRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhLCBzY2hlZF9wYXJlbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9wYXJlbnQgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fc2NoZWRfY2ZnX3NjaGVkX2NoaWxkX3R5cGUgPSB7IC5uYW1lID0gInNjaGVkX2NoaWxkX3R5cGUiLCAuZGVzY3IgPSAiU2NoZWR1bGluZyBsZXZlbCBmb3IgY2hpbGRyZW4gdG0gIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU0NIRURfQ0hJTERfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSwgc2NoZWRfY2hpbGRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGUgfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fc2NoZWRfY2ZnX3JhdGUgPSB7IC5uYW1lID0gInJhdGUiLCAuZGVzY3IgPSAiUmF0ZSBzaGFwaW5nIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9SQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhLCByYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fc2hhcGluZyB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9zY2hlZF9jZmdfdGNvbnRfc2xhID0geyAubmFtZSA9ICJ0Y29udF9zbGEiLCAuZGVzY3IgPSAiQWRkaXRpb25hbCBTTEEgcGFyYW1ldGVycyBmb3IgYWdnX3BvcnQgb3duZXIiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9UQ09OVF9TTEEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEsIHRjb250X3NsYSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3Rjb250X3NsYSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9zY2hlZF9jZmdfY3JlYXRpb25fbW9kZSA9IHsgLm5hbWUgPSAiY3JlYXRpb25fbW9kZSIsIC5kZXNjciA9ICJDcmVhdGlvbiBtb2RlIiwgLmFjY2VzcyA9IEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9DUkVBVElPTl9NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhLCBjcmVhdGlvbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fY3JlYXRpb25fbW9kZSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9zY2hlZF9jZmdfcXVldWVzID0geyAubmFtZSA9ICJxdWV1ZXMiLCAuZGVzY3IgPSAiU3Vic2lkaWFyeSBxdWV1ZXMiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1FVRVVFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSwgcXVldWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90bV9zY2hlZF9jZmdfc3ViX3NjaGVkcyA9IHsgLm5hbWUgPSAic3ViX3NjaGVkcyIsIC5kZXNjciA9ICJTdWJzaWRpYXJ5IHNjaGVkdWxlcnMiLCAuYWNjZXNzID0gQkNNQkFMX0FQSUNMSV9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NVQl9TQ0hFRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEsIHN1Yl9zY2hlZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RtX3NjaGVkX2NmZ19udW1fcHJpb3JpdGllcyA9IHsgLm5hbWUgPSAibnVtX3ByaW9yaXRpZXMiLCAuZGVzY3IgPSAiTWF4IG51bWJlciBvZiBzdHJpY3QgcHJpb3JpdHkgc2NoZWR1bGluZyBlbGVtZW50cyIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX05VTV9QUklPUklUSUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhLCBudW1fcHJpb3JpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB0bV9zY2hlZF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl90bV9zY2hlZF9jZmdfb3duZXIsICZwcm9wX2Rlc2NyX3RtX3NjaGVkX2NmZ19zY2hlZF90eXBlLCAmcHJvcF9kZXNjcl90bV9zY2hlZF9jZmdfc2NoZWRfcGFyZW50LCAmcHJvcF9kZXNjcl90bV9zY2hlZF9jZmdfc2NoZWRfY2hpbGRfdHlwZSwgJnByb3BfZGVzY3JfdG1fc2NoZWRfY2ZnX3JhdGUsICZwcm9wX2Rlc2NyX3RtX3NjaGVkX2NmZ190Y29udF9zbGEsICZwcm9wX2Rlc2NyX3RtX3NjaGVkX2NmZ19jcmVhdGlvbl9tb2RlLCAmcHJvcF9kZXNjcl90bV9zY2hlZF9jZmdfcXVldWVzLCAmcHJvcF9kZXNjcl90bV9zY2hlZF9jZmdfc3ViX3NjaGVkcywgJnByb3BfZGVzY3JfdG1fc2NoZWRfY2ZnX251bV9wcmlvcml0aWVzIH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib3duZXIiLCAuZGVzY3IgPSAib3duZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhLCBvd25lciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX293bmVyIH0sIHsgLm5hbWUgPSAic2NoZWRfdHlwZSIsIC5kZXNjciA9ICJTY2hlZHVsZXIgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEsIHNjaGVkX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF90eXBlIH0sIHsgLm5hbWUgPSAic2NoZWRfcGFyZW50IiwgLmRlc2NyID0gIlNjaGVkdWxpbmcgcGFyYW1ldGVycyBmb3IgcGFyZW50IHNjaGVkdWxlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEsIHNjaGVkX3BhcmVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX3BhcmVudCB9LCB7IC5uYW1lID0gInNjaGVkX2NoaWxkX3R5cGUiLCAuZGVzY3IgPSAiU2NoZWR1bGluZyBsZXZlbCBmb3IgY2hpbGRyZW4gdG0gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSwgc2NoZWRfY2hpbGRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGUgfSwgeyAubmFtZSA9ICJyYXRlIiwgLmRlc2NyID0gIlJhdGUgc2hhcGluZyBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSwgcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3NoYXBpbmcgfSwgeyAubmFtZSA9ICJ0Y29udF9zbGEiLCAuZGVzY3IgPSAiQWRkaXRpb25hbCBTTEEgcGFyYW1ldGVycyBmb3IgYWdnX3BvcnQgb3duZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhLCB0Y29udF9zbGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV90Y29udF9zbGEgfSwgeyAubmFtZSA9ICJjcmVhdGlvbl9tb2RlIiwgLmRlc2NyID0gIkNyZWF0aW9uIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhLCBjcmVhdGlvbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21iYWxfdG1fY3JlYXRpb25fbW9kZSB9LCB7IC5uYW1lID0gInF1ZXVlcyIsIC5kZXNjciA9ICJTdWJzaWRpYXJ5IHF1ZXVlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEsIHF1ZXVlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdTggfSwgeyAubmFtZSA9ICJzdWJfc2NoZWRzIiwgLmRlc2NyID0gIlN1YnNpZGlhcnkgc2NoZWR1bGVycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEsIHN1Yl9zY2hlZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4IH0sIHsgLm5hbWUgPSAibnVtX3ByaW9yaXRpZXMiLCAuZGVzY3IgPSAiTWF4IG51bWJlciBvZiBzdHJpY3QgcHJpb3JpdHkgc2NoZWR1bGluZyBlbGVtZW50cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEsIG51bV9wcmlvcml0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogdG1fc2NoZWQgLSBpbmQgKi8KK3N0YXRpYyBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdG1fc2NoZWRfaW5kX3JldCA9IHsgLm5hbWUgPSAicmV0IiwgLmRlc2NyID0gInJldCIsIC5hY2Nlc3MgPSBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01CQUxfVE1fU0NIRURfSU5EX0lEX1JFVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSwgcmV0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB0bV9zY2hlZF9pbmRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl90bV9zY2hlZF9pbmRfcmV0IH07CitzdGF0aWMgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfaW5kX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmV0IiwgLmRlc2NyID0gInJldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfaW5kX2RhdGEsIHJldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfaW5kX2RhdGEgPSB7IC5uYW1lID0gImJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSIsIC5kZXNjciA9ICJUbSBTY2hlZCBJbmRpY2F0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbWJhbF90bV9zY2hlZF9pbmRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21iYWxfdG1fc2NoZWRfaW5kX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IEFQSSBIZWxwZXIgRnVuY3Rpb24gSW1wbGVtZW50YXRpb25zID09PT0gKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfb2JqZWN0X3N0cnVjdF9zaXplKGJjbWJhbF9vYmpfaWQgb2JqLCBiY21iYWxfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgdWludDMyX3QgKmtleV9zaXplLCB1aW50MzJfdCAqa2V5X29mZnNldCwgdWludDMyX3QgKmRhdGFfc2l6ZSwgdWludDMyX3QgKmRhdGFfb2Zmc2V0KQoreworICAgIGlmICgoKGtleV9zaXplID09IE5VTEwpIHx8IChrZXlfb2Zmc2V0ID09IE5VTEwpKSB8fCAoKGRhdGFfc2l6ZSA9PSBOVUxMKSB8fCAoZGF0YV9vZmZzZXQgPT0gTlVMTCkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgc3dpdGNoIChvYmopCisgICAgeworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfQUNDRVNTX1RFUk1JTkFMOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0FVVE9fSURfSU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbWJhbF9mbG93X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtYmFsX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21iYWxfZmxvd19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21iYWxfZmxvd19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbWJhbF9mbG93X3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19BVVRPX0lEX0lORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtYmFsX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9mbG93X2luZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbWJhbF9mbG93X2luZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfZmxvd19pbmQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX0dST1VQOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbWJhbF9ncm91cF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbWJhbF9ncm91cF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbWJhbF9ncm91cF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2dyb3VwX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbWJhbF9ncm91cF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2dyb3VwX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfSU5URVJGQUNFOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbWJhbF9pbnRlcmZhY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfaW50ZXJmYWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtYmFsX2ludGVyZmFjZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21iYWxfaW50ZXJmYWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9JTlRFUkZBQ0VfQVVUT19JRF9JTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbWJhbF9pbnRlcmZhY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9pbnRlcmZhY2VfaW5kLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9pbmQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX1BBQ0tFVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21iYWxfcGFja2V0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtYmFsX3BhY2tldF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbWJhbF9wYWNrZXRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9wYWNrZXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtYmFsX3BhY2tldF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BBQ0tFVF9BVVRPX0lEX0lORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtYmFsX3BhY2tldF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3BhY2tldF9pbmQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfcGFja2V0X2luZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfcGFja2V0X2luZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQVVUT19JRF9JTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9UTV9RVUVVRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtYmFsX3RtX3F1ZXVlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9RVUVVRV9BVVRPX0lEX0lORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtYmFsX3RtX3F1ZXVlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfaW5kLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21iYWxfdG1fcXVldWVfaW5kLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9UTV9TQ0hFRDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fc2NoZWRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fc2NoZWRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fc2NoZWRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX0FVVE9fSURfSU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fc2NoZWRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9pbmQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21iYWxfdG1fc2NoZWRfaW5kX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9pbmQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOyAgICAvKio8ICBzaG91bGQgbmV2ZXIgaGFwcGVuLiAqLworfQorCitiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX29iamVjdF9zdWJncm91cF9uYW1lKGJjbWJhbF9vYmpfaWQgb2JqLCBiY21iYWxfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgY29uc3QgY2hhciAqKm5hbWUsIGNvbnN0IGNoYXIgKipkZXNjcikKK3sKKyAgICBzd2l0Y2ggKG9iaikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9BQ0NFU1NfVEVSTUlOQUw6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0FVVE9fSURfSU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbmQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFjY2VzcyBUZXJtaW5hbCBJbmRpY2F0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19BVVRPX0lEX0lORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiaW5kIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGbG93IEluZGljYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX0dST1VQOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX0lOVEVSRkFDRV9BVVRPX0lEX0lORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiaW5kIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbnRlcmZhY2UgSW5kaWNhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfUEFDS0VUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1BBQ0tFVF9BVVRPX0lEX0lORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiaW5kIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQYWNrZXQgaW5kaWNhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQVVUT19JRF9JTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImluZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3Vic2NyaWJlciBUZXJtaW5hbCBJbmRpY2F0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9UTV9RVUVVRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1FVRVVFX0FVVE9fSURfSU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbmQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRtIFF1ZXVlIEluZGljYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX1RNX1NDSEVEOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX0FVVE9fSURfSU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbmQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRtIFNjaGVkIEluZGljYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOyAgICAvKio8ICBzaG91bGQgbmV2ZXIgaGFwcGVuLiAqLworfQorCitzdGF0aWMgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICoqb2JqX2dldF9wcm9wX2FycmF5KGJjbWJhbF9vYmpfaWQgb2JqLCBiY21iYWxfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgdWludDMyX3QgKnNpemUpCit7CisgICAgc3dpdGNoIChvYmopCisgICAgeworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfQUNDRVNTX1RFUk1JTkFMOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWNjZXNzX3Rlcm1pbmFsX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc190ZXJtaW5hbF9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhY2Nlc3NfdGVybWluYWxfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzX3Rlcm1pbmFsX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9BVVRPX0lEX0lORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhY2Nlc3NfdGVybWluYWxfaW5kX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzX3Rlcm1pbmFsX2luZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihmbG93X2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsb3dfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZmxvd19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG93X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihmbG93X3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG93X3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9GTE9XX0FVVE9fSURfSU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGZsb3dfaW5kX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxvd19pbmRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9HUk9VUDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdyb3VwX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdyb3VwX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGludGVyZmFjZV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2Vfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoaW50ZXJmYWNlX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoaW50ZXJmYWNlX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2Vfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX0lOVEVSRkFDRV9BVVRPX0lEX0lORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihpbnRlcmZhY2VfaW5kX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2luZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01CQUxfT0JKX0lEX1BBQ0tFVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHBhY2tldF9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWNrZXRfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YocGFja2V0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9QQUNLRVRfQVVUT19JRF9JTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YocGFja2V0X2luZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldF9pbmRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2Yoc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHN1YnNjcmliZXJfdGVybWluYWxfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2Yoc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9BVVRPX0lEX0lORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihzdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXJfdGVybWluYWxfaW5kX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTUJBTF9PQkpfSURfVE1fUVVFVUU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih0bV9xdWV1ZV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bV9xdWV1ZV9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih0bV9xdWV1ZV9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bV9xdWV1ZV9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YodG1fcXVldWVfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtX3F1ZXVlX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9RVUVVRV9BVVRPX0lEX0lORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih0bV9xdWV1ZV9pbmRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bV9xdWV1ZV9pbmRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNQkFMX09CSl9JRF9UTV9TQ0hFRDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHRtX3NjaGVkX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtX3NjaGVkX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHRtX3NjaGVkX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtX3NjaGVkX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX0FVVE9fSURfSU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHRtX3NjaGVkX2luZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtX3NjaGVkX2luZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX29iamVjdF9uYW1lKGJjbWJhbF9vYmpfaWQgb2JqLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmRlc2NyKQoreworICAgIGlmIChvYmogPj0gQkNNQkFMX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgaWYgKG9iamVjdF9uYW1lW29ial0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKworICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgICAqbmFtZSA9IG9iamVjdF9uYW1lW29ial07CisgICAgfQorCisgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgeworICAgICAgICAqZGVzY3IgPSBvYmplY3RfZGVzY3Jbb2JqXTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtYmFsX2FwaWNsaV9vYmplY3RfcHJvcGVydHkoYmNtYmFsX29ial9pZCBvYmosIGJjbWJhbF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCB1aW50MTZfdCBwcm9wLCBjb25zdCBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKipkZXNjcikKK3sKKyAgICBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKipwcm9wX2FycmF5ID0gTlVMTDsKKyAgICB1aW50MzJfdCBwcm9wX2FycmF5X3NpemUgPSAwOworICAgIGlmIChkZXNjciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBwcm9wX2FycmF5ID0gb2JqX2dldF9wcm9wX2FycmF5KG9iaiwgZ3JvdXAsIHN1Ymdyb3VwLCAmcHJvcF9hcnJheV9zaXplKTsKKyAgICBpZiAoKHByb3BfYXJyYXkgPT0gTlVMTCkgfHwgKHByb3AgPj0gcHJvcF9hcnJheV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIGlmIChwcm9wX2FycmF5W3Byb3BdID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICB9CisKKyAgICAqZGVzY3IgPSBwcm9wX2FycmF5W3Byb3BdOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGlfaGVscGVycy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGlfaGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZTkyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaWNsaS9iYWxfYXBpX2NsaV9oZWxwZXJzLmgKQEAgLTAsMCArMSwyMjEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisjaWZuZGVmIEJDTUJBTF9BUElDTElfSEVMUEVSU19IXworI2RlZmluZSBCQ01CQUxfQVBJQ0xJX0hFTFBFUlNfSF8KKworI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJhbF9hcGkuaD4KKyNpbmNsdWRlICJiYWxfYXBpX2NsaV90eXBlcy5oIgorCisvKiBNYWMgbmFtZSBsZW5ndGggKi8KKyNkZWZpbmUgQkNNQkFMX0FQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSCAgQkNNQ0xJX01BWF9TRUFSQ0hfU1VCU1RSX0xFTkdUSAorCisvKiBNYXggaGVscCBzdHJpbmcgbGVuZ3RoICovCisjZGVmaW5lIEJDTUJBTF9BUElDTElfTUFYX1BBUk1fSEVMUF9MRU5HVEggIDEyOAorCit0eXBlZGVmIGVudW0gYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjcl9mbGFncworeworICAgIEJDTUJBTF9BUElDTElfRklFTERfREVTQ1JfRkxBR1NfTk9ORSAgICAgICAgICAgID0gMCwKKyAgICBCQ01CQUxfQVBJQ0xJX0ZJRUxEX0RFU0NSX0ZMQUdTX1BSRVNFTkNFX01BU0sgICA9ICgxIDw8IDApICAvKiBmaWVsZCBpcyBhICdwcmVzZW5jZSBtYXNrJyBmb3IgYSBzdHJ1Y3R1cmUgKi8KK30gYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjcl9mbGFnczsKKwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjcjsKKworLyogU3RydWN0dXJlIGZpZWxkIGRlc2NyaXB0b3IgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgIC8qIEZpZWxkIG5hbWUgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcjsgICAgICAgICAgICAgIC8qIEZpZWxkIGRlc2NyaXB0aW9uICovCisgICAgY29uc3QgY2hhciAqY2xpX25hbWU7ICAgICAgICAgICAvKiBTaG9ydCBDTEkgbmFtZS4gY2FuIGJlIG1pc3NpbmcgKi8KKyAgICBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IgKnR5cGU7IC8qIEZpZWxkIHR5cGUgKi8KKyAgICB1aW50MTZfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIE9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHR5cGUgc3RydWN0dXJlICovCisgICAgYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjcl9mbGFncyBmbGFnczsKK30gYmNtYmFsX2FwaWNsaV9maWVsZF9kZXNjcjsKKworLyogRGF0YSB0eXBlIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBiY21iYWxfYXBpY2xpX3R5cGVfZGVzY3IKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBuYW1lICovCisgICAgY29uc3QgY2hhciAqZGVzY3I7ICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVzY3JpcHRpb24uIGNhbiBiZSBtaXNzaW5nICovCisgICAgY29uc3QgY2hhciAqY2xpX25hbWU7ICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IENMSSBuYW1lLiBjYW4gYmUgbWlzc2luZyAqLworICAgIGJjbWJhbF9hcGljbGlfYmFzZV90eXBlX2lkIGJhc2VfdHlwZTsgICAvKiBCYXNlIHR5cGU6IHNudW0sIHVudW0sIHN0cmluZywgaXAsIGVudW0sIGV0Yy4gKi8KKyAgICB1aW50MzJfdCBtaW5fdmFsOyAgICAgICAgICAgICAgICAgICAgICAgLyogTWluIHZhbHVlIGZvciByYW5nZSBjaGVjayAqLworICAgIHVpbnQzMl90IG1heF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXggdmFsdWUgZm9yIHJhbmdlIGNoZWNrICovCisgICAgdWludDE2X3Qgc2l6ZTsgICAgICAgICAgICAgICAgICAvKiBTaXplICovCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIHVuaW9uIGlzIHF1YWxpZmllZCBieSB0aGUgYmFzZV90eXBlIGFuZCBjb250YWlucyBhZGRpdGlvbmFsCisgICAgICogaW5mbyBmb3IgYXJyYXksIGVudW0sIHN0cnVjdCwgdW5pb24gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgYmNtY2xpX2VudW1fdmFsICplOyAgICAgICAgIC8qIGVudW0gdmFsdWUgYXJyYXkgQ29udGFpbnMgbnVtX2VsZW1lbnRzKzEgdmFsdWVzLiBUaGUgbGFzdCB2YWx1ZSBoYXMgbmFtZT1OVUxMICovCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBudW1fZmllbGRzOyAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgKmZpZWxkczsgICAgICAgICAgLyogU3RydWN0dXJlIGZpZWxkIGFycmF5LiBDb250YWlucyBudW1fZWxlbWVudHMgdmFsdWVzICovCisgICAgICAgIH0gczsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG51bV9jb21tb25fZmllbGRzOyAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5vbi11bmlvbiBmaWVsZHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJ1Y3QgKi8KKyAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IgKmNvbW1vbl9maWVsZHM7ICAgLyogY29tbW9uIGZpZWxkIGFycmF5LiBDb250YWlucyBudW1fZWxlbWVudHMgdmFsdWVzICovCisgICAgICAgICAgICB1aW50MTZfdCBjbGFzc2lmaWVyX2lkeDsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIHRoZSBjbGFzc2lmaWVyIGZpZWxkIHdpdGhpbiBjb21tb25fZmllbGRzICovCisgICAgICAgICAgICBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyICp1bmlvbl9maWVsZHM7ICAgIC8qIHN1Yi1zdHJ1Y3QgZmllbGRzIHVuZGVyIHRoZSB1bmlvbiAobmFtZSA9PSBOVUxMIGlmIG5vIGZpZWxkcyBwcmVzZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uZSBwZXIgZW51bSBlbnRyeSBpbiB0aGUgY2xhc3NpZmllciB0eXBlLCBwbHVzIG9uZSBmb3IgZGVmYXVsdCkgKi8KKyAgICAgICAgfSB1OworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyICplbGVtX3R5cGU7ICAgICAgICAvKiBBcnJheSBlbGVtZW50IHR5cGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbGVuX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBCeXRlIHdpZHRoIG9mIGFycmF5IGxlbmd0aCBmaWVsZCAoYXQgc3RhcnQgb2Ygc3RydWN0KSAqLworICAgICAgICAgICAgdWludDE2X3QgbWF4X3NpemU7ICAgICAgICAgICAgICAgICAgICAgIC8qIE1heCBhcnJheSBzaXplICovCisgICAgICAgIH0gYXJyX2R5bjsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWJhbF9hcGljbGlfdHlwZV9kZXNjciAqZWxlbV90eXBlOyAgICAvKiBBcnJheSBlbGVtZW50IHR5cGUgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHNpemU7ICAvKiBGaXhlZCBhcnJheSBzaXplICovCisgICAgICAgIH0gYXJyX2ZpeGVkOworICAgIH0geDsKK307CisKKy8qIFByb3BlcnR5IGRlc2NyaXB0b3IuCisgKiBUaGUgMXN0IDUgZmllbGRzIGFyZSBleGFjdGx5IHRoZSBzYW1lIGFzIGluIGJjbWJhbF9hcGljbGlfZmllbGRfZGVzY3IKKyAqIFRvRG86IHJlcGxhY2Ugd2l0aCBiY21iYWxfYXBpY2xpX2ZpZWxkX2Rlc2NyIHN1YnN0cnVjdHVyZS4KKyAqIFJlcXVpcmVzIGNoYW5nZXMgaW4gY29kZSBnZW5lcmF0b3IKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgLyogQyBuYW1lICovCisgICAgY29uc3QgY2hhciAqZGVzY3I7ICAgICAgICAgICAgICAgICAgICAgIC8qIFByb3BlcnR5IGRlc2NyaXB0aW9uICovCisgICAgY29uc3QgY2hhciAqY2xpX25hbWU7ICAgICAgICAgICAgICAgICAgIC8qIENMSSBuYW1lICovCisgICAgYmNtYmFsX2FwaWNsaV90eXBlX2Rlc2NyICp0eXBlOyAgICAgICAgIC8qIFR5cGUgcmVmZXJlbmNlICovCisgICAgdWludDE2X3Qgb2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9mZnNldCBpbiBnZW5lcmF0ZWQgcGVyLWdyb3VwIHN0cnVjdHVyZSAqLworICAgIHVpbnQxNl90IHByb3BlcnR5OyAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9wZXJ0eSBpZCBpbiBwZXItb2JqZWN0IG1hbmFnZW1lbnQgZ3JvdXAgKi8KKyAgICBiY21iYWxfYXBpY2xpX3Byb3BfYWNjZXNzX2lkIGFjY2VzczsgICAgLyogQWNjZXNzICovCit9IGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjcjsKKworLyogQWxsIEFQSXMgcmV0dXJuCisgKiBCQ01fRVJSX09LIC0gb2sKKyAqIEJDTV9FUlJfTk9FTlQgLSBpZiBpZCBpcyBpbiByYW5nZSwgYnV0IGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhbnkgdmFsdWUgKGEgaG9sZSkKKyAqIEJDTV9FUlJfUkFOR0UgLSBpZCBpcyBvdXQgb2YgcmFuZ2UKKyAqLworCisvKiBHZXQgb2JqZWN0IG5hbWUgYnkgaWQgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfb2JqZWN0X25hbWUoYmNtYmFsX29ial9pZCBvYmosIGNvbnN0IGNoYXIgKipuYW1lLCBjb25zdCBjaGFyICoqZGVzY3IpOworCisvKiBHZXQgb2JqZWN0IHN0cnVjdHVyZSBzaXplICovCitiY21vc19lcnJubyBiY21iYWxfYXBpY2xpX29iamVjdF9zdHJ1Y3Rfc2l6ZShiY21iYWxfb2JqX2lkIG9iaiwgYmNtYmFsX21ndF9ncm91cCBncm91cCwgdWludDE2X3Qgc3ViZ3JvdXAsIHVpbnQzMl90ICprZXlfc2l6ZSwgdWludDMyX3QgKmtleV9vZmZzZXQsIHVpbnQzMl90ICpkYXRhX3NpemUsIHVpbnQzMl90ICpkYXRhX29mZnNldCk7CisKKy8qIEdldCBvYmplY3Qgc3ViZ3JvdXAgKGUuZy4gc3BlY2lmaWMgaW5kaWNhdGlvbikgbmFtZSBhbmQgZGVzY3JpcHRpb24gKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfb2JqZWN0X3N1Ymdyb3VwX25hbWUoYmNtYmFsX29ial9pZCBvYmosIGJjbWJhbF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmRlc2NyKTsKKworLyogR2V0IHByb3BlcnR5IGJ5IG9iamVjdCwgbWd0X2dyb3VwLCBzdWJncm91cCAoZS5nLiBzcGVjaWZpYyBpbmRpY2F0aW9uKSwgcHJvcGVydHlfaWQgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfb2JqZWN0X3Byb3BlcnR5KGJjbWJhbF9vYmpfaWQgb2JqLCBiY21iYWxfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgdWludDE2X3QgcHJvcCwgY29uc3QgYmNtYmFsX2FwaWNsaV9wcm9wX2Rlc2NyICoqZGVzY3IpOworCisvKiBHZXQgdGhlIG51bWJlciBvZiBzdWJncm91cHMgcHJlc2VudCBmb3IgYSBnaXZlbiBncm91cCAqLworc3RhdGljIGlubGluZSB1aW50MTZfdCBiY21iYWxfYXBpY2xpX2dldF9zdWJncm91cF9jb3VudChiY21iYWxfb2JqX2lkIG9iaiwgYmNtYmFsX21ndF9ncm91cCBncm91cCkKK3sKKyAgICB1aW50MTZfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXk7CisgICAgd2hpbGUgKGJjbWJhbF9hcGljbGlfb2JqZWN0X3N0cnVjdF9zaXplKG9iaiwgZ3JvdXAsIGNvdW50LCAmZHVtbXksICZkdW1teSwgJmR1bW15LCAmZHVtbXkpICE9IEJDTV9FUlJfUkFOR0UpCisgICAgeworICAgICAgICArK2NvdW50OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyogRHVtcCBhIHNpbmdsZSBwcm9wZXJ0eSAqLworYmNtb3NfZXJybm8gYmNtYmFsX2FwaWNsaV9kdW1wX3Byb3AoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWJhbF9hcGljbGlfcHJvcF9kZXNjciAqcGQsIHZvaWQgKnByb3BfZGF0YSk7CisKKy8qIER1bXAgYSBzaW5nbGUgcHJvcGVydHkgdmFsdWUgaW4gQyBpbml0aWFsaXplciBmb3JtYXQgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfZHVtcF9wcm9wX2luaXRpYWxpemVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21iYWxfYXBpY2xpX3Byb3BfZGVzY3IgKnBkLCB2b2lkICpwcm9wX2RhdGEpOworCisvKiBEdW1wIG1lc3NhZ2UgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9hcGljbGlfbXNnX2R1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbWJhbF9vYmogKm1zZyk7CisKKy8qIE1lc3NhZ2UgZ3JvdXAgbmFtZSAqLworY29uc3QgY2hhciAqYmNtYmFsX2FwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKGJjbWJhbF9tZ3RfZ3JvdXAgZ3JvdXApOworCisvKiBDb252ZXJ0IGFuIGVudW0gdmFsdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nICovCisjZGVmaW5lIEJDTU9MVF9FTlVNX1NUUklOR19WQUwoZW51bV9uYW1lLCB2YWx1ZSkgICAgYmNtY2xpX2VudW1fc3RyaW5ndmFsKGVudW1fbmFtZSAjIyBfc3RyaW5nX3RhYmxlLCAodmFsdWUpKQorCisvKiBFbnVtIHN0cmluZyB0YWJsZXMgKi8KK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX2FjdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX2FjdGlvbl9jbWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9jbGFzc2lmaWVyX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfcGt0X3RhZ190eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfY29udHJvbF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX2Rlc3RfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX2RzX21pc3NfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX2V4dHJhX2J3X2VsaWdpYmlsaXR5X3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9mbG93X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX2Zsb3dfaW5kX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfZmxvd19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9mbG93X3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9mbG93X3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9ncm91cF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9ncm91cF9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9ncm91cF9tZW1iZXJfY21kX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfZ3JvdXBfb3duZXJfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfaW50ZXJmYWNlX2luZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX2ludGVyZmFjZV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX2ludGZfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX2l3Zl9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfcGFja2V0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX3BhY2tldF9pbmRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9wYWNrZXRfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfc2xhX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9zdGF0dXNfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF90bV9iYWNfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX2NyZWF0aW9uX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF90bV9xdWV1ZV9pbmRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF90bV9xdWV1ZV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdG1fc2NoZWRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdG1fc2NoZWRfY2hpbGRfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3NjaGVkX2Rpcl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3NjaGVkX2luZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3NjaGVkX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3NjaGVkX293bmVyX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtYmFsX3RtX3NjaGVkX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWJhbF90bV9zaGFwaW5nX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdG1fdGNvbnRfc2xhX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21iYWxfdHJ4X3R5cGVfc3RyaW5nX3RhYmxlW107CisjZW5kaWYgLyogQkNNQkFMX0FQSUNMSV9IRUxQRVJTX0hfICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmJhbGFwaWNsaS9iYWxfYXBpX2NsaV90eXBlcy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGlfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM4YTZjCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJiYWxhcGljbGkvYmFsX2FwaV9jbGlfdHlwZXMuaApAQCAtMCwwICsxLDYwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTUJBTF9BUElDTElfVFlQRVNfSF8KKyNkZWZpbmUgQkNNQkFMX0FQSUNMSV9UWVBFU19IXworCisvKiBQcm9wZXJ0eSBhY2Nlc3MgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfUiA9IDB4MSwgICAvKiBSZWFkIGFjY2VzcyAqLworICAgIEJDTUJBTF9BUElDTElfUFJPUF9BQ0NFU1NfSURfVyA9IDB4MiwgICAvKiBXcml0ZSBhY2Nlc3MgKi8KKyAgICBCQ01CQUxfQVBJQ0xJX1BST1BfQUNDRVNTX0lEX1JXID0gMHgzLCAgLyogUmVhZC13cml0ZSAqLworfSBiY21iYWxfYXBpY2xpX3Byb3BfYWNjZXNzX2lkOworCisvKiBCYXNlIGRhdGEgdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX1NOVU0sICAgICAgIC8qIHNpZ25lZCBudW1iZXIgKi8KKyAgICBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9VTlVNLCAgICAgICAvKiB1bnNpZ25lZCBudW1iZXIgKi8KKyAgICBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9VTlVNX0hFWCwgICAvKiB1bnNpZ25lZCBudW1iZXIgcHJpbnRlZCBpbiBoZXggKi8KKyAgICBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9GTE9BVCwgICAgICAvKiBmbG9hdGluZy1wb2ludCBudW1iZXIgKi8KKyAgICBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9CT09MLCAgICAgICAvKiBib29sZWFuICh6ZXJvPW5vLCBub256ZXJvPXllcykgKi8KKyAgICBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJJTkcsICAgICAvKiBzdHJpbmcgKi8KKyAgICBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9JUFY0LCAgICAgICAvKiBJUHY0IGFkZHJlc3MgKi8KKyAgICBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9NQUMsICAgICAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0VOVU0sICAgICAgIC8qIGVudW0gKi8KKyAgICBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssICAvKiBiaXRtYXNrIGVudW0gKi8KKyAgICBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9TVFJVQ1QsICAgICAvKiBzdHJ1Y3QgKi8KKyAgICBCQ01CQUxfQVBJQ0xJX0JBU0VfVFlQRV9JRF9VTklPTiwgICAgICAvKiB1bmlvbiAqLworICAgIEJDTUJBTF9BUElDTElfQkFTRV9UWVBFX0lEX0FSUl9EWU4sICAgIC8qIGR5bmFtaWNhbGx5LXNpemVkIGFycmF5ICovCisgICAgQkNNQkFMX0FQSUNMSV9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAgLyogZml4ZWQtc2l6ZSBhcnJheSAqLworfSBiY21iYWxfYXBpY2xpX2Jhc2VfdHlwZV9pZDsKKworI2VuZGlmIC8qIEJDTUJBTF9BUElDTElfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliY21kbGluZS9NYWtlZmlsZSBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliY21kbGluZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzUwMzhkCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJjbWRsaW5lL01ha2VmaWxlCkBAIC0wLDAgKzEsMzUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorIyAgCisjICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyMgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgIAorIyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorIyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorIyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisjICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyMgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisjICAKKyMgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyMgICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorIyAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorIyAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorIyAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisjICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisjICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworIyAgICAgb2YgdGhlIHNvZnR3YXJlLgorIyAgCisjICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyMgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorIyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyMgIHdyaXR0ZW4gY29uc2VudC4KKyMgIAorIyAgOj4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK01PRF9OQU1FID0gY21kbGluZQorTU9EX1RZUEUgPSBsaWIKKworc3JjcyA9IGNtZGxpbmUuYworCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmNtZGxpbmUvY21kbGluZS5jIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJjbWRsaW5lL2NtZGxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjBiMTBhCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJjbWRsaW5lL2NtZGxpbmUuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKgorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKgorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNtZGxpbmUuYyAtIENvbW1hbmQgbGluZSBhcmd1bWVudCBoZWxwZXIKKyAqLworCisjaW5jbHVkZSA8Y21kbGluZS5oPgorCisvKiBQcmludCB1c2FnZSBpbmZvcm1hdGlvbiAqLworYmNtb3NfZXJybm8gY2xfcHJpbnRfdXNhZ2UoY29uc3QgY2hhciAqYXBwLCBjb25zdCBjaGFyICphcmcsCisgICAgY29uc3QgY2xfYXJndW1lbnQgc3VwcG9ydGVkX2FyZ3NbXSwgaW50IG51bV9zdXBwb3J0ZWRfYXJncywKKyAgICBjbF9hcmd1bWVudF91c2FnZV9mbGFncyBmbGFncykKK3sKKyAgICBjb25zdCBjaGFyICpvd25lciA9ICIiOworICAgIGludCBpOworCisgICAgaWYgKGFyZykKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIqKiogRXJyb3IgaW4gcGFyYW1ldGVyICVzXG4iLCBhcmcpOworICAgIGlmIChhcHApCisgICAgeworICAgICAgICBjb25zdCBjaGFyICpwLCAqZm5hbWU7CisgICAgICAgIHAgPSBzdHJyY2hyKGFwcCwgJy8nKTsKKyAgICAgICAgZm5hbWUgPSBwID8gcCArIDEgOiBhcHA7CisgICAgICAgIGJjbW9zX3ByaW50ZigiVXNhZ2U6ICVzIGFyZ3VtZW50c1xuIiwgZm5hbWUpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N1cHBvcnRlZF9hcmdzOyBpKyspCisgICAgeworICAgICAgICBjb25zdCBjbF9hcmd1bWVudCAqb3B0ID0gJnN1cHBvcnRlZF9hcmdzW2ldOworICAgICAgICBpZiAoKGZsYWdzICYgQ0xfQVJHVU1FTlRfVVNBR0VfRkxBR19PV05FUikgIT0gMCAmJgorICAgICAgICAgICAgb3B0LT5vd25lciAmJiBzdHJjbXAob3B0LT5vd25lciwgb3duZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBvd25lciA9IG9wdC0+b3duZXI7CisgICAgICAgICAgICBiY21vc19wcmludGYoIlxuJXMgb3B0aW9uczpcbiIsIG93bmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3B0LT5zaG9ydF9uYW1lKQorICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCIlLTNzJWMiLCBvcHQtPnNob3J0X25hbWUsIG9wdC0+bG9uZ19uYW1lID8gJywnIDogJyAnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCIgICAgIik7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJS0yMHMgJTIwcyAgJXNcbiIsCisgICAgICAgICAgICBvcHQtPmxvbmdfbmFtZSA/IG9wdC0+bG9uZ19uYW1lIDogIiIsCisgICAgICAgICAgICBvcHQtPmV4dHJhX2FyZyA/IG9wdC0+ZXh0cmFfYXJnIDogIiIsCisgICAgICAgICAgICBvcHQtPmRlc2NyaXB0aW9uID8gb3B0LT5kZXNjcmlwdGlvbiA6ICIiKTsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKK30KKworLyogR2V0IHBhcmFtZXRlciBieSBuYW1lICovCitjb25zdCBjbF9hcmd1bWVudCAqY2xfcGFybV9nZXQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2xfYXJndW1lbnQgc3VwcG9ydGVkX2FyZ3NbXSwgaW50IG51bV9zdXBwb3J0ZWRfYXJncykKK3sKKyAgICBjb25zdCBjbF9hcmd1bWVudCAqb3B0ID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGF0IGFsbCBtYW5kYXRvcnkgcGFyYW1ldGVycyBhcmUgc2V0ICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zdXBwb3J0ZWRfYXJnczsgaSsrKQorICAgIHsKKyAgICAgICAgb3B0ID0gJnN1cHBvcnRlZF9hcmdzW2ldOworICAgICAgICBpZiAoKG9wdC0+c2hvcnRfbmFtZSAmJiAhc3RyY21wKG9wdC0+c2hvcnRfbmFtZSwgbmFtZSkpIHx8CisgICAgICAgICAgICAob3B0LT5sb25nX25hbWUgJiYgIXN0cmNtcChvcHQtPmxvbmdfbmFtZSwgbmFtZSkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAoaSA8IG51bV9zdXBwb3J0ZWRfYXJncykgPyBvcHQgOiBOVUxMOworfQorCisvKiBWYWxpZGF0ZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyAqLworYmNtb3NfZXJybm8gY2xfdmFsaWRhdGUoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwKKyAgICBjb25zdCBjbF9hcmd1bWVudCBzdXBwb3J0ZWRfYXJnc1tdLCBpbnQgbnVtX3N1cHBvcnRlZF9hcmdzKQoreworICAgIGJjbW9zX2Jvb2wgcGFybV9zZXRbbnVtX3N1cHBvcnRlZF9hcmdzXTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgaW50IGk7CisKKyAgICBtZW1zZXQocGFybV9zZXQsIDAsIHNpemVvZihwYXJtX3NldCkpOworICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgICBjb25zdCBjbF9hcmd1bWVudCAqb3B0ID0gY2xfcGFybV9nZXQoYXJndltpXSwgc3VwcG9ydGVkX2FyZ3MsIG51bV9zdXBwb3J0ZWRfYXJncyk7CisgICAgICAgIGlmIChvcHQgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCIqKiogSW52YWxpZCBwYXJhbWV0ZXI6ICVzXG4iLCBhcmd2W2ldKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wdC0+ZXh0cmFfYXJnKQorICAgICAgICB7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICBpZiAoaSA+PSBhcmdjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiKioqIEFyZ3VtZW50IGlzIG1pc3NpbmcgYWZ0ZXIgJXNcbiIsIGFyZ3ZbaS0xXSk7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcGFybV9zZXRbb3B0IC0gc3VwcG9ydGVkX2FyZ3NdID0gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCBhbGwgbWFuZGF0b3J5IHBhcmFtZXRlcnMgYXJlIHNldCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3VwcG9ydGVkX2FyZ3M7IGkrKykKKyAgICB7CisgICAgICAgIGNvbnN0IGNsX2FyZ3VtZW50ICpvcHQgPSAmc3VwcG9ydGVkX2FyZ3NbaV07CisgICAgICAgIGlmICgob3B0LT5mbGFncyAmIENMX0FSR1VNRU5UX0ZMQUdfTUFOREFUT1JZKSAmJiAhcGFybV9zZXRbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiKioqIE1hbmRhdG9yeSBwYXJhbWV0ZXIgJXMgaXMgbWlzc2luZ1xuIiwgb3B0LT5sb25nX25hbWUgPyBvcHQtPmxvbmdfbmFtZSA6IG9wdC0+c2hvcnRfbmFtZSk7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGliY21kbGluZS9jbWRsaW5lLmggYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmNtZGxpbmUvY21kbGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZDIwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYmNtZGxpbmUvY21kbGluZS5oCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICoKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY21kbGluZS5oIC0gQ29tbWFuZCBsaW5lIGFyZ3VtZW50IGhlbHBlcgorICovCisKKyNpZm5kZWYgX0NNRExJTkVfSF8KKyNkZWZpbmUgX0NNRExJTkVfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisvKiogQXJndW1lbnQgZmxhZ3MgKi8KK3R5cGVkZWYgZW51bQoreworICAgIENMX0FSR1VNRU5UX0ZMQUdfTk9ORSA9IDAsCisgICAgQ0xfQVJHVU1FTlRfRkxBR19NQU5EQVRPUlkgPSAweDEsCit9IGNsX2FyZ3VtZW50X2ZsYWdzOworCisvKiogQ29tbWFuZCBsaW5lIGFyZ3VtZW50ICovCit0eXBlZGVmIHN0cnVjdCBjbF9hcmd1bWVudAoreworICAgIGNvbnN0IGNoYXIgKmxvbmdfbmFtZTsgICAgICAvKio8IENvbW1hbmQgbGluZSBvcHRpb246IGxvbmcgZm9ybSAqLworICAgIGNvbnN0IGNoYXIgKnNob3J0X25hbWU7ICAgICAvKio8IENvbW1hbmQgbGluZSBvcHRpb246IHNob3J0IGZvcm0gKi8KKyAgICBjb25zdCBjaGFyICpleHRyYV9hcmc7ICAgICAgLyoqPCBFeHRyYSBhcmd1bWVudHMgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsgICAgLyoqPCBEZXNjcmlwdGlvbiAqLworICAgIGNvbnN0IGNoYXIgKm93bmVyOyAgICAgICAgICAvKio8IE93bmVyIG1vZHVsZSAqLworICAgIGNsX2FyZ3VtZW50X2ZsYWdzIGZsYWdzOyAgICAvKio8IENvbW1hbmQgbGluZSBhcmd1bWVudCBmbGFncyAqLworfSBjbF9hcmd1bWVudDsKKworLyoqIFByaW50IHVzYWdlIGZsYWdzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBDTF9BUkdVTUVOVF9VU0FHRV9GTEFHX05PTkUgPSAwLAorICAgIENMX0FSR1VNRU5UX1VTQUdFX0ZMQUdfT1dORVIgPSAweDEsIC8qKjwgUHJpbnQgYXJndW1lbnQgb3duZXJzICovCit9IGNsX2FyZ3VtZW50X3VzYWdlX2ZsYWdzOworCisvKiogUHJpbnQgdXNhZ2UKKyAqIFxwYXJhbVtpbl0gICBhcHAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbiBuYW1lLiBDYW4gYmUgTlVMTAorICogXHBhcmFtW2luXSAgIGFyZyAgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50IHRoYXQgdHJpZ2dlcmVkIGNvbW1hbmQgbGluZSBwYXJzaW5nIGVycm9yLiBDYW4gYmUgTlVMTAorICogXHBhcmFtW2luXSAgIHN1cHBvcnRlZF9hcmdzICAgICAgICAgIEFycmF5IG9mIHN1cHBvcnRlZCBhcmd1bWVudHMKKyAqIFxwYXJhbVtpbl0gICBudW1fc3VwcG9ydGVkX2FyZ3MgICAgICBOdW1iZXIgb2YgZWxlbWVudHMgaW4gc3VwcG9ydGVkX2FyZ3NbXSBhcnJheQorICogXHBhcmFtW2luXSAgIGZsYWdzICAgICAgICAgICAgICAgICAgIFVzYWdlIGZsYWdzCisgKiBccmV0dXJucyAgICAgQkNNX0VSUl9QQVJNCisgKi8KK2JjbW9zX2Vycm5vIGNsX3ByaW50X3VzYWdlKGNvbnN0IGNoYXIgKmFwcCwgY29uc3QgY2hhciAqYXJnLAorICAgIGNvbnN0IGNsX2FyZ3VtZW50IHN1cHBvcnRlZF9hcmdzW10sIGludCBudW1fc3VwcG9ydGVkX2FyZ3MsCisgICAgY2xfYXJndW1lbnRfdXNhZ2VfZmxhZ3MgZmxhZ3MpOworCisvKiogVmFsaWRhdGUgcGFyYW1ldGVycworICoKKyAqIC0gbWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlIG5vIHVua25vd24gcGFyYW1ldGVycworICogLSBtYWtlIHN1cmUgdGhhdCBhbGwgbWFuZGF0b3J5IHBhcmFtZXRlcnMgYXJlIHByZXNlbnQKKyAqCisgKiBccGFyYW1baW5dICAgYXJnYyAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAqIFxwYXJhbVtpbl0gICBhcmd2ICAgICAgICAgICAgICAgICAgICBDb21tYW5kIGxpbmUgYXJndW1lbnRzCisgKiBccGFyYW1baW5dICAgc3VwcG9ydGVkX2FyZ3MgICAgICAgICAgQXJyYXkgb2Ygc3VwcG9ydGVkIGFyZ3VtZW50cworICogXHBhcmFtW2luXSAgIG51bV9zdXBwb3J0ZWRfYXJncyAgICAgIE51bWJlciBvZiBlbGVtZW50cyBpbiBzdXBwb3J0ZWRfYXJnc1tdIGFycmF5CisgKiBccmV0dXJucyAgICAgQkNNX0VSUl9PSyBvciBCQ01fRVJSX1BBUk0KKyAqLworYmNtb3NfZXJybm8gY2xfdmFsaWRhdGUoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwKKyAgICBjb25zdCBjbF9hcmd1bWVudCBzdXBwb3J0ZWRfYXJnc1tdLCBpbnQgbnVtX3N1cHBvcnRlZF9hcmdzKTsKKworLyoqIEdldCBDTCBwYXJhbWV0ZXIgYnkgbmFtZQorICoKKyAqIFxwYXJhbVtpbl0gICBuYW1lICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSAgIHN1cHBvcnRlZF9hcmdzICAgICAgICAgIFN1cHBvcnRlZCBhcmd1bWVudHMgYXJyYXkKKyAqIFxwYXJhbVtpbl0gICBudW1fc3VwcG9ydGVkX2FyZ3MgICAgICBTdXBwb3J0ZWQgYXJndW1lbnRzIGFycmF5IHNpemUKKyAqIFxyZXR1cm5zIGFyZ3VtZW50IGRlc2NyaXB0b3IgcG9pbnRlciBvciBOVUxMIGlmIG5vdCBmb3VuZAorICovCitjb25zdCBjbF9hcmd1bWVudCAqY2xfcGFybV9nZXQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2xfYXJndW1lbnQgc3VwcG9ydGVkX2FyZ3NbXSwKKyAgICBpbnQgbnVtX3N1cHBvcnRlZF9hcmdzKTsKKworI2VuZGlmIC8qIF9DTURMSU5FX0hfICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYm9iam1zZy9NYWtlZmlsZSBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlib2JqbXNnL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZmYyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYm9iam1zZy9NYWtlZmlsZQpAQCAtMCwwICsxLDM3IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyMgIAorIyAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisjICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisjICAKKyMgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyMgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyMgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorIyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisjICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorIyAgCisjICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisjICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyMgICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyMgICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyMgICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorIyAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworIyAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyMgICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyMgIAorIyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisjICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyMgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisjICB3cml0dGVuIGNvbnNlbnQuCisjICAKKyMgIDo+CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitNT0RfTkFNRSA9IGJhbG9iam1zZworTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gY29tbW9uX2luY2x1ZGUgdXRpbHMgbWFwbGVfc2RrIGRldl9sb2cKKworZ2VuX2JhbF9oZHJzID0gYmFsX21vZGVsX2Z1bmNzLmggYmFsX29ial9tc2dfcGFja191bnBhY2suaAorZ2VuX2JhbF9zcmNzID0gYmFsX21vZGVsX2Z1bmNzLmMgYmFsX29ial9tc2dfcGFja191bnBhY2suYworc3JjcyA9IGJhbF9tc2cuYwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJvYmptc2cvYmFsX21vZGVsX2Z1bmNzLmMgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYm9iam1zZy9iYWxfbW9kZWxfZnVuY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjI5OTlmCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJvYmptc2cvYmFsX21vZGVsX2Z1bmNzLmMKQEAgLTAsMCArMSwxMTM4NCBAQAorI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgImJhbF9tb2RlbF9mdW5jcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19pZF9wYWNrKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19pZF91bnBhY2soYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2lkX3BhY2soYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2lkX3VucGFjayhiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfaWRfcGFjayhiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfaWRfdW5wYWNrKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfYWN0aW9uX2lkX3BhY2soYmNtYmFsX2FjdGlvbl9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTY0KGJ1ZiwgKHVpbnQ2NF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjdGlvbl9pZF91bnBhY2soYmNtYmFsX2FjdGlvbl9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQ2NF90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTY0KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjdGlvbl9jbWRfaWRfcGFjayhiY21iYWxfYWN0aW9uX2NtZF9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjdGlvbl9jbWRfaWRfdW5wYWNrKGJjbWJhbF9hY3Rpb25fY21kX2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfY2xhc3NpZmllcl9pZF9wYWNrKGJjbWJhbF9jbGFzc2lmaWVyX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91NjQoYnVmLCAodWludDY0X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfY2xhc3NpZmllcl9pZF91bnBhY2soYmNtYmFsX2NsYXNzaWZpZXJfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50NjRfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U2NChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9wa3RfdGFnX3R5cGVfcGFjayhiY21iYWxfcGt0X3RhZ190eXBlIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcGt0X3RhZ190eXBlX3VucGFjayhiY21iYWxfcGt0X3RhZ190eXBlICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfY29udHJvbF9wYWNrKGJjbWJhbF9jb250cm9sIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfY29udHJvbF91bnBhY2soYmNtYmFsX2NvbnRyb2wgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9kZXN0X3R5cGVfcGFjayhiY21iYWxfZGVzdF90eXBlIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZGVzdF90eXBlX3VucGFjayhiY21iYWxfZGVzdF90eXBlICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZHNfbWlzc19tb2RlX3BhY2soYmNtYmFsX2RzX21pc3NfbW9kZSB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2RzX21pc3NfbW9kZV91bnBhY2soYmNtYmFsX2RzX21pc3NfbW9kZSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2V4dHJhX2J3X2VsaWdpYmlsaXR5X3R5cGVfcGFjayhiY21iYWxfZXh0cmFfYndfZWxpZ2liaWxpdHlfdHlwZSB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9leHRyYV9id19lbGlnaWJpbGl0eV90eXBlX3VucGFjayhiY21iYWxfZXh0cmFfYndfZWxpZ2liaWxpdHlfdHlwZSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2NmZ19pZF9wYWNrKGJjbWJhbF9mbG93X2NmZ19pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfY2ZnX2lkX3VucGFjayhiY21iYWxfZmxvd19jZmdfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2luZF9pZF9wYWNrKGJjbWJhbF9mbG93X2luZF9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfaW5kX2lkX3VucGFjayhiY21iYWxfZmxvd19pbmRfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2tleV9pZF9wYWNrKGJjbWJhbF9mbG93X2tleV9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfa2V5X2lkX3VucGFjayhiY21iYWxfZmxvd19rZXlfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9mbG93X3N0YXRfaWRfcGFjayhiY21iYWxfZmxvd19zdGF0X2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19zdGF0X2lkX3VucGFjayhiY21iYWxfZmxvd19zdGF0X2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd190eXBlX3BhY2soYmNtYmFsX2Zsb3dfdHlwZSB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfdHlwZV91bnBhY2soYmNtYmFsX2Zsb3dfdHlwZSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX2NmZ19pZF9wYWNrKGJjbWJhbF9ncm91cF9jZmdfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9jZmdfaWRfdW5wYWNrKGJjbWJhbF9ncm91cF9jZmdfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9rZXlfaWRfcGFjayhiY21iYWxfZ3JvdXBfa2V5X2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfa2V5X2lkX3VucGFjayhiY21iYWxfZ3JvdXBfa2V5X2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfbWVtYmVyX2NtZF9wYWNrKGJjbWJhbF9ncm91cF9tZW1iZXJfY21kIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfbWVtYmVyX2NtZF91bnBhY2soYmNtYmFsX2dyb3VwX21lbWJlcl9jbWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9vd25lcl9wYWNrKGJjbWJhbF9ncm91cF9vd25lciB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9vd25lcl91bnBhY2soYmNtYmFsX2dyb3VwX293bmVyICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9jZmdfaWRfcGFjayhiY21iYWxfaW50ZXJmYWNlX2NmZ19pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9jZmdfaWRfdW5wYWNrKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX2luZF9pZF9wYWNrKGJjbWJhbF9pbnRlcmZhY2VfaW5kX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX2luZF9pZF91bnBhY2soYmNtYmFsX2ludGVyZmFjZV9pbmRfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2Vfa2V5X2lkX3BhY2soYmNtYmFsX2ludGVyZmFjZV9rZXlfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2Vfa2V5X2lkX3VucGFjayhiY21iYWxfaW50ZXJmYWNlX2tleV9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2lkX3BhY2soYmNtYmFsX2ludGVyZmFjZV9zdGF0X2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX3N0YXRfaWRfdW5wYWNrKGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGZfdHlwZV9wYWNrKGJjbWJhbF9pbnRmX3R5cGUgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9pbnRmX3R5cGVfdW5wYWNrKGJjbWJhbF9pbnRmX3R5cGUgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9pd2ZfbW9kZV9wYWNrKGJjbWJhbF9pd2ZfbW9kZSB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2l3Zl9tb2RlX3VucGFjayhiY21iYWxfaXdmX21vZGUgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfY2ZnX2lkX3BhY2soYmNtYmFsX3BhY2tldF9jZmdfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfY2ZnX2lkX3VucGFjayhiY21iYWxfcGFja2V0X2NmZ19pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BhY2tldF9pbmRfaWRfcGFjayhiY21iYWxfcGFja2V0X2luZF9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BhY2tldF9pbmRfaWRfdW5wYWNrKGJjbWJhbF9wYWNrZXRfaW5kX2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2tleV9pZF9wYWNrKGJjbWJhbF9wYWNrZXRfa2V5X2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2tleV9pZF91bnBhY2soYmNtYmFsX3BhY2tldF9rZXlfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9zbGFfaWRfcGFjayhiY21iYWxfc2xhX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91NjQoYnVmLCAodWludDY0X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc2xhX2lkX3VucGFjayhiY21iYWxfc2xhX2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDY0X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91NjQoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc3RhdGVfcGFjayhiY21iYWxfc3RhdGUgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9zdGF0ZV91bnBhY2soYmNtYmFsX3N0YXRlICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc3RhdHVzX3BhY2soYmNtYmFsX3N0YXR1cyB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N0YXR1c191bnBhY2soYmNtYmFsX3N0YXR1cyAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2lkX3BhY2soYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfaWRfdW5wYWNrKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkX3BhY2soYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfaWRfdW5wYWNrKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X2lkX3BhY2soYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfaWRfdW5wYWNrKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9pZF9wYWNrKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfaWRfdW5wYWNrKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9iYWNfdHlwZV9wYWNrKGJjbWJhbF90bV9iYWNfdHlwZSB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9iYWNfdHlwZV91bnBhY2soYmNtYmFsX3RtX2JhY190eXBlICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX2NyZWF0aW9uX21vZGVfcGFjayhiY21iYWxfdG1fY3JlYXRpb25fbW9kZSB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9jcmVhdGlvbl9tb2RlX3VucGFjayhiY21iYWxfdG1fY3JlYXRpb25fbW9kZSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWRfcGFjayhiY21iYWxfdG1fcXVldWVfY2ZnX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfY2ZnX2lkX3VucGFjayhiY21iYWxfdG1fcXVldWVfY2ZnX2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfaW5kX2lkX3BhY2soYmNtYmFsX3RtX3F1ZXVlX2luZF9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2luZF9pZF91bnBhY2soYmNtYmFsX3RtX3F1ZXVlX2luZF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2tleV9pZF9wYWNrKGJjbWJhbF90bV9xdWV1ZV9rZXlfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9rZXlfaWRfdW5wYWNrKGJjbWJhbF90bV9xdWV1ZV9rZXlfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2lkX3BhY2soYmNtYmFsX3RtX3F1ZXVlX3N0YXRfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2lkX3VucGFjayhiY21iYWxfdG1fcXVldWVfc3RhdF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2NmZ19pZF9wYWNrKGJjbWJhbF90bV9zY2hlZF9jZmdfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9jZmdfaWRfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9jZmdfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9jaGlsZF90eXBlX3BhY2soYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGUgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfY2hpbGRfdHlwZV91bnBhY2soYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGUgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfZGlyX3BhY2soYmNtYmFsX3RtX3NjaGVkX2RpciB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9kaXJfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9kaXIgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfaW5kX2lkX3BhY2soYmNtYmFsX3RtX3NjaGVkX2luZF9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2luZF9pZF91bnBhY2soYmNtYmFsX3RtX3NjaGVkX2luZF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2tleV9pZF9wYWNrKGJjbWJhbF90bV9zY2hlZF9rZXlfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9rZXlfaWRfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9rZXlfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9vd25lcl90eXBlX3BhY2soYmNtYmFsX3RtX3NjaGVkX293bmVyX3R5cGUgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfb3duZXJfdHlwZV91bnBhY2soYmNtYmFsX3RtX3NjaGVkX293bmVyX3R5cGUgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWRfcGFjayhiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsICh1aW50NjRfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9pZF91bnBhY2soYmNtYmFsX3RtX3NjaGVkX293bmVyX2FnZ19wb3J0X2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDY0X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91NjQoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkX3BhY2soYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTY0KGJ1ZiwgKHVpbnQ2NF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9pZF91bnBhY2soYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQ2NF90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTY0KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX3R5cGVfcGFjayhiY21iYWxfdG1fc2NoZWRfdHlwZSB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF90eXBlX3VucGFjayhiY21iYWxfdG1fc2NoZWRfdHlwZSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zaGFwaW5nX2lkX3BhY2soYmNtYmFsX3RtX3NoYXBpbmdfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsICh1aW50NjRfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zaGFwaW5nX2lkX3VucGFjayhiY21iYWxfdG1fc2hhcGluZ19pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQ2NF90IG51bV92YWw7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTY0KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3Rjb250X3NsYV9pZF9wYWNrKGJjbWJhbF90bV90Y29udF9zbGFfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsICh1aW50NjRfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV90Y29udF9zbGFfaWRfdW5wYWNrKGJjbWJhbF90bV90Y29udF9zbGFfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50NjRfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U2NChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90cnhfdHlwZV9wYWNrKGJjbWJhbF90cnhfdHlwZSB0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RyeF90eXBlX3VucGFjayhiY21iYWxfdHJ4X3R5cGUgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9hY3Rpb25fc2V0X2RlZmF1bHQoYmNtYmFsX2FjdGlvbiAqdGhpcykKK3sKKyAgICB0aGlzLT5wcmVzZW5jZV9tYXNrID0gKGJjbWJhbF9hY3Rpb25faWQpIDA7CisgICAgdGhpcy0+Y21kc19iaXRtYXNrID0gKGJjbWJhbF9hY3Rpb25fY21kX2lkKSAwOworICAgIHRoaXMtPm9fdmlkID0gMDsKKyAgICB0aGlzLT5vX3BiaXRzID0gMDsKKyAgICB0aGlzLT5vX3RwaWQgPSAwOworICAgIHRoaXMtPmlfdmlkID0gMDsKKyAgICB0aGlzLT5pX3BiaXRzID0gMDsKKyAgICB0aGlzLT5pX3RwaWQgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfYWN0aW9uX3BhY2soY29uc3QgYmNtYmFsX2FjdGlvbiAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtYmFsX2FjdGlvbl9pZF9wYWNrKHRoaXMtPnByZXNlbmNlX21hc2ssIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDAxKSA9PSAweDAwMDEpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYWN0aW9uX2NtZF9pZF9wYWNrKHRoaXMtPmNtZHNfYml0bWFzaywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDAyKSA9PSAweDAwMDIpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm9fdmlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+b19wYml0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwOCkgPT0gMHgwMDA4KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5vX3RwaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMTApID09IDB4MDAxMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+aV92aWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMjApID09IDB4MDAyMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pX3BiaXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDQwKSA9PSAweDAwNDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmlfdHBpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX2FjdGlvbl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfYWN0aW9uICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gODsKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDgpID09IDB4MDAwOCkpCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAxMCkgPT0gMHgwMDEwKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDIwKSA9PSAweDAwMjApKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwNDApID09IDB4MDA0MCkpCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjdGlvbl91bnBhY2soYmNtYmFsX2FjdGlvbiAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtYmFsX2FjdGlvbl9pZF91bnBhY2soJnRoaXMtPnByZXNlbmNlX21hc2ssIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDAxKSA9PSAweDAwMDEpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYWN0aW9uX2NtZF9pZF91bnBhY2soJnRoaXMtPmNtZHNfYml0bWFzaywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDAyKSA9PSAweDAwMDIpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm9fdmlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+b19wYml0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwOCkgPT0gMHgwMDA4KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5vX3RwaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMTApID09IDB4MDAxMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aV92aWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMjApID09IDB4MDAyMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pX3BiaXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDQwKSA9PSAweDAwNDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmlfdHBpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfYWN0aW9uX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbWJhbF9hY3Rpb25faWQgcHJlc2VuY2VfbWFzazsKKyAgICBpZiAoIWJjbWJhbF9hY3Rpb25faWRfdW5wYWNrKCZwcmVzZW5jZV9tYXNrLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAwMSkgPT0gMHgwMDAxKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAwOCkgPT0gMHgwMDA4KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAxMCkgPT0gMHgwMDEwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAyMCkgPT0gMHgwMDIwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDA0MCkgPT0gMHgwMDQwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfYWN0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfYWN0aW9uICp0aGlzKQoreworICAgIGlmICgodGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4RkZGRkZGRkZGRkZGRkY4MFVMTCkgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBpZiAoKHRoaXMtPmNtZHNfYml0bWFzayAmIDB4RkZGRkUwMDBVTCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdThfc2V0X2RlZmF1bHQoYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OCAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdThfcGFjayhjb25zdCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4ICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdThfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICgyICogdGhpcy0+bGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OF91bnBhY2soYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbjsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQpICogbGVuKTsKKyAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfY2xhc3NpZmllcl9zZXRfZGVmYXVsdChiY21iYWxfY2xhc3NpZmllciAqdGhpcykKK3sKKyAgICB0aGlzLT5wcmVzZW5jZV9tYXNrID0gKGJjbWJhbF9jbGFzc2lmaWVyX2lkKSAwOworICAgIHRoaXMtPm9fdHBpZCA9IDA7CisgICAgdGhpcy0+b192aWQgPSAwOworICAgIHRoaXMtPmlfdHBpZCA9IDA7CisgICAgdGhpcy0+aV92aWQgPSAwOworICAgIHRoaXMtPm9fcGJpdHMgPSAwOworICAgIHRoaXMtPmlfcGJpdHMgPSAwOworICAgIHRoaXMtPmV0aGVyX3R5cGUgPSAwOworICAgIGJjbW9zX21hY19hZGRyZXNzX2luaXQoJnRoaXMtPmRzdF9tYWMpOworICAgIGJjbW9zX21hY19hZGRyZXNzX2luaXQoJnRoaXMtPnNyY19tYWMpOworICAgIHRoaXMtPmlwX3Byb3RvID0gMDsKKyAgICBiY21vc19pcHY0X2FkZHJlc3NfaW5pdCgmdGhpcy0+ZHN0X2lwKTsKKyAgICBiY21vc19pcHY0X2FkZHJlc3NfaW5pdCgmdGhpcy0+c3JjX2lwKTsKKyAgICB0aGlzLT5zcmNfcG9ydCA9IDA7CisgICAgdGhpcy0+ZHN0X3BvcnQgPSAwOworICAgIHRoaXMtPnBrdF90YWdfdHlwZSA9IChiY21iYWxfcGt0X3RhZ190eXBlKSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfY2xhc3NpZmllcl9wYWNrKGNvbnN0IGJjbWJhbF9jbGFzc2lmaWVyICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21iYWxfY2xhc3NpZmllcl9pZF9wYWNrKHRoaXMtPnByZXNlbmNlX21hc2ssIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDAxKSA9PSAweDAwMDEpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm9fdHBpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5vX3ZpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5pX3RwaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDgpID09IDB4MDAwOCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+aV92aWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMTApID09IDB4MDAxMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5vX3BiaXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDIwKSA9PSAweDAwMjApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aV9wYml0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDA0MCkgPT0gMHgwMDQwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5ldGhlcl90eXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDgwKSA9PSAweDAwODApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+ZHN0X21hYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDEwMCkgPT0gMHgwMTAwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnNyY19tYWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAyMDApID09IDB4MDIwMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pcF9wcm90bykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDQwMCkgPT0gMHgwNDAwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT5kc3RfaXApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDA4MDApID09IDB4MDgwMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+c3JjX2lwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgxMDAwKSA9PSAweDEwMDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnNyY19wb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgyMDAwKSA9PSAweDIwMDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmRzdF9wb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHg0MDAwKSA9PSAweDQwMDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfcGt0X3RhZ190eXBlX3BhY2sodGhpcy0+cGt0X3RhZ190eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9jbGFzc2lmaWVyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9jbGFzc2lmaWVyICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gODsKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDgpID09IDB4MDAwOCkpCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAxMCkgPT0gMHgwMDEwKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDIwKSA9PSAweDAwMjApKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwNDApID09IDB4MDA0MCkpCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDA4MCkgPT0gMHgwMDgwKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMTAwKSA9PSAweDAxMDApKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAyMDApID09IDB4MDIwMCkpCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDQwMCkgPT0gMHgwNDAwKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwODAwKSA9PSAweDA4MDApKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDEwMDApID09IDB4MTAwMCkpCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MjAwMCkgPT0gMHgyMDAwKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHg0MDAwKSA9PSAweDQwMDApKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9jbGFzc2lmaWVyX3VucGFjayhiY21iYWxfY2xhc3NpZmllciAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtYmFsX2NsYXNzaWZpZXJfaWRfdW5wYWNrKCZ0aGlzLT5wcmVzZW5jZV9tYXNrLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMSkgPT0gMHgwMDAxKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5vX3RwaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDIpID09IDB4MDAwMikpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+b192aWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDQpID09IDB4MDAwNCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aV90cGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDA4KSA9PSAweDAwMDgpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmlfdmlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDEwKSA9PSAweDAwMTApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+b19wYml0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAyMCkgPT0gMHgwMDIwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlfcGJpdHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwNDApID09IDB4MDA0MCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+ZXRoZXJfdHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDA4MCkgPT0gMHgwMDgwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmRzdF9tYWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAxMDApID09IDB4MDEwMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5zcmNfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMjAwKSA9PSAweDAyMDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aXBfcHJvdG8pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDA0MDApID09IDB4MDQwMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+ZHN0X2lwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwODAwKSA9PSAweDA4MDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfaXB2NF9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnNyY19pcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MTAwMCkgPT0gMHgxMDAwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5zcmNfcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MjAwMCkgPT0gMHgyMDAwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5kc3RfcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4NDAwMCkgPT0gMHg0MDAwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3BrdF90YWdfdHlwZV91bnBhY2soJnRoaXMtPnBrdF90YWdfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9jbGFzc2lmaWVyX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbWJhbF9jbGFzc2lmaWVyX2lkIHByZXNlbmNlX21hc2s7CisgICAgaWYgKCFiY21iYWxfY2xhc3NpZmllcl9pZF91bnBhY2soJnByZXNlbmNlX21hc2ssIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDAxKSA9PSAweDAwMDEpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDAyKSA9PSAweDAwMDIpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDA4KSA9PSAweDAwMDgpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDEwKSA9PSAweDAwMTApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDIwKSA9PSAweDAwMjApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDQwKSA9PSAweDAwNDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDgwKSA9PSAweDAwODApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMTAwKSA9PSAweDAxMDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMjAwKSA9PSAweDAyMDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwNDAwKSA9PSAweDA0MDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwODAwKSA9PSAweDA4MDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgxMDAwKSA9PSAweDEwMDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgyMDAwKSA9PSAweDIwMDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHg0MDAwKSA9PSAweDQwMDApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9jbGFzc2lmaWVyX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfY2xhc3NpZmllciAqdGhpcykKK3sKKyAgICBpZiAoKHRoaXMtPnByZXNlbmNlX21hc2sgJiAweEZGRkZGRkZGRkZGRjgwMDBVTEwpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHg0MDAwKSA9PSAweDQwMDApKQorICAgIHsKKyAgICAgICAgaWYgKCh0aGlzLT5wa3RfdGFnX3R5cGUgJiAweEZGRkZGRkY4VUwpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfZGVzdF9zZXRfZGVmYXVsdChiY21iYWxfZGVzdCAqdGhpcykKK3sKKyAgICB0aGlzLT50eXBlID0gKGJjbWJhbF9kZXN0X3R5cGUpIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9kZXN0X3BhY2soY29uc3QgYmNtYmFsX2Rlc3QgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbWJhbF9kZXN0X3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX0RFU1RfVFlQRV9OTkk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+dS5ubmkuaW50X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfREVTVF9UWVBFX1NVQl9URVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPnUuc3ViX3Rlcm0uc3ViX3Rlcm1faWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnN1Yl90ZXJtLnN1Yl90ZXJtX3VuaSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc3ViX3Rlcm0uaW50X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfREVTVF9UWVBFX0hPU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9kZXN0X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9kZXN0ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNDsKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTUJBTF9ERVNUX1RZUEVfTk5JOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfREVTVF9UWVBFX1NVQl9URVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfREVTVF9UWVBFX0hPU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Rlc3RfdW5wYWNrKGJjbWJhbF9kZXN0ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21iYWxfZGVzdF90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTUJBTF9ERVNUX1RZUEVfTk5JOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+dS5ubmkuaW50X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfREVTVF9UWVBFX1NVQl9URVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+dS5zdWJfdGVybS5zdWJfdGVybV9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc3ViX3Rlcm0uc3ViX3Rlcm1fdW5pKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zdWJfdGVybS5pbnRfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9ERVNUX1RZUEVfSE9TVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZGVzdF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21iYWxfZGVzdF90eXBlIHR5cGU7CisgICAgaWYgKCFiY21iYWxfZGVzdF90eXBlX3VucGFjaygmdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTUJBTF9ERVNUX1RZUEVfTk5JOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX0RFU1RfVFlQRV9TVUJfVEVSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfREVTVF9UWVBFX0hPU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Rlc3RfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9kZXN0ICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX0RFU1RfVFlQRV9OTkk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfREVTVF9UWVBFX1NVQl9URVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX0RFU1RfVFlQRV9IT1NUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfaWRfbGlzdF91MzJfcGFjayhjb25zdCBiY21iYWxfZmxvd19pZF9saXN0X3UzMiAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21iYWxfZmxvd19pZF9saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfZmxvd19pZF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfZmxvd19pZF9saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gNCArICg0ICogdGhpcy0+bGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfaWRfbGlzdF91MzJfdW5wYWNrKGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtYmFsX2Zsb3dfaWRfbGlzdF91MzJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKGJjbWJhbF9mbG93X2lkICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtYmFsX2Zsb3dfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19pZF9saXN0X3UzMl9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21iYWxfZmxvd19pZCkgKiBsZW4pOworICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgbGVuICogNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfZmxvd19pZF9saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX3RtX3F1ZXVlX3JlZl9zZXRfZGVmYXVsdChiY21iYWxfdG1fcXVldWVfcmVmICp0aGlzKQoreworICAgIHRoaXMtPnNjaGVkX2lkID0gKGJjbWJhbF90bV9zY2hlZF9pZCkgMDsKKyAgICB0aGlzLT5xdWV1ZV9pZCA9IChiY21iYWxfdG1fcXVldWVfaWQpIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9yZWZfcGFjayhjb25zdCBiY21iYWxfdG1fcXVldWVfcmVmICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+c2NoZWRfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5xdWV1ZV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9yZWZfdW5wYWNrKGJjbWJhbF90bV9xdWV1ZV9yZWYgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnNjaGVkX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5xdWV1ZV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9yZWZfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21iYWxfYnVmX3NraXAocGFja2VkLCA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX3JlZl9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3F1ZXVlX3JlZiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX3NldF9kZWZhdWx0KGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mbyAqdGhpcykKK3sKKyAgICB0aGlzLT5pbnRmX2lkID0gKGJjbWJhbF9pbnRmX2lkKSAwOworICAgIHRoaXMtPnN2Y19wb3J0X2lkID0gKGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQpIDA7CisgICAgdGhpcy0+YWN0aW9uLnByZXNlbmNlX21hc2sgPSAoYmNtYmFsX2FjdGlvbl9pZCkgMDsKKyAgICB0aGlzLT5hY3Rpb24uY21kc19iaXRtYXNrID0gKGJjbWJhbF9hY3Rpb25fY21kX2lkKSAwOworICAgIHRoaXMtPmFjdGlvbi5vX3ZpZCA9IDA7CisgICAgdGhpcy0+YWN0aW9uLm9fcGJpdHMgPSAwOworICAgIHRoaXMtPmFjdGlvbi5vX3RwaWQgPSAwOworICAgIHRoaXMtPmFjdGlvbi5pX3ZpZCA9IDA7CisgICAgdGhpcy0+YWN0aW9uLmlfcGJpdHMgPSAwOworICAgIHRoaXMtPmFjdGlvbi5pX3RwaWQgPSAwOworICAgIHRoaXMtPnF1ZXVlLnNjaGVkX2lkID0gKGJjbWJhbF90bV9zY2hlZF9pZCkgMDsKKyAgICB0aGlzLT5xdWV1ZS5xdWV1ZV9pZCA9IChiY21iYWxfdG1fcXVldWVfaWQpIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19wYWNrKGNvbnN0IGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mbyAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmludGZfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnN2Y19wb3J0X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbWJhbF9hY3Rpb25fcGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtYmFsX3RtX3F1ZXVlX3JlZl9wYWNrKCZ0aGlzLT5xdWV1ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gKnRoaXMpCit7CisgICAgcmV0dXJuIDExICsgYmNtYmFsX2FjdGlvbl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YWN0aW9uKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX3VucGFjayhiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmludGZfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+c3ZjX3BvcnRfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtYmFsX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtYmFsX3RtX3F1ZXVlX3JlZl91bnBhY2soJnRoaXMtPnF1ZXVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21iYWxfYWN0aW9uX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvICp0aGlzKQoreworICAgIGlmICghYmNtYmFsX2FjdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPmFjdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21iYWxfdG1fcXVldWVfcmVmX2JvdW5kc19jaGVjaygmdGhpcy0+cXVldWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTZfc2V0X2RlZmF1bHQoYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2X3BhY2soY29uc3QgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2ICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTYgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsZW5cIiBvZiBzdHJ1Y3QgXCJiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBjb3VudCArPSBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnZhbFtpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2X3VucGFjayhiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTYgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mbyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mbykpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fdW5wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTZfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuOworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvKSAqIGxlbik7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgbGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTZfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX3Bhc3N3b3JkX3NldF9kZWZhdWx0KGJjbWJhbF9wYXNzd29yZCAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+YXJyLCAwLCBzaXplb2YodGhpcy0+YXJyKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9wYXNzd29yZF9wYWNrKGNvbnN0IGJjbWJhbF9wYXNzd29yZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZShidWYsIHRoaXMtPmFyciwgMTApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcGFzc3dvcmRfdW5wYWNrKGJjbWJhbF9wYXNzd29yZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+YXJyLCAxMCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9wYXNzd29yZF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3Bhc3N3b3JkX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfcGFzc3dvcmQgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9yZWdpc3RyYXRpb25faWRfc2V0X2RlZmF1bHQoYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZCAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+YXJyLCAwLCBzaXplb2YodGhpcy0+YXJyKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9yZWdpc3RyYXRpb25faWRfcGFjayhjb25zdCBiY21iYWxfcmVnaXN0cmF0aW9uX2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+YXJyLCAzNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9yZWdpc3RyYXRpb25faWRfdW5wYWNrKGJjbWJhbF9yZWdpc3RyYXRpb25faWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZChidWYsIHRoaXMtPmFyciwgMzYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcmVnaXN0cmF0aW9uX2lkX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMzYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcmVnaXN0cmF0aW9uX2lkX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfcmVnaXN0cmF0aW9uX2lkICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfc2VyaWFsX251bWJlcl9zZXRfZGVmYXVsdChiY21iYWxfc2VyaWFsX251bWJlciAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+dmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+dmVuZG9yX2lkKSk7CisgICAgbWVtc2V0KHRoaXMtPnZlbmRvcl9zcGVjaWZpYywgMCwgc2l6ZW9mKHRoaXMtPnZlbmRvcl9zcGVjaWZpYykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc2VyaWFsX251bWJlcl9wYWNrKGNvbnN0IGJjbWJhbF9zZXJpYWxfbnVtYmVyICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dmVuZG9yX2lkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGUoYnVmLCB0aGlzLT52ZW5kb3Jfc3BlY2lmaWMsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc2VyaWFsX251bWJlcl91bnBhY2soYmNtYmFsX3NlcmlhbF9udW1iZXIgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZChidWYsIHRoaXMtPnZlbmRvcl9pZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWQoYnVmLCB0aGlzLT52ZW5kb3Jfc3BlY2lmaWMsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc2VyaWFsX251bWJlcl9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3NlcmlhbF9udW1iZXIgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91OF9zZXRfZGVmYXVsdChiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdThfcGFjayhjb25zdCBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdThfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4ICp0aGlzKQoreworICAgIHJldHVybiAxICsgKDIgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdThfdW5wYWNrKGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91OCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdThcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21iYWxfc2VydmljZV9wb3J0X2lkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4X3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21iYWxfc2VydmljZV9wb3J0X2lkKSAqIGxlbik7CisgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCBsZW4gKiAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9zbGFfc2V0X2RlZmF1bHQoYmNtYmFsX3NsYSAqdGhpcykKK3sKKyAgICB0aGlzLT5wcmVzZW5jZV9tYXNrID0gKGJjbWJhbF9zbGFfaWQpIDA7CisgICAgdGhpcy0+bWluX3JhdGUgPSAwOworICAgIHRoaXMtPm1heF9yYXRlID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3NsYV9wYWNrKGNvbnN0IGJjbWJhbF9zbGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbWJhbF9zbGFfaWRfcGFjayh0aGlzLT5wcmVzZW5jZV9tYXNrLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMSkgPT0gMHgwMDAxKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5taW5fcmF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhfcmF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3NsYV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfc2xhICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gODsKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc2xhX3VucGFjayhiY21iYWxfc2xhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21iYWxfc2xhX2lkX3VucGFjaygmdGhpcy0+cHJlc2VuY2VfbWFzaywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWluX3JhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDIpID09IDB4MDAwMikpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X3JhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3NsYV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21iYWxfc2xhX2lkIHByZXNlbmNlX21hc2s7CisgICAgaWYgKCFiY21iYWxfc2xhX2lkX3VucGFjaygmcHJlc2VuY2VfbWFzaywgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHByZXNlbmNlX21hc2sgJiAweDAwMDIpID09IDB4MDAwMikpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3NsYV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3NsYSAqdGhpcykKK3sKKyAgICBpZiAoKHRoaXMtPnByZXNlbmNlX21hc2sgJiAweEZGRkZGRkZGRkZGRkZGRkNVTEwpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9zdWJfaWRfbGlzdF91MTZfc2V0X2RlZmF1bHQoYmNtYmFsX3N1Yl9pZF9saXN0X3UxNiAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9zdWJfaWRfbGlzdF91MTZfcGFjayhjb25zdCBiY21iYWxfc3ViX2lkX2xpc3RfdTE2ICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbWJhbF9zdWJfaWRfbGlzdF91MTZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3N1Yl9pZF9saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfc3ViX2lkX2xpc3RfdTE2ICp0aGlzKQoreworICAgIHJldHVybiAyICsgKDQgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc3ViX2lkX2xpc3RfdTE2X3VucGFjayhiY21iYWxfc3ViX2lkX2xpc3RfdTE2ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtYmFsX3N1Yl9pZF9saXN0X3UxNlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtYmFsX3N1Yl9pZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbWJhbF9zdWJfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc3ViX2lkX2xpc3RfdTE2X3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbjsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbWJhbF9zdWJfaWQpICogbGVuKTsKKyAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc3ViX2lkX2xpc3RfdTE2X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfc3ViX2lkX2xpc3RfdTE2ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfdG1fcmVkX3NldF9kZWZhdWx0KGJjbWJhbF90bV9yZWQgKnRoaXMpCit7CisgICAgdGhpcy0+bWluX3RocmVzaG9sZCA9IChiY21iYWxfcGVyY2VudCkgMDsKKyAgICB0aGlzLT5tYXhfdGhyZXNob2xkID0gKGJjbWJhbF9wZXJjZW50KSAwOworICAgIHRoaXMtPm1heF9wcm9iYWJpbGl0eSA9IChiY21iYWxfcGVyY2VudCkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3JlZF9wYWNrKGNvbnN0IGJjbWJhbF90bV9yZWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+bWluX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPm1heF90aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5tYXhfcHJvYmFiaWxpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcmVkX3VucGFjayhiY21iYWxfdG1fcmVkICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+bWluX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+bWF4X3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+bWF4X3Byb2JhYmlsaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3JlZF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcmVkX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fcmVkICp0aGlzKQoreworICAgIGlmICh0aGlzLT5taW5fdGhyZXNob2xkID4gKGJjbWJhbF9wZXJjZW50KSAxMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPm1heF90aHJlc2hvbGQgPiAoYmNtYmFsX3BlcmNlbnQpIDEwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bWF4X3Byb2JhYmlsaXR5ID4gKGJjbWJhbF9wZXJjZW50KSAxMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF90bV9iYWNfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX2JhYyAqdGhpcykKK3sKKyAgICB0aGlzLT50eXBlID0gKGJjbWJhbF90bV9iYWNfdHlwZSkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX2JhY19wYWNrKGNvbnN0IGJjbWJhbF90bV9iYWMgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbWJhbF90bV9iYWNfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fQkFDX1RZUEVfVEFJTERST1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUudGFpbGRyb3AubWF4X3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9CQUNfVFlQRV9SRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfdG1fcmVkX3BhY2soJnRoaXMtPnUucmVkLnJlZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fQkFDX1RZUEVfV1JFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF90bV9yZWRfcGFjaygmdGhpcy0+dS53cmVkLmdyZWVuLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX3RtX3JlZF9wYWNrKCZ0aGlzLT51LndyZWQueWVsbG93LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX3RtX3JlZF9wYWNrKCZ0aGlzLT51LndyZWQucmVkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9CQUNfVFlQRV9XVEFJTERST1A6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfdG1fYmFjX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9iYWMgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX0JBQ19UWVBFX1RBSUxEUk9QOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fQkFDX1RZUEVfUkVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fQkFDX1RZUEVfV1JFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX0JBQ19UWVBFX1dUQUlMRFJPUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX2JhY191bnBhY2soYmNtYmFsX3RtX2JhYyAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtYmFsX3RtX2JhY190eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTUJBTF9UTV9CQUNfVFlQRV9UQUlMRFJPUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS50YWlsZHJvcC5tYXhfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX0JBQ19UWVBFX1JFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF90bV9yZWRfdW5wYWNrKCZ0aGlzLT51LnJlZC5yZWQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fQkFDX1RZUEVfV1JFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF90bV9yZWRfdW5wYWNrKCZ0aGlzLT51LndyZWQuZ3JlZW4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF90bV9yZWRfdW5wYWNrKCZ0aGlzLT51LndyZWQueWVsbG93LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfdG1fcmVkX3VucGFjaygmdGhpcy0+dS53cmVkLnJlZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9CQUNfVFlQRV9XVEFJTERST1A6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9iYWNfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtYmFsX3RtX2JhY190eXBlIHR5cGU7CisgICAgaWYgKCFiY21iYWxfdG1fYmFjX3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX0JBQ19UWVBFX1RBSUxEUk9QOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX0JBQ19UWVBFX1JFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9CQUNfVFlQRV9XUkVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9CQUNfVFlQRV9XVEFJTERST1A6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9iYWNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF90bV9iYWMgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fQkFDX1RZUEVfVEFJTERST1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fQkFDX1RZUEVfUkVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX3RtX3JlZF9ib3VuZHNfY2hlY2soJnRoaXMtPnUucmVkLnJlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX0JBQ19UWVBFX1dSRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfdG1fcmVkX2JvdW5kc19jaGVjaygmdGhpcy0+dS53cmVkLmdyZWVuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF90bV9yZWRfYm91bmRzX2NoZWNrKCZ0aGlzLT51LndyZWQueWVsbG93KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF90bV9yZWRfYm91bmRzX2NoZWNrKCZ0aGlzLT51LndyZWQucmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fQkFDX1RZUEVfV1RBSUxEUk9QOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4X3NldF9kZWZhdWx0KGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdThfcGFjayhjb25zdCBiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdThcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4ICp0aGlzKQoreworICAgIHJldHVybiAxICsgdGhpcy0+bGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OF91bnBhY2soYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdTggKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdThcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKGJjbWJhbF90bV9xdWV1ZV9pZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbWJhbF90bV9xdWV1ZV9pZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbjsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtYmFsX3RtX3F1ZXVlX2lkKSAqIGxlbik7CisgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCBsZW4gKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdThfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OF9zZXRfZGVmYXVsdChiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OCAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4X3BhY2soY29uc3QgYmNtYmFsX3RtX3NjaGVkX2lkX2xpc3RfdTggKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4ICp0aGlzKQoreworICAgIHJldHVybiAxICsgKDQgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OF91bnBhY2soYmNtYmFsX3RtX3NjaGVkX2lkX2xpc3RfdTggKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtYmFsX3RtX3NjaGVkX2lkX2xpc3RfdThcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKGJjbWJhbF90bV9zY2hlZF9pZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbWJhbF90bV9zY2hlZF9pZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4X3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuOworICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21iYWxfdG1fc2NoZWRfaWQpICogbGVuKTsKKyAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OF9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3NjaGVkX2lkX2xpc3RfdTggKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF90bV9zY2hlZF9vd25lcl9zZXRfZGVmYXVsdChiY21iYWxfdG1fc2NoZWRfb3duZXIgKnRoaXMpCit7CisgICAgdGhpcy0+dHlwZSA9IChiY21iYWxfdG1fc2NoZWRfb3duZXJfdHlwZSkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX293bmVyX3BhY2soY29uc3QgYmNtYmFsX3RtX3NjaGVkX293bmVyICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21iYWxfdG1fc2NoZWRfb3duZXJfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9JTlRFUkZBQ0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfaW50Zl90eXBlX3BhY2sodGhpcy0+dS5pbnRlcmZhY2UuaW50Zl90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPnUuaW50ZXJmYWNlLmludGZfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1NVQl9URVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPnUuc3ViX3Rlcm0uaW50Zl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+dS5zdWJfdGVybS5zdWJfdGVybV9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfQUdHX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWRfcGFjayh0aGlzLT51LmFnZ19wb3J0LnByZXNlbmNlX21hc2ssIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT51LmFnZ19wb3J0LnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFnZ19wb3J0LmludGZfaWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnUuYWdnX3BvcnQucHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPnUuYWdnX3BvcnQuc3ViX3Rlcm1faWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnUuYWdnX3BvcnQucHJlc2VuY2VfbWFzayAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnUuYWdnX3BvcnQuYWdnX3BvcnRfaWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9VTkk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS51bmkuaW50Zl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+dS51bmkuc3ViX3Rlcm1faWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudW5pLmlkeCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfVklSVFVBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS52aXJ0dWFsLmlkeCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfVU5ERUZJTkVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3RtX3NjaGVkX293bmVyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9vd25lciAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9JTlRFUkZBQ0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1NVQl9URVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9BR0dfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1VOSToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfVklSVFVBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfVU5ERUZJTkVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfb3duZXJfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9vd25lciAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtYmFsX3RtX3NjaGVkX293bmVyX3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfSU5URVJGQUNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2ludGZfdHlwZV91bnBhY2soJnRoaXMtPnUuaW50ZXJmYWNlLmludGZfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnUuaW50ZXJmYWNlLmludGZfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1NVQl9URVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+dS5zdWJfdGVybS5pbnRmX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnUuc3ViX3Rlcm0uc3ViX3Rlcm1faWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX0FHR19QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX3RtX3NjaGVkX293bmVyX2FnZ19wb3J0X2lkX3VucGFjaygmdGhpcy0+dS5hZ2dfcG9ydC5wcmVzZW5jZV9tYXNrLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+dS5hZ2dfcG9ydC5wcmVzZW5jZV9tYXNrICYgMHgwMDAxKSA9PSAweDAwMDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hZ2dfcG9ydC5pbnRmX2lkKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT51LmFnZ19wb3J0LnByZXNlbmNlX21hc2sgJiAweDAwMDIpID09IDB4MDAwMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnUuYWdnX3BvcnQuc3ViX3Rlcm1faWQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnUuYWdnX3BvcnQucHJlc2VuY2VfbWFzayAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+dS5hZ2dfcG9ydC5hZ2dfcG9ydF9pZCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1VOSToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnVuaS5pbnRmX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnUudW5pLnN1Yl90ZXJtX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnVuaS5pZHgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1ZJUlRVQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUudmlydHVhbC5pZHgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1VOREVGSU5FRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX293bmVyX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbWJhbF90bV9zY2hlZF9vd25lcl90eXBlIHR5cGU7CisgICAgaWYgKCFiY21iYWxfdG1fc2NoZWRfb3duZXJfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9JTlRFUkZBQ0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1NVQl9URVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9BR0dfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWQgcHJlc2VuY2VfbWFzazsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9pZF91bnBhY2soJnByZXNlbmNlX21hc2ssIHBhY2tlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDAxKSA9PSAweDAwMDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDAyKSA9PSAweDAwMDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfVU5JOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1ZJUlRVQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9VTkRFRklORUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9vd25lcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3NjaGVkX293bmVyICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfSU5URVJGQUNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy0+dS5pbnRlcmZhY2UuaW50Zl90eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01CQUxfSU5URl9UWVBFX05OSToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTUJBTF9JTlRGX1RZUEVfUE9OOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfU1VCX1RFUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9BR0dfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWdnX3BvcnQucHJlc2VuY2VfbWFzayAmIDB4RkZGRkZGRkZGRkZGRkZGOFVMTCkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9VTkk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfT1dORVJfVFlQRV9WSVJUVUFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX09XTkVSX1RZUEVfVU5ERUZJTkVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF90bV9zY2hlZF9wYXJlbnRfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3NjaGVkX3BhcmVudCAqdGhpcykKK3sKKyAgICB0aGlzLT5wcmVzZW5jZV9tYXNrID0gKGJjbWJhbF90bV9zY2hlZF9wYXJlbnRfaWQpIDA7CisgICAgdGhpcy0+c2NoZWRfaWQgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSAwOworICAgIHRoaXMtPnByaW9yaXR5ID0gKGJjbWJhbF90bV9wcmlvcml0eSkgMDsKKyAgICB0aGlzLT53ZWlnaHQgPSAoYmNtYmFsX3RtX3dlaWdodCkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9wYWNrKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9wYXJlbnQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9wYXJlbnRfaWRfcGFjayh0aGlzLT5wcmVzZW5jZV9tYXNrLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMSkgPT0gMHgwMDAxKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPnNjaGVkX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDAyKSA9PSAweDAwMDIpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnByaW9yaXR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPndlaWdodCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfdG1fc2NoZWRfcGFyZW50ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gODsKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9wYXJlbnRfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9wYXJlbnQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9wYXJlbnRfaWRfdW5wYWNrKCZ0aGlzLT5wcmVzZW5jZV9tYXNrLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMSkgPT0gMHgwMDAxKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+c2NoZWRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDIpID09IDB4MDAwMikpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wcmlvcml0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPndlaWdodCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfcGFyZW50X3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbWJhbF90bV9zY2hlZF9wYXJlbnRfaWQgcHJlc2VuY2VfbWFzazsKKyAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9wYXJlbnRfaWRfdW5wYWNrKCZwcmVzZW5jZV9tYXNrLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAwMSkgPT0gMHgwMDAxKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfcGFyZW50X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fc2NoZWRfcGFyZW50ICp0aGlzKQoreworICAgIGlmICgodGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4RkZGRkZGRkZGRkZGRkZGOFVMTCkgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX3RtX3NoYXBpbmdfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3NoYXBpbmcgKnRoaXMpCit7CisgICAgdGhpcy0+cHJlc2VuY2VfbWFzayA9IChiY21iYWxfdG1fc2hhcGluZ19pZCkgMDsKKyAgICB0aGlzLT5zYnIgPSAwOworICAgIHRoaXMtPnBiciA9IDA7CisgICAgdGhpcy0+YnVyc3QgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2hhcGluZ19wYWNrKGNvbnN0IGJjbWJhbF90bV9zaGFwaW5nICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21iYWxfdG1fc2hhcGluZ19pZF9wYWNrKHRoaXMtPnByZXNlbmNlX21hc2ssIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDAxKSA9PSAweDAwMDEpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNicikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wYnIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDQpID09IDB4MDAwNCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YnVyc3QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF90bV9zaGFwaW5nX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9zaGFwaW5nICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gODsKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zaGFwaW5nX3VucGFjayhiY21iYWxfdG1fc2hhcGluZyAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtYmFsX3RtX3NoYXBpbmdfaWRfdW5wYWNrKCZ0aGlzLT5wcmVzZW5jZV9tYXNrLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMSkgPT0gMHgwMDAxKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zYnIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDIpID09IDB4MDAwMikpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cGJyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJ1cnN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zaGFwaW5nX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbWJhbF90bV9zaGFwaW5nX2lkIHByZXNlbmNlX21hc2s7CisgICAgaWYgKCFiY21iYWxfdG1fc2hhcGluZ19pZF91bnBhY2soJnByZXNlbmNlX21hc2ssIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDAxKSA9PSAweDAwMDEpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDAyKSA9PSAweDAwMDIpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSBwcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zaGFwaW5nX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fc2hhcGluZyAqdGhpcykKK3sKKyAgICBpZiAoKHRoaXMtPnByZXNlbmNlX21hc2sgJiAweEZGRkZGRkZGRkZGRkZGRjhVTEwpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF90bV90Y29udF9zbGFfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3Rjb250X3NsYSAqdGhpcykKK3sKKyAgICB0aGlzLT5wcmVzZW5jZV9tYXNrID0gKGJjbWJhbF90bV90Y29udF9zbGFfaWQpIDA7CisgICAgdGhpcy0+ZXh0cmFfYndfZWxpZyA9IEJDTUJBTF9FWFRSQV9CV19FTElHSUJJTElUWV9UWVBFX05PTkU7CisgICAgdGhpcy0+bnJ0X2NiciA9IDA7CisgICAgdGhpcy0+cnRfY2JyID0gMDsKKyAgICB0aGlzLT5ydF9wcm9maWxlID0gMDsKKyAgICB0aGlzLT5ucnRfcHJvZmlsZSA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV90Y29udF9zbGFfcGFjayhjb25zdCBiY21iYWxfdG1fdGNvbnRfc2xhICp0aGlzLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21iYWxfdG1fdGNvbnRfc2xhX2lkX3BhY2sodGhpcy0+cHJlc2VuY2VfbWFzaywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9leHRyYV9id19lbGlnaWJpbGl0eV90eXBlX3BhY2sodGhpcy0+ZXh0cmFfYndfZWxpZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDAyKSA9PSAweDAwMDIpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bnJ0X2NicikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJ0X2NicikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwOCkgPT0gMHgwMDA4KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJ0X3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMTApID09IDB4MDAxMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5ucnRfcHJvZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3RtX3Rjb250X3NsYV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfdG1fdGNvbnRfc2xhICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gODsKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDgpID09IDB4MDAwOCkpCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAxMCkgPT0gMHgwMDEwKSkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fdGNvbnRfc2xhX3VucGFjayhiY21iYWxfdG1fdGNvbnRfc2xhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21iYWxfdG1fdGNvbnRfc2xhX2lkX3VucGFjaygmdGhpcy0+cHJlc2VuY2VfbWFzaywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9leHRyYV9id19lbGlnaWJpbGl0eV90eXBlX3VucGFjaygmdGhpcy0+ZXh0cmFfYndfZWxpZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5wcmVzZW5jZV9tYXNrICYgMHgwMDAyKSA9PSAweDAwMDIpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnJ0X2NicikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJ0X2NicikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4MDAwOCkgPT0gMHgwMDA4KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJ0X3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMTApID09IDB4MDAxMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5ucnRfcHJvZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fdGNvbnRfc2xhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbWJhbF90bV90Y29udF9zbGFfaWQgcHJlc2VuY2VfbWFzazsKKyAgICBpZiAoIWJjbWJhbF90bV90Y29udF9zbGFfaWRfdW5wYWNrKCZwcmVzZW5jZV9tYXNrLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAwMSkgPT0gMHgwMDAxKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAwMikgPT0gMHgwMDAyKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAwOCkgPT0gMHgwMDA4KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgcHJlc2VuY2VfbWFzayAmIDB4MDAxMCkgPT0gMHgwMDEwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fdGNvbnRfc2xhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fdGNvbnRfc2xhICp0aGlzKQoreworICAgIGlmICgodGhpcy0+cHJlc2VuY2VfbWFzayAmIDB4RkZGRkZGRkZGRkZGRkZFMFVMTCkgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnByZXNlbmNlX21hc2sgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmV4dHJhX2J3X2VsaWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0VYVFJBX0JXX0VMSUdJQklMSVRZX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0VYVFJBX0JXX0VMSUdJQklMSVRZX1RZUEVfTk9UX0FTU1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9FWFRSQV9CV19FTElHSUJJTElUWV9UWVBFX0JFU1RfRUZGT1JUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX3U4X2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbWJhbF91OF9saXN0X3UzMiAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF91OF9saXN0X3UzMl9wYWNrKGNvbnN0IGJjbWJhbF91OF9saXN0X3UzMiAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21iYWxfdThfbGlzdF91MzJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dmFsLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3U4X2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF91OF9saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gNCArIHRoaXMtPmxlbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3U4X2xpc3RfdTMyX3VucGFjayhiY21iYWxfdThfbGlzdF91MzIgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21iYWxfdThfbGlzdF91MzJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZChidWYsIHRoaXMtPnZhbCwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3U4X2xpc3RfdTMyX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbGVuKTsKKyAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF91OF9saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfc2V0X2RlZmF1bHQoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0tFWV9JRF9BQ0NFU1NfVEVSTV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hY2Nlc3NfdGVybV9pZCA9IChiY21iYWxfYWNjZXNzX2lkKSAxOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfcGFjayhjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9LRVlfSURfQUNDRVNTX1RFUk1fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+YWNjZXNzX3Rlcm1faWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfS0VZX0lEX0FDQ0VTU19URVJNX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV91bnBhY2soYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXkgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfS0VZX0lEX0FDQ0VTU19URVJNX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+YWNjZXNzX3Rlcm1faWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0tFWV9JRF9BQ0NFU1NfVEVSTV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0tFWV9JRF9BQ0NFU1NfVEVSTV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+YWNjZXNzX3Rlcm1faWQgPCAoYmNtYmFsX2FjY2Vzc19pZCkgMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9LRVlfSURfQUNDRVNTX1RFUk1fSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+YWNjZXNzX3Rlcm1faWQgPiAoYmNtYmFsX2FjY2Vzc19pZCkgMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9LRVlfSURfQUNDRVNTX1RFUk1fSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9DRkdfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWRtaW5fc3RhdGUgPSAoYmNtYmFsX3N0YXRlKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vcGVyX3N0YXR1cyA9IChiY21iYWxfc3RhdHVzKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pd2ZfbW9kZSA9IEJDTUJBTF9JV0ZfTU9ERV9ESVJFQ1RfTUFQUElORzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zdGF0ZV9wYWNrKHRoaXMtPmFkbWluX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9DRkdfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdHVzX3BhY2sodGhpcy0+b3Blcl9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9pd2ZfbW9kZV9wYWNrKHRoaXMtPml3Zl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YV91bnBhY2soYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9DRkdfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdGVfdW5wYWNrKCZ0aGlzLT5hZG1pbl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfQ0ZHX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3N0YXR1c191bnBhY2soJnRoaXMtPm9wZXJfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9DRkdfSURfSVdGX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfaXdmX21vZGVfdW5wYWNrKCZ0aGlzLT5pd2ZfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGFfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9DRkdfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfQ0ZHX0lEX0lXRl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFkbWluX3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFURV9VUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX0RPV046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFURV9URVNUSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9DRkdfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vcGVyX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX0RPV046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfVEVTVElORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19OT1RfUFJFU0VOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19MT1dFUl9MQVlFUl9ET1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX1VOS05PV046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfQ0ZHX0lEX09QRVJfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPml3Zl9tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9JV0ZfTU9ERV9ESVJFQ1RfTUFQUElORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0lXRl9NT0RFX1BFUl9GTE9XOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0NGR19JRF9JV0ZfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YV9zZXRfZGVmYXVsdChiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWRtaW5fc3RhdGUgPSAoYmNtYmFsX3N0YXRlKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vcGVyX3N0YXR1cyA9IChiY21iYWxfc3RhdHVzKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pd2ZfbW9kZSA9IEJDTUJBTF9JV0ZfTU9ERV9ESVJFQ1RfTUFQUElORzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGFfcGFjayhjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zdGF0ZV9wYWNrKHRoaXMtPmFkbWluX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdHVzX3BhY2sodGhpcy0+b3Blcl9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9pd2ZfbW9kZV9wYWNrKHRoaXMtPml3Zl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YV91bnBhY2soYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdGVfdW5wYWNrKCZ0aGlzLT5hZG1pbl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfSU5EX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3N0YXR1c191bnBhY2soJnRoaXMtPm9wZXJfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfSVdGX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfaXdmX21vZGVfdW5wYWNrKCZ0aGlzLT5pd2ZfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGFfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfSU5EX0lEX0lXRl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFkbWluX3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFURV9VUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX0RPV046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFURV9URVNUSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0FDQ0VTU19URVJNSU5BTF9JTkRfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vcGVyX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX0RPV046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfVEVTVElORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19OT1RfUFJFU0VOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19MT1dFUl9MQVlFUl9ET1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX1VOS05PV046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfSU5EX0lEX09QRVJfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPml3Zl9tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9JV0ZfTU9ERV9ESVJFQ1RfTUFQUElORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0lXRl9NT0RFX1BFUl9GTE9XOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfQUNDRVNTX1RFUk1JTkFMX0lORF9JRF9JV0ZfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX2Zsb3dfa2V5X3NldF9kZWZhdWx0KGJjbWJhbF9mbG93X2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0tFWV9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfaWQgPSAoYmNtYmFsX2Zsb3dfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0tFWV9JRF9GTE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Zmxvd190eXBlID0gKGJjbWJhbF9mbG93X3R5cGUpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19rZXlfcGFjayhjb25zdCBiY21iYWxfZmxvd19rZXkgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0tFWV9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfS0VZX0lEX0ZMT1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9mbG93X3R5cGVfcGFjayh0aGlzLT5mbG93X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX2Zsb3dfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9mbG93X2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19LRVlfSURfRkxPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19rZXlfdW5wYWNrKGJjbWJhbF9mbG93X2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfS0VZX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5mbG93X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0tFWV9JRF9GTE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfZmxvd190eXBlX3VucGFjaygmdGhpcy0+Zmxvd190eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfa2V5X3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfS0VZX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0tFWV9JRF9GTE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2Zsb3dfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX2Zsb3dfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfS0VZX0lEX0ZMT1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZsb3dfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9GTE9XX1RZUEVfQlJPQURDQVNUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX01VTFRJQ0FTVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0ZMT1dfS0VZX0lEX0ZMT1dfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX2Zsb3dfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWRtaW5fc3RhdGUgPSAoYmNtYmFsX3N0YXRlKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b3Blcl9zdGF0dXMgPSAoYmNtYmFsX3N0YXR1cykgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FDQ0VTU19JTlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWNjZXNzX2ludF9pZCA9IChiY21iYWxfaW50Zl9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX05FVFdPUktfSU5UX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ldHdvcmtfaW50X2lkID0gKGJjbWJhbF9pbnRmX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfU1VCX1RFUk1fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3ViX3Rlcm1faWQgPSAoYmNtYmFsX3N1Yl9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NVQl9URVJNX1VOSV9JRFgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3ViX3Rlcm1fdW5pX2lkeCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9TVkNfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdmNfcG9ydF9pZCA9IChiY21iYWxfc2VydmljZV9wb3J0X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfQUdHX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWdnX3BvcnRfaWQgPSAoYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9SRVNPTFZFX01BQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXNvbHZlX21hYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfQ0xBU1NJRklFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jbGFzc2lmaWVyLnByZXNlbmNlX21hc2sgPSAoYmNtYmFsX2NsYXNzaWZpZXJfaWQpIDA7CisgICAgICAgIHRoaXMtPmNsYXNzaWZpZXIub190cGlkID0gMDsKKyAgICAgICAgdGhpcy0+Y2xhc3NpZmllci5vX3ZpZCA9IDA7CisgICAgICAgIHRoaXMtPmNsYXNzaWZpZXIuaV90cGlkID0gMDsKKyAgICAgICAgdGhpcy0+Y2xhc3NpZmllci5pX3ZpZCA9IDA7CisgICAgICAgIHRoaXMtPmNsYXNzaWZpZXIub19wYml0cyA9IDA7CisgICAgICAgIHRoaXMtPmNsYXNzaWZpZXIuaV9wYml0cyA9IDA7CisgICAgICAgIHRoaXMtPmNsYXNzaWZpZXIuZXRoZXJfdHlwZSA9IDA7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzX2luaXQoJnRoaXMtPmNsYXNzaWZpZXIuZHN0X21hYyk7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzX2luaXQoJnRoaXMtPmNsYXNzaWZpZXIuc3JjX21hYyk7CisgICAgICAgIHRoaXMtPmNsYXNzaWZpZXIuaXBfcHJvdG8gPSAwOworICAgICAgICBiY21vc19pcHY0X2FkZHJlc3NfaW5pdCgmdGhpcy0+Y2xhc3NpZmllci5kc3RfaXApOworICAgICAgICBiY21vc19pcHY0X2FkZHJlc3NfaW5pdCgmdGhpcy0+Y2xhc3NpZmllci5zcmNfaXApOworICAgICAgICB0aGlzLT5jbGFzc2lmaWVyLnNyY19wb3J0ID0gMDsKKyAgICAgICAgdGhpcy0+Y2xhc3NpZmllci5kc3RfcG9ydCA9IDA7CisgICAgICAgIHRoaXMtPmNsYXNzaWZpZXIucGt0X3RhZ190eXBlID0gKGJjbWJhbF9wa3RfdGFnX3R5cGUpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWN0aW9uLnByZXNlbmNlX21hc2sgPSAoYmNtYmFsX2FjdGlvbl9pZCkgMDsKKyAgICAgICAgdGhpcy0+YWN0aW9uLmNtZHNfYml0bWFzayA9IChiY21iYWxfYWN0aW9uX2NtZF9pZCkgMDsKKyAgICAgICAgdGhpcy0+YWN0aW9uLm9fdmlkID0gMDsKKyAgICAgICAgdGhpcy0+YWN0aW9uLm9fcGJpdHMgPSAwOworICAgICAgICB0aGlzLT5hY3Rpb24ub190cGlkID0gMDsKKyAgICAgICAgdGhpcy0+YWN0aW9uLmlfdmlkID0gMDsKKyAgICAgICAgdGhpcy0+YWN0aW9uLmlfcGJpdHMgPSAwOworICAgICAgICB0aGlzLT5hY3Rpb24uaV90cGlkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zbGEucHJlc2VuY2VfbWFzayA9IChiY21iYWxfc2xhX2lkKSAwOworICAgICAgICB0aGlzLT5zbGEubWluX3JhdGUgPSAwOworICAgICAgICB0aGlzLT5zbGEubWF4X3JhdGUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfQ09PS0lFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNvb2tpZSA9IChiY21iYWxfY29va2llKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfUFJJT1JJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJpb3JpdHkgPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfR1JPVVBfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z3JvdXBfaWQgPSAoYmNtYmFsX2dyb3VwX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfUVVFVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cXVldWUuc2NoZWRfaWQgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSAwOworICAgICAgICB0aGlzLT5xdWV1ZS5xdWV1ZV9pZCA9IChiY21iYWxfdG1fcXVldWVfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9mbG93X2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdGVfcGFjayh0aGlzLT5hZG1pbl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zdGF0dXNfcGFjayh0aGlzLT5vcGVyX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9BQ0NFU1NfSU5UX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmFjY2Vzc19pbnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX05FVFdPUktfSU5UX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPm5ldHdvcmtfaW50X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9TVUJfVEVSTV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5zdWJfdGVybV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfU1VCX1RFUk1fVU5JX0lEWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zdWJfdGVybV91bmlfaWR4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9TVkNfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5zdmNfcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfQUdHX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+YWdnX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1JFU09MVkVfTUFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmVzb2x2ZV9tYWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0NMQVNTSUZJRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfY2xhc3NpZmllcl9wYWNrKCZ0aGlzLT5jbGFzc2lmaWVyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9hY3Rpb25fcGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zbGFfcGFjaygmdGhpcy0+c2xhLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0NPT0tJRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTY0KGJ1ZiwgKHVpbnQ2NF90KSB0aGlzLT5jb29raWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1BSSU9SSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wcmlvcml0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfR1JPVVBfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+Z3JvdXBfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3RtX3F1ZXVlX3JlZl9wYWNrKCZ0aGlzLT5xdWV1ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9BQ0NFU1NfSU5UX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9ORVRXT1JLX0lOVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfU1VCX1RFUk1fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NVQl9URVJNX1VOSV9JRFgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NWQ19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9BR0dfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfUkVTT0xWRV9NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0NMQVNTSUZJRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtYmFsX2NsYXNzaWZpZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmNsYXNzaWZpZXIpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbWJhbF9hY3Rpb25fZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFjdGlvbik7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtYmFsX3NsYV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+c2xhKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0NPT0tJRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfUFJJT1JJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0dST1VQX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9RVUVVRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfY2ZnX2RhdGFfdW5wYWNrKGJjbWJhbF9mbG93X2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdGVfdW5wYWNrKCZ0aGlzLT5hZG1pbl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5vcGVyX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9BQ0NFU1NfSU5UX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+YWNjZXNzX2ludF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfTkVUV09SS19JTlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5uZXR3b3JrX2ludF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfU1VCX1RFUk1fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5zdWJfdGVybV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfU1VCX1RFUk1fVU5JX0lEWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5zdWJfdGVybV91bmlfaWR4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9TVkNfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPnN2Y19wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9BR0dfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmFnZ19wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9SRVNPTFZFX01BQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlc29sdmVfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9DTEFTU0lGSUVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2NsYXNzaWZpZXJfdW5wYWNrKCZ0aGlzLT5jbGFzc2lmaWVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zbGFfdW5wYWNrKCZ0aGlzLT5zbGEsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9DT09LSUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTY0KGJ1ZiwgKHVpbnQ2NF90ICopICZ0aGlzLT5jb29raWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1BSSU9SSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wcmlvcml0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfR1JPVVBfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5ncm91cF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfUVVFVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fcXVldWVfcmVmX3VucGFjaygmdGhpcy0+cXVldWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2NmZ19kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9BQ0NFU1NfSU5UX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfTkVUV09SS19JTlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9TVUJfVEVSTV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NVQl9URVJNX1VOSV9JRFgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9TVkNfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FHR19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfUkVTT0xWRV9NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9DTEFTU0lGSUVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2NsYXNzaWZpZXJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2FjdGlvbl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc2xhX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0NPT0tJRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1BSSU9SSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfR1JPVVBfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9RVUVVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9mbG93X2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX2Zsb3dfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWRtaW5fc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVEVfRE9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX1RFU1RJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9GTE9XX0NGR19JRF9BRE1JTl9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b3Blcl9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19VUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19ET1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX1RFU1RJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfTk9UX1BSRVNFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfTE9XRVJfTEFZRVJfRE9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19VTktOT1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfRkxPV19DRkdfSURfT1BFUl9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9DTEFTU0lGSUVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2NsYXNzaWZpZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5jbGFzc2lmaWVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX0NMQVNTSUZJRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9hY3Rpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5hY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfRkxPV19DRkdfSURfQUNUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0NGR19JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc2xhX2JvdW5kc19jaGVjaygmdGhpcy0+c2xhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX1NMQTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfUFJJT1JJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnByaW9yaXR5IDwgMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX1BSSU9SSVRZOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPnByaW9yaXR5ID4gMjU1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfRkxPV19DRkdfSURfUFJJT1JJVFk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfQ0ZHX0lEX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3RtX3F1ZXVlX3JlZl9ib3VuZHNfY2hlY2soJnRoaXMtPnF1ZXVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0ZMT1dfQ0ZHX0lEX1FVRVVFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9mbG93X3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21iYWxfZmxvd19zdGF0X2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcGFja2V0cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcGFja2V0cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfYnl0ZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfZmxvd19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19zdGF0X2RhdGFfdW5wYWNrKGJjbWJhbF9mbG93X3N0YXRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19zdGF0X2RhdGFfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfZmxvd19zdGF0X2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfZmxvd19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX2Zsb3dfaW5kX2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX2Zsb3dfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWRtaW5fc3RhdGUgPSAoYmNtYmFsX3N0YXRlKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b3Blcl9zdGF0dXMgPSAoYmNtYmFsX3N0YXR1cykgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0FDQ0VTU19JTlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWNjZXNzX2ludF9pZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9ORVRXT1JLX0lOVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXR3b3JrX2ludF9pZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9TVUJfVEVSTV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdWJfdGVybV9pZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9TVkNfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdmNfcG9ydF9pZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9BR0dfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hZ2dfcG9ydF9pZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9SRVNPTFZFX01BQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXNvbHZlX21hYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQkFTRV9UQ19JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iYXNlX3RjX2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0NMQVNTSUZJRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2xhc3NpZmllci5wcmVzZW5jZV9tYXNrID0gKGJjbWJhbF9jbGFzc2lmaWVyX2lkKSAwOworICAgICAgICB0aGlzLT5jbGFzc2lmaWVyLm9fdHBpZCA9IDA7CisgICAgICAgIHRoaXMtPmNsYXNzaWZpZXIub192aWQgPSAwOworICAgICAgICB0aGlzLT5jbGFzc2lmaWVyLmlfdHBpZCA9IDA7CisgICAgICAgIHRoaXMtPmNsYXNzaWZpZXIuaV92aWQgPSAwOworICAgICAgICB0aGlzLT5jbGFzc2lmaWVyLm9fcGJpdHMgPSAwOworICAgICAgICB0aGlzLT5jbGFzc2lmaWVyLmlfcGJpdHMgPSAwOworICAgICAgICB0aGlzLT5jbGFzc2lmaWVyLmV0aGVyX3R5cGUgPSAwOworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5jbGFzc2lmaWVyLmRzdF9tYWMpOworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5jbGFzc2lmaWVyLnNyY19tYWMpOworICAgICAgICB0aGlzLT5jbGFzc2lmaWVyLmlwX3Byb3RvID0gMDsKKyAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzX2luaXQoJnRoaXMtPmNsYXNzaWZpZXIuZHN0X2lwKTsKKyAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzX2luaXQoJnRoaXMtPmNsYXNzaWZpZXIuc3JjX2lwKTsKKyAgICAgICAgdGhpcy0+Y2xhc3NpZmllci5zcmNfcG9ydCA9IDA7CisgICAgICAgIHRoaXMtPmNsYXNzaWZpZXIuZHN0X3BvcnQgPSAwOworICAgICAgICB0aGlzLT5jbGFzc2lmaWVyLnBrdF90YWdfdHlwZSA9IChiY21iYWxfcGt0X3RhZ190eXBlKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFjdGlvbi5wcmVzZW5jZV9tYXNrID0gKGJjbWJhbF9hY3Rpb25faWQpIDA7CisgICAgICAgIHRoaXMtPmFjdGlvbi5jbWRzX2JpdG1hc2sgPSAoYmNtYmFsX2FjdGlvbl9jbWRfaWQpIDA7CisgICAgICAgIHRoaXMtPmFjdGlvbi5vX3ZpZCA9IDA7CisgICAgICAgIHRoaXMtPmFjdGlvbi5vX3BiaXRzID0gMDsKKyAgICAgICAgdGhpcy0+YWN0aW9uLm9fdHBpZCA9IDA7CisgICAgICAgIHRoaXMtPmFjdGlvbi5pX3ZpZCA9IDA7CisgICAgICAgIHRoaXMtPmFjdGlvbi5pX3BiaXRzID0gMDsKKyAgICAgICAgdGhpcy0+YWN0aW9uLmlfdHBpZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2xhLnByZXNlbmNlX21hc2sgPSAoYmNtYmFsX3NsYV9pZCkgMDsKKyAgICAgICAgdGhpcy0+c2xhLm1pbl9yYXRlID0gMDsKKyAgICAgICAgdGhpcy0+c2xhLm1heF9yYXRlID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0NPT0tJRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb29raWUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfUFJJT1JJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJpb3JpdHkgPSAxOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfaW5kX2RhdGFfcGFjayhjb25zdCBiY21iYWxfZmxvd19pbmRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3N0YXRlX3BhY2sodGhpcy0+YWRtaW5fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdHVzX3BhY2sodGhpcy0+b3Blcl9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQUNDRVNTX0lOVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+YWNjZXNzX2ludF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfTkVUV09SS19JTlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm5ldHdvcmtfaW50X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9TVUJfVEVSTV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c3ViX3Rlcm1faWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX1NWQ19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5zdmNfcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQUdHX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmFnZ19wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9SRVNPTFZFX01BQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJlc29sdmVfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9CQVNFX1RDX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5iYXNlX3RjX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9DTEFTU0lGSUVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2NsYXNzaWZpZXJfcGFjaygmdGhpcy0+Y2xhc3NpZmllciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYWN0aW9uX3BhY2soJnRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc2xhX3BhY2soJnRoaXMtPnNsYSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9DT09LSUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNvb2tpZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfUFJJT1JJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnByaW9yaXR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfZmxvd19pbmRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfZmxvd19pbmRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9BQ0NFU1NfSU5UX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9ORVRXT1JLX0lOVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfU1VCX1RFUk1fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX1NWQ19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9BR0dfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfUkVTT0xWRV9NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0JBU0VfVENfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0NMQVNTSUZJRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtYmFsX2NsYXNzaWZpZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmNsYXNzaWZpZXIpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbWJhbF9hY3Rpb25fZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFjdGlvbik7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtYmFsX3NsYV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+c2xhKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0NPT0tJRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfUFJJT1JJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2luZF9kYXRhX3VucGFjayhiY21iYWxfZmxvd19pbmRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3N0YXRlX3VucGFjaygmdGhpcy0+YWRtaW5fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdHVzX3VucGFjaygmdGhpcy0+b3Blcl9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQUNDRVNTX0lOVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+YWNjZXNzX2ludF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfTkVUV09SS19JTlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm5ldHdvcmtfaW50X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9TVUJfVEVSTV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c3ViX3Rlcm1faWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX1NWQ19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5zdmNfcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQUdHX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmFnZ19wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9SRVNPTFZFX01BQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlc29sdmVfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9CQVNFX1RDX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5iYXNlX3RjX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9DTEFTU0lGSUVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2NsYXNzaWZpZXJfdW5wYWNrKCZ0aGlzLT5jbGFzc2lmaWVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zbGFfdW5wYWNrKCZ0aGlzLT5zbGEsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9DT09LSUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNvb2tpZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfUFJJT1JJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnByaW9yaXR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2luZF9kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9BQ0NFU1NfSU5UX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfTkVUV09SS19JTlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9TVUJfVEVSTV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX1NWQ19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQUdHX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9SRVNPTFZFX01BQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0JBU0VfVENfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9DTEFTU0lGSUVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2NsYXNzaWZpZXJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2FjdGlvbl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc2xhX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0NPT0tJRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX1BSSU9SSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19pbmRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2Zsb3dfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfZmxvd19pbmRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hZG1pbl9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVEVfVVA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFURV9ET1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVEVfVEVTVElORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0ZMT1dfSU5EX0lEX0FETUlOX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vcGVyX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX0RPV046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfVEVTVElORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19OT1RfUFJFU0VOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19MT1dFUl9MQVlFUl9ET1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX1VOS05PV046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9GTE9XX0lORF9JRF9PUEVSX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX0NMQVNTSUZJRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfY2xhc3NpZmllcl9ib3VuZHNfY2hlY2soJnRoaXMtPmNsYXNzaWZpZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfRkxPV19JTkRfSURfQ0xBU1NJRklFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfRkxPV19JTkRfSURfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2FjdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPmFjdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9GTE9XX0lORF9JRF9BQ1RJT047CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0ZMT1dfSU5EX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zbGFfYm91bmRzX2NoZWNrKCZ0aGlzLT5zbGEpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfRkxPV19JTkRfSURfU0xBOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9GTE9XX0lORF9JRF9QUklPUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cHJpb3JpdHkgPCAxKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfRkxPV19JTkRfSURfUFJJT1JJVFk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+cHJpb3JpdHkgPiAyNTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9GTE9XX0lORF9JRF9QUklPUklUWTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfZ3JvdXBfa2V5X3NldF9kZWZhdWx0KGJjbWJhbF9ncm91cF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfS0VZX0lEX0dST1VQX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdyb3VwX2lkID0gKGJjbWJhbF9ncm91cF9pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9rZXlfcGFjayhjb25zdCBiY21iYWxfZ3JvdXBfa2V5ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfS0VZX0lEX0dST1VQX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmdyb3VwX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfZ3JvdXBfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9ncm91cF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0dST1VQX0tFWV9JRF9HUk9VUF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX2tleV91bnBhY2soYmNtYmFsX2dyb3VwX2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0dST1VQX0tFWV9JRF9HUk9VUF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmdyb3VwX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9rZXlfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfS0VZX0lEX0dST1VQX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfZ3JvdXBfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX2dyb3VwX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9ncm91cF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21iYWxfZ3JvdXBfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlNfQ01EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1lbWJlcnNfY21kID0gKGJjbWJhbF9ncm91cF9tZW1iZXJfY21kKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWVtYmVycy5sZW4gPSAwOworICAgICAgICB0aGlzLT5tZW1iZXJzLnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9HUk9VUF9DRkdfSURfQ09PS0lFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNvb2tpZSA9IChiY21iYWxfY29va2llKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX0ZMT1dTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmZsb3dzLnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9HUk9VUF9DRkdfSURfT1dORVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b3duZXIgPSBCQ01CQUxfR1JPVVBfT1dORVJfTk9ORTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9ncm91cF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0dST1VQX0NGR19JRF9NRU1CRVJTX0NNRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9ncm91cF9tZW1iZXJfY21kX3BhY2sodGhpcy0+bWVtYmVyc19jbWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTZfcGFjaygmdGhpcy0+bWVtYmVycywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9HUk9VUF9DRkdfSURfQ09PS0lFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91NjQoYnVmLCAodWludDY0X3QpIHRoaXMtPmNvb2tpZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX0ZMT1dTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2Zsb3dfaWRfbGlzdF91MzJfcGFjaygmdGhpcy0+Zmxvd3MsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX09XTkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2dyb3VwX293bmVyX3BhY2sodGhpcy0+b3duZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX2dyb3VwX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9ncm91cF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlNfQ01EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9HUk9VUF9DRkdfSURfTUVNQkVSUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPm1lbWJlcnMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX0NPT0tJRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX0ZMT1dTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5mbG93cyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9HUk9VUF9DRkdfSURfT1dORVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9jZmdfZGF0YV91bnBhY2soYmNtYmFsX2dyb3VwX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlNfQ01EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2dyb3VwX21lbWJlcl9jbWRfdW5wYWNrKCZ0aGlzLT5tZW1iZXJzX2NtZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9HUk9VUF9DRkdfSURfTUVNQkVSUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNl91bnBhY2soJnRoaXMtPm1lbWJlcnMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9HUk9VUF9DRkdfSURfQ09PS0lFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U2NChidWYsICh1aW50NjRfdCAqKSAmdGhpcy0+Y29va2llKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9HUk9VUF9DRkdfSURfRkxPV1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfZmxvd19pZF9saXN0X3UzMl91bnBhY2soJnRoaXMtPmZsb3dzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX09XTkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2dyb3VwX293bmVyX3VucGFjaygmdGhpcy0+b3duZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfY2ZnX2RhdGFfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlNfQ01EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfR1JPVVBfQ0ZHX0lEX0NPT0tJRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0dST1VQX0NGR19JRF9GTE9XUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9mbG93X2lkX2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0dST1VQX0NGR19JRF9PV05FUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfZ3JvdXBfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfZ3JvdXBfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0dST1VQX0NGR19JRF9NRU1CRVJTX0NNRCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm1lbWJlcnNfY21kKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9HUk9VUF9NRU1CRVJfQ01EX0FERF9NRU1CRVJTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfR1JPVVBfTUVNQkVSX0NNRF9SRU1fTUVNQkVSUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0dST1VQX01FTUJFUl9DTURfU0VUX01FTUJFUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9HUk9VUF9DRkdfSURfTUVNQkVSU19DTUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9HUk9VUF9DRkdfSURfTUVNQkVSUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNl9ib3VuZHNfY2hlY2soJnRoaXMtPm1lbWJlcnMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfR1JPVVBfQ0ZHX0lEX01FTUJFUlM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0dST1VQX0NGR19JRF9GTE9XUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9mbG93X2lkX2xpc3RfdTMyX2JvdW5kc19jaGVjaygmdGhpcy0+Zmxvd3MpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfR1JPVVBfQ0ZHX0lEX0ZMT1dTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9HUk9VUF9DRkdfSURfT1dORVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vd25lcikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfR1JPVVBfT1dORVJfTk9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0dST1VQX09XTkVSX01VTFRJQ0FTVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0dST1VQX09XTkVSX1VOSUNBU1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9HUk9VUF9DRkdfSURfT1dORVI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9pbnRlcmZhY2Vfa2V5X3NldF9kZWZhdWx0KGJjbWJhbF9pbnRlcmZhY2Vfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfSU5URl9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbnRmX2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfSU5URl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmludGZfdHlwZSA9IEJDTUJBTF9JTlRGX1RZUEVfTk5JOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9rZXlfcGFjayhjb25zdCBiY21iYWxfaW50ZXJmYWNlX2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfSU5URl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW50Zl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0tFWV9JRF9JTlRGX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfaW50Zl90eXBlX3BhY2sodGhpcy0+aW50Zl90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9pbnRlcmZhY2Vfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2Vfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX0lOVEZfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfSU5URl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX2tleV91bnBhY2soYmNtYmFsX2ludGVyZmFjZV9rZXkgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX0lOVEZfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmludGZfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfSU5URl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2ludGZfdHlwZV91bnBhY2soJnRoaXMtPmludGZfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2Vfa2V5X3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfSU5URl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9LRVlfSURfSU5URl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2ludGVyZmFjZV9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfaW50ZXJmYWNlX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX0lOVEZfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmludGZfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfSU5URl9UWVBFX05OSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0lOVEZfVFlQRV9QT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9JTlRFUkZBQ0VfS0VZX0lEX0lOVEZfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWRtaW5fc3RhdGUgPSAoYmNtYmFsX3N0YXRlKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vcGVyX3N0YXR1cyA9IChiY21iYWxfc3RhdHVzKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9NSU5fREFUQV9BR0dfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5taW5fZGF0YV9hZ2dfcG9ydF9pZCA9IChiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfTUlOX0RBVEFfU1ZDX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWluX2RhdGFfc3ZjX3BvcnRfaWQgPSAoYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl90eXBlID0gQkNNQkFMX1RSWF9UWVBFX0dQT05fU1BTXzQzXzQ4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9EU19NSVNTX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHNfbWlzc19tb2RlID0gQkNNQkFMX0RTX01JU1NfTU9ERV9ESVNDQVJEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9NVFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXR1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfY29udHJvbCA9IEJDTUJBTF9DT05UUk9MX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0RTX1RNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRzX3RtID0gKGJjbWJhbF90bV9zY2hlZF9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dXNfdG0gPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9TVUJfVEVSTV9JRF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN1Yl90ZXJtX2lkX2xpc3QubGVuID0gMDsKKyAgICAgICAgdGhpcy0+c3ViX3Rlcm1faWRfbGlzdC52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3N0YXRlX3BhY2sodGhpcy0+YWRtaW5fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zdGF0dXNfcGFjayh0aGlzLT5vcGVyX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX01JTl9EQVRBX0FHR19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm1pbl9kYXRhX2FnZ19wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX01JTl9EQVRBX1NWQ19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm1pbl9kYXRhX3N2Y19wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdHJ4X3R5cGVfcGFjayh0aGlzLT50cmFuc2NlaXZlcl90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfRFNfTUlTU19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2RzX21pc3NfbW9kZV9wYWNrKHRoaXMtPmRzX21pc3NfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX01UVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bXR1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9jb250cm9sX3BhY2sodGhpcy0+Zmxvd19jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfRFNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+ZHNfdG0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+dXNfdG0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfU1VCX1RFUk1fSURfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zdWJfaWRfbGlzdF91MTZfcGFjaygmdGhpcy0+c3ViX3Rlcm1faWRfbGlzdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfTUlOX0RBVEFfQUdHX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfTUlOX0RBVEFfU1ZDX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9EU19NSVNTX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfTVRVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9EU19UTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9VU19UTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9TVUJfVEVSTV9JRF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbWJhbF9zdWJfaWRfbGlzdF91MTZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnN1Yl90ZXJtX2lkX2xpc3QpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YV91bnBhY2soYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdGVfdW5wYWNrKCZ0aGlzLT5hZG1pbl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3N0YXR1c191bnBhY2soJnRoaXMtPm9wZXJfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfTUlOX0RBVEFfQUdHX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5taW5fZGF0YV9hZ2dfcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9NSU5fREFUQV9TVkNfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm1pbl9kYXRhX3N2Y19wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdHJ4X3R5cGVfdW5wYWNrKCZ0aGlzLT50cmFuc2NlaXZlcl90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfRFNfTUlTU19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2RzX21pc3NfbW9kZV91bnBhY2soJnRoaXMtPmRzX21pc3NfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX01UVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXR1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9jb250cm9sX3VucGFjaygmdGhpcy0+Zmxvd19jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfRFNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5kc190bSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9VU19UTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnVzX3RtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX1NVQl9URVJNX0lEX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3ViX2lkX2xpc3RfdTE2X3VucGFjaygmdGhpcy0+c3ViX3Rlcm1faWRfbGlzdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfTUlOX0RBVEFfQUdHX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX01JTl9EQVRBX1NWQ19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9EU19NSVNTX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX01UVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9EU19UTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX1NVQl9URVJNX0lEX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3ViX2lkX2xpc3RfdTE2X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hZG1pbl9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVEVfVVA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFURV9ET1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVEVfVEVTVElORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfQURNSU5fU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b3Blcl9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19VUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19ET1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX1RFU1RJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfTk9UX1BSRVNFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfTE9XRVJfTEFZRVJfRE9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19VTktOT1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9PUEVSX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnRyYW5zY2VpdmVyX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RSWF9UWVBFX0dQT05fU1BTXzQzXzQ4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVFJYX1RZUEVfR1BPTl9TUFNfU09HXzQzMjE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UUlhfVFlQRV9HUE9OX0xURV8zNjgwX006CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UUlhfVFlQRV9HUE9OX1NPVVJDRV9QSE9UT05JQ1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UUlhfVFlQRV9HUE9OX0xURV8zNjgwX1A6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UUlhfVFlQRV9YR1BPTl9MVEhfNzIyMl9QQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RSWF9UWVBFX1hHUE9OX0xUSF83MjI2X1BDOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVFJYX1RZUEVfWEdQT05fTFRIXzUzMDJfUEM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX0RTX01JU1NfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmRzX21pc3NfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRFNfTUlTU19NT0RFX0RJU0NBUkQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9EU19NSVNTX01PREVfQlJPQURDQVNUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRFNfTUlTU19NT0RFX1ZJRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0lOVEVSRkFDRV9DRkdfSURfRFNfTUlTU19NT0RFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9GTE9XX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mbG93X2NvbnRyb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0NPTlRST0xfRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0NPTlRST0xfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfSU5URVJGQUNFX0NGR19JRF9GTE9XX0NPTlRST0w7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX1NVQl9URVJNX0lEX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3ViX2lkX2xpc3RfdTE2X2JvdW5kc19jaGVjaygmdGhpcy0+c3ViX3Rlcm1faWRfbGlzdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX1NVQl9URVJNX0lEX0xJU1Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wYWNrZXRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcGFja2V0cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9ieXRlcyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhX3VucGFjayhiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YV9zZXRfZGVmYXVsdChiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWRtaW5fc3RhdGUgPSAoYmNtYmFsX3N0YXRlKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vcGVyX3N0YXR1cyA9IChiY21iYWxfc3RhdHVzKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9NSU5fREFUQV9BR0dfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5taW5fZGF0YV9hZ2dfcG9ydF9pZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01JTl9EQVRBX1NWQ19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1pbl9kYXRhX3N2Y19wb3J0X2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfVFJBTlNDRUlWRVJfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl90eXBlID0gQkNNQkFMX1RSWF9UWVBFX0dQT05fU1BTXzQzXzQ4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19NSVNTX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHNfbWlzc19tb2RlID0gQkNNQkFMX0RTX01JU1NfTU9ERV9ESVNDQVJEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9NVFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXR1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfY29udHJvbCA9IEJDTUJBTF9DT05UUk9MX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX0RTX1RNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRzX3RtID0gKGJjbWJhbF90bV9zY2hlZF9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dXNfdG0gPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3N0YXRlX3BhY2sodGhpcy0+YWRtaW5fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zdGF0dXNfcGFjayh0aGlzLT5vcGVyX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01JTl9EQVRBX0FHR19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5taW5fZGF0YV9hZ2dfcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9NSU5fREFUQV9TVkNfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWluX2RhdGFfc3ZjX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfVFJBTlNDRUlWRVJfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90cnhfdHlwZV9wYWNrKHRoaXMtPnRyYW5zY2VpdmVyX3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19NSVNTX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfZHNfbWlzc19tb2RlX3BhY2sodGhpcy0+ZHNfbWlzc19tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfTVRVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tdHUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2NvbnRyb2xfcGFjayh0aGlzLT5mbG93X2NvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19UTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5kc190bSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9VU19UTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT51c190bSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01JTl9EQVRBX0FHR19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01JTl9EQVRBX1NWQ19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfRFNfTUlTU19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01UVSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9GTE9XX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfRFNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGFfdW5wYWNrKGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3N0YXRlX3VucGFjaygmdGhpcy0+YWRtaW5fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5vcGVyX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01JTl9EQVRBX0FHR19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5taW5fZGF0YV9hZ2dfcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9NSU5fREFUQV9TVkNfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bWluX2RhdGFfc3ZjX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfVFJBTlNDRUlWRVJfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90cnhfdHlwZV91bnBhY2soJnRoaXMtPnRyYW5zY2VpdmVyX3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19NSVNTX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfZHNfbWlzc19tb2RlX3VucGFjaygmdGhpcy0+ZHNfbWlzc19tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfTVRVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tdHUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2NvbnRyb2xfdW5wYWNrKCZ0aGlzLT5mbG93X2NvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19UTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmRzX3RtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX1VTX1RNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+dXNfdG0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfTUlOX0RBVEFfQUdHX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01JTl9EQVRBX1NWQ19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19NSVNTX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX01UVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19UTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfaW50ZXJmYWNlX2luZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWRtaW5fc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVEVfRE9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX1RFU1RJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX0FETUlOX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm9wZXJfc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfVVA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfRE9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19URVNUSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX05PVF9QUkVTRU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX0xPV0VSX0xBWUVSX0RPV046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfT1BFUl9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50cmFuc2NlaXZlcl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UUlhfVFlQRV9HUE9OX1NQU180M180ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RSWF9UWVBFX0dQT05fU1BTX1NPR180MzIxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVFJYX1RZUEVfR1BPTl9MVEVfMzY4MF9NOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVFJYX1RZUEVfR1BPTl9TT1VSQ0VfUEhPVE9OSUNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVFJYX1RZUEVfR1BPTl9MVEVfMzY4MF9QOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVFJYX1RZUEVfWEdQT05fTFRIXzcyMjJfUEM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UUlhfVFlQRV9YR1BPTl9MVEhfNzIyNl9QQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RSWF9UWVBFX1hHUE9OX0xUSF81MzAyX1BDOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9UUkFOU0NFSVZFUl9UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfSU5URVJGQUNFX0lORF9JRF9EU19NSVNTX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kc19taXNzX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0RTX01JU1NfTU9ERV9ESVNDQVJEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRFNfTUlTU19NT0RFX0JST0FEQ0FTVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0RTX01JU1NfTU9ERV9WSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9JTlRFUkZBQ0VfSU5EX0lEX0RTX01JU1NfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Zmxvd19jb250cm9sKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9DT05UUk9MX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9DT05UUk9MX0VOQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX0lOVEVSRkFDRV9JTkRfSURfRkxPV19DT05UUk9MOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfcGFja2V0X2tleV9zZXRfZGVmYXVsdChiY21iYWxfcGFja2V0X2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc2VydmVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9LRVlfSURfUEFDS0VUX1NFTkRfREVTVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wYWNrZXRfc2VuZF9kZXN0LnR5cGUgPSAoYmNtYmFsX2Rlc3RfdHlwZSkgMDsKKyAgICAgICAgdGhpcy0+cGFja2V0X3NlbmRfZGVzdC51Lm5uaS5pbnRfaWQgPSAoYmNtYmFsX2ludGZfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2tleV9wYWNrKGNvbnN0IGJjbWJhbF9wYWNrZXRfa2V5ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9LRVlfSURfUEFDS0VUX1NFTkRfREVTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9kZXN0X3BhY2soJnRoaXMtPnBhY2tldF9zZW5kX2Rlc3QsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3BhY2tldF9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3BhY2tldF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9LRVlfSURfUEFDS0VUX1NFTkRfREVTVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21iYWxfZGVzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+cGFja2V0X3NlbmRfZGVzdCk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2tleV91bnBhY2soYmNtYmFsX3BhY2tldF9rZXkgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZXNlcnZlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0tFWV9JRF9QQUNLRVRfU0VORF9ERVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2Rlc3RfdW5wYWNrKCZ0aGlzLT5wYWNrZXRfc2VuZF9kZXN0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2tleV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0tFWV9JRF9QQUNLRVRfU0VORF9ERVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2Rlc3Rfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3BhY2tldF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfcGFja2V0X2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfS0VZX0lEX1BBQ0tFVF9TRU5EX0RFU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfZGVzdF9ib3VuZHNfY2hlY2soJnRoaXMtPnBhY2tldF9zZW5kX2Rlc3QpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfUEFDS0VUX0tFWV9JRF9QQUNLRVRfU0VORF9ERVNUOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX3BhY2tldF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Zmxvd19pZCA9IChiY21iYWxfZmxvd19pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfdHlwZSA9IChiY21iYWxfZmxvd190eXBlKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0NGR19JRF9JTlRGX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmludGZfaWQgPSAoYmNtYmFsX2ludGZfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0lOVEZfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbnRmX3R5cGUgPSBCQ01CQUxfSU5URl9UWVBFX05OSTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfU1ZDX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3ZjX3BvcnQgPSAoYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19DT09LSUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Zmxvd19jb29raWUgPSAoYmNtYmFsX2Nvb2tpZSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfUEtUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBrdC5sZW4gPSAwOworICAgICAgICB0aGlzLT5wa3QudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21iYWxfcGFja2V0X2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0NGR19JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2Zsb3dfdHlwZV9wYWNrKHRoaXMtPmZsb3dfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0lOVEZfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+aW50Zl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0NGR19JRF9JTlRGX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfaW50Zl90eXBlX3BhY2sodGhpcy0+aW50Zl90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfU1ZDX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+c3ZjX3BvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19DT09LSUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsICh1aW50NjRfdCkgdGhpcy0+Zmxvd19jb29raWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfUEtUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3U4X2xpc3RfdTMyX3BhY2soJnRoaXMtPnBrdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfcGFja2V0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0NGR19JRF9GTE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfSU5URl9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0NGR19JRF9JTlRGX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfU1ZDX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19DT09LSUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfUEtUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbWJhbF91OF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+cGt0KTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGFfdW5wYWNrKGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5mbG93X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0ZMT1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9mbG93X3R5cGVfdW5wYWNrKCZ0aGlzLT5mbG93X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0NGR19JRF9JTlRGX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+aW50Zl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0NGR19JRF9JTlRGX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfaW50Zl90eXBlX3VucGFjaygmdGhpcy0+aW50Zl90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfU1ZDX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5zdmNfcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0NGR19JRF9GTE9XX0NPT0tJRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91NjQoYnVmLCAodWludDY0X3QgKikgJnRoaXMtPmZsb3dfY29va2llKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX1BLVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF91OF9saXN0X3UzMl91bnBhY2soJnRoaXMtPnBrdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BhY2tldF9jZmdfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0ZMT1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfSU5URl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfSU5URl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0NGR19JRF9TVkNfUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19DT09LSUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX1BLVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF91OF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfcGFja2V0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX0ZMT1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZsb3dfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX1VQU1RSRUFNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX0RPV05TVFJFQU06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9GTE9XX1RZUEVfQlJPQURDQVNUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX01VTFRJQ0FTVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX1BBQ0tFVF9DRkdfSURfRkxPV19UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0NGR19JRF9JTlRGX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5pbnRmX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0lOVEZfVFlQRV9OTkk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9JTlRGX1RZUEVfUE9OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfUEFDS0VUX0NGR19JRF9JTlRGX1RZUEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX1BLVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF91OF9saXN0X3UzMl9ib3VuZHNfY2hlY2soJnRoaXMtPnBrdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9QQUNLRVRfQ0ZHX0lEX1BLVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfcGFja2V0X2luZF9kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF9wYWNrZXRfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfaWQgPSAoYmNtYmFsX2Zsb3dfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0ZMT1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mbG93X3R5cGUgPSAoYmNtYmFsX2Zsb3dfdHlwZSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbnRmX2lkID0gKGJjbWJhbF9pbnRmX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0lORF9JRF9JTlRGX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+aW50Zl90eXBlID0gQkNNQkFMX0lOVEZfVFlQRV9OTkk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX1NWQ19QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN2Y19wb3J0ID0gKGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0ZMT1dfQ09PS0lFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfY29va2llID0gKGJjbWJhbF9jb29raWUpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX1BLVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wa3QubGVuID0gMDsKKyAgICAgICAgdGhpcy0+cGt0LnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2luZF9kYXRhX3BhY2soY29uc3QgYmNtYmFsX3BhY2tldF9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9JTkRfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5mbG93X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0ZMT1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9mbG93X3R5cGVfcGFjayh0aGlzLT5mbG93X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0lORF9JRF9JTlRGX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmludGZfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2ludGZfdHlwZV9wYWNrKHRoaXMtPmludGZfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX1NWQ19QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnN2Y19wb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0ZMT1dfQ09PS0lFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91NjQoYnVmLCAodWludDY0X3QpIHRoaXMtPmZsb3dfY29va2llKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX1BLVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF91OF9saXN0X3UzMl9wYWNrKCZ0aGlzLT5wa3QsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3BhY2tldF9pbmRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfcGFja2V0X2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9JTkRfSURfRkxPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0lOVEZfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX1NWQ19QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0ZMT1dfQ09PS0lFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX1BLVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21iYWxfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnBrdCk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2luZF9kYXRhX3VucGFjayhiY21iYWxfcGFja2V0X2luZF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+Zmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfZmxvd190eXBlX3VucGFjaygmdGhpcy0+Zmxvd190eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmludGZfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2ludGZfdHlwZV91bnBhY2soJnRoaXMtPmludGZfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX1NWQ19QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+c3ZjX3BvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9JTkRfSURfRkxPV19DT09LSUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTY0KGJ1ZiwgKHVpbnQ2NF90ICopICZ0aGlzLT5mbG93X2Nvb2tpZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0lORF9JRF9QS1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5wa3QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfaW5kX2RhdGFfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0lOVEZfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0lOVEZfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9JTkRfSURfU1ZDX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0ZMT1dfQ09PS0lFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0lORF9JRF9QS1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdThfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2luZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfcGFja2V0X2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX3BhY2tldF9pbmRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0lORF9JRF9GTE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mbG93X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0ZMT1dfVFlQRV9VUFNUUkVBTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0ZMT1dfVFlQRV9ET1dOU1RSRUFNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfRkxPV19UWVBFX0JST0FEQ0FTVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX0ZMT1dfVFlQRV9NVUxUSUNBU1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9QQUNLRVRfSU5EX0lEX0ZMT1dfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+aW50Zl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9JTlRGX1RZUEVfTk5JOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfSU5URl9UWVBFX1BPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX1BBQ0tFVF9JTkRfSURfSU5URl9UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfUEFDS0VUX0lORF9JRF9QS1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5wa3QpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfUEFDS0VUX0lORF9JRF9QS1Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X3NldF9kZWZhdWx0KGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0tFWV9JRF9TVUJfVEVSTV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdWJfdGVybV9pZCA9IChiY21iYWxfc3ViX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfSU5URl9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbnRmX2lkID0gKGJjbWJhbF9pbnRmX2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X3BhY2soY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfU1VCX1RFUk1fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+c3ViX3Rlcm1faWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfS0VZX0lEX0lOVEZfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+aW50Zl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfU1VCX1RFUk1fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfS0VZX0lEX0lOVEZfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV91bnBhY2soYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfU1VCX1RFUk1fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5zdWJfdGVybV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfSU5URl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmludGZfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfS0VZX0lEX1NVQl9URVJNX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9LRVlfSURfSU5URl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hZG1pbl9zdGF0ZSA9IChiY21iYWxfc3RhdGUpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vcGVyX3N0YXR1cyA9IChiY21iYWxfc3RhdHVzKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQsIDAsIHNpemVvZih0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCkpOworICAgICAgICBtZW1zZXQodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMsIDAsIHNpemVvZih0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYykpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfUEFTU1dPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnBhc3N3b3JkLmFyciwgMCwgc2l6ZW9mKHRoaXMtPnBhc3N3b3JkLmFycikpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWdpc3RyYXRpb25faWQuYXJyLCAwLCBzaXplb2YodGhpcy0+cmVnaXN0cmF0aW9uX2lkLmFycikpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfU1ZDX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3ZjX3BvcnRfaWQgPSAoYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzX2luaXQoJnRoaXMtPm1hY19hZGRyZXNzKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX0RTX1RNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRzX3RtID0gKGJjbWJhbF90bV9zY2hlZF9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1VTX1RNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVzX3RtID0gKGJjbWJhbF90bV9zY2hlZF9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1NWQ19QT1JUX0lEX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3ZjX3BvcnRfaWRfbGlzdC5sZW4gPSAwOworICAgICAgICB0aGlzLT5zdmNfcG9ydF9pZF9saXN0LnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9BR0dfUE9SVF9JRF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFnZ19wb3J0X2lkX2xpc3QubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YWdnX3BvcnRfaWRfbGlzdC52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3N0YXRlX3BhY2sodGhpcy0+YWRtaW5fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdHVzX3BhY2sodGhpcy0+b3Blcl9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zZXJpYWxfbnVtYmVyX3BhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfUEFTU1dPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfcGFzc3dvcmRfcGFjaygmdGhpcy0+cGFzc3dvcmQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZF9wYWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25faWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfU1ZDX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+c3ZjX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9EU19UTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5kc190bSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+dXNfdG0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1NWQ19QT1JUX0lEX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdThfcGFjaygmdGhpcy0+c3ZjX3BvcnRfaWRfbGlzdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9BR0dfUE9SVF9JRF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OF9wYWNrKCZ0aGlzLT5hZ2dfcG9ydF9pZF9saXN0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDM2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfU1ZDX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9EU19UTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1NWQ19QT1JUX0lEX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5zdmNfcG9ydF9pZF9saXN0KTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX0FHR19QT1JUX0lEX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YWdnX3BvcnRfaWRfbGlzdCk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YV91bnBhY2soYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zdGF0ZV91bnBhY2soJnRoaXMtPmFkbWluX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3N0YXR1c191bnBhY2soJnRoaXMtPm9wZXJfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc2VyaWFsX251bWJlcl91bnBhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9wYXNzd29yZF91bnBhY2soJnRoaXMtPnBhc3N3b3JkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZF91bnBhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1NWQ19QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+c3ZjX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9EU19UTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmRzX3RtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9VU19UTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnVzX3RtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TVkNfUE9SVF9JRF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4X3VucGFjaygmdGhpcy0+c3ZjX3BvcnRfaWRfbGlzdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX0FHR19QT1JUX0lEX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4X3VucGFjaygmdGhpcy0+YWdnX3BvcnRfaWRfbGlzdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGFfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDEwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAzNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfU1ZDX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX0RTX1RNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TVkNfUE9SVF9JRF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX0FHR19QT1JUX0lEX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWRtaW5fc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVEVfRE9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX1RFU1RJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9BRE1JTl9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b3Blcl9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19VUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19ET1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX1RFU1RJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfTk9UX1BSRVNFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfTE9XRVJfTEFZRVJfRE9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19VTktOT1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfT1BFUl9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3NlcmlhbF9udW1iZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1NFUklBTF9OVU1CRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3Bhc3N3b3JkX2JvdW5kc19jaGVjaygmdGhpcy0+cGFzc3dvcmQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfUEFTU1dPUkQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9yZWdpc3RyYXRpb25faWRfYm91bmRzX2NoZWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25faWQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfUkVHSVNUUkFUSU9OX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TVkNfUE9SVF9JRF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4X2JvdW5kc19jaGVjaygmdGhpcy0+c3ZjX3BvcnRfaWRfbGlzdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TVkNfUE9SVF9JRF9MSVNUOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9BR0dfUE9SVF9JRF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OF9ib3VuZHNfY2hlY2soJnRoaXMtPmFnZ19wb3J0X2lkX2xpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfQUdHX1BPUlRfSURfTElTVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2J5dGVzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhX3VucGFjayhiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFkbWluX3N0YXRlID0gKGJjbWJhbF9zdGF0ZSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9wZXJfc3RhdHVzID0gKGJjbWJhbF9zdGF0dXMpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCwgMCwgc2l6ZW9mKHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkKSk7CisgICAgICAgIG1lbXNldCh0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYywgMCwgc2l6ZW9mKHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+cGFzc3dvcmQuYXJyLCAwLCBzaXplb2YodGhpcy0+cGFzc3dvcmQuYXJyKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnJlZ2lzdHJhdGlvbl9pZC5hcnIsIDAsIHNpemVvZih0aGlzLT5yZWdpc3RyYXRpb25faWQuYXJyKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9TVkNfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdmNfcG9ydF9pZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5tYWNfYWRkcmVzcyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9EU19UTSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kc190bSA9IChiY21iYWxfdG1fc2NoZWRfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9VU19UTSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51c190bSA9IChiY21iYWxfdG1fc2NoZWRfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfQURNSU5fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdGVfcGFjayh0aGlzLT5hZG1pbl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9PUEVSX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zdGF0dXNfcGFjayh0aGlzLT5vcGVyX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9wYXNzd29yZF9wYWNrKCZ0aGlzLT5wYXNzd29yZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfcmVnaXN0cmF0aW9uX2lkX3BhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9TVkNfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+c3ZjX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9EU19UTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5kc190bSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+dXNfdG0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDM2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfU1ZDX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9EU19UTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhX3VucGFjayhiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3N0YXRlX3VucGFjaygmdGhpcy0+YWRtaW5fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfT1BFUl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfc3RhdHVzX3VucGFjaygmdGhpcy0+b3Blcl9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9zZXJpYWxfbnVtYmVyX3VucGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3Bhc3N3b3JkX3VucGFjaygmdGhpcy0+cGFzc3dvcmQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfcmVnaXN0cmF0aW9uX2lkX3VucGFjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2lkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfU1ZDX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnN2Y19wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfRFNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5kc190bSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfVVNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT51c190bSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMTApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDM2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9TVkNfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfRFNfVE0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9VU19UTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX0FETUlOX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWRtaW5fc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVEVfRE9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRFX1RFU1RJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9BRE1JTl9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX09QRVJfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b3Blcl9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19VUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19ET1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfU1RBVFVTX1RFU1RJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfTk9UX1BSRVNFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9TVEFUVVNfTE9XRVJfTEFZRVJfRE9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1NUQVRVU19VTktOT1dOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfT1BFUl9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3NlcmlhbF9udW1iZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1NFUklBTF9OVU1CRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3Bhc3N3b3JkX2JvdW5kc19jaGVjaygmdGhpcy0+cGFzc3dvcmQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfUEFTU1dPUkQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1NVQlNDUklCRVJfVEVSTUlOQUxfSU5EX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9yZWdpc3RyYXRpb25faWRfYm91bmRzX2NoZWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25faWQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9JTkRfSURfUkVHSVNUUkFUSU9OX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF90bV9xdWV1ZV9rZXlfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3F1ZXVlX2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2NoZWRfaWQgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX1NDSEVEX0RJUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zY2hlZF9kaXIgPSAoYmNtYmFsX3RtX3NjaGVkX2RpcikgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pZCA9IChiY21iYWxfdG1fcXVldWVfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfa2V5X3BhY2soY29uc3QgYmNtYmFsX3RtX3F1ZXVlX2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9TQ0hFRF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5zY2hlZF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX1NDSEVEX0RJUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9kaXJfcGFjayh0aGlzLT5zY2hlZF9kaXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3RtX3F1ZXVlX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfdG1fcXVldWVfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9TQ0hFRF9ESVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2tleV91bnBhY2soYmNtYmFsX3RtX3F1ZXVlX2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0tFWV9JRF9TQ0hFRF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnNjaGVkX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfRElSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3RtX3NjaGVkX2Rpcl91bnBhY2soJnRoaXMtPnNjaGVkX2RpciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+aWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2tleV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfRElSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfS0VZX0lEX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fcXVldWVfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX3RtX3F1ZXVlX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfRElSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c2NoZWRfZGlyKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9ESVJfVVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9ESVJfRFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9UTV9RVUVVRV9LRVlfSURfU0NIRURfRElSOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9QUklPUklUWSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcmlvcml0eSA9IChiY21iYWxfdG1fcHJpb3JpdHkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfV0VJR0hUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPndlaWdodCA9IChiY21iYWxfdG1fd2VpZ2h0KSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmF0ZS5wcmVzZW5jZV9tYXNrID0gKGJjbWJhbF90bV9zaGFwaW5nX2lkKSAwOworICAgICAgICB0aGlzLT5yYXRlLnNiciA9IDA7CisgICAgICAgIHRoaXMtPnJhdGUucGJyID0gMDsKKyAgICAgICAgdGhpcy0+cmF0ZS5idXJzdCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfQkFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJhYy50eXBlID0gQkNNQkFMX1RNX0JBQ19UWVBFX1RBSUxEUk9QOworICAgICAgICB0aGlzLT5iYWMudS50YWlsZHJvcC5tYXhfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfQ1JFQVRJT05fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jcmVhdGlvbl9tb2RlID0gQkNNQkFMX1RNX0NSRUFUSU9OX01PREVfTUFOVUFMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1JFRl9DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZWZfY291bnQgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1BSSU9SSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5wcmlvcml0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1dFSUdIVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+d2VpZ2h0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zaGFwaW5nX3BhY2soJnRoaXMtPnJhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX0JBQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9iYWNfcGFjaygmdGhpcy0+YmFjLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9DUkVBVElPTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3RtX2NyZWF0aW9uX21vZGVfcGFjayh0aGlzLT5jcmVhdGlvbl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9SRUZfQ09VTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmVmX2NvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfUFJJT1JJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9XRUlHSFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbWJhbF90bV9zaGFwaW5nX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5yYXRlKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9CQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtYmFsX3RtX2JhY19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YmFjKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9DUkVBVElPTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfUkVGX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGFfdW5wYWNrKGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9QUklPUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wcmlvcml0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1dFSUdIVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT53ZWlnaHQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3RtX3NoYXBpbmdfdW5wYWNrKCZ0aGlzLT5yYXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX0JBQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9iYWNfdW5wYWNrKCZ0aGlzLT5iYWMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfQ1JFQVRJT05fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9jcmVhdGlvbl9tb2RlX3VucGFjaygmdGhpcy0+Y3JlYXRpb25fbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfUkVGX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlZl9jb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGFfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1BSSU9SSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1dFSUdIVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3RtX3NoYXBpbmdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX0JBQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9iYWNfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX0NSRUFUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfUkVGX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fc2hhcGluZ19ib3VuZHNfY2hlY2soJnRoaXMtPnJhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1JBVEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9CQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fYmFjX2JvdW5kc19jaGVjaygmdGhpcy0+YmFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9CQUM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0NGR19JRF9DUkVBVElPTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y3JlYXRpb25fbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fQ1JFQVRJT05fTU9ERV9NQU5VQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9DUkVBVElPTl9NT0RFX0FVVE86CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfQ1JFQVRJT05fTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfUEFDS0VUU19PSykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wYWNrZXRzX29rID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfQllURVNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Ynl0ZXNfb2sgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9QQUNLRVRTX0RJU0NBUkRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wYWNrZXRzX2Rpc2NhcmRlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9TVEFUX0lEX0JZVEVTX0RJU0NBUkRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ieXRlc19kaXNjYXJkZWQgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9TVEFUX0lEX1BBQ0tFVFNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnBhY2tldHNfb2spKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfQllURVNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJ5dGVzX29rKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9TVEFUX0lEX1BBQ0tFVFNfRElTQ0FSREVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5wYWNrZXRzX2Rpc2NhcmRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9CWVRFU19ESVNDQVJERUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJ5dGVzX2Rpc2NhcmRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9TVEFUX0lEX1BBQ0tFVFNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfQllURVNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfUEFDS0VUU19ESVNDQVJERUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfQllURVNfRElTQ0FSREVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhX3VucGFjayhiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9QQUNLRVRTX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5wYWNrZXRzX29rKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9TVEFUX0lEX0JZVEVTX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5ieXRlc19vaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9QQUNLRVRTX0RJU0NBUkRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cGFja2V0c19kaXNjYXJkZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfQllURVNfRElTQ0FSREVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5ieXRlc19kaXNjYXJkZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9TVEFUX0lEX1BBQ0tFVFNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9TVEFUX0lEX0JZVEVTX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfU1RBVF9JRF9QQUNLRVRTX0RJU0NBUkRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX1NUQVRfSURfQllURVNfRElTQ0FSREVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfdG1fcXVldWVfaW5kX2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0lORF9JRF9SRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmV0ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0lORF9JRF9SRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfSU5EX0lEX1JFVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhX3VucGFjayhiY21iYWxfdG1fcXVldWVfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9JTkRfSURfUkVUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1FVRVVFX0lORF9JRF9SRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX3RtX3F1ZXVlX2luZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbWJhbF90bV9zY2hlZF9rZXlfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3NjaGVkX2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9LRVlfSURfRElSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRpciA9IChiY21iYWxfdG1fc2NoZWRfZGlyKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfS0VZX0lEX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmlkID0gKGJjbWJhbF90bV9zY2hlZF9pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9rZXlfcGFjayhjb25zdCBiY21iYWxfdG1fc2NoZWRfa2V5ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfS0VZX0lEX0RJUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9kaXJfcGFjayh0aGlzLT5kaXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfS0VZX0lEX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfdG1fc2NoZWRfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9ESVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2tleV91bnBhY2soYmNtYmFsX3RtX3NjaGVkX2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9ESVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fc2NoZWRfZGlyX3VucGFjaygmdGhpcy0+ZGlyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9rZXlfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfS0VZX0lEX0RJUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0tFWV9JRF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3NjaGVkX2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbWJhbF90bV9zY2hlZF9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfS0VZX0lEX0RJUikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmRpcikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfRElSX1VTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfRElSX0RTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfVE1fU0NIRURfS0VZX0lEX0RJUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfT1dORVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b3duZXIudHlwZSA9IEJDTUJBTF9UTV9TQ0hFRF9PV05FUl9UWVBFX1VOREVGSU5FRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNjaGVkX3R5cGUgPSBCQ01CQUxfVE1fU0NIRURfVFlQRV9OT05FOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX1BBUkVOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zY2hlZF9wYXJlbnQucHJlc2VuY2VfbWFzayA9IChiY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkKSAwOworICAgICAgICB0aGlzLT5zY2hlZF9wYXJlbnQuc2NoZWRfaWQgPSAoYmNtYmFsX3RtX3NjaGVkX2lkKSAwOworICAgICAgICB0aGlzLT5zY2hlZF9wYXJlbnQucHJpb3JpdHkgPSAoYmNtYmFsX3RtX3ByaW9yaXR5KSAwOworICAgICAgICB0aGlzLT5zY2hlZF9wYXJlbnQud2VpZ2h0ID0gKGJjbWJhbF90bV93ZWlnaHQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU0NIRURfQ0hJTERfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zY2hlZF9jaGlsZF90eXBlID0gQkNNQkFMX1RNX1NDSEVEX0NISUxEX1RZUEVfUVVFVUU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfUkFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYXRlLnByZXNlbmNlX21hc2sgPSAoYmNtYmFsX3RtX3NoYXBpbmdfaWQpIDA7CisgICAgICAgIHRoaXMtPnJhdGUuc2JyID0gMDsKKyAgICAgICAgdGhpcy0+cmF0ZS5wYnIgPSAwOworICAgICAgICB0aGlzLT5yYXRlLmJ1cnN0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9UQ09OVF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dGNvbnRfc2xhLnByZXNlbmNlX21hc2sgPSAoYmNtYmFsX3RtX3Rjb250X3NsYV9pZCkgMDsKKyAgICAgICAgdGhpcy0+dGNvbnRfc2xhLmV4dHJhX2J3X2VsaWcgPSBCQ01CQUxfRVhUUkFfQldfRUxJR0lCSUxJVFlfVFlQRV9OT05FOworICAgICAgICB0aGlzLT50Y29udF9zbGEubnJ0X2NiciA9IDA7CisgICAgICAgIHRoaXMtPnRjb250X3NsYS5ydF9jYnIgPSAwOworICAgICAgICB0aGlzLT50Y29udF9zbGEucnRfcHJvZmlsZSA9IDA7CisgICAgICAgIHRoaXMtPnRjb250X3NsYS5ucnRfcHJvZmlsZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfQ1JFQVRJT05fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jcmVhdGlvbl9tb2RlID0gQkNNQkFMX1RNX0NSRUFUSU9OX01PREVfTUFOVUFMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1FVRVVFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5xdWV1ZXMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+cXVldWVzLnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU1VCX1NDSEVEUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdWJfc2NoZWRzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPnN1Yl9zY2hlZHMudmFsID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9OVU1fUFJJT1JJVElFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5udW1fcHJpb3JpdGllcyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfT1dORVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fc2NoZWRfb3duZXJfcGFjaygmdGhpcy0+b3duZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fc2NoZWRfdHlwZV9wYWNrKHRoaXMtPnNjaGVkX3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX1BBUkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9wYXJlbnRfcGFjaygmdGhpcy0+c2NoZWRfcGFyZW50LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9DSElMRF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGVfcGFjayh0aGlzLT5zY2hlZF9jaGlsZF90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3RtX3NoYXBpbmdfcGFjaygmdGhpcy0+cmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfVENPTlRfU0xBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3RtX3Rjb250X3NsYV9wYWNrKCZ0aGlzLT50Y29udF9zbGEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX0NSRUFUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fY3JlYXRpb25fbW9kZV9wYWNrKHRoaXMtPmNyZWF0aW9uX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1FVRVVFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4X3BhY2soJnRoaXMtPnF1ZXVlcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU1VCX1NDSEVEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4X3BhY2soJnRoaXMtPnN1Yl9zY2hlZHMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX05VTV9QUklPUklUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm51bV9wcmlvcml0aWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfT1dORVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtYmFsX3RtX3NjaGVkX293bmVyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5vd25lcik7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU0NIRURfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX1BBUkVOVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21iYWxfdG1fc2NoZWRfcGFyZW50X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5zY2hlZF9wYXJlbnQpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX0NISUxEX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbWJhbF90bV9zaGFwaW5nX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5yYXRlKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9UQ09OVF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtYmFsX3RtX3Rjb250X3NsYV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dGNvbnRfc2xhKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9DUkVBVElPTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfUVVFVUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5xdWV1ZXMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NVQl9TQ0hFRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtYmFsX3RtX3NjaGVkX2lkX2xpc3RfdThfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnN1Yl9zY2hlZHMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX05VTV9QUklPUklUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGFfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9PV05FUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9vd25lcl91bnBhY2soJnRoaXMtPm93bmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fc2NoZWRfdHlwZV91bnBhY2soJnRoaXMtPnNjaGVkX3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX1BBUkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9wYXJlbnRfdW5wYWNrKCZ0aGlzLT5zY2hlZF9wYXJlbnQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU0NIRURfQ0hJTERfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9jaGlsZF90eXBlX3VucGFjaygmdGhpcy0+c2NoZWRfY2hpbGRfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zaGFwaW5nX3VucGFjaygmdGhpcy0+cmF0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9UQ09OVF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fdGNvbnRfc2xhX3VucGFjaygmdGhpcy0+dGNvbnRfc2xhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX0NSRUFUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fY3JlYXRpb25fbW9kZV91bnBhY2soJnRoaXMtPmNyZWF0aW9uX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1FVRVVFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4X3VucGFjaygmdGhpcy0+cXVldWVzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NVQl9TQ0hFRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OF91bnBhY2soJnRoaXMtPnN1Yl9zY2hlZHMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfTlVNX1BSSU9SSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtX3ByaW9yaXRpZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9PV05FUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9vd25lcl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU0NIRURfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9QQVJFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fc2NoZWRfcGFyZW50X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9DSElMRF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fc2hhcGluZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfVENPTlRfU0xBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX3RtX3Rjb250X3NsYV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfQ1JFQVRJT05fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9RVUVVRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU1VCX1NDSEVEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9OVU1fUFJJT1JJVElFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfdG1fc2NoZWRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9PV05FUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9vd25lcl9ib3VuZHNfY2hlY2soJnRoaXMtPm93bmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9PV05FUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zY2hlZF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9UWVBFX1dGUToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNQkFMX1RNX1NDSEVEX1RZUEVfU1A6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9UWVBFX1NQX1dGUToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX1BBUkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9wYXJlbnRfYm91bmRzX2NoZWNrKCZ0aGlzLT5zY2hlZF9wYXJlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX1BBUkVOVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1NDSEVEX0NISUxEX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zY2hlZF9jaGlsZF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9TQ0hFRF9DSElMRF9UWVBFX1FVRVVFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fU0NIRURfQ0hJTERfVFlQRV9TQ0hFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9TQ0hFRF9DSElMRF9UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fc2hhcGluZ19ib3VuZHNfY2hlY2soJnRoaXMtPnJhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX1JBVEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9UQ09OVF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fdGNvbnRfc2xhX2JvdW5kc19jaGVjaygmdGhpcy0+dGNvbnRfc2xhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9UQ09OVF9TTEE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9DUkVBVElPTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y3JlYXRpb25fbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01CQUxfVE1fQ1JFQVRJT05fTU9ERV9NQU5VQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTUJBTF9UTV9DUkVBVElPTl9NT0RFX0FVVE86CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfQ1JFQVRJT05fTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9RVUVVRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OF9ib3VuZHNfY2hlY2soJnRoaXMtPnF1ZXVlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfUVVFVUVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU1VCX1NDSEVEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4X2JvdW5kc19jaGVjaygmdGhpcy0+c3ViX3NjaGVkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU1VCX1NDSEVEUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21iYWxfdG1fc2NoZWRfaW5kX2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0lORF9JRF9SRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmV0ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0lORF9JRF9SRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfSU5EX0lEX1JFVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhX3VucGFjayhiY21iYWxfdG1fc2NoZWRfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9JTkRfSURfUkVUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtYmFsX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0lORF9JRF9SRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21iYWxfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX3RtX3NjaGVkX2luZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK2JjbW9zX2Jvb2wgYmNtYmFsX29ial9oYXNfdGFnKGJjbWJhbF9vYmpfaWQgb2JqLCBiY21iYWxfb2JqX3RhZyB0YWcpCit7CisgICAgc3dpdGNoIChvYmopCisgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlib2JqbXNnL2JhbF9tb2RlbF9mdW5jcy5oIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJvYmptc2cvYmFsX21vZGVsX2Z1bmNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmNWRkMAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlib2JqbXNnL2JhbF9tb2RlbF9mdW5jcy5oCkBAIC0wLDAgKzEsMzQ0MSBAQAorI2lmbmRlZiBCQUxfTU9ERUxfRlVOQ1MKKyNkZWZpbmUgQkFMX01PREVMX0ZVTkNTCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImJhbF9idWYuaCIKKyNpbmNsdWRlICJiYWxfbW9kZWxfaWRzLmgiCisjaW5jbHVkZSAiYmFsX21vZGVsX3R5cGVzLmgiCisKKy8qKiBQYWNrcyBhIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2lkX3BhY2soYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2lkX3VucGFjayhiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWRfcGFjayhiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWRfdW5wYWNrKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV9pZF9wYWNrKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV9pZF91bnBhY2soYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9hY3Rpb25faWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjdGlvbl9pZF9wYWNrKGJjbWJhbF9hY3Rpb25faWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfYWN0aW9uX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjdGlvbl9pZF91bnBhY2soYmNtYmFsX2FjdGlvbl9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2FjdGlvbl9jbWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjdGlvbl9jbWRfaWRfcGFjayhiY21iYWxfYWN0aW9uX2NtZF9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9hY3Rpb25fY21kX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjdGlvbl9jbWRfaWRfdW5wYWNrKGJjbWJhbF9hY3Rpb25fY21kX2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfY2xhc3NpZmllcl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfY2xhc3NpZmllcl9pZF9wYWNrKGJjbWJhbF9jbGFzc2lmaWVyX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2NsYXNzaWZpZXJfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfY2xhc3NpZmllcl9pZF91bnBhY2soYmNtYmFsX2NsYXNzaWZpZXJfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9wa3RfdGFnX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BrdF90YWdfdHlwZV9wYWNrKGJjbWJhbF9wa3RfdGFnX3R5cGUgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfcGt0X3RhZ190eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BrdF90YWdfdHlwZV91bnBhY2soYmNtYmFsX3BrdF90YWdfdHlwZSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2NvbnRyb2wgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2NvbnRyb2xfcGFjayhiY21iYWxfY29udHJvbCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9jb250cm9sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2NvbnRyb2xfdW5wYWNrKGJjbWJhbF9jb250cm9sICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfZGVzdF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9kZXN0X3R5cGVfcGFjayhiY21iYWxfZGVzdF90eXBlIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2Rlc3RfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9kZXN0X3R5cGVfdW5wYWNrKGJjbWJhbF9kZXN0X3R5cGUgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9kc19taXNzX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2RzX21pc3NfbW9kZV9wYWNrKGJjbWJhbF9kc19taXNzX21vZGUgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfZHNfbWlzc19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2RzX21pc3NfbW9kZV91bnBhY2soYmNtYmFsX2RzX21pc3NfbW9kZSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2V4dHJhX2J3X2VsaWdpYmlsaXR5X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2V4dHJhX2J3X2VsaWdpYmlsaXR5X3R5cGVfcGFjayhiY21iYWxfZXh0cmFfYndfZWxpZ2liaWxpdHlfdHlwZSB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9leHRyYV9id19lbGlnaWJpbGl0eV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2V4dHJhX2J3X2VsaWdpYmlsaXR5X3R5cGVfdW5wYWNrKGJjbWJhbF9leHRyYV9id19lbGlnaWJpbGl0eV90eXBlICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfZmxvd19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfY2ZnX2lkX3BhY2soYmNtYmFsX2Zsb3dfY2ZnX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2Zsb3dfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfY2ZnX2lkX3VucGFjayhiY21iYWxfZmxvd19jZmdfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9mbG93X2luZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19pbmRfaWRfcGFjayhiY21iYWxfZmxvd19pbmRfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfZmxvd19pbmRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19pbmRfaWRfdW5wYWNrKGJjbWJhbF9mbG93X2luZF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2Zsb3dfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2tleV9pZF9wYWNrKGJjbWJhbF9mbG93X2tleV9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9mbG93X2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2tleV9pZF91bnBhY2soYmNtYmFsX2Zsb3dfa2V5X2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfZmxvd19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9mbG93X3N0YXRfaWRfcGFjayhiY21iYWxfZmxvd19zdGF0X2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2Zsb3dfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9mbG93X3N0YXRfaWRfdW5wYWNrKGJjbWJhbF9mbG93X3N0YXRfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9mbG93X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfdHlwZV9wYWNrKGJjbWJhbF9mbG93X3R5cGUgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfZmxvd190eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfdHlwZV91bnBhY2soYmNtYmFsX2Zsb3dfdHlwZSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2dyb3VwX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfY2ZnX2lkX3BhY2soYmNtYmFsX2dyb3VwX2NmZ19pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9ncm91cF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfY2ZnX2lkX3VucGFjayhiY21iYWxfZ3JvdXBfY2ZnX2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfZ3JvdXBfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9rZXlfaWRfcGFjayhiY21iYWxfZ3JvdXBfa2V5X2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2dyb3VwX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9rZXlfaWRfdW5wYWNrKGJjbWJhbF9ncm91cF9rZXlfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9ncm91cF9tZW1iZXJfY21kIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9tZW1iZXJfY21kX3BhY2soYmNtYmFsX2dyb3VwX21lbWJlcl9jbWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfZ3JvdXBfbWVtYmVyX2NtZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9tZW1iZXJfY21kX3VucGFjayhiY21iYWxfZ3JvdXBfbWVtYmVyX2NtZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2dyb3VwX293bmVyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9vd25lcl9wYWNrKGJjbWJhbF9ncm91cF9vd25lciB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9ncm91cF9vd25lciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9vd25lcl91bnBhY2soYmNtYmFsX2dyb3VwX293bmVyICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfaW50ZXJmYWNlX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX2NmZ19pZF9wYWNrKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2ludGVyZmFjZV9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX2NmZ19pZF91bnBhY2soYmNtYmFsX2ludGVyZmFjZV9jZmdfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2lkX3BhY2soYmNtYmFsX2ludGVyZmFjZV9pbmRfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfaW50ZXJmYWNlX2luZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2lkX3VucGFjayhiY21iYWxfaW50ZXJmYWNlX2luZF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2ludGVyZmFjZV9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9rZXlfaWRfcGFjayhiY21iYWxfaW50ZXJmYWNlX2tleV9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9pbnRlcmZhY2Vfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9rZXlfaWRfdW5wYWNrKGJjbWJhbF9pbnRlcmZhY2Vfa2V5X2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2lkX3BhY2soYmNtYmFsX2ludGVyZmFjZV9zdGF0X2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2lkX3VucGFjayhiY21iYWxfaW50ZXJmYWNlX3N0YXRfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9pbnRmX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGZfdHlwZV9wYWNrKGJjbWJhbF9pbnRmX3R5cGUgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfaW50Zl90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGZfdHlwZV91bnBhY2soYmNtYmFsX2ludGZfdHlwZSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2l3Zl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9pd2ZfbW9kZV9wYWNrKGJjbWJhbF9pd2ZfbW9kZSB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9pd2ZfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9pd2ZfbW9kZV91bnBhY2soYmNtYmFsX2l3Zl9tb2RlICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfcGFja2V0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2NmZ19pZF9wYWNrKGJjbWJhbF9wYWNrZXRfY2ZnX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3BhY2tldF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2NmZ19pZF91bnBhY2soYmNtYmFsX3BhY2tldF9jZmdfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9wYWNrZXRfaW5kX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfaW5kX2lkX3BhY2soYmNtYmFsX3BhY2tldF9pbmRfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfcGFja2V0X2luZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfaW5kX2lkX3VucGFjayhiY21iYWxfcGFja2V0X2luZF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3BhY2tldF9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BhY2tldF9rZXlfaWRfcGFjayhiY21iYWxfcGFja2V0X2tleV9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9wYWNrZXRfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BhY2tldF9rZXlfaWRfdW5wYWNrKGJjbWJhbF9wYWNrZXRfa2V5X2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfc2xhX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9zbGFfaWRfcGFjayhiY21iYWxfc2xhX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3NsYV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9zbGFfaWRfdW5wYWNrKGJjbWJhbF9zbGFfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc3RhdGVfcGFjayhiY21iYWxfc3RhdGUgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc3RhdGVfdW5wYWNrKGJjbWJhbF9zdGF0ZSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc3RhdHVzX3BhY2soYmNtYmFsX3N0YXR1cyB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc3RhdHVzX3VucGFjayhiY21iYWxfc3RhdHVzICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2lkX3BhY2soYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2lkX3VucGFjayhiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfaWRfcGFjayhiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfaWRfdW5wYWNrKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9pZF9wYWNrKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9pZF91bnBhY2soYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfaWRfcGFjayhiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfaWRfdW5wYWNrKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF90bV9iYWNfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fYmFjX3R5cGVfcGFjayhiY21iYWxfdG1fYmFjX3R5cGUgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfdG1fYmFjX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fYmFjX3R5cGVfdW5wYWNrKGJjbWJhbF90bV9iYWNfdHlwZSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3RtX2NyZWF0aW9uX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX2NyZWF0aW9uX21vZGVfcGFjayhiY21iYWxfdG1fY3JlYXRpb25fbW9kZSB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9jcmVhdGlvbl9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX2NyZWF0aW9uX21vZGVfdW5wYWNrKGJjbWJhbF90bV9jcmVhdGlvbl9tb2RlICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fcXVldWVfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWRfcGFjayhiY21iYWxfdG1fcXVldWVfY2ZnX2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3RtX3F1ZXVlX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9jZmdfaWRfdW5wYWNrKGJjbWJhbF90bV9xdWV1ZV9jZmdfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF90bV9xdWV1ZV9pbmRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2luZF9pZF9wYWNrKGJjbWJhbF90bV9xdWV1ZV9pbmRfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfdG1fcXVldWVfaW5kX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2luZF9pZF91bnBhY2soYmNtYmFsX3RtX3F1ZXVlX2luZF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3RtX3F1ZXVlX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfa2V5X2lkX3BhY2soYmNtYmFsX3RtX3F1ZXVlX2tleV9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9xdWV1ZV9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfa2V5X2lkX3VucGFjayhiY21iYWxfdG1fcXVldWVfa2V5X2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fcXVldWVfc3RhdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfc3RhdF9pZF9wYWNrKGJjbWJhbF90bV9xdWV1ZV9zdGF0X2lkIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfc3RhdF9pZF91bnBhY2soYmNtYmFsX3RtX3F1ZXVlX3N0YXRfaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2NmZ19pZF9wYWNrKGJjbWJhbF90bV9zY2hlZF9jZmdfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfdG1fc2NoZWRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2NmZ19pZF91bnBhY2soYmNtYmFsX3RtX3NjaGVkX2NmZ19pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGVfcGFjayhiY21iYWxfdG1fc2NoZWRfY2hpbGRfdHlwZSB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9jaGlsZF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2NoaWxkX3R5cGVfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9jaGlsZF90eXBlICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fc2NoZWRfZGlyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9kaXJfcGFjayhiY21iYWxfdG1fc2NoZWRfZGlyIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3RtX3NjaGVkX2RpciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9kaXJfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9kaXIgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9pbmRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2luZF9pZF9wYWNrKGJjbWJhbF90bV9zY2hlZF9pbmRfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfdG1fc2NoZWRfaW5kX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2luZF9pZF91bnBhY2soYmNtYmFsX3RtX3NjaGVkX2luZF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3RtX3NjaGVkX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfa2V5X2lkX3BhY2soYmNtYmFsX3RtX3NjaGVkX2tleV9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfa2V5X2lkX3VucGFjayhiY21iYWxfdG1fc2NoZWRfa2V5X2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fc2NoZWRfb3duZXJfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfb3duZXJfdHlwZV9wYWNrKGJjbWJhbF90bV9zY2hlZF9vd25lcl90eXBlIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3RtX3NjaGVkX293bmVyX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfb3duZXJfdHlwZV91bnBhY2soYmNtYmFsX3RtX3NjaGVkX293bmVyX3R5cGUgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWRfcGFjayhiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfb3duZXJfYWdnX3BvcnRfaWRfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9vd25lcl9hZ2dfcG9ydF9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkX3BhY2soYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9wYXJlbnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkX3VucGFjayhiY21iYWxfdG1fc2NoZWRfcGFyZW50X2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fc2NoZWRfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfdHlwZV9wYWNrKGJjbWJhbF90bV9zY2hlZF90eXBlIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3RtX3NjaGVkX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfdHlwZV91bnBhY2soYmNtYmFsX3RtX3NjaGVkX3R5cGUgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF90bV9zaGFwaW5nX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zaGFwaW5nX2lkX3BhY2soYmNtYmFsX3RtX3NoYXBpbmdfaWQgdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfdG1fc2hhcGluZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zaGFwaW5nX2lkX3VucGFjayhiY21iYWxfdG1fc2hhcGluZ19pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3RtX3Rjb250X3NsYV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fdGNvbnRfc2xhX2lkX3BhY2soYmNtYmFsX3RtX3Rjb250X3NsYV9pZCB0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV90Y29udF9zbGFfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fdGNvbnRfc2xhX2lkX3VucGFjayhiY21iYWxfdG1fdGNvbnRfc2xhX2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21iYWxfdHJ4X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RyeF90eXBlX3BhY2soYmNtYmFsX3RyeF90eXBlIHRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3RyeF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RyeF90eXBlX3VucGFjayhiY21iYWxfdHJ4X3R5cGUgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF9hY3Rpb24gc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21iYWxfYWN0aW9uX3NldF9kZWZhdWx0KGJjbWJhbF9hY3Rpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21iYWxfYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfYWN0aW9uX3BhY2soY29uc3QgYmNtYmFsX2FjdGlvbiAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX2FjdGlvbiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF9hY3Rpb25fZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2FjdGlvbiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfYWN0aW9uX3VucGFjayhiY21iYWxfYWN0aW9uICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfYWN0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjdGlvbl9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfYWN0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2FjdGlvbiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdTggc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdThfc2V0X2RlZmF1bHQoYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdTggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdThfcGFjayhjb25zdCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4ICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZF9saXN0X3U4X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdTggKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdTggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OF91bnBhY2soYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkX2xpc3RfdThfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OCBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OF9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWRfbGlzdF91OCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF9jbGFzc2lmaWVyIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21iYWxfY2xhc3NpZmllcl9zZXRfZGVmYXVsdChiY21iYWxfY2xhc3NpZmllciAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9jbGFzc2lmaWVyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfY2xhc3NpZmllcl9wYWNrKGNvbnN0IGJjbWJhbF9jbGFzc2lmaWVyICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfY2xhc3NpZmllciB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF9jbGFzc2lmaWVyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9jbGFzc2lmaWVyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfY2xhc3NpZmllciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfY2xhc3NpZmllcl91bnBhY2soYmNtYmFsX2NsYXNzaWZpZXIgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF9jbGFzc2lmaWVyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2NsYXNzaWZpZXJfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX2NsYXNzaWZpZXIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfY2xhc3NpZmllcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2NsYXNzaWZpZXIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfZGVzdCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbWJhbF9kZXN0X3NldF9kZWZhdWx0KGJjbWJhbF9kZXN0ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2Rlc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9kZXN0X3BhY2soY29uc3QgYmNtYmFsX2Rlc3QgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbWJhbF9kZXN0IHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX2Rlc3RfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2Rlc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9kZXN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9kZXN0X3VucGFjayhiY21iYWxfZGVzdCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX2Rlc3Qgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZGVzdF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfZGVzdCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9kZXN0X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfZGVzdCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21iYWxfZmxvd19pZF9saXN0X3UzMl9zZXRfZGVmYXVsdChiY21iYWxfZmxvd19pZF9saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19pZF9saXN0X3UzMl9wYWNrKGNvbnN0IGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfZmxvd19pZF9saXN0X3UzMiB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX2Zsb3dfaWRfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2Zsb3dfaWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyX3VucGFjayhiY21iYWxfZmxvd19pZF9saXN0X3UzMiAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX2Zsb3dfaWRfbGlzdF91MzIgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19pZF9saXN0X3UzMl9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfZmxvd19pZF9saXN0X3UzMiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2lkX2xpc3RfdTMyX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfZmxvd19pZF9saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9xdWV1ZV9yZWYgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbWJhbF90bV9xdWV1ZV9yZWZfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3F1ZXVlX3JlZiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF90bV9xdWV1ZV9yZWYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9yZWZfcGFjayhjb25zdCBiY21iYWxfdG1fcXVldWVfcmVmICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9xdWV1ZV9yZWYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX3JlZl91bnBhY2soYmNtYmFsX3RtX3F1ZXVlX3JlZiAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX3RtX3F1ZXVlX3JlZiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9yZWZfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3RtX3F1ZXVlX3JlZiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9yZWZfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9yZWYgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19zZXRfZGVmYXVsdChiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19wYWNrKGNvbnN0IGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mbyAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX3VucGFjayhiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mbyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm8gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mbyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2X3NldF9kZWZhdWx0KGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2X3BhY2soY29uc3QgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2ICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTYgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTYgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTZfdW5wYWNrKGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2X3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbWJhbF9ncm91cF9tZW1iZXJfaW5mb19saXN0X3UxNiBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX21lbWJlcl9pbmZvX2xpc3RfdTE2X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfZ3JvdXBfbWVtYmVyX2luZm9fbGlzdF91MTYgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfcGFzc3dvcmQgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbWJhbF9wYXNzd29yZF9zZXRfZGVmYXVsdChiY21iYWxfcGFzc3dvcmQgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21iYWxfcGFzc3dvcmQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9wYXNzd29yZF9wYWNrKGNvbnN0IGJjbWJhbF9wYXNzd29yZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfcGFzc3dvcmQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3Bhc3N3b3JkX3VucGFjayhiY21iYWxfcGFzc3dvcmQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF9wYXNzd29yZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF9wYXNzd29yZF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfcGFzc3dvcmQgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfcGFzc3dvcmRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9wYXNzd29yZCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF9yZWdpc3RyYXRpb25faWQgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbWJhbF9yZWdpc3RyYXRpb25faWRfc2V0X2RlZmF1bHQoYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9yZWdpc3RyYXRpb25faWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9yZWdpc3RyYXRpb25faWRfcGFjayhjb25zdCBiY21iYWxfcmVnaXN0cmF0aW9uX2lkICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9yZWdpc3RyYXRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZF91bnBhY2soYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF9yZWdpc3RyYXRpb25faWRfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3JlZ2lzdHJhdGlvbl9pZCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9yZWdpc3RyYXRpb25faWRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9yZWdpc3RyYXRpb25faWQgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfc2VyaWFsX251bWJlciBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtYmFsX3NlcmlhbF9udW1iZXJfc2V0X2RlZmF1bHQoYmNtYmFsX3NlcmlhbF9udW1iZXIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21iYWxfc2VyaWFsX251bWJlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3NlcmlhbF9udW1iZXJfcGFjayhjb25zdCBiY21iYWxfc2VyaWFsX251bWJlciAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfc2VyaWFsX251bWJlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc2VyaWFsX251bWJlcl91bnBhY2soYmNtYmFsX3NlcmlhbF9udW1iZXIgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF9zZXJpYWxfbnVtYmVyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3NlcmlhbF9udW1iZXJfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3NlcmlhbF9udW1iZXIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3NlcmlhbF9udW1iZXIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91OF9zZXRfZGVmYXVsdChiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggKnRoaXMpOworCisvKiogUGFja3MgYSBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91OF9wYWNrKGNvbnN0IGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91OCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4IHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdThfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZF9saXN0X3U4X3VucGFjayhiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91OCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91OF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdTggaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc2VydmljZV9wb3J0X2lkX2xpc3RfdThfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWRfbGlzdF91OCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF9zbGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21iYWxfc2xhX3NldF9kZWZhdWx0KGJjbWJhbF9zbGEgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21iYWxfc2xhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc2xhX3BhY2soY29uc3QgYmNtYmFsX3NsYSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX3NsYSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF9zbGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3NsYSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3NsYSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc2xhX3VucGFjayhiY21iYWxfc2xhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfc2xhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSAKKyAqIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3NsYV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfc2xhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3NsYV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3NsYSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF9zdWJfaWRfbGlzdF91MTYgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbWJhbF9zdWJfaWRfbGlzdF91MTZfc2V0X2RlZmF1bHQoYmNtYmFsX3N1Yl9pZF9saXN0X3UxNiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9zdWJfaWRfbGlzdF91MTYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJfaWRfbGlzdF91MTZfcGFjayhjb25zdCBiY21iYWxfc3ViX2lkX2xpc3RfdTE2ICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfc3ViX2lkX2xpc3RfdTE2IHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfc3ViX2lkX2xpc3RfdTE2X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9zdWJfaWRfbGlzdF91MTYgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9zdWJfaWRfbGlzdF91MTYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1Yl9pZF9saXN0X3UxNl91bnBhY2soYmNtYmFsX3N1Yl9pZF9saXN0X3UxNiAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX3N1Yl9pZF9saXN0X3UxNiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJfaWRfbGlzdF91MTZfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3N1Yl9pZF9saXN0X3UxNiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJfaWRfbGlzdF91MTZfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9zdWJfaWRfbGlzdF91MTYgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfdG1fcmVkIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtYmFsX3RtX3JlZF9zZXRfZGVmYXVsdChiY21iYWxfdG1fcmVkICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3RtX3JlZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3JlZF9wYWNrKGNvbnN0IGJjbWJhbF90bV9yZWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3RtX3JlZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcmVkX3VucGFjayhiY21iYWxfdG1fcmVkICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfdG1fcmVkIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3JlZF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfdG1fcmVkIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3JlZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3JlZCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9iYWMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21iYWxfdG1fYmFjX3NldF9kZWZhdWx0KGJjbWJhbF90bV9iYWMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fYmFjIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fYmFjX3BhY2soY29uc3QgYmNtYmFsX3RtX2JhYyAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX3RtX2JhYyB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF90bV9iYWNfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3RtX2JhYyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3RtX2JhYyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fYmFjX3VucGFjayhiY21iYWxfdG1fYmFjICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfdG1fYmFjIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX2JhY19zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfdG1fYmFjIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX2JhY19ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX2JhYyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OF9zZXRfZGVmYXVsdChiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OF9wYWNrKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4ICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OCB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdThfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdTggKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4X3VucGFjayhiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX3RtX3F1ZXVlX2lkX2xpc3RfdTggc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9pZF9saXN0X3U4X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fcXVldWVfaWRfbGlzdF91OCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OF9zZXRfZGVmYXVsdChiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OF9wYWNrKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4ICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OCB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX3RtX3NjaGVkX2lkX2xpc3RfdThfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3RtX3NjaGVkX2lkX2xpc3RfdTggKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4X3VucGFjayhiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX3RtX3NjaGVkX2lkX2xpc3RfdTggc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9pZF9saXN0X3U4X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fc2NoZWRfaWRfbGlzdF91OCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9zY2hlZF9vd25lciBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtYmFsX3RtX3NjaGVkX293bmVyX3NldF9kZWZhdWx0KGJjbWJhbF90bV9zY2hlZF9vd25lciAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9vd25lciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX293bmVyX3BhY2soY29uc3QgYmNtYmFsX3RtX3NjaGVkX293bmVyICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfdG1fc2NoZWRfb3duZXIgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF90bV9zY2hlZF9vd25lcl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfdG1fc2NoZWRfb3duZXIgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9vd25lciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfb3duZXJfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9vd25lciAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX3RtX3NjaGVkX293bmVyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX293bmVyX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbWJhbF90bV9zY2hlZF9vd25lciBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9vd25lcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3NjaGVkX293bmVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtYmFsX3RtX3NjaGVkX3BhcmVudCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9zZXRfZGVmYXVsdChiY21iYWxfdG1fc2NoZWRfcGFyZW50ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3RtX3NjaGVkX3BhcmVudCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9wYWNrKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9wYXJlbnQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbWJhbF90bV9zY2hlZF9wYXJlbnQgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF90bV9zY2hlZF9wYXJlbnRfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3RtX3NjaGVkX3BhcmVudCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3RtX3NjaGVkX3BhcmVudCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfcGFyZW50X3VucGFjayhiY21iYWxfdG1fc2NoZWRfcGFyZW50ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfdG1fc2NoZWRfcGFyZW50IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfdG1fc2NoZWRfcGFyZW50IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX3BhcmVudF9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3NjaGVkX3BhcmVudCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9zaGFwaW5nIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21iYWxfdG1fc2hhcGluZ19zZXRfZGVmYXVsdChiY21iYWxfdG1fc2hhcGluZyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF90bV9zaGFwaW5nIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2hhcGluZ19wYWNrKGNvbnN0IGJjbWJhbF90bV9zaGFwaW5nICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfdG1fc2hhcGluZyB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF90bV9zaGFwaW5nX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9zaGFwaW5nICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfdG1fc2hhcGluZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2hhcGluZ191bnBhY2soYmNtYmFsX3RtX3NoYXBpbmcgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF90bV9zaGFwaW5nIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NoYXBpbmdfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3RtX3NoYXBpbmcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2hhcGluZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3NoYXBpbmcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfdG1fdGNvbnRfc2xhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21iYWxfdG1fdGNvbnRfc2xhX3NldF9kZWZhdWx0KGJjbWJhbF90bV90Y29udF9zbGEgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fdGNvbnRfc2xhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fdGNvbnRfc2xhX3BhY2soY29uc3QgYmNtYmFsX3RtX3Rjb250X3NsYSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX3RtX3Rjb250X3NsYSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF90bV90Y29udF9zbGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3RtX3Rjb250X3NsYSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3RtX3Rjb250X3NsYSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fdGNvbnRfc2xhX3VucGFjayhiY21iYWxfdG1fdGNvbnRfc2xhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfdG1fdGNvbnRfc2xhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3Rjb250X3NsYV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfdG1fdGNvbnRfc2xhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3Rjb250X3NsYV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3Rjb250X3NsYSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF91OF9saXN0X3UzMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtYmFsX3U4X2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbWJhbF91OF9saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF91OF9saXN0X3UzMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3U4X2xpc3RfdTMyX3BhY2soY29uc3QgYmNtYmFsX3U4X2xpc3RfdTMyICp0aGlzLCBiY21iYWxfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfdThfbGlzdF91MzIgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3U4X2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfdThfbGlzdF91MzIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3U4X2xpc3RfdTMyX3VucGFjayhiY21iYWxfdThfbGlzdF91MzIgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF91OF9saXN0X3UzMiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF91OF9saXN0X3UzMl9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfdThfbGlzdF91MzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF91OF9saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV9zZXRfZGVmYXVsdChiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfcGFjayhjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5IHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X3VucGFjayhiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhX3VucGFjayhiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGFfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YV9zZXRfZGVmYXVsdChiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGFfcGFjayhjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhX3VucGFjayhiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGFfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtYmFsX2Zsb3dfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21iYWxfZmxvd19rZXlfc2V0X2RlZmF1bHQoYmNtYmFsX2Zsb3dfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9mbG93X2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfa2V5X3BhY2soY29uc3QgYmNtYmFsX2Zsb3dfa2V5ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX2Zsb3dfa2V5IHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX2Zsb3dfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9mbG93X2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9mbG93X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19rZXlfdW5wYWNrKGJjbWJhbF9mbG93X2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF9mbG93X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF9mbG93X2tleV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX2Zsb3dfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfZmxvd19rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfZmxvd19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtYmFsX2Zsb3dfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbWJhbF9mbG93X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF9mbG93X2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9mbG93X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9mbG93X2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX2Zsb3dfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF9mbG93X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9mbG93X2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2Zsb3dfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfY2ZnX2RhdGFfdW5wYWNrKGJjbWJhbF9mbG93X2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX2Zsb3dfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19jZmdfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX2Zsb3dfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfZmxvd19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21iYWxfZmxvd19zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX2Zsb3dfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9mbG93X3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfZmxvd19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9mbG93X3N0YXRfZGF0YV91bnBhY2soYmNtYmFsX2Zsb3dfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfZmxvd19zdGF0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9mbG93X3N0YXRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbWJhbF9mbG93X3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtYmFsX2Zsb3dfaW5kX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbWJhbF9mbG93X2luZF9kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF9mbG93X2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9mbG93X2luZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19pbmRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9mbG93X2luZF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX2Zsb3dfaW5kX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF9mbG93X2luZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9mbG93X2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2Zsb3dfaW5kX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2Zsb3dfaW5kX2RhdGFfdW5wYWNrKGJjbWJhbF9mbG93X2luZF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX2Zsb3dfaW5kX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19pbmRfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX2Zsb3dfaW5kX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZmxvd19pbmRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2Zsb3dfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfZmxvd19pbmRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtYmFsX2dyb3VwX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtYmFsX2dyb3VwX2tleV9zZXRfZGVmYXVsdChiY21iYWxfZ3JvdXBfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9ncm91cF9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9rZXlfcGFjayhjb25zdCBiY21iYWxfZ3JvdXBfa2V5ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX2dyb3VwX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF9ncm91cF9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2dyb3VwX2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9ncm91cF9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX2tleV91bnBhY2soYmNtYmFsX2dyb3VwX2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF9ncm91cF9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfa2V5X3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfZ3JvdXBfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2dyb3VwX2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbWJhbF9ncm91cF9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtYmFsX2dyb3VwX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21iYWxfZ3JvdXBfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX2dyb3VwX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9ncm91cF9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtYmFsX2dyb3VwX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX2dyb3VwX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfZ3JvdXBfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2dyb3VwX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2dyb3VwX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9ncm91cF9jZmdfZGF0YV91bnBhY2soYmNtYmFsX2dyb3VwX2NmZ19kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX2dyb3VwX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2dyb3VwX2NmZ19kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfZ3JvdXBfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfZ3JvdXBfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9ncm91cF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbWJhbF9ncm91cF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtYmFsX2ludGVyZmFjZV9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbWJhbF9pbnRlcmZhY2Vfa2V5X3NldF9kZWZhdWx0KGJjbWJhbF9pbnRlcmZhY2Vfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9pbnRlcmZhY2Vfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX2tleV9wYWNrKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2Vfa2V5ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX2ludGVyZmFjZV9rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF9pbnRlcmZhY2Vfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2Vfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX2ludGVyZmFjZV9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9rZXlfdW5wYWNrKGJjbWJhbF9pbnRlcmZhY2Vfa2V5ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX2ludGVyZmFjZV9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX2tleV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX2ludGVyZmFjZV9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX2ludGVyZmFjZV9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfaW50ZXJmYWNlX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGFfdW5wYWNrKGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfaW50ZXJmYWNlX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YV91bnBhY2soYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGFfdW5wYWNrKGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfaW50ZXJmYWNlX2luZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfcGFja2V0X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtYmFsX3BhY2tldF9rZXlfc2V0X2RlZmF1bHQoYmNtYmFsX3BhY2tldF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3BhY2tldF9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfa2V5X3BhY2soY29uc3QgYmNtYmFsX3BhY2tldF9rZXkgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfcGFja2V0X2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF9wYWNrZXRfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9wYWNrZXRfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3BhY2tldF9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BhY2tldF9rZXlfdW5wYWNrKGJjbWJhbF9wYWNrZXRfa2V5ICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX3BhY2tldF9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2tleV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3BhY2tldF9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfcGFja2V0X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3BhY2tldF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfcGFja2V0X2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfcGFja2V0X2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21iYWxfcGFja2V0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3BhY2tldF9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BhY2tldF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfcGFja2V0X2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfcGFja2V0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfcGFja2V0X2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGFfdW5wYWNrKGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfcGFja2V0X2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BhY2tldF9jZmdfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3BhY2tldF9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfcGFja2V0X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfcGFja2V0X2luZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21iYWxfcGFja2V0X2luZF9kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF9wYWNrZXRfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3BhY2tldF9pbmRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BhY2tldF9pbmRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF9wYWNrZXRfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfcGFja2V0X2luZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfcGFja2V0X2luZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF9wYWNrZXRfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfcGFja2V0X2luZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfaW5kX2RhdGFfdW5wYWNrKGJjbWJhbF9wYWNrZXRfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfcGFja2V0X2luZF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3BhY2tldF9pbmRfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3BhY2tldF9pbmRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9wYWNrZXRfaW5kX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9wYWNrZXRfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfcGFja2V0X2luZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9zZXRfZGVmYXVsdChiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfcGFjayhjb25zdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X3VucGFjayhiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5ICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhX3VucGFjayhiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGFfc2NhbihiY21iYWxfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YV91bnBhY2soYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhX3BhY2soY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YV91bnBhY2soYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhICp0aGlzLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9xdWV1ZV9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbWJhbF90bV9xdWV1ZV9rZXlfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3F1ZXVlX2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fcXVldWVfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfa2V5X3BhY2soY29uc3QgYmNtYmFsX3RtX3F1ZXVlX2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbWJhbF90bV9xdWV1ZV9rZXkgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfdG1fcXVldWVfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfdG1fcXVldWVfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9rZXlfdW5wYWNrKGJjbWJhbF90bV9xdWV1ZV9rZXkgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfdG1fcXVldWVfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2tleV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3RtX3F1ZXVlX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfdG1fcXVldWVfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGFfdW5wYWNrKGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfdG1fcXVldWVfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YV91bnBhY2soYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhX3NjYW4oYmNtYmFsX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fcXVldWVfaW5kX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fcXVldWVfaW5kX2RhdGFfdW5wYWNrKGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fcXVldWVfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfdG1fcXVldWVfaW5kX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9zY2hlZF9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbWJhbF90bV9zY2hlZF9rZXlfc2V0X2RlZmF1bHQoYmNtYmFsX3RtX3NjaGVkX2tleSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fc2NoZWRfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfa2V5X3BhY2soY29uc3QgYmNtYmFsX3RtX3NjaGVkX2tleSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbWJhbF90bV9zY2hlZF9rZXkgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21iYWxfdG1fc2NoZWRfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21iYWxfdG1fc2NoZWRfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9rZXlfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9rZXkgKnRoaXMsIGJjbWJhbF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21iYWxfdG1fc2NoZWRfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2tleV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3RtX3NjaGVkX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9rZXkgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfdG1fc2NoZWRfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGFfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfdG1fc2NoZWRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhX3NldF9kZWZhdWx0KGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21iYWxfdG1fc2NoZWRfaW5kX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YV9wYWNrKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21iYWxfdG1fc2NoZWRfaW5kX2RhdGFfdW5wYWNrKGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YV9zY2FuKGJjbWJhbF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21iYWxfdG1fc2NoZWRfaW5kX2RhdGEgKnRoaXMsIGJjbWJhbF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21iYWxfdG1fc2NoZWRfaW5kX2lkICpmYWlsZWRfcHJvcCk7CisjZW5kaWYgLyogQkFMX01PREVMX0ZVTkNTICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYm9iam1zZy9iYWxfbXNnLmMgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYm9iam1zZy9iYWxfbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1YmU4MAotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlib2JqbXNnL2JhbF9tc2cuYwpAQCAtMCwwICsxLDIyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKy8qKgorICogQGZpbGUgYmFsX21zZy5jCisgKiBAYnJpZWYgQkFMIG1lc3NhZ2UgaGVscGVyIGZ1bmN0aW9ucworICogQGFkZHRvZ3JvdXAgY3RybHIKKyAqLworI2luY2x1ZGUgPGJhbF9tc2cuaD4KKyNpbmNsdWRlIDxiYWxfb2JqX21zZ19wYWNrX3VucGFjay5oPgorCisvKgorICogQ2xvbmUgQkFMIG1lc3NhZ2UKKyAqIFJldHVybnMgcGF5bG9hZF9wdHIgb2YgdGhlIGNsb25lCisgKi8KK3ZvaWQgKmJjbWJhbF9tc2dfY2xvbmUodm9pZCAqYmFsX29iaikKK3sKKyAgICBiYWxfY29tbV9tc2dfaGRyICptc2dfaGRyID0gYmNtYmFsX2JhbF9oZHJfZ2V0KGJhbF9vYmopOworICAgIGJhbF9jb21tX21zZ19oZHIgKmNsb25lX2hkciA9IE5VTEw7CisgICAgYmNtb3NfZXJybm8gZXJyID0gYmNtYmFsX29ial9tc2dfY2xvbmUoJmNsb25lX2hkciwgbXNnX2hkcik7CisgICAgcmV0dXJuICgoaW50KWVyciA+PSAwKSA/IGJjbWJhbF9wYXlsb2FkX3B0cl9nZXQoY2xvbmVfaGRyKSA6IE5VTEw7Cit9CisKKy8qCisgKiBTZW5kIGEgQkFMIG1lc3NhZ2UgZ2l2ZW4gdGhlIHBheWxvYWQgcG9pbnRlcgorICovCitiY21vc19lcnJubyBiY21iYWxfbXNnX3NlbmQoYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZSwgdm9pZCAqbXNnX3BheWxvYWQsIGJjbW9zX21zZ19zZW5kX2ZsYWdzIGZsYWdzKQoreworICAgIGJjbW9zX21zZyAqcGFja2VkX21zZyA9IE5VTEw7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgLyogcGFjayBhbmQgc2VuZCAqLworICAgIGVyciA9IGJjbWJhbF9vYmpfbXNnX3BhY2soYmNtYmFsX2JhbF9oZHJfZ2V0KG1zZ19wYXlsb2FkKSwgJnBhY2tlZF9tc2cpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGJjbW9zX21zZ19zZW5kKHF1ZXVlLCBwYWNrZWRfbXNnLCBmbGFncyk7CisKKyAgICBpZiAoKGZsYWdzICYgQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUikgPT0gMCkKKyAgICB7CisgICAgICAgIC8qIFJlbGVhc2UgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgKi8KKyAgICAgICAgYmNtYmFsX21zZ19mcmVlKG1zZ19wYXlsb2FkKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBiY21vc19tc2dfc2VuZCgpIGZhaWxlZCwgYnV0IHBhY2tlZF9tc2cgd2Fzbid0IHJlbGVhc2VkIGJlY2F1c2Ugb2YgdGhlIGZsYWcuICovCisgICAgICAgIGJjbW9zX21zZ19mcmVlKHBhY2tlZF9tc2cpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsIGNhbGxiYWNrIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0YXJnZXQgbW9kdWxlIGFuZCBwYXNzIGl0IHRoZSBCQUwgbWVzc2FnZSBwb2ludGVyCisgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9tc2dfY2FsbCh2b2lkICptc2dfcGF5bG9hZCwKKyAgICBiY21vc19tb2R1bGVfaWQgbW9kdWxlLCBGX2JjbW9zX21zZ19oYW5kbGVyIGNiLCBiY21vc19tc2dfc2VuZF9mbGFncyBmbGFncykKK3sKKyAgICBiY21vc19tc2cgKm0gPSBiY21iYWxfYmNtb3NfaGRyX2dldChtc2dfcGF5bG9hZCk7CisgICAgbS0+aGFuZGxlciA9IGNiOworICAgIHJldHVybiBiY21vc19tc2dfc2VuZF90b19tb2R1bGUobW9kdWxlLCBtLCBmbGFncyk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbWJhbF9tc2dfcmVjdihiY21vc19tc2dfcXVldWUgKnF1ZXVlLCB1aW50MzJfdCB0aW1lb3V0LCB2b2lkICoqbXNnX3BheWxvYWQpCit7CisgICAgYmNtb3NfZXJybm8gcmV0OworICAgIGJjbW9zX21zZyAqbXNnOworICAgIGJhbF9jb21tX21zZ19oZHIgKnVucGFja2VkX21zZyA9ICgqbXNnX3BheWxvYWQpID8gYmNtYmFsX2JhbF9oZHJfZ2V0KCptc2dfcGF5bG9hZCkgOiBOVUxMOworCisgICAgZG8geworICAgICAgICByZXQgPSBiY21vc19tc2dfcmVjdihxdWV1ZSwgdGltZW91dCwgJm1zZyk7CisgICAgICAgIGlmKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19wcmludGYoIiVzOiBlcnJvciBkdXJpbmcgYmNtb3NfbXNnX3JlY3YgKGVycm9yOiVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmV0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdvdCBhIG1lc3NhZ2UuIE5vdyB1bnBhY2sgaXQgKi8KKyAgICAgICAgcmV0ID0gYmNtYmFsX29ial9tc2dfdW5wYWNrKG1zZywgJnVucGFja2VkX21zZyk7CisgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7IC8qIHJlbGVhc2UgcGFja2VkIG1lc3NhZ2UuIEl0IGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19wcmludGYoIiVzOiBiY21iYWxfb2JqX21zZ191bnBhY2sgKGVycm9yOiVzKVxuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJjbW9zX3N0cmVycm9yKHJldCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiBtZXNzYWdlIHdhcyBhbGxvY2F0ZWQgaW4gdW5wYWNrIC0gYXNzaWduIGl0ICovCisgICAgICAgIGlmICghICptc2dfcGF5bG9hZCkKKyAgICAgICAgICAgICptc2dfcGF5bG9hZCA9IGJjbWJhbF9wYXlsb2FkX3B0cl9nZXQodW5wYWNrZWRfbXNnKTsKKworICAgIH0gd2hpbGUgKDApOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50MzJfdCBiY21iYWxfYmFsX21zZ19oZHJfZ2V0X3BhY2tlZF9sZW5ndGgodm9pZCkKK3sKKyAgICByZXR1cm4gMjE7IC8qIFNlZSBiY21iYWxfYmFsX21zZ19oZHJfcGFjaygpICovCit9CisKK3N0YXRpYyBpbnQzMl90IGJjbWJhbF9iYWxfbXNnX2hkcl9nZXRfZXhfaWRfb2Zmc2V0KHZvaWQpCit7CisgICAgcmV0dXJuIDE2OyAvKiBTZWUgYmNtYmFsX2JhbF9tc2dfaGRyX3BhY2soKSAqLworfQorCisvKiogUGFjayBhIEJBTCBtZXNzYWdlIGhlYWRlciB0byBhIGJ5dGUgc3RyZWFtICovCitiY21vc19lcnJubyBiY21iYWxfYmFsX21zZ19oZHJfcGFjayhjb25zdCBiYWxfY29tbV9tc2dfaGRyICptc2csIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICBiY21vc19ib29sIHJldDsKKworICAgIC8qIGJjbW9zX21zZyBoZWFkZXIgcGFjay4uLiAoOCBieXRlcyBwb3N0LXBhY2spICovCisgICAgcmV0ID0gYmNtYmFsX2J1Zl93cml0ZV91MzIoYnVmLCBidWYtPmxlbik7CisKKyAgICByZXQgPSByZXQgJiYgYmNtYmFsX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpbXNnLT5tLnR5cGUpOworICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpbXNnLT5tLmluc3RhbmNlKTsKKyAgICByZXQgPSByZXQgJiYgYmNtYmFsX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KW1zZy0+bS5zZW5kZXIpOworCisgICAgLyogLi4uYW5kIHRoZW4gdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciAoMTUgYnl0ZXMgcG9zdC1wYWNrKSAqLworICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgbXNnLT52ZXJzaW9uX21ham9yKTsKKyAgICByZXQgPSByZXQgJiYgYmNtYmFsX2J1Zl93cml0ZV91OChidWYsIG1zZy0+dmVyc2lvbl9taW5vcik7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfd3JpdGVfdTMyKGJ1ZiwgbXNnLT5tc2dfaWQpOyAvKiB0aGUgbXNnX2lkIGNhbm5vdCBiZSBjb21wcmVzc2VkICovCisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KW1zZy0+bXNnX3R5cGUpOworICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3dyaXRlX3UzMihidWYsIG1zZy0+ZXhfaWQpOworICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3dyaXRlX3U4KGJ1ZiwgbXNnLT5zZW5kZXIpOworCisgICAgcmV0dXJuIHJldCA/IEJDTV9FUlJfT0sgOiBCQ01fRVJSX09WRVJGTE9XOworfQorCisvKiogVW5wYWNrIGEgQkFMIG1lc3NhZ2UgaGVhZGVyIGZyb20gYSBieXRlIHN0cmVhbSAqLworYmNtb3NfZXJybm8gYmNtYmFsX2JhbF9tc2dfaGRyX3VucGFjayhiYWxfY29tbV9tc2dfaGRyICptc2csIGJjbWJhbF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCAgIG1fdHlwZTsKKyAgICB1aW50OF90ICAgIG1faW5zdGFuY2U7CisgICAgdWludDhfdCAgICBtX3NlbmRlcjsKKyAgICB1aW50MzJfdCAgIG1fc2l6ZTsKKworICAgIHVpbnQ4X3QgICAgdmVyc2lvbl9tYWpvcjsKKyAgICB1aW50OF90ICAgIHZlcnNpb25fbWlub3I7CisgICAgdWludDMyX3QgICBtc2dfaWQ7CisgICAgdWludDE2X3QgICBtc2dfdHlwZTsKKyAgICB1aW50MzJfdCAgIGV4X2lkOworICAgIHVpbnQ4X3QgICAgc2VuZGVyOworCisgICAgYmNtb3NfYm9vbCByZXQ7CisKKyAgICByZXQgPSBiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgJm1fc2l6ZSk7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmbV90eXBlKTsKKyAgICByZXQgPSByZXQgJiYgYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgJm1faW5zdGFuY2UpOworICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3JlYWRfdTgoYnVmLCAmbV9zZW5kZXIpOworCisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfcmVhZF91OChidWYsICZ2ZXJzaW9uX21ham9yKTsKKyAgICByZXQgPSByZXQgJiYgYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgJnZlcnNpb25fbWlub3IpOworICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgJm1zZ19pZCk7CisgICAgcmV0ID0gcmV0ICYmIGJjbWJhbF9idWZfcmVhZF91MTYoYnVmLCAmbXNnX3R5cGUpOworICAgIHJldCA9IHJldCAmJiBiY21iYWxfYnVmX3JlYWRfdTMyKGJ1ZiwgJmV4X2lkKTsKKyAgICByZXQgPSByZXQgJiYgYmNtYmFsX2J1Zl9yZWFkX3U4KGJ1ZiwgJnNlbmRlcik7CisKKyAgICBpZiAocmV0KQorICAgIHsKKyAgICAgICAgbXNnLT5tLnR5cGUgPSAoYmNtb3NfbXNnX2lkKW1fdHlwZTsKKyAgICAgICAgbXNnLT5tLmluc3RhbmNlID0gKGJjbW9zX21zZ19pbnN0YW5jZSltX2luc3RhbmNlOworICAgICAgICBtc2ctPm0uc2VuZGVyID0gKGJjbW9zX21vZHVsZV9pZCltX3NlbmRlcjsKKyAgICAgICAgbXNnLT5tLnNpemUgPSBtX3NpemU7CisKKyAgICAgICAgbXNnLT52ZXJzaW9uX21ham9yID0gdmVyc2lvbl9tYWpvcjsKKyAgICAgICAgbXNnLT52ZXJzaW9uX21pbm9yID0gdmVyc2lvbl9taW5vcjsKKyAgICAgICAgbXNnLT5tc2dfaWQgPSBtc2dfaWQ7CisgICAgICAgIG1zZy0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKyAgICAgICAgbXNnLT5leF9pZCA9IGV4X2lkOworICAgICAgICBtc2ctPnNlbmRlciA9IHNlbmRlcjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0ID8gQkNNX0VSUl9PSyA6IEJDTV9FUlJfT1ZFUkZMT1c7Cit9CisKKy8qKiBQZWVrIGV4Y2hhbmdlX2lkIGluIHRoZSByZWNlaXZlZCBtZXNzYWdlIHdpdGhvdXQgdW5wYWNraW5nICovCitiY21vc19lcnJubyBiY21iYWxfYmFsX21zZ19wZWVrX2V4X2lkKGJjbW9zX21zZyAqbXNnLCB1aW50MzJfdCAqZXhfaWQpCit7CisgICAgYmNtYmFsX2J1ZiBidWY7CisgICAgaWYgKG1zZy0+c2l6ZSA8IGJjbWJhbF9iYWxfbXNnX2hkcl9nZXRfcGFja2VkX2xlbmd0aCgpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICBiY21iYWxfYnVmX2luaXQoJmJ1ZiwgbXNnLT5zaXplLCBtc2ctPmRhdGEpOworICAgIGJjbW9sdF9idWZfc2V0X3BvcygmYnVmLCBiY21iYWxfYmFsX21zZ19oZHJfZ2V0X2V4X2lkX29mZnNldCgpKTsKKyAgICBiY21iYWxfYnVmX3JlYWRfdTMyKCZidWYsIGV4X2lkKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlib2JqbXNnL2JhbF9vYmpfbXNnX3BhY2tfdW5wYWNrLmMgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYm9iam1zZy9iYWxfb2JqX21zZ19wYWNrX3VucGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOWFmOTcKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYm9iam1zZy9iYWxfb2JqX21zZ19wYWNrX3VucGFjay5jCkBAIC0wLDAgKzEsNTU4IEBACisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmFsX21zZy5oPgorI2luY2x1ZGUgImJhbF9vYmpfbXNnX3BhY2tfdW5wYWNrLmgiCisKK3R5cGVkZWYgdWludDMyX3QgKCpiY21iYWxfZnVuY19wYWNrZWRfbGVuKSAodm9pZCAqdGhpcywgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOwordHlwZWRlZiBiY21vc19ib29sICgqYmNtYmFsX2Z1bmNfcGFjaykgKHZvaWQgKnRoaXMsIGJjbWJhbF9idWYgKmJ1ZiwgYmNtYmFsX3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOwordHlwZWRlZiBiY21vc19ib29sICgqYmNtYmFsX2Z1bmNfdW5wYWNrKSAodm9pZCAqdGhpcywgYmNtYmFsX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7Cit0eXBlZGVmIGJjbW9zX2Jvb2wgKCpiY21iYWxfZnVuY19tZW1fc2NhbikgKGJjbWJhbF9idWYgKiBidWYsIHVpbnQzMl90ICogZXh0cmFfbWVtLCBiY21iYWxfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBiY21iYWxfZ3JvdXBfaW5mbworeworICAgIGJjbWJhbF9vYmpfaWQgb2JqX3R5cGU7CisgICAgYmNtYmFsX21ndF9ncm91cCBncm91cDsKKyAgICB1aW50MTZfdCBzdWJncm91cDsKKyAgICB1aW50MzJfdCBzaXplOworICAgIHVpbnQzMl90IGNvbnRhaW5lcl9zaXplOyAgICAvKiBzaXplb2YoKSB0aGUga2V5L2RhdGEgY29udGFpbmVyIHN0cnVjdCAoMCBmb3Iga2V5IGdyb3VwcykgKi8KKyAgICB1aW50MzJfdCBkYXRhX29mZnNldDsgICAgICAgLyogb2Zmc2V0b2YoKSBkYXRhIGZpZWxkIHdpdGhpbiBjb250YWluZXIgc3RydWN0ICgwIGZvciBrZXkgZ3JvdXBzKSAqLworICAgIGJjbWJhbF9mdW5jX3BhY2tlZF9sZW4gZ2V0X3BhY2tlZF9sZW5ndGg7CisgICAgYmNtYmFsX2Z1bmNfcGFjayBwYWNrOworICAgIGJjbWJhbF9mdW5jX3VucGFjayB1bnBhY2s7CisgICAgYmNtYmFsX2Z1bmNfbWVtX3NjYW4gbWVtX3NjYW47Cit9IGJjbWJhbF9ncm91cF9pbmZvOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgYmNtYmFsX2dyb3VwX2lkcworeworICAgIHVpbnQzMl90IHN1Ymdyb3VwX2NvdW50OworICAgIGJjbWJhbF9vYmpfZ3JvdXBfaWQgKnN1Ymdyb3VwX2lkczsKK30gYmNtYmFsX2dyb3VwX2lkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IGJjbWJhbF9pbnN0YW5jZV9pbmZvCit7CisgICAgaW50OF90IG9mZnNldDsKKyAgICBpbnQ4X3Qgc2l6ZTsKK30gYmNtYmFsX2luc3RhbmNlX2luZm87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtYmFsX2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hY2Nlc3NfdGVybWluYWxfa2V5ID0geyBCQ01CQUxfT0JKX0lEX0FDQ0VTU19URVJNSU5BTCwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleSksIDAsIDAsIChiY21iYWxfZnVuY19wYWNrZWRfbGVuKSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbWJhbF9mdW5jX3BhY2spIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X3BhY2ssIChiY21iYWxfZnVuY191bnBhY2spIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfa2V5X3VucGFjaywgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXlfc2NhbiB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWNjZXNzX3Rlcm1pbmFsX2NmZyA9IHsgQkNNQkFMX09CSl9JRF9BQ0NFU1NfVEVSTUlOQUwsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9jZmdfZGF0YSksIHNpemVvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZyksIG9mZnNldG9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnLCBkYXRhKSwgKGJjbWJhbF9mdW5jX3BhY2tlZF9sZW4pIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21iYWxfZnVuY19wYWNrKSBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhX3BhY2ssIChiY21iYWxfZnVuY191bnBhY2spIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfY2ZnX2RhdGFfdW5wYWNrLCBiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21iYWxfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2FjY2Vzc190ZXJtaW5hbF9pbmQgPSB7IEJDTUJBTF9PQkpfSURfQUNDRVNTX1RFUk1JTkFMLCBCQ01CQUxfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21iYWxfYWNjZXNzX3Rlcm1pbmFsX2luZF9kYXRhKSwgc2l6ZW9mKGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kKSwgb2Zmc2V0b2YoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmQsIGRhdGEpLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbWJhbF9mdW5jX3BhY2spIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGFfcGFjaywgKGJjbWJhbF9mdW5jX3VucGFjaykgYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9pbmRfZGF0YV91bnBhY2ssIGJjbWJhbF9hY2Nlc3NfdGVybWluYWxfaW5kX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZmxvd19rZXkgPSB7IEJDTUJBTF9PQkpfSURfRkxPVywgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21iYWxfZmxvd19rZXkpLCAwLCAwLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX2Zsb3dfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtYmFsX2Z1bmNfcGFjaykgYmNtYmFsX2Zsb3dfa2V5X3BhY2ssIChiY21iYWxfZnVuY191bnBhY2spIGJjbWJhbF9mbG93X2tleV91bnBhY2ssIGJjbWJhbF9mbG93X2tleV9zY2FuIH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2luZm8gZ3JvdXBfaW5mb19mbG93X2NmZyA9IHsgQkNNQkFMX09CSl9JRF9GTE9XLCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbWJhbF9mbG93X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbWJhbF9mbG93X2NmZyksIG9mZnNldG9mKGJjbWJhbF9mbG93X2NmZywgZGF0YSksIChiY21iYWxfZnVuY19wYWNrZWRfbGVuKSBiY21iYWxfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbWJhbF9mdW5jX3BhY2spIGJjbWJhbF9mbG93X2NmZ19kYXRhX3BhY2ssIChiY21iYWxfZnVuY191bnBhY2spIGJjbWJhbF9mbG93X2NmZ19kYXRhX3VucGFjaywgYmNtYmFsX2Zsb3dfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZmxvd19zdGF0ID0geyBCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbWJhbF9mbG93X3N0YXRfZGF0YSksIHNpemVvZihiY21iYWxfZmxvd19zdGF0KSwgb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfc3RhdCwgZGF0YSksIChiY21iYWxfZnVuY19wYWNrZWRfbGVuKSBiY21iYWxfZmxvd19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21iYWxfZnVuY19wYWNrKSBiY21iYWxfZmxvd19zdGF0X2RhdGFfcGFjaywgKGJjbWJhbF9mdW5jX3VucGFjaykgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhX3VucGFjaywgYmNtYmFsX2Zsb3dfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21iYWxfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Zsb3dfaW5kID0geyBCQ01CQUxfT0JKX0lEX0ZMT1csIEJDTUJBTF9NR1RfR1JPVVBfQVVUTywgMCwgc2l6ZW9mKGJjbWJhbF9mbG93X2luZF9kYXRhKSwgc2l6ZW9mKGJjbWJhbF9mbG93X2luZCksIG9mZnNldG9mKGJjbWJhbF9mbG93X2luZCwgZGF0YSksIChiY21iYWxfZnVuY19wYWNrZWRfbGVuKSBiY21iYWxfZmxvd19pbmRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbWJhbF9mdW5jX3BhY2spIGJjbWJhbF9mbG93X2luZF9kYXRhX3BhY2ssIChiY21iYWxfZnVuY191bnBhY2spIGJjbWJhbF9mbG93X2luZF9kYXRhX3VucGFjaywgYmNtYmFsX2Zsb3dfaW5kX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3JvdXBfa2V5ID0geyBCQ01CQUxfT0JKX0lEX0dST1VQLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbWJhbF9ncm91cF9rZXkpLCAwLCAwLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX2dyb3VwX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbWJhbF9mdW5jX3BhY2spIGJjbWJhbF9ncm91cF9rZXlfcGFjaywgKGJjbWJhbF9mdW5jX3VucGFjaykgYmNtYmFsX2dyb3VwX2tleV91bnBhY2ssIGJjbWJhbF9ncm91cF9rZXlfc2NhbiB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3JvdXBfY2ZnID0geyBCQ01CQUxfT0JKX0lEX0dST1VQLCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbWJhbF9ncm91cF9jZmdfZGF0YSksIHNpemVvZihiY21iYWxfZ3JvdXBfY2ZnKSwgb2Zmc2V0b2YoYmNtYmFsX2dyb3VwX2NmZywgZGF0YSksIChiY21iYWxfZnVuY19wYWNrZWRfbGVuKSBiY21iYWxfZ3JvdXBfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21iYWxfZnVuY19wYWNrKSBiY21iYWxfZ3JvdXBfY2ZnX2RhdGFfcGFjaywgKGJjbWJhbF9mdW5jX3VucGFjaykgYmNtYmFsX2dyb3VwX2NmZ19kYXRhX3VucGFjaywgYmNtYmFsX2dyb3VwX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21iYWxfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2ludGVyZmFjZV9rZXkgPSB7IEJDTUJBTF9PQkpfSURfSU5URVJGQUNFLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbWJhbF9pbnRlcmZhY2Vfa2V5KSwgMCwgMCwgKGJjbWJhbF9mdW5jX3BhY2tlZF9sZW4pIGJjbWJhbF9pbnRlcmZhY2Vfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtYmFsX2Z1bmNfcGFjaykgYmNtYmFsX2ludGVyZmFjZV9rZXlfcGFjaywgKGJjbWJhbF9mdW5jX3VucGFjaykgYmNtYmFsX2ludGVyZmFjZV9rZXlfdW5wYWNrLCBiY21iYWxfaW50ZXJmYWNlX2tleV9zY2FuIH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2luZm8gZ3JvdXBfaW5mb19pbnRlcmZhY2VfY2ZnID0geyBCQ01CQUxfT0JKX0lEX0lOVEVSRkFDRSwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21iYWxfaW50ZXJmYWNlX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbWJhbF9pbnRlcmZhY2VfY2ZnKSwgb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9jZmcsIGRhdGEpLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbWJhbF9mdW5jX3BhY2spIGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGFfcGFjaywgKGJjbWJhbF9mdW5jX3VucGFjaykgYmNtYmFsX2ludGVyZmFjZV9jZmdfZGF0YV91bnBhY2ssIGJjbWJhbF9pbnRlcmZhY2VfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pbmZvIGdyb3VwX2luZm9faW50ZXJmYWNlX3N0YXQgPSB7IEJDTUJBTF9PQkpfSURfSU5URVJGQUNFLCBCQ01CQUxfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YSksIHNpemVvZihiY21iYWxfaW50ZXJmYWNlX3N0YXQpLCBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX3N0YXQsIGRhdGEpLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX2ludGVyZmFjZV9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21iYWxfZnVuY19wYWNrKSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YV9wYWNrLCAoYmNtYmFsX2Z1bmNfdW5wYWNrKSBiY21iYWxfaW50ZXJmYWNlX3N0YXRfZGF0YV91bnBhY2ssIGJjbWJhbF9pbnRlcmZhY2Vfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21iYWxfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2ludGVyZmFjZV9pbmQgPSB7IEJDTUJBTF9PQkpfSURfSU5URVJGQUNFLCBCQ01CQUxfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21iYWxfaW50ZXJmYWNlX2luZF9kYXRhKSwgc2l6ZW9mKGJjbWJhbF9pbnRlcmZhY2VfaW5kKSwgb2Zmc2V0b2YoYmNtYmFsX2ludGVyZmFjZV9pbmQsIGRhdGEpLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbWJhbF9mdW5jX3BhY2spIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGFfcGFjaywgKGJjbWJhbF9mdW5jX3VucGFjaykgYmNtYmFsX2ludGVyZmFjZV9pbmRfZGF0YV91bnBhY2ssIGJjbWJhbF9pbnRlcmZhY2VfaW5kX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pbmZvIGdyb3VwX2luZm9fcGFja2V0X2tleSA9IHsgQkNNQkFMX09CSl9JRF9QQUNLRVQsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtYmFsX3BhY2tldF9rZXkpLCAwLCAwLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX3BhY2tldF9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21iYWxfZnVuY19wYWNrKSBiY21iYWxfcGFja2V0X2tleV9wYWNrLCAoYmNtYmFsX2Z1bmNfdW5wYWNrKSBiY21iYWxfcGFja2V0X2tleV91bnBhY2ssIGJjbWJhbF9wYWNrZXRfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21iYWxfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3BhY2tldF9jZmcgPSB7IEJDTUJBTF9PQkpfSURfUEFDS0VULCBCQ01CQUxfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbWJhbF9wYWNrZXRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtYmFsX3BhY2tldF9jZmcpLCBvZmZzZXRvZihiY21iYWxfcGFja2V0X2NmZywgZGF0YSksIChiY21iYWxfZnVuY19wYWNrZWRfbGVuKSBiY21iYWxfcGFja2V0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtYmFsX2Z1bmNfcGFjaykgYmNtYmFsX3BhY2tldF9jZmdfZGF0YV9wYWNrLCAoYmNtYmFsX2Z1bmNfdW5wYWNrKSBiY21iYWxfcGFja2V0X2NmZ19kYXRhX3VucGFjaywgYmNtYmFsX3BhY2tldF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2luZm8gZ3JvdXBfaW5mb19wYWNrZXRfaW5kID0geyBCQ01CQUxfT0JKX0lEX1BBQ0tFVCwgQkNNQkFMX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtYmFsX3BhY2tldF9pbmRfZGF0YSksIHNpemVvZihiY21iYWxfcGFja2V0X2luZCksIG9mZnNldG9mKGJjbWJhbF9wYWNrZXRfaW5kLCBkYXRhKSwgKGJjbWJhbF9mdW5jX3BhY2tlZF9sZW4pIGJjbWJhbF9wYWNrZXRfaW5kX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21iYWxfZnVuY19wYWNrKSBiY21iYWxfcGFja2V0X2luZF9kYXRhX3BhY2ssIChiY21iYWxfZnVuY191bnBhY2spIGJjbWJhbF9wYWNrZXRfaW5kX2RhdGFfdW5wYWNrLCBiY21iYWxfcGFja2V0X2luZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21iYWxfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3N1YnNjcmliZXJfdGVybWluYWxfa2V5ID0geyBCQ01CQUxfT0JKX0lEX1NVQlNDUklCRVJfVEVSTUlOQUwsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5KSwgMCwgMCwgKGJjbWJhbF9mdW5jX3BhY2tlZF9sZW4pIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbWJhbF9mdW5jX3BhY2spIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2tleV9wYWNrLCAoYmNtYmFsX2Z1bmNfdW5wYWNrKSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfdW5wYWNrLCBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlfc2NhbiB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pbmZvIGdyb3VwX2luZm9fc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgPSB7IEJDTUJBTF9PQkpfSURfU1VCU0NSSUJFUl9URVJNSU5BTCwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YSksIHNpemVvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcpLCBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcsIGRhdGEpLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21iYWxfZnVuY19wYWNrKSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YV9wYWNrLCAoYmNtYmFsX2Z1bmNfdW5wYWNrKSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmdfZGF0YV91bnBhY2ssIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21iYWxfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdCA9IHsgQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMLCBCQ01CQUxfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0X2RhdGEpLCBzaXplb2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdCksIG9mZnNldG9mKGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXQsIGRhdGEpLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtYmFsX2Z1bmNfcGFjaykgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfc3RhdF9kYXRhX3BhY2ssIChiY21iYWxfZnVuY191bnBhY2spIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YV91bnBhY2ssIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2luZm8gZ3JvdXBfaW5mb19zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZCA9IHsgQkNNQkFMX09CSl9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMLCBCQ01CQUxfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YSksIHNpemVvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmQpLCBvZmZzZXRvZihiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmQsIGRhdGEpLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfaW5kX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21iYWxfZnVuY19wYWNrKSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YV9wYWNrLCAoYmNtYmFsX2Z1bmNfdW5wYWNrKSBiY21iYWxfc3Vic2NyaWJlcl90ZXJtaW5hbF9pbmRfZGF0YV91bnBhY2ssIGJjbWJhbF9zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21iYWxfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3RtX3F1ZXVlX2tleSA9IHsgQkNNQkFMX09CSl9JRF9UTV9RVUVVRSwgQkNNQkFMX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21iYWxfdG1fcXVldWVfa2V5KSwgMCwgMCwgKGJjbWJhbF9mdW5jX3BhY2tlZF9sZW4pIGJjbWJhbF90bV9xdWV1ZV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21iYWxfZnVuY19wYWNrKSBiY21iYWxfdG1fcXVldWVfa2V5X3BhY2ssIChiY21iYWxfZnVuY191bnBhY2spIGJjbWJhbF90bV9xdWV1ZV9rZXlfdW5wYWNrLCBiY21iYWxfdG1fcXVldWVfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21iYWxfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3RtX3F1ZXVlX2NmZyA9IHsgQkNNQkFMX09CSl9JRF9UTV9RVUVVRSwgQkNNQkFMX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21iYWxfdG1fcXVldWVfY2ZnX2RhdGEpLCBzaXplb2YoYmNtYmFsX3RtX3F1ZXVlX2NmZyksIG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9jZmcsIGRhdGEpLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtYmFsX2Z1bmNfcGFjaykgYmNtYmFsX3RtX3F1ZXVlX2NmZ19kYXRhX3BhY2ssIChiY21iYWxfZnVuY191bnBhY2spIGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YV91bnBhY2ssIGJjbWJhbF90bV9xdWV1ZV9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2luZm8gZ3JvdXBfaW5mb190bV9xdWV1ZV9zdGF0ID0geyBCQ01CQUxfT0JKX0lEX1RNX1FVRVVFLCBCQ01CQUxfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21iYWxfdG1fcXVldWVfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbWJhbF90bV9xdWV1ZV9zdGF0KSwgb2Zmc2V0b2YoYmNtYmFsX3RtX3F1ZXVlX3N0YXQsIGRhdGEpLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbWJhbF9mdW5jX3BhY2spIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGFfcGFjaywgKGJjbWJhbF9mdW5jX3VucGFjaykgYmNtYmFsX3RtX3F1ZXVlX3N0YXRfZGF0YV91bnBhY2ssIGJjbWJhbF90bV9xdWV1ZV9zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pbmZvIGdyb3VwX2luZm9fdG1fcXVldWVfaW5kID0geyBCQ01CQUxfT0JKX0lEX1RNX1FVRVVFLCBCQ01CQUxfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21iYWxfdG1fcXVldWVfaW5kX2RhdGEpLCBzaXplb2YoYmNtYmFsX3RtX3F1ZXVlX2luZCksIG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9pbmQsIGRhdGEpLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtYmFsX2Z1bmNfcGFjaykgYmNtYmFsX3RtX3F1ZXVlX2luZF9kYXRhX3BhY2ssIChiY21iYWxfZnVuY191bnBhY2spIGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YV91bnBhY2ssIGJjbWJhbF90bV9xdWV1ZV9pbmRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2luZm8gZ3JvdXBfaW5mb190bV9zY2hlZF9rZXkgPSB7IEJDTUJBTF9PQkpfSURfVE1fU0NIRUQsIEJDTUJBTF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtYmFsX3RtX3NjaGVkX2tleSksIDAsIDAsIChiY21iYWxfZnVuY19wYWNrZWRfbGVuKSBiY21iYWxfdG1fc2NoZWRfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtYmFsX2Z1bmNfcGFjaykgYmNtYmFsX3RtX3NjaGVkX2tleV9wYWNrLCAoYmNtYmFsX2Z1bmNfdW5wYWNrKSBiY21iYWxfdG1fc2NoZWRfa2V5X3VucGFjaywgYmNtYmFsX3RtX3NjaGVkX2tleV9zY2FuIH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2luZm8gZ3JvdXBfaW5mb190bV9zY2hlZF9jZmcgPSB7IEJDTUJBTF9PQkpfSURfVE1fU0NIRUQsIEJDTUJBTF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtYmFsX3RtX3NjaGVkX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbWJhbF90bV9zY2hlZF9jZmcpLCBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfY2ZnLCBkYXRhKSwgKGJjbWJhbF9mdW5jX3BhY2tlZF9sZW4pIGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbWJhbF9mdW5jX3BhY2spIGJjbWJhbF90bV9zY2hlZF9jZmdfZGF0YV9wYWNrLCAoYmNtYmFsX2Z1bmNfdW5wYWNrKSBiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGFfdW5wYWNrLCBiY21iYWxfdG1fc2NoZWRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pbmZvIGdyb3VwX2luZm9fdG1fc2NoZWRfaW5kID0geyBCQ01CQUxfT0JKX0lEX1RNX1NDSEVELCBCQ01CQUxfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21iYWxfdG1fc2NoZWRfaW5kX2RhdGEpLCBzaXplb2YoYmNtYmFsX3RtX3NjaGVkX2luZCksIG9mZnNldG9mKGJjbWJhbF90bV9zY2hlZF9pbmQsIGRhdGEpLCAoYmNtYmFsX2Z1bmNfcGFja2VkX2xlbikgYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtYmFsX2Z1bmNfcGFjaykgYmNtYmFsX3RtX3NjaGVkX2luZF9kYXRhX3BhY2ssIChiY21iYWxfZnVuY191bnBhY2spIGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YV91bnBhY2ssIGJjbWJhbF90bV9zY2hlZF9pbmRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2luZm8gKmdyb3VwX2luZm9bXSA9IHsgJmdyb3VwX2luZm9fYWNjZXNzX3Rlcm1pbmFsX2tleSwgJmdyb3VwX2luZm9fYWNjZXNzX3Rlcm1pbmFsX2NmZywgJmdyb3VwX2luZm9fYWNjZXNzX3Rlcm1pbmFsX2luZCwgJmdyb3VwX2luZm9fZmxvd19rZXksICZncm91cF9pbmZvX2Zsb3dfY2ZnLCAmZ3JvdXBfaW5mb19mbG93X3N0YXQsICZncm91cF9pbmZvX2Zsb3dfaW5kLCAmZ3JvdXBfaW5mb19ncm91cF9rZXksICZncm91cF9pbmZvX2dyb3VwX2NmZywgJmdyb3VwX2luZm9faW50ZXJmYWNlX2tleSwgJmdyb3VwX2luZm9faW50ZXJmYWNlX2NmZywgJmdyb3VwX2luZm9faW50ZXJmYWNlX3N0YXQsICZncm91cF9pbmZvX2ludGVyZmFjZV9pbmQsICZncm91cF9pbmZvX3BhY2tldF9rZXksICZncm91cF9pbmZvX3BhY2tldF9jZmcsICZncm91cF9pbmZvX3BhY2tldF9pbmQsICZncm91cF9pbmZvX3N1YnNjcmliZXJfdGVybWluYWxfa2V5LCAmZ3JvdXBfaW5mb19zdWJzY3JpYmVyX3Rlcm1pbmFsX2NmZywgJmdyb3VwX2luZm9fc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0LCAmZ3JvdXBfaW5mb19zdWJzY3JpYmVyX3Rlcm1pbmFsX2luZCwgJmdyb3VwX2luZm9fdG1fcXVldWVfa2V5LCAmZ3JvdXBfaW5mb190bV9xdWV1ZV9jZmcsICZncm91cF9pbmZvX3RtX3F1ZXVlX3N0YXQsICZncm91cF9pbmZvX3RtX3F1ZXVlX2luZCwgJmdyb3VwX2luZm9fdG1fc2NoZWRfa2V5LCAmZ3JvdXBfaW5mb190bV9zY2hlZF9jZmcsICZncm91cF9pbmZvX3RtX3NjaGVkX2luZCB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX2FjY2Vzc190ZXJtaW5hbF9rZXlbXSA9IHsgQkNNQkFMX09CSl9HUk9VUF9JRF9BQ0NFU1NfVEVSTUlOQUxfS0VZIH07CitzdGF0aWMgYmNtYmFsX29ial9ncm91cF9pZCBncm91cF9pZHNfYWNjZXNzX3Rlcm1pbmFsX2NmZ1tdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX0FDQ0VTU19URVJNSU5BTF9DRkcgfTsKK3N0YXRpYyBiY21iYWxfb2JqX2dyb3VwX2lkIGdyb3VwX2lkc19hY2Nlc3NfdGVybWluYWxfYXV0b1tdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX0FDQ0VTU19URVJNSU5BTF9JTkQgfTsKK3N0YXRpYyBiY21iYWxfb2JqX2dyb3VwX2lkIGdyb3VwX2lkc19mbG93X2tleVtdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX0ZMT1dfS0VZIH07CitzdGF0aWMgYmNtYmFsX29ial9ncm91cF9pZCBncm91cF9pZHNfZmxvd19jZmdbXSA9IHsgQkNNQkFMX09CSl9HUk9VUF9JRF9GTE9XX0NGRyB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Zsb3dfc3RhdFtdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX0ZMT1dfU1RBVCB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Zsb3dfYXV0b1tdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX0ZMT1dfSU5EIH07CitzdGF0aWMgYmNtYmFsX29ial9ncm91cF9pZCBncm91cF9pZHNfZ3JvdXBfa2V5W10gPSB7IEJDTUJBTF9PQkpfR1JPVVBfSURfR1JPVVBfS0VZIH07CitzdGF0aWMgYmNtYmFsX29ial9ncm91cF9pZCBncm91cF9pZHNfZ3JvdXBfY2ZnW10gPSB7IEJDTUJBTF9PQkpfR1JPVVBfSURfR1JPVVBfQ0ZHIH07CitzdGF0aWMgYmNtYmFsX29ial9ncm91cF9pZCBncm91cF9pZHNfaW50ZXJmYWNlX2tleVtdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX0lOVEVSRkFDRV9LRVkgfTsKK3N0YXRpYyBiY21iYWxfb2JqX2dyb3VwX2lkIGdyb3VwX2lkc19pbnRlcmZhY2VfY2ZnW10gPSB7IEJDTUJBTF9PQkpfR1JPVVBfSURfSU5URVJGQUNFX0NGRyB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX2ludGVyZmFjZV9zdGF0W10gPSB7IEJDTUJBTF9PQkpfR1JPVVBfSURfSU5URVJGQUNFX1NUQVQgfTsKK3N0YXRpYyBiY21iYWxfb2JqX2dyb3VwX2lkIGdyb3VwX2lkc19pbnRlcmZhY2VfYXV0b1tdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX0lOVEVSRkFDRV9JTkQgfTsKK3N0YXRpYyBiY21iYWxfb2JqX2dyb3VwX2lkIGdyb3VwX2lkc19wYWNrZXRfa2V5W10gPSB7IEJDTUJBTF9PQkpfR1JPVVBfSURfUEFDS0VUX0tFWSB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX3BhY2tldF9jZmdbXSA9IHsgQkNNQkFMX09CSl9HUk9VUF9JRF9QQUNLRVRfQ0ZHIH07CitzdGF0aWMgYmNtYmFsX29ial9ncm91cF9pZCBncm91cF9pZHNfcGFja2V0X2F1dG9bXSA9IHsgQkNNQkFMX09CSl9HUk9VUF9JRF9QQUNLRVRfSU5EIH07CitzdGF0aWMgYmNtYmFsX29ial9ncm91cF9pZCBncm91cF9pZHNfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXlbXSA9IHsgQkNNQkFMX09CSl9HUk9VUF9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0tFWSB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX3N1YnNjcmliZXJfdGVybWluYWxfY2ZnW10gPSB7IEJDTUJBTF9PQkpfR1JPVVBfSURfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkcgfTsKK3N0YXRpYyBiY21iYWxfb2JqX2dyb3VwX2lkIGdyb3VwX2lkc19zdWJzY3JpYmVyX3Rlcm1pbmFsX3N0YXRbXSA9IHsgQkNNQkFMX09CSl9HUk9VUF9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMX1NUQVQgfTsKK3N0YXRpYyBiY21iYWxfb2JqX2dyb3VwX2lkIGdyb3VwX2lkc19zdWJzY3JpYmVyX3Rlcm1pbmFsX2F1dG9bXSA9IHsgQkNNQkFMX09CSl9HUk9VUF9JRF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0lORCB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX3RtX3F1ZXVlX2tleVtdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX1RNX1FVRVVFX0tFWSB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX3RtX3F1ZXVlX2NmZ1tdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX1RNX1FVRVVFX0NGRyB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX3RtX3F1ZXVlX3N0YXRbXSA9IHsgQkNNQkFMX09CSl9HUk9VUF9JRF9UTV9RVUVVRV9TVEFUIH07CitzdGF0aWMgYmNtYmFsX29ial9ncm91cF9pZCBncm91cF9pZHNfdG1fcXVldWVfYXV0b1tdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX1RNX1FVRVVFX0lORCB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX3RtX3NjaGVkX2tleVtdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX1RNX1NDSEVEX0tFWSB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX3RtX3NjaGVkX2NmZ1tdID0geyBCQ01CQUxfT0JKX0dST1VQX0lEX1RNX1NDSEVEX0NGRyB9Oworc3RhdGljIGJjbWJhbF9vYmpfZ3JvdXBfaWQgZ3JvdXBfaWRzX3RtX3NjaGVkX2F1dG9bXSA9IHsgQkNNQkFMX09CSl9HUk9VUF9JRF9UTV9TQ0hFRF9JTkQgfTsKK3N0YXRpYyBiY21iYWxfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfYWNjZXNzX3Rlcm1pbmFsW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2FjY2Vzc190ZXJtaW5hbF9rZXkgfSwgeyAxLCBncm91cF9pZHNfYWNjZXNzX3Rlcm1pbmFsX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAxLCBncm91cF9pZHNfYWNjZXNzX3Rlcm1pbmFsX2F1dG8gfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21iYWxfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZmxvd1tdID0geyB7IDEsIGdyb3VwX2lkc19mbG93X2tleSB9LCB7IDEsIGdyb3VwX2lkc19mbG93X2NmZyB9LCB7IDEsIGdyb3VwX2lkc19mbG93X3N0YXQgfSwgeyAxLCBncm91cF9pZHNfZmxvd19hdXRvIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2dyb3VwW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2dyb3VwX2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncm91cF9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9pbnRlcmZhY2VbXSA9IHsgeyAxLCBncm91cF9pZHNfaW50ZXJmYWNlX2tleSB9LCB7IDEsIGdyb3VwX2lkc19pbnRlcmZhY2VfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2ludGVyZmFjZV9zdGF0IH0sIHsgMSwgZ3JvdXBfaWRzX2ludGVyZmFjZV9hdXRvIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX3BhY2tldFtdID0geyB7IDEsIGdyb3VwX2lkc19wYWNrZXRfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX3BhY2tldF9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMSwgZ3JvdXBfaWRzX3BhY2tldF9hdXRvIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX3N1YnNjcmliZXJfdGVybWluYWxbXSA9IHsgeyAxLCBncm91cF9pZHNfc3Vic2NyaWJlcl90ZXJtaW5hbF9rZXkgfSwgeyAxLCBncm91cF9pZHNfc3Vic2NyaWJlcl90ZXJtaW5hbF9jZmcgfSwgeyAxLCBncm91cF9pZHNfc3Vic2NyaWJlcl90ZXJtaW5hbF9zdGF0IH0sIHsgMSwgZ3JvdXBfaWRzX3N1YnNjcmliZXJfdGVybWluYWxfYXV0byB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial90bV9xdWV1ZVtdID0geyB7IDEsIGdyb3VwX2lkc190bV9xdWV1ZV9rZXkgfSwgeyAxLCBncm91cF9pZHNfdG1fcXVldWVfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX3RtX3F1ZXVlX3N0YXQgfSwgeyAxLCBncm91cF9pZHNfdG1fcXVldWVfYXV0byB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbWJhbF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial90bV9zY2hlZFtdID0geyB7IDEsIGdyb3VwX2lkc190bV9zY2hlZF9rZXkgfSwgeyAxLCBncm91cF9pZHNfdG1fc2NoZWRfY2ZnIH0sIHsgMCwgTlVMTCB9LCB7IDEsIGdyb3VwX2lkc190bV9zY2hlZF9hdXRvIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtYmFsX2dyb3VwX2lkcyAqZ3JvdXBfaWRzW10gPSB7IGdyb3VwX2lkc19vYmpfYWNjZXNzX3Rlcm1pbmFsLCBncm91cF9pZHNfb2JqX2Zsb3csIGdyb3VwX2lkc19vYmpfZ3JvdXAsIGdyb3VwX2lkc19vYmpfaW50ZXJmYWNlLCBncm91cF9pZHNfb2JqX3BhY2tldCwgZ3JvdXBfaWRzX29ial9zdWJzY3JpYmVyX3Rlcm1pbmFsLCBncm91cF9pZHNfb2JqX3RtX3F1ZXVlLCBncm91cF9pZHNfb2JqX3RtX3NjaGVkIH07CitzdGF0aWMgYmNtYmFsX3ByZXNlbmNlX21hc2sgcmVhZG9ubHlfcHJvcF9tYXNrW10gPSB7ICgxVUxMIDw8IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfQ0ZHX0lEX09QRVJfU1RBVFVTKSB8ICgxVUxMIDw8IEJDTUJBTF9BQ0NFU1NfVEVSTUlOQUxfQ0ZHX0lEX0lXRl9NT0RFKSwgMVVMTCA8PCBCQ01CQUxfRkxPV19DRkdfSURfT1BFUl9TVEFUVVMsICgxVUxMIDw8IEJDTUJBTF9HUk9VUF9DRkdfSURfRkxPV1MpIHwgKDFVTEwgPDwgQkNNQkFMX0dST1VQX0NGR19JRF9PV05FUiksICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX09QRVJfU1RBVFVTKSB8ICgxVUxMIDw8IEJDTUJBTF9JTlRFUkZBQ0VfQ0ZHX0lEX1NVQl9URVJNX0lEX0xJU1QpLCAwLCAoKCgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9PUEVSX1NUQVRVUykgfCAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfU1ZDX1BPUlRfSUQpKSB8ICgxVUxMIDw8IEJDTUJBTF9TVUJTQ1JJQkVSX1RFUk1JTkFMX0NGR19JRF9TVkNfUE9SVF9JRF9MSVNUKSkgfCAoMVVMTCA8PCBCQ01CQUxfU1VCU0NSSUJFUl9URVJNSU5BTF9DRkdfSURfQUdHX1BPUlRfSURfTElTVCksICgxVUxMIDw8IEJDTUJBTF9UTV9RVUVVRV9DRkdfSURfQ1JFQVRJT05fTU9ERSkgfCAoMVVMTCA8PCBCQ01CQUxfVE1fUVVFVUVfQ0ZHX0lEX1JFRl9DT1VOVCksICgoMVVMTCA8PCBCQ01CQUxfVE1fU0NIRURfQ0ZHX0lEX0NSRUFUSU9OX01PREUpIHwgKDFVTEwgPDwgQkNNQkFMX1RNX1NDSEVEX0NGR19JRF9RVUVVRVMpKSB8ICgxVUxMIDw8IEJDTUJBTF9UTV9TQ0hFRF9DRkdfSURfU1VCX1NDSEVEUykgfTsKK3N0YXRpYyBiY21iYWxfaW5zdGFuY2VfaW5mbyBpbnN0YW5jZV9pbmZvW10gPSB7IHsgb2Zmc2V0b2YoYmNtYmFsX2FjY2Vzc190ZXJtaW5hbF9rZXksIGFjY2Vzc190ZXJtX2lkKSwgc2l6ZW9mKGJjbWJhbF9hY2Nlc3NfaWQpIH0sIHsgb2Zmc2V0b2YoYmNtYmFsX2Zsb3dfa2V5LCBmbG93X2lkKSwgc2l6ZW9mKGJjbWJhbF9mbG93X2lkKSB9LCB7IG9mZnNldG9mKGJjbWJhbF9ncm91cF9rZXksIGdyb3VwX2lkKSwgc2l6ZW9mKGJjbWJhbF9ncm91cF9pZCkgfSwgeyBvZmZzZXRvZihiY21iYWxfaW50ZXJmYWNlX2tleSwgaW50Zl9pZCksIHNpemVvZih1aW50MzJfdCkgfSwgeyBvZmZzZXRvZihiY21iYWxfcGFja2V0X2tleSwgcmVzZXJ2ZWQpLCBzaXplb2YodWludDMyX3QpIH0sIHsgb2Zmc2V0b2YoYmNtYmFsX3N1YnNjcmliZXJfdGVybWluYWxfa2V5LCBzdWJfdGVybV9pZCksIHNpemVvZihiY21iYWxfc3ViX2lkKSB9LCB7IG9mZnNldG9mKGJjbWJhbF90bV9xdWV1ZV9rZXksIGlkKSwgc2l6ZW9mKGJjbWJhbF90bV9xdWV1ZV9pZCkgfSwgeyBvZmZzZXRvZihiY21iYWxfdG1fc2NoZWRfa2V5LCBpZCksIHNpemVvZihiY21iYWxfdG1fc2NoZWRfaWQpIH0gfTsKKworLyoqIENvbnZlcnRzIGEgc3BlY2lmaWMgb2JqZWN0IHR5cGUsIGdyb3VwIGFuZCBzdWJncm91cCBpbnRvIGEgZ2VuZXJpYyBncm91cCBJRC4KKyAqCisgKiBccGFyYW0gb2JqIFRoZSBvYmplY3QgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBncm91cCBJRC4KKyAqIFxwYXJhbSBncm91cCBUaGUgZ3JvdXAgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBncm91cCBJRC4KKyAqIFxwYXJhbSBzdWJncm91cCBUaGUgc3ViZ3JvdXAgaW5kZXggdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ3JvdXAgSUQuCisgKiBccGFyYW0gZ3JvdXBfaWQgVGhlIGdlbmVyaWMgZ3JvdXAgSUQuCisgKiBccmV0dXJuIEFuIGVycm9yIGNvZGUgb3IgQkNNX0VSUl9PSyBmb3Igc3VjY2Vzcy4gCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtYmFsX29ial9ncm91cF9pZF9jb21iaW5lKGJjbWJhbF9vYmpfaWQgb2JqLCBiY21iYWxfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgYmNtYmFsX29ial9ncm91cF9pZCAqZ3JvdXBfaWQpCit7CisgICAgaWYgKChvYmogPj0gQkNNQkFMX09CSl9JRF9fTlVNX09GKSB8fCAoZ3JvdXAgPj0gQkNNQkFMX01HVF9HUk9VUF9fTlVNX09GKSB8fCAoZ3JvdXBfaWRzW29ial0gPT0gTlVMTCkgfHwgKHN1Ymdyb3VwID49IGdyb3VwX2lkc1tvYmpdW2dyb3VwXS5zdWJncm91cF9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAqZ3JvdXBfaWQgPSBncm91cF9pZHNbb2JqXVtncm91cF0uc3ViZ3JvdXBfaWRzW3N1Ymdyb3VwXTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19ib29sIF9iY21iYWxfZ2V0X2dyb3VwX2luZm8oY29uc3QgYmNtYmFsX29iaiAqbXNnLCBiY21iYWxfZ3JvdXBfaW5mbyAqKmdyb3VwLCBiY21iYWxfZ3JvdXBfaW5mbyAqKmtleSkKK3sKKyAgICBiY21iYWxfb2JqX2dyb3VwX2lkIGdyb3VwX2lkOworICAgIGJjbWJhbF9vYmpfZ3JvdXBfaWQga2V5X2lkOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGVyciA9IF9iY21iYWxfb2JqX2dyb3VwX2lkX2NvbWJpbmUobXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgbXNnLT5zdWJncm91cCwgJmdyb3VwX2lkKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZXJyID0gX2JjbWJhbF9vYmpfZ3JvdXBfaWRfY29tYmluZShtc2ctPm9ial90eXBlLCBCQ01CQUxfTUdUX0dST1VQX0tFWSwgMCwgJmtleV9pZCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpncm91cCA9IGdyb3VwX2luZm9bZ3JvdXBfaWRdOworICAgICprZXkgPSBncm91cF9pbmZvW2tleV9pZF07CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYSBtZXNzYWdlIHdvdWxkIG9jY3VweSB3aGVuIHBhY2tlZC4gCisgKgorICogXHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0byBzY2FuLiAKKyAqIFxyZXR1cm4gVGhlIHNpemUgaW4gYnl0ZXMgaWYgPiAwLCBvciBhbiBlcnJvciBhcyBkZWZpbmVkIGluIGJjbW9zX2Vycm5vLiAKKyAqLworc3RhdGljIGludDMyX3QgX2JjbWJhbF9vYmpfbXNnX3BhY2tlZF9sZW5ndGhfZ2V0KGJjbWJhbF9vYmogKm1zZykKK3sKKyAgICB1aW50OF90ICprZXlfcHRyOworICAgIGJjbWJhbF9ncm91cF9pbmZvICpncm91cDsKKyAgICBiY21iYWxfZ3JvdXBfaW5mbyAqa2V5OworICAgIGludDMyX3QgcmV0OworCisgICAgLyogRmlyc3QsIGdldCB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBwYWNrZWQgQkFMIG1zZyBoZWFkZXIgYW5kIHRoZSBwYWNrZWQgQkFMIG9iamVjdCBoZWFkZXIgKi8KKyAgICByZXQgPSBiY21iYWxfYmFsX21zZ19oZHJfZ2V0X3BhY2tlZF9sZW5ndGgoKSArIGJjbWJhbF9vYmpfbXNnX2hkcl9nZXRfcGFja2VkX2xlbmd0aCgpOworCisgICAgaWYgKCFfYmNtYmFsX2dldF9ncm91cF9pbmZvKG1zZywgJmdyb3VwLCAma2V5KSkKKyAgICB7CisgICAgICAgIHJldHVybiAoaW50MzJfdCkgQkNNX0VSUl9NU0dfRVJST1I7CisgICAgfQorCisgICAga2V5X3B0ciA9ICh1aW50OF90ICopIChtc2cgKyAxKTsKKworICAgIC8qIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZWQga2V5ICovCisgICAgcmV0ICs9IGtleS0+Z2V0X3BhY2tlZF9sZW5ndGgoa2V5X3B0ciwgQkNNQkFMX1BSRVNFTkNFX01BU0tfQUxMKTsKKworICAgIC8qIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZWQgb2JqZWN0IGl0c2VsZiAoZm9yIHRob3NlIGF0dHJpYnV0ZXMgdGhhdCBoYXZlIGJlZW4gc3BlY2lmaWVkLCBpZiBhbnkpICovCisgICAgaWYgKGJjbWJhbF9vYmpfbXNnX3Nob3VsZF9wYWNrX2RhdGEobXNnKSAmJiAoZ3JvdXAtPmdldF9wYWNrZWRfbGVuZ3RoICE9IE5VTEwpKQorICAgIHsKKyAgICAgICAgdWludDhfdCAqZGF0YV9wdHIgPSAodWludDhfdCAqKSAoKGxvbmcpbXNnICsgZ3JvdXAtPmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgcmV0ICs9IGdyb3VwLT5nZXRfcGFja2VkX2xlbmd0aChkYXRhX3B0ciwgbXNnLT5wcmVzZW5jZV9tYXNrKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiogUGFja3MgYSBtZXNzYWdlIHRvIGEgYnl0ZSBzdHJlYW0uCisgKgorICogXHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0byBwYWNrLiAKKyAqIFxwYXJhbSBidWYgVGhlIHN0cmVhbSB0byBwYWNrIGludG8uIAorICogXHJldHVybiBBbiBlcnJvciBjb2RlIG9yIEJDTV9FUlJfT0sgZm9yIHN1Y2Nlc3MuIAorICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWJhbF9vYmpfbXNnX3BhY2soYmFsX2NvbW1fbXNnX2hkciAqbXNnLCBiY21iYWxfYnVmICpidWYpCit7CisgICAgdWludDhfdCAqa2V5X3B0cjsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtYmFsX2dyb3VwX2luZm8gKmdyb3VwOworICAgIGJjbWJhbF9ncm91cF9pbmZvICprZXk7CisgICAgYmNtYmFsX29iaiAqYmFsX29iaiA9IChiY21iYWxfb2JqICopYmNtYmFsX3BheWxvYWRfcHRyX2dldChtc2cpOworCisgICAgaWYgKCFfYmNtYmFsX2dldF9ncm91cF9pbmZvKGJhbF9vYmosICZncm91cCwgJmtleSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9NU0dfRVJST1I7CisgICAgfQorCisgICAgZXJyID0gYmNtYmFsX2JhbF9tc2dfaGRyX3BhY2sobXNnLCBidWYpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gYmNtYmFsX29ial9tc2dfaGRyX3BhY2soYmFsX29iaiwgYnVmKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGtleV9wdHIgPSAodWludDhfdCAqKSAoYmFsX29iaiArIDEpOworICAgIGlmICgha2V5LT5wYWNrKGtleV9wdHIsIGJ1ZiwgQkNNQkFMX1BSRVNFTkNFX01BU0tfQUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKworICAgIGlmIChiY21iYWxfb2JqX21zZ19zaG91bGRfcGFja19kYXRhKGJhbF9vYmopICYmIChncm91cC0+cGFjayAhPSBOVUxMKSkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgKmRhdGFfcHRyID0gKHVpbnQ4X3QgKikgKChsb25nKWJhbF9vYmogKyBncm91cC0+ZGF0YV9vZmZzZXQpOworICAgICAgICBpZiAoIWdyb3VwLT5wYWNrKGRhdGFfcHRyLCBidWYsIGJhbF9vYmotPnByZXNlbmNlX21hc2spKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qIHNjYW4gdGhlIGlucHV0IGJ1ZmZlciB0byBkZXRlcm1pbmUgaG93IG11Y2ggbWVtb3J5IHdpbGwgYmUgcmVxdWlyZWQgdG8gdW5wYWNrIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtYmFsX29ial9tc2dfbGlzdF9tZW1fc2NhbihiY21iYWxfYnVmICpidWYsIGNvbnN0IGJjbWJhbF9vYmogKmhkciwgY29uc3QgYmNtYmFsX2dyb3VwX2luZm8gKmdyb3VwLCBjb25zdCBiY21iYWxfZ3JvdXBfaW5mbyAqa2V5LCB1aW50MzJfdCAqc2l6ZSkKK3sKKyAgICB1aW50MzJfdCBwb3NfYmVmb3JlX3NjYW4gPSBiY21iYWxfYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICBpZiAoIWtleS0+bWVtX3NjYW4oYnVmLCBzaXplLCBCQ01CQUxfUFJFU0VOQ0VfTUFTS19BTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgaWYgKGJjbWJhbF9vYmpfbXNnX3Nob3VsZF9wYWNrX2RhdGEoaGRyKSAmJiAoZ3JvdXAtPm1lbV9zY2FuICE9IE5VTEwpICYmICFncm91cC0+bWVtX3NjYW4oYnVmLCBzaXplLCBoZHItPnByZXNlbmNlX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgaWYgKCFiY21iYWxfYnVmX3Jld2luZChidWYsIGJjbWJhbF9idWZfZ2V0X3VzZWQoYnVmKSAtIHBvc19iZWZvcmVfc2NhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFVucGFja3MgYSBtZXNzYWdlIGZyb20gYSBieXRlIHN0cmVhbS4gCisgKgorICogVGhpcyB1bnBhY2tzIHRoZSBtZXNzYWdlIGZyb20gdGhlIHBhY2tlZCBmb3JtIGludG8gdGhlIHN0cnVjdCBmb2xsb3dpbmcgdGhlICJ1bnBhY2tlZCIgcG9pbnRlci4gIFRoZXJlIGFyZSBzZXZlcmFsCisgKiBzcGVjaWFsIGNhc2VzOgorICoKKyAqIGlmICp1bnBhY2tlZCA9PSBOVUxMOgorICogICAqdW5wYWNrZWQgd2lsbCBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgdmlhIGJjbW9zX2NhbGxvYywgaW4gYSBjb250aWd1b3VzIGJsb2NrIG9mIG1lbW9yeSB3aXRoIHRoZSBzdHJ1Y3QKKyAqICAgaXRzZWxmIGZvbGxvd2VkIGJ5IHRoZSBtZW1vcnkgcmVxdWlyZWQgZm9yIGFsbCB2YXJpYWJsZS1zaXplZCBsaXN0cy4KKyAqCisgKiBpZiAoKnVucGFja2VkKS0+bGlzdF9idWYgIT0gTlVMTDoKKyAqICAgV2hlbiBhIHZhcmlhYmxlLWxlbmd0aCBsaXN0IGlzIGVuY291bnRlcmVkIGluIHRoZSBpbnB1dCBzdHJlYW0sIGFuZCB0aGUgYXJyYXkgZmllbGQgd2UncmUgdW5wYWNraW5nIGludG8gaXMgTlVMTCwKKyAqICAgbWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkIHN0YXJ0aW5nIGZyb20gKCp1bnBhY2tlZCktPmxpc3RfYnVmLiAgSWYgbXVsdGlwbGUgc3VjaCBsaXN0cyBleGlzdCwgdGhleSB3aWxsIHNoYXJlIHRoaXMKKyAqICAgYnVmZmVyLiAgSWYgdGhlICgqdW5wYWNrZWQpLT5saXN0X2J1Zl9zaXplIGlzIG5vdCBsYXJnZSBlbm91Z2gsIHRoaXMgd2lsbCByZXR1cm4gQkNNX0VSUl9JTlNVRkZJQ0lFTlRfTElTVF9NRU0uCisgKgorICogXHBhcmFtIGJ1ZiAgICAgICAgICAgVGhlIHN0cmVhbSB0byB1bnBhY2sgZnJvbS4KKyAqIFxwYXJhbSB1bnBhY2tlZCAgICAgIEEgcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIHVucGFja2VkIEJBTCBtZXNzYWdlIHN0YXJ0aW5nIGF0IHRoZSBiYWwgaGVhZGVyLgorICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVucGFja2VkIGlmID4gMCwgb3IgYW4gZXJyb3IgYXMgZGVmaW5lZCBpbiBiY21vc19lcnJuby4KKyAqLworc3RhdGljIGludDMyX3QgX2JjbWJhbF9vYmpfbXNnX3VucGFjayhiY21iYWxfYnVmICpidWYsIGJhbF9jb21tX21zZ19oZHIgKip1bnBhY2tlZCkKK3sKKyAgICBiY21iYWxfb2JqIGJhbF9vYmpfaGRyOworICAgIGJhbF9jb21tX21zZ19oZHIgKmJhbF9tc2dfaGRyID0gJmJhbF9vYmpfaGRyLmNvbW1faGRyOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21iYWxfZ3JvdXBfaW5mbyAqZ3JvdXA7CisgICAgYmNtYmFsX2dyb3VwX2luZm8gKmtleTsKKyAgICBiY21vc19ib29sIGRpZF9tYWxsb2MgPSBCQ01PU19GQUxTRTsKKyAgICB1aW50OF90ICprZXlfcHRyOworICAgIHZvaWQgKmxpc3RfbWVtID0gTlVMTDsKKyAgICB2b2lkICoqbGlzdF9tZW1fcHRyID0gTlVMTDsKKyAgICB1aW50MzJfdCBzaXplID0gMDsKKyAgICBiY21iYWxfb2JqICp1bnBhY2tlZF9iYWxfb2JqOworCisgICAgLyogUHJlc2VydmUgaGVhZGVyIGZpZWxkcyB0aGF0IGFyZSBub3QgcGFja2VkICovCisgICAgaWYgKCp1bnBhY2tlZCAhPSBOVUxMKQorICAgICAgICBtZW1jcHkoJmJhbF9vYmpfaGRyLCBiY21iYWxfcGF5bG9hZF9wdHJfZ2V0KCp1bnBhY2tlZCksIHNpemVvZihiYWxfb2JqX2hkcikpOworICAgIGVsc2UKKyAgICAgICAgbWVtc2V0KCZiYWxfb2JqX2hkciwgMCwgc2l6ZW9mKGJhbF9vYmpfaGRyKSk7CisKKyAgICBlcnIgPSBiY21iYWxfYmFsX21zZ19oZHJfdW5wYWNrKGJhbF9tc2dfaGRyLCBidWYpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gYmNtYmFsX29ial9tc2dfaGRyX3VucGFjaygmYmFsX29ial9oZHIsIGJ1Zik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoIV9iY21iYWxfZ2V0X2dyb3VwX2luZm8oJmJhbF9vYmpfaGRyLCAmZ3JvdXAsICZrZXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTVNHX0VSUk9SOworICAgIH0KKworICAgIC8qIElmIHRoZSBjYWxsZXIgZGlkIG5vdCBhbGxvY2F0ZSBhIHNwYWNlIHRvIHVucGFjayBpbnRvLCB0aGVuIGFsbG9jIG9uZSAqLworICAgIGlmICgqdW5wYWNrZWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHNpemUgPSBncm91cC0+Y29udGFpbmVyX3NpemUgPT0gMCA/IHNpemVvZihiY21iYWxfb2JqKSArIGtleS0+c2l6ZSA6IGdyb3VwLT5jb250YWluZXJfc2l6ZTsKKworICAgICAgICBlcnIgPSBiY21iYWxfb2JqX21zZ19saXN0X21lbV9zY2FuKGJ1ZiwgJmJhbF9vYmpfaGRyLCBncm91cCwga2V5LCAmc2l6ZSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFsbG9jYXRlIGEgYmFsIG1zZyBoZWFkZXIsIGFuZCBhIEJBTCBvYmplY3Qgd2l0aCBkYXRhIGxlbmd0aCBvZiAic2l6ZSIgKi8KKyAgICAgICAgdW5wYWNrZWRfYmFsX29iaiA9IGJjbWJhbF9tc2dfY2FsbG9jKHNpemUpOworICAgICAgICBpZiAodW5wYWNrZWRfYmFsX29iaiA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgICp1bnBhY2tlZCA9IGJjbWJhbF9iYWxfaGRyX2dldCh1bnBhY2tlZF9iYWxfb2JqKTsKKworICAgICAgICBsaXN0X21lbSA9ICh1aW50OF90ICopdW5wYWNrZWRfYmFsX29iaiArIGdyb3VwLT5jb250YWluZXJfc2l6ZTsKKyAgICAgICAgbGlzdF9tZW1fcHRyID0gJmxpc3RfbWVtOworICAgICAgICBkaWRfbWFsbG9jID0gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdW5wYWNrZWRfYmFsX29iaiA9IGJjbWJhbF9wYXlsb2FkX3B0cl9nZXQoKnVucGFja2VkKTsKKworICAgICAgICBpZiAodW5wYWNrZWRfYmFsX29iai0+bGlzdF9idWYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gYmNtYmFsX29ial9tc2dfbGlzdF9tZW1fc2NhbihidWYsICZiYWxfb2JqX2hkciwgZ3JvdXAsIGtleSwgJnNpemUpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaXplID4gdW5wYWNrZWRfYmFsX29iai0+bGlzdF9idWZfc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlNVRkZJQ0lFTlRfTElTVF9NRU07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpc3RfbWVtID0gdW5wYWNrZWRfYmFsX29iai0+bGlzdF9idWY7CisgICAgICAgICAgICBsaXN0X21lbV9wdHIgPSAmbGlzdF9tZW07CisgICAgICAgIH0KKworICAgICAgICBzaXplICs9IGdyb3VwLT5jb250YWluZXJfc2l6ZSA9PSAwID8gc2l6ZW9mKGJjbWJhbF9vYmopICsga2V5LT5zaXplIDogZ3JvdXAtPmNvbnRhaW5lcl9zaXplOworICAgIH0KKworICAgIC8qIGNvcHkgdGhlIGJhbCBtZXNzYWdlIGhlYWRlciBpbnRvIHRoZSB1bnBhY2sgYnVmZmVyICovCisgICAgYmFsX21zZ19oZHItPm0uc2l6ZSA9IHNpemUgLSBzaXplb2YoYmNtb3NfbXNnKTsKKworICAgIC8qIGNvcHkgdGhlIGJhbCBvYmplY3QgaGVhZGVyIGludG8gdGhlIHVucGFjayBidWZmZXIgKi8KKyAgICAqdW5wYWNrZWRfYmFsX29iaiA9IGJhbF9vYmpfaGRyOworCisgICAga2V5X3B0ciA9ICh1aW50OF90ICopICh1bnBhY2tlZF9iYWxfb2JqICsgMSk7CisgICAgaWYgKCFrZXktPnVucGFjayhrZXlfcHRyLCBidWYsIGxpc3RfbWVtX3B0ciwgQkNNQkFMX1BSRVNFTkNFX01BU0tfQUxMKSkKKyAgICB7CisgICAgICAgIGlmIChkaWRfbWFsbG9jKQorICAgICAgICB7CisgICAgICAgICAgICBiY21iYWxfbXNnX2ZyZWUodW5wYWNrZWRfYmFsX29iaik7CisgICAgICAgICAgICAqdW5wYWNrZWQgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgaWYgKGJjbWJhbF9vYmpfbXNnX3Nob3VsZF9wYWNrX2RhdGEoJmJhbF9vYmpfaGRyKSkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgKmRhdGFfcHRyID0gKHVpbnQ4X3QgKil1bnBhY2tlZF9iYWxfb2JqICsgZ3JvdXAtPmRhdGFfb2Zmc2V0OworICAgICAgICBpZiAoKGdyb3VwLT51bnBhY2sgIT0gTlVMTCkgJiYgIWdyb3VwLT51bnBhY2soZGF0YV9wdHIsIGJ1ZiwgbGlzdF9tZW1fcHRyLCB1bnBhY2tlZF9iYWxfb2JqLT5wcmVzZW5jZV9tYXNrKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRpZF9tYWxsb2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtYmFsX21zZ19mcmVlKHVucGFja2VkX2JhbF9vYmopOworICAgICAgICAgICAgICAgICp1bnBhY2tlZCA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK2JjbW9zX2Vycm5vIGJjbWJhbF9vYmpfbXNnX3BhY2soYmFsX2NvbW1fbXNnX2hkciAqdW5wYWNrZWRfYmFsX21zZywgLyogdW5wYWNrZWQgbXNnICovIGJjbW9zX21zZyAqKnBhY2tlZF9tc2cpICAvKiBwYWNrZWQgbWVzc2FnZSAqLworeworICAgIGJjbWJhbF9idWYgYnVmOworICAgIGJjbW9zX2Vycm5vIHJldDsKKyAgICBiY21iYWxfb2JqICp1bnBhY2tlZF9vYmo7CisgICAgaW50MzJfdCBwYWNrZWRfcGF5bG9hZF9sZW47CisgICAgdWludDhfdCAqcGFja2VkX3BheWxvYWQ7CisgICAgYmNtb3NfbXNnICpvc19tc2c7CisKKyAgICAqcGFja2VkX21zZyA9IE5VTEw7IC8qIEluaXRpYWxpemF0aW9uICovCisKKyAgICAvKiBSZWNvdmVyIGEgcG9pbnRlciB0byB0aGUgVU5QQUNLRUQgYmFsIG9iamVjdCAqLworICAgIHVucGFja2VkX29iaiA9IChiY21iYWxfb2JqICopYmNtYmFsX3BheWxvYWRfcHRyX2dldCh1bnBhY2tlZF9iYWxfbXNnKTsKKworICAgIC8qIENhbGN1bGF0ZSBwYWNrZWQgbGVuZ3RoICovCisgICAgcGFja2VkX3BheWxvYWRfbGVuID0gX2JjbWJhbF9vYmpfbXNnX3BhY2tlZF9sZW5ndGhfZ2V0KHVucGFja2VkX29iaik7CisgICAgaWYgKHBhY2tlZF9wYXlsb2FkX2xlbiA8IDApIHJldHVybiAoYmNtb3NfZXJybm8pIHBhY2tlZF9wYXlsb2FkX2xlbjsKKworICAgIG9zX21zZyA9IChiY21vc19tc2cgKiliY21vc19hbGxvYyhwYWNrZWRfcGF5bG9hZF9sZW4gKyBzaXplb2YoYmNtb3NfbXNnKSk7CisKKyAgICBpZiAoTlVMTCA9PSBvc19tc2cpIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgbWVtc2V0KG9zX21zZywgMCwgc2l6ZW9mKGJjbW9zX21zZykpOworICAgIHBhY2tlZF9wYXlsb2FkID0gKHVpbnQ4X3QgKikgKG9zX21zZyArIDEpOworICAgIGJjbWJhbF9idWZfaW5pdCgmYnVmLCBwYWNrZWRfcGF5bG9hZF9sZW4sIHBhY2tlZF9wYXlsb2FkKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSAocmV0ID0gX2JjbWJhbF9vYmpfbXNnX3BhY2sodW5wYWNrZWRfYmFsX21zZywgJmJ1ZikpKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShvc19tc2cpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG9zX21zZy0+ZGF0YSA9IHBhY2tlZF9wYXlsb2FkOworICAgIG9zX21zZy0+c2l6ZSA9IHBhY2tlZF9wYXlsb2FkX2xlbjsKKyAgICBvc19tc2ctPnR5cGUgPSB1bnBhY2tlZF9iYWxfbXNnLT5tLnR5cGU7CisgICAgb3NfbXNnLT5pbnN0YW5jZSA9IHVucGFja2VkX2JhbF9tc2ctPm0uaW5zdGFuY2U7CisgICAgb3NfbXNnLT5zZW5kZXIgPSB1bnBhY2tlZF9iYWxfbXNnLT5tLnNlbmRlcjsKKyAgICAqcGFja2VkX21zZyA9IG9zX21zZzsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21iYWxfb2JqX21zZ191bnBhY2soYmNtb3NfbXNnICpwYWNrZWRfbXNnLCAvKiBwYWNrZWQgbWVzc2FnZSAqLyBiYWxfY29tbV9tc2dfaGRyICoqdW5wYWNrZWRfYmFsX21zZykgIC8qIHRoZSB1bnBhY2tlZCBiYWwgbXNnICovCit7CisgICAgYmNtYmFsX2J1ZiBidWY7CisgICAgaW50MzJfdCB1bnBhY2tlZF9sZW47CisgICAgYmFsX2NvbW1fbXNnX2hkciAqYmFsX21zZ19oZHIgPSAqdW5wYWNrZWRfYmFsX21zZzsKKyAgICB1aW50OF90ICpwYWNrZWRfcGF5bG9hZCA9IHBhY2tlZF9tc2ctPmRhdGE7CisgICAgdWludDMyX3QgcGFja2VkX3BheWxvYWRfbGVuID0gcGFja2VkX21zZy0+c2l6ZTsKKworICAgIGJjbWJhbF9idWZfaW5pdCgmYnVmLCBwYWNrZWRfcGF5bG9hZF9sZW4sIHBhY2tlZF9wYXlsb2FkKTsKKworICAgIHVucGFja2VkX2xlbiA9IF9iY21iYWxfb2JqX21zZ191bnBhY2soJmJ1ZiwgJmJhbF9tc2dfaGRyKTsKKworICAgIGlmICh1bnBhY2tlZF9sZW4gPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChiY21vc19lcnJubykgdW5wYWNrZWRfbGVuOworICAgIH0KKworICAgIGlmICgoKGJjbWJhbF9vYmogKikgKGJjbWJhbF9wYXlsb2FkX3B0cl9nZXQoYmFsX21zZ19oZHIpKSktPnZlcnNpb24gIT0gQkNNQkFMX09CSl9WRVJTSU9OKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCJJbGxlZ2FsIEJBTCBvYmplY3QgdmVyc2lvbiBkZXRlY3RlZC4gIEZvdW5kOiAlZCwgU2hvdWxkIGJlOiVkXG4iLCAoKGJjbWJhbF9vYmogKikgKGJjbWJhbF9wYXlsb2FkX3B0cl9nZXQoYmFsX21zZ19oZHIpKSktPnZlcnNpb24sIEJDTUJBTF9PQkpfVkVSU0lPTik7CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgKnVucGFja2VkX2JhbF9tc2cgPSBiYWxfbXNnX2hkcjsKKworICAgIC8qIE5PVEU6IERvIE5PVCBGcmVlIHRoZSBwYXNzZWQgaW4gb3JpZ2luYWwgcmVjZWl2ZWQgbWVzc2FnZSEgKi8KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gX2JjbWJhbF9vYmpfZ3JvdXBfaWRfc3BsaXQoYmNtYmFsX29ial9ncm91cF9pZCBncm91cF9pZCwgYmNtYmFsX29ial9pZCAqb2JqLCBiY21iYWxfbWd0X2dyb3VwICpncm91cCwgdWludDE2X3QgKnN1Ymdyb3VwKQoreworICAgIGlmICgoZ3JvdXBfaWQgPj0gQkNNQkFMX09CSl9HUk9VUF9JRF9fTlVNX09GKSB8fCAoZ3JvdXBfaW5mb1tncm91cF9pZF0gPT0gTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAqb2JqID0gZ3JvdXBfaW5mb1tncm91cF9pZF0tPm9ial90eXBlOworICAgICpncm91cCA9IGdyb3VwX2luZm9bZ3JvdXBfaWRdLT5ncm91cDsKKyAgICAqc3ViZ3JvdXAgPSBncm91cF9pbmZvW2dyb3VwX2lkXS0+c3ViZ3JvdXA7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50OF90IGJjbWJhbF9vYmpfbXNnX2luc3RhbmNlKGNvbnN0IGJjbWJhbF9vYmogKm1zZykKK3sKKyAgICBjb25zdCB2b2lkICp2YWxfcHRyOworCisgICAgaWYgKG1zZy0+b2JqX3R5cGUgPj0gQkNNQkFMX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGluc3RhbmNlX2luZm9bbXNnLT5vYmpfdHlwZV0ub2Zmc2V0IDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZhbF9wdHIgPSAoKGNvbnN0IHVpbnQ4X3QgKikobXNnICsgMSkpICsgaW5zdGFuY2VfaW5mb1ttc2ctPm9ial90eXBlXS5vZmZzZXQ7CisKKyAgICAvKiogVGhpcyBpcyBwcm9iYWJseSBub3QgdGhlIHNtYXJ0ZXN0IHdheSB0byBkbyB0aGlzLi4uIFRPRE86IHJldmlzaXQgKi8KKyAgICBzd2l0Y2ggKGluc3RhbmNlX2luZm9bbXNnLT5vYmpfdHlwZV0uc2l6ZSkKKyAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiAqKChjb25zdCB1aW50OF90ICopdmFsX3B0cik7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHJldHVybiAodWludDhfdCkgKCooKGNvbnN0IHVpbnQxNl90ICopdmFsX3B0cikpOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICByZXR1cm4gKHVpbnQ4X3QpICgqKChjb25zdCB1aW50MzJfdCAqKXZhbF9wdHIpKTsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgcmV0dXJuICh1aW50OF90KSAoKigoY29uc3QgdWludDY0X3QgKil2YWxfcHRyKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21iYWxfb2JqX21zZ19jbG9uZShiYWxfY29tbV9tc2dfaGRyICoqZGVzdCwgYmFsX2NvbW1fbXNnX2hkciAqc3JjKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBpbnQzMl90IHBhY2tlZF9vYmpfbXNnX2xlbjsKKyAgICB1aW50OF90ICptZW07CisgICAgYmNtYmFsX2J1ZiBidWY7CisKKyAgICBwYWNrZWRfb2JqX21zZ19sZW4gPSBfYmNtYmFsX29ial9tc2dfcGFja2VkX2xlbmd0aF9nZXQoYmNtYmFsX3BheWxvYWRfcHRyX2dldChzcmMpKTsKKyAgICBpZiAocGFja2VkX29ial9tc2dfbGVuIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoYmNtb3NfZXJybm8pIHBhY2tlZF9vYmpfbXNnX2xlbjsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBhIEJBTCBtc2cgKHRoaXMgaW5jbHVkZXMgdGhlIEJBTCBtc2cgaGRyIFBMVVMgdGhlIEJBTCBvYmplY3QpICovCisgICAgbWVtID0gYmNtb3NfY2FsbG9jKCh1aW50MzJfdCkgcGFja2VkX29ial9tc2dfbGVuKTsKKyAgICBpZiAobWVtID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21iYWxfYnVmX2luaXQoJmJ1ZiwgKHVpbnQzMl90KSBwYWNrZWRfb2JqX21zZ19sZW4sIG1lbSk7CisgICAgZXJyID0gX2JjbWJhbF9vYmpfbXNnX3BhY2soc3JjLCAmYnVmKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vc19mcmVlKG1lbSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYnVmLmN1cnIgPSBidWYuc3RhcnQ7CisgICAgZXJyID0gX2JjbWJhbF9vYmpfbXNnX3VucGFjaygmYnVmLCBkZXN0KTsKKyAgICBiY21vc19mcmVlKG1lbSk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9nZXRfcHJvcF9yZWFkb25seV9tYXNrKGJjbWJhbF9vYmpfaWQgb2JqLCBiY21iYWxfcHJlc2VuY2VfbWFzayAqbWFzaykKK3sKKyAgICBpZiAob2JqID49IEJDTUJBTF9PQkpfSURfX05VTV9PRikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgICptYXNrID0gcmVhZG9ubHlfcHJvcF9tYXNrW29ial07CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYm9iam1zZy9iYWxfb2JqX21zZ19wYWNrX3VucGFjay5oIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJvYmptc2cvYmFsX29ial9tc2dfcGFja191bnBhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODM3YTk5Ci0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJvYmptc2cvYmFsX29ial9tc2dfcGFja191bnBhY2suaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIEJBTF9PQkpfTVNHX1BBQ0tfVU5QQUNLX0hfCisjZGVmaW5lIEJBTF9PQkpfTVNHX1BBQ0tfVU5QQUNLX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImJhbF9tb2RlbF90eXBlcy5oIgorI2luY2x1ZGUgImJhbF9tb2RlbF9mdW5jcy5oIgorCisKK2JjbW9zX2Vycm5vIGJjbWJhbF9vYmpfbXNnX3BhY2soYmFsX2NvbW1fbXNnX2hkciAqdW5wYWNrZWRfYmFsX21zZywvKiB1bnBhY2tlZCBtc2cgKi8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21zZyAqKnBhY2tlZF9tc2cpOyAgICAvKiBwYWNrZWQgbWVzc2FnZSAqLworCitiY21vc19lcnJubyBiY21iYWxfb2JqX21zZ191bnBhY2soYmNtb3NfbXNnICpwYWNrZWRfbXNnLCAgICAvKiBwYWNrZWQgbWVzc2FnZSAqLyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWxfY29tbV9tc2dfaGRyICoqdW5wYWNrZWRfYmFsX21zZyk7IC8qIHRoZSB1bnBhY2tlZCBiYWwgbXNnICovCisKKy8qKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBudW1iZXIgb2YgYSBnaXZlbiBtZXNzYWdlLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvYmplY3Qga2V5LgorICoKKyAqIFxwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gY2hlY2suCisgKiBccmV0dXJuIFRoZSBpbnN0YW5jZSBudW1iZXIgb2YgdGhlIG1lc3NhZ2UuCisgKi8KK3VpbnQ4X3QgYmNtYmFsX29ial9tc2dfaW5zdGFuY2UoY29uc3QgYmNtYmFsX29iaiAqbXNnKTsKKworLyoqIEdldHMgYSBtYXNrIG9mIGFsbCByZWFkb25seSBwcm9wZXJ0aWVzIGZvciBhbiBvYmplY3QncyBjZmcgZ3JvdXAuCisgKgorICogXHBhcmFtIG9iaiBUaGUgb2JqZWNjdCB0byBjaGVjay4KKyAqIFxwYXJhbSBtYXNrIEEgbWFzayBvZiBiaXRzIHNldCB0byAxIHBlciByZWFkLW9ubHkgcHJvcGVydHkuCisgKiBccmV0dXJuIEFuIGVycm9yIGNvZGUgb3IgQkNNX0VSUl9PSyBmb3Igc3VjY2Vzcy4gCisgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9nZXRfcHJvcF9yZWFkb25seV9tYXNrKGJjbWJhbF9vYmpfaWQgb2JqLCBiY21iYWxfcHJlc2VuY2VfbWFzayAqbWFzayk7CisKKy8qKiBDbG9uZXMgYSBtZXNzYWdlIGJ5IHBhY2tpbmcgaXQgdG8gYSBidWZmZXIgdGhlbiB1bnBhY2tpbmcgaXQgaW50byB0aGUgZGVzdGluYXRpb24gbWVzc2FnZS4KKyAqIFRoaXMgdXNlcyBfYmNtYmFsX29ial9tc2dfdW5wYWNrLCBzbyBpZiAqZGVzdCBpcyBOVUxMLCBtZW1vcnkgd2lsbCBieSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgdXNpbmcgYmNtb3NfY2FsbG9jLgorICoKKyAqIFxwYXJhbSBkZXN0IEEgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gaW4gbWVtb3J5IHRoYXQgd2lsbCBob2xkIHRoZSBjbG9uZWQgbWVzc2FnZS4KKyAqIFxwYXJhbSBzcmMgVGhlIG1lc3NhZ2UgdGhhdCBzaG91bGQgYmUgY29waWVkLgorICogXHJldHVybiBBbiBlcnJvciBjb2RlIG9yIEJDTV9FUlJfT0sgZm9yIHN1Y2Nlc3MuCisgKi8KK2JjbW9zX2Vycm5vIGJjbWJhbF9vYmpfbXNnX2Nsb25lKGJhbF9jb21tX21zZ19oZHIgKipkZXN0LCBiYWxfY29tbV9tc2dfaGRyICpzcmMpOworCisvKiogQ29udmVydHMgYSBnZW5lcmljIGdyb3VwIElEIGludG8gYSBzcGVjaWZpYyBvYmplY3QgdHlwZSwgZ3JvdXAgYW5kIHN1Ymdyb3VwLgorICoKKyAqIFxwYXJhbSBncm91cF9pZCBUaGUgZ2VuZXJpYyBncm91cCBJRC4KKyAqIFxwYXJhbSBvYmogVGhlIG9iamVjdCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdyb3VwIElELgorICogXHBhcmFtIGdyb3VwIFRoZSBncm91cCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdyb3VwIElELgorICogXHBhcmFtIHN1Ymdyb3VwIFRoZSBzdWJncm91cCBpbmRleCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBncm91cCBJRC4KKyAqIFxyZXR1cm4gQW4gZXJyb3IgY29kZSBvciBCQ01fRVJSX09LIGZvciBzdWNjZXNzLiAKKyAqLworYmNtb3NfZXJybm8gX2JjbWJhbF9vYmpfZ3JvdXBfaWRfc3BsaXQoYmNtYmFsX29ial9ncm91cF9pZCBncm91cF9pZCwgYmNtYmFsX29ial9pZCAqb2JqLCBiY21iYWxfbWd0X2dyb3VwICpncm91cCwgdWludDE2X3QgKnN1Ymdyb3VwKTsKKworCisjZW5kaWYgLyogQkFMX09CSl9NU0dfUEFDS19VTlBBQ0tfSF8gKi8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL01ha2VmaWxlIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJyc2NtZ3IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0Y2Q0NQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL01ha2VmaWxlCkBAIC0wLDAgKzEsMzcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorIyAgCisjICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyMgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgIAorIyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorIyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorIyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisjICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyMgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisjICAKKyMgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyMgICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorIyAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorIyAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorIyAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisjICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisjICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworIyAgICAgb2YgdGhlIHNvZnR3YXJlLgorIyAgCisjICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyMgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorIyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyMgIHdyaXR0ZW4gY29uc2VudC4KKyMgIAorIyAgOj4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK01PRF9OQU1FID0gcnNjbWdyCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSBkZXZfbG9nIGNsaSBvc19jbGkgYmFsX2FwaSAKK3NyY3MgPSByc2NfbWdyLmMgcnNjX21ncl9jb21tb24uYyByc2NfbWdyX2NsaS5jCisKKyMgWFhYIFRvIGJyZWFrIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSwgd2Ugc2hvdWxkIGF2b2lkIGFkZGluZyBiYWxfY29yZSB0byBNT0RfREVQUworRVhUUkFfQ0ZMQUdTICs9IC1JJChTUkNfRElSKS8uLi8uLi9jb3JlL21haW4KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL3JzY19tZ3IuYyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL3JzY19tZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDhhZmVjCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJyc2NtZ3IvcnNjX21nci5jCkBAIC0wLDAgKzEsOTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorI2luY2x1ZGUgPGJjbW9sdF9ob3N0X2FwaS5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmFsX29ianMuaD4KKyNpbmNsdWRlIDxiYWxfYXBpLmg+CisjaW5jbHVkZSA8YmFsX2NsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tYXRoLmg+CisjaW5jbHVkZSA8YmNtX3RvcG8uaD4KKyNpbmNsdWRlICJyc2NfbWdyX2NvbW1vbi5oIgorI2luY2x1ZGUgInJzY19tZ3IuaCIKKworI2RlZmluZSBHUE9OX05VTV9PRl9BTExPQ19JRFMgMTAyNAorI2RlZmluZSBYR1BPTl9OVU1fT0ZfQUxMT0NfSURTIDIwNDgKKworI2RlZmluZSBHUE9OX05VTV9PRl9HRU1fUE9SVF9JRFNfUEVSX1BPTiA0MDk2CisjZGVmaW5lIFhHUE9OX05VTV9PRl9HRU1fUE9SVF9JRFNfUEVSX1BPTiA4MTkyCisKKyNkZWZpbmUgUlNDX01HUl9BTExPQ19JRF9MQVNUX0RBVEEocG9uX2lkLCBmaXJzdF9kYXRhX2FsbG9jX2lkKSBcCisgICAgKChmaXJzdF9kYXRhX2FsbG9jX2lkKSArIChiY21vbHRfcG9uX2FsbG9jX2lkKShSU0NfTUdSX1BPTl9UT1BPX0NPTlRFWFQocG9uX2lkKS0+bnVtX29mX2FsbG9jX2lkcyAtIDEpKQorI2RlZmluZSBSU0NfTUdSX0FMTE9DX0lEX0lTX1ZBTElEX0RBVEEocG9uX2lkLCBhbGxvY19pZCwgZmlyc3RfZGF0YV9hbGxvY19pZCkgKCBcCisgICAgKChhbGxvY19pZCkgPj0gKGZpcnN0X2RhdGFfYWxsb2NfaWQpICYmIChhbGxvY19pZCkgPD0gUlNDX01HUl9BTExPQ19JRF9MQVNUX0RBVEEocG9uX2lkLCBmaXJzdF9kYXRhX2FsbG9jX2lkKSkpCisjZGVmaW5lIFJTQ19NR1JfQUxMT0NfSURfSVNfVkFMSUQocG9uX2lkLCBhbGxvY19pZCwgZmlyc3RfZGF0YV9hbGxvY19pZCkgKCBcCisgICAgKChhbGxvY19pZCkgPD0gUlNDX01HUl9BTExPQ19JRF9MQVNUX0RFRkFVTFQocG9uX2lkKSkgfHwgXAorICAgIFJTQ19NR1JfQUxMT0NfSURfSVNfVkFMSURfREFUQShwb25faWQsIGFsbG9jX2lkLCBmaXJzdF9kYXRhX2FsbG9jX2lkKSkKKworI2RlZmluZSBSU0NfTUdSX0dFTV9QT1JUX0lEX0xBU1RfREVGQVVMVChwb25faWQpICgoYmNtb2x0X3Bvbl9nZW1fcG9ydF9pZCkoYmNtX3RvcG9fcG9uX2dldF9tYXhfbnVtX29mX29udXMocG9uX2lkKSAtIDEpKQorI2RlZmluZSBSU0NfTUdSX0dFTV9QT1JUX0lEX0xBU1RfREFUQShwb25faWQsIGZpcnN0X2RhdGFfcG9ydF9pZCkgXAorICAgICgoZmlyc3RfZGF0YV9wb3J0X2lkKSArIChiY21vbHRfcG9uX2dlbV9wb3J0X2lkKShSU0NfTUdSX1BPTl9UT1BPX0NPTlRFWFQocG9uX2lkKS0+bnVtX29mX2dlbV9wb3J0cyAtIGJjbV90b3BvX3Bvbl9nZXRfbWF4X251bV9vZl9vbnVzKHBvbl9pZCkgLSAxKSkKKyNkZWZpbmUgUlNDX01HUl9HRU1fUE9SVF9JRF9JU19WQUxJRF9EQVRBKHBvbl9pZCwgZ2VtX3BvcnRfaWQsIGZpcnN0X2RhdGFfcG9ydF9pZCkgKCBcCisgICAgKChnZW1fcG9ydF9pZCkgPj0gKGZpcnN0X2RhdGFfcG9ydF9pZCkgJiYgKGdlbV9wb3J0X2lkKSA8PSBSU0NfTUdSX0dFTV9QT1JUX0lEX0xBU1RfREFUQShwb25faWQsIGZpcnN0X2RhdGFfcG9ydF9pZCkpKQorI2RlZmluZSBSU0NfTUdSX0dFTV9QT1JUX0lEX0lTX1ZBTElEKHBvbl9pZCwgZ2VtX3BvcnRfaWQsIGZpcnN0X2RhdGFfcG9ydF9pZCkgKCBcCisgICAgKChnZW1fcG9ydF9pZCkgPD0gUlNDX01HUl9HRU1fUE9SVF9JRF9MQVNUX0RFRkFVTFQocG9uX2lkKSkgfHwgXAorICAgIFJTQ19NR1JfR0VNX1BPUlRfSURfSVNfVkFMSURfREFUQShwb25faWQsIGdlbV9wb3J0X2lkLCBmaXJzdF9kYXRhX3BvcnRfaWQpKQorCisjZGVmaW5lIFJTQ19NR1JfRk9SX0VBQ0hfQUxMT0NfSU5ERVgocG9uX2lkLCBhbGxvY19pbmRleCkgXAorICAgIGZvciAoYWxsb2NfaW5kZXggPSAoYmNtb2x0X3Bvbl9hbGxvY19pbmRleCkwOyBhbGxvY19pbmRleCA8IChiY21vbHRfcG9uX2FsbG9jX2luZGV4KVJTQ19NR1JfUE9OX1RPUE9fQ09OVEVYVChwb25faWQpLT5udW1fb2ZfYWxsb2NfaWRzOyBhbGxvY19pbmRleCsrKQorCisjZGVmaW5lIFJTQ19NR1JfRk9SX0VBQ0hfR0VNX0lOREVYKHBvbl9pZCwgZ2VtX3BvcnRfaW5kZXgpIFwKKyAgICBmb3IgKGdlbV9wb3J0X2luZGV4ID0gMDsgKGJjbW9sdF9wb25fZ2VtX3BvcnRfaW5kZXgpZ2VtX3BvcnRfaW5kZXggPCAoYmNtb2x0X3Bvbl9nZW1fcG9ydF9pbmRleClSU0NfTUdSX1BPTl9UT1BPX0NPTlRFWFQocG9uX2lkKS0+bnVtX29mX2dlbV9wb3J0czsgZ2VtX3BvcnRfaW5kZXgrKykKKworI2RlZmluZSBSU0NfTUdSX0ZPUl9FQUNIX1RNX1NDSEVEX0FVVE9fSU5ERVgodG1fc2NoZWRfYXV0b19pbmRleCkgXAorCQlmb3IgKHRtX3NjaGVkX2F1dG9faW5kZXggPSAwOyAoYmNtYmFsX3RtX3NjaGVkX2lkX2luZGV4KXRtX3NjaGVkX2F1dG9faW5kZXggPCAoYmNtYmFsX3RtX3NjaGVkX2lkX2luZGV4KXRtX2NvbnRleHQubnVtX29mX3RtX3NjaGVkX2F1dG9fa2V5X2lkczsgdG1fc2NoZWRfYXV0b19pbmRleCsrKQorCisvKiBCZWNhdXNlIEdFTSBwb3J0IDAgLi4gMTI3IGFyZSB1c2VkIGZvciBPTUNJLCB3ZSBjYW4gc3RhcnQgYWxsb2NhdGluZyBmcm9tIDEyOC4gQnV0IGR1ZSB0byBhIGJ1ZyBpbiBNYXBsZSBBMCwgMTI4IC4uIDE1OSBtdXN0IG5vdCBiZSB1c2VkLiBTbyB3ZSBzdGFydCBmcm9tIDI1Ni4gKi8KKyNkZWZpbmUgTUlOX0JBU0VfR0VNX1BPUlRfSURfR1BPTiAyNTYKKworI2RlZmluZSBOVU1fT0ZfVE1fU0NIRURfQVVUT19LRVlfSURTCTIwNDgKKyNkZWZpbmUgTUlOX0JBU0VfVE1fU0NIRURfQVVUT19JRCAyMDQ4CisKKworcnNjX21ncl9jb250ZXh0X3QgcnNjX21ncl9jb250ZXh0OworcnNjX21ncl90bV9jb250ZXh0IHRtX2NvbnRleHQ7CisKKworc3RhdGljIGJjbW9zX2Vycm5vIHJzY19tZ3JfYWxsb2NfdmFsaWRhdGVfY29tbW9uKGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQpOworc3RhdGljIGJjbW9zX2Vycm5vIHJzY19tZ3Jfb2JqX2dldChiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkLCByc2NfbWdyX29ial9pZCBvYmpfaWQsIHJzY19tZ3Jfb2JqX3JzYyAqb2JqX3JzYywgcnNjX21ncl9vYmogKipvYmosIGRldl9sb2dfaWQgbG9nX2lkKTsKK3N0YXRpYyBiY21vc19lcnJubyByc2NfbWdyX29ial9zdG9yZV91c2VyX2RhdGEocnNjX21ncl9vYmogKm9iaiwgdm9pZCAqdXNlcl9kYXRhKTsKK3N0YXRpYyBiY21vc19lcnJubyByc2NfbWdyX29ial9yZW1vdmVfdXNlcl9kYXRhKHJzY19tZ3Jfb2JqICpvYmosIHZvaWQgKnVzZXJfZGF0YSk7CisKKworc3RhdGljIGJjbW9zX2Jvb2wgcnNjX21ncl9pc192YWxpZF9kYXRhX2FsbG9jX2lkX2NiKGJjbW9sdF9wb25fbmkgcG9uX2lkLCByc2NfbWdyX29ial9pZCBpZCwgcnNjX21ncl9vYmpfaWQgbWluX2RhdGFfb2JqX2lkKQoreworICAgIHJldHVybiAoYmNtX3RvcG9fcG9uX2lzX3ZhbGlkKHBvbl9pZCkgJiYgUlNDX01HUl9BTExPQ19JRF9JU19WQUxJRF9EQVRBKHBvbl9pZCwgaWQsIG1pbl9kYXRhX29ial9pZCkpOworfQorCitzdGF0aWMgcnNjX21ncl9vYmpfaWQgcnNjX21ncl9nZXRfbGFzdF9kYXRhX2FsbG9jX2lkX2NiKGJjbW9sdF9wb25fbmkgcG9uX2lkLCByc2NfbWdyX29ial9pZCBtaW5fZGF0YV9vYmpfaWQpCit7CisgICAgcmV0dXJuIChyc2NfbWdyX29ial9pZCkoYmNtb2x0X3Bvbl9hbGxvY19pZClSU0NfTUdSX0FMTE9DX0lEX0xBU1RfREFUQShwb25faWQsIG1pbl9kYXRhX29ial9pZCk7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIHJzY19tZ3JfaXNfdmFsaWRfZGF0YV9nZW1fY2IoYmNtb2x0X3Bvbl9uaSBwb25faWQsIHJzY19tZ3Jfb2JqX2lkIGlkLCByc2NfbWdyX29ial9pZCBtaW5fZGF0YV9vYmpfaWQpCit7CisgICAgcmV0dXJuIChiY21fdG9wb19wb25faXNfdmFsaWQocG9uX2lkKSAmJiBSU0NfTUdSX0dFTV9QT1JUX0lEX0lTX1ZBTElEX0RBVEEocG9uX2lkLCBpZCwgbWluX2RhdGFfb2JqX2lkKSk7Cit9CisKK3N0YXRpYyByc2NfbWdyX29ial9pZCByc2NfbWdyX2dldF9sYXN0X2RhdGFfZ2VtX2NiKGJjbW9sdF9wb25fbmkgcG9uX2lkLCByc2NfbWdyX29ial9pZCBtaW5fZGF0YV9vYmpfaWQpCit7CisgICAgcmV0dXJuIChyc2NfbWdyX29ial9pZCkoYmNtb2x0X3Bvbl9nZW1fcG9ydF9pZClSU0NfTUdSX0dFTV9QT1JUX0lEX0xBU1RfREFUQShwb25faWQsIG1pbl9kYXRhX29ial9pZCk7Cit9CitzdGF0aWMgYmNtb3NfYm9vbCByc2NfbWdyX2lzX3ZhbGlkX2RhdGFfdG1fc2NoZWRfYXV0b19pZChyc2NfbWdyX29ial9pZCBpZCkKK3sKKyAgICByZXR1cm4gKGlkID49IE1JTl9CQVNFX1RNX1NDSEVEX0FVVE9fSUQgJiYgaWQgPCBNSU5fQkFTRV9UTV9TQ0hFRF9BVVRPX0lEICsgTlVNX09GX1RNX1NDSEVEX0FVVE9fS0VZX0lEUyk7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIHJzY19tZ3JfaXNfdmFsaWRfZGF0YV90bV9zY2hlZF9hdXRvX2lkX2NiKGJjbW9sdF9wb25fbmkgcG9uX2lkLCByc2NfbWdyX29ial9pZCBpZCwgcnNjX21ncl9vYmpfaWQgbWluX2RhdGFfb2JqX2lkKQoreworICAgIHJldHVybiByc2NfbWdyX2lzX3ZhbGlkX2RhdGFfdG1fc2NoZWRfYXV0b19pZChpZCk7Cit9CisKK3N0YXRpYyByc2NfbWdyX29ial9pZCByc2NfbWdyX2dldF9sYXN0X2RhdGFfdG1fc2NoZWRfYXV0b19pZF9jYihiY21vbHRfcG9uX25pIHBvbl9pZCwgcnNjX21ncl9vYmpfaWQgbWluX2RhdGFfb2JqX2lkKQoreworICAgIHJldHVybiAocnNjX21ncl9vYmpfaWQpKG1pbl9kYXRhX29ial9pZCArIE5VTV9PRl9UTV9TQ0hFRF9BVVRPX0tFWV9JRFMgLSAxKTsKK30KKworCitzdGF0aWMgYmNtb3NfZXJybm8gcnNjX21ncl9vYmpfYWxsb2MoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgcnNjX21ncl9vYmpfaWQgKm9ial9pZCwgdWludDMyX3QgcmFuZ2Vfc2l6ZSwgcnNjX21ncl9vYmpfdHlwZSB0eXBlLCByc2NfbWdyX29ial9yc2MgKm9ial9yc2MsIHZvaWQgKnVzZXJfZGF0YSwgZGV2X2xvZ19pZCBsb2dfaWQpCit7CisgICAgcnNjX21ncl9vYmogKm9iajsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmIChyYW5nZV9zaXplIDwgUlNDX01HUl9NSU5fUkFOR0VfU0laRSB8fCByYW5nZV9zaXplID4gUlNDX01HUl9NQVhfUkFOR0VfU0laRSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZCwgIlJhbmdlIHNpemUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgJXUgLi4gJXVcbiIsIFJTQ19NR1JfTUlOX1JBTkdFX1NJWkUsIFJTQ19NR1JfTUFYX1JBTkdFX1NJWkUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgCisgICAgaWYgKCpvYmpfaWQpCisgICAgeworICAgICAgICByYyA9IHJzY19tZ3Jfb2JqX2dldChhY2Nlc3NfaW50X2lkLCAqb2JqX2lkLCBvYmpfcnNjLCAmb2JqLCBsb2dfaWQpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHJldHVybiByYzsKKworICAgICAgICBpZiAob2JqLT5yYW5nZV9zaXplICE9IHJhbmdlX3NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZCwgIldoZW4gcmV1c2luZyBhIHJhbmdlIG9mICVzcywgcmFuZ2Ugc2l6ZSAoJWQpIG11c3QgYmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgcmFuZ2UgZnJvbSBjcmVhdGlvbiAoJXUpXG4iLAorICAgICAgICAgICAgICAgIG9ial9yc2MtPm9ial9uYW1lLCByYW5nZV9zaXplLCBvYmotPnJhbmdlX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvYmotPnR5cGUgIT0gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkLCAiV2hlbiByZXVzaW5nICVzcywgdHlwZSAoJWQpIG11c3QgYmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgdHlwZSBmcm9tIGNyZWF0aW9uICgldSlcbiIsCisgICAgICAgICAgICAgICAgb2JqX3JzYy0+b2JqX25hbWUsIHR5cGUsIG9iai0+dHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJzY19tZ3Jfb2JqICpiYXNlX29iajsKKyAgICAgICAgcnNjX21ncl9vYmogKmxhc3Rfb2JqOworICAgICAgICByc2NfbWdyX29iaiAqb2JqX2l0ZXI7CisgICAgICAgIAorICAgICAgICAvKiBGaW5kIHRoZSBmaXJzdCBmcmVlIHJhbmdlIHRoYXQgZml0cyAoImZpcnN0LWZpdCIgYWxnb3JpdGhtKS4gKi8KKyAgICAgICAgVEFJTFFfRk9SRUFDSChvYmpfaXRlciwgJm9ial9yc2MtPmZyZWVfb2JqcywgbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJhbmdlX3NpemUgPD0gb2JqX2l0ZXItPnJhbmdlX3NpemUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvYmpfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkLCAiTm8gZnJlZSAlc3NcbiIsIG9ial9yc2MtPm9ial9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworICAgICAgICB9CisgICAgICAgICpvYmpfaWQgPSBvYmpfaXRlci0+aWQ7CisKKyAgICAgICAgaWYgKHJhbmdlX3NpemUgPCBvYmpfaXRlci0+cmFuZ2Vfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogSW5zZXJ0IGEgc21hbGxlciByYW5nZSAoZGVjcmVhc2UgYnkgJ3JhbmdlX3NpemUnKSB0byB0aGUgbGlzdCBvZiBmcmVlIG9iamVjdHMuIEl0IHdpbGwgcmVwbGFjZSB0aGUgb2xkIGZyZWUgcmFuZ2UuICovCisgICAgICAgICAgICBiYXNlX29iaiA9ICZvYmpfaXRlcltyYW5nZV9zaXplXTsKKyAgICAgICAgICAgIGxhc3Rfb2JqID0gJm9ial9pdGVyW29ial9pdGVyLT5yYW5nZV9zaXplIC0gMV07CisgICAgICAgICAgICBUQUlMUV9JTlNFUlRfSEVBRCgmb2JqX3JzYy0+ZnJlZV9vYmpzLCBiYXNlX29iaiwgbGlzdCk7CisgICAgICAgICAgICBiYXNlX29iai0+cmFuZ2Vfc2l6ZSA9IG9ial9pdGVyLT5yYW5nZV9zaXplIC0gcmFuZ2Vfc2l6ZTsKKyAgICAgICAgICAgIGxhc3Rfb2JqLT5iYXNlX29iaiA9IGJhc2Vfb2JqOworICAgICAgICB9CisKKyAgICAgICAgLyogTW92ZSAncmFuZ2Vfc2l6ZScgb2JqZWN0cyBmcm9tIHRoZSBsaXN0IG9mIGZyZWUgb2JqZWN0cyB0byB0aGUgbGlzdCBvZiBhbGxvY2F0ZWQgb2JqZWN0cy4gKi8KKyAgICAgICAgYmFzZV9vYmogPSBvYmpfaXRlcjsKKyAgICAgICAgbGFzdF9vYmogPSAmb2JqX2l0ZXJbcmFuZ2Vfc2l6ZSAtIDFdOworICAgICAgICBUQUlMUV9SRU1PVkUoJm9ial9yc2MtPmZyZWVfb2JqcywgYmFzZV9vYmosIGxpc3QpOworICAgICAgICBUQUlMUV9JTlNFUlRfSEVBRCgmb2JqX3JzYy0+YWxsb2NhdGVkX29ianMsIGJhc2Vfb2JqLCBsaXN0KTsKKyAgICAgICAgYmFzZV9vYmotPnJhbmdlX3NpemUgPSByYW5nZV9zaXplOworICAgICAgICBiYXNlX29iai0+dHlwZSA9IHR5cGU7CisgICAgICAgIGxhc3Rfb2JqLT5iYXNlX29iaiA9IGJhc2Vfb2JqOworCisgICAgICAgIG9iaiA9IG9ial9pdGVyOworICAgICAgICAvKiBzaW5jZSBuZXcgb2JqZWN0LCBpbml0aWFsaXplIHRoZSB1c2VyIGRhdGEgbGlzdCAqLworICAgICAgICBUQUlMUV9JTklUKCZvYmotPnVzZXJfZGF0YV9saXN0KTsKKworICAgIH0KKyAgICBvYmotPnJlZl9jb3VudCsrOworCisgICAgLyoqIHN0b3JlIHVzZXIgZGF0YSAoZmxvdyBlbnRyeSBwb2ludGVyKSBpbiBhIGxpbmtlZCBsaXN0IGluc2lkZSB0aGUgb2JqZWN0ICovCisgICAgcnNjX21ncl9vYmpfc3RvcmVfdXNlcl9kYXRhKG9iaiwgdXNlcl9kYXRhKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcnNjX21ncl9vYmpfZnJlZShiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkLCByc2NfbWdyX29ial9pZCBvYmpfaWQsIHJzY19tZ3Jfb2JqX3JzYyAqb2JqX3JzYywgdm9pZCAqdXNlcl9kYXRhLCBkZXZfbG9nX2lkIGxvZ19pZCkKK3sKKyAgICByc2NfbWdyX29iaiAqb2JqOworICAgIHJzY19tZ3Jfb2JqICpsYXN0X29iajsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gcnNjX21ncl9vYmpfZ2V0KGFjY2Vzc19pbnRfaWQsIG9ial9pZCwgb2JqX3JzYywgJm9iaiwgbG9nX2lkKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgb2JqLT5yZWZfY291bnQtLTsKKyAgICAvKiogcmVtb3ZlIHVzZXIgZGF0YSAoZmxvdyBlbnRyeSBwb2ludGVyKSBmcm9tIHRoZSBsaW5rZWQgbGlzdCBpbnNpZGUgdGhlIG9iamVjdCAqLworICAgIHJzY19tZ3Jfb2JqX3JlbW92ZV91c2VyX2RhdGEob2JqLCB1c2VyX2RhdGEpOworCisgICAgaWYgKCFvYmotPnJlZl9jb3VudCkKKyAgICB7CisgICAgICAgIHJzY19tZ3Jfb2JqICpuZXh0X29iaiA9IE5VTEw7CisgICAgICAgIHJzY19tZ3Jfb2JqICpwcmV2X29iaiA9IE5VTEw7CisKKyAgICAgICAgLyogVmFsaWRhdGUgdGhhdCBnb2luZyB0byB0aGUgbmV4dCBvYmplY3Qgd29uJ3Qgb3ZlcmZsb3cgdGhlIGFycmF5LiAqLworICAgICAgICBpZiAob2JqIDwgJm9ial9yc2MtPm9ianNbb2JqX3JzYy0+bnVtX29mX29ianMgLSAxXSAmJiAmb2JqW29iai0+cmFuZ2Vfc2l6ZV0gPD0gJm9ial9yc2MtPm9ianNbb2JqX3JzYy0+bnVtX29mX29ianMgLSAxXSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG5leHQgSUQgaXMgaW4gdGhlIGZyZWUgbGlzdCAoYWNjb3JkaW5nIHRvIGl0cyByZWZlcmVuY2UgY291bnQpLgorICAgICAgICAgICAgICogSWYgdHJ1ZSAtPiB3ZSBjYW4gbWVyZ2Ugb2JqJ3MgcmFuZ2Ugd2l0aCB0aGUgbmV4dCByYW5nZS4gKi8KKyAgICAgICAgICAgIGlmICghb2JqW29iai0+cmFuZ2Vfc2l6ZV0ucmVmX2NvdW50KQorICAgICAgICAgICAgICAgIG5leHRfb2JqID0gJm9ialtvYmotPnJhbmdlX3NpemVdOworICAgICAgICB9CisKKyAgICAgICAgLyogVmFsaWRhdGUgdGhhdCBnb2luZyB0byB0aGUgYmFzZSBvZiB0aGUgcHJldmlvdXMgcmFuZ2Ugd29uJ3QgdW5kZXJmbG93IHRoZSBhcnJheS4gKi8KKyAgICAgICAgaWYgKG9iaiA+IG9ial9yc2MtPm9ianMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBiYXNlIElEIG9mIHRoZSBwcmV2aW91cyByYW5nZSBpcyBpbiB0aGUgZnJlZSBsaXN0IChhY2NvcmRpbmcgdG8gdGhlIGJhc2UgSUQncyByZWZlcmVuY2UgY291bnQpLgorICAgICAgICAgICAgICogSWYgdHJ1ZSAtPiB3ZSBjYW4gbWVyZ2Ugb2JqJ3MgcmFuZ2Ugd2l0aCB0aGUgcHJldmlvdXMgcmFuZ2UuICovCisgICAgICAgICAgICBpZiAob2JqWy0xXS5iYXNlX29iaiAmJiAhb2JqWy0xXS5iYXNlX29iai0+cmVmX2NvdW50KQorICAgICAgICAgICAgICAgIHByZXZfb2JqID0gb2JqWy0xXS5iYXNlX29iajsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpcnN0IHJlbW92ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGFsbG9jYXRlZCBsaW5rZWQgbGlzdC4gKi8KKyAgICAgICAgVEFJTFFfUkVNT1ZFKCZvYmpfcnNjLT5hbGxvY2F0ZWRfb2Jqcywgb2JqLCBsaXN0KTsKKyAgICAgICAgbGFzdF9vYmogPSAmb2JqW29iai0+cmFuZ2Vfc2l6ZSAtIDFdOworICAgICAgICBvYmotPnR5cGUgPSBSU0NfTUdSX09CSl9UWVBFX0lOVkFMSUQ7IC8qIENsZWFyIHR5cGUuICovCisgICAgICAgIGlmIChuZXh0X29iaiAmJiAhcHJldl9vYmopCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1lcmdlIG9ubHkgd2l0aCBuZXh0IHJhbmdlLiAqLworICAgICAgICAgICAgVEFJTFFfSU5TRVJUX0JFRk9SRShuZXh0X29iaiwgb2JqLCBsaXN0KTsKKyAgICAgICAgICAgIFRBSUxRX1JFTU9WRSgmb2JqX3JzYy0+ZnJlZV9vYmpzLCBuZXh0X29iaiwgbGlzdCk7CisgICAgICAgICAgICBvYmotPnJhbmdlX3NpemUgKz0gbmV4dF9vYmotPnJhbmdlX3NpemU7CisgICAgICAgICAgICBsYXN0X29iai0+YmFzZV9vYmogPSBOVUxMOworICAgICAgICAgICAgbmV4dF9vYmotPnJhbmdlX3NpemUgPSAwOworICAgICAgICAgICAgbGFzdF9vYmogPSAmb2JqW29iai0+cmFuZ2Vfc2l6ZSAtIDFdOworICAgICAgICAgICAgbGFzdF9vYmotPmJhc2Vfb2JqID0gb2JqOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFuZXh0X29iaiAmJiBwcmV2X29iaikKKyAgICAgICAgeworICAgICAgICAgICAgLyogTWVyZ2Ugb25seSB3aXRoIHByZXZpb3VzIHJhbmdlLiAqLworICAgICAgICAgICAgcHJldl9vYmotPnJhbmdlX3NpemUgKz0gb2JqLT5yYW5nZV9zaXplOworICAgICAgICAgICAgb2JqLT5yYW5nZV9zaXplID0gMDsKKyAgICAgICAgICAgIGxhc3Rfb2JqLT5iYXNlX29iaiA9IHByZXZfb2JqOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5leHRfb2JqICYmIHByZXZfb2JqKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBNZXJnZSB3aXRoIGJvdGggbmV4dCBhbmQgcHJldmlvdXMgcmFuZ2VzLiAqLworICAgICAgICAgICAgcHJldl9vYmotPnJhbmdlX3NpemUgKz0gb2JqLT5yYW5nZV9zaXplICsgbmV4dF9vYmotPnJhbmdlX3NpemU7CisgICAgICAgICAgICBvYmotPnJhbmdlX3NpemUgPSAwOworICAgICAgICAgICAgbmV4dF9vYmotPnJhbmdlX3NpemUgPSAwOworICAgICAgICAgICAgVEFJTFFfUkVNT1ZFKCZvYmpfcnNjLT5mcmVlX29ianMsIG5leHRfb2JqLCBsaXN0KTsKKyAgICAgICAgICAgIGxhc3Rfb2JqLT5iYXNlX29iaiA9IE5VTEw7CisgICAgICAgICAgICBsYXN0X29iaiA9ICZwcmV2X29ialtwcmV2X29iai0+cmFuZ2Vfc2l6ZSAtIDFdOworICAgICAgICAgICAgbGFzdF9vYmotPmJhc2Vfb2JqID0gcHJldl9vYmo7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBObyBtZXJnZSBhdCBhbGwuICovCisgICAgICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmb2JqX3JzYy0+ZnJlZV9vYmpzLCBvYmosIGxpc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyByc2NfbWdyX29ial9nZXQoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgcnNjX21ncl9vYmpfaWQgb2JqX2lkLCByc2NfbWdyX29ial9yc2MgKm9ial9yc2MsIHJzY19tZ3Jfb2JqICoqb2JqLCBkZXZfbG9nX2lkIGxvZ19pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gcnNjX21ncl9hbGxvY192YWxpZGF0ZV9jb21tb24oYWNjZXNzX2ludF9pZCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHJldHVybiByYzsKKworICAgIGlmICghb2JqX3JzYy0+aXNfdmFsaWRfZGF0YV9vYmpfaWRfY2IoYWNjZXNzX2ludF9pZCwgb2JqX2lkLCBvYmpfcnNjLT5taW5fZGF0YV9vYmpfaWQpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkLCAiJXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgJXUgLi4gJXVcbiIsCisgICAgICAgICAgICBvYmpfcnNjLT5vYmpfbmFtZSwgb2JqX3JzYy0+bWluX2RhdGFfb2JqX2lkLCBvYmpfcnNjLT5nZXRfbGFzdF9kYXRhX29ial9pZF9jYihhY2Nlc3NfaW50X2lkLCBvYmpfcnNjLT5taW5fZGF0YV9vYmpfaWQpKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAqb2JqID0gJm9ial9yc2MtPm9ianNbb2JqX2lkIC0gb2JqX3JzYy0+bWluX2RhdGFfb2JqX2lkXTsKKyAgICAvKiBPbmx5IGJhc2Ugb2JqZWN0IG11c3QgaGF2ZSBpdHMgcmVmZXJlbmNlIGNvdW50ID4gMC4gKi8KKyAgICBpZiAoISgqb2JqKS0+cmVmX2NvdW50KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgbG9nX2lkLCAiJXMgaGFzbid0IGJlZW4gYWxsb2NhdGVkIGJlZm9yZVxuIiwgb2JqX3JzYy0+b2JqX25hbWUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogQGJyaWVmIHN0b3JlcyB1c2VyIHBhc3NlZCBpbiBkYXRhIGluIHRoZSBsaW5rZWQgbGlzdCBpbnNpZGUgdGhlIG9iaiAqLworc3RhdGljIGJjbW9zX2Vycm5vIHJzY19tZ3Jfb2JqX3N0b3JlX3VzZXJfZGF0YShyc2NfbWdyX29iaiAqb2JqLCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgcnNjX21ncl91c2VyX2RhdGFfZW50cnkgKnVzZXJfZGF0YV9lbnRyeSA9IE5VTEw7CisKKyAgICBpZiAoTlVMTCA9PSB1c2VyX2RhdGEpCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworCisgICAgdXNlcl9kYXRhX2VudHJ5ID0gYmNtb3NfY2FsbG9jKHNpemVvZihyc2NfbWdyX3VzZXJfZGF0YV9lbnRyeSkpOworICAgIHVzZXJfZGF0YV9lbnRyeS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICAgIFRBSUxRX0lOU0VSVF9IRUFEKCZvYmotPnVzZXJfZGF0YV9saXN0LCB1c2VyX2RhdGFfZW50cnksIG5leHQpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBAYnJpZWYgcmVtb3ZlcyB1c2VyIGRhdGEgZnJvbSB0aGUgbGlua2VkIGxpc3QgaW5zaWRlIHRoZSBvYmogKi8KK3N0YXRpYyBiY21vc19lcnJubyByc2NfbWdyX29ial9yZW1vdmVfdXNlcl9kYXRhKHJzY19tZ3Jfb2JqICpvYmosIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICByc2NfbWdyX3VzZXJfZGF0YV9lbnRyeSAqdXNlcl9kYXRhX2VudHJ5ID0gTlVMTCwgKnVzZXJfZGF0YV9lbnRyeV90bXA7CisKKyAgICBpZiAoTlVMTCA9PSB1c2VyX2RhdGEpCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworCisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKHVzZXJfZGF0YV9lbnRyeSwgJm9iai0+dXNlcl9kYXRhX2xpc3QsIG5leHQsIHVzZXJfZGF0YV9lbnRyeV90bXApCisgICAgeworICAgICAgICBpZiAodXNlcl9kYXRhID09IHVzZXJfZGF0YV9lbnRyeS0+dXNlcl9kYXRhKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFRBSUxRX1JFTU9WRSgmb2JqLT51c2VyX2RhdGFfbGlzdCwgdXNlcl9kYXRhX2VudHJ5LCBuZXh0KTsKKworICAgIHVzZXJfZGF0YV9lbnRyeS0+dXNlcl9kYXRhID0gTlVMTDsKKyAgICBiY21vc19mcmVlKHVzZXJfZGF0YV9lbnRyeSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEBicmllZiBpdGVyYXRvciB0byBpdGVyYXRlIHRocm91Z2ggdGhlIHVzZXIgZGF0YSBsaXN0IGluIG9iaiAKKyAqIEBub3RlIHRoZSBhc3N1bXB0aW9uIGlzIGlmIGEgTlVMTCBpcyByZXR1cm5lZCwgdGhlbiBjYWxsZXIgY29kZSBzdG9wIHRoZSBpdGVyYXRpb24uCisgKiAqLworc3RhdGljIHZvaWQgKnJzY19tZ3Jfb2JqX2dldF9uZXh0X3VzZXJfZGF0YShyc2NfbWdyX29iaiAqb2JqLCB2b2lkICoqY3Vycl91c2VyX2RhdGFfZW50cnksIHZvaWQgKipuZXh0X3VzZXJfZGF0YV9lbnRyeSkKK3sKKyAgICBpZiAoTlVMTCA9PSAqY3Vycl91c2VyX2RhdGFfZW50cnkpCisgICAgeworICAgICAgICAqY3Vycl91c2VyX2RhdGFfZW50cnkgPSBUQUlMUV9GSVJTVCgmb2JqLT51c2VyX2RhdGFfbGlzdCk7CisgICAgICAgIGlmICgqY3Vycl91c2VyX2RhdGFfZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpuZXh0X3VzZXJfZGF0YV9lbnRyeSA9IFRBSUxRX05FWFQoKChyc2NfbWdyX3VzZXJfZGF0YV9lbnRyeSAqKSpjdXJyX3VzZXJfZGF0YV9lbnRyeSksIG5leHQpOworICAgICAgICAgICAgcmV0dXJuICgocnNjX21ncl91c2VyX2RhdGFfZW50cnkgKikoKmN1cnJfdXNlcl9kYXRhX2VudHJ5KSktPnVzZXJfZGF0YTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqY3Vycl91c2VyX2RhdGFfZW50cnkgPSAqbmV4dF91c2VyX2RhdGFfZW50cnk7CisgICAgICAgIGlmICgqbmV4dF91c2VyX2RhdGFfZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpuZXh0X3VzZXJfZGF0YV9lbnRyeSA9IFRBSUxRX05FWFQoKChyc2NfbWdyX3VzZXJfZGF0YV9lbnRyeSAqKSpuZXh0X3VzZXJfZGF0YV9lbnRyeSksIG5leHQpOworICAgICAgICAgICAgcmV0dXJuICgocnNjX21ncl91c2VyX2RhdGFfZW50cnkgKikoKmN1cnJfdXNlcl9kYXRhX2VudHJ5KSktPnVzZXJfZGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisKKy8qIEFsbG9jIElEIChhZ2dyZWdhdGlvbiBwb3J0IElEKSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9yc2NfbWdyX2FjY2Vzc19pbnRfYmFzZV9hbGxvY19pZF9zZXQoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQgbWluX2RhdGFfYWdnX3BvcnRfaWQpCit7CisgICAgYmNtb2x0X3Bvbl9hbGxvY19pbmRleCBhbGxvY19pbmRleDsKKyAgICByc2NfbWdyX3RvcG9fcG9uX2NvbnRleHQgKnRvcG9fY29udGV4dCA9IFJTQ19NR1JfUE9OX1RPUE9fQ09OVEVYVChhY2Nlc3NfaW50X2lkKTsKKworICAgIGlmIChiY21fdG9wb19wb25fZ2V0X3Bvbl9tb2RlKGFjY2Vzc19pbnRfaWQpID09IEJDTV9UT1BPX1BPTl9NT0RFX0dQT04pCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9uaV9jZmcgZ3Bvbl9uaV9jZmcgPSB7fTsKKyAgICAgICAgYmNtb2x0X2dwb25fbmlfY2ZnX2lkIGZhaWxlZF9wcm9wOworCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmdwb25fbmlfY2ZnLCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgbWluX2RhdGFfYWdnX3BvcnRfaWQpOworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX25pX2NmZ19kYXRhX2JvdW5kc19jaGVjaygmZ3Bvbl9uaV9jZmcuZGF0YSwgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSwgJmZhaWxlZF9wcm9wKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgdG9wb19jb250ZXh0LT5sb2dfaWQsICJNaW5pbWFsIGRhdGEgYWxsb2MgSUQgaXMgbm90IGluIHRoZSBhbGxvd2VkIHJhbmdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX25pX2NmZyB4Z3Bvbl9uaV9jZmcgPSB7fTsKKyAgICAgICAgYmNtb2x0X3hncG9uX25pX2NmZ19pZCBmYWlsZWRfcHJvcDsKKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZ4Z3Bvbl9uaV9jZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgbWluX2RhdGFfYWdnX3BvcnRfaWQpOworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soJnhncG9uX25pX2NmZy5kYXRhLCAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSwgJmZhaWxlZF9wcm9wKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgdG9wb19jb250ZXh0LT5sb2dfaWQsICJNaW5pbWFsIGRhdGEgYWxsb2MgSUQgaXMgbm90IGluIHRoZSBhbGxvd2VkIHJhbmdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCFUQUlMUV9FTVBUWSgmdG9wb19jb250ZXh0LT5hbGxvY19pZHMuYWxsb2NhdGVkX29ianMpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgdG9wb19jb250ZXh0LT5sb2dfaWQsICJNaW5pbWFsIGFsbG9jIElEIGNhbm5vdCBiZSBzZXQgd2hlbiB0aGVyZSBhcmUgYWxsb2NhdGVkIGFsbG9jIElEc1xuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1NUQVRFOworICAgIH0KKworICAgIHRvcG9fY29udGV4dC0+YWxsb2NfaWRzLm1pbl9kYXRhX29ial9pZCA9IChyc2NfbWdyX29ial9pZCltaW5fZGF0YV9hZ2dfcG9ydF9pZDsKKyAgICBSU0NfTUdSX0ZPUl9FQUNIX0FMTE9DX0lOREVYKGFjY2Vzc19pbnRfaWQsIGFsbG9jX2luZGV4KQorICAgICAgICB0b3BvX2NvbnRleHQtPmFsbG9jX2lkcy5vYmpzW2FsbG9jX2luZGV4XS5pZCA9IHRvcG9fY29udGV4dC0+YWxsb2NfaWRzLm1pbl9kYXRhX29ial9pZCArIGFsbG9jX2luZGV4OworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIHJzY19tZ3JfYWNjZXNzX2ludF9iYXNlX2FsbG9jX2lkX3NldChiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkLCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBtaW5fZGF0YV9hZ2dfcG9ydF9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gcnNjX21ncl9hbGxvY192YWxpZGF0ZV9jb21tb24oYWNjZXNzX2ludF9pZCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHJldHVybiByYzsKKworICAgIHJldHVybiBfcnNjX21ncl9hY2Nlc3NfaW50X2Jhc2VfYWxsb2NfaWRfc2V0KGFjY2Vzc19pbnRfaWQsIG1pbl9kYXRhX2FnZ19wb3J0X2lkKTsKK30KKworCitzdGF0aWMgYmNtb3NfZXJybm8gcnNjX21ncl9hbGxvY192YWxpZGF0ZV9jb21tb24oYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gcnNjX21ncl9pbml0X3ZhbGlkYXRlKCk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCByc2NfbWdyX2xvZ19pZCwgIlJlc291cmNlIG1hbmFnZXIgaXMgdW5pbml0aWFsaXplZFxuIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAoIWJjbV90b3BvX3Bvbl9pc192YWxpZChhY2Nlc3NfaW50X2lkKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcnNjX21ncl9hbGxvY192YWxpZGF0ZV9ub25fdW5pY2FzdChiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkLCBiY21iYWxfc2VydmljZV9wb3J0X2lkIHRvcG9fY29udGV4dF9nZW1fcG9ydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgcmVxX2dlbV9wb3J0LCB1aW50MzJfdCByYW5nZV9zaXplLCByc2NfbWdyX29ial90eXBlIHR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfbG9nX2lkIGxvZ19pZCkKK3sKKyAgICBpZiAodG9wb19jb250ZXh0X2dlbV9wb3J0ICE9IEJDTU9MVF9QT05fR0VNX1BPUlRfSURfSU5WQUxJRCAmJiByZXFfZ2VtX3BvcnQgJiYgcmVxX2dlbV9wb3J0ICE9IHRvcG9fY29udGV4dF9nZW1fcG9ydCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZCwgIkFjY2VzcyBpbnRlcmZhY2UgYWxyZWFkeSBoYXMgJXMgc2VydmljZSBwb3J0IElEPSV1IGNvbmZpZ3VyZWRcbiIsIFJTQ19NR1JfT0JKX1RZUEVfU1RSKHR5cGUpLCB0b3BvX2NvbnRleHRfZ2VtX3BvcnQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgIH0KKworICAgIGlmIChyYW5nZV9zaXplID4gMSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZCwgIlJhbmdlIGJpZ2dlciB0aGFuIDEgZm9yICVzIEdFTSBwb3J0IGlzIG5vdCBhbGxvd2VkXG4iLCBSU0NfTUdSX09CSl9UWVBFX1NUUih0eXBlKSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIHJzY19tZ3JfYWxsb2NfaWRfYWxsb2MoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQgKmFnZ19wb3J0X2lkLCB1aW50MzJfdCByYW5nZV9zaXplLCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgcnNjX21ncl9vYmpfaWQgb2JqX2lkID0gKmFnZ19wb3J0X2lkOworICAgIHJzY19tZ3JfdG9wb19wb25fY29udGV4dCAqdG9wb19jb250ZXh0ID0gUlNDX01HUl9QT05fVE9QT19DT05URVhUKGFjY2Vzc19pbnRfaWQpOworCisgICAgcmMgPSByc2NfbWdyX2FsbG9jX3ZhbGlkYXRlX2NvbW1vbihhY2Nlc3NfaW50X2lkKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcmMgPSByc2NfbWdyX29ial9hbGxvYyhhY2Nlc3NfaW50X2lkLCAmb2JqX2lkLCByYW5nZV9zaXplLCBSU0NfTUdSX09CSl9UWVBFX0FMTE9DX0lELCAmdG9wb19jb250ZXh0LT5hbGxvY19pZHMsIHVzZXJfZGF0YSwgdG9wb19jb250ZXh0LT5sb2dfaWQpOworICAgICphZ2dfcG9ydF9pZCA9IG9ial9pZDsKKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gcnNjX21ncl9hbGxvY19pZF9mcmVlKGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQsIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkIGFnZ19wb3J0X2lkLCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgcnNjX21ncl90b3BvX3Bvbl9jb250ZXh0ICp0b3BvX2NvbnRleHQgPSBSU0NfTUdSX1BPTl9UT1BPX0NPTlRFWFQoYWNjZXNzX2ludF9pZCk7CisKKyAgICBpZiAoIWJjbV90b3BvX3Bvbl9pc192YWxpZChhY2Nlc3NfaW50X2lkKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIHJldHVybiByc2NfbWdyX29ial9mcmVlKGFjY2Vzc19pbnRfaWQsIChyc2NfbWdyX29ial9pZClhZ2dfcG9ydF9pZCwgJnRvcG9fY29udGV4dC0+YWxsb2NfaWRzLCB1c2VyX2RhdGEsIHRvcG9fY29udGV4dC0+bG9nX2lkKTsKK30KKworYmNtb3NfZXJybm8gcnNjX21ncl9hbGxvY19pZF9nZXRfcmVmX2NvdW50KGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQsIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkIGFnZ19wb3J0X2lkLCB1aW50MzJfdCAqcmVmX2NvdW50KQoreworICAgIHJzY19tZ3Jfb2JqICpvYmo7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgcnNjX21ncl90b3BvX3Bvbl9jb250ZXh0ICp0b3BvX2NvbnRleHQgPSBSU0NfTUdSX1BPTl9UT1BPX0NPTlRFWFQoYWNjZXNzX2ludF9pZCk7CisKKyAgICByYyA9IHJzY19tZ3Jfb2JqX2dldChhY2Nlc3NfaW50X2lkLCAocnNjX21ncl9vYmpfaWQpYWdnX3BvcnRfaWQsICZ0b3BvX2NvbnRleHQtPmFsbG9jX2lkcywgJm9iaiwgdG9wb19jb250ZXh0LT5sb2dfaWQpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICAqcmVmX2NvdW50ID0gb2JqLT5yZWZfY291bnQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEBicmllZiBpdGVyYXRlcyB0aHJvdWdoIHVzZXIgZGF0YSBsaXN0IG9mIGFuIGFsbG9jIGlkIG9iamVjdCAqLwordm9pZCAqcnNjX21ncl9hbGxvY19pZF9nZXRfbmV4dF91c2VyX2RhdGEoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgYmNtYmFsX2FnZ3JlZ2F0aW9uX3BvcnRfaWQgYWdnX3BvcnRfaWQsIHZvaWQgKipjdXJyX3VzZXJfZGF0YV9lbnRyeSwgdm9pZCAqKm5leHRfdXNlcl9kYXRhX2VudHJ5KQoreworICAgIHJzY19tZ3Jfb2JqICpvYmo7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgcnNjX21ncl90b3BvX3Bvbl9jb250ZXh0ICp0b3BvX2NvbnRleHQgPSBSU0NfTUdSX1BPTl9UT1BPX0NPTlRFWFQoYWNjZXNzX2ludF9pZCk7CisKKyAgICByYyA9IHJzY19tZ3Jfb2JqX2dldChhY2Nlc3NfaW50X2lkLCAocnNjX21ncl9vYmpfaWQpYWdnX3BvcnRfaWQsICZ0b3BvX2NvbnRleHQtPmFsbG9jX2lkcywgJm9iaiwgdG9wb19jb250ZXh0LT5sb2dfaWQpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiByc2NfbWdyX29ial9nZXRfbmV4dF91c2VyX2RhdGEob2JqLCBjdXJyX3VzZXJfZGF0YV9lbnRyeSwgbmV4dF91c2VyX2RhdGFfZW50cnkpOyAKK30KKworLyogR0VNIChzZXJ2aWNlIHBvcnQgSUQpICovCitzdGF0aWMgYmNtb3NfZXJybm8gX3JzY19tZ3JfYWNjZXNzX2ludF9iYXNlX2dlbV9zZXQoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCBtaW5fZGF0YV9zdmNfcG9ydF9pZCkKK3sKKyAgICBiY21vbHRfcG9uX2dlbV9wb3J0X2luZGV4IGdlbV9pbmRleDsKKyAgICByc2NfbWdyX3RvcG9fcG9uX2NvbnRleHQgKnRvcG9fY29udGV4dCA9IFJTQ19NR1JfUE9OX1RPUE9fQ09OVEVYVChhY2Nlc3NfaW50X2lkKTsKKworICAgIGlmIChiY21fdG9wb19wb25fZ2V0X3Bvbl9tb2RlKGFjY2Vzc19pbnRfaWQpID09IEJDTV9UT1BPX1BPTl9NT0RFX0dQT04pCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgZ3Bvbl9nZW1fcG9ydF9jZmcgPSB7IC5rZXkuZ2VtX3BvcnRfaWQgPSBtaW5fZGF0YV9zdmNfcG9ydF9pZCB9OworICAgICAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQgZmFpbGVkX3Byb3A7CisKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfYm91bmRzX2NoZWNrKCZncG9uX2dlbV9wb3J0X2NmZy5rZXksIDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAmZmFpbGVkX3Byb3ApIHx8CisgICAgICAgICAgICBtaW5fZGF0YV9zdmNfcG9ydF9pZCA8IE1JTl9CQVNFX0dFTV9QT1JUX0lEX0dQT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIHRvcG9fY29udGV4dC0+bG9nX2lkLCAiTWluaW1hbCBkYXRhIEdFTSBwb3J0IGlzIG5vdCBpbiB0aGUgYWxsb3dlZCByYW5nZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9uaV9jZmcgeGdwb25fbmlfY2ZnID0ge307CisgICAgICAgIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQgZmFpbGVkX3Byb3A7CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmeGdwb25fbmlfY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQsIG1pbl9kYXRhX3N2Y19wb3J0X2lkKTsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKCZ4Z3Bvbl9uaV9jZmcuZGF0YSwgMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lELCAmZmFpbGVkX3Byb3ApKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCB0b3BvX2NvbnRleHQtPmxvZ19pZCwgIk1pbmltYWwgZGF0YSBHRU0gcG9ydCBpcyBub3QgaW4gdGhlIGFsbG93ZWQgcmFuZ2VcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghVEFJTFFfRU1QVFkoJnRvcG9fY29udGV4dC0+Z2Vtcy5hbGxvY2F0ZWRfb2JqcykpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCB0b3BvX2NvbnRleHQtPmxvZ19pZCwgIk1pbmltYWwgR0VNIHBvcnQgY2Fubm90IGJlIHNldCB3aGVuIHRoZXJlIGFyZSBhbGxvY2F0ZWQgR0VNIHBvcnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfU1RBVEU7CisgICAgfQorCisgICAgdG9wb19jb250ZXh0LT5nZW1zLm1pbl9kYXRhX29ial9pZCA9IChyc2NfbWdyX29ial9pZCltaW5fZGF0YV9zdmNfcG9ydF9pZDsKKyAgICBSU0NfTUdSX0ZPUl9FQUNIX0dFTV9JTkRFWChhY2Nlc3NfaW50X2lkLCBnZW1faW5kZXgpCisgICAgICAgIHRvcG9fY29udGV4dC0+Z2Vtcy5vYmpzW2dlbV9pbmRleF0uaWQgPSB0b3BvX2NvbnRleHQtPmdlbXMubWluX2RhdGFfb2JqX2lkICsgZ2VtX2luZGV4OworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIHJzY19tZ3JfYWNjZXNzX2ludF9iYXNlX2dlbV9zZXQoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCBtaW5fZGF0YV9zdmNfcG9ydF9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gcnNjX21ncl9hbGxvY192YWxpZGF0ZV9jb21tb24oYWNjZXNzX2ludF9pZCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHJldHVybiByYzsKKworICAgIHJldHVybiBfcnNjX21ncl9hY2Nlc3NfaW50X2Jhc2VfZ2VtX3NldChhY2Nlc3NfaW50X2lkLCBtaW5fZGF0YV9zdmNfcG9ydF9pZCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfcnNjX21ncl9iYXNlX3RtX3NjaGVkX2F1dG9faWRfc2V0IChiY21iYWxfdG1fc2NoZWRfaWQgbWluX3RtX3NjaGVkX2F1dG9faWQpCit7CisJYmNtYmFsX3RtX3NjaGVkX2lkX2luZGV4IGk7CisKKworCWlmICghVEFJTFFfRU1QVFkoJnRtX2NvbnRleHQudG1fc2NoZWRfYXV0b19rZXlfaWRzLmFsbG9jYXRlZF9vYmpzKSkKKwl7CisJCUJDTV9MT0coRVJST1IsIHRtX2NvbnRleHQubG9nX2lkLCAiTWluaW1hbCB0bSBub2RlIGF1dG8gaWQgY2Fubm90IGJlIHNldCB3aGVuIHRoZXJlIGFyZSBhbGxvY2F0ZWQgaWRzIFxuIik7CisJCXJldHVybiBCQ01fRVJSX1NUQVRFOworCX0KKworCXRtX2NvbnRleHQudG1fc2NoZWRfYXV0b19rZXlfaWRzLm1pbl9kYXRhX29ial9pZCA9IChyc2NfbWdyX29ial9pZCltaW5fdG1fc2NoZWRfYXV0b19pZDsKKwlSU0NfTUdSX0ZPUl9FQUNIX1RNX1NDSEVEX0FVVE9fSU5ERVgoaSkKKwl7CisJCXRtX2NvbnRleHQudG1fc2NoZWRfYXV0b19rZXlfaWRzLm9ianNbaV0uaWQgPSB0bV9jb250ZXh0LnRtX3NjaGVkX2F1dG9fa2V5X2lkcy5taW5fZGF0YV9vYmpfaWQgKyBpOworCX0KKworCXJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyByc2NfbWdyX2dlbV9hbGxvY191bmljYXN0KGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQsIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgKnN2Y19wb3J0X2lkLCB1aW50MzJfdCByYW5nZV9zaXplLCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgcnNjX21ncl90b3BvX3Bvbl9jb250ZXh0ICp0b3BvX2NvbnRleHQgPSBOVUxMOworICAgIHJzY19tZ3Jfb2JqX2lkIG9ial9pZCA9ICpzdmNfcG9ydF9pZDsKKworICAgIHJjID0gcnNjX21ncl9hbGxvY192YWxpZGF0ZV9jb21tb24oYWNjZXNzX2ludF9pZCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHJldHVybiByYzsKKworICAgIHRvcG9fY29udGV4dCA9IFJTQ19NR1JfUE9OX1RPUE9fQ09OVEVYVChhY2Nlc3NfaW50X2lkKTsKKworICAgIHJjID0gcnNjX21ncl9vYmpfYWxsb2MoYWNjZXNzX2ludF9pZCwgJm9ial9pZCwgcmFuZ2Vfc2l6ZSwgUlNDX01HUl9PQkpfVFlQRV9HRU1fUE9SVF9VTklDQVNULCAmdG9wb19jb250ZXh0LT5nZW1zLCB1c2VyX2RhdGEsIHRvcG9fY29udGV4dC0+bG9nX2lkKTsKKyAgICAqc3ZjX3BvcnRfaWQgPSBvYmpfaWQ7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworYmNtb3NfZXJybm8gcnNjX21ncl9nZW1fYWxsb2NfbXVsdGljYXN0KGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQsIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgKnN2Y19wb3J0X2lkLCB1aW50MzJfdCByYW5nZV9zaXplLCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgcnNjX21ncl90b3BvX3Bvbl9jb250ZXh0ICp0b3BvX2NvbnRleHQgPSBOVUxMOworICAgIHJzY19tZ3Jfb2JqX2lkIG9ial9pZCA9ICpzdmNfcG9ydF9pZDsKKworICAgIHJjID0gcnNjX21ncl9hbGxvY192YWxpZGF0ZV9jb21tb24oYWNjZXNzX2ludF9pZCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgIHJldHVybiByYzsKKworICAgIHRvcG9fY29udGV4dCA9IFJTQ19NR1JfUE9OX1RPUE9fQ09OVEVYVChhY2Nlc3NfaW50X2lkKTsKKyNpZm5kZWYgTVVMVElQTEVfTVVMVElDQVNUX0dFTV9QT1JUU19QRVJfUE9OCisgICAgcmMgPSByc2NfbWdyX2FsbG9jX3ZhbGlkYXRlX25vbl91bmljYXN0KGFjY2Vzc19pbnRfaWQsIHRvcG9fY29udGV4dC0+bXVsdGljYXN0X2dlbV9wb3J0LCAqc3ZjX3BvcnRfaWQsIHJhbmdlX3NpemUsIFJTQ19NR1JfT0JKX1RZUEVfR0VNX1BPUlRfTVVMVElDQVNULCB0b3BvX2NvbnRleHQtPmxvZ19pZCk7CisKKyAgICBpZiAodG9wb19jb250ZXh0LT5tdWx0aWNhc3RfZ2VtX3BvcnQgIT0gQkNNT0xUX1BPTl9HRU1fUE9SVF9JRF9JTlZBTElEKQorICAgICAgICBvYmpfaWQgPSB0b3BvX2NvbnRleHQtPm11bHRpY2FzdF9nZW1fcG9ydDsgLyogVGhpcyB3aWxsIGNhdXNlIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIG11bHRpY2FzdCBHRU0gdG8gaW5jcmVhc2UuICovCisjZW5kaWYKKworICAgIHJjID0gcnNjX21ncl9vYmpfYWxsb2MoYWNjZXNzX2ludF9pZCwgJm9ial9pZCwgcmFuZ2Vfc2l6ZSwgUlNDX01HUl9PQkpfVFlQRV9HRU1fUE9SVF9NVUxUSUNBU1QsICZ0b3BvX2NvbnRleHQtPmdlbXMsIHVzZXJfZGF0YSwgdG9wb19jb250ZXh0LT5sb2dfaWQpOworICAgICpzdmNfcG9ydF9pZCA9IG9ial9pZDsKKworI2lmbmRlZiBNVUxUSVBMRV9NVUxUSUNBU1RfR0VNX1BPUlRTX1BFUl9QT04KKyAgICBpZiAoIXJjKQorICAgICAgICBSU0NfTUdSX1BPTl9UT1BPX0NPTlRFWFQoYWNjZXNzX2ludF9pZCktPm11bHRpY2FzdF9nZW1fcG9ydCA9ICpzdmNfcG9ydF9pZDsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyByc2NfbWdyX2dlbV9hbGxvY19icm9hZGNhc3QoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCAqc3ZjX3BvcnRfaWQsIHVpbnQzMl90IHJhbmdlX3NpemUsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICByc2NfbWdyX3RvcG9fcG9uX2NvbnRleHQgKnRvcG9fY29udGV4dCA9IE5VTEw7CisgICAgcnNjX21ncl9vYmpfaWQgb2JqX2lkID0gKnN2Y19wb3J0X2lkOworCisgICAgcmMgPSByc2NfbWdyX2FsbG9jX3ZhbGlkYXRlX2NvbW1vbihhY2Nlc3NfaW50X2lkKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgdG9wb19jb250ZXh0ID0gUlNDX01HUl9QT05fVE9QT19DT05URVhUKGFjY2Vzc19pbnRfaWQpOworI2lmbmRlZiBNVUxUSVBMRV9CUk9BRENBU1RfR0VNX1BPUlRTX1BFUl9QT04KKyAgICByYyA9IHJzY19tZ3JfYWxsb2NfdmFsaWRhdGVfbm9uX3VuaWNhc3QoYWNjZXNzX2ludF9pZCwgdG9wb19jb250ZXh0LT5icm9hZGNhc3RfZ2VtX3BvcnQsICpzdmNfcG9ydF9pZCwgcmFuZ2Vfc2l6ZSwgUlNDX01HUl9PQkpfVFlQRV9HRU1fUE9SVF9CUk9BRENBU1QsIHRvcG9fY29udGV4dC0+bG9nX2lkKTsKKworICAgIGlmICh0b3BvX2NvbnRleHQtPmJyb2FkY2FzdF9nZW1fcG9ydCAhPSBCQ01PTFRfUE9OX0dFTV9QT1JUX0lEX0lOVkFMSUQpCisgICAgICAgIG9ial9pZCA9IHRvcG9fY29udGV4dC0+YnJvYWRjYXN0X2dlbV9wb3J0OyAvKiBUaGlzIHdpbGwgY2F1c2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgYnJvYWRjYXN0IEdFTSB0byBpbmNyZWFzZS4gKi8KKyNlbmRpZgorCisgICAgcmMgPSByc2NfbWdyX29ial9hbGxvYyhhY2Nlc3NfaW50X2lkLCAmb2JqX2lkLCByYW5nZV9zaXplLCBSU0NfTUdSX09CSl9UWVBFX0dFTV9QT1JUX0JST0FEQ0FTVCwgJnRvcG9fY29udGV4dC0+Z2VtcywgdXNlcl9kYXRhLCB0b3BvX2NvbnRleHQtPmxvZ19pZCk7CisgICAgKnN2Y19wb3J0X2lkID0gb2JqX2lkOworCisjaWZuZGVmIE1VTFRJUExFX0JST0FEQ0FTVF9HRU1fUE9SVFNfUEVSX1BPTgorICAgIGlmICghcmMpCisgICAgICAgIFJTQ19NR1JfUE9OX1RPUE9fQ09OVEVYVChhY2Nlc3NfaW50X2lkKS0+YnJvYWRjYXN0X2dlbV9wb3J0ID0gKnN2Y19wb3J0X2lkOworI2VuZGlmCisKKyAgICByZXR1cm4gcmM7Cit9CisKK2JjbW9zX2Vycm5vIHJzY19tZ3JfZ2VtX2ZyZWUoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCBzdmNfcG9ydF9pZCwgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworI2lmbmRlZiBNVUxUSVBMRV9NVUxUSUNBU1RfR0VNX1BPUlRTX1BFUl9QT04KKyAgICByc2NfbWdyX3RvcG9fcG9uX2NvbnRleHQgKnRvcG9fY29udGV4dDsKKyNlbmRpZgorCisgICAgaWYgKCFiY21fdG9wb19wb25faXNfdmFsaWQoYWNjZXNzX2ludF9pZCkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyNpZm5kZWYgTVVMVElQTEVfTVVMVElDQVNUX0dFTV9QT1JUU19QRVJfUE9OCisgICAgdG9wb19jb250ZXh0ID0gUlNDX01HUl9QT05fVE9QT19DT05URVhUKGFjY2Vzc19pbnRfaWQpOworI2VuZGlmCisKKyAgICByYyA9IHJzY19tZ3Jfb2JqX2ZyZWUoYWNjZXNzX2ludF9pZCwgKHJzY19tZ3Jfb2JqX2lkKXN2Y19wb3J0X2lkLCAmdG9wb19jb250ZXh0LT5nZW1zLCB1c2VyX2RhdGEsIHRvcG9fY29udGV4dC0+bG9nX2lkKTsKKworI2lmbmRlZiBNVUxUSVBMRV9NVUxUSUNBU1RfR0VNX1BPUlRTX1BFUl9QT04KKyAgICBpZiAoIXJjICYmIHRvcG9fY29udGV4dC0+bXVsdGljYXN0X2dlbV9wb3J0ID09IHN2Y19wb3J0X2lkKQorICAgICAgICBSU0NfTUdSX1BPTl9UT1BPX0NPTlRFWFQoYWNjZXNzX2ludF9pZCktPm11bHRpY2FzdF9nZW1fcG9ydCA9IEJDTU9MVF9QT05fR0VNX1BPUlRfSURfSU5WQUxJRDsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyByc2NfbWdyX2dlbV9nZXRfcmVmX2NvdW50KGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQsIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgc3ZjX3BvcnRfaWQsIHVpbnQzMl90ICpyZWZfY291bnQpCit7CisgICAgcnNjX21ncl9vYmogKm9iajsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICByc2NfbWdyX3RvcG9fcG9uX2NvbnRleHQgKnRvcG9fY29udGV4dCA9IFJTQ19NR1JfUE9OX1RPUE9fQ09OVEVYVChhY2Nlc3NfaW50X2lkKTsKKworICAgIHJjID0gcnNjX21ncl9vYmpfZ2V0KGFjY2Vzc19pbnRfaWQsIChyc2NfbWdyX29ial9pZClzdmNfcG9ydF9pZCwgJnRvcG9fY29udGV4dC0+Z2VtcywgJm9iaiwgdG9wb19jb250ZXh0LT5sb2dfaWQpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICAqcmVmX2NvdW50ID0gb2JqLT5yZWZfY291bnQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEBicmllZiBpdGVyYXRlcyB0aHJvdWdoIHVzZXIgZGF0YSBsaXN0IG9mIGEgZ2VtIG9iamVjdCAqLwordm9pZCAqcnNjX21ncl9nZW1fZ2V0X25leHRfdXNlcl9kYXRhKGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQsIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgc3ZjX3BvcnRfaWQsIHZvaWQgKipjdXJyX3VzZXJfZGF0YV9lbnRyeSwgdm9pZCAqKm5leHRfdXNlcl9kYXRhX2VudHJ5KQoreworICAgIHJzY19tZ3Jfb2JqICpvYmo7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgcnNjX21ncl90b3BvX3Bvbl9jb250ZXh0ICp0b3BvX2NvbnRleHQgPSBSU0NfTUdSX1BPTl9UT1BPX0NPTlRFWFQoYWNjZXNzX2ludF9pZCk7CisKKyAgICByYyA9IHJzY19tZ3Jfb2JqX2dldChhY2Nlc3NfaW50X2lkLCAocnNjX21ncl9vYmpfaWQpc3ZjX3BvcnRfaWQsICZ0b3BvX2NvbnRleHQtPmdlbXMsICZvYmosIHRvcG9fY29udGV4dC0+bG9nX2lkKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gcnNjX21ncl9vYmpfZ2V0X25leHRfdXNlcl9kYXRhKG9iaiwgY3Vycl91c2VyX2RhdGFfZW50cnksIG5leHRfdXNlcl9kYXRhX2VudHJ5KTsgCit9CisKKworCitiY21vc19lcnJubyBfcnNjX21ncl90bV9zY2hlZF9hdXRvX2lkX2FsbG9jKGJjbWJhbF90bV9zY2hlZF9pZCAqdG1fc2NoZWRfaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgcnNjX21ncl9vYmpfaWQgb2JqX2lkID0gKnRtX3NjaGVkX2lkOworCisgICAgcmMgPSByc2NfbWdyX2luaXRfdmFsaWRhdGUoKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHJzY19tZ3JfbG9nX2lkLCAiUmVzb3VyY2UgbWFuYWdlciBpcyB1bmluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGEgbmV3IG9iamVjdC4gKi8KKyAgICByYyA9IHJzY19tZ3Jfb2JqX2FsbG9jKDAsICZvYmpfaWQsIDEsIFJTQ19NR1JfT0JKX1RZUEVfVE1fU0NIRUQsICZ0bV9jb250ZXh0LnRtX3NjaGVkX2F1dG9fa2V5X2lkcywgTlVMTCwgdG1fY29udGV4dC5sb2dfaWQpOworICAgICp0bV9zY2hlZF9pZCA9IG9ial9pZDsKKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gX3JzY19tZ3JfdG1fc2NoZWRfYXV0b19pZF9mcmVlKGJjbWJhbF90bV9zY2hlZF9pZCB0bV9zY2hlZF9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gcnNjX21ncl9vYmpfZnJlZSgwLCAocnNjX21ncl9vYmpfaWQpdG1fc2NoZWRfaWQsICZ0bV9jb250ZXh0LnRtX3NjaGVkX2F1dG9fa2V5X2lkcywgTlVMTCwgdG1fY29udGV4dC5sb2dfaWQpOworCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyBfcnNjX21ncl90bV9zY2hlZF9hdXRvX2lkX2dldF9yZWZfY291bnQoYmNtYmFsX3RtX3NjaGVkX2lkIHRtX3NjaGVkX2lkLCB1aW50MzJfdCAqcmVmX2NvdW50KQoreworICAgIHJzY19tZ3Jfb2JqICpvYmo7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IHJzY19tZ3Jfb2JqX2dldCgwLCAocnNjX21ncl9vYmpfaWQpdG1fc2NoZWRfaWQsICZ0bV9jb250ZXh0LnRtX3NjaGVkX2F1dG9fa2V5X2lkcywgJm9iaiwgdG1fY29udGV4dC5sb2dfaWQpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICAqcmVmX2NvdW50ID0gb2JqLT5yZWZfY291bnQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfYm9vbCBfcnNjX21ncl90bV9zY2hlZF9pZF92YWxpZGF0ZShiY21iYWxfdG1fc2NoZWRfaWQgdG1fc2NoZWRfa2V5X2lkKQoreworCXJldHVybiAoIXJzY19tZ3JfaXNfdmFsaWRfZGF0YV90bV9zY2hlZF9hdXRvX2lkKHRtX3NjaGVkX2tleV9pZCkpOworfQorCitzdGF0aWMgdm9pZCByc2NfbWdyX2luaXRfb2JqX3JzYyhyc2NfbWdyX29ial9yc2MgKm9ial9yc2MsIHJzY19tZ3JfaXNfdmFsaWRfZGF0YV9vYmpfaWRfY2JfdCBpc192YWxpZF9kYXRhX29ial9pZF9jYiwKKyAgICByc2NfbWdyX2dldF9sYXN0X2RhdGFfb2JqX2lkX2NiX3QgZ2V0X2xhc3RfZGF0YV9vYmpfaWRfY2IsIHVpbnQzMl90IG51bV9vZl9vYmpzLCBjb25zdCBjaGFyICpvYmpfbmFtZSkKK3sKKyAgICByc2NfbWdyX29iaiAqb2JqOworCisgICAgb2JqX3JzYy0+b2JqX25hbWUgPSBvYmpfbmFtZTsKKyAgICBvYmpfcnNjLT5pc192YWxpZF9kYXRhX29ial9pZF9jYiA9IGlzX3ZhbGlkX2RhdGFfb2JqX2lkX2NiOworICAgIG9ial9yc2MtPmdldF9sYXN0X2RhdGFfb2JqX2lkX2NiID0gZ2V0X2xhc3RfZGF0YV9vYmpfaWRfY2I7CisgICAgVEFJTFFfSU5JVCgmb2JqX3JzYy0+ZnJlZV9vYmpzKTsKKyAgICBUQUlMUV9JTklUKCZvYmpfcnNjLT5hbGxvY2F0ZWRfb2Jqcyk7CisgICAgb2JqX3JzYy0+b2JqcyA9IGJjbW9zX2NhbGxvYyhudW1fb2Zfb2JqcyAqIHNpemVvZigqb2JqX3JzYy0+b2JqcykpOworICAgIG9ial9yc2MtPm51bV9vZl9vYmpzID0gbnVtX29mX29ianM7CisKKyAgICAvKiBJbnNlcnQgYSBmaXJzdCBlbnRyeSB0byB0aGUgbGlzdCBvZiBmcmVlIG9iamVjdHMuICovCisgICAgb2JqID0gJm9ial9yc2MtPm9ianNbMF07CisgICAgb2JqLT5yYW5nZV9zaXplID0gbnVtX29mX29ianM7CisgICAgVEFJTFFfSU5TRVJUX0hFQUQoJm9ial9yc2MtPmZyZWVfb2Jqcywgb2JqLCBsaXN0KTsKK30KKworc3RhdGljIHZvaWQgcnNjX21ncl91bmluaXRfb2JqX3JzYyhyc2NfbWdyX29ial9yc2MgKm9ial9yc2MpCit7CisgICAgYmNtb3NfZnJlZShvYmpfcnNjLT5vYmpzKTsKK30KKworYmNtb3NfZXJybm8gcnNjX21ncl9tYWNfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IHBvbl9pZDsKKyAgICByc2NfbWdyX3RvcG9fcG9uX2NvbnRleHQgKnRvcG9fY29udGV4dCwgKm9sZF90b3BvX2NvbnRleHQ7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgcmMgPSByc2NfbWdyX2luaXRfdmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgcnNjX21ncl9sb2dfaWQsICJSZXNvdXJjZSBNYW5hZ2VyIHdhcyBub3QgaW5pdGlhbGl6ZWQiKTsgICAJICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQkNNX1RPUE9fRk9SX0VBQ0hfUE9OKGRldmljZV9pZCwgcG9uX2lkKQorICAgICAgICB7CisgICAgICAgICAgICBvbGRfdG9wb19jb250ZXh0ID0gYmNtX3RvcG9fcG9uX2dldF9jb250ZXh0KHBvbl9pZCwgQkNNX1RPUE9fUE9OX0NPTlRFWFRfSURfUlNDX01HUik7CisgICAgICAgICAgICBpZiAob2xkX3RvcG9fY29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vc19mcmVlKG9sZF90b3BvX2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9wb19jb250ZXh0ID0gYmNtb3NfY2FsbG9jKHNpemVvZigqdG9wb19jb250ZXh0KSk7CisgICAgICAgICAgICBpZiAoYmNtX3RvcG9fcG9uX2dldF9wb25fbW9kZShwb25faWQpID09IEJDTV9UT1BPX1BPTl9NT0RFX0dQT04pCisJCQl7CisJCQkJdG9wb19jb250ZXh0LT5udW1fb2ZfYWxsb2NfaWRzID0gR1BPTl9OVU1fT0ZfQUxMT0NfSURTOworCQkJCXRvcG9fY29udGV4dC0+bnVtX29mX2dlbV9wb3J0cyA9IEdQT05fTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfUE9OOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRvcG9fY29udGV4dC0+bnVtX29mX2FsbG9jX2lkcyA9IFhHUE9OX05VTV9PRl9BTExPQ19JRFM7CisJCQkJdG9wb19jb250ZXh0LT5udW1fb2ZfZ2VtX3BvcnRzID0gWEdQT05fTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfUE9OOworCQkJfQorCQkJdG9wb19jb250ZXh0LT5tdWx0aWNhc3RfZ2VtX3BvcnQgPSBCQ01PTFRfUE9OX0dFTV9QT1JUX0lEX0lOVkFMSUQ7CisJCQl0b3BvX2NvbnRleHQtPmJyb2FkY2FzdF9nZW1fcG9ydCA9IEJDTU9MVF9QT05fR0VNX1BPUlRfSURfSU5WQUxJRDsKKwkJCWJjbV90b3BvX3Bvbl9zZXRfY29udGV4dChwb25faWQsIEJDTV9UT1BPX1BPTl9DT05URVhUX0lEX1JTQ19NR1IsIHRvcG9fY29udGV4dCk7CisjaWZkZWYgRU5BQkxFX0xPRworCQkJc25wcmludGYodG9wb19jb250ZXh0LT5sb2dfaWRfbmFtZSwgc2l6ZW9mKHRvcG9fY29udGV4dC0+bG9nX2lkX25hbWUpLCAiUlNDX01HUiV1IiwgcG9uX2lkKTsKKwkJCXRvcG9fY29udGV4dC0+bG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIodG9wb19jb250ZXh0LT5sb2dfaWRfbmFtZSwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisJCQlCVUdfT04odG9wb19jb250ZXh0LT5sb2dfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKTsKKyNlbmRpZgkgICAgCisJCQlyc2NfbWdyX2luaXRfb2JqX3JzYygmdG9wb19jb250ZXh0LT5hbGxvY19pZHMsIHJzY19tZ3JfaXNfdmFsaWRfZGF0YV9hbGxvY19pZF9jYiwgcnNjX21ncl9nZXRfbGFzdF9kYXRhX2FsbG9jX2lkX2NiLAorCQkJCVJTQ19NR1JfUE9OX1RPUE9fQ09OVEVYVChwb25faWQpLT5udW1fb2ZfYWxsb2NfaWRzLCAiYWxsb2MgSUQiKTsKKwkJCXJzY19tZ3JfaW5pdF9vYmpfcnNjKCZ0b3BvX2NvbnRleHQtPmdlbXMsIHJzY19tZ3JfaXNfdmFsaWRfZGF0YV9nZW1fY2IsIHJzY19tZ3JfZ2V0X2xhc3RfZGF0YV9nZW1fY2IsCisJCQkJUlNDX01HUl9QT05fVE9QT19DT05URVhUKHBvbl9pZCktPm51bV9vZl9nZW1fcG9ydHMsICJHRU0gcG9ydCIpOworCQkJCisJCQlpZiAoYmNtX3RvcG9fcG9uX2dldF9wb25fbW9kZShwb25faWQpID09IEJDTV9UT1BPX1BPTl9NT0RFX0dQT04pCisJCQl7CisJCQkJYmNtb2x0X2dwb25fbmlfY2ZnIGdwb25fbmlfY2ZnID0ge307CisJCQkJCisJCQkJYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoJmdwb25fbmlfY2ZnLmRhdGEsIDEgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKTsKKwkJCQlfcnNjX21ncl9hY2Nlc3NfaW50X2Jhc2VfYWxsb2NfaWRfc2V0KHBvbl9pZCwgZ3Bvbl9uaV9jZmcuZGF0YS5taW5fZGF0YV9hbGxvY19pZCk7CisJCQkJCisJCQkJX3JzY19tZ3JfYWNjZXNzX2ludF9iYXNlX2dlbV9zZXQocG9uX2lkLCBNSU5fQkFTRV9HRU1fUE9SVF9JRF9HUE9OKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQliY21vbHRfeGdwb25fbmlfY2ZnIHhncG9uX25pX2NmZyA9IHt9OworCQkJCQorCQkJCWJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YV9zZXRfZGVmYXVsdCgmeGdwb25fbmlfY2ZnLmRhdGEsIDEgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRCk7CisJCQkJX3JzY19tZ3JfYWNjZXNzX2ludF9iYXNlX2FsbG9jX2lkX3NldChwb25faWQsIHhncG9uX25pX2NmZy5kYXRhLm1pbl9kYXRhX2FsbG9jX2lkKTsKKwkJCQkKKwkJCQliY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoJnhncG9uX25pX2NmZy5kYXRhLCAxIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfR0VNX1BPUlRfSUQpOworCQkJCV9yc2NfbWdyX2FjY2Vzc19pbnRfYmFzZV9nZW1fc2V0KHBvbl9pZCwgeGdwb25fbmlfY2ZnLmRhdGEubWluX2RhdGFfZ2VtX3BvcnRfaWQpOworCQkJfQorCQl9CQorICAgICAgICAKKyAgICB9d2hpbGUoMCk7CisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyByc2NfbWdyX2luaXQodm9pZCkKK3sKKyAgICBpZiAocnNjX21ncl9pbml0X3ZhbGlkYXRlKCkgPT0gQkNNX0VSUl9PSykKKyAgIAl7CisgICAgICAgIEJDTV9MT0coSU5GTywgcnNjX21ncl9sb2dfaWQsICJSZXNvdXJjZSBNYW5hZ2VyIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIik7ICAgCSAgICAKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAJfQorCisjaWZkZWYgRU5BQkxFX0xPRworICAgIGlmIChyc2NfbWdyX2xvZ19pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgeworICAgICAgICByc2NfbWdyX2xvZ19pZCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJSU0NfTUdSIiwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgICAgIEJVR19PTihyc2NfbWdyX2xvZ19pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpOworICAgIH0KKyNlbmRpZgorCisgICAgLypJbml0IHRoZSB0bSBvYmplY3QqLworICAgIHRtX2NvbnRleHQubnVtX29mX3RtX3NjaGVkX2F1dG9fa2V5X2lkcyA9IE5VTV9PRl9UTV9TQ0hFRF9BVVRPX0tFWV9JRFM7CisgICAgc25wcmludGYodG1fY29udGV4dC5sb2dfaWRfbmFtZSAsIHNpemVvZih0bV9jb250ZXh0LmxvZ19pZF9uYW1lKSAsICJSU0NfTUdSX1RNIik7CisJdG1fY29udGV4dC5sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcih0bV9jb250ZXh0LmxvZ19pZF9uYW1lLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICBCVUdfT04odG1fY29udGV4dC5sb2dfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKTsKKwkKKwlyc2NfbWdyX2luaXRfb2JqX3JzYygmdG1fY29udGV4dC50bV9zY2hlZF9hdXRvX2tleV9pZHMsIHJzY19tZ3JfaXNfdmFsaWRfZGF0YV90bV9zY2hlZF9hdXRvX2lkX2NiLCByc2NfbWdyX2dldF9sYXN0X2RhdGFfdG1fc2NoZWRfYXV0b19pZF9jYiwKKwkJdG1fY29udGV4dC5udW1fb2ZfdG1fc2NoZWRfYXV0b19rZXlfaWRzLCAiVE0gbm9kZSBhdXRvIGlkIik7CisKKwlfcnNjX21ncl9iYXNlX3RtX3NjaGVkX2F1dG9faWRfc2V0KE1JTl9CQVNFX1RNX1NDSEVEX0FVVE9fSUQpOworCQorICAgIHJzY19tZ3JfY29udGV4dC5pc19pbml0aWFsaXplZCA9IEJDTU9TX1RSVUU7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgcnNjX21ncl91bmluaXQodm9pZCkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IHBvbl9pZDsKKworICAgIGlmICghcnNjX21ncl9jb250ZXh0LmlzX2luaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisKKyAgICBCQ01fVE9QT19GT1JfRUFDSF9QT04oZGV2aWNlX2lkLCBwb25faWQpCisgICAgeworICAgICAgICByc2NfbWdyX3RvcG9fcG9uX2NvbnRleHQgKnRvcG9fY29udGV4dCA9IFJTQ19NR1JfUE9OX1RPUE9fQ09OVEVYVChwb25faWQpOworCisgICAgICAgIHJzY19tZ3JfdW5pbml0X29ial9yc2MoJnRvcG9fY29udGV4dC0+Z2Vtcyk7CisgICAgICAgIHJzY19tZ3JfdW5pbml0X29ial9yc2MoJnRvcG9fY29udGV4dC0+YWxsb2NfaWRzKTsKKyAgICB9CisgICAgcnNjX21ncl9jb250ZXh0LmlzX2luaXRpYWxpemVkID0gQkNNT1NfRkFMU0U7Cit9CisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL3JzY19tZ3IuaCBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL3JzY19tZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzJkMzdlCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJyc2NtZ3IvcnNjX21nci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisjaWZuZGVmIF9SU0NfTUdSX0hfCisjZGVmaW5lIF9SU0NfTUdSX0hfCisKKyNpbmNsdWRlIDxiYWxfb2Jqcy5oPgorCisvKiBBbGxvYyBJRCAoYWdncmVnYXRpb24gcG9ydCBJRCkgKi8KK2JjbW9zX2Vycm5vIHJzY19tZ3JfYWNjZXNzX2ludF9iYXNlX2FsbG9jX2lkX3NldChiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkLCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBtaW5fZGF0YV9hZ2dfcG9ydF9pZCk7CitiY21vc19lcnJubyByc2NfbWdyX2FsbG9jX2lkX2FsbG9jKGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQsIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkICphZ2dfcG9ydF9pZCwgdWludDMyX3QgcmFuZ2Vfc2l6ZSwgdm9pZCAqdXNlcl9kYXRhKTsKK2JjbW9zX2Vycm5vIHJzY19tZ3JfYWxsb2NfaWRfZnJlZShiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkLCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBhZ2dfcG9ydF9pZCwgdm9pZCAqdXNlcl9kYXRhKTsKK2JjbW9zX2Vycm5vIHJzY19tZ3JfYWxsb2NfaWRfZ2V0X3JlZl9jb3VudChiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkLCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBhZ2dfcG9ydF9pZCwgdWludDMyX3QgKnJlZl9jb3VudCk7Cit2b2lkKiByc2NfbWdyX2FsbG9jX2lkX2dldF9uZXh0X3VzZXJfZGF0YShiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkLCBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBhZ2dfcG9ydF9pZCwgdm9pZCAqKmN1cnJfdXNlcl9kYXRhX2VudHJ5LCB2b2lkICoqbmV4dF91c2VyX2RhdGFfZW50cnkpOworCisKKy8qIEdFTSAoc2VydmljZSBwb3J0IElEKSAqLworYmNtb3NfZXJybm8gcnNjX21ncl9hY2Nlc3NfaW50X2Jhc2VfZ2VtX3NldChiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkLCBiY21iYWxfc2VydmljZV9wb3J0X2lkIG1pbl9kYXRhX3N2Y19wb3J0X2lkKTsKK2JjbW9zX2Vycm5vIHJzY19tZ3JfZ2VtX2FsbG9jX3VuaWNhc3QoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCAqc3ZjX3BvcnRfaWQsIHVpbnQzMl90IHJhbmdlX3NpemUsIHZvaWQgKnVzZXJfZGF0YSk7CitiY21vc19lcnJubyByc2NfbWdyX2dlbV9hbGxvY19tdWx0aWNhc3QoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCAqc3ZjX3BvcnRfaWQsIHVpbnQzMl90IHJhbmdlX3NpemUsIHZvaWQgKnVzZXJfZGF0YSk7CitiY21vc19lcnJubyByc2NfbWdyX2dlbV9hbGxvY19icm9hZGNhc3QoYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCwgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCAqc3ZjX3BvcnRfaWQsIHVpbnQzMl90IHJhbmdlX3NpemUsIHZvaWQgKnVzZXJfZGF0YSk7CitiY21vc19lcnJubyByc2NfbWdyX2dlbV9mcmVlKGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQsIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgc3ZjX3BvcnRfaWQsIHZvaWQgKnVzZXJfZGF0YSk7CitiY21vc19lcnJubyByc2NfbWdyX2dlbV9nZXRfcmVmX2NvdW50KGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQsIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgc3ZjX3BvcnRfaWQsIHVpbnQzMl90ICpyZWZfY291bnQpOwordm9pZCogcnNjX21ncl9nZW1fZ2V0X25leHRfdXNlcl9kYXRhKGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQsIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgc3ZjX3BvcnRfaWQsIHZvaWQgKipjdXJyX3VzZXJfZGF0YV9lbnRyeSwgdm9pZCAqKm5leHRfdXNlcl9kYXRhX2VudHJ5KTsKKworYmNtb3NfZXJybm8gX3JzY19tZ3JfdG1fc2NoZWRfYXV0b19pZF9hbGxvYyhiY21iYWxfdG1fc2NoZWRfaWQgKnRtX3NjaGVkX2tleV9pZCk7CitiY21vc19lcnJubyBfcnNjX21ncl90bV9zY2hlZF9hdXRvX2lkX2ZyZWUoYmNtYmFsX3RtX3NjaGVkX2lkIHRtX3NjaGVkX2tleV9pZCk7CitiY21vc19lcnJubyBfcnNjX21ncl90bV9zY2hlZF9hdXRvX2lkX2dldF9yZWZfY291bnQoYmNtYmFsX3RtX3NjaGVkX2lkIHRtX3NjaGVkX2tleV9pZCwgdWludDMyX3QgKnJlZl9jb3VudCk7CitiY21vc19ib29sIF9yc2NfbWdyX3RtX3NjaGVkX2lkX3ZhbGlkYXRlKGJjbWJhbF90bV9zY2hlZF9pZCB0bV9zY2hlZF9rZXlfaWQpOworCitiY21vc19lcnJubyByc2NfbWdyX21hY19pbml0KHZvaWQpOworYmNtb3NfZXJybm8gcnNjX21ncl9pbml0KHZvaWQpOwordm9pZCByc2NfbWdyX3VuaW5pdCh2b2lkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL3JzY19tZ3JfY2xpLmMgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYnJzY21nci9yc2NfbWdyX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODQ3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYnJzY21nci9yc2NfbWdyX2NsaS5jCkBAIC0wLDAgKzEsMzE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8YmFsX29ianMuaD4KKyNpbmNsdWRlIDxiYWxfYXBpLmg+CisjaW5jbHVkZSA8YmNtX3RvcG8uaD4KKyNpbmNsdWRlICJyc2NfbWdyLmgiCisjaW5jbHVkZSAicnNjX21ncl9jb21tb24uaCIKKyNpbmNsdWRlICJyc2NfbWdyX2NsaS5oIgorCitzdGF0aWMgYmNtb3NfZXJybm8gcnNjX21ncl9jbGlfY21kX2luaXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgcmV0dXJuIHJzY19tZ3JfaW5pdCgpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcnNjX21ncl9jbGlfY21kX2Jhc2VfYWxsb2NfaWRfc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQgPSAoYmNtYmFsX2ludGZfaWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5LmFjY2Vzc19pbnRfaWQiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBtaW5fZGF0YV9hZ2dfcG9ydF9pZCA9IChiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9hZ2dfcG9ydF9pZCIpLT52YWx1ZS51bnVtYmVyOworCisgICAgcmV0dXJuIHJzY19tZ3JfYWNjZXNzX2ludF9iYXNlX2FsbG9jX2lkX3NldChhY2Nlc3NfaW50X2lkLCBtaW5fZGF0YV9hZ2dfcG9ydF9pZCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyByc2NfbWdyX2NsaV9jbWRfYmFzZV9nZW1fc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQgPSAoYmNtYmFsX2ludGZfaWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5LmFjY2Vzc19pbnRfaWQiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21iYWxfc2VydmljZV9wb3J0X2lkIG1pbl9kYXRhX3N2Y19wb3J0X2lkID0gKGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfc3ZjX3BvcnRfaWQiKS0+dmFsdWUudW51bWJlcjsKKworICAgIHJldHVybiByc2NfbWdyX2FjY2Vzc19pbnRfYmFzZV9nZW1fc2V0KGFjY2Vzc19pbnRfaWQsIG1pbl9kYXRhX3N2Y19wb3J0X2lkKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHJzY19tZ3JfY2xpX2NtZF9hbGxvY19pZF9hbGxvYyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkID0gKGJjbWJhbF9pbnRmX2lkKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleS5hY2Nlc3NfaW50X2lkIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtY2xpX2NtZF9wYXJtICphZ2dfcG9ydF9pZF9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWdnX3BvcnRfaWQiKTsKKyAgICBiY21iYWxfYWdncmVnYXRpb25fcG9ydF9pZCBhZ2dfcG9ydF9pZCA9IDA7CisgICAgdWludDMyX3QgcmFuZ2Vfc2l6ZSA9ICh1aW50MzJfdCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5nZV9zaXplIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgcmVmX2NvdW50OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKGFnZ19wb3J0X2lkX3Bhcm0pCisgICAgICAgIGFnZ19wb3J0X2lkID0gKGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkKWFnZ19wb3J0X2lkX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisKKyAgICByYyA9IHJzY19tZ3JfYWxsb2NfaWRfYWxsb2MoYWNjZXNzX2ludF9pZCwgJmFnZ19wb3J0X2lkLCByYW5nZV9zaXplLCBOVUxMKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcmMgPSByc2NfbWdyX2FsbG9jX2lkX2dldF9yZWZfY291bnQoYWNjZXNzX2ludF9pZCwgYWdnX3BvcnRfaWQsICZyZWZfY291bnQpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiQWxsb2NhdGVkIGFsbG9jIElEPSV1IChyZWZfY291bnQ9JXUpXG4iLCBhZ2dfcG9ydF9pZCwgcmVmX2NvdW50KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcnNjX21ncl9jbGlfY21kX2FsbG9jX2lkX2ZyZWUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtYmFsX2ludGZfaWQgYWNjZXNzX2ludF9pZCA9IChiY21iYWxfaW50Zl9pZCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXkuYWNjZXNzX2ludF9pZCIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkIGFnZ19wb3J0X2lkID0gKGJjbWJhbF9hZ2dyZWdhdGlvbl9wb3J0X2lkKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFnZ19wb3J0X2lkIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgcmVmX2NvdW50OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSByc2NfbWdyX2FsbG9jX2lkX2dldF9yZWZfY291bnQoYWNjZXNzX2ludF9pZCwgYWdnX3BvcnRfaWQsICZyZWZfY291bnQpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICByYyA9IHJzY19tZ3JfYWxsb2NfaWRfZnJlZShhY2Nlc3NfaW50X2lkLCBhZ2dfcG9ydF9pZCwgTlVMTCk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHJldHVybiByYzsKKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJGcmVlZCBhbGxvYyBJRD0ldSAocmVmX2NvdW50PSV1KVxuIiwgYWdnX3BvcnRfaWQsIHJlZl9jb3VudCAtIDEpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyByc2NfbWdyX2NsaV9jbWRfZ2VtX2FsbG9jKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQgPSAoYmNtYmFsX2ludGZfaWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5LmFjY2Vzc19pbnRfaWQiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnN2Y19wb3J0X2lkX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdmNfcG9ydF9pZCIpOworICAgIGJjbWJhbF9zZXJ2aWNlX3BvcnRfaWQgc3ZjX3BvcnRfaWQgPSAwOworICAgIHVpbnQzMl90IHJhbmdlX3NpemUgPSAodWludDMyX3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2Vfc2l6ZSIpLT52YWx1ZS51bnVtYmVyOworICAgIHJzY19tZ3Jfb2JqX3R5cGUgZ2VtX3R5cGUgPSAocnNjX21ncl9vYmpfdHlwZSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fdHlwZSIpLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB1aW50MzJfdCByZWZfY291bnQ7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoc3ZjX3BvcnRfaWRfcGFybSkKKyAgICAgICAgc3ZjX3BvcnRfaWQgPSAoYmNtYmFsX3NlcnZpY2VfcG9ydF9pZClzdmNfcG9ydF9pZF9wYXJtLT52YWx1ZS51bnVtYmVyOworCisgICAgaWYgKFJTQ19NR1JfT0JKX1RZUEVfR0VNX1BPUlRfTVVMVElDQVNUID09IGdlbV90eXBlKQorICAgICAgICByYyA9IHJzY19tZ3JfZ2VtX2FsbG9jX211bHRpY2FzdChhY2Nlc3NfaW50X2lkLCAmc3ZjX3BvcnRfaWQsIHJhbmdlX3NpemUsIE5VTEwpOworICAgIGVsc2UgaWYgKFJTQ19NR1JfT0JKX1RZUEVfR0VNX1BPUlRfQlJPQURDQVNUID09IGdlbV90eXBlKQorICAgICAgICByYyA9IHJzY19tZ3JfZ2VtX2FsbG9jX2Jyb2FkY2FzdChhY2Nlc3NfaW50X2lkLCAmc3ZjX3BvcnRfaWQsIHJhbmdlX3NpemUsIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgcmMgPSByc2NfbWdyX2dlbV9hbGxvY191bmljYXN0KGFjY2Vzc19pbnRfaWQsICZzdmNfcG9ydF9pZCwgcmFuZ2Vfc2l6ZSwgTlVMTCk7CisKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcmMgPSByc2NfbWdyX2dlbV9nZXRfcmVmX2NvdW50KGFjY2Vzc19pbnRfaWQsIHN2Y19wb3J0X2lkLCAmcmVmX2NvdW50KTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkFsbG9jYXRlZCBHRU0gcG9ydD0ldSAocmVmX2NvdW50PSV1KVxuIiwgc3ZjX3BvcnRfaWQsIHJlZl9jb3VudCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHJzY19tZ3JfY2xpX2NtZF9nZW1fZnJlZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkID0gKGJjbWJhbF9pbnRmX2lkKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleS5hY2Nlc3NfaW50X2lkIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtYmFsX3NlcnZpY2VfcG9ydF9pZCBzdmNfcG9ydF9pZCA9IChiY21iYWxfc2VydmljZV9wb3J0X2lkKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN2Y19wb3J0X2lkIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgcmVmX2NvdW50OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSByc2NfbWdyX2dlbV9nZXRfcmVmX2NvdW50KGFjY2Vzc19pbnRfaWQsIHN2Y19wb3J0X2lkLCAmcmVmX2NvdW50KTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcmMgPSByc2NfbWdyX2dlbV9mcmVlKGFjY2Vzc19pbnRfaWQsIHN2Y19wb3J0X2lkLCBOVUxMKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkZyZWVkIEdFTSBwb3J0PSV1IChyZWZfY291bnQ9JXUpXG4iLCBzdmNfcG9ydF9pZCwgcmVmX2NvdW50IC0gMSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKy8qYWxsb2NhdGVzIGEgbmV3IHRtIG5vZGUgYXV0byBpZCAKK25vIGlucHV0cyBwYXJhbWV0ZXJzIGFyZSB1c2VkICovCitzdGF0aWMgYmNtb3NfZXJybm8gcnNjX21ncl9jbGlfY21kX3RtX3NjaGVkX2F1dG9fYWxsb2MoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtYmFsX3RtX3NjaGVkX2lkIHRtX3NjaGVkX2F1dG9faWQgPSAwOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBfcnNjX21ncl90bV9zY2hlZF9hdXRvX2lkX2FsbG9jKCZ0bV9zY2hlZF9hdXRvX2lkKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIHJjOworCisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiQWxsb2NhdGVkIFRNIFNDSEVEIEFVVE8gSUQgJXUgXG4iLCB0bV9zY2hlZF9hdXRvX2lkKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcnNjX21ncl9jbGlfY21kX3RtX3NjaGVkX2F1dG9fZnJlZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21iYWxfdG1fc2NoZWRfaWQgdG1fc2NoZWRfYXV0b19pZCA9IChiY21iYWxfdG1fc2NoZWRfaWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidG1fc2NoZWRfYXV0b19pZCIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQzMl90IHJlZl9jb3VudDsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gX3JzY19tZ3JfdG1fc2NoZWRfYXV0b19pZF9nZXRfcmVmX2NvdW50KHRtX3NjaGVkX2F1dG9faWQsICZyZWZfY291bnQpOworCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHJldHVybiByYzsKKworICAgIHJjID0gX3JzY19tZ3JfdG1fc2NoZWRfYXV0b19pZF9mcmVlKHRtX3NjaGVkX2F1dG9faWQpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRnJlZWQgVE0gTk9ERSBBVVRPIElEICV1IChyZWZfY291bnQ9JXUpXG4iLCB0bV9zY2hlZF9hdXRvX2lkLCByZWZfY291bnQgLSAxKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCByc2NfbWdyX3Nob3dfb2Jqc19saXN0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkLCByc2NfbWdyX29ial9yc2MgKm9ial9yc2MsCisgICAgcnNjX21ncl9vYmpfbGlzdCAqb2JqX2xpc3QpCit7CisgICAgcnNjX21ncl9vYmogKm9ial9pdGVyOworCisgICAgVEFJTFFfRk9SRUFDSChvYmpfaXRlciwgb2JqX2xpc3QsIGxpc3QpCisgICAgeworICAgICAgICBpZiAob2JqX2l0ZXItPnJhbmdlX3NpemUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlx0JXM9JXUgKG9ial90eXBlPSVzLCByZWZfY291bnQ9JXUpXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgb2JqX3JzYy0+b2JqX25hbWUsIG9ial9pdGVyLT5pZCwgUlNDX01HUl9PQkpfVFlQRV9TVFIob2JqX2l0ZXItPnR5cGUpLCBvYmpfaXRlci0+cmVmX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJcdCVzPSV1IC4uICV1IChvYmpfdHlwZT0lcywgcmVmX2NvdW50PSV1KVxuIiwKKyAgICAgICAgICAgICAgICBvYmpfcnNjLT5vYmpfbmFtZSwgb2JqX2l0ZXItPmlkLCBvYmpfaXRlci0+aWQgKyBvYmpfaXRlci0+cmFuZ2Vfc2l6ZSAtIDEsIFJTQ19NR1JfT0JKX1RZUEVfU1RSKG9ial9pdGVyLT50eXBlKSwgb2JqX2l0ZXItPnJlZl9jb3VudCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJzY19tZ3Jfc2hvd19vYmpzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkLCByc2NfbWdyX29ial9yc2MgKm9ial9yc2MpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkJhc2UgZGF0YSAlcz0ldVxuIiwgb2JqX3JzYy0+b2JqX25hbWUsIG9ial9yc2MtPm1pbl9kYXRhX29ial9pZCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkFsbG9jYXRlZCAlc3M6XG4iLCBvYmpfcnNjLT5vYmpfbmFtZSk7CisgICAgcnNjX21ncl9zaG93X29ianNfbGlzdChzZXNzaW9uLCBhY2Nlc3NfaW50X2lkLCBvYmpfcnNjLCAmb2JqX3JzYy0+YWxsb2NhdGVkX29ianMpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJGcmVlICVzczpcbiIsIG9ial9yc2MtPm9ial9uYW1lKTsKKyAgICByc2NfbWdyX3Nob3dfb2Jqc19saXN0KHNlc3Npb24sIGFjY2Vzc19pbnRfaWQsIG9ial9yc2MsICZvYmpfcnNjLT5mcmVlX29ianMpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcnNjX21ncl9zaG93KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21iYWxfaW50Zl9pZCBhY2Nlc3NfaW50X2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHJzY19tZ3JfdG9wb19wb25fY29udGV4dCAqdG9wb19jb250ZXh0OworCisgICAgcmMgPSByc2NfbWdyX2luaXRfdmFsaWRhdGUoKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHJzY19tZ3JfbG9nX2lkLCAiUmVzb3VyY2UgbWFuYWdlciBpcyB1bmluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmICghYmNtX3RvcG9fcG9uX2lzX3ZhbGlkKGFjY2Vzc19pbnRfaWQpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgdG9wb19jb250ZXh0ID0gUlNDX01HUl9QT05fVE9QT19DT05URVhUKGFjY2Vzc19pbnRfaWQpOworICAgIHJzY19tZ3Jfc2hvd19vYmpzKHNlc3Npb24sIGFjY2Vzc19pbnRfaWQsICZ0b3BvX2NvbnRleHQtPmFsbG9jX2lkcyk7CisgICAgcnNjX21ncl9zaG93X29ianMoc2Vzc2lvbiwgYWNjZXNzX2ludF9pZCwgJnRvcG9fY29udGV4dC0+Z2Vtcyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHJzY19tZ3JfY2xpX2NtZF9zaG93KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWJhbF9pbnRmX2lkIGFjY2Vzc19pbnRfaWQgPSAoYmNtYmFsX2ludGZfaWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5LmFjY2Vzc19pbnRfaWQiKS0+dmFsdWUudW51bWJlcjsKKworICAgIHJldHVybiByc2NfbWdyX3Nob3coc2Vzc2lvbiwgYWNjZXNzX2ludF9pZCk7Cit9CisKK3ZvaWQgcnNjX21ncl9jbGlfaW5pdChiY21jbGlfZW50cnkgKmNsaV9kaXIpCit7CisgICAgYmNtY2xpX2VudHJ5ICpkYmdfZGlyOworCisgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCByc2NfbWdyX2NsaV9lbnVtX2dlbV90eXBlX3RhYmxlW10gPQorICAgIHsKKyAgICAgICAgeyAubmFtZSA9ICJ1bmljYXN0IiwgLnZhbCA9IFJTQ19NR1JfT0JKX1RZUEVfR0VNX1BPUlRfVU5JQ0FTVCB9LAorICAgICAgICB7IC5uYW1lID0gIm11bHRpY2FzdCIsIC52YWwgPSBSU0NfTUdSX09CSl9UWVBFX0dFTV9QT1JUX01VTFRJQ0FTVCB9LAorICAgICAgICB7IC5uYW1lID0gImJyb2FkY2FzdCIsIC52YWwgPSBSU0NfTUdSX09CSl9UWVBFX0dFTV9QT1JUX0JST0FEQ0FTVCB9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKworICAgIGRiZ19kaXIgPSBiY21jbGlfZGlyX2FkZChjbGlfZGlyLCAicnNjX21nciIsICJCQUwgcmVzb3VyY2UgbWFuYWdlciBBUEkgYWNjZXNzIiwgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGJnX2RpciwgImluaXQiLCAiSW5pdGlhbGl6ZSByZXNvdXJjZSBtYW5hZ2VyIGZvciBhIHNwZWNpZmljIGFjY2VzcyB0ZXJtaW5hbCIsIHJzY19tZ3JfY2xpX2NtZF9pbml0LAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJrZXkuYWNjZXNzX3Rlcm1faWQiLCAiYWNjZXNzIHRlcm1pbmFsIGlkZW50aWZpZXIiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwLCAwLCBNQVhfU1VQUE9SVEVEX09MVFMpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkYmdfZGlyLCAiYmFzZV9hbGxvY19pZF9zZXQiLCAiU2V0IHRoZSBiYXNlIGFsbG9jIElEIGZvciBhbiBhY2Nlc3MgaW50ZXJmYWNlIiwgcnNjX21ncl9jbGlfY21kX2Jhc2VfYWxsb2NfaWRfc2V0LAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJrZXkuYWNjZXNzX3Rlcm1faWQiLCAiYWNjZXNzIHRlcm1pbmFsIGlkZW50aWZpZXIiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwLCAwLCBNQVhfU1VQUE9SVEVEX09MVFMpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJrZXkuYWNjZXNzX2ludF9pZCIsICJhY2Nlc3MgaW50ZXJmYWNlIGlkZW50aWZpZXIiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWluX2RhdGFfYWdnX3BvcnRfaWQiLCAibWluaW1hbCBkYXRhIGFnZ3JlZ2F0aW9uIHBvcnQgSUQiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGJnX2RpciwgImJhc2VfZ2VtX3NldCIsICJTZXQgdGhlIGJhc2UgR0VNIHBvcnQgZm9yIGFuIGFjY2VzcyBpbnRlcmZhY2UiLCByc2NfbWdyX2NsaV9jbWRfYmFzZV9nZW1fc2V0LAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJrZXkuYWNjZXNzX3Rlcm1faWQiLCAiYWNjZXNzIHRlcm1pbmFsIGlkZW50aWZpZXIiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwLCAwLCBNQVhfU1VQUE9SVEVEX09MVFMpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJrZXkuYWNjZXNzX2ludF9pZCIsICJhY2Nlc3MgaW50ZXJmYWNlIGlkZW50aWZpZXIiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWluX2RhdGFfc3ZjX3BvcnRfaWQiLCAibWluaW1hbCBkYXRhIHNlcnZpY2UgcG9ydCBJRCIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkYmdfZGlyLCAiYWxsb2NfaWRfYWxsb2MiLCAiQWxsb2NhdGUgYW4gYWxsb2MgSUQgcmFuZ2Ugb3IgcmV1c2UgYW4gZXhpc3RpbmcgYWxsb2MgSUQgcmFuZ2UiLCByc2NfbWdyX2NsaV9jbWRfYWxsb2NfaWRfYWxsb2MsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImtleS5hY2Nlc3NfdGVybV9pZCIsICJhY2Nlc3MgdGVybWluYWwgaWRlbnRpZmllciIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDAsIDAsIE1BWF9TVVBQT1JURURfT0xUUyksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImtleS5hY2Nlc3NfaW50X2lkIiwgImFjY2VzcyBpbnRlcmZhY2UgaWRlbnRpZmllciIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhZ2dfcG9ydF9pZCIsICJhZ2dyZWdhdGlvbiBwb3J0IElEIChpZiBvbWl0dGVkIGEgbmV3IGFsbG9jIElEIGlzIGFsbG9jYXRlZCwgb3RoZXJ3aXNlIHdlIHJldXNlIGFuIGV4aXN0aW5nIGFsbG9jIElEKSIsCisgICAgICAgIEJDTUNMSV9QQVJNX1VOVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJyYW5nZV9zaXplIiwgInJhbmdlIHNpemUiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwLCBSU0NfTUdSX01JTl9SQU5HRV9TSVpFLCBSU0NfTUdSX01BWF9SQU5HRV9TSVpFKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGJnX2RpciwgImFsbG9jX2lkX2ZyZWUiLCAiRnJlZSBhbiBhbGxvYyBJRCByYW5nZSIsIHJzY19tZ3JfY2xpX2NtZF9hbGxvY19pZF9mcmVlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJrZXkuYWNjZXNzX3Rlcm1faWQiLCAiYWNjZXNzIHRlcm1pbmFsIGlkZW50aWZpZXIiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwLCAwLCBNQVhfU1VQUE9SVEVEX09MVFMpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJrZXkuYWNjZXNzX2ludF9pZCIsICJhY2Nlc3MgaW50ZXJmYWNlIGlkZW50aWZpZXIiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiYWdnX3BvcnRfaWQiLCAiYmFzZSBvZiBhbGxvYyBJRCByYW5nZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkYmdfZGlyLCAiZ2VtX2FsbG9jIiwgIkFsbG9jYXRlIGEgR0VNIHBvcnQgcmFuZ2Ugb3IgcmV1c2UgYW4gZXhpc3RpbmcgR0VNIHBvcnQgcmFuZ2UiLCByc2NfbWdyX2NsaV9jbWRfZ2VtX2FsbG9jLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJrZXkuYWNjZXNzX3Rlcm1faWQiLCAiYWNjZXNzIHRlcm1pbmFsIGlkZW50aWZpZXIiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwLCAwLCBNQVhfU1VQUE9SVEVEX09MVFMpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJrZXkuYWNjZXNzX2ludF9pZCIsICJhY2Nlc3MgaW50ZXJmYWNlIGlkZW50aWZpZXIiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgic3ZjX3BvcnRfaWQiLCAic2VydmljZSBwb3J0IElEIChpZiBvbWl0dGVkIGEgbmV3IEdFTSBwb3J0IGlzIGFsbG9jYXRlZCwgb3RoZXJ3aXNlIHdlIHJldXNlIGFuIGV4aXN0aW5nIEdFTSBwb3J0KSIsCisgICAgICAgIEJDTUNMSV9QQVJNX1VOVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJyYW5nZV9zaXplIiwgInJhbmdlIHNpemUiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwLCBSU0NfTUdSX01JTl9SQU5HRV9TSVpFLCBSU0NfTUdSX01BWF9SQU5HRV9TSVpFKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJnZW1fdHlwZSIsICJHRU0gdHlwZSIsIHJzY19tZ3JfY2xpX2VudW1fZ2VtX3R5cGVfdGFibGUsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkYmdfZGlyLCAiZ2VtX2ZyZWUiLCAiRnJlZSBhIEdFTSBwb3J0IHJhbmdlIiwgcnNjX21ncl9jbGlfY21kX2dlbV9mcmVlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJrZXkuYWNjZXNzX3Rlcm1faWQiLCAiYWNjZXNzIHRlcm1pbmFsIGlkZW50aWZpZXIiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwLCAwLCBNQVhfU1VQUE9SVEVEX09MVFMpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJrZXkuYWNjZXNzX2ludF9pZCIsICJhY2Nlc3MgaW50ZXJmYWNlIGlkZW50aWZpZXIiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgic3ZjX3BvcnRfaWQiLCAiYmFzZSBvZiBHRU0gcG9ydCByYW5nZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGJnX2RpciwgInRtX3NjaGVkX2F1dG9faWRfYWxsb2MiLCAiQWxsb2NhdGUgYSB0bSBub2RlIGF1dG8gaWQgb3IgcmV1c2UgYW4gZXhpc3RpbmcgaWQiLCByc2NfbWdyX2NsaV9jbWRfdG1fc2NoZWRfYXV0b19hbGxvYyk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGJnX2RpciwgInRtX3NjaGVkX2F1dG9faWRfZnJlZSIsICJGcmVlIGEgdG0gbm9kZSBhdXRvIGlkIiwgcnNjX21ncl9jbGlfY21kX3RtX3NjaGVkX2F1dG9fZnJlZSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgidG1fc2NoZWRfYXV0b19pZCIsICJ0bSBub2RlIGF1dG8gaWQgdG8gYmUgZnJlZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApKTsKKworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRiZ19kaXIsICJzaG93IiwgIlNob3cgdGhlIGRhdGFiYXNlIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyIiwgcnNjX21ncl9jbGlfY21kX3Nob3csCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImtleS5hY2Nlc3NfdGVybV9pZCIsICJhY2Nlc3MgdGVybWluYWwgaWRlbnRpZmllciIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDAsIDAsIE1BWF9TVVBQT1JURURfT0xUUyksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImtleS5hY2Nlc3NfaW50X2lkIiwgImFjY2VzcyBpbnRlcmZhY2UgaWRlbnRpZmllciIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJyc2NtZ3IvcnNjX21ncl9jbGkuaCBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL3JzY19tZ3JfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5MDg1YwotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL3JzY19tZ3JfY2xpLmgKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKyNpZm5kZWYgX1JTQ19NR1JfQ0xJX0hfCisjZGVmaW5lIF9SU0NfTUdSX0NMSV9IXworCisjaW5jbHVkZSA8YmNtY2xpLmg+CisKK3ZvaWQgcnNjX21ncl9jbGlfaW5pdChiY21jbGlfZW50cnkgKmNsaV9kaXIpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJyc2NtZ3IvcnNjX21ncl9jb21tb24uYyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL3JzY19tZ3JfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiY2VlOQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL3JzY19tZ3JfY29tbW9uLmMKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyAqICAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgCisgKiAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICogIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAqICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAqICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorICogIAorICogICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAqICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAqICAgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgKiAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICogICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICogICAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAqICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICogICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyAqICAKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqICAKKyAqICA6PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKyNpbmNsdWRlIDxiY21fdG9wby5oPgorI2luY2x1ZGUgInJzY19tZ3JfY29tbW9uLmgiCisKKyNpZmRlZiBFTkFCTEVfTE9HCitkZXZfbG9nX2lkIHJzY19tZ3JfbG9nX2lkID0gREVWX0xPR19JTlZBTElEX0lEOworI2VuZGlmCisKK2JjbW9zX2Vycm5vIHJzY19tZ3JfaW5pdF92YWxpZGF0ZSh2b2lkKQoreworICAgIGlmICghcnNjX21ncl9jb250ZXh0LmlzX2luaXRpYWxpemVkKQorICAgIHsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgIGlmIChyc2NfbWdyX2xvZ19pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzY19tZ3JfbG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoIlJTQ19NR1IiLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICAgICAgICAgIEJVR19PTihyc2NfbWdyX2xvZ19pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfU1RBVEU7CisgICAgfQorCisgICAgaWYgKCFiY21fdG9wb19pc19pbml0aWFsaXplZCgpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgcnNjX21ncl9sb2dfaWQsICJSZXNvdXJjZSBtYW5hZ2VyIGNhbm5vdCBiZSBjYWxsZWQgYmVmb3JlIHRvcG9sb2d5IGlzIGluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfU1RBVEU7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlicnNjbWdyL3JzY19tZ3JfY29tbW9uLmggYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYnJzY21nci9yc2NfbWdyX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMTkxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYnJzY21nci9yc2NfbWdyX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICogIAorICogICAgIENvcHlyaWdodCAoYykgMjAxNiBCcm9hZGNvbQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAKKyAqICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgKiAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICogIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICogIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisgKiAgCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICogIAorICogIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICogIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICogIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgKiAgd3JpdHRlbiBjb25zZW50LgorICogIAorICogIDo+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorI2lmbmRlZiBfUlNDX01HUl9DT01NT05fSF8KKyNkZWZpbmUgX1JTQ19NR1JfQ09NTU9OX0hfCisgCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiYWxfb2Jqcy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tYXRoLmg+CisKKyNkZWZpbmUgUlNDX01HUl9NSU5fUkFOR0VfU0laRSAxCisjZGVmaW5lIFJTQ19NR1JfTUFYX1JBTkdFX1NJWkUgOAorCisjZGVmaW5lIFJTQ19NR1JfUE9OX1RPUE9fQ09OVEVYVChwb25faWQpICgocnNjX21ncl90b3BvX3Bvbl9jb250ZXh0ICopYmNtX3RvcG9fcG9uX2dldF9jb250ZXh0KHBvbl9pZCwgQkNNX1RPUE9fUE9OX0NPTlRFWFRfSURfUlNDX01HUikpCisKK3R5cGVkZWYgZW51bSByc2NfbWdyX29ial90eXBlCit7CisgICAgUlNDX01HUl9PQkpfVFlQRV9JTlZBTElEID0gMCwKKyAgICBSU0NfTUdSX09CSl9UWVBFX0dFTV9QT1JUX1VOSUNBU1QsCisgICAgUlNDX01HUl9PQkpfVFlQRV9HRU1fUE9SVF9NVUxUSUNBU1QsCisgICAgUlNDX01HUl9PQkpfVFlQRV9HRU1fUE9SVF9CUk9BRENBU1QsCisgICAgUlNDX01HUl9PQkpfVFlQRV9BTExPQ19JRCwKKyAgICBSU0NfTUdSX09CSl9UWVBFX1RNX1NDSEVELAorfSByc2NfbWdyX29ial90eXBlOworCisjZGVmaW5lIFJTQ19NR1JfT0JKX1RZUEVfU1RSKF90eXBlKSBcCisgICAgKChfdHlwZSkgPT0gUlNDX01HUl9PQkpfVFlQRV9HRU1fUE9SVF9VTklDQVNUID8gImdlbV9wb3J0X3VuaWNhc3QiOlwKKyAgICAgICAgKF90eXBlKSA9PSBSU0NfTUdSX09CSl9UWVBFX0dFTV9QT1JUX01VTFRJQ0FTVCA/ICJnZW1fcG9ydF9tdWx0aWNhc3QiOlwKKyAgICAgICAgICAgIChfdHlwZSkgPT0gUlNDX01HUl9PQkpfVFlQRV9HRU1fUE9SVF9CUk9BRENBU1QgPyAiZ2VtX3BvcnRfYnJvYWRjYXN0IjpcCisgICAgICAgICAgICAgICAgKF90eXBlKSA9PSBSU0NfTUdSX09CSl9UWVBFX0FMTE9DX0lEID8gImFsbG9jX2lkIjpcCisgICAgICAgICAgICAgICAgICAgIChfdHlwZSkgPT0gUlNDX01HUl9PQkpfVFlQRV9UTV9TQ0hFRCA/ICJ0bV9zY2hlZCI6ImludmFsaWQiKQorCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfYm9vbCBpc19pbml0aWFsaXplZDsKK30gcnNjX21ncl9jb250ZXh0X3Q7CisKK2V4dGVybiByc2NfbWdyX2NvbnRleHRfdCByc2NfbWdyX2NvbnRleHQ7CisKKy8qKiBAYnJpZWYgY29udGFpbmVyIGZvciBzdG9yaW5nIHVzZXIgZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgcnNjX21ncl91c2VyX2RhdGFfZW50cnkKK3sKKyAgICBUQUlMUV9FTlRSWShyc2NfbWdyX3VzZXJfZGF0YV9lbnRyeSkgbmV4dDsKKyAgICB2b2lkICp1c2VyX2RhdGE7Cit9IHJzY19tZ3JfdXNlcl9kYXRhX2VudHJ5OworCisvKiogQGJyaWVmIGxpbmtlZCBsaXN0IG9mIGZsb3cgZW50cmllcyBzaGFyaW5nIHRoZSBzYW1lIEdFTSBwb3J0IG9yIEFsbG9jIElkICovCit0eXBlZGVmIFRBSUxRX0hFQUQoLCByc2NfbWdyX3VzZXJfZGF0YV9lbnRyeSkgc2hhcmVkX29ial91c2VyX2RhdGFfbGlzdDsKKworLyogQW4gb2JqZWN0IElEIGNhbiBiZSBlaXRoZXIgYWxsb2MgSUQgb3IgR0VNIHBvcnQuICovCit0eXBlZGVmIHVpbnQzMl90IHJzY19tZ3Jfb2JqX2lkOworCisvKiBBbiBlbGVtZW50IGZvciBhbiBvYmplY3QgbGlua2VkIGxpc3QuICovCit0eXBlZGVmIHN0cnVjdCByc2NfbWdyX29iagoreworICAgIFRBSUxRX0VOVFJZKHJzY19tZ3Jfb2JqKSBsaXN0OworICAgIHN0cnVjdCByc2NfbWdyX29iaiAqYmFzZV9vYmo7IC8qIFRoZSBsYXN0IG9iamVjdCBvZiBhIHJhbmdlIHBvaW50cyB0byB0aGUgYmFzZSBvYmplY3Qgb2YgdGhlIHJhbmdlLiAqLworICAgIHJzY19tZ3Jfb2JqX2lkIGlkOworICAgIHVpbnQzMl90IHJlZl9jb3VudDsKKyAgICB1aW50MzJfdCByYW5nZV9zaXplOworICAgIHJzY19tZ3Jfb2JqX3R5cGUgdHlwZTsKKyAgICBzaGFyZWRfb2JqX3VzZXJfZGF0YV9saXN0IHVzZXJfZGF0YV9saXN0OyAvKiB0aGlzIHN0b3JlcyBhIGxpc3Qgb2YgZmxvd3Mgc2hhcmluZyB0aGUgc2FtZSBnZW0gb3IgYWxsb2MgaWQgb2JqZWN0ICovCit9IHJzY19tZ3Jfb2JqOworCit0eXBlZGVmIFRBSUxRX0hFQUQoLCByc2NfbWdyX29iaikgcnNjX21ncl9vYmpfbGlzdDsKKwordHlwZWRlZiBiY21vc19ib29sICgqcnNjX21ncl9pc192YWxpZF9kYXRhX29ial9pZF9jYl90KShiY21vbHRfcG9uX25pIHBvbl9pZCwgcnNjX21ncl9vYmpfaWQgaWQsIHJzY19tZ3Jfb2JqX2lkIG1pbl9kYXRhX29ial9pZCk7Cit0eXBlZGVmIHJzY19tZ3Jfb2JqX2lkICgqcnNjX21ncl9nZXRfbGFzdF9kYXRhX29ial9pZF9jYl90KShiY21vbHRfcG9uX25pIHBvbl9pZCwgcnNjX21ncl9vYmpfaWQgbWluX2RhdGFfb2JqX2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICpvYmpfbmFtZTsKKyAgICByc2NfbWdyX2lzX3ZhbGlkX2RhdGFfb2JqX2lkX2NiX3QgaXNfdmFsaWRfZGF0YV9vYmpfaWRfY2I7CisgICAgcnNjX21ncl9nZXRfbGFzdF9kYXRhX29ial9pZF9jYl90IGdldF9sYXN0X2RhdGFfb2JqX2lkX2NiOworICAgIHJzY19tZ3Jfb2JqX2xpc3QgZnJlZV9vYmpzOworICAgIHJzY19tZ3Jfb2JqX2xpc3QgYWxsb2NhdGVkX29ianM7CisgICAgcnNjX21ncl9vYmogKm9ianM7IC8qIER5bmFtaWNhbGx5IGFsbG9jYXRlZCAqLworICAgIHVpbnQzMl90IG51bV9vZl9vYmpzOworICAgIHJzY19tZ3Jfb2JqX2lkIG1pbl9kYXRhX29ial9pZDsKK30gcnNjX21ncl9vYmpfcnNjOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHJzY19tZ3Jfb2JqX3JzYyBhbGxvY19pZHM7CisgICAgcnNjX21ncl9vYmpfcnNjIGdlbXM7CisgICAgdWludDE2X3QgbnVtX29mX2FsbG9jX2lkczsKKyAgICB1aW50MTZfdCBudW1fb2ZfZ2VtX3BvcnRzOworI2lmbmRlZiBNVUxUSVBMRV9NVUxUSUNBU1RfR0VNX1BPUlRTX1BFUl9QT04KKyAgICB1aW50MTZfdCBtdWx0aWNhc3RfZ2VtX3BvcnQ7IC8qIEZvciB2YWxpZGF0aW9uIHB1cnBvc2VzICh2YWxpZGF0ZSB0aGVyZSBpcyBubyBtb3JlIHRoYW4gYSBzaW5nbGUgbXVsdGljYXN0IEdFTSBwb3J0IHBlciBQT04pLiAqLworI2VuZGlmCisjaWZuZGVmIE1VTFRJUExFX0JST0FEQ0FTVF9HRU1fUE9SVFNfUEVSX1BPTgorICAgIHVpbnQxNl90IGJyb2FkY2FzdF9nZW1fcG9ydDsgLyogRm9yIHZhbGlkYXRpb24gcHVycG9zZXMgKHZhbGlkYXRlIHRoZXJlIGlzIG5vIG1vcmUgdGhhbiBhIHNpbmdsZSBicm9hZGNhc3QgR0VNIHBvcnQgcGVyIFBPTikuICovCisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgZGV2X2xvZ19pZCBsb2dfaWQ7CisgICAgY2hhciBsb2dfaWRfbmFtZVtNQVhfREVWX0xPR19JRF9OQU1FXTsKKyNlbmRpZgorfSByc2NfbWdyX3RvcG9fcG9uX2NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgcnNjX21ncl9vYmpfcnNjIHRtX3NjaGVkX2F1dG9fa2V5X2lkczsKKyAgICB1aW50MTZfdCBudW1fb2ZfdG1fc2NoZWRfYXV0b19rZXlfaWRzOworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKKyAgICBjaGFyIGxvZ19pZF9uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworI2VuZGlmCisKK30gcnNjX21ncl90bV9jb250ZXh0OworI2lmZGVmIEVOQUJMRV9MT0cKK2V4dGVybiBkZXZfbG9nX2lkIHJzY19tZ3JfbG9nX2lkOworI2VuZGlmCisKK2JjbW9zX2Vycm5vIHJzY19tZ3JfaW5pdF92YWxpZGF0ZSh2b2lkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlidG9wb2xvZ3kvTWFrZWZpbGUgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYnRvcG9sb2d5L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDc4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYnRvcG9sb2d5L01ha2VmaWxlCkBAIC0wLDAgKzEsMzYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorIyAgCisjICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyMgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgIAorIyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorIyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorIyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisjICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyMgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisjICAKKyMgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyMgICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorIyAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorIyAgICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorIyAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisjICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisjICAgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworIyAgICAgb2YgdGhlIHNvZnR3YXJlLgorIyAgCisjICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyMgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorIyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyMgIHdyaXR0ZW4gY29uc2VudC4KKyMgIAorIyAgOj4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK01PRF9OQU1FID0gdG9wb2xvZ3kKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGRldl9sb2cgbWFwbGVfc2RrCisKK3NyY3MgPSBiY21fdG9wby5jCisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlidG9wb2xvZ3kvYmNtX3RvcG8uYyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlidG9wb2xvZ3kvYmNtX3RvcG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjA5MmEwCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJ0b3BvbG9neS9iY21fdG9wby5jCkBAIC0wLDAgKzEsNjUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICoKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tYXRoLmg+CisjaW5jbHVkZSAiYmNtX3RvcG8uaCIKKworI2RlZmluZSBCQ01fVE9QT19NQVhfTElORV9TSVpFIDI1NgorI2RlZmluZSBCQ01fVE9QT19NQVhfTk5JX0RFVklDRVMgMQorCit1aW50MzJfdCBnX21heF9ubmlfcG9ydHNbQkNNX1RPUE9fTUFYX05OSV9ERVZJQ0VTXSA9IHtCQ01fVE9QT19NQVhfTk5JX1BPUlRTfTsKKwordHlwZWRlZiBzdHJ1Y3QgYmNtX3RvcG9fZGV2X2NvbnRleHRfdCBiY21fdG9wb19kZXZfY29udGV4dF90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbV90b3BvX2Rldl9jb250ZXh0X3QgKmRldjsgLyogQmFjayBwb2ludGVyIHRvIHRoZSBwaHlzaWNhbCBkZXZpY2UgdGhpcyBQT04gYmVsb25ncyB0byAqLworICAgIGJjbW9zX2Jvb2wgaXNfaW5pdGlhbGl6ZWQ7CisgICAgdWludDMyX3QgcG9uX2lkOworICAgIHVpbnQzMl90IGxvZ2ljYWxfcG9uOworICAgIGJjbV90b3BvX3Bvbl9tb2RlIHBvbl9tb2RlOworICAgIHVpbnQzMl90IG1heF9udW1fb2Zfb251czsKKyAgICB2b2lkICpjb250ZXh0c1tCQ01fVE9QT19QT05fQ09OVEVYVF9JRF9fTlVNX09GXTsgLyogVXNlciBjb250ZXh0IC0gMSBlbnRyeSBwZXIgdXNlciAqLworfSBiY21fdG9wb19wb25fY29udGV4dF90OworCitzdHJ1Y3QgYmNtX3RvcG9fZGV2X2NvbnRleHRfdAoreworICAgIGJjbV90b3BvX3Bvbl9tb2RlIHBvbl9tb2RlOyAvKiBDdXJyZW50bHkgd2UgZG8gbm90IGFsbG93IG1vcmUgdGhhbiBvbmUgUE9OIG1vZGUgcGVyIGRldmljZSAoZS5nOiBHUE9OeDggKyBYR1BPTng0KSAqLworICAgIGJjbW9zX2Jvb2wgaXNfaW5pdGlhbGl6ZWQ7CisgICAgdWludDMyX3QgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IG1heF9udW1fb2ZfcG9uczsKKyAgICBiY21fdG9wb19wb25fY29udGV4dF90IHBvbnNbQkNNX1RPUE9fTUFYX05VTV9PRl9QT05TX1BFUl9ERVZdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19ib29sIGlzX2luaXRpYWxpemVkOworICAgIGJjbV90b3BvX2Rldl9jb250ZXh0X3QgZGV2c1tCQ01fVE9QT19NQVhfTlVNX09GX0RFVlNdOworICAgIGJjbV90b3BvX3Bvbl9jb250ZXh0X3QgKmxvZ2ljYWxfcG9uMnBoeXNpY2FsX3BvbltCQ01fVE9QT19NQVhfTlVNX09GX0xPR0lDQUxfUE9OU107Cit9IGJjbV90b3BvX2NvbnRleHRfdDsKKworc3RhdGljIGJjbV90b3BvX2NvbnRleHRfdCBiY21fdG9wb19jb250ZXh0OworCisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGRldl9sb2dfaWQgdG9wb19sb2dfaWQgPSBERVZfTE9HX0lOVkFMSURfSUQ7CisjZW5kaWYKKworc3RhdGljIGludDJzdHJfdCBwb25fbW9kZTJzdHJbXSA9Cit7CisgICAge0JDTV9UT1BPX1BPTl9NT0RFX0dQT04sICJncG9uIn0sCisgICAge0JDTV9UT1BPX1BPTl9NT0RFX1hHUE9OLCAieGdwb24ifSwKKyAgICB7QkNNX1RPUE9fUE9OX01PREVfWEdTLCAieGdzIn0sCisgICAge0JDTV9UT1BPX1BPTl9NT0RFX0VQT05fVERNQSwgImVwb25fdGRtYSJ9LAorICAgIHtCQ01fVE9QT19QT05fTU9ERV9FUE9OXzFHLCAiZXBvbl8xZyJ9LAorICAgIHtCQ01fVE9QT19QT05fTU9ERV9FUE9OXzEwRywgImVwb25fMTBnIn0sCisgICAgey0xfSwKK307CisKK3N0YXRpYyBpbnQyaW50X3QgcG9uX21vZGUybWF4X251bV9vZl9wb25zW10gPQoreworICAgIHtCQ01fVE9QT19QT05fTU9ERV9HUE9OLCAxNn0sCisgICAge0JDTV9UT1BPX1BPTl9NT0RFX1hHUE9OLCA4fSwKKyAgICB7QkNNX1RPUE9fUE9OX01PREVfWEdTLCAyfSwKKyAgICB7QkNNX1RPUE9fUE9OX01PREVfRVBPTl9URE1BLCA4fSwKKyAgICB7QkNNX1RPUE9fUE9OX01PREVfRVBPTl8xRywgMTZ9LAorICAgIHtCQ01fVE9QT19QT05fTU9ERV9FUE9OXzEwRywgOH0sCisgICAgey0xfSwKK307CisKK2NvbnN0IGNoYXIgKmJjbV90b3BvX2Rldl9nZXRfcG9uX21vZGVfc3RyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgcmV0dXJuIGludDJzdHIocG9uX21vZGUyc3RyLCBiY21fdG9wb19jb250ZXh0LmRldnNbZGV2aWNlX2lkXS5wb25fbW9kZSk7Cit9CisKK2ludCBiY21fdG9wb19kZXZfZ2V0X21heF9wb24oYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICByZXR1cm4gaW50MmludChwb25fbW9kZTJtYXhfbnVtX29mX3BvbnMsIGJjbV90b3BvX2NvbnRleHQuZGV2c1tkZXZpY2VfaWRdLnBvbl9tb2RlKTsKK30KKworYmNtX3RvcG9fcG9uX21vZGUgYmNtX3RvcG9fcG9uX2dldF9wb25fbW9kZSh1aW50MzJfdCBwb24pCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9wb247CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfbG9naWNhbDJwaHlzaWNhbChwb24sICZkZXZpY2VfaWQsICZwaHlzaWNhbF9wb24pOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gQkNNX1RPUE9fUE9OX01PREVfSU5WQUxJRDsKKworICAgIHJldHVybiBiY21fdG9wb19jb250ZXh0LmRldnNbZGV2aWNlX2lkXS5wb25zW3BoeXNpY2FsX3Bvbl0ucG9uX21vZGU7Cit9CisKK2JjbV90b3BvX3Bvbl9mYW1pbHkgYmNtX3RvcG9fcG9uX2dldF9wb25fZmFtaWx5KHVpbnQzMl90IHBvbikKK3sKKyAgICBzd2l0Y2ggKGJjbV90b3BvX3Bvbl9nZXRfcG9uX21vZGUocG9uKSkKKyAgICB7CisgICAgY2FzZSBCQ01fVE9QT19QT05fTU9ERV9HUE9OOgorICAgIGNhc2UgQkNNX1RPUE9fUE9OX01PREVfWEdQT046CisgICAgY2FzZSBCQ01fVE9QT19QT05fTU9ERV9YR1M6CisgICAgICAgIHJldHVybiBCQ01fVE9QT19QT05fRkFNSUxZX0dQT047CisgICAgY2FzZSBCQ01fVE9QT19QT05fTU9ERV9FUE9OX1RETUE6CisgICAgY2FzZSBCQ01fVE9QT19QT05fTU9ERV9FUE9OXzFHOgorICAgIGNhc2UgQkNNX1RPUE9fUE9OX01PREVfRVBPTl8xMEc6CisgICAgICAgIHJldHVybiBCQ01fVE9QT19QT05fRkFNSUxZX0VQT047CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJDTV9UT1BPX1BPTl9GQU1JTFlfSU5WQUxJRDsKKyAgICB9Cit9CisKK2JjbV90b3BvX3Bvbl9zdWJfZmFtaWx5IGJjbV90b3BvX3Bvbl9nZXRfcG9uX3N1Yl9mYW1pbHkodWludDMyX3QgcG9uKQoreworICAgIHN3aXRjaCAoYmNtX3RvcG9fcG9uX2dldF9wb25fbW9kZShwb24pKQorICAgIHsKKyAgICBjYXNlIEJDTV9UT1BPX1BPTl9NT0RFX0dQT046CisgICAgICAgIHJldHVybiBCQ01fVE9QT19QT05fU1VCX0ZBTUlMWV9HUE9OOworICAgIGNhc2UgQkNNX1RPUE9fUE9OX01PREVfWEdQT046CisgICAgY2FzZSBCQ01fVE9QT19QT05fTU9ERV9YR1M6CisgICAgICAgIHJldHVybiBCQ01fVE9QT19QT05fU1VCX0ZBTUlMWV9YR1BPTjsKKyAgICBjYXNlIEJDTV9UT1BPX1BPTl9NT0RFX0VQT05fVERNQToKKyAgICBjYXNlIEJDTV9UT1BPX1BPTl9NT0RFX0VQT05fMUc6CisgICAgY2FzZSBCQ01fVE9QT19QT05fTU9ERV9FUE9OXzEwRzoKKyAgICAgICAgcmV0dXJuIEJDTV9UT1BPX1BPTl9TVUJfRkFNSUxZX0VQT047CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJDTV9UT1BPX1BPTl9TVUJfRkFNSUxZX0lOVkFMSUQ7CisgICAgfQorfQorCit1aW50MzJfdCBiY21fdG9wb19wb25fZ2V0X21heF9udW1fb2Zfb251cyh1aW50MzJfdCBwb24pCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZV9pZDsKKyAgICB1aW50MzJfdCBwaHlzaWNhbF9wb247CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfbG9naWNhbDJwaHlzaWNhbChwb24sICZkZXZpY2VfaWQsICZwaHlzaWNhbF9wb24pOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gQkNNX1RPUE9fRVJSX0lOVkFMSUQ7CisKKyAgICByZXR1cm4gYmNtX3RvcG9fY29udGV4dC5kZXZzW2RldmljZV9pZF0ucG9uc1twaHlzaWNhbF9wb25dLm1heF9udW1fb2Zfb251czsKK30KKworYmNtb3NfYm9vbCBiY21fdG9wb19wb25faXNfdmFsaWQodWludDMyX3QgcG9uKQoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgdWludDMyX3QgcGh5c2ljYWxfcG9uOworCisgICAgaWYgKGJjbV90b3BvX3Bvbl9nZXRfbG9naWNhbDJwaHlzaWNhbChwb24sICZkZXZpY2VfaWQsICZwaHlzaWNhbF9wb24pICE9IEJDTV9FUlJfT0spCisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCitiY21vbHRfZGV2aWQgYmNtX3RvcG9fZGV2X2dldF9uZXh0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgaWYgKGRldmljZV9pZCA9PSBCQ01fVE9QT19ERVZfSU5WQUxJRCkKKyAgICAgICAgZGV2aWNlX2lkID0gMDsKKyAgICBlbHNlCisgICAgICAgIGRldmljZV9pZCsrOworCisgICAgZm9yICg7IGRldmljZV9pZCA8IEJDTV9UT1BPX01BWF9OVU1fT0ZfREVWUyAmJiAhYmNtX3RvcG9fY29udGV4dC5kZXZzW2RldmljZV9pZF0uaXNfaW5pdGlhbGl6ZWQ7IGRldmljZV9pZCsrKTsKKworICAgIHJldHVybiBkZXZpY2VfaWQgPT0gQkNNX1RPUE9fTUFYX05VTV9PRl9ERVZTID8gQkNNX1RPUE9fREVWX0lOVkFMSUQgOiBkZXZpY2VfaWQ7Cit9CisKK3VpbnQzMl90IGJjbV90b3BvX3Bvbl9nZXRfbmV4dChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCB1aW50MzJfdCBwb24pCit7CisgICAgdWludDMyX3QgcGh5c2ljYWxfcG9uOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKGRldmljZV9pZCA+PSBCQ01fVE9QT19NQVhfTlVNX09GX0RFVlMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCB0b3BvX2xvZ19pZCwgIkRldmljZSBJRCBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uICV1XG4iLCBCQ01fVE9QT19NQVhfTlVNX09GX0RFVlMgLSAxKTsKKyAgICAgICAgcmV0dXJuIEJDTV9UT1BPX1BPTl9JTlZBTElEOworICAgIH0KKworICAgIGlmIChwb24gPT0gQkNNX1RPUE9fUE9OX0lOVkFMSUQpCisgICAgICAgIHBoeXNpY2FsX3BvbiA9IDA7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RldmlkIGR1bW15OworCisgICAgICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9sb2dpY2FsMnBoeXNpY2FsKHBvbiwgJmR1bW15LCAmcGh5c2ljYWxfcG9uKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fVE9QT19QT05fSU5WQUxJRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBoeXNpY2FsX3BvbisrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBoeXNpY2FsX3BvbiA8IGJjbV90b3BvX2NvbnRleHQuZGV2c1tkZXZpY2VfaWRdLm1heF9udW1fb2ZfcG9ucykKKyAgICB7CisgICAgICAgIHJjID0gYmNtX3RvcG9fcG9uX2dldF9waHlzaWNhbDJsb2dpY2FsKGRldmljZV9pZCwgcGh5c2ljYWxfcG9uLCAmcG9uKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fVE9QT19QT05fSU5WQUxJRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX1RPUE9fUE9OX0lOVkFMSUQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV90b3BvX3Bvbl9nZXRfbG9naWNhbDJwaHlzaWNhbCh1aW50MzJfdCBsb2dpY2FsX3BvbiwgYmNtb2x0X2RldmlkICpkZXZpY2VfaWQsIHVpbnQzMl90ICpwaHlzaWNhbF9wb24pCit7CisgICAgaWYgKGxvZ2ljYWxfcG9uID49IEJDTV9UT1BPX01BWF9OVU1fT0ZfTE9HSUNBTF9QT05TKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgdG9wb19sb2dfaWQsICJMb2dpY2FsIFBPTiBJRCBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uICV1XG4iLCBCQ01fVE9QT19NQVhfTlVNX09GX0xPR0lDQUxfUE9OUyAtIDEpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbV90b3BvX2NvbnRleHQubG9naWNhbF9wb24ycGh5c2ljYWxfcG9uW2xvZ2ljYWxfcG9uXSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHRvcG9fbG9nX2lkLCAiTG9naWNhbCBQT049JXUgd2FzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwaHlzaWNhbCBQT05cbiIsIGxvZ2ljYWxfcG9uKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgKnBoeXNpY2FsX3BvbiA9IGJjbV90b3BvX2NvbnRleHQubG9naWNhbF9wb24ycGh5c2ljYWxfcG9uW2xvZ2ljYWxfcG9uXS0+cG9uX2lkOworICAgICpkZXZpY2VfaWQgPSBiY21fdG9wb19jb250ZXh0LmxvZ2ljYWxfcG9uMnBoeXNpY2FsX3Bvbltsb2dpY2FsX3Bvbl0tPmRldi0+ZGV2aWNlX2lkOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV90b3BvX3Bvbl9nZXRfcGh5c2ljYWwybG9naWNhbChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCB1aW50MzJfdCBwaHlzaWNhbF9wb24sIHVpbnQzMl90ICpsb2dpY2FsX3BvbikKK3sKKyAgICBpZiAoZGV2aWNlX2lkID49IEJDTV9UT1BPX01BWF9OVU1fT0ZfREVWUykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHRvcG9fbG9nX2lkLCAiRGV2aWNlIElEIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAgLi4gJXVcbiIsIEJDTV9UT1BPX01BWF9OVU1fT0ZfREVWUyAtIDEpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAocGh5c2ljYWxfcG9uID49IGJjbV90b3BvX2NvbnRleHQuZGV2c1tkZXZpY2VfaWRdLm1heF9udW1fb2ZfcG9ucykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHRvcG9fbG9nX2lkLCAiUGh5c2ljYWwgUE9OIElEIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAgLi4gJXVcbiIsIGJjbV90b3BvX2NvbnRleHQuZGV2c1tkZXZpY2VfaWRdLm1heF9udW1fb2ZfcG9ucyAtIDEpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAoYmNtX3RvcG9fY29udGV4dC5kZXZzW2RldmljZV9pZF0ucG9uc1twaHlzaWNhbF9wb25dLmxvZ2ljYWxfcG9uID09IEJDTV9UT1BPX1BPTl9JTlZBTElEKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgdG9wb19sb2dfaWQsICJQaHlzaWNhbCBQT049JXUgb24gZGV2aWNlPSV1IHdhcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgbG9naWNhbCBQT05cbiIsIHBoeXNpY2FsX3BvbiwgZGV2aWNlX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgKmxvZ2ljYWxfcG9uID0gYmNtX3RvcG9fY29udGV4dC5kZXZzW2RldmljZV9pZF0ucG9uc1twaHlzaWNhbF9wb25dLmxvZ2ljYWxfcG9uOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV90b3BvX3Bvbl9zZXRfY29udGV4dCh1aW50MzJfdCBwb24sIGJjbV90b3BvX3Bvbl9jb250ZXh0X2lkIHBvbl9jb250ZXh0X2lkLCB2b2lkICpjb250ZXh0KQoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgdWludDMyX3QgcGh5c2ljYWxfcG9uOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKHBvbl9jb250ZXh0X2lkID49IEJDTV9UT1BPX1BPTl9DT05URVhUX0lEX19OVU1fT0YpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCB0b3BvX2xvZ19pZCwgIkludmFsaWQgUE9OIGNvbnRleHQgSURcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICByYyA9IGJjbV90b3BvX3Bvbl9nZXRfbG9naWNhbDJwaHlzaWNhbChwb24sICZkZXZpY2VfaWQsICZwaHlzaWNhbF9wb24pOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBiY21fdG9wb19jb250ZXh0LmRldnNbZGV2aWNlX2lkXS5wb25zW3BoeXNpY2FsX3Bvbl0uY29udGV4dHNbcG9uX2NvbnRleHRfaWRdID0gY29udGV4dDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCit2b2lkICpiY21fdG9wb19wb25fZ2V0X2NvbnRleHQodWludDMyX3QgcG9uLCBiY21fdG9wb19wb25fY29udGV4dF9pZCBwb25fY29udGV4dF9pZCkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIHVpbnQzMl90IHBoeXNpY2FsX3BvbjsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmIChwb25fY29udGV4dF9pZCA+PSBCQ01fVE9QT19QT05fQ09OVEVYVF9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgdG9wb19sb2dfaWQsICJJbnZhbGlkIFBPTiBjb250ZXh0IElEXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmMgPSBiY21fdG9wb19wb25fZ2V0X2xvZ2ljYWwycGh5c2ljYWwocG9uLCAmZGV2aWNlX2lkLCAmcGh5c2ljYWxfcG9uKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gYmNtX3RvcG9fY29udGV4dC5kZXZzW2RldmljZV9pZF0ucG9uc1twaHlzaWNhbF9wb25dLmNvbnRleHRzW3Bvbl9jb250ZXh0X2lkXTsKK30KKworc3RhdGljIHZvaWQgYmNtX3RvcG9faW5pdF9jb250ZXh0KHZvaWQpCit7CisgICAgdWludDMyX3QgZGV2aWNlX2lkOworCisgICAgZm9yIChkZXZpY2VfaWQgPSAwOyBkZXZpY2VfaWQgPCBCQ01fVE9QT19NQVhfTlVNX09GX0RFVlM7IGRldmljZV9pZCsrKQorICAgIHsKKyAgICAgICAgYmNtX3RvcG9fZGV2X2NvbnRleHRfdCAqZGV2OworICAgICAgICB1aW50MzJfdCBwb25faWQ7CisKKyAgICAgICAgZGV2ID0gJmJjbV90b3BvX2NvbnRleHQuZGV2c1tkZXZpY2VfaWRdOworICAgICAgICBkZXYtPmRldmljZV9pZCA9IGRldmljZV9pZDsKKyAgICAgICAgZGV2LT5wb25fbW9kZSA9IEJDTV9UT1BPX1BPTl9NT0RFX0lOVkFMSUQ7CisgICAgICAgIGZvciAocG9uX2lkID0gMDsgcG9uX2lkIDwgQkNNX1RPUE9fTUFYX05VTV9PRl9QT05TX1BFUl9ERVY7IHBvbl9pZCsrKQorICAgICAgICB7CisgICAgICAgICAgICBiY21fdG9wb19wb25fY29udGV4dF90ICpwb247CisKKyAgICAgICAgICAgIHBvbiA9ICZkZXYtPnBvbnNbcG9uX2lkXTsKKyAgICAgICAgICAgIHBvbi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgcG9uLT5wb25faWQgPSBwb25faWQ7CisgICAgICAgICAgICBwb24tPnBvbl9tb2RlID0gQkNNX1RPUE9fUE9OX01PREVfSU5WQUxJRDsKKyAgICAgICAgICAgIHBvbi0+bG9naWNhbF9wb24gPSBCQ01fVE9QT19QT05fSU5WQUxJRDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV90b3BvX2luaXRfbGluZV9wYXJzZShjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgdWludDMyX3QgbGluZV9udW0sIGJjbW9zX2Jvb2wgKmlzX3NraXBwZWQsIHVpbnQzMl90ICpsb2dpY2FsX3BvbiwgYmNtX3RvcG9fcG9uX21vZGUgKnBvbl9tb2RlLAorICAgIHVpbnQzMl90ICpkZXZpY2VfaWQsIHVpbnQzMl90ICpwaHlzaWNhbF9wb24pCit7CisgICAgaW50IHJjOworICAgIGNoYXIgbG9naWNhbF9wb25fc3RyW0JDTV9UT1BPX01BWF9MSU5FX1NJWkVdOworICAgIGNoYXIgcG9uX21vZGVfc3RyW0JDTV9UT1BPX01BWF9MSU5FX1NJWkVdOworICAgIGNoYXIgZGV2aWNlX2lkX3N0cltCQ01fVE9QT19NQVhfTElORV9TSVpFXTsKKyAgICBjaGFyIHBoeXNpY2FsX3Bvbl9zdHJbQkNNX1RPUE9fTUFYX0xJTkVfU0laRV07CisgICAgaW50MnN0cl90ICpwOworCisgICAgLyogU2tpcCBibGFuayBsaW5lcyBhbmQgY29tbWVudHMuICovCisgICAgaWYgKCEqbGluZSB8fCAqbGluZSA9PSAnXG4nIHx8ICpsaW5lID09ICcjJykKKyAgICB7CisgICAgICAgICppc19za2lwcGVkID0gQkNNT1NfVFJVRTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgKmlzX3NraXBwZWQgPSBCQ01PU19GQUxTRTsKKworICAgIC8qIFJlYWQgdGhlIHRva2VucyBzZXBhcmF0ZWQgYnkgY29tbWFzLiAqLworICAgIHJjID0gc3NjYW5mKGxpbmUsICIlW14sXSwlKlsgXSVbXixdLCVbXixdLCVbXlxuXSIsIGxvZ2ljYWxfcG9uX3N0ciwgcG9uX21vZGVfc3RyLCBkZXZpY2VfaWRfc3RyLCBwaHlzaWNhbF9wb25fc3RyKTsKKyAgICBpZiAocmMgPCA0KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgdG9wb19sb2dfaWQsICJFcnJvciBwYXJzaW5nIGxpbmUgJXM6JXUgKHJjPSV1KVxuIiwgZmlsZW5hbWUsIGxpbmVfbnVtLCByYyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIGlmIChzc2NhbmYobG9naWNhbF9wb25fc3RyLCAiJXUiLCBsb2dpY2FsX3BvbikgPCAxKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgdG9wb19sb2dfaWQsICJFcnJvciBwYXJzaW5nIGxpbmUgJXM6JXUgKHJjPSV1KVxuIiwgZmlsZW5hbWUsIGxpbmVfbnVtLCByYyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIGlmIChzc2NhbmYoZGV2aWNlX2lkX3N0ciwgIiV1IiwgZGV2aWNlX2lkKSA8IDEpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCB0b3BvX2xvZ19pZCwgIkVycm9yIHBhcnNpbmcgbGluZSAlczoldSAocmM9JXUpXG4iLCBmaWxlbmFtZSwgbGluZV9udW0sIHJjKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgaWYgKHNzY2FuZihwaHlzaWNhbF9wb25fc3RyLCAiJXUiLCBwaHlzaWNhbF9wb24pIDwgMSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHRvcG9fbG9nX2lkLCAiRXJyb3IgcGFyc2luZyBsaW5lICVzOiV1IChyYz0ldSlcbiIsIGZpbGVuYW1lLCBsaW5lX251bSwgcmMpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICB9CisKKyAgICBCQ01fTE9HKElORk8sIHRvcG9fbG9nX2lkLCAiTWFwIExvZ2ljYWwgUE9OIElEPSV1IC0+IChQaHlzaWNhbCBEZXZpY2UgSUQ9JXUsIFBoeXNpY2FsIFBvbiBJRD0ldSwgUE9OIG1vZGU9JyVzJylcbiIsICpsb2dpY2FsX3BvbiwgKmRldmljZV9pZCwgKnBoeXNpY2FsX3BvbiwgcG9uX21vZGVfc3RyKTsKKworICAgIGZvciAocCA9IHBvbl9tb2RlMnN0cjsgcC0+ZnJvbSAhPSAtMSAmJiBzdHJjbXAocG9uX21vZGVfc3RyLCBwLT50byk7IHArKyk7CisKKyAgICBpZiAocC0+ZnJvbSA9PSAtMSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHRvcG9fbG9nX2lkLCAiRXJyb3IgcGFyc2luZyBQT04gbW9kZSBhdCAlczoldVxuIiwgZmlsZW5hbWUsIGxpbmVfbnVtKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgKnBvbl9tb2RlID0gcC0+ZnJvbTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBiY21fdG9wb19pbml0X2RldihiY21fdG9wb19kZXZfY29udGV4dF90ICpkZXYsIGJjbV90b3BvX3Bvbl9tb2RlIHBvbl9tb2RlKQoreworICAgIGRldi0+cG9uX21vZGUgPSBwb25fbW9kZTsKKyAgICBkZXYtPm1heF9udW1fb2ZfcG9ucyA9IGludDJpbnQocG9uX21vZGUybWF4X251bV9vZl9wb25zLCBwb25fbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV90b3BvX2luaXRfcG9uKGJjbV90b3BvX3Bvbl9jb250ZXh0X3QgKnBvbiwgYmNtX3RvcG9fcG9uX21vZGUgcG9uX21vZGUpCit7CisgICAgcG9uLT5wb25fbW9kZSA9IHBvbl9tb2RlOworICAgIHN3aXRjaCAocG9uX21vZGUpCisgICAgeworICAgIGNhc2UgQkNNX1RPUE9fUE9OX01PREVfR1BPTjoKKyAgICAgICAgcG9uLT5tYXhfbnVtX29mX29udXMgPSAxMjg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNX1RPUE9fUE9OX01PREVfWEdQT046CisgICAgY2FzZSBCQ01fVE9QT19QT05fTU9ERV9YR1M6CisgICAgICAgIHBvbi0+bWF4X251bV9vZl9vbnVzID0gMjU2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTV9UT1BPX1BPTl9NT0RFX0VQT05fVERNQToKKyAgICBjYXNlIEJDTV9UT1BPX1BPTl9NT0RFX0VQT05fMUc6CisgICAgY2FzZSBCQ01fVE9QT19QT05fTU9ERV9FUE9OXzEwRzoKKyAgICAgICAgcG9uLT5tYXhfbnVtX29mX29udXMgPSAwOyAvKiBUaGVyZSBpcyBubyAiT05VIiBpbiBFUE9OLCBidXQgTExJRHMuICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV90b3BvX2luaXRfYnlfZmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgY2hhciBsaW5lW0JDTV9UT1BPX01BWF9MSU5FX1NJWkVdOworICAgIHVpbnQzMl90IGxpbmVfbnVtOworCisgICAgLyogUmVhZCBuZXh0IGxpbmUuICovCisgICAgbGluZV9udW0gPSAxOworICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgaXNfc2tpcHBlZDsKKyAgICAgICAgdWludDMyX3QgbG9naWNhbF9wb24sIGRldmljZV9pZCwgcGh5c2ljYWxfcG9uOworICAgICAgICBiY21fdG9wb19wb25fbW9kZSBwb25fbW9kZTsKKyAgICAgICAgYmNtX3RvcG9fZGV2X2NvbnRleHRfdCAqZGV2OworICAgICAgICBiY21fdG9wb19wb25fY29udGV4dF90ICpwb247CisKKyAgICAgICAgaWYgKGJjbV90b3BvX2luaXRfbGluZV9wYXJzZShsaW5lLCBmaWxlbmFtZSwgbGluZV9udW0sICZpc19za2lwcGVkLCAmbG9naWNhbF9wb24sICZwb25fbW9kZSwgJmRldmljZV9pZCwgJnBoeXNpY2FsX3BvbikgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworCisgICAgICAgIGlmIChpc19za2lwcGVkKQorICAgICAgICB7CisgICAgICAgICAgICBsaW5lX251bSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9naWNhbF9wb24gPj0gQkNNX1RPUE9fTUFYX05VTV9PRl9MT0dJQ0FMX1BPTlMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIHRvcG9fbG9nX2lkLCAiTG9naWNhbCBQT04gSUQgYXQgJXM6JXUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCAuLiAldVxuIiwgZmlsZW5hbWUsIGxpbmVfbnVtLCBCQ01fVE9QT19NQVhfTlVNX09GX0xPR0lDQUxfUE9OUyAtIDEpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmNtX3RvcG9fY29udGV4dC5sb2dpY2FsX3BvbjJwaHlzaWNhbF9wb25bbG9naWNhbF9wb25dKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCB0b3BvX2xvZ19pZCwgIkxvZ2ljYWwgUE9OIElEIGF0ICVzOiV1IGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJlZm9yZVxuIiwgZmlsZW5hbWUsIGxpbmVfbnVtKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGV2aWNlX2lkID49IEJDTV9UT1BPX01BWF9OVU1fT0ZfREVWUykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgdG9wb19sb2dfaWQsICJQaHlzaWNhbCBkZXZpY2UgSUQgYXQgJXM6JXUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCAuLiAldVxuIiwgZmlsZW5hbWUsIGxpbmVfbnVtLCBCQ01fVE9QT19NQVhfTlVNX09GX0RFVlMgLSAxKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICB9CisKKyAgICAgICAgZGV2ID0gJmJjbV90b3BvX2NvbnRleHQuZGV2c1tkZXZpY2VfaWRdOworICAgICAgICBpZiAoIWRldi0+aXNfaW5pdGlhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbV90b3BvX2luaXRfZGV2KGRldiwgcG9uX21vZGUpOworICAgICAgICAgICAgZGV2LT5pc19pbml0aWFsaXplZCA9IEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGV2LT5wb25fbW9kZSAhPSBwb25fbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgdG9wb19sb2dfaWQsICJQT04gbW9kZSBhdCAlczoldSBjb25mbGljdHMgd2l0aCBQT04gbW9kZT0nJXMnIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBzZXQgZm9yIHRoaXMgZGV2aWNlXG4iLCBmaWxlbmFtZSwgbGluZV9udW0sCisgICAgICAgICAgICAgICAgaW50MnN0cihwb25fbW9kZTJzdHIsIGRldi0+cG9uX21vZGUpKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGh5c2ljYWxfcG9uID49IGRldi0+bWF4X251bV9vZl9wb25zKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCB0b3BvX2xvZ19pZCwgIlBoeXNpY2FsIFBPTiBJRCBhdCAlczoldSBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uICV1XG4iLCBmaWxlbmFtZSwgbGluZV9udW0sIGRldi0+bWF4X251bV9vZl9wb25zIC0gMSk7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgfQorCisgICAgICAgIHBvbiA9ICZiY21fdG9wb19jb250ZXh0LmRldnNbZGV2aWNlX2lkXS5wb25zW3BoeXNpY2FsX3Bvbl07CisgICAgICAgIGlmICghcG9uLT5pc19pbml0aWFsaXplZCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtX3RvcG9faW5pdF9wb24ocG9uLCBwb25fbW9kZSk7CisgICAgICAgICAgICBwb24tPmlzX2luaXRpYWxpemVkID0gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIHRvcG9fbG9nX2lkLCAiUGh5c2ljYWwgUE9OIElEIGF0ICVzOiV1IGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJlZm9yZVxuIiwgZmlsZW5hbWUsIGxpbmVfbnVtKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgICAgIH0KKworICAgICAgICBiY21fdG9wb19jb250ZXh0LmxvZ2ljYWxfcG9uMnBoeXNpY2FsX3Bvbltsb2dpY2FsX3Bvbl0gPSAmYmNtX3RvcG9fY29udGV4dC5kZXZzW2RldmljZV9pZF0ucG9uc1twaHlzaWNhbF9wb25dOworICAgICAgICBiY21fdG9wb19jb250ZXh0LmRldnNbZGV2aWNlX2lkXS5wb25zW3BoeXNpY2FsX3Bvbl0ubG9naWNhbF9wb24gPSBsb2dpY2FsX3BvbjsKKworICAgICAgICBsaW5lX251bSsrOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX3RvcG9faW5pdF9ieV9hcmdzKGJjbV90b3BvX3BhcmFtcyAqcGFyYW1zKQoreworICAgIHVpbnQzMl90IGRldmljZV9pZDsKKyAgICB1aW50MzJfdCBtYXhfbnVtX29mX3BvbnNfcGVyX2RldjsKKworICAgIGlmIChwYXJhbXMtPm51bV9vZl9kZXZzID4gQkNNX1RPUE9fTUFYX05VTV9PRl9ERVZTKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgdG9wb19sb2dfaWQsICJOdW1iZXIgb2YgZGV2aWNlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uICV1XG4iLCBCQ01fVE9QT19NQVhfTlVNX09GX0RFVlMpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBtYXhfbnVtX29mX3BvbnNfcGVyX2RldiA9IGludDJpbnQocG9uX21vZGUybWF4X251bV9vZl9wb25zLCBwYXJhbXMtPnBvbl9tb2RlKTsKKworICAgIGlmIChwYXJhbXMtPm51bV9vZl9wb25zX3Blcl9kZXYgPiBtYXhfbnVtX29mX3BvbnNfcGVyX2RldikKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHRvcG9fbG9nX2lkLCAiTnVtYmVyIG9mIFBPTnMgcGVyIGRldmljZSBmb3IgUE9OIG1vZGUgJyVzJyBtdXN0IGJlIGluIHRoZSByYW5nZSAwIC4uICV1XG4iLCBpbnQyc3RyKHBvbl9tb2RlMnN0ciwgcGFyYW1zLT5wb25fbW9kZSksIEJDTV9UT1BPX01BWF9OVU1fT0ZfREVWUyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIGZvciAoZGV2aWNlX2lkID0gMDsgZGV2aWNlX2lkIDwgcGFyYW1zLT5udW1fb2ZfZGV2czsgZGV2aWNlX2lkKyspCisgICAgeworICAgICAgICB1aW50MzJfdCBwaHlzaWNhbF9wb247CisgICAgICAgIGJjbV90b3BvX2Rldl9jb250ZXh0X3QgKmRldjsKKyAgICAgICAgYmNtX3RvcG9fcG9uX2NvbnRleHRfdCAqcG9uOworCisgICAgICAgIGRldiA9ICZiY21fdG9wb19jb250ZXh0LmRldnNbZGV2aWNlX2lkXTsKKyAgICAgICAgYmNtX3RvcG9faW5pdF9kZXYoZGV2LCBwYXJhbXMtPnBvbl9tb2RlKTsKKyAgICAgICAgZGV2LT5pc19pbml0aWFsaXplZCA9IEJDTU9TX1RSVUU7CisKKyAgICAgICAgZm9yIChwaHlzaWNhbF9wb24gPSAwOyBwaHlzaWNhbF9wb24gPCBwYXJhbXMtPm51bV9vZl9wb25zX3Blcl9kZXY7IHBoeXNpY2FsX3BvbisrKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBsb2dpY2FsX3BvbjsKKworICAgICAgICAgICAgbG9naWNhbF9wb24gPSAoZGV2aWNlX2lkICogcGFyYW1zLT5udW1fb2ZfcG9uc19wZXJfZGV2KSArIHBoeXNpY2FsX3BvbjsKKworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCB0b3BvX2xvZ19pZCwgIk1hcCBMb2dpY2FsIFBPTiBJRD0ldSAtPiAoUGh5c2ljYWwgRGV2aWNlIElEPSV1LCBQaHlzaWNhbCBwb24gSUQ9JXUsIFBPTiBtb2RlPSclcycpXG4iLCBsb2dpY2FsX3BvbiwgZGV2aWNlX2lkLCBwaHlzaWNhbF9wb24sCisgICAgICAgICAgICAgICAgaW50MnN0cihwb25fbW9kZTJzdHIsIHBhcmFtcy0+cG9uX21vZGUpKTsKKworICAgICAgICAgICAgcG9uID0gJmJjbV90b3BvX2NvbnRleHQuZGV2c1tkZXZpY2VfaWRdLnBvbnNbcGh5c2ljYWxfcG9uXTsKKyAgICAgICAgICAgIGJjbV90b3BvX2luaXRfcG9uKHBvbiwgcGFyYW1zLT5wb25fbW9kZSk7CisgICAgICAgICAgICBwb24tPmlzX2luaXRpYWxpemVkID0gQkNNT1NfVFJVRTsKKworICAgICAgICAgICAgYmNtX3RvcG9fY29udGV4dC5sb2dpY2FsX3BvbjJwaHlzaWNhbF9wb25bbG9naWNhbF9wb25dID0gJmJjbV90b3BvX2NvbnRleHQuZGV2c1tkZXZpY2VfaWRdLnBvbnNbcGh5c2ljYWxfcG9uXTsKKyAgICAgICAgICAgIGJjbV90b3BvX2NvbnRleHQuZGV2c1tkZXZpY2VfaWRdLnBvbnNbcGh5c2ljYWxfcG9uXS5sb2dpY2FsX3BvbiA9IGxvZ2ljYWxfcG9uOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV90b3BvX2luaXQoYmNtX3RvcG9fcGFyYW1zICpwYXJhbXMsIGNvbnN0IGNoYXIgKnRvcG9fZmlsZW5hbWUpCit7CisgICAgYmNtb3NfZXJybm8gcmV0OworICAgIEZJTEUgKnRvcG9fZnA7CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgaWYgKHRvcG9fbG9nX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICB7CisgICAgICAgIHRvcG9fbG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoIlRPUE9MT0dZIiwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgICAgIEJVR19PTih0b3BvX2xvZ19pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpOworICAgIH0KKyNlbmRpZgorCisgICAgYmNtX3RvcG9faW5pdF9jb250ZXh0KCk7CisKKyAgICB0b3BvX2ZwID0gZm9wZW4odG9wb19maWxlbmFtZSwgInIiKTsKKyAgICBpZiAodG9wb19mcCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgdG9wb19sb2dfaWQsICJUb3BvbG9neSBpcyB0YWtlbiBmcm9tIGZpbGVcbiIpOworICAgICAgICByZXQgPSBiY21fdG9wb19pbml0X2J5X2ZpbGUodG9wb19mcCwgdG9wb19maWxlbmFtZSk7CisgICAgICAgIGZjbG9zZSh0b3BvX2ZwKTsKKyAgICB9CisgICAgZWxzZSBpZiAocGFyYW1zKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCB0b3BvX2xvZ19pZCwgIlRvcG9sb2d5IGlzIHRha2VuIGZyb20gYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0ID0gYmNtX3RvcG9faW5pdF9ieV9hcmdzKHBhcmFtcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgdG9wb19sb2dfaWQsICJBdCBsZWFzdCBvbmUgb2YgdG9wb19mcCBhbmQgcGFyYW1zIG11c3QgYmUgc3BlY2lmaWVkIGFuZCBleGlzdFxuIik7CisgICAgICAgIHJldCA9IEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBpZiAocmV0ICE9IEJDTV9FUlJfT0spCisgICAgICAgIGdvdG8gZXhpdDsKKworICAgIGJjbV90b3BvX2NvbnRleHQuaXNfaW5pdGlhbGl6ZWQgPSBCQ01PU19UUlVFOworCisgICAgcmV0ID0gQkNNX0VSUl9PSzsKKworZXhpdDoKKyAgICByZXR1cm4gcmV0OworfQorCitiY21vc19ib29sIGJjbV90b3BvX2lzX2luaXRpYWxpemVkKHZvaWQpCit7CisgICAgcmV0dXJuIGJjbV90b3BvX2NvbnRleHQuaXNfaW5pdGlhbGl6ZWQ7Cit9CisKK2JjbW9zX2Jvb2wgYmNtX3RvcG9fZGV2X3NldF9tYXhfbm5pKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIHVpbnQzMl90IG51bV9ubmlfcG9ydHMpCit7CisgICAgaWYoZGV2aWNlX2lkID49IEJDTV9UT1BPX01BWF9OTklfREVWSUNFUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIC8qIG1ha2Ugc3VyZSB0aGUgbWF4IG51bWJlciBkb2VzIG5vdCBleGNlZWQgdGhlIGFsbG9jYXRlZCByZXNyb3VjZSAqLworICAgIGlmKCBudW1fbm5pX3BvcnRzID4gQkNNX1RPUE9fTUFYX05OSV9QT1JUUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfSAKKyAgICBnX21heF9ubmlfcG9ydHNbZGV2aWNlX2lkXSA9IG51bV9ubmlfcG9ydHM7CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworYmNtb3NfYm9vbCBiY21fdG9wb19kZXZfZ2V0X21heF9ubmkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgdWludDMyX3QgKnBfbnVtX25uaV9wb3J0cykKK3sKKyAgICBpZihkZXZpY2VfaWQgPj0gQkNNX1RPUE9fTUFYX05OSV9ERVZJQ0VTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgICpwX251bV9ubmlfcG9ydHMgPSBnX21heF9ubmlfcG9ydHNbZGV2aWNlX2lkXTsKKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCitiY21vc19ib29sIGJjbV90b3BvX25uaV9pc192YWxpZCh1aW50MzJfdCBubmkpCit7CisKKyAgICBpZiAobm5pID49IGdfbWF4X25uaV9wb3J0c1swXSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlidG9wb2xvZ3kvYmNtX3RvcG8uaCBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlidG9wb2xvZ3kvYmNtX3RvcG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzZlYzFjCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJ0b3BvbG9neS9iY21fdG9wby5oCkBAIC0wLDAgKzEsMjcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMTYgQnJvYWRjb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqCisgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICogICAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICogICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAqICAgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgKiAgICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgKiAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICogICAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgKiAgICAgb2YgdGhlIHNvZnR3YXJlLgorICoKKyAqICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAqICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAqICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICogIHdyaXR0ZW4gY29uc2VudC4KKyAqCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0JDTV9UT1BPX0hfCisjZGVmaW5lIF9CQ01fVE9QT19IXworCisjaW5jbHVkZSA8YmNtb2x0X2NvbnYuaD4KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiYWxfbW9kZWxfdHlwZXMuaD4KKworI2RlZmluZSBCQ01fVE9QT19ERVZfSU5WQUxJRCBVSU5UOF9NQVgKKyNkZWZpbmUgQkNNX1RPUE9fUE9OX0lOVkFMSUQgVUlOVDMyX01BWAorI2RlZmluZSBCQ01fVE9QT19FUlJfSU5WQUxJRCBVSU5UMzJfTUFYCisjZGVmaW5lIEJDTV9UT1BPX01BWF9OVU1fT0ZfREVWUyA4IC8qIE1heG1pbXVtIG9mIDggZGV2aWNlcyBwZXIgdk9MVC4gKi8KKyNkZWZpbmUgQkNNX1RPUE9fTUFYX05VTV9PRl9QT05TX1BFUl9ERVYgMTYKKyNkZWZpbmUgQkNNX1RPUE9fTUFYX05VTV9PRl9MT0dJQ0FMX1BPTlMgKEJDTV9UT1BPX01BWF9OVU1fT0ZfREVWUyAqIEJDTV9UT1BPX01BWF9OVU1fT0ZfUE9OU19QRVJfREVWKQorCisjZGVmaW5lIEJDTV9UT1BPX0ZPUl9FQUNIX0RFVihkZXZpY2VfaWQpIFwKKyAgICBmb3IgKGRldmljZV9pZCA9IGJjbV90b3BvX2Rldl9nZXRfbmV4dChCQ01fVE9QT19ERVZfSU5WQUxJRCk7IGRldmljZV9pZCAhPSBCQ01fVE9QT19ERVZfSU5WQUxJRDsgZGV2aWNlX2lkID0gYmNtX3RvcG9fZGV2X2dldF9uZXh0KGRldmljZV9pZCkpCisKKyNkZWZpbmUgQkNNX1RPUE9fREVWX0ZPUl9FQUNIX1BPTihkZXZpY2VfaWQsIHBvbikgXAorICAgIGZvciAocG9uID0gYmNtX3RvcG9fcG9uX2dldF9uZXh0KGRldmljZV9pZCwgQkNNX1RPUE9fUE9OX0lOVkFMSUQpOyBwb24gIT0gQkNNX1RPUE9fUE9OX0lOVkFMSUQ7IHBvbiA9IGJjbV90b3BvX3Bvbl9nZXRfbmV4dChkZXZpY2VfaWQsIHBvbikpCisKKyNkZWZpbmUgQkNNX1RPUE9fRk9SX0VBQ0hfUE9OKGRldmljZV9pZCwgcG9uKSBcCisgICAgZm9yIChkZXZpY2VfaWQgPSBiY21fdG9wb19kZXZfZ2V0X25leHQoQkNNX1RPUE9fREVWX0lOVkFMSUQpOyBkZXZpY2VfaWQgIT0gQkNNX1RPUE9fREVWX0lOVkFMSUQ7IGRldmljZV9pZCA9IGJjbV90b3BvX2Rldl9nZXRfbmV4dChkZXZpY2VfaWQpKSBcCisgICAgICAgIEJDTV9UT1BPX0RFVl9GT1JfRUFDSF9QT04oZGV2aWNlX2lkLCBwb24pCisKKyNkZWZpbmUgQkNNX1RPUE9fRk9SX0VBQ0hfT05VKHBvbiwgb251KSBcCisgICAgZm9yIChvbnUgPSAwOyBvbnUgPCBiY21fdG9wb19wb25fZ2V0X21heF9udW1fb2Zfb251cyhwb24pOyBvbnUrKykKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX1RPUE9fUE9OX01PREVfR1BPTiwKKyAgICBCQ01fVE9QT19QT05fTU9ERV9YR1BPTiwKKyAgICBCQ01fVE9QT19QT05fTU9ERV9YR1MsCisgICAgQkNNX1RPUE9fUE9OX01PREVfRVBPTl9URE1BLAorICAgIEJDTV9UT1BPX1BPTl9NT0RFX0VQT05fMUcsCisgICAgQkNNX1RPUE9fUE9OX01PREVfRVBPTl8xMEcsCisgICAgQkNNX1RPUE9fUE9OX01PREVfSU5WQUxJRCwKKyAgICBCQ01fVE9QT19QT05fTU9ERV9fTlVNX09GLAorfSBiY21fdG9wb19wb25fbW9kZTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX1RPUE9fUE9OX0ZBTUlMWV9HUE9OLCAvKiBHUE9OLCBYR1BPTiwgWEdTLCBOR1BPTjIgKi8KKyAgICBCQ01fVE9QT19QT05fRkFNSUxZX0VQT04sCisgICAgQkNNX1RPUE9fUE9OX0ZBTUlMWV9JTlZBTElELAorICAgIEJDTV9UT1BPX1BPTl9GQU1JTFlfX05VTV9PRiwKK30gYmNtX3RvcG9fcG9uX2ZhbWlseTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX1RPUE9fUE9OX1NVQl9GQU1JTFlfR1BPTiwgLyogR1BPTiBvbmx5ICovCisgICAgQkNNX1RPUE9fUE9OX1NVQl9GQU1JTFlfWEdQT04sIC8qIFhHUE9OLCBYR1MsIE5HUE9OMiAqLworICAgIEJDTV9UT1BPX1BPTl9TVUJfRkFNSUxZX0VQT04sCisgICAgQkNNX1RPUE9fUE9OX1NVQl9GQU1JTFlfSU5WQUxJRCwKKyAgICBCQ01fVE9QT19QT05fU1VCX0ZBTUlMWV9fTlVNX09GLAorfSBiY21fdG9wb19wb25fc3ViX2ZhbWlseTsKKworLyogVXNlciBjb250ZXh0IGlkZW50aWZpZXIgLSBjYW4gYmUgZXh0ZW5kZWQgaWYgbW9yZSBtb2R1bGVzIGluIHRoZSBzeXN0ZW0gdXNlIHRoZSBiY21fdG9wby5jb250ZXh0LiAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX1RPUE9fUE9OX0NPTlRFWFRfSURfTUFDX1VUSUwsCisgICAgQkNNX1RPUE9fUE9OX0NPTlRFWFRfSURfT01DSV9TVkMsCisgICAgQkNNX1RPUE9fUE9OX0NPTlRFWFRfSURfUlNDX01HUiwKKyAgICBCQ01fVE9QT19QT05fQ09OVEVYVF9JRF9fTlVNX09GLAorfSBiY21fdG9wb19wb25fY29udGV4dF9pZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCBudW1fb2ZfZGV2czsKKyAgICB1aW50MzJfdCBudW1fb2ZfcG9uc19wZXJfZGV2OworICAgIGJjbV90b3BvX3Bvbl9tb2RlIHBvbl9tb2RlOworfSBiY21fdG9wb19wYXJhbXM7CisKKy8qKgorICogQGJyaWVmIEdldCB0aGUgUE9OIG1vZGUgb2YgYSBnaXZlbiBkZXZpY2UgSUQuCisgKiBAcGFyYW0gZGV2aWNlX2lkICAgICAgICAgICAgZGV2aWNlIElECisgKgorICogQHJldHVybnMgUE9OIG1vZGUgb3IgTnVsbCBvbiBlcnJvcgorICovCitjb25zdCBjaGFyICpiY21fdG9wb19kZXZfZ2V0X3Bvbl9tb2RlX3N0cihiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKKworCisvKioKKyAqIEBicmllZiBHZXQgdGhlIG1heCBudW1iZXIgb2YgcG9ucyBvZiBhIGdpdmVuIGRldmljZSBJRC4KKyAqIEBwYXJhbSBkZXZpY2VfaWQgICAgICAgICAgICBkZXZpY2UgSUQKKyAqCisgKiBAcmV0dXJucyB0aGUgbWF4IG51bWJlciBvZiBwb25zIG9yIC0xIG9uIGVycm9yCisgKi8KK2ludCBiY21fdG9wb19kZXZfZ2V0X21heF9wb24oYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CisKKy8qKgorICogQGJyaWVmIEdldCB0aGUgUE9OIG1vZGUgb2YgYSBnaXZlbiBsb2dpY2FsIFBPTiBJRC4KKyAqIEBwYXJhbSBwb24gICAgICAgICAgICAgICAgIExvZ2ljYWwgUE9OIElECisgKgorICogQHJldHVybnMgUE9OIG1vZGUgb3IgQkNNX1RPUE9fUE9OX01PREVfSU5WQUxJRCBvbiBlcnJvcgorICovCitiY21fdG9wb19wb25fbW9kZSBiY21fdG9wb19wb25fZ2V0X3Bvbl9tb2RlKHVpbnQzMl90IHBvbik7CisKKy8qKgorICogQGJyaWVmIEdldCB0aGUgUE9OIGZhbWlseSBvZiBhIGdpdmVuIGxvZ2ljYWwgUE9OIElELgorICogQHBhcmFtIHBvbiAgICAgICAgICAgICAgICAgTG9naWNhbCBQT04gSUQKKyAqCisgKiBAcmV0dXJucyBQT04gbW9kZSBvciBCQ01fVE9QT19QT05fRkFNSUxZX0lOVkFMSUQgb24gZXJyb3IKKyAqLworYmNtX3RvcG9fcG9uX2ZhbWlseSBiY21fdG9wb19wb25fZ2V0X3Bvbl9mYW1pbHkodWludDMyX3QgcG9uKTsKKworLyoqCisgKiBAYnJpZWYgR2V0IHRoZSBQT04gc3ViLWZhbWlseSBvZiBhIGdpdmVuIGxvZ2ljYWwgUE9OIElELgorICogQHBhcmFtIHBvbiAgICAgICAgICAgICAgICAgTG9naWNhbCBQT04gSUQKKyAqCisgKiBAcmV0dXJucyBQT04gbW9kZSBvciBCQ01fVE9QT19QT05fU1VCX0ZBTUlMWV9JTlZBTElEIG9uIGVycm9yCisgKi8KK2JjbV90b3BvX3Bvbl9zdWJfZmFtaWx5IGJjbV90b3BvX3Bvbl9nZXRfcG9uX3N1Yl9mYW1pbHkodWludDMyX3QgcG9uKTsKKworLyoqCisgKiBAYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgT05VcyBvZiBhIGdpdmVuIGxvZ2ljYWwgUE9OIElELgorICogQHBhcmFtIHBvbiAgICAgICAgICAgICAgICAgTG9naWNhbCBQT04gSUQKKyAqCisgKiBAcmV0dXJucyBOdW1iZXIgb2YgT05VcyBvciBCQ01fVE9QT19FUlJfSU5WQUxJRCBvbiBlcnJvcgorICovCit1aW50MzJfdCBiY21fdG9wb19wb25fZ2V0X21heF9udW1fb2Zfb251cyh1aW50MzJfdCBwb24pOworCisvKioKKyAqIEBicmllZiBSZXR1cm4gd2hldGhlciBhIGdpdmVuIGxvZ2ljYWwgUE9OIGlzIGluIHRoZSB2YWxpZCByYW5nZS4KKyAqCisgKiBAcmV0dXJucyBCQ01PU19UUlVFIGlzIHRoZSBnaXZlbiBsb2dpY2FsIFBPTiBpcyBpbiB0aGUgdmFsaWQgcmFuZ2UsIEJDTU9TX0ZBTFNFIG90aGVyd2lzZQorICovCitiY21vc19ib29sIGJjbV90b3BvX3Bvbl9pc192YWxpZCh1aW50MzJfdCBwb24pOworCisvKioKKyAqIEBicmllZiBUcmF2ZXJzZSBkZXZpY2VzCisgKiBAcGFyYW0gZGV2aWNlX2lkICAgICAgICAgRGV2aWNlIGl0ZXJhdG9yLiBTaG91bGQgYmUgQkNNX1RPUE9fREVWX0lOVkFMSUQgYXQgdGhlIGJlZ2lubmluZy4KKyAqCisgKiBAcmV0dXJucyBOZXh0IGRldmljZSwgb3IgQkNNX1RPUE9fREVWX0lOVkFMSUQgdG8gbWFyayB0aGF0IG5vIG1vcmUgZGV2aWNlcyBhcmUgYXZhaWxhYmxlLgorICovCitiY21vbHRfZGV2aWQgYmNtX3RvcG9fZGV2X2dldF9uZXh0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpOworCisvKioKKyAqIEBicmllZiBUcmF2ZXJzZSBsb2dpY2FsIFBPTnMgd2l0aGluIGEgZ2l2ZW4gZGV2aWNlLgorICogQHBhcmFtIGRldmljZV9pZCAgICAgICAgIERldmljZSBpZAorICogQHBhcmFtIHBvbiAgICAgICAgICAgICAgIExvZ2ljYWwgUE9OIGl0ZXJhdG9yLiBTaG91bGQgYmUgQkNNX1RPUE9fUE9OX0lOVkFMSUQgYXQgdGhlIGJlZ2lubmluZy4KKyAqCisgKiBAcmV0dXJucyBOZXh0IGxvZ2ljYWwgUE9OIG9uIHRoaXMgZGV2aWNlLCBvciBCQ01fVE9QT19QT05fSU5WQUxJRCB0byBtYXJrIHRoYXQgbm8gbW9yZSBQT05zIGFyZSBhdmFpbGFibGUuCisgKi8KK3VpbnQzMl90IGJjbV90b3BvX3Bvbl9nZXRfbmV4dChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCB1aW50MzJfdCBwb24pOworCisvKioKKyAqIEBicmllZiBHZXQgZGV2aWNlIElEIGFuZCBwaHlzaWNhbCBQT04gSUQgZnJvbSBsb2dpY2FsIFBPTiBJRC4KKyAqIEBwYXJhbSBsb2dpY2FsX3BvbiAgICAgICAgICAgIGxvZ2ljYWwgUE9OIElECisgKiBAcGFyYW0gKmRldmljZV9pZCAgICAgICAgIFBvaW50ZXIgdG8gZGV2aWNlIGlkCisgKiBAcGFyYW0gKnBoeXNpY2FsX3BvbiAgICAgICAgICAgUG9pbnRlciB0byBwaHlzaWNhbCBQT04gSUQKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICogQG5vdGUgSW4gZ2VuZXJhbCwgdGhlIHBoeXNpY2FsIFBPTiBJRCBpcyB1c2VkIGluIHRoZSBoYXJkd2FyZSBkaXJlY3RlZCBmdW5jdGlvbiBjYWxscy4KKyAqLworYmNtb3NfZXJybm8gYmNtX3RvcG9fcG9uX2dldF9sb2dpY2FsMnBoeXNpY2FsKHVpbnQzMl90IGxvZ2ljYWxfcG9uLCBiY21vbHRfZGV2aWQgKmRldmljZV9pZCwgdWludDMyX3QgKnBoeXNpY2FsX3Bvbik7CisKKy8qKgorICogQGJyaWVmIEdldCBsb2dpY2FsIFBPTiBJRCBmcm9tIGRldmljZSBJRCBhbmQgcGh5c2ljYWwgUE9OIElELgorICogQHBhcmFtIGRldmljZV9pZCAgICAgICAgICAgRGV2aWNlIGlkCisgKiBAcGFyYW0gcGh5c2ljYWxfcG9uICAgICAgICAgICAgIFBoeXNpY2FsIFBPTiBJRAorICogQHBhcmFtICpsb2dpY2FsX3BvbiAgICAgICAgICAgIFBvaW50ZXIgdG8gbG9naWNhbCBQT04gSUQKKyAqCisgKiBAcmV0dXJucyBiY21vc19lcnJubworICogQG5vdGUgSW4gZ2VuZXJhbCwgdGhlIGxvZ2ljYWwgUE9OIElEIGlzIHVzZWQgaW4gdGhlIEJBTCBjb3JlIGRpcmVjdGVkIGZ1bmN0aW9uIGNhbGxzLgorICovCitiY21vc19lcnJubyBiY21fdG9wb19wb25fZ2V0X3BoeXNpY2FsMmxvZ2ljYWwoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgdWludDMyX3QgcGh5c2ljYWxfcG9uLCB1aW50MzJfdCAqbG9naWNhbF9wb24pOworCisvKioKKyAqIEBicmllZiBTZXQgdXNlciBjb250ZXh0IGZvciBhIGdpdmVuIGxvZ2ljYWwgUE9OIElELgorICogQHBhcmFtIHBvbiAgICAgICAgICAgICAgICAgTG9naWNhbCBQT04gSUQKKyAqIEBwYXJhbSBwb25fY29udGV4dF9pZCAgICAgIFRoZSBpZGVudGl0eSBvZiB0aGUgbW9kdWxlIHVzaW5nIHRoZSBjb250ZXh0CisgKiBAcGFyYW0gY29udGV4dCAgICAgICAgICAgICBQb2ludGVyIHRvIHVzZXIgY29udGV4dAorICoKKyAqIEByZXR1cm5zIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIGJjbV90b3BvX3Bvbl9zZXRfY29udGV4dCh1aW50MzJfdCBwb24sIGJjbV90b3BvX3Bvbl9jb250ZXh0X2lkIHBvbl9jb250ZXh0X2lkLCB2b2lkICpjb250ZXh0KTsKKworLyoqCisgKiBAYnJpZWYgR2V0IHVzZXIgY29udGV4dCBmb3IgYSBnaXZlbiBsb2dpY2FsIFBPTiBJRC4KKyAqIEBwYXJhbSBwb24gICAgICAgICAgICAgICAgIExvZ2ljYWwgUE9OIElECisgKiBAcGFyYW0gcG9uX2NvbnRleHRfaWQgICAgICBUaGUgaWRlbnRpdHkgb2YgdGhlIG1vZHVsZSB1c2luZyB0aGUgY29udGV4dAorICoKKyAqIEByZXR1cm5zIFVzZXIgY29udGV4dCBvciBOVUxMIGlmIHRoZXJlJ3MgYW4gZXJyb3IKKyAqLwordm9pZCAqYmNtX3RvcG9fcG9uX2dldF9jb250ZXh0KHVpbnQzMl90IHBvbiwgYmNtX3RvcG9fcG9uX2NvbnRleHRfaWQgcG9uX2NvbnRleHRfaWQpOworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplIHRvcG9sb2d5IG1vZHVsZSwgZWl0aGVyIGJ5IGFyZ3VtZW50cyAocHJvYmFibHkgcmVjZWl2ZWQgZnJvbSBDTEkpIG9yIGJ5IGEgdG9wb2xvZ3kgZmlsZS4gVGhlIHJ1bGUgaXMgYXQgbGVhc3Qgb25lIG9mIHRoZW0gbXVzdCBiZSBzcGVjaWZpZWQgYW5kIGV4aXN0LiBJZiBib3RoIGFyZQorICogICAgICAgIHNwZWNpZmllZCBhbmQgZXhpc3QsIHRoZW4gd2UgcmVseSBvbiB0b3BvbG9neSBmaWxlLgorICogICAgICAgIFBheSBhdHRlbnRpb24gdGhhdCB3aGVuIG5vdCB1c2luZyBhIGZpbGUsIHRoZSB1c2VyIGhhdmUgbGVzcyBmcmVlZG9tLiBGb3IgZXhhbXBsZToKKyAqICAgICAgICAtIFRoZSB1c2VyIHdvbid0IGJlIGFibGUgdG8gaGF2ZSBkZXZpY2VzIHdpdGggZGlmZmVyZW50IFBPTiBtb2Rlcy4KKyAqICAgICAgICAtIFRoZSB1c2VyIHdvbid0IGJlIGFibGUgdG8gaGF2ZSBkZXZpY2VzIHdpdGggZGlmZmVyZW50IG51bWJlciBvZiBQT05zLgorICogICAgICAgIC0gVGhlIHVzZXIgd29uJ3QgYmUgYWJsZSB0byBtYXAgbG9naWNhbCBQT04gdG8gKGRldmljZSwgcGh5c2ljYWwgUE9OKS4gV2UgYXNzdW1lIHRoYXQgbG9naWNhbF9wb24gPSAoZGV2aWNlICogbnVtX29mX3BvbnNfcGVyX2RldikgKyBwaHlzaWNhbF9wb24uCisgKiBAcGFyYW0gcGFyYW1zICAgICAgICAgICAgICBUb3BvbG9neSBwYXJhbWV0ZXJzLiBJZiBOVUxMLCB3ZSByZWx5IG9uIHRvcG9sb2d5IGZpbGUuCisgKiBAcGFyYW0gdG9wb19maWxlbmFtZSAgICAgICBGaWxlIGNvbnRhaW5pbmcgYmNtX3RvcG8uY29uZmlndXJhdGlvbiBpbiBhIC5jc3YgZm9ybWF0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY29sdW1ucyBhcmU6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dpY2FsIFBPTiBJRCwgUE9OIE1vZGUsIFBoeXNpY2FsIERldmljZSBJRCwgUGh5c2ljYWwgUE9OIElECisgKgorICogQHJldHVybnMgYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gYmNtX3RvcG9faW5pdChiY21fdG9wb19wYXJhbXMgKnBhcmFtcywgY29uc3QgY2hhciAqdG9wb19maWxlbmFtZSk7CisKKy8qKgorICogQGJyaWVmIFJldHVybnMgd2hldGhlciB0aGUgdG9wb2xvZ3kgbW9kdWxlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICoKKyAqIEByZXR1cm5zIEJDTU9TX1RSVUUgaWYgdG9wb2xvZ3kgbW9kdWxlIGhhcyBiZWVuIGluaXRpYWxpemVkCisgKi8KK2JjbW9zX2Jvb2wgYmNtX3RvcG9faXNfaW5pdGlhbGl6ZWQodm9pZCk7CisKKyNkZWZpbmUgQkNNX1RPUE9fTUFYX05OSV9QT1JUUyAxNgorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIG1heCBudW1iZXIgb2Ygbm5pcyBvZiBhIGdpdmVuIGRldmljZSBJRC4KKyAqIEBwYXJhbSBkZXZpY2VfaWQgICAgICAgICAgICBkZXZpY2UgSUQKKyAqIEBwYXJhbSBudW1fbm5pX3BvcnRzICAgICAgICBubmkgcG9ydHMgb24gdGhlIGRldmljZQorICoKKyAqIEByZXR1cm5zIEJDTU9TX1RSVUUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtX3RvcG9fZGV2X3NldF9tYXhfbm5pKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIHVpbnQzMl90IG51bV9ubmlfcG9ydHMpOworCisvKioKKyAqIEBicmllZiBHZXQgdGhlIG1heCBudW1iZXIgb2Ygbm5pcyBvZiBhIGdpdmVuIGRldmljZSBJRC4KKyAqIEBwYXJhbSBkZXZpY2VfaWQgICAgICAgICAgICBkZXZpY2UgSUQKKyAqIEBwYXJhbSBwX251bV9ubmlfcG9ydHMgICAgICBwb2ludGVyIGZvciB0aGUgcmV0cmlldmVkIG5uaSBwb3J0cyBvbiB0aGUgZGV2aWNlCisgKgorICogQHJldHVybnMgQkNNT1NfVFJVRSAKKyAqLworYmNtb3NfYm9vbCBiY21fdG9wb19kZXZfZ2V0X21heF9ubmkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgdWludDMyX3QgKnBfbnVtX25uaV9wb3J0cyk7CisKKy8qKgorICogQGJyaWVmIFJldHVybiB3aGV0aGVyIGEgZ2l2ZW4gbG9naWNhbCBOTkkgaXMgaW4gdGhlIHZhbGlkIHJhbmdlLgorICoKKyAqIEByZXR1cm5zIEJDTU9TX1RSVUUgaXMgdGhlIGdpdmVuIGxvZ2ljYWwgTk5JIGlzIGluIHRoZSB2YWxpZCByYW5nZSwgQkNNT1NfRkFMU0Ugb3RoZXJ3aXNlCisgKi8KK2JjbW9zX2Jvb2wgYmNtX3RvcG9fbm5pX2lzX3ZhbGlkKHVpbnQzMl90IG5uaSk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYnV0aWxzL01ha2VmaWxlIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJ1dGlscy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjRkZDUwCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJ1dGlscy9NYWtlZmlsZQpAQCAtMCwwICsxLDM1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKyMgIAorIyAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisjICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisjICAKKyMgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyMgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyMgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorIyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisjICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorIyAgCisjICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisjICAgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyMgICAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyMgICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyMgICAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorIyAgICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworIyAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyMgICAgIG9mIHRoZSBzb2Z0d2FyZS4KKyMgIAorIyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisjICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyMgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisjICB3cml0dGVuIGNvbnNlbnQuCisjICAKKyMgIDo+CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitNT0RfTkFNRSA9IGJhbHV0aWxzCitNT0RfVFlQRSA9IGxpYgorCitzcmNzID0gYmFsX3V0aWxzLmMKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2Uvc3JjL2xpYi9saWJ1dGlscy9iYWxfdXRpbHMuYyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlidXRpbHMvYmFsX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0YjNkOQotLS0gL2Rldi9udWxsCisrKyBiL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlidXRpbHMvYmFsX3V0aWxzLmMKQEAgLTAsMCArMSw1NDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIGJhbF91dGlscy5jCisgKiBAYnJpZWYgQkFMIFV0aWxpdGllcyBzb3VyY2UKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHZhcmlvdXMgQkFMICJ1dGlsaXRpZXMiLAorICogd2hpY2ggYXJlIHByb3ZpZGVkIHZpYSB0aGUgbGlidXRpbHMuYSBsaWJyYXJ5LgorICovIAorCisvKkB7Ki8KKworI2lmZGVmIFVTSU5HX0JBTF9VVElMUworCisvKiAtLS0gc3lzdGVtIGluY2x1ZGVzIC0tLSovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisKKy8qIC0tLSBwcm9qZWN0IGluY2x1ZGVzIC0tLSovCisjaW5jbHVkZSAiYmFsX3V0aWxzLmgiCisKKworLyoKKyAqIEdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucworICovCitjaGFyICptYWNfYWRkcl90b19zdHIoY2hhciAqYnVmZmVyLCBiY21vc19tYWNfYWRkcmVzcyBtYWMpCit7CisgICAgY2hhciAqZm10X3N0ciA9IE5VTEw7CisKKyAgICBmbXRfc3RyID0gIiUwMmhoeDolMDJoaHg6JTAyaGh4OiUwMmhoeDolMDJoaHg6JTAyaGh4IjsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgMjAsIGZtdF9zdHIsCisgICAgICAgICAgICAgbWFjLnU4WzBdLCBtYWMudThbMV0sCisgICAgICAgICAgICAgbWFjLnU4WzJdLCBtYWMudThbM10sCisgICAgICAgICAgICAgbWFjLnU4WzRdLCBtYWMudThbNV0pOworICAgICAgICAKKyAgICByZXR1cm4gYnVmZmVyOworfQorCisKK2JjbW9zX2Jvb2wgbWFjX2FkZF9pc19udWxsKGJjbW9zX21hY19hZGRyZXNzIG1hYykKK3sKKyAgICByZXR1cm4gKCgwICE9IG1hYy51OFswXSkgfHwgKDAgIT0gbWFjLnU4WzFdKSB8fCAoMCAhPSBtYWMudThbMl0pIHx8CisgICAgICAgICAgICAoMCAhPSBtYWMudThbM10pIHx8ICgwICE9IG1hYy51OFs0XSkgfHwgKDAgIT0gbWFjLnU4WzVdKSkgPyBCQ01PU19GQUxTRSA6IEJDTU9TX1RSVUU7Cit9CisKKy8qKgorICogQGJyaWVmIERldGVybWluZXMgaWYgc3RyaW5nIGNvbnRhaW5zIGEgdmFsaWQgSVB2NCBvciBJUHY2IGFkZHJlc3MKKyAqCisgKgorICogQHBhcmFtIGlwQWRkclN0ciBQb2ludGVyIHRvIHN0cmluZyB0byBwYXJzZQorICoKKyAqIEByZXR1cm4gYmNtb3NfYm9vbAorICogQHJldHZhbCBUUlVFIFN0cmluZyBjb250YWlucyBhIHZhbGlkIElQIGFkZHJlc3MKKyAqIEByZXR2YWwgRkFMU0UgU3RyaW5nIGRvZXMgbm90CisgKi8KK2JjbW9zX2Jvb2wgQmFsSXNWYWxpZElwKGNvbnN0IGNoYXIgKmlwQWRkclN0cikKK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjQ7CisJc3RydWN0IGluNl9hZGRyIGFkZHI2OworCWJjbW9zX2Jvb2wgcmV0ID0gQkNNT1NfRkFMU0U7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19VTkxFU1MoTlVMTCAhPSBpcEFkZHJTdHIsIEJDTU9TX0ZBTFNFKTsKKworCS8qIEZpcnN0IGxvb2sgdG8gc2VlIGlmIGl0J3MgYSB2YWxpZCBJUHY0IGFkZHJlc3MsIHRoZW4gbG9vayB0byBzZWUgaWYgaXQncworICAgICAgIGEgdmFsaWQgSVB2NiBhZGRyZXNzKi8KKwlpZiAoaW5ldF9wdG9uKEFGX0lORVQsIGlwQWRkclN0ciwgJmFkZHI0KSA+IDAgfHwgaW5ldF9wdG9uKEFGX0lORVQ2LCBpcEFkZHJTdHIsICZhZGRyNikgPiAwKQorCXsKKwkgICAgcmV0ID0gVFJVRTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogQGJyaWVmIENvbnZlcnQgYSBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCB0eXBlIG9mIGludGVnZXIKKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIHN0cnRvbGwoKSBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gYW4KKyAqIGludGVnZXIgdmFsdWUuIFU2NCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDB4N2ZmZmZmZmZmZmZmZmZmZiBjYW5ub3QgYmUgY29udmVydGVkCisgKiBieSB0aGUgc3RydG9sbCgpIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIHN0cmluZyB2YWx1ZSBpcyBjb25zaWRlcmVkIG91dCBvZiB0aGUKKyAqIHZhbGlkIC0weDgwMDAwMDAwMDAwMDAwMDAgdG8gMHg3ZmZmZmZmZmZmZmZmZmZmIDY0LWJpdCBpbnRlZ2VyIHJhbmdlLgorICoKKyAqIEBwYXJhbSBzdHIgICAgU3RyaW5nIHRvIGNvbnZlcnQKKyAqIEBwYXJhbSBwVmFsICAgUG9pbnRlciB0byB0aGUgcmV0dXJuIHZhbHVlCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitzdGF0aWMgYmNtb3NfZXJybm8gQmFsU3RyaW5nVG9JbnQoY2hhciAqc3RyLCBCYWxJbnRTdHJpbmdUICpwVmFsKQoreworICAgIGJjbW9zX2Vycm5vICByYyAgPSBCQUxfT0s7CisgICAgVTY0ICAgICAgICB1NjQgPSAwOworICAgIFM2NCAgICAgICAgczY0ID0gMDsKKyAgICBjaGFyICAgICAgKmVuZHB0cjsKKworICAgIEJVR19VTkxFU1MoTlVMTCAhPSBzdHIsIEJBTF9QQVJBTSk7CisgICAgQlVHX1VOTEVTUyhOVUxMICE9IHBWYWwsIEJBTF9QQVJBTSk7CisgICAgQlVHX1VOTEVTUyhwVmFsLT5pbnRUeXBlID4gQkFMX1NUUjJJTlRfSU5WQUxJRCwgQkFMX1BBUkFNKTsKKyAgICBCVUdfVU5MRVNTKHBWYWwtPmludFR5cGUgPCBCQUxfU1RSMklOVF9NQVgsIEJBTF9QQVJBTSk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYgKChwVmFsLT5pbnRUeXBlID49IEJBTF9TVFIySU5UX1M4KSAmJgorICAgICAgICAgICAgKHBWYWwtPmludFR5cGUgPD0gQkFMX1NUUjJJTlRfUzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogSnVzdCBhc3N1bWUgYSBzaWduZWQgNjQtYml0IHZhbHVlIHdoZW4gY29udmVydGluZyB0aGUgc3RyaW5nIHRvCisgICAgICAgICAgICAgKiBhbiBpbnRlZ2VyLiBSYW5nZSBjaGVja2luZyBpcyBkb25lIGJlbG93LiBNYWtlIHN1cmUgdGhhdCBlcnJubworICAgICAgICAgICAgICogaXMgc2V0IHRvIHplcm8gYmVmb3JlIGNhbGxpbmcgc3RydG9sbCgpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICBwVmFsLT5pbnRVLnM2NCA9IDA7ICAgLyogQ2xlYXIgYWxsIHBvc3NpYmlsaXRpZXMgdG8gMCAqLworICAgICAgICAgICAgczY0ID0gc3RydG9sbChzdHIsICZlbmRwdHIsIDEwKTsKKworICAgICAgICAgICAgLyogR2VuZXJhbCByYW5nZSBhbmQgZXJyb3IgY2hlY2sgKi8KKyAgICAgICAgICAgIGlmICgoZXJybm8gPT0gRVJBTkdFICYmIChzNjQgPT0gTE9OR19NQVggfHwgczY0ID09IExPTkdfTUlOKSkKKyAgICAgICAgICAgICAgICB8fCAoZXJybm8gIT0gMCAmJiBzNjQgPT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB0ZXN0IGZvciBubyBkaWdpdHMgb3IgbWl4ZWQgZGlnaXRzIGFuZCBjaGFyYWN0ZXJzICovCisgICAgICAgICAgICBpZiAoZW5kcHRyID09IHN0ciB8fCAnXDAnICE9ICplbmRwdHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiByb3V0aW5lIHNwZWNpZmljIHJhbmdlIGNoZWNrICovCisgICAgICAgICAgICBzd2l0Y2ggKHBWYWwtPmludFR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQUxfU1RSMklOVF9TODoKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzNjQgPCAtMTI4KSB8fCAoczY0ID4gMTI3KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFZhbC0+aW50VS5zOCA9IChTOClzNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQUxfU1RSMklOVF9TMTY6CisgICAgICAgICAgICAgICAgICAgIGlmICgoczY0IDwgLTMyNzY4KSB8fCAoczY0ID4gMzI3NjcpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwVmFsLT5pbnRVLnMxNiA9IChTMTYpczY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkFMX1NUUjJJTlRfUzMyOgorICAgICAgICAgICAgICAgICAgICBpZiAoKHM2NCA8ICgtMjE0NzQ4MzY0N0wgLTFMKSkgfHwgKHM2NCA+IDIxNDc0ODM2NDdMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFZhbC0+aW50VS5zMzIgPSAoUzMyKXM2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJBTF9TVFIySU5UX1M2NDoKKyAgICAgICAgICAgICAgICAgICAgLyogTm8gcmFuZ2UgY2hlY2tpbmcgaXMgbmVlZGVkIHNpbmNlIHRoZSBzdHJ0b2xsKCkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICogZG9lcyB0aGUgcmFuZ2UgY2hlY2tpbmcuIElmIHRoZSBzdHJpbmcgd2FzIGludmFsaWQsIGVycm5vCisgICAgICAgICAgICAgICAgICAgICAqIHdvdWxkIGhhdmUgYmVlbiBub24temVyby4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHBWYWwtPmludFUuczY0ID0gczY0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvKiBTaG91bGQgbmV2ZXIgbWFrZSBpdCBoZXJlLiAqLworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBKdXN0IGFzc3VtZSBhbiB1bnNpZ25lZCA2NC1iaXQgdmFsdWUgd2hlbiBjb252ZXJ0aW5nIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAqIHRvIGFuIGludGVnZXIuIFJhbmdlIGNoZWNraW5nIGlzIGRvbmUgYmVsb3cuIE1ha2Ugc3VyZSB0aGF0IGVycm5vCisgICAgICAgICAgICAgKiBpcyBzZXQgdG8gemVybyBiZWZvcmUgY2FsbGluZyBzdHJ0b3VsbCgpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICBwVmFsLT5pbnRVLnU2NCA9IDA7CisgICAgICAgICAgICB1NjQgPSBzdHJ0b3VsbChzdHIsICZlbmRwdHIsIDEwKTsKKworICAgICAgICAgICAgLyogR2VuZXJhbCByYW5nZSBhbmQgZXJyb3IgY2hlY2sgKi8KKyAgICAgICAgICAgIGlmICgoZXJybm8gPT0gRVJBTkdFICYmIChzNjQgPT0gTE9OR19NQVggfHwgczY0ID09IExPTkdfTUlOKSkKKyAgICAgICAgICAgICAgICB8fCAoZXJybm8gIT0gMCAmJiBzNjQgPT0gMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB0ZXN0IGZvciBubyBkaWdpdHMgb3IgbWl4ZWQgZGlnaXRzIGFuZCBjaGFyYWN0ZXJzICovCisgICAgICAgICAgICBpZiAoZW5kcHRyID09IHN0ciB8fCAnXDAnICE9ICplbmRwdHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiByb3V0aW5lIHNwZWNpZmljIHJhbmdlIGNoZWNrICovCisgICAgICAgICAgICBzd2l0Y2gocFZhbC0+aW50VHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJBTF9TVFIySU5UX1U4OgorICAgICAgICAgICAgICAgICAgICBpZiAodTY0ID4gMjU1KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwVmFsLT5pbnRVLnU4ID0gKFU4KXU2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJBTF9TVFIySU5UX1UxNjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHU2NCA+IDY1NTM1KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwVmFsLT5pbnRVLnUxNiA9IChVMTYpdTY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkFMX1NUUjJJTlRfVTMyOgorICAgICAgICAgICAgICAgICAgICBpZiAodTY0ID4gNDI5NDk2NzI5NVVMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwVmFsLT5pbnRVLnUzMiA9IChVMzIpdTY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkFMX1NUUjJJTlRfVTY0OgorICAgICAgICAgICAgICAgICAgICAvKiBObyByYW5nZSBjaGVja2luZyBpcyBuZWVkZWQgc2luY2UgdGhlIHN0cnRvdWxsKCkgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICogZG9lcyB0aGUgcmFuZ2UgY2hlY2tpbmcuIElmIHRoZSBzdHJpbmcgd2FzIGludmFsaWQsIGVycm5vCisgICAgICAgICAgICAgICAgICAgICAqIHdvdWxkIGhhdmUgYmVlbiBub24temVyby4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHBWYWwtPmludFUudTY0ID0gdTY0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvKiBTaG91bGQgbmV2ZXIgbWFrZSBpdCBoZXJlLiAqLworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlICgwKTsKKworICAgIHJldHVybihyYyk7Cit9CisKKy8qKgorICogQGJyaWVmIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gUzggdHlwZSBpbnRlZ2VyCisgKgorICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHN0cmluZyB0byBhbiBTOCB0eXBlIGludGVnZXIKKyAqCisgKiBAcGFyYW0gc3RyICAgIFN0cmluZyB0byBjb252ZXJ0CisgKiBAcGFyYW0gcFZhbCAgIFBvaW50ZXIgdG8gdGhlIHJldHVybiB2YWx1ZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gQmFsU3RyaW5nVG9TOChjaGFyICpzdHIsIFM4ICpwVmFsKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkFMX09LOworICAgIEJhbEludFN0cmluZ1QgaW50U3RyOworCisgICAgQlVHX1VOTEVTUyhOVUxMICE9IHN0ciwgQkFMX1BBUkFNKTsKKyAgICBCVUdfVU5MRVNTKE5VTEwgIT0gcFZhbCwgQkFMX1BBUkFNKTsKKworICAgIG1lbXNldCgmaW50U3RyLCAwLCBzaXplb2YoaW50U3RyKSk7CisKKyAgICBpbnRTdHIuaW50VHlwZSA9IEJBTF9TVFIySU5UX1M4OworCisgICAgcmMgPSBCYWxTdHJpbmdUb0ludChzdHIsICZpbnRTdHIpOworICAgIGlmIChCQUxfT0sgPT0gcmMpCisgICAgeworICAgICAgICAqcFZhbCA9IGludFN0ci5pbnRVLnM4OworICAgIH0KKworICAgIHJldHVybihyYyk7Cit9CisKKy8qKgorICogQGJyaWVmIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gUzE2IHR5cGUgaW50ZWdlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBzdHJpbmcgdG8gYW4gUzE2IHR5cGUgaW50ZWdlcgorICoKKyAqIEBwYXJhbSBzdHIgICAgU3RyaW5nIHRvIGNvbnZlcnQKKyAqIEBwYXJhbSBwVmFsICAgUG9pbnRlciB0byB0aGUgcmV0dXJuIHZhbHVlCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitiY21vc19lcnJubyBCYWxTdHJpbmdUb1MxNihjaGFyICpzdHIsIFMxNiAqcFZhbCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJBTF9PSzsKKyAgICBCYWxJbnRTdHJpbmdUIGludFN0cjsKKworICAgIEJVR19VTkxFU1MoTlVMTCAhPSBzdHIsIEJBTF9QQVJBTSk7CisgICAgQlVHX1VOTEVTUyhOVUxMICE9IHBWYWwsIEJBTF9QQVJBTSk7CisKKyAgICBtZW1zZXQoJmludFN0ciwgMCwgc2l6ZW9mKGludFN0cikpOworCisgICAgaW50U3RyLmludFR5cGUgPSBCQUxfU1RSMklOVF9TMTY7CisKKyAgICByYyA9IEJhbFN0cmluZ1RvSW50KHN0ciwgJmludFN0cik7CisgICAgaWYgKEJBTF9PSyA9PSByYykKKyAgICB7CisgICAgICAgICpwVmFsID0gaW50U3RyLmludFUuczE2OworICAgIH0KKworICAgIHJldHVybihyYyk7Cit9CisKKy8qKgorICogQGJyaWVmIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gUzMyIHR5cGUgaW50ZWdlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBzdHJpbmcgdG8gYW4gUzMyIHR5cGUgaW50ZWdlcgorICoKKyAqIEBwYXJhbSBzdHIgICAgU3RyaW5nIHRvIGNvbnZlcnQKKyAqIEBwYXJhbSBwVmFsICAgUG9pbnRlciB0byB0aGUgcmV0dXJuIHZhbHVlCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitiY21vc19lcnJubyBCYWxTdHJpbmdUb1MzMihjaGFyICpzdHIsIFMzMiAqcFZhbCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJBTF9PSzsKKyAgICBCYWxJbnRTdHJpbmdUIGludFN0cjsKKworICAgIEJVR19VTkxFU1MoTlVMTCAhPSBzdHIsIEJBTF9QQVJBTSk7CisgICAgQlVHX1VOTEVTUyhOVUxMICE9IHBWYWwsIEJBTF9QQVJBTSk7CisKKyAgICBtZW1zZXQoJmludFN0ciwgMCwgc2l6ZW9mKGludFN0cikpOworCisgICAgaW50U3RyLmludFR5cGUgPSBCQUxfU1RSMklOVF9TMzI7CisKKyAgICByYyA9IEJhbFN0cmluZ1RvSW50KHN0ciwgJmludFN0cik7CisgICAgaWYgKEJBTF9PSyA9PSByYykKKyAgICB7CisgICAgICAgICpwVmFsID0gaW50U3RyLmludFUuczMyOworICAgIH0KKworICAgIHJldHVybihyYyk7Cit9CisKKy8qKgorICogQGJyaWVmIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gUzY0IHR5cGUgaW50ZWdlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBzdHJpbmcgdG8gYW4gUzY0IHR5cGUgaW50ZWdlcgorICoKKyAqIEBwYXJhbSBzdHIgICAgU3RyaW5nIHRvIGNvbnZlcnQKKyAqIEBwYXJhbSBwVmFsICAgUG9pbnRlciB0byB0aGUgcmV0dXJuIHZhbHVlCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitiY21vc19lcnJubyBCYWxTdHJpbmdUb1M2NChjaGFyICpzdHIsIFM2NCAqcFZhbCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJBTF9PSzsKKyAgICBCYWxJbnRTdHJpbmdUIGludFN0cjsKKworICAgIEJVR19VTkxFU1MoTlVMTCAhPSBzdHIsIEJBTF9QQVJBTSk7CisgICAgQlVHX1VOTEVTUyhOVUxMICE9IHBWYWwsIEJBTF9QQVJBTSk7CisKKyAgICBtZW1zZXQoJmludFN0ciwgMCwgc2l6ZW9mKGludFN0cikpOworCisgICAgaW50U3RyLmludFR5cGUgPSBCQUxfU1RSMklOVF9TNjQ7CisKKyAgICByYyA9IEJhbFN0cmluZ1RvSW50KHN0ciwgJmludFN0cik7CisgICAgaWYgKEJBTF9PSyA9PSByYykKKyAgICB7CisgICAgICAgICpwVmFsID0gaW50U3RyLmludFUuczY0OworICAgIH0KKworICAgIHJldHVybihyYyk7Cit9CisKKy8qKgorICogQGJyaWVmIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBVOCB0eXBlIGludGVnZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgc3RyaW5nIHRvIGEgVTggdHlwZSBpbnRlZ2VyCisgKgorICogQHBhcmFtIHN0ciAgICBTdHJpbmcgdG8gY29udmVydAorICogQHBhcmFtIHBWYWwgICBQb2ludGVyIHRvIHRoZSByZXR1cm4gdmFsdWUKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIEJhbFN0cmluZ1RvVTgoY2hhciAqc3RyLCBVOCAqcFZhbCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJBTF9PSzsKKyAgICBCYWxJbnRTdHJpbmdUIGludFN0cjsKKworICAgIEJVR19VTkxFU1MoTlVMTCAhPSBzdHIsIEJBTF9QQVJBTSk7CisgICAgQlVHX1VOTEVTUyhOVUxMICE9IHBWYWwsIEJBTF9QQVJBTSk7CisKKyAgICBtZW1zZXQoJmludFN0ciwgMCwgc2l6ZW9mKGludFN0cikpOworCisgICAgaW50U3RyLmludFR5cGUgPSBCQUxfU1RSMklOVF9VODsKKworICAgIHJjID0gQmFsU3RyaW5nVG9JbnQoc3RyLCAmaW50U3RyKTsKKyAgICBpZiAoQkFMX09LID09IHJjKQorICAgIHsKKyAgICAgICAgKnBWYWwgPSBpbnRTdHIuaW50VS51ODsKKyAgICB9CisKKyAgICByZXR1cm4ocmMpOworfQorCisvKioKKyAqIEBicmllZiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgVTE2IHR5cGUgaW50ZWdlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYSBzdHJpbmcgdG8gYSBVMTYgdHlwZSBpbnRlZ2VyCisgKgorICogQHBhcmFtIHN0ciAgICBTdHJpbmcgdG8gY29udmVydAorICogQHBhcmFtIHBWYWwgICBQb2ludGVyIHRvIHRoZSByZXR1cm4gdmFsdWUKKyAqCisgKiBAcmV0dXJuIGJjbW9zX2Vycm5vCisgKi8KK2JjbW9zX2Vycm5vIEJhbFN0cmluZ1RvVTE2KGNoYXIgKnN0ciwgVTE2ICpwVmFsKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkFMX09LOworICAgIEJhbEludFN0cmluZ1QgaW50U3RyOworCisgICAgQlVHX1VOTEVTUyhOVUxMICE9IHN0ciwgQkFMX1BBUkFNKTsKKyAgICBCVUdfVU5MRVNTKE5VTEwgIT0gcFZhbCwgQkFMX1BBUkFNKTsKKworICAgIG1lbXNldCgmaW50U3RyLCAwLCBzaXplb2YoaW50U3RyKSk7CisKKyAgICBpbnRTdHIuaW50VHlwZSA9IEJBTF9TVFIySU5UX1UxNjsKKworICAgIHJjID0gQmFsU3RyaW5nVG9JbnQoc3RyLCAmaW50U3RyKTsKKyAgICBpZiAoQkFMX09LID09IHJjKQorICAgIHsKKyAgICAgICAgKnBWYWwgPSBpbnRTdHIuaW50VS51MTY7CisgICAgfQorCisgICAgcmV0dXJuKHJjKTsKK30KKworLyoqCisgKiBAYnJpZWYgQ29udmVydCBhIHN0cmluZyB0byBhIFUzMiB0eXBlIGludGVnZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgc3RyaW5nIHRvIGEgVTMyIHR5cGUgaW50ZWdlcgorICoKKyAqIEBwYXJhbSBzdHIgICAgU3RyaW5nIHRvIGNvbnZlcnQKKyAqIEBwYXJhbSBwVmFsICAgUG9pbnRlciB0byB0aGUgcmV0dXJuIHZhbHVlCisgKgorICogQHJldHVybiBiY21vc19lcnJubworICovCitiY21vc19lcnJubyBCYWxTdHJpbmdUb1UzMihjaGFyICpzdHIsIFUzMiAqcFZhbCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJBTF9PSzsKKyAgICBCYWxJbnRTdHJpbmdUIGludFN0cjsKKworICAgIEJVR19VTkxFU1MoTlVMTCAhPSBzdHIsIEJBTF9QQVJBTSk7CisgICAgQlVHX1VOTEVTUyhOVUxMICE9IHBWYWwsIEJBTF9QQVJBTSk7CisKKyAgICBtZW1zZXQoJmludFN0ciwgMCwgc2l6ZW9mKGludFN0cikpOworCisgICAgaW50U3RyLmludFR5cGUgPSBCQUxfU1RSMklOVF9VMzI7CisKKyAgICByYyA9IEJhbFN0cmluZ1RvSW50KHN0ciwgJmludFN0cik7CisgICAgaWYgKEJBTF9PSyA9PSByYykKKyAgICB7CisgICAgICAgICpwVmFsID0gaW50U3RyLmludFUudTMyOworICAgIH0KKworICAgIHJldHVybihyYyk7Cit9CisKKy8qKgorICogQGJyaWVmIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBVNjQgdHlwZSBpbnRlZ2VyCisgKgorICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHN0cmluZyB0byBhIFU2NCB0eXBlIGludGVnZXIKKyAqCisgKiBAcGFyYW0gc3RyICAgIFN0cmluZyB0byBjb252ZXJ0CisgKiBAcGFyYW0gcFZhbCAgIFBvaW50ZXIgdG8gdGhlIHJldHVybiB2YWx1ZQorICoKKyAqIEByZXR1cm4gYmNtb3NfZXJybm8KKyAqLworYmNtb3NfZXJybm8gQmFsU3RyaW5nVG9VNjQoY2hhciAqc3RyLCBVNjQgKnBWYWwpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQUxfT0s7CisgICAgQmFsSW50U3RyaW5nVCBpbnRTdHI7CisKKyAgICBCVUdfVU5MRVNTKE5VTEwgIT0gc3RyLCBCQUxfUEFSQU0pOworICAgIEJVR19VTkxFU1MoTlVMTCAhPSBwVmFsLCBCQUxfUEFSQU0pOworCisgICAgbWVtc2V0KCZpbnRTdHIsIDAsIHNpemVvZihpbnRTdHIpKTsKKworICAgIGludFN0ci5pbnRUeXBlID0gQkFMX1NUUjJJTlRfVTY0OworCisgICAgcmMgPSBCYWxTdHJpbmdUb0ludChzdHIsICZpbnRTdHIpOworICAgIGlmIChCQUxfT0sgPT0gcmMpCisgICAgeworICAgICAgICAqcFZhbCA9IGludFN0ci5pbnRVLnU2NDsKKyAgICB9CisKKyAgICByZXR1cm4ocmMpOworfQorCisKKyNlbmRpZiAvKiBVU0lOR19CQUxfVVRJTFMgKi8KZGlmZiAtLWdpdCBhL2JhbF9yZWxlYXNlL3NyYy9saWIvbGlidXRpbHMvYmFsX3V0aWxzLmggYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYnV0aWxzL2JhbF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YzYxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS9zcmMvbGliL2xpYnV0aWxzL2JhbF91dGlscy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisgKiAgCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDE2IEJyb2FkY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogIAorICogIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAqICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgKiAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgKiAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKyAqICAKKyAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgKiAgICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgKiAgICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICogICAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAqICAgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAqICAgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgKiAgICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAqICAgICBvZiB0aGUgc29mdHdhcmUuCisgKiAgCisgKiAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgKiAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgKiAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAqICB3cml0dGVuIGNvbnNlbnQuCisgKiAgCisgKiAgOj4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKioKKyAqIEBmaWxlIGJhbF91dGlscy5oCisgKiBAYnJpZWYgQkFMIFV0aWxpdGllcyBpbmNsdWRlIGZpbGUKKyAqCisgKi8KKworI2lmbmRlZiBCQUxVVElMU19ICisjZGVmaW5lIEJBTFVUSUxTX0gKKworLypAeyovCisKKy8qKiAKKyAqIEBicmllZiBHZW5lcmFsIHB1cnBvc2UgQkFMIFN0cmluZyBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgZGVidWdnaW5nIG9yIGxvZyBtZXNzYWdlcy4KKyAqLworI2RlZmluZSBCQUxfU1RSSU5HX0xFTkdUSCAyNTYKKworI2RlZmluZSBNQUNfU1RSX0xFTiAxOAorCisvKioKKyAqIEBicmllZiBCQUwgU3RyaW5nIFN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBiYWxfc3RyaW5nCit7CisgICAgY2hhciBzdHJbQkFMX1NUUklOR19MRU5HVEgrMV07IC8qKjwgVGhlIHN0cmluZyAqLworfSBiYWxfc3RyaW5nOworCitleHRlcm4gY2hhciAqbWFjX2FkZHJfdG9fc3RyKGNoYXIgKmJ1ZmZlciwgYmNtb3NfbWFjX2FkZHJlc3MgbWFjKTsKK2V4dGVybiAgYmNtb3NfYm9vbCBtYWNfYWRkX2lzX251bGwoYmNtb3NfbWFjX2FkZHJlc3MgbWFjKTsKKworLypAfSovCisKKyNlbmRpZiAvKiBCQUxVVElMU19IICovCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS90b29scy9jb3B5cmlnaHRfdG9vbHMvaW5zZXJ0X2NvcHlyaWdodC5wbCBiL2JhbF9yZWxlYXNlL3Rvb2xzL2NvcHlyaWdodF90b29scy9pbnNlcnRfY29weXJpZ2h0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmMDFkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS90b29scy9jb3B5cmlnaHRfdG9vbHMvaW5zZXJ0X2NvcHlyaWdodC5wbApAQCAtMCwwICsxLDE2OSBAQAorIyEvdXNyL2Jpbi9wZXJsCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDb3B5cmlnaHQgMjAxNSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorIworIyAgVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorIyAgYW5kL29yIGl0cyBsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvcgorIyAgZGlzdHJpYnV0ZWQgcHVyc3VhbnQgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsCisjICB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkIGJldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4KKyMgICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4gYW4gQXV0aG9yaXplZCBMaWNlbnNlLAorIyAgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0IHRvIHVzZSwgb3IKKyMgIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KKyMgIGV4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbAorIyAgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRAorIyAgTElDRU5TRSwgVEhFTiBZT1UgSEFWRSBOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQKKyMgIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkgQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFCisjICBTT0ZUV0FSRS4KKyMKKyMgIEV4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisjCisjICAxLiAgVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyMgIGNvbnN0aXR1dGVzIHRoZSB2YWx1YWJsZSB0cmFkZSBzZWNyZXRzIG9mIEJyb2FkY29tLCBhbmQgeW91IHNoYWxsIHVzZQorIyAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisjICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorIyAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorIworIyAgMi4gIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQKKyMgICJBUyBJUyIgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsCisjICBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IKKyMgIE9USEVSV0lTRSwgV0lUSCBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWQorIyAgRElTQ0xBSU1TIEFOWSBBTkQgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLAorIyAgTk9OSU5GUklOR0VNRU5ULCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLAorIyAgQUNDVVJBQ1kgT1IgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IKKyMgIENPUlJFU1BPTkRFTkNFIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVAorIyAgT0YgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyMKKyMgIDMuICBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00KKyMgIE9SIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyMgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWSBXQVkKKyMgIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4gSUYKKyMgIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsgT1IgKGlpKQorIyAgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUgU09GVFdBUkUKKyMgIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMgU0hBTEwgQVBQTFkKKyMgIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkgTElNSVRFRAorIyAgUkVNRURZLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgU2NyaXB0OiAgaW5zZXJ0X2NvcHlyaWdodC5wbAorIworIyAgUHVycG9zZTogVGhpcyBzY3JpcHQgaW5zZXJ0cyBhIGNvcHlyaWdodCBoZWFkZXIgaW50byB0aGUgYmVnaW5uaW5nCisjICAgICAgICAgICBvZiBhIGMvYysrLCBzaGVsbCBzY3JpcHQsIGFuZCBNYWtlZmlsZXMuCisjCisjICBVc2FnZTogICAuL2luc2VydF9jb3B5cmlnaHQucGwgLWwgPGxpY2Vuc2UgZmlsZT4gWy10IDx0eXBlPl0gPHNvdXJjZSBmaWxlPgorIyAgICAgICAgICAgICBPcHRpb25zOgorIworIyAgICAgICAgICAgICAtbCA8ZmlsZT4gICBTcGVjaWZpZXMgdGhlIGxpY2Vuc2UvY29weXJpZ2h0IGZpbGUgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZmlsZQorIyAgICAgICAgICAgICAtdCA8dHlwZT4gICBTcGVjaWZpZXMgdGhlIHR5cGUgb2YgY29weXJpZ2h0IHRvIGluc2VydC4uLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJyAtIHNoZWxsIHNjcmlwdAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJyAtIE1ha2VmaWxlCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnIC0gKGRlZmF1bHQpIGMvYysrIGZpbGUKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3VzZSBHZXRvcHQ6Okxvbmc7CitteSAkbGljZmlsZSA9ICIiOworbXkgJHNyY2ZpbGUgPSAiIjsKK215ICR0eXBlID0gIiI7CiskcmVzdWx0ID0gR2V0T3B0aW9ucyAoImxpY2Vuc2VfZmlsZT1zIiA9PiBcJGxpY2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgInR5cGU9cyIgICAgICAgICA9PiBcJHR5cGUpOworCiskc3JjZmlsZSA9IHNoaWZ0OworCisjIyBwcmludGYgIiRsaWNmaWxlLCAkdHlwZSwgJHNyY2ZpbGVcbiI7CisKK3N1YiBJbnNlcnRDZmlsZUNvcHlyaWdodAoreworICAgbXkgJGxpYyAgPSBzaGlmdDsKKyAgIG15ICRzcmMgPSBzaGlmdDsKKworICAgcHJpbnQgIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiI7CisgICBwcmludCAiICpcbiI7CisKKyAgIG9wZW4oIExJQ0YsICI8ICRsaWMiICkgb3IgZGllICJDYW4ndCBvcGVuICRsaWMgOiAkISI7CisgICB3aGlsZSggJGxpbmUgPSA8TElDRj4gKSB7CisgICAgICAgcHJpbnQgIiAqICAkbGluZSI7CisgICB9CisgICBjbG9zZSBMSUNGOworCisgICBwcmludCAiICpcbiI7CisgICBwcmludCAiICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuIjsKKyAgIHByaW50ICIgXG4iOworCisgICBpZiAobGVuZ3RoKCRzcmNmaWxlKSA+IDApIHsKKyAgICAgICBvcGVuKCBTUkNGLCAiPCAkc3JjIiApIG9yIGRpZSAiQ2FuJ3Qgb3BlbiAkc3JjIDogJCEiOworICAgICAgIHdoaWxlKCAkbGluZSA9IDxTUkNGPiApIHsKKyAgICAgICAgICAgcHJpbnQgIiRsaW5lIjsKKyAgICAgICB9CisgICAgICAgY2xvc2UgU1JDRjsKKyAgIH0KK30KKworc3ViIEluc2VydE1ha2VmaWxlQ29weXJpZ2h0Cit7CisgICBteSAkbGljID0gc2hpZnQ7CisgICBteSAkc3JjID0gc2hpZnQ7CisKKyAgIHByaW50ICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iOworICAgcHJpbnQgIiNcbiI7CisKKyAgIG9wZW4oIExJQ0YsICI8ICRsaWMiICkgb3IgZGllICJDYW4ndCBvcGVuICRsaWMgOiAkISI7CisgICB3aGlsZSggJGxpbmUgPSA8TElDRj4gKSB7CisgICAgICAgcHJpbnQgIiMgICRsaW5lIjsKKyAgIH0KKyAgIGNsb3NlIExJQ0Y7CisKKyAgIHByaW50ICIjXG4iOworICAgcHJpbnQgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiI7CisKKyAgIGlmIChsZW5ndGgoJHNyY2ZpbGUpID4gMCkgeworICAgICAgIG9wZW4oIFNSQ0YsICI8ICRzcmMiICkgb3IgZGllICJDYW4ndCBvcGVuICRzcmMgOiAkISI7CisgICAgICAgd2hpbGUoICRsaW5lID0gPFNSQ0Y+ICkgeworICAgICAgICAgICBwcmludCAiJGxpbmUiOworICAgICAgIH0KKyAgICAgICBjbG9zZSBTUkNGOworICAgfQorfQorCitzdWIgSW5zZXJ0U2hDb3B5cmlnaHQKK3sKKyAgIG15ICRsaWMgPSBzaGlmdDsKKyAgIG15ICRzcmMgPSBzaGlmdDsKKworICAgaWYgKGxlbmd0aCgkc3JjZmlsZSkgPiAwKSB7CisgICAgICAgb3BlbiggU1JDRiwgIjwgJHNyYyIgKSBvciBkaWUgIkNhbid0IG9wZW4gJHNyYyA6ICQhIjsKKyAgICAgICAkbGluZSA9IDxTUkNGPjsKKyAgICAgICBwcmludCAiJGxpbmUiOworICAgfQorCisgICBwcmludCAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIjsKKyAgIHByaW50ICIjXG4iOworCisgICBvcGVuKCBMSUNGLCAiPCAkbGljIiApIG9yIGRpZSAiQ2FuJ3Qgb3BlbiAkbGljIDogJCEiOworICAgd2hpbGUoICRsaW5lID0gPExJQ0Y+ICkgeworICAgICAgIHByaW50ICIjICAkbGluZSI7CisgICB9CisgICBjbG9zZSBMSUNGOworCisgICBwcmludCAiI1xuIjsKKyAgIHByaW50ICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iOworCisgICBpZiAobGVuZ3RoKCRzcmNmaWxlKSA+IDApIHsKKyAgICAgICB3aGlsZSggJGxpbmUgPSA8U1JDRj4gKSB7CisgICAgICAgICAgIHByaW50ICIkbGluZSI7CisgICAgICAgfQorICAgICAgIGNsb3NlIFNSQ0Y7CisgICB9Cit9CisKK2lmICgkdHlwZSBlcSAicyIpIHsKKyAgICBJbnNlcnRTaENvcHlyaWdodCgkbGljZmlsZSwgJHNyY2ZpbGUpOworfSBlbHNpZiAoJHR5cGUgZXEgIm0iKSB7CisgICAgSW5zZXJ0TWFrZWZpbGVDb3B5cmlnaHQoJGxpY2ZpbGUsICRzcmNmaWxlKTsKK30gZWxzaWYgKCR0eXBlIGVxICJjIiB8fCAkdHlwZSA9PSAiIikgeworICAgIEluc2VydENmaWxlQ29weXJpZ2h0KCRsaWNmaWxlLCAkc3JjZmlsZSk7Cit9CisKK2V4aXQ7CisKKwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvdG9vbHMvY29weXJpZ2h0X3Rvb2xzL3N0cmlwX2NfY29weXJpZ2h0LnBsIGIvYmFsX3JlbGVhc2UvdG9vbHMvY29weXJpZ2h0X3Rvb2xzL3N0cmlwX2NfY29weXJpZ2h0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0NjRjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9iYWxfcmVsZWFzZS90b29scy9jb3B5cmlnaHRfdG9vbHMvc3RyaXBfY19jb3B5cmlnaHQucGwKQEAgLTAsMCArMSw4NiBAQAorIyEvdXNyL2Jpbi9wZXJsCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBDb3B5cmlnaHQgMjAwOC0yMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisjCisjICBUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uCisjICBhbmQvb3IgaXRzIGxpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yCisjICBkaXN0cmlidXRlZCBwdXJzdWFudCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwKKyMgIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQgYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbgorIyAgIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbiBhbiBBdXRob3JpemVkIExpY2Vuc2UsCisjICBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQgdG8gdXNlLCBvcgorIyAgd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorIyAgZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsCisjICBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVECisjICBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFIE5PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORAorIyAgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWSBCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUKKyMgIFNPRlRXQVJFLgorIworIyAgRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyMKKyMgIDEuICBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorIyAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisjICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyMgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tCisjICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisjCisjICAyLiAgVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRAorIyAgIkFTIElTIiBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywKKyMgIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUgorIyAgT1RIRVJXSVNFLCBXSVRIIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZCisjICBESVNDTEFJTVMgQU5ZIEFORCBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksCisjICBOT05JTkZSSU5HRU1FTlQsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsCisjICBBQ0NVUkFDWSBPUiBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUgorIyAgQ09SUkVTUE9OREVOQ0UgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUCisjICBPRiBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorIworIyAgMy4gIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTQorIyAgT1IgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorIyAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZIFdBWQorIyAgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTiBJRgorIyAgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOyBPUiAoaWkpCisjICBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRSBTT0ZUV0FSRQorIyAgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUyBTSEFMTCBBUFBMWQorIyAgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWSBMSU1JVEVECisjICBSRU1FRFkuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBTY3JpcHQ6ICBzdHJpcF9jX2NvcHlyaWdodC5wbAorIworIyAgUHVycG9zZTogVGhpcyBzY3JpcHQgcmVtb3ZlcyBhIGNvcHlyaWdodCBoZWFkZXIgZnJvbSBhIGMvYysrCisjICAgICAgICAgICBmaWxlLiBUaGUgZmlsZSBpcyBwYXNzZWQgaW50byB0aGUgcGVybCBzY3JpcHQgdmlhIFNURElOLCBzbyB0aGlzCisjICAgICAgICAgICBzY3JpcHQgbXVzdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggc29tZXRoaW5nIGxpa2UgJ2NhdCcuCisjCisjICBVc2FnZTogICBjYXQgPGZpbGU+IHwgLi9zdHJpcF9jX2NvcHlyaWdodC5wbAorIworIworIyAgUHJldmlvdXMgYXR0ZW1wcyBhdCBjLXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuLi4KKyMgICAgcyMoPzpcL1wqKD86W14qXXwoPzpcKitbXipcL10pKSpcKitcLykuKlxuIyM7CisjICAgIHMjKD86XC9cKi4qQ29weXJpZ2h0XChjXCkoPzpbXipdfCg/OlwqK1teKlwvXSkpKlwqK1wvKS4qXG58KD86XC9cKig/OlteKl18KD86XCorW14qXC9dKSkqQ29weXJpZ2h0XChjXCkoPzpbXipdfCg/OlwqK1teKlwvXSkpKlwqK1wvKS4qXG4jIzsKKyMgICAgZ29vZCA9PiBzIyg/OlwvXCouKkNvcHlyaWdodCg/OlteKl18KD86XCorW14qXC9dKSkqXCorXC8pLipcbnwoPzpcL1wqKD86W14qXXwoPzpcKitbXipcL10pKSpDb3B5cmlnaHQoPzpbXipdfCg/OlwqK1teKlwvXSkpKlwqK1wvKS4qXG4jIzsKKyMgICAgZ29vZCA9PiBzIyg/OlwvXCouKkNvcHlyaWdodCg/OlteKl18KD86XCorW14qXC9dKSkqXCorXC8pLiooPzpccykrfCg/OlwvXCooPzpbXipdfCg/OlwqK1teKlwvXSkpKkNvcHlyaWdodCg/OlteKl18KD86XCorW14qXC9dKSkqXCorXC8pLiooPzpccykrIyM7CisjCisjICBUaGUgZm9sbG93aW5nIHJlZ2V4IGNhbiBiZSB1c2VkIGZvciByZW1vdmluZyByZWR1bmRhbnQgQysrCisjICBjb3B5cmlnaHQgaGVhZGVyIGZyb20gbGlic3NkIGZpbGVzLi4uCisjCisjICBzI1wvXC9cKitbXipdKkNvcHlyaWdodFteKl0qXC9cL1wqKyMvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiojOworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiskLyA9IHVuZGVmOworJF8gPSA8PjsKKworIworIyBUaGUgZm9sbG93aW5nIHJlZ2V4IGhhbmRsZXMgdGhlIG9sZCBUZWtub3Z1cy1zdHlsZSBjb3B5cmlnaHQgaGVhZGVycworIworIyBlLmcuICIvKiAgICAgICAgIENvcHlyaWdodChjKSAyMDA4LTIwMTIgQnJvYWRjb20sIENvcnAuICAgICAgICAqLyIKKyMKKyNzIyg/OlwvXCouKkNvcHlyaWdodCg/OlteKl18KD86XCorW14qXC9dKSkqXCorXC8pLiooPzpccykrIyM7CisKKyMKKyMgVGhlIGZvbGxvd2luZyByZWdleCBoYW5kbGVzIHRoZSBuZXcgQnJvYWRjb20gc3RhbmRhcmQgY29weXJpZ2h0IGhlYWRlcnMKKyMKK3MjKD86XC9cKig/OlteKl18KD86XCorW14qXC9dKSkqQ29weXJpZ2h0KD86W14qXXwoPzpcKitbXipcL10pKSpcKitcLykuKig/OlxzKSsjIzsKK3ByaW50OworCmRpZmYgLS1naXQgYS9iYWxfcmVsZWFzZS90b29scy9jb3B5cmlnaHRfdG9vbHMvc3RyaXBfc2hfY29weXJpZ2h0LnBsIGIvYmFsX3JlbGVhc2UvdG9vbHMvY29weXJpZ2h0X3Rvb2xzL3N0cmlwX3NoX2NvcHlyaWdodC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjQwNmIxCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvdG9vbHMvY29weXJpZ2h0X3Rvb2xzL3N0cmlwX3NoX2NvcHlyaWdodC5wbApAQCAtMCwwICsxLDYzIEBACisjIS91c3IvYmluL3BlcmwKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIENvcHlyaWdodCAyMDA4LTIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyMKKyMgIFRoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24KKyMgIGFuZC9vciBpdHMgbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IKKyMgIGRpc3RyaWJ1dGVkIHB1cnN1YW50IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLAorIyAgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZCBiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuCisjICAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluIGFuIEF1dGhvcml6ZWQgTGljZW5zZSwKKyMgIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodCB0byB1c2UsIG9yCisjICB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCisjICBleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwKKyMgIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQKKyMgIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUgTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5ECisjICBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZIEJST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRQorIyAgU09GVFdBUkUuCisjCisjICBFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIworIyAgMS4gIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisjICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyMgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworIyAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyMgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKyMKKyMgIDIuICBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVECisjICAiQVMgSVMiIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLAorIyAgUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SCisjICBPVEhFUldJU0UsIFdJVEggUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkKKyMgIERJU0NMQUlNUyBBTlkgQU5EIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwKKyMgIE5PTklORlJJTkdFTUVOVCwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywKKyMgIEFDQ1VSQUNZIE9SIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SCisjICBDT1JSRVNQT05ERU5DRSBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQKKyMgIE9GIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisjCisjICAzLiAgVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NCisjICBPUiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisjICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkgV0FZCisjICBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOIElGCisjICBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7IE9SIChpaSkKKyMgIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFIFNPRlRXQVJFCisjICBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TIFNIQUxMIEFQUExZCisjICBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZIExJTUlURUQKKyMgIFJFTUVEWS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIFNjcmlwdDogIHN0cmlwX3NoX2NvcHlyaWdodC5wbAorIworIyAgUHVycG9zZTogVGhpcyBzY3JpcHQgcmVtb3ZlcyBhIGNvcHlyaWdodCBoZWFkZXIgZnJvbSBhIHNoZWxsIHNjcmlwdAorIyAgICAgICAgICAgZmlsZSBvciBNYWtlZmlsZS4gIFRoZSBmaWxlIGlzIHBhc3NlZCBpbnRvIHRoZSBwZXJsIHNjcmlwdCB2aWEKKyMgICAgICAgICAgIFNURElOLCBzbyB0aGlzIHNjcmlwdCBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBzb21ldGhpbmcKKyMgICAgICAgICAgIGxpa2UgJ2NhdCcuCisjCisjICBVc2FnZTogICBjYXQgPGZpbGU+IHwgLi9zdHJpcF9zaF9jb3B5cmlnaHQucGwKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworJC8gPSB1bmRlZjsKKyRfID0gPD47CitzLyMjKyg/OlteI118KD86I1teI10pKikqQ29weXJpZ2h0KD86W14jXXwoPzojW14jXSkqKSojIytcbi8vZzsKK3ByaW50OwpkaWZmIC0tZ2l0IGEvYmFsX3JlbGVhc2UvdG9vbHMvY29weXJpZ2h0X3Rvb2xzL3VwZGF0ZV9jb3B5cmlnaHQuc2ggYi9iYWxfcmVsZWFzZS90b29scy9jb3B5cmlnaHRfdG9vbHMvdXBkYXRlX2NvcHlyaWdodC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNWY0MTRkCi0tLSAvZGV2L251bGwKKysrIGIvYmFsX3JlbGVhc2UvdG9vbHMvY29weXJpZ2h0X3Rvb2xzL3VwZGF0ZV9jb3B5cmlnaHQuc2gKQEAgLTAsMCArMSwyMjEgQEAKKyMhL2Jpbi9zaAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisjICAgCisjICAgICBCcm9hZGNvbSBMdGQuIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20gTHRkLgorIyAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyAgIAorIyAgVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBMdGQuIGFuZC9vciBpdHMKKyMgIGxpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50CisjICB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorIyAgYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIEx0ZC4gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KKyMgIGFuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gTHRkLiBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKKyMgIHRvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbSBMdGQuCisjICBleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCisjICBwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorIyAgTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKKyMgIEJST0FEQ09NIExURCBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisjICAgCisjICBFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIyAgIAorIyAgMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyMgICAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSBMdGQuLCBhbmQgeW91IHNoYWxsIHVzZQorIyAgICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworIyAgICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tIEx0ZC4KKyMgICAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisjICAgCisjICAyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyMgICAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisjICAgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisjICAgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyMgICAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyMgICAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorIyAgICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisjICAgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorIyAgICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyMgICAKKyMgIDMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorIyAgICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyMgICAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyMgICAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorIyAgICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyMgICAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisjICAgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworIyAgICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyMgICAgICBMSU1JVEVEIFJFTUVEWS4KKyMgIDo+CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjICBTY3JpcHQ6ICB1cGRhdGVfY29weXJpZ2h0LnNoCisjCisjICBQdXJwb3NlOiBUaGlzIHNjcmlwdCB1cGRhdGVzIHRoZSBjb3B5cmlnaHQgY29tbWVudCBoZWFkZXJzIGluCisjICAgICAgICAgICBjL2MrKywgc2hlbGwgc2NyaXB0LCBhbmQgTWFrZWZpbGVzLiBEZXBlbmRpbmcgb24gdGhlIG9wdGlvbnMKKyMgICAgICAgICAgIHNwZWNpZmllZCBiZWxvdywgdGhpcyBzY3JpcHQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEKKyMgICAgICAgICAgIFBlcmZvcmNlIGNoYW5nZWxpc3QgYW5kIGNoZWNrb3V0IHRoZSBmaWxlcyBiZWZvcmUgdXBkYXRpbmcgdGhlCisjICAgICAgICAgICBjb3B5cmlnaHQgaGVhZGVycy4KKyMKKyMgIFVzYWdlOiAgIC4vdXBkYXRlX2NvcHlyaWdodC5zaCBbLWMgY2hnbGlzdCBudW18Im5vbmUiXSA8ZmlsZXM+CisjICAgICAgICAgICAgIE9wdGlvbnM6CisjCisjICAgICAgICAgICAgIC1jIG51bXwibm9uZSIgICAgSWYgLWMgaXMgc3BlY2lmaWVkIHdpdGggYSBQZXJmb3JjZSBjaGFuZ2VsaXN0IAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciwgdGhlbiBmaWxlcyB0aGF0IGFyZSB1cGRhdGVkIGJ5IHRoaXMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQgd2lsbCBiZSBwdXQgaW50byB0aGUgc3BlY2lmaWVkIGNoYW5nZWxpc3QuCisjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgJy1jIG5vbmUnIGlzIHNwZWNpZmllZCwgdGhlIHNjcmlwdCB3aWxsIG5vdCAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlIGFueSBQZXJmb3JjZSBjb21tYW5kcyBiZWZvcmUgdXBkYXRpbmcgdGhlCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weXJpZ2h0IGluIGZpbGVzLiBUaGUgdXNlciBpcyBleHBlY3RlZCB0byBjaGVja291dCAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZXMgcHJpb3IgdG8gZXhjdXRpbmcgdGhpcyBzY3JpcHQuCisjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgLWMgaXMgbm90IHNwZWNpZmllZCAoZGVmYXVsdCksIGEgbmV3IGNoYW5nZSBsaXN0IAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNyZWF0ZWQgYW5kIGFsbCB1cGRhdGVkIGZpbGVzIGFyZSBwdXQgaW50byB0aGUgbmV3IAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSBsaXN0LgorIworIworIyAgVGhpcyBzY3JpcHQgbWFrZXMgdXNlIG9mIHRoZSBmb2xsb3dpbmcgcGVybCBzY3JpcHRzOgorIyAgICAgIHN0cmlwX2NfY29weXJpZ2h0LnBsICAgLSBTdHJpcHMgYSBjb3B5cmlnaHQgaGVhZGVyIGZyb20gYSBjL2MrKyBmaWxlLgorIyAgICAgIHN0cmlwX3NoX2NvcHlyaWdodC5wbCAgLSBTdHJpcHMgYSBjb3B5cmlnaHQgaGVhZGVyIGZyb20gYSBNYWtlZmlsZSBvciBzaGVsbCAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LgorIyAgICAgIGluc2VydF9jb3B5cmlnaHQucGwgICAgLSBJbnNlcnRzIGEgY29weXJpZ2h0IGhlYWRlciBpbnRvIGEgYy9jKyssIHNoZWxsIHNjcmlwdCwgCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIE1ha2VmaWxlIGZpbGUuCisjCisjCisjICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgQ29weXJpZ2h0IFVwZGF0ZSBQcm9jZWR1cmUKKyMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjICBUaGUgZm9sbG93aW5nIHByb2NlZHVyZSBzaG91bGQgYmUgdXNlZCB0byB1cGRhdGUgdGhlIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyMKKyMgIDEpIGZpbmQgLiAtcmVnZXh0eXBlIGVncmVwIC1yZWdleCAnLipcLmN8LipcLmh8LipcLmNwcHwuKk1ha2VmaWxlfC4qTWFrZWZpbGVcLnNka3wuKlwubWt8LipcLnNoJyB8IHhhcmdzICRQUk9KUk9PVC90b29scy9jb3B5cmlnaHRfdG9vbHMvdXBkYXRlX2NvcHlyaWdodC5zaAorIworIyAgVG8gZXhsdWRlIGEgZGlyZWN0b3J5IGZyb20gdGhlIHNlYXJjaCwgdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZAorIworIyAgMWEpIGZpbmQgLiAtcGF0aCAuLzNyZHBhcnR5IC1wcnVuZSAtbyAtcmVnZXh0eXBlIGVncmVwIC1yZWdleCAnLipcLmN8LipcLmh8LipcLmNwcHwuKk1ha2VmaWxlfC4qTWFrZWZpbGVcLnNka3wuKlwubWt8LipcLnNoJyB8IHhhcmdzICRQUk9KUk9PVC90b29scy9jb3B5cmlnaHRfdG9vbHMvdXBkYXRlX2NvcHlyaWdodC5zaAorIworIyAgMikgVXBkYXRlIHRoZSAiQ29weXJpZ2h0IChjKSIgc3RhdGVtZW50IGluIHRoZSBkZWJ1ZyBDTEkgKC4vbGliL2xpYmRiZy9kYmdDbGkuYykKKyMgICAgICAgIC0gTm90ZTogbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIHNjcmlwdCBtYXkgYWxyZWFkeSBoYW5kbGUgdGhpcyBhdXRvbWF0aWNhbGx5LgorIworIyAgMykgVXBkYXRlIHRoZSBmb2xsb3dpbmcgZmlsZXMgYnkgaGFuZCBiZWNhdXNlIHRoZXkgZG8gbm90IGZvbGxvdworIyAgICAgdGhlIHN0YW5kYXJkIHNvdXJjZSBmaWxlIG5hbWluZyBjb252ZW50aW9uczoKKyMgICAgICAgICAtIGJhbC9jdXIvM3JkcGFydHkvaW5kaWdvL2luZGlnby9tb2R1bGVzL29mcGFsX2RyaXZlci9tb2R1bGUvc3JjL29mcGFsX2RyaXZlci5jCisjICAgICAgICAgLSBiYWwvY3VyLzNyZHBhcnR5L2luZGlnby9pbmRpZ28vbW9kdWxlcy9vZnBhbC1kcml2ZXIvdXRlc3QvbWFpbi5jCisjICAgICAgICAgLSBiYWwvY3VyL2RveHlnZW4vTWFrZWZpbGUKKyMKKyMgICAgICBBbHNvLCB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgdG8gZmluZCBhZGRpdGlvbmFsIHN0cmFnbGVycy4uLgorIworIyAgICAgICAgIGZpbmQgLiB8IHhhcmdzIGdyZXAgMjAxMworIworIyAgKE9wdGlvbmFsKSBVc2UgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgdG8gdmVyaWZ5IHRoZSBjaGFuZ2VzLgorIworIyAgICAgICAgYSkgVXNlIHA0IHRvIGJ1aWxkIGEgbGlzdCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBtb2RpZmllZCBieSB0aGlzIENMLgorIworIyAgICAgICAgICAgcDQgZGVzY3JpYmUgPENMIGZyb20gc3RlcDE+IHwgZ3JlcCAnXlwuXC5cLicgfCBhd2sgJ3twcmludCAkMn0nIHwgc2VkICdzJS8vU3lzdGVtU29mdHdhcmUvUmVsL3Bpb25lZXIvZG1sLyUlZycgfCBzZWQgJ3MlXCMuJCUlZycgID4gcDRfY2hhbmdlc19maWxlcy50eHQKKyMgICAgICAgIAorIyAgICAgICAgYikgQWRkIHRoZSBmb2xsb3dpbmcgYmFzaCBzY3JpcHQgdG8gYSBmaWxlIGNhbGxlZCB0ZW1wLnNoIGFuZAorIyAgICAgICAgICAgYWRkIGV4ZWN1dGUgcGVybWlzc2lvbnMgdG8gdGhlIGZpbGUuCisjCisjICAgICAgICAgICAgIyEvYmluL3NoCisjICAgICAgICAgICAgIworIyAgICAgICAgICAgIHdoaWxlIHJlYWQgLXIgbGluZTsgZG8KKyMgICAgICAgICAgICAgICAgZWNobyAiJGxpbmU6ICAiYHA0IGRpZmYgLWRzICRsaW5lIHwgZ3JlcCBjaGFuZ2VkYAorIyAgICAgICAgICAgIGRvbmUgPCBwNF9jaGFuZ2VzX2ZpbGVzLnR4dAorIyAgICAgICAgCisjICAgICAgICBjKSBSdW4gdGhlIHNjcmlwdAorIworIyAgICAgICAgICAgIC4vdGVtcC5zaCB8IHRlZSBwNF9kaWZmcy50eHQKKyMgICAgICAgIAorIyAgICAgICAgZCkgQ2hlY2sgdGhlIHNjcmlwZSBmb3IgdW51c3VhbC91bmV4cGVjdGVkIGNoYW5nZXMgYW5kIHVzZSAncDQgZGlmZiBmaWxlJworIyAgICAgICAgICAgdG8gaW52ZXN0aWdhdGUuCisjCisjICAgICAgICAgICAgY2F0IHA0X2RpZmZzLnR4dCB8IGdyZXAgLXYgImNoYW5nZWQgMSBjaHVua3MgMSAvIDEgbGluZXMiIHwgdGVlIHQxLnR4dAorIworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitDT1BZUklHSFRfRklMRT0ke1BST0pST09UfS9DT1BZUklHSFQKK1A0X0NIQU5HRUxJU1RfREVTQz0iQ29weXJpZ2h0IEhlYWRlciBVcGRhdGUgLSAiYGRhdGVgCisKK2lmIFsgIiQxIiA9ICItYyIgXQorICAgIHRoZW4KKyAgICBQNF9DSEFOR0VMSVNUX05VTT0iJDIiCisKKyAgICBpZiBbICIkUDRfQ0hBTkdFTElTVF9OVU0iID0gIiIgXQorICAgICAgICB0aGVuCisgICAgICAgIGVjaG8gIkVSUk9SOiBtdXN0IHNwZWNpZnkgJ25vbmUnIG9yIFA0IGNoYW5nZSBsaXN0IG51bWJlciBmb3IgdGhlICctYycgb3B0aW9uLiIKKyAgICAgICAgZXhpdCAxCisgICAgZWxpZiBbICIkUDRfQ0hBTkdFTElTVF9OVU0iID0gIm5vbmUiIF0KKyAgICAgICAgdGhlbgorICAgICAgICBlY2hvICJOT1RFOiBQZXJmb3JjZSBjb21tYW5kcyB3aWxsIGJlIHNraXBwZWQiCisgICAgZWxzZQorICAgICAgICBlY2hvICJVc2luZyBleGlzdGluZyBjaGFuZ2UgbGlzdCAkUDRfQ0hBTkdFTElTVF9OVU0iCisgICAgZmkKKyAgICBzaGlmdCA7IHNoaWZ0CitlbHNlCisgICAgUDRfQ0hBTkdFTElTVF9OVU09YGVjaG8gLWUgIkNoYW5nZTogbmV3XG5EZXNjcmlwdGlvbjogJHtQNF9DSEFOR0VMSVNUX0RFU0N9IiB8IHA0IGNoYW5nZSAtaSB8IGN1dCAtZCAiICIgLWYgMmAKKyAgICBlY2hvICJDcmVhdGVkIGNoYW5nZSBsaXN0ICRQNF9DSEFOR0VMSVNUX05VTSIKK2ZpCisKK2ZvciBwYXRoIGluICIkQCIKK2RvCisgIGZpbGU9YGJhc2VuYW1lICRwYXRoYAorCisgIGZpbGVfZXh0PSIke2ZpbGUjKi59IgorCisgICMgT25seSBjaGVja291dCBmaWxlcyBmcm9tIHBlcmZvcmNlIGlzIGFuIGV4aXN0aW5nIG9yIG5ldyBjaGFuZ2UgbGlzdCB3YXMgc3BlY2lmaWVkIAorICBpZiBbICIkUDRfQ0hBTkdFTElTVF9OVU0iICE9ICJub25lIiBdCisgICAgICB0aGVuCisKKyAgICAgICMgT25seSB1cGRhdGUgdGV4dCBmaWxlcworICAgICAgcDRfZmlsZV90eXBlPWBwNCBmc3RhdCAkcGF0aCB8IGdyZXAgaGVhZFR5cGUgfCBjdXQgLWQgIiAiIC1mIDMgfCBncmVwIC1vIHRleHRgCisgICAgICBpZiBbICIkcDRfZmlsZV90eXBlIiAhPSAidGV4dCIgXQorICAgICAgICAgIHRoZW4KKyAgICAgICAgICBlY2hvICJXQVJOSU5HOiBza2lwcGluZyBmaWxlICckcGF0aCcgYmVjYXVzZSBpdCBpdCBub3QgYSB0ZXh0IGZpbGUuIgorICAgICAgICAgIGNvbnRpbnVlICAjIyMgcmVzdW1lcyBpdGVyYXRpb24gb2YgYW4gZW5jbG9zaW5nIGZvciBsb29wICMjIworICAgICAgZmkKKworICAgICAgIyBPcGVuIHRoZSBmaWxlIGZvciBlZGl0aW5nCisgICAgICBwNCBvcGVuZWQgJHBhdGggMj4mMSB8IGdyZXAgLXEgIm5vdCBvcGVuZWQiCisgICAgICBpZiBbICQ/ICE9IDAgXQorICAgICAgICAgIHRoZW4KKyAgICAgICAgICBlY2hvICJXQVJOSU5HOiBmaWxlICckcGF0aCcgaXMgYWxyZWFkeSBvcGVuZWQgZm9yIGVkaXQuLi4iCisgICAgICBlbHNlCisgICAgICAgICAgcDQgZWRpdCAtYyAkUDRfQ0hBTkdFTElTVF9OVU0gJHBhdGggJj4vZGV2L251bGwKKyAgICAgIGZpCisgIGZpCisKKyAgIyBVcGRhdGUgdGhlIENvcHlyaWdodCBiYXNlZCBvbiBmaWxlIHR5cGUKKyAgaWYgWyAiJGZpbGVfZXh0IiA9PSAiYyIgXSB8fCBbICIkZmlsZV9leHQiID09ICJoIiBdIHx8IFsgIiRmaWxlX2V4dCIgPT0gImNwcCIgXQorICAgICAgdGhlbgorICAgICAgIworICAgICAgIyBDL0MrKyBmaWxlcworICAgICAgIworICAgICAgZWNobyAtbmUgIlVwZGF0aW5nICckZmlsZScsIHR5cGUgPSBjL2MrKyAuLi4gIgorICAgICAgY2F0ICRwYXRoIHwgcGVybCAke1BST0pST09UfS90b29scy9jb3B5cmlnaHRfdG9vbHMvc3RyaXBfY19jb3B5cmlnaHQucGwgPiAkcGF0aCJfY3J0ZW1wIjsKKyAgICAgIHBlcmwgJHtQUk9KUk9PVH0vdG9vbHMvY29weXJpZ2h0X3Rvb2xzL2luc2VydF9jb3B5cmlnaHQucGwgLXQgYyAtbCAke0NPUFlSSUdIVF9GSUxFfSAkcGF0aCJfY3J0ZW1wIiA+ICRwYXRoOworICAgICAgcm0gJHBhdGgiX2NydGVtcCIKKyAgICAgIGVjaG8gImRvbmUuIgorICBlbGlmIFsgIiRmaWxlX2V4dCIgPT0gInNoIiBdCisgICAgICB0aGVuCisgICAgICAjCisgICAgICAjIFNoZWxsIHNjcmlwdCBmaWxlcworICAgICAgIworICAgICAgZWNobyAtbmUgIlVwZGF0aW5nICckZmlsZScsIHR5cGUgPSBzaGVsbCBzY3JpcHQgLi4uICIKKyAgICAgIGNhdCAkcGF0aCB8IHBlcmwgJHtQUk9KUk9PVH0vdG9vbHMvY29weXJpZ2h0X3Rvb2xzL3N0cmlwX3NoX2NvcHlyaWdodC5wbCA+ICRwYXRoIl9jcnRlbXAiOworICAgICAgcGVybCAke1BST0pST09UfS90b29scy9jb3B5cmlnaHRfdG9vbHMvaW5zZXJ0X2NvcHlyaWdodC5wbCAtdCBzIC1sICR7Q09QWVJJR0hUX0ZJTEV9ICRwYXRoIl9jcnRlbXAiID4gJHBhdGg7CisgICAgICBybSAkcGF0aCJfY3J0ZW1wIgorICAgICAgZWNobyAiZG9uZS4iCisgIGVsaWYgWyAiJGZpbGUiID09ICJNYWtlZmlsZSIgXSB8fCBbICIkZmlsZSIgPT0gIk1ha2VmaWxlLnNkayIgXSB8fCBbICIkZmlsZV9leHQiID09ICJtayIgXQorICAgICAgdGhlbgorICAgICAgIworICAgICAgIyBNYWtlZmlsZXMKKyAgICAgICMKKyAgICAgIGVjaG8gLW5lICJVcGRhdGluZyAnJGZpbGUnLCB0eXBlID0gTWFrZWZpbGUgLi4uICIKKyAgICAgIGNhdCAkcGF0aCB8IHBlcmwgJHtQUk9KUk9PVH0vdG9vbHMvY29weXJpZ2h0X3Rvb2xzL3N0cmlwX3NoX2NvcHlyaWdodC5wbCA+ICRwYXRoIl9jcnRlbXAiOworICAgICAgcGVybCAke1BST0pST09UfS90b29scy9jb3B5cmlnaHRfdG9vbHMvaW5zZXJ0X2NvcHlyaWdodC5wbCAtdCBtIC1sICR7Q09QWVJJR0hUX0ZJTEV9ICRwYXRoIl9jcnRlbXAiID4gJHBhdGg7CisgICAgICBybSAkcGF0aCJfY3J0ZW1wIgorICAgICAgZWNobyAiZG9uZS4iCisgIGVsc2UKKyAgICAgIGVjaG8gIlNraXBwaW5nICRmaWxlLCB0eXBlID0gdW5rbm93biB0eXBlIgorICBmaQorZG9uZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWEyNmVmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTY2IEBACisjIENlbnRyYWwgTWFrZWZpbGUKKyMKK1BMQVRGT1JNID89IG1hcGxlCitUT1BfRElSPSQoc2hlbGwgcHdkKQorZXhwb3J0IFBMQVRGT1JNCitleHBvcnQgVE9QX0RJUgorCitpZmVxICgiJChQTEFURk9STSkiLCAibWFwbGUiKQorICAgIERFVklDRT1iY202ODYyMAorICAgIGV4cG9ydCBERVZJQ0UKK2Vsc2UKKyAgICAkKGVycm9yIFNldCBERVZJQ0UgZm9yICQoUExBVEZPUk0pKQorZW5kaWYKKworTUFLRV9ESVI9JChUT1BfRElSKS9tYWtlCitNQUtFX0RFVklDRV9ESVI9JChNQUtFX0RJUikvJChERVZJQ0UpCitleHBvcnQgTUFLRV9ESVIKK2V4cG9ydCBNQUtFX0RFVklDRV9ESVIKKworaW5jbHVkZSAkKE1BS0VfRElSKS9NYWtlZmlsZS5pbml0aWFsX2NvbmZpZworT1VUX0RJUiAgICAgICAgICA/PSAkKFRPUF9ESVIpL2J1aWxkCitPVVRfRE9DU19ESVIJID89ICQoT1VUX0RJUikvZG9jCisKKyMgSWRlbnRpZnkgd2hldGhlciBpdCBpcyBjdXN0b21lciBvciBkZXZlbG9wbWVudCBidWlsZAorRU1CX01PRFVMRV9MSVNUPSQocmVhbHBhdGggJChNQUtFX0RFVklDRV9ESVIpL21vZHVsZXMuZW1iZWRkZWQpCitpZmVxICgiJChFTUJfTU9EVUxFX0xJU1QpIiwgIiIpCisgICAgUkVMRUFTRV9CVUlMRD15CisgICAgZXhwb3J0IFJFTEVBU0VfQlVJTEQKKyAgICBVU0VfTElOVD1uCisgICAgZXhwb3J0IFVTRV9MSU5UCisgICAgT1VUX0hPU1RfRElSIAkgPz0gJChPVVRfRElSKQorICAgIENPUFlfRlNfU0gJCSA9ICQoVE9QX0RJUikvbWFrZS9jb3B5X2hvc3RfZnMuc2ggCitlbHNlCisgICAgT1VUX0hPU1RfRElSIAkgPz0gJChPVVRfRElSKS8kKFBMQVRGT1JNKS9ob3N0CisgICAgT1VUX0VNQkVEREVEX0RJUiA/PSAkKE9VVF9ESVIpLyQoUExBVEZPUk0pL2VtYmVkZGVkCisgICAgQ09QWV9GU19TSAkJID0gJChUT1BfRElSKS9zY3JpcHRzL2NvcHlfaG9zdF9mcy5zaCAKKyAgICBleHBvcnQgT1VUX0VNQkVEREVEX0RJUgorZW5kaWYKKworaWZuZXEgKCIkKEJPQVJEKSIsICIiKQorICAgIENPUFlfSE9TVF9GU19DTUQgPSAkKFNJTEVOVF9CVUlMRCkkKENPUFlfRlNfU0gpIFRPUF9ESVI9JChUT1BfRElSKSBPVVRfSE9TVF9ESVI9JChPVVRfSE9TVF9ESVIpCitlbmRpZgorCitleHBvcnQgT1VUX0hPU1RfRElSCitleHBvcnQgT1VUX0RPQ1NfRElSCisKKyMgTGlzdCBvZiBhbGwgbW9kdWxlcywgYWxsIGxpYnJhcnkgbW9kdWxlcyBhbmQgYWxsIGFwcGxpY2F0aW9uIG1vZHVsZXMKK2V4cG9ydCBBTExfTU9EVUxFUworZXhwb3J0IEFMTF9MSUJfTU9EVUxFUworZXhwb3J0IEFMTF9BUFBfTU9EVUxFUworCisjIEN1cnJlbnQgYm9hcmQKK2V4cG9ydCBCT0FSRAorCitWID89IDAKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJU0lMRU5UID0gLXMKKwlleHBvcnQgU0lMRU5UCisJU0lMRU5UX0JVSUxEPUAKK2VuZGlmCisKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorYWxsOiBidWlsZF9ob3N0CitlbHNlCithbGw6IGJ1aWxkX2hvc3QgYnVpbGRfZW1iZWRkZWQKK2VuZGlmCisJJChDT1BZX0hPU1RfRlNfQ01EKQorCUBlY2hvIC0tLSBBbGwgZG9uZSAtLS0gICAgCisKK2NvcHlfaG9zdF9mczoKKwkkKENPUFlfSE9TVF9GU19DTUQpCisKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorY2xlYW46IGNsZWFuX2hvc3QKK2Vsc2UKK2NsZWFuOiBjbGVhbl9ob3N0IGNsZWFuX2VtYmVkZGVkCitlbmRpZgorCXJtIC1mciAkKE9VVF9ESVIpCisKK2hlbHBfZ2VuZXJhbDoKKwlAZWNobyAibWFrZSBwYXJhbWV0ZXJzOiIKKwlAZWNobyAiICAgUExBVEZPUk0gICAgICAgICAgLSBwbGF0Zm9ybSB0byBwZXJmb3JtIHRoZSBidWlsZCBmb3IuIFRoZSBkZWZhdWx0IHBsYXRmb3JtIGlzICQkUExBVEZPUk0iCisJQGVjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydGVkIHBsYXRmb3JtcyBhcmU6IG1hcGxlIgorCUBlY2hvICIgICBCT0FSRCAgICAgICAgICAgICAtIFRCRCBib2FyZCIKKwlAZWNobyAiICAgRU5BQkxFX0VQT04gICAgICAgLSBJbmNsdWRlIEVQT04vMTBHRVBPTiBzdXBwb3J0LiBEZWZhdWx0ID15LCB1bmxlc3Mgb3ZlcndyaXR0ZW4gaW4gcGxhdGZvcm0gY29uZmlndXJhdGlvbiIKKwlAZWNobyAiICAgRU5BQkxFX0dQT04gICAgICAgLSBJbmNsdWRlIEdQT04gc3VwcG9ydC4gRGVmYXVsdCA9eSwgdW5sZXNzIG92ZXJ3cml0dGVuIGluIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24iCisJQGVjaG8gIiAgIEVOQUJMRV9YR1BPTiAgICAgIC0gSW5jbHVkZSBYR1BPTiBzdXBwb3J0LiBEZWZhdWx0ID15LCB1bmxlc3Mgb3ZlcndyaXR0ZW4gaW4gcGxhdGZvcm0gY29uZmlndXJhdGlvbiIKKwlAZWNobyAiICAgVj08b3V0cHV0X2xldmVsPiAgLSA9MS12ZXJib3NlIGNvbW1hbmQgb3V0cHV0LCA9Mi1tYWtlZmlsZSBkZWJ1ZyBvdXRwdXQiCisJQGVjaG8gIiAgIEdFTl9PQkpUQUdTICAgICAgIC0gTG93LWxldmVsIG9wdGlvbi4gT0JHVEFHUyB0byBiZSBwYXNzZWQgdG8gY29kZSBnZW5lcmF0b3IiCisJQGVjaG8gIiAgIEVYVFJBX1RZUEVTICAgICAgIC0gTG93LWxldmVsIG9wdGlvbi4gU3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgZXh0cmEgdHlwZXMgd2l0aG91dCBiY21vbHRfIHByZWZpeCIKKwlAZWNobyAiICAgRU5BQkxFX0NMSSAgICAgICAgLSA9bi1leGNsdWRlIENMSSBzdXBwb3J0LiBJbmNsdWRlZCBieSBkZWZhdWx0IgorCUBlY2hvICIgICBFTkFCTEVfTE9HICAgICAgICAtID1uLWV4Y2x1ZGUgZGV2X2xvZyBzdXBwb3J0LiBJbmNsdWRlZCBieSBkZWZhdWx0IgorCUBlY2hvICJtYWtlIHRhcmdldHM6IgorCUBlY2hvICIgICBhbGwgICAgICAgICAgICAgICAtIGJ1aWxkIGV2ZXJ5dGhpbmcgZm9yIHRoZSBQTEFURk9STS4gVGhpcyBpcyB0aGUgZGVmYXVsdCB0YXJnZXQiCisJQGVjaG8gIiAgIGhvc3QgICAgICAgICAgICAgIC0gYnVpbGQgUExBVEZPUk0ncyBob3N0IHNpZGUiCisJQGVjaG8gIiAgIGVtYmVkZGVkICAgICAgICAgIC0gYnVpbGQgUExBVEZPUk0ncyBlbWJlZGRlZCBzaWRlIgorCUBlY2hvICIgICBjbGVhbiAgICAgICAgICAgICAtIGNsZWFuIGV2ZXJ5dGhpbmcgZm9yIHRoZSBQTEFURk9STSIKKwlAZWNobyAiICAgY2xlYW5faG9zdCAgICAgICAgLSBjbGVhbiBQTEFURk9STSdzIGhvc3Qgc2lkZSIKKwlAZWNobyAiICAgY2xlYW5fZW1iZWRkZWQgICAgLSBjbGVhbiBQTEFURk9STSdzIGVtYmVkZGVkIHNpZGUiCisJQGVjaG8gIiAgIGRvY3MgICAgICAgICAgICAgIC0gZ2VuZXJhdGUgcmVmZXJlbmNlIGRvY3VtZW50IGluIGh0bWwgZm9ybWF0IgorCUBlY2hvICIgICBkb2NzX3BkZiAgICAgICAgICAtIGdlbmVyYXRlIHJlZmVyZW5jZSBkb2N1bWVudCBpbiBwZGYgZm9ybWF0IgorCUBlY2hvICIgICBkcml2ZXJzICAgICAgICAgICAtIGdlbmVyYXRlIGxpYnJkYiwgcnVfZ2VuIGFuZCBoYWxfZ2VuZXJhdG9yIGRyaXZlciBsYXllcnMiCisJQGVjaG8gIiAgIGNsZWFuX2RyaXZlcnMgICAgIC0gY2xlYW4gbGlicmRiLCBydV9nZW4gYW5kIGhhbF9nZW5lcmF0b3IiCisKKworaWZlcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCitoZWxwOiBoZWxwX2dlbmVyYWwgaGVscF9ob3N0CitlbHNlCitoZWxwOiBoZWxwX2dlbmVyYWwgaGVscF9ob3N0IGhlbHBfZW1iZWRkZWQKK2VuZGlmCisJCitkb2NzOiBkb2NzX2hvc3QKKwkKK2RvY3NfaG9zdDoKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpIFNVQlNZU1RFTT1ob3N0IC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLm1haW4gJEAKKworZG9jc19wZGY6IGRvY3MKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpIC1DICQoT1VUX0RPQ1NfRElSKS9sYXRleAorCitkb2NzX2NsZWFuOgorCSQoU0lMRU5UX0JVSUxEKSQoQk9MRF9QUklOVCkgIkNsZWFuaW5nIGRvY3MiCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoT1VUX0RPQ1NfRElSKQorCitjbG9iYmVyOiBjbGVhbiBkb2NzX2NsZWFuCisKK2hvc3Q6IGJ1aWxkX2hvc3QKKwkkKENPUFlfSE9TVF9GU19DTUQpCisKK2NsZWFuX2hvc3Q6CisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoT1VUX0hPU1RfRElSKQorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgJChTSUxFTlQpIFNVQlNZU1RFTT1ob3N0IC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLm1haW4gJEAKKworJV9ob3N0OgorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgJChTSUxFTlQpIFNVQlNZU1RFTT1ob3N0IC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLm1haW4gJEAKKworaWZuZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorZW1iZWRkZWQ6IGJ1aWxkX2VtYmVkZGVkCisJJChDT1BZX0hPU1RfRlNfQ01EKQorCQorY2xlYW5fZW1iZWRkZWQ6CisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoT1VUX0VNQkVEREVEX0RJUikKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpICQoU0lMRU5UKSBTVUJTWVNURU09ZW1iZWRkZWQgLWYgJChNQUtFX0RJUikvTWFrZWZpbGUubWFpbiAkQAorCitkb2NzX2VtYmVkZGVkOgorCislX2VtYmVkZGVkOgorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgJChTSUxFTlQpIFNVQlNZU1RFTT1lbWJlZGRlZCAtZiAkKE1BS0VfRElSKS9NYWtlZmlsZS5tYWluICRACisKK2VuZGlmCisJCisKK2hhbF9nZW5lcmF0b3I6CisJJChTSUxFTlRfQlVJTEQpJChNQUtFKSAkKFNMSUVOVCkgLUMgJChUT1BfRElSKS9lbWJlZGRlZC9oYWxfZ2VuZXJhdG9yL3NyYworCitkcml2ZXJzOgorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgJChTTElFTlQpIC1DICQoVE9QX0RJUikvZW1iZWRkZWQvaGFsX2dlbmVyYXRvci9saWJyZGIKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpICQoU0xJRU5UKSAtQyAkKFRPUF9ESVIpL2VtYmVkZGVkL2hhbF9nZW5lcmF0b3IvcnVfZ2VuCisJJChTSUxFTlRfQlVJTEQpJChNQUtFKSAkKFNMSUVOVCkgLUMgJChUT1BfRElSKS9lbWJlZGRlZC9wbV9kcnZfZ2VuZXJhdG9yCisKKworY2xlYW5fZHJpdmVyczoKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpICQoU0xJRU5UKSAtQyAkKFRPUF9ESVIpL2VtYmVkZGVkL2hhbF9nZW5lcmF0b3IvbGlicmRiIGNsZWFuIAorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgJChTTElFTlQpIC1DICQoVE9QX0RJUikvZW1iZWRkZWQvaGFsX2dlbmVyYXRvci9ydV9nZW4gY2xlYW4KKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpICQoU0xJRU5UKSAtQyAkKFRPUF9ESVIpL2VtYmVkZGVkL2hhbF9nZW5lcmF0b3Ivc3JjIGNsZWFuCisJJChTSUxFTlRfQlVJTEQpJChNQUtFKSAkKFNMSUVOVCkgLUMgJChUT1BfRElSKS9lbWJlZGRlZC9wbV9kcnZfZ2VuZXJhdG9yIGNsZWFuCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9kb2NzLzY4NjIwLVNXUk4xMTYtU1dSRFMucGRmIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2RvY3MvNjg2MjAtU1dSTjExNi1TV1JEUy5wZGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWY1NDUzMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9kb2NzLzY4NjIwLVNXUk4xMTYtU1dSRFMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9iY202ODYyMF9hcHBsLmJpbiBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9iY202ODYyMF9hcHBsLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjBkMDNlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2VtYmVkZGVkX2JpbmFyaWVzL2JjbTY4NjIwX2FwcGwuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9iY202ODYyMF9ib290LmJpbiBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9iY202ODYyMF9ib290LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmE2NTBkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2VtYmVkZGVkX2JpbmFyaWVzL2JjbTY4NjIwX2Jvb3QuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9saWNlbnNlLnR4dCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9saWNlbnNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNmQyMWU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2VtYmVkZGVkX2JpbmFyaWVzL2xpY2Vuc2UudHh0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKyAKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIAorRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyAKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisgCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyAKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9hcGlfbGludXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE2MTdiNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIHV0aWxpdGllcyBhcyBsaW51eCBtb2R1bGUKKyMKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCitNT0RfTkFNRSA9IGFwaV9saW51eAorTU9EX1RZUEUgPSBsaW51eF9saWIKK01PRF9ERVBTID0gdXRpbHNfbGludXggc3lzbW9kZWwKK3NyY3MgPSBiY21vbHRfbXNnLmMKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2FwaV9saW51eC9iY21vbHRfYXBpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2FwaV9saW51eC9iY21vbHRfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGFlYTIxOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L2JjbW9sdF9hcGkuYwpAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci9hcGkvYmNtb2x0X2FwaS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9hcGlfbGludXgvYmNtb2x0X2FwaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9hcGlfbGludXgvYmNtb2x0X2FwaS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZlNTNlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2FwaV9saW51eC9iY21vbHRfYXBpLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9hcGkuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L2JjbW9sdF9tc2cuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L2JjbW9sdF9tc2cuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jMzg3NWYzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9hcGlfbGludXgvYmNtb2x0X21zZy5jCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfbXNnLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2FwaV9saW51eC9iY21vbHRfbXNnLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2FwaV9saW51eC9iY21vbHRfbXNnLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTQ2YTc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L2JjbW9sdF9tc2cuaApAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci9hcGkvYmNtb2x0X21zZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2JvYXJkL3dyeC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2QxZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIyBNYXBsZSBib2FyZCBzcGVjaWZpYyBjb25maWd1cmF0aW9ucy4gUmVsZXZhbnQgb25seSBpZiB3b3JraW5nIGluIExpbnV4CisjCitNT0RfVFlQRSA9IGxpYgorTU9EX05BTUUgPSBiY21fYm9hcmQKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKworTU9EX0RFUFMgPSBjbGkgaTJjX2RldnMgYXBpX2NsaSBiY21fZGV2X2N0cmxfbGludXgKKworc3JjcyA9IGJjbW9sdF9ib2FyZC5jIGJjbW9sdF9ib2FyZF9jbGkuYworZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvYmNtb2x0X2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5YzVmOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZC5jCkBAIC0wLDAgKzEsNzAyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9pMmNfZGV2c19pb2N0bC5oPgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfY3RybF9pb2N0bC5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21vbHRfZmxkLmg+CisjaW5jbHVkZSAiYmNtb2x0X2JvYXJkLmgiCisjaW5jbHVkZSAiYmNtb2x0X2RwbGxfdGFibGUuaCIKKworI2RlZmluZSBCQ01fSTJDX0RFVl9BRERSX1NUQVJUIHR5cGVkZWYgZW51bSB7CisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFIobmFtZSwgZGVzYywgdmFsKSBuYW1lID0gdmFsLAorI2RlZmluZSBCQ01fSTJDX0RFVl9BRERSX0VORCB9IGJjbV9pMmNfZGV2X2FkZHI7CisKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0ZQR0FfVkVSU0lPTiAweDAKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0JPQVJEX0NPTkYgMHgxCisjZGVmaW5lIEJDTV9GUEdBX1JFR19SRVNFVFMgMHgyCisvKiBFbmFibGUvZGlzYWJsZSB0cmFuc2NlaXZlciAqLworI2RlZmluZSBCQ01fRlBHQV9SRUdfVFJYX0VOQUJMRSAweDMKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX1RSWF9GQUlMIDB4NAorLyogSXMgdHJhbnNjZWl2ZXIgcHJlc2VudCA/ICovCisjZGVmaW5lIEJDTV9GUEdBX1JFR19UUlhfSVNfUFJFU0VOVCAweDUKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0NYUF9DT05UUk9MUyAweDYKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX1NISUZUX1JFR0lTVEVSX0RBVEEgMHg3CisjZGVmaW5lIEJDTV9GUEdBX1JFR19TSElGVF9SRUdJU1RFUl9DT05UUk9MIDB4OAorI2RlZmluZSBCQ01fRlBHQV9SRUdfTEVEUyAweDkKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0RFQlVHX0xFRFMgMHhBCisjZGVmaW5lIEJDTV9GUEdBX1JFR19HUElPX0RJUiAweEIKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0dQSU9fSU5QVVQgMHhDCisjZGVmaW5lIEJDTV9GUEdBX1JFR19HUElPX09VVFBVVCAweEQKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0dQSU9fSVJRIDB4RQorCisjZGVmaW5lIEJDTV9GUEdBX1JFR19MT1cgQkNNX0ZQR0FfUkVHX0ZQR0FfVkVSU0lPTgorI2RlZmluZSBCQ01fRlBHQV9SRUdfSElHSCBCQ01fRlBHQV9SRUdfR1BJT19JUlEKKworI2RlZmluZSBCQ01fUlNUX0JJVF9ERVZJQ0UgMHgwCisjZGVmaW5lIEJDTV9SU1RfQklUX1BPTl9EUExMIDB4MQorI2RlZmluZSBCQ01fUlNUX0JJVF9QTV9EUExMIDB4MgorI2RlZmluZSBCQ01fUlNUX0JJVF9LVDIgMHg0CisKKyNkZWZpbmUgU1ZLNF9JREVOVF9GSUxFICAgICAgICAgICAgICAgICAiL2V0Yy9zdms0IgorCisjaW5jbHVkZSA8YmNtb2x0X2kyY19kZXZzX2FkZHIuaD4KKworI2RlZmluZSBNQVhfQ01EX1NUUl9MRU4gMTAyNAorCisvKiBTaW5jZSB0aGUgYm9hcmQgZHJpdmVyIGNvbmZpZ3VyYXRpb24gaXMgc3BlY2lmaWMgZm9yIExpbnV4LCB0aGVyZSBpcyBubyBwb2ludCB1c2luZyBPUyBhYnN0cmFjdGlvbiBsYXllciB0byBwZXJmb3JtIG9wZXJhdGlvbnMgbGlrZSBpb2N0bCgpLiAqLworCitzdGF0aWMgaW50IG1hcGxlX2kyY19mZDsKK3N0YXRpYyBpbnQgbWFwbGVfZGV2X2N0cmxfZmQ7CisKK3N0YXRpYyBiY21vc19ib29sIGJjbV9ib2FyZF9pc19zdms0KHZvaWQpCit7CisgICAgYmNtb3NfYm9vbCBpc19zdms0ID0gQkNNT1NfRkFMU0U7CisgICAgRklMRSAqZiA9IGZvcGVuKFNWSzRfSURFTlRfRklMRSwgInIiKTsKKyAgICBpZiAoZikKKyAgICB7CisgICAgICAgIGlzX3N2azQgPSBCQ01PU19UUlVFOworICAgICAgICBmY2xvc2UoZik7CisgICAgfQorICAgIHJldHVybiBpc19zdms0OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2FjY2Vzc19mcGdhKHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgaWYgKGJjbV9ib2FyZF9pc19zdms0KCkpCisgICAgeworICAgICAgICByYyA9IGJjbV9ib2FyZF9kZXZfY2hhbmdlKEkyQ19TVzFfSTJDX0FERFIpOworICAgICAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2JvYXJkX2Rldl9jaGFuZ2UoSTJDX1NXMV9JMkNfQUREUikgZmFpbGVkXG4iKTsKKyAgICAgICAgcmMgPSBiY21fYm9hcmRfc3dpdGNoX3dyaXRlKDB4NCk7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfc3dpdGNoX3dyaXRlKDEpIGZhaWxlZFxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gYmNtX2JvYXJkX2Rldl9jaGFuZ2UoSTJDX1NXMF9JMkNfQUREUik7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZGV2X2NoYW5nZShJMkNfU1cwX0kyQ19BRERSKSBmYWlsZWRcbiIpOworICAgICAgICByYyA9IGJjbV9ib2FyZF9zd2l0Y2hfd3JpdGUoMSk7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfc3dpdGNoX3dyaXRlKDEpIGZhaWxlZFxuIik7CisgICAgfQorICAgIHJjID0gYmNtX2JvYXJkX2Rldl9jaGFuZ2UoRlBHQV9JMkNfQUREUik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjLCByYywgImJjbV9ib2FyZF9kZXZfY2hhbmdlKEZQR0FfSTJDX0FERFIpIGZhaWxlZCBcbiIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9kZXZfY2hhbmdlKHVpbnQzMl90IGFkZHIpCit7CisgICAgaW50IHJjOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmFkZHIgPSBhZGRyLAorICAgIH07CisKKyAgICByYyA9IGlvY3RsKG1hcGxlX2kyY19mZCwgTUFQTEVfSTJDX0lPQ1RMX09QX0RFVl9DSEFOR0UsICZwYXJhbXMpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIGZhaWxlZCBmb3IgbWFwbGVfaTJjX2ZkXG4iKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfZGV2X3dyaXRlKHVpbnQzMl90IGNvdW50LCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgaW50IHJjOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmNvdW50ID0gY291bnQsCisgICAgICAgIC5hZGRyID0gYWRkciwKKyAgICAgICAgLnZhbCA9IHZhbCwKKyAgICB9OworCisgICAgcmMgPSBpb2N0bChtYXBsZV9pMmNfZmQsIE1BUExFX0kyQ19JT0NUTF9PUF9ERVZfV1JJVEUsICZwYXJhbXMpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIGZhaWxlZCBmb3IgbWFwbGVfaTJjX2ZkXG4iKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfZGV2X3JlYWQodWludDMyX3QgY291bnQsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90ICp2YWwpCit7CisgICAgaW50IHJjOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmNvdW50ID0gY291bnQsCisgICAgICAgIC5hZGRyID0gYWRkciwKKyAgICB9OworCisgICAgcmMgPSBpb2N0bChtYXBsZV9pMmNfZmQsIE1BUExFX0kyQ19JT0NUTF9PUF9ERVZfUkVBRCwgJnBhcmFtcyk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjLCBCQ01fRVJSX0lOVEVSTkFMLCAiaW9jdGwgZmFpbGVkIGZvciBtYXBsZV9pMmNfZmRcbiIpOworICAgICp2YWwgPSBwYXJhbXMudmFsOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9zd2l0Y2hfd3JpdGUodWludDMyX3QgdmFsKQoreworICAgIGludCByYzsKKyAgICBtYXBsZV9pMmNfaW9jdGxfcGFyYW0gcGFyYW1zID0KKyAgICB7CisgICAgICAgIC52YWwgPSB2YWwsCisgICAgfTsKKworICAgIHJjID0gaW9jdGwobWFwbGVfaTJjX2ZkLCBNQVBMRV9JMkNfSU9DVExfT1BfU1dJVENIX1dSSVRFLCAmcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCBmYWlsZWQgZm9yIG1hcGxlX2kyY19mZFxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3N3aXRjaF9yZWFkKHVpbnQzMl90ICp2YWwpCit7CisgICAgaW50IHJjOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPSB7fTsKKworICAgIHJjID0gaW9jdGwobWFwbGVfaTJjX2ZkLCBNQVBMRV9JMkNfSU9DVExfT1BfU1dJVENIX1JFQUQsICZwYXJhbXMpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIGZhaWxlZCBmb3IgbWFwbGVfaTJjX2ZkXG4iKTsKKyAgICAqdmFsID0gcGFyYW1zLnZhbDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV93cml0ZSh1aW50MzJfdCBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgaW50IHJjOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmFkZHIgPSBhZGRyLAorICAgICAgICAudmFsID0gdmFsLAorICAgIH07CisKKyAgICByYyA9IGlvY3RsKG1hcGxlX2kyY19mZCwgTUFQTEVfSTJDX0lPQ1RMX09QX0ZQR0FfV1JJVEUsICZwYXJhbXMpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIGZhaWxlZCBmb3IgZnBnYV93cml0ZVxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2hvc3RfZXZlbnRfd3JpdGUodWludDMyX3QgdmFsKQoreworICAgIGludCByYzsKKyAgICBkZXZfY3RybF9pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmV2ZW50ID0gdmFsLAorICAgIH07CisKKyAgICByYyA9IGlvY3RsKG1hcGxlX2Rldl9jdHJsX2ZkLCBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9IT1NUX0VWRU5UX1dSSVRFLCAmcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCBmYWlsZWQgZm9yIGhvc3RfZXZlbnRfd3JpdGVcbiIpOworCisjaWZkZWYgQ09ORklHX09OVV9TSU0KKyAgICAvKiBSYWlzZSBhbiBpbnRlcnJ1cHQgb24gZXh0X2lycTEgZm9yIHRoZSBlbWJlZGRlZCBzaWRlLiAqLworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2FfZ2VuX2dwaW9faXJxKEJDTU9MVF9FWFRfSVJRX0VYVF9JUlExKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCBmYWlsZWQgZm9yIGJjbV9ib2FyZF9mcGdhX2dlbl9ncGlvX2lycVxuIik7CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfcGNpX2RlYnVnKHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgY29tbWFuZCwgaW50MzJfdCBzdGFydCwgaW50MzJfdCBob3dtYW55LCB1aW50MzJfdCAqZHVtcHB0cikKK3sKKyAgICBpbnQgcmM7CisgICAgZGV2X2N0cmxfaW9jdGxfcGFyYW0gcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5kZXZpY2UgPSBkZXZpY2UsCisgICAgICAgIC5kdW1wcHRyID0gZHVtcHB0ciwKKyAgICAgICAgLnN0YXJ0X2luZGV4ID0gc3RhcnQsCisgICAgICAgIC5ob3dtYW55ID0gaG93bWFueQorICAgIH07CisKKyAgICByYyA9IGlvY3RsKG1hcGxlX2Rldl9jdHJsX2ZkLCBjb21tYW5kLCAmcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCBmYWlsZWQgZm9yIGRldl9jdHJsXG4iKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2FfcmVhZCh1aW50MzJfdCBhZGRyLCB1aW50MzJfdCAqdmFsKQoreworICAgIGludCByYzsKKyAgICBtYXBsZV9pMmNfaW9jdGxfcGFyYW0gcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5hZGRyID0gYWRkciwKKyAgICB9OworCisgICAgcmMgPSBpb2N0bChtYXBsZV9pMmNfZmQsIE1BUExFX0kyQ19JT0NUTF9PUF9GUEdBX1JFQUQsICZwYXJhbXMpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIGZhaWxlZCBmb3IgZnBnYV9yZWFkXG4iKTsKKyAgICAqdmFsID0gcGFyYW1zLnZhbDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV9yZWdfcmVhZCh1aW50MzJfdCByZWcsIHVpbnQzMl90ICp2YWwpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAocmVnID4gQkNNX0ZQR0FfUkVHX0hJR0gpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgcmMgPSBiY21fYWNjZXNzX2ZwZ2EoKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2ZwZ2FfcmVhZChyZWcsIHZhbCk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3JlZ193cml0ZSh1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmIChyZWcgPiBCQ01fRlBHQV9SRUdfSElHSCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIHJldHVybiBiY21fYm9hcmRfZnBnYV93cml0ZShyZWcsIHZhbCk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3ZlcnNpb25fZ2V0KHVpbnQzMl90ICp2ZXJzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBiY21fYWNjZXNzX2ZwZ2EoKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2ZwZ2FfcmVhZChCQ01fRlBHQV9SRUdfRlBHQV9WRVJTSU9OLCB2ZXJzaW9uKTsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2Ffc2V0X2dwaW9fZGlyKGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiwgYmNtX2ZwZ2FfZ3Bpb19kaXIgZGlyKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHVpbnQzMl90IGdwaW9fZGlyX21hc2s7CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIC8qIFJlYWQtbW9kaWZ5LXdyaXRlIGRpcmVjdGlvbiByZWdpc3RlciAod2UgZG9uJ3Qgd2FudCB0byBhZmZlY3Qgb3RoZXIgR1BJTydzKS4gKi8KKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWQoQkNNX0ZQR0FfUkVHX0dQSU9fRElSLCAmZ3Bpb19kaXJfbWFzayk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworICAgIGlmIChkaXIgPT0gQkNNX0ZQR0FfR1BJT19ESVJfSU5QVVQpCisgICAgICAgIGdwaW9fZGlyX21hc2sgJj0gfigxIDw8IChncGlvX3BpbiAtIEJDTU9MVF9HUElPX1BJTl9QSU40KSk7CisgICAgZWxzZQorICAgICAgICBncGlvX2Rpcl9tYXNrIHw9ICgxIDw8IChncGlvX3BpbiAtIEJDTU9MVF9HUElPX1BJTl9QSU40KSk7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2ZwZ2Ffd3JpdGUoQkNNX0ZQR0FfUkVHX0dQSU9fRElSLCBncGlvX2Rpcl9tYXNrKTsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2FfZ2V0X2dwaW9fZGlyKGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiwgYmNtX2ZwZ2FfZ3Bpb19kaXIgKmRpcikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCBncGlvX2Rpcl9tYXNrOworCisgICAgcmMgPSBiY21fYWNjZXNzX2ZwZ2EoKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWQoQkNNX0ZQR0FfUkVHX0dQSU9fRElSLCAmZ3Bpb19kaXJfbWFzayk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgKmRpciA9IChncGlvX2Rpcl9tYXNrICYgKDEgPDwgKGdwaW9fcGluIC0gQkNNT0xUX0dQSU9fUElOX1BJTjQpKSkgPyBCQ01fRlBHQV9HUElPX0RJUl9PVVRQVVQgOiBCQ01fRlBHQV9HUElPX0RJUl9JTlBVVDsKKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2Ffd3JpdGVfZ3BpbyhiY21vbHRfZ3Bpb19waW4gZ3Bpb19waW4sIHVpbnQzMl90IHZhbCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCBncGlvX3dyaXRlX21hc2s7CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIC8qIFJlYWQtbW9kaWZ5LXdyaXRlIGRpcmVjdGlvbiByZWdpc3RlciAod2UgZG9uJ3Qgd2FudCB0byBhZmZlY3Qgb3RoZXIgR1BJTydzKS4gKi8KKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWQoQkNNX0ZQR0FfUkVHX0dQSU9fT1VUUFVULCAmZ3Bpb193cml0ZV9tYXNrKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisgICAgaWYgKCF2YWwpCisgICAgICAgIGdwaW9fd3JpdGVfbWFzayAmPSB+KDEgPDwgKGdwaW9fcGluIC0gQkNNT0xUX0dQSU9fUElOX1BJTjQpKTsKKyAgICBlbHNlCisgICAgICAgIGdwaW9fd3JpdGVfbWFzayB8PSAoMSA8PCAoZ3Bpb19waW4gLSBCQ01PTFRfR1BJT19QSU5fUElONCkpOworCisgICAgcmV0dXJuIGJjbV9ib2FyZF9mcGdhX3dyaXRlKEJDTV9GUEdBX1JFR19HUElPX09VVFBVVCwgZ3Bpb193cml0ZV9tYXNrKTsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2FfcmVhZF9ncGlvKGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiwgdWludDMyX3QgKnZhbCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCBncGlvX3JlYWRfbWFzazsKKworICAgIHJjID0gYmNtX2FjY2Vzc19mcGdhKCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgcmMgPSBiY21fYm9hcmRfZnBnYV9yZWFkKEJDTV9GUEdBX1JFR19HUElPX0lOUFVULCAmZ3Bpb19yZWFkX21hc2spOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgICp2YWwgPSAoZ3Bpb19yZWFkX21hc2sgJiAoMSA8PCAoZ3Bpb19waW4gLSBCQ01PTFRfR1BJT19QSU5fUElONCkpKTsKKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2FfZ2VuX2dwaW9faXJxKGJjbW9sdF9leHRfaXJxIGV4dF9pcnEpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgdWludDMyX3QgZ3Bpb19pcnFfbWFzazsKKworICAgIHJjID0gYmNtX2FjY2Vzc19mcGdhKCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgLyogUmVhZC1tb2RpZnktd3JpdGUgZGlyZWN0aW9uIHJlZ2lzdGVyICh3ZSBkb24ndCB3YW50IHRvIGFmZmVjdCBvdGhlciBHUElPJ3MpLiAqLworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2FfcmVhZChCQ01fRlBHQV9SRUdfR1BJT19JUlEsICZncGlvX2lycV9tYXNrKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICBncGlvX2lycV9tYXNrIHw9ICgxIDw8IGV4dF9pcnEpOworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2Ffd3JpdGUoQkNNX0ZQR0FfUkVHX0dQSU9fSVJRLCBncGlvX2lycV9tYXNrKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICBiY21vc191c2xlZXAoMTAwMCk7CisKKyAgICBncGlvX2lycV9tYXNrICY9IH4oMSA8PCBleHRfaXJxKTsKKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3dyaXRlKEJDTV9GUEdBX1JFR19HUElPX0lSUSwgZ3Bpb19pcnFfbWFzayk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF90cnhfcHJlc2VudCh1aW50OF90IHBvbikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCB0cnhfYWJzZW5jZV9tYXNrOworCisgICAgcmMgPSBiY21fYWNjZXNzX2ZwZ2EoKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSB0cmFuc2NlaXZlciBpcyBwcmVzZW50IChwbHVnZ2VkIGluKS4gRm9yIE9OVSBzaW11bGF0b3IsIHdlIGFsbG93IHdvcmtpbmcgd2l0aG91dCB0cmFuc2NlaXZlcnMuICovCisgICAgcmMgPSBiY21fYm9hcmRfZnBnYV9yZWFkKEJDTV9GUEdBX1JFR19UUlhfSVNfUFJFU0VOVCwgJnRyeF9hYnNlbmNlX21hc2spOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIGlmICh0cnhfYWJzZW5jZV9tYXNrICYgKDEgPDwgcG9uKSkKKyAgICB7CisgICAgICAgIC8qIFRoZSB0cmFuc2NlaXZlciBpcyBhYnNlbnQuICovCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PREVWOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3RyeF9lbmFibGUodWludDhfdCBwb24sIGJjbW9zX2Jvb2wgaXNfZW5hYmxlZCkKK3sKKyNpZmRlZiBDT05GSUdfT05VX1NJTQorICAgIHN0YXRpYyB1aW50MzJfdCB0cnhfZGlzYWJsZV9tYXNrID0gMHhGRkZGRkZGRjsKKworICAgIC8qIEtlZXAgdHJhY2sgb2Ygd2hpY2ggVFJYcyBhcmUgbG9naWNhbGx5IGVuYWJsZWQuICovCisgICAgaWYgKGlzX2VuYWJsZWQpCisgICAgICAgIHRyeF9kaXNhYmxlX21hc2sgJj0gfigxIDw8IHBvbik7CisgICAgZWxzZQorICAgICAgICB0cnhfZGlzYWJsZV9tYXNrIHw9ICgxIDw8IHBvbik7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2hvc3RfZXZlbnRfd3JpdGUodHJ4X2Rpc2FibGVfbWFzayk7CisjZWxzZQorICAgIHVpbnQzMl90IHRyeF9kaXNhYmxlX21hc2s7CisgICAgdWludDMyX3QgdHJ4X2Fic2VuY2VfbWFzazsKKworICAgIGJjbW9zX2Vycm5vIHJjID0gYmNtX2FjY2Vzc19mcGdhKCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgdHJhbnNjZWl2ZXIgaXMgcHJlc2VudCAocGx1Z2dlZCBpbikuICovCisgICAgcmMgPSBiY21fYm9hcmRfZnBnYV9yZWFkKEJDTV9GUEdBX1JFR19UUlhfSVNfUFJFU0VOVCwgJnRyeF9hYnNlbmNlX21hc2spOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKyAgICBpZiAodHJ4X2Fic2VuY2VfbWFzayAmICgxIDw8IHBvbikpCisgICAgeworICAgICAgICAvKiBUaGUgdHJhbnNjZWl2ZXIgaXMgYWJzZW50LiAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0RFVjsKKyAgICB9CisKKyAgICAvKiBSZWFkLW1vZGlmeS13cml0ZSB0cmFuc2NlaXZlciBkaXNhYmxlIG1hc2sgKHdlIGRvbid0IHdhbnQgdG8gYWZmZWN0IG90aGVyIFBPTidzKS4gKi8KKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWQoQkNNX0ZQR0FfUkVHX1RSWF9FTkFCTEUsICZ0cnhfZGlzYWJsZV9tYXNrKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisgICAgaWYgKGlzX2VuYWJsZWQgPT0gQkNNT1NfVFJVRSkKKyAgICAgICAgdHJ4X2Rpc2FibGVfbWFzayAmPSB+KDEgPDwgcG9uKTsKKyAgICBlbHNlCisgICAgICAgIHRyeF9kaXNhYmxlX21hc2sgfD0gKDEgPDwgcG9uKTsKKworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2Ffd3JpdGUoQkNNX0ZQR0FfUkVHX1RSWF9FTkFCTEUsIHRyeF9kaXNhYmxlX21hc2spOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICByZXR1cm4gYmNtX2JvYXJkX2hvc3RfZXZlbnRfd3JpdGUodHJ4X2Rpc2FibGVfbWFzayk7CisjZW5kaWYKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jb25maWdfcmVzZXRfdmFsdWUodWludDMyX3QgcnN0X2JpdCwgYmNtb3NfYm9vbCBpc19vbikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCByZXNldF92YWx1ZXM7CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIC8qIFJlYWQtbW9kaWZ5LXdyaXRlIHNvIHdlIGNhbiBzZXQgb25seSB0aGUgcmVsZXZhbnQgYml0IHRvIDAgKi8KKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWQoQkNNX0ZQR0FfUkVHX1JFU0VUUywgJnJlc2V0X3ZhbHVlcyk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgaWYgKGlzX29uID09IEJDTU9TX1RSVUUpCisgICAgICAgIHJlc2V0X3ZhbHVlcyB8PSAxIDw8IHJzdF9iaXQ7CisgICAgZWxzZQorICAgICAgICByZXNldF92YWx1ZXMgJj0gfigxIDw8IHJzdF9iaXQpOworCisgICAgcmV0dXJuIGJjbV9ib2FyZF9mcGdhX3dyaXRlKEJDTV9GUEdBX1JFR19SRVNFVFMsIHJlc2V0X3ZhbHVlcyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZpY2VfZGlzY29ubmVjdCh2b2lkKQoreworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHt9OworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGRldl9jZmc7CisgICAgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0IGRldl9kaXNjb25uZWN0OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgQkNNT0xUX0NGR19JTklUKCZkZXZfY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZGV2X2NmZywgZGV2aWNlLCBzdGF0ZSk7CisgICAgcmMgPSBiY21vbHRfY2ZnX2dldCgwLCAmZGV2X2NmZy5oZHIpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKyAgICBpZiAoZGV2X2NmZy5kYXRhLnN0YXRlICE9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEKQorICAgIHsKKyAgICAgICAgQkNNT0xUX09QRVJfSU5JVCgmZGV2X2Rpc2Nvbm5lY3QsIGRldmljZSwgZGlzY29ubmVjdCwga2V5KTsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdCgwLCAmZGV2X2Rpc2Nvbm5lY3QuaGRyKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2RldmljZV9yZXNldCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBkZXZpY2VfZGlzY29ubmVjdCgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKyAgICByYyA9IGJjbV9ib2FyZF9jb25maWdfcmVzZXRfdmFsdWUoQkNNX1JTVF9CSVRfREVWSUNFLCBCQ01PU19GQUxTRSk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgcmV0dXJuIGJjbV9ib2FyZF9jb25maWdfcmVzZXRfdmFsdWUoQkNNX1JTVF9CSVRfREVWSUNFLCBCQ01PU19UUlVFKTsKK30KKworLyogRGV2aWNlIG9uIGtlZXBzIHRoZSByZXNldCBiaXQgb24gYWN0aXZlIGhpZ2ggKi8KK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9kZXZpY2Vfb24odm9pZCkKK3sKKyAgICByZXR1cm4gYmNtX2JvYXJkX2NvbmZpZ19yZXNldF92YWx1ZShCQ01fUlNUX0JJVF9ERVZJQ0UsIEJDTU9TX1RSVUUpOworfQorCisvKiBEZXZpY2Ugb2ZmIGtlZXBzIHRoZSByZXNldCBiaXQgb24gYWN0aXZlIGxvdyAqLworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2RldmljZV9vZmYodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gZGV2aWNlX2Rpc2Nvbm5lY3QoKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2NvbmZpZ19yZXNldF92YWx1ZShCQ01fUlNUX0JJVF9ERVZJQ0UsIEJDTU9TX0ZBTFNFKTsKK30KKworLyogS2F0YW5hMiBEZXZpY2Ugb24ga2VlcHMgdGhlIHJlc2V0IGJpdCBvbiBhY3RpdmUgaGlnaCAqLworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2t0Ml9kZXZpY2Vfb24odm9pZCkKK3sKKyAgICAvKiB0YWtlIHRoZSBLVDIgb3V0IG9mIHJlc2V0ICovCisgICAgcmV0dXJuIGJjbV9ib2FyZF9jb25maWdfcmVzZXRfdmFsdWUoQkNNX1JTVF9CSVRfS1QyLCBCQ01PU19UUlVFKTsKK30KKworLyogRGV2aWNlIG9mZiBrZWVwcyB0aGUgcmVzZXQgYml0IG9uIGFjdGl2ZSBsb3cgKi8KK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9rdDJfZGV2aWNlX29mZih2b2lkKQoreworICAgIHJldHVybiBiY21fYm9hcmRfY29uZmlnX3Jlc2V0X3ZhbHVlKEJDTV9SU1RfQklUX0tUMiwgQkNNT1NfRkFMU0UpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2FjY2Vzc19kcGxsKHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoYmNtX2JvYXJkX2lzX3N2azQoKSkKKyAgICB7CisgICAgICAgIHJjID0gYmNtX2JvYXJkX2Rldl9jaGFuZ2UoSTJDX1NXMV9JMkNfQUREUik7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZGV2X2NoYW5nZShJMkNfU1cxX0kyQ19BRERSKSBmYWlsZWRcbiIpOworICAgICAgICByYyA9IGJjbV9ib2FyZF9zd2l0Y2hfd3JpdGUoMHgyMCk7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfc3dpdGNoX3dyaXRlKDB4MjApIGZhaWxlZFxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gYmNtX2JvYXJkX2Rldl9jaGFuZ2UoSTJDX1NXMF9JMkNfQUREUik7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZGV2X2NoYW5nZShJMkNfU1cwX0kyQ19BRERSKSBmYWlsZWRcbiIpOworICAgICAgICByYyA9IGJjbV9ib2FyZF9zd2l0Y2hfd3JpdGUoMik7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfc3dpdGNoX3dyaXRlKDIpIGZhaWxlZFxuIik7CisgICAgfQorCisgICAgcmMgPSBiY21fYm9hcmRfZGV2X2NoYW5nZShQT05fRFBMTF9JMkNfQUREUik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjLCByYywgImJjbV9ib2FyZF9kZXZfY2hhbmdlKFBPTl9EUExMX0kyQ19BRERSKSBmYWlsZWQgXG4iKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGludCBiY21fYm9hcmRfc2V0X3BhZ2VfZHBsbCh1aW50MzJfdCBwYWdlKQoreworICAgIGludCByY2lvY3RsOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmNvdW50ID0gOCwKKyAgICAgICAgLmFkZHIgPSAxLAorICAgICAgICAudmFsID0gcGFnZSwKKyAgICB9OworCisgICAgcmNpb2N0bCA9IGlvY3RsKG1hcGxlX2kyY19mZCwgTUFQTEVfSTJDX0lPQ1RMX09QX0RFVl9XUklURSwgJnBhcmFtcyk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjaW9jdGwsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCB3cml0ZSBjaGFuZ2UgcGFnZSBmYWlsZWRcbiIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9yZWFkX2RwbGwodWludDMyX3QgcGFnZSwgdWludDMyX3QgcmVnLCB1aW50MzJfdCAqdmFsKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGludCByY2lvY3RsOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmNvdW50ID0gOCwKKyAgICAgICAgLmFkZHIgPSByZWcsCisgICAgICAgIC52YWwgPSAwLAorICAgIH07CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZHBsbCgpOworICAgIGJjbV9ib2FyZF9zZXRfcGFnZV9kcGxsKHBhZ2UpOworICAgIHJjaW9jdGwgPSBpb2N0bChtYXBsZV9pMmNfZmQsIE1BUExFX0kyQ19JT0NUTF9PUF9ERVZfUkVBRCwgJnBhcmFtcyk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjaW9jdGwsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCByZWFkIGZhaWxlZCBmb3IgbWFwbGVfaTJjX2ZkXG4iKTsKKyAgICAqdmFsID0gcGFyYW1zLnZhbDsKKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3dyaXRlX2RwbGwodWludDMyX3QgcGFnZSwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgaW50IHJjaW9jdGw7CisgICAgbWFwbGVfaTJjX2lvY3RsX3BhcmFtIHBhcmFtcyA9CisgICAgeworICAgICAgICAuY291bnQgPSA4LAorICAgICAgICAuYWRkciA9IHJlZywKKyAgICAgICAgLnZhbCA9IHZhbCwKKyAgICB9OworCisgICAgcmMgPSBiY21fYWNjZXNzX2RwbGwoKTsKKyAgICBiY21fYm9hcmRfc2V0X3BhZ2VfZHBsbChwYWdlKTsKKyAgICByY2lvY3RsID0gaW9jdGwobWFwbGVfaTJjX2ZkLCBNQVBMRV9JMkNfSU9DVExfT1BfREVWX1dSSVRFLCAmcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmNpb2N0bCwgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIHdyaXRlIGZhaWxlZCBmb3IgbWFwbGVfaTJjX2ZkXG4iKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9sb2FkX2RwbGwoZHBsbF9jb21tYW5kICpjb21tYW5kcywgaW50IGNtZGxlbikKK3sKKyAgICBpbnQgcmNpb2N0bCxpOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHVpbnQ4X3QgcHJldmlvdXNfcGFnZSA9IDA7CisKKyAgICBtYXBsZV9pMmNfaW9jdGxfcGFyYW0gcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5jb3VudCA9IDgsCisgICAgICAgIC5hZGRyID0gMCwKKyAgICAgICAgLnZhbCA9IDAsCisgICAgfTsKKworICAgIHJjID0gYmNtX2FjY2Vzc19kcGxsKCk7CisgICAgZm9yIChpPTA7IGkgPCBjbWRsZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmIChjb21tYW5kc1tpXS5wYWdlICE9IHByZXZpb3VzX3BhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbV9ib2FyZF9zZXRfcGFnZV9kcGxsKGNvbW1hbmRzW2ldLnBhZ2UpOworICAgICAgICAgICAgcHJldmlvdXNfcGFnZSA9IGNvbW1hbmRzW2ldLnBhZ2U7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1zLmFkZHIgPSBjb21tYW5kc1tpXS5yZWc7CisgICAgICAgIHBhcmFtcy52YWwgPSBjb21tYW5kc1tpXS5kYXRhOworICAgICAgICByY2lvY3RsID0gaW9jdGwobWFwbGVfaTJjX2ZkLCBNQVBMRV9JMkNfSU9DVExfT1BfREVWX1dSSVRFLCAmcGFyYW1zKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjaW9jdGwsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCB3cml0ZSBkYXRhIHBhZ2UgZmFpbGVkXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorYmNtb3NfZXJybm8gYmNtX2JvYXJkX2J1cm5fcG9uX2RwbGwoYmNtX2RwbGxfdXNlcnMgZHBsbF9kZXYpCit7CisgICAgc3dpdGNoKGRwbGxfZGV2KQorICAgIHsKKyAgICAgICAgY2FzZSBHUE9OX0RQTEw6CisgICAgICAgICAgICByZXR1cm4gYmNtX2JvYXJkX2xvYWRfZHBsbChncG9uX2RwbGxfdGFibGUsc2l6ZW9mKGdwb25fZHBsbF90YWJsZSkvc2l6ZW9mKGRwbGxfY29tbWFuZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVBPTl9EUExMOgorICAgICAgICAgICAgcmV0dXJuIGJjbV9ib2FyZF9sb2FkX2RwbGwoZXBvbl9kcGxsX3RhYmxlLHNpemVvZihlcG9uX2RwbGxfdGFibGUpL3NpemVvZihkcGxsX2NvbW1hbmQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdQT05fU1lOQ0U6CisgICAgICAgICAgICByZXR1cm4gYmNtX2JvYXJkX2xvYWRfZHBsbChncG9uX3N5bmNlX2RwbGxfdGFibGUsc2l6ZW9mKGdwb25fc3luY2VfZHBsbF90YWJsZSkvc2l6ZW9mKGRwbGxfY29tbWFuZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfaW5pdCh2b2lkKQoreworICAgIG1hcGxlX2Rldl9jdHJsX2ZkID0gb3BlbigiL2Rldi9tYXBsZV9kZXZfY3RybCIsIE9fUkRXUik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKG1hcGxlX2Rldl9jdHJsX2ZkIDwgMCwgZXJybm8sICJtYXBsZV9kZXZfY3RybF9mZCBvcGVuIGZhaWxlZFxuIik7CisKKyAgICBtYXBsZV9pMmNfZmQgPSBvcGVuKCIvZGV2L21hcGxlX2kyYyIsIE9fUkRXUik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKG1hcGxlX2kyY19mZCA8IDAsIGVycm5vLCAibWFwbGVfaTJjX2ZkIG9wZW4gZmFpbGVkXG4iKTsKKworI2lmZGVmIENPTkZJR19PTlVfU0lNCisgICAgLyogSWYgdGhlIE9OVSBzaW0gaXMgcnVubmluZywgYWx3YXlzIGxlYXZlIGFsbCB0cmFuc2NlaXZlcnMgcGh5c2ljYWxseSBkaXNhYmxlZC4gKi8KKyAgICBiY21vc19lcnJubyByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3dyaXRlKEJDTV9GUEdBX1JFR19UUlhfRU5BQkxFLCAweEZGRkZGRkZGKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfZ2V0X2JvYXJkX2lkKGJjbV9ib2FyZF9zdmtfYm9hcmRfaWQgKiBib2FyZF9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCB2YWw7CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2FfcmVhZCgweDEsICZ2YWwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgICpib2FyZF9pZCA9IHZhbCAmIDB4NzsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwordm9pZCBiY21fYm9hcmRfdW5pbml0KHZvaWQpCit7CisgICAgY2xvc2UobWFwbGVfaTJjX2ZkKTsKKyAgICBtYXBsZV9pMmNfZmQgPSAwOworCisgICAgY2xvc2UobWFwbGVfZGV2X2N0cmxfZmQpOworICAgIG1hcGxlX2Rldl9jdHJsX2ZkID0gLTE7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvYmNtb2x0X2JvYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1OGViYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworI2lmbmRlZiBfQkNNT0xUX0JPQVJEX0hfCisjZGVmaW5lIF9CQ01PTFRfQk9BUkRfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBTVktfMSAgICA9IDB4NywgLyogU1ZLICMxIC0gQkNNOTY4NjIwUzogYWxsIFBPTiBmbGF2b3JzIHN1cHBvcnRlZCwgU0ZQKyAqLworICAgIFNWS18yX1hHID0gMHg2LCAvKiBTVksgIzIgLSBCQ005Njg2MjBYRzogWEdQT04gKi8KKyAgICBTVktfMl9YRSA9IDB4NSwgLyogU1ZLICMyIC0gQkNNOTY4NjIwWEU6IDEwRyBFUE9OICovCisgICAgU1ZLXzMgICAgPSAweDQsIC8qIFNWSyAjMyAtIEJDTTk2ODYyMEs6IGFsbCBQT04gZmxhdm9ycyBzdXBwb3J0ZWQsIFhGUCAqLworfSBiY21fYm9hcmRfc3ZrX2JvYXJkX2lkOworCitiY21vc19lcnJubyBiY21fYm9hcmRfZGV2X2NoYW5nZSh1aW50MzJfdCBhZGRyKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9kZXZfd3JpdGUodWludDMyX3QgY291bnQsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHZhbCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfZGV2X3JlYWQodWludDMyX3QgY291bnQsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90ICp2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3N3aXRjaF93cml0ZSh1aW50MzJfdCB2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3N3aXRjaF9yZWFkKHVpbnQzMl90ICp2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2Ffd3JpdGUodWludDMyX3QgYWRkciwgdWludDMyX3QgdmFsKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3JlYWQodWludDMyX3QgYWRkciwgdWludDMyX3QgKnZhbCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfaG9zdF9ldmVudF93cml0ZSh1aW50MzJfdCB2YWwpOworCitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV92ZXJzaW9uX2dldCh1aW50MzJfdCAqdmVyc2lvbik7CisKKy8qIEZQR0EgR1BJTyBhY2Nlc3MgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9GUEdBX0dQSU9fRElSX0lOUFVULAorICAgIEJDTV9GUEdBX0dQSU9fRElSX09VVFBVVCwKK30gYmNtX2ZwZ2FfZ3Bpb19kaXI7CisKK3R5cGVkZWYgZW51bQoreworICAgIEdQT05fRFBMTCwKKyAgICBFUE9OX0RQTEwsCisgICAgR1BPTl9TWU5DRQorfSBiY21fZHBsbF91c2VyczsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICBwYWdlOworICAgIHVpbnQ4X3QgIHJlZzsKKyAgICB1aW50OF90ICBkYXRhOworfSBkcGxsX2NvbW1hbmQ7CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3NldF9ncGlvX2RpcihiY21vbHRfZ3Bpb19waW4gZ3Bpb19waW4sIGJjbV9mcGdhX2dwaW9fZGlyIGRpcik7CitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV9nZXRfZ3Bpb19kaXIoYmNtb2x0X2dwaW9fcGluIGdwaW9fcGluLCBiY21fZnBnYV9ncGlvX2RpciAqZGlyKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3dyaXRlX2dwaW8oYmNtb2x0X2dwaW9fcGluIGdwaW9fcGluLCB1aW50MzJfdCB2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2FfcmVhZF9ncGlvKGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiwgdWludDMyX3QgKnZhbCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV9nZW5fZ3Bpb19pcnEoYmNtb2x0X2V4dF9pcnEgZXh0X2lycSk7CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF90cnhfZW5hYmxlKHVpbnQ4X3QgcG9uLCBiY21vc19ib29sIGlzX2VuYWJsZWQpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3RyeF9wcmVzZW50KHVpbnQ4X3QgcG9uKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9kZXZpY2VfcmVzZXQodm9pZCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfZGV2aWNlX29uKHZvaWQpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2RldmljZV9vZmYodm9pZCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfa3QyX2RldmljZV9vbih2b2lkKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9rdDJfZGV2aWNlX29mZih2b2lkKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9nZXRfYm9hcmRfaWQoYmNtX2JvYXJkX3N2a19ib2FyZF9pZCAqIGJvYXJkX2lkKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3JlZ19yZWFkKHVpbnQzMl90IHJlZywgdWludDMyX3QgKnZhbCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV9yZWdfd3JpdGUodWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3BjaV9kZWJ1Zyh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IGNvbW1hbmQsIGludDMyX3Qgc3RhcnQsIGludDMyX3QgaG93bWFueSwgdWludDMyX3QgKmR1bXBwdHIpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2J1cm5fcG9uX2RwbGwoYmNtX2RwbGxfdXNlcnMgZHBsbF9kZXYpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3dyaXRlX2RwbGwodWludDMyX3QgcGFnZSwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3JlYWRfZHBsbCh1aW50MzJfdCBwYWdlLCB1aW50MzJfdCByZWcsIHVpbnQzMl90ICp2YWwpOworCitiY21vc19lcnJubyBiY21fYm9hcmRfaW5pdCh2b2lkKTsKK3ZvaWQgYmNtX2JvYXJkX3VuaW5pdCh2b2lkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZF9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZF9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2I1OWZhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvYmNtb2x0X2JvYXJkX2NsaS5jCkBAIC0wLDAgKzEsNTgxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSAiYmNtb2x0X2JvYXJkLmgiCisjaW5jbHVkZSAiYmNtb2x0X2JvYXJkX2NsaS5oIgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFJfU1RBUlQgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBiY21faTJjX2Rldl9hZGRyX3RhYmxlW10gPSB7CisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFIobmFtZSwgZGVzYywgdmFsKSB7ZGVzYywgdmFsfSwKKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUl9FTkQgQkNNQ0xJX0VOVU1fTEFTVH07CisjaW5jbHVkZSA8YmNtb2x0X2kyY19kZXZzX2FkZHIuaD4KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfZGV2X2NoYW5nZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBhZGRyID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2IiktPnZhbHVlLnVudW1iZXI7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2Rldl9jaGFuZ2UoYWRkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2Rldl93cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndpZHRoIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgYWRkciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFkZHIiKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50MzJfdCB2YWwgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2YWwiKS0+dmFsdWUudW51bWJlcjsKKworICAgIHN3aXRjaCAoY291bnQpCisgICAgeworICAgIGNhc2UgODoKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMzI6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJDb3VudCBjYW4gYmUgOHwxNnwzMlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIHJldHVybiBiY21fYm9hcmRfZGV2X3dyaXRlKGNvdW50LCBhZGRyLCB2YWwpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9kZXZfcmVhZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndpZHRoIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgYWRkciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFkZHIiKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50MzJfdCB2YWw7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgCisgICAgc3dpdGNoIChjb3VudCkKKyAgICB7CisgICAgY2FzZSA4OgorICAgIGNhc2UgMTY6CisgICAgY2FzZSAzMjoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkNvdW50IGNhbiBiZSA4fDE2fDMyXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgcmMgPSBiY21fYm9hcmRfZGV2X3JlYWQoY291bnQsIGFkZHIsICZ2YWwpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZGV2X3JlYWQoKSBmYWlsZWRcbiIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIweCV4XG4iLCB2YWwpOworICAgIAorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9zd2l0Y2hfd3JpdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgdWludDMyX3QgdmFsID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmFsIiktPnZhbHVlLnVudW1iZXI7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX3N3aXRjaF93cml0ZSh2YWwpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9zd2l0Y2hfcmVhZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCB2YWw7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IGJjbV9ib2FyZF9zd2l0Y2hfcmVhZCgmdmFsKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2JvYXJkX3N3aXRjaF9yZWFkKCkgZmFpbGVkXG4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiMHgleFxuIiwgdmFsKTsKKyAgICAKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfZnBnYV93cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBhZGRyID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWRkciIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQzMl90IHZhbCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZhbCIpLT52YWx1ZS51bnVtYmVyOworICAgIAorICAgIHJldHVybiBiY21fYm9hcmRfZnBnYV93cml0ZShhZGRyLCB2YWwpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9mcGdhX3JlYWQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgdWludDMyX3QgYWRkciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFkZHIiKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50MzJfdCB2YWw7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgCisgICAgcmMgPSBiY21fYm9hcmRfZnBnYV9yZWFkKGFkZHIsICZ2YWwpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZnBnYV9yZWFkKCkgZmFpbGVkXG4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiMHgleFxuIiwgdmFsKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9mcGdhX3ZlcnNpb24oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgdWludDMyX3QgdmVyc2lvbjsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2FfdmVyc2lvbl9nZXQoJnZlcnNpb24pOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIweCV4XG4iLCB2ZXJzaW9uKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2ZwZ2Ffc2V0X2dwaW9fZGlyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwaW9fcGluIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtX2ZwZ2FfZ3Bpb19kaXIgZGlyID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlyIiktPnZhbHVlLnVudW1iZXI7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2ZwZ2Ffc2V0X2dwaW9fZGlyKGdwaW9fcGluLCBkaXIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9mcGdhX2dldF9ncGlvX2RpcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bpb19waW4gZ3Bpb19waW4gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncGlvX3BpbiIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbV9mcGdhX2dwaW9fZGlyIGRpcjsKKyAgICBiY21vc19lcnJubyByYzsKKyAgCisgICAgcmMgPSBiY21fYm9hcmRfZnBnYV9nZXRfZ3Bpb19kaXIoZ3Bpb19waW4sICZkaXIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlc1xuIiwgZGlyID09IEJDTV9GUEdBX0dQSU9fRElSX0lOUFVUID8gImlucHV0IiA6ICJvdXRwdXQiKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2ZwZ2Ffd3JpdGVfZ3BpbyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bpb19waW4gZ3Bpb19waW4gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncGlvX3BpbiIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQzMl90IHZhbCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZhbCIpLT52YWx1ZS51bnVtYmVyOworCisgICAgcmV0dXJuIGJjbV9ib2FyZF9mcGdhX3dyaXRlX2dwaW8oZ3Bpb19waW4sIHZhbCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2ZwZ2FfcmVhZF9ncGlvKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwaW9fcGluIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgdmFsOworICAgIGJjbW9zX2Vycm5vIHJjOworICAKKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWRfZ3BpbyhncGlvX3BpbiwgJnZhbCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIjB4JXhcbiIsIHZhbCk7CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9mcGdhX2dlbl9ncGlvX2lycShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXh0X2lycSBleHRfaXJxID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaXJxIiktPnZhbHVlLnVudW1iZXI7CisgIAorICAgIHJldHVybiBiY21fYm9hcmRfZnBnYV9nZW5fZ3Bpb19pcnEoZXh0X2lycSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX3RyeF9lbmFibGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgdWludDhfdCBwb25faWQgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25faWQiKS0+dmFsdWUudW51bWJlcjsKKworICAgIHJldHVybiBiY21fYm9hcmRfdHJ4X2VuYWJsZShwb25faWQsIEJDTU9TX1RSVUUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV90cnhfZGlzYWJsZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50OF90IHBvbl9pZCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9pZCIpLT52YWx1ZS51bnVtYmVyOworCisgICAgcmV0dXJuIGJjbV9ib2FyZF90cnhfZW5hYmxlKHBvbl9pZCwgQkNNT1NfRkFMU0UpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9kZXZpY2VfcmVzZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgcmV0dXJuIGJjbV9ib2FyZF9kZXZpY2VfcmVzZXQoKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfZGV2aWNlX29uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIHJldHVybiBiY21fYm9hcmRfZGV2aWNlX29uKCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2RldmljZV9vZmYoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgcmV0dXJuIGJjbV9ib2FyZF9kZXZpY2Vfb2ZmKCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2t0Ml9vbihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtX2JvYXJkX2t0Ml9kZXZpY2Vfb24oKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfa3QyX29mZihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtX2JvYXJkX2t0Ml9kZXZpY2Vfb2ZmKCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2ZwZ2FfcmVnX3JlYWQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisJdWludDMyX3QgYWRkciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFkZHIiKS0+dmFsdWUudW51bWJlcjsKKwl1aW50MzJfdCB2YWw7CisJYmNtb3NfZXJybm8gcmM7CisKKwlyYyA9IGJjbV9ib2FyZF9mcGdhX3JlZ19yZWFkKGFkZHIsICZ2YWwpOworCUJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZnBnYV9yZWdfcmVhZCgpIGZhaWxlZFxuIik7CisJYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIjB4JXhcbiIsIHZhbCk7CisKKwlyZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfZnBnYV9yZWdfd3JpdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisJdWludDMyX3QgYWRkciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFkZHIiKS0+dmFsdWUudW51bWJlcjsKKwl1aW50MzJfdCB2YWwgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2YWwiKS0+dmFsdWUudW51bWJlcjsKKworICAgIHJldHVybiBiY21fYm9hcmRfZnBnYV9yZWdfd3JpdGUoYWRkciwgdmFsKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfYnVybl9kcGxsKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworCWJjbW9zX2Vycm5vIHJjOworCisgICAgdWludDMyX3QgZGV2ID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlIiktPnZhbHVlLnVudW1iZXI7CisgICAgcmMgPSBiY21fYm9hcmRfYnVybl9wb25fZHBsbChkZXYpOworCUJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfYnVybl9wb25fZHBsbCgpIGZhaWxlZFxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfZHBsbF93cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBwYWdlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFnZSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQzMl90IGFkZHIgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZGRyIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgdmFsID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmFsIiktPnZhbHVlLnVudW1iZXI7CisgICAgCisgICAgcmV0dXJuIGJjbV9ib2FyZF93cml0ZV9kcGxsKHBhZ2UsIGFkZHIsIHZhbCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2RwbGxfcmVhZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBwYWdlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFnZSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQzMl90IGFkZHIgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZGRyIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgdmFsOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIAorICAgIHJjID0gYmNtX2JvYXJkX3JlYWRfZHBsbChwYWdlLCBhZGRyLCAmdmFsKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2JvYXJkX2RwbGxfcmVhZCgpIGZhaWxlZFxuIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIjB4JXhcbiIsIHZhbCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogTFVLX01BWF9EQVRBX1NJWkUgKDIqMTAyNCkgKi8KKyNkZWZpbmUgU1dJVENIX1JFQ0VJVkVfQlVGRkVSX0xFTkdUSCAgICgyKjEwMjQpCitzdGF0aWMgaW50IHN3aXRjaF9zb2NrZXQgPSAtMTsKK3N0YXRpYyBjaGFyICpzd2l0Y2hfYnVmZmVyID0gTlVMTDsKK3N0YXRpYyBiY21vc19ib29sIHN3aXRjaF9maXJzdF9jb25uZWN0aW9uID0gQkNNT1NfVFJVRTsKKworc3RhdGljIHZvaWQgc3dpdGNoX3Jlc3BvbnNlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGludCBsZW47CisgICAgY2hhciAqcHJvbXB0ID0gTlVMTDsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgbGVuID0gcmVhZChzd2l0Y2hfc29ja2V0LCBzd2l0Y2hfYnVmZmVyLCBTV0lUQ0hfUkVDRUlWRV9CVUZGRVJfTEVOR1RILTEpOworICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoX2J1ZmZlcltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMiLCBzd2l0Y2hfYnVmZmVyKTsKKyAgICAgICAgICAgIHByb21wdCA9IHN0cnN0cihzd2l0Y2hfYnVmZmVyLCAiQkNNIik7CisgICAgICAgICAgICB3aGlsZSAocHJvbXB0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihwcm9tcHQpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPj0gNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJvbXB0WzNdID09ICc+JykgfHwgKChwcm9tcHRbM10gPT0gJy4nKSAmJiAocHJvbXB0WzVdID09ICc+JykpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsZW4gPj0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9tcHRbM10gPT0gJz4nKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm9tcHQgPSBzdHJzdHIoJnByb21wdFsyXSwgIkJDTSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGt0Ml9jb25uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyOworCisgICAgaWYgKHN3aXRjaF9zb2NrZXQgIT0gLTEpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIkEgY29ubmVjdGlvbiBhbHJlYWR5IGV4aXN0c1xuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgfQorCisgICAgc3dpdGNoX2J1ZmZlciA9IGJjbW9zX2FsbG9jKFNXSVRDSF9SRUNFSVZFX0JVRkZFUl9MRU5HVEgpOworICAgIGlmICghc3dpdGNoX2J1ZmZlcikKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBtZW1zZXQoKHZvaWQgKikmc2VydmVyLCAwLCBzaXplb2Yoc2VydmVyKSk7CisgICAgc2VydmVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIHNlcnZlci5zaW5fcG9ydCA9IGh0b25zKHBhcm1bMF0udmFsdWUubnVtYmVyKTsKKyAgICBzZXJ2ZXIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCIxMjcuMC4wLjEiKTsKKyAgICBzd2l0Y2hfc29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgICBpZiAoc3dpdGNoX3NvY2tldCA8IDApCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIkNhbid0IG9wZW4gY2xpZW50IHNvY2tldFxuIik7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgaWYgKGNvbm5lY3Qoc3dpdGNoX3NvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzZXJ2ZXIsIHNpemVvZihzZXJ2ZXIpKSA9PSAtMSkKKyAgICB7CisgICAgICAgIGNsb3NlKHN3aXRjaF9zb2NrZXQpOworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIkZhaWxlZCB0byBjb25uZWN0XG4iKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBpZiAoc3dpdGNoX2ZpcnN0X2Nvbm5lY3Rpb24pCisgICAgeworICAgICAgICBzd2l0Y2hfZmlyc3RfY29ubmVjdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgICAgICBzd2l0Y2hfcmVzcG9uc2Uoc2Vzc2lvbik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKK2V4aXQ6CisgICAgYmNtb3NfZnJlZShzd2l0Y2hfYnVmZmVyKTsKKyAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBrdDJfZGlzY29ubihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgaWYgKHN3aXRjaF9zb2NrZXQgIT0gLTEpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlNlbmQgJ2V4aXQnXG4iKTsKKyAgICAgICAgaWYgKHdyaXRlKHN3aXRjaF9zb2NrZXQsICJleGl0XHIiLCBzdHJsZW4oImV4aXRcciIpKSA8IDApCisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlNlbmQgJ2V4aXQnIHRvIHN3aXRjaCBmYWlsZWRcbiIpOworICAgICAgICBmc3luYyhzd2l0Y2hfc29ja2V0KTsKKyAgICB9CisgICAgYmNtb3NfdXNsZWVwKDEwMDApOworICAgIGlmIChzd2l0Y2hfc29ja2V0ICE9IC0xKQorICAgICAgICBjbG9zZShzd2l0Y2hfc29ja2V0KTsKKyAgICBpZiAoc3dpdGNoX2J1ZmZlcikKKyAgICAgICAgYmNtb3NfZnJlZShzd2l0Y2hfYnVmZmVyKTsKKyAgICAvKiBzZXQgc29ja2V0IGFuZCBidWZmZXIgd2l0aCBpbml0aWFsIHZhbHVlcyAqLworICAgIHN3aXRjaF9zb2NrZXQgPSAtMTsKKyAgICBzd2l0Y2hfYnVmZmVyID0gTlVMTDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8ga3QyX2NtZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgaW50IGxlbiwgc2VudF9sZW47CisgICAgY2hhciAqc3RyOworCisgICAgaWYgKChzd2l0Y2hfc29ja2V0ID09IC0xKSB8fCAoIXN3aXRjaF9idWZmZXIpKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJDb25uZWN0aW9uIG9yIGJ1ZmZlciBkbyBub3QgZXhpc3RcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKyAgICB9CisgICAgLyogc3dpdGNoIHVzZXIgc3BhY2UgYXBwbGljYXRpb24gcmVjZWl2ZXMgdGhydSBfZmRfaW5wdXRfY2IgYW5kCisgICAgICAgc2VuZCB0byBrZXJuZWwgdGhydSBfa2VybmVsX3Byb3h5X291dHB1dF9jYiAqLworICAgIGxlbiA9IChpbnQpc3RybGVuKHBhcm1bMF0udmFsdWUuc3RyaW5nKTsKKyAgICB7CisgICAgICAgIC8qIGRpcnR5IC0ganVzdCB0byBhdm9pZCBlcnJvciA6IGNhc3QgZGlzY2FyZHMgJ19fYXR0cmlidXRlX18oKGNvbnN0KSknIHF1YWxpZmllciBpZiB1c2Vpbmcgc3RyY2F0ICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgc3RycCA9ICh1bnNpZ25lZCBsb25nKSZwYXJtWzBdLnZhbHVlLnN0cmluZzsKKyAgICAgICAgc3RyID0gKihjaGFyICoqKXN0cnA7CisgICAgfQorICAgIHN0cltsZW4rK10gPSAnXHInOworICAgIHN0cltsZW5dID0gJ1wwJzsKKyAgICBzZW50X2xlbiA9IDA7CisgICAgZG8KKyAgICB7CisgICAgICAgIHNlbnRfbGVuID0gd3JpdGUoc3dpdGNoX3NvY2tldCwgc3RyICsgc2VudF9sZW4gLCBsZW4gLSBzZW50X2xlbik7CisgICAgICAgIGlmIChzZW50X2xlbiA9PSAtMSB8fCAoKHNlbnRfbGVuID09IDApICYmIGVycm5vKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJTZW5kIGNvbW1hbmQgdG8gc3dpdGNoIGZhaWxlZCAod3JpdGUgdG8gc29ja2V0IGVycm9yOiAlZClcbiIsIGVycm5vKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICAgICAgfQorICAgICAgICBmc3luYyhzd2l0Y2hfc29ja2V0KTsKKyAgICB9IHdoaWxlKGxlbiAtIHNlbnRfbGVuKTsKKyAgICAvKiBzd2l0Y2gga2VybmVsIHNlbmQgdGhydSBfa2VybmVsX3Byb3h5X2lucHV0X2NiCisgICAgICAgdG8gc3dpdGNoIHVzZXIgc3BhY2UgYXBwbGljYXRpb24gdGhydSBfZmRfb3V0b3V0X2NiICovCisgICAgc3dpdGNoX3Jlc3BvbnNlKHNlc3Npb24pOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgYmNtY2xpX2VudHJ5ICpib2FyZF9kaXIsICppMmNfZGlyOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbV9ib2FyZF9zdmtfYm9hcmRfaWQgYm9hcmRfaWQ7CisgICAgYmNtY2xpX2VudHJ5ICpkaXI7CisgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBmcGdhX2dwaW9fcGluX3RhYmxlW10gPQorICAgIHsKKyAgICAgICAgeyJwaW40IiwgQkNNT0xUX0dQSU9fUElOX1BJTjR9LAorICAgICAgICB7InBpbjUiLCBCQ01PTFRfR1BJT19QSU5fUElONX0sCisgICAgICAgIHsicGluNiIsIEJDTU9MVF9HUElPX1BJTl9QSU42fSwKKyAgICAgICAgeyJwaW43IiwgQkNNT0xUX0dQSU9fUElOX1BJTjd9LAorICAgICAgICB7InBpbjgiLCBCQ01PTFRfR1BJT19QSU5fUElOOH0sCisgICAgICAgIHsicGluOSIsIEJDTU9MVF9HUElPX1BJTl9QSU45fSwKKyAgICAgICAgeyJwaW4xMCIsIEJDTU9MVF9HUElPX1BJTl9QSU4xMH0sCisgICAgICAgIHsicGluMTEiLCBCQ01PTFRfR1BJT19QSU5fUElOMTF9LAorICAgICAgICB7InBpbjEyIiwgQkNNT0xUX0dQSU9fUElOX1BJTjEyfSwKKyAgICAgICAgeyJwaW4xMyIsIEJDTU9MVF9HUElPX1BJTl9QSU4xM30sCisgICAgICAgIHsicGluMTQiLCBCQ01PTFRfR1BJT19QSU5fUElOMTR9LAorICAgICAgICB7InBpbjE1IiwgQkNNT0xUX0dQSU9fUElOX1BJTjE1fSwKKyAgICAgICAgeyJwaW4xNiIsIEJDTU9MVF9HUElPX1BJTl9QSU4xNn0sCisgICAgICAgIHsicGluMTciLCBCQ01PTFRfR1BJT19QSU5fUElOMTd9LAorICAgICAgICB7InBpbjE4IiwgQkNNT0xUX0dQSU9fUElOX1BJTjE4fSwKKyAgICAgICAgeyJwaW4xOSIsIEJDTU9MVF9HUElPX1BJTl9QSU4xOX0sCisgICAgICAgIHsicGluMjAiLCBCQ01PTFRfR1BJT19QSU5fUElOMjB9LAorICAgICAgICB7InBpbjIxIiwgQkNNT0xUX0dQSU9fUElOX1BJTjIxfSwKKyAgICAgICAgeyJwaW4yMiIsIEJDTU9MVF9HUElPX1BJTl9QSU4yMn0sCisgICAgICAgIHsicGluMjMiLCBCQ01PTFRfR1BJT19QSU5fUElOMjN9LAorICAgICAgICB7InBpbjI0IiwgQkNNT0xUX0dQSU9fUElOX1BJTjI0fSwKKyAgICAgICAgeyJwaW4yNSIsIEJDTU9MVF9HUElPX1BJTl9QSU4yNX0sCisgICAgICAgIHsicGluMjYiLCBCQ01PTFRfR1BJT19QSU5fUElOMjZ9LAorICAgICAgICB7InBpbjI3IiwgQkNNT0xUX0dQSU9fUElOX1BJTjI3fSwKKyAgICAgICAgeyJwaW4yOCIsIEJDTU9MVF9HUElPX1BJTl9QSU4yOH0sCisgICAgICAgIHsicGluMjkiLCBCQ01PTFRfR1BJT19QSU5fUElOMjl9LAorICAgICAgICB7InBpbjMwIiwgQkNNT0xUX0dQSU9fUElOX1BJTjMwfSwKKyAgICAgICAgeyJwaW4zMSIsIEJDTU9MVF9HUElPX1BJTl9QSU4zMX0sCisgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICB9OworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZnBnYV9leHRfaXJxX3RhYmxlW10gPQorICAgIHsKKyAgICAgICAgeyJleHRfaXJxMCIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEwfSwKKyAgICAgICAgeyJleHRfaXJxMSIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlExfSwKKyAgICAgICAgeyJleHRfaXJxMiIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEyfSwKKyAgICAgICAgeyJleHRfaXJxMyIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEzfSwKKyAgICAgICAgeyJleHRfaXJxNCIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlE0fSwKKyAgICAgICAgeyJleHRfaXJxNSIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlE1fSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGZwZ2FfZ3Bpb19kaXJfdGFibGVbXSA9CisgICAgeworICAgICAgICB7ImlucHV0IiwgQkNNX0ZQR0FfR1BJT19ESVJfSU5QVVR9LAorICAgICAgICB7Im91dHB1dCIsIEJDTV9GUEdBX0dQSU9fRElSX09VVFBVVH0sCisgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICB9OworCisgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBkcGxsX2RldmljZXNbXSA9IHsKKyAgICAgICAgeyAubmFtZT0iZ3BvbiIsIC52YWw9R1BPTl9EUExMfSwKKyAgICAgICAgeyAubmFtZT0iZXBvbiIsIC52YWw9RVBPTl9EUExMfSwKKyAgICAgICAgeyAubmFtZT0ic3luY2UiLCAudmFsPUdQT05fU1lOQ0V9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKyAgICAKKyAgICBib2FyZF9kaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCAiYm9hcmQiLCAiQm9hcmQiLCBCQ01DTElfQUNDRVNTX0dVRVNULCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWJvYXJkX2RpciwgQkNNX0VSUl9JTlRFUk5BTCk7CisKKyAgICBpMmNfZGlyID0gYmNtY2xpX2Rpcl9hZGQoYm9hcmRfZGlyLCAiaTJjIiwgImkyYyIsIEJDTUNMSV9BQ0NFU1NfR1VFU1QsIE5VTEwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUighaTJjX2RpciwgQkNNX0VSUl9JTlRFUk5BTCk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoaTJjX2RpciwgImRldl9jaGFuZ2UiLCAiQ2hhbmdlIGN1cnJlbnQgZGV2aWNlIiwgYmNtX2JvYXJkX2NsaV9kZXZfY2hhbmdlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImRldiIsICJkZXZpY2UiLCBiY21faTJjX2Rldl9hZGRyX3RhYmxlLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoaTJjX2RpciwgImRldl93cml0ZSIsICJXcml0ZSB0byBjdXJyZW50IGkyYyBkZXZpY2UiLCBiY21fYm9hcmRfY2xpX2Rldl93cml0ZSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgid2lkdGgiLCAiV2lkdGggb2YgcmVnaXN0ZXIgaW4gYml0cyAoOHwxNnwzMikiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyIiwgImFkZHJlc3MiLCBCQ01DTElfUEFSTV9IRVgsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ2YWwiLCAidmFsdWUiLCBCQ01DTElfUEFSTV9IRVgsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChpMmNfZGlyLCAiZGV2X3JlYWQiLCAiUmVhZCBmcm9tIGN1cnJlbnQgaTJjIGRldmljZSIsIGJjbV9ib2FyZF9jbGlfZGV2X3JlYWQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIndpZHRoIiwgIldpZHRoIG9mIHJlZ2lzdGVyIGluIGJpdHMgKDh8MTZ8MzIpIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiYWRkciIsICJhZGRyZXNzIiwgQkNNQ0xJX1BBUk1fSEVYLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoaTJjX2RpciwgInN3aXRjaF93cml0ZSIsICJXcml0ZSB0byBzd2l0Y2giLCBiY21fYm9hcmRfY2xpX3N3aXRjaF93cml0ZSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgidmFsIiwgInZhbHVlIiwgQkNNQ0xJX1BBUk1fSEVYLCAwLCAwLCBVQ0hBUl9NQVgpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oaTJjX2RpciwgInN3aXRjaF9yZWFkIiwgIlJlYWQgZnJvbSBzd2l0Y2giLCBiY21fYm9hcmRfY2xpX3N3aXRjaF9yZWFkKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChpMmNfZGlyLCAiZnBnYV93cml0ZSIsICJXcml0ZSB0byBGUEdBIiwgYmNtX2JvYXJkX2NsaV9mcGdhX3dyaXRlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyIiwgImFkZHJlc3MiLCBCQ01DTElfUEFSTV9IRVgsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ2YWwiLCAidmFsdWUiLCBCQ01DTElfUEFSTV9IRVgsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChpMmNfZGlyLCAiZnBnYV9yZWFkIiwgIlJlYWQgZnJvbSBGUEdBIiwgYmNtX2JvYXJkX2NsaV9mcGdhX3JlYWQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImFkZHIiLCAiYWRkcmVzcyIsIEJDTUNMSV9QQVJNX0hFWCwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShib2FyZF9kaXIsICJmcGdhX3ZlcnNpb24iLCAiRlBHQSB2ZXJzaW9uIiwgYmNtX2JvYXJkX2NsaV9mcGdhX3ZlcnNpb24pOworICAgIAorICAgIEJDTUNMSV9NQUtFX0NNRChib2FyZF9kaXIsICJmcGdhX3NldF9ncGlvX2RpciIsICJTZXQgR1BJTyBkaXJlY3Rpb24iLCBiY21fYm9hcmRfY2xpX2ZwZ2Ffc2V0X2dwaW9fZGlyLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImdwaW9fcGluIiwgIkdQSU8gcGluIiwgZnBnYV9ncGlvX3Bpbl90YWJsZSwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiZGlyIiwgIkRpcmVjdGlvbiIsIGZwZ2FfZ3Bpb19kaXJfdGFibGUsIDApKTsKKyAgICBCQ01DTElfTUFLRV9DTUQoYm9hcmRfZGlyLCAiZnBnYV9nZXRfZ3Bpb19kaXIiLCAiR2V0IEdQSU8gZGlyZWN0aW9uIiwgYmNtX2JvYXJkX2NsaV9mcGdhX2dldF9ncGlvX2RpciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJncGlvX3BpbiIsICJHUElPIHBpbiIsIGZwZ2FfZ3Bpb19waW5fdGFibGUsIDApKTsKKyAgICBCQ01DTElfTUFLRV9DTUQoYm9hcmRfZGlyLCAiZnBnYV93cml0ZV9ncGlvIiwgIldyaXRlIHRvIEdQSU8gcGluIiwgYmNtX2JvYXJkX2NsaV9mcGdhX3dyaXRlX2dwaW8sCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiZ3Bpb19waW4iLCAiR1BJTyBwaW4iLCBmcGdhX2dwaW9fcGluX3RhYmxlLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgidmFsIiwgIlZhbHVlIiwgQkNNQ0xJX1BBUk1fSEVYLCAwKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKGJvYXJkX2RpciwgImZwZ2FfcmVhZF9ncGlvIiwgIlJlYWQgZnJvbSBHUElPIHBpbiIsIGJjbV9ib2FyZF9jbGlfZnBnYV9yZWFkX2dwaW8sCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiZ3Bpb19waW4iLCAiR1BJTyBwaW4iLCBmcGdhX2dwaW9fcGluX3RhYmxlLCAwKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKGJvYXJkX2RpciwgImZwZ2FfZ2VuX2lycSIsICJHZW5lcmF0ZSBHUElPIElSUSIsIGJjbV9ib2FyZF9jbGlfZnBnYV9nZW5fZ3Bpb19pcnEsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiaXJxIiwgIklSUSIsIGZwZ2FfZXh0X2lycV90YWJsZSwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGJvYXJkX2RpciwgInRyeF9lbmFibGUiLCAiRW5hYmxlIHRyYW5zY2VpdmVyIiwgYmNtX2JvYXJkX2NsaV90cnhfZW5hYmxlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJwb25faWQiLCAicG9uX2lkIiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChib2FyZF9kaXIsICJ0cnhfZGlzYWJsZSIsICJEaXNhYmxlIHRyYW5zY2VpdmVyIiwgYmNtX2JvYXJkX2NsaV90cnhfZGlzYWJsZSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9uX2lkIiwgInBvbl9pZCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGJvYXJkX2RpciwgImRldmljZV9yZXNldCIsICJSZXNldCB0aGUgZGV2aWNlIC0gY2xlYXJzIHRoZSByZXNldCBiaXQgYW5kIHRoZW4gc2V0IGl0IG9uIiwgYmNtX2JvYXJkX2NsaV9kZXZpY2VfcmVzZXQpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShib2FyZF9kaXIsICJkZXZpY2Vfb24iLCAiS2VlcHMgdGhlIGRldmljZSB3aXRoIHJlc2V0IGJpdCBvbiIsIGJjbV9ib2FyZF9jbGlfZGV2aWNlX29uKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oYm9hcmRfZGlyLCAiZGV2aWNlX29mZiIsICJLZWVwcyB0aGUgZGV2aWNlIHdpdGggcmVzZXQgYml0IG9mZiIsIGJjbV9ib2FyZF9jbGlfZGV2aWNlX29mZik7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoYm9hcmRfZGlyLCAiZnBnYV9yZWdfcmVhZCIsICJSZWFkIGRhdGEgZnJvbSBhbiBGUEdBIHJlZ2lzdGVyIiwgYmNtX2JvYXJkX2NsaV9mcGdhX3JlZ19yZWFkLAorICAgIAlCQ01DTElfTUFLRV9QQVJNKCJhZGRyIiwgImFkZHJlc3MiLCBCQ01DTElfUEFSTV9IRVgsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChib2FyZF9kaXIsICJmcGdhX3JlZ193cml0ZSIsICJXcml0ZSBkYXRhIHRvIGFuIEZQR0EgcmVnaXN0ZXIiLCBiY21fYm9hcmRfY2xpX2ZwZ2FfcmVnX3dyaXRlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyIiwgImFkZHJlc3MiLCBCQ01DTElfUEFSTV9IRVgsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ2YWwiLCAidmFsdWUiLCBCQ01DTElfUEFSTV9IRVgsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChib2FyZF9kaXIsICJkcGxsIiwgIkJ1cm4gRFBMTCIsIGJjbV9ib2FyZF9jbGlfYnVybl9kcGxsLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImRldmljZSIsICJEZXZpY2UiLCBkcGxsX2RldmljZXMsIDApKTsKKyAgICAKKyAgICBCQ01DTElfTUFLRV9DTUQoYm9hcmRfZGlyLCAiZHBsbF93cml0ZSIsICJXcml0ZSB0byBEUExMIiwgYmNtX2JvYXJkX2NsaV9kcGxsX3dyaXRlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJwYWdlIiwgInBhZ2UiLCBCQ01DTElfUEFSTV9IRVgsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyIiwgImFkZHJlc3MiLCBCQ01DTElfUEFSTV9IRVgsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ2YWwiLCAidmFsdWUiLCBCQ01DTElfUEFSTV9IRVgsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChib2FyZF9kaXIsICJkcGxsX3JlYWQiLCAiUmVhZCBmcm9tIERQTEwiLCBiY21fYm9hcmRfY2xpX2RwbGxfcmVhZCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicGFnZSIsICJwYWdlIiwgQkNNQ0xJX1BBUk1fSEVYLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiYWRkciIsICJhZGRyZXNzIiwgQkNNQ0xJX1BBUk1fSEVYLCAwKSk7CisKKyAgICByYyA9IGJjbV9ib2FyZF9nZXRfYm9hcmRfaWQoJmJvYXJkX2lkKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisgICAgLyogY2hlY2sgaWYgdGhlIGJvYXJkIGlzIFNWSyMzICovCisgICAgaWYgKGJvYXJkX2lkID09IFNWS18zKQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShib2FyZF9kaXIsICJrdDJfb24iLCAiS2VlcHMgdGhlIEthdGFuYTIgd2l0aCByZXNldCBiaXQgb24iLCBiY21fYm9hcmRfY2xpX2t0Ml9vbik7CisKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShib2FyZF9kaXIsICJrdDJfb2ZmIiwgIktlZXBzIHRoZSBLYXRhbmEyIHdpdGggcmVzZXQgYml0IG9mZiIsIGJjbV9ib2FyZF9jbGlfa3QyX29mZik7CisKKyAgICAgICAgZGlyID0gYmNtY2xpX2Rpcl9hZGQoYm9hcmRfZGlyLCAic3dpdGNoIiwgIlN3aXRjaCIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJjb25uIiwgImNvbm5lY3QgdG8gc3dpdGNoIGRhZW1vbiIsIGt0Ml9jb25uLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9ydCIsICJjb25uZWN0aW9uIHBvcnQgb24gbG9jYWxob3N0IiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSk7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZGlzY29ubiIsICJkaXNjb25uZWN0IGZyb20gc3dpdGNoIGRhZW1vbiIsIGt0Ml9kaXNjb25uKTsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImNtZCIsICJjb21tYW5kIHRvIHN3aXRjaCAtIHN0cmluZyBiZXR3ZWVuIHF1b3RlcyIsIGt0Ml9jbWQsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCIiLCAiIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSk7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2JvYXJkL3dyeC9iY21vbHRfYm9hcmRfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2JvYXJkL3dyeC9iY21vbHRfYm9hcmRfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhOTA0YQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZF9jbGkuaApAQCAtMCwwICsxLDM5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfQk9BUkRfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfQk9BUkRfQ0xJX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2JvYXJkL3dyeC9iY21vbHRfZHBsbF90YWJsZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvYmNtb2x0X2RwbGxfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hN2Q2MTBlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvYmNtb2x0X2RwbGxfdGFibGUuaApAQCAtMCwwICsxLDExNDQgQEAKKyNpZm5kZWYgX0JDTU9MVF9EUExMX1RBQkxFX0hfCisjZGVmaW5lIF9CQ01PTFRfRFBMTF9UQUJMRV9IXworCisvKiBhdXRvIGdlbmVyYXRlZCBsb2FkaW5nIGZpbGVzICovCisKK3N0YXRpYyBkcGxsX2NvbW1hbmQgZ3Bvbl9kcGxsX3RhYmxlW10gPQoreworICAgIHsweDBCLDB4MjQsMHhEOH0sCisgICAgezB4MEIsMHgyNSwweDAwfSwKKyAgICB7MHgwMCwweDBCLDB4Njh9LAorICAgIHsweDAwLDB4MTYsMHgwMn0sCisgICAgezB4MDAsMHgxNywweDFDfSwKKyAgICB7MHgwMCwweDE4LDB4RUV9LAorICAgIHsweDAwLDB4MTksMHhERH0sCisgICAgezB4MDAsMHgxQSwweERGfSwKKyAgICB7MHgwMCwweDJCLDB4MDJ9LAorICAgIHsweDAwLDB4MkMsMHgwMX0sCisgICAgezB4MDAsMHgyRCwweDAxfSwKKyAgICB7MHgwMCwweDJFLDB4NkZ9LAorICAgIHsweDAwLDB4MkYsMHgwMH0sCisgICAgezB4MDAsMHgzMCwweDAwfSwKKyAgICB7MHgwMCwweDMxLDB4MDB9LAorICAgIHsweDAwLDB4MzIsMHgwMH0sCisgICAgezB4MDAsMHgzMywweDAwfSwKKyAgICB7MHgwMCwweDM0LDB4MDB9LAorICAgIHsweDAwLDB4MzUsMHgwMH0sCisgICAgezB4MDAsMHgzNiwweDZGfSwKKyAgICB7MHgwMCwweDM3LDB4MDB9LAorICAgIHsweDAwLDB4MzgsMHgwMH0sCisgICAgezB4MDAsMHgzOSwweDAwfSwKKyAgICB7MHgwMCwweDNBLDB4MDB9LAorICAgIHsweDAwLDB4M0IsMHgwMH0sCisgICAgezB4MDAsMHgzQywweDAwfSwKKyAgICB7MHgwMCwweDNELDB4MDB9LAorICAgIHsweDAwLDB4M0YsMHgxMX0sCisgICAgezB4MDAsMHg0MCwweDA0fSwKKyAgICB7MHgwMCwweDQxLDB4MEV9LAorICAgIHsweDAwLDB4NDIsMHgwMH0sCisgICAgezB4MDAsMHg0MywweDAwfSwKKyAgICB7MHgwMCwweDQ0LDB4MDB9LAorICAgIHsweDAwLDB4NDUsMHgwQ30sCisgICAgezB4MDAsMHg0NiwweDMyfSwKKyAgICB7MHgwMCwweDQ3LDB4MDB9LAorICAgIHsweDAwLDB4NDgsMHgwMH0sCisgICAgezB4MDAsMHg0OSwweDAwfSwKKyAgICB7MHgwMCwweDRBLDB4MzJ9LAorICAgIHsweDAwLDB4NEIsMHgwMH0sCisgICAgezB4MDAsMHg0QywweDAwfSwKKyAgICB7MHgwMCwweDRELDB4MDB9LAorICAgIHsweDAwLDB4NEUsMHgwNX0sCisgICAgezB4MDAsMHg0RiwweDAwfSwKKyAgICB7MHgwMCwweDUxLDB4MDN9LAorICAgIHsweDAwLDB4NTIsMHgwMH0sCisgICAgezB4MDAsMHg1MywweDAwfSwKKyAgICB7MHgwMCwweDU0LDB4MDB9LAorICAgIHsweDAwLDB4NTUsMHgwM30sCisgICAgezB4MDAsMHg1NiwweDAwfSwKKyAgICB7MHgwMCwweDU3LDB4MDB9LAorICAgIHsweDAwLDB4NTgsMHgwMH0sCisgICAgezB4MDAsMHg1OSwweDAzfSwKKyAgICB7MHgwMCwweDVBLDB4NTV9LAorICAgIHsweDAwLDB4NUIsMHg1NX0sCisgICAgezB4MDAsMHg1QywweEQwfSwKKyAgICB7MHgwMCwweDVELDB4MDB9LAorICAgIHsweDAwLDB4NUUsMHgwMH0sCisgICAgezB4MDAsMHg1RiwweDAwfSwKKyAgICB7MHgwMCwweDYwLDB4MDB9LAorICAgIHsweDAwLDB4NjEsMHgwMH0sCisgICAgezB4MDAsMHg2MiwweDAwfSwKKyAgICB7MHgwMCwweDYzLDB4MDB9LAorICAgIHsweDAwLDB4NjQsMHgwMH0sCisgICAgezB4MDAsMHg2NSwweDAwfSwKKyAgICB7MHgwMCwweDY2LDB4MDB9LAorICAgIHsweDAwLDB4NjcsMHgwMH0sCisgICAgezB4MDAsMHg2OCwweDAwfSwKKyAgICB7MHgwMCwweDY5LDB4MDB9LAorICAgIHsweDAwLDB4OTIsMHgwMH0sCisgICAgezB4MDAsMHg5MywweDAwfSwKKyAgICB7MHgwMCwweDk1LDB4MDB9LAorICAgIHsweDAwLDB4OTYsMHgwMH0sCisgICAgezB4MDAsMHg5OCwweDAwfSwKKyAgICB7MHgwMCwweDlBLDB4MDJ9LAorICAgIHsweDAwLDB4OUIsMHgxMH0sCisgICAgezB4MDAsMHg5RCwweDAwfSwKKyAgICB7MHgwMCwweDlFLDB4MjB9LAorICAgIHsweDAwLDB4QTAsMHgwMH0sCisgICAgezB4MDAsMHhBMiwweDAyfSwKKyAgICB7MHgwMCwweEE4LDB4Qzl9LAorICAgIHsweDAwLDB4QTksMHg2Mn0sCisgICAgezB4MDAsMHhBQSwweDEwfSwKKyAgICB7MHgwMCwweEFCLDB4MDB9LAorICAgIHsweDAwLDB4QUMsMHgwMH0sCisgICAgezB4MDEsMHgwMiwweDAxfSwKKyAgICB7MHgwMSwweDA4LDB4MDZ9LAorICAgIHsweDAxLDB4MDksMHgwOX0sCisgICAgezB4MDEsMHgwQSwweDZCfSwKKyAgICB7MHgwMSwweDBCLDB4MDB9LAorICAgIHsweDAxLDB4MEQsMHgwMX0sCisgICAgezB4MDEsMHgwRSwweDA5fSwKKyAgICB7MHgwMSwweDBGLDB4M0J9LAorICAgIHsweDAxLDB4MTAsMHgwMH0sCisgICAgezB4MDEsMHgxMiwweDA2fSwKKyAgICB7MHgwMSwweDEzLDB4MDl9LAorICAgIHsweDAxLDB4MTQsMHg2Qn0sCisgICAgezB4MDEsMHgxNSwweDAwfSwKKyAgICB7MHgwMSwweDE3LDB4MDF9LAorICAgIHsweDAxLDB4MTgsMHgwOX0sCisgICAgezB4MDEsMHgxOSwweDNCfSwKKyAgICB7MHgwMSwweDFBLDB4MDB9LAorICAgIHsweDAxLDB4MUMsMHgwNn0sCisgICAgezB4MDEsMHgxRCwweDA5fSwKKyAgICB7MHgwMSwweDFFLDB4NkJ9LAorICAgIHsweDAxLDB4MUYsMHgwMH0sCisgICAgezB4MDEsMHgyMSwweDAxfSwKKyAgICB7MHgwMSwweDIyLDB4MDl9LAorICAgIHsweDAxLDB4MjMsMHgzQn0sCisgICAgezB4MDEsMHgyNCwweDAwfSwKKyAgICB7MHgwMSwweDI2LDB4MDZ9LAorICAgIHsweDAxLDB4MjcsMHgwOX0sCisgICAgezB4MDEsMHgyOCwweDZCfSwKKyAgICB7MHgwMSwweDI5LDB4MDB9LAorICAgIHsweDAxLDB4MkIsMHgwMX0sCisgICAgezB4MDEsMHgyQywweDA5fSwKKyAgICB7MHgwMSwweDJELDB4M0J9LAorICAgIHsweDAxLDB4MkUsMHgwMH0sCisgICAgezB4MDEsMHgzMCwweDA2fSwKKyAgICB7MHgwMSwweDMxLDB4MDl9LAorICAgIHsweDAxLDB4MzIsMHg2Qn0sCisgICAgezB4MDEsMHgzMywweDAwfSwKKyAgICB7MHgwMSwweDNBLDB4MDZ9LAorICAgIHsweDAxLDB4M0IsMHhDQ30sCisgICAgezB4MDEsMHgzQywweDAwfSwKKyAgICB7MHgwMSwweDNELDB4MDB9LAorICAgIHsweDAxLDB4M0YsMHgwMH0sCisgICAgezB4MDEsMHg0MCwweDAwfSwKKyAgICB7MHgwMSwweDQxLDB4NDB9LAorICAgIHsweDAxLDB4NDIsMHhGRn0sCisgICAgezB4MDIsMHgwMiwweDAwfSwKKyAgICB7MHgwMiwweDAzLDB4MDB9LAorICAgIHsweDAyLDB4MDQsMHgwMH0sCisgICAgezB4MDIsMHgwNSwweDAwfSwKKyAgICB7MHgwMiwweDA2LDB4MDB9LAorICAgIHsweDAyLDB4MDgsMHg0Rn0sCisgICAgezB4MDIsMHgwOSwweDAwfSwKKyAgICB7MHgwMiwweDBBLDB4MDB9LAorICAgIHsweDAyLDB4MEIsMHgwMH0sCisgICAgezB4MDIsMHgwQywweDAwfSwKKyAgICB7MHgwMiwweDBELDB4MDB9LAorICAgIHsweDAyLDB4MEUsMHgwMX0sCisgICAgezB4MDIsMHgwRiwweDAwfSwKKyAgICB7MHgwMiwweDEwLDB4MDB9LAorICAgIHsweDAyLDB4MTEsMHgwMH0sCisgICAgezB4MDIsMHgxMiwweDAwfSwKKyAgICB7MHgwMiwweDEzLDB4MDB9LAorICAgIHsweDAyLDB4MTQsMHgwMH0sCisgICAgezB4MDIsMHgxNSwweDAwfSwKKyAgICB7MHgwMiwweDE2LDB4MDB9LAorICAgIHsweDAyLDB4MTcsMHgwMH0sCisgICAgezB4MDIsMHgxOCwweDAwfSwKKyAgICB7MHgwMiwweDE5LDB4MDB9LAorICAgIHsweDAyLDB4MUEsMHgwMH0sCisgICAgezB4MDIsMHgxQiwweDAwfSwKKyAgICB7MHgwMiwweDFDLDB4MDB9LAorICAgIHsweDAyLDB4MUQsMHgwMH0sCisgICAgezB4MDIsMHgxRSwweDAwfSwKKyAgICB7MHgwMiwweDFGLDB4MDB9LAorICAgIHsweDAyLDB4MjAsMHgwMH0sCisgICAgezB4MDIsMHgyMSwweDAwfSwKKyAgICB7MHgwMiwweDIyLDB4MDB9LAorICAgIHsweDAyLDB4MjMsMHgwMH0sCisgICAgezB4MDIsMHgyNCwweDAwfSwKKyAgICB7MHgwMiwweDI1LDB4MDB9LAorICAgIHsweDAyLDB4MjYsMHgwMH0sCisgICAgezB4MDIsMHgyNywweDAwfSwKKyAgICB7MHgwMiwweDI4LDB4MDB9LAorICAgIHsweDAyLDB4MjksMHgwMH0sCisgICAgezB4MDIsMHgyQSwweDAwfSwKKyAgICB7MHgwMiwweDJCLDB4MDB9LAorICAgIHsweDAyLDB4MkMsMHgwMH0sCisgICAgezB4MDIsMHgyRCwweDAwfSwKKyAgICB7MHgwMiwweDJFLDB4MDB9LAorICAgIHsweDAyLDB4MkYsMHgwMH0sCisgICAgezB4MDIsMHgzMSwweDAzfSwKKyAgICB7MHgwMiwweDMyLDB4MDN9LAorICAgIHsweDAyLDB4MzMsMHgwM30sCisgICAgezB4MDIsMHgzNCwweDAzfSwKKyAgICB7MHgwMiwweDM1LDB4MDB9LAorICAgIHsweDAyLDB4MzYsMHgwMH0sCisgICAgezB4MDIsMHgzNywweDAwfSwKKyAgICB7MHgwMiwweDM4LDB4QzB9LAorICAgIHsweDAyLDB4MzksMHhERX0sCisgICAgezB4MDIsMHgzQSwweDAwfSwKKyAgICB7MHgwMiwweDNCLDB4MDB9LAorICAgIHsweDAyLDB4M0MsMHgwMH0sCisgICAgezB4MDIsMHgzRCwweDAwfSwKKyAgICB7MHgwMiwweDNFLDB4Qzh9LAorICAgIHsweDAyLDB4NEEsMHgwMH0sCisgICAgezB4MDIsMHg0QiwweDAwfSwKKyAgICB7MHgwMiwweDRDLDB4MDB9LAorICAgIHsweDAyLDB4NEQsMHgwMH0sCisgICAgezB4MDIsMHg0RSwweDAwfSwKKyAgICB7MHgwMiwweDRGLDB4MDB9LAorICAgIHsweDAyLDB4NTAsMHgwMH0sCisgICAgezB4MDIsMHg1MSwweDAwfSwKKyAgICB7MHgwMiwweDUyLDB4MDB9LAorICAgIHsweDAyLDB4NTMsMHgwMH0sCisgICAgezB4MDIsMHg1NCwweDAwfSwKKyAgICB7MHgwMiwweDU1LDB4MDB9LAorICAgIHsweDAyLDB4NTYsMHgwMH0sCisgICAgezB4MDIsMHg1NywweDAwfSwKKyAgICB7MHgwMiwweDU4LDB4MDB9LAorICAgIHsweDAyLDB4NTksMHgwMH0sCisgICAgezB4MDIsMHg1QSwweDAwfSwKKyAgICB7MHgwMiwweDVCLDB4MDB9LAorICAgIHsweDAyLDB4NUMsMHgwMH0sCisgICAgezB4MDIsMHg1RCwweDAwfSwKKyAgICB7MHgwMiwweDVFLDB4MDB9LAorICAgIHsweDAyLDB4NUYsMHgwMH0sCisgICAgezB4MDIsMHg2MCwweDAwfSwKKyAgICB7MHgwMiwweDYxLDB4MDB9LAorICAgIHsweDAyLDB4NjIsMHgwMH0sCisgICAgezB4MDIsMHg2MywweDAwfSwKKyAgICB7MHgwMiwweDY0LDB4MDB9LAorICAgIHsweDAyLDB4NjgsMHgwMH0sCisgICAgezB4MDIsMHg2OSwweDAwfSwKKyAgICB7MHgwMiwweDZBLDB4MDB9LAorICAgIHsweDAyLDB4NkIsMHg0N30sCisgICAgezB4MDIsMHg2QywweDUwfSwKKyAgICB7MHgwMiwweDZELDB4NEZ9LAorICAgIHsweDAyLDB4NkUsMHg0RX0sCisgICAgezB4MDIsMHg2RiwweDVGfSwKKyAgICB7MHgwMiwweDcwLDB4NDN9LAorICAgIHsweDAyLDB4NzEsMHg0Q30sCisgICAgezB4MDIsMHg3MiwweDRCfSwKKyAgICB7MHgwMywweDAyLDB4MDB9LAorICAgIHsweDAzLDB4MDMsMHgwMH0sCisgICAgezB4MDMsMHgwNCwweDAwfSwKKyAgICB7MHgwMywweDA1LDB4MDB9LAorICAgIHsweDAzLDB4MDYsMHgxNn0sCisgICAgezB4MDMsMHgwNywweDAwfSwKKyAgICB7MHgwMywweDA4LDB4MDB9LAorICAgIHsweDAzLDB4MDksMHgwMH0sCisgICAgezB4MDMsMHgwQSwweDAwfSwKKyAgICB7MHgwMywweDBCLDB4ODB9LAorICAgIHsweDAzLDB4MEQsMHgwMH0sCisgICAgezB4MDMsMHgwRSwweDAwfSwKKyAgICB7MHgwMywweDBGLDB4MDB9LAorICAgIHsweDAzLDB4MTAsMHgwMH0sCisgICAgezB4MDMsMHgxMSwweDAwfSwKKyAgICB7MHgwMywweDEyLDB4MDB9LAorICAgIHsweDAzLDB4MTMsMHgwMH0sCisgICAgezB4MDMsMHgxNCwweDAwfSwKKyAgICB7MHgwMywweDE1LDB4MDB9LAorICAgIHsweDAzLDB4MTYsMHgwMH0sCisgICAgezB4MDMsMHgxOCwweDAwfSwKKyAgICB7MHgwMywweDE5LDB4MDB9LAorICAgIHsweDAzLDB4MUEsMHgwMH0sCisgICAgezB4MDMsMHgxQiwweDAwfSwKKyAgICB7MHgwMywweDFDLDB4MDB9LAorICAgIHsweDAzLDB4MUQsMHgwMH0sCisgICAgezB4MDMsMHgxRSwweDAwfSwKKyAgICB7MHgwMywweDFGLDB4MDB9LAorICAgIHsweDAzLDB4MjAsMHgwMH0sCisgICAgezB4MDMsMHgyMSwweDAwfSwKKyAgICB7MHgwMywweDIzLDB4MDB9LAorICAgIHsweDAzLDB4MjQsMHgwMH0sCisgICAgezB4MDMsMHgyNSwweDAwfSwKKyAgICB7MHgwMywweDI2LDB4MDB9LAorICAgIHsweDAzLDB4MjcsMHgwMH0sCisgICAgezB4MDMsMHgyOCwweDAwfSwKKyAgICB7MHgwMywweDI5LDB4MDB9LAorICAgIHsweDAzLDB4MkEsMHgwMH0sCisgICAgezB4MDMsMHgyQiwweDAwfSwKKyAgICB7MHgwMywweDJDLDB4MDB9LAorICAgIHsweDAzLDB4MkUsMHgwMH0sCisgICAgezB4MDMsMHgyRiwweDAwfSwKKyAgICB7MHgwMywweDMwLDB4MDB9LAorICAgIHsweDAzLDB4MzEsMHgwMH0sCisgICAgezB4MDMsMHgzMiwweDAwfSwKKyAgICB7MHgwMywweDMzLDB4MDB9LAorICAgIHsweDAzLDB4MzQsMHgwMH0sCisgICAgezB4MDMsMHgzNSwweDAwfSwKKyAgICB7MHgwMywweDM2LDB4MDB9LAorICAgIHsweDAzLDB4MzcsMHgwMH0sCisgICAgezB4MDMsMHgzOSwweDFGfSwKKyAgICB7MHgwMywweDNCLDB4MDB9LAorICAgIHsweDAzLDB4M0MsMHgwMH0sCisgICAgezB4MDMsMHgzRCwweDAwfSwKKyAgICB7MHgwMywweDNFLDB4MDB9LAorICAgIHsweDAzLDB4M0YsMHgwMH0sCisgICAgezB4MDMsMHg0MCwweDAwfSwKKyAgICB7MHgwMywweDQxLDB4MDB9LAorICAgIHsweDAzLDB4NDIsMHgwMH0sCisgICAgezB4MDMsMHg0MywweDAwfSwKKyAgICB7MHgwMywweDQ0LDB4MDB9LAorICAgIHsweDAzLDB4NDUsMHgwMH0sCisgICAgezB4MDMsMHg0NiwweDAwfSwKKyAgICB7MHgwMywweDQ3LDB4MDB9LAorICAgIHsweDAzLDB4NDgsMHgwMH0sCisgICAgezB4MDMsMHg0OSwweDAwfSwKKyAgICB7MHgwMywweDRBLDB4MDB9LAorICAgIHsweDAzLDB4NEIsMHgwMH0sCisgICAgezB4MDMsMHg0QywweDAwfSwKKyAgICB7MHgwMywweDRELDB4MDB9LAorICAgIHsweDAzLDB4NEUsMHgwMH0sCisgICAgezB4MDMsMHg0RiwweDAwfSwKKyAgICB7MHgwMywweDUwLDB4MDB9LAorICAgIHsweDAzLDB4NTEsMHgwMH0sCisgICAgezB4MDMsMHg1MiwweDAwfSwKKyAgICB7MHgwMywweDUzLDB4MDB9LAorICAgIHsweDAzLDB4NTQsMHgwMH0sCisgICAgezB4MDMsMHg1NSwweDAwfSwKKyAgICB7MHgwMywweDU2LDB4MDB9LAorICAgIHsweDAzLDB4NTcsMHgwMH0sCisgICAgezB4MDMsMHg1OCwweDAwfSwKKyAgICB7MHgwMywweDU5LDB4MDB9LAorICAgIHsweDAzLDB4NUEsMHgwMH0sCisgICAgezB4MDMsMHg1QiwweDAwfSwKKyAgICB7MHgwMywweDVDLDB4MDB9LAorICAgIHsweDAzLDB4NUQsMHgwMH0sCisgICAgezB4MDMsMHg1RSwweDAwfSwKKyAgICB7MHgwMywweDVGLDB4MDB9LAorICAgIHsweDAzLDB4NjAsMHgwMH0sCisgICAgezB4MDMsMHg2MSwweDAwfSwKKyAgICB7MHgwMywweDYyLDB4MDB9LAorICAgIHsweDA0LDB4ODcsMHgwMH0sCisgICAgezB4MDUsMHgwMiwweDAxfSwKKyAgICB7MHgwNSwweDA4LDB4MTR9LAorICAgIHsweDA1LDB4MDksMHgyMn0sCisgICAgezB4MDUsMHgwQSwweDBEfSwKKyAgICB7MHgwNSwweDBCLDB4MEN9LAorICAgIHsweDA1LDB4MEMsMHgwMX0sCisgICAgezB4MDUsMHgwRCwweDNGfSwKKyAgICB7MHgwNSwweDBFLDB4MTV9LAorICAgIHsweDA1LDB4MEYsMHgyNn0sCisgICAgezB4MDUsMHgxMCwweDBDfSwKKyAgICB7MHgwNSwweDExLDB4MEJ9LAorICAgIHsweDA1LDB4MTIsMHgwMX0sCisgICAgezB4MDUsMHgxMywweDNGfSwKKyAgICB7MHgwNSwweDE1LDB4MDB9LAorICAgIHsweDA1LDB4MTYsMHgwMH0sCisgICAgezB4MDUsMHgxNywweDAwfSwKKyAgICB7MHgwNSwweDE4LDB4REZ9LAorICAgIHsweDA1LDB4MTksMHgzOH0sCisgICAgezB4MDUsMHgxQSwweDAzfSwKKyAgICB7MHgwNSwweDFCLDB4MDB9LAorICAgIHsweDA1LDB4MUMsMHgwMH0sCisgICAgezB4MDUsMHgxRCwweDgwfSwKKyAgICB7MHgwNSwweDFFLDB4OTZ9LAorICAgIHsweDA1LDB4MUYsMHg5OH0sCisgICAgezB4MDUsMHgyMSwweDMzfSwKKyAgICB7MHgwNSwweDJBLDB4MDF9LAorICAgIHsweDA1LDB4MkIsMHgwMX0sCisgICAgezB4MDUsMHgyQywweDBGfSwKKyAgICB7MHgwNSwweDJELDB4MDN9LAorICAgIHsweDA1LDB4MkUsMHgxOX0sCisgICAgezB4MDUsMHgyRiwweDE5fSwKKyAgICB7MHgwNSwweDMxLDB4MDB9LAorICAgIHsweDA1LDB4MzIsMHg0Qn0sCisgICAgezB4MDUsMHgzMywweDAzfSwKKyAgICB7MHgwNSwweDM0LDB4MDB9LAorICAgIHsweDA1LDB4MzYsMHgwQ30sCisgICAgezB4MDUsMHgzNywweDAwfSwKKyAgICB7MHgwNSwweDM4LDB4MDF9LAorICAgIHsweDA1LDB4MzksMHgwMH0sCisgICAgezB4MDksMHgwRSwweDAyfSwKKyAgICB7MHgwOSwweDQzLDB4MDF9LAorICAgIHsweDA5LDB4NDksMHgwMX0sCisgICAgezB4MDksMHg0QSwweDAxfSwKKyAgICB7MHgwQSwweDAyLDB4MDB9LAorICAgIHsweDBBLDB4MDMsMHgwMX0sCisgICAgezB4MEEsMHgwNCwweDAxfSwKKyAgICB7MHgwQSwweDA1LDB4MDF9LAorICAgIHsweDBCLDB4NDQsMHgwRn0sCisgICAgezB4MEIsMHg0NiwweDAwfSwKKyAgICB7MHgwQiwweDQ3LDB4MDB9LAorICAgIHsweDBCLDB4NDgsMHgwRX0sCisgICAgezB4MEIsMHg0QSwweDFFfSwKKyAgICB7MHgwNSwweDE0LDB4MDF9LAorICAgIHsweDAwLDB4MUMsMHgwMX0sCisgICAgezB4MEIsMHgyNCwweERCfSwKKyAgICB7MHgwQiwweDI1LDB4MDJ9Cit9OworCitzdGF0aWMgZHBsbF9jb21tYW5kIGVwb25fZHBsbF90YWJsZVtdID0KK3sKKyAgICB7MHgwQiwweDI0LDB4RDh9LAorICAgIHsweDBCLDB4MjUsMHgwMH0sCisgICAgezB4MDAsMHgwQiwweDY4fSwKKyAgICB7MHgwMCwweDE2LDB4MDJ9LAorICAgIHsweDAwLDB4MTcsMHgxQ30sCisgICAgezB4MDAsMHgxOCwweEVFfSwKKyAgICB7MHgwMCwweDE5LDB4RER9LAorICAgIHsweDAwLDB4MUEsMHhERn0sCisgICAgezB4MDAsMHgyQiwweDAyfSwKKyAgICB7MHgwMCwweDJDLDB4MDF9LAorICAgIHsweDAwLDB4MkQsMHgwMX0sCisgICAgezB4MDAsMHgyRSwweDcwfSwKKyAgICB7MHgwMCwweDJGLDB4MDB9LAorICAgIHsweDAwLDB4MzAsMHgwMH0sCisgICAgezB4MDAsMHgzMSwweDAwfSwKKyAgICB7MHgwMCwweDMyLDB4MDB9LAorICAgIHsweDAwLDB4MzMsMHgwMH0sCisgICAgezB4MDAsMHgzNCwweDAwfSwKKyAgICB7MHgwMCwweDM1LDB4MDB9LAorICAgIHsweDAwLDB4MzYsMHg3MH0sCisgICAgezB4MDAsMHgzNywweDAwfSwKKyAgICB7MHgwMCwweDM4LDB4MDB9LAorICAgIHsweDAwLDB4MzksMHgwMH0sCisgICAgezB4MDAsMHgzQSwweDAwfSwKKyAgICB7MHgwMCwweDNCLDB4MDB9LAorICAgIHsweDAwLDB4M0MsMHgwMH0sCisgICAgezB4MDAsMHgzRCwweDAwfSwKKyAgICB7MHgwMCwweDNGLDB4MTF9LAorICAgIHsweDAwLDB4NDAsMHgwNH0sCisgICAgezB4MDAsMHg0MSwweDBFfSwKKyAgICB7MHgwMCwweDQyLDB4MDB9LAorICAgIHsweDAwLDB4NDMsMHgwMH0sCisgICAgezB4MDAsMHg0NCwweDAwfSwKKyAgICB7MHgwMCwweDQ1LDB4MEN9LAorICAgIHsweDAwLDB4NDYsMHgzMn0sCisgICAgezB4MDAsMHg0NywweDAwfSwKKyAgICB7MHgwMCwweDQ4LDB4MDB9LAorICAgIHsweDAwLDB4NDksMHgwMH0sCisgICAgezB4MDAsMHg0QSwweDMyfSwKKyAgICB7MHgwMCwweDRCLDB4MDB9LAorICAgIHsweDAwLDB4NEMsMHgwMH0sCisgICAgezB4MDAsMHg0RCwweDAwfSwKKyAgICB7MHgwMCwweDRFLDB4MDV9LAorICAgIHsweDAwLDB4NEYsMHgwMH0sCisgICAgezB4MDAsMHg1MSwweDAzfSwKKyAgICB7MHgwMCwweDUyLDB4MDB9LAorICAgIHsweDAwLDB4NTMsMHgwMH0sCisgICAgezB4MDAsMHg1NCwweDAwfSwKKyAgICB7MHgwMCwweDU1LDB4MDN9LAorICAgIHsweDAwLDB4NTYsMHgwMH0sCisgICAgezB4MDAsMHg1NywweDAwfSwKKyAgICB7MHgwMCwweDU4LDB4MDB9LAorICAgIHsweDAwLDB4NTksMHgwM30sCisgICAgezB4MDAsMHg1QSwweDU1fSwKKyAgICB7MHgwMCwweDVCLDB4NTV9LAorICAgIHsweDAwLDB4NUMsMHhEMH0sCisgICAgezB4MDAsMHg1RCwweDAwfSwKKyAgICB7MHgwMCwweDVFLDB4MDB9LAorICAgIHsweDAwLDB4NUYsMHgwMH0sCisgICAgezB4MDAsMHg2MCwweDAwfSwKKyAgICB7MHgwMCwweDYxLDB4MDB9LAorICAgIHsweDAwLDB4NjIsMHgwMH0sCisgICAgezB4MDAsMHg2MywweDAwfSwKKyAgICB7MHgwMCwweDY0LDB4MDB9LAorICAgIHsweDAwLDB4NjUsMHgwMH0sCisgICAgezB4MDAsMHg2NiwweDAwfSwKKyAgICB7MHgwMCwweDY3LDB4MDB9LAorICAgIHsweDAwLDB4NjgsMHgwMH0sCisgICAgezB4MDAsMHg2OSwweDAwfSwKKyAgICB7MHgwMCwweDkyLDB4MDB9LAorICAgIHsweDAwLDB4OTMsMHgwMH0sCisgICAgezB4MDAsMHg5NSwweDAwfSwKKyAgICB7MHgwMCwweDk2LDB4MDB9LAorICAgIHsweDAwLDB4OTgsMHgwMH0sCisgICAgezB4MDAsMHg5QSwweDAyfSwKKyAgICB7MHgwMCwweDlCLDB4MTB9LAorICAgIHsweDAwLDB4OUQsMHgwMH0sCisgICAgezB4MDAsMHg5RSwweDIwfSwKKyAgICB7MHgwMCwweEEwLDB4MDB9LAorICAgIHsweDAwLDB4QTIsMHgwMn0sCisgICAgezB4MDAsMHhBOCwweDFFfSwKKyAgICB7MHgwMCwweEE5LDB4OTR9LAorICAgIHsweDAwLDB4QUEsMHgxMH0sCisgICAgezB4MDAsMHhBQiwweDAwfSwKKyAgICB7MHgwMCwweEFDLDB4MDB9LAorICAgIHsweDAxLDB4MDIsMHgwMX0sCisgICAgezB4MDEsMHgwOCwweDA2fSwKKyAgICB7MHgwMSwweDA5LDB4MDl9LAorICAgIHsweDAxLDB4MEEsMHg2Qn0sCisgICAgezB4MDEsMHgwQiwweDAwfSwKKyAgICB7MHgwMSwweDBELDB4MDF9LAorICAgIHsweDAxLDB4MEUsMHgwOX0sCisgICAgezB4MDEsMHgwRiwweDNCfSwKKyAgICB7MHgwMSwweDEwLDB4MDB9LAorICAgIHsweDAxLDB4MTIsMHgwNn0sCisgICAgezB4MDEsMHgxMywweDA5fSwKKyAgICB7MHgwMSwweDE0LDB4NkJ9LAorICAgIHsweDAxLDB4MTUsMHgwMH0sCisgICAgezB4MDEsMHgxNywweDAxfSwKKyAgICB7MHgwMSwweDE4LDB4MDl9LAorICAgIHsweDAxLDB4MTksMHgzQn0sCisgICAgezB4MDEsMHgxQSwweDAwfSwKKyAgICB7MHgwMSwweDFDLDB4MDZ9LAorICAgIHsweDAxLDB4MUQsMHgwOX0sCisgICAgezB4MDEsMHgxRSwweDZCfSwKKyAgICB7MHgwMSwweDFGLDB4MDB9LAorICAgIHsweDAxLDB4MjEsMHgwMX0sCisgICAgezB4MDEsMHgyMiwweDA5fSwKKyAgICB7MHgwMSwweDIzLDB4M0J9LAorICAgIHsweDAxLDB4MjQsMHgwMH0sCisgICAgezB4MDEsMHgyNiwweDA2fSwKKyAgICB7MHgwMSwweDI3LDB4MDl9LAorICAgIHsweDAxLDB4MjgsMHg2Qn0sCisgICAgezB4MDEsMHgyOSwweDAwfSwKKyAgICB7MHgwMSwweDJCLDB4MDF9LAorICAgIHsweDAxLDB4MkMsMHgwOX0sCisgICAgezB4MDEsMHgyRCwweDNCfSwKKyAgICB7MHgwMSwweDJFLDB4MDB9LAorICAgIHsweDAxLDB4MzAsMHgwNn0sCisgICAgezB4MDEsMHgzMSwweDA5fSwKKyAgICB7MHgwMSwweDMyLDB4NkJ9LAorICAgIHsweDAxLDB4MzMsMHgwMH0sCisgICAgezB4MDEsMHgzQSwweDA2fSwKKyAgICB7MHgwMSwweDNCLDB4Q0N9LAorICAgIHsweDAxLDB4M0MsMHgwMH0sCisgICAgezB4MDEsMHgzRCwweDAwfSwKKyAgICB7MHgwMSwweDNGLDB4MDB9LAorICAgIHsweDAxLDB4NDAsMHgwMH0sCisgICAgezB4MDEsMHg0MSwweDQwfSwKKyAgICB7MHgwMSwweDQyLDB4RkZ9LAorICAgIHsweDAyLDB4MDIsMHgwMH0sCisgICAgezB4MDIsMHgwMywweDAwfSwKKyAgICB7MHgwMiwweDA0LDB4MDB9LAorICAgIHsweDAyLDB4MDUsMHgwMH0sCisgICAgezB4MDIsMHgwNiwweDAwfSwKKyAgICB7MHgwMiwweDA4LDB4NEZ9LAorICAgIHsweDAyLDB4MDksMHgwMH0sCisgICAgezB4MDIsMHgwQSwweDAwfSwKKyAgICB7MHgwMiwweDBCLDB4MDB9LAorICAgIHsweDAyLDB4MEMsMHgwMH0sCisgICAgezB4MDIsMHgwRCwweDAwfSwKKyAgICB7MHgwMiwweDBFLDB4MDF9LAorICAgIHsweDAyLDB4MEYsMHgwMH0sCisgICAgezB4MDIsMHgxMCwweDAwfSwKKyAgICB7MHgwMiwweDExLDB4MDB9LAorICAgIHsweDAyLDB4MTIsMHgwMH0sCisgICAgezB4MDIsMHgxMywweDAwfSwKKyAgICB7MHgwMiwweDE0LDB4MDB9LAorICAgIHsweDAyLDB4MTUsMHgwMH0sCisgICAgezB4MDIsMHgxNiwweDAwfSwKKyAgICB7MHgwMiwweDE3LDB4MDB9LAorICAgIHsweDAyLDB4MTgsMHgwMH0sCisgICAgezB4MDIsMHgxOSwweDAwfSwKKyAgICB7MHgwMiwweDFBLDB4MDB9LAorICAgIHsweDAyLDB4MUIsMHgwMH0sCisgICAgezB4MDIsMHgxQywweDAwfSwKKyAgICB7MHgwMiwweDFELDB4MDB9LAorICAgIHsweDAyLDB4MUUsMHgwMH0sCisgICAgezB4MDIsMHgxRiwweDAwfSwKKyAgICB7MHgwMiwweDIwLDB4MDB9LAorICAgIHsweDAyLDB4MjEsMHgwMH0sCisgICAgezB4MDIsMHgyMiwweDAwfSwKKyAgICB7MHgwMiwweDIzLDB4MDB9LAorICAgIHsweDAyLDB4MjQsMHgwMH0sCisgICAgezB4MDIsMHgyNSwweDAwfSwKKyAgICB7MHgwMiwweDI2LDB4MDB9LAorICAgIHsweDAyLDB4MjcsMHgwMH0sCisgICAgezB4MDIsMHgyOCwweDAwfSwKKyAgICB7MHgwMiwweDI5LDB4MDB9LAorICAgIHsweDAyLDB4MkEsMHgwMH0sCisgICAgezB4MDIsMHgyQiwweDAwfSwKKyAgICB7MHgwMiwweDJDLDB4MDB9LAorICAgIHsweDAyLDB4MkQsMHgwMH0sCisgICAgezB4MDIsMHgyRSwweDAwfSwKKyAgICB7MHgwMiwweDJGLDB4MDB9LAorICAgIHsweDAyLDB4MzEsMHgwM30sCisgICAgezB4MDIsMHgzMiwweDAzfSwKKyAgICB7MHgwMiwweDMzLDB4MDN9LAorICAgIHsweDAyLDB4MzQsMHgwM30sCisgICAgezB4MDIsMHgzNSwweDAwfSwKKyAgICB7MHgwMiwweDM2LDB4MDB9LAorICAgIHsweDAyLDB4MzcsMHgwMH0sCisgICAgezB4MDIsMHgzOCwweEQ4fSwKKyAgICB7MHgwMiwweDM5LDB4RDZ9LAorICAgIHsweDAyLDB4M0EsMHgwMH0sCisgICAgezB4MDIsMHgzQiwweDAwfSwKKyAgICB7MHgwMiwweDNDLDB4MDB9LAorICAgIHsweDAyLDB4M0QsMHgwMH0sCisgICAgezB4MDIsMHgzRSwweEMwfSwKKyAgICB7MHgwMiwweDRBLDB4MDB9LAorICAgIHsweDAyLDB4NEIsMHgwMH0sCisgICAgezB4MDIsMHg0QywweDAwfSwKKyAgICB7MHgwMiwweDRELDB4MDB9LAorICAgIHsweDAyLDB4NEUsMHgwMH0sCisgICAgezB4MDIsMHg0RiwweDAwfSwKKyAgICB7MHgwMiwweDUwLDB4MDB9LAorICAgIHsweDAyLDB4NTEsMHgwMH0sCisgICAgezB4MDIsMHg1MiwweDAwfSwKKyAgICB7MHgwMiwweDUzLDB4MDB9LAorICAgIHsweDAyLDB4NTQsMHgwMH0sCisgICAgezB4MDIsMHg1NSwweDAwfSwKKyAgICB7MHgwMiwweDU2LDB4MDB9LAorICAgIHsweDAyLDB4NTcsMHgwMH0sCisgICAgezB4MDIsMHg1OCwweDAwfSwKKyAgICB7MHgwMiwweDU5LDB4MDB9LAorICAgIHsweDAyLDB4NUEsMHgwMH0sCisgICAgezB4MDIsMHg1QiwweDAwfSwKKyAgICB7MHgwMiwweDVDLDB4MDB9LAorICAgIHsweDAyLDB4NUQsMHgwMH0sCisgICAgezB4MDIsMHg1RSwweDAwfSwKKyAgICB7MHgwMiwweDVGLDB4MDB9LAorICAgIHsweDAyLDB4NjAsMHgwMH0sCisgICAgezB4MDIsMHg2MSwweDAwfSwKKyAgICB7MHgwMiwweDYyLDB4MDB9LAorICAgIHsweDAyLDB4NjMsMHgwMH0sCisgICAgezB4MDIsMHg2NCwweDAwfSwKKyAgICB7MHgwMiwweDY4LDB4MDB9LAorICAgIHsweDAyLDB4NjksMHgwMH0sCisgICAgezB4MDIsMHg2QSwweDAwfSwKKyAgICB7MHgwMiwweDZCLDB4NDV9LAorICAgIHsweDAyLDB4NkMsMHg1MH0sCisgICAgezB4MDIsMHg2RCwweDRGfSwKKyAgICB7MHgwMiwweDZFLDB4NEV9LAorICAgIHsweDAyLDB4NkYsMHg1Rn0sCisgICAgezB4MDIsMHg3MCwweDQzfSwKKyAgICB7MHgwMiwweDcxLDB4NEN9LAorICAgIHsweDAyLDB4NzIsMHg0Qn0sCisgICAgezB4MDMsMHgwMiwweDAwfSwKKyAgICB7MHgwMywweDAzLDB4MDB9LAorICAgIHsweDAzLDB4MDQsMHgwMH0sCisgICAgezB4MDMsMHgwNSwweDAwfSwKKyAgICB7MHgwMywweDA2LDB4MTZ9LAorICAgIHsweDAzLDB4MDcsMHgwMH0sCisgICAgezB4MDMsMHgwOCwweDAwfSwKKyAgICB7MHgwMywweDA5LDB4MDB9LAorICAgIHsweDAzLDB4MEEsMHgwMH0sCisgICAgezB4MDMsMHgwQiwweDgwfSwKKyAgICB7MHgwMywweDBELDB4MDB9LAorICAgIHsweDAzLDB4MEUsMHgwMH0sCisgICAgezB4MDMsMHgwRiwweDAwfSwKKyAgICB7MHgwMywweDEwLDB4MDB9LAorICAgIHsweDAzLDB4MTEsMHgwMH0sCisgICAgezB4MDMsMHgxMiwweDAwfSwKKyAgICB7MHgwMywweDEzLDB4MDB9LAorICAgIHsweDAzLDB4MTQsMHgwMH0sCisgICAgezB4MDMsMHgxNSwweDAwfSwKKyAgICB7MHgwMywweDE2LDB4MDB9LAorICAgIHsweDAzLDB4MTgsMHgwMH0sCisgICAgezB4MDMsMHgxOSwweDAwfSwKKyAgICB7MHgwMywweDFBLDB4MDB9LAorICAgIHsweDAzLDB4MUIsMHgwMH0sCisgICAgezB4MDMsMHgxQywweDAwfSwKKyAgICB7MHgwMywweDFELDB4MDB9LAorICAgIHsweDAzLDB4MUUsMHgwMH0sCisgICAgezB4MDMsMHgxRiwweDAwfSwKKyAgICB7MHgwMywweDIwLDB4MDB9LAorICAgIHsweDAzLDB4MjEsMHgwMH0sCisgICAgezB4MDMsMHgyMywweDAwfSwKKyAgICB7MHgwMywweDI0LDB4MDB9LAorICAgIHsweDAzLDB4MjUsMHgwMH0sCisgICAgezB4MDMsMHgyNiwweDAwfSwKKyAgICB7MHgwMywweDI3LDB4MDB9LAorICAgIHsweDAzLDB4MjgsMHgwMH0sCisgICAgezB4MDMsMHgyOSwweDAwfSwKKyAgICB7MHgwMywweDJBLDB4MDB9LAorICAgIHsweDAzLDB4MkIsMHgwMH0sCisgICAgezB4MDMsMHgyQywweDAwfSwKKyAgICB7MHgwMywweDJFLDB4MDB9LAorICAgIHsweDAzLDB4MkYsMHgwMH0sCisgICAgezB4MDMsMHgzMCwweDAwfSwKKyAgICB7MHgwMywweDMxLDB4MDB9LAorICAgIHsweDAzLDB4MzIsMHgwMH0sCisgICAgezB4MDMsMHgzMywweDAwfSwKKyAgICB7MHgwMywweDM0LDB4MDB9LAorICAgIHsweDAzLDB4MzUsMHgwMH0sCisgICAgezB4MDMsMHgzNiwweDAwfSwKKyAgICB7MHgwMywweDM3LDB4MDB9LAorICAgIHsweDAzLDB4MzksMHgxRn0sCisgICAgezB4MDMsMHgzQiwweDAwfSwKKyAgICB7MHgwMywweDNDLDB4MDB9LAorICAgIHsweDAzLDB4M0QsMHgwMH0sCisgICAgezB4MDMsMHgzRSwweDAwfSwKKyAgICB7MHgwMywweDNGLDB4MDB9LAorICAgIHsweDAzLDB4NDAsMHgwMH0sCisgICAgezB4MDMsMHg0MSwweDAwfSwKKyAgICB7MHgwMywweDQyLDB4MDB9LAorICAgIHsweDAzLDB4NDMsMHgwMH0sCisgICAgezB4MDMsMHg0NCwweDAwfSwKKyAgICB7MHgwMywweDQ1LDB4MDB9LAorICAgIHsweDAzLDB4NDYsMHgwMH0sCisgICAgezB4MDMsMHg0NywweDAwfSwKKyAgICB7MHgwMywweDQ4LDB4MDB9LAorICAgIHsweDAzLDB4NDksMHgwMH0sCisgICAgezB4MDMsMHg0QSwweDAwfSwKKyAgICB7MHgwMywweDRCLDB4MDB9LAorICAgIHsweDAzLDB4NEMsMHgwMH0sCisgICAgezB4MDMsMHg0RCwweDAwfSwKKyAgICB7MHgwMywweDRFLDB4MDB9LAorICAgIHsweDAzLDB4NEYsMHgwMH0sCisgICAgezB4MDMsMHg1MCwweDAwfSwKKyAgICB7MHgwMywweDUxLDB4MDB9LAorICAgIHsweDAzLDB4NTIsMHgwMH0sCisgICAgezB4MDMsMHg1MywweDAwfSwKKyAgICB7MHgwMywweDU0LDB4MDB9LAorICAgIHsweDAzLDB4NTUsMHgwMH0sCisgICAgezB4MDMsMHg1NiwweDAwfSwKKyAgICB7MHgwMywweDU3LDB4MDB9LAorICAgIHsweDAzLDB4NTgsMHgwMH0sCisgICAgezB4MDMsMHg1OSwweDAwfSwKKyAgICB7MHgwMywweDVBLDB4MDB9LAorICAgIHsweDAzLDB4NUIsMHgwMH0sCisgICAgezB4MDMsMHg1QywweDAwfSwKKyAgICB7MHgwMywweDVELDB4MDB9LAorICAgIHsweDAzLDB4NUUsMHgwMH0sCisgICAgezB4MDMsMHg1RiwweDAwfSwKKyAgICB7MHgwMywweDYwLDB4MDB9LAorICAgIHsweDAzLDB4NjEsMHgwMH0sCisgICAgezB4MDMsMHg2MiwweDAwfSwKKyAgICB7MHgwNCwweDg3LDB4MDB9LAorICAgIHsweDA1LDB4MDIsMHgwMX0sCisgICAgezB4MDUsMHgwOCwweDE0fSwKKyAgICB7MHgwNSwweDA5LDB4MjJ9LAorICAgIHsweDA1LDB4MEEsMHgwRH0sCisgICAgezB4MDUsMHgwQiwweDBDfSwKKyAgICB7MHgwNSwweDBDLDB4MDF9LAorICAgIHsweDA1LDB4MEQsMHgzRn0sCisgICAgezB4MDUsMHgwRSwweDE1fSwKKyAgICB7MHgwNSwweDBGLDB4MjZ9LAorICAgIHsweDA1LDB4MTAsMHgwQ30sCisgICAgezB4MDUsMHgxMSwweDBCfSwKKyAgICB7MHgwNSwweDEyLDB4MDF9LAorICAgIHsweDA1LDB4MTMsMHgzRn0sCisgICAgezB4MDUsMHgxNSwweDAwfSwKKyAgICB7MHgwNSwweDE2LDB4MDB9LAorICAgIHsweDA1LDB4MTcsMHgwMH0sCisgICAgezB4MDUsMHgxOCwweDAwfSwKKyAgICB7MHgwNSwweDE5LDB4NjV9LAorICAgIHsweDA1LDB4MUEsMHgwM30sCisgICAgezB4MDUsMHgxQiwweDAwfSwKKyAgICB7MHgwNSwweDFDLDB4MDB9LAorICAgIHsweDA1LDB4MUQsMHgwMH0sCisgICAgezB4MDUsMHgxRSwweDAwfSwKKyAgICB7MHgwNSwweDFGLDB4QTB9LAorICAgIHsweDA1LDB4MjEsMHgzM30sCisgICAgezB4MDUsMHgyQSwweDAxfSwKKyAgICB7MHgwNSwweDJCLDB4MDF9LAorICAgIHsweDA1LDB4MkMsMHgwRn0sCisgICAgezB4MDUsMHgyRCwweDAzfSwKKyAgICB7MHgwNSwweDJFLDB4MTl9LAorICAgIHsweDA1LDB4MkYsMHgxOX0sCisgICAgezB4MDUsMHgzMSwweDAwfSwKKyAgICB7MHgwNSwweDMyLDB4NEJ9LAorICAgIHsweDA1LDB4MzMsMHgwM30sCisgICAgezB4MDUsMHgzNCwweDAwfSwKKyAgICB7MHgwNSwweDM2LDB4MEN9LAorICAgIHsweDA1LDB4MzcsMHgwMH0sCisgICAgezB4MDUsMHgzOCwweDAxfSwKKyAgICB7MHgwNSwweDM5LDB4MDB9LAorICAgIHsweDA5LDB4MEUsMHgwMn0sCisgICAgezB4MDksMHg0MywweDAxfSwKKyAgICB7MHgwOSwweDQ5LDB4MDF9LAorICAgIHsweDA5LDB4NEEsMHgwMX0sCisgICAgezB4MEEsMHgwMiwweDAwfSwKKyAgICB7MHgwQSwweDAzLDB4MDF9LAorICAgIHsweDBBLDB4MDQsMHgwMX0sCisgICAgezB4MEEsMHgwNSwweDAxfSwKKyAgICB7MHgwQiwweDQ0LDB4MEZ9LAorICAgIHsweDBCLDB4NDYsMHgwMH0sCisgICAgezB4MEIsMHg0NywweDAwfSwKKyAgICB7MHgwQiwweDQ4LDB4MEV9LAorICAgIHsweDBCLDB4NEEsMHgxRX0sCisgICAgezB4MDUsMHgxNCwweDAxfSwKKyAgICB7MHgwMCwweDFDLDB4MDF9LAorICAgIHsweDBCLDB4MjQsMHhEQn0sCisgICAgezB4MEIsMHgyNSwweDAyfQorfTsKKworc3RhdGljIGRwbGxfY29tbWFuZCBncG9uX3N5bmNlX2RwbGxfdGFibGVbXSA9Cit7CisgICAgezB4MEIsMHgyNCwweEQ4fSwKKyAgICB7MHgwQiwweDI1LDB4MDB9LAorICAgIHsweDAwLDB4MEIsMHg2OH0sCisgICAgezB4MDAsMHgxNiwweDAyfSwKKyAgICB7MHgwMCwweDE3LDB4MUN9LAorICAgIHsweDAwLDB4MTgsMHhDQ30sCisgICAgezB4MDAsMHgxOSwweEREfSwKKyAgICB7MHgwMCwweDFBLDB4REZ9LAorICAgIHsweDAwLDB4MkIsMHgwMn0sCisgICAgezB4MDAsMHgyQywweDAzfSwKKyAgICB7MHgwMCwweDJELDB4MDV9LAorICAgIHsweDAwLDB4MkUsMHg2RX0sCisgICAgezB4MDAsMHgyRiwweDAwfSwKKyAgICB7MHgwMCwweDMwLDB4Mzd9LAorICAgIHsweDAwLDB4MzEsMHgwMH0sCisgICAgezB4MDAsMHgzMiwweDAwfSwKKyAgICB7MHgwMCwweDMzLDB4MDB9LAorICAgIHsweDAwLDB4MzQsMHgwMH0sCisgICAgezB4MDAsMHgzNSwweDAwfSwKKyAgICB7MHgwMCwweDM2LDB4NkV9LAorICAgIHsweDAwLDB4MzcsMHgwMH0sCisgICAgezB4MDAsMHgzOCwweDM3fSwKKyAgICB7MHgwMCwweDM5LDB4MDB9LAorICAgIHsweDAwLDB4M0EsMHgwMH0sCisgICAgezB4MDAsMHgzQiwweDAwfSwKKyAgICB7MHgwMCwweDNDLDB4MDB9LAorICAgIHsweDAwLDB4M0QsMHgwMH0sCisgICAgezB4MDAsMHgzRiwweDMzfSwKKyAgICB7MHgwMCwweDQwLDB4MDR9LAorICAgIHsweDAwLDB4NDEsMHgwRX0sCisgICAgezB4MDAsMHg0MiwweDBBfSwKKyAgICB7MHgwMCwweDQzLDB4MDB9LAorICAgIHsweDAwLDB4NDQsMHgwMH0sCisgICAgezB4MDAsMHg0NSwweDBDfSwKKyAgICB7MHgwMCwweDQ2LDB4MzJ9LAorICAgIHsweDAwLDB4NDcsMHgzMn0sCisgICAgezB4MDAsMHg0OCwweDAwfSwKKyAgICB7MHgwMCwweDQ5LDB4MDB9LAorICAgIHsweDAwLDB4NEEsMHgzMn0sCisgICAgezB4MDAsMHg0QiwweDMyfSwKKyAgICB7MHgwMCwweDRDLDB4MDB9LAorICAgIHsweDAwLDB4NEQsMHgwMH0sCisgICAgezB4MDAsMHg0RSwweDU1fSwKKyAgICB7MHgwMCwweDRGLDB4MDB9LAorICAgIHsweDAwLDB4NTEsMHgwM30sCisgICAgezB4MDAsMHg1MiwweDAzfSwKKyAgICB7MHgwMCwweDUzLDB4MDB9LAorICAgIHsweDAwLDB4NTQsMHgwMH0sCisgICAgezB4MDAsMHg1NSwweDAzfSwKKyAgICB7MHgwMCwweDU2LDB4MDN9LAorICAgIHsweDAwLDB4NTcsMHgwMH0sCisgICAgezB4MDAsMHg1OCwweDAwfSwKKyAgICB7MHgwMCwweDU5LDB4MEZ9LAorICAgIHsweDAwLDB4NUEsMHg1NX0sCisgICAgezB4MDAsMHg1QiwweDU1fSwKKyAgICB7MHgwMCwweDVDLDB4RDB9LAorICAgIHsweDAwLDB4NUQsMHgwMH0sCisgICAgezB4MDAsMHg1RSwweDU1fSwKKyAgICB7MHgwMCwweDVGLDB4NTV9LAorICAgIHsweDAwLDB4NjAsMHhENX0sCisgICAgezB4MDAsMHg2MSwweDAwfSwKKyAgICB7MHgwMCwweDYyLDB4MDB9LAorICAgIHsweDAwLDB4NjMsMHgwMH0sCisgICAgezB4MDAsMHg2NCwweDAwfSwKKyAgICB7MHgwMCwweDY1LDB4MDB9LAorICAgIHsweDAwLDB4NjYsMHgwMH0sCisgICAgezB4MDAsMHg2NywweDAwfSwKKyAgICB7MHgwMCwweDY4LDB4MDB9LAorICAgIHsweDAwLDB4NjksMHgwMH0sCisgICAgezB4MDAsMHg5MiwweDAwfSwKKyAgICB7MHgwMCwweDkzLDB4MDB9LAorICAgIHsweDAwLDB4OTUsMHgwMH0sCisgICAgezB4MDAsMHg5NiwweDAwfSwKKyAgICB7MHgwMCwweDk4LDB4MDB9LAorICAgIHsweDAwLDB4OUEsMHgwMn0sCisgICAgezB4MDAsMHg5QiwweDAwfSwKKyAgICB7MHgwMCwweDlELDB4MDB9LAorICAgIHsweDAwLDB4OUUsMHg2MH0sCisgICAgezB4MDAsMHhBMCwweDQwfSwKKyAgICB7MHgwMCwweEEyLDB4MDJ9LAorICAgIHsweDAwLDB4QTgsMHhCN30sCisgICAgezB4MDAsMHhBOSwweDI4fSwKKyAgICB7MHgwMCwweEFBLDB4MTB9LAorICAgIHsweDAwLDB4QUIsMHgwMH0sCisgICAgezB4MDAsMHhBQywweDAwfSwKKyAgICB7MHgwMSwweDAyLDB4MDF9LAorICAgIHsweDAxLDB4MDgsMHgwNn0sCisgICAgezB4MDEsMHgwOSwweDA5fSwKKyAgICB7MHgwMSwweDBBLDB4NkJ9LAorICAgIHsweDAxLDB4MEIsMHgwMH0sCisgICAgezB4MDEsMHgwRCwweDAxfSwKKyAgICB7MHgwMSwweDBFLDB4MDl9LAorICAgIHsweDAxLDB4MEYsMHgzQn0sCisgICAgezB4MDEsMHgxMCwweDAwfSwKKyAgICB7MHgwMSwweDEyLDB4MDZ9LAorICAgIHsweDAxLDB4MTMsMHgwOX0sCisgICAgezB4MDEsMHgxNCwweDZCfSwKKyAgICB7MHgwMSwweDE1LDB4MDB9LAorICAgIHsweDAxLDB4MTcsMHgwMX0sCisgICAgezB4MDEsMHgxOCwweDA5fSwKKyAgICB7MHgwMSwweDE5LDB4M0J9LAorICAgIHsweDAxLDB4MUEsMHgwMH0sCisgICAgezB4MDEsMHgxQywweDA2fSwKKyAgICB7MHgwMSwweDFELDB4MDl9LAorICAgIHsweDAxLDB4MUUsMHg2Qn0sCisgICAgezB4MDEsMHgxRiwweDAwfSwKKyAgICB7MHgwMSwweDIxLDB4MDF9LAorICAgIHsweDAxLDB4MjIsMHgwOX0sCisgICAgezB4MDEsMHgyMywweDNCfSwKKyAgICB7MHgwMSwweDI0LDB4MDB9LAorICAgIHsweDAxLDB4MjYsMHgwNn0sCisgICAgezB4MDEsMHgyNywweDA5fSwKKyAgICB7MHgwMSwweDI4LDB4NkJ9LAorICAgIHsweDAxLDB4MjksMHgwMH0sCisgICAgezB4MDEsMHgyQiwweDAxfSwKKyAgICB7MHgwMSwweDJDLDB4MDl9LAorICAgIHsweDAxLDB4MkQsMHgzQn0sCisgICAgezB4MDEsMHgyRSwweDAwfSwKKyAgICB7MHgwMSwweDMwLDB4MDZ9LAorICAgIHsweDAxLDB4MzEsMHgwOX0sCisgICAgezB4MDEsMHgzMiwweDZCfSwKKyAgICB7MHgwMSwweDMzLDB4MDB9LAorICAgIHsweDAxLDB4M0EsMHgwNn0sCisgICAgezB4MDEsMHgzQiwweENDfSwKKyAgICB7MHgwMSwweDNDLDB4MDB9LAorICAgIHsweDAxLDB4M0QsMHgwMH0sCisgICAgezB4MDEsMHgzRiwweDAwfSwKKyAgICB7MHgwMSwweDQwLDB4MDB9LAorICAgIHsweDAxLDB4NDEsMHg0MH0sCisgICAgezB4MDEsMHg0MiwweEZGfSwKKyAgICB7MHgwMiwweDAyLDB4MDB9LAorICAgIHsweDAyLDB4MDMsMHgwMH0sCisgICAgezB4MDIsMHgwNCwweDAwfSwKKyAgICB7MHgwMiwweDA1LDB4MDB9LAorICAgIHsweDAyLDB4MDYsMHgwMH0sCisgICAgezB4MDIsMHgwOCwweERCfSwKKyAgICB7MHgwMiwweDA5LDB4MUF9LAorICAgIHsweDAyLDB4MEEsMHgwMH0sCisgICAgezB4MDIsMHgwQiwweEM0fSwKKyAgICB7MHgwMiwweDBDLDB4MDl9LAorICAgIHsweDAyLDB4MEQsMHgwMH0sCisgICAgezB4MDIsMHgwRSwweDAwfSwKKyAgICB7MHgwMiwweDBGLDB4MDB9LAorICAgIHsweDAyLDB4MTAsMHgwMH0sCisgICAgezB4MDIsMHgxMSwweDIwfSwKKyAgICB7MHgwMiwweDEyLDB4Mzd9LAorICAgIHsweDAyLDB4MTMsMHgwMH0sCisgICAgezB4MDIsMHgxNCwweDAwfSwKKyAgICB7MHgwMiwweDE1LDB4MTR9LAorICAgIHsweDAyLDB4MTYsMHgwMH0sCisgICAgezB4MDIsMHgxNywweDAwfSwKKyAgICB7MHgwMiwweDE4LDB4MDB9LAorICAgIHsweDAyLDB4MTksMHgwMH0sCisgICAgezB4MDIsMHgxQSwweDAwfSwKKyAgICB7MHgwMiwweDFCLDB4MDR9LAorICAgIHsweDAyLDB4MUMsMHgwMH0sCisgICAgezB4MDIsMHgxRCwweDAwfSwKKyAgICB7MHgwMiwweDFFLDB4MDB9LAorICAgIHsweDAyLDB4MUYsMHgwMH0sCisgICAgezB4MDIsMHgyMCwweDAwfSwKKyAgICB7MHgwMiwweDIxLDB4MDB9LAorICAgIHsweDAyLDB4MjIsMHgwMH0sCisgICAgezB4MDIsMHgyMywweDAwfSwKKyAgICB7MHgwMiwweDI0LDB4MDB9LAorICAgIHsweDAyLDB4MjUsMHgwMH0sCisgICAgezB4MDIsMHgyNiwweDAwfSwKKyAgICB7MHgwMiwweDI3LDB4MDB9LAorICAgIHsweDAyLDB4MjgsMHgwMH0sCisgICAgezB4MDIsMHgyOSwweDAwfSwKKyAgICB7MHgwMiwweDJBLDB4MDB9LAorICAgIHsweDAyLDB4MkIsMHgwMH0sCisgICAgezB4MDIsMHgyQywweDAwfSwKKyAgICB7MHgwMiwweDJELDB4MDB9LAorICAgIHsweDAyLDB4MkUsMHgwMH0sCisgICAgezB4MDIsMHgyRiwweDAwfSwKKyAgICB7MHgwMiwweDMxLDB4MTF9LAorICAgIHsweDAyLDB4MzIsMHgxMX0sCisgICAgezB4MDIsMHgzMywweDAxfSwKKyAgICB7MHgwMiwweDM0LDB4MDF9LAorICAgIHsweDAyLDB4MzUsMHgwMH0sCisgICAgezB4MDIsMHgzNiwweDAwfSwKKyAgICB7MHgwMiwweDM3LDB4MDB9LAorICAgIHsweDAyLDB4MzgsMHhDMH0sCisgICAgezB4MDIsMHgzOSwweERFfSwKKyAgICB7MHgwMiwweDNBLDB4MDB9LAorICAgIHsweDAyLDB4M0IsMHgwMH0sCisgICAgezB4MDIsMHgzQywweDAwfSwKKyAgICB7MHgwMiwweDNELDB4MDB9LAorICAgIHsweDAyLDB4M0UsMHhDOH0sCisgICAgezB4MDIsMHg0QSwweDAwfSwKKyAgICB7MHgwMiwweDRCLDB4MDB9LAorICAgIHsweDAyLDB4NEMsMHgwMH0sCisgICAgezB4MDIsMHg0RCwweDAwfSwKKyAgICB7MHgwMiwweDRFLDB4MDB9LAorICAgIHsweDAyLDB4NEYsMHgwMH0sCisgICAgezB4MDIsMHg1MCwweDAwfSwKKyAgICB7MHgwMiwweDUxLDB4MDB9LAorICAgIHsweDAyLDB4NTIsMHgwMH0sCisgICAgezB4MDIsMHg1MywweDAwfSwKKyAgICB7MHgwMiwweDU0LDB4MDB9LAorICAgIHsweDAyLDB4NTUsMHgwMH0sCisgICAgezB4MDIsMHg1NiwweDAwfSwKKyAgICB7MHgwMiwweDU3LDB4MDB9LAorICAgIHsweDAyLDB4NTgsMHgwMH0sCisgICAgezB4MDIsMHg1OSwweDAwfSwKKyAgICB7MHgwMiwweDVBLDB4MDB9LAorICAgIHsweDAyLDB4NUIsMHgwMH0sCisgICAgezB4MDIsMHg1QywweDAwfSwKKyAgICB7MHgwMiwweDVELDB4MDB9LAorICAgIHsweDAyLDB4NUUsMHgwMH0sCisgICAgezB4MDIsMHg1RiwweDAwfSwKKyAgICB7MHgwMiwweDYwLDB4MDB9LAorICAgIHsweDAyLDB4NjEsMHgwMH0sCisgICAgezB4MDIsMHg2MiwweDAwfSwKKyAgICB7MHgwMiwweDYzLDB4MDB9LAorICAgIHsweDAyLDB4NjQsMHgwMH0sCisgICAgezB4MDIsMHg2OCwweDAwfSwKKyAgICB7MHgwMiwweDY5LDB4MDB9LAorICAgIHsweDAyLDB4NkEsMHgwMH0sCisgICAgezB4MDIsMHg2QiwweDQ3fSwKKyAgICB7MHgwMiwweDZDLDB4NTB9LAorICAgIHsweDAyLDB4NkQsMHg0Rn0sCisgICAgezB4MDIsMHg2RSwweDRFfSwKKyAgICB7MHgwMiwweDZGLDB4NUZ9LAorICAgIHsweDAyLDB4NzAsMHg0M30sCisgICAgezB4MDIsMHg3MSwweDRDfSwKKyAgICB7MHgwMiwweDcyLDB4NEJ9LAorICAgIHsweDAzLDB4MDIsMHgwMH0sCisgICAgezB4MDMsMHgwMywweDAwfSwKKyAgICB7MHgwMywweDA0LDB4MDB9LAorICAgIHsweDAzLDB4MDUsMHgwMH0sCisgICAgezB4MDMsMHgwNiwweDE2fSwKKyAgICB7MHgwMywweDA3LDB4MDB9LAorICAgIHsweDAzLDB4MDgsMHgwMH0sCisgICAgezB4MDMsMHgwOSwweDAwfSwKKyAgICB7MHgwMywweDBBLDB4MDB9LAorICAgIHsweDAzLDB4MEIsMHg4MH0sCisgICAgezB4MDMsMHgwRCwweDAwfSwKKyAgICB7MHgwMywweDBFLDB4MDB9LAorICAgIHsweDAzLDB4MEYsMHgwMH0sCisgICAgezB4MDMsMHgxMCwweDAwfSwKKyAgICB7MHgwMywweDExLDB4MDB9LAorICAgIHsweDAzLDB4MTIsMHgwMH0sCisgICAgezB4MDMsMHgxMywweDAwfSwKKyAgICB7MHgwMywweDE0LDB4MDB9LAorICAgIHsweDAzLDB4MTUsMHgwMH0sCisgICAgezB4MDMsMHgxNiwweDAwfSwKKyAgICB7MHgwMywweDE4LDB4MDB9LAorICAgIHsweDAzLDB4MTksMHgwMH0sCisgICAgezB4MDMsMHgxQSwweDAwfSwKKyAgICB7MHgwMywweDFCLDB4MDB9LAorICAgIHsweDAzLDB4MUMsMHgwMH0sCisgICAgezB4MDMsMHgxRCwweDAwfSwKKyAgICB7MHgwMywweDFFLDB4MDB9LAorICAgIHsweDAzLDB4MUYsMHgwMH0sCisgICAgezB4MDMsMHgyMCwweDAwfSwKKyAgICB7MHgwMywweDIxLDB4MDB9LAorICAgIHsweDAzLDB4MjMsMHgwMH0sCisgICAgezB4MDMsMHgyNCwweDAwfSwKKyAgICB7MHgwMywweDI1LDB4MDB9LAorICAgIHsweDAzLDB4MjYsMHgwMH0sCisgICAgezB4MDMsMHgyNywweDAwfSwKKyAgICB7MHgwMywweDI4LDB4MDB9LAorICAgIHsweDAzLDB4MjksMHgwMH0sCisgICAgezB4MDMsMHgyQSwweDAwfSwKKyAgICB7MHgwMywweDJCLDB4MDB9LAorICAgIHsweDAzLDB4MkMsMHgwMH0sCisgICAgezB4MDMsMHgyRSwweDAwfSwKKyAgICB7MHgwMywweDJGLDB4MDB9LAorICAgIHsweDAzLDB4MzAsMHgwMH0sCisgICAgezB4MDMsMHgzMSwweDAwfSwKKyAgICB7MHgwMywweDMyLDB4MDB9LAorICAgIHsweDAzLDB4MzMsMHgwMH0sCisgICAgezB4MDMsMHgzNCwweDAwfSwKKyAgICB7MHgwMywweDM1LDB4MDB9LAorICAgIHsweDAzLDB4MzYsMHgwMH0sCisgICAgezB4MDMsMHgzNywweDAwfSwKKyAgICB7MHgwMywweDM5LDB4MUZ9LAorICAgIHsweDAzLDB4M0IsMHgwMH0sCisgICAgezB4MDMsMHgzQywweDAwfSwKKyAgICB7MHgwMywweDNELDB4MDB9LAorICAgIHsweDAzLDB4M0UsMHgwMH0sCisgICAgezB4MDMsMHgzRiwweDAwfSwKKyAgICB7MHgwMywweDQwLDB4MDB9LAorICAgIHsweDAzLDB4NDEsMHgwMH0sCisgICAgezB4MDMsMHg0MiwweDAwfSwKKyAgICB7MHgwMywweDQzLDB4MDB9LAorICAgIHsweDAzLDB4NDQsMHgwMH0sCisgICAgezB4MDMsMHg0NSwweDAwfSwKKyAgICB7MHgwMywweDQ2LDB4MDB9LAorICAgIHsweDAzLDB4NDcsMHgwMH0sCisgICAgezB4MDMsMHg0OCwweDAwfSwKKyAgICB7MHgwMywweDQ5LDB4MDB9LAorICAgIHsweDAzLDB4NEEsMHgwMH0sCisgICAgezB4MDMsMHg0QiwweDAwfSwKKyAgICB7MHgwMywweDRDLDB4MDB9LAorICAgIHsweDAzLDB4NEQsMHgwMH0sCisgICAgezB4MDMsMHg0RSwweDAwfSwKKyAgICB7MHgwMywweDRGLDB4MDB9LAorICAgIHsweDAzLDB4NTAsMHgwMH0sCisgICAgezB4MDMsMHg1MSwweDAwfSwKKyAgICB7MHgwMywweDUyLDB4MDB9LAorICAgIHsweDAzLDB4NTMsMHgwMH0sCisgICAgezB4MDMsMHg1NCwweDAwfSwKKyAgICB7MHgwMywweDU1LDB4MDB9LAorICAgIHsweDAzLDB4NTYsMHgwMH0sCisgICAgezB4MDMsMHg1NywweDAwfSwKKyAgICB7MHgwMywweDU4LDB4MDB9LAorICAgIHsweDAzLDB4NTksMHgwMH0sCisgICAgezB4MDMsMHg1QSwweDAwfSwKKyAgICB7MHgwMywweDVCLDB4MDB9LAorICAgIHsweDAzLDB4NUMsMHgwMH0sCisgICAgezB4MDMsMHg1RCwweDAwfSwKKyAgICB7MHgwMywweDVFLDB4MDB9LAorICAgIHsweDAzLDB4NUYsMHgwMH0sCisgICAgezB4MDMsMHg2MCwweDAwfSwKKyAgICB7MHgwMywweDYxLDB4MDB9LAorICAgIHsweDAzLDB4NjIsMHgwMH0sCisgICAgezB4MDQsMHg4NywweDAwfSwKKyAgICB7MHgwNSwweDAyLDB4MDF9LAorICAgIHsweDA1LDB4MDgsMHgxNH0sCisgICAgezB4MDUsMHgwOSwweDIyfSwKKyAgICB7MHgwNSwweDBBLDB4MER9LAorICAgIHsweDA1LDB4MEIsMHgwQ30sCisgICAgezB4MDUsMHgwQywweDAxfSwKKyAgICB7MHgwNSwweDBELDB4M0Z9LAorICAgIHsweDA1LDB4MEUsMHgxNX0sCisgICAgezB4MDUsMHgwRiwweDI2fSwKKyAgICB7MHgwNSwweDEwLDB4MEN9LAorICAgIHsweDA1LDB4MTEsMHgwQn0sCisgICAgezB4MDUsMHgxMiwweDAxfSwKKyAgICB7MHgwNSwweDEzLDB4M0Z9LAorICAgIHsweDA1LDB4MTUsMHgwMH0sCisgICAgezB4MDUsMHgxNiwweEI4fSwKKyAgICB7MHgwNSwweDE3LDB4QzF9LAorICAgIHsweDA1LDB4MTgsMHg0OX0sCisgICAgezB4MDUsMHgxOSwweEFDfSwKKyAgICB7MHgwNSwweDFBLDB4MDJ9LAorICAgIHsweDA1LDB4MUIsMHgwMH0sCisgICAgezB4MDUsMHgxQywweDAwfSwKKyAgICB7MHgwNSwweDFELDB4MDB9LAorICAgIHsweDA1LDB4MUUsMHgwMH0sCisgICAgezB4MDUsMHgxRiwweDgwfSwKKyAgICB7MHgwNSwweDIxLDB4MzF9LAorICAgIHsweDA1LDB4MkEsMHgwMH0sCisgICAgezB4MDUsMHgyQiwweDAxfSwKKyAgICB7MHgwNSwweDJDLDB4MEZ9LAorICAgIHsweDA1LDB4MkQsMHgwM30sCisgICAgezB4MDUsMHgyRSwweDE5fSwKKyAgICB7MHgwNSwweDJGLDB4MTl9LAorICAgIHsweDA1LDB4MzEsMHgwMH0sCisgICAgezB4MDUsMHgzMiwweDQyfSwKKyAgICB7MHgwNSwweDMzLDB4MDN9LAorICAgIHsweDA1LDB4MzQsMHgwMH0sCisgICAgezB4MDUsMHgzNiwweDBDfSwKKyAgICB7MHgwNSwweDM3LDB4MDB9LAorICAgIHsweDA1LDB4MzgsMHgyMX0sCisgICAgezB4MDUsMHgzOSwweDAwfSwKKyAgICB7MHgwOSwweDBFLDB4MDJ9LAorICAgIHsweDA5LDB4NDMsMHgwMX0sCisgICAgezB4MDksMHg0OSwweDAzfSwKKyAgICB7MHgwOSwweDRBLDB4MDN9LAorICAgIHsweDBBLDB4MDIsMHgwMH0sCisgICAgezB4MEEsMHgwMywweDAxfSwKKyAgICB7MHgwQSwweDA0LDB4MDF9LAorICAgIHsweDBBLDB4MDUsMHgwMX0sCisgICAgezB4MEIsMHg0NCwweDBDfSwKKyAgICB7MHgwQiwweDQ2LDB4MDB9LAorICAgIHsweDBCLDB4NDcsMHgwMH0sCisgICAgezB4MEIsMHg0OCwweDBDfSwKKyAgICB7MHgwQiwweDRBLDB4MUV9LAorICAgIHsweDA1LDB4MTQsMHgwMX0sCisgICAgezB4MDAsMHgxQywweDAxfSwKKyAgICB7MHgwQiwweDI0LDB4REJ9LAorICAgIHsweDBCLDB4MjUsMHgwMn0KK307IAorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvZnMvaTJjX2FkZHJzLnNoIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvZnMvaTJjX2FkZHJzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY0M2ZkNGMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2JvYXJkL3dyeC9mcy9pMmNfYWRkcnMuc2gKQEAgLTAsMCArMSw0IEBACisjISAvYmluL2Jhc2gKKworIyBCb2R5IHdpbGwgYmUgaW5zZXJ0ZWQgaGVyZSBieSBjb3B5X2hvc3RfZnMgdGFyZ2V0IGluIHByb2plY3QncyBtYWluIE1ha2VmaWxlCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2ZzL3N2a19pbml0LnNoIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvZnMvc3ZrX2luaXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzFlZWNlMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2ZzL3N2a19pbml0LnNoCkBAIC0wLDAgKzEsMTU2IEBACisjISAvYmluL2Jhc2gKK2NkIC9vcHQvYmNtNjg2MjAKKworIyBUaGVzZSBmaWxlcyBhcmUgbW91bnRlZCB1c2luZyB0bXBmcywgc28gdGhleSB3aWxsIGJlIGRlbGV0ZWQgdXBvbiByZWJvb3QKK0xPQ0tfRElSX0lOSVQ9L3RtcC9iY202ODYyMF9zdmtfaW5pdAorRklMRV9JTklUX0RPTkU9IiRMT0NLX0RJUl9JTklUL2RvbmUiCitMT0NLX0RJUl9LRVJORUxfTE9HX09XTkVEPS90bXAvYmNtNjg2MjBfa2VybmVsX2xvZ19vd25lZAorCitVU0VSX0FQUExfQVJHUz0iIgorS1QyX1BPUlQ9IiIKK1NXS1QyX1BPUlQ9IiIKK0tFUk5FTF9MT0c9InkiCitDT09QX0RCQT0ibiIKKword2hpbGUgKCgkIykpOyBkbworICAgIGNhc2UgIiQxIiBpbgorICAgIC0ta3QyKQorICAgICAgICBzaGlmdAorICAgICAgICBLVDJfUE9SVD0iJDEiCisgICAgICAgIDs7CisgICAgLS1zd2t0MikKKyAgICAgICAgc2hpZnQKKyAgICAgICAgU1dLVDJfUE9SVD0iJDEiCisgICAgICAgIDs7CisgICAgLS1wcm94eSkgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAoY291bGQganVzdCB1c2UgJy1wcm94eScpCisgICAgICAgIHNoaWZ0CisgICAgICAgIFVTRVJfQVBQTF9BUkdTPSIkVVNFUl9BUFBMX0FSR1MgLXByb3h5ICQxIgorICAgICAgICA7OworICAgIC1ubCkKKyAgICAgICAgS0VSTkVMX0xPRz0ibiIKKyAgICAgICAgVVNFUl9BUFBMX0FSR1M9IiRVU0VSX0FQUExfQVJHUyAkMSIKKyAgICAgICAgOzsKKyAgICAtY29vcF9kYmEpCisgICAgICAgIENPT1BfREJBPSJ5IgorICAgICAgICA7OworICAgICopCisgICAgICAgIFVTRVJfQVBQTF9BUkdTPSIkVVNFUl9BUFBMX0FSR1MgJDEiCisgICAgICAgIDs7CisgICAgZXNhYworICAgIHNoaWZ0Citkb25lCisKKyMgQ2hlY2sgaWYgdGhlIGluaXRpYWxpemF0aW9uIHN0ZXBzIChpbnN0YWxsaW5nIGtlcm5lbCBtb2R1bGVzLCBldGMpIGhhdmUgYWxyZWFkeSBiZWVuIGRvbmUuCisjIElmIG5vdCwgc3RhcnQgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuCitpZiBta2RpciAiJExPQ0tfRElSX0lOSVQiIDI+L2Rldi9udWxsOyB0aGVuCisgICAgdHJhcCAicm1kaXIgXCIkTE9DS19ESVJfSU5JVFwiIiBFWElUCisgICAgZWNobyAiSW5pdGlhbGl6aW5nIEJDTTY4NjIwIFNWSy4uLiIKKworICAgIGluc21vZCBsbF9wY2llLmtvCisgICAgc2xlZXAgMQorCisgICAgaW5zbW9kIG9zX2xpbnV4LmtvCisgICAgc2xlZXAgMQorCisgICAgc291cmNlIC4vaTJjX2FkZHJzLnNoCisgICAgaW5zbW9kIGkyY19kZXZzLmtvCisgICAgc2xlZXAgMQorCisgICAgZnVuY3Rpb24gcHJvYmVfZGV2CisgICAgeworICAgICAgICAyPi9kZXYvbnVsbCBlY2hvIG1hcGxlX2kyYyAweCQxID4gL3N5cy9idXMvaTJjL2RldmljZXMvaTJjLTAvbmV3X2RldmljZQorICAgIH0KKworICAgICMgU3VwcHJlc3MgZXJyb3Igd2FybmluZ3MgaW4gY2FzZSBkZXZpY2UgY2Fubm90IGJlIHByb2JlZCBiZWNhdXNlIGl0IGlzIGluZXhpc3RlbnQuCisgICAgZG1lc2cgLW4gMQorICAgIHByb2JlX2RldiAkSTJDX1NXMF9JMkNfQUREUgorICAgIHByb2JlX2RldiAkSTJDX1NXMV9JMkNfQUREUgorICAgIHByb2JlX2RldiAkSTJDX1NXMl9JMkNfQUREUgorICAgIHByb2JlX2RldiAkSTJDX1NXM19JMkNfQUREUgorICAgIHByb2JlX2RldiAkSTJDX1NXNF9JMkNfQUREUgorICAgIHByb2JlX2RldiAkU0ZQX0kyQ19BRERSMQorICAgIHByb2JlX2RldiAkU0ZQX0kyQ19BRERSMgorICAgIHByb2JlX2RldiAkRlBHQV9JMkNfQUREUgorICAgIHByb2JlX2RldiAkUE9OX0RQTExfSTJDX0FERFIKKyAgICBwcm9iZV9kZXYgJFBNX0RQTExfSTJDX0FERFIKKyAgICBwcm9iZV9kZXYgJENYUF9UX0kyQ19BRERSCisgICAgcHJvYmVfZGV2ICRDWFBfUl9JMkNfQUREUgorICAgIHByb2JlX2RldiAkUENJRV9TV19JMkNfQUREUgorICAgIGRtZXNnIC1uIDgKKworICAgIHJtIC1mIC9kZXYvbWFwbGVfaTJjCisgICAgbWtub2QgL2Rldi9tYXBsZV9pMmMgYyBgY2F0IC9zeXMvbW9kdWxlL2kyY19kZXZzL3BhcmFtZXRlcnMvbWFwbGVfaTJjX2NocmRldl9tYWpvcmAgMAorCisgICAgaWYgWyAiJEtUMl9QT1JUIiAhPSAiIiBdOyB0aGVuCisgICAgICAgIGVjaG8gayAxID4gL3Byb2MvbWFwbGVfaTJjL2kyYworICAgICAgICBpbnNtb2QgbGludXgta2VybmVsLWJkZS5rbworICAgICAgICBzbGVlcCAxCisgICAgICAgIGNhdCAvcHJvYy9saW51eC1rZXJuZWwtYmRlCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgaW5zbW9kIGxpbnV4LXVrLXByb3h5LmtvCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgbWtub2QgL2Rldi9saW51eC11ay1wcm94eSBjIDEyNSAwCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgaW5zbW9kIGxpbnV4LWJjbS1kaWFnLWZ1bGwua28KKyAgICAgICAgc2xlZXAgMQorICAgICAgICBlY2hvICJLVDIgd2lsbCB3YWl0IG9uIHBvcnQgJEtUMl9QT1JUIgorICAgICAgICAuL2JjbS51c2VyLnByb3h5IC1kICRLVDJfUE9SVCAmCisgICAgZmkKKworICAgIGlmIFsgIiRTV0tUMl9QT1JUIiAhPSAiIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIlNXIEtUMiBpbml0IgorICAgICAgICBpbnNtb2QgbGludXgta2VybmVsLWJkZS5rbworICAgICAgICBzbGVlcCAxCisgICAgICAgIGNhdCAvcHJvYy9saW51eC1rZXJuZWwtYmRlCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgaW5zbW9kIGxpbnV4LXVrLXByb3h5LmtvCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgbWtub2QgL2Rldi9saW51eC11ay1wcm94eSBjIDEyNSAwCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgaW5zbW9kIGxpbnV4LWJjbS1kaWFnLWZ1bGwua28KKyAgICAgICAgc2xlZXAgMQorICAgICAgICBlY2hvICJLVDIgd2lsbCB3YWl0IG9uIHBvcnQgJFNXS1QyX1BPUlQiCisgICAgICAgIC4vYmNtLnVzZXIucHJveHkgLWQgJFNXS1QyX1BPUlQgJgorICAgIGZpCisKKyAgICBpbnNtb2QgYmNtX2Rldl9jdHJsX2xpbnV4LmtvCisgICAgc2xlZXAgMQorICAgIAorICAgIGlmIFsgIiRDT09QX0RCQSIgIT0gIm4iIF07IHRoZW4KKyAgICAgICAgaW5zbW9kIGNvb3BfZGJhX2xpbnV4LmtvCisgICAgICAgIHNsZWVwIDEKKyAgICBmaQorICAgIAorICAgIHJtIC1mIC9kZXYvYmNtX2xvZworICAgIG1rbm9kIC9kZXYvYmNtX2xvZyBjIGBjYXQgL3N5cy9tb2R1bGUvYmNtX2Rldl9jdHJsX2xpbnV4L3BhcmFtZXRlcnMvZGV2X2xvZ19jaHJkZXZfbWFqb3JgIDAKKyAgICBta25vZCAvZGV2L21hcGxlX2Rldl9jdHJsIGMgYGNhdCAvc3lzL21vZHVsZS9iY21fZGV2X2N0cmxfbGludXgvcGFyYW1ldGVycy9tYXBsZV9kZXZfY3RybF9jaHJkZXZfbWFqb3JgIDAKKworICAgIHRvdWNoICIkRklMRV9JTklUX0RPTkUiCisgICAgdHJhcCAtIEVYSVQKK2Vsc2UKKyAgICBpZiBbIC1mICIkRklMRV9JTklUX0RPTkUiIF07IHRoZW4KKyAgICAgICAgZWNobyAiU2tpcHBlZCBCQ002ODYyMCBTVksgaW5pdGlhbGl6YXRpb24gc2luY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lIgorICAgIGVsc2UKKyAgICAgICAgZWNobyAiV2FpdGluZyBmb3IgU1ZLIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlLi4uIgorICAgICAgICB3aGlsZSBbICEgLWYgIiRGSUxFX0lOSVRfRE9ORSIgXTsgZG8KKyAgICAgICAgICAgIHNsZWVwIDEKKyAgICAgICAgZG9uZQorICAgIGZpCitmaQorCisjIE9ubHkgb25lIGFwcGxpY2F0aW9uIGNhbiBoYXZlIHRoZSBrZXJuZWwgbG9nZ2VyIGVuYWJsZWQgYXQgb25jZS4KKyMgSWYgc29tZW9uZSBlbHNlIGFscmVhZHkgb3ducyB0aGUga2VybmVsIGxvZ2dlciwgcnVuIHdpdGhvdXQgaXQuCitpZiBbICIkS0VSTkVMX0xPRyIgPT0gInkiIF07IHRoZW4KKyAgICBpZiBta2RpciAiJExPQ0tfRElSX0tFUk5FTF9MT0dfT1dORUQiIDI+L2Rldi9udWxsOyB0aGVuCisgICAgICAgIHRyYXAgInJtZGlyIFwiJExPQ0tfRElSX0tFUk5FTF9MT0dfT1dORURcIiIgRVhJVAorICAgIGVsc2UKKyAgICAgICAgVVNFUl9BUFBMX0FSR1M9IiRVU0VSX0FQUExfQVJHUyAtbmwiCisgICAgICAgIGVjaG8gIlJ1bm5pbmcgd2l0aG91dCBrZXJuZWwgbG9nZ2VyIHNpbmNlIHNvbWVvbmUgZWxzZSBvd25zIGl0IgorICAgIGZpCitmaQorCisjZWNobyAiSW4gQmFuZDogTGF1bmNoaW5nIEJDTTY4NjIwIHVzZXIgc3BhY2UgZGV2aWNlIGNvbnRyb2wgYXBwbGljYXRpb24gIgorIy4vYmNtX2Rldl9jdHJsX3VzZXIgPiAvZGV2L251bGwgMj4mMSAmCisKK2VjaG8gIkxhdW5jaGluZyBCQ002ODYyMCB1c2VyIGFwcGxpY2F0aW9uIHdpdGggb3B0aW9ucyBcIiRVU0VSX0FQUExfQVJHU1wiIgorLi9iY21fdXNlcl9hcHBsICRVU0VSX0FQUExfQVJHUwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9jb29wX2RiYV9saW51eC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvY29vcF9kYmFfbGludXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMDQzZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvY29vcF9kYmFfbGludXgvTWFrZWZpbGUKQEAgLTAsMCArMSwzOCBAQAorIyBDb29wZXJhdGl2ZSBEQkEKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisKK01PRF9OQU1FID0gY29vcF9kYmFfbGludXgKK01PRF9UWVBFID0gbGludXhfbW9kdWxlCitNT0RfREVQUyA9IGNvb3BfZGJhCisKK3NyY3MgPSBiY21vbHRfY29vcF9kYmFfbGludXguYworCitNT0RfSU5DX0RJUlMgPSAkKFNSQ19ESVIpICQoTU9ERUxfT1VUX0RJUikKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisgICAgaWZlcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCisJICAgIEtCVUlMRF9FWFRSQV9TWU1CT0xTICs9ICQoVE9QX0RJUikvaG9zdF9kcml2ZXIvZGV2X2N0cmwvbGludXgvTW9kdWxlLnN5bXZlcnMKKyAgICAJRVhUUkFfQ0ZMQUdTICs9IC1JJChUT1BfRElSKS9ob3N0X2RyaXZlci9jb21tb25fZ3BvbiBcCistSSQoVE9QX0RJUikvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L3BjaWVfc3dfcXVldWUgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL3BjaWUgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL2FwaSBcCistSSQoVE9QX0RJUikvaG9zdF9kcml2ZXIvdXRpbHMgXAorLUkkKFRPUF9ESVIpL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9tdXggCisgICAgZWxzZQorCSAgICBLQlVJTERfRVhUUkFfU1lNQk9MUyArPSAkKFRPUF9ESVIpL2hvc3QvZGV2X2N0cmwvbGludXgvTW9kdWxlLnN5bXZlcnMKKwkgICAgRVhUUkFfQ0ZMQUdTICs9IC1JJChUT1BfRElSKS9jb21tb24vZ3BvbiBcCistSSQoVE9QX0RJUikvY29tbW9uL21vZGVsL21hcGxlIFwKKy1JJChUT1BfRElSKS9jb21tb24vdHJhbnNwb3J0L2RyaXZlci9tYXBsZS9wY2llX3N3X3F1ZXVlIFwKKy1JJChUT1BfRElSKS9jb21tb24vZHJpdmVycy9tYXBsZS9wY2llIFwKKy1JJChUT1BfRElSKS9jb21tb24vYXBpIFwKKy1JJChUT1BfRElSKS9jb21tb24vdXRpbHMgXAorLUkkKFRPUF9ESVIpL2NvbW1vbi9kZXZfbG9nIFwKKy1JJChUT1BfRElSKS9ob3N0L3RyYW5zcG9ydC9kcml2ZXIvbWFwbGUvbXV4CisgICAgZW5kaWYKK2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9jb29wX2RiYV9saW51eC9iY21vbHRfY29vcF9kYmFfbGludXguYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvY29vcF9kYmFfbGludXgvYmNtb2x0X2Nvb3BfZGJhX2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmYzUyYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvY29vcF9kYmFfbGludXgvYmNtb2x0X2Nvb3BfZGJhX2xpbnV4LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgImJjbW9sdF9jb29wX2RiYS5oIgorCittb2R1bGVfcGFyYW0oYmNtb3Nfc3lzX3RyYWNlX2xldmVsLCB1aW50LCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKK01PRFVMRV9QQVJNX0RFU0MoYmNtb3Nfc3lzX3RyYWNlX2xldmVsLCAidHJhY2VfbGV2ZWwiKTsKKworc3RhdGljIHZvaWQgYmNtb2x0X2Nvb3BfZGJhX3VucmVnaXN0ZXJfcmVnaXN0ZXJlZF9kZXZpY2VzKGJjbW9sdF9kZXZpZCBtYXhfZGV2aWQsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCkKK3sKKwliY21vbHRfZGV2aWQgZGV2aWQ7CisKKwlmb3IgKGRldmlkID0gMDsgZGV2aWQgPCBtYXhfZGV2aWQ7IGRldmlkKyspCisJeworCQliY21vbHRfY29vcF9kYmFfZXhpdChkZXZpZCwgY2hhbm5lbCk7CisJfQorfQorc3RhdGljIHZvaWQgYmNtb2x0X2Nvb3BfZGJhX21vZHVsZV9leGl0KHZvaWQpCit7CisJYmNtb2x0X2Nvb3BfZGJhX3VucmVnaXN0ZXJfcmVnaXN0ZXJlZF9kZXZpY2VzKEJDTVRSX01BWF9PTFRTLCBVUkdFTlRfQ0hBTk5FTCk7CisKKyAgICBwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgaW50IGJjbW9sdF9jb29wX2RiYV9tb2R1bGVfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9sdF9kZXZpZCBkZXZpZDsKKyAgICBiY210cm11eF9jaGFubmVsIGNoYW5uZWwgPSBVUkdFTlRfQ0hBTk5FTDsKKworICAgIHByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyNpZiAwCisgICAgYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KEJDTU9TX1RSQUNFX0xFVkVMX0RFQlVHKTsKKyNlbmRpZgorCisJZm9yIChkZXZpZCA9IDA7IGRldmlkIDwgQkNNVFJfTUFYX09MVFM7IGRldmlkKyspCisJeworCQlyYyA9IGJjbW9sdF9jb29wX2RiYV9pbml0KGRldmlkLCAmY2hhbm5lbCwgYmNtb2x0X2Nvb3BfZGJhX3J4LCBOVUxMKTsKKwkJaWYgKHJjICE9IEJDTV9FUlJfT0spCisJCXsKKwkJCXByaW50aygiZXJyb3IgaW4gYmNtb2x0X2Nvb3BfZGJhX2luaXQgcmM9JWRcbiIsIHJjKTsKKwkJCWJjbW9sdF9jb29wX2RiYV91bnJlZ2lzdGVyX3JlZ2lzdGVyZWRfZGV2aWNlcyhkZXZpZCwgY2hhbm5lbCk7CisJCQlicmVhazsKKwkJfQorCX0KKworICAgIHJldHVybiByYyA/IC1FSU5WQUwgOiAwOworfQorCittb2R1bGVfaW5pdChiY21vbHRfY29vcF9kYmFfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoYmNtb2x0X2Nvb3BfZGJhX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb29wZXJhdGl2ZSBEQkEiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2Rldl9jdHJsX2xpbnV4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YTU2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2Rldl9jdHJsX2xpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMgZGV2aWNlX2NvbnRyb2wgTGludXggd3JhcHBlcgorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKworTU9EX05BTUUgPSBiY21fZGV2X2N0cmxfbGludXgKK01PRF9UWVBFID0gbGludXhfbW9kdWxlCitNT0RfREVQUyA9IGRldl9jdHJsIG5sdHIgZGV2X2xvZ19rZXJuZWwgdXNlcl9jb25maWcgaG9zdF9hcGlfbGludXggYXBpX2xpbnV4IHBjaWUgcGNpZV9tb2QKKworc3JjcyA9IGJjbW9sdF9kZXZfY3RybF9saW51eC5jCisKKyMgSWYgY2FsbGVkIGJ5IGxpbnV4IGtlcm5lbCBidWlsZGVyIC0gYWRkIGluY2x1ZGUgcGF0aHMgbWFudWFsbHkuCisjIEl0IGlzIG5vdCBlbGVnYW50LCBidXQgd2UnbGwgbm90IGhhdmUgbWFueSBsaW51eCBtb2R1bGVzCitpZm5lcSAoIiQoS0JVSUxEX1NSQykiLCAiIikKKwktaW5jbHVkZSAkKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpCitlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9kZXZfY3RybF9saW51eC9iY21vbHRfZGV2X2N0cmxfaW9jdGwuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgvYmNtb2x0X2Rldl9jdHJsX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDM3YzQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgvYmNtb2x0X2Rldl9jdHJsX2lvY3RsLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIGJjbW9sdF9kZXZfY3RybF9pb2N0bC5oCisgKgorICogIENyZWF0ZWQgb246IDcgPz8/PyAyMDE1CisgKiAgICAgIEF1dGhvcjogbWlseWEKKyAqLworCisjaWZuZGVmIEhPU1RfREVWX0NUUkxfTElOVVhfQkNNT0xUX0RFVl9DVFJMX0lPQ1RMX0hfCisjZGVmaW5lIEhPU1RfREVWX0NUUkxfTElOVVhfQkNNT0xUX0RFVl9DVFJMX0lPQ1RMX0hfCisKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgKmR1bXBwdHI7CisgICAgaW50MzJfdCBzdGFydF9pbmRleDsKKyAgICBpbnQzMl90IGhvd21hbnk7CisgICAgdWludDhfdCBkZXZpY2U7CisgICAgdWludDMyX3QgZXZlbnQ7IC8qIEZvciBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9IT1NUX0VWRU5UX1dSSVRFIG9ubHkgKi8KK30gZGV2X2N0cmxfaW9jdGxfcGFyYW07CisKKyNkZWZpbmUgTUFQTEVfREVWX0NUUkxfSU9DVExfTUFHSUMgJ0onCisKKyNkZWZpbmUgTUFQTEVfREVWX0NUUkxfSU9DVExfT1BfUENJX1NUQVQgICAgX0lPVyhNQVBMRV9ERVZfQ1RSTF9JT0NUTF9NQUdJQywgMSwgZGV2X2N0cmxfaW9jdGxfcGFyYW0pCisjZGVmaW5lIE1BUExFX0RFVl9DVFJMX0lPQ1RMX09QX1BDSV9EVU1QX1RYIF9JT1coTUFQTEVfREVWX0NUUkxfSU9DVExfTUFHSUMsIDIsIGRldl9jdHJsX2lvY3RsX3BhcmFtKQorI2RlZmluZSBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9QQ0lfRFVNUF9SWCBfSU9XUihNQVBMRV9ERVZfQ1RSTF9JT0NUTF9NQUdJQywgMywgZGV2X2N0cmxfaW9jdGxfcGFyYW0pCisjZGVmaW5lIE1BUExFX0RFVl9DVFJMX0lPQ1RMX09QX0hPU1RfRVZFTlRfV1JJVEUgX0lPVyhNQVBMRV9ERVZfQ1RSTF9JT0NUTF9NQUdJQywgNCwgZGV2X2N0cmxfaW9jdGxfcGFyYW0pCisKKyNlbmRpZiAvKiBIT1NUX0RFVl9DVFJMX0xJTlVYX0JDTU9MVF9ERVZfQ1RSTF9JT0NUTF9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9kZXZfY3RybF9saW51eC9iY21vbHRfZGV2X2N0cmxfbGludXguYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgvYmNtb2x0X2Rldl9jdHJsX2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0OGRlNAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgvYmNtb2x0X2Rldl9jdHJsX2xpbnV4LmMKQEAgLTAsMCArMSwzNzAgQEAKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8YmNtb2x0X3RyX25sX2RyaXZlci5oPgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfbG9nX2tlcm5lbC5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmNtb2x0X2Rldl9jdHJsLmg+CisjaW5jbHVkZSA8YmNtb2x0X3RyX211eC5oPgorI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPiAvKmNvcHlfZnJvbV91c2VyKi8KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8YmNtb2x0X2Rldl9jdHJsX2lvY3RsLmg+CisjaW5jbHVkZSA8YmNtb2x0X3VzZXJfdXRpbHMuaD4KKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfZmxkLmg+CisjaW5jbHVkZSA8YmNtdHJfcGNpZS5oPgorCittb2R1bGVfcGFyYW0oYmNtb3Nfc3lzX3RyYWNlX2xldmVsLCB1aW50LCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKK01PRFVMRV9QQVJNX0RFU0MoYmNtb3Nfc3lzX3RyYWNlX2xldmVsLCAidHJhY2VfbGV2ZWwiKTsKKworCitpbnQgbWFwbGVfZGV2X2N0cmxfY2hyZGV2X21ham9yID0gMjM3OworbW9kdWxlX3BhcmFtKG1hcGxlX2Rldl9jdHJsX2NocmRldl9tYWpvciwgaW50LCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVdHUlApOworTU9EVUxFX1BBUk1fREVTQyhtYXBsZV9kZXZfY3RybF9jaHJkZXZfbWFqb3IsICJtYXBsZV9kZXZfY3RybF9tYWpvciIpOworc3RhdGljIGNoYXIgaXNfY2hyZGV2X3JlZzsKK3N0YXRpYyBjaGFyIGlzX2NkZXZfYWRkOworCitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiY21vbHRfZGlyOworCitiY21vc19lcnJubyBiY210cl9pbml0KHZvaWQpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIC9wcm9jL2JjbW9sdC90cm11eCByZWFkIG9wZXJhdGlvbiAqLworc3RhdGljIGludCB0cm11eF9zdGF0c19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworICAgIHN0YXRpYyBiY210cm11eF9zdGF0IHByZXZfc3RhdDsKKyAgICBpbnQgbGVuOworICAgIGJjbXRybXV4X3N0YXQgc3RhdDsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZGV2aWQgKmRldmljZV9pZCA9IGRhdGE7CisKKyAgICByYyA9IGJjbXRybXV4X3N0YXRfZ2V0KCpkZXZpY2VfaWQsICZzdGF0KTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBsZW4gPSBzbnByaW50ZihwYWdlLCBjb3VudCwgIkNhbid0IHJlYWQgdHJtdXggc3RhdGlzdGljcyByYz0lc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBsZW4gPSBzbnByaW50ZihwYWdlLCBjb3VudCwgInRybXV4IHN0YXRpc3RpY3NcblxuIik7CisgICAgbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgInR4X3JlbW90ZSAgICAgIDogJXVcbiIsIHN0YXQudHhfcmVtb3RlIC0gcHJldl9zdGF0LnR4X3JlbW90ZSk7CisgICAgbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgInR4X2xvY2FsICAgICAgIDogJXVcbiIsIHN0YXQudHhfbG9jYWwgLSBwcmV2X3N0YXQudHhfbG9jYWwpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJ0eF9kaXNjX3JlbW90ZSA6ICV1XG4iLCBzdGF0LnR4X2Rpc2NfcmVtb3RlIC0gcHJldl9zdGF0LnR4X2Rpc2NfcmVtb3RlKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAidHhfZGlzY19sb2NhbCAgOiAldVxuIiwgc3RhdC50eF9kaXNjX2xvY2FsIC0gcHJldl9zdGF0LnR4X2Rpc2NfbG9jYWwpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJyeF9yZW1vdGUgICAgICA6ICV1XG4iLCBzdGF0LnJ4X3JlbW90ZSAtIHByZXZfc3RhdC5yeF9yZW1vdGUpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJyeF9sb2NhbCAgICAgICA6ICV1XG4iLCBzdGF0LnJ4X2xvY2FsIC0gcHJldl9zdGF0LnJ4X2xvY2FsKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAicnhfYXV0byAgICAgICAgOiAldVxuIiwgc3RhdC5yeF9hdXRvIC0gcHJldl9zdGF0LnJ4X2F1dG8pOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJyeF9kaXNjX3JlbW90ZSA6ICV1XG4iLCBzdGF0LnJ4X2Rpc2NfcmVtb3RlIC0gcHJldl9zdGF0LnJ4X2Rpc2NfcmVtb3RlKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAicnhfZGlzY19sb2NhbCAgOiAldVxuIiwgc3RhdC5yeF9kaXNjX2xvY2FsIC0gcHJldl9zdGF0LnJ4X2Rpc2NfbG9jYWwpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJyeF9kaXNjX2F1dG8gICA6ICV1XG4iLCBzdGF0LnJ4X2Rpc2NfYXV0byAtIHByZXZfc3RhdC5yeF9kaXNjX2F1dG8pOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJjdGxfdG9faG9zdCAgICA6ICV1XG4iLCBzdGF0LmNvbnRyb2xfdG9faG9zdCAtIHByZXZfc3RhdC5jb250cm9sX3RvX2hvc3QpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJjdGxfdG9fbGluZSAgICA6ICV1XG4iLCBzdGF0LmNvbnRyb2xfdG9fbGluZSAtIHByZXZfc3RhdC5jb250cm9sX3RvX2xpbmUpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJyeF9kaXNjX2ludl9jaCA6ICV1XG4iLCBzdGF0LnJ4X2Rpc2NfaW52X2NoIC0gcHJldl9zdGF0LnJ4X2Rpc2NfaW52X2NoKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAicnhfcG9sbF91cmdlbnQgOiAldVxuIiwgc3RhdC5yeF9wb2xsX3VyZ2VudCAtIHByZXZfc3RhdC5yeF9wb2xsX3VyZ2VudCk7CisgICAgbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgInJ4X3BvbGxfbm9ybWFsIDogJXVcbiIsIHN0YXQucnhfcG9sbF9ub3JtYWwgLSBwcmV2X3N0YXQucnhfcG9sbF9ub3JtYWwpOworICAgIHByZXZfc3RhdCA9IHN0YXQ7CisKKyAgICByZXR1cm4gbGVuOworfQorCisvKiAvcHJvYy9iY21vbHQvZGV2Y3RybCByZWFkIG9wZXJhdGlvbiAqLworc3RhdGljIGludCBkZXZjdHJsX2RlYnVnX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisgICAgaW50IGxlbjsKKyAgICBkZXZfY3RybF9kYXRhYmFzZSBkYjsKKyAgICBiY21vbHRfZGV2aWQgKmRldmljZV9pZCA9IGRhdGE7CisKKyAgICBkZXZfY3RybF9yZWFkX2RiKCpkZXZpY2VfaWQsICZkYik7CisKKyAgICAvKiBkYiBjb250YWlucyB0aGUgZW50aXJlIGNvcHkgb2YgZGV2X2N0cmxfZGF0YWJhc2UuIGFkZCB3aGF0ZXZlciB5b3Ugd2FudCB0byBwcmludC4gKi8KKyAgICBsZW4gPSBzbnByaW50ZihwYWdlLCBjb3VudCwgImRldl9jdHJsIGRlYnVnIGluZm9ybWF0aW9uXG5cbiIpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJ0YXNrIG5hbWUgICAgICAgICAgICAgICAgIDogJXNcbiIsIGRiLnRhc2tfaW5mby5uYW1lKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAibW9kdWxlIG5hbWUgICAgICAgICAgICAgICA6ICVzXG4iLCBkYi5tb2R1bGVfaW5mby5uYW1lKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiY29ubmVjdGlvbiBzdGF0ZSAgICAgICAgICA6ICVzXG4iLAorICAgICAgICBiY21fc3RyX2hvc3RfY29ubmVjdGluZ19zdGF0ZShkYi5jb25uZWN0aW9uX2luZm8uc3RhdGUpKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAidG9kICAgICAgICAgICAgICAgICAgICAgICA6ICVzXG4iLAorICAgICAgICAoZGIuZW5hYmxlX3RvZCA9PSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFKSA/ICJESVNBQkxFIiA6ICJFTkFCTEUiKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAibGFzdCBldmVudCAgICAgICAgICAgICAgICA6ICVzXG4iLCBiY21fc3RyX2RldmljZV9ldmVudChkYi5sYXN0X2V2ZW50KSk7CisgICAgaWYgKGRiLmNvbm5fZmFpbF9yZWFzb24gPCBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YpCisgICAgICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJjb25uZWN0aW9uIGZhaWx1cmUgcmVhc29uIDogJXNcbiIsCisgICAgICAgICAgICBiY21fc3RyX2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbihkYi5jb25uX2ZhaWxfcmVhc29uKSk7CisgICAgcmV0dXJuIGxlbjsKK30KKworI2lmZGVmIEVOQUJMRV9MT0cKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9sb2dnZXJfaW5pdF9jYih2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogQ3JlYXRlIGtlcm5lbCBsb2dnZXIgKi8KKyAgICByYyA9IGJjbV9kZXZfbG9nX2xpbnV4X2luaXQoKTsKKyAgICBCVUdfT04ocmMpOworCisgICAgLyogRm9yIG5vdyBqdXN0IG1hcCBCQ01PU19UUkFDRV9YWCB0byBkZXZfbG9nLiBMYXRlciBvbiBkZXZfY29udHJvbAorICAgICAqIGNhbiBkZWZpbmUgaXRzIG93biBsb2cgaWRzCisgICAgICovCisgICAgcmMgPSBiY21fZGV2X2xvZ19vc190cmFjZV9pbml0KCk7CisgICAgQlVHX09OKHJjKTsKKworICAgIHJldHVybiByYzsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGNkZXYgbWFwbGVfZGV2X2N0cmxfY2hyZGV2X2NkZXY7CitzdGF0aWMgaW50IG1hcGxlX2Rldl9jdHJsX2NocmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hcGxlX2Rldl9jdHJsX2NocmRldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBtYXBsZV9kZXZfY3RybF9jaHJkZXZfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIGJjbW9zX2Vycm5vIGJjbXJjOworICAgIGludCBsaW51eF9yYyA9IDA7CisgICAgaW50IHJjID0gMDsKKyAgICBkZXZfY3RybF9pb2N0bF9wYXJhbSBwYXJhbXM7CisKKyAgICAvKiBkb24ndCBldmVuIGRlY29kZSB3cm9uZyBjbWRzOiBiZXR0ZXIgcmV0dXJuaW5nICBFTk9UVFkgdGhhbiBFRkFVTFQgKi8KKyAgICBpZiAoX0lPQ19UWVBFKGNtZCkgIT0gTUFQTEVfREVWX0NUUkxfSU9DVExfTUFHSUMpCisgICAgICAgIHJldHVybiAtRU5PVFRZOworCisgICAgcmMgPSBjb3B5X2Zyb21fdXNlcigoY2hhciAqKSZwYXJhbXMsIChjaGFyICopYXJnLCBzaXplb2YocGFyYW1zKSk7CisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgc3dpdGNoIChjbWQpCisgICAgeworICAgIGNhc2UgTUFQTEVfREVWX0NUUkxfSU9DVExfT1BfUENJX1NUQVQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbV9wY2llZF9zdGF0IHN0YXQ7CisKKyAgICAgICAgICAgIG1lbXNldChwYXJhbXMuZHVtcHB0ciwgMCwgc2l6ZW9mKGJjbV9wY2llZF9zdGF0KSk7CisgICAgICAgICAgICBiY21yYyA9IGJjbXRyX3BjaWVfZ2V0X3N0YXRpc3RpY3MocGFyYW1zLmRldmljZSwgcGFyYW1zLnN0YXJ0X2luZGV4LCAmc3RhdCk7CisgICAgICAgICAgICBpZiAoYmNtcmMgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICBtZW1jcHkocGFyYW1zLmR1bXBwdHIsICZzdGF0LCBzaXplb2YoYmNtX3BjaWVkX3N0YXQpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsaW51eF9yYyA9IChpbnQpYmNtcmM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9QQ0lfRFVNUF9UWDoKKyAgICAgICAgbGludXhfcmMgPSAoaW50KWJjbXRyX3BjaWVfdHhfZHVtcCgoY2hhciAqKXBhcmFtcy5kdW1wcHRyLCBwYXJhbXMuZGV2aWNlLCBwYXJhbXMuc3RhcnRfaW5kZXgsIHBhcmFtcy5ob3dtYW55KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9QQ0lfRFVNUF9SWDoKKyAgICAgICAgbGludXhfcmMgPSAoaW50KWJjbXRyX3BjaWVfcnhfZHVtcCgoY2hhciAqKXBhcmFtcy5kdW1wcHRyLCBwYXJhbXMuZGV2aWNlLCBwYXJhbXMuc3RhcnRfaW5kZXgsIHBhcmFtcy5ob3dtYW55KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9IT1NUX0VWRU5UX1dSSVRFOgorICAgICAgICBsaW51eF9yYyA9IChpbnQpYmNtb2x0X2Rldl9jdHJsX2hvc3RfZXZlbnRfd3JpdGUocGFyYW1zLmRldmljZSwgcGFyYW1zLmV2ZW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmMgPSAtRU5PVFRZOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gbGludXhfcmM7Cit9CitzdGF0aWMgc3NpemVfdCBtYXBsZV9kZXZfY3RybF9jaHJkZXZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKmZfcG9zKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtYXBsZV9kZXZfY3RybF9jaHJkZXZfZm9wcyA9Cit7CisgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisgICAgLm9wZW4gPSBtYXBsZV9kZXZfY3RybF9jaHJkZXZfb3BlbiwKKyAgICAucmVsZWFzZSA9IG1hcGxlX2Rldl9jdHJsX2NocmRldl9yZWxlYXNlLAorICAgIC53cml0ZSA9IG1hcGxlX2Rldl9jdHJsX2NocmRldl93cml0ZSwKKyAgICAudW5sb2NrZWRfaW9jdGwgPSBtYXBsZV9kZXZfY3RybF9jaHJkZXZfaW9jdGwKK307CisKK3N0YXRpYyBpbnQgbWFwbGVfZGV2X2N0cmxfZGV2X2NyZWF0ZV9jaHJkZXYodm9pZCkKK3sKKyAgICBkZXZfdCBkZXYgPSBNS0RFVihtYXBsZV9kZXZfY3RybF9jaHJkZXZfbWFqb3IsIDApOworICAgIGludCBsaW51eF9yYzsKKyAgICBpc19jaHJkZXZfcmVnID0gMDsKKyAgICBpc19jZGV2X2FkZCA9IDA7CisgICAgLyoKKyAgICAgKiBSZWdpc3RlciB5b3VyIG1ham9yLCBhbmQgYWNjZXB0IGEgZHluYW1pYyBudW1iZXIuCisgICAgICovCisgICAgaWYgKCFtYXBsZV9kZXZfY3RybF9jaHJkZXZfbWFqb3IpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBsaW51eF9yYyA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCAwLCAibWFwbGVfZGV2X2N0cmwiKTsKKyAgICBpZiAobGludXhfcmMgPCAwKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJyZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKCktPiVkXG4iLCBsaW51eF9yYyk7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICBpc19jaHJkZXZfcmVnID0gMTsKKworICAgIGNkZXZfaW5pdCgmbWFwbGVfZGV2X2N0cmxfY2hyZGV2X2NkZXYsICZtYXBsZV9kZXZfY3RybF9jaHJkZXZfZm9wcyk7CisgICAgbGludXhfcmMgPSBjZGV2X2FkZCgmbWFwbGVfZGV2X2N0cmxfY2hyZGV2X2NkZXYsIGRldiwgMSk7CisgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICB7CisgICAgICAgIHByaW50aygiY2Rldl9hZGQoKS0+JWRcbiIsIGxpbnV4X3JjKTsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIGlzX2NkZXZfYWRkID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworCisjZGVmaW5lIEJDTU9MVF9QUk9DRlNfTkFNRV9MRU4gIDQgICAgICAgLyogZGV2aWNlX2lkIGlzIDEtYnl0ZSwgd2hpY2ggY2FuIGJlIDMgZGlnaXQgaW4gZGVjaW1hbC4gKi8KKyNkZWZpbmUgUFJPQ19UUk1VWF9OQU1FICAgICAgICAgInRybXV4IgorI2RlZmluZSBQUk9DX0RFVkNUUkxfTkFNRSAgICAgICAiZGV2Y3RybCIKKyNkZWZpbmUgUFJPQ19FTlRSWV9NT0RFICAgICAgICAgKFNfSUZSRUcgfCBTX0lXVVNSIHwgU19JUlVHTykKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIGNoYXIgbmFtZVtCQ01PTFRfUFJPQ0ZTX05BTUVfTEVOXTsKK30gYmNtb2x0X3Byb2NfY3R4X3Q7CisKK3N0YXRpYyBiY21vbHRfcHJvY19jdHhfdCBiY21vbHRfcHJvY19jdHhbQkNNVFJfTUFYX09MVFNdOworc3RhdGljIGJjbW9zX2Jvb2wgYmNtZGV2X2JjbW9sdF9wcm9jX2luaXRpYWxpemVkOworc3RydWN0IHByb2NfZGlyX2VudHJ5ICp0cm11eF9kaXIgPSBOVUxMOworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZXZjdHJsX2RpciA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGJjbWRldl9iY21vbHRfcHJvY19pbml0KHZvaWQpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmlkOworICAgIGlmICghYmNtZGV2X2JjbW9sdF9wcm9jX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgZm9yIChkZXZpZCA9IDA7IGRldmlkIDwgQkNNVFJfTUFYX09MVFM7IGRldmlkKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9wcm9jX2N0eFtkZXZpZF0uZGV2aWNlX2lkID0gZGV2aWQ7CisgICAgICAgICAgICBzcHJpbnRmKGJjbW9sdF9wcm9jX2N0eFtkZXZpZF0ubmFtZSwgIiVkIiwgZGV2aWQpOworICAgICAgICB9CisgICAgICAgIGJjbWRldl9iY21vbHRfcHJvY19pbml0aWFsaXplZCA9IEJDTU9TX1RSVUU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBiY21kZXZfbW9kdWxlX2V4aXQodm9pZCkKK3sKKyAgICBpbnQgZGV2aWQ7CisKKyAgICBpZiAodHJtdXhfZGlyKQorICAgIHsKKyAgICAgICAgZm9yIChkZXZpZCA9IDA7IGRldmlkIDwgQkNNVFJfTUFYX09MVFM7IGRldmlkKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KGJjbW9sdF9wcm9jX2N0eFtkZXZpZF0ubmFtZSwgdHJtdXhfZGlyKTsKKyAgICAgICAgfQorICAgICAgICByZW1vdmVfcHJvY19lbnRyeShQUk9DX1RSTVVYX05BTUUsIGJjbW9sdF9kaXIpOworICAgIH0KKyAgICBpZiAoZGV2Y3RybF9kaXIpCisgICAgeworICAgICAgICBmb3IgKGRldmlkID0gMDsgZGV2aWQgPCBCQ01UUl9NQVhfT0xUUzsgZGV2aWQrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoYmNtb2x0X3Byb2NfY3R4W2RldmlkXS5uYW1lLCBkZXZjdHJsX2Rpcik7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19ERVZDVFJMX05BTUUsIGJjbW9sdF9kaXIpOworICAgIH0KKworICAgIGJjbW9sdF9kZXZfY3RybF9leGl0KCk7CisgICAgYmNtdHJfbmxfZXhpdCgpOworICAgIGlmIChpc19jZGV2X2FkZCkKKyAgICAgICBjZGV2X2RlbCgmbWFwbGVfZGV2X2N0cmxfY2hyZGV2X2NkZXYpOworICAgIGlmIChpc19jaHJkZXZfcmVnKQorICAgICAgIHVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihtYXBsZV9kZXZfY3RybF9jaHJkZXZfbWFqb3IsIDApLCAxKTsKKyNpZiBkZWZpbmVkKEVOQUJMRV9MT0cpCisgICAgYmNtX2Rldl9sb2dfbGludXhfZXhpdCgpOworICAgIGJjbV9kZXZfbG9nX2Rlc3Ryb3koKTsKKyNlbmRpZgorICAgIHByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3N0YXRpYyBpbnQgYmNtZGV2X21vZHVsZV9pbml0KHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp0cm11eF9maWxlOworICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGV2Y3RybF9maWxlOworICAgIGJjbW9sdF9kZXZpZCBkZXZpZDsKKyAgICBiY21vbHRfaG9zdF9pbml0X3BhcmFtcyBwYXJhbXMgPQorICAgIHsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgIC5sb2dnZXJfaW5pdF9jYiA9IGRldl9jdHJsX2xvZ2dlcl9pbml0X2NiLAorI2VuZGlmCisgICAgICAgIC5kZXZfY3RybF9wYXJhbXMgPQorICAgICAgICB7CisgICAgICAgICAgICAuaW1hZ2VfcmVhZF9jYiA9IGJjbXVzZXJfaW1hZ2VfcmVhZCwKKyAgICAgICAgICAgIC5zeXN0ZW1fbW9kZV92YWxpZGF0ZV9jYiA9IGJjbXVzZXJfc3lzdGVtX21vZGVfdmFsaWRhdGUsCisgICAgICAgICAgICAuZGV2aWNlX29mZl9jYiA9IGJjbXVzZXJfZGV2aWNlX29mZiwKKyAgICAgICAgICAgIC5kZXZpY2Vfb25fY2IgPSBiY211c2VyX2RldmljZV9vbiwKKyAgICAgICAgICAgIC5kZXZpY2VfaXNfcnVubmluZ19jYiA9IGJjbXVzZXJfZGV2aWNlX2lzX3J1bm5pbmcsCisgICAgICAgICAgICAuaG9zdF9yZXNldF9jYiA9IGJjbXVzZXJfaG9zdF9yZXNldCwKKyAgICAgICAgICAgIC5wY2llX2NoYW5uZWxfcHJlcGFyZV9jYiA9IGJjbXVzZXJfcGNpZV9jaGFubmVsX3ByZXBhcmUsCisgICAgICAgICAgICAucGNpZV9jaGFubmVsX3JlbW92ZV9jYiA9IGJjbXVzZXJfcGNpZV9jaGFubmVsX3JlbW92ZSwKKyAgICAgICAgfQorICAgIH07CisKKyAgICBpZiAoIWlzX2NkZXZfYWRkKQorICAgIHsKKyAgICAgICAgaWYgKG1hcGxlX2Rldl9jdHJsX2Rldl9jcmVhdGVfY2hyZGV2KCkgPCAwKQorICAgICAgICAgICAgcHJpbnRrKCIlcyBlcnJvciB0byBjcmVhdGUgZGV2IGN0cmwgY2RldiBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgcHJpbnRrKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJjID0gYmNtb2x0X2hvc3RfaW5pdCgmcGFyYW1zKTsKKyAgICBCVUdfT04ocmMpOworCisgICAgYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KEJDTU9TX1RSQUNFX0xFVkVMX0RFQlVHKTsKKworICAgIGJjbWRldl9iY21vbHRfcHJvY19pbml0KCk7CisKKyAgICByYyA9IGJjbXRyX25sX2luaXQoKTsKKyAgICBCVUdfT04ocmMpOworCisgICAgcmMgPSBiY211c2VyX3BjaWVfcHJlcGFyZSgpOworCisgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBpZiAoKHRybXV4X2RpciA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfVFJNVVhfTkFNRSwgU19JRkRJUiwgYmNtb2x0X2RpcikpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYy9iY21vbHQvdHJtdXggZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZGV2Y3RybF9kaXIgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0RFVkNUUkxfTkFNRSwgU19JRkRJUiwgYmNtb2x0X2RpcikpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYy9iY21vbHQvZGV2Y3RybCBkaXJlY3RvcnlcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChkZXZpZCA9IDA7IGRldmlkIDwgQkNNVFJfTUFYX09MVFM7IGRldmlkKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgodHJtdXhfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGJjbW9sdF9wcm9jX2N0eFtkZXZpZF0ubmFtZSwgUFJPQ19FTlRSWV9NT0RFLCB0cm11eF9kaXIpKSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYy9iY21vbHQvJXMvJXNcbiIsIFBST0NfVFJNVVhfTkFNRSwgYmNtb2x0X3Byb2NfY3R4W2RldmlkXS5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cm11eF9maWxlLT5yZWFkX3Byb2MgPSAocmVhZF9wcm9jX3QgKil0cm11eF9zdGF0c19yZWFkOworICAgICAgICAgICAgdHJtdXhfZmlsZS0+ZGF0YSA9ICZiY21vbHRfcHJvY19jdHhbZGV2aWRdLmRldmljZV9pZDsKKworICAgICAgICAgICAgaWYgKChkZXZjdHJsX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShiY21vbHRfcHJvY19jdHhbZGV2aWRdLm5hbWUsIFBST0NfRU5UUllfTU9ERSwgZGV2Y3RybF9kaXIpKSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYy9iY21vbHQvJXMvJXNcbiIsIFBST0NfREVWQ1RSTF9OQU1FLCBiY21vbHRfcHJvY19jdHhbZGV2aWRdLm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmN0cmxfZmlsZS0+cmVhZF9wcm9jID0gKHJlYWRfcHJvY190ICopZGV2Y3RybF9kZWJ1Z19yZWFkOworICAgICAgICAgICAgZGV2Y3RybF9maWxlLT5kYXRhID0gJmJjbW9sdF9wcm9jX2N0eFtkZXZpZF0uZGV2aWNlX2lkOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgCWJjbW9zX3VzbGVlcCgyMDAwMDAwKTsKKyAgICAJYmNtZGV2X21vZHVsZV9leGl0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjID8gLUVJTlZBTCA6IDA7Cit9CisKK21vZHVsZV9pbml0KGJjbWRldl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChiY21kZXZfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oImRldmljZV9jb250cm9sIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZW1iZWRkZWRfY2xpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjdhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisjIEhvc3QgQVBJCisjCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKyAgICBNT0RfTkFNRSA9IGVtYmVkZGVkX2NsaQorICAgIE1PRF9UWVBFID0gbGliCisgICAgTU9EX0RFUFMgPSB0cmFuc3BvcnQgbW9kZWwgY2xpCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfREVQUyArPSBjb21tb25fYXBpCitlbHNlCisgICAgTU9EX0RFUFMgKz0gYXBpCitlbmRpZgorICAgIHNyY3MgPSBiY21vbHRfZW1iZWRkZWRfY2xpLmMKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9iY21vbHRfZW1iZWRkZWRfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9iY21vbHRfZW1iZWRkZWRfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1YThmNwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZW1iZWRkZWRfY2xpL2JjbW9sdF9lbWJlZGRlZF9jbGkuYwpAQCAtMCwwICsxLDI2OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbV9lbWJlZGRlZF9jbGkuYyAtIGVtYmVkZGVkIENMSSBhY2Nlc3MgZnJvbSB0aGUgaG9zdAorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfZW1iZWRkZWRfY2xpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbXRyX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorCisjZGVmaW5lIEVNQkVEREVEX0NMSV9CVUZGRVJfU0laRSAgICAgICAgMjA0OAorI2RlZmluZSBFTUJFRERFRF9DTElfVElNRVJfREVMQVlfVVMgICAgIDEwMDAwMAorCisvKiBFbWJlZGRlZCBDTEkgY2xpZW50IGNvbnRleHQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZTsKKyAgICBiY21vc190YXNrIHRhc2s7CisgICAgYmNtb3NfdGltZXIgdGltZXI7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgdWludDhfdCBpbmJ1ZltFTUJFRERFRF9DTElfQlVGRkVSX1NJWkVdOworICAgIHVpbnQzMl90IGluYnVmX2xlbmd0aDsKK30gZW1iZWRkZWRfY2xpX2NvbnRleHQ7CisKK3N0YXRpYyBlbWJlZGRlZF9jbGlfY29udGV4dCAqY2xpX2NvbnRleHQ7CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBlbWJlZGRlZF9jbGlfdGltZXJfaGFuZGxlcihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICAvKiBGRlU6IHRoaXMgdGltZXIgaXMgZm9yIGZ1dHVyZSBsaW5lIGVkaXRpbmcgc3VwcG9ydCAqLworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKworc3RhdGljIHZvaWQgZW1iZWRkZWRfY2xpX291dHB1dF9tc2dfaGFuZGxlcihiY21vbHRfZGV2aWQgb2x0LCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dCAqY2xpX21zZyA9IChiY21vbHRfZGVidWdfY2xpX2lucHV0ICopbXNnOworCisgICAgaWYgKGNsaV9jb250ZXh0ICYmIGNsaV9tc2ctPmRhdGEuZGF0YS52YWwpCisgICAgeworICAgICAgICAvKiBwcmludCBkaXJlY3RseSBiZWNhdXNlIG91dHB1dCBjYW4gY29udGFpbiBFU0Mgc2VxdWVuY2VzICovCisgICAgICAgIHVpbnQ4X3QgKnZhbCA9IGNsaV9tc2ctPmRhdGEuZGF0YS52YWw7CisgICAgICAgIHdoaWxlICgqdmFsKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19wdXRjaGFyKCoodmFsKyspKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKK30KKworc3RhdGljIHZvaWQgZW1iZWRkZWRfY2xpX3NlbmRfaW5wdXQoZW1iZWRkZWRfY2xpX2NvbnRleHQgKmNvbnRleHQpCit7CisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7fTsKKyAgICBiY21vbHRfZGVidWdfY2xpX2lucHV0IG1zZzsKKyAgICBiY21vbHRfdThfbGlzdF91MzIgZGF0YSA9IHsgY29udGV4dC0+aW5idWZfbGVuZ3RoLCBjb250ZXh0LT5pbmJ1ZiB9OworCisgICAgaWYgKCFjb250ZXh0LT5pbmJ1Zl9sZW5ndGgpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEJDTU9MVF9PUEVSX0lOSVQoJm1zZywgZGVidWcsIGNsaV9pbnB1dCwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmbXNnLCBkZWJ1ZywgY2xpX2lucHV0LCBkYXRhLCBkYXRhKTsKKyAgICBiY21vbHRfb3Blcl9zdWJtaXQoY29udGV4dC0+ZGV2aWNlLCAmbXNnLmhkcik7CisgICAgY29udGV4dC0+aW5idWZfbGVuZ3RoID0gMDsKK30KKworLyogSW5pdGlhbGl6ZSBlbWJlZGRlZCBDTEkgbW9kdWxlICovCitiY21vc19lcnJubyBiY21fZW1iZWRkZWRfY2xpX2VudGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIHN0YXRpYyBjaGFyICplbWJlZGRlZF9jbGlfdGFza19uYW1lID0gImVtYmVkZGVkX2NsaSI7CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2twID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gZW1iZWRkZWRfY2xpX3Rhc2tfbmFtZSwKKyAgICAgICAgLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9DTEksCisgICAgICAgIC5kYXRhID0gZGV2aWNlCisgICAgfTsKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVwID0ge307CisgICAgYmNtb3NfdGltZXJfcGFybSB0aW1lcnAgPQorICAgIHsKKyAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX0NMSV9PVkVSX1BDSUUsCisgICAgICAgIC5oYW5kbGVyID0gZW1iZWRkZWRfY2xpX3RpbWVyX2hhbmRsZXIsCisgICAgICAgIC5kYXRhID0gZGV2aWNlCisgICAgfTsKKyAgICBiY210cl9oYW5kbGVyX3Bhcm0gbXNncCA9CisgICAgeworICAgICAgICAub2JqZWN0ID0gQkNNT0xUX09CSl9JRF9ERUJVRywKKyAgICAgICAgLmdyb3VwID0gQkNNT0xUX01HVF9HUk9VUF9BVVRPLAorICAgICAgICAuc3ViZ3JvdXAgPSBCQ01PTFRfREVCVUdfQVVUT19JRF9DTElfT1VUUFVULAorICAgICAgICAubW9kdWxlID0gQkNNT1NfTU9EVUxFX0lEX0NMSV9PVkVSX1BDSUUsCisgICAgICAgIC5hcHBfY2IgPSBlbWJlZGRlZF9jbGlfb3V0cHV0X21zZ19oYW5kbGVyLAorICAgICAgICAuZmxhZ3MgPSBCQ01PTFRfQVVUT19GTEFHU19ESVNQQVRDSAorICAgIH07CisgICAgYmNtdHJfaGFuZGxlcl9wYXJtIG9sZF9tc2dwID0KKyAgICB7CisgICAgICAgIC5vYmplY3QgPSBCQ01PTFRfT0JKX0lEX0RFQlVHLAorICAgICAgICAuZ3JvdXAgPSBCQ01PTFRfTUdUX0dST1VQX0FVVE8sCisgICAgICAgIC5zdWJncm91cCA9IEJDTU9MVF9ERUJVR19BVVRPX0lEX0NMSV9PVVRQVVQsCisgICAgfTsKKworICAgIGludCBjOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9zX2Jvb2wgcmF3X21vZGUgPSBCQ01PU19GQUxTRTsKKworICAgIC8qIE9ubHkgMSBpbnN0YW5jZSBpcyBzdXBwb3J0ZWQgKi8KKyAgICBpZiAoY2xpX2NvbnRleHQpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9BTFJFQURZLCAiZW1iZWRkZWRfY2xpIGNsaWVudCBpcyBhbHJlYWR5IGFjdGl2ZSBmb3IgZGV2aWNlICV1XG4iLAorICAgICAgICAgICAgY2xpX2NvbnRleHQtPmRldmljZSk7CisgICAgfQorICAgIGNsaV9jb250ZXh0ID0gYmNtb3NfY2FsbG9jKHNpemVvZigqY2xpX2NvbnRleHQpKTsKKyAgICBpZiAoIWNsaV9jb250ZXh0KQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9NRU0sICJjYW4ndCBhbGxvY2F0ZSBlbWJlZGRlZCBDTEkgY29udGV4dFxuIik7CisgICAgfQorICAgIGNsaV9jb250ZXh0LT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBjbGlfY29udGV4dC0+ZGV2aWNlID0gZGV2aWNlOworCisgICAgLyogQ3JlYXRlIGlucHV0L291dHB1dCB0YXNrICYgbW9kdWxlICovCisgICAgcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmY2xpX2NvbnRleHQtPnRhc2ssICZ0YXNrcCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBjcmVhdGUgZW1iZWRkZWQgY2xpIHRhc2s6ICVzXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICBnb3RvIGNsZWFudXAxOworICAgIH0KKworICAgIG1vZHVsZXAuZGF0YSA9IChsb25nKWNsaV9jb250ZXh0OworICAgIHJjID0gYmNtb3NfbW9kdWxlX2NyZWF0ZShCQ01PU19NT0RVTEVfSURfQ0xJX09WRVJfUENJRSwgJmNsaV9jb250ZXh0LT50YXNrLCAmbW9kdWxlcCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBjcmVhdGUgZW1iZWRkZWQgY2xpIG1vZHVsZTogJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIGdvdG8gY2xlYW51cDI7CisgICAgfQorCisgICAgdGltZXJwLmRhdGEgPSAobG9uZyljbGlfY29udGV4dDsKKyAgICByYyA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmY2xpX2NvbnRleHQtPnRpbWVyLCAmdGltZXJwKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGNyZWF0ZSBlbWJlZGRlZCBjbGkgdGltZXI6ICVzXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICBnb3RvIGNsZWFudXAzOworICAgIH0KKworICAgIC8qIFF1ZXJ5IGV4aXN0aW5nIGluZGljYXRpb24gaW4gb3JkZXIgdG8gYmUgYWJsZSB0byByZXN0b3JlIGl0ICovCisgICAgYmNtdHJfbXNnX2hhbmRsZXJfcmVnaXN0ZXJfZ2V0KGRldmljZSwgJm9sZF9tc2dwKTsKKworICAgIC8qIFVucmVnaXN0ZXIgb2xkIGhhbmRsZXIgKi8KKyAgICBiY210cl9tc2dfaGFuZGxlcl91bnJlZ2lzdGVyKGRldmljZSwgJm9sZF9tc2dwKTsKKworICAgIC8qIFJlZ2lzdGVyIGZvciBjbGlfb3V0cHV0IGluZGljYXRpb24gKi8KKyAgICByYyA9IGJjbXRyX21zZ19oYW5kbGVyX3JlZ2lzdGVyKGRldmljZSwgJm1zZ3ApOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgcmVnaXN0ZXIgZm9yIGNsaV9vdXRwdXQgaW5kaWNhdGlvbjogJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIGdvdG8gY2xlYW51cDQ7CisgICAgfQorCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkRldmljZSAldTogRW50ZXJpbmcgZW1iZWRkZWQgQ0xJLiBUeXBlICVjIHRvIHRlcm1pbmF0ZVxuIiwKKyAgICAgICAgZGV2aWNlLCBCQ01fRU1CRURERURfQ09OU09MRV9FWElUX0NIQVIpOworCisgICAgLyogVHJ5IHRvIGVudGVyIHJhdyBtb2RlIGlmIGxpbmUgZWRpdGluZyBpcyByZXF1ZXN0ZWQgKi8KKyAgICByYyA9IGJjbWNsaV9zZXNzaW9uX3Jhd19tb2RlX3NldChzZXNzaW9uLCBCQ01PU19UUlVFKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiQ2FuJ3QgZW5hYmxlIFJBVyBpbnB1dCBtb2RlLiBMaW5lIGVkaXRpbmcgaXMgZGlzYWJsZWRcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYXdfbW9kZSA9IEJDTU9TX1RSVUU7CisgICAgfQorICAgIC8qIE5vIHdlIHJlYWQgaW5wdXQgYW5kIHB1c2ggaXQgaW50byBpbnB1dCBidWZmZXIgKi8KKyAgICBpZiAocmF3X21vZGUpCisgICAgeworICAgICAgICBjID0gYmNtb3NfZ2V0Y2hhcigpOworICAgICAgICB3aGlsZSAoYyA+PSAwICYmIGMgIT0gQkNNX0VNQkVEREVEX0NPTlNPTEVfRVhJVF9DSEFSKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfY29udGV4dC0+aW5idWZbY2xpX2NvbnRleHQtPmluYnVmX2xlbmd0aCsrXSA9IGM7CisgICAgICAgICAgICBlbWJlZGRlZF9jbGlfc2VuZF9pbnB1dChjbGlfY29udGV4dCk7CisgICAgICAgICAgICBjID0gYmNtb3NfZ2V0Y2hhcigpOworICAgICAgICB9CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3Jhd19tb2RlX3NldChzZXNzaW9uLCBCQ01PU19GQUxTRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIExpbmUgbW9kZSAqLworICAgICAgICBjaGFyICpidWY7CisKKyAgICAgICAgYnVmID0gYmNtY2xpX3Nlc3Npb25fZ2V0cyhzZXNzaW9uLCAoY2hhciAqKWNsaV9jb250ZXh0LT5pbmJ1Ziwgc2l6ZW9mKGNsaV9jb250ZXh0LT5pbmJ1ZikpOworICAgICAgICB3aGlsZSAoYnVmICYmIGJ1ZlswXSAhPSBCQ01fRU1CRURERURfQ09OU09MRV9FWElUX0NIQVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9jb250ZXh0LT5pbmJ1Zl9sZW5ndGggPSBzdHJsZW4oYnVmKTsKKyAgICAgICAgICAgIGlmICghY2xpX2NvbnRleHQtPmluYnVmX2xlbmd0aCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChidWZbY2xpX2NvbnRleHQtPmluYnVmX2xlbmd0aC0xXSAhPSAnXG4nICYmIGJ1ZltjbGlfY29udGV4dC0+aW5idWZfbGVuZ3RoLTFdICE9ICdccicgJiYKKyAgICAgICAgICAgICAgICBjbGlfY29udGV4dC0+aW5idWZfbGVuZ3RoIDwgc2l6ZW9mKGNsaV9jb250ZXh0LT5pbmJ1ZikgLSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZltjbGlfY29udGV4dC0+aW5idWZfbGVuZ3RoKytdID0gJ1xuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVtYmVkZGVkX2NsaV9zZW5kX2lucHV0KGNsaV9jb250ZXh0KTsKKyAgICAgICAgICAgIGJ1ZiA9IGJjbWNsaV9zZXNzaW9uX2dldHMoc2Vzc2lvbiwgKGNoYXIgKiljbGlfY29udGV4dC0+aW5idWYsIHNpemVvZihjbGlfY29udGV4dC0+aW5idWYpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9zX3RpbWVyX3N0b3AoJmNsaV9jb250ZXh0LT50aW1lcik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkRldmljZSAldTogRW1iZWRkZWQgQ0xJIHRlcm1pbmF0ZWRcbiIsIGRldmljZSk7CisgICAgYmNtdHJfbXNnX2hhbmRsZXJfdW5yZWdpc3RlcihkZXZpY2UsICZtc2dwKTsKKyAgICBpZiAob2xkX21zZ3AuYXBwX2NiKQorICAgICAgICByYyA9IGJjbXRyX21zZ19oYW5kbGVyX3JlZ2lzdGVyKGRldmljZSwgJm9sZF9tc2dwKTsKKworY2xlYW51cDQ6CisgICAgYmNtb3NfdGltZXJfZGVzdHJveSgmY2xpX2NvbnRleHQtPnRpbWVyKTsKK2NsZWFudXAzOgorICAgIGJjbW9zX21vZHVsZV9kZXN0cm95KEJDTU9TX01PRFVMRV9JRF9DTElfT1ZFUl9QQ0lFKTsKK2NsZWFudXAyOgorICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmY2xpX2NvbnRleHQtPnRhc2spOworY2xlYW51cDE6CisgICAgYmNtb3NfZnJlZShjbGlfY29udGV4dCk7CisgICAgY2xpX2NvbnRleHQgPSBOVUxMOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2VtYmVkZGVkX2NsaV9jb21tYW5kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IHBhcm1bMF0udmFsdWUubnVtYmVyOworICAgIHJldHVybiBiY21fZW1iZWRkZWRfY2xpX2VudGVyKHNlc3Npb24sIGRldmljZSk7Cit9CisKKy8qIEluaXRpYWxpemUgZW1iZWRkZWQgQ0xJIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtX2VtYmVkZGVkX2NsaV9pbml0KHZvaWQpCit7CisgICAgQkNNQ0xJX01BS0VfQ01EKE5VTEwsICJlbWJlZGRlZCIsICJFbWJlZGRlZCBDTEkiLCBiY21fZW1iZWRkZWRfY2xpX2NvbW1hbmQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLCAwLCBCQ01UUl9NQVhfT0xUUy0xKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQ2xlYW51cCBlbWJlZGRlZCBDVkxJIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtX2VtYmVkZGVkX2NsaV9leGl0KHZvaWQpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9iY21vbHRfZW1iZWRkZWRfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9iY21vbHRfZW1iZWRkZWRfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExZTUxOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZW1iZWRkZWRfY2xpL2JjbW9sdF9lbWJlZGRlZF9jbGkuaApAQCAtMCwwICsxLDY0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtX2VtYmVkZGVkX2NsaS5oIC0gZW1iZWRkZWQgQ0xJIGFjY2VzcyBmcm9tIHRoZSBob3N0CisgKi8KKworI2lmbmRlZiBCQ01PTFRfRU1CRURERURfQ0xJX0hfCisjZGVmaW5lIEJDTU9MVF9FTUJFRERFRF9DTElfSF8KKworI2luY2x1ZGUgPGJjbWNsaV9zZXNzaW9uLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorCisvKiBDaGFyYWN0ZXIgdXNlZCB0byBleGl0IGZyb20gZW1iZWRkZWQgY29uc29sZSAqLworI2RlZmluZSBCQ01fRU1CRURERURfQ09OU09MRV9FWElUX0NIQVIgICchJworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluaXRpYWxpemUgZW1iZWRkZWQgQ0xJIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtX2VtYmVkZGVkX2NsaV9pbml0KHZvaWQpOworCisvKiBDbGVhbnVwIGVtYmVkZGVkIENMSSBtb2R1bGUgKi8KK2JjbW9zX2Vycm5vIGJjbV9lbWJlZGRlZF9jbGlfZXhpdCh2b2lkKTsKKworLyogQ29ubmVjdCB0byBlbWJlZGRlZCBDTEkgY29uc29sZS4KKyAqIFRoZSBmdW5jdGlvbiB3YWl0cyBmb3IgdXNlciBpbnB1dCBhbmQKKyAqIHJldHVybnMgd2hlbiBlbmNvdW50ZXJzIEJDTV9FTUJFRERFRF9DT05TT0xFX0VYSVRfQ0hBUgorICovCitiY21vc19lcnJubyBiY21fZW1iZWRkZWRfY2xpX2VudGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZW1iZWRkZWRfY2xpL21haW4vTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9tYWluL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjdjOTUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9tYWluL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorIyBFbWJlZGRlZCBDTEkgY29uc29sZSBhcHBsaWNhdGlvbgorIworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBlbWJlZGRlZF9jb25zb2xlCisgICAgTU9EX1RZUEUgPSBhcHAKKyAgICBNT0RfREVQUyA9IGVtYmVkZGVkX2NsaQorICAgIAorICAgIHNyY3MgPSBiY21vbHRfZW1iZWRkZWRfY29uc29sZS5jCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9lbWJlZGRlZF9jbGkvbWFpbi9iY21vbHRfZW1iZWRkZWRfY29uc29sZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9lbWJlZGRlZF9jbGkvbWFpbi9iY21vbHRfZW1iZWRkZWRfY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTc2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9tYWluL2JjbW9sdF9lbWJlZGRlZF9jb25zb2xlLmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9lbWJlZGRlZF9jbGkuaD4KKworc3RhdGljIGludCBfY2xpX2hlbHAodm9pZCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVtYmVkZGVkX2NvbnNvbGUgWy1kIGRldmljZV9pbmRleF0iKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcGFybSBtb25fc2Vzc2lvbl9wYXJtOworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uOworICAgIGludCBkZXZpY2UgPSAwOworICAgIGludCBpOworCisgICAgLyogYXJnYyBtdXN0IGJlIG9kZCBiZWNhdXNlIGFsbCBvcHRpb25zIGV4Y2VwdCBmb3IgYXJndlswXSBnbyBpbiBwYWlycyAqLworICAgIGlmICghKGFyZ2MgJSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBfY2xpX2hlbHAoKTsKKyAgICB9CisKKyAgICBtZW1zZXQoJm1vbl9zZXNzaW9uX3Bhcm0sIDAsIHNpemVvZihtb25fc2Vzc2lvbl9wYXJtKSk7CisgICAgbW9uX3Nlc3Npb25fcGFybS5hY2Nlc3NfcmlnaHQgPSBCQ01DTElfQUNDRVNTX0FETUlOOworICAgIGZvcihpPTE7IGk8YXJnYzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1kIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKnBlbmQ7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICBkZXZpY2UgPSBzdHJ0b3VsKGFyZ3ZbaV0sICZwZW5kLCAwKTsKKyAgICAgICAgICAgIGlmIChwZW5kICYmICpwZW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBfY2xpX2hlbHAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiY21jbGlfc2Vzc2lvbl9vcGVuKCZtb25fc2Vzc2lvbl9wYXJtLCAmc2Vzc2lvbikpCisgICAgeworICAgICAgICBwcmludGYoIkNhbid0IG9wZW4gQ0xJIHNlc3Npb25cbiIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIHVzZXIgaW5wdXQgdW50aWwgRU9GIG9yICEgY29tbWFuZCAqLworICAgIGJjbV9lbWJlZGRlZF9jbGlfZW50ZXIoc2Vzc2lvbiwgZGV2aWNlKTsKKworICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKHNlc3Npb24pOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjgzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIGhvc3QvaG9zdF9hcGkgYXMgbGludXggbGlicmFyeSB0byBiZSBjYWxsZWQgZnJvbSBrZXJuZWwgbW9kdWxlcworIworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisKK01PRF9OQU1FID0gaG9zdF9hcGlfbGludXgKK01PRF9UWVBFID0gbGludXhfbGliCitNT0RfREVQUyA9IGNvbW1vbl9ncG9uCisKK3NyY3MgPSBiY21vbHRfaG9zdF9hcGkuYworCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgvYmNtb2x0X2hvc3RfYXBpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L2JjbW9sdF9ob3N0X2FwaS5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQyMDg4N2UKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L2JjbW9sdF9ob3N0X2FwaS5jCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2hvc3RfZHJpdmVyL2hvc3RfYXBpL2JjbW9sdF9ob3N0X2FwaS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ob3N0X2FwaV9saW51eC9iY21vbHRfaG9zdF9hcGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgvYmNtb2x0X2hvc3RfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMGViYmUyOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgvYmNtb2x0X2hvc3RfYXBpLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vaG9zdF9kcml2ZXIvaG9zdF9hcGkvYmNtb2x0X2hvc3RfYXBpLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L2JjbW9sdF9ob3N0X2FwaV9ncG9uX3V0aWxzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L2JjbW9sdF9ob3N0X2FwaV9ncG9uX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjZiZTk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgvYmNtb2x0X2hvc3RfYXBpX2dwb25fdXRpbHMuaApAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci9ob3N0X2FwaS9iY21vbHRfaG9zdF9hcGlfZ3Bvbl91dGlscy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9pMmMvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzNjMmRiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9pMmMvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorIyBJMkMgZGV2aWNlcyBkcml2ZXIKKyMKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCitNT0RfTkFNRSA9IGkyY19kZXZzCitNT0RfVFlQRSA9IGxpbnV4X21vZHVsZQorCitzcmNzID0gYmNtb2x0X2kyY19kZXZzLmMKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK2VuZGlmCisKK1VTRV9MSU5UID0geWVzCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaTJjL2JjbW9sdF9pMmNfZGV2cy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9pMmMvYmNtb2x0X2kyY19kZXZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhlOWVjNAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaTJjL2JjbW9sdF9pMmNfZGV2cy5jCkBAIC0wLDAgKzEsMTAzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPiAvKmNvcHlfZnJvbV91c2VyKi8KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb2x0X2kyY19kZXZzLmgiCisjaW5jbHVkZSAiYmNtb2x0X2kyY19kZXZzX2lvY3RsLmgiCisKKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUl9TVEFSVCB0eXBlZGVmIGVudW0geworI2RlZmluZSBCQ01fSTJDX0RFVl9BRERSKG5hbWUsIGRlc2MsIHZhbCkgbmFtZSA9IHZhbCwKKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUl9FTkQgfSBiY21faTJjX2Rldl9hZGRyOworCisjaW5jbHVkZSAiYmNtb2x0X2kyY19kZXZzX2FkZHIuaCIKKworI2RlZmluZSBQUk9DX0RJUl9OQU1FICAgICAgICJtYXBsZV9pMmMiCisjZGVmaW5lIFBST0NfRU5UUllfTkFNRSAgICAgImkyYyIKKyNkZWZpbmUgTUFYX0VBR0FJTl9JVEVSUyAgICAyMDAgLyogMTBtcyBwZXIgaXRlciAqLworCisvKiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgZGVidWcgb3V0cHV0IHRvIHRoZSBrZXJuZWwgQ0xJICovCisvKiAjZGVmaW5lIEkyQ19ERUJVR19QUklOVFMgMSAqLworI2lmZGVmIEkyQ19ERUJVR19QUklOVFMKKyNkZWZpbmUgaTJjX2RlYnVnX3ByaW50KGZtdCwgYXJncy4uLikgcHJpbnRrKCIlcyMlZDogIiBmbXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBpMmNfZGVidWdfcHJpbnQoLi4uKQorI2VuZGlmCisKK2ludCBtYXBsZV9pMmNfY2hyZGV2X21ham9yID0gMjE2OworbW9kdWxlX3BhcmFtKG1hcGxlX2kyY19jaHJkZXZfbWFqb3IsIGludCwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lXR1JQKTsKK01PRFVMRV9QQVJNX0RFU0MobWFwbGVfaTJjX2NocmRldl9tYWpvciwgIm1hcGxlX2kyY19tYWpvciIpOworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppMmNfcHJvY19kaXI7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppMmNfcHJvY19lbnRyeTsKK3N0YXRpYyBjaGFyIGlzX2NocmRldl9yZWc7CitzdGF0aWMgY2hhciBpc19jZGV2X2FkZDsKK3N0YXRpYyBpbnQgaTJjX2NsaWVudF9udW07CitzdGF0aWMgaW50IGkyY19udW1fY2xpZW50czsKKworY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geworICAgIEkyQ19TVzBfSTJDX0FERFIsCisgICAgSTJDX1NXMV9JMkNfQUREUiwKKyAgICBJMkNfU1cyX0kyQ19BRERSLAorICAgIEkyQ19TVzNfSTJDX0FERFIsCisgICAgSTJDX1NXNF9JMkNfQUREUiwKKyAgICBTRlBfSTJDX0FERFIxLAorICAgIFNGUF9JMkNfQUREUjIsCisgICAgRlBHQV9JMkNfQUREUiwKKyAgICBQT05fRFBMTF9JMkNfQUREUiwKKyAgICBQTV9EUExMX0kyQ19BRERSLAorICAgIENYUF9SX0kyQ19BRERSLAorICAgIFBDSUVfU1dfSTJDX0FERFIsCisgICAgSTJDX0NMSUVOVF9FTkQKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNsYXZlX3ZhbGlkW1NMQVZFX05VTV9PRl9TTEFWRVNdID0gezB9OworCisvKgorICogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWFwbGVfaTJjX2lkX3RhYmxlW10gPSB7CisgICAgeyAibWFwbGVfaTJjIiwgMCB9LAorICAgIHsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtYXBsZV9pMmNfaWRfdGFibGUpOworCitzdGF0aWMgdm9pZCBiY21fYWNjZXNzX2ZwZ2Eodm9pZCk7CisKKy8qCisgKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKQorICovCitzdHJ1Y3QgbWFwbGVfaTJjX2RhdGEgeworICAgIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFwbGVfaTJjX2RhdGEgKnBjbGllbnRfZGF0YV9hcltTTEFWRV9OVU1fT0ZfU0xBVkVTXTsKKworc3RhdGljIGludCBnZXRfY2xpZW50KHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgc3RydWN0IGkyY19jbGllbnQgKipjbGllbnQpCit7CisgICAgaWYgKChjbGllbnRfbnVtID49IFNMQVZFX05VTV9PRl9TTEFWRVMpIHx8ICFzbGF2ZV92YWxpZFtjbGllbnRfbnVtXSkKKyAgICB7CisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiSTJDIGVycm9yOiBXcm9uZyBjbGllbnQgbnVtYmVyIDB4JXhcbiIsIGNsaWVudF9udW0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpjbGllbnQgPSAmcGNsaWVudF9kYXRhX2FyW2NsaWVudF9udW1dLT5jbGllbnQ7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogSGVscGVyIGZ1bmN0aW9ucyB3aGljaCBhdHRlbXB0IEkyQyB0cmFuc2ZlciB1bnRpbCBzdWNjZXNzZnVsLCBvciBlcnJvciBjb2RlIGlzIG90aGVyIHRoYW4gLUVBR0FJTgorICovCisKK3N0YXRpYyBpbnQgbWFwbGVfaTJjX3NlbmQodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1OCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKyAgICBpbnQgcmM7CisgICAgaW50IG5pdGVyID0gMDsKKworICAgIGlmIChnZXRfY2xpZW50KGNsaWVudF9udW0sICZjbGllbnQpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBkbyB7CisgICAgICAgIHJjID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCBjb3VudCk7CisgICAgICAgIGlmIChyYyA9PSAtRUFHQUlOKQorICAgICAgICAgICAgbXNsZWVwKDEwKTsKKyAgICB9IHdoaWxlIChyYyA9PSAtRUFHQUlOICYmICsrbml0ZXIgPCBNQVhfRUFHQUlOX0lURVJTKTsKKyAgICByYyA9IChyYyA9PSBjb3VudCkgPyAwIDogKHJjIDwgMCApID8gcmMgOiAtMTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGludCBtYXBsZV9pMmNfcmVjdih1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHU4ICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworICAgIGludCByYzsKKyAgICBpbnQgbml0ZXIgPSAwOworCisgICAgaWYgKGdldF9jbGllbnQoY2xpZW50X251bSwgJmNsaWVudCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGRvIHsKKyAgICAgICAgcmMgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBidWYsIGNvdW50KTsKKyAgICAgICAgaWYgKHJjID09IC1FQUdBSU4pCisgICAgICAgICAgICBtc2xlZXAoMTApOworICAgIH0gd2hpbGUgKHJjID09IC1FQUdBSU4gJiYgKytuaXRlciA8IE1BWF9FQUdBSU5fSVRFUlMpOworICAgIHJjID0gKHJjID09IGNvdW50KSA/IDAgOiAocmMgPCAwICkgPyByYyA6IC0xOworCisgICAgcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgbWFwbGVfaTJjX3JlYWRfd2l0aF9vZmZzZXQodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1OCAqb2Zmc2V0LCBzaXplX3Qgb2Zmc2V0X3NpemUsIHU4ICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworICAgIHN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKKyAgICBpbnQgcmM7CisgICAgaW50IG5pdGVyID0gMDsKKworICAgIGlmIChnZXRfY2xpZW50KGNsaWVudF9udW0sICZjbGllbnQpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBtc2dbMF0uYWRkciA9IG1zZ1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOworICAgIG1zZ1swXS5mbGFncyA9IG1zZ1sxXS5mbGFncyA9IGNsaWVudC0+ZmxhZ3MgJiBJMkNfTV9URU47CisKKyAgICBtc2dbMF0ubGVuID0gb2Zmc2V0X3NpemU7CisgICAgbXNnWzBdLmJ1ZiA9IG9mZnNldDsKKworICAgIG1zZ1sxXS5mbGFncyB8PSBJMkNfTV9SRDsKKyAgICBtc2dbMV0ubGVuID0gY291bnQ7CisgICAgbXNnWzFdLmJ1ZiA9IGJ1ZjsKKworICAgIGRvIHsKKyAgICAgICAgcmMgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOworICAgICAgICBpZiAocmMgPT0gLUVBR0FJTikKKyAgICAgICAgICAgIG1zbGVlcCgxMCk7CisgICAgfSB3aGlsZSAocmMgPT0gLUVBR0FJTiAmJiArK25pdGVyIDwgTUFYX0VBR0FJTl9JVEVSUyk7CisKKyAgICByYyA9IChyYyA9PSAyKSA/IDAgOiAocmMgPCAwICkgPyByYyA6IC0xOworCisgICAgcmV0dXJuIHJjOworfQorCitzc2l6ZV90IG1hcGxlX2kyY193cml0ZSh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgIGludCByYzsKKworICAgIGkyY19kZWJ1Z19wcmludCgiV3JpdGUgdG8gc3dpdGNoOiBjbGllbnQ9MHgleCB2YWwgPSAweCV4XG4iLCBub3JtYWxfaTJjW2NsaWVudF9udW1dLCAqYnVmKTsKKyAgICByYyA9IG1hcGxlX2kyY19zZW5kKGNsaWVudF9udW0sICh1OCAqKWJ1ZiwgY291bnQpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBGYWlsZWQuIHJjPSVkICBjbGllbnQ9JXVbJXVdXG4iLCByYywKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIGVsc2UKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBTdWNjZXNzZnVsIGNsaWVudD0ldVsldV1cbiIsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICByZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG1hcGxlX2kyY193cml0ZSk7CisKK3NzaXplX3QgbWFwbGVfaTJjX3JlYWQodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICBpbnQgcmM7CisKKyAgICBpMmNfZGVidWdfcHJpbnQoIlJlYWQgZnJvbSBzd2l0Y2g6IGNsaWVudCAweCV4XG4iLCBub3JtYWxfaTJjW2NsaWVudF9udW1dKTsKKyAgICByYyA9IG1hcGxlX2kyY19yZWN2KGNsaWVudF9udW0sICh1OCAqKWJ1ZiwgY291bnQpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIEZhaWxlZC4gcmM9JWQgIGNsaWVudD0ldVsldV1cbiIsIHJjLAorICAgICAgICAgICAgbm9ybWFsX2kyY1tjbGllbnRfbnVtXSwgY2xpZW50X251bSk7CisgICAgZWxzZQorICAgICAgICBpMmNfZGVidWdfcHJpbnQoIlJlYWQgU3VjY2Vzc2Z1bDogY291bnQ9JXUgdmFsID0gMHgleFxuIiwgKHVuc2lnbmVkKWNvdW50LCAqYnVmKTsKKyAgICByZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG1hcGxlX2kyY19yZWFkKTsKKworaW50IG1hcGxlX2kyY193cml0ZV9ieXRlKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworICAgIHU4IGJ1ZlsyXTsKKyAgICBpbnQgcmM7CisKKyAgICBpMmNfZGVidWdfcHJpbnQoIldyaXRlIEJ5dGU6IGNsaWVudD0weCV4IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIG9mZnNldCwgdmFsKTsKKworICAgIGJ1ZlswXSA9IG9mZnNldDsKKyAgICBidWZbMV0gPSB2YWw7CisgICAgcmMgPSBtYXBsZV9pMmNfc2VuZChjbGllbnRfbnVtLCBidWYsIDIpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBCeXRlIEZhaWxlZC4gcmM9JWQgIG9mZnNldD0weCV4IHZhbD0weCV4IGNsaWVudD0ldVsldV1cbiIsCisgICAgICAgICAgICByYywgb2Zmc2V0LCB2YWwsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICBlbHNlCisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiV3JpdGUgQnl0ZTogb2Zmc2V0PTB4JXggdmFsPTB4JXggY2xpZW50PSV1LyV1XG4iLAorICAgICAgICAgICAgb2Zmc2V0LCB2YWwsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICByZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG1hcGxlX2kyY193cml0ZV9ieXRlKTsKKworaW50IG1hcGxlX2kyY19yZWFkX2J5dGUodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1bnNpZ25lZCBjaGFyIG9mZnNldCwgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgICB1OCBvID0gb2Zmc2V0OworICAgIHU4IHZhbDsKKyAgICBpbnQgcmM7CisKKyAgICBpMmNfZGVidWdfcHJpbnQoIldyaXRlIEJ5dGU6IGNsaWVudD0weCV4IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIG9mZnNldCwgdmFsKTsKKworICAgIHJjID0gbWFwbGVfaTJjX3JlYWRfd2l0aF9vZmZzZXQoY2xpZW50X251bSwgJm8sIDEsICZ2YWwsIDEpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIEJ5dGUgRmFpbGVkLiByYz0lZCAgY2xpZW50PSV1WyV1XVxuIiwgcmMsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICAqZGF0YSA9IHZhbDsKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIEJ5dGU6IGNsaWVudD0weCV4IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBvZmZzZXQsICpkYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtYXBsZV9pMmNfcmVhZF9ieXRlKTsKKworCitpbnQgbWFwbGVfaTJjX3dyaXRlX3dvcmQodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1bnNpZ25lZCBjaGFyIG9mZnNldCwgdW5zaWduZWQgc2hvcnQgdmFsKQoreworICAgIHU4IGJ1ZlszXTsKKyAgICBpbnQgcmM7CisKKyAgICBpMmNfZGVidWdfcHJpbnQoIldyaXRlIFdvcmQ6IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIG9mZnNldCwgdmFsKTsKKworICAgIC8qIFRoZSBvZmZzZXQgdG8gYmUgd3JpdHRlbiBzaG91bGQgYmUgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIEkyQyB3cml0ZSAqLworICAgIGJ1ZlswXSA9IG9mZnNldDsKKyAgICBidWZbMV0gPSAoY2hhcikodmFsJjB4RkYpOworICAgIGJ1ZlsyXSA9IChjaGFyKSh2YWw+PjgpOworICAgIHJjID0gbWFwbGVfaTJjX3NlbmQoY2xpZW50X251bSwgYnVmLCBzaXplb2YoYnVmKSk7CisKKyAgICBpZiAocmMgPCAwKQorICAgICAgICBpMmNfZGVidWdfcHJpbnQoIldyaXRlIFdvcmQgRmFpbGVkLiByYz0lZCAgb2Zmc2V0PTB4JXggdmFsPTB4JXgsIGNsaWVudD0ldVsldV1cbiIsCisgICAgICAgICAgICByYywgb2Zmc2V0LCB2YWwsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICBlbHNlCisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiV3JpdGUgV29yZDogb2Zmc2V0PTB4JXggdmFsPTB4JXgsIGNsaWVudD0ldVsldV1cbiIsCisgICAgICAgICAgICBvZmZzZXQsIHZhbCwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIHJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wobWFwbGVfaTJjX3dyaXRlX3dvcmQpOworCitpbnQgbWFwbGVfaTJjX3JlYWRfd29yZCh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LCB1bnNpZ25lZCBzaG9ydCAqZGF0YSkKK3sKKyAgICB1OCBvID0gb2Zmc2V0OworICAgIHU4IGJ1ZlsyXTsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IG1hcGxlX2kyY19yZWFkX3dpdGhfb2Zmc2V0KGNsaWVudF9udW0sICZvLCAxLCBidWYsIHNpemVvZihidWYpKTsKKworICAgIGlmIChyYyA8IDApCisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiUmVhZCBXb3JkIEZhaWxlZC4gcmM9JWQgIG9mZnNldD0weCV4IGNsaWVudD0ldVsldV1cbiIsCisgICAgICAgICAgICByYywgb2Zmc2V0LAorICAgICAgICAgICAgbm9ybWFsX2kyY1tjbGllbnRfbnVtXSwgY2xpZW50X251bSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmRhdGEgPSAoYnVmWzFdPDw4KSB8IGJ1ZlswXTsgLyogSTJDIGRhdGEgaXMgTEUgKi8KKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIFdvcmQ6IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXggY2xpZW50PSV1WyV1XVxuIiwKKyAgICAgICAgICAgIG9mZnNldCwgKmRhdGEsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtYXBsZV9pMmNfcmVhZF93b3JkKTsKKworCitpbnQgbWFwbGVfaTJjX3dyaXRlX3JlZyh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LCBpbnQgdmFsKQoreworICAgIHU4IGJ1Zls1XTsKKyAgICBpbnQgcmM7CisKKyAgICBpMmNfZGVidWdfcHJpbnQoIldyaXRlIFJlZ2lzdGVyOiBvZmZzZXQgPSAweCV4LCB2YWwgPSAweCV4XG4iLCBvZmZzZXQsIHZhbCk7CisKKyAgICAvKiBTZXQgdGhlIGJ1ZlswXSB0byBiZSB0aGUgb2Zmc2V0IGZvciB3cml0ZSBvcGVyYXRpb24gKi8KKyAgICBidWZbMF0gPSBvZmZzZXQ7CisKKyAgICAvKiBPbiB0aGUgSTJDIGJ1cywgTFMgQnl0ZSBzaG91bGQgZ28gZmlyc3QgKi8KKyAgICBidWZbMV0gPSB2YWwgJiAweGZmOworICAgIGJ1ZlsyXSA9ICh2YWwgPj4gOCkgJiAweGZmOworICAgIGJ1ZlszXSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKKyAgICBidWZbNF0gPSAodmFsID4+IDI0KSAmIDB4ZmY7CisgICAgcmMgPSBtYXBsZV9pMmNfc2VuZChjbGllbnRfbnVtLCBidWYsIHNpemVvZihidWYpKTsKKworICAgIGlmIChyYyA8IDApCisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiV3JpdGUgUmVnIEZhaWxlZC4gcmM9JWQgb2Zmc2V0PTB4JXggdmFsPTB4JXggY2xpZW50PSV1WyV1XVxuIiwKKyAgICAgICAgICAgIHJjLCBvZmZzZXQsIHZhbCwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIGVsc2UKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBSZWcgU3VjY2Vzc2Z1bC4gb2Zmc2V0PTB4JXggdmFsPTB4JXggY2xpZW50PSV1WyV1XVxuIiwKKyAgICAgICAgICAgIG9mZnNldCwgdmFsLAorICAgICAgICAgICAgbm9ybWFsX2kyY1tjbGllbnRfbnVtXSwgY2xpZW50X251bSk7CisgICAgcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtYXBsZV9pMmNfd3JpdGVfcmVnKTsKKworCitpbnQgbWFwbGVfaTJjX3JlYWRfcmVnKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKyAgICB1OCBvID0gb2Zmc2V0OworICAgIHU4IGJ1Zls0XTsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IG1hcGxlX2kyY19yZWFkX3dpdGhfb2Zmc2V0KGNsaWVudF9udW0sICZvLCAxLCBidWYsIHNpemVvZihidWYpKTsKKworICAgIGlmIChyYyA8IDApCisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiUmVhZCBSZWcgRmFpbGVkLiByYz0lZCBvZmZzZXQ9MHgleCBjbGllbnQ9JXVbJXVdXG4iLAorICAgICAgICAgICAgcmMsIG9mZnNldCwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIGVsc2UKKyAgICB7CisgICAgICAgICpkYXRhID0gYnVmWzBdIHwgKGJ1ZlsxXSA8PCA4KSB8IChidWZbMl0gPDwgMTYpIHwgKGJ1ZlszXSA8PCAyNCk7IC8qIExTIGJ5dGUgaXMgdHJhbnNmZXJyZWQgZmlyc3QgKi8KKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIFJlZ2lzdGVyOiBjbGllbnQ9MHgleCBvZmZzZXQgPSAweCV4LCB2YWwgPSAweCV4XG4iLCBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBvZmZzZXQsICpkYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtYXBsZV9pMmNfcmVhZF9yZWcpOworCisKK2ludCBtYXBsZV9pMmNfd3JpdGVfZnBnYSh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCB2YWwpCit7CisgICAgdTggYnVmWzhdOworICAgIGludCByYzsKKworICAgIGJjbV9hY2Nlc3NfZnBnYSgpOworCisgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBmcGdhOiBvZmZzZXQgPSAweCV4LCB2YWwgPSAweCV4XG4iLCBvZmZzZXQsIHZhbCk7CisKKyAgICAvKiBTZXQgdGhlIG9mZnNldCBmb3Igd3JpdGUgb3BlcmF0aW9uICovCisgICAgLy8gICAgb2Zmc2V0ID0gc3dhYjMyKG9mZnNldCk7CisgICAgbWVtY3B5KCZidWZbMF0sIChjaGFyKikmb2Zmc2V0LCA0KTsKKworICAgIC8qIE9uIHRoZSBJMkMgYnVzLCBMUyBCeXRlIHNob3VsZCBnbyBmaXJzdCAqLworICAgIC8vICAgIHZhbCA9IHN3YWIzMih2YWwpOworICAgIG1lbWNweSgmYnVmWzRdLCAoY2hhciopJnZhbCwgNCk7CisKKyAgICByYyA9IG1hcGxlX2kyY19zZW5kKGNsaWVudF9udW0sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBGUEdBIEZhaWxlZC4gcmM9JWQgb2Zmc2V0PTB4JXggdmFsPTB4JXggY2xpZW50PSV1WyV1XVxuIiwKKyAgICAgICAgICAgIHJjLCBvZmZzZXQsIHZhbCwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIGVsc2UKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBGUEdBOiBvZmZzZXQ9MHgleCB2YWw9MHgleCBjbGllbnQ9JXVbJXVdXG4iLAorICAgICAgICAgICAgb2Zmc2V0LCB2YWwsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICByZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG1hcGxlX2kyY193cml0ZV9mcGdhKTsKKworaW50IG1hcGxlX2kyY19yZWFkX2ZwZ2EodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisgICAgdTggb2J1Zls0XTsKKyAgICB1OCBidWZbNF07CisgICAgaW50IHJjOworCisgICAgYmNtX2FjY2Vzc19mcGdhKCk7CisKKyAgICAvKiBGUEdBIGV4cGVjdHMgNCBieXRlIG9mZnNldCBpbiBCSUcgRU5ESUFOIGZvcm1hdCAqLworICAgIG9idWZbMF0gPSAob2Zmc2V0ID4+IDI0KSAmIDB4ZmY7CisgICAgb2J1ZlsxXSA9IChvZmZzZXQgPj4gMTYpICYgMHhmZjsKKyAgICBvYnVmWzJdID0gKG9mZnNldCA+PiA4KSAmIDB4ZmY7CisgICAgb2J1ZlszXSA9IG9mZnNldCAmIDB4ZmY7CisgICAgcmMgPSBtYXBsZV9pMmNfcmVhZF93aXRoX29mZnNldChjbGllbnRfbnVtLCBvYnVmLCBzaXplb2Yob2J1ZiksIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIEZQR0EgRmFpbGVkLiByYz0lZCBvZmZzZXQ9MHgleCBjbGllbnQ9JXVbJXVdXG4iLAorICAgICAgICAgICAgcmMsIG9mZnNldCwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIGVsc2UKKyAgICB7CisgICAgICAgICpkYXRhID0gYnVmWzNdIHwgKGJ1ZlsyXSA8PCA4KSB8IChidWZbMV0gPDwgMTYpIHwgKGJ1ZlswXSA8PCAyNCk7IC8qIE1TIGJ5dGUgaXMgdHJhbnNmZXJyZWQgZmlyc3QgKi8KKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIEZQR0E6IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXggJTAyeCAlMDJ4ICUwMnggJTAyeCAgY2xpZW50PSV1WyV1XVxuIiwKKyAgICAgICAgICAgIG9mZnNldCwgKmRhdGEsIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG1hcGxlX2kyY19yZWFkX2ZwZ2EpOworCitlbnVtIGNsaWVudF9udW0gbWFwbGVfaTJjX2dldF9jbGllbnQodTMyIGFkZHIpCit7CisgICAgZW51bSBjbGllbnRfbnVtIGkgPSAwOworICAgIHdoaWxlIChpIDwgU0xBVkVfTlVNX09GX1NMQVZFUykKKyAgICB7CisgICAgICAgIGlmIChwY2xpZW50X2RhdGFfYXJbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzbGF2ZV92YWxpZFtpXSAmJiBwY2xpZW50X2RhdGFfYXJbaV0tPmNsaWVudC5hZGRyID09IGFkZHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KK0VYUE9SVF9TWU1CT0wobWFwbGVfaTJjX2dldF9jbGllbnQpOworCitzdGF0aWMgaW50IGRldl9jaGFuZ2UodTMyIGFkZHIpCit7CisgICAgZW51bSBjbGllbnRfbnVtIGkgPSBtYXBsZV9pMmNfZ2V0X2NsaWVudChhZGRyKTsKKworICAgIGlmIChpIDwgU0xBVkVfTlVNX09GX1NMQVZFUykKKyAgICB7CisgICAgICAgIGkyY19jbGllbnRfbnVtID0gaTsKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJTbGF2ZSB3YXMgc2V0IHN1Y2Nlc3NmdWxseSBpICVkLCBhZGRyIDB4JXhcbiIsIGksIGFkZHIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpMmNfZGVidWdfcHJpbnQoIkZhaWxlZCB0byBzZXQgc2xhdmUgaSAlZCwgYWRkciAweCV4XG4iLCBpLCBhZGRyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmNtX2FjY2Vzc19mcGdhKHZvaWQpCit7CisgICAgc3RhdGljIGludCBhY2Nlc3NfZW5hYmxlZDsKKyAgICBpbnQgZnBnYV9jbGllbnRfbnVtICA9IG1hcGxlX2kyY19nZXRfY2xpZW50KEkyQ19TVzFfSTJDX0FERFIpOworICAgIHVpbnQ4X3QgIGI7CisKKyAgICBpZiAoYWNjZXNzX2VuYWJsZWQpCisgICAgCXJldHVybjsKKyAgICBiID0gNDsKKyAgICBtYXBsZV9pMmNfd3JpdGUoZnBnYV9jbGllbnRfbnVtLCAmYiwgMSk7CisgICAgYWNjZXNzX2VuYWJsZWQgPSAxOworfQorI2RlZmluZSBCQ01fRlBHQV9SRUdfUkVTRVRTIDB4MgorI2RlZmluZSBCQ01fRlBHQV9SRUdfRlBHQV9WRVJTSU9OIDB4MAorLyogMSA9IG91dCBvZiByZXNldCBiY21fYm9hcmRfY29uZmlnX3Jlc2V0X3ZhbHVlICovCit2b2lkIHJlc2V0X21hcGxlKGludCBiaXQsaW50IHBhcmFtKQoreworICAgIGludCBmcGdhX2NsaWVudF9udW0gID0gbWFwbGVfaTJjX2dldF9jbGllbnQoRlBHQV9JMkNfQUREUik7CisgICAgaW50IHN3X2NsaWVudF9udW0gID0gbWFwbGVfaTJjX2dldF9jbGllbnQoSTJDX1NXMF9JMkNfQUREUik7CisgICAgdWludDhfdCAgYiA9IDE7CisgICAgdWludDMyX3QgcmVzZXRfdmFsdWVzOworCisgICAgbWFwbGVfaTJjX3dyaXRlKHN3X2NsaWVudF9udW0sICZiLCAxKTsKKworICAgIC8qIFJlYWQtbW9kaWZ5LXdyaXRlIHNvIHdlIGNhbiBzZXQgb25seSB0aGUgcmVsZXZhbnQgYml0ICovCisgICAgbWFwbGVfaTJjX3JlYWRfZnBnYShmcGdhX2NsaWVudF9udW0sIEJDTV9GUEdBX1JFR19SRVNFVFMsICZyZXNldF92YWx1ZXMpOworCisgICAgaWYgKHBhcmFtKQorICAgICAgICByZXNldF92YWx1ZXMgfD0gMSA8PCBiaXQ7CisgICAgZWxzZQorICAgICAgICByZXNldF92YWx1ZXMgJj0gfigxIDw8IGJpdCk7CisgICAgbWFwbGVfaTJjX3dyaXRlX2ZwZ2EoZnBnYV9jbGllbnRfbnVtLCBCQ01fRlBHQV9SRUdfUkVTRVRTLCByZXNldF92YWx1ZXMpOworfQorRVhQT1JUX1NZTUJPTChyZXNldF9tYXBsZSk7CisKKy8qIENhbGxzIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbiBiYXNlZCBvbiB1c2VyIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgZXhlY19jb21tYW5kKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworI2RlZmluZSBNQVhfQVJHUyA0CisjZGVmaW5lIE1BWF9BUkdfU0laRSAzMgorICAgIGludCBpLCBhcmdjID0gMCwgdmFsID0gMDsKKyAgICBjaGFyIGNtZDsKKyAgICB1MzIgb2Zmc2V0ID0gMDsKKyAgICBjaGFyIGFyZ1tNQVhfQVJHU11bTUFYX0FSR19TSVpFXTsKKyNkZWZpbmUgTE9HX1dSX0tCVUZfU0laRSAxMjgKKyAgICBjaGFyIGtidWZbTE9HX1dSX0tCVUZfU0laRV07CisKKyAgICBpZiAoKGNvdW50ID4gTE9HX1dSX0tCVUZfU0laRS0xKSB8fCAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmLCBjb3VudCkgIT0gMCkpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIGtidWZbY291bnRdPTA7CisgICAgYXJnYyA9IHNzY2FuZihrYnVmLCAiJWMgJXMgJXMgJXMgJXMiLCAmY21kLCBhcmdbMF0sIGFyZ1sxXSwgYXJnWzJdLCBhcmdbM10pOworCisgICAgaWYgKGFyZ2MgPCAxKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJOZWVkIGF0LWxlYXN0IDIgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgfQorCisgICAgZm9yIChpPTA7IGk8TUFYX0FSR1M7ICsraSkgeworICAgICAgICBhcmdbaV1bTUFYX0FSR19TSVpFLTFdID0gJ1wwJzsKKyAgICB9CisgICAgb2Zmc2V0ID0gKHUzMilzaW1wbGVfc3RydG91bChhcmdbMF0sIE5VTEwsIDApOworICAgIGlmIChhcmdjID09IDMpCisgICAgICAgIHZhbCA9IChpbnQpc2ltcGxlX3N0cnRvdWwoYXJnWzFdLCBOVUxMLCAwKTsKKworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICBjYXNlICdtJzoKKyAgICAgICAgcmVzZXRfbWFwbGUoMCxvZmZzZXQpOyAvLyBtYXBsZSBvdXQgb2YgcmVzZXQoMSkgfCByZXNldCAoMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnayc6CisgICAgICAgIHJlc2V0X21hcGxlKDQsb2Zmc2V0KTsgLy8ga2F0YW5hMiBvdXQgb2YgcmVzZXQoMSkgfCByZXNldCAoMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnYic6CisgICAgICAgIGlmIChhcmdjID09IDMpCisgICAgICAgICAgICBtYXBsZV9pMmNfd3JpdGVfYnl0ZShpMmNfY2xpZW50X251bSwgKHU4KW9mZnNldCwgKHU4KXZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdTggZGF0YTsKKyAgICAgICAgICAgIG1hcGxlX2kyY19yZWFkX2J5dGUoaTJjX2NsaWVudF9udW0sICh1OClvZmZzZXQsICZkYXRhKTsKKyAgICAgICAgICAgIHByaW50aygiY2xpZW50IDB4JXgsIG9mZnNldCAweCV4LCBkYXRhPTB4JXhcbiIsIG5vcm1hbF9pMmNbaTJjX2NsaWVudF9udW1dLCBvZmZzZXQsIGRhdGEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAncyc6CisgICAgICAgIGlmIChhcmdjID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4IGRhdGEgPSAodTgpb2Zmc2V0OworICAgICAgICAgICAgbWFwbGVfaTJjX3dyaXRlKGkyY19jbGllbnRfbnVtLCAmZGF0YSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB1OCBkYXRhID0gb2Zmc2V0OworICAgICAgICAgICAgbWFwbGVfaTJjX3JlYWQoaTJjX2NsaWVudF9udW0sICZkYXRhLCAxKTsKKyAgICAgICAgICAgIHByaW50aygiY2xpZW50IDB4JXgsIGRhdGE9MHgleFxuIiwgbm9ybWFsX2kyY1tpMmNfY2xpZW50X251bV0sIGRhdGEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAndyc6CisgICAgICAgIGlmIChhcmdjID09IDMpCisgICAgICAgICAgICBtYXBsZV9pMmNfd3JpdGVfd29yZChpMmNfY2xpZW50X251bSwgKHU4KW9mZnNldCwgKHUxNil2YWwpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHUxNiBkYXRhOworICAgICAgICAgICAgbWFwbGVfaTJjX3JlYWRfd29yZChpMmNfY2xpZW50X251bSwgKHU4KW9mZnNldCwgJmRhdGEpOworICAgICAgICAgICAgcHJpbnRrKCJjbGllbnQgMHgleCwgb2Zmc2V0IDB4JXgsIGRhdGE9MHgleFxuIiwgbm9ybWFsX2kyY1tpMmNfY2xpZW50X251bV0sIG9mZnNldCwgZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICAgICAgaWYgKGFyZ2MgPT0gMykKKyAgICAgICAgICAgIG1hcGxlX2kyY193cml0ZV9yZWcoaTJjX2NsaWVudF9udW0sICh1OClvZmZzZXQsIHZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdTMyIGRhdGE7CisgICAgICAgICAgICBtYXBsZV9pMmNfcmVhZF9yZWcoaTJjX2NsaWVudF9udW0sICh1OClvZmZzZXQsICZkYXRhKTsKKyAgICAgICAgICAgIHByaW50aygiY2xpZW50IDB4JXgsIG9mZnNldCAweCV4LCBkYXRhPTB4JXhcbiIsIG5vcm1hbF9pMmNbaTJjX2NsaWVudF9udW1dLCBvZmZzZXQsIGRhdGEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZic6CisgICAgICAgIGlmIChhcmdjID09IDMpCisgICAgICAgICAgICBtYXBsZV9pMmNfd3JpdGVfZnBnYShpMmNfY2xpZW50X251bSwgb2Zmc2V0LCB2YWwpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiBkYXRhOworICAgICAgICAgICAgbWFwbGVfaTJjX3JlYWRfZnBnYShpMmNfY2xpZW50X251bSwgb2Zmc2V0LCAmZGF0YSk7CisgICAgICAgICAgICBwcmludGsoImNsaWVudCAweCV4LCBvZmZzZXQgMHgleCwgZGF0YT0weCV4XG4iLCBub3JtYWxfaTJjW2kyY19jbGllbnRfbnVtXSwgb2Zmc2V0LCBkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgJ2MnOgorICAgICAgICBkZXZfY2hhbmdlKG9mZnNldCk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRrKCJJbnZhbGlkIGNvbW1hbmQuXG4gVmFsaWQgY29tbWFuZHM6XG4iCisgICAgICAgICAgICAiICBDaGFuZ2UgSTJDIEFkZHI6IGMgYWRkclxuIgorICAgICAgICAgICAgIiAgV3JpdGUgUmVnOiAgICAgICBkIG9mZnNldCB2YWxcbiIKKyAgICAgICAgICAgICIgIFJlYWQgUmVnOiAgICAgICAgZCBvZmZzZXRcbiIKKyAgICAgICAgICAgICIgIFdyaXRlIFdvcmQ6ICAgICAgdyBvZmZzZXQgdmFsXG4iCisgICAgICAgICAgICAiICBSZWFkIFdvcmQ6ICAgICAgIHcgb2Zmc2V0XG4iCisgICAgICAgICAgICAiICBXcml0ZSBCeXRlOiAgICAgIGIgb2Zmc2V0IHZhbFxuIgorICAgICAgICAgICAgIiAgUmVhZCBCeXRlOiAgICAgICBiIG9mZnNldFxuIgorICAgICAgICAgICAgIiAgV3JpdGUgZnBnYTogICAgICBmIG9mZnNldCB2YWxcbiIKKyAgICAgICAgICAgICIgIFJlYWQgZnBnYTogICAgICAgZiBvZmZzZXRcbiIKKyAgICAgICAgICAgICIgIFdyaXRlIHRvIHN3aXRjaDogcyB2YWwgKG9uZSBieXRlKVxuIgorICAgICAgICAgICAgIiAgUmVhZCBmcm9tIHN3aXRjaDpzXG4iCisgICAgICAgICAgICAiICBNYXBsZTogICAgICAgICAgIG0gPDB8MT5cbiIKKyAgICAgICAgICAgICIgIEthdGFuYTI6ICAgICAgICAgayA8MHwxPlxuIgorICAgICAgICAgICAgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworCisKKy8qIFJlYWQgRnVuY3Rpb24gb2YgUFJPQ0ZTIGF0dHJpYnV0ZSAibWFwbGVfaTJjL3Rlc3QiICovCitzdGF0aWMgc3NpemVfdCBtYXBsZV9pMmNfcHJvY190ZXN0X3JlYWQoc3RydWN0IGZpbGUgKmYsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorICAgIGxvZmZfdCAqcG9zKQoreworICAgIHByaW50aygiIFVzYWdlOiBlY2hvIGNvbW1hbmQgPiAiCisgICAgICAgICIgL3Byb2MvbWFwbGVfaTJjL3Rlc3RcbiIpOworICAgIHByaW50aygiIHN1cHBvcnRlZCBjb21tYW5kczpcbiIKKyAgICAgICAgIiAgQ2hhbmdlIEkyQyBBZGRyOiBjIGFkZHJcbiIKKyAgICAgICAgIiAgV3JpdGUgUmVnOiAgICAgICBkIG9mZnNldCB2YWxcbiIKKyAgICAgICAgIiAgUmVhZCBSZWc6ICAgICAgICBkIG9mZnNldFxuIgorICAgICAgICAiICBXcml0ZSBXb3JkOiAgICAgIHcgb2Zmc2V0IHZhbFxuIgorICAgICAgICAiICBSZWFkIFdvcmQ6ICAgICAgIHcgb2Zmc2V0XG4iCisgICAgICAgICIgIFdyaXRlIEJ5dGU6ICAgICAgYiBvZmZzZXQgdmFsXG4iCisgICAgICAgICIgIFJlYWQgQnl0ZTogICAgICAgYiBvZmZzZXRcbiIKKyAgICAgICAgIiAgV3JpdGUgZnBnYTogICAgICBmIG9mZnNldCB2YWxcbiIKKyAgICAgICAgIiAgUmVhZCBmcGdhOiAgICAgICBmIG9mZnNldFxuIgorICAgICAgICAiICBXcml0ZSB0byBzd2l0Y2g6IHMgdmFsIChvbmUgYnl0ZSlcbiIKKyAgICAgICAgIiAgUmVhZCBmcm9tIHN3aXRjaDpzXG4iCisgICAgICAgICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlIEZ1bmN0aW9uIG9mIFBST0NGUyBhdHRyaWJ1dGUgIm1hcGxlX2kyYy90ZXN0IiAqLworc3RhdGljIHNzaXplX3QgbWFwbGVfaTJjX3Byb2NfdGVzdF93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciAqYnVmLAorICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisgICAgcmV0dXJuIGV4ZWNfY29tbWFuZChidWYsIGNvdW50KTsKK30KKworLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50IG1hcGxlX2kyY19kZXZfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKK3sKKyAgICBpMmNfZGVidWdfcHJpbnQoImRldGVjdGluZyBpMmMgZGV2aWNlIDB4JXhcbiIsIGNsaWVudC0+YWRkcik7CisKKyAgICAvKiBUT0RPOiBkZXRlY3Rpb24gYW5kIGlkZW50aWZpY2F0aW9uICovCisKKyAgICBzdHJjcHkoaW5mby0+dHlwZSwgIm1hcGxlX2kyYyIpOworICAgIGluZm8tPmZsYWdzID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWFwbGVfaTJjX2ZvcHMgPQoreworICAgIHJlYWQ6IG1hcGxlX2kyY19wcm9jX3Rlc3RfcmVhZCwKKyAgICB3cml0ZTogbWFwbGVfaTJjX3Byb2NfdGVzdF93cml0ZQorfTsKKworc3RhdGljIGludCBtYXBsZV9pMmNfZGV2X2NyZWF0ZV9wcm9jKHZvaWQpCit7CisgICAgaTJjX3Byb2NfZGlyID0gcHJvY19ta2RpcihQUk9DX0RJUl9OQU1FLCBOVUxMKTsKKyAgICBpZiAoIWkyY19wcm9jX2RpcikKKyAgICB7CisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiZmFpbCB0byBjcmVhdGUgcHJvYyBkaXJcbiIpOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICBpMmNfcHJvY19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRU5UUllfTkFNRSwgMCwgaTJjX3Byb2NfZGlyKTsKKyAgICBpZiAoIWkyY19wcm9jX2VudHJ5KQorICAgIHsKKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19ESVJfTkFNRSwgTlVMTCk7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKworICAgIGkyY19wcm9jX2VudHJ5LT5wcm9jX2ZvcHMgPSAmbWFwbGVfaTJjX2ZvcHM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXBsZV9pMmNfY2hyZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFwbGVfaTJjX2NocmRldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBtYXBsZV9pMmNfY2hyZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICBpbnQgbGludXhfcmMgPSAwOworICAgIGludCByYzsKKyAgICBtYXBsZV9pMmNfaW9jdGxfcGFyYW0gcGFyYW1zOworCisgICAgLyogZG9uJ3QgZXZlbiBkZWNvZGUgd3JvbmcgY21kczogYmV0dGVyIHJldHVybmluZyAgRU5PVFRZIHRoYW4gRUZBVUxUICovCisgICAgaWYgKF9JT0NfVFlQRShjbWQpICE9IE1BUExFX0kyQ19JT0NUTF9NQUdJQykKKyAgICAgICAgcmV0dXJuIC1FTk9UVFk7CisKKyAgICAvKgorICAgICAqIHRoZSB0eXBlIGlzIGEgYml0bWFzaywgYW5kIFZFUklGWV9XUklURSBjYXRjaGVzIFIvVworICAgICAqIHRyYW5zZmVycy4gTm90ZSB0aGF0IHRoZSB0eXBlIGlzIHVzZXItb3JpZW50ZWQsIHdoaWxlCisgICAgICogdmVyaWZ5X2FyZWEgaXMga2VybmVsLW9yaWVudGVkLCBzbyB0aGUgY29uY2VwdCBvZiAicmVhZCIgYW5kCisgICAgICogIndyaXRlIiBpcyByZXZlcnNlZAorICAgICAqLworICAgIGlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKQorICAgICAgICBsaW51eF9yYyA9ICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAodm9pZCBfX3VzZXIgKilhcmcsIF9JT0NfU0laRShjbWQpKTsKKyAgICBlbHNlIGlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19XUklURSkKKyAgICAgICAgbGludXhfcmMgPSAgIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSk7CisgICAgaWYgKGxpbnV4X3JjKQorICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICBjYXNlIE1BUExFX0kyQ19JT0NUTF9PUF9ERVZfQ0hBTkdFOgorICAgICAgICB7CisgICAgICAgICAgICBsaW51eF9yYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyICopJnBhcmFtcywgKGNoYXIgKilhcmcsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gZGV2X2NoYW5nZShwYXJhbXMuYWRkcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVBMRV9JMkNfSU9DVExfT1BfREVWX1dSSVRFOgorICAgICAgICB7CisgICAgICAgICAgICBsaW51eF9yYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyICopJnBhcmFtcywgKGNoYXIgKilhcmcsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtcy5jb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwbGVfaTJjX3dyaXRlX2J5dGUoaTJjX2NsaWVudF9udW0sIHBhcmFtcy5hZGRyLCBwYXJhbXMudmFsKTsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcGxlX2kyY193cml0ZV93b3JkKGkyY19jbGllbnRfbnVtLCBwYXJhbXMuYWRkciwgcGFyYW1zLnZhbCk7CisgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgIHJldHVybiBtYXBsZV9pMmNfd3JpdGVfcmVnKGkyY19jbGllbnRfbnVtLCBwYXJhbXMuYWRkciwgcGFyYW1zLnZhbCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUFQTEVfSTJDX0lPQ1RMX09QX0RFVl9SRUFEOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGI7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB3OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHI7CisKKyAgICAgICAgICAgIGxpbnV4X3JjID0gY29weV9mcm9tX3VzZXIoKGNoYXIgKikmcGFyYW1zLCAoY2hhciAqKWFyZywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHN3aXRjaCAocGFyYW1zLmNvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIGxpbnV4X3JjID0gbWFwbGVfaTJjX3JlYWRfYnl0ZShpMmNfY2xpZW50X251bSwgcGFyYW1zLmFkZHIsICZiKTsKKyAgICAgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBwYXJhbXMudmFsID0gYjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgbGludXhfcmMgPSBtYXBsZV9pMmNfcmVhZF93b3JkKGkyY19jbGllbnRfbnVtLCBwYXJhbXMuYWRkciwgJncpOworICAgICAgICAgICAgICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHBhcmFtcy52YWwgPSB3OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICBsaW51eF9yYyA9IG1hcGxlX2kyY19yZWFkX3JlZyhpMmNfY2xpZW50X251bSwgcGFyYW1zLmFkZHIsICZyKTsKKyAgICAgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBwYXJhbXMudmFsID0gcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgKGNoYXIgKikmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgIH0KKyAgICBjYXNlIE1BUExFX0kyQ19JT0NUTF9PUF9TV0lUQ0hfV1JJVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgYjsKKworICAgICAgICAgICAgbGludXhfcmMgPSBjb3B5X2Zyb21fdXNlcigoY2hhciAqKSZwYXJhbXMsIChjaGFyICopYXJnLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYiA9IHBhcmFtcy52YWw7CisgICAgICAgICAgICByZXR1cm4gbWFwbGVfaTJjX3dyaXRlKGkyY19jbGllbnRfbnVtLCAmYiwgMSk7CisgICAgICAgIH0KKyAgICBjYXNlIE1BUExFX0kyQ19JT0NUTF9PUF9TV0lUQ0hfUkVBRDoKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBiOworCisgICAgICAgICAgICBsaW51eF9yYyA9IG1hcGxlX2kyY19yZWFkKGkyY19jbGllbnRfbnVtLCAmYiwgMSk7CisgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcGFyYW1zLnZhbCA9IGI7CisgICAgICAgICAgICByZXR1cm4gY29weV90b191c2VyKChjaGFyICopYXJnLCAoY2hhciAqKSZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgfQorICAgIGNhc2UgTUFQTEVfSTJDX0lPQ1RMX09QX0ZQR0FfV1JJVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbnV4X3JjID0gY29weV9mcm9tX3VzZXIoKGNoYXIgKikmcGFyYW1zLCAoY2hhciAqKWFyZywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBtYXBsZV9pMmNfd3JpdGVfZnBnYShpMmNfY2xpZW50X251bSwgcGFyYW1zLmFkZHIsIHBhcmFtcy52YWwpOworICAgICAgICB9CisgICAgY2FzZSBNQVBMRV9JMkNfSU9DVExfT1BfRlBHQV9SRUFEOgorICAgICAgICB7CisgICAgICAgICAgICBsaW51eF9yYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyICopJnBhcmFtcywgKGNoYXIgKilhcmcsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBsaW51eF9yYyA9IG1hcGxlX2kyY19yZWFkX2ZwZ2EoaTJjX2NsaWVudF9udW0sIHBhcmFtcy5hZGRyLCAmcGFyYW1zLnZhbCk7CisgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgKGNoYXIgKikmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICByYyA9IC1FTk9UVFk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBsaW51eF9yYzsKK30KKworc3RhdGljIHNzaXplX3QgbWFwbGVfaTJjX2NocmRldl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKyAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqZl9wb3MpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1hcGxlX2kyY19jaHJkZXZfZm9wcyA9Cit7CisgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisgICAgLm9wZW4gPSBtYXBsZV9pMmNfY2hyZGV2X29wZW4sCisgICAgLnJlbGVhc2UgPSBtYXBsZV9pMmNfY2hyZGV2X3JlbGVhc2UsCisgICAgLndyaXRlID0gbWFwbGVfaTJjX2NocmRldl93cml0ZSwKKyAgICAudW5sb2NrZWRfaW9jdGwgPSBtYXBsZV9pMmNfY2hyZGV2X2lvY3RsCit9OworCitzdGF0aWMgc3RydWN0IGNkZXYgbWFwbGVfaTJjX2NocmRldl9jZGV2OworCitzdGF0aWMgaW50IG1hcGxlX2kyY19kZXZfY3JlYXRlX2NocmRldih2b2lkKQoreworICAgIGRldl90IGRldiA9IE1LREVWKG1hcGxlX2kyY19jaHJkZXZfbWFqb3IsIDApOworICAgIGludCBsaW51eF9yYzsKKworICAgIGlzX2NocmRldl9yZWcgPSAwOworICAgIGlzX2NkZXZfYWRkID0gMDsKKyAgICAvKgorICAgICAqIFJlZ2lzdGVyIHlvdXIgbWFqb3IsIGFuZCBhY2NlcHQgYSBkeW5hbWljIG51bWJlci4KKyAgICAgKi8KKyAgICBpZiAoIW1hcGxlX2kyY19jaHJkZXZfbWFqb3IpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBsaW51eF9yYyA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCAwLCAibWFwbGVfaTJjIik7CisgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICB7CisgICAgICAgIGkyY19kZWJ1Z19wcmludCgicmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbigpLT4lZFxuIiwgbGludXhfcmMpOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisgICAgaXNfY2hyZGV2X3JlZyA9IDE7CisKKyAgICBjZGV2X2luaXQoJm1hcGxlX2kyY19jaHJkZXZfY2RldiwgJm1hcGxlX2kyY19jaHJkZXZfZm9wcyk7CisgICAgbGludXhfcmMgPSBjZGV2X2FkZCgmbWFwbGVfaTJjX2NocmRldl9jZGV2LCBkZXYsIDEpOworICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgeworICAgICAgICBpMmNfZGVidWdfcHJpbnQoImNkZXZfYWRkKCktPiVkXG4iLCBsaW51eF9yYyk7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICBpc19jZGV2X2FkZCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXBsZV9pMmNfZGV2X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKyAgICBpbnQgZXJyID0gMDsKKyAgICBzdHJ1Y3QgbWFwbGVfaTJjX2RhdGEgKnBjbGllbnRfZGF0YTsKKworICAgIGkyY19kZWJ1Z19wcmludCgiISEhISBpMmMgZGV2aWNlIDB4JXggcHJvYmVcbiIsIGNsaWVudC0+YWRkcik7CisKKyAgICBpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkKKyAgICAgICAgZ290byBleGl0OworCisgICAgaWYgKCEocGNsaWVudF9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1hcGxlX2kyY19kYXRhKSwgR0ZQX0tFUk5FTCkpKQorICAgIHsKKyAgICAgICAgZXJyID0gLUVOT01FTTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHBjbGllbnRfZGF0YS0+Y2xpZW50LmFkZHIgPSBjbGllbnQtPmFkZHI7CisgICAgcGNsaWVudF9kYXRhLT5jbGllbnQuYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKyAgICBwY2xpZW50X2RhdGEtPmNsaWVudC5kcml2ZXIgPSBjbGllbnQtPmRyaXZlcjsKKyAgICBwY2xpZW50X2RhdGEtPmNsaWVudC5mbGFncyA9IGNsaWVudC0+ZmxhZ3M7CisKKyAgICBpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwY2xpZW50X2RhdGEpOworCisgICAgc3dpdGNoKGNsaWVudC0+YWRkcikKKyAgICB7CisgICAgY2FzZSBJMkNfU1cwX0kyQ19BRERSOgorICAgICAgICBwY2xpZW50X2RhdGFfYXJbU0xBVkVfU1dJVENIXzcwXSA9IHBjbGllbnRfZGF0YTsKKyAgICAgICAgc2xhdmVfdmFsaWRbU0xBVkVfU1dJVENIXzcwXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSTJDX1NXMV9JMkNfQUREUjoKKyAgICAgICAgcGNsaWVudF9kYXRhX2FyW1NMQVZFX1NXSVRDSF83MV0gPSBwY2xpZW50X2RhdGE7CisgICAgICAgIHNsYXZlX3ZhbGlkW1NMQVZFX1NXSVRDSF83MV0gPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEkyQ19TVzJfSTJDX0FERFI6CisgICAgICAgIHBjbGllbnRfZGF0YV9hcltTTEFWRV9TV0lUQ0hfNzJdID0gcGNsaWVudF9kYXRhOworICAgICAgICBzbGF2ZV92YWxpZFtTTEFWRV9TV0lUQ0hfNzJdID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJMkNfU1czX0kyQ19BRERSOgorICAgICAgICBwY2xpZW50X2RhdGFfYXJbU0xBVkVfU1dJVENIXzczXSA9IHBjbGllbnRfZGF0YTsKKyAgICAgICAgc2xhdmVfdmFsaWRbU0xBVkVfU1dJVENIXzczXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSTJDX1NXNF9JMkNfQUREUjoKKyAgICAgICAgcGNsaWVudF9kYXRhX2FyW1NMQVZFX1NXSVRDSF83NF0gPSBwY2xpZW50X2RhdGE7CisgICAgICAgIHNsYXZlX3ZhbGlkW1NMQVZFX1NXSVRDSF83NF0gPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNGUF9JMkNfQUREUjE6CisgICAgICAgIHBjbGllbnRfZGF0YV9hcltTTEFWRV9TRlBfNTBdID0gcGNsaWVudF9kYXRhOworICAgICAgICBzbGF2ZV92YWxpZFtTTEFWRV9TRlBfNTBdID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRlBfSTJDX0FERFIyOgorICAgICAgICBwY2xpZW50X2RhdGFfYXJbU0xBVkVfU0ZQXzUxXSA9IHBjbGllbnRfZGF0YTsKKyAgICAgICAgc2xhdmVfdmFsaWRbU0xBVkVfU0ZQXzUxXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlBHQV9JMkNfQUREUjoKKyAgICAgICAgcGNsaWVudF9kYXRhX2FyW1NMQVZFX0ZQR0FfNDBdID0gcGNsaWVudF9kYXRhOworICAgICAgICBzbGF2ZV92YWxpZFtTTEFWRV9GUEdBXzQwXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUE9OX0RQTExfSTJDX0FERFI6CisgICAgICAgIHBjbGllbnRfZGF0YV9hcltTTEFWRV9QT05fRFBMTF82OF0gPSBwY2xpZW50X2RhdGE7CisgICAgICAgIHNsYXZlX3ZhbGlkW1NMQVZFX1BPTl9EUExMXzY4XSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUE1fRFBMTF9JMkNfQUREUjoKKyAgICAgICAgcGNsaWVudF9kYXRhX2FyW1NMQVZFX1BNX0RQTExfNkFdID0gcGNsaWVudF9kYXRhOworICAgICAgICBzbGF2ZV92YWxpZFtTTEFWRV9QTV9EUExMXzZBXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1hQX1JfSTJDX0FERFI6CisgICAgICAgIHBjbGllbnRfZGF0YV9hcltTTEFWRV9DWFBfUl81NF0gPSBwY2xpZW50X2RhdGE7CisgICAgICAgIHNsYXZlX3ZhbGlkW1NMQVZFX0NYUF9SXzU0XSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUENJRV9TV19JMkNfQUREUjoKKyAgICAgICAgcGNsaWVudF9kYXRhX2FyW1NMQVZFX1BDSUVfU1dfM0NdID0gcGNsaWVudF9kYXRhOworICAgICAgICBzbGF2ZV92YWxpZFtTTEFWRV9QQ0lFX1NXXzNDXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiJXMgY2xpZW50IGFkZHIgb3V0IG9mIHJhbmdlIDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgY2xpZW50LT5hZGRyKTsKKyAgICAgICAgZ290byBleGl0X2tmcmVlOworICAgIH0KKworICAgIC8qIENyZWF0ZSBvbmx5IG9uY2UgKi8KKyAgICBpZiAoaTJjX3Byb2NfZW50cnkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChtYXBsZV9pMmNfZGV2X2NyZWF0ZV9wcm9jKCkgPCAwKQorICAgICAgICAgICAgZ290byBleGl0X2tmcmVlOworICAgIH0KKyAgICBpZiAoIWlzX2NkZXZfYWRkKQorICAgIHsKKyAgICAgICAgaWYgKG1hcGxlX2kyY19kZXZfY3JlYXRlX2NocmRldigpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rZnJlZTsKKyAgICB9CisgICAgKytpMmNfbnVtX2NsaWVudHM7CisKKyAgICByZXR1cm4gMDsKKworZXhpdF9rZnJlZToKKyAgICBrZnJlZShwY2xpZW50X2RhdGEpOworZXhpdDoKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1hcGxlX2kyY19kZXZfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisgICAga2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworICAgIC0taTJjX251bV9jbGllbnRzOworICAgIGlmICghaTJjX251bV9jbGllbnRzKQorICAgIHsKKyAgICAgICAgaWYgKGkyY19wcm9jX2VudHJ5ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRU5UUllfTkFNRSwgaTJjX3Byb2NfZGlyKTsKKyAgICAgICAgICAgIGkyY19wcm9jX2VudHJ5ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaTJjX3Byb2NfZGlyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRElSX05BTUUsIE5VTEwpOworICAgICAgICAgICAgaTJjX3Byb2NfZGlyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNfY2Rldl9hZGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNkZXZfZGVsKCZtYXBsZV9pMmNfY2hyZGV2X2NkZXYpOworICAgICAgICAgICAgaXNfY2Rldl9hZGQgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChpc19jaHJkZXZfcmVnKQorICAgICAgICB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYobWFwbGVfaTJjX2NocmRldl9tYWpvciwgMCksIDEpOworICAgICAgICAgICAgaXNfY2hyZGV2X3JlZyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1hcGxlX2kyY19kZXZfZHJpdmVyID0geworICAgIC5jbGFzcwkJPSB+MCwKKyAgICAuZHJpdmVyID0geworICAgICAgICAubmFtZQk9ICJtYXBsZV9pMmMiLAorICAgIH0sCisgICAgLnByb2JlCQk9IG1hcGxlX2kyY19kZXZfcHJvYmUsCisgICAgLnJlbW92ZQkJPSBtYXBsZV9pMmNfZGV2X3JlbW92ZSwKKyAgICAuaWRfdGFibGUJPSBtYXBsZV9pMmNfaWRfdGFibGUsCisgICAgLmRldGVjdAkJPSBtYXBsZV9pMmNfZGV2X2RldGVjdCwKKyAgICAuYWRkcmVzc19saXN0CT0gbm9ybWFsX2kyYywKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKG1hcGxlX2kyY19kZXZfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJtYXBsZSBpMmMgZGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9iY21vbHRfaTJjX2RldnMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaTJjL2JjbW9sdF9pMmNfZGV2cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGVkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9iY21vbHRfaTJjX2RldnMuaApAQCAtMCwwICsxLDIyNiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0kyQ19ERVZTX0hfCisjZGVmaW5lIF9CQ01PTFRfSTJDX0RFVlNfSF8KKworLyogV2hlbiBpbnNlcnRpbmcgdGhlIG1vZHVsZSAod2l0aCBpbnNtb2QpIG9ubHQgdGhlIEkyQyBzd2l0Y2ggZGV2aWNlcyAoSTJDX1NXWF9JMkNfQUREUikgCisgICB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQsIGFuZCB0aGVyZWZvcmUgd2lsbCBiZSBwcm9iZWQuCisgICBQcm9iaW5nIGFsbCBvdGhlciBkZXZpY2VzIGNhbiBiZSBkb25lIGFmdGVyIGluZXJ0aW5nIHRoZSBtb2R1bGUgdmlhIHN5c2ZzLgorICAgZm9yIGV4YW1wbGUsIGluIG9yZGVyIHRvIHByb2JlIEZQR0EgZGV2aWNlLCB0aGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGFwcGxpZWQ6CisgICAtLSBlY2hvIG1hcGxlX2kyYyBGUEdBX0kyQ19BRERSID4gL3N5cy9idXMvaTJjL2RldmljZXMvaTJjLTAvbmV3X2RldmljZSAtLQorKi8gCitlbnVtIGNsaWVudF9udW0KK3sKKyAgICBTTEFWRV9TV0lUQ0hfNzAgICAgPSAwLAorICAgIFNMQVZFX1NXSVRDSF83MSAgICA9IDEsCisgICAgU0xBVkVfU1dJVENIXzcyICAgID0gMiwKKyAgICBTTEFWRV9TV0lUQ0hfNzMgICAgPSAzLAorICAgIFNMQVZFX1NXSVRDSF83NCAgICA9IDQsCisgICAgU0xBVkVfU0ZQXzUwICAgICAgID0gNSwKKyAgICBTTEFWRV9TRlBfNTEgICAgICAgPSA2LAorICAgIFNMQVZFX0ZQR0FfNDAgICAgICA9IDcsCisgICAgU0xBVkVfUE9OX0RQTExfNjggID0gOCwKKyAgICBTTEFWRV9QTV9EUExMXzZBICAgPSA5LAorICAgIFNMQVZFX0NYUF9SXzU0ICAgICA9IDEwLAorICAgIFNMQVZFX1BDSUVfU1dfM0MgICA9IDExLAorICAgIFNMQVZFX05VTV9PRl9TTEFWRVMKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfd3JpdGUKKworICAgREVTQ1JJUFRJT046CisgICAgICAgV3JpdGVzIHNlcmlhbGx5IGRhdGEgdG8gSTJDIGRldmljZQorCisgICBQQVJBTUVURVJTOgorICAgICAgIGNsaWVudCBudW0gLSBUaGUgY2xpZW50IHRvIHdyaXRlIHRvLgorICAgICAgIGJ1ZiAgICAgICAgLSBUaGUgYnVmZmVyIHRvIHdyaXRlLgorICAgICAgIGNvdW50ICAgICAgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKworICAgT1VUUFVUOgorICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHdyaXR0ZW4sIHdoZW4gZmFpbHMgcmV0dXJuIG5lZ2F0aXZlIG51bWJlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzc2l6ZV90IG1hcGxlX2kyY193cml0ZSh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfcmVhZAorCisgICBERVNDUklQVElPTjoKKyAgICAgICBSZWFkIHNlcmlhbGx5IGRhdGEgZnJvbSBJMkMgZGV2aWNlCisKKyAgIFBBUkFNRVRFUlM6CisgICAgICAgY2xpZW50IG51bSAtIFRoZSBjbGllbnQgdG8gd3JpdGUgdG8uCisgICAgICAgYnVmICAgICAgICAtIFRoZSBidWZmZXIgdG8gcmVhZCB0by4KKyAgICAgICBjb3VudCAgICAgIC0gTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKworICAgT1VUUFVUOgorICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHJlYWQsIHdoZW4gZmFpbHMgcmV0dXJuIG5lZ2F0aXZlIG51bWJlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzc2l6ZV90IG1hcGxlX2kyY19yZWFkKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIG1hcGxlX2kyY193cml0ZV9ieXRlCisKKyAgIERFU0NSSVBUSU9OOgorICAgICAgIFdyaXRlIGJ5dGUgdG8gSTJDIGRldmljZQorCisgICBQQVJBTUVURVJTOgorICAgICAgIGNsaWVudCBudW0gLSBUaGUgY2xpZW50IHRvIHdyaXRlIHRvLgorICAgICAgIG9mZnNldCAgICAgLSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRvLgorICAgICAgIHZhbCAgICAgICAgLSBUaGEgZGF0YSB0byB3cml0ZS4KKworICAgT1VUUFVUOgorICAgICAgIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1hcGxlX2kyY193cml0ZV9ieXRlKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgdmFsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfcmVhZF9ieXRlCisKKyAgIERFU0NSSVBUSU9OOgorICAgICAgIFJlYWQgYnl0ZSBmcm9tIEkyQyBkZXZpY2UKKworICAgUEFSQU1FVEVSUzoKKyAgICAgICBjbGllbnQgbnVtIC0gVGhlIGNsaWVudCB0byByZWFkIGZyb20uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gcmVhZCBmcm9tLgorICAgICAgIGRhdGEgICAgICAgLSB0aGUgcmVhZCB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlci4KKyAgIE9VVFBVVDoKKyAgICAgICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYXBsZV9pMmNfcmVhZF9ieXRlKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIGNoYXIqIGRhdGEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIG1hcGxlX2kyY193cml0ZV93b3JkCisKKyAgIERFU0NSSVBUSU9OOgorICAgICAgIFdyaXRlIDE2IGJpdCB3b3JkIHRvIEkyQyBkZXZpY2UKKworICAgUEFSQU1FVEVSUzoKKyAgICAgICBjbGllbnQgbnVtIC0gVGhlIGNsaWVudCB0byB3cml0ZSB0by4KKyAgICAgICBvZmZzZXQgICAgIC0gVGhlIG9mZnNldCB0byB3cml0ZSB0by4KKyAgICAgICB2YWwgICAgICAgIC0gVGhhIGRhdGEgdG8gd3JpdGUuCisKKyAgIE9VVFBVVDoKKyAgICAgICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYXBsZV9pMmNfd3JpdGVfd29yZCh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LCB1bnNpZ25lZCBzaG9ydCB2YWwpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIG1hcGxlX2kyY19yZWFkX3dvcmQKKworICAgREVTQ1JJUFRJT046CisgICAgICAgUmVhZCAxNiBiaXQgd29yZCBmcm9tIEkyQyBkZXZpY2UKKworICAgUEFSQU1FVEVSUzoKKyAgICAgICBjbGllbnQgbnVtIC0gVGhlIGNsaWVudCB0byByZWFkIGZyb20uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gcmVhZCBmcm9tLgorICAgICAgIGRhdGEgICAgICAgLSB0aGUgcmVhZCB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlci4KKyAgIE9VVFBVVDoKKyAgICAgICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYXBsZV9pMmNfcmVhZF93b3JkKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIHNob3J0KiBkYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfd3JpdGVfcmVnCisKKyAgIERFU0NSSVBUSU9OOgorICAgICAgIFdyaXRlIDMyIGJpdCByZWdpc3RlciB0byBJMkMgZGV2aWNlCisKKyAgIFBBUkFNRVRFUlM6CisgICAgICAgY2xpZW50IG51bSAtIFRoZSBjbGllbnQgdG8gd3JpdGUgdG8uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gd3JpdGUgdG8uCisgICAgICAgdmFsICAgICAgICAtIFRoYSBkYXRhIHRvIHdyaXRlLgorCisgICBPVVRQVVQ6CisgICAgICAgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWFwbGVfaTJjX3dyaXRlX3JlZyh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LCBpbnQgdmFsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfcmVhZF9yZWcKKworICAgREVTQ1JJUFRJT046CisgICAgICAgUmVhZCAzMiBiaXQgd29yZCBmcm9tIEkyQyBkZXZpY2UKKworICAgUEFSQU1FVEVSUzoKKyAgICAgICBjbGllbnQgbnVtIC0gVGhlIGNsaWVudCB0byByZWFkIGZyb20uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gcmVhZCBmcm9tLgorICAgICAgIGRhdGEgICAgICAgLSB0aGUgcmVhZCB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlci4KKyAgIE9VVFBVVDoKKyAgICAgICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYXBsZV9pMmNfcmVhZF9yZWcodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1bnNpZ25lZCBjaGFyIG9mZnNldCwgdW5zaWduZWQgaW50KiBkYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfd3JpdGVfZnBnYQorCisgICBERVNDUklQVElPTjoKKyAgICAgICBXcml0ZSAzMiBiaXQgcmVnaXN0ZXIgdG8gSTJDIGZwZ2EgZGV2aWNlCisKKyAgIFBBUkFNRVRFUlM6CisgICAgICAgY2xpZW50IG51bSAtIFRoZSBjbGllbnQgdG8gd3JpdGUgdG8uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gd3JpdGUgdG8uCisgICAgICAgdmFsICAgICAgICAtIFRoYSBkYXRhIHRvIHdyaXRlLgorCisgICBPVVRQVVQ6CisgICAgICAgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWFwbGVfaTJjX3dyaXRlX2ZwZ2EodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfcmVhZF9mcGdhCisKKyAgIERFU0NSSVBUSU9OOgorICAgICAgIFJlYWQgMzIgYml0IHdvcmQgZnJvbSBJMkMgZnBnYSBkZXZpY2UKKworICAgUEFSQU1FVEVSUzoKKyAgICAgICBjbGllbnQgbnVtIC0gVGhlIGNsaWVudCB0byByZWFkIGZyb20uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gcmVhZCBmcm9tLgorICAgICAgIGRhdGEgICAgICAgLSB0aGUgcmVhZCB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlci4KKyAgIE9VVFBVVDoKKyAgICAgICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYXBsZV9pMmNfcmVhZF9mcGdhKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50KiBkYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfZ2V0X2NsaWVudAorCisgICBERVNDUklQVElPTjoKKyAgICAgICBHZXRzIGFuIEkyQyBjbGllbnQgbnVtYmVyIGZyb20gYW4gYWRkcmVzcworCisgICBQQVJBTUVURVJTOgorICAgICAgIGFkZHIgICAgICAgLSBUaGUgYWRkcmVzcyBvZiB0aGUgY2xpZW50LgorICAgT1VUUFVUOgorICAgICAgIFRoZSBjbGllbnQgbnVtYmVyIGZvciB0aGlzIGNsaWVudCwgb3IgU0xBVkVfTlVNX09GX1NMQVZFUyBvbiBmYWlsdXJlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlbnVtIGNsaWVudF9udW0gbWFwbGVfaTJjX2dldF9jbGllbnQodW5zaWduZWQgaW50IGFkZHIpOworCisjZW5kaWYgICAvKiBfTUFQTEVfSTJDX0RFVlNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaTJjL2JjbW9sdF9pMmNfZGV2c19hZGRyLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9iY21vbHRfaTJjX2RldnNfYWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTlhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9iY21vbHRfaTJjX2RldnNfYWRkci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9JMkNfREVWU19BRERSX0hfCisjZGVmaW5lIF9CQ01PTFRfSTJDX0RFVlNfQUREUl9IXworCitCQ01fSTJDX0RFVl9BRERSX1NUQVJUCitCQ01fSTJDX0RFVl9BRERSKEkyQ19TVzBfSTJDX0FERFIsICJzdzAiLCAweDcwKQorQkNNX0kyQ19ERVZfQUREUihJMkNfU1cxX0kyQ19BRERSLCAic3cxIiwgMHg3MSkKK0JDTV9JMkNfREVWX0FERFIoSTJDX1NXMl9JMkNfQUREUiwgInN3MiIsIDB4NzIpCitCQ01fSTJDX0RFVl9BRERSKEkyQ19TVzNfSTJDX0FERFIsICJzdzMiLCAweDczKQorQkNNX0kyQ19ERVZfQUREUihJMkNfU1c0X0kyQ19BRERSLCAic3c0IiwgMHg3NCkKK0JDTV9JMkNfREVWX0FERFIoU0ZQX0kyQ19BRERSMSwgInNmcDEiLCAweDUwKQorQkNNX0kyQ19ERVZfQUREUihTRlBfSTJDX0FERFIyLCAic2ZwMiIsIDB4NTEpCitCQ01fSTJDX0RFVl9BRERSKEZQR0FfSTJDX0FERFIsICJmcGdhIiwgMHg0MCkKK0JDTV9JMkNfREVWX0FERFIoUE9OX0RQTExfSTJDX0FERFIsICJwb25fZHBsbCIsIDB4NjgpCitCQ01fSTJDX0RFVl9BRERSKFBNX0RQTExfSTJDX0FERFIsICJwbV9kcGxsIiwgMHg2YSkKK0JDTV9JMkNfREVWX0FERFIoQ1hQX1RfSTJDX0FERFIsICJjeHBfdCIsIDB4NTApCitCQ01fSTJDX0RFVl9BRERSKENYUF9SX0kyQ19BRERSLCAiY3hwX3IiLCAweDU0KQorQkNNX0kyQ19ERVZfQUREUihQQ0lFX1NXX0kyQ19BRERSLCAicGNpZV9zdyIsIDB4M2MpCitCQ01fSTJDX0RFVl9BRERSX0VORAorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9pMmMvYmNtb2x0X2kyY19kZXZzX2lvY3RsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9iY21vbHRfaTJjX2RldnNfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTVmNzFhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9pMmMvYmNtb2x0X2kyY19kZXZzX2lvY3RsLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfQkNNT0xUX0kyQ19ERVZTX0lPQ1RMX0hfCisjZGVmaW5lIF9CQ01PTFRfSTJDX0RFVlNfSU9DVExfSF8KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgY291bnQ7CisgICAgdWludDMyX3QgYWRkcjsKKyAgICB1aW50MzJfdCB2YWw7Cit9IG1hcGxlX2kyY19pb2N0bF9wYXJhbTsKKworI2RlZmluZSBNQVBMRV9JMkNfSU9DVExfTUFHSUMgJ0knCisKKyNkZWZpbmUgTUFQTEVfSTJDX0lPQ1RMX09QX0RFVl9DSEFOR0UgX0lPVyhNQVBMRV9JMkNfSU9DVExfTUFHSUMsIDEsIG1hcGxlX2kyY19pb2N0bF9wYXJhbSkKKyNkZWZpbmUgTUFQTEVfSTJDX0lPQ1RMX09QX0RFVl9XUklURSBfSU9XKE1BUExFX0kyQ19JT0NUTF9NQUdJQywgMiwgbWFwbGVfaTJjX2lvY3RsX3BhcmFtKQorI2RlZmluZSBNQVBMRV9JMkNfSU9DVExfT1BfREVWX1JFQUQgX0lPV1IoTUFQTEVfSTJDX0lPQ1RMX01BR0lDLCAzLCBtYXBsZV9pMmNfaW9jdGxfcGFyYW0pCisjZGVmaW5lIE1BUExFX0kyQ19JT0NUTF9PUF9TV0lUQ0hfV1JJVEUgX0lPVyhNQVBMRV9JMkNfSU9DVExfTUFHSUMsIDQsIG1hcGxlX2kyY19pb2N0bF9wYXJhbSkKKyNkZWZpbmUgTUFQTEVfSTJDX0lPQ1RMX09QX1NXSVRDSF9SRUFEIF9JT1IoTUFQTEVfSTJDX0lPQ1RMX01BR0lDLCA1LCBtYXBsZV9pMmNfaW9jdGxfcGFyYW0pCisjZGVmaW5lIE1BUExFX0kyQ19JT0NUTF9PUF9GUEdBX1dSSVRFIF9JT1coTUFQTEVfSTJDX0lPQ1RMX01BR0lDLCA2LCBtYXBsZV9pMmNfaW9jdGxfcGFyYW0pCisjZGVmaW5lIE1BUExFX0kyQ19JT0NUTF9PUF9GUEdBX1JFQUQgX0lPV1IoTUFQTEVfSTJDX0lPQ1RMX01BR0lDLCA3LCBtYXBsZV9pMmNfaW9jdGxfcGFyYW0pCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI3YWE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZS9NYWtlZmlsZQpAQCAtMCwwICsxLDM2IEBACitNT0RfTkFNRSA9IGxsX3BjaWUKK01PRF9TVVBQUkVTU19PU19ERVAgPSB5CitNT0RfREVQUyA9IGJvYXJkX3NlbGVjdG9yCisKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorCUVYVFJBX0NGTEFHUyArPSAtSSQoU1JDX0RJUikgLUkkKFRPUF9ESVIpL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbiAKKwlFWFRSQV9DRkxBR1MgKz0gLUkkKFRPUF9ESVIpL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9saW51eCAtSSQoVE9QX0RJUikvaG9zdF9kcml2ZXIvY29uZmlnCitlbHNlCisJRVhUUkFfQ0ZMQUdTICs9IC1JJChTUkNfRElSKSAtSSQoVE9QX0RJUikvY29tbW9uL29zX2Fic3RyYWN0aW9uIC1JJChUT1BfRElSKS9ob3N0L2NvbmZpZworCUVYVFJBX0NGTEFHUyArPSAtSSQoVE9QX0RJUikvY29tbW9uL29zX2Fic3RyYWN0aW9uL2xpbnV4IC1JJChUT1BfRElSKS9ob3N0L29zX2Fic3RyYWN0aW9uLyQoUExBVEZPUk0pCitlbmRpZgorCitpZmVxICgiJChFTkFCTEVfVFJBQ0UpIiwgInkiKQorCU1PRF9ERUZTICs9IC1EVFhfRU5BQkxFX0VWRU5UX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1JJChUT1BfRElSKS9jb21tb24vZHJpdmVycy9tYXBsZS9mbGQKKyAgICBpZmVxICgiJChERUJVR19UUkFDRV9JTklUKSIsICJ5IikKKyAgICAgICBNT0RfREVGUyArPSAtRERFQlVHX1RSQUNFX0lOSVQKKyAgICBlbmRpZgorZW5kaWYKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisgICAgTU9EX1RZUEUgPSBsaW51eF9tb2R1bGUKKyAgICBzcmNzID0gYmNtb2x0X2xscGNpZS5jIAorZWxzZQorICAgIE1PRF9UWVBFID0gbGliCitlbmRpZgorCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKKworVVNFX0xJTlQgPSB5ZXMKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvYmNtb2x0X2xscGNpZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL2JjbW9sdF9sbHBjaWUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YmIxNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL2JjbW9sdF9sbHBjaWUuYwpAQCAtMCwwICsxLDEwMTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgICAgbWlnaHQgdXNlIHJlYWRsIG9yIGlvcmVhZDMyCisqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX3JlZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgImJjbV9mbGRfY29tbW9uLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxiY21vbHRfYm9hcmRfc2VsZWN0b3IuaD4KKyNpbmNsdWRlICJiY21vbHRfbGxwY2llLmgiCisKKyNkZWZpbmUgRFJWX05BTUUJIm1hcGxlIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wLjMiCisKKyNkZWZpbmUgQkFSX1JFR1MgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJBUl9ERFIgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCQVJfU1JBTSAgICAgICAgICAgICAgICAgICAgICAgIDQKKy8qCitiYXIgMSA9IDggIE1ieXRlIHJlZ2lzdGVyIHNwYWNlCitiYXIgMiA9IDE2IE1ieXRlIEREUiBzcGFjZQorYmFyIDMgPSA2NCBLYnl0ZSBTUkFNIHNwYWNlCisqLworI2RlZmluZSBNQVBMRV9SRUdTX0xFTkdUSCAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIE1BUExFX0REUl9MRU5HVEggICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgTUFQTEVfU1JBTV9MRU5HVEggICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorCisjaWZkZWYgVFhfRU5BQkxFX0VWRU5UX1RSQUNFCisjZGVmaW5lIFBDSUVfUENJRV8wX01JU0NfQ1BVXzJfUENJRV9NRU1fV0lOMV9MTwkJCTB4MDY0MDE0VQorI2RlZmluZSBQQ0lFX1BDSUVfMF9NSVNDX0NQVV8yX1BDSUVfTUVNX1dJTjFfSEkJCQkweDA2NDAxOFUKKyNkZWZpbmUgUENJRV9QQ0lFXzBfTUlTQ19DUFVfMl9QQ0lFX01FTV9XSU4xX0JBU0VfTElNSVQJMHgwNjQwNzRVCisjZW5kaWYKKyNkZWZpbmUgUENJRV9SRVZJU0lPTl9SRUdJU1RFUl9PRkZTRVQgICAgICAgMHg2NDA2Q1UgLyogUENJRV9QQ0lFX1BDSUVfMF9QQ0lFX1BDSUVfMF9NSVNDX1JFVklTSU9OICAgICovCisjZGVmaW5lIFBDSUVfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCAgICAgICAgIDB4NjQwNjhVIC8qIFBDSUVfUENJRV9QQ0lFXzBfUENJRV9QQ0lFXzBfTUlTQ19QQ0lFX1NUQVRVUyAqLworI2RlZmluZSBQQ0lFX0hBUkRfREVCVUdfUkVHSVNURVJfT0ZGU0VUICAgICAweDY0MjA0VSAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfSEFSRF9ERUJVRyAgKi8KKyNkZWZpbmUgUENJRV9JTlRfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCAgICAgMHg2OTQwMFUgLyogUENJRV9QQ0lFX1BDSUVfMF9DUFVfSU5UUjFfSU5UUl9TVEFUVVMgICAgICAgICovCisjZGVmaW5lIFBDSUVfSU5UX0NMRUFSX01BU0tfT0ZGU0VUICAgICAgICAgIDB4Njk0MENVIC8qIFBDSUVfUENJRV9QQ0lFXzBfQ1BVX0lOVFIxX0lOVFJfTUFTS19DTEVBUiAgICAqLworI2RlZmluZSBQQ0lFX0lOVFIxX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQgICAweDY5MzAwVSAvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUENJRV9NQVBMRV9WRU5ET1JfSUQgICAgICAgICAgICAgICAgMHgxNEU0IC8qIFBDSUVfQ0ZHX1RZUEUwX0VQX1NVQlNZU1RFTV9JRF9WRU5ET1JfSUQgICAgICAqLworI2RlZmluZSBQQ0lFX01BUExFX0RFVklDRV9JRCAgICAgICAgICAgICAgICAweDY4NjIKKyNkZWZpbmUgUENJRV9NQVBMRV82ODYzX1NLVV9ERVZJQ0VfSUQgICAgICAgMHg2ODYzCisjZGVmaW5lIFBDSUVfTUFQTEVfRVBPTl9ERVZJQ0VfSUQgICAgICAgICAgIDB4NTU1NAorCisjZGVmaW5lIE1BUExFX0RSSVZFUl9OQU1FICAgRFJWX05BTUUgIiBCQ002ODYyMCAoTWFwbGUpIFBDSSBkcml2ZXIgIiBEUlZfVkVSU0lPTgorCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJjbW9sdF9kaXIgPSBOVUxMOworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKG1hcGxlX3BjaV90YmwpID0KK3sgLyogdmVuZG9yX2lkLCAgICAgICAgICAgICAgICAgIGRldmljZV9pZCwgICAgICAgYW55LCAgICAgICBhbnkgKi8KKyAgICB7UENJX0RFVklDRShQQ0lFX01BUExFX1ZFTkRPUl9JRCwgUENJRV9NQVBMRV9ERVZJQ0VfSUQpfSwKKyAgICB7UENJX0RFVklDRShQQ0lFX01BUExFX1ZFTkRPUl9JRCwgUENJRV9NQVBMRV82ODYzX1NLVV9ERVZJQ0VfSUQpfSwKKyAgICB7UENJX0RFVklDRShQQ0lFX01BUExFX1ZFTkRPUl9JRCwgUENJRV9NQVBMRV9FUE9OX0RFVklDRV9JRCl9LAorICAgIHswfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgbWFwbGVfcGNpX3RibCk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtX2xsX2Rldl9pbmZvICBkZXZpY2U7CisgICAgc3BpbmxvY2tfdCAgICAgICBsb2NrOworICAgIGludCAgICAgICAgICAgICAgZXJyX3N0YXR1czsKKyAgICBpbnQgICAgICAgICAgICAgIHBoeWxpbms7CisgICAgaW50ICAgICAgICAgICAgICBwcmV2X2RhdGFsaW5rOworICAgIGludCAgICAgICAgICAgICAgZGF0YWxpbms7CisgICAgdWludDMyX3QgICAgICAgICBkZXZpY2VpZDsKKyAgICB1bnNpZ25lZCBpbnQgICAgKnRyYWNlYWRkcjsKKyAgICBzdHJ1Y3QgcGNpX2RldiAgKnBkZXY7CisgICAgaW50ICAgICAgICAgICAgICBlbmFibGVkOworfSBtYXBsZV9kZXZpY2VfaW5mbzsKKworc3RhdGljIGludCBjcnRfZGV2aWNlID0gMDsKK3N0YXRpYyBiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlIGNhbGxiYWNrOworc3RhdGljIGJjbW9zX2Jvb2wgaXNfaW5pdGlhbGl6ZWQgPSBCQ01PU19GQUxTRTsKKworc3RhdGljIG1hcGxlX2RldmljZV9pbmZvIGRldmljZXNbTUFQTEVfTUFYX0RFVklDRVNdOworLy9zdGF0aWMgaXJxcmV0dXJuX3QgbWFwbGVfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOworc3RhdGljIG1hcGxlX2RldmljZV9pbmZvICpnZXRfbWFwbGVfcGNpX2luZm8oaW50IGNydCk7CisKK3N0YXRpYyBpbnQgbWFwbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsY29uc3QgY2hhciAqYnVmZmVyLHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IG1hcGxlX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworCisvKiBNYXAgYnVzL2RldmljZSB0byBkZXZpY2VfaWQgKi8KK3N0YXRpYyBpbnQgX3BjaWVfYnVzX2RldmZ2X3RvX2RldmlkKGludCBidXMsIGludCBkZXZmbikKK3sKKyAgICBjb25zdCBidXNfZGV2Zm5fZGV2aWQgKm1hcDsKKyAgICBmb3IgKG1hcCA9IGJjbW9sdF9ib2FyZF9wY2lfbWFwX3RhYmxlX2dldCgpOyBtYXAgJiYgbWFwLT5idXMgPiAwOyBtYXArKykKKyAgICB7CisgICAgICAgIGlmIChtYXAtPmJ1cyA9PSBidXMgJiYgbWFwLT5kZXZmbiA9PSBkZXZmbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1hcC0+ZGV2aWNlOworICAgICAgICB9CisgICAgfQorICAgIC8qIE5vdCBmb3VuZCAtIHVzZSBpbmNyZW1lbnRhbCBtYXBwaW5nICovCisgICAgcmV0dXJuIGNydF9kZXZpY2U7Cit9CisKKy8qIHByb2NlZHVyZSB1c2VkIGJ5IE9TIHRvIGNvbm5lY3QgTWFwbGUgUENJIHRvIGFsbG9jYXRlZCBtZW1vcnkgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgbWFwbGVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworICAgIGludCByYzsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcmVhZHZhbDsKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm8gPSBOVUxMOworICAgIGludCBkZXZfaWQ7CisgICAgdTMyIHZhbDsKKworICAgIGlmICghcGRldikKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBkZXZfaW5mbygmcGRldi0+ZGV2LAorICAgICAgICAiQnVzID0gJWQgU2xvdCA9ICVkIFZlbmRvcjpkZXZpY2UgPSAweCUwNHg6MHglMDR4IHJldmlzaW9uID0gMHglMDJ4XG4iLAorICAgICAgICBwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4sCisgICAgICAgIHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLCBwZGV2LT5yZXZpc2lvbik7CisKKyAgICBpZiAoY3J0X2RldmljZSA9PSBNQVBMRV9NQVhfREVWSUNFUykKKyAgICB7CisgICAgICAgIHByaW50aygiIE1heGltdW0gTWFwbGUgZGV2aWNlcyBhbHJlYWR5IGRlZmluZWQgKCVkKVxuIiwgTUFQTEVfTUFYX0RFVklDRVMpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBkZXZfaWQgPSBfcGNpZV9idXNfZGV2ZnZfdG9fZGV2aWQocGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuKTsKKyAgICArK2NydF9kZXZpY2U7CisgICAgZGV2aWNlX2luZm8gPSAmZGV2aWNlc1tkZXZfaWRdOworICAgIG1lbXNldChkZXZpY2VfaW5mbywgMCwgc2l6ZW9mKG1hcGxlX2RldmljZV9pbmZvKSk7CisKKyAgICBzcGluX2xvY2tfaW5pdCgmZGV2aWNlX2luZm8tPmxvY2spOworICAgIGRldmljZV9pbmZvLT5kZXZpY2VpZCA9IGRldl9pZDsKKyAgICBkZXZpY2VfaW5mby0+cGRldiA9IHBkZXY7CisKKyAgICAvKiBFbmFibGUgbWFwbGUgZGV2aWNlIG9uIFBDSWUgYnVzIGFuZCBmaXh1cCBCQVJzLgorICAgICAqIFdpdGhvdXQgZml4dXAsIG1vZHVsZSB1bmxvYWQvcmVsb2FkIGNyYXNoZXMgd2l0aCBXUlggaG9zdAorICAgICAqIGJlY2F1c2UgUENJIGhvdHBsdWcgZG9lc24ndCB3b3JrIGFuZCBhZnRlciB1bmxvYWQvcmUtbG9hZAorICAgICAqIGxpbnV4IGJlbGlldmVzIHRoYXQgQkFScyBhcmUgYWxyZWFkeSBzZXQuCisgICAgICovCisgICAgcmMgPSBiY21fbGxfcGNpZV9kZXZfZW5hYmxlKGRldl9pZCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJFcnJvciBwY2lfZW5hYmxlX2RldmljZV9tZW0gPSAlZFxuIixyYyk7CisgICAgICAgIGdvdG8gZXJyX291dDsKKyAgICB9CisKKyAgICByYyA9IHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRldiwgcGNpX3NlbGVjdF9iYXJzKHBkZXYsIElPUkVTT1VSQ0VfTUVNKSwgRFJWX05BTUUpOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBlcnJfb3V0OworCisgICAgcGNpX3NldF9tYXN0ZXIocGRldik7CisgICAgcGNpX3NhdmVfc3RhdGUocGRldik7CisKKyAgICBkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgPSAodW5zaWduZWQgbG9uZylwY2lfaW9yZW1hcF9iYXIocGRldiwgQkFSX1JFR1MpOworICAgIGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX3NyYW1fYmFzZSA9ICh1bnNpZ25lZCBsb25nKXBjaV9pb3JlbWFwX2JhcihwZGV2LCBCQVJfU1JBTSk7CisgICAgZGV2aWNlX2luZm8tPmRldmljZS5zb2NfZGRyX2Jhc2UgPSAodW5zaWduZWQgbG9uZylwY2lfaW9yZW1hcF9iYXIocGRldiwgQkFSX0REUik7CisgICAgZGV2aWNlX2luZm8tPmRldmljZS5zb2NfZGRyX2xlbmd0aCA9ICh1aW50MzJfdClwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIEJBUl9ERFIpOworICAgIGRldmljZV9pbmZvLT5kZXZpY2UuaXJxID0gcGRldi0+aXJxOworICAgIHBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXZpY2VfaW5mbyk7CisKKyAgICAvL3JjID0gcmVxdWVzdF9pcnEoZGV2aWNlX2luZm8tPmRldmljZS5pcnEsIG1hcGxlX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsICJtYXBsZS1wY2llIiwgZGV2aWNlX2luZm8pOworICAgIGlmICghcmMgJiYgZGV2aWNlX2luZm8tPmRldmljZS5zb2Nfc3JhbV9iYXNlKQorICAgIHsKKyAgICAgICAgZGV2aWNlX2luZm8tPmRldmljZS5pcnFfY29ubmVjdGVkID0gMTsKKyAgICAgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1JFVklTSU9OX1JFR0lTVEVSX09GRlNFVCkpOworICAgICAgICBwcmludGsoIkNhcmQgJWQgdmVyc2lvbiBtYWpvcj0lMDJ4IG1pbm9yPSUwMnhcbiIsZGV2aWNlX2luZm8tPmRldmljZWlkLAorICAgICAgICAgICAgICAgKChyZWFkdmFsICYgMHgwMDAwZmYwMCkgPj4gOCksKHJlYWR2YWwgJiAweDAwMDAwMGZmKSk7CisgICAgICAgIHByaW50aygicmVnc19zdGFydCA9IDB4JWx4XG5kZHJfc3RhcnQgID0gMHglbHhcbnNyYW1fc3RhcnQgPSAweCVseFxuZGRyX2xlbmd0aCAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlLGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX2Rkcl9iYXNlLAorICAgICAgICAgICAgICAgICBkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19zcmFtX2Jhc2UsIChpbnQpZGV2aWNlX2luZm8tPmRldmljZS5zb2NfZGRyX2xlbmd0aCk7CisgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LFBDSV9CQVNFX0FERFJFU1NfMCwmdmFsKTsKKyAgICAgICAgcHJpbnRrKCJCQVIgUkVHUyA9IDB4JXhcbiIsKHVuc2lnbmVkIGludCl2YWwpOworICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldixQQ0lfQkFTRV9BRERSRVNTXzIsJnZhbCk7CisgICAgICAgIHByaW50aygiQkFSIEREUiA9IDB4JXhcbiIsKHVuc2lnbmVkIGludCl2YWwpOworICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldixQQ0lfQkFTRV9BRERSRVNTXzQsJnZhbCk7CisgICAgICAgIHByaW50aygiQkFSIFNSQU0gPSAweCV4XG4iLCh1bnNpZ25lZCBpbnQpdmFsKTsKKyAgICAgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQpKTsKKyAgICAgICAgZGV2aWNlX2luZm8tPmVycl9zdGF0dXMgPSByZWFkdmFsICYgMHgwMDAwMDAwZjsKKyAgICAgICAgZGV2aWNlX2luZm8tPnBoeWxpbmsgICAgPSAocmVhZHZhbCA+PiA0KSAmIDB4MTsKKyAgICAgICAgZGV2aWNlX2luZm8tPmRhdGFsaW5rICAgPSAocmVhZHZhbCA+PiA1KSAmIDB4MTsKKyAgICAgICAgZGV2aWNlX2luZm8tPnByZXZfZGF0YWxpbmsgID0gZGV2aWNlX2luZm8tPmRhdGFsaW5rOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGdvdG8gZXJyX291dDsKKworICAgIHJldHVybiByYzsKKworZXJyX291dDoKKyAgICBwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworICAgIG1lbXNldChkZXZpY2VfaW5mbywgMCwgc2l6ZW9mKCpkZXZpY2VfaW5mbykpOworICAgIC0tY3J0X2RldmljZTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IG1hcGxlX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisgICAgaW50IGk7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworICAgIGlmICghZGV2KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZGV2LT5kZXZpY2UuaXJxX2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICAgIC8vZnJlZV9pcnEoZGV2LT5kZXZpY2UuaXJxLCBkZXYpOworICAgICAgICBkZXYtPmRldmljZS5pcnFfY29ubmVjdGVkID0gMDsKKyAgICB9CisgICAgaWYgKGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNydF9kZXZpY2U7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRldmljZXNbaV0ucGRldiA9PSBwZGV2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKGksIEJDTV9MTF9QQ0lFX0xJTktfRE9XTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisgICAgcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworICAgIGRldi0+ZGV2aWNlLnNvY19zcmFtX2Jhc2UgPSAwOworICAgIGRldi0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgPSAwOworICAgIGRldi0+cGRldiA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtYXBsZV9wY2lfZHJpdmVyID0geworICAgIC5uYW1lICAgICAgID0gRFJWX05BTUUsCisgICAgLmlkX3RhYmxlICAgPSBtYXBsZV9wY2lfdGJsLAorICAgIC5wcm9iZSAgICAgID0gbWFwbGVfcGNpX3Byb2JlLAorICAgIC5yZW1vdmUgICAgID0gX19kZXZleGl0X3AobWFwbGVfcGNpX3JlbW92ZSksCit9OworCitzdGF0aWMgbWFwbGVfZGV2aWNlX2luZm8gKmdldF9tYXBsZV9wY2lfaW5mbyhpbnQgY3J0KQoreworICAgIHVuc2lnbmVkIGludCByZWFkdmFsPTA7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZTsKKworICAgIGlmIChjcnQgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZGV2aWNlID0gJmRldmljZXNbY3J0XTsKKyAgICBpZiAoZGV2aWNlLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSkKKyAgICB7CisgICAgICAgIGlmIChkZXZpY2UtPmVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWR2YWwgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2aWNlLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSArIFBDSUVfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCkpOworICAgICAgICAgICAgZGV2aWNlLT5lcnJfc3RhdHVzID0gcmVhZHZhbCAmIDB4MDAwMDAwMGY7CisgICAgICAgICAgICBkZXZpY2UtPnBoeWxpbmsgICAgPSAocmVhZHZhbCA+PiA0KSAmIDB4MTsKKyAgICAgICAgICAgIGRldmljZS0+ZGF0YWxpbmsgICA9IChyZWFkdmFsID4+IDUpICYgMHgxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGV2aWNlLT5lcnJfc3RhdHVzID0gMDsKKyAgICAgICAgICAgIGRldmljZS0+cGh5bGluayAgICA9IDA7CisgICAgICAgICAgICBkZXZpY2UtPmRhdGFsaW5rICAgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZGV2aWNlID0gTlVMTDsKKworICAgIHJldHVybiBkZXZpY2U7Cit9CisKKyNpZiAwCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFwbGVfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCit7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgaW50IHZhbHVlOworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbzsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBoYW5kbGVkID0gSVJRX05PTkU7CisgICAgdWludDMyX3QgZGV2aWNlOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9pbmZvLT5sb2NrLCBmbGFncyk7CisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9JTlRfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCkpOworICAgIGlmICh2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmIChkZXZpY2VfaW5mby0+ZGF0YWxpbmsgIT0gZGV2aWNlX2luZm8tPnByZXZfZGF0YWxpbmspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VfaW5mby0+ZGF0YWxpbmsgPT0gQkNNX0xMX1BDSUVfTElOS19VUCkKKyAgICAgICAgICAgICAgICBwcmludGsoIkRldmljZT0lZCA6IExpbmsgaXMgdXAgISEhXG4iLCBkZXZpY2UpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiRGV2aWNlPSVkIDogTGluayBpcyBkb3duICEhIVxuIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBwcmludGsoInBoeSBzdGF0dXMgPSAweCV4IGVycm9yIHN0YXR1cyA9IDB4JXhcbiIsIGRldmljZV9pbmZvLT5waHlsaW5rLCBkZXZpY2VfaW5mby0+ZXJyX3N0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2VfaW5mby0+cHJldl9kYXRhbGluayA9IGRldmljZV9pbmZvLT5kYXRhbGluazsKKyAgICAgICAgICAgIGlmIChjYWxsYmFjaykKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhkZXZpY2UsIGRldmljZV9pbmZvLT5kYXRhbGluayk7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9JTlRSMV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUKSk7CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICBoYW5kbGVkID0gSVJRX0hBTkRMRUQ7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9pbmZvLT5sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKyNlbmRpZgorCisvKiBSZXR1cm5zIEJBUiByZWdpc3RlciBhZGRyZXNzICovCitzdGF0aWMgaW50IF9wY2lfYmFyX3JlZ19hZGRyKGludCByZXMpCit7CisgICAgcmV0dXJuIDB4MTAgKyByZXMqNDsKK30KKworc3RhdGljIHZvaWQgX3BjaV91cGRhdGVfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlc25vKQoreworICAgICAgICBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gcmVnaW9uOworICAgICAgICB1MTYgY21kOworICAgICAgICB1MzIgbmV3LCBjaGVjaywgbWFzazsKKyAgICAgICAgaW50IHJlZzsKKyAgICAgICAgc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlICsgcmVzbm87CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWdub3JlIHJlc291cmNlcyBmb3IgdW5pbXBsZW1lbnRlZCBCQVJzIGFuZCB1bnVzZWQgcmVzb3VyY2Ugc2xvdHMKKyAgICAgICAgICogZm9yIDY0IGJpdCBCQVJzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFyZXMtPmZsYWdzKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZ25vcmUgbm9uLW1vdmVhYmxlIHJlc291cmNlcy4gIFRoaXMgbWlnaHQgYmUgbGVnYWN5IHJlc291cmNlcyBmb3IKKyAgICAgICAgICogd2hpY2ggbm8gZnVuY3Rpb25hbCBCQVIgcmVnaXN0ZXIgZXhpc3RzIG9yIGFub3RoZXIgaW1wb3J0YW50CisgICAgICAgICAqIHN5c3RlbSByZXNvdXJjZSB3ZSBzaG91bGRuJ3QgbW92ZSBhcm91bmQuCisgICAgICAgICAqLworICAgICAgICBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUENJX0ZJWEVEKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhkZXYsICZyZWdpb24sIHJlcyk7CisKKyAgICAgICAgbmV3ID0gcmVnaW9uLnN0YXJ0IHwgKHJlcy0+ZmxhZ3MgJiBQQ0lfUkVHSU9OX0ZMQUdfTUFTSyk7CisgICAgICAgIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKyAgICAgICAgICAgICAgICBtYXNrID0gKHUzMilQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtYXNrID0gKHUzMilQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCisgICAgICAgIHJlZyA9IF9wY2lfYmFyX3JlZ19hZGRyKHJlc25vKTsKKworICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcmVnLCBuZXcpOworICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCByZWcsICZjaGVjayk7CisKKyAgICAgICAgaWYgKChuZXcgXiBjaGVjaykgJiBtYXNrKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmZGV2LT5kZXYsICJCQVIgJWQ6IGVycm9yIHVwZGF0aW5nICglIzA4eCAhPSAlIzA4eClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXNubywgbmV3LCBjaGVjayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNXzY0KSB7CisgICAgICAgICAgICAgICAgbmV3ID0gcmVnaW9uLnN0YXJ0ID4+IDE2ID4+IDE2OworICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCByZWcgKyA0LCBuZXcpOworICAgICAgICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHJlZyArIDQsICZjaGVjayk7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrICE9IG5ldykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZGV2LT5kZXYsICJCQVIgJWQ6IGVycm9yIHVwZGF0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGhpZ2ggJSMwOHggIT0gJSMwOHgpXG4iLCByZXNubywgbmV3LCBjaGVjayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisgICAgICAgIHBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQgfCBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIpOworCisgICAgICAgIHJlcy0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfVU5TRVQ7CisgICAgICAgIGRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogc2V0IHRvICVwUiAoUENJIGFkZHJlc3MgWyUjbGx4LSUjbGx4XSlcbiIsCisgICAgICAgICAgICAgICAgcmVzbm8sIHJlcywgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uc3RhcnQsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uZW5kKTsKK30KKworLyogRW5hYmxlIFBDSSBhY2Nlc3MgdG8gZGV2aWNlICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9kZXZfZW5hYmxlKGludCBkZXZfaWQpCit7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZTsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoZGV2X2lkID49IE1BUExFX01BWF9ERVZJQ0VTKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgZGV2aWNlID0gJmRldmljZXNbZGV2X2lkXTsKKyAgICBpZiAoIWRldmljZS0+cGRldikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisKKyAgICByYyA9IHBjaV9lbmFibGVfZGV2aWNlX21lbShkZXZpY2UtPnBkZXYpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIHByaW50aygiRXJyb3IgcGNpX2VuYWJsZV9kZXZpY2VfbWVtIGZvciBkZXZpY2UgJWQgPSAlZFxuIiwgZGV2X2lkLCByYyk7XAorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKiBSZWZyZXNoIGRldmljZXMncyBQQ0llIGhlYWRlciAqLworICAgIF9wY2lfdXBkYXRlX3Jlc291cmNlKGRldmljZS0+cGRldiwgQkFSX1JFR1MpOworICAgIF9wY2lfdXBkYXRlX3Jlc291cmNlKGRldmljZS0+cGRldiwgQkFSX1NSQU0pOworICAgIF9wY2lfdXBkYXRlX3Jlc291cmNlKGRldmljZS0+cGRldiwgQkFSX0REUik7CisgICAgZGV2aWNlLT5lbmFibGVkID0gMTsKKworb3V0OgorICAgIHJldHVybiByYyA/IEJDTV9FUlJfSU8gOiBCQ01fRVJSX09LOworfQorCisvKiBEaXNhYmxlIFBDSSBhY2Nlc3MgdG8gZGV2aWNlICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9kZXZfZGlzYWJsZShpbnQgZGV2X2lkKQoreworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZpY2U7CisKKyAgICBwcmludGsoIiVzOiBkZXZpY2UgJWRcbiIsIF9fRlVOQ1RJT05fXywgZGV2X2lkKTsKKworICAgIGlmIChkZXZfaWQgPj0gTUFQTEVfTUFYX0RFVklDRVMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBkZXZpY2UgPSAmZGV2aWNlc1tkZXZfaWRdOworICAgIGlmICghZGV2aWNlLT5wZGV2IHx8ICFkZXZpY2UtPmVuYWJsZWQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIHBjaV9kaXNhYmxlX2RldmljZShkZXZpY2UtPnBkZXYpOworICAgIGRldmljZS0+ZW5hYmxlZCA9IDA7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfaW5pdCh2b2lkKQoreworICAgIGludCByYzsKKyAgICBpZiAoaXNfaW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIGlzX2luaXRpYWxpemVkID0gQkNNT1NfVFJVRTsKKyAgICByYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm1hcGxlX3BjaV9kcml2ZXIpOworICAgIHByaW50ayhLRVJOX0lORk8gIk1hcGxlIFBDSSBkcml2ZXIgcmVnaXN0ZXJlZCB3aXRoIFBDSSBzdWJzeXN0ZW0uIHJjPSVkXG4iLCByYyk7CisgICAgcmV0dXJuIHJjID8gQkNNX0VSUl9JTlRFUk5BTCA6IEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtX2xsX3BjaWVfY2xlYW51cCh2b2lkKQoreworICAgIGlmICghaXNfaW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBpc19pbml0aWFsaXplZCA9IEJDTU9TX0ZBTFNFOworCisgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtYXBsZV9wY2lfZHJpdmVyKTsKKyAgICBjcnRfZGV2aWNlID0gMDsKKyAgICBtZW1zZXQoZGV2aWNlcywgMCwgc2l6ZW9mKGRldmljZXMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBwcm9jZWR1cmVzIGV4ZWN1dGVkIG9uIGluc21vZCBhbmQgcm1tb2QgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfX2luaXQgYmNtX2xsX2luaXRfbW9kdWxlKHZvaWQpCit7CisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiY21vbHRfZmlsZSA9IE5VTEw7CisKKyAgICBpZiAoKGJjbW9sdF9kaXIgPSBjcmVhdGVfcHJvY19lbnRyeSgiYmNtb2x0IiwgU19JRkRJUiwgTlVMTCkpID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjcmVhdGUgL3Byb2MvYmNtb2x0IGVudHJ5XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKGJjbW9sdF9maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoImNhcmQiLCBTX0lGUkVHIHwgU19JV1VTUiB8IFNfSVJVR08sIGJjbW9sdF9kaXIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gY3JlYXRlIC9wcm9jL2JjbW9sdC9jYXJkIGVudHJ5XG4iKTsKKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoImJjbW9sdCIsIGJjbW9sdF9kaXIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGJjbW9sdF9maWxlLT53cml0ZV9wcm9jID0gKHdyaXRlX3Byb2NfdCAqKW1hcGxlX3dyaXRlOworICAgIGJjbW9sdF9maWxlLT5yZWFkX3Byb2MgPSAocmVhZF9wcm9jX3QgKiltYXBsZV9yZWFkOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiY21fbGxfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyAgICBiY21fbGxfcGNpZV9jbGVhbnVwKCk7CisgICAgcmVtb3ZlX3Byb2NfZW50cnkoImNhcmQiLCBiY21vbHRfZGlyKTsKKyAgICByZW1vdmVfcHJvY19lbnRyeSgiYmNtb2x0IiwgTlVMTCk7CisgICAgcHJpbnRrKCJVbnJlZ2lzdGVyIGRvbmVcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBUElzIHVzZWQgYnkgSG9zdCBkcml2ZXJzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlX3JlZ2lzdGVyKGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2UgY2IpCit7CisgICAgaW50IGk7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvOworCisgICAgY2FsbGJhY2sgPSBjYjsKKyAgICBpZihjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcnRfZGV2aWNlOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRldmljZV9pbmZvID0gZ2V0X21hcGxlX3BjaV9pbmZvKGkpOworICAgICAgICAgICAgaWYgKGRldmljZV9pbmZvKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrKGksIGRldmljZV9pbmZvLT5kYXRhbGluayk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2FsbGJhY2soaSwgQkNNX0xMX1BDSUVfTElOS19ET1dOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlX3VucmVnaXN0ZXIodm9pZCkKK3sKKyAgICBjYWxsYmFjayA9IE5VTEw7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfcXVlcnkodWludDhfdCBkZXZfaWQsIGJjbV9sbF9kZXZfaW5mbyAqaW5mbykKK3sKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm87CisKKyAgICBpZiAoIWluZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoZGV2X2lkIDwgTUFQTEVfTUFYX0RFVklDRVMpCisgICAgeworICAgICAgICBkZXZpY2VfaW5mbyA9IGdldF9tYXBsZV9wY2lfaW5mbyhkZXZfaWQpOworICAgICAgICBpZiAoZGV2aWNlX2luZm8gJiYgZGV2aWNlX2luZm8tPnBkZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VfaW5mby0+ZGF0YWxpbmsgPT0gQkNNX0xMX1BDSUVfTElOS19ET1dOKQorICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lPOworICAgICAgICAgICAgKmluZm8gPSBkZXZpY2VfaW5mby0+ZGV2aWNlOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworfQorCitiY21fbGxfcGNpZV9kZXYgYmNtX2xsX3BjaWVfZGV2X2dldCh1aW50OF90IGRldl9pZCkKK3sKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm87CisKKyAgICBpZiAoZGV2X2lkIDwgY3J0X2RldmljZSkKKyAgICB7CisgICAgICAgIGRldmljZV9pbmZvID0gZ2V0X21hcGxlX3BjaV9pbmZvKGRldl9pZCk7CisgICAgICAgIHJldHVybiAoZGV2aWNlX2luZm8gPyBkZXZpY2VfaW5mby0+cGRldiA6IE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9ob3N0X3Jlc2V0X2VuYWJsZSh1aW50OF90IGRldl9pZCwgYmNtb3NfYm9vbCBlbmFibGVkKQoreworICAgIHVpbnQzMl90IHZhbDsKKworICAgIHZhbCA9IGVuYWJsZWQgPyAwIDogMTsKKyAgICBiY21fcGNpX3dyaXRlMzIoKHVpbnQzMl90ICopKGRldmljZXNbZGV2X2lkXS5kZXZpY2Uuc29jX3JlZ3NfYmFzZSArIFBDSUVfSEFSRF9ERUJVR19SRUdJU1RFUl9PRkZTRVQpLCB2YWwpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3NldHJhY2UodWludDhfdCBkZXZfaWQpCit7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvOworICAgIHVpbnQzMl90IHZhbCxsaW0sYmFzZSxzaXplOworICAgIHVpbnQzMl90IHJlZ2xvLHJlZ2hpLGJhc2VsaW07CisgICAgdW5zaWduZWQgbG9uZyBhZGRyOworCisgICAgaWYgKGRldl9pZCA8IGNydF9kZXZpY2UpCisgICAgeworICAgICAgICBkZXZpY2VfaW5mbyA9ICZkZXZpY2VzW2Rldl9pZF07CisgICAgICAgIGlmICghZGV2aWNlX2luZm8pCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTzsKKyAgICAgICAgc2l6ZSA9IEVWRU5UX0JVRkZFUl9TSVpFOworICAgICAgICBkZXZpY2VfaW5mby0+dHJhY2VhZGRyID0gKHVuc2lnbmVkIGludCAqKWJjbW9zX2FsbG9jX25vdF9jYWNoZShzaXplKTsKKyAgICAgICAgbWVtc2V0KGRldmljZV9pbmZvLT50cmFjZWFkZHIsMCxzaXplKTsKKyAgICAgICAgYWRkciA9IGJjbW9zX3ZpcnRfdG9fcGh5cyhkZXZpY2VfaW5mby0+dHJhY2VhZGRyKTsgLyogfCAweDAyID0gcmV2ZXJzZSBieXRlIG9yZGVyID0gc3dhcCAqLworICAgICAgICBwcmludGsoInRyYWNlIHdpbmRvdyA6IGFsbG9jPTB4JWx4IHNpemU9MHgleFxuIiwodW5zaWduZWQgbG9uZylkZXZpY2VfaW5mby0+dHJhY2VhZGRyLCAodW5zaWduZWQgaW50KXNpemUpOworICAgICAgICByZWdsbyA9IFBDSUVfUENJRV8wX01JU0NfQ1BVXzJfUENJRV9NRU1fV0lOMV9MTzsKKyAgICAgICAgcmVnaGkgPSBQQ0lFX1BDSUVfMF9NSVNDX0NQVV8yX1BDSUVfTUVNX1dJTjFfSEk7CisgICAgICAgIGJhc2VsaW0gPSBQQ0lFX1BDSUVfMF9NSVNDX0NQVV8yX1BDSUVfTUVNX1dJTjFfQkFTRV9MSU1JVDsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyByZWdsbyksYWRkciAmIDB4ZmZmZmZmZmYpOworICAgICAgICBiY21fcGNpX3dyaXRlMzIoKHVpbnQzMl90ICopKGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSArIHJlZ2hpKSksKChhZGRyID4+IDMyKSAmIDB4ZmZmZmZmZmYpOworICAgICAgICAvKiBiYXNlICovCisgICAgICAgIGJhc2UgPSBDUFVfMl9QQ0lFX01FTV9XSU4xX0JBU0U7CisgICAgICAgIC8qIGxpbWl0ICovCisgICAgICAgIGxpbSA9IGJhc2UgKyBzaXplOworICAgICAgICB2YWwgPSBsaW0gIHwgKGJhc2UgPj4gMTYpOworICAgICAgICBiY21fcGNpX3dyaXRlMzIoKHVpbnQzMl90ICopKGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSArIGJhc2VsaW0pLHZhbCk7CisgICAgICAgIC8vYmNtX2ZsZF9zZXRfZXZlbnRfdHJhY2UoZGV2X2lkKTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19zcmFtX2Jhc2UgKyBCQ01fRkxEX0VWRU5UX1RSQUNFX09GRlNFVCksMHgxKTsKKworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7Cit9CitiY21vc19lcnJubyBiY21fbGxfcGNpZV9jbGVhcnRyYWNlKHVpbnQ4X3QgZGV2X2lkKQoreworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbzsKKworICAgIGlmIChkZXZfaWQgPCBjcnRfZGV2aWNlKQorICAgIHsKKyAgICAgICAgZGV2aWNlX2luZm8gPSAmZGV2aWNlc1tkZXZfaWRdOworICAgICAgICBpZiAoIWRldmljZV9pbmZvKQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisgICAgICAgIC8vYmNtX2ZsZF9jbGVhcl9ldmVudF90cmFjZShkZXZfaWQpOworICAgICAgICBiY21fcGNpX3dyaXRlMzIoKHVpbnQzMl90ICopKGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX3NyYW1fYmFzZSArIEJDTV9GTERfRVZFTlRfVFJBQ0VfT0ZGU0VUKSwweDApOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7Cit9CitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zYXZldHJhY2UodWludDhfdCBkZXZfaWQsIGNoYXIgKnRyYWNlZmlsZW5hbWUpCit7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvOworICAgIHN0cnVjdCBmaWxlICAgICAgICAgKmZwOworICAgIHVuc2lnbmVkIGxvbmcgc2VnICAgPSAwOworICAgIG1tX3NlZ21lbnRfdCBtZW1zZWc7CisKKyAgICBpZiAoIXRyYWNlZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBwcmludGsoImRldmljZT0lZCBmcm9tPSVkLCBHbyB0byB3cml0ZSB0byBmaWxlICVzXG4iLGRldl9pZCAsIGNydF9kZXZpY2UsIHRyYWNlZmlsZW5hbWUpOworCisgICAgaWYgKGRldl9pZCA8IGNydF9kZXZpY2UpCisgICAgeworICAgICAgICBkZXZpY2VfaW5mbyA9ICZkZXZpY2VzW2Rldl9pZF07CisgICAgICAgIGlmICghZGV2aWNlX2luZm8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRXJyb3I6IGRldmljZV9pbmZvIGlzIG51bGxcbiIpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIGZwID0gZmlscF9vcGVuKHRyYWNlZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCwgMDY2Nik7CisgICAgICAgIGlmICgoZnAgPT0gTlVMTCkgfHwgKGZwID09ICh2b2lkICopLUVOT0VOVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRXJyb3I6IENhbid0IG9wZW4gZmlsZSAlc1xuIix0cmFjZWZpbGVuYW1lKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICAvLyBHZXQgY3VycmVudCBzZWdtZW50IGRlc2NyaXB0b3IKKyAgICAgICAgc2VnID0gZ2V0X2ZzKCkuc2VnOworCisgICAgICAgIC8vIFNldCBzZWdtZW50IGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB0byBrZXJuZWwgc3BhY2UKKyAgICAgICAgc2V0X2ZzKGdldF9kcygpKTsKKyAgICAgICAgZnAtPmZfb3AtPndyaXRlKGZwLCAoY2hhciAqKWRldmljZV9pbmZvLT50cmFjZWFkZHIsRVZFTlRfQlVGRkVSX1NJWkUsICZmcC0+Zl9wb3MpOworCisgICAgICAgIG1lbXNlZy5zZWcgPSBzZWc7CisgICAgICAgIHNldF9mcyhtZW1zZWcpOworICAgICAgICBmaWxwX2Nsb3NlKGZwLCBOVUxMKTsKKyAgICAgICAgcHJpbnRrKCJXcm90ZSBmaWxlICVzXG4iLHRyYWNlZmlsZW5hbWUpOworZXhpdDoKKyAgICAgICAgYmNtb3NfZnJlZV9ub3RfY2FjaGUoZGV2aWNlX2luZm8tPnRyYWNlYWRkcik7CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVXNlciBpbnRlcmZhY2UgZnVuY3Rpb25zIDogaW1wbGVtZW50IGVjaG8vY2F0IHRvIHByb2MgZmlsZSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyICpuYW1lOworCXZvaWQgKCpjYWxsYmFjaykoaW50IGNtZGlkLCBjaGFyICpjbWQpOworICAgIGNoYXIgKmRlc2NyaXB0aW9uOworfSBtYXBsZV9jYXJkX2NvbW1hbmQ7CisKK3N0YXRpYyBjaGFyICpmaW5kX2NvbW1hbmQoY2hhciAqY21kKTsKK3N0YXRpYyB2b2lkIGNvbW1hbmRfcmVnKGludCBjbWRpZCwgY2hhciAqbGluZSk7CitzdGF0aWMgdm9pZCBjb21tYW5kX21lbShpbnQgY21kaWQsIGNoYXIgKmxpbmUpOworc3RhdGljIHZvaWQgY29tbWFuZF9jZmcoaW50IGNtZGlkLCBjaGFyICpsaW5lKTsKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKK3N0YXRpYyB2b2lkIGNvbW1hbmRfdHJhY2UoaW50IGNtZGlkLCBjaGFyICpsaW5lKTsKKyNlbmRpZgorCisjZGVmaW5lIFJFQURDTUQgICAgIDAKKyNkZWZpbmUgV1JJVEVDTUQgICAgMQorCitzdGF0aWMgbWFwbGVfY2FyZF9jb21tYW5kIGNvbW1hbmRzW10gPQoreworICAgIHsicmVhZHJlZyIsICAgICBjb21tYW5kX3JlZywgInJlYWQgcmVnaXN0ZXIgPGluZGV4PiA8cmVnaXN0ZXIgb2Zmc2V0IC0gaGV4PiJ9LAorICAgIHsid3JpdGVyZWciLCAgICBjb21tYW5kX3JlZywgIndyaXRlIHJlZ2lzdGVyIDxpbmRleD4gPHJlZ2lzdGVyIG9mZnNldCAtIGhleD4gPHZhbHVlIC0gaGV4PiJ9LAorICAgIHsicmVhZCIsICAgICAgICBjb21tYW5kX21lbSwgInJlYWQgPGFkZHJlc3MgLSBoZXg+IDxudW1iZXIgb2Ygd29yZHMgLSBkZWM+In0sCisgICAgeyJ3cml0ZSIsICAgICAgIGNvbW1hbmRfbWVtLCAid3JpdGUgPGFkZHJlc3MgLSBoZXg+IDx2YWx1ZSAtIGhleD4ifSwKKyAgICB7InJjZmciLCAgICAgICAgY29tbWFuZF9jZmcsICJyZWFkIGRldiA8YWRkcmVzcyAtIGhleD4gPG51bWJlciBvZiB3b3JkcyAtIGRlYz4ifSwKKyAgICB7IndjZmciLCAgICAgICAgY29tbWFuZF9jZmcsICJ3cml0ZSBkZXYgPGFkZHJlc3MgLSBoZXg+IDx2YWx1ZSAtIGhleD4ifSwKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKyAgICB7InRyYWNlIiwgICAgICAgY29tbWFuZF90cmFjZSwgInRyYWNlIDxpbmRleD4gb24vb2ZmL3NhdmUgdHggdHJhY2UifSwKKyNlbmRpZgorICAgIHtOVUxMLCBOVUxMLCBOVUxMfQorfTsKKworc3RhdGljIGNoYXIgKmZpbmRfY29tbWFuZChjaGFyICpjbWQpCit7CisgICAgY2hhciAqcmVzdDsKKyAgICBpbnQgaSA9IDA7CisgICAgbWFwbGVfY2FyZF9jb21tYW5kICpjbWRwdHIgPSAmY29tbWFuZHNbMF07CisKKyAgICBjbWQgPSBza2lwX3NwYWNlcyhjbWQpOworICAgIGlmICghc3RybmNtcChjbWQsImhlbHAiLHN0cmxlbigiaGVscCIpKSkKKyAgICB7CisgICAgICAgIHdoaWxlIChjbWRwdHItPm5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiJXNcdDogJXNcbiIsY21kcHRyLT5uYW1lLCBjbWRwdHItPmRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIGNtZHB0ciA9ICZjb21tYW5kc1srK2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3aGlsZSAoY21kcHRyLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKCFzdHJuY21wKGNtZHB0ci0+bmFtZSwgY21kLCBzdHJsZW4oY21kcHRyLT5uYW1lKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3QgPSBjbWQgKyBzdHJsZW4oY21kcHRyLT5uYW1lKTsKKyAgICAgICAgICAgIHJlc3QgPSBza2lwX3NwYWNlcyhyZXN0KTsKKyAgICAgICAgICAgIGNtZHB0ci0+Y2FsbGJhY2soaSUyLCByZXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGNtZHB0ciA9ICZjb21tYW5kc1srK2ldOworICAgIH0KKworICAgIHJldHVybiAiV3JvbmcgY29tbWFuZCBuYW1lIjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIGFuc3dlcnMgdG8gY2F0IC9wcm9jL2JjbW9sdCBjb21tYW5kCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtYXBsZV9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworICAgIGludCBpOworICAgIGludCBsZW47CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldiA9IE5VTEw7CisKKyAgICBsZW4gPSBzcHJpbnRmKHBhZ2UsICJNYXBsZSBEZXZpY2UgSW5mb1xuXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFQTEVfTUFYX0RFVklDRVM7IGkrKykKKyAgICB7CisgICAgICAgIGRldiA9IGdldF9tYXBsZV9wY2lfaW5mbyhpKTsKKyAgICAgICAgaWYgKGRldikKKyAgICAgICAgeworICAgICAgICAgICAgbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgImlkPSVkIHJlZ3Nfc3RhcnQ9MHglbHggZGRyX3N0YXJ0PTB4JWx4IHNyYW1fc3RhcnQ9MHglbHggZGRyX2xlbmd0aD0lZFxuIiwKKyAgICAgICAgICAgICAgICBkZXYtPmRldmljZWlkLAorICAgICAgICAgICAgICAgIGRldi0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UsZGV2LT5kZXZpY2Uuc29jX2Rkcl9iYXNlLAorICAgICAgICAgICAgICAgIGRldi0+ZGV2aWNlLnNvY19zcmFtX2Jhc2UsIChpbnQpZGV2LT5kZXZpY2Uuc29jX2Rkcl9sZW5ndGgpOworICAgICAgICAgICAgbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIlBoeSBMaW5rIGlzICVzIERhdGEgTGluayBpcyAlcyBFcnJvciBzdGF0dXMgPSAlZFxuXG4iLAorICAgICAgICAgICAgICAgIGRldi0+cGh5bGluayA9PSAxID8gIlVQIiA6ICJET1dOIiwgZGV2LT5kYXRhbGluayA9PSAxID8gIlVQIiA6ICJET1dOIiwgKGludClkZXYtPmVycl9zdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGxlbjsKK30KKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKK3N0YXRpYyB2b2lkIGNvbW1hbmRfdHJhY2UoaW50IGNtZGlkLCBjaGFyICpsaW5lKQoreworICAgIGNoYXIgdG9rZW5bNV07CisgICAgaW50ICBpbmRleDsKKworICAgIGlmIChzc2NhbmYobGluZSwgIiVkICVzIiwgJmluZGV4LCB0b2tlbikgIT0gMikKKyAgICB7CisgICAgICAgIHByaW50aygiV3JvbmcgcGFyYW1ldGVyXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwcmludGsoIlRSQUNFIGNvbW1hbmRzIDogJXNcbiIsdG9rZW4pOworICAgIGlmICghc3RybmNtcCh0b2tlbiwib24iLDIpKQorICAgIHsKKyAgICAgICAgLy9vbgorICAgICAgICBiY21fbGxfcGNpZV9zZXRyYWNlKGluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXN0cm5jbXAodG9rZW4sIm9mZiIsMykpCisgICAgeworICAgICAgICAvLyBvZmYKKyAgICAgICAgYmNtX2xsX3BjaWVfY2xlYXJ0cmFjZShpbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFzdHJuY21wKHRva2VuLCJzYXZlIiw0KSkKKyAgICB7CisgICAgICAgIC8vZ2V0CisgICAgICAgIGNoYXIgZmlsZW5hbWVbMjBdOworICAgICAgICBzcHJpbnRmKGZpbGVuYW1lLCIuL3R0X3RyYWNlXyVkLnRyeCIsaW5kZXgpOworICAgICAgICBiY21fbGxfcGNpZV9zYXZldHJhY2UoaW5kZXgsZmlsZW5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHByaW50aygiV3JvbmcgY29tbWFuZFxuIik7Cit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBjb21tYW5kX3JlZyhpbnQgY21kaW5kZXgsIGNoYXIgKmxpbmUpCit7CisgICAgY2hhciAqcmVzdDsKKyAgICBjaGFyICp0b2tlbjsKKyAgICBpbnQgIGluZGV4OworICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKyAgICB1bnNpZ25lZCBpbnQgcmVnOworCisgICAgaWYgKHNzY2FuZihsaW5lLCAiJWQgJWx4IiwgJmluZGV4LCAmYWRkcmVzcykgIT0gMikKKyAgICB7CisgICAgICAgIHByaW50aygiV3JvbmcgcGFyYW1ldGVyXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhZGRyZXNzICs9ICh1bnNpZ25lZCBsb25nKWRldmljZXNbaW5kZXhdLmRldmljZS5zb2NfcmVnc19iYXNlOworICAgIHN3aXRjaCAoY21kaW5kZXgpCisgICAgeworICAgIGNhc2UgUkVBRENNRDoKKyAgICAgICAgcmVnID0gYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopYWRkcmVzcyk7CisgICAgICAgIHByaW50aygiMHglbHggOiAlMDh4XG4iLCBhZGRyZXNzLCByZWcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdSSVRFQ01EOgorICAgICAgICByZXN0ID0gbGluZTsKKyAgICAgICAgdG9rZW4gPSBzdHJzZXAoJnJlc3QsICIgIik7IC8qIHNraXAgaW5kZXggKi8KKyAgICAgICAgdG9rZW4gPSBzdHJzZXAoJnJlc3QsICIgIik7IC8qIHNraXAgYWRkcmVzcyAqLworICAgICAgICB0b2tlbiA9IHN0cnNlcCgmcmVzdCwgIiAiKTsKKyAgICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJXcm9uZyBwYXJhbWV0ZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNzY2FuZih0b2tlbiwgIiV4IiwgJnJlZyk7CisgICAgICAgIHByaW50aygid3JpdGUgMHgleCB0byAweCVseFxuIiwgcmVnLCBhZGRyZXNzKTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKWFkZHJlc3MscmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb21tYW5kX21lbShpbnQgY21kaW5kZXgsIGNoYXIgKmxpbmUpCit7CisgICAgY2hhciAqdG9rZW47CisgICAgY2hhciAqcmVzdDsKKyAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisgICAgdW5zaWduZWQgaW50IHJlZzsKKyAgICBpbnQgaSwgbnVtYmVyX29mX3dvcmRzOworICAgIGludCBpbl9saW5lPTAsIG1heF9pbl9saW5lOworCisgICAgaWYgKHNzY2FuZihsaW5lLCAiJWx4IiwgJmFkZHJlc3MpICE9IDEpCisgICAgeworICAgICAgICBwcmludGsoIldyb25nIHBhcmFtZXRlclxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVzdCA9IGxpbmU7CisgICAgdG9rZW4gPSBzdHJzZXAoJnJlc3QsICIgIik7IC8qIHNraXAgYWRkcmVzcyAqLworICAgIHN3aXRjaCAoY21kaW5kZXgpCisgICAgeworICAgIGNhc2UgUkVBRENNRDoKKyAgICAgICAgdG9rZW4gPSBzdHJzZXAoJnJlc3QsICIgIik7CisgICAgICAgIGlmICghdG9rZW4pCisgICAgICAgICAgICBudW1iZXJfb2Zfd29yZHMgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzc2NhbmYodG9rZW4sICIlZCIsICZudW1iZXJfb2Zfd29yZHMpOworCisgICAgICAgIG1heF9pbl9saW5lID0gNDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl93b3JkczsgaSsrLCBhZGRyZXNzICs9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaW5fbGluZSkKKyAgICAgICAgICAgICAgICBwcmludGsoIiUwOGx4OiAiLCBhZGRyZXNzKTsKKyAgICAgICAgICAgIHJlZyA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKWFkZHJlc3MpOworICAgICAgICAgICAgcHJpbnRrKCIlMDh4IiwgcmVnKTsKKyAgICAgICAgICAgIGlmICgrK2luX2xpbmUgPCBtYXhfaW5fbGluZSkKKyAgICAgICAgICAgICAgICBwcmludGsoIiAiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICAgICAgaW5fbGluZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluX2xpbmUpCisgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV1JJVEVDTUQ6CisgICAgICAgIHRva2VuID0gc3Ryc2VwKCZyZXN0LCAiICIpOworICAgICAgICBpZiAoIXRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIldyb25nIHBhcmFtZXRlclxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3NjYW5mKHRva2VuLCAiJXgiLCAmcmVnKTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKWFkZHJlc3MscmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb21tYW5kX2NmZyhpbnQgY21kaW5kZXgsIGNoYXIgKmxpbmUpCit7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzOworICAgIHVuc2lnbmVkIGludCByZWc7CisgICAgdW5zaWduZWQgaW50IHZhbF9vcl9udW07CisgICAgaW50IGNydDsKKyAgICBpbnQgaTsKKyAgICBpbnQgaW5fbGluZT0wLCBtYXhfaW5fbGluZTsKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2aWNlOworCisgICAgaWYgKHNzY2FuZihsaW5lLCAiJWQgJWx4ICV4IiwgJmNydCwgJmFkZHJlc3MsICZ2YWxfb3JfbnVtKSAhPSAzKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJXcm9uZyBwYXJhbWV0ZXJcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNydCA+PSBjcnRfZGV2aWNlIHx8ICFkZXZpY2VzW2NydF0ucGRldikKKyAgICB7CisgICAgICAgIHByaW50aygiSW52YWxpZCBkZXZpY2UgJWRcbiIsIGNydCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZXZpY2UgPSAmZGV2aWNlc1tjcnRdOworCisgICAgc3dpdGNoIChjbWRpbmRleCkKKyAgICB7CisgICAgY2FzZSBSRUFEQ01EOgorICAgICAgICBtYXhfaW5fbGluZSA9IDQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWxfb3JfbnVtOyBpKyssIGFkZHJlc3MgKz0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpbl9saW5lKQorICAgICAgICAgICAgICAgIHByaW50aygiJTA4bHg6ICIsIGFkZHJlc3MpOworICAgICAgICAgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldmljZS0+cGRldiwgYWRkcmVzcywgJnJlZyk7CisgICAgICAgICAgICBwcmludGsoIiUwOHgiLCByZWcpOworICAgICAgICAgICAgaWYgKCsraW5fbGluZSA8IG1heF9pbl9saW5lKQorICAgICAgICAgICAgICAgIHByaW50aygiICIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgICAgICBpbl9saW5lID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW5fbGluZSkKKyAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdSSVRFQ01EOgorICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldmljZS0+cGRldiwgYWRkcmVzcywgdmFsX29yX251bSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgYW5zd2VycyB0byBlY2hvIFsuLi5dID4gL3Byb2MvYmNtb2x0IGNvbW1hbmQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG1hcGxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLGNvbnN0IGNoYXIgKmJ1ZmZlcixzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpCit7CisgICAgY2hhciAqaW50ZXJuYWw7CisKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgaW50ZXJuYWwgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWludGVybmFsKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJOb3QgZW5vdWdoIG1lbW1vcnlcbiIpOworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgbWVtc2V0KGludGVybmFsLCAwLCBjb3VudCk7CisgICAgaWYgKGNvcHlfZnJvbV91c2VyKGludGVybmFsLCBidWZmZXIsIGNvdW50KSkKKyAgICB7CisgICAgICAgIHByaW50aygiTm90IGVub3VnaCBtZW1tb3J5XG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgZmluZF9jb21tYW5kKGludGVybmFsKTsKKworZXJyb3I6CisgICAga2ZyZWUoaW50ZXJuYWwpOworCisgICAgcmV0dXJuIGNvdW50OworfQorCitFWFBPUlRfU1lNQk9MKGJjbW9sdF9kaXIpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9pbml0KTsKK0VYUE9SVF9TWU1CT0woYmNtX2xsX3BjaWVfY2xlYW51cCk7CitFWFBPUlRfU1lNQk9MKGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9xdWVyeSk7CitFWFBPUlRfU1lNQk9MKGJjbV9sbF9wY2llX2Rldl9nZXQpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9kZXZfZW5hYmxlKTsKK0VYUE9SVF9TWU1CT0woYmNtX2xsX3BjaWVfZGV2X2Rpc2FibGUpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9ob3N0X3Jlc2V0X2VuYWJsZSk7CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKK0VYUE9SVF9TWU1CT0woYmNtX2xsX3BjaWVfc2V0cmFjZSk7CitFWFBPUlRfU1lNQk9MKGJjbV9sbF9wY2llX2NsZWFydHJhY2UpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9zYXZldHJhY2UpOworI2VuZGlmCittb2R1bGVfaW5pdChiY21fbGxfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYmNtX2xsX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJtYXBsZSBsaW5lIGNhcmQiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZS9iY21vbHRfbGxwY2llLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvYmNtb2x0X2xscGNpZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkMWE2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvYmNtb2x0X2xscGNpZS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtX2xscGNpZS5oIC0gTG93LWxldmVsIFBDSWUgZHJpdmVyIGludGVyZmFjZQorICovCisKKyNpZm5kZWYgQkNNT0xUX0xMUENJRV9IXworI2RlZmluZSBCQ01PTFRfTExQQ0lFX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNkZWZpbmUgTUFQTEVfTUFYX0RFVklDRVMgICAgICAgICAgICAgICBCQ01UUl9NQVhfT0xUUworCisvKiogTG93LWxldmVsIGRldmljZSBpbmZvICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbGxfZGV2X2luZm8KK3sKKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3JlZ3NfYmFzZTsgICAgICAvKio8IERldmljZSByZWdpc3RlcnMgYmFzZSBpbiBob3N0IGFkZHJlc3Mgc3BhY2UgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3NyYW1fYmFzZTsgICAgICAvKio8IERldmljZSBTUkFNIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19kZHJfYmFzZTsgICAgICAgLyoqPCBEZXZpY2UgRERSIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdWludDMyX3QgICAgICAgIHNvY19kZHJfbGVuZ3RoOyAgICAgLyoqPCBEZXZpY2UgRERSIHdpbmRvdyBzaXplICovCisgICAgdWludDMyX3QgICAgICAgIGlycTsgICAgICAgICAgICAgICAgLyoqPCBEZXZpY2UgaXJxIG51bWJlciAqLworICAgIGludCAgICAgICAgICAgICBpcnFfY29ubmVjdGVkOyAgICAgIC8qKjwgRGV2aWNlIGlycSBudW1iZXIgY29ubmVjdGVkICovCit9IGJjbV9sbF9kZXZfaW5mbzsKKworLyoqIERldmljZSBQQ0llIGxpbmsgc3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9MTF9QQ0lFX0xJTktfRE9XTiwgICAgICAgICAgICAgLyoqPCBQQ0llIGxpbmsgaXMgZG93biAqLworICAgIEJDTV9MTF9QQ0lFX0xJTktfVVAsICAgICAgICAgICAgICAgLyoqPCBQQ0llIGxpbmsgaXMgdXAgKi8KK30gYmNtX2xsX3BjaWVfbGlua19zdGF0dXM7CisKKy8qKiBMb3ctbGV2ZWwgZGV2aWNlIGhhbmRsZSAqLwordHlwZWRlZiB2b2lkICpiY21fbGxfcGNpZV9kZXY7CisKKy8qKiBTdGF0dXMgY2hhbmdlIGluZGljYXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoKmJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2UpKHVpbnQ4X3QgZGV2X2lkLCBiY21fbGxfcGNpZV9saW5rX3N0YXR1cyBzdGF0dXMpOworCisvKiogUmVnaXN0ZXIgc3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqIFxwYXJhbVtpbl0gICBjYiAgICAgIFN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZV9yZWdpc3RlcihiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlIGNiKTsKKworLyoqIFVucmVnaXN0ZXIgc3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqIFxyZXR1cm4gMD1PSyBvciBlcnJvciA8MAorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlX3VucmVnaXN0ZXIodm9pZCk7CisKKy8qKiBRdWVyeSBQQ0llIGRldmljZQorICogXHBhcmFtW2luXSAgIGRldl9pZCAgRGV2aWNlIGlkCisgKiBccGFyYW1bb3V0XSAgaW5mbyAgICBEZXZpY2UgaW5mbworICogXHJldHVybiAwPU9LLCBCQ01fRVJSX0lPLWRldl9pZCBpcyBpbiBwcm9wZXIgcmFuZ2UsIGJ1dCBsaW5rIGlzIGRvd24KKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfcXVlcnkodWludDhfdCBkZXZfaWQsIGJjbV9sbF9kZXZfaW5mbyAqaW5mbyk7CisKKy8qKiBHZXQgbG93LWxldmVsIGRldmljZSBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHBhcmFtW291dF0gIGxsZGV2ICAgTG93LWxldmVsIGRldmljZSBoYW5kbGUKKyAqIFxyZXR1cm4gZGV2aWNlIGhhbmRsZSBvciBOVUxMIGlmIGxpbmsgaXMgZG93bgorICovCitiY21fbGxfcGNpZV9kZXYgYmNtX2xsX3BjaWVfZGV2X2dldCh1aW50OF90IGRldl9pZCk7CisKKy8qIEluaXRpYWxpemUgbG93LWxldmVsIFBDSWUgZHJpdmVyCisgKiBccmV0dXJuCisgKiAgIC0gMD1PSworICogICAtIEJDTV9FUlJfSU5URVJOQUwgLSBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBQQ0kgc3Vic3lzdGVtCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX2luaXQodm9pZCk7CisKKy8qIENsZWFudXAgbG93LWxldmVsIFBDSWUgZHJpdmVyICovCit2b2lkIGJjbV9sbF9wY2llX2NsZWFudXAodm9pZCk7CisKKy8qKiBFbmFibGUgUENJIGFjY2VzcyB0byBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHJldHVybgorICogICAtIDA9T0sKKyAqICAgLSBCQ01fRVJSX1BBUk0tZGV2X2lkIGlzIGludmFsaWQKKyAqICAgLSBCQ01fRVJSX0lPLWRldl9pZCBpcyBpbiBwcm9wZXIgcmFuZ2UsIGJ1dCBsaW5rIGlzIGRvd24KKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfZGV2X2VuYWJsZShpbnQgZGV2X2lkKTsKKworLyoqIERpc2FibGUgUENJIGFjY2VzcyB0byBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHJldHVybgorICogICAtIDA9T0sKKyAqICAgLSBCQ01fRVJSX1BBUk0tZGV2X2lkIGlzIGludmFsaWQKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfZGV2X2Rpc2FibGUoaW50IGRldl9pZCk7CisKKy8qKiBFbmFibGUvZGlzYWJsZSBob3N0IHJlc2V0IGZvciBhbGwgUENJZSBpbnRlcmZhY2VzIChhdXRvbWF0aWMKKyAqICBkZXZpY2UgcmVzZXQgd2hlbiBob3N0IGlzIHJlc2V0KQorICogXHBhcmFtW2luXSAgIGVuYWJsZWQgV2hldGhlciBvciBub3QgaG90IHJlc2V0IHNob3VsZCBiZSBlbmFibGVkCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfaG9zdF9yZXNldF9lbmFibGUodWludDhfdCBkZXZfaWQsIGJjbW9zX2Jvb2wgZW5hYmxlZCk7CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKy8qKiBIYW5kbGUgbG93LWxldmVsIHRyYWNlIG9uIHRhcmdldAorICogXHBhcmFtW2luXSAgIGRldl9pZCAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICBsZmlsZSBuYW1lIGZvciB0cmFjZQorICogXHJldHVybiBkZXZpY2UgaGFuZGxlIG9yIE5VTEwgaWYgbGluayBpcyBkb3duCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3NldHJhY2UodWludDhfdCBkZXZfaWQpOworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfY2xlYXJ0cmFjZSh1aW50OF90IGRldl9pZCk7CitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zYXZldHJhY2UodWludDhfdCBkZXZfaWQsIGNoYXIgKnRyYWNlZmlsZW5hbWUpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL3Z4d29ya3MvYmNtb2x0X2xscGNpZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL3Z4d29ya3MvYmNtb2x0X2xscGNpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmQzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvdnh3b3Jrcy9iY21vbHRfbGxwY2llLmMKQEAgLTAsMCArMSw0MTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8gCisKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjaW5jbHVkZSA8ZHJ2L3BjaS9wY2lDb25maWdMaWIuaD4KKyNpbmNsdWRlICJiY21vbHRfbGxwY2llLmgiCisKKy8qIERlZmluZSBQQ0lFIGRldmljZSBCQVIgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJBUl9SRUdTICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCQVJfRERSICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQkFSX1NSQU0gICAgICAgICAgICAgICAgICAgICAgICA0CisKKy8qIAorRGVmaW5lIFBDSUUgZGV2aWNlIEJBUiBzcGFjZSBsZW5ndGg6CisgICAgYmFyIDEgPSA4ICBNYnl0ZSByZWdpc3RlciBzcGFjZSAKKyAgICBiYXIgMiA9IDE2IE1ieXRlIEREUiBzcGFjZSAKKyAgICBiYXIgMyA9IDY0IEtieXRlIFNSQU0gc3BhY2UKKyovCisjZGVmaW5lIE1BUExFX1JFR1NfTEVOR1RIICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgTUFQTEVfRERSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBNQVBMRV9TUkFNX0xFTkdUSCAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisKKy8qIERlZmluZSBzcGVjaWFsIHJlZ2lzdGVycyBhZGRyZXNzICovCisjaWZkZWYgVFhfRU5BQkxFX0VWRU5UX1RSQUNFCisjZGVmaW5lIFBDSUVfUENJRV8wX01JU0NfQ1BVXzJfUENJRV9NRU1fV0lOMV9MTwkJCTB4MDY0MDE0VQkKKyNkZWZpbmUgUENJRV9QQ0lFXzBfTUlTQ19DUFVfMl9QQ0lFX01FTV9XSU4xX0hJCQkJMHgwNjQwMThVCisjZGVmaW5lIFBDSUVfUENJRV8wX01JU0NfQ1BVXzJfUENJRV9NRU1fV0lOMV9CQVNFX0xJTUlUCTB4MDY0MDc0VQkKKyNlbmRpZgorI2RlZmluZSBQQ0lFX1JFVklTSU9OX1JFR0lTVEVSX09GRlNFVCAgICAgICAweDY0MDZDIC8qIFBDSUVfUENJRV9QQ0lFXzBfUENJRV9QQ0lFXzBfTUlTQ19SRVZJU0lPTiAgICAqLworI2RlZmluZSBQQ0lFX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQgICAgICAgICAweDY0MDY4IC8qIFBDSUVfUENJRV9QQ0lFXzBfUENJRV9QQ0lFXzBfTUlTQ19QQ0lFX1NUQVRVUyAqLworI2RlZmluZSBQQ0lFX0hBUkRfREVCVUdfUkVHSVNURVJfT0ZGU0VUICAgICAweDY0MjA0VSAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfSEFSRF9ERUJVRyAgKi8KKyNkZWZpbmUgUENJRV9JTlRfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCAgICAgMHg2OTQwMCAvKiBQQ0lFX1BDSUVfUENJRV8wX0NQVV9JTlRSMV9JTlRSX1NUQVRVUyAgICAgICAgKi8KKyNkZWZpbmUgUENJRV9JTlRfQ0xFQVJfTUFTS19PRkZTRVQgICAgICAgICAgMHg2OTQwQyAvKiBQQ0lFX1BDSUVfUENJRV8wX0NQVV9JTlRSMV9JTlRSX01BU0tfQ0xFQVIgICAgKi8KKyNkZWZpbmUgUENJRV9JTlRSMV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUICAgMHg2OTMwMCAvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovICAgICAgIAkKKworLyogTWFwbGUgZGV2aWNlIElEICovCisjZGVmaW5lIFBDSUVfTUFQTEVfVkVORE9SX0lEICAgICAgICAgICAgICAgIDB4MTRFNCAvKiBQQ0lFX0NGR19UWVBFMF9FUF9TVUJTWVNURU1fSURfVkVORE9SX0lEICAgICAgKi8KKyNkZWZpbmUgUENJRV9NQVBMRV9ERVZJQ0VfSUQgICAgICAgICAgICAgICAgMHg2ODYyIAorI2RlZmluZSBQQ0lFX01BUExFXzY4NjNfU0tVX0RFVklDRV9JRCAgICAgICAweDY4NjMKKyNkZWZpbmUgUENJRV9NQVBMRV9FUE9OX0RFVklDRV9JRCAgICAgICAgICAgMHg1NTU0CisKKy8qIERlZmluZSBpbnRlcnJ1cHQgdmVjdG9yIG51bWJlciBhY2NvcmRpbmcgQkNNNTMwMDMgQlNQICovCisjZGVmaW5lIFBDSUUxX0lWXzAgODYKKyNkZWZpbmUgUENJRTFfSVZfMSA4NworI2RlZmluZSBQQ0lFMV9JTlRfTElORSA0CisKKy8qIE1hcGxlIGRldmljZSBvYmplY3Qgc3RydWN0ICovCit0eXBlZGVmIHN0cnVjdCAgCit7CisgICAgYmNtX2xsX2Rldl9pbmZvICBkZXZpY2U7CisgICAgYmNtb3NfZmFzdGxvY2sgICBsb2NrOworICAgIGludCAgICAgICAgICAgICAgZXJyX3N0YXR1czsKKyAgICBpbnQgICAgICAgICAgICAgIHBoeWxpbms7CisgICAgaW50ICAgICAgICAgICAgICBwcmV2X2RhdGFsaW5rOworICAgIGludCAgICAgICAgICAgICAgZGF0YWxpbms7CisgICAgdWludDMyX3QgICAgICAgICBkZXZpY2VpZDsgIC8vIHN0YXJ0IGZyb20gMAorICAgIHVuc2lnbmVkIGludCAgICAqdHJhY2VhZGRyOworICAgIHZvaWQgICpwZGV2OworICAgIGludCBwY2lCdXNObzsgICAgICAgLyogUENJIGJ1cyBudW1iZXIgKi8KKyAgICBpbnQgcGNpRGV2Tm87ICAgICAgIC8qIFBDSSBkZXZpY2UgbnVtYmVyICovCisgICAgaW50IHBjaUZ1bmNObzsgICAgICAvKiBQQ0kgZnVuY3Rpb24gbnVtYmVyICovCisgICAgdWludDMyX3QgZGV2X3N0YXR1c19pcnE7Cit9IG1hcGxlX2RldmljZV9pbmZvOworCisvKiBNYXBsZSBkZXZpY2Ugb2JqZWN0cyAqLworc3RhdGljIG1hcGxlX2RldmljZV9pbmZvIGRldmljZXNbTUFQTEVfTUFYX0RFVklDRVNdOworaW50IGNydF9kZXZpY2UgPSAwOworCisvKiBEZXZpY2UgUENJRSBpbnRlcmZhY2Ugc3RhdHVzIGNoYW5nZSBjYWxsYmFjayAqLworc3RhdGljIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2UgY2FsbGJhY2s7CisKKy8qKiBEZXZpY2Ugc3RhdHVzIGNoYW5nZSBJU1IKKyAqIFxpcnEgICAgICAgICAgSVJRIG51bWJlcgorICogXGRldl9pbnN0YW5jZSBkZXZpY2Ugb2JqZWN0IAorICovCitpbnQgZGV2X3N0YXR1c19pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIHVpbnQzMl90IHJlZ192YWx1ZSA9IDA7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvID0gTlVMTDsgICAKKyAgICBsb25nIGZsYWdzID0gMDsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CisgICAgdWludDMyX3QgZGV2X2lkID0gMDsKKyAgICAKKyAgICBkZXZpY2VfaW5mbyA9IChtYXBsZV9kZXZpY2VfaW5mbyAqKWRldl9pbnN0YW5jZTsKKyAgICBkZXZfaWQgPSBkZXZpY2VfaW5mby0+ZGV2aWNlaWQ7CisgICAgCisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZkZXZpY2VfaW5mby0+bG9jayk7CisKKyAgICByZWdfdmFsdWUgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9JTlRfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCkpOworICAgIHsKKyAgICAgICAgaWYgKGRldmljZV9pbmZvLT5kYXRhbGluayAhPSBkZXZpY2VfaW5mby0+cHJldl9kYXRhbGluaykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRldmljZV9pbmZvLT5kYXRhbGluayA9PSBCQ01fTExfUENJRV9MSU5LX1VQKQorICAgICAgICAgICAgICAgIHByaW50ZigiRGV2aWNlPSVkIDogTGluayBpcyB1cCAhISFcbiIsIGRldl9pZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJEZXZpY2U9JWQgOiBMaW5rIGlzIGRvd24gISEhXG4iLCBkZXZfaWQpOworICAgICAgICAgICAgICAgIHByaW50ZigicGh5IHN0YXR1cyA9IDB4JXggZXJyb3Igc3RhdHVzID0gMHgleFxuIiwgZGV2aWNlX2luZm8tPnBoeWxpbmssIGRldmljZV9pbmZvLT5lcnJfc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZV9pbmZvLT5wcmV2X2RhdGFsaW5rID0gZGV2aWNlX2luZm8tPmRhdGFsaW5rOworICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRldl9pZCwgZGV2aWNlX2luZm8tPmRhdGFsaW5rKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVnX3ZhbHVlID0gYmNtX3BjaV9yZWFkMzIoCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKikoZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9JTlRSMV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUKSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZWQgPSAxOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZGV2aWNlX2luZm8tPmxvY2ssIGZsYWdzKTsKKyAgICAKKyAgICByZXR1cm4gaGFuZGxlZDsKK30KKworLyoqIE1hcGxlIGRldmljZSBkZXRlY3Rpb24gYW5kIGluaXRpYWxpemF0aW9uCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX2ludGVyZmFjZV9pbml0KCkKK3sKKyAgICBTVEFUVVMgcmV0X3N0YXR1czsKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSBOVUxMOyAKKyAgICB1aW50MzJfdCByZWFkdmFsID0gMDsKKyAgICB1aW50OF90IHJlYWR2YWxiID0gMDsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIHVpbnQ4X3QgaXJxID0gMDsKKyAgICB1aW50MTZfdCBkZXZpY2VfaWQ7CisKKyAgICBwcmludGYoIiVzKClcclxuIiwgX19GVU5DVElPTl9fKTsKKworICAgIC8vIGNoZWNrIG1hcGxlIGRldmljZSBudW1iZXIKKyAgICBpZiAoY3J0X2RldmljZSA9PSBNQVBMRV9NQVhfREVWSUNFUykKKyAgICB7CisgICAgICAgIHByaW50ZigiIE1heGltdW0gTWFwbGUgZGV2aWNlcyBhbHJlYWR5IGRlZmluZWQgKCVkKVxuIiwgTUFQTEVfTUFYX0RFVklDRVMpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgIH0gCisgICAgLy8gSW5pdCBkZXZpY2Ugb2JqZWN0IHN0cnVjdAorICAgIGRldl9pbmZvID0gJmRldmljZXNbY3J0X2RldmljZSsrXTsKKyAgICBtZW1zZXQoZGV2X2luZm8sIDAsIHNpemVvZihtYXBsZV9kZXZpY2VfaW5mbykpOworICAgIAorICAgIC8vIGZpbmQgbWFwbGUgNjg2MiBkZXZpY2UKKyAgICByZXRfc3RhdHVzID0gcGNpRmluZERldmljZShQQ0lFX01BUExFX1ZFTkRPUl9JRCwKKyAgICAgICAgUENJRV9NQVBMRV9ERVZJQ0VfSUQsCisgICAgICAgIDAsCisgICAgICAgICZkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICZkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICZkZXZfaW5mby0+cGNpRnVuY05vKTsKKworICAgIGlmIChPSyA9PSByZXRfc3RhdHVzKQorICAgIHsKKyAgICAgICAgZGV2aWNlX2lkID0gUENJRV9NQVBMRV9ERVZJQ0VfSUQ7CisgICAgICAgIGdvdG8gZm91bmRfZGV2aWNlX2lkOworICAgIH0KKworICAgIC8vIGZpbmQgbWFwbGUgNjg2MyBkZXZpY2UKKyAgICByZXRfc3RhdHVzID0gcGNpRmluZERldmljZShQQ0lFX01BUExFX1ZFTkRPUl9JRCwKKyAgICAgICAgUENJRV9NQVBMRV82ODYzX1NLVV9ERVZJQ0VfSUQsCisgICAgICAgIDAsCisgICAgICAgICZkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICZkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICZkZXZfaW5mby0+cGNpRnVuY05vKTsKKworICAgIGlmIChPSyA9PSByZXRfc3RhdHVzKQorICAgIHsKKyAgICAgICAgZGV2aWNlX2lkID0gUENJRV9NQVBMRV82ODYzX1NLVV9ERVZJQ0VfSUQ7CisgICAgICAgIGdvdG8gZm91bmRfZGV2aWNlX2lkOworICAgIH0KKworICAgIC8vIGZpbmQgbWFwbGUgZXBvbiBkZXZpY2UKKyAgICByZXRfc3RhdHVzID0gcGNpRmluZERldmljZShQQ0lFX01BUExFX1ZFTkRPUl9JRCwKKyAgICAgICAgUENJRV9NQVBMRV9FUE9OX0RFVklDRV9JRCwKKyAgICAgICAgMCwKKyAgICAgICAgJmRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgJmRldl9pbmZvLT5wY2lEZXZObywKKyAgICAgICAgJmRldl9pbmZvLT5wY2lGdW5jTm8pOworCisgICAgaWYgKE9LID09IHJldF9zdGF0dXMpCisgICAgeworICAgICAgICBkZXZpY2VfaWQgPSBQQ0lFX01BUExFX0VQT05fREVWSUNFX0lEOworICAgICAgICBnb3RvIGZvdW5kX2RldmljZV9pZDsKKyAgICB9CisKKyAgICBwcmludGYoIkNhbid0IGZpbmQgYW55IGRldmljZVslZF1cbiIsIFBDSUVfTUFQTEVfVkVORE9SX0lEKTsKKyAgICByZXR1cm4gQkNNX0VSUl9OT0RFVjsKKworZm91bmRfZGV2aWNlX2lkOgorICAgIHByaW50ZigiRm91bmQgbWFwbGUgZGV2aWNlWyV4IC0gJXhdXG4iLCBQQ0lFX01BUExFX1ZFTkRPUl9JRCwgZGV2aWNlX2lkKTsKKworICAgIC8vIGluaXQgICAgCisgICAgZGV2X2luZm8tPmRldmljZWlkID0gKGNydF9kZXZpY2UgLSAxKTsKKyAgICBkZXZfaW5mby0+cGRldiA9IE5VTEw7CisKKworICAgIC8vIEVuYWJsZSBQQ0kgYWRkcmVzcyBtYXAKKyAgICBwY2lDb25maWdJbkJ5dGUoZGV2X2luZm8tPnBjaUJ1c05vLAorICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lGdW5jTm8sCisgICAgICAgICAgICAgICAgICAgIFBDSV9DRkdfQ09NTUFORCwKKyAgICAgICAgICAgICAgICAgICAgKFVJTlQ4ICopJnJlYWR2YWxiKTsKKyAgICBwcmludGYoIkNNRCByZWcgPSAweCV4XG4iLCByZWFkdmFsYik7CisKKyAgICByZWFkdmFsYiB8PSAweDY7CisgICAgcGNpQ29uZmlnT3V0Qnl0ZShkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lEZXZObywKKyAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaUZ1bmNObywKKyAgICAgICAgICAgICAgICAgICAgUENJX0NGR19DT01NQU5ELAorICAgICAgICAgICAgICAgICAgICAoVUlOVDgpcmVhZHZhbGIpOworCisgICAgcGNpQ29uZmlnSW5CeXRlKGRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRnVuY05vLAorICAgICAgICAgICAgICAgICAgICBQQ0lfQ0ZHX0NPTU1BTkQsCisgICAgICAgICAgICAgICAgICAgIChVSU5UOCAqKSZyZWFkdmFsYik7CisgICAgcHJpbnRmKCJBZGp1c3RlZCBDTUQgcmVnID0gMHgleFxuIiwgcmVhZHZhbGIpOworCisgICAgLy8gSW5pdCBiYXNlIGFkZHJlc3NlcworICAgIGRldl9pbmZvLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSA9IDB4ZTAwMDAwMDA7CisgICAgZGV2X2luZm8tPmRldmljZS5zb2Nfc3JhbV9iYXNlID0gMHhlMjAwMDAwMDsKKyAgICBkZXZfaW5mby0+ZGV2aWNlLnNvY19kZHJfYmFzZSAgPSAweGUxMDAwMDAwOworICAgIGRldl9pbmZvLT5kZXZpY2Uuc29jX2Rkcl9sZW5ndGggPSAweDEwMDAwMDA7IC8vIDE2TQorCisgICAgLy8gaW5pdCBpbnRlcnJ1cHQgbGluZQorICAgIHJlYWR2YWxiID0gUENJRTFfSU5UX0xJTkU7CisgICAgcGNpQ29uZmlnT3V0Qnl0ZShkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lEZXZObywKKyAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaUZ1bmNObywKKyAgICAgICAgICAgICAgICAgICAgUENJX0NGR19ERVZfSU5UX0xJTkUsCisgICAgICAgICAgICAgICAgICAgIChVSU5UOClyZWFkdmFsYik7CisgICAgcGNpQ29uZmlnSW5CeXRlKGRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRnVuY05vLAorICAgICAgICAgICAgICAgICAgICBQQ0lfQ0ZHX0RFVl9JTlRfTElORSwKKyAgICAgICAgICAgICAgICAgICAgKFVJTlQ4ICopJnJlYWR2YWxiKTsKKyAgICBwcmludGYoIkFkanVzdGVkIElOVCBMaW5lIHJlZyA9IDB4JXhcbiIsIHJlYWR2YWxiKTsKKworICAgIC8vIGluaXQgaW50ZXJydXB0CisgICAgZGV2X2luZm8tPmRldmljZS5pcnEgPSBQQ0lFMV9JVl8wOworICAgIGRldl9pbmZvLT5kZXZfc3RhdHVzX2lycSA9IFBDSUUxX0lWXzE7CisKKyAgICAvLyByZWFkIHJldmlzaW9uIHJlZ2lzdGVyCisgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShkZXZfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1JFVklTSU9OX1JFR0lTVEVSX09GRlNFVCkpOworICAgIHByaW50ZigicmVhZHZhbCA9IDB4JXhcbiIsIHJlYWR2YWwpOworICAgIHByaW50ZigiQ2FyZCAlZCB2ZXJzaW9uIG1ham9yPSUwMnggbWlub3I9JTAyeFxuIiwKKyAgICAgICAgICAgICAgICBkZXZfaW5mby0+ZGV2aWNlaWQsIAorICAgICAgICAgICAgICAgICgocmVhZHZhbCAmIDB4MDAwMGZmMDApID4+IDgpLAorICAgICAgICAgICAgICAgIChyZWFkdmFsICYgMHgwMDAwMDBmZikpOyAKKyAgICAKKyAgICAvLyByZWFkIHN0YXR1cyByZWdpc3RlcgorICAgIHJlYWR2YWwgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2X2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUKSk7CisgICAgcHJpbnRmKCJyZWFkdmFsID0gMHgleFxuIiwgcmVhZHZhbCk7CisgICAgZGV2X2luZm8tPmVycl9zdGF0dXMgPSAocmVhZHZhbCAmIDB4MDAwMDAwMGYpOworICAgIGRldl9pbmZvLT5waHlsaW5rICAgID0gKChyZWFkdmFsID4+IDQpICYgMHgxKTsKKyAgICBkZXZfaW5mby0+ZGF0YWxpbmsgICA9ICgocmVhZHZhbCA+PiA1KSAmIDB4MSk7CisgICAgZGV2X2luZm8tPnByZXZfZGF0YWxpbmsgID0gZGV2X2luZm8tPmRhdGFsaW5rOworCisgICAgLy8gY29ubmVjdCBJTlQgZm9yIGRldmljZSBzdGF0dXMKKyAgICBiY21vc19mYXN0bG9ja19pbml0KCZkZXZfaW5mby0+bG9jaywgMCk7CisgICAgYmNtb3NfaW50X2Nvbm5lY3QoKGludClkZXZfaW5mby0+ZGV2X3N0YXR1c19pcnEsIAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICBCQ01PU19JUlFfU0hBUkVELCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9zdGF0dXNfaW50ZXJydXB0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXNfaXNyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mbyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEdldCBNYXBsZSBkZXZpY2Ugb2JqZWN0IHN0cnVjdAorICogXGNydCBkZXZpZSBpbmRleCxzdGFydCBmcm9tIDAKKyAqLworc3RhdGljIG1hcGxlX2RldmljZV9pbmZvICpnZXRfbWFwbGVfcGNpX2luZm8oaW50IGNydCkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIHVpbnQzMl90IHJlYWR2YWwgPSAwOworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbyA9IE5VTEw7CisKKyAgICAvKiBjaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KKyAgICBpZiAoTUFQTEVfTUFYX0RFVklDRVMgPD0gY3J0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRldmljZV9pbmZvID0gJmRldmljZXNbY3J0XTsKKworICAgIC8qIHJlYWQgc3RhdHVzIHJlZ2lzdGVyICovCisgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQpKTsKKyAgICBkZXZpY2VfaW5mby0+ZXJyX3N0YXR1cyA9IChyZWFkdmFsICYgMHgwMDAwMDAwZik7CisgICAgZGV2aWNlX2luZm8tPnBoeWxpbmsgICAgPSAoKHJlYWR2YWwgPj4gNCkgJiAweDEpOworICAgIGRldmljZV9pbmZvLT5kYXRhbGluayAgID0gKChyZWFkdmFsID4+IDUpICYgMHgxKTsKKworICAgIC8qIHJldHVybiBkZXZpY2UgKi8KKyAgICByZXR1cm4gZGV2aWNlX2luZm87Cit9CisKKy8qKiBSZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHBhcmFtW2luXSAgIGNiICAgICAgU3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqIFxyZXR1cm4gMD1PSyBvciBlcnJvciA8MCAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZV9yZWdpc3RlcihiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlIGNiKQoreworICAgIGludCBpOworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZfaW5mbzsgCisgICAgCisgICAgY2FsbGJhY2sgPSBjYjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3J0X2RldmljZTsgaSsrKQorICAgIHsKKyAgICAgICAgZGV2X2luZm8gPSBnZXRfbWFwbGVfcGNpX2luZm8oaSk7CisgICAgICAgIGNhbGxiYWNrKGksIGRldl9pbmZvLT5kYXRhbGluayk7CisgICAgfQorICAgIAorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogVW5yZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHJldHVybiAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfdW5yZWdpc3Rlcih2b2lkKQoreworICAgIGNhbGxiYWNrID0gTlVMTDsKKyAgICAKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFF1ZXJ5IFBDSWUgZGV2aWNlCisgKiBccGFyYW1baW5dICAgZGV2X2lkICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtvdXRdICBpbmZvICAgIERldmljZSBpbmZvCisgKiBccmV0dXJuIDA9T0ssIEJDTV9FUlJfSU8tZGV2X2lkIGlzIGluIHByb3BlciByYW5nZSwgYnV0IGxpbmsgaXMgZG93bgorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9xdWVyeSh1aW50OF90IGRldl9pZCwgYmNtX2xsX2Rldl9pbmZvICppbmZvKQoreworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZfaW5mbzsgCisgICAgCisgICAgaWYgKE5VTEwgPT0gaW5mbykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIAorICAgIGlmIChkZXZfaWQgPCBjcnRfZGV2aWNlKQorICAgIHsKKyAgICAgICAgZGV2X2luZm8gPSBnZXRfbWFwbGVfcGNpX2luZm8oZGV2X2lkKTsKKyAgICAgICAgaWYgKGRldl9pbmZvLT5kYXRhbGluayA9PSBCQ01fTExfUENJRV9MSU5LX0RPV04pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lPOworICAgICAgICB9CisKKyAgICAgICAgKmluZm8gPSBkZXZfaW5mby0+ZGV2aWNlOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7ICAgCit9CisKKy8qKiBHZXQgbG93LWxldmVsIGRldmljZSBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHBhcmFtW291dF0gIGxsZGV2ICAgTG93LWxldmVsIGRldmljZSBoYW5kbGUgCisgKiBccmV0dXJuIGRldmljZSBoYW5kbGUgb3IgTlVMTCBpZiBsaW5rIGlzIGRvd24KKyAqLworYmNtX2xsX3BjaWVfZGV2IGJjbV9sbF9wY2llX2Rldl9nZXQodWludDhfdCBkZXZfaWQpCit7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldl9pbmZvOyAKKyAgICAKKyAgICBpZiAoZGV2X2lkIDwgTUFQTEVfTUFYX0RFVklDRVMpCisgICAgeworICAgICAgICBkZXZfaW5mbyA9IGdldF9tYXBsZV9wY2lfaW5mbyhkZXZfaWQpOworICAgICAgICByZXR1cm4gZGV2X2luZm8tPnBkZXY7CisgICAgfSAKKyAgICAKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqIEhvc3QgcmVzZXQgZW5hYmxlIAorICogXGVuYWJsZWQgCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX2hvc3RfcmVzZXRfZW5hYmxlKHVpbnQ4X3QgZGV2X2lkLCBiY21vc19ib29sIGVuYWJsZWQpCit7CisgICAgdWludDMyX3QgdmFsOworCisgICAgdmFsID0gZW5hYmxlZCA/IDAgOiAxOworICAgIGJjbV9wY2lfd3JpdGUzMigodWludDMyX3QgKikoZGV2aWNlc1tkZXZfaWRdLmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9IQVJEX0RFQlVHX1JFR0lTVEVSX09GRlNFVCkgLCB2YWwpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZS92eHdvcmtzL2JjbW9sdF9sbHBjaWUuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZS92eHdvcmtzL2JjbW9sdF9sbHBjaWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDg0OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL3Z4d29ya3MvYmNtb2x0X2xscGNpZS5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtX2xscGNpZS5oIC0gTG93LWxldmVsIFBDSWUgZHJpdmVyIGludGVyZmFjZQorICovCisKKyNpZm5kZWYgQkNNT0xUX0xMUENJRV9IXworI2RlZmluZSBCQ01PTFRfTExQQ0lFX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNkZWZpbmUgTUFQTEVfTUFYX0RFVklDRVMgICAgICAgICAgICAgICAxIC8qIDUgKi8KKworLyoqIExvdy1sZXZlbCBkZXZpY2UgaW5mbyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xsX2Rldl9pbmZvCit7CisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19yZWdzX2Jhc2U7ICAgICAgLyoqPCBEZXZpY2UgcmVnaXN0ZXJzIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19zcmFtX2Jhc2U7ICAgICAgLyoqPCBEZXZpY2UgU1JBTSBiYXNlIGluIGhvc3QgYWRkcmVzcyBzcGFjZSAqLworICAgIHVuc2lnbmVkIGxvbmcgICBzb2NfZGRyX2Jhc2U7ICAgICAgIC8qKjwgRGV2aWNlIEREUiBiYXNlIGluIGhvc3QgYWRkcmVzcyBzcGFjZSAqLworICAgIHVpbnQzMl90ICAgICAgICBzb2NfZGRyX2xlbmd0aDsgICAgIC8qKjwgRGV2aWNlIEREUiB3aW5kb3cgc2l6ZSAqLworICAgIHVpbnQzMl90ICAgICAgICBpcnE7ICAgICAgICAgICAgICAgIC8qKjwgRGV2aWNlIGlycSBudW1iZXIgKi8KK30gYmNtX2xsX2Rldl9pbmZvOworCisvKiogRGV2aWNlIFBDSWUgbGluayBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjayAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX0xMX1BDSUVfTElOS19ET1dOLCAgICAgICAgICAgICAvKio8IFBDSWUgbGluayBpcyBkb3duICovCisgICAgQkNNX0xMX1BDSUVfTElOS19VUCwgICAgICAgICAgICAgICAvKio8IFBDSWUgbGluayBpcyB1cCAqLworfSBiY21fbGxfcGNpZV9saW5rX3N0YXR1czsKKworLyoqIExvdy1sZXZlbCBkZXZpY2UgaGFuZGxlICovCit0eXBlZGVmIHZvaWQgKmJjbV9sbF9wY2llX2RldjsKKworLyoqIFN0YXR1cyBjaGFuZ2UgaW5kaWNhdGlvbiAqLwordHlwZWRlZiB2b2lkICgqYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZSkodWludDhfdCBkZXZfaWQsIGJjbV9sbF9wY2llX2xpbmtfc3RhdHVzIHN0YXR1cyk7CisKKy8qKiBSZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHBhcmFtW2luXSAgIGNiICAgICAgU3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqIFxyZXR1cm4gMD1PSyBvciBlcnJvciA8MAorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlX3JlZ2lzdGVyKGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2UgY2IpOworCisvKiogVW5yZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHJldHVybiAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfdW5yZWdpc3Rlcih2b2lkKTsKKworLyoqIFF1ZXJ5IFBDSWUgZGV2aWNlCisgKiBccGFyYW1baW5dICAgZGV2X2lkICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtvdXRdICBpbmZvICAgIERldmljZSBpbmZvCisgKiBccmV0dXJuIDA9T0ssIEJDTV9FUlJfSU8tZGV2X2lkIGlzIGluIHByb3BlciByYW5nZSwgYnV0IGxpbmsgaXMgZG93bgorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9xdWVyeSh1aW50OF90IGRldl9pZCwgYmNtX2xsX2Rldl9pbmZvICppbmZvKTsKKworLyoqIEdldCBsb3ctbGV2ZWwgZGV2aWNlIGhhbmRsZQorICogXHBhcmFtW2luXSAgIGRldl9pZCAgRGV2aWNlIGlkCisgKiBccGFyYW1bb3V0XSAgbGxkZXYgICBMb3ctbGV2ZWwgZGV2aWNlIGhhbmRsZSAKKyAqIFxyZXR1cm4gZGV2aWNlIGhhbmRsZSBvciBOVUxMIGlmIGxpbmsgaXMgZG93bgorICovCitiY21fbGxfcGNpZV9kZXYgYmNtX2xsX3BjaWVfZGV2X2dldCh1aW50OF90IGRldl9pZCk7CisKKy8qKiBFbmFibGUvZGlzYWJsZSBob3N0IHJlc2V0IGZvciBhbGwgUENJZSBpbnRlcmZhY2VzIChhdXRvbWF0aWMKKyAqICBkZXZpY2UgcmVzZXQgd2hlbiBob3N0IGlzIHJlc2V0KQorICogXHBhcmFtW2luXSAgIGVuYWJsZWQgV2hldGhlciBvciBub3QgaG90IHJlc2V0IHNob3VsZCBiZSBlbmFibGVkCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfaG9zdF9yZXNldF9lbmFibGUodWludDhfdCBkZXZfaWQsIGJjbW9zX2Jvb2wgZW5hYmxlZCk7CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKy8qKiBIYW5kbGUgbG93LWxldmVsIHRyYWNlIG9uIHRhcmdldAorICogXHBhcmFtW2luXSAgIGRldl9pZCAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICBsZmlsZSBuYW1lIGZvciB0cmFjZQorICogXHJldHVybiBkZXZpY2UgaGFuZGxlIG9yIE5VTEwgaWYgbGluayBpcyBkb3duCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3NldHJhY2UodWludDhfdCBkZXZfaWQpOworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfY2xlYXJ0cmFjZSh1aW50OF90IGRldl9pZCk7CitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zYXZldHJhY2UodWludDhfdCBkZXZfaWQsIGNoYXIgKnRyYWNlZmlsZW5hbWUpOworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZS92eHdvcmtzL211bHRpX2RldmljZS9iY21vbHRfbGxwY2llLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvdnh3b3Jrcy9tdWx0aV9kZXZpY2UvYmNtb2x0X2xscGNpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkZTc0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvdnh3b3Jrcy9tdWx0aV9kZXZpY2UvYmNtb2x0X2xscGNpZS5jCkBAIC0wLDAgKzEsNTA1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovIAorCisjaW5jbHVkZSA8dnhXb3Jrcy5oPgorI2luY2x1ZGUgPGRydi9wY2kvcGNpQ29uZmlnTGliLmg+CisjaW5jbHVkZSAiYmNtb2x0X2xscGNpZS5oIgorCisvKiBEZWZpbmUgUENJRSBkZXZpY2UgQkFSIHJlZ2lzdGVycyAqLworI2RlZmluZSBCQVJfUkVHUyAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkFSX0REUiAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEJBUl9TUkFNICAgICAgICAgICAgICAgICAgICAgICAgNAorCisvKiAKK0RlZmluZSBQQ0lFIGRldmljZSBCQVIgc3BhY2UgbGVuZ3RoOgorICAgIGJhciAwID0gOCAgTWJ5dGUgcmVnaXN0ZXIgc3BhY2UgCisgICAgYmFyIDIgPSAxNiBNYnl0ZSBERFIgc3BhY2UgCisgICAgYmFyIDQgPSA2NCBLYnl0ZSBTUkFNIHNwYWNlCisqLworI2RlZmluZSBNQVBMRV9SRUdTX0xFTkdUSCAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIE1BUExFX0REUl9MRU5HVEggICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgTUFQTEVfU1JBTV9MRU5HVEggICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorCisvKiBEZWZpbmUgc3BlY2lhbCByZWdpc3RlcnMgYWRkcmVzcyAqLworI2lmZGVmIFRYX0VOQUJMRV9FVkVOVF9UUkFDRQorI2RlZmluZSBQQ0lFX1BDSUVfMF9NSVNDX0NQVV8yX1BDSUVfTUVNX1dJTjFfTE8JCQkweDA2NDAxNFUJCisjZGVmaW5lIFBDSUVfUENJRV8wX01JU0NfQ1BVXzJfUENJRV9NRU1fV0lOMV9ISQkJCTB4MDY0MDE4VQorI2RlZmluZSBQQ0lFX1BDSUVfMF9NSVNDX0NQVV8yX1BDSUVfTUVNX1dJTjFfQkFTRV9MSU1JVAkweDA2NDA3NFUJCisjZW5kaWYKKyNkZWZpbmUgUENJRV9SRVZJU0lPTl9SRUdJU1RFUl9PRkZTRVQgICAgICAgMHg2NDA2QyAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfUkVWSVNJT04gICAgKi8KKyNkZWZpbmUgUENJRV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUICAgICAgICAgMHg2NDA2OCAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfUENJRV9TVEFUVVMgKi8KKyNkZWZpbmUgUENJRV9IQVJEX0RFQlVHX1JFR0lTVEVSX09GRlNFVCAgICAgMHg2NDIwNFUgLyogUENJRV9QQ0lFX1BDSUVfMF9QQ0lFX1BDSUVfMF9NSVNDX0hBUkRfREVCVUcgICovCisjZGVmaW5lIFBDSUVfSU5UX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQgICAgIDB4Njk0MDAgLyogUENJRV9QQ0lFX1BDSUVfMF9DUFVfSU5UUjFfSU5UUl9TVEFUVVMgICAgICAgICovCisjZGVmaW5lIFBDSUVfSU5UX0NMRUFSX01BU0tfT0ZGU0VUICAgICAgICAgIDB4Njk0MEMgLyogUENJRV9QQ0lFX1BDSUVfMF9DUFVfSU5UUjFfSU5UUl9NQVNLX0NMRUFSICAgICovCisjZGVmaW5lIFBDSUVfSU5UUjFfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCAgIDB4NjkzMDAgLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLyAgICAgICAJCisKKy8qIE1hcGxlIGRldmljZSBJRCAqLworI2RlZmluZSBQQ0lFX01BUExFX1ZFTkRPUl9JRCAgICAgICAgICAgICAgICAweDE0RTQgLyogUENJRV9DRkdfVFlQRTBfRVBfU1VCU1lTVEVNX0lEX1ZFTkRPUl9JRCAgICAgICovCisjZGVmaW5lIFBDSUVfTUFQTEVfREVWSUNFX0lEICAgICAgICAgICAgICAgIDB4Njg2MiAKKyNkZWZpbmUgUENJRV9NQVBMRV82ODYzX1NLVV9ERVZJQ0VfSUQgICAgICAgMHg2ODYzCisjZGVmaW5lIFBDSUVfTUFQTEVfRVBPTl9ERVZJQ0VfSUQgICAgICAgICAgIDB4NTU1NAorCisvKiBEZWZpbmUgaW50ZXJydXB0IHZlY3RvciBudW1iZXIgZm9yIE1QQzgzMDggKi8KKyNkZWZpbmUgRFJWX1BDSUVfSU5UX0lSUV9CQVNFIDk2CisjZGVmaW5lIFBDSUVfREVWMF9JVl8wICAgKERSVl9QQ0lFX0lOVF9JUlFfQkFTRSArIDI0KQorI2RlZmluZSBQQ0lFX0RFVjBfSVZfMSAgIChEUlZfUENJRV9JTlRfSVJRX0JBU0UgKyAyNSkKKyNkZWZpbmUgUENJRV9ERVYxX0lWXzAgICAoRFJWX1BDSUVfSU5UX0lSUV9CQVNFICsgMCkKKyNkZWZpbmUgUENJRV9ERVYxX0lWXzEgICAoRFJWX1BDSUVfSU5UX0lSUV9CQVNFICsgMSkKKworLyogTWFwbGUgZGV2aWNlIG9iamVjdCBzdHJ1Y3QgKi8KK3R5cGVkZWYgc3RydWN0ICAKK3sKKyAgICB1aW50MzJfdCBsbHBjaWVfaXJxOworICAgIHVpbnQzMl90IGxscGNpZV9zdGF0dXNfaXJxOworfSBtYXBsZV9sbHBjaWVfZGV2aWNlX2lycXM7CisKK21hcGxlX2xscGNpZV9kZXZpY2VfaXJxcyBsbHBjaWVfZGV2aWNlX2lycXNbQkNNT0xUX01BWF9NQVBMRV9ERVZJQ0VTXSA9Cit7CisgICAge1BDSUVfREVWMF9JVl8wLFBDSUVfREVWMF9JVl8xfSwKKyAgICB7UENJRV9ERVYxX0lWXzAsUENJRV9ERVYxX0lWXzF9Cit9OworCisKKyNpZmRlZiBMTFBDSUVfU0VUX0JBU0VfQUREUkVTU0VTX01BTlVBTExZIAorCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3JlZ3NfYmFzZTsgICAgICAvKio8IERldmljZSByZWdpc3RlcnMgYmFzZSBpbiBob3N0IGFkZHJlc3Mgc3BhY2UgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3NyYW1fYmFzZTsgICAgICAvKio8IERldmljZSBTUkFNIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19kZHJfYmFzZTsgICAgICAgLyoqPCBEZXZpY2UgRERSIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisKK30gbWFwbGVfbGxwY2llX2Jhc2VfYWRkcmVzc2VzOworCittYXBsZV9sbHBjaWVfYmFzZV9hZGRyZXNzZXMgbGxwY2llX2Jhc2VfYWRkcmVzc2VzW0JDTU9MVF9NQVhfTUFQTEVfREVWSUNFU10gPQoreworICAgICB7LnNvY19yZWdzX2Jhc2UgPSAweGUwMDAwMDAwLCAuc29jX3NyYW1fYmFzZSA9IDB4ZTIwMDAwMDAsIC5zb2NfZGRyX2Jhc2UgID0gMHhlMTAwMDAwMH0sCisgICAgIC8qIGluIHRoaXMgZXhhbXBsZSB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UqLworICAgICB7LnNvY19yZWdzX2Jhc2UgPSAweDAwMDAwMDAwLCAuc29jX3NyYW1fYmFzZSA9IDB4MDAwMDAwMDAsIC5zb2NfZGRyX2Jhc2UgID0gMHgwMDAwMDAwMH0KK307CisjZW5kaWYKKworLyogTWFwbGUgZGV2aWNlIG9iamVjdCBzdHJ1Y3QgKi8KK3R5cGVkZWYgc3RydWN0ICAKK3sKKyAgICBiY21fbGxfZGV2X2luZm8gIGRldmljZTsKKyAgICBiY21vc19mYXN0bG9jayAgIGxvY2s7CisgICAgaW50ICAgICAgICAgICAgICBlcnJfc3RhdHVzOworICAgIGludCAgICAgICAgICAgICAgcGh5bGluazsKKyAgICBpbnQgICAgICAgICAgICAgIHByZXZfZGF0YWxpbms7CisgICAgaW50ICAgICAgICAgICAgICBkYXRhbGluazsKKyAgICB1aW50MzJfdCAgICAgICAgIGRldmljZWlkOyAgLy8gc3RhcnQgZnJvbSAwCisgICAgdW5zaWduZWQgaW50ICAgICp0cmFjZWFkZHI7CisgICAgdm9pZCAgKnBkZXY7CisgICAgaW50IHBjaUJ1c05vOyAgICAgICAvKiBQQ0kgYnVzIG51bWJlciAqLworICAgIGludCBwY2lEZXZObzsgICAgICAgLyogUENJIGRldmljZSBudW1iZXIgKi8KKyAgICBpbnQgcGNpRnVuY05vOyAgICAgIC8qIFBDSSBmdW5jdGlvbiBudW1iZXIgKi8KKyAgICB1aW50MzJfdCBkZXZfc3RhdHVzX2lycTsKK30gbWFwbGVfZGV2aWNlX2luZm87CisKKy8qIE1hcGxlIGRldmljZSBvYmplY3RzICovCittYXBsZV9kZXZpY2VfaW5mbyBnX21hcGxlX2RldnNfaW5mb1tCQ01PTFRfTUFYX01BUExFX0RFVklDRVNdOworCitpbnQgZ19tYXBsZV9kZXZfbnVtID0gMDsKKworLyogRGV2aWNlIFBDSUUgaW50ZXJmYWNlIHN0YXR1cyBjaGFuZ2UgY2FsbGJhY2sgKi8KK2JjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2UgZ19kZXZfc3RhdHVzX2NoYW5nZV9jYjsKKworLyoqIERldmljZSBzdGF0dXMgY2hhbmdlIElTUgorICogXGlycSAgICAgICAgICBJUlEgbnVtYmVyCisgKiBcZGV2X2luc3RhbmNlIGRldmljZSBvYmplY3QgCisgKi8KK2ludCBkZXZfc3RhdHVzX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworICAgIHVpbnQzMl90IHJlZ192YWx1ZSA9IDA7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvID0gTlVMTDsgICAKKyAgICBsb25nIGZsYWdzID0gMDsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CisgICAgdWludDMyX3QgZGV2X2lkID0gMDsKKyAgICAKKyAgICBkZXZpY2VfaW5mbyA9IChtYXBsZV9kZXZpY2VfaW5mbyAqKWRldl9pbnN0YW5jZTsKKyAgICBkZXZfaWQgPSBkZXZpY2VfaW5mby0+ZGV2aWNlaWQ7CisgICAgCisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZkZXZpY2VfaW5mby0+bG9jayk7CisKKyAgICByZWdfdmFsdWUgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9JTlRfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCkpOworICAgIHsKKyAgICAgICAgaWYgKGRldmljZV9pbmZvLT5kYXRhbGluayAhPSBkZXZpY2VfaW5mby0+cHJldl9kYXRhbGluaykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRldmljZV9pbmZvLT5kYXRhbGluayA9PSBCQ01fTExfUENJRV9MSU5LX1VQKQorICAgICAgICAgICAgICAgIHByaW50ZigiRGV2aWNlPSVkIDogTGluayBpcyB1cCAhISFcbiIsIGRldl9pZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJEZXZpY2U9JWQgOiBMaW5rIGlzIGRvd24gISEhXG4iLCBkZXZfaWQpOworICAgICAgICAgICAgICAgIHByaW50ZigicGh5IHN0YXR1cyA9IDB4JXggZXJyb3Igc3RhdHVzID0gMHgleFxuIiwgZGV2aWNlX2luZm8tPnBoeWxpbmssIGRldmljZV9pbmZvLT5lcnJfc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZV9pbmZvLT5wcmV2X2RhdGFsaW5rID0gZGV2aWNlX2luZm8tPmRhdGFsaW5rOworICAgICAgICAgICAgaWYgKGdfZGV2X3N0YXR1c19jaGFuZ2VfY2IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ19kZXZfc3RhdHVzX2NoYW5nZV9jYihkZXZfaWQsIGRldmljZV9pbmZvLT5kYXRhbGluayk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlZ192YWx1ZSA9IGJjbV9wY2lfcmVhZDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopKGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSArIFBDSUVfSU5UUjFfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCkpOworICAgICAgICB7CisgICAgICAgICAgICBoYW5kbGVkID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmRldmljZV9pbmZvLT5sb2NrLCBmbGFncyk7CisgICAgCisgICAgcmV0dXJuIGhhbmRsZWQ7Cit9CisKKy8qKiBNYXBsZSBkZXZpY2UgZGV0ZWN0aW9uIGFuZCBpbml0aWFsaXphdGlvbgorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9pbnRlcmZhY2VfaW5pdCgpCit7CisgICAgU1RBVFVTIHJldF9zdGF0dXM7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gTlVMTDsgCisgICAgdWludDMyX3QgcmVhZHZhbCA9IDA7CisgICAgdWludDhfdCByZWFkdmFsYiA9IDA7CisgICAgdWludDMyX3QgcGNpX2Rldl9pZHggPSAwOworCisgICAgcHJpbnRmKCIlcygpXHJcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAvLyBjaGVjayBtYXBsZSBkZXZpY2UgbnVtYmVyCisgICAgaWYgKGdfbWFwbGVfZGV2X251bSA+PSBCQ01PTFRfTUFYX01BUExFX0RFVklDRVMpCisgICAgeworICAgICAgICBwcmludGYoIk1heGltdW0gTWFwbGUgZGV2aWNlcyBhbHJlYWR5IGRlZmluZWQgKCVkKVxuIiwgQkNNT0xUX01BWF9NQVBMRV9ERVZJQ0VTKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9IAorCisgICAgLy8gU3VwcG9ydCBtdWx0aXBsZSBNYXBsZSBkZXZpY2VzCisgICAgZm9yIChwY2lfZGV2X2lkeCA9IDA7IHBjaV9kZXZfaWR4IDwgQkNNT0xUX01BWF9NQVBMRV9ERVZJQ0VTOyBwY2lfZGV2X2lkeCsrKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgZGV2aWNlX2lkOworCisgICAgICAgIC8vIEluaXQgZGV2aWNlIG9iamVjdCBzdHJ1Y3QKKyAgICAgICAgZGV2X2luZm8gPSAmZ19tYXBsZV9kZXZzX2luZm9bcGNpX2Rldl9pZHhdOworICAgICAgICBtZW1zZXQoZGV2X2luZm8sIDAsIHNpemVvZihtYXBsZV9kZXZpY2VfaW5mbykpOworICAgICAgICAKKyAgICAgICAgLy8gVHJ5IHRvIGZpbmQgbWFwbGUgZGV2aWNlCisgICAgICAgIHJldF9zdGF0dXMgPSBwY2lGaW5kRGV2aWNlKFBDSUVfTUFQTEVfVkVORE9SX0lELAorICAgICAgICAgICAgUENJRV9NQVBMRV9ERVZJQ0VfSUQsCisgICAgICAgICAgICBwY2lfZGV2X2lkeCwKKyAgICAgICAgICAgICZkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAmZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgJmRldl9pbmZvLT5wY2lGdW5jTm8pOworCisgICAgICAgIGlmIChyZXRfc3RhdHVzID09IE9LKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZpY2VfaWQgPSBQQ0lFX01BUExFX0RFVklDRV9JRDsKKyAgICAgICAgICAgIGdvdG8gZm91bmRfZGV2aWNlX2lkOworICAgICAgICB9CisKKyAgICAgICAgcmV0X3N0YXR1cyA9IHBjaUZpbmREZXZpY2UoUENJRV9NQVBMRV9WRU5ET1JfSUQsCisgICAgICAgICAgICBQQ0lFX01BUExFXzY4NjNfU0tVX0RFVklDRV9JRCwKKyAgICAgICAgICAgIHBjaV9kZXZfaWR4LAorICAgICAgICAgICAgJmRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgICAgICZkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICAgICAmZGV2X2luZm8tPnBjaUZ1bmNObyk7CisKKyAgICAgICAgaWYgKHJldF9zdGF0dXMgPT0gT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGRldmljZV9pZCA9IFBDSUVfTUFQTEVfNjg2M19TS1VfREVWSUNFX0lEOworICAgICAgICAgICAgZ290byBmb3VuZF9kZXZpY2VfaWQ7CisgICAgICAgIH0KKworICAgICAgICByZXRfc3RhdHVzID0gcGNpRmluZERldmljZShQQ0lFX01BUExFX1ZFTkRPUl9JRCwKKyAgICAgICAgICAgIFBDSUVfTUFQTEVfRVBPTl9ERVZJQ0VfSUQsCisgICAgICAgICAgICBwY2lfZGV2X2lkeCwKKyAgICAgICAgICAgICZkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAmZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgJmRldl9pbmZvLT5wY2lGdW5jTm8pOworCisgICAgICAgIGlmIChyZXRfc3RhdHVzID09IE9LKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZpY2VfaWQgPSBQQ0lFX01BUExFX0VQT05fREVWSUNFX0lEOworICAgICAgICAgICAgZ290byBmb3VuZF9kZXZpY2VfaWQ7CisgICAgICAgIH0KKworICAgICAgICBwcmludGYoIk5vIG1vcmUgZGV2aWNlcywgRm91bmQgJWQgbWFwbGUgZGV2aWNlKHMpXG4iLCBnX21hcGxlX2Rldl9udW0pOworICAgICAgICBicmVhazsKKworZm91bmRfZGV2aWNlX2lkOgorICAgICAgICAvLyBGb3VuZCBuZXcgTWFwbGUgZGV2aWNlCisgICAgICAgIHByaW50ZigiRm91bmQgbWFwbGUgZGV2aWNlWyV4IC0gJXhdWyVkXSBAIEJ1cyAlZCwgRGV2ICVkLCBGdW5jICVkXG4iLCAKKyAgICAgICAgICAgIFBDSUVfTUFQTEVfVkVORE9SX0lELCBQQ0lFX01BUExFX0RFVklDRV9JRCwgcGNpX2Rldl9pZHgsCisgICAgICAgICAgICBkZXZfaW5mby0+cGNpQnVzTm8sIGRldl9pbmZvLT5wY2lEZXZObywgZGV2X2luZm8tPnBjaUZ1bmNObyk7CisgICAgICAgIGdfbWFwbGVfZGV2X251bSArPSAxOworICAgICAgICAKKyAgICAgICAgLy8gaW5pdCAgICAKKyAgICAgICAgZGV2X2luZm8tPmRldmljZWlkID0gcGNpX2Rldl9pZHg7CisgICAgICAgIGRldl9pbmZvLT5wZGV2ID0gTlVMTDsgICAgICAgIAorICAgIAorCisgICAgICAgIC8vIEVuYWJsZSBQQ0kgYWRkcmVzcyBtYXAKKyAgICAgICAgcGNpQ29uZmlnSW5CeXRlKGRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lEZXZObywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lGdW5jTm8sCisgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQ0ZHX0NPTU1BTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDggKikmcmVhZHZhbGIpOworICAgICAgICBwcmludGYoIkNNRCByZWcgPSAweCV4XG4iLCByZWFkdmFsYik7CisKKyAgICAgICAgcmVhZHZhbGIgfD0gMHg2OworICAgICAgICBwY2lDb25maWdPdXRCeXRlKGRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lEZXZObywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lGdW5jTm8sCisgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQ0ZHX0NPTU1BTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgpcmVhZHZhbGIpOworCisgICAgICAgIHBjaUNvbmZpZ0luQnl0ZShkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRnVuY05vLAorICAgICAgICAgICAgICAgICAgICAgICAgUENJX0NGR19DT01NQU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4ICopJnJlYWR2YWxiKTsKKyAgICAgICAgcHJpbnRmKCJBZGp1c3RlZCBDTUQgcmVnID0gMHgleFxuIiwgcmVhZHZhbGIpOworCisgICAgICAgIC8vIEluaXQgYmFzZSBhZGRyZXNzZXMKKworI2lmZGVmIExMUENJRV9TRVRfQkFTRV9BRERSRVNTRVNfTUFOVUFMTFkgCisgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlID0gbGxwY2llX2Jhc2VfYWRkcmVzc2VzLnNvY19yZWdzX2Jhc2U7CisgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2Nfc3JhbV9iYXNlID0gbGxwY2llX2Jhc2VfYWRkcmVzc2VzLnNvY19zcmFtX2Jhc2U7CisgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2NfZGRyX2Jhc2UgID0gbGxwY2llX2Jhc2VfYWRkcmVzc2VzLnNvY19kZHJfYmFzZTsKKyAgICAgICBkZXZfaW5mby0+ZGV2aWNlLnNvY19kZHJfbGVuZ3RoID0gTUFQTEVfRERSX0xFTkdUSDsgLy8gMTZNICovCisjZWxzZQorICAgICAgICBwY2lDb25maWdJbkxvbmcoZGV2X2luZm8tPnBjaUJ1c05vLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaUZ1bmNObywKKyAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9DRkdfQkFTRV9BRERSRVNTXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDMyICopJnJlYWR2YWwpOworICAgICAgICBwcmludGYoIkJBUjAgPSAweCV4XG4iLCByZWFkdmFsKTsKKyAgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlID0gKHJlYWR2YWwgJiBQQ0lfTUVNQkFTRV9NQVNLKTsKKworICAgICAgICBwY2lDb25maWdJbkxvbmcoZGV2X2luZm8tPnBjaUJ1c05vLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaUZ1bmNObywKKyAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9DRkdfQkFTRV9BRERSRVNTXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDMyICopJnJlYWR2YWwpOworICAgICAgICBwcmludGYoIkJBUjIgPSAweCV4XG4iLCByZWFkdmFsKTsKKyAgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2NfZGRyX2Jhc2UgPSAocmVhZHZhbCAmIFBDSV9NRU1CQVNFX01BU0spOworICAgICAgICBkZXZfaW5mby0+ZGV2aWNlLnNvY19kZHJfbGVuZ3RoID0gTUFQTEVfRERSX0xFTkdUSDsgICAgICAgICAvLyAxNk0gICAgICAgICAgIAorCisgICAgICAgIHBjaUNvbmZpZ0luTG9uZyhkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRnVuY05vLAorICAgICAgICAgICAgICAgICAgICAgICAgUENJX0NGR19CQVNFX0FERFJFU1NfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UMzIgKikmcmVhZHZhbCk7CisgICAgICAgIHByaW50ZigiQkFSNCA9IDB4JXhcbiIsIHJlYWR2YWwpOworICAgICAgICBkZXZfaW5mby0+ZGV2aWNlLnNvY19zcmFtX2Jhc2UgPSAocmVhZHZhbCAmIFBDSV9NRU1CQVNFX01BU0spOyAgIAorI2VuZGlmICAgICAgICAgICAgIAorCisgICAgICAgIHByaW50ZigiUmVncyBCYXNlID0gMHglbHgsIEREUiBCYXNlID0gMHglbHgsIEREUiBMZW5ndGggPSAweCV4LCBTUkFNIEJhc2UgPSAweCVseFxuIiwKKyAgICAgICAgICAgIGRldl9pbmZvLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSwKKyAgICAgICAgICAgIGRldl9pbmZvLT5kZXZpY2Uuc29jX2Rkcl9iYXNlLAorICAgICAgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2NfZGRyX2xlbmd0aCwKKyAgICAgICAgICAgIGRldl9pbmZvLT5kZXZpY2Uuc29jX3NyYW1fYmFzZSk7CisKKyAgICAgICAgLy8gaW5pdCBpbnRlcnJ1cHQKKyAgICAgICAgZGV2X2luZm8tPmRldmljZS5pcnEgPSBsbHBjaWVfZGV2aWNlX2lycXNbcGNpX2Rldl9pZHhdLmxscGNpZV9pcnE7CisgICAgICAgIGRldl9pbmZvLT5kZXZfc3RhdHVzX2lycSA9IGxscGNpZV9kZXZpY2VfaXJxc1twY2lfZGV2X2lkeF0ubGxwY2llX3N0YXR1c19pcnE7CisgICAgICAgIHByaW50ZigiRE1BIElSUSA9ICVkLCBEZXZpY2Ugc3RhdHVzIElSUSA9ICVkXG4iLCAKKyAgICAgICAgICAgIGRldl9pbmZvLT5kZXZpY2UuaXJxLCBkZXZfaW5mby0+ZGV2X3N0YXR1c19pcnEpOworICAgICAgICAgICAgICAgIAorICAgICAgICAvLyByZWFkIHJldmlzaW9uIHJlZ2lzdGVyCisgICAgICAgIHJlYWR2YWwgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2X2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9SRVZJU0lPTl9SRUdJU1RFUl9PRkZTRVQpKTsKKyAgICAgICAgcHJpbnRmKCJyZWFkdmFsID0gMHgleFxuIiwgcmVhZHZhbCk7CisgICAgICAgIHByaW50ZigiQ2FyZCAlZCB2ZXJzaW9uIG1ham9yPSUwMnggbWlub3I9JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPmRldmljZWlkLCAKKyAgICAgICAgICAgICAgICAgICAgKChyZWFkdmFsICYgMHgwMDAwZmYwMCkgPj4gOCksCisgICAgICAgICAgICAgICAgICAgIChyZWFkdmFsICYgMHgwMDAwMDBmZikpOyAKKyAgICAgICAgCisgICAgICAgIC8vIHJlYWQgc3RhdHVzIHJlZ2lzdGVyCisgICAgICAgIHJlYWR2YWwgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2X2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUKSk7CisgICAgICAgIHByaW50ZigicmVhZHZhbCA9IDB4JXhcbiIsIHJlYWR2YWwpOworICAgICAgICBkZXZfaW5mby0+ZXJyX3N0YXR1cyA9IChyZWFkdmFsICYgMHgwMDAwMDAwZik7CisgICAgICAgIGRldl9pbmZvLT5waHlsaW5rICAgID0gKChyZWFkdmFsID4+IDQpICYgMHgxKTsKKyAgICAgICAgZGV2X2luZm8tPmRhdGFsaW5rICAgPSAoKHJlYWR2YWwgPj4gNSkgJiAweDEpOworICAgICAgICBkZXZfaW5mby0+cHJldl9kYXRhbGluayAgPSBkZXZfaW5mby0+ZGF0YWxpbms7CisKKyAgICAgICAgLy8gY29ubmVjdCBJTlQgZm9yIGRldmljZSBzdGF0dXMKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmZGV2X2luZm8tPmxvY2ssIDApOworICAgICAgICBiY21vc19pbnRfY29ubmVjdCgoaW50KWRldl9pbmZvLT5kZXZfc3RhdHVzX2lycSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT1NfSVJRX1NIQVJFRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X3N0YXR1c19pbnRlcnJ1cHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXNfaXNyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8pOworICAgIH0KKworICAgIC8vIFJldHVybiBzdGF0dXMKKyAgICBpZiAoMCA+PWdfbWFwbGVfZGV2X251bSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PREVWOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9Cit9CisKKy8qKiBHZXQgTWFwbGUgZGV2aWNlIG9iamVjdCBzdHJ1Y3QKKyAqIFxjcnQgZGV2aWUgaW5kZXgsc3RhcnQgZnJvbSAwCisgKi8KK3N0YXRpYyBtYXBsZV9kZXZpY2VfaW5mbyAqZ2V0X21hcGxlX3BjaV9pbmZvKGludCBjcnQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICB1aW50MzJfdCByZWFkdmFsID0gMDsKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm8gPSBOVUxMOworCisgICAgLyogY2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCisgICAgLyogZG9uJ3QgYWNjZXNzIGludmFsaWQgZGV2aWNlIHJlZ3MgYmFzZSBhZGRyZXNzICovCisgICAgaWYgKGNydCA+PSBnX21hcGxlX2Rldl9udW0pCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGV2aWNlX2luZm8gPSAmZ19tYXBsZV9kZXZzX2luZm9bY3J0XTsKKworICAgIC8qIHJlYWQgc3RhdHVzIHJlZ2lzdGVyICovCisgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQpKTsKKyAgICBkZXZpY2VfaW5mby0+ZXJyX3N0YXR1cyA9IChyZWFkdmFsICYgMHgwMDAwMDAwZik7CisgICAgZGV2aWNlX2luZm8tPnBoeWxpbmsgICAgPSAoKHJlYWR2YWwgPj4gNCkgJiAweDEpOworICAgIGRldmljZV9pbmZvLT5kYXRhbGluayAgID0gKChyZWFkdmFsID4+IDUpICYgMHgxKTsKKworICAgIC8qIHJldHVybiBkZXZpY2UgKi8KKyAgICByZXR1cm4gZGV2aWNlX2luZm87Cit9CisKKy8qKiBSZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHBhcmFtW2luXSAgIGNiICAgICAgU3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqIFxyZXR1cm4gMD1PSyBvciBlcnJvciA8MCAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZV9yZWdpc3RlcihiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlIGNiKQoreworICAgIGludCBpOworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZfaW5mbzsgCisgICAgCisgICAgZ19kZXZfc3RhdHVzX2NoYW5nZV9jYiA9IGNiOworICAgIGZvciAoaSA9IDA7IGkgPCBnX21hcGxlX2Rldl9udW07IGkrKykKKyAgICB7CisgICAgICAgIGRldl9pbmZvID0gZ2V0X21hcGxlX3BjaV9pbmZvKGkpOworICAgICAgICBnX2Rldl9zdGF0dXNfY2hhbmdlX2NiKGksIGRldl9pbmZvLT5kYXRhbGluayk7CisgICAgfQorICAgIAorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogVW5yZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHJldHVybiAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfdW5yZWdpc3Rlcih2b2lkKQoreworICAgIGdfZGV2X3N0YXR1c19jaGFuZ2VfY2IgPSBOVUxMOworICAgIAorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogUXVlcnkgUENJZSBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHBhcmFtW291dF0gIGluZm8gICAgRGV2aWNlIGluZm8KKyAqIFxyZXR1cm4gMD1PSywgQkNNX0VSUl9JTy1kZXZfaWQgaXMgaW4gcHJvcGVyIHJhbmdlLCBidXQgbGluayBpcyBkb3duCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3F1ZXJ5KHVpbnQ4X3QgZGV2X2lkLCBiY21fbGxfZGV2X2luZm8gKmluZm8pCit7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gTlVMTDsgCisKKyAgICAvKiBjaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8gICAgCisgICAgaWYgKE5VTEwgPT0gaW5mbykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogZG9uJ3QgYWNjZXNzIGludmFsaWQgZGV2aWNlIHJlZ3MgYmFzZSBhZGRyZXNzICovCisgICAgaWYgKGRldl9pZCA8IGdfbWFwbGVfZGV2X251bSkKKyAgICB7CisgICAgICAgIGRldl9pbmZvID0gZ2V0X21hcGxlX3BjaV9pbmZvKGRldl9pZCk7CisgICAgICAgIGlmIChOVUxMID09IGRldl9pbmZvKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2X2luZm8tPmRhdGFsaW5rID09IEJDTV9MTF9QQ0lFX0xJTktfRE9XTikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisgICAgICAgIH0KKworICAgICAgICAqaW5mbyA9IGRldl9pbmZvLT5kZXZpY2U7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsgICAKK30KKworLyoqIEdldCBsb3ctbGV2ZWwgZGV2aWNlIGhhbmRsZQorICogXHBhcmFtW2luXSAgIGRldl9pZCAgRGV2aWNlIGlkCisgKiBccGFyYW1bb3V0XSAgbGxkZXYgICBMb3ctbGV2ZWwgZGV2aWNlIGhhbmRsZSAKKyAqIFxyZXR1cm4gZGV2aWNlIGhhbmRsZSBvciBOVUxMIGlmIGxpbmsgaXMgZG93bgorICovCitiY21fbGxfcGNpZV9kZXYgYmNtX2xsX3BjaWVfZGV2X2dldCh1aW50OF90IGRldl9pZCkKK3sKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSBOVUxMOyAKKworICAgIC8qIGNoZWNrIGlucHV0IHBhcmFtZXRlciAqLworICAgIC8qIGRvbid0IGFjY2VzcyBpbnZhbGlkIGRldmljZSByZWdzIGJhc2UgYWRkcmVzcyAqLworICAgIGlmIChkZXZfaWQgPCBnX21hcGxlX2Rldl9udW0pCisgICAgeworICAgICAgICBkZXZfaW5mbyA9IGdldF9tYXBsZV9wY2lfaW5mbyhkZXZfaWQpOworICAgICAgICBpZiAoTlVMTCA9PSBkZXZfaW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGV2X2luZm8tPnBkZXY7CisgICAgICAgIH0KKyAgICB9IAorICAgIAorICAgIHJldHVybiBOVUxMOworfQorCisvKiogSG9zdCByZXNldCBlbmFibGUgCisgKiBcZW5hYmxlZCAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfaG9zdF9yZXNldF9lbmFibGUodWludDhfdCBkZXZfaWQsIGJjbW9zX2Jvb2wgZW5hYmxlZCkKK3sKKyAgICB1aW50MzJfdCB2YWw7CisKKyAgICAvKiBjaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KKyAgICAvKiBkb24ndCBhY2Nlc3MgaW52YWxpZCBkZXZpY2UgcmVncyBiYXNlIGFkZHJlc3MgKi8KKyAgICBpZiAoZGV2X2lkID49IGdfbWFwbGVfZGV2X251bSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKyAgICAKKyAgICB2YWwgPSBlbmFibGVkID8gMCA6IDE7CisgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKShnX21hcGxlX2RldnNfaW5mb1tkZXZfaWRdLmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9IQVJEX0RFQlVHX1JFR0lTVEVSX09GRlNFVCksIAorICAgICAgICAgICAgdmFsKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvdnh3b3Jrcy9tdWx0aV9kZXZpY2UvYmNtb2x0X2xscGNpZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL3Z4d29ya3MvbXVsdGlfZGV2aWNlL2JjbW9sdF9sbHBjaWUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNDBkNTY1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL3Z4d29ya3MvbXVsdGlfZGV2aWNlL2JjbW9sdF9sbHBjaWUuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbV9sbHBjaWUuaCAtIExvdy1sZXZlbCBQQ0llIGRyaXZlciBpbnRlcmZhY2UKKyAqLworCisjaWZuZGVmIEJDTU9MVF9MTFBDSUVfSF8KKyNkZWZpbmUgQkNNT0xUX0xMUENJRV9IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjZGVmaW5lIEJDTU9MVF9NQVhfTUFQTEVfREVWSUNFUyAgICAgICAgICAgICAgIDIgLyogNSAqLworCisvKiogTG93LWxldmVsIGRldmljZSBpbmZvICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbGxfZGV2X2luZm8KK3sKKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3JlZ3NfYmFzZTsgICAgICAvKio8IERldmljZSByZWdpc3RlcnMgYmFzZSBpbiBob3N0IGFkZHJlc3Mgc3BhY2UgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3NyYW1fYmFzZTsgICAgICAvKio8IERldmljZSBTUkFNIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19kZHJfYmFzZTsgICAgICAgLyoqPCBEZXZpY2UgRERSIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdWludDMyX3QgICAgICAgIHNvY19kZHJfbGVuZ3RoOyAgICAgLyoqPCBEZXZpY2UgRERSIHdpbmRvdyBzaXplICovCisgICAgdWludDMyX3QgICAgICAgIGlycTsgICAgICAgICAgICAgICAgLyoqPCBEZXZpY2UgaXJxIG51bWJlciAqLworfSBiY21fbGxfZGV2X2luZm87CisKKy8qKiBEZXZpY2UgUENJZSBsaW5rIHN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGNhbGxiYWNrICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01fTExfUENJRV9MSU5LX0RPV04sICAgICAgICAgICAgIC8qKjwgUENJZSBsaW5rIGlzIGRvd24gKi8KKyAgICBCQ01fTExfUENJRV9MSU5LX1VQLCAgICAgICAgICAgICAgIC8qKjwgUENJZSBsaW5rIGlzIHVwICovCit9IGJjbV9sbF9wY2llX2xpbmtfc3RhdHVzOworCisvKiogTG93LWxldmVsIGRldmljZSBoYW5kbGUgKi8KK3R5cGVkZWYgdm9pZCAqYmNtX2xsX3BjaWVfZGV2OworCisvKiogU3RhdHVzIGNoYW5nZSBpbmRpY2F0aW9uICovCit0eXBlZGVmIHZvaWQgKCpiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlKSh1aW50OF90IGRldl9pZCwgYmNtX2xsX3BjaWVfbGlua19zdGF0dXMgc3RhdHVzKTsKKworLyoqIFJlZ2lzdGVyIHN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgY2IgICAgICBTdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHJldHVybiAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfcmVnaXN0ZXIoYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZSBjYik7CisKKy8qKiBVbnJlZ2lzdGVyIHN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZV91bnJlZ2lzdGVyKHZvaWQpOworCisvKiogUXVlcnkgUENJZSBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHBhcmFtW291dF0gIGluZm8gICAgRGV2aWNlIGluZm8KKyAqIFxyZXR1cm4gMD1PSywgQkNNX0VSUl9JTy1kZXZfaWQgaXMgaW4gcHJvcGVyIHJhbmdlLCBidXQgbGluayBpcyBkb3duCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3F1ZXJ5KHVpbnQ4X3QgZGV2X2lkLCBiY21fbGxfZGV2X2luZm8gKmluZm8pOworCisvKiogR2V0IGxvdy1sZXZlbCBkZXZpY2UgaGFuZGxlCisgKiBccGFyYW1baW5dICAgZGV2X2lkICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtvdXRdICBsbGRldiAgIExvdy1sZXZlbCBkZXZpY2UgaGFuZGxlIAorICogXHJldHVybiBkZXZpY2UgaGFuZGxlIG9yIE5VTEwgaWYgbGluayBpcyBkb3duCisgKi8KK2JjbV9sbF9wY2llX2RldiBiY21fbGxfcGNpZV9kZXZfZ2V0KHVpbnQ4X3QgZGV2X2lkKTsKKworLyoqIEVuYWJsZS9kaXNhYmxlIGhvc3QgcmVzZXQgZm9yIGFsbCBQQ0llIGludGVyZmFjZXMgKGF1dG9tYXRpYworICogIGRldmljZSByZXNldCB3aGVuIGhvc3QgaXMgcmVzZXQpCisgKiBccGFyYW1baW5dICAgZW5hYmxlZCBXaGV0aGVyIG9yIG5vdCBob3QgcmVzZXQgc2hvdWxkIGJlIGVuYWJsZWQKKyAqIFxyZXR1cm4gMD1PSyBvciBlcnJvciA8MAorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9ob3N0X3Jlc2V0X2VuYWJsZSh1aW50OF90IGRldl9pZCwgYmNtb3NfYm9vbCBlbmFibGVkKTsKKworI2lmZGVmIFRYX0VOQUJMRV9FVkVOVF9UUkFDRQorLyoqIEhhbmRsZSBsb3ctbGV2ZWwgdHJhY2Ugb24gdGFyZ2V0CisgKiBccGFyYW1baW5dICAgZGV2X2lkICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gIGxmaWxlIG5hbWUgZm9yIHRyYWNlCisgKiBccmV0dXJuIGRldmljZSBoYW5kbGUgb3IgTlVMTCBpZiBsaW5rIGlzIGRvd24KKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfc2V0cmFjZSh1aW50OF90IGRldl9pZCk7CitiY21vc19lcnJubyBiY21fbGxfcGNpZV9jbGVhcnRyYWNlKHVpbnQ4X3QgZGV2X2lkKTsKK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3NhdmV0cmFjZSh1aW50OF90IGRldl9pZCwgY2hhciAqdHJhY2VmaWxlbmFtZSk7CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9tb2RlbF9saW51eC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbW9kZWxfbGludXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjNWMzMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbW9kZWxfbGludXgvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorIyBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgc3lzdGVtIG1vZGVsIGFzIGxpbnV4IG1vZHVsZQorIworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisKK01PRF9OQU1FID0gc3lzbW9kZWwKK01PRF9ERVBTID0gdXRpbHMgY29tbW9uX2FwaSAKK01PRF9UWVBFID0gbGludXhfbGliCitTUkNfRElSID0gJChNT0RFTF9PVVRfRElSKS9saW51eAorc3JjcyA9IGJjbW9sdF9tb2RlbF90eXBlcy5jIGJjbW9sdF9tc2dfcGFjay5jCisKKyQoc2hlbGwgbWtkaXIgLXAgJChTUkNfRElSKTsgbG4gLXMgJChNT0RFTF9PVVRfRElSKS8qLltjaF0gJChTUkNfRElSKS8gMj4gL2Rldi9udWxsKQorCSAKKyMgSWYgY2FsbGVkIGJ5IGxpbnV4IGtlcm5lbCBidWlsZGVyIC0gYWRkIGluY2x1ZGUgcGF0aHMgbWFudWFsbHkuCisjIEl0IGlzIG5vdCBlbGVnYW50LCBidXQgd2UnbGwgbm90IGhhdmUgbWFueSBsaW51eCBtb2R1bGVzCitpZm5lcSAoIiQoS0JVSUxEX1NSQykiLCAiIikKKwktaW5jbHVkZSAkKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpCitlbmRpZgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZjQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vTWFrZWZpbGUKQEAgLTAsMCArMSw1MSBAQAorIyBPUyBhYnN0cmFjdGlvbiBsYXllcgorIworTU9EX05BTUUgPSBvcworTU9EX1RZUEUgPSBsaWIKK01PRF9JTkNfRElSUyA9ICQoU1JDX0RJUikgJChTUkNfRElSKS8kKE9TKQorTU9EX0lOQ19ESVJTICs9ICQoT1NfUExBVEZPUk1fRElSKSAkKENPTkZJR19ESVIpCitNT0RfU1VQUFJFU1NfT1NfREVQID0geQorCitpZmVxICgiJChPUykiLCAidGhyZWFkeCIpCisJTU9EX0RFUFMgPSB0aHJlYWR4IGJzcAorCU1PRF9JTkNfRElSUyArPSAkKFNVQlNZU1RFTSkvc3lzL2luYworCU1PRF9ERUZTID0gLURCQ01PU19UUkFDRV9JTl9ERVZfTE9HCitlbmRpZgorCitpZmVxICgiJChPUykiLCAicG9zaXgiKQorCUVOQUJMRV9NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVCA/PSB5CisJRU5BQkxFX01TR19RVUVVRV9VRFBfU09DS0VUID89IHkKK2VuZGlmCisKK2lmZXEgKCIkKEVOQUJMRV9NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVCkiLCAieSIpCisJTU9EX0RFRlMgKz0gLURCQ01PU19NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVAorZW5kaWYKKworaWZlcSAoIiQoRU5BQkxFX01TR19RVUVVRV9VRFBfU09DS0VUKSIsICJ5IikKKwlNT0RfREVGUyArPSAtREJDTU9TX01TR19RVUVVRV9VRFBfU09DS0VUCitlbmRpZgorCitpZmVxICgiJChCVUZfSU5fRE1BX01FTSkiLCAieSIpCisJRVhUUkFfQ0ZMQUdTICs9IC1EQkNNT1NfQlVGX0lOX0RNQV9NRU0KKyAgICBCVUZfREFUQV9VTklUX1NJWkUgPz0gMTAyNAorCUVYVFJBX0NGTEFHUyArPSAtREJDTU9TX0JVRl9EQVRBX1VOSVRfU0laRT0kKEJVRl9EQVRBX1VOSVRfU0laRSkKK2VuZGlmCisKK2lmbmVxICgiJChCVUZfUE9PTF9TSVpFKSIsICIiKQorICAgIGlmZXEgKCIkKEJVRl9QT09MX0JVRl9TSVpFKSIsICIiKQorICAgICAgICBCVUZfUE9PTF9CVUZfU0laRSA9IDQwOTYKKyAgICBlbmRpZgorICAgIEVYVFJBX0NGTEFHUyArPSAtREJDTU9TX0JVRl9QT09MX1NJWkU9JChCVUZfUE9PTF9TSVpFKSAtREJDTU9TX0JVRl9QT09MX0JVRl9TSVpFPSQoQlVGX1BPT0xfQlVGX1NJWkUpCitlbmRpZgorCitzcmNzICA9IGJjbW9zX2NvbW1vbi5jIGJjbW9zX2Vycm5vLmMgYmNtb3NfaGFzaF90YWJsZS5jIGJjbW9zX3J3X2xvY2suYyAkKE9TKS9iY21vc19zeXN0ZW0uYworCitpZmVxICgiJChERUJVRykiLCAieSIpCisJTU9EX0RFRlMJKz0gLURCQ01PU19NRU1fREVCVUcgLURCQ01PU19TWVNfVU5JVFRFU1QKK2VuZGlmCisKK2lmZXEgKCIkKFNVQlNZU1RFTSkiLCAiZW1iZWRkZWQiKQorICAgIFVTRV9MSU5UID0geWVzCitlbmRpZgorCisjRVhUUkFfREVGSU5FUyArPSAtREJDTU9TX1NZU19VTklUVEVTVApkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19jb21tb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkNTUyYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfY29tbW9uLmMKQEAgLTAsMCArMSwyNzcyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisKKy8qIHRhc2sgY29udHJvbCBibG9ja3MgKi8KK1NUQUlMUV9IRUFEKHRhc2tfbGlzdCwgYmNtb3NfdGFzaykgdGFza19saXN0ID0gU1RBSUxRX0hFQURfSU5JVElBTElaRVIodGFza19saXN0KTsKKworLyogbW9kdWxlIGNvbnRyb2wgYmxvY2tzICovCitiY21vc19tb2R1bGUgKmJjbW9zX21vZHVsZXNbQkNNT1NfTU9EVUxFX0lEX19OVU1fT0ZdOworCisvKiBldmVudCBjb250cm9sIGJsb2NrcyAqLworYmNtb3NfZXZlbnQgKmJjbW9zX2V2ZW50c1tCQ01PU19FVkVOVF9JRF9fTlVNX09GXTsKKworLyogR2xvYmFsIHRyYWNlIGxldmVsICovCitiY21vc190cmFjZV9sZXZlbCBiY21vc19zeXNfdHJhY2VfbGV2ZWwgPSBCQ01PU19UUkFDRV9MRVZFTF9FUlJPUjsKKworLyogR2xvYmFsIE9TIG11dGV4ICovCitiY21vc19tdXRleCBiY21vc19yZXNfbG9jazsKKworLyogVG90YWwgbWVtb3J5IG9jY3VwaWVkIGJ5IGJsb2NrIHBvb2xzICovCit1aW50MzJfdCBiY21vc190b3RhbF9ibGtfcG9vbF9zaXplOworCisvKiBUb3RhbCBtZW1vcnkgb2NjdXBpZWQgYnkgbWVzc2FnZSBwb29scyAqLwordWludDMyX3QgYmNtb3NfdG90YWxfbXNnX3Bvb2xfc2l6ZTsKKworZl9iY21vbHRfc3dfZXJyb3JfaGFuZGxlciBzd19lcnJvcl9oYW5kbGVyOworCisvKiBCbG9jayBwb29scyAqLworc3RhdGljIFNUQUlMUV9IRUFEKGJsa19wb29sX2xpc3QsIGJjbW9zX2Jsa19wb29sKSBibGtfcG9vbF9saXN0ID0gU1RBSUxRX0hFQURfSU5JVElBTElaRVIoYmxrX3Bvb2xfbGlzdCk7CisKKy8qIE1lc3NhZ2UgcG9vbHMgKi8KK3N0YXRpYyBTVEFJTFFfSEVBRChtc2dfcG9vbF9saXN0LCBiY21vc19ibGtfcG9vbCkgbXNnX3Bvb2xfbGlzdCA9IFNUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKG1zZ19wb29sX2xpc3QpOworCisvKiBNZXNzYWdlIHF1ZXVlcyAqLworc3RhdGljIFNUQUlMUV9IRUFEKG1zZ19xdWV1ZV9saXN0LCBiY21vc19tc2dfcXVldWUpIG1zZ19xdWV1ZV9saXN0ID0gU1RBSUxRX0hFQURfSU5JVElBTElaRVIobXNnX3F1ZXVlX2xpc3QpOworCisvKiBNZXNzYWdlIHF1ZXVlIGdyb3VwcyAqLworc3RhdGljIFNUQUlMUV9IRUFEKG1zZ19xZ3JvdXBfbGlzdCwgYmNtb3NfbXNnX3Fncm91cCkgbXNnX3Fncm91cF9saXN0ID0gU1RBSUxRX0hFQURfSU5JVElBTElaRVIobXNnX3Fncm91cF9saXN0KTsKKworLyogTG9jayB1c2VkIHRvIHByb3RlY3QgbXNnIHJlZ2lzdHJhdGlvbiAvIGRlcmVnaXN0cmF0aW9uICovCitzdGF0aWMgYmNtb3NfZmFzdGxvY2sgYmNtb3NfbXNnX3JlZ2lzdGVyX2xvY2s7CisKKy8qIFNodXRkb3duIG1vZGU6IHdoZW4gdGhpcyBpcyBzZXQsIHdlIGV4cGVjdCBtZXNzYWdlIGhhbmRsZXIgZGVyZWdpc3RyYXRpb24gdG8gaGFwcGVuIHdoaWxlIG1lc3NhZ2VzIGFyZSBzdGlsbCBiZWluZworICogc2VudC9yZWNlaXZlZC4gV2Ugc2hvdWxkIGhhbmRsZSB0aGlzIGdyYWNlZnVsbHkuICovCitzdGF0aWMgYmNtb3NfYm9vbCBiY21vc19tc2dfc2h1dGRvd25fbW9kZSA9IEJDTU9TX0ZBTFNFOworCisvKiBUaW1lciBtYW5hZ2VtZW50IGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY21vc190aW1lcl9wb29sCit7CisgICAgYmNtb3NfZmFzdGxvY2sgbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb29sIHByb3RlY3Rpb24gbG9jayAqLworICAgIGJjbW9zX3N5c190aW1lciBzeXNfdGltZXI7ICAgICAgICAgICAgICAgICAgLyogU3lzdGVtIHRpbWVyIGhhbmRsZSAqLworICAgIHVpbnQzMl90IG51bV9hY3RpdmVfdGltZXJzOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGFjdGl2ZSB0aW1lcnMgaW4gdGhlIHBvb2wgKi8KKyNpZmRlZiBCQ01PU19USU1FUl9SQl9UUkVFCisgICAgUkJfSEVBRChiY21vc190aW1lcnMsIGJjbW9zX3RpbWVyKSBwb29sOyAgICAvKiBUaW1lciBwb29sLiBSQiB0cmVlICovCisjZWxzZQorICAgIFRBSUxRX0hFQUQoYmNtb3NfdGltZXJzLCBiY21vc190aW1lcikgcG9vbDsgLyogVGltZXIgcG9vbDogVEFJTFEgKi8KKyNlbmRpZgorfSBiY21vc190aW1lcl9wb29sOworCitzdGF0aWMgaW50MzJfdCBfYmNtb3NfdGltZXJfY29tcGFyZShiY21vc190aW1lciAqdDEsIGJjbW9zX3RpbWVyICp0Mik7CisKKy8qCisgKiBNYWNyb3MgZm9yIFJCLVRSRUUgYW5kIFRBSUxRLWJhc2VkIHRpbWVyIHRvb2wgaW1wbGVtZW50YXRpb25zCisgKi8KKworI2lmZGVmIEJDTU9TX1RJTUVSX1JCX1RSRUUKKworI2lmZGVmIF9fYXJtX18KKy8qIEFSTSBjb21waWxlciBkb2Vzbid0IGxpa2UgdW51c2VkIGlubGluZSBmdW5jdGlvbnMuIERpc2FibGUgdGhlIHdhcm5pbmcgKi8KKyNwcmFnbWEgZGlhZ19zdXBwcmVzcyAxNzcKKyNlbmRpZgorCisvKiBHZW5lcmF0ZSBSQiB0cmVlIGZ1bmN0aW9ucyAqLworUkJfR0VORVJBVEVfSU5MSU5FKGJjbW9zX3RpbWVycywgYmNtb3NfdGltZXIsIGVudHJ5LCBfYmNtb3NfdGltZXJfY29tcGFyZSkKKworI2RlZmluZSBUTVJfUE9PTF9JTklUKHRtcl9wb29sKSAgICAgICAgICAgICAgICAgUkJfSU5JVCgmKHRtcl9wb29sKS0+cG9vbCkKKyNkZWZpbmUgVE1SX1BPT0xfSU5TRVJUKHRtcl9wb29sLCB0bXIpICAgICAgICAgIFJCX0lOU0VSVChiY21vc190aW1lcnMsICYodG1yX3Bvb2wpLT5wb29sLCB0bXIpCisjZGVmaW5lIFRNUl9QT09MX1JFTU9WRSh0bXJfcG9vbCwgdG1yKSAgICAgICAgICBSQl9SRU1PVkUoYmNtb3NfdGltZXJzLCAmKHRtcl9wb29sKS0+cG9vbCwgdG1yKQorI2RlZmluZSBUTVJfUE9PTF9GSVJTVCh0bXJfcG9vbCkgICAgICAgICAgICAgICAgUkJfTUlOKGJjbW9zX3RpbWVycywgJih0bXJfcG9vbCktPnBvb2wpCisKKyNlbHNlCisKKyNkZWZpbmUgVE1SX1BPT0xfSU5JVCh0bXJfcG9vbCkgICAgICAgICAgICAgICAgIFRBSUxRX0lOSVQoJih0bXJfcG9vbCktPnBvb2wpCisKKyNkZWZpbmUgVE1SX1BPT0xfSU5TRVJUKHRtcl9wb29sLCB0bXIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiY21vc190aW1lciAqX2xhc3QgPSBUQUlMUV9MQVNUKCYodG1yX3Bvb2wpLT5wb29sLCBiY21vc190aW1lcnMpOyAgICBcCisgICAgICAgIGlmIChfbGFzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChfYmNtb3NfdGltZXJfY29tcGFyZSh0bXIsIF9sYXN0KSA+PSAwKSAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCYodG1yX3Bvb2wpLT5wb29sLCB0bXIsIGVudHJ5KTsgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJjbW9zX3RpbWVyICpfdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpdGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgVEFJTFFfRk9SRUFDSChfdCwgJih0bXJfcG9vbCktPnBvb2wsIGVudHJ5KSAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgQlVHX09OKGl0ZXIgPj0gKHRtcl9wb29sKS0+bnVtX2FjdGl2ZV90aW1lcnMpO1wKKyAgICAgICAgICAgICAgICAgICAgKytpdGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmIChfYmNtb3NfdGltZXJfY29tcGFyZSh0bXIsIF90KSA8PSAwKSAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRBSUxRX0lOU0VSVF9CRUZPUkUoX3QsIHRtciwgZW50cnkpOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVEFJTFFfSU5TRVJUX0hFQUQoJih0bXJfcG9vbCktPnBvb2wsIHRtciwgZW50cnkpOyAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICsrKHRtcl9wb29sKS0+bnVtX2FjdGl2ZV90aW1lcnM7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVE1SX1BPT0xfUkVNT1ZFKHRtcl9wb29sLCB0bXIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCVUdfT04oISh0bXJfcG9vbCktPm51bV9hY3RpdmVfdGltZXJzKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVEFJTFFfUkVNT1ZFKCYodG1yX3Bvb2wpLT5wb29sLCB0bXIsIGVudHJ5KTsgICAgICAgICAgICBcCisgICAgICAgIFRBSUxRX05FWFQodG1yLCBlbnRyeSkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAtLSh0bXJfcG9vbCktPm51bV9hY3RpdmVfdGltZXJzOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRNUl9QT09MX0ZJUlNUKHRtcl9wb29sKSAgICAgICAgICAgICAgICBUQUlMUV9GSVJTVCgmKHRtcl9wb29sKS0+cG9vbCkKKworI2VuZGlmCisKKyNkZWZpbmUgQkNNT1NfVElNRVJfSVNfUlVOTklORyh0bXIpICAgICAgICAgICAgICgodG1yLT5mbGFncyAmIEJDTU9TX1RJTUVSX0ZMQUdfUlVOTklORykgIT0gMCkKKyNkZWZpbmUgQkNNT1NfVElNRVJfSVNfRVhQSVJFRCh0bXIpICAgICAgICAgICAgICgodG1yLT5mbGFncyAmIEJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRCkgIT0gMCkKKyNkZWZpbmUgQkNNT1NfVElNRVJfSVNfVkFMSUQodG1yKSAgICAgICAgICAgICAgICgodG1yLT5mbGFncyAmIEJDTU9TX1RJTUVSX0ZMQUdfVkFMSUQpICE9IDApCisjZGVmaW5lIEJDTU9TX1RJTUVSX0lTX0FDVElWRSh0bXIpICAgICAgICAgICAgICAoKHRtci0+ZmxhZ3MgJiBCQ01PU19USU1FUl9GTEFHX0FDVElWRSkgIT0gMCkKKworc3RhdGljIGJjbW9zX2Jvb2wgYmNtb3NfaW5pdGlhbGl6ZWQ7CitzdGF0aWMgYmNtb3NfdGltZXJfcG9vbCB0bXJfcG9vbDsKK3N0YXRpYyB2b2lkIF9zeXNfdGltZXJfaGFuZGxlcih2b2lkICpkYXRhKTsKKworLyoKKyAqIFByaW50IHZhcmlhYmxlcworICovCisKK3N0YXRpYyBiY21vc19wcmludF9yZWRpcmVjdF9tb2RlIHByaW50X3JlZGlyZWN0X21vZGU7CitzdGF0aWMgYmNtb3NfcHJpbnRfcmVkaXJlY3RfY2IgcHJpbnRfcmVkaXJlY3RfY2I7CitzdGF0aWMgdm9pZCAqcHJpbnRfcmVkaXJlY3RfY2JfZGF0YTsKK3N0YXRpYyBiY21vc19tdXRleCBiY21vc19wcmludF9sb2NrOworI2lmZGVmIEJDTU9TX0JVRl9QT09MX1NJWkUKK3N0YXRpYyBiY21vc19ibGtfcG9vbCBzeXNfYnVmX3Bvb2w7CitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb3NfYnVmX3Bvb2xfY3JlYXRlKHZvaWQpOworI2VuZGlmCisKKy8qKiBJbml0aWFsaXplIHN5c3RlbSBsaWJyYXJ5CisgKiBcaW5ncm91cCBzeXN0ZW0KKyAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgc3lzdGVtIGZ1bmN0aW9uCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKGJjbW9zX2luaXRpYWxpemVkKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICByYyA9IGJjbW9zX3N5c19pbml0KCk7CisgICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZiY21vc19yZXNfbG9jaywgMCwgInJlc19sb2NrIik7CisgICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZiY21vc19wcmludF9sb2NrLCAwLCAicHJpbnRfbG9jayIpOworICAgIFRNUl9QT09MX0lOSVQoJnRtcl9wb29sKTsKKyAgICBiY21vc19mYXN0bG9ja19pbml0KCZ0bXJfcG9vbC5sb2NrLCAwKTsKKyAgICBiY21vc19mYXN0bG9ja19pbml0KCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jaywgMCk7CisgICAgcmMgPSByYyA/IHJjIDogYmNtb3Nfc3lzX3RpbWVyX2NyZWF0ZSgmdG1yX3Bvb2wuc3lzX3RpbWVyLCBfc3lzX3RpbWVyX2hhbmRsZXIsICZ0bXJfcG9vbCk7CisKKyAgICAvKiBDcmVhdGUgZGVmYXVsdCBidWZmZXIgcG9vbCBpZiBzbyByZXF1ZXN0ZWQgYnkgY29tcGlsYXRpb24gb3B0aW9ucyAqLworI2lmZGVmIEJDTU9TX0JVRl9QT09MX1NJWkUKKyAgICByYyA9IHJjID8gcmMgOiBiY21vc19idWZfcG9vbF9jcmVhdGUoKTsKKyNlbmRpZgorCisgICAgaWYgKCFyYykKKyAgICB7CisgICAgICAgIGJjbW9zX2luaXRpYWxpemVkID0gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKiBDbGVhbnVwIHN5c3RlbSBsaWJyYXJ5CisgKiBcaW5ncm91cCBzeXN0ZW0KKyAqLwordm9pZCBiY21vc19leGl0KHZvaWQpCit7CisgICAgaWYgKCFiY21vc19pbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworICAgIGJjbW9zX3N5c190aW1lcl9kZXN0cm95KCZ0bXJfcG9vbC5zeXNfdGltZXIpOworICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmJjbW9zX3ByaW50X2xvY2spOworICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmJjbW9zX3Jlc19sb2NrKTsKKyNpZmRlZiBCQ01PU19CVUZfUE9PTF9TSVpFCisgICAgYmNtb3NfYmxrX3Bvb2xfcmVzZXQoJnN5c19idWZfcG9vbCk7CisgICAgYmNtb3NfYmxrX3Bvb2xfZGVzdHJveSgmc3lzX2J1Zl9wb29sKTsKKyNlbmRpZgorICAgIGJjbW9zX3N5c19leGl0KCk7CisgICAgYmNtb3NfaW5pdGlhbGl6ZWQgPSBCQ01PU19GQUxTRTsKK30KKworLyoKKyAqIENvbW1vbiB0YXNrIHNlcnZpY2VzCisgKi8KKworLyogUXVlcnkgdGFzayBpbmZvICovCitiY21vc19lcnJubyBiY21vc190YXNrX3F1ZXJ5KGNvbnN0IGJjbW9zX3Rhc2sgKnRhc2ssIGJjbW9zX3Rhc2tfcGFybSAqcGFybSkKK3sKKyAgICBpZiAodGFzayA9PSBOVUxMIHx8IHRhc2stPm1hZ2ljICE9IEJDTU9TX1RBU0tfTUFHSUMgfHwgcGFybSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgKnBhcm0gPSB0YXNrLT5wYXJtOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogVGFzayBpdGVyYXRvcgorICogXHBhcmFtW2luXSBwcmV2ICAgICAgUHJldmlvdXMgdGFzay4gKnByZXY9PU5VTEwgLSBnZXQgZmlyc3QKKyAqIFxyZXR1cm46IEJDTV9FUlJfT0ssIEJDTV9FUlJfTk9FTlQsIEJDTV9FUlJfTk9fTU9SRQorICovCitiY21vc19lcnJubyBiY21vc190YXNrX2dldF9uZXh0KGJjbW9zX3Rhc2sgKipwcmV2KQoreworICAgIGJjbW9zX3Rhc2sgKnRhc2s7CisgICAgaWYgKHByZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIHRhc2sgPSAqcHJldjsKKyAgICBpZiAodGFzayAmJiB0YXNrLT5tYWdpYyAhPSBCQ01PU19UQVNLX01BR0lDKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHRhc2spCisgICAgeworICAgICAgICB0YXNrID0gU1RBSUxRX05FWFQodGFzaywgbGlzdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRhc2sgPSBTVEFJTFFfRklSU1QoJnRhc2tfbGlzdCk7CisgICAgfQorICAgICpwcmV2ID0gdGFzazsKKyAgICBpZiAoIXRhc2spCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT19NT1JFOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoKKyAqIE1lc3NhZ2UgcXVldWUKKyAqLworCitzdGF0aWMgdm9pZCBfYmNtb3NfbXNncV9ub3RpZnkoYmNtb3NfbXNnX3F1ZXVlICpxLCBjb25zdCBjaGFyICp0eHQpCit7CisgICAgQkNNT1NfVFJBQ0VfSU5GTygiTXNnIHF1ZXVlICVzOiAlc1xuIiwgcS0+cS5wYXJtLm5hbWUsIHR4dCk7Cit9CisKKy8qIERlY3JlbWVudCBpbi1xdWV1ZSBzdGF0aXN0aWNzICovCitzdGF0aWMgaW5saW5lIHZvaWQgX2JjbW9zX21zZ3Ffc3RhdF9kZWMoYmNtb3NfbXNnX3F1ZXVlX253ICpxKQoreworICAgIGJjbW9zX21zZ19xdWV1ZV9zdGF0ICpzdGF0ID0gJnEtPnN0YXQ7CisgICAgdWludDMyX3Qgb2xkX2luID0gc3RhdC0+bXNnX2luOworCisgICAgaWYgKHN0YXQtPm1zZ19pbiA9PSAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJBdHRlbXB0IHRvIGRlY3JlbWVudCBzdGF0aXN0aWNzIGZvciBhbiBlbXB0eSBxdWV1ZSAoJyVzJylcbiIsIHEtPnBhcm0ubmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC0tc3RhdC0+bXNnX2luOworICAgICAgICArK3N0YXQtPm1zZ19yZWNlaXZlZDsKKyAgICB9CisKKyAgICBpZiAob2xkX2luID09IHEtPnBhcm0ubG93X3dtKQorICAgIHsKKyAgICAgICAgcS0+cGFybS5ub3RpZnkoKGJjbW9zX21zZ19xdWV1ZSAqKXEsICJiZWNvbWVzIHVuY29uZ2VzdGVkIik7CisgICAgICAgIHN0YXQtPmlzX2Nvbmdlc3RlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyogSW5jcmVtZW50IGluLXF1ZXVlIHN0YXRpc3RpY3MgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfYmNtb3NfbXNncV9zdGF0X2luYyhiY21vc19tc2dfcXVldWVfbncgKnEpCit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX3N0YXQgKnN0YXQgPSAmcS0+c3RhdDsKKyAgICB1aW50MzJfdCBvbGRfaW4gPSBzdGF0LT5tc2dfaW47CisKKyAgICArK3N0YXQtPm1zZ19pbjsKKyAgICArK3N0YXQtPm1zZ19zZW50OworICAgIGlmIChvbGRfaW4gPT0gcS0+cGFybS5oaWdoX3dtKQorICAgIHsKKyAgICAgICAgcS0+cGFybS5ub3RpZnkoKGJjbW9zX21zZ19xdWV1ZSAqKXEsICJiZWNvbWVzIGNvbmdlc3RlZCIpOworICAgICAgICBzdGF0LT5pc19jb25nZXN0ZWQgPSBCQ01PU19UUlVFOworICAgIH0KKyAgICBpZiAoc3RhdC0+aXNfY29uZ2VzdGVkKQorICAgICAgICArK3N0YXQtPm1zZ19hbG1vc3RfZnVsbDsKK30KKworc3RhdGljIHZvaWQgX2JjbW9zX3Fncm91cF9ub3RpZnkoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwLCBjb25zdCBjaGFyICp0eHQpCit7CisgICAgQkNNT1NfVFJBQ0VfSU5GTygiTXNnIHF1ZXVlICVzOiAlc1xuIiwgcWdyb3VwLT5wYXJtLm5hbWUsIHR4dCk7Cit9CisKKy8qIERlY3JlbWVudCBpbi1xdWV1ZSBzdGF0aXN0aWNzIGZvciBxdWV1ZSBncm91cCAqLworc3RhdGljIGlubGluZSB2b2lkIF9iY21vc19xZ3JvdXBfc3RhdF9kZWMoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwKQoreworICAgIGJjbW9zX21zZ19xdWV1ZV9zdGF0ICpzdGF0ID0gJnFncm91cC0+c3RhdDsKKyAgICB1aW50MzJfdCBvbGRfaW4gPSBzdGF0LT5tc2dfaW47CisKKyAgICBpZiAoc3RhdC0+bXNnX2luID09IDApCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkF0dGVtcHQgdG8gZGVjcmVtZW50IHN0YXRpc3RpY3MgZm9yIGFuIGVtcHR5IHF1ZXVlICgnJXMnKVxuIiwgcWdyb3VwLT5wYXJtLm5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAtLXN0YXQtPm1zZ19pbjsKKyAgICAgICAgKytzdGF0LT5tc2dfcmVjZWl2ZWQ7CisgICAgfQorCisgICAgaWYgKG9sZF9pbiA9PSBxZ3JvdXAtPnBhcm0ubG93X3dtKQorICAgIHsKKyAgICAgICAgcWdyb3VwLT5wYXJtLm5vdGlmeShxZ3JvdXAsICJiZWNvbWVzIHVuY29uZ2VzdGVkIik7CisgICAgICAgIHN0YXQtPmlzX2Nvbmdlc3RlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyogSW5jcmVtZW50IGluLXF1ZXVlIHN0YXRpc3RpY3MgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfYmNtb3NfcWdyb3VwX3N0YXRfaW5jKGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCkKK3sKKyAgICBiY21vc19tc2dfcXVldWVfc3RhdCAqc3RhdCA9ICZxZ3JvdXAtPnN0YXQ7CisgICAgdWludDMyX3Qgb2xkX2luID0gc3RhdC0+bXNnX2luOworCisgICAgKytzdGF0LT5tc2dfaW47CisgICAgKytzdGF0LT5tc2dfc2VudDsKKyAgICBpZiAob2xkX2luID09IHFncm91cC0+cGFybS5oaWdoX3dtKQorICAgIHsKKyAgICAgICAgcWdyb3VwLT5wYXJtLm5vdGlmeShxZ3JvdXAsICJiZWNvbWVzIGNvbmdlc3RlZCIpOworICAgICAgICBzdGF0LT5pc19jb25nZXN0ZWQgPSBCQ01PU19UUlVFOworICAgIH0KKyAgICBpZiAoc3RhdC0+aXNfY29uZ2VzdGVkKQorICAgICAgICArK3N0YXQtPm1zZ19hbG1vc3RfZnVsbDsKK30KKworCisvKiBHZXQgbWVzc2FnZSBmcm9tIHF1ZXVlLgorICogVXJnZW50IHF1ZXVlIGlzIGNoZWNrZWQgMXN0LCB0aGVuIHJlZ3VsYXIgcXVldWUKKyAqIE11c3QgYmUgY2FsbGVkIHVuZGVyIGxvY2shCisgKiBSZXR1cm5zIG1zZyBvciBOVUxMIGlmIHF1ZXVlIGlzIGVtcHR5CisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfbXNnICpfYmNtb3NfbXNnX2dldChiY21vc19tc2dfcXVldWVfbncgKnEpCit7CisgICAgYmNtb3NfbXNnICptc2c7CisKKyAgICBtc2cgPSBTVEFJTFFfRklSU1QoJnEtPm1zZ2xfdXJnKTsKKyAgICBpZiAobXNnKQorICAgIHsKKyAgICAgICAgU1RBSUxRX1JFTU9WRV9IRUFEKCZxLT5tc2dsX3VyZywgbmV4dCk7CisgICAgICAgIF9iY21vc19tc2dxX3N0YXRfZGVjKHEpOworICAgICAgICByZXR1cm4gbXNnOworICAgIH0KKworICAgIG1zZyA9IFNUQUlMUV9GSVJTVCgmcS0+bXNnbCk7CisgICAgaWYgKG1zZykKKyAgICB7CisgICAgICAgIFNUQUlMUV9SRU1PVkVfSEVBRCgmcS0+bXNnbCwgbmV4dCk7CisgICAgICAgIF9iY21vc19tc2dxX3N0YXRfZGVjKHEpOworICAgIH0KKworICAgIHJldHVybiBtc2c7Cit9CisKKy8qIFB1dCBtZXNzYWdlIG9uIHF1ZXVlLgorICogTXVzdCBiZSBjYWxsZWQgdW5kZXIgbG9jayEKKyAqIFJldHVybnMgZXJyb3IgaW4gY2FzZSBvZiBxdWV1ZSBvdmVyZmxvdworICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIF9iY21vc19tc2dfcHV0KGJjbW9zX21zZ19xdWV1ZV9udyAqcSwgYmNtb3NfbXNnICptc2csIGJjbW9zX21zZ19zZW5kX2ZsYWdzIGZsYWdzKQoreworICAgIC8qIE92ZXJmbG93IGNoZWNrICovCisgICAgaWYgKHEtPnN0YXQubXNnX2luID49IHEtPnBhcm0uc2l6ZSkKKyAgICB7CisgICAgICAgIGlmICghKGZsYWdzICYgQkNNT1NfTVNHX1NFTkRfTk9MSU1JVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICsrcS0+c3RhdC5tc2dfZGlzY2FyZGVkOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogUHV0IG9udG8gdGhlIHJlbGV2YW50IHF1ZXVlICovCisgICAgaWYgKChmbGFncyAmIEJDTU9TX01TR19TRU5EX1VSR0VOVCkpCisgICAgICAgIFNUQUlMUV9JTlNFUlRfVEFJTCgmcS0+bXNnbF91cmcsIG1zZywgbmV4dCk7CisgICAgZWxzZQorICAgICAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnEtPm1zZ2wsIG1zZywgbmV4dCk7CisgICAgX2JjbW9zX21zZ3Ffc3RhdF9pbmMocSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQ3JlYXRlIG1lc3NhZ2UgcXVldWUgd2l0aG91dCB3YWl0IHN1cHBvcnQgKi8KK3N0YXRpYyB2b2lkIGJjbW9zX21zZ19xdWV1ZV9ud19pbml0KGJjbW9zX21zZ19xdWV1ZV9udyAqcSwgY29uc3QgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gKnBhcm0pCit7CisgICAgcS0+cGFybSA9ICpwYXJtOworICAgIFNUQUlMUV9JTklUKCZxLT5tc2dsKTsKKyAgICBTVEFJTFFfSU5JVCgmcS0+bXNnbF91cmcpOworICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJnEtPmxvY2ssIHBhcm0tPmZsYWdzKTsKKyAgICBtZW1zZXQoJnEtPnN0YXQsIDAsIHNpemVvZihxLT5zdGF0KSk7CisgICAgcS0+ZmxhZ3MgPSAwOworICAgIGlmICghcS0+cGFybS5zaXplKQorICAgICAgICBxLT5wYXJtLnNpemUgPSBCQ01PU19NU0dfUVVFVUVfU0laRV9VTkxJTUlURUQ7CisgICAgaWYgKCFxLT5wYXJtLmhpZ2hfd20pCisgICAgICAgIHEtPnBhcm0uaGlnaF93bSA9IEJDTU9TX01TR19RVUVVRV9TSVpFX1VOTElNSVRFRDsKKyAgICBpZiAoIXEtPnBhcm0ubG93X3dtKQorICAgICAgICBxLT5wYXJtLmxvd193bSA9IHEtPnBhcm0uaGlnaF93bTsKKyAgICBpZiAoIXEtPnBhcm0ubm90aWZ5KQorICAgICAgICBxLT5wYXJtLm5vdGlmeSA9IF9iY21vc19tc2dxX25vdGlmeTsKK30KKworLyogRGVzdHJveSBtZXNzYWdlIGxpc3QgKi8KK3N0YXRpYyB2b2lkIGJjbW9zX21zZ19saXN0X2Rlc3Ryb3koYmNtb3NfbXNnX2xpc3QgKmwpCit7CisgICAgYmNtb3NfbXNnICptc2csICp0bXA7CisgICAgU1RBSUxRX0ZPUkVBQ0hfU0FGRShtc2csIGwsIG5leHQsIHRtcCkKKyAgICB7CisgICAgICAgIFNUQUlMUV9SRU1PVkVfSEVBRChsLCBuZXh0KTsKKyAgICAgICAgYmNtb3NfbXNnX2ZyZWUobXNnKTsKKyAgICB9Cit9CisKKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfUkVNT1RFX1NVUFBPUlQKKworLyogUmVtb3RlIHF1ZXVlIHN1cHBvcnQgLSBjb21tb24gcGFydCBvZiBjcmVhdGUvZGVzdHJveSAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbW9zX21zZ19xdWV1ZV9kZXN0cm95X3JlbW90ZV9lcChiY21vc19tc2dfcXVldWUgKnF1ZXVlKQoreworICAgIGlmIChxdWV1ZS0+cS5wYXJtLmNsb3NlKQorICAgICAgICBxdWV1ZS0+cS5wYXJtLmNsb3NlKHF1ZXVlKTsKKyAgICBiY21vc19tdXRleF9kZXN0cm95KCZxdWV1ZS0+c2VuZF9sb2NrKTsKKyAgICBpZiAocXVldWUtPnNlbmRfYnVmKQorICAgICAgICBiY21vc19mcmVlKHF1ZXVlLT5zZW5kX2J1Zik7CisgICAgaWYgKHF1ZXVlLT5yZWN2X2J1ZikKKyAgICAgICAgYmNtb3NfZnJlZShxdWV1ZS0+cmVjdl9idWYpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbW9zX21zZ19xdWV1ZV9jcmVhdGVfcmVtb3RlX2VwKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBBbGxvY2F0ZSB0eCBhbmQgcnggYnVmZmVycyAqLworICAgIGlmICghcXVldWUtPnEucGFybS5tYXhfbXR1KQorICAgIHsKKyAgICAgICAgcXVldWUtPnEucGFybS5tYXhfbXR1ID0gQkNNT1NfTVNHX1FVRVVFX0RFRkFVTFRfTUFYX01UVTsKKyAgICB9CisgICAgcXVldWUtPnNlbmRfYnVmID0gYmNtb3NfY2FsbG9jKHF1ZXVlLT5xLnBhcm0ubWF4X210dSk7CisgICAgaWYgKCFxdWV1ZS0+c2VuZF9idWYpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT01FTSwgIkNhbid0IGFsbG9jYXRlIHNlbmRfYnVmXG4iKTsKKyAgICB9CisKKyAgICBxdWV1ZS0+cmVjdl9idWYgPSBiY21vc19jYWxsb2MocXVldWUtPnEucGFybS5tYXhfbXR1KTsKKyAgICBpZiAoIXF1ZXVlLT5yZWN2X2J1ZikKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUocXVldWUtPnNlbmRfYnVmKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9NRU0sICJDYW4ndCBhbGxvY2F0ZSByZWN2X2J1ZlxuIik7CisgICAgfQorICAgIGJjbW9zX211dGV4X2NyZWF0ZSgmcXVldWUtPnNlbmRfbG9jaywgMCwgcXVldWUtPnEucGFybS5uYW1lKTsKKworICAgIHN3aXRjaCAocXVldWUtPnEucGFybS5lcF90eXBlKQorICAgIHsKKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVAorICAgIGNhc2UgQkNNT1NfTVNHX1FVRVVFX0VQX0RPTUFJTl9TT0NLRVQ6CisgICAgICAgIHJjID0gYmNtb3Nfc3lzX21zZ19xdWV1ZV9kb21haW5fc29ja2V0X29wZW4ocXVldWUpOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEJDTU9TX01TR19RVUVVRV9VRFBfU09DS0VUCisgICAgY2FzZSBCQ01PU19NU0dfUVVFVUVfRVBfVURQX1NPQ0tFVDoKKyAgICAgICAgcmMgPSBiY21vc19zeXNfbXNnX3F1ZXVlX3VkcF9zb2NrZXRfb3BlbihxdWV1ZSk7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1VTRVJfREVGSU5FRAorICAgIGNhc2UgQkNNT1NfTVNHX1FVRVVFX0VQX1VTRVJfREVGSU5FRDoKKyAgICAgICAgaWYgKHBhcm0ub3BlbiA9PSBOVUxMIHx8IHBhcm0uY2xvc2UgPT0gTlVMTCB8fCBwYXJtLnNlbmQ9PU5VTEwgfHwgcGFybS5yZWN2ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBwYXJtLm9wZW4ocXVldWUpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBfYmNtb3NfbXNnX3F1ZXVlX2Rlc3Ryb3lfcmVtb3RlX2VwKHF1ZXVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUICovCisKKy8qIENyZWF0ZSBtZXNzYWdlIHF1ZXVlLiAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3F1ZXVlX2NyZWF0ZShiY21vc19tc2dfcXVldWUgKnF1ZXVlLCBjb25zdCBiY21vc19tc2dfcXVldWVfcGFybSAqcGFybSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmICghcXVldWUgfHwgIXBhcm0pCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJxdWV1ZSAlcCwgcGFybSAlcFxuIiwgcXVldWUsIHBhcm0pOworICAgIG1lbXNldChxdWV1ZSwgMCwgc2l6ZW9mKCpxdWV1ZSkpOworICAgIHF1ZXVlLT5xLnBhcm0gPSAqcGFybTsKKworICAgIGlmIChwYXJtLT5lcF90eXBlID09IEJDTU9TX01TR19RVUVVRV9FUF9MT0NBTCkKKyAgICB7CisgICAgICAgIHJjID0gYmNtb3Nfc2VtX2NyZWF0ZSgmcXVldWUtPm0sIDAsIHBhcm0tPmZsYWdzLCBxdWV1ZS0+cS5wYXJtLm5hbWUpOworICAgICAgICBpZiAoIXJjKQorICAgICAgICAgICAgYmNtb3NfbXNnX3F1ZXVlX253X2luaXQoJnF1ZXVlLT5xLCBwYXJtKTsKKyAgICB9CisgICAgZWxzZQorI2lmZGVmIEJDTU9TX01TR19RVUVVRV9SRU1PVEVfU1VQUE9SVAorICAgIHsKKyAgICAgICAgcmMgPSBfYmNtb3NfbXNnX3F1ZXVlX2NyZWF0ZV9yZW1vdGVfZXAocXVldWUpOworICAgIH0KKyNlbHNlCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcXVldWUtPm1hZ2ljID0gQkNNT1NfTVNHX1FVRVVFX1ZBTElEOworICAgIC8qIENvcHkgbmFtZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgcmVsZWFzZWQgLSBpbiBjYXNlIGl0IHdhcyBvbiB0aGUgc3RhY2sgKi8KKyAgICBpZiAocXVldWUtPnEucGFybS5uYW1lKQorICAgIHsKKyAgICAgICAgc3RybmNweShxdWV1ZS0+bmFtZSwgcXVldWUtPnEucGFybS5uYW1lLCBzaXplb2YocXVldWUtPm5hbWUpIC0gMSk7CisgICAgICAgIHF1ZXVlLT5xLnBhcm0ubmFtZSA9IHF1ZXVlLT5uYW1lOworICAgIH0KKyAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgU1RBSUxRX0lOU0VSVF9UQUlMKCZtc2dfcXVldWVfbGlzdCwgcXVldWUsIGxpc3QpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IHF1ZXVlICovCitiY21vc19lcnJubyBiY21vc19tc2dfcXVldWVfZGVzdHJveShiY21vc19tc2dfcXVldWUgKnF1ZXVlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmICghcXVldWUgfHwgcXVldWUtPm1hZ2ljICE9IEJDTU9TX01TR19RVUVVRV9WQUxJRCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJxdWV1ZSBoYW5kbGUgaXMgaW52YWxpZFxuIik7CisgICAgfQorICAgIHF1ZXVlLT5tYWdpYyA9IEJDTU9TX01TR19RVUVVRV9ERUxFVEVEOworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICBTVEFJTFFfUkVNT1ZFKCZtc2dfcXVldWVfbGlzdCwgcXVldWUsIGJjbW9zX21zZ19xdWV1ZSwgbGlzdCk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19yZXNfbG9jayk7CisKKyAgICBpZiAocXVldWUtPnEucGFybS5lcF90eXBlID09IEJDTU9TX01TR19RVUVVRV9FUF9MT0NBTCkKKyAgICB7CisgICAgICAgIGJjbW9zX3NlbV9kZXN0cm95KCZxdWV1ZS0+bSk7CisgICAgICAgIC8qIFJlbGVhc2UgYWxsIHBlbmRpbmcgbWVzc2FnZXMgKi8KKyAgICAgICAgYmNtb3NfbXNnX2xpc3RfZGVzdHJveSgmcXVldWUtPnEubXNnbF91cmcpOworICAgICAgICBiY21vc19tc2dfbGlzdF9kZXN0cm95KCZxdWV1ZS0+cS5tc2dsKTsKKyAgICB9CisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBfYmNtb3NfbXNnX3F1ZXVlX2Rlc3Ryb3lfcmVtb3RlX2VwKHF1ZXVlKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByYzsKK30KKworLyogR2V0IHF1ZXVlIGluZm8gKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19xdWV1ZV9xdWVyeShjb25zdCBiY21vc19tc2dfcXVldWUgKnF1ZXVlLCBiY21vc19tc2dfcXVldWVfaW5mbyAqaW5mbykKK3sKKyAgICBpZiAoIXF1ZXVlIHx8ICFpbmZvKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAicXVldWUgJXAsIGluZm8gJXBcbiIsIHF1ZXVlLCBpbmZvKTsKKyAgICBpbmZvLT5zdGF0ID0gcXVldWUtPnEuc3RhdDsKKyAgICBpbmZvLT5wYXJtID0gcXVldWUtPnEucGFybTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogTWVzc2FnZSBxdWV1ZSBpdGVyYXRvciAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3F1ZXVlX2dldF9uZXh0KGNvbnN0IGJjbW9zX21zZ19xdWV1ZSAqKnByZXYpCit7CisgICAgY29uc3QgYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZTsKKworICAgIGlmIChwcmV2ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBxdWV1ZSA9ICpwcmV2OworICAgIGlmIChxdWV1ZSAmJiBxdWV1ZS0+bWFnaWMgIT0gQkNNT1NfTVNHX1FVRVVFX1ZBTElEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHF1ZXVlKQorICAgIHsKKyAgICAgICAgcXVldWUgPSBTVEFJTFFfTkVYVChxdWV1ZSwgbGlzdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHF1ZXVlID0gU1RBSUxRX0ZJUlNUKCZtc2dfcXVldWVfbGlzdCk7CisgICAgfQorICAgICpwcmV2ID0gcXVldWU7CisgICAgaWYgKCFxdWV1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PX01PUkU7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisKKy8qIFBhY2sgLyB1bnBhY2sgbWVzc2FnZSBoZWFkZXIuCisgKiBJbiB0aGUgZnV0dXJlIHdlIG1pZ2h0IGFkb3B0IGJjbW9sdF9idWYgc2VydmljZSBpbnRvIE9TIGFic3RyYWN0aW9uIGFuZCB1c2UgaXQKKyAqIGZvciBwYWNraW5nIC8gdW5wYWNraW5nLgorICovCisKK3ZvaWQgYmNtb3NfbXNnX2hkcl9wYWNrKGNvbnN0IGJjbW9zX21zZyAqbXNnLCB1aW50OF90ICpidWYsIHVpbnQzMl90IGRhdGFfc2l6ZSkKK3sKKyAgICB1aW50MTZfdCB2YWwxNjsKKyAgICB1aW50MzJfdCB2YWwzMjsKKyAgICB2YWwxNiA9IEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1UxNihtc2ctPnR5cGUpOworICAgIG1lbWNweShidWYsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSk7CisgICAgYnVmWzJdID0gKHVpbnQ4X3QpbXNnLT5pbnN0YW5jZTsKKyAgICBidWZbM10gPSAodWludDhfdCltc2ctPnNlbmRlcjsKKyAgICB2YWwzMiA9IEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1UzMihkYXRhX3NpemUpOworICAgIG1lbWNweSgmYnVmWzRdLCAmdmFsMzIsIHNpemVvZih2YWwzMikpOworfQorCit2b2lkIGJjbW9zX21zZ19oZHJfdW5wYWNrKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgYmNtb3NfbXNnICptc2cpCit7CisgICAgdWludDE2X3QgdmFsMTY7CisgICAgdWludDMyX3QgdmFsMzI7CisgICAgbWVtY3B5KCZ2YWwxNiwgYnVmLCBzaXplb2YodmFsMTYpKTsKKyAgICB2YWwxNiA9IEJDTU9TX0VORElBTl9CSUdfVE9fQ1BVX1UxNih2YWwxNik7CisgICAgbXNnLT50eXBlID0gKGJjbW9zX21zZ19pZCl2YWwxNjsKKyAgICBtc2ctPmluc3RhbmNlID0gKGJjbW9zX21zZ19pbnN0YW5jZSlidWZbMl07CisgICAgbXNnLT5zZW5kZXIgPSAoYmNtb3NfbW9kdWxlX2lkKWJ1ZlszXTsKKyAgICBtZW1jcHkoJnZhbDMyLCAmYnVmWzRdLCBzaXplb2YodmFsMzIpKTsKKyAgICBtc2ctPnNpemUgPSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV9VMzIodmFsMzIpOyAvKiBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdW5wYWNrZXIgKi8KKyAgICBtc2ctPmhhbmRsZXIgPSBOVUxMOworICAgIG1zZy0+c2VuZF9mbGFncyA9IDA7Cit9CisKKy8qIFNlbmQgbWVzc2FnZSB0byByZW1vdGUgRVAgd3JhcHBlciAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21vc19tc2dfc2VuZF90b19yZW1vdGVfZXAoYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZSwgYmNtb3NfbXNnICptc2csIGJjbW9zX21zZ19zZW5kX2ZsYWdzIGZsYWdzKQoreworICAgIHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7CisgICAgdWludDMyX3QgYnVmX2xlbmd0aCA9IDA7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZxdWV1ZS0+c2VuZF9sb2NrKTsKKyAgICByYyA9IHF1ZXVlLT5xLnBhcm0ucGFjayhxdWV1ZSwgbXNnLCAmYnVmLCAmYnVmX2xlbmd0aCk7CisgICAgcmMgPSByYyA/IHJjIDogcXVldWUtPnEucGFybS5zZW5kKHF1ZXVlLCBidWYsIGJ1Zl9sZW5ndGgpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmcXVldWUtPnNlbmRfbG9jayk7CisKKyAgICAvKiBSZWxlYXNlIGlmIHNlbnQgc3VjY2Vzc2Z1bGx5IG9yIGlmIGF1dG8tcmVsZWFzZSBmbGFnIGlzIHNldCAqLworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LIHx8ICEoZmxhZ3MgJiBCQ01PU19NU0dfU0VORF9OT19GUkVFX09OX0VSUk9SKSkKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7CisgICAgfQorICAgIGlmIChidWYgJiYgcXVldWUtPnEucGFybS5mcmVlX3BhY2tlZCkKKyAgICB7CisgICAgICAgIHF1ZXVlLT5xLnBhcm0uZnJlZV9wYWNrZWQocXVldWUsIGJ1Zik7CisgICAgfQorICAgIGlmIChyYykKKyAgICB7CisgICAgICAgICsrcXVldWUtPnEuc3RhdC5tc2dfZGlzY2FyZGVkOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICArK3F1ZXVlLT5xLnN0YXQubXNnX3NlbnQ7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBSZWNlaXZlIG1lc3NhZ2UgZnJvbSByZW1vdGUgRVAgd3JhcHBlciAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21vc19tc2dfcmVjdl9mcm9tX3JlbW90ZV9lcChiY21vc19tc2dfcXVldWUgKnF1ZXVlLCB1aW50MzJfdCB0aW1lb3V0LCBiY21vc19tc2cgKiptc2cpCit7CisgICAgdWludDhfdCAqYnVmID0gTlVMTDsKKyAgICB1aW50MzJfdCBidWZfbGVuZ3RoID0gMDsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gcXVldWUtPnEucGFybS5yZWN2KHF1ZXVlLCB0aW1lb3V0LCAmYnVmLCAmYnVmX2xlbmd0aCk7CisgICAgcmMgPSByYyA/IHJjIDogcXVldWUtPnEucGFybS51bnBhY2socXVldWUsIGJ1ZiwgYnVmX2xlbmd0aCwgbXNnKTsKKyAgICBpZiAoYnVmICYmIHF1ZXVlLT5xLnBhcm0uZnJlZV9wYWNrZWQpCisgICAgeworICAgICAgICBxdWV1ZS0+cS5wYXJtLmZyZWVfcGFja2VkKHF1ZXVlLCBidWYpOworICAgIH0KKyAgICBpZiAoIXJjKQorICAgIHsKKyAgICAgICAgKytxdWV1ZS0+cS5zdGF0Lm1zZ19yZWNlaXZlZDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKyNlbmRpZiAvKiBCQ01PU19NU0dfUVVFVUVfUkVNT1RFX1NVUFBPUlQgKi8KKworLyogU2VuZCBtZXNzYWdlIHRvIHF1ZXVlICovCitiY21vc19lcnJubyBiY21vc19tc2dfc2VuZChiY21vc19tc2dfcXVldWUgKnF1ZXVlLCBiY21vc19tc2cgKm1zZywgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgZmxhZ3MpCit7CisgICAgbG9uZyBsb2NrX2ZsYWdzOworICAgIGJjbW9zX2Vycm5vIHJjOworCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisgICAgaWYgKHF1ZXVlLT5xLnBhcm0uZXBfdHlwZSAhPSBCQ01PU19NU0dfUVVFVUVfRVBfTE9DQUwpCisgICAgeworICAgICAgICByZXR1cm4gX2JjbW9zX21zZ19zZW5kX3RvX3JlbW90ZV9lcChxdWV1ZSwgbXNnLCBmbGFncyk7CisgICAgfQorI2VuZGlmCisKKyAgICBsb2NrX2ZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmcXVldWUtPnEubG9jayk7CisgICAgcmMgPSBfYmNtb3NfbXNnX3B1dCgmcXVldWUtPnEsIG1zZywgZmxhZ3MpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcXVldWUtPnEubG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIGlmICghKGZsYWdzICYgQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJPdmVyZmxvdzogUXVldWUgJXNcbiIsIHF1ZXVlLT5xLnBhcm0ubmFtZSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBTdWNjZXNzICovCisgICAgaWYgKHF1ZXVlLT5pc193YWl0aW5nKQorICAgIHsKKyAgICAgICAgLyogS2ljayB3YWl0aW5nIHRhc2sgKi8KKyAgICAgICAgcXVldWUtPmlzX3dhaXRpbmcgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxdWV1ZS0+cS5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICAgICAgYmNtb3Nfc2VtX3Bvc3QoJnF1ZXVlLT5tKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxdWV1ZS0+cS5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogU2VuZCBtZXNzYWdlIHRvIG1vZHVsZSAoaW50ZXJuYWwpIC0gZG9lc24ndCBwb3N0IGFueSBzZW1hcGhvcmVzIHNvIGl0J3Mgc2FmZSB0byBjYWxsIHVuZGVyIGEgZmFzdGxvY2sgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKAorICAgIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsCisgICAgYmNtb3NfbXNnICptc2csCisgICAgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgZmxhZ3MsCisgICAgYmNtb3Nfc2VtICoqc2VtX3RvX3Bvc3QpCit7CisgICAgYmNtb3NfbW9kdWxlICptb2R1bGUgPSBfYmNtb3NfbW9kdWxlX2dldChtb2R1bGVfaWQpOworICAgIGJjbW9zX3Rhc2sgKnRhc2s7CisgICAgbG9uZyBsb2NrX2ZsYWdzLCBxX2xvY2tfZmxhZ3M7CisgICAgdWludDMyX3QgYWN0aXZlX21vZHVsZXM7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgKnNlbV90b19wb3N0ID0gTlVMTDsKKworICAgIGlmICghbW9kdWxlIHx8ICFtc2ctPmhhbmRsZXIpCisgICAgeworICAgICAgICBpZiAoIW1vZHVsZSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJNb2R1bGUgJWQgZG9lc24ndCBleGlzdFxuIiwgbW9kdWxlX2lkKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigibXNnLT5oYW5kbGVyIGlzIG5vdCBzZXQuIG1zZy0+dHlwZT0lZFxuIiwgbXNnLT50eXBlKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgICAgIGlmICghKGZsYWdzICYgQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHRhc2sgPSBtb2R1bGUtPm15X3Rhc2s7CisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnRhc2stPmFjdGl2ZV9sb2NrKTsKKyAgICBxX2xvY2tfZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZtb2R1bGUtPm1zZ3EubG9jayk7CisKKyAgICByYyA9IF9iY21vc19tc2dfcHV0KCZtb2R1bGUtPm1zZ3EsIG1zZywgZmxhZ3MpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmbW9kdWxlLT5tc2dxLmxvY2ssIHFfbG9ja19mbGFncyk7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmdGFzay0+YWN0aXZlX2xvY2ssIGxvY2tfZmxhZ3MpOworCisgICAgICAgIC8qIFF1ZXVlIG92ZXJmbG93ICovCisgICAgICAgIGlmICghKGZsYWdzICYgQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUikpCisgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworCisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiT3ZlcmZsb3c6IFF1ZXVlICVzXG4iLCBtb2R1bGUtPnBhcm0ucXBhcm0ubmFtZSk7CisKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJm1vZHVsZS0+bXNncS5sb2NrLCBxX2xvY2tfZmxhZ3MpOworCisgICAgLyogU3VjY2Vzcy4gVXBkYXRlIGFjdGl2ZV9tb2R1bGVzIHRhc2sgYW5kIGtpY2sgdGhlIHRhc2sgKi8KKyAgICBhY3RpdmVfbW9kdWxlcyA9IHRhc2stPmFjdGl2ZV9tb2R1bGVzOworICAgIHRhc2stPmFjdGl2ZV9tb2R1bGVzIHw9ICgxIDw8IG1vZHVsZS0+aWR4KTsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnRhc2stPmFjdGl2ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKworICAgIC8qIE5vdGlmeSBjYWxsZXIgdG8ga2ljayB0YXNrIGlmIHRoZXJlIGlzIGEgY2hhbmNlIGl0IHdhcyB3YWl0aW5nICovCisgICAgaWYgKCFhY3RpdmVfbW9kdWxlcykKKyAgICAgICAgKnNlbV90b19wb3N0ID0gJnRhc2stPmFjdGl2ZV9zZW07CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogU2VuZCBtZXNzYWdlIHRvIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqbXNnLCBiY21vc19tc2dfc2VuZF9mbGFncyBmbGFncykKK3sKKyAgICBiY21vc19zZW0gKnNlbV90b19wb3N0OworICAgIGJjbW9zX2Vycm5vIGVyciA9IF9iY21vc19tc2dfc2VuZF90b19tb2R1bGUobW9kdWxlX2lkLCBtc2csIGZsYWdzLCAmc2VtX3RvX3Bvc3QpOworICAgIGlmIChzZW1fdG9fcG9zdCkKKyAgICAgICAgYmNtb3Nfc2VtX3Bvc3Qoc2VtX3RvX3Bvc3QpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qIEdldCBtZXNzYWdlIGZyb20gdGhlIGhlYWQgb2YgbWVzc2FnZSBxdWV1ZSAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3JlY3YoYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZSwgdWludDMyX3QgdGltZW91dCwgYmNtb3NfbXNnICoqbXNnKQoreworICAgIGxvbmcgbG9ja19mbGFnczsKKworICAgIGlmICghcXVldWUgfHwgIW1zZykKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInF1ZXVlICVwLCBtc2cgJXBcbiIsIHF1ZXVlLCBtc2cpOworCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisgICAgaWYgKHF1ZXVlLT5xLnBhcm0uZXBfdHlwZSAhPSBCQ01PU19NU0dfUVVFVUVfRVBfTE9DQUwpCisgICAgeworICAgICAgICByZXR1cm4gX2JjbW9zX21zZ19yZWN2X2Zyb21fcmVtb3RlX2VwKHF1ZXVlLCB0aW1lb3V0LCBtc2cpOworICAgIH0KKyNlbmRpZgorCisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnF1ZXVlLT5xLmxvY2spOworICAgICptc2cgPSBfYmNtb3NfbXNnX2dldCgmcXVldWUtPnEpOworICAgIGlmICgqbXNnKQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxdWV1ZS0+cS5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIGlmICghdGltZW91dCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcXVldWUtPnEubG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKworICAgIC8qIFJlY2VpdmUgd2l0aCB3YWl0ICovCisgICAgcXVldWUtPmlzX3dhaXRpbmcgPSBCQ01PU19UUlVFOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcXVldWUtPnEubG9jaywgbG9ja19mbGFncyk7CisKKyAgICAvKiB3YWl0IGZvciBpdCAqLworICAgIGJjbW9zX3NlbV93YWl0KCZxdWV1ZS0+bSwgdGltZW91dCk7CisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnF1ZXVlLT5xLmxvY2spOworICAgICptc2cgPSBfYmNtb3NfbXNnX2dldCgmcXVldWUtPnEpOworICAgIHF1ZXVlLT5pc193YWl0aW5nID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxdWV1ZS0+cS5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICBpZiAoISptc2cpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1RJTUVPVVQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKgorICogUXVldWUgZ3JvdXAgc3VwcG9ydAorICovCisKKy8qIENyZWF0ZSBtZXNzYWdlIHF1ZXVlIGdyb3VwLiAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9jcmVhdGUoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwLCBjb25zdCBiY21vc19tc2dfcWdyb3VwX3Bhcm0gKnBhcm0pCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb3NfcWdyb3VwX3BydHkgcHJ0eTsKKworICAgIGlmICghcWdyb3VwIHx8ICFwYXJtIHx8ICFwYXJtLT5ucXVldWVzIHx8IHBhcm0tPm5xdWV1ZXM+MzIpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJxdWV1ZSAlcCwgcGFybSAlcCBucXVldWVzICV1XG4iLCBxZ3JvdXAsIHBhcm0sIHBhcm0gPyBwYXJtLT5ucXVldWVzOiAwKTsKKyAgICBtZW1zZXQocWdyb3VwLCAwLCBzaXplb2YoKnFncm91cCkpOworICAgIHJjID0gYmNtb3Nfc2VtX2NyZWF0ZSgmcWdyb3VwLT5tLCAwLCBwYXJtLT5mbGFncywgTlVMTCk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisgICAgcWdyb3VwLT5wYXJtID0gKnBhcm07CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmcWdyb3VwLT5sb2NrLCBwYXJtLT5mbGFncyk7CisgICAgaWYgKCFxZ3JvdXAtPnBhcm0uc2l6ZSkKKyAgICAgICAgcWdyb3VwLT5wYXJtLnNpemUgPSBCQ01PU19NU0dfUVVFVUVfU0laRV9VTkxJTUlURUQ7CisgICAgaWYgKCFxZ3JvdXAtPnBhcm0uaGlnaF93bSkKKyAgICAgICAgcWdyb3VwLT5wYXJtLmhpZ2hfd20gPSBCQ01PU19NU0dfUVVFVUVfU0laRV9VTkxJTUlURUQ7CisgICAgaWYgKCFxZ3JvdXAtPnBhcm0ubG93X3dtKQorICAgICAgICBxZ3JvdXAtPnBhcm0ubG93X3dtID0gcWdyb3VwLT5wYXJtLmhpZ2hfd207CisgICAgaWYgKCFxZ3JvdXAtPnBhcm0ubm90aWZ5KQorICAgICAgICBxZ3JvdXAtPnBhcm0ubm90aWZ5ID0gX2JjbW9zX3Fncm91cF9ub3RpZnk7CisgICAgcWdyb3VwLT5tc2dsID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21vc19tc2dfbGlzdCkgKiAodWludDMyX3QpcGFybS0+bnF1ZXVlcyk7CisgICAgaWYgKCFxZ3JvdXAtPm1zZ2wpCisgICAgeworICAgICAgICBiY21vc19tc2dfcWdyb3VwX2Rlc3Ryb3kocWdyb3VwKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorICAgIGZvciAocHJ0eSA9IDA7IHBydHkgPCBxZ3JvdXAtPnBhcm0ubnF1ZXVlczsgcHJ0eSsrKQorICAgIHsKKyAgICAgICAgU1RBSUxRX0lOSVQoJnFncm91cC0+bXNnbFtwcnR5XSk7CisgICAgfQorICAgIC8qIENvcHkgbmFtZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgcmVsZWFzZWQgLSBpbiBjYXNlIGl0IHdhcyBvbiB0aGUgc3RhY2sgKi8KKyAgICBpZiAocWdyb3VwLT5wYXJtLm5hbWUpCisgICAgeworICAgICAgICBzdHJuY3B5KHFncm91cC0+bmFtZSwgcWdyb3VwLT5wYXJtLm5hbWUsIHNpemVvZihxZ3JvdXAtPnBhcm0ubmFtZSkgLSAxKTsKKyAgICAgICAgcWdyb3VwLT5wYXJtLm5hbWUgPSBxZ3JvdXAtPm5hbWU7CisgICAgfQorICAgIHFncm91cC0+bWFnaWMgPSBCQ01PU19NU0dfUUdST1VQX1ZBTElEOworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJm1zZ19xZ3JvdXBfbGlzdCwgcWdyb3VwLCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogRGVzdHJveSBxdWV1ZSBncm91cAorICoKKyAqIFxwYXJhbVtpbl0gICBxZ3JvdXAgICAgICAgUXVldWUgZ3JvdXAgaGFuZGxlCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9kZXN0cm95KGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCkKK3sKKyAgICBiY21vc19xZ3JvdXBfcHJ0eSBwcnR5OworCisgICAgaWYgKCFxZ3JvdXAgfHwgcWdyb3VwLT5tYWdpYyAhPSBCQ01PU19NU0dfUUdST1VQX1ZBTElEKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInF1ZXVlIGdyb3VwIGhhbmRsZSBpcyBpbnZhbGlkXG4iKTsKKyAgICB9CisKKyAgICBxZ3JvdXAtPm1hZ2ljID0gQkNNT1NfTVNHX1FHUk9VUF9ERUxFVEVEOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgIFNUQUlMUV9SRU1PVkUoJm1zZ19xZ3JvdXBfbGlzdCwgcWdyb3VwLCBiY21vc19tc2dfcWdyb3VwLCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKworICAgIGJjbW9zX3NlbV9kZXN0cm95KCZxZ3JvdXAtPm0pOworCisgICAgLyogUmVsZWFzZSBhbGwgcGVuZGluZyBtZXNzYWdlcyAqLworICAgIGlmIChxZ3JvdXAtPm1zZ2wpCisgICAgeworICAgICAgICBmb3IgKHBydHkgPSAwOyBwcnR5IDwgcWdyb3VwLT5wYXJtLm5xdWV1ZXM7IHBydHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbXNnX2xpc3RfZGVzdHJveSgmcWdyb3VwLT5tc2dsW3BydHldKTsKKyAgICAgICAgfQorICAgICAgICBiY21vc19mcmVlKHFncm91cC0+bXNnbCk7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworCit9CisKKy8qKiBHZXQgcXVldWUgZ3JvdXAgaW5mbyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9xdWVyeShjb25zdCBiY21vc19tc2dfcWdyb3VwICpxZ3JvdXAsIGJjbW9zX21zZ19xZ3JvdXBfaW5mbyAqaW5mbykKK3sKKyAgICBpZiAoIXFncm91cCB8fCAhaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGluZm8tPnBhcm0gPSBxZ3JvdXAtPnBhcm07CisgICAgaW5mby0+c3RhdCA9IHFncm91cC0+c3RhdDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogTWVzc2FnZSBxdWV1ZSBncm91cCBpdGVyYXRvcgorICogXHBhcmFtW2luXSBwcmV2ICAgICAgUHJldmlvdXMgcXVldWUgZ3JvdXAuICpwcmV2PT1OVUxMIC0gZ2V0IGZpcnN0CisgKiBccmV0dXJuOiBCQ01fRVJSX09LLCBCQ01fRVJSX05PRU5ULCBCQ01fRVJSX05PX01PUkUKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9nZXRfbmV4dChjb25zdCBiY21vc19tc2dfcWdyb3VwICoqcHJldikKK3sKKyAgICBjb25zdCBiY21vc19tc2dfcWdyb3VwICpxZ3JwOworCisgICAgaWYgKHByZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIHFncnAgPSAqcHJldjsKKyAgICBpZiAocWdycCAmJiBxZ3JwLT5tYWdpYyAhPSBCQ01PU19NU0dfUUdST1VQX1ZBTElEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHFncnApCisgICAgeworICAgICAgICBxZ3JwID0gU1RBSUxRX05FWFQocWdycCwgbGlzdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHFncnAgPSBTVEFJTFFfRklSU1QoJm1zZ19xZ3JvdXBfbGlzdCk7CisgICAgfQorICAgICpwcmV2ID0gcWdycDsKKyAgICBpZiAoIXFncnApCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT19NT1JFOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogZ2V0IG1lc3NhZ2UgZnJvbSBub24tZW1wdHkgcXVldWUgZ3JvdXAgcXVldWUgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfbXNnICpfYmNtb3NfcWdyb3VwX21zZ19nZXQoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwLCBiY21vc19xZ3JvdXBfcHJ0eSBwcnR5KQoreworICAgIGJjbW9zX21zZyAqbXNnOworICAgIG1zZyA9IFNUQUlMUV9GSVJTVCgmcWdyb3VwLT5tc2dsW3BydHldKTsKKyAgICBCVUdfT04oIW1zZyk7CisgICAgU1RBSUxRX1JFTU9WRV9IRUFEKCZxZ3JvdXAtPm1zZ2xbcHJ0eV0sIG5leHQpOworICAgIGlmIChTVEFJTFFfRU1QVFkoJnFncm91cC0+bXNnbFtwcnR5XSkpCisgICAgeworICAgICAgICBxZ3JvdXAtPmFjdGl2ZV9tYXNrICY9IH4oMSA8PCBwcnR5KTsKKyAgICB9CisgICAgcmV0dXJuIG1zZzsKK30KKworLyogU2VuZCBtZXNzYWdlIHRvIHF1ZXVlIGdyb3VwICovCitiY21vc19lcnJubyBiY21vc19tc2dfc2VuZF90b19xZ3JvdXAoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwLCBiY21vc19tc2cgKm1zZywgYmNtb3NfcWdyb3VwX3BydHkgcHJ0eSwKKyAgICBiY21vc19tc2dfc2VuZF9mbGFncyBmbGFncykKK3sKKyAgICBsb25nIGxvY2tfZmxhZ3M7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgaWYgKHBydHkgPj0gcWdyb3VwLT5wYXJtLm5xdWV1ZXMpCisgICAgeworICAgICAgICBpZiAoIShmbGFncyAmIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIG1zZy0+c2VuZF9mbGFncyA9IGZsYWdzOworCisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnFncm91cC0+bG9jayk7CisKKyAgICAvKiBQdXQgaW50byB0aGUgcmVsZXZhbnQgcXVldWUgKi8KKyAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnFncm91cC0+bXNnbFtwcnR5XSwgbXNnLCBuZXh0KTsKKyAgICBxZ3JvdXAtPmFjdGl2ZV9tYXNrIHw9ICgxIDw8IHBydHkpOworICAgIF9iY21vc19xZ3JvdXBfc3RhdF9pbmMocWdyb3VwKTsKKworICAgIC8qIE92ZXJmbG93IGNoZWNrICovCisgICAgaWYgKChxZ3JvdXAtPnN0YXQubXNnX2luID4gcWdyb3VwLT5wYXJtLnNpemUpKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXNnICptOworICAgICAgICBiY21vc19xZ3JvdXBfcHJ0eSBpOworICAgICAgICAvKiBGaW5kIHRoZSBsb3dlc3QtcHJpb3JpdHkgcXVldWUgd2l0aCBkYXRhIGFuZCBkaXNjYXJkIHRoZSBoZWFkIG1lc3NhZ2UuCisgICAgICAgICAqIFRoZSBsb29wIGFsd2F5cyBmaW5kcyBzb21ldGhpbmcgYmVjYXVzZSB3ZSd2ZSBqdXN0IGFkZGVkIGEgbWVzc2FnZQorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gcWdyb3VwLT5wYXJtLm5xdWV1ZXMgLSAxOyAocWdyb3VwLT5hY3RpdmVfbWFzayAmICgxIDw8IGkpKSA9PSAwOyBpLS0pCisgICAgICAgICAgICA7CisgICAgICAgIG0gPSBfYmNtb3NfcWdyb3VwX21zZ19nZXQocWdyb3VwLCBpKTsKKyAgICAgICAgLS1xZ3JvdXAtPnN0YXQubXNnX2luOworICAgICAgICArK3Fncm91cC0+c3RhdC5tc2dfZGlzY2FyZGVkOworICAgICAgICBpZiAoIShtLT5zZW5kX2ZsYWdzICYgQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21zZ19mcmVlKG0pOworICAgICAgICB9CisgICAgICAgIHJjID0gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICAvKiBLaWNrIHdhaXRpbmcgdGFzayAqLworICAgIGlmIChxZ3JvdXAtPmlzX3dhaXRpbmcpCisgICAgeworICAgICAgICBxZ3JvdXAtPmlzX3dhaXRpbmcgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxZ3JvdXAtPmxvY2ssIGxvY2tfZmxhZ3MpOworICAgICAgICBiY21vc19zZW1fcG9zdCgmcWdyb3VwLT5tKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxZ3JvdXAtPmxvY2ssIGxvY2tfZmxhZ3MpOworICAgIH0KKworICAgIHJldHVybiByYzsKKworfQorCisvKiBHZXQgaGlnaGVzdCBwcmlvcml0eSBtZXNzYWdlIGZyb20gcXVldWUgZ3JvdXAgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19yZWN2X2Zyb21fcWdyb3VwKGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCwgdWludDMyX3QgdGltZW91dCwgYmNtb3NfbXNnICoqbXNnKQoreworICAgIGxvbmcgbG9ja19mbGFnczsKKyAgICBiY21vc19xZ3JvdXBfcHJ0eSBwcnR5OworCisgICAgaWYgKCFxZ3JvdXAgfHwgIW1zZykKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInFncm91cCAlcCwgbXNnICVwXG4iLCBxZ3JvdXAsIG1zZyk7CisKKyAgICBsb2NrX2ZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmcWdyb3VwLT5sb2NrKTsKKyAgICBpZiAoIXFncm91cC0+YWN0aXZlX21hc2spCisgICAgeworICAgICAgICBpZiAoIXRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcWdyb3VwLT5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVjZWl2ZSB3aXRoIHdhaXQgKi8KKyAgICAgICAgcWdyb3VwLT5pc193YWl0aW5nID0gQkNNT1NfVFJVRTsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxZ3JvdXAtPmxvY2ssIGxvY2tfZmxhZ3MpOworCisgICAgICAgIC8qIHdhaXQgZm9yIGl0ICovCisgICAgICAgIGJjbW9zX3NlbV93YWl0KCZxZ3JvdXAtPm0sIHRpbWVvdXQpOworCisgICAgICAgIC8qIERvbmUgd2FpdGluZy4gRWl0aGVyIGdvdCBhIG1lc3NhZ2Ugb3IgYSB0aW1lb3V0ICovCisgICAgICAgIGxvY2tfZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZxZ3JvdXAtPmxvY2spOworICAgICAgICBxZ3JvdXAtPmlzX3dhaXRpbmcgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgaWYgKCFxZ3JvdXAtPmFjdGl2ZV9tYXNrKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnFncm91cC0+bG9jaywgbG9ja19mbGFncyk7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9USU1FT1VUOworICAgICAgICB9CisgICAgfQorCisgICAgcHJ0eSA9IChiY21vc19xZ3JvdXBfcHJ0eSkoZmZzKHFncm91cC0+YWN0aXZlX21hc2spIC0gMSk7CisgICAgQlVHX09OKHBydHkgPj0gcWdyb3VwLT5wYXJtLm5xdWV1ZXMpOworICAgICptc2cgPSBfYmNtb3NfcWdyb3VwX21zZ19nZXQocWdyb3VwLCBwcnR5KTsKKyAgICBfYmNtb3NfcWdyb3VwX3N0YXRfZGVjKHFncm91cCk7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxZ3JvdXAtPmxvY2ssIGxvY2tfZmxhZ3MpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyoKKyAqIE1lc3NhZ2UgcmVnaXN0cmF0aW9uIGFuZCBkaXNwYXRjaAorICovCisKKy8qIEhhc2ggZW50cnkgKi8KK3R5cGVkZWYgc3RydWN0IG1zZ19oYXNoX2VudHJ5IG1zZ19oYXNoX2VudHJ5OworCitzdHJ1Y3QgbXNnX2hhc2hfZW50cnkKK3sKKyAgICAvKiBLZXkgKi8KKyAgICB1aW50MzJfdCBrZXk7ICAgICAgIC8qIG1zZ190eXBlICsgaW5zdGFuY2UgKi8KKworICAgIC8qIFZhbHVlICovCisgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZDsKKyAgICBGX2JjbW9zX21zZ19oYW5kbGVyIGhhbmRsZXI7CisKKyAgICAvKiBMaXN0IG9mIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBrZXkgKi8KKyAgICBTTElTVF9FTlRSWShtc2dfaGFzaF9lbnRyeSkgbGlzdDsKK307CisKKy8qIEhhc2ggdGFibGUgKi8KK3N0YXRpYyBTTElTVF9IRUFEKG1zZ19oYXNoLCBtc2dfaGFzaF9lbnRyeSkgbXNnX2hhc2hfdGFibGVbQkNNT1NfTVNHX0hBU0hfU0laRV07CisKKy8qIE1ha2UgaGFzaCBrZXkgZnJvbSBtc2dfdHlwZSBhbmQgaW5zdGFuY2UgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgX2JjbW9zX21zZ19oYXNoX2tleShiY21vc19tc2dfaWQgbXNnX3R5cGUsIGJjbW9zX21zZ19pbnN0YW5jZSBpbnN0YW5jZSkKK3sKKyAgICByZXR1cm4gKCh1aW50MzJfdClpbnN0YW5jZSA8PCAxNikgfCAodWludDMyX3QpbXNnX3R5cGU7Cit9CisKKy8qIEhhc2ggZnVuY3Rpb24gKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgX2JjbW9zX21zZ19oYXNoX2Z1bmModWludDMyX3Qga2V5KQoreworICAgIGtleSBePSAoa2V5ID4+IDkpOworICAgIGtleSBePSAoa2V5IDw8IDMpOworICAgIGtleSBePSAoa2V5ID4+IDE1KTsKKyAgICByZXR1cm4ga2V5ICUgQkNNT1NfTVNHX0hBU0hfU0laRTsKK30KKworLyogRmluZCBlbnRyeSBpbiBoYXNoICovCitzdGF0aWMgaW5saW5lIG1zZ19oYXNoX2VudHJ5ICpfYmNtb3NfbXNnX2hhc2hfZmluZChiY21vc19tc2dfaWQgbXNnX3R5cGUsIGJjbW9zX21zZ19pbnN0YW5jZSBpbnN0YW5jZSkKK3sKKyAgICB1aW50MzJfdCBrZXkgPSBfYmNtb3NfbXNnX2hhc2hfa2V5KG1zZ190eXBlLCBpbnN0YW5jZSk7CisgICAgdWludDMyX3QgaGFzaCA9IF9iY21vc19tc2dfaGFzaF9mdW5jKGtleSk7CisgICAgbXNnX2hhc2hfZW50cnkgKmVudHJ5OworICAgIFNMSVNUX0ZPUkVBQ0goZW50cnksICZtc2dfaGFzaF90YWJsZVtoYXNoXSwgbGlzdCkKKyAgICB7CisgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IGtleSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZW50cnk7Cit9CisKKy8qIFJlZ2lzdGVyIG1lc3NhZ2VfdHlwZStpbnN0YW5jZSAtLT4gbW9kdWxlK2hhbmRsZXIgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19yZWdpc3RlcihiY21vc19tc2dfaWQgbXNnX3R5cGUsIGJjbW9zX21zZ19pbnN0YW5jZSBpbnN0YW5jZSwKKyAgICBiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBGX2JjbW9zX21zZ19oYW5kbGVyIGhhbmRsZXIpCit7CisgICAgdWludDMyX3Qga2V5ID0gX2JjbW9zX21zZ19oYXNoX2tleShtc2dfdHlwZSwgaW5zdGFuY2UpOworICAgIHVpbnQzMl90IGhhc2ggPSBfYmNtb3NfbXNnX2hhc2hfZnVuYyhrZXkpOworICAgIG1zZ19oYXNoX2VudHJ5ICplbnRyeTsKKyAgICBsb25nIGxvY2tfZmxhZ3M7CisKKyAgICBpZiAoIWhhbmRsZXIpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBlbnRyeSA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKmVudHJ5KSk7CisgICAgaWYgKCFlbnRyeSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisKKyAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgIGVudHJ5LT5tb2R1bGVfaWQgPSBtb2R1bGVfaWQ7CisgICAgZW50cnktPmhhbmRsZXIgPSBoYW5kbGVyOworICAgIGxvY2tfZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jayk7CisgICAgaWYgKF9iY21vc19tc2dfaGFzaF9maW5kKG1zZ190eXBlLCBpbnN0YW5jZSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtb3NfbXNnX3JlZ2lzdGVyX2xvY2ssIGxvY2tfZmxhZ3MpOworICAgICAgICBiY21vc19mcmVlKGVudHJ5KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisgICAgU0xJU1RfSU5TRVJUX0hFQUQoJm1zZ19oYXNoX3RhYmxlW2hhc2hdLCBlbnRyeSwgbGlzdCk7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jaywgbG9ja19mbGFncyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3VucmVnaXN0ZXIoYmNtb3NfbXNnX2lkIG1zZ190eXBlLCBiY21vc19tc2dfaW5zdGFuY2UgaW5zdGFuY2UsIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQpCit7CisgICAgdWludDMyX3Qga2V5ID0gX2JjbW9zX21zZ19oYXNoX2tleShtc2dfdHlwZSwgaW5zdGFuY2UpOworICAgIHVpbnQzMl90IGhhc2ggPSBfYmNtb3NfbXNnX2hhc2hfZnVuYyhrZXkpOworICAgIG1zZ19oYXNoX2VudHJ5ICplbnRyeTsKKyAgICBsb25nIGxvY2tfZmxhZ3M7CisKKyAgICBsb2NrX2ZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmYmNtb3NfbXNnX3JlZ2lzdGVyX2xvY2spOworICAgIGVudHJ5ID0gX2JjbW9zX21zZ19oYXNoX2ZpbmQobXNnX3R5cGUsIGluc3RhbmNlKTsKKyAgICBpZiAoIWVudHJ5KQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKworICAgIGlmIChlbnRyeS0+bW9kdWxlX2lkICE9IG1vZHVsZV9pZCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtb3NfbXNnX3JlZ2lzdGVyX2xvY2ssIGxvY2tfZmxhZ3MpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlZBTElEX09QOworICAgIH0KKworICAgIFNMSVNUX1JFTU9WRSgmbXNnX2hhc2hfdGFibGVbaGFzaF0sIGVudHJ5LCBtc2dfaGFzaF9lbnRyeSwgbGlzdCk7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jaywgbG9ja19mbGFncyk7CisgICAgYmNtb3NfZnJlZShlbnRyeSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwordm9pZCBiY21vc19tc2dfc2h1dGRvd25fbW9kZV9zZXQoYmNtb3NfYm9vbCBzaHV0ZG93bl9tb2RlKQoreworICAgIGJjbW9zX21zZ19zaHV0ZG93bl9tb2RlID0gc2h1dGRvd25fbW9kZTsKK30KKworYmNtb3NfYm9vbCBiY21vc19tc2dfc2h1dGRvd25fbW9kZV9nZXQodm9pZCkKK3sKKyAgICByZXR1cm4gYmNtb3NfbXNnX3NodXRkb3duX21vZGU7Cit9CisKKy8qIERpc3BhdGNoIG1lc3NhZ2UgdG8gcmVnaXN0ZXJlZCBtb2R1bGUgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19kaXNwYXRjaChiY21vc19tc2cgKm1zZywgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgZmxhZ3MpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKHVubGlrZWx5KGJjbW9zX21zZ19zaHV0ZG93bl9tb2RlKSkKKyAgICB7CisgICAgICAgIC8qIEluIHNodXRkb3duIG1vZGUsIHdlIG5lZWQgdG8gYWNxdWlyZSB0aGUgc2FtZSBsb2NrIHVzZWQgdG8gcHJvdGVjdCBiY21vc19tc2dfcmVnaXN0ZXIoKSAvCisgICAgICAgICAqIGJjbW9zX21zZ191bnJlZ2lzdGVyKCksIHNpbmNlIHdlIG11c3Qgc3VwcG9ydCBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyBjb25jdXJyZW50bHkuICovCisgICAgICAgIG1zZ19oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgICAgYmNtb3Nfc2VtICpzZW1fdG9fcG9zdCA9IE5VTEw7CisgICAgICAgIGxvbmcgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmJjbW9zX21zZ19yZWdpc3Rlcl9sb2NrKTsKKyAgICAgICAgZW50cnkgPSBfYmNtb3NfbXNnX2hhc2hfZmluZChtc2ctPnR5cGUsIG1zZy0+aW5zdGFuY2UpOworCisgICAgICAgIGlmIChlbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgbXNnLT5oYW5kbGVyID0gZW50cnktPmhhbmRsZXI7CisgICAgICAgICAgICBlcnIgPSBfYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKGVudHJ5LT5tb2R1bGVfaWQsIG1zZywgZmxhZ3MsICZzZW1fdG9fcG9zdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOb3QgZm91bmQuIFJlbGVhc2UgYXV0b21hdGljYWxseSBpZiByZXF1ZXN0ZWQuICovCisgICAgICAgICAgICBpZiAoIShmbGFncyAmIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IpKQorICAgICAgICAgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7CisgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgICAgICB9CisKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIGlmIChzZW1fdG9fcG9zdCkKKyAgICAgICAgICAgIGJjbW9zX3NlbV9wb3N0KHNlbV90b19wb3N0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbXNnX2hhc2hfZW50cnkgKmVudHJ5ID0gX2JjbW9zX21zZ19oYXNoX2ZpbmQobXNnLT50eXBlLCBtc2ctPmluc3RhbmNlKTsKKworICAgICAgICBpZiAoZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZy0+aGFuZGxlciA9IGVudHJ5LT5oYW5kbGVyOworICAgICAgICAgICAgZXJyID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKGVudHJ5LT5tb2R1bGVfaWQsIG1zZywgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogTm90IGZvdW5kLiBSZWxlYXNlIGF1dG9tYXRpY2FsbHkgaWYgcmVxdWVzdGVkLiAqLworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBkaXNwYXRjaCB1bnJlZ2lzdGVyZWQgbXNnICVkOiVkXG4iLCBtc2ctPnR5cGUsIG1zZy0+aW5zdGFuY2UpOworICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBCQ01PU19NU0dfU0VORF9OT19GUkVFX09OX0VSUk9SKSkKKyAgICAgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBUYXNrIG1hbmFnZW1lbnQKKyAqLworCisvKgorICogRGVmYXVsdCB0YXNrIGhhbmRsZXIKKyAqLworLypsaW50IC1lezYzMiw2MzMsNjM0fQorICogVGhlcmUgYXJlIGEgZmV3IHdhcm5pbmdzIGFib3V0CisgKiBpbXBsaWNpdCBiY21vc19lcnJubyBjb252ZXJzaW9uIHRvIGludC4gSXQgaXMgdG8gYm90aGVyc29tZSBub3cKKyAqIHRvIGNoYW5nZSB0YXNrIGhhbmRsZXIgcHJvdG90eXBlIGV2ZXJ5d2hlcmUgYW5kIHRoZSB3YXJuaW5nIGlzIGhhcm1sZXNzCisgKi8KK2ludCBiY21vc19kZnRfdGFza19oYW5kbGVyKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc190YXNrICp0YXNrID0gKGJjbW9zX3Rhc2sgKilkYXRhOworICAgIGxvbmcgZmxhZ3MgPSAwLCBxX2ZsYWdzID0gMDsKKyAgICB1aW50MzJfdCBhY3RpdmVfbW9kdWxlczsKKyAgICBpbnQgbGFzdF9tb2R1bGUgPSAwOyAvKiAxLWJhc2VkIGxhc3QgaGFuZGxlZCBtb2R1bGUgaW5kZXggKi8KKyAgICBiY21vc19tb2R1bGUgKm1vZHVsZTsKKyAgICBiY21vc19tc2cgKm1zZzsKKyAgICBpbnQgcmM7CisKKworICAgIC8qIFNldCAvIHZhbGlkYXRlIHRhc2sgdGltZW91dCAqLworICAgIHJjID0gYmNtb3NfdGFza190aW1lb3V0X3NldCh0YXNrLCB0YXNrLT5wYXJtLm1zZ193YWl0X3RpbWVvdXQsIHRhc2stPnBhcm0udGltZW91dF9oYW5kbGVyKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogQ2FsbCBpbml0IGNhbGxiYWNrIGlmIGFueSAqLworICAgIGlmICh0YXNrLT5wYXJtLmluaXRfaGFuZGxlcikKKyAgICB7CisgICAgICAgIHJjID0gdGFzay0+cGFybS5pbml0X2hhbmRsZXIodGFzay0+cGFybS5kYXRhKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoIlRhc2sgJXM6IGluaXRfaGFuZGxlciByZXR1cm5lZCBlcnJvciAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgIHRhc2stPnBhcm0ubmFtZSwgYmNtb3Nfc3RyZXJyb3IoKGJjbW9zX2Vycm5vKXJjKSwgcmMpOworICAgICAgICAgICAgYmNtb3NfdGFza19kZXN0cm95KHRhc2spOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgLyogV2FpdCBmb3IgbW9kdWxlIGFjdGl2aXR5ICovCisgICAgd2hpbGUgKCF0YXNrLT5kZXN0cm95X3JlcXVlc3QpCisgICAgeworICAgICAgICB0YXNrLT5jdXJyZW50X21vZHVsZSA9IEJDTU9TX01PRFVMRV9JRF9OT05FOworCisgICAgICAgIC8qIFdhaXQgZm9yIG1vZHVsZSBhY3Rpdml0eSAqLworICAgICAgICByYyA9IGJjbW9zX3NlbV93YWl0KCZ0YXNrLT5hY3RpdmVfc2VtLCB0YXNrLT5wYXJtLm1zZ193YWl0X3RpbWVvdXQpOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgICBGX2JjbW9zX3Rhc2tfaGFuZGxlciB0aW1lb3V0X2hhbmRsZXIgPSB0YXNrLT5wYXJtLnRpbWVvdXRfaGFuZGxlcjsKKworICAgICAgICAgICAgLyogSGFuZGxlIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uICovCisgICAgICAgICAgICBpZiAoIXRpbWVvdXRfaGFuZGxlcikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHJjID0gdGltZW91dF9oYW5kbGVyKGRhdGEpOworICAgICAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJUYXNrICVzOiB0ZXJtaW5hdGVkIGJ5IHRpbWVvdXRfaGFuZGxlci4gZXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGFzay0+cGFybS5uYW1lLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEtlZXAgd2FpdGluZyAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBSUiBhY3RpdmUgbW9kdWxlcyAqLworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnRhc2stPmFjdGl2ZV9sb2NrKTsKKyAgICAgICAgICAgIGFjdGl2ZV9tb2R1bGVzID0gKHRhc2stPmFjdGl2ZV9tb2R1bGVzID4+IGxhc3RfbW9kdWxlKTsKKyAgICAgICAgICAgIGlmICghYWN0aXZlX21vZHVsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFzdF9tb2R1bGUgPSAwOworICAgICAgICAgICAgICAgIGFjdGl2ZV9tb2R1bGVzID0gdGFzay0+YWN0aXZlX21vZHVsZXM7CisgICAgICAgICAgICAgICAgaWYgKCFhY3RpdmVfbW9kdWxlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIE5vIG1vZHVsZXMgd2l0aCB3b3JrIHRvIGRvICovCisgICAgICAgICAgICAgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmdGFzay0+YWN0aXZlX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdF9tb2R1bGUgKz0gZmZzKGFjdGl2ZV9tb2R1bGVzKTsKKyAgICAgICAgICAgIEJVR19PTihsYXN0X21vZHVsZSA+IEJDTU9TX01BWF9NT0RVTEVTX1BFUl9UQVNLKTsKKyAgICAgICAgICAgIG1vZHVsZSA9IHRhc2stPm1vZHVsZXNbbGFzdF9tb2R1bGUgLSAxXTsKKyAgICAgICAgICAgIEJVR19PTighbW9kdWxlKTsKKworICAgICAgICAgICAgcV9mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJm1vZHVsZS0+bXNncS5sb2NrKTsKKyAgICAgICAgICAgIC8qIEdldCBtZXNzYWdlIGZyb20gdGhlIG1vZHVsZSdzIG1lc3NhZ2UgcXVldWUgKi8KKyAgICAgICAgICAgIG1zZyA9IF9iY21vc19tc2dfZ2V0KCZtb2R1bGUtPm1zZ3EpOworICAgICAgICAgICAgaWYgKCFtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZtb2R1bGUtPm1zZ3EubG9jaywgcV9mbGFncyk7CisgICAgICAgICAgICAgICAgdGFzay0+YWN0aXZlX21vZHVsZXMgJj0gfigxIDw8IChsYXN0X21vZHVsZSAtIDEpKTsKKyAgICAgICAgICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnRhc2stPmFjdGl2ZV9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmbW9kdWxlLT5tc2dxLmxvY2ssIHFfZmxhZ3MpOworICAgICAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZ0YXNrLT5hY3RpdmVfbG9jaywgZmxhZ3MpOworCisgICAgICAgICAgICAvKiBIYW5kbGUgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgIGlmIChtc2ctPmhhbmRsZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGFzay0+Y3VycmVudF9tb2R1bGUgPSBtb2R1bGUtPmlkOworICAgICAgICAgICAgICAgIG1zZy0+aGFuZGxlcihtb2R1bGUtPmlkLCBtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigibXNnLT5oYW5kbGVyIGlzIG5vdCBzZXQuIG1zZy0+dHlwZT0lZFxuIiwgbXNnLT50eXBlKTsKKyAgICAgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gd2hpbGUgKHRhc2stPmFjdGl2ZV9tb2R1bGVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogU2V0IHRhc2sgbWVzc2FnZSB0aW1lb3V0LgorICogVGhlIGZ1bmN0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGluIGludGVncmF0aW9uIG1vZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfdGFza190aW1lb3V0X3NldChiY21vc190YXNrICp0YXNrLCB1aW50MzJfdCB0aW1lb3V0LCBGX2JjbW9zX3Rhc2tfaGFuZGxlciB0aW1lb3V0X2hhbmRsZXIpCit7CisgICAgaWYgKHRhc2stPnBhcm0uaGFuZGxlcikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiJXM6IFRoZSBmdW5jdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBpbiBpbnRlZ3JhdGlvbiBtb2RlICh0YXNrIGhhbmRsZXIgPT0gTlVMTClcbiIsIHRhc2stPnBhcm0ubmFtZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorICAgIGlmICgodGltZW91dCAmJiB0aW1lb3V0ICE9IEJDTU9TX1dBSVRfRk9SRVZFUikgJiYgIXRpbWVvdXRfaGFuZGxlcikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiJXM6IHRpbWVvdXRfaGFuZGxlciBpcyBub3Qgc2V0XG4iLCB0YXNrLT5wYXJtLm5hbWUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIDAgbWVhbnMgRk9SRVZFUiBoZXJlICovCisgICAgaWYgKCF0aW1lb3V0KQorICAgICAgICB0aW1lb3V0ID0gQkNNT1NfV0FJVF9GT1JFVkVSOworCisgICAgdGFzay0+cGFybS50aW1lb3V0X2hhbmRsZXIgPSB0aW1lb3V0X2hhbmRsZXI7CisgICAgdGFzay0+cGFybS5tc2dfd2FpdF90aW1lb3V0ID0gdGltZW91dDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKgorICogTW9kdWxlCisgKi8KKworLyogUmVnaXN0ZXIgbW9kdWxlICovCitiY21vc19lcnJubyBiY21vc19tb2R1bGVfY3JlYXRlKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX3Rhc2sgKnRhc2ssIGJjbW9zX21vZHVsZV9wYXJtICpwYXJtKQoreworICAgIGJjbW9zX21vZHVsZSAqbW9kdWxlOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBpbnQgaTsKKworICAgIGlmICgodW5zaWduZWQpbW9kdWxlX2lkID49ICh1bnNpZ25lZClCQ01PU19NT0RVTEVfSURfX05VTV9PRiB8fCAhcGFybSkKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgIm1vZHVsZSAlZCwgcGFybSAlcFxuIiwgbW9kdWxlX2lkLCBwYXJtKTsKKyAgICBpZiAoIXRhc2spCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PVF9TVVBQT1JURUQsICJObyB0YXNrXG4iKTsKKyAgICBpZiAoYmNtb3NfbW9kdWxlc1ttb2R1bGVfaWRdKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9BTFJFQURZLCAibW9kdWxlX2lkICVkXG4iLCBtb2R1bGVfaWQpOworCisgICAgbW9kdWxlID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21vc19tb2R1bGUpKTsKKyAgICBpZiAoIW1vZHVsZSkKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9NRU0sICJtb2R1bGVfaWQgJWRcbiIsIG1vZHVsZV9pZCk7CisgICAgbW9kdWxlLT5pZCA9IG1vZHVsZV9pZDsKKyAgICBtb2R1bGUtPm15X3Rhc2sgPSB0YXNrOworICAgIG1vZHVsZS0+cGFybSA9ICpwYXJtOworICAgIG1vZHVsZS0+Y29udGV4dCA9ICh2b2lkICopcGFybS0+ZGF0YTsKKyAgICBiY21vc19tc2dfcXVldWVfbndfaW5pdCgmbW9kdWxlLT5tc2dxLCAmcGFybS0+cXBhcm0pOworICAgIC8qIENvcHkgbmFtZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgcmVsZWFzZWQgLSBpbiBjYXNlIGl0IHdhcyBvbiB0aGUgc3RhY2sgKi8KKyAgICBpZiAobW9kdWxlLT5wYXJtLnFwYXJtLm5hbWUpCisgICAgeworICAgICAgICBzdHJuY3B5KG1vZHVsZS0+bmFtZSwgbW9kdWxlLT5wYXJtLnFwYXJtLm5hbWUsIHNpemVvZihtb2R1bGUtPm5hbWUpIC0gMSk7CisgICAgICAgIG1vZHVsZS0+cGFybS5xcGFybS5uYW1lID0gbW9kdWxlLT5uYW1lOworICAgIH0KKworICAgIC8qIEFzc2lnbiBtb2R1bGUgaWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQkNNT1NfTUFYX01PRFVMRVNfUEVSX1RBU0s7IGkrKykKKyAgICB7CisgICAgICAgIGlmICghdGFzay0+bW9kdWxlc1tpXSkKKyAgICAgICAgeworICAgICAgICAgICAgdGFzay0+bW9kdWxlc1tpXSA9IG1vZHVsZTsKKyAgICAgICAgICAgIG1vZHVsZS0+aWR4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09ICBCQ01PU19NQVhfTU9EVUxFU19QRVJfVEFTSykKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUobW9kdWxlKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfVE9PX01BTlksICJtb2R1bGVfaWQgJWRcbiIsIG1vZHVsZV9pZCk7CisgICAgfQorCisgICAgYmNtb3NfbW9kdWxlc1ttb2R1bGVfaWRdID0gbW9kdWxlOworCisgICAgLyogSW5pdCBtb2R1bGUgKi8KKyAgICBpZiAocGFybS0+aW5pdCkKKyAgICB7CisgICAgICAgIHJjID0gcGFybS0+aW5pdChwYXJtLT5kYXRhKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgYmNtb3NfbW9kdWxlX2Rlc3Ryb3kobW9kdWxlX2lkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFVuLXJlZ2lzdGVyIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtb3NfbW9kdWxlX2Rlc3Ryb3koYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCkKK3sKKyAgICBiY21vc19tb2R1bGUgKm1vZHVsZSA9IF9iY21vc19tb2R1bGVfZ2V0KG1vZHVsZV9pZCk7CisgICAgYmNtb3NfdGFzayAqdGFzazsKKyAgICBsb25nIGxvY2tfZmxhZ3MsIHFfbG9ja19mbGFnczsKKyAgICBiY21vc19tc2dfbGlzdCBtc2dsX3VyZywgbXNnbDsKKworICAgIGlmICghbW9kdWxlKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT0VOVCwgIm1vZHVsZV9pZCAlZFxuIiwgbW9kdWxlX2lkKTsKKworICAgIHRhc2sgPSBtb2R1bGUtPm15X3Rhc2s7CisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnRhc2stPmFjdGl2ZV9sb2NrKTsKKyAgICB0YXNrLT5tb2R1bGVzW21vZHVsZS0+aWR4XSA9IE5VTEw7CisgICAgdGFzay0+YWN0aXZlX21vZHVsZXMgJj0gfigxIDw8IG1vZHVsZS0+aWR4KTsKKworICAgIC8qIEJlY2F1c2Ugd2UgYXJlIG5vdCBhbGxvd2VkIHRvIGZyZWUgbWVtb3J5ICh2aWEgYmNtb3NfZnJlZSgpKSB3aGVuIGludGVycnVwdHMgYXJlIGxvY2tlZCwgd2Ugb25seSBlbXB0eSB0aGUgbGlua2VkIGxpc3QgKHZpYSBTTElTVF9JTklUKCkpIGFuZCB0aGUgZnJlZSBjb21lcyBvdXRzaWRlIHRoZSBsb2NrZWQKKyAgICAgKiBzZWN0aW9uLiAqLworICAgIHFfbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJm1vZHVsZS0+bXNncS5sb2NrKTsKKyAgICBtc2dsX3VyZyA9IG1vZHVsZS0+bXNncS5tc2dsX3VyZzsKKyAgICBtc2dsID0gbW9kdWxlLT5tc2dxLm1zZ2w7CisgICAgU1RBSUxRX0lOSVQoJm1vZHVsZS0+bXNncS5tc2dsX3VyZyk7CisgICAgU1RBSUxRX0lOSVQoJm1vZHVsZS0+bXNncS5tc2dsKTsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJm1vZHVsZS0+bXNncS5sb2NrLCBxX2xvY2tfZmxhZ3MpOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmdGFzay0+YWN0aXZlX2xvY2ssIGxvY2tfZmxhZ3MpOworCisgICAgYmNtb3NfbXNnX2xpc3RfZGVzdHJveSgmbXNnbF91cmcpOworICAgIGJjbW9zX21zZ19saXN0X2Rlc3Ryb3koJm1zZ2wpOworCisgICAgaWYgKG1vZHVsZS0+cGFybS5leGl0KQorICAgICAgICBtb2R1bGUtPnBhcm0uZXhpdChtb2R1bGUtPnBhcm0uZGF0YSk7CisgICAgYmNtb3NfbW9kdWxlc1ttb2R1bGVfaWRdID0gTlVMTDsKKyAgICBiY21vc19mcmVlKG1vZHVsZSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogR2V0IGN1cnJlbnQgbW9kdWxlIGlkIGluIHRoZSBjdXJyZW50IHRhc2sgKi8KK2JjbW9zX21vZHVsZV9pZCBiY21vc19tb2R1bGVfY3VycmVudCh2b2lkKQoreworICAgIGJjbW9zX3Rhc2sgKnRhc2sgPSBiY21vc190YXNrX2N1cnJlbnQoKTsKKworICAgIGlmICghdGFzaykKKyAgICAgICAgcmV0dXJuIEJDTU9TX01PRFVMRV9JRF9OT05FOworICAgIHJldHVybiB0YXNrLT5jdXJyZW50X21vZHVsZTsKK30KKworLyogR2V0IG1vZHVsZSBjb250ZXh0IHNldCBieSBiY21vc19tb2R1bGVfY29udGV4dF9zZXQoKSAqLwordm9pZCAqYmNtb3NfbW9kdWxlX2NvbnRleHQoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCkKK3sKKyAgICBiY21vc19tb2R1bGUgKm1vZHVsZSA9IF9iY21vc19tb2R1bGVfZ2V0KG1vZHVsZV9pZCk7CisgICAgaWYgKCFtb2R1bGUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBtb2R1bGUtPmNvbnRleHQ7Cit9CisKKy8qIFNldCBtb2R1bGUgY29udGV4dCAqLworYmNtb3NfZXJybm8gYmNtb3NfbW9kdWxlX2NvbnRleHRfc2V0KGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIHZvaWQgKmNvbnRleHQpCit7CisgICAgYmNtb3NfbW9kdWxlICptb2R1bGUgPSBfYmNtb3NfbW9kdWxlX2dldChtb2R1bGVfaWQpOworCisgICAgaWYgKCFtb2R1bGUpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PRU5ULCAibW9kdWxlX2lkICVkXG4iLCBtb2R1bGVfaWQpOworICAgIG1vZHVsZS0+Y29udGV4dCA9IGNvbnRleHQ7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFF1ZXJ5IG1vZHVsZSBpbmZvICovCitiY21vc19lcnJubyBiY21vc19tb2R1bGVfcXVlcnkoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgY29uc3QgYmNtb3NfdGFzayAqKnRhc2ssIGJjbW9zX21zZ19xdWV1ZV9pbmZvICppbmZvKQoreworICAgIGJjbW9zX21vZHVsZSAqbW9kdWxlID0gX2JjbW9zX21vZHVsZV9nZXQobW9kdWxlX2lkKTsKKworICAgIGlmICghbW9kdWxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorICAgIGlmICh0YXNrKQorICAgIHsKKyAgICAgICAgKnRhc2sgPSBtb2R1bGUtPm15X3Rhc2s7CisgICAgfQorICAgIGlmIChpbmZvKQorICAgIHsKKyAgICAgICAgaW5mby0+cGFybSA9IG1vZHVsZS0+cGFybS5xcGFybTsKKyAgICAgICAgaW5mby0+c3RhdCA9IG1vZHVsZS0+bXNncS5zdGF0OworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoKKyAqIEV2ZW50cworICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudCBhcnJpdmFsIGluIG1vZHVsZSBjb250ZXh0ICovCitzdGF0aWMgdm9pZCBfYmNtb3NfZXZfaW5fbW9kdWxlX2hhbmRsZXIoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICptc2cpCit7CisgICAgYmNtb3NfZXZlbnQgKmV2ID0gX2JjbW9zX21zZ190b19ldmVudChtc2cpOworICAgIHVpbnQzMl90IGFjdGl2ZV9iaXRzOworICAgIGxvbmcgbG9ja19mbGFnczsKKworICAgIGFjdGl2ZV9iaXRzID0gZXYtPmFjdGl2ZV9iaXRzICYgZXYtPnBhcm0ubWFzazsKKyAgICBldi0+cGFybS5oYW5kbGVyKGV2LT5pZCwgYWN0aXZlX2JpdHMpOworCisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmV2LT5sb2NrKTsKKyAgICBldi0+YWN0aXZlX2JpdHMgJj0gfmFjdGl2ZV9iaXRzOworICAgIGV2LT5pc193YWl0aW5nID0gQkNNT1NfVFJVRTsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmV2LT5sb2NrLCBsb2NrX2ZsYWdzKTsKK30KKworLyogUmVsZWFzZSBldmVudCBtZXNzYWdlLiBPbmx5IGNhbGxlZCBpbiBleGNlcHRpb25hbCBzaXR1YXRpb25zLAorICogc3VjaCBhcyBtb2R1bGUgcXVldWUgZGVzdHJveS4gRG8gbm90aGluZy4KKyAqLworc3RhdGljIHZvaWQgX2JjbW9zX2V2X21zZ19yZWxlYXNlKGJjbW9zX21zZyAqbXNnKQoreworfQorCisvKiBDcmVhdGUgZXZlbnQgc2V0ICovCitiY21vc19lcnJubyBiY21vc19ldmVudF9jcmVhdGUoYmNtb3NfZXZlbnRfaWQgZXZlbnRfaWQsIGJjbW9zX2V2ZW50X3Bhcm0gKnBhcm0pCit7CisgICAgYmNtb3NfZXZlbnQgKmV2OworICAgIGJjbW9zX21vZHVsZSAqbW9kdWxlID0gTlVMTDsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmICgodW5zaWduZWQpZXZlbnRfaWQgPj0gKHVuc2lnbmVkKUJDTU9TX0VWRU5UX0lEX19OVU1fT0YpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJldmVudF9pZCAlZFxuIiwgZXZlbnRfaWQpOworCisgICAgaWYgKF9iY21vc19ldmVudF9nZXQoZXZlbnRfaWQpKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9BTFJFQURZLCAiZXZlbnRfaWQgJWRcbiIsIGV2ZW50X2lkKTsKKworICAgIGlmIChwYXJtICYmIHBhcm0tPm1vZHVsZV9pZCAhPSBCQ01PU19NT0RVTEVfSURfTk9ORSkKKyAgICB7CisgICAgICAgIG1vZHVsZSA9IF9iY21vc19tb2R1bGVfZ2V0KHBhcm0tPm1vZHVsZV9pZCk7CisgICAgICAgIGlmICghbW9kdWxlKQorICAgICAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9FTlQsICJtb2R1bGVfaWQgJWRcbiIsIHBhcm0tPm1vZHVsZV9pZCk7CisgICAgICAgIGlmICghcGFybS0+aGFuZGxlciB8fCAhcGFybS0+bWFzaykKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJldmVudF9pZCAlZCwgaGFuZGxlciAlcCwgbWFzayAleFxuIiwgZXZlbnRfaWQsIHBhcm0tPmhhbmRsZXIsIHBhcm0tPm1hc2spOworICAgIH0KKworICAgIGV2ID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21vc19ldmVudCkpOworICAgIGlmICghZXYpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PTUVNLCAiZXZlbnRfaWQgJWRcbiIsIGV2ZW50X2lkKTsKKworICAgIGV2LT5pZCA9IGV2ZW50X2lkOworICAgIGlmIChwYXJtKQorICAgICAgICBldi0+cGFybSA9ICpwYXJtOworICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJmV2LT5sb2NrLCBldi0+cGFybS5mbGFncyk7CisgICAgeworICAgICAgICByYyA9IGJjbW9zX3NlbV9jcmVhdGUoJmV2LT5tLCAwLCBldi0+cGFybS5mbGFncywgZXYtPnBhcm0ubmFtZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZnJlZShldik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGV2ZW50IG1lc3NhZ2UgaW4gaW50ZWdyYXRpb24gbW9kZSAqLworICAgIGlmIChldi0+cGFybS5tb2R1bGVfaWQgIT0gQkNNT1NfTU9EVUxFX0lEX05PTkUpCisgICAgeworICAgICAgICBldi0+bXNnLmhhbmRsZXIgPSBfYmNtb3NfZXZfaW5fbW9kdWxlX2hhbmRsZXI7CisgICAgICAgIGV2LT5tc2cucmVsZWFzZSA9IF9iY21vc19ldl9tc2dfcmVsZWFzZTsKKyAgICAgICAgZXYtPm1zZy5zZW5kZXIgPSBCQ01PU19NT0RVTEVfSURfTk9ORTsKKyAgICAgICAgZXYtPm1zZy50eXBlID0gQkNNT1NfTVNHX0lEX0lOVEVSTkFMX0VWRU5UOworICAgICAgICBldi0+aXNfd2FpdGluZyA9IEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgLyogQ29weSBuYW1lIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5vdCByZWxlYXNlZCAtIGluIGNhc2UgaXQgd2FzIG9uIHRoZSBzdGFjayAqLworICAgIGlmIChldi0+cGFybS5uYW1lKQorICAgIHsKKyAgICAgICAgc3RybmNweShldi0+bmFtZSwgZXYtPnBhcm0ubmFtZSwgc2l6ZW9mKGV2LT5uYW1lKSAtIDEpOworICAgICAgICBldi0+cGFybS5uYW1lID0gZXYtPm5hbWU7CisgICAgfQorCisgICAgYmNtb3NfZXZlbnRzW2V2ZW50X2lkXSA9IGV2OworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERlc3Ryb3kgZXZlbnQgc2V0IGNyZWF0ZWQgYnkgYmNtb3NfZXZlbnRfY3JlYXRlKCkgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2V2ZW50X2Rlc3Ryb3koYmNtb3NfZXZlbnRfaWQgZXZlbnRfaWQpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKK30KKworLyogUmFpc2UgZXZlbnQgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2V2ZW50X3JhaXNlKGJjbW9zX2V2ZW50X2lkIGV2ZW50X2lkLCB1aW50MzJfdCBhY3RpdmVfYml0cykKK3sKKyAgICBiY21vc19ldmVudCAqZXYgPSBfYmNtb3NfZXZlbnRfZ2V0KGV2ZW50X2lkKTsKKyAgICBsb25nIGxvY2tfZmxhZ3M7CisKKyAgICBpZiAoIWV2KQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT0VOVCwgImV2ZW50X2lkICVkXG4iLCBldmVudF9pZCk7CisKKyAgICBsb2NrX2ZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmZXYtPmxvY2spOworICAgIGV2LT5hY3RpdmVfYml0cyB8PSBhY3RpdmVfYml0czsKKyAgICBpZiAoZXYtPmlzX3dhaXRpbmcgJiYgKGV2LT5hY3RpdmVfYml0cyAmIGV2LT5wYXJtLm1hc2spKQorICAgIHsKKyAgICAgICAgZXYtPmlzX3dhaXRpbmcgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZldi0+bG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIGlmIChldi0+cGFybS5tb2R1bGVfaWQgIT0gQkNNT1NfTU9EVUxFX0lEX05PTkUpCisgICAgICAgICAgICBiY21vc19tc2dfc2VuZF90b19tb2R1bGUoZXYtPnBhcm0ubW9kdWxlX2lkLCAmZXYtPm1zZywgQkNNT1NfTVNHX1NFTkRfVVJHRU5UIHwgQkNNT1NfTVNHX1NFTkRfTk9MSU1JVCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJjbW9zX3NlbV9wb3N0KCZldi0+bSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZXYtPmxvY2ssIGxvY2tfZmxhZ3MpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBXYWl0IGZvciBldmVudCAqLworYmNtb3NfZXJybm8gYmNtb3NfZXZlbnRfcmVjdihiY21vc19ldmVudF9pZCBldmVudF9pZCwgdWludDMyX3QgbWFzaywKKyAgICB1aW50MzJfdCB0aW1lb3V0LCB1aW50MzJfdCAqYWN0aXZlX2JpdHMpCit7CisgICAgYmNtb3NfZXZlbnQgKmV2ID0gX2JjbW9zX2V2ZW50X2dldChldmVudF9pZCk7CisgICAgbG9uZyBsb2NrX2ZsYWdzOworCisgICAgQlVHX09OKCFhY3RpdmVfYml0cyk7CisgICAgaWYgKCFldikKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9FTlQsICJldmVudF9pZCAlZCBpcyBub3QgcmVnaXN0ZXJlZFxuIiwgZXZlbnRfaWQpOworCisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmV2LT5sb2NrKTsKKyAgICAqYWN0aXZlX2JpdHMgPSBldi0+YWN0aXZlX2JpdHMgJiBtYXNrOworICAgIGlmICgqYWN0aXZlX2JpdHMpCisgICAgeworICAgICAgICBldi0+YWN0aXZlX2JpdHMgJj0gfiAqYWN0aXZlX2JpdHM7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZXYtPmxvY2ssIGxvY2tfZmxhZ3MpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgaWYgKCF0aW1lb3V0KQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZldi0+bG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKworICAgIC8qIHJlY3Ygd2l0aCB3YWl0ICovCisgICAgZXYtPmlzX3dhaXRpbmcgPSBCQ01PU19UUlVFOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZXYtPmxvY2ssIGxvY2tfZmxhZ3MpOworCisgICAgLyogd2FpdCBmb3IgaXQgKi8KKyAgICBiY21vc19zZW1fd2FpdCgmZXYtPm0sIHRpbWVvdXQpOworICAgIC8qIEVpdGhlciBnb3QgZXZlbnQgb3IgdGltZW91dCAqLworICAgIGxvY2tfZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZldi0+bG9jayk7CisgICAgKmFjdGl2ZV9iaXRzID0gZXYtPmFjdGl2ZV9iaXRzICYgbWFzazsKKyAgICBldi0+YWN0aXZlX2JpdHMgJj0gfiAqYWN0aXZlX2JpdHM7CisgICAgZXYtPmlzX3dhaXRpbmcgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmV2LT5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICAvKiBJZiB3ZSB3YWl0IGZvcmV2ZXIgYW5kIHdlIGdvdCBhbiBldmVudCB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZSBtYXNrIHdlIHdhaXQgb24gKHRoaXMgaXMgdGhlIG9ubHkgcG9zc2libGUgcmVhc29uIGdldHRpbmcgaGVyZSBpZiB3YWl0aW5nIGZvcmV2ZXIpLCB0aGVuIHdlCisgICAgICogd2FudCB0byBhdm9pZCByZXR1cm5pbmcgQkNNX0VSUl9USU1FT1VUIC0gaXQncyBub3QgYW4gZXJyb3IuICovCisgICAgaWYgKHRpbWVvdXQgIT0gQkNNT1NfV0FJVF9GT1JFVkVSICYmICEqYWN0aXZlX2JpdHMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1RJTUVPVVQ7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qCisgKiBUaW1lcgorICovCisKKy8qIGNvbXBhcmUgdGltZXN0YW1wcyBtaW5kaW5nIHdyYXAtYXJvdW5kCisgKiByZXR1cm5zIGRlbHRhID49IDAgaWYgdHMxID49IHRzMgorICovCitzdGF0aWMgaW5saW5lIGludDMyX3QgX2JjbW9zX3RpbWVyX3RzX2RlbHRhKHVpbnQzMl90IHRzMSwgdWludDMyX3QgdHMyKQoreworICAgIGludDMyX3QgZGVsdGEgPSAoaW50KSh0czEgLSB0czIpOworICAgIHJldHVybiBkZWx0YTsKK30KKworc3RhdGljIGludDMyX3QgX2JjbW9zX3RpbWVyX2NvbXBhcmUoc3RydWN0IGJjbW9zX3RpbWVyICp0MSwgc3RydWN0IGJjbW9zX3RpbWVyICp0MikKK3sKKyAgICBpbnQzMl90IGRlbHRhID0gX2JjbW9zX3RpbWVyX3RzX2RlbHRhKHQxLT5leHBpcmVfYXQsIHQyLT5leHBpcmVfYXQpOworI2lmIGRlZmluZWQoQkNNT1NfVElNRVJfUkJfVFJFRSkgJiYgIWRlZmluZWQoQkNNT1NfVElNRVJfUkJfVFJFRV9MSVNUKQorICAgIC8qIEZyZWVCU0QgUkIgdHJlZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgMiBub2RlcyB3aXRoIHRoZSBzYW1lIGtleSAqLworICAgIGlmICghZGVsdGEpCisgICAgICAgIGRlbHRhID0gMTsKKyNlbmRpZgorICAgIHJldHVybiBkZWx0YTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9iY21vc19zdGFydF9zeXN0ZW1fdGltZXIoYmNtb3NfdGltZXIgKmhlYWQpCit7CisgICAgaWYgKGhlYWQpCisgICAgeworICAgICAgICBpbnQzMl90IGRlbGF5ID0gX2JjbW9zX3RpbWVyX3RzX2RlbHRhKGhlYWQtPmV4cGlyZV9hdCwgYmNtb3NfdGltZXN0YW1wKCkpOworICAgICAgICAvKiBIYW5kbGUgcmFyZSByYWNlIGNvbmRpdGlvbiB3aGVuIG5leHQgdGltZXIgZXhwaXJlZCB3aGlsZSB3ZSB3ZXJlIGZpZGRsaW5nCisgICAgICAgICAqIHdpdGggdGhlIHBvb2wuIEp1c3QgZ2l2ZSBpdCAxIG1vcmUgInRpY2siLiBTeXN0ZW0gaGFuZGxlciBoYW5kbGVzIGFsbCB0aW1lcnMKKyAgICAgICAgICogZXhwaXJlZCAoPG5vdyAuLiBub3cgKyBQUkVDSVNJT04vMikKKyAgICAgICAgICovCisgICAgICAgIGlmIChkZWxheSA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBkZWxheSA9IEJDTU9TX1RJTUVSX1BSRUNJU0lPTl9VUyAvIDI7CisgICAgICAgIH0KKyAgICAgICAgYmNtb3Nfc3lzX3RpbWVyX3N0YXJ0KCZ0bXJfcG9vbC5zeXNfdGltZXIsIGRlbGF5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb3Nfc3lzX3RpbWVyX3N0b3AoJnRtcl9wb29sLnN5c190aW1lcik7CisgICAgfQorfQorCisvKgorICogVGltZXIgcG9vbDogUkIgdHJlZSBvciBUQUlMUS1iYXNlZCBpbXBsZW1lbnRhdGlvbgorICovCitzdGF0aWMgdm9pZCBfYmNtb3NfdGltZXJfcG9vbF9pbnNlcnQoYmNtb3NfdGltZXIgKnRpbWVyLCB1aW50MzJfdCBkZWxheSwgYmNtb3NfYm9vbCBzdGFydF9zeXNfdGltZXIpCit7CisgICAgbG9uZyBmbGFnczsKKyAgICBiY21vc190aW1lciAqaGVhZDsKKworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmdG1yX3Bvb2wubG9jayk7CisgICAgaWYgKEJDTU9TX1RJTUVSX0lTX1JVTk5JTkcodGltZXIpKQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZ0bXJfcG9vbC5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdGltZXItPnBlcmlvZCA9IHRpbWVyLT5wYXJtLnBlcmlvZGljID8gZGVsYXkgOiAwOworICAgIHRpbWVyLT5leHBpcmVfYXQgPSBCQ01PU19ST1VORF9VUChiY21vc190aW1lc3RhbXAoKSArIGRlbGF5LCBCQ01PU19USU1FUl9QUkVDSVNJT05fVVMgLyAyKTsKKyAgICBUTVJfUE9PTF9JTlNFUlQoJnRtcl9wb29sLCB0aW1lcik7CisgICAgdGltZXItPmZsYWdzICY9IH5CQ01PU19USU1FUl9GTEFHX0VYUElSRUQ7CisgICAgdGltZXItPmZsYWdzIHw9IEJDTU9TX1RJTUVSX0ZMQUdfUlVOTklORzsKKworICAgIC8qIElmIG5ldyB0aW1lciBpcyBhdCB0aGUgdG9wIC0ga2ljayBzeXN0ZW0gdGltZXIgKi8KKyAgICBpZiAoc3RhcnRfc3lzX3RpbWVyKQorICAgIHsKKyAgICAgICAgaGVhZCA9IFRNUl9QT09MX0ZJUlNUKCZ0bXJfcG9vbCk7CisgICAgICAgIGlmICh0aW1lciA9PSBoZWFkKQorICAgICAgICB7CisgICAgICAgICAgICBfYmNtb3Nfc3RhcnRfc3lzdGVtX3RpbWVyKGhlYWQpOworICAgICAgICB9CisgICAgfQorICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmdG1yX3Bvb2wubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBfYmNtb3NfdGltZXJfc3RvcChiY21vc190aW1lciAqdGltZXIpCit7CisgICAgbG9uZyBmbGFnczsKKyAgICBiY21vc19ib29sIHdhc190b3A7CisgICAgYmNtb3NfbXNnX3F1ZXVlX253ICpxdWV1ZTsKKworICAgIC8qIEZpcnN0IHRha2UgcnVubmluZyB0aW1lciBvdXQgb2YgdGhlIGFjdGl2ZSBwb29sICovCisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZ0bXJfcG9vbC5sb2NrKTsKKyAgICB0aW1lci0+cGVyaW9kID0gMDsgLyogUHJldmVudCBwZXJpb2RpYyB0aW1lciByZXN0YXJ0ICovCisgICAgaWYgKEJDTU9TX1RJTUVSX0lTX1JVTk5JTkcodGltZXIpKQorICAgIHsKKyAgICAgICAgdGltZXItPmZsYWdzICY9IH5CQ01PU19USU1FUl9GTEFHX1JVTk5JTkc7CisgICAgICAgIHdhc190b3AgPSAodGltZXIgPT0gVE1SX1BPT0xfRklSU1QoJnRtcl9wb29sKSk7CisgICAgICAgIFRNUl9QT09MX1JFTU9WRSgmdG1yX3Bvb2wsIHRpbWVyKTsKKworICAgICAgICAvKiBJZiB0aW1lciB3YXMgdGhlIHRvcCAtIHN0b3AvcmVzdGFydCBzeXN0ZW0gdGltZXIgKi8KKyAgICAgICAgaWYgKHdhc190b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9iY21vc19zdGFydF9zeXN0ZW1fdGltZXIoVE1SX1BPT0xfRklSU1QoJnRtcl9wb29sKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZ0bXJfcG9vbC5sb2NrLCBmbGFncyk7CisKKyAgICAvKiBOb3cgdGltZXIgaXMgbm90IGluIHRoZSBhY3RpdmUgcG9vbC4gUGVyaGFwcyBpdCBpcyBhbHJlYWR5IGluCisgICAgICogZGVzdGluYXRpb24gbW9kdWxlJ3MgcXVldWUuIFRha2UgaXQgb3V0IGlmIHllcy4KKyAgICAgKi8KKyAgICBxdWV1ZSA9IHRpbWVyLT5xdWV1ZTsKKyAgICBpZiAocXVldWUpCisgICAgeworICAgICAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnF1ZXVlLT5sb2NrKTsKKyAgICAgICAgLyogQ2hlY2sgcXVldWUgYWdhaW4gYmVjYXVzZSB0aGUgcHJldmlvdXMgY2hlY2sgd2FzIHVucHJvdGVjdGVkICovCisgICAgICAgIGlmICh0aW1lci0+cXVldWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21zZ19saXN0ICptc2dfbGlzdCA9ICgodGltZXItPnBhcm0uZmxhZ3MgJiBCQ01PU19USU1FUl9QQVJNX0ZMQUdTX05PTl9VUkdFTlQpKQorICAgICAgICAgICAgICAgID8gJnF1ZXVlLT5tc2dsIDogJnF1ZXVlLT5tc2dsX3VyZzsKKyAgICAgICAgICAgIGlmIChTVEFJTFFfUkVNT1ZFX1NBRkUobXNnX2xpc3QsICZ0aW1lci0+bXNnLCBiY21vc19tc2csIG5leHQpICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2JjbW9zX21zZ3Ffc3RhdF9kZWMocXVldWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZXItPnF1ZXVlID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB0aW1lci0+ZmxhZ3MgJj0gfkJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRDsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxdWV1ZS0+bG9jaywgZmxhZ3MpOworICAgIH0KKworICAgIC8qIElmIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQgYW5kIHdlIHdlcmVuJ3QgYWJsZSB0byBzdG9wIGl0IC0KKyAgICAgKiB3YWl0IGZvciBleHBpcmF0aW9uIGNhbGxiYWNrIHRvIGZpbmlzaCBiZWZvcmUgbGVhdmluZyBfYmNtb3NfdGltZXJfc3RvcCgpCisgICAgICovCisgICAgaWYgKEJDTU9TX1RJTUVSX0lTX0VYUElSRUQodGltZXIpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdGFzayAqdCA9IGJjbW9zX3Rhc2tfY3VycmVudCgpOworCisgICAgICAgIC8qIFNraXAgd2FpdCBpZiB0aW1lciBpcyBiZWluZyBzdG9wcGVkIC8gcmVzdGFydGVkIGZyb20gaW5zaWRlIHRoZSBoYW5kbGVyICovCisgICAgICAgIGlmICh0ICE9IHRpbWVyLT50YXNrKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVElNRVJfSVNfRVhQSVJFRCh0aW1lcikgJiYgQkNNT1NfVElNRVJfSVNfVkFMSUQodGltZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3VzbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVyLT5mbGFncyAmPSB+QkNNT1NfVElNRVJfRkxBR19FWFBJUkVEOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qIFN5c3RlbSB0aW1lciBleHBpcmF0aW9uIGhhbmRsZXIuCisgKiBFeGVjdXRlIGFsbCB0aW1lcnMgdGhhdCBleHBpcmVkIGFuZCByZXN0YXJ0IHN5c3RlbSB0aW1lcgorICovCitzdGF0aWMgdm9pZCBfc3lzX3RpbWVyX2hhbmRsZXIodm9pZCAqZGF0YSkKK3sKKyAgICBiY21vc190aW1lcl9wb29sICpwb29sID0gKGJjbW9zX3RpbWVyX3Bvb2wgKilkYXRhOworICAgIGJjbW9zX3RpbWVyICp0aW1lcjsKKyAgICBiY21vc190aW1lcl9yYyByYzsKKyAgICBsb25nIGZsYWdzOworCisgICAgQlVHX09OKHBvb2wgIT0gJnRtcl9wb29sKTsKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnBvb2wtPmxvY2spOworICAgIHdoaWxlICgodGltZXI9VE1SX1BPT0xfRklSU1QocG9vbCkpICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBTdG9wIHdoZW4gcmVhY2hlZCB0aW1lciB0aGF0IGhhc24ndCBleHBpcmVkIHlldCAqLworICAgICAgICBpZiAoX2JjbW9zX3RpbWVyX3RzX2RlbHRhKHRpbWVyLT5leHBpcmVfYXQsIGJjbW9zX3RpbWVzdGFtcCgpKSA+IEJDTU9TX1RJTUVSX1BSRUNJU0lPTl9VUyAvIDIpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdGltZXItPmZsYWdzIHw9IEJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRDsKKyAgICAgICAgdGltZXItPmZsYWdzICY9IH5CQ01PU19USU1FUl9GTEFHX1JVTk5JTkc7CisgICAgICAgIC8qIElUOiBCYXJyaWVyIGhlcmUgPyAqLworICAgICAgICBUTVJfUE9PTF9SRU1PVkUocG9vbCwgdGltZXIpOworCisgICAgICAgIC8qIEV4ZWN1dGUgaGFuZGxlci4gVW5sb2NrIGZpcnN0IGFuZCByZS1sb2NrIGluIHRoZSBlbmQKKyAgICAgICAgICogSXQgaXMgc2FmZSB0byB1bmxvY2sgaGVyZSBiZWNhdXNlIHRoZSB0b3AgbG9vcCBzdGFydHMgZnJvbSBNSU4gZXZlcnkgdGltZQorICAgICAgICAgKi8KKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZwb29sLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJjID0gdGltZXItPmhhbmRsZXIodGltZXIsIHRpbWVyLT5wYXJtLmRhdGEpOworICAgICAgICBpZiAoIXRpbWVyLT5wYXJtLm93bmVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmMgPT0gQkNNT1NfVElNRVJfT0sgJiYgdGltZXItPnBlcmlvZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnRlcnZhbCA9IHRpbWVyLT5wZXJpb2Q7CisgICAgICAgICAgICAgICAgdGltZXItPnBlcmlvZCA9IDA7CisgICAgICAgICAgICAgICAgX2JjbW9zX3RpbWVyX3Bvb2xfaW5zZXJ0KHRpbWVyLCBpbnRlcnZhbCwgQkNNT1NfRkFMU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRpbWVyLT5mbGFncyAmPSB+QkNNT1NfVElNRVJfRkxBR19FWFBJUkVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmcG9vbC0+bG9jayk7CisgICAgfQorICAgIC8qIEZpbmFsbHkga2ljayBzeXN0ZW0gdGltZXIgKi8KKyAgICBfYmNtb3Nfc3RhcnRfc3lzdGVtX3RpbWVyKHRpbWVyKTsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnBvb2wtPmxvY2ssIGZsYWdzKTsKK30KKworLyogU2VuZCB0aW1lciBleHBpcmF0aW9uIHRvIHRoZSB0YXJnZXQgbW9kdWxlIGFzIHVyZ2VudCBtZXNzYWdlLgorICogX2JjbW9zX3RpbWVyX2luX21vZHVsZV9oYW5kbGVyKCkgd2lsbCBnZXQgY2FsbGVkIGluIHRoZSBtb2R1bGUgY29udGV4dAorICovCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgX2JjbW9zX3RpbWVyX3NlbmRfdG9fbW9kdWxlX2hhbmRsZXIoYmNtb3NfdGltZXIgKnRpbWVyLCBsb25nIGRhdGEpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb3NfbW9kdWxlICptb2R1bGUgPSBfYmNtb3NfbW9kdWxlX2dldCh0aW1lci0+cGFybS5vd25lcik7CisgICAgYmNtb3NfbXNnX3NlbmRfZmxhZ3Mgc2VuZF9mbGFnczsKKyAgICBpZiAoIW1vZHVsZSkKKyAgICB7CisgICAgICAgIC8qIFNob3VsZG4ndCBoYXBwZW4sIHVubGVzcyB0aGUgbW9kdWxlIHdhcyBkZXN0cm95ZWQgKi8KKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJfYmNtb3NfdGltZXJfc2VuZF90b19tb2R1bGVfaGFuZGxlcigpIC0tIG5vIG1vZHVsZT0ldSAodGltZXItPnBhcm0uaGFuZGxlcj0weCVwKVxuIiwgdGltZXItPnBhcm0ub3duZXIsIHRpbWVyLT5wYXJtLmhhbmRsZXIpOworICAgICAgICB0aW1lci0+ZmxhZ3MgJj0gfkJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRDsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RJTUVSX1NUT1A7ICAgICAgLyogd2lsbCByZXN0YXJ0IGluIG1vZHVsZSBjb250ZXh0IGlmIG5lY2Vzc2FyeSAqLworICAgIH0KKyAgICB0aW1lci0+cXVldWUgPSAmbW9kdWxlLT5tc2dxOworICAgIHNlbmRfZmxhZ3MgPSBCQ01PU19NU0dfU0VORF9OT0xJTUlUOworICAgIGlmICghKCh0aW1lci0+cGFybS5mbGFncyAmIEJDTU9TX1RJTUVSX1BBUk1fRkxBR1NfTk9OX1VSR0VOVCkpKQorICAgICAgICBzZW5kX2ZsYWdzIHw9IEJDTU9TX01TR19TRU5EX1VSR0VOVDsKKyAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZSh0aW1lci0+cGFybS5vd25lciwgJnRpbWVyLT5tc2csIHNlbmRfZmxhZ3MpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIC8qIFNob3VsZG4ndCBoYXBwZW4sIHVubGVzcyB0aGUgbW9kdWxlIHdhcyBkZXN0cm95ZWQuIFZlcnkgc2hvcnQgcmFjZSBjb25kaXRpb24gaGVyZSAqLworICAgICAgICB0aW1lci0+cXVldWUgPSBOVUxMOworICAgICAgICB0aW1lci0+ZmxhZ3MgJj0gfkJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRDsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJfYmNtb3NfdGltZXJfc2VuZF90b19tb2R1bGVfaGFuZGxlcigpIC0tPiAlZFxuIiwgcmMpOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfVElNRVJfU1RPUDsgLyogd2lsbCByZXN0YXJ0IGluIG1vZHVsZSBjb250ZXh0IGlmIG5lY2Vzc2FyeSAqLworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGltZXIgZXhwaXJhdGlvbiBpbiBtb2R1bGUgY29udGV4dCAqLworc3RhdGljIHZvaWQgX2JjbW9zX3RpbWVyX2luX21vZHVsZV9oYW5kbGVyKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqbXNnKQoreworICAgIGJjbW9zX3RpbWVyICp0aW1lciA9IF9iY21vc19tc2dfdG9fdGltZXIobXNnKTsKKyAgICBiY21vc19tb2R1bGUgKm1vZHVsZSA9IF9iY21vc19tb2R1bGVfZ2V0KHRpbWVyLT5wYXJtLm93bmVyKTsKKyAgICBiY21vc190aW1lcl9yYyByYzsKKworICAgIC8qIENhbGwgdGltZXIncyBjYWxsYmFjayBmdW5jdGlvbiBhbmQgcmVzdGFydCB0aGUgdGltZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgdGltZXItPnF1ZXVlID0gTlVMTDsKKyAgICAvKiBtb2R1bGUgY2FuJ3QgYmUgTlVMTCBoZXJlLiBpdCBpcyBjaGVja2VkIGFueXdheSB0byBrZWVwIHN0YXRpYyBjb2RlIGFuYWx5emVyIGhhcHB5ICovCisgICAgdGltZXItPnRhc2sgPSBtb2R1bGUgPyBtb2R1bGUtPm15X3Rhc2sgOiAoYmNtb3NfdGFzayopTlVMTDsKKyAgICByYyA9IHRpbWVyLT5wYXJtLmhhbmRsZXIodGltZXIsIHRpbWVyLT5wYXJtLmRhdGEpOworICAgIHRpbWVyLT50YXNrID0gTlVMTDsKKyAgICBpZiAocmMgPT0gQkNNT1NfVElNRVJfT0sgJiYgdGltZXItPnBlcmlvZCkKKyAgICAgICAgX2JjbW9zX3RpbWVyX3Bvb2xfaW5zZXJ0KHRpbWVyLCB0aW1lci0+cGVyaW9kLCBCQ01PU19UUlVFKTsKKyAgICBlbHNlCisgICAgICAgIHRpbWVyLT5mbGFncyAmPSB+QkNNT1NfVElNRVJfRkxBR19FWFBJUkVEOworfQorCisvKiBSZWxlYXNlIHRpbWVyIG1lc3NhZ2UuIE9ubHkgY2FsbGVkIGluIGV4Y2VwdGlvbmFsIHNpdHVhdGlvbnMsCisgKiBzdWNoIGFzIG1vZHVsZSBxdWV1ZSBkZXN0cm95LiBEbyBub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIF9iY21vc190aW1lcl9tc2dfcmVsZWFzZShiY21vc19tc2cgKm1zZykKK3sKK30KKworLyogQ3JlYXRlIHRpbWVyICovCitiY21vc19lcnJubyBiY21vc190aW1lcl9jcmVhdGUoYmNtb3NfdGltZXIgKnRpbWVyLCBiY21vc190aW1lcl9wYXJtICpwYXJtKQoreworICAgIGlmICghdGltZXIgfHwgIXBhcm0gfHwgIXBhcm0tPmhhbmRsZXIpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJ0aW1lciAlcCwgcGFybSAlcCBoYW5kbGVyICVwXG4iLCB0aW1lciwgcGFybSwgcGFybSA/IHBhcm0tPmhhbmRsZXIgOiBOVUxMKTsKKyAgICBpZiAocGFybS0+b3duZXIgIT0gQkNNT1NfTU9EVUxFX0lEX05PTkUgJiYgX2JjbW9zX21vZHVsZV9nZXQocGFybS0+b3duZXIpID09IE5VTEwpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PRU5ULCAibW9kdWxlX2lkICVkXG4iLCBwYXJtLT5vd25lcik7CisgICAgbWVtc2V0KHRpbWVyLCAwLCBzaXplb2YoYmNtb3NfdGltZXIpKTsKKyAgICB0aW1lci0+cGFybSA9ICpwYXJtOworICAgIGlmIChwYXJtLT5vd25lciA9PSBCQ01PU19NT0RVTEVfSURfTk9ORSkKKyAgICAgICAgdGltZXItPmhhbmRsZXIgPSBwYXJtLT5oYW5kbGVyOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRpbWVyLT5oYW5kbGVyID0gX2JjbW9zX3RpbWVyX3NlbmRfdG9fbW9kdWxlX2hhbmRsZXI7CisgICAgICAgIHRpbWVyLT5tc2cuaGFuZGxlciA9IF9iY21vc190aW1lcl9pbl9tb2R1bGVfaGFuZGxlcjsKKyAgICAgICAgdGltZXItPm1zZy5yZWxlYXNlID0gX2JjbW9zX3RpbWVyX21zZ19yZWxlYXNlOworICAgICAgICB0aW1lci0+bXNnLnNlbmRlciA9IEJDTU9TX01PRFVMRV9JRF9OT05FOworICAgICAgICB0aW1lci0+bXNnLnR5cGUgPSBCQ01PU19NU0dfSURfSU5URVJOQUxfVElNRVI7CisgICAgfQorICAgIHRpbWVyLT5mbGFncyB8PSBCQ01PU19USU1FUl9GTEFHX1ZBTElEOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IHRpbWVyICovCit2b2lkIGJjbW9zX3RpbWVyX2Rlc3Ryb3koYmNtb3NfdGltZXIgKnRpbWVyKQoreworICAgIEJVR19PTighdGltZXIpOworICAgIGJjbW9zX3RpbWVyX3N0b3AodGltZXIpOworICAgIHRpbWVyLT5mbGFncyAmPSB+QkNNT1NfVElNRVJfRkxBR19WQUxJRDsKK30KKworLyogKFJlKXN0YXJ0IHRpbWVyICovCit2b2lkIGJjbW9zX3RpbWVyX3N0YXJ0KGJjbW9zX3RpbWVyICp0aW1lciwgdWludDMyX3QgZGVsYXkpCit7CisgICAgQlVHX09OKCF0aW1lcik7CisgICAgQlVHX09OKCFCQ01PU19USU1FUl9JU19WQUxJRCh0aW1lcikpOworICAgIGlmICgoaW50MzJfdClkZWxheSA8IDApCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkF0dGVtcHQgdG8gc3RhcnQgdGltZXIgKCVzKSBmb3IgcGVyaW9kIGxvbmdlciB0aGFuIDJeMzEtMS4gUmVkdWNlZCB0byAyXjMxLTFcbiIsCisgICAgICAgICAgICB0aW1lci0+cGFybS5uYW1lID8gdGltZXItPnBhcm0ubmFtZSA6ICIqdW5uYW1lZCoiKTsKKyAgICAgICAgZGVsYXkgPSAweDdmZmZmZmZmOworICAgIH0KKworICAgIGlmIChCQ01PU19USU1FUl9JU19SVU5OSU5HKHRpbWVyKSB8fCBCQ01PU19USU1FUl9JU19FWFBJUkVEKHRpbWVyKSkKKyAgICB7CisgICAgICAgIF9iY21vc190aW1lcl9zdG9wKHRpbWVyKTsKKyAgICB9CisgICAgX2JjbW9zX3RpbWVyX3Bvb2xfaW5zZXJ0KHRpbWVyLCBkZWxheSwgQkNNT1NfVFJVRSk7Cit9CisKKy8qIFN0b3AgdGltZXIgaWYgcnVubmluZyAqLwordm9pZCBiY21vc190aW1lcl9zdG9wKGJjbW9zX3RpbWVyICp0aW1lcikKK3sKKyAgICBCVUdfT04oIXRpbWVyKTsKKyAgICBfYmNtb3NfdGltZXJfc3RvcCh0aW1lcik7Cit9CisKKy8qKiBTZXQgdGltZXIgaGFuZGxlciAqLworYmNtb3NfZXJybm8gYmNtb3NfdGltZXJfaGFuZGxlcl9zZXQoYmNtb3NfdGltZXIgKnRpbWVyLCBGX2JjbW9zX3RpbWVyX2hhbmRsZXIgaGFuZGxlciwgbG9uZyBkYXRhKQoreworICAgIEJVR19PTighdGltZXIpOworICAgIEJVR19PTighaGFuZGxlcik7CisgICAgdGltZXItPnBhcm0uaGFuZGxlciA9IGhhbmRsZXI7CisgICAgdGltZXItPnBhcm0uZGF0YSA9IGRhdGE7CisgICAgaWYgKHRpbWVyLT5wYXJtLm93bmVyID09IEJDTU9TX01PRFVMRV9JRF9OT05FKQorICAgICAgICB0aW1lci0+aGFuZGxlciA9IGhhbmRsZXI7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qCisgKiBCbG9jayBtZW1vcnkgcG9vbAorICovCisKKy8qIE1lbW9yeSBibG9jayBzdHJ1Y3R1cmU6CisgKiAtIGJjbW9zX21lbWJsaworICogLSBibGtfc2l6ZSBieXRlcyBvZiB1c2VyIGRhdGEKKyAqIC0gW21hZ2ljIC0gZm9yIGJsb2NrIG92ZXJmbG93LWNvcnJ1cHRpb24gY2hlY2tdCisgKiAtIFtwYWRkaW5nIHRvIGFsaWduIHRvIHBvaW50ZXIgc2l6ZV0KKyAqLworCitzdHJ1Y3QgYmNtb3NfbWVtYmxrCit7CisgICAgU1RBSUxRX0VOVFJZKGJjbW9zX21lbWJsaykgbmV4dDsgLyoqPCBOZXh0IGJsb2NrIHBvaW50ZXIgKi8KKyAgICBiY21vc19ibGtfcG9vbCAqcG9vbDsgICAgICAgLyoqIHBvb2wgdGhhdCBvd25zIHRoZSBibG9jayAqLworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAvKiogbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEJDTU9TX01FTV9NQUdJQ19BTExPQyAgICgoJ20nPDwyNCkgfCAoJ2InIDw8IDE2KSB8ICgnbCcgPDwgOCkgfCAnaycpCisjZGVmaW5lIEJDTU9TX01FTV9NQUdJQ19GUkVFICAgICgoJ20nPDwyNCkgfCAoJ2InIDw8IDE2KSB8ICgnbCcgPDwgOCkgfCAnficpCisjZGVmaW5lIEJDTU9TX01FTV9NQUdJQ19TVUZGSVggICgoJ20nPDwyNCkgfCAoJ2InIDw8IDE2KSB8ICgnbCcgPDwgOCkgfCAncycpCisgICAgdWludDMyX3QgbGluZW5vOyAgICAgICAgICAgIC8qKiBsaW5lIG51bWJlciB3aGVyZSB0aGUgYmxvY2sgd2FzIGFsbG9jYXRlZC9yZWxlYXNlZC4gRkZVICovCisjZW5kaWYKK307CisKKy8qIENyZWF0ZSBieXRlIG1lbW9yeSBwb29sICovCitiY21vc19lcnJubyBiY21vc19ibGtfcG9vbF9jcmVhdGUoYmNtb3NfYmxrX3Bvb2wgKnBvb2wsIGNvbnN0IGJjbW9zX2Jsa19wb29sX3Bhcm0gKnBhcm0pCit7CisgICAgdWludDMyX3QgYmxrX3NpemU7CisKKyAgICBpZiAoIXBvb2wgfHwgIXBhcm0gfHwgIXBhcm0tPmJsa19zaXplKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInBvb2wgJXAsIHBhcm0gJXAsIGJsa19zaXplPSV1LCBudW1fYmxrcz0ldVxuIiwKKyAgICAgICAgICAgIHBvb2wsIHBhcm0sIHBhcm0gPyBwYXJtLT5ibGtfc2l6ZSA6IDAsIHBhcm0gPyBwYXJtLT5udW1fYmxrcyA6IDApOworICAgIH0KKyAgICBpZiAocGFybS0+bnVtX2Jsa3MgJiBwYXJtLT5wb29sX3NpemUpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAiT25lIGFuZCBvbmx5IG9uZSBvZiBudW1fYmxrcyAoJXUpIGFuZCBwb29sX3NpemUgKCV1KSBtdXN0IGJlIHNldFxuIiwKKyAgICAgICAgICAgIHBhcm0tPm51bV9ibGtzLCBwYXJtLT5wb29sX3NpemUpOworICAgIH0KKyAgICBpZiAocGFybS0+bnVtX2Jsa3MgJiYgcGFybS0+c3RhcnQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJudW1fYmxrcyE9MCBjYW4ndCBiZSB1c2VkIHdpdGggc3RhcnQhPU5VTEwuIFVzZSBieXRlIHNpemUgaW5zdGVhZFxuIik7CisgICAgfQorCisgICAgQkNNX01FTVpFUk9fU1RSVUNUKHBvb2wpOworICAgIHBvb2wtPnBhcm0gPSAqcGFybTsKKworICAgIC8qIENvcHkgbmFtZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgcmVsZWFzZWQgLSBpbiBjYXNlIGl0IHdhcyBvbiB0aGUgc3RhY2sgKi8KKyAgICBpZiAocG9vbC0+cGFybS5uYW1lKQorICAgIHsKKyAgICAgICAgc3RybmNweShwb29sLT5uYW1lLCBwb29sLT5wYXJtLm5hbWUsIHNpemVvZihwb29sLT5uYW1lKSAtIDEpOworICAgICAgICBwb29sLT5wYXJtLm5hbWUgPSBwb29sLT5uYW1lOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRvdGFsIGJsb2NrIHNpemUgaW4gYnl0ZXMsIGluY2x1ZGluZyBvdmVyaGVhZHMKKyAgICAgKi8KKyAgICAvKiBSb3VuZCB1cCBibG9jayBzaXplIHRvIHRoZSBuZWFyZXN0IDMyLWJpdCB3b3JkIHRvIG1ha2UgTUFHSUMgY2hlY2sgY2hlYXBlci4KKyAgICAgKiBJdCBkb2Vzbid0IGFmZmVjdCB0aGUgYWN0dWFsIG92ZXJoZWFkIHNpemUgYmVjYXVzZSBvZiB0aGUgZmluYWwKKyAgICAgKiByb3VuZGluZyB1cCB0byBwb2ludGVyIHNpemUuCisgICAgICovCisgICAgcG9vbC0+cGFybS5ibGtfc2l6ZSA9IEJDTU9TX1JPVU5EX1VQKHBvb2wtPnBhcm0uYmxrX3NpemUsIHNpemVvZih1aW50MzJfdCkpOworICAgIGJsa19zaXplID0gcG9vbC0+cGFybS5ibGtfc2l6ZSArIHNpemVvZihiY21vc19tZW1ibGspOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIGJsa19zaXplICs9IHNpemVvZih1aW50MzJfdCk7IC8qIHJvb20gZm9yIG1hZ2ljIGFmdGVyIHVzZXIgZGF0YSBibG9jayAqLworI2VuZGlmCisgICAgYmxrX3NpemUgPSBCQ01PU19ST1VORF9VUChibGtfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworCisgICAgLyogRGVyaXZlIG51bV9ibGtzIC8gcG9vbF9zaXplIGZyb20gb25lIGFub3RoZXIgKi8KKyAgICBpZiAocG9vbC0+cGFybS5udW1fYmxrcykKKyAgICB7CisgICAgICAgIHBvb2wtPnBhcm0ucG9vbF9zaXplID0gcGFybS0+bnVtX2Jsa3MgKiBibGtfc2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcG9vbC0+cGFybS5udW1fYmxrcyA9IHBvb2wtPnBhcm0ucG9vbF9zaXplIC8gYmxrX3NpemU7CisgICAgICAgIGlmICghcG9vbC0+cGFybS5udW1fYmxrcykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInBvb2xfc2l6ZSAoJXUpIGlzIHRvbyBzbWFsbFxuIiwgcGFybS0+cG9vbF9zaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBvb2wgaWYgInN0YXJ0IiBpcyBub3Qgc2V0ICovCisgICAgcG9vbC0+c3RhcnQgPSBwb29sLT5wYXJtLnN0YXJ0OworICAgIGlmICghcG9vbC0+c3RhcnQpCisgICAgeworICAgICAgICBwb29sLT5zdGFydCA9IGJjbW9zX2FsbG9jKHBvb2wtPnBhcm0ucG9vbF9zaXplKTsKKyAgICAgICAgaWYgKCFwb29sLT5zdGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9NRU0sICJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJsb2NrIHBvb2wgJXNcbiIsIHBhcm0tPm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmcG9vbC0+bG9jaywgcGFybS0+ZmxhZ3MpOworCisgICAgLyogUHV0IGFsbCBibG9ja3Mgb24gZnJlZSBsaXN0ICovCisgICAgYmNtb3NfYmxrX3Bvb2xfcmVzZXQocG9vbCk7CisKKyAgICBwb29sLT5tYWdpYyA9IEJDTU9TX0JMS19QT09MX1ZBTElEOworICAgIGlmICghKHBvb2wtPnBhcm0uZmxhZ3MgJiBCQ01PU19CTEtfUE9PTF9GTEFHX01TR19QT09MKSkKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICAgICAgU1RBSUxRX0lOU0VSVF9UQUlMKCZibGtfcG9vbF9saXN0LCBwb29sLCBsaXN0KTsKKyAgICAgICAgYmNtb3NfdG90YWxfYmxrX3Bvb2xfc2l6ZSArPSBwb29sLT5wYXJtLnBvb2xfc2l6ZTsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERlc3Ryb3kgbWVtb3J5IHBvb2wgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2Jsa19wb29sX2Rlc3Ryb3koYmNtb3NfYmxrX3Bvb2wgKnBvb2wpCit7CisgICAgaWYgKCFwb29sIHx8IHBvb2wtPm1hZ2ljICE9IEJDTU9TX0JMS19QT09MX1ZBTElEKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInBvb2wgaGFuZGxlIGlzIGludmFsaWRcbiIpOworICAgIH0KKyAgICBpZiAocG9vbC0+c3RhdC5mcmVlIDwgcG9vbC0+cGFybS5udW1fYmxrcykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1NUQVRFLCAiJWkgYmxvY2tzIGFyZSBzdGlsbCBhbGxvY2F0ZWQgZnJvbSB0aGUgcG9vbCAlc1xuIiwKKyAgICAgICAgICAgIHBvb2wtPnBhcm0ubnVtX2Jsa3MgLSBwb29sLT5zdGF0LmZyZWUsIHBvb2wtPnBhcm0ubmFtZSk7CisgICAgfQorICAgIGlmICghKHBvb2wtPnBhcm0uZmxhZ3MgJiBCQ01PU19CTEtfUE9PTF9GTEFHX01TR19QT09MKSkKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICAgICAgU1RBSUxRX1JFTU9WRSgmYmxrX3Bvb2xfbGlzdCwgcG9vbCwgYmNtb3NfYmxrX3Bvb2wsIGxpc3QpOworICAgICAgICBiY21vc190b3RhbF9ibGtfcG9vbF9zaXplIC09IHBvb2wtPnBhcm0ucG9vbF9zaXplOworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICB9CisgICAgaWYgKCFwb29sLT5wYXJtLnN0YXJ0ICYmIHBvb2wtPnN0YXJ0KQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShwb29sLT5zdGFydCk7CisgICAgfQorICAgIHBvb2wtPm1hZ2ljID0gQkNNT1NfQkxLX1BPT0xfREVMRVRFRDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFJlbGVhc2UgYWxsIGJsb2NrcyBpbiBtZW1vcnkgcG9vbCAuIEJsb2NrIGNvbnRlbnQgaXMgbm90IGFmZmVjdGVkICovCit2b2lkIGJjbW9zX2Jsa19wb29sX3Jlc2V0KGJjbW9zX2Jsa19wb29sICpwb29sKQoreworICAgIHVpbnQzMl90IGJsa19zaXplOworICAgIGJjbW9zX21lbWJsayAqYmxrOworICAgIHVpbnQzMl90IGk7CisKKyAgICBTVEFJTFFfSU5JVCgmcG9vbC0+ZnJlZV9saXN0KTsKKworICAgIGJsa19zaXplID0gcG9vbC0+cGFybS5ibGtfc2l6ZSArIHNpemVvZihiY21vc19tZW1ibGspOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIGJsa19zaXplICs9IHNpemVvZih1aW50MzJfdCk7IC8qIHJvb20gZm9yIG1hZ2ljIGFmdGVyIHVzZXIgZGF0YSBibG9jayAqLworI2VuZGlmCisgICAgYmxrX3NpemUgPSBCQ01PU19ST1VORF9VUChibGtfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworCisgICAgLyogUHV0IGFsbCBibG9ja3Mgb24gZnJlZSBsaXN0ICovCisgICAgYmxrID0gKGJjbW9zX21lbWJsayAqKXBvb2wtPnN0YXJ0OworICAgIGZvciAoaSA9IDA7IGkgPCBwb29sLT5wYXJtLm51bV9ibGtzOyBpKyspCisgICAgeworICAgICAgICBibGstPnBvb2wgPSBwb29sOworICAgICAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnBvb2wtPmZyZWVfbGlzdCwgYmxrLCBuZXh0KTsKKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICAgICAgKih1aW50MzJfdCopKChsb25nKWJsayArIHNpemVvZihiY21vc19tZW1ibGspICsgcG9vbC0+cGFybS5ibGtfc2l6ZSkgPSBCQ01PU19NRU1fTUFHSUNfU1VGRklYOworICAgICAgICBibGstPmxpbmVubyA9IDA7CisgICAgICAgIGJsay0+bWFnaWMgPSBCQ01PU19NRU1fTUFHSUNfRlJFRTsKKyNlbmRpZgorICAgICAgICBibGsgPSAoYmNtb3NfbWVtYmxrICopKChsb25nKWJsayArIGJsa19zaXplKTsKKyAgICB9CisKKyAgICAvKiBJbml0IHN0YXRpc3RpY3MgKi8KKyAgICBtZW1zZXQoJnBvb2wtPnN0YXQsIDAsIHNpemVvZihwb29sLT5zdGF0KSk7CisgICAgcG9vbC0+c3RhdC5mcmVlID0gcG9vbC0+cGFybS5udW1fYmxrczsKK30KKworLyogQWxsb2NhdGUgYmxvY2sgZnJvbSBibG9jayBtZW1vcnkgcG9vbCAqLwordm9pZCAqYmNtb3NfYmxrX3Bvb2xfYWxsb2MoYmNtb3NfYmxrX3Bvb2wgKnBvb2wpCit7CisgICAgYmNtb3NfbWVtYmxrICpibGs7CisgICAgbG9uZyBmbGFnczsKKworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIEJVR19PTighcG9vbCk7CisgICAgQlVHX09OKHBvb2wtPm1hZ2ljICE9IEJDTU9TX0JMS19QT09MX1ZBTElEKTsKKyNlbmRpZgorICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmcG9vbC0+bG9jayk7CisgICAgYmxrID0gU1RBSUxRX0ZJUlNUKCZwb29sLT5mcmVlX2xpc3QpOworICAgIGlmIChibGspCisgICAgeworICAgICAgICBTVEFJTFFfUkVNT1ZFX0hFQUQoJnBvb2wtPmZyZWVfbGlzdCwgbmV4dCk7CisgICAgICAgICsrcG9vbC0+c3RhdC5hbGxvY2F0ZWQ7CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgICAgIGJsay0+bWFnaWMgPSBCQ01PU19NRU1fTUFHSUNfQUxMT0M7CisjZW5kaWYKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZwb29sLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiAodm9pZCAqKShibGsgKyAxKTsKKyAgICB9CisKKyAgICAvKiBObyBtZW1vcnkgKi8KKyAgICArK3Bvb2wtPnN0YXQuYWxsb2NfZmFpbGVkOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcG9vbC0+bG9jaywgZmxhZ3MpOworICAgIHJldHVybiBOVUxMOworfQorCisvKiBBbGxvY2F0ZSBibG9jayBmcm9tIGJsb2NrIG1lbW9yeSBwb29sIGFuZCB6ZXJvIHRoZSBibG9jayAqLwordm9pZCAqYmNtb3NfYmxrX3Bvb2xfY2FsbG9jKGJjbW9zX2Jsa19wb29sICpwb29sKQoreworICAgIHZvaWQgKnB0ciA9IGJjbW9zX2Jsa19wb29sX2FsbG9jKHBvb2wpOworICAgIGlmIChwdHIpCisgICAgeworICAgICAgICBtZW1zZXQocHRyLCAwLCBwb29sLT5wYXJtLmJsa19zaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKK30KKworLyogUmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIHVzaW5nIGJjbW9zX3Bvb2xfYnl0ZV9hbGxvYygpIG9yIGJjbW9zX3Bvb2xfYmxrX2FsbG9jKCkgKi8KK3ZvaWQgYmNtb3NfYmxrX3Bvb2xfZnJlZSh2b2lkICpwdHIpCit7CisgICAgYmNtb3NfbWVtYmxrICpibGs7CisgICAgYmNtb3NfYmxrX3Bvb2wgKnBvb2w7CisgICAgbG9uZyBmbGFnczsKKworICAgIGJsayA9IChiY21vc19tZW1ibGsgKikoKGxvbmcpcHRyIC0gc2l6ZW9mKGJjbW9zX21lbWJsaykpOworICAgIHBvb2wgPSBibGstPnBvb2w7CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgQlVHX09OKGJsay0+bWFnaWMgIT0gQkNNT1NfTUVNX01BR0lDX0FMTE9DKTsKKyAgICBCVUdfT04ocG9vbCA9PSBOVUxMKTsKKyAgICBCVUdfT04ocG9vbC0+bWFnaWMgIT0gQkNNT1NfQkxLX1BPT0xfVkFMSUQpOworICAgIEJVR19PTigqKHVpbnQzMl90ICopKChsb25nKXB0ciArIHBvb2wtPnBhcm0uYmxrX3NpemUpICE9IEJDTU9TX01FTV9NQUdJQ19TVUZGSVgpOworICAgIGJsay0+bWFnaWMgPSBCQ01PU19NRU1fTUFHSUNfRlJFRTsKKyNlbmRpZgorICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmcG9vbC0+bG9jayk7CisgICAgU1RBSUxRX0lOU0VSVF9IRUFEKCZwb29sLT5mcmVlX2xpc3QsIGJsaywgbmV4dCk7CisgICAgKytwb29sLT5zdGF0LnJlbGVhc2VkOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcG9vbC0+bG9jaywgZmxhZ3MpOworfQorCisvKiBHZXQgcG9vbCBpbmZvICovCitiY21vc19lcnJubyBiY21vc19ibGtfcG9vbF9xdWVyeShjb25zdCBiY21vc19ibGtfcG9vbCAqcG9vbCwgYmNtb3NfYmxrX3Bvb2xfaW5mbyAqaW5mbykKK3sKKyAgICBpZiAoIXBvb2wgfHwgIWluZm8pCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBpbmZvLT5wYXJtID0gcG9vbC0+cGFybTsKKyAgICBpbmZvLT5zdGF0ID0gcG9vbC0+c3RhdDsKKyAgICBpbmZvLT5zdGF0LmZyZWUgPSBwb29sLT5wYXJtLm51bV9ibGtzIC0gKGluZm8tPnN0YXQuYWxsb2NhdGVkIC0gaW5mby0+c3RhdC5yZWxlYXNlZCk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEJsb2NrIHBvb2wgaXRlcmF0b3IgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2Jsa19wb29sX2dldF9uZXh0KGNvbnN0IGJjbW9zX2Jsa19wb29sICoqcHJldikKK3sKKyAgICBjb25zdCBiY21vc19ibGtfcG9vbCAqcG9vbDsKKworICAgIGlmIChwcmV2ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBwb29sID0gKnByZXY7CisgICAgaWYgKHBvb2wgJiYgcG9vbC0+bWFnaWMgIT0gQkNNT1NfQkxLX1BPT0xfVkFMSUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBpZiAocG9vbCkKKyAgICB7CisgICAgICAgIHBvb2wgPSBTVEFJTFFfTkVYVChwb29sLCBsaXN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcG9vbCA9IFNUQUlMUV9GSVJTVCgmYmxrX3Bvb2xfbGlzdCk7CisgICAgfQorICAgICpwcmV2ID0gcG9vbDsKKyAgICBpZiAoIXBvb2wpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT19NT1JFOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoKKyAqIE1lc3NhZ2UgcG9vbAorICovCisKKy8qIHJlbGVhc2UgbWVzc2FnZSBjYWxsYmFjayAqLworc3RhdGljIHZvaWQgX2JjbW9zX21zZ19wb29sX3JlbGVhc2UoYmNtb3NfbXNnICptc2cpCit7CisgICAgaWYgKG1zZy0+ZGF0YV9yZWxlYXNlKQorICAgICAgICBtc2ctPmRhdGFfcmVsZWFzZShtc2cpOworICAgIGJjbW9zX2Jsa19wb29sX2ZyZWUobXNnKTsKK30KKworLyogQ3JlYXRlIG1lc3NhZ2UgcG9vbCAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Bvb2xfY3JlYXRlKGJjbW9zX21zZ19wb29sICpwb29sLCBjb25zdCBiY21vc19tc2dfcG9vbF9wYXJtICpwYXJtKQoreworICAgIGJjbW9zX2Jsa19wb29sX3Bhcm0gcG9vbF9wYXJtID0ge307CisgICAgYmNtb3NfbWVtYmxrICpibGs7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKCFwb29sIHx8ICFwYXJtIHx8ICFwYXJtLT5zaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgQkNNX01FTVpFUk9fU1RSVUNUKHBvb2wpOworICAgIHBvb2wtPnBhcm0gPSAqcGFybTsKKyAgICBwb29sX3Bhcm0ubnVtX2Jsa3MgPSBwYXJtLT5zaXplOworICAgIHBvb2xfcGFybS5ibGtfc2l6ZSA9IHBhcm0tPmRhdGFfc2l6ZSArIHNpemVvZihiY21vc19tc2cpOworICAgIHBvb2xfcGFybS5mbGFncyA9IHBhcm0tPmZsYWdzIHwgQkNNT1NfQkxLX1BPT0xfRkxBR19NU0dfUE9PTDsKKyAgICBwb29sX3Bhcm0ubmFtZSA9IHBhcm0tPm5hbWU7CisKKyAgICAvKiBDcmVhdGUgdW5kZXJseWluZyBibG9jayBwb29sICovCisgICAgZXJyID0gYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKCZwb29sLT5ibGtfcG9vbCwgJnBvb2xfcGFybSk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHBvb2wtPnBhcm0ubmFtZSA9IHBvb2wtPmJsa19wb29sLm5hbWU7CisKKyAgICAvKiBQcmUtaW5pdGlhbGl6ZSBhbGwgbWVzc2FnZXMgKi8KKyAgICBTVEFJTFFfRk9SRUFDSChibGssICZwb29sLT5ibGtfcG9vbC5mcmVlX2xpc3QsIG5leHQpCisgICAgeworICAgICAgICBiY21vc19tc2cgKm1zZyA9IChiY21vc19tc2cgKikoYmxrICsgMSk7CisgICAgICAgIG1zZy0+ZGF0YSA9ICh2b2lkICopKG1zZyArIDEpOworICAgICAgICBtc2ctPnNpemUgPSBwb29sLT5wYXJtLmRhdGFfc2l6ZTsKKyAgICAgICAgbXNnLT5yZWxlYXNlID0gX2JjbW9zX21zZ19wb29sX3JlbGVhc2U7CisgICAgICAgIG1zZy0+ZGF0YV9yZWxlYXNlID0gcGFybS0+ZGF0YV9yZWxlYXNlOworICAgIH0KKyAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgU1RBSUxRX0lOU0VSVF9UQUlMKCZtc2dfcG9vbF9saXN0LCAmcG9vbC0+YmxrX3Bvb2wsIGxpc3QpOworICAgIGJjbW9zX3RvdGFsX21zZ19wb29sX3NpemUgKz0gcG9vbC0+YmxrX3Bvb2wucGFybS5wb29sX3NpemU7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19yZXNfbG9jayk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIERlc3Ryb3kgbWVzc2FnZSBwb29sICovCitiY21vc19lcnJubyBiY21vc19tc2dfcG9vbF9kZXN0cm95KGJjbW9zX21zZ19wb29sICpwb29sKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBiY21vc19ibGtfcG9vbF9kZXN0cm95KCZwb29sLT5ibGtfcG9vbCk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgU1RBSUxRX1JFTU9WRSgmbXNnX3Bvb2xfbGlzdCwgJnBvb2wtPmJsa19wb29sLCBiY21vc19ibGtfcG9vbCwgbGlzdCk7CisgICAgYmNtb3NfdG90YWxfbXNnX3Bvb2xfc2l6ZSAtPSBwb29sLT5ibGtfcG9vbC5wYXJtLnBvb2xfc2l6ZTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKworICAgIHBvb2wtPnBhcm0uc2l6ZSA9IHBvb2wtPnBhcm0uZGF0YV9zaXplID0gMDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQWxsb2NhdGUgbWVzc2FnZSBmcm9tIHBvb2wgKi8KK2JjbW9zX21zZyAqYmNtb3NfbXNnX3Bvb2xfYWxsb2MoYmNtb3NfbXNnX3Bvb2wgKnBvb2wpCit7CisgICAgcmV0dXJuIGJjbW9zX2Jsa19wb29sX2FsbG9jKCZwb29sLT5ibGtfcG9vbCk7Cit9CisKKy8qIEdldCBwb29sIGluZm8gKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19wb29sX3F1ZXJ5KGNvbnN0IGJjbW9zX21zZ19wb29sICpwb29sLCBiY21vc19tc2dfcG9vbF9pbmZvICppbmZvKQoreworICAgIGJjbW9zX2Jsa19wb29sX2luZm8gcG9vbF9pbmZvOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGlmICghcG9vbCB8fCAhaW5mbykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGVyciA9IGJjbW9zX2Jsa19wb29sX3F1ZXJ5KCZwb29sLT5ibGtfcG9vbCwgJnBvb2xfaW5mbyk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGluZm8tPnBhcm0gPSBwb29sLT5wYXJtOworICAgIGluZm8tPnN0YXQgPSBwb29sX2luZm8uc3RhdDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQmxvY2sgcG9vbCBpdGVyYXRvciAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Bvb2xfZ2V0X25leHQoY29uc3QgYmNtb3NfbXNnX3Bvb2wgKipwcmV2KQoreworICAgIGNvbnN0IGJjbW9zX21zZ19wb29sICpwb29sOworCisgICAgaWYgKHByZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIHBvb2wgPSAqcHJldjsKKyAgICBpZiAocG9vbCAmJiBwb29sLT5ibGtfcG9vbC5tYWdpYyAhPSBCQ01PU19CTEtfUE9PTF9WQUxJRCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGlmIChwb29sKQorICAgIHsKKyAgICAgICAgcG9vbCA9IGNvbnRhaW5lcl9vZihTVEFJTFFfTkVYVCgmcG9vbC0+YmxrX3Bvb2wsIGxpc3QpLCBiY21vc19tc2dfcG9vbCwgYmxrX3Bvb2wpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwb29sID0gY29udGFpbmVyX29mKFNUQUlMUV9GSVJTVCgmbXNnX3Bvb2xfbGlzdCksIGJjbW9zX21zZ19wb29sLCBibGtfcG9vbCk7CisgICAgfQorICAgICpwcmV2ID0gcG9vbDsKKyAgICBpZiAoIXBvb2wpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT19NT1JFOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFNldCB1cCBwcmludCByZWRpcmVjdGlvbi9jbG9uaW5nCisgKiBccGFyYW1baW5dICAgbW9kZSAgICByZWRpcmVjdGlvbi9jbG9uaW5nIG1vZGUKKyAqIFxwYXJhbVtpbl0gICBjYiAgICAgIHJlZGlyZWN0aW9uIGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgZGF0YSAgICBvcGFxdWUgZGF0YSB0byBiZSBwYXNzZWQgdG8gY2IKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfcHJpbnRfcmVkaXJlY3QoYmNtb3NfcHJpbnRfcmVkaXJlY3RfbW9kZSBtb2RlLCBiY21vc19wcmludF9yZWRpcmVjdF9jYiBjYiwgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAobW9kZSAhPSBCQ01PU19QUklOVF9SRURJUkVDVF9NT0RFX05PTkUgJiYgY2IgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJSZWRpcmVjdGlvbiBjYWxsYmFjayBtdXN0IGJlIHNldFxuIik7CisgICAgfQorICAgIHByaW50X3JlZGlyZWN0X21vZGUgPSBtb2RlOworICAgIGlmIChtb2RlID09IEJDTU9TX1BSSU5UX1JFRElSRUNUX01PREVfTk9ORSkKKyAgICB7CisgICAgICAgIHByaW50X3JlZGlyZWN0X2NiID0gTlVMTDsKKyAgICAgICAgcHJpbnRfcmVkaXJlY3RfY2JfZGF0YSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50X3JlZGlyZWN0X2NiID0gY2I7CisgICAgICAgIHByaW50X3JlZGlyZWN0X2NiX2RhdGEgPSBkYXRhOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogUHJpbnQgb24gdGhlIGNvbnNvbGUgd2l0aCBvcHRpb25hbCBjbG9uaW5nIC8gcmVkaXJlY3Rpb24gKi8KKy8qbGludCAtZXs0NTR9Ki8KK2ludCBiY21vc192cHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKyAgICBpbnQgcmMgPSAwOworICAgIGJjbW9zX2Jvb2wgcHJvdGVjdGVkX3NlY3Rpb24gPSBpc19pcnFfbW9kZSgpIHx8IGlzX2lycV9kaXNhYmxlZCgpOworCisgICAgLyogT25seSBwcm90ZWN0IGlmIGluIHRhc2sgY29udGV4dCAqLworICAgIGlmICghcHJvdGVjdGVkX3NlY3Rpb24pCisgICAgeworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19wcmludF9sb2NrKTsKKyAgICB9CisgICAgaWYgKHByaW50X3JlZGlyZWN0X21vZGUgIT0gQkNNT1NfUFJJTlRfUkVESVJFQ1RfTU9ERV9SRURJUkVDVCkKKyAgICB7CisgICAgICAgIHJjID0gYmNtb3Nfc3lzX3ZwcmludGYoZm9ybWF0LCBhcCk7CisgICAgfQorICAgIGlmIChwcmludF9yZWRpcmVjdF9tb2RlICE9IEJDTU9TX1BSSU5UX1JFRElSRUNUX01PREVfTk9ORSkKKyAgICB7CisgICAgICAgIHJjID0gcHJpbnRfcmVkaXJlY3RfY2IocHJpbnRfcmVkaXJlY3RfY2JfZGF0YSwgZm9ybWF0LCBhcCk7CisgICAgfQorICAgIGlmICghcHJvdGVjdGVkX3NlY3Rpb24pCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3ByaW50X2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKy8qbGludCAtZXs0NTR9Ki8KKworLyogUHJpbnQgb24gdGhlIGNvbnNvbGUgd2l0aCBvcHRpb25hbCBjbG9uaW5nIC8gcmVkaXJlY3Rpb24gKi8KK2ludCBiY21vc19wcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIGludCByYzsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgcmMgPSBiY21vc192cHJpbnRmKGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybiByYzsKK30KKworI2lmbmRlZiBCQ01PU19QVVRDSEFSX0lOTElORQorLypsaW50IC1lezQ1NH0qLwordm9pZCBiY21vc19wdXRjaGFyKGludCBjKQoreworICAgIGJjbW9zX2Jvb2wgcHJvdGVjdGVkX3NlY3Rpb24gPSBpc19pcnFfbW9kZSgpIHx8IGlzX2lycV9kaXNhYmxlZCgpOworCisgICAgLyogT25seSBwcm90ZWN0IGlmIGluIHRhc2sgY29udGV4dCAqLworICAgIGlmICghcHJvdGVjdGVkX3NlY3Rpb24pCisgICAgeworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19wcmludF9sb2NrKTsKKyAgICB9CisgICAgcHV0Y2hhcihjKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBpZiAoIXByb3RlY3RlZF9zZWN0aW9uKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19wcmludF9sb2NrKTsKKyAgICB9Cit9CisvKmxpbnQgK2V7NDU0fSovCisjZW5kaWYKKworI2lmbmRlZiBCQ01PU19CVUZfT1NfU1BFQ0lGSUMKKworLyoKKyAqIEJ1ZmZlciBhbGxvY2F0aW9uL3JlbGVhc2UKKyAqLworCisjaWZkZWYgQkNNT1NfQlVGX1BPT0xfU0laRQorLyoqIENyZWF0ZSBidWZmZXIgcG9vbAorICogXHBhcmFtW2luXSAgIG51bSAgICAgTnVtYmVyIG9mIGJ1ZmZlcnMKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgIEJ1ZmZlciBzaXplCisgKiBccGFyYW1baW5dICAgYWxpZ24gICBCdWZmZXIgYWxpZ25tZW50CisgKiBccmV0dXJucyBvPU9LIG9yIGVycm9yIDwwCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vc19idWZfcG9vbF9jcmVhdGUodm9pZCkKK3sKKyAgICBiY21vc19ibGtfcG9vbF9wYXJtIHBvb2xfcGFybSA9CisgICAgeworICAgICAgICAubmFtZSA9ICJzeXNidWYiCisgICAgfTsKKyAgICBiY21vc19lcnJubyByYzsKKworI2lmbmRlZiBCQ01PU19CVUZfUE9PTF9CVUZfU0laRQorI2Vycm9yIEJDTU9TX0JVRl9QT09MX0JVRl9TSVpFIG11c3QgYmUgZGVmaW5lZAorI2VuZGlmCisKKyAgICAvKiBJZiBidWZmZXIgbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQgYnkgYmNtb3NfZG1hX2FsbG9jIC0gYWxsb2NhdGUKKyAgICAgKiBtZW1vcnkgZm9yIHRoZSB3aG9sZSBwb29sIGhlcmUgKi8KKyAgICBwb29sX3Bhcm0uYmxrX3NpemUgPSBCQ01PU19CVUZfUE9PTF9CVUZfU0laRSArIHNpemVvZihiY21vc19idWYpICsgQkNNVFJfQlVGX0VYVFJBX0hFQURST09NICsKKyAgICAgICAgMipCQ01PU19CVUZfREFUQV9BTElHTk1FTlQgKyBCQ01PU19CVUZfREFUQV9HVUFSRDsKKworI2lmZGVmIEJDTU9TX0JVRl9JTl9ETUFfTUVNCisgICAgcG9vbF9wYXJtLnBvb2xfc2l6ZSA9IChwb29sX3Bhcm0uYmxrX3NpemUgKyBzaXplb2YoYmNtb3NfbWVtYmxrKSkgKiBCQ01PU19CVUZfUE9PTF9TSVpFOworICAgIHBvb2xfcGFybS5zdGFydCA9IGJjbW9zX2RtYV9hbGxvYygwLCBwb29sX3Bhcm0ucG9vbF9zaXplKTsKKyAgICBpZiAoIXBvb2xfcGFybS5zdGFydCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisjZWxzZQorICAgIHBvb2xfcGFybS5udW1fYmxrcyA9IEJDTU9TX0JVRl9QT09MX1NJWkU7CisjZW5kaWYKKworICAgIHJjID0gYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKCZzeXNfYnVmX3Bvb2wsICZwb29sX3Bhcm0pOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGlmIChwb29sX3Bhcm0uc3RhcnQpCisgICAgICAgICAgICBiY21vc19kbWFfZnJlZSgwLCBwb29sX3Bhcm0uc3RhcnQpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKyNlbmRpZgorCisvKiBBbGxvY2F0ZSBidWZmZXIgKi8KK2JjbW9zX2J1ZiAqYmNtb3NfYnVmX2FsbG9jKHVpbnQzMl90IHNpemUpCit7CisgICAgLyogQWxsb2NhdGUgZXh0cmEgMiAqIEJDTU9TX0JVRl9EQVRBX0FMSUdOTUVOVCB0byBtYWtlIHN1cmUgdGhhdCBuZWl0aGVyIGRhdGEgc3RhcnQgbm9yIGVuZAorICAgICAqIGVuZCB1cCBpbiB0aGUgbWlkZGxlIG9mIGNhY2hlIGxpbmUKKyAgICAgKi8KKyAgICBiY21vc19idWYgKmJ1ZjsKKworLyogQWxsb2NhdGUgZnJvbSB0aGUgcG9vbCAgKi8KKyNpZmRlZiBCQ01PU19CVUZfUE9PTF9TSVpFCisKKyAgICBpZiAoc2l6ZSA+IEJDTU9TX0JVRl9QT09MX0JVRl9TSVpFKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJBdHRlbXB0IHRvIGFsbG9jYXRlIGJ1ZmZlciBiaWdnZXIgdGhhbiBidWZmZXIgcG9vbCBibG9jayBzaXplLiAldSA+ICV1XG4iLAorICAgICAgICAgICAgc2l6ZSwgQkNNT1NfQlVGX1BPT0xfQlVGX1NJWkUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYnVmID0gYmNtb3NfYmxrX3Bvb2xfYWxsb2MoJnN5c19idWZfcG9vbCk7CisKKyNlbHNlIC8qIGVsc2Ugb2YgI2lmIEJDTU9TX0JVRl9QT09MX1NJWkUgKi8KKyAgICB7CisgICAgICAgIHVpbnQzMl90IGFsbG9jX3NpemUgPSBzaXplb2YoYmNtb3NfYnVmKSArIHNpemUgKyBCQ01UUl9CVUZfRVhUUkFfSEVBRFJPT00gKworICAgICAgICAgICAgMipCQ01PU19CVUZfREFUQV9BTElHTk1FTlQgLSAxICsgQkNNT1NfQlVGX0RBVEFfR1VBUkQ7CisjaWZkZWYgQkNNT1NfQlVGX0RBVEFfVU5JVF9TSVpFCisjaWYgQkNNT1NfQlVGX0RBVEFfVU5JVF9TSVpFICYgKEJDTU9TX0JVRl9EQVRBX1VOSVRfU0laRSAtIDEpCisjZXJyb3IgQkNNT1NfQlVGX0RBVEFfVU5JVF9TSVpFIG11c3QgYmUgYSBwb3dlciBvZiAyCisjZW5kaWYKKyAgICAgICAgYWxsb2Nfc2l6ZSA9IEJDTU9TX1JPVU5EX1VQKGFsbG9jX3NpemUsIEJDTU9TX0JVRl9EQVRBX1VOSVRfU0laRSk7CisjZW5kaWYKKyNpZmRlZiBCQ01PU19CVUZfSU5fRE1BX01FTQorICAgICAgICBidWYgPSBiY21vc19kbWFfYWxsb2MoMCwgYWxsb2Nfc2l6ZSk7CisjZWxzZQorICAgICAgICBidWYgPSBiY21vc19hbGxvYyhhbGxvY19zaXplKTsKKyNlbmRpZgorICAgIH0KKyNlbmRpZiAvKiBlbmQgb2YgI2lmIEJDTU9TX0JVRl9QT09MX1NJWkUgKi8KKworICAgIGlmICghYnVmKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBidWYtPnN0YXJ0ID0gKHVpbnQ4X3QgKikoYnVmICsgMSkgKyBCQ01PU19CVUZfREFUQV9HVUFSRDsKKyAgICBidWYtPmRhdGEgPSAodWludDhfdCAqKShCQ01PU19ST1VORF9VUCgobG9uZylidWYtPnN0YXJ0ICsgQkNNVFJfQlVGX0VYVFJBX0hFQURST09NLCBCQ01PU19CVUZfREFUQV9BTElHTk1FTlQpKTsKKyAgICBidWYtPnNpemUgPSBzaXplICsgKGJ1Zi0+ZGF0YSAtIGJ1Zi0+c3RhcnQpOworICAgIGJ1Zi0+bGVuID0gMDsKKyNpZmRlZiBCQ01PU19CVUZfUE9PTF9TSVpFCisgICAgYnVmLT5wb29sID0gJnN5c19idWZfcG9vbDsKKyNlbHNlCisgICAgYnVmLT5wb29sID0gTlVMTDsKKyNlbmRpZgorICAgIHJldHVybiBidWY7Cit9CisKKy8qIFJlbGVhc2UgYnVmZmVyICovCit2b2lkIGJjbW9zX2J1Zl9mcmVlKGJjbW9zX2J1ZiAqYnVmKQoreworCisjaWZkZWYgQkNNT1NfQlVGX1BPT0xfU0laRQorICAgIC8qIEJ1ZmZlciBtaWdodCBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlIHN5c3RlbSBwb29sICovCisgICAgaWYgKGJ1Zi0+cG9vbCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jsa19wb29sX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgQkNNT1NfQlVGX0lOX0RNQV9NRU0KKyAgICBiY21vc19kbWFfZnJlZSgwLCBidWYpOworI2Vsc2UKKyAgICBiY21vc19mcmVlKGJ1Zik7CisjZW5kaWYKK30KKworI2VuZGlmCisKK0VYUE9SVF9TWU1CT0woYmNtb3NfaW5pdCk7CisKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3F1ZXVlX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19xdWV1ZV9kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3F1ZXVlX3F1ZXJ5KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3F1ZXVlX2dldF9uZXh0KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3NlbmQpOworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfc2VuZF90b19tb2R1bGUpOworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfcmVjdik7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ191bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX2Rpc3BhdGNoKTsKKworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfcWdyb3VwX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19xZ3JvdXBfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19xZ3JvdXBfcXVlcnkpOworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfcmVjdl9mcm9tX3Fncm91cCk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19zZW5kX3RvX3Fncm91cCk7CisKK0VYUE9SVF9TWU1CT0woYmNtb3NfdGFza190aW1lb3V0X3NldCk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX3Rhc2tfZ2V0X25leHQpOworCitFWFBPUlRfU1lNQk9MKGJjbW9zX21vZHVsZV9jcmVhdGUpOworRVhQT1JUX1NZTUJPTChiY21vc19tb2R1bGVfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21vZHVsZV9jdXJyZW50KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbW9kdWxlX2NvbnRleHQpOworRVhQT1JUX1NZTUJPTChiY21vc19tb2R1bGVfY29udGV4dF9zZXQpOworRVhQT1JUX1NZTUJPTChiY21vc19tb2R1bGVfcXVlcnkpOworCitFWFBPUlRfU1lNQk9MKGJjbW9zX2V2ZW50X2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX2V2ZW50X2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChiY21vc19ldmVudF9yYWlzZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX2V2ZW50X3JlY3YpOworCitFWFBPUlRfU1lNQk9MKGJjbW9zX3RpbWVyX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX3RpbWVyX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChiY21vc190aW1lcl9zdGFydCk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX3RpbWVyX3N0b3ApOworRVhQT1JUX1NZTUJPTChiY21vc190aW1lcl9oYW5kbGVyX3NldCk7CisKK0VYUE9SVF9TWU1CT0woYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfYmxrX3Bvb2xfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX2Jsa19wb29sX3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfYmxrX3Bvb2xfYWxsb2MpOworRVhQT1JUX1NZTUJPTChiY21vc19ibGtfcG9vbF9jYWxsb2MpOworRVhQT1JUX1NZTUJPTChiY21vc19ibGtfcG9vbF9mcmVlKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfYmxrX3Bvb2xfcXVlcnkpOworRVhQT1JUX1NZTUJPTChiY21vc19ibGtfcG9vbF9nZXRfbmV4dCk7CisKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3Bvb2xfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3Bvb2xfYWxsb2MpOworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfcG9vbF9xdWVyeSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19wb29sX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfcG9vbF9nZXRfbmV4dCk7CisKK0VYUE9SVF9TWU1CT0woYmNtb3NfcHJpbnRfcmVkaXJlY3QpOworRVhQT1JUX1NZTUJPTChiY21vc19wcmludGYpOworRVhQT1JUX1NZTUJPTChiY21vc192cHJpbnRmKTsKKworI2lmbmRlZiBCQ01PU19CVUZfT1NfU1BFQ0lGSUMKK0VYUE9SVF9TWU1CT0woYmNtb3NfYnVmX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfYnVmX2ZyZWUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2NvbW1vbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTA5YzFjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19jb21tb24uaApAQCAtMCwwICsxLDE0NzkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT1NfQ09NTU9OX0hfCisjZGVmaW5lIEJDTU9TX0NPTU1PTl9IXworCisjaWZuZGVmIEJDTU9TX1NZU1RFTV9IXworI2Vycm9yIFBsZWFzZSBkbyBub3QgaW5jbHVkZSBiY21vc19jb21tb24uaCBkaXJlY3RseS4gSW5jbHVkZSBiY21vc19zeXN0ZW0uaAorI2VuZGlmCisKKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImJjbW9zX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtb3NfcXVldWUuaCIKKyNpbmNsdWRlICJiY21vc190cmVlLmgiCisvKiBHZXQgY29uc3RhbnRzLCBzdWNoIGFzIHRhc2ssIG1vZHVsZSwgZXZlbnQgaWQgbGlzdHMgKi8KKyNpbmNsdWRlICJiY21vc19wbGF0Zm9ybS5oIgorI2luY2x1ZGUgImJjbW9zX3BhY2suaCIKKyNpbmNsdWRlICJiY21vc19zeXNpZi5oIgorCisjZGVmaW5lIE1BWF9UQVNLX05BTUVfU0laRSAgICAgICAgICA2NAorI2RlZmluZSBNQVhfTU9EVUxFX05BTUVfU0laRSAgICAgICAgNjQKKyNkZWZpbmUgTUFYX01TR19RVUVVRV9OQU1FX1NJWkUgICAgIDY0CisjZGVmaW5lIE1BWF9USU1FUl9OQU1FX1NJWkUgICAgICAgICA2NAorI2RlZmluZSBNQVhfUE9PTF9OQU1FX1NJWkUgICAgICAgICAgNjQKKyNkZWZpbmUgTUFYX0VWRU5UX05BTUVfU0laRSAgICAgICAgIDY0CisjZGVmaW5lIE1BWF9NVVRFWF9OQU1FX1NJWkUgICAgICAgICA2NAorI2RlZmluZSBCQ01PU19NU0dfUE9PTF9ERUZBVUxUX1NJWkUgNTEyCisKKy8qIERlZmluZSBiY21vc19ib29sIC0gdGhlIGJvb2xlYW4gdHlwZSBmb3IgYmNtb3MgLSBiYXNlZCBvbiBDOTkgc3RhbmRhcmQgYm9vbGVhbiB0eXBlICovCisjaWZuZGVmIEJDTU9TX0JPT0xFQU4KK3R5cGVkZWYgX0Jvb2wgYmNtb3NfYm9vbDsKKyNkZWZpbmUgQkNNT1NfRkFMU0UgMAorI2RlZmluZSBCQ01PU19UUlVFIDEKKyNlbmRpZgorCisjZGVmaW5lIEJDTV9TSVpFT0ZBUlJBWShhcnIpIChzaXplb2YoYXJyKS9zaXplb2YoKmFycikpCisjZGVmaW5lIEJDTV9TSVpFT0ZGSUVMRChzLCBmKSAoc2l6ZW9mKCgocyopTlVMTCktPmYpKQorI2RlZmluZSBCQ01fTUVNWkVST19TVFJVQ1QocHRyKSBtZW1zZXQocHRyLCAwLCBzaXplb2YoKihwdHIpKSkKKyNkZWZpbmUgQkNNX01FTUNQWV9BUlJBWShkc3QsIHNyYykgbWVtY3B5KGRzdCwgc3JjLCBzaXplb2YoZHN0KSkKKyNkZWZpbmUgVEFCICIgICIKKyNkZWZpbmUgVEFCMiBUQUIgVEFCCisjZGVmaW5lIFRBQjMgVEFCMiBUQUIKKyNkZWZpbmUgVEFCNCBUQUIyIFRBQjIKKworI2RlZmluZSBDSElQX1JFVklTSU9OX0EwIDB4QTAKKyNkZWZpbmUgQ0hJUF9SRVZJU0lPTl9CMCAweEIwCisKKyNpZmRlZiBTSU1VTEFUSU9OX0JVSUxECisjZGVmaW5lIEdFVF9DSElQX1JFVklTSU9OIENISVBfUkVWSVNJT05fQTAKKyNlbHNlCitleHRlcm4gdWludDMyX3QgY2hpcF9yZXZpc2lvbjsKKyNkZWZpbmUgR0VUX0NISVBfUkVWSVNJT04gKGNoaXBfcmV2aXNpb24gIT0gMCA/IGNoaXBfcmV2aXNpb24gOiAoY2hpcF9yZXZpc2lvbiA9IGdldF9jaGlwX3JldmlzaW9uKCkpKQorI2VuZGlmCisKK3R5cGVkZWYgdm9pZCAoKmZfYmNtb2x0X3N3X2Vycm9yX2hhbmRsZXIpKHVpbnQ4X3QgcG9uX2lkLCBjb25zdCBjaGFyICpmaWxlX25hbWUsIHVpbnQzMl90IGxpbmVfbnVtYmVyKTsKKworLyogU2ltaWxhciB0byBCVUdfT04oKSwgd2l0aCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgorICogMS4gVGhlIGNvbmRpdGlvbiBpcyBjaGVja2VkIGFnYWluc3QgQkNNX0VSUl9PSy4KKyAqIDIuIEluIGNhc2Ugb24gYW4gZXJyb3IsIHRoZSBtYWNybyByZXR1cm5zIGZyb20gdGhlIGNhbGxpbmcgZnVuY3Rpb24gd2l0aCB0aGUgZXJyb3IgY29kZS4gKi8KKyNkZWZpbmUgQlVHX09OX0VSUl9SRVQoZikgXAorICAgIGRvIFwKKyAgICB7IFwKKyAgICAgICAgYmNtb3NfZXJybm8gX2VycjsgXAorICAgICAgICBfZXJyID0gZjsgXAorICAgICAgICBCVUdfT04oX2VyciAhPSBCQ01fRVJSX09LKTsgXAorICAgICAgICByZXR1cm4gX2VycjsgXAorICAgIH0gXAorICAgIHdoaWxlICgwKQorCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX2luaXQKKyAqIEB7CisgKi8KKworLyoqIEluaXRpYWxpemUgc3lzdGVtIGxpYnJhcnkKKyAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgc3lzdGVtIGZ1bmN0aW9uCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfaW5pdCh2b2lkKTsKKworLyoqIENsZWFudXAgc3lzdGVtIGxpYnJhcnkKKyAqLwordm9pZCBiY21vc19leGl0KHZvaWQpOworCisvKiogQH0gc3lzdGVtX2luaXQgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9tZW0KKyAqIEB7CisgKi8KKworI2lmbmRlZiBCQ01PU19NQUxMT0NfRlJFRV9JTkxJTkUKKworLyoqIFxkZWZncm91cCBzeXN0ZW1faGVhcCBEZWZhdWx0IEhlYXAKKyAqIEB7CisgKi8KKworLyoqIEFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSBtYWluIGhlYXAKKyAqIFxwYXJhbVtpbl0gICBzaXplCisgKiBccmV0dXJucyBtZW1vcnkgYmxvY2sgcG9pbnRlciBvciBOVUxMCisgKi8KK3ZvaWQgKmJjbW9zX2FsbG9jKHVpbnQzMl90IHNpemUpOworCisvKiogUmVsZWFzZSBtZW1vcnkgdG8gdGhlIG1haW4gcG9vbAorICogXHBhcmFtW2luXSAgIHB0cgorICovCit2b2lkIGJjbW9zX2ZyZWUodm9pZCAqcHRyKTsKKworLyoqIEB9IHN5c3RlbV9oZWFwICovCisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTU9TX01BTExPQ19GUkVFX0lOTElORSAqLworCisvKiogXGRlZmdyb3VwIGJsa19wb29sIEJsb2NrIE1lbW9yeSBQb29sCisgKiBcaW5ncm91cCBzeXN0ZW1fbWVtCisgKiBAeworICovCisKKy8qKiBCbG9jayBtZW1vcnkgcG9vbCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgLyoqPCBQb29sIG5hbWUgKi8KKyAgICB1aW50MzJfdCBibGtfc2l6ZTsgIC8qKjwgTWVtb3J5IGJsb2NrIHNpemUgPiAwICovCisgICAgdWludDMyX3QgbnVtX2Jsa3M7ICAvKio8IE51bWJlciBvZiBibG9ja3MgaW4gdGhlIHBvb2wuIElmIG5vdCBzZXQgLSBpdCBpcyBkZXJpdmVkIGZyb20gcG9vbF9zaXplICovCisgICAgdm9pZCAqc3RhcnQ7ICAgICAgICAvKio8IFN0YXJ0IGFkZHJlc3MuIENhbiBiZSBOVUxMICovCisgICAgdWludDMyX3QgcG9vbF9zaXplOyAvKio8IFRvdGFsIHBvb2wgc2l6ZSBpbiBieXRlcy4gT25seSAxIG9mIHBvb2xfc2l6ZSwgbnVtX2Jsa3MgbXVzdCBiZSBzZXQgKi8KKyAgICB1aW50MzJfdCBmbGFnczsgICAgIC8qKjwgVEJEIGZsYWdzICovCisjZGVmaW5lIEJDTU9TX0JMS19QT09MX0ZMQUdfTVNHX1BPT0wgIDB4ODAwMDAwMDAgLyogVXNlZCBieSBtZXNzYWdlIHBvb2wgKi8KK30gYmNtb3NfYmxrX3Bvb2xfcGFybTsKKworLyoqIEJsb2NrIG1lbW9yeSBwb29sIHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX2Jsa19wb29sX3N0YXQKK3sKKyAgICB1aW50MzJfdCBhbGxvY2F0ZWQ7ICAgICAvKio8IE51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkICovCisgICAgdWludDMyX3QgcmVsZWFzZWQ7ICAgICAgLyoqPCBOdW1iZXIgb2YgYmxvY2tzIHJlbGVhc2VkICovCisgICAgdWludDMyX3QgZnJlZTsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZnJlZSBibG9ja3MgaW4gdGhlIHBvb2wgKi8KKyAgICB1aW50MzJfdCBhbGxvY19mYWlsZWQ7ICAvKio8IE51bWJlciBvZiBhbGxvY2F0aW9uIGZhaWx1cmVzICovCit9IGJjbW9zX2Jsa19wb29sX3N0YXQ7CisKKy8qKiBCbG9jayBtZW1vcnkgcG9vbCBpbmZvICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19ibGtfcG9vbF9pbmZvCit7CisgICAgYmNtb3NfYmxrX3Bvb2xfcGFybSBwYXJtOyAgIC8qKjwgUG9vbCBwYXJhbWV0ZXJzICovCisgICAgYmNtb3NfYmxrX3Bvb2xfc3RhdCBzdGF0OyAgIC8qKjwgUG9vbCBzdGF0aXN0aWNzICovCit9IGJjbW9zX2Jsa19wb29sX2luZm87CisKKy8qKiBCbG9jayBtZW1vcnkgcG9vbCBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19ibGtfcG9vbCBiY21vc19ibGtfcG9vbDsKKworLyoqIENyZWF0ZSBibG9jayBtZW1vcnkgcG9vbAorICogXHBhcmFtW2luLG91dF0gICAgICAgcG9vbCAgICBwb29sIGNvbnRyb2wgYmxvY2sKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIHBhcm0gICAgcG9vbCBwYXJhbWV0ZXJzCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKGJjbW9zX2Jsa19wb29sICpwb29sLCBjb25zdCBiY21vc19ibGtfcG9vbF9wYXJtICpwYXJtKTsKKworLyoqIERlc3Ryb3kgYmxvY2sgbWVtb3J5IHBvb2wKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIHBvb2wgaGFuZGxlCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfYmxrX3Bvb2xfZGVzdHJveShiY21vc19ibGtfcG9vbCAqcG9vbCk7CisKKy8qKiBBbGxvY2F0ZSBibG9jayBmcm9tIGJsb2NrIG1lbW9yeSBwb29sCisgKgorICogVGhpcyBhbGxvY2F0ZXMgYSBzaW5nbGUgdW5pdCAodW5pdF9zaXplIGJ5dGVzKQorICogXHBhcmFtW2luXSAgIHBvb2wgICAgUG9vbCBoYW5kbGUKKyAqIFxyZXR1cm4gbWVtb3J5IGJsb2NrIHBvaW50ZXIgb3IgTlVMTC4KKyAqIEl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgcmV0dXJuZWQgcG9pbnRlciBpcyBhbGlnbmVkIHRvIHBvaW50ZXIgc2l6ZQorICovCit2b2lkICpiY21vc19ibGtfcG9vbF9hbGxvYyhiY21vc19ibGtfcG9vbCAqcG9vbCk7CisKKy8qKiBBbGxvY2F0ZSBibG9jayBmcm9tIGJsb2NrIG1lbW9yeSBwb29sIGFuZCB6ZXJvIHRoZSBibG9jaworICoKKyAqIFRoaXMgYWxsb2NhdGVzIGEgc2luZ2xlIHVuaXQgKHVuaXRfc2l6ZSBieXRlcykKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIFBvb2wgaGFuZGxlCisgKiBccmV0dXJuIG1lbW9yeSBibG9jayBwb2ludGVyIG9yIE5VTEwuCisgKiBJdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlIHJldHVybmVkIHBvaW50ZXIgaXMgYWxpZ25lZCB0byBwb2ludGVyIHNpemUKKyAqLwordm9pZCAqYmNtb3NfYmxrX3Bvb2xfY2FsbG9jKGJjbW9zX2Jsa19wb29sICpwb29sKTsKKworLyoqIFJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCB1c2luZyBiY21vc19ibGtfcG9vbF9hbGxvYygpCisgKgorICogXHBhcmFtW2luXSAgIHB0ciAgICAgcG9pbnRlcgorICovCit2b2lkIGJjbW9zX2Jsa19wb29sX2ZyZWUodm9pZCAqcHRyKTsKKworLyoqIFJlbGVhc2UgYWxsIGJsb2NrcyBpbiBtZW1vcnkgcG9vbC4gQmxvY2sgY29udGVudCBpcyBub3QgYWZmZWN0ZWQKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4gYXBwbGljYXRpb24gd2FudHMgdG8gcHJlLWluaXRpYWxpemUKKyAqIHNvbWUgcG9ydGlvbiBvZiBlYWNoIG1lbW9yeSBibG9jayBhdCBpbml0IHRpbWUKKyAqCisgKiBccGFyYW1baW5dICAgcG9vbCAgICBQb29sIGhhbmRsZQorICovCit2b2lkIGJjbW9zX2Jsa19wb29sX3Jlc2V0KGJjbW9zX2Jsa19wb29sICpwb29sKTsKKworLyoqIEdldCBwb29sIGluZm8KKyAqCisgKiBUaGUgcG9vbCBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcgYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKCkKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIEJsb2NrIG1lbW9yeSBwb29sIGhhbmRsZQorICogXHBhcmFtW291dF0gIGluZm8gICAgQmxvY2sgbWVtb3J5IHBvb2wgaW5mbworICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2Jsa19wb29sX3F1ZXJ5KGNvbnN0IGJjbW9zX2Jsa19wb29sICpwb29sLCBiY21vc19ibGtfcG9vbF9pbmZvICppbmZvKTsKKworLyoqIEJsb2NrIHBvb2wgaXRlcmF0b3IKKyAqIFxwYXJhbVtpbl0gcHJldiAgICAgIFByZXZpb3VzIGJsb2NrIHBvb2wuICpwcmV2PT1OVUxMIC0gZ2V0IGZpcnN0CisgKiBccmV0dXJuOiBCQ01fRVJSX09LLCBCQ01fRVJSX05PRU5ULCBCQ01fRVJSX05PX01PUkUKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfYmxrX3Bvb2xfZ2V0X25leHQoY29uc3QgYmNtb3NfYmxrX3Bvb2wgKipwcmV2KTsKKworLyoqIEB9IGJsa19wb29sICovCisKKy8qKiBcZGVmZ3JvdXAgYnl0ZV9wb29sIEJ5dGUgTWVtb3J5IFBvb2wKKyAqIFxpbmdyb3VwIHN5c3RlbV9tZW0KKyAqIEB7CisgKi8KKworLyoqIEJ5dGUgbWVtb3J5IHBvb2wgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgIC8qKjwgUG9vbCBuYW1lICovCisgICAgdWludDMyX3Qgc2l6ZTsgICAgICAvKio8IFBvb2wgc2l6ZSAoYnl0ZXMpICovCisgICAgdm9pZCAqc3RhcnQ7ICAgICAgICAvKio8IFN0YXJ0IGFkZHJlc3MuIENhbiBiZSBOVUxMICovCit9IGJjbW9zX2J5dGVfcG9vbF9wYXJtOworCisvKiogQnl0ZSBtZW1vcnkgcG9vbCBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19ieXRlX3Bvb2wgYmNtb3NfYnl0ZV9wb29sOworCisvKiogQ3JlYXRlIGJ5dGUgbWVtb3J5IHBvb2wKKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIHBvb2wgICAgcG9vbCBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgICAgICAgICBwYXJtICAgIHBvb2wgcGFyYW1ldGVycworICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2J5dGVfcG9vbF9jcmVhdGUoYmNtb3NfYnl0ZV9wb29sICpwb29sLCBjb25zdCBiY21vc19ieXRlX3Bvb2xfcGFybSAqcGFybSk7CisKKy8qKiBEZXN0cm95IGJ5dGUgbWVtb3J5IHBvb2wKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIHBvb2wgaGFuZGxlCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfYnl0ZV9wb29sX2Rlc3Ryb3koYmNtb3NfYnl0ZV9wb29sICpwb29sKTsKKworI2lmbmRlZiBCQ01PU19CWVRFX1BPT0xfQUxMT0NfRlJFRV9JTkxJTkUKKy8qKiBBbGxvY2F0ZSBtZW1vcnkgZnJvbSBieXRlIG1lbW9yeSBwb29sCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggYnl0ZSBtZW1vcnkgcG9vbHMgY3JlYXRlZAorICogd2l0aCB1bml0X3NpemU9PTEKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIFBvb2wgaGFuZGxlCisgKiBccGFyYW1baW5dICAgc2l6ZSAgICBCbG9jayBzaXplIChieXRlcykKKyAqIFxyZXR1cm4gbWVtb3J5IGJsb2NrIHBvaW50ZXIgb3IgTlVMTAorICovCit2b2lkICpiY21vc19ieXRlX3Bvb2xfYWxsb2MoYmNtb3NfYnl0ZV9wb29sICpwb29sLCB1aW50MzJfdCBzaXplKTsKKworLyoqIFJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCB1c2luZyBiY21vc19wb29sX2J5dGVfYWxsb2MoKQorICoKKyAqIFxwYXJhbVtpbl0gICBwdHIgICAgIHBvaW50ZXIKKyAqLwordm9pZCBiY21vc19ieXRlX3Bvb2xfZnJlZSh2b2lkICpwdHIpOworCisjZW5kaWYgLyogQkNNT1NfQllURV9QT09MX0FMTE9DX0ZSRUVfSU5MSU5FICovCisKKy8qKiBAfSBieXRlX3Bvb2wgKi8KKworLyoqIEB9IHN5c3RlbV9tZW0gKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV90YXNrCisgKiBAeworICovCisjaWZuZGVmIEJDTU9TX1dBSVRfRk9SRVZFUgorI2RlZmluZSBCQ01PU19XQUlUX0ZPUkVWRVIgICAgICAgIDB4RkZGRkZGRkYgIC8qKjwgV2FpdCB0aW1lb3V0LiBXYWl0IGZvcmV2ZXIgKi8KKyNlbmRpZgorI2lmbmRlZiBCQ01PU19OT19XQUlUCisjZGVmaW5lIEJDTU9TX05PX1dBSVQgICAgICAgICAgICAgMCAvKio8IFdhaXQgdGltZW91dC4gRG9uJ3Qgd2FpdCAqLworI2VuZGlmCisjZGVmaW5lIEJDTU9TX01JQ1JPU0VDT05EU19JTl9TRUNPTkRTICAgKDEwMDAwMDApCisKKy8qKiBUYXNrIHByaW9yaXR5ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzAsIC8qKjwgUHJpb3JpdHkgMCAtIGhpZ2hlc3QgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEsIC8qKjwgUHJpb3JpdHkgMSAqLworICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMiwgLyoqPCBQcmlvcml0eSAyICovCisgICAgQkNNT1NfVEFTS19QUklPUklUWV8zLCAvKio8IFByaW9yaXR5IDMgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzQsIC8qKjwgUHJpb3JpdHkgNCAqLworICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfNSwgLyoqPCBQcmlvcml0eSA1ICovCisgICAgQkNNT1NfVEFTS19QUklPUklUWV82LCAvKio8IFByaW9yaXR5IDYgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzcsIC8qKjwgUHJpb3JpdHkgNyAqLworICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfOCwgLyoqPCBQcmlvcml0eSA4ICovCisgICAgQkNNT1NfVEFTS19QUklPUklUWV85LCAvKio8IFByaW9yaXR5IDkgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEwLC8qKjwgUHJpb3JpdHkgMTAgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzExLC8qKjwgUHJpb3JpdHkgMTEgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEyLC8qKjwgUHJpb3JpdHkgMTIgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEzLC8qKjwgUHJpb3JpdHkgMTMgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE0LC8qKjwgUHJpb3JpdHkgMTQgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE1LC8qKjwgUHJpb3JpdHkgMTUgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE2LC8qKjwgUHJpb3JpdHkgMTYgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE3LC8qKjwgUHJpb3JpdHkgMTcgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE4LC8qKjwgUHJpb3JpdHkgMTggKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE5LC8qKjwgUHJpb3JpdHkgMTkgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzIwLC8qKjwgUHJpb3JpdHkgMjAgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzIxLC8qKjwgUHJpb3JpdHkgMjEgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzIyLC8qKjwgUHJpb3JpdHkgMjIgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzIzLC8qKjwgUHJpb3JpdHkgMjMgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI0LC8qKjwgUHJpb3JpdHkgMjQgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI1LC8qKjwgUHJpb3JpdHkgMjUgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI2LC8qKjwgUHJpb3JpdHkgMjYgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI3LC8qKjwgUHJpb3JpdHkgMjcgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI4LC8qKjwgUHJpb3JpdHkgMjggKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI5LC8qKjwgUHJpb3JpdHkgMjkgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzMwLC8qKjwgUHJpb3JpdHkgMzAgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzMxLC8qKjwgUHJpb3JpdHkgMzEgLSBsb3dlc3QgKi8KK30gYmNtb3NfdGFza19wcmlvcml0eTsKKworLyoqIFRhc2sgaGFuZGxlciAqLwordHlwZWRlZiBpbnQgKCpGX2JjbW9zX3Rhc2tfaGFuZGxlcikobG9uZyBkYXRhKTsKKworLyogRGVmYXVsdCB0YXNrIGhhbmRsZXIgKi8KK2V4dGVybiBpbnQgYmNtb3NfZGZ0X3Rhc2tfaGFuZGxlcihsb25nIGRhdGEpOworCisvKiBUaGlzIGZsYWdzIGRldGVybWluZXMgd2hldGhlciBhIHRhc2sgaXMgdG8gYmUgc3VzcGVuZGVkIHVwb24gT09QUyBjb25kaXRpb24uICovCisjZGVmaW5lIEJDTU9TX1RBU0tfRkxBR19OT19TVVNQRU5EX09OX09PUFMgKDEgPDwgMCkKKworLyoqIFRhc2sgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAvKio8IFRhc2sgbmFtZSAqLworICAgIGJjbW9zX3Rhc2tfcHJpb3JpdHkgcHJpb3JpdHk7ICAgICAgIC8qKjwgVGFzayBwcmlvcml0eSAqLworICAgIGJjbW9zX2NvcmUgY29yZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgQ1BVIGNvcmUgdGhlIHRhc2sgaXMgbG9ja2VkIHRvICovCisgICAgdWludDMyX3Qgc3RhY2tfc2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBUYXNrIHN0YWNrIHNpemUgKi8KKyAgICB2b2lkICpzdGFjazsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YWNrIGxvY2F0aW9uLiBOVUxMPWFsbG9jYXRlIGF1dG9tYXRpY2FsbHkgKi8KKyAgICBGX2JjbW9zX3Rhc2tfaGFuZGxlciBpbml0X2hhbmRsZXI7ICAvKio8IE9wdGlvbmFsICJpbml0IiBoYW5kbGVyLiBDYWxsZWQgb25jZSBpbiB0aGUgdGFzayBjb250ZXh0IHdoZW4gaXQgaXMgY3JlYXRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2FsbGJhY2sgaXMgb25seSBzdXBwb3J0ZWQgaW4gaW50ZWdyYXRpb24gbW9kZSAoaGFuZGxlcj09TlVMTCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2hhbmRsZXIgcmV0dXJucyBiY21vc19lcnJuby4gSWYgaXQgcmV0dXJucyB2YWx1ZSBvdGhlciB0aGFuIEJDTV9FUlJfT0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBpcyBkZXN0cm95ZWQgKi8KKyAgICBGX2JjbW9zX3Rhc2tfaGFuZGxlciBoYW5kbGVyOyAgICAgICAvKio8IFRhc2sgaGFuZGxlci4gTlVMTD1kZWZhdWx0IChpbnRlZ3JhdGlvbiBtb2RlKSAqLworICAgIEZfYmNtb3NfdGFza19oYW5kbGVyIHRpbWVvdXRfaGFuZGxlcjsvKio8IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIGludGVncmF0aW9uIG1vZGUgKGhhbmRsZXI9PU5VTEwpIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX3dhaXRfdGltZW91dCBpcyA+IDAuIEl0IGlzIGNhbGxlZCBpZiB0aGVyZSB3ZXJlIG5vIG1lc3NhZ2VzIGZvciB0aGUgdGFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb25nZXIgdGhhbiBtc2dfd2FpdF90aW1lb3V0IHVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRpbWVvdXQgaGFuZGxlciByZXR1cm5zIHZhbHVlIG90aGVyIHRoYW4gQkNNX0VSUl9PSywgdGFzayB0ZXJtaW5hdGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdWludDMyX3QgbXNnX3dhaXRfdGltZW91dDsgICAgICAgICAgLyoqPCBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIG9ubHkgaW4gaW50ZWdyYXRpb24gbW9kZSAoaGFuZGxlcj09TlVMTCkgdG9nZXRoZXIgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9oYW5kbGVyLiBJZiA+IDAgYW5kIHRoZXJlIHdlcmUgbm8gbWVzc2FnZXMgZm9yIGxvbmdlciB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfd2FpdF90aW1lb3V0IHVzLCB0aW1lb3V0X2hhbmRsZXIgaXMgY2FsbGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgbG9uZyBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhIHBhc3NlZCB0byB0aGUgdGFzayBoYW5kbGVyICovCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBmbGFncyAqLworfSBiY21vc190YXNrX3Bhcm07CisKKy8qKiBUYXNrIGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX3Rhc2sgYmNtb3NfdGFzazsKKworLyoqIENyZWF0ZSBhIG5ldyB0YXNrCisgKgorICogXHBhcmFtW2luLG91dF0gIHRhc2sgICAgVGFzayBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgICAgcGFybSAgICBUYXNrIHBhcmFtZXRlcnMKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc190YXNrX2NyZWF0ZShiY21vc190YXNrICp0YXNrLCBjb25zdCBiY21vc190YXNrX3Bhcm0gKnBhcm0pOworCisvKiogU2V0IHRhc2sgdGltZW91dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGluIGludGVncmF0aW9uIG1vZGUgKGhhbmRsZXI9PU5VTEwpLgorICogSXQgc2V0cyBtYXggdGltZSB0aGUgZGVmYXVsdCB0YXNrIGhhbmRsZXIgd2FpdHMgZm9yIG1lc3NhZ2UgZGlyZWN0ZWQgdG8gb25lIG9mIHRoZQorICogdGFzaydzIG1vZHVsZXMuCisgKgorICogXHBhcmFtW2luLG91dF0gIHRhc2sgICAgICAgICAgICAgICAgIFRhc2sgY29udHJvbCBibG9jaworICogXHBhcmFtW2luXSAgICAgIHRpbWVvdXQgICAgICAgICAgICAgIE1heCB0aW1lICh1cykgdG8gd2FpdCBmb3IgbWVzc2FnZXMuIDA9Rk9SRVZFUgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5naW5nIHRpbWVvdXQgZnJvbSBpbmZpbml0ZSB0byBmaW5pdGUgb25seSB0YWtlcyBlZmZlY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBtZXNzYWdlIGlzIHJlY2VpdmVkIGJ5IGFueSB0YXNrIG1vZHVsZS4KKyAqIFxwYXJhbVtpbl0gICAgICB0aW1lb3V0X2hhbmRsZXIgICAgICBIYW5kbGVyIHRvIGJlIGNhbGxlZCB1cG9uIHRpbWVvdXQuIE11c3QgYmUgIT0gTlVMTCBpZiB0aW1lb3V0ID4gMC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgaGFuZGxlciByZXR1cm5zIGVycm9yICghPSBCQ01fRVJSX09LKSwgdGFzayB0ZXJtaW5hdGVzLgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfdGltZW91dF9zZXQoYmNtb3NfdGFzayAqdGFzaywgdWludDMyX3QgdGltZW91dCwgRl9iY21vc190YXNrX2hhbmRsZXIgdGltZW91dF9oYW5kbGVyKTsKKworLyoqIERlc3Ryb3kgdGFzaworICoKKyAqIFxwYXJhbVtpbl0gICB0YXNrICAgICAgICAgICAgVGFzayBoYW5kbGUKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc190YXNrX2Rlc3Ryb3koYmNtb3NfdGFzayAqdGFzayk7CisKKy8qKiBHZXQgY3VycmVudCB0YXNrCisgKiBccmV0dXJucyB0YXNrIGhhbmRsZSBvciBOVUxMIGlmIG5vdCBpbiB0YXNrIGNvbnRleHQKKyAqLworYmNtb3NfdGFzayAqYmNtb3NfdGFza19jdXJyZW50KHZvaWQpOworCisvKiogUXVlcnkgdGFzayBpbmZvCisgKiBccGFyYW1baW5dICB0YXNrICAgIFRhc2sgY29udHJvbCBibG9jaworICogXHBhcmFtW291dF0gcGFybSAgICBUYXNrIHBhcmFtZXRlcnMKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc190YXNrX3F1ZXJ5KGNvbnN0IGJjbW9zX3Rhc2sgKnRhc2ssIGJjbW9zX3Rhc2tfcGFybSAqcGFybSk7CisKKy8qKiBUYXNrIGl0ZXJhdG9yCisgKiBccGFyYW1baW5dIHByZXYgICAgICBQcmV2aW91cyB0YXNrLiAqcHJldj09TlVMTCAtIGdldCBmaXJzdAorICogXHJldHVybjogQkNNX0VSUl9PSywgQkNNX0VSUl9OT0VOVCwgQkNNX0VSUl9OT19NT1JFCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfZ2V0X25leHQoYmNtb3NfdGFzayAqKnByZXYpOworCisKKy8qKiBAfSBzeXN0ZW1fdGFzayAqLworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX21zZworICogQHsKKyAqLworCisvKiogTWVzc2FnZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX21zZyBiY21vc19tc2c7CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX21zZ19xdWV1ZSBiY21vc19tc2dfcXVldWU7CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGdyb3VwIGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX21zZ19xZ3JvdXAgYmNtb3NfbXNnX3Fncm91cDsKKworI2lmIGRlZmluZWQoQkNNT1NfTVNHX1FVRVVFX0RPTUFJTl9TT0NLRVQpIHx8IGRlZmluZWQoQkNNT1NfTVNHX1FVRVVFX1VEUF9TT0NLRVQpIHx8IGRlZmluZWQoQkNNT1NfTVNHX1FVRVVFX1VTRVJfREVGSU5FRCkKKyNkZWZpbmUgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisjZW5kaWYKKworLyoqIE1lc3NhZ2UgcXVldWUgZW5kcG9pbnQgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT1NfTVNHX1FVRVVFX0VQX0xPQ0FMLCAgICAgICAgICAgLyoqPCBMb2NhbCBlbmRwb2ludCAoaW50ZXItdGhyZWFkIGNvbW11bmljYXRpb24pICovCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX0RPTUFJTl9TT0NLRVQKKyAgICBCQ01PU19NU0dfUVVFVUVfRVBfRE9NQUlOX1NPQ0tFVCwgICAvKio8IERvbWFpbi1zb2NrZXQgYmFzZWQgZW5kcG9pbnQgKi8KKyNlbmRpZgorI2lmZGVmIEJDTU9TX01TR19RVUVVRV9VRFBfU09DS0VUCisgICAgQkNNT1NfTVNHX1FVRVVFX0VQX1VEUF9TT0NLRVQsICAgICAgLyoqPCBVRFAgc29ja2V0LWJhc2VkIGVuZHBvaW50ICovCisjZW5kaWYKKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfVVNFUl9ERUZJTkVECisgICAgQkNNT1NfTVNHX1FVRVVFX0VQX1VTRVJfREVGSU5FRCAgICAgLyoqPCBVc2VyLWRlZmluZWQgZW5kcG9pbnQgKi8KKyNlbmRpZgorfSBiY21vc19tc2dfcXVldWVfZXBfdHlwZTsKKworCisvKiogTWVzc2FnZSBxdWV1ZSBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAvKio8IFF1ZXVlIG5hbWUgKGZvciBsb2dnaW5nIGFuZCBkZWJ1Z2dpbmcpICovCisgICAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAgICAgIC8qKjwgTWF4IHF1ZXVlIHNpemUuIDA9dW5saW1pdGVkICovCisgICAgdWludDMyX3QgaGlnaF93bTsgICAgICAgICAgIC8qKjwgT3B0aW9uYWwgaGlnaCB3YXRlciBtYXJrLiBMb2cgaXMgZ2VuZXJhdGVkIHdoZW4gcXVldWUgb2NjdXBhbmN5IGV4Y2VlZHMgaHdtICovCisgICAgdWludDMyX3QgbG93X3dtOyAgICAgICAgICAgIC8qKjwgT3B0aW9uYWwgbG93IHdhdGVyIG1hcmsuIExvZyBpcyBnZW5lcmF0ZWQgd2hlbiBxdWV1ZSBvY2N1cGFuY3kgZHJvcHMgYmVsb3cgbHdtICovCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgIC8qKjwgVEJEIGZsYWdzLiBGb3IgZXhhbXBsZSwgc2luZ2xlLWNvcmUsIG0tY29yZSAqLworICAgIHZvaWQgKCpub3RpZnkpKGJjbW9zX21zZ19xdWV1ZSAqcSwgY29uc3QgY2hhciAqdHh0KTsgLyoqKjwgQ2FsbGVkIHdoZW4gcXVldWUgY29uZ2VzdGlvbiBzdGF0ZSBjaGFuZ2VzICovCisgICAgYmNtb3NfbXNnX3F1ZXVlX2VwX3R5cGUgZXBfdHlwZTsgLyoqPCBRdWV1ZSBlbmRwb2ludCB0eXBlICovCisKKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfUkVNT1RFX1NVUFBPUlQKKyAgICAvKiBSZW1vdGUgbWVzc2FnZSBxdWV1ZSBzdXBwb3J0IGFsbG93cyBxdWV1ZSBlbmRwb2ludHMgdG8gYmUgbG9jYXRlZCBpbgorICAgICAqIGRpZmZlcmVudCBwcm9jZXNzZXMgb3IgZXZlbiBwcm9jZXNzb3JzLgorICAgICAqLworICAgIGNvbnN0IGNoYXIgKmxvY2FsX2VwX2FkZHJlc3M7ICAgICAgIC8qKjwgUXVldWUgbG9jYWwgZW5kcG9pbnQgYWRkcmVzcyAqLworICAgIGNvbnN0IGNoYXIgKnJlbW90ZV9lcF9hZGRyZXNzOyAgICAgIC8qKjwgUXVldWUgbG9jYWwgZW5kcG9pbnQgYWRkcmVzcyAqLworCisgICAgdWludDMyX3QgbWF4X210dTsgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggTVRVIHNpemUgKi8KKyNkZWZpbmUgQkNNT1NfTVNHX1FVRVVFX0RFRkFVTFRfTUFYX01UVSAgICAgICAgICg2NCoxMDI0KQorCisgICAgLyoqIE9wdGlvbmFsICJwYWNrIiBjYWxsYmFjay4gTm90IG5lZWRlZCBpZiAyIHByb2Nlc3NlcyBhcmUgb24gdGhlIHNhbWUgY29yZS4gKi8KKyAgICBiY21vc19lcnJubyAoKnBhY2spKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIGJjbW9zX21zZyAqbXNnLCB1aW50OF90ICoqYnVmLCB1aW50MzJfdCAqYnVmX2xlbmd0aCk7CisKKyAgICAvKiogT3B0aW9uYWwgInVucGFjayIgY2FsbGJhY2suIE5vdCBuZWVkZWQgaWYgMiBwcm9jZXNzZXMgYXJlIG9uIHRoZSBzYW1lIGNvcmUuICovCisgICAgYmNtb3NfZXJybm8gKCp1bnBhY2spKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgYnVmX2xlbmd0aCwgYmNtb3NfbXNnICoqbXNnKTsKKworICAgIC8qKiBPcHRpb25hbCBjYWxsYmFjayB0aGF0IHJlbGVhc2VzIHBhY2tlZCBidWZmZXIgKi8KKyAgICB2b2lkICgqZnJlZV9wYWNrZWQpKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIHVpbnQ4X3QgKmJ1Zik7CisKKyAgICAvKiogT3B0aW9uYWwgIm9wZW4iIGNhbGxiYWNrLiBNdXN0IGJlIHNldCBmb3IgdXNlci1kZWZpbmVkIHF1ZXVlLCBOVUxMIG90aGVyd2lzZSAqLworICAgIGJjbW9zX2Vycm5vICgqb3BlbikoYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZSk7CisKKyAgICAvKiogT3B0aW9uYWwgImNsb3NlIiBjYWxsYmFjay4gTXVzdCBiZSBzZXQgZm9yIHVzZXItZGVmaW5lZCBxdWV1ZSwgTlVMTCBvdGhlcndpc2UgKi8KKyAgICBiY21vc19lcnJubyAoKmNsb3NlKShiY21vc19tc2dfcXVldWUgKnF1ZXVlKTsKKworICAgIC8qKiBPcHRpb25hbCAic2VuZCIgY2FsbGJhY2suIE11c3QgYmUgc2V0IGZvciB1c2VyLWRlZmluZWQgcXVldWUsIE5VTEwgb3RoZXJ3aXNlICovCisgICAgYmNtb3NfZXJybm8gKCpzZW5kKShiY21vc19tc2dfcXVldWUgKnF1ZXVlLCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9sZW5ndGgpOworCisgICAgLyoqIE9wdGlvbmFsICJyZWN2IiBjYWxsYmFjay4gTXVzdCBiZSBzZXQgZm9yIHVzZXItZGVmaW5lZCBxdWV1ZSwgTlVMTCBvdGhlcndpc2UgKi8KKyAgICBiY21vc19lcnJubyAoKnJlY3YpKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIHVpbnQzMl90IHRpbWVvdXQsIHVpbnQ4X3QgKipidWYsIHVpbnQzMl90ICpidWZfbGVuZ3RoKTsKKyNlbmRpZgorCit9IGJjbW9zX21zZ19xdWV1ZV9wYXJtOworCisvKiogTWVzc2FnZSBxdWV1ZSBzdGF0aXN0aWNzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90IG1zZ19pbjsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBtZXNzYWdlcyBjdXJyZW50bHkgaW4gdGhlIHF1ZXVlICovCisgICAgdWludDMyX3QgbXNnX3NlbnQ7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIG1lc3NhZ2VzIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgaW50byB0aGUgcXVldWUgKi8KKyAgICB1aW50MzJfdCBtc2dfcmVjZWl2ZWQ7ICAgICAgLyoqPCBOdW1iZXIgb2YgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgcXVldWUgKi8KKyAgICB1aW50MzJfdCBtc2dfZGlzY2FyZGVkOyAgICAgLyoqPCBOdW1iZXIgb2YgbWVzc2FnZXMgZGlzY2FyZGVkIGJlY2F1c2Ugb2YgcXVldWUgb3ZlcmZsb3cgKi8KKyAgICB1aW50MzJfdCBtc2dfYWxtb3N0X2Z1bGw7ICAgLyoqPCBOdW1iZXIgb2YgbWVzc2FnZXMgc3VibWl0dGVkIHRvIHF1ZXVlIHdoZW4gaXQgd2FzIGFib3ZlIGhpZ2ggd2F0ZXIgbWFyayAqLworICAgIGJjbW9zX2Jvb2wgaXNfY29uZ2VzdGVkOyAgICAvKio8IFRydWU9dGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBjb25nZXN0ZWQgKi8KK30gYmNtb3NfbXNnX3F1ZXVlX3N0YXQ7CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gcGFybTsgICAgLyoqPCBRdWV1ZSBwYXJhbWV0ZXJzICovCisgICAgYmNtb3NfbXNnX3F1ZXVlX3N0YXQgc3RhdDsgICAgLyoqPCBRdWV1ZSBzdGF0aXN0aWNzICovCit9IGJjbW9zX21zZ19xdWV1ZV9pbmZvOworCisvKiogTWVzc2FnZSBwcmlvcml0eSBpbiBxdWV1ZSBncm91cCAqLwordHlwZWRlZiB1aW50MzJfdCBiY21vc19xZ3JvdXBfcHJ0eTsKKworLyoqIE1lc3NhZ2UgcXVldWUgZ3JvdXAgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgLyoqPCBRdWV1ZSBncm91cCBuYW1lIChmb3IgbG9nZ2luZyBhbmQgZGVidWdnaW5nKSAqLworICAgIGJjbW9zX3Fncm91cF9wcnR5IG5xdWV1ZXM7ICAvKio8IE51bWJlciBvZiBxdWV1ZXMgaW4gdGhlIGdyb3VwICovCisgICAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAgICAgIC8qKjwgVG90YWwgbnVtYmVyIG9mIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiBxdWV1ZSBncm91cC4gMD11bmxpbWl0ZWQgKi8KKyAgICB1aW50MzJfdCBoaWdoX3dtOyAgICAgICAgICAgLyoqPCBPcHRpb25hbCBoaWdoIHdhdGVyIG1hcmsuIExvZyBpcyBnZW5lcmF0ZWQgd2hlbiBxdWV1ZSBvY2N1cGFuY3kgZXhjZWVkcyBod20gKi8KKyAgICB1aW50MzJfdCBsb3dfd207ICAgICAgICAgICAgLyoqPCBPcHRpb25hbCBsb3cgd2F0ZXIgbWFyay4gTG9nIGlzIGdlbmVyYXRlZCB3aGVuIHF1ZXVlIG9jY3VwYW5jeSBkcm9wcyBiZWxvdyBsd20gKi8KKyAgICB1aW50MzJfdCBmbGFnczsgICAgICAgICAgICAgLyoqPCBUQkQgZmxhZ3MuIEZvciBleGFtcGxlLCBzaW5nbGUtY29yZSwgbS1jb3JlICovCisgICAgdm9pZCAoKm5vdGlmeSkoYmNtb3NfbXNnX3Fncm91cCAqcWdycCwgY29uc3QgY2hhciAqdHh0KTsgLyoqKjwgQ2FsbGVkIHdoZW4gcXVldWUgZ3JvdXAgY29uZ2VzdGlvbiBzdGF0ZSBjaGFuZ2VzICovCit9IGJjbW9zX21zZ19xZ3JvdXBfcGFybTsKKworLyoqIE1lc3NhZ2UgcXVldWUgZ3JvdXAgaW5mbyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2dfcWdyb3VwX3Bhcm0gcGFybTsgLyoqPCBRdWV1ZSBncm91cCBwYXJhbWV0ZXJzICovCisgICAgYmNtb3NfbXNnX3F1ZXVlX3N0YXQgIHN0YXQ7IC8qKjwgUXVldWUgZ3JvdXAgc3RhdGlzdGljcyAqLworfSBiY21vc19tc2dfcWdyb3VwX2luZm87CisKKy8qKiBNZXNzYWdlIHJlY2lwaWVudCBpbnN0YW5jZSAoZS5nLiwgb3B0aWNhbCBsaW5rIGlkKSAqLwordHlwZWRlZiB1aW50MTZfdCBiY21vc19tc2dfaW5zdGFuY2U7CisKKy8qKiBNZXNzYWdlIHNlbmQgZmxhZ3MgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSA9IDB4MDAwMDAwMDAsICAgICAgLyoqPCBBdXRvbWF0aWNhbGx5IHJlbGVhc2UgbWVzc2FnZSBpbiBjYXNlIG9mIGVycm9yLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW91ciAqLworICAgIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IgPTB4MDAwMDAwMDEsLyoqPCBEbyBOT1QgZnJlZSBtZXNzYWdlIGluIGNhc2Ugb2YgdHJhbnNtaXQgZXJyb3IgKi8KKyAgICBCQ01PU19NU0dfU0VORF9VUkdFTlQgICAgPSAweDAwMDAwMDAyLCAgICAgIC8qKjwgVXJnZW50IG1lc3NhZ2UgKi8KKyAgICBCQ01PU19NU0dfU0VORF9OT0xJTUlUICAgPSAweDAwMDAwMDA0LCAgICAgIC8qKjwgSWdub3JlIGRlc3RpbmF0aW9uIHF1ZXVlIHNpemUgbGltaXQgKi8KK30gYmNtb3NfbXNnX3NlbmRfZmxhZ3M7CisKKy8qKiBSZWdpc3RlcmVkIG1lc3NhZ2UgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqRl9iY21vc19tc2dfaGFuZGxlcikoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICptc2cpOwordHlwZWRlZiBiY21vc19lcnJubyAoKkZfYmNtb3NfbW9kdWxlX2luaXQpKGxvbmcgZGF0YSk7Cit0eXBlZGVmIHZvaWQgKCpGX2JjbW9zX21vZHVsZV9leGl0KShsb25nIGRhdGEpOworCisvKiogTWVzc2FnZSBoZWFkZXIgKi8KK3N0cnVjdCBiY21vc19tc2cKK3sKKyAgICBiY21vc19tc2dfaWQgICB0eXBlOyAgICAgICAgLyoqPCBNZXNzYWdlIHR5cGUgKi8KKyAgICBiY21vc19tc2dfaW5zdGFuY2UgaW5zdGFuY2U7LyoqPCBNZXNzYWdlIHJlY2lwaWVudCBpbnN0YW5jZSAoZS5nLiwgb3B0aWNhbCBsaW5rIGlkKSAqLworICAgIEZfYmNtb3NfbXNnX2hhbmRsZXIgaGFuZGxlcjsvKio8IE1lc3NhZ2UgaGFuZGxlci4gQ2FuIGJlIHNldCBieSB0aGUgc2VuZGVyIG9yIG1lc3NhZ2UgZGlzcGF0Y2hlciAqLworICAgIGJjbW9zX21vZHVsZV9pZCBzZW5kZXI7ICAgICAvKio8IFNlbmRlciBtb2R1bGUgKi8KKyAgICBTVEFJTFFfRU5UUlkoYmNtb3NfbXNnKSBuZXh0OyAvKio8IE5leHQgbWVzc2FnZSBwb2ludGVyICovCisgICAgdm9pZCAqZGF0YTsgICAgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZSBkYXRhIHBvaW50ZXIgKi8KKyAgICB2b2lkICpzdGFydDsgICAgICAgICAgICAgICAgLyoqPCBNZXNzYWdlIGRhdGEgYmxvY2sgc3RhcnQgKGZvciByZWxlYXNlKSAqLworICAgIHVpbnQzMl90IHNpemU7ICAgICAgICAgICAgICAvKio8IE1lc3NhZ2UgZGF0YSBzaXplICovCisgICAgYmNtb3NfbXNnX3NlbmRfZmxhZ3Mgc2VuZF9mbGFnczsgICAgLyoqPCBGbGFncyB0aGUgbWVzc2FnZSB3YXMgc2VudCB3aXRoICovCisjZGVmaW5lIEJDTU9TX01TR19RVUVVRV9TSVpFX1VOTElNSVRFRCAgICAweEZGRkZGRkZGICAgICAgLyoqPCBVbmxpbWl0ZWQgcXVldWUgKi8KKyAgICB2b2lkICgqcmVsZWFzZSkoYmNtb3NfbXNnICopOyAgICAgICAvKio8IFJlbGVhc2UgY2FsbGJhY2sgKi8KKyAgICB2b2lkICgqZGF0YV9yZWxlYXNlKShiY21vc19tc2cgKik7ICAvKio8IERhdGEgcmVsZWFzZSBjYWxsYmFjay4gVXNlZCB3aGVuIG1lc3NhZ2UgaXMgcmVsZWFzZWQgdG8gbWVzc2FnZSBwb29sICovCit9OworCisvKiBIZWxwZXIgZnVuY3Rpb25zIHRoYXQgcGFjayAvIHVucGFjayBtZXNzYWdlIGhlYWRlciBmb3IgSVBDICovCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisKKy8qKiBTaXplIG9mIG1lc3NhZ2UgaGVhZGVyIG9uIHRoZSBsaW5lIGZvciBJUEMgKi8KKyNkZWZpbmUgQkNNT1NfTVNHX0hEUl9TSVpFICAgICAgOAorCit2b2lkIGJjbW9zX21zZ19oZHJfcGFjayhjb25zdCBiY21vc19tc2cgKm1zZywgdWludDhfdCAqYnVmLCB1aW50MzJfdCBkYXRhX3NpemUpOwordm9pZCBiY21vc19tc2dfaGRyX3VucGFjayhjb25zdCB1aW50OF90ICpidWYsIGJjbW9zX21zZyAqbXNnKTsKKworI2VuZGlmCisKKy8qKiBDcmVhdGUgbWVzc2FnZSBxdWV1ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZXhwbGljaXRseSBpbiAidHJhZGl0aW9uYWwiIG1vZGUKKyAqIG9yIGltcGxpY2l0bHkgYnkgYmNtb3NfbW9kdWxlX2NyZWF0ZSgpLgorICogXHBhcmFtW2luLG91dF0gIHF1ZXVlICAgICAgICBRdWV1ZSBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgICAgcGFybSAgICAgICAgIFF1ZXVlIHBhcmFtZXRlcnMKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19tc2dfcXVldWVfY3JlYXRlKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIGNvbnN0IGJjbW9zX21zZ19xdWV1ZV9wYXJtICpwYXJtKTsKKworLyoqIERlc3Ryb3kgcXVldWUKKyAqCisgKiBccGFyYW1baW5dICAgcXVldWUgICAgICAgICAgIFF1ZXVlIGhhbmRsZQorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19xdWV1ZV9kZXN0cm95KGJjbW9zX21zZ19xdWV1ZSAqcXVldWUpOworCisvKiogR2V0IHF1ZXVlIGluZm8KKyAqCisgKiBccGFyYW1baW5dICAgcXVldWUgICAgICAgICAgIFF1ZXVlIGhhbmRsZQorICogXHBhcmFtW291dF0gIGluZm8gICAgICAgICAgICBRdWV1ZSBpbmZvcm1hdGlvbgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19xdWV1ZV9xdWVyeShjb25zdCBiY21vc19tc2dfcXVldWUgKnF1ZXVlLCBiY21vc19tc2dfcXVldWVfaW5mbyAqaW5mbyk7CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGl0ZXJhdG9yCisgKiBccGFyYW1baW5dIHByZXYgICAgICBQcmV2aW91cyBxdWV1ZS4gKnByZXY9PU5VTEwgLSBnZXQgZmlyc3QKKyAqIFxyZXR1cm46IEJDTV9FUlJfT0ssIEJDTV9FUlJfTk9FTlQsIEJDTV9FUlJfTk9fTU9SRQorICovCitiY21vc19lcnJubyBiY21vc19tc2dfcXVldWVfZ2V0X25leHQoY29uc3QgYmNtb3NfbXNnX3F1ZXVlICoqcHJldik7CisKKy8qKiBDcmVhdGUgbWVzc2FnZSBxdWV1ZSBncm91cC4KKyAqCisgKiBRdWV1ZSBncm91cCBjb250YWlucyBjb25maWd1cmFibGUgbnVtYmVyIG9mIHF1ZXVlcy4gVGhlIHF1ZXVlcyBhcmUgZHJhaW5lZAorICogaW4gc3RyaWN0IHByaW9yaXR5LiBQcmlvcml0eSAwIGlzIHRoZSBoaWdoZXN0LgorICoKKyAqIFxwYXJhbVtpbixvdXRdICBxZ3JvdXAgICAgICAgUXVldWUgZ3JvdXAgY29udHJvbCBibG9jaworICogXHBhcmFtW2luXSAgICAgIHBhcm0gICAgICAgICBRdWV1ZSBncm91cCBwYXJhbWV0ZXJzCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9jcmVhdGUoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwLCBjb25zdCBiY21vc19tc2dfcWdyb3VwX3Bhcm0gKnBhcm0pOworCisvKiogRGVzdHJveSBxdWV1ZSBncm91cAorICoKKyAqIFxwYXJhbVtpbl0gICBxZ3JvdXAgICAgICAgUXVldWUgZ3JvdXAgaGFuZGxlCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9kZXN0cm95KGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCk7CisKKy8qKiBHZXQgcXVldWUgZ3JvdXAgaW5mbworICoKKyAqIFxwYXJhbVtpbl0gICBxZ3JvdXAgICAgICAgUXVldWUgZ3JvdXAgaGFuZGxlCisgKiBccGFyYW1bb3V0XSAgaW5mbyAgICAgICAgIFF1ZXVlIGdyb3VwIGluZm9ybWF0aW9uCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9xdWVyeShjb25zdCBiY21vc19tc2dfcWdyb3VwICpxZ3JvdXAsIGJjbW9zX21zZ19xZ3JvdXBfaW5mbyAqaW5mbyk7CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGdyb3VwIGl0ZXJhdG9yCisgKiBccGFyYW1baW5dIHByZXYgICAgICBQcmV2aW91cyBxdWV1ZSBncm91cC4gKnByZXY9PU5VTEwgLSBnZXQgZmlyc3QKKyAqIFxyZXR1cm46IEJDTV9FUlJfT0ssIEJDTV9FUlJfTk9FTlQsIEJDTV9FUlJfTk9fTU9SRQorICovCitiY21vc19lcnJubyBiY21vc19tc2dfcWdyb3VwX2dldF9uZXh0KGNvbnN0IGJjbW9zX21zZ19xZ3JvdXAgKipwcmV2KTsKKworLyoqIFNlbmQgbWVzc2FnZSB0byBxdWV1ZQorICoKKyAqIFxwYXJhbVtpbl0gICBxdWV1ZSAgICAgICAgICAgUXVldWUgaGFuZGxlCisgKiBccGFyYW1baW5dICAgbXNnICAgICAgICAgICAgIE1lc3NhZ2UKKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgICAgICAgICAgZmxhZ3MuIENvbWJpbmF0aW9uIG9mIFxyZWYgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgYml0cworICoKKyAqIG1zZyBpcyByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IHJlZ2FyZGxlc3Mgb2YgYmNtb3NfbXNnX3NlbmQoKSBvdXRjb21lLCB1bmxlc3MKKyAqIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IgZmxhZyBpcyBzZXQuCisgKgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19zZW5kKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIGJjbW9zX21zZyAqbXNnLCBiY21vc19tc2dfc2VuZF9mbGFncyBmbGFncyk7CisKKy8qKiBTZW5kIG1lc3NhZ2UgdG8gbW9kdWxlCisgKgorICogRm9yIG1vZHVsZSB0byBiZSBhYmxlIHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UsIGl0IG11c3QgYmUgcmVnaXN0ZXJlZAorICogdXNpbmcgYmNtb3NfbXNnX3JlZ2lzdGVyKCkKKyAqCisgKiBccGFyYW1baW5dICAgbW9kdWxlX2lkICAgICAgIE1vZHVsZSBpZAorICogXHBhcmFtW2luXSAgIG1zZyAgICAgICAgICAgICBNZXNzYWdlLiBtc2ctPmhhbmRsZXIgbXVzdCBiZSBzZXQKKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgICAgICAgICAgZmxhZ3MuIENvbWJpbmF0aW9uIG9mIFxyZWYgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgYml0cworICoKKyAqIG1zZyBpcyByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IHJlZ2FyZGxlc3Mgb2YgYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKCkgb3V0Y29tZSwgdW5sZXNzCisgKiBCQ01PU19NU0dfU0VORF9OT19GUkVFX09OX0VSUk9SIGZsYWcgaXMgc2V0LgorICoKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19tc2dfc2VuZF90b19tb2R1bGUoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICptc2csIGJjbW9zX21zZ19zZW5kX2ZsYWdzIGZsYWdzKTsKKworLyoqIFNlbmQgbWVzc2FnZSB0byBxdWV1ZSBncm91cAorICoKKyAqIFxwYXJhbVtpbl0gICBxZ3JvdXAgICAgICAgICAgUXVldWUgZ3JvdXAgaGFuZGxlCisgKiBccGFyYW1baW5dICAgbXNnICAgICAgICAgICAgIE1lc3NhZ2UKKyAqIFxwYXJhbVtpbl0gICBwcnR5ICAgICAgICAgICAgTWVzc2FnZSBwcmlvcml0eSBpbiByYW5nZSAwLW5xdWV1ZXNfaW5fZ3JvdXAtMS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBwcmlvcml0eSBpcyB0aGUgaGlnaGVzdC4gSWYgTUFYIG51bWJlciBvZiBtZXNzYWdlcyBhcmUgYWxyZWFkeSBxdWV1ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHF1ZXVlIGdyb3VwLCBzZW5kaW5nIG1lc3NhZ2UgY2FuIGxlYXZlIHRvIGRpc2NhcmQgb2YgdGhlIGhlYWQgbWVzc2FnZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZWQgYXQgbG93ZXIgcHJpb3JpdHkKKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgICAgICAgICAgQkNNT1NfTVNHX1NFTkRfQVVUT19GUkVFIG9yIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IgZmxhZworICoKKyAqCisgKiBtc2cgaXMgcmVsZWFzZWQgYXV0b21hdGljYWxseSByZWdhcmRsZXNzIG9mIGJjbW9zX21zZ19zZW5kX3RvX3Fncm91cCgpIG91dGNvbWUsIHVubGVzcworICogQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUiBmbGFnIGlzIHNldC4KKyAqCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3NlbmRfdG9fcWdyb3VwKGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCwgYmNtb3NfbXNnICptc2csIGJjbW9zX3Fncm91cF9wcnR5IHBydHksCisgICAgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgZmxhZ3MpOworCisvKiogR2V0IG1lc3NhZ2UgZnJvbSB0aGUgaGVhZCBvZiBtZXNzYWdlIHF1ZXVlCisgKgorICogVGhlIGZ1bmN0aW9uIGNhbiBsZWFkIHRvIHRoZSBjYWxsaW5nIHRhc2sgYmVpbmcgc3VzcGVuZGVkIGZvciBhIHBlcmlvZAorICogb2YgdGltZSBvciBpbmRlZmluaXRlbHksIHVudGlsIG1lc3NhZ2UgaXMgc3VibWl0dGVkIHRvIHRoZSBxdWV1ZS5cbgorICogVGhlIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBpbiAidHJhZGl0aW9uYWwgdGFza3MiIChzZWUgXHJlZiBzeXN0ZW1fbW9kZWwpLgorICoKKyAqIFxwYXJhbVtpbl0gICBxdWV1ZSAgICAgICAgICAgUXVldWUgaGFuZGxlCisgKiBccGFyYW1baW5dICAgdGltZW91dCAgICAgICAgIHRpbWVvdXQuIGNhbiBiZSAwLCB0aW1lIGluIHVzIG9yIFxyZWYgQkNNT1NfV0FJVF9GT1JFVkVSCisgKiBccGFyYW1bb3V0XSAgbXNnICAgICAgICAgICAgIE1lc3NhZ2UgaGFuZGxlCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3JlY3YoYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZSwgdWludDMyX3QgdGltZW91dCwgYmNtb3NfbXNnICoqbXNnKTsKKworLyoqIEdldCBoaWdoZXN0IHByaW9yaXR5IG1lc3NhZ2UgZnJvbSBxdWV1ZSBncm91cAorICoKKyAqIFRoZSBmdW5jdGlvbiBjYW4gbGVhZCB0byB0aGUgY2FsbGluZyB0YXNrIGJlaW5nIHN1c3BlbmRlZCBmb3IgYSBwZXJpb2QKKyAqIG9mIHRpbWUgb3IgaW5kZWZpbml0ZWx5LCB1bnRpbCBtZXNzYWdlIGlzIHN1Ym1pdHRlZCB0byB0aGUgcXVldWUgZ3JvdXAuXG4KKyAqIFRoZSBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgaW4gInRyYWRpdGlvbmFsIHRhc2tzIiAoc2VlIFxyZWYgc3lzdGVtX21vZGVsKS4KKyAqCisgKiBccGFyYW1baW5dICAgcWdyb3VwICAgICAgICAgIFF1ZXVlIGdyb3VwIGhhbmRsZQorICogXHBhcmFtW2luXSAgIHRpbWVvdXQgICAgICAgICB0aW1lb3V0LiBjYW4gYmUgMCwgdGltZSBpbiB1cyBvciBccmVmIEJDTU9TX1dBSVRfRk9SRVZFUgorICogXHBhcmFtW291dF0gIG1zZyAgICAgICAgICAgICBNZXNzYWdlIGhhbmRsZQorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19yZWN2X2Zyb21fcWdyb3VwKGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCwgdWludDMyX3QgdGltZW91dCwgYmNtb3NfbXNnICoqbXNnKTsKKworLyoqIERpc3BhdGNoIG1lc3NhZ2UuIFNlbmQgdG8gbW9kdWxlIHRoYXQgcmVnaXN0ZXJlZCBmb3IgaXQuCisgKgorICogVGhlIG1lc3NhZ2UgbXVzdCBiZSByZWdpc3RlcmVkIHVzaW5nIGJjbW9zX21zZ19yZWdpc3RlcigpCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBpZiB0aGUgbWVzc2FnZSBzZW5kZXIgZG9lc24ndCBrbm93IHRoZSB0YXJnZXQgbW9kdWxlIGFuZC9vcgorICogbWVzc2FnZSBoYW5kbGluZyBjYWxsYmFjay4KKyAqCisgKiBccGFyYW1baW5dICAgbXNnICAgICAgICAgICAgIE1lc3NhZ2UgaGFuZGxlCisgKiBccGFyYW1baW5dICAgZmxhZ3MgICAgICAgICAgIGZsYWdzLiBDb21iaW5hdGlvbiBvZiBccmVmIGJjbW9zX21zZ19zZW5kX2ZsYWdzIGJpdHMKKyAqCisgKiBtc2cgaXMgcmVsZWFzZWQgYXV0b21hdGljYWxseSByZWdhcmRsZXNzIG9mIGJjbW9zX21zZ19kaXNwYXRjaCgpIG91dGNvbWUsIHVubGVzcworICogQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUiBmbGFnIGlzIHNldC4KKyAqCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX2Rpc3BhdGNoKGJjbW9zX21zZyAqbXNnLCBiY21vc19tc2dfc2VuZF9mbGFncyBmbGFncyk7CisKKy8qKiBSZWdpc3RlciBtZXNzYWdlIGZvciAicHVzaC1tb2RlIiBkZWxpdmVyeS4KKyAqCisgKiBXaGVuIHJlZ2lzdGVyZWQgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSB0YXJnZXQgbW9kdWxlIGFuZAorICogdGhlIG1vZHVsZSdzIHRhc2sgd2FrZXMgdXAsIG1lc3NhZ2UgaGFuZGxlciBpcyBjYWxsZWQgaW4gdGhlIG1vZHVsZSdzIGNvbnRleHQuCisgKgorICogXHBhcmFtW2luXSAgIG1zZ190eXBlICAgICAgICBNZXNzYWdlIHR5cGUKKyAqIFxwYXJhbVtpbl0gICBpbnN0YW5jZSAgICAgICAgTWVzc2FnZSB0eXBlIGluc3RhbmNlCisgKiBccGFyYW1baW5dICAgbW9kdWxlX2lkICAgICAgIFRhcmdldCBtb2R1bGUgaWQKKyAqIFxwYXJhbVtpbl0gICBoYW5kbGVyICAgICAgICAgTWVzc2FnZSBoYW5kbGVyCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3JlZ2lzdGVyKGJjbW9zX21zZ19pZCBtc2dfdHlwZSwgYmNtb3NfbXNnX2luc3RhbmNlIGluc3RhbmNlLAorICAgIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIEZfYmNtb3NfbXNnX2hhbmRsZXIgaGFuZGxlcik7CisKKy8qKiBVbi1yZWdpc3RlciBtZXNzYWdlIHJlZ2lzdGVyZWQgYnkgYmNtb3NfbXNnX3JlZ2lzdGVyKCkKKyAqCisgKiBccGFyYW1baW5dICAgbXNnX3R5cGUgICAgICAgIE1lc3NhZ2UgdHlwZQorICogXHBhcmFtW2luXSAgIGluc3RhbmNlICAgICAgICBNZXNzYWdlIHR5cGUgaW5zdGFuY2UKKyAqIFxwYXJhbVtpbl0gICBtb2R1bGVfaWQgICAgICAgVGFyZ2V0IG1vZHVsZSBpZAorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ191bnJlZ2lzdGVyKGJjbW9zX21zZ19pZCBtc2dfdHlwZSwgYmNtb3NfbXNnX2luc3RhbmNlIGluc3RhbmNlLAorICAgIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQpOworCisvKiogUHV0IHRoZSBPUyBtZXNzYWdlIGluZnJhc3RydWN0dXJlIGluICJzaHV0ZG93biBtb2RlIi4KKyAqCisgKiBXaGVuIGluIHNodXRkb3duIG1vZGUsIGJjbW9zX21zZ19kaXNwYXRjaCgpIHdpbGwgcmV0dXJuIEJDTV9FUlJfT0sgaW5zdGVhZCBvZiBCQ01fRVJSX05PRU5UIHdoZW4gYSBoYW5kbGVyIGlzIG5vdAorICogZm91bmQgZm9yIHRoZSBtZXNzYWdlLiBBZGRpdGlvbmFsbHksIGJjbW9zX21zZ19kaXNwYXRjaCgpIGJlY29tZXMgc2FmZSB0byBjYWxsIGNvbmN1cnJlbnRseSB3aXRoCisgKiBiY21vc19tc2dfdW5yZWdpc3RlcigpICh0aGlzIGlzIG5vdCB0cnVlIGluIG5vcm1hbCBvcGVyYXRpb24pLgorICoKKyAqIFxwYXJhbVtpbl0gICBzaHV0ZG93bl9tb2RlICAgV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHNodXRkb3duIG1vZGUKKyAqLwordm9pZCBiY21vc19tc2dfc2h1dGRvd25fbW9kZV9zZXQoYmNtb3NfYm9vbCBzaHV0ZG93bl9tb2RlKTsKKworLyoqIEdldHMgd2hldGhlciBvciBub3QgdGhlIE9TIG1lc3NhZ2UgaW5mcmFzdHJ1Y3R1cmUgaXMgY3VycmVudGx5IGluICJzaHV0ZG93biBtb2RlIi4KKyAqIFxyZXR1cm5zIEJDTU9TX1RSVUUgaWYgd2UgYXJlIGluIHNodXRkb3duIG1vZGUsIEJDTU9TX0ZBTFNFIG90aGVyd2lzZQorICovCitiY21vc19ib29sIGJjbW9zX21zZ19zaHV0ZG93bl9tb2RlX2dldCh2b2lkKTsKKworLyoqIEhlbHBlciB0eXBlIGZvciBzdG9yaW5nIG1lc3NhZ2UgdHlwZXMgYWxvbmdzaWRlIHRoZWlyIGhhbmRsZXJzLiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2dfaWQgbXNnX3R5cGU7CisgICAgRl9iY21vc19tc2dfaGFuZGxlciBoYW5kbGVyOworfSBiY21vc19tc2dfaWQyaGFuZGxlcjsKKworLyoqIE1lc3NhZ2UgcG9vbCAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfbXNnX3Bvb2wgYmNtb3NfbXNnX3Bvb2w7CisKKy8qKiBNZXNzYWdlIHBvb2wgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfbXNnX3Bvb2xfcGFybQoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAvKio8IFBvb2wgbmFtZSAqLworICAgIHVpbnQzMl90IHNpemU7ICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBtZXNzYWdlcyBpbiB0aGUgcG9vbCAqLworICAgIHVpbnQzMl90IGRhdGFfc2l6ZTsgICAgICAgICAvKio8IE1lc3NhZ2UgZGF0YSBzaXplICovCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgIC8qKjwgVEJEIGZsYWdzICovCisgICAgdm9pZCAoKmRhdGFfcmVsZWFzZSkoYmNtb3NfbXNnICptc2cpOyAvKio8IE9wdGlvbmFsIGRhdGEgcmVsZWFzZSBjYWxsYmFjay4gQ2FsbGVkIHdoZW4gbWVzc2FnZSBpcyByZWxlYXNlZCB0byB0aGUgcG9vbCAqLworfSBiY21vc19tc2dfcG9vbF9wYXJtOworCisvKiogTWVzc2FnZSBwb29sIHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgYmNtb3NfYmxrX3Bvb2xfc3RhdCBiY21vc19tc2dfcG9vbF9zdGF0OworCisvKiogTWVzc2FnZSBwb29sIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX21zZ19wb29sX2luZm8KK3sKKyAgICBiY21vc19tc2dfcG9vbF9wYXJtIHBhcm07ICAgLyoqPCBQb29sIHBhcmFtZXRlcnMgKi8KKyAgICBiY21vc19tc2dfcG9vbF9zdGF0IHN0YXQ7ICAgLyoqPCBQb29sIHN0YXRpc3RpY3MgKi8KK30gYmNtb3NfbXNnX3Bvb2xfaW5mbzsKKworLyoqIENyZWF0ZSBtZXNzYWdlIHBvb2wKKyAqCisgKiBDcmVhdGUgcG9vbCBjb250YWluaW5nIHByZS1hbGxvY2F0ZWQgbWVzc2FnZXMgd2l0aCBzcGVjaWZpZWQgZGF0YSBzaXplCisgKiBccGFyYW1baW5dICAgcG9vbCAgICBNZXNzYWdlIHBvb2wgaGFuZGxlCisgKiBccGFyYW1baW5dICAgcGFybSAgICBNZXNzYWdlIHBvb2wgcGFyYW1ldGVycworICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19wb29sX2NyZWF0ZShiY21vc19tc2dfcG9vbCAqcG9vbCwgY29uc3QgYmNtb3NfbXNnX3Bvb2xfcGFybSAqcGFybSk7CisKKy8qKiBEZXN0cm95IG1lc3NhZ2UgcG9vbAorICoKKyAqIEFsbCBtZXNzYWdlcyBtdXN0IGJlIHJlbGVhc2VkIHRvIHRoZSBwb29sIGJlZm9yZSBpdCBjYW4gYmUgZGVzdHJveWVkLgorICoKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIE1lc3NhZ2UgcG9vbCBoYW5kbGUKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19tc2dfcG9vbF9kZXN0cm95KGJjbW9zX21zZ19wb29sICpwb29sKTsKKworLyoqIEFsbG9jYXRlIG1lc3NhZ2UgZnJvbSBwb29sCisgKgorICogVGhlIHBvb2wgbXVzdCBiZSBjcmVhdGVkIHVzaW5nIGJjbW9zX3Bvb2xfY3JlYXRlKCkKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIE1lc3NhZ2UgcG9vbCBoYW5kbGUKKyAqIFxyZXR1cm5zICAgICBtc2cgcG9pbnRlciBvciBOVUxMIGlmIHRoZSBwb29sIGlzIGVtcHR5LgorICogImRhdGEiIGFuZCAicmVsZWFzZSIgZmllbGRzIGluIHRoZSByZXR1cm5lZCBtZXNzYWdlIGFyZSBwcmUtc2V0CisgKiBPbmNlIG5vIGxvbmdlciBuZWVkZWQsIHRoZSBtZXNzYWdlIG11c3QgYmUgcmVsZWFzZWQgdXNpbmcgYmNtb3NfbXNnX2ZyZWUoKQorICovCitiY21vc19tc2cgKmJjbW9zX21zZ19wb29sX2FsbG9jKGJjbW9zX21zZ19wb29sICpwb29sKTsKKworLyoqIEFsbG9jYXRlIG1lc3NhZ2UgZnJvbSBwb29sIGFuZCBjbGVhciBkYXRhCisgKgorICogVGhlIHBvb2wgbXVzdCBiZSBjcmVhdGVkIHVzaW5nIGJjbW9zX3Bvb2xfY3JlYXRlKCkKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIE1lc3NhZ2UgcG9vbCBoYW5kbGUKKyAqIFxyZXR1cm5zICAgICBtc2cgcG9pbnRlciBvciBOVUxMIGlmIHRoZSBwb29sIGlzIGVtcHR5LgorICogImRhdGEiIGFuZCAicmVsZWFzZSIgZmllbGRzIGluIHRoZSByZXR1cm5lZCBtZXNzYWdlIGFyZSBwcmUtc2V0CisgKiBPbmNlIG5vIGxvbmdlciBuZWVkZWQsIHRoZSBtZXNzYWdlIG11c3QgYmUgcmVsZWFzZWQgdXNpbmcgYmNtb3NfbXNnX2ZyZWUoKQorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX21zZyAqYmNtb3NfbXNnX3Bvb2xfY2FsbG9jKGJjbW9zX21zZ19wb29sICpwb29sKQoreworICAgIGJjbW9zX21zZyAqbXNnID0gYmNtb3NfbXNnX3Bvb2xfYWxsb2MocG9vbCk7CisgICAgaWYgKG1zZykKKyAgICB7CisgICAgICAgIG1lbXNldChtc2ctPmRhdGEsIDAsIG1zZy0+c2l6ZSk7CisgICAgfQorICAgIHJldHVybiBtc2c7Cit9CisKKy8qKiBHZXQgcG9vbCBpbmZvCisgKgorICogVGhlIHBvb2wgbXVzdCBiZSBjcmVhdGVkIHVzaW5nIGJjbW9zX3Bvb2xfY3JlYXRlKCkKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIE1lc3NhZ2UgcG9vbCBoYW5kbGUKKyAqIFxwYXJhbVtvdXRdICBpbmZvICAgIE1lc3NhZ2UgcG9vbCBpbmZvCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Bvb2xfcXVlcnkoY29uc3QgYmNtb3NfbXNnX3Bvb2wgKnBvb2wsIGJjbW9zX21zZ19wb29sX2luZm8gKmluZm8pOworCisvKiogTWVzc2FnZSBwb29sIGl0ZXJhdG9yCisgKiBccGFyYW1baW5dIHByZXYgICAgICBQcmV2aW91cyBtZXNzYWdlIHBvb2wuICpwcmV2PT1OVUxMIC0gZ2V0IGZpcnN0CisgKiBccmV0dXJuOiBCQ01fRVJSX09LLCBCQ01fRVJSX05PRU5ULCBCQ01fRVJSX05PX01PUkUKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Bvb2xfZ2V0X25leHQoY29uc3QgYmNtb3NfbXNnX3Bvb2wgKipwcmV2KTsKKworLyoqIEB9IHN5c3RlbV9tc2cgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9tb2R1bGUKKyAqIEB7CisgKi8KKworLyoqIE1heCBudW1iZXIgb2YgbW9kdWxlcyBwZXIgdGFzay4gTXVzdCBiZSA8PSAzMiAqLworI2RlZmluZSBCQ01PU19NQVhfTU9EVUxFU19QRVJfVEFTSyAgICAgICAgOAorCisvKiogTW9kdWxlIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gcXBhcm07ICAvKio8IE1lc3NhZ2UgcXVldWUgcGFyYW1hdGVycyAqLworICAgIEZfYmNtb3NfbW9kdWxlX2luaXQgaW5pdDsgICAgLyoqPCBJbml0IGNhbGxiYWNrICovCisgICAgRl9iY21vc19tb2R1bGVfZXhpdCBleGl0OyAgICAvKio8IEV4aXQgY2FsbGJhY2sgKi8KKyAgICBsb25nIGRhdGE7ICAgICAgICAgICAgICAgICAgIC8qKjwgTW9kdWxlIGNvbnRleHQgaW5pdGlhbCB2YWx1ZS4gQWxzbyBwYXNzZWQgdG8gaW5pdCBhbmQgZXhpdCBjYWxsYmFja3MgKi8KK30gYmNtb3NfbW9kdWxlX3Bhcm07CisKKy8qKiBNb2R1bGUgY29udHJvbCBibG9jayAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfbW9kdWxlIGJjbW9zX21vZHVsZTsKKworLyoqIFJlZ2lzdGVyIG1vZHVsZQorICoKKyAqIFxwYXJhbVtpbl0gICBtb2R1bGVfaWQgICAgICAgTW9kdWxlIGlkCisgKiBccGFyYW1baW5dICAgdGFzayAgICAgICAgICAgIE93bmVyIHRhc2sgSUQKKyAqIFxwYXJhbVtpbl0gICBwYXJtICAgICAgICAgICAgTW9kdWxlIHBhcmFtZXRlcnMKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19tb2R1bGVfY3JlYXRlKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX3Rhc2sgKnRhc2ssIGJjbW9zX21vZHVsZV9wYXJtICpwYXJtKTsKKworLyoqIFVuLXJlZ2lzdGVyIG1vZHVsZQorICoKKyAqIFxwYXJhbVtpbl0gICBtb2R1bGVfaWQgICAgICAgTW9kdWxlIGlkCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbW9kdWxlX2Rlc3Ryb3koYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCk7CisKKy8qKiBHZXQgY3VycmVudCBtb2R1bGUgaWQgaW4gdGhlIGN1cnJlbnQgdGFzaworICoKKyAqIFxyZXR1cm5zIG1vZHVsZV9pZAorICovCitiY21vc19tb2R1bGVfaWQgYmNtb3NfbW9kdWxlX2N1cnJlbnQodm9pZCk7CisKKy8qKiBHZXQgbW9kdWxlIGNvbnRleHQKKyAqCisgKiBNb2R1bGUgY29udGV4dCBpcyBpbml0aWFsaXplZCBhcyBtb2R1bGVfcGFybS5kYXRhIGFuZCBjYW4gYmUgbW9kaWZpZWQgdXNpbmcKKyAqIGJjbW9zX21vZHVsZV9jb250ZXh0X3NldCgpCisgKgorICogXHBhcmFtW2luXSAgIG1vZHVsZV9pZCAgICAgICBNb2R1bGVfaWQKKyAqIFxyZXR1cm5zIGNvbnRleHQgcG9pbnRlciBzZXQgYnkgYmNtb3NfbW9kdWxlX2NvbnRleHRfc2V0KCkgb3IKKyAqCisgKiBOVUxMIGlmIG1vZHVsZV9pZCBpcyBpbnZhbGlkIG9yIGNvbnRleHQgaXMgbm90IHNldC4KKyAqLwordm9pZCAqYmNtb3NfbW9kdWxlX2NvbnRleHQoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCk7CisKKy8qKiBTZXQgbW9kdWxlIGNvbnRleHQKKyAqCisgKiBDb250ZXh0IGlzIGFuIGFyYml0cmFyeSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBtb2R1bGUtc3BlY2lmaWMgZGF0YS4KKyAqIFVzdWFsbHkgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBtb2R1bGUgaW5pdCgpIGNhbGxiYWNrCisgKgorICogXHBhcmFtW2luXSAgIG1vZHVsZV9pZCAgICAgICBNb2R1bGVfaWQKKyAqIFxwYXJhbVtpbl0gICBjb250ZXh0ICAgICAgICAgTW9kdWxlIGNvbnRleHQgcG9pbnRlcgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21vZHVsZV9jb250ZXh0X3NldChiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCB2b2lkICpjb250ZXh0KTsKKworLyogbW9kdWxlIGNvbnRyb2wgYmxvY2tzICovCitleHRlcm4gYmNtb3NfbW9kdWxlICpiY21vc19tb2R1bGVzW0JDTU9TX01PRFVMRV9JRF9fTlVNX09GXTsKKworc3RhdGljIGlubGluZSBiY21vc19tb2R1bGUgKl9iY21vc19tb2R1bGVfZ2V0KGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQpCit7CisgICAgYmNtb3NfbW9kdWxlICptb2R1bGUgPSBiY21vc19tb2R1bGVzW21vZHVsZV9pZF07CisgICAgaWYgKCh1bnNpZ25lZCltb2R1bGVfaWQgPj0gQkNNT1NfTU9EVUxFX0lEX19OVU1fT0YpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBtb2R1bGU7Cit9CisKKy8qKiBRdWVyeSBtb2R1bGUKKyAqCisgKiBccGFyYW1baW5dICAgbW9kdWxlX2lkICAgICAgIE1vZHVsZV9pZAorICogXHBhcmFtW291dF0gIHRhc2sgICAgICAgICAgICBUYXNrIHRoYXQgb3ducyB0aGUgbW9kdWxlCisgKiBccGFyYW1bb3V0XSAgaW5mbyAgICAgICAgICAgIE1vZHVsZSBxdWV1ZSBpbmZvCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbW9kdWxlX3F1ZXJ5KGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGNvbnN0IGJjbW9zX3Rhc2sgKip0YXNrLCBiY21vc19tc2dfcXVldWVfaW5mbyAqaW5mbyk7CisKKy8qKiBAfSBzeXN0ZW1fbW9kdWxlICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fZXZlbnQKKyAqIEB7CisgKi8KKworLyoqIFJlZ2lzdGVyZWQgZXZlbnQgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqRl9iY21vc19ldmVudF9oYW5kbGVyKShiY21vc19ldmVudF9pZCBldmVudF9pZCwgdWludDMyX3QgYWN0aXZlX2JpdHMpOworCisvKiogRXZlbnQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAvKio8IEV2ZW50IHNldCBuYW1lICovCisgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZDsgICAgICAgICAgLyoqPCBNb2R1bGUgaWQuIFRoZSBtb2R1bGUgbXVzdCBiZSByZWdpc3RlcmVkICovCisgICAgdWludDMyX3QgbWFzazsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFdmVudCBiaXRzIG1vZHVsZSBpcyBpbnRlcmVzdGVkIGluICovCisgICAgRl9iY21vc19ldmVudF9oYW5kbGVyIGhhbmRsZXI7ICAgICAgLyoqPCBFdmVudCBoYW5kbGVyLiBDYWxsZWQgaW4gbW9kdWxlJ3MgY29udGV4dCAqLworICAgIHVpbnQzMl90IGZsYWdzOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVEJEIGZsYWdzLiBFLmcuLCBpbnRlci1jb3JlICovCit9IGJjbW9zX2V2ZW50X3Bhcm07CisKKy8qKiBFdmVudCBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19ldmVudCBiY21vc19ldmVudDsKKworLyoqIENyZWF0ZSBldmVudCBzZXQKKyAqCisgKiBccGFyYW1baW5dICAgZXZlbnRfaWQgICAgICAgIEV2ZW50IHNldCBpZAorICogXHBhcmFtW2luXSAgIHBhcm0gICAgICAgICAgICBFdmVudCBwYXJhbWV0ZXJzLiBVc2VkIGluICJpbnRlZ3JhdGlvbiIgbW9kZS4gTlVMTCBpbiAidHJhZGl0aW9uYWwiIG1vZGUKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19ldmVudF9jcmVhdGUoYmNtb3NfZXZlbnRfaWQgZXZlbnRfaWQsIGJjbW9zX2V2ZW50X3Bhcm0gKnBhcm0pOworCisvKiogRGVzdHJveSBldmVudCBzZXQgY3JlYXRlZCBieSBiY21vc19ldmVudF9jcmVhdGUoKQorICoKKyAqIFxwYXJhbVtpbl0gICBldmVudF9pZCAgICAgICAgRXZlbnQgc2V0IGlkCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfZXZlbnRfZGVzdHJveShiY21vc19ldmVudF9pZCBldmVudF9pZCk7CisKKy8qKiBSYWlzZSBldmVudAorICoKKyAqIFJhaXNlZCBldmVudCBpcyBkZWxpdmVyZWQgdG8gbW9kdWxlKHMpIHRoYXQgcmVnaXN0ZXJlZCBmb3IgaXQKKyAqIHVzaW5nIGJjbW9zX2V2ZW50X3JlZ2lzdGVyKCkgb3IgdG8gdGhlIHRhc2sgd2FpdGluZyBmb3IgZXZlbnQKKyAqIHVzaW5nIGJjbW9zX2V2ZW50X3JlY3YoKQorICoKKyAqIFxwYXJhbVtpbl0gICBldmVudF9pZCAgICAgICAgRXZlbnQgc2V0IGlkCisgKiBccGFyYW1baW5dICAgYWN0aXZlX2JpdHMgICAgIEFjdGl2ZSBiaXQgbWFzaworICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwLiBDYW4gb25seSBmYWlsIGlmIGV2ZW50IGlzIG5vdCByZWdpc3RlcmVkCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2V2ZW50X3JhaXNlKGJjbW9zX2V2ZW50X2lkIGV2ZW50X2lkLCB1aW50MzJfdCBhY3RpdmVfYml0cyk7CisKKy8qKiBXYWl0IGZvciBldmVudAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiAidHJhZGl0aW9uYWwiIG1vZGUuXG4KKyAqIFRoZSBjYWxsZXIgY2FuIGJsb2NrIGZvciBhIHRpbWUgb3IgaW5kZWZpbml0ZWx5CisgKgorICogXHBhcmFtW2luXSAgIGV2ZW50X2lkICAgICAgICBFdmVudCBzZXQgaWQKKyAqIFxwYXJhbVtpbl0gICBtYXNrICAgICAgICAgICAgSW50ZXJlc3RpbmcgYml0cy4gVGhlIGZ1bmN0aW9ucyByZXR1cm5zIHdoZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aW1lb3V0IGV4cGlyZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBldmVudCB3aXRoIChhY3RpdmVfYml0cyAmIG1hc2spICE9IDAgaXMgcmFpc2VkCisgKiBccGFyYW1baW5dICAgdGltZW91dCAgICAgICAgIHRpbWVvdXQuIGNhbiBiZSAwLCB0aW1lIGluIHVzIG9yIFxyZWYgQkNNT1NfV0FJVF9GT1JFVkVSCisgKiBccGFyYW1bb3V0XSAgYWN0aXZlX2JpdHMgICAgIGFjdGl2ZSBiaXRzIGluIHRoZSBldmVudCBzZXQuIHZhbGlkIG9ubHkgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgMAorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2V2ZW50X3JlY3YoYmNtb3NfZXZlbnRfaWQgZXZlbnRfaWQsIHVpbnQzMl90IG1hc2ssCisgICAgdWludDMyX3QgdGltZW91dCwgdWludDMyX3QgKmFjdGl2ZV9iaXRzKTsKKworLyogRXZlbnQgc2V0IGFycmF5ICovCitleHRlcm4gYmNtb3NfZXZlbnQgKmJjbW9zX2V2ZW50c1tCQ01PU19FVkVOVF9JRF9fTlVNX09GXTsKKworLyogR2V0IGV2ZW50IGdpdmVybiB0aGUgZXZlbnQgaWQgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXZlbnQgKl9iY21vc19ldmVudF9nZXQoYmNtb3NfZXZlbnRfaWQgZXZlbnRfaWQpCit7CisgICAgYmNtb3NfZXZlbnQgKmV2ID0gYmNtb3NfZXZlbnRzW2V2ZW50X2lkXTsKKyAgICBpZiAoKHVuc2lnbmVkKWV2ZW50X2lkID49IEJDTU9TX0VWRU5UX0lEX19OVU1fT0YpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBldjsKK30KKworLyoqIEB9IHN5c3RlbV9ldmVudCAqLworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX3RpbWVyCisgKiBAeworICovCisKKy8qKiBNYXggdGltZXIgZHVyYXRpb24gKHVzKSAqLworI2RlZmluZSBCQ01PU19NQVhfVElNRVJfRFVSQVRJT04gICAweDgwMDAwMDAwCisKKy8qKiBUaW1lciBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY21vc190aW1lciBiY21vc190aW1lcjsKKworLyoqIFRpbWVyIGhhbmRsZXIgY29tcGxldGlvbiBjb2RlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PU19USU1FUl9PSywgICAgICAgICAgICAgLyoqPCBSZXN0YXJ0IHRpbWVyIGlmIHBlcmlvZGljIG9yIGtlZXAgc3RvcHBlZCBpZiBub3QgKi8KKyAgICBCQ01PU19USU1FUl9TVE9QICAgICAgICAgICAgLyoqPCBEbyBub3QgcmVzdGFydCBwZXJpb2RpYyB0aW1lciAqLworfSBiY21vc190aW1lcl9yYzsKKworLyoqIFRpbWVyIGhhbmRsZXIKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgIEV4cGlyZWQgdGltZXIgaGFuZGxlCisgKiBccGFyYW1baW5dICAgZGF0YSAgICBVc2VyIGRhdGEgc3VwcGxpZWQgYXQgdGltZXIgY3JlYXRpb24gdGltZQorICogXHJldHVybnMgXHJlZiBiY21vc190aW1lcl9yYworICovCit0eXBlZGVmIGJjbW9zX3RpbWVyX3JjICgqRl9iY21vc190aW1lcl9oYW5kbGVyKShiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSk7CisKK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9TX1RJTUVSX1BBUk1fRkxBR1NfVVJHRU5UICAgICA9IDAsICAgICAgIC8qKjwgRGVmYXVsdCBiZWhhdmlvci4gSWYgdGhlIHRpbWVyIG93bmVyIGlzIHNldCwgdGltZXIgZXhwaXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBkZWxpdmVyZWQgYXMgYW4gdXJnZW50IG1lc3NhZ2UuICovCisgICAgQkNNT1NfVElNRVJfUEFSTV9GTEFHU19OT05fVVJHRU5UID0gMSA8PCAwLCAgLyoqPCBJZiB0aGUgdGltZXIgb3duZXIgaXMgc2V0LCB0aW1lciBleHBpcmF0aW9uIHdpbGwgYmUgZGVsaXZlcmVkIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG5vcm1hbCAobm9uLXVyZ2VudCkgbWVzc2FnZS4gKi8KK30gYmNtb3NfdGltZXJfcGFybV9mbGFnczsKKworLyoqIFRpbWVyIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lciBuYW1lICovCisgICAgYmNtb3NfbW9kdWxlX2lkIG93bmVyOyAgICAgICAgICAgICAgLyoqPCBUaW1lciBvd25lci4gSWYgc2V0LCB0aW1lciBleHBpcmF0aW9uIGlzIGRlbGl2ZXJlZCB0byB0aGUgbW9kdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIG1lc3NhZ2UgKi8KKyAgICBiY21vc19ib29sIHBlcmlvZGljOyAgICAgICAgICAgICAgICAvKio8IFRSVUU9cGVyaW9kaWMgKi8KKyAgICBGX2JjbW9zX3RpbWVyX2hhbmRsZXIgaGFuZGxlcjsgICAgICAvKio8IFRpbWVyIGhhbmRsZXIuIENhbGxlZCBpbiBjb250ZXh0IG9mIG93bmVyIG1vZHVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2V0IG9yIHRpbWVyIElTUiBpZiBvd25lcj09QkNNT1NfTU9EVUxFX0lEX05PTkUgKi8KKyAgICBsb25nIGRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlciAqLworICAgIGJjbW9zX3RpbWVyX3Bhcm1fZmxhZ3MgZmxhZ3M7ICAgICAgIC8qKjwgRmxhZ3MgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiB0aGUgdGltZXIgKi8KK30gYmNtb3NfdGltZXJfcGFybTsKKworI2lmbmRlZiBCQ01PU19USU1FU1RBTVBfSU5MSU5FCisKKy8qKiBHZXQgY3VycmVudCB0aW1lc3RhbXAKKyAqIFxyZXR1cm5zIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lc3RhbXAgKHVzKQorICovCit1aW50MzJfdCBiY21vc190aW1lc3RhbXAodm9pZCk7CisKKy8qKiBHZXQgY3VycmVudCA2NCBiaXQgdGltZXN0YW1wCisgKiBccmV0dXJucyB0aGUgY3VycmVudCBzeXN0ZW0gdGltZXN0YW1wICh1cykKKyAqIFxub3RlIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGFsbCA2NCBiaXQgY2FycnkgaW5mb3JtYXRpb24uCisgKiAgICAgICBIb3dldmVyLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlIHRpbWVzdGFtcCB3cmFwcyBhcm91bmQKKyAqICAgICAgIG5vdCBvZnRlbmVyIHRoYW4gZXZlcnkgNTAgZGF5cyAobXMgcmVzb2x1dGlvbikKKyAqLwordWludDY0X3QgYmNtb3NfdGltZXN0YW1wNjQodm9pZCk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTU9TX1RJTUVTVEFNUF9JTkxJTkUgKi8KKworLyoqIENyZWF0ZSB0aW1lcgorICoKKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIHRpbWVyICAgdGltZXIgY29udHJvbCBibG9jaworICogXHBhcmFtW2luXSAgICAgICAgICAgcGFybSAgICB0aW1lciBwYXJhbWV0ZXJzCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfdGltZXJfY3JlYXRlKGJjbW9zX3RpbWVyICp0aW1lciwgYmNtb3NfdGltZXJfcGFybSAqcGFybSk7CisKKy8qKiBEZXN0cm95IHRpbWVyCisgKiBUaGUgdGltZXIgaXMgc3RvcHBlZCBpZiBydW5uaW5nIGFuZCBkZXN0cm95ZWQKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgIHRpbWVyIGhhbmRsZQorICovCit2b2lkIGJjbW9zX3RpbWVyX2Rlc3Ryb3koYmNtb3NfdGltZXIgKnRpbWVyKTsKKworLyoqIFNldCB0aW1lciBoYW5kbGVyCisgKgorICogXHBhcmFtW2luLG91dF0gICAgICAgdGltZXIgICB0aW1lciBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgICAgICAgICBoYW5kbGVyIHRpbWVyIGhhbmRsZXIKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGRhdGEgICAgZGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc190aW1lcl9oYW5kbGVyX3NldChiY21vc190aW1lciAqdGltZXIsIEZfYmNtb3NfdGltZXJfaGFuZGxlciBoYW5kbGVyLCBsb25nIGRhdGEpOworCisvKiogKFJlKXN0YXJ0IHRpbWVyCisgKiBTdG9wIHRpbWVyIGlmIHJ1bm5pbmcgYW5kIHN0YXJ0IGl0LgorICoKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgIHRpbWVyIGhhbmRsZQorICogXHBhcmFtW2luXSAgIGRlbGF5ICAgZGVsYXkgaW4gdXMKKyAqLwordm9pZCBiY21vc190aW1lcl9zdGFydChiY21vc190aW1lciAqdGltZXIsIHVpbnQzMl90IGRlbGF5KTsKKworLyoqIFN0b3AgdGltZXIgaWYgcnVubmluZworICoKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgIHRpbWVyIGhhbmRsZQorICovCit2b2lkIGJjbW9zX3RpbWVyX3N0b3AoYmNtb3NfdGltZXIgKnRpbWVyKTsKKworLyoqIFN1c3BlbmQgY3VycmVudCB0YXNrIGZvciBhIHRpbWUKKyAqCisgKiBccGFyYW1baW5dICAgdXMgICAgICBzbGVlcCB0aW1lICh1cykKKyAqLworI2lmbmRlZiBCQ01PU19VU0xFRVBfSU5MSU5FCit2b2lkIGJjbW9zX3VzbGVlcCh1aW50MzJfdCB1cyk7CisjZW5kaWYgLyogI2lmbmRlZiBCQ01PU19VU0xFRVBfSU5MSU5FICovCisKKy8qKiBAfSBzeXN0ZW1fdGltZXIgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9mYXN0bG9jaworICogQHsKKyAqLworCisvKiogRmFzdCBsb2NrIGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX2Zhc3Rsb2NrIGJjbW9zX2Zhc3Rsb2NrOworCisjaWZuZGVmIEJDTU9TX0ZBU1RMT0NLX0lOTElORQorCisvKiogSW5pdCBmYXN0bG9jaworICogXHBhcmFtW2luLCBvdXRdICAgICAgbG9jayAgICBmYXN0IGxvY2sgY29udHJvbCBibG9jaworICogXHBhcmFtW2luXSAgICAgICAgICAgZmxhZ3MgICBmbGFncyAtIFRCRC4gRS5nLiwgc2luZ2xlIGNvcmUgLyBTTVAKKyAqLwordm9pZCBiY21vc19mYXN0bG9ja19pbml0KGJjbW9zX2Zhc3Rsb2NrICpsb2NrLCB1aW50MzJfdCBmbGFncyk7CisKKy8qKiBUYWtlIGZhc3QgbG9jaworICogXHBhcmFtW2luXSAgIGxvY2sgICAgZmFzdCBsb2NrCisgKiBccmV0dXJucyB2YWx1ZSBvZiBpbnRlcnJ1cHQgZmxhZ3MgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiB1bmxvY2sKKyAqLworbG9uZyBiY21vc19mYXN0bG9ja19sb2NrKGJjbW9zX2Zhc3Rsb2NrICpsb2NrKTsKKworLyoqIFJlbGVhc2UgZmFzdCBsb2NrCisgKiBccGFyYW1baW5dICAgbG9jayAgICBmYXN0IGxvY2sKKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgIGludGVycnVwdCBmbGFncworICovCit2b2lkIGJjbW9zX2Zhc3Rsb2NrX3VubG9jayhiY21vc19mYXN0bG9jayAqbG9jaywgbG9uZyBmbGFncyk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTU9TX0ZBU1RMT0NLX0lOTElORSAqLworCisvKiogQH0gc3lzdGVtX2Zhc3Rsb2NrICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fbXV0ZXgKKyAqIEB7CisgKi8KKworLyoqIE11dGV4IGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX211dGV4IGJjbW9zX211dGV4OworCisjaWZkZWYgQkNNT1NfTVVURVhfSU5MSU5FCisjZGVmaW5lIEJDTU9TX01VVEVYX0NSRUFURV9ERVNUUk9ZX0lOTElORQorI2RlZmluZSBCQ01PU19NVVRFWF9MT0NLX1VOTE9DS19JTkxJTkUKKyNlbmRpZgorCisjaWZuZGVmIEJDTU9TX01VVEVYX0NSRUFURV9ERVNUUk9ZX0lOTElORQorCisvKiogQ3JlYXRlIHJlY3Vyc2l2ZSBtdXRleAorICogXHBhcmFtW2luLCBvdXRdICAgICAgbXV0ZXggICBNdXRleCBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgICAgICAgICBmbGFncyAgIGZsYWdzIC0gVEJELiBFLmcuLCBzaW5nbGUgY29yZSAvIFNNUAorICogXHBhcmFtW2luXSAgICAgICAgICAgbmFtZSBuYW1lIG9mIHRoZSBtdXRleCAoaWYgT1Mgc3VwcG9ydHMpLCBOVUxMIG1lYW5zIGl0IHdpbGwgYmUgYXV0by1nZW5lcmF0ZWQKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19tdXRleF9jcmVhdGUoYmNtb3NfbXV0ZXggKm11dGV4LCB1aW50MzJfdCBmbGFncywgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKiBEZXN0cm95IG11dGV4CisgKiBccGFyYW1baW5dICAgbXV0ZXggICBNdXRleCBjb250cm9sIGJsb2NrCisgKi8KK3ZvaWQgYmNtb3NfbXV0ZXhfZGVzdHJveShiY21vc19tdXRleCAqbXV0ZXgpOworCisjZW5kaWYgLyogQkNNT1NfTVVURVhfQ1JFQVRFX0RFU1RST1lfSU5MSU5FICovCisKKworI2lmbmRlZiBCQ01PU19NVVRFWF9MT0NLX1VOTE9DS19JTkxJTkUKKworLyoqIExvY2sgbXV0ZXgKKyAqIFxwYXJhbVtpbl0gICBtdXRleCAgIE11dGV4IGNvbnRyb2wgYmxvY2sKKyAqLwordm9pZCBiY21vc19tdXRleF9sb2NrKGJjbW9zX211dGV4ICptdXRleCk7CisKKy8qKiBSZWxlYXNlIG11dGV4CisgKiBccGFyYW1baW5dICAgbXV0ZXggICBNdXRleCBjb250cm9sIGJsb2NrCisgKi8KK3ZvaWQgYmNtb3NfbXV0ZXhfdW5sb2NrKGJjbW9zX211dGV4ICptdXRleCk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTU9TX01VVEVYX0xPQ0tfVU5MT0NLX0lOTElORSAqLworCisvKiogQH0gc3lzdGVtX211dGV4ICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fc2VtCisgKiBAeworICovCisKKy8qKiBTZW1hcGhvcmUgY29udHJvbCBibG9jayAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3Nfc2VtIGJjbW9zX3NlbTsKKworI2lmZGVmIEJDTU9TX1NFTV9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfU0VNX0NSRUFURV9ERVNUUk9ZX0lOTElORQorI2RlZmluZSBCQ01PU19TRU1fV0FJVF9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfU0VNX1BPU1RfSU5MSU5FCisjZW5kaWYKKworI2lmbmRlZiBCQ01PU19TRU1fQ1JFQVRFX0RFU1RST1lfSU5MSU5FCisKKy8qKiBDcmVhdGUgc2VtYXBob3JlCisgKiBccGFyYW1baW4sIG91dF0gICAgc2VtICAgc2VtYXBob3JlIGNvbnRyb2wgYmxvY2sKKyAqIFxwYXJhbVtpbl0gICAgICAgICBjb3VudCBpbml0aWFsIHZhbHVlIG9mIHNlbWFwaG9yZSBjb3VudGVyCisgKiBccGFyYW1baW5dICAgICAgICAgZmxhZ3MgZmxhZ3MgLSBUQkQuIEUuZy4sIHNpbmdsZSBjb3JlIC8gU01QCisgKiBccGFyYW1baW5dICAgICAgICAgbmFtZSBuYW1lIG9mIHRoZSBzZW1hcGhvcmUgKGlmIE9TIHN1cHBvcnRzKSwgTlVMTCBtZWFucyBpdCB3aWxsIGJlIGF1dG8tZ2VuZXJhdGVkCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3Nfc2VtX2NyZWF0ZShiY21vc19zZW0gKnNlbSwgdWludDMyX3QgY291bnQsIHVpbnQzMl90IGZsYWdzLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqIERlc3Ryb3kgc2VtYXBob3JlCisgKiBccGFyYW1baW5dICAgc2VtICAgc2VtYXBob3JlIGNvbnRyb2wgYmxvY2sKKyAqLwordm9pZCBiY21vc19zZW1fZGVzdHJveShiY21vc19zZW0gKnNlbSk7CisKKyNlbmRpZiAvKiBCQ01PU19TRU1fQ1JFQVRFX0RFU1RST1lfSU5MSU5FICovCisKKyNpZm5kZWYgQkNNT1NfU0VNX1dBSVRfSU5MSU5FCisKKy8qKiBEZWNyZW1lbnQgc2VtYXBob3JlIGNvdW50ZXIuIFdhaXQgaWYgdGhlIGNvdW50ZXIgaXMgMAorICoKKyAqIFxwYXJhbVtpbl0gICBzZW0gICAgIHNlbWFwaG9yZSBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgdGltZW91dCB0aW1lb3V0LiBjYW4gYmUgMCwgdGltZSBpbiB1cyBvciBccmVmIEJDTU9TX1dBSVRfRk9SRVZFUgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3NlbV93YWl0KGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCB0aW1lb3V0KTsKKworI2VuZGlmIC8qICNpZm5kZWYgQkNNT1NfU0VNX1dBSVRfSU5MSU5FICovCisKKyNpZm5kZWYgQkNNT1NfU0VNX1BPU1RfSU5MSU5FCisvKiogSW5jcmVtZW50IHNlbWFwaG9yZSBjb3VudGVyCisgKiBccGFyYW1baW5dICAgc2VtICAgc2VtYXBob3JlIGNvbnRyb2wgYmxvY2sKKyAqLwordm9pZCBiY21vc19zZW1fcG9zdChiY21vc19zZW0gKnNlbSk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTU9TX1NFTV9QT1NUX0lOTElORSAqLworCisvKiogQH0gc3lzdGVtX3NlbSAqLworCisvKgorICogcHJpbnQgc3VwcG9ydAorICovCisKKy8qKiBQcmludCBjbG9uaW5nL3JlZGlyZWN0aW9uIG1vZGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9TX1BSSU5UX1JFRElSRUNUX01PREVfTk9ORSwgICAgIC8qKjwgTm8gY2xvbmluZywgcmVkaXJlY3Rpb24gKi8KKyAgICBCQ01PU19QUklOVF9SRURJUkVDVF9NT0RFX1JFRElSRUNULCAvKio8IFJlZGlyZWN0IGNvbnNvbGUgb3V0cHV0LiBEbyBub3QgcHJpbnQgb24gdGhlIHNlcmlhbCBjb25zb2xlICovCisgICAgQkNNT1NfUFJJTlRfUkVESVJFQ1RfTU9ERV9DTE9ORSAgICAgLyoqPCBDbG9uZSBjb25zb2xlIG91dHB1dCB0byByZWRpcmVjdGlvbiBjYWxsYmFjayAqLworfSBiY21vc19wcmludF9yZWRpcmVjdF9tb2RlOworCisvKiogUHJpbnQgcmUtZGlyZWN0aW9uL2Nsb25pbmcgY2FsbGJhY2sgKi8KK3R5cGVkZWYgaW50ICgqYmNtb3NfcHJpbnRfcmVkaXJlY3RfY2IpKHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CisKKy8qKiBTZXQgdXAgcHJpbnQgcmVkaXJlY3Rpb24vY2xvbmluZworICogXHBhcmFtW2luXSAgIG1vZGUgICAgcmVkaXJlY3Rpb24vY2xvbmluZyBtb2RlCisgKiBccGFyYW1baW5dICAgY2IgICAgICByZWRpcmVjdGlvbiBjYWxsYmFjaworICogXHBhcmFtW2luXSAgIGRhdGEgICAgb3BhcXVlIGRhdGEgdG8gYmUgcGFzc2VkIHRvIGNiCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3ByaW50X3JlZGlyZWN0KGJjbW9zX3ByaW50X3JlZGlyZWN0X21vZGUgbW9kZSwgYmNtb3NfcHJpbnRfcmVkaXJlY3RfY2IgY2IsIHZvaWQgKmRhdGEpOworCisvKiBQcmludCBvbiB0aGUgY29uc29sZSB3aXRoIG9wdGlvbmFsIGNsb25pbmcgLyByZWRpcmVjdGlvbgorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgcHJpbnRmIGZvcm1hdAorICogXHBhcmFtW2luXSAgIGFwICAgICAgYXJndW1lbnQgbGlzdAorICogXHJldHVybnMgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZCA+PSAwIG9yIGVycm9yIDwgMAorICovCitpbnQgYmNtb3NfdnByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworCisvKiBQcmludCBvbiB0aGUgY29uc29sZSB3aXRoIG9wdGlvbmFsIGNsb25pbmcgLyByZWRpcmVjdGlvbgorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgcHJpbnRmIGZvcm1hdAorICogXHJldHVybnMgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZCA+PSAwIG9yIGVycm9yIDwgMAorICovCitpbnQgYmNtb3NfcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX3RyYWNlCisgKiBAeworICovCisKKy8qKiBUcmFjZSBsZXZlbCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT1NfVFJBQ0VfTEVWRUxfTk9ORSwgICAgIC8qKjwgTm8gdHJhY2Ugb3V0cHV0ICovCisgICAgQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICAgIC8qKjwgVHJhY2UgZXJyb3JzICovCisgICAgQkNNT1NfVFJBQ0VfTEVWRUxfV0FSTklORywgIC8qKjwgVHJhY2UgZXJyb3JzICsgd2FybmluZ3MgKi8KKyAgICBCQ01PU19UUkFDRV9MRVZFTF9JTkZPLCAgICAgLyoqPCBUcmFjZSBlcnJvcnMgKyB3YXJuaW5ncyArIGluZm8gKi8KKyAgICBCQ01PU19UUkFDRV9MRVZFTF9WRVJCT1NFLCAgLyoqPCBUcmFjZSBlcnJvcnMgKyB3YXJuaW5ncyArIGluZm8gKyB2ZXJib3NlIGluZm8gKi8KKyAgICBCQ01PU19UUkFDRV9MRVZFTF9ERUJVRywgICAgLyoqPCBUcmFjZSBldmVyeXRoaW5nICovCit9IGJjbW9zX3RyYWNlX2xldmVsOworCitleHRlcm4gYmNtb3NfdHJhY2VfbGV2ZWwgYmNtb3Nfc3lzX3RyYWNlX2xldmVsOworCisjaWZkZWYgQkNNT1NfVFJBQ0VfUFJJTlRGCisjZGVmaW5lIEJDTU9TX1RSQUNFX0lOTElORQorI2VuZGlmCisKKyNpZm5kZWYgQkNNT1NfVFJBQ0VfSU5MSU5FCisvKiogUHJpbnQgdHJhY2UKKyAqCisgKiBccGFyYW1baW5dICAgbGV2ZWwgICAgICAgICAgIFJlY29yZCB0cmFjZSBhdCBsZXZlbAorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgICAgICAgICBwcmludGYtbGlrZSBmb3JtYXQKKyAqLwordm9pZCBiY21vc190cmFjZShiY21vc190cmFjZV9sZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworI2VuZGlmCisKKworLyogUHJpbnQgdHJhY2UgKi8KKyNpZmRlZiBCQ01PU19UUkFDRV9QUklOVEYKKyNkZWZpbmUgYmNtb3NfdHJhY2UobGV2ZWwsIGZtdCwgYXJncy4uLikgIGJjbW9zX3ByaW50ZihmbXQsICMjIGFyZ3MpCisjZW5kaWYKKworLyoqIFNldCBjdXJyZW50IHRyYWNlIGxldmVsCisgKiBccGFyYW1baW5dICAgbGV2ZWwgICAgICAgICAgIE5ldyB0cmFjZSBsZXZlbAorICogXHJldHVybnMgb2xkIHRyYWNlIGxldmVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfdHJhY2VfbGV2ZWwgYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KGJjbW9zX3RyYWNlX2xldmVsIGxldmVsKQoreworICAgIGJjbW9zX3RyYWNlX2xldmVsIG9sZF9sZXZlbCA9IGJjbW9zX3N5c190cmFjZV9sZXZlbDsKKyAgICBiY21vc19zeXNfdHJhY2VfbGV2ZWwgPSBsZXZlbDsKKyAgICByZXR1cm4gb2xkX2xldmVsOworfQorCisvKiogR2V0IGN1cnJlbnQgdHJhY2UgbGV2ZWwKKyAqIFxyZXR1cm5zIHRyYWNlIGxldmVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfdHJhY2VfbGV2ZWwgYmNtb3NfdHJhY2VfbGV2ZWxfZ2V0KHZvaWQpCit7CisgICAgcmV0dXJuIGJjbW9zX3N5c190cmFjZV9sZXZlbDsKK30KKworLyoqIFByaW50IHRyYWNlIGNvbmRpdGlvbmFsbHksIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCB0cmFjZSBsZXZlbAorICogXHBhcmFtW2luXSAgIGxldmVsICAgUmVjb3JkIHRyYWNlIGF0IGxldmVsCisgKiBccGFyYW1baW5dICAgZm10ICAgICBwcmludGYtbGlrZSBmb3JtYXQKKyAqIFxwYXJhbVtpbl0gICBhcmdzICAgIHByaW50Zi1saWtlIGFyZ3VtZW50cworICovCisjZGVmaW5lIEJDTU9TX1RSQUNFKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKKyAgICBkbyBcCisgICAgeyBcCisgICAgICAgIGlmIChsZXZlbCA8PSBiY21vc19zeXNfdHJhY2VfbGV2ZWwpIFwKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKGxldmVsLCAiJXMjJWQ+ICIgZm10LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjIyBhcmdzKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qKiBQcmludCBlcnJvciB0cmFjZSBjb25kaXRpb25hbGx5LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwKKyAqIFxwYXJhbVtpbl0gICBmbXQgICAgIHByaW50Zi1saWtlIGZvcm1hdAorICogXHBhcmFtW2luXSAgIGFyZ3MgICAgcHJpbnRmLWxpa2UgYXJndW1lbnRzCisgKi8KKworZXh0ZXJuIGZfYmNtb2x0X3N3X2Vycm9yX2hhbmRsZXIgc3dfZXJyb3JfaGFuZGxlcjsKKworI2RlZmluZSBCQ01PU19UUkFDRV9FUlIoZm10LCBhcmdzLi4uKSBcCisgICAgZG8gXAorICAgIHsgXAorICAgICAgICBCQ01PU19UUkFDRShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVSUjogIiBmbXQsICMjIGFyZ3MpOyBcCisgICAgICAgIGlmIChzd19lcnJvcl9oYW5kbGVyICE9IE5VTEwpIFwKKyAgICAgICAgeyBcCisgICAgICAgICAgICBzd19lcnJvcl9oYW5kbGVyKDB4ZmYsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIF9iY21vc19iYWNrdHJhY2UoKTsgXAorICAgfSB3aGlsZSAoMCkKKworCisvKiogUHJpbnQgaW5mbyB0cmFjZSBjb25kaXRpb25hbGx5LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwKKyAqIFxwYXJhbVtpbl0gICBmbXQgICAgIHByaW50Zi1saWtlIGZvcm1hdAorICogXHBhcmFtW2luXSAgIGFyZ3MgICAgcHJpbnRmLWxpa2UgYXJndW1lbnRzCisgKi8KKyNkZWZpbmUgQkNNT1NfVFJBQ0VfSU5GTyhmbXQsIGFyZ3MuLi4pICAgICAgICAgIFwKKyAgICBCQ01PU19UUkFDRShCQ01PU19UUkFDRV9MRVZFTF9JTkZPLCAiSU5GOiAiIGZtdCwgIyMgYXJncykKKworLyoqIFByaW50IHZlcmJvc2UgaW5mbyB0cmFjZSBjb25kaXRpb25hbGx5LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwKKyAqIFxwYXJhbVtpbl0gICBmbXQgICAgIHByaW50Zi1saWtlIGZvcm1hdAorICogXHBhcmFtW2luXSAgIGFyZ3MgICAgcHJpbnRmLWxpa2UgYXJndW1lbnRzCisgKi8KKyNkZWZpbmUgQkNNT1NfVFJBQ0VfVkVSQk9TRShmbXQsIGFyZ3MuLi4pICAgICAgXAorICAgIEJDTU9TX1RSQUNFKEJDTU9TX1RSQUNFX0xFVkVMX1ZFUkJPU0UsICJWUkI6ICIgZm10LCAjIyBhcmdzKQorCisvKiogUHJpbnQgZGVidWcgdHJhY2UgY29uZGl0aW9uYWxseSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsCisgKiBccGFyYW1baW5dICAgZm10ICAgICBwcmludGYtbGlrZSBmb3JtYXQKKyAqIFxwYXJhbVtpbl0gICBhcmdzICAgIHByaW50Zi1saWtlIGFyZ3VtZW50cworICovCisjZGVmaW5lIEJDTU9TX1RSQUNFX0RFQlVHKGZtdCwgYXJncy4uLikgICAgICAgIFwKKyAgICBCQ01PU19UUkFDRShCQ01PU19UUkFDRV9MRVZFTF9ERUJVRywgIkRCRzogIiBmbXQsICMjIGFyZ3MpCisKKy8qKiBQcmludCB0cmFjZSBjb25kaXRpb25hbGx5IGJhc2VkIG9uIHJldHVybiBjb2RlIGFuZCByZXR1cm4KKyAqIFxwYXJhbVtpbl0gICByYyAgICAgIHJldHVybiBjb2RlCisgKiBccGFyYW1baW5dICAgZm10ICAgICBwcmludGYtbGlrZSBmb3JtYXQKKyAqIFxwYXJhbVtpbl0gICBhcmdzICAgIHByaW50Zi1saWtlIGFyZ3VtZW50cworICogXHJldHVybnMgcmMKKyAqLworI2RlZmluZSBCQ01PU19UUkFDRV9SRVRVUk4ocmMsIGZtdCwgYXJncy4uLikgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAocmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJzdGF0dXM6JXMgOiIgZm10LCBiY21vc19zdHJlcnJvcihyYyksICMjIGFyZ3MpOyBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBCQ01PU19UUkFDRV9JTkZPKCJzdWNjZXNzOiAiIGZtdCwgIyMgYXJncyk7IFwKKyAgICAgICAgcmV0dXJuIHJjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihjb25kLHJjLGZtdCxhcmdzLi4uKSAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAge1wKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUiggI2NvbmQgIjogc3RhdHVzOiVzIDoiIGZtdCwgYmNtb3Nfc3RyZXJyb3IocmMpLCAjIyBhcmdzKTsgXAorICAgICAgICAgICAgcmV0dXJuIHJjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfVwKKyAgICB9IHdoaWxlICgwKQorI2RlZmluZSBCQ01PU19DSEVDS19SRVRVUk4oY29uZCxlcnIscmV0KSAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAge1wKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUiggI2NvbmQgIjogc3RhdHVzOiVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsgXAorICAgICAgICAgICAgcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH1cCisgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKGNvbmQsZXJyKSBCQ01PU19DSEVDS19SRVRVUk4oY29uZCxlcnIsZXJyKQorI2RlZmluZSBCQ01PU19SRVRVUk5fT05fRVJST1IoZXJyKSBCQ01PU19DSEVDS19SRVRVUk4oQkNNX0VSUl9PSyAhPSBlcnIsIGVyciwgLyp0aGlzIHNwYWNlIGludGVudGlvbmFsbHkgbGVmdCBibGFuayovKQorI2RlZmluZSBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKSBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycikKKworLyoqIEB9IHN5c3RlbV90cmFjZSAqLworCisvKgorICogTG93IGxldmVsIHNlcnZpY2VzCisgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9idWYKKyAqIEB7CisgKi8KKworLyoqIFRyYW5zcG9ydC9uZXR3b3JrIGJ1ZmZlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfYnVmIGJjbW9zX2J1ZjsKKworLyoqIEB9IHN5c3RlbV9idWYgKi8KKworLyoqIFJvdW5kIGEgbnVtYmVyIHVwIHRvIHRoZSBzcGVjaWZpZWQgcG93ZXIgb2YgMiAqLworI2RlZmluZSBCQ01PU19ST1VORF9VUChuLCBtKSAoKChuKSArIChtKSAtIDEpICYgfigobSkgLSAxKSkKKworLyoqIFJvdW5kIGEgbnVtYmVyIHVwIHRvIHRoZSBuZWFyZXN0IHdvcmQgbXVsdGlwbGUgKi8KKyNkZWZpbmUgQkNNT1NfUk9VTkRfVE9fV09SRChuKSBCQ01PU19ST1VORF9VUChuLCBzaXplb2Yoc2l6ZV90KSkKKworLyogQkNNT1NfRElWSURFX1JPVU5EX1VQKGludGVnZXJfZGl2aWRlbmQgLyBpbnRlZ2VyX2Rpdmlzb3IpID09IChpbnRlZ2VyX2RpdmlkZW5kICsgaW50ZWdlcl9kaXZpc29yIC0gMSkgLyBpbnRlZ2VyX2Rpdmlzb3IgKi8KKyNkZWZpbmUgQkNNT1NfRElWSURFX1JPVU5EX1VQKG4sIG0pICgoKG4pICsgKG0pIC0gMSkgLyAobSkpCisKKyNlbmRpZiAvKiBCQ01PU19TWVNURU1fQ09NTU9OX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2NvbW1vbjIuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfY29tbW9uMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMTdhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2NvbW1vbjIuaApAQCAtMCwwICsxLDY3NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PU19DT01NT04yX0hfCisjZGVmaW5lIEJDTU9TX0NPTU1PTjJfSF8KKworI2lmbmRlZiBCQ01PU19TWVNURU1fSF8KKyNlcnJvciBQbGVhc2UgZG8gbm90IGluY2x1ZGUgYmNtb3NfY29tbW9uMi5oIGRpcmVjdGx5LiBJbmNsdWRlIGJjbW9zX3N5c3RlbS5oCisjZW5kaWYKKworI2luY2x1ZGUgImJjbW9zX2VuZGlhbi5oIgorCisvKiBcYWRkdG9ncm91cCBzeXN0ZW0KKyAqIEB7CisgKi8KKworI2RlZmluZSBCQ01PU19NQVhfTkFNRV9MRU5HVEggICA0OAorCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX3Rhc2sKKyAqIEB7CisgKi8KKworLyoqIFRhc2sgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX3Rhc2sKK3sKKyAgICAvKiBPUyBpbmRlcGVuZGVudCBmaWVsZHMgKi8KKyAgICBiY21vc190YXNrX3Bhcm0gcGFybTsgICAgICAgICAgICAgICAvKio8IFRhc2sgY3JlYXRpb24gcGFyYW1ldGVycyAqLworICAgIGJjbW9zX21vZHVsZSAqbW9kdWxlc1tCQ01PU19NQVhfTU9EVUxFU19QRVJfVEFTS107CisgICAgdWludDMyX3QgYWN0aXZlX21vZHVsZXM7ICAgICAgICAgICAgLyoqPCBCaXRtYXNrIG9mIG1vZHVsZXMgZm9yIHdoaWNoIGV2ZW50cyBhcmUgcGVuZGluZyAqLworICAgIGJjbW9zX3NlbSBhY3RpdmVfc2VtOyAgICAgICAgICAgICAgIC8qKjwgU2VtYXBob3JlIHVzZWQgdG8gd2FpdCBmb3IgbW9kdWxlIGFjdGl2aXR5ICovCisgICAgYmNtb3NfZmFzdGxvY2sgYWN0aXZlX2xvY2s7ICAgICAgICAgLyoqPCBMb2NrIHByb3RlY3RpbmcgYWN0aXZlX21vZHVsZXMgKi8KKyAgICBiY21vc19tb2R1bGVfaWQgY3VycmVudF9tb2R1bGU7ICAgICAvKio8IEN1cnJlbnQgbW9kdWxlICovCisgICAgYmNtb3NfYm9vbCBkZXN0cm95X3JlcXVlc3Q7ICAgICAgICAgLyoqPCBUYXNrIGRlc3Ryb3kgcmVxdWVzdCBwZW5kaW5nICovCisgICAgYmNtb3NfYm9vbCBkZXN0cm95ZWQ7ICAgICAgICAgICAgICAgLyoqPCBTZXQgYnkgdGFzayBoYW5kbGVyIGJlZm9yZSBpdCB0ZXJtaW5hdGVzICovCisgICAgU1RBSUxRX0VOVFJZKGJjbW9zX3Rhc2spIGxpc3Q7ICAgICAgLyoqPCBOZXh0IHRhc2sgcG9pbnRlciAqLworICAgIGNoYXIgbmFtZVtCQ01PU19NQVhfTkFNRV9MRU5HVEhdOyAgIC8qKjwgVGFzayBuYW1lICovCisgICAgYmNtb3Nfc3lzX3Rhc2sgc3lzX3Rhc2s7ICAgICAgICAgICAgLyoqPCBPUy1zcGVjaWZpYyB0YXNrIGV4dGVuc2lvbiAqLworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAgICAgICAgIC8qIG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBCQ01PU19UQVNLX01BR0lDICAgICAgICAgICAgICAgICgoJ3QnIDw8IDI0KSB8ICgnYScgPDwgMTYpIHwgKCdzJyA8PCA4KSB8ICdrJykKKyNkZWZpbmUgQkNNT1NfVEFTS19NQUdJQ19ERVNUUk9ZRUQgICAgICAoKCd0JyA8PCAyNCkgfCAoJ2EnIDw8IDE2KSB8ICgncycgPDwgOCkgfCAnficpCit9OworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX21lbQorICogQHsKKyAqLworCisjaWZuZGVmIEJDTU9TX0NBTExPQ19JTkxJTkUKKworLyoqIEFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSBtYWluIGhlYXAgYW5kIGNsZWFyIGl0CisgKiBcaW5ncm91cCBzeXN0ZW1faGVhcAorICogXHBhcmFtW2luXSAgIHNpemUKKyAqIFxyZXR1cm5zIG1lbW9yeSBibG9jayBwb2ludGVyIG9yIE5VTEwKKyAqLworc3RhdGljIGlubGluZSB2b2lkICpiY21vc19jYWxsb2ModWludDMyX3Qgc2l6ZSkKK3sKKyAgICB2b2lkICpwdHIgPSBiY21vc19hbGxvYyhzaXplKTsKKyAgICBpZiAocHRyKQorICAgICAgICBtZW1zZXQocHRyLCAwLCBzaXplKTsKKyAgICByZXR1cm4gcHRyOworfQorI2VuZGlmIC8qICNpZm5kZWYgQkNNT1NfQ0FMTE9DX0lOTElORSAqLworCisjaWZuZGVmIEJDTU9TX0RNQV9BTExPQ19GUkVFX0lOTElORQorCisvKiogQWxsb2NhdGUgRE1BLWFibGUgbWVtb3J5CisgKiBccGFyYW1baW5dICAgZGV2aWNlICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgIEJsb2NrIHNpemUgKGJ5dGVzKQorICogXHJldHVybnMgbWVtb3J5IGJsb2NrIHBvaW50ZXIgb3IgTlVMTAorICovCit2b2lkICpiY21vc19kbWFfYWxsb2ModWludDhfdCBkZXZpY2UsIHVpbnQzMl90IHNpemUpOworCisvKiogUmVsZWFzZSBETUEtYWJsZSBtZW1vcnkKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIHB0ciAgICAgQmxvY2sgcG9pbnRlcgorICovCit2b2lkIGJjbW9zX2RtYV9mcmVlKHVpbnQ4X3QgZGV2aWNlLCB2b2lkICpwdHIpOworCisjZW5kaWYgLyogI2lmbmRlZiBCQ01PU19ETUFfQUxMT0NfRlJFRV9JTkxJTkUgKi8KKworI2lmbmRlZiBCQ01PU19WSVJUX1RPX1BIWVNfSU5MSU5FCisKKy8qKiBDb252ZXJ0IHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCisgKgorICogXHBhcmFtW2luXSAgIHZhICAgICAgVmlydHVhbCBhZGRyZXNzCisgKiBccmV0dXJucyAtIHBoeXNpY2FsIGFkZHJlc3MgdmEgaXMgbWFwcGVkIHRvCisgKi8KK3Vuc2lnbmVkIGxvbmcgYmNtb3NfdmlydF90b19waHlzKHZvaWQgKnZhKTsKKworI2VuZGlmIC8qICNpZm5kZWYgQkNNT1NfVklSVF9UT19QSFlTX0lOTElORSAqLworCisvKiogQH0gKi8KKworLyoqIFxhZGR0b2dyb3VwIGJsa19wb29sCisgKiBAeworICovCisKKy8qIE1lbW9yeSBibG9jayBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX21lbWJsayBiY21vc19tZW1ibGs7CisKKy8qIE1lbW9yeSBibG9jayBsaXN0ICovCit0eXBlZGVmIFNUQUlMUV9IRUFEKCwgYmNtb3NfbWVtYmxrKSBiY21vc19tZW1ibGtfbGlzdDsKKworLyogQmxvY2sgbWVtb3J5IHBvb2wgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX2Jsa19wb29sCit7CisgICAgYmNtb3NfZmFzdGxvY2sgbG9jazsgICAgICAgIC8qKjwgUG9vbCBwcm90ZWN0aW9uIGxvY2sgKi8KKyAgICBiY21vc19tZW1ibGtfbGlzdCBmcmVlX2xpc3Q7LyoqPCBGcmVlIGJsb2NrIGxpc3QgKi8KKyAgICBiY21vc19ibGtfcG9vbF9wYXJtIHBhcm07ICAgLyoqPCBQb29sIHBhcmFtZXRlcnMgKi8KKyAgICBiY21vc19ibGtfcG9vbF9zdGF0IHN0YXQ7ICAgLyoqPCBQb29sIHN0YXRpc3RpY3MgKi8KKyAgICB2b2lkICpzdGFydDsgICAgICAgICAgICAgICAgLyoqPCBQb29sIHN0YXJ0IHBvaW50ZXIgKi8KKyAgICBjaGFyIG5hbWVbQkNNT1NfTUFYX05BTUVfTEVOR1RIXTsgICAvKio8IFBvb2wgbmFtZSAqLworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAvKio8IG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBCQ01PU19CTEtfUE9PTF9WQUxJRCAgICAgICAgICAgICgoJ2InPDwyNCkgfCAoJ2wnIDw8IDE2KSB8ICgncCcgPDwgOCkgfCAnbycpCisjZGVmaW5lIEJDTU9TX0JMS19QT09MX0RFTEVURUQgICAgICAgICAgKCgnYic8PDI0KSB8ICgnbCcgPDwgMTYpIHwgKCdwJyA8PCA4KSB8ICd+JykKKyAgICBTVEFJTFFfRU5UUlkoYmNtb3NfYmxrX3Bvb2wpIGxpc3Q7IC8qIFBvb2wgbGlzdCAqLworfTsKKworLyogVG90YWwgbWVtb3J5IG9jY3VwaWVkIGJ5IGFsbCBibG9jayBwb29scyAqLworZXh0ZXJuIHVpbnQzMl90IGJjbW9zX3RvdGFsX2Jsa19wb29sX3NpemU7CisKKy8qKiBAfSBibGtfcG9vbCAqLworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX21zZworICogQHsKKyAqLworCisvKiogUmVsZWFzZSBtZXNzYWdlCisgKiBccGFyYW1baW5dICAgbXNnICAgICAgICAgICAgIE1lc3NhZ2UgaGFuZGxlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19tc2dfZnJlZShiY21vc19tc2cgKm1zZykKK3sKKyAgICBpZiAobXNnLT5yZWxlYXNlKQorICAgIHsKKyAgICAgICAgbXNnLT5yZWxlYXNlKG1zZyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUobXNnKTsKKyAgICB9Cit9CisKK3R5cGVkZWYgU1RBSUxRX0hFQUQoLCBiY21vc19tc2cpIGJjbW9zX21zZ19saXN0OworCisvKiogU2ltcGxlIE1lc3NhZ2UgcXVldWUgY29udHJvbCBibG9jay4KKyAqIFNpbXBsZSBtZXNzYWdlIHF1ZXVlIGRvZXNuJ3Qgc3VwcG9ydCB3YWl0aW5nIG9uLgorICogSXQgaXMgdXNlZCBpbiBtb2R1bGUgcXVldWUgbWVjaGFuaXNtcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfbXNnX3F1ZXVlX253Cit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gcGFybTsgIC8qKjwgUXVldWUgcGFyYW1ldGVycyAqLworICAgIGJjbW9zX21zZ19xdWV1ZV9zdGF0IHN0YXQ7ICAvKio8IFF1ZXVlIHN0YXRpc3RpY3MgKi8KKyAgICBiY21vc19mYXN0bG9jayBsb2NrOyAgICAgICAgLyoqPCBRdWV1ZSBwcm90ZWN0aW9uIGxvY2sgKi8KKyAgICBiY21vc19tc2dfbGlzdCBtc2dsOyAgICAgICAgLyoqPCBNZXNzYWdlIGxpc3QgKi8KKyAgICBiY21vc19tc2dfbGlzdCBtc2dsX3VyZzsgICAgLyoqPCBVcmdlbnQgbWVzc2FnZSBsaXN0ICovCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgIC8qKjwgUXVldWUgZmxhZ3MgKi8KK30gYmNtb3NfbXNnX3F1ZXVlX253OworCisvKiogTWVzc2FnZSBxdWV1ZSBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfbXNnX3F1ZXVlCit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX253IHE7ICAgICAgIC8qKjwgUXVldWUgY29udHJvbCBibG9jayAqLworICAgIGJjbW9zX3NlbSBtOyAgICAgICAgICAgICAgICAvKio8IE11dGV4IHRvIHN1c3BlbmQgd2FpdGluZyB0YXNrIG9uICovCisgICAgYmNtb3NfYm9vbCBpc193YWl0aW5nOyAgICAgIC8qKjwgVFJVRSBpZiB0YXNrIGlzIHdhaXRpbmcgb24gcXVldWUgKi8KKyAgICBjaGFyIG5hbWVbQkNNT1NfTUFYX05BTUVfTEVOR1RIXTsgICAvKio8IFF1ZXVlIG5hbWUgKi8KKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfUkVNT1RFX1NVUFBPUlQKKyAgICBsb25nIGVwOyAgICAgICAgICAgICAgICAgICAgLyoqPCBFbmRwb2ludCBoYW5kbGUgKGUuZy4sIHNvY2tldCkgKi8KKyAgICB2b2lkICplcF9leHRyYV9kYXRhOyAgICAgICAgLyoqPCBFeHRyYSBkYXRhIC0gZGVwZW5kaW5nIG9uIGVwIHR5cGUgKi8KKyAgICB1aW50MzJfdCBlcF9leHRyYV9kYXRhX3NpemU7LyoqPCBFeHRyYSBkYXRhIHNpemUgKi8KKyAgICB1aW50OF90ICpzZW5kX2J1ZjsgICAgICAgICAgLyoqPCBTZW5kIGJ1ZmZlciAqLworICAgIHVpbnQ4X3QgKnJlY3ZfYnVmOyAgICAgICAgICAvKio8IFJlY2VpdmUgYnVmZmVyICovCisgICAgYmNtb3NfbXV0ZXggc2VuZF9sb2NrOyAgICAgIC8qKjwgTXV0ZXggdGhhdCBwcm90ZWN0cyBzZW5kX2J1ZiAqLworI2VuZGlmCisgICAgdWludDMyX3QgbWFnaWM7ICAgICAgICAgICAgIC8qKjwgbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEJDTU9TX01TR19RVUVVRV9WQUxJRCAgICAgICAgICAgKCgnbSc8PDI0KSB8ICgncScgPDwgMTYpIHwgKCd1JyA8PCA4KSB8ICdlJykKKyNkZWZpbmUgQkNNT1NfTVNHX1FVRVVFX0RFTEVURUQgICAgICAgICAoKCdtJzw8MjQpIHwgKCdxJyA8PCAxNikgfCAoJ3UnIDw8IDgpIHwgJ34nKQorICAgIFNUQUlMUV9FTlRSWShiY21vc19tc2dfcXVldWUpIGxpc3Q7IC8qIFF1ZXVlIGxpc3QgKi8KK307CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGdyb3VwIGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY21vc19tc2dfcWdyb3VwCit7CisgICAgYmNtb3NfbXNnX3Fncm91cF9wYXJtIHBhcm07IC8qKjwgUXVldWUgZ3JvdXAgcGFyYW1ldGVycyAqLworICAgIGJjbW9zX21zZ19saXN0ICptc2dsOyAgICAgICAvKio8IEFycmF5IG9mIHBhcm0ubnF1ZXVlcyBtZXNzYWdlIGxpc3RzICovCisgICAgYmNtb3NfbXNnX3F1ZXVlX3N0YXQgc3RhdDsgIC8qKjwgUXVldWUgZ3JvdXAgc3RhdGlzdGljcyAqLworICAgIGJjbW9zX3NlbSBtOyAgICAgICAgICAgICAgICAvKio8IE11dGV4IHRvIHN1c3BlbmQgd2FpdGluZyB0YXNrIG9uICovCisgICAgYmNtb3NfZmFzdGxvY2sgbG9jazsgICAgICAgIC8qKjwgUXVldWUgZ3JvdXAgcHJvdGVjdGlvbiBsb2NrICovCisgICAgdWludDMyX3QgYWN0aXZlX21hc2s7ICAgICAgIC8qKjwgQml0bWFzayBvZiBxdWV1ZXMgY29udGFpbmluZyBtZXNzYWdlcyAqLworICAgIGJjbW9zX2Jvb2wgaXNfd2FpdGluZzsgICAgICAvKio8IFRSVUUgaWYgdGFzayBpcyB3YWl0aW5nIG9uIHF1ZXVlIGdyb3VwICovCisgICAgY2hhciBuYW1lW0JDTU9TX01BWF9OQU1FX0xFTkdUSF07ICAgLyoqPCBRdWV1ZSBncm91cCBuYW1lICovCisgICAgdWludDMyX3QgbWFnaWM7ICAgICAgICAgICAgIC8qKjwgbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEJDTU9TX01TR19RR1JPVVBfVkFMSUQgICAgICAgICAgICgoJ20nPDwyNCkgfCAoJ3EnIDw8IDE2KSB8ICgnZycgPDwgOCkgfCAncicpCisjZGVmaW5lIEJDTU9TX01TR19RR1JPVVBfREVMRVRFRCAgICAgICAgICgoJ20nPDwyNCkgfCAoJ3EnIDw8IDE2KSB8ICgnZycgPDwgOCkgfCAnficpCisgICAgU1RBSUxRX0VOVFJZKGJjbW9zX21zZ19xZ3JvdXApIGxpc3Q7IC8qIFF1ZXVlIGdyb3VwIGxpc3QgKi8KK307CisKKy8qKiBNZXNzYWdlIHBvb2wgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX21zZ19wb29sCit7CisgICAgYmNtb3NfYmxrX3Bvb2wgYmxrX3Bvb2w7ICAgIC8qKjwgVW5kZXJseWluZyBibG9jayBtZW1vcnkgcG9vbCAqLworICAgIGJjbW9zX21zZ19wb29sX3Bhcm0gcGFybTsgICAvKio8IFBvb2wgcGFyYW1ldGVycyAqLworfTsKKworLyogVG90YWwgbWVtb3J5IG9jY3VwaWVkIGJ5IGFsbCBtZXNzYWdlIHBvb2xzICovCitleHRlcm4gdWludDMyX3QgYmNtb3NfdG90YWxfbXNnX3Bvb2xfc2l6ZTsKKworLyoqIEB9IHN5c3RlbV9tc2cgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV90aW1lciAqLworCisvKiBUaW1lciBwcmVjaXNpb24uIE11c3QgYmUgYSBtdWx0aXBsZSBvZiAyLgorICogVGltZWQgZXhwaXJhdGlvbiB0aW1lc3RhbXAgaXMgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiB0aW1lciBwcmVjaXNpb24KKyAqLworI2RlZmluZSBCQ01PU19USU1FUl9QUkVDSVNJT05fVVMgICAgICAgIDMyCisjaWYgKEJDTU9TX1RJTUVSX1BSRUNJU0lPTl9VUyAmIChCQ01PU19USU1FUl9QUkVDSVNJT05fVVMgLSAxKSkKKyAgICAjZXJyb3IgQkNNT1NfVElNRVJfUFJFQ0lTSU9OX1VTIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyCisjZW5kaWYKKworLyogVGhlcmUgYXJlIDIgdGltZXIgaW1wbGVtZW50YXRpb25zCisgKiAtIERMSVNULWJhc2VkIC0gd29ya3Mgd2VsbCB3aGVuIG1vc3Qgb2YgYWN0aXZlIHRpbWVycyBoYXZlIHRoZSBzYW1lIGR1cmF0aW9uCisgKiAtIFJCLXRyZWUgYmFzZWQgLSBtb3JlIGV4cGVuc2l2ZSBpbiBzaW1wbGUgY2FzZSwgYnV0IHNjYWxlcyBiZXR0ZXIgZm9yIGxhcmdlIG51bWJlciBvZiB0aW1lcnMKKyAqICAgICAgICAgICAgICAgICAgIHdpdGggYXJiaXRyYXJ5IGR1cmF0aW9ucworICovCisjZGVmaW5lIEJDTU9TX1RJTUVSX1JCX1RSRUUKKworLyoqIFRpbWVyIGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY21vc190aW1lcgoreworICAgIGJjbW9zX21zZyBtc2c7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZXIgbWVzc2FnZSAqLworICAgIGJjbW9zX3RpbWVyX3Bhcm0gcGFybTsgICAgICAgICAgICAgIC8qKjwgVGltZXIgcGFyYW1ldGVycyAqLworICAgIEZfYmNtb3NfdGltZXJfaGFuZGxlciBoYW5kbGVyOyAgICAgIC8qKjwgVGltZXIgaGFuZGxlciAqLworICAgIHVpbnQzMl90IHBlcmlvZDsgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZXIgcGVyaW9kICh1cykgaWYgcGVyaW9kaWMgKi8KKyAgICB1aW50MzJfdCBleHBpcmVfYXQ7ICAgICAgICAgICAgICAgICAvKio8IFRpbWVzdGFtcCB3aGVuIHRpbWVyIHNob3VsZCBleHBpcmUgKi8KKyAgICB1aW50MzJfdCBmbGFnczsgICAgICAgICAgICAgICAgICAgICAvKiAgIEludGVybmFsIGZsYWdzICovCisjZGVmaW5lIEJDTU9TX1RJTUVSX0ZMQUdfUlVOTklORyAgICAgICAgMHgwMDAwMDAwMSAgICAgIC8qIFRpbWVyIGlzIHJ1bm5pbmcgKi8KKyNkZWZpbmUgQkNNT1NfVElNRVJfRkxBR19FWFBJUkVEICAgICAgICAweDAwMDAwMDAyICAgICAgLyogVGltZXIgaGFzIGV4cGlyZWQsIGJ1dCBub3QgeWV0IGhhbmRsZWQgKi8KKyNkZWZpbmUgQkNNT1NfVElNRVJfRkxBR19BQ1RJVkUgICAgICAgICAoQkNNT1NfVElNRVJfRkxBR19SVU5OSU5HIHwgQkNNT1NfVElNRVJfRkxBR19FWFBJUkVEKQorI2RlZmluZSBCQ01PU19USU1FUl9GTEFHX1ZBTElEICAgICAgICAgIDB4MDAwMDAwMDQKKyAgICBiY21vc19tc2dfcXVldWVfbncgKnF1ZXVlOyAgICAgICAgICAvKio8IFF1ZXVlIGV4cGlyZWQgdGltZXIgaXMgb24gKi8KKyAgICBiY21vc190YXNrICp0YXNrOyAgICAgICAgICAgICAgICAgICAvKio8IFRhc2sgdGhhdCBleGVjdXRlcyB0aW1lciBoYW5kbGVyICovCisjaWZkZWYgQkNNT1NfVElNRVJfUkJfVFJFRQorICAgIFJCX0VOVFJZKGJjbW9zX3RpbWVyKSBlbnRyeTsgICAgICAgIC8qKjwgVGltZXIgcG9vbCBlbnRyeSAqLworI2Vsc2UKKyAgICBUQUlMUV9FTlRSWShiY21vc190aW1lcikgZW50cnk7CisjZW5kaWYKK307CisKKy8qKiBDaGVjayBpZiB0aW1lciBpcyBydW5uaW5nCisgKiBccGFyYW1baW5dICAgdGltZXIgICBUaW1lciBoYW5kbGUKKyAqIFxyZXR1cm5zIFRSVUUgaWYgdGltZXIgaXMgcnVubmluZworICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb3NfdGltZXJfaXNfcnVubmluZyhjb25zdCBiY21vc190aW1lciAqdGltZXIpCit7CisgICAgYmNtb3NfYm9vbCBydW5uaW5nID0gKCh0aW1lci0+ZmxhZ3MgJiBCQ01PU19USU1FUl9GTEFHX1JVTk5JTkcpICE9IDApIHx8CisgICAgICAgICh0aW1lci0+cGFybS5wZXJpb2RpYyAmJiAoKHRpbWVyLT5mbGFncyAmIEJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRCkgIT0gMCkpOworICAgIHJldHVybiBydW5uaW5nOworfQorCitzdGF0aWMgaW5saW5lIGJjbW9zX3RpbWVyICpfYmNtb3NfbXNnX3RvX3RpbWVyKGJjbW9zX21zZyAqbXNnKQoreworICAgIEJVR19PTihtc2ctPnR5cGUgIT0gQkNNT1NfTVNHX0lEX0lOVEVSTkFMX1RJTUVSKTsKKyAgICByZXR1cm4gKGJjbW9zX3RpbWVyICopbXNnOworfQorCisvKiogQH0gKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9tb2R1bGUKKyAqIEB7CisgKi8KKworLyoqIE1vZHVsZSBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfbW9kdWxlCit7CisgICAgYmNtb3NfbW9kdWxlX3Bhcm0gcGFybTsgICAgIC8qKjwgTW9kdWxlIHBhcmFtZXRlcnMgKi8KKyAgICBiY21vc19tb2R1bGVfaWQgaWQ7ICAgICAgICAgLyoqPCBNb2R1bGUgaWQgKi8KKyAgICBpbnQgaWR4OyAgICAgICAgICAgICAgICAgICAgLyoqPCBNb2R1bGUgaW5kZXggaW4gdGFzayBjb250cm9sIGJsb2NrICovCisgICAgYmNtb3NfbXNnX3F1ZXVlX253IG1zZ3E7ICAgIC8qKjwgTWVzc2FnZSBxdWV1ZSAqLworICAgIGJjbW9zX3Rhc2sgKm15X3Rhc2s7ICAgICAgICAvKio8IFRhc2sgdGhlIG1vZHVsZSBpcyBhc3NvY2lhdGVkIHdpdGggKi8KKyAgICB2b2lkICpjb250ZXh0OyAgICAgICAgICAgICAgLyoqPCBVc2VyLWRlZmluZWQgY29udGV4dCAqLworICAgIGNoYXIgbmFtZVtCQ01PU19NQVhfTkFNRV9MRU5HVEhdOyAgIC8qKjwgTW9kdWxlIG5hbWUgKi8KK307CisKKy8qKiBAfSBzeXN0ZW1fbW9kdWxlICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fZXZlbnQKKyAqIEB7CisgKi8KKworLyoqIEV2ZW50IGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY21vc19ldmVudAoreworICAgIGJjbW9zX21zZyBtc2c7ICAgICAgICAgICAgICAvKio8IE1lc3NhZ2UgaGVhZGVyLiBVc2VkIHRvIGRlbGl2ZXIgZXZlbnQgdG8gbW9kdWxlJ3MgcXVldWUgKi8KKyAgICBiY21vc19ldmVudF9pZCBpZDsgICAgICAgICAgLyoqPCBFdmVudCBzZXQgaWQgKi8KKyAgICBiY21vc19ldmVudF9wYXJtIHBhcm07ICAgICAgICAvKio8IEV2ZW50IHBhcmFtZXRlcnMgKi8KKyAgICBiY21vc19mYXN0bG9jayBsb2NrOyAgICAgICAgLyoqPCBQcm90ZWN0cyBldmVudCBjb250cm9sIGJsb2NrICovCisgICAgdWludDMyX3QgYWN0aXZlX2JpdHM7ICAgICAgIC8qKjwgQWN0aXZlIGV2ZW50IGJpdHMgKi8KKworICAgIGJjbW9zX3NlbSBtOyAgICAgICAgICAgICAgICAvKio8IE11dGV4IHRvIHN1c3BlbmQgdGFzayBvbi4gVHJhZGl0aW9uYWwgbW9kZSBvbmx5ICovCisgICAgYmNtb3NfYm9vbCBpc193YWl0aW5nOyAgICAgIC8qKjwgVFJVRSBpZiB0YXNrIGlzIHdhaXRpbmcgZm9yIGV2ZW50ICovCisgICAgY2hhciBuYW1lW0JDTU9TX01BWF9OQU1FX0xFTkdUSF07ICAgLyoqPCBFdmVudCBuYW1lICovCit9OworCisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXZlbnQgKl9iY21vc19tc2dfdG9fZXZlbnQoYmNtb3NfbXNnICptc2cpCit7CisgICAgQlVHX09OKG1zZy0+dHlwZSAhPSBCQ01PU19NU0dfSURfSU5URVJOQUxfRVZFTlQpOworICAgIHJldHVybiAoYmNtb3NfZXZlbnQgKiltc2c7Cit9CisKKy8qCisgKiBMb3cgbGV2ZWwgc2VydmljZXMKKyAqLworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX2J1ZgorICogQHsKKyAqLworCisjaWZuZGVmIEJDTU9TX0JVRl9PU19TUEVDSUZJQworI2RlZmluZSBCQ01PU19CVUZfREFUQV9JTkxJTkUKKyNlbmRpZgorCisjaWZkZWYgQkNNT1NfQlVGX0lOTElORQorI2RlZmluZSBCQ01PU19CVUZfQUxMT0NfRlJFRV9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfQlVGX0RBVEFfSU5MSU5FCisjZW5kaWYKKworI2lmbmRlZiBCQ01PU19CVUZfREFUQV9HVUFSRAorI2RlZmluZSBCQ01PU19CVUZfREFUQV9HVUFSRCAgICAgICAgICAgIDAKKyNlbmRpZgorCisjaWZuZGVmIEJDTU9TX0JVRl9EQVRBX0FMSUdOTUVOVAorI2RlZmluZSBCQ01PU19CVUZfREFUQV9BTElHTk1FTlQgICAgICAgIDY0CisjZW5kaWYKKworI2lmbmRlZiBCQ01PU19CVUZfQUxMT0NfRlJFRV9JTkxJTkUKKworLyoqIEFsbG9jYXRlIHRyYW5zcG9ydCBidWZmZXIuCisgKiBUaGUgYnVmZmVyIGNhbiBhY2NvbW1vZGF0ZSB1cCB0byBzaXplIGJ5dGVzIG9mIGRhdGEuCisgKiBJbiBhZGRpdGlvbiBpdCByZXNlcnZlcyBCQ01UUl9CVUZfRVhUUkFfSEVBRFJPT00gaGVhZHJvb20gYnl0ZXMKKyAqIGZvciBleHRyYSBoZWFkZXJzLgorICoKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgIERhdGEgc2l6ZQorICogXHJldHVybnMgYnVmZmVyIHBvaW50ZXIgb3IgTlVMTCBpZiBubyBtZW1vcnkKKyAqLworYmNtb3NfYnVmICpiY21vc19idWZfYWxsb2ModWludDMyX3Qgc2l6ZSk7CisKKyAvKiogUmVsZWFzZSB0cmFuc3BvcnQgYnVmZmVyIGFsbG9jYXRlZCBieSBiY21vc19idWZfYWxsb2MoKQorICAqCisgICogXHBhcmFtW2luXSAgIGJ1ZiAgICBCdWZmZXIgdG8gYmUgcmVsZWFzZWQKKyAgKi8KK3ZvaWQgYmNtb3NfYnVmX2ZyZWUoYmNtb3NfYnVmICpidWYpOworCisjZW5kaWYgLyogQkNNT1NfQlVGX0FMTE9DX0ZSRUVfSU5MSU5FICovCisKKyNpZm5kZWYgQkNNT1NfQlVGX0RBVEFfSU5MSU5FCisKKy8qKiBHZXQgZGF0YSBsZW5ndGgKKyAqCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIKKyAqIFxyZXR1cm5zIGRhdGEgbGVuZ3RoCisgKi8KK3VpbnQzMl90IGJjbW9zX2J1Zl9sZW5ndGgoYmNtb3NfYnVmICpidWYpOworCisvKiogU2V0IGRhdGEgbGVuZ3RoCisgKgorICogXHBhcmFtW2luXSAgIGJ1ZiAgICAgQnVmZmVyCisgKiBccGFyYW1baW5dICAgbGVuZ3RoICBEYXRhIGxlbmd0aAorICogXHJldHVybnMgMD1PSywgb3IgQkNNX0VSUl9PVkVSRkxPVyBpZiBsZW5ndGggZXhjZWVkcyBzaXplCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2J1Zl9sZW5ndGhfc2V0KGJjbW9zX2J1ZiAqYnVmLCB1aW50MzJfdCBsZW5ndGgpOworCisvKiogR2V0IGJ1ZmZlciBkYXRhIHBvaW50ZXIuCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIKKyAqIFxyZXR1cm5zIGRhdGEgcG9pbnRlcgorICovCit1aW50OF90ICpiY21vc19idWZfZGF0YShiY21vc19idWYgKmJ1Zik7CisKKyNlbmRpZiAvKiBCQ01PU19CVUZfREFUQV9JTkxJTkUgKi8KKworI2lmbmRlZiBCQ01PU19CVUZfT1NfU1BFQ0lGSUMKKworI2lmbmRlZiB1bmxpa2VseQorI2RlZmluZSB1bmxpa2VseSh4KSAgICAgKHgpCisjZW5kaWYKKworLyogR2VuZXJpYyAobm90IG9zLXNwZWNpZmljKSBzeXNiIGltcGxlbWVudGF0aW9uICovCisKKy8qCisgKiBOZXR3b3JrIC8gdHJhbnNwb3J0IGJ1ZmZlcgorICovCisKKworLyogTWVtb3J5IGJsb2NrIGxpc3QgKi8KK3R5cGVkZWYgU1RBSUxRX0hFQUQoLCBiY21vc19idWYpIGJjbW9zX2J1Zl9saXN0X2hlYWQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfYnVmX2xpc3RfaGVhZCBoZWFkOyAgICAgICAgICAgLyoqPCBCdWZmZXIgbGlzdCBoZWFkICovCit9IGJjbW9zX2J1Zl9xdWV1ZTsKKworLyogU3lzdGVtIGJ1ZmZlci4gV2UgcHJvYmFibHkgY2FuIHVzZSBtYnVmIGFzIHdlbGwuICAqLworc3RydWN0IGJjbW9zX2J1ZgoreworICAgIHVpbnQ4X3QgKnN0YXJ0OworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgYmNtb3NfYmxrX3Bvb2wgKnBvb2w7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBsZW47CisgICAgU1RBSUxRX0VOVFJZKGJjbW9zX2J1ZikgbGlzdDsgICAgICAvKio8IE5leHQgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICB1aW50OF90IGNoYW5uZWw7Cit9OworCisKKyNpZm5kZWYgQkNNVFJfQlVGX0VYVFJBX0hFQURST09NCisjZGVmaW5lIEJDTVRSX0JVRl9FWFRSQV9IRUFEUk9PTSAwCisjZW5kaWYKKworCisvKiogSW5pdGlhbGl6ZSBidWZmZXIgcXVldWUKKyAqIFxwYXJhbVtpbl0gICBxICAgICAgIEJ1ZmZlciBxdWV1ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfYnVmX3F1ZXVlX2luaXQoYmNtb3NfYnVmX3F1ZXVlICpxKQoreworICAgIFNUQUlMUV9JTklUKCZxLT5oZWFkKTsKK30KKworLyogQ2hlY2sgaWYgYnVmZmVyIHF1ZXVlIGlzIGVtcHR5CisgKiBccGFyYW1baW5dICAgcSAgICAgICBCdWZmZXIgcXVldWUKKyAqIFxyZXR1cm5zIFRSVUUgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5CisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vc19idWZfcXVldWVfaXNfZW1wdHkoYmNtb3NfYnVmX3F1ZXVlICpxKQoreworICAgIHJldHVybiAoYmNtb3NfYm9vbClTVEFJTFFfRU1QVFkoJnEtPmhlYWQpOworfQorCisvKiogRW5xdWV1ZSBidWZmZXIKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB1bmRlciBsb2NrLCBlLmcuLCBxLT5sb2NrCisgKgorICogXHBhcmFtW2luXSAgIHEgICAgICAgQnVmZmVyIHF1ZXVlCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2J1Zl9xdWV1ZV9wdXQoYmNtb3NfYnVmX3F1ZXVlICpxLCBiY21vc19idWYgKmJ1ZikKK3sKKyAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnEtPmhlYWQsIGJ1ZiwgbGlzdCk7Cit9CisKKy8qIERlcXVldWUgYnVmZmVyCisgKgorICogTXVzdCBiZSBjYWxsZWQgdW5kZXIgbG9jaywgZS5nLiwgcS0+bG9jaworICoKKyAqIFJlbW92ZSBhbmQgcmV0dXJuIHRoZSAxc3QgcXVldWVkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbl0gICBxICAgICAgIEJ1ZmZlciBxdWV1ZQorICogXHJldHVybnMgdGhlICBidWZmZXIgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2J1ZiAqYmNtb3NfYnVmX3F1ZXVlX2dldChiY21vc19idWZfcXVldWUgKnEpCit7CisgICAgYmNtb3NfYnVmICpidWY7CisgICAgYnVmID0gU1RBSUxRX0ZJUlNUKCZxLT5oZWFkKTsKKyAgICBpZiAoYnVmKQorICAgICAgICBTVEFJTFFfUkVNT1ZFX0hFQUQoJnEtPmhlYWQsIGxpc3QpOworICAgIHJldHVybiBidWY7Cit9CisKKy8qIFBlZWsgaW50byBxdWV1ZSBhbmQgcmV0dXJuIHRoZSAxc3QgYnVmZmVyIHdpdGhvdXQgZGVxdWVpbmcgaXQKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB1bmRlciBsb2NrLCBlLmcuLCBxLT5sb2NrCisgKiBccGFyYW1baW5dICAgcSAgICAgICBCdWZmZXIgcXVldWUKKyAqIFxyZXR1cm5zIHRoZSAgYnVmZmVyIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSBiY21vc19idWYgKmJjbW9zX2J1Zl9xdWV1ZV9wZWVrKGJjbW9zX2J1Zl9xdWV1ZSAqcSkKK3sKKyAgICByZXR1cm4gU1RBSUxRX0ZJUlNUKCZxLT5oZWFkKTsKK30KKworLyogSW5pdGlhbGl6ZSBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYnVmICpiY21vc19idWZfaW5pdChiY21vc19idWYgKmJ1ZiwgdWludDhfdCAqc3RhcnQsCisgICAgdWludDhfdCAqZGF0YSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgbGVuKQoreworICAgIEJVR19PTigodm9pZCAqKShidWYgKzEpICE9IHN0YXJ0KTsKKyAgICBidWYtPnN0YXJ0ID0gc3RhcnQ7CisgICAgYnVmLT5kYXRhID0gZGF0YTsKKyAgICBidWYtPnNpemUgPSBzaXplOworICAgIGJ1Zi0+bGVuID0gbGVuOworICAgIGJ1Zi0+cG9vbCA9IE5VTEw7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworLyogR2V0IGRhdGEgbGVuZ3RoICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbW9zX2J1Zl9sZW5ndGgoYmNtb3NfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJ1Zi0+bGVuOworfQorCisvKiBTZXQgZGF0YSBsZW5ndGggKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXJybm8gYmNtb3NfYnVmX2xlbmd0aF9zZXQoYmNtb3NfYnVmICpidWYsIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICBpZiAodW5saWtlbHkobGVuZ3RoID4gYnVmLT5zaXplIC0gKGJ1Zi0+ZGF0YSAtIGJ1Zi0+c3RhcnQpKSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiISEhJXM6IGxlbmd0aD0ldSBzaXplPSV1IGRhdGE9JXAgc3RhcnQ9JXAgZGF0YS1zdGFydD0ldVxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbGVuZ3RoLCBidWYtPnNpemUsIGJ1Zi0+ZGF0YSwgYnVmLT5zdGFydCwgKHVpbnQzMl90KShidWYtPmRhdGEgLSBidWYtPnN0YXJ0KSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKyAgICBidWYtPmxlbiA9IGxlbmd0aDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogR2V0IGJ1ZmZlciBkYXRhIHBvaW50ZXIuICovCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKmJjbW9zX2J1Zl9kYXRhKGJjbW9zX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBidWYtPmRhdGE7Cit9CisKKy8qIEdldCBidWZmZXIgY2hhbm5lbC4gKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBiY21vc19idWZfY2hhbm5lbChiY21vc19idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYnVmLT5jaGFubmVsOworfQorCisvKiBTZXQgYnVmZmVyIGNoYW5uZWwuICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfYnVmX2NoYW5uZWxfc2V0KGJjbW9zX2J1ZiAqYnVmLCB1aW50OF90IGNoYW5uZWwpCit7CisgICAgYnVmLT5jaGFubmVsID0gY2hhbm5lbDsKK30KKworI2VuZGlmIC8qICNpZm5kZWYgQkNNT1NfQlVGX09TX1NQRUNJRklDICovCisKKy8qKiBAfSBiY21vc19idWYgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9jYWNoZQorICogQHsKKyAqLworCisjaWZuZGVmIEJDTU9TX0NBQ0hFX0lOTElORQorCisvKiogSW52YWxpZGF0ZSBhZGRyZXNzIGFyZWEgaW4gZGF0YSBjYWNoZS4gRGlydHkgY2FjaGUgbGluZXMgY29udGVudCBpcyBkaXNjYXJkZWQuCisgKiBccGFyYW1baW5dICAgc3RhcnQgICBBZGRyZXNzIGFyZWEgc3RhcnQKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgIEFkZHJlc3MgYXJlYSBzaXplCisgKi8KK3ZvaWQgYmNtb3NfZGNhY2hlX2ludih2b2lkICpzdGFydCwgdWludDMyX3Qgc2l6ZSk7CisKKy8qKiBGbHVzaCBhZGRyZXNzIGFyZWEgaW4gZGF0YSBjYWNoZS4gRGlydHkgY2FjaGUgbGluZXMgYXJlIGNvbW1pdHRlZCB0byBtZW1vcnkuCisgKiBccGFyYW1baW5dICAgc3RhcnQgICBBZGRyZXNzIGFyZWEgc3RhcnQKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgIEFkZHJlc3MgYXJlYSBzaXplCisgKi8KK3ZvaWQgYmNtb3NfZGNhY2hlX2ZsdXNoKHZvaWQgKnN0YXJ0LCB1aW50MzJfdCBzaXplKTsKKworI2VuZGlmIC8qIEJDTU9TX0NBQ0hFX0lOTElORSAqLworCisvKiogUHJlcGFyZSBmb3IgRE1BIHdyaXRlLgorICogT24gaC93IHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgRE1BLWNhY2hlIGNvaGVyZW5jeSwgdGhpcyBmdW5jdGlvbiBzaG91bGQKKyAqIHBlcmZvcm0gd3JpdGUgYmFycmllci4KKyAqIE9uIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgRE1BIGNhY2hlIGNvaGVyZW5jeSB0aGlzIGZ1bmN0aW9uIHNob3VsZAorICogZmx1c2ggdGhlIHJlbGV2YW50IGRjYWNoZSBhcmVhCisgKgorICogXHBhcmFtW2luXSAgIHN0YXJ0ICAgRE1BIGJ1ZmZlciBzdGFydCBhZGRyZXNzCisgKiBccGFyYW1baW5dICAgc2l6ZSAgICBETUEgYnVmZmVyIHNpemUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX3ByZXBhcmVfZm9yX2RtYV93cml0ZSh2b2lkICpzdGFydCwgdWludDMyX3Qgc2l6ZSkKK3sKKyNpZmRlZiBCQ01PU19ETUFfQ0FDSEVfQ09IRVJFTkNZCisgICAgYmNtb3NfYmFycmllcigpOworI2Vsc2UKKyAgICBiY21vc19kY2FjaGVfZmx1c2goc3RhcnQsIHNpemUpOworI2VuZGlmCit9CisKKy8qKiBQcmVwYXJlIGZvciBETUEgcmVhZC4KKyAqIE9uIGgvdyBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IERNQS1jYWNoZSBjb2hlcmVuY3ksIHRoaXMgZnVuY3Rpb24gc2hvdWxkCisgKiBwZXJmb3JtIHdyaXRlIGJhcnJpZXIuCisgKiBPbiBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IERNQSBjYWNoZSBjb2hlcmVuY3kgdGhpcyBmdW5jdGlvbiBzaG91bGQKKyAqIGludmFsaWRhdGUgdGhlIHJlbGV2YW50IGRjYWNoZSBhcmVhCisgKgorICogXHBhcmFtW2luXSAgIHN0YXJ0ICAgRE1BIGJ1ZmZlciBzdGFydCBhZGRyZXNzCisgKiBccGFyYW1baW5dICAgc2l6ZSAgICBETUEgYnVmZmVyIHNpemUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX3ByZXBhcmVfZm9yX2RtYV9yZWFkKHZvaWQgKnN0YXJ0LCB1aW50MzJfdCBzaXplKQoreworI2lmZGVmIEJDTU9TX0RNQV9DQUNIRV9DT0hFUkVOQ1kKKyAgICBiY21vc19iYXJyaWVyKCk7CisjZWxzZQorICAgIGJjbW9zX2RjYWNoZV9pbnYoc3RhcnQsIHNpemUpOworI2VuZGlmCit9CisKKy8qKiBAfSBzeXN0ZW1fY2FjaGUgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9pbnRlcnJ1cHQKKyAqIEB7CisgKi8KKworI2lmZGVmIEJDTU9TX0lOVEVSUlVQVF9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfSU5URVJSVVBUX0NPTk5FQ1RfRElTQ09OTkVDVF9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfSU5URVJSVVBUX0VOQUJMRV9ESVNBQkxFX0lOTElORQorI2VuZGlmCisKKyNpZm5kZWYgQkNNT1NfSU5URVJSVVBUX0NPTk5FQ1RfRElTQ09OTkVDVF9JTkxJTkUKKy8qKiBDb25uZWN0IHN5c3RlbSBpbnRlcnJ1cHQKKyAqIFxwYXJhbVtpbl0gICBpcnEgICAgIElSUSBudW1iZXIKKyAqIFxwYXJhbVtpbl0gICBjcHUgICAgIENQVSBudW1iZXIgKGZvciBTTVApCisgKiBccGFyYW1baW5dICAgZmxhZ3MgICBJUlEgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gICBpc3IgICAgIElTUgorICogXHBhcmFtW2luXSAgIG5hbWUgICAgZGV2aWNlIG5hbWUKKyAqIFxwYXJhbVtpbl0gICBwcml2ICAgIFByaXZhdGUgY29va2llCisgKiBccmV0dXJucyAwPU9LLCA8MC0gZXJyb3IKKyAqLworaW50IGJjbW9zX2ludF9jb25uZWN0KGludCBpcnEsIGludCBjcHUsIGludCBmbGFncywKKyAgICBpbnQgKCppc3IpKGludCBpcnEsIHZvaWQgKnByaXYpLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwcml2KTsKKworLyoqIERpc2Nvbm5lY3Qgc3lzdGVtIGludGVycnVwdAorICogXHBhcmFtW2luXSAgIGlycSAgICAgSVJRIG51bWJlcgorICogXHBhcmFtW2luXSAgIHByaXYgICAgUHJpdmF0ZSBjb29raWUgcGFzc2VkIGluIGJjbW9zX2ludF9jb25uZWN0KCkKKyAqIFxyZXR1cm5zIDA9T0ssIDwwLSBlcnJvcgorICovCit2b2lkIGJjbW9zX2ludF9kaXNjb25uZWN0KGludCBpcnEsIHZvaWQgKnByaXYpOworI2VuZGlmCisKKyNpZm5kZWYgQkNNT1NfSU5URVJSVVBUX0VOQUJMRV9ESVNBQkxFX0lOTElORQorLyoqIFVubWFzayBJUlEKKyAqIFxwYXJhbVtpbl0gICBpcnEgSVJRCisgKi8KK3ZvaWQgYmNtb3NfaW50X2VuYWJsZShpbnQgaXJxKTsKKworLyoqIE1hc2sgSVJRCisgKiBccGFyYW1baW5dICAgaXJxIElSUQorICovCit2b2lkIGJjbW9zX2ludF9kaXNhYmxlKGludCBpcnEpOworI2VuZGlmCisKKy8qKiBAfSAqLworCisvKiBHZXQgY2hhciwgcHV0IGNoYXIgc3VwcG9ydCAqLworI2lmbmRlZiBCQ01PU19HRVRDSEFSX0lOTElORQorc3RhdGljIGlubGluZSBpbnQgYmNtb3NfZ2V0Y2hhcih2b2lkKQoreworICAgIHJldHVybiBnZXRjaGFyKCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBCQ01PU19QVVRDSEFSX0lOTElORQordm9pZCBiY21vc19wdXRjaGFyKGludCBjKTsKKyNlbmRpZgorCisjaWZuZGVmIEJDTU9TX1NFTV9QT1NUX0lTX0FMTE9XRURfSU5MSU5FCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb3Nfc2VtX3Bvc3RfaXNfYWxsb3dlZCh2b2lkKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBCQ01PU19DT01NT04yX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2VuZGlhbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2U0MWRjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lbmRpYW4uaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PU19FTkRJQU5fSF8KKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0hfCisKKyNpZm5kZWYgQkNNT1NfU1lTVEVNX0hfCisjZXJyb3IgUGxlYXNlIGRvIG5vdCBpbmNsdWRlIGJjbW9zX2VuZGlhbi5oIGRpcmVjdGx5LiBJbmNsdWRlIGJjbW9zX3N5c3RlbS5oCisjZW5kaWYKKworCisKKy8qKiBAfSBzeXN0ZW1fZXZlbnQgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9lbmRpYW4KKyAqIEB7CisgKi8KKyNpZm5kZWYgQkNNT1NfQVJDSF9FTkRJQU5fU1dBUAorCisvKiogU3dhcHMgdGhlIGVuZGlhbm5lc3Mgb2YgYSAxNi1iaXQgaW50ZWdlcgorICogXHBhcmFtW2luXSBuIHRoZSBvcmlnaW5hbCBudW1iZXIKKyAqIFxyZXR1cm4gbnVtYmVyIHdpdGggc3dhcHBlZCBlbmRpYW5uZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgYmNtb3NfZW5kaWFuX3N3YXBfdTE2KHVpbnQxNl90IG4pCit7CisgICAgcmV0dXJuICgobiA8PCA4ICkgJiAweEZGMDBVKXwoKG4gPj4gOCkgJiAweDAwRkZVKTsKK30KKworLyoqIFN3YXBzIHRoZSBlbmRpYW5uZXNzIG9mIGEgMjQtYml0IGludGVnZXIKKyAqIFxwYXJhbVtpbl0gbiB0aGUgb3JpZ2luYWwgbnVtYmVyCisgKiBccmV0dXJuIG51bWJlciB3aXRoIHN3YXBwZWQgZW5kaWFubmVzcworICovCitzdGF0aWMgaW5saW5lIHVpbnQyNF90IGJjbW9zX2VuZGlhbl9zd2FwX3UyNCh1aW50MjRfdCBuKQoreworICAgIHJldHVybiAodWludDI0X3QpeyAudTggPSB7IG4udThbMl0sIG4udThbMV0sIG4udThbMF0gfSB9OworfQorCisvKiogU3dhcHMgdGhlIGVuZGlhbm5lc3Mgb2YgYSAzMi1iaXQgaW50ZWdlcgorICogXHBhcmFtW2luXSBuIHRoZSBvcmlnaW5hbCBudW1iZXIKKyAqIFxyZXR1cm4gbnVtYmVyIHdpdGggc3dhcHBlZCBlbmRpYW5uZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgYmNtb3NfZW5kaWFuX3N3YXBfdTMyKHVpbnQzMl90IG4pCit7CisgICAgcmV0dXJuICgobiA8PCAyNCkgJiAweEZGMDAwMDAwVSl8KChuIDw8IDggKSAmIDB4MDBGRjAwMDBVKXwoKG4gPj4gOCkgJiAweDAwMDBGRjAwVSl8KChuID4+IDI0KSAmIDB4MDAwMDAwRkZVKTsKK30KKworLyoqIFN3YXBzIHRoZSBlbmRpYW5uZXNzIG9mIGEgNjQtYml0IGludGVnZXIKKyAqIFxwYXJhbVtpbl0gbiB0aGUgb3JpZ2luYWwgbnVtYmVyCisgKiBccmV0dXJuIG51bWJlciB3aXRoIHN3YXBwZWQgZW5kaWFubmVzcworICovCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGJjbW9zX2VuZGlhbl9zd2FwX3U2NCh1aW50NjRfdCBuKQoreworICAgIHJldHVybiAoKCh1aW50NjRfdCliY21vc19lbmRpYW5fc3dhcF91MzIobiAmIDB4RkZGRkZGRkZVKSA8PCAzMikgfCBiY21vc19lbmRpYW5fc3dhcF91MzIoKG4gPj4gMzIpICYgMHhGRkZGRkZGRlUpKTsKK30KKworI2VuZGlmIC8qIEJDTU9TX0FSQ0hfRU5ESUFOX1NXQVAgKi8KKworI2lmIChCQ01fQ1BVX0VORElBTiA9PSBCQ01PU19FTkRJQU5fQklHKQorCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1UxNihuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfVTI0KG4pIChuKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQ1BVX1RPX0JJR19VMzIobikgKG4pCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1U2NChuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0JJR19UT19DUFVfVTE2KG4pIChuKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV9VMjQobikgKG4pCisjZGVmaW5lIEJDTU9TX0VORElBTl9CSUdfVE9fQ1BVX1UzMihuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0JJR19UT19DUFVfVTY0KG4pIChuKQorCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UxNihuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTE2KG4pKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQ1BVX1RPX0xJVFRMRV9VMjQobikgKGJjbW9zX2VuZGlhbl9zd2FwX3UyNChuKSkKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTMyKG4pIChiY21vc19lbmRpYW5fc3dhcF91MzIobikpCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1U2NChuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTY0KG4pKQorI2RlZmluZSBCQ01PU19FTkRJQU5fTElUVExFX1RPX0NQVV9VMTYobikgKGJjbW9zX2VuZGlhbl9zd2FwX3UxNihuKSkKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTI0KG4pIChiY21vc19lbmRpYW5fc3dhcF91MjQobikpCisjZGVmaW5lIEJDTU9TX0VORElBTl9MSVRUTEVfVE9fQ1BVX1UzMihuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTMyKG4pKQorI2RlZmluZSBCQ01PU19FTkRJQU5fTElUVExFX1RPX0NQVV9VNjQobikgKGJjbW9zX2VuZGlhbl9zd2FwX3U2NChuKSkKKworI2VsaWYgKEJDTV9DUFVfRU5ESUFOID09IEJDTU9TX0VORElBTl9MSVRUTEUpCisKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfVTE2KG4pIChiY21vc19lbmRpYW5fc3dhcF91MTYobikpCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1UyNChuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTI0KG4pKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQ1BVX1RPX0JJR19VMzIobikgKGJjbW9zX2VuZGlhbl9zd2FwX3UzMihuKSkKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfVTY0KG4pIChiY21vc19lbmRpYW5fc3dhcF91NjQobikpCisjZGVmaW5lIEJDTU9TX0VORElBTl9CSUdfVE9fQ1BVX1UxNihuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTE2KG4pKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV9VMjQobikgKGJjbW9zX2VuZGlhbl9zd2FwX3UyNChuKSkKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0JJR19UT19DUFVfVTMyKG4pIChiY21vc19lbmRpYW5fc3dhcF91MzIobikpCisjZGVmaW5lIEJDTU9TX0VORElBTl9CSUdfVE9fQ1BVX1U2NChuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTY0KG4pKQorCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UxNihuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTI0KG4pIChuKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQ1BVX1RPX0xJVFRMRV9VMzIobikgKG4pCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1U2NChuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTE2KG4pIChuKQorI2RlZmluZSBCQ01PU19FTkRJQU5fTElUVExFX1RPX0NQVV9VMjQobikgKG4pCisjZGVmaW5lIEJDTU9TX0VORElBTl9MSVRUTEVfVE9fQ1BVX1UzMihuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTY0KG4pIChuKQorCisjZWxzZQorI2Vycm9yIEJDTV9DUFVfRU5ESUFOIG11c3QgYmUgQkNNT1NfRU5ESUFOX0JJRyBvciBfTElUVExFCisjZW5kaWYKKworLyoqIEB9IHN5c3RlbV9lbmRpYW4gKi8KKworI2VuZGlmIC8qIEJDTU9TX0NPTU1PTjJfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfZXJybm8uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfZXJybm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmEwZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisKKy8qIE1hcCBlcnJvciBjb2RlIHRvIGVycm9yIHN0cmluZyAqLworY29uc3QgY2hhciAqYmNtb3Nfc3RyZXJyb3IoYmNtb3NfZXJybm8gZXJyKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICplcnJzdHJbXSA9IHsKKyAgICAgICAgWy1CQ01fRVJSX09LXSAgICAgICAgICAgICAgICAgICAgICAgID0gIk9LIiwKKyAgICAgICAgWy1CQ01fRVJSX0lOX1BST0dSRVNTXSAgICAgICAgICAgICAgID0gIkluIHByb2dyZXNzIiwKKyAgICAgICAgWy1CQ01fRVJSX1BBUk1dICAgICAgICAgICAgICAgICAgICAgID0gIkVycm9yIGluIHBhcmFtZXRlcnMiLAorICAgICAgICBbLUJDTV9FUlJfTk9NRU1dICAgICAgICAgICAgICAgICAgICAgPSAiTm8gbWVtb3J5IiwKKyAgICAgICAgWy1CQ01fRVJSX05PUkVTXSAgICAgICAgICAgICAgICAgICAgID0gIk5vIHJlc291cmNlcyIsCisgICAgICAgIFstQkNNX0VSUl9JTlRFUk5BTF0gICAgICAgICAgICAgICAgICA9ICJJbnRlcm5hbCBlcnJvciIsCisgICAgICAgIFstQkNNX0VSUl9OT0VOVF0gICAgICAgICAgICAgICAgICAgICA9ICJFbnRyeSBkb2Vzbid0IGV4aXN0IiwKKyAgICAgICAgWy1CQ01fRVJSX05PREVWXSAgICAgICAgICAgICAgICAgICAgID0gIkRldmljZSBkb2Vzbid0IGV4aXN0IiwKKyAgICAgICAgWy1CQ01fRVJSX0FMUkVBRFldICAgICAgICAgICAgICAgICAgID0gIkVudHJ5IGFscmVhZHkgZXhpc3RzIiwKKyAgICAgICAgWy1CQ01fRVJSX1JBTkdFXSAgICAgICAgICAgICAgICAgICAgID0gIk91dCBvZiByYW5nZSIsCisgICAgICAgIFstQkNNX0VSUl9QRVJNXSAgICAgICAgICAgICAgICAgICAgICA9ICJObyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gYW4gb3BlcmF0aW9uIiwKKyAgICAgICAgWy1CQ01fRVJSX05PVF9TVVBQT1JURURdICAgICAgICAgICAgID0gIk9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgWy1CQ01fRVJSX1BBUlNFXSAgICAgICAgICAgICAgICAgICAgID0gIlBhcnNpbmcgZXJyb3IiLAorICAgICAgICBbLUJDTV9FUlJfSU5WQUxJRF9PUF0gICAgICAgICAgICAgICAgPSAiSW52YWxpZCBvcGVyYXRpb24iLAorICAgICAgICBbLUJDTV9FUlJfSU9dICAgICAgICAgICAgICAgICAgICAgICAgPSAiSS9PIGVycm9yIiwKKyAgICAgICAgWy1CQ01fRVJSX1NUQVRFXSAgICAgICAgICAgICAgICAgICAgID0gIk9iamVjdCBpcyBpbiBiYWQgc3RhdGUiLAorICAgICAgICBbLUJDTV9FUlJfREVMRVRFRF0gICAgICAgICAgICAgICAgICAgPSAiT2JqZWN0IGlzIGRlbGV0ZWQiLAorICAgICAgICBbLUJDTV9FUlJfVE9PX01BTlldICAgICAgICAgICAgICAgICAgPSAiVG9vIG1hbnkgb2JqZWN0cyIsCisgICAgICAgIFstQkNNX0VSUl9OT19NT1JFXSAgICAgICAgICAgICAgICAgICA9ICJObyBtb3JlIGVudHJpZXMiLAorICAgICAgICBbLUJDTV9FUlJfT1ZFUkZMT1ddICAgICAgICAgICAgICAgICAgPSAiQnVmZmVyIG92ZXJmbG93IiwKKyAgICAgICAgWy1CQ01fRVJSX0NPTU1fRkFJTF0gICAgICAgICAgICAgICAgID0gIkNvbW11bmljYXRpb24gZmFpbHVyZSIsCisgICAgICAgIFstQkNNX0VSUl9OT1RfQ09OTkVDVEVEXSAgICAgICAgICAgICA9ICJObyBjb25uZWN0aW9uIHdpdGggdGhlIHRhcmdldCBzeXN0ZW0iLAorICAgICAgICBbLUJDTV9FUlJfU1lTQ0FMTF9FUlJdICAgICAgICAgICAgICAgPSAiU3lzdGVtIGNhbGwgcmV0dXJuZWQgZXJyb3IiLAorICAgICAgICBbLUJDTV9FUlJfTVNHX0VSUk9SXSAgICAgICAgICAgICAgICAgPSAiUmVjZWl2ZWQgbWVzc2FnZSBpcyBpbnNhbmUiLAorICAgICAgICBbLUJDTV9FUlJfVE9PX01BTllfUkVRU10gICAgICAgICAgICAgPSAiVG9vIG1hbnkgb3V0c3RhbmRpbmcgcmVxdWVzdHMiLAorICAgICAgICBbLUJDTV9FUlJfVElNRU9VVF0gICAgICAgICAgICAgICAgICAgPSAiT3BlcmF0aW9uIHRpbWVkIG91dCIsCisgICAgICAgIFstQkNNX0VSUl9UT09fTUFOWV9GUkFHU10gICAgICAgICAgICA9ICJUb28gbWFueSBmcmFnbWVudHMiLAorICAgICAgICBbLUJDTV9FUlJfTlVMTF0gICAgICAgICAgICAgICAgICAgICAgPSAiR290IE5VTEwgcG9pbnRlciIsCisgICAgICAgIFstQkNNX0VSUl9SRUFEX09OTFldICAgICAgICAgICAgICAgICA9ICJBdHRlbXB0IHRvIHNldCByZWFkLW9ubHkgcGFyYW1ldGVyIiwKKyAgICAgICAgWy1CQ01fRVJSX09OVV9FUlJfUkVTUF0gICAgICAgICAgICAgID0gIk9OVSByZXR1cm5lZCBhbiBlcnJvciByZXNwb25zZSIsCisgICAgICAgIFstQkNNX0VSUl9NQU5EQVRPUllfUEFSTV9JU19NSVNTSU5HXSA9ICJNYW5kYXRvcnkgcGFyYW1ldGVyIGlzIG1pc3NpbmciLAorICAgICAgICBbLUJDTV9FUlJfS0VZX1JBTkdFXSAgICAgICAgICAgICAgICAgPSAiS2V5IGZpZWxkIG91dCBvZiByYW5nZSIsCisgICAgICAgIFstQkNNX0VSUl9RVUVVRV9FTVBUWV0gICAgICAgICAgICAgICA9ICJSeCBvZiBQQ0llIGVtcHR5IiwKKyAgICAgICAgWy1CQ01fRVJSX1FVRVVFX0ZVTExdICAgICAgICAgICAgICAgID0gIlR4IG9mIFBDSWUgZnVsbCIsCisgICAgICAgIFstQkNNX0VSUl9UT09fTE9OR10gICAgICAgICAgICAgICAgICA9ICJQcm9jZXNzaW5nIGlzIHRha2luZyB0b28gbG9uZywgYnV0IHdpbGwgZmluaXNoIGV2ZW50dWFsbHkiLAorICAgICAgICBbLUJDTV9FUlJfSU5TVUZGSUNJRU5UX0xJU1RfTUVNXSAgICAgPSAiSW5zdWZmaWNpZW50IGxpc3QgbWVtb3J5IHByb3ZpZGVkIiwKKworICAgICAgICBbLUJDTV9FUlJfT1VUX09GX1NZTkNdICAgICAgICAgICAgICAgPSAiU2VxdWVuY2UgbnVtYmVyIG9yIG9wZXJhdGlvbiBzdGVwIHdhcyBvdXQgb2Ygc3luYyIsCisgICAgICAgIFstQkNNX0VSUl9DSEVDS1NVTV0gICAgICAgICAgICAgICAgICA9ICJDaGVja3N1bSBlcnJvciIsCisgICAgICAgIFstQkNNX0VSUl9JTUFHRV9UWVBFXSAgICAgICAgICAgICAgICA9ICJVbnN1cHBvcnRlZCBmaWxlL2ltYWdlIHR5cGUiLAorICAgICAgICBbLUJDTV9FUlJfSU5DT01QTEVURV9URVJNSU5BVElPTl0gICAgPSAiSW5jb21wbGV0ZSBwcmVtYXR1cmUgdGVybWluYXRpb24iLAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnVua25vd24gPSAiKnVua25vd24qIjsKKworICAgIGlmICgodW5zaWduZWQpKC1lcnIpID49IHNpemVvZihlcnJzdHIpL3NpemVvZihlcnJzdHJbMF0pIHx8ICFlcnJzdHJbLWVycl0pCisgICAgICAgIHJldHVybiB1bmtub3duOworICAgIHJldHVybiBlcnJzdHJbLWVycl07Cit9CisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGJjbW9zX3N0cmVycm9yKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTg5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2Vycm5vLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PU19FUlJOT19IXworI2RlZmluZSBCQ01PU19FUlJOT19IXworCisvKiogXGRlZmdyb3VwIHN5c3RlbV9lcnJubyBFcnJvciBDb2RlcworICogQHsKKyAqLworCisvKiogRXJyb3IgY29kZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9FUlJfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAwLCAgIC8qKjwgT0sgKi8KKyAgICBCQ01fRVJSX0lOX1BST0dSRVNTICAgICAgICAgICAgICAgICAgICAgICAgPSAtMSwgICAvKio8IE9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcyAqLworICAgIEJDTV9FUlJfUEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgIC8qKjwgRXJyb3IgaW4gcGFyYW1ldGVycyAqLworICAgIEJDTV9FUlJfTk9NRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0zLCAgIC8qKjwgTm8gbWVtb3J5ICovCisgICAgQkNNX0VSUl9OT1JFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTQsICAgLyoqPCBObyByZXNvdXJjZXMgKi8KKyAgICBCQ01fRVJSX0lOVEVSTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtNSwgICAvKio8IEludGVybmFsIGVycm9yICovCisgICAgQkNNX0VSUl9OT0VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTYsICAgLyoqPCBFbnRyeSBkb2Vzbid0IGV4aXN0ICovCisgICAgQkNNX0VSUl9OT0RFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTcsICAgLyoqPCBEZXZpY2UgZG9lc24ndCBleGlzdCAqLworICAgIEJDTV9FUlJfQUxSRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC04LCAgIC8qKjwgRW50cnkgYWxyZWFkeSBleGlzdHMgKi8KKyAgICBCQ01fRVJSX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtOSwgICAvKio8IE91dCBvZiByYW5nZSAqLworICAgIEJDTV9FUlJfUEVSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0xMCwgIC8qKjwgTm8gcGVybWlzc2lvbiB0byBwZXJmb3JtIGFuIG9wZXJhdGlvbiAqLworICAgIEJDTV9FUlJfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICA9IC0xMSwgIC8qKjwgT3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBCQ01fRVJSX1BBUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTIsICAvKio8IFBhcnNpbmcgZXJyb3IgKi8KKyAgICBCQ01fRVJSX0lOVkFMSURfT1AgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTMsICAvKio8IEludmFsaWQgb3BlcmF0aW9uICovCisgICAgQkNNX0VSUl9JTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTE0LCAgLyoqPCBJL08gZXJyb3IgKi8KKyAgICBCQ01fRVJSX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTUsICAvKio8IE9iamVjdCBpcyBpbiBiYWQgc3RhdGUgKi8KKyAgICBCQ01fRVJSX0RFTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTYsICAvKio8IE9iamVjdCBpcyBkZWxldGVkICovCisgICAgQkNNX0VSUl9UT09fTUFOWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTE3LCAgLyoqPCBUb28gbWFueSBvYmplY3RzICovCisgICAgQkNNX0VSUl9OT19NT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTE4LCAgLyoqPCBObyBtb3JlIGVudHJpZXMgKi8KKyAgICBCQ01fRVJSX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTksICAvKio8IEJ1ZmZlciBvdmVyZmxvdyAqLworICAgIEJDTV9FUlJfQ09NTV9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0yMCwgIC8qKjwgQ29tbXVuaWNhdGlvbiBmYWlsdXJlICovCisgICAgQkNNX0VSUl9OT1RfQ09OTkVDVEVEICAgICAgICAgICAgICAgICAgICAgID0gLTIxLCAgLyoqPCBObyBjb25uZWN0aW9uIHdpdGggdGhlIHRhcmdldCBzeXN0ZW0gKi8KKyAgICBCQ01fRVJSX1NZU0NBTExfRVJSICAgICAgICAgICAgICAgICAgICAgICAgPSAtMjIsICAvKio8IFN5c3RlbSBjYWxsIHJldHVybmVkIGVycm9yICovCisgICAgQkNNX0VSUl9NU0dfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTIzLCAgLyoqPCBSZWNlaXZlZCBtZXNzYWdlIGlzIGluc2FuZSAqLworICAgIEJDTV9FUlJfVE9PX01BTllfUkVRUyAgICAgICAgICAgICAgICAgICAgICA9IC0yNCwgIC8qKjwgVG9vIG1hbnkgb3V0c3RhbmRpbmcgcmVxdWVzdHMgKi8KKyAgICBCQ01fRVJSX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMjUsICAvKio8IE9wZXJhdGlvbiB0aW1lZCBvdXQgKi8KKyAgICBCQ01fRVJSX1RPT19NQU5ZX0ZSQUdTICAgICAgICAgICAgICAgICAgICAgPSAtMjYsICAvKio8IFRvbyBtYW55IGZyYWdtZW50cyAqLworICAgIEJDTV9FUlJfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0yNywgIC8qKjwgR290IE5VTEwgcG9pbnRlciAqLworICAgIEJDTV9FUlJfUkVBRF9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0yOCwgIC8qKjwgQXR0ZW1wdCB0byBzZXQgcmVhZC1vbmx5IHBhcmFtZXRlciAqLworICAgIEJDTV9FUlJfT05VX0VSUl9SRVNQICAgICAgICAgICAgICAgICAgICAgICA9IC0yOSwgIC8qKjwgT05VIHJldHVybmVkIGFuIGVycm9yIHJlc3BvbnNlICovCisgICAgQkNNX0VSUl9NQU5EQVRPUllfUEFSTV9JU19NSVNTSU5HICAgICAgICAgID0gLTMwLCAgLyoqPCBNYW5kYXRvcnkgcGFyYW1ldGVyIGlzIG1pc3NpbmcgKi8KKyAgICBCQ01fRVJSX0tFWV9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMzEsICAvKio8IEtleSBmaWVsZCB3YXMgb3V0IG9mIHJhbmdlICovCisgICAgQkNNX0VSUl9RVUVVRV9FTVBUWSAgICAgICAgICAgICAgICAgICAgICAgID0gLTMyLCAgLyoqPCBSeCBQQ0llIHF1ZXVlIGVtcHR5ICovCisgICAgQkNNX0VSUl9RVUVVRV9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgID0gLTMzLCAgLyoqPCBUeCBQQ0llIHF1ZXVlIGZ1bGwgKi8KKyAgICBCQ01fRVJSX1RPT19MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMzQsICAvKio8IFByb2Nlc3NpbmcgaXMgdGFraW5nIHRvbyBsb25nLCBidXQgd2lsbCBmaW5pc2ggZXZlbnR1YWxseSAqLworICAgIEJDTV9FUlJfSU5TVUZGSUNJRU5UX0xJU1RfTUVNICAgICAgICAgICAgICA9IC0zNSwgIC8qKjwgTm90IGVub3VnaCBtZW1vcnkgd2FzIHByb3ZpZGVkIGZvciB2YXJpYWJsZS1sZW5ndGggbGlzdHMgKi8KKworICAgIEJDTV9FUlJfT1VUX09GX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICA9IC0zNiwgIC8qKjwgU2VxdWVuY2UgbnVtYmVyIG9yIG9wZXJhdGlvbiBzdGVwIHdhcyBvdXQgb2Ygc3luYy4gKi8KKyAgICBCQ01fRVJSX0NIRUNLU1VNICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMzcsICAvKio8IENoZWNrc3VtIGVycm9yICovCisgICAgQkNNX0VSUl9JTUFHRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgID0gLTM4LCAgLyoqPCBVbnN1cHBvcnRlZCBmaWxlL2ltYWdlIHR5cGUgKi8KKyAgICBCQ01fRVJSX0lOQ09NUExFVEVfVEVSTUlOQVRJT04gICAgICAgICAgICAgPSAtMzksICAvKio8IEluY29tcGxldGUgcHJlbWF0dXJlIHRlcm1pbmF0aW9uICovCit9IGJjbW9zX2Vycm5vOworCisvKiogTWFwIGVycm9yIGNvZGUgdG8gZXJyb3Igc3RyaW5nCisgKiBccGFyYW1baW5dICAgZXJyICAgICBFcnJvciBjb2RlCisgKiBccmV0dXJucyBFcnJvciBzdHJpbmcKKyAqLworY29uc3QgY2hhciAqYmNtb3Nfc3RyZXJyb3IoYmNtb3NfZXJybm8gZXJyKTsKKworLyoqIEB9IHN5c3RlbV9lcnJubyAqLworCisjZW5kaWYgLyogQkNNT1NfRVJSTk9fSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfaGFzaF90YWJsZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19oYXNoX3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlMTk2MgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfaGFzaF90YWJsZS5jCkBAIC0wLDAgKzEsNDY3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworI2luY2x1ZGUgImJjbW9zX2hhc2hfdGFibGUuaCIKKworI2RlZmluZSBodF9vdmVyaGVhZCAgICAgc2l6ZW9mKHZvaWQgKikKKworLyoqIENyZWF0ZSBhIGhhc2ggdGFibGUgdXNpbmcgYSBibG9jayBwb29sCisgKiAgXHBhcmFtW2luXSBwb29sX3Bhcm0gICAgICAgICAgICBwb2ludGVyIHRvIGJsb2NrIHBvb2wgcGFyYW1ldGVycworICogIFxwYXJhbVtpbl0gbWF4X2RhdGFfZW50cmllcyAgICAgTWF4aW11bSBlbnRyaWVzIHRoZSBoYXNoIHRhYmxlIG5lZWRzIHRvIGhvbGQKKyAqICBccGFyYW1baW5dIGVudHJ5X3NpemUgICAgICAgICAgIFNpemUgb2YgZWFjaCBlbnRyeSBpbiBieXRlcworICogIFxwYXJhbVtpbl0ga2V5X3NpemUgICAgICAgICAgICAgU2l6ZSBvZiBlYWNoIGtleSBpbiBieXRlcworICogIFxyZXR1cm4gcG9pbnRlciB0byBuZXdseSBjcmVhdGVkIGhhc2ggdGFibGUKKyAqLworc3RhdGljIGhhc2hfdGFibGUgKmhhc2hfdGFibGVfY3JlYXRlX2luX3Bvb2woYmNtb3NfYmxrX3Bvb2xfcGFybSAqcG9vbF9wYXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4X2RhdGFfZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV9zaXplKQoreworICAgIHVpbnQzMl90IGxvb2t1cF90YWJsZV9lbnRyaWVzID0gbWF4X2RhdGFfZW50cmllcyArIChtYXhfZGF0YV9lbnRyaWVzIC8gNCk7CisgICAgaGFzaF90YWJsZSAqaHQ7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKHBvb2xfcGFybSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQlVHKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGVudHJ5X3NpemUgKz0ga2V5X3NpemU7CisKKyAgICBodCA9IGJjbW9zX2FsbG9jKHNpemVvZihoYXNoX3RhYmxlKSk7CisgICAgaWYgKGh0ID09IE5VTEwpCisgICAgeworICAgICAgICBCVUcoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaHQtPm9ial9sZW4gPSBlbnRyeV9zaXplOworICAgIGh0LT5rZXlfbGVuID0ga2V5X3NpemU7CisgICAgaHQtPmRhdGFfb2Zmc2V0ID0gaHRfb3ZlcmhlYWQ7CisgICAgaHQtPmh0X2xvb2t1cF90YmxfZW50cmllcyA9IGxvb2t1cF90YWJsZV9lbnRyaWVzOworICAgIGh0LT5odF9tYXhfZGF0YV9lbnRyaWVzID0gbWF4X2RhdGFfZW50cmllczsKKyAgICBodC0+bG9va191cF9lbnRyaWVzX3RibCA9IGJjbW9zX2FsbG9jKGxvb2t1cF90YWJsZV9lbnRyaWVzICogc2l6ZW9mKGh0X2Jsb2NrKSk7CisKKyAgICBpZiAoaHQtPmxvb2tfdXBfZW50cmllc190YmwgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoaHQpOworICAgICAgICBCVUcoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaHQtPmh0X2N1cl9lbnRyaWVzID0gMDsKKyAgICBlcnIgPSBiY21vc19ibGtfcG9vbF9jcmVhdGUoJmh0LT5rZXlfZGF0YV9wb29sLCBwb29sX3Bhcm0pOworCisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShodC0+bG9va191cF9lbnRyaWVzX3RibCk7CisgICAgICAgIGJjbW9zX2ZyZWUoaHQpOworICAgICAgICBCVUcoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGh0LT5odF9tYXhfZGF0YV9lbnRyaWVzID4gaHQtPmh0X2xvb2t1cF90YmxfZW50cmllcykKKyAgICB7CisgICAgICAgIEJVRygpOworICAgIH0KKworICAgIGh0LT5vYmpfbGVuIC09IGh0LT5rZXlfbGVuOworCisgICAgbWVtc2V0KGh0LT5sb29rX3VwX2VudHJpZXNfdGJsLCAwLCBsb29rdXBfdGFibGVfZW50cmllcyAqIHNpemVvZihodF9ibG9jaykpOworICAgIHJldHVybiBodDsKK30KKworaGFzaF90YWJsZSAqaGFzaF90YWJsZV9jcmVhdGUodWludDMyX3QgbWF4X2RhdGFfZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcG9vbF9uYW1lKQoreworICAgIGJjbW9zX2Jsa19wb29sX3Bhcm0gcGFybSA9IHswfTsKKworICAgIHBhcm0ubmFtZSA9IHBvb2xfbmFtZTsKKyAgICBwYXJtLmJsa19zaXplID0gZW50cnlfc2l6ZSArIGtleV9zaXplICsgaHRfb3ZlcmhlYWQ7CisgICAgcGFybS5udW1fYmxrcyA9IG1heF9kYXRhX2VudHJpZXM7CisKKyAgICByZXR1cm4gaGFzaF90YWJsZV9jcmVhdGVfaW5fcG9vbCgmcGFybSwgbWF4X2RhdGFfZW50cmllcywgZW50cnlfc2l6ZSwga2V5X3NpemUpOworfQorCisvKiogSGFzaCBhIGxlbmd0aCBvZiBieXRlcyBpbnRvIGEgdWludDMyX3QKKyAqICBccGFyYW1baW5dIGtleSAgICAgIEJ5dGVzIHRvIGhhc2gKKyAqICBccGFyYW1baW5dIGxlbiAgICAgIE51bWJlciBvZiBieXRlcyBpbiBrZXkKKyAqICBccmV0dXJuIFRoZSBoYXNoIGFzIGEgdWludDMyX3QKKyAqLworc3RhdGljIHVpbnQzMl90IGdldF9oYXNoX2Zvcl9rZXkoY29uc3QgdWludDhfdCAqa2V5LCB1aW50OF90IGxlbikKK3sKKyAgICB1aW50MzJfdCBoYXNoID0gNTM4MTsKKyAgICB1aW50OF90IGk7CisgICAgY29uc3QgdWludDhfdCAqdG1wID0ga2V5OworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IHRtcCsrLCBpKyspCisgICAgeworICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpICsgaGFzaCkgKyAoKnRtcCk7CisgICAgfQorCisgICAgcmV0dXJuIGhhc2g7Cit9CisKKy8qKiBHZXRzIGEgaGFzaCBrZXkgdXNlZCBmb3IgdGhlIGtleURhdGFQb29sIGluIHRoZSBIYXNoVGFibGUKKyAqICBccGFyYW1baW5dIGh0ICAgQXNzb2NpYXRlZCBoYXNodGFibGUgd2UgYXJlIGdldHRpbmcgaGFzaCBmb3Iga2V5IGZvcgorICogIFxwYXJhbVtpbl0ga2V5ICBLZXkgd2UgYXJlIGdldHRpbmcgaGFzaCBmb3IKKyAqICBccmV0dXJuIEFuIGluZGV4IGludG8gdGhlIGtleURhdGFQb29sCisgKi8KK3N0YXRpYyB1aW50MzJfdCBnZXRfaGFzaF92YWxfZm9yX2tleShjb25zdCBoYXNoX3RhYmxlICpodCwgY29uc3QgdWludDhfdCAqa2V5KQoreworICAgIHJldHVybiBnZXRfaGFzaF9mb3Jfa2V5KGtleSwgaHQtPmtleV9sZW4pICUgaHQtPmh0X2xvb2t1cF90YmxfZW50cmllczsKK30KKworLyoqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBrZXkgd2l0aGluIGFuIEh0QmxvY2sKKyAqICBccGFyYW1baW5dIGh0ICAgICAgIEhhc2ggdGFibGUgaW4gcXVlc3Rpb24KKyAqICBccGFyYW1baW5dIGJsb2NrICAgIEh0QmxvY2sgaW4gcXVlc3Rpb24KKyAqICBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSBibG9jaworICovCitzdGF0aWMgdWludDhfdCAqZ2V0X2tleV9mcm9tX2Jsb2NrX2luX3RhYmxlKGNvbnN0IGhhc2hfdGFibGUgKmh0LCBodF9ibG9jayAqYmxvY2spCit7CisgICAgcmV0dXJuKHVpbnQ4X3QgKikgYmxvY2sgKyBodC0+ZGF0YV9vZmZzZXQgKyBodC0+b2JqX2xlbjsKK30KKworLyoqIEdldHMgYW5kIHBvcHVsYXRlcyBhIEh0QmxvY2sgd2l0aCBhbGwgb2YgaXRzIGRhdGEKKyAqICBccGFyYW1baW5dIG5leHQgICAgIE5leHQgYmxvY2sgaW4gdGhpcyBidWNrZXRzIGNoYWluCisgKiAgXHBhcmFtW2luXSBodCAgICAgICBIYXNoIHRhYmxlIGluIHF1ZXN0aW9uCisgKiAgXHBhcmFtW2luXSBrZXkgICAgICBUaGlzIGJsb2NrcyBrZXkKKyAqICBccGFyYW1baW5dIHZhbCAgICAgIFRoaXMgYmxvY2tzIGRhdGEKKyAqICBccmV0dXJuIFRoZSBibG9jayB0aGF0IHdlIGFsbG9jYXRlZCBhbmQgcmV0dXJuZWQKKyAqLworc3RhdGljIGh0X2Jsb2NrICpmaWxsX2h0X2Jsb2NrKGh0X2Jsb2NrICpuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfdGFibGUgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp2YWwpCit7CisgICAgaHRfYmxvY2sgKmRlc3RfYmxvY2sgPSBiY21vc19ibGtfcG9vbF9hbGxvYygmaHQtPmtleV9kYXRhX3Bvb2wpOworCisgICAgaWYgKGRlc3RfYmxvY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIHN0b3JhZ2UgaXMgbmV4dG9iaiBwdHIsIGhhc2ggb2JqLAorCSAgICBrZXkgd2hpY2gga2VlcHMgYWxsIHVpbnQzMl90IGFsaWduZWQuICovCisgICAgICAgIGRlc3RfYmxvY2stPm5leHRfY2hhaW4gPSBuZXh0OworCisgICAgICAgIGlmICh2YWwgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopIGRlc3RfYmxvY2sgKyBodC0+ZGF0YV9vZmZzZXQsIHZhbCwgaHQtPm9ial9sZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWVtc2V0KCh1aW50OF90ICopIGRlc3RfYmxvY2sgKyBodC0+ZGF0YV9vZmZzZXQsMCxodC0+b2JqX2xlbik7CisgICAgICAgIH0KKworICAgICAgICAvKiBOZWVkIHRvIHB1dCBrZXkgaW4gYWZ0ZXIgb2JqICovCisgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgZGVzdF9ibG9jayArIGh0LT5kYXRhX29mZnNldCArIGh0LT5vYmpfbGVuLAorICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgIGh0LT5rZXlfbGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGVzdF9ibG9jazsKK30KKworLyoqIERldGVybWluZSB3aGV0aGVyIHR3byBrZXlzIGluIGEgcGFydGljdWxhciBoYXNoIHRhYmxlIG1hdGNoCisgKiAgXHBhcmFtW2luXSBodCAgICAgICBIYXNodGFibGUKKyAqICBccGFyYW1baW5dIGtleV9hICAgIGZpcnN0IGtleSB0byBjb21wYXJlCisgKiAgXHBhcmFtW2luXSBrZXlfYiAgICBzZWNvbmQga2V5IHRvIGNvbXBhcmUKKyAqICBccmV0dXJuIHdoZXRoZXIgdGhleSBhcmUgdGhlIHNhbWUKKyAqLworc3RhdGljIGJjbW9zX2Jvb2wgaXNfa2V5X21hdGNoKGNvbnN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXlfYSwgY29uc3QgdWludDhfdCAqa2V5X2IpCit7CisgICAgcmV0dXJuIG1lbWNtcChrZXlfYSwga2V5X2IsIGh0LT5rZXlfbGVuKSA9PSAwOworfQorCisvKiogU2VhcmNoZXMgYSBjaGFpbmVkIGJ1Y2tldCBsb29raW5nIGZvciBhbiBpbnN0YW5jZSBvZiB0aGUga2V5LiAgSWYgZm91bmQgcmV0dXJucyB0aGUgYmxvY2sgaWYgZm91bmQgdGhlIGtleSBpbi4KKyAqICBQcmV2IGd1eSBpcyBzZXQgdG8gdGhlIGJsb2NrIGluIHRoZSBjaGFpbiBiZWZvcmUgdGhlIGJsb2NrIHdlIHJldHVybmVkIChleGNlcHQgaW4gdGhlIGNhc2UgKiB3aGVyZSB0aGVyZSBpcyBubworICogIGJsb2NrIGJlZm9yZSB0aGUgb25lIHdlIHJldHVybmVkLgorICogIFxwYXJhbVtpbl0gaHQgICAgICAgICAgIEhhc2hUYWJsZSBpbiBxdWVzdGlvbgorICogIFxwYXJhbVtpbl0ga2V5X3RvX2ZpbmQgIEtleSB3ZSB3b25kZXIgaWYgZXhpc3RzCisgKiAgXHBhcmFtW2luXSBjaGFpbl9zdGFydCAgV2hlcmUgdG8gc3RhcnQgbG9va2luZyBpbiB0aGUgY2hhaW4KKyAqICBccGFyYW1baW5dIHByZXZfYmxvY2sgICBUaGUgcHJldmlvdXMgZ3V5IGJlZm9yZSB0aGUgYmxvY2sgd2UgcmV0dXJuZWQgKGlmIGV4aXN0cykKKyAqICBccmV0dXJuIFRoZSBibG9jayB0aGF0IG1hdGNoZXMgZG9lc0V4aXN0cyAoaWYgZXhpc3RzKQorICovCitzdGF0aWMgaHRfYmxvY2sgKmdldF9rZXlfbG9jX2luX2NoYWluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hfdGFibGUgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleV90b19maW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0X2Jsb2NrICpjaGFpbl9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodF9ibG9jayAqKnByZXZfYmxvY2spCit7CisgICAgKnByZXZfYmxvY2sgPSBOVUxMOworICAgIHdoaWxlIChjaGFpbl9zdGFydCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGlzX2tleV9tYXRjaChodCwga2V5X3RvX2ZpbmQsIGdldF9rZXlfZnJvbV9ibG9ja19pbl90YWJsZShodCwgY2hhaW5fc3RhcnQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNoYWluX3N0YXJ0OworICAgICAgICB9CisgICAgICAgICpwcmV2X2Jsb2NrID0gY2hhaW5fc3RhcnQ7CisgICAgICAgIGNoYWluX3N0YXJ0ID0gY2hhaW5fc3RhcnQtPm5leHRfY2hhaW47CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitiY21vc19ib29sIGhhc2hfdGFibGVfcmVtb3ZlKGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpCit7CisgICAgdWludDMyX3QgaGFzaF92YWwgPSBnZXRfaGFzaF92YWxfZm9yX2tleShodCwga2V5KTsKKyAgICBodF9ibG9jayAqcHJldl9lbnRyeTsKKyAgICBodF9ibG9jayAqZW50cnkgPSBnZXRfa2V5X2xvY19pbl9jaGFpbigKKyAgICAgICAgaHQsCisgICAgICAgIGtleSwKKyAgICAgICAgaHQtPmxvb2tfdXBfZW50cmllc190YmxbaGFzaF92YWxdLm5leHRfY2hhaW4sCisgICAgICAgICZwcmV2X2VudHJ5KTsKKworICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogTm8gb25lIHRvIGRlbGV0ZSAqLworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGh0LT5odF9jdXJfZW50cmllcy0tOworICAgICAgICBpZiAocHJldl9lbnRyeSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBsYXN0IGVudHJ5ICovCisgICAgICAgICAgICBodC0+bG9va191cF9lbnRyaWVzX3RibFtoYXNoX3ZhbF0ubmV4dF9jaGFpbiA9IGVudHJ5LT5uZXh0X2NoYWluOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJldl9lbnRyeS0+bmV4dF9jaGFpbiA9IGVudHJ5LT5uZXh0X2NoYWluOworICAgICAgICB9CisgICAgICAgIGJjbW9zX2Jsa19wb29sX2ZyZWUoZW50cnkpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9Cit9CisKKy8qKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZGF0YSB3aXRoaW4gdGhlIEhUCisgKiAgXHBhcmFtW2luXSBodCAgICAgICAgICAgSGFzaHRhYmxlIGluIHF1ZXN0aW9uCisgKiAgXHBhcmFtW2luXSBibG9ja19wdHIgICAgSHRCbG9jayB0aGF0IHdlIHdvbmRlciB3aGVyZSBpdHMgZGF0YSBpcworICovCitzdGF0aWMgdm9pZCAqZ2V0X2h0X2RhdGFfcHRyKGNvbnN0IGhhc2hfdGFibGUgKmh0LCBodF9ibG9jayAqYmxvY2tfcHRyKQoreworICAgIHJldHVybih1aW50OF90KilibG9ja19wdHIgKyBodC0+ZGF0YV9vZmZzZXQ7Cit9CisKKworLyoqIEdldCBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZQorICogIFxwYXJhbVtpbl0gaHQgICAgICAgcG9pbnRlciB0byBoYXNoIHRhYmxlCisgKiAgXHBhcmFtW2luXSBrZXkgICAgICBwb2ludGVyIHRvIGtleSBkYXRhCisgKiAgXHBhcmFtW2luXSBoYXNoX3ZhbCBoYXNoIHZhbHVlIG9mIGtleQorICogIFxyZXR1cm4gcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRfZ2V0X2ludGVybmFsKGNvbnN0IGhhc2hfdGFibGUgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFzaF92YWwpCit7CisgICAgaHRfYmxvY2sgKnRtcDsKKyAgICBodF9ibG9jayAqcmV0OworICAgIHJldCA9IGdldF9rZXlfbG9jX2luX2NoYWluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodC0+bG9va191cF9lbnRyaWVzX3RibFtoYXNoX3ZhbF0ubmV4dF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXApOworICAgIGlmIChyZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRfaHRfZGF0YV9wdHIoaHQscmV0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKK3ZvaWQgKmhhc2hfdGFibGVfZ2V0KGNvbnN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpCit7CisgICAgdWludDMyX3QgaGFzaFZhbCA9IGdldF9oYXNoX3ZhbF9mb3Jfa2V5KGh0LCBrZXkpOworICAgIHJldHVybiBodF9nZXRfaW50ZXJuYWwoaHQsa2V5LGhhc2hWYWwpOworfQorCit2b2lkICpoYXNoX3RhYmxlX3B1dChoYXNoX3RhYmxlICpodCwgY29uc3QgdWludDhfdCAqa2V5LCBjb25zdCB2b2lkICp2YWwpCit7CisgICAgdm9pZCAqcmV0X2Jsb2NrOworICAgIHVpbnQzMl90IGhhc2hfdmFsOworICAgIGlmIChodC0+aHRfY3VyX2VudHJpZXMgPj0gaHQtPmh0X21heF9kYXRhX2VudHJpZXMpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaGFzaF92YWwgPSBnZXRfaGFzaF92YWxfZm9yX2tleShodCwga2V5KTsKKworICAgIHJldF9ibG9jayA9IGh0X2dldF9pbnRlcm5hbCgoY29uc3QgaGFzaF90YWJsZSAqKSBodCwga2V5LCBoYXNoX3ZhbCk7CisgICAgaWYgKHJldF9ibG9jayAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogcmVwbGFjZSBleGlzdGluZyB2YWx1ZSB3aXRoIG5ldyB2YWx1ZSAqLworICAgICAgICBpZiAodmFsICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweShyZXRfYmxvY2ssIHZhbCwgaHQtPm9ial9sZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWVtc2V0KHJldF9ibG9jaywgMCwgaHQtPm9ial9sZW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRfYmxvY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGh0X2Jsb2NrICpuZXdfYmxvY2s9ZmlsbF9odF9ibG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHQtPmxvb2tfdXBfZW50cmllc190YmxbaGFzaF92YWxdLm5leHRfY2hhaW4sIGh0LCBrZXksIHZhbCk7CisgICAgICAgIGlmIChuZXdfYmxvY2sgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaHQtPmxvb2tfdXBfZW50cmllc190YmxbaGFzaF92YWxdLm5leHRfY2hhaW4gPSBuZXdfYmxvY2s7CisgICAgICAgICAgICBodC0+aHRfY3VyX2VudHJpZXMrKzsKKyAgICAgICAgICAgIHJldHVybiBnZXRfaHRfZGF0YV9wdHIoaHQsbmV3X2Jsb2NrKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCit9CisKK2h0X2l0ZXJhdG9yIGh0X2l0ZXJhdG9yX2dldChjb25zdCBoYXNoX3RhYmxlICpodCkKK3sKKyAgICBodF9pdGVyYXRvciB0b19yZXQ7CisgICAgdG9fcmV0Lmh0ID0gaHQ7CisgICAgdG9fcmV0LmN1cl9pZHggPSAwOworICAgIHRvX3JldC5yZW1vdmVkX2F0ID0gQkNNT1NfRkFMU0U7CisgICAgdG9fcmV0LnN0aWxsX3ZhbGlkID0gQkNNT1NfVFJVRTsKKyAgICB0b19yZXQuY3VyX2Jsb2NrID0gTlVMTDsKKyAgICByZXR1cm4gdG9fcmV0OworfQorCitodF9pdGVyYXRvciBodF9pdGVyYXRvcl9nZXRfYnlfa2V5KGNvbnN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpCit7CisgICAgaHRfYmxvY2sgKnRtcDsKKyAgICB1aW50MzJfdCBoYXNoX3ZhbCA9IGdldF9oYXNoX3ZhbF9mb3Jfa2V5KGh0LCBrZXkpOworICAgIGh0X2l0ZXJhdG9yIHRvX3JldCA9IHt9OworICAgIHRvX3JldC5odCA9IGh0OworICAgIHRvX3JldC5yZW1vdmVkX2F0ID0gQkNNT1NfRkFMU0U7CisgICAgdG9fcmV0LmN1cl9ibG9jayA9IGdldF9rZXlfbG9jX2luX2NoYWluKGh0LCBrZXksIGh0LT5sb29rX3VwX2VudHJpZXNfdGJsW2hhc2hfdmFsXS5uZXh0X2NoYWluLCAmdG1wKTsKKyAgICB0b19yZXQuc3RpbGxfdmFsaWQgPSAodG9fcmV0LmN1cl9ibG9jayAhPSBOVUxMKTsKKyAgICB0b19yZXQuY3VyX2lkeCA9IGhhc2hfdmFsOworCisgICAgcmV0dXJuIHRvX3JldDsKK30KKworLyoqIEFkdmFuY2UgbGluZWFyIHNjYW4gaXRlcmF0b3IKKyAqICBccGFyYW1baW5dIGl0ICAgSXRlcmF0b3IgdG8gYWR2YW5jZQorICovCitzdGF0aWMgdm9pZCBodF9pdGVyYXRvcl9zY2FuX2FkdihodF9pdGVyYXRvciAqaXQpCit7CisgICAgaWYgKGl0LT5jdXJfYmxvY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGl0LT5jdXJfYmxvY2sgPSBpdC0+Y3VyX2Jsb2NrLT5uZXh0X2NoYWluOworICAgICAgICBpZiAoaXQtPmN1cl9ibG9jayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpdC0+c3RpbGxfdmFsaWQgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaXQtPmN1cl9pZHgrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBmaW5kIG5vbiBudWxsIGVudHJ5ICovCisgICAgd2hpbGUgKGl0LT5jdXJfaWR4IDwgaXQtPmh0LT5odF9sb29rdXBfdGJsX2VudHJpZXMpCisgICAgeworICAgICAgICBpZiAoaXQtPmh0LT5sb29rX3VwX2VudHJpZXNfdGJsW2l0LT5jdXJfaWR4XS5uZXh0X2NoYWluICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0LT5jdXJfYmxvY2sgPSBpdC0+aHQtPmxvb2tfdXBfZW50cmllc190YmxbaXQtPmN1cl9pZHhdLm5leHRfY2hhaW47CisgICAgICAgICAgICBpdC0+c3RpbGxfdmFsaWQgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaXQtPmN1cl9pZHgrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpdC0+c3RpbGxfdmFsaWQgPSBCQ01PU19GQUxTRTsKK30KKwordm9pZCBodF9pdGVyYXRvcl9kZXJlZihjb25zdCBodF9pdGVyYXRvciAqaHRpLCB1aW50OF90ICoqa2V5LCB2b2lkICoqb2JqKQoreworICAgIGlmICghaHRpLT5zdGlsbF92YWxpZCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiJXM6IEludmFsaWQgZGVyZWZcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICprZXkgPSBnZXRfa2V5X2Zyb21fYmxvY2tfaW5fdGFibGUoaHRpLT5odCwgaHRpLT5jdXJfYmxvY2spOworICAgICAgICAqb2JqID0gZ2V0X2h0X2RhdGFfcHRyKGh0aS0+aHQsIGh0aS0+Y3VyX2Jsb2NrKTsgICAgLyogdG8gZGF0YSAqLworICAgIH0KK30KKwordm9pZCBodF9pdGVyYXRvcl9yZW1vdmVfYXQoaGFzaF90YWJsZSAqaHQsIGh0X2l0ZXJhdG9yICppdCkKK3sKKyAgICBpZiAoaHQgIT0gaXQtPmh0KQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIlczogSW5jb3JyZWN0IHdyaXRlYWJsZSBoYXNoIHRhYmxlIHBvaW50ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorICAgIGVsc2UgaWYgKGl0LT5yZW1vdmVkX2F0KQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIlczogTm8gZGVsZXRlIHR3aWNlXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50OF90ICprZXk7CisgICAgICAgIHVpbnQ4X3QgKm9iajsKKyAgICAgICAgaHRfaXRlcmF0b3JfZGVyZWYoaXQsICZrZXksICh2b2lkICoqKSAmb2JqKTsKKyAgICAgICAgaXQtPnJlbW92ZWRfYXQgPSBCQ01PU19UUlVFOworICAgICAgICBpdC0+c3RpbGxfdmFsaWQgPSBodF9pdGVyYXRvcl9uZXh0KGl0KTsKKyAgICAgICAgaWYgKCFoYXNoX3RhYmxlX3JlbW92ZShodCwga2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIlczogUmVtb3ZlIGVycm9yXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisgICAgfQorfQorCitiY21vc19ib29sIGh0X2l0ZXJhdG9yX25leHQoaHRfaXRlcmF0b3IgKml0KQoreworICAgIGlmIChpdC0+c3RpbGxfdmFsaWQpCisgICAgeworICAgICAgICBpZiAoaXQtPnJlbW92ZWRfYXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0LT5yZW1vdmVkX2F0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBodF9pdGVyYXRvcl9zY2FuX2FkdihpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGl0LT5zdGlsbF92YWxpZDsgICAvKiBObyBlbnRyeSBmb3VuZCAqLworfQorCit2b2lkIGhhc2hfdGFibGVfY2xlYXIoaGFzaF90YWJsZSAqaHQpCit7CisgICAgaHRfaXRlcmF0b3IgaXQgPSBodF9pdGVyYXRvcl9nZXQoaHQpOworICAgIHdoaWxlIChodF9pdGVyYXRvcl9uZXh0KCZpdCkpCisgICAgeworICAgICAgICBodF9pdGVyYXRvcl9yZW1vdmVfYXQoaHQsICZpdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19oYXNoX3RhYmxlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2hhc2hfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTYxOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19oYXNoX3RhYmxlLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT1NfSEFTSF9UQUJMRV9IXworI2RlZmluZSBCQ01PU19IQVNIX1RBQkxFX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKwordHlwZWRlZiBzdHJ1Y3QgaHRfYmxvY2sgaHRfYmxvY2s7CitzdHJ1Y3QgaHRfYmxvY2sKK3sKKyAgICBodF9ibG9jayAqbmV4dF9jaGFpbjsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDE2X3Qgb2JqX2xlbjsKKyAgICB1aW50OF90IGtleV9sZW47CisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQ7CisgICAgdWludDMyX3QgaHRfbG9va3VwX3RibF9lbnRyaWVzOworICAgIHVpbnQzMl90IGh0X21heF9kYXRhX2VudHJpZXM7CisgICAgYmNtb3NfYmxrX3Bvb2wga2V5X2RhdGFfcG9vbDsKKyAgICBodF9ibG9jayAqbG9va191cF9lbnRyaWVzX3RibDsKKyAgICB1aW50MzJfdCBodF9jdXJfZW50cmllczsKK30gaGFzaF90YWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBoYXNoX3RhYmxlICpodDsKKyAgICB1aW50MzJfdCBjdXJfaWR4OworICAgIGh0X2Jsb2NrICpjdXJfYmxvY2s7CisgICAgYmNtb3NfYm9vbCByZW1vdmVkX2F0OworICAgIGJjbW9zX2Jvb2wgc3RpbGxfdmFsaWQ7Cit9IGh0X2l0ZXJhdG9yOworCisvKiogQ3JlYXRlIGEgaGFzaCB0YWJsZQorICogIFxwYXJhbVtpbl0gbWF4X2RhdGFfZW50cmllcyAgICAgTWF4aW11bSBlbnRyaWVzIHRoZSBoYXNoIHRhYmxlIG5lZWRzIHRvIGhvbGQKKyAqICBccGFyYW1baW5dIGVudHJ5X3NpemUgICAgICAgICAgIFNpemUgb2YgZWFjaCBlbnRyeSBpbiBieXRlcworICogIFxwYXJhbVtpbl0ga2V5X3NpemUgICAgICAgICAgICAgU2l6ZSBvZiBlYWNoIGtleSBpbiBieXRlcworICogIFxwYXJhbVtpbl0gcG9vbF9uYW1lICAgICAgICAgICAgRnJpZW5kbHkgbmFtZSB0byBpZGVudGlmeSB0aGUgaGFzaCB0YWJsZSdzIG1lbW9yeSBwb29sCisgKiAgXHJldHVybiBwb2ludGVyIHRvIG5ld2x5IGNyZWF0ZWQgaGFzaCB0YWJsZQorICovCitoYXNoX3RhYmxlICpoYXNoX3RhYmxlX2NyZWF0ZSh1aW50MzJfdCBtYXhfZGF0YV9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZW50cnlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwb29sX25hbWUpOworCisvKiogUmVtb3ZlcyBhbGwgZW50cmllcyBmcm9tIGEgSGFzaFRhYmxlLgorICogIFxwYXJhbVtpbl0gaHQgICBIYXNoIHRhYmxlIHRvIHJlbW92ZSBhbGwgZW50cmllcyBmcm9tCisgKi8KK3ZvaWQgaGFzaF90YWJsZV9jbGVhcihoYXNoX3RhYmxlICpodCk7CisKKy8qKiBHZXRzIGEgcG9pbnRlciB0byBhbiBlbnRyeSB3aXRoaW4gdGhlIGhhc2ggdGFibGUgKGlmIGV4aXN0cykKKyAqICBccGFyYW1baW5dIGh0ICAgSGFzaHRhYmxlIGluIHF1ZXN0aW9uCisgKiAgXHBhcmFtW2luXSBrZXkgIEtleSB0byBsb29rIGZvci4KKyAqICBccmV0dXJuIE5vbiBudWxsIGlmIHdlIGZvdW5kIGEgZGF0YSBpdGVtIGFzc29jaWF0ZWQgd2l0aCBLRVkuCisgKi8KK3ZvaWQgKmhhc2hfdGFibGVfZ2V0KGNvbnN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpOworCisvKiogUmV0dXJucyBwb2ludGVycyB0byB0aGUga2V5IGFuZCB2YWx1ZSB0aGF0IGFuIGl0ZXJhdG9yIGlzIHBvaW50aW5nIGF0LiBXYXJuaW5nOiBrZXkgbWF5IG5vdCBiZSB1aW50MzJfdCBhbGlnbmVkLgorICogIERPIE5PVCBERUxFVEUgVEhFIEVMRU1FTlQgVEhFIElURVJBVE9SIFBPSU5UUyBBVCBBTkQgQU5EIFRSWSBUTyBVU0UgVEhFIElURVJBVE9SIFNVQlNFUVVFTlRMWS4gSWYgeW91IG5lZWQgdG8gZG8KKyAqICB0aGlzIHVzZSBodF9pdGVyYXRvcl9yZW1vdmVfYXQKKyAqICBccGFyYW1baW5dIGh0aSAgSXRlcmF0b3IKKyAqICBccGFyYW1baW5dIGtleSAgUG9pbnRlciB0byBrZXkgdG8gZmlsbAorICogIFxwYXJhbVtpbl0gb2JqICBQb2ludGVyIHRvIG9iaiB0byBmaWxsLgorICovCit2b2lkIGh0X2l0ZXJhdG9yX2RlcmVmKGNvbnN0IGh0X2l0ZXJhdG9yICpodGksIHVpbnQ4X3QgKiprZXksIHZvaWQgKipvYmopOworCisvKiogR2V0IGFuIGludGVyYXRvciBmb3IgdHJhdmVyc2luZyBhIGhhc2h0YWJsZS4KKyAqICBccGFyYW1baW5dIGh0ICAgSGFzaHRhYmxlIHRvIHRyYXZlcnNlCisgKiAgXHJldHVybiBUaGUgaXRlcmF0b3IuCisgKi8KK2h0X2l0ZXJhdG9yIGh0X2l0ZXJhdG9yX2dldChjb25zdCBoYXNoX3RhYmxlICpodCk7CisKKy8qKiBHZXQgYW4gaW50ZXJhdG9yIGZvciB0cmF2ZXJzaW5nIGEgaGFzaHRhYmxlIGJhc2VkIG9uIGFuIGVudHJ5J3Mga2V5LgorICogIFxwYXJhbVtpbl0gaHQgICBIYXNodGFibGUgdG8gdHJhdmVyc2UKKyAqICBccGFyYW1baW5dIGtleSAga2V5IG9mIGVudHJ5IHRvIHJldHVybgorICogIFxyZXR1cm4gVGhlIGl0ZXJhdG9yLgorICovCitodF9pdGVyYXRvciBodF9pdGVyYXRvcl9nZXRfYnlfa2V5KGNvbnN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpOworCisvKiogQWR2YW5jZXMgYSBIYXNoVGFibGUgaXRlcmF0b3IgdG8gdGhlIG5leHQgbG9jYXRpb24gd2l0aGluIHRoZSBIYXNoVGFibGUuCisgKiAgXHBhcmFtW2luXSBpdCAgIEl0ZXJhdG9yIHRvIGFkdmFuY2UKKyAqICBccmV0dXJuIFRSVUUgaWYgdGhlcmUgd2FzIGEgbmV4dCBlbGVtZW50CisgKi8KK2JjbW9zX2Jvb2wgaHRfaXRlcmF0b3JfbmV4dChodF9pdGVyYXRvciAqaXQpOworCisvKiogRGVsZXRlcyB0aGUgZW50cnkgd2hlcmUgdGhlIGl0ZXJhdG9yIHBvaW50cyB0byBhbmQgYWR2YW5jZXMgdGhlIGl0ZXJhdG9yIHJldHVybmluZyB3aGV0aGVyIHRoZSBhZHZhbmNlIHdvcmtlZCBvcgorICogIG5vdC4KKyAqICBccGFyYW1baW5dIGh0ICAgV3JpdGFibGUgcmVmZXJlbmNlIHRvIHRoZSBoYXNoIHRhYmxlICh0aGUgaXRlcmF0b3Igb25seSBoYXMgcmVhZCBwZXJtaXNzaW9uKQorICogIFxwYXJhbVtpbl0gaXQgICBJdHJlYXRvciBwb2ludGluZyBhdCBlbnRyeSB0byBkZWxldGUuCisgKi8KK3ZvaWQgaHRfaXRlcmF0b3JfcmVtb3ZlX2F0KGhhc2hfdGFibGUgKmh0LCBodF9pdGVyYXRvciAqaXQpOworCisvKiogQXR0ZW1wdHMgdG8gYXNzb2NpYXRlIGtleSB3aXRoIHZhbCBpbiB0aGUgaGFzaCB0YWJsZS4gSWYga2V5IGFscmVhZHkgZXhpc3RzIG92ZXJ3cml0ZXMgd2hhdCB3YXMgYXQga2V5IHdpdGggdmFsLgorICogIE90aGVyd2lzZSBhbGxvY2F0ZXMgYW4gZW50cnkgd2l0aGluIHRoZSBoYXNodGFibGUgZm9yIGtleSBhbmQgY29waWVzIHZhbCBpbnRvIGl0LgorICogIFxwYXJhbVtpbl0gaHQgICBIYXNodGFibGUgdG8gYWRkIG9yIG1vZGlmeQorICogIFxwYXJhbVtpbl0ga2V5ICBLZXkgdG8gdHJ5IGFuZCBhc3NvY2lhdGUgd2l0aCB2YWwuCisgKiAgXHBhcmFtW2luXSB2YWwgIFZhbCB0byBhc3NvY2lhdGUKKyAqICBccmV0dXJuIE5VTEwgaWYgZmFpbCwgZWxzZSBwb2ludGVyIHRvIGp1c3QgYWRkZWQgYmxvY2suCisgKi8KK3ZvaWQgKmhhc2hfdGFibGVfcHV0KGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXksIGNvbnN0IHZvaWQgKnZhbCk7CisKKy8qKiBSZW1vdmVzIGFuIGVudHJ5IChpZiBleGlzdHMpIGZyb20gdGhlIGhhc2ggdGFibGUuCisgKiAgXHBhcmFtW2luXSBodCAgIEhhc2hUYWJsZSB0byByZW1vdmUgZnJvbS4KKyAqICBccGFyYW1baW5dIGtleSAgS2V5IHRvIHJlbW92ZQorICogIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiBhbnl0aGluZyB3YXMgcmVtb3ZlZCwgb3RoZXJ3aXNlIEJDTU9TX0ZBTFNFLgorICovCitiY21vc19ib29sIGhhc2hfdGFibGVfcmVtb3ZlKGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpOworCisjZW5kaWYgLyogSGFzaC5oICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3BhY2suaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfcGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjEwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3BhY2suaApAQCAtMCwwICsxLDY3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTU9TX1BBQ0tfSF8KKyNkZWZpbmUgQkNNT1NfUEFDS19IXworCisKKy8qCisgKiBQYWNraW5nIG1hY3JvcworICoKKyAqIFVzYWdlOgorICogc3RydWN0IF9fUEFDS0VEX0FUVFJfU1RBUlRfXyBteV9wYWNrZWRfc3RydWN0CisgKiB7CisgKiAgICAgIC4uLgorICogfSBfX1BBQ0tFRF9BVFRSX0VORF9fIDsKKyAqCisgKi8KKworI2lmZGVmIF9fR05VQ19fCisKKyNkZWZpbmUgX19QQUNLRURfQVRUUl9TVEFSVF9fCisjZGVmaW5lIF9fUEFDS0VEX0FUVFJfRU5EX18gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKyNlbHNlCisKKyNlcnJvciBkZWZpbmUgX19QQUNLRURfQVRUUl9TVEFSVF9fLCAgX19QQUNLRURfQVRUUl9FTkRfXyBmb3IgdGhpcyBjb21waWxlcgorCisjZW5kaWYKKworLyoKKyAqIE1hY3JvcyBmb3IgYml0LWZpZWxkIG1hbmlwdWxhdGlvbgorICogRm9yIGVhY2ggZmllbGQgRiByZXF1aXJlcyAyIGNvbnN0YW50cworICogLSBGX1MgLSBmaWVsZCBzaGlmdAorICogLSBGX1cgLSBmaWVsZCB3aWR0aAorICovCisjZGVmaW5lIEJDTV9GSUVMRF9HRVQoX3csIF9mKSAgICAgICAgICAgKCgoX3cpPj5fZiAjIyBfUykgJiAoKDEgPDwgX2YgIyMgX1cpIC0gMSkpCisjZGVmaW5lIEJDTV9GSUVMRChfZiwgX3YpICAgICAgICAgICAgICAgKChfdiAmICgoMSA8PCBfZiAjIyBfVykgLSAxKSkgPDwgX2YgIyMgX1MpCisjZGVmaW5lIEJDTV9GSUVMRF9TRVQoX3csIF9mLCBfdikgICAgICAgKF93KSB8PSBCQ01fRklFTEQoX2YsIF92KQorCisKKyNlbmRpZiAvKiBCQ01PU19QQUNLX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3BsYXRmb3JtLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0MGZiMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfcGxhdGZvcm0uaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PU19QTEFURk9STV9IXworI2RlZmluZSBCQ01PU19QTEFURk9STV9IXworCisjaWZuZGVmIEJDTU9TX1NZU1RFTV9IXworI2Vycm9yIFBsZWFzZSBkbyBub3QgaW5jbHVkZSBiY21vc19wbGF0Zm9ybS5oIGRpcmVjdGx5LiBJbmNsdWRlIGJjbW9zX3N5c3RlbS5oCisjZW5kaWYKKworLyoqIEJDTTY4NjIwIENQVSBjb3JlCisgKiBcaW5ncm91cCBzeXN0ZW1fdGFzayAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT1NfQ1BVX0NPUkVfQU5ZLCAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFueSBjb3JlICovCisKKyAgICBCQ01PU19DUFVfQ09SRV9fTlVNX09GID0gMSwgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNvcmVzICovCit9IGJjbW9zX2NvcmU7CisKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9QT05TX09OX0FMTF9ERVZJQ0VTIChCQ01UUl9NQVhfT0xUUyAqIEJDTVRSX01BWF9JTlNUQU5DRVMpCisKKy8qKiBCQ002ODYyMCBtb2R1bGUKKyAqIFxpbmdyb3VwIHN5c3RlbV9tb2R1bGUKKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT1NfTU9EVUxFX0lEX05PTkUsICAgICAgICAgICAgICAgICAgICAgICAvKio8IG5vIG1vZHVsZSAqLworCisjaWZkZWYgQkNNT1NfU1lTX1VOSVRURVNUCisgICAgQkNNT1NfTU9EVUxFX0lEX1RFU1QxLAorICAgIEJDTU9TX01PRFVMRV9JRF9URVNUMiwKKyNlbmRpZgorICAgIC8qIEVhY2ggRGV2aWNlIChCQ002ODYyWCkgbXVzdCBoYXZlIGl0cyBvd24gZGVkaWNhdGVkIERldmljZSBDb250cm9sIE1vZHVsZSBhdCB0aGUgaG9zdCAqLworICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVYwLAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVYxLAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVYyLAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVYzLAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVY0LAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVY1LAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVY2LAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVY3LAorCisgICAgLyogQ0xJIG92ZXIgUENJZSBjbGllbnQgKi8KKyAgICBCQ01PU19NT0RVTEVfSURfQ0xJX09WRVJfUENJRSwKKworICAgIC8qIFByb3RlY3Rpb24gc3dpdGNoaW5nIHVzZXIgYXBwbGljYXRpb24gKi8KKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX1BTLAorCisgICAgLyogUmVtb3RlIENMSSAqLworICAgIEJDTU9TX01PRFVMRV9JRF9SRU1PVEVfQ0xJX0RFVjAsCisKKyAgICAvKiBSZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uIChUbyBzdXBwb3J0IG11bHRpcGxlIGRldmljZXMgbmVlZCB0byBhZGQgbnVtYmVyIG9mIGRldmljZXMgdG8gcHJldmlvdXMgdmFsdWUpICovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9SRU1PVEVfTE9HR0VSX0RFVjAgPSBCQ01PU19NT0RVTEVfSURfUkVNT1RFX0NMSV9ERVYwICsgQkNNVFJfTUFYX09MVFMsCisKKyAgICAvKiBPTUNJIFNXIGRvd25sb2FkIHVzZXIgYXBwbGljYXRpb24gKFRvIHN1cHBvcnQgbXVsdGlwbGUgZGV2aWNlcyBuZWVkIHRvIGFkZCBudW1iZXIgb2YgZGV2aWNlcyB0byBwcmV2aW91cyB2YWx1ZSkgKi8KKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NQ0lfU1dETF9ERVYwID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9SRU1PVEVfTE9HR0VSX0RFVjAgKyBCQ01UUl9NQVhfT0xUUywKKworICAgIC8qIEdQT04gbWFjIGxlYXJuaW5nIC8gYWdpbmcgdXNlciBhcHBsaWNhdGlvbiAoVG8gc3VwcG9ydCBtdWx0aXBsZSBkZXZpY2VzIG5lZWQgdG8gYWRkIG51bWJlciBvZiBkZXZpY2VzIHRvIHByZXZpb3VzIHZhbHVlKSovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX01BQ19MRUFSTklOR19ERVYwID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9PTUNJX1NXRExfREVWMCArIEJDTVRSX01BWF9PTFRTLAorCisgICAgLyogR1BPTiBzdHJlc3MgdXNlciBhcHBsaWNhdGlvbiAoVG8gc3VwcG9ydCBtdWx0aXBsZSBkZXZpY2VzIG5lZWQgdG8gYWRkIG51bWJlciBvZiBkZXZpY2VzIHRvIHByZXZpb3VzIHZhbHVlKSovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX1NUUkVTU19ERVYwID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX01BQ19MRUFSTklOR19ERVYwICsgQkNNVFJfTUFYX09MVFMsCisKKyAgICAvKiBHUE9OIERTIE9NQ0kgcGFja2V0cyB1c2VyIGFwcGxpY2F0aW9uIChUbyBzdXBwb3J0IG11bHRpcGxlIGRldmljZXMgbmVlZCB0byBhZGQgbnVtYmVyIG9mIGRldmljZXMgdG8gcHJldmlvdXMgdmFsdWUpKi8KKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0dQT05fRFNfT01DSTBfREVWMCA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfR1BPTl9TVFJFU1NfREVWMCArIEJDTVRSX01BWF9PTFRTLAorCisgICAgLyogR1BPTiBTTiBhY3F1aXNpdGlvbiAoVG8gc3VwcG9ydCBtdWx0aXBsZSBkZXZpY2VzIG5lZWQgdG8gYWRkIG51bWJlciBvZiBkZXZpY2VzIG11bHRpcGx5IHdpdGggbWF4IFBPTiBudW1iZXIgdG8gcHJldmlvdXMgdmFsdWUpKi8KKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0dQT05fU05fQUNRVUlTSVRJT04wX0RFVjAgPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0dQT05fRFNfT01DSTBfREVWMCArIE1BWF9OVU1CRVJfT0ZfUE9OU19PTl9BTExfREVWSUNFUywKKworICAgIC8qIEdQT04gc3RhdGlzdGljcyAoVG8gc3VwcG9ydCBtdWx0aXBsZSBkZXZpY2VzIG5lZWQgdG8gYWRkIG51bWJlciBvZiBkZXZpY2VzIG11bHRpcGx5IHdpdGggbWF4IFBPTiBudW1iZXIgdG8gcHJldmlvdXMgdmFsdWUpICovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX1NUQVRJU1RJQ1MwX0RFVjAgPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0dQT05fU05fQUNRVUlTSVRJT04wX0RFVjAgKyBNQVhfTlVNQkVSX09GX1BPTlNfT05fQUxMX0RFVklDRVMsCisKKyAgICAvKiBHUE9OIFJTU0kgdXNlciBhcHBsaWNhdGlvbiAoVG8gc3VwcG9ydCBtdWx0aXBsZSBkZXZpY2VzIG5lZWQgdG8gYWRkIG51bWJlciBvZiBkZXZpY2VzIG11bHRpcGx5IHdpdGggbWF4IFBPTiBudW1iZXIgdG8gcHJldmlvdXMgdmFsdWUpICovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX1JTU0lfREVWMCA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfR1BPTl9TVEFUSVNUSUNTMF9ERVYwICsgTUFYX05VTUJFUl9PRl9QT05TX09OX0FMTF9ERVZJQ0VTLAorCisgICAgLyogRVBPTiBPQU0gbmVnb3RpYXRpb24gYXBwbGljYXRpb24gKFRvIHN1cHBvcnQgbXVsdGlwbGUgZGV2aWNlcyBuZWVkIHRvIGFkZCBudW1iZXIgb2YgZGV2aWNlcyB0byBwcmV2aW91cyB2YWx1ZSkqLworICAgIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRU9OID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX1JTU0lfREVWMCArIEJDTVRSX01BWF9PTFRTLAorCisgICAgLyogRVBPTiBvcHRpY2FsIG1vbml0b3JpbmcgYXBwbGljYXRpb24gKi8KKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NT04gPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VPTiArIEJDTVRSX01BWF9PTFRTLAorCisgICAgLyogRVBPTiBIb3N0IGRyaXZlbiBlbmNyeXB0aW9uIGFwcGxpY2F0aW9uICovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9FUE9OX0hERSwKKworICAgIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9PQU0sCisKKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0RQT0VfU0VDLAorCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9JTUFHRV9UUkFOU0ZFUjAgPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0RQT0VfU0VDICsgQkNNVFJfTUFYX09MVFMsCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9JTUFHRV9UUkFOU0ZFUjEsCisKKwlCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09OVV9UVU5JTkdfREVWMCwKKwlCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09OVV9UVU5JTkdfREVWMSwKKworICAgIEJDTU9TX01PRFVMRV9JRF9fTlVNX09GLCAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgbW9kdWxlcyAqLworICAgIEJDTU9TX01PRFVMRV9JRF9JTlZBTElEID0gQkNNT1NfTU9EVUxFX0lEX05PTkUKK30gYmNtb3NfbW9kdWxlX2lkOworCisvKiogQkNNNjg2MjAgZXZlbnQgZ3JvdXAuIEVhY2ggZ3JvdXAgc3VwcG9ydHMgdXAgdG8gMzIgZXZlbnRzLgorICogXGluZ3JvdXAgc3lzdGVtX2V2ZW50CisgKi8KK3R5cGVkZWYgZW51bQoreworI2lmZGVmIEJDTU9TX1NZU19VTklUVEVTVAorICAgIEJDTU9TX0VWRU5UX0lEX1RFU1QxLAorICAgIEJDTU9TX0VWRU5UX0lEX1RFU1QyLAorI2Vsc2UKKyAgICBCQ01PU19FVkVOVF9JRF9EVU1NWSwgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnRseSBPUyBzL3cgZG9lc24ndCB1c2UgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIHRoaXMgY29uc3RhbnQgd2hlbiBhZGRpbmcgcmVhbCBldmVudHMgKi8KKyNlbmRpZgorCisgICAgQkNNT1NfRVZFTlRfSURfX05VTV9PRiwgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBldmVudCBncm91cHMgKi8KK30gYmNtb3NfZXZlbnRfaWQ7CisKKy8qKiBNZXNzYWdlIGhhc2ggc2l6ZQorICogXGluZ3JvdXAgc3lzdGVtX21zZworICovCisjZGVmaW5lIEJDTU9TX01TR19IQVNIX1NJWkUgICAgIDUxMgorCisvKiogTWFwbGUgT1MgbWVzc2FnZQorICogXGluZ3JvdXAgc3lzdGVtX21zZworICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PU19NU0dfSURfX0JFR0lOLAorCisgICAgLyogSW50ZXJuYWwgbWVzc2FnZXMgKi8KKyAgICBCQ01PU19NU0dfSURfSU5URVJOQUxfVElNRVIgPSBCQ01PU19NU0dfSURfX0JFR0lOLCAvKio8IEludGVybmFsICJ0aW1lciBtZXNzYWdlIiB0eXBlICovCisgICAgQkNNT1NfTVNHX0lEX0lOVEVSTkFMX0VWRU5ULCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbnRlcm5hbCAiZXZlbnQgbWVzc2FnZSIgdHlwZSAqLworICAgIEJDTU9TX01TR19JRF9JTlRFUk5BTF9JUEMsCisKKyAgICBCQ01PU19NU0dfSURfSU5JVElBVEVfUlhfUE9XRVIsCisgICAgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1RSWF9TVEFUVVMsCisgICAgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JPR1VFX1NDQU4sCisgICAgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JTU0lfUkVBRCwKKworICAgIEJDTU9TX01TR19JRF9HUE9OX1NUUkVTU19TVEFSVCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9TVFJFU1NfVElNRU9VVCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9TVFJFU1NfT05VX0RJU0NPVkVSRUQsCisgICAgQkNNT1NfTVNHX0lEX0dQT05fU1RSRVNTX1BPTl9ERUFDVElWQVRJT05fQ09NUExFVEVELAorICAgIEJDTU9TX01TR19JRF9HUE9OX1NUUkVTU19QT05fQUNUSVZBVElPTl9DT01QTEVURUQsCisgICAgQkNNT1NfTVNHX0lEX0dQT05fU1RSRVNTX0FMTF9PTlVTX0RFQUNUSVZBVElPTl9DT01QTEVURUQsCisgICAgQkNNT1NfTVNHX0lEX0dQT05fU1RSRVNTX0FMTF9PTlVTX0FDVElWQVRJT05fQ09NUExFVEVELAorICAgIEJDTU9TX01TR19JRF9HUE9OX1NUUkVTU19PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9TVFJFU1NfT05VX0FDVElWQVRJT05fQ09NUExFVEVELAorCisgICAgQkNNT1NfTVNHX0lEX0dQT05fRFNfT01DSV9TVEFSVCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9EU19PTUNJX1RJTUVPVVQsCisgICAgQkNNT1NfTVNHX0lEX0dQT05fRFNfT01DSV9TVE9QLAorICAgIEJDTU9TX01TR19JRF9HUE9OX0RTX09NQ0lfREVWSUNFX0NPTk5FQ1RFRCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9EU19PTUNJX0RFVklDRV9ESVNDT05ORUNURUQsCisKKyAgICBCQ01PU19NU0dfSURfR1BPTl9SU1NJX1NUQVJULAorCisgICAgQkNNT1NfTVNHX0lEX0dQT05fU1RBVElTVElDU19TVEFSVCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9TVEFUSVNUSUNTX1RJTUVPVVQsCisgICAgQkNNT1NfTVNHX0lEX0dQT05fU1RBVElTVElDU19TVE9QLAorCisgICAgQkNNT1NfTVNHX0lEX0VPTl9TVEFSVCwKKyAgICBCQ01PU19NU0dfSURfRU9OX1NUT1AsCisgICAgQkNNT1NfTVNHX0lEX0VPTl9QUk9YWV9SWCwKKworICAgIEJDTU9TX01TR19JRF9FUE9OX09BTV9QUk9YWV9SWCwKKyAgICBCQ01PU19NU0dfSURfRVBPTl9PQU1fVElNRU9VVCwKKworICAgIEJDTU9TX01TR19JRF9EUE9FX1NFQ19TVEFSVCwKKyAgICBCQ01PU19NU0dfSURfRFBPRV9TRUNfUlhfT0FNLAorICAgIEJDTU9TX01TR19JRF9EUE9FX1NFQ19SWF9FQVBPTCwKKworCUJDTU9TX01TR19JRF9PTlVfVFVOSU5HX1NUQVJULAorCUJDTU9TX01TR19JRF9PTlVfVFVOSU5HX1NUT1AsCisKKyAgICBCQ01PU19NU0dfSURfX05PTkUsCisgICAgQkNNT1NfTVNHX0lEX19FTkQsCisgICAgQkNNT1NfTVNHX0lEX19GT1JDRTE2ID0gMHg3ZmZmCit9IGJjbW9zX21zZ19pZDsKKworI2RlZmluZSBCQ01PU19NU0dfSURfX05VTV9PRiAoQkNNT1NfTVNHX0lEX19FTkQgLSBCQ01PU19NU0dfSURfX0JFR0lOKQorLyoKKyAqIFRhc2sgcHJpb3JpdGllcworICovCisKKyNkZWZpbmUgVEFTS19QUklPUklUWV9UUkFOU1BPUlRfVFggICAgICAgICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzMKKyNkZWZpbmUgVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUlggICAgICAgICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzgKKyNkZWZpbmUgVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUFJPWFkgICAgICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzkKKyNkZWZpbmUgVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUkVNT1RFX0NMSSAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzkKKyNkZWZpbmUgVEFTS19QUklPUklUWV9ERVZJQ0VfQ09OVFJPTCAgICAgICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEwCisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX1BTICAgICAgICAgICAgICAgICAgQkNNT1NfVEFTS19QUklPUklUWV8xMgorI2RlZmluZSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9FT04gICAgICAgICAgICAgICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMTIKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfT01PTiAgICAgICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEyCisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX0VQT05fSERFICAgICAgICAgICAgQkNNT1NfVEFTS19QUklPUklUWV8xMgorI2RlZmluZSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9EUE9FX1NFQyAgICAgICAgICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMTIKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfR1BPTl9NQUNfTEVBUk5JTkcgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEyCisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX0dQT05fU1RSRVNTICAgICAgICAgQkNNT1NfVEFTS19QUklPUklUWV8xMgorI2RlZmluZSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9HUE9OX1NOX0FDUVVJU0lUSU9OIEJDTU9TX1RBU0tfUFJJT1JJVFlfMTIKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfR1BPTl9EU19PTUNJICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEyCisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX0dQT05fU1RBVElTVElDUyAgICAgQkNNT1NfVEFTS19QUklPUklUWV8xMgorI2RlZmluZSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9PTlVfVFVOSU5HICAgICAgICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMTIKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfR1BPTl9SU1NJICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEyCisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfQ0xJICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT1NfVEFTS19QUklPUklUWV8xNQorI2RlZmluZSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9PTUNJX1NXREwgICAgICAgICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMTcKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfSU1BR0VfVFJBTlNGRVIgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE3CisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfREVWX0xPR19LRVJORUwgICAgICAgICAgICAgICAgQkNNT1NfVEFTS19QUklPUklUWV8yMAorI2RlZmluZSBUQVNLX1BSSU9SSVRZX0RFVl9MT0cgICAgICAgICAgICAgICAgICAgICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMzAKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfUkVNT1RFX0xPR0dFUiAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzMwCisKKworCisKKyNlbmRpZiAvKiBCQ01PU19QTEFURk9STV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19xdWV1ZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNzJlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3F1ZXVlLmgKQEAgLTAsMCArMSw2NTAgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXF1ZXVlLmgJOC41IChCZXJrZWxleSkgOC8yMC85NAorICogJEZyZWVCU0QkCisgKi8KKworI2lmbmRlZiBfU1lTX1FVRVVFX0hfCisjZGVmaW5lCV9TWVNfUVVFVUVfSF8KKworLyogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPiAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgZm91ciB0eXBlcyBvZiBkYXRhIHN0cnVjdHVyZXM6IHNpbmdseS1saW5rZWQgbGlzdHMsCisgKiBzaW5nbHktbGlua2VkIHRhaWwgcXVldWVzLCBsaXN0cyBhbmQgdGFpbCBxdWV1ZXMuCisgKgorICogQSBzaW5nbHktbGlua2VkIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlci4gVGhlIGVsZW1lbnRzCisgKiBhcmUgc2luZ2x5IGxpbmtlZCBmb3IgbWluaW11bSBzcGFjZSBhbmQgcG9pbnRlciBtYW5pcHVsYXRpb24gb3ZlcmhlYWQgYXQKKyAqIHRoZSBleHBlbnNlIG9mIE8obikgcmVtb3ZhbCBmb3IgYXJiaXRyYXJ5IGVsZW1lbnRzLiBOZXcgZWxlbWVudHMgY2FuIGJlCisgKiBhZGRlZCB0byB0aGUgbGlzdCBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50IG9yIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICogRWxlbWVudHMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBoZWFkIG9mIHRoZSBsaXN0IHNob3VsZCB1c2UgdGhlIGV4cGxpY2l0CisgKiBtYWNybyBmb3IgdGhpcyBwdXJwb3NlIGZvciBvcHRpbXVtIGVmZmljaWVuY3kuIEEgc2luZ2x5LWxpbmtlZCBsaXN0IG1heQorICogb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLiAgU2luZ2x5LWxpbmtlZCBsaXN0cyBhcmUgaWRlYWwKKyAqIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsYXJnZSBkYXRhc2V0cyBhbmQgZmV3IG9yIG5vIHJlbW92YWxzIG9yIGZvcgorICogaW1wbGVtZW50aW5nIGEgTElGTyBxdWV1ZS4KKyAqCisgKiBBIHNpbmdseS1saW5rZWQgdGFpbCBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlCisgKiBoZWFkIG9mIHRoZSBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUKKyAqIHNpbmdseSBsaW5rZWQgZm9yIG1pbmltdW0gc3BhY2UgYW5kIHBvaW50ZXIgbWFuaXB1bGF0aW9uIG92ZXJoZWFkIGF0IHRoZQorICogZXhwZW5zZSBvZiBPKG4pIHJlbW92YWwgZm9yIGFyYml0cmFyeSBlbGVtZW50cy4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZAorICogdG8gdGhlIGxpc3QgYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZQorICogZW5kIG9mIHRoZSBsaXN0LiBFbGVtZW50cyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGhlYWQgb2YgdGhlIHRhaWwgcXVldWUKKyAqIHNob3VsZCB1c2UgdGhlIGV4cGxpY2l0IG1hY3JvIGZvciB0aGlzIHB1cnBvc2UgZm9yIG9wdGltdW0gZWZmaWNpZW5jeS4KKyAqIEEgc2luZ2x5LWxpbmtlZCB0YWlsIHF1ZXVlIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCisgKiBTaW5nbHktbGlua2VkIHRhaWwgcXVldWVzIGFyZSBpZGVhbCBmb3IgYXBwbGljYXRpb25zIHdpdGggbGFyZ2UgZGF0YXNldHMKKyAqIGFuZCBmZXcgb3Igbm8gcmVtb3ZhbHMgb3IgZm9yIGltcGxlbWVudGluZyBhIEZJRk8gcXVldWUuCisgKgorICogQSBsaXN0IGlzIGhlYWRlZCBieSBhIHNpbmdsZSBmb3J3YXJkIHBvaW50ZXIgKG9yIGFuIGFycmF5IG9mIGZvcndhcmQKKyAqIHBvaW50ZXJzIGZvciBhIGhhc2ggdGFibGUgaGVhZGVyKS4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkgbGlua2VkCisgKiBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUKKyAqIG9yIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuIEEgbGlzdAorICogbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyAqCisgKiBBIHRhaWwgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRvIHRoZSBoZWFkIG9mIHRoZQorICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseQorICogbGlua2VkIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZSBvcgorICogYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YKKyAqIHRoZSBsaXN0LiBBIHRhaWwgcXVldWUgbWF5IGJlIHRyYXZlcnNlZCBpbiBlaXRoZXIgZGlyZWN0aW9uLgorICoKKyAqIEZvciBkZXRhaWxzIG9uIHRoZSB1c2Ugb2YgdGhlc2UgbWFjcm9zLCBzZWUgdGhlIHF1ZXVlKDMpIG1hbnVhbCBwYWdlLgorICoKKyAqCisgKgkJCQlTTElTVAlMSVNUCVNUQUlMUQlUQUlMUQorICogX0hFQUQJCQkrCSsJKwkrCisgKiBfSEVBRF9JTklUSUFMSVpFUgkJKwkrCSsJKworICogX0VOVFJZCQkJKwkrCSsJKworICogX0lOSVQJCQkrCSsJKwkrCisgKiBfRU1QVFkJCQkrCSsJKwkrCisgKiBfRklSU1QJCQkrCSsJKwkrCisgKiBfTkVYVAkJCSsJKwkrCSsKKyAqIF9QUkVWCQkJLQktCS0JKworICogX0xBU1QJCQktCS0JKwkrCisgKiBfRk9SRUFDSAkJCSsJKwkrCSsKKyAqIF9GT1JFQUNIX1NBRkUJCSsJKwkrCSsKKyAqIF9GT1JFQUNIX1JFVkVSU0UJCS0JLQktCSsKKyAqIF9GT1JFQUNIX1JFVkVSU0VfU0FGRQktCS0JLQkrCisgKiBfSU5TRVJUX0hFQUQJCQkrCSsJKwkrCisgKiBfSU5TRVJUX0JFRk9SRQkJLQkrCS0JKworICogX0lOU0VSVF9BRlRFUgkJKwkrCSsJKworICogX0lOU0VSVF9UQUlMCQkJLQktCSsJKworICogX0NPTkNBVAkJCS0JLQkrCSsKKyAqIF9SRU1PVkVfQUZURVIJCSsJLQkrCS0KKyAqIF9SRU1PVkVfSEVBRAkJCSsJLQkrCS0KKyAqIF9SRU1PVkUJCQkrCSsJKwkrCisgKgorICovCisjaWZkZWYgUVVFVUVfTUFDUk9fREVCVUcKKy8qIFN0b3JlIHRoZSBsYXN0IDIgcGxhY2VzIHRoZSBxdWV1ZSBlbGVtZW50IG9yIGhlYWQgd2FzIGFsdGVyZWQgKi8KK3N0cnVjdCBxbV90cmFjZSB7CisJY2hhciAqIGxhc3RmaWxlOworCWludCBsYXN0bGluZTsKKwljaGFyICogcHJldmZpbGU7CisJaW50IHByZXZsaW5lOworfTsKKworI2RlZmluZQlUUkFDRUJVRglzdHJ1Y3QgcW1fdHJhY2UgdHJhY2U7CisjZGVmaW5lCVRSQVNISVQoeCkJZG8geyh4KSA9ICh2b2lkICopLTE7fSB3aGlsZSAoMCkKKworI2RlZmluZQlRTURfVFJBQ0VfSEVBRChoZWFkKSBkbyB7CQkJCQlcCisJKGhlYWQpLT50cmFjZS5wcmV2bGluZSA9IChoZWFkKS0+dHJhY2UubGFzdGxpbmU7CQlcCisJKGhlYWQpLT50cmFjZS5wcmV2ZmlsZSA9IChoZWFkKS0+dHJhY2UubGFzdGZpbGU7CQlcCisJKGhlYWQpLT50cmFjZS5sYXN0bGluZSA9IF9fTElORV9fOwkJCQlcCisJKGhlYWQpLT50cmFjZS5sYXN0ZmlsZSA9IF9fRklMRV9fOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVFNRF9UUkFDRV9FTEVNKGVsZW0pIGRvIHsJCQkJCVwKKwkoZWxlbSktPnRyYWNlLnByZXZsaW5lID0gKGVsZW0pLT50cmFjZS5sYXN0bGluZTsJCVwKKwkoZWxlbSktPnRyYWNlLnByZXZmaWxlID0gKGVsZW0pLT50cmFjZS5sYXN0ZmlsZTsJCVwKKwkoZWxlbSktPnRyYWNlLmxhc3RsaW5lID0gX19MSU5FX187CQkJCVwKKwkoZWxlbSktPnRyYWNlLmxhc3RmaWxlID0gX19GSUxFX187CQkJCVwKK30gd2hpbGUgKDApCisKKyNlbHNlCisjZGVmaW5lCVFNRF9UUkFDRV9FTEVNKGVsZW0pCisjZGVmaW5lCVFNRF9UUkFDRV9IRUFEKGhlYWQpCisjZGVmaW5lCVRSQUNFQlVGCisjZGVmaW5lCVRSQVNISVQoeCkKKyNlbmRpZgkvKiBRVUVVRV9NQUNST19ERUJVRyAqLworCisvKiBMaW50IHN1cHBvcnQgcmVxdWlyZXMgdHlwZXMgdG8gYmUgZGVmaW5lZCB1c2luZyB0eXBlZGVmcy4KKyAgIE5vIGFkZGluZyAic3RydWN0IiBpbXBsaWNpdGx5CisqLworI2lmZGVmIFVTRV9MSU5UCisjZGVmaW5lIF9RX1RZUEVfQ0FTVCh0eXBlKSAgICAgICAgICAodHlwZSAqKQorI2RlZmluZSBfUV9UWVBFX0ZJRUxEKHR5cGUsIGZpZWxkKSAgdHlwZSBmaWVsZAorI2Vsc2UKKyNkZWZpbmUgX1FfVFlQRV9DQVNUKHR5cGUpICAgICAgICAgIChzdHJ1Y3QgdHlwZSAqKQorI2RlZmluZSBfUV9UWVBFX0ZJRUxEKHR5cGUsIGZpZWxkKSAgc3RydWN0IHR5cGUgZmllbGQKKyNlbmRpZgorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZQlTTElTVF9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnNsaF9maXJzdCk7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCit9CisKKyNkZWZpbmUJU0xJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCB9CisKKyNkZWZpbmUJU0xJU1RfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnNsZV9uZXh0KTsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTTElTVF9FTVBUWShoZWFkKQkoKGhlYWQpLT5zbGhfZmlyc3QgPT0gTlVMTCkKKworI2RlZmluZQlTTElTVF9GSVJTVChoZWFkKQkoKGhlYWQpLT5zbGhfZmlyc3QpCisKKyNkZWZpbmUJU0xJU1RfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSBTTElTVF9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgICh2YXIpOwkJCQkJCQlcCisJICAgICh2YXIpID0gU0xJU1RfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCVNMSVNUX0ZPUkVBQ0hfU0FGRSh2YXIsIGhlYWQsIGZpZWxkLCB0dmFyKQkJCVwKKwlmb3IgKCh2YXIpID0gU0xJU1RfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKSAmJiAoKHR2YXIpID0gU0xJU1RfTkVYVCgodmFyKSwgZmllbGQpLCAxKTsJCVwKKwkgICAgKHZhcikgPSAodHZhcikpCisKKyNkZWZpbmUJU0xJU1RfRk9SRUFDSF9QUkVWUFRSKHZhciwgdmFycCwgaGVhZCwgZmllbGQpCQkJXAorCWZvciAoKHZhcnApID0gJlNMSVNUX0ZJUlNUKChoZWFkKSk7CQkJCVwKKwkgICAgKCh2YXIpID0gKih2YXJwKSkgIT0gTlVMTDsJCQkJCVwKKwkgICAgKHZhcnApID0gJlNMSVNUX05FWFQoKHZhciksIGZpZWxkKSkKKworI2RlZmluZQlTTElTVF9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJU0xJU1RfRklSU1QoKGhlYWQpKSA9IE5VTEw7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNMSVNUX0lOU0VSVF9BRlRFUihzbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlTTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSBTTElTVF9ORVhUKChzbGlzdGVsbSksIGZpZWxkKTsJXAorCVNMSVNUX05FWFQoKHNsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU0xJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlTTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSBTTElTVF9GSVJTVCgoaGVhZCkpOwkJCVwKKwlTTElTVF9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNMSVNUX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5zbGVfbmV4dCkKKworI2RlZmluZQlTTElTVF9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoU0xJU1RfRklSU1QoKGhlYWQpKSA9PSAoZWxtKSkgewkJCQlcCisJCVNMSVNUX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOwkJCVwKKwl9CQkJCQkJCQlcCisJZWxzZSB7CQkJCQkJCQlcCisgICAgICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKmN1cmVsbSkgPSBTTElTVF9GSVJTVCgoaGVhZCkpOwkJXAorCQl3aGlsZSAoU0xJU1RfTkVYVChjdXJlbG0sIGZpZWxkKSAhPSAoZWxtKSkJCVwKKwkJCWN1cmVsbSA9IFNMSVNUX05FWFQoY3VyZWxtLCBmaWVsZCk7CQlcCisJCVNMSVNUX1JFTU9WRV9BRlRFUihjdXJlbG0sIGZpZWxkKTsJCQlcCisJfQkJCQkJCQkJXAorCVRSQVNISVQoKGVsbSktPmZpZWxkLnNsZV9uZXh0KTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU0xJU1RfUkVNT1ZFX0FGVEVSKGVsbSwgZmllbGQpIGRvIHsJCQkJXAorCVNMSVNUX05FWFQoZWxtLCBmaWVsZCkgPQkJCQkJXAorCSAgICBTTElTVF9ORVhUKFNMSVNUX05FWFQoZWxtLCBmaWVsZCksIGZpZWxkKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNMSVNUX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkJCVwKKwlTTElTVF9GSVJTVCgoaGVhZCkpID0gU0xJU1RfTkVYVChTTElTVF9GSVJTVCgoaGVhZCkpLCBmaWVsZCk7CVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBTaW5nbHktbGlua2VkIFRhaWwgcXVldWUgZGVjbGFyYXRpb25zLgorICovCisjZGVmaW5lCVNUQUlMUV9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnN0cWhfZmlyc3QpOy8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqKnN0cWhfbGFzdCk7LyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lCVNUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMLCAmKGhlYWQpLnN0cWhfZmlyc3QgfQorCisjZGVmaW5lCVNUQUlMUV9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqc3RxZV9uZXh0KTsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorCisvKgorICogU2luZ2x5LWxpbmtlZCBUYWlsIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTVEFJTFFfQ09OQ0FUKGhlYWQxLCBoZWFkMikgZG8gewkJCQlcCisJaWYgKCFTVEFJTFFfRU1QVFkoKGhlYWQyKSkpIHsJCQkJCVwKKwkJKihoZWFkMSktPnN0cWhfbGFzdCA9IChoZWFkMiktPnN0cWhfZmlyc3Q7CQlcCisJCShoZWFkMSktPnN0cWhfbGFzdCA9IChoZWFkMiktPnN0cWhfbGFzdDsJCVwKKwkJU1RBSUxRX0lOSVQoKGhlYWQyKSk7CQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfRU1QVFkoaGVhZCkJKChoZWFkKS0+c3RxaF9maXJzdCA9PSBOVUxMKQorCisjZGVmaW5lCVNUQUlMUV9GSVJTVChoZWFkKQkoKGhlYWQpLT5zdHFoX2ZpcnN0KQorCisjZGVmaW5lCVNUQUlMUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKKwlmb3IoKHZhcikgPSBTVEFJTFFfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICh2YXIpOwkJCQkJCQlcCisJICAgKHZhcikgPSBTVEFJTFFfTkVYVCgodmFyKSwgZmllbGQpKQorCisKKyNkZWZpbmUJU1RBSUxRX0ZPUkVBQ0hfU0FGRSh2YXIsIGhlYWQsIGZpZWxkLCB0dmFyKQkJCVwKKwlmb3IgKCh2YXIpID0gU1RBSUxRX0ZJUlNUKChoZWFkKSk7CQkJCVwKKwkgICAgKHZhcikgJiYgKCh0dmFyKSA9IFNUQUlMUV9ORVhUKCh2YXIpLCBmaWVsZCksIDEpOwkJXAorCSAgICAodmFyKSA9ICh0dmFyKSkKKworI2RlZmluZQlTVEFJTFFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCVNUQUlMUV9GSVJTVCgoaGVhZCkpID0gTlVMTDsJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGhlYWQpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX0ZJUlNUKChoZWFkKSk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIHRxZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJaWYgKChTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gU1RBSUxRX05FWFQoKHRxZWxtKSwgZmllbGQpKSA9PSBOVUxMKVwKKwkJKGhlYWQpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlTVEFJTFFfTkVYVCgodHFlbG0pLCBmaWVsZCkgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKFNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBTVEFJTFFfRklSU1QoKGhlYWQpKSkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorCVNUQUlMUV9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNUQUlMUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCVNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBOVUxMOwkJCQlcCisJKihoZWFkKS0+c3RxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCisJKGhlYWQpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNUQUlMUV9MQVNUKGhlYWQsIHR5cGUsIGZpZWxkKQkJCQkJXAorCShTVEFJTFFfRU1QVFkoKGhlYWQpKSA/CQkJCQkJXAorCQlfUV9UWVBFX0NBU1QodHlwZSlOVUxMIDoJCQkJCQkJXAorCSAgICAgICAgKCh0eXBlICopKHZvaWQgKikJCQkJXAorCQkoKGNoYXIgKikoKGhlYWQpLT5zdHFoX2xhc3QpIC0gb2Zmc2V0b2YodHlwZSwgZmllbGQpKSkpCisKKyNkZWZpbmUJU1RBSUxRX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5zdHFlX25leHQpCisKKyNkZWZpbmUJU1RBSUxRX1JFTU9WRShoZWFkLCBlbG0sIHR5cGUsIGZpZWxkKSBkbyB7CQkJXAorCWlmIChTVEFJTFFfRklSU1QoKGhlYWQpKSA9PSAoZWxtKSkgewkJCQlcCisJCVNUQUlMUV9SRU1PVkVfSEVBRCgoaGVhZCksIGZpZWxkKTsJCQlcCisJfQkJCQkJCQkJXAorCWVsc2UgewkJCQkJCQkJXAorICAgICAgICBfUV9UWVBFX0ZJRUxEKHR5cGUsICpjdXJlbG0pID0gU1RBSUxRX0ZJUlNUKChoZWFkKSk7CQlcCisJCXdoaWxlIChTVEFJTFFfTkVYVChjdXJlbG0sIGZpZWxkKSAhPSAoZWxtKSkJCVwKKwkJCWN1cmVsbSA9IFNUQUlMUV9ORVhUKGN1cmVsbSwgZmllbGQpOwkJXAorCQlTVEFJTFFfUkVNT1ZFX0FGVEVSKGhlYWQsIGN1cmVsbSwgZmllbGQpOwkJXAorCX0JCQkJCQkJCVwKKwlUUkFTSElUKChlbG0pLT5maWVsZC5zdHFlX25leHQpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUQUlMUV9SRU1PVkVfU0FGRShoZWFkLCBlbG0sIHR5cGUsIGZpZWxkKSAoeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKmN1cmVsbSkgPSBTVEFJTFFfRklSU1QoKGhlYWQpKTsgICAgICAgICAgICBcCisgICAgICAgIGlmIChjdXJlbG0gPT0gKGVsbSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgU1RBSUxRX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd2hpbGUgKGN1cmVsbSAmJiBTVEFJTFFfTkVYVChjdXJlbG0sIGZpZWxkKSAhPSAoZWxtKSkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJlbG0gPSBTVEFJTFFfTkVYVChjdXJlbG0sIGZpZWxkKTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGN1cmVsbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIFNUQUlMUV9SRU1PVkVfQUZURVIoaGVhZCwgY3VyZWxtLCBmaWVsZCk7ICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRSQVNISVQoKGVsbSktPmZpZWxkLnN0cWVfbmV4dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGN1cmVsbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisjZGVmaW5lCVNUQUlMUV9SRU1PVkVfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKChTVEFJTFFfRklSU1QoKGhlYWQpKSA9CQkJCQlcCisJICAgICBTVEFJTFFfTkVYVChTVEFJTFFfRklSU1QoKGhlYWQpKSwgZmllbGQpKSA9PSBOVUxMKQkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfRklSU1QoKGhlYWQpKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RBSUxRX1JFTU9WRV9BRlRFUihoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoU1RBSUxRX05FWFQoZWxtLCBmaWVsZCkgPQkJCQkJXAorCSAgICAgU1RBSUxRX05FWFQoU1RBSUxRX05FWFQoZWxtLCBmaWVsZCksIGZpZWxkKSkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVEFJTFFfU1dBUChoZWFkMSwgaGVhZDIsIHR5cGUpIGRvIHsJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnN3YXBfZmlyc3QpID0gU1RBSUxRX0ZJUlNUKGhlYWQxKTsJCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqKnN3YXBfbGFzdCkgPSAoaGVhZDEpLT5zdHFoX2xhc3Q7CQkJXAorCVNUQUlMUV9GSVJTVChoZWFkMSkgPSBTVEFJTFFfRklSU1QoaGVhZDIpOwkJCVwKKwkoaGVhZDEpLT5zdHFoX2xhc3QgPSAoaGVhZDIpLT5zdHFoX2xhc3Q7CQkJXAorCVNUQUlMUV9GSVJTVChoZWFkMikgPSBzd2FwX2ZpcnN0OwkJCQlcCisJKGhlYWQyKS0+c3RxaF9sYXN0ID0gc3dhcF9sYXN0OwkJCQkJXAorCWlmIChTVEFJTFFfRU1QVFkoaGVhZDEpKQkJCQkJXAorCQkoaGVhZDEpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX0ZJUlNUKGhlYWQxKTsJCVwKKwlpZiAoU1RBSUxRX0VNUFRZKGhlYWQyKSkJCQkJCVwKKwkJKGhlYWQyKS0+c3RxaF9sYXN0ID0gJlNUQUlMUV9GSVJTVChoZWFkMik7CQlcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBMaXN0IGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZQlETElTVF9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKmxoX2ZpcnN0KTsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKK30KKworI2RlZmluZQlETElTVF9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMIH0KKworI2RlZmluZQlETElTVF9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqbGVfbmV4dCk7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKKyAgICBfUV9UWVBFX0ZJRUxEKHR5cGUsICoqbGVfcHJldik7CS8qIGFkZHJlc3Mgb2YgcHJldmlvdXMgbmV4dCBlbGVtZW50ICovCVwKK30KKworLyoKKyAqIExpc3QgZnVuY3Rpb25zLgorICovCisKKyNpZiAoZGVmaW5lZChfS0VSTkVMKSAmJiBkZWZpbmVkKElOVkFSSUFOVFMpKQorI2RlZmluZQlRTURfRExJU1RfQ0hFQ0tfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKERMSVNUX0ZJUlNUKChoZWFkKSkgIT0gTlVMTCAmJgkJCQlcCisJICAgIERMSVNUX0ZJUlNUKChoZWFkKSktPmZpZWxkLmxlX3ByZXYgIT0JCQlcCisJICAgICAmRExJU1RfRklSU1QoKGhlYWQpKSkJCQkJCVwKKwkJcGFuaWMoIkJhZCBsaXN0IGhlYWQgJXAgZmlyc3QtPnByZXYgIT0gaGVhZCIsIChoZWFkKSk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJUU1EX0RMSVNUX0NIRUNLX05FWFQoZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKERMSVNUX05FWFQoKGVsbSksIGZpZWxkKSAhPSBOVUxMICYmCQkJCVwKKwkgICAgRExJU1RfTkVYVCgoZWxtKSwgZmllbGQpLT5maWVsZC5sZV9wcmV2ICE9CQkJXAorCSAgICAgJigoZWxtKS0+ZmllbGQubGVfbmV4dCkpCQkJCQlcCisJICAgICAJcGFuaWMoIkJhZCBsaW5rIGVsbSAlcCBuZXh0LT5wcmV2ICE9IGVsbSIsIChlbG0pKTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlRTURfRExJU1RfQ0hFQ0tfUFJFVihlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKihlbG0pLT5maWVsZC5sZV9wcmV2ICE9IChlbG0pKQkJCQlcCisJCXBhbmljKCJCYWQgbGluayBlbG0gJXAgcHJldi0+bmV4dCAhPSBlbG0iLCAoZWxtKSk7CVwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZQlRTURfRExJU1RfQ0hFQ0tfSEVBRChoZWFkLCBmaWVsZCkKKyNkZWZpbmUJUU1EX0RMSVNUX0NIRUNLX05FWFQoZWxtLCBmaWVsZCkKKyNkZWZpbmUJUU1EX0RMSVNUX0NIRUNLX1BSRVYoZWxtLCBmaWVsZCkKKyNlbmRpZiAvKiAoX0tFUk5FTCAmJiBJTlZBUklBTlRTKSAqLworCisjZGVmaW5lCURMSVNUX0VNUFRZKGhlYWQpCSgoaGVhZCktPmxoX2ZpcnN0ID09IE5VTEwpCisKKyNkZWZpbmUJRExJU1RfRklSU1QoaGVhZCkJKChoZWFkKS0+bGhfZmlyc3QpCisKKyNkZWZpbmUJRExJU1RfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSBETElTVF9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgICh2YXIpOwkJCQkJCQlcCisJICAgICh2YXIpID0gRExJU1RfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCURMSVNUX0ZPUkVBQ0hfU0FGRSh2YXIsIGhlYWQsIGZpZWxkLCB0dmFyKQkJCVwKKwlmb3IgKCh2YXIpID0gRExJU1RfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKSAmJiAoKHR2YXIpID0gRExJU1RfTkVYVCgodmFyKSwgZmllbGQpLCAxKTsJCVwKKwkgICAgKHZhcikgPSAodHZhcikpCisKKyNkZWZpbmUJRExJU1RfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCURMSVNUX0ZJUlNUKChoZWFkKSkgPSBOVUxMOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlETElTVF9JTlNFUlRfQUZURVIobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlRTURfRExJU1RfQ0hFQ0tfTkVYVChsaXN0ZWxtLCBmaWVsZCk7CQkJCVwKKwlpZiAoKERMSVNUX05FWFQoKGVsbSksIGZpZWxkKSA9IERMSVNUX05FWFQoKGxpc3RlbG0pLCBmaWVsZCkpICE9IE5VTEwpXAorCQlETElTVF9ORVhUKChsaXN0ZWxtKSwgZmllbGQpLT5maWVsZC5sZV9wcmV2ID0JCVwKKwkJICAgICZETElTVF9ORVhUKChlbG0pLCBmaWVsZCk7CQkJCVwKKwlETElTVF9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQubGVfcHJldiA9ICZETElTVF9ORVhUKChsaXN0ZWxtKSwgZmllbGQpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlETElTVF9JTlNFUlRfQkVGT1JFKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJUU1EX0RMSVNUX0NIRUNLX1BSRVYobGlzdGVsbSwgZmllbGQpOwkJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmxlX3ByZXY7CQlcCisJRExJU1RfTkVYVCgoZWxtKSwgZmllbGQpID0gKGxpc3RlbG0pOwkJCQlcCisJKihsaXN0ZWxtKS0+ZmllbGQubGVfcHJldiA9IChlbG0pOwkJCQlcCisJKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2ID0gJkRMSVNUX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJRExJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJUU1EX0RMSVNUX0NIRUNLX0hFQUQoKGhlYWQpLCBmaWVsZCk7CQkJCVwKKwlpZiAoKERMSVNUX05FWFQoKGVsbSksIGZpZWxkKSA9IERMSVNUX0ZJUlNUKChoZWFkKSkpICE9IE5VTEwpCVwKKwkJRExJU1RfRklSU1QoKGhlYWQpKS0+ZmllbGQubGVfcHJldiA9ICZETElTVF9ORVhUKChlbG0pLCBmaWVsZCk7XAorCURMSVNUX0ZJUlNUKChoZWFkKSkgPSAoZWxtKTsJCQkJCVwKKwkoZWxtKS0+ZmllbGQubGVfcHJldiA9ICZETElTVF9GSVJTVCgoaGVhZCkpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJRExJU1RfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLmxlX25leHQpCisKKyNkZWZpbmUJRExJU1RfUkVNT1ZFKGVsbSwgZmllbGQpIGRvIHsJCQkJICAgIFwKKyAgICBpZiAoKGVsbSktPmZpZWxkLmxlX3ByZXYpICB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBRTURfRExJU1RfQ0hFQ0tfTkVYVChlbG0sIGZpZWxkKTsJCQkJXAorICAgICAgICBRTURfRExJU1RfQ0hFQ0tfUFJFVihlbG0sIGZpZWxkKTsJCQkJXAorICAgICAgICBpZiAoRExJU1RfTkVYVCgoZWxtKSwgZmllbGQpICE9IE5VTEwpCQkJXAorCQkgICAgRExJU1RfTkVYVCgoZWxtKSwgZmllbGQpLT5maWVsZC5sZV9wcmV2ID0gCVwKKwkJICAgICAgICAoZWxtKS0+ZmllbGQubGVfcHJldjsJCQkJICAgIFwKKwkJKihlbG0pLT5maWVsZC5sZV9wcmV2ID0gRExJU1RfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorCQlUUkFTSElUKChlbG0pLT5maWVsZC5sZV9uZXh0KTsJCQkJCVwKKwkJVFJBU0hJVCgoZWxtKS0+ZmllbGQubGVfcHJldik7CQkJCQlcCisgICAgfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERMSVNUX1NXQVAoaGVhZDEsIGhlYWQyLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKyAgICBfUV9UWVBFX0ZJRUxEKHR5cGUsICpzd2FwX3RtcCkgPSBETElTVF9GSVJTVCgoaGVhZDEpKTsJCQlcCisJRExJU1RfRklSU1QoKGhlYWQxKSkgPSBETElTVF9GSVJTVCgoaGVhZDIpKTsJCQlcCisJRExJU1RfRklSU1QoKGhlYWQyKSkgPSBzd2FwX3RtcDsJCQkJCVwKKwlpZiAoKHN3YXBfdG1wID0gRExJU1RfRklSU1QoKGhlYWQxKSkpICE9IE5VTEwpCQkJXAorCQlzd2FwX3RtcC0+ZmllbGQubGVfcHJldiA9ICZETElTVF9GSVJTVCgoaGVhZDEpKTsJCVwKKwlpZiAoKHN3YXBfdG1wID0gRExJU1RfRklSU1QoKGhlYWQyKSkpICE9IE5VTEwpCQkJXAorCQlzd2FwX3RtcC0+ZmllbGQubGVfcHJldiA9ICZETElTVF9GSVJTVCgoaGVhZDIpKTsJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBUYWlsIHF1ZXVlIGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZQlUQUlMUV9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnRxaF9maXJzdCk7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqKnRxaF9sYXN0KTsJLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAorCVRSQUNFQlVGCQkJCQkJCVwKK30KKworI2RlZmluZQlUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMLCAmKGhlYWQpLnRxaF9maXJzdCB9CisKKyNkZWZpbmUJVEFJTFFfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnRxZV9uZXh0KTsJICAgIC8qIG5leHQgZWxlbWVudCAqLwkJCVwKKyAgICBfUV9UWVBFX0ZJRUxEKHR5cGUsICoqdHFlX3ByZXYpOwkvKiBhZGRyZXNzIG9mIHByZXZpb3VzIG5leHQgZWxlbWVudCAqLwlcCisJVFJBQ0VCVUYJCQkJCQkJXAorfQorCisvKgorICogVGFpbCBxdWV1ZSBmdW5jdGlvbnMuCisgKi8KKyNpZiAoZGVmaW5lZChfS0VSTkVMKSAmJiBkZWZpbmVkKElOVkFSSUFOVFMpKQorI2RlZmluZQlRTURfVEFJTFFfQ0hFQ0tfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCFUQUlMUV9FTVBUWShoZWFkKSAmJgkJCQkJXAorCSAgICBUQUlMUV9GSVJTVCgoaGVhZCkpLT5maWVsZC50cWVfcHJldiAhPQkJCVwKKwkgICAgICZUQUlMUV9GSVJTVCgoaGVhZCkpKQkJCQkJXAorCQlwYW5pYygiQmFkIHRhaWxxIGhlYWQgJXAgZmlyc3QtPnByZXYgIT0gaGVhZCIsIChoZWFkKSk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJUU1EX1RBSUxRX0NIRUNLX1RBSUwoaGVhZCwgZmllbGQpIGRvIHsJCQkJXAorCWlmICgqKGhlYWQpLT50cWhfbGFzdCAhPSBOVUxMKQkJCQkJXAorCSAgICAJcGFuaWMoIkJhZCB0YWlscSBORVhUKCVwLT50cWhfbGFzdCkgIT0gTlVMTCIsIChoZWFkKSk7IAlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVFNRF9UQUlMUV9DSEVDS19ORVhUKGVsbSwgZmllbGQpIGRvIHsJCQkJXAorCWlmIChUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgIT0gTlVMTCAmJgkJCQlcCisJICAgIFRBSUxRX05FWFQoKGVsbSksIGZpZWxkKS0+ZmllbGQudHFlX3ByZXYgIT0JCQlcCisJICAgICAmKChlbG0pLT5maWVsZC50cWVfbmV4dCkpCQkJCQlcCisJCXBhbmljKCJCYWQgbGluayBlbG0gJXAgbmV4dC0+cHJldiAhPSBlbG0iLCAoZWxtKSk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJUU1EX1RBSUxRX0NIRUNLX1BSRVYoZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCooZWxtKS0+ZmllbGQudHFlX3ByZXYgIT0gKGVsbSkpCQkJCVwKKwkJcGFuaWMoIkJhZCBsaW5rIGVsbSAlcCBwcmV2LT5uZXh0ICE9IGVsbSIsIChlbG0pKTsJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lCVFNRF9UQUlMUV9DSEVDS19IRUFEKGhlYWQsIGZpZWxkKQorI2RlZmluZQlRTURfVEFJTFFfQ0hFQ0tfVEFJTChoZWFkLCBoZWFkbmFtZSkKKyNkZWZpbmUJUU1EX1RBSUxRX0NIRUNLX05FWFQoZWxtLCBmaWVsZCkKKyNkZWZpbmUJUU1EX1RBSUxRX0NIRUNLX1BSRVYoZWxtLCBmaWVsZCkKKyNlbmRpZiAvKiAoX0tFUk5FTCAmJiBJTlZBUklBTlRTKSAqLworCisjZGVmaW5lCVRBSUxRX0NPTkNBVChoZWFkMSwgaGVhZDIsIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoIVRBSUxRX0VNUFRZKGhlYWQyKSkgewkJCQkJXAorCQkqKGhlYWQxKS0+dHFoX2xhc3QgPSAoaGVhZDIpLT50cWhfZmlyc3Q7CQlcCisJCShoZWFkMiktPnRxaF9maXJzdC0+ZmllbGQudHFlX3ByZXYgPSAoaGVhZDEpLT50cWhfbGFzdDsJXAorCQkoaGVhZDEpLT50cWhfbGFzdCA9IChoZWFkMiktPnRxaF9sYXN0OwkJCVwKKwkJVEFJTFFfSU5JVCgoaGVhZDIpKTsJCQkJCVwKKwkJUU1EX1RSQUNFX0hFQUQoaGVhZDEpOwkJCQkJXAorCQlRTURfVFJBQ0VfSEVBRChoZWFkMik7CQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlUQUlMUV9FTVBUWShoZWFkKQkoKGhlYWQpLT50cWhfZmlyc3QgPT0gTlVMTCkKKworI2RlZmluZQlUQUlMUV9GSVJTVChoZWFkKQkoKGhlYWQpLT50cWhfZmlyc3QpCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSBUQUlMUV9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgICh2YXIpOwkJCQkJCQlcCisJICAgICh2YXIpID0gVEFJTFFfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCVRBSUxRX0ZPUkVBQ0hfU0FGRSh2YXIsIGhlYWQsIGZpZWxkLCB0dmFyKQkJCVwKKwlmb3IgKCh2YXIpID0gVEFJTFFfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKSAmJiAoKHR2YXIpID0gVEFJTFFfTkVYVCgodmFyKSwgZmllbGQpLCAxKTsJCVwKKwkgICAgKHZhcikgPSAodHZhcikpCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgaGVhZG5hbWUsIGZpZWxkKQkJXAorCWZvciAoKHZhcikgPSBUQUlMUV9MQVNUKChoZWFkKSwgaGVhZG5hbWUpOwkJCVwKKwkgICAgKHZhcik7CQkJCQkJCVwKKwkgICAgKHZhcikgPSBUQUlMUV9QUkVWKCh2YXIpLCBoZWFkbmFtZSwgZmllbGQpKQorCisjZGVmaW5lCVRBSUxRX0ZPUkVBQ0hfUkVWRVJTRV9TQUZFKHZhciwgaGVhZCwgaGVhZG5hbWUsIGZpZWxkLCB0dmFyKQlcCisJZm9yICgodmFyKSA9IFRBSUxRX0xBU1QoKGhlYWQpLCBoZWFkbmFtZSk7CQkJXAorCSAgICAodmFyKSAmJiAoKHR2YXIpID0gVEFJTFFfUFJFVigodmFyKSwgaGVhZG5hbWUsIGZpZWxkKSwgMSk7CVwKKwkgICAgKHZhcikgPSAodHZhcikpCisKKyNkZWZpbmUJVEFJTFFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCVRBSUxRX0ZJUlNUKChoZWFkKSkgPSBOVUxMOwkJCQkJXAorCShoZWFkKS0+dHFoX2xhc3QgPSAmVEFJTFFfRklSU1QoKGhlYWQpKTsJCQlcCisJUU1EX1RSQUNFX0hFQUQoaGVhZCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlUQUlMUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCVFNRF9UQUlMUV9DSEVDS19ORVhUKGxpc3RlbG0sIGZpZWxkKTsJCQkJXAorCWlmICgoVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gVEFJTFFfTkVYVCgobGlzdGVsbSksIGZpZWxkKSkgIT0gTlVMTClcCisJCVRBSUxRX05FWFQoKGVsbSksIGZpZWxkKS0+ZmllbGQudHFlX3ByZXYgPSAJCVwKKwkJICAgICZUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCk7CQkJCVwKKwllbHNlIHsJCQkJCQkJCVwKKwkJKGhlYWQpLT50cWhfbGFzdCA9ICZUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCk7CQlcCisJCVFNRF9UUkFDRV9IRUFEKGhlYWQpOwkJCQkJXAorCX0JCQkJCQkJCVwKKwlUQUlMUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmVEFJTFFfTkVYVCgobGlzdGVsbSksIGZpZWxkKTsJCVwKKwlRTURfVFJBQ0VfRUxFTSgmKGVsbSktPmZpZWxkKTsJCQkJCVwKKwlRTURfVFJBQ0VfRUxFTSgmbGlzdGVsbS0+ZmllbGQpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9CRUZPUkUobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlRTURfVEFJTFFfQ0hFQ0tfUFJFVihsaXN0ZWxtLCBmaWVsZCk7CQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJXAorCVRBSUxRX05FWFQoKGVsbSksIGZpZWxkKSA9IChsaXN0ZWxtKTsJCQkJXAorCSoobGlzdGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGVsbSk7CQkJCVwKKwkobGlzdGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlRTURfVFJBQ0VfRUxFTSgmKGVsbSktPmZpZWxkKTsJCQkJCVwKKwlRTURfVFJBQ0VfRUxFTSgmbGlzdGVsbS0+ZmllbGQpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJUU1EX1RBSUxRX0NIRUNLX0hFQUQoaGVhZCwgZmllbGQpOwkJCQlcCisJaWYgKChUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBUQUlMUV9GSVJTVCgoaGVhZCkpKSAhPSBOVUxMKQlcCisJCVRBSUxRX0ZJUlNUKChoZWFkKSktPmZpZWxkLnRxZV9wcmV2ID0JCQlcCisJCSAgICAmVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlUQUlMUV9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJlRBSUxRX0ZJUlNUKChoZWFkKSk7CQkJXAorCVFNRF9UUkFDRV9IRUFEKGhlYWQpOwkJCQkJCVwKKwlRTURfVFJBQ0VfRUxFTSgmKGVsbSktPmZpZWxkKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlRTURfVEFJTFFfQ0hFQ0tfVEFJTChoZWFkLCBmaWVsZCk7CQkJCVwKKwlUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBOVUxMOwkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGhlYWQpLT50cWhfbGFzdDsJCQlcCisJKihoZWFkKS0+dHFoX2xhc3QgPSAoZWxtKTsJCQkJCVwKKwkoaGVhZCktPnRxaF9sYXN0ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCQlcCisJUU1EX1RSQUNFX0hFQUQoaGVhZCk7CQkJCQkJXAorCVFNRF9UUkFDRV9FTEVNKCYoZWxtKS0+ZmllbGQpOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlUQUlMUV9MQVNUKGhlYWQsIGhlYWRuYW1lKQkJCQkJXAorCSgqKCgoc3RydWN0IGhlYWRuYW1lICopKChoZWFkKS0+dHFoX2xhc3QpKS0+dHFoX2xhc3QpKQorCisjZGVmaW5lCVRBSUxRX05FWFQoZWxtLCBmaWVsZCkgKChlbG0pLT5maWVsZC50cWVfbmV4dCkKKworI2RlZmluZQlUQUlMUV9QUkVWKGVsbSwgaGVhZG5hbWUsIGZpZWxkKQkJCQlcCisJKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKGVsbSktPmZpZWxkLnRxZV9wcmV2KSktPnRxaF9sYXN0KSkKKworI2RlZmluZQlUQUlMUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJUU1EX1RBSUxRX0NIRUNLX05FWFQoZWxtLCBmaWVsZCk7CQkJCVwKKwlRTURfVEFJTFFfQ0hFQ0tfUFJFVihlbG0sIGZpZWxkKTsJCQkJXAorCWlmICgoVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpKSAhPSBOVUxMKQkJCQlcCisJCVRBSUxRX05FWFQoKGVsbSksIGZpZWxkKS0+ZmllbGQudHFlX3ByZXYgPSAJCVwKKwkJICAgIChlbG0pLT5maWVsZC50cWVfcHJldjsJCQkJXAorCWVsc2UgewkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJXAorCQlRTURfVFJBQ0VfSEVBRChoZWFkKTsJCQkJCVwKKwl9CQkJCQkJCQlcCisJKihlbG0pLT5maWVsZC50cWVfcHJldiA9IFRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlUUkFTSElUKChlbG0pLT5maWVsZC50cWVfbmV4dCk7CQkJCQlcCisJVFJBU0hJVCgoZWxtKS0+ZmllbGQudHFlX3ByZXYpOwkJCQkJXAorCVFNRF9UUkFDRV9FTEVNKCYoZWxtKS0+ZmllbGQpOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUQUlMUV9TV0FQKGhlYWQxLCBoZWFkMiwgdHlwZSwgZmllbGQpIGRvIHsJCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqc3dhcF9maXJzdCkgPSAoaGVhZDEpLT50cWhfZmlyc3Q7CQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKipzd2FwX2xhc3QpID0gKGhlYWQxKS0+dHFoX2xhc3Q7CQkJXAorCShoZWFkMSktPnRxaF9maXJzdCA9IChoZWFkMiktPnRxaF9maXJzdDsJCQlcCisJKGhlYWQxKS0+dHFoX2xhc3QgPSAoaGVhZDIpLT50cWhfbGFzdDsJCQkJXAorCShoZWFkMiktPnRxaF9maXJzdCA9IHN3YXBfZmlyc3Q7CQkJCVwKKwkoaGVhZDIpLT50cWhfbGFzdCA9IHN3YXBfbGFzdDsJCQkJCVwKKwlpZiAoKHN3YXBfZmlyc3QgPSAoaGVhZDEpLT50cWhfZmlyc3QpICE9IE5VTEwpCQkJXAorCQlzd2FwX2ZpcnN0LT5maWVsZC50cWVfcHJldiA9ICYoaGVhZDEpLT50cWhfZmlyc3Q7CVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkMSktPnRxaF9sYXN0ID0gJihoZWFkMSktPnRxaF9maXJzdDsJCVwKKwlpZiAoKHN3YXBfZmlyc3QgPSAoaGVhZDIpLT50cWhfZmlyc3QpICE9IE5VTEwpCQkJXAorCQlzd2FwX2ZpcnN0LT5maWVsZC50cWVfcHJldiA9ICYoaGVhZDIpLT50cWhfZmlyc3Q7CVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkMiktPnRxaF9sYXN0ID0gJihoZWFkMiktPnRxaF9maXJzdDsJCVwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiAhX1NZU19RVUVVRV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19yd19sb2NrLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3J3X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ViNWUwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19yd19sb2NrLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisjaW5jbHVkZSAiYmNtb3NfcndfbG9jay5oIgorCitzdHJ1Y3QgYmNtb3NfcndfbG9jaworeworICAgIC8qIHRoZSBhY3R1YWwgbG9jaywgaGVsZCBieSB0aGUgd3JpdGVyLCB1c2VkIGJ5IHRoZSByZWFkZXIgdG8gc2FmZWx5IG9idGFpbiBhIHJlYWQgbG9jaywgYnV0IG5vdCBoZWxkIHRvIGFsbG93CisgICAgICogbXVsdGlwbGUgcmVhZGVycyAqLworICAgIGJjbW9zX211dGV4IGxvY2s7CisgICAgLyogdXNlZCBieSB0aGUgd3JpdGVyIHRvIHByZXZlbnQgbmV3IHJlYWRlcnMgZnJvbSBvYnRhaW5pbmcgcmVhZCBsb2NrcyB3aGlsZSBhIHdyaXRlciBpcyB3YWl0aW5nICovCisgICAgYmNtb3NfbXV0ZXggcmVhZF9sb2NrOworICAgIC8qIHVzZWQgYnkgcmVhZGVycyB0byBzaWduYWwgd2FpdGluZyB3cml0ZXJzIHRoYXQgdGhleSBoYXZlIGZpbmlzaGVkIHJlYWRpbmcgKi8KKyAgICBiY21vc19zZW0gd3JpdGVfbG9jazsKKyAgICAvKiBjdXJyZW50IG51bWJlciBvZiByZWFkZXJzICovCisgICAgdWludDMyX3QgcmVhZGVyczsKK307CisKK2JjbW9zX2Vycm5vIGJjbW9zX3J3X2xvY2tfY3JlYXRlKGJjbW9zX3J3X2xvY2sgKipsb2NrKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICAqbG9jayA9IChiY21vc19yd19sb2NrKiliY21vc19jYWxsb2Moc2l6ZW9mKGJjbW9zX3J3X2xvY2spKTsKKyAgICBpZiAoKmxvY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJVRygpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gKGVyciA9IGJjbW9zX211dGV4X2NyZWF0ZSgmKCpsb2NrKS0+bG9jaywgMCwgImJjbW9zX3J3X2xvY2tfY3JlYXRlX2xvY2siKSkpCisgICAgeworICAgICAgICBCVUcoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gKGVyciA9IGJjbW9zX211dGV4X2NyZWF0ZSgmKCpsb2NrKS0+cmVhZF9sb2NrLCAwLCAiYmNtb3NfcndfbG9ja19jcmVhdGVfcndfbG9jayIpKSkKKyAgICB7CisgICAgICAgIEJVRygpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAoKmxvY2spLT5yZWFkZXJzID0gMDsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSAoZXJyID0gYmNtb3Nfc2VtX2NyZWF0ZSgmKCpsb2NrKS0+d3JpdGVfbG9jaywgMSwgMCwgImJjbW9zX3J3X2xvY2tfY3JlYXRlX3dyaXRlX2xvY2siKSkpCisgICAgeworICAgICAgICBCVUcoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworLypsaW50IC1lezQ1NX0gc3VwcHJlc3MgInRocmVhZCBtdXRleCBoYXMgbm90IGJlZW4gbG9ja2VkIiAqLwordm9pZCBiY21vc19yd193cml0ZV9sb2NrKGJjbW9zX3J3X2xvY2sqIGxvY2spCit7CisgICAgLyogcHJldmVudCBhbnkgbmV3IHJlYWRlcnMgZnJvbSB0cnlpbmcgdG8gb2J0YWluIGEgcmVhZCBsb2NrICovCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmbG9jay0+cmVhZF9sb2NrKTsKKyAgICAvKiBsb2NrIHRoZSBhY3R1YWwgbG9jayAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmxvY2stPmxvY2spOworICAgIHdoaWxlIChsb2NrLT5yZWFkZXJzICE9IDApCisgICAgeworICAgICAgICAvKiB0aGVyZSBhcmUgc3RpbGwgcmVhZGVycyBob2xkaW5nIHJlYWQgbG9ja3MsIHJlbGVhc2UgdGhlIGxvY2sgKi8KKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZsb2NrLT5sb2NrKTsKKyAgICAgICAgLyogd2FpdCBmb3IgdGhlIHNpZ25hbCBmcm9tIHRoZSBsYXN0IHJlYWRlciBiZWZvcmUgdHJ5aW5nIGFnYWluICovCisgICAgICAgIGJjbW9zX3NlbV93YWl0KCZsb2NrLT53cml0ZV9sb2NrLCBCQ01PU19XQUlUX0ZPUkVWRVIpOworICAgICAgICAvKiBsb2NrIHRoZSBhY3R1YWwgbG9jayBhbmQgY2hlY2sgZm9yIHJlYWRlcnMgYWdhaW4gKi8KKyAgICAgICAgYmNtb3NfbXV0ZXhfbG9jaygmbG9jay0+bG9jayk7CisgICAgfQorICAgIC8qIG5vIG1vcmUgcmVhZGVycywgYWxsb3cgbmV3IHJlYWRlcnMgdG8gd2FpdCBvbiB0aGUgbG9jayAqLworICAgIGJjbW9zX211dGV4X3VubG9jaygmbG9jay0+cmVhZF9sb2NrKTsKK30KKy8qbGludCArZXs0NTR9IHN1cHByZXNzICJ0aHJlYWQgbXV0ZXggaGFzIG5vdCBiZWVuIGxvY2tlZCIgKi8KKwordm9pZCBiY21vc19yd193cml0ZV9yZWxlYXNlKGJjbW9zX3J3X2xvY2sqIGxvY2spCit7CisgICAgLypsaW50IC0tZXs0NTV9IHN1cHByZXNzICJ0aHJlYWQgbXV0ZXggaGFzIG5vdCBiZWVuIGxvY2tlZCIgKi8KKyAgICBiY21vc19tdXRleF91bmxvY2soJmxvY2stPmxvY2spOworfQorCit2b2lkIGJjbW9zX3J3X3JlYWRfbG9jayhiY21vc19yd19sb2NrKiBsb2NrKQoreworICAgIC8qIHdhaXQgZm9yIGFueW9uZSB0cnlpbmcgdG8gZ2V0IGEgd3JpdGUgbG9jayAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmxvY2stPnJlYWRfbG9jayk7CisgICAgLyogd2FpdCBmb3IgdGhlIGxvY2sgdG8gYmUgcmVsZWFzZWQgKi8KKyAgICBiY21vc19tdXRleF9sb2NrKCZsb2NrLT5sb2NrKTsKKyAgICBsb2NrLT5yZWFkZXJzKys7CisgICAgLyogcmVzZXQgdGhlIHNpZ25hbCB0byB0aGUgd3JpdGVycyAqLworICAgIGJjbW9zX3NlbV93YWl0KCZsb2NrLT53cml0ZV9sb2NrLCBCQ01PU19OT19XQUlUKTsKKyAgICAvKiBhbGwgZG9uZSwgcmVsZWFzZSBldmVyeXRoaW5nIHNvIG90aGVyIHJlYWRlcnMgY2FuIGdldCBhIHJlYWQgbG9jayAqLworICAgIGJjbW9zX211dGV4X3VubG9jaygmbG9jay0+bG9jayk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZsb2NrLT5yZWFkX2xvY2spOworfQorCit2b2lkIGJjbW9zX3J3X3JlYWRfcmVsZWFzZShiY21vc19yd19sb2NrKiBsb2NrKQoreworICAgIC8qIGdldCBhIGxvY2sgdG8gcHJldmVudCBpbnRlcnJ1cHRpb25zICovCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmbG9jay0+bG9jayk7CisgICAgaWYgKC0tbG9jay0+cmVhZGVycyA9PSAwKQorICAgIHsKKyAgICAgICAgLyogaWYgd2UncmUgdGhlIGxhc3QgcmVhZGVyLCBzaWduYWwgdGhhdCB0aGUgbG9jayBpcyBhdmFpbGFibGUgZm9yIGEgd3JpdGVyICovCisgICAgICAgIGJjbW9zX3NlbV9wb3N0KCZsb2NrLT53cml0ZV9sb2NrKTsKKyAgICB9CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZsb2NrLT5sb2NrKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19yd19sb2NrLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3J3X2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTJkNTMzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19yd19sb2NrLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoqIEEgd3JpdGUtYmlhc2VkIHJlYWRlcnMtd3JpdGVyIGxvY2sKKyAqICBOT1RFOiBETyBOT1QgYXR0ZW1wdCB0byBvYnRhaW4gYSB3cml0ZSBsb2NrIG9uIGEgdGhyZWFkIHRoYXQgaXMgYWxyZWFkeSBob2xkaW5nIGEgcmVhZCBsb2NrIG9yIHZpY2UgdmVyc2EgLSB0aGlzCisgKiAgd2lsbCByZXN1bHQgaW4gYSBkZWFkbG9jay4gTXVsdGlwbGUgcmVhZCBsb2NrcyBmcm9tIHRoZSBzYW1lIHRocmVhZCBhcmUgc2FmZSwgbXVsdGlwbGUgd3JpdGUgbG9ja3MgYXJlIE5PVC4KKyAqLworI2lmbmRlZiBCQ01PU19SV19MT0NLX0hfCisjZGVmaW5lIEJDTU9TX1JXX0xPQ0tfSF8KKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfcndfbG9jayBiY21vc19yd19sb2NrOworCisvKiogSW5pdGlhbGl6ZSBhIGxvY2sKKyAqICBccGFyYW1bb3V0XSBsb2NrICAgIHRoZSBuZXdseSBjcmVhdGVkIGxvY2sKKyAqICBccmV0dXJuIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfcndfbG9ja19jcmVhdGUoYmNtb3NfcndfbG9jayAqKmxvY2spOworCisvKiogT2J0YWluIGEgd3JpdGUgbG9jaworICogIFxwYXJhbVtpbl0gbG9jayAgICAgdGhlIGxvY2sgdG8gb3BlcmF0ZSBvbgorICovCit2b2lkIGJjbW9zX3J3X3dyaXRlX2xvY2soYmNtb3NfcndfbG9jayogbG9jayk7CisKKy8qKiBSZWxlYXNlIGEgd3JpdGUgbG9jaworICogIFxwYXJhbVtpbl0gbG9jayAgICAgdGhlIGxvY2sgdG8gb3BlcmF0ZSBvbgorICovCit2b2lkIGJjbW9zX3J3X3dyaXRlX3JlbGVhc2UoYmNtb3NfcndfbG9jayogbG9jayk7CisKKy8qKiBPYnRhaW4gYSByZWFkIGxvY2sKKyAqICBccGFyYW1baW5dIGxvY2sgICAgIHRoZSBsb2NrIHRvIG9wZXJhdGUgb24KKyAqLwordm9pZCBiY21vc19yd19yZWFkX2xvY2soYmNtb3NfcndfbG9jayogbG9jayk7CisKKy8qKiBSZWxlYXNlIGEgcmVhZCBsb2NrCisgKiAgXHBhcmFtW2luXSBsb2NrICAgICB0aGUgbG9jayB0byBvcGVyYXRlIG9uCisgKi8KK3ZvaWQgYmNtb3NfcndfcmVhZF9yZWxlYXNlKGJjbW9zX3J3X2xvY2sqIGxvY2spOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3Nfc3lzaWYuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3Nfc3lzaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RmNmRjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19zeXNpZi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgKiBiY21vc19zeXNpZi5oCisgKgorICogVGhpcyBpbnRlcm5hbCBoZWFkZXIgZmlsZSBpbmNsdWRlcyBPUy1zcGVjaWZpYyBzZXJ2aWNlcworICogdGhhdCBhcmUgcmVmZXJyZWQgaW4gT1MtaW5kZXBlbmRlbnQgT1MgYWJzdHJhY3Rpb24gaW1wbGVtZW50YXRpb24KKyAqCisgKi8KKworI2lmbmRlZiBCQ01PU19TWVNJRl9IXworI2RlZmluZSBCQ01PU19TWVNJRl9IXworCisvKgorICogT1Mtc3BlY2lmaWMgaW5pdAorICovCisKKy8qKiBJbml0aWFsaXplIHN5c3RlbSBsaWJyYXJ5CisgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIHN5c3RlbSBmdW5jdGlvbgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3N5c19pbml0KHZvaWQpOworCisvKiogQ2xlYW4tdXAgc3lzdGVtIGxpYnJhcnkKKyAqLwordm9pZCBiY21vc19zeXNfZXhpdCh2b2lkKTsKKworCisvKgorICogVGltZXIgc3VwcG9ydAorICovCisKKy8qIE9TIGFic3RyYWN0aW9uIG11c3QgZGVmaW5lIHN0cnVjdCBiY21vc19zeXNfdGltZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3Nfc3lzX3RpbWVyIGJjbW9zX3N5c190aW1lcjsKKworLyogU3lzdGVtIHRpbWVyIGhhbmRsZXIuIEltcGxlbWVudGVkIGluIGNvbW1vbiBPUyBhYnN0cmFjdGlvbiBzZXJ2aWNlcyAqLwordHlwZWRlZiB2b2lkICgqYmNtb3Nfc3lzX3RpbWVyX2hhbmRsZXIpKHZvaWQgKmRhdGEpOworCisvKiBDcmVhdGUgc3lzdGVtIHRpbWVyCisgKiBJdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkgb25lIGhpZ2gtcmVzb2x1dGlvbiBzeXN0ZW0gdGltZXIgaXMgbmVlZGVkLgorICogSXQgaXMgdXNlZCB0byAia2ljayIgdGltZXIgcG9vbCBpbXBsZW1lbnRlZCBpbiBPUyBhYnN0cmFjdGlvbgorICogXHBhcmFtW2luXSAgIHRpbWVyICAgU3lzdGVtIHRpbWVyCisgKiBccGFyYW1baW5dICAgaGFuZGxlciBUaW1lciBoYW5kbGVyCisgKiBccGFyYW1baW5dICAgZGF0YSAgICBEYXRhIHRvIGJlIHBhc3NlZCB0byB0aGUgaGFuZGxlcgorICogXHJldHVybnMgMCBpZiBPSyBvciBlcnJvciA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3Nfc3lzX3RpbWVyX2NyZWF0ZShiY21vc19zeXNfdGltZXIgKnRpbWVyLCBiY21vc19zeXNfdGltZXJfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKTsKKworLyogRGVzdHJveSBzeXN0ZW0gdGltZXIKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgIFN5c3RlbSB0aW1lcgorICovCit2b2lkIGJjbW9zX3N5c190aW1lcl9kZXN0cm95KGJjbW9zX3N5c190aW1lciAqdGltZXIpOworCisvKiBTdGFydCBzeXN0ZW0gdGltZXIKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgICAgICAgICAgU3lzdGVtIHRpbWVyCisgKiBccGFyYW1baW5dICAgaW50ZXJ2YWwgICAgICAgIEludGVydmFsICh1cykKKyAqLwordm9pZCBiY21vc19zeXNfdGltZXJfc3RhcnQoYmNtb3Nfc3lzX3RpbWVyICp0aW1lciwgdWludDMyX3QgaW50ZXJ2YWwpOworCisvKiBTdG9wIHN5c3RlbSB0aW1lcgorICogXHBhcmFtW2luXSAgIHRpbWVyICAgICAgICAgICBTeXN0ZW0gdGltZXIKKyAqLwordm9pZCBiY21vc19zeXNfdGltZXJfc3RvcChiY21vc19zeXNfdGltZXIgKnRpbWVyKTsKKworI2VuZGlmIC8qIEJDTU9TX1NZU0lGX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3RyZWUuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyZDkxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3RyZWUuaApAQCAtMCwwICsxLDc2NSBAQAorLyoJJE5ldEJTRDogdHJlZS5oLHYgMS44IDIwMDQvMDMvMjggMTk6Mzg6MzAgcHJvdm9zIEV4cCAkCSovCisvKgkkT3BlbkJTRDogdHJlZS5oLHYgMS43IDIwMDIvMTAvMTcgMjE6NTE6NTQgYXJ0IEV4cCAkCSovCisvKiAkRnJlZUJTRCQgKi8KKworLyotCisgKiBDb3B5cmlnaHQgMjAwMiBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYJX0JDTU9TX1RSRUVfSF8KKyNkZWZpbmUJX0JDTU9TX1RSRUVfSF8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGRhdGEgc3RydWN0dXJlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHRyZWVzOgorICogc3BsYXkgdHJlZXMgYW5kIHJlZC1ibGFjayB0cmVlcy4KKyAqCisgKiBBIHNwbGF5IHRyZWUgaXMgYSBzZWxmLW9yZ2FuaXppbmcgZGF0YSBzdHJ1Y3R1cmUuICBFdmVyeSBvcGVyYXRpb24KKyAqIG9uIHRoZSB0cmVlIGNhdXNlcyBhIHNwbGF5IHRvIGhhcHBlbi4gIFRoZSBzcGxheSBtb3ZlcyB0aGUgcmVxdWVzdGVkCisgKiBub2RlIHRvIHRoZSByb290IG9mIHRoZSB0cmVlIGFuZCBwYXJ0bHkgcmViYWxhbmNlcyBpdC4KKyAqCisgKiBUaGlzIGhhcyB0aGUgYmVuZWZpdCB0aGF0IHJlcXVlc3QgbG9jYWxpdHkgY2F1c2VzIGZhc3RlciBsb29rdXBzIGFzCisgKiB0aGUgcmVxdWVzdGVkIG5vZGVzIG1vdmUgdG8gdGhlIHRvcCBvZiB0aGUgdHJlZS4gIE9uIHRoZSBvdGhlciBoYW5kLAorICogZXZlcnkgbG9va3VwIGNhdXNlcyBtZW1vcnkgd3JpdGVzLgorICoKKyAqIFRoZSBCYWxhbmNlIFRoZW9yZW0gYm91bmRzIHRoZSB0b3RhbCBhY2Nlc3MgdGltZSBmb3IgbSBvcGVyYXRpb25zCisgKiBhbmQgbiBpbnNlcnRzIG9uIGFuIGluaXRpYWxseSBlbXB0eSB0cmVlIGFzIE8oKG0gKyBuKWxnIG4pLiAgVGhlCisgKiBhbW9ydGl6ZWQgY29zdCBmb3IgYSBzZXF1ZW5jZSBvZiBtIGFjY2Vzc2VzIHRvIGEgc3BsYXkgdHJlZSBpcyBPKGxnIG4pOworICoKKyAqIEEgcmVkLWJsYWNrIHRyZWUgaXMgYSBiaW5hcnkgc2VhcmNoIHRyZWUgd2l0aCB0aGUgbm9kZSBjb2xvciBhcyBhbgorICogZXh0cmEgYXR0cmlidXRlLiAgSXQgZnVsZmlsbHMgYSBzZXQgb2YgY29uZGl0aW9uczoKKyAqCS0gZXZlcnkgc2VhcmNoIHBhdGggZnJvbSB0aGUgcm9vdCB0byBhIGxlYWYgY29uc2lzdHMgb2YgdGhlCisgKgkgIHNhbWUgbnVtYmVyIG9mIGJsYWNrIG5vZGVzLAorICoJLSBlYWNoIHJlZCBub2RlIChleGNlcHQgZm9yIHRoZSByb290KSBoYXMgYSBibGFjayBwYXJlbnQsCisgKgktIGVhY2ggbGVhZiBub2RlIGlzIGJsYWNrLgorICoKKyAqIEV2ZXJ5IG9wZXJhdGlvbiBvbiBhIHJlZC1ibGFjayB0cmVlIGlzIGJvdW5kZWQgYXMgTyhsZyBuKS4KKyAqIFRoZSBtYXhpbXVtIGhlaWdodCBvZiBhIHJlZC1ibGFjayB0cmVlIGlzIDJsZyAobisxKS4KKyAqLworCisjZGVmaW5lIFNQTEFZX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJdHlwZSAqc3BoX3Jvb3Q7IC8qIHJvb3Qgb2YgdGhlIHRyZWUgKi8JCQkgICAgICAgIFwKK30KKworI2RlZmluZSBTUExBWV9JTklUSUFMSVpFUihyb290KQkJCQkJCVwKKwl7IE5VTEwgfQorCisjZGVmaW5lIFNQTEFZX0lOSVQocm9vdCkgZG8gewkJCQkJCVwKKwkocm9vdCktPnNwaF9yb290ID0gTlVMTDsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2RlZmluZSBTUExBWV9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJdHlwZSAqc3BlX2xlZnQ7IC8qIGxlZnQgZWxlbWVudCAqLwkJCSAgICAgICAgXAorCXR5cGUgKnNwZV9yaWdodDsgLyogcmlnaHQgZWxlbWVudCAqLwkJCSAgICAgICAgXAorfQorCisjZGVmaW5lIFNQTEFZX0xFRlQoZWxtLCBmaWVsZCkJCShlbG0pLT5maWVsZC5zcGVfbGVmdAorI2RlZmluZSBTUExBWV9SSUdIVChlbG0sIGZpZWxkKQkJKGVsbSktPmZpZWxkLnNwZV9yaWdodAorI2RlZmluZSBTUExBWV9ST09UKGhlYWQpCQkoaGVhZCktPnNwaF9yb290CisjZGVmaW5lIFNQTEFZX0VNUFRZKGhlYWQpCQkoU1BMQVlfUk9PVChoZWFkKSA9PSBOVUxMKQorCisvKiBTUExBWV9ST1RBVEVfe0xFRlQsUklHSFR9IGV4cGVjdCB0aGF0IHRtcCBob2xkIFNQTEFZX3tSSUdIVCxMRUZUfSAqLworI2RlZmluZSBTUExBWV9ST1RBVEVfUklHSFQoaGVhZCwgdG1wLCBmaWVsZCkgZG8gewkJCVwKKwlTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKHRtcCwgZmllbGQpOwlcCisJU1BMQVlfUklHSFQodG1wLCBmaWVsZCkgPSAoaGVhZCktPnNwaF9yb290OwkJCVwKKwkoaGVhZCktPnNwaF9yb290ID0gdG1wOwkJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKwkKKyNkZWZpbmUgU1BMQVlfUk9UQVRFX0xFRlQoaGVhZCwgdG1wLCBmaWVsZCkgZG8gewkJCVwKKwlTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPSBTUExBWV9MRUZUKHRtcCwgZmllbGQpOwlcCisJU1BMQVlfTEVGVCh0bXAsIGZpZWxkKSA9IChoZWFkKS0+c3BoX3Jvb3Q7CQkJXAorCShoZWFkKS0+c3BoX3Jvb3QgPSB0bXA7CQkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLyAwKQorCisjZGVmaW5lIFNQTEFZX0xJTktMRUZUKGhlYWQsIHRtcCwgZmllbGQpIGRvIHsJCQkJXAorCVNQTEFZX0xFRlQodG1wLCBmaWVsZCkgPSAoaGVhZCktPnNwaF9yb290OwkJCVwKKwl0bXAgPSAoaGVhZCktPnNwaF9yb290OwkJCQkJCVwKKwkoaGVhZCktPnNwaF9yb290ID0gU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovIDApCisKKyNkZWZpbmUgU1BMQVlfTElOS1JJR0hUKGhlYWQsIHRtcCwgZmllbGQpIGRvIHsJCQkJXAorCVNQTEFZX1JJR0hUKHRtcCwgZmllbGQpID0gKGhlYWQpLT5zcGhfcm9vdDsJCQlcCisJdG1wID0gKGhlYWQpLT5zcGhfcm9vdDsJCQkJCQlcCisJKGhlYWQpLT5zcGhfcm9vdCA9IFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTsJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLyAwKQorCisjZGVmaW5lIFNQTEFZX0FTU0VNQkxFKGhlYWQsIG5vZGUsIGxlZnQsIHJpZ2h0LCBmaWVsZCkgZG8gewkJXAorCVNQTEFZX1JJR0hUKGxlZnQsIGZpZWxkKSA9IFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwlcCisJU1BMQVlfTEVGVChyaWdodCwgZmllbGQpID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpO1wKKwlTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKG5vZGUsIGZpZWxkKTsJXAorCVNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IFNQTEFZX0xFRlQobm9kZSwgZmllbGQpOwlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovIDApCisKKy8qIEdlbmVyYXRlcyBwcm90b3R5cGVzIGFuZCBpbmxpbmUgZnVuY3Rpb25zICovCisKKyNkZWZpbmUgU1BMQVlfUFJPVE9UWVBFKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXApCQkJCVwKK3ZvaWQgbmFtZSMjX1NQTEFZKHN0cnVjdCBuYW1lICosIHR5cGUgKik7CQkJICAgICAgICBcCit2b2lkIG5hbWUjI19TUExBWV9NSU5NQVgoc3RydWN0IG5hbWUgKiwgaW50KTsJCQkJXAordHlwZSAqbmFtZSMjX1NQTEFZX0lOU0VSVChzdHJ1Y3QgbmFtZSAqLCB0eXBlICopOwkJICAgICAgICBcCit0eXBlICpuYW1lIyNfU1BMQVlfUkVNT1ZFKHN0cnVjdCBuYW1lICosIHR5cGUgKik7CQkgICAgICAgIFwKKwkJCQkJCQkJCVwKKy8qIEZpbmRzIHRoZSBub2RlIHdpdGggdGhlIHNhbWUga2V5IGFzIGVsbSAqLwkJCQlcCitzdGF0aWMgX19pbmxpbmUgdHlwZSAqCQkJCQkJICAgICAgICBcCituYW1lIyNfU1BMQVlfRklORChzdHJ1Y3QgbmFtZSAqaGVhZCwgdHlwZSAqZWxtKQkJCSAgICAgICAgXAorewkJCQkJCQkJCVwKKwlpZiAoU1BMQVlfRU1QVFkoaGVhZCkpCQkJCQkJXAorCQlyZXR1cm4oTlVMTCk7CQkJCQkJXAorCW5hbWUjI19TUExBWShoZWFkLCBlbG0pOwkJCQkJXAorCWlmICgoY21wKShlbG0sIChoZWFkKS0+c3BoX3Jvb3QpID09IDApCQkJCVwKKwkJcmV0dXJuIChoZWFkLT5zcGhfcm9vdCk7CQkJCVwKKwlyZXR1cm4gKE5VTEwpOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIF9faW5saW5lIHR5cGUgKgkJCQkJCSAgICAgICAgXAorbmFtZSMjX1NQTEFZX05FWFQoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJbmFtZSMjX1NQTEFZKGhlYWQsIGVsbSk7CQkJCQlcCisJaWYgKFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpICE9IE5VTEwpIHsJCQkJXAorCQllbG0gPSBTUExBWV9SSUdIVChlbG0sIGZpZWxkKTsJCQkJXAorCQl3aGlsZSAoU1BMQVlfTEVGVChlbG0sIGZpZWxkKSAhPSBOVUxMKSB7CQlcCisJCQllbG0gPSBTUExBWV9MRUZUKGVsbSwgZmllbGQpOwkJCVwKKwkJfQkJCQkJCQlcCisJfSBlbHNlCQkJCQkJCQlcCisJCWVsbSA9IE5VTEw7CQkJCQkJXAorCXJldHVybiAoZWxtKTsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBfX2lubGluZSB0eXBlICoJCQkJCQkgICAgICAgIFwKK25hbWUjI19TUExBWV9NSU5fTUFYKHN0cnVjdCBuYW1lICpoZWFkLCBpbnQgdmFsKQkJCVwKK3sJCQkJCQkJCQlcCisJbmFtZSMjX1NQTEFZX01JTk1BWChoZWFkLCB2YWwpOwkJCQkJXAorICAgICAgICByZXR1cm4gKFNQTEFZX1JPT1QoaGVhZCkpOwkJCQkJXAorfQorCisvKiBNYWluIHNwbGF5IG9wZXJhdGlvbi4KKyAqIE1vdmVzIG5vZGUgY2xvc2UgdG8gdGhlIGtleSBvZiBlbG0gdG8gdG9wCisgKi8KKyNkZWZpbmUgU1BMQVlfR0VORVJBVEUobmFtZSwgdHlwZSwgZmllbGQsIGNtcCkJCQkJXAordHlwZSAqCQkJCQkJCQkgICAgICAgIFwKK25hbWUjI19TUExBWV9JTlNFUlQoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCSAgICAgICAgXAorewkJCQkJCQkJCVwKKyAgICBpZiAoU1BMQVlfRU1QVFkoaGVhZCkpIHsJCQkJCQlcCisJICAgIFNQTEFZX0xFRlQoZWxtLCBmaWVsZCkgPSBTUExBWV9SSUdIVChlbG0sIGZpZWxkKSA9IE5VTEw7CVwKKyAgICB9IGVsc2UgewkJCQkJCQkJXAorCSAgICBpbnQgX19jb21wOwkJCQkJCQlcCisJICAgIG5hbWUjI19TUExBWShoZWFkLCBlbG0pOwkJCQkJXAorCSAgICBfX2NvbXAgPSAoY21wKShlbG0sIChoZWFkKS0+c3BoX3Jvb3QpOwkJCVwKKwkgICAgaWYoX19jb21wIDwgMCkgewkJCQkJCVwKKwkJICAgIFNQTEFZX0xFRlQoZWxtLCBmaWVsZCkgPSBTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTtcCisJCSAgICBTUExBWV9SSUdIVChlbG0sIGZpZWxkKSA9IChoZWFkKS0+c3BoX3Jvb3Q7CQlcCisJCSAgICBTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IE5VTEw7CQlcCisJICAgIH0gZWxzZSBpZiAoX19jb21wID4gMCkgewkJCQkJXAorCQkgICAgU1BMQVlfUklHSFQoZWxtLCBmaWVsZCkgPSBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7XAorCQkgICAgU1BMQVlfTEVGVChlbG0sIGZpZWxkKSA9IChoZWFkKS0+c3BoX3Jvb3Q7CQlcCisJCSAgICBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPSBOVUxMOwlcCisJICAgIH0gZWxzZQkJCQkJCQlcCisJCSAgICByZXR1cm4gKChoZWFkKS0+c3BoX3Jvb3QpOwkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgICAoaGVhZCktPnNwaF9yb290ID0gKGVsbSk7CQkJCQkJXAorICAgIHJldHVybiAoTlVMTCk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCit0eXBlICoJCQkJCQkJCSAgICAgICAgXAorbmFtZSMjX1NQTEFZX1JFTU9WRShzdHJ1Y3QgbmFtZSAqaGVhZCwgdHlwZSAqZWxtKQkJICAgICAgICBcCit7CQkJCQkJCQkJXAorCXR5cGUgKl9fdG1wOwkJCQkJCSAgICAgICAgXAorCWlmIChTUExBWV9FTVBUWShoZWFkKSkJCQkJCQlcCisJCXJldHVybiAoTlVMTCk7CQkJCQkJXAorCW5hbWUjI19TUExBWShoZWFkLCBlbG0pOwkJCQkJXAorCWlmICgoY21wKShlbG0sIChoZWFkKS0+c3BoX3Jvb3QpID09IDApIHsJCQlcCisJCWlmIChTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKSB7CVwKKwkJCShoZWFkKS0+c3BoX3Jvb3QgPSBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7XAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCV9fdG1wID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwlcCisJCQkoaGVhZCktPnNwaF9yb290ID0gU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7XAorCQkJbmFtZSMjX1NQTEFZKGhlYWQsIGVsbSk7CQkJXAorCQkJU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID0gX190bXA7CVwKKwkJfQkJCQkJCQlcCisJCXJldHVybiAoZWxtKTsJCQkJCQlcCisJfQkJCQkJCQkJXAorCXJldHVybiAoTlVMTCk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCit2b2lkCQkJCQkJCQkJXAorbmFtZSMjX1NQTEFZKHN0cnVjdCBuYW1lICpoZWFkLCB0eXBlICplbG0pCQkJICAgICAgICBcCit7CQkJCQkJCQkJXAorCXR5cGUgX19ub2RlLCAqX19sZWZ0LCAqX19yaWdodCwgKl9fdG1wOwkJCSAgICAgICAgXAorCWludCBfX2NvbXA7CQkJCQkJCVwKK1wKKwlTUExBWV9MRUZUKCZfX25vZGUsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKCZfX25vZGUsIGZpZWxkKSA9IE5VTEw7XAorCV9fbGVmdCA9IF9fcmlnaHQgPSAmX19ub2RlOwkJCQkJXAorXAorCXdoaWxlICgoX19jb21wID0gKGNtcCkoZWxtLCAoaGVhZCktPnNwaF9yb290KSkgIT0gMCkgewkJXAorCQlpZiAoX19jb21wIDwgMCkgewkJCQkJXAorCQkJX190bXAgPSBTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTsJXAorCQkJaWYgKF9fdG1wID09IE5VTEwpCQkJCVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCWlmICgoY21wKShlbG0sIF9fdG1wKSA8IDApewkJCVwKKwkJCQlTUExBWV9ST1RBVEVfUklHSFQoaGVhZCwgX190bXAsIGZpZWxkKTsJXAorCQkJCWlmIChTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKVwKKwkJCQkJYnJlYWs7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlTUExBWV9MSU5LTEVGVChoZWFkLCBfX3JpZ2h0LCBmaWVsZCk7CQlcCisJCX0gZWxzZSBpZiAoX19jb21wID4gMCkgewkJCQlcCisJCQlfX3RtcCA9IFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTsJXAorCQkJaWYgKF9fdG1wID09IE5VTEwpCQkJCVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCWlmICgoY21wKShlbG0sIF9fdG1wKSA+IDApewkJCVwKKwkJCQlTUExBWV9ST1RBVEVfTEVGVChoZWFkLCBfX3RtcCwgZmllbGQpOwlcCisJCQkJaWYgKFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKVwKKwkJCQkJYnJlYWs7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlTUExBWV9MSU5LUklHSFQoaGVhZCwgX19sZWZ0LCBmaWVsZCk7CQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlTUExBWV9BU1NFTUJMRShoZWFkLCAmX19ub2RlLCBfX2xlZnQsIF9fcmlnaHQsIGZpZWxkKTsJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisvKiBTcGxheSB3aXRoIGVpdGhlciB0aGUgbWluaW11bSBvciB0aGUgbWF4aW11bSBlbGVtZW50CQkJXAorICogVXNlZCB0byBmaW5kIG1pbmltdW0gb3IgbWF4aW11bSBlbGVtZW50IGluIHRyZWUuCQkJXAorICovCQkJCQkJCQkJXAordm9pZCBuYW1lIyNfU1BMQVlfTUlOTUFYKHN0cnVjdCBuYW1lICpoZWFkLCBpbnQgX19jb21wKSAgICAgICAgICAgICAgICAgXAorewkJCQkJCQkJCVwKKwl0eXBlIF9fbm9kZSwgKl9fbGVmdCwgKl9fcmlnaHQsICpfX3RtcDsJCQkgICAgICAgIFwKK1wKKwlTUExBWV9MRUZUKCZfX25vZGUsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKCZfX25vZGUsIGZpZWxkKSA9IE5VTEw7XAorCV9fbGVmdCA9IF9fcmlnaHQgPSAmX19ub2RlOwkJCQkJXAorXAorCXdoaWxlICgxKSB7CQkJCQkJCVwKKwkJaWYgKF9fY29tcCA8IDApIHsJCQkJCVwKKwkJCV9fdG1wID0gU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7CVwKKwkJCWlmIChfX3RtcCA9PSBOVUxMKQkJCQlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQlpZiAoX19jb21wIDwgMCl7CQkJCVwKKwkJCQlTUExBWV9ST1RBVEVfUklHSFQoaGVhZCwgX190bXAsIGZpZWxkKTsJXAorCQkJCWlmIChTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKVwKKwkJCQkJYnJlYWs7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlTUExBWV9MSU5LTEVGVChoZWFkLCBfX3JpZ2h0LCBmaWVsZCk7CQlcCisJCX0gZWxzZSBpZiAoX19jb21wID4gMCkgewkJCQlcCisJCQlfX3RtcCA9IFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTsJXAorCQkJaWYgKF9fdG1wID09IE5VTEwpCQkJCVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCWlmIChfX2NvbXAgPiAwKSB7CQkJCVwKKwkJCQlTUExBWV9ST1RBVEVfTEVGVChoZWFkLCBfX3RtcCwgZmllbGQpOwlcCisJCQkJaWYgKFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKVwKKwkJCQkJYnJlYWs7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlTUExBWV9MSU5LUklHSFQoaGVhZCwgX19sZWZ0LCBmaWVsZCk7CQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlTUExBWV9BU1NFTUJMRShoZWFkLCAmX19ub2RlLCBfX2xlZnQsIF9fcmlnaHQsIGZpZWxkKTsJCVwKK30KKworI2RlZmluZSBTUExBWV9ORUdJTkYJLTEKKyNkZWZpbmUgU1BMQVlfSU5GCTEKKworI2RlZmluZSBTUExBWV9JTlNFUlQobmFtZSwgeCwgeSkJbmFtZSMjX1NQTEFZX0lOU0VSVCh4LCB5KQorI2RlZmluZSBTUExBWV9SRU1PVkUobmFtZSwgeCwgeSkJbmFtZSMjX1NQTEFZX1JFTU9WRSh4LCB5KQorI2RlZmluZSBTUExBWV9GSU5EKG5hbWUsIHgsIHkpCQluYW1lIyNfU1BMQVlfRklORCh4LCB5KQorI2RlZmluZSBTUExBWV9ORVhUKG5hbWUsIHgsIHkpCQluYW1lIyNfU1BMQVlfTkVYVCh4LCB5KQorI2RlZmluZSBTUExBWV9NSU4obmFtZSwgeCkJCShTUExBWV9FTVBUWSh4KSA/IE5VTEwJXAorCQkJCQk6IG5hbWUjI19TUExBWV9NSU5fTUFYKHgsIFNQTEFZX05FR0lORikpCisjZGVmaW5lIFNQTEFZX01BWChuYW1lLCB4KQkJKFNQTEFZX0VNUFRZKHgpID8gTlVMTAlcCisJCQkJCTogbmFtZSMjX1NQTEFZX01JTl9NQVgoeCwgU1BMQVlfSU5GKSkKKworI2RlZmluZSBTUExBWV9GT1JFQUNIKHgsIG5hbWUsIGhlYWQpCQkJCQlcCisJZm9yICgoeCkgPSBTUExBWV9NSU4obmFtZSwgaGVhZCk7CQkJCVwKKwkgICAgICh4KSAhPSBOVUxMOwkJCQkJCVwKKwkgICAgICh4KSA9IFNQTEFZX05FWFQobmFtZSwgaGVhZCwgeCkpCisKKy8qIE1hY3JvcyB0aGF0IGRlZmluZSBhIHJlZC1ibGFjayB0cmVlICovCisjZGVmaW5lIFJCX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJdHlwZSAqcmJoX3Jvb3Q7IC8qIHJvb3Qgb2YgdGhlIHRyZWUgKi8JCQkgICAgICAgIFwKK30KKworI2RlZmluZSBSQl9JTklUSUFMSVpFUihyb290KQkJCQkJCVwKKwl7IE5VTEwgfQorCisjZGVmaW5lIFJCX0lOSVQocm9vdCkgZG8gewkJCQkJCVwKKwkocm9vdCktPnJiaF9yb290ID0gTlVMTDsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2RlZmluZSBSQl9CTEFDSwkwCisjZGVmaW5lIFJCX1JFRAkJMQorI2RlZmluZSBSQl9FTlRSWSh0eXBlKQkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXR5cGUgKnJiZV9sZWZ0OwkJLyogbGVmdCBlbGVtZW50ICovCQkgICAgICAgIFwKKwl0eXBlICpyYmVfcmlnaHQ7CQkvKiByaWdodCBlbGVtZW50ICovCQlcCisJdHlwZSAqcmJlX3BhcmVudDsJLyogcGFyZW50IGVsZW1lbnQgKi8JCSAgICAgICAgXAorCWludCByYmVfY29sb3I7CQkJLyogbm9kZSBjb2xvciAqLwkJXAorfQorCisjZGVmaW5lIFJCX0xFRlQoZWxtLCBmaWVsZCkJCShlbG0pLT5maWVsZC5yYmVfbGVmdAorI2RlZmluZSBSQl9SSUdIVChlbG0sIGZpZWxkKQkJKGVsbSktPmZpZWxkLnJiZV9yaWdodAorI2RlZmluZSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkJCShlbG0pLT5maWVsZC5yYmVfcGFyZW50CisjZGVmaW5lIFJCX0NPTE9SKGVsbSwgZmllbGQpCQkoZWxtKS0+ZmllbGQucmJlX2NvbG9yCisjZGVmaW5lIFJCX1JPT1RfTk9ERShoZWFkKQkJKGhlYWQpLT5yYmhfcm9vdAorI2RlZmluZSBSQl9FTVBUWShoZWFkKQkJCShSQl9ST09UX05PREUoaGVhZCkgPT0gTlVMTCkKKworI2RlZmluZSBSQl9TRVQoZWxtLCBwYXJlbnQsIGZpZWxkKSBkbyB7CQkJCQlcCisJUkJfUEFSRU5UKGVsbSwgZmllbGQpID0gcGFyZW50OwkJCQkJXAorCVJCX0xFRlQoZWxtLCBmaWVsZCkgPSBSQl9SSUdIVChlbG0sIGZpZWxkKSA9IE5VTEw7CQlcCisJUkJfQ09MT1IoZWxtLCBmaWVsZCkgPSBSQl9SRUQ7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovIDApCisKKyNkZWZpbmUgUkJfU0VUX0JMQUNLUkVEKGJsYWNrLCByZWQsIGZpZWxkKSBkbyB7CQkJCVwKKwlSQl9DT0xPUihibGFjaywgZmllbGQpID0gUkJfQkxBQ0s7CQkJCVwKKwlSQl9DT0xPUihyZWQsIGZpZWxkKSA9IFJCX1JFRDsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2lmbmRlZiBSQl9BVUdNRU5UCisjZGVmaW5lIFJCX0FVR01FTlQoeCkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBSQl9ST1RBVEVfTEVGVChoZWFkLCBlbG0sIHRtcCwgZmllbGQpIGRvIHsJCQlcCisJKHRtcCkgPSBSQl9SSUdIVChlbG0sIGZpZWxkKTsJCQkJCVwKKwlpZiAoKFJCX1JJR0hUKGVsbSwgZmllbGQpID0gUkJfTEVGVCh0bXAsIGZpZWxkKSkgIT0gTlVMTCkgewlcCisJCVJCX1BBUkVOVChSQl9MRUZUKHRtcCwgZmllbGQpLCBmaWVsZCkgPSAoZWxtKTsJCVwKKwl9CQkJCQkJCQlcCisJUkJfQVVHTUVOVChlbG0pOwkJCQkJCVwKKwlpZiAoKFJCX1BBUkVOVCh0bXAsIGZpZWxkKSA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKSkgIT0gTlVMTCkgewlcCisJCWlmICgoZWxtKSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKQlcCisJCQlSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpID0gKHRtcCk7CVwKKwkJZWxzZQkJCQkJCQlcCisJCQlSQl9SSUdIVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSA9ICh0bXApOwlcCisJfSBlbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+cmJoX3Jvb3QgPSAodG1wKTsJCQkJXAorCVJCX0xFRlQodG1wLCBmaWVsZCkgPSAoZWxtKTsJCQkJCVwKKwlSQl9QQVJFTlQoZWxtLCBmaWVsZCkgPSAodG1wKTsJCQkJCVwKKwlSQl9BVUdNRU5UKHRtcCk7CQkJCQkJXAorCWlmICgoUkJfUEFSRU5UKHRtcCwgZmllbGQpKSkJCQkJCVwKKwkJUkJfQVVHTUVOVChSQl9QQVJFTlQodG1wLCBmaWVsZCkpOwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2RlZmluZSBSQl9ST1RBVEVfUklHSFQoaGVhZCwgZWxtLCB0bXAsIGZpZWxkKSBkbyB7CQkJXAorCSh0bXApID0gUkJfTEVGVChlbG0sIGZpZWxkKTsJCQkJCVwKKwlpZiAoKFJCX0xFRlQoZWxtLCBmaWVsZCkgPSBSQl9SSUdIVCh0bXAsIGZpZWxkKSkgIT0gTlVMTCkgewlcCisJCVJCX1BBUkVOVChSQl9SSUdIVCh0bXAsIGZpZWxkKSwgZmllbGQpID0gKGVsbSk7CQlcCisJfQkJCQkJCQkJXAorCVJCX0FVR01FTlQoZWxtKTsJCQkJCQlcCisJaWYgKChSQl9QQVJFTlQodG1wLCBmaWVsZCkgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkpICE9IE5VTEwpIHsJXAorCQlpZiAoKGVsbSkgPT0gUkJfTEVGVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSkJXAorCQkJUkJfTEVGVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSA9ICh0bXApOwlcCisJCWVsc2UJCQkJCQkJXAorCQkJUkJfUklHSFQoUkJfUEFSRU5UKGVsbSwgZmllbGQpLCBmaWVsZCkgPSAodG1wKTsJXAorCX0gZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnJiaF9yb290ID0gKHRtcCk7CQkJCVwKKwlSQl9SSUdIVCh0bXAsIGZpZWxkKSA9IChlbG0pOwkJCQkJXAorCVJCX1BBUkVOVChlbG0sIGZpZWxkKSA9ICh0bXApOwkJCQkJXAorCVJCX0FVR01FTlQodG1wKTsJCQkJCQlcCisJaWYgKChSQl9QQVJFTlQodG1wLCBmaWVsZCkpKQkJCQkJXAorCQlSQl9BVUdNRU5UKFJCX1BBUkVOVCh0bXAsIGZpZWxkKSk7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLyAwKQorCisvKiBHZW5lcmF0ZXMgcHJvdG90eXBlcyBhbmQgaW5saW5lIGZ1bmN0aW9ucyAqLworI2RlZmluZQlSQl9QUk9UT1RZUEUobmFtZSwgdHlwZSwgZmllbGQsIGNtcCkJCQkJXAorCVJCX1BST1RPVFlQRV9JTlRFUk5BTChuYW1lLCB0eXBlLCBmaWVsZCwgY21wLCkKKyNkZWZpbmUJUkJfUFJPVE9UWVBFX1NUQVRJQyhuYW1lLCB0eXBlLCBmaWVsZCwgY21wKQkJCVwKKwlSQl9QUk9UT1RZUEVfSU5URVJOQUwobmFtZSwgdHlwZSwgZmllbGQsIGNtcCwgX191bnVzZWQgc3RhdGljKQorI2RlZmluZSBSQl9QUk9UT1RZUEVfSU5URVJOQUwobmFtZSwgdHlwZSwgZmllbGQsIGNtcCwgYXR0cikJCVwKK2F0dHIgdm9pZCBuYW1lIyNfUkJfSU5TRVJUX0NPTE9SKHN0cnVjdCBuYW1lICosIHR5cGUgKik7CQlcCithdHRyIHZvaWQgbmFtZSMjX1JCX1JFTU9WRV9DT0xPUihzdHJ1Y3QgbmFtZSAqLCB0eXBlICosIHR5cGUgKik7ICAgICAgICBcCithdHRyIHR5cGUgKm5hbWUjI19SQl9SRU1PVkUoc3RydWN0IG5hbWUgKiwgdHlwZSAqKTsJICAgICAgICAgICAgICAgIFwKK2F0dHIgdHlwZSAqbmFtZSMjX1JCX0lOU0VSVChzdHJ1Y3QgbmFtZSAqLCB0eXBlICopOwkgICAgICAgICAgICAgICAgXAorYXR0ciB0eXBlICpuYW1lIyNfUkJfRklORChzdHJ1Y3QgbmFtZSAqLCB0eXBlICopOwkJICAgICAgICBcCithdHRyIHR5cGUgKm5hbWUjI19SQl9ORklORChzdHJ1Y3QgbmFtZSAqLCB0eXBlICopOwkgICAgICAgICAgICAgICAgXAorYXR0ciB0eXBlICpuYW1lIyNfUkJfTkVYVCh0eXBlICopOwkJCSAgICAgICAgICAgICAgICBcCithdHRyIHR5cGUgKm5hbWUjI19SQl9QUkVWKHR5cGUgKik7CQkJICAgICAgICAgICAgICAgIFwKK2F0dHIgdHlwZSAqbmFtZSMjX1JCX01JTk1BWChzdHJ1Y3QgbmFtZSAqLCBpbnQpOwkJCVwKKwkJCQkJCQkJCVwKKworLyogTWFpbiByYiBvcGVyYXRpb24uCisgKiBNb3ZlcyBub2RlIGNsb3NlIHRvIHRoZSBrZXkgb2YgZWxtIHRvIHRvcAorICovCisjZGVmaW5lCVJCX0dFTkVSQVRFKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXApCQkJCVwKKwlSQl9HRU5FUkFURV9JTlRFUk5BTChuYW1lLCB0eXBlLCBmaWVsZCwgY21wLCkKKyNkZWZpbmUJUkJfR0VORVJBVEVfU1RBVElDKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXApCQkJXAorCVJCX0dFTkVSQVRFX0lOVEVSTkFMKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXAsIF9fdW51c2VkIHN0YXRpYykKKyNkZWZpbmUgUkJfR0VORVJBVEVfSU5MSU5FKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUkJfR0VORVJBVEVfSU5URVJOQUwobmFtZSwgdHlwZSwgZmllbGQsIGNtcCwgc3RhdGljIGlubGluZSkKKyNkZWZpbmUgUkJfR0VORVJBVEVfSU5URVJOQUwobmFtZSwgdHlwZSwgZmllbGQsIGNtcCwgYXR0cikJCVwKK2F0dHIgdm9pZAkJCQkJCQkJXAorbmFtZSMjX1JCX0lOU0VSVF9DT0xPUihzdHJ1Y3QgbmFtZSAqaGVhZCwgdHlwZSAqZWxtKQkJICAgICAgICBcCit7CQkJCQkJCQkJXAorCXR5cGUgKnBhcmVudCwgKmdwYXJlbnQsICp0bXA7CQkJCSAgICAgICAgXAorCXdoaWxlICgocGFyZW50ID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpKSAhPSBOVUxMICYmCQlcCisJICAgIFJCX0NPTE9SKHBhcmVudCwgZmllbGQpID09IFJCX1JFRCkgewkJCVwKKwkJZ3BhcmVudCA9IFJCX1BBUkVOVChwYXJlbnQsIGZpZWxkKTsJCQlcCisJCWlmIChwYXJlbnQgPT0gUkJfTEVGVChncGFyZW50LCBmaWVsZCkpIHsJCVwKKwkJCXRtcCA9IFJCX1JJR0hUKGdwYXJlbnQsIGZpZWxkKTsJCQlcCisJCQlpZiAodG1wICYmIFJCX0NPTE9SKHRtcCwgZmllbGQpID09IFJCX1JFRCkgewlcCisJCQkJUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9CTEFDSzsJXAorCQkJCVJCX1NFVF9CTEFDS1JFRChwYXJlbnQsIGdwYXJlbnQsIGZpZWxkKTtcCisJCQkJZWxtID0gZ3BhcmVudDsJCQkJXAorCQkJCWNvbnRpbnVlOwkJCQlcCisJCQl9CQkJCQkJXAorCQkJaWYgKFJCX1JJR0hUKHBhcmVudCwgZmllbGQpID09IGVsbSkgewkJXAorCQkJCVJCX1JPVEFURV9MRUZUKGhlYWQsIHBhcmVudCwgdG1wLCBmaWVsZCk7XAorCQkJCXRtcCA9IHBhcmVudDsJCQkJXAorCQkJCXBhcmVudCA9IGVsbTsJCQkJXAorCQkJCWVsbSA9IHRtcDsJCQkJXAorCQkJfQkJCQkJCVwKKwkJCVJCX1NFVF9CTEFDS1JFRChwYXJlbnQsIGdwYXJlbnQsIGZpZWxkKTsJXAorCQkJUkJfUk9UQVRFX1JJR0hUKGhlYWQsIGdwYXJlbnQsIHRtcCwgZmllbGQpOwlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJdG1wID0gUkJfTEVGVChncGFyZW50LCBmaWVsZCk7CQkJXAorCQkJaWYgKHRtcCAmJiBSQl9DT0xPUih0bXAsIGZpZWxkKSA9PSBSQl9SRUQpIHsJXAorCQkJCVJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfQkxBQ0s7CVwKKwkJCQlSQl9TRVRfQkxBQ0tSRUQocGFyZW50LCBncGFyZW50LCBmaWVsZCk7XAorCQkJCWVsbSA9IGdwYXJlbnQ7CQkJCVwKKwkJCQljb250aW51ZTsJCQkJXAorCQkJfQkJCQkJCVwKKwkJCWlmIChSQl9MRUZUKHBhcmVudCwgZmllbGQpID09IGVsbSkgewkJXAorCQkJCVJCX1JPVEFURV9SSUdIVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKKwkJCQl0bXAgPSBwYXJlbnQ7CQkJCVwKKwkJCQlwYXJlbnQgPSBlbG07CQkJCVwKKwkJCQllbG0gPSB0bXA7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlSQl9TRVRfQkxBQ0tSRUQocGFyZW50LCBncGFyZW50LCBmaWVsZCk7CVwKKwkJCVJCX1JPVEFURV9MRUZUKGhlYWQsIGdwYXJlbnQsIHRtcCwgZmllbGQpOwlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlSQl9DT0xPUihoZWFkLT5yYmhfcm9vdCwgZmllbGQpID0gUkJfQkxBQ0s7CQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK2F0dHIgdm9pZAkJCQkJCQkJXAorbmFtZSMjX1JCX1JFTU9WRV9DT0xPUihzdHJ1Y3QgbmFtZSAqaGVhZCwgdHlwZSAqcGFyZW50LCB0eXBlICplbG0pICAgICAgXAorewkJCQkJCQkJCVwKKwl0eXBlICp0bXA7CQkJCQkJICAgICAgICBcCisJd2hpbGUgKChlbG0gPT0gTlVMTCB8fCBSQl9DT0xPUihlbG0sIGZpZWxkKSA9PSBSQl9CTEFDSykgJiYJXAorCSAgICBlbG0gIT0gUkJfUk9PVF9OT0RFKGhlYWQpKSB7CQkJCVwKKwkJaWYgKFJCX0xFRlQocGFyZW50LCBmaWVsZCkgPT0gZWxtKSB7CQkJXAorCQkJdG1wID0gUkJfUklHSFQocGFyZW50LCBmaWVsZCk7CQkJXAorCQkJaWYgKFJCX0NPTE9SKHRtcCwgZmllbGQpID09IFJCX1JFRCkgewkJXAorCQkJCVJCX1NFVF9CTEFDS1JFRCh0bXAsIHBhcmVudCwgZmllbGQpOwlcCisJCQkJUkJfUk9UQVRFX0xFRlQoaGVhZCwgcGFyZW50LCB0bXAsIGZpZWxkKTtcCisJCQkJdG1wID0gUkJfUklHSFQocGFyZW50LCBmaWVsZCk7CQlcCisJCQl9CQkJCQkJXAorCQkJaWYgKChSQl9MRUZUKHRtcCwgZmllbGQpID09IE5VTEwgfHwJCVwKKwkJCSAgICBSQl9DT0xPUihSQl9MRUZUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spICYmXAorCQkJICAgIChSQl9SSUdIVCh0bXAsIGZpZWxkKSA9PSBOVUxMIHx8CQlcCisJCQkgICAgUkJfQ09MT1IoUkJfUklHSFQodG1wLCBmaWVsZCksIGZpZWxkKSA9PSBSQl9CTEFDSykpIHtcCisJCQkJUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9SRUQ7CQlcCisJCQkJZWxtID0gcGFyZW50OwkJCQlcCisJCQkJcGFyZW50ID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJXAorCQkJfSBlbHNlIHsJCQkJCVwKKwkJCQlpZiAoUkJfUklHSFQodG1wLCBmaWVsZCkgPT0gTlVMTCB8fAlcCisJCQkJICAgIFJCX0NPTE9SKFJCX1JJR0hUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spIHtcCisJCQkJCXR5cGUgKm9sZWZ0OwkJXAorCQkJCQlpZiAoKG9sZWZ0ID0gUkJfTEVGVCh0bXAsIGZpZWxkKSkgXAorCQkJCQkgICAgIT0gTlVMTCkJCQlcCisJCQkJCQlSQl9DT0xPUihvbGVmdCwgZmllbGQpID0gUkJfQkxBQ0s7XAorCQkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX1JFRDsJXAorCQkJCQlSQl9ST1RBVEVfUklHSFQoaGVhZCwgdG1wLCBvbGVmdCwgZmllbGQpO1wKKwkJCQkJdG1wID0gUkJfUklHSFQocGFyZW50LCBmaWVsZCk7CVwKKwkJCQl9CQkJCQlcCisJCQkJUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9DT0xPUihwYXJlbnQsIGZpZWxkKTtcCisJCQkJUkJfQ09MT1IocGFyZW50LCBmaWVsZCkgPSBSQl9CTEFDSzsJXAorCQkJCWlmIChSQl9SSUdIVCh0bXAsIGZpZWxkKSkJCVwKKwkJCQkJUkJfQ09MT1IoUkJfUklHSFQodG1wLCBmaWVsZCksIGZpZWxkKSA9IFJCX0JMQUNLO1wKKwkJCQlSQl9ST1RBVEVfTEVGVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKKwkJCQllbG0gPSBSQl9ST09UX05PREUoaGVhZCk7CQlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQl9CQkJCQkJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCXRtcCA9IFJCX0xFRlQocGFyZW50LCBmaWVsZCk7CQkJXAorCQkJaWYgKFJCX0NPTE9SKHRtcCwgZmllbGQpID09IFJCX1JFRCkgewkJXAorCQkJCVJCX1NFVF9CTEFDS1JFRCh0bXAsIHBhcmVudCwgZmllbGQpOwlcCisJCQkJUkJfUk9UQVRFX1JJR0hUKGhlYWQsIHBhcmVudCwgdG1wLCBmaWVsZCk7XAorCQkJCXRtcCA9IFJCX0xFRlQocGFyZW50LCBmaWVsZCk7CQlcCisJCQl9CQkJCQkJXAorCQkJaWYgKChSQl9MRUZUKHRtcCwgZmllbGQpID09IE5VTEwgfHwJCVwKKwkJCSAgICBSQl9DT0xPUihSQl9MRUZUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spICYmXAorCQkJICAgIChSQl9SSUdIVCh0bXAsIGZpZWxkKSA9PSBOVUxMIHx8CQlcCisJCQkgICAgUkJfQ09MT1IoUkJfUklHSFQodG1wLCBmaWVsZCksIGZpZWxkKSA9PSBSQl9CTEFDSykpIHtcCisJCQkJUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9SRUQ7CQlcCisJCQkJZWxtID0gcGFyZW50OwkJCQlcCisJCQkJcGFyZW50ID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJXAorCQkJfSBlbHNlIHsJCQkJCVwKKwkJCQlpZiAoUkJfTEVGVCh0bXAsIGZpZWxkKSA9PSBOVUxMIHx8CVwKKwkJCQkgICAgUkJfQ09MT1IoUkJfTEVGVCh0bXAsIGZpZWxkKSwgZmllbGQpID09IFJCX0JMQUNLKSB7XAorCQkJCQl0eXBlICpvcmlnaHQ7CQlcCisJCQkJCWlmICgob3JpZ2h0ID0gUkJfUklHSFQodG1wLCBmaWVsZCkpIFwKKwkJCQkJICAgICE9IE5VTEwpCQkJXAorCQkJCQkJUkJfQ09MT1Iob3JpZ2h0LCBmaWVsZCkgPSBSQl9CTEFDSztcCisJCQkJCVJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfUkVEOwlcCisJCQkJCVJCX1JPVEFURV9MRUZUKGhlYWQsIHRtcCwgb3JpZ2h0LCBmaWVsZCk7XAorCQkJCQl0bXAgPSBSQl9MRUZUKHBhcmVudCwgZmllbGQpOwlcCisJCQkJfQkJCQkJXAorCQkJCVJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfQ09MT1IocGFyZW50LCBmaWVsZCk7XAorCQkJCVJCX0NPTE9SKHBhcmVudCwgZmllbGQpID0gUkJfQkxBQ0s7CVwKKwkJCQlpZiAoUkJfTEVGVCh0bXAsIGZpZWxkKSkJCVwKKwkJCQkJUkJfQ09MT1IoUkJfTEVGVCh0bXAsIGZpZWxkKSwgZmllbGQpID0gUkJfQkxBQ0s7XAorCQkJCVJCX1JPVEFURV9SSUdIVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKKwkJCQllbG0gPSBSQl9ST09UX05PREUoaGVhZCk7CQlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQl9CQkJCQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKGVsbSkJCQkJCQkJXAorCQlSQl9DT0xPUihlbG0sIGZpZWxkKSA9IFJCX0JMQUNLOwkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCithdHRyIHR5cGUgKgkJCQkJCQkgICAgICAgIFwKK25hbWUjI19SQl9SRU1PVkUoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJdHlwZSAqY2hpbGQsICpwYXJlbnQsICpvbGQgPSBlbG07CQkJICAgICAgICBcCisJaW50IGNvbG9yOwkJCQkJCQlcCisJaWYgKFJCX0xFRlQoZWxtLCBmaWVsZCkgPT0gTlVMTCkJCQkJXAorCQljaGlsZCA9IFJCX1JJR0hUKGVsbSwgZmllbGQpOwkJCQlcCisJZWxzZSBpZiAoUkJfUklHSFQoZWxtLCBmaWVsZCkgPT0gTlVMTCkJCQkJXAorCQljaGlsZCA9IFJCX0xFRlQoZWxtLCBmaWVsZCk7CQkJCVwKKwllbHNlIHsJCQkJCQkJCVwKKwkJdHlwZSAqbGVmdDsJCQkJCSAgICAgICAgXAorCQllbG0gPSBSQl9SSUdIVChlbG0sIGZpZWxkKTsJCQkJXAorCQl3aGlsZSAoKGxlZnQgPSBSQl9MRUZUKGVsbSwgZmllbGQpKSAhPSBOVUxMKQkJXAorCQkJZWxtID0gbGVmdDsJCQkJCVwKKwkJY2hpbGQgPSBSQl9SSUdIVChlbG0sIGZpZWxkKTsJCQkJXAorCQlwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7CQkJCVwKKwkJY29sb3IgPSBSQl9DT0xPUihlbG0sIGZpZWxkKTsJCQkJXAorCQlpZiAoY2hpbGQpCQkJCQkJXAorCQkJUkJfUEFSRU5UKGNoaWxkLCBmaWVsZCkgPSBwYXJlbnQ7CQlcCisJCWlmIChwYXJlbnQpIHsJCQkJCQlcCisJCQlpZiAoUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9PSBlbG0pCQlcCisJCQkJUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwkJXAorCQkJZWxzZQkJCQkJCVwKKwkJCQlSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwlcCisJCQlSQl9BVUdNRU5UKHBhcmVudCk7CQkJCVwKKwkJfSBlbHNlCQkJCQkJCVwKKwkJCVJCX1JPT1RfTk9ERShoZWFkKSA9IGNoaWxkOwkJCVwKKwkJaWYgKFJCX1BBUkVOVChlbG0sIGZpZWxkKSA9PSBvbGQpCQkJXAorCQkJcGFyZW50ID0gZWxtOwkJCQkJXAorCQkoZWxtKS0+ZmllbGQgPSAob2xkKS0+ZmllbGQ7CQkJCVwKKwkJaWYgKFJCX1BBUkVOVChvbGQsIGZpZWxkKSkgewkJCQlcCisJCQlpZiAoUkJfTEVGVChSQl9QQVJFTlQob2xkLCBmaWVsZCksIGZpZWxkKSA9PSBvbGQpXAorCQkJCVJCX0xFRlQoUkJfUEFSRU5UKG9sZCwgZmllbGQpLCBmaWVsZCkgPSBlbG07XAorCQkJZWxzZQkJCQkJCVwKKwkJCQlSQl9SSUdIVChSQl9QQVJFTlQob2xkLCBmaWVsZCksIGZpZWxkKSA9IGVsbTtcCisJCQlSQl9BVUdNRU5UKFJCX1BBUkVOVChvbGQsIGZpZWxkKSk7CQlcCisJCX0gZWxzZQkJCQkJCQlcCisJCQlSQl9ST09UX05PREUoaGVhZCkgPSBlbG07CQkJXAorCQlSQl9QQVJFTlQoUkJfTEVGVChvbGQsIGZpZWxkKSwgZmllbGQpID0gZWxtOwkJXAorCQlpZiAoUkJfUklHSFQob2xkLCBmaWVsZCkpCQkJCVwKKwkJCVJCX1BBUkVOVChSQl9SSUdIVChvbGQsIGZpZWxkKSwgZmllbGQpID0gZWxtOwlcCisJCWlmIChwYXJlbnQpIHsJCQkJCQlcCisJCQlsZWZ0ID0gcGFyZW50OwkJCQkJXAorCQkJZG8gewkJCQkJCVwKKwkJCQlSQl9BVUdNRU5UKGxlZnQpOwkJCVwKKwkJCX0gd2hpbGUgKChsZWZ0ID0gUkJfUEFSRU5UKGxlZnQsIGZpZWxkKSkgIT0gTlVMTCk7IFwKKwkJfQkJCQkJCQlcCisJCWdvdG8gY29sb3I7CQkJCQkJXAorCX0JCQkJCQkJCVwKKwlwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7CQkJCQlcCisJY29sb3IgPSBSQl9DT0xPUihlbG0sIGZpZWxkKTsJCQkJCVwKKwlpZiAoY2hpbGQpCQkJCQkJCVwKKwkJUkJfUEFSRU5UKGNoaWxkLCBmaWVsZCkgPSBwYXJlbnQ7CQkJXAorCWlmIChwYXJlbnQpIHsJCQkJCQkJXAorCQlpZiAoUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9PSBlbG0pCQkJXAorCQkJUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwkJXAorCQlSQl9BVUdNRU5UKHBhcmVudCk7CQkJCQlcCisJfSBlbHNlCQkJCQkJCQlcCisJCVJCX1JPT1RfTk9ERShoZWFkKSA9IGNoaWxkOwkJCQlcCitjb2xvcjoJCQkJCQkJCQlcCisJaWYgKGNvbG9yID09IFJCX0JMQUNLKQkJCQkJCVwKKwkJbmFtZSMjX1JCX1JFTU9WRV9DT0xPUihoZWFkLCBwYXJlbnQsIGNoaWxkKTsJCVwKKwlyZXR1cm4gKG9sZCk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisvKiBJbnNlcnRzIGEgbm9kZSBpbnRvIHRoZSBSQiB0cmVlICovCQkJCQlcCithdHRyIHR5cGUgKgkJCQkJCQkgICAgICAgIFwKK25hbWUjI19SQl9JTlNFUlQoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJdHlwZSAqdG1wOwkJCQkJCSAgICAgICAgXAorCXR5cGUgKnBhcmVudCA9IE5VTEw7CQkJCQkgICAgICAgIFwKKwlpbnQgY29tcCA9IDA7CQkJCQkJCVwKKwl0bXAgPSBSQl9ST09UX05PREUoaGVhZCk7CQkJCQlcCisJd2hpbGUgKHRtcCkgewkJCQkJCQlcCisJCXBhcmVudCA9IHRtcDsJCQkJCQlcCisJCWNvbXAgPSAoY21wKShlbG0sIHBhcmVudCk7CQkJCVwKKwkJaWYgKGNvbXAgPCAwKQkJCQkJCVwKKwkJCXRtcCA9IFJCX0xFRlQodG1wLCBmaWVsZCk7CQkJXAorCQllbHNlIGlmIChjb21wID4gMCkJCQkJCVwKKwkJCXRtcCA9IFJCX1JJR0hUKHRtcCwgZmllbGQpOwkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlyZXR1cm4gKHRtcCk7CQkJCQlcCisJfQkJCQkJCQkJXAorCVJCX1NFVChlbG0sIHBhcmVudCwgZmllbGQpOwkJCQkJXAorCWlmIChwYXJlbnQgIT0gTlVMTCkgewkJCQkJCVwKKwkJaWYgKGNvbXAgPCAwKQkJCQkJCVwKKwkJCVJCX0xFRlQocGFyZW50LCBmaWVsZCkgPSBlbG07CQkJXAorCQllbHNlCQkJCQkJCVwKKwkJCVJCX1JJR0hUKHBhcmVudCwgZmllbGQpID0gZWxtOwkJCVwKKwkJUkJfQVVHTUVOVChwYXJlbnQpOwkJCQkJXAorCX0gZWxzZQkJCQkJCQkJXAorCQlSQl9ST09UX05PREUoaGVhZCkgPSBlbG07CQkJCVwKKwluYW1lIyNfUkJfSU5TRVJUX0NPTE9SKGhlYWQsIGVsbSk7CQkJCVwKKwlyZXR1cm4gKE5VTEwpOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorLyogRmluZHMgdGhlIG5vZGUgd2l0aCB0aGUgc2FtZSBrZXkgYXMgZWxtICovCQkJCVwKK2F0dHIgdHlwZSAqCQkJCQkJCSAgICAgICAgXAorbmFtZSMjX1JCX0ZJTkQoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJdHlwZSAqdG1wID0gUkJfUk9PVF9OT0RFKGhlYWQpOwkJCQkgICAgICAgIFwKKwlpbnQgY29tcDsJCQkJCQkJXAorCXdoaWxlICh0bXApIHsJCQkJCQkJXAorCQljb21wID0gY21wKGVsbSwgdG1wKTsJCQkJCVwKKwkJaWYgKGNvbXAgPCAwKQkJCQkJCVwKKwkJCXRtcCA9IFJCX0xFRlQodG1wLCBmaWVsZCk7CQkJXAorCQllbHNlIGlmIChjb21wID4gMCkJCQkJCVwKKwkJCXRtcCA9IFJCX1JJR0hUKHRtcCwgZmllbGQpOwkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlyZXR1cm4gKHRtcCk7CQkJCQlcCisJfQkJCQkJCQkJXAorCXJldHVybiAoTlVMTCk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisvKiBGaW5kcyB0aGUgZmlyc3Qgbm9kZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlYXJjaCBrZXkgKi8JXAorYXR0ciB0eXBlICoJCQkJCQkJICAgICAgICBcCituYW1lIyNfUkJfTkZJTkQoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJdHlwZSAqdG1wID0gUkJfUk9PVF9OT0RFKGhlYWQpOwkJCQkgICAgICAgIFwKKwl0eXBlICpyZXMgPSBOVUxMOwkJCQkJICAgICAgICBcCisJaW50IGNvbXA7CQkJCQkJCVwKKwl3aGlsZSAodG1wKSB7CQkJCQkJCVwKKwkJY29tcCA9IGNtcChlbG0sIHRtcCk7CQkJCQlcCisJCWlmIChjb21wIDwgMCkgewkJCQkJCVwKKwkJCXJlcyA9IHRtcDsJCQkJCVwKKwkJCXRtcCA9IFJCX0xFRlQodG1wLCBmaWVsZCk7CQkJXAorCQl9CQkJCQkJCVwKKwkJZWxzZSBpZiAoY29tcCA+IDApCQkJCQlcCisJCQl0bXAgPSBSQl9SSUdIVCh0bXAsIGZpZWxkKTsJCQlcCisJCWVsc2UJCQkJCQkJXAorCQkJcmV0dXJuICh0bXApOwkJCQkJXAorCX0JCQkJCQkJCVwKKwlyZXR1cm4gKHJlcyk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisvKiBBUkdTVVNFRCAqLwkJCQkJCQkJXAorYXR0ciB0eXBlICoJCQkJCQkJICAgICAgICBcCituYW1lIyNfUkJfTkVYVCh0eXBlICplbG0pCQkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJaWYgKFJCX1JJR0hUKGVsbSwgZmllbGQpKSB7CQkJCQlcCisJCWVsbSA9IFJCX1JJR0hUKGVsbSwgZmllbGQpOwkJCQlcCisJCXdoaWxlIChSQl9MRUZUKGVsbSwgZmllbGQpKQkJCQlcCisJCQllbG0gPSBSQl9MRUZUKGVsbSwgZmllbGQpOwkJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCWlmIChSQl9QQVJFTlQoZWxtLCBmaWVsZCkgJiYJCQkJXAorCQkgICAgKGVsbSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKSkJXAorCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJCVwKKwkJZWxzZSB7CQkJCQkJCVwKKwkJCXdoaWxlIChSQl9QQVJFTlQoZWxtLCBmaWVsZCkgJiYJCQlcCisJCQkgICAgKGVsbSA9PSBSQl9SSUdIVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSkpXAorCQkJCWVsbSA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKTsJCVwKKwkJCWVsbSA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKTsJCQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlyZXR1cm4gKGVsbSk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisvKiBBUkdTVVNFRCAqLwkJCQkJCQkJXAorYXR0ciB0eXBlICoJCQkJCQkJXAorbmFtZSMjX1JCX1BSRVYodHlwZSAqZWxtKQkJCQkJXAorewkJCQkJCQkJCVwKKwlpZiAoUkJfTEVGVChlbG0sIGZpZWxkKSkgewkJCQkJXAorCQllbG0gPSBSQl9MRUZUKGVsbSwgZmllbGQpOwkJCQlcCisJCXdoaWxlIChSQl9SSUdIVChlbG0sIGZpZWxkKSkJCQkJXAorCQkJZWxtID0gUkJfUklHSFQoZWxtLCBmaWVsZCk7CQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJaWYgKFJCX1BBUkVOVChlbG0sIGZpZWxkKSAmJgkJCQlcCisJCSAgICAoZWxtID09IFJCX1JJR0hUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKSkJXAorCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJCVwKKwkJZWxzZSB7CQkJCQkJCVwKKwkJCXdoaWxlIChSQl9QQVJFTlQoZWxtLCBmaWVsZCkgJiYJCQlcCisJCQkgICAgKGVsbSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKSlcCisJCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJXAorCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCXJldHVybiAoZWxtKTsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK2F0dHIgdHlwZSAqCQkJCQkJCSAgICAgICAgXAorbmFtZSMjX1JCX01JTk1BWChzdHJ1Y3QgbmFtZSAqaGVhZCwgaW50IHZhbCkJCQkJXAorewkJCQkJCQkJCVwKKwl0eXBlICp0bXAgPSBSQl9ST09UX05PREUoaGVhZCk7CQkJCSAgICAgICAgXAorCXR5cGUgKnBhcmVudCA9IE5VTEw7CQkJCQkgICAgICAgIFwKKwl3aGlsZSAodG1wKSB7CQkJCQkJCVwKKwkJcGFyZW50ID0gdG1wOwkJCQkJCVwKKwkJaWYgKHZhbCA8IDApCQkJCQkJXAorCQkJdG1wID0gUkJfTEVGVCh0bXAsIGZpZWxkKTsJCQlcCisJCWVsc2UJCQkJCQkJXAorCQkJdG1wID0gUkJfUklHSFQodG1wLCBmaWVsZCk7CQkJXAorCX0JCQkJCQkJCVwKKwlyZXR1cm4gKHBhcmVudCk7CQkJCQkJXAorfQorCisjZGVmaW5lIFJCX05FR0lORgktMQorI2RlZmluZSBSQl9JTkYJMQorCisjZGVmaW5lIFJCX0lOU0VSVChuYW1lLCB4LCB5KQluYW1lIyNfUkJfSU5TRVJUKHgsIHkpCisjZGVmaW5lIFJCX1JFTU9WRShuYW1lLCB4LCB5KQluYW1lIyNfUkJfUkVNT1ZFKHgsIHkpCisjZGVmaW5lIFJCX0ZJTkQobmFtZSwgeCwgeSkJbmFtZSMjX1JCX0ZJTkQoeCwgeSkKKyNkZWZpbmUgUkJfTkZJTkQobmFtZSwgeCwgeSkJbmFtZSMjX1JCX05GSU5EKHgsIHkpCisjZGVmaW5lIFJCX05FWFQobmFtZSwgeCwgeSkJbmFtZSMjX1JCX05FWFQoeSkKKyNkZWZpbmUgUkJfUFJFVihuYW1lLCB4LCB5KQluYW1lIyNfUkJfUFJFVih5KQorI2RlZmluZSBSQl9NSU4obmFtZSwgeCkJCW5hbWUjI19SQl9NSU5NQVgoeCwgUkJfTkVHSU5GKQorI2RlZmluZSBSQl9NQVgobmFtZSwgeCkJCW5hbWUjI19SQl9NSU5NQVgoeCwgUkJfSU5GKQorCisjZGVmaW5lIFJCX0ZPUkVBQ0goeCwgbmFtZSwgaGVhZCkJCQkJCVwKKwlmb3IgKCh4KSA9IFJCX01JTihuYW1lLCBoZWFkKTsJCQkJCVwKKwkgICAgICh4KSAhPSBOVUxMOwkJCQkJCVwKKwkgICAgICh4KSA9IG5hbWUjI19SQl9ORVhUKHgpKQorCisjZGVmaW5lIFJCX0ZPUkVBQ0hfRlJPTSh4LCBuYW1lLCB5KQkJCQkJXAorCWZvciAoKHgpID0gKHkpOwkJCQkJCQlcCisJICAgICgoeCkgIT0gTlVMTCkgJiYgKCh5KSA9IG5hbWUjI19SQl9ORVhUKHgpLCAoeCkgIT0gTlVMTCk7CVwKKwkgICAgICh4KSA9ICh5KSkKKworI2RlZmluZSBSQl9GT1JFQUNIX1NBRkUoeCwgbmFtZSwgaGVhZCwgeSkJCQkJXAorCWZvciAoKHgpID0gUkJfTUlOKG5hbWUsIGhlYWQpOwkJCQkJXAorCSAgICAoKHgpICE9IE5VTEwpICYmICgoeSkgPSBuYW1lIyNfUkJfTkVYVCh4KSwgKHgpICE9IE5VTEwpOwlcCisJICAgICAoeCkgPSAoeSkpCisKKyNkZWZpbmUgUkJfRk9SRUFDSF9SRVZFUlNFKHgsIG5hbWUsIGhlYWQpCQkJCVwKKwlmb3IgKCh4KSA9IFJCX01BWChuYW1lLCBoZWFkKTsJCQkJCVwKKwkgICAgICh4KSAhPSBOVUxMOwkJCQkJCVwKKwkgICAgICh4KSA9IG5hbWUjI19SQl9QUkVWKHgpKQorCisjZGVmaW5lIFJCX0ZPUkVBQ0hfUkVWRVJTRV9GUk9NKHgsIG5hbWUsIHkpCQkJCVwKKwlmb3IgKCh4KSA9ICh5KTsJCQkJCQkJXAorCSAgICAoKHgpICE9IE5VTEwpICYmICgoeSkgPSBuYW1lIyNfUkJfUFJFVih4KSwgKHgpICE9IE5VTEwpOwlcCisJICAgICAoeCkgPSAoeSkpCisKKyNkZWZpbmUgUkJfRk9SRUFDSF9SRVZFUlNFX1NBRkUoeCwgbmFtZSwgaGVhZCwgeSkJCQlcCisJZm9yICgoeCkgPSBSQl9NQVgobmFtZSwgaGVhZCk7CQkJCQlcCisJICAgICgoeCkgIT0gTlVMTCkgJiYgKCh5KSA9IG5hbWUjI19SQl9QUkVWKHgpLCAoeCkgIT0gTlVMTCk7CVwKKwkgICAgICh4KSA9ICh5KSkKKworI2VuZGlmCS8qIF9CQ01PU19UUkVFX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3R5cGVzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmMDE5MQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfdHlwZXMuaApAQCAtMCwwICsxLDIwOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PU19UWVBFU19IXworI2RlZmluZSBCQ01PU19UWVBFU19IXworCisjaWZuZGVmIEJDTU9TX1NZU1RFTV9IXworI2Vycm9yIFBsZWFzZSBkbyBub3QgaW5jbHVkZSBiY21vc190eXBlcy5oIGRpcmVjdGx5LiBJbmNsdWRlIGJjbW9zX3N5c3RlbS5oCisjZW5kaWYKKworI2luY2x1ZGUgImJjbW9zX3BhY2suaCIKKworLyoqIFxkZWZncm91cCBzeXN0ZW1fdHlwZXMgR2VuZXJpYyB0eXBlcworICogQHsKKyAqLworCisvKgorICogTGltaXRzIG9mIGludGVnZXIgdHlwZXMuCisgKi8KKworLyogTWluaW11bSBvZiBzaWduZWQgaW50ZWdlciB0eXBlcy4gICovCisjaWZuZGVmIElOVDhfTUlOCisjZGVmaW5lIElOVDhfTUlOICAgICAgICgweDgwKQorI2VuZGlmCisjaWZuZGVmIElOVDE2X01JTgorI2RlZmluZSBJTlQxNl9NSU4gICAgICAoMHg4MDAwKQorI2VuZGlmCisjaWZuZGVmIElOVDMyX01JTgorI2RlZmluZSBJTlQzMl9NSU4gICAgICAoMHg4MDAwMDAwMCkKKyNlbmRpZgorI2lmbmRlZiBJTlQ2NF9NSU4KKyNkZWZpbmUgSU5UNjRfTUlOICAgICAgKDB4ODAwMDAwMDAwMDAwMDAwMCkKKyNlbmRpZgorCisvKiBNYXhpbXVtIG9mIHNpZ25lZCBpbnRlZ2VyIHR5cGVzLiAgKi8KKyNpZm5kZWYgSU5UOF9NQVgKKyNkZWZpbmUgSU5UOF9NQVggICAgICAgKDB4N0YpCisjZW5kaWYKKyNpZm5kZWYgSU5UMTZfTUFYCisjZGVmaW5lIElOVDE2X01BWCAgICAgICgweDdGRkYpCisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAgICAgICgweDdGRkZGRkZGKQorI2VuZGlmCisjaWZuZGVmIElOVDY0X01BWAorI2RlZmluZSBJTlQ2NF9NQVggICAgICAoMHg3RkZGRkZGRkZGRkZGRkZGKQorI2VuZGlmCisKKy8qIE1heGltdW0gb2YgdW5zaWduZWQgaW50ZWdlciB0eXBlcy4gICovCisjaWZuZGVmIFVJTlQ4X01BWAorI2RlZmluZSBVSU5UOF9NQVggICAgICAoMHhGRikKKyNlbmRpZgorI2lmbmRlZiBVSU5UMTZfTUFYCisjZGVmaW5lIFVJTlQxNl9NQVggICAgICgweEZGRkYpCisjZW5kaWYKKyNpZm5kZWYgVUlOVDMyX01BWAorI2RlZmluZSBVSU5UMzJfTUFYICAgICAoMHhGRkZGRkZGRikKKyNlbmRpZgorI2lmbmRlZiBVSU5UNjRfTUFYCisjZGVmaW5lIFVJTlQ2NF9NQVggICAgICgweEZGRkZGRkZGRkZGRkZGRkYpCisjZW5kaWYKKworCisvKiogRW5kaWFubmVzcyAqLworI2RlZmluZSBCQ01PU19FTkRJQU5fQklHICAgICAgICAwCisjZGVmaW5lIEJDTU9TX0VORElBTl9MSVRUTEUgICAgIDEKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT1NfRU5ESUFOX0JJR19FICAgICAgICAgID0gQkNNT1NfRU5ESUFOX0JJRywKKyAgICBCQ01PU19FTkRJQU5fTElUVExFX0UgICAgICAgPSBCQ01PU19FTkRJQU5fTElUVExFLAorfSBiY21vc19lbmRpYW47CisKKy8qIElmIGVuZGlhbm5lc3MgaXMgbm90IHNldCBleHBsaWNpdGx5LCB0cnkgdG8gYXV0b2RldGVjdCBpdC4KKyAqIE1vZGVybiBnY2MgdmVyc2lvbnMgKG92ZXIgNC44KSBkZWZpbmUgX19CWVRFX09SREVSX18KKyAqIHNlZSAiZ2NjIC1FIC1kTSAtIDwgL2Rldi9udWxsIHwgZ3JlcCBFTkRJQU4iCisgKi8KKyNpZm5kZWYgQkNNX0NQVV9FTkRJQU4KKworI2lmZGVmIF9fQllURV9PUkRFUl9fCisKKyNpZiBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXworI2RlZmluZSBCQ01fQ1BVX0VORElBTiBCQ01PU19FTkRJQU5fTElUVExFCisjZWxzZQorI2RlZmluZSBCQ01fQ1BVX0VORElBTiBCQ01PU19FTkRJQU5fQklHCisjZW5kaWYKKworI2Vsc2UKKworLyogV2UgYXJlIGRlYWxpbmcgd2l0aCBjb21waWxlciB0aGF0IGRvZXNuJ3Qgc2V0IF9fQllURV9PUkRFUl9fLgorICogSWYgaXQgaXMgc2ltdWxhdGlvbiBidWlsZCB0aGFuIGl0IG11c3QgYmUgTEUgeDg2LgorICogT3RoZXJ3aXNlLCBubyB3YXkgdG8gdGVsbC4KKyAqLworI2lmZGVmIFNJTVVMQVRJT05fQlVJTEQKKyNkZWZpbmUgQkNNX0NQVV9FTkRJQU4gQkNNT1NfRU5ESUFOX0xJVFRMRQorI2VuZGlmCisKKyNlbmRpZiAvKiAjaWZkZWYgX19CWVRFX09SREVSICovCisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTV9DUFVfRU5ESUFOICovCisKKyNpbmNsdWRlIDxiY21fY29uZmlnLmg+CisKKy8qKiAyNC1iaXQgdW5zaWduZWQgaW50ZWdlciAqLwordHlwZWRlZiB1bmlvbgoreworICAgIHVpbnQ4X3QgdThbM107CisgICAgc3RydWN0IF9fUEFDS0VEX0FUVFJfU1RBUlRfXworICAgIHsKKyNpZiAoQkNNX0NQVV9FTkRJQU4gPT0gQkNNT1NfRU5ESUFOX0JJRykKKyAgICAgICAgdWludDhfdCBoaTsKKyAgICAgICAgdWludDhfdCBtaWQ7CisgICAgICAgIHVpbnQ4X3QgbG93OworI2VsaWYgKEJDTV9DUFVfRU5ESUFOID09IEJDTU9TX0VORElBTl9MSVRUTEUpCisgICAgICAgIHVpbnQ4X3QgbG93OworICAgICAgICB1aW50OF90IG1pZDsKKyAgICAgICAgdWludDhfdCBoaTsKKyNlbHNlCisjZXJyb3IgQkNNX0NQVV9FTkRJQU4gbXVzdCBiZSBCQ01PU19FTkRJQU5fQklHIG9yIF9MSVRUTEUKKyNlbmRpZgorICAgIH0gX19QQUNLRURfQVRUUl9FTkRfXyBsb3dfaGk7Cit9IHVpbnQyNF90OworCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHVpbnQyNF90b18zMih1aW50MjRfdCB1MjQpCit7CisgICAgcmV0dXJuICh1MjQubG93X2hpLmhpIDw8IDE2KSB8ICh1MjQubG93X2hpLm1pZCA8PCA4KSB8IHUyNC5sb3dfaGkubG93OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQyNF90IHVpbnQzMl90b18yNCh1aW50MzJfdCB1MzIpCit7CisgICAgcmV0dXJuICh1aW50MjRfdCl7IC5sb3dfaGk9IHsgLmhpID0gKHUzMiA+PiAxNikgJiAweGZmLCAubWlkID0gKHUzMiA+PiA4KSAmIDB4ZmYsIC5sb3cgPSB1MzIgJiAweGZmIH0gfTsKK30KKworLyoqIFZMQU4gdGFnIChDb1MvQ0ZJL1ZJRCkgKi8KK3R5cGVkZWYgdWludDE2X3QgYmNtb3Nfdmxhbl90YWc7CisKKyNkZWZpbmUgQkNNT1NfRVRIX0FMRU4gICA2CisKKy8qKiBNQUMgYWRkcmVzcyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IHU4W0JDTU9TX0VUSF9BTEVOXTsKK30gYmNtb3NfbWFjX2FkZHJlc3M7CisKKy8qKiBJUHY0IGFkZHJlc3MuIEl0IGlzIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuICovCit0eXBlZGVmIHVuaW9uCit7CisgICAgdWludDMyX3QgdTMyOworICAgIHVpbnQ4X3QgdThbNF07Cit9IGJjbW9zX2lwdjRfYWRkcmVzczsKKworLyoqIElQdjYgYWRkcmVzcyAqLwordHlwZWRlZiB1aW50OF90IGJjbW9zX2lwdjZfYWRkcmVzc1sxNl07CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19tYWNfYWRkcmVzc19pbml0KGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgbWVtc2V0KG1hYywgMCwgc2l6ZW9mKCptYWMpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2lwdjRfYWRkcmVzc19pbml0KGJjbW9zX2lwdjRfYWRkcmVzcyAqaXApCit7CisgICAgbWVtc2V0KGlwLCAwLCBzaXplb2YoKmlwKSk7Cit9CisKKyNpZm5kZWYgQ0ZFX0JVSUxECitzdGF0aWMgaW5saW5lIGNoYXIgKmJjbW9zX2luZXRfbnRvYShiY21vc19pcHY0X2FkZHJlc3MgKmlwLCBjaGFyICppcF9zdHIpCit7CisgICAgc25wcmludGYoaXBfc3RyLCAxNiwgIiV1LiV1LiV1LiV1IiwgaXAtPnU4WzBdLCBpcC0+dThbMV0sIGlwLT51OFsyXSwgaXAtPnU4WzNdKTsKKworICAgIHJldHVybiBpcF9zdHI7Cit9CisjZW5kaWYKKworI2lmbmRlZiBjb250YWluZXJfb2YKKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoeyAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKl9fbXB0ciA9IChwdHIpOyAgICBcCisgICAgICAgICh0eXBlICopKCAobG9uZylfX21wdHIgLSBvZmZzZXRvZih0eXBlLG1lbWJlcikgKTt9KQorI2VuZGlmCisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogQkNNT1NfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vY2ZlL2JjbW9sdF9tb2RlbF9kYXRhX2NmZV9leHQuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vY2ZlL2JjbW9sdF9tb2RlbF9kYXRhX2NmZV9leHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGNhOWNlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9jZmUvYmNtb2x0X21vZGVsX2RhdGFfY2ZlX2V4dC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworCisjaWZuZGVmIEJDTU9TX01PREVMX0RBVEFfQ0ZFX0VYVF9IXworI2RlZmluZSBCQ01PU19NT0RFTF9EQVRBX0NGRV9FWFRfSF8KKworI2luY2x1ZGUgImJjbW9sdF9tb2RlbF9kYXRhLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworICAgIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIG5uaV9zcGVlZDsKKyAgICBiY21vc19ib29sIHVzZV9wcmV2X25uaV9zZXJkZXNfZmlybXdhcmU7Cit9IGRiX3JlY19kZXZpY2U7CisKKy8qIFN5c3RlbSBtb2RlICovCitzdGF0aWMgYmNtb2x0X3N5c3RlbV9tb2RlIGRldmljZV9zeXN0ZW1fbW9kZTsKKworLyoqIFNldCBzeXN0ZW0gbW9kZQorICogXHBhcmFtW2luXSAgZGV2ICAgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICBzeXN0ZW1fbW9kZSAgICBTeXN0ZW0gbW9kZQorICogXHJldHVybnMgQkNNX0VSUl9PSywgQkNNX0VSUl9OT1RfU1VQUE9SVEVECisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXJybm8gYmNtb2x0X3N5c3RlbV9tb2RlX3NldCh1aW50MTZfdCBkZXYsIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSkKK3sKKyAgICBkZXZpY2Vfc3lzdGVtX21vZGUgPSBzeXN0ZW1fbW9kZTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEdldCBzeXN0ZW0gbW9kZQorICogXHBhcmFtW2luXSAgZGV2ICAgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICBzeXN0ZW1fbW9kZSAgICBTeXN0ZW0gbW9kZQorICogXHJldHVybnMgQkNNX0VSUl9PSworICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQodWludDE2X3QgZGV2LCBiY21vbHRfc3lzdGVtX21vZGUgKnN5c3RlbV9tb2RlKQoreworICAgICpzeXN0ZW1fbW9kZSA9IGRldmljZV9zeXN0ZW1fbW9kZTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBpc19pc3N1X2Jvb3Qodm9pZCkKK3sKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2NmZS9iY21vc19zeXN0ZW0uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vY2ZlL2JjbW9zX3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2M2NjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2NmZS9iY21vc19zeXN0ZW0uaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpwcm9wcmlldGFyeTpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorCisxLiBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorICAgIGNvbnN0aXR1dGVzIHRoZSB2YWx1YWJsZSB0cmFkZSBzZWNyZXRzIG9mIEJyb2FkY29tLCBhbmQgeW91IHNoYWxsIHVzZQorICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tCisgICAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKworMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorICAgIExJTUlURUQgUkVNRURZLgorOj4KKyovCisjaWZuZGVmIEJDTU9TX1NZU1RFTV9IXworI2RlZmluZSBCQ01PU19TWVNURU1fSF8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAibGliX3R5cGVzLmgiCisjaW5jbHVkZSAibGliX3N0cmluZy5oIgorCisjaW5jbHVkZSAiLi4vYmNtb3NfZXJybm8uaCIKKyNpbmNsdWRlICIuLi9iY21vc190eXBlcy5oIgorI2luY2x1ZGUgIi4uL2JjbW9zX2VuZGlhbi5oIgorI2luY2x1ZGUgImNmZV90aW1lci5oIgorI2luY2x1ZGUgImxpYl9wcmludGYuaCIKKworI2RlZmluZSBiY21vc19wcmludGYgcHJpbnRmCisKKyNkZWZpbmUgYmNtb3NfdXNsZWVwKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBjZmVfdXNsZWVwICh4KTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoMCkgCisvKiBEZWZpbmUgYmNtb3NfYm9vbCAtIHRoZSBib29sZWFuIHR5cGUgZm9yIGJjbW9zIC0gYmFzZWQgb24gQzk5IHN0YW5kYXJkIGJvb2xlYW4gdHlwZSAqLworI2lmbmRlZiBCQ01PU19CT09MRUFOCit0eXBlZGVmIF9Cb29sIGJjbW9zX2Jvb2w7CisjZGVmaW5lIEJDTU9TX0ZBTFNFIDAKKyNkZWZpbmUgQkNNT1NfVFJVRSAxCisjZW5kaWYKKworI2RlZmluZSBQRVJJUEhfR0VOSU5UX1JFVklEICAgICAgICAgICAgICAweGZmZTAwMDAwCisjZGVmaW5lIENISVBfUkVWX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkYKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9jaGlwX3JldmlzaW9uKHZvaWQpCit7CisgICAgcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgaW50KilQRVJJUEhfR0VOSU5UX1JFVklEICYgQ0hJUF9SRVZfTUFTSzsKK30gCisKKyNkZWZpbmUgQ0hJUF9SRVZJU0lPTl9BMCAweEEwCisjZGVmaW5lIENISVBfUkVWSVNJT05fQjAgMHhCMAorCisjaWZkZWYgU0lNVUxBVElPTl9CVUlMRAorI2RlZmluZSBHRVRfQ0hJUF9SRVZJU0lPTiBDSElQX1JFVklTSU9OX0EwCisjZWxzZQorZXh0ZXJuIHVpbnQzMl90IGNoaXBfcmV2aXNpb247CisjZGVmaW5lIEdFVF9DSElQX1JFVklTSU9OIChjaGlwX3JldmlzaW9uICE9IDAgPyBjaGlwX3JldmlzaW9uIDogKGNoaXBfcmV2aXNpb24gPSBnZXRfY2hpcF9yZXZpc2lvbigpKSkKKyNlbmRpZgorCisKK3R5cGVkZWYgdWludDE2X3QgYmNtb3NfZmFzdGxvY2s7CisjZGVmaW5lIEJDTU9TX0ZBU1RMT0NLX0lOSVRJQUxJWkVSIDAKKyNkZWZpbmUgYmNtb3NfZmFzdGxvY2tfbG9jayhmYXN0bG9jaykgKGxvbmcpZmFzdGxvY2sKKyNkZWZpbmUgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKGZhc3Rsb2NrLCBmbGFncykgICh2b2lkKWZsYWdzCisKK3R5cGVkZWYgdWludDE2X3QgYmNtb3NfbXV0ZXg7CisjZGVmaW5lIGJjbW9zX211dGV4X2NyZWF0ZShtdXRleCwgZmxhZ3MsIG5hbWUpICAKKyNkZWZpbmUgYmNtb3NfbXV0ZXhfbG9jayhtdXRleCkKKyNkZWZpbmUgYmNtb3NfbXV0ZXhfdW5sb2NrKG11dGV4KQorCisKKyNkZWZpbmUgQkNNX1NJWkVPRkFSUkFZKGFycikgKHNpemVvZihhcnIpL3NpemVvZigqYXJyKSkKKyNkZWZpbmUgQkNNX1NJWkVPRkZJRUxEKHMsIGYpIChzaXplb2YoKChzKilOVUxMKS0+ZikpCisjZGVmaW5lIEJDTV9NRU1aRVJPX1NUUlVDVChwdHIpIG1lbXNldChwdHIsIDAsIHNpemVvZigqKHB0cikpKQorI2RlZmluZSBCQ01fTUVNQ1BZX0FSUkFZKGRzdCwgc3JjKSBtZW1jcHkoZHN0LCBzcmMsIHNpemVvZihkc3QpKQorCisKKyNkZWZpbmUgQlVHX09OX1BSSU5UKGNvbmRpdGlvbiwgZm10LCBhcmdzLi4uKSBcCisgICAgZG8gXAorICAgIHsgXAorICAgICAgICBpZiAoY29uZGl0aW9uKSBcCisgICAgICAgIHsgXAorICAgICAgICAgICAgcHJpbnRmKGZtdCwgIyNhcmdzKTsgXAorICAgICAgICAgICAgLyogT24gb25lIGhhbmQsIGRvbid0IGxldCB0aGlzIHRhc2sgY29udGludWUgLSBpdCBpcyBsaWtlbHkgdG8gY3Jhc2gvY3JlYXRlIGEgc3lzdGVtIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAqIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBtdXN0bid0IGRvIGEgYnVzeSBsb29wIC0gb3RoZXJ3aXNlIGl0IGNhbiBjYXVzZSBsb3dlciBwcmlvcml0eSB0YXNrcyB0byBzdG9wIHJlc3BvbmRpbmcuICovIFwKKyAgICAgICAgICAgIHdoaWxlICgxKSBcCisgICAgICAgICAgICAgICAgYmNtb3NfdXNsZWVwKDEwMDAwMDAwKTsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEJVR19PTihjb25kaXRpb24pICAgICAgQlVHX09OX1BSSU5UKChjb25kaXRpb24pLCAiQlVHIGluICVzICVkIVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNkZWZpbmUgQlVHKCkgICAgICAgICAgICAgICAgICBCVUdfT04oMSkKKyNkZWZpbmUgQlVHX1VOTEVTUyhjb25kaXRpb24pICBCVUdfT04oIShjb25kaXRpb24pKQorCisKKyNkZWZpbmUgQkNNT1NfVFJBQ0VfRVJSKGZtdCwgYXJncy4uLikgXAorICAgIGRvIFwKKyAgICB7IFwKKyAgICAgICAgcHJpbnRmKCBmbXQsICMjIGFyZ3MpOyBcCisgICB9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgYmNtb3NfdnByaW50ZiBwcmludGYKKyNkZWZpbmUgYmNtb3NfY2FsbG9jKHMpIEtNQUxMT0MoKHMpLCAwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vbGludXgvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2xpbnV4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NmY3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2xpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsMzEgQEAKKyMgTGludXgga2VybmVsIE9TIGFic3RyYWN0aW9uCisjCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKworTU9EX05BTUUgPSBvc19saW51eAorTU9EX1RZUEUgPSBsaW51eF9tb2R1bGUKK01PRF9TVVBQUkVTU19PU19ERVAgPSB5CitNT0RfREVQUyA9IGxsX3BjaWUKKworTU9EX0lOQ19ESVJTID0gJChTUkNfRElSKSAkKFNSQ19ESVIpLy4uCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfSU5DX0RJUlMgKz0gaG9zdF9kcml2ZXIvY29uZmlnCitlbHNlCisgICAgTU9EX0lOQ19ESVJTICs9ICQoU1VCU1lTVEVNKS9vc19hYnN0cmFjdGlvbi8kKFBMQVRGT1JNKSAkKFNVQlNZU1RFTSkvY29uZmlnCitlbmRpZgorCitFWFRSQV9DRkxBR1MgKz0gLURCQ01PU19UUkFDRV9QUklOVEYKKworc3JjcyA9IGJjbW9zX3N5c3RlbS5jIC4uL2JjbW9zX2Vycm5vLmMgLi4vYmNtb3NfY29tbW9uLmMKKworaWZlcSAoIiQoREVCVUcpIiwgInkiKQorCU1PRF9ERUZTCSs9IC1EQkNNT1NfTUVNX0RFQlVHIC1EQkNNT1NfU1lTX1VOSVRURVNUCitlbmRpZgorCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKKworZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vbGludXgvYmNtb3Nfc3lzdGVtLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2xpbnV4L2JjbW9zX3N5c3RlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNGEwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2xpbnV4L2JjbW9zX3N5c3RlbS5jCkBAIC0wLDAgKzEsNTM2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtb3Nfc3lzdGVtLmMKKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHN1YnNldCBvZiBPUyBBYnN0cmFjdGlvbiBzZXJ2aWNlcworICogZm9yIGxpbnV4IGtlcm5lbAorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGNpLWRtYS1jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkdGFibGUuaD4KKworI2luY2x1ZGUgPGJjbW9sdF9sbHBjaWUuaD4KKworLyogdGFzayBjb250cm9sIGJsb2NrcyAqLworZXh0ZXJuIFNUQUlMUV9IRUFEKHRhc2tfbGlzdCwgYmNtb3NfdGFzaykgdGFza19saXN0OworCisvKiBnbG9iYWwgT1MgbG9jayAqLworZXh0ZXJuIGJjbW9zX211dGV4IGJjbW9zX3Jlc19sb2NrOworCisvKiBJbml0aWFsaXplIHN5c3RlbSBsaWJyYXJ5ICovCitiY21vc19lcnJubyBiY21vc19zeXNfaW5pdCh2b2lkKQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorLyogQ2xlYW4tdXAgc3lzdGVtIGxpYnJhcnkgKi8KK3ZvaWQgYmNtb3Nfc3lzX2V4aXQodm9pZCkKK3sKK30KKworLyoKKyAqIFRocmVhZCBoYW5kbGVyCisgKi8KK3N0YXRpYyBpbnQgYmNtb3NfdGFza19oYW5kbGVyKHZvaWQgKmRhdGEpCit7CisgICAgYmNtb3NfdGFzayAqdGFzayA9IChiY21vc190YXNrICopZGF0YTsKKyAgICBGX2JjbW9zX3Rhc2tfaGFuZGxlciBoYW5kbGVyOworICAgIGxvbmcgaGFuZGxlcl9kYXRhOworCisgICAgdGFzay0+c3lzX3Rhc2sudCA9IGN1cnJlbnQ7CisKKyAgICBpZiAodGFzay0+cGFybS5oYW5kbGVyKQorICAgIHsKKyAgICAgICAgLyogInRyYWRpdGlvbmFsIHRhc2sgKi8KKyAgICAgICAgaGFuZGxlciA9IHRhc2stPnBhcm0uaGFuZGxlcjsKKyAgICAgICAgaGFuZGxlcl9kYXRhID0gdGFzay0+cGFybS5kYXRhOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiAiaW50ZWdyYXRlZCIgdGFzayAqLworICAgICAgICBoYW5kbGVyID0gYmNtb3NfZGZ0X3Rhc2tfaGFuZGxlcjsKKyAgICAgICAgaGFuZGxlcl9kYXRhID0gKGxvbmcpdGFzazsKKyAgICB9CisgICAgaGFuZGxlcihoYW5kbGVyX2RhdGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgX2JjbW9zX2JhY2t0cmFjZSh2b2lkKQoreworICAgIC8qdG9kbyBpbXBsZW1lbnQgdGhpcyovCit9CisKKy8qIENyZWF0ZSBhIG5ldyB0YXNrLgorICogQXR0ZW50aW9uISBQcmlvcml0eSBpcyBpZ25vcmVkLgorICovCitiY21vc19lcnJubyBiY21vc190YXNrX2NyZWF0ZShiY21vc190YXNrICp0YXNrLCBjb25zdCBiY21vc190YXNrX3Bhcm0gKnBhcm0pCit7CisgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKCF0YXNrIHx8ICFwYXJtKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgbWVtc2V0KHRhc2ssIDAsIHNpemVvZigqdGFzaykpOworICAgIHRhc2stPnBhcm0gPSAqcGFybTsKKyAgICBpZiAoIXBhcm0tPmhhbmRsZXIpCisgICAgeworICAgICAgICAvKiBJbml0aWFsaXplIGFuZCBsb2NrIG11dGV4IHRvIHdhaXQgb24gKi8KKyAgICAgICAgcmMgPSBiY21vc19zZW1fY3JlYXRlKCZ0YXNrLT5hY3RpdmVfc2VtLCAwLCB0YXNrLT5wYXJtLmZsYWdzLCBwYXJtLT5uYW1lKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoIlRhc2sgJXM6IGNhbid0IGNyZWF0ZSBhY3RpdmVfc2VtLiBFcnJvciAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgIHRhc2stPnBhcm0ubmFtZSwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQ29weSBuYW1lIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5vdCByZWxlYXNlZCAtIGluIGNhc2UgaXQgd2FzIG9uIHRoZSBzdGFjayAqLworICAgIGlmICh0YXNrLT5wYXJtLm5hbWUpCisgICAgeworICAgICAgICBzdHJuY3B5KHRhc2stPm5hbWUsIHRhc2stPnBhcm0ubmFtZSwgc2l6ZW9mKHRhc2stPm5hbWUpIC0gMSk7CisgICAgICAgIHRhc2stPnBhcm0ubmFtZSA9IHRhc2stPm5hbWU7CisgICAgfQorICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJnRhc2stPmFjdGl2ZV9sb2NrLCAwKTsKKyAgICB0YXNrLT5tYWdpYyA9IEJDTU9TX1RBU0tfTUFHSUM7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgIFNUQUlMUV9JTlNFUlRfVEFJTCgmdGFza19saXN0LCB0YXNrLCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKworICAgIHQgPSBrdGhyZWFkX3J1bihiY21vc190YXNrX2hhbmRsZXIsIHRhc2ssIHBhcm0tPm5hbWUpOworICAgIGlmICh0ID09IEVSUl9QVFIoLUVOT01FTSkpCisgICAgeworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgICAgIFNUQUlMUV9SRU1PVkUoJnRhc2tfbGlzdCwgdGFzaywgYmNtb3NfdGFzaywgbGlzdCk7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgICAgICB0YXNrLT5tYWdpYyA9IDA7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IHRhc2sgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfZGVzdHJveShiY21vc190YXNrICp0YXNrKQoreworICAgIGlmICh0YXNrLT5tYWdpYyAhPSBCQ01PU19UQVNLX01BR0lDKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKCF0YXNrLT5zeXNfdGFzay50KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorICAgIHRhc2stPmRlc3Ryb3lfcmVxdWVzdCA9IEJDTU9TX1RSVUU7CisgICAgdGFzay0+bWFnaWMgPSBCQ01PU19UQVNLX01BR0lDX0RFU1RST1lFRDsKKyAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgU1RBSUxRX1JFTU9WRSgmdGFza19saXN0LCB0YXNrLCBiY21vc190YXNrLCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICAvKiBUaGUgdGFzayBtYXkgYmUgd2FpdGluZyBvbiBzZW1hcGhvcmUuIEtpY2sgaXQgKi8KKyAgICBpZiAoIXRhc2stPnBhcm0uaGFuZGxlcikKKyAgICB7CisgICAgICAgIGJjbW9zX3NlbV9wb3N0KCZ0YXNrLT5hY3RpdmVfc2VtKTsKKyAgICB9CisKKyAgICAvKiBTb21ldGltZXMgYnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUgdGhlIHRhc2sgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZCBvZi4KKyAgICAgKiBUT0RPOiBpbnZlc3RpZ2F0ZSB3aHkgKi8KKyAgICBpZiAodGFzay0+c3lzX3Rhc2sudC0+Y3JlZCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga3RocmVhZF9zdG9wKHRhc2stPnN5c190YXNrLnQpOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEdldCBjdXJyZW50IHRhc2sKKyAqIFxyZXR1cm5zIHRhc2sgaGFuZGxlIG9yIE5VTEwgaWYgbm90IGluIHRhc2sgY29udGV4dAorICovCitiY21vc190YXNrICpiY21vc190YXNrX2N1cnJlbnQodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmt0ID0gY3VycmVudDsKKyAgICBiY21vc190YXNrICp0LCAqdG1wOworCisgICAgU1RBSUxRX0ZPUkVBQ0hfU0FGRSh0LCAmdGFza19saXN0LCBsaXN0LCB0bXApCisgICAgeworICAgICAgICBpZiAodC0+c3lzX3Rhc2sudCA9PSBrdCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdDsKK30KKworLyogdGltZXIgc2lnbmFsIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIHN5c190aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19zeXNfdGltZXIgKnRpbWVyID0gKGJjbW9zX3N5c190aW1lciAqKWRhdGE7CisgICAgdGltZXItPmhhbmRsZXIodGltZXItPmRhdGEpOworfQorCisvKiBDcmVhdGUgdGltZXIgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3N5c190aW1lcl9jcmVhdGUoYmNtb3Nfc3lzX3RpbWVyICp0aW1lciwgYmNtb3Nfc3lzX3RpbWVyX2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoIXRpbWVyIHx8ICFoYW5kbGVyKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAidGltZXIgJXAsIGhhbmRsZXIgJXBcbiIsIHRpbWVyLCBoYW5kbGVyKTsKKworICAgdGltZXItPmhhbmRsZXIgPSBoYW5kbGVyOworICAgdGltZXItPmRhdGEgPSBkYXRhOworICAgaW5pdF90aW1lcigmdGltZXItPnQpOworICAgdGltZXItPnQuZnVuY3Rpb24gPSBzeXNfdGltZXJfaGFuZGxlcjsKKyAgIHRpbWVyLT50LmRhdGEgPSAodW5zaWduZWQgbG9uZyl0aW1lcjsKKworICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERlc3Ryb3kgdGltZXIgKi8KK3ZvaWQgYmNtb3Nfc3lzX3RpbWVyX2Rlc3Ryb3koYmNtb3Nfc3lzX3RpbWVyICp0aW1lcikKK3sKKyAgICBkZWxfdGltZXJfc3luYygmdGltZXItPnQpOworfQorCisvKiAoUmUpc3RhcnQgdGltZXIgKi8KK3ZvaWQgYmNtb3Nfc3lzX3RpbWVyX3N0YXJ0KGJjbW9zX3N5c190aW1lciAqdGltZXIsIHVpbnQzMl90IGRlbGF5KQoreworICAgIC8qIENvbnZlcnQgZGVsYXkgdXMgLS0+IHRpY2tzICovCisgICAgdWludDMyX3QgdGlja3MgPSB1c2Vjc190b19qaWZmaWVzKGRlbGF5KTsKKyAgICBtb2RfdGltZXIoJnRpbWVyLT50LCBqaWZmaWVzICsgdGlja3MpOworfQorCisvKiBTdG9wIHRpbWVyIGlmIHJ1bm5pbmcgKi8KK3ZvaWQgYmNtb3Nfc3lzX3RpbWVyX3N0b3AoYmNtb3Nfc3lzX3RpbWVyICp0aW1lcikKK3sKKyAgICAvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nLiBTeXN0ZW0gdGltZXIgaXNuJ3QgcnVubmluZyAqLworfQorCit2b2lkIGJjbW9zX3VzbGVlcCh1aW50MzJfdCB1KQoreworICAgIGlmICh1ID49IDEwMDAwKQorICAgICAgICBtc2xlZXAoKHUgKyA5OTkpIC8gMTAwMCk7CisgICAgZWxzZQorICAgICAgICB1ZGVsYXkodSk7Cit9CisKKy8qCisgKiBTZW1hcGhvcmUKKyAqLworCisvKiBEZWNyZW1lbnQgc2VtYXBob3JlIGNvdW50ZXIuIFdhaXQgaWYgdGhlIGNvdW50ZXIgaXMgMC4KKyAqLworYmNtb3NfZXJybm8gYmNtb3Nfc2VtX3dhaXQoYmNtb3Nfc2VtICpzZW0sIHVpbnQzMl90IHRpbWVvdXQpCit7CisgICAgaWYgKHRpbWVvdXQpCisgICAgeworICAgICAgICBpZiAodGltZW91dCAhPSBCQ01PU19XQUlUX0ZPUkVWRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkb3duX3RpbWVvdXQoJnNlbS0+cywgdXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkb3duX2ludGVycnVwdGlibGUoJnNlbS0+cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgLyogMCB0aW1lb3V0ICovCisgICAgaWYgKGRvd25fdHJ5bG9jaygmc2VtLT5zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKgorICogQnl0ZSBtZW1vcnkgcG9vbAorICovCisKKy8qIE1lbW9yeSBibG9jayBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX2J5dGVfbWVtYmxrCit7CisgICAgYmNtb3NfYnl0ZV9wb29sICpwb29sOyAgICAgIC8qKiBwb29sIHRoYXQgb3ducyB0aGUgYmxvY2sgKi8KKyAgICB1aW50MzJfdCBzaXplOyAgICAgICAgICAgICAgLyoqIGJsb2NrIHNpemUgKGJ5dGVzKSBpbmNsdWRpbmcgYmNtb3NfYnl0ZV9tZW1ibGsgaGVhZGVyICovCisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgdWludDMyX3QgbWFnaWM7ICAgICAgICAgICAgIC8qKiBtYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgQkNNT1NfTUVNX01BR0lDX0FMTE9DICAgKCgnbSc8PDI0KSB8ICgnYicgPDwgMTYpIHwgKCdsJyA8PCA4KSB8ICdrJykKKyNkZWZpbmUgQkNNT1NfTUVNX01BR0lDX0ZSRUUgICAgKCgnbSc8PDI0KSB8ICgnYicgPDwgMTYpIHwgKCdsJyA8PCA4KSB8ICd+JykKKyNlbmRpZgorfSBiY21vc19ieXRlX21lbWJsazsKKworLyogQ3JlYXRlIGJ5dGUgbWVtb3J5IHBvb2wgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2J5dGVfcG9vbF9jcmVhdGUoYmNtb3NfYnl0ZV9wb29sICpwb29sLCBjb25zdCBiY21vc19ieXRlX3Bvb2xfcGFybSAqcGFybSkKK3sKKyAgICBpZiAoIXBvb2wgfHwgIXBhcm0pCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAicG9vbCAlcCwgcGFybSAlcFxuIiwgcG9vbCwgcGFybSk7CisgICAgfQorCisgICAgQkNNX01FTVpFUk9fU1RSVUNUKHBvb2wpOworICAgIHBvb2wtPnBhcm0gPSAqcGFybTsKKyAgICBpZiAoIXBvb2wtPnBhcm0uc2l6ZSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJzaXplICV1XG4iLCBwYXJtLT5zaXplKTsKKyAgICB9CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgcG9vbC0+bWFnaWMgPSBCQ01PU19CWVRFX1BPT0xfVkFMSUQ7CisjZW5kaWYKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogRGVzdHJveSBtZW1vcnkgcG9vbCAqLworYmNtb3NfZXJybm8gYmNtb3NfYnl0ZV9wb29sX2Rlc3Ryb3koYmNtb3NfYnl0ZV9wb29sICpwb29sKQoreworICAgIGlmIChwb29sLT5hbGxvY2F0ZWQpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9TVEFURSwgIiV1IGJ5dGVzIG9mIG1lbW9yeSBhcmUgc3RpbGwgYWxsb2NhdGVkIGZyb20gdGhlIHBvb2wgJXNcbiIsCisgICAgICAgICAgICBwb29sLT5hbGxvY2F0ZWQsIHBvb2wtPnBhcm0ubmFtZSk7CisgICAgfQorI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHBvb2wtPm1hZ2ljID0gQkNNT1NfQllURV9QT09MX0RFTEVURUQ7CisjZW5kaWYKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQWxsb2NhdGUgbWVtb3J5IGZyb20gbWVtb3J5IHBvb2wgKi8KK3ZvaWQgKmJjbW9zX2J5dGVfcG9vbF9hbGxvYyhiY21vc19ieXRlX3Bvb2wgKnBvb2wsIHVpbnQzMl90IHNpemUpCit7CisgICAgYmNtb3NfYnl0ZV9tZW1ibGsgKmJsazsKKyAgICB1aW50MzJfdCBieXRlX3NpemU7CisgICAgdm9pZCAqcHRyOworCisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgQlVHX09OKHBvb2wtPm1hZ2ljICE9IEJDTU9TX0JZVEVfUE9PTF9WQUxJRCk7CisjZW5kaWYKKworICAgIGlmIChzaXplICsgcG9vbC0+YWxsb2NhdGVkID4gcG9vbC0+cGFybS5zaXplKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGJ5dGVfc2l6ZSA9IHNpemUgKyBzaXplb2YoYmNtb3NfYnl0ZV9tZW1ibGspOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIGJ5dGVfc2l6ZSArPSBzaXplb2YodWludDMyX3QpOyAvKiBibG9jayBzdWZmaXggKi8KKyNlbmRpZgorICAgIC8qIFRvRG86IE1haW50YWluIExMIG9mIGFsbG9jYXRlZCBibG9ja3MgKi8KKyAgICBibGsgPSAoYmNtb3NfYnl0ZV9tZW1ibGsgKiliY21vc19hbGxvYyhieXRlX3NpemUpOworICAgIGlmICghYmxrKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSAodm9pZCAqKShibGsgKyAxKTsKKyAgICBibGstPnNpemUgPSBieXRlX3NpemU7CisgICAgcG9vbC0+YWxsb2NhdGVkICs9IGJ5dGVfc2l6ZTsKKyAgICBibGstPnBvb2wgPSBwb29sOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIGJsay0+bWFnaWMgPSBCQ01PU19NRU1fTUFHSUNfQUxMT0M7CisgICAgKih1aW50MzJfdCAqKSgobG9uZylibGsgKyBieXRlX3NpemUgLSBzaXplb2YodWludDMyX3QpKSA9IEJDTU9TX01FTV9NQUdJQ19BTExPQzsKKyNlbmRpZgorCisgICAgcmV0dXJuIHB0cjsKK30KKworLyogUmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIHVzaW5nIGJjbW9zX2J5dGVfcG9vbF9hbGxvYygpICovCit2b2lkIGJjbW9zX2J5dGVfcG9vbF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgICBiY21vc19ieXRlX21lbWJsayAqYmxrOworICAgIGJjbW9zX2J5dGVfcG9vbCAqcG9vbDsKKworICAgIEJVR19PTighcHRyKTsKKyAgICBibGsgPSAoYmNtb3NfYnl0ZV9tZW1ibGsgKikoKGxvbmcpcHRyIC0gc2l6ZW9mKGJjbW9zX2J5dGVfbWVtYmxrKSk7CisgICAgcG9vbCA9IGJsay0+cG9vbDsKKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBCVUdfT04ocG9vbC0+bWFnaWMgIT0gQkNNT1NfQllURV9QT09MX1ZBTElEKTsKKyAgICBCVUdfT04oYmxrLT5tYWdpYyAhPSBCQ01PU19NRU1fTUFHSUNfQUxMT0MpOworICAgIEJVR19PTigqKHVpbnQzMl90ICopKChsb25nKWJsayArIGJsay0+c2l6ZSAtIHNpemVvZih1aW50MzJfdCkpICE9IEJDTU9TX01FTV9NQUdJQ19BTExPQyk7CisgICAgYmxrLT5tYWdpYyA9IEJDTU9TX01FTV9NQUdJQ19GUkVFOworI2VuZGlmCisgICAgcG9vbC0+YWxsb2NhdGVkIC09IGJsay0+c2l6ZTsKKyAgICBiY21vc19mcmVlKGJsayk7Cit9CisKKy8qCisgKiBETUEtYWJsZSBtZW1vcnkgbWFuYWdlbWVudAorICovCisKKy8qIERtYS1hYmxlIGJsb2NrIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKyAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGU7CisgICAgdWludDMyX3Qgc2l6ZTsKK30gYmNtb3NfZG1hX21lbV9oZHI7CisKKy8qIEFsbG9jYXRlIERNQS1hYmxlIG1lbW9yeSAqLwordm9pZCAqYmNtb3NfZG1hX2FsbG9jKHVpbnQ4X3QgZGV2aWNlLCB1aW50MzJfdCBzaXplKQoreworICAgIGJjbW9zX2RtYV9tZW1faGRyIGhkciA9CisgICAgeworICAgICAgICAucGRldiA9IChzdHJ1Y3QgcGNpX2RldiAqKWJjbV9sbF9wY2llX2Rldl9nZXQoZGV2aWNlKSwKKyAgICAgICAgLnNpemUgPSBzaXplCisgICAgfTsKKyAgICB2b2lkICpwdHI7CisKKyAgICBpZiAoIWhkci5wZGV2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGRyLnBkZXYsIHNpemUgKyBzaXplb2YoYmNtb3NfZG1hX21lbV9oZHIpLCAmaGRyLmRtYV9oYW5kbGUpOworICAgIGlmIChwdHIpCisgICAgeworICAgICAgICBtZW1jcHkocHRyLCAmaGRyLCBzaXplb2YoaGRyKSk7CisgICAgfQorICAgIHJldHVybiAodm9pZCAqKSgobG9uZylwdHIgKyBzaXplb2YoaGRyKSk7Cit9CisKKy8qIFJlbGVhc2UgRE1BLWFibGUgbWVtb3J5ICovCit2b2lkIGJjbW9zX2RtYV9mcmVlKHVpbnQ4X3QgZGV2aWNlLCB2b2lkICpwdHIpCit7CisgICAgYmNtb3NfZG1hX21lbV9oZHIgaGRyOworCisgICAgLyogU3RlcCBiYWNrIHRvIHByZWZpeCBhcmVhICovCisgICAgcHRyID0gKHZvaWQgKikoKGxvbmcpcHRyIC0gc2l6ZW9mKGhkcikpOworICAgIG1lbWNweSgmaGRyLCBwdHIsIHNpemVvZihoZHIpKTsKKworICAgIC8qIFNhbml0eSBjaGVjayAqLworICAgIGlmICghaGRyLnBkZXYgfHwgaGRyLnBkZXYgIT0gYmNtX2xsX3BjaWVfZGV2X2dldChkZXZpY2UpKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIhISFBdHRlbXB0IHRvIHJlbGVhc2UgaW5zYW5lIERNQS1hYmxlIHBvaW50ZXIuIHB0cj0lcCBwZGV2PSVwLyVwXG4iLAorICAgICAgICAgICAgcHRyLCBoZHIucGRldiwgYmNtX2xsX3BjaWVfZGV2X2dldChkZXZpY2UpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhkci5wZGV2LCBoZHIuc2l6ZSwgcHRyLCBoZHIuZG1hX2hhbmRsZSk7Cit9CisKKy8qCisgKiBQcmludCB0byB0aGUgY3VycmVudCBwcm9jZXNzJyBzdGRvdXQKKyAqLworCisjaWZuZGVmIFNURE9VVF9GSUxFTk8KKyNkZWZpbmUgU1RET1VUX0ZJTEVOTyAxCisjZW5kaWYKKworc3RhdGljIGludCBfYmNtb3Nfd3JpdGUoc3RydWN0IGZpbGUgKmZkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisgICAgbW1fc2VnbWVudF90IG9sZGZzOworICAgIGludCBsZW4wID0gbGVuOworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisgICAgd2hpbGUobGVuKQorICAgIHsKKyAgICAgICAgaW50IGx3OworICAgICAgICBsdyA9IHZmc193cml0ZShmZCwgKGNoYXIgKilidWYsIGxlbiwgJmZkLT5mX3Bvcyk7CisgICAgICAgIGlmIChsdyA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGVuIC09IGx3OworICAgICAgICBpZiAobGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBidWYgKz0gbHc7CisgICAgICAgIH0KKyAgICB9CisgICAgc2V0X2ZzKG9sZGZzKTsKKyAgICByZXR1cm4gKGxlbjAgLSBsZW4pOworfQorCitpbnQgYmNtb3Nfc3lzX3ZwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgICAgc3RydWN0IGZpbGUgKmY7CisgICAgaW50IHJjPTA7CisKKyAgICAvKiBHZXQgc3Rkb3V0IGZpbGUgaGFuZGxlIGlmIGFueSAqLworICAgIGlmIChpbl9pbnRlcnJ1cHQoKSB8fCAhY3VycmVudCB8fCAhY3VycmVudC0+ZmlsZXMpCisgICAgICAgIGYgPSAwOworICAgIGVsc2UKKyAgICAgICAgZiA9IGZjaGVjayhTVERPVVRfRklMRU5PKTsKKyAgICBpZiAoIWYpCisgICAgeworICAgICAgICAgcmMgPSB2cHJpbnRrKGZvcm1hdCwgYXJncyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNoYXIgcHJpbnRidWZbMTAyNF07CisgICAgICAgIGNoYXIgKnAxPXByaW50YnVmLCAqcDI7CisgICAgICAgIHZzY25wcmludGYocHJpbnRidWYsIHNpemVvZihwcmludGJ1ZiktMSwgZm9ybWF0LCBhcmdzKTsKKyAgICAgICAgcHJpbnRidWZbc2l6ZW9mKHByaW50YnVmKS0xXT0wOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBwMiA9IHN0cmNocihwMSwgJ1xuJyk7CisgICAgICAgICAgICBpZiAocDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgKz0gX2JjbW9zX3dyaXRlKGYsICh1bnNpZ25lZCBjaGFyKikgcDEsIHAyLXAxKzEpOworICAgICAgICAgICAgICAgIHJjICs9IF9iY21vc193cml0ZShmLCAodW5zaWduZWQgY2hhciopIlxyIiwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgKz0gX2JjbW9zX3dyaXRlKGYsICh1bnNpZ25lZCBjaGFyKilwMSwgc3RybGVuKHAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwMSA9IHAyICsgMTsKKyAgICAgICAgfSB3aGlsZShwMik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGludCBvc19saW51eF9tb2R1bGVfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBiY21vc19pbml0KCk7CisKKyAgICByZXR1cm4gcmMgPyAtRUlOVkFMIDogMDsKK30KKworc3RhdGljIHZvaWQgb3NfbGludXhfbW9kdWxlX2V4aXQodm9pZCkKK3sKKyAgICBiY21vc19leGl0KCk7Cit9CisKK21vZHVsZV9pbml0KG9zX2xpbnV4X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KG9zX2xpbnV4X21vZHVsZV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJPUyBBYnN0cmFjdGlvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCitFWFBPUlRfU1lNQk9MKGJjbW9zX3Rhc2tfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfdGFza19kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfdGFza19jdXJyZW50KTsKK0VYUE9SVF9TWU1CT0woYmNtb3Nfc2VtX3dhaXQpOworRVhQT1JUX1NZTUJPTChiY21vc19zeXNfdHJhY2VfbGV2ZWwpOworRVhQT1JUX1NZTUJPTChiY21vc191c2xlZXApOworRVhQT1JUX1NZTUJPTChiY21vc19ieXRlX3Bvb2xfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfYnl0ZV9wb29sX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChiY21vc19ieXRlX3Bvb2xfYWxsb2MpOworRVhQT1JUX1NZTUJPTChiY21vc19ieXRlX3Bvb2xfZnJlZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX3N5c192cHJpbnRmKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfZG1hX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfZG1hX2ZyZWUpOworRVhQT1JUX1NZTUJPTChfYmNtb3NfYmFja3RyYWNlKTsKK0VYUE9SVF9TWU1CT0woc3dfZXJyb3JfaGFuZGxlcik7CitFWFBPUlRfU1lNQk9MKGJjbW9zX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9saW51eC9iY21vc19zeXN0ZW0uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vbGludXgvYmNtb3Nfc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmMzZmZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vbGludXgvYmNtb3Nfc3lzdGVtLmgKQEAgLTAsMCArMSw1MTkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgKiBiY21vc19zeXN0ZW0uaAorICogTWFwbGUgU3lzdGVtIFNlcnZpY2VzCisgKiBwb3NpeCBwb3J0OiBzaW11bGF0aW9uCisgKi8KKworI2lmbmRlZiBCQ01PU19TWVNURU1fSF8KKyNkZWZpbmUgQkNNT1NfU1lTVEVNX0hfCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIEJDTU9TX0lSUV9TSU5HTEUgICAgMAorI2RlZmluZSBCQ01PU19JUlFfU0hBUkVEICAgIElSUUZfU0hBUkVECisKKy8qIFJlLWRlZmluZSBHTlUgdHlwZW9mIGFzIElTTyBfX3R5cGVvZl9fICovCisjZGVmaW5lIHR5cGVvZiBfX3R5cGVvZl9fCisKKyNkZWZpbmUgc3RydG9sKHMscCxiKSBzaW1wbGVfc3RydG9sKHMscCxiKQorCisvKiBTcGVjaWZ5IGhlcmUgd2hpY2ggc3lzdGVtIGZ1bmN0aW9ucyBhcmUgaW5saW5lZCAqLworCisjZGVmaW5lIEJDTU9TX0ZBU1RMT0NLX0lOTElORQorI2RlZmluZSBCQ01PU19TRU1fSU5MSU5FCisjZGVmaW5lIEJDTU9TX01VVEVYX0lOTElORQorCisjaWZkZWYgRU5BQkxFX0xPRworI2RlZmluZSBCQ01PU19UUkFDRV9JTl9ERVZfTE9HCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEJDTU9TX1RSQUNFX0lOX0RFVl9MT0cpICYmICFkZWZpbmVkKEJDTU9TX1RSQUNFX1BSSU5URikKKyNkZWZpbmUgQkNNT1NfVFJBQ0VfUFJJTlRGCisjZW5kaWYKKworLyogI2RlZmluZSBCQ01PU19CWVRFX1BPT0xfQUxMT0NfRlJFRV9JTkxJTkUgKi8KKyNkZWZpbmUgQkNNT1NfTUFMTE9DX0ZSRUVfSU5MSU5FCisvKiAjZGVmaW5lIEJDTU9TX0NBTExPQ19JTkxJTkUgKi8KKyNkZWZpbmUgQkNNT1NfQlVGX09TX1NQRUNJRklDCisjZGVmaW5lIEJDTU9TX0JVRl9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfSU5URVJSVVBUX0lOTElORQorI2RlZmluZSBCQ01PU19USU1FU1RBTVBfSU5MSU5FCisvKiAjZGVmaW5lIEJDTU9TX0RNQV9BTExPQ19GUkVFX0lOTElORSAqLworI2RlZmluZSBCQ01PU19WSVJUX1RPX1BIWVNfSU5MSU5FCisjZGVmaW5lIEJDTU9TX0NBQ0hFX0lOTElORQorLyogVW5jb21tZW50dGhlIGZvbGxvd2luZyBsaW5lIGlmIGgvdyBzdXBwb3J0cyBETUEgY2FjaGUgY29oZXJlbmN5ICovCisvKiAjZGVmaW5lIEJDTU9TX0RNQV9DQUNIRV9DT0hFUkVOQ1kgKi8KKworLyogZ2V0Y2hhciwgcHV0Y2hhciBhcmUgbm90IHN1cHBvcnQuIGRlZmluZSBhcyBpbmxpbmUgYW5kIHByb3ZpdWRlIGR1bW15IHRhcmdldHMgKi8KKyNkZWZpbmUgQkNNT1NfR0VUQ0hBUl9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfUFVUQ0hBUl9JTkxJTkUKKworI2luY2x1ZGUgImJjbW9zX2NvbW1vbi5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtX3BjaV93cml0ZTMyKHZvbGF0aWxlIHVpbnQzMl90ICphZGRyZXNzLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICB3cml0ZWwodmFsdWUsIGFkZHJlc3MpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbV9wY2lfcmVhZDMyKGNvbnN0IHZvbGF0aWxlIHVpbnQzMl90ICphZGRyZXNzKQoreworCXJldHVybiByZWFkbChhZGRyZXNzKTsKK30KKworCit2b2lkIF9iY21vc19iYWNrdHJhY2Uodm9pZCk7CitpbnQgYmNtb3Nfc3lzX3ZwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpOworCisvKgorICogTWVtb3J5IGFsbG9jYXRpb24KKyAqLworCisvKiBBbGxvY2F0ZSBETUFhYmxlIG1lbW9yeSBmcm9tIHRoZSBtYWluIGhlYXAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqYmNtb3NfYWxsb2ModWludDMyX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4ga21hbGxvYyhzaXplLCBHRlBfRE1BKTsKK30KKworLyogUmVsZWFzZSBtZW1vcnkgdG8gdGhlIG1haW4gcG9vbCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2ZyZWUodm9pZCAqcHRyKQoreworICAgIHJldHVybiBrZnJlZShwdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmJjbW9zX2FsbG9jX25vdF9jYWNoZShpbnQzMl90IHNpemUpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfZnJlZV9ub3RfY2FjaGUodm9pZCAqZGVzdCkKK3sKKwlrZnJlZShkZXN0KTsKK30KKy8qCisgKiBTeW5jaHJvbml6YXRpb24KKyAqLworCisvKiBNdXRleCBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfbXV0ZXgKK3sKKyAgICBzdHJ1Y3QgbXV0ZXggbTsgICAgICAgICAgICAgLyoqPCBsaW51eCBrZXJuZWwgbXV0ZXggKi8KK307CisKKy8qIENyZWF0ZSByZWN1cnNpdmUgbXV0ZXggKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXJybm8gYmNtb3NfbXV0ZXhfY3JlYXRlKGJjbW9zX211dGV4ICptdXRleCwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgbXV0ZXhfaW5pdCgmbXV0ZXgtPm0pOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IG11dGV4ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfbXV0ZXhfZGVzdHJveShiY21vc19tdXRleCAqbXV0ZXgpCit7CisgICAgbXV0ZXhfZGVzdHJveSgmbXV0ZXgtPm0pOworfQorCisvKiBMb2NrIG11dGV4ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfbXV0ZXhfbG9jayhiY21vc19tdXRleCAqbXV0ZXgpCit7CisgICAgbXV0ZXhfbG9jaygmbXV0ZXgtPm0pOworfQorCisvKiBSZWxlYXNlIG11dGV4ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfbXV0ZXhfdW5sb2NrKGJjbW9zX211dGV4ICptdXRleCkKK3sKKyAgICBtdXRleF91bmxvY2soJm11dGV4LT5tKTsKK30KKworLyoqIEZhc3QgbG9jayBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfZmFzdGxvY2sKK3sKKyAgICBzcGlubG9ja190IG07Cit9OworCisvKiogRmFzdGxvY2sgaW5pdGlhbGl6ZXIuIENhbiBiZSB1c2VkIGluc3RlYWQgb2YgY2FsbGluZyBiY21vc19mYXN0bG9ja19pbml0KCkgKi8KKyNkZWZpbmUgQkNNT1NfRkFTVExPQ0tfSU5JVElBTElaRVIgICAgICB7IFNQSU5MT0NLX1VOTE9DS0VEIH0KKworLyogSW5pdCBmYXN0bG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2Zhc3Rsb2NrX2luaXQoYmNtb3NfZmFzdGxvY2sgKmxvY2ssIHVpbnQzMl90IGZsYWdzKQoreworICAgIHNwaW5fbG9ja19pbml0KCZsb2NrLT5tKTsKK30KKworLyogVGFrZSBmYXN0IGxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBiY21vc19mYXN0bG9ja19sb2NrKGJjbW9zX2Zhc3Rsb2NrICpsb2NrKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2stPm0sIGZsYWdzKTsKKyAgICByZXR1cm4gKGxvbmcpZmxhZ3M7Cit9CisKKy8qIFJlbGVhc2UgZmFzdCBsb2NrICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKGJjbW9zX2Zhc3Rsb2NrICpsb2NrLCBsb25nIGZsYWdzKQoreworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2stPm0sICh1bnNpZ25lZCBsb25nKWZsYWdzKTsKK30KKworLyoqIFNlbWFwaG9yZSBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3Nfc2VtCit7CisgICAgc3RydWN0IHNlbWFwaG9yZSBzOyAgICAgIC8qKjwgbGludXgga2VybmVsIHNlbWFwaG9yZSAqLworfTsKKworLyogQ3JlYXRlIHNlbWFwaG9yZSAqLworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY21vc19zZW1fY3JlYXRlKGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCBjb3VudCwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc2VtYV9pbml0KCZzZW0tPnMsIGNvdW50KTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogRGVzdHJveSBzZW1hcGhvcmUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19zZW1fZGVzdHJveShiY21vc19zZW0gKnNlbSkKK3sKK30KKworLyogV2FpdCBmb3Igc2VtYXBob3JlICovCitiY21vc19lcnJubyBiY21vc19zZW1fd2FpdChiY21vc19zZW0gKnNlbSwgdWludDMyX3QgdGltZW91dCk7CisKKy8qIEluY3JlbWVudCBzZW1hcGhvcmUgY291bnRlciAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX3NlbV9wb3N0KGJjbW9zX3NlbSAqc2VtKQoreworICAgIHVwKCZzZW0tPnMpOworfQorCisvKgorICogVGltZXJzCisgKi8KKworLyoqIFN5c3RlbSB0aW1lciAqLworc3RydWN0IGJjbW9zX3N5c190aW1lcgoreworICAgIHN0cnVjdCB0aW1lcl9saXN0IHQ7ICAgICAgICAgICAgICAgIC8qKjwgbGludXggdGltZXIgKi8KKyAgICBiY21vc19zeXNfdGltZXJfaGFuZGxlciBoYW5kbGVyOyAgICAvKio8IFRpbWVyIGhhbmRsZXIgKi8KKyAgICB2b2lkICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBhcmFtZXRlciB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgKi8KK307CisKKy8qIEdldCBjdXJyZW50IHRpbWVzdGFtcCAodXMpICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbW9zX3RpbWVzdGFtcCh2b2lkKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB1cHRpbWU7CisgICAgZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUoJnVwdGltZSk7CisgICAgbW9ub3RvbmljX3RvX2Jvb3RiYXNlZCgmdXB0aW1lKTsKKyAgICByZXR1cm4gdXB0aW1lLnR2X3NlYyAqIFVTRUNfUEVSX1NFQyArIHVwdGltZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQzsKK30KKworLyogR2V0IGN1cnJlbnQgdGltZXN0YW1wICh1cykgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgYmNtb3NfdGltZXN0YW1wNjQodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdXB0aW1lOworICAgIGRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKCZ1cHRpbWUpOworICAgIG1vbm90b25pY190b19ib290YmFzZWQoJnVwdGltZSk7CisgICAgcmV0dXJuICh1aW50NjRfdCl1cHRpbWUudHZfc2VjICogVVNFQ19QRVJfU0VDICsgKHVpbnQ2NF90KXVwdGltZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQzsKK30KKworLyoKKyAqIFRhc2sgY29udHJvbAorICovCisKKy8qKiBPUy1zcGVjaWZpYyB0YXNrIGNvbnRyb2wgYmxvY2sgZXh0ZW5zaW9uICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19zeXNfdGFzaworeworICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKK30gYmNtb3Nfc3lzX3Rhc2s7CisKKy8qKiBNZW1vcnkgcG9vbCBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfYnl0ZV9wb29sCit7CisgICAgYmNtb3NfYnl0ZV9wb29sX3Bhcm0gcGFybTsgIC8qKjwgUG9vbCBwYXJhbWV0ZXJzICovCisgICAgdWludDMyX3QgYWxsb2NhdGVkOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCAqLworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAvKio8IG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBCQ01PU19CWVRFX1BPT0xfVkFMSUQgICAgICAgICAgICgoJ2InPDwyNCkgfCAoJ3knIDw8IDE2KSB8ICgncCcgPDwgOCkgfCAnbycpCisjZGVmaW5lIEJDTU9TX0JZVEVfUE9PTF9ERUxFVEVEICAgICAgICAgKCgnYic8PDI0KSB8ICgneScgPDwgMTYpIHwgKCdwJyA8PCA4KSB8ICd+JykKKyNlbmRpZgorfTsKKworLyogVHJhbnNwb3J0IC8gbmV0d29yayBidWZmZXIgc2VydmljZSAqLworZXh0ZXJuIHVpbnQzMl90IGJjbW9zX2J1Zl9kZWZhdWx0X2hlYWRyb29tOworCisvKgorICogTmV0d29yayAvIHRyYW5zcG9ydCBidWZmZXIKKyAqLworCisvKiBEYXRhIGFsaWdubWVudC4gU2hvdWxkIGJlIGEgbWF4IGxmIEwxLCBMMiBjYWNoZSBsaW5lIHNpemUgKi8KKyNkZWZpbmUgQkNNT1NfQlVGX0RBVEFfQUxJR05NRU5UICAgICAgICAxMjgKKworLyogRW5jYXBzdWxhdGVkIHNrYiAqLworc3RydWN0IGJjbW9zX2J1ZgoreworICAgIHN0cnVjdCBza19idWZmIHNrYjsKK307CisKKy8qIEJ1ZmZlciBsaXN0ICovCit0eXBlZGVmIHN0cnVjdCBza19idWZmX2hlYWQgYmNtb3NfYnVmX3F1ZXVlOworCisvKiBBbGxvY2F0ZSBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYnVmICpiY21vc19idWZfYWxsb2ModWludDMyX3Qgc2l6ZSkKK3sKKyAgICAvKiBBbGxvY2F0ZSBleHRyYSAyICogQkNNT1NfQlVGX0RBVEFfQUxJR05NRU5UIHRvIG1ha2Ugc3VyZSB0aGF0IG5laXRoZXIgZGF0YSBzdGFydCBub3IgZW5kCisgICAgICogZW5kIHVwIGluIHRoZSBtaWRkbGUgb2YgY2FjaGUgbGluZQorICAgICAqLworICAgIHN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUgKyBCQ01UUl9CVUZfRVhUUkFfSEVBRFJPT00gKyAyICogQkNNT1NfQlVGX0RBVEFfQUxJR05NRU5UIC0gMSk7CisgICAgaWYgKCFza2IpCisgICAgICAgIHJldHVybiBOVUxMOworI2lmIEJDTVRSX0JVRl9FWFRSQV9IRUFEUk9PTQorICAgIHNrYl9yZXNlcnZlKHNrYiwgQkNNVFJfQlVGX0VYVFJBX0hFQURST09NKTsKKyNlbmRpZgorICAgIGlmICgobG9uZylza2ItPmRhdGEgJiAoQkNNT1NfQlVGX0RBVEFfQUxJR05NRU5UIC0gMSkpCisgICAgeworICAgICAgICBza2JfcmVzZXJ2ZShza2IsIEJDTU9TX0JVRl9EQVRBX0FMSUdOTUVOVCAtICgobG9uZylza2ItPmRhdGEgJiAoQkNNT1NfQlVGX0RBVEFfQUxJR05NRU5UIC0gMSkpKTsKKyAgICB9CisgICAgcmV0dXJuIChiY21vc19idWYgKilza2I7Cit9CisKKy8qIFJlbGVhc2UgYnVmZmVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfYnVmX2ZyZWUoYmNtb3NfYnVmICpidWYpCit7CisgICAgY29uc3VtZV9za2IoJmJ1Zi0+c2tiKTsKK30KKworLyogR2V0IGRhdGEgbGVuZ3RoICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbW9zX2J1Zl9sZW5ndGgoYmNtb3NfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJ1Zi0+c2tiLmxlbjsKK30KKworLyogU2V0IGRhdGEgbGVuZ3RoICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGJjbW9zX2J1Zl9sZW5ndGhfc2V0KGJjbW9zX2J1ZiAqYnVmLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgaWYgKHVubGlrZWx5KGxlbmd0aCA+IHNrYl90YWlscm9vbSgmYnVmLT5za2IpKSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiISEhJXM6IGxlbmd0aD0ldSB0YWlscm9vbT0lZFxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbGVuZ3RoLCBza2JfdGFpbHJvb20oJmJ1Zi0+c2tiKSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKyAgICBidWYtPnNrYi5sZW4gPSBsZW5ndGg7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEdldCBidWZmZXIgZGF0YSBwb2ludGVyLiAqLworc3RhdGljIGlubGluZSB1aW50OF90ICpiY21vc19idWZfZGF0YShiY21vc19idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYnVmLT5za2IuZGF0YTsKK30KKworLyogR2V0IGJ1ZmZlciBjaGFubmVsLiAqLworc3RhdGljIGlubGluZSB1aW50OF90IGJjbW9zX2J1Zl9jaGFubmVsKGJjbW9zX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBidWYtPnNrYi5jYlswXTsKK30KKworLyogU2V0IGJ1ZmZlciBjaGFubmVsLiAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2J1Zl9jaGFubmVsX3NldChiY21vc19idWYgKmJ1ZiwgdWludDhfdCBjaGFubmVsKQoreworICAgIGJ1Zi0+c2tiLmNiWzBdID0gY2hhbm5lbDsKK30KKworLyoqIEluaXRpYWxpemUgYnVmZmVyIHF1ZXVlCisgKiBccGFyYW1baW5dICAgcSAgICAgICBCdWZmZXIgcXVldWUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2J1Zl9xdWV1ZV9pbml0KGJjbW9zX2J1Zl9xdWV1ZSAqcSkKK3sKKyAgICBza2JfcXVldWVfaGVhZF9pbml0KHEpOworfQorCisvKiogRW5xdWV1ZSBidWZmZXIKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB1bmRlciBsb2NrLCBlLmcuLCBxLT5sb2NrCisgKgorICogXHBhcmFtW2luXSAgIHEgICAgICAgQnVmZmVyIHF1ZXVlCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2J1Zl9xdWV1ZV9wdXQoYmNtb3NfYnVmX3F1ZXVlICpxLCBiY21vc19idWYgKmJ1ZikKK3sKKyAgICBfX3NrYl9xdWV1ZV90YWlsKHEsICZidWYtPnNrYik7Cit9CisKKy8qIENoZWNrIGlmIGJ1ZmZlciBxdWV1ZSBpcyBlbXB0eQorICogXHBhcmFtW2luXSAgIHEgICAgICAgQnVmZmVyIHF1ZXVlCisgKiBccmV0dXJucyBUUlVFIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eQorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb3NfYnVmX3F1ZXVlX2lzX2VtcHR5KGJjbW9zX2J1Zl9xdWV1ZSAqcSkKK3sKKyAgICByZXR1cm4gKGJjbW9zX2Jvb2wpc2tiX3F1ZXVlX2VtcHR5KHEpOworfQorCisvKiBEZXF1ZXVlIGJ1ZmZlcgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHVuZGVyIGxvY2ssIGUuZy4sIHEtPmxvY2sKKyAqCisgKiBSZW1vdmUgYW5kIHJldHVybiB0aGUgMXN0IHF1ZXVlZCBidWZmZXIuCisgKiBccGFyYW1baW5dICAgcSAgICAgICBCdWZmZXIgcXVldWUKKyAqIFxyZXR1cm5zIHRoZSAgYnVmZmVyIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSBiY21vc19idWYgKmJjbW9zX2J1Zl9xdWV1ZV9nZXQoYmNtb3NfYnVmX3F1ZXVlICpxKQoreworICAgIHN0cnVjdCBza19idWZmICpza2IgPSBfX3NrYl9kZXF1ZXVlKHEpOworICAgIHJldHVybiBza2IgPyBjb250YWluZXJfb2Yoc2tiLCBiY21vc19idWYsIHNrYikgOiBOVUxMOworfQorCisvKiBQZWVrIGludG8gcXVldWUgYW5kIHJldHVybiB0aGUgMXN0IGJ1ZmZlciB3aXRob3V0IGRlcXVlaW5nIGl0CisgKgorICogTXVzdCBiZSBjYWxsZWQgdW5kZXIgbG9jaywgZS5nLiwgcS0+bG9jaworICogXHBhcmFtW2luXSAgIHEgICAgICAgQnVmZmVyIHF1ZXVlCisgKiBccmV0dXJucyB0aGUgIGJ1ZmZlciBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYnVmICpiY21vc19idWZfcXVldWVfcGVlayhiY21vc19idWZfcXVldWUgKnEpCit7CisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9wZWVrKHEpOworICAgIHJldHVybiBza2IgPyBjb250YWluZXJfb2Yoc2tiLCBiY21vc19idWYsIHNrYikgOiBOVUxMOworfQorCisvKgorICogZGNhY2hlIHV0aWxpdGllcworICovCisvKiBJbnZhbGlkYXRlIGFkZHJlc3MgYXJlYSBpbiBkYXRhIGNhY2hlLiBEaXJ0eSBjYWNoZSBsaW5lcyBjb250ZW50IGlzIGRpc2NhcmRlZCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2RjYWNoZV9pbnYodm9pZCAqc3RhcnQsIHVpbnQzMl90IHNpemUpCit7CisjaWYgZGVmaW5lZChDT05GSUdfTUlQUykKKyAgICBkbWFfY2FjaGVfaW52KCh1bnNpZ25lZCBsb25nKXN0YXJ0LCBzaXplKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQykKKyAgICBpZiAoKCh1bnNpZ25lZCBsb25nKXN0YXJ0ICYgKEwxX0NBQ0hFX0JZVEVTIC0gMSkpIHx8IChzaXplICYgKEwxX0NBQ0hFX0JZVEVTIC0gMSkpKQorICAgICAgICBmbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpc3RhcnQsICh1bnNpZ25lZCBsb25nKXN0YXJ0ICsgc2l6ZSk7CisgICAgZWxzZQorICAgICAgICBpbnZhbGlkYXRlX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcpc3RhcnQgKyBzaXplKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1VNTCkKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisjZWxzZQorI2Vycm9yIFBsZWFzZSBpbXBsZW1lbnQgYmNtb3NfZGNhY2hlX2ludigpCisjZW5kaWYKK30KKworLyogRmx1c2ggYWRkcmVzcyBhcmVhIGluIGRhdGEgY2FjaGUuIERpcnR5IGNhY2hlIGxpbmVzIGFyZSBjb21taXR0ZWQgdG8gbWVtb3J5ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfZGNhY2hlX2ZsdXNoKHZvaWQgKnN0YXJ0LCB1aW50MzJfdCBzaXplKQoreworI2lmIGRlZmluZWQoQ09ORklHX01JUFMpCisgICAgZG1hX2NhY2hlX3diYWNrKCh1bnNpZ25lZCBsb25nKXN0YXJ0LCBzaXplKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQykKKyAgICBjbGVhbl9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpc3RhcnQsICh1bnNpZ25lZCBsb25nKXN0YXJ0ICsgc2l6ZSk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19VTUwpCisgICAgLyogTm90aGluZyB0byBkbyAqLworI2Vsc2UKKyNlcnJvciBQbGVhc2UgaW1wbGVtZW50IGJjbW9zX2RjYWNoZV9mbHVzaCgpCisjZW5kaWYKK30KKworLyoKKyAqIEludGVycnVwdCBzZXJ2aWNlCisgKi8KKworLyogQ29ubmVjdCBzeXN0ZW0gaW50ZXJydXB0ICovCitzdGF0aWMgaW5saW5lIGludCBiY21vc19pbnRfY29ubmVjdChpbnQgaXJxLCBpbnQgY3B1LCBpbnQgZmxhZ3MsCisgICAgaW50ICgqaXNyKShpbnQgaXJxLCB2b2lkICpwcml2KSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcHJpdikKK3sKKyAgICByZXR1cm4gcmVxdWVzdF9pcnEoaXJxLCAoaXJxX2hhbmRsZXJfdClpc3IsIGZsYWdzLCBuYW1lLCBwcml2KTsKK30KKworLyogRGlzY29ubmVjdCBzeXN0ZW0gaW50ZXJydXB0ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfaW50X2Rpc2Nvbm5lY3QoaW50IGlycSwgdm9pZCAqcHJpdikKK3sKKyAgICBmcmVlX2lycShpcnEsIHByaXYpOworfQorCisvKiBVbm1hc2sgSVJRICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfaW50X2VuYWJsZShpbnQgaXJxKQoreworICAgIGVuYWJsZV9pcnEoaXJxKTsKK30KKworLyogTWFzayBJUlEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19pbnRfZGlzYWJsZShpbnQgaXJxKQoreworICAgIGRpc2FibGVfaXJxKGlycSk7Cit9CisKKy8qIENoZWNrIGluLWlycSBzdGF0dXMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lycV9tb2RlKHZvaWQpCit7CisgICAgcmV0dXJuIGluX2ludGVycnVwdCgpOworfQorCisvKiBDaGVjayBpZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAqLworc3RhdGljIGlubGluZSBpbnQgaXNfaXJxX2Rpc2FibGVkKHZvaWQpCit7CisgICAgcmV0dXJuIGlycXNfZGlzYWJsZWQoKTsKK30KKworLyogQ29udmVydCB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJjbW9zX3ZpcnRfdG9fcGh5cyh2b2lkICp2YSkKK3sKKyAgICByZXR1cm4gdmlydF90b19waHlzKHZhKTsKK30KKworLyogd3JpdGUgYmFycmllciAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2JhcnJpZXIodm9pZCkKK3sKKyAgICBzbXBfd21iKCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBiY21vc19nZXRjaGFyKHZvaWQpCit7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfcHV0Y2hhcihpbnQgYykKK3sKK30KKworI2lmZGVmIEJDTU9TX01TR19RVUVVRV9ET01BSU5fU09DS0VUCisjdW5kZWYgQkNNT1NfTVNHX1FVRVVFX0RPTUFJTl9TT0NLRVQKKyNlbmRpZgorCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1VEUF9TT0NLRVQKKyN1bmRlZiBCQ01PU19NU0dfUVVFVUVfVURQX1NPQ0tFVAorI2VuZGlmCisKKy8qIDJuZCBwYXJ0IG9mIE9TLWluZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLworI2luY2x1ZGUgImJjbW9zX2NvbW1vbjIuaCIKKworI2VuZGlmIC8qIEJDTU9TX1NZU1RFTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9vc19jbGkvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL29zX2NsaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDVhODZhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9vc19jbGkvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjIE9TIENMSSBjb21tYW5kcworIworTU9EX05BTUUgPSBvc19jbGkKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGNsaQorCitzcmNzID0gYmNtb3NfY2xpLmMKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vb3NfY2xpL2JjbW9zX2NsaS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9vc19jbGkvYmNtb3NfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlZjMxYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vb3NfY2xpL2JjbW9zX2NsaS5jCkBAIC0wLDAgKzEsMzM1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3NfY2xpLmg+CisKK3N0YXRpYyBiY21jbGlfZW50cnkgKm9zX2NsaV9kaXI7CisKK3N0YXRpYyBiY21jbGlfZW51bV92YWwgdHJhY2VfbGV2ZWxfdGFibGVbXSA9Cit7CisgICAgeyAubmFtZT0ibm9uZSIsIC52YWw9QkNNT1NfVFJBQ0VfTEVWRUxfTk9ORSB9LAorICAgIHsgLm5hbWU9ImVycm9yIiwgLnZhbD1CQ01PU19UUkFDRV9MRVZFTF9FUlJPUiB9LAorICAgIHsgLm5hbWU9ImluZm8iLCAudmFsPUJDTU9TX1RSQUNFX0xFVkVMX0lORk8gfSwKKyAgICB7IC5uYW1lPSJ2ZXJib3NlX2luZm8iLCAudmFsPUJDTU9TX1RSQUNFX0xFVkVMX1ZFUkJPU0UgfSwKKyAgICB7IC5uYW1lPSJkZWJ1ZyIsIC52YWw9QkNNT1NfVFJBQ0VfTEVWRUxfREVCVUcgfSwKKyAgICBCQ01DTElfRU5VTV9MQVNUCit9OworCisvKgorICogQ29tbWFuZCBoYW5kbGVycworICovCisKK3N0YXRpYyBiY21vc19lcnJubyBfb3NjbGlfdHJhY2VfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9zX3RyYWNlX2xldmVsIGxldmVsID0gKGJjbW9zX3RyYWNlX2xldmVsKXBhcm1bMF0udmFsdWUubnVtYmVyOworCisgICAgaWYgKGJjbWNsaV9wYXJtX2lzX3NldChzZXNzaW9uLCAmcGFybVswXSkpCisgICAgeworICAgICAgICBiY21vc190cmFjZV9sZXZlbCBvbGRfbGV2ZWw7CisKKyAgICAgICAgb2xkX2xldmVsID0gYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KGxldmVsKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIk9TIHRyYWNlIGxldmVsOiBvbGQ9JXMgIG5ldz0lc1xuIiwKKyAgICAgICAgICAgIGJjbWNsaV9lbnVtX3N0cmluZ3ZhbCh0cmFjZV9sZXZlbF90YWJsZSwgb2xkX2xldmVsKSwKKyAgICAgICAgICAgIGJjbWNsaV9lbnVtX3N0cmluZ3ZhbCh0cmFjZV9sZXZlbF90YWJsZSwgbGV2ZWwpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIk9TIHRyYWNlIGxldmVsOiAlc1xuIiwKKyAgICAgICAgICAgIGJjbWNsaV9lbnVtX3N0cmluZ3ZhbCh0cmFjZV9sZXZlbF90YWJsZSwgYmNtb3NfdHJhY2VfbGV2ZWxfZ2V0KCkpKTsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfb3NjbGlfdGFza19oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IGJjbWNsaV9wYXJtX2lzX3NldChzZXNzaW9uLCAmcGFybVswXSkgPyAoY29uc3QgY2hhciAqKXBhcm1bMF0udmFsdWUuc3RyaW5nIDogTlVMTDsKKyAgICBiY21vc190YXNrICp0YXNrID0gTlVMTDsKKyAgICBpbnQgbnQgPSAwOworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjBzICU0cyAlNHMgJS0xMHMgJXNcbiIsICJ0YXNrIiwgInByaW8iLCAiY29yZSIsICJ0aW1lb3V0IiwgImhhbmRsZXIiKTsKKyAgICB3aGlsZSAoYmNtb3NfdGFza19nZXRfbmV4dCgmdGFzaykgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX3Rhc2tfcGFybSB0cCA9IHt9OworICAgICAgICBiY21vc190YXNrX3F1ZXJ5KHRhc2ssICZ0cCk7CisgICAgICAgIGlmICghbmFtZSB8fCAobmFtZSAmJiB0cC5uYW1lICYmIHN0cnN0cih0cC5uYW1lLCBuYW1lKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgY29yZV9uYW1lWzEwXTsKKyAgICAgICAgICAgIGlmICh0cC5jb3JlICE9IEJDTU9TX0NQVV9DT1JFX0FOWSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbnByaW50Zihjb3JlX25hbWUsIHNpemVvZihjb3JlX25hbWUpLCAiJWQiLCB0cC5jb3JlIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyY3B5KGNvcmVfbmFtZSwgImFueSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjBzICUtNGQgJS00cyAlLTEwdSAlcFxuIiwKKyAgICAgICAgICAgICAgICB0cC5uYW1lLCB0cC5wcmlvcml0eSwgY29yZV9uYW1lLAorICAgICAgICAgICAgICAgICh0cC5tc2dfd2FpdF90aW1lb3V0ID09IEJDTU9TX1dBSVRfRk9SRVZFUikgPyAwIDogdHAubXNnX3dhaXRfdGltZW91dCwgdHAuaGFuZGxlcik7CisgICAgICAgICAgICArK250OworICAgICAgICB9CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlZCB0YXNrcyBsaXN0ZWRcbiIsIG50KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfb3NjbGlfcHJpbnRfcWluZm9faGRyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtOXMgJS05cyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLThzICUtOHMgJS0xMHMgY29uZ2VzdGVkXG4iLAorICAgICAgICBwcmVmaXggPyBwcmVmaXggOiAiIiwgInNpemUiLCAiaW4iLCAicHV0IiwgImdldCIsICJkaXNjYXJkIiwgImxfdGhyZXNoIiwgImhfdGhyZXNoIiwgIm5lYXItZnVsbCIpOworfQorCitzdGF0aWMgdm9pZCBfb3NjbGlfcHJpbnRfcWluZm8oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9zX21zZ19xdWV1ZV9pbmZvICpxaSwgY29uc3QgY2hhciAqcHJlZml4KQoreworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLXMgJS05ZCAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLThkICUtOGQgJS0xMHUgJXNcbiIsCisgICAgICAgIHByZWZpeCA/IHByZWZpeCA6ICIiLCAoaW50KXFpLT5wYXJtLnNpemUsIHFpLT5zdGF0Lm1zZ19pbiwKKyAgICAgICAgcWktPnN0YXQubXNnX3NlbnQsIHFpLT5zdGF0Lm1zZ19yZWNlaXZlZCwKKyAgICAgICAgcWktPnN0YXQubXNnX2Rpc2NhcmRlZCwgKGludClxaS0+cGFybS5sb3dfd20sIChpbnQpcWktPnBhcm0uaGlnaF93bSwKKyAgICAgICAgcWktPnN0YXQubXNnX2FsbW9zdF9mdWxsLCBxaS0+c3RhdC5pc19jb25nZXN0ZWQgPyAieWVzIiA6ICJubyIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX29zY2xpX21vZHVsZV9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb3NfbW9kdWxlX2lkIGlkID0gYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzBdKSA/CisgICAgICAgIChiY21vc19tb2R1bGVfaWQpcGFybVswXS52YWx1ZS5udW1iZXIgOiBCQ01PU19NT0RVTEVfSURfTk9ORTsKKyAgICBiY21vc19tb2R1bGVfaWQgaTsKKyAgICBpbnQgbm0gPSAwOworCisgICAgLyogSGVhZGluZyAqLworICAgIF9vc2NsaV9wcmludF9xaW5mb19oZHIoc2Vzc2lvbiwgIk1vZHVsZSBUYXNrICAgICAgICAgICAgICAgICAiKTsKKworICAgIGZvciAoaSA9IEJDTU9TX01PRFVMRV9JRF9OT05FICsgMTsgaSA8IEJDTU9TX01PRFVMRV9JRF9fTlVNX09GOyBpKyspCisgICAgeworICAgICAgICBiY21vc19lcnJubyByYzsKKyAgICAgICAgY29uc3QgYmNtb3NfdGFzayAqdCA9IE5VTEw7CisgICAgICAgIGJjbW9zX21zZ19xdWV1ZV9pbmZvIHFpID0ge307CisKKyAgICAgICAgcmMgPSBiY21vc19tb2R1bGVfcXVlcnkoaSwgJnQsICZxaSk7CisgICAgICAgIGlmICgoaWQgPT0gQkNNT1NfTU9EVUxFX0lEX05PTkUgfHwgaWQgPT0gaSkgJiYgcmMgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdGFza19wYXJtIHRwID0ge307CisKKyAgICAgICAgICAgIGJjbW9zX3Rhc2tfcXVlcnkodCwgJnRwKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTZkICUtMjBzIiwgaSwgKHQgJiYgdC0+cGFybS5uYW1lKSA/IHQtPnBhcm0ubmFtZSA6ICIqdW5rbm93bioiKTsKKyAgICAgICAgICAgIF9vc2NsaV9wcmludF9xaW5mbyhzZXNzaW9uLCAmcWksICIgIik7CisgICAgICAgICAgICArK25tOworICAgICAgICB9CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlZCBtb2R1bGVzIGxpc3RlZFxuIiwgbm0pOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfb3NjbGlfYmxrX3Bvb2xfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBiY21jbGlfcGFybV9pc19zZXQoc2Vzc2lvbiwgJnBhcm1bMF0pID8gKGNvbnN0IGNoYXIgKilwYXJtWzBdLnZhbHVlLnN0cmluZyA6IE5VTEw7CisgICAgY29uc3QgYmNtb3NfYmxrX3Bvb2wgKmJwID0gTlVMTDsKKyAgICBpbnQgbmIgPSAwOworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzICUtOXMgJS05cyAlLTlzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorICAgICAgICAibmFtZSIsICJwb29sX3NpemUiLCAiYmxvY2tzIiwgImJsa19zaXplIiwgImZyZWUiLCAiYWxsb2NhdGVkIiwgInJlbGVhc2VkIiwgImZhaWxlZCIpOworICAgIHdoaWxlIChiY21vc19ibGtfcG9vbF9nZXRfbmV4dCgmYnApID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vc19ibGtfcG9vbF9pbmZvIHBpID0ge307CisKKyAgICAgICAgYmNtb3NfYmxrX3Bvb2xfcXVlcnkoYnAsICZwaSk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwgfHwgKHBpLnBhcm0ubmFtZSAmJiBzdHJzdHIocGkucGFybS5uYW1lLCBuYW1lKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTI0cyAlLTl1ICUtOXUgJS05dSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdVxuIiwKKyAgICAgICAgICAgICAgICBwaS5wYXJtLm5hbWUgPyBwaS5wYXJtLm5hbWUgOiAiIiwgcGkucGFybS5wb29sX3NpemUsIHBpLnBhcm0ubnVtX2Jsa3MsIHBpLnBhcm0uYmxrX3NpemUsCisgICAgICAgICAgICAgICAgICAgIHBpLnN0YXQuZnJlZSwgcGkuc3RhdC5hbGxvY2F0ZWQsIHBpLnN0YXQucmVsZWFzZWQsIHBpLnN0YXQuYWxsb2NfZmFpbGVkKTsKKyAgICAgICAgICAgICsrbmI7CisgICAgICAgIH0KKyAgICB9CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlRvdGFsIG1lbW9yeSBvY2N1cGllZCBieSBhbGwgYmxvY2sgcG9vbHM6ICV1IGJ5dGVzXG4iLCBiY21vc190b3RhbF9ibGtfcG9vbF9zaXplKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJWQgYmxvY2sgcG9vbHMgbGlzdGVkXG4iLCBuYik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9vc2NsaV9tc2dfcG9vbF9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IGJjbWNsaV9wYXJtX2lzX3NldChzZXNzaW9uLCAmcGFybVswXSkgPyAoY29uc3QgY2hhciAqKXBhcm1bMF0udmFsdWUuc3RyaW5nIDogTlVMTDsKKyAgICBjb25zdCBiY21vc19tc2dfcG9vbCAqbXAgPSBOVUxMOworICAgIGludCBucCA9IDA7CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgJS05cyAlLTlzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorICAgICAgICAibmFtZSIsICJzaXplIiwgImRhdGFfc2l6ZSIsICJmcmVlIiwgImFsbG9jYXRlZCIsICJyZWxlYXNlZCIsICJmYWlsZWQiKTsKKyAgICB3aGlsZSAoYmNtb3NfbXNnX3Bvb2xfZ2V0X25leHQoJm1wKSA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXNnX3Bvb2xfaW5mbyBwaSA9IHt9OworCisgICAgICAgIGJjbW9zX21zZ19wb29sX3F1ZXJ5KG1wLCAmcGkpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8IChwaS5wYXJtLm5hbWUgJiYgc3Ryc3RyKHBpLnBhcm0ubmFtZSwgbmFtZSkpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgJS05dSAlLTl1ICUtMTB1ICUtMTB1ICUtMTB1ICUtMTB1XG4iLAorICAgICAgICAgICAgICAgIHBpLnBhcm0ubmFtZSA/IHBpLnBhcm0ubmFtZSA6ICIiLCBwaS5wYXJtLnNpemUsIHBpLnBhcm0uZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICBwaS5zdGF0LmZyZWUsIHBpLnN0YXQuYWxsb2NhdGVkLCBwaS5zdGF0LnJlbGVhc2VkLCBwaS5zdGF0LmFsbG9jX2ZhaWxlZCk7CisgICAgICAgICAgICArK25wOworICAgICAgICB9CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJUb3RhbCBtZW1vcnkgb2NjdXBpZWQgYnkgYWxsIG1lc3NhZ2UgcG9vbHM6ICV1IGJ5dGVzXG4iLCBiY21vc190b3RhbF9tc2dfcG9vbF9zaXplKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJWQgbXNnIHBvb2xzIGxpc3RlZFxuIiwgbnApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfb3NjbGlfbXNnX3F1ZXVlX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lID0gYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzBdKSA/IChjb25zdCBjaGFyICopcGFybVswXS52YWx1ZS5zdHJpbmcgOiBOVUxMOworICAgIGNvbnN0IGJjbW9zX21zZ19xdWV1ZSAqbXEgPSBOVUxMOworICAgIGludCBucSA9IDA7CisKKyAgICBfb3NjbGlfcHJpbnRfcWluZm9faGRyKHNlc3Npb24sICJuYW1lICAgICAgICAgICAgICAgICAiKTsKKyAgICB3aGlsZSAoYmNtb3NfbXNnX3F1ZXVlX2dldF9uZXh0KCZtcSkgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19xdWV1ZV9pbmZvIHFpID0ge307CisKKyAgICAgICAgYmNtb3NfbXNnX3F1ZXVlX3F1ZXJ5KG1xLCAmcWkpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8IChxaS5wYXJtLm5hbWUgJiYgc3Ryc3RyKHFpLnBhcm0ubmFtZSwgbmFtZSkpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yMHMiLCBxaS5wYXJtLm5hbWUgPyBxaS5wYXJtLm5hbWUgOiAiIik7CisgICAgICAgICAgICBfb3NjbGlfcHJpbnRfcWluZm8oc2Vzc2lvbiwgJnFpLCAiICIpOworICAgICAgICAgICAgKytucTsKKyAgICAgICAgfQorICAgIH0KKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJWQgbXNnIHF1ZXVlcyBsaXN0ZWRcbiIsIG5xKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfb3NjbGlfcHJpbnRfcWdyb3VwX2luZm9faGRyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTEycyAlLTZzICUtOXMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS04cyAlLThzICUtMTBzIGNvbmdlc3RlZFxuIiwKKyAgICAgICAgIm5hbWUiLCAicXVldWVzIiwgInNpemUiLCAiaW4iLCAicHV0IiwgImdldCIsICJkaXNjYXJkIiwgImxfdGhyZXNoIiwgImhfdGhyZXNoIiwgIm5lYXItZnVsbCIpOworfQorCitzdGF0aWMgdm9pZCBfb3NjbGlfcHJpbnRfcWdyb3VwX2luZm8oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9zX21zZ19xZ3JvdXBfaW5mbyAqcWkpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMTJzICUtNmQgJS05ZCAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLThkICUtOGQgJS0xMHUgJXNcbiIsCisgICAgICAgIHFpLT5wYXJtLm5hbWUgPyBxaS0+cGFybS5uYW1lIDogIiIsIChpbnQpcWktPnBhcm0ubnF1ZXVlcywgKGludClxaS0+cGFybS5zaXplLCBxaS0+c3RhdC5tc2dfaW4sCisgICAgICAgIHFpLT5zdGF0Lm1zZ19zZW50LCBxaS0+c3RhdC5tc2dfcmVjZWl2ZWQsCisgICAgICAgIHFpLT5zdGF0Lm1zZ19kaXNjYXJkZWQsIChpbnQpcWktPnBhcm0ubG93X3dtLCAoaW50KXFpLT5wYXJtLmhpZ2hfd20sCisgICAgICAgIHFpLT5zdGF0Lm1zZ19hbG1vc3RfZnVsbCwgcWktPnN0YXQuaXNfY29uZ2VzdGVkID8gInllcyIgOiAibm8iKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9vc2NsaV9tc2dfcWdyb3VwX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lID0gYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzBdKSA/IChjb25zdCBjaGFyICopcGFybVswXS52YWx1ZS5zdHJpbmcgOiBOVUxMOworICAgIGNvbnN0IGJjbW9zX21zZ19xZ3JvdXAgKnFncnAgPSBOVUxMOworICAgIGludCBuZ3JvdXBzID0gMDsKKworICAgIF9vc2NsaV9wcmludF9xZ3JvdXBfaW5mb19oZHIoc2Vzc2lvbik7CisgICAgd2hpbGUgKGJjbW9zX21zZ19xZ3JvdXBfZ2V0X25leHQoJnFncnApID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vc19tc2dfcWdyb3VwX2luZm8gcWkgPSB7fTsKKworICAgICAgICBiY21vc19tc2dfcWdyb3VwX3F1ZXJ5KHFncnAsICZxaSk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwgfHwgKHFpLnBhcm0ubmFtZSAmJiBzdHJzdHIocWkucGFybS5uYW1lLCBuYW1lKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9vc2NsaV9wcmludF9xZ3JvdXBfaW5mbyhzZXNzaW9uLCAmcWkpOworICAgICAgICAgICAgKytuZ3JvdXBzOworICAgICAgICB9CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlZCBtc2cgcXVldWUgZ3JvdXBzIGxpc3RlZFxuIiwgbmdyb3Vwcyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2lmZGVmIEJDTV9PU19USFJFQURYCisKK2V4dGVybiBUWF9USFJFQUQgX19zeXNfc2hlbGxfXzsKK2V4dGVybiBUWF9USFJFQUQgKl9fdXNyX3NoZWxsX187CisKK3N0YXRpYyBiY21vc19lcnJubyBfb3NjbGlfc3lzX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiQXBwbGljYXRpb24gQ0xJIGlzIHN1c3BlbmRlZC4gVHlwZSBcInN1c3BlbmRcIiBpbiBzeXN0ZW0gc2hlbGwgdG8gcmVzdW1lXG4iKTsKKyAgICB0eF90aHJlYWRfcmVzdW1lKCZfX3N5c19zaGVsbF9fKTsKKyAgICB0eF90aHJlYWRfc3VzcGVuZCh0eF90aHJlYWRfaWRlbnRpZnkoKSk7CisgICAgdHhfdGhyZWFkX3dhaXRfYWJvcnQodHhfdGhyZWFkX2lkZW50aWZ5KCkpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJBcHBsaWNhdGlvbiBDTEkgaXMgcmVzdW1lZFxuIik7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKworLyoKKyAqIEluaXQgLyBleGl0IGludGVyZmFjZQorICovCisKKworYmNtb3NfZXJybm8gYmNtb3NfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworICAgIGlmIChvc19jbGlfZGlyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHJ4IGRpcmVjdG9yeQorICAgICAqLworICAgIG9zX2NsaV9kaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCAib3MiLCAiT1MgQWJzdHJhY3Rpb24iLCBCQ01DTElfQUNDRVNTX0dVRVNULCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIW9zX2NsaV9kaXIsIEJDTV9FUlJfSU5URVJOQUwpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9zX2NsaV9kaXIsICJ0cmFjZSIsICJHZXQvU2V0IHRyYWNlIGxldmVsIiwgX29zY2xpX3RyYWNlX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgibGV2ZWwiLCAiVHJhY2UgbGV2ZWwiLCB0cmFjZV9sZXZlbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9zX2NsaV9kaXIsICJ0YXNrIiwgIlRhc2sgaW5mbyIsIF9vc2NsaV90YXNrX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm5hbWUiLCAiVGFzayBuYW1lIG9yIHBhcnRpYWwgbmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9zX2NsaV9kaXIsICJtb2R1bGUiLCAiTW9kdWxlKHMpIiwgX29zY2xpX21vZHVsZV9oYW5kbGVyLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJpZCIsICJNb2R1bGUgaWQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICBCQ01PU19NT0RVTEVfSURfTk9ORSArIDEsIEJDTU9TX01PRFVMRV9JRF9fTlVNX09GIC0gMSkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9zX2NsaV9kaXIsICJibGtfcG9vbCIsICJCbG9jayBwb29sKHMpIiwgX29zY2xpX2Jsa19wb29sX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm5hbWUiLCAiQmxvY2sgcG9vbCBuYW1lIG9yIHBhcnRpYWwgbmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9zX2NsaV9kaXIsICJtc2dfcG9vbCIsICJNZXNzYWdlIHBvb2wocykiLCBfb3NjbGlfbXNnX3Bvb2xfaGFuZGxlciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibmFtZSIsICJNZXNzYWdlIHBvb2wgbmFtZSBvciBwYXJ0aWFsIG5hbWUiLCBCQ01DTElfUEFSTV9TVFJJTkcsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChvc19jbGlfZGlyLCAicXVldWUiLCAiTWVzc2FnZSBxdWV1ZShzKSIsIF9vc2NsaV9tc2dfcXVldWVfaGFuZGxlciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibmFtZSIsICJNZXNzYWdlIHF1ZXVlIG5hbWUgb3IgcGFydGlhbCBuYW1lIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQob3NfY2xpX2RpciwgInFncm91cCIsICJNZXNzYWdlIHF1ZXVlIGdyb3VwKHMpIiwgX29zY2xpX21zZ19xZ3JvdXBfaGFuZGxlciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibmFtZSIsICJNZXNzYWdlIHF1ZXVlIGdyb3VwIG5hbWUgb3IgcGFydGlhbCBuYW1lIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisKKyNpZmRlZiBCQ01fT1NfVEhSRUFEWAorICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0ob3NfY2xpX2RpciwgInN5cyIsICJTeXN0ZW0gc2hlbGwiLCBfb3NjbGlfc3lzX2hhbmRsZXIpOworI2VuZGlmCisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwordm9pZCBiY21vc19jbGlfZXhpdCh2b2lkKQoreworICAgIGlmIChvc19jbGlfZGlyKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Rva2VuX2Rlc3Ryb3kob3NfY2xpX2Rpcik7CisgICAgICAgIG9zX2NsaV9kaXIgPSBOVUxMOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vb3NfY2xpL2JjbW9zX2NsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9vc19jbGkvYmNtb3NfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3OTUyYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vb3NfY2xpL2JjbW9zX2NsaS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT1NfQ0xJX0hfCisjZGVmaW5lIEJDTU9TX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworYmNtb3NfZXJybm8gYmNtb3NfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKwordm9pZCBiY21vc19jbGlfZXhpdCh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIEJDTU9TX0NMSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9wb3NpeC9iY21vc19zeXN0ZW0uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vcG9zaXgvYmNtb3Nfc3lzdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjYjkwMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vcG9zaXgvYmNtb3Nfc3lzdGVtLmMKQEAgLTAsMCArMSw5MjEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVAorI2luY2x1ZGUgPHN5cy91bi5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKy8qIHRhc2sgY29udHJvbCBibG9ja3MgKi8KK2V4dGVybiBTVEFJTFFfSEVBRCh0YXNrX2xpc3QsIGJjbW9zX3Rhc2spIHRhc2tfbGlzdDsKKworLyogZ2xvYmFsIE9TIGxvY2sgKi8KK2V4dGVybiBiY21vc19tdXRleCBiY21vc19yZXNfbG9jazsKKworLyoKKyAqIEluaXQKKyAqLworCisjZGVmaW5lIFRJTUVSX1NJRyAgICAgICBTSUdSVE1JTgorCisvKiBJbml0aWFsaXplIHN5c3RlbSBsaWJyYXJ5ICovCitiY21vc19lcnJubyBiY21vc19zeXNfaW5pdCh2b2lkKQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBDbGVhbi11cCBzeXN0ZW0gbGlicmFyeSAqLwordm9pZCBiY21vc19zeXNfZXhpdCh2b2lkKQoreworfQorCisvKgorICogVGFzayBtYW5hZ2VtZW50CisgKi8KKworLyoKKyAqIERlZmF1bHQgdGFzayBoYW5kbGVyCisgKi8KKworLyogQ3JlYXRlIGEgbmV3IHRhc2sgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfY3JlYXRlKGJjbW9zX3Rhc2sgKnRhc2ssIGNvbnN0IGJjbW9zX3Rhc2tfcGFybSAqcGFybSkKK3sKKyAgICBGX2JjbW9zX3Rhc2tfaGFuZGxlciBoYW5kbGVyOworICAgIHB0aHJlYWRfYXR0cl90IHB0aHJlYWRfYXR0cjsKKyAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcHRocmVhZF9zY2hlZF9wYXJhbSA9IHt9OworICAgIGludCBwdGhyZWFkX3ByaW87CisgICAgdWludDMyX3Qgc3RhY2tfc2l6ZTsKKyAgICB2b2lkICpkYXRhOworICAgIGludCByYzsKKworICAgIGlmICghdGFzayB8fCAhcGFybSkKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInRhc2sgJXAsIHBhcm0gJXBcbiIsIHRhc2ssIHBhcm0pOworICAgIG1lbXNldCh0YXNrLCAwLCBzaXplb2YoKnRhc2spKTsKKyAgICBpZiAocGFybS0+aGFuZGxlcikKKyAgICB7CisgICAgICAgIC8qICJ0cmFkaXRpb25hbCB0YXNrICovCisgICAgICAgIGhhbmRsZXIgPSBwYXJtLT5oYW5kbGVyOworICAgICAgICBkYXRhID0gKHZvaWQgKilwYXJtLT5kYXRhOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiAiaW50ZWdyYXRlZCIgdGFzayAqLworICAgICAgICBoYW5kbGVyID0gYmNtb3NfZGZ0X3Rhc2tfaGFuZGxlcjsKKyAgICAgICAgZGF0YSA9IHRhc2s7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBhbmQgbG9jayBtdXRleCB0byB3YWl0IG9uICovCisgICAgICAgIHJjID0gYmNtb3Nfc2VtX2NyZWF0ZSgmdGFzay0+YWN0aXZlX3NlbSwgMCwgdGFzay0+cGFybS5mbGFncywgcGFybS0+bmFtZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJUYXNrICVzOiBjYW4ndCBjcmVhdGUgYWN0aXZlX3NlbS4gRXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBwYXJtLT5uYW1lLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRhc2stPnBhcm0gPSAqcGFybTsKKyAgICAvKiBDb3B5IG5hbWUgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgbm90IHJlbGVhc2VkIC0gaW4gY2FzZSBpdCB3YXMgb24gdGhlIHN0YWNrICovCisgICAgaWYgKHRhc2stPnBhcm0ubmFtZSkKKyAgICB7CisgICAgICAgIHN0cm5jcHkodGFzay0+bmFtZSwgdGFzay0+cGFybS5uYW1lLCBzaXplb2YodGFzay0+bmFtZSkgLSAxKTsKKyAgICAgICAgdGFzay0+cGFybS5uYW1lID0gdGFzay0+bmFtZTsKKyAgICB9CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmdGFzay0+YWN0aXZlX2xvY2ssIDApOworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnRhc2tfbGlzdCwgdGFzaywgbGlzdCk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgdGFzay0+bWFnaWMgPSBCQ01PU19UQVNLX01BR0lDOworICAgIC8qIHB0aHJlYWQgcHJpb3JpdGllcyBhcmUgMS4uMzIsIDMyIGJlaW5nIHRoZSBoaWdoZXN0ICovCisgICAgcHRocmVhZF9wcmlvID0gMzIgLSAoaW50KXBhcm0tPnByaW9yaXR5OworICAgIGlmIChwdGhyZWFkX3ByaW8gPD0gMCkKKyAgICAgICAgcHRocmVhZF9wcmlvID0gMTsKKyAgICBzdGFja19zaXplID0gUFRIUkVBRF9TVEFDS19NSU47CisgICAgaWYgKHBhcm0tPnN0YWNrX3NpemUgJiYgcGFybS0+c3RhY2tfc2l6ZSA+IFBUSFJFQURfU1RBQ0tfTUlOKQorICAgICAgICBzdGFja19zaXplID0gcGFybS0+c3RhY2tfc2l6ZTsKKyAgICByYyA9IHB0aHJlYWRfYXR0cl9pbml0KCZwdGhyZWFkX2F0dHIpOworICAgIHB0aHJlYWRfc2NoZWRfcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBwdGhyZWFkX3ByaW87CisgICAgcmMgPSByYyA/IHJjIDogcHRocmVhZF9hdHRyX3NldGluaGVyaXRzY2hlZCgmcHRocmVhZF9hdHRyLCBQVEhSRUFEX0VYUExJQ0lUX1NDSEVEKTsKKyAgICByYyA9IHJjID8gcmMgOiBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koJnB0aHJlYWRfYXR0ciwgU0NIRURfUlIpOworICAgIHJjID0gcmMgPyByYyA6IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKCZwdGhyZWFkX2F0dHIsICZwdGhyZWFkX3NjaGVkX3BhcmFtKTsKKyAgICByYyA9IHJjID8gcmMgOiBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZwdGhyZWFkX2F0dHIsIHN0YWNrX3NpemUpOworICAgIHJjID0gcmMgPyByYyA6IHB0aHJlYWRfY3JlYXRlKCZ0YXNrLT5zeXNfdGFzay50LCAmcHRocmVhZF9hdHRyLCAodm9pZCAqKCopKHZvaWQgKikpaGFuZGxlciwgZGF0YSk7CisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnB0aHJlYWRfYXR0cik7CisgICAgaWYgKHJjID09IEVQRVJNKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygiVGhyZWFkICVzOiBwcmlvcml0eSAlZCBpcyBpZ25vcmVkLiBTdGFydCBhcyByb290IHRvIGhvbm9yIHByaW9yaXRpZXNcbiIsCisgICAgICAgICAgICBwYXJtLT5uYW1lLCAoaW50KXBhcm0tPnByaW9yaXR5KTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2NyZWF0ZSgmdGFzay0+c3lzX3Rhc2sudCwgTlVMTCwgKHZvaWQgKigqKSh2b2lkICopKWhhbmRsZXIsIGRhdGEpOworICAgIH0KKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgICAgIFNUQUlMUV9SRU1PVkUoJnRhc2tfbGlzdCwgdGFzaywgYmNtb3NfdGFzaywgbGlzdCk7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgICAgICB0YXNrLT5tYWdpYyA9IDA7CisgICAgICAgIGlmICghcGFybS0+aGFuZGxlcikKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3Nfc2VtX2Rlc3Ryb3koJnRhc2stPmFjdGl2ZV9zZW0pOworICAgICAgICB9CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1NZU0NBTExfRVJSLCAiJXMgKCVkKVxuIiwgc3RyZXJyb3IocmMpLCByYyk7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IHRhc2sgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfZGVzdHJveShiY21vc190YXNrICp0YXNrKQoreworICAgIHZvaWQgKnJlczsKKyAgICBpbnQgcmNfY2FuY2VsOworICAgIGludCByYzsKKworICAgIGlmICh0YXNrLT5tYWdpYyAhPSBCQ01PU19UQVNLX01BR0lDKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgdGFzay0+ZGVzdHJveV9yZXF1ZXN0ID0gQkNNT1NfVFJVRTsKKyAgICB0YXNrLT5tYWdpYyA9IEJDTU9TX1RBU0tfTUFHSUNfREVTVFJPWUVEOworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICBTVEFJTFFfUkVNT1ZFKCZ0YXNrX2xpc3QsIHRhc2ssIGJjbW9zX3Rhc2ssIGxpc3QpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgIC8qIFRoZSB0YXNrIG1heSBiZSB3YWl0aW5nIG9uIHNlbWFwaG9yZS4gS2ljayBpdCAqLworICAgIGlmICghdGFzay0+cGFybS5oYW5kbGVyKQorICAgIHsKKyAgICAgICAgYmNtb3Nfc2VtX3Bvc3QoJnRhc2stPmFjdGl2ZV9zZW0pOworICAgIH0KKyAgICByY19jYW5jZWwgPSBwdGhyZWFkX2NhbmNlbCh0YXNrLT5zeXNfdGFzay50KTsKKyAgICByYyA9IHB0aHJlYWRfam9pbih0YXNrLT5zeXNfdGFzay50LCAmcmVzKTsKKyAgICByZXR1cm4gKHJjIHx8ICgoIXJjX2NhbmNlbCkgJiYgKHJlcyAhPSBQVEhSRUFEX0NBTkNFTEVEKSkpID8gQkNNX0VSUl9TWVNDQUxMX0VSUiA6IDA7Cit9CisKKy8qKiBHZXQgY3VycmVudCB0YXNrCisgKiBccmV0dXJucyB0YXNrIGhhbmRsZSBvciBOVUxMIGlmIG5vdCBpbiB0YXNrIGNvbnRleHQKKyAqLworYmNtb3NfdGFzayAqYmNtb3NfdGFza19jdXJyZW50KHZvaWQpCit7CisgICAgcHRocmVhZF90IHB0ID0gcHRocmVhZF9zZWxmKCk7CisgICAgYmNtb3NfdGFzayAqdCwgKnRtcDsKKworICAgIFNUQUlMUV9GT1JFQUNIX1NBRkUodCwgJnRhc2tfbGlzdCwgbGlzdCwgdG1wKQorICAgIHsKKyAgICAgICAgaWYgKHB0aHJlYWRfZXF1YWwocHQsIHQtPnN5c190YXNrLnQpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0OworfQorCisvKgorICogUmVjdXJzaXZlIG11dGV4CisgKi8KKworLyogQ3JlYXRlIHJlY3Vyc2l2ZSBtdXRleCAqLworYmNtb3NfZXJybm8gYmNtb3NfbXV0ZXhfY3JlYXRlKGJjbW9zX211dGV4ICptdXRleCwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IGVycjsKKyAgICBlcnIgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZtdXRleC0+YXR0cik7CisgICAgZXJyID0gZXJyID8gZXJyIDogcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXgtPmF0dHIsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsKKyAgICBlcnIgPSBlcnIgPyBlcnIgOiBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LT5tLCAmbXV0ZXgtPmF0dHIpOworICAgIGlmIChlcnIpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1NZU0NBTExfRVJSLCAiZXJybm89JXNcbiIsIHN0cmVycm9yKGVycikpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogRGVzdHJveSBtdXRleAorICogXHBhcmFtW2luXSAgIG11dGV4ICAgTXV0ZXggY29udHJvbCBibG9jaworICovCit2b2lkIGJjbW9zX211dGV4X2Rlc3Ryb3koYmNtb3NfbXV0ZXggKm11dGV4KQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXgtPm0pOworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4LT5hdHRyKTsKK30KKworLyogY2FsY3VsYXRlIGFic29sdXRlIHRpbWUgZXF1YWwgdG8gdGhlIGN1cnJlbnQgdGltZSArIHRpbWVvdXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfYmNtb3NfZ2V0X2Fic190aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHMsIHVpbnQzMl90IHRpbWVvdXQpCit7CisgICAgaW50IHJjOworICAgIHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgdHMpOworICAgIEJVR19PTihyYyk7CisgICAgdHMtPnR2X3NlYyArPSB0aW1lb3V0IC8gMTAwMDAwMDsKKyAgICB0cy0+dHZfbnNlYyArPSAodGltZW91dCAlIDEwMDAwMDApICogMTAwMDsKKyAgICBpZiAodHMtPnR2X25zZWMgPiAxMDAwMDAwMDAwKQorICAgIHsKKyAgICAgICAgdHMtPnR2X3NlYyArPSB0cy0+dHZfbnNlYyAvIDEwMDAwMDAwMDA7CisgICAgICAgIHRzLT50dl9uc2VjICU9IDEwMDAwMDAwMDA7CisgICAgfQorfQorCisvKiogTG9jayBtdXRleAorICovCit2b2lkIGJjbW9zX211dGV4X2xvY2soYmNtb3NfbXV0ZXggKm11dGV4KQoreworICAgIGludCByYzsKKyAgICByYyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgtPm0pOworICAgIEJVR19PTihyYyk7CisgICAgcmV0dXJuOworfQorCisvKiogUmVsZWFzZSBtdXRleAorICogXHBhcmFtW2luXSAgIG11dGV4ICAgTXV0ZXggY29udHJvbCBibG9jaworICovCit2b2lkIGJjbW9zX211dGV4X3VubG9jayhiY21vc19tdXRleCAqbXV0ZXgpCit7CisgICAgaW50IHJjOworICAgIHJjID0gcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4LT5tKTsKKyAgICBpZiAocmMpCisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigicHRocmVhZF9tdXRleF91bmxvY2soKS0+JWRcbiIsIHJjKTsKKyAgICBCVUdfT04ocmMpOworfQorCisvKgorICogU2VtYXBob3JlcworICogTW9zdCBvZiBzZW1hcGhvcmUgZnVuY3Rpb25zIGFyZSBpbmxpbmUKKyAqLworCisvKiBDcmVhdGUgc2VtYXBob3JlICovCitiY21vc19lcnJubyBiY21vc19zZW1fY3JlYXRlKGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCBjb3VudCwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc2VtX2luaXQoJnNlbS0+cywgMCwgY291bnQpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IHNlbWFwaG9yZSAqLwordm9pZCBiY21vc19zZW1fZGVzdHJveShiY21vc19zZW0gKnNlbSkKK3sKKyAgICBzZW1fZGVzdHJveSgmc2VtLT5zKTsKK30KKworLyogRGVjcmVtZW50IHNlbWFwaG9yZSBjb3VudGVyLiBXYWl0IGlmIHRoZSBjb3VudGVyIGlzIDAgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3NlbV93YWl0KGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCB0aW1lb3V0KQoreworICAgIGludCByYzsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKyAgICAvKiBJbml0IGVuZCB0aW1lIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmICh0aW1lb3V0ICYmIHRpbWVvdXQgIT0gQkNNT1NfV0FJVF9GT1JFVkVSKQorICAgIHsKKyAgICAgICAgX2JjbW9zX2dldF9hYnNfdGltZSgmdHMsIHRpbWVvdXQpOworICAgIH0KKworICAgIGRvCisgICAgeworICAgICAgICBpZiAodGltZW91dCA9PSBCQ01PU19XQUlUX0ZPUkVWRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gc2VtX3dhaXQoJnNlbS0+cyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBzZW1fdGltZWR3YWl0KCZzZW0tPnMsICZ0cyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IHNlbV90cnl3YWl0KCZzZW0tPnMpOworICAgICAgICB9CisgICAgfSB3aGlsZSAocmMgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgICAgIHJjID0gZXJybm87CisgICAgICAgIGlmIChyYyA9PSBFVElNRURPVVQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoInNlbV93YWl0KCktPiVkXG4iLCByYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKgorICogVGltZXJzCisgKi8KKworLyoqIEdldCBjdXJyZW50IHRpbWVzdGFtcAorICogXHJldHVybnMgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWVzdGFtcCAodXMpCisgKi8KK3VpbnQzMl90IGJjbW9zX3RpbWVzdGFtcCh2b2lkKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0cDsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRwKTsKKyAgICByZXR1cm4gKHRwLnR2X3NlYyAqIDEwMDAwMDAgKyB0cC50dl9uc2VjIC8gMTAwMCk7Cit9CisKKy8qKiBHZXQgY3VycmVudCB0aW1lc3RhbXAgLSA2NCBiaXQKKyAqIFxyZXR1cm5zIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lc3RhbXAgKHVzKQorICovCit1aW50NjRfdCBiY21vc190aW1lc3RhbXA2NCh2b2lkKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0cDsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRwKTsKKyAgICByZXR1cm4gKCh1aW50NjRfdCl0cC50dl9zZWMgKiAxMDAwMDAwTEwgKyAodWludDY0X3QpdHAudHZfbnNlYyAvIDEwMDBMTCk7Cit9CisKKy8qCisgKiBUaW1lciBoYW5kbGVycworICovCisKKworCisvKiBGb3IgcG9zaXggd2UgbXVzdCBjcmVhdGUgdGltZXIgdGFzaywgYmVjYXVzZSB0aGVyZSBpcyBubyB3YXkKKyAqIHRvIGVuZm9yY2UgcHJvdGVjdGlvbiBiZXR3ZWVuIGEgc2lnbmFsIGhhbmRsZXIgYW5kIGEgdGhyZWFkCisgKi8KK3N0YXRpYyBiY21vc190YXNrIF9iY21vc190aW1lcl90YXNrOworc3RhdGljIHNlbV90IF9iY21vc190aW1lcl9sb2NrOworCitzdGF0aWMgaW50IF9iY21vc190bXJfdGFza19oYW5kbGVyKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19zeXNfdGltZXIgKnRpbWVyID0gKGJjbW9zX3N5c190aW1lciAqKWRhdGE7CisgICAgYmNtb3NfdGFzayAqdGhpc190YXNrID0gYmNtb3NfdGFza19jdXJyZW50KCk7CisKKyAgICB3aGlsZSghdGhpc190YXNrLT5kZXN0cm95X3JlcXVlc3QpCisgICAgeworICAgICAgICBzZW1fd2FpdCgmX2JjbW9zX3RpbWVyX2xvY2spOworICAgICAgICB0aW1lci0+aGFuZGxlcih0aW1lci0+ZGF0YSk7CisgICAgfQorICAgIHRoaXNfdGFzay0+ZGVzdHJveWVkID0gQkNNT1NfVFJVRTsKKworICAgIHJldHVybiAwOworfQorCisvKiB0aW1lciBzaWduYWwgaGFuZGxlciAqLworc3RhdGljIHZvaWQgdGltZXJfc2lnX2hhbmRsZXIoaW50IHNpZywgc2lnaW5mb190ICpzaSwgdm9pZCAqdWMpCit7CisgICAgQlVHX09OKHNpLT5zaV9jb2RlICE9IFNJX1RJTUVSKTsKKyAgICBzZW1fcG9zdCgmX2JjbW9zX3RpbWVyX2xvY2spOworfQorCisvKiBDcmVhdGUgdGltZXIgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3N5c190aW1lcl9jcmVhdGUoYmNtb3Nfc3lzX3RpbWVyICp0aW1lciwgYmNtb3Nfc3lzX3RpbWVyX2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqZGF0YSkKK3sKKyAgICBzdGF0aWMgYmNtb3NfdGFza19wYXJtIHRtcl90YXNrX3Bhcm0gPSB7CisgICAgICAgIC5uYW1lID0gInRtcl90YXNrIiwKKyAgICAgICAgLnByaW9yaXR5ID0gQkNNT1NfVEFTS19QUklPUklUWV8wLAorICAgICAgICAuaGFuZGxlciA9IF9iY21vc190bXJfdGFza19oYW5kbGVyCisgICAgfTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHN0cnVjdCBzaWdhY3Rpb24gc2E7CisgICAgc3RydWN0IHNpZ2V2ZW50IHNldiA9IHt9OworCisgICAgaWYgKCF0aW1lciB8fCAhaGFuZGxlcikKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInRpbWVyICVwLCBoYW5kbGVyICVwXG4iLCB0aW1lciwgaGFuZGxlcik7CisKKyAgICB0aW1lci0+aGFuZGxlciA9IGhhbmRsZXI7CisgICAgdGltZXItPmRhdGEgPSBkYXRhOworCisgICAgc2VtX2luaXQoJl9iY21vc190aW1lcl9sb2NrLCAwLCAwKTsKKyAgICB0bXJfdGFza19wYXJtLmRhdGEgPSAobG9uZyl0aW1lcjsKKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZfYmNtb3NfdGltZXJfdGFzaywgJnRtcl90YXNrX3Bhcm0pOworICAgIGlmIChyYykKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKHJjLCAiQ2FuJ3QgY3JlYXRlIHRpbWVyIHRhc2tcbiIpOworCisgICAgc2Euc2FfZmxhZ3MgPSBTQV9TSUdJTkZPOworICAgIHNhLnNhX3NpZ2FjdGlvbiA9IHRpbWVyX3NpZ19oYW5kbGVyOworICAgIHNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKKyAgICBpZiAoc2lnYWN0aW9uKFRJTUVSX1NJRywgJnNhLCBOVUxMKSA9PSAtMSkKKyAgICAgICAgcGVycm9yKCJzaWdhY3Rpb24iKTsKKyAgICAvKiBQcmV2ZW50IHRpbWVyIHNpZ25hbCBmcm9tIGludGVycnVwdGluZyBzeXN0ZW0gY2FsbHMgKi8KKyAgICBpZiAoc2lnaW50ZXJydXB0KFRJTUVSX1NJRywgMCkgPT0gLTEpCisgICAgICAgIHBlcnJvcigic2lnaW50ZXJydXB0Iik7CisKKyAgIC8qIENyZWF0ZSBsaWJydCB0aW1lciAqLworICAgc2V2LnNpZ2V2X25vdGlmeSA9IFNJR0VWX1NJR05BTDsKKyAgIHNldi5zaWdldl9zaWdubyA9IFRJTUVSX1NJRzsKKyAgIHNldi5zaWdldl92YWx1ZS5zaXZhbF9wdHIgPSB0aW1lcjsKKyAgIGlmICh0aW1lcl9jcmVhdGUoQ0xPQ0tfUkVBTFRJTUUsICZzZXYsICZ0aW1lci0+dCkgPT0gLTEpCisgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfU1lTQ0FMTF9FUlIsICJlcnJubyAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKworICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERlc3Ryb3kgdGltZXIgKi8KK3ZvaWQgYmNtb3Nfc3lzX3RpbWVyX2Rlc3Ryb3koYmNtb3Nfc3lzX3RpbWVyICp0aW1lcikKK3sKKyAgICB0aW1lcl9kZWxldGUodGltZXItPnQpOworICAgIHNlbV9kZXN0cm95KCZfYmNtb3NfdGltZXJfbG9jayk7CisgICAgYmNtb3NfdGFza19kZXN0cm95KCZfYmNtb3NfdGltZXJfdGFzayk7Cit9CisKKy8qIChSZSlzdGFydCB0aW1lciAqLwordm9pZCBiY21vc19zeXNfdGltZXJfc3RhcnQoYmNtb3Nfc3lzX3RpbWVyICp0aW1lciwgdWludDMyX3QgZGVsYXkpCit7CisgICAgc3RydWN0IGl0aW1lcnNwZWMgaXRzOworCisgICAgaXRzLml0X3ZhbHVlLnR2X3NlYyA9IGRlbGF5IC8gMTAwMDAwMDsKKyAgICBpdHMuaXRfdmFsdWUudHZfbnNlYyA9IChkZWxheSAlIDEwMDAwMDApICogMTAwMDsKKyAgICBpdHMuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKKyAgICBpdHMuaXRfaW50ZXJ2YWwudHZfbnNlYyA9IDA7CisgICAgaWYgKHRpbWVyX3NldHRpbWUodGltZXItPnQsIDAsICZpdHMsIE5VTEwpID09IC0xKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJ0aW1lcl9zZXR0aW1lIGVycm5vICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBCVUcoKTsKKyAgICB9Cit9CisKKy8qIFN0b3AgdGltZXIgaWYgcnVubmluZyAqLwordm9pZCBiY21vc19zeXNfdGltZXJfc3RvcChiY21vc19zeXNfdGltZXIgKnRpbWVyKQoreworICAgIHN0cnVjdCBpdGltZXJzcGVjIGl0czsKKworICAgIEJVR19PTighdGltZXIpOworICAgIG1lbXNldCgmaXRzLCAwLCBzaXplb2YoaXRzKSk7CisgICAgdGltZXJfc2V0dGltZSh0aW1lci0+dCwgMCwgJml0cywgTlVMTCk7Cit9CisKKworLyogU3VzcGVuZCBjdXJyZW50IHRhc2sgZm9yIGEgdGltZSAqLwordm9pZCBiY21vc191c2xlZXAodWludDMyX3QgdXMpCit7CisgICAgdWludDMyX3QgdHMgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICB1aW50MzJfdCB0c2UgPSB0cyArIHVzOworICAgIGludDMyX3QgZCA9ICh1cyA+IDEwMDAwMDApID8gMTAwMDAwMCA6IHVzOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHVzbGVlcChkKTsKKyAgICAgICAgZCA9IHRzZSAtIGJjbW9zX3RpbWVzdGFtcCgpOworICAgICAgICBpZiAoZCA+IDEwMDAwMDApIGQgPSAxMDAwMDAwOworICAgIH0gd2hpbGUgKGQgPiAwKTsKK30KKworLyoKKyAqIE1lbW9yeSBtYW5hZ2VtZW50CisgKi8KKworLyogQWxsb2NhdGUgbWVtb3J5IGZyb20gdGhlIG1haW4gaGVhcCAqLwordm9pZCAqYmNtb3NfYWxsb2ModWludDMyX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gbWFsbG9jKHNpemUpOworfQorCisvKiBSZWxlYXNlIG1lbW9yeSB0byB0aGUgbWFpbiBwb29sICovCit2b2lkIGJjbW9zX2ZyZWUodm9pZCAqcHRyKQoreworICAgIGZyZWUocHRyKTsKK30KKworLyoKKyAqIEJ5dGUgbWVtb3J5IHBvb2wKKyAqLworCisvKiBNZW1vcnkgYmxvY2sgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19ieXRlX21lbWJsaworeworICAgIGJjbW9zX2J5dGVfcG9vbCAqcG9vbDsgICAgICAvKiogcG9vbCB0aGF0IG93bnMgdGhlIGJsb2NrICovCisgICAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAgICAgIC8qKiBibG9jayBzaXplIChieXRlcykgaW5jbHVkaW5nIGJjbW9zX2J5dGVfbWVtYmxrIGhlYWRlciAqLworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAvKiogbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEJDTU9TX01FTV9NQUdJQ19BTExPQyAgICgoJ20nPDwyNCkgfCAoJ2InIDw8IDE2KSB8ICgnbCcgPDwgOCkgfCAnaycpCisjZGVmaW5lIEJDTU9TX01FTV9NQUdJQ19GUkVFICAgICgoJ20nPDwyNCkgfCAoJ2InIDw8IDE2KSB8ICgnbCcgPDwgOCkgfCAnficpCisjZW5kaWYKK30gYmNtb3NfYnl0ZV9tZW1ibGs7CisKKy8qIENyZWF0ZSBieXRlIG1lbW9yeSBwb29sICovCitiY21vc19lcnJubyBiY21vc19ieXRlX3Bvb2xfY3JlYXRlKGJjbW9zX2J5dGVfcG9vbCAqcG9vbCwgY29uc3QgYmNtb3NfYnl0ZV9wb29sX3Bhcm0gKnBhcm0pCit7CisgICAgaWYgKCFwb29sIHx8ICFwYXJtKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInBvb2wgJXAsIHBhcm0gJXBcbiIsIHBvb2wsIHBhcm0pOworICAgIH0KKworICAgIEJDTV9NRU1aRVJPX1NUUlVDVChwb29sKTsKKyAgICBwb29sLT5wYXJtID0gKnBhcm07CisgICAgaWYgKCFwb29sLT5wYXJtLnNpemUpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAic2l6ZSAldVxuIiwgcGFybS0+c2l6ZSk7CisgICAgfQorI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHBvb2wtPm1hZ2ljID0gQkNNT1NfQllURV9QT09MX1ZBTElEOworI2VuZGlmCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERlc3Ryb3kgbWVtb3J5IHBvb2wgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2J5dGVfcG9vbF9kZXN0cm95KGJjbW9zX2J5dGVfcG9vbCAqcG9vbCkKK3sKKyAgICBpZiAocG9vbC0+YWxsb2NhdGVkKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfU1RBVEUsICIldSBieXRlcyBvZiBtZW1vcnkgYXJlIHN0aWxsIGFsbG9jYXRlZCBmcm9tIHRoZSBwb29sICVzXG4iLAorICAgICAgICAgICAgcG9vbC0+YWxsb2NhdGVkLCBwb29sLT5wYXJtLm5hbWUpOworICAgIH0KKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBwb29sLT5tYWdpYyA9IEJDTU9TX0JZVEVfUE9PTF9ERUxFVEVEOworI2VuZGlmCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEFsbG9jYXRlIG1lbW9yeSBmcm9tIG1lbW9yeSBwb29sICovCit2b2lkICpiY21vc19ieXRlX3Bvb2xfYWxsb2MoYmNtb3NfYnl0ZV9wb29sICpwb29sLCB1aW50MzJfdCBzaXplKQoreworICAgIGJjbW9zX2J5dGVfbWVtYmxrICpibGs7CisgICAgdWludDMyX3QgYnl0ZV9zaXplOworICAgIHZvaWQgKnB0cjsKKworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIEJVR19PTihwb29sLT5tYWdpYyAhPSBCQ01PU19CWVRFX1BPT0xfVkFMSUQpOworI2VuZGlmCisKKyAgICBpZiAoc2l6ZSArIHBvb2wtPmFsbG9jYXRlZCA+IHBvb2wtPnBhcm0uc2l6ZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBieXRlX3NpemUgPSBzaXplICsgc2l6ZW9mKGJjbW9zX2J5dGVfbWVtYmxrKTsKKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBieXRlX3NpemUgKz0gc2l6ZW9mKHVpbnQzMl90KTsgLyogYmxvY2sgc3VmZml4ICovCisjZW5kaWYKKyAgICAvKiBUb0RvOiBNYWludGFpbiBMTCBvZiBhbGxvY2F0ZWQgYmxvY2tzICovCisgICAgYmxrID0gKGJjbW9zX2J5dGVfbWVtYmxrICopbWFsbG9jKGJ5dGVfc2l6ZSk7CisgICAgaWYgKCFibGspCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHB0ciA9ICh2b2lkICopKGJsayArIDEpOworICAgIGJsay0+c2l6ZSA9IGJ5dGVfc2l6ZTsKKyAgICBwb29sLT5hbGxvY2F0ZWQgKz0gYnl0ZV9zaXplOworICAgIGJsay0+cG9vbCA9IHBvb2w7CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgYmxrLT5tYWdpYyA9IEJDTU9TX01FTV9NQUdJQ19BTExPQzsKKyAgICAqKHVpbnQzMl90ICopKChsb25nKWJsayArIGJ5dGVfc2l6ZSAtIHNpemVvZih1aW50MzJfdCkpID0gQkNNT1NfTUVNX01BR0lDX0FMTE9DOworI2VuZGlmCisKKyAgICByZXR1cm4gcHRyOworfQorCisvKiBSZWxlYXNlIG1lbW9yeSBhbGxvY2F0ZWQgdXNpbmcgYmNtb3NfYnl0ZV9wb29sX2FsbG9jKCkgKi8KK3ZvaWQgYmNtb3NfYnl0ZV9wb29sX2ZyZWUodm9pZCAqcHRyKQoreworICAgIGJjbW9zX2J5dGVfbWVtYmxrICpibGs7CisgICAgYmNtb3NfYnl0ZV9wb29sICpwb29sOworCisgICAgQlVHX09OKCFwdHIpOworICAgIGJsayA9IChiY21vc19ieXRlX21lbWJsayAqKSgobG9uZylwdHIgLSBzaXplb2YoYmNtb3NfYnl0ZV9tZW1ibGspKTsKKyAgICBwb29sID0gYmxrLT5wb29sOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIEJVR19PTihwb29sLT5tYWdpYyAhPSBCQ01PU19CWVRFX1BPT0xfVkFMSUQpOworICAgIEJVR19PTihibGstPm1hZ2ljICE9IEJDTU9TX01FTV9NQUdJQ19BTExPQyk7CisgICAgQlVHX09OKCoodWludDMyX3QgKikoKGxvbmcpYmxrICsgYmxrLT5zaXplIC0gc2l6ZW9mKHVpbnQzMl90KSkgIT0gQkNNT1NfTUVNX01BR0lDX0FMTE9DKTsKKyAgICBibGstPm1hZ2ljID0gQkNNT1NfTUVNX01BR0lDX0ZSRUU7CisjZW5kaWYKKyAgICBwb29sLT5hbGxvY2F0ZWQgLT0gYmxrLT5zaXplOworICAgIGZyZWUoYmxrKTsKK30KKwordm9pZCBfYmNtb3NfYmFja3RyYWNlKHZvaWQpCit7CisgICAgdm9pZCAqYXJyYXlbMzJdOworICAgIHNpemVfdCBzaXplOworICAgIGNoYXIgKipzdHJpbmdzOworICAgIHNpemVfdCBpOworCisgICAgc2l6ZSA9IGJhY2t0cmFjZShhcnJheSwgc2l6ZW9mKGFycmF5KS9zaXplb2YoYXJyYXlbMF0pKTsKKyAgICBzdHJpbmdzID0gYmFja3RyYWNlX3N5bWJvbHMoYXJyYXksIHNpemUpOworCisgICAgcHJpbnRmKCJPYnRhaW5lZCAlemQgc3RhY2sgZnJhbWVzLlxuIiwgc2l6ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICBwcmludGYoIiVzXG4iLCBzdHJpbmdzW2ldKTsKKworICAgIGZyZWUoc3RyaW5ncyk7Cit9CisKKy8qIHN0dWIgZm9yIGludCBlbmFibGUgKi8KK3ZvaWQgYmNtb3NfaW50X2VuYWJsZShpbnQgaXJxKQoreworfQorCit2b2lkIGJjbW9zX2ludF9kaXNhYmxlKGludCBpcnEpCit7Cit9CisKKy8qIHN0dWIgZm9yIGludCBjb25uZWN0ICovCitpbnQgYmNtb3NfaW50X2Nvbm5lY3QoaW50IGlycSwgaW50IGNwdSwgaW50IGZsYWdzLAorICAgIGludCAoKmlzcikoaW50IGlycSwgdm9pZCAqcHJpdiksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnByaXYpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEZ1bmN0aW9ucyBjb21tb24gZm9yIGRvbWFpbiBzb2NrZXQgYW5kIFVEUCBzb2NrZXQgLSBiYXNlZCBtZXNzYWdlIHF1ZXVlcyAqLworI2lmIGRlZmluZWQoQkNNT1NfTVNHX1FVRVVFX0RPTUFJTl9TT0NLRVQpIHx8IGRlZmluZWQoQkNNT1NfTVNHX1FVRVVFX1VEUF9TT0NLRVQpCisKKy8qKiAic2VuZCIgdG8gc29ja2V0ICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbW9zX3NvY2tldF9zZW5kKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgYnVmX2xlbmd0aCkKK3sKKyAgICBpbnQgcmM7CisgICAgLyogTWVzc2FnZSBxdWV1ZSB3aXRob3V0IHJlbW90ZSBlbmRwb2ludCBhZGRyZXNzIGRvZXNuJ3Qgc3VwcG9ydCB0cmFuc21pdCAqLworICAgIGlmICghcXVldWUtPmVwX2V4dHJhX2RhdGFfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICByYyA9IHNlbmR0byhxdWV1ZS0+ZXAsIGJ1ZiwgYnVmX2xlbmd0aCwgMCwKKyAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKXF1ZXVlLT5lcF9leHRyYV9kYXRhLCBxdWV1ZS0+ZXBfZXh0cmFfZGF0YV9zaXplKTsKKyAgICByZXR1cm4gKHJjID09IGJ1Zl9sZW5ndGgpID8gQkNNX0VSUl9PSyA6IEJDTV9FUlJfQ09NTV9GQUlMOworfQorCisvKiogInJlY3YiIGZyb20gc29ja2V0ICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbW9zX3NvY2tldF9yZWN2KGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIHVpbnQzMl90IHRpbWVvdXQsIHVpbnQ4X3QgKipidWYsIHVpbnQzMl90ICpidWZfbGVuZ3RoKQoreworICAgIGludCByYzsKKyAgICBpbnQgd2FpdCA9IDA7CisKKyAgICAvKiBNZXNzYWdlIHF1ZXVlIHdpdGhvdXQgbG9jYWwgZW5kcG9pbnQgYWRkcmVzcyBkb2Vzbid0IHN1cHBvcnQgcmVjZWl2ZSAqLworICAgIGlmICghcXVldWUtPnEucGFybS5sb2NhbF9lcF9hZGRyZXNzKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworCisgICAgaWYgKHRpbWVvdXQgJiYgdGltZW91dCAhPSBCQ01PU19XQUlUX0ZPUkVWRVIpCisgICAgeworICAgICAgICBmZF9zZXQgcmVhZF9mZHM7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworCisgICAgICAgIEZEX1pFUk8oJnJlYWRfZmRzKTsKKyAgICAgICAgRkRfU0VUKHF1ZXVlLT5lcCwgJnJlYWRfZmRzKTsKKyAgICAgICAgdHYudHZfc2VjID0gdGltZW91dCAvIDEwMDAwMDA7CisgICAgICAgIHR2LnR2X3VzZWMgPSAodGltZW91dCAlIDEwMDAwMDApICogMTAwMDsKKyAgICAgICAgcmMgPSBzZWxlY3QocXVldWUtPmVwICsgMSwgJnJlYWRfZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworICAgICAgICBpZiAocmMgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyYyB8fCAhRkRfSVNTRVQocXVldWUtPmVwLCAmcmVhZF9mZHMpKQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgd2FpdCA9IE1TR19ET05UV0FJVDsKKyAgICB9CisKKyAgICByYyA9IHJlY3YocXVldWUtPmVwLCBxdWV1ZS0+cmVjdl9idWYsIHF1ZXVlLT5xLnBhcm0ubWF4X210dSwgd2FpdCk7CisgICAgaWYgKHJjIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisgICAgaWYgKHJjID09IDApCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgKmJ1ZiA9IHF1ZXVlLT5yZWN2X2J1ZjsKKyAgICAqYnVmX2xlbmd0aCA9IHJjOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtb3Nfc29ja2V0X2Nsb3NlKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUpCit7CisgICAgLyogQ2xvc2UgZG9tYWluIHNvY2tldCAqLworICAgIGlmIChxdWV1ZS0+ZXAgPiAwKQorICAgIHsKKyAgICAgICAgY2xvc2UocXVldWUtPmVwKTsKKyAgICB9CisgICAgaWYgKHF1ZXVlLT5lcF9leHRyYV9kYXRhKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShxdWV1ZS0+ZXBfZXh0cmFfZGF0YSk7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qIFBhY2sgbWVzc2FnZSBmb3Igb3Zlci10aGUtc29ja2V0IHRyYW5zbWlzc2lvbi4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgZ29vZCBmb3IgY2FzZSB3aGVuIGJvdGggcXVldWUgZW5kcyBhcmUgb24gdGhlIHNhbWUgQ1BVCisgKiBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBhbnkgdHJhbnNsYXRpb24uCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtb3NfdHJhbnNwYXJlbnRfcGFjayhiY21vc19tc2dfcXVldWUgKnF1ZXVlLCBiY21vc19tc2cgKm1zZywgdWludDhfdCAqKmJ1ZiwgdWludDMyX3QgKmJ1Zl9sZW5ndGgpCit7CisgICAgdWludDMyX3Qgc2l6ZSA9IEJDTU9TX01TR19IRFJfU0laRSArIG1zZy0+c2l6ZTsKKworICAgIGlmIChzaXplID4gcXVldWUtPnEucGFybS5tYXhfbXR1KQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfT1ZFUkZMT1csICJBdHRlbXB0IHRvIHNlbmQgbWVzc2FnZSBsb25nZXIgdGhhbiBjb25maWd1cmVkIG1heF9tdHUgJXUgPiAldVxuIiwKKyAgICAgICAgICAgIHNpemUsIHF1ZXVlLT5xLnBhcm0ubWF4X210dSk7CisgICAgfQorICAgIGJjbW9zX21zZ19oZHJfcGFjayhtc2csIHF1ZXVlLT5zZW5kX2J1ZiwgbXNnLT5zaXplKTsKKyAgICBpZiAobXNnLT5zaXplKQorICAgIHsKKyAgICAgICAgQlVHX09OKG1zZy0+ZGF0YSA9PSBOVUxMKTsKKyAgICAgICAgbWVtY3B5KHF1ZXVlLT5zZW5kX2J1ZiArIEJDTU9TX01TR19IRFJfU0laRSwgbXNnLT5kYXRhLCBtc2ctPnNpemUpOworICAgIH0KKyAgICAqYnVmID0gcXVldWUtPnNlbmRfYnVmOworICAgICpidWZfbGVuZ3RoID0gc2l6ZTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqICJ1bnBhY2siIG1lc3NhZ2UuIEluIGNhc2Ugb2YgZG9tYWluIHNvY2tldCBib3RoIHF1ZXVlIGVuZHMgYXJlIGluIHRoZSBzYW1lIENQVS4KKyAqIE1lc3NhZ2UgaXMgc2VudCBhcy1pcworICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbW9zX3RyYW5zcGFyZW50X3VucGFjayhiY21vc19tc2dfcXVldWUgKnF1ZXVlLCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9sZW5ndGgsIGJjbW9zX21zZyAqKm1zZykKK3sKKyAgICBiY21vc19tc2cgKm07CisKKyAgICBpZiAoYnVmX2xlbmd0aCA8IEJDTU9TX01TR19IRFJfU0laRSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0lOVEVSTkFMLCAiUmVjZWl2ZWQgbWVzc2FnZSBpcyB0b28gc2hvcnQgKCV1KVxuIiwgYnVmX2xlbmd0aCk7CisgICAgfQorCisgICAgLyogQWRqdXN0IGJ1Zl9sZW5ndGggdG8gYWNjb3VudCBmb3IgZGlmZmVyZW5jZSBpbiBwYWNrZWQgYW5kIHVucGFja2VkIG1lc3NhZ2UgaGVhZGVyIHNpemVzICovCisgICAgYnVmX2xlbmd0aCAtPSBCQ01PU19NU0dfSERSX1NJWkU7CisgICAgYnVmX2xlbmd0aCArPSBzaXplb2YoYmNtb3NfbXNnKTsKKworICAgIG0gPSBiY21vc19hbGxvYyhidWZfbGVuZ3RoKTsKKyAgICBpZiAoIW0pCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT01FTSwgIlJlY2VpdmVkIG1lc3NhZ2UgZGlzY2FyZGVkOiAldSBieXRlc1xuIiwgYnVmX2xlbmd0aCk7CisgICAgfQorCisgICAgYmNtb3NfbXNnX2hkcl91bnBhY2soYnVmLCBtKTsKKyAgICBtLT5yZWxlYXNlID0gTlVMTDsKKyAgICBtLT5kYXRhX3JlbGVhc2UgPSBOVUxMOworICAgIGlmIChtLT5zaXplICE9IGJ1Zl9sZW5ndGggLSBzaXplb2YoYmNtb3NfbXNnKSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiUmVjZWl2ZWQgbWVzc2FnZSBpcyBpbnNhbmUuIEV4cGVjdGVkIGRhdGEgbGVuZ3RoICV1LCBnb3QgJXVcbiIsCisgICAgICAgICAgICBtLT5zaXplLCBidWZfbGVuZ3RoIC0gc2l6ZW9mKGJjbW9zX21zZykpOworICAgICAgICBiY21vc19mcmVlKG0pOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisgICAgaWYgKG0tPnNpemUpCisgICAgeworICAgICAgICBtLT5kYXRhID0gbS0+c3RhcnQgPSAodm9pZCAqKShtICsgMSk7CisgICAgICAgIG1lbWNweShtLT5kYXRhLCAmYnVmW0JDTU9TX01TR19IRFJfU0laRV0sIG0tPnNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtLT5kYXRhID0gbS0+c3RhcnQgPSBOVUxMOworICAgIH0KKyAgICAqbXNnID0gbTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKyNlbmRpZgorCisvKiBEb21haW4tc29ja2V0LWJhc2VkIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbiAqLworI2lmZGVmIEJDTU9TX01TR19RVUVVRV9ET01BSU5fU09DS0VUCisKK2JjbW9zX2Vycm5vIGJjbW9zX3N5c19tc2dfcXVldWVfZG9tYWluX3NvY2tldF9vcGVuKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUpCit7CisgICAgc3RydWN0IHNvY2thZGRyX3VuIHNhOworCisgICAgLyogT3BlbiBkb21haW4gc29ja2V0ICovCisgICAgcXVldWUtPmVwID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfREdSQU0sIDApOworICAgIGlmIChxdWV1ZS0+ZXAgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgIkNhbid0IGNyZWF0ZSBkb21haW4gc29ja2V0LiBlcnJvciAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisKKyAgICBtZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKyAgICBzYS5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKworICAgIC8qIElmIGxvY2FsX2VwX2FkZHJlc3MgaXMgc2V0IC0gdGhlIHF1ZXVlIHN1cHBvcnRzIHJlY2VpdmUgKi8KKyAgICBpZiAocXVldWUtPnEucGFybS5sb2NhbF9lcF9hZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3RybmNweShzYS5zdW5fcGF0aCwgcXVldWUtPnEucGFybS5sb2NhbF9lcF9hZGRyZXNzLCBzaXplb2Yoc2Euc3VuX3BhdGgpIC0gMSk7CisgICAgICAgIC8qIEluIGxpbnV4IHBhdGggY2FuIHN0YXJ0IGZyb20gMCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgaWYgKCFzYS5zdW5fcGF0aFswXSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RybmNweSgmc2Euc3VuX3BhdGhbMV0sICZxdWV1ZS0+cS5wYXJtLmxvY2FsX2VwX2FkZHJlc3NbMV0sIHNpemVvZihzYS5zdW5fcGF0aCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmluZChxdWV1ZS0+ZXAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGVyciA9IGVycm5vOworICAgICAgICAgICAgY2xvc2UocXVldWUtPmVwKTsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJDYW4ndCBiaW5kIGRvbWFpbiBzb2NrZXQgdG8gJXMuIGVycm9yICVzXG4iLAorICAgICAgICAgICAgICAgIHF1ZXVlLT5xLnBhcm0ubG9jYWxfZXBfYWRkcmVzcywgc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiByZW1vdGVfZXBfYWRkcmVzcyBpcyBzZXQgLSB0aGUgcXVldWUgc3VwcG9ydHMgdHJhbnNtaXQgKi8KKyAgICBpZiAocXVldWUtPnEucGFybS5yZW1vdGVfZXBfYWRkcmVzcykKKyAgICB7CisgICAgICAgIHF1ZXVlLT5lcF9leHRyYV9kYXRhID0gYmNtb3NfY2FsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pKTsKKyAgICAgICAgaWYgKCFxdWV1ZS0+ZXBfZXh0cmFfZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgY2xvc2UocXVldWUtPmVwKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkoc2Euc3VuX3BhdGgsIHF1ZXVlLT5xLnBhcm0ucmVtb3RlX2VwX2FkZHJlc3MsIHNpemVvZihzYS5zdW5fcGF0aCkgLSAxKTsKKyAgICAgICAgLyogSW4gbGludXggcGF0aCBjYW4gc3RhcnQgZnJvbSAwIGNoYXJhY3RlciAqLworICAgICAgICBpZiAoIXNhLnN1bl9wYXRoWzBdKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJuY3B5KCZzYS5zdW5fcGF0aFsxXSwgJnF1ZXVlLT5xLnBhcm0ucmVtb3RlX2VwX2FkZHJlc3NbMV0sIHNpemVvZihzYS5zdW5fcGF0aCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocXVldWUtPmVwX2V4dHJhX2RhdGEsICZzYSwgc2l6ZW9mKHNhKSk7CisgICAgICAgIHF1ZXVlLT5lcF9leHRyYV9kYXRhX3NpemUgPSBzaXplb2Yoc2EpOworICAgIH0KKworICAgIC8qIFNldCBjYWxsYmFja3MgKi8KKyAgICBxdWV1ZS0+cS5wYXJtLmNsb3NlID0gX2JjbW9zX3NvY2tldF9jbG9zZTsKKyAgICBxdWV1ZS0+cS5wYXJtLnNlbmQgPSBfYmNtb3Nfc29ja2V0X3NlbmQ7CisgICAgcXVldWUtPnEucGFybS5yZWN2ID0gX2JjbW9zX3NvY2tldF9yZWN2OworICAgIGlmICghcXVldWUtPnEucGFybS5wYWNrKQorICAgICAgICBxdWV1ZS0+cS5wYXJtLnBhY2sgPSBfYmNtb3NfdHJhbnNwYXJlbnRfcGFjazsKKyAgICBpZiAoIXF1ZXVlLT5xLnBhcm0udW5wYWNrKQorICAgICAgICBxdWV1ZS0+cS5wYXJtLnVucGFjayA9IF9iY21vc190cmFuc3BhcmVudF91bnBhY2s7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2VuZGlmCisKKy8qIFVEUC1zb2NrZXQtYmFzZWQgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uICovCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1VEUF9TT0NLRVQKKworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21vc19wYXJzZV9pcF9wb3J0KGNvbnN0IGNoYXIgKnMsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EpCit7CisgICAgdWludDMyX3QgaXA7CisgICAgaW50IG47CisgICAgdWludDMyX3QgaXAxLCBpcDIsIGlwMywgaXA0LCBwb3J0OworCisgICAgbiA9IHNzY2FuZihzLCAiJXUuJXUuJXUuJXU6JXUiLCAmaXAxLCAmaXAyLCAmaXAzLCAmaXA0LCAmcG9ydCk7CisgICAgaWYgKG4gIT0gNSB8fCBpcDEgPiAweGZmIHx8IGlwMiA+IDB4ZmYgfHwgaXAzID4gMHhmZiB8fCBpcDQgPiAweGZmIHx8IHBvcnQgPiAweGZmZmYpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAiQ2FuJ3QgcGFyc2UgJXMuIE11c3QgYmUgaXBfYWRkcmVzczpwb3J0XG4iLCBzKTsKKyAgICB9CisgICAgaXAgPSAoaXAxIDw8IDI0KSB8IChpcDIgPDwgMTYpIHwgKGlwMyA8PCA4KSB8IGlwNDsKKyAgICBzYS0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgICBzYS0+c2luX2FkZHIuc19hZGRyID0gaHRvbmwoaXApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9zX3N5c19tc2dfcXVldWVfdWRwX3NvY2tldF9vcGVuKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUpCit7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogT3BlbiBVRFAgc29ja2V0ICovCisgICAgcXVldWUtPmVwID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIGlmIChxdWV1ZS0+ZXAgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgIkNhbid0IGNyZWF0ZSBVRFAgc29ja2V0LiBlcnJvciAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisKKyAgICBtZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKyAgICBzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworICAgIC8qIElmIGxvY2FsX2VwX2FkZHJlc3MgaXMgc2V0IC0gdGhlIHF1ZXVlIHN1cHBvcnRzIHJlY2VpdmUgKi8KKyAgICBpZiAocXVldWUtPnEucGFybS5sb2NhbF9lcF9hZGRyZXNzKQorICAgIHsKKyAgICAgICAgcmMgPSBfYmNtb3NfcGFyc2VfaXBfcG9ydChxdWV1ZS0+cS5wYXJtLmxvY2FsX2VwX2FkZHJlc3MsICZzYSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgaWYgKCFzYS5zaW5fYWRkci5zX2FkZHIpCisgICAgICAgICAgICBzYS5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworICAgICAgICBpZiAoYmluZChxdWV1ZS0+ZXAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGVyciA9IGVycm5vOworICAgICAgICAgICAgY2xvc2UocXVldWUtPmVwKTsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJDYW4ndCBiaW5kIFVEUCBzb2NrZXQgdG8gJXMuIGVycm9yICVzXG4iLAorICAgICAgICAgICAgICAgIHF1ZXVlLT5xLnBhcm0ubG9jYWxfZXBfYWRkcmVzcywgc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiByZW1vdGVfZXBfYWRkcmVzcyBpcyBzZXQgLSB0aGUgcXVldWUgc3VwcG9ydHMgdHJhbnNtaXQgKi8KKyAgICBpZiAocXVldWUtPnEucGFybS5yZW1vdGVfZXBfYWRkcmVzcykKKyAgICB7CisgICAgICAgIHJjID0gX2JjbW9zX3BhcnNlX2lwX3BvcnQocXVldWUtPnEucGFybS5yZW1vdGVfZXBfYWRkcmVzcywgJnNhKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICBxdWV1ZS0+ZXBfZXh0cmFfZGF0YSA9IGJjbW9zX2NhbGxvYyhzaXplb2Yoc2EpKTsKKyAgICAgICAgaWYgKCFxdWV1ZS0+ZXBfZXh0cmFfZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgY2xvc2UocXVldWUtPmVwKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisgICAgICAgIG1lbWNweShxdWV1ZS0+ZXBfZXh0cmFfZGF0YSwgJnNhLCBzaXplb2Yoc2EpKTsKKyAgICAgICAgcXVldWUtPmVwX2V4dHJhX2RhdGFfc2l6ZSA9IHNpemVvZihzYSk7CisgICAgfQorCisgICAgLyogU2V0IGNhbGxiYWNrcyAqLworICAgIHF1ZXVlLT5xLnBhcm0uY2xvc2UgPSBfYmNtb3Nfc29ja2V0X2Nsb3NlOworICAgIHF1ZXVlLT5xLnBhcm0uc2VuZCA9IF9iY21vc19zb2NrZXRfc2VuZDsKKyAgICBxdWV1ZS0+cS5wYXJtLnJlY3YgPSBfYmNtb3Nfc29ja2V0X3JlY3Y7CisgICAgaWYgKCFxdWV1ZS0+cS5wYXJtLnBhY2spCisgICAgICAgIHF1ZXVlLT5xLnBhcm0ucGFjayA9IF9iY21vc190cmFuc3BhcmVudF9wYWNrOworICAgIGlmICghcXVldWUtPnEucGFybS51bnBhY2spCisgICAgICAgIHF1ZXVlLT5xLnBhcm0udW5wYWNrID0gX2JjbW9zX3RyYW5zcGFyZW50X3VucGFjazsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL3Bvc2l4L2JjbW9zX3N5c3RlbS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9wb3NpeC9iY21vc19zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGM5MDJlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9wb3NpeC9iY21vc19zeXN0ZW0uaApAQCAtMCwwICsxLDMwMSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbW9zX3N5c3RlbS5oCisgKiBNYXBsZSBTeXN0ZW0gU2VydmljZXMKKyAqIHBvc2l4IHBvcnQ6IHNpbXVsYXRpb24KKyAqLworCisjaWZuZGVmIEJDTU9TX1NZU1RFTV9IXworI2RlZmluZSBCQ01PU19TWVNURU1fSF8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXhlY2luZm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisvKiBwb3NpeCBwb3J0IGhhcyBvbmx5IGJlZW4gdGVzdGVkIGluIGxpbnV4IHVzZXIgc3BhY2UgKi8KKyNkZWZpbmUgTElOVVhfVVNFUl9TUEFDRQorCisvKiBSZS1kZWZpbmUgR05VIHR5cGVvZiBhcyBJU08gX190eXBlb2ZfXyAqLworI2RlZmluZSB0eXBlb2YgX190eXBlb2ZfXworCit2b2lkIF9iY21vc19iYWNrdHJhY2Uodm9pZCk7CisKKyNkZWZpbmUgQlVHX09OX1BSSU5UKGNvbmRpdGlvbiwgZm10LCBhcmdzLi4uKSBcCisgICAgZG8gXAorICAgIHsgXAorICAgICAgICBpZiAoY29uZGl0aW9uKSBcCisgICAgICAgIHsgXAorICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKGZtdCwgIyNhcmdzKTsgXAorICAgICAgICAgICAgYXNzZXJ0KCEoY29uZGl0aW9uKSk7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBCVUdfT04oY29uZGl0aW9uKSAgICAgQlVHX09OX1BSSU5UKChjb25kaXRpb24pLCAiQlVHIGluICVzICVkIVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNkZWZpbmUgQlVHKCkgICAgICAgICAgICAgICAgIEJVR19PTigxKQorI2RlZmluZSBCVUdfVU5MRVNTKGNvbmRpdGlvbikgQlVHX09OKCEoY29uZGl0aW9uKSkKKworLyogSWYgJ2VycicgaXMgbm90IEJDTV9FUlJfT0ssIHRoZXJlIGlzIGEgYnVnIGluIHRoZSBzb2Z0d2FyZSAtIGhhbHQgYW5kIHByaW50IHRoZSBzcGVjaWZpZWQgbWVzc2FnZSAqLworI2RlZmluZSBCVUdfT05fRVJST1IoZXJyLCBmbXQsIGFyZ3MuLi4pIFwKKyAgICBCVUdfT05fUFJJTlQoKGVycikgIT0gQkNNX0VSUl9PSywgXAorICAgICAgICAiJXM6JWQ6IGVycj0lcyAoJWQpOiAiIGZtdCwgXAorICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBiY21vc19zdHJlcnJvcihlcnIpLCAoZXJyKSwgIyNhcmdzKQorCisvKiBTcGVjaWZ5IGhlcmUgd2hpY2ggc3lzdGVtIGZ1bmN0aW9ucyBhcmUgaW5saW5lZCAqLworCisjZGVmaW5lIEJDTU9TX0ZBU1RMT0NLX0lOTElORQorLyogI2RlZmluZSBCQ01PU19TRU1fV0FJVF9JTkxJTkUgKi8KKyNkZWZpbmUgQkNNT1NfU0VNX1BPU1RfSU5MSU5FCisjZGVmaW5lIEJDTU9TX1RSQUNFX1BSSU5URgorLyogI2RlZmluZSBCQ01PU19CWVRFX1BPT0xfQUxMT0NfRlJFRV9JTkxJTkUgKi8KKy8qICNkZWZpbmUgQkNNT1NfTUFMTE9DX0ZSRUVfSU5MSU5FICovCisvKiAjZGVmaW5lIEJDTU9TX0NBTExPQ19JTkxJTkUgKi8KKyNkZWZpbmUgQkNNT1NfRE1BX0FMTE9DX0ZSRUVfSU5MSU5FCisjZGVmaW5lIEJDTU9TX1ZJUlRfVE9fUEhZU19JTkxJTkUKKyNkZWZpbmUgQkNNT1NfQ0FDSEVfSU5MSU5FCisKKyNpbmNsdWRlICJiY21vc19jb21tb24uaCIKKworLyogcG9zaXgtc3BlY2lmaWMgc3R1ZmYgKi8KKworLyoKKyAqIFN5bmNocm9uaXphdGlvbgorICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fbXV0ZXgKKyAqIEB7CisgKi8KKworLyoqIE11dGV4IGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY21vc19tdXRleAoreworICAgIHB0aHJlYWRfbXV0ZXhfdCBtOyAgICAgICAgICAvKio8IHB0aHJlYWQgbXV0ZXggKi8KKyAgICBwdGhyZWFkX211dGV4YXR0cl90IGF0dHI7ICAgLyoqPCBwdGhyZWFkIG11dGV4IGF0dHJpYnV0ZSAqLworfTsKKworLyoqIEB9IHN5c3RlbV9tdXRleCAqLworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX2Zhc3Rsb2NrCisgKiBAeworICovCisKKy8qKiBGYXN0IGxvY2sgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX2Zhc3Rsb2NrCit7CisgICAgYmNtb3NfbXV0ZXggbTsKK307CisKKy8qKiBGYXN0bG9jayBpbml0aWFsaXplci4gQ2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBjYWxsaW5nIGJjbW9zX2Zhc3Rsb2NrX2luaXQoKSAqLworI2RlZmluZSBCQ01PU19GQVNUTE9DS19JTklUSUFMSVpFUiAgICAgIHsgeyBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSIH0gfQorCisvKiBJbml0IGZhc3Rsb2NrICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfZmFzdGxvY2tfaW5pdChiY21vc19mYXN0bG9jayAqbG9jaywgdWludDMyX3QgZmxhZ3MpCit7CisgICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZsb2NrLT5tLCAwLCBOVUxMKTsKK30KKworLyogVGFrZSBmYXN0IGxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBiY21vc19mYXN0bG9ja19sb2NrKGJjbW9zX2Zhc3Rsb2NrICpsb2NrKQoreworICAgIGJjbW9zX211dGV4X2xvY2soJmxvY2stPm0pOworICAgIHJldHVybiAwOworfQorCisvKiBSZWxlYXNlIGZhc3QgbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2Zhc3Rsb2NrX3VubG9jayhiY21vc19mYXN0bG9jayAqbG9jaywgbG9uZyBmbGFncykKK3sKKyAgICBiY21vc19tdXRleF91bmxvY2soJmxvY2stPm0pOworfQorCisvKiogQH0gc3lzdGVtX2Zhc3Rsb2NrICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fc2VtCisgKiBAeworICovCisKKy8qKiBTZW1hcGhvcmUgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX3NlbQoreworICAgIHNlbV90IHM7ICAgICAgICAgICAgLyoqPCBwdGhyZWFkIHNlbWFwaG9yZSAqLworfTsKKworLyogSW5jcmVtZW50IHNlbWFwaG9yZSBjb3VudGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3Nfc2VtX3Bvc3QoYmNtb3Nfc2VtICpzZW0pCit7CisgICAgc2VtX3Bvc3QoJnNlbS0+cyk7Cit9CisKKy8qKiBAfSBzeXN0ZW1fc2VtICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fdGltZXIKKyAqIEB7CisgKi8KKworLyoqIFN5c3RlbSB0aW1lciAqLworc3RydWN0IGJjbW9zX3N5c190aW1lcgoreworICAgIHRpbWVyX3QgdDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgbGlicnQgdGltZXIgKi8KKyAgICBiY21vc19zeXNfdGltZXJfaGFuZGxlciBoYW5kbGVyOyAgICAvKio8IFRpbWVyIGhhbmRsZXIgKi8KKyAgICB2b2lkICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBhcmFtZXRlciB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgKi8KK307CisKKy8qKiBAfSBzeXN0ZW1fdGltZXIgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV90YXNrCisgKiBAeworICovCisKKy8qKiBPUy1zcGVjaWZpYyB0YXNrIGNvbnRyb2wgYmxvY2sgZXh0ZW5zaW9uICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19zeXNfdGFzaworeworICAgIHB0aHJlYWRfdCB0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgcG9zaXggcHRocmVhZCAqLworfSBiY21vc19zeXNfdGFzazsKKworLyoqIEB9IHN5c3RlbV90YXNrICovCisKKy8qKiBcYWRkdG9ncm91cCBieXRlX3Bvb2wKKyAqIEB7CisgKi8KKworLyoqIE1lbW9yeSBwb29sIGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY21vc19ieXRlX3Bvb2wKK3sKKyAgICBiY21vc19ieXRlX3Bvb2xfcGFybSBwYXJtOyAgLyoqPCBQb29sIHBhcmFtZXRlcnMgKi8KKyAgICB1aW50MzJfdCBhbGxvY2F0ZWQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkICovCisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgdWludDMyX3QgbWFnaWM7ICAgICAgICAgICAgIC8qKjwgbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEJDTU9TX0JZVEVfUE9PTF9WQUxJRCAgICAgICAgICAgKCgnYic8PDI0KSB8ICgneScgPDwgMTYpIHwgKCdwJyA8PCA4KSB8ICdvJykKKyNkZWZpbmUgQkNNT1NfQllURV9QT09MX0RFTEVURUQgICAgICAgICAoKCdiJzw8MjQpIHwgKCd5JyA8PCAxNikgfCAoJ3AnIDw8IDgpIHwgJ34nKQorI2VuZGlmCit9OworCisvKiogQH0gKi8KKworLyogUHJpbnQgKi8KKyNkZWZpbmUgYmNtb3Nfc3lzX3ZwcmludGYoZm10LCBhcmdzKSAgICAgICAgdnByaW50ZihmbXQsIGFyZ3MpCisKKy8qIEEgZmV3IG1hY3JvcyB0byBlbmFibGUgbGludXgga2VybmVsIHNwYWNlIGNvbXBpbGF0aW9uICovCisjZGVmaW5lIEVYUE9SVF9TWU1CT0woX3N5bSkKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbG93LWxldmVsIGZ1bmN0aW9ucyBhcmUgbW9zdGx5IGZvciBzaW11bGF0aW9uCisgKi8KKworLyoKKyAqIERNQS1hYmxlIG1lbW9yeSBhbGxvY2F0aW9uCisgKi8KKworLyogQWxsb2NhdGUgRE1BLWFibGUgbWVtb3J5ICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmJjbW9zX2RtYV9hbGxvYyh1aW50OF90IGRldmljZSwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gYmNtb3NfYWxsb2Moc2l6ZSk7Cit9CisKKy8qIFJlbGVhc2UgRE1BLWFibGUgbWVtb3J5ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfZG1hX2ZyZWUodWludDhfdCBkZXZpY2UsIHZvaWQgKnB0cikKK3sKKyAgICBiY21vc19mcmVlKHB0cik7Cit9CisKKy8qIENvbnZlcnQgdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBiY21vc192aXJ0X3RvX3BoeXModm9pZCAqdmEpCit7CisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSh2YSk7Cit9CisKKy8qIEludmFsaWRhdGUgYWRkcmVzcyBhcmVhIGluIGRhdGEgY2FjaGUuIERpcnR5IGNhY2hlIGxpbmVzIGNvbnRlbnQgaXMgZGlzY2FyZGVkLiAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2RjYWNoZV9pbnYodm9pZCAqc3RhcnQsIHVpbnQzMl90IHNpemUpCit7Cit9CisKKy8qIEZsdXNoIGFkZHJlc3MgYXJlYSBpbiBkYXRhIGNhY2hlLiBEaXJ0eSBjYWNoZSBsaW5lcyBhcmUgY29tbWl0dGVkIHRvIG1lbW9yeS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19kY2FjaGVfZmx1c2godm9pZCAqc3RhcnQsIHVpbnQzMl90IHNpemUpCit7Cit9CisKKy8qIHdyaXRlIGJhcnJpZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19iYXJyaWVyKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21fcGNpX3dyaXRlMzIodm9sYXRpbGUgdWludDMyX3QgKmFkZHJlc3MsIHVpbnQzMl90IHZhbHVlKQoreworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbV9wY2lfcmVhZDMyKGNvbnN0IHZvbGF0aWxlIHVpbnQzMl90ICphZGRyZXNzKQoreworCXJldHVybiAtMTsKK30KKworLyogQ2hlY2sgaW4taXJxIHN0YXR1cyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGlzX2lycV9tb2RlKHZvaWQpCit7CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCisvKiBDaGVjayBpZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGlzX2lycV9kaXNhYmxlZCh2b2lkKQoreworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworLyoKKyAqIEludGVybmFsICh0byBPUyBhYnN0cmFjdGlvbikgZnVuY3Rpb25zIGZvciBtZXNzYWdpbmcgb3ZlciBkb21haW4gYW5kIFVEUCBzb2NrZXRzCisgKi8KKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVAorYmNtb3NfZXJybm8gYmNtb3Nfc3lzX21zZ19xdWV1ZV9kb21haW5fc29ja2V0X29wZW4oYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZSk7CisjZW5kaWYKKworI2lmZGVmIEJDTU9TX01TR19RVUVVRV9VRFBfU09DS0VUCitiY21vc19lcnJubyBiY21vc19zeXNfbXNnX3F1ZXVlX3VkcF9zb2NrZXRfb3BlbihiY21vc19tc2dfcXVldWUgKnF1ZXVlKTsKKyNlbmRpZgorCisvKiAybmQgcGFydCBvZiBPUy1pbmRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KKyNpbmNsdWRlICJiY21vc19jb21tb24yLmgiCisKKyNlbmRpZiAvKiBCQ01PU19TWVNURU1fSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vdnh3b3JrczU1L2JjbW9zX3N5c3RlbS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi92eHdvcmtzNTUvYmNtb3Nfc3lzdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1YzhkMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vdnh3b3JrczU1L2JjbW9zX3N5c3RlbS5jCkBAIC0wLDAgKzEsNzQyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSA8dnhXb3Jrcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRhc2tMaWIuaD4KKyNpbmNsdWRlIDx3ZExpYi5oPgorI2luY2x1ZGUgPHN5c0xpYi5oPgorI2luY2x1ZGUgPGVycm5vTGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGludExpYi5oPgorI2luY2x1ZGUgPGNhY2hlTGliLmg+CisjaW5jbHVkZSAibWVtUGFydExpYi5oIgorCisjaWZkZWYgSE9TVF9DUFVfSVNfTUlQUworI2luY2x1ZGUgImFyY2gvbWlwcy9hcmNoTWlwcy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxpdi5oPgorCisjZGVmaW5lIEJDTU9TX0RFRkFVTFRfU1RBQ0tfU0laRSAoMTAwKjEwMjQpLyoweDQwMDAqLworI2RlZmluZSBCQ01PU19NSUNST1NFQ09ORFNfVE9fVElDS1ModSkgKHUpLzEwMDAwMDAqYmNtb3NfdGltZXJfZ2V0X2ZyZXF1ZW5jeSgpICsgQkNNT1NfRElWSURFX1JPVU5EX1VQKCgodSklMTAwMDAwMCkqYmNtb3NfdGltZXJfZ2V0X2ZyZXF1ZW5jeSgpLDEwMDAwMDApCisKKy8qIHRhc2sgY29udHJvbCBibG9ja3MgKi8KK2V4dGVybiBTVEFJTFFfSEVBRCh0YXNrX2xpc3QsIGJjbW9zX3Rhc2spIHRhc2tfbGlzdDsKKworLyogZ2xvYmFsIE9TIGxvY2sgKi8KK2V4dGVybiBiY21vc19tdXRleCBiY21vc19yZXNfbG9jazsKKworLyoKKyAqIERlZmF1bHQgdGFzayBoYW5kbGVyCisgKi8KK2V4dGVybiBpbnQgYmNtb3NfZGZ0X3Rhc2tfaGFuZGxlcihsb25nIGRhdGEpOworCitiY21vc19lcnJubyBiY21vc19zeXNfaW5pdCh2b2lkKQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBDbGVhbi11cCBzeXN0ZW0gbGlicmFyeSAqLwordm9pZCBiY21vc19zeXNfZXhpdCh2b2lkKQoreworfQorCitzdGF0aWMgdWludDMyX3QgYmNtb3NfdGltZXJfZ2V0X2ZyZXF1ZW5jeSgpCit7CisgICAgc3RhdGljIHVpbnQzMl90IGZyZXF1ZW5jeSA9IDA7CisgICAgaWYgKCFmcmVxdWVuY3kpCisgICAgICAgIGZyZXF1ZW5jeSA9IHN5c0Nsa1JhdGVHZXQoKTsKKyAgICByZXR1cm4gZnJlcXVlbmN5OworfQorCitiY21vc19lcnJubyBiY21vc190YXNrX2NyZWF0ZShiY21vc190YXNrICp0YXNrLCBjb25zdCBiY21vc190YXNrX3Bhcm0gKnBhcm0pCit7CisgICAgRl9iY21vc190YXNrX2hhbmRsZXIgaGFuZGxlcjsKKyAgICB2b2lkICpkYXRhOworCisgICAgaWYgKCF0YXNrIHx8ICFwYXJtKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAidGFzayAlcCwgcGFybSAlcFxuIiwgKHZvaWQqICl0YXNrLCAodm9pZCogKXBhcm0pOworICAgIG1lbXNldCh0YXNrLCAwLCBzaXplb2YgKCAqdGFzayApKTsKKworICAgIGlmIChwYXJtLT5oYW5kbGVyKQorICAgIHsKKyAgICAgICAgLyogInRyYWRpdGlvbmFsIHRhc2sgKi8KKyAgICAgICAgaGFuZGxlciA9IHBhcm0tPmhhbmRsZXI7CisgICAgICAgIGRhdGEgPSAodm9pZCAqKXBhcm0tPmRhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX2Vycm5vIHJjOworICAgICAgICAvKiAiaW50ZWdyYXRlZCIgdGFzayAqLworICAgICAgICBoYW5kbGVyID0gYmNtb3NfZGZ0X3Rhc2tfaGFuZGxlcjsKKyAgICAgICAgZGF0YSA9IHRhc2s7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBhbmQgbG9jayBtdXRleCB0byB3YWl0IG9uICovCisgICAgICAgIHJjID0gYmNtb3Nfc2VtX2NyZWF0ZSgmdGFzay0+YWN0aXZlX3NlbSwgMCwgdGFzay0+cGFybS5mbGFncywgcGFybS0+bmFtZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJUYXNrICVzOiBjYW4ndCBjcmVhdGUgYWN0aXZlX3NlbS4gRXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBwYXJtLT5uYW1lLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRhc2stPnBhcm0gPSAqcGFybTsKKyAgICAvKiBDb3B5IG5hbWUgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgbm90IHJlbGVhc2VkIC0gaW4gY2FzZSBpdCB3YXMgb24gdGhlIHN0YWNrICovCisgICAgaWYgKHRhc2stPnBhcm0ubmFtZSkKKyAgICB7CisgICAgICAgIHN0cm5jcHkodGFzay0+bmFtZSwgdGFzay0+cGFybS5uYW1lLCBzaXplb2YodGFzay0+bmFtZSkgLSAxKTsKKyAgICAgICAgdGFzay0+cGFybS5uYW1lID0gdGFzay0+bmFtZTsKKyAgICB9CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmdGFzay0+YWN0aXZlX2xvY2ssIDApOworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnRhc2tfbGlzdCwgdGFzaywgbGlzdCk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgdGFzay0+bWFnaWMgPSBCQ01PU19UQVNLX01BR0lDOworICAgIHRhc2stPnN5c190YXNrLnQgPSB0YXNrU3Bhd24oKGNoYXIqKXBhcm0tPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAxMCArIHBhcm0tPnByaW9yaXR5ICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJtLT5zdGFja19zaXplID8gcGFybS0+c3RhY2tfc2l6ZSA6IEJDTU9TX0RFRkFVTFRfU1RBQ0tfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChGVU5DUFRSKWhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgIGlmICh0YXNrLT5zeXNfdGFzay50ID09IEVSUk9SKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfbG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgICAgICBTVEFJTFFfUkVNT1ZFKCZ0YXNrX2xpc3QsIHRhc2ssIGJjbW9zX3Rhc2ssIGxpc3QpOworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICAgICAgdGFzay0+bWFnaWMgPSAwOworICAgICAgICBpZiAoIXBhcm0tPmhhbmRsZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3NlbV9kZXN0cm95KCZ0YXNrLT5hY3RpdmVfc2VtKTsKKyAgICAgICAgfQorICAgICAgICBCQ01PU19UUkFDRV9FUlIoIiglcykgRXJyb3I6IHRhc2tTcGF3biwgZXJybm9HZXQoKT0lZFxuIiwgX19GVU5DVElPTl9fLCBlcnJub0dldCgpKTsKKyAgICAgICAgQlVHKCk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfZGVzdHJveShiY21vc190YXNrICp0YXNrKQoreworICAgIGlmICh0YXNrLT5tYWdpYyAhPSBCQ01PU19UQVNLX01BR0lDKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgdGFzay0+ZGVzdHJveV9yZXF1ZXN0ID0gQkNNT1NfVFJVRTsKKyAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgU1RBSUxRX1JFTU9WRSgmdGFza19saXN0LCB0YXNrLCBiY21vc190YXNrLCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICB0YXNrLT5tYWdpYyA9IEJDTU9TX1RBU0tfTUFHSUNfREVTVFJPWUVEOworICAgIC8qIFRoZSB0YXNrIG1heSBiZSB3YWl0aW5nIG9uIHNlbWFwaG9yZS4gS2ljayBpdCAqLworICAgIGlmICghdGFzay0+cGFybS5oYW5kbGVyKQorICAgIHsKKyAgICAgICAgYmNtb3Nfc2VtX3Bvc3QoJnRhc2stPmFjdGl2ZV9zZW0pOworICAgIH0KKyAgICBpZiAodGFza0RlbGV0ZSh0YXNrLT5zeXNfdGFzay50KSAhPSBPSykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiKCVzKSBFcnJvcjogdGFza0RlbGV0ZSwgZXJybm9HZXQoKT0lZFxuIiwgX19GVU5DVElPTl9fLCBlcnJub0dldCgpKTsKKyAgICAgICAgQlVHKCk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX3Rhc2sgKmJjbW9zX3Rhc2tfY3VycmVudCh2b2lkKQoreworICAgIHVpbnQzMl90IHB0ID0gdGFza0lkU2VsZigpOworICAgIGJjbW9zX3Rhc2sgKnQsICp0bXA7CisKKyAgICBTVEFJTFFfRk9SRUFDSF9TQUZFKHQsICZ0YXNrX2xpc3QsIGxpc3QsIHRtcCkKKyAgICB7CisgICAgICAgIGlmIChwdCA9PSB0LT5zeXNfdGFzay50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0OworfQorCit2b2lkICpiY21vc19hbGxvYyh1aW50MzJfdCBzaXplKQoreworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKK3ZvaWQgYmNtb3NfZnJlZSh2b2lkICpwdHIpCit7CisgICAgZnJlZShwdHIpOworfQorCitpbmxpbmUgc3RhdGljIHZvaWQgYmNtb3Nfc2VtX211dGV4X2Rlc3Ryb3kodWludDMyX3Qgc20pCit7CisgICAgaWYgKHNlbURlbGV0ZSgoU0VNX0lEKXNtKSAhPSBPSykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiKCVzKSBFcnJvcjogc2VtRGVsZXRlLCBlcnJub0dldCgpPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycm5vR2V0KCkpOworICAgICAgICBCVUcoKTsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgYmNtb3NfZXJybm8gYmNtb3Nfc2VtX211dGV4X3dhaXQodWludDMyX3Qgc20sIHVpbnQzMl90IHRpbWVvdXQpCit7CisgICAgaW50IGVycm5vOworICAgIFNUQVRVUyBzdGF0dXM7CisKKyAgICB0aW1lb3V0ID0gKCh0aW1lb3V0ID09IEJDTU9TX1dBSVRfRk9SRVZFUiApPyBXQUlUX0ZPUkVWRVIgOiBCQ01PU19NSUNST1NFQ09ORFNfVE9fVElDS1ModGltZW91dCkpOworICAgIHN0YXR1cyA9IHNlbVRha2UoKFNFTV9JRClzbSwgdGltZW91dCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykKKyAgICB7CisgICAgICAgIGVycm5vID0gZXJybm9HZXQoKTsKKyAgICAgICAgaWYgKGVycm5vID09IFNfb2JqTGliX09CSl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9USU1FT1VUOworICAgICAgICB9CisgICAgICAgIEJVRygpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBiY21vc19zZW1fbXV0ZXhfcG9zdCh1aW50MzJfdCBzbSkKK3sKKyAgICBTVEFUVVMgc3RhdHVzOworCisgICAgc3RhdHVzID0gc2VtR2l2ZSgoU0VNX0lEKXNtKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIoJXMpIEVycm9yOiBzZW1HaXZlLCBzdGF0dXM9JWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAgICAgICAgQlVHKCk7CisgICAgfQorfQorCitiY21vc19lcnJubyBiY21vc19zZW1fY3JlYXRlKGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCBjb3VudCwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgU0VNX0lEIHNlbWFwaG9yZTsKKworICAgIHNlbWFwaG9yZSA9IHNlbUNDcmVhdGUoU0VNX1FfUFJJT1JJVFksIChTRU1fQl9TVEFURSljb3VudCk7CisgICAgaWYgKHNlbWFwaG9yZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIoJXMpIEVycm9yOiBzZW1DQ3JlYXRlLCBlcnJub0dldCgpPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycm5vR2V0KCkpOworICAgICAgICBCVUcoKTsKKyAgICB9CisgICAgc2VtLT5zID0gKHVpbnQzMl90KXNlbWFwaG9yZTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCit2b2lkIGJjbW9zX3NlbV9kZXN0cm95KGJjbW9zX3NlbSAqc2VtKQoreworICAgIGJjbW9zX3NlbV9tdXRleF9kZXN0cm95KHNlbS0+cyk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9zX3NlbV93YWl0KGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCB0aW1lb3V0KQoreworICAgIHJldHVybiBiY21vc19zZW1fbXV0ZXhfd2FpdChzZW0tPnMsIHRpbWVvdXQpOworfQorCit2b2lkIGJjbW9zX3NlbV9wb3N0KGJjbW9zX3NlbSAqc2VtKQoreworICAgIGJjbW9zX3NlbV9tdXRleF9wb3N0KHNlbS0+cyk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9zX211dGV4X2NyZWF0ZShiY21vc19tdXRleCAqbXV0ZXgsIHVpbnQzMl90IGZsYWdzLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIFNFTV9JRCBzZW1hcGhvcmU7CisgICAgaW50IG9wdGlvbnM7CisKKyAgICAvKiBTRU1fSU5WRVJTSU9OX1NBRkU6IEVuYWJsZSAoYnkgZGVmYXVsdCkgdGhlIHByZXZlbnRpb24gb2YgcHJpb3JpdHkgaW52ZXJzaW9uIHByb2JsZW0gKi8KKyAgICBvcHRpb25zID0gU0VNX1FfUFJJT1JJVFkgfCBTRU1fSU5WRVJTSU9OX1NBRkU7CisKKyAgICBzZW1hcGhvcmUgPSBzZW1NQ3JlYXRlKG9wdGlvbnMpOworICAgIGlmIChzZW1hcGhvcmUgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiKCVzKSBFcnJvcjogc2VtQ0NyZWF0ZSwgZXJybm9HZXQoKT0lZFxuIiwgX19GVU5DVElPTl9fLCBlcnJub0dldCgpKTsKKyAgICAgICAgQlVHKCk7CisgICAgfQorCisgICAgbXV0ZXgtPm0gPSAodWludDMyX3Qpc2VtYXBob3JlOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtb3NfbXV0ZXhfZGVzdHJveShiY21vc19tdXRleCAqbXV0ZXgpCit7CisgICAgYmNtb3Nfc2VtX211dGV4X2Rlc3Ryb3kobXV0ZXgtPm0pOworfQorCit2b2lkIGJjbW9zX211dGV4X2xvY2soYmNtb3NfbXV0ZXggKm11dGV4KQoreworICAgIGJjbW9zX3NlbV9tdXRleF93YWl0KG11dGV4LT5tLCBCQ01PU19XQUlUX0ZPUkVWRVIpOworfQorCit2b2lkIGJjbW9zX211dGV4X3VubG9jayhiY21vc19tdXRleCAqbXV0ZXgpCit7CisgICAgYmNtb3Nfc2VtX211dGV4X3Bvc3QobXV0ZXgtPm0pOworfQorCit2b2lkIGJjbW9zX2Zhc3Rsb2NrX2luaXQoYmNtb3NfZmFzdGxvY2sgKmxvY2ssIHVpbnQzMl90IGZsYWdzKQoreworfQorCitsb25nIGJjbW9zX2Zhc3Rsb2NrX2xvY2soYmNtb3NfZmFzdGxvY2sgKmxvY2spCit7CisgICAgcmV0dXJuIChsb25nKWludExvY2soKTsKK30KKwordm9pZCBiY21vc19mYXN0bG9ja191bmxvY2soYmNtb3NfZmFzdGxvY2sgKmxvY2ssIGxvbmcgZmxhZ3MpCit7CisgICAgaW50VW5sb2NrKGZsYWdzKTsKK30KKworYmNtb3NfZXJybm8gYmNtb3Nfc3lzX3RpbWVyX2NyZWF0ZShiY21vc19zeXNfdGltZXIgKnRpbWVyLCBiY21vc19zeXNfdGltZXJfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKQoreworICAgIFdET0dfSUQgd2F0Y2hkb2c7CisKKyAgICBpZiAoIXRpbWVyIHx8ICFoYW5kbGVyKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAidGltZXIgJXAsIGhhbmRsZXIgJXBcbiIsIHRpbWVyLCBoYW5kbGVyKTsKKworICAgIC8qIENhbGwgdGhlIHVuZGVybHlpbmcgT1MgKi8KKyAgICB3YXRjaGRvZyA9IHdkQ3JlYXRlKCk7CisgICAgaWYgKHdhdGNoZG9nID09IE5VTEwpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1NZU0NBTExfRVJSLCAiZXJybm8gJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKyAgICB0aW1lci0+dCA9ICh1aW50MzJfdCl3YXRjaGRvZzsKKyAgICB0aW1lci0+aGFuZGxlciA9IGhhbmRsZXI7CisgICAgdGltZXItPmRhdGEgPSBkYXRhOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtb3Nfc3lzX3RpbWVyX2Rlc3Ryb3koYmNtb3Nfc3lzX3RpbWVyICp0aW1lcikKK3sKKyAgICBTVEFUVVMgc3RhdHVzOworICAgIHN0YXR1cyA9IHdkRGVsZXRlKChXRE9HX0lEKXRpbWVyLT50KTsKKyAgICBCQ01PU19UUkFDRV9ERUJVRygid2REZWxldGU6IHN0YXR1cz0lZFxuIiwgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgX2JjbW9zX3RpbWVfaGFuZGxlcl93cmFwcGVyKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19zeXNfdGltZXIgKiB0aW1lciA9IChiY21vc19zeXNfdGltZXIqKWRhdGEgOworICAgIHRpbWVyLT5oYW5kbGVyKHRpbWVyLT5kYXRhKTsKK30KKwordm9pZCBiY21vc19zeXNfdGltZXJfc3RhcnQoYmNtb3Nfc3lzX3RpbWVyICp0aW1lciwgdWludDMyX3QgZGVsYXkpCit7CisgICAgU1RBVFVTIHN0YXR1czsKKyAgICBzdGF0dXMgPSB3ZFN0YXJ0KChXRE9HX0lEKXRpbWVyLT50LCBCQ01PU19NSUNST1NFQ09ORFNfVE9fVElDS1MoZGVsYXkpLCAoRlVOQ1BUUilfYmNtb3NfdGltZV9oYW5kbGVyX3dyYXBwZXIsIChsb25nKXRpbWVyKTsKKyAgICBpZiAoc3RhdHVzID09IEVSUk9SKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJ3ZFN0YXJ0IHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgQlVHKCk7CisgICAgfQorfQorCit2b2lkIGJjbW9zX3N5c190aW1lcl9zdG9wKGJjbW9zX3N5c190aW1lciAqdGltZXIpCit7CisgICAgU1RBVFVTIHN0YXR1czsKKyAgICBzdGF0dXMgPSB3ZENhbmNlbCgoV0RPR19JRCl0aW1lci0+dCk7CisgICAgaWYgKHN0YXR1cyA9PSBFUlJPUikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigid2RDYW5jZWwgc3RhdHVzPSVkXG4iLCBzdGF0dXMpOworICAgICAgICBCVUcoKTsKKyAgICB9Cit9CisKK3ZvaWQgYmNtb3NfdXNsZWVwKHVpbnQzMl90IHVzKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKworICAgIHRzLnR2X3NlYyA9IHVzIC8gMTAwMDAwMDsKKyAgICB0cy50dl9uc2VjID0gKCB1cyAlIDEwMDAwMDAgKSAqIDEwMDA7CisKKyAgICBuYW5vc2xlZXAoJnRzLCAwKTsKK30KKwordWludDMyX3QgYmNtb3NfdGltZXN0YW1wKHZvaWQpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7CisgICAgcmV0dXJuICh0cy50dl9zZWMgKiAxMDAwMDAwICsgdHMudHZfbnNlYyAvIDEwMDApOworfQorCisvKiogR2V0IGN1cnJlbnQgdGltZXN0YW1wIC0gNjQgYml0CisgKiBccmV0dXJucyB0aGUgY3VycmVudCBzeXN0ZW0gdGltZXN0YW1wICh1cykKKyAqLwordWludDY0X3QgYmNtb3NfdGltZXN0YW1wNjQodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKKyAgICByZXR1cm4gKCh1aW50NjRfdCl0cy50dl9zZWMgKiAxMDAwMDAwTEwgKyAodWludDY0X3QpdHMudHZfbnNlYyAvIDEwMDBMTCk7Cit9CisKKy8qCisgKiBCeXRlIG1lbW9yeSBwb29sCisgKi8KKworLyogTWVtb3J5IGJsb2NrIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfYnl0ZV9tZW1ibGsKK3sKKyAgICBiY21vc19ieXRlX3Bvb2wgKnBvb2w7ICAgICAgLyoqIHBvb2wgdGhhdCBvd25zIHRoZSBibG9jayAqLworICAgIHVpbnQzMl90IHNpemU7ICAgICAgICAgICAgICAvKiogYmxvY2sgc2l6ZSAoYnl0ZXMpIGluY2x1ZGluZyBiY21vc19ieXRlX21lbWJsayBoZWFkZXIgKi8KKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICB1aW50MzJfdCBtYWdpYzsgICAgICAgICAgICAgLyoqIG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBCQ01PU19NRU1fTUFHSUNfQUxMT0MgICAoKCdtJzw8MjQpIHwgKCdiJyA8PCAxNikgfCAoJ2wnIDw8IDgpIHwgJ2snKQorI2RlZmluZSBCQ01PU19NRU1fTUFHSUNfRlJFRSAgICAoKCdtJzw8MjQpIHwgKCdiJyA8PCAxNikgfCAoJ2wnIDw8IDgpIHwgJ34nKQorI2VuZGlmCit9IGJjbW9zX2J5dGVfbWVtYmxrOworCisvKiBDcmVhdGUgYnl0ZSBtZW1vcnkgcG9vbCAqLworYmNtb3NfZXJybm8gYmNtb3NfYnl0ZV9wb29sX2NyZWF0ZShiY21vc19ieXRlX3Bvb2wgKnBvb2wsIGNvbnN0IGJjbW9zX2J5dGVfcG9vbF9wYXJtICpwYXJtKQoreworICAgIGlmICghcG9vbCB8fCAhcGFybSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJwb29sICVwLCBwYXJtICVwXG4iLCBwb29sLCBwYXJtKTsKKyAgICB9CisKKyAgICBCQ01fTUVNWkVST19TVFJVQ1QocG9vbCk7CisgICAgcG9vbC0+cGFybSA9ICpwYXJtOworICAgIGlmICghcG9vbC0+cGFybS5zaXplKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInNpemUgJXVcbiIsIHBhcm0tPnNpemUpOworICAgIH0KKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBwb29sLT5tYWdpYyA9IEJDTU9TX0JZVEVfUE9PTF9WQUxJRDsKKyNlbmRpZgorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IG1lbW9yeSBwb29sICovCitiY21vc19lcnJubyBiY21vc19ieXRlX3Bvb2xfZGVzdHJveShiY21vc19ieXRlX3Bvb2wgKnBvb2wpCit7CisgICAgaWYgKHBvb2wtPmFsbG9jYXRlZCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1NUQVRFLCAiJXUgYnl0ZXMgb2YgbWVtb3J5IGFyZSBzdGlsbCBhbGxvY2F0ZWQgZnJvbSB0aGUgcG9vbCAlc1xuIiwKKyAgICAgICAgICAgIHBvb2wtPmFsbG9jYXRlZCwgcG9vbC0+cGFybS5uYW1lKTsKKyAgICB9CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgcG9vbC0+bWFnaWMgPSBCQ01PU19CWVRFX1BPT0xfREVMRVRFRDsKKyNlbmRpZgorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBBbGxvY2F0ZSBtZW1vcnkgZnJvbSBtZW1vcnkgcG9vbCAqLwordm9pZCAqYmNtb3NfYnl0ZV9wb29sX2FsbG9jKGJjbW9zX2J5dGVfcG9vbCAqcG9vbCwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBiY21vc19ieXRlX21lbWJsayAqYmxrOworICAgIHVpbnQzMl90IGJ5dGVfc2l6ZTsKKyAgICB2b2lkICpwdHI7CisKKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBCVUdfT04ocG9vbC0+bWFnaWMgIT0gQkNNT1NfQllURV9QT09MX1ZBTElEKTsKKyNlbmRpZgorCisgICAgaWYgKHNpemUgKyBwb29sLT5hbGxvY2F0ZWQgPiBwb29sLT5wYXJtLnNpemUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYnl0ZV9zaXplID0gc2l6ZSArIHNpemVvZihiY21vc19ieXRlX21lbWJsayk7CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgYnl0ZV9zaXplICs9IHNpemVvZih1aW50MzJfdCk7IC8qIGJsb2NrIHN1ZmZpeCAqLworI2VuZGlmCisgICAgLyogVG9EbzogTWFpbnRhaW4gTEwgb2YgYWxsb2NhdGVkIGJsb2NrcyAqLworICAgIGJsayA9IChiY21vc19ieXRlX21lbWJsayAqKW1hbGxvYyhieXRlX3NpemUpOworICAgIGlmICghYmxrKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSAodm9pZCAqKShibGsgKyAxKTsKKyAgICBibGstPnNpemUgPSBieXRlX3NpemU7CisgICAgcG9vbC0+YWxsb2NhdGVkICs9IGJ5dGVfc2l6ZTsKKyAgICBibGstPnBvb2wgPSBwb29sOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIGJsay0+bWFnaWMgPSBCQ01PU19NRU1fTUFHSUNfQUxMT0M7CisgICAgKih1aW50MzJfdCAqKSgobG9uZylibGsgKyBieXRlX3NpemUgLSBzaXplb2YodWludDMyX3QpKSA9IEJDTU9TX01FTV9NQUdJQ19BTExPQzsKKyNlbmRpZgorCisgICAgcmV0dXJuIHB0cjsKK30KKworLyogUmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIHVzaW5nIGJjbW9zX2J5dGVfcG9vbF9hbGxvYygpICovCit2b2lkIGJjbW9zX2J5dGVfcG9vbF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgICBiY21vc19ieXRlX21lbWJsayAqYmxrOworICAgIGJjbW9zX2J5dGVfcG9vbCAqcG9vbDsKKworICAgIEJVR19PTighcHRyKTsKKyAgICBibGsgPSAoYmNtb3NfYnl0ZV9tZW1ibGsgKikoKGxvbmcpcHRyIC0gc2l6ZW9mKGJjbW9zX2J5dGVfbWVtYmxrKSk7CisgICAgcG9vbCA9IGJsay0+cG9vbDsKKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBCVUdfT04ocG9vbC0+bWFnaWMgIT0gQkNNT1NfQllURV9QT09MX1ZBTElEKTsKKyAgICBCVUdfT04oYmxrLT5tYWdpYyAhPSBCQ01PU19NRU1fTUFHSUNfQUxMT0MpOworICAgIEJVR19PTigqKHVpbnQzMl90ICopKChsb25nKWJsayArIGJsay0+c2l6ZSAtIHNpemVvZih1aW50MzJfdCkpICE9IEJDTU9TX01FTV9NQUdJQ19BTExPQyk7CisgICAgYmxrLT5tYWdpYyA9IEJDTU9TX01FTV9NQUdJQ19GUkVFOworI2VuZGlmCisgICAgcG9vbC0+YWxsb2NhdGVkIC09IGJsay0+c2l6ZTsKKyAgICBmcmVlKGJsayk7Cit9CisKK3ZvaWQgX2JjbW9zX2JhY2t0cmFjZSh2b2lkKQoreworICAgIC8qdG9kbyBpbXBsZW1lbnQgdGhpcyovCit9CisKK2ludCBmZnNsbChsb25nIGxvbmcgaW50IGkpCit7CisgICAgaW50IGwgPSBmZnMoaSAmIDB4RkZGRkZGRkYpOworICAgIGludCBoID0gZmZzKChpID4+IDMyKSAmIDB4RkZGRkZGRkYpOworCisgICAgaWYgKGwpCisgICAgICAgIHJldHVybiBsOworCisgICAgaWYgKGgpCisgICAgICAgIHJldHVybiBoICsgMzI7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogc3R1YiBmb3IgaW50IGVuYWJsZSAqLwordm9pZCBiY21vc19pbnRfZW5hYmxlKGludCBpcnEpCit7Cit9CisKK3R5cGVkZWYgc3RydWN0IGJjbW9zX2ludF9kYXRhCit7CisgICBpbnQgKCppc3IpKGludCBpcnEsIHZvaWQgKnByaXYpOworICAgaW50IGlycTsKKyAgIHZvaWQgKnByaXY7Cit9IGJjbW9zX2ludF9kYXRhOworCitzdGF0aWMgdm9pZCBfYmNtb3NfaW50X2hhbmRsZXIobG9uZyBwcml2KQoreworICAgICBiY21vc19pbnRfZGF0YSAqZGF0YSA9IChiY21vc19pbnRfZGF0YSAqKXByaXY7CisgICAgIGRhdGEtPmlzcihkYXRhLT5pcnEsIGRhdGEtPnByaXYpOworfQorCitpbnQgYmNtb3NfaW50X2Nvbm5lY3QoaW50IGlycSwgaW50IGNwdSwgaW50IGZsYWdzLCBpbnQgKCppc3IpKGludCBpcnEsIHZvaWQgKnByaXYpLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwcml2KQoreworICAgYmNtb3NfaW50X2RhdGEgKmRhdGEgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbW9zX2ludF9kYXRhKSk7CisgICBpZiAoIWRhdGEpCisgICAgICByZXR1cm4gKGludClCQ01fRVJSX05PTUVNOworICAgZGF0YS0+aXNyID0gaXNyOworICAgZGF0YS0+aXJxID0gaXJxOworICAgZGF0YS0+cHJpdiA9IHByaXY7CisgICByZXR1cm4gcGNpSW50Q29ubmVjdChJTlVNX1RPX0lWRUMoaXJxKSwgX2JjbW9zX2ludF9oYW5kbGVyLCAobG9uZylkYXRhKTsKK30KKworLyogRGlzY29ubmVjdCBzeXN0ZW0gaW50ZXJydXB0ICovCit2b2lkIGJjbW9zX2ludF9kaXNjb25uZWN0KGludCBpcnEsIHZvaWQgKnByaXYpCit7CisgICAgcGNpSW50RGlzY29ubmVjdChJTlVNX1RPX0lWRUMoaXJxKSwgX2JjbW9zX2ludF9oYW5kbGVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGVjayBpbi1pcnEgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJlbGF0ZWQgaGVhZGVyIGZpbGU6ICJpbnRMaWIuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1baW5dICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtvdXRdICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJldHVybiAgICAgIEJDTU9TX1RSVUUgICgxKSAtIGluIGludGVycnVwdCBjb250ZXh0OyAgICAgICAgKgorICogICAgICAgICAgICAgQkNNT1NfRkFMU0UgKDApIC0gaW4gdGFzayBjb250ZXh0OyAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2JjbW9zX2Jvb2wgaXNfaXJxX21vZGUodm9pZCkKK3sKKyAgICByZXR1cm4gaW50Q29udGV4dCgpOworfQorCisvLyBmcm9tIGJzcAorZXh0ZXJuIGludCBpc0ludERpc2FibGVkKCk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrIGlmIGludGVycnVwdHMgYXJlIGRpc2FibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmVsYXRlZCBoZWFkZXIgZmlsZTogIm1pcHNpbmMuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW291dF0gIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuICAgICAgQkNNT1NfVFJVRSAoMSkgLSAgR2xvYWwgaW50ZXJydXB0IGRpc2FibGUgICAgICAqCisgICAgICAgICAgICAgICBCQ01PU19GQUxTRSAoMCkgLSBHbG9hbCBpbnRlcnJ1cHQgZW5hYmxlOyAgICAgICoKKyAqIGNvbW1lbnQgICAgIGlmIEJTUCB0ZWFtIGNhbiBwcm92aWRlIHNpbWlsYXIgZnVuY3Rpb24sICAgICAgKgorICAgICAgICAgICAgICAgd2Ugd2lsbCBjYWxsIGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBBbm90aGVyIG9wdGlvbiBpcyBzaGFyZSB0aGlzIG1hY3JvIHVzZWQgb24gc3dpdGNoIHByb2R1Y3QgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBpc19pcnFfZGlzYWJsZWQodm9pZCkKK3sKKyAgICByZXR1cm4gaXNJbnREaXNhYmxlZCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdyaXRlIGJhcnJpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmVsYXRlZCBoZWFkZXIgZmlsZTogbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW291dF0gIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBjb21tZW50OnVzZSAic3luYyIgYmFzZSBvbiBNSVBTIChHTlUgc3R5bGUpICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGJjbW9zX2JhcnJpZXIodm9pZCkKK3sKKyAjaWYgZGVmaW5lZChIT1NUX0NQVV9JU19NSVBTKSB8fCBkZWZpbmVkKEhPU1RfQ1BVX0lTX1BQQykKKyAgICB7X19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTt9CisgI2Vsc2UKKyAgICNlcnJvciBIT1NUIENQVSBNVVNUIEJFIE1JUFMgT1IgUE9XRVJQQworICNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFsbG9jYXRlIERNQS1hYmxlIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmVsYXRlZCBoZWFkZXIgZmlsZTptZW1QYXJ0TGliLmggICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBkZXZpY2UgIERldmljZSBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW2luXSAgIHNpemUgICAgQmxvY2sgc2l6ZSAoYnl0ZXMpICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1bb3V0XSAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiByZXR1cm5zICAgIG1lbW9yeSBibG9jayBwb2ludGVyKHVuY2FjaGVkIG1lbW9yeSkgb3IgTlVMTCAgICoKKyAqIGNvbW1lbnQ6ICAgQlNQIG5lZWQgdG8gYWxsb2NhdGUgdW5jYWNoZWQgbWVtb3J5IHBvb2wgZmlyc3QgKgorICogaWYgQlNQIHRlYW0gY2FuIHByb3ZpZGUgc3VjaCBmdW5jdGlvbixjYWxsIGl0IGRpcmVjdGx5OyAgICAqCisgKiBzdWdnZXN0aW9uOiBtZW1QYXJ0Q3JlYXRlKCljcmVhdGUgdW5jYWNoZWQgbWVtb3J5IGFuZCAgICAgICoKKyAqIHJldHVybiBtZW1vcnkgSUQ6dW5jYWNoZVBvb2xNZW1QYXJ0SWQgICAgICAgICAgICAgICAgICAgICAgKgorICogbWVtUGFydEFsbG9jKCkvbWVtUGFydEZyZWUoKTphbGxvY2F0ZS9mcmVlIG1lbW9yeSB2aWEgICAgICAqCisgKiBtZW1vcnkgSUQ6dW5jYWNoZVBvb2xNZW1QYXJ0SWQgYW5kIHNpemUgICAgICAgICAgICAgICAgICAgICoKKyAqIGlmIEJTUCBjYW4gZ3VyYW50ZWUgdGhlIE1lbW9yeSBhbGxvY2F0ZWQgYnkgY2FjaGVEbWFNYWxsb2MgKgorICogY2FjaGVEbWFGcmVlKCkgaXMgbm9uY2FjaGVkIG1lbW9yeSx3ZSBjYW4gY2FsbCB0aGVtIGRpcmVjdGx5KgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgKmJjbW9zX2RtYV9hbGxvYyh1aW50OF90IGRldmljZSwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICB2b2lkICogcEJ1ZmZlcjsKKyNpZmRlZiBOT05fQ0FDSEVEX01FTU9SWV9DUkVBVEVEX0JZX0NBQ0hFRE1BTUFMTE9DCisgICAgcEJ1ZmZlciA9IGNhY2hlRG1hTWFsbG9jKHNpemUpOworICAgIHJldHVybiAocEJ1ZmZlcik7CisjZWxzZQorICAgIHBCdWZmZXIgPSAodm9pZCAqKW1lbVBhcnRBbGxvYyh1bmNhY2hlUG9vbE1lbVBhcnRJZCwgc2l6ZSkpOworICAgIHJldHVybiAocEJ1ZmZlcik7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWxlYXNlIERNQS1hYmxlIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJlbGF0ZWQgaGVhZGVyIGZpbGU6IG1lbVBhcnRMaWIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1baW5dICAgZGV2aWNlICBEZXZpY2UgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBwdHIgICAgIEJsb2NrIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW291dF0gIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBjb21tZW50OiBzZWUgYWJvdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vc19kbWFfZnJlZSh1aW50OF90IGRldmljZSwgdm9pZCAqcHRyKQoreworI2lmZGVmIE5PTl9DQUNIRURfTUVNT1JZX0NSRUFURURfQllfQ0FDSEVETUFNQUxMT0MKKyAgICBjYWNoZURtYUZyZWUoKHZvaWQgKikocHRyKSk7CisjZWxzZQorICAgIG1lbVBhcnRGcmVlKHVuY2FjaGVQb29sTWVtUGFydElkLHB0cik7CisjZW5kaWYKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29udmVydCB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcyAgICAgICAgICAgICAgICAqCisgKiByZWxhdGVkIGhlYWRlciBmaWxlOmZvciBNSVBTIENQVQlhcmNoTWlwcy5oICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW2luXSAgIHZhICAgIFZpcnR1YWwgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuIC0gcGh5c2ljYWwgYWRkcmVzcyB2YSBpcyBtYXBwZWQgdG8gICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGxvbmcgYmNtb3NfdmlydF90b19waHlzKHZvaWQgKnZhKQoreworI2lmZGVmIEhPU1RfQ1BVX0lTX01JUFMKKyAgcmV0dXJuICh1bnNpZ25lZCBsb25nKShLMF9UT19QSFlTKHZhKSk7CisKKyNlbHNlCisJLyogdGhpcyBpcyBhbiBqdXN0IGFuIGV4YW1wbGUsCisJaWYgeW91IGFyZSBub3Qgd29ya2luZyB3aXRoIG1pcHMgbWFrZSBzdXJlIHlvdSBkZWZpbmUgdGhlIGNvcnJlY3QgbWFwcGluZyBmb3IgeW91ciBzeXN0ZW0gKi8KKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpKHZhKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludmFsaWRhdGUgYWRkcmVzcyBhcmVhIGluIGRhdGEgY2FjaGUuICAgICAgICAgICAgICAgICAgICAgKgorICogcmVsYXRlZCBoZWFkZXIgZmlsZTogIGNhY2hlTGliLmggICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBzdGFydCAgIEFkZHJlc3MgYXJlYSBzdGFydCAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW2luXSAgIHNpemUgICAgQWRkcmVzcyBhcmVhIHNpemUgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9zX2RjYWNoZV9pbnYodm9pZCAqc3RhcnQsIHVpbnQzMl90IHNpemUpCit7CisgICAgY2FjaGVJbnZhbGlkYXRlKERBVEFfQ0FDSEUsc3RhcnQsIHNpemUpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGbHVzaCBhZGRyZXNzIGFyZWEgaW4gZGF0YSBjYWNoZS4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJlbGF0ZWQgaGVhZGVyIGZpbGU6ICBjYWNoZUxpYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1baW5dICAgc3RhcnQgICBBZGRyZXNzIGFyZWEgc3RhcnQgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBzaXplICAgIEFkZHJlc3MgYXJlYSBzaXplICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJldHVybiAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9zX2RjYWNoZV9mbHVzaCh2b2lkICpzdGFydCwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBjYWNoZUZsdXNoKERBVEFfQ0FDSEUsc3RhcnQsIHNpemUpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3cml0ZSB2YWx1ZSB0byBQQ0kgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJlbGF0ZWQgaGVhZGVyIGZpbGU6IGJjbW9zX2NvbW1vbjIuaCAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1baW5dICAgYWRkcmVzcyAgcG9pbnRlciB0byBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICB2YWx1ZSAgICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJldHVybiAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29tbWVudCByZS11c2UgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTMyIHdoaWNoIGlzIGZyb20qCisgKiBiY21vc19jb21tb24yLmgsYnkgdGhpcyBtYWNybyxjYW4gc3VwcG9ydCBib3RoIGJpZyBlbmRpYW4gICoKKyAqIGhvc3QgYW5kIGxpdHRsZSBlbmRpYW4gaG9zdC5tb3ZlIFBDSSBhY2Nlc3MgZnVuY3Rpb25zIGFmdGVyKgorICogYmNtb3NfY29tbW9uMi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbV9wY2lfd3JpdGUzMih2b2xhdGlsZSB1aW50MzJfdCAqYWRkcmVzcywgdWludDMyX3QgdmFsdWUpCit7CisjaWZkZWYgSE9TVF9QQ0lFX1NXQVBfTkVFREVECisgICAgdmFsdWUgPSBCQ01PU19FTkRJQU5fQ1BVX1RPX0xJVFRMRV9VMzIodmFsdWUpOworI2VuZGlmCisgICAgKmFkZHJlc3MgPSB2YWx1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZWFkIHZhbHVlIHRvIFBDSSBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJlbGF0ZWQgaGVhZGVyIGZpbGU6IGJjbW9zX2NvbW1vbjIuaCAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1baW5dICAgYWRkcmVzcyAgcG9pbnRlciB0byBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAqCisgKiByZXR1cm4gIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvbW1lbnQgc2VlIGFib3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21fcGNpX3JlYWQzMihjb25zdCB2b2xhdGlsZSB1aW50MzJfdCAqYWRkcmVzcykKK3sKKyAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICB2YWx1ZSA9ICphZGRyZXNzOworI2lmZGVmIEhPU1RfUENJRV9TV0FQX05FRURFRAorICAgIHZhbHVlID0gQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKHZhbHVlKTsKKyNlbmRpZgorICAgIHJldHVybiB2YWx1ZTsKKworfQorCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vdnh3b3JrczU1L2JjbW9zX3N5c3RlbS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi92eHdvcmtzNTUvYmNtb3Nfc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzM2UyOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vdnh3b3JrczU1L2JjbW9zX3N5c3RlbS5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtb3Nfc3lzdGVtLmgKKyAqIE1hcGxlIFN5c3RlbSBTZXJ2aWNlcworICogdnhXb3JrcyA1LjUgcG9ydAorICovCisKKyNpZm5kZWYgQkNNT1NfU1lTVEVNX0hfCisjZGVmaW5lIEJDTU9TX1NZU1RFTV9IXworCisjZGVmaW5lIEJDTU9TX0lSUV9TSU5HTEUgICAgMAorI2RlZmluZSBCQ01PU19JUlFfU0hBUkVEICAgIDEKKworI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzb2NrTGliLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworLyogUmUtZGVmaW5lIEdOVSB0eXBlb2YgYXMgSVNPIF9fdHlwZW9mX18gKi8KKyNkZWZpbmUgdHlwZW9mIF9fdHlwZW9mX18KKworLyogU3BlY2lmeSBoZXJlIHdoaWNoIHN5c3RlbSBmdW5jdGlvbnMgYXJlIGlubGluZWQgKi8KKworLyogI2RlZmluZSBCQ01PU19GQVNUTE9DS19JTkxJTkUgKi8KKy8qICNkZWZpbmUgQkNNT1NfU0VNX1dBSVRfSU5MSU5FICovCisvKiAjZGVmaW5lIEJDTU9TX1NFTV9QT1NUX0lOTElORSAqLworLyogI2RlZmluZSBCQ01PU19VU0xFRVBfSU5MSU5FICovCisjZGVmaW5lIEJDTU9TX1RSQUNFX1BSSU5URgorI2RlZmluZSBCQ01PU19CWVRFX1BPT0xfQUxMT0NfRlJFRV9JTkxJTkUKKy8qICNkZWZpbmUgQkNNT1NfTUFMTE9DX0ZSRUVfSU5MSU5FICovCisvKiAjZGVmaW5lIEJDTU9TX0NBTExPQ19JTkxJTkUgKi8KKy8qIGlmIEhvc3QgY3B1IGlzIE1JUFMgY3B1LGVuYWJsZSB0aGlzIG1hY3JvICovCisvKiBIb3N0IGNwdSB0eXBlIHdpbGwgYmUgZGV0ZXJtaW5lZCBkdXJpbmcgY29tcGlsZSovCisvLyNkZWZpbmUgSE9TVF9DUFVfSVNfTUlQUworLy8jZGVmaW5lIEhPU1RfQ1BVX0lTX1BQQworLyppZiB0aGUgTWVtb3J5IGFsbG9jYXRlZCBieSBjYWNoZURtYU1hbGxvYy9hY2hlRG1hRnJlZSgpIGlzIG5vbi1jYWNoZWQgbWVtb3J5LGVuYWJsZSB0aGlzIG1hY3JvKi8KKyNkZWZpbmUgTk9OX0NBQ0hFRF9NRU1PUllfQ1JFQVRFRF9CWV9DQUNIRURNQU1BTExPQworLyogVW5jb21tZW50dGhlIGZvbGxvd2luZyBsaW5lIGlmIGgvdyBzdXBwb3J0cyBETUEgY2FjaGUgY29oZXJlbmN5ICovCisvKiAjZGVmaW5lIEJDTU9TX0RNQV9DQUNIRV9DT0hFUkVOQ1kgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2ludF9kaXNhYmxlKGludCBpcnEpCit7fQorCit2b2lkIF9iY21vc19iYWNrdHJhY2Uodm9pZCk7CisKKyNkZWZpbmUgQlVHX09OKF9mKSAgICAgIGRvIHsgaWYgKF9mKSB7IF9iY21vc19iYWNrdHJhY2UoKTsgfSB9IHdoaWxlICgwKQorI2RlZmluZSBCVUcoKSAgICAgICAgICAgQlVHX09OKDEpCisjZGVmaW5lIEJVR19VTkxFU1MoX2YpICBCVUdfT04oIShfZikpCisKKy8qKiBCb29sZWFuICovCisjZGVmaW5lIEJDTU9TX0JPT0xFQU4KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9TX0ZBTFNFID0gMCwKKyAgICBCQ01PU19UUlVFICA9IDEsCit9IGJjbW9zX2Jvb2w7CisKKyNpbmNsdWRlICJiY21vc19jb21tb24uaCIKKworI2RlZmluZSBmZnMobikgZmZzTHNiKG4pCisKKy8qKiBTZW1hcGhvcmUgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX3NlbQoreworICAgIHVpbnQzMl90IHM7Cit9OworCisKKy8qKiBNdXRleCBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfbXV0ZXgKK3sKKyAgICB1aW50MzJfdCBtOworfTsKKworLyoqIEZhc3QgbG9jayBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfZmFzdGxvY2sKK3sKKyAgICB1aW50MzJfdCBsOworfTsKKworLyoqIEZhc3Rsb2NrIGluaXRpYWxpemVyLiBDYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGNhbGxpbmcgYmNtb3NfZmFzdGxvY2tfaW5pdCgpICovCisjZGVmaW5lIEJDTU9TX0ZBU1RMT0NLX0lOSVRJQUxJWkVSICAgICAgeyAwIH0KKworLyoqIE9TLXNwZWNpZmljIHRhc2sgY29udHJvbCBibG9jayBleHRlbnNpb24gKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX3N5c190YXNrCit7CisgICAgdWludDMyX3QgdDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB2eFdvcmtzIHRhc2sgSUQgKi8KK30gYmNtb3Nfc3lzX3Rhc2s7CisKKworLyoqIFN5c3RlbSB0aW1lciAqLworc3RydWN0IGJjbW9zX3N5c190aW1lcgoreworICAgIHVpbnQzMl90IHQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVnhXIHRpbWVyICovCisgICAgYmNtb3Nfc3lzX3RpbWVyX2hhbmRsZXIgaGFuZGxlcjsgICAgLyoqPCBUaW1lciBoYW5kbGVyICovCisgICAgdm9pZCAqZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQYXJhbWV0ZXIgdG8gYmUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyICovCit9OworCisvKiogQnl0ZSBtZW1vcnkgcG9vbCBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfYnl0ZV9wb29sCit7CisgICAgYmNtb3NfYnl0ZV9wb29sX3Bhcm0gcGFybTsgIC8qKjwgUG9vbCBwYXJhbWV0ZXJzICovCisgICAgdWludDMyX3QgYWxsb2NhdGVkOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCAqLworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAvKio8IG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBCQ01PU19CWVRFX1BPT0xfVkFMSUQgICAgICAgICAgICgoJ2InPDwyNCkgfCAoJ3knIDw8IDE2KSB8ICgncCcgPDwgOCkgfCAnbycpCisjZGVmaW5lIEJDTU9TX0JZVEVfUE9PTF9ERUxFVEVEICAgICAgICAgKCgnYic8PDI0KSB8ICgneScgPDwgMTYpIHwgKCdwJyA8PCA4KSB8ICd+JykKKyNlbmRpZgorfTsKKworI2RlZmluZSBiY21vc19zeXNfdnByaW50ZihmbXQsIGFyZ3MpICAgICAgICB2cHJpbnRmKGZtdCwgYXJncykKKworI2RlZmluZSBFWFBPUlRfU1lNQk9MKF9zeW0pCisKKy8qIDJuZCBwYXJ0IG9mIE9TLWluZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLworI2luY2x1ZGUgImJjbW9zX2NvbW1vbjIuaCIKKwordm9pZCBiY21fcGNpX3dyaXRlMzIodm9sYXRpbGUgdWludDMyX3QgKmFkZHJlc3MsIHVpbnQzMl90IHZhbHVlKTsKK3VpbnQzMl90IGJjbV9wY2lfcmVhZDMyKGNvbnN0IHZvbGF0aWxlIHVpbnQzMl90ICphZGRyZXNzKTsKKworCisvKnRvZG8gbXVzdCBjaGVjayB2YWxpZGl0eSB0aGF0IHRoZSBzdHJpbmcgaXMgbnVtZXJpYywgc3NjYW5mIGNhbm5vdCBkZXRlY3QgZXJyb3JzLAorICogaWYgbm90IHZhbGlkLCBwdXQgKCp0YWlscHRyKSBpbiB0aGUgZmlyc3Qgbm9uIHZhbGlkIGNoYXIgaW4gc3RyaW5nLAorIGlmIHZhbGlkLCBwb2ludCB0YWlscHRyIGluIHRoZSBsYXN0IGNoYXIgaW4gc3RyaW5nICgqdGFpbHB0cj1zdHJpbmcrc3RybGVuKHN0cmluZykpKi8KKyNkZWZpbmUgc3RydG91bGwoc3RyaW5nLHRhaWxwdHIsYmFzZSkgICAoe1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCBfX2E7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHRhaWxwdHIpPShjaGFyKikoKHN0cmluZykrc3RybGVuKHN0cmluZykpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mKHN0cmluZywgYmFzZSA9PSAxMCA/ICIlbGx1IiA6ICIlbGx4IiwgJl9fYSApO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorI2RlZmluZSBzdHJ0b2xsKHN0cmluZyx0YWlscHRyLGJhc2UpICAgICh7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxvbmcgaW50IF9fYTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodGFpbHB0cik9KGNoYXIqKSgoc3RyaW5nKStzdHJsZW4oc3RyaW5nKSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYoc3RyaW5nLCIlbGxkIiwgJl9fYSApO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorCisjZGVmaW5lIHNucHJpbnRmKHMxLG4sczIsYXJncy4uLikgICAgICBzcHJpbnRmKHMxLCBzMiwjIyBhcmdzKQorI2RlZmluZSB2c25wcmludGYoczEsbixzMixhcmdzLi4uKSAgICAgdnNwcmludGYoczEsIHMyLCMjIGFyZ3MpCisKKworaW50IGZmc0xzYiAoVUlOVDMyIGkpOworaW50IGZmc2xsKGxvbmcgbG9uZyBpbnQgaSk7CisKKworI2VuZGlmIC8qIEJDTU9TX1NZU1RFTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9wY2llL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9wY2llL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMzOGQzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3BjaWUvTWFrZWZpbGUKQEAgLTAsMCArMSwyNCBAQAorIyBQQ0lFIGRyaXZlcgorIyBob3N0IHNwZWNpZmljCisjCitNT0RfTkFNRSA9IHBjaWVfbW9kCitNT0RfREVQUyA9IHBjaWUgCisKK01PRF9TVVBQUkVTU19PU19ERVAgPSB5CisKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgIE1PRF9UWVBFID0gbGludXhfbGliCisgICAgc3JjcyA9IGJjbW9sdF90cl9wY2llX3NwZWNpZmljLmMKK2Vsc2UKKyAgICBNT0RfVFlQRSA9IGxpYgorZW5kaWYKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK1VTRV9MSU5UID0geWVzCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9wY2llL2JjbW9sdF90cl9wY2llX3NwZWNpZmljLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDEwMmJjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9wY2llL2JjbW9sdF90cl9wY2llX3NwZWNpZmljLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY210cl9wY2llLmgiCisjaW5jbHVkZSAiYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaCIKKworZXh0ZXJuIGZfYmNtdHJfaW50IGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXI7CitleHRlcm4gZl9iY210cl9pbnQgYmNtdHJfcGNpZV90eF9pcnFfaGFuZGxlcjsKK3N0YXRpYyBiY21vc19mYXN0bG9jayBpc3JfbG9jazsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG5lZWQgdG8gcGFzcyB0aHJ1IGFsbCB0aGUgZGV2aWNlcyAtIGNoZWNrIGlmIGlycSBpcyBTSEFSRUQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGJjbXRyX3J4X2lzcihpbnQgaXJxLCB2b2lkICppc3JfaW5mbykKK3sKKyAgICB1aW50MzJfdCBpc3JfcmVnOworICAgIHVpbnQzMl90IG1hc2tfcmVnOworICAgIGxvbmcgZmxhZ3M7CisgICAgaW50IGhhbmRsZWQgPSAwOworICAgIGJjbV9wY2llZF9pc3JfZGF0YSAqaXNyX2RhdGEgPSAoYmNtX3BjaWVkX2lzcl9kYXRhICopaXNyX2luZm87CisKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmlzcl9sb2NrKTsKKworICAgIGlzcl9yZWcgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QqKShpc3JfZGF0YS0+cGNpZV9yZWdfYmFzZSArIERNQV9JTlRSX1NUQVRVUykpOworICAgIG1hc2tfcmVnID0gfmJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCopKGlzcl9kYXRhLT5wY2llX3JlZ19iYXNlICsgRE1BX0lOVFJfTUFTS19TVEFUVVMpKTsKKworICAgIGlmICgoaXNyX3JlZyAmIG1hc2tfcmVnKSYgRE1BX1RYX0RPTkVfTUFTSykKKyAgICB7CisgICAgICAgIC8qIGhhbmRsZSBUWCBET05FIGludGVycnVwdCAqLworICAgICAgICBpc3JfZGF0YS0+dHhfZG9uZV9udW0rKzsKKworICAgICAgICBpZiAoYmNtdHJfcGNpZV90eF9pcnFfaGFuZGxlcikKKyAgICAgICAgICAgIGJjbXRyX3BjaWVfdHhfaXJxX2hhbmRsZXIoaXNyX2RhdGEtPmRldmljZSk7CisKKyAgICAgICAgaGFuZGxlZCA9IDE7CisgICAgfQorCisgICAgaWYgKChpc3JfcmVnICYgbWFza19yZWcgKSAmIERNQV9SWF9ET05FX01BU0spCisgICAgeworICAgICAgICAvKiBoYW5kbGUgUlggRE9ORSBpbnRlcnJ1cHQgKi8KKyAgICAgICAgaXNyX2RhdGEtPnJ4X2RvbmVfbnVtKys7CisKKyAgICAgICAgaWYgKGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXIpCisgICAgICAgICAgICBiY210cl9wY2llX3J4X2lycV9oYW5kbGVyKGlzcl9kYXRhLT5kZXZpY2UpOworCisgICAgICAgIGhhbmRsZWQgPSAxOworICAgIH0KKworICAgIGlmIChpc3JfcmVnICYgKERNQV9SWF9FUlJPUl9NQVNLIHwgRE1BX1RYX0VSUk9SX01BU0spKQorICAgIHsKKyAgICAgICAgaWYgKGlzcl9yZWcgJiBETUFfUlhfRVJST1JfTUFTSykKKyAgICAgICAgICAgIGlzcl9kYXRhLT5yeF9lcnJfbnVtKys7CisgICAgICAgIGlmIChpc3JfcmVnICYgRE1BX1RYX0VSUk9SX01BU0spCisgICAgICAgICAgICBpc3JfZGF0YS0+dHhfZXJyX251bSsrOworICAgICAgICAvKiBjbGVhciBpbnRlcnJ1cHQgZXJyb3IgaW50ZXJydXB0ICovCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigodWludDMyX3QqKShpc3JfZGF0YS0+cGNpZV9yZWdfYmFzZSArIERNQV9JTlRSX0NMRUFSKSwgRE1BX1JYX0VSUk9SX01BU0sgfCBETUFfVFhfRVJST1JfTUFTSyk7CisgICAgICAgIGhhbmRsZWQgPSAxOworICAgIH0KKworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmaXNyX2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBoYW5kbGVkOworfQorCit2b2lkIGJjbXRyX2Nvbm5lY3RfaXNyKHZvaWQgKmlzcl9pbmZvKQoreworICAgIHVpbnQzMl90ICAgIGZsYWdzID0gMDsKKworICAgIGJjbV9wY2llZF9pc3JfZGF0YSAqaXNyX2RhdGEgPSAoYmNtX3BjaWVkX2lzcl9kYXRhICopaXNyX2luZm87CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmaXNyX2xvY2ssIGZsYWdzKTsKKyAgICAvKiBjb25uZWN0IGludGVycnVwdCB0byBzeXN0ZW0gY3B1IC0gMCAqLworICAgIGJjbW9zX2ludF9jb25uZWN0KChpbnQpaXNyX2RhdGEtPnJ4X2lycSwgMCwgQkNNT1NfSVJRX1NIQVJFRCwgYmNtdHJfcnhfaXNyLCAiZG1haXNyIiwgaXNyX2RhdGEpOworfQorCisjaWZkZWYgX19LRVJORUxfXworRVhQT1JUX1NZTUJPTChiY210cl9jb25uZWN0X2lzcik7CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvcGNpZS9iY21vbHRfdHJfcGNpZV9zcGVjaWZpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzhhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PTFRfVFJfUENJRV9TUEVDSUZJQ19IXworI2RlZmluZSBCQ01PTFRfVFJfUENJRV9TUEVDSUZJQ19IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtdHJfcGNpZS5oIgorCisjZGVmaW5lIERFU0NSSVBUT1JfQ09OVFJPTCAgICAgIDB4MDAwNjQ0MTAgLyogVHggU29mdHdhcmUgRGVzY3JpcHRvciBMaXN0IENvbnRyb2wgYW5kIFN0YXR1cyAqLworI2RlZmluZSBXQUtFVVBfRE1BICAgICAgICAgICAgICAweDAwMDY0NDE0IC8qIFR4IFdha2UgQ29udHJvbCAqLworI2RlZmluZSBFUlJPUl9TVEFUVVMgICAgICAgICAgICAweDAwMDY0NDE4IC8qIFR4IEVuZ2luZSBFcnJvciBTdGF0dXMgKi8KKworI2RlZmluZSBJTlRSMl9QQ0lfU1RBVFVTICAgICAgICAweDAwMDY0MzE4IC8qIFBDSSBpbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgRE1BX1RYX1NXX0RFU0NfTElTVF9DVFJMX1NUU19UWF9ETUFfUlVOX1NUT1BfTUFTSyAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRE1BX1RYX1dBS0VfQ1RSTF9XQUtFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBETUFfSU5UUl9TVEFUVVMJICAgICAgICAweDAwMDY0MzE4IC8qIFBDSSBpbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9JTlRSX0NMRUFSICAgICAgICAgIDB4MDAwNjQzMjAgLyogUENJIGludGVycnVwdCBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UUl9NQVNLX1NFVCAgICAgICAweDAwMDY0MzI4IC8qIFBDSSBpbnRlcnJ1cHQgTWFzayBTZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFJfTUFTS19DTEVBUiAgICAgMHgwMDA2NDMyYyAvKiBQQ0kgaW50ZXJydXB0IE1hc2sgQ2xlYXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFJfTUFTS19TVEFUVVMgICAgMHgwMDA2NDMyNCAvKiBQQ0kgaW50ZXJydXB0IE1hc2sgJiBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBETUFfUlhfRVJST1JfTUFTSyAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERNQV9SWF9ET05FX01BU0sgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRE1BX1RYX0RPTkVfTUFTSyAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBETUFfVFhfRVJST1JfTUFTSyAgICAgICAweDAwMDAwMDAyCisKKyNkZWZpbmUgUENJRV9MMl9JTlRSX01BU0sgICAgICAgMHgwMDAwMDAyMCAvKiBMMiBpbnRlcnJ1cHQgYml0IGluIEwxIGludGVycnVwdCBzdGF0dXMgKi8KKworI2RlZmluZSBETUFfSU5UUjFfU1RBVFVTICAgICAgICAweDAwMDY5MzAwIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFIxX01BU0tfQ0xFQVIgICAgMHgwMDA2OTMwYyAvKiBJbnRlcnJ1cHQgTWFzayBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UUjFfTUFTS19TRVQgICAgICAweDAwMDY5MzA4IC8qIEludGVycnVwdCBNYXNrIFNldCBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UQV9NQVNLICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERNQV9JTlRBX1NISUZUICAgICAgICAgIDEKKyNkZWZpbmUgUENJRV9TVEFUVVNfT0ZGU0VUICAgICAgMHgwMDA2NDA2OCAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfUENJRV9TVEFUVVMgKi8KKwordm9pZCBiY210cl9jb25uZWN0X2lzcih2b2lkICppc3JfaW5mbyk7CisKKy8qIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgZGVzdCBQRCwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIHNvdXJjZSBmaWVsZCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3NldF9kZXN0X2J1ZmZlcl9hZGRyZXNzKHVpbnQzMl90ICpwZCwgdm9pZCAqdmFsdWUpCit7CisgICAgdWludDY0X3QgdG1wID0gYmNtb3NfdmlydF90b19waHlzKHZhbHVlKTsKKworICAgIGJjbV9wY2lfd3JpdGUzMigmcGRbUENJX1BBQ0tFVF9MT1dfSU5ERVhdLCAgKHVpbnQzMl90KSggdG1wICYgMHhmZmZmZmZmZlVMKSk7CisgICAgYmNtX3BjaV93cml0ZTMyKCZwZFtQQ0lfUEFDS0VUX0hJR0hfSU5ERVhdLCAodWludDMyX3QpKCh0bXAgPj4gMzIpICYgMHhmZmZmZmZmZlVMKSk7Cit9CisKKy8qIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgZGVzdCBQRCwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIHNvdXJjZSBmaWVsZCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3NldF9zb3VyY2VfYnVmZmVyX2FkZHJlc3ModWludDMyX3QgKnBkLCB2b2lkICp2YWx1ZSkKK3sKKyAgICB1aW50NjRfdCB0bXAgPSBiY21vc192aXJ0X3RvX3BoeXModmFsdWUpOworCisgICAgYmNtX3BjaV93cml0ZTMyKCZwZFtQQ0lfUEFDS0VUX0xPV19JTkRFWF0sICAodWludDMyX3QpKCB0bXAgJiAweGZmZmZmZmZmVUwpKTsKKyAgICBiY21fcGNpX3dyaXRlMzIoJnBkW1BDSV9QQUNLRVRfSElHSF9JTkRFWF0sICh1aW50MzJfdCkoKHRtcCA+PiAzMikgJiAweGZmZmZmZmZmVUwpKTsKK30KKworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY210cl9jcmVhdGVfdHVfcmluZ3ModWludDMyX3QgdHhsZW5ndGgsIHVpbnQzMl90IHJ4bGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnR4cHRyLCB2b2lkICoqcnhwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqdHhwdHJfb3JpZywgdm9pZCAqKnJ4cHRyX29yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBjaWVfcmVnX2Jhc2UpCit7CisgICAgKnR4cHRyICAgICAgPSBOVUxMOworICAgICpyeHB0cl9vcmlnID0gTlVMTDsKKyAgICAqdHhwdHIgICAgICA9IE5VTEw7CisgICAgKnJ4cHRyX29yaWcgPSBOVUxMOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtdHJfcGNpZV9zcGVjaWZpY19pbml0KHVuc2lnbmVkIGxvbmcgcGNpZV9yZWdfYmFzZSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY210cl9wY2llX2ZyZWVfcmluZ3ModWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqdHhfcHRyLCB1aW50MzJfdCAqIHJ4X3B0cil7fQorc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3BjaWVfZnJlZV9pcnEodWludDMyX3QgaXJxLCB2b2lkICpwcml2KQoreworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgYmNtb3NfaW50X2Rpc2Nvbm5lY3QoKGludClpcnEsIHByaXYpOworI2VuZGlmCit9CisKKyNkZWZpbmUgVFhfTE9DS0RFRiAgICAgICAgIGJjbW9zX211dGV4ICB0eF9sb2NrOworI2RlZmluZSBDUkVBVEVfVFhMT0NLKGkpICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZiY210cl9wY2llX2RhdGFbaV0udHhfbG9jaywgMCwgTlVMTCkKKyNkZWZpbmUgREVTVFJPWV9UWExPQ0soaSkgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmJjbXRyX3BjaWVfZGF0YVtpXS50eF9sb2NrKQorI2RlZmluZSBMT0NLX1RYKCkgICAgICAgICAgYmNtb3NfbXV0ZXhfbG9jaygmY3VycmVudF9kZXZpY2UtPnR4X2xvY2spCisjZGVmaW5lIFVOTE9DS19UWCgpICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmN1cnJlbnRfZGV2aWNlLT50eF9sb2NrKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvbmxfc29ja2V0L01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvbmxfc29ja2V0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODVlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9ubF9zb2NrZXQvTWFrZWZpbGUKQEAgLTAsMCArMSwyMiBAQAorIyBOTCB0cmFuc3BvcnQgZHJpdmVyCisjCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKK2lmZXEgKCIkKENPTkZJR19UUkFOU1BPUlRfUkFXKSIsICJ5IikKKworCitNT0RfTkFNRSA9IG5sdHIKK01PRF9UWVBFID0gbGludXhfbGliCitNT0RfREVQUyA9IHRybXV4IHRyX3BsdWdpbl9yYXcKKworc3JjcyA9IGJjbW9sdF90cl9ubF9kcml2ZXIuYworCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKKworVVNFX0xJTlQgPSB5ZXMKKworZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9ubF9zb2NrZXQvYmNtb2x0X3RyX25sX2RyaXZlci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvbmxfc29ja2V0L2JjbW9sdF90cl9ubF9kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjNmY2EyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvbmxfc29ja2V0L2JjbW9sdF90cl9ubF9kcml2ZXIuYwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIG5sX3RyYW5zcG9ydC5jCisgKgorICogTkwtc29ja2V0IGJhc2VkIHRyYW5zcG9ydC4gS2VybmVsIHNwYWNlIG1vZHVsZQorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPiAgICAgICAvKiBOZWVkZWQgYnkgYWxsIG1vZHVsZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gICAgICAgLyogTmVlZGVkIGZvciBLRVJOX0lORk8gKi8KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8YmNtb2x0X3RyX211eC5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl9ubF9kcml2ZXIuaD4KKyNpbmNsdWRlICJiY21vbHRfdHJfbmwuaCIKKworI2RlZmluZSBCQ01UUl9NRU1fUEFDS0VUUyAgICAgICAxMDAwMAorI2RlZmluZSBCQ01UUl9NRU1fT1ZFUkhFQUQgICAgICBTS0JfVFJVRVNJWkUoMTAyNCkKKyNkZWZpbmUgQkNNVFJfTUlOX1JDVkJVRl9TSVpFICAgKEJDTVRSX01FTV9QQUNLRVRTICogQkNNVFJfTUVNX09WRVJIRUFEKQorCitzdHJ1Y3Qgc29jayAqYmNtdHJfbmxfc29jayA9IE5VTEw7CisKKy8qIE5ldGxpbmsgb3BlcmF0aW9ucy4gVGhpcyBkcml2ZXIgb3ZlcnJpZGVzIGEgY291cGxlICovCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBiY210cl9ubF9vcHM7CitzdGF0aWMgaW50ICgqbmV0bGlua19yZWxlYXNlX29yZykoc3RydWN0IHNvY2tldCAqc29jayk7CisKK3N0cnVjdCBiY210cl9ubAoreworICAgIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbFtCQ01UUl9NQVhfT0xUU107CisgICAgaW50IHBpZDsKKyAgICBzdHJ1Y3Qgc29jayAqc2s7Cit9OworCitzdGF0aWMgaW50IGJjbXRyX25ldGxpbmtfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworICAgIHN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworICAgIHN0cnVjdCBiY210cl9ubCAqbmxiID0gc2stPnNrX3VzZXJfZGF0YTsKKyAgICBpZiAobmxiKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmxiLT5jaGFubmVsW2ldKQorICAgICAgICAgICAgICAgIGJjbXRybXV4X2NoYW5uZWxfdW5yZWdpc3RlcihpLCBubGItPmNoYW5uZWxbaV0pOworICAgICAgICB9CisgICAgICAgIGtmcmVlKG5sYik7CisgICAgICAgIHNrLT5za191c2VyX2RhdGEgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV0bGlua19yZWxlYXNlX29yZyhzb2NrKTsKK30KKworLyoqIFJlY2VpdmUgbWVzc2FnZSBoYW5kbGVyICovCitzdGF0aWMgIHZvaWQgX2JjbXRyX25sX3JlY3YoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfYnVmICpidWYsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCwgdm9pZCAqZGF0YSkKK3sKKyAgICB1aW50MzJfdCBkYXRhX2xlbmd0aCA9IGJjbW9zX2J1Zl9sZW5ndGgoYnVmKTsKKyAgICB1aW50MzJfdCBkZXZpY2VfdTMyID0gKHVpbnQzMl90KWRldmljZTsKKyAgICBzdHJ1Y3QgYmNtdHJfbmwgKm5sYiA9IChzdHJ1Y3QgYmNtdHJfbmwgKilkYXRhOworICAgIHVpbnQ4X3QgKnBfZGV2aWNlOworICAgIGludCByOworCisgICAgTkVUTElOS19DQigmKGJ1Zi0+c2tiKSkuZHN0X2dyb3VwID0gMDsgLyogbm90IGluIG1jYXN0IGdyb3VwICovCisKKyAgICAvKiBOb3cgYSB0cmlja3kgcGFydC4gbmxtc2dfcHV0KCkgYXNzdW1lcyB0aGF0IHNrYiBpcyBlbXB0eSBhbmQgZXh0ZW5kcyBpdAorICAgICAqIGJ5IHRvdGFsIG1zZyBzaXplLiBXZSBkb24ndCB3YW50IGl0LiBSZXNlcnZlIHJvb20gZm9yIG5sbXNnIGhlYWRlciBhbmQgdGhlbgorICAgICAqIHNldCBzaXplIHRvIDAgYW5kIGxldCBubG1zZ19wdXQoKSByZXN0b3JlIGl0CisgICAgICovCisgICAgaWYgKHVubGlrZWx5KHNrYl9oZWFkcm9vbSgmYnVmLT5za2IpIDwgTkxNU0dfSERSTEVOICsgc2l6ZW9mKHVpbnQzMl90KSkpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgcHJlcGVuZCBOTCBoZWFkZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGJjbW9zX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX3NrYl9wdXNoKCZidWYtPnNrYiwgTkxNU0dfSERSTEVOICsgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgLyogU3RvcmUgZGV2aWNlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBOTCBoZWFkZXIgKi8KKyAgICBwX2RldmljZSA9IGJ1Zi0+c2tiLmRhdGEgKyBOTE1TR19IRFJMRU47CisgICAgbWVtY3B5KHBfZGV2aWNlLCAmZGV2aWNlX3UzMiwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgX19za2JfdHJpbSgmYnVmLT5za2IsIDApOworICAgIG5sbXNnX3B1dCgmYnVmLT5za2IsIDAsIDAsIE5MTVNHX0RPTkUsIGRhdGFfbGVuZ3RoICsgc2l6ZW9mKHVpbnQzMl90KSwgMCk7CisKKyAgICByID0gbmxtc2dfdW5pY2FzdChubGItPnNrLCAmYnVmLT5za2IsIG5sYi0+cGlkKTsKKyAgICBpZiAocikKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBubG1zZ191bmljYXN0KCkgLS0+ICVkIGxlbj0ldSBybV9hbGxvYz0lZCByZWN2YnVmPSVkXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCByLCBkYXRhX2xlbmd0aCwgYXRvbWljX3JlYWQoJm5sYi0+c2stPnNrX3JtZW1fYWxsb2MpLCBubGItPnNrLT5za19yY3ZidWYpOworICAgIH0KK30KKwordm9pZCBiY210cl9ubF9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoOworICAgIHN0cnVjdCBiY210cl9ubCAqbmxiOworICAgIHVpbnQzMl90IGRldmljZTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIG5saCA9IG5sbXNnX2hkcihza2IpOworCisgICAgaWYoTkxNU0dfT0sobmxoLCBza2ItPmxlbikpCisgICAgeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDEwLDApCisgICAgICAgIHN0cnVjdCBzb2NrICpzayA9IE5FVExJTktfQ0Ioc2tiKS5zazsKKyNlbHNlCisgICAgICAgIHN0cnVjdCBzb2NrICpzayA9IE5FVExJTktfQ0Ioc2tiKS5zc2s7CisjZW5kaWYKKworICAgICAgICAvKiBjaGFubmVsIGlzIHN0b3JlZCBpbiB1c2VyX2RhdGEuIElmIGl0IGlzIDAgLSB0aGF0IG1lYW5zIHRoYXQgY2hhbm5lbAorICAgICAgICAgKiBpcyBub3QgYWxsb2NhdGVkIHlldC4gRG8gaXQgaGVyZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFzay0+c2tfdXNlcl9kYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBubGIgPSBrbWFsbG9jKHNpemVvZigqbmxiKSwgR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICBpZiAoIW5sYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgYWxsb2NhdGUgTkxCXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldChubGIsIDAsIHNpemVvZigqbmxiKSk7CisgICAgICAgICAgICBubGItPnBpZCA9IG5saC0+bmxtc2dfcGlkOworICAgICAgICAgICAgbmxiLT5zayA9IHNrOworICAgICAgICAgICAgc2stPnNrX3VzZXJfZGF0YSA9IG5sYjsKKworICAgICAgICAgICAgLyogT3ZlcnJpZGUgcmVsZWFzZSBjYWxsYmFjayBpbiBvcmRlciB0byBjbGVhbnVwICovCisgICAgICAgICAgICBiY210cl9ubF9vcHMgPSAqc2stPnNrX3NvY2tldC0+b3BzOworICAgICAgICAgICAgbmV0bGlua19yZWxlYXNlX29yZyA9IGJjbXRyX25sX29wcy5yZWxlYXNlOworICAgICAgICAgICAgYmNtdHJfbmxfb3BzLnJlbGVhc2UgPSBiY210cl9uZXRsaW5rX3JlbGVhc2U7CisgICAgICAgICAgICBzay0+c2tfc29ja2V0LT5vcHMgPSAmYmNtdHJfbmxfb3BzOworCisgICAgICAgICAgICAvKiBPdmVycmlkZSBza19yY3ZidWYgc2l6ZS4gU2V0IG1pbiAqLworICAgICAgICAgICAgaWYgKHNrLT5za19yY3ZidWYgPCBCQ01UUl9NSU5fUkNWQlVGX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2stPnNrX3JjdmJ1ZiA9IEJDTVRSX01JTl9SQ1ZCVUZfU0laRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5sYiA9IChzdHJ1Y3QgYmNtdHJfbmwgKilzay0+c2tfdXNlcl9kYXRhOworICAgICAgICB9CisKKyAgICAgICAgLyogRGV2aWNlIGlkIGZvbGxvd3MgTkxNU0cgaGVhZGVyICovCisgICAgICAgIGRldmljZSA9IHNrYi0+ZGF0YVtOTE1TR19IRFJMRU5dOworICAgICAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogZGV2aWNlICV1IGlzIGluc2FuZVxuIiwgX19GVU5DVElPTl9fLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFubGItPmNoYW5uZWxbZGV2aWNlXSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsID0gQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX0FTU0lHTjsKKworICAgICAgICAgICAgcmMgPSBiY210cm11eF9jaGFubmVsX3JlZ2lzdGVyKGRldmljZSwgJmNoYW5uZWwsIF9iY210cl9ubF9yZWN2LCBubGIpOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBjYW4ndCByZWdpc3RlciBjaGFubmVsIGZvciBkZXZpY2UgJXUuIHJjPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldmljZSwgKGludClyYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmxiLT5jaGFubmVsW2RldmljZV0gPSBjaGFubmVsOworICAgICAgICB9CisKKworICAgICAgICAvKiBDdXQgTkwgaGVhZGVyICsgZGV2aWNlICovCisgICAgICAgIHNrYl9wdWxsKHNrYiwgTkxNU0dfSERSTEVOICsgc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgICAgICAgLyogQ2xvbmUgc2tiIGJlY2F1c2UgY2FsbGVyIHdpbGwgcmVsZWFzZSB0aGUgb3JpZ2luYWwgb25lICovCisgICAgICAgIHNrYiA9IHNrYl9jbG9uZShza2IsIDApOworICAgICAgICBpZiAoIXNrYikKKyAgICAgICAgeworCisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgc2tiXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZvcndhcmQgdG8gdGhlIG11eCAqLworICAgICAgICBiY210cm11eF9yeF9mcm9tX2hvc3QoZGV2aWNlLCBubGItPmNoYW5uZWxbZGV2aWNlXSwgKGJjbW9zX2J1ZiAqKXNrYik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIG1lc3NhZ2UgcmVjZWl2ZWQgZnJwbSBwaWQgJWRcbiIsIF9fRlVOQ1RJT05fXywgbmxoLT5ubG1zZ19waWQpOworICAgIH0KK30KKworc3RhdGljIHN0cnVjdCBuZXRsaW5rX2tlcm5lbF9jZmcgYmNtdHJfbmxfY2ZnID0geworICAgIC5pbnB1dCA9IGJjbXRyX25sX2lucHV0LAorfTsKKworYmNtb3NfZXJybm8gYmNtdHJfbmxfaW5pdCh2b2lkKQoreworICAgIHByaW50ayhLRVJOX0lORk8gIk1hcGxlIG5ldGxpbmstYmFzZWQgcmF3IGRyaXZlciB0cmFuc3BvcnQgZHJpdmVyXG4iKTsKKyAgICBiY210cl9ubF9zb2NrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKCZpbml0X25ldCwgQkNNVFJfTkxfRkFNSUxZLCAmYmNtdHJfbmxfY2ZnKTsKKyAgICBpZighYmNtdHJfbmxfc29jaykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtdHJfbmxfZXhpdCh2b2lkKQoreworICAgIHByaW50aygiTWFwbGUgbmV0bGluay1iYXNlZCByYXcgZHJpdmVyIHRlcm1pbmF0ZWRcbiIpOworICAgIGlmIChiY210cl9ubF9zb2NrKQorICAgIHsKKyAgICAgICAgbmV0bGlua19rZXJuZWxfcmVsZWFzZShiY210cl9ubF9zb2NrKTsKKyAgICAgICAgYmNtdHJfbmxfc29jayA9IE5VTEw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvbmxfc29ja2V0L2JjbW9sdF90cl9ubF9kcml2ZXIuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L25sX3NvY2tldC9iY21vbHRfdHJfbmxfZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5Yzk5MAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L25sX3NvY2tldC9iY21vbHRfdHJfbmxfZHJpdmVyLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbXRyX25sX2RyaXZlci5oIC0gaG9zdCBuZXRsaW5rLXNvY2tldCB0cmFuc3BvcnQgZHJpdmVyCisgKi8KKworI2lmbmRlZiBCQ01PTFRfVFJfTkxfRFJJVkVSX0hfCisjZGVmaW5lIEJDTU9MVF9UUl9OTF9EUklWRVJfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCitiY21vc19lcnJubyBiY210cl9ubF9pbml0KHZvaWQpOwordm9pZCBiY210cl9ubF9leGl0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGYwMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMgVHJhbnNwb3J0OiBQbHVnaW4gaW50ZXJmYWNlCisjCitNT0RfTkFNRSA9IHRyX3BsdWdpbgorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gdXRpbHMgY29tbW9uX2FwaSBtb2RlbAorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKK01PRF9JTkNfRElSUyA9ICQoU1JDX0RJUikgJChUT1BfRElSKS9ob3N0X2RyaXZlci90cmFuc3BvcnQKK2Vsc2UKK01PRF9JTkNfRElSUyA9ICQoU1JDX0RJUikgJChTUkNfRElSKS8uLgorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9iY210cl9wbHVnaW4uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9iY210cl9wbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQzZGQyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL2JjbXRyX3BsdWdpbi5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTVRSX1BMVUdJTl9IXworI2RlZmluZSBCQ01UUl9QTFVHSU5fSF8KKworI2luY2x1ZGUgPGJjbW9sdF9idWYuaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisKKyNpbmNsdWRlIDxiY210cl9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiY210cl9oZWFkZXIuaD4KKworLyoqIE1lc3NhZ2UgdHJhbnNwb3J0IHR5cGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgQkNNVFJfVFlQRV9VRFAsICAgICAgICAvKio8IFVEUCB0cmFuc3BvcnQgKi8KKyAgIEJDTVRSX1RZUEVfUkFXICAgICAgICAgLyoqPCBSYXcgdHJhbnNwb3J0ICovCit9IGJjbXRyX3RyYW5zcG9ydF90eXBlOworCisvKiogVURQIGNvbmZpZ3VyYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgbXlfaXA7ICAgICAgICAgICAgIC8qKjwgTG9jYWwgSVAgYWRkcmVzcyBpbiBob3N0IGZvcm1hdCAqLworICAgIHVpbnQzMl90IHJlbW90ZV9pcDsgICAgICAgICAvKio8IFJlbW90ZSBJUCBhZGRyZXNzIGluIGhvc3QgZm9ybWF0ICovCisgICAgdWludDE2X3QgbXlfcG9ydDsgICAgICAgICAgIC8qKjwgTG9jYWwgVURQIHBvcnQgaW4gaG9zdCBmb3JtYXQuIElOQUREUl9BTlkgaXMgYWNjZXB0YWJsZSAqLworICAgIHVpbnQxNl90IHJlbW90ZV9wb3J0OyAgICAgICAvKio8IFJlbW90ZSBVRFAgcG9ydCBpbiBob3N0IGZvcm1hdCAqLworfSBiY210cl91ZHBfY2ZnOworCisvKiogVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY210cl90cmFuc3BvcnRfdHlwZSB0eXBlOyAgICAgLyoqPCBUcmFuc3BvcnQgdHlwZSAqLworCisgICAgLyoqIFR5cGUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICAvKiogVURQIFBsdWdpbiBwYXJhbWV0ZXJzICovCisgICAgICAgIGJjbXRyX3VkcF9jZmcgdWRwOworCisgICAgICAgIC8qIFJhdyB0YXNrIGZvcndhcmRlciBwbHVnaW4gcGFyYW1ldGVycyAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJfdWRwX2NmZyB1ZHA7ICAgICAgICAgIC8qKjwgVURQIGNvbmZpZ3VyYXRpb24gLSBmb3IgVURQLWJhc2VkIHJhdyBkcml2ZXIgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IG1heF90eHFfc2l6ZTsgICAgICAvKio8IE1heCB0cmFuc21pdCBxdWV1ZS9wb29sIHNpemUgKi8KKyAgICAgICAgICAgIGJjbW9zX3Rhc2tfcHJpb3JpdHkgdHhfcHJpOyAvKio8IFR4IHRhc2sgcHJpb3JpdHkgKi8KKyAgICAgICAgfSBmb3J3YXJkZXI7CisgICAgfSB4OworCisgICAgdWludDMyX3QgaGVhZHJvb207ICAgICAgICAgICAgICAgICAgLyoqPCBBZGRpdGlvbmFsIGhlYWRyb29tIGxlbmd0aCB0aGF0IHNob3VsZCBiZSByZXNlcnZlZCBmb3IgcGx1Z2luIHVzZSAqLworCit9IGJjbXRyX3BsdWdpbl9jZmc7CisKKy8qKiBQbHVnaW4gY2hhbm5lbCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGJjbXRyX3BsdWdpbl9jaGFubmVsOworCisvKiogVHJhbnNwb3J0IGRyaXZlciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qKiBPcGVuIGNvbW11bmljYXRpb24gY2hhbm5lbCwgZXN0YWJsaXNoIGNvbW11bmljYXRpb24gKi8KKyAgICBiY21vc19lcnJubyAoKm9wZW4pKGludCBkZXZpY2UsIGJjbXRyX3BsdWdpbl9jZmcgKmNmZywgYmNtdHJfcGx1Z2luX2NoYW5uZWwgKmNoKTsKKyAgICAvKiogQ2xvc2UgY29tbXVuaWNhdGlvbiBjaGFubmVsICovCisgICAgYmNtb3NfZXJybm8gKCpjbG9zZSkoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gpOworICAgIC8qKiBTZW5kIGRhdGEuIEl0IGRvZXNuJ3QgaGF2ZSB0byByZWxlYXNlIHRoZSB0eCBidWZmZXIsIGJ1dCBpZiBpdCBkb2VzIC0gaXQgbXVzdAorICAgICAqIGNsZWFyIGJ1Zi0+c3RhcnQgdG8gcHJldmVudCBkb3VibGUgcmVsZWFzZSAqLworICAgIGJjbW9zX2Vycm5vICgqc2VuZCkoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gsIGJjbW9sdF9zdWJjaGFubmVsIHN1YmNoLCBiY21vbHRfYnVmICpidWYsIGJjbXRyX3NlbmRfZmxhZ3MgZmxhZ3MpOworICAgIC8qKiBSZWNlaXZlIGRhdGEuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciByZWNlaXZlIGJ1ZmZlciBhbGxvY2F0aW9uICovCisgICAgYmNtb3NfZXJybm8gKCpyZWN2KShiY210cl9wbHVnaW5fY2hhbm5lbCBjaCwgYmNtb2x0X3N1YmNoYW5uZWwgKnN1YmNoLCBiY21vbHRfYnVmICpidWYpOworfSBiY210cl9kcml2ZXI7CisKKy8qKiBJbml0aWFsaXplIHBsdWdpbiBjYWxsYmFja3MKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGNmZyAgICAgUGx1Z2luIGNvbmZpZ3VyYXRpb24KKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIGRyaXZlciAgVHJhbnNwb3J0IHBsdWdpbiBkcml2ZXIgc3RydWN0dXJlCisgKiBccmV0dXJuIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGx1Z2luX2luaXQoYmNtdHJfcGx1Z2luX2NmZyAqY2ZnLCBiY210cl9kcml2ZXIgKmRyaXZlcik7CisKKy8qIFVEUCBjb21tIHBhcmFtZXRlcnMgKi8KKyNpZmRlZiBCQ01UUl9VRFBfU1VQUE9SVAorZXh0ZXJuIHVpbnQzMl90IGJjbXRyX2hvc3RfaXA7CitleHRlcm4gdWludDE2X3QgYmNtdHJfaG9zdF91ZHBfcG9ydDsKK2V4dGVybiB1aW50MzJfdCBiY210cl9vbHRfaXBbQkNNVFJfTUFYX09MVFNdOworZXh0ZXJuIHVpbnQxNl90IGJjbXRyX29sdF91ZHBfcG9ydFtCQ01UUl9NQVhfT0xUU107CisjZW5kaWYKKwordm9pZCB1c2luZ19pbmJhbmRfc2V0KGJjbW9zX2Jvb2wgdXNpbmdfaW5iYW5kKTsKK2JjbW9zX2Jvb2wgdXNpbmdfaW5iYW5kX2dldCh2b2lkKTsKKworI2VuZGlmIC8qIEJDTVRSX1BMVUdJTl9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL2RpcmVjdC9iY210cl9wbHVnaW5fZGlyZWN0LmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vZGlyZWN0L2JjbXRyX3BsdWdpbl9kaXJlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDBjOWJhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL2RpcmVjdC9iY210cl9wbHVnaW5fZGlyZWN0LmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKyAKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIAorRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyAKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisgCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyAKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworLyoKKyAqIGJjbXRyX3BsdWdpbl9kaXJlY3QuYworICoKKyAqIFRoaXMgcGx1Z2luCisgKiAtIFRYOiBmb3J3YXJkcyBtZXNzYWdlcyB0byB0cm11eAorICogLSBSWDogd2FpdHMgb24gcnggdGFzaydzIG1lc3NhZ2UgcXVldWUKKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxiY210cl9wbHVnaW4uaD4KKyNpbmNsdWRlIDxiY21fY29uZmlnLmg+CisjaW5jbHVkZSA8YmNtb2x0X3RyX211eC5oPgorCisvKiBSZWNlaXZlIE9TIG1lc3NhZ2UgcG9vbCBhbmQgcXVldWUgKi8KK3N0YXRpYyBiY21vc19tc2dfcG9vbCBiY210cl9yeF9tc2dfcG9vbFtCQ01UUl9NQVhfT0xUU107CitzdGF0aWMgYmNtb3NfbXNnX3F1ZXVlIGJjbXRyX3J4cVtCQ01UUl9NQVhfT0xUU107CisKKy8qIEZsYWdzIGluZGljYXRpbmcgaW5pdCBwcm9ncmVzcyAqLworc3RhdGljIGJjbW9zX2Jvb2wgcnhfcG9vbF9jcmVhdGVkW0JDTVRSX01BWF9PTFRTXTsKK3N0YXRpYyBiY21vc19ib29sIHJ4cV9jcmVhdGVkW0JDTVRSX01BWF9PTFRTXTsKK3N0YXRpYyB2b2lkIF9iY210cl9kaXJlY3RfcnhfZnJvbV90cm11eChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKTsKKworLyogVG8gcmVzb2x2ZSBzeW1ib2xzIGluIHVzZXJfYXBwbCBpbiBiYW5kIG5vdCBhcHBsaWNhYmxlIGZvciBWWFdvcmtzKi8KK3ZvaWQgdXNpbmdfaW5iYW5kX3NldChiY21vc19ib29sIHVzaW5nX2luYmFuZCl7fQorYmNtb3NfYm9vbCB1c2luZ19pbmJhbmRfZ2V0KHZvaWQpCit7CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCisKKy8qIFRyYW5zcG9ydCBJUEMgbWVzc2FnZSBkYXRhICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9pcGNfZGF0YQoreworICAgIGJjbW9sdF9idWYgYnVmOyAgICAgICAgICAgICAvKiBSeCBidWZmZXIgKi8KKyAgICBiY21vbHRfc3ViY2hhbm5lbCBzdWJjaDsgICAgLyogcnggY2hhbm5lbCAqLworfSBiY210cl9pcGNfZGF0YTsKKworCisvKiBTeXN0ZW0gLS0+IE9MVCBidWZmZXIgdHJhbnNsYXRpb24uCisgKiBzeXN0ZW0gYnVmZmVyIGlzIHJlbGVhc2VkIGluIGNhc2Ugb2Ygc3VjY2VzcworICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfc3lzYnVmX3RvX29sdGJ1ZihiY21vc19idWYgKnN5c2IsIGJjbW9sdF9idWYgKm9sdGIpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgZXJyID0gYmNtb2x0X2J1Zl9hbGxvYyhvbHRiLCBiY21vc19idWZfbGVuZ3RoKHN5c2IpLCBCQ01UUl9CVUZfRU5ESUFOKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGJjbW9sdF9idWZfd3JpdGUob2x0YiwgYmNtb3NfYnVmX2RhdGEoc3lzYiksIGJjbW9zX2J1Zl9sZW5ndGgoc3lzYikpOworICAgIGJjbW9zX2J1Zl9mcmVlKHN5c2IpOworICAgIG9sdGItPmN1cnIgPSBvbHRiLT5zdGFydDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogT0xUIGJ1ZmZlciAtLT4gc3lzdGVtIGJ1ZmZlciB0cmFuc2xhdGlvbi4KKyAqIE9MVCBidWZmZXIgbXVzdCBoYXZlIGhlYWRyb29tIGZvciBiY21vc19idWYgaGVhZGVyCisgKi8KK3N0YXRpYyBiY21vc19idWYgKmJjbXRyX29sdGJ1Zl90b19zeXNidWYoYmNtb2x0X2J1ZiAqb2x0YikKK3sKKyAgICBiY21vc19idWYgKnN5c2I7CisgICAgdWludDMyX3QgbGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZChvbHRiKTsKKworICAgIHN5c2IgPSBiY21vc19idWZfYWxsb2MobGVuKTsKKyAgICBpZiAoc3lzYiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoYmNtb3NfYnVmX2RhdGEoc3lzYiksIG9sdGItPnN0YXJ0LCBsZW4pOworICAgIGJjbW9zX2J1Zl9sZW5ndGhfc2V0KHN5c2IsIGxlbik7CisgICAgLyogV2UgZG9uJ3QgcmVsZWFzZSB0aGUgb3JpZ2luYWwgb2x0YiBiZWNhdXNlIGl0IGlzIG5lZWRlZCBmb3IgcmV0cmFuc21pc3Npb24uCisgICAgICogSXQgd2lsbCBiZSByZWxlYXNlZCBieSB0aGUgdHJhbnNwb3J0IGxheWVyCisgICAgICovCisgICAgcmV0dXJuIHN5c2I7Cit9CisKKy8qIFJlbGVhc2UgbWVzc2FnZSBkYXRhICovCitzdGF0aWMgdm9pZCBiY210cl9tc2dfZGF0YV9yZWxlYXNlKGJjbW9zX21zZyAqbXNnKQoreworICAgIGJjbXRyX2lwY19kYXRhICpkYXRhID0gbXNnLT5kYXRhOworICAgIGJjbW9sdF9idWZfZnJlZSgmZGF0YS0+YnVmKTsKK30KKworLyoqIENsb3NlIGNvbW11bmljYXRpb24gY2hhbm5lbCAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX2RpcmVjdF9jbG9zZShiY210cl9wbHVnaW5fY2hhbm5lbCBjaCkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCkoY2ggPj4gOCk7CisgICAgYmNtdHJtdXhfY2hhbm5lbCBtdXhjaCA9IChiY210cm11eF9jaGFubmVsKShjaCAmIDB4ZmYpOworCisgICAgLyogVW5yZWdpc3RlciBmcm9tIFRSTVVYICovCisgICAgYmNtdHJtdXhfY2hhbm5lbF91bnJlZ2lzdGVyKGRldmljZSwgbXV4Y2gpOworCisgICAgLyogRGVzdHJveSByeCBtZXNzYWdlIHBvb2wgKi8KKyAgICBpZiAocnhfcG9vbF9jcmVhdGVkW2RldmljZV0pCisgICAgeworICAgICAgICBiY21vc19tc2dfcG9vbF9kZXN0cm95KCZiY210cl9yeF9tc2dfcG9vbFtkZXZpY2VdKTsKKyAgICAgICAgcnhfcG9vbF9jcmVhdGVkW2RldmljZV0gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBEZXN0cm95IFJYIG1lc3NhZ2UgcXVldWUgKi8KKyAgICBpZiAocnhxX2NyZWF0ZWRbZGV2aWNlXSkKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19xdWV1ZV9kZXN0cm95KCZiY210cl9yeHFbZGV2aWNlXSk7CisgICAgICAgIHJ4cV9jcmVhdGVkW2RldmljZV0gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIE9wZW4gY29tbXVuaWNhdGlvbiBjaGFubmVsICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfZGlyZWN0X29wZW4oaW50IGRldmljZSwgYmNtdHJfcGx1Z2luX2NmZyAqY2ZnLCBiY210cl9wbHVnaW5fY2hhbm5lbCAqY2gpCit7CisgICAgLyogVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIGRlY2xhcmVkIHN0YXRpYyBpbiBvcmRlciB0byBwcm90ZWN0IG5hbWUgc3RyaW5nICovCisgICAgc3RhdGljIGJjbW9zX21zZ19xdWV1ZV9wYXJtIG1zZ3FfcGFybSA9IHsgLm5hbWUgPSAidHJfcnhxIn07CisgICAgYmNtb3NfbXNnX3Bvb2xfcGFybSBtc2dfcG9vbF9wYXJtID0ge307CisgICAgYmNtdHJtdXhfY2hhbm5lbCBtdXhfY2hhbm5lbCA9IEJDTVRSTVVYX0NIQU5ORUxfQVVUT19BU1NJR047CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgLyogRGlyZWN0IHBsdWdpbiBzdXBwb3J0cyBvbmx5IDEgYXBwbGljYXRpb24gaW5zdGFuY2UgKi8KKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAiRGV2aWNlICV1IGlzIG91dCBvZiByYW5nZVxuIiwgZGV2aWNlKTsKKyAgICBpZiAocnhfcG9vbF9jcmVhdGVkW2RldmljZV0pCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0FMUkVBRFksICJUcmFuc3BvcnQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCBmb3IgZGV2aWNlICV1XG4iLCBkZXZpY2UpOworCisgICAgLyogQ3JlYXRlIFJYIG1zZyBwb29sICovCisgICAgbXNnX3Bvb2xfcGFybS5zaXplID0gQkNNVFJfTUFYX1JYUV9TSVpFOyAgICAgICAgICAgIC8qIDwtLSBEZWZpbmUgcGFyYW1ldGVyIGluIGJjbXRyX2NvbmZpZyAqLworICAgIG1zZ19wb29sX3Bhcm0uZGF0YV9zaXplID0gc2l6ZW9mKGJjbXRyX2lwY19kYXRhKTsKKyAgICBtc2dfcG9vbF9wYXJtLmRhdGFfcmVsZWFzZSA9IGJjbXRyX21zZ19kYXRhX3JlbGVhc2U7CisgICAgZXJyID0gYmNtb3NfbXNnX3Bvb2xfY3JlYXRlKCZiY210cl9yeF9tc2dfcG9vbFtkZXZpY2VdLCAmbXNnX3Bvb2xfcGFybSk7CisgICAgaWYgKGVycikKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKGVyciwgIkNhbid0IGNyZWF0ZSByeCBwb29sXG4iKTsKKworICAgIC8qIENyZWF0ZSBSWCBxdWV1ZSBzZXQgKi8KKyAgICBlcnIgPSBiY21vc19tc2dfcXVldWVfY3JlYXRlKCZiY210cl9yeHFbZGV2aWNlXSwgJm1zZ3FfcGFybSk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19wb29sX2Rlc3Ryb3koJmJjbXRyX3J4X21zZ19wb29sW2RldmljZV0pOworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oZXJyLCAiQ2FuJ3QgY3JlYXRlIHJ4cVxuIik7CisgICAgfQorCisgICAgLyogUmVnaXN0ZXIgd2l0aCB0cm11eCAqLworICAgIGVyciA9IGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIoZGV2aWNlLCAmbXV4X2NoYW5uZWwsIF9iY210cl9kaXJlY3RfcnhfZnJvbV90cm11eCwgKHZvaWQgKilOVUxMICk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19wb29sX2Rlc3Ryb3koJmJjbXRyX3J4X21zZ19wb29sW2RldmljZV0pOworICAgICAgICBiY21vc19tc2dfcXVldWVfZGVzdHJveSgmYmNtdHJfcnhxW2RldmljZV0pOworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oZXJyLCAiQ2FuJ3QgcmVnaXN0ZXIgd2l0aCB0cm11eFxuIik7CisgICAgfQorCisgICAgcnhfcG9vbF9jcmVhdGVkW2RldmljZV0gPSBCQ01PU19UUlVFOworICAgIHJ4cV9jcmVhdGVkW2RldmljZV0gPSBCQ01PU19UUlVFOworICAgICpjaCA9IChiY210cl9wbHVnaW5fY2hhbm5lbCkoKGRldmljZSA8PCA4KSB8IG11eF9jaGFubmVsKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogU2VuZCBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfZGlyZWN0X3NlbmQoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gsIGJjbW9sdF9zdWJjaGFubmVsIHN1YmNoLCBiY21vbHRfYnVmICpidWYsCisgICAgYmNtdHJfc2VuZF9mbGFncyBmbGFncykKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCkoY2ggPj4gOCk7CisgICAgYmNtdHJtdXhfY2hhbm5lbCBtdXhjaCA9IChiY210cm11eF9jaGFubmVsKShjaCAmIDB4ZmYpOworICAgIGJjbW9zX2J1ZiAqc3lzYjsKKworICAgIC8qIERvIHplcm8tY29weSBjb252ZXJzaW9uIGZyb20gYmNtb2x0X2J1ZiAtLT4gYmNtb3NfYnVmLiBJdCBpcyBwb3NzaWJsZSBiZWNhdXNlIHJvb20KKyAgICAgKiBmb3IgYmNtb3NfYnVmIGhlYWRlciBpcyByZXNlcnZlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIGJjbW9sdF9idWYKKyAgICAgKi8KKyAgICBzeXNiID0gYmNtdHJfb2x0YnVmX3RvX3N5c2J1ZihidWYpOworICAgIGlmICghc3lzYikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgYmNtdHJtdXhfcnhfZnJvbV9ob3N0KGRldmljZSwgbXV4Y2gsIHN5c2IpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFJlY2VpdmUgZnJvbSB0cm11eC4gQ2FsbGVkIGluIHRybXV4IGNvbnRleHQgKi8KK3N0YXRpYyB2b2lkIF9iY210cl9kaXJlY3RfcnhfZnJvbV90cm11eChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKnN5c2IsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCwgdm9pZCAqZGF0YSkKK3sKKyAgICBiY21vc19tc2cgKm1zZzsKKyAgICBiY210cl9pcGNfZGF0YSAqaXBjX2RhdGE7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgbXNnID0gYmNtb3NfbXNnX3Bvb2xfYWxsb2MoJmJjbXRyX3J4X21zZ19wb29sW2RldmljZV0pOworICAgIGlmICghbXNnKQorICAgIHsKKyAgICAgICAgIC8qIDwtLSBhZGQgc29tZSBzdGF0aXN0aWMgaGVyZSAqLworICAgICAgICBiY21vc19idWZfZnJlZShzeXNiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpcGNfZGF0YSA9IG1zZy0+ZGF0YTsKKyAgICBlcnIgPSBiY210cl9zeXNidWZfdG9fb2x0YnVmKHN5c2IsICZpcGNfZGF0YS0+YnVmKTsKKyAgICBpZiAoZXJyKQorICAgIHsKKyAgICAgICAgLyogPC0tIGFkZCBzb21lIHN0YXRpc3RpYyBoZXJlICovCisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKHN5c2IpOworICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlwY19kYXRhLT5zdWJjaCA9IGNoYW5uZWw7CisgICAgZXJyID0gYmNtb3NfbXNnX3NlbmQoJmJjbXRyX3J4cVtkZXZpY2VdLCBtc2csIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIC8qIDwtLSBhZGQgc29tZSBzdGF0aXN0aWMgaGVyZSAqLworICAgIH0KK30KKworLyoqIFJlY2VpdmUgZGF0YSAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX2RpcmVjdF9yZWN2KGJjbXRyX3BsdWdpbl9jaGFubmVsIGNoLCBiY21vbHRfc3ViY2hhbm5lbCAqc3ViY2gsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCkoY2ggPj4gOCk7CisgICAgYmNtb3NfbXNnICptc2c7CisgICAgYmNtdHJfaXBjX2RhdGEgKmRhdGE7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgZXJyID0gYmNtb3NfbXNnX3JlY3YoJmJjbXRyX3J4cVtkZXZpY2VdLCBCQ01UUl9NU0dfVElNRU9VVCwgJm1zZyk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9USU1FT1VUKQorICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZGF0YSA9IG1zZy0+ZGF0YTsKKyAgICAqYnVmID0gZGF0YS0+YnVmOworICAgICpzdWJjaCA9IGRhdGEtPnN1YmNoOworICAgIC8qIFByZXZlbnQgYnVmZmVyIHJlbGVhc2Ugd2hlbiByZWxlYXNpbmcgT1MgbWVzc2FnZSAqLworICAgIGRhdGEtPmJ1Zi5zdGFydCA9IGRhdGEtPmJ1Zi5jdXJyID0gTlVMTDsKKyAgICBiY21vc19tc2dfZnJlZShtc2cpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBJbml0aWFsaXplIHBsdWdpbiBjYWxsYmFja3MKKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIGRyaXZlciBUcmFuc3BvcnQgcGx1Z2luIGRyaXZlciBzdHJ1Y3R1cmUKKyAqIFxyZXR1cm4gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9wbHVnaW5faW5pdChiY210cl9wbHVnaW5fY2ZnICpjZmcsIGJjbXRyX2RyaXZlciAqZHJpdmVyKQoreworICAgIGRyaXZlci0+b3BlbiA9IGJjbXRyX2RpcmVjdF9vcGVuOworICAgIGRyaXZlci0+Y2xvc2UgPSBiY210cl9kaXJlY3RfY2xvc2U7CisgICAgZHJpdmVyLT5yZWN2ID0gYmNtdHJfZGlyZWN0X3JlY3Y7CisgICAgZHJpdmVyLT5zZW5kID0gYmNtdHJfZGlyZWN0X3NlbmQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL211eC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9tdXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWNmNzM2YQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9tdXgvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIworIyAgdHJhbnNwb3J0IHBsdWdpbgorIworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisKK2lmZXEgKCIkKENPTkZJR19UUkFOU1BPUlRfUkFXKSIsICJ5IikKK01PRF9OQU1FID0gdHJfcGx1Z2luX211eAorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gIHRyX3BsdWdpbl9yYXcgdHJfcGx1Z2luX3Jhd191ZCAgCisKK01PRF9ERUZTID0gLURCQ01UUl9QTFVHSU5fUkFXCisKK3NyY3MgPSBiY210cl9ubF91ZF9tdXguYworCitlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9tdXgvYmNtdHJfbmxfdWRfbXV4LmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vbXV4L2JjbXRyX25sX3VkX211eC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhYmFmNDcKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vbXV4L2JjbXRyX25sX3VkX211eC5jCkBAIC0wLDAgKzEsNDAgQEAKKw0KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4NCisjaW5jbHVkZSA8YmNtdHJfcGx1Z2luLmg+DQorI2luY2x1ZGUgImJjbW9sdF90cl91ZC5oIg0KKyNpbmNsdWRlICJiY21vbHRfdHJfbmwuaCINCisjaW5jbHVkZSAiYmNtdHJfaW50ZXJuYWwuaCINCisNCitzdGF0aWMgYmNtb3NfYm9vbCB1c2VfaW5iYW5kID0gQkNNT1NfRkFMU0U7DQordm9pZCB1c2luZ19pbmJhbmRfc2V0KGJjbW9zX2Jvb2wgdXNpbmdfaW5iYW5kKQ0KK3sNCisgICAgdXNlX2luYmFuZCA9IHVzaW5nX2luYmFuZDsNCit9DQorYmNtb3NfYm9vbCB1c2luZ19pbmJhbmRfZ2V0KHZvaWQpDQorew0KKyAgICByZXR1cm4gdXNlX2luYmFuZDsNCit9DQorDQorDQorLyoqIEluaXRpYWxpemUgcGx1Z2luIGNhbGxiYWNrcw0KKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIGRyaXZlciBUcmFuc3BvcnQgcGx1Z2luIGRyaXZlciBzdHJ1Y3R1cmUNCisgKiBccmV0dXJuIGVycm9yIGNvZGUNCisgKi8NCitiY21vc19lcnJubyBiY210cl9wbHVnaW5faW5pdChiY210cl9wbHVnaW5fY2ZnICpwbHVnaW5fY2ZnLCBiY210cl9kcml2ZXIgKmRyaXZlcikNCit7DQorICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOw0KKw0KKyNpZmRlZiBTSU1VTEFUSU9OX0JVSUxEDQorICAgIHJjID0gYmNtdHJfcGx1Z2luX2luaXQocGx1Z2luX2NmZywgZHJpdmVyKTsNCisjZWxzZQ0KKyAgICBpZiAodXNpbmdfaW5iYW5kX2dldCgpKQ0KKyAgICB7DQorICAgICAgICByYyA9IGJjbXRyX3VkX3BsdWdpbl9pbml0KHBsdWdpbl9jZmcsIGRyaXZlcik7DQorICAgIH0gZWxzZQ0KKyAgICB7DQorICAgICAgICByYyA9IGJjbXRyX25sX3BsdWdpbl9pbml0KHBsdWdpbl9jZmcsIGRyaXZlcik7DQorICAgIH0NCisjZW5kaWYNCisNCisgICAgcmV0dXJuIHJjOw0KK30NCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X25sL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQ3NzIyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE5MIHRyYW5zcG9ydCBwbHVnaW4KKyMKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQoraWZlcSAoIiQoQ09ORklHX1RSQU5TUE9SVF9SQVcpIiwgInkiKQorCitNT0RfTkFNRSA9IHRyX3BsdWdpbl9yYXcKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IHRyX3BsdWdpbgorTU9EX0RFRlMgPSAtREJDTVRSX1BMVUdJTl9SQVcKKworc3JjcyA9IGJjbW9sdF90cl9wbHVnaW5fbmxfc29ja2V0LmMKKworZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X25sL2JjbW9sdF90cl9ubC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9iY21vbHRfdHJfbmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzA3YzNjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9iY21vbHRfdHJfbmwuaApAQCAtMCwwICsxLDQwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTU9MVF9UUl9OTF9IXworI2RlZmluZSBCQ01PTFRfVFJfTkxfSF8KKworI2luY2x1ZGUgImJjbXRyX2ludGVybmFsLmgiCisKKy8qIE5MIGZhbWlseS4gTXVzdCBiZSBzb21lIHVudXNlZCBudW1iZXIgKi8KKyNkZWZpbmUgQkNNVFJfTkxfRkFNSUxZICAgICAgICAgMjgKKworYmNtb3NfZXJybm8gYmNtdHJfbmxfcGx1Z2luX2luaXQoYmNtdHJfcGx1Z2luX2NmZyAqY2ZnLCBiY210cl9kcml2ZXIgKmRyaXZlcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9iY21vbHRfdHJfcGx1Z2luX25sX3NvY2tldC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9iY21vbHRfdHJfcGx1Z2luX25sX3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNDUyMzQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X25sL2JjbW9sdF90cl9wbHVnaW5fbmxfc29ja2V0LmMKQEAgLTAsMCArMSwzMzkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtdHJfcGx1Z2luLmg+CisjaW5jbHVkZSA8YmNtX2NvbmZpZy5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl9ubC5oPgorCisjZGVmaW5lIEJDTU5MX1RYUFJFRklYX0xFTiAgICAgIChOTE1TR19IRFJMRU4gKyBzaXplb2YodWludDMyX3QpKQorCisKKy8qIEJ1ZmZlciBsaXN0IGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJfbmxfYnVmIGJjbXRyX25sX2J1ZjsKK3N0cnVjdCBiY210cl9ubF9idWYKK3sKKyAgICBTVEFJTFFfRU5UUlkoYmNtdHJfbmxfYnVmKSBsaXN0OworICAgIHVpbnQzMl90IGxlbjsgLyoqPCBUb3RhbCBMZW5ndGggb2YgYnVmZmVyICovCit9OworCisvKiBQbHVnaW4gY2hhbm5lbCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IGJjbXRyX25sX2NoYW5uZWwKK3sKKyAgICBpbnQgZGV2aWNlOyAgICAgICAgIC8qIERldmljZSAqLworICAgIFNUQUlMUV9IRUFEKG5sX2J1Zl9saXN0LCBiY210cl9ubF9idWYpIGJ1Zl9saXN0OworICAgIGJjbW9zX3NlbSBzZW07ICAgICAgLyogU2VtYXBob3JlIHRoYXQgaW5kaWNhdGVzIHRoYXQgbmV3IGJ1ZmZlciBpcyBhdmFpbGFibGUgKi8KKyAgICBiY21vc19tdXRleCBsb2NrOyAgIC8qIGxvY2sgdGhhdCBwcm90ZWN0cyB0aGlzIHN0cnVjdHVyZSAqLworfSBiY210cl9ubF9jaGFubmVsOworCisvKiBBIHNpbmdsZSBOTCBzb2NrZXQgaXMgc2hhcmVkIGJ5IG11bHRpcGxlIGRldmljZXMuCisgKiBUaGUgZm9sbG93aW5nIGNvbnRyb2wgYmxvY2sgaXMgdXNlZCBmb3Igc29ja2V0IG11bHRpcGxleGluZworICovCitzdGF0aWMgc3RydWN0Cit7CisgICAgaW50IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXRsaW5rIHNvY2tldCAqLworICAgIGludCB1c2VyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHVzZXJzICovCisgICAgYmNtb3NfbXV0ZXggbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2NrIHRoYXQgcHJvdGVjdHMgdGhpcyBzdHJ1Y3R1cmUgKi8KKyAgICBiY21vc190YXNrIG5sX3J4X3Rhc2s7ICAgICAgICAgICAgICAgICAgICAgIC8qIFRhc2sgdGhhdCByZWFkcyBmcm9tIHRoZSBzaGFyZWQgTkwgc29ja2V0ICovCisgICAgYmNtdHJfbmxfY2hhbm5lbCAqbmxjaFtCQ01UUl9NQVhfT0xUU107ICAgICAvKiBDaGFubmVscyAqLworfSBiY210cl9ubF9jb21tb247CisKKy8qIE5MIHNvY2tldCBSWCB0YXNrIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgYmNtdHJfbmxfcnhfdGFza19oYW5kbGVyKGxvbmcgZGF0YSk7CisKKy8qKiBPcGVuIGZpcnN0IGNvbW11bmljYXRpb24gY2hhbm5lbCAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX25sX29wZW5fZmlyc3Qodm9pZCkKK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgc2EgPSB7fTsKKyAgICBiY21vc190YXNrX3Bhcm0gdHAgPSB7CisgICAgICAgIC5uYW1lID0gIm5sX3R4IiwKKyAgICAgICAgLmhhbmRsZXIgPSBiY210cl9ubF9yeF90YXNrX2hhbmRsZXIsCisgICAgICAgIC5wcmlvcml0eSA9IFRBU0tfUFJJT1JJVFlfVFJBTlNQT1JUX1JYCisgICAgfTsKKyAgICBpbnQgczsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBzID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBCQ01UUl9OTF9GQU1JTFkpOworICAgIGlmIChzIDwgMCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0NPTU1fRkFJTCwgIkNhbid0IGNyZWF0ZSBOTCBzb2NrZXRcbiIpOworICAgIH0KKworICAgIC8qIENvbm5lY3QgdG8gcmVtb3RlICovCisgICAgc2EubmxfcGlkID0gMDsKKyAgICBpZiAoY29ubmVjdChzLCAoc3RydWN0IHNvY2thZGRyKikmc2EsIHNpemVvZihzYSkpID09IC0xKQorICAgIHsKKyAgICAgICAgY2xvc2Uocyk7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0NPTU1fRkFJTCwgIkNhbid0IGNvbm5lY3QgTkwgc29ja2V0LiBlcnJvciAlZCAoJXMpXG4iLAorICAgICAgICAgICAgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorCisgICAgLyogQmluZCBsb2NhbCAqLworICAgIHNhLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisgICAgc2EubmxfcGlkID0gZ2V0cGlkKCk7CisgICAgaWYgKGJpbmQocywgKHN0cnVjdCBzb2NrYWRkciopJnNhLCBzaXplb2Yoc2EpICkgPT0gLTEpCisgICAgeworICAgICAgICBjbG9zZShzKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfQ09NTV9GQUlMLCAiQ2FuJ3QgYmluZCBOTCBzb2NrZXQuIGVycm9yICVkICglcylcbiIsCisgICAgICAgICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisKKyAgICBiY210cl9ubF9jb21tb24ucyA9IHM7CisKKyAgICAvKiBDcmVhdGUgUlggdGhyZWFkICovCisgICAgZXJyID0gYmNtb3NfdGFza19jcmVhdGUoJmJjbXRyX25sX2NvbW1vbi5ubF9yeF90YXNrLCAmdHApOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBjbG9zZShzKTsKKyAgICAgICAgYmNtdHJfbmxfY29tbW9uLnMgPSAwOworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9DT01NX0ZBSUwsICJDYW4ndCBjcmVhdGUgTkwgUlggdGhyZWFkLiBlcnJvciAlZCAoJXMpXG4iLAorICAgICAgICAgICAgZXJyLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIENsb3NlIGxhc3QgY29tbXVuaWNhdGlvbiBjaGFubmVsICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfbmxfY2xvc2VfbGFzdCh2b2lkKQoreworICAgIGNsb3NlKGJjbXRyX25sX2NvbW1vbi5zKTsKKyAgICByZXR1cm4gYmNtb3NfdGFza19kZXN0cm95KCZiY210cl9ubF9jb21tb24ubmxfcnhfdGFzayk7Cit9CisKKy8qKiBPcGVuIGNvbW11bmljYXRpb24gY2hhbm5lbCAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX25sX29wZW4oaW50IGRldmljZSwgYmNtdHJfcGx1Z2luX2NmZyAqY2ZnLCBiY210cl9wbHVnaW5fY2hhbm5lbCAqY2gpCit7CisgICAgYmNtdHJfbmxfY2hhbm5lbCAqbmxjaDsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgaWYgKCh1bnNpZ25lZClkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJEZXZpY2UgJWQgaXMgaW52YWxpZFxuIik7CisKKyAgICBpZiAoYmNtdHJfbmxfY29tbW9uLm5sY2hbZGV2aWNlXSkKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfQUxSRUFEWSwgIkNoYW5uZWwgZm9yIGRldmljZSAlZCBpcyBhbHJlYWR5IG9wZW5lZFxuIik7CisKKyAgICBubGNoID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbmxjaCkpOworICAgIGlmICghbmxjaCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PTUVNLCAiTm8gbWVtb3J5XG4iKTsKKyAgICB9CisgICAgbmxjaC0+ZGV2aWNlID0gZGV2aWNlOworICAgIFNUQUlMUV9JTklUKCZubGNoLT5idWZfbGlzdCk7CisgICAgZXJyID0gYmNtb3NfbXV0ZXhfY3JlYXRlKCZubGNoLT5sb2NrLCAwLCAidHJfbmxjaCIpOworICAgIGVyciA9IGVyciA/IGVyciA6IGJjbW9zX3NlbV9jcmVhdGUoJm5sY2gtPnNlbSwgMCwgMCwgInRyX25sY2giKTsKKworICAgIC8qIFRpZSBpbiB3aXRoIHRoZSBjb250cm9sIGJsb2NrIHNoYXJlZCBieSBhbGwgZGV2aWNlcyAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbXRyX25sX2NvbW1vbi5sb2NrKTsKKyAgICBpZiAoIWJjbXRyX25sX2NvbW1vbi51c2VycykKKyAgICAgICAgZXJyID0gZXJyID8gZXJyIDogYmNtdHJfbmxfb3Blbl9maXJzdCgpOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmJjbXRyX25sX2NvbW1vbi5sb2NrKTsKKyAgICAgICAgYmNtb3NfZnJlZShubGNoKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKGVyciwgIkZhaWxlZCB0byBvcGVuIG9yIGJpbmQgTkwgc29ja2V0XG4iKTsKKyAgICB9CisgICAgKytiY210cl9ubF9jb21tb24udXNlcnM7CisgICAgYmNtdHJfbmxfY29tbW9uLm5sY2hbZGV2aWNlXSA9IG5sY2g7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY210cl9ubF9jb21tb24ubG9jayk7CisKKyAgICAqY2ggPSAoYmNtdHJfcGx1Z2luX2NoYW5uZWwpbmxjaDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogQ2xvc2UgY29tbXVuaWNhdGlvbiBjaGFubmVsICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfbmxfY2xvc2UoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gpCit7CisgICAgYmNtdHJfbmxfY2hhbm5lbCAqbmxjaCA9IChiY210cl9ubF9jaGFubmVsICopY2g7CisgICAgYmNtdHJfbmxfYnVmICpubF9idWYsICpubF9idWZfdG1wOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZiY210cl9ubF9jb21tb24ubG9jayk7CisgICAgaWYgKGJjbXRyX25sX2NvbW1vbi5ubGNoW25sY2gtPmRldmljZV0gPT0gbmxjaCkKKyAgICB7CisgICAgICAgIGJjbXRyX25sX2NvbW1vbi5ubGNoW25sY2gtPmRldmljZV0gPSBOVUxMOworICAgICAgICAtLWJjbXRyX25sX2NvbW1vbi51c2VyczsKKyAgICAgICAgaWYgKGJjbXRyX25sX2NvbW1vbi51c2VycykKKyAgICAgICAgICAgIGVyciA9IGJjbXRyX25sX2Nsb3NlX2xhc3QoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJVbmV4cGVjdGVkIE5MIGNoYW5uZWxcbiIpOworICAgICAgICBlcnIgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbXRyX25sX2NvbW1vbi5sb2NrKTsKKyAgICBiY21vc19tdXRleF9kZXN0cm95KCZubGNoLT5sb2NrKTsKKyAgICBiY21vc19zZW1fZGVzdHJveSgmbmxjaC0+c2VtKTsKKyAgICBTVEFJTFFfRk9SRUFDSF9TQUZFKG5sX2J1ZiwgJm5sY2gtPmJ1Zl9saXN0LCBsaXN0LCBubF9idWZfdG1wKQorICAgIHsKKyAgICAgICAgU1RBSUxRX1JFTU9WRV9IRUFEKCZubGNoLT5idWZfbGlzdCwgbGlzdCk7CisgICAgICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBubF9idWYtPmxlbiwgKHVpbnQ4X3QgKilubF9idWYsIEJDTVRSX0JVRl9FTkRJQU4pOworICAgICAgICBiY21vbHRfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorICAgIGJjbW9zX2ZyZWUobmxjaCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKiogU2VuZCBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfbmxfc2VuZChiY210cl9wbHVnaW5fY2hhbm5lbCBjaCwgYmNtb2x0X3N1YmNoYW5uZWwgc3ViY2gsIGJjbW9sdF9idWYgKmJ1ZiwKKyAgICBiY210cl9zZW5kX2ZsYWdzIGZsYWdzKQoreworICAgIGJjbXRyX25sX2NoYW5uZWwgKm5sY2ggPSAoYmNtdHJfbmxfY2hhbm5lbCAqKWNoOworICAgIGludCB0b3RhbF9sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKGJ1Zik7CisgICAgc3RydWN0IG5sbXNnaGRyICpubG1zZ19oZHIgPSAoc3RydWN0IG5sbXNnaGRyICopKGxvbmcpYnVmLT5zdGFydDsKKyAgICBzdHJ1Y3QgaW92ZWMgaW92ID0geyBidWYtPnN0YXJ0LCAuaW92X2xlbj10b3RhbF9sZW4gfTsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsgLm1zZ19pb3YgPSAmaW92LCAubXNnX2lvdmxlbiA9IDEgfTsKKyAgICBpbnQgcmM7CisKKyAgICBubG1zZ19oZHItPm5sbXNnX2xlbiA9IHRvdGFsX2xlbjsKKyAgICBubG1zZ19oZHItPm5sbXNnX3BpZCA9IGdldHBpZCgpOworICAgIGJ1Zi0+c3RhcnRbTkxNU0dfSERSTEVOXSA9IG5sY2gtPmRldmljZTsKKworICAgIHJjID0gc2VuZG1zZyhiY210cl9ubF9jb21tb24ucywgJm1zZywgMCk7CisKKyAgICByZXR1cm4gKHJjID09IHRvdGFsX2xlbikgPyBCQ01fRVJSX09LIDogQkNNX0VSUl9DT01NX0ZBSUw7Cit9CisKKy8qIE5MIHNvY2tldCBSWCB0YXNrIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgYmNtdHJfbmxfcnhfdGFza19oYW5kbGVyKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc190YXNrICpteV90YXNrID0gYmNtb3NfdGFza19jdXJyZW50KCk7CisgICAgc3RydWN0IGlvdmVjIGlvdjsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsgLm1zZ19pb3YgPSAmaW92LCAubXNnX2lvdmxlbiA9IDEgfTsKKyAgICB1aW50MzJfdCBkZXZpY2U7CisgICAgYmNtb2x0X2J1ZiBidWYgPSB7fTsKKyAgICBiY210cl9ubF9idWYgKm5sX2J1ZjsKKyAgICBiY210cl9ubF9jaGFubmVsICpubGNoOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBpbnQgcmM7CisKKyAgICB3aGlsZSAoIW15X3Rhc2stPmRlc3Ryb3lfcmVxdWVzdCkKKyAgICB7CisgICAgICAgIGVyciA9IGJjbW9sdF9idWZfYWxsb2MoJmJ1ZiwgQkNNVFJfTUFYX01UVV9TSVpFICsgQkNNTkxfVFhQUkVGSVhfTEVOLCBCQ01UUl9CVUZfRU5ESUFOKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2UgYXJlIG91dCBvZiBtZW1vcnksIGhvcGVmdWxseSB0ZW1wb3JhcnkuIFdhaXQgYW5kIGNvbnRpbnVlICovCisgICAgICAgICAgICBiY21vc191c2xlZXAoMTAwMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpb3YuaW92X2Jhc2UgPSBidWYuc3RhcnQ7CisgICAgICAgIGlvdi5pb3ZfbGVuID0gYnVmLmxlbjsKKworICAgICAgICAvKiBXYWl0IGZvciBtZXNzYWdlICovCisgICAgICAgIHJjID0gcmVjdm1zZyhiY210cl9ubF9jb21tb24ucywgJm1zZywgMCk7CisgICAgICAgIGlmIChyYyA8IE5MTVNHX0hEUkxFTikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJGYXRhbCBlcnJvci4gcmVjdm1zZygpIGZhaWxlZCB3aXRoIGVycm9yICVkICglcylcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBEZXZpY2UgZm9sbG93cyBOTCBoZWFkZXIgKi8KKyAgICAgICAgbWVtY3B5KCZkZXZpY2UsIGJ1Zi5zdGFydCArIE5MTVNHX0hEUkxFTiwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMgfHwgIShubGNoID0gYmNtdHJfbmxfY29tbW9uLm5sY2hbZGV2aWNlXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiR290IG1lc3NhZ2UgZnJvbSB1bmV4cGVjdGVkIGRldmljZSAldS4gSWdub3JlZFxuIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfZnJlZSgmYnVmKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogUHV0IG1lc3NhZ2Ugb24gdGhlIGNoYW5uZWwncyBxdWV1ZSAqLworICAgICAgICBubF9idWYgPSAoYmNtdHJfbmxfYnVmICopKGxvbmcpYnVmLnN0YXJ0OworICAgICAgICBubF9idWYtPmxlbiA9IHJjOworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZubGNoLT5sb2NrKTsKKyAgICAgICAgU1RBSUxRX0lOU0VSVF9UQUlMKCZubGNoLT5idWZfbGlzdCwgbmxfYnVmLCBsaXN0KTsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZubGNoLT5sb2NrKTsKKyAgICAgICAgYmNtb3Nfc2VtX3Bvc3QoJm5sY2gtPnNlbSk7CisKKyAgICAgICAgLyogQnVmZmVyIGlzIGluIHVzZSBlbHNld2hlcmUgKi8KKyAgICAgICAgYnVmLnN0YXJ0ID0gYnVmLmN1cnIgPSBOVUxMOworICAgIH0KKworICAgIGJjbW9sdF9idWZfZnJlZSgmYnVmKTsKKyAgICBteV90YXNrLT5kZXN0cm95ZWQgPSBCQ01PU19UUlVFOworICAgIHJldHVybiAwOworfQorCisvKiogUmVjZWl2ZSBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfbmxfcmVjdihiY210cl9wbHVnaW5fY2hhbm5lbCBjaCwgYmNtb2x0X3N1YmNoYW5uZWwgKnN1YmNoLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgYmNtdHJfbmxfY2hhbm5lbCAqbmxjaCA9IChiY210cl9ubF9jaGFubmVsICopY2g7CisgICAgYmNtdHJfbmxfYnVmICpubF9idWY7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgZXJyID0gYmNtb3Nfc2VtX3dhaXQoJm5sY2gtPnNlbSwgQkNNVFJfTVNHX1RJTUVPVVQgKiAxMDAwKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGJjbW9zX211dGV4X2xvY2soJm5sY2gtPmxvY2spOworICAgIG5sX2J1ZiA9IFNUQUlMUV9GSVJTVCgmbmxjaC0+YnVmX2xpc3QpOworICAgIGlmICghbmxfYnVmKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZubGNoLT5sb2NrKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQ09NTV9GQUlMOworICAgIH0KKyAgICBTVEFJTFFfUkVNT1ZFX0hFQUQoJm5sY2gtPmJ1Zl9saXN0LCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJm5sY2gtPmxvY2spOworCisgICAgLyogR290IGJ1ZmZlciAqLworICAgIGJjbW9sdF9idWZfaW5pdChidWYsIG5sX2J1Zi0+bGVuLCAodWludDhfdCAqKW5sX2J1ZiwgQkNNVFJfQlVGX0VORElBTik7CisgICAgYnVmLT5jdXJyID0gYnVmLT5zdGFydCArIEJDTU5MX1RYUFJFRklYX0xFTjsKKworICAgICpzdWJjaCA9IDA7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEluaXRpYWxpemUgcGx1Z2luIGNhbGxiYWNrcworICogXHBhcmFtW2luLG91dF0gICAgICAgZHJpdmVyIFRyYW5zcG9ydCBwbHVnaW4gZHJpdmVyIHN0cnVjdHVyZQorICogXHJldHVybiBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX25sX3BsdWdpbl9pbml0KGJjbXRyX3BsdWdpbl9jZmcgKmNmZywgYmNtdHJfZHJpdmVyICpkcml2ZXIpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgYmNtb3NfcHJpbnRmKCJMYXVuY2hpbmcgd2l0aCBhIG5ldGxpbmsgY29ubmVjdGlvblxuIik7CisKKyAgICBkcml2ZXItPm9wZW4gPSBiY210cl9ubF9vcGVuOworICAgIGRyaXZlci0+Y2xvc2UgPSBiY210cl9ubF9jbG9zZTsKKyAgICBkcml2ZXItPnJlY3YgPSBiY210cl9ubF9yZWN2OworICAgIGRyaXZlci0+c2VuZCA9IGJjbXRyX25sX3NlbmQ7CisgICAgY2ZnLT5oZWFkcm9vbSA9IEJDTU5MX1RYUFJFRklYX0xFTjsKKworICAgIGVyciA9IGJjbW9zX211dGV4X2NyZWF0ZSgmYmNtdHJfbmxfY29tbW9uLmxvY2ssIDAsICJ0cl9ubCIpOworCisgICAgcmV0dXJuIGVycjsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd191ZC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9yYXdfdWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDEyNmVmMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9yYXdfdWQvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIworIyBVbml4IERvbWFpbiB0cmFuc3BvcnQgcGx1Z2luCisjCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKK2lmZXEgKCIkKENPTkZJR19UUkFOU1BPUlRfUkFXKSIsICJ5IikKKworTU9EX05BTUUgPSB0cl9wbHVnaW5fcmF3X3VkCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSB0cl9wbHVnaW4KKworc3JjcyA9IGJjbW9sdF90cl9wbHVnaW5fdWRfc29ja2V0LmMKKworZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X3VkL2JjbW9sdF90cl9wbHVnaW5fdWRfc29ja2V0LmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X3VkL2JjbW9sdF90cl9wbHVnaW5fdWRfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTRkOTAwMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9yYXdfdWQvYmNtb2x0X3RyX3BsdWdpbl91ZF9zb2NrZXQuYwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtdHJfcGx1Z2luLmg+CisjaW5jbHVkZSA8YmNtX2NvbmZpZy5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl91ZC5oPgorCitjaGFyIHNvY2tldF9wYXRoW10gPSBTT0NLRVRfUEFUSDsKKy8qIFBsdWdpbiBjaGFubmVsIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJfdWRfY2hhbm5lbAoreworICAgIGludCBkZXZpY2U7ICAgICAgICAgLyogRGV2aWNlICovCisgICAgaW50IHNvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVRCBzb2NrZXQgKi8KK30gYmNtdHJfdWRfY2hhbm5lbDsKKworCisvKiBUaGlzIHBsdWdpbiBzdG9yZXMgYm90aCBkZXZpY2UgaWQgYW5kIHBlci1kZXZpY2Ugc29ja2V0IGhhbmRsZSBpbgorICogdHJhbnNwb3J0J3MgY2hhbm5lbF9pZCBoYW5kbGUgYXMKKyAqIChkZXZpY2VfaWQgPDwgMjQpIHwgc29ja2V0X2hhbmRsZS4KKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHJlY292ZXIgc29ja2V0X2hhbmRsZSBhbmQgZGV2aWNlX2lkIGZyb20gdGhlIGNoYW5uZWxfaWQgaGFuZGxlCisgKi8KKworCisvKiogT3BlbiBjb21tdW5pY2F0aW9uIGNoYW5uZWwgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY210cl91ZF9vcGVuKGludCBkZXZpY2UsIGJjbXRyX3BsdWdpbl9jZmcgKmNmZywgYmNtdHJfcGx1Z2luX2NoYW5uZWwgKmNoKQoreworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICAgIGJjbXRyX3VkX2NoYW5uZWwgKnVkY2g7CisKKyAgICB1ZGNoID0gYmNtb3NfY2FsbG9jKHNpemVvZigqdWRjaCkpOworICAgIGlmICghdWRjaCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PTUVNLCAiTm8gbWVtb3J5XG4iKTsKKyAgICB9CisKKyAgICBpZiAoICh1ZGNoLT5zb2NrID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpIHsKKyAgICAgICAgICAgIHBlcnJvcigic29ja2V0IGVycm9yIik7CisgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgICAgICAgYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgICAgICAgQlVHX09OKHNpemVvZihzb2NrZXRfcGF0aCk+PXNpemVvZihhZGRyLnN1bl9wYXRoKSk7CisgICAgICAgIG1lbWNweShhZGRyLnN1bl9wYXRoLCBzb2NrZXRfcGF0aCwgc2l6ZW9mKHNvY2tldF9wYXRoKSk7CisKKyAgICAgICAgaWYgKGNvbm5lY3QodWRjaC0+c29jaywgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSkgPT0gLTEpIHsKKyAgICAgICAgICAgIHBlcnJvcigiY29ubmVjdCBlcnJvciIpOworICAgICAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIH0KKworICAgIGJjbW9zX3ByaW50ZigiT3BlbmVkICVkXG4iLCB1ZGNoLT5zb2NrKTsKKworICAgIHVkY2gtPmRldmljZSA9IGRldmljZTsKKworICAgICpjaCA9IChiY210cl9wbHVnaW5fY2hhbm5lbCl1ZGNoOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBDbG9zZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY210cl91ZF9jbG9zZShiY210cl9wbHVnaW5fY2hhbm5lbCBjaCkKK3sKKyAgICBiY210cl91ZF9jaGFubmVsICp1ZGNoID0gKGJjbXRyX3VkX2NoYW5uZWwgKiljaDsKKworICAgIGJjbW9zX3ByaW50ZigiQ2xvc2VkICVkXG4iLCB1ZGNoLT5zb2NrKTsKKyAgICAgICAgY2xvc2UodWRjaC0+c29jayk7CisgICAgYmNtb3NfZnJlZSh1ZGNoKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogU2VuZCBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfdWRfc2VuZChiY210cl9wbHVnaW5fY2hhbm5lbCBjaCwgYmNtb2x0X3N1YmNoYW5uZWwgc3ViY2gsIGJjbW9sdF9idWYgKmJ1ZiwKKyAgICBiY210cl9zZW5kX2ZsYWdzIGZsYWdzKQoreworICAgIGJjbXRyX3VkX2NoYW5uZWwgKnVkY2ggPSAoYmNtdHJfdWRfY2hhbm5lbCAqKWNoOworICAgIGludCBidWZsZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKGJ1Zik7CisgICAgaW50IGxlbjsKKyAgICBsZW4gPSBzZW5kKHVkY2gtPnNvY2ssIGJ1Zi0+c3RhcnQsIGJ1ZmxlbiwgMCk7CisgCisgICAgaWYgKGxlbiA8IGJ1ZmxlbikKKyAgICB7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXM6IHNvY2tfc2VuZG1zZygldSkgLS0+ICVkLiBlcnJubz0lZFxuIiwgX19GVU5DVElPTl9fLCBidWZsZW4sIGxlbiwgZXJybm8pOworICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBSZWNlaXZlIGRhdGEgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY210cl91ZF9yZWN2KGJjbXRyX3BsdWdpbl9jaGFubmVsIGNoLCBiY21vbHRfc3ViY2hhbm5lbCAqc3ViY2gsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBiY210cl91ZF9jaGFubmVsICp1ZGNoID0gKGJjbXRyX3VkX2NoYW5uZWwgKiljaDsKKyAgICBpbnQgbGVuOworICAgIGZkX3NldCByZWFkX2ZkczsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgaW50IHJjOworCisgICAgRkRfWkVSTygmcmVhZF9mZHMpOworICAgIEZEX1NFVCh1ZGNoLT5zb2NrLCAmcmVhZF9mZHMpOworICAgIHR2LnR2X3NlYyA9IDA7CisgICAgdHYudHZfdXNlYyA9IEJDTVRSX01TR19USU1FT1VUICogMTAwMDsKKworICAgIHJjID0gc2VsZWN0KHVkY2gtPnNvY2sgKyAxLCAmcmVhZF9mZHMsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgaWYgKHJjIDwgMCkKKyAgICB7CisgICAgICAgIHBlcnJvcigic2VsZWN0Iik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisgICAgaWYgKCFyYyB8fCAhRkRfSVNTRVQodWRjaC0+c29jaywgJnJlYWRfZmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1RJTUVPVVQ7CisgICAgfQorCisgICAgZXJyID0gYmNtb2x0X2J1Zl9hbGxvYyhidWYsIEJDTVRSX01BWF9NVFVfU0laRSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworCisgICAgbGVuID0gcmVjdih1ZGNoLT5zb2NrLCBidWYtPnN0YXJ0LCBCQ01UUl9NQVhfTVRVX1NJWkUsIDApOworICAgIGlmIChsZW4gPD0gMCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfZnJlZShidWYpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgfQorCisgICAgYmNtb3NfcHJpbnRmKCJSZWNlaXZlZCAlZCBieXRlcyBmcm9tIGRldl9jb250cm9sXG4iLCBsZW4pOworCisgICAgYnVmLT5sZW4gPSBsZW47CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBJbml0aWFsaXplIHBsdWdpbiBjYWxsYmFja3MKKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIGRyaXZlciBUcmFuc3BvcnQgcGx1Z2luIGRyaXZlciBzdHJ1Y3R1cmUKKyAqIFxyZXR1cm4gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl91ZF9wbHVnaW5faW5pdChiY210cl9wbHVnaW5fY2ZnICpjZmcsIGJjbXRyX2RyaXZlciAqZHJpdmVyKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBiY21vc19wcmludGYoIkxhdW5jaGluZyB3aXRoIGEgdW5peCBkb21haW4gY29ubmVjdGlvblxuIik7CisKKyAgICBkcml2ZXItPm9wZW4gPSBiY210cl91ZF9vcGVuOworICAgIGRyaXZlci0+Y2xvc2UgPSBiY210cl91ZF9jbG9zZTsKKyAgICBkcml2ZXItPnJlY3YgPSBiY210cl91ZF9yZWN2OworICAgIGRyaXZlci0+c2VuZCA9IGJjbXRyX3VkX3NlbmQ7CisgICAgY2ZnLT5oZWFkcm9vbSA9IEJDTVVEX1RYUFJFRklYX0xFTjsKKworICAgIHJldHVybiBlcnI7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9yYXdfdWQvYmNtb2x0X3RyX3VkLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X3VkL2JjbW9sdF90cl91ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjYTMyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X3VkL2JjbW9sdF90cl91ZC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX1RSX1VEX0hfCisjZGVmaW5lIEJDTU9MVF9UUl9VRF9IXworCisjaW5jbHVkZSAiYmNtdHJfaW50ZXJuYWwuaCIKKworI2RlZmluZSBCQ01VRF9UWFBSRUZJWF9MRU4gKHNpemVvZih1aW50MzJfdCkpCisKKyNkZWZpbmUgU09DS0VUX1BBVEggIlwwYmNtNjg2MjAiCisKK2JjbW9zX2Vycm5vIGJjbXRyX3VkX3BsdWdpbl9pbml0KGJjbXRyX3BsdWdpbl9jZmcgKmNmZywgYmNtdHJfZHJpdmVyICpkcml2ZXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi91ZHAvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vdWRwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDZlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vdWRwL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMgVHJhbnNwb3J0OiBVRFAgUGx1Z2luCisjCisKK0NPTkZJR19UUkFOU1BPUlRfUkFXID89IG4KK0NPTkZJR19UUkFOU1BPUlRfVURQID89IHkKK2lmZXEgKCIkKENPTkZJR19UUkFOU1BPUlRfUkFXKSIsICJ5IikKKwlDT05GSUdfVFJBTlNQT1JUX1VEUCA9IG4KK2VuZGlmCisKK2lmZXEgKCIkKENPTkZJR19UUkFOU1BPUlRfVURQKSIsICJ5IikKK01PRF9OQU1FID0gdHJfcGx1Z2luX3VkcAorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gdHJfcGx1Z2luCitNT0RfREVGUyA9IC1EQkNNVFJfVURQX1NVUFBPUlQKKworc3JjcyA9IGJjbXRyX3BsdWdpbl91ZHBfc29ja2V0LmMKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vdWRwL2JjbXRyX3BsdWdpbl91ZHBfc29ja2V0LmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vdWRwL2JjbXRyX3BsdWdpbl91ZHBfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiNDQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi91ZHAvYmNtdHJfcGx1Z2luX3VkcF9zb2NrZXQuYwpAQCAtMCwwICsxLDIyMCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPGJjbXRyX3BsdWdpbi5oPgorI2luY2x1ZGUgPGJjbV9jb25maWcuaD4KKworLyogTGFzdCBzZWVuIGhvc3QgSVAgYW5kIHBvcnQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW4gcGVlcl9zYVtCQ01UUl9NQVhfT0xUU107CisKKy8qIFRoaXMgcGx1Z2luIHN0b3JlcyBib3RoIGRldmljZSBpZCBhbmQgcGVyLWRldmljZSBzb2NrZXQgaGFuZGxlIGluCisgKiB0cmFuc3BvcnQncyBjaGFubmVsX2lkIGhhbmRsZSBhcworICogKGRldmljZV9pZCA8PCAyNCkgfCBzb2NrZXRfaGFuZGxlLgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcmVjb3ZlciBzb2NrZXRfaGFuZGxlIGFuZCBkZXZpY2VfaWQgZnJvbSB0aGUgY2hhbm5lbF9pZCBoYW5kbGUKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBfYmNtdHJfY2hhbm5lbF90b19zb2NrZXQoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gpCit7CisgICAgcmV0dXJuIChpbnQpKGNoICYgMHhmZmZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfYmNtdHJfY2hhbm5lbF90b19kZXZpY2UoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gpCit7CisgICAgcmV0dXJuIChpbnQpKChjaCA+PiAyNCkgJiAweGZmKTsKK30KKworLyoqIE9wZW4gY29tbXVuaWNhdGlvbiBjaGFubmVsICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfdWRwX29wZW4oaW50IGRldmljZSwgYmNtdHJfcGx1Z2luX2NmZyAqY2ZnLCBiY210cl9wbHVnaW5fY2hhbm5lbCAqY2gpCit7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhID0ge307CisgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dCA9IHsgLnR2X3NlYyA9IDAsIC50dl91c2VjID0gQkNNVFJfTVNHX1RJTUVPVVQgKiAxMDAwIH07ICAKKyAgICBpbnQgczsKKworICAgIHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgaWYgKHMgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfQ09NTV9GQUlMLCAiQ2FuJ3QgY3JlYXRlIFVEUCBzb2NrZXRcbiIpOworICAgIH0KKworICAgIC8qIEJpbmQgbG9jYWwgKi8KKyAgICBzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBzYS5zaW5fcG9ydCA9IGh0b25zKGNmZy0+eC51ZHAubXlfcG9ydCk7CisgICAgc2Euc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgICBpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyKikmc2EsIHNpemVvZihzYSkgKSA9PSAtMSkKKyAgICB7CisgICAgICAgIGNsb3NlKHMpOworICAgICAgICBwZXJyb3IoImJpbmQiKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfQ09NTV9GQUlMLCAiQ2FuJ3QgYmluZCBVRFAgc29ja2V0IHRvICVkLiVkLiVkLiVkOiVkXG4iLAorICAgICAgICAgICAgKGludCkoY2ZnLT54LnVkcC5teV9pcCA+PiAyNCksIChpbnQpKChjZmctPngudWRwLm15X2lwID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgKGludCkoKGNmZy0+eC51ZHAubXlfaXAgPj4gOCkgJiAweGZmKSwgKGludCkoY2ZnLT54LnVkcC5teV9pcCAmIDB4ZmYpLAorICAgICAgICAgICAgKGludCljZmctPngudWRwLm15X3BvcnQpOworICAgIH0KKyAgICBiY21vc19wcmludGYoIiVzOiBzb2NrZXQgYm91bmQgdG8gcG9ydCAlZFxuIiwgX19GVU5DVElPTl9fLCAoaW50KWNmZy0+eC51ZHAubXlfcG9ydCk7CisKKyAgICBpZiAoc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19TTkRUSU1FTywgKGNoYXIgKikmdGltZW91dCwgc2l6ZW9mKHRpbWVvdXQpKSA8IDApCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9DT01NX0ZBSUwsICJDYW4ndCBzZXQgc29ja2V0IG9wdGlvbiBmb3Igc2VuZCB0aW1lb3V0XG4iKTsKKyAgICB9CisKKyAgICAvKiBDb25uZWN0IHRvIHJlbW90ZSAqLworICAgIGlmIChjZmctPngudWRwLnJlbW90ZV9wb3J0KQorICAgIHsKKyAgICAgICAgcGVlcl9zYVtkZXZpY2VdLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBwZWVyX3NhW2RldmljZV0uc2luX3BvcnQgPSBodG9ucyhjZmctPngudWRwLnJlbW90ZV9wb3J0KTsKKyAgICAgICAgcGVlcl9zYVtkZXZpY2VdLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGNmZy0+eC51ZHAucmVtb3RlX2lwKTsKKyAgICB9CisgICAgKmNoID0gKGRldmljZSA8PCAyNCkgfCBzOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIHByaW50IGVycm9yIG1lc3NhZ2Ugd2l0aCB0aHJvdHRsaW5nOiBub3Qgb2Z0ZW5lciB0aGFuIG9uZXMgcGVyIHNlY29uZCAqLworc3RhdGljIHZvaWQgX2JjbXRyX3VkcF9wcmludF9lcnIoYmNtb3NfZXJybm8gZXJyLCBjb25zdCBjaGFyICplcnJfbXNnKQoreworICAgIHN0YXRpYyBpbnQgbmVycm9yczsKKyAgICBzdGF0aWMgdWludDMyX3QgbGFzdF90aW1lc3RhbXA7CisKKyAgICArK25lcnJvcnM7CisKKyAgICBpZiAoIWxhc3RfdGltZXN0YW1wIHx8IGJjbW9zX3RpbWVzdGFtcCgpIC0gbGFzdF90aW1lc3RhbXAgPiAxMDAwMDAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJFcnJvciBpbiBsb3ctbGV2ZWwgVURQIHRyYW5zcG9ydC4gJXMtJXMuIEVycm9ycyBzaW5jZSBsYXN0IHJlcG9ydDogJWRcbiIsCisgICAgICAgICAgICBlcnJfbXNnLCBiY21vc19zdHJlcnJvcihlcnIpLCBuZXJyb3JzKTsKKyAgICAgICAgbGFzdF90aW1lc3RhbXAgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICAgICAgbmVycm9ycyA9IDA7CisgICAgfQorfQorCisvKiogQ2xvc2UgY29tbXVuaWNhdGlvbiBjaGFubmVsICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfdWRwX2Nsb3NlKGJjbXRyX3BsdWdpbl9jaGFubmVsIGNoKQoreworICAgIGNsb3NlKF9iY210cl9jaGFubmVsX3RvX3NvY2tldChjaCkpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogU2VuZCBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfdWRwX3NlbmQoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gsIGJjbW9sdF9zdWJjaGFubmVsIHN1YmNoLCBiY21vbHRfYnVmICpidWYsCisgICAgYmNtdHJfc2VuZF9mbGFncyBmbGFncykKK3sKKyAgICBpbnQgc29jayA9IF9iY210cl9jaGFubmVsX3RvX3NvY2tldChjaCk7CisgICAgaW50IGRldmljZSA9IF9iY210cl9jaGFubmVsX3RvX2RldmljZShjaCk7CisgICAgaW50IGJ1ZmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoYnVmKTsKKyAgICBzdHJ1Y3QgaW92ZWMgaW92ID0geyAuaW92X2Jhc2UgPSBidWYtPnN0YXJ0LCAuaW92X2xlbiA9IGJ1ZmxlbiB9OworICAgIHN0cnVjdCBtc2doZHIgbXNnID0geworICAgICAgICAubXNnX2lvdiA9ICZpb3YsIC5tc2dfaW92bGVuID0gMSwgLm1zZ19mbGFncyA9IDAsCisgICAgICAgIC5tc2dfbmFtZSA9ICh2b2lkICopJnBlZXJfc2FbZGV2aWNlXSwgLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHBlZXJfc2FbMF0pCisgICAgfTsKKyAgICBpbnQgbGVuOworCisgICAgbGVuID0gc2VuZG1zZyhzb2NrLCAmbXNnLCAwKTsKKyAgICBpZiAobGVuIDwgYnVmbGVuKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogc29ja19zZW5kbXNnKCV1KSAtLT4gJWQuIGVycm5vPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGJ1ZmxlbiwgbGVuLCBlcnJubyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFJlY2VpdmUgZGF0YSAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX3VkcF9yZWN2KGJjbXRyX3BsdWdpbl9jaGFubmVsIGNoLCBiY21vbHRfc3ViY2hhbm5lbCAqc3ViY2gsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpbnQgc29jayA9IF9iY210cl9jaGFubmVsX3RvX3NvY2tldChjaCk7CisgICAgaW50IGRldmljZSA9IF9iY210cl9jaGFubmVsX3RvX2RldmljZShjaCk7CisgICAgc3RydWN0IGlvdmVjIGlvdjsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKyAgICAgICAgLm1zZ19pb3YgPSAmaW92LCAubXNnX2lvdmxlbiA9IDEsCisgICAgICAgIC5tc2dfbmFtZSA9ICh2b2lkICopJnBlZXJfc2FbZGV2aWNlXSwgLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHBlZXJfc2FbMF0pCisgICAgfTsKKyAgICBpbnQgbGVuOworICAgIGZkX3NldCByZWFkX2ZkczsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgaW50IHJjOworCisgICAgRkRfWkVSTygmcmVhZF9mZHMpOworICAgIEZEX1NFVChzb2NrLCAmcmVhZF9mZHMpOworICAgIHR2LnR2X3NlYyA9IDA7CisgICAgdHYudHZfdXNlYyA9IEJDTVRSX01TR19USU1FT1VUICogMTAwMDsKKworICAgIHJjID0gc2VsZWN0KHNvY2sgKyAxLCAmcmVhZF9mZHMsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgaWYgKHJjIDwgMCkKKyAgICB7CisgICAgICAgIHBlcnJvcigic2VsZWN0Iik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisgICAgaWYgKCFyYyB8fCAhRkRfSVNTRVQoc29jaywgJnJlYWRfZmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1RJTUVPVVQ7CisgICAgfQorCisgICAgZXJyID0gYmNtb2x0X2J1Zl9hbGxvYyhidWYsIEJDTVRSX01BWF9NVFVfU0laRSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworCisgICAgaW92Lmlvdl9iYXNlID0gYnVmLT5zdGFydDsKKyAgICBpb3YuaW92X2xlbiA9IEJDTVRSX01BWF9NVFVfU0laRTsKKyAgICBsZW4gPSByZWN2bXNnKHNvY2ssICZtc2csIDApOworICAgIGlmIChsZW4gPD0gMCkKKyAgICB7CisgICAgICAgIF9iY210cl91ZHBfcHJpbnRfZXJyKEJDTV9FUlJfQ09NTV9GQUlMLCAicmVjdm1zZygpIGZhaWxlZFxuIik7CisgICAgICAgIGJjbW9sdF9idWZfZnJlZShidWYpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgfQorICAgIGJ1Zi0+bGVuID0gbGVuOworICAgICpzdWJjaCA9IG50b2hzKHBlZXJfc2FbZGV2aWNlXS5zaW5fcG9ydCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEluaXRpYWxpemUgcGx1Z2luIGNhbGxiYWNrcworICogXHBhcmFtW2luLG91dF0gICAgICAgZHJpdmVyIFRyYW5zcG9ydCBwbHVnaW4gZHJpdmVyIHN0cnVjdHVyZQorICogXHJldHVybiBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BsdWdpbl9pbml0KGJjbXRyX3BsdWdpbl9jZmcgKmNmZywgYmNtdHJfZHJpdmVyICpkcml2ZXIpCit7CisgICAgaWYgKGNmZy0+dHlwZSAhPSBCQ01UUl9UWVBFX1VEUCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJJbnZhbGlkIHBsdWdpbiB0eXBlLiBFeHBlY3RlZCBVRFBcbiIpOworICAgIH0KKworICAgIGRyaXZlci0+b3BlbiA9IGJjbXRyX3VkcF9vcGVuOworICAgIGRyaXZlci0+Y2xvc2UgPSBiY210cl91ZHBfY2xvc2U7CisgICAgZHJpdmVyLT5yZWN2ID0gYmNtdHJfdWRwX3JlY3Y7CisgICAgZHJpdmVyLT5zZW5kID0gYmNtdHJfdWRwX3NlbmQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvdW5peF9zb2NrZXQvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC91bml4X3NvY2tldC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTFlM2NjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvdW5peF9zb2NrZXQvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIyBVRCB0cmFuc3BvcnQgZHJpdmVyCisjCitpZm5lcSAoIiQoU0lNVUxBVElPTl9CVUlMRCkiLCAieSIpCitNT0RfTkFNRSA9IHVkdHIKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IHRybXV4IHRyX3BsdWdpbl9yYXdfdWQKKworc3JjcyA9IGJjbW9sdF90cl91ZF9kcml2ZXIuYworCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvdW5peF9zb2NrZXQvYmNtb2x0X3RyX3VkX2RyaXZlci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvdW5peF9zb2NrZXQvYmNtb2x0X3RyX3VkX2RyaXZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMwMTQzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC91bml4X3NvY2tldC9iY21vbHRfdHJfdWRfZHJpdmVyLmMKQEAgLTAsMCArMSwyMzEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgKiBiY21vbHRfdHJfdWRfZHJpdmVyLmMKKyAqCisgKiBVbml4IERvbWFpbiBzb2NrZXQgYmFzZWQgdHJhbnNwb3J0LgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8YmNtb2x0X3RyX211eC5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl91ZF9kcml2ZXIuaD4KKyNpbmNsdWRlIDxiY21vbHRfdHJfdWQuaD4KKworI2RlZmluZSBCQ01UUl9NRU1fUEFDS0VUUyAgICAgICAxMDAwMAorI2RlZmluZSBCQ01UUl9NRU1fT1ZFUkhFQUQgICAgICAxMDI0CisjZGVmaW5lIEJDTVRSX01JTl9SQ1ZCVUZfU0laRSAgIChCQ01UUl9NRU1fUEFDS0VUUyAqIEJDTVRSX01FTV9PVkVSSEVBRCkKKworY2hhciBzb2NrZXRfcGF0aFtdID0gU09DS0VUX1BBVEg7CisKK3R5cGVkZWYgc3RydWN0IHVkX2Nvbm5faW5mbyB7CisgICAgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsW0JDTVRSX01BWF9PTFRTXTsKKyAgICBpbnQgc29jazsKK30gdWRfY29ubl9pbmZvOworCitzdGF0aWMgYmNtb3NfdGFzayByeF90aHJlYWQ7CitzdGF0aWMgaW50IGZkOworc3RhdGljIHVkX2Nvbm5faW5mbyAqY29ubl9pbmZvW0JDTVRSTVVYX01BWF9DSEFOTkVMU107CitzdGF0aWMgaW50IGlpOworCitzdGF0aWMgdm9pZCBfYmNtdHJfdWRfcmVjdihiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKQoreworICAgIHVpbnQzMl90IGRhdGFfbGVuZ3RoID0gYmNtb3NfYnVmX2xlbmd0aChidWYpOyAKKyAgICBpbnQga2s7CisKKyAgICAvKiBGaW5kIHRoZSBzb2NrZXQgdG8gcmVzcG9uZCBvbi4uLiAqLworICAgIGZvciAoa2s9MDsga2s8c2l6ZW9mKGNvbm5faW5mbykvc2l6ZW9mKGNvbm5faW5mb1swXSk7IGtrKyspCisgICAgeworICAgICAgICBpZiAoY29ubl9pbmZvW2trXS0+Y2hhbm5lbFtkZXZpY2VdID09IGNoYW5uZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW4gPSAwOworICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJTZW5kaW5nIHRvIHVzZXIgYXBwbGljYXRpb24gZm9yIGluZGV4ICVkLi4uIiwga2spOworICAgICAgICAgICAgbGVuID0gc2VuZChjb25uX2luZm9ba2tdLT5zb2NrLCBiY21vc19idWZfZGF0YShidWYpLCBkYXRhX2xlbmd0aCwgMCk7CisgICAgICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vc19wcmludGYoIkZhaWxlZCB0byBzZW5kIHJlc3Bvc2UgdG8gdXNlciBhcHBsaWNhdGlvbiAtIHdoYXQgbm93P1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiY21vc19wcmludGYoIlNlbnQgJWQgYnl0ZXNcbiIsIGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBiY210cl91ZF9yeF9oYW5kbGVyKGxvbmcgYXJnKQoreworICAgIGludCByYywgamo7CisgICAgYmNtb3NfYnVmICpidWY7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZmRfc2V0IHJlYWRfc2V0OworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIEZEX1pFUk8oJnJlYWRfc2V0KTsKKyAgICAgICAgZm9yIChqaj0wOyBqajxzaXplb2YoY29ubl9pbmZvKS9zaXplb2YoY29ubl9pbmZvWzBdKTsgamorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbm5faW5mb1tqal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkRfU0VUKGNvbm5faW5mb1tqal0tPnNvY2ssICZyZWFkX3NldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0di50dl9zZWMgPSAwOyB0di50dl91c2VjID0gMTAwMDAwOworCisgICAgICAgIGNvdW50ID0gc2VsZWN0IChGRF9TRVRTSVpFLCAmcmVhZF9zZXQsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgICAgIGlmIChjb3VudCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGZvciAoamogPSAwOyBqaiA8IHNpemVvZihjb25uX2luZm8pL3NpemVvZihjb25uX2luZm9bMF0pIDsgamorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbm5faW5mb1tqal0gJiYgRkRfSVNTRVQoY29ubl9pbmZvW2pqXS0+c29jaywgJnJlYWRfc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWYgPSBiY21vc19idWZfYWxsb2MoQkNNVFJfTUFYX01UVV9TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1zZXQoYnVmLCAwICwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgIHJjPXJlYWQoY29ubl9pbmZvW2pqXS0+c29jaywgYmNtb3NfYnVmX2RhdGEoYnVmKSwgYnVmLT5zaXplKTsKKyAgICAgICAgICAgICAgICBidWYtPmxlbiA9IHJjOworICAgICAgICAgICAgICAgIGJ1Zi0+ZGF0YSs9QkNNVURfVFhQUkVGSVhfTEVOOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcnJvcigicmVhZCIpOworICAgICAgICAgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZShjb25uX2luZm9bampdLT5zb2NrKTsgIAorICAgICAgICAgICAgICAgICAgICBiY21vc19mcmVlKGNvbm5faW5mb1tqal0pOworICAgICAgICAgICAgICAgICAgICBjb25uX2luZm9bampdPTA7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiQ2xvc2luZyAlZFxuIiwgamopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IDA7ICAvKiAgSG93IGRvIHdlIGdldCB0aGlzPyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZWQgdG8gc3R1ZmYgaXQgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBtZXNzYWdlLiAqLworICAgICAgICAgICAgICAgICAgICBiY210cm11eF9yeF9mcm9tX2hvc3QoZGV2aWNlLCBjb25uX2luZm9bampdLT5jaGFubmVsW2RldmljZV0sIGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgaW50IG5leHRfY29ubl9pbmZvKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgIGludCBqaj0wOworICB3aGlsZSAoamo8c2l6ZW9mKGNvbm5faW5mbykvc2l6ZW9mKGNvbm5faW5mb1swXSkpCisgICAgeworICAgICAgamorKzsgaWkrKzsKKyAgICAgIGlmIChpaT5zaXplb2YoY29ubl9pbmZvKS9zaXplb2YoY29ubl9pbmZvWzBdKSkgaWk9MDsKKyAgICAgIGlmICghY29ubl9pbmZvW2lpXSkgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXRyX3VkX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICAgIGJjbW9zX3Rhc2tfcGFybSBwYXJtID0geworICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1RSQU5TUE9SVF9SWCwKKyAgICAgICAgLnN0YWNrX3NpemUgPSBCQ01UUl9SWF9USFJFQURfU1RBQ0ssCisgICAgICAgIC5oYW5kbGVyID0gYmNtdHJfdWRfcnhfaGFuZGxlciwKKyAgICAgICAgLm5hbWUgPSAidWQgaGFuZGxlciIKKyAgICB9OworCisgICAgaWk9MDsKKyAgICAKKyAgICBpZiAoIChmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKSB7CisgICAgICAgIHBlcnJvcigic29ja2V0IGVycm9yIik7CisgICAgICAgIGV4aXQoLTEpOworICAgIH0KKworICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIEJVR19PTihzaXplb2Yoc29ja2V0X3BhdGgpPj1zaXplb2YoYWRkci5zdW5fcGF0aCkpOworICAgIG1lbWNweShhZGRyLnN1bl9wYXRoLCBzb2NrZXRfcGF0aCwgc2l6ZW9mKHNvY2tldF9wYXRoKSk7CisKKyAgICBpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSkgPT0gLTEpIHsKKyAgICAgICAgcGVycm9yKCJiaW5kIGVycm9yIik7CisgICAgICAgIGV4aXQoLTEpOworICAgIH0KKworICAgIGlmIChsaXN0ZW4oZmQsIDUpID09IC0xKSB7CisgICAgICAgIHBlcnJvcigibGlzdGVuIGVycm9yIik7CisgICAgICAgIGV4aXQoLTEpOworICAgIH0KKworICAgIGVyciA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZyeF90aHJlYWQsICZwYXJtKTsKKyAKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IDA7ICAvKiAgSG93IGRvIHdlIGdldCB0aGlzPyAgTmVlZCB0byBzdHVmZiBpdCBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIG1lc3NhZ2UuICovCisgICAgICAgIGludCBzOworICAgICAgICB1ZF9jb25uX2luZm8gKmNpOworICAgICAgICBiY21vc19lcnJubyByYzsKKyAgICAgICAgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsID0gQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX0FTU0lHTjsKKworICAgICAgICBpZiAoIChzID0gYWNjZXB0KGZkLCBOVUxMLCBOVUxMKSkgPT0gLTEpIHsKKyAgICAgICAgICAgIHBlcnJvcigiYWNjZXB0IGVycm9yIik7CisgICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY2kgPSBiY21vc19jYWxsb2Moc2l6ZW9mKCpjaSkpOyAKKyAgICAgICAgaWYgKCFjaSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9NRU0sICJObyBtZW1vcnlcbiIpOworICAgICAgICB9CisgICAgICAgIHJjID0gYmNtdHJtdXhfY2hhbm5lbF9yZWdpc3RlcihkZXZpY2UsICZjaGFubmVsLCBfYmNtdHJfdWRfcmVjdiwgY29ubl9pbmZvKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19wcmludGYoIiVzOiBjYW4ndCByZWdpc3RlciBjaGFubmVsIGZvciBkZXZpY2UgJXUuIHJjPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldmljZSwgKGludClyYyk7CisgICAgICAgICAgICByZXR1cm4gcmM7OworICAgICAgICB9CisgICAgICAgIGNpLT5zb2NrID0gczsKKyAgICAgICAgY2ktPmNoYW5uZWxbZGV2aWNlXT1jaGFubmVsOworICAgICAgICBjb25uX2luZm9baWldID0gY2k7CisKKyAgICAgICAgYmNtb3NfcHJpbnRmKCJBY2NlcHRpbmcgJWQtJWRcbiIsIGlpLCBjb25uX2luZm9baWldLT5zb2NrKTsKKworICAgICAgICBpZiAobmV4dF9jb25uX2luZm8oZGV2aWNlKSA8IDApIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtdHJfdWRfZXhpdCh2b2lkKQoreworCit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC91bml4X3NvY2tldC9iY21vbHRfdHJfdWRfZHJpdmVyLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC91bml4X3NvY2tldC9iY21vbHRfdHJfdWRfZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTcyNmM5YwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3VuaXhfc29ja2V0L2JjbW9sdF90cl91ZF9kcml2ZXIuaApAQCAtMCwwICsxLDQyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtdHJfdWRfZHJpdmVyLmggLSBob3N0IHVuaXggZG9tYWluIHNvY2tldCB0cmFuc3BvcnQgZHJpdmVyCisgKi8KKworI2lmbmRlZiBCQ01PTFRfVFJfVURfRFJJVkVSX0hfCisjZGVmaW5lIEJDTU9MVF9UUl9VRF9EUklWRVJfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCitiY21vc19lcnJubyBiY210cl91ZF9pbml0KHZvaWQpOwordm9pZCBiY210cl91ZF9leGl0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjU5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgdXNlcl9jb25maWcKKyMKK01PRF9OQU1FID0gdXNlcl9jb25maWcKK01PRF9ERVBTID0gY29tbW9uX2FwaSBmbGQgbGxfcGNpZQorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKyAgICBNT0RfVFlQRSA9IGxpbnV4X2xpYgorZWxzZQorICAgIE1PRF9UWVBFID0gbGliCitlbmRpZgorCitpZm5lcSAoIiQoQk9BUkQpIiwgIiIpCisgICAgc3JjcyA9IGJvYXJkLyQoQk9BUkQpL2JjbW9sdF91c2VyX3V0aWxzLmMKKyAgICBNT0RfREVQUyArPSBpMmNfZGV2cyBib2FyZF9zZWxlY3RvcgorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYmNtb2x0X3VzZXJfdXRpbHMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYmNtb2x0X3VzZXJfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjMyZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91c2VyX2NvbmZpZy9iY21vbHRfdXNlcl91dGlscy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX1VUSUxTX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9VVElMU19IXworCisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9mbGQuaD4KKworLyogVmFsaWRhdGUgdGhhdCB0aGUgZ2l2ZW4gc3lzdGVtIG1vZGUgaXMgc3VwcG9ydGVkIGZvciB0aGUgZ2l2ZW4gZGV2aWNlLgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIEJDTV9FUlJfT0sgaWYgdGhlIHN5c3RlbSBtb2RlIGlzIHZhbGlkIG9yIGEgZGlmZmVyZW50IGVycm9yIGNvZGUgb3RoZXJ3aXNlLiAqLworYmNtb3NfZXJybm8gYmNtdXNlcl9zeXN0ZW1fbW9kZV92YWxpZGF0ZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGUpOworCisvKiBSZWFkIGZpbGUgZnJvbSBhIGZpbGUgc3lzdGVtIGludG8gYSBidWZmZXIuICovCitpbnQgYmNtdXNlcl9pbWFnZV9yZWFkKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsCisgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgIHVpbnQ4X3QgKmJ1ZiwKKyAgICB1aW50MzJfdCBidWZfc2l6ZSk7CisKKy8qIFR1cm4gb2ZmIHRoZSBwcm9jZXNzb3Igb2YgdGhlIGVtYmVkZGVkIGRldmljZS4gKi8KK2JjbW9zX2Vycm5vIGJjbXVzZXJfZGV2aWNlX29mZihiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyogVHVybiBvbiB0aGUgcHJvY2Vzc29yIG9mIHRoZSBlbWJlZGRlZCBkZXZpY2UuICovCitiY21vc19lcnJubyBiY211c2VyX2RldmljZV9vbihiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIGVtYmVkZGVkIGRldmljZSBwcm9jZXNzb3IgaXMgcnVubmluZy4gKi8KK2JjbW9zX2Vycm5vIGJjbXVzZXJfZGV2aWNlX2lzX3J1bm5pbmcoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfYm9vbCAqaXNfY3B1X29uKTsKKworLyogUHJlcGFyZSB0aGUgUENJZSBidXMgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZW1iZWRkZWQgZGV2aWNlcyAqLworYmNtb3NfZXJybm8gYmNtdXNlcl9wY2llX3ByZXBhcmUodm9pZCk7CisKKy8qIFByZXBhcmUgdGhlIFBDSWUgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBlbWJlZGRlZCBkZXZpY2UuCisgKiBGb3IgZXhhbXBsZSwgdGhpcyBmdW5jdGlvbiBtYXkgcmUtZW51bWVyYXRlIHRoZSBQQ0ktRSBidXMuICovCitiY21vc19lcnJubyBiY211c2VyX3BjaWVfY2hhbm5lbF9wcmVwYXJlKGJjbW9sdF9kZXZpZCBkZXZpY2UpOworCitiY21vc19lcnJubyBiY211c2VyX3BjaWVfY2hhbm5lbF9wcmVwYXJlX2Zvcl9rdDIoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qIFJlbW92ZSB0aGUgUENJZSBjaGFubmVsIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGVtYmVkZGVkIGRldmljZS4KKyAqIEZvciBleGFtcGxlLCB0aGlzIGZ1bmN0aW9uIG1heSByZS1lbnVtZXJhdGUgdGhlIFBDSS1FIGJ1cy4gKi8KK2JjbW9zX2Vycm5vIGJjbXVzZXJfcGNpZV9jaGFubmVsX3JlbW92ZShiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyogUmVzZXQgdGhlIGhvc3QgcHJvY2Vzc29yLiAqLworYmNtb3NfZXJybm8gYmNtdXNlcl9ob3N0X3Jlc2V0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYm9hcmQvd3J4L2JjbW9sdF91c2VyX3V0aWxzLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkL3dyeC9iY21vbHRfdXNlcl91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZjU4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkL3dyeC9iY21vbHRfdXNlcl91dGlscy5jCkBAIC0wLDAgKzEsNTMzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fY29uZmlnLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9mbGQuaD4KKyNpbmNsdWRlIDxiY21vbHRfbGxwY2llLmg+CisjaW5jbHVkZSA8YmNtb2x0X2NvbnYuaD4KKyNpbmNsdWRlIDxiY21vbHRfaTJjX2RldnMuaD4KKyNpbmNsdWRlIDxiY21vbHRfYm9hcmRfc2VsZWN0b3IuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl91dGlscy5oIgorCisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFJfU1RBUlQgdHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUihuYW1lLCBkZXNjLCB2YWwpIG5hbWUgPSB2YWwsCisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFJfRU5EIH0gYmNtX2kyY19kZXZfYWRkcjsKKyNpbmNsdWRlIDxiY21vbHRfaTJjX2RldnNfYWRkci5oPgorCisjZGVmaW5lIEJPT1RfRklMRSAgICAgICAgICAgICAgICAgICAgICAgIi9vcHQvYmNtNjg2MjAvYmNtNjg2MjBfYm9vdC5iaW4iCisjZGVmaW5lIEFQUExfRklMRSAgICAgICAgICAgICAgICAgICAgICAgIi9vcHQvYmNtNjg2MjAvYmNtNjg2MjBfYXBwbC5iaW4iCisjZGVmaW5lIE9OVV9GV19GSUxFICAgICAgICAgICAgICAgICAgICAgIi9vcHQvYmNtNjg2MjAvZHVtbXlfb251X2Zpcm13YXJlLmJpbiIKKworI2RlZmluZSBGUEdBX1JFR19GUEdBX1ZFUlNJT04gMHgwCisjZGVmaW5lIEZQR0FfUkVHX0JPQVJEX0NPTkYgMHgxCisjZGVmaW5lIEZQR0FfUkVHX1JFU0VUUyAweDIKKworI2RlZmluZSBGUEdBX1JTVF9CSVRfREVWSUNFIDB4MAorI2RlZmluZSBGUEdBX0RFVklDRV9TV0lUQ0ggIDQKKworI2RlZmluZSBGUEdBX0VOQUJMRV9BTExfREVWSUNFUyAweDFmCisjZGVmaW5lIEZQR0FfRU5BQkxFX1NXSVRDSCAgICAgICAgICAgICAgKDEgPDwgRlBHQV9ERVZJQ0VfU1dJVENIKQorLyogRm9yIG5vdyBzd2FwIGRldmljZXMgZm9yIGNvbnNpc3RlbmN5IHdpdGggUENJIGVudW1lcmF0aW9uICovCisjZGVmaW5lIEZQR0FfREVWSUNFX1JFU0VUX0JJVChkZXYpICAgICAgKDEgPDwgKEZQR0FfUlNUX0JJVF9ERVZJQ0UgKyBkZXYpKQorCisvKiBNaW5pbXVtIHJlcXVpcmVkIEZQR0EgdmVyc2lvbiBmb3IgcmVhZGluZyBkZWZhdWx0IHN5c3RlbSBtb2RlIHZpYSBCT0FSRF9DT05GIHJlZ2lzdGVyLiAqLworI2RlZmluZSBGUEdBX1ZFUl9GT1JfU1ZLX0NPTkZJRyA2CisKKy8qIExvY2sgdGhhdCBwcm90ZWN0cyBjcml0aWNhbCBzZWN0aW9ucyAqLworc3RhdGljIGJjbW9zX211dGV4IHVzZXJfbG9jazsKK3N0YXRpYyBiY21vc19ib29sIHVzZXJfbG9ja19pbml0aWFsaXplZDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgU1ZLX0JPQVJEX0lEXzEgICAgPSAweDcsIC8qIFNWSyAjMSAtIEJDTTk2ODYyMFM6IGFsbCBQT04gZmxhdm9ycyBzdXBwb3J0ZWQsIFNGUCsgKi8KKyAgICBTVktfQk9BUkRfSURfMl9YRyA9IDB4NiwgLyogU1ZLICMyIC0gQkNNOTY4NjIwWEc6IFhHUE9OICovCisgICAgU1ZLX0JPQVJEX0lEXzJfWEUgPSAweDUsIC8qIFNWSyAjMiAtIEJDTTk2ODYyMFhFOiAxMEcgRVBPTiAqLworICAgIFNWS19CT0FSRF9JRF8zICAgID0gMHg0LCAvKiBTVksgIzMgLSBCQ005Njg2MjBLOiBhbGwgUE9OIGZsYXZvcnMgc3VwcG9ydGVkLCBYRlAgKi8KKyAgICBEVlRfQk9BUkRfSUQgICAgICA9IDB4MywgLyogRFZUIGJvYXJkICovCit9IHN2a19ib2FyZF9pZDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgU1ZLX01PREVfR1BPTl8xNlggICAgID0gMHhGLCAvKiBTVksgIzEvMzogMTZ4IEdQT04gbW9kZSwgU1ZLICMyOiBvbmx5IHZhbGlkIG1vZGUgKi8KKyAgICBTVktfTU9ERV9FUE9OXzFHXzE2WCAgPSAweEUsIC8qIFNWSyAjMS8zOiAxNnggMUcgRVBPTiBtb2RlICovCisgICAgU1ZLX01PREVfWEdQT04gICAgICAgID0gMHhELCAvKiBTVksgIzEvMzogOHggWEdQT04gbW9kZSAqLworICAgIFNWS19NT0RFX0VQT05fMTBHXzhYICA9IDB4QywgLyogU1ZLICMxLzM6IDh4IDEwRyBFUE9OIG1vZGUgKi8KKyAgICBTVktfTU9ERV9FUE9OX0dQT05fOFggPSAweEIsIC8qIFNWSyAjMS8zOiA4eCAxMEcgRVBPTiArIDh4IEdQT04gY29leGlzdGVuY2UgbW9kZSAqLworfSBzdmtfbW9kZTsKKworCisjZGVmaW5lIENIRUNLX1JFVFVSTl9FUlJPUihjb25kLHJjKSBcCisJCWRvIHsgXAorCQkJaWYgKGNvbmQpIHtcCisJCQkJYmNtb3NfcHJpbnRmKCIlcyMlZDogZmFpbGVkIHdpdGggcmM9JWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHJjKTtcCisJCQkJcmV0dXJuIHJjO1wKKwkJCX1cCisJCX0gd2hpbGUgKDApCisKKworc3RhdGljIHZvaWQgdXNlcmxvY2tfbG9jayh2b2lkKQoreworICAgIGlmICghdXNlcl9sb2NrX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZ1c2VyX2xvY2ssIDAsICJyZXNldF9sb2NrIik7CisgICAgICAgIHVzZXJfbG9ja19pbml0aWFsaXplZCA9IEJDTU9TX1RSVUU7CisgICAgfQorICAgIGJjbW9zX211dGV4X2xvY2soJnVzZXJfbG9jayk7Cit9CisKKworc3RhdGljIHZvaWQgdXNlcmxvY2tfdW5sb2NrKHZvaWQpCit7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZ1c2VyX2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IGZpbGUgKmZpbGVfb3Blbihjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MpCit7CisgICAgc3RydWN0IGZpbGUgKmZkID0gTlVMTDsKKyAgICBtb2RlX3QgbW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7CisKKyAgICBmZCA9IGZpbHBfb3BlbihwYXRoLCBmbGFncywgbW9kZSk7CisgICAgaWYoSVNfRVJSKGZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGZkOworfQorCitzdGF0aWMgdm9pZCBmaWxlX2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIGZpbHBfY2xvc2UoZmlsZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBvID0gb2Zmc2V0OworICAgIG1tX3NlZ21lbnRfdCBvbGRmczsKKyAgICBpbnQgYnl0ZXNfcmVhZDsKKworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKGdldF9kcygpKTsKKyAgICBieXRlc19yZWFkID0gdmZzX3JlYWQoZmlsZSwgZGF0YSwgc2l6ZSwgJm8pOworICAgIHNldF9mcyhvbGRmcyk7CisgICAgaWYgKGJ5dGVzX3JlYWQgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJ2ZnNfcmVhZCByZXR1cm5lZCBlcnJvciAlZFxuIiwgYnl0ZXNfcmVhZCk7CisgICAgICAgIHJldHVybiAoaW50KUJDTV9FUlJfSU87CisgICAgfQorICAgIHJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgaW50IGZpbGVfd3JpdGUoc3RydWN0IGZpbGUqIGZpbGUsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIG1tX3NlZ21lbnRfdCBvbGRmczsKKyAgICBpbnQgcmV0OworCisgICAgb2xkZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoZ2V0X2RzKCkpOworCisgICAgcmV0ID0gdmZzX3dyaXRlKGZpbGUsIGRhdGEsIHNpemUsICZvZmZzZXQpOworCisgICAgc2V0X2ZzKG9sZGZzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZmlsZV93cml0ZV8xKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgc3RydWN0IGZpbGUgKmZkOworICAgIGNoYXIgdG9fd3JpdGVbXSA9IHsgJzEnIH07CisgICAgbG9mZl90IHBvcyA9IDA7CisgICAgc3NpemVfdCBieXRlc193cml0dGVuOworCisgICAgZmQgPSBmaWxlX29wZW4ocGF0aCwgT19XUk9OTFkpOworICAgIGlmICgoZmQgPT0gTlVMTCkgfHwgKGZkID09ICh2b2lkICopLUVOT0VOVCkpIC8qIC1FTk9FTlQ7IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgKi8KKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3Qgb3BlbiBmaWxlICVzIGZvciB3cml0aW5nLiBFcnJvciAlc1xuIiwKKyAgICAgICAgICAgIHBhdGgsIGJjbW9zX3N0cmVycm9yKGZkID09IE5VTEwgPyBCQ01fRVJSX05VTEwgOiBCQ01fRVJSX05PRU5UKSk7CisgICAgICAgIHJldHVybiAoZmQgPT0gTlVMTCA/IEJDTV9FUlJfTlVMTCA6IEJDTV9FUlJfTk9FTlQpOworICAgIH0KKworICAgIGJ5dGVzX3dyaXR0ZW4gPSBmaWxlX3dyaXRlKGZkLCBwb3MsIHRvX3dyaXRlLCBzaXplb2YodG9fd3JpdGUpKTsKKyAgICBpZiAoYnl0ZXNfd3JpdHRlbiAhPSBzaXplb2YodG9fd3JpdGUpKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJ2ZnNfd3JpdGUgcmV0dXJuZWQgaW5jb3JyZWN0IG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW46ICVkXG4iLCBieXRlc193cml0dGVuKTsKKyAgICB9CisKKyAgICBmaWxlX2Nsb3NlKGZkKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGkyY19mcGdhX3JlYWQodWludDMyX3QgcmVnLCB1aW50MzJfdCAqdmFsKQoreworICAgIHJldHVybiBtYXBsZV9pMmNfcmVhZF9mcGdhKG1hcGxlX2kyY19nZXRfY2xpZW50KEZQR0FfSTJDX0FERFIpLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBpMmNfZnBnYV93cml0ZSh1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbCkKK3sKKyAgICByZXR1cm4gbWFwbGVfaTJjX3dyaXRlX2ZwZ2EobWFwbGVfaTJjX2dldF9jbGllbnQoRlBHQV9JMkNfQUREUiksIHJlZywgdmFsKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGkyY19jb25maWdfc3dpdGNoKHZvaWQpCit7CisgICAgdWludDhfdCB0b193cml0ZSA9IDE7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IG1hcGxlX2kyY193cml0ZShtYXBsZV9pMmNfZ2V0X2NsaWVudChJMkNfU1cwX0kyQ19BRERSKSwgJnRvX3dyaXRlLCAxKTsKKyAgICBpZiAocmV0ICE9IDApCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkZhaWxlZCB0byB3cml0ZSBzd2l0Y2g6ICVkXG4iLCByZXQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGkyY19mcGdhX3ZlcnNpb25fZ2V0KHVpbnQzMl90ICp2ZXJzaW9uKQoreworICAgIHJldHVybiBpMmNfZnBnYV9yZWFkKEZQR0FfUkVHX0ZQR0FfVkVSU0lPTiwgdmVyc2lvbik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBpMmNfc3ZrX2NvbmZpZ19nZXQoc3ZrX2JvYXJkX2lkICpib2FyZF9pZCwgc3ZrX21vZGUgKm1vZGUpCit7CisgICAgdWludDMyX3QgdmFsOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBpMmNfZnBnYV9yZWFkKEZQR0FfUkVHX0JPQVJEX0NPTkYsICZ2YWwpOworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgKmJvYXJkX2lkID0gKHN2a19ib2FyZF9pZCkodmFsICYgMHg3KTsKKyAgICAgICAgKm1vZGUgPSAoc3ZrX21vZGUpKCh2YWwgPj4gNCkgJiAweEYpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGkyY19kZXZpY2VfY3B1X3N0YXRlX3NldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19ib29sIGlzX29uKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHVpbnQzMl90IHJlc2V0X3ZhbHVlczsKKworICAgIC8qIFByZXZlbnQgcmFjZSBjb25kaXRpb24gd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgMiBkZXZpY2VzIHNpbXVsdGFuZW91c2x5ICovCisgICAgdXNlcmxvY2tfbG9jaygpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHJjID0gaTJjX2NvbmZpZ19zd2l0Y2goKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogUmVhZC1tb2RpZnktd3JpdGUgc28gd2UgY2FuIHNldCBvbmx5IHRoZSByZWxldmFudCBiaXQgKi8KKyAgICAgICAgcmMgPSBpMmNfZnBnYV9yZWFkKEZQR0FfUkVHX1JFU0VUUywgJnJlc2V0X3ZhbHVlcyk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChpc19vbikKKyAgICAgICAgICAgIHJlc2V0X3ZhbHVlcyB8PSBGUEdBX0RFVklDRV9SRVNFVF9CSVQoZGV2aWNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzZXRfdmFsdWVzICY9IH5GUEdBX0RFVklDRV9SRVNFVF9CSVQoZGV2aWNlKTsKKworICAgICAgICByYyA9IGkyY19mcGdhX3dyaXRlKEZQR0FfUkVHX1JFU0VUUywgcmVzZXRfdmFsdWVzKTsKKworICAgIH0gd2hpbGUgKDApOworCisgICAgdXNlcmxvY2tfdW5sb2NrKCk7CisKKyAgICBDSEVDS19SRVRVUk5fRVJST1IocmMgIT0gQkNNX0VSUl9PSywgcmMpOworCisgICAgYmNtb3NfdXNsZWVwKDEwMDApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIGJjbXVzZXJfc3lzdGVtX21vZGVfaXNfdmFsaWQoYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlLCBzdmtfYm9hcmRfaWQgYm9hcmRfaWQsIHN2a19tb2RlIHN2a19tb2RlKQoreworICAgIHN3aXRjaCAoYm9hcmRfaWQpCisgICAgeworICAgIGNhc2UgU1ZLX0JPQVJEX0lEXzE6CisgICAgY2FzZSBTVktfQk9BUkRfSURfMzoKKyAgICAgICAgc3dpdGNoIChzdmtfbW9kZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFNWS19NT0RFX0dQT05fMTZYOgorICAgICAgICAgICAgcmV0dXJuIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fNF9YIHx8CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1ggfHwKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1ggfHwKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0UgfHwKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWCB8fAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YIHx8CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HKTsKKyAgICAgICAgY2FzZSBTVktfTU9ERV9FUE9OXzFHXzE2WDoKKyAgICAgICAgICAgIHJldHVybiAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWCB8fAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YIHx8CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YIHx8CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18yX1hfMTBfRyB8fAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YXzEwX0cgfHwKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HKTsKKyAgICAgICAgY2FzZSBTVktfTU9ERV9YR1BPTjoKKyAgICAgICAgICAgIHJldHVybiAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWCB8fAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YIHx8CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HKTsKKyAgICAgICAgY2FzZSBTVktfTU9ERV9FUE9OXzEwR184WDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUEpIHx8CisgICAgICAgICAgICAgICAgKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQSkgfHwKKyAgICAgICAgICAgICAgICAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HKSB8fAorICAgICAgICAgICAgICAgIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YXzEwX0cpIHx8CisgICAgICAgICAgICAgICAgKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfMTBfRyk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICBjYXNlIFNWS19CT0FSRF9JRF8yX1hHOgorICAgICAgICByZXR1cm4gKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX184X1ggfHwKKyAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YIHx8CisgICAgICAgICAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fOF9YXzJfUF81X0cgfHwKKyAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfWEdTX18yX1hfMTBfRyB8fAorICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzJfWF8xMF9HKTsKKyAgICBjYXNlIFNWS19CT0FSRF9JRF8yX1hFOgorICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUEpIHx8CisgICAgICAgICAgICAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF9DT0VYSVNURU5DRV9URE1BKSB8fAorICAgICAgICAgICAgKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9BRV84X1gpIHx8CisgICAgICAgICAgICAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HKSB8fAorICAgICAgICAgICAgKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfRykgfHwKKyAgICAgICAgICAgIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YXzEwX0cpOworICAgIGNhc2UgRFZUX0JPQVJEX0lEOgorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCitiY21vc19lcnJubyBiY211c2VyX3N5c3RlbV9tb2RlX3ZhbGlkYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCB2ZXJzaW9uOworICAgIHN2a19ib2FyZF9pZCBib2FyZF9pZDsKKyAgICBzdmtfbW9kZSBzdmtfbW9kZTsKKworICAgIHJjID0gaTJjX2NvbmZpZ19zd2l0Y2goKTsKKyAgICBDSEVDS19SRVRVUk5fRVJST1IocmMgIT0gQkNNX0VSUl9PSywgcmMpOworCisgICAgcmMgPSBpMmNfZnBnYV92ZXJzaW9uX2dldCgmdmVyc2lvbik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9JTkZPKCJGYWlsZWQgdG8gcmVhZCBGUEdBIHZlcnNpb25cbiIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYgKHZlcnNpb24gPCBGUEdBX1ZFUl9GT1JfU1ZLX0NPTkZJRykKKyAgICB7CisgICAgICAgIC8qIHRoaXMgRlBHQSB2ZXJzaW9uIGRvbid0IHN1cHBvcnQgcmVhZGluZyB0aGUgU1ZLIHZlcnNpb24sIHNvIHdlIG11c3QgYXNzdW1lIGl0J3MgT0sgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmMgPSBpMmNfc3ZrX2NvbmZpZ19nZXQoJmJvYXJkX2lkLCAmc3ZrX21vZGUpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygiRmFpbGVkIHRvIHJlYWQgU1ZLIGNvbmZpZ1xuIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAoYmNtdXNlcl9zeXN0ZW1fbW9kZV9pc192YWxpZChzeXN0ZW1fbW9kZSwgYm9hcmRfaWQsIHN2a19tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9JTkZPKAorICAgICAgICAgICAgIlN5c3RlbSBtb2RlICVzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGJvYXJkIElEICVkLCBTVksgbW9kZSAlZFxuIiwKKyAgICAgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9uYW1lKHN5c3RlbV9tb2RlKSwKKyAgICAgICAgICAgIGJvYXJkX2lkLAorICAgICAgICAgICAgc3ZrX21vZGUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KK30KKworaW50IGJjbXVzZXJfaW1hZ2VfcmVhZChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgYnVmX3NpemUpCit7CisgICAgc3RydWN0IGZpbGUgKmZkOworICAgIGludCBieXRlc19yZWFkOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHN0YXRpYyBpbnQyc3RyX3QgaW1hZ2VfdHlwZTJzdHJbXSA9CisgICAgeworICAgICAgICB7QkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVIsIEJPT1RfRklMRX0sCisgICAgICAgIHtCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04sIEFQUExfRklMRX0sCisgICAgICAgIHtCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfSVRVX1BPTl9PTlVfRklSTVdBUkUsIE9OVV9GV19GSUxFfSwKKyAgICAgICAgey0xfQorICAgIH07CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisKKyAgICBmaWxlbmFtZSA9IGludDJzdHIoaW1hZ2VfdHlwZTJzdHIsIGltYWdlX3R5cGUpOworICAgIGZkID0gZmlsZV9vcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgaWYgKChmZCA9PSBOVUxMKSB8fCAoZmQgPT0gKHZvaWQgKiktRU5PRU5UKSkgLyogLUVOT0VOVDsgTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAqLworICAgIHsKKyAgICAgICAgcmMgPSAoZmQgPT0gTlVMTCA/IEJDTV9FUlJfTlVMTCA6IEJDTV9FUlJfTk9FTlQpOworICAgICAgICBCQ01PU19UUkFDRV9FUlIoImZpbHBfb3BlbiByZXR1cm5lZCBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBieXRlc19yZWFkID0gZmlsZV9yZWFkKGZkLCBvZmZzZXQsIGJ1ZiwgYnVmX3NpemUpOworICAgIGZpbGVfY2xvc2UoZmQpOworICAgIGlmIChieXRlc19yZWFkIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoaW50KUJDTV9FUlJfSU87CisgICAgfQorICAgIHJldHVybiBieXRlc19yZWFkOworfQorCitiY21vc19lcnJubyBiY211c2VyX2RldmljZV9vZmYoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICAvKiBJZ25vcmUgcmVxdWVzdCBmb3Igbm9uLWV4aXN0aW5nIGRldmljZSAqLworICAgIGlmIChkZXZpY2UgPj0gYmNtb2x0X2JvYXJkX251bV9tYXBsZV9kZXZpY2VzKCkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIEJDTU9TX1RSQUNFX0lORk8oImRldmljZT0ldVxuIiwgZGV2aWNlKTsKKyAgICByZXR1cm4gaTJjX2RldmljZV9jcHVfc3RhdGVfc2V0KGRldmljZSwgQkNNT1NfRkFMU0UpOworfQorCitiY21vc19lcnJubyBiY211c2VyX2RldmljZV9vbihiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgQkNNT1NfVFJBQ0VfSU5GTygiZGV2aWNlPSV1XG4iLCBkZXZpY2UpOworICAgIGlmIChkZXZpY2UgPj0gYmNtb2x0X2JvYXJkX251bV9tYXBsZV9kZXZpY2VzKCkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgcmMgPSBpMmNfZGV2aWNlX2NwdV9zdGF0ZV9zZXQoZGV2aWNlLCBCQ01PU19UUlVFKTsKKyAgICAvKiBXYWl0IGEgbW9tZW50IHRvIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIGlzIGRpc2NvdmVyYWJsZSBpbiBjYXNlIGl0IGp1c3QgYm9vdGVkLiAqLworICAgIGJjbW9zX3VzbGVlcCg1MCAqIDEwMDApOworCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyBiY211c2VyX2RldmljZV9pc19ydW5uaW5nKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9zX2Jvb2wgKmlzX3J1bm5pbmcpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgdWludDMyX3QgcmVzZXRfdmFsdWVzOworICAgIHVpbnQzMl90IHZlcnNpb247CisKKyAgICByYyA9IGkyY19jb25maWdfc3dpdGNoKCk7CisgICAgQ0hFQ0tfUkVUVVJOX0VSUk9SKHJjICE9IEJDTV9FUlJfT0ssIHJjKTsKKworICAgIHJjID0gaTJjX2ZwZ2FfdmVyc2lvbl9nZXQoJnZlcnNpb24pOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygiRmFpbGVkIHRvIHJlYWQgRlBHQSB2ZXJzaW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBpZiAoIWJjbW9sdF9ib2FyZF9zdXBwb3J0c19zdGFuZGFsb25lKHZlcnNpb24pKQorICAgIHsKKyAgICAgICAgLyogRm9yIG9sZGVyIEZQR0FzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBzdGFuZGFsb25lIG1vZGUsIHRoZSBkZXZpY2UgaXMgdGFrZW4gb3V0IG9mIHJlc2V0IGF0IGJvb3QuICBXZSBuZWVkIHRvIGxpZQorICAgICAgICAgICBhbmQgdGVsbCBkZXZpY2UgY29udHJvbCB0aGF0IGl0J3Mgbm90IHJ1bm5pbmcsIHNvIGl0IHdpbGwgYmUgcHJvZ3JhbW1lZCBmcm9tIHNjcmF0Y2guICovCisgICAgICAgIEJDTU9TX1RSQUNFX0lORk8oIkZQR0EgdmVyc2lvbiAlZCBkb2Vzbid0IHN1cHBvcnQgc3RhbmRhbG9uZSBtb2RlXG4iLCB2ZXJzaW9uKTsKKyAgICAgICAgKmlzX3J1bm5pbmcgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmMgPSBpMmNfZnBnYV9yZWFkKEZQR0FfUkVHX1JFU0VUUywgJnJlc2V0X3ZhbHVlcyk7CisgICAgQ0hFQ0tfUkVUVVJOX0VSUk9SKHJjICE9IEJDTV9FUlJfT0ssIHJjKTsKKworICAgICppc19ydW5uaW5nID0gKChyZXNldF92YWx1ZXMgJiBGUEdBX0RFVklDRV9SRVNFVF9CSVQoZGV2aWNlKSkgIT0gMCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtdXNlcl9ob3N0X3Jlc2V0KHZvaWQpCit7CisgICAgYmNtX2xsX3BjaWVfY2xlYW51cCgpOworICAgIGtlcm5lbF9yZXN0YXJ0KE5VTEwpOworICAgIHJldHVybiBCQ01fRVJSX09LOyAvKiB3aWxsIG5ldmVyIGJlIHJlYWNoZWQgKi8KK30KKworYmNtb3NfZXJybm8gYmNtdXNlcl9wY2llX3ByZXBhcmUodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCByZXNldF92YWx1ZXM7CisgICAgY29uc3QgY2hhciAqcGNpZV9yZXNjYW5fZmlsZSA9IGJjbW9sdF9ib2FyZF9wY2lfcmVzY2FuX3N0cmluZ19nZXQoKTsKKyAgICBpbnQgaTsKKworICAgIC8qIC0gVGFrZSBhbGwgZGV2aWNlcyBvdXQgb2YgcmVzZXQKKyAgICAgKiAtIHJlc2NhbiBidXMKKyAgICAgKiAtIHJlc3RvcmUgcmVzZXQgdmFsdWUKKyAgICAgKi8KKworICAgIHJjID0gaTJjX2NvbmZpZ19zd2l0Y2goKTsKKyAgICBDSEVDS19SRVRVUk5fRVJST1IocmMgIT0gQkNNX0VSUl9PSywgcmMpOworCisgICAgLyogUmVhZC1tb2RpZnktd3JpdGUgc28gd2UgY2FuIHNldCBvbmx5IHRoZSByZWxldmFudCBiaXQgKi8KKyAgICByYyA9IGkyY19mcGdhX3JlYWQoRlBHQV9SRUdfUkVTRVRTLCAmcmVzZXRfdmFsdWVzKTsKKyAgICBDSEVDS19SRVRVUk5fRVJST1IocmMgIT0gQkNNX0VSUl9PSywgcmMpOworCisgICAgcmMgPSBpMmNfZnBnYV93cml0ZShGUEdBX1JFR19SRVNFVFMsIEZQR0FfRU5BQkxFX0FMTF9ERVZJQ0VTKTsKKyAgICBDSEVDS19SRVRVUk5fRVJST1IocmMgIT0gQkNNX0VSUl9PSywgcmMpOworCisgICAgYmNtb3NfdXNsZWVwKDUwMDAwKTsKKworICAgIC8qIE5vdyByZWNhbiBQQ0kgYnVzICovCisgICAgLyogTm93IHJlLWVudW1lcmF0ZSB0aGUgUENJIGJ1cyBieSB3cml0aW5nIGEgMSB0byB0aGUgJ3Jlc2NhbicgZmlsZS4gKi8KKyAgICByYyA9IGZpbGVfd3JpdGVfMShwY2llX3Jlc2Nhbl9maWxlKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJmaWxlIHdyaXRlIHJldHVybmVkIGVycm9yICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgIGJjbW9zX3VzbGVlcCgxMDAgKiAxMDAwKTsKKworICAgIC8qIE5vdyBpbml0aWFsaXplIGxsX3BjaWUgZHJpdmVyIGFuZCBtYXAgbWFwbGUgZGV2aWNlcyAqLworICAgIHJjID0gYmNtX2xsX3BjaWVfaW5pdCgpOworICAgIENIRUNLX1JFVFVSTl9FUlJPUihyYyAhPSBCQ01fRVJSX09LLCByYyk7CisKKyAgICAvKiBOb3cgcmVzdG9yZSByZXN0IHZhbHVlcy4gS2VlcCBzd2l0Y2ggb3V0IG9mIHJlc2V0ICovCisgICAgZm9yIChpID0gMDsgaSA8IGJjbW9sdF9ib2FyZF9udW1fbWFwbGVfZGV2aWNlcygpOyBpKyspCisgICAgeworICAgICAgICBpZiAoKEZQR0FfREVWSUNFX1JFU0VUX0JJVChpKSAmIHJlc2V0X3ZhbHVlcykgPT0gMCkKKyAgICAgICAgICAgIGJjbXVzZXJfcGNpZV9jaGFubmVsX3JlbW92ZShpKTsKKyAgICB9CisgICAgcmMgPSBpMmNfZnBnYV93cml0ZShGUEdBX1JFR19SRVNFVFMsIHJlc2V0X3ZhbHVlcyB8IEZQR0FfRU5BQkxFX1NXSVRDSCk7CisgICAgQ0hFQ0tfUkVUVVJOX0VSUk9SKHJjICE9IEJDTV9FUlJfT0ssIHJjKTsKKworICAgIHJldHVybiAwOworfQorCitiY21vc19lcnJubyBiY211c2VyX3BjaWVfY2hhbm5lbF9wcmVwYXJlKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IGJjbV9sbF9wY2llX2Rldl9lbmFibGUoZGV2aWNlKTsKKyAgICBpZiAocmMpCisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ291bGRuJ3QgcHJlcGFyZSBkZXZpY2UgJWQuIEVycm9yICVzXG4iLCBkZXZpY2UsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXVzZXJfcGNpZV9jaGFubmVsX3JlbW92ZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbV9sbF9wY2llX2Rldl9kaXNhYmxlKGRldmljZSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkX3NlbGVjdG9yL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91c2VyX2NvbmZpZy9ib2FyZF9zZWxlY3Rvci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmJmZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91c2VyX2NvbmZpZy9ib2FyZF9zZWxlY3Rvci9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIGJvYXJkX3NlbGVjdG9yCisjCitNT0RfTkFNRSA9IGJvYXJkX3NlbGVjdG9yCitNT0RfU1VQUFJFU1NfT1NfREVQID0geQorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKyAgICBNT0RfVFlQRSA9IGxpbnV4X2xpYgorZWxzZQorICAgIE1PRF9UWVBFID0gbGliCitlbmRpZgorCitpZm5lcSAoIiQoQk9BUkQpIiwgIiIpCisgICAgc3JjcyA9ICQoQk9BUkQpL2JjbW9sdF9ib2FyZF9zZWxlY3Rvci5jCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91c2VyX2NvbmZpZy9ib2FyZF9zZWxlY3Rvci9iY21vbHRfYm9hcmRfc2VsZWN0b3IuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYm9hcmRfc2VsZWN0b3IvYmNtb2x0X2JvYXJkX3NlbGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhODEwMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYm9hcmRfc2VsZWN0b3IvYmNtb2x0X2JvYXJkX3NlbGVjdG9yLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbW9sdF9ib2FyZF9zZWxlY3Rvci5oCisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0JPQVJEX1NFTEVDVE9SX0hfCisjZGVmaW5lIF9CQ01PTFRfQk9BUkRfU0VMRUNUT1JfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisvKiBidXMsIGRldmZuIC0tPiBkZXZpY2UgbWFwcGluZyB0YWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgYnVzOworICAgIGludCBkZXZmbjsKKyAgICBpbnQgZGV2aWNlOworfSBidXNfZGV2Zm5fZGV2aWQ7CisKKy8qIEdldCBQQ0kgcmVzY2FuIHN0cmluZy4gSXQgaXMgdXNlZCBpbiBsaW51eCB0byByZXNjYW4gUENJZSBidXMgKi8KK2NvbnN0IGNoYXIgKmJjbW9sdF9ib2FyZF9wY2lfcmVzY2FuX3N0cmluZ19nZXQodm9pZCk7CisKKy8qIEdldCBidXMsIGRldmZuIC0tPiBkZXZfaWQgbWFwcGluZyB0YWJsZS4KKyAqIFRoZSB0YWJsZSBpcyB0ZXJtaW5hdGVkIGJ5IHJvdyB3aXRoIGJ1cz0tMSxkZXZmbj0tMQorICovCitjb25zdCBidXNfZGV2Zm5fZGV2aWQgKmJjbW9sdF9ib2FyZF9wY2lfbWFwX3RhYmxlX2dldCh2b2lkKTsKKworLyogUmV0dXJuIFRSVUUgaWYgYm9hcmQgc3VwcG9ydHMgTWFwbGUtc3RhbmRhbG9uZSBtb2RlICovCitiY21vc19ib29sIGJjbW9sdF9ib2FyZF9zdXBwb3J0c19zdGFuZGFsb25lKHVpbnQzMl90IHZlcnNpb24pOworCisvKiBSZXR1cm5zIG51bWJlciBvZiBtYXBsZSBkZXZpY2VzIG9uIHRoZSBib2FyZCAqLwordWludDhfdCBiY21vbHRfYm9hcmRfbnVtX21hcGxlX2RldmljZXModm9pZCk7CisKKyNlbmRpZiAvKiBfQkNNT0xUX0JPQVJEX1NFTEVDVE9SX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkX3NlbGVjdG9yL3dyeC9iY21vbHRfYm9hcmRfc2VsZWN0b3IuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYm9hcmRfc2VsZWN0b3Ivd3J4L2JjbW9sdF9ib2FyZF9zZWxlY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTdhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkX3NlbGVjdG9yL3dyeC9iY21vbHRfYm9hcmRfc2VsZWN0b3IuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbW9sdF9ib2FyZF9zZWxlY3Rvci5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAiYmNtb2x0X2JvYXJkX3NlbGVjdG9yLmgiCisKK3N0YXRpYyBidXNfZGV2Zm5fZGV2aWQgYnVzX2RldmZuX2RldmlkX3RhYmxlX3N2azRbXSA9IHsKKyAgICB7IDUsIDAsIDB9LAorICAgIHsgMywgMCwgMX0sCisgICAgey0xLC0xLC0xfSwKK307CisKK3N0YXRpYyBidXNfZGV2Zm5fZGV2aWQgYnVzX2RldmZuX2RldmlkX3RhYmxlX3N2azFfM1tdID0geworICAgIHsgMywgMCwgMH0sCisgICAgey0xLC0xLC0xfSwKK307CisKKyNkZWZpbmUgU1ZLNF9JREVOVF9GSUxFICAgICAgICAgICAgICAgICAiL2V0Yy9zdms0IgorCisjZGVmaW5lIFBDSUVfREVWSUNFX1JFU0NBTl9GSUxFX1NWSzQgICAgIi9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDA6MDI6MDAuMC9yZXNjYW4iCisjZGVmaW5lIFBDSUVfREVWSUNFX1JFU0NBTl9GSUxFX1NWSzFfMyAgIi9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDA6MDI6MDEuMC9yZXNjYW4iCisKKy8qIE1pbmltdW0gcmVxdWlyZWQgRlBHQSB2ZXJzaW9uIGZvciBzdGFuZGFsb25lIG1vZGUgKGhvc3QgLyBlbWJlZGRlZCBwcm9jZXNzb3JzIHJ1bm5pbmcgZGlzY29ubmVjdGVkKS4gKi8KKyNkZWZpbmUgRlBHQV9WRVJfRk9SX1NUQU5EQUxPTkUgNworCitzdGF0aWMgc3RydWN0IGZpbGUgKmZpbGVfb3Blbihjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MpCit7CisgICAgc3RydWN0IGZpbGUgKmZkID0gTlVMTDsKKyAgICBtb2RlX3QgbW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7CisKKyAgICBmZCA9IGZpbHBfb3BlbihwYXRoLCBmbGFncywgbW9kZSk7CisgICAgaWYoSVNfRVJSKGZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGZkOworfQorCitzdGF0aWMgdm9pZCBmaWxlX2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIGZpbHBfY2xvc2UoZmlsZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIGNhbl9yZWFkX2ZpbGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBzdHJ1Y3QgZmlsZSAqZmQgPSBmaWxlX29wZW4ocGF0aCwgT19SRE9OTFkpOworICAgIGlmICgoZmQgPT0gTlVMTCkgfHwgKGZkID09ICh2b2lkICopLUVOT0VOVCkpIC8qIC1FTk9FTlQ7IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgKi8KKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmaWxlX2Nsb3NlKGZkKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgYm9hcmRfaXNfc3ZrNCh2b2lkKQoreworICAgIHJldHVybiBjYW5fcmVhZF9maWxlKFNWSzRfSURFTlRfRklMRSk7Cit9CisKKy8qIEdldCBQQ0kgcmVzY2FuIHN0cmluZy4gSXQgaXMgdXNlZCBpbiBsaW51eCB0byByZXNjYW4gUENJZSBidXMgKi8KK2NvbnN0IGNoYXIgKmJjbW9sdF9ib2FyZF9wY2lfcmVzY2FuX3N0cmluZ19nZXQodm9pZCkKK3sKKyAgICByZXR1cm4gYm9hcmRfaXNfc3ZrNCgpID8gUENJRV9ERVZJQ0VfUkVTQ0FOX0ZJTEVfU1ZLNCA6IFBDSUVfREVWSUNFX1JFU0NBTl9GSUxFX1NWSzFfMzsKK30KKworLyogR2V0IGJ1cywgZGV2Zm4gLS0+IGRldl9pZCBtYXBwaW5nIHRhYmxlLgorICogVGhlIHRhYmxlIGlzIHRlcm1pbmF0ZWQgYnkgcm93IHdpdGggYnVzPS0xLGRldmZuPS0xCisgKi8KK2NvbnN0IGJ1c19kZXZmbl9kZXZpZCAqYmNtb2x0X2JvYXJkX3BjaV9tYXBfdGFibGVfZ2V0KHZvaWQpCit7CisgICAgcmV0dXJuIGJvYXJkX2lzX3N2azQoKSA/IGJ1c19kZXZmbl9kZXZpZF90YWJsZV9zdms0IDogYnVzX2RldmZuX2RldmlkX3RhYmxlX3N2azFfMzsKK30KKworLyogUmV0dXJuIFRSVUUgaWYgYm9hcmQgc3VwcG9ydHMgTWFwbGUtc3RhbmRhbG9uZSBtb2RlICovCitiY21vc19ib29sIGJjbW9sdF9ib2FyZF9zdXBwb3J0c19zdGFuZGFsb25lKHVpbnQzMl90IHZlcnNpb24pCit7CisgICAgcmV0dXJuIGJvYXJkX2lzX3N2azQoKSB8fCB2ZXJzaW9uID49IEZQR0FfVkVSX0ZPUl9TVEFOREFMT05FOworfQorCisvKiBSZXR1cm5zIG51bWJlciBvZiBtYXBsZSBkZXZpY2VzIG9uIHRoZSBib2FyZCAqLwordWludDhfdCBiY21vbHRfYm9hcmRfbnVtX21hcGxlX2RldmljZXModm9pZCkKK3sKKyAgICByZXR1cm4gYm9hcmRfaXNfc3ZrNCgpID8gMiA6IDE7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91dGlsc19saW51eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODg2N2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91dGlsc19saW51eC9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIE1ha2VmaWxlIGZvciBidWlsZGluZyB1dGlsaXRpZXMgYXMgbGludXggbW9kdWxlCisjCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKworTU9EX05BTUUgPSB1dGlsc19saW51eAorTU9EX1RZUEUgPSBsaW51eF9saWIKK3NyY3MgPSBiY21vbHRfYnVmLmMKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9idWYuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXRpbHNfbGludXgvYmNtb2x0X2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmY3YjgzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9idWYuYwpAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYnVmLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9idWYuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXRpbHNfbGludXgvYmNtb2x0X2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRmNzczZmUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9idWYuaApAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYnVmLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9jb252LmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9jb252LmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNmZiOGM5NwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXRpbHNfbGludXgvYmNtb2x0X2NvbnYuaApAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfY29udi5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9hcGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwMzVkMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9hcGkvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIyBDb21tb24gQVBJCisjCitNT0RfTkFNRSA9IGNvbW1vbl9hcGkKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IHV0aWxzIGRldl9sb2cKKworc3JjcyA9IGJjbW9sdF9tc2cuYworCitNT0RfSU5DX0RJUlMgPSAkKFNSQ19ESVIpICQoTU9ERUxfT1VUX0RJUikKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorICAgIE1PRF9JTkNfRElSUyArPSAkKFNSQ19ESVIpLy4uL3RyYW5zcG9ydAorICAgIHNyY3MgKz0gYmNtb2x0X2FwaS5jCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfYXBpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTVmN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfYXBpLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY210cl9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJiY21vbHRfYXBpLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZ19wYWNrLmgiCisKK3N5c3RlbV9tb2RlX2NoYW5nZV9jYiBzbV9jaGFuZ2VfY2I7CisKKy8qKiBTZXQgY29uZmlndXJhdGlvbgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIGNmZyAgICAgQ29uZmlndXJhdGlvbgorICogXHJldHVybnMgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21vbHRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfY2ZnICpjZmcpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wcmVzZW5jZV9tYXNrIHJvX21hc2s7CisKKyAgICBjZmctPmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCBubyBhdHRlbXAgaXMgbWFkZSB0byBzZXQgcmVhZC1vbmx5IHByb3BlcnR5ICovCisgICAgZXJyID0gYmNtb2x0X2dldF9wcm9wX3JlYWRvbmx5X21hc2soY2ZnLT5oZHIub2JqX3R5cGUsICZyb19tYXNrKTsKKyAgICBpZiAoZXJyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKChyb19tYXNrICYgY2ZnLT5oZHIucHJlc2VuY2VfbWFzaykpCisgICAgeworICAgICAgICBjZmctPmhkci5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRTsKKyAgICAgICAgY2ZnLT5oZHIuZXJyID0gQkNNX0VSUl9SRUFEX09OTFk7CisgICAgICAgIHN0cm5jcHkoY2ZnLT5oZHIuZXJyX3RleHQsICJSZWFkLW9ubHkgZmllbGRzIGNhbm5vdCBiZSBzZXQiLCBCQ01PTFRfTUFYX0VSUl9URVhUX0xFTkdUSCk7CisgICAgICAgIHJldHVybiBjZmctPmhkci5lcnI7CisgICAgfQorICAgIGVyciA9IGJjbXRyX2NhbGwoZGV2LCAmY2ZnLT5oZHIpOworICAgIGlmICgoY2ZnLT5oZHIuZXJyID09IEJDTV9FUlJfT0spICYmCisgICAgICAgIChjZmctPmhkci5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0RFVklDRSkgJiYKKyAgICAgICAgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoKGJjbW9sdF9kZXZpY2VfY2ZnKiljZmcsIGRldmljZSwgc3lzdGVtX21vZGUpKSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9zZXQoZGV2LCAoKGJjbW9sdF9kZXZpY2VfY2ZnKiljZmcpLT5kYXRhLnN5c3RlbV9tb2RlKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gc21fY2hhbmdlX2NiKQorICAgICAgICB7CisgICAgICAgICAgICBzbV9jaGFuZ2VfY2IoZGV2KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCisvKiogR2V0IGNvbmZpZ3VyYXRpb24KKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBjZmcgICAgIENvbmZpZ3VyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqIFRoZSBlcnJvciBjb2RlIGNhbiBpbmRpY2F0ZSBsb2NhbCBvciByZW1vdGUgZmFpbHVyZQorICovCitiY21vc19lcnJubyBiY21vbHRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfY2ZnICpjZmcpCit7CisgICAgY2ZnLT5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9HRVQ7CisgICAgcmV0dXJuIGJjbXRyX2NhbGwoZGV2LCAmY2ZnLT5oZHIpOworfQorCisvKiogQ2xlYXIgY29uZmlndXJhdGlvbgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIGNmZyAgICAgQ29uZmlndXJhdGlvbgorICogXHJldHVybnMgZXJyb3IgY29kZQorICogVGhlIGVycm9yIGNvZGUgY2FuIGluZGljYXRlIGxvY2FsIG9yIHJlbW90ZSBmYWlsdXJlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X2NmZyAqY2ZnKQoreworICAgIGNmZy0+aGRyLnByZXNlbmNlX21hc2sgPSBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEw7IC8qIGNsZWFyIGlzIGFsd2F5cyBvYmplY3Qtd2lkZSAqLworICAgIGNmZy0+aGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI7CisgICAgcmV0dXJuIGJjbXRyX2NhbGwoZGV2LCAmY2ZnLT5oZHIpOworfQorCisvKiogR2V0IHN0YXRpc3RpY3MKKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBzdGF0ICAgIENvbmZpZ3VyYXRpb24KKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgIEZsYWdzCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9zdGF0ICpzdGF0LCBiY21vbHRfc3RhdF9mbGFncyBmbGFncykKK3sKKyAgICBzdGF0LT5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9HRVQ7CisgICAgaWYgKChmbGFncyAmIEJDTU9MVF9TVEFUX0ZMQUdTX0NMRUFSX09OX1JFQUQpKQorICAgIHsKKyAgICAgICAgc3RhdC0+aGRyLnR5cGUgfD0gQkNNT0xUX01TR19UWVBFX0NMRUFSOworICAgIH0KKyAgICByZXR1cm4gYmNtdHJfY2FsbChkZXYsICZzdGF0LT5oZHIpOworfQorCisvKiogR2V0IHN0YXRpc3RpY3MgY29uZmlndXJhdGlvbgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIGNmZyAgICAgQ29uZmlndXJhdGlvbgorICogXHJldHVybnMgZXJyb3IgY29kZQorICogVGhlIGVycm9yIGNvZGUgY2FuIGluZGljYXRlIGxvY2FsIG9yIHJlbW90ZSBmYWlsdXJlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X3N0YXRfY2ZnICpjZmcpCit7CisgICAgY2ZnLT5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9HRVQ7CisgICAgY2ZnLT5oZHIucHJlc2VuY2VfbWFzayA9IEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTDsKKyAgICByZXR1cm4gYmNtdHJfY2FsbChkZXYsICZjZmctPmhkcik7Cit9CisKKy8qKiBTZXQgc3RhdGlzdGljcyBjb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfc3RhdF9jZmcgKmNmZykKK3sKKyAgICBjZmctPmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICBjZmctPmhkci5wcmVzZW5jZV9tYXNrID0gQkNNT0xUX1BSRVNFTkNFX01BU0tfQUxMOworICAgIHJldHVybiBiY210cl9jYWxsKGRldiwgJmNmZy0+aGRyKTsKK30KKworLyoqIEdldCBpbmRpY2F0aW9uIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBjZmcgICAgIENvbmZpZ3VyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqIFRoZSBlcnJvciBjb2RlIGNhbiBpbmRpY2F0ZSBsb2NhbCBvciByZW1vdGUgZmFpbHVyZQorICovCitiY21vc19lcnJubyBiY21vbHRfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9hdXRvX2NmZyAqY2ZnKQoreworICAgIGNmZy0+aGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfR0VUOworICAgIGlmIChjZmctPmhkci5wcmVzZW5jZV9tYXNrID09IDApCisgICAgeworICAgICAgICBjZmctPmhkci5wcmVzZW5jZV9tYXNrID0gQkNNT0xUX1BSRVNFTkNFX01BU0tfQUxMOworICAgIH0KKyAgICByZXR1cm4gYmNtdHJfY2FsbChkZXYsICZjZmctPmhkcik7Cit9CisKKy8qKiBTZXQgaW5kaWNhdGlvbiBjb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfYXV0b19jZmcgKmNmZykKK3sKKyAgICBjZmctPmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICByZXR1cm4gYmNtdHJfY2FsbChkZXYsICZjZmctPmhkcik7Cit9CisKKy8qKiBJbnZva2Ugb3BlcmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgb3BlciAgICBPcGVyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X29wZXJfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9vcGVyICpvcGVyKQoreworICAgIG9wZXItPmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICByZXR1cm4gYmNtdHJfY2FsbChkZXYsICZvcGVyLT5oZHIpOworfQorCisvKiogU2VuZCBtZXNzYWdlIHRvIE9OVQorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIG1zZyAgICAgTWVzc2FnZSB0byBiZSBzZW50CisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9wcm94eV9zZW5kKGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9wcm94eSAqbXNnKQoreworICAgIG1zZy0+aGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfU0VUOworICAgIHJldHVybiBiY210cl9jYWxsKGRldiwgJm1zZy0+aGRyKTsKK30KKworCisvKiAoVW4pUmVnaXN0ZXIgYXV0by9wcm94eSBtZXNzYWdlICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3J4X2NiX3NldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCBiY21vbHRfcnhfY2ZnICpyeF9jZmcpCit7CisgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHRwYXJtID0geworICAgICAgICAuZ3JvdXAgPSBncm91cCwKKyAgICAgICAgLnN1Ymdyb3VwID0gQkNNT0xUX1NVQkdST1VQX0FOWSwKKyAgICB9OworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBpbnQgaTsKKworICAgIGlmICghcnhfY2ZnKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgdHBhcm0ub2JqZWN0ID0gcnhfY2ZnLT5vYmpfdHlwZTsKKyAgICB0cGFybS5hcHBfY2IgPSByeF9jZmctPnJ4X2NiOworICAgIHRwYXJtLmZsYWdzID0gcnhfY2ZnLT5mbGFnczsKKyAgICBpZiAocnhfY2ZnLT5mbGFncyA9PSBCQ01PTFRfQVVUT19GTEFHU19ESVNQQVRDSCkKKyAgICAgICAgdHBhcm0ubW9kdWxlID0gcnhfY2ZnLT5tb2R1bGU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkNNVFJfTUFYX0lOU1RBTkNFUyAmJiAhcmM7IGkrKykKKyAgICB7CisgICAgICAgIC8qIFNraXAgaW50ZXJmYWNlcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgZGVmYXVsdCBtYXNrICovCisgICAgICAgIGlmIChyeF9jZmctPnBvbl9uaV9tYXNrICYmIDAgPT0gKHJ4X2NmZy0+cG9uX25pX21hc2sgJiAoMSA8PCBpKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICB0cGFybS5pbnN0YW5jZSA9IGk7CisgICAgICAgIGlmIChyeF9jZmctPnJ4X2NiKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiByZWdpc3RyYXRpb24gb2Ygc3BlY2lmaWMgb2JqZWN0IC0gdW5yZWdpc3RlciB0aGUgb2xkIGhhbmRsZXIgZmlyc3QgKi8KKyAgICAgICAgICAgIGlmIChyeF9jZmctPm9ial90eXBlICE9IEJDTU9MVF9PQkpFQ1RfQU5ZKQorICAgICAgICAgICAgICAgIGJjbXRyX21zZ19oYW5kbGVyX3VucmVnaXN0ZXIoZGV2aWNlLCAmdHBhcm0pOworICAgICAgICAgICAgcmMgPSBiY210cl9tc2dfaGFuZGxlcl9yZWdpc3RlcihkZXZpY2UsICZ0cGFybSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IGJjbXRyX21zZ19oYW5kbGVyX3VucmVnaXN0ZXIoZGV2aWNlLCAmdHBhcm0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogKFVuKVJlZ2lzdGVyIGF1dG9ub21vdXMgaW5kaWNhdGlvbiBtZXNzYWdlIGhhbmRsZXIKKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICAgICAgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIHJ4X2NmZyAgICAgICAgICBSZWNlaXZlIGhhbmRsZXIgY29uZmlndXJhdGlvbgorICogXHJldHVybnMgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21vbHRfYXV0b19yeF9jYl9zZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X3J4X2NmZyAqcnhfY2ZnKQoreworICAgIHJldHVybiBiY21vbHRfcnhfY2Jfc2V0KGRldmljZSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCByeF9jZmcpOworfQorCisvKiAoVW4pUmVnaXN0ZXIgcHJveHkgbWVzc2FnZSBoYW5kbGVyCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICByeF9jZmcgICAgICAgICAgUmVjZWl2ZSBoYW5kbGVyIGNvbmZpZ3VyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3Byb3h5X3J4X2NiX3NldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfcnhfY2ZnICpyeF9jZmcpCit7CisgICAgcmV0dXJuIGJjbW9sdF9yeF9jYl9zZXQoZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYLCByeF9jZmcpOworfQorCisvKiBHZXQgY29uZmlndXJhdGlvbiBvZiBtdWx0aXBsZSBvYmplY3RzICovCitiY21vc19lcnJubyBiY21vbHRfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfY2ZnICpmaWx0ZXIsCisgICAgYmNtb2x0X2ZpbHRlcl9mbGFncyBmaWx0ZXJfZmxhZ3MsIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0KQoreworICAgIGludCBpOworCisgICAgLyogSWYgbWVzc2FnZSBzZXQgYWxyZWFkeSBpbmNsdWRlcyBtZXNzYWdlcyByZWNlaXZlZCBvbiBwcmV2aW91cyBpdGVyYXRpb24gLSByZWxlYXNlIHRoZW0gKi8KKyAgICBmb3IgKGk9MDsgaSA8IG1zZ19zZXQtPm51bV9pbnN0YW5jZXM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtc2dfc2V0LT5tc2dbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2dfc2V0LT5tc2dbaV0pOworICAgICAgICAgICAgbXNnX3NldC0+bXNnW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1zZ19zZXQtPmZpbHRlcl9mbGFncyA9IGZpbHRlcl9mbGFnczsKKyAgICBtc2dfc2V0LT5udW1faW5zdGFuY2VzID0gMDsKKyAgICBtc2dfc2V0LT5tb3JlID0gQkNNT1NfRkFMU0U7CisKKyAgICAvKiBTZXQgbXNnX3NldCBpbiBmaWx0ZXIgbWVzc2FnZSBhbmQgc3VibWl0IHJlcXVlc3QqLworICAgIGZpbHRlci0+aGRyLm1zZ19zZXQgPSBtc2dfc2V0OworICAgIGZpbHRlci0+aGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOworCisgICAgcmV0dXJuIGJjbXRyX2NhbGwoZGV2LCAmZmlsdGVyLT5oZHIpOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfYXBpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMThiYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfYXBpLmgKQEAgLTAsMCArMSw1MjEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX0FQSV9IXworI2RlZmluZSBCQ01PTFRfQVBJX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisKKy8qKiBcZGVmZ3JvdXAgYXBpIEJDTTY4NjJ4IEhvc3QgQVBJCisgKgorICogRGF0YSBUeXBlcywgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgQkNNNjg2MnggZGV2aWNlIG1hbmFnZW1lbnQuCisgKiBAeworICovCisKKy8qKiBcZGVmZ3JvdXAgYXBpX21hY3JvcyBNZXNzYWdlIEFjY2VzcyBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoKKyAqIE1lc3NhZ2UgSW5pdGlhbGl6YXRpb24gTWFjcm9zCisgKi8KKworLyogSW5pdGlhbGl6ZSByZXF1ZXN0LiBJbnRlcm5hbCBtYWNybworICogXHBhcmFtW2luXSAgIF9oICAgICAgTWVzc2FnZSBoZWFkZXIKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX2dycCAgICBtZXNzYWdlIHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfc3ViZ3JwIG1lc3NhZ2Ugc3ViZ3JvdXAKKyAqLworI2RlZmluZSBfQkNNT0xUX1JFUV9JTklUKF9oLCBfb2JqLCBfZ3JwLCBfc3ViZ3JwKSBcCisgICAgKF9oKS0+aGRyLmRpciA9IEJDTU9MVF9NU0dfRElSX1JFUVVFU1Q7XAorICAgIChfaCktPmhkci5lcnIgPSBCQ01fRVJSX09LO1wKKyAgICAoX2gpLT5oZHIucHJlc2VuY2VfbWFzayA9IDA7XAorICAgIChfaCktPmhkci5vYmpfdHlwZSA9IGJjbW9sdF9vYmpfaWRfICMjIF9vYmo7XAorICAgIChfaCktPmhkci5ncm91cCA9IF9ncnA7XAorICAgIChfaCktPmhkci5zdWJncm91cCA9ICh1aW50MTZfdClfc3ViZ3JwO1wKKyAgICAoX2gpLT5oZHIuY29ycl90YWcgPSAwCisKKy8qKiBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX3MgICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfa2V5ICAgIE9iamVjdCBrZXkKKyAqLworI2RlZmluZSBCQ01PTFRfQ0ZHX0lOSVQoX3MsIF9vYmosIF9rZXkpIFwKKyAgICBkbyB7XAorICAgICAgICBiY21vbHRfICMjIF9vYmogIyMgX2NmZyAqX3hfID0gX3M7XAorICAgICAgICBtZW1zZXQoX3hfLCAwLCBzaXplb2YoKl94XykpO1wKKyAgICAgICAgX0JDTU9MVF9SRVFfSU5JVCgmKChfeF8pLT5oZHIpLCBfb2JqLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCk7XAorICAgICAgICAoX3hfKS0+a2V5ID0gX2tleTtcCisgICAgfSB3aGlsZSAoMCkKKworLyoqIEluaXRpYWxpemUgc3RhdGlzdGljcyBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfcyAgICAgIFN0YXRpc3RpY3Mgc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9rZXkgICAgT2JqZWN0IGtleQorICovCisjZGVmaW5lIEJDTU9MVF9TVEFUX0lOSVQoX3MsIF9vYmosIF9rZXkpIFwKKyAgICBkbyB7XAorICAgICAgICBiY21vbHRfICMjIF9vYmogIyMgX3N0YXQgKl94XyA9IF9zO1wKKyAgICAgICAgbWVtc2V0KF94XywgMCwgc2l6ZW9mKCpfeF8pKTtcCisgICAgICAgIF9CQ01PTFRfUkVRX0lOSVQoJigoX3hfKS0+aGRyKSwgX29iaiwgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwKTtcCisgICAgICAgIChfeF8pLT5rZXkgPSBfa2V5O1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogSW5pdGlhbGl6ZSBzdGF0aXN0aWMgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfcyAgICAgIFN0YXRpc3RpY3MgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX3N0YXQgICBTdGF0aXN0aWMgY291bnRlciBuYW1lCisgKiBccGFyYW1baW5dICAgX2tleSAgICBPYmplY3Qga2V5CisgKi8KKyNkZWZpbmUgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoX3MsIF9vYmosIF9zdGF0LCBfa2V5KSBcCisgICAgZG8ge1wKKyAgICAgICAgYmNtb2x0XyAjIyBfb2JqICMjIF9zdGF0X2NmZyAqX3hfID0gX3M7XAorICAgICAgICBtZW1zZXQoX3hfLCAwLCBzaXplb2YoKl94XykpO1wKKyAgICAgICAgX0JDTU9MVF9SRVFfSU5JVCgmKChfeF8pLT5oZHIpLCBfb2JqLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCBiY21vbHRfICMjIF9vYmogIyMgX3N0YXRfaWRfICMjIF9zdGF0KTtcCisgICAgICAgIChfeF8pLT5rZXkgPSBfa2V5O1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogSW5pdGlhbGl6ZSBpbmRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX3MgICAgICBJbmRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9rZXkgICAgT2JqZWN0IGtleQorICovCisjZGVmaW5lIEJDTU9MVF9BVVRPX0NGR19JTklUKF9zLCBfb2JqLCBfa2V5KSBcCisgICAgZG8ge1wKKyAgICAgICAgYmNtb2x0XyAjIyBfb2JqICMjIF9hdXRvX2NmZyAqX3hfID0gX3M7XAorICAgICAgICBtZW1zZXQoX3hfLCAwLCBzaXplb2YoKl94XykpO1wKKyAgICAgICAgX0JDTU9MVF9SRVFfSU5JVCgmKChfeF8pLT5oZHIpLCBfb2JqLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwKTtcCisgICAgICAgIChfeF8pLT5rZXkgPSBfa2V5O1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogSW5pdGlhbGl6ZSBvcGVyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX3MgICAgICBPcGVyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9vcCAgICAgT3BlcmF0aW9uIHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfa2V5ICAgIE9iamVjdCBrZXkKKyAqLworI2RlZmluZSBCQ01PTFRfT1BFUl9JTklUKF9zLCBfb2JqLCBfb3AsIF9rZXkpIFwKKyAgICBkbyB7XAorICAgICAgICBiY21vbHRfICMjIF9vYmogIyMgXyAjIyBfb3AgKl94XyA9IF9zO1wKKyAgICAgICAgbWVtc2V0KF94XywgMCwgc2l6ZW9mKCpfeF8pKTtcCisgICAgICAgIF9CQ01PTFRfUkVRX0lOSVQoJigoX3hfKS0+aGRyKSwgX29iaiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBiY21vbHRfICMjIF9vYmogIyMgX29wZXJfaWRfICMjIF9vcCk7XAorICAgICAgICAoX3hfKS0+a2V5ID0gX2tleTtcCisgICAgfSB3aGlsZSAoMCkKKworLyoqIEluaXRpYWxpemUgcHJveHkgbWVzc2FnZSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfcyAgICAgIE9wZXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX20gICAgICBQcm94eSBtZXNzYWdlIHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfa2V5ICAgIE9iamVjdCBrZXkKKyAqLworI2RlZmluZSBCQ01PTFRfUFJPWFlfSU5JVChfcywgX29iaiwgX20sIF9rZXkpIFwKKyAgICBkbyB7XAorICAgICAgICBiY21vbHRfICMjIF9vYmogIyMgXyAjIyBfbSAqX3hfID0gX3M7XAorICAgICAgICBtZW1zZXQoX3hfLCAwLCBzaXplb2YoKl94XykpO1wKKyAgICAgICAgX0JDTU9MVF9SRVFfSU5JVCgmKChfeF8pLT5oZHIpLCBfb2JqLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBiY21vbHRfICMjIF9vYmogIyMgX3Byb3h5X2lkXyAjIyBfbSk7XAorICAgICAgICAoX3hfKS0+a2V5ID0gX2tleTtcCisgICAgfSB3aGlsZSAoMCkKKworLyoqIEluaXRpYWxpemUgYXV0b25vbW91cyBpbmRpY2F0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9zICAgICAgQXV0b25vbW91cyBpbmRpY2F0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfYXUgICAgIEF1dG9ub21vdXMgaW5kaWNhdGlvbiB0eXBlCisgKi8KKyNkZWZpbmUgQkNNT0xUX0FVVE9fSU5JVChfcywgX29iaiwgX2F1KSBcCisgICAgZG8ge1wKKyAgICAgICAgYmNtb2x0XyAjIyBfb2JqICMjIF8gIyMgX2F1ICpfeF8gPSBfcztcCisgICAgICAgIF9CQ01PTFRfUkVRX0lOSVQoJigoX3hfKS0+aGRyKSwgX29iaiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCBiY21vbHRfICMjIF9vYmogIyMgX2F1dG9faWRfICMjIF9hdSk7XAorICAgICAgICBfeF8tPmhkci5oZHIuc3ViY2ggPSAwO1wKKyAgICAgICAgX3hfLT5oZHIuaGRyLnByZXNlbmNlX21hc2sgPSAoMVVMTCA8PCAodWludDY0X3QpYmNtb2x0XyAjIyBfb2JqICMjIF8gIyMgX2F1ICMjIF9pZF9hbGxfcHJvcGVydGllcykgLSAxO1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogSW5pdGlhbGl6ZSBwcm94eV9yeCBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfcyAgICAgIFByb3h5IHJ4IG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9wciAgICAgUHJveHkgbWVzc2FnZSB0eXBlCisgKi8KKyNkZWZpbmUgQkNNT0xUX1BST1hZX1JYX0lOSVQoX3MsIF9vYmosIF9wcikgXAorICAgIGRvIHtcCisgICAgICAgIGJjbW9sdF8gIyMgX29iaiAjIyBfICMjIF9wciAqX3hfID0gX3M7XAorICAgICAgICBfQkNNT0xUX1JFUV9JTklUKCYoKF94XyktPmhkciksIF9vYmosIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgsIGJjbW9sdF8gIyMgX29iaiAjIyBfcHJveHlfcnhfaWRfICMjIF9wcik7XAorICAgICAgICBfeF8tPmhkci5oZHIuc3ViY2ggPSAwO1wKKyAgICAgICAgX3hfLT5oZHIuaGRyLnByZXNlbmNlX21hc2sgPSAoMVVMTCA8PCAodWludDY0X3QpYmNtb2x0XyAjIyBfb2JqICMjIF8gIyMgX3ByICMjIF9pZF9hbGxfcHJvcGVydGllcykgLSAxO1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogU2V0IHRoZSBtZW1vcnkgYnVmZmVyIHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgd2l0aGluIGEgY2ZnIGdldAorKiBccGFyYW1baW5dICAgX3MgICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorKiBccGFyYW1baW5dICAgX2J1ZiAgICBQb2ludGVyIHRvIGEgbG9jYXRpb24gaW4gbWVtb3J5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBsaXN0cworKiBccGFyYW1baW5dICAgX2xlbiAgICBMZW5ndGggb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IF9idWYKKyovCisjZGVmaW5lIEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKF9zLCBfb2JqLCBfYnVmLCBfbGVuKSBcCisgICAgZG8ge1wKKyAgICAgICAgYmNtb2x0XyAjIyBfb2JqICMjIF9jZmcgKl94XyA9IF9zO1wKKyAgICAgICAgX3hfLT5oZHIuaGRyLmxpc3RfYnVmID0gX2J1ZjtcCisgICAgICAgIF94Xy0+aGRyLmhkci5saXN0X2J1Zl9zaXplID0gX2xlbjtcCisgICAgfSB3aGlsZSAoMCkKKworLyogSW50ZXJuYWwgbWFjcm86IEdldCBhIGJpdG1hc2sgZ2l2ZW4gYSBwcm9wZXJ0eSBJRCBlbnVtICovCisjZGVmaW5lIEJDTU9MVF9QUk9QX01BU0tfR0VUKF9vYmosIF9ncnAsIF9wKSBcCisgICAgKGJjbW9sdF8gIyMgX29iaiAjIyBfZ3JwICMjIF9pZF8gIyMgX3AgPT0gYmNtb2x0XyAjIyBfb2JqICMjIF9ncnAgIyMgX2lkX2FsbF9wcm9wZXJ0aWVzID8gXAorICAgICAgICAoKDFVTEwgPDwgKHVpbnQ2NF90KWJjbW9sdF8gIyMgX29iaiAjIyBfZ3JwICMjIF9pZF8gIyMgX3ApIC0gMSkgOiBcCisgICAgICAgICgxVUxMIDw8ICh1aW50NjRfdCliY21vbHRfICMjIF9vYmogIyMgX2dycCAjIyBfaWRfICMjIF9wKSkKKworLyogSW50ZXJuYWwgbWFjcm86IEluZGljYXRlIHRoYXQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyBwcmVzZW50ICovCisjZGVmaW5lIF9CQ01PTFRfUFJPUF9TRVRfUFJFU0VOVChfbSwgX29iaiwgX2dycCwgX3ApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgKF9tKS0+aGRyLmhkci5wcmVzZW5jZV9tYXNrIHw9IEJDTU9MVF9QUk9QX01BU0tfR0VUKF9vYmosIF9ncnAsIF9wKTtcCisgICAgfSB3aGlsZSAoMCkKKworLyogSW50ZXJuYWwgbWFjcm86IGNoZWNrIGlmIHByb3BlcnR5IGlzIHByZXNlbnQgKi8KKyNkZWZpbmUgX0JDTU9MVF9QUk9QX0lTX1BSRVNFTlQoX20sIF9vYmosIF9ncnAsIF9wKSBcCisgICAgKCgoX20pLT5oZHIuaGRyLnByZXNlbmNlX21hc2sgJiBCQ01PTFRfUFJPUF9NQVNLX0dFVChfb2JqLCBfZ3JwLCBfcCkpID8gXAorICAgICAgICBCQ01PU19UUlVFIDogQkNNT1NfRkFMU0UpCisKKy8qKiBTZXQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpbiBtZXNzYWdlIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9tICAgICAgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisgKiBccGFyYW1baW5dICAgX3YgICAgICBQcm9wZXJ0eSB2YWx1ZQorICovCisjZGVmaW5lIEJDTU9MVF9DRkdfUFJPUF9TRVQoX20sIF9vYmosIF9wLCBfdikgXAorICAgIGRvIHsgXAorICAgICAgICBfQkNNT0xUX1BST1BfU0VUX1BSRVNFTlQoX20sIF9vYmosIF9jZmcsIF9wKTtcCisgICAgICAgIChfbSktPmRhdGEuX3AgPSAoX3YpO1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogSW5kaWNhdGUgdGhhdCBjb25maWd1cmF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSByZWFkCisgKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01PTFRfQ0ZHX1BST1BfR0VUKF9tLCBfb2JqLCBfcCkgX0JDTU9MVF9QUk9QX1NFVF9QUkVTRU5UKF9tLCBfb2JqLCBfY2ZnLCBfcCkKKworLyoqIENoZWNrIGlmIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgc2V0IGluIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKF9tLCBfb2JqLCBfcCkgICAgX0JDTU9MVF9QUk9QX0lTX1BSRVNFTlQoX20sIF9vYmosIF9jZmcsIF9wKQorCisvKiogSW5kaWNhdGUgdGhhdCBzdGF0aXN0aWMgcHJvcGVydHkgc2hvdWxkIGJlIHJlYWQKKyAqIFxwYXJhbVtpbl0gICBfbSAgICAgIENvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9wICAgICAgUHJvcGVydHkgbmFtZQorICovCisjZGVmaW5lIEJDTU9MVF9TVEFUX1BST1BfR0VUKF9tLCBfb2JqLCBfcCkgX0JDTU9MVF9QUk9QX1NFVF9QUkVTRU5UKF9tLCBfb2JqLCBfc3RhdCwgX3ApCisKKy8qKiBDaGVjayBpZiBzdGF0aXN0aWMgcHJvcGVydHkgaXMgc2V0IGluIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX20gICAgICBTdGF0aXN0aWMgc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9wICAgICAgUHJvcGVydHkgbmFtZQorICovCisjZGVmaW5lIEJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKF9tLCBfb2JqLCBfcCkgICAgX0JDTU9MVF9QUk9QX0lTX1BSRVNFTlQoX20sIF9vYmosIF9zdGF0LCBfcCkKKworLyoqIFNldCBvcGVyYXRpb24gcHJvcGVydHkgaW4gbWVzc2FnZSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfbSAgICAgIE9wZXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX29wICAgICBPcGVyYXRpb24KKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqIFxwYXJhbVtpbl0gICBfdiAgICAgIFByb3BlcnR5IHZhbHVlCisgKi8KKyNkZWZpbmUgQkNNT0xUX09QRVJfUFJPUF9TRVQoX20sIF9vYmosIF9vcCwgX3AsIF92KSBcCisgICAgZG8geyBcCisgICAgICAgIF9CQ01PTFRfUFJPUF9TRVRfUFJFU0VOVChfbSwgX29iaiwgXyAjIyBfb3AsIF9wKTtcCisgICAgICAgIChfbSktPmRhdGEuX3AgPSAoX3YpO1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogQ2hlY2sgaWYgb3BlcmF0aW9uIHByb3BlcnR5IGlzIHNldCBpbiBtZXNzYWdlIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX20gICAgICBPcGVyYXRpb24gc3RydWN0dXJlCisqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisqIFxwYXJhbVtpbl0gICBfb3AgICAgIE9wZXJhdGlvbgorKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisqLworI2RlZmluZSBCQ01PTFRfT1BFUl9QUk9QX0lTX1NFVChfbSwgX29iaiwgX29wLCBfcCkgICAgX0JDTU9MVF9QUk9QX0lTX1BSRVNFTlQoX20sIF9vYmosIF9vcCwgX3ApCisKKy8qKiBJbmRpY2F0ZSB0aGF0IGF1dG9ub21vdXMgbWVzc2FnZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSByZWFkCisgKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoX20sIF9vYmosIF9wKSBfQkNNT0xUX1BST1BfU0VUX1BSRVNFTlQoX20sIF9vYmosIF9hdXRvX2NmZywgX3ApCisKKy8qKiBTZXQgYXV0b25vbW91cyBtZXNzYWdlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaW4gbWVzc2FnZSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfbSAgICAgIE9wZXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisgKiBccGFyYW1baW5dICAgX3YgICAgICBQcm9wZXJ0eSB2YWx1ZQorICovCisjZGVmaW5lIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVChfbSwgX29iaiwgX3AsIF92KSBcCisgICAgZG8geyBcCisgICAgICAgIF9CQ01PTFRfUFJPUF9TRVRfUFJFU0VOVChfbSwgX29iaiwgX2F1dG9fY2ZnLCBfcCk7XAorICAgICAgICAoX20pLT5kYXRhLl9wID0gKF92KTtcCisgICAgfSB3aGlsZSAoMCkKKworLyoqIENoZWNrIGlmIGF1dG9ub21vdXMgbWVzc2FnZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIHNldCBpbiBtZXNzYWdlIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisqLworI2RlZmluZSBCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoX20sIF9vYmosIF9wKSBfQkNNT0xUX1BST1BfSVNfUFJFU0VOVChfbSwgX29iaiwgX2F1dG9fY2ZnLCBfcCkKKworLyoqIFNldCBzdGF0aXN0aWMgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpbiBtZXNzYWdlIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisqIFxwYXJhbVtpbl0gICBfdiAgICAgIFByb3BlcnR5IHZhbHVlCisqLworI2RlZmluZSBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoX20sIF9vYmosIF9wLCBfdikgXAorICAgIGRvIHsgXAorICAgICAgICBfQkNNT0xUX1BST1BfU0VUX1BSRVNFTlQoX20sIF9vYmosIF9zdGF0X2NmZywgX3ApO1wKKyAgICAgICAgKF9tKS0+ZGF0YS5fcCA9IChfdik7XAorICAgIH0gd2hpbGUgKDApCisKKy8qKiBDaGVjayBpZiBzdGF0aXN0aWMgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyBzZXQgaW4gbWVzc2FnZSBzdHJ1Y3R1cmUKKyogXHBhcmFtW2luXSAgIF9tICAgICAgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyogXHBhcmFtW2luXSAgIF9wICAgICAgUHJvcGVydHkgbmFtZQorKi8KKyNkZWZpbmUgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfSVNfU0VUKF9tLCBfb2JqLCBfcCkgX0JDTU9MVF9QUk9QX0lTX1BSRVNFTlQoX20sIF9vYmosIF9zdGF0X2NmZywgX3ApCisKKy8qKiBTZXQgcHJveHkgbWVzc2FnZSBwcm9wZXJ0eSBpbiBtZXNzYWdlIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9tICAgICAgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX2dycCAgICBQcm94eSBtZXNzYWdlIHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqIFxwYXJhbVtpbl0gICBfdiAgICAgIFByb3BlcnR5IHZhbHVlCisgKi8KKyNkZWZpbmUgQkNNT0xUX1BST1hZX1BST1BfU0VUKF9tLCBfb2JqLCBfZ3JwLCBfcCwgX3YpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgX0JDTU9MVF9QUk9QX1NFVF9QUkVTRU5UKF9tLCBfb2JqLCBfICMjIF9ncnAsIF9wKTtcCisgICAgICAgIChfbSktPmRhdGEuX3AgPSAoX3YpO1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogXGRlZmdyb3VwIG11bHRpX2FwaV9mdW5jIE11bHRpLW9iamVjdCBwcm9wZXJ0eSBhY2Nlc3MgbWFjcm9zCisgKiBAeworICovCisKKy8qCisgKiBNYWNyb3MgZm9yIG11bHRpLW9iamVjdCBjb25maWd1cmF0aW9uIGFuZCBzdGF0aXN0aWNzIHJldHJpZXZhbAorICovCisKKy8qIEludGVybmFsIG1hY3JvOiBJbmRpY2F0ZSB0aGF0IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgcHJlc2VudCAqLworI2RlZmluZSBfQkNNT0xUX01TR1NFVF9QUk9QX1NFVF9QUkVTRU5UKF9zZXQsIF9vYmosIF9ncnAsIF9wKSBcCisgICAgZG8geyBcCisgICAgICAgIChfc2V0KS0+cHJlc2VuY2VfbWFzayB8PSBCQ01PTFRfUFJPUF9NQVNLX0dFVChfb2JqLCBfZ3JwLCBfcCk7XAorICAgIH0gd2hpbGUgKDApCisKKy8qIEludGVybmFsIG1hY3JvOiBjaGVjayBpZiBwcm9wZXJ0eSBpcyBwcmVzZW50ICovCisjZGVmaW5lIF9CQ01PTFRfTVNHU0VUX1BST1BfSVNfUFJFU0VOVChfc2V0LCBfb2JqLCBfZ3JwLCBfcCkgXAorICAgICgoKF9zZXQpLT5wcmVzZW5jZV9tYXNrICYgQkNNT0xUX1BST1BfTUFTS19HRVQoX29iaiwgX2dycCwgX3ApKSA/IFwKKyAgICAgICAgQkNNT1NfVFJVRSA6IEJDTU9TX0ZBTFNFKQorCisvKiogSW5kaWNhdGUgdGhhdCBjb25maWd1cmF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSByZWFkCisgKiBccGFyYW1baW5dICAgX3NldCAgICBNZXNzYWdlIHNldAorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChfc2V0LCBfb2JqLCBfcCkgIF9CQ01PTFRfTVNHU0VUX1BST1BfU0VUX1BSRVNFTlQoX3NldCwgX29iaiwgX2NmZywgX3ApCisKKy8qKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIHNldCBpbiBtZXNzYWdlIHNldAorICogXHBhcmFtW2luXSAgIF9zZXQgICAgTWVzc2FnZSBzZXQKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisgKi8KKyNkZWZpbmUgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQoX3NldCwgX29iaiwgX3ApIF9CQ01PTFRfTVNHU0VUX1BST1BfSVNfUFJFU0VOVChfc2V0LCBfb2JqLCBfY2ZnLCBfcCkKKworLyoqIEluZGljYXRlIHRoYXQgc3RhdGlzdGljIHNob3VsZCBiZSByZWFkCisgKiBccGFyYW1baW5dICAgX3NldCAgICBNZXNzYWdlIHNldAorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01PTFRfTVNHU0VUX1NUQVRfUFJPUF9HRVQoX3NldCwgX29iaiwgX3ApICBfQkNNT0xUX01TR1NFVF9QUk9QX1NFVF9QUkVTRU5UKF9zZXQsIF9vYmosIF9zdGF0LCBfcCkKKworLyoqIENoZWNrIGlmIHN0YXRpc3RpYyBwcm9wZXJ0eSBpcyBzZXQgaW4gbWVzc2FnZSBzZXQKKyAqIFxwYXJhbVtpbl0gICBfc2V0ICAgIE1lc3NhZ2Ugc2V0CisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9wICAgICAgUHJvcGVydHkgbmFtZQorICovCisjZGVmaW5lIEJDTU9MVF9NU0dTRVRfU1RBVF9QUk9QX0lTX1NFVChfc2V0LCBfb2JqLCBfcCkgX0JDTU9MVF9NU0dTRVRfUFJPUF9JU19QUkVTRU5UKF9tLCBfb2JqLCBfc3RhdCwgX3ApCisKKy8qKiBAfSAqLworCisvKiogQH0gKi8KKworLyoqIFxkZWZncm91cCBhcGlfZnVuYyBBUEkgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qCisgKiBBUEkKKyAqLworCit0eXBlZGVmIHZvaWQgKCpzeXN0ZW1fbW9kZV9jaGFuZ2VfY2IpKGJjbW9sdF9kZXZpZCBkZXYpOworCitleHRlcm4gc3lzdGVtX21vZGVfY2hhbmdlX2NiIHNtX2NoYW5nZV9jYjsKKworLyoqIFNldCBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9jZmcgKmNmZyk7CisKKy8qKiBHZXQgQ29uZmlndXJhdGlvbgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIGNmZyAgICAgQ29uZmlndXJhdGlvbgorICogXHJldHVybnMgZXJyb3IgY29kZQorICogVGhlIGVycm9yIGNvZGUgY2FuIGluZGljYXRlIGxvY2FsIG9yIHJlbW90ZSBmYWlsdXJlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9jZmcgKmNmZyk7CisKKy8qKiBDbGVhciBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfY2ZnICpjZmcpOworCisvKiogR2V0IFN0YXRpc3RpY3MKKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBzdGF0ICAgIENvbmZpZ3VyYXRpb24KKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgIEZsYWdzCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9zdGF0ICpzdGF0LCBiY21vbHRfc3RhdF9mbGFncyBmbGFncyk7CisKKy8qKiBHZXQgU3RhdGlzdGljcyBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfc3RhdF9jZmcgKmNmZyk7CisKKy8qKiBTZXQgU3RhdGlzdGljcyBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfc3RhdF9jZmcgKmNmZyk7CisKKy8qKiBHZXQgSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfYXV0b19jZmcgKmNmZyk7CisKKy8qKiBTZXQgSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfYXV0b19jZmcgKmNmZyk7CisKKy8qKiBTdWJtaXQgT3BlcmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgb3BlciAgICBPcGVyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X29wZXJfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9vcGVyICpvcGVyKTsKKworLyoqIFNlbmQgTWVzc2FnZSB0byBPTlUKKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBtc2cgICAgIE1lc3NhZ2UgdG8gYmUgc2VudAorICogXHJldHVybnMgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21vbHRfcHJveHlfc2VuZChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfcHJveHkgKm1zZyk7CisKKy8qKiBSZWNlaXZlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcnhfY2ZnCit7CisgICAgYmNtb2x0X29ial9pZCBvYmpfdHlwZTsgICAgIC8qKjwgT2JqZWN0IHR5cGUuIENhbiBiZSBccmVmIEJDTU9MVF9PQkpFQ1RfQU5ZICovCisgICAgZl9iY21vbHRfbXNnX2hhbmRsZXIgcnhfY2I7IC8qKjwgUmVjZWl2ZSBjYWxsYmFjay4gTlVMTD11bnJlZ2lzdGVyICovCisgICAgYmNtb2x0X2F1dG9fZmxhZ3MgZmxhZ3M7ICAgIC8qKjwgRGlzcGF0Y2ggZmxhZ3MuIFJlY2VpdmUgY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjb250ZXh0IG9mIHJ4IHRhc2sgb3IgYXBwbGljYXRpb24gdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlIGZsYWdzICovCisgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZTsgICAgIC8qKjwgVGFyZ2V0IG1vZHVsZSBpZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxldmFudCBvbmx5IGlmIGZsYWdzID09IEJDTU9MVF9BVVRPX0ZMQUdTX0RJU1BBVENIICovCisgICAgdWludDMyX3QgcG9uX25pX21hc2s7ICAgICAgIC8qKjwgQml0bWFzayBvZiBwb25fbmkgaW50ZXJmYWNlcyB0aGUgcmVnaXN0cmF0aW9uIGFwcGxpZXMgdG8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD1hbGwgaW50ZXJmYWNlcy4gRWFjaCBpbnRlcmZhY2UgaXMgaWRlbnRpZmllZCBieSAoMSA8PCBwb25fbmkpIGJpdCAqLworfSBiY21vbHRfcnhfY2ZnOworCisvKiAoVW4pUmVnaXN0ZXIgQXV0b25vbW91cyBJbmRpY2F0aW9uIE1lc3NhZ2UgSGFuZGxlcgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgcnhfY2ZnICAgICAgICAgIFJlY2VpdmUgaGFuZGxlciBjb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9hdXRvX3J4X2NiX3NldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfcnhfY2ZnICpyeF9jZmcpOworCisvKiAoVW4pUmVnaXN0ZXIgUHJveHkgTWVzc2FnZSBIYW5kbGVyCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICByeF9jZmcgICAgICAgICAgUmVjZWl2ZSBoYW5kbGVyIGNvbmZpZ3VyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3Byb3h5X3J4X2NiX3NldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfcnhfY2ZnICpyeF9jZmcpOworCisvKiogXGRlZmdyb3VwIG11bHRpX2FwaV9mdW5jIE11bHRpLW9iamVjdCBBUEkgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIEdldCBjb25maWd1cmF0aW9uIG9mIG11bHRpcGxlIG9iamVjdHMKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIG9sdCAgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGZpbHRlciAgICAgICAgICBPYmplY3QgZmlsdGVyLiBIZWFkZXIgb2YgZ2VuZXJhdGVkIGJjbW9sdF94eF9jZmcgc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgICAgICAgICBmaWx0ZXJfZmxhZ3MgICAgT3B0aW9uYWwgZmlsdGVyaW5nIGZsYWdzCisgKiBccGFyYW1baW4sb3V0XSAgICAgICBtc2dfc2V0ICAgICAgICAgTWVzc2FnZSBzZXQKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIG9sdCwgYmNtb2x0X2NmZyAqZmlsdGVyLAorICAgIGJjbW9sdF9maWx0ZXJfZmxhZ3MgZmlsdGVyX2ZsYWdzLCBiY21vbHRfbXNnX3NldCAqbXNnX3NldCk7CisKKy8qKiBAfSAqLworCisvKiogQH0gKi8KKworLyoqIEB9ICovCisKKyNlbmRpZiAvKiBCQ01PTFRfQVBJX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9tc2cuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9hcGkvYmNtb2x0X21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTM5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9tc2cuYwpAQCAtMCwwICsxLDU1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSAiYmNtb2x0X21zZy5oIgorCitiY21vc19lcnJubyBiY21vbHRfbXNnX2VycihiY21vbHRfbXNnICptc2csIGRldl9sb2dfaWQgbG9nX2lkLCBiY21vc19lcnJubyBlcnIsIHVpbnQxNl90IGVycl9maWVsZF9pZHgsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIG1zZy0+ZXJyID0gZXJyOworICAgIG1zZy0+ZXJyX2ZpZWxkX2lkeCA9IGVycl9maWVsZF9pZHg7CisgICAgaWYgKGZtdCkKKyAgICB7CisgICAgICAgIHZhX2xpc3QgYXJnczsKKworICAgICAgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgICAgICB2c25wcmludGYobXNnLT5lcnJfdGV4dCwgc2l6ZW9mKG1zZy0+ZXJyX3RleHQpIC0gMSwgZm10LCBhcmdzKTsKKyAgICAgICAgdmFfZW5kKGFyZ3MpOworICAgICAgICBzdHJuY2F0KG1zZy0+ZXJyX3RleHQsICJcbiIsIDEpOworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgaWYgKGxvZ19pZCAmJiBsb2dfaWQgIT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICAgICAgYmNtX2Rldl9sb2dfbG9nKGxvZ19pZCwgREVWX0xPR19MRVZFTF9FUlJPUiwgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQsICIlcyIsIG1zZy0+ZXJyX3RleHQpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1zZy0+ZXJyX3RleHRbMF0gPSAwOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfbXNnLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI0YjI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfbXNnLmgKQEAgLTAsMCArMSwzODUgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX01TR19IXworI2RlZmluZSBCQ01PTFRfTVNHX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfYnVmLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX2lkcy5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nX3Rhc2suaCIKKworLyoqIFxkZWZncm91cCBcYXBpX2RhdGFfdHlwZXMgRGF0YSBUeXBlcworICogXGluZ3JvdXAgYXBpCisgKiBAeworICovCisKKy8qKiBEZXZpY2UgSUQgKi8KK3R5cGVkZWYgdWludDhfdCBiY21vbHRfZGV2aWQ7CisKKy8qKiBCaXRtYXNrIG9mIGZpZWxkcyB0aGF0IGFyZSBwcmVzZW50IGluIGEgbWVzc2FnZSAqLwordHlwZWRlZiB1aW50NjRfdCBiY21vbHRfcHJlc2VuY2VfbWFzazsKKworLyoqIFByZXNlbmNlIG1hc2sgaW5kaWNhdGluZyBhbGwgZmllbGRzIHByZXNlbnQgKi8KKyNkZWZpbmUgQkNNT0xUX1BSRVNFTkNFX01BU0tfQUxMICgoYmNtb2x0X3ByZXNlbmNlX21hc2spMHhGRkZGRkZGRkZGRkZGRkZGKQorCisvKiogTWVzc2FnZSBkaXJlY3Rpb24gLSByZXF1ZXN0IG9yIHJlc3BvbnNlICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21zZ19kaXIKK3sKKyAgICBCQ01PTFRfTVNHX0RJUl9SRVFVRVNULAorICAgIEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFCit9IGJjbW9sdF9tc2dfZGlyOworCisvKiogTWVzc2FnZSB0eXBlLiBDYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBmbGFncyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9tc2dfdHlwZQoreworICAgIEJDTU9MVF9NU0dfVFlQRV9HRVQgID0gMHgwMSwgICAgICAgIC8qKjwgR2V0OiBjb25maWd1cmF0aW9uIG9yIHN0YXRpc3RpY3MgKi8KKyAgICBCQ01PTFRfTVNHX1RZUEVfU0VUICA9IDB4MDIsICAgICAgICAvKio8IFNldDogQ29uZmlndXJhdGlvbiwgU3RhdGlzdGljcywgQXV0bywgUHJveHkgKi8KKyAgICBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI9IDB4MDQsICAgICAgICAvKio8IENsZWFyOiBjb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX01TR19UWVBFX01VTFRJPSAweDA4LCAgICAgICAgLyoqPCBNdWx0aS1vYmplY3Q6IGNvbmZpZ3VyYXRpb24sIHN0YXRpc3RpY3MgKi8KKworICAgIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEkgPSBCQ01PTFRfTVNHX1RZUEVfR0VUIHwgQkNNT0xUX01TR19UWVBFX01VTFRJLAorfSBiY21vbHRfbXNnX3R5cGU7CisKKy8qKiBNYW5hZ2VtZW50IGdyb3VwIC0ga2V5LCBjb25maWcsIG9wZXJhdGlvbiwgZXRjICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21ndF9ncm91cAoreworICAgIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAgICAgICAgICAgICAgIC8qKjwga2V5IHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBvYmplY3QgaW5zdGFuY2UgKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX0NGRywgICAgICAgICAgICAgICAvKio8IENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX1NUQVQsICAgICAgICAgICAgICAvKio8IFN0YXRpc3RpY3MgKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAgICAgICAgICAvKio8IFN0YXRpc3RpY3MgdGhyZXNob2xkIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX0FVVE8sICAgICAgICAgICAgICAvKio8IEF1dG9ub21vdXMgaW5kaWNhdGlvbnMgKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAgICAgICAgICAvKio8IEF1dG9ub21vdXMgaW5kaWNhdGlvbiBjb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAgICAgICAgICAgICAgLyoqPCBPcGVyYXRpb25zICovCisgICAgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgICAgICAgICAgICAgLyoqPCBNZXNzYWdlcyB0byBPTlUgKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYLCAgICAgICAgICAvKio8IE1lc3NhZ2VzIGZyb20gT05VICovCisgICAgQkNNT0xUX01HVF9HUk9VUF9fTlVNX09GCit9IGJjbW9sdF9tZ3RfZ3JvdXA7CisKKy8qKiBBbnkgb2JqZWN0ICovCisjZGVmaW5lIEJDTU9MVF9PQkpFQ1RfQU5ZICAgICAgIChiY21vbHRfb2JqX2lkKTB4ZmZmZgorCisvKiogQW55IGdyb3VwICovCisjZGVmaW5lIEJDTU9MVF9NR1RfR1JPVVBfQU5ZICAgIChiY21vbHRfbWd0X2dyb3VwKTB4ZmZmZgorCisvKiogQW55IHN1Ymdyb3VwICovCisjZGVmaW5lIEJDTU9MVF9TVUJHUk9VUF9BTlkgICAgIDB4ZmZmZgorCisvKiogSW5kaWNhdG9yIHRoYXQgbm8gZmllbGRzIGNvbnRhaW5lZCBlcnJvcnMgKi8KKyNkZWZpbmUgQkNNT0xUX0VSUl9GSUVMRF9OT05FICAgMHhmZmZmCisKKy8qKiBNYXggZXJyb3IgdGV4dCBsZW5ndGggKi8KKyNkZWZpbmUgQkNNT0xUX01BWF9FUlJfVEVYVF9MRU5HVEggICAgICAyNTYKKworLyogVHJhbnNwb3J0IHN1Yi1jaGFubmVsIGhhbmRsZSAqLwordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfc3ViY2hhbm5lbDsKKworLyoqIE1lc3NhZ2Ugc2V0IC0gZm9yIG11bHRpLWluc3RhbmNlIEFQSXMgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9tc2dfc2V0IGJjbW9sdF9tc2dfc2V0OworCisvKiogQ29tbW9uIG1lc3NhZ2UgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbXNnCit7CisgICAgYmNtb2x0X29ial9pZCAgICAgICAgb2JqX3R5cGU7ICAgICAgLyoqPCBPYmplY3QgdHlwZSAqLworICAgIGJjbW9sdF9tZ3RfZ3JvdXAgICAgIGdyb3VwOyAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBncm91cCAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgIHN1Ymdyb3VwOyAgICAgIC8qKjwgU3ViZ3JvdXA6IGZvciBvcGVyYXRpb25zLCBhdXRvbm9tb3VzIG1lc3NhZ2VzLCBwcm94eSAqLworICAgIGJjbW9sdF9tc2dfdHlwZSAgICAgIHR5cGU7ICAgICAgICAgIC8qKjwgU2V0LCBHZXQsIENsZWFyICovCisgICAgYmNtb2x0X21zZ19kaXIgICAgICAgZGlyOyAgICAgICAgICAgLyoqPCBSZXF1ZXN0L2F1dG9ub21vdXMgb3IgUmVzcG9uc2UgKi8KKyAgICBiY21vc19lcnJubyAgICAgICAgICBlcnI7ICAgICAgICAgICAvKio8IFJlbW90ZSBlcnJvciBjb2RlICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgZXJyX2ZpZWxkX2lkeDsgLyoqPCBJZiBub3QgQkNNT0xUX0VSUl9GSUVMRF9OT05FLCBpbmRleCBvZiBlcnJvbmVvdXMgZmllbGQgd2l0aGluIHN0cnVjdCAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgIGNvcnJfdGFnOyAgICAgIC8qKjwgQ29ycmVsYXRpb24gdGFnICovCisgICAgYmNtb2x0X3ByZXNlbmNlX21hc2sgcHJlc2VuY2VfbWFzazsgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcGFyYW1ldGVycyBhcmUgcHJlc2VudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgIGVycl90ZXh0W0JDTU9MVF9NQVhfRVJSX1RFWFRfTEVOR1RIXTsgIC8qKjwgRXJyb3IgdGV4dCAtIGlmIGVyciAhPSAwICovCisgICAgLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGludGVybmFsLiBUaGV5IGFyZSBub3Qgc2VudCBvbiB0aGUgbGluZSAqLworICAgIGJjbW9sdF9zdWJjaGFubmVsICAgIHN1YmNoOyAgICAgICAgIC8qICAgVHJhbnNwb3J0IHN1Yi1jaGFubmVsIHZpYSB3aGljaCB0aGUgbWVzc2FnZSBhcnJpdmVkICovCisgICAgYmNtb3NfbXNnICAgICAgICAgICAgb3NfbXNnOyAgICAgICAgLyogICBJbnRlcm5hbCBPUyBtZXNzYWdlIGZvciBlYXN5IHRhc2sgcm91dGluZyAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgKmxpc3RfYnVmOyAgICAgIC8qICAgTWVtb3J5IGJ1ZmZlciBpbiB3aGljaCB0byBzdG9yZSB2YXJpYWJsZS1zaXplZCBsaXN0cyB3aGVuIHVucGFja2luZyAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgIGxpc3RfYnVmX3NpemU7IC8qICAgTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB2YXJpYWJsZS1zaXplZCBsaXN0IGJ1ZmZlciAqLworICAgIGJjbW9sdF9tc2dfc2V0ICAgICAgKm1zZ19zZXQ7ICAgICAgIC8qIE1lc3NhZ2Ugc2V0IHRoZSBtZXNzYWdlIGJlbG9uZ3MgdG8gKi8KK30gYmNtb2x0X21zZzsKKworLyoqIENvbmZpZ3VyYXRpb24gZ3JvdXAgbWVzc2FnZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9jZmcKK3sKKyAgICBiY21vbHRfbXNnIGhkcjsgICAgICAgICAgICAgLyoqIENvbW1vbiBoZWFkZXIgKi8KK30gYmNtb2x0X2NmZzsKKworLyoqIFN0YXRpc3RpYyBmbGFncyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT0xUX1NUQVRfRkxBR1NfTk9ORSAgICAgICAgICA9IDB4MDAwMCwgLyoqPCBObyBzdGF0aXN0aWNzIG9wdGlvbnMgc2V0IChubyBjbGVhciBvbiByZWFkLCBldGMpICovCisgICAgQkNNT0xUX1NUQVRfRkxBR1NfQ0xFQVJfT05fUkVBRCA9IDB4MDAwMSwgLyoqPCBDbGVhciB0aGUgcmVxdWVzdGVkIHN0YXRpc3RpY3MgYXMgcGFydCBvZiB0aGUgcmVhZCBvcGVyYXRpb24gKi8KK30gYmNtb2x0X3N0YXRfZmxhZ3M7CisKKy8qKiBTdGF0aXN0aWNzIGdyb3VwIG1lc3NhZ2UgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc3RhdAoreworICAgIGJjbW9sdF9tc2cgaGRyOyAgICAgICAgICAgICAvKiogQ29tbW9uIGhlYWRlciAqLworfSBiY21vbHRfc3RhdDsKKworLyoqIFN0YXRpc3RpY3MgY29uZmlndXJhdGlvbiBtZXNzYWdlIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X21zZyBoZHI7ICAgICAgICAgICAgIC8qKiBDb21tb24gaGVhZGVyICovCit9IGJjbW9sdF9zdGF0X2NmZzsKKworLyoqIE9wZXJhdGlvbiBncm91cCBtZXNzYWdlIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X29wZXIKK3sKKyAgICBiY21vbHRfbXNnIGhkcjsgICAgICAgICAgICAgLyoqIENvbW1vbiBoZWFkZXIgKi8KK30gYmNtb2x0X29wZXI7CisKKy8qKiBBdXRvbm9tb3VzIG1lc3NhZ2UgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYXV0bworeworICAgIGJjbW9sdF9tc2cgaGRyOyAgICAgICAgICAgICAvKiogQ29tbW9uIGhlYWRlciAqLworfSBiY21vbHRfYXV0bzsKKworLyoqIEF1dG9ub21vdXMgbWVzc2FnZSBjb25maWd1cmF0aW9uIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X21zZyBoZHI7ICAgICAgICAgICAgIC8qKiBDb21tb24gaGVhZGVyICovCit9IGJjbW9sdF9hdXRvX2NmZzsKKworLyoqIE1lc3NhZ2UgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqZl9iY21vbHRfbXNnX2hhbmRsZXIpKGJjbW9sdF9kZXZpZCBvbHQsIGJjbW9sdF9tc2cgKm1zZyk7CisKKy8qKiBBdXRvbm9tb3VzIG1lc3NhZ2UgZmxhZ3MgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9BVVRPX0ZMQUdTX05PTkUgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJbnZva2UgY2FsbGJhY2sgaW4gY29udGV4dCBvZiBSWCB0YXNrICovCisgICAgQkNNT0xUX0FVVE9fRkxBR1NfRElTUEFUQ0ggID0gMHgwMDAxLCAgICAgICAvKio8IERpc3BhdGNoIG1lc3NhZ2UgdG8gYXBwbGljYXRpb24gbW9kdWxlICovCit9IGJjbW9sdF9hdXRvX2ZsYWdzOworCisvKiogUHJveHkgbWVzc2FnZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wcm94eQoreworICAgIGJjbW9sdF9tc2cgaGRyOyAgICAgICAgICAgICAvKiogQ29tbW9uIGhlYWRlciAqLworfSBiY21vbHRfcHJveHk7CisKKy8qKiBQcm94eSBSWCBtZXNzYWdlIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3Byb3h5X3J4Cit7CisgICAgYmNtb2x0X21zZyBoZHI7ICAgICAgICAgICAgIC8qKiBDb21tb24gaGVhZGVyICovCit9IGJjbW9sdF9wcm94eV9yeDsKKworLyoqIEZpbHRlciBmbGFncyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FID0gMCwKKyAgICBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gPSAweDAwMDAwMDAxICAgIC8qKiBSZXR1cm4gb2JqZWN0cyBOT1Qgc2VsZWN0ZWQgYnkgZmlsdGVyICovCit9IGJjbW9sdF9maWx0ZXJfZmxhZ3M7CisKKy8qIE1lc3NhZ2Ugc2V0ICovCitzdHJ1Y3QgYmNtb2x0X21zZ19zZXQKK3sKKyAgICB1aW50MTZfdCBtYXhfaW5zdGFuY2VzOyAgICAgLyoqPCBNYXggbnVtYmVyIG9mIGluc3RhbmNlcyBpbiB0aGUgc2V0LiBTZXQgd2hlbiBzZXQgaXMgY3JlYXRlZCBhbmQgZG9lc24ndCBjaGFuZ2UgKi8KKyAgICBiY21vbHRfbWd0X2dyb3VwIGdyb3VwOyAgICAgLyoqPCBNYW5hZ2VtZW50IGdyb3VwICovCisgICAgYmNtb2x0X3ByZXNlbmNlX21hc2sgcHJlc2VuY2VfbWFzazsgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcGFyYW1ldGVycyBzaG91bGQgYmUgZmV0Y2hlZCAqLworICAgIGJjbW9sdF9maWx0ZXJfZmxhZ3MgZmlsdGVyX2ZsYWdzOyAgIC8qKjwgRmlsdGVyIGZsYWdzICovCisKKyAgICAvKiBNdWx0aS1tc2cgQVBJIG91dHB1dCAqLworICAgIHVpbnQxNl90IG51bV9pbnN0YW5jZXM7ICAgICAvKio8IE51bWJlciBvZiBpbnN0YW5jZXMgaW4gdGhlIHNldC4gKi8KKyAgICBiY21vc19ib29sIG1vcmU7ICAgICAgICAgICAgLyoqPCBCQ01PU19UUlVFIGlmIG5vdCBhbGwgaW5zdGFuY2VzIGhhdmUgYmVlbiByZXRyaWV2ZWQgYnkgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ2V0X211bHRpKCkgY2FsbC4gKi8KKyAgICB2b2lkICpuZXh0X2tleTsgICAgICAgICAgICAgLyoqPCBLZXkgb2YgdGhlIG5leHQgb2JqZWN0IGluc3RhbmNlIGFmdGVyIHRob3NlIHRoYXQgd2VyZSByZXR1cm5lZC4gIE9ubHkgdmFsaWQgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9yZScgaXMgQkNNT1NfRkFMU0UuICBUcmVhdCB0aGlzIGFzIGEgcG9pbnRlciB0byB0aGUgb2JqZWN0J3Mga2V5IHN0cnVjdC4gIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBmb3Igc3Vic2VxdWVudCBpbnZvY2F0aW9ucyBvZiBiY21vbHRfY2ZnX2dldF9tdWx0aXBsZSgpIGJ5IGNvcHlpbmcgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gdGhlIGZpbHRlcidzIGtleSBmaWVsZC4gKi8KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpIC8qKjwgQ2hlY2sgd2hldGhlciBDOTkgaXMgc3VwcG9ydGVkICovCisgICAgYmNtb2x0X21zZyAqbXNnW107ICAgICAgICAgIC8qKjwgU2V0IG9mIEFQSSBvYmplY3RzIHJldHVybmVkIGJ5IGJjbW9sdF9jZmdfZ2V0X211bHRpcGxlKCkuICovCisjZWxzZQorICAgIGJjbW9sdF9tc2cgKm1zZ1swXTsgICAgICAgICAgLyoqPCBTZXQgb2YgQVBJIG9iamVjdHMgcmV0dXJuZWQgYnkgYmNtb2x0X2NmZ19nZXRfbXVsdGlwbGUoKS4gKi8KKyNlbmRpZgorfTsKKworLyoqIEB9ICovCisKKworLypsaW50IC1lY2FsbCg2MzMsIGJjbW9sdF9tc2dfZXJyKSAtIDR0aCBhcmd1bWVudCB3aWxsIGJlIGEgc3BlY2lmaWMgZW51bSB0eXBlLCBidXQgbXVzdCBiZSB0cmVhdGVkIGFzIGEgdWludDE2LiAqLworLyoqIFNldCBtZXNzYWdlIGVycm9yLiBDYW5ub3QgYmUgc3RhdGljIGlubGluZSwgYXMgaXQgdXNlcyB2YXJpYWJsZSBhcmd1bWVudCBsaXN0LiAqLworYmNtb3NfZXJybm8gYmNtb2x0X21zZ19lcnIoYmNtb2x0X21zZyAqbXNnLCBkZXZfbG9nX2lkIGxvZ19pZCwgYmNtb3NfZXJybm8gZXJyLCB1aW50MTZfdCBlcnJfZmllbGRfaWR4LCBjb25zdCBjaGFyICpmbXQsIC4uLilfX2F0dHJpYnV0ZV9fKChmb3JtYXQoX19wcmludGZfXywgNSwgNikpKTsKKworLyoqIFdoZXRoZXIgd2UgcGFjayB0aGUgZW50aXJlIHN0cnVjdHVyZSBvZiBhIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfbXNnX3Nob3VsZF9wYWNrX2RhdGEoY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIHN3aXRjaCAobXNnLT5ncm91cCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgIGlmICgobXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0dFVCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfYm9vbCBzaG91bGRfcGFjayA9IChtc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRSk7CisgICAgICAgICAgICAgICAgLyogRm9yIG11bHRpLW1lc3NhZ2UgZ2V0IHJlcXVlc3Qgc2hvdWxkX3BhY2sgbXVzdCBiZSBpbnZlcnRlZCBiZWNhdXNlIHRoZSAxc3QgcGFydAorICAgICAgICAgICAgICAgICAqIG9mIG11bHRpLW9iamVjdCByZXF1ZXN0IGlzIGZpbHRlcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHJldHVybiAobXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX01VTFRJKSA/ICFzaG91bGRfcGFjayA6IHNob3VsZF9wYWNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKG1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9TRVQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAobXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVRVUVTVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICByZXR1cm4gKG1zZy0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFUVVFU1QpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9Cit9CisKKy8qKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgaGVhZGVyIHBvcnRpb24gb2YgYSBtZXNzYWdlICovCitzdGF0aWMgaW5saW5lIGludDMyX3QgYmNtb2x0X21zZ19oZHJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIHJldHVybiAxOCArIChtc2ctPmVyciA/IHN0cmxlbihtc2ctPmVycl90ZXh0KSArIDIgOiAwKTsKK30KKworLyoqIFBhY2sgYSBtZXNzYWdlIGhlYWRlciB0byBhIGJ5dGUgc3RyZWFtICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGJjbW9sdF9tc2dfaGRyX3BhY2soY29uc3QgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgYmNtb3NfYm9vbCByZXQ7CisKKyAgICByZXQgPSAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KW1zZy0+b2JqX3R5cGUpOworICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpbXNnLT5ncm91cCk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgbXNnLT5zdWJncm91cCk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCltc2ctPnR5cGUpOworICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpbXNnLT5kaXIpOworICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3dyaXRlX3MxNihidWYsIChpbnQxNl90KW1zZy0+ZXJyKTsKKyAgICByZXQgPSByZXQgJiYgYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCAodWludDY0X3QpbXNnLT5wcmVzZW5jZV9tYXNrKTsKKyAgICByZXQgPSByZXQgJiYgYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCBtc2ctPmVycl9maWVsZF9pZHgpOworICAgIGlmIChtc2ctPmVycikKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGxlbiA9IHN0cmxlbihtc2ctPmVycl90ZXh0KTsKKyAgICAgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgbGVuKTsKKyAgICAgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGUoYnVmLCBtc2ctPmVycl90ZXh0LCBsZW4pOworICAgIH0KKworICAgIHJldHVybiByZXQgPyBCQ01fRVJSX09LIDogQkNNX0VSUl9PVkVSRkxPVzsKK30KKworLyoqIFVucGFjayBhIG1lc3NhZ2UgaGVhZGVyIGZyb20gYSBieXRlIHN0cmVhbSAqLworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY21vbHRfbXNnX2hkcl91bnBhY2soYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCAgICBvYmpfdHlwZTsKKyAgICB1aW50OF90ICAgIGdyb3VwOworICAgIHVpbnQxNl90ICAgc3ViZ3JvdXA7CisgICAgdWludDhfdCAgICB0eXBlOworICAgIHVpbnQ4X3QgICAgZGlyOworICAgIGludDE2X3QgICAgZXJyID0gMDsKKyAgICB1aW50NjRfdCAgIHByZXNlbmNlX21hc2s7CisgICAgdWludDE2X3QgICBlcnJfZmllbGRfaWR4OworICAgIGJjbW9zX2Jvb2wgcmV0OworCisgICAgcmV0ID0gICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZvYmpfdHlwZSk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZncm91cCk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmc3ViZ3JvdXApOworICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdHlwZSk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZkaXIpOworICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfczE2KGJ1ZiwgJmVycik7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmcHJlc2VuY2VfbWFzayk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmZXJyX2ZpZWxkX2lkeCk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGxlbiA9IDA7CisgICAgICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbik7CisgICAgICAgIGlmIChsZW4gPj0gc2l6ZW9mKG1zZy0+ZXJyX3RleHQpKQorICAgICAgICAgICAgbGVuID0gc2l6ZW9mKG1zZy0+ZXJyX3RleHQpIC0gMTsKKyAgICAgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZChidWYsIG1zZy0+ZXJyX3RleHQsIGxlbik7CisgICAgICAgIG1zZy0+ZXJyX3RleHRbbGVuXSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1zZy0+ZXJyX3RleHRbMF0gPSAwOworICAgIH0KKworICAgIGlmIChyZXQpCisgICAgeworICAgICAgICBtc2ctPm9ial90eXBlID0gKGJjbW9sdF9vYmpfaWQpb2JqX3R5cGU7CisgICAgICAgIG1zZy0+Z3JvdXAgPSAoYmNtb2x0X21ndF9ncm91cClncm91cDsKKyAgICAgICAgbXNnLT5zdWJncm91cCA9IHN1Ymdyb3VwOworICAgICAgICBtc2ctPnR5cGUgPSAoYmNtb2x0X21zZ190eXBlKXR5cGU7CisgICAgICAgIG1zZy0+ZGlyID0gKGJjbW9sdF9tc2dfZGlyKWRpcjsKKyAgICAgICAgbXNnLT5lcnIgPSAoYmNtb3NfZXJybm8pZXJyOworICAgICAgICBtc2ctPnByZXNlbmNlX21hc2sgPSAoYmNtb2x0X3ByZXNlbmNlX21hc2spcHJlc2VuY2VfbWFzazsKKyAgICAgICAgbXNnLT5lcnJfZmllbGRfaWR4ID0gZXJyX2ZpZWxkX2lkeDsKKyAgICAgICAgbXNnLT5tc2dfc2V0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0ID8gQkNNX0VSUl9PSyA6IEJDTV9FUlJfT1ZFUkZMT1c7Cit9CisKKy8qIENyZWF0ZSBtZXNzYWdlIHNldAorICoKKyAqIFxwYXJhbVtpbl0gICBvYmogICAgICAgICAgICAgT2JqZWN0IGlkCisgKiBccGFyYW1baW5dICAgZ3JvdXAgICAgICAgICAgIE1hbmFnZW1lbnQgZ3JvdXAKKyAqIFxwYXJhbVtpbl0gICBtYXhfaW5zdGFuY2VzICAgTWF4IG51bWJlciBvZiBvYmplY3RzIHJldHVybmVkIGJ5IGEgc2luZ2xlIEFQSSBjYWxsCisgKiBccGFyYW1bb3V0XSAgbXNnX3NldCAgICAgICAgIE1lc3NhZ2Ugc2V0CisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9tc2dfc2V0X2FsbG9jKGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLAorICAgIHVpbnQzMl90IG1heF9pbnN0YW5jZXMsIGJjbW9sdF9tc2dfc2V0ICoqbXNnX3NldCk7CisKKy8qIFJlbGVhc2UgbWVzc2FnZSBzZXQKKyAqIFxwYXJhbVtpbl0gICBtc2dfc2V0CisgKi8KK3ZvaWQgYmNtb2x0X21zZ19zZXRfZnJlZShiY21vbHRfbXNnX3NldCAqbXNnX3NldCk7CisKKy8qIFJlbGVhc2UgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vbHRfbXNnX2ZyZWUoYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChtc2ctPm1zZ19zZXQpCisgICAgeworICAgICAgICBiY21vbHRfbXNnX3NldF9mcmVlKG1zZy0+bXNnX3NldCk7CisgICAgfQorICAgIGJjbW9zX2ZyZWUobXNnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjbW9sdF9vc19tc2dfcmVsZWFzZV9jYihiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBiY21vbHRfbXNnICptc2cgPSBvc19tc2ctPmRhdGE7CisKKyAgICAvKiBXZSBjYW4gYmUgaGVyZSBpZiB0YXJnZXQgbW9kdWxlIG9yIHRyYW5zcG9ydCBxdWV1ZSBvdmVyZmxvd3MuCisgICAgICAgUmVsZWFzZSB0aGUgbWVzc2FnZQorICAgICovCisgICAgYmNtb2x0X21zZ19mcmVlKG1zZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfbW9kdWxlX2lkIGJjbW9zX21vZHVsZV9pZF9mb3JfZGV2aWNlKGJjbW9zX21vZHVsZV9pZCBtb2R1bGUsIGJjbW9sdF9kZXZpZCBkZXZpZCkKK3sKKyAgICByZXR1cm4gbW9kdWxlICsgKGJjbW9zX21vZHVsZV9pZClkZXZpZDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGU1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29tbW9uX2dwb24vTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIyBHUE9OIEdlbmVyYWwKKworTU9EX05BTUUgPSBjb21tb25fZ3BvbgorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gbW9kZWwgY2xpCisKK0VYVFJBX0NGTEFHUyArPSAtSSQoVE9QX0RJUikvY29tbW9uL21vZGVsL21hcGxlIFwKKy1JJChUT1BfRElSKS9jb21tb24vdHJhbnNwb3J0L2RyaXZlci9tYXBsZS9wY2llX3N3X3F1ZXVlIFwKKy1JJChUT1BfRElSKS9jb21tb24vZHJpdmVycy9tYXBsZS9wY2llCisKK3NyY3MgPSBiY21fY29tbW9uX2dwb24uYwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTNhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29tbW9uX2dwb24vYmNtX2NvbW1vbl9ncG9uLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTQ6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQ29weXJpZ2h0IChjKSAyMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorCisxLiBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorICAgIGNvbnN0aXR1dGVzIHRoZSB2YWx1YWJsZSB0cmFkZSBzZWNyZXRzIG9mIEJyb2FkY29tLCBhbmQgeW91IHNoYWxsIHVzZQorICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tCisgICAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKworMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorICAgIExJTUlURUQgUkVNRURZLgorOj4KKyovCisjaW5jbHVkZSAiYmNtX2NvbW1vbl9ncG9uLmgiCisKK3N0YXRpYyBwb25fbW9kZV9kYiBkYl9ncG9uID0KK3sKKyAgICAucG9uX21vZGUgPSBCQ01PTFRfUE9OX01PREVfR1BPTiwKKyAgICAuYXBpX3R5cGUgPSBCQ01PTFRfUE9OX0FQSV9UWVBFX0dQT04sCisgICAgLm51bV9vZl9vbnVzID0gR1BPTl9OVU1fT0ZfT05VUywKKyAgICAubnVtX29mX2FsbG9jX2lkcyA9IEdQT05fTlVNX09GX0FMTE9DX0lEUywKKyAgICAubnVtX29mX2R5bmFtaWNfYWxsb2NfaW5kaWNlcyA9IEdQT05fTlVNX09GX0RZTkFNSUNfQUxMT0NfSU5ESUNFUywKKyAgICAubnVtX29mX2dlbV9wb3J0cyA9IEdQT05fTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfUE9OLAorICAgIC5udW1fb2ZfYWxsb2NfaWRzX3Blcl9vbnUgPSBHUE9OX05VTV9PRl9BTExPQ19JRFNfUEVSX09OVSwKKyAgICAub251X2lkX2Jyb2FkY2FzdCA9IEdQT05fT05VX0lEX0JST0FEQ0FTVCwKKyAgICAub251X2lkX3VuYXNzaWduZWQgPSBHUE9OX09OVV9JRF9VTkFTU0lHTkVELAorICAgIC5hbGxvY19pZF9icm9hZGNhc3QgPSBHUE9OX0FMTE9DX0lEX0JST0FEQ0FTVCwKKyAgICAuYWxsb2NfaWRfaW52YWxpZCA9IEJDTU9MVF9HUE9OX0FMTE9DX0lEX0lOVkFMSUQsCisgICAgLmFsbG9jX2lkX3VuYXNzaWduZWQgPSBHUE9OX0FMTE9DX0lEX1VOQVNTSUdORUQsCisgICAgLnVzX3JhdGUgPSBCQ01PTFRfUE9OX1VTX1JBVEVfMUcsCit9OworCitzdGF0aWMgcG9uX21vZGVfZGIgZGJfeGdwb24gPQoreworICAgIC5wb25fbW9kZSA9IEJDTU9MVF9QT05fTU9ERV9YR1BPTiwKKyAgICAuYXBpX3R5cGUgPSBCQ01PTFRfUE9OX0FQSV9UWVBFX1hHUE9OLAorICAgIC5udW1fb2Zfb251cyA9IFhHUE9OX05VTV9PRl9PTlVTLAorICAgIC5udW1fb2ZfYWxsb2NfaWRzID0gWEdQT05fTlVNX09GX0FMTE9DX0lEUywKKyAgICAubnVtX29mX2R5bmFtaWNfYWxsb2NfaW5kaWNlcyA9IFhHUE9OX05VTV9PRl9EWU5BTUlDX0FMTE9DX0lORElDRVMsCisgICAgLm51bV9vZl9nZW1fcG9ydHMgPSBYR1BPTl9OVU1fT0ZfR0VNX1BPUlRfSURTX1BFUl9QT04sCisgICAgLm51bV9vZl9hbGxvY19pZHNfcGVyX29udSA9IFhHUE9OX05VTV9PRl9BTExPQ19JRFNfUEVSX09OVSwKKyAgICAub251X2lkX2Jyb2FkY2FzdCA9IFhHUE9OX09OVV9JRF9CUk9BRENBU1QsCisgICAgLm9udV9pZF91bmFzc2lnbmVkID0gWEdQT05fT05VX0lEX1VOQVNTSUdORUQsCisgICAgLmFsbG9jX2lkX2Jyb2FkY2FzdCA9IFhHUE9OX0FMTE9DX0lEX0JST0FEQ0FTVCwKKyAgICAuYWxsb2NfaWRfaW52YWxpZCA9IEJDTU9MVF9YR1BPTl9BTExPQ19JRF9JTlZBTElELAorICAgIC5hbGxvY19pZF91bmFzc2lnbmVkID0gWEdQT05fQUxMT0NfSURfVU5BU1NJR05FRCwKKyAgICAudXNfcmF0ZSA9IEJDTU9MVF9QT05fVVNfUkFURV8yUDVHLAorfTsKKworc3RhdGljIHBvbl9tb2RlX2RiIGRiX3hncyA9Cit7CisgICAgLnBvbl9tb2RlID0gQkNNT0xUX1BPTl9NT0RFX1hHUywKKyAgICAuYXBpX3R5cGUgPSBCQ01PTFRfUE9OX0FQSV9UWVBFX1hHUE9OLAorICAgIC5udW1fb2Zfb251cyA9IFhHUE9OX05VTV9PRl9PTlVTLAorICAgIC5udW1fb2ZfYWxsb2NfaWRzID0gWEdQT05fTlVNX09GX0FMTE9DX0lEUywKKyAgICAubnVtX29mX2R5bmFtaWNfYWxsb2NfaW5kaWNlcyA9IFhHUE9OX05VTV9PRl9EWU5BTUlDX0FMTE9DX0lORElDRVMsCisgICAgLm51bV9vZl9nZW1fcG9ydHMgPSBYR1BPTl9OVU1fT0ZfR0VNX1BPUlRfSURTX1BFUl9QT04sCisgICAgLm51bV9vZl9hbGxvY19pZHNfcGVyX29udSA9IFhHUE9OX05VTV9PRl9BTExPQ19JRFNfUEVSX09OVSwKKyAgICAub251X2lkX2Jyb2FkY2FzdCA9IFhHUE9OX09OVV9JRF9CUk9BRENBU1QsCisgICAgLm9udV9pZF91bmFzc2lnbmVkID0gWEdQT05fT05VX0lEX1VOQVNTSUdORUQsCisgICAgLmFsbG9jX2lkX2Jyb2FkY2FzdCA9IFRFTl9HSUdfQUxMT0NfSURfQlJPQURDQVNULAorICAgIC5hbGxvY19pZF9pbnZhbGlkID0gQkNNT0xUX1hHUE9OX0FMTE9DX0lEX0lOVkFMSUQsCisgICAgLmFsbG9jX2lkX3VuYXNzaWduZWQgPSBYR1BPTl9BTExPQ19JRF9VTkFTU0lHTkVELAorICAgIC51c19yYXRlID0gQkNNT0xUX1BPTl9VU19SQVRFXzEwRywKK307CisKK3N0YXRpYyBwb25fbW9kZV9kYiBkYl9uZ3BvbjIgPQoreworICAgIC5wb25fbW9kZSA9IEJDTU9MVF9QT05fTU9ERV9OR1BPTjIsCisgICAgLmFwaV90eXBlID0gQkNNT0xUX1BPTl9BUElfVFlQRV9YR1BPTiwKKyAgICAubnVtX29mX29udXMgPSBYR1BPTl9OVU1fT0ZfT05VUywKKyAgICAubnVtX29mX2FsbG9jX2lkcyA9IFhHUE9OX05VTV9PRl9BTExPQ19JRFMsCisgICAgLm51bV9vZl9keW5hbWljX2FsbG9jX2luZGljZXMgPSBYR1BPTl9OVU1fT0ZfRFlOQU1JQ19BTExPQ19JTkRJQ0VTLAorICAgIC5udW1fb2ZfZ2VtX3BvcnRzID0gWEdQT05fTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfUE9OLAorICAgIC5udW1fb2ZfYWxsb2NfaWRzX3Blcl9vbnUgPSBYR1BPTl9OVU1fT0ZfQUxMT0NfSURTX1BFUl9PTlUsCisgICAgLm9udV9pZF9icm9hZGNhc3QgPSBYR1BPTl9PTlVfSURfQlJPQURDQVNULAorICAgIC5vbnVfaWRfdW5hc3NpZ25lZCA9IFhHUE9OX09OVV9JRF9VTkFTU0lHTkVELAorICAgIC5hbGxvY19pZF9icm9hZGNhc3QgPSBURU5fR0lHX0FMTE9DX0lEX0JST0FEQ0FTVCwKKyAgICAuYWxsb2NfaWRfaW52YWxpZCA9IEJDTU9MVF9YR1BPTl9BTExPQ19JRF9JTlZBTElELAorICAgIC5hbGxvY19pZF91bmFzc2lnbmVkID0gWEdQT05fQUxMT0NfSURfVU5BU1NJR05FRCwKKyAgICAudXNfcmF0ZSA9IEJDTU9MVF9QT05fVVNfUkFURV8xMEcsCit9OworCitzdGF0aWMgcG9uX21vZGVfZGIgZGJfbmdwb24yXzJfNV9nID0KK3sKKyAgICAucG9uX21vZGUgPSBCQ01PTFRfUE9OX01PREVfTkdQT04yLAorICAgIC5hcGlfdHlwZSA9IEJDTU9MVF9QT05fQVBJX1RZUEVfWEdQT04sCisgICAgLm51bV9vZl9vbnVzID0gWEdQT05fTlVNX09GX09OVVMsCisgICAgLm51bV9vZl9hbGxvY19pZHMgPSBYR1BPTl9OVU1fT0ZfQUxMT0NfSURTLAorICAgIC5udW1fb2ZfZHluYW1pY19hbGxvY19pbmRpY2VzID0gWEdQT05fTlVNX09GX0RZTkFNSUNfQUxMT0NfSU5ESUNFUywKKyAgICAubnVtX29mX2dlbV9wb3J0cyA9IFhHUE9OX05VTV9PRl9HRU1fUE9SVF9JRFNfUEVSX1BPTiwKKyAgICAubnVtX29mX2FsbG9jX2lkc19wZXJfb251ID0gWEdQT05fTlVNX09GX0FMTE9DX0lEU19QRVJfT05VLAorICAgIC5vbnVfaWRfYnJvYWRjYXN0ID0gWEdQT05fT05VX0lEX0JST0FEQ0FTVCwKKyAgICAub251X2lkX3VuYXNzaWduZWQgPSBYR1BPTl9PTlVfSURfVU5BU1NJR05FRCwKKyAgICAuYWxsb2NfaWRfYnJvYWRjYXN0ID0gWEdQT05fQUxMT0NfSURfQlJPQURDQVNULAorICAgIC5hbGxvY19pZF9pbnZhbGlkID0gQkNNT0xUX1hHUE9OX0FMTE9DX0lEX0lOVkFMSUQsCisgICAgLmFsbG9jX2lkX3VuYXNzaWduZWQgPSBYR1BPTl9BTExPQ19JRF9VTkFTU0lHTkVELAorICAgIC51c19yYXRlID0gQkNNT0xUX1BPTl9VU19SQVRFXzJQNUcsCit9OworCitzdGF0aWMgc3lzX21vZGVfZGIgZGJfc3lzID0ge307CitzeXNfbW9kZV9kYiAqc21kYmcgPSAmZGJfc3lzOworCit2b2lkIGJjbV9jb21tb25fZ3Bvbl9pbml0KGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSkKK3sKKyAgICB1aW50OF90IGk7CisgICAgYmNtb2x0X3hncG9uX251bV9vZl9vbnVzIHhncG9uX251bV9vZl9vbnVzOworICAgIC8qIG5lZWQgdG8gY2hlY2sgZm9yIFhHUE9OIFhHUyBOR1BPTjIgbW9kZXMsIHRoZSBzdXBwb3J0ZWQgbnVtYmVyIG9mIG9udXMgKi8KKyAgICBiY21vbHRfeGdwb25fbnVtX29mX29udXNfZ2V0KDAsICZ4Z3Bvbl9udW1fb2Zfb251cyk7CisKKyAgICBzd2l0Y2ggKHN5c3RlbV9tb2RlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YOgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBHUE9OX01BWF9OVU1fT0ZfUE9OUzsKKyAgICAgICAgZm9yIChpPTA7IGk8c21kYmctPm51bV9vZl9wb25zOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtZGJnLT5wb25zW2ldID0gZGJfZ3BvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1g6CisgICAgICAgIHNtZGJnLT5udW1fb2ZfcG9ucyA9IEdQT05fTUFYX05VTV9PRl9QT05TIC8gMjsKKyAgICAgICAgZm9yIChpPTA7IGk8c21kYmctPm51bV9vZl9wb25zOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtZGJnLT5wb25zW2ldID0gZGJfZ3BvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgICAgIHNtZGJnLT5udW1fb2ZfcG9ucyA9IEdQT05fTUFYX05VTV9PRl9QT05TIC8gNDsKKyAgICAgICAgZm9yIChpPTA7IGk8c21kYmctPm51bV9vZl9wb25zOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtZGJnLT5wb25zW2ldID0gZGJfZ3BvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX184X1g6CisgICAgICAgIHNtZGJnLT5udW1fb2ZfcG9ucyA9IFhHUE9OX01BWF9OVU1fT0ZfUE9OUzsKKyAgICAgICAgZm9yIChpPTA7IGk8c21kYmctPm51bV9vZl9wb25zOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgCXNtZGJnLT5wb25zW2ldID0gZGJfeGdwb247CisgICAgICAgIAlpZiAoeGdwb25fbnVtX29mX29udXMgPT0gQkNNT0xUX1hHUE9OX05VTV9PRl9PTlVTX1hHUE9OX1NVUFBPUlRfNTEwX09OVVMpCisgICAgICAgIAl7CisgICAgICAgIAkJc21kYmctPnBvbnNbaV0ubnVtX29mX29udXMgPSBYR1BPTl9NQVhfTlVNX09GX09OVVM7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YOgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBYR1BPTl9NQVhfTlVNX09GX1BPTlMgLyAyOworICAgICAgICBmb3IgKGk9MDsgaTxzbWRiZy0+bnVtX29mX3BvbnM7IGkrKykKKyAgICAgICAgeworICAgICAgICAJc21kYmctPnBvbnNbaV0gPSBkYl94Z3BvbjsKKyAgICAgICAgCWlmICh4Z3Bvbl9udW1fb2Zfb251cyA9PSBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfWEdQT05fU1VQUE9SVF81MTBfT05VUykKKyAgICAgICAgCXsKKyAgICAgICAgCQlzbWRiZy0+cG9uc1tpXS5udW1fb2Zfb251cyA9IFhHUE9OX01BWF9OVU1fT0ZfT05VUzsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OXzhfWEdQT05fNF9YX0NPRVhJU1RFTkNFOgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBHUE9OX01BWF9OVU1fT0ZfUE9OUzsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBmaXJzdCBoYWxmIGNoaXAgYXMgWEdQT04gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8WEdQT05fTUFYX05VTV9PRl9QT05TOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgCXNtZGJnLT5wb25zW2ldID0gZGJfeGdwb247CisgICAgICAgIAlpZiAoeGdwb25fbnVtX29mX29udXMgPT0gQkNNT0xUX1hHUE9OX05VTV9PRl9PTlVTX1hHUE9OX1NVUFBPUlRfNTEwX09OVVMpCisgICAgICAgIAl7CisgICAgICAgIAkJc21kYmctPnBvbnNbaV0ubnVtX29mX29udXMgPSBYR1BPTl9NQVhfTlVNX09GX09OVVM7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgLyogSW5pdGlhbGl6ZSBzZWNvbmQgaGFsZiBjaGlwIGFzIEdQT04gKi8KKyAgICAgICAgZm9yICg7IGk8c21kYmctPm51bV9vZl9wb25zOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtZGJnLT5wb25zW2ldID0gZGJfZ3BvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HOgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBYR1NfMlhfTlVNX09GX1BPTlM7CisgICAgICAgIGZvciAoaT0wOyBpPHNtZGJnLT5udW1fb2ZfcG9uczsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlzbWRiZy0+cG9uc1tpXSA9IGRiX3hnczsKKyAgICAgICAgCWlmICh4Z3Bvbl9udW1fb2Zfb251cyA9PSBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfWEdQT05fU1VQUE9SVF81MTBfT05VUykKKyAgICAgICAgCXsKKyAgICAgICAgCQlzbWRiZy0+cG9uc1tpXS5udW1fb2Zfb251cyA9IFhHUE9OX01BWF9OVU1fT0ZfT05VUzsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzJfWF8xMF9HOgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBOR1BPTjJfMlhfTlVNX09GX1BPTlM7CisgICAgICAgIGZvciAoaT0wOyBpPHNtZGJnLT5udW1fb2ZfcG9uczsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlzbWRiZy0+cG9uc1tpXSA9IGRiX25ncG9uMjsKKyAgICAgICAgCWlmICh4Z3Bvbl9udW1fb2Zfb251cyA9PSBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfWEdQT05fU1VQUE9SVF81MTBfT05VUykKKyAgICAgICAgCXsKKyAgICAgICAgCQlzbWRiZy0+cG9uc1tpXS5udW1fb2Zfb251cyA9IFhHUE9OX01BWF9OVU1fT0ZfT05VUzsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HOgorICAgICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBOR1BPTjJfOFhfTlVNX09GX1BPTlM7CisgICAgICAgICAgIGZvciAoaT0wOyBpPHNtZGJnLT5udW1fb2ZfcG9uczsgaSsrKQorICAgICAgICAgICB7CisgICAgICAgIAkgICBzbWRiZy0+cG9uc1tpXSA9IGRiX25ncG9uMl8yXzVfZzsKKyAgICAgICAgCSAgIGlmICh4Z3Bvbl9udW1fb2Zfb251cyA9PSBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfWEdQT05fU1VQUE9SVF81MTBfT05VUykKKyAgICAgICAgCSAgIHsKKyAgICAgICAgCQkgICBzbWRiZy0+cG9uc1tpXS5udW1fb2Zfb251cyA9IFhHUE9OX01BWF9OVU1fT0ZfT05VUzsKKyAgICAgICAgCSAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKK30KKworYmNtb2x0X3N5c3RlbV9tb2RlIGJjbV9jb21tb25fZ3Bvbl9nZXRfc3lzdGVtX21vZGUodm9pZCkKK3sKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisKKyAgICAvKiBUb0RvOiBYWFg6IGl0IHJlcXVpcmVzIHdvcmsuIEpJUkEgU1dNQVBMRS0zNzI0ICovCisgICAgYmNtb2x0X3N5c3RlbV9tb2RlX2dldCgwLCAmc3lzdGVtX21vZGUpOworICAgIHJldHVybiBzeXN0ZW1fbW9kZTsKK30KKworYmNtb2x0X3Bvbl9tb2RlMnN0cl90IGJjbW9sdF9wb25fbW9kZTJzdHJbXSA9Cit7CisgICAge0JDTU9MVF9QT05fTU9ERV9HUE9OLCAiZ3BvbiJ9LAorICAgIHtCQ01PTFRfUE9OX01PREVfWEdQT04sICJ4Z3BvbiJ9LAorICAgIHtCQ01PTFRfUE9OX01PREVfWEdTLCAieGdzIn0sCisgICAge0JDTU9MVF9QT05fTU9ERV9OR1BPTjIsICJuZ3BvbjIifSwKKyAgICB7LTF9Cit9OwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGQ2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29tbW9uX2dwb24vYmNtX2NvbW1vbl9ncG9uLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2lmbmRlZiBfQkNNX0NPTU1PTl9HUE9OX0hfCisjZGVmaW5lIF9CQ01fQ09NTU9OX0dQT05fSF8KKworI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtb2x0X21hdGguaCIKKyNpbmNsdWRlICJiY21vbHRfY29udi5oIgorI2luY2x1ZGUgImJjbV9jb21tb25fZ3Bvbl9jb25zdGFudHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfcG9uX21vZGUgcG9uX21vZGU7CisgICAgYmNtb2x0X3Bvbl9hcGlfdHlwZSBhcGlfdHlwZTsKKyAgICB1aW50MTZfdCBudW1fb2Zfb251czsKKyAgICB1aW50MTZfdCBudW1fb2ZfYWxsb2NfaWRzOworICAgIHVpbnQxNl90IG51bV9vZl9keW5hbWljX2FsbG9jX2luZGljZXM7CisgICAgdWludDE2X3QgbnVtX29mX2dlbV9wb3J0czsKKyAgICB1aW50MTZfdCBudW1fb2ZfYWxsb2NfaWRzX3Blcl9vbnU7CisgICAgYmNtb2x0X3Bvbl9vbnVfaWQgb251X2lkX2Jyb2FkY2FzdDsKKyAgICBiY21vbHRfcG9uX29udV9pZCBvbnVfaWRfdW5hc3NpZ25lZDsKKyAgICBiY21vbHRfcG9uX2FsbG9jX2lkIGFsbG9jX2lkX2Jyb2FkY2FzdDsKKyAgICBiY21vbHRfcG9uX2FsbG9jX2lkIGFsbG9jX2lkX2ludmFsaWQ7CisgICAgYmNtb2x0X3Bvbl9hbGxvY19pZCBhbGxvY19pZF91bmFzc2lnbmVkOworICAgIGJjbW9sdF9wb25fdXNfcmF0ZSB1c19yYXRlOworfSBwb25fbW9kZV9kYjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IG51bV9vZl9wb25zOworICAgIHBvbl9tb2RlX2RiIHBvbnNbTUFYX05VTV9PRl9QT05TXTsKK30gc3lzX21vZGVfZGI7CisKKy8qIFN5c3RlbSBtb2RlIGRhdGFiYXNlLCBpbml0aWFsaXplZCBhdCBzeXN0ZW0gc3RhcnQuCisgKiBVc2VkIGZvciBjb25zdGFudHMgdGhhdCBjaGFuZ2UgYmFzZWQgb24gUE9OIG1vZGUsIGNoaXAgdHlwZSwgZXRjLiAqLworZXh0ZXJuIHN5c19tb2RlX2RiICpzbWRiZzsKKworLyogR2V0IHRoZSBQT04gbW9kZSBkYXRhYmFzZSBoYW5kbGUgZm9yIGEgZ2l2ZW4gUE9OIGluZGV4IChzaG9ydGN1dCBmb3Igc21kYmctPnBvbnNbcG9uX2lkXSkuICovCisjZGVmaW5lIFBNREIocG9uX2lkKSAoKGNvbnN0IHBvbl9tb2RlX2RiICopJnNtZGJnLT5wb25zW3Bvbl9pZF0pCisKKy8qIEdldCB0aGUgUE9OIG1vZGUgZm9yIGEgZ2l2ZW4gUE9OIGluZGV4IChzaG9ydGN1dCBmb3IgUE1EQihwb25faWQpLT5wb25fbW9kZSkuICovCisjZGVmaW5lIFBPTl9NT0RFKHBvbl9pZCkgKFBNREIocG9uX2lkKS0+cG9uX21vZGUpCitCQ01PTFRfVFlQRTJTVFIoYmNtb2x0X3Bvbl9tb2RlLCBleHRlcm4pCisKKy8qIEdlbmVyaWMgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byByYWlzZSBhIHNvZnR3YXJlIGVycm9yIGZvciB1bnN1cHBvcnRlZCBQT04gbW9kZXMuICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGVycm9yX3Bvbl9tb2RlX25vdF9zdXBwb3J0ZWQoYmNtb2x0X3Bvbl9uaSBwb25fbmkpCit7CisgICAgYmNtb2x0X3Bvbl9tb2RlIG1vZGUgPSBQT05fTU9ERShwb25fbmkpOworICAgIEJDTU9TX1RSQUNFX0VSUigiUE9OIG1vZGUgbm90IHN1cHBvcnRlZCBmb3IgUE9OIE5JLSVkOiAlcyAoJXUpXG4iLCBwb25fbmksIGJjbW9sdF9wb25fbW9kZTJzdHJfY29udihtb2RlKSwgbW9kZSk7CisgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7Cit9CisKKy8qIEdldCBhIG1vZHVsZSBJRCB3aXRoIGEgYmFzZSBtb2R1bGUgKyBpbnN0YW5jZSAoUE9OLCBjbHVzdGVyLCBldGMuKSBvZmZzZXQgaW4gYSB0eXBlLXNhZmUgd2F5ICovCisjZGVmaW5lIE1PRFVMRV9JTlNUQU5DRShiYXNlX21vZHVsZV9pZCwgaW5zdGFuY2UpIChiY21vc19tb2R1bGVfaWQpKCh1aW50MzJfdCkoYmFzZV9tb2R1bGVfaWQpICsgKHVpbnQzMl90KShpbnN0YW5jZSkpCisKKy8qIFNhbWUgYXMgTU9EVUxFX0lOU1RBTkNFLCBidXQgZm9yIGV2ZW50cy4gKi8KKyNkZWZpbmUgRVZFTlRfSU5TVEFOQ0UoYmFzZV9ldmVudF9pZCwgaW5zdGFuY2UpIChiY21vc19ldmVudF9pZCkoKHVpbnQzMl90KShiYXNlX2V2ZW50X2lkKSArICh1aW50MzJfdCkoaW5zdGFuY2UpKQorCisjZGVmaW5lIEZPUl9FQUNIX09OVShwb25faWQsIG9udV9pZCkgXAorICAgIGZvciAob251X2lkID0gKGJjbW9sdF9wb25fb251X2lkKTA7IG9udV9pZCA8IChiY21vbHRfcG9uX29udV9pZClQTURCKHBvbl9pZCktPm51bV9vZl9vbnVzOyBvbnVfaWQrKykKKworI2RlZmluZSBGT1JfRUFDSF9BTExPQ19JTkRFWChwb25faWQsIGFsbG9jX2luZGV4KSBcCisgICAgZm9yIChhbGxvY19pbmRleCA9IChiY21vbHRfcG9uX2FsbG9jX2luZGV4KTA7IGFsbG9jX2luZGV4IDwgKGJjbW9sdF9wb25fYWxsb2NfaW5kZXgpUE1EQihwb25faWQpLT5udW1fb2ZfYWxsb2NfaWRzOyBhbGxvY19pbmRleCsrKQorCisjZGVmaW5lIEZPUl9FQUNIX0dFTV9JTkRFWChwb25faWQsIGdlbV9wb3J0X2luZGV4KSBcCisgICAgZm9yIChnZW1fcG9ydF9pbmRleCA9IDA7IChiY21vbHRfcG9uX2dlbV9wb3J0X2luZGV4KWdlbV9wb3J0X2luZGV4IDwgKGJjbW9sdF9wb25fZ2VtX3BvcnRfaW5kZXgpUE1EQihwb25faWQpLT5udW1fb2ZfZ2VtX3BvcnRzOyBnZW1fcG9ydF9pbmRleCsrKQorCisjZGVmaW5lIEFMTE9DX0lOREVYX0lTX1ZBTElEKHBvbl9pZCwgYWxsb2NfaW5kZXgpICgoYWxsb2NfaW5kZXgpIDwgKGJjbW9sdF9wb25fYWxsb2NfaW5kZXgpUE1EQihwb25faWQpLT5udW1fb2ZfYWxsb2NfaWRzKQorI2RlZmluZSBHRU1fUE9SVF9JTkRFWF9JU19WQUxJRChwb25faWQsIGdlbV9wb3J0X2luZGV4KSBcCisgICAgKChnZW1fcG9ydF9pbmRleCkgPCAoYmNtb2x0X3Bvbl9nZW1fcG9ydF9pbmRleClQTURCKHBvbl9pZCktPm51bV9vZl9nZW1fcG9ydHMpCisKKyNkZWZpbmUgQUxMT0NfSURfTEFTVF9ERUZBVUxUKHBvbl9pZCkgKChiY21vbHRfcG9uX2FsbG9jX2lkKShQTURCKHBvbl9pZCktPm51bV9vZl9vbnVzIC0gMSkpCisjZGVmaW5lIEFMTE9DX0lEX0xBU1RfREFUQShwb25faWQsIGZpcnN0X2RhdGFfYWxsb2NfaWQpIFwKKyAgICAoKGZpcnN0X2RhdGFfYWxsb2NfaWQpICsgKGJjbW9sdF9wb25fYWxsb2NfaWQpKFBNREIocG9uX2lkKS0+bnVtX29mX2FsbG9jX2lkcyAtIFBNREIocG9uX2lkKS0+bnVtX29mX29udXMgLSAxKSkKKyNkZWZpbmUgQUxMT0NfSURfSVNfVkFMSURfREFUQShwb25faWQsIGFsbG9jX2lkLCBmaXJzdF9kYXRhX2FsbG9jX2lkKSAoIFwKKyAgICAoKGFsbG9jX2lkKSA+PSAoZmlyc3RfZGF0YV9hbGxvY19pZCkgJiYgKGFsbG9jX2lkKSA8PSBBTExPQ19JRF9MQVNUX0RBVEEocG9uX2lkLCBmaXJzdF9kYXRhX2FsbG9jX2lkKSkpCisjZGVmaW5lIEFMTE9DX0lEX0lTX1ZBTElEKHBvbl9pZCwgYWxsb2NfaWQsIGZpcnN0X2RhdGFfYWxsb2NfaWQpICggXAorICAgICgoYWxsb2NfaWQpIDw9IEFMTE9DX0lEX0xBU1RfREVGQVVMVChwb25faWQpKSB8fCBcCisgICAgQUxMT0NfSURfSVNfVkFMSURfREFUQShwb25faWQsIGFsbG9jX2lkLCBmaXJzdF9kYXRhX2FsbG9jX2lkKSkKKworI2RlZmluZSBHRU1fUE9SVF9JRF9MQVNUX0RFRkFVTFQocG9uX2lkKSAoKGJjbW9sdF9wb25fZ2VtX3BvcnRfaWQpKFBNREIocG9uX2lkKS0+bnVtX29mX29udXMgLSAxKSkKKyNkZWZpbmUgR0VNX1BPUlRfSURfTEFTVF9EQVRBKHBvbl9pZCwgZmlyc3RfZGF0YV9wb3J0X2lkKSBcCisgICAgKChmaXJzdF9kYXRhX3BvcnRfaWQpICsgKGJjbW9sdF9wb25fZ2VtX3BvcnRfaWQpKFBNREIocG9uX2lkKS0+bnVtX29mX2dlbV9wb3J0cyAtIFBNREIocG9uX2lkKS0+bnVtX29mX29udXMgLSAxKSkKKyNkZWZpbmUgR0VNX1BPUlRfSURfSVNfVkFMSURfREFUQShwb25faWQsIGdlbV9wb3J0X2lkLCBmaXJzdF9kYXRhX3BvcnRfaWQpICggXAorICAgICgoZ2VtX3BvcnRfaWQpID49IChmaXJzdF9kYXRhX3BvcnRfaWQpICYmIChnZW1fcG9ydF9pZCkgPD0gR0VNX1BPUlRfSURfTEFTVF9EQVRBKHBvbl9pZCwgZmlyc3RfZGF0YV9wb3J0X2lkKSkpCisjZGVmaW5lIEdFTV9QT1JUX0lEX0lTX1ZBTElEKHBvbl9pZCwgZ2VtX3BvcnRfaWQsIGZpcnN0X2RhdGFfcG9ydF9pZCkgKCBcCisgICAgKChnZW1fcG9ydF9pZCkgPD0gR0VNX1BPUlRfSURfTEFTVF9ERUZBVUxUKHBvbl9pZCkpIHx8IFwKKyAgICBHRU1fUE9SVF9JRF9JU19WQUxJRF9EQVRBKHBvbl9pZCwgZ2VtX3BvcnRfaWQsIGZpcnN0X2RhdGFfcG9ydF9pZCkpCisKKyNkZWZpbmUgUE9OX0lEX0lTX1ZBTElEKHN5c3RlbV9tb2RlLCBwb25faWQpICggXAorICAgICgodWludDhfdClwb25faWQgPCBzbWRiZy0+bnVtX29mX3BvbnMpICYmIFwKKyAgICAoc3lzdGVtX21vZGUgIT0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0UgfHwgcG9uX2lkIDwgWEdQT05fSEFMRl9DSElQX01BWF9OVU1fT0ZfUE9OUyB8fCBwb25faWQgPj0gWEdQT05fTUFYX05VTV9PRl9QT05TKSkKKwordm9pZCBiY21fY29tbW9uX2dwb25faW5pdChiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGUpOworYmNtb2x0X3N5c3RlbV9tb2RlIGJjbV9jb21tb25fZ3Bvbl9nZXRfc3lzdGVtX21vZGUodm9pZCk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29tbW9uX2dwb24vYmNtX2NvbW1vbl9ncG9uX2NvbnN0YW50cy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbl9jb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDMwOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbl9jb25zdGFudHMuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpwcm9wcmlldGFyeTpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorCisxLiBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorICAgIGNvbnN0aXR1dGVzIHRoZSB2YWx1YWJsZSB0cmFkZSBzZWNyZXRzIG9mIEJyb2FkY29tLCBhbmQgeW91IHNoYWxsIHVzZQorICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tCisgICAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKworMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorICAgIExJTUlURUQgUkVNRURZLgorOj4KKyovCisjaWZuZGVmIF9CQ01fQ09NTU9OX0dQT05fQ09OU1RBTlRTX0hfCisjZGVmaW5lIF9CQ01fQ09NTU9OX0dQT05fQ09OU1RBTlRTX0hfCisKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfZGF0YS5oIgorCisvKiBtYXhpbXVtIG51bWJlciBvZiBQT05zIGZvciBhbnkgc3VwcG9ydGVkIFBPTiBtb2RlICovCisjZGVmaW5lIE1BWF9OVU1fT0ZfUE9OUyAxNgorCisvKiogR2VuZXJpYyAiUE9OIG1vZGUiIHVzZWQgdG8gc2ltcGxpZnkgbG9naWMgd2hlbiBzcGVjaWZpYyAic3lzdGVtIG1vZGUiIGlzIHRvbyBjb21wbGV4LiAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT0xUX1BPTl9NT0RFX0dQT04sCisgICAgQkNNT0xUX1BPTl9NT0RFX1hHUE9OLAorICAgIEJDTU9MVF9QT05fTU9ERV9YR1MsCisgICAgQkNNT0xUX1BPTl9NT0RFX05HUE9OMiwKK30gYmNtb2x0X3Bvbl9tb2RlOworCisvKiogT2JqZWN0IHR5cGUgdXNlZCBieSB0aGUgQVBJIGxheWVyIGZvciBwcm92aXNpb25pbmcgZWFjaCBQT04gbW9kZS4gKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9QT05fQVBJX1RZUEVfR1BPTiwKKyAgICBCQ01PTFRfUE9OX0FQSV9UWVBFX1hHUE9OLAorfSBiY21vbHRfcG9uX2FwaV90eXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfUE9OX1VTX1JBVEVfMUcsCisgICAgQkNNT0xUX1BPTl9VU19SQVRFXzJQNUcsCisgICAgQkNNT0xUX1BPTl9VU19SQVRFXzEwRywKK30gYmNtb2x0X3Bvbl91c19yYXRlOworCisvKiBOdW1iZXIgb2YgUE9OIE5JcyBwZXIgUE9OIG1vZGUgKi8KKyNkZWZpbmUgR1BPTl9NQVhfTlVNX09GX1BPTlMgMTYKKyNkZWZpbmUgWEdQT05fTUFYX05VTV9PRl9QT05TIDgKKyNkZWZpbmUgWEdQT05fSEFMRl9DSElQX01BWF9OVU1fT0ZfUE9OUyA0CisjZGVmaW5lIFhHU18yWF9OVU1fT0ZfUE9OUyAyCisjZGVmaW5lIE5HUE9OMl8yWF9OVU1fT0ZfUE9OUyAyCisjZGVmaW5lIE5HUE9OMl84WF9OVU1fT0ZfUE9OUyA4CisKKy8qIE9OVSdzIHBlciBQT04gKi8KKyNkZWZpbmUgR1BPTl9OVU1fT0ZfT05VUyAxMjgKKyNkZWZpbmUgWEdQT05fTlVNX09GX09OVVMgMjU2CisjZGVmaW5lIFhHUE9OX01BWF9OVU1fT0ZfT05VUyA1MTAKKworLyogQWxsb2MgSUQncyBwZXIgUE9OICovCisjZGVmaW5lIEdQT05fTlVNX09GX0RZTkFNSUNfQUxMT0NfSU5ESUNFUyA2NDAKKyNkZWZpbmUgR1BPTl9OVU1fT0ZfQUxMT0NfSURTIDEwMjQKKyNkZWZpbmUgWEdQT05fTlVNX09GX0RZTkFNSUNfQUxMT0NfSU5ESUNFUyAxMjgwCisjZGVmaW5lIFhHUE9OX05VTV9PRl9BTExPQ19JRFMgMjA0OAorCisvKiBBbGxvYyBJRCdzIHBlciBPTlUgKi8KKyNkZWZpbmUgR1BPTl9OVU1fT0ZfQUxMT0NfSURTX1BFUl9PTlUgMzIKKyNkZWZpbmUgWEdQT05fTlVNX09GX0FMTE9DX0lEU19QRVJfT05VIDMyCisjZGVmaW5lIE5VTV9PRl9BTExPQ19JRFNfUEVSX09OVSAoTUFYKEdQT05fTlVNX09GX0FMTE9DX0lEU19QRVJfT05VLCBYR1BPTl9OVU1fT0ZfQUxMT0NfSURTX1BFUl9PTlUpKQorCisjZGVmaW5lIEdQT05fT05VX0lEX0JST0FEQ0FTVCAoKGJjbW9sdF9wb25fb251X2lkKTB4RkYpCisjZGVmaW5lIFhHUE9OX09OVV9JRF9CUk9BRENBU1QgKChiY21vbHRfcG9uX29udV9pZCkweDNGRikKKyNkZWZpbmUgR1BPTl9PTlVfSURfVU5BU1NJR05FRCBHUE9OX09OVV9JRF9CUk9BRENBU1QKKyNkZWZpbmUgWEdQT05fT05VX0lEX1VOQVNTSUdORUQgWEdQT05fT05VX0lEX0JST0FEQ0FTVAorI2RlZmluZSBYR1BPTl9EVU1NWV9PTlVfSUQgKChiY21vbHRfcG9uX29udV9pZCk1MTEpCisKKyNkZWZpbmUgR1BPTl9BTExPQ19JRF9CUk9BRENBU1QgKChiY21vbHRfcG9uX2FsbG9jX2lkKTB4RkUpCisjZGVmaW5lIFhHUE9OX0FMTE9DX0lEX0JST0FEQ0FTVCAoKGJjbW9sdF9wb25fYWxsb2NfaWQpMHgzRkYpIC8qIFVzZWQgZm9yIDIuNUcgdXBzdHJlYW0gaW4gWEdQT04vWEdTL05HUE9OMiAqLworI2RlZmluZSBURU5fR0lHX0FMTE9DX0lEX0JST0FEQ0FTVCAoKGJjbW9sdF9wb25fYWxsb2NfaWQpMHgzRkUpIC8qIFVzZWQgZm9yIDEwRyB1cHN0cmVhbSBpbiBYR1MvTkdQT04yICovCisjZGVmaW5lIFRFTl9PUl8yUDVfR0lHX0FMTE9DX0lEX0JST0FEQ0FTVCAoKGJjbW9sdF9wb25fYWxsb2NfaWQpMHgzRkQpIC8qIFVzZWQgZm9yIGVpdGhlciAyLjVHLzEwRyB1cHN0cmVhbSBpbiBYR1MvTkdQT04yICovCisjZGVmaW5lIEdQT05fQUxMT0NfSURfVU5BU1NJR05FRCAoKGJjbW9sdF9wb25fYWxsb2NfaWQpMHhGRikKKyNkZWZpbmUgWEdQT05fQUxMT0NfSURfVU5BU1NJR05FRCAoKGJjbW9sdF9wb25fYWxsb2NfaWQpNTEyKSAvKiBJbiBYR1BPTiB3ZSBoYXZlIHVwIHRvIDUxMiBPTlUncywgYW5kIGFsbG9jIElEIGlzIHVudXNlZCBmb3Igc3VyZS4gKi8KKyNkZWZpbmUgWEdQT05fRFVNTVlfQUxMT0NfSUQgKChiY21vbHRfcG9uX2FsbG9jX2lkKTUxMSkKKworLyogR0VNIFBPUlQgSUQncyBwZXIgUE9OICovCisjZGVmaW5lIEdQT05fTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfUE9OIDQwOTYKKyNkZWZpbmUgWEdQT05fTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfUE9OIDgxOTIKKy8qIEdFTSBQT1JUIElEJ3MgcGVyIE9OVSAqLworI2RlZmluZSBNQVhfTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfT05VIDI1NgorCisvKiBPTUNJL0NQVSBwYWNrZXRzICovCisjZGVmaW5lIE9NQ0lfQ1JDX0xFTiA0CisKKy8qIFBhY2tldCBzaXplcyAtIGFsbCB2YWx1ZXMgaW4gYnl0ZXMgcmVzb2x1dGlvbiAqLworI2RlZmluZSBPTUNJX01JTl9QS1RfU0laRV9XSVRIX0NSQyAxNAorI2RlZmluZSBPTUNJX01JTl9QS1RfU0laRV9XT19DUkMgMTAKKyNkZWZpbmUgT01DSV9NQVhfUEtUX1NJWkVfV0lUSF9DUkMgMTk4MAorI2RlZmluZSBPTUNJX01BWF9QS1RfU0laRV9XT19DUkMgMTk3NgorI2RlZmluZSBPTUNJX0JBU0VMSU5FX1BLVF9TSVpFX1dPX0NSQyA0NAorI2RlZmluZSBPTUNJX0VYVEVOREVEX1BLVF9TSVpFX1dPX0NSQyBPTUNJX01BWF9QS1RfU0laRV9XT19DUkMKKyNkZWZpbmUgQ1BVX01JTl9QS1RfU0laRV9XSVRIX0NSQyA2NAorI2RlZmluZSBDUFVfTUlOX1BLVF9TSVpFX1dPX0NSQyA2MAorI2RlZmluZSBDUFVfTUFYX1BLVF9TSVpFX1dJVEhfQ1JDIDIwNDgKKyNkZWZpbmUgQ1BVX01BWF9QS1RfU0laRV9XT19DUkMgMjA0NAorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbl9mYXN0LmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29tbW9uX2dwb24vYmNtX2NvbW1vbl9ncG9uX2Zhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGFjNWM1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbl9mYXN0LmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2lmbmRlZiBfQkNNX0NPTU1PTl9HUE9OX0ZBU1RfSF8KKyNkZWZpbmUgX0JDTV9DT01NT05fR1BPTl9GQVNUX0hfCisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorI2luY2x1ZGUgPGJjbXRyX3BjaWVfc3dfcXVldWUuaD4KKyNlbmRpZgorCisjZGVmaW5lIEJDTV9DT01NT05fR1BPTl9GQVNUX0FQSV9MSVNUX1NJWkUgMTI4MAorI2RlZmluZSBCQ01fQ09NTU9OX0dQT05fRkFTVF9BUElfQUNDRVNTX0xJU1RfU0laRSAyMDQ4CisjZGVmaW5lIFVSR0VOVF9DSEFOTkVMIEJDTVRSX1NXUV9GSVJTVF9VUkdFTlRfQ0hBTk5FTAorCit0eXBlZGVmIGVudW0KK3sKKwlCQ01fQ09NTU9OX0ZBU1RfTVNHX1RZUEVfR0VUX0FMTE9DX1NUQVRTLAorCUJDTV9DT01NT05fRkFTVF9NU0dfVFlQRV9TRVRfQUxMT0NTLAorCUJDTV9DT01NT05fRkFTVF9NU0dfVFlQRV9TRVRfQldfQUxMT0NTCit9IGJjbV9jb21tb25fZmFzdF9tc2dfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgX19QQUNLRURfQVRUUl9TVEFSVF9fCit7CisJdWludDE2X3QgYWxsb2NfaWQ7CisJdWludDMyX3QgYWxsb2NhdGVkOworCXVpbnQzMl90IHVzZWQ7CisJdWludDMyX3Qgc3RhdHVzX3JlcG9ydDsKK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21fY29tbW9uX2Zhc3RfZ2V0X2FsbG9jX3N0YXRzOworCit0eXBlZGVmIHN0cnVjdCBfX1BBQ0tFRF9BVFRSX1NUQVJUX18KK3sKKwl1aW50OF90IHBvbl9uaTsKKwl1aW50MzJfdCBjeWNsZV9udW07CisJdWludDMyX3QgYXZhaWxhYmxlX2J3OworCXVpbnQzMl90IG51bV9vZl9hbGxvY3M7Cit9IF9fUEFDS0VEX0FUVFJfRU5EX18gYmNtX2NvbW1vbl9mYXN0X2dldF9zdGF0c19pbmRfaGRyOworCit0eXBlZGVmIHN0cnVjdCBfX1BBQ0tFRF9BVFRSX1NUQVJUX18KK3sKKwliY21fY29tbW9uX2Zhc3RfZ2V0X3N0YXRzX2luZF9oZHIgaGRyOworCWJjbV9jb21tb25fZmFzdF9nZXRfYWxsb2Nfc3RhdHMgYWxsb2Nfc3RhdHNfbGlzdFtCQ01fQ09NTU9OX0dQT05fRkFTVF9BUElfTElTVF9TSVpFXTsKK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21fY29tbW9uX2Zhc3RfZ2V0X3N0YXRzX2luZDsKKwordHlwZWRlZiBzdHJ1Y3QgX19QQUNLRURfQVRUUl9TVEFSVF9fCit7CisJdWludDE2X3QgYWxsb2NfaWQ7CisJdWludDMyX3QgYWxsb2NhdGlvbl9ibG9ja3M7CisJLyogdWludDhfdCBhY2Nlc3NfbnVtOyAgLSBXaWxsIGJlIGFkZGVkIGluIHRoZSAybmQgcGhhc2UgKi8KK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21fY29tbW9uX2Zhc3Rfc2V0X2FsbG9jOworCit0eXBlZGVmIHN0cnVjdCBfX1BBQ0tFRF9BVFRSX1NUQVJUX18KK3sKKwl1aW50MzJfdCBjeWNsZV9udW07CisJdWludDMyX3QgbnVtX29mX2FsbG9jczsKK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21fY29tbW9uX2Zhc3RfbXNnX2hkcjsKKwordHlwZWRlZiBzdHJ1Y3QgX19QQUNLRURfQVRUUl9TVEFSVF9fCit7CisJYmNtX2NvbW1vbl9mYXN0X21zZ19oZHIgaGRyOworCWJjbV9jb21tb25fZmFzdF9zZXRfYWxsb2Mgc2V0X2FsbG9jX2xpc3RbQkNNX0NPTU1PTl9HUE9OX0ZBU1RfQVBJX0xJU1RfU0laRV07Cit9IF9fUEFDS0VEX0FUVFJfRU5EX18gYmNtX2NvbW1vbl9mYXN0X3NldF9hbGxvY3NfbXNnOworCit0eXBlZGVmIHN0cnVjdCBfX1BBQ0tFRF9BVFRSX1NUQVJUX18KK3sKKwl1aW50MTZfdCBhbGxvY19pZDsKKwl1aW50MTZfdCBhbGxvY2F0aW9uX3NpemU7CisJdWludDE2X3Qgc3RhcnRfdGltZTsKKwl1aW50OF90IGJ1cnN0X3Byb2ZpbGU7CisgICAgc3RydWN0IF9fUEFDS0VEX0FUVFJfU1RBUlRfXworICAgIHsKKwkJYmNtb3NfYm9vbCBwbG9hbV9mbGFnCQkJOjE7CisJCWJjbW9zX2Jvb2wgZGJydV9mbGFnCQkJOjE7CisJCWJjbW9zX2Jvb2wgZW5kX29mX2ZyYW1lCQkJOjE7CisJCWJjbW9zX2Jvb2wgZW5kX29mX21hcAkJCToxOworCQliY21vc19ib29sIGZ3aQkJCQkJOjE7CisgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgCTozOworICAgIH0gX19QQUNLRURfQVRUUl9FTkRfXyBhbGxvY19mbGFnczsKK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21fY29tbW9uX2Zhc3Rfc2V0X2FjY2VzczsKKwordHlwZWRlZiBzdHJ1Y3QgX19QQUNLRURfQVRUUl9TVEFSVF9fCit7CisJYmNtX2NvbW1vbl9mYXN0X21zZ19oZHIgaGRyOworCWJjbV9jb21tb25fZmFzdF9zZXRfYWNjZXNzIHNldF9hY2Nlc3NfbGlzdFtCQ01fQ09NTU9OX0dQT05fRkFTVF9BUElfQUNDRVNTX0xJU1RfU0laRV07Cit9IF9fUEFDS0VEX0FUVFJfRU5EX18gYmNtX2NvbW1vbl9mYXN0X3NldF9hY2Nlc3Nlc19tc2c7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbmZpZy9iY21fY29uZmlnLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29uZmlnL2JjbV9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDAyZmUzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbmZpZy9iY21fY29uZmlnLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PTFRfQ09ORklHX0hfCisjZGVmaW5lIEJDTU9MVF9DT05GSUdfSF8KKworLyoqIFxkZWZncm91cCBjb25maWcgQ29uZmlndXJhdGlvbiBDb25zdGFudHMKKyAqIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzIHRoYXQgbXVzdCBiZSByZXZpc2VkIGJ5IGN1c3RvbWVyCisgKiBAeworICovCisKKy8qKiBDUFUgRW5kaWFubmVzcy4gTXVzdCBiZSBzZXQgdG8gQkNNT1NfRU5ESUFOX0JJRyBvciBCQ01PU19FTkRJQU5fTElUVExFLiAqLworI2lmbmRlZiBCQ01fQ1BVX0VORElBTgorCisjZXJyb3IgQkNNX0NQVV9FTkRJQU4gbXVzdCBiZSBzZXQgQkNNT1NfRU5ESUFOX0JJRyBvciBCQ01PU19FTkRJQU5fTElUVExFCisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTV9DUFVfRU5ESUFOICovCisKKy8qKiBUcmFuc3BvcnQgbGF5ZXIgY29uZmlndXJhdGlvbiBkZWZhdWx0cyAqLworI2RlZmluZSBCQ01UUl9UUl9UWVBFICAgICAgICAgICAgICBCQ01UUl9UWVBFX1VEUCAgICAgICAvKio8IFRyYW5zcG9ydCB0eXBlOiByYXcvdWRwICovCisjZGVmaW5lIEJDTVRSX1RSX1VEUF9IT1NUX0lQICAgICAgIDB4N2YwMDAwMDEKKyNkZWZpbmUgQkNNVFJfVFJfVURQX09MVF9JUCAgICAgICAgMHg3ZjAwMDAwMQorI2RlZmluZSBCQ01UUl9UUl9VRFBfSE9TVF9QT1JUICAgICAweDQwMDAKKyNkZWZpbmUgQkNNVFJfVFJfVURQX09MVF9QT1JUICAgICAgMHg0MDEwCisKKyNkZWZpbmUgQkNNVFJfTUFYX09MVFMgICAgICAgICAgICAgMiAgICAgIC8qKjwgTWF4IG51bWJlciBvZiBPTFRzICovCisjZGVmaW5lIEJDTVRSX01BWF9JTlNUQU5DRVMgICAgICAgIDE2ICAgICAvKio8IE1heCBudW1iZXIgb2YgbWVzc2FnZSBoYW5kbGVyIGluc3RhbmNlcyAtIHR5cGljYWxseSBhIG51bWJlciBvZiBQT04ncyAqLworI2RlZmluZSBCQ01UUl9NQVhfUkVUUklFUyAgICAgICAgICAwICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIHJlcXVlc3QgcmV0cmFuc21pc3Npb25zICovCisjZGVmaW5lIEJDTVRSX01TR19USU1FT1VUICAgICAgICAgIDUwMCAgICAvKio8IE1heCB0aW1lIHRvIHdhaXQgZm9yIHJlc3BvbnNlIG9yIG5leHQgbWVzc2FnZSBwYXJ0IChtcykgKi8KKyNkZWZpbmUgQkNNVFJfTUFYX1JFUVVFU1RTICAgICAgICAgNjQgICAgIC8qKjwgTWF4IG51bWJlciBvZiBvdXRzdGFuZGluZyByZXF1ZXN0cyBwZXIgYXBwbGljYXRpb24gcGVyIE9MVCAqLworI2RlZmluZSBCQ01UUl9NQVhfQVVUT1MgICAgICAgICAgICAyNTYgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgbXVsdGktcGFydCBhdXRvbm9tb3VzIG1lc3NhZ2VzICovCisjZGVmaW5lIEJDTVRSX01BWF9GUkFHTUVOVFMgICAgICAgIDUwMCAgICAvKio8IE1heGltdW0gbnVtYmVyIG9mIGZyYWdtZW50cyBwZXIgbWVzc2FnZSAqLworI2RlZmluZSBCQ01UUl9NU0dfV0FJVF9NUyAgICAgICAgICA1ICAgICAgLyoqPCBsZW5ndGggb2YgdGltZSB0byB3YWl0IG9uIGNvbm4gcmVhZCAqLworI2RlZmluZSBCQ01UUl9NU0dfUkVBRFlfTVMgICAgICAgICA1MCAgICAgLyoqPCBUaW1lIHRvIHdhaXQgZm9yIGFwcGxpY2F0aW9uIHRvIHBlYWsgdXAgcmVzcG9uc2UgKi8KKyNkZWZpbmUgQkNNVFJfTUFYX01UVV9TSVpFICAgICAgICAgNDA5NiAgIC8qKjwgbWF4IE1UVSBzaXplICovCisjZGVmaW5lIEJDTVRSX1JYX1RIUkVBRF9TVEFDSyAgICAgIDAgICAgICAvKio8IFJ4IHRocmVhZCBzdGFjayBzaXplICovCisKKy8qKiBEZWJ1ZyBvdXRwdXQgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBCQ01fREJHX01BWF9NU0dfU0laRSAgICAgICAxMjggICAgLyoqPCBNYXggbnVtYmVyIG9mIG1lc3NhZ2UgYnl0ZXMgdG8gaW5jbHVkZSBpbiBtZXNzYWdlIGR1bXAgKi8KKworI2RlZmluZSBCQ01UUl9CVUZfRVhUUkFfSEVBRFJPT00gICAwICAgICAgLyoqPCBFeHRyYSBoZWFkcm9vbSB0byByZXNlcnZlIGlzIHN5c3RlbSBidWZmZXIgKi8KKworI2RlZmluZSBCQ01UUl9QQ0lFX1NUQVJUX1RJTUVPVVQgICAxNTAwMCAgLyoqPCBBcHBsaWNhdGlvbiBzdGFydCB0aW1lb3V0IChtcykgKi8KKyNkZWZpbmUgQkNNVFJfUENJRV9DT05ORUNUX1RJTUVPVVQgMTUwMDAgIC8qKjwgQ29ubmVjdCB0aW1lb3V0IChtcykgKi8KKy8qKiBAfSAqLworCisjZGVmaW5lIEJDTVRSX01BWF9SWFFfU0laRSAgICAgICAgIDI1NgorCisjZW5kaWYgLyogQkNNT0xUX0NPTkZJR19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Nvb3BfZGJhL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Nvb3BfZGJhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjBhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29vcF9kYmEvTWFrZWZpbGUKQEAgLTAsMCArMSwzOCBAQAorIyBDb29wIERCQQorTU9EX05BTUUgPSBjb29wX2RiYQorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKK01PRF9UWVBFID0gbGludXhfbGliCitlbHNlCitNT0RfVFlQRSA9IGxpYgorZW5kaWYKKworaWZlcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCisJRVhUUkFfQ0ZMQUdTICs9IC1JJChUT1BfRElSKS9ob3N0X2RyaXZlci9hcGkgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL3V0aWxzIFwKKy1JJChUT1BfRElSKS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nIFwKKy1JJChUT1BfRElSKS9ob3N0X2RyaXZlci9jb21tb25fZ3BvbiBcCistSSQoVE9QX0RJUikvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eCBcCistSSQoVE9QX0RJUikvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L3BjaWVfc3dfcXVldWUgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL3BjaWUgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL3RyYW5zcG9ydAorZWxzZQorCUVYVFJBX0NGTEFHUyArPSAtSSQoVE9QX0RJUikvY29tbW9uL2dwb24gXAorLUkkKFRPUF9ESVIpL2NvbW1vbi9tb2RlbC9tYXBsZSBcCistSSQoVE9QX0RJUikvY29tbW9uL3RyYW5zcG9ydC9kcml2ZXIvbWFwbGUvcGNpZV9zd19xdWV1ZSBcCistSSQoVE9QX0RJUikvY29tbW9uL2RyaXZlcnMvbWFwbGUvcGNpZSBcCistSSQoVE9QX0RJUikvY29tbW9uL2FwaSBcCistSSQoVE9QX0RJUikvY29tbW9uL3V0aWxzIFwKKy1JJChUT1BfRElSKS9jb21tb24vZGV2X2xvZyBcCistSSQoVE9QX0RJUikvaG9zdC90cmFuc3BvcnQvZHJpdmVyL21hcGxlL211eAorZW5kaWYKKwkJCQkKK3NyY3MgPSBiY21vbHRfY29vcF9kYmEuYworCitNT0RfSU5DX0RJUlMgPSAkKFNSQ19ESVIpICQoTU9ERUxfT1VUX0RJUikKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29vcF9kYmEvYmNtb2x0X2Nvb3BfZGJhLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29vcF9kYmEvYmNtb2x0X2Nvb3BfZGJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkN2FlNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9jb29wX2RiYS9iY21vbHRfY29vcF9kYmEuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgImJjbW9sdF9jb29wX2RiYS5oIgorCisvKiB0aGlzIGlzIHRoZSBob3N0IGFwcGxpY2F0aW9uIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gaGFuZGxlIHRoZSBpbmRpY2F0aW9ucyBzZW50IGZyb20KKyAqIHRoZSBlbWJlZGRlZCBzaWRlIHRvIHRoZSBob3N0IGR1cmluZyBEQkEgY3ljbGUKKyAqLworc3RhdGljIGJjbW9sdF9jb29wX2RiYV9ob3N0X2hhbmRsZXJfY2IgaG9zdF9oYW5kbGVyX2FycmF5W0JDTVRSX01BWF9PTFRTXTsKKworLyogQW4gQVBJIHRvIGltcGxlbWVudCBQYXJ0aWFsLUV4dGVybmFsIERCQSB0eXBlICovCitiY21vc19lcnJubyBiY21vbHRfZmFzdF9vcGVyX3NldF9hbGxvY3MoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDhfdCBwb25fbmksIGJjbV9jb21tb25fZmFzdF9zZXRfYWxsb2NzX21zZyAqbXNnKQoreworCWJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKwliY21vc19idWYgKmJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpidWZfZGF0YTsKKwliY21fY29tbW9uX2Zhc3Rfc2V0X2FsbG9jc19tc2cgKm1zZ19wOworCXVpbnQzMl90IGxlbiA9IHNpemVvZihiY21fY29tbW9uX2Zhc3RfbXNnX3R5cGUpICsgc2l6ZW9mKHBvbl9uaSkgKworCQlzaXplb2YobXNnLT5oZHIpICsgc2l6ZW9mKGJjbV9jb21tb25fZmFzdF9zZXRfYWxsb2MpICogbXNnLT5oZHIubnVtX29mX2FsbG9jczsKKwl1aW50MzJfdCBpOworCisgICAgYnVmID0gYmNtb3NfYnVmX2FsbG9jKGxlbik7CisKKyAgICBpZiAoIWJ1ZikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgYWxsb2NhdGUgcGFja2V0IGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBiY21vc19idWZfbGVuZ3RoX3NldChidWYsIGxlbik7CisgICAgYnVmX2RhdGEgPSBiY21vc19idWZfZGF0YShidWYpOworCisJLyogY2hhbmdlIGVuZGlhbm5lc3MgZnJvbSBob3N0IHRvIGVtYmVkZGVkICovCisKKyAgICAvKiBmaXhpbmcgaGVhZGVyIGVuZGlhbm5lc3MgYW5kIHBhY2tpbmcgKi8KKyAgICAqYnVmX2RhdGErKyA9ICh1aW50OF90KUJDTV9DT01NT05fRkFTVF9NU0dfVFlQRV9TRVRfQUxMT0NTOyAvKiBtc2cgdHlwZSAqLworICAgICpidWZfZGF0YSsrID0gcG9uX25pOyAvKiBwb25fbmkgaXMgVTggKi8KKworICAgIG1zZ19wID0gKGJjbV9jb21tb25fZmFzdF9zZXRfYWxsb2NzX21zZyAqKWJ1Zl9kYXRhOworCisgICAgbXNnX3AtPmhkci5jeWNsZV9udW0gPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbXNnLT5oZHIuY3ljbGVfbnVtKTsKKworICAgIG1zZ19wLT5oZHIubnVtX29mX2FsbG9jcyA9IEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoVTMyLCBtc2ctPmhkci5udW1fb2ZfYWxsb2NzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YobXNnLT5oZHIubnVtX29mX2FsbG9jcyk7IGkrKykKKyAgICB7CisgICAgCS8qIGdvaW5nIG92ZXIgdGhlIGxpc3QgcGFydHMgYW5kIGZpeGluZyB0aGVpciBlbmRpYW5pdHkgYW5kIHBhY2tpbmcgaW50byBidWYgKi8KKyAgICAJbXNnX3AtPnNldF9hbGxvY19saXN0W2ldLmFsbG9jX2lkID0gQkNNT0xUX0JVRl9FTkRJQU5fQ1BVX1RPX0JVRihVMTYsIG1zZy0+c2V0X2FsbG9jX2xpc3RbaV0uYWxsb2NfaWQpOworICAgIAltc2dfcC0+c2V0X2FsbG9jX2xpc3RbaV0uYWxsb2NhdGlvbl9ibG9ja3MgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbXNnLT5zZXRfYWxsb2NfbGlzdFtpXS5hbGxvY2F0aW9uX2Jsb2Nrcyk7CisgICAgfQorCisJLyogc2VuZCBkaXJlY3RseSB0byBQQ0llIGRyaXZlciBvbiB0aGUgZGVkaWNhdGVkIGNoYW5uZWwgZm9yIGZhc3QgQVBJICovCisgICAgcmMgPSBiY210cl9zd3Ffc2VuZChkZXZpY2UsIFVSR0VOVF9DSEFOTkVMLCBidWYpOworCisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJiY210cl9wY2llX3NlbmQgZmFpbGVkLiBFcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgYmNtb3NfYnVmX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgLyogYnVmZmVyIHdpbGwgYmUgZnJlZWQgYXV0b21hdGljYWxseSBvbmNlIGl0IGlzIHRyYW5zbWl0dGVkICovCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9mYXN0X29wZXJfc2V0X2FjY2Vzc2VzKGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQ4X3QgcG9uX25pLCBiY21fY29tbW9uX2Zhc3Rfc2V0X2FjY2Vzc2VzX21zZyAqbXNnKQoreworCWJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKwliY21vc19idWYqIGJ1ZjsKKwliY21fY29tbW9uX2Zhc3Rfc2V0X2FjY2Vzc2VzX21zZyAqbXNnX3A7CisJdW5zaWduZWQgY2hhciogYnVmX2RhdGE7CisJdWludDMyX3QgbGVuID0gc2l6ZW9mKGJjbV9jb21tb25fZmFzdF9tc2dfdHlwZSkgKyBzaXplb2YocG9uX25pKSArCisJCXNpemVvZiAobXNnLT5oZHIpICsgc2l6ZW9mKGJjbV9jb21tb25fZmFzdF9zZXRfYWNjZXNzKSAqIG1zZy0+aGRyLm51bV9vZl9hbGxvY3M7CisJdWludDMyX3QgaTsKKworICAgIGJ1ZiA9IGJjbW9zX2J1Zl9hbGxvYyhsZW4pOworCisgICAgaWYgKCFidWYpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGFsbG9jYXRlIHBhY2tldCBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgYmNtb3NfYnVmX2xlbmd0aF9zZXQoYnVmLCBsZW4pOworICAgIGJ1Zl9kYXRhID0gYmNtb3NfYnVmX2RhdGEoYnVmKTsKKworCS8qIGNoYW5nZSBlbmRpYW5lc3MgZnJvbSBob3N0IHRvIGVtYmVkZGVkICovCisgICAgLyogZml4aW5nIGhlYWRlciBlbmRpYW5uZXNzIGFuZCBwYWNraW5nICovCisgICAgKmJ1Zl9kYXRhKysgPSAodWludDhfdClCQ01fQ09NTU9OX0ZBU1RfTVNHX1RZUEVfU0VUX0JXX0FMTE9DUzsKKyAgICAqYnVmX2RhdGErKyA9IHBvbl9uaTsgLyogcG9uX25pIGlzIFU4ICovCisKKyAgICBtc2dfcCA9IChiY21fY29tbW9uX2Zhc3Rfc2V0X2FjY2Vzc2VzX21zZyAqKWJ1Zl9kYXRhOworCisgICAgbXNnX3AtPmhkci5jeWNsZV9udW0gPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbXNnLT5oZHIuY3ljbGVfbnVtKTsKKyAgICBtc2dfcC0+aGRyLm51bV9vZl9hbGxvY3MgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbXNnLT5oZHIubnVtX29mX2FsbG9jcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG1zZy0+aGRyLm51bV9vZl9hbGxvY3MpOyBpKyspCisgICAgeworICAgIAkvKiBnb2luZyBvdmVyIHRoZSBsaXN0IHBhcnRzIGFuZCBmaXhpbmcgdGhlaXIgZW5kaWFuaXR5IGFuZCBwYWNraW5nIGludG8gYnVmICovCisgICAgCW1zZ19wLT5zZXRfYWNjZXNzX2xpc3RbaV0uYWxsb2NfaWQgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUxNiwgbXNnLT5zZXRfYWNjZXNzX2xpc3RbaV0uYWxsb2NfaWQpOworICAgIAltc2dfcC0+c2V0X2FjY2Vzc19saXN0W2ldLmFsbG9jYXRpb25fc2l6ZSA9IEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoVTE2LCBtc2ctPnNldF9hY2Nlc3NfbGlzdFtpXS5hbGxvY2F0aW9uX3NpemUpOworICAgIAltc2dfcC0+c2V0X2FjY2Vzc19saXN0W2ldLnN0YXJ0X3RpbWUgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUxNiwgbXNnLT5zZXRfYWNjZXNzX2xpc3RbaV0uc3RhcnRfdGltZSk7CisgICAgCW1zZ19wLT5zZXRfYWNjZXNzX2xpc3RbaV0uYnVyc3RfcHJvZmlsZSA9IG1zZy0+c2V0X2FjY2Vzc19saXN0W2ldLmJ1cnN0X3Byb2ZpbGU7IC8qIGJ1cnN0IHByb2ZpbGUgaXMgVTggKi8KKyAgICAJbXNnX3AtPnNldF9hY2Nlc3NfbGlzdFtpXS5hbGxvY19mbGFncyA9IG1zZy0+c2V0X2FjY2Vzc19saXN0W2ldLmFsbG9jX2ZsYWdzOyAvKiBwbG9hbV9mbGFnLCBkYnJ1X2ZsYWcsIGVuZF9vZl9mcmFtZSwgZW5kX29mX21hcCBhbmQgZndpIGFyZSBib29sZWFuIGFuZCBhcmUgcmVwcmVzZW50ZWQgYXMgYSBiaXRtYXAgKFU4KSAqLworICAgIH0KKworCS8qIHNlbmQgZGlyZWN0bHkgdG8gUENJZSBkcml2ZXIgb24gdGhlIGRlZGljYXRlZCBjaGFubmVsIGZvciBmYXN0IEFQSSAqLworCXJjID0gYmNtdHJfc3dxX3NlbmQoZGV2aWNlLCBVUkdFTlRfQ0hBTk5FTCwgYnVmKTsKKworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiYmNtdHJfcGNpZV9zZW5kIGZhaWxlZC4gRXJyb3IgJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIC8qIGJ1ZmZlciB3aWxsIGJlIGZyZWVkIGF1dG9tYXRpY2FsbHkgb25jZSBpdCBpcyB0cmFuc21pdHRlZCAqLworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBSWCBjYWxsYmFjayB0byBoYW5kbGUgbWVzc2FnZXMgZnJvbSBlbWJlZGRlZCAtPiBob3N0ICovCit2b2lkIGJjbW9sdF9jb29wX2RiYV9yeChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKnN5c2IsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCwgdm9pZCAqZGF0YSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtX2NvbW1vbl9mYXN0X2dldF9zdGF0c19pbmQgKm1zZ19wOworCisgICAgdW5zaWduZWQgY2hhciAqYnVmX2RhdGEgPSBiY21vc19idWZfZGF0YShzeXNiKTsKKyAgICB1aW50MzJfdCBpOworCisgICAgLyogY2FsbGluZyBob3N0IGFwcGxpY2F0aW9uIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgc3RhdGlzdGljcyBtZXNzYWdlIGZyb20gdGhlIGVtYmVkZGVkICovCisKKyAgICAvKiB0aGUgaG9zdCBpcyBleHBlY3RpbmcgYSBtZXNzYWdlIG9mIHR5cGU6CisgICAgICogdHlwZWRlZiBzdHJ1Y3QKKwkJeworCQkJYmNtb2x0X3hncG9uX25pX2Zhc3RfZ2V0X3N0YXRzX2luZF9oZHIgaGRyOworCQkJYndzX2RiYV9nZXRfYWxsb2Nfc3RhdCBhbGxvY19zdGF0c19saXN0W0JDTV9DT01NT05fR1BPTl9GQVNUX0FQSV9MSVNUX1NJWkVdOworCQl9YmNtb2x0X3hncG9uX25pX2Zhc3RfZ2V0X3N0YXRzX2luZDsKKyAgICAgKi8KKworICAgIG1zZ19wID0gKGJjbV9jb21tb25fZmFzdF9nZXRfc3RhdHNfaW5kICopYnVmX2RhdGE7CisgICAgLyogRml4aW5nIGVuZGlhbm5lc3MgYW5kICBjcmVhdGluZyBhIG1lc3NhZ2UuICovCisgICAgLyogcG9uX25pIHVzIHVpbnQ4IG5vIG5lZWQgdG8gZml4IGVuZGlhbm5lc3MgKi8KKyAgICBtc2dfcC0+aGRyLmN5Y2xlX251bSA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCBtc2dfcC0+aGRyLmN5Y2xlX251bSk7CisgICAgbXNnX3AtPmhkci5hdmFpbGFibGVfYncgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgbXNnX3AtPmhkci5hdmFpbGFibGVfYncpOworICAgIG1zZ19wLT5oZHIubnVtX29mX2FsbG9jcyA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCBtc2dfcC0+aGRyLm51bV9vZl9hbGxvY3MpOworICAgIGZvciAoaSA9IDA7IGkgPCBtc2dfcC0+aGRyLm51bV9vZl9hbGxvY3M7IGkrKykKKyAgICB7CisgICAgCW1zZ19wLT5hbGxvY19zdGF0c19saXN0W2ldLmFsbG9jX2lkID0gQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShVMTYsIG1zZ19wLT5hbGxvY19zdGF0c19saXN0W2ldLmFsbG9jX2lkKTsKKyAgICAJbXNnX3AtPmFsbG9jX3N0YXRzX2xpc3RbaV0uYWxsb2NhdGVkID0gQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShVMzIsIG1zZ19wLT5hbGxvY19zdGF0c19saXN0W2ldLmFsbG9jYXRlZCk7CisgICAgCW1zZ19wLT5hbGxvY19zdGF0c19saXN0W2ldLnVzZWQgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgbXNnX3AtPmFsbG9jX3N0YXRzX2xpc3RbaV0udXNlZCk7CisgICAgCW1zZ19wLT5hbGxvY19zdGF0c19saXN0W2ldLnN0YXR1c19yZXBvcnQgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgbXNnX3AtPmFsbG9jX3N0YXRzX2xpc3RbaV0uc3RhdHVzX3JlcG9ydCk7CisgICAgfQorICAgIGlmIChob3N0X2hhbmRsZXJfYXJyYXlbZGV2aWNlXSkKKyAgICB7CisgICAgCWVyciA9IGhvc3RfaGFuZGxlcl9hcnJheVtkZXZpY2VdKGRldmljZSwgbXNnX3ApOworICAgIAlCVUdfT04oZXJyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAJYmNtb3NfZnJlZShzeXNiKTsKKyAgICB9Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9jb29wX2RiYV9pbml0KGJjbW9sdF9kZXZpZCBkZXZpZCwgYmNtdHJtdXhfY2hhbm5lbCAqY2hhbm5lbCwgZl9iY210cl9yeF9oYW5kbGVyIHJ4X2hhbmRsZXIsIHZvaWQgKmRhdGEpCit7CisJYmNtb3NfZXJybm8gcmM7CisKKwlyYyA9IGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIoZGV2aWQsIGNoYW5uZWwsIHJ4X2hhbmRsZXIsIGRhdGEpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogY2FuJ3QgcmVnaXN0ZXIgY2hhbm5lbCAlZCBmb3IgZGV2aWNlICV1LiByYz0lZFxuIiwgX19GVU5DVElPTl9fLCAqY2hhbm5lbCwgZGV2aWQsIChpbnQpcmMpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCXJjID0gYmNtdHJfc3dxX3R4X3F1ZXVlX2NmZyhkZXZpZCwgQkNNVFJfUENJRV9QUlRZX05PUk1BTCwgQkNNT0xUX0NPT1BfREJBX0hBUkRRX1NJWkUsIEJDTU9MVF9DT09QX0RCQV9TT0ZUUV9TSVpFKTsKKwlpZiAocmMgIT0gQkNNX0VSUl9PSykKKwl7CisJCWJjbW9zX3ByaW50ZigiJXM6IGNhbid0IGNvbmZpZ3VyZSB0eCBxdWV1ZSBjaGFubmVsICVkIGZvciBkZXZpY2UgJXUuIHJjPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldmlkLCAoaW50KXJjKTsKKwkJZ290byBleGl0OworCisJfQorCXJldHVybiByYzsKKworZXhpdDoKKwliY21vbHRfY29vcF9kYmFfZXhpdChkZXZpZCwgKmNoYW5uZWwpOworCXJldHVybiByYzsKK30KKwordm9pZCBiY21vbHRfY29vcF9kYmFfZXhpdChiY21vbHRfZGV2aWQgZGV2aWQsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCkKK3sKKwliY210cm11eF9jaGFubmVsX3VucmVnaXN0ZXIoZGV2aWQsIGNoYW5uZWwpOworfQorCit2b2lkIGJjbW9sdF9jb29wX2RiYV9ob3N0X2hhbmRsZXJfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmlkLCBiY21vbHRfY29vcF9kYmFfaG9zdF9oYW5kbGVyX2NiIGhvc3RfaGFuZGxlcikKK3sKKwlob3N0X2hhbmRsZXJfYXJyYXlbZGV2aWRdID0gaG9zdF9oYW5kbGVyOworfQorCit2b2lkIGJjbW9sdF9jb29wX2RiYV9ob3N0X2hhbmRsZXJfdW5yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWQpCit7CisJaG9zdF9oYW5kbGVyX2FycmF5W2RldmlkXSA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29vcF9kYmEvYmNtb2x0X2Nvb3BfZGJhLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29vcF9kYmEvYmNtb2x0X2Nvb3BfZGJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjYTRlYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9jb29wX2RiYS9iY21vbHRfY29vcF9kYmEuaApAQCAtMCwwICsxLDQ5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfQ09PUF9EQkFfSF8KKyNkZWZpbmUgX0JDTU9MVF9DT09QX0RCQV9IXworCisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbV9jb21tb25fZ3Bvbl9mYXN0Lmg+CisjaW5jbHVkZSA8YmNtb2x0X3RyX211eC5oPgorCisjZGVmaW5lIEJDTU9MVF9DT09QX0RCQV9IQVJEUV9TSVpFIDQKKyNkZWZpbmUgQkNNT0xUX0NPT1BfREJBX1NPRlRRX1NJWkUgMAorCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtb2x0X2Nvb3BfZGJhX2hvc3RfaGFuZGxlcl9jYikoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtX2NvbW1vbl9mYXN0X2dldF9zdGF0c19pbmQgKmRhdGEpOworCitiY21vc19lcnJubyBiY21vbHRfZmFzdF9vcGVyX3NldF9hbGxvY3MoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDhfdCBwb25fbmksIGJjbV9jb21tb25fZmFzdF9zZXRfYWxsb2NzX21zZyAqbXNnKTsKK2JjbW9zX2Vycm5vIGJjbW9sdF9mYXN0X29wZXJfc2V0X2FjY2Vzc2VzKGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQ4X3QgcG9uX25pLCBiY21fY29tbW9uX2Zhc3Rfc2V0X2FjY2Vzc2VzX21zZyAqbXNnKTsKK3ZvaWQgYmNtb2x0X2Nvb3BfZGJhX2V4aXQoYmNtb2x0X2RldmlkIGRldmlkLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwpOworYmNtb3NfZXJybm8gYmNtb2x0X2Nvb3BfZGJhX2luaXQoYmNtb2x0X2RldmlkIGRldmlkLCBiY210cm11eF9jaGFubmVsICpjaGFubmVsLCBmX2JjbXRyX3J4X2hhbmRsZXIgcnhfaGFuZGxlciwgdm9pZCAqZGF0YSk7Cit2b2lkIGJjbW9sdF9jb29wX2RiYV9ob3N0X2hhbmRsZXJfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmlkLCBiY21vbHRfY29vcF9kYmFfaG9zdF9oYW5kbGVyX2NiIGhvc3RfaGFuZGxlcik7Cit2b2lkIGJjbW9sdF9jb29wX2RiYV9ob3N0X2hhbmRsZXJfdW5yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWQpOwordm9pZCBiY21vbHRfY29vcF9kYmFfcngoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfYnVmICpzeXNiLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIHZvaWQgKmRhdGEpOworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGVidWcvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGVidWcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2ZTNlNgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZWJ1Zy9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjIENvbW1vbiBkZWJ1ZyBBUEkKKyMKK01PRF9OQU1FID0gZGVidWdfY29tbW9uCitNT0RfREVQUyA9IG9zIGRldl9sb2cgdXRpbHMgbW9kZWwgdHJhbnNwb3J0IGNvbW1vbl9hcGkKK01PRF9UWVBFID0gbGliCisKK3NyY3MgPSBiY21vbHRfZGVidWdfYXBpX2NvbW1vbi5jCisKK1VTRV9MSU5UPXllcworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGVidWcvYmNtb2x0X2RlYnVnX2FwaV9jb21tb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZWJ1Zy9iY21vbHRfZGVidWdfYXBpX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjZiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGVidWcvYmNtb2x0X2RlYnVnX2FwaV9jb21tb24uYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgImJjbW9sdF9tYXRoLmgiCisjaW5jbHVkZSAiYmNtdHJfZGVidWcuaCIKKyNpbmNsdWRlICJiY21vbHRfbXNnLmgiCisjaW5jbHVkZSAiYmNtb2x0X2RlYnVnX2FwaV9jb21tb24uaCIKKworI2RlZmluZSBBUElfQ0ZHX1BST1BfRVhJU1RTKG1hc2ssIHByb3ApICAoKChtYXNrKSAmICgxVUxMIDw8IChwcm9wKSkpICE9IDApCisKK3N0YXRpYyB2b2lkIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NhcHR1cmVfc3RhdHNfdXBkYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZWJ1Z19hcGlfZGIgKmRiKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY210cl9jYXB0dXJlX2luZm8gaW5mbzsKKworICAgIGVyciA9IGJjbXRyX2NhcHR1cmVfaW5mb19nZXQoZGV2aWNlLCAmaW5mbyk7CisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gZXJyKTsKKworICAgIGRiLT5jZmcuYXBpX2NhcHR1cmVfc3RhdHMuYnVmZmVyX3VzZWRfYnl0ZXMgPSBpbmZvLnVzZWQ7CisgICAgZGItPmNmZy5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfcmVjb3JkZWQgPSBpbmZvLm1zZ3M7CisgICAgZGItPmNmZy5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfZHJvcHBlZCA9IGluZm8ubG9zdDsKKyAgICBkYi0+Y2ZnLmFwaV9jYXB0dXJlX3N0YXRzLmJ1ZmZlcl93cmFwX2NvdW50ID0gaW5mby53YTsKKworICAgIGVyciA9IGJjbXRyX2NhcHR1cmVfc2l6ZV9nZXQoZGV2aWNlLCAmZGItPmNmZy5hcGlfY2FwdHVyZV9zdGF0cy5yZWFkYWJsZV9ieXRlcyk7CisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gZXJyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NhcHR1cmVfaW5pdChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGVidWdfYXBpX2RiICpkYikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtdHJfY2FwdHVyZV9wYXJtIGNhcF9wYXJtID0ge307CisKKyAgICBjYXBfcGFybS5zaXplID0gZGItPmNmZy5hcGlfY2FwdHVyZV9jZmcuYnVmZmVyX3NpemVfYnl0ZXM7CisgICAgY2FwX3Bhcm0ucHRyID0gZGItPmNhcHR1cmVfYnVmZmVyOworICAgIGNhcF9wYXJtLnN0b3Bfb25fZnVsbCA9IGRiLT5jZmcuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9tb2RlID09IEJDTU9MVF9BUElfQ0FQVFVSRV9CVUZGRVJfTU9ERV9PVkVSRkxPVzsKKyAgICBjYXBfcGFybS5hY3RpdmF0ZSA9IEJDTU9TX0ZBTFNFOworCisgICAgZXJyID0gYmNtdHJfY2FwdHVyZV9pbml0KGRldmljZSwgJmNhcF9wYXJtKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisKKyAgICBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9jYXB0dXJlX3N0YXRzX3VwZGF0ZShkZXZpY2UsIGRiKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgYmNtb2x0X2RlYnVnX2FwaV9kYiAqZGIpCit7CisgICAgaWYgKEFQSV9DRkdfUFJPUF9FWElTVFMobXNnLT5wcmVzZW5jZV9tYXNrLCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUikpCisgICAgeworICAgICAgICB1aW50MzJfdCB0b19yZWFkID0gMDsKKworICAgICAgICBpZiAoYmNtdHJfY2FwdHVyZV9pc19hY3RpdmUoZGV2aWNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgY2FwdHVyZSBidWZmZXIgd2hpbGUgY2FwdHVyZSBpcyBpbiBwcm9ncmVzcyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQub2Zmc2V0IDwgZGItPmNmZy5hcGlfY2FwdHVyZV9zdGF0cy5yZWFkYWJsZV9ieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgdG9fcmVhZCA9IE1JTigKKyAgICAgICAgICAgICAgICBkYi0+Y2ZnLmFwaV9jYXB0dXJlX2J1ZmZlci5sZW4sCisgICAgICAgICAgICAgICAgZGItPmNmZy5hcGlfY2FwdHVyZV9zdGF0cy5yZWFkYWJsZV9ieXRlcyAtIGRiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQub2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyLnZhbCAhPSBOVUxMKSAmJiAoZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIubGVuID4gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRyX2NhcHR1cmVfcmVhZCgKKyAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIudmFsLAorICAgICAgICAgICAgICAgIGRiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQub2Zmc2V0LAorICAgICAgICAgICAgICAgICZ0b19yZWFkKTsKKyAgICAgICAgICAgIG1lbXNldChkYi0+Y2ZnLmFwaV9jYXB0dXJlX2J1ZmZlci52YWwgKyAoZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIubGVuIC0gdG9fcmVhZCksIDAsIHRvX3JlYWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2RlYnVnX3RyYW5zX2hhbmRsZSAqYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2ZnX3RyYW5zX3N0YXJ0KGJjbW9sdF9kZWJ1Z19hcGlfZGIgKmRiKQoreworICAgIGRlYnVnX3RyYW5zX2hhbmRsZSAqaGFuZGxlID0gYmNtb3NfY2FsbG9jKHNpemVvZigqaGFuZGxlKSk7CisgICAgaGFuZGxlLT5vbGRfZGIgPSAqZGI7CisgICAgaGFuZGxlLT5uZXdfZGIgPSBkYjsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCit2b2lkIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NmZ190cmFuc19mYWlsKGJjbW9sdF9kZWJ1Z19hcGlfZGIgKmRiLCBkZWJ1Z190cmFuc19oYW5kbGUgKmhhbmRsZSkKK3sKKyAgICBpZiAoaGFuZGxlLT5vbGRfZGIuY2FwdHVyZV9idWZmZXIgIT0gaGFuZGxlLT5uZXdfZGItPmNhcHR1cmVfYnVmZmVyKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShoYW5kbGUtPm5ld19kYi0+Y2FwdHVyZV9idWZmZXIpOworICAgIH0KKyAgICBpZiAoaGFuZGxlLT5vbGRfZGIuY2ZnLmFwaV9jYXB0dXJlX2J1ZmZlci52YWwgIT0gaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIudmFsKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShoYW5kbGUtPm5ld19kYi0+Y2ZnLmFwaV9jYXB0dXJlX2J1ZmZlci52YWwpOworICAgIH0KKyAgICAqZGIgPSBoYW5kbGUtPm9sZF9kYjsKKyAgICBiY21vc19mcmVlKGhhbmRsZSk7Cit9CisKK3ZvaWQgYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2ZnX3RyYW5zX3N1Y2NlZWQoYmNtb2x0X2RldmlkIGRldmljZSwgZGVidWdfdHJhbnNfaGFuZGxlICpoYW5kbGUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKGhhbmRsZS0+b2xkX2RiLmNhcHR1cmVfYnVmZmVyICE9IGhhbmRsZS0+bmV3X2RiLT5jYXB0dXJlX2J1ZmZlcikKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoaGFuZGxlLT5vbGRfZGIuY2FwdHVyZV9idWZmZXIpOworICAgICAgICBiY210cl9jYXB0dXJlX2Rlc3Ryb3koZGV2aWNlKTsKKyAgICAgICAgZXJyID0gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2FwdHVyZV9pbml0KGRldmljZSwgaGFuZGxlLT5uZXdfZGIpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpIC8qIGNmZ19zZXQgc2hvdWxkIGhhdmUgdmFsaWRhdGVkIHRoYXQgdGhpcyB3b24ndCBmYWlsICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FwdHVyZSBpbml0IGZhaWxlZCAoJXMpIVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhbmRsZS0+b2xkX2RiLmNmZy5hcGlfY2FwdHVyZV9idWZmZXIudmFsICE9IGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyLnZhbCkKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoaGFuZGxlLT5vbGRfZGIuY2ZnLmFwaV9jYXB0dXJlX2J1ZmZlci52YWwpOworICAgIH0KKyAgICBiY21vc19mcmVlKGhhbmRsZSk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX3NldCgKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGJjbW9sdF9tc2cgKm1zZywKKyAgICBjb25zdCBiY21vbHRfZGVidWdfY2ZnX2RhdGEgKmRhdGEsCisgICAgZGVidWdfdHJhbnNfaGFuZGxlICpoYW5kbGUsCisgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIGxvY2FsKQoreworICAgIGlmIChBUElfQ0ZHX1BST1BfRVhJU1RTKG1zZy0+cHJlc2VuY2VfbWFzaywgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcpKQorICAgIHsKKyAgICAgICAgaWYgKGJjbXRyX2NhcHR1cmVfaXNfYWN0aXZlKGRldmljZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgICAgIEJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcsCisgICAgICAgICAgICAgICAgIkNhbm5vdCBjaGFuZ2UgY2FwdHVyZSBjb25maWd1cmF0aW9uIHdoaWxlIGNhcHR1cmUgaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGUtPm5ld19kYi0+Y2ZnLmFwaV9jYXB0dXJlX2NmZyA9IGRhdGEtPmFwaV9jYXB0dXJlX2NmZzsKKyAgICB9CisKKyAgICBpZiAoQVBJX0NGR19QUk9QX0VYSVNUUyhtc2ctPnByZXNlbmNlX21hc2ssIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQpKQorICAgIHsKKyAgICAgICAgaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZCA9IGRhdGEtPmFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkOworICAgIH0KKworICAgIC8qIE9uY2UgYWxsIHRoZSBwcm9wZXJ0aWVzIGFyZSBoYW5kbGVkLCB3ZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBhIGZldyB0aGluZ3MgdGhhdCBjb3VsZCBkZXBlbmQgb24gbXVsdGlwbGUKKyAgICAgICBwcm9wZXJ0aWVzICovCisgICAgaWYgKChoYW5kbGUtPm5ld19kYi0+Y2ZnLmFwaV9jYXB0dXJlX2NmZy5sb2NhdGlvbiA9PSBsb2NhbCkgJiYKKyAgICAgICAgLyogSWYgd2UganVzdCBzd2l0Y2hlZCB0byB0aGUgZGV2aWNlIC4uLiAqLworICAgICAgICAoKGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uICE9IGhhbmRsZS0+b2xkX2RiLmNmZy5hcGlfY2FwdHVyZV9jZmcubG9jYXRpb24pIHx8CisgICAgICAgICAvKiAuLi4gb3IgZWl0aGVyIHRoZSBidWZmZXIgc2l6ZSAuLi4gKi8KKyAgICAgICAgKGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzICE9CisgICAgICAgICBoYW5kbGUtPm9sZF9kYi5jZmcuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzKSB8fAorICAgICAgICAgLyogLi4uIG9yIHRoZSBidWZmZXIgbW9kZSBoYXZlIGNoYW5nZWQgKi8KKyAgICAgICAgKGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9tb2RlICE9IGhhbmRsZS0+b2xkX2RiLmNmZy5hcGlfY2FwdHVyZV9jZmcuYnVmZmVyX21vZGUpKSkKKyAgICB7CisgICAgICAgIGhhbmRsZS0+bmV3X2RiLT5jYXB0dXJlX2J1ZmZlciA9IGJjbW9zX2FsbG9jKGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzKTsKKyAgICAgICAgaWYgKGhhbmRsZS0+bmV3X2RiLT5jYXB0dXJlX2J1ZmZlciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgICAgICBCQ01fRVJSX05PTUVNLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQsCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgY2FwdHVyZSBidWZmZXIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9jZmcubG9jYXRpb24gPT0gbG9jYWwpICYmCisgICAgICAgIC8qIElmIHdlIGp1c3Qgc3dpdGNoZWQgdG8gdGhlIGRldmljZSAuLi4gKi8KKyAgICAgICAgKChoYW5kbGUtPm5ld19kYi0+Y2ZnLmFwaV9jYXB0dXJlX2NmZy5sb2NhdGlvbiAhPSBoYW5kbGUtPm9sZF9kYi5jZmcuYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uKSB8fAorICAgICAgICAgLyogLi4uIG9yIHRoZSByZWFkIHNpemUgaGFzIGNoYW5nZWQgKi8KKyAgICAgICAgKGhhbmRsZS0+b2xkX2RiLmNmZy5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5zaXplICE9IGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQuc2l6ZSkpKQorICAgIHsKKyAgICAgICAgaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIubGVuID0gaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5zaXplOworICAgICAgICBpZiAoaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIubGVuICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyLnZhbCA9IGJjbW9zX2FsbG9jKGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQuc2l6ZSk7CisgICAgICAgICAgICBpZiAoaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIudmFsID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgICAgICAgICAgQkNNX0VSUl9OT01FTSwKKyAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgcmVhZCBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyLnZhbCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fb3Blcl9zdGFydF9hcGlfY2FwdHVyZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbXRyX2NsZF9maWx0ZXIgZmlsdGVyOworCisgICAgaWYgKGJjbXRyX2NhcHR1cmVfaXNfYWN0aXZlKGRldmljZSkpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX0FMUkVBRFksCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiQ2FwdHVyZSBhbHJlYWR5IGluIHByb2dyZXNzIik7CisgICAgfQorCisgICAgLyogY2FwdHVyZSBldmVyeXRoaW5nICovCisgICAgZmlsdGVyLm9iamVjdCA9IEJDTU9MVF9PQkpFQ1RfQU5ZOworICAgIGZpbHRlci5ncm91cCA9IEJDTU9MVF9NR1RfR1JPVVBfQU5ZOworICAgIGZpbHRlci5zdWJncm91cCA9IEJDTU9MVF9TVUJHUk9VUF9BTlk7CisgICAgZXJyID0gYmNtdHJfY2xkX2xldmVsX3NldChkZXZpY2UsICZmaWx0ZXIsIEJDTVRSX0NMRF9DQVBUVVJFKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgLyogZm9yIG5vdyBmaWx0ZXIgb3V0IHN0YXJ0L3N0b3Agb3BlcmF0aW9ucyBhbmQga2VlcC1hbGl2ZXMgKi8KKyAgICBmaWx0ZXIub2JqZWN0ID0gQkNNT0xUX09CSl9JRF9ERUJVRzsKKyAgICBmaWx0ZXIuZ3JvdXAgPSBCQ01PTFRfTUdUX0dST1VQX09QRVI7CisgICAgZmlsdGVyLnN1Ymdyb3VwID0gQkNNT0xUX0RFQlVHX09QRVJfSURfU1RBUlRfQVBJX0NBUFRVUkU7IC8qbGludCAhZTYzMyAqLworICAgIGVyciA9IGJjbXRyX2NsZF9sZXZlbF9zZXQoZGV2aWNlLCAmZmlsdGVyLCBCQ01UUl9DTERfTk9ORSk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworICAgIGZpbHRlci5zdWJncm91cCA9IEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkU7ICAvKmxpbnQgIWU2MzMgKi8KKyAgICBlcnIgPSBiY210cl9jbGRfbGV2ZWxfc2V0KGRldmljZSwgJmZpbHRlciwgQkNNVFJfQ0xEX05PTkUpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBmaWx0ZXIub2JqZWN0ID0gQkNNT0xUX09CSl9JRF9ERVZJQ0U7CisgICAgZmlsdGVyLmdyb3VwID0gQkNNT0xUX01HVF9HUk9VUF9PUEVSOworICAgIGZpbHRlci5zdWJncm91cCA9IEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkU7ICAvKmxpbnQgIWU2MzMgKi8KKyAgICBlcnIgPSBiY210cl9jbGRfbGV2ZWxfc2V0KGRldmljZSwgJmZpbHRlciwgQkNNVFJfQ0xEX05PTkUpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBmaWx0ZXIuZ3JvdXAgPSBCQ01PTFRfTUdUX0dST1VQX0FVVE87CisgICAgZmlsdGVyLnN1Ymdyb3VwID0gQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RFVklDRV9LRUVQX0FMSVZFOyAgLypsaW50ICFlNjMzICovCisgICAgZXJyID0gYmNtdHJfY2xkX2xldmVsX3NldChkZXZpY2UsICZmaWx0ZXIsIEJDTVRSX0NMRF9OT05FKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisKKyAgICByZXR1cm4gYmNtdHJfY2FwdHVyZV9zdGFydF9zdG9wKGRldmljZSwgQkNNT1NfVFJVRSk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX29wZXJfc3RvcF9hcGlfY2FwdHVyZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2csIGJjbW9sdF9kZWJ1Z19hcGlfZGIgKmRiKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGlmICghYmNtdHJfY2FwdHVyZV9pc19hY3RpdmUoZGV2aWNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfQUxSRUFEWSwKKyAgICAgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgICAgICJObyBjYXB0dXJlIGluIHByb2dyZXNzIik7CisgICAgfQorCisgICAgZXJyID0gYmNtdHJfY2FwdHVyZV9zdGFydF9zdG9wKGRldmljZSwgQkNNT1NfRkFMU0UpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKworICAgIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NhcHR1cmVfc3RhdHNfdXBkYXRlKGRldmljZSwgZGIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX29wZXJfcmVzZXRfYXBpX2NhcHR1cmUoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfZGVidWdfYXBpX2RiICpkYikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBpZiAoYmNtdHJfY2FwdHVyZV9pc19hY3RpdmUoZGV2aWNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiQ2Fubm90IHJlc2V0IGNhcHR1cmUgd2hpbGUgY2FwdHVyZSBpcyBydW5uaW5nIik7CisgICAgfQorCisgICAgYmNtdHJfY2FwdHVyZV9kZXN0cm95KGRldmljZSk7CisgICAgZXJyID0gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2FwdHVyZV9pbml0KGRldmljZSwgZGIpOworCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9pbml0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZWJ1Z19hcGlfZGIgKmRiKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworI2lmIEVOQUJMRV9MT0cKKyAgICBkYi0+bG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoIm1oX2RlYnVnIiwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisjZW5kaWYKKworICAgIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9zZXRfZGVmYXVsdCgmZGItPmNmZywgQkNNT0xUX1BSRVNFTkNFX01BU0tfQUxMKTsKKyAgICBkYi0+Y2FwdHVyZV9idWZmZXIgPSBiY21vc19hbGxvYyhkYi0+Y2ZnLmFwaV9jYXB0dXJlX2NmZy5idWZmZXJfc2l6ZV9ieXRlcyk7CisgICAgZXJyID0gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2FwdHVyZV9pbml0KGRldmljZSwgZGIpOworICAgIEJVR19PTihCQ01fRVJSX09LICE9IGVycik7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZWJ1Zy9iY21vbHRfZGVidWdfYXBpX2NvbW1vbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2RlYnVnL2JjbW9sdF9kZWJ1Z19hcGlfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmMjhhYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZWJ1Zy9iY21vbHRfZGVidWdfYXBpX2NvbW1vbi5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX0RFQlVHX0FQSV9DT01NT05fSF8KKyNkZWZpbmUgQkNNT0xUX0RFQlVHX0FQSV9DT01NT05fSF8KKworI2luY2x1ZGUgImJjbW9sdF9tb2RlbF90eXBlcy5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X2RlYnVnX2NmZ19kYXRhIGNmZzsKKyAgICB1aW50OF90ICpjYXB0dXJlX2J1ZmZlcjsKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKK30gYmNtb2x0X2RlYnVnX2FwaV9kYjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZGVidWdfYXBpX2RiIG9sZF9kYjsKKyAgICBiY21vbHRfZGVidWdfYXBpX2RiICpuZXdfZGI7Cit9IGRlYnVnX3RyYW5zX2hhbmRsZTsKKworYmNtb3NfZXJybm8gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgYmNtb2x0X2RlYnVnX2FwaV9kYiAqZGIpOworCitkZWJ1Z190cmFuc19oYW5kbGUgKmJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NmZ190cmFuc19zdGFydChiY21vbHRfZGVidWdfYXBpX2RiICpkYik7CisKK3ZvaWQgYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2ZnX3RyYW5zX2ZhaWwoYmNtb2x0X2RlYnVnX2FwaV9kYiAqZGIsIGRlYnVnX3RyYW5zX2hhbmRsZSAqaGFuZGxlKTsKKwordm9pZCBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9jZmdfdHJhbnNfc3VjY2VlZChiY21vbHRfZGV2aWQgZGV2aWNlLCBkZWJ1Z190cmFuc19oYW5kbGUgKmhhbmRsZSk7CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX3NldCgKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGJjbW9sdF9tc2cgKm1zZywKKyAgICBjb25zdCBiY21vbHRfZGVidWdfY2ZnX2RhdGEgKmRhdGEsCisgICAgZGVidWdfdHJhbnNfaGFuZGxlICpoYW5kbGUsCisgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIGxvY2FsKTsKKworYmNtb3NfZXJybm8gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fb3Blcl9zdGFydF9hcGlfY2FwdHVyZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2cpOworCitiY21vc19lcnJubyBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9vcGVyX3N0b3BfYXBpX2NhcHR1cmUoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfZGVidWdfYXBpX2RiICpkYik7CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX29wZXJfcmVzZXRfYXBpX2NhcHR1cmUoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfZGVidWdfYXBpX2RiICpkYik7CisKK3ZvaWQgYmNtb2x0X2RlYnVnX2FwaV9jb21tb25faW5pdChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGVidWdfYXBpX2RiICpkYik7CisKKyNlbmRpZiAvKiBCQ01PTFRfREVCVUdfQVBJX0NPTU1PTl9IXyAqLworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmMTQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybC9NYWtlZmlsZQpAQCAtMCwwICsxLDI0IEBACisjIERldmljZSBjb250cm9sIGRyaXZlcgorTU9EX05BTUUgPSBkZXZfY3RybAorTU9EX0RFUFMgPSB0cm11eCBrZWVwX2FsaXZlIGZsZCBsbF9wY2llIGRlYnVnX2NvbW1vbgorTU9EX0lOQ19ESVJTID0gJChTUkNfRElSKQorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfSU5DX0RJUlMgKz0gaG9zdF9kcml2ZXIvc3dfdmVyc2lvbiBob3N0X2RyaXZlci9zd19lcnJvciBob3N0X2RyaXZlci9taF91dGlscworZWxzZQorICAgIE1PRF9JTkNfRElSUyArPSBob3N0L3N3X3ZlcnNpb24gJChUT1BfRElSKS9jb21tb24vc3dfZXJyb3IgJChUT1BfRElSKS9jb21tb24vbWhfdXRpbHMKK2VuZGlmCisKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorTU9EX1RZUEUgPSBsaW51eF9saWIKK2Vsc2UKK01PRF9UWVBFID0gbGliCitlbmRpZgorCitzcmNzID0gYmNtb2x0X2Rldl9jdHJsLmMgYmNtb2x0X2RlYnVnX2N0cmwuYworCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybC9iY21vbHRfZGVidWdfY3RybC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsL2JjbW9sdF9kZWJ1Z19jdHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3NjRjYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybC9iY21vbHRfZGVidWdfY3RybC5jCkBAIC0wLDAgKzEsNDY5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjZGVmaW5lIEhPU1RfQVBJX0NBUFRVUkUgMAorCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb2x0X2FwaS5oIgorI2luY2x1ZGUgImJjbW9sdF9tc2cuaCIKKyNpbmNsdWRlICJiY21vbHRfdHJfbXV4LmgiCisjaWYgSE9TVF9BUElfQ0FQVFVSRQorI2luY2x1ZGUgImJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uLmgiCisjZW5kaWYKKyNpbmNsdWRlICJiY21vbHRfZGV2X2N0cmwuaCIKKyNpbmNsdWRlICJiY21vbHRfZGVidWdfY3RybC5oIgorCisjZGVmaW5lIEFQSV9DQVBUVVJFX1BST1BfTUFTS1wKKyAgICAoKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcpIHxcCisgICAgICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMpIHxcCisgICAgICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQpIHxcCisgICAgICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19ib29sIHdhaXRpbmdfZm9yX2FjazsKKyAgICBiY21vbHRfbXNnICpsYXN0X21lc3NhZ2U7CisgICAgYmNtb3NfdGltZXIgYWNrX3RpbWVvdXQ7CisjaWYgSE9TVF9BUElfQ0FQVFVSRQorICAgIGJjbW9sdF9kZWJ1Z19hcGlfZGIgZGI7CisgICAgZGVidWdfdHJhbnNfaGFuZGxlICpoYW5kbGU7CisjZW5kaWYKK30gZGVidWdfY3RybF9jdHh0OworCitzdGF0aWMgZGVidWdfY3RybF9jdHh0IGRlYnVnX2N0cmxbQkNNVFJfTUFYX09MVFNdOworCitzdGF0aWMgdm9pZCBzZW5kX3RvX2hvc3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIG1zZy0+ZGlyID0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0U7CisgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF90b19kZXZpY2UoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGRlYnVnX2N0cmxbZGV2aWNlXS53YWl0aW5nX2Zvcl9hY2sgPSBCQ01PU19UUlVFOworICAgIGRlYnVnX2N0cmxbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPSBtc2c7CisgICAgYmNtdHJtdXhfY29udHJvbF90b19saW5lKGRldmljZSwgbXNnKTsKKyAgICBiY21vc190aW1lcl9zdGFydCgmZGVidWdfY3RybFtkZXZpY2VdLmFja190aW1lb3V0LCBERVZJQ0VfUkVTUE9OU0VfVElNRU9VVF9MRU5HVEgpOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY3RybF9jZmdfcmVxdWlyZXNfY29ubmVjdGlvbihiY21vbHRfbXNnICptc2csIGNvbnN0IGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSAqY2ZnKQoreworICAgIHJldHVybiAoKChtc2ctPnByZXNlbmNlX21hc2sgJiB+QVBJX0NBUFRVUkVfUFJPUF9NQVNLKSAhPSAwKSB8fCAvKiBpbmNsdWRlcyBub24tQVBJIGNhcHR1cmUgZWxlbWVudHMsIG9yIC4uLiAqLworICAgICAgICAgICAgKCgobXNnLT5wcmVzZW5jZV9tYXNrICYgQVBJX0NBUFRVUkVfUFJPUF9NQVNLKSAhPSAwKSAmJiAvKiBpbmNsdWRlcyBBUEkgY2FwdHVlIGVsZW1lbnRzIGFuZCAuLi4gKi8KKyAgICAgICAgICAgICAoY2ZnLT5hcGlfY2FwdHVyZV9jZmcubG9jYXRpb24gPT0gQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX0RFVklDRSkpKTsgLyogY2FwdHVyZSBsb2NhdGlvbiBpcyBkZXZpY2UgKi8KK30KKworc3RhdGljIHZvaWQgYmNtb2x0X2RlYnVnX2N0cmxfc2VuZF9jZmdfZ2V0X3Jlc3BvbnNlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyNpZiBIT1NUX0FQSV9DQVBUVVJFCisgICAgaWYgKGRlYnVnX2N0cmxbZGV2aWNlXS5kYi5jZmcuYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uID09IEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9IT1NUKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fZ2V0KGRldmljZSwgbXNnLCAmZGVidWdfY3RybFtkZXZpY2VdLmRiKTsKKyAgICB9CisjZW5kaWYKKyAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2csIGJjbW9zX2Jvb2wgY29ubmVjdGVkKQoreworI2lmIEhPU1RfQVBJX0NBUFRVUkUKKyAgICBpZiAoYmNtb2x0X2RlYnVnX2N0cmxfY2ZnX3JlcXVpcmVzX2Nvbm5lY3Rpb24obXNnLCAmZGVidWdfY3RybFtkZXZpY2VdLmRiLmNmZykpCisjZW5kaWYKKyAgICB7CisgICAgICAgIGlmIChjb25uZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbmRfdG9fZGV2aWNlKGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9OT1RfQ09OTkVDVEVELAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkNhbm5vdCBhY2Nlc3MgZW1iZWRkZWQgcGFyYW1ldGVycyB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICB9CisKKyAgICBiY21vbHRfZGVidWdfY3RybF9zZW5kX2NmZ19nZXRfcmVzcG9uc2UoZGV2aWNlLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBiY21vbHRfZGVidWdfY3RybF9zZW5kX2NmZ19zZXRfcmVzcG9uc2UoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworI2lmIEhPU1RfQVBJX0NBUFRVUkUKKyAgICBpZiAobXNnLT5lcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NmZ190cmFuc19zdWNjZWVkKGRldmljZSwgZGVidWdfY3RybFtkZXZpY2VdLmhhbmRsZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NmZ190cmFuc19mYWlsKCZkZWJ1Z19jdHJsW2RldmljZV0uZGIsIGRlYnVnX2N0cmxbZGV2aWNlXS5oYW5kbGUpOworICAgIH0KKyNlbmRpZgorCisgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgYmNtb2x0X2RlYnVnX2N0cmxfaGFuZGxlX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCkKK3sKKyAgICBiY21vbHRfZGVidWdfY2ZnICpjZmcgPSAoYmNtb2x0X2RlYnVnX2NmZyopbXNnOworICAgIGJjbW9sdF9kZWJ1Z19jZmdfaWQgcHJvcF9pZDsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBpZiAoIWJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9ib3VuZHNfY2hlY2soJmNmZy0+ZGF0YSwgbXNnLT5wcmVzZW5jZV9tYXNrLCAmcHJvcF9pZCkpCisgICAgeworICAgICAgICBlcnIgPSBCQ01fRVJSX1JBTkdFOworICAgICAgICBtc2ctPmVycl9maWVsZF9pZHggPSAodWludDE2X3QpcHJvcF9pZDsKKyAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIEhPU1RfQVBJX0NBUFRVUkUKKyAgICBkZWJ1Z19jdHJsW2RldmljZV0uaGFuZGxlID0gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2ZnX3RyYW5zX3N0YXJ0KCZkZWJ1Z19jdHJsW2RldmljZV0uZGIpOworICAgIGVyciA9IGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX3NldChkZXZpY2UsIG1zZywgJmNmZy0+ZGF0YSwgZGVidWdfY3RybFtkZXZpY2VdLmhhbmRsZSwgQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX0hPU1QpOworI2Vsc2UKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9jZmcpICYmCisgICAgICAgIChjZmctPmRhdGEuYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uID09IEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9IT1NUKSkKKyAgICB7CisgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkhvc3QgQVBJIGNhcHR1cmUgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9PSzsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBpZiAoYmNtb2x0X2RlYnVnX2N0cmxfY2ZnX3JlcXVpcmVzX2Nvbm5lY3Rpb24obXNnLCAmY2ZnLT5kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbm5lY3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZW5kX3RvX2RldmljZShkZXZpY2UsIG1zZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgICAgIEJDTV9FUlJfTk9UX0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAgICAgIkNhbm5vdCBhY2Nlc3MgZW1iZWRkZWQgcGFyYW1ldGVycyB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9sdF9kZWJ1Z19jdHJsX3NlbmRfY2ZnX3NldF9yZXNwb25zZShkZXZpY2UsIG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCkKK3sKKyNpZiBIT1NUX0FQSV9DQVBUVVJFCisgICAgYmNtb2x0X2RlYnVnX2NmZyAqY2ZnID0gKGJjbW9sdF9kZWJ1Z19jZmcqKW1zZzsKKyNlbmRpZgorICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGlmICghY29ubmVjdGVkKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX05PVF9DT05ORUNURUQsCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiQ2Fubm90IGFjY2VzcyBlbWJlZGRlZCBwYXJhbWV0ZXJzIHdoaWxlIGRpc2Nvbm5lY3RlZCIpOworICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgSE9TVF9BUElfQ0FQVFVSRQorICAgIGRlYnVnX2N0cmxbZGV2aWNlXS5oYW5kbGUgPSBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9jZmdfdHJhbnNfc3RhcnQoJmRlYnVnX2N0cmxbZGV2aWNlXS5kYik7CisgICAgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX3NldF9kZWZhdWx0KCZkZWJ1Z19jdHJsW2RldmljZV0uZGIuY2ZnLCBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEwpOworICAgIG1zZy0+cHJlc2VuY2VfbWFzayA9IEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTDsKKyAgICBlcnIgPSBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9zZXQoZGV2aWNlLCBtc2csICZjZmctPmRhdGEsIGRlYnVnX2N0cmxbZGV2aWNlXS5oYW5kbGUsIEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9IT1NUKTsKKyNlbHNlCisgICAgZXJyID0gQkNNX0VSUl9PSzsKKyNlbmRpZgorICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHNlbmRfdG9fZGV2aWNlKGRldmljZSwgbXNnKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYnVnX2N0cmxfc2VuZF9jZmdfc2V0X3Jlc3BvbnNlKGRldmljZSwgbXNnKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9jZmcoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCkKK3sKKyAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9jZmdfZ2V0KGRldmljZSwgbXNnLCBjb25uZWN0ZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9jZmdfc2V0KGRldmljZSwgbXNnLCBjb25uZWN0ZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgYmNtb2x0X2RlYnVnX2N0cmxfaGFuZGxlX2NmZ19jbGVhcihkZXZpY2UsIG1zZywgY29ubmVjdGVkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgICAgICBCQ01fRVJSX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgKCV1KSIsCisgICAgICAgICAgICAgICAgbXNnLT50eXBlKTsKKyAgICAgICAgICAgIHNlbmRfdG9faG9zdChkZXZpY2UsIG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9vcGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgYmNtb3NfYm9vbCBjb25uZWN0ZWQpCit7CisjaWYgSE9TVF9BUElfQ0FQVFVSRQorICAgIGJjbW9zX2Jvb2wgaG9zdF9hcGlfY2FwdHVyZSA9CisgICAgICAgIChkZWJ1Z19jdHJsW2RldmljZV0uZGIuY2ZnLmFwaV9jYXB0dXJlX2NmZy5sb2NhdGlvbiA9PSBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fSE9TVCk7CisKKyAgICBzd2l0Y2ggKG1zZy0+c3ViZ3JvdXApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUQVJUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgaWYgKGhvc3RfYXBpX2NhcHR1cmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXNnLT5lcnIgPSBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9vcGVyX3N0YXJ0X2FwaV9jYXB0dXJlKGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkU6CisgICAgICAgICAgICBpZiAoaG9zdF9hcGlfY2FwdHVyZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtc2ctPmVyciA9IGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX29wZXJfc3RvcF9hcGlfY2FwdHVyZShkZXZpY2UsIG1zZywgJmRlYnVnX2N0cmxbZGV2aWNlXS5kYik7CisgICAgICAgICAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9SRVNFVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgIGlmIChob3N0X2FwaV9jYXB0dXJlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zZy0+ZXJyID0gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fb3Blcl9yZXNldF9hcGlfY2FwdHVyZShkZXZpY2UsIG1zZywgJmRlYnVnX2N0cmxbZGV2aWNlXS5kYik7CisgICAgICAgICAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCFjb25uZWN0ZWQpCisgICAgeworICAgICAgICBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfTk9UX0NPTk5FQ1RFRCwKKyAgICAgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgICAgICJDYW5ub3QgcGVyZm9ybSBlbWJlZGRlZCBvcGVyYXRpb25zIHdoaWxlIGRpc2Nvbm5lY3RlZCIpOworICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2VuZF90b19kZXZpY2UoZGV2aWNlLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfYXV0b19jZmcoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCkKK3sKKyAgICBpZiAoIWNvbm5lY3RlZCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9OT1RfQ09OTkVDVEVELAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkNhbm5vdCBhY2Nlc3MgZW1iZWRkZWQgcGFyYW1ldGVycyB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNlbmRfdG9fZGV2aWNlKGRldmljZSwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgYmNtb2x0X2RlYnVnX2N0cmxfaGFuZGxlX3JlcXVlc3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCkKK3sKKyAgICBpZiAoZGVidWdfY3RybFtkZXZpY2VdLndhaXRpbmdfZm9yX2FjaykKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9UT09fTUFOWV9SRVFTLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIlRyYW5zYWN0aW9uIGluIHByb2dyZXNzIG9uIGRlYnVnIG9iamVjdCIpOworICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtc2ctPmdyb3VwKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9jZmcoZGV2aWNlLCBtc2csIGNvbm5lY3RlZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfb3BlcihkZXZpY2UsIG1zZywgY29ubmVjdGVkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfYXV0b19jZmcoZGV2aWNlLCBtc2csIGNvbm5lY3RlZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICAgICAgQkNNX0VSUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgZ3JvdXAgKCV1KSIsCisgICAgICAgICAgICAgICAgbXNnLT5ncm91cCk7CisgICAgICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfcmVzcG9uc2UoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmICghZGVidWdfY3RybFtkZXZpY2VdLndhaXRpbmdfZm9yX2FjayB8fCAobXNnLT5jb3JyX3RhZyAhPSBkZWJ1Z19jdHJsW2RldmljZV0ubGFzdF9tZXNzYWdlLT5jb3JyX3RhZykpCisgICAgeworICAgICAgICBtc2ctPnN1YmNoID0gQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX1BST1hZOworICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbXNnLT5zdWJjaCA9IGRlYnVnX2N0cmxbZGV2aWNlXS5sYXN0X21lc3NhZ2UtPnN1YmNoOworICAgIGJjbW9zX3RpbWVyX3N0b3AoJmRlYnVnX2N0cmxbZGV2aWNlXS5hY2tfdGltZW91dCk7CisgICAgZGVidWdfY3RybFtkZXZpY2VdLndhaXRpbmdfZm9yX2FjayA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9sdF9tc2dfZnJlZShkZWJ1Z19jdHJsW2RldmljZV0ubGFzdF9tZXNzYWdlKTsKKworICAgIGlmIChtc2ctPmVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobXNnLT5ncm91cCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX3NlbmRfY2ZnX2dldF9yZXNwb25zZShkZXZpY2UsIG1zZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2RlYnVnX2N0cmxfc2VuZF9jZmdfc2V0X3Jlc3BvbnNlKGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX3NlbmRfY2ZnX3NldF9yZXNwb25zZShkZXZpY2UsIG1zZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiR290IHVuZXhwZWN0ZWQgcmVzcG9uc2UgdHlwZSAoJXUpIGZyb20gZW1iZWRkZWRcbiIsIG1zZy0+Z3JvdXApOworICAgICAgICAgICAgICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJHb3QgdW5leHBlY3RlZCByZXNwb25zZSBncm91cCAoJXUpIGZyb20gZW1iZWRkZWRcbiIsIG1zZy0+Z3JvdXApOworICAgICAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9hY2tfdGltZW91dChiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClkYXRhOworCisgICAgaWYgKGRlYnVnX2N0cmxbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiV2FpdGluZyB3aXRoIG5vIG1lc3NhZ2UhXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworICAgIH0KKworICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICBkZWJ1Z19jdHJsW2RldmljZV0ubGFzdF9tZXNzYWdlLAorICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgIEJDTV9FUlJfSU5URVJOQUwsCisgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgIkRpZCBub3QgcmVjZWl2ZSByZXNwb25zZSBmcm9tIGVtYmVkZGVkIik7CisgICAgc2VuZF90b19ob3N0KGRldmljZSwgZGVidWdfY3RybCBbZGV2aWNlXS5sYXN0X21lc3NhZ2UpOworCisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworfQorCit2b2lkIGJjbW9sdF9kZWJ1Z19jdHJsX3Byb2Nlc3NfbXNnKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgYmNtb3NfYm9vbCBjb25uZWN0ZWQpCit7CisgICAgc3dpdGNoIChtc2ctPmRpcikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19ESVJfUkVRVUVTVDoKKyAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9yZXF1ZXN0KGRldmljZSwgbXNnLCBjb25uZWN0ZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19ESVJfUkVTUE9OU0U6CisgICAgICAgICAgICBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfcmVzcG9uc2UoZGV2aWNlLCBtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoIlVuc3VwcG9ydGVkIGRpcmVjdGlvbjogJXVcbiIsIG1zZy0+ZGlyKTsKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGJjbW9sdF9kZWJ1Z19jdHJsX2luaXQodm9pZCkKK3sKKyAgICBiY21vbHRfZGV2aWQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgIHsKKyAgICAgICAgYmNtb3NfdGltZXJfcGFybSB0cCA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC5uYW1lID0gImRlYnVnX2N0cmxfYWNrX3RpbWVvdXQiLAorICAgICAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX0RFVl9DVFJMX0RFVjAgKyBpLAorICAgICAgICAgICAgLnBlcmlvZGljID0gQkNNT1NfRkFMU0UsCisgICAgICAgICAgICAuaGFuZGxlciA9IGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9hY2tfdGltZW91dCwKKyAgICAgICAgICAgIC5kYXRhID0gKGxvbmcpaSwKKyAgICAgICAgICAgIC5mbGFncyA9IEJDTU9TX1RJTUVSX1BBUk1fRkxBR1NfVVJHRU5ULAorICAgICAgICB9OworCisgICAgICAgIGRlYnVnX2N0cmxbaV0ud2FpdGluZ19mb3JfYWNrID0gQkNNT1NfRkFMU0U7CisgICAgICAgIGJjbW9zX3RpbWVyX2NyZWF0ZSgmZGVidWdfY3RybFtpXS5hY2tfdGltZW91dCwgJnRwKTsKKyNpZiBIT1NUX0FQSV9DQVBUVVJFCisgICAgICAgIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2luaXQoaSwgJmRlYnVnX2N0cmxbaV0uZGIpOworI2VuZGlmCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsL2JjbW9sdF9kZWJ1Z19jdHJsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvYmNtb2x0X2RlYnVnX2N0cmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzk5MWU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsL2JjbW9sdF9kZWJ1Z19jdHJsLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0RFQlVHX0NUUkxfSF8KKyNkZWZpbmUgX0JDTU9MVF9ERUJVR19DVFJMX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbXNnLmgiCisKK3ZvaWQgYmNtb2x0X2RlYnVnX2N0cmxfcHJvY2Vzc19tc2coYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCk7CisKK3ZvaWQgYmNtb2x0X2RlYnVnX2N0cmxfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qIF9CQ01PTFRfREVCVUdfQ1RSTF9IXyAqLworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvYmNtb2x0X2Rldl9jdHJsLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvYmNtb2x0X2Rldl9jdHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkZmE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybC9iY21vbHRfZGV2X2N0cmwuYwpAQCAtMCwwICsxLDMxNTggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fY29uZmlnLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl9tdXguaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX2lkcy5oPgorI2luY2x1ZGUgPGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfcmV2aXNpb24uaD4KKyNpbmNsdWRlICJiY21vbHRfZGV2X2N0cmwuaCIKKyNpbmNsdWRlICJiY210cl9wY2llLmgiCisjaW5jbHVkZSAiYmNtb2x0X2xscGNpZS5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtb2x0X3V0aWxzLmgiCisjaW5jbHVkZSAiYmNtb2x0X2Zpcm13YXJlX2VudmVsb3BlLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZ19wYWNrLmgiCisjaW5jbHVkZSAiYmNtb2x0X21oX3V0aWxzLmgiCisjaW5jbHVkZSAiYmNtb2x0X2RlYnVnX2N0cmwuaCIKKworc3RhdGljIGJjbW9sdF9kZXZfY3RybF9wYXJhbXMgZGV2X2N0cmxfcGFyYW1zOworc3RhdGljIGRldl9jdHJsX2RhdGFiYXNlIGRldl9jdHJsX2RiW0JDTVRSX01BWF9PTFRTXTsKK3N0YXRpYyB1aW50OF90ICppbWFnZV9idWZbQkNNVFJfTUFYX09MVFNdOworc3RhdGljIHVpbnQ4X3QgKnJkX2ltYWdlX2J1ZltCQ01UUl9NQVhfT0xUU107CisKKyNkZWZpbmUgQkNNX0RFVl9DVFJMX1JFVFVSTl9PTl9FUlJPUihkZXZpY2UsIHJjLCBmbXQsIGFyZ3MuLi4pXAorICAgIGRvXAorICAgIHtcCisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKVwKKyAgICAgICAge1wKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiJXM6ICJmbXQsIGJjbW9zX3N0cmVycm9yKHJjKSwgIyMgYXJncyk7XAorICAgICAgICAgICAgcmV0dXJuIHJjO1wKKyAgICAgICAgfVwKKyAgICB9IHdoaWxlICgwKQorCisjaWZuZGVmIElOX0JBTkQKK3N0YXRpYyBiY21vc190aW1lcl9yYyBkZXZfY3RybF9ib290X3NlcV90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKTsKK3N0YXRpYyBiY21vc190aW1lcl9yYyBkZXZfY3RybF9kZHJfdGVzdF90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKTsKKyNlbmRpZgorCitjb25zdCBjaGFyICpiY21fc3RyX2RldmljZV9zdGF0ZShiY21vbHRfZGV2aWNlX3N0YXRlIGRldmljZV9zdGF0ZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RyaW5nc1tdID0KKyAgICB7CisgICAgICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRF0gPSAiRElTQ09OTkVDVEVEIiwKKyAgICAgICAgW0JDTU9MVF9ERVZJQ0VfU1RBVEVfQ09OTkVDVElOR10gPSAiQ09OTkVDVElORyIsCisgICAgICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX1JFQURZXSA9ICJSRUFEWSIsCisgICAgICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX1dBSVRJTkdfRk9SX0RFVklDRV0gPSAiV0FJVElOR19GT1JfREVWSUNFIiwKKyAgICAgICAgW0JDTU9MVF9ERVZJQ0VfU1RBVEVfX05VTV9PRl0gPSAiVU5LTk9XTiIKKyAgICB9OworICAgIHJldHVybiBzdHJpbmdzW2RldmljZV9zdGF0ZSA+IEJDTU9MVF9ERVZJQ0VfU1RBVEVfX05VTV9PRiA/IEJDTU9MVF9ERVZJQ0VfU1RBVEVfX05VTV9PRiA6IGRldmljZV9zdGF0ZV07Cit9CisKK2NvbnN0IGNoYXIgKmJjbV9zdHJfZGV2aWNlX2V2ZW50KGRldl9jdHJsX2V2ZW50IGRldmljZV9ldmVudCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RyaW5nc1tdID0KKyAgICB7CisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ0xFQVJdID0gIkRFVklDRV9DTEVBUiIsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ09ORklHX1NFVF0gPSAiREVWSUNFX0NPTkZJR19TRVQiLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NPTkZJR19HRVRdID0gIkRFVklDRV9DT05GSUdfR0VUIiwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9ESVNDT05ORUNUXSA9ICJERVZJQ0VfRElTQ09OTkVDVCIsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfVElNRVJfVElNRU9VVF0gPSAiVElNRVJfVElNRU9VVCIsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfUkVDRUlWRURfQUNLXSA9ICJSRUNFSVZFRF9BQ0siLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NPTk5FQ1RdID0gIkRFVklDRV9DT05ORUNUIiwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9SRVNFVF0gPSAiREVWSUNFX1JFU0VUIiwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0NPTk5FQ1RJT05fRkFJTFVSRV0gPSAiQ09OTkVDVElPTl9GQUlMVVJFIiwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0NPTk5FQ1RJT05fRVNUQUJMSVNIRURdID0gIkNPTk5FQ1RJT05fRVNUQUJMSVNIRUQiLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFQURZXSA9ICJERVZJQ0VfUkVBRFkiLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfUlVOX0REUl9URVNUXSA9ICJSVU5fRERSX1RFU1QiLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfRERSX1RFU1RfQ09NUExFVEVEXSA9ICJERFJfVEVTVF9DT01QTEVURUQiLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfRERSX1RFU1RfVElNRU9VVF0gPSAiRERSX1RFU1RfVElNRU9VVCIsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9fTlVNX09GXSA9ICJVTktOT1dOIgorICAgIH07CisgICAgcmV0dXJuIHN0cmluZ3NbZGV2aWNlX2V2ZW50ID4gREVWSUNFX0NPTlRST0xfRVZFTlRfX05VTV9PRiA/IERFVklDRV9DT05UUk9MX0VWRU5UX19OVU1fT0YgOiBkZXZpY2VfZXZlbnRdOworfQorCisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGNvbnN0IGNoYXIgKmJjbV9zdHJfYXV0b19pZChiY21vbHRfZGV2aWNlX2F1dG9faWQgYXV0b19pZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RyaW5nc1tdID0KKyAgICB7CisgICAgICAgIFtCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX1JFQURZXSA9ICJERVZJQ0VfUkVBRFkiLAorICAgICAgICBbQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRURdID0gIkNPTk5FQ1RJT05fRVNUQUJMSVNIRUQiLAorICAgICAgICBbQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RFVklDRV9LRUVQX0FMSVZFXSA9ICJERVZJQ0VfS0VFUF9BTElWRSIsCisgICAgICAgIFtCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9GQUlMVVJFXSA9ICJDT05ORUNUSU9OX0ZBSUxVUkUiLAorICAgICAgICBbQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fQ09NUExFVEVdID0gIkNPTk5FQ1RJT05fQ09NUExFVEUiLAorICAgICAgICBbQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RJU0NPTk5FQ1RJT05fQ09NUExFVEVdID0gIkRJU0NPTk5FQ1RJT05fQ09NUExFVEUiLAorICAgICAgICBbQkNNT0xUX0RFVklDRV9BVVRPX0lEX1NXX0VSUk9SXSA9ICJTV19FUlJPUiIsCisgICAgICAgIFtCQ01PTFRfREVWSUNFX0FVVE9fSURfX05VTV9PRl0gPSAiVU5LTk9XTiIKKyAgICB9OworICAgIHJldHVybiBzdHJpbmdzW2F1dG9faWQgPiBCQ01PTFRfREVWSUNFX0FVVE9fSURfX05VTV9PRiA/IEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9fTlVNX09GIDogYXV0b19pZF07Cit9CisjZW5kaWYKKworY29uc3QgY2hhciAqYmNtX3N0cl9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24oYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiByZWFzb24pCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnN0cmluZ3NbXSA9CisgICAgeworICAgICAgICBbQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9USU1FT1VUXSA9ICJUSU1FT1VUIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fS0VFUEFMSVZFXSA9ICJLRUVQQUxJVkUiLAorICAgICAgICBbQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9VU0VSX0NBTExCQUNLX0VSUk9SXSA9ICJVU0VSX0NBTExCQUNLX0VSUk9SIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU09GVFdBUkVfVkVSU0lPTl9NSVNNQVRDSF0gPSAiU09GVFdBUkVfVkVSU0lPTl9NSVNNQVRDSCIsCisgICAgICAgIFtCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NZU1RFTV9NT0RFX01JU01BVENIXSA9ICJTWVNURU1fTU9ERV9NSVNNQVRDSCIsCisgICAgICAgIFtCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05OSV9TUEVFRF9NSVNNQVRDSF0gPSAiTk5JX1NQRUVEX01JU01BVENIIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fUkVDT05ORUNUX1RJTUVPVVRdID0gIlJFQ09OTkVDVF9USU1FT1VUIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fSU5URVJOQUxfRVJST1JdID0gIklOVEVSTkFMX0VSUk9SIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU1lTVEVNX01PREVfTk9UX1NVUFBPUlRFRF0gPSAiU1lTVEVNX01PREVfTk9UX1NVUFBPUlRFRCIsCisgICAgICAgIFtCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1BBUkFNRVRFUl0gPSAiUEFSQU1FVEVSIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fX05VTV9PRl0gPSAiVU5LTk9XTiIKKyAgICB9OworICAgIHJldHVybiBzdHJpbmdzWworICAgICAgICByZWFzb24gPiBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgPyBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgOiByZWFzb25dOworfQorCitjb25zdCBjaGFyICpiY21fc3RyX2hvc3RfY29ubmVjdGluZ19zdGF0ZShkZXZfY3RybF9jb25uZWN0aW5nX3N0YXRlIHN0YXRlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdHJpbmdzW10gPQorICAgIHsKKyAgICAgICAgW0RFVl9DVFJMX0NPTk5FQ1RJTkdfU1RBVEVfRVNUQUJMSVNISU5HXSA9ICJFU1RBQkxJU0hJTkciLAorICAgICAgICBbREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9DT05GSUdVUklOR10gPSAiQ09ORklHVVJJTkciLAorICAgICAgICBbREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9TVEFOREFMT05FXSA9ICJTVEFOREFMT05FIgorICAgIH07CisgICAgcmV0dXJuIChzdGF0ZSA+IERFVl9DVFJMX0NPTk5FQ1RJTkdfU1RBVEVfU1RBTkRBTE9ORSkgPyAiVU5LTk9XTiIgOiBzdHJpbmdzW3N0YXRlXTsKK30KKworc3RhdGljIGlubGluZSBiY21vc19ib29sIGRldl9jdHJsX2lzX2Nvbm5lY3RlZChiY21vbHRfZGV2aWNlX3N0YXRlIHN0YXRlKQoreworICAgIHJldHVybiAoc3RhdGUgPT0gQkNNT0xUX0RFVklDRV9TVEFURV9SRUFEWSB8fCBzdGF0ZSA9PSBCQ01PTFRfREVWSUNFX1NUQVRFX1dBSVRJTkdfRk9SX0RFVklDRSk7Cit9CisKK3ZvaWQgZGV2X2N0cmxfcmVhZF9kYihiY21vbHRfZGV2aWQgZGV2aWNlLCBkZXZfY3RybF9kYXRhYmFzZSAqZGIpCit7CisgICAgKmRiID0gZGV2X2N0cmxfZGJbZGV2aWNlXTsKK30KKworI2lmbmRlZiBJTl9CQU5ECisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGJjbW9zX2Vycm5vIGRldl9jdHJsX2dldF9kZXZfbG9nKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9sb2dnZXJfY2ZnICptc2cpCit7CisgICAgY2hhciAqbG9nX2J1ZjsKKyAgICBjaGFyICpsb2dfYnVmX2NvcHk7CisgICAgaW50IGxvZ19sZW47CisgICAgaW50IG1zZ19sZW47CisgICAgaW50IGk7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtX2Rldl9sb2dfZmlsZSBsb2dfZmlsZTsKKyAgICB1aW50MzJfdCBtc2dfYnVmX29mZnNldDsKKworICAgIGlmIChtc2ctPmtleS5maWxlX2lkICE9IEJDTU9MVF9MT0dfRklMRV9JRF9TUkFNKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgJm1zZy0+aGRyLmhkciwKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfS0VZX1JBTkdFLAorICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwKKyAgICAgICAgICAgICJXaGlsZSBkaXNjb25uZWN0ZWQsIG9ubHkgdGhlIFNSQU0gbG9nZ2VyIG1heSBiZSByZWFkIik7CisgICAgfQorCisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQobXNnLCBsb2dnZXIsIHdyYXBfYXJvdW5kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgICZtc2ctPmhkci5oZHIsCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX1JBTkdFLAorICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfV1JBUF9BUk9VTkQsCisgICAgICAgICAgICAid3JhcF9hcm91bmQgY2Fubm90IGJlIHJldHJpZXZlZCB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICB9CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChtc2csIGxvZ2dlciwgZW5hYmxlX2xvZykpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAmbXNnLT5oZHIuaGRyLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9SQU5HRSwKKyAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0VOQUJMRV9MT0csCisgICAgICAgICAgICAiZW5hYmxlX2xvZyBjYW5ub3QgYmUgcmV0cmlldmVkIHdoaWxlIGRpc2Nvbm5lY3RlZCIpOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKG1zZywgbG9nZ2VyLCBsb2dfbmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgJm1zZy0+aGRyLmhkciwKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfUkFOR0UsCisgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMsCisgICAgICAgICAgICAibG9nX25hbWVzIGNhbm5vdCBiZSByZXRyaWV2ZWQgd2hpbGUgZGlzY29ubmVjdGVkIik7CisgICAgfQorCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKG1zZywgbG9nZ2VyLCBidWZmZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2Nfc3JhbV9iYXNlID09IDApCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAmbXNnLT5oZHIuaGRyLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0JVRkZFUiwKKyAgICAgICAgICAgICJsb2cgYnVmZmVyIGNhbiBvbmx5IGJlIHJldHJlaXZlZCBhZnRlciBpbml0aWFsIGRldmljZSBjb25uZWN0aW9uIik7CisgICAgfQorCisgICAgcmMgPSBiY21fZmxkX2dldF9sb2dzKGRldmljZSwgJmxvZ19idWYsICZsb2dfbGVuKTsKKyAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJiY21fZmxkX2dldF9sb2dzXG4iKTsKKworICAgIGlmICghbG9nX2xlbikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICAvKiBNYWtlIGEgY29weSB0byBhdm9pZCB3b3JraW5nIG92ZXIgUENJZS4gT3RoZXJ3aXNlLCB0aGUgYmVoYXZpb3IgY2FuIGJlIHVucHJlZGljdGFibGUKKyAgICAgKiBiYXNlZCBvbiBQQ0llIHRyYW5zYWN0aW9uIHNpemUgYW5kIGNvbnRyb2xsZXIgY29uZmlndXJhdGlvbiAqLworICAgIGxvZ19idWZfY29weSA9IGJjbW9zX2FsbG9jKGxvZ19sZW4pOworICAgIGlmICghbG9nX2J1Zl9jb3B5KQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKworICAgIC8qIENvcHkgYnl0ZSBieSBieXRlLiBTbG93IGJ1dCB3b3JrcyBmb3IgYW55IFBDSWUgY29uZmlndXJhdGlvbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dfbGVuOyBpKyspCisgICAgICAgIGxvZ19idWZfY29weVtpXSA9IGxvZ19idWZbaV07CisKKyAgICBtc2ctPmhkci5oZHIucHJlc2VuY2VfbWFzayB8PSAoMSA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIpOworCisgICAgLyogQXR0YWNoIGxvZyBmaWxlIHRvIHRoZSBidWZmZXIgYW5kIHJlYWQgZnJvbSB0aGUgZmlsZSAqLworICAgIHJjID0gYmNtX2Rldl9sb2dfZmlsZV9hdHRhY2gobG9nX2J1Zl9jb3B5LCBsb2dfbGVuLCAmbG9nX2ZpbGUpOworCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0sgfHwgYmNtX2Rldl9sb2dfZ2V0X251bV9vZl9tZXNzYWdlcygmbG9nX2ZpbGUpID09IDApCisgICAgeworICAgICAgICBiY21vc19mcmVlKGxvZ19idWZfY29weSk7CisgICAgICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJTUkFNIGxvZyBidWZmZXIgaXMgZW1wdHlcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICAvKiBjb3B5IGFsbCBtZXNzYWdlcyBmcm9tIFNSQU0gdG8gdGhlIEFQSSBtZXNzYWdlIGJ1ZmZlciAoc3RvcHBpbmcgd2hlbiBidWZmZXIgaXMgZnVsbCkgKi8KKyAgICBtc2dfYnVmX29mZnNldCA9IDA7CisgICAgZG8KKyAgICB7CisgICAgICAgIG1zZ19sZW4gPSBiY21fZGV2X2xvZ19maWxlX3JlYWQoJmxvZ19maWxlLCAmZGV2X2N0cmxfZGJbZGV2aWNlXS5zcmFtX2xvZ19vZmZzZXQsCisgICAgICAgICAgICAmbXNnLT5kYXRhLmJ1ZmZlci5idWZmW21zZ19idWZfb2Zmc2V0XSwgc2l6ZW9mKG1zZy0+ZGF0YS5idWZmZXIuYnVmZiktIG1zZ19idWZfb2Zmc2V0IC0gMSk7CisgICAgICAgIGlmIChtc2dfbGVuIDw9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKytkZXZfY3RybF9kYltkZXZpY2VdLm1zZ3NfcmVhZDsKKyAgICAgICAgLyogVGhlIGxhc3QgY2hhcmFjdGVyIGlzIDAtdGVybWluYXRvci4gVGFrZSBpdCBvdXQgKi8KKyAgICAgICAgbXNnX2J1Zl9vZmZzZXQgKz0gbXNnX2xlbiAtIDE7CisgICAgfSB3aGlsZSAobXNnX2J1Zl9vZmZzZXQgPCBzaXplb2YobXNnLT5kYXRhLmJ1ZmZlci5idWZmKSAtIDEpOworCisgICAgLyogdGVybWluYXRlIHRoZSBzdHJpbmcgd2l0aCBhIG51bGwgY2hhcmFjdGVyICovCisgICAgbXNnLT5kYXRhLmJ1ZmZlci5idWZmW21zZ19idWZfb2Zmc2V0XSA9ICdcMCc7CisgICAgaWYgKG1zZ19sZW4gPT0gQkNNX0VSUl9PVkVSRkxPVykKKyAgICB7CisgICAgICAgIC8qIE1vcmUgcmVjb3JkcyB0byByZWFkICovCisgICAgICAgIG1zZy0+ZGF0YS5idWZmZXIubXNnX3RvX3JlYWQgPSBiY21fZGV2X2xvZ19nZXRfbnVtX29mX21lc3NhZ2VzKCZsb2dfZmlsZSkgLSBkZXZfY3RybF9kYltkZXZpY2VdLm1zZ3NfcmVhZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogYWxsIGRvbmUgKi8KKyAgICAgICAgbXNnLT5kYXRhLmJ1ZmZlci5tc2dfdG9fcmVhZCA9IDA7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uc3JhbV9sb2dfb2Zmc2V0ID0gMDsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5tc2dzX3JlYWQgPSAwOworICAgIH0KKworICAgIC8qIERldGFjaCBmaWxlIGZyb20gYnVmZmVyICovCisgICAgYmNtX2Rldl9sb2dfZmlsZV9kZXRhY2goJmxvZ19maWxlKTsKKworICAgIGJjbW9zX2ZyZWUobG9nX2J1Zl9jb3B5KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmCisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9nZXRfc3dfZXJyb3JfdGFibGUoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19zd19lcnJvcl90YWJsZSAqc3dfZXJyb3JfdGFibGU7CisgICAgdWludDhfdCAqc3JhbTsKKyAgICB1aW50OF90ICpsb2NhbDsKKyAgICB1aW50MzJfdCBzaXplOworICAgIHVpbnQzMl90IGk7CisKKyAgICBzcmFtID0gYmNtX2ZsZF9nZXRfc3dfZXJyb3JfdGFibGUoZGV2aWNlLCAmc2l6ZSk7CisgICAgbG9jYWwgPSBiY21vc19hbGxvYyhzaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgbG9jYWxbaV0gPSBzcmFtW2ldOworICAgIH0KKworICAgIHN3X2Vycm9yX3RhYmxlID0gKGJjbW9zX3N3X2Vycm9yX3RhYmxlKilsb2NhbDsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLnN3X2Vycm9yX2NvdW50ID0gQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKHN3X2Vycm9yX3RhYmxlLT5jb3VudCk7CisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uc3dfZXJyb3JfY291bnQgPiBOVU1fRUxFTShkZXZfY3RybF9kYltkZXZpY2VdLnN3X2Vycm9ycykpCisgICAgeworICAgICAgICBiY21vc19mcmVlKGxvY2FsKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGRldl9jdHJsX2RiW2RldmljZV0uc3dfZXJyb3JfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uc3dfZXJyb3JzW2ldLmZpcnN0X2Vycm9yX3RpbWVfdXMgPQorICAgICAgICAgICAgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTY0KHN3X2Vycm9yX3RhYmxlLT5lcnJvcltpXS5maXJzdF9lcnJvcl90aW1lKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5zd19lcnJvcnNbaV0ubGFzdF9lcnJvcl90aW1lX3VzID0KKyAgICAgICAgICAgIEJDTU9TX0VORElBTl9MSVRUTEVfVE9fQ1BVX1U2NChzd19lcnJvcl90YWJsZS0+ZXJyb3JbaV0ubGFzdF9lcnJvcl90aW1lKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5zd19lcnJvcnNbaV0ubGluZV9udW1iZXIgPQorICAgICAgICAgICAgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKHN3X2Vycm9yX3RhYmxlLT5lcnJvcltpXS5saW5lX251bWJlcik7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uc3dfZXJyb3JzW2ldLmVycm9yX2NvdW50ZXIgPQorICAgICAgICAgICAgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKHN3X2Vycm9yX3RhYmxlLT5lcnJvcltpXS5lcnJvcl9jb3VudGVyKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5zd19lcnJvcnNbaV0uaW5zdGFuY2UgPQorICAgICAgICAgICAgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKHN3X2Vycm9yX3RhYmxlLT5lcnJvcltpXS5pbnN0YW5jZSk7CisgICAgICAgIHN0cm5jcHkoCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLnN3X2Vycm9yc1tpXS5maWxlbmFtZSwKKyAgICAgICAgICAgIHN3X2Vycm9yX3RhYmxlLT5lcnJvcltpXS5maWxlX25hbWUsCisgICAgICAgICAgICBCQ01PTFRfU1dfRVJST1JfTUFYX0ZJTEVfTkFNRV9MRU4pOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLnN3X2Vycm9yc1tpXS5maWxlbmFtZVtCQ01PTFRfU1dfRVJST1JfTUFYX0ZJTEVfTkFNRV9MRU4tMV0gPSAwOworICAgICAgICBzdHJuY3B5KAorICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5zd19lcnJvcnNbaV0udGFza19uYW1lLAorICAgICAgICAgICAgc3dfZXJyb3JfdGFibGUtPmVycm9yW2ldLnRhc2tfbmFtZSwKKyAgICAgICAgICAgIEJDTU9MVF9TV19FUlJPUl9NQVhfVEFTS19OQU1FX0xFTik7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uc3dfZXJyb3JzW2ldLnRhc2tfbmFtZVtCQ01PTFRfU1dfRVJST1JfTUFYX1RBU0tfTkFNRV9MRU4tMV0gPSAwOworICAgIH0KKworICAgIGJjbW9zX2ZyZWUobG9jYWwpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIHN3X2Vycm9yX2tleV92YWxpZChjb25zdCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5ICprZXkpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpYmNtb3NfdGFza19jdXJyZW50KCktPnBhcm0uZGF0YTsKKyAgICByZXR1cm4ga2V5LT5pZHggPCBkZXZfY3RybF9kYltkZXZpY2VdLnN3X2Vycm9yX2NvdW50OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gbWhfc29mdHdhcmVfZXJyb3Jfa2V5X3ZhbGlkYXRlKGJjbW9sdF9tc2cgKm1zZywgY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqa2V5KQoreworICAgIHJldHVybiBzd19lcnJvcl9rZXlfdmFsaWQoa2V5KSA/IEJDTV9FUlJfT0sgOiBCQ01fRVJSX05PRU5UOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gbWhfc29mdHdhcmVfZXJyb3JfY2ZnX2dldCgKKyAgICBiY21vbHRfbXNnICptc2csCisgICAgY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqa2V5LAorICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSAqZGF0YSkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCliY21vc190YXNrX2N1cnJlbnQoKS0+cGFybS5kYXRhOworICAgIGJjbW9sdF9wcmVzZW5jZV9tYXNrIHByb3BzID0gbXNnLT5wcmVzZW5jZV9tYXNrOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmIChwcm9wcyA9PSBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEwpCisgICAgeyAKKyAgICAgICAgLyogQ29udmVydCBmcm9tIHNlbnRpbmVsICJhbGwiIHByZXNlbmNlIGJpdHMgdG8gc2V0IG9mIGFsbCB2YWxpZCBiaXRzKi8KKyAgICAgICAgcHJvcHMgPSAoMVUgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9fTlVNX09GKSAtIDE7CisgICAgfQorCisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcqKW1zZywgc29mdHdhcmVfZXJyb3IsIGVudHJ5KSkKKyAgICB7CisgICAgICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmZsZF9pbmZvLnNvY19zcmFtX2Jhc2UgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgICAgICBCQ01PTFRfU09GVFdBUkVfRVJST1JfQ0ZHX0lEX0VOVFJZLAorICAgICAgICAgICAgICAgICJTb2Z0d2FyZSBlcnJvcnMgY2FuIG9ubHkgYmUgcmV0cmVpdmVkIGFmdGVyIGluaXRpYWwgZGV2aWNlIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEtPmVudHJ5ID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5zd19lcnJvcnNba2V5LT5pZHhdOworICAgICAgICBwcm9wcyAmPSB+QkNNT0xUX1BST1BfTUFTS19HRVQoc29mdHdhcmVfZXJyb3IsIF9jZmcsIGVudHJ5KTsKKyAgICB9CisKKyAgICBpZiAocHJvcHMgIT0gMCkKKyAgICB7CisgICAgICAgIHJjID0gYmNtb2x0X21zZ19lcnIobXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHByb3BlcnRpZXM6IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpcHJvcHMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIG1oX3NvZnR3YXJlX2Vycm9yX2tleV9pdGVyYXRlKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgKmtleSkKK3sKKyAgICBrZXktPmlkeCsrOworICAgIHJldHVybiBzd19lcnJvcl9rZXlfdmFsaWQoa2V5KSA/IEJDTV9FUlJfT0sgOiBCQ01fRVJSX05PX01PUkU7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBtaF9zb2Z0d2FyZV9lcnJvcl9rZXlfcmVzb2x2ZV93aWxkY2FyZHMoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqa2V5KQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitNSF9ERUNMQVJFX0NGR19HRVRfTVVMVEkoc29mdHdhcmVfZXJyb3IpCisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9zd19lcnJvcl9nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcgKmNmZyA9IChiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnKiltc2c7CisgICAgYmNtb3NfZXJybm8gZXJyID0gZGV2X2N0cmxfZ2V0X3N3X2Vycm9yX3RhYmxlKGRldmljZSk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorCisgICAgaWYgKG1zZy0+dHlwZSA9PSBCQ01PTFRfTVNHX1RZUEVfR0VUKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZCBrZXlfcHJvcF9pZDsKKyAgICAgICAgaWYgKCFiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2JvdW5kc19jaGVjaygmY2ZnLT5rZXksIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCwgJmtleV9wcm9wX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgbXNnLT5lcnJfZmllbGRfaWR4ID0gKHVpbnQxNl90KSBrZXlfcHJvcF9pZDsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0tFWV9SQU5HRTsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IG1oX3NvZnR3YXJlX2Vycm9yX2tleV92YWxpZGF0ZShtc2csICZjZmctPmtleSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtaF9zb2Z0d2FyZV9lcnJvcl9jZmdfZ2V0KG1zZywgJmNmZy0+a2V5LCAmY2ZnLT5kYXRhKTsKKyAgICB9CisgICAgZWxzZSBpZiAobXNnLT50eXBlID09IEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEkpCisgICAgeworICAgICAgICByZXR1cm4gbWhfc29mdHdhcmVfZXJyb3JfY2ZnX2dldF9tdWx0aShjZmcsIG1zZy0+bXNnX3NldC0+ZmlsdGVyX2ZsYWdzLCBtc2ctPm1zZ19zZXQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIlVuZXhwZWN0ZWQgdHlwZSAweCV4XG4iLCBtc2ctPnR5cGUpOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zZW5kX2luZGljYXRpb24oYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIG1zZy0+c3ViY2ggPSBCQ01UUk1VWF9DSEFOTkVMX0FVVE9fUFJPWFk7CisgICAgbXNnLT50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICBiY210cm11eF9jb250cm9sX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zZW5kX2luZF9jb25uZWN0aW9uX2NvbXBsZXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9zX2Jvb2wgc3RhbmRhbG9uZSkKK3sKKyAgICBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUgaW5kID0ge307CisgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIkNvbm5lY3Rpb24gY29tcGxldGU6IHN0YW5kYWxvbmU9JXNcbiIsIHN0YW5kYWxvbmUgPyAieWVzIiA6ICJubyIpOworICAgIEJDTU9MVF9BVVRPX0lOSVQoJmluZCwgZGV2aWNlLCBjb25uZWN0aW9uX2NvbXBsZXRlKTsKKyAgICBpbmQuZGF0YS5zdGFuZGFsb25lID0gc3RhbmRhbG9uZTsKKyAgICBkZXZfY3RybF9zZW5kX2luZGljYXRpb24oZGV2aWNlLCAmaW5kLmhkci5oZHIpOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zZW5kX2luZF9kaXNjb25uZWN0aW9uX2NvbXBsZXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlIGluZCA9IHt9OworICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJEaXNjb25uZWN0aW9uIGNvbXBsZXRlXG4iKTsKKyAgICBCQ01PTFRfQVVUT19JTklUKCZpbmQsIGRldmljZSwgZGlzY29ubmVjdGlvbl9jb21wbGV0ZSk7CisgICAgZGV2X2N0cmxfc2VuZF9pbmRpY2F0aW9uKGRldmljZSwgJmluZC5oZHIuaGRyKTsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfc2VuZF9pbmRfY29ubmVjdGlvbl9mYWlsdXJlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gcmVhc29uKQoreworICAgIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlIGluZCA9IHt9OworICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJDb25uZWN0aW9uIGZhaWx1cmU6ICVzXG4iLCBiY21fc3RyX2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbihyZWFzb24pKTsKKyAgICBCQ01PTFRfQVVUT19JTklUKCZpbmQsIGRldmljZSwgY29ubmVjdGlvbl9mYWlsdXJlKTsKKyAgICBpbmQuZGF0YS5yZWFzb24gPSByZWFzb247CisgICAgZGV2X2N0cmxfc2VuZF9pbmRpY2F0aW9uKGRldmljZSwgJmluZC5oZHIuaGRyKTsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5fZmFpbF9yZWFzb24gPSByZWFzb247IC8qIGxvZyB0aGUgZmFpbHVyZSByZWFzb24gdG8gdGhlIGRiLiAqLworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zZW5kX2luZF9jb25uZWN0aW9uX2ZhaWx1cmVfZnJvbV9tc2coYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIEJVR19PTihtc2ctPnN1Ymdyb3VwICE9IEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0ZBSUxVUkUpOworICAgIGRldl9jdHJsX3NlbmRfaW5kX2Nvbm5lY3Rpb25fZmFpbHVyZShkZXZpY2UsICgoY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmUgKiltc2cpLT5kYXRhLnJlYXNvbik7Cit9CisKKyNpZm5kZWYgSU5fQkFORAorc3RhdGljIHZvaWQgZGV2X2N0cmxfc2VuZF9pbmRfZXhjZXB0aW9uX2xvZyhiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCBjcHVpZCwgY29uc3QgY2hhciAqZXhjZXB0aW9uX2J1ZikKK3sKKyAgICAvKiBCZWNhdXNlIGluZGljYXRpb24gc2l6ZSBpcyBsaW1pdGVkIChidXQgSU5EX01TR19NQVhfU0laRSA+IHNpemVvZihiY21vbHRfc3RyXzIwMDAuc3RyKSwgd2UgbWF5IG5lZWQgdG8gc3BsaXQgaW50byBtdWx0aXBsZSBpbmRpY2F0aW9ucy4KKyAgICAgKiBXZSB1c2UgYSBzdGF0aWMgdmFyaWFibGUgYmVjYXVzZSBvdXIgc3RhY2sgc2l6ZSBpcyBsaW1pdGVkLiAqLworICAgIHN0YXRpYyBiY21vbHRfc3RyXzIwMDAgYXBpX2V4Y2VwdGlvbl9zdHI7CisgICAgY29uc3QgY2hhciAqcG9zID0gZXhjZXB0aW9uX2J1ZjsKKyAgICB1aW50MzJfdCByZW1haW5pbmdfbGVuID0gc3RybGVuKHBvcyk7CisKKyAgICB3aGlsZSAocmVtYWluaW5nX2xlbikKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uIGluZCA9IHt9OworICAgICAgICB1aW50MzJfdCBieXRlc19jb3BpZWQ7CisKKyAgICAgICAgc3RybmNweShhcGlfZXhjZXB0aW9uX3N0ci5zdHIsIHBvcywgc2l6ZW9mKGFwaV9leGNlcHRpb25fc3RyLnN0cikgLSAxKTsKKyAgICAgICAgYXBpX2V4Y2VwdGlvbl9zdHIuc3RyW3NpemVvZihhcGlfZXhjZXB0aW9uX3N0ci5zdHIpIC0gMV0gPSAnXDAnOworCisgICAgICAgIEJDTU9MVF9BVVRPX0lOSVQoJmluZCwgZGV2aWNlLCBzd19leGNlcHRpb24pOworICAgICAgICBpbmQuZGF0YS5jcHVfaWQgPSBjcHVpZDsKKyAgICAgICAgaW5kLmRhdGEudGV4dCA9IGFwaV9leGNlcHRpb25fc3RyOworICAgICAgICBkZXZfY3RybF9zZW5kX2luZGljYXRpb24oZGV2aWNlLCAmaW5kLmhkci5oZHIpOworCisgICAgICAgIGlmIChzaXplb2YoYXBpX2V4Y2VwdGlvbl9zdHIuc3RyKSAtIDEgPCByZW1haW5pbmdfbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlc19jb3BpZWQgPSBzaXplb2YoYXBpX2V4Y2VwdGlvbl9zdHIuc3RyKSAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBieXRlc19jb3BpZWQgPSByZW1haW5pbmdfbGVuOworICAgICAgICB9CisgICAgICAgIHJlbWFpbmluZ19sZW4gLT0gYnl0ZXNfY29waWVkOworICAgICAgICBwb3MgKz0gYnl0ZXNfY29waWVkOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zZW5kX2NvbmZpZ19zZXRfbXNnKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X3ByZXNlbmNlX21hc2sgbWFzaywKKyAgICB1aW50MTZfdCBjb3JyX3RhZywKKyAgICBjb25zdCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhICpkYXRhKQoreworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHt9OworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGNmZzsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgY2ZnLmRhdGEgPSAqZGF0YTsKKyAgICBjZmcuaGRyLmhkci5wcmVzZW5jZV9tYXNrID0gbWFzazsKKworICAgIGNmZy5oZHIuaGRyLmNvcnJfdGFnID0gY29ycl90YWc7CisgICAgY2ZnLmhkci5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9TRVQ7CisKKyAgICByYyA9IGJjbXRybXV4X2NvbnRyb2xfdG9fbGluZShkZXZpY2UsICZjZmcuaGRyLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgICAgICJiY210cm11eF9jb250cm9sX3RvX2xpbmUgb2YgZGV2aWNlIGNvbmZpZyBtc2cgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwKKyAgICAgICAgICAgIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3NlbmRfY29uZmlnX2dldF9tc2coYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgbWFzaywgdWludDE2X3QgY29ycl90YWcpCit7CisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0ge307CisgICAgYmNtb2x0X2RldmljZV9jZmcgY2ZnOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTsKKyAgICBjZmcuaGRyLmhkci5wcmVzZW5jZV9tYXNrID0gbWFzazsKKworICAgIGNmZy5oZHIuaGRyLmNvcnJfdGFnID0gY29ycl90YWc7CisgICAgY2ZnLmhkci5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9HRVQ7CisKKyAgICByYyA9IGJjbXRybXV4X2NvbnRyb2xfdG9fbGluZShkZXZpY2UsICZjZmcuaGRyLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgICAgICJiY210cm11eF9jb250cm9sX3RvX2xpbmUgb2YgZGV2aWNlIGNvbmZpZyBtc2cgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwKKyAgICAgICAgICAgIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3NlbmRfZGV2aWNlX2Rpc2Nvbm5lY3RfbXNnKGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQxNl90IGNvcnJfdGFnKQoreworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHt9OworICAgIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdCBvcGVyOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBkaXNjb25uZWN0LCBrZXkpOworCisgICAgb3Blci5oZHIuaGRyLmNvcnJfdGFnID0gY29ycl90YWc7CisgICAgb3Blci5oZHIuaGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfU0VUOworICAgIHJjID0gYmNtdHJtdXhfY29udHJvbF90b19saW5lKGRldmljZSwgJm9wZXIuaGRyLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgICAgICJiY210cm11eF9jb250cm9sX3RvX2xpbmUgb2YgZGV2aWNlIGRpc2Nvbm5lY3Qgb3BlcmF0aW9uIHJldHVybmVkIGVycm9yICVzICglZClcbiIsCisgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksCisgICAgICAgICAgICByYyk7CisgICAgfQorfQorCisvKiBTZXQgYWxsIGRldmljZSBvYmplY3QgcHJvcGVydGllcyB0byBkZWZhdWx0IHZhbHVlcy4gKi8KK3N0YXRpYyB2b2lkIGRldl9jdHJsX2NsZWFyX2RldmljZV9jZmcoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCA9IDA7CisKKyAgICAvKiBQYXkgYXR0ZW50aW9uOiBXZSB1c2UgdGhlIGludGVydmFsIGFuZCB0b2xlcmFuY2UgZnJvbSBkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8gYW5kIG5vdCBmcm9tCisgICAgICogZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLiBUaGVzZSBwYXJhbWV0ZXJzIGV4aXN0IGluIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcyBvbmx5IGJlY2F1c2UgaXQgaXMKKyAgICAgKiB0aGUgZGF0YSBtb2RlbCByZXByZXNlbnRhdGlvbi4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2NmZ19kYXRhX3NldF9kZWZhdWx0KCZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMsIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5rYV9pbmZvLmthX2ludGVydmFsID0KKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmtlZXBhbGl2ZV9pbnRlcnZhbCAqIEJDTU9TX01JQ1JPU0VDT05EU19JTl9TRUNPTkRTOworICAgIGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV90b2xlcmFuY2UgPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMua2VlcGFsaXZlX3RvbGVyYW5jZTsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfaW5pdF9jb25uZWN0aW9uX3N0YXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5jb25uZWN0aW9uX2luZm8uY29uZmlnX3NlbmRfY291bnRlciA9IENPTkZJR19TRU5EX01BWF9OVU1CRVI7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5jb25uZWN0aW9uX2luZm8uY29uZmlnX2ludGVydmFsID0gREVWSUNFX0NPTlRST0xfQ09ORklHX1RJTUVfVVM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF92YWxpZGF0ZV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyNpZm5kZWYgSU5fQkFORAorICAgIGJjbW9zX2Vycm5vIHJjOworI2VuZGlmCisgICAgYmNtb2x0X2RldmljZV9jZmcgKmNmZyA9IChiY21vbHRfZGV2aWNlX2NmZyAqKW1zZzsKKyAgICBiY21vbHRfZGV2aWNlX3N0YXRlIHN0YXRlID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnX2lkIGZhaWxlZF9wcm9wID0gQkNNT0xUX0VSUl9GSUVMRF9OT05FOworCisgICAgaWYgKCFiY21vbHRfZGV2aWNlX2NmZ19kYXRhX2JvdW5kc19jaGVjaygmY2ZnLT5kYXRhLCBtc2ctPnByZXNlbmNlX21hc2ssICZmYWlsZWRfcHJvcCkpCisgICAgeworICAgICAgICBtc2ctPmVycl9maWVsZF9pZHggPSAodWludDE2X3QpZmFpbGVkX3Byb3A7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworI2lmbmRlZiBJTl9CQU5ECisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlKSkKKyAgICB7CisgICAgICAgIGlmIChzdGF0ZSAhPSBCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9TWVNURU1fTU9ERSwKKyAgICAgICAgICAgICAgICAiU3lzdGVtIG1vZGUgY2FuIG9ubHkgYmUgY2hhbmdlZCB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gZGV2X2N0cmxfcGFyYW1zLnN5c3RlbV9tb2RlX3ZhbGlkYXRlX2NiKGRldmljZSwgY2ZnLT5kYXRhLnN5c3RlbV9tb2RlKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgICAgIHJjLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFLAorICAgICAgICAgICAgICAgICJHaXZlbiBzeXN0ZW0gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGJvYXJkIik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBubmlfc3BlZWQpICYmIHN0YXRlICE9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCwKKyAgICAgICAgICAgICJOTkkgc3BlZWQgY2FuIG9ubHkgYmUgY2hhbmdlZCB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICB9CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZGVidWcpICYmIHN0YXRlICE9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHLAorICAgICAgICAgICAgIkRlYnVnIHBhcmFtZXRlcnMgY2FuIG9ubHkgYmUgY2hhbmdlZCB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICB9CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbikgfHwKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgaG9zdF9zd192ZXJzaW9uKSB8fAorICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBjaGlwX3JldmlzaW9uKXx8CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIHN0YXRlKXx8CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGNoaXBfdGVtcGVyYXR1cmUpfHwKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgY2hpcF92b2x0YWdlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiQ2Fubm90IHNldCByZWFkIG9ubHkgZmllbGRzIik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF92YWxpZGF0ZV9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vbHRfZGV2aWNlX3N0YXRlIHN0YXRlID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnICpjZmcgPSAoYmNtb2x0X2RldmljZV9jZmcgKiltc2c7CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbikgfHwKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgY2hpcF9yZXZpc2lvbikgfHwKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgY2hpcF90ZW1wZXJhdHVyZSl8fAorICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBjaGlwX3ZvbHRhZ2UpIHx8CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZykpCisgICAgeworICAgICAgICBpZiAoIWRldl9jdHJsX2lzX2Nvbm5lY3RlZChzdGF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorCQkJCUJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgICAgICJDYW5ub3QgcmV0cmlldmUgcGFyYW1ldGVyIHdoaWxlIGRpc2Nvbm5lY3RlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSkpCisgICAgeworICAgICAgICBpZiAoIWRldl9jdHJsX2lzX2Nvbm5lY3RlZChzdGF0ZSkgJiYKKyAgICAgICAgICAgIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCAmCisgICAgICAgICAgICBCQ01PTFRfUFJPUF9NQVNLX0dFVChkZXZpY2UsIF9jZmcsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0VYVF9JUlEsCisgICAgICAgICAgICAgICAgIkNhbm5vdCByZXRyaWV2ZSBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxIHdoaWxlIGRpc2Nvbm5lY3RlZCBhbmQgbm90IGhhdmluZyBhIGNhY2hlLiIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpKQorICAgIHsKKyAgICAgICAgaWYgKCFkZXZfY3RybF9pc19jb25uZWN0ZWQoc3RhdGUpICYmCisgICAgICAgICAgICAoZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zX3ByZXNlbnQgJgorICAgICAgICAgICAgQkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX1NBTVBMRV9ERUxBWSwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHJldHJpZXZlIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSB3aGlsZSBkaXNjb25uZWN0ZWQgYW5kIG5vdCBoYXZpbmcgYSBjYWNoZS4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKSkKKyAgICB7CisgICAgICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgICAgICAgICAgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYgQkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBpbmRpY2F0aW9uX3NoYXBpbmcpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORywKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHJldHJpZXZlIGluZGljYXRpb25fc2hhcGluZyB3aGlsZSBkaXNjb25uZWN0ZWQgYW5kIG5vdCBoYXZpbmcgYSBjYWNoZS4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgICAgICAgICAgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKyAgICAgICAgICAgIEJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisJCQkJQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUsCisgICAgICAgICAgICAgICAgIkNhbm5vdCByZXRyaWV2ZSBncG9uX3hncG9uX3RvZF9lbmFibGUgd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSkKKyAgICB7CisgICAgICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgICAgICAgICAgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKyAgICAgICAgICAgIEJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgICAgICBCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOLAorICAgICAgICAgICAgICAgICJDYW5ub3QgcmV0cmlldmUgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4gd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KSkKKyAgICB7CisgICAgICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgICAgICAgICAgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKyAgICAgICAgICAgIEJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0NPTk5FQ1RFRF9JTlRFUk5BTExZLAorICAgICAgICAgICAgICAgICJDYW5ub3QgcmV0cmlldmUgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkgd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KSkKKyAgICB7CisgICAgICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgICAgICAgICAgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKyAgICAgICAgICAgIEJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fODAyMV9BU19UT0RfRk9STUFULAorICAgICAgICAgICAgICAgICJDYW5ub3QgcmV0cmlldmUgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQgd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpKQorICAgIHsKKyAgICAgICAgaWYgKCFkZXZfY3RybF9pc19jb25uZWN0ZWQoc3RhdGUpICYmCisgICAgICAgICAgICAoZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zX3ByZXNlbnQgJgorICAgICAgICAgICAgQkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBlcG9uX3NoYXBlcl9tb2RlKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisJCQkJQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFLAorICAgICAgICAgICAgICAgICJDYW5ub3QgcmV0cmlldmUgZXBvbl9zaGFwZXJfbW9kZSB3aGlsZSBkaXNjb25uZWN0ZWQgYW5kIG5vdCBoYXZpbmcgYSBjYWNoZS4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCkpCisgICAgeworICAgICAgICBpZiAoIWRldl9jdHJsX2lzX2Nvbm5lY3RlZChzdGF0ZSkgJiYKKyAgICAgICAgICAgIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCAmCisgICAgICAgICAgICBCQ01PTFRfUFJPUF9NQVNLX0dFVChkZXZpY2UsIF9jZmcsIGVtYmVkZGVkX2ltYWdlX2xpc3QpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QsCisgICAgICAgICAgICAgICAgIkNhbm5vdCByZXRyaWV2ZSBlbWJlZGRlZF9pbWFnZV9saXN0IHdoaWxlIGRpc2Nvbm5lY3RlZCBhbmQgbm90IGhhdmluZyBhIGNhY2hlLiIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSkKKyAgICB7CisgICAgCWlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorCQkJKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKwkJCUJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCkpID09IDApCisgICAgCXsKKyAgICAJCXJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAJCQltc2csCisJCQkJREVWX0xPR19JTlZBTElEX0lELAorCQkJCUJDTV9FUlJfU1RBVEUsCisJCQkJQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSCwKKwkJCQkiQ2Fubm90IHJldHJpZXZlIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGggd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgCX0KKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlKSkKKyAgICB7CisgICAgCWlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgIAkJKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKyAgICAJCUJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgdG9kX3VhcnRfYmF1ZHJhdGUpKSA9PSAwKQorICAgIAl7CisgICAgCQlyZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgCQkJbXNnLAorCQkJCURFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorCQkJCUJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1RPRF9VQVJUX0JBVURSQVRFLAorCQkJCSJDYW5ub3QgcmV0cmlldmUgdG9kX3VhcnRfYmF1ZHJhdGUgd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgCX0KKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF92YWxpZGF0ZV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgIT0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkRldmljZSBjZmdfY2xlYXIgaXMgb25seSBhbGxvd2VkIHdoaWxlIGRpc2Nvbm5lY3RlZCIpOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfY3RybF92YWxpZGF0ZV9vcGVyX2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9kZXZpY2Vfc3RhdGUgc3RhdGUgPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGU7CisKKyAgICBpZiAoZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2Vycihtc2csIERFVl9MT0dfSU5WQUxJRF9JRCwgQkNNX0VSUl9BTFJFQURZLCBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsICJhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgIH0KKworICAgIC8qIElmIG5vdCBhbGwgbWFuZGF0b3J5IHByb3BlcnRpZXMgYXJlIHZhbGlkIHJldHVybiAibWFuZGF0b3J5IHBhcmFtZXRlciBpcyBtaXNzaW5nIiAqLworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3lzdGVtX21vZGUgPj0gQkNNT0xUX1NZU1RFTV9NT0RFX19OVU1fT0YpCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ2Fubm90IGNvbm5lY3Q6IHN5c3RlbSBtb2RlIG5vdCBpbmNsdWRlZFxuIik7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfTUFOREFUT1JZX1BBUk1fSVNfTUlTU0lORywKKyAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFLAorICAgICAgICAgICAgIlN5c3RlbSBtb2RlIG11c3QgYmUgc2V0IGJlZm9yZSBjb25uZWN0aW5nIik7CisgICAgfQorI2lmZGVmIElOX0JBTkQKKyAgICAvKiBGb3IgSW4gQmFuZCBNYW5hZ2VtZW50IElQIEFkZHJlc3MgYW5kIFVEUCBwb3J0IG11c3QgYmUgc2V0IHByaW9yIHRvIGNvbm5lY3RpbmcqLworICAgIC8qIElmIG5vdCBhbGwgbWFuZGF0b3J5IHByb3BlcnRpZXMgYXJlIHZhbGlkIHJldHVybiAibWFuZGF0b3J5IHBhcmFtZXRlciBpcyBtaXNzaW5nIiAqLworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGV2aWNlX2lwX2FkZHJlc3MudTMyID09IDApCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ2Fubm90IGNvbm5lY3Q6IG11c3Qgc2V0IElQIEFkZHJlc3MgcG9ydFxuIik7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfTUFOREFUT1JZX1BBUk1fSVNfTUlTU0lORywKKyAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9JUF9BRERSRVNTLAorICAgICAgICAgICAgIkRldmljZSBJUCBBZGRyZXNzIG11c3QgYmUgc2V0IGJlZm9yZSBjb25uZWN0aW5nIik7CisgICAgfQorICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGV2aWNlX3VkcF9wb3J0ID09IDApCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ2Fubm90IGNvbm5lY3Q6IG11c3Qgc2V0IElQIEFkZHJlc3MgVURQIHBvcnRcbiIpOworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX01BTkRBVE9SWV9QQVJNX0lTX01JU1NJTkcsCisgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQsCisgICAgICAgICAgICAiVURQIHBvcnQgbXVzdCBiZSBzZXQgYmVmb3JlIGNvbm5lY3RpbmciKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9jdHJsX3ZhbGlkYXRlX29wZXJfZGlzY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtb2x0X2RldmljZV9zdGF0ZSBzdGF0ZSA9IGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZTsKKyAgICBpZiAoc3RhdGUgPT0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIobXNnLCBERVZfTE9HX0lOVkFMSURfSUQsIEJDTV9FUlJfQUxSRUFEWSwgQkNNT0xUX0VSUl9GSUVMRF9OT05FLCAiYWxyZWFkeSBkaXNjb25uZWN0ZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2N0cmxfdmFsaWRhdGVfb3Blcl9ydW5fZGRyX3Rlc3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0ICpkZHJfdGVzdCA9IChiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdCopbXNnOworICAgIGJjbW9zX2Jvb2wgaXNfc3RhbmRhbG9uZTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmIChCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRCAhPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkREUiB0ZXN0IGNhbiBvbmx5IGJlIHJ1biB3aGVuIGRpc2Nvbm5lY3RlZCIpOworICAgIH0KKworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmlzX2hvc3RfcmVzZXRfcGVuZGluZykKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiQ2Fubm90IHJ1biBERFIgdGVzdCB3aGlsZSBob3N0IHJlc2V0IGlzIHBlbmRpbmciKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgY2hpcCBpcyBydW5uaW5nIGluIHN0YW5kYWxvbmUgbW9kZSAqLworICAgIHJjID0gZGV2X2N0cmxfcGFyYW1zLmRldmljZV9pc19ydW5uaW5nX2NiKGRldmljZSwgJmlzX3N0YW5kYWxvbmUpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJkZXZpY2VfaXNfcnVubmluZ19jYiByZXR1cm5lZCBlcnJvcjogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIHJjLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkZhaWxlZCB0byByZXRyaWV2ZSBkZXZpY2Ugc3RhdHVzIik7CisgICAgfQorICAgIGlmIChpc19zdGFuZGFsb25lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgICAgICJDYW5ub3QgcnVuIEREUiB0ZXN0IHdoaWxlIGRldmljZSBpcyBydW5uaW5nIik7CisgICAgfQorCisgICAgaWYgKCFkZHJfdGVzdC0+ZGF0YS5jcHUgJiYgIWRkcl90ZXN0LT5kYXRhLnJhc18wICYmICFkZHJfdGVzdC0+ZGF0YS5yYXNfMSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiTXVzdCByZXF1ZXN0IGF0IGxlYXN0IG9uZSBERFIgVGVzdCIpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2N0cmxfdmFsaWRhdGVfb3BlcmF0aW9uKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vbHRfZGV2aWNlX3N0YXRlIHN0YXRlID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlOworICAgIGlmIChzdGF0ZSA9PSBCQ01PTFRfREVWSUNFX1NUQVRFX0NPTk5FQ1RJTkcpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkRldmljZSBvcGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB3aGlsZSBjb25uZWN0aW5nIik7CisgICAgfQorICAgIGlmIChzdGF0ZSA9PSBCQ01PTFRfREVWSUNFX1NUQVRFX1RFU1RJTkdfRERSKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgICAgICJEZXZpY2Ugb3BlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgd2hpbGUgRERSIHRlc3QgaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1zZy0+c3ViZ3JvdXApCisgICAgeworICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0NPTk5FQ1Q6CisgICAgICAgIHJldHVybiBiY21fZGV2X2N0cmxfdmFsaWRhdGVfb3Blcl9jb25uZWN0KGRldmljZSwgbXNnKTsKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9ESVNDT05ORUNUOgorICAgICAgICByZXR1cm4gYmNtX2Rldl9jdHJsX3ZhbGlkYXRlX29wZXJfZGlzY29ubmVjdChkZXZpY2UsIG1zZyk7CisgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfUlVOX0REUl9URVNUOgorICAgICAgICByZXR1cm4gYmNtX2Rldl9jdHJsX3ZhbGlkYXRlX29wZXJfcnVuX2Rkcl90ZXN0KGRldmljZSwgbXNnKTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF92YWxpZGF0ZV9tc2coYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPT0gQkNNT0xUX0RFVklDRV9TVEFURV9XQUlUSU5HX0ZPUl9ERVZJQ0UpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIlRoZSBkZXZpY2Ugb2JqZWN0IGlzIGJ1c3kgcHJvY2Vzc2luZyBhbm90aGVyIEFQSSByZXF1ZXN0Iik7CisgICAgfQorCisgICAgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9DRkcpCisgICAgeworICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgIHJldHVybiBkZXZfY3RybF92YWxpZGF0ZV9jZmdfY2xlYXIoZGV2aWNlLCBtc2cpOworICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICByZXR1cm4gZGV2X2N0cmxfdmFsaWRhdGVfY2ZnX3NldChkZXZpY2UsIG1zZyk7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgIHJldHVybiBkZXZfY3RybF92YWxpZGF0ZV9jZmdfZ2V0KGRldmljZSwgbXNnKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9PUEVSICYmIG1zZy0+dHlwZSA9PSBCQ01PTFRfTVNHX1RZUEVfU0VUKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRldl9jdHJsX3ZhbGlkYXRlX29wZXJhdGlvbihkZXZpY2UsIG1zZyk7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICBtc2csCisgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgQkNNX0VSUl9JTlRFUk5BTCwKKyAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAiSW52YWxpZCBtZXNzYWdlIGZvciBkZXZpY2UgY29udHJvbCIpOworfQorCitzdGF0aWMgYmNtb2x0X3ByZXNlbmNlX21hc2sgZGV2X2N0cmxfZmlsbF9mcm9tX2xvY2FsKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb2x0X2RldmljZV9jZmcgKmNmZyA9IChiY21vbHRfZGV2aWNlX2NmZyAqKWRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlOworICAgIGJjbW9sdF9wcmVzZW5jZV9tYXNrIG1hc2sgPSBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZS0+cHJlc2VuY2VfbWFzazsKKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBzeXN0ZW1fbW9kZSkpCisgICAgeworICAgICAgICBjZmctPmRhdGEuc3lzdGVtX21vZGUgPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3lzdGVtX21vZGU7CisgICAgICAgIG1hc2sgJj0gfkJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgc3lzdGVtX21vZGUpOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgY2ZnLT5kYXRhLmtlZXBhbGl2ZV9pbnRlcnZhbCA9IGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV9pbnRlcnZhbCAvIEJDTU9TX01JQ1JPU0VDT05EU19JTl9TRUNPTkRTOworICAgICAgICBtYXNrICY9IH5CQ01PTFRfUFJPUF9NQVNLX0dFVChkZXZpY2UsIF9jZmcsIGtlZXBhbGl2ZV9pbnRlcnZhbCk7CisgICAgfQorCisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpKQorICAgIHsKKyAgICAgICAgY2ZnLT5kYXRhLmtlZXBhbGl2ZV90b2xlcmFuY2UgPSBkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8ua2FfdG9sZXJhbmNlOworICAgICAgICBtYXNrICY9IH5CQ01PTFRfUFJPUF9NQVNLX0dFVChkZXZpY2UsIF9jZmcsIGtlZXBhbGl2ZV90b2xlcmFuY2UpOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pKQorICAgIHsKKyAgICAgICAgY2ZnLT5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5tYWpvciA9IEJDTU9MVF9IT1NUX01BSk9SX1ZFUjsKKyAgICAgICAgY2ZnLT5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5taW5vciA9IEJDTU9MVF9IT1NUX01JTk9SX1ZFUjsKKyAgICAgICAgY2ZnLT5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5yZXZpc2lvbiA9IEJDTU9MVF9IT1NUX1JFVklTSU9OX1ZFUjsKKyAgICAgICAgY2ZnLT5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5tb2RlbCA9IEJDTU9MVF9NT0RFTF9SRVZJU0lPTjsKKyAgICAgICAgc25wcmludGYoCisgICAgICAgICAgICBjZmctPmRhdGEuaG9zdF9zd192ZXJzaW9uLmJ1aWxkX3RpbWUsCisgICAgICAgICAgICBzaXplb2YoY2ZnLT5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5idWlsZF90aW1lKSwKKyAgICAgICAgICAgICIlcyAlcyIsCisgICAgICAgICAgICBfX0RBVEVfXywKKyAgICAgICAgICAgIF9fVElNRV9fKTsKKyAgICAgICAgbWFzayAmPSB+QkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBob3N0X3N3X3ZlcnNpb24pOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBzdGF0ZSkpCisgICAgeworICAgICAgICBjZmctPmRhdGEuc3RhdGUgPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGU7CisgICAgICAgIG1hc2sgJj0gfkJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgc3RhdGUpOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBkZWJ1ZykpCisgICAgeworICAgICAgICBjZmctPmRhdGEuZGVidWcgPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGVidWc7CisgICAgICAgIG1hc2sgJj0gfkJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZGVidWcpOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBubmlfc3BlZWQpKQorICAgIHsKKyAgICAgICAgY2ZnLT5kYXRhLm5uaV9zcGVlZCA9IGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5ubmlfc3BlZWQ7CisgICAgICAgIG1hc2sgJj0gfkJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgbm5pX3NwZWVkKTsKKyAgICB9CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMpKQorICAgIHsKKyAgICAJY2ZnLT5kYXRhLnhncG9uX251bV9vZl9vbnVzID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnhncG9uX251bV9vZl9vbnVzOworICAgIAltYXNrICY9IH5CQ01PTFRfUFJPUF9NQVNLX0dFVChkZXZpY2UsIF9jZmcsIHhncG9uX251bV9vZl9vbnVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWFzazsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfdXBkYXRlX2xvY2FsX2NvbmZpZ3VyYXRpb24oYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnICpjZmcgPSAoY29uc3QgYmNtb2x0X2RldmljZV9jZmcgKiltc2c7CisKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCB8PSBtc2ctPnByZXNlbmNlX21hc2s7CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgc3lzdGVtX21vZGUpKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN5c3RlbV9tb2RlID0gY2ZnLT5kYXRhLnN5c3RlbV9tb2RlOworICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZGVidWcpKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmRlYnVnID0gY2ZnLT5kYXRhLmRlYnVnOworICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgbm5pX3NwZWVkKSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5ubmlfc3BlZWQgPSBjZmctPmRhdGEubm5pX3NwZWVkOworICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV9pbnRlcnZhbCA9IChjZmctPmRhdGEua2VlcGFsaXZlX2ludGVydmFsICogQkNNT1NfTUlDUk9TRUNPTkRTX0lOX1NFQ09ORFMpOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMua2VlcGFsaXZlX2ludGVydmFsID0gY2ZnLT5kYXRhLmtlZXBhbGl2ZV9pbnRlcnZhbDsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5rYV9pbmZvLmthX3RvbGVyYW5jZSA9IGNmZy0+ZGF0YS5rZWVwYWxpdmVfdG9sZXJhbmNlOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMua2VlcGFsaXZlX3RvbGVyYW5jZSA9IGNmZy0+ZGF0YS5rZWVwYWxpdmVfdG9sZXJhbmNlOworICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSkpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMucHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSA9IGNmZy0+ZGF0YS5wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxOworICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5KSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkgPQorICAgICAgICAgICAgY2ZnLT5kYXRhLmVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheTsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZykpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuaW5kaWNhdGlvbl9zaGFwaW5nID0gY2ZnLT5kYXRhLmluZGljYXRpb25fc2hhcGluZzsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSkpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlID0gY2ZnLT5kYXRhLmdwb25feGdwb25fdG9kX2VuYWJsZTsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbiA9IGNmZy0+ZGF0YS5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbjsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSA9IGNmZy0+ZGF0YS5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseTsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmVwb25fc2hhcGVyX21vZGUgPSBjZmctPmRhdGEuZXBvbl9zaGFwZXJfbW9kZTsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGVtYmVkZGVkX2ltYWdlX2xpc3QpKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmVtYmVkZGVkX2ltYWdlX2xpc3QgPSBjZmctPmRhdGEuZW1iZWRkZWRfaW1hZ2VfbGlzdDsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzKSkKKyAgICB7CisgICAgCWRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy54Z3Bvbl9udW1fb2Zfb251cyA9IGNmZy0+ZGF0YS54Z3Bvbl9udW1fb2Zfb251czsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5kZXZpY2VfaXBfYWRkcmVzcyA9IGNmZy0+ZGF0YS5kZXZpY2VfaXBfYWRkcmVzczsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCkpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGV2aWNlX3VkcF9wb3J0ID0gY2ZnLT5kYXRhLmRldmljZV91ZHBfcG9ydDsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgpKQorICAgIHsKKyAgICAJZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGggPSBjZmctPmRhdGEuZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aDsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlKSkKKyAgICB7CisgICAgCWRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy50b2RfdWFydF9iYXVkcmF0ZSA9IGNmZy0+ZGF0YS50b2RfdWFydF9iYXVkcmF0ZTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF92YWxpZGF0ZV9md192ZXJzaW9uKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uICp2ZXJzaW9uKQoreworICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsCisgICAgICAgICJGaXJtd2FyZSBTVyB2ZXJzaW9uICV1LiV1LiV1IChPYmplY3QgbW9kZWwgcmV2aXNpb24gJXUsIEJ1aWxkIHRpbWU6ICVzKVxuIiwKKyAgICAgICAgdmVyc2lvbi0+bWFqb3IsCisgICAgICAgIHZlcnNpb24tPm1pbm9yLAorICAgICAgICB2ZXJzaW9uLT5yZXZpc2lvbiwKKyAgICAgICAgdmVyc2lvbi0+bW9kZWwsCisgICAgICAgIHZlcnNpb24tPmJ1aWxkX3RpbWUpOworCisgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgIkhvc3QgU1cgdmVyc2lvbiAldS4ldS4ldSAoT2JqZWN0IG1vZGVsIHJldmlzaW9uICV1LCBCdWlsZCB0aW1lOiAlcyAlcylcbiIsCisgICAgICAgIEJDTU9MVF9IT1NUX01BSk9SX1ZFUiwKKyAgICAgICAgQkNNT0xUX0hPU1RfTUlOT1JfVkVSLAorICAgICAgICBCQ01PTFRfSE9TVF9SRVZJU0lPTl9WRVIsCisgICAgICAgIEJDTU9MVF9NT0RFTF9SRVZJU0lPTiwKKyAgICAgICAgX19EQVRFX18sCisgICAgICAgIF9fVElNRV9fKTsKKworICAgIC8qIFZlcnNpb24gbWlzbWF0Y2ggLSBub3RlIHRoYXQgb25seSB0aGUgSG9zdC9GaXJtd2FyZSByZXZpc2lvbnMgY2FuIGJlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBob3N0IGFuZCB0aGUgZmlybXdhcmUgKi8KKyAgICBpZiAodmVyc2lvbi0+bWFqb3IgIT0gQkNNT0xUX0hPU1RfTUFKT1JfVkVSIHx8CisgICAgICAgIHZlcnNpb24tPm1pbm9yICE9IEJDTU9MVF9IT1NUX01JTk9SX1ZFUiB8fAorICAgICAgICB2ZXJzaW9uLT5tb2RlbCAhPSBCQ01PTFRfTU9ERUxfUkVWSVNJT04pCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLAorICAgICAgICAgICAgIlNXIFZlcnNpb25zIE1pc21hdGNoOiBIb3N0IFNXIHZlcnNpb24gaXMgJXUuJXUuJXUgd2l0aCBvYmplY3QgbW9kZWwgcmV2aXNpb24gJWQsIHdoaWxlIEZpcm13YXJlIFNXIHZlcnNpb24gaXMgJXUuJXUuJXUgd2l0aCBvYmplY3QgbW9kZWwgcmV2aXNpb24gJXVcbiIsCisgICAgICAgICAgICBCQ01PTFRfSE9TVF9NQUpPUl9WRVIsCisgICAgICAgICAgICBCQ01PTFRfSE9TVF9NSU5PUl9WRVIsCisgICAgICAgICAgICBCQ01PTFRfSE9TVF9SRVZJU0lPTl9WRVIsCisgICAgICAgICAgICBCQ01PTFRfTU9ERUxfUkVWSVNJT04sCisgICAgICAgICAgICB2ZXJzaW9uLT5tYWpvciwKKyAgICAgICAgICAgIHZlcnNpb24tPm1pbm9yLAorICAgICAgICAgICAgdmVyc2lvbi0+cmV2aXNpb24sCisgICAgICAgICAgICB2ZXJzaW9uLT5tb2RlbCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1NUQVRFOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2lmbmRlZiBJTl9CQU5ECitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2N0cmxfcmVnaXN0ZXJfZmxkKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtX2xsX2Rldl9pbmZvIGxsX2luZm87CisKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2Nfc3JhbV9iYXNlID4gMCkKKyAgICB7CisgICAgICAgIC8qIHdlIGhhdmUgYWxyZWFkeSBxdWVyaWVkIHRoZSBQQ0llIC8gcmVnaXN0ZXJlZCB3aXRoIHRoZSBGTEQgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmMgPSBiY21fbGxfcGNpZV9xdWVyeShkZXZpY2UsICZsbF9pbmZvKTsKKyAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJiY21fbGxfcGNpZV9xdWVyeVxuIik7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2NfZGRyX2xlbmd0aCA9IGxsX2luZm8uc29jX2Rkcl9sZW5ndGg7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2Nfc3JhbV9iYXNlID0gbGxfaW5mby5zb2Nfc3JhbV9iYXNlOworICAgIGRldl9jdHJsX2RiW2RldmljZV0uZmxkX2luZm8uc29jX2Rkcl9iYXNlID0gbGxfaW5mby5zb2NfZGRyX2Jhc2U7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2NfcmVnc19iYXNlID0gbGxfaW5mby5zb2NfcmVnc19iYXNlOworCisgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgIkZMRF9JTkZPOiBkZHJfbGVuZ3RoPTB4JXggc3JhbV9iYXNlPSVwIHNvY19kZHJfYmFzZT0lcCBzb2NfcmVnc19iYXNlPSVwXG4iLAorICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmZsZF9pbmZvLnNvY19kZHJfbGVuZ3RoLAorICAgICAgICAodm9pZCAqKWRldl9jdHJsX2RiW2RldmljZV0uZmxkX2luZm8uc29jX3NyYW1fYmFzZSwKKyAgICAgICAgKHZvaWQgKilkZXZfY3RybF9kYltkZXZpY2VdLmZsZF9pbmZvLnNvY19kZHJfYmFzZSwKKyAgICAgICAgKHZvaWQgKilkZXZfY3RybF9kYltkZXZpY2VdLmZsZF9pbmZvLnNvY19yZWdzX2Jhc2UpOworCisgICAgcmMgPSBiY21fZmxkX3JlZ2lzdGVyKGRldmljZSwgJmRldl9jdHJsX2RiW2RldmljZV0uZmxkX2luZm8pOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbV9mbGRfcmVnaXN0ZXJcbiIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9oYW5kbGVfZmlsZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSkKK3sKKyAgICBpbnQzMl90IHJlYWRfbGVuOworICAgIEJDTV9GTERfSE9TVF9ERUJVR19WQUxVRVMgaG9zdF9kZWJ1Z192YWx1ZTsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCBvZmZzZXRfciA9IDAsIG9mZnNldF93ID0gMDsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHdyaXRlX2NvbXBsZXRlWzJdOworICAgIGNvbnN0IGNoYXIgKmltYWdlX25hbWU7CisKKyAgICBCVUdfT04oKGltYWdlX3R5cGUgIT0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVIpICYmIChpbWFnZV90eXBlICE9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTikpOworCisgICAgaW1hZ2VfbmFtZSA9IGltYWdlX3R5cGUgPT0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0FQUExJQ0FUSU9OID8gImFwcGxpY2F0aW9uIiA6ICJib290IGxvYWRlciI7CisKKyAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiTG9hZGluZyAlc1xuIiwgaW1hZ2VfbmFtZSk7CisKKyAgICBob3N0X2RlYnVnX3ZhbHVlID0gaW1hZ2VfdHlwZSA9PSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04gPyBCQ01fRkxEX0hPU1RfV1JJVEVfRERSIDogQkNNX0ZMRF9IT1NUX1dSSVRFX1NSQU07CisgICAgcmMgPSBiY21fZmxkX3NldF9ob3N0X2RlYnVnX3N0YXR1cyhkZXZpY2UsIGhvc3RfZGVidWdfdmFsdWUpOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbV9mbGRfc2V0X2hvc3RfZGVidWdfc3RhdHVzXG4iKTsKKworICAgIC8qIElmIHRoaXMgaXMgdGhlIGFwcGxpY2F0aW9uIGltYWdlLCBza2lwIHRoZSBlbnZlbG9wZSAoanVtcCB0byB0aGUgZGF0YSBpdHNlbGYpLiAqLworICAgIGlmIChpbWFnZV90eXBlID09IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTikKKyAgICB7CisgICAgICAgIGJjbW9sdF9maXJtd2FyZV9lbnZlbG9wZSBlbnZlbG9wZTsKKworICAgICAgICByZWFkX2xlbiA9IGRldl9jdHJsX3BhcmFtcy5pbWFnZV9yZWFkX2NiKGRldmljZSwgaW1hZ2VfdHlwZSwgb2Zmc2V0X3IsICh1aW50OF90ICopJmVudmVsb3BlLCBzaXplb2YoZW52ZWxvcGUpKTsKKyAgICAgICAgaWYgKHJlYWRfbGVuIDwgc2l6ZW9mKGVudmVsb3BlKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJpbWFnZV9yZWFkX2NiIHJldHVybmVkIGVycm9yICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJVcGxvYWQgZmlybXdhcmUgdmVyc2lvbj0ldS4ldS4ldS4ldVxuIiwKKyAgICAgICAgICAgIGVudmVsb3BlLnJldmlzaW9uLnJlbGVhc2VfbWFqb3JfaWQsIGVudmVsb3BlLnJldmlzaW9uLnJlbGVhc2VfbWlub3JfaWQsIGVudmVsb3BlLnJldmlzaW9uLnJlbGVhc2VfcmV2aXNpb25faWQsIGVudmVsb3BlLnJldmlzaW9uLm1vZGVsX2lkKTsKKyAgICAgICAgb2Zmc2V0X3IgKz0gcmVhZF9sZW47CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIHJlYWRfbGVuID0gZGV2X2N0cmxfcGFyYW1zLmltYWdlX3JlYWRfY2IoZGV2aWNlLCBpbWFnZV90eXBlLCBvZmZzZXRfciwgaW1hZ2VfYnVmW2RldmljZV0sIElNQUdFX0JVRl9TSVpFKTsKKyAgICAgICAgaWYgKHJlYWRfbGVuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJpbWFnZV9yZWFkX2NiIHJldHVybmVkIGVycm9yICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFyZWFkX2xlbikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJXcml0aW5nICVzICglZClcbiIsIGltYWdlX25hbWUsIHJlYWRfbGVuKTsKKyAgICAgICAgcmMgPSBiY21fZmxkX3dyaXRlKGRldmljZSwgKGNoYXIgKilpbWFnZV9idWZbZGV2aWNlXSwgcmVhZF9sZW4sIG9mZnNldF93LCBpbWFnZV90eXBlKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiYmNtX2ZsZF93cml0ZSByZXR1cm5lZCBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJSZWFkaW5nICVzIGZvciBjaGVja2luZyAoJWQpXG4iLCBpbWFnZV9uYW1lLCByZWFkX2xlbik7CisgICAgICAgIHJjID0gYmNtX2ZsZF9yZWFkKGRldmljZSwgKGNoYXIgKilyZF9pbWFnZV9idWZbZGV2aWNlXSwgKHVpbnQzMl90ICopJnJlYWRfbGVuLCBvZmZzZXRfdywgaW1hZ2VfdHlwZSk7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgImJjbV9mbGRfcmVhZCByZXR1cm5lZCBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldF9yICs9IHJlYWRfbGVuOworICAgICAgICBvZmZzZXRfdyArPSByZWFkX2xlbjsKKworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ29tcGFyaW5nICVzICglZCkvKCV1KVxuIiwgaW1hZ2VfbmFtZSwgcmVhZF9sZW4sIG9mZnNldF93KTsKKyAgICAgICAgaWYgKG1lbWNtcChyZF9pbWFnZV9idWZbZGV2aWNlXSwgaW1hZ2VfYnVmW2RldmljZV0sIHJlYWRfbGVuKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJFcnJvciBkdXJpbmcgaW1hZ2UgdXBsb2FkaW5nICAleFxuIiwgb2Zmc2V0X3cpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChyZWFkX2xlbik7CisKKyAgICBpZiAoIW9mZnNldF93KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICIlcyBpbWFnZSBmaWxlIGVtcHR5IG9yIGNvcnJ1cHRlZCEhIVxuIiwgaW1hZ2VfbmFtZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworICAgIGlmIChpbWFnZV90eXBlID09IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTikKKyAgICB7CisgICAgICAgIHJlYWRfbGVuID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworICAgICAgICAvKiBmaXJzdCByZWFkIHdvcmQgZnJvbSBzdGFyIG9mIHRoZSBpbWFnZSAqLworICAgICAgICBiY21fZmxkX3JlYWQoZGV2aWNlLCAoY2hhciAqKShsb25nKSZ3cml0ZV9jb21wbGV0ZVswXSwgKHVpbnQzMl90ICopJnJlYWRfbGVuLCAwLCBpbWFnZV90eXBlKTsKKyAgICAgICAgLyogc3luYyBiZWZvcmUgcmVhZCB0YWlsIG9mIGltYWdlICovCisgICAgICAgIGJjbW9zX2JhcnJpZXIoKTsKKyAgICAgICAgLyogcmVhZCBmcm9tIHRhaWwgb2YgdGhlIGltYWdlICovCisgICAgICAgIGJjbV9mbGRfcmVhZCgKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIChjaGFyICopKGxvbmcpJndyaXRlX2NvbXBsZXRlWzFdLAorICAgICAgICAgICAgKHVpbnQzMl90ICopJnJlYWRfbGVuLAorICAgICAgICAgICAgb2Zmc2V0X3cgLSBzaXplb2YodW5zaWduZWQgbG9uZyksCisgICAgICAgICAgICBpbWFnZV90eXBlKTsKKyAgICAgICAgLyogbm93IHdlIGNhbiBiZSBzdXJlIHRoYXQgZnVsbCBpbWFnZSBpbiB0aGUgZW1iZWRkZWQgbWVtb3J5ICovCisgICAgfQorCisgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIlRyYW5zZmVycmVkICV1IGJ5dGVzXG4iLCBvZmZzZXRfdyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRldl9jdHJsX2hhbmRsZV9hcHBsaWNhdGlvbl9pbWFnZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKmRldl9wYXJhbXMgPSAmZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIHJjID0gZGV2X2N0cmxfaGFuZGxlX2ZpbGUoZGV2aWNlLCBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04pOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImRldl9jdHJsX2hhbmRsZV9maWxlKClcbiIpOworICAgIHJjID0gYmNtX2ZsZF9ob3N0X2ZpbmlzaF93cml0ZV9kZHIoZGV2aWNlLCAwKTsKKyAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJiY21fZmxkX2hvc3RfZmluaXNoX3dyaXRlX2RkcigpXG4iKTsKKyAgICByYyA9IGJjbXRybXV4X2Nvbm5lY3QoZGV2aWNlLCBkZXZfcGFyYW1zLT5kZWJ1Zy5ob3N0X2RtYV90eF9xdWV1ZV9zaXplLCBkZXZfcGFyYW1zLT5kZWJ1Zy5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplKTsKKyAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJiY210cm11eF9jb25uZWN0KClcbiIpOworICAgIC8qIFdlIHdhbnQgdGhhdCBpbiBjYXNlIE9OTFkgdGhlIGhvc3QgaXMgcmVzZXQsIE1hcGxlIGVudGVycyBzdGFuZGFsb25lIG1vZGUgLSB0aGlzIG1lYW5zIHdlIG5lZWQgdG8gdHVybiBvZmYgImhvdCByZXNldCIgb24gdGhlIFBDSWUgY2hhbm5lbC4gKi8KKyAgICByYyA9IGJjbV9sbF9wY2llX2hvc3RfcmVzZXRfZW5hYmxlKGRldmljZSxCQ01PU19GQUxTRSk7CisgICAgQkNNX0RFVl9DVFJMX1JFVFVSTl9PTl9FUlJPUihkZXZpY2UsIHJjLCAiYmNtX2xsX3BjaWVfaG9zdF9yZXNldF9lbmFibGUoKVxuIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9oYW5kbGVfYm9vdGxvYWRlcl9pbWFnZShiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCB0ZXN0X2RkcikKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICByYyA9IGRldl9jdHJsX2hhbmRsZV9maWxlKGRldmljZSwgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVIpOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImRldl9jdHJsX2hhbmRsZV9maWxlKClcbiIpOworICAgIHJjID0gYmNtX2ZsZF9zdGFydF9ib290bG9hZGVyKGRldmljZSwgdGVzdF9kZHIpOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbV9mbGRfc3RhcnRfYm9vdGxvYWRlcigpXG4iKTsKKyAgICBiY21vc190aW1lcl9zdGFydCgKKyAgICAgICAgJmRldl9jdHJsX2RiW2RldmljZV0uYm9vdF9zZXFfaW5mby50aW1lci50aW1lciwKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnBvbGxpbmdfaW50ZXJ2YWwpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2N0cmxfc3RhcnRfZmxkKGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90IHRlc3RfZGRyKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGJjbV9mbGRfY2xlYXJfY29tbV9hcmVhKGRldmljZSk7CisKKyAgICByYyA9IGRldl9jdHJsX2hhbmRsZV9ib290bG9hZGVyX2ltYWdlKGRldmljZSwgdGVzdF9kZHIpOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImRldl9jdHJsX2hhbmRsZV9ib290bG9hZGVyX2ltYWdlXG4iKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRldl9jdHJsX2dldF9leGNlcHRpb25fbG9nX2J5X2NwdShiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCBjcHVpZCkKK3sKKyAgICBjaGFyICpleGNlcHRpb25fYnVmOworICAgIGludCBleGNlcHRpb25fYnVmX2xlbjsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGV4Y2VwdGlvbl9idWYgPSBiY21vc19hbGxvYyhCQ01fRkxEX0NQVV9QT1NUTU9SVEVNX0JVRl9TSVpFKTsKKyAgICByYyA9IGJjbV9mbGRfY29weV9leGNlcHRpb25fbG9nKGRldmljZSwgY3B1aWQsIGV4Y2VwdGlvbl9idWYsICZleGNlcHRpb25fYnVmX2xlbik7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJiY21fZmxkX2NvcHlfZXhjZXB0aW9uX2xvZyBmYWlsZWQsIHJjPSV1ICglcylcbiIsIHJjLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIGJjbV9mbGRfY2xlYXJfZXhjZXB0aW9uX3N0YXRlKGRldmljZSwgY3B1aWQpOworCisgICAgZGV2X2N0cmxfc2VuZF9pbmRfZXhjZXB0aW9uX2xvZyhkZXZpY2UsIGNwdWlkLCBleGNlcHRpb25fYnVmKTsKKyAgICByYyA9IEJDTV9FUlJfT0s7CisKK2V4aXQ6CisgICAgYmNtb3NfZnJlZShleGNlcHRpb25fYnVmKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKiBEdW1wIGV4Y2VwdGlvbiBsb2cgaWYgdGhlcmUgaXMgb25lLCByZXR1cm4gQkNNX0VSUl9OT0VOVCBpZiBub3QuICovCitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2N0cmxfZ2V0X2V4Y2VwdGlvbl9sb2dfaWZfcHJlc2VudChiY21vbHRfZGV2aWQgZGV2X2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHVpbnQzMl90IHN0YXRlMCwgc3RhdGUxOworCisgICAgLyogRHVtcCBleGNlcHRpb24gbG9nLCBpZiBhbnkuCisgICAgICogVGhpcyBzaG91bGQgYmUgZG9uZSBwcmlvciB0byB3cml0aW5nIGJvb3Rsb2FkZXIsIGFzIGl0IHdpbGwgb3ZlcndyaXRlIHRoZSBzYW1lIHBsYWNlIGluIFNSQU0uICovCisgICAgcmMgPSBiY21fZmxkX2dldF9leGNlcHRpb25fc3RhdGUoZGV2X2lkLCAmc3RhdGUwLCAmc3RhdGUxKTsKKyAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldl9pZCwgcmMsICJiY21fZmxkX2dldF9leGNlcHRpb25fc3RhdGVcbiIpOworICAgIGlmIChzdGF0ZTApCisgICAgICAgIGRldl9jdHJsX2dldF9leGNlcHRpb25fbG9nX2J5X2NwdShkZXZfaWQsIDApOworICAgIGlmIChzdGF0ZTEpCisgICAgICAgIGRldl9jdHJsX2dldF9leGNlcHRpb25fbG9nX2J5X2NwdShkZXZfaWQsIDEpOworICAgIGlmICghc3RhdGUwICYmICFzdGF0ZTEpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBEdW1wIGV4Y2VwdGlvbiBsb2cgaWYgdGhlcmUgaXMgb25lLCBwcmludCBhIG1lc3NhZ2UgYW5kIHJldHVybiBCQ01fRVJSX09LIGlmIG5vdC4gKi8KK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9nZXRfZXhjZXB0aW9uX2xvZyhiY21vbHRfZGV2aWQgZGV2X2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gZGV2X2N0cmxfZ2V0X2V4Y2VwdGlvbl9sb2dfaWZfcHJlc2VudChkZXZfaWQpOworICAgIGlmIChyYyA9PSBCQ01fRVJSX05PRU5UKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgZGV2X2N0cmxfZGJbZGV2X2lkXS5sb2dfaWQsICJFeGNlcHRpb24gbG9nIGZvciBkZXZpY2UgJWQgaXMgZW1wdHlcbiIsIGRldl9pZCk7CisgICAgICAgIHJjID0gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zd19lcnJvcl90YWJsZV9kdW1wKGJjbW9sdF9kZXZpZCBkZXZfaWQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gZGV2X2N0cmxfZ2V0X3N3X2Vycm9yX3RhYmxlKGRldl9pZCk7CisgICAgdWludDhfdCBpOworCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZfaWRdLmxvZ19pZCwgIkZhaWxlZCB0byByZXRyaWV2ZSBFbWJlZGRlZCBTb2Z0d2FyZSBFcnJvcihzKTogJWRcbiIsIGVycik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2X2lkXS5sb2dfaWQsICJGb3VuZCAldSBFbWJlZGRlZCBTb2Z0d2FyZSBFcnJvcihzKTpcbiIsIGRldl9jdHJsX2RiW2Rldl9pZF0uc3dfZXJyb3JfY291bnQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGV2X2N0cmxfZGJbZGV2X2lkXS5zd19lcnJvcl9jb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2Rldl9pZF0ubG9nX2lkLAorICAgICAgICAgICAgICAgICJcdFslc10gJXM6JXUgaW5zdDoldSBjb3VudDoldSBmaXJzdDolbGx1IGxhc3Q6JWxsdVxuIiwKKyAgICAgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZfaWRdLnN3X2Vycm9yc1tpXS50YXNrX25hbWUsCisgICAgICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2X2lkXS5zd19lcnJvcnNbaV0uZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2X2lkXS5zd19lcnJvcnNbaV0ubGluZV9udW1iZXIsCisgICAgICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2X2lkXS5zd19lcnJvcnNbaV0uaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2X2lkXS5zd19lcnJvcnNbaV0uZXJyb3JfY291bnRlciwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRldl9jdHJsX2RiW2Rldl9pZF0uc3dfZXJyb3JzW2ldLmZpcnN0X2Vycm9yX3RpbWVfdXMsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZfY3RybF9kYltkZXZfaWRdLnN3X2Vycm9yc1tpXS5sYXN0X2Vycm9yX3RpbWVfdXMpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIGRldl9jdHJsX2Nvbm5lY3RfZnJvbV9yZXNldChiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCB0ZXN0X2RkcikKK3sKKyNpZm5kZWYgSU5fQkFORAorICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBkZXZfY3RybF9wYXJhbXMuZGV2aWNlX29uX2NiKGRldmljZSk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKAorICAgICAgICByYyAhPSBCQ01fRVJSX09LLAorICAgICAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1VTRVJfQ0FMTEJBQ0tfRVJST1IsCisgICAgICAgICJkZXZpY2Vfb25fY2JcbiIpOworCisgICAgcmMgPSBkZXZfY3RybF9wYXJhbXMucGNpZV9jaGFubmVsX3ByZXBhcmVfY2IoZGV2aWNlKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4oCisgICAgICAgIHJjICE9IEJDTV9FUlJfT0ssCisgICAgICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVVNFUl9DQUxMQkFDS19FUlJPUiwKKyAgICAgICAgInBjaWVfY2hhbm5lbF9wcmVwYXJlX2NiXG4iKTsKKworCisgICAgcmMgPSBkZXZfY3RybF9yZWdpc3Rlcl9mbGQoZGV2aWNlKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4oCisgICAgICAgIHJjICE9IEJDTV9FUlJfT0ssCisgICAgICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fSU5URVJOQUxfRVJST1IsCisgICAgICAgICJkZXZfY3RybF9yZWdpc3Rlcl9mbGRcbiIpOworCisgICAgZGV2X2N0cmxfZ2V0X2V4Y2VwdGlvbl9sb2coZGV2aWNlKTsKKyAgICBkZXZfY3RybF9zd19lcnJvcl90YWJsZV9kdW1wKGRldmljZSk7CisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIGJjbV9mbGRfc2V0X2hvc3RfZXZlbnQoZGV2aWNlLCBkZXZfY3RybF9kYltkZXZpY2VdLnRyeF9kaXNhYmxlX21hc2spOworI2VuZGlmCisgICAgcmMgPSBkZXZfY3RybF9zdGFydF9mbGQoZGV2aWNlLCB0ZXN0X2Rkcik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKAorICAgICAgICByYyAhPSBCQ01fRVJSX09LLAorICAgICAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0lOVEVSTkFMX0VSUk9SLAorICAgICAgICAiZGV2X2N0cmxfc3RhcnRfZmxkXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05PTkU7Cit9CisKK3N0YXRpYyBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIGRldl9jdHJsX2Nvbm5lY3RfdG9fc3RhbmRhbG9uZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogaWYgTWFwbGUgcnVucyBpbiBzdGFuZGFsb25lIG1vZGUsIGFuZCBob3N0IGRpZCByZXNldCwgd2UgbmVlZCB0byByZWdpc3RlciBtYXBsZSB0byBmbGQgYW5kIGFuZAorICAgICAgIHJlY29ubmVjdCB0aGUgdHJhbnNwb3J0IGxheWVyIC0gbm8gbmVlZCB0byByZXNjYW4sIGl0IHdhcyBkb25lIGF1dG9tYXRpY2FsbHkgYnkgaG9zdCB3aGVuCisgICAgICAgbGxfcGNpZSByZWdpc3RlcmVkIG1hcGxlCisgICAgICAgcmUtc2NhbiB3aXRob3V0IHBhc3NpbmcgdGhydSByZW1vdmUgYW5kIG1hcGxlIG9mZiwgbGV0cyBtYXBsZSBvdXQgb2YgcmVzZXQsIHJlbWFwcGVkLCBidXQgc3R1Y2tlZAorICAgICAgIG5vdCwgcmVhbGx5LCB3b3JraW5nIGluIHN0YW5kYWxvYW5lIG1vZGUKKyAgICAgICAqLworCisgICAgLyogVGhlIGNoaXAgaXMgcnVubmluZyBhbmQgdGhlIFBDSWUgY2hhbm5lbCBoYXJkd2FyZSBpcyBpbml0aWFsaXplZCwgd2UgY2FuIG5vdyBzYWZlbHk6CisgICAgICogLSBSZWdpc3RlciB3aXRoIHRoZSBGTEQgZHJpdmVyLgorICAgICAqIC0gUmVzdGFydCB0aGUgUENJZSBjb25uZWN0aW9uIHByb2Nlc3MuICBBcyBwYXJ0IG9mIHRoaXMgcHJvY2VzcywgdGhlIGhvc3Qgd2lsbCBzZXQgdGhlICdob3N0IHF1ZXVlcyB2YWxpZCcgZmxhZy4KKyAgICAgKiAgIElmIHRoZSBkZXZpY2UgaXMgcnVubmluZyBhbmQgc2VlcyB0aGlzIGZsYWcgaXMgc2V0LCBpdCB3aWxsIHN0YXJ0IHRoZSByZWNvbm5lY3Rpb24gcHJvY2VzcyBhcyB3ZWxsLCBpbiBzeW5jCisgICAgICogICB3aXRoIHRoZSBob3N0LiAgSWYgdGhlIGRldmljZSBmYWlscyB0byBjb25uZWN0LCBpdCBtZWFucyB0aGF0IHRoZSBkZXZpY2UgaXMgdW5yZXNwb25zaXZlLCBzbyB0aGUgYmVzdCB3ZSBjYW4gZG8KKyAgICAgKiAgIGlzIHJlc2V0IHRoZSBkZXZpY2UgYW5kIHJlcHJvZ3JhbSBpdCBmcm9tIHNjcmF0Y2guICovCisjaWZuZGVmIElOX0JBTkQKKyAgICByYyA9IGRldl9jdHJsX3JlZ2lzdGVyX2ZsZChkZXZpY2UpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTigKKyAgICAgICAgcmMgIT0gQkNNX0VSUl9PSywKKyAgICAgICAgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9JTlRFUk5BTF9FUlJPUiwKKyAgICAgICAgImRldl9jdHJsX3JlZ2lzdGVyX2ZsZFxuIik7CisKKyAgICBkZXZfY3RybF9nZXRfZXhjZXB0aW9uX2xvZyhkZXZpY2UpOworCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICBiY21fZmxkX3NldF9ob3N0X2V2ZW50KGRldmljZSwgZGV2X2N0cmxfZGJbZGV2aWNlXS50cnhfZGlzYWJsZV9tYXNrKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiUmVxdWVzdGluZyByZS1jb25uZWN0IHRvIHJ1bm5pbmcgZGV2aWNlLi4uXG4iKTsKKyNpZm5kZWYgSU5fQkFORAorICAgIHJjID0gYmNtdHJtdXhfY29ubmVjdCgKKyAgICAgICAgZGV2aWNlLAorICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGVidWcuaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSwKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmRlYnVnLmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUpOyAKKyNlbHNlCisgICAgIC8qTmVlZCB0byBwYXNzIGluIElQIEFkZHJlc3MgYW5kIFVEUCBwb3J0IHdoZW4gcnVubmluZyBpbiBsaW51eCB1c2VyIHNwYWNlKi8KKyAgICByYyA9IGJjbXRybXV4X2Nvbm5lY3QoZGV2aWNlLAorICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5kZXZpY2VfaXBfYWRkcmVzcywKKyAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGV2aWNlX3VkcF9wb3J0KTsKKworI2VuZGlmCisKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLnN0YXRlID0gREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9TVEFOREFMT05FOworICAgICAgICByZXR1cm4gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ29ubmVjdGlvbiBmYWlsZWQgLSBydW5uaW5nIGRldmljZSBkaWRuJ3QgcmVzcG9uZCB0byBjb25uZWN0aW9uIHJlcXVlc3RcbiIpOworICAgICAgICByZXR1cm4gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9SRUNPTk5FQ1RfVElNRU9VVDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX2Rpc2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEOworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLnNyYW1fbG9nX29mZnNldCA9IDA7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5tc2dzX3JlYWQgPSAwOworI2VuZGlmCisgICAgc3RvcF9rZWVwX2FsaXZlX3Byb2Nlc3MoJmRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mbyk7CisgICAgYmNtb3NfdGltZXJfc3RvcCgmZGV2X2N0cmxfZGJbZGV2aWNlXS5leGNlcHRpb25fbW9uaXRvcl90aW1lci50aW1lcik7CisgICAgZGV2X2N0cmxfaW5pdF9jb25uZWN0aW9uX3N0YXRlKGRldmljZSk7CisgICAgcmMgPSBiY210cm11eF9kaXNjb25uZWN0KGRldmljZSk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0sgJiYgcmMgIT0gQkNNX0VSUl9BTFJFQURZKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJiY210cm11eF9kaXNjb25uZWN0IHJldHVybmVkIGVycm9yOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9wZXJmb3JtX3Jlc2V0X2RldmljZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGRldl9jdHJsX2Rpc2Nvbm5lY3QoZGV2aWNlKTsKKworI2lmbmRlZiBJTl9CQU5ECisgICAgcmMgPSBkZXZfY3RybF9wYXJhbXMucGNpZV9jaGFubmVsX3JlbW92ZV9jYihkZXZpY2UpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJEZXZpY2UgcmVtb3ZlIGNhbGxiYWNrIGZhaWxlZDogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgfQorICAgIHJjID0gZGV2X2N0cmxfcGFyYW1zLmRldmljZV9vZmZfY2IoZGV2aWNlKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiRGV2aWNlIG9mZiBjYWxsYmFjayBmYWlsZWQ6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgIH0KKworICAgIC8qIHRoZSBkZXZpY2UgaGFzIGJlZW4gcmVzZXQgc28gb3VyIEZMRCBpbmZvIGlzIG5vdyBpbnZhbGlkICovCisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2Nfc3JhbV9iYXNlID0gMDsKKyAgICBiY21fZmxkX3VucmVnaXN0ZXIoZGV2aWNlKTsKKyNlbmRpZgorICAgIHJldHVybiByYzsKK30KK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9wZXJmb3JtX3Jlc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X2RldmljZV9yZXNldF9tb2RlIG1vZGUgPSAoKGNvbnN0IGJjbW9sdF9kZXZpY2VfcmVzZXQgKiltc2cpLT5kYXRhLm1vZGU7CisgICAgYmNtb2x0X2RldmlkIGk7CisKKyAgICBzd2l0Y2ggKG1vZGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0RFVklDRToKKyAgICAgICAgcmV0dXJuIGRldl9jdHJsX3BlcmZvcm1fcmVzZXRfZGV2aWNlKGRldmljZSk7CisKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfUkVTRVRfTU9ERV9IT1NUOgorICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPSBCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5pc19ob3N0X3Jlc2V0X3BlbmRpbmcgPSBCQ01PU19UUlVFOworICAgICAgICBkZXZfY3RybF9zZW5kX2RldmljZV9kaXNjb25uZWN0X21zZyhkZXZpY2UsIDApOworICAgICAgICAvKiBpbnN0ZWFkIG9mIHJlc2V0dGluZyB0aGUgaG9zdCByaWdodCBhd2F5LCB3YWl0IGEgZmV3IG1zIHNvIHRoZSBob3N0IGNhbiByZWNlaXZlIHRoZSBhY2sgLyBpbmRpY2F0aW9uICovCisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfY3RybF9kYltkZXZpY2VdLnJlc2V0X2RlbGF5X3RpbWVyLnRpbWVyLCBIT1NUX1JFU0VUX0RFTEFZX1VTKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfUkVTRVRfTU9ERV9BTEw6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9kYltpXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICBkZXZfY3RybF9kYltpXS5pc19ob3N0X3Jlc2V0X3BlbmRpbmcgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgcmMgPSBkZXZfY3RybF9wYXJhbXMuZGV2aWNlX29mZl9jYihpKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2ldLmxvZ19pZCwgIkRldmljZSBvZmYgY2FsbGJhY2sgZmFpbGVkOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBpbnN0ZWFkIG9mIHJlc2V0dGluZyB0aGUgaG9zdCByaWdodCBhd2F5LCB3YWl0IGEgZmV3IG1zIHNvIHRoZSBob3N0IGNhbiByZWNlaXZlIHRoZSBhY2sgLyBpbmRpY2F0aW9uICovCisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfY3RybF9kYltkZXZpY2VdLnJlc2V0X2RlbGF5X3RpbWVyLnRpbWVyLCBIT1NUX1JFU0VUX0RFTEFZX1VTKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIlVucmVjb2duaXplZCByZXNldCBtb2RlOiAlZFxuIiwgbW9kZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfZGlzY29ubmVjdGVkX3N0YXRlX2RldmljZV9jbGVhcl9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgZGV2X2N0cmxfY2xlYXJfZGV2aWNlX2NmZyhkZXZpY2UpOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9kaXNjb25uZWN0ZWRfc3RhdGVfZGV2aWNlX2NvbmZpZ19zZXRfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJPdXIgc2F2ZWQgbWVzc2FnZSB3YXMgaW52YWxpZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZXZfY3RybF91cGRhdGVfbG9jYWxfY29uZmlndXJhdGlvbihkZXZpY2UsIG1zZyk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UtPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgIGJjbXRybXV4X2NvbnRyb2xfdG9faG9zdChkZXZpY2UsIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlKTsKKyAgICBiY21vbHRfbXNnX2ZyZWUoZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UpOworICAgIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfZGlzY29ubmVjdGVkX3N0YXRlX2RldmljZV9jb25maWdfZ2V0X2V2ZW50KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vbHRfcHJlc2VuY2VfbWFzayBtYXNrOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnICpjZmc7CisKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiT3VyIHNhdmVkIG1lc3NhZ2Ugd2FzIGludmFsaWQgLS0tIGFib3J0aW5nXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNmZyA9IChiY21vbHRfZGV2aWNlX2NmZyAqKWRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlOworICAgIGNmZy0+ZGF0YSA9IGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtczsKKyAgICBtYXNrID0gZGV2X2N0cmxfZmlsbF9mcm9tX2xvY2FsKGRldmljZSk7CisKKyAgICBpZiAoKG1hc2sgJiB+ZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zX3ByZXNlbnQpICE9IDApCisgICAgeworICAgICAgICBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9JTlZBTElEX09QLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgcGFyYW1ldGVycyB0aGF0IGhhdmUgbmV2ZXIgYmVlbiBzZXQiKTsKKyAgICB9CisKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZS0+ZGlyID0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0U7CisgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UpOworICAgIGJjbW9sdF9tc2dfZnJlZShkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9kaXNjb25uZWN0ZWRfc3RhdGVfZGV2aWNlX2Nvbm5lY3RfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworI2lmZGVmIElOX0JBTkQKKyAgICBiY21vbHRfZGV2aWNlX2Nvbm5lY3Qgb3BlcjsKKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7fTsgICAKKyNlbHNlCisgICAgYmNtb3NfZXJybm8gcmM7CisjZW5kaWYKKyAgICBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uOworICAgIGJjbW9zX2Jvb2wgaXNfc3RhbmRhbG9uZTsKKworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmlzX2hvc3RfcmVzZXRfcGVuZGluZykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ2Fubm90IGNvbm5lY3Qgd2hpbGUgaG9zdCByZXNldCBpcyBwZW5kaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmbmRlZiBJTl9CQU5ECisgICAgLyogQ2hlY2sgaWYgdGhlIGNoaXAgaXMgcnVubmluZyBpbiBzdGFuZGFsb25lIG1vZGUgKi8KKworICAgIHJjID0gZGV2X2N0cmxfcGFyYW1zLmRldmljZV9pc19ydW5uaW5nX2NiKGRldmljZSwgJmlzX3N0YW5kYWxvbmUpOworCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgImRldmljZV9zdGF0dXNfZ2V0X2NiIHJldHVybmVkIGVycm9yOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiZGV2aWNlX3N0YXR1c19nZXRfY2IgcmV0dXJuZWQgc3VjY2VzczogaXNfc3RhbmRhbG9uZT0lc1xuIiwgaXNfc3RhbmRhbG9uZSA/ICJ5ZXMiIDogIm5vIik7CisKKyAgICAvKiBJZiB0aGUgY2hpcCBpcyBydW5uaW5nIGluIHN0YW5kYWxvbmUgbW9kZSwgY29ubmVjdCB0byBpdDoKKyAgICAgKiAtIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIFBDSWUgY2hhbm5lbCBhbmQgcHJlcGFyZSBpdCBpZiBuZWNlc3NhcnksIHVzaW5nIGhvc3QgY2FsbGJhY2tzCisgICAgICogLSBSZWdpc3RlciB0aGUgZGV2aWNlIGluIHRoZSBGTEQgZHJpdmVyCisgICAgICogLSBVc2UgRkxEIHRvIGFzayB0aGUgZGV2aWNlIHRvIHJlLWluaXRpYWxpemUgaXRzIFBDSWUgdHJhbnNwb3J0IGxheWVyCisgICAgICogLSBJbml0aWFsaXplIHRoZSBob3N0IFBDSWUgdHJhbnNwb3J0IGxheWVyCisgICAgICogT3RoZXJ3aXNlLCB3ZSBtdXN0IHN0YXJ0IHRoZSBib290IHNlcXVlbmNlOgorICAgICAqIC0gUG93ZXIgb24gdGhlIGRldmljZQorICAgICAqIC0gUHJlcGFyZSB0aGUgUENJZSBjaGFubmVsIHZpYSBob3N0IGNhbGxiYWNrCisgICAgICogLSBSZWdpc3RlciB0aGUgZGV2aWNlIGluIHRoZSBGTEQgZHJpdmVyCisgICAgICogLSBDaGVjayBpZiB0aGVyZSBpcyBhbiBleGNlcHRpb24gbG9nIGZyb20gdGhlIGxhc3QgdGltZSB0aGUgYXBwbGljYXRpb24gd2FzIHJ1biAoYW5kIHByaW50IGl0IGlmIHNvKQorICAgICAqIC0gU3RhcnQgdGhlIEZMRCB0aW1lciB0byBsb2FkIHRoZSBib290Y29kZQorICAgICAqIEluIGVpdGhlciBjYXNlLCB0aGUgcmVzdWx0aW5nIHN0YXRlIGlzICdjb25uZWN0aW5nJy4KKyAgICAgKi8KKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8ucG9sbGluZ19jb3VudGVyID0gQk9PVF9TRVFfUE9MTElOR19NQVhfTlVNQkVSOworICAgIGJjbW9zX3RpbWVyX2hhbmRsZXJfc2V0KCZkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8udGltZXIudGltZXIsIGRldl9jdHJsX2Jvb3Rfc2VxX3RpbWVyX2hhbmRsZXIsIGRldmljZSk7CisjZWxzZQorICAgIGlzX3N0YW5kYWxvbmU9IEJDTU9TX1RSVUU7CisjZW5kaWYKKyAgICBpZiAoaXNfc3RhbmRhbG9uZSkKKyAgICB7CisgICAgICAgIGZhaWxfcmVhc29uID0gZGV2X2N0cmxfY29ubmVjdF90b19zdGFuZGFsb25lKGRldmljZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZhaWxfcmVhc29uID0gZGV2X2N0cmxfY29ubmVjdF9mcm9tX3Jlc2V0KGRldmljZSwgMCk7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLnN0YXRlID0gREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9FU1RBQkxJU0hJTkc7CisgICAgfQorCisgICAgaWYgKGZhaWxfcmVhc29uID09IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fTk9ORSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby50aW1lci50aW1lciwgREVWSUNFX0NPTlRST0xfQ09OTkVDVF9USU1FX1VTKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9DT05ORUNUSU5HOworICAgICAgICBCQ01fTE9HKERFQlVHLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgImJlZ2FuIGNvbm5lY3RpbmcgdG8gJXNcbiIsIGlzX3N0YW5kYWxvbmUgPyAic3RhbmRieSBkZXZpY2UiIDogImRldmljZSBmcm9tIHJlc2V0Iik7CisKKyNpZm5kZWYgSU5fQkFORAorICAgIC8qRG8gbm90aGluZyovCisjZWxzZQorICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgY29ubmVjdCwga2V5KTsKKyAgICBvcGVyLmhkci5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9TRVQ7CisgICAgKHZvaWQpYmNtdHJtdXhfY29udHJvbF90b19saW5lKGRldmljZSwgJm9wZXIuaGRyLmhkcik7CisgICAgYmNtb3NfcHJpbnRmKCJTZW50IGNvbm5lY3QgdG8gZW1iZWRkZWQuLi5cbiIpOworI2VuZGlmCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsCisgICAgICAgICAgICAiZmFpbGVkIHRvIGJlZ2luIGNvbm5lY3Rpb24gcHJvY2VzczogJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIGJjbV9zdHJfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uKGZhaWxfcmVhc29uKSwKKyAgICAgICAgICAgIGZhaWxfcmVhc29uKTsKKyAgICAgICAgZGV2X2N0cmxfc2VuZF9pbmRfY29ubmVjdGlvbl9mYWlsdXJlKGRldmljZSwgZmFpbF9yZWFzb24pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfZGlzY29ubmVjdGVkX3N0YXRlX2RldmljZV9yZXNldF9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgZGV2X2N0cmxfcGVyZm9ybV9yZXNldChkZXZpY2UsIG1zZyk7Cit9CisKKyNpZm5kZWYgSU5fQkFORAorc3RhdGljIHZvaWQgZGV2X2N0cmxfZGlzY29ubmVjdGVkX3N0YXRlX2RldmljZV9ydW5fZGRyX3Rlc3RfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gZmFpbF9yZWFzb247CisgICAgdWludDMyX3QgdGVzdF9kZHIgPSAwOworCisgICAgY29uc3QgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSAqcGFyYW1zID0gJigoY29uc3QgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3QgKiltc2cpLT5kYXRhOworICAgIGlmIChwYXJhbXMtPmNwdSkKKyAgICB7CisgICAgICAgIHRlc3RfZGRyIHw9IEJDTV9GTERfSE9TVF9SVU5fQ1BVX0REUl9URVNUX01BU0s7CisgICAgfQorICAgIGlmIChwYXJhbXMtPnJhc18wKQorICAgIHsKKyAgICAgICAgdGVzdF9kZHIgfD0gQkNNX0ZMRF9IT1NUX1JVTl9SQVNfMF9URVNUX01BU0s7CisgICAgfQorICAgIGlmIChwYXJhbXMtPnJhc18xKQorICAgIHsKKyAgICAgICAgdGVzdF9kZHIgfD0gQkNNX0ZMRF9IT1NUX1JVTl9SQVNfMV9URVNUX01BU0s7CisgICAgfQorCisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnBvbGxpbmdfY291bnRlciA9IEREUl9URVNUX1BPTExJTkdfTUFYX05VTUJFUjsKKyAgICBiY21vc190aW1lcl9oYW5kbGVyX3NldCgmZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnRpbWVyLnRpbWVyLCBkZXZfY3RybF9kZHJfdGVzdF90aW1lcl9oYW5kbGVyLCBkZXZpY2UpOworICAgIGZhaWxfcmVhc29uID0gZGV2X2N0cmxfY29ubmVjdF9mcm9tX3Jlc2V0KGRldmljZSwgdGVzdF9kZHIpOworICAgIGlmIChmYWlsX3JlYXNvbiA9PSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05PTkUpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPSBCQ01PTFRfREVWSUNFX1NUQVRFX1RFU1RJTkdfRERSOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlIGluZCA9IHt9OworICAgICAgICBCQ01PTFRfQVVUT19JTklUKCZpbmQsIGRldmljZSwgZGRyX3Rlc3RfY29tcGxldGUpOworICAgICAgICBpbmQuZGF0YS5kZHJfdGVzdC5zdGF0dXMgPSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTk5FQ1RJT05fRkFJTEVEOworICAgICAgICBpbmQuZGF0YS5kZHJfdGVzdC51LmNvbm5lY3Rpb25fZmFpbGVkLnJlYXNvbiA9IGZhaWxfcmVhc29uOworICAgICAgICBkZXZfY3RybF9zZW5kX2luZGljYXRpb24oZGV2aWNlLCAmaW5kLmhkci5oZHIpOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF90ZXN0aW5nX2Rkcl9zdGF0ZV9kZHJfdGVzdF9jb21wbGV0ZWRfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGUgaW5kID0ge307CisKKyAgICBCQ01PTFRfQVVUT19JTklUKCZpbmQsIGRldmljZSwgZGRyX3Rlc3RfY29tcGxldGUpOworCisgICAgaW5kLmRhdGEuZGRyX3Rlc3Quc3RhdHVzID0gQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT01QTEVURUQ7CisgICAgaW5kLmRhdGEuZGRyX3Rlc3QudS5jb21wbGV0ZWQuY3B1X3Jlc3VsdCA9IGJjbV9mbGRfZGRyX3Rlc3RfcmVzdWx0X2dldChkZXZpY2UsIDApOworICAgIGluZC5kYXRhLmRkcl90ZXN0LnUuY29tcGxldGVkLnJhc18wX3Jlc3VsdCA9IGJjbV9mbGRfZGRyX3Rlc3RfcmVzdWx0X2dldChkZXZpY2UsIDEpOworICAgIGluZC5kYXRhLmRkcl90ZXN0LnUuY29tcGxldGVkLnJhc18xX3Jlc3VsdCA9IGJjbV9mbGRfZGRyX3Rlc3RfcmVzdWx0X2dldChkZXZpY2UsIDIpOworCisgICAgZGV2X2N0cmxfcGVyZm9ybV9yZXNldF9kZXZpY2UoZGV2aWNlKTsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPSBCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRDsKKworICAgIGRldl9jdHJsX3NlbmRfaW5kaWNhdGlvbihkZXZpY2UsICZpbmQuaGRyLmhkcik7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3Rlc3RpbmdfZGRyX3N0YXRlX2Rkcl90ZXN0X3RpbWVvdXRfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGUgaW5kID0ge307CisKKyAgICBkZXZfY3RybF9wZXJmb3JtX3Jlc2V0X2RldmljZShkZXZpY2UpOworICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEOworCisgICAgQkNNT0xUX0FVVE9fSU5JVCgmaW5kLCBkZXZpY2UsIGRkcl90ZXN0X2NvbXBsZXRlKTsKKyAgICBpbmQuZGF0YS5kZHJfdGVzdC5zdGF0dXMgPSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX1RJTUVPVVQ7CisgICAgZGV2X2N0cmxfc2VuZF9pbmRpY2F0aW9uKGRldmljZSwgJmluZC5oZHIuaGRyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9jb25uZWN0aW5nX3N0YXRlX2Nvbm5lY3Rpb25fZmFpbHVyZV9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgZGV2X2N0cmxfZGlzY29ubmVjdChkZXZpY2UpOworICAgIGRldl9jdHJsX3NlbmRfaW5kX2Nvbm5lY3Rpb25fZmFpbHVyZV9mcm9tX21zZyhkZXZpY2UsIG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGVfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLnN0YXRlID09IERFVl9DVFJMX0NPTk5FQ1RJTkdfU1RBVEVfRVNUQUJMSVNISU5HKQorICAgIHsKKyAgICAgICAgLyogSW5pdGlhbCBjb25uZWN0aW9uIGlzIGNvbXBsZXRlLCBub3cgd2FpdCBmb3IgdGhlIGZpcm13YXJlIHRvIGJlIGluaXRpYWxpemVkLiAqLworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5zdGF0ZSA9IERFVl9DVFJMX0NPTk5FQ1RJTkdfU1RBVEVfQ09ORklHVVJJTkc7CisgICAgICAgIGRldl9jdHJsX3NlbmRfY29uZmlnX3NldF9tc2coCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAmZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zKTsKKyAgICAgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLmNvbmZpZ19zZW5kX2NvdW50ZXIgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5jb25maWdfc2VuZF9jb3VudGVyLS07CisgICAgICAgIH0KKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoCisgICAgICAgICAgICAmZGV2X2N0cmxfZGJbZGV2aWNlXS5jb25uZWN0aW9uX2luZm8udGltZXIudGltZXIsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5jb25maWdfaW50ZXJ2YWwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBJbml0aWFsIGNvbm5lY3Rpb24gd2FzIGFscmVhZHkgZG9uZSAtIHNvbWV0aGluZyBtdXN0IGhhdmUgZ29uZSB3cm9uZy4gIFRyeSBhZ2Fpbi4gKi8KKyAgICAgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLmNvbmZpZ19zZW5kX2NvdW50ZXIgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9zZW5kX2NvbmZpZ19zZXRfbXNnKAorICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMpOworICAgICAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoCisgICAgICAgICAgICAgICAgJmRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLnRpbWVyLnRpbWVyLAorICAgICAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLmNvbmZpZ19pbnRlcnZhbCk7CisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5jb25maWdfc2VuZF9jb3VudGVyLS07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9kaXNjb25uZWN0KGRldmljZSk7CisgICAgICAgICAgICBkZXZfY3RybF9zZW5kX2luZF9jb25uZWN0aW9uX2ZhaWx1cmUoZGV2aWNlLCBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgZGV2X2N0cmxfbm5pX3NwZWVkX2VxdWFsKGNvbnN0IGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkICphLCBjb25zdCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqYikKK3sKKyAgICByZXR1cm4gKGEtPmZpcnN0X2hhbGYgPT0gYi0+Zmlyc3RfaGFsZiAmJiBhLT5zZWNvbmRfaGFsZiA9PSBiLT5zZWNvbmRfaGFsZik7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGVfZGV2aWNlX3JlYWR5X2V2ZW50KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBjb25zdCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeSAqcmVhZHlfbXNnID0gKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5ICopbXNnOworICAgIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gZmFpbF9yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0Y7CisKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5jb25uZWN0aW9uX2luZm8uc3RhdGUgPT0gREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9FU1RBQkxJU0hJTkcpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIlVuZXhwZWN0ZWQgJ2RldmljZSByZWFkeScgaW5kaWNhdGlvbiBiZWZvcmUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocmVhZHlfbXNnLT5kYXRhLnN5c3RlbV9tb2RlICE9IGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zeXN0ZW1fbW9kZSkKKyAgICB7CisgICAgICAgIGZhaWxfcmVhc29uID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TWVNURU1fTU9ERV9NSVNNQVRDSDsKKyAgICB9CisgICAgZWxzZSBpZiAoKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYgQkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBubmlfc3BlZWQpKSAhPSAwICYmCisgICAgICAgICFkZXZfY3RybF9ubmlfc3BlZWRfZXF1YWwoJnJlYWR5X21zZy0+ZGF0YS5ubmlfc3BlZWQsICZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMubm5pX3NwZWVkKSkKKyAgICB7CisgICAgICAgIGZhaWxfcmVhc29uID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9OTklfU1BFRURfTUlTTUFUQ0g7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gZGV2X2N0cmxfdmFsaWRhdGVfZndfdmVyc2lvbihkZXZpY2UsICZyZWFkeV9tc2ctPmRhdGEuZmlybXdhcmVfc3dfdmVyc2lvbik7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsX3JlYXNvbiA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU09GVFdBUkVfVkVSU0lPTl9NSVNNQVRDSDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmYWlsX3JlYXNvbiA9PSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZmlybXdhcmVfc3dfdmVyc2lvbiA9IHJlYWR5X21zZy0+ZGF0YS5maXJtd2FyZV9zd192ZXJzaW9uOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuY2hpcF9yZXZpc2lvbiA9IHJlYWR5X21zZy0+ZGF0YS5jaGlwX3JldmlzaW9uOworICAgICAgICBpZiAoKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYgQkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBubmlfc3BlZWQpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMubm5pX3NwZWVkID0gcmVhZHlfbXNnLT5kYXRhLm5uaV9zcGVlZDsKKyAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50IHw9IEJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgbm5pX3NwZWVkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8ua2FfaW50ZXJ2YWwgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBzdGFydF9rZWVwX2FsaXZlX3Byb2Nlc3MoJmRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mbyk7CisgICAgICAgIH0KKworI2lmbmRlZiBJTl9CQU5ECisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfY3RybF9kYltkZXZpY2VdLmV4Y2VwdGlvbl9tb25pdG9yX3RpbWVyLnRpbWVyLCBFWENFUFRJT05fTE9HX01PTklUT1JfSU5URVJWQUwpOworI2VuZGlmCisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfUkVBRFk7CisgICAgICAgIGRldl9jdHJsX3NlbmRfaW5kX2Nvbm5lY3Rpb25fY29tcGxldGUoCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5zdGF0ZSA9PSBERVZfQ1RSTF9DT05ORUNUSU5HX1NUQVRFX1NUQU5EQUxPTkUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkZXZfY3RybF9zZW5kX2RldmljZV9kaXNjb25uZWN0X21zZyhkZXZpY2UsIDApOworICAgICAgICBkZXZfY3RybF9kaXNjb25uZWN0KGRldmljZSk7CisgICAgICAgIGRldl9jdHJsX3NlbmRfaW5kX2Nvbm5lY3Rpb25fZmFpbHVyZShkZXZpY2UsIGZhaWxfcmVhc29uKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGVfcmVjZWl2ZWRfYWNrKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICAvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgdGhlIEFDSyByZXNwb25zZSBhZ2FpbnN0IHRoZSBjb25maWd1cmFpdG9uIHNldCBtZXNzYWdlIHdoaWNoIHdhcyBzZW50IHdoaWxlIHRoZQorICAgICAqIHN0YXRlLW1hY2hpbmUgYXMgcGFydCBvZiB0aGUgaW5pdGlhbCBjb25uZWN0aW9uIHByb2Nlc3MuICBJZiB0aGUgcmVzdWx0IGlzIE9LLCB3ZSBzaG91bGQganVzdCBtb3ZlIG9uIGFuZCBrZWVwCisgICAgICogd2FpdGluZyBmb3IgdGhlICJyZWFkeSIgaW5kaWNhdGlvbi4gIElmIHRoZSByZXN1bHQgaXMgbm90IE9LLCB0aGUgZGV2aWNlIHJlamVjdGVkIHRoZSBjb25maWd1cmF0aW9uIHNvIHdlCisgICAgICogc2hvdWxkIGRpc2Nvbm5lY3QgdGhlIGRldmljZSBhbmQgc2VuZCBhIGZhaWx1cmUgaW5kaWNhdGlvbi4gKi8KKyAgICBpZiAobXNnLT5lcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gZmFpbF9yZWFzb247CisKKyAgICAgICAgZGV2X2N0cmxfZGlzY29ubmVjdChkZXZpY2UpOworCisgICAgICAgIC8qIEZpZ3VyZSBvdXQgd2hpY2ggZmFpbHVyZSByZWFzb24gYmFzZWQgb24gdGhlIG1lc3NhZ2UgZXJyb3IgY29kZS4gKi8KKyAgICAgICAgc3dpdGNoIChtc2ctPmVycikKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIGZhaWxfcmVhc29uID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TWVNURU1fTU9ERV9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNX0VSUl9QQVJNOgorICAgICAgICAgICAgZmFpbF9yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZmFpbF9yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0lOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZXZfY3RybF9zZW5kX2luZF9jb25uZWN0aW9uX2ZhaWx1cmUoZGV2aWNlLCBmYWlsX3JlYXNvbik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9yZWFkeV9zdGF0ZV9kZXZpY2VfY29uZmlnX3NldF9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgY29uc3QgYmNtb2x0X2RldmljZV9jZmcgKmNmZyA9IChjb25zdCBiY21vbHRfZGV2aWNlX2NmZyAqKW1zZzsKKworICAgIGRldl9jdHJsX3NlbmRfY29uZmlnX3NldF9tc2coZGV2aWNlLCBtc2ctPnByZXNlbmNlX21hc2ssIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlLT5jb3JyX3RhZywgJmNmZy0+ZGF0YSk7CisKKyAgICBiY21vc190aW1lcl9zdGFydCgmZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcmVzcG9uc2VfdGltZXIudGltZXIsIERFVklDRV9SRVNQT05TRV9USU1FT1VUX0xFTkdUSCk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9XQUlUSU5HX0ZPUl9ERVZJQ0U7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3JlYWR5X3N0YXRlX2RldmljZV9jb25maWdfZ2V0X2V2ZW50KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vbHRfcHJlc2VuY2VfbWFzayBtYXNrOworCisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIk91ciBzYXZlZCBtZXNzYWdlIHdhcyBpbnZhbGlkIC0tLSBhYm9ydGluZ1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtYXNrID0gZGV2X2N0cmxfZmlsbF9mcm9tX2xvY2FsKGRldmljZSk7CisgICAgaWYgKG1hc2sgPT0gMCkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlLT5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRTsKKyAgICAgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UpOworICAgICAgICBiY21vbHRfbXNnX2ZyZWUoZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UpOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9yZXNwb25zZV90aW1lci50aW1lciwgREVWSUNFX1JFU1BPTlNFX1RJTUVPVVRfTEVOR1RIKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9XQUlUSU5HX0ZPUl9ERVZJQ0U7CisgICAgICAgIGRldl9jdHJsX3NlbmRfY29uZmlnX2dldF9tc2coZGV2aWNlLCBtYXNrLCBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZS0+Y29ycl90YWcpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfcmVhZHlfc3RhdGVfZGV2aWNlX2Rpc2Nvbm5lY3RfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGRldl9jdHJsX3NlbmRfZGV2aWNlX2Rpc2Nvbm5lY3RfbXNnKGRldmljZSwgMCk7CisgICAgZGV2X2N0cmxfZGlzY29ubmVjdChkZXZpY2UpOworICAgIGRldl9jdHJsX3NlbmRfaW5kX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUoZGV2aWNlKTsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfcmVhZHlfc3RhdGVfZGV2aWNlX3Jlc2V0X2V2ZW50KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBkZXZfY3RybF9wZXJmb3JtX3Jlc2V0KGRldmljZSwgbXNnKTsKKyAgICBkZXZfY3RybF9zZW5kX2luZF9kaXNjb25uZWN0aW9uX2NvbXBsZXRlKGRldmljZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3JlYWR5X3N0YXRlX2Nvbm5lY3Rpb25fZmFpbHVyZV9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgZGV2X2N0cmxfZGlzY29ubmVjdChkZXZpY2UpOworICAgIGRldl9jdHJsX3NlbmRfaW5kX2Nvbm5lY3Rpb25fZmFpbHVyZV9mcm9tX21zZyhkZXZpY2UsIG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3dhaXRpbmdfZm9yX2RldmljZV9zdGF0ZV90aW1lcl90aW1lb3V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiT3VyIHNhdmVkIG1lc3NhZ2Ugd2FzIGludmFsaWQgLS0tIGFib3J0aW5nXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSwKKyAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICBCQ01fRVJSX0lOVEVSTkFMLAorICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICJObyByZXNwb25zZSB0byBjb25maWd1cmF0aW9uIG1lc3NhZ2UgZnJvbSBlbWJlZGRlZCIpOworICAgIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlLT5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRTsKKyAgICBiY210cm11eF9jb250cm9sX3RvX2hvc3QoZGV2aWNlLCBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSk7CisgICAgYmNtb2x0X21zZ19mcmVlKGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlKTsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSA9IE5VTEw7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9SRUFEWTsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfd2FpdGluZ19mb3JfZGV2aWNlX3N0YXRlX3JlY2VpdmVkX2FjayhiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtb3NfdGltZXJfc3RvcCgmZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcmVzcG9uc2VfdGltZXIudGltZXIpOworCisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIk91ciBzYXZlZCBtZXNzYWdlIHdhcyBpbnZhbGlkIC0tLSBhYm9ydGluZ1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobXNnLT5jb3JyX3RhZyAhPSBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZS0+Y29ycl90YWcpCisgICAgeworICAgICAgICAvKiBpZ25vcmUgdGhpcyByZXNwb25zZSBhcyBpdCB3YXMgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gb3VyIHJlcXVlc3QgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtc2ctPmVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UtPmVyciA9IG1zZy0+ZXJyOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZS0+ZXJyX2ZpZWxkX2lkeCA9IG1zZy0+ZXJyX2ZpZWxkX2lkeDsKKyAgICAgICAgbWVtY3B5KGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlLT5lcnJfdGV4dCwgbXNnLT5lcnJfdGV4dCwgc2l6ZW9mKG1zZy0+ZXJyX3RleHQpKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UtPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgICAgICBiY210cm11eF9jb250cm9sX3RvX2hvc3QoZGV2aWNlLCBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSk7CisgICAgICAgIGJjbW9sdF9tc2dfZnJlZShkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSk7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlID0gTlVMTDsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9SRUFEWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtc2ctPnR5cGUgPT0gQkNNT0xUX01TR19UWVBFX0dFVCkKKyAgICB7CisgICAgICAgIGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnICpzb3VyY2UgPSAoY29uc3QgYmNtb2x0X2RldmljZV9jZmcgKiltc2c7CisgICAgICAgIGJjbW9sdF9kZXZpY2VfY2ZnICpkZXN0ID0gKGJjbW9sdF9kZXZpY2VfY2ZnICopZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2U7CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZGF0YS5wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxID0gc291cmNlLT5kYXRhLnByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmRhdGEuZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5ID0gc291cmNlLT5kYXRhLmVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZGF0YS5pbmRpY2F0aW9uX3NoYXBpbmcgPSBzb3VyY2UtPmRhdGEuaW5kaWNhdGlvbl9zaGFwaW5nOworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9lbmFibGUpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5kYXRhLmdwb25feGdwb25fdG9kX2VuYWJsZSA9IHNvdXJjZS0+ZGF0YS5ncG9uX3hncG9uX3RvZF9lbmFibGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZGF0YS5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbiA9IHNvdXJjZS0+ZGF0YS5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5kYXRhLmdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5ID0gc291cmNlLT5kYXRhLmdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5OworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmRhdGEuZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQgPSBzb3VyY2UtPmRhdGEuZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24pKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5kYXRhLmZpcm13YXJlX3N3X3ZlcnNpb24gPSBzb3VyY2UtPmRhdGEuZmlybXdhcmVfc3dfdmVyc2lvbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgY2hpcF9yZXZpc2lvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmRhdGEuY2hpcF9yZXZpc2lvbiA9IHNvdXJjZS0+ZGF0YS5jaGlwX3JldmlzaW9uOworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBjaGlwX3RlbXBlcmF0dXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZGF0YS5jaGlwX3RlbXBlcmF0dXJlID0gc291cmNlLT5kYXRhLmNoaXBfdGVtcGVyYXR1cmU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5kYXRhLmVwb25fc2hhcGVyX21vZGUgPSBzb3VyY2UtPmRhdGEuZXBvbl9zaGFwZXJfbW9kZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmRhdGEuZW1iZWRkZWRfaW1hZ2VfbGlzdCA9IHNvdXJjZS0+ZGF0YS5lbWJlZGRlZF9pbWFnZV9saXN0OworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBjaGlwX3ZvbHRhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5kYXRhLmNoaXBfdm9sdGFnZSA9IHNvdXJjZS0+ZGF0YS5jaGlwX3ZvbHRhZ2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmRhdGEuZXBvbl90b2Rfc3RyaW5nID0gc291cmNlLT5kYXRhLmVwb25fdG9kX3N0cmluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMpKQorICAgICAgICB7CisgICAgICAgIAlkZXN0LT5kYXRhLnhncG9uX251bV9vZl9vbnVzID0gc291cmNlLT5kYXRhLnhncG9uX251bV9vZl9vbnVzOworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAJZGVzdC0+ZGF0YS5ncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoID0gc291cmNlLT5kYXRhLmdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlKSkKKyAgICAgICAgeworICAgICAgICAJZGVzdC0+ZGF0YS50b2RfdWFydF9iYXVkcmF0ZSA9IHNvdXJjZS0+ZGF0YS50b2RfdWFydF9iYXVkcmF0ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtc2ctPnR5cGUgPT0gQkNNT0xUX01TR19UWVBFX1NFVCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZXZpY2VfY2ZnICpzb3VyY2UgPSAoYmNtb2x0X2RldmljZV9jZmcgKilkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZTsKKyAgICAgICAgYmNtb2x0X2RldmljZV9jZmdfZGF0YSAqZGVzdCA9ICZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXM7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50IHw9IHNvdXJjZS0+aGRyLmhkci5wcmVzZW5jZV9tYXNrOworICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEgPSBzb3VyY2UtPmRhdGEucHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5KSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5ID0gc291cmNlLT5kYXRhLmVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+aW5kaWNhdGlvbl9zaGFwaW5nID0gc291cmNlLT5kYXRhLmluZGljYXRpb25fc2hhcGluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+Z3Bvbl94Z3Bvbl90b2RfZW5hYmxlID0gc291cmNlLT5kYXRhLmdwb25feGdwb25fdG9kX2VuYWJsZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbiA9IHNvdXJjZS0+ZGF0YS5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSA9IHNvdXJjZS0+ZGF0YS5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5lcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCA9IHNvdXJjZS0+ZGF0YS5lcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZXBvbl90b2Rfc3RyaW5nID0gc291cmNlLT5kYXRhLmVwb25fdG9kX3N0cmluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZXBvbl9zaGFwZXJfbW9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmVwb25fc2hhcGVyX21vZGUgPSBzb3VyY2UtPmRhdGEuZXBvbl9zaGFwZXJfbW9kZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwga2VlcGFsaXZlX3RvbGVyYW5jZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV90b2xlcmFuY2UgPSBzb3VyY2UtPmRhdGEua2VlcGFsaXZlX3RvbGVyYW5jZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5rYV9pbmZvLmthX2ludGVydmFsID0gc291cmNlLT5kYXRhLmtlZXBhbGl2ZV9pbnRlcnZhbCAqIEJDTU9TX01JQ1JPU0VDT05EU19JTl9TRUNPTkRTOworICAgICAgICAgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV9pbnRlcnZhbCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhcnRfa2VlcF9hbGl2ZV9wcm9jZXNzKCZkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3Bfa2VlcF9hbGl2ZV9wcm9jZXNzKCZkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAJZGVzdC0+Z3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCA9IHNvdXJjZS0+ZGF0YS5ncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgCWRlc3QtPnRvZF91YXJ0X2JhdWRyYXRlID0gc291cmNlLT5kYXRhLnRvZF91YXJ0X2JhdWRyYXRlOworICAgICAgICB9CisgICAgfQorCisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UtPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgIGJjbXRybXV4X2NvbnRyb2xfdG9faG9zdChkZXZpY2UsIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlKTsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPSBCQ01PTFRfREVWSUNFX1NUQVRFX1JFQURZOworICAgIGJjbW9sdF9tc2dfZnJlZShkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPSBOVUxMOworfQorCitzdGF0aWMgZGV2X2N0cmxfc21fY2IgZGV2X2N0cmxfc21bQkNNT0xUX0RFVklDRV9TVEFURV9fTlVNX09GXVtERVZJQ0VfQ09OVFJPTF9FVkVOVF9fTlVNX09GXSA9Cit7CisgICAgW0JDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEXSA9CisgICAgeworICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NMRUFSXSA9IGRldl9jdHJsX2Rpc2Nvbm5lY3RlZF9zdGF0ZV9kZXZpY2VfY2xlYXJfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ09ORklHX1NFVF0gPSBkZXZfY3RybF9kaXNjb25uZWN0ZWRfc3RhdGVfZGV2aWNlX2NvbmZpZ19zZXRfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ09ORklHX0dFVF0gPSBkZXZfY3RybF9kaXNjb25uZWN0ZWRfc3RhdGVfZGV2aWNlX2NvbmZpZ19nZXRfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ09OTkVDVF0gPSBkZXZfY3RybF9kaXNjb25uZWN0ZWRfc3RhdGVfZGV2aWNlX2Nvbm5lY3RfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfUkVTRVRdID0gZGV2X2N0cmxfZGlzY29ubmVjdGVkX3N0YXRlX2RldmljZV9yZXNldF9ldmVudCwKKyNpZm5kZWYgSU5fQkFORAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfUlVOX0REUl9URVNUXSA9IGRldl9jdHJsX2Rpc2Nvbm5lY3RlZF9zdGF0ZV9kZXZpY2VfcnVuX2Rkcl90ZXN0X2V2ZW50LAorI2VuZGlmCisgICAgfSwKKworICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX0NPTk5FQ1RJTkddID0KKyAgICB7CisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0ZBSUxVUkVdID0gZGV2X2N0cmxfY29ubmVjdGluZ19zdGF0ZV9jb25uZWN0aW9uX2ZhaWx1cmVfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0VTVEFCTElTSEVEXSA9IGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGVfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9ldmVudCwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9SRUFEWV0gPSBkZXZfY3RybF9jb25uZWN0aW5nX3N0YXRlX2RldmljZV9yZWFkeV9ldmVudCwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9SRUNFSVZFRF9BQ0tdID0gZGV2X2N0cmxfY29ubmVjdGluZ19zdGF0ZV9yZWNlaXZlZF9hY2ssCisgICAgfSwKKworICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX1JFQURZXSA9CisgICAgeworICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NPTkZJR19TRVRdID0gZGV2X2N0cmxfcmVhZHlfc3RhdGVfZGV2aWNlX2NvbmZpZ19zZXRfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ09ORklHX0dFVF0gPSBkZXZfY3RybF9yZWFkeV9zdGF0ZV9kZXZpY2VfY29uZmlnX2dldF9ldmVudCwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9ESVNDT05ORUNUXSA9IGRldl9jdHJsX3JlYWR5X3N0YXRlX2RldmljZV9kaXNjb25uZWN0X2V2ZW50LAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFU0VUXSA9IGRldl9jdHJsX3JlYWR5X3N0YXRlX2RldmljZV9yZXNldF9ldmVudCwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0NPTk5FQ1RJT05fRkFJTFVSRV0gPSBkZXZfY3RybF9yZWFkeV9zdGF0ZV9jb25uZWN0aW9uX2ZhaWx1cmVfZXZlbnQsCisgICAgfSwKKworICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX1dBSVRJTkdfRk9SX0RFVklDRV0gPQorICAgIHsKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9USU1FUl9USU1FT1VUXSA9IGRldl9jdHJsX3dhaXRpbmdfZm9yX2RldmljZV9zdGF0ZV90aW1lcl90aW1lb3V0LAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFQ0VJVkVEX0FDS10gPSBkZXZfY3RybF93YWl0aW5nX2Zvcl9kZXZpY2Vfc3RhdGVfcmVjZWl2ZWRfYWNrCisgICAgfSwKKworI2lmbmRlZiBJTl9CQU5ECisgICAgW0JDTU9MVF9ERVZJQ0VfU1RBVEVfVEVTVElOR19ERFJdID0KKyAgICB7CisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERFJfVEVTVF9DT01QTEVURURdID0gZGV2X2N0cmxfdGVzdGluZ19kZHJfc3RhdGVfZGRyX3Rlc3RfY29tcGxldGVkX2V2ZW50LAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfRERSX1RFU1RfVElNRU9VVF0gPSBkZXZfY3RybF90ZXN0aW5nX2Rkcl9zdGF0ZV9kZHJfdGVzdF90aW1lb3V0X2V2ZW50CisgICAgfQorI2VuZGlmCit9OworCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zbV9lcnJfY2IoYmNtb2x0X2RldmlkIGRldmljZSwgZGV2X2N0cmxfZXZlbnQgZXZlbnQpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsCisgICAgICAgICJVbmV4cGVjdGVkIGV2ZW50OiBkZXZpY2U9JWQsIHN0YXRlPSVzLCBldmVudD0lc1xuIiwKKyAgICAgICAgZGV2aWNlLAorICAgICAgICBiY21fc3RyX2RldmljZV9zdGF0ZShkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUpLAorICAgICAgICBiY21fc3RyX2RldmljZV9ldmVudChldmVudCkpOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zbV9jYWxsX3N0YXRlX2NiKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGRldl9jdHJsX2V2ZW50IGV2ZW50LCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgZGV2X2N0cmxfc21fY2IgY2I7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X2V2ZW50ID0gZXZlbnQ7CisgICAgY2IgPSBkZXZfY3RybF9zbVtkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGVdW2V2ZW50XTsKKyAgICBpZiAoY2IgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX3NtX2Vycl9jYihkZXZpY2UsIGV2ZW50KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2IoZGV2aWNlLCBtc2cpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfa2FfcnhfaGFuZGxlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlICptc2cpCit7CisgICAga2VlcF9hbGl2ZV9yeF9oYW5kbGVyKChjb25zdCBiY21vc19rZWVwX2FsaXZlX2RhdGFfbXNnICopJm1zZy0+ZGF0YSwgJmRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mbyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9rYV90eF9oYW5kbGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogaW4gY2FzZSB0aGlzIGhhcHBlbnMgZHVyaW5nIGEgZGlzY29ubmVjdC9yZXNldCBvcGVyYXRpb24gKi8KKyAgICB9CisKKyAgICBtc2ctPmNvcnJfdGFnID0gKytkZXZfY3RybF9kYltkZXZpY2VdLmNvcnJfdGFnOworICAgIHJjID0gYmNtdHJtdXhfY29udHJvbF90b19saW5lKGRldmljZSwgbXNnKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9rYV9kaXNjb25uZWN0X2hhbmRsZXIoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBkZXZfY3RybF9kaXNjb25uZWN0KGRldmljZSk7CisgICAgZGV2X2N0cmxfc2VuZF9pbmRfY29ubmVjdGlvbl9mYWlsdXJlKGRldmljZSwgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9LRUVQQUxJVkUpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfb3Blcl9zZXRfbXNnKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBkZXZfY3RybF9ldmVudCBldmVudDsKKworICAgIHN3aXRjaCAobXNnLT5zdWJncm91cCkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfUkVTRVQ6CisgICAgICAgIGV2ZW50ID0gREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFU0VUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9DT05ORUNUOgorICAgICAgICBldmVudCA9IERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9DT05ORUNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9ESVNDT05ORUNUOgorICAgICAgICBldmVudCA9IERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9ESVNDT05ORUNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SVU5fRERSX1RFU1Q6CisgICAgICAgIGV2ZW50ID0gREVWSUNFX0NPTlRST0xfRVZFTlRfUlVOX0REUl9URVNUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgICAgZXZlbnQgPSBERVZJQ0VfQ09OVFJPTF9FVkVOVF9OT19FVkVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogU2VuZCByZXNwb25zZSB0byB0aGUgd2FpdGluZyBhcHBsaWNhdGlvbiAqLworICAgIG1zZy0+ZGlyID0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0U7CisgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgbXNnKTsKKworICAgIC8qIEhhbmRsZSBldmVudCAqLworICAgIGlmIChldmVudCAhPSBERVZJQ0VfQ09OVFJPTF9FVkVOVF9OT19FVkVOVCkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBldmVudCwgbXNnKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3Byb2Nlc3NfbXNnKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBpZiAobXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UpCisgICAgeworICAgICAgICBkZXZfY3RybF9zbV9jYWxsX3N0YXRlX2NiKGRldmljZSwgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFQ0VJVkVEX0FDSywgbXNnKTsKKyAgICB9CisKKyAgICBpZiAobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FVVE8pCisgICAgeworICAgICAgICBpZiAobXNnLT5zdWJncm91cCAhPSBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX0tFRVBfQUxJVkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiSW5kaWNhdGlvbiA9ICVzICglZClcbiIsIGJjbV9zdHJfYXV0b19pZChtc2ctPnN1Ymdyb3VwKSwgbXNnLT5zdWJncm91cCk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1zZy0+c3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX0tFRVBfQUxJVkU6CisgICAgICAgICAgICBkZXZfY3RybF9rYV9yeF9oYW5kbGVyKGRldmljZSwgKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmUgKiltc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgICAgIC8qIG5vdGU6IHRoaXMgaW5kaWNhdGlvbiBpcyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZpY2UgLSBpdCdzIGdlbmVyYXRlZCBieSBkZXZpY2UgY29udHJvbCBpdHNlbGYgKi8KKyAgICAgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0ZBSUxVUkUsIG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRDoKKyAgICAgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0VTVEFCTElTSEVELCBtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RFVklDRV9SRUFEWToKKyAgICAgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfUkVBRFksIG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiVW5leHBlY3RlZCBpbmRpY2F0aW9uXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9PUEVSICYmIG1zZy0+dHlwZSA9PSBCQ01PTFRfTVNHX1RZUEVfU0VUICYmIG1zZy0+ZGlyICE9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFKQorICAgIHsKKyAgICAgICAgLyogQWxsIG9wZXJhdGlvbnMgaGFwcGVuIGVudGlyZWx5IG9uIHRoZSBob3N0IHNpZGUgKi8KKyAgICAgICAgaGFuZGxlX29wZXJfc2V0X21zZyhkZXZpY2UsIG1zZyk7CisgICAgfQorCisgICAgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9DRkcgJiYgbXNnLT5kaXIgIT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSA9IG1zZzsKKyAgICAgICAgc3dpdGNoIChtc2ctPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgZGV2X2N0cmxfc21fY2FsbF9zdGF0ZV9jYihkZXZpY2UsIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9DT05GSUdfR0VULCBtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgZGV2X2N0cmxfc21fY2FsbF9zdGF0ZV9jYihkZXZpY2UsIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9DTEVBUiwgbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICBkZXZfY3RybF9zbV9jYWxsX3N0YXRlX2NiKGRldmljZSwgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NPTkZJR19TRVQsIG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1zZyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1zZyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKG1zZyk7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgZGV2X2N0cmxfY29ubmVjdGlvbl90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSBERVZJQ0VfSURfRlJPTV9NT0RVTEVfSUQodGltZXItPnBhcm0ub3duZXIpOworCisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSAhPSBCQ01PTFRfREVWSUNFX1NUQVRFX0NPTk5FQ1RJTkcpCisgICAgeworICAgICAgICAvKiBUaGUgdGltZXIgaXMgaXJyZWxldmFudCBpbiB0aGlzIHN0YXRlIC0gZGlzY2FyZCBpdCBhbmQgcmV0dXJuLiAqLworICAgIH0KKyAgICBlbHNlIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5zdGF0ZSA9PSBERVZfQ1RSTF9DT05ORUNUSU5HX1NUQVRFX0NPTkZJR1VSSU5HKQorICAgIHsKKyAgICAgICAgLyogQWZ0ZXIgd2UgaGF2ZSBzZW50IHRoZSBmaXJzdCAiZGV2aWNlIGNvbmZpZ3VyYXRpb24gc2V0IiBtZXNzYWdlIHRvIHRoZSBkZXZpY2UsIHRoZSBjb25uZWN0aW9uIHRpbWVyIGlzIHVzZWQKKyAgICAgICAgICogZm9yIHJldHJhbnNtaXR0aW5nIHRoaXMgbWVzc2FnZSBpbiBjYXNlIHRoZSBkZXZpY2UgbWlzc2VkIGl0LiAqLworICAgICAgICBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWQgaW5kID0ge307CisgICAgICAgIEJDTU9MVF9BVVRPX0lOSVQoJmluZCwgZGV2aWNlLCBjb25uZWN0aW9uX2VzdGFibGlzaGVkKTsKKyAgICAgICAgZGV2X2N0cmxfc21fY2FsbF9zdGF0ZV9jYihkZXZpY2UsIERFVklDRV9DT05UUk9MX0VWRU5UX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQsICZpbmQuaGRyLmhkcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIENvbm5lY3Rpb24gZmFpbHVyZSBkdWUgdG8gdGltZW91dC4gKi8KKyAgICAgICAgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmUgaW5kID0ge307CisgICAgICAgIEJDTU9MVF9BVVRPX0lOSVQoJmluZCwgZGV2aWNlLCBjb25uZWN0aW9uX2ZhaWx1cmUpOworICAgICAgICBpbmQuZGF0YS5yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQ7CisgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0ZBSUxVUkUsICZpbmQuaGRyLmhkcik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX1NUT1A7Cit9CisKKyNpZm5kZWYgSU5fQkFORAorc3RhdGljIHZvaWQgZGV2X2N0cmxfZ2V0X3Jhc19tb2RlcyhiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGUsIHVpbnQzMl90ICpyYXNfMF9tb2RlLCB1aW50MzJfdCAqcmFzXzFfbW9kZSkKK3sKKyAgICBzd2l0Y2ggKHN5c3RlbV9tb2RlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YOgorICAgICAgICAqcmFzXzBfbW9kZSA9IEJDTV9GTERfUkFTX01PREVfR1BPTjsKKyAgICAgICAgKnJhc18xX21vZGUgPSBCQ01fRkxEX1JBU19NT0RFX05PVF9DT05GSUdVUkVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YOgorICAgICAgICAqcmFzXzBfbW9kZSA9IEJDTV9GTERfUkFTX01PREVfR1BPTjsKKyAgICAgICAgKnJhc18xX21vZGUgPSBCQ01fRkxEX1JBU19NT0RFX0dQT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzRfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX184X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX184X1hfMl9QXzVfRzoKKyAgICAgICAgKnJhc18wX21vZGUgPSBCQ01fRkxEX1JBU19NT0RFX1hHUE9OOworICAgICAgICAqcmFzXzFfbW9kZSA9IEJDTV9GTERfUkFTX01PREVfWEdQT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0U6CisgICAgICAgICpyYXNfMF9tb2RlID0gQkNNX0ZMRF9SQVNfTU9ERV9YR1BPTjsKKyAgICAgICAgKnJhc18xX21vZGUgPSBCQ01fRkxEX1JBU19NT0RFX0dQT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHU19fMl9YXzEwX0c6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX18yX1hfMTBfRzoKKyAgICAgICAgKnJhc18wX21vZGUgPSBCQ01fRkxEX1JBU19NT0RFX1hHU19OR1BPTjI7CisgICAgICAgICpyYXNfMV9tb2RlID0gQkNNX0ZMRF9SQVNfTU9ERV9YR1NfTkdQT04yOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAqcmFzXzBfbW9kZSA9IEJDTV9GTERfUkFTX01PREVfTk9UX0NPTkZJR1VSRUQ7CisgICAgICAgICpyYXNfMV9tb2RlID0gQkNNX0ZMRF9SQVNfTU9ERV9OT1RfQ09ORklHVVJFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgZGV2X2N0cmxfYm9vdF9zZXFfdGltZXJfaGFuZGxlcihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19ib29sIGlzX2Jvb3Rsb2FkZXJfZG9uZTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlOworICAgIHVpbnQzMl90IHJhc18wX21vZGU7CisgICAgdWludDMyX3QgcmFzXzFfbW9kZTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb3NfdGltZXJfcmMgdGltZXJfcmMgPSBCQ01PU19USU1FUl9TVE9QOworCisgICAgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClkYXRhOworCisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uYm9vdF9zZXFfaW5mby5wb2xsaW5nX2NvdW50ZXIgPiAwKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnBvbGxpbmdfY291bnRlci0tOworICAgICAgICBpc19ib290bG9hZGVyX2RvbmUgPSBiY21fZmxkX2lzX2Jvb3Rsb2FkZXJfZG9uZShkZXZpY2UpOworICAgICAgICBpZiAoaXNfYm9vdGxvYWRlcl9kb25lKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdG9wIHRoZSBib290IHRpbWVyICovCisgICAgICAgICAgICB0aW1lcl9yYyA9IEJDTU9TX1RJTUVSX1NUT1A7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQm9vdCBsb2FkZXIgcGhhc2UgZG9uZS5cbiIpOworCisgICAgICAgICAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmRlYnVnLmF2c19jb250cm9sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gYmNtX2ZsZF9zZXRfYXZzX2NvbnQoZGV2aWNlLCBCQ01fRkxEX0FWU19DT05UKTsgLyogZG9uJ3Qgc3RvcCB0aGUgY3B1IHdoZW4gYXZzIGZhaWxzLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gYmNtX2ZsZF9zZXRfYXZzX2NvbnQoZGV2aWNlLCBCQ01fRkxEX0FWU19TVE9QKTsgLyogc3RvcCB0aGUgY3B1IHdoZW4gYXZzIGZhaWxzLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgQkNNX0RFVl9DVFJMX1JFVFVSTl9PTl9FUlJPUihkZXZpY2UsIHJjLCAiYmNtX2ZsZF9zZXRfYXZzX2NvbnRcbiIpOworCisgICAgICAgICAgICBkZXZfY3RybF9nZXRfcmFzX21vZGVzKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zeXN0ZW1fbW9kZSwgJnJhc18wX21vZGUsICZyYXNfMV9tb2RlKTsKKyAgICAgICAgICAgIHJjID0gYmNtX2ZsZF9zZXRfcmFzX21vZGVfc2V0KGRldmljZSwgMCwgcmFzXzBfbW9kZSk7CisgICAgICAgICAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJiY21fZmxkX3NldF9yYXNfMF9tb2RlX3NldFxuIik7CisgICAgICAgICAgICByYyA9IGJjbV9mbGRfc2V0X3Jhc19tb2RlX3NldChkZXZpY2UsIDEsIHJhc18xX21vZGUpOworICAgICAgICAgICAgQkNNX0RFVl9DVFJMX1JFVFVSTl9PTl9FUlJPUihkZXZpY2UsIHJjLCAiYmNtX2ZsZF9zZXRfcmFzXzFfbW9kZV9zZXRcbiIpOworICAgICAgICAgICAgcmMgPSBkZXZfY3RybF9oYW5kbGVfYXBwbGljYXRpb25faW1hZ2UoZGV2aWNlKTsKKyAgICAgICAgICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImRldl9jdHJsX2hhbmRsZV9hcHBsaWNhdGlvbl9pbWFnZSgpXG4iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlc3RhcnQgdGhlIGJvb3QgdGltZXIgKi8KKyAgICAgICAgICAgIHRpbWVyX3JjID0gQkNNT1NfVElNRVJfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdGltZXJfcmMgPSBCQ01PU19USU1FUl9TVE9QOworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgImRldl9jdHJsX2Jvb3Rfc2VxIHRpbWVyIGV4cGlyZWQgd2hpbGUgdHJ5aW5nIHRvIGJ1cm4gQk9PVExPQURFUlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIHRpbWVyX3JjOworfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgZGV2X2N0cmxfZGRyX3Rlc3RfdGltZXJfaGFuZGxlcihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19ib29sIGlzX2Rkcl90ZXN0X2RvbmU7CisgICAgYmNtb2x0X2RldmlkIGRldmljZTsKKyAgICBiY21vc190aW1lcl9yYyB0aW1lcl9yYyA9IEJDTU9TX1RJTUVSX1NUT1A7CisKKyAgICBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKWRhdGE7CisKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnBvbGxpbmdfY291bnRlciA+IDApCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8ucG9sbGluZ19jb3VudGVyLS07CisgICAgICAgIGlzX2Rkcl90ZXN0X2RvbmUgPSBiY21fZmxkX2lzX2Rkcl90ZXN0X2RvbmUoZGV2aWNlKTsKKyAgICAgICAgaWYgKGlzX2Rkcl90ZXN0X2RvbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFN0b3AgdGhlIGJvb3QgdGltZXIgKi8KKyAgICAgICAgICAgIHRpbWVyX3JjID0gQkNNT1NfVElNRVJfU1RPUDsKKyAgICAgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERFJfVEVTVF9DT01QTEVURUQsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIldhaXRpbmcgZm9yIEREUiBUZXN0ICV1XG4iLCBkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8ucG9sbGluZ19jb3VudGVyKTsKKyAgICAgICAgICAgIC8qIFJlc3RhcnQgdGhlIGJvb3QgdGltZXIgKi8KKyAgICAgICAgICAgIHRpbWVyX3JjID0gQkNNT1NfVElNRVJfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdGltZXJfcmMgPSBCQ01PU19USU1FUl9TVE9QOworICAgICAgICBkZXZfY3RybF9zbV9jYWxsX3N0YXRlX2NiKGRldmljZSwgREVWSUNFX0NPTlRST0xfRVZFTlRfRERSX1RFU1RfVElNRU9VVCwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIHRpbWVyX3JjOworfQorI2VuZGlmCisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9pbml0X21vZHVsZXMoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVfcGFyYW1zID0ge307CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubW9kdWxlX2lkID0gTU9EVUxFX0lEX0ZST01fREVWSUNFX0lEKGRldmljZSk7CisgICAgc25wcmludGYoCisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubmFtZSwKKyAgICAgICAgc2l6ZW9mKGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubmFtZSksCisgICAgICAgICJkZXZfY3RybCV1X21vZHVsZSIsCisgICAgICAgIGRldmljZSk7CisgICAgbW9kdWxlX3BhcmFtcy5xcGFybS5uYW1lID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5tb2R1bGVfaW5mby5uYW1lOworICAgIG1vZHVsZV9wYXJhbXMucXBhcm0uc2l6ZSA9IERFVklDRV9DT05UUk9MX01TR19RVUVVRV9TSVpFOworICAgIG1vZHVsZV9wYXJhbXMuaW5pdCA9IE5VTEw7CisgICAgcmMgPSBiY21vc19tb2R1bGVfY3JlYXRlKAorICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCwKKyAgICAgICAgJmRldl9jdHJsX2RiW2RldmljZV0udGFza19pbmZvLnRhc2ssCisgICAgICAgICZtb2R1bGVfcGFyYW1zKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLAorICAgICAgICAgICAgImJjbW9zX21vZHVsZV9jcmVhdGUgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKSwgbW9kdWxlIGlkICVkXG4iLAorICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLAorICAgICAgICAgICAgcmMsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRldl9jdHJsX2luaXRfdGFza3MoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc190YXNrX3Bhcm0gdGFza19wYXJhbXMgPSB7fTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgc25wcmludGYoZGV2X2N0cmxfZGJbZGV2aWNlXS50YXNrX2luZm8ubmFtZSwgc2l6ZW9mKGRldl9jdHJsX2RiW2RldmljZV0udGFza19pbmZvLm5hbWUpLCAiZGV2X2N0cmwldSIsIGRldmljZSk7CisgICAgdGFza19wYXJhbXMubmFtZSA9IGRldl9jdHJsX2RiW2RldmljZV0udGFza19pbmZvLm5hbWU7CisgICAgdGFza19wYXJhbXMucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX0RFVklDRV9DT05UUk9MOworICAgIHRhc2tfcGFyYW1zLmNvcmUgPSBCQ01PU19DUFVfQ09SRV9BTlk7IC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgIHRhc2tfcGFyYW1zLmluaXRfaGFuZGxlciA9IE5VTEw7CisgICAgdGFza19wYXJhbXMuZGF0YSA9IChsb25nKWRldmljZTsKKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZkZXZfY3RybF9kYltkZXZpY2VdLnRhc2tfaW5mby50YXNrLCAmdGFza19wYXJhbXMpOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbW9zX3Rhc2tfY3JlYXRlKClcbiIpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9tb2RfbXNnX2hhbmRsZXIoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgYmNtb2x0X21zZyAqbXNnOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2U7CisKKyAgICBkZXZpY2UgPSBERVZJQ0VfSURfRlJPTV9NT0RVTEVfSUQobW9kdWxlX2lkKTsKKyAgICBtc2cgPSBvc19tc2ctPmRhdGE7CisKKyNpZm5kZWYgSU5fQkFORAorI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBpZiAobXNnLT5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0xPR0dFUiAmJgorICAgICAgICBtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHICYmCisgICAgICAgIG1zZy0+dHlwZSA9PSBCQ01PTFRfTVNHX1RZUEVfR0VUICYmCisgICAgICAgICFkZXZfY3RybF9pc19jb25uZWN0ZWQoZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlKSkKKyAgICB7CisgICAgICAgIC8qIFRoZSBkZXZpY2UgaXMgbm90IHJlYWR5LCBidXQgc3RpbGwgd2UgY2FuIGZldGNoIHRoZSBsb2dnZXIgZmlsZSBmcm9tIFNSQU0uICovCisgICAgICAgIG1zZy0+ZXJyID0gZGV2X2N0cmxfZ2V0X2Rldl9sb2coZGV2aWNlLCAoYmNtb2x0X2xvZ2dlcl9jZmcgKiltc2cpOworICAgICAgICBtc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgICAgICBiY210cm11eF9jb250cm9sX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKG1zZy0+b2JqX3R5cGUgPT0gQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiAmJgorICAgICAgICBtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHICYmCisgICAgICAgIChtc2ctPnR5cGUgPT0gQkNNT0xUX01TR19UWVBFX0dFVCB8fCBtc2ctPnR5cGUgPT0gQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSSkgJiYKKyAgICAgICAgIWRldl9jdHJsX2lzX2Nvbm5lY3RlZChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUpKQorICAgIHsKKyAgICAgICAgLyogZ2V0IHN3IGVycm9yIHRhYmxlIGZyb20gU1JBTSAqLworICAgICAgICBtc2ctPmVyciA9IGRldl9jdHJsX3N3X2Vycm9yX2dldChkZXZpY2UsIG1zZyk7CisgICAgICAgIG1zZy0+ZGlyID0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0U7CisgICAgICAgIGJjbXRybXV4X2NvbnRyb2xfdG9faG9zdChkZXZpY2UsIG1zZyk7CisgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAobXNnLT5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0RFQlVHKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYnVnX2N0cmxfcHJvY2Vzc19tc2coZGV2aWNlLCBtc2csIGRldl9jdHJsX2lzX2Nvbm5lY3RlZChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtc2ctPm9ial90eXBlICE9IEJDTU9MVF9PQkpfSURfREVWSUNFKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX0lOVEVSTkFMLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkNhbid0IGFjY2VzcyB0YXJnZXQgd2hlbiBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgbXNnLT5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRTsKKyAgICAgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKG1zZyk7CisgICAgfQorICAgIGVsc2UgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfcHJvY2Vzc19tc2coZGV2aWNlLCBtc2cpOworICAgIH0KKyAgICBlbHNlIGlmIChtc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRSkKKyAgICB7CisgICAgICAgIGlmIChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfT1BFUiAmJiBtc2ctPnN1Ymdyb3VwID09IEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEp1c3QgZnJlZSBpdCwgb3RoZXJ3aXNlIGlnbm9yZSBrZWVwYWxpdmUgb3BlciByZXNwb25zZXMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPT0gQkNNT0xUX0RFVklDRV9TVEFURV9XQUlUSU5HX0ZPUl9ERVZJQ0UpIHx8IChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPT0gQkNNT0xUX0RFVklDRV9TVEFURV9DT05ORUNUSU5HKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGV2X2N0cmxfcHJvY2Vzc19tc2coZGV2aWNlLCBtc2cpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgInJlY2VpdmVkIHVuZXhwZWN0ZWQgcmVzcG9uc2U6IGdyb3VwPSV1IHN1Ymdyb3VwPSV1XG4iLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwKTsKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSAhPSBCQ01PTFRfREVWSUNFX1NUQVRFX0NPTk5FQ1RJTkcpCisgICAgeworICAgICAgICBtc2ctPmVyciA9IGRldl9jdHJsX3ZhbGlkYXRlX21zZyhkZXZpY2UsIG1zZyk7CisgICAgICAgIGlmIChtc2ctPmVyciA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9wcm9jZXNzX21zZyhkZXZpY2UsIG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgICAgICAgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2dfZXJyKG1zZywgREVWX0xPR19JTlZBTElEX0lELCBCQ01fRVJSX1NUQVRFLCBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsICJEZXZpY2UgaXMgYnVzeSIpOworICAgICAgICBtc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgICAgICBiY210cm11eF9jb250cm9sX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX21vZF9tc2dfcmVsZWFzZShiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBiY21vbHRfbXNnX2ZyZWUoY29udGFpbmVyX29mKG9zX21zZywgYmNtb2x0X21zZywgb3NfbXNnKSk7Cit9CisKK3N0YXRpYyBiY21vc19tc2cgZGV2X2N0cmxfaXBjX21zZyA9IHsgLmhhbmRsZXIgPSBkZXZfY3RybF9tb2RfbXNnX2hhbmRsZXIsIC5yZWxlYXNlID0gZGV2X2N0cmxfbW9kX21zZ19yZWxlYXNlIH07CisKK3N0YXRpYyB2b2lkIGJjbWRldl9yeF9oYW5kbGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgdm9pZCAqZGF0YSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIG1zZy0+b3NfbXNnID0gZGV2X2N0cmxfaXBjX21zZzsKKyAgICBtc2ctPm9zX21zZy5kYXRhID0gbXNnOworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubW9kdWxlX2lkLCAmbXNnLT5vc19tc2csIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgICAgICJiY21vc19tc2dfc2VuZF90b19tb2R1bGUgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKSwgbW9kdWxlIGlkICVkXG4iLAorICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLAorICAgICAgICAgICAgcmMsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCk7CisgICAgfQorfQorCisjaWZuZGVmIElOX0JBTkQKK3N0YXRpYyBiY21vc190aW1lcl9yYyBleGNlcHRpb25fbW9uaXRvcl90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKWRhdGE7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoIWRldl9jdHJsX2lzX2Nvbm5lY3RlZChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIGluIGNhc2UgdGhpcyBoYXBwZW5zIGR1cmluZyBhIGRpc2Nvbm5lY3QvcmVzZXQgb3BlcmF0aW9uICovCisgICAgfQorCisgICAgcmMgPSBkZXZfY3RybF9nZXRfZXhjZXB0aW9uX2xvZ19pZl9wcmVzZW50KGRldmljZSk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0sgJiYgcmMgIT0gQkNNX0VSUl9OT0VOVCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiY2FudCByZWFkIEV4Y2VwdGlvbiBsb2cgZm9yIGRldmljZSAlZCBlcnJvciAlcyAoJWQpXG4iLCBkZXZpY2UsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisjZW5kaWYKKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIGRldmljZV9yZXNwb25zZV90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKWRhdGE7CisgICAgZGV2X2N0cmxfc21fY2FsbF9zdGF0ZV9jYihkZXZpY2UsIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9USU1FUl9USU1FT1VULCBOVUxMKTsKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyByZXNldF9kZWxheV90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gZGV2X2N0cmxfcGFyYW1zLmhvc3RfcmVzZXRfY2IoKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiWyhiY21vbHRfZGV2aWQpZGF0YV0ubG9nX2lkLCAiSG9zdCByZXNldCBjYWxsYmFjayBmYWlsZWQ6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF90aW1lcl9jcmVhdGUoCisgICAgYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLAorICAgIGRldl9jdHJsX3RpbWVyICp0aW1lciwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGJjbW9zX2Jvb2wgcGVyaW9kaWMsCisgICAgRl9iY21vc190aW1lcl9oYW5kbGVyIGhhbmRsZXIpCit7CisgICAgYmNtb3NfdGltZXJfcGFybSB0aW1lcl9wYXJhbXMgPSB7fTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBzbnByaW50Zih0aW1lci0+bmFtZSwgc2l6ZW9mKHRpbWVyLT5uYW1lKSwgImRldl9jdHJsXyVzX3RpbWVyJXUiLCBuYW1lLCBkZXZpY2UpOworICAgIHRpbWVyX3BhcmFtcy5uYW1lID0gdGltZXItPm5hbWU7CisgICAgdGltZXJfcGFyYW1zLm93bmVyID0gbW9kdWxlX2lkOworICAgIHRpbWVyX3BhcmFtcy5wZXJpb2RpYyA9IHBlcmlvZGljOworICAgIHRpbWVyX3BhcmFtcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICB0aW1lcl9wYXJhbXMuZGF0YSA9IGRldmljZTsKKyAgICByYyA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmdGltZXItPnRpbWVyLCAmdGltZXJfcGFyYW1zKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLAorICAgICAgICAgICAgIiclcycgdGltZXIgY3JlYXRpb24gZmFpbGVkLCBiY21vc190aW1lcl9jcmVhdGUgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIHRpbWVyLT5uYW1lLAorICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLAorICAgICAgICAgICAgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworI2lmbmRlZiBJTl9CQU5ECitzdGF0aWMgdm9pZCBkZXZfY3RybF9saW5rX3VwX2Rvd25fY2IodWludDhfdCBkZXZfaWQsIGJjbV9sbF9wY2llX2xpbmtfc3RhdHVzIHN0YXR1cykKK3sKKyAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2Rldl9pZF0ubG9nX2lkLCAiRGV2aWNlICV1OiBQQ0llIGxpbmsgJXNcbiIsIGRldl9pZCwgc3RhdHVzID09IEJDTV9MTF9QQ0lFX0xJTktfRE9XTiA/ICJkb3duIiA6ICJ1cCIpOworfQorI2VuZGlmCisKK3N0YXRpYyBiY210cm11eF9tc2dfZGVzdCBkZXZfY3RybF9tc2dfZmlsdGVyX2NiKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X29ial9pZCBvYmosCisgICAgYmNtb2x0X21ndF9ncm91cCBncm91cCwKKyAgICB1aW50MTZfdCBzdWJncm91cCkKK3sKKyAgICAvKiBEZXZpY2UgY29udHJvbCBzaG91bGQgaW50ZXJjZXB0IHRoZSBtZXNzYWdlIGlmIG9uZSBvZiB0aGUgdHdvIGhhcHBlbnM6CisgICAgICogMS4gVGhlIG1lc3NhZ2Ugb2JqZWN0IGlzICJkZXZpY2UiLgorICAgICAqIDIuIFRoZSBtZXNzYWdlIG9iamVjdCBpcyBub3QgImRldmljZSIsIGJ1dCB0aGUgZGV2aWNlIGlzIG5vdCByZWFkeSwgc28gYW4gYXBwcm9wcmlhdGUgZXJyb3Igc2hvdWxkIGJlIHJldHVybmVkIHRvCisgICAgICogICAgdGhlIGhvc3QgYXBwbGljYXRpb24uICovCisgICAgYmNtdHJtdXhfbXNnX2Rlc3QgZGVzdCA9IEJDTVRSTVVYX0RFU1RfUkVNT1RFOworCisgICAgaWYgKCFkZXZfY3RybF9pc19jb25uZWN0ZWQoZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlKSkKKyAgICB7CisgICAgICAgIGRlc3QgPSBCQ01UUk1VWF9ERVNUX0xPQ0FMOworICAgIH0KKyAgICBlbHNlIGlmIChvYmogPT0gQkNNT0xUX09CSl9JRF9ERUJVRykKKyAgICB7CisgICAgICAgIGRlc3QgPSBCQ01UUk1VWF9ERVNUX0xPQ0FMOworICAgIH0KKyAgICBlbHNlIGlmIChvYmogPT0gQkNNT0xUX09CSl9JRF9ERVZJQ0UpCisgICAgeworICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX1NUQVJUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfREFUQToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1NXX1VQR1JBREVfQUNUSVZBVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTVRSTVVYX0RFU1RfUkVNT1RFOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNVFJNVVhfREVTVF9MT0NBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTVRSTVVYX0RFU1RfTE9DQUw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRlc3Q7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX2luaXRfZGV2aWNlX29iamVjdHMoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBkZXZfY3RybF9jbGVhcl9kZXZpY2VfY2ZnKGRldmljZSk7CisgICAgZGV2X2N0cmxfaW5pdF9jb25uZWN0aW9uX3N0YXRlKGRldmljZSk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQ7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN5c3RlbV9tb2RlID0gQkNNT0xUX1NZU1RFTV9NT0RFX19OVU1fT0Y7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnBvbGxpbmdfY291bnRlciA9IEJPT1RfU0VRX1BPTExJTkdfTUFYX05VTUJFUjsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8ucG9sbGluZ19pbnRlcnZhbCA9IEJPT1RfU0VRX1BPTExfSU5URVJWQUxfU0VDICogQkNNT1NfTUlDUk9TRUNPTkRTX0lOX1NFQ09ORFM7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5jb3JyX3RhZyA9IDA7CisjaWZkZWYgRU5BQkxFX0xPRworICAgIGRldl9jdHJsX2RiW2RldmljZV0uc3JhbV9sb2dfb2Zmc2V0ID0gMDsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1zZ3NfcmVhZCA9IDA7CisjZW5kaWYKKworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS50cnhfZGlzYWJsZV9tYXNrID0gMHhGRkZGOyAvKiBNYXJrIGFsbCBQT05zIHdpdGggVFJYIGRpc2FibGVkLiAqLworI2VuZGlmCisKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5fZmFpbF9yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05PTkU7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X2V2ZW50ID0gREVWSUNFX0NPTlRST0xfRVZFTlRfTk9fRVZFTlQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfY3RybF9ob3N0X2V2ZW50X3dyaXRlKHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgZXZlbnQpCit7CisjaWZuZGVmIElOX0JBTkQKKyAgICBiY21vbHRfZGV2aWNlX3N0YXRlIHN0YXRlID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlOworI2VuZGlmCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICAvKiBVcGRhdGUgbG9jYWwgZGF0YWJhc2UsIHNvIHRoYXQgYWZ0ZXIgcmVzZXQgd2Ugd2lsbCBiZSBhYmxlIHRvIHN5bmMgdGhpcyB2YWx1ZSB3aXRoIHRoZSBkZXZpY2UuICovCisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS50cnhfZGlzYWJsZV9tYXNrID0gZXZlbnQ7CisjZW5kaWYKKyNpZm5kZWYgSU5fQkFORAorICAgIC8qIE5vdGlmeSBkZXZpY2UgdXNpbmcgU1JBTSwgYnV0IG9ubHkgaWYgd2UgYXJlIGFscmVhZHkgY29ubmVjdGVkIChvdGhlcndpc2UgRkxEIG1pZ2h0IGJlIG5vdCByZWFkeSkuICovCisgICAgaWYgKGRldl9jdHJsX2lzX2Nvbm5lY3RlZChzdGF0ZSkpCisgICAgICAgIGJjbV9mbGRfc2V0X2hvc3RfZXZlbnQoZGV2aWNlLCBldmVudCk7CisjZW5kaWYKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKy8qVXNlIGRpZmZlcmVudCBmdW5jdGlvbiBzaWduYXR1cmVzIGxpbnV4IGtlcm5lbCBkZXZpY2UgY29udHJvbCBhbmQgb3RoZXIqLworI2lmICFkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCitiY21vc19lcnJubyBiY21vbHRfZGV2X2N0cmxfaW5pdChiY21vbHRfZGV2X2N0cmxfcGFyYW1zICpwYXJhbXMpCisjZWxzZQorYmNtb3NfZXJybm8gYmNtb2x0X2Rldl9jdHJsX2luaXQoKQorI2VuZGlmCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyNpZiAhZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQorICAgIGlmICghcGFyYW1zLT5zeXN0ZW1fbW9kZV92YWxpZGF0ZV9jYiB8fAorICAgICAgICAhcGFyYW1zLT5pbWFnZV9yZWFkX2NiIHx8CisgICAgICAgICFwYXJhbXMtPmRldmljZV9vZmZfY2IgfHwKKyAgICAgICAgIXBhcmFtcy0+ZGV2aWNlX29uX2NiIHx8CisgICAgICAgICFwYXJhbXMtPmRldmljZV9pc19ydW5uaW5nX2NiIHx8CisgICAgICAgICFwYXJhbXMtPmhvc3RfcmVzZXRfY2IgfHwKKyAgICAgICAgIXBhcmFtcy0+cGNpZV9jaGFubmVsX3ByZXBhcmVfY2IgfHwKKyAgICAgICAgIXBhcmFtcy0+cGNpZV9jaGFubmVsX3JlbW92ZV9jYikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiTWlzc2luZyByZXF1aXJlZCBjYWxsYmFja3NcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGRldl9jdHJsX3BhcmFtcyA9ICpwYXJhbXM7CisjZW5kaWYKKyAgICByYyA9IGJjbXRybXV4X2luaXQoZGV2X2N0cmxfbXNnX2ZpbHRlcl9jYik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjLCByYywgImJjbXRybXV4X2luaXQoKVxuIik7CisKKyNpZm5kZWYgSU5fQkFORAorICAgIHJjID0gYmNtX2ZsZF9pbml0KEJDTVRSX01BWF9PTFRTKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2ZsZF9pbml0KClcbiIpOworI2VuZGlmCisKKyAgICBmb3IgKGRldmljZSA9IDA7IGRldmljZSA8IEJDTVRSX01BWF9PTFRTOyBkZXZpY2UrKykKKyAgICB7CisjaWZkZWYgRU5BQkxFX0xPRworICAgICAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgICAgICBzbnByaW50Zihsb2dfbmFtZSwgc2l6ZW9mKGxvZ19uYW1lKSAtIDEsICJkZXZfY3RybF8ldSIsIGRldmljZSk7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX25hbWUsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworI2VuZGlmCisgICAgICAgIGRldl9jdHJsX2luaXRfZGV2aWNlX29iamVjdHMoZGV2aWNlKTsKKyAgICAgICAgaW1hZ2VfYnVmW2RldmljZV0gPSBiY21vc19hbGxvYyhJTUFHRV9CVUZfU0laRSk7CisgICAgICAgIGlmICghaW1hZ2VfYnVmW2RldmljZV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ2FuJ3QgYWxsb2NhdGUgcGFja2V0IGJ1ZmZlclxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorICAgICAgICByZF9pbWFnZV9idWZbZGV2aWNlXSA9IGJjbW9zX2FsbG9jKElNQUdFX0JVRl9TSVpFKTsKKyAgICAgICAgaWYgKCFyZF9pbWFnZV9idWZbZGV2aWNlXSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJDYW4ndCBhbGxvY2F0ZSBuaF9wYWNrZXQgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisgICAgICAgIHJjID0gZGV2X2N0cmxfaW5pdF90YXNrcyhkZXZpY2UpOworICAgICAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJkZXZfY3RybF9pbml0X3Rhc2tzKClcbiIpOworCisgICAgICAgIHJjID0gZGV2X2N0cmxfaW5pdF9tb2R1bGVzKGRldmljZSk7CisgICAgICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImRldl9jdHJsX2luaXRfbW9kdWxlcygpXG4iKTsKKworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8ub3JpZyA9IEJDTV9LRUVQX0FMSVZFX01TR19PUklHX0hPU1Q7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5zZW5kX2hhbmRsZXIgPSBkZXZfY3RybF9rYV90eF9oYW5kbGVyOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8uZGlzY29ubmVjdF9oYW5kbGVyID0gZGV2X2N0cmxfa2FfZGlzY29ubmVjdF9oYW5kbGVyOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8uZGV2aWNlID0gZGV2aWNlOworICAgICAgICByYyA9IGNyZWF0ZV9rZWVwX2FsaXZlX3RpbWVyKCZkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8sIGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubW9kdWxlX2lkKTsKKyAgICAgICAgQkNNX0RFVl9DVFJMX1JFVFVSTl9PTl9FUlJPUihkZXZpY2UsIHJjLCAiY3JlYXRlX2tlZXBfYWxpdmVfdGltZXIoKVxuIik7CisKKyAgICAgICAgcmMgPSBkZXZfY3RybF90aW1lcl9jcmVhdGUoCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCwKKyAgICAgICAgICAgICZkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby50aW1lciwKKyAgICAgICAgICAgICJjb25uZWN0aW9uIiwKKyAgICAgICAgICAgIEJDTU9TX0ZBTFNFLCAvKiBub24tcGVyaW9kaWMgKi8KKyAgICAgICAgICAgIGRldl9jdHJsX2Nvbm5lY3Rpb25fdGltZXJfaGFuZGxlcik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihyYywgcmMpOworCisjaWZuZGVmIElOX0JBTkQKKyAgICAgICAgcmMgPSBkZXZfY3RybF90aW1lcl9jcmVhdGUoCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCwKKyAgICAgICAgICAgICZkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8udGltZXIsCisgICAgICAgICAgICAiYm9vdF9zZXEiLAorICAgICAgICAgICAgQkNNT1NfVFJVRSwgLyogcGVyaW9kaWMgKi8KKyAgICAgICAgICAgIGRldl9jdHJsX2Jvb3Rfc2VxX3RpbWVyX2hhbmRsZXIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IocmMsIHJjKTsKKworICAgICAgICByYyA9IGRldl9jdHJsX3RpbWVyX2NyZWF0ZSgKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubW9kdWxlX2lkLAorICAgICAgICAgICAgJmRldl9jdHJsX2RiW2RldmljZV0uZXhjZXB0aW9uX21vbml0b3JfdGltZXIsCisgICAgICAgICAgICAiZXhjZXB0aW9uX21vbml0b3IiLAorICAgICAgICAgICAgQkNNT1NfVFJVRSwgLyogcGVyaW9kaWMgKi8KKyAgICAgICAgICAgIGV4Y2VwdGlvbl9tb25pdG9yX3RpbWVyX2hhbmRsZXIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IocmMsIHJjKTsKKyNlbmRpZgorICAgICAgICByYyA9IGRldl9jdHJsX3RpbWVyX2NyZWF0ZSgKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubW9kdWxlX2lkLAorICAgICAgICAgICAgJmRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3Jlc3BvbnNlX3RpbWVyLAorICAgICAgICAgICAgImRldmljZV9yZXNwb25zZSIsCisgICAgICAgICAgICBCQ01PU19GQUxTRSwgLyogbm9uLXBlcmlvZGljICovCisgICAgICAgICAgICBkZXZpY2VfcmVzcG9uc2VfdGltZXJfaGFuZGxlcik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihyYywgcmMpOworCisgICAgICAgIHJjID0gZGV2X2N0cmxfdGltZXJfY3JlYXRlKAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5tb2R1bGVfaW5mby5tb2R1bGVfaWQsCisgICAgICAgICAgICAmZGV2X2N0cmxfZGJbZGV2aWNlXS5yZXNldF9kZWxheV90aW1lciwKKyAgICAgICAgICAgICJyZXNldF9kZWxheSIsCisgICAgICAgICAgICBCQ01PU19GQUxTRSwgLyogbm9uLXBlcmlvZGljICovCisgICAgICAgICAgICByZXNldF9kZWxheV90aW1lcl9oYW5kbGVyKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKHJjLCByYyk7CisKKyAgICAgICAgLyogUmVnaXN0ZXIgY2FsbGJhY2sgdG8gTVVYICovCisgICAgICAgIHJjID0gYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl9yZWdpc3RlcihkZXZpY2UsIGJjbWRldl9yeF9oYW5kbGVyLCAodm9pZCAqKShsb25nKWRldmljZSk7CisgICAgICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbXRybXV4X2xvY2FsX2hhbmRsZXJfcmVnaXN0ZXIoKVxuIik7CisKKyAgICAgICAgLyogSW50ZXJjZXB0IENPTk5FQ1RJT05fRVNUQUJMSVNIRUQsIERFVklDRV9SRUFEWSwgS0VFUF9BTElWRSBtZXNzYWdlcyAqLworICAgICAgICByYyA9IGJjbXRybXV4X2NvbnRyb2xfYXV0b19pbnRlcmNlcHRfZmlsdGVyKAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9ERVZJQ0UsCisgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCk7CisgICAgICAgIHJjID0gcmMgPyByYyA6IGJjbXRybXV4X2NvbnRyb2xfYXV0b19pbnRlcmNlcHRfZmlsdGVyKAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9ERVZJQ0UsCisgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX1JFQURZKTsKKyAgICAgICAgcmMgPSByYyA/IHJjIDogYmNtdHJtdXhfY29udHJvbF9hdXRvX2ludGVyY2VwdF9maWx0ZXIoCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX0RFVklDRSwKKyAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfS0VFUF9BTElWRSk7CisgICAgICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbXRybXV4X2NvbnRyb2xfYXV0b19pbnRlcmNlcHRfZmlsdGVyKClcbiIpOworICAgIH0KKyNpZm5kZWYgSU5fQkFORAorICAgIC8qIFJlZ2lzdGVyIGZvciBsaW5rX3VwIC8gbGlua19kb3duIGludGVycnVwdCAqLworICAgIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfcmVnaXN0ZXIoZGV2X2N0cmxfbGlua191cF9kb3duX2NiKTsKKyNlbmRpZgorCisgICAgYmNtb2x0X2RlYnVnX2N0cmxfaW5pdCgpOworCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIGJjbW9sdF9kZXZfY3RybF9leGl0KHZvaWQpCit7CisjaWZuZGVmIElOX0JBTkQKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlOworCisgICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCBCQ01UUl9NQVhfT0xUUzsgZGV2aWNlKyspCisgICAgeworICAgICAgICBiY210cm11eF9sb2NhbF9oYW5kbGVyX3VucmVnaXN0ZXIoZGV2aWNlKTsKKyAgICAgICAgYmNtb3NfZnJlZShpbWFnZV9idWZbZGV2aWNlXSk7CisgICAgICAgIGJjbW9zX2ZyZWUocmRfaW1hZ2VfYnVmW2RldmljZV0pOworICAgICAgICBiY21vc190aW1lcl9kZXN0cm95KCZkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby50aW1lci50aW1lcik7CisgICAgICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJmRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV90aW1lci50aW1lcik7CisgICAgICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJmRldl9jdHJsX2RiW2RldmljZV0uYm9vdF9zZXFfaW5mby50aW1lci50aW1lcik7CisgICAgICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJmRldl9jdHJsX2RiW2RldmljZV0uZXhjZXB0aW9uX21vbml0b3JfdGltZXIudGltZXIpOworICAgICAgICBiY21vc190aW1lcl9kZXN0cm95KCZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9yZXNwb25zZV90aW1lci50aW1lcik7CisgICAgICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJmRldl9jdHJsX2RiW2RldmljZV0ucmVzZXRfZGVsYXlfdGltZXIudGltZXIpOworICAgICAgICBiY21vc19tb2R1bGVfZGVzdHJveShkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCk7CisgICAgICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmZGV2X2N0cmxfZGJbZGV2aWNlXS50YXNrX2luZm8udGFzayk7CisgICAgfQorI2VuZGlmCisjaWZuZGVmIElOX0JBTkQKKyAgICBiY21fZmxkX2V4aXQoKTsKKyNlbmRpZgorICAgIGJjbXRybXV4X2V4aXQoKTsKKyNpZm5kZWYgSU5fQkFORAorICAgIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfdW5yZWdpc3RlcigpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvYmNtb2x0X2Rldl9jdHJsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvYmNtb2x0X2Rldl9jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4N2JhMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybC9iY21vbHRfZGV2X2N0cmwuaApAQCAtMCwwICsxLDIwNSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0RFVl9DVFJMX0hfCisjZGVmaW5lIF9CQ01PTFRfREVWX0NUUkxfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlICJiY21fa2VlcF9hbGl2ZS5oIgorI2luY2x1ZGUgImJjbW9sdF9mbGQuaCIKKyNpbmNsdWRlICJiY21vbHRfc3dfZXJyb3IuaCIKKwordHlwZWRlZiBpbnQgKCpiY21vbHRfZGV2X2N0cmxfY2JfaW1hZ2VfcmVhZCkoCisgICAgYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsCisgICAgdWludDhfdCAqYnVmLAorICAgIHVpbnQzMl90IGJ1Zl9zaXplKTsKK3R5cGVkZWYgYmNtb3NfZXJybm8gKCpiY21vbHRfZGV2X2N0cmxfY2Jfc3lzdGVtX21vZGVfdmFsaWRhdGUpKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSk7Cit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtb2x0X2Rldl9jdHJsX2NiX2RldmljZV9vZmYpKGJjbW9sdF9kZXZpZCBkZXZpY2UpOwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbW9sdF9kZXZfY3RybF9jYl9kZXZpY2Vfb24pKGJjbW9sdF9kZXZpZCBkZXZpY2UpOwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbW9sdF9kZXZfY3RybF9jYl9kZXZpY2VfaXNfcnVubmluZykoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfYm9vbCAqaXNfcnVubmluZyk7Cit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtb2x0X2Rldl9jdHJsX2NiX2hvc3RfcmVzZXQpKHZvaWQpOwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbW9sdF9kZXZfY3RybF9jYl9wY2llX2NoYW5uZWxfcHJlcGFyZSkoYmNtb2x0X2RldmlkIGRldmljZSk7Cit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtb2x0X2Rldl9jdHJsX2NiX3BjaWVfY2hhbm5lbF9yZW1vdmUpKGJjbW9sdF9kZXZpZCBkZXZpY2UpOwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbW9sdF9kZXZfY3RybF9jYl9wY2llX3N0YXR1c19nZXQpKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9zX2Jvb2wgKmlzX3ByZXBhcmVkKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZGV2X2N0cmxfY2Jfc3lzdGVtX21vZGVfdmFsaWRhdGUgICAgc3lzdGVtX21vZGVfdmFsaWRhdGVfY2I7CisgICAgYmNtb2x0X2Rldl9jdHJsX2NiX2ltYWdlX3JlYWQgICAgICAgICAgICAgIGltYWdlX3JlYWRfY2I7CisgICAgYmNtb2x0X2Rldl9jdHJsX2NiX2RldmljZV9vZmYgICAgICAgICAgICAgIGRldmljZV9vZmZfY2I7CisgICAgYmNtb2x0X2Rldl9jdHJsX2NiX2RldmljZV9vbiAgICAgICAgICAgICAgIGRldmljZV9vbl9jYjsKKyAgICBiY21vbHRfZGV2X2N0cmxfY2JfZGV2aWNlX2lzX3J1bm5pbmcgICAgICAgZGV2aWNlX2lzX3J1bm5pbmdfY2I7CisgICAgYmNtb2x0X2Rldl9jdHJsX2NiX2hvc3RfcmVzZXQgICAgICAgICAgICAgIGhvc3RfcmVzZXRfY2I7CisgICAgYmNtb2x0X2Rldl9jdHJsX2NiX3BjaWVfY2hhbm5lbF9wcmVwYXJlICAgIHBjaWVfY2hhbm5lbF9wcmVwYXJlX2NiOworICAgIGJjbW9sdF9kZXZfY3RybF9jYl9wY2llX2NoYW5uZWxfcmVtb3ZlICAgICBwY2llX2NoYW5uZWxfcmVtb3ZlX2NiOworfSBiY21vbHRfZGV2X2N0cmxfcGFyYW1zOworCisjZGVmaW5lIERFVklDRV9DT05UUk9MX01TR19RVUVVRV9TSVpFICBCQ01PU19NU0dfUE9PTF9ERUZBVUxUX1NJWkUKKyNkZWZpbmUgSU1BR0VfQlVGX1NJWkUgICAgICAgICAgICAgICAgICgxICogMTAyNCAqIDEwMjQpIC8qIDFNQiAqLworI2RlZmluZSBCT09UX1NFUV9QT0xMX0lOVEVSVkFMX1NFQyAgICAgMQorI2RlZmluZSBCT09UX1NFUV9QT0xMSU5HX01BWF9OVU1CRVIgICAgNQorI2RlZmluZSBERFJfVEVTVF9QT0xMSU5HX01BWF9OVU1CRVIgICAgMjAKKyNkZWZpbmUgREVWSUNFX0NPTlRST0xfQ09ORklHX1RJTUVfVVMgICgxNSAqIDEwMDAwMDApIC8qIDE1IHNlY29uZHMgKi8KKyNkZWZpbmUgREVWSUNFX0NPTlRST0xfQ09OTkVDVF9USU1FX1VTICg0MCAqIDEwMDAwMDApIC8qIDQwIHNlY29uZHMgKi8KKyNkZWZpbmUgQ09ORklHX1NFTkRfTUFYX05VTUJFUiAgICAgICAgIDIKKyNkZWZpbmUgRklMRV9QQVRIX0xFTiAgICAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBIT1NUX0RNQV9SWF9ERUZBVUxUX1FVRVVFX1NJWkUgMTI4CisjZGVmaW5lIEhPU1RfRE1BX1RYX0RFRkFVTFRfUVVFVUVfU0laRSAxMjgKKyNkZWZpbmUgRVhDRVBUSU9OX0xPR19NT05JVE9SX0lOVEVSVkFMICg1ICogMTAwMDAwMCkgLyogNSBzZWNvbmQgKi8KKyNkZWZpbmUgREVWSUNFX1JFU1BPTlNFX1RJTUVPVVRfTEVOR1RIICgyICogMTAwMDAwKSAgLyogMjAwIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBIT1NUX1JFU0VUX0RFTEFZX1VTICAgICAgICAgICAgMTAwMDAwIC8qIGhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHJlc2V0dGluZyB0aGUgaG9zdCB2aWEgY2FsbGJhY2sgKDEwMG1zKSAqLworCisvKiBpbmRpY2F0ZXMgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uIC0gdXNlZCBpbnRlcm5hbGx5LCBubyBuZWVkIHRvIGV4cG9zZSB0aGlzIGluIHRoZSBob3N0LWZhY2luZyBlbnVtICovCisjZGVmaW5lIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fTk9ORSAoKGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24pMHhGRikKKwordHlwZWRlZiBlbnVtCit7CisgICAgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NMRUFSLAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9DT05GSUdfU0VULAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9DT05GSUdfR0VULAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9USU1FUl9USU1FT1VULAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9SRUNFSVZFRF9BQ0ssCisgICAgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0RJU0NPTk5FQ1QsCisgICAgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NPTk5FQ1QsCisgICAgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFU0VULAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0NPTk5FQ1RJT05fRkFJTFVSRSwKKyAgICBERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0VTVEFCTElTSEVELAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9SRUFEWSwKKyAgICBERVZJQ0VfQ09OVFJPTF9FVkVOVF9SVU5fRERSX1RFU1QsCisgICAgREVWSUNFX0NPTlRST0xfRVZFTlRfRERSX1RFU1RfQ09NUExFVEVELAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0REUl9URVNUX1RJTUVPVVQsCisKKyAgICBERVZJQ0VfQ09OVFJPTF9FVkVOVF9fTlVNX09GLAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX05PX0VWRU5UID0gREVWSUNFX0NPTlRST0xfRVZFTlRfX05VTV9PRgorfSBkZXZfY3RybF9ldmVudDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9FU1RBQkxJU0hJTkcsIC8qIHdyaXRpbmcgc29mdHdhcmUgdmlhIEZMRCwgd2FpdGluZyBmb3IgImNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiICovCisgICAgREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9DT05GSUdVUklORywgIC8qIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQsIGNmZyBzZW50LCB3YWl0aW5nIGZvciAiZGV2aWNlIHJlYWR5IiAqLworICAgIERFVl9DVFJMX0NPTk5FQ1RJTkdfU1RBVEVfU1RBTkRBTE9ORSwgICAvKiBjb25uZWN0aW5nIHRvIGEgc3RhbmRhbG9uZSBkZXZpY2UsIHdhaXRpbmcgZm9yICJkZXZpY2UgcmVhZHkiICovCit9IGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY2hhciBuYW1lW01BWF9UQVNLX05BTUVfU0laRV07CisgICAgYmNtb3NfdGFzayB0YXNrOworfSBkZXZfY3RybF90YXNrOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIgbmFtZVtNQVhfTU9EVUxFX05BTUVfU0laRV07CisgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZDsKK30gZGV2X2N0cmxfbW9kdWxlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIgbmFtZVtNQVhfVElNRVJfTkFNRV9TSVpFXTsKKyAgICBiY21vc190aW1lciB0aW1lcjsKK30gZGV2X2N0cmxfdGltZXI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgcGNpZV9hZGRyOworfSBkZXZfY3RybF9wY2llOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGUgc3RhdGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICBjb25maWdfc2VuZF9jb3VudGVyOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgY29uZmlnX2ludGVydmFsOworICAgIGRldl9jdHJsX3RpbWVyICAgICAgICAgICAgdGltZXI7Cit9IGRldl9jdHJsX2Nvbm5lY3Rpb247CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgICAgICAgICAgICAgcG9sbGluZ19jb3VudGVyOworICAgIHVpbnQzMl90ICAgICAgICAgICAgIHBvbGxpbmdfaW50ZXJ2YWw7CisgICAgZGV2X2N0cmxfdGltZXIgICAgICAgdGltZXI7Cit9IGRldl9jdHJsX2Jvb3Rfc2VxOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGRldl9jdHJsX3Rhc2sgICAgICAgICAgIHRhc2tfaW5mbzsKKyAgICBkZXZfY3RybF9tb2R1bGUgICAgICAgICBtb2R1bGVfaW5mbzsKKyAgICBkZXZfY3RybF9jb25uZWN0aW9uICAgICBjb25uZWN0aW9uX2luZm87CisgICAgZGV2X2N0cmxfcGNpZSAgICAgICAgICAgcGNpZV9pbmZvOworICAgIGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAgIGthX2luZm87CisgICAgZGV2X2N0cmxfYm9vdF9zZXEgICAgICAgYm9vdF9zZXFfaW5mbzsKKyAgICBiY21fZmxkX2RldmljZV9pbmZvICAgICBmbGRfaW5mbzsKKyAgICBiY21vbHRfZGV2aWNlX2NmZ19kYXRhICBkZXZpY2VfcGFyYW1zOworICAgIGJjbW9sdF9wcmVzZW5jZV9tYXNrICAgIGRldmljZV9wYXJhbXNfcHJlc2VudDsKKyAgICBkZXZfY3RybF90aW1lciAgICAgICAgICBleGNlcHRpb25fbW9uaXRvcl90aW1lcjsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBjb3JyX3RhZzsKKyAgICBiY21vbHRfbXNnICogICAgICAgICAgICBsYXN0X21lc3NhZ2U7CisgICAgZGV2X2N0cmxfdGltZXIgICAgICAgICAgZGV2aWNlX3Jlc3BvbnNlX3RpbWVyOworICAgIGRldl9jdHJsX3RpbWVyICAgICAgICAgIHJlc2V0X2RlbGF5X3RpbWVyOworICAgIGJjbW9zX2Jvb2wgICAgICAgICAgICAgIGlzX2hvc3RfcmVzZXRfcGVuZGluZzsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgc3JhbV9sb2dfb2Zmc2V0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1zZ3NfcmVhZDsKKyNlbmRpZgorICAgIGJjbW9sdF9jb250cm9sX3N0YXRlICAgIGVuYWJsZV90b2Q7CisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICB0cnhfZGlzYWJsZV9tYXNrOworI2VuZGlmCisgICAgZGV2X2N0cmxfZXZlbnQgbGFzdF9ldmVudDsKKyAgICBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIGNvbm5fZmFpbF9yZWFzb247CisgICAgdWludDMyX3Qgc3dfZXJyb3JfY291bnQ7CisgICAgYmNtb2x0X3N3X2Vycm9yIHN3X2Vycm9yc1szMF07CisgICAgZGV2X2xvZ19pZCBsb2dfaWQ7Cit9IGRldl9jdHJsX2RhdGFiYXNlOworCit0eXBlZGVmIHZvaWQgKCpkZXZfY3RybF9zbV9jYikoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKTsKKworI2RlZmluZSBERVZJQ0VfSURfRlJPTV9NT0RVTEVfSUQobW9kdWxlX2lkKSAoKGJjbW9sdF9kZXZpZCkobW9kdWxlX2lkIC0gQkNNT1NfTU9EVUxFX0lEX0RFVl9DVFJMX0RFVjApKQorI2RlZmluZSBNT0RVTEVfSURfRlJPTV9ERVZJQ0VfSUQoZGV2aWNlKSAoKGJjbW9zX21vZHVsZV9pZCkoZGV2aWNlICsgQkNNT1NfTU9EVUxFX0lEX0RFVl9DVFJMX0RFVjApKQorCitjb25zdCBjaGFyICpiY21fc3RyX2RldmljZV9zdGF0ZShiY21vbHRfZGV2aWNlX3N0YXRlIGRldmljZV9zdGF0ZSk7Citjb25zdCBjaGFyICpiY21fc3RyX2RldmljZV9ldmVudChkZXZfY3RybF9ldmVudCBkZXZpY2VfZXZlbnQpOworY29uc3QgY2hhciAqYmNtX3N0cl9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24oYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiByZWFzb24pOworY29uc3QgY2hhciAqYmNtX3N0cl9ob3N0X2Nvbm5lY3Rpbmdfc3RhdGUoZGV2X2N0cmxfY29ubmVjdGluZ19zdGF0ZSBzdGF0ZSk7Cit2b2lkIGRldl9jdHJsX3JlYWRfZGIoYmNtb2x0X2RldmlkIGRldmljZSwgZGV2X2N0cmxfZGF0YWJhc2UgKmRiKTsKKworYmNtb3NfZXJybm8gYmNtb2x0X2Rldl9jdHJsX2hvc3RfZXZlbnRfd3JpdGUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBldmVudCk7CisKKy8qVXNlIGRpZmZlcmVudCBmdW5jdGlvbiBzaWduYXR1cmVzIGxpbnV4IGtlcm5lbCBkZXZpY2UgY29udHJvbCBhbmQgb3RoZXIqLworI2lmICFkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCitiY21vc19lcnJubyBiY21vbHRfZGV2X2N0cmxfaW5pdChiY21vbHRfZGV2X2N0cmxfcGFyYW1zICpwYXJhbXMpOworI2Vsc2UKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfY3RybF9pbml0KHZvaWQpOworI2VuZGlmCisKK3ZvaWQgYmNtb2x0X2Rldl9jdHJsX2V4aXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbi9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3OWE1OQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vTWFrZWZpbGUKQEAgLTAsMCArMSwyMiBAQAorIyBEZXZpY2UgY29udHJvbCBkcml2ZXIKK01PRF9OQU1FID0gZGV2X2N0cmxfZGFlbW9uCitNT0RfREVQUyA9IHRybXV4ICBkZWJ1Z19jb21tb24ga2VlcF9hbGl2ZSAKKworaWZuZXEgKCIkKFNJTVVMQVRJT05fQlVJTEQpIiwgInkiKQorCU1PRF9ERVBTICs9IHRybXV4X2RhZW1vbiBrZWVwX2FsaXZlX2RhZW1vbgorZW5kaWYKKworTU9EX0lOQ19ESVJTID0gJChTUkNfRElSKQorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfSU5DX0RJUlMgKz0gaG9zdF9kcml2ZXIvc3dfdmVyc2lvbiBob3N0X2RyaXZlci9zd19lcnJvciBob3N0X2RyaXZlci9taF91dGlscworZWxzZQorICAgIE1PRF9JTkNfRElSUyArPSBob3N0L3N3X3ZlcnNpb24gJChUT1BfRElSKS9jb21tb24vc3dfZXJyb3IgJChUT1BfRElSKS9jb21tb24vbWhfdXRpbHMKK2VuZGlmCisKK01PRF9UWVBFID0gbGliCisKK01PRF9ERUZTICs9IC1ESU5fQkFORAorCitzcmNzID0gYmNtb2x0X2Rldl9jdHJsX2liLmMgYmNtb2x0X2RlYnVnX2N0cmxfaWIuYworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL2JjbW9sdF9kZWJ1Z19jdHJsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL2JjbW9sdF9kZWJ1Z19jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMGEyNTI1MwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vYmNtb2x0X2RlYnVnX2N0cmwuaApAQCAtMCwwICsxIEBACisuLi9kZXZfY3RybC9iY21vbHRfZGVidWdfY3RybC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbi9iY21vbHRfZGVidWdfY3RybF9pYi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbi9iY21vbHRfZGVidWdfY3RybF9pYi5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjM2Mzc4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL2JjbW9sdF9kZWJ1Z19jdHJsX2liLmMKQEAgLTAsMCArMSBAQAorLi4vZGV2X2N0cmwvYmNtb2x0X2RlYnVnX2N0cmwuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vYmNtb2x0X2Rldl9jdHJsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL2JjbW9sdF9kZXZfY3RybC5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNiMDUwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL2JjbW9sdF9kZXZfY3RybC5oCkBAIC0wLDAgKzEgQEAKKy4uL2Rldl9jdHJsL2JjbW9sdF9kZXZfY3RybC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbi9iY21vbHRfZGV2X2N0cmxfaWIuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vYmNtb2x0X2Rldl9jdHJsX2liLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjIzYmQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vYmNtb2x0X2Rldl9jdHJsX2liLmMKQEAgLTAsMCArMSBAQAorLi4vZGV2X2N0cmwvYmNtb2x0X2Rldl9jdHJsLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL3VzZXIvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL3VzZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMDFjYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vdXNlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE0IEBACitpZm5lcSAoIiQoU0lNVUxBVElPTl9CVUlMRCkiLCAieSIpCisKK01PRF9OQU1FID0gYmNtX2Rldl9jdHJsX3VzZXIKK01PRF9UWVBFID0gYXBwCitNT0RfREVQUyA9IHVkdHIgb3NfY2xpIHVzZXJfY29uZmlnIGhvc3RfYXBpIGRldl9jdHJsX2RhZW1vbiB0cm11eF9kYWVtb24ga2VlcF9hbGl2ZV9kYWVtb24KKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisJTU9EX0RFUFMgKz0gYXBpX2NsaSBlbWJlZGRlZF9jbGkKK2VuZGlmCisKK3NyY3MgPSBiY21vbHRfZGV2X2N0cmxfdXNlci5jCisKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vdXNlci9iY21vbHRfZGV2X2N0cmxfdXNlci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbi91c2VyL2JjbW9sdF9kZXZfY3RybF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmFhNzIyOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vdXNlci9iY21vbHRfZGV2X2N0cmxfdXNlci5jCkBAIC0wLDAgKzEsNzIgQEAKKyNpbmNsdWRlIDxiY21vbHRfdHJfdWRfZHJpdmVyLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfZGV2X2N0cmwuaD4KKyNpbmNsdWRlIDxiY21vbHRfdHJfbXV4Lmg+CisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X3VzZXJfdXRpbHMuaD4KKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfZmxkLmg+CisjaW5jbHVkZSA8YmNtdHJfcGNpZS5oPgorCitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiY21vbHRfZGlyOworCitiY21vc19lcnJubyBiY210cl9pbml0KHZvaWQpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKyNpZmRlZiBFTkFCTEVfTE9HCisjZGVmaW5lIERFVl9MT0dfU0laRTEgMTw8MTEKKyNkZWZpbmUgREVWX0xPR19TSVpFMiAxPDwxMworI2RlZmluZSBERVZfTE9HX1FVRVVFX1NJWkUgMTAwMAorCitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2N0cmxfbG9nZ2VyX2luaXRfY2Iodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBzdGF0aWMgdWludDhfdCBsb2dnZXJfYnVmMVtERVZfTE9HX1NJWkUxXTsKKyAgICBzdGF0aWMgdWludDhfdCBsb2dnZXJfYnVmMltERVZfTE9HX1NJWkUyXTsKKyAgICB2b2lkICphZGRyZXNzZXNbREVWX0xPR19NQVhfRklMRVNdID0ge2xvZ2dlcl9idWYxLCBsb2dnZXJfYnVmMn07CisgICAgdWludDMyX3Qgc2l6ZXNbREVWX0xPR19NQVhfRklMRVNdID0ge3NpemVvZihsb2dnZXJfYnVmMSksIHNpemVvZihsb2dnZXJfYnVmMil9OworICAgIHVpbnQzMl90IGZsYWdzW0RFVl9MT0dfTUFYX0ZJTEVTXSA9IHtCQ01fREVWX0xPR19GSUxFX0ZMQUdfU1RPUF9XSEVOX0ZVTEwsIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19XUkFQX0FST1VORH07CisKKyAgICByYyA9IGJjbV9kZXZfbG9nX2luaXRfZGVmYXVsdF9sb2dnZXIoYWRkcmVzc2VzLCBzaXplcywgZmxhZ3MsIEJDTV9TSVpFT0ZBUlJBWShhZGRyZXNzZXMpLCAweDQwMDAsIFRBU0tfUFJJT1JJVFlfREVWX0xPRywgREVWX0xPR19RVUVVRV9TSVpFKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2Rldl9sb2dfaW5pdGlhbGl6ZV9kZXZfbG9nZ2VyX2RlZmF1bHQoKVxuIik7CisKKyAgICAvKiBGb3Igbm93IGp1c3QgbWFwIEJDTU9TX1RSQUNFX1hYIHRvIGRldl9sb2cuIExhdGVyIG9uIGRldl9jb250cm9sCisgICAgICogY2FuIGRlZmluZSBpdHMgb3duIGxvZyBpZHMKKyAgICAgKi8KKyAgICAvL3JjID0gYmNtX2Rldl9sb2dfb3NfdHJhY2VfaW5pdCgpOworICAgIC8vQlVHX09OKHJjKTsKKworICAgIHJldHVybiByYzsKK30KKyNlbmRpZgorCisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfaG9zdF9pbml0X3BhcmFtcyBwYXJhbXMgPQorICAgIHsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgIC5sb2dnZXJfaW5pdF9jYiA9IGRldl9jdHJsX2xvZ2dlcl9pbml0X2NiLAorI2VuZGlmCisgICAgICAgIC5ydW5fZGV2X2N0cmwgPSBCQ01PU19UUlVFCisgICAgfTsKKworICAgIHJjID0gYmNtb2x0X2hvc3RfaW5pdCgmcGFyYW1zKTsKKyAgICBCVUdfT04ocmMpOworCisgICAgYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KEJDTU9TX1RSQUNFX0xFVkVMX0RFQlVHKTsKKworICAgIHJjID0gYmNtdHJfdWRfaW5pdCgpOyAgLyogIE5ldmVyIHJldHVybnMgLSBydW5zIGFjY2VwdCBsb29wICovCisgICAgQlVHX09OKHJjKTsKKworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgYmNtb3NfdXNsZWVwKDUqMTAwMCoxMDAwKTsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCJXYWl0aW5nXG4iKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9mbGQvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTcxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL01ha2VmaWxlCkBAIC0wLDAgKzEsMzggQEAKKyMgRkxEIGRyaXZlcgorIyAtIGxvdy1sZXZlbCBGTEQgZHJpdmVyIChsb2FkIGZ1bmN0aW9ucykKKyMKK01PRF9OQU1FID0gZmxkCitNT0RfREVQUyA9IG1vZGVsCisKK2lmbmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfSU5DX0RJUlMgPSAkKFNSQ19ESVIpIGNvbW1vbi9kcml2ZXJzLyQoUExBVEZPUk0pL2ZsZAorZW5kaWYKKworaWZlcSAoIiQoRU5BQkxFX1RSQUNFKSIsICJ5IikKKwlNT0RfREVGUyArPSAtRFRYX0VOQUJMRV9FVkVOVF9UUkFDRQorICAgIGlmZXEgKCIkKERFQlVHX1RSQUNFX0lOSVQpIiwgInkiKQorICAgICAgIE1PRF9ERUZTICs9IC1EREVCVUdfVFJBQ0VfSU5JVAorICAgIGVuZGlmCitlbmRpZgorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKK01PRF9UWVBFID0gbGludXhfbGliCitlbHNlCitNT0RfVFlQRSA9IGxpYgorZW5kaWYKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKKyMgRGlzYWJsZSAiY2FzdCBpbmNyZWFzZXMgcmVxdWlyZWQgYWxpZ25tZW50IG9mIHRhcmdldCB0eXBlIiB3YXJuaW5nLiAKKyMgVGhlcmUgYXJlIHBsYWNlcyBpbiB0aGUgY29kZSB3aXRoIGNhc3RpbmcgZnJvbSAodWludDhfdCAqKSB0byAodWludDMyX3QgKiksIGJ1dCBpbiBmYWN0CisjIHRoZSBidWZmZXIgaXMgd2VsbC1hbGlnbmVkLiAKK0VYVFJBX0NGTEFHUyArPSAtV25vLWVycm9yPWNhc3QtYWxpZ24KKworc3JjcyA9IGJjbW9sdF9mbGQuYworCitVU0VfTElOVCA9IHllcworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL2JjbV9mbGRfY29tbW9uLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL2JjbV9mbGRfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2YzMyZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9mbGQvYmNtX2ZsZF9jb21tb24uaApAQCAtMCwwICsxLDI0NSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01fRkxEX0NPTU1PTl9ICisjZGVmaW5lIEJDTV9GTERfQ09NTU9OX0gKKworI2RlZmluZSBCQ01fRkxEX1NSQU1fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgLyogNjQgS0IgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZMRCBjb21tdW5pY2F0aW9uIGFyZWEgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENPTU1fV09SRF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMiBiaXQsIDQgYnl0ZSAqLworI2RlZmluZSBCQ01fRkxEX0NPTU1VTklDQVRJT05fQVJFQV9UT1AgICAgICAgICAgICAgIEJDTV9GTERfU1JBTV9TSVpFCisKKy8qIFBsZWFzZSBkbyBub3QgY2hhbmdlIFBDSUVfT1BBUVVFX0RBVEFfU0laRSBkZWZpbmUsIE1VU1QgYmUgc2FtZSBhcyB1c2VkIGJ5IHBjaWUgZG1hIGRyaXZlciAqLworI2RlZmluZSBQQ0lFX09QQVFVRV9EQVRBX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICgyKjQpICAgICAgICAgICAgICAgLyogdHdvIHBvaW50ZXJzIChCRCBhbmQgU0JEKSAqLworCisjZGVmaW5lIEJPT1RSRUNPUkRfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgKDIqQ09NTV9XT1JEX1NJWkUpICAvKiA0IHdvcmRzIHJlc2VydmVkIGZvciBmdXR1cmUgbmVlZHMgKi8KKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUE9TVE1PUlRFTV9CVUZfU0laRSAgICAgICAgICAgICAweDAwMDAxMDAwCisKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfU1RBVEVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9DT01NVU5JQ0FUSU9OX0FSRUFfVE9QICAgICAgIC0gQ09NTV9XT1JEX1NJWkUpICAgICAvKiAweGZmZmMgKi8KKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1NUQVRFX09GRlNFVCAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9DUFVfU1RBVEVfT0ZGU0VUICAgICAgICAgICAgIC0gQ09NTV9XT1JEX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfQ1BVX0RFQlVHX1NUQVRFX09GRlNFVCAgICAgICAgICAgICAgKEJDTV9GTERfSE9TVF9TVEFURV9PRkZTRVQgICAgICAgICAgICAtIENPTU1fV09SRF9TSVpFKQorI2RlZmluZSBCQ01fRkxEX0hPU1RfREVCVUdfU1RBVEVfT0ZGU0VUICAgICAgICAgICAgIChCQ01fRkxEX0NQVV9ERUJVR19TVEFURV9PRkZTRVQgICAgICAgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfQk9PVFJFQ19TVEFURV9PRkZTRVQgICAgICAgICAgICAoQkNNX0ZMRF9IT1NUX0RFQlVHX1NUQVRFX09GRlNFVCAgICAgIC0gQ09NTV9XT1JEX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfSE9TVF9CT09UUkVDX1NUQVRFX09GRlNFVCAgICAgICAgICAgKEJDTV9GTERfQ1BVX0JPT1RSRUNfU1RBVEVfT0ZGU0VUICAgICAtIENPTU1fV09SRF9TSVpFKQorCisjZGVmaW5lIEJDTV9GTERfQ1BVX1JFU0VUX1JFQVNPTl9PRkZTRVQgICAgICAgICAgICAgKEJDTV9GTERfSE9TVF9CT09UUkVDX1NUQVRFX09GRlNFVCAgICAtIENPTU1fV09SRF9TSVpFKQorI2RlZmluZSBCQ01fRkxEX0NQVV9FWENFUF9SRUFTT05fT0ZGU0VUICAgICAgICAgICAgIChCQ01fRkxEX0NQVV9SRVNFVF9SRUFTT05fT0ZGU0VUICAgICAgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfRERSX01FTUNfU1RBVEVfT0ZGU0VUICAgICAgICAgICAoQkNNX0ZMRF9DUFVfRVhDRVBfUkVBU09OX09GRlNFVCAgICAgIC0gQ09NTV9XT1JEX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfUkFTXzBfRERSX01FTUNfU1RBVEVfT0ZGU0VUICAgICAgICAgKEJDTV9GTERfQ1BVX0REUl9NRU1DX1NUQVRFX09GRlNFVCAgICAtIENPTU1fV09SRF9TSVpFKQorI2RlZmluZSBCQ01fRkxEX1JBU18xX0REUl9NRU1DX1NUQVRFX09GRlNFVCAgICAgICAgIChCQ01fRkxEX1JBU18wX0REUl9NRU1DX1NUQVRFX09GRlNFVCAgLSBDT01NX1dPUkRfU0laRSkKKworI2RlZmluZSBCQ01fRkxEX0NQVV9ERFJfUEhZX1NUQVRFX09GRlNFVCAgICAgICAgICAgIChCQ01fRkxEX1JBU18xX0REUl9NRU1DX1NUQVRFX09GRlNFVCAgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9SQVNfMF9ERFJfUEhZX1NUQVRFX09GRlNFVCAgICAgICAgICAoQkNNX0ZMRF9DUFVfRERSX1BIWV9TVEFURV9PRkZTRVQgICAgIC0gNipDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9SQVNfMV9ERFJfUEhZX1NUQVRFX09GRlNFVCAgICAgICAgICAoQkNNX0ZMRF9SQVNfMF9ERFJfUEhZX1NUQVRFX09GRlNFVCAgIC0gNipDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9CT09UX1BST1RPQ09MX1ZFUlNJT05fT0ZGU0VUICAgICAgICAoQkNNX0ZMRF9SQVNfMV9ERFJfUEhZX1NUQVRFX09GRlNFVCAgIC0gNipDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9PU19FTlRSWV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9CT09UX1BST1RPQ09MX1ZFUlNJT05fT0ZGU0VUIC0gQ09NTV9XT1JEX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfQ1BVX1NFVF9RVUVVRVNfU0laRSAgICAgICAgICAgICAgICAgKEJDTV9GTERfT1NfRU5UUllfT0ZGU0VUIC0gQ09NTV9XT1JEX1NJWkUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCb290LXJlY29yZCAgYXJlYSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGhvc3Qgd3JpdGUgZm9yIFNvQyBpdHMgcnggcXVldWUgc2l6ZSAqLworI2RlZmluZSBCQ01fRkxEX0hPU1RfUlhfUVVFVUVfU0laRV9PRkZTRVQgICAgICAgICAgIChCQ01fRkxEX0NQVV9TRVRfUVVFVUVTX1NJWkUgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUlhfUVVFVUVfU0laRV9PRkZTRVQgICAgICAgICAgICAoQkNNX0ZMRF9IT1NUX1JYX1FVRVVFX1NJWkVfT0ZGU0VUIC0gQ09NTV9XT1JEX1NJWkUpCisKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfQk9PVFJFQ09SRF9PRkZTRVQgICAgICAgICAgICAgICAoQkNNX0ZMRF9DUFVfUlhfUVVFVUVfU0laRV9PRkZTRVQgLSBCT09UUkVDT1JEX1JFU0VSVkVEKQorCisjZGVmaW5lIEJDTV9GTERfSE9TVF9CT09UUkVDT1JEX09GRlNFVCAgICAgICAgICAgICAgKEJDTV9GTERfQ1BVX0JPT1RSRUNPUkRfT0ZGU0VUIC0gUENJRV9PUEFRVUVfREFUQV9TSVpFIC0gQk9PVFJFQ09SRF9SRVNFUlZFRCApCisKKyNkZWZpbmUgQkNNX0ZMRF9DUFUxX1BPU1RNT1JURU1fU1RBVEUgICAgICAgICAgICAgICAoQkNNX0ZMRF9IT1NUX0JPT1RSRUNPUkRfT0ZGU0VUIC0gQ09NTV9XT1JEX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfQ1BVMF9QT1NUTU9SVEVNX1NUQVRFICAgICAgICAgICAgICAgKEJDTV9GTERfQ1BVMV9QT1NUTU9SVEVNX1NUQVRFIC0gQ09NTV9XT1JEX1NJWkUpCisKKyNkZWZpbmUgQkNNX0ZMRF9SQVNfMF9TRVRUSU5HUyAgICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9DUFUwX1BPU1RNT1JURU1fU1RBVEUgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9SQVNfMV9TRVRUSU5HUyAgICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9SQVNfMF9TRVRUSU5HUyAtIENPTU1fV09SRF9TSVpFKQorCisjZGVmaW5lIEJDTV9SQVNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBCQ01fUkFTX01PREVfR1BPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQkNNX1JBU19NT0RFX1hHUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisKKyNkZWZpbmUgQkNNX0ZMRF9BVlNfU0VUVElOR1MgICAgICAgICAgICAgICAgICAgICAgICAgKEJDTV9GTERfUkFTXzFfU0VUVElOR1MgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9BVlNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIEJDTV9GTERfQVZTX0NPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorCisjaWZkZWYgVFhfRU5BQkxFX0VWRU5UX1RSQUNFCisjZGVmaW5lIEJDTV9GTERfRVZFTlRfVFJBQ0VfT0ZGU0VUICAgICAgICAgICAgICAgICAgIChCQ01fRkxEX0FWU19TRVRUSU5HUyAtIENPTU1fV09SRF9TSVpFKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgUEFZIEFUVEVOVElPTiAhISEgQkNNX0ZMRF9DT01NVU5JQ0FUSU9OX0FSRUFfQkFTRSBtdXN0IGJlIGVxdWFsIGZpcnN0IGJ5dGUgaW4gdGhlIEZMRAorICAgICAgICAgICAgY29tbXVuaWNhdGlvbiBhcmVhIHRoZXJlZm9yZSAgaXQgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBsYXN0IGRlZmluZSBhYm92ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEJDTV9GTERfQ09NTVVOSUNBVElPTl9BUkVBX0JBU0UgICAgICAgICAgICAgQkNNX0ZMRF9FVkVOVF9UUkFDRV9PRkZTRVQKKyNlbHNlCisjZGVmaW5lIEJDTV9GTERfQ09NTVVOSUNBVElPTl9BUkVBX0JBU0UgICAgICAgICAgICAgQkNNX0ZMRF9SQVNfMV9TRVRUSU5HUworI2VuZGlmCisjZGVmaW5lIEJDTV9GTERfQ09NTVVOSUNBVElPTl9BUkVBX1NJWkUgICAgICAgICAgICAgQkNNX0ZMRF9DT01NVU5JQ0FUSU9OX0FSRUFfVE9QIC0gQkNNX0ZMRF9DT01NVU5JQ0FUSU9OX0FSRUFfQkFTRQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgUEFZIEFUVEVOVElPTiAhISEgUE9TVE1PUlRFTV9CVUZfT0ZGU0VUIG11c3QgYmUgb3V0c2lkZSB0aGUgY29tbXVuaWNhdGlvbiBhcmVhCisgICAgICAgICAgICAgdGhlcmVmb3JlICBpdCBzaG91bGQgYmUgZGVmaW5lZCBmcm9tIEJDTV9GTERfQ09NTVVOSUNBVElPTl9BUkVBX0JBU0UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBCQ01fRkxEX0NQVTFfUE9TVE1PUlRFTV9CVUZfT0ZGU0VUICAgICAgICAgIChCQ01fRkxEX0NPTU1VTklDQVRJT05fQVJFQV9CQVNFIC0gQkNNX0ZMRF9DUFVfUE9TVE1PUlRFTV9CVUZfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9DUFUwX1BPU1RNT1JURU1fQlVGX09GRlNFVCAgICAgICAgICAoQkNNX0ZMRF9DUFUxX1BPU1RNT1JURU1fQlVGX09GRlNFVCAtIEJDTV9GTERfQ1BVX1BPU1RNT1JURU1fQlVGX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfSE9TVF9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgKEJDTV9GTERfQ1BVMF9QT1NUTU9SVEVNX0JVRl9PRkZTRVQgLSBDT01NX1dPUkRfU0laRSkKKworI2RlZmluZSBCQ01fRkxEX0REUl9URVNUX1JFU1VMVFNfU0laRSAgICAgICAgICAgICAgICgzICogQ09NTV9XT1JEX1NJWkUpIC8qIENQVSArIFJBUyAwICsgUkFTIDEgKi8KKyNkZWZpbmUgQkNNX0ZMRF9ERFJfVEVTVF9SRVNVTFRTICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9IT1NUX0VWRU5UIC0gQkNNX0ZMRF9ERFJfVEVTVF9SRVNVTFRTX1NJWkUpCisKKy8qIFNXIEVycm9yIHRhYmxlICovCisjZGVmaW5lIEJDTV9GTERfU1dfRVJST1JfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgKDExNzEgKiBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9TV19FUlJPUl9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9ERFJfVEVTVF9SRVNVTFRTIC0gQkNNX0ZMRF9TV19FUlJPUl9UQUJMRV9TSVpFKQorCisvKiBsb2dnZXIgd2lsbCBOT1Qgb3ZlcndyaXRlIG90aGVyIGZpZWxkcyAqLworI2RlZmluZSBCQ01fRkxEX0xPR0dFUl9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9GTERfU1dfRVJST1JfVEFCTEUKKyNkZWZpbmUgQkNNX0ZMRF9MT0dHRVJfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGxvZ2dlciB3aWxsIG92ZXJ3cml0ZSB0aGUgYm9vdGxvYWRlciAqLworCisvKiBCQ002ODYyMCAoTWFwbGUpIGZ1bmN0aW9uYWwgc3RhdGVzICovCisjZGVmaW5lIEJDTV9GTERfQ1BVX0ZJTklTSF9CT09UTE9BREVSX1NISUZUICAgICAgICAgMAorI2RlZmluZSBCQ01fRkxEX0NQVV9GSU5JU0hfQk9PVExPQURFUl9NQVNLICAgICAgICAgICgweDEgPDwgQkNNX0ZMRF9DUFVfRklOSVNIX0JPT1RMT0FERVJfU0hJRlQpCisKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUkVBRFlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJDTV9GTERfQ1BVX1JFQURZX01BU0sgICAgICAgICAgICAgICAgICAgICAgKDB4MSA8PCBCQ01fRkxEX0NQVV9SRUFEWV9TSElGVCkKKworI2RlZmluZSBCQ01fRkxEX0REUl9URVNUX0RPTkVfU0hJRlQgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQkNNX0ZMRF9ERFJfVEVTVF9ET05FX01BU0sgICAgICAgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfRERSX1RFU1RfRE9ORV9TSElGVCkKKworLyogQkNNNjg2MjAgKEhvc3QpIGZ1bmN0aW9uYWwgc3RhdGVzICovCisjZGVmaW5lIEJDTV9GTERfSE9TVF9GSU5JU0hfV1JJVEVfRERSX1NISUZUICAgICAgICAgMAorI2RlZmluZSBCQ01fRkxEX0hPU1RfRklOSVNIX1dSSVRFX0REUl9NQVNLICAgICAgICAgICgweDEgPDwgQkNNX0ZMRF9IT1NUX0ZJTklTSF9XUklURV9ERFJfU0hJRlQpCisKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1JVTl9DUFVfRERSX1RFU1RfU0hJRlQgICAgICAgICAxCisjZGVmaW5lIEJDTV9GTERfSE9TVF9SVU5fQ1BVX0REUl9URVNUX01BU0sgICAgICAgICAgKDB4MSA8PCBCQ01fRkxEX0hPU1RfUlVOX0NQVV9ERFJfVEVTVF9TSElGVCkKKworI2RlZmluZSBCQ01fRkxEX0hPU1RfUlVOX1JBU18wX1RFU1RfU0hJRlQgICAgICAgICAgIDIKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1JVTl9SQVNfMF9URVNUX01BU0sgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfSE9TVF9SVU5fUkFTXzBfVEVTVF9TSElGVCkKKworI2RlZmluZSBCQ01fRkxEX0hPU1RfUlVOX1JBU18xX1RFU1RfU0hJRlQgICAgICAgICAgIDMKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1JVTl9SQVNfMV9URVNUX01BU0sgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfSE9TVF9SVU5fUkFTXzFfVEVTVF9TSElGVCkKKworLyogaG9zdCBib290cmVjb3JkIHN0YXRlcyAqLworI2RlZmluZSBCQ01fRkxEX0hPU1RfUFJNX1ZBTElEX1NISUZUICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1BSTV9WQUxJRF9NQVNLICAgICAgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfSE9TVF9QUk1fVkFMSURfU0hJRlQpCisKKy8qIGRldmljZSBib290cmVjb3JkIHN0YXRlcyAqLworI2RlZmluZSBCQ01fRkxEX0NQVV9QUk1fVkFMSURfU0hJRlQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUFJNX1ZBTElEX01BU0sgICAgICAgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfQ1BVX1BSTV9WQUxJRF9TSElGVCkKKworLyogcXVldWUgdmFsaWRpdHkgZmxhZyAqLworI2RlZmluZSBCQ01fRkxEX0NQVV9RVUVVRV9WQUxJRF9TSElGVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUVVFVUVfVkFMSURfTUFTSyAgICAgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfQ1BVX1FVRVVFX1ZBTElEX1NISUZUKQorCisvKiBDUFUgZGVidWcgc3RhdGVzICovCisjZGVmaW5lIENQVV9ERUJVR19CT09UX0ZMQVNIICAgICAgICAoMTw8MCkKKyNkZWZpbmUgQ1BVX0RFQlVHX1JVTl9fRlJPTV9TUkFNICAgICgxPDwxKQorI2RlZmluZSBDUFVfREVCVUdfTFVUX0RPTkUgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIENQVV9ERUJVR19CMTVfQ0ZHX0RPTkUgICAgICAoMTw8MykKKyNkZWZpbmUgQ1BVX0RFQlVHX1VBUlRfSU5JVF9ET05FICAgICgxPDw0KQorI2RlZmluZSBDUFVfREVCVUdfQ0xFQVJfQlNTX0RPTkUgICAgKDE8PDUpCisjZGVmaW5lIENQVV9ERUJVR19SVU5fQyAgICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgQ1BVX0RFQlVHX0ZMQVNIX1JFQURfRkFJTEVEICgxPDw3KQorI2RlZmluZSBDUFVfREVCVUdfT1NfRkFJTEVEICAgICAgICAgKDE8PDgpCisKKy8qIENQVSBleGNlcHRpb24gcmVhc29uICovCisjZGVmaW5lIENQVV9FWENFUF9VTkRFRl9JTlNUUiAgICAgICAoMTw8MCkKKyNkZWZpbmUgQ1BVX0VYQ0VQX1NXX0lOVFIgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBDUFVfRVhDRVBfUFJFRkVUQ0hfQUJPUlQgICAgKDE8PDIpCisjZGVmaW5lIENQVV9FWENFUF9EQVRBX0FCT1JUICAgICAgICAoMTw8MykKKyNkZWZpbmUgQ1BVX0VYQ0VQX0lSUSAgICAgICAgICAgICAgICgxPDw0KQorI2RlZmluZSBDUFVfRVhDRVBfRklRICAgICAgICAgICAgICAgKDE8PDUpCisKKyNpZm5kZWYgX19BU1NFTUJMRVJfXworLyogU29DIHN0YXRlcyB2YWx1ZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9GTERfQ1BVX1NUQVRFX1VOS05PV04sCisgICAgQkNNX0ZMRF9TUkFNX0JPT1RfRE9ORSwKKyAgICBCQ01fRkxEX0JPT1RfRlJPTV9ERFIsCisgICAgQkNNX0ZMRF9SVU5fRlJPTV9ERFIsCisgICAgQkNNX0ZMRF9DUFVfUkVBRFksCisgICAgQkNNX0ZMRF9IT1NUX1JFQURZLAorICAgIEJDTV9GTERfQ1BVX0ZJTklTSF9CT09UTE9BREVSCit9IEJDTV9GTERfQ1BVX1NUQVRFOworCisvKiBTb0MgcmVzZXQgdmFsdWVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01fRkxEX0NQVV9SRVNFVF9VTktOT1dOCit9IEJDTV9GTERfQ1BVX1JFU0VUX1JFQVNPTjsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX0ZMRF9SQVNfTU9ERV9OT1RfQ09ORklHVVJFRCwKKyAgICBCQ01fRkxEX1JBU19NT0RFX0dQT04sCisgICAgQkNNX0ZMRF9SQVNfTU9ERV9YR1BPTiwKKyAgICBCQ01fRkxEX1JBU19NT0RFX1hHU19OR1BPTjIsCit9IEJDTV9GTERfUlNNX01PREU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdW5zaWduZWQgaW50IG1hZ2ljOworICAgIHVuc2lnbmVkIGludCBtc2dfbGVuOworICAgIGNoYXIgbXNnWzFdOworfSBCQ01fRkxEX1BPU1RNT1JURU1fTE9HOworI2VuZGlmCisKKyNkZWZpbmUgQkNNX0ZMRF9QT1NUTU9SVEVNX0xPR19NQUdJQyAgICAgIDB4RkVFREJBQ0MKKworLyogZGV2aWNlX2RlYnVnX3N0YXRlcyAqLworI2RlZmluZSBCQ01fRkxEX0NQVV9CT09UX0ZST01fU1JBTV9TVEFURVNfU0hJRlQgICAgIDAKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfQk9PVF9GUk9NX1NSQU1fU1RBVEVTX01BU0sgICAgICAweDAwMDAwMGZmVQorI2RlZmluZSBCQ01fRkxEX0NQVV9CT09UX0ZST01fU1JBTV9FUlJPUlNfU0hJRlQgICAgIDgKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfQk9PVF9GUk9NX1NSQU1fRVJST1JTX01BU0sgICAgICAweDAwMDBmZjAwVQorI2RlZmluZSBCQ01fRkxEX0NQVV9CT09UX0ZST01fU1JBTV9FWENFUFRJT05fU0hJRlQgIDE2CisjZGVmaW5lIEJDTV9GTERfQ1BVX0JPT1RfRlJPTV9TUkFNX0VYQ0VQVElPTl9NQVNLICAgMHgwMGZmMDAwMFUKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUlVOX0ZST01fRERSX1NUQVRFU19TSElGVCAgICAgICAyNAorI2RlZmluZSBCQ01fRkxEX0NQVV9SVU5fRlJPTV9ERFJfU1RBVEVTX01BU0sgICAgICAgIDB4ZmYwMDAwMDBVCisvKiBob3N0X2RlYnVnX3N0YXRlcyAqLworI2RlZmluZSBCQ01fRkxEX0hPU1RfV1JJVEVfU1JBTV9TSElGVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1dSSVRFX1NSQU1fTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDAxVQorI2RlZmluZSBCQ01fRkxEX0hPU1RfU1RBUlRfQ1BVX1NISUZUICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1NUQVJUX0NQVV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVQorI2RlZmluZSBCQ01fRkxEX0hPU1RfV1JJVEVfRERSX1NISUZUICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1dSSVRFX0REUl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VQorCisjZGVmaW5lIENQVV8yX1BDSUVfTUVNX1dJTjBfQkFTRSAgICAweDkwMDAwMDAwCisjZGVmaW5lIENQVV8yX1BDSUVfTUVNX1dJTjBfU0laRSAgICAweDAwMTAwMDAwCisjZGVmaW5lIE1BWF9QTUNfU0laRSAgICAgICAgICAgICAgICAweDgwMDAKKworI2lmZGVmIFRYX0VOQUJMRV9FVkVOVF9UUkFDRQorI2RlZmluZSBFVkVOVF9CVUZGRVJfU0laRSAgICAgICAgICAgMHgwMDYwMDAwMCAvKiA2IE1ieXRlICovCisvKiBsZWF2ZSAxIE1ieXRlIGdhcCBiZXR3ZWVuIHdpbmRvd3MgKi8KKyNkZWZpbmUgQ1BVXzJfUENJRV9NRU1fV0lOMV9CQVNFICAgIENQVV8yX1BDSUVfTUVNX1dJTjBfQkFTRSArIENQVV8yX1BDSUVfTUVNX1dJTjBfU0laRSArIDB4MTAwMDAwCisjZGVmaW5lIENQVV8yX1BDSUVfTUVNX1dJTjFfU0laRSAgICBFVkVOVF9CVUZGRVJfU0laRQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2ZsZC9iY21vbHRfZmxkLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL2JjbW9sdF9mbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGU5MmIyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2ZsZC9iY21vbHRfZmxkLmMKQEAgLTAsMCArMSw4NTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vbHRfZmxkLmgiCisjaWZkZWYgVFhfRU5BQkxFX0VWRU5UX1RSQUNFCisjaW5jbHVkZSAiYmNtb2x0X2xscGNpZS5oIgorI2VuZGlmCisKKy8qIGludGVybmFsIGRhdGEgYmFzZSAqLworc3RhdGljIHVpbnQzMl90IG1heF9iY202ODYyMF9kZXZpY2UgPSAwOworc3RhdGljIGJjbV9mbGRfZGV2aWNlX2luZm8gKmJjbTY4NjIwX2luZm8gPSBOVUxMOworCisjZGVmaW5lIFNSQU1fQUREUkVTUyhkZXZpY2Usb2Zmc2V0KSAodWludDMyX3QgKikoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19zcmFtX2Jhc2UgKyBvZmZzZXQpCisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfaW5pdCh1aW50MzJfdCBtYXhfZGV2aWNlcykKK3sKKyAgICBtYXhfYmNtNjg2MjBfZGV2aWNlID0gbWF4X2RldmljZXM7CisgICAgYmNtNjg2MjBfaW5mbyA9IChiY21fZmxkX2RldmljZV9pbmZvICopYmNtb3NfYWxsb2MobWF4X2RldmljZXMgKiBzaXplb2YoYmNtX2ZsZF9kZXZpY2VfaW5mbykpOworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgbWVtc2V0KGJjbTY4NjIwX2luZm8sIDAsIG1heF9kZXZpY2VzICogc2l6ZW9mKGJjbV9mbGRfZGV2aWNlX2luZm8pKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCit2b2lkIGJjbV9mbGRfY2xlYXJfY29tbV9hcmVhKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICBtZW1zZXQoKGNoYXIgKilTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ09NTVVOSUNBVElPTl9BUkVBX0JBU0UpLCAwICxCQ01fRkxEX0NPTU1VTklDQVRJT05fQVJFQV9TSVpFKTsKKyNpZiBkZWZpbmVkKFRYX0VOQUJMRV9FVkVOVF9UUkFDRSkgJiYgZGVmaW5lZChERUJVR19UUkFDRV9JTklUKQorICAgIGJjbV9sbF9wY2llX3NldHJhY2UoZGV2aWNlKTsKKyNlbmRpZgorfQorCitiY21vc19lcnJubyBiY21fZmxkX2V4aXQodm9pZCkKK3sKKyAgICBpZiAoYmNtNjg2MjBfaW5mbykKKyAgICAgICAgYmNtb3NfZnJlZShiY202ODYyMF9pbmZvKTsKKworICAgIGJjbTY4NjIwX2luZm8gPSBOVUxMOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIHJlZ2lzdGVyIGEgZGV2aWNlIHRvIGRyaXZlcgorICAgcmV0dXJucyB0aGUgZHJpdmVyIGluZGV4LCBpbnN0ZWFkIHRoZSB1c2VyJ3MKKyAgIHN0b3JlIHRoZSB1c2VyLHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSAqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9yZWdpc3Rlcih1aW50MzJfdCBkZXZpY2UsIGJjbV9mbGRfZGV2aWNlX2luZm8gKmluZm8pCit7CisgICAgaWYgKCFpbmZvKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgaWYgKCFiY202ODYyMF9pbmZvKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisKKyAgICBpZiAoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19zcmFtX2Jhc2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisKKyAgICAvKiBjb3B5IHRoZSBpbmZvcm1hdGlvbiByZWNlaXZlZCBmcm9tIHRoZSB1c2VyIHRvIHVpbnQzMl90ZXJuYWwgZGF0YSBiYXNlICovCisgICAgYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19zcmFtX2Jhc2UgPSBpbmZvLT5zb2Nfc3JhbV9iYXNlOworICAgIGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2Jhc2UgPSBpbmZvLT5zb2NfZGRyX2Jhc2U7CisgICAgYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgPSBpbmZvLT5zb2NfcmVnc19iYXNlOworICAgIGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2xlbmd0aCA9IGluZm8tPnNvY19kZHJfbGVuZ3RoOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIHJlbW92ZSBhIGRldmljZSBmcm9tIHVpbnQzMl90ZXJuYWwgZGF0YSBiYXNlICovCitiY21vc19lcnJubyBiY21fZmxkX3VucmVnaXN0ZXIodWludDMyX3QgZGV2aWNlKQoreworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgLyogY2xlYXIgdGhlIHVpbnQzMl90ZXJuYWwgZGF0YSBiYXNlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlICovCisgICAgYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19zcmFtX2Jhc2UgPSAwOworICAgIGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2Jhc2UgPSAwOworICAgIGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2xlbmd0aCA9IDA7CisgICAgYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19jcnRfbGVuZ3RoID0gMDsKKyAgICBiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSA9IDA7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogcmVhZCBmcm9tIGNvbW11bmljYXRpb24gYXJlYSBhbmQgcmV0dXJuIHRoZSBzb2Mgc3RhdGUKKyAgIHJlc2V0IHJlYXNvbiBhbmQgcHJvdG9jb2wgdmVyc2lvbiAqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfZGV2aWNlX3N0YXR1cyh1aW50MzJfdCBkZXZpY2UsIGJjbV9mbGRfZGV2aWNlX3N0YXQgKmRlYnVnX3N0YXRlKQoreworICAgIGlmICghZGVidWdfc3RhdGUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIC8qIHJlYWQgZnJvbSBTUkFNIG9zIGVudHJ5IG9mZnNldCwgQ1BVIHN0YXR1cywgcmVhc29uIGFuZCBwcm90b2NvbCB2ZXJzaW9uICovCisgICAgZGVidWdfc3RhdGUtPnByb3RvY29sX3ZlcnNpb24gICA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9CT09UX1BST1RPQ09MX1ZFUlNJT05fT0ZGU0VUKSk7CisgICAgZGVidWdfc3RhdGUtPnN0YXRlICAgICAgICAgICAgICA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfU1RBVEVfT0ZGU0VUKSk7CisgICAgZGVidWdfc3RhdGUtPnJlYXNvbiAgICAgICAgICAgICA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfUkVTRVRfUkVBU09OX09GRlNFVCkpOworICAgIGRlYnVnX3N0YXRlLT5vc19lbnRyeV9vZmZzZXQgICAgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfT1NfRU5UUllfT0ZGU0VUKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogcmV0dXJucyB0aGUgbGFzdCBzb2Mgc3RhdGUgKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2RldmljZV9sb2FkaW5nX3N0YXRlKHVpbnQzMl90IGRldmljZSwgQkNNX0ZMRF9DUFVfU1RBVEUgKmNwdV9zdGF0ZSkKK3sKKyAgICB1aW50MzJfdCB0ZW1wOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHZhbHVlOworCisgICAgaWYgKCFjcHVfc3RhdGUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIHZhbHVlID0gYmNtX3BjaV9yZWFkMzIoU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0NQVV9TVEFURV9PRkZTRVQpKTsKKyAgICB0ZW1wID0gdmFsdWUgJiBCQ01fRkxEX0NQVV9SRUFEWV9NQVNLOworICAgIGlmICh0ZW1wKQorICAgICAgICAqY3B1X3N0YXRlID0gQkNNX0ZMRF9DUFVfUkVBRFk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdGVtcCA9IHZhbHVlICYgQkNNX0ZMRF9DUFVfRklOSVNIX0JPT1RMT0FERVJfTUFTSzsKKyAgICAgICAgaWYgKHRlbXApCisgICAgICAgICAgICAqY3B1X3N0YXRlID0gQkNNX0ZMRF9DUFVfRklOSVNIX0JPT1RMT0FERVI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpjcHVfc3RhdGUgPSBCQ01fRkxEX0NQVV9TVEFURV9VTktOT1dOOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiB3cml0ZSBpbiBjb21tdW5pY2F0aW9uIGFyZWEgdGhlIGN1cnJlbnQgaG9zdCBzdGF0dXMgZHVyaW5nIGxvYWRpbmcgcHJvY2VzcyAqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9ob3N0X2ZpbmlzaF93cml0ZV9kZHIodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBvc19lbnRyeV9hZGRyZXNzKQoreworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgLyogd3JpdGUgb3NfZW50cnkgYWRkcmVzcyBvZiB0aGUgY29kZSBmcm9tIEREUiAqLworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfT1NfRU5UUllfT0ZGU0VUKSwgb3NfZW50cnlfYWRkcmVzcyk7CisgICAgLyogcnVuIGNvZGUgZnJvbSBERFIgKi8KKyAgICBiY21fcGNpX3dyaXRlMzIoU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0hPU1RfU1RBVEVfT0ZGU0VUKSwgQkNNX0ZMRF9IT1NUX0ZJTklTSF9XUklURV9ERFJfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogcmV0dXJuIHRoZSBsb2dzIGFyZWEgKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2xvZ3ModWludDMyX3QgZGV2aWNlLCBjaGFyICoqbG9nX2FyZWEsIGludCAqbGVuZ3RoKQoreworICAgIGlmICghbG9nX2FyZWEgfHwgIWxlbmd0aCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgKmxvZ19hcmVhID0gKGNoYXIgKilTUkFNX0FERFJFU1MoZGV2aWNlLCBCQ01fRkxEX0xPR0dFUl9CQVNFKTsKKyAgICAqbGVuZ3RoID0gQkNNX0ZMRF9MT0dHRVJfVE9QOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIHdyaXRlIHRoZSByZWNlaXZlZCBidWZmZXIgdG8gbWVtb3J5IGFjY29yZGluZyB0byBvZmZzZXQgYW5kIHR5cGUgKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfd3JpdGUodWludDMyX3QgZGV2aWNlLCBjaGFyICpidWZmLCB1aW50MzJfdCBidWZmX3NpemUsIHVpbnQzMl90IG9mZnNldF9pbl9pbWFnZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpCit7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gMDsKKyAgICBpbnQgaTsKKyNpZm5kZWYgUENJRV9CWVRFX0NPUFkKKyAgICB1aW50MzJfdCBzaXplLCByZXN0OworICAgIHVpbnQzMl90KiBidWZmXzMyOworICAgIHVpbnQzMl90KiBhZGRyXzMyOworI2VuZGlmCisKKyAgICBpZiAoIWJ1ZmYpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIGlmIChpbWFnZV90eXBlID09IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9CT09UTE9BREVSKQorICAgIHsKKyAgICAgICAgYWRkcmVzcyA9IGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2Nfc3JhbV9iYXNlICsgb2Zmc2V0X2luX2ltYWdlOworICAgICAgICBpZiAoKG9mZnNldF9pbl9pbWFnZSArIGJ1ZmZfc2l6ZSkgPiBCQ01fRkxEX0NPTU1VTklDQVRJT05fQVJFQV9CQVNFKQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorICAgIGVsc2UgaWYgKGltYWdlX3R5cGUgPT0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0FQUExJQ0FUSU9OKQorICAgIHsKKyAgICAgICAgYWRkcmVzcyA9IGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2Jhc2UgKyBvZmZzZXRfaW5faW1hZ2U7CisgICAgICAgIGlmICgob2Zmc2V0X2luX2ltYWdlICsgYnVmZl9zaXplKSA+IGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgICAgICBiY202ODYyMF9pbmZvW2RldmljZV0uc29jX2NydF9sZW5ndGggKz0gYnVmZl9zaXplOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworI2lmbmRlZiBQQ0lFX0JZVEVfQ09QWQorICAgIHNpemUgPSBidWZmX3NpemUgLyBzaXplb2YoKmJ1ZmZfMzIpOworICAgIHJlc3QgPSBidWZmX3NpemUgJiAoc2l6ZW9mKCpidWZmXzMyKSAtMSk7CisKKyAgICBidWZmXzMyID0gKHVpbnQzMl90KilidWZmOworICAgIGFkZHJfMzIgPSAodWludDMyX3QqKWFkZHJlc3M7CisKKyAgICBpZiAocmVzdCkKKyAgICAgICAgc2l6ZSsrOworICAgIGZvcihpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKChhZGRyXzMyICsgaSksQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTMyKCooYnVmZl8zMiAraSkpKTsKKyNlbHNlCisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZfc2l6ZTsgaSsrKQorICAgICAgICAqKHVpbnQ4X3QgKikoYWRkcmVzcyArIGkpID0gYnVmZltpXTsKKyNlbmRpZgorCisgICAgYmNtb3NfYmFycmllcigpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIHJlYWQgdG8gdGhlIHJlY2VpdmVkIGJ1ZmZlciBmcm9tIG1lbW9yeSBhY2NvcmRpbmcgdG8gb2Zmc2V0IGFuZCB0eXBlICovCitiY21vc19lcnJubyBiY21fZmxkX3JlYWQodWludDMyX3QgZGV2aWNlLCBjaGFyICpidWZmLCB1aW50MzJfdCAqYnVmZl9zaXplLCB1aW50MzJfdCBvZmZzZXRfaW5faW1hZ2UsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlKQoreworICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IDA7CisgICAgdWludDMyX3QgaTsKKyNpZm5kZWYgUENJRV9CWVRFX0NPUFkKKyAgICB1aW50MzJfdCBzaXplLCByZXN0OworICAgIHVpbnQzMl90KiBidWZmXzMyOworICAgIHVpbnQzMl90KiBhZGRyXzMyOworI2VuZGlmCisKKyAgICBpZiAoIWJ1ZmYgfHwgIWJ1ZmZfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgaWYoaW1hZ2VfdHlwZSA9PSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQk9PVExPQURFUikKKyAgICAgICAgYWRkcmVzcyA9IGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2Nfc3JhbV9iYXNlICsgb2Zmc2V0X2luX2ltYWdlOworICAgIGVsc2UgaWYgKGltYWdlX3R5cGUgPT0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0FQUExJQ0FUSU9OKQorICAgICAgICBhZGRyZXNzID0gYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19kZHJfYmFzZSArIG9mZnNldF9pbl9pbWFnZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICAvKiB0ZW1wb3JhcnkgZm9yIHRlc3QgLCBjb25zaWRlciB0byBpbnRlZ3JhdGUgaW4gZnV0dXJlICovCisjaWZuZGVmIFBDSUVfQllURV9DT1BZCisgICAgc2l6ZSA9ICpidWZmX3NpemUgL3NpemVvZigqYnVmZl8zMik7CisgICAgcmVzdCA9ICpidWZmX3NpemUgJiAoc2l6ZW9mKCpidWZmXzMyKSAtMSk7CisgICAgYnVmZl8zMiA9ICh1aW50MzJfdCopYnVmZjsKKyAgICBhZGRyXzMyID0gKHVpbnQzMl90KilhZGRyZXNzOworCisgICAgaWYgKHJlc3QpCisgICAgICAgIHNpemUrKzsKKyAgICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICooYnVmZl8zMiAraSk9IEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UzMihiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoYWRkcl8zMiArIGkpKSk7CisjZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCAqYnVmZl9zaXplOyBpKyspCisgICAgICAgIGJ1ZmZbaV0gPSAqKHVpbnQ4X3QgKikoYWRkcmVzcyArIGkpOworCisjZW5kaWYKKworICAgIGJjbW9zX2JhcnJpZXIoKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qKioqKioqKioqKiBQTUMgZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUE1DX1FVRVVFXzBfREFUQV9VTlJFU0VUMCAgIDB4NDAxYzAwVQorI2RlZmluZSBQTUNfUVVFVUVfMF9EQVRBX1VOUkVTRVQxICAgMHg0MDFjMDRVCisjZGVmaW5lIFBNQ19RVUVVRV8wX0RBVEFfVU5SRVNFVDIgICAweDQwMWMwOFUKKyNkZWZpbmUgUE1DX1FVRVVFXzBfREFUQV9VTlJFU0VUMyAgIDB4NDAxYzBjVQorCisjZGVmaW5lIFBNQ19RVUVVRV8xX0RBVEFfVU5SRVNFVDAgICAweDQwMWMxMFUKKyNkZWZpbmUgUE1DX1FVRVVFXzFfREFUQV9VTlJFU0VUMSAgIDB4NDAxYzE0VQorI2RlZmluZSBQTUNfUVVFVUVfMV9EQVRBX1VOUkVTRVQyICAgMHg0MDFjMThVCisjZGVmaW5lIFBNQ19RVUVVRV8xX0RBVEFfVU5SRVNFVDMgICAweDQwMWMxY1UKKworI2RlZmluZSBQTUNfQ05UUkxfSE9TVF9NQk9YX0lOICAgICAgMHg0MDEwMjhVCisjZGVmaW5lIFBNQ19IT1NUX01CT1hfTUFTSyAgICAgICAgICAweDIKKyNkZWZpbmUgUE1DX1BNQl9DTlRSTCAgICAgICAgICAgICAgIDB4NDgwMGMwVQorLyogVGhlIGJlbG93IHZhbHVlIGlzIHRoZSBzd2FwIG9mICgoMSA8PCAzMSkgfCAoMTw8MjApIHwgKDQgPDwgMTIpIHwgKDB4MEMpKSAqLworI2RlZmluZSBQTUNfUE1CX0NNRCAgICAgICAgICAgICAgICAgMHgwQzQwMTA4MAorI2RlZmluZSBQTUNfUE1CX1dSSVRFICAgICAgICAgICAgICAgMHg0ODAwYzRVCisvKiBUaGUgYmVsb3cgdmFsdWUgaXMgdGhlIHN3YXAgb2YgMHgxKi8KKyNkZWZpbmUgUE1DX1BNQl9BRERSRVNTICAgICAgICAgICAgIDB4MTAwMDAwMAorCisvKiBQTUMgY29tbWFuZCB0byB0YWtlIEFSTSBvdXQgb2YgcmVzZXQgKi8KKyNkZWZpbmUgQVJNX09VVF9PRl9SRVNFVCAgICAgICAgICAgIDM1CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfc3RhcnRfYm9vdGxvYWRlcih1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IHRlc3RfZGRyKQoreworLyogdGVtcG9yYXJ5IGRpc2FibGVkOiBqdXN0IGZvciBBMCwgc2hvdWxkIGJlIGVuYWJsZWQgaW4gQjAKKyNpZmRlZiBCQ01fUE1DX0VYSVNUCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVhZHZhbDsKKyNlbmRpZgorKi8KKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLCBCQ01fRkxEX0hPU1RfU1RBVEVfT0ZGU0VUKSwgdGVzdF9kZHIpOworICAgIC8qIHN0YXJ0IHByb2Nlc3NvciAqLworICAgIGJjbV9mbGRfc2V0X2hvc3RfZGVidWdfc3RhdHVzKGRldmljZSwgQkNNX0ZMRF9IT1NUX1NUQVJUX0NQVSk7CisvKiBUZW1wb3JhcnkgZGlzYWJsZWQgLSBzaG91bGQgYmUgZW5hYmxlZCBpbiBCMAorI2lmbmRlZiBCQ01fUE1DX0VYSVNUICovCisgICAgYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopKGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfcmVnc19iYXNlICsgUE1DX1BNQl9DTlRSTCkpOworICAgIGJjbV9wY2lfd3JpdGUzMigodWludDMyX3QgKikoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQTUNfUE1CX1dSSVRFKSwgUE1DX1BNQl9BRERSRVNTKTsKKyAgICBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQTUNfUE1CX1dSSVRFKSk7CisgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKShiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSArIFBNQ19QTUJfQ05UUkwpLCBQTUNfUE1CX0NNRCk7CisgICAgYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopKGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfcmVnc19iYXNlICsgUE1DX1BNQl9DTlRSTCkpOworLyoKKyNlbHNlCisgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSArIFBNQ19DTlRSTF9IT1NUX01CT1hfSU4pKTsKKyAgICBpZiAoIShyZWFkdmFsICYgUE1DX0hPU1RfTUJPWF9NQVNLKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX0NPTk5FQ1RFRDsKKworICAgIGJjbV9wY2lfd3JpdGUzMigoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQTUNfUVVFVUVfMF9EQVRBX1VOUkVTRVQwKSwgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTMyKEFSTV9PVVRfT0ZfUkVTRVQpKTsKKyAgICBiY21fcGNpX3dyaXRlMzIoKGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfcmVnc19iYXNlICsgUE1DX1FVRVVFXzBfREFUQV9VTlJFU0VUMSksIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UzMigwKSk7CisgICAgYmNtX3BjaV93cml0ZTMyKChiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSArIFBNQ19RVUVVRV8wX0RBVEFfVU5SRVNFVDIpLCBCQ01PU19FTkRJQU5fQ1BVX1RPX0xJVFRMRV9VMzIoMCkpOworICAgIGJjbV9wY2lfd3JpdGUzMigoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQTUNfUVVFVUVfMF9EQVRBX1VOUkVTRVQzKSwgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTMyKDApKTsKKyAgICBiY21vc191c2xlZXAoMTAwMDApOyAvLyAxMCBtc2VjCisgICAgLy8gcmVhZCBQTUMgcmVzcG9uc2UsIHRvIGNsZWFuIHRoZSBxdWV1ZQorICAgIGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSArIFBNQ19RVUVVRV8xX0RBVEFfVU5SRVNFVDApKTsKKyAgICBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQTUNfUVVFVUVfMV9EQVRBX1VOUkVTRVQxKSk7CisgICAgYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopKGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfcmVnc19iYXNlICsgUE1DX1FVRVVFXzFfREFUQV9VTlJFU0VUMikpOworICAgIGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSArIFBNQ19RVUVVRV8xX0RBVEFfVU5SRVNFVDMpKTsKKyNlbmRpZgorKi8KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19ib29sIGJjbV9mbGRfaXNfYm9vdGxvYWRlcl9kb25lKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisKKyAgICB2YWx1ZSA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfU1RBVEVfT0ZGU0VUKSk7CisgICAgaWYgKHZhbHVlICYgQkNNX0ZMRF9DUFVfRklOSVNIX0JPT1RMT0FERVJfTUFTSykKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK2JjbW9zX2Jvb2wgYmNtX2ZsZF9pc19kZHJfdGVzdF9kb25lKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICB1aW50MzJfdCB2YWx1ZSA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIEJDTV9GTERfQ1BVX1NUQVRFX09GRlNFVCkpOworICAgIHJldHVybiAwICE9ICh2YWx1ZSAmIEJDTV9GTERfRERSX1RFU1RfRE9ORV9NQVNLKTsKK30KKworYmNtb3NfYm9vbCBiY21fZmxkX3Rlc3RfZGV2aWNlX2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdmFsdWU7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX0JPT1RSRUNfU1RBVEVfT0ZGU0VUKSk7CisgICAgaWYgKHZhbHVlICYgQkNNX0ZMRF9DUFVfUFJNX1ZBTElEX01BU0spCisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworCisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitiY21vc19lcnJubyBiY21fZmxkX2dldF9kZXZpY2VfYm9vdHJlY29yZCh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90ICpvcGFxdWVfZGF0YSkKK3sKKyAgICB1aW50MzJfdCAqYWRkciwgKnRlbXA7CisgICAgaW50MzJfdCBpOworCisgICAgaWYgKCFvcGFxdWVfZGF0YSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgdGVtcCA9IG9wYXF1ZV9kYXRhOworICAgIGFkZHIgPSBTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX0JPT1RSRUNPUkRfT0ZGU0VUKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUENJRV9PUEFRVUVfREFUQV9TSVpFIC8gNDsgaSsrKQorICAgIHsKKyAgICAgICAgKnRlbXArKyA9IGJjbV9wY2lfcmVhZDMyKGFkZHIrKyk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfY2xlYXJfZGV2aWNlX2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdmFsdWU7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIC8qIGNsZWFyIFNvQyBwcm0gdmFsaWQgYml0ICovCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX0JPT1RSRUNfU1RBVEVfT0ZGU0VUKSk7CisgICAgdmFsdWUgJj0gfkJDTV9GTERfQ1BVX1BSTV9WQUxJRF9NQVNLOworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX0JPT1RSRUNfU1RBVEVfT0ZGU0VUKSwgdmFsdWUpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfc2V0X2hvc3RfYm9vdHJlY29yZF9mbGFnKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgLyogc2V0IGhvc3QgcHJtIHZhbGlkIGJpdCAqLworICAgIHZhbHVlID0gYmNtX3BjaV9yZWFkMzIoU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0hPU1RfQk9PVFJFQ19TVEFURV9PRkZTRVQpKTsKKyAgICB2YWx1ZSB8PSAoKDEgPDwgQkNNX0ZMRF9IT1NUX1BSTV9WQUxJRF9TSElGVCkgJiBCQ01fRkxEX0hPU1RfUFJNX1ZBTElEX01BU0spOworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfSE9TVF9CT09UUkVDX1NUQVRFX09GRlNFVCksIHZhbHVlKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19ib29sIGJjbV9mbGRfdGVzdF9ob3N0X2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdmFsdWU7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfSE9TVF9CT09UUkVDX1NUQVRFX09GRlNFVCkpOworICAgIGlmICh2YWx1ZSAmIEJDTV9GTERfSE9TVF9QUk1fVkFMSURfTUFTSykKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfc2V0X3JpbmdzX3NpemUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBob3N0X3R4X3NpemUsIHVpbnQzMl90IGhvc3Rfcnhfc2l6ZSkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgLyogd3JpdGUgaG9zdF9wZF9yaW5nX3NpemUgdG8gY29tbXVuaWNhdGlvbiBhcmVhIC0gU29DIHdpbGwgdXNlIGl0IGluIGZpcnN0IHN0YWdlcyBvZiBhcHBsaWNhdGlvbiAqLworICAgIC8qIGRldmljZSB0eCByaW5nIHNpemUgaXMgdGhlIHNhbWUgYXMgaG9zdCByeCBxdWV1ZSAqLworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfSE9TVF9SWF9RVUVVRV9TSVpFX09GRlNFVCksIGhvc3Rfcnhfc2l6ZSk7CisgICAgLyogZGV2aWNlIHJ4IHJpbmcgc2l6ZSBpcyB0aGUgc2FtZSBhcyBob3N0IHR4IHF1ZXVlICovCisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfUlhfUVVFVUVfU0laRV9PRkZTRVQpLCBob3N0X3R4X3NpemUpOworICAgIC8qIHNldCBob3N0IHF1ZXVlIHZhbGlkIGJpdCAqLworICAgIHZhbHVlID0gYmNtX3BjaV9yZWFkMzIoU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0NQVV9TRVRfUVVFVUVTX1NJWkUpKTsKKyAgICB2YWx1ZSB8PSAoKDEgPDwgQkNNX0ZMRF9DUFVfUVVFVUVfVkFMSURfU0hJRlQpICYgQkNNX0ZMRF9DUFVfUVVFVUVfVkFMSURfTUFTSyk7CisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfU0VUX1FVRVVFU19TSVpFKSwgdmFsdWUpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2V4Y2VwdGlvbl9zdGF0ZSh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90ICpzdGF0ZTAsIHVpbnQzMl90ICpzdGF0ZTEpCit7CisgICAgaWYgKCFiY202ODYyMF9pbmZvKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisKKyAgICBpZiAoIXN0YXRlMCB8fCAhc3RhdGUxKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgKnN0YXRlMCA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIEJDTV9GTERfQ1BVMF9QT1NUTU9SVEVNX1NUQVRFKSk7CisgICAgKnN0YXRlMSA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIEJDTV9GTERfQ1BVMV9QT1NUTU9SVEVNX1NUQVRFKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2ZsZF9jbGVhcl9leGNlcHRpb25fc3RhdGUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBjcHVpZCkKK3sKKworICAgIHVpbnQzMl90IG9mZnNldCA9ICBjcHVpZCA/IEJDTV9GTERfQ1BVMV9QT1NUTU9SVEVNX1NUQVRFIDogQkNNX0ZMRF9DUFUwX1BPU1RNT1JURU1fU1RBVEU7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkgfHwgKGNwdWlkID4gMSkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIG9mZnNldCksIDApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfY29weV9leGNlcHRpb25fbG9nKHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgY3B1aWQsIGNoYXIgKmJ1ZmZlciwgaW50ICpsZW5ndGgpCit7CisgICAgQkNNX0ZMRF9QT1NUTU9SVEVNX0xPRyAqZXhsb2c7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gIGNwdWlkID8gQkNNX0ZMRF9DUFUxX1BPU1RNT1JURU1fQlVGX09GRlNFVCA6IEJDTV9GTERfQ1BVMF9QT1NUTU9SVEVNX0JVRl9PRkZTRVQ7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkgfHwgKGNwdWlkID4gMSkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgaWYgKCFidWZmZXIgfHwgIWxlbmd0aCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGV4bG9nID0gKEJDTV9GTERfUE9TVE1PUlRFTV9MT0cgKilTUkFNX0FERFJFU1MoZGV2aWNlLCBvZmZzZXQpOworICAgIGlmIChleGxvZy0+bWFnaWMgIT0gQkNNX0ZMRF9QT1NUTU9SVEVNX0xPR19NQUdJQykKKyAgICAgICAgKmxlbmd0aCA9IDA7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgICpsZW5ndGggPSBleGxvZy0+bXNnX2xlbjsKKyAgICAgICAgLyogaWYgaG9zdCBpcyA2NCBiaXQgYW5kIGJpZ2VuZGlhbiBtZW1jcHkgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgKi8KKyAgICAgICAgZm9yIChpPTA7IGkgPCBleGxvZy0+bXNnX2xlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBidWZmZXJbaV0gPSBleGxvZy0+bXNnW2ldOworICAgICAgICB9CisgICAgfQorICAgIGJ1ZmZlclsqbGVuZ3RoXSA9ICdcMCc7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqCisqIFxEZWJ1ZyBzdGF0ZXMgYW5kIGZ1bmN0aW9ucworKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2RldmljZV9kZWJ1Z19zdGF0dXModWludDMyX3QgZGV2aWNlLCBiY21fZmxkX2RldmljZV9kZWJ1Z19zdGF0ZSAqaW5mbykKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIGlmICghaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX0RFQlVHX1NUQVRFX09GRlNFVCkpOworICAgIGluZm8tPmJvb3RfZnJvbV9zcmFtX3N0YXRlcyA9ICh2YWx1ZSAmIEJDTV9GTERfQ1BVX0JPT1RfRlJPTV9TUkFNX1NUQVRFU19NQVNLKSA+PiBCQ01fRkxEX0NQVV9CT09UX0ZST01fU1JBTV9TVEFURVNfU0hJRlQ7CisgICAgaW5mby0+Ym9vdF9mcm9tX3NyYW1fZXJyb3JzID0gKHZhbHVlICYgQkNNX0ZMRF9DUFVfQk9PVF9GUk9NX1NSQU1fRVJST1JTX01BU0spID4+IEJDTV9GTERfQ1BVX0JPT1RfRlJPTV9TUkFNX0VSUk9SU19TSElGVDsKKyAgICBpbmZvLT5ib290X2Zyb21fc3JhbV9leGNlcHRpb24gPSAodmFsdWUgJiBCQ01fRkxEX0NQVV9CT09UX0ZST01fU1JBTV9FWENFUFRJT05fTUFTSykgPj4gQkNNX0ZMRF9DUFVfQk9PVF9GUk9NX1NSQU1fRVhDRVBUSU9OX1NISUZUOworICAgIGluZm8tPnJ1bl9mcm9tX2Rkcl9zdGF0ZSA9ICh2YWx1ZSAmIEJDTV9GTERfQ1BVX1JVTl9GUk9NX0REUl9TVEFURVNfTUFTSykgPj4gQkNNX0ZMRF9DUFVfUlVOX0ZST01fRERSX1NUQVRFU19TSElGVDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fZmxkX2dldF9ob3N0X2RlYnVnX3N0YXR1cyh1aW50MzJfdCBkZXZpY2UsIGJjbV9mbGRfaG9zdF9kZWJ1Z19zdGF0ZSAqaW5mbykKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIGlmICghaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfSE9TVF9ERUJVR19TVEFURV9PRkZTRVQpKTsKKyAgICBpbmZvLT53cml0ZV9zcmFtID0gKHZhbHVlICYgQkNNX0ZMRF9IT1NUX1dSSVRFX1NSQU1fTUFTSykgPj4gQkNNX0ZMRF9IT1NUX1dSSVRFX1NSQU1fU0hJRlQ7CisgICAgaW5mby0+c3RhcnRfZGV2aWNlID0gKHZhbHVlICYgQkNNX0ZMRF9IT1NUX1NUQVJUX0NQVV9NQVNLKSA+PiBCQ01fRkxEX0hPU1RfU1RBUlRfQ1BVX1NISUZUOworICAgIGluZm8tPndyaXRlX2RkciA9ICh2YWx1ZSAmIEJDTV9GTERfSE9TVF9XUklURV9ERFJfTUFTSykgPj4gQkNNX0ZMRF9IT1NUX1dSSVRFX0REUl9TSElGVDsKKyAgICB2YWx1ZSA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9IT1NUX1NUQVRFX09GRlNFVCkpOworICAgIGluZm8tPmZpbmlzaF9kZHIgPSAodmFsdWUgJiBCQ01fRkxEX0hPU1RfRklOSVNIX1dSSVRFX0REUl9NQVNLKSA+PiBCQ01fRkxEX0hPU1RfRklOSVNIX1dSSVRFX0REUl9TSElGVDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fZmxkX3NldF9ob3N0X2RlYnVnX3N0YXR1cyh1aW50MzJfdCBkZXZpY2UsIEJDTV9GTERfSE9TVF9ERUJVR19WQUxVRVMgc3RhdCkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZSA9IDA7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIGlmIChzdGF0ID09IEJDTV9GTERfSE9TVF9XUklURV9TUkFNKQorICAgICAgICB2YWx1ZSA9ICgoMSA8PCBCQ01fRkxEX0hPU1RfV1JJVEVfU1JBTV9TSElGVCkgJiBCQ01fRkxEX0hPU1RfV1JJVEVfU1JBTV9NQVNLKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICB2YWx1ZSA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9IT1NUX0RFQlVHX1NUQVRFX09GRlNFVCkpOworICAgICAgICBpZiAoc3RhdCA9PSBCQ01fRkxEX0hPU1RfU1RBUlRfQ1BVKQorICAgICAgICAgICAgdmFsdWUgfD0gKCgxIDw8IEJDTV9GTERfSE9TVF9TVEFSVF9DUFVfU0hJRlQpICYgQkNNX0ZMRF9IT1NUX1NUQVJUX0NQVV9NQVNLKTsKKyAgICAgICAgZWxzZSBpZiAoc3RhdCA9PSBCQ01fRkxEX0hPU1RfV1JJVEVfRERSKQorICAgICAgICAgICAgdmFsdWUgfD0gKCgxIDw8IEJDTV9GTERfSE9TVF9XUklURV9ERFJfU0hJRlQpICYgQkNNX0ZMRF9IT1NUX1dSSVRFX0REUl9NQVNLKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9IT1NUX0RFQlVHX1NUQVRFX09GRlNFVCksIHZhbHVlKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fZmxkX3NldF9yYXNfbW9kZV9zZXQodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCByYXMsIHVpbnQzMl90IG1vZGUpCit7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gIHJhcyA/IEJDTV9GTERfUkFTXzFfU0VUVElOR1MgOkJDTV9GTERfUkFTXzBfU0VUVElOR1M7CisKKyAgICBiY21fcGNpX3dyaXRlMzIoU1JBTV9BRERSRVNTKGRldmljZSwgb2Zmc2V0KSwgbW9kZSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfaG9zdF9ldmVudCh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IGV2ZW50KQoreworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIEJDTV9GTERfSE9TVF9FVkVOVCksIGV2ZW50KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19ib29sIGJjbV9mbGRfdGVzdF9xdWV1ZXNfZmxhZyh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdmFsdWU7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX1NFVF9RVUVVRVNfU0laRSkpOworICAgIGlmICh2YWx1ZSAmIEJDTV9GTERfQ1BVX1FVRVVFX1ZBTElEX01BU0spCisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworCisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitiY21vc19ib29sIGJjbV9mbGRfcmVnc19zd2FwX25lZWRlZCh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdWludDMyX3QgdmFsdWU7CisKKyAgICB2YWx1ZSA9ICoodm9sYXRpbGUgdWludDMyX3QgKikoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1JFVklTSU9OX1JFR0lTVEVSX09GRlNFVCk7CisgICAgaWYgKCh2YWx1ZSAmIDB4ZmZmZikgIT0gMHgwMzAyKQorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworYmNtb3NfYm9vbCBiY21fZmxkX3NyYW1fc3dhcF9uZWVkZWQodWludDMyX3QgZGV2aWNlKQoreworICAgIHVpbnQzMl90IHZhbHVlOworICAgIHVpbnQ4X3QgY2hhcnZhbHVlOworCisgICAgdmFsdWUgPSAweGFhYmJjY2RkOworICAgICoodm9sYXRpbGUgdWludDMyX3QgKiliY202ODYyMF9pbmZvW2RldmljZV0uc29jX3NyYW1fYmFzZSA9IHZhbHVlOworICAgIGNoYXJ2YWx1ZSA9ICoodm9sYXRpbGUgdWludDhfdCAqKWJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2Nfc3JhbV9iYXNlOworICAgIGlmIChjaGFydmFsdWUgIT0gKih1aW50OF90ICopJnZhbHVlKQorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworYmNtb3NfYm9vbCBiY21fZmxkX2Rkcl9zd2FwX25lZWRlZCh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdWludDMyX3QgdmFsdWU7CisgICAgdm9sYXRpbGUgdWludDMyX3QgKmFkZHJlc3M7CisgICAgdWludDhfdCBjaGFydmFsdWU7CisKKyAgICB2YWx1ZSA9IDB4YWFiYmNjZGQ7CisgICAgYWRkcmVzcyA9ICh1aW50MzJfdCAqKShiY202ODYyMF9pbmZvW2RldmljZV0uc29jX2Rkcl9iYXNlICsgYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19jcnRfbGVuZ3RoKTsKKyAgICAqYWRkcmVzcyA9IHZhbHVlOworICAgIGNoYXJ2YWx1ZSA9ICphZGRyZXNzOworICAgIGlmIChjaGFydmFsdWUgIT0gKiZ2YWx1ZSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKK2JjbW9zX2Vycm5vIGJjbV9mbGRfc2V0X2V2ZW50X3RyYWNlKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfRVZFTlRfVFJBQ0VfT0ZGU0VUKSwgMHgxKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorYmNtb3NfZXJybm8gYmNtX2ZsZF9jbGVhcl9ldmVudF90cmFjZSh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgaWYgKCFiY202ODYyMF9pbmZvKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisKKyAgICBiY21fcGNpX3dyaXRlMzIoU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0VWRU5UX1RSQUNFX09GRlNFVCksIDB4MCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZgorI2lmZGVmIERNQV9TVFVCCitiY21vc19lcnJubyBiY21fZmxkX3NldF9kZXZpY2VfYm9vdHJlY29yZF9mbGFnKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIHZhbHVlID0gQkNNX0ZMRF9DUFVfUFJNX1ZBTElEX01BU0s7CisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfQk9PVFJFQ19TVEFURV9PRkZTRVQpLCB2YWx1ZSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfZGV2aWNlX2Jvb3RyZWNvcmQodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqb3BhcXVlX2RhdGEpCit7CisgICAgdWludDMyX3QgKmFkZHIsICp0ZW1wOworICAgIGludDMyX3QgaTsKKworICAgIHRlbXAgPSBvcGFxdWVfZGF0YTsKKyAgICBhZGRyID0gU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0NQVV9CT09UUkVDT1JEX09GRlNFVCk7CisgICAgZm9yIChpID0gMDsgaSA8IFBDSUVfT1BBUVVFX0RBVEFfU0laRSAvIDQ7IGkrKykKKyAgICB7CisgICAgICAgIGJjbV9wY2lfd3JpdGUzMihhZGRyKyssKnRlbXArKyk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfYXZzX2NvbnQodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBiY21fcGNpX3dyaXRlMzIoU1JBTV9BRERSRVNTKGRldmljZSwgQkNNX0ZMRF9BVlNfU0VUVElOR1MpLCB2YWx1ZSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwordm9pZCAqYmNtX2ZsZF9nZXRfc3dfZXJyb3JfdGFibGUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqc2l6ZSkKK3sKKyAgICAqc2l6ZSA9IEJDTV9GTERfU1dfRVJST1JfVEFCTEVfU0laRTsKKyAgICByZXR1cm4gU1JBTV9BRERSRVNTKGRldmljZSwgQkNNX0ZMRF9TV19FUlJPUl9UQUJMRSk7Cit9CisKK3VpbnQzMl90IGJjbV9mbGRfZGRyX3Rlc3RfcmVzdWx0X2dldCh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IHdvcmQpCit7CisgICAgcmV0dXJuIGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIEJDTV9GTERfRERSX1RFU1RfUkVTVUxUUyArICh3b3JkICogQ09NTV9XT1JEX1NJWkUpKSk7Cit9CisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfY2xlYXJfY29tbV9hcmVhKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9leGl0KTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfZ2V0X2RldmljZV9zdGF0dXMpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2dldF9kZXZpY2VfbG9hZGluZ19zdGF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfaG9zdF9maW5pc2hfd3JpdGVfZGRyKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9nZXRfbG9ncyk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfd3JpdGUpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX3JlYWQpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX3N0YXJ0X2Jvb3Rsb2FkZXIpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2lzX2Jvb3Rsb2FkZXJfZG9uZSk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfc2V0X3JpbmdzX3NpemUpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2dldF9kZXZpY2VfYm9vdHJlY29yZCk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfdGVzdF9kZXZpY2VfYm9vdHJlY29yZF9mbGFnKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9jbGVhcl9kZXZpY2VfYm9vdHJlY29yZF9mbGFnKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9zZXRfaG9zdF9ib290cmVjb3JkX2ZsYWcpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX3Rlc3RfaG9zdF9ib290cmVjb3JkX2ZsYWcpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX3Rlc3RfcXVldWVzX2ZsYWcpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2dldF9kZXZpY2VfZGVidWdfc3RhdHVzKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9nZXRfaG9zdF9kZWJ1Z19zdGF0dXMpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX3NldF9ob3N0X2RlYnVnX3N0YXR1cyk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfc2V0X3Jhc19tb2RlX3NldCk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfc2V0X2hvc3RfZXZlbnQpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2dldF9leGNlcHRpb25fc3RhdGUpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2NsZWFyX2V4Y2VwdGlvbl9zdGF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfY29weV9leGNlcHRpb25fbG9nKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9yZWdzX3N3YXBfbmVlZGVkKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9zcmFtX3N3YXBfbmVlZGVkKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9kZHJfc3dhcF9uZWVkZWQpOworI2lmZGVmIFRYX0VOQUJMRV9FVkVOVF9UUkFDRQorRVhQT1JUX1NZTUJPTChiY21fZmxkX3NldF9ldmVudF90cmFjZSk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfY2xlYXJfZXZlbnRfdHJhY2UpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfc2V0X2F2c19jb250KTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9nZXRfc3dfZXJyb3JfdGFibGUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL2JjbW9sdF9mbGQuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9mbGQvYmNtb2x0X2ZsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjk3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL2JjbW9sdF9mbGQuaApAQCAtMCwwICsxLDQ1NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PTFRfRkxEX0gKKyNkZWZpbmUgQkNNT0xUX0ZMRF9ICisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfaWRzLmgiCisjaW5jbHVkZSAiYmNtX2ZsZF9jb21tb24uaCIKKworLyoqIFxkZWZncm91cCBcZmxkX2RhdGFfdHlwZXMgRGF0YSBUeXBlcworICogXGluZ3JvdXAgZmxkCisgKiBAeworICovCisKKyNkZWZpbmUgUENJRV9SRVZJU0lPTl9SRUdJU1RFUl9PRkZTRVQgICAgICAgMHg2NDA2Q1UgLyogUENJRV9QQ0lFX1BDSUVfMF9QQ0lFX1BDSUVfMF9NSVNDX1JFVklTSU9OICAgICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19yZWdzX2Jhc2U7CisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19zcmFtX2Jhc2U7CisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19kZHJfYmFzZTsKKyAgICB1aW50MzJfdCAgICAgICAgc29jX2Rkcl9sZW5ndGg7ICAgICAvKiBkZHIgd2luZG93IGxlbmd0aCAqLworICAgIHVpbnQzMl90ICAgICAgICBzb2NfY3J0X2xlbmd0aDsgICAgIC8qIGRkciB1c2VkIGZvciBsb2FkIGxlbmd0aCAqLworfSBiY21fZmxkX2RldmljZV9pbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90ICAgIG9zX2VudHJ5X29mZnNldDsKKyAgICB1aW50MzJfdCAgICBwcm90b2NvbF92ZXJzaW9uOworICAgIHVpbnQzMl90ICAgIHN0YXRlOworICAgIHVpbnQzMl90ICAgIHJlYXNvbjsKK30gYmNtX2ZsZF9kZXZpY2Vfc3RhdDsKKworLyoqCisqIFxicmllZiBJbml0aWFsaXplIGludGVybmFsIGRhdGEgYmFzZQorKgorKiAgYWxsb2NhdGUgdGhlIGFycmF5IG9mIHBvaW50ZXJzIHRvIGluZm8gcGVyIGRldmljZSBhbGxvY2F0ZQorKiAgYW5kIGNsZWFyIHRoZSBpbmZvIHN0cnVjdHVyZSBmb3IgZXZlcnkgcG9zc2libGUgZGV2aWNlCisqCisqIFxwYXJhbVtpbl0gbWF4X2RldmljZXMgSG93IG1hbnkgZGV2aWNlcyBtaWdodCBiZSBkZWZpbmVkCisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX2luaXQodWludDMyX3QgbWF4X2RldmljZXMpOworCisvKioKKyogXGJyaWVmIEluaXRpYWxpemUgY29tbXVuaWNhdGlvbiBhcmVhCisqCisqICBjbGVhciB0aGUgY29tbXVuaWNhdGlvbiBhcmVhCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKi8KK3ZvaWQgYmNtX2ZsZF9jbGVhcl9jb21tX2FyZWEodWludDMyX3QgZGV2aWNlKTsKKworLyoqCisqIFxicmllZiBSZWxlYXNlIGludGVybmFsIGRhdGEgYmFzZQorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9leGl0KHZvaWQpOworCisvKioKKyogXGJyaWVmIFJlZ2lzdGVyIGEgZGV2aWNlIHRvIGRyaXZlcgorKgorKiAgc3RvcmUgdXNlcidzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxwYXJhbVtpbl0gaW5mbyBJbmZvcm1hdGlvbgorKiAgIC0gcmVncyBiYXNlIGFkZHJlc3MKKyogICAtIHNyYW0gYmFzZSBhZGRyZXNzCisqICAgLSBkZHIgYmFzZSBhZGRyZXNzCisqICAgLSBkZHIgd2luZG93IHNpemUKKyoKKyogXHJldHVybgorKiAwIGlmIHN1Y2Nlc3NmdWwsIDwwIGlmIGZhaWxlZAorKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfcmVnaXN0ZXIodWludDMyX3QgZGV2aWNlLCBiY21fZmxkX2RldmljZV9pbmZvICppbmZvKTsKKworLyoqCisqIFxicmllZiBVbnJlZ2lzdGVyIGEgZGV2aWNlIGZyb20gZHJpdmVyCisqCisqICByZW1vdmUgdGhlIGRldmljZSBmcm9tIHRoZSBpbnRlcm5hbCBkYgorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyoKKyogXHJldHVybgorKiAwIGlmIHN1Y2Nlc3NmdWwsIDwwIGlmIGZhaWxlZAorKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfdW5yZWdpc3Rlcih1aW50MzJfdCBkZXZpY2UpOworCisvKioKKyogXGJyaWVmIFJlYWQgZnJvbSBjb21tdW5pY2F0aW9uIFNvQyBkZWJ1ZyBpbmZvcm1hdGlvbgorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyogXHBhcmFtW2luXSBkZWJ1Z19zdGF0ZSBJbmZvcm1hdGlvbiB0byBiZSBmaWxsZWQgcG9pbnRlcgorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfZGV2aWNlX3N0YXR1cyh1aW50MzJfdCBkZXZpY2UsIGJjbV9mbGRfZGV2aWNlX3N0YXQgKmRlYnVnX3N0YXRlKTsKKworLyoqCisqIFxicmllZiBSZWFkIGZyb20gY29tbXVuaWNhdGlvbiBTb0Mgc3RhdHVzCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKiBccGFyYW1baW5dIGNwdV9zdGF0ZSBJbmZvcm1hdGlvbiB0byBiZSBmaWxsZWQgcG9pbnRlcgorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfZGV2aWNlX2xvYWRpbmdfc3RhdGUodWludDMyX3QgZGV2aWNlLCBCQ01fRkxEX0NQVV9TVEFURSAqY3B1X3N0YXRlKTsKKworLyoqCisqIFxicmllZiBXcml0ZSBpbiBjb21tdW5pY2F0aW9uIGFyZWEgdGhlIGZpbmlzaCB3cml0aW5nIEREUgorKiAgICAgICAgaW5kaWNhdG9yCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKiBccGFyYW1baW5dIG9zX2VudHJ5X2FkZHJlc3MgRW50cnkgcG9pbnQgZm9yIGVtYmVkZGVkCisqICAgICAgIGFwcGxpY2F0aW9uCisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX2hvc3RfZmluaXNoX3dyaXRlX2Rkcih1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IG9zX2VudHJ5X2FkZHJlc3MpOworCisvKioKKyogXGJyaWVmIFJlYWQgZnJvbSBjb21tdW5pY2F0aW9uIHRoZSBsb2dzIGFyZWEKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxwYXJhbVtvdXRdIGxvZ19hcmVhIFBvaW50ZXIgbG9nZ2VyIGFyZWEKKyogXHBhcmFtW291dF0gbGVuZ3RoIExlbmd0aCBsb2dnZXIgYXJlYQorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfbG9ncyh1aW50MzJfdCBkZXZpY2UsIGNoYXIgKipsb2dfYXJlYSwgaW50ICpsZW5ndGgpOworCisvKioKKyogXGJyaWVmIFdyaXRlIHRoZSByZWNlaXZlZCBidWZmZXIgdG8gbWVtb3J5IGFjY29yZGluZyB0byBvZmZzZXQKKyogICAgICAgIGFuZCB0eXBlCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKiBccGFyYW1baW5dIGJ1ZmYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KKyogXHBhcmFtW2luXSBidWZmX3NpemUgQnVmZmVyIHNpemUKKyogXHBhcmFtW2luXSBvZmZzZXRfaW5faW1hZ2Ugb2Zmc2V0IHRvIHdyaXRlIHRoZSBidWZmZXIKKyogXHBhcmFtW2luXSBpbWFnZV90eXBlIExvYWRpbmcgdHlwZSwgYWNjb3JkaW5nIHRvIGRlc3RpbmF0aW9uIDoKKyogICAgICAgU1JBTSBvciBERFIKKyoKKyogXHJldHVybgorKiAwIGlmIHN1Y2Nlc3NmdWwsIDwwIGlmIGZhaWxlZAorKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfd3JpdGUodWludDMyX3QgZGV2aWNlLCBjaGFyICpidWZmLCB1aW50MzJfdCBidWZmX3NpemUsIHVpbnQzMl90IG9mZnNldF9pbl9pbWFnZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpOworCisvKioKKyogXGJyaWVmIFJlYWQgaW50byByZWNlaXZlZCBidWZmZXIgZnJvbSBtZW1vcnkgYWNjb3JkaW5nIHRvCisqICAgICAgICBvZmZzZXQgYW5kIHR5cGUKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxwYXJhbVtpbl0gYnVmZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgY29udGVudAorKiBccGFyYW1baW5dIGJ1ZmZfc2l6ZSBCdWZmZXIgc2l6ZQorKiBccGFyYW1baW5dIG9mZnNldF9pbl9pbWFnZSBvZmZzZXQgdG8gcmVhZCBpbnRvIHRoZSBidWZmZXIKKyogXHBhcmFtW2luXSBpbWFnZV90eXBlIExvYWRpbmcgdHlwZSwgYWNjb3JkaW5nIHRvIGRlc3RpbmF0aW9uIDoKKyogICAgICAgU1JBTSBvciBERFIKKyoKKyogXHJldHVybgorKiAwIGlmIHN1Y2Nlc3NmdWwsIDwwIGlmIGZhaWxlZAorKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfcmVhZCh1aW50MzJfdCBkZXZpY2UsIGNoYXIgKmJ1ZmYsIHVpbnQzMl90ICpidWZmX3NpemUsIHVpbnQzMl90IG9mZnNldF9pbl9pbWFnZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpOworCisvKioKKyogXGJyaWVmIFRha2Ugc29jIGNwdSBvdXQgb2YgcmVzZXQKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX3N0YXJ0X2Jvb3Rsb2FkZXIodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCB0ZXN0X2Rkcik7CisKKy8qKgorKiBcYnJpZWYgQ2hlY2sgaWYgYm9vdGxvYWRlciBmaW5pc2hlZCB0byBydW4KKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqCisqIFxyZXR1cm4KKyogQkNNT1NfVFJVRSBpZiBzdWNjZXNzZnVsLCBCQ01PU19GQUxTRSBpZiBmYWlsZWQKKyovCitiY21vc19ib29sIGJjbV9mbGRfaXNfYm9vdGxvYWRlcl9kb25lKHVpbnQzMl90IGRldmljZSk7CisKK2JjbW9zX2Jvb2wgYmNtX2ZsZF9pc19kZHJfdGVzdF9kb25lKHVpbnQzMl90IGRldmljZSk7CisKKy8qKgorKiBcYnJpZWYgQ2hlY2sgaWYgU29DIGZpbmlzaGVkIHN5bmNocm9uaXphdGlvbiBwcm9jZXNzCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKiBccmV0dXJuCisqLworYmNtb3NfYm9vbCBiY21fZmxkX3Rlc3RfZGV2aWNlX2Jvb3RyZWNvcmQodWludDMyX3QgZGV2aWNlKTsKKworLyoqCisqIFxicmllZiBSZXR1cm5zIHRoZSBib290cmVjb3JkIG9mIHRoZSBTb0MKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxwYXJhbVtpbl0gb3BhcXVlX2RhdGEgUG9pbnRlciB0byBpbmZvcm1hdGlvbgorKiAgIC0gcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGRlc2NyaXB0b3JzIHJpbmcKKyogICAtIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygc2hhZG93IGJ1ZmZlciBkZXNjcmlwdG9ycyByaW5nCisqICAgaW5mb19sZW5ndGggTVVTVCBiZSBtb2R1bG8gNAorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfZGV2aWNlX2Jvb3RyZWNvcmQodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqb3BhcXVlX2RhdGEpOworCisvKioKKyogXGJyaWVmIFNldCBib290cmVjb3JkIHZhbGlkIGJpdCB0byBiZSBjaGVja2VkIGJ5IHRoZSBkZXZpY2UKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX3NldF9ob3N0X2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpOworCisvKioKKyogXGJyaWVmIENoZWNrIGJvb3RyZWNvcmQgdmFsaWQgYml0IHNldCBwcmV2aW91c2x5IGJ5IHRoZSBkZXZpY2UKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19ib29sIGJjbV9mbGRfdGVzdF9ob3N0X2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpOworCisvKioKKyogXGJyaWVmIENsZWFyIGJvb3RyZWNvcmQgdmFsaWQgYml0IHRvIGJlIGNoZWNrZWQgYnkgdGhlIGRldmljZQorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyogXHJldHVybgorKiAwIGlmIHN1Y2Nlc3NmdWwsIDwwIGlmIGZhaWxlZAorKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfY2xlYXJfZGV2aWNlX2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpOworCisvKioKKyogXGJyaWVmIENoZWNrIGJvb3RyZWNvcmQgdmFsaWQgYml0IHNldCBwcmV2aW91c2x5IGJ5IHRoZSBkZXZpY2UKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19ib29sIGJjbV9mbGRfdGVzdF9kZXZpY2VfYm9vdHJlY29yZF9mbGFnKHVpbnQzMl90IGRldmljZSk7CisKKy8qKgorKiBcYnJpZWYgV3JpdGUgdGhlIHR4IGFuZCByeCBxdWV1ZSBzaXplcyB0byBjb21tdW5pY2F0aW9uIGFyZWEKKyogICBzZXQgcXVldWUgdmFsaWRpdHkgYml0IGZvciB0aGUgZGV2aWNlCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKiBccGFyYW1baW5dIGhvc3RfdHhfc2l6ZSBRdWV1ZSBzaXplIDogaXMgYWxzbyB0aGUgZGV2aWNlIHJ4CisqICAgICAgIHF1ZXVlIHNpemUKKyogXHBhcmFtW2luXSBob3N0X3J4X3NpemUgUXVldWUgc2l6ZSA6IGlzIGFsc28gdGhlIGRldmljZSB0eAorKiAgICAgICBxdWV1ZSBzaXplCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX3NldF9yaW5nc19zaXplKHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgaG9zdF90eF9zaXplLCB1aW50MzJfdCBob3N0X3J4X3NpemUpOworCisvKioKKyogXGJyaWVmIHNldCBERFIgUkFTY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKiBccGFyYW1baW5dIHJhcyAgSWRlbnRpZmllcyB0aGUgcmFzIG51bWJlciAsIGNhbiBiZSAwIG9yIDEKKyoKKyogXHBhcmFtW2luXSBtb2RlIElkZW50aWZpZXMgbW9kZSAtIGRpc2FibGUgMCwgZ3BvbiAxLCB4Z3BvbiAyLAorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfcmFzX21vZGVfc2V0KHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgcmFzLCB1aW50MzJfdCBtb2RlKTsKKworLyoqCisqIFxicmllZiBOb3RpZnkgZGV2aWNlIGFib3V0IGFuIGV2ZW50IHRoYXQgb2NjdXJyZWQgb24gdGhlIGhvc3Qgc2lkZQorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyoKKyogXHBhcmFtW2luXSBldmVudCAgVXNlciBkZWZpbmVkIGV2ZW50CisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX3NldF9ob3N0X2V2ZW50KHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgZXZlbnQpOworCisvKioKKyogXGJyaWVmIENoZWNrIHF1ZXVlcyB2YWxpZCBiaXQgc2V0IHByZXZpb3VzbHkgYnkgSG9zdAorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyoKKyogXHJldHVybgorKiBGQUxTRSBpZiBQUk1fVkFMSUQgYml0IGlzIG5vdCBzZXQsIFRSVUUgaWYgUFJNX1ZBTElEIGJpdCBpcworKiBzZXQKKyovCitiY21vc19ib29sIGJjbV9mbGRfdGVzdF9xdWV1ZXNfZmxhZyh1aW50MzJfdCBkZXZpY2UpOworCisvKioKKyogXGJyaWVmIEdldCB0aGUgZXhjZXB0aW9uIGFyZWEgc3RhdGUsIHNldCBieSB0aGUgZGV2aWNlIGV4Y2VwdGlvbgorKiAgICAgICAgaGFuZGxlcgorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyogXHBhcmFtW291dF0gc3RhdGUgUG9pbnRlciB0byBleGNlcHRpb24gc3RhdGUgb24gY3B1MCB2YWx1ZQorKiBccGFyYW1bb3V0XSBzdGF0ZSBQb2ludGVyIHRvIGV4Y2VwdGlvbiBzdGF0ZSBvbiBjcHUxIHZhbHVlCisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2V4Y2VwdGlvbl9zdGF0ZSh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90ICpzdGF0ZTAsIHVpbnQzMl90ICpzdGF0ZTEpOworCisvKioKKyogXGJyaWVmIENsZWFyIHRoZSBleGNlcHRpb24gYXJlYSBzdGF0ZQorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyogXHBhcmFtW2luXSBjcHVpZCBJZGVudGlmaWVzIHRoZSB0aGUgZGV2aWNlIGNwdQorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9jbGVhcl9leGNlcHRpb25fc3RhdGUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBjcHVpZCk7CisKKy8qKgorKiBcYnJpZWYgRmlsbCBidWZmZXIgd2l0aCB0aGUgZXhjZXB0aW9uIGFyZWEgY29udGVudCwgc2V0IGJ5CisqICAgICAgICB0aGUgZGV2aWNlIGV4Y2VwdGlvbiBoYW5kbGVyCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKiBccGFyYW1baW5dIGNwdWlkIElkZW50aWZpZXMgdGhlIHRoZSBkZXZpY2UgY3B1CisqIFxwYXJhbVtvdXRdIGJ1ZmZlciBQb2ludGVyIHRvIGJlIGZpbGxlZCB3aXRoIHRoZSBleGNlcHRpb24KKyogICAgICAgYXJlYSBjb250ZW50CisqIFxwYXJhbVtvdXRdIGxlbmd0aCBMZW5ndGggb2YgdGhlIGJ1ZmZlcgorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9jb3B5X2V4Y2VwdGlvbl9sb2codWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBjcHVpZCwgY2hhciAqYnVmZmVyLCBpbnQgKmxlbmd0aCk7CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKy8qKgorKiBcYnJpZWYgU2V0IGV2ZW50IHRyYWNlIGZsYWcgdG8gYmUgcmVhZCBieSBlbWJlZGRlZCBhbmQgc3RhcnQKKyogICAgICAgIHRyYWNlaW5nCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfZXZlbnRfdHJhY2UodWludDMyX3QgZGV2aWNlKTsKKworLyoqCisqIFxicmllZiBDbGVhciBldmVudCB0cmFjZSBmbGFnIHRvIGJlIHJlYWQgYnkgZW1iZWRkZWQgYW5kIHN0b3AKKyogICAgICAgIHRyYWNlaW5nCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9jbGVhcl9ldmVudF90cmFjZSh1aW50MzJfdCBkZXZpY2UpOworI2VuZGlmCisKKy8qKgorKiBcRGVidWcgc3RhdGVzIGFuZCBmdW5jdGlvbnMKKyovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90ICAgIHdyaXRlX3NyYW07CisgICAgdWludDMyX3QgICAgc3RhcnRfZGV2aWNlOworICAgIHVpbnQzMl90ICAgIHdyaXRlX2RkcjsKKyAgICB1aW50MzJfdCAgICBmaW5pc2hfZGRyOworfSBiY21fZmxkX2hvc3RfZGVidWdfc3RhdGU7CisKK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9GTERfSE9TVF9OT05FLAorICAgIEJDTV9GTERfSE9TVF9XUklURV9TUkFNLCAgICAvKiBzZXQgYmVmb3JlIGxvYWQgIGltYWdlIHRvIFNSQU0gKi8KKyAgICBCQ01fRkxEX0hPU1RfU1RBUlRfQ1BVLCAgICAgLyogc2V0IGJlZm9yZSByZXN1bWUgQVJNICovCisgICAgQkNNX0ZMRF9IT1NUX1dSSVRFX0REUiAgICAgIC8qIHNldCBiZWZvcmUgbG9hZCAgaW1hZ2UgdG8gRERSICovCit9IEJDTV9GTERfSE9TVF9ERUJVR19WQUxVRVM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgYm9vdF9mcm9tX3NyYW1fc3RhdGVzOworICAgIHVpbnQzMl90IGJvb3RfZnJvbV9zcmFtX2Vycm9yczsKKyAgICB1aW50MzJfdCBib290X2Zyb21fc3JhbV9leGNlcHRpb247CisgICAgdWludDMyX3QgcnVuX2Zyb21fZGRyX3N0YXRlOworfSBiY21fZmxkX2RldmljZV9kZWJ1Z19zdGF0ZTsKKworLyoqCisqIFxicmllZiBTZXQgYW5kIGdldCBkZWJ1Z2dpbmcgdHJhY2VpbmcgZnJvbSBjb21tdW5pY2F0aW9uIGFyZWEKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxwYXJhbVtpbl0gaW5mbyBQb2ludGVyIHRvIGluZm9ybWF0aW9uCisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCisvKiByZXR1cm5zIHNvYyBkZWJ1ZyBzdGF0ZXMgKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2RldmljZV9kZWJ1Z19zdGF0dXModWludDMyX3QgZGV2aWNlLCBiY21fZmxkX2RldmljZV9kZWJ1Z19zdGF0ZSAqaW5mbyk7CisvKiBkZWFsIHdpdGggaG9zdCBzdGF0ZXMgLSBmdW5jdGlvbmFsIGFuZCBkZWJ1ZyAqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfaG9zdF9kZWJ1Z19zdGF0dXModWludDMyX3QgZGV2aWNlLCBiY21fZmxkX2hvc3RfZGVidWdfc3RhdGUgKmluZm8pOworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfaG9zdF9kZWJ1Z19zdGF0dXModWludDMyX3QgZGV2aWNlLCBCQ01fRkxEX0hPU1RfREVCVUdfVkFMVUVTIHN0YXQpOworLyoqCisqIFxicmllZiBDaGVjayBpZiBzd2FwIG5lZWRlZCBmb3IgdGhlIHJlc3BlY3RpdmUgbWVtb3J5CisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKiBccmV0dXJuCisqIHRydWUgaWYgc3dhcCBuZWVkZWQsIGZhbHNlIGlmIHN3YXAgbm90IG5lZWRlZAorKi8KK2JjbW9zX2Jvb2wgYmNtX2ZsZF9yZWdzX3N3YXBfbmVlZGVkKHVpbnQzMl90IGRldmljZSk7CitiY21vc19ib29sIGJjbV9mbGRfc3JhbV9zd2FwX25lZWRlZCh1aW50MzJfdCBkZXZpY2UpOworYmNtb3NfYm9vbCBiY21fZmxkX2Rkcl9zd2FwX25lZWRlZCh1aW50MzJfdCBkZXZpY2UpOworCitiY21vc19lcnJubyBiY21fZmxkX3NldF9hdnNfY29udCh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IHZhbHVlKTsKKwordm9pZCAqYmNtX2ZsZF9nZXRfc3dfZXJyb3JfdGFibGUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqc2l6ZSk7Cit1aW50MzJfdCBiY21fZmxkX2Rkcl90ZXN0X3Jlc3VsdF9nZXQodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCB3b3JkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9ob3N0X2FwaS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9ob3N0X2FwaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODllYzU2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKK01PRF9OQU1FID0gaG9zdF9hcGkKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGRldl9sb2cgY29tbW9uX2dwb24gZGV2X2N0cmxfZGFlbW9uCisKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorICAgIE1PRF9ERVBTICs9IGNvbW1vbl9hcGkKK2Vsc2UKKyAgICBNT0RfREVQUyArPSBhcGkKK2VuZGlmCisKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorICAgIE1PRF9ERVBTICs9IGFwaV9jbGkgb3NfY2xpIGVtYmVkZGVkX2NsaQorZW5kaWYKKworc3JjcyA9IGJjbW9sdF9ob3N0X2FwaS5jCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9ob3N0X2FwaS9iY21vbHRfaG9zdF9hcGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9ob3N0X2FwaS9iY21vbHRfaG9zdF9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODhkM2MxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL2JjbW9sdF9ob3N0X2FwaS5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisgCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaWYgIWRlZmluZWQoTElOVVhfVVNFUl9TUEFDRSkKKyNpbmNsdWRlIDxiY21vbHRfZGV2X2N0cmwuaD4KKyNlbHNlCitiY21vc19lcnJubyBiY21vbHRfZGV2X2N0cmxfaW5pdCh2b2lkKTsKKyNlbmRpZgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSAiYmNtb2x0X2hvc3RfYXBpLmgiCisKK2JjbW9zX2Vycm5vIGJjbW9sdF9ob3N0X2luaXQoYmNtb2x0X2hvc3RfaW5pdF9wYXJhbXMgKnBhcmFtcykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtb3NfaW5pdCgpOworICAgIEJVR19PTihyYyk7CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgaWYgKHBhcmFtcy0+bG9nZ2VyX2luaXRfY2IpCisgICAgeworICAgICAgICByYyA9IHBhcmFtcy0+bG9nZ2VyX2luaXRfY2IoKTsKKyAgICAgICAgQlVHX09OKHJjKTsKKyAgICB9CisjZW5kaWYKKworICAgIGJjbW9zX3RyYWNlX2xldmVsX3NldChCQ01PU19UUkFDRV9MRVZFTF9FUlJPUik7CisKKyAgICAvKiBJbiB1c2VybW9kZSBMaW51eCwgd2UgZG9uJ3QgaW52b2tlIGJjbW9sdF9kZXZfY3RybF9pbml0KCkgZnJvbSB0aGUgYXBwbGljYXRpb24sIGJ1dCBmcm9tIGEga2VybmVsIG1vZHVsZSAoYmNtX2Rldl9jdHJsX2xpbnV4LmtvKS4gKi8KKyNpZiAhZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQorICAgIHJjID0gYmNtb2x0X2Rldl9jdHJsX2luaXQoJnBhcmFtcy0+ZGV2X2N0cmxfcGFyYW1zKTsKKyAgICBCVUdfT04ocmMpOworI2Vsc2UKKyAgICBpZiAocGFyYW1zLT5ydW5fZGV2X2N0cmwpCisgICAgeworICAgICAgICByYyA9IGJjbW9sdF9kZXZfY3RybF9pbml0KCk7CisgICAgICAgIEJVR19PTihyYyk7CisgICAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKQorICAgIC8qIEluaXRpYWxpemUgdHJhbnNwb3J0IGxheWVyLiAqLworICAgIHJjID0gYmNtdHJfaW5pdCgpOworICAgIEJVR19PTihyYyk7CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvaG9zdF9hcGkvYmNtb2x0X2hvc3RfYXBpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvaG9zdF9hcGkvYmNtb2x0X2hvc3RfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhY2Q2MQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9ob3N0X2FwaS9iY21vbHRfaG9zdF9hcGkuaApAQCAtMCwwICsxLDc1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfSE9TVF9BUElfSF8KKyNkZWZpbmUgX0JDTU9MVF9IT1NUX0FQSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisKKyNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKQorI2luY2x1ZGUgPGJjbXRyX2RlYnVnLmg+CisjaW5jbHVkZSA8YmNtdHJfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiYmNtb2x0X2FwaS5oIgorI2luY2x1ZGUgPGJjbV9jb21tb25fZ3Bvbi5oPgorI2luY2x1ZGUgPGJjbW9sdF9ob3N0X2FwaV9ncG9uX3V0aWxzLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoRU5BQkxFX0NMSSkgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKyNpbmNsdWRlIDxiY21fYXBpX2NsaS5oPgorI2luY2x1ZGUgPGJjbW9zX2NsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9lbWJlZGRlZF9jbGkuaD4KKyNpbmNsdWRlIDxiY210cl90cmFuc3BvcnRfY2xpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQorI2luY2x1ZGUgPGJjbW9sdF9kZXZfY3RybC5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQordHlwZWRlZiBiY21vbHRfZGV2X2N0cmxfY2JfaW1hZ2VfcmVhZCBiY21vbHRfaG9zdF9pbWFnZV9yZWFkX2NiOworI2VuZGlmCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtb2x0X2hvc3RfbG9nZ2VyX2luaXRfY2IpKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdAoreworI2lmICFkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisgICAgYmNtb2x0X2Rldl9jdHJsX3BhcmFtcyBkZXZfY3RybF9wYXJhbXM7CisjZW5kaWYKKyAgICAvKiBUaGlzIGNhbGxiYWNrIGluaXRpYWxpemVzIHRoZSBsb2dnZXIgbW9kdWxlLiBJZiB1c2luZyBjb21tb24vZGV2X2xvZyBtb2R1bGUsIGl0IHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgT1MgYWJzdHJhY3Rpb24gbGF5ZXIgaXMgaW5pdGlhbGl6ZWQsIGFuZCB0aGF0J3Mgd2h5CisgICAgICogaXQgaXMgYSBjYWxsYmFjayBhbmQgbm90IGRpcmVjdGx5IGluaXRpYWxpemVkIGJ5IHRoZSBjYWxsZXIuICovCisgICAgYmNtb2x0X2hvc3RfbG9nZ2VyX2luaXRfY2IgbG9nZ2VyX2luaXRfY2I7CisgICAgYmNtb3NfYm9vbCBydW5fZGV2X2N0cmw7Cit9IGJjbW9sdF9ob3N0X2luaXRfcGFyYW1zOworCitiY21vc19lcnJubyBiY21vbHRfaG9zdF9pbml0KGJjbW9sdF9ob3N0X2luaXRfcGFyYW1zICpwYXJhbXMpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL2JjbW9sdF9ob3N0X2FwaV9ncG9uX3V0aWxzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvaG9zdF9hcGkvYmNtb2x0X2hvc3RfYXBpX2dwb25fdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njc2NDAwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL2JjbW9sdF9ob3N0X2FwaV9ncG9uX3V0aWxzLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0hPU1RfQVBJX0dQT05fVVRJTFNfSF8KKyNkZWZpbmUgX0JDTU9MVF9IT1NUX0FQSV9HUE9OX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fY29tbW9uX2dwb24uaD4KKworLyogTm90ZSB0aGF0IFBPTnMgNC03IGFyZSBub3QgdXNlZCBpbiBHUE9OL1hHUE9OIGNvZXhpc3RlbmNlIG1vZGUuICovCisjZGVmaW5lIEZPUl9FQUNIX1BPTihwb25fbmkpXAorICAgIGZvciAocG9uX25pID0gKGJjbW9sdF9wb25fbmkpMDtcCisgICAgICAgICBwb25fbmkgPCAoYmNtb2x0X3Bvbl9uaSlzbWRiZy0+bnVtX29mX3BvbnM7XAorICAgICAgICAgKChiY21fY29tbW9uX2dwb25fZ2V0X3N5c3RlbV9tb2RlKCkgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0UgJiYgcG9uX25pID09IFhHUE9OX0hBTEZfQ0hJUF9NQVhfTlVNX09GX1BPTlMtMSkgPyBwb25fbmkgPSBYR1BPTl9NQVhfTlVNX09GX1BPTlMgOiBwb25fbmkrKykpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL3VzZXIvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvaG9zdF9hcGkvdXNlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YjViYWViCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL3VzZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorCitNT0RfTkFNRSA9IGhvc3RfYXBpX3VzZXIKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGRldl9sb2cgY29tbW9uX2dwb24gZGV2X2N0cmxfZGFlbW9uIGhvc3RfYXBpCisKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorICAgIE1PRF9ERVBTICs9IGNvbW1vbl9hcGkKK2Vsc2UKKyAgICBNT0RfREVQUyArPSBhcGkKK2VuZGlmCisKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorICAgIE1PRF9ERVBTICs9IGFwaV9jbGkgb3NfY2xpIGVtYmVkZGVkX2NsaQorZW5kaWYKKworTU9EX0RFRlMgKz0gLURJTl9CQU5ECisKK3NyY3MgPSAuLi9iY21vbHRfaG9zdF9hcGkuYworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIva2VlcF9hbGl2ZS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9rZWVwX2FsaXZlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMDJmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIva2VlcF9hbGl2ZS9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACisjIENvbW1vbiBrZWVwX2FsaXZlCisjCitNT0RfTkFNRSA9IGtlZXBfYWxpdmUKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCitNT0RfVFlQRSA9IGxpbnV4X2xpYgorZWxzZQorTU9EX1RZUEUgPSBsaWIKK2VuZGlmCisKK01PRF9ERVBTID0gbW9kZWwgICAKKworc3JjcyA9IGJjbV9rZWVwX2FsaXZlLmMKKwkgCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKK1VTRV9MSU5UID0geWVzCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIva2VlcF9hbGl2ZS9iY21fa2VlcF9hbGl2ZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2tlZXBfYWxpdmUvYmNtX2tlZXBfYWxpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODBmNjBlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2tlZXBfYWxpdmUvYmNtX2tlZXBfYWxpdmUuYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX2lkcy5oPgorI2luY2x1ZGUgImJjbV9rZWVwX2FsaXZlLmgiCisKK2tlZXBfYWxpdmVfbXNnX29yaWcyc3RyX3Qga2VlcF9hbGl2ZV9tc2dfb3JpZzJzdHJbXSA9Cit7CisgICAge0JDTV9LRUVQX0FMSVZFX01TR19PUklHX0RFVklDRSwgImRldmljZSJ9LAorICAgIHtCQ01fS0VFUF9BTElWRV9NU0dfT1JJR19IT1NULCAiaG9zdCJ9LAorICAgIHstMX0KK307CisKK3N0YXRpYyB2b2lkIGtlZXBfYWxpdmVfdHhfaGFuZGxlcihiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8pOworCitzdGF0aWMgYmNtb3NfdGltZXJfcmMga2VlcF9hbGl2ZV90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAqa2FfaW5mbzsKKyAgICB1aW50MzJfdCAgbGFzdF9yZWN2X2thX3RzOworICAgIHVpbnQzMl90ICBrYV9pbnRlcnZhbDsKKyAgICB1aW50MzJfdCAga2FfdG9sZXJhbmNlOworICAgIHVpbnQzMl90ICB0aW1lX2RpZmZfZnJvbV9wcmV2X2thOworICAgIHVpbnQzMl90ICBrYV9wcm9jZXNzX3N0YXJ0X3RzOworICAgIHVpbnQzMl90ICBwcmV2X2thX3RzOworICAgIGthX2luZm8gPSAoYmNtb3Nfa2VlcF9hbGl2ZV9pbmZvICopZGF0YTsKKyAgICBsYXN0X3JlY3Zfa2FfdHMgPSBrYV9pbmZvLT5sYXN0X3JlY3Zfa2FfdGltZXN0YW1wOworICAgIGthX2ludGVydmFsID0ga2FfaW5mby0+a2FfaW50ZXJ2YWw7CisgICAga2FfdG9sZXJhbmNlID0ga2FfaW5mby0+a2FfdG9sZXJhbmNlOworICAgIGthX3Byb2Nlc3Nfc3RhcnRfdHMgPSBrYV9pbmZvLT5rYV9wcm9jZXNzX3N0YXJ0X3RzOworCisgICAgLyogVGhlIGZpcnN0IGtlZXAgYWxpdmUgbWVzc2FnZSB0aGF0IGFycml2ZXMgY2hhbmdlcyBsYXN0X3JlY3Zfa2FfdHMgdG8gYSB2YWx1ZSBkaWZmZXJlbnQgdGhhbiB6ZXJvLgorICAgICAqIElmIG5vIGtlZXAgYWxpdmUgbWVzc2FnZSBoYXMgYXJyaXZlZCB5ZXQgdGhlbiB0aGUgcHJldmlvdXMga2VlcCBhbGl2ZSB0aW1lIHN0YW1wIGlzIHRoZSB0aW1lIHRoZSBwcm9jZXNzIGhhcworICAgICAqIHN0YXJ0ZWQuICovCisgICAgcHJldl9rYV90cyA9IChsYXN0X3JlY3Zfa2FfdHMgPyBsYXN0X3JlY3Zfa2FfdHMgOiBrYV9wcm9jZXNzX3N0YXJ0X3RzKTsKKworICAgIC8qIFRpbWUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgdGltZSBhbmQgdGhlIHByZXZpb3VzIGtlZXAgYWxpdmUgbWVzc2FnZSAqLworICAgIHRpbWVfZGlmZl9mcm9tX3ByZXZfa2EgPSBiY21vc190aW1lc3RhbXAoKSAtIHByZXZfa2FfdHM7CisKKyAgICAvKiBDaGVjayBpZiBrZWVwIGFsaXZlIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIHBhc3Qga2VlcCBhbGl2ZSBpbnRlcnZhbCwgYm90aCBwYXJ0IG9mIHRoZSBlcXVhdGlvbiBjYW4ndCBvdmVyZmxvdzoKKyAgICAgKiBUaGUgbGVmdCBwYXJ0IGlzIHN1YnRyYWN0aW9uIG9mIHR3byB1bnNpZ25lZCBpbnRlZ2VycyBhbmQgdGhlIHJpZ2h0IHBhcnQgaXMgcmVzdHJpY3RlZCBieSBrYV9pbnRlcnZhbCBtYXggdmFsdWUgYW5kIGthX3RvbGVyYW5jZSBtYXggdmFsdWUgLQorICAgICAqIHRoZWlyIG11bHRpcGxpY2F0aW9uIGNhbid0IGV4Y2VlZCBtYXggdW5zaWduZWQgaW50ZWdlciAqLworICAgIGlmICh0aW1lX2RpZmZfZnJvbV9wcmV2X2thID4ga2FfaW50ZXJ2YWwgKiAoa2FfdG9sZXJhbmNlICsgMSkpCisgICAgeworICAgICAgICBpZiAobGFzdF9yZWN2X2thX3RzKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9JTkZPKAorICAgICAgICAgICAgICAgICJEaWRuJ3QgcmVjZWl2ZSBrZWVwIGFsaXZlIG1lc3NhZ2UgZm9yICV1IHNlY29uZHMgLSBhYm91dCB0byBkaXNjb25uZWN0XG4iLAorICAgICAgICAgICAgICAgIChiY21vc190aW1lc3RhbXAoKSAtIGxhc3RfcmVjdl9rYV90cykgLyBCQ01PU19NSUNST1NFQ09ORFNfSU5fU0VDT05EUyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9JTkZPKAorICAgICAgICAgICAgICAgICJEaWRuJ3QgcmVjZWl2ZSBrZWVwIGFsaXZlIG1lc3NhZ2Ugc2luY2Uga2VlcCBhbGl2ZSBwcm9jZXNzIHN0YXJ0ZWQgJXUgc2Vjb25kcyBhZ28gLSAiCisgICAgICAgICAgICAgICAgICAgICJhYm91dCB0byBkaXNjb25uZWN0XG4iLAorICAgICAgICAgICAgICAgIChiY21vc190aW1lc3RhbXAoKSAtIGthX3Byb2Nlc3Nfc3RhcnRfdHMpIC8gQkNNT1NfTUlDUk9TRUNPTkRTX0lOX1NFQ09ORFMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGthX2luZm8tPmRpc2Nvbm5lY3RfaGFuZGxlcihrYV9pbmZvLT5kZXZpY2UpICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChrYV9pbmZvLT5vcmlnID09IEJDTV9LRUVQX0FMSVZFX01TR19PUklHX0hPU1QpCisgICAgICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2VuZCBkaXNjb25uZWN0IG1lc3NhZ2UgKGRldmljZT0lZClcbiIsIGthX2luZm8tPmRldmljZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gaW52b2tlIGRpc2Nvbm5lY3QgZnJvbSB0aGUgaG9zdCBwcm9jZWR1cmVcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQ01PU19USU1FUl9TVE9QOworICAgIH0KKworICAgIC8qIFNlbmQgS2VlcCBhbGl2ZSBtZXNzYWdlIHRvIHRoZSByZW1vdGUgc2lkZSAqLworICAgIGtlZXBfYWxpdmVfdHhfaGFuZGxlcihrYV9pbmZvKTsKKworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKworc3RhdGljIHZvaWQga2VlcF9hbGl2ZV90eF9oYW5kbGVyKGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAqa2FfaW5mbykKK3sKKyAgICBiY21vc19rZWVwX2FsaXZlX21zZyBrYV9tc2cgPSB7fTsKKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7fTsKKyAgICBpZiAoa2FfaW5mby0+b3JpZyA9PSBCQ01fS0VFUF9BTElWRV9NU0dfT1JJR19IT1NUKQorICAgIHsKKyAgICAgICAgQkNNT0xUX09QRVJfSU5JVCgma2FfbXNnLmhvc3QsIGRldmljZSwgaG9zdF9rZWVwX2FsaXZlLCBrZXkpOworICAgICAgICBrYV9tc2cuaG9zdC5oZHIuaGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfU0VUOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgma2FfbXNnLmhvc3QsIGRldmljZSwgaG9zdF9rZWVwX2FsaXZlLCBzZXF1ZW5jZV9udW1iZXIsIGthX2luZm8tPmxhc3Rfc2VudF9rYV9zZXErKyk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZrYV9tc2cuaG9zdCwgZGV2aWNlLCBob3N0X2tlZXBfYWxpdmUsIHRpbWVfc3RhbXAsIGJjbW9zX3RpbWVzdGFtcCgpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fSU5JVCgma2FfbXNnLmRldmljZSwgZGV2aWNlLCBkZXZpY2Vfa2VlcF9hbGl2ZSk7CisgICAgICAgIGthX21zZy5kZXZpY2UuaGRyLmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICAgICAga2FfbXNnLmRldmljZS5kYXRhLnNlcXVlbmNlX251bWJlciA9IGthX2luZm8tPmxhc3Rfc2VudF9rYV9zZXErKzsKKyAgICAgICAga2FfbXNnLmRldmljZS5kYXRhLnRpbWVfc3RhbXAgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICB9CisKKyAgICBpZiAoa2FfaW5mby0+c2VuZF9oYW5kbGVyKGthX2luZm8tPmRldmljZSwgKGJjbW9sdF9tc2cgKikma2FfbXNnKSAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygiRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHNlbmQga2VlcCBhbGl2ZSBzZXF1ZW5jZSBudW1iZXIgJXVcbiIsIGthX2luZm8tPmxhc3Rfc2VudF9rYV9zZXEpOworICAgIH0KK30KKwordm9pZCBrZWVwX2FsaXZlX3J4X2hhbmRsZXIoY29uc3QgYmNtb3Nfa2VlcF9hbGl2ZV9kYXRhX21zZyAqa2FfZGF0YV9tc2csIGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAqa2FfaW5mbykKK3sKKyAgICB1aW50MzJfdCBzZXFfZGlmZjsKKyAgICB1aW50MzJfdCByeF9tc2dfc2VxOworICAgIHVpbnQzMl90IHJ4X21zZ190czsKKworICAgIC8qIFRyaWNreSBwYXJ0IC0gcnhfbXNnX3NlcSBpcyBOT1QgZnJvbSB0aGUgb3JpZ2luYXRvciBidXQgZnJvbSB0aGUgb3RoZXIgc2lkZSAqLworICAgIGlmIChrYV9pbmZvLT5vcmlnID09IEJDTV9LRUVQX0FMSVZFX01TR19PUklHX0hPU1QpCisgICAgeworICAgICAgICByeF9tc2dfc2VxID0ga2FfZGF0YV9tc2ctPmRldmljZS5zZXF1ZW5jZV9udW1iZXI7CisgICAgICAgIHJ4X21zZ190cyA9IGthX2RhdGFfbXNnLT5kZXZpY2UudGltZV9zdGFtcDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcnhfbXNnX3NlcSA9IGthX2RhdGFfbXNnLT5ob3N0LnNlcXVlbmNlX251bWJlcjsKKyAgICAgICAgcnhfbXNnX3RzID0ga2FfZGF0YV9tc2ctPmhvc3QudGltZV9zdGFtcDsKKyAgICB9CisKKyAgICAvKiBJZiBsYXN0X3JlY3Zfa2Ffc2VxIGFuZCBsYXN0X3JlY3Zfa2FfdGltZXN0YW1wIGFyZSBib3RoIHplcm9zIHRoZW4gaXQncyB0aGUgZmlyc3QgbWVzc2FnZSAqLworICAgIGlmIChrYV9pbmZvLT5sYXN0X3JlY3Zfa2Ffc2VxIHx8IGthX2luZm8tPmxhc3RfcmVjdl9rYV90aW1lc3RhbXApCisgICAgeworICAgICAgICAvKiBBbGwgcGFydCBvZiB0aGUgZXF1YXRpb24gYXJlIHVuc2lnbmVkIGludGVnZXJzIHNvIHdhcnAgYXJvdW5kIGlzIGFscmVhZHkgdGFrZW4gY2FyZSBvZiAqLworICAgICAgICBzZXFfZGlmZiA9IHJ4X21zZ19zZXEgLSBrYV9pbmZvLT5sYXN0X3JlY3Zfa2Ffc2VxOworCisgICAgICAgIC8qIEluIHRoZSBub3JtYWwgY2FzZSBzZXFfZGlmZiBzaG91bGQgYmUgb25lICovCisgICAgICAgIGlmIChzZXFfZGlmZiA+IDFVTCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygKKyAgICAgICAgICAgICAgICAiQ3VycmVudCBrZWVwIGFsaXZlIHNlcXVlbmNlIG51bWJlciBpcyAldSB3aGlsZSBwcmV2aW91cyBrZWVwIGFsaXZlIHNlcXVlbmNlIG51bWJlciB3YXMgJXVcbiIsCisgICAgICAgICAgICAgICAgcnhfbXNnX3NlcSwKKyAgICAgICAgICAgICAgICBrYV9pbmZvLT5sYXN0X3JlY3Zfa2Ffc2VxKTsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0lORk8oCisgICAgICAgICAgICAgICAgIkN1cnJlbnQgdGltZSBzdGFtcCBpcyAldSB3aGlsZSBwcmV2aW91cyB0aW1lIHN0YW1wIHdhcyAldSwgcmVjZWl2ZSB0aW1lc3RhbXAgaXMgJXVcbiIsCisgICAgICAgICAgICAgICAgYmNtb3NfdGltZXN0YW1wKCksCisgICAgICAgICAgICAgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3RpbWVzdGFtcCxyeF9tc2dfdHMpOworICAgICAgICAgICAgaWYgKHNlcV9kaWZmIDw9IGthX2luZm8tPmthX3RvbGVyYW5jZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01PU19UUkFDRV9JTkZPKAorICAgICAgICAgICAgICAgICAgICAiTWlzc2VkICV1IGtlZXAgYWxpdmUgbWVzc2FnZXMgKGtlZXAgYWxpdmUgdG9sZXJhbmNlIGlzIHRvIGxvc2UgJWQgbWVzc2FnZXMpXG4iLAorICAgICAgICAgICAgICAgICAgICBzZXFfZGlmZiwKKyAgICAgICAgICAgICAgICAgICAga2FfaW5mby0+a2FfdG9sZXJhbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoCisgICAgICAgICAgICAgICAgICAgICJNaXNzZWQgJXUga2VlcCBhbGl2ZSBtZXNzYWdlcyAoa2VlcCBhbGl2ZSB0b2xlcmFuY2UgaXMgdG8gbG9zZSAlZCBtZXNzYWdlcyAtICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYm91dCB0byBkaXNjb25uZWN0KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgc2VxX2RpZmYsCisgICAgICAgICAgICAgICAgICAgIGthX2luZm8tPmthX3RvbGVyYW5jZSk7CisgICAgICAgICAgICAgICAgc3RvcF9rZWVwX2FsaXZlX3Byb2Nlc3Moa2FfaW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKGthX2luZm8tPmRpc2Nvbm5lY3RfaGFuZGxlcihrYV9pbmZvLT5kZXZpY2UpICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoa2FfaW5mby0+b3JpZyA9PSBCQ01fS0VFUF9BTElWRV9NU0dfT1JJR19IT1NUKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHRyeWluZyB0byBzZW5kIGRpc2Nvbm5lY3QgbWVzc2FnZSAoZGV2aWNlPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrYV9pbmZvLT5kZXZpY2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2VuZCBkaXNjb25uZWN0IGZyb20gdGhlIGhvc3QgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisJLyogU3Ryb2UgYXQgdGhlIHJlY2lldmluZyBzaWRlJ3MgZGF0YWJhc2UsIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgbWVzc2FnZSB0aGF0IGNhbWUgICovCisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3NlcSA9IHJ4X21zZ19zZXE7CisKKyAgICAvKiBUaGUgdGltZSBzdGFtcCBpcyB0YWtlbiBmcm9tIHRoZSBjbG9jayBhdCB0aGUgcmVjZWl2aW5nIHNpZGUgLCBub3Qgd2hhdCBjYW1lIGluIHRoZSBtZXNzYWdlICovCisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3RpbWVzdGFtcCA9IGJjbW9zX3RpbWVzdGFtcCgpOworfQorCitiY21vc19lcnJubyBjcmVhdGVfa2VlcF9hbGl2ZV90aW1lcihiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8sIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQpCit7CisgICAgYmNtb3NfdGltZXJfcGFybSB0aW1lcl9wYXJhbXMgPSB7fTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3RpbWVzdGFtcCA9IDA7CisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3NlcSA9IDA7CisKKyAgICBzbnByaW50ZihrYV9pbmZvLT5rYV90aW1lci5uYW1lLCBzaXplb2Yoa2FfaW5mby0+a2FfdGltZXIubmFtZSksICJrZWVwX2FsaXZlX3QldSIsIGthX2luZm8tPmRldmljZSk7CisgICAgdGltZXJfcGFyYW1zLm5hbWUgPSBrYV9pbmZvLT5rYV90aW1lci5uYW1lOworICAgIHRpbWVyX3BhcmFtcy5vd25lciA9IG1vZHVsZV9pZDsKKyAgICB0aW1lcl9wYXJhbXMucGVyaW9kaWMgPSBCQ01PU19UUlVFOworICAgIHRpbWVyX3BhcmFtcy5oYW5kbGVyID0ga2VlcF9hbGl2ZV90aW1lcl9oYW5kbGVyOworICAgIHRpbWVyX3BhcmFtcy5kYXRhID0gKGxvbmcpa2FfaW5mbzsKKyAgICByYyA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgma2FfaW5mby0+a2FfdGltZXIudGltZXIsICZ0aW1lcl9wYXJhbXMpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKAorICAgICAgICAgICAgImtlZXAgYWxpdmUgdGltZXIgY3JlYXRpb24gZmFpbGVkLCBiY21vc190aW1lcl9jcmVhdGUgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwKKyAgICAgICAgICAgIHJjKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIHN0YXJ0X2tlZXBfYWxpdmVfcHJvY2VzcyhiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8pCit7CisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3RpbWVzdGFtcCA9IDA7CisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3NlcSA9IDA7CisgICAga2FfaW5mby0+a2FfcHJvY2Vzc19zdGFydF90cyA9IGJjbW9zX3RpbWVzdGFtcCgpOworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZrYV9pbmZvLT5rYV90aW1lci50aW1lciwga2FfaW5mby0+a2FfaW50ZXJ2YWwpOworfQorCit2b2lkIHN0b3Bfa2VlcF9hbGl2ZV9wcm9jZXNzKGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAqa2FfaW5mbykKK3sKKyAgICBiY21vc190aW1lcl9zdG9wKCZrYV9pbmZvLT5rYV90aW1lci50aW1lcik7Cit9CisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGNyZWF0ZV9rZWVwX2FsaXZlX3RpbWVyKTsKK0VYUE9SVF9TWU1CT0woa2VlcF9hbGl2ZV9yeF9oYW5kbGVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJCQ00gZGV2aWNlIGtlZXAtYWxpdmUgc3VwcG9ydCIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIva2VlcF9hbGl2ZS9iY21fa2VlcF9hbGl2ZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2tlZXBfYWxpdmUvYmNtX2tlZXBfYWxpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzc5ZGRkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2tlZXBfYWxpdmUvYmNtX2tlZXBfYWxpdmUuaApAQCAtMCwwICsxLDg2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTV9LRUVQX0FMSVZFX0hfCisjZGVmaW5lIEJDTV9LRUVQX0FMSVZFX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfY29udi5oPgorCisvKiBNZXNzYWdlIG9yaWdpbmF0b3IgOiBkZXZpY2UgIG9yIGhvc3QgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9LRUVQX0FMSVZFX01TR19PUklHX0RFVklDRSwKKyAgICBCQ01fS0VFUF9BTElWRV9NU0dfT1JJR19IT1NULAorfSBrZWVwX2FsaXZlX21zZ19vcmlnOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIgbmFtZVtNQVhfVElNRVJfTkFNRV9TSVpFXTsKKyAgICBiY21vc190aW1lciB0aW1lcjsKK30ga2VlcF9hbGl2ZV90aW1lcjsKKwordHlwZWRlZiBiY21vc19lcnJubyAoKkZfYmNtb3Nfa2VlcF9hbGl2ZV9zZW5kX2hhbmRsZXIpKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZyk7Cit0eXBlZGVmIGJjbW9zX2Vycm5vICgqRl9iY21vc19rZWVwX2FsaXZlX2Rpc2Nvbm5lY3RfaGFuZGxlcikoYmNtb2x0X2RldmlkIGRldmljZSk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgbGFzdF9zZW50X2thX3NlcTsKKyAgICB1aW50MzJfdCBsYXN0X3JlY3Zfa2Ffc2VxOworICAgIHVpbnQzMl90IGxhc3RfcmVjdl9rYV90aW1lc3RhbXA7CisgICAgdWludDMyX3Qga2FfcHJvY2Vzc19zdGFydF90czsKKyAgICB1aW50MzJfdCBrYV9pbnRlcnZhbDsKKyAgICB1aW50MzJfdCBrYV90b2xlcmFuY2U7CisgICAga2VlcF9hbGl2ZV9tc2dfb3JpZyBvcmlnOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2U7CisgICAga2VlcF9hbGl2ZV90aW1lciBrYV90aW1lcjsKKyAgICBGX2JjbW9zX2tlZXBfYWxpdmVfZGlzY29ubmVjdF9oYW5kbGVyIGRpc2Nvbm5lY3RfaGFuZGxlcjsKKyAgICBGX2JjbW9zX2tlZXBfYWxpdmVfc2VuZF9oYW5kbGVyIHNlbmRfaGFuZGxlcjsKK30gYmNtb3Nfa2VlcF9hbGl2ZV9pbmZvOworCit0eXBlZGVmIHVuaW9uCit7CisgICAgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSBkZXZpY2U7ICAvKio8IEtlZXAgYWxpdmUgbWVzc2FnZSBvcmlnaW5hdGVkIGF0IHRoZSBEZXZpY2UgKi8KKyAgICBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZSBob3N0OyAgICAgIC8qKjwgS2VlcCBhbGl2ZSBtZXNzYWdlIG9yaWdpbmF0ZWQgYXQgdGhlIEhvc3QgKi8KK30gYmNtb3Nfa2VlcF9hbGl2ZV9tc2c7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgZGV2aWNlOyAgLyoqPCBLZWVwIGFsaXZlIG1lc3NhZ2Ugb3JpZ2luYXRlZCBhdCB0aGUgRGV2aWNlICovCisgICAgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSBob3N0OyAgICAgIC8qKjwgS2VlcCBhbGl2ZSBtZXNzYWdlIG9yaWdpbmF0ZWQgYXQgdGhlIEhvc3QgKi8KK30gYmNtb3Nfa2VlcF9hbGl2ZV9kYXRhX21zZzsKKworQkNNT0xUX1RZUEUyU1RSKGtlZXBfYWxpdmVfbXNnX29yaWcsIGV4dGVybikKKwordm9pZCBrZWVwX2FsaXZlX3J4X2hhbmRsZXIoY29uc3QgYmNtb3Nfa2VlcF9hbGl2ZV9kYXRhX21zZyAqa2FfZGF0YV9tc2csIGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAqa2FfaW5mbyk7CitiY21vc19lcnJubyBjcmVhdGVfa2VlcF9hbGl2ZV90aW1lcihiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8sYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCk7Cit2b2lkIHN0YXJ0X2tlZXBfYWxpdmVfcHJvY2VzcyhiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8pOwordm9pZCBzdG9wX2tlZXBfYWxpdmVfcHJvY2VzcyhiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8pOworCisjZW5kaWYgLyogQkNNX0tFRVBfQUxJVkVfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9rZWVwX2FsaXZlL2RhZW1vbi9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9rZWVwX2FsaXZlL2RhZW1vbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZWI3ZjZjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2tlZXBfYWxpdmUvZGFlbW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMgQ29tbW9uIGtlZXBfYWxpdmUKKyMKK01PRF9OQU1FID0ga2VlcF9hbGl2ZV9kYWVtb24KKworTU9EX1RZUEUgPSBsaWIKKworTU9EX0RFUFMgPSBtb2RlbCAgIAorCitzcmNzID0gLi4vYmNtX2tlZXBfYWxpdmUuYworCSAKK1VTRV9MSU5UID0geWVzCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbWhfdXRpbHMvYmNtb2x0X21oX3V0aWxzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbWhfdXRpbHMvYmNtb2x0X21oX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1MmE0NQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9taF91dGlscy9iY21vbHRfbWhfdXRpbHMuaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX01IX1VUSUxTX0hfCisjZGVmaW5lIF9CQ01PTFRfTUhfVVRJTFNfSF8KKworI2RlZmluZSBNSF9FWElUX0lGKGNvbmQsIGVycm9yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICgoZXJyb3IpICE9IEJDTV9FUlJfT0sgJiYgKGVycm9yKSAhPSBCQ01fRVJSX05PX01PUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygjY29uZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZXJyID0gKGVycm9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnb3RvIGNsZWFudXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKEJDTU9TX0ZBTFNFKQorCisvKiBNYWNybyBmb3IgZGVjbGFyaW5nIGNmZ19nZXRfbXVsdGkgaGFuZGxlcnMsIHNpbmNlIHRoZSBmb3JtYXQgaXMgcGVyZmVjdGx5IHJlZ3VsYXIgKi8KKyNkZWZpbmUgTUhfREVDTEFSRV9DRkdfR0VUX01VTFRJKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGJjbW9zX2Vycm5vIG1oXyMjb2JqIyNfY2ZnX2dldF9tdWx0aSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgYmNtb2x0XyMjb2JqIyNfY2ZnICpmaWx0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiY21vbHRfZmlsdGVyX2ZsYWdzIGZsYWdzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiY21vbHRfIyNvYmojI19jZmcgY2ZnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgKmZpbHRlcl9wYWNrZWQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCAqbXNnX3BhY2tlZCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiY21vc19lcnJubyBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJjbW9zX2Jvb2wgc3VjY2VzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiY21vbHRfYnVmIGJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJjbW9zX2Jvb2wgaXNfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmNtb2x0X21zZyBkdW1teV9oZHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiY21vbHRfIyNvYmojI19rZXlfaWQgZHVtbXlfcHJvcF9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogYXNzdW1lIHdlIGRpZG4ndCBmaW5pc2ggYWxsIG9iamVjdHMgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtc2dfc2V0LT5tb3JlID0gQkNNT1NfVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogc3RhcnQgd2l0aCB0aGUga2V5IGluY2x1ZGVkIGluIHRoZSBmaWx0ZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKChiY21vbHRfIyNvYmojI19rZXkgKiltc2dfc2V0LT5uZXh0X2tleSkgPSBmaWx0ZXItPmtleTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogaWYgdGhlIGZpbHRlcidzIGtleSBjb250YWlucyBhbnkgd2lsZGNhcmRzLCBnZXQgdGhlIGZpcnN0IHJlYWwga2V5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlcnIgPSBtaF8jI29iaiMjX2tleV9yZXNvbHZlX3dpbGRjYXJkcyhtc2dfc2V0LT5uZXh0X2tleSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1IX0VYSVRfSUYoZXJyICE9IEJDTV9FUlJfT0ssIGVycik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBpZiB0aGUgaW5pdGlhbCBrZXkgaXMgaW52YWxpZCwgZXhpdCBlYXJseSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1IX0VYSVRfSUYoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICFiY21vbHRfIyNvYmojI19rZXlfYm91bmRzX2NoZWNrKG1zZ19zZXQtPm5leHRfa2V5LCBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEwsICZkdW1teV9wcm9wX2lkKSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQkNNX0VSUl9LRVlfUkFOR0UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVyciA9IG1oXyMjb2JqIyNfa2V5X3ZhbGlkYXRlKCZkdW1teV9oZHIsIG1zZ19zZXQtPm5leHRfa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUhfRVhJVF9JRihlcnIgIT0gQkNNX0VSUl9PSywgZXJyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHBhY2sgZmlsdGVyIGRhdGEgKGluY2x1ZGluZyBwcmVzZW5jZSBtYXNrKSBmb3IgY29tcGFyaXNvbnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbGVuID0gYmNtb2x0XyMjb2JqIyNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoJmZpbHRlci0+ZGF0YSwgZmlsdGVyLT5oZHIuaGRyLnByZXNlbmNlX21hc2spOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaWx0ZXJfcGFja2VkID0gYmNtb3NfY2FsbG9jKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1IX0VYSVRfSUYobGVuID4gMCAmJiBmaWx0ZXJfcGFja2VkID09IE5VTEwsIEJDTV9FUlJfTk9NRU0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIGxlbiwgZmlsdGVyX3BhY2tlZCwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdWNjZXNzID0gYmNtb2x0XyMjb2JqIyNfY2ZnX2RhdGFfcGFjaygmZmlsdGVyLT5kYXRhLCAmYnVmLCBmaWx0ZXItPmhkci5oZHIucHJlc2VuY2VfbWFzayk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKG1zZ19zZXQtPm51bV9pbnN0YW5jZXMgPCBtc2dfc2V0LT5tYXhfaW5zdGFuY2VzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBpbml0aWFsaXplIHRoZSBjZmcgc3RydWN0dXJlIHdpdGggdGhlIGtleSBhbmQgcGFzcyBpdCB0byB0aGUgTUggY2ZnX2dldCBoYW5kbGVyICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBvYmosICooKGJjbW9sdF8jI29iaiMjX2tleSAqKW1zZ19zZXQtPm5leHRfa2V5KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogKGdldCBhbGwgcHJvcGVydGllcyB0aGF0IHdlcmUgcmVxdWVzdGVkIG9yIGFyZSBiZWluZyBmaWx0ZXJlZCBvbikgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjZmcuaGRyLmhkci5wcmVzZW5jZV9tYXNrID0gbXNnX3NldC0+cHJlc2VuY2VfbWFzayB8IGZpbHRlci0+aGRyLmhkci5wcmVzZW5jZV9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNmZy5oZHIuaGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfR0VUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2ZnLmhkci5oZHIuZGlyID0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjZmcuaGRyLmhkci5lcnIgPSBtaF8jI29iaiMjX2NmZ19nZXQoJmNmZy5oZHIuaGRyLCAmY2ZnLmtleSwgJmNmZy5kYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1IX0VYSVRfSUYoY2ZnLmhkci5oZHIuZXJyICE9IEJDTV9FUlJfT0ssIGNmZy5oZHIuaGRyLmVycik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBwYWNrIHRoZSByZXN1bHRpbmcgbWVzc2FnZSBkYXRhICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxlbiA9IGJjbW9sdF8jI29iaiMjX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKCZjZmcuZGF0YSwgZmlsdGVyLT5oZHIuaGRyLnByZXNlbmNlX21hc2spOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbXNnX3BhY2tlZCA9IGJjbW9zX2NhbGxvYyhsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSF9FWElUX0lGKGxlbiA+IDAgJiYgbXNnX3BhY2tlZCA9PSBOVUxMLCBCQ01fRVJSX05PTUVNKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBsZW4sIG1zZ19wYWNrZWQsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3VjY2VzcyA9IGJjbW9sdF8jI29iaiMjX2NmZ19kYXRhX3BhY2soJmNmZy5kYXRhLCAmYnVmLCBmaWx0ZXItPmhkci5oZHIucHJlc2VuY2VfbWFzayk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSF9FWElUX0lGKCFzdWNjZXNzLCBCQ01fRVJSX0lOVEVSTkFMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogY2hlY2sgdGhlIHBhY2tlZCBtZXNzYWdlIGFnYWluc3QgdGhlIGZpbHRlciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpc19tYXRjaCA9IChtZW1jbXAoZmlsdGVyX3BhY2tlZCwgbXNnX3BhY2tlZCwgbGVuKSA9PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoZmxhZ3MgJiBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04pICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaXNfbWF0Y2ggPSAhaXNfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmNtb3NfZnJlZShtc2dfcGFja2VkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtc2dfcGFja2VkID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGlzX21hdGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAvKiBpZiB0aGVyZSBpcyBhIG1hdGNoLCBpbmNsdWRlIHRoaXMgbWVzc2FnZSBpbiB0aGUgbWVzc2FnZSBzZXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1zZ19zZXQtPm1zZ1ttc2dfc2V0LT5udW1faW5zdGFuY2VzXSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZXJyID0gYmNtb2x0X21zZ19jbG9uZSgmbXNnX3NldC0+bXNnW21zZ19zZXQtPm51bV9pbnN0YW5jZXNdLCAmY2ZnLmhkci5oZHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNSF9FWElUX0lGKGVyciAhPSBCQ01fRVJSX09LLCBlcnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1zZ19zZXQtPm51bV9pbnN0YW5jZXMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogZ2V0IG5leHQga2V5LCBicmVhayBpZiBubyBtb3JlIGtleXMgYXJlIGZvdW5kICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlcnIgPSBtaF8jI29iaiMjX2tleV9pdGVyYXRlKG1zZ19zZXQtPm5leHRfa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1IX0VYSVRfSUYoZXJyICE9IEJDTV9FUlJfT0ssIGVycik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjbGVhbnVwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZmlsdGVyX3BhY2tlZCAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJjbW9zX2ZyZWUoZmlsdGVyX3BhY2tlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChtc2dfcGFja2VkICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmNtb3NfZnJlZShtc2dfcGFja2VkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVyciA9PSBCQ01fRVJSX05PX01PUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlcnIgPSBCQ01fRVJSX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1zZ19zZXQtPm1vcmUgPSBCQ01PU19GQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNlbmRpZiAvKiBfQkNNT0xUX01IX1VUSUxTX0hfICovCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDE2MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL01ha2VmaWxlCkBAIC0wLDAgKzEsMjEgQEAKKyMgTWFwbGUgb2JqZWN0IG1vZGVsCisjCitNT0RfTkFNRSA9IG1vZGVsCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSB1dGlscyBjb21tb25fYXBpCitNT0RfSU5DX0RJUlMgPSAkKE1PREVMX09VVF9ESVIpCitnZW5fc3JjcyA9IGJjbW9sdF9tb2RlbF90eXBlcy5jIGJjbW9sdF9tc2dfcGFjay5jCisKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgIE1PRF9ERVBTICs9IHN5c21vZGVsCitlbmRpZgorCitFWFRSQV9UWVBFUyArPSBwb25fb251X2lkIHBvbl9hbGxvY19pZCBwb25fZ2VtX3BvcnRfaWQgcG9uX2FsbG9jX2luZGV4IHBvbl9nZW1fcG9ydF9pbmRleAorCitpZmVxICgiJChFTkFCTEVfRVBPTikiLCAieSIpCisgICAgRVhUUkFfVFlQRVMgKz0gZW5pIHBvbl9yYXRlIGllZWVfODAyMWFzX3RpbWVfc3luYyAKK2VuZGlmCisKK2lmZXEgKCIkKEVOQUJMRV9HUE9OKSIsICJ5IikKKyAgICBFWFRSQV9UWVBFUyArPSBidXJzdF9wcm9maWxlIG1hY190YWJsZV9pZHhfbWFpbiBtYWNfdGFibGVfaWR4X2NhbSBtYWNfdGFibGVfaWR4X2NvbWJpbmVkCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tb2RlbF9kYXRhLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODNkNGU3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tb2RlbF9kYXRhLmgKQEAgLTAsMCArMSwzODkzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpZm5kZWYgQkNNT0xUX01PREVMX0RBVEFfSF8KKyNkZWZpbmUgQkNNT0xUX01PREVMX0RBVEFfSF8KKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorCisvKiogXGFkZHRvZ3JvdXAgb2JqZWN0X21vZGVsCisgKiBAeworICovCit0eXBlZGVmIHVpbnQzMl90IGJjbW9sdF90aW1lX3F1YW50YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3RpbWVfcXVhbnRhOiB0eXBlZCBhbGlhcyBmb3IgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KK3R5cGVkZWYgdWludDE2X3QgYmNtb2x0X2FlX25pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfYWVfbmk6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfQUVfTklfQUVfTklfSU5WQUxJRCAgKChiY21vbHRfYWVfbmkpIDY1NTM1VSkKK3R5cGVkZWYgdWludDhfdCBiY21vbHRfYWdncmVnYXRpb25fZG9tYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfYWdncmVnYXRpb25fZG9tYWluOiB0eXBlZCBhbGlhcyBmb3IgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordHlwZWRlZiB1aW50MzJfdCBiY21vbHRfYmFuZHdpZHRoX0ticHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9iYW5kd2lkdGhfS2JwczogdHlwZWQgYWxpYXMgZm9yIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuICovCit0eXBlZGVmIHVpbnQzMl90IGJjbW9sdF9iZXJfaW50ZXJ2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2Jlcl9pbnRlcnZhbDogdHlwZWQgYWxpYXMgZm9yIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9CRVJfSU5URVJWQUxfQkVSX0lOVEVSVkFMX05PVF9DT05GSUdVUkVEICgoYmNtb2x0X2Jlcl9pbnRlcnZhbCkgMCkKK3R5cGVkZWYgdWludDhfdCBiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleDogdHlwZWQgYWxpYXMgZm9yIGEgOC1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KK3R5cGVkZWYgdWludDhfdCBiY21vbHRfZGJhX3BvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfZGJhX3BvcnQ6IHR5cGVkIGFsaWFzIGZvciBhIDgtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9EQkFfUE9SVF9DT1VOVCAgICgoYmNtb2x0X2RiYV9wb3J0KSA4KQordHlwZWRlZiB1aW50OF90IGJjbW9sdF9lcG9uX3RvcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9lcG9uX3RvcDogdHlwZWQgYWxpYXMgZm9yIGEgOC1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX0VQT05fVE9QX0NPVU5UICAgKChiY21vbHRfZXBvbl90b3ApIDgpCit0eXBlZGVmIHVpbnQ4X3QgYmNtb2x0X2VwbV9saW1fZ2xvYmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2VwbV9saW1fZ2xvYmFsOiB0eXBlZCBhbGlhcyBmb3IgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfRVBNX0xJTV9HTE9CQUxfQ09VTlQgKChiY21vbHRfZXBtX2xpbV9nbG9iYWwpIDE2KQordHlwZWRlZiB1aW50OF90IGJjbW9sdF94ZzJnX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF94ZzJnX2lkOiB0eXBlZCBhbGlhcyBmb3IgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfZXBvbl9sbGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9lcG9uX2xsaWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfRVBPTl9MTElEX0JST0FEQ0FTVF9MTElEXzEwRyAoKGJjbW9sdF9lcG9uX2xsaWQpIDMyNzY2KQorI2RlZmluZSBCQ01PTFRfRVBPTl9MTElEX0JST0FEQ0FTVF9MTElEXzFHICAoKGJjbW9sdF9lcG9uX2xsaWQpIDMyNzY3KQordHlwZWRlZiB1aW50MzJfdCBiY21vbHRfZXBvbl90dW5uZWxfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9lcG9uX3R1bm5lbF9pZDogdHlwZWQgYWxpYXMgZm9yIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuICovCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9lcG9uX25pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2Vwb25fbmk6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfRVBPTl9OSV9JTlZBTElEICAoKGJjbW9sdF9lcG9uX25pKSA2NTUzNVUpCit0eXBlZGVmIHVpbnQ4X3QgYmNtb2x0X2Vwb25fb251X2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2Vwb25fb251X2lkOiB0eXBlZCBhbGlhcyBmb3IgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfRVBPTl9PTlVfSURfVU5LTk9XTl9PTlUgICgoYmNtb2x0X2Vwb25fb251X2lkKSAyNTUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9mbG93X2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2Zsb3dfaWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfZ3Bvbl9hbGxvY19pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9ncG9uX2FsbG9jX2lkOiB0eXBlZCBhbGlhcyBmb3IgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX0dQT05fQUxMT0NfSURfQU5ZICAgICAgICAoKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSA2NTUzNFUpCisjZGVmaW5lIEJDTU9MVF9HUE9OX0FMTE9DX0lEX0lOVkFMSUQgICAgKChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgNjU1MzVVKQordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfdmxhbl9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF92bGFuX2lkOiB0eXBlZCBhbGlhcyBmb3IgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX1ZMQU5fSURfTUFYICAoKGJjbW9sdF92bGFuX2lkKSA0MDk1KQorI2RlZmluZSBCQ01PTFRfVkxBTl9JRF9BTlkgICgoYmNtb2x0X3ZsYW5faWQpIDY1NTM1VSkKK3R5cGVkZWYgdWludDE2X3QgYmNtb2x0X2dwb25fZ2VtX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfZ3Bvbl9nZW1faWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfR1BPTl9HRU1fSURfQU5ZICAgICAgKChiY21vbHRfZ3Bvbl9nZW1faWQpIDY1NTM0VSkKKyNkZWZpbmUgQkNNT0xUX0dQT05fR0VNX0lEX0lOVkFMSUQgICgoYmNtb2x0X2dwb25fZ2VtX2lkKSA2NTUzNVUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9ncG9uX29udV9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2dwb25fb251X2lkOiB0eXBlZCBhbGlhcyBmb3IgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX0dQT05fT05VX0lEX0FOWSAgICAgICgoYmNtb2x0X2dwb25fb251X2lkKSA2NTUzNFUpCisjZGVmaW5lIEJDTU9MVF9HUE9OX09OVV9JRF9JTlZBTElEICAoKGJjbW9sdF9ncG9uX29udV9pZCkgNjU1MzVVKQordHlwZWRlZiB1aW50OF90IGJjbW9sdF9ncG9uX25pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9ncG9uX25pOiB0eXBlZCBhbGlhcyBmb3IgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfR1BPTl9OSV9JTlZBTElEICAoKGJjbW9sdF9ncG9uX25pKSAyNTUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9wb25fb251X2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3Bvbl9vbnVfaWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfUE9OX09OVV9JRF9JTlZBTElEICAgKChiY21vbHRfcG9uX29udV9pZCkgNjU1MzVVKQordHlwZWRlZiB1aW50OF90IGJjbW9sdF9tYWNfdGFibGVfaWR4X2NhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9tYWNfdGFibGVfaWR4X2NhbTogdHlwZWQgYWxpYXMgZm9yIGEgOC1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX01BQ19UQUJMRV9JRFhfQ0FNX05PTkUgICAoKGJjbW9sdF9tYWNfdGFibGVfaWR4X2NhbSkgMjU1KQordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfbWFjX3RhYmxlX2lkeF9jb21iaW5lZDsgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9tYWNfdGFibGVfaWR4X2NvbWJpbmVkOiB0eXBlZCBhbGlhcyBmb3IgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX01BQ19UQUJMRV9JRFhfQ09NQklORURfTk9ORSAgKChiY21vbHRfbWFjX3RhYmxlX2lkeF9jb21iaW5lZCkgNjU1MzVVKQordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfbWFjX3RhYmxlX2lkeF9tYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9tYWNfdGFibGVfaWR4X21haW46IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfTUFDX1RBQkxFX0lEWF9NQUlOX05PTkUgICgoYmNtb2x0X21hY190YWJsZV9pZHhfbWFpbikgNjU1MzVVKQordHlwZWRlZiB1aW50MzJfdCBiY21vbHRfbWV0ZXJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9tZXRlcnM6IHR5cGVkIGFsaWFzIGZvciBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfcG9uX2FsbG9jX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9wb25fYWxsb2NfaWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfUE9OX0FMTE9DX0lEX0lOVkFMSUQgKChiY21vbHRfcG9uX2FsbG9jX2lkKSA2NTUzNVUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9wb25fYWxsb2NfaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3Bvbl9hbGxvY19pbmRleDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9QT05fQUxMT0NfSU5ERVhfSU5WQUxJRCAgKChiY21vbHRfcG9uX2FsbG9jX2luZGV4KSA2NTUzNVUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9wb25fZ2VtX3BvcnRfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3Bvbl9nZW1fcG9ydF9pZDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9QT05fR0VNX1BPUlRfSURfSU5WQUxJRCAgKChiY21vbHRfcG9uX2dlbV9wb3J0X2lkKSA2NTUzNVUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9wb25fZ2VtX3BvcnRfaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3Bvbl9nZW1fcG9ydF9pbmRleDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9QT05fR0VNX1BPUlRfSU5ERVhfSU5WQUxJRCAgICgoYmNtb2x0X3Bvbl9nZW1fcG9ydF9pbmRleCkgNjU1MzVVKQordHlwZWRlZiB1aW50OF90IGJjbW9sdF9wb25fbmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9wb25fbmk6IHR5cGVkIGFsaWFzIGZvciBhIDgtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9QT05fTklfSU5WQUxJRCAgICgoYmNtb2x0X3Bvbl9uaSkgMjU1KQordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfeGdwb25fYWxsb2NfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF94Z3Bvbl9hbGxvY19pZDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9BTExPQ19JRF9BTlkgICAgICAgKChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDY1NTM0VSkKKyNkZWZpbmUgQkNNT0xUX1hHUE9OX0FMTE9DX0lEX0lOVkFMSUQgICAoKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgNjU1MzVVKQordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfeGdwb25fZ2VtX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF94Z3Bvbl9nZW1faWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfWEdQT05fR0VNX0lEX0FOWSAgICAgKChiY21vbHRfeGdwb25fZ2VtX2lkKSA2NTUzNFUpCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9HRU1fSURfSU5WQUxJRCAoKGJjbW9sdF94Z3Bvbl9nZW1faWQpIDY1NTM1VSkKK3R5cGVkZWYgdWludDhfdCBiY21vbHRfeGdwb25fbmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfeGdwb25fbmk6IHR5cGVkIGFsaWFzIGZvciBhIDgtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9OSV9JTlZBTElEICgoYmNtb2x0X3hncG9uX25pKSAyNTUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF94Z3Bvbl9vbnVfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3hncG9uX29udV9pZDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9PTlVfSURfQU5ZICAgICAoKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIDY1NTM0VSkKKyNkZWZpbmUgQkNNT0xUX1hHUE9OX09OVV9JRF9JTlZBTElEICgoYmNtb2x0X3hncG9uX29udV9pZCkgNjU1MzVVKQorCisvKiogYWN0aXZhdGlvbiBmYWlsIHJlYXNvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX05PTkUgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fUkFOR0lORyAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUmFuZ2luZy4gKi8KKyAgICBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9QQVNTV09SRF9BVVRIRU5USUNBVElPTiAgID0gMiwgICAgLyoqPCBQYXNzd29yZCBhdXRoZW50aWNhdGlvbi4gKi8KKyAgICBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9MT1MgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBMT1MuICovCisgICAgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fT05VX0FMQVJNICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgT05VIEFsYXJtLiAqLworICAgIEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uOworCisvKiogQWRkaXRpb25hbCBCVyBlbGlnaWJpbGl0eS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eQoreworICAgIEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX19CRUdJTiAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX05PTkUgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfTk9OX0FTU1VSRUQgICAgICAgICAgICA9IDEsICAgIC8qKjwgTm9uIEFzc3VyZWQuICovCisgICAgQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfQkVTVF9FRkZPUlQgICAgICAgICAgICA9IDIsICAgIC8qKjwgQmVzdCBFZmZvcnQuICovCisgICAgQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHk7CisKKy8qKiBFbmFibGUgc3RhdGUgb2YgdGhlIEFFIE5JLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9uaV9lbl9zdGF0ZQoreworICAgIEJDTU9MVF9BRV9OSV9FTl9TVEFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BRV9OSV9FTl9TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFFIE5JIGlzIGZ1bGx5IGRpc2FibGVkLiAqLworICAgIEJDTU9MVF9BRV9OSV9FTl9TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEFFIE5JIGlzIGZ1bGx5IGVuYWJsZWQuICovCisgICAgQkNNT0xUX0FFX05JX0VOX1NUQVRFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hZV9uaV9lbl9zdGF0ZTsKKworLyoqIEFsbG9jIG9wZXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9BQ1RJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWN0aXZhdGUuICovCisgICAgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9ERUFDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRGVhY3RpdmF0ZS4gKi8KKyAgICBCQ01PTFRfQUxMT0NfT1BFUkFUSU9OX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FsbG9jX29wZXJhdGlvbjsKKworLyoqIEFsbG9jIFN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hbGxvY19zdGF0ZQoreworICAgIEJDTU9MVF9BTExPQ19TVEFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRCAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vdCBjb25maWd1cmVkLiAqLworICAgIEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEluYWN0aXZlLiAqLworICAgIEJDTU9MVF9BTExPQ19TVEFURV9QUk9DRVNTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFByb2Nlc3NpbmcuICovCisgICAgQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgQWN0aXZlLiAqLworICAgIEJDTU9MVF9BTExPQ19TVEFURV9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hbGxvY19zdGF0ZTsKKworLyoqIEFsbG9jIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FsbG9jX3R5cGUKK3sKKyAgICBCQ01PTFRfQUxMT0NfVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUxMT0NfVFlQRV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBOb25lLiAqLworICAgIEJDTU9MVF9BTExPQ19UWVBFX05TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE5vbiBTdGF0dXMgUmVwb3J0LiAqLworICAgIEJDTU9MVF9BTExPQ19UWVBFX1NSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFN0YXR1cyBSZXBvcnQuICovCisgICAgQkNNT0xUX0FMTE9DX1RZUEVfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FsbG9jX3R5cGU7CisKKy8qKiBBbGxvYyBUeXBlIHRvIHNjYW4gZHVyaW5nIHRoZSByb2d1ZSBvbnUgZGV0ZWN0aW9uIHByb2Nlc3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbgoreworICAgIEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fVU5VU0VEICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFNjYW4gb25seSB0aGUgQWxsb2MtSURzIHRoYXQgaGF2ZSBub3QgYmVlbiB1c2VkLiAqLworICAgIEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fUFJFVklPVVNMWV9VU0VEICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFNjYW4gb25seSB0aGUgQWxsb2MtSURzIHRoYXQgaGFzIGJlZW4gdXNlZCBidXQgY3VycmVudGx5IG5vdCBiZWluZyB1c2VkLiAgVGhpcyBpcyBmb3IgZGV0ZWN0aW5nIHRoZSBjYXNlIHdoZW4gdGhlIE9MVCBoYXMgcmVsZWFzZWQgdGhlIEFsbG9jLCBidXQgdGhlIE9OVSBpcyBzdGlsbCBob2xkaW5nIGl0IGR1ZSB0byBhbiBlcnJvci4gKi8KKyAgICBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBTY2FuIGJvdGggdXNlZCBhbmQgdW51c2VkIEFsbG9jLUlEcy4gKi8KKyAgICBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW47CisKKy8qKiBXaGF0IHRvIGRvIHdoZW4gdGhlIGNhcHR1cmUgYnVmZmVyIGlzIGZ1bGwuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlCit7CisgICAgQkNNT0xUX0FQSV9DQVBUVVJFX0JVRkZFUl9NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0FQSV9DQVBUVVJFX0JVRkZFUl9NT0RFX09WRVJGTE9XICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRHJvcCBtZXNzYWdlcyB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbC4gKi8KKyAgICBCQ01PTFRfQVBJX0NBUFRVUkVfQlVGRkVSX01PREVfV1JBUCAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBXcmFwIGJhY2sgdG8gdGhlIGJlZ2lubmluZyB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbC4gKi8KKyAgICBCQ01PTFRfQVBJX0NBUFRVUkVfQlVGRkVSX01PREVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGU7CisKKy8qKiBXaGVyZSB0byBwZXJmb3JtIHRoZSBBUEkgY2FwdHVyZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24KK3sKKyAgICBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fREVWSUNFICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBPbiB0aGUgZGV2aWNlLiAqLworICAgIEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9IT1NUICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE9uIHRoZSBob3N0LiAqLworICAgIEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uOworCisvKiogQ2FsaWJyYXRpb24gUmVjb3JkLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQKK3sKKyAgICBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX1VOU1BFQ0lGSUVEICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBVbnNwZWNpZmllZC4gKi8KKyAgICBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX1VOQ0FMSUJSQVRFRCAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBVbmNhbGlicmF0ZWQuICovCisgICAgQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9MT09TRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgTG9vc2UuICovCisgICAgQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9TVUZGSUNJRU5UICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU3VmZmljaWVudC4gKi8KKyAgICBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQ7CisKKy8qKiBzaWduLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zaWduCit7CisgICAgQkNNT0xUX1NJR05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NJR05fUE9TSVRJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUG9zaXRpdmUuICovCisgICAgQkNNT0xUX1NJR05fTkVHQVRJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTmVnYXRpdmUuICovCisgICAgQkNNT0xUX1NJR05fX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9zaWduOworCisvKiogWEdQT04gbmkgdXBzdHJlYW0gbGluZSByYXRlIGNhcGFiaWxpdGllcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzCit7CisgICAgQkNNT0xUX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVNfX0JFR0lOICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVNfUkFURV8yX1BfNV9HICAgICA9IDAsICAgIC8qKjwgMi41RyBVcHN0cmVhbSBsaW5lIHJhdGUgY2FwYWJpbGl0eSAqLworICAgIEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMTBfRyAgICAgICAgPSAxLCAgICAvKio8IDEwRyBVcHN0cmVhbSBsaW5lIHJhdGUgY2FwYWJpbGl0eSAqLworICAgIEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX19OVU1fT0YgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzOworCisvKiogTGluayB0eXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9saW5rX3R5cGUKK3sKKyAgICBCQ01PTFRfTElOS19UWVBFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTElOS19UWVBFX1VOU1BFQ0lGSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBMaW5rIHR5cGUgdW5zcGVjaWZpZWQgKi8KKyAgICBCQ01PTFRfTElOS19UWVBFX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaW5rIHR5cGUgQSBpcyBub3Qgc3VwcG9ydGVkLCBsaW5rIHR5cGUgQiBpcyBzdXBwb3J0ZWQgKi8KKyAgICBCQ01PTFRfTElOS19UWVBFX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBMaW5rIHR5cGUgQSBpcyBzdXBwb3J0ZWQsIGxpbmsgdHlwZSBCIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBCQ01PTFRfTElOS19UWVBFX0FfQU5EX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBCb3RoIGxpbmsgdHlwZXMgQSBhbmQgQiBhcmUgc3VwcG9ydGVkICovCisgICAgQkNNT0xUX0xJTktfVFlQRV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xpbmtfdHlwZTsKKworLyoqIGNhcHR1cmUgc3Ryb2JlIHNpZ25hbC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsCit7CisgICAgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9HUE9OX0JDRFJfUkVTRVQgICAgICAgICAgICA9IDAsICAgIC8qKjwgZ3BvbiBiY2RyIHJlc2V0LiAqLworICAgIEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfR1BPTl9UUlhfRUQgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGdwb24gdHJ4IGVkLiAqLworICAgIEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfR1BPTl9SU1NJICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGdwb24gcnNzaS4gKi8KKyAgICBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX0dQT05fRU9CICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBncG9uIGVvYi4gKi8KKyAgICBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX1NFUkRFU19CVVJTVF9FTiAgICAgICAgICAgID0gNCwgICAgLyoqPCBzZXJkZXMgYnVyc3QgZW4uICovCisgICAgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9TRVJERVNfUlhfTE9DSyAgICAgICAgICAgICA9IDUsICAgIC8qKjwgc2VyZGVzIHJ4IGxvY2suICovCisgICAgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbDsKKworLyoqIENvbnNvbGUgUmVkaXJlY3Rpb24gVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbgoreworICAgIEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vIHJlZGlyZWN0aW9uICovCisgICAgQkNNT0xUX0NPTlNPTEVfUkVESVJFQ1RJT05fUkVESVJFQ1QgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRW1iZWRkZWQgY29uc29sZSBvdXRwdXQgaXMgcmVkaXJlY3RlZCB0byB0aGUgaG9zdCAqLworICAgIEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX0NMT05FICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEVtYmVkZGVkIGNvbnNvbGUgb3V0cHV0IGlzIGNsb25lZCB0byB0aGUgaG9zdCAqLworICAgIEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb247CisKKy8qKiBjb250cm9sIHN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9jb250cm9sX3N0YXRlCit7CisgICAgQkNNT0xUX0NPTlRST0xfU1RBVEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRW5hYmxlZC4gKi8KKyAgICBCQ01PTFRfQ09OVFJPTF9TVEFURV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2NvbnRyb2xfc3RhdGU7CisKKy8qKiBkYmEgbW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGJhX21vZGUKK3sKKyAgICBCQ01PTFRfREJBX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREJBX01PREVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBub3JtYWwuICovCisgICAgQkNNT0xUX0RCQV9NT0RFX0VYVEVOREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgZXh0ZW5kZWQuICovCisgICAgQkNNT0xUX0RCQV9NT0RFX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGJhX21vZGU7CisKKy8qKiBEQkEgUkFNLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kYmFfcmFtCit7CisgICAgQkNNT0xUX0RCQV9SQU1fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fMCAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgR3JhbnQgRklGTyBSQU0gMC4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV8xICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBHcmFudCBGSUZPIFJBTSAxLiAqLworICAgIEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzIgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEdyYW50IEZJRk8gUkFNIDIuICovCisgICAgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fMyAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgR3JhbnQgRklGTyBSQU0gMy4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV80ICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBHcmFudCBGSUZPIFJBTSA0LiAqLworICAgIEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzUgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEdyYW50IEZJRk8gUkFNIDUuICovCisgICAgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fNiAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgR3JhbnQgRklGTyBSQU0gNi4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV83ICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBHcmFudCBGSUZPIFJBTSA3LiAqLworICAgIEJDTU9MVF9EQkFfUkFNX0dSQU5UU19PVVRfUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEdyYW50cyBPdXQgUkFNLiAqLworICAgIEJDTU9MVF9EQkFfUkFNX0dSQU5UU19JTl9SQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IEdyYW50cyBJbiBSQU0uICovCisgICAgQkNNT0xUX0RCQV9SQU1fR1JBTlRTX1JFVElSRURfUkFNICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgR3JhbnRzIFJldGlyZWQgUkFNLiAqLworICAgIEJDTU9MVF9EQkFfUkFNX1JFUE9SVF9SQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IFJlcG9ydCBSQU0uICovCisgICAgQkNNT0xUX0RCQV9SQU1fR1JBTlRfQ0ZHX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgR3JhbnQgQ2ZnIFJBTS4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9ERUZBVUxUX1RPS0VOU19SQU0gICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBEZWZhdWx0IFRva2VucyBSQU0uICovCisgICAgQkNNT0xUX0RCQV9SQU1fUE9MTF9SRUNPUkRTX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgUG9sbCBSZWNvcmRzIFJBTS4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9IRUlSX1BPTExfUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBIZWlyIFBvbGwgUkFNLiAqLworICAgIEJDTU9MVF9EQkFfUkFNX0xBU1RfUE9MTF9USU1FX1JBTSAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IExhc3QgUG9sbCBUaW1lIFJBTS4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9QT0xMX09SREVSX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBQb2xsIE9yZGVyIFJBTS4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBURE0gUkFNIDAuICovCisgICAgQkNNT0xUX0RCQV9SQU1fVERNX1JBTV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgVERNIFJBTSAxLiAqLworICAgIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IFRETSBSQU0gMi4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBURE0gUkFNIDMuICovCisgICAgQkNNT0xUX0RCQV9SQU1fVERNX1JBTV80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgVERNIFJBTSA0LiAqLworICAgIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IFRETSBSQU0gNS4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgLyoqPCBURE0gUkFNIDYuICovCisgICAgQkNNT0xUX0RCQV9SQU1fVERNX1JBTV83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qKjwgVERNIFJBTSA3LiAqLworICAgIEJDTU9MVF9EQkFfUkFNX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RiYV9yYW07CisKKy8qKiBEQkEgdHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGJhX3R5cGUKK3sKKyAgICBCQ01PTFRfREJBX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREJBX1RZUEVfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEQkEgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKi8KKyAgICBCQ01PTFRfREJBX1RZUEVfUEFSVElBTF9FWFRFUk5BTCAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBEQkEgcGFydGlhbCBleHRlcm5hbCBpbXBsZW1lbnRhdGlvbiAoREUsIEJBIGFyZSBpbXBsZW1lbnRlZCBleHRlcm5hbGx5KSAqLworICAgIEJDTU9MVF9EQkFfVFlQRV9FWFRFUk5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERCQSBleHRlcm5hbCBpbXBsZW1lbnRhdGlvbiAgKi8KKyAgICBCQ01PTFRfREJBX1RZUEVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kYmFfdHlwZTsKKworLyoqIEREUiBUZXN0IFN0YXR1cy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzCit7CisgICAgQkNNT0xUX0REUl9URVNUX1NUQVRVU19fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIEREUiB0ZXN0IHJhbiB0byBjb21wbGV0aW9uICovCisgICAgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT05ORUNUSU9OX0ZBSUxFRCAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVGhlIEREUiB0ZXN0IGZhaWxlZCBkdWUgdG8gYW4gaXNzdWUgbG9hZGluZyB0aGUgYm9vdGxvYWRlciAqLworICAgIEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFRoZSBERFIgdGVzdCBmYWlsZWQgdG8gY29tcGxldGUgd2l0aGluIHRoZSBleHBlY3RlZCB0aW1lICovCisgICAgQkNNT0xUX0REUl9URVNUX1NUQVRVU19fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZHJfdGVzdF9zdGF0dXM7CisKKy8qKiBERFIgVGVzdCBSZXN1bHQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdAoreworICAgIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBTdWNjZXNzLiAqLworICAgIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfUEhZX0lOSVRfRVJST1IgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBQSFkgSW5pdCBFcnJvci4gKi8KKyAgICBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX0RSQU1fSU5JVF9FUlJPUiAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgRFJBTSBJbml0IEVycm9yLiAqLworICAgIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU0hNT09fRVJST1IgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBTSE1PTyBFcnJvci4gKi8KKyAgICBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX0VESVNfVEVTVF9FUlJPUiAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgIC8qKjwgRURJUyBUZXN0IEVycm9yLiAqLworICAgIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfTUVNX1RFU1RfRVJST1IgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCBNZW0gVGVzdCBFcnJvci4gKi8KKyAgICBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX05PVF9URVNURUQgICAgICAgICAgICAgICAgICAgICAgID0gMTI3ICAgICAgIC8qKjwgTm90IFRlc3RlZC4gKi8KK30gYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdDsKKworLyoqIFJlYXNvbnMgd2h5IHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIGhvc3QgYW5kIHRoZSBkZXZpY2UgZmFpbGVkIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fX0JFR0lOICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIGNvbm5lY3Rpb24gcHJvY2VzcyBoYXMgdGltZWQgb3V0LiAqLworICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fS0VFUEFMSVZFICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUb28gbXVjaCB0aW1lIGhhcyBwYXNzZWQgYmV0d2VlbiBrZWVwYWxpdmUgbWVzc2FnZXMgZnJvbSB0aGUgZGV2aWNlLiAqLworICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVVNFUl9DQUxMQkFDS19FUlJPUiAgICAgID0gMiwgICAgLyoqPCBBIHVzZXIgY2FsbGJhY2sgcmV0dXJuZWQgYSBub256ZXJvIGVycm9yIGNvZGUuICBDaGVjayBsb2cgb3V0cHV0IHRvIGRldGVybWluZSB3aGljaCBjYWxsYmFjayBmYWlsZWQuICovCisgICAgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TT0ZUV0FSRV9WRVJTSU9OX01JU01BVENIPSAzLCAgICAvKio8IFRoZSBzb2Z0d2FyZSB2ZXJzaW9uIG9uIHRoZSBydW5uaW5nIGRldmljZSBkb2Vzbid0IG1hdGNoIHRoZSB2ZXJzaW9uIGluIHRoZSBob3N0IHNvZnR3YXJlLiAgT25seSB0aGUgcmV2aXNpb24gbnVtYmVyIGlzIGFsbG93ZWQgdG8gZGlmZmVyIC0gbWFqb3IvbWlub3IvbW9kZWwgbXVzdCBtYXRjaC4gKi8KKyAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NZU1RFTV9NT0RFX01JU01BVENIICAgICA9IDQsICAgIC8qKjwgVGhlIHN5c3RlbSBtb2RlIG9uIHRoZSBydW5uaW5nIGRldmljZSBkb2Vzbid0IG1hdGNoIHRoZSB2ZXJzaW9uIGluIHRoZSBob3N0IHNvZnR3YXJlLiAqLworICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fTk5JX1NQRUVEX01JU01BVENIICAgICAgID0gNSwgICAgLyoqPCBUaGUgTk5JIHNwZWVkIG9uIHRoZSBydW5uaW5nIGRldmljZSBkb2Vzbid0IG1hdGNoIHRoZSB2ZXJzaW9uIGluIHRoZSBob3N0IHNvZnR3YXJlLiAqLworICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fUkVDT05ORUNUX1RJTUVPVVQgICAgICAgID0gNiwgICAgLyoqPCBBIHJ1bm5pbmcgZGV2aWNlIGRpZG4ndCByZXNwb25kIHRvIHRoZSByZXF1ZXN0IHRvIHJlY29ubmVjdC4gKi8KKyAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0lOVEVSTkFMX0VSUk9SICAgICAgICAgICA9IDcsICAgIC8qKjwgQW4gdW5zcGVjaWZpZWQgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgLSBjaGVjayB0aGUgbG9nIG91dHB1dCBmb3IgZGV0YWlscy4gKi8KKyAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NZU1RFTV9NT0RFX05PVF9TVVBQT1JURUQ9IDgsICAgIC8qKjwgVGhlIGdpdmVuIHN5c3RlbSBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuICovCisgICAgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9QQVJBTUVURVIgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IE9uZSBvZiB0aGUgaW5pdGlhbCBjb25uZWN0aW9uIHBhcmFtZXRlcnMgd2FzIGluY29ycmVjdC4gKi8KKyAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbjsKKworLyoqIGRlYWN0aXZhdGlvbiByZWFzb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24KK3sKKyAgICBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vbmUuICovCisgICAgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fREVBQ1RJVkFUSU9OICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGRlYWN0aXZhdGlvbi4gKi8KKyAgICBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9BQ0tfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgYWNrIHRpbWVvdXQuICovCisgICAgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fU0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IHNmaSBhbGFybS4gKi8KKyAgICBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9USVdJICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgdGl3aS4gKi8KKyAgICBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9QQVNTV09SRF9BVVRIRU5USUNBVElPTiAgICAgICAgICA9IDUsICAgIC8qKjwgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uICovCisgICAgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fT05VX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IG9udSBhbGFybS4gKi8KKyAgICBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9MT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgbG9zLiAqLworICAgIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0xPS0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBsb2tpLiAqLworICAgIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1JFUkFOR0VfRkFJTFVSRSAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCByZS1yYW5nZSBmYWlsdXJlLiAqLworICAgIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb247CisKKy8qKiBSZXZpc2lvbiBvZiB0aGUgQkNNNjg2MjAgZGV2aWNlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbgoreworICAgIEJDTU9MVF9ERVZJQ0VfQ0hJUF9SRVZJU0lPTl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgLyoqPCBBMC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NISVBfUkVWSVNJT05fQjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NiAgIC8qKjwgQjAuICovCit9IGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbjsKKworLyoqIERldmljZSBJbWFnZSBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZQoreworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQk9PVExPQURFUiAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQm9vdGxvYWRlci4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04gICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQXBwbGljYXRpb24uICovCisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0lUVV9QT05fT05VX0ZJUk1XQVJFICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IElUVSBQT04gT05VIGZpcm13YXJlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9FUE9OX09OVV9GSVJNV0FSRSAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBFUE9OIE9OVSBmaXJtd2FyZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZTsKKworLyoqIE5ldHdvcmsgaW50ZXJmYWNlIHNwZWVkIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9zcGVlZAoreworICAgIEJDTU9MVF9OTklfU1BFRURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgMUdicHMgKi8KKyAgICBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMlA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgMi41R2JwcyAqLworICAgIEJDTU9MVF9OTklfU1BFRURfR0JQU18xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCAxMEdicHMgKi8KKyAgICBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTJQNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgMTIuNUdicHMgKi8KKyAgICBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTBfR19NVVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgMTBHYnBzIE11eCAqLworICAgIEJDTU9MVF9OTklfU1BFRURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc3BlZWQ7CisKKy8qKiBPcHRpb25zIGZvciB0aGUgcmVzZXQgb3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZQoreworICAgIEJDTU9MVF9ERVZJQ0VfUkVTRVRfTU9ERV9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUdXJuIG9mZiB0aGUgZW1iZWRkZWQgZGV2aWNlJ3MgcHJvY2Vzc29yLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfUkVTRVRfTU9ERV9IT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBSZXNldCB0aGUgaG9zdCBwcm9jZXNzb3IuICovCisgICAgQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAvKio8IFR1cm4gb2ZmIHRoZSBlbWJlZGRlZCBkZXZpY2UncyBwcm9jZXNzb3IgYW5kIHJlc2V0IHRoZSBob3N0IHByb2Nlc3Nvci4gKi8KK30gYmNtb2x0X2RldmljZV9yZXNldF9tb2RlOworCisvKiogVGhlIG92ZXJhbGwgc3RhdGUgb2YgdGhlIGhvc3QncyBjb25uZWN0aW9uIHRvIHRoZSBkZXZpY2UuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9zdGF0ZQoreworICAgIEJDTU9MVF9ERVZJQ0VfU1RBVEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIGhvc3QgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUgZGV2aWNlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfU1RBVEVfQ09OTkVDVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUaGUgaG9zdCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIHRvIHRoZSBkZXZpY2UuICovCisgICAgQkNNT0xUX0RFVklDRV9TVEFURV9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHRoZSBob3N0IGFuZCBpcyByZWFkeSB0byBhY2NlcHQgYW55IGNvbW1hbmQgZnJvbSB0aGUgaG9zdC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1NUQVRFX1dBSVRJTkdfRk9SX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgV2FpdGluZyBmb3IgdGhlIGVtYmVkZGVkIHNpZGUgdG8gcmVzcG9uZCB0byBhIGNvbmZpZ3VyYXRpb24gbWVzc2FnZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1NUQVRFX1RFU1RJTkdfRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgQSBERFIgdGVzdCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKi8KKyAgICBCQ01PTFRfREVWSUNFX1NUQVRFX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX3N0YXRlOworCisvKiogRGlzYWJsZSBTZXJpYWwgTnVtYmVyIENvbnRyb2wuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sCit7CisgICAgQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX19CRUdJTiAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9VTklDQVNUX0RJU0FCTEUgICAgICAgID0gMCwgICAgLyoqPCBVbmljYXN0IERpc2FibGUuICovCisgICAgQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX1VOSUNBU1RfRU5BQkxFICAgICAgICAgPSAxLCAgICAvKio8IFVuaWNhc3QgRW5hYmxlLiAqLworICAgIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9CUk9BRENBU1RfRU5BQkxFICAgICAgID0gMiwgICAgLyoqPCBCcm9hZGNhc3QgRW5hYmxlLiAqLworICAgIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9CUk9BRENBU1RfRElTQUJMRSAgICAgID0gMywgICAgLyoqPCBCcm9hZGNhc3QgRGlzYWJsZS4gKi8KKyAgICBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfRElTQUJMRV9ESVNDT1ZFUlkgICAgICA9IDQsICAgIC8qKjwgRGlzYWJsZSBEaXNjb3ZlcnkuICovCisgICAgQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbDsKKworLyoqIGRydl9pY2ZfaWQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Rydl9pY2ZfaWQKK3sKKyAgICBCQ01PTFRfRFJWX0lDRl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RSVl9JQ0ZfSURfSURYMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IElEWDAuICovCisgICAgQkNNT0xUX0RSVl9JQ0ZfSURfSURYMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IElEWDEuICovCisgICAgQkNNT0xUX0RSVl9JQ0ZfSURfSURYMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IElEWDIuICovCisgICAgQkNNT0xUX0RSVl9JQ0ZfSURfSURYMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IElEWDMuICovCisgICAgQkNNT0xUX0RSVl9JQ0ZfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Rydl9pY2ZfaWQ7CisKKy8qKiBkcnZfc2diX2lkLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kcnZfc2diX2lkCit7CisgICAgQkNNT0xUX0RSVl9TR0JfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9EUlZfU0dCX0lEX0lEWDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBJRFgwLiAqLworICAgIEJDTU9MVF9EUlZfU0dCX0lEX0lEWDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBJRFgxLiAqLworICAgIEJDTU9MVF9EUlZfU0dCX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kcnZfc2diX2lkOworCisvKiogRFMgVkxBTiBhY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RzX3ZsYW5fYWN0aW9uCit7CisgICAgQkNNT0xUX0RTX1ZMQU5fQUNUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9EU19WTEFOX0FDVElPTl9SRU1PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZW1vdmUuICovCisgICAgQkNNT0xUX0RTX1ZMQU5fQUNUSU9OX1RSQU5TUEFSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFRyYW5zcGFyZW50LiAqLworICAgIEJDTU9MVF9EU19WTEFOX0FDVElPTl9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZHNfdmxhbl9hY3Rpb247CisKKy8qKiBURkIgVHJhcCBCZWhhdmlvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3IKK3sKKyAgICBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IERyb3AuICovCisgICAgQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0ZPUldBUkRfTk5JICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZvcndhcmQgTk5JLiAqLworICAgIEJDTU9MVF9URkJfVFJBUF9CRUhBVklPUl9GT1JXQVJEX0NQVSAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBGb3J3YXJkIENQVS4gKi8KKyAgICBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfU05PT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU25vb3AuICovCisgICAgQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3I7CisKKy8qKiBURkIgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdGZiX21vZGUKK3sKKyAgICBCQ01PTFRfVEZCX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1RGQl9NT0RFX0dQT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEdQT04uICovCisgICAgQkNNT0xUX1RGQl9NT0RFX1hHUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFhHUE9OLiAqLworICAgIEJDTU9MVF9URkJfTU9ERV9FUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBFUE9OLiAqLworICAgIEJDTU9MVF9URkJfTU9ERV9YRVBPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBYRVBPTi4gKi8KKyAgICBCQ01PTFRfVEZCX01PREVfQ09FWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgQ09FWC4gKi8KKyAgICBCQ01PTFRfVEZCX01PREVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90ZmJfbW9kZTsKKworLyoqIExJTSBTRUMgTW9kZSBVcC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbGltX3NlY19tb2RlX3VwCit7CisgICAgQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MSU1fU0VDX01PREVfVVBfVEVLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBUZWtub3Z1cyBlbmNyeXB0aW9uIG1vZGUgKi8KKyAgICBCQ01PTFRfTElNX1NFQ19NT0RFX1VQX1BFUl9MTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRW5jcnlwdGlvbiBwZXIgTExJRCwgODAyLjFhZS96ZXJvLW92ZXJoZWFkICovCisgICAgQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9OVFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEVQT04gKE5UVCkgZW5jcnlwdGlvbiBtb2RlICovCisgICAgQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9saW1fc2VjX21vZGVfdXA7CisKKy8qKiBMSU0gU0VDIE1vZGUgRG4uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xpbV9zZWNfbW9kZV9kbgoreworICAgIEJDTU9MVF9MSU1fU0VDX01PREVfRE5fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX1RFSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGVrbm92dXMgZW5jcnlwdGlvbiBtb2RlICovCisgICAgQkNNT0xUX0xJTV9TRUNfTU9ERV9ETl9QRVJfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEVuY3J5cHRpb24gcGVyIExMSUQsIDgwMi4xYWUvemVyby1vdmVyaGVhZCAqLworICAgIEJDTU9MVF9MSU1fU0VDX01PREVfRE5fTlRUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBFUE9OIChOVFQpIGVuY3J5cHRpb24gbW9kZSAqLworICAgIEJDTU9MVF9MSU1fU0VDX01PREVfRE5fQ0VQT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBDRVBPTiAoM0NodXJuKSBlbmNyeXB0aW9uIG1vZGUgKi8KKyAgICBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xpbV9zZWNfbW9kZV9kbjsKKworLyoqIFhJTSBTRUMgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGltX3NlY19tb2RlCit7CisgICAgQkNNT0xUX1hJTV9TRUNfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YSU1fU0VDX01PREVfUkVTRVJWRURfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZXNlcnZlZCAwLiAqLworICAgIEJDTU9MVF9YSU1fU0VDX01PREVfUEVSX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQZXIgTExJRC4gKi8KKyAgICBCQ01PTFRfWElNX1NFQ19NT0RFX1JFU0VSVkVEXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmVzZXJ2ZWQgMi4gKi8KKyAgICBCQ01PTFRfWElNX1NFQ19NT0RFX0NFUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgQ0VQT04uICovCisgICAgQkNNT0xUX1hJTV9TRUNfTU9ERV9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hpbV9zZWNfbW9kZTsKKworLyoqIEhTQyBSQU0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2hzY19yYW0KK3sKKyAgICBCQ01PTFRfSFNDX1JBTV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0hTQ19SQU1fTExDX1QxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IExMQyBUMS4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9MTENfVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTExDIFQyLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX0xMQ19UMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBMTEMgVDMuICovCisgICAgQkNNT0xUX0hTQ19SQU1fR1JQX1QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEdycCBUMi4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9HUlBfVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgR3JwIFQzLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX1NIUF9UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBTaHAgVDEuICovCisgICAgQkNNT0xUX0hTQ19SQU1fU0hQX1QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFNocCBUMi4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9TSFBfVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgU2hwIFQzLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX1BSRl9UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBQcmYgVDEuICovCisgICAgQkNNT0xUX0hTQ19SQU1fUFJGX1QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IFByZiBUMi4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9QUkZfVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgUHJmIFQzLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX0NSRV9UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBDcmUgVDEuICovCisgICAgQkNNT0xUX0hTQ19SQU1fQ1JFX1QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IENyZSBUMi4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9DUkVfVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgQ3JlIFQzLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX0VMVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBFTFUuICovCisgICAgQkNNT0xUX0hTQ19SQU1fUFRSX1QxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IFB0ciBUMS4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9QVFJfVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgUHRyIFQyLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX0FHUl9TSFBfVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBBZ3IgU2hwIFQxLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX0FFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBBRU0uICovCisgICAgQkNNT0xUX0hTQ19SQU1fQUxMX0xMQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IEFsbCBMTEMuICovCisgICAgQkNNT0xUX0hTQ19SQU1fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfaHNjX3JhbTsKKworLyoqIExJTSBSQU0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xpbV9yYW0KK3sKKyAgICBCQ01PTFRfTElNX1JBTV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0xJTV9SQU1fTExJRF9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IExMSUQgVXAuICovCisgICAgQkNNT0xUX0xJTV9SQU1fUEVSX09OVV9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFBlciBPTlUgU3RhdC4gKi8KKyAgICBCQ01PTFRfTElNX1JBTV9GRUNfVVBfRlVMTF9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgRkVDIFVwIEZ1bGwgUy4gKi8KKyAgICBCQ01PTFRfTElNX1JBTV9GRUNfVVBfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRkVDIFVwIERhdGEuICovCisgICAgQkNNT0xUX0xJTV9SQU1fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbGltX3JhbTsKKworLyoqIExLWSBSQU0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xreV9yYW0KK3sKKyAgICBCQ01PTFRfTEtZX1JBTV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0xLWV9SQU1fVFhfS0VZX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFR4IEtleSBSQU0uICovCisgICAgQkNNT0xUX0xLWV9SQU1fVFhfS0VZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFR4IEtleSBCdWZmZXIuICovCisgICAgQkNNT0xUX0xLWV9SQU1fUlhfS0VZX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFJ4IEtleSBSQU0uICovCisgICAgQkNNT0xUX0xLWV9SQU1fUlhfS0VZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJ4IEtleSBCdWZmZXIuICovCisgICAgQkNNT0xUX0xLWV9SQU1fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbGt5X3JhbTsKKworLyoqIE1JQyBSQU0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21pY19yYW0KK3sKKyAgICBCQ01PTFRfTUlDX1JBTV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX01JQ19SQU1fUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJhbmdlLiAqLworICAgIEJDTU9MVF9NSUNfUkFNX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMTElELiAqLworICAgIEJDTU9MVF9NSUNfUkFNX0lEWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBJbmRleC4gKi8KKyAgICBCQ01PTFRfTUlDX1JBTV9HUkFOVF9NSVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgR3JhbnQgTWlzcy4gKi8KKyAgICBCQ01PTFRfTUlDX1JBTV9HUkFOVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgR3JhbnQgSUQuICovCisgICAgQkNNT0xUX01JQ19SQU1fVFhfSVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFR4IElWLiAqLworICAgIEJDTU9MVF9NSUNfUkFNX1JYX0lWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBSeCBJVi4gKi8KKyAgICBCQ01PTFRfTUlDX1JBTV9UWF9QT1JUX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgVHggUG9ydCBTdGF0LiAqLworICAgIEJDTU9MVF9NSUNfUkFNX1JYX1BPUlRfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBSeCBQb3J0IFN0YXQuICovCisgICAgQkNNT0xUX01JQ19SQU1fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbWljX3JhbTsKKworLyoqIFhQQ1NSTSBSQU0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hwY3NybV9yYW0KK3sKKyAgICBCQ01PTFRfWFBDU1JNX1JBTV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hQQ1NSTV9SQU1fQ0FQVFVSRV9GSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENhcHR1cmUgRklGTy4gKi8KKyAgICBCQ01PTFRfWFBDU1JNX1JBTV9GRUNfREVDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRkVDIERlY29kZS4gKi8KKyAgICBCQ01PTFRfWFBDU1JNX1JBTV9GRUNfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgRkVDIFN0YXRzLiAqLworICAgIEJDTU9MVF9YUENTUk1fUkFNX0ZFQ19FTlFVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBGRUMgRW5xdWV1ZS4gKi8KKyAgICBCQ01PTFRfWFBDU1JNX1JBTV9JRExFX0lOU0VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgSWRsZSBJbnNlcnQuICovCisgICAgQkNNT0xUX1hQQ1NSTV9SQU1fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hwY3NybV9yYW07CisKKy8qKiBlbWJlZGRlZCBpbWFnZSB0cmFuc2ZlciBzdGF0dXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1cworeworICAgIEJDTU9MVF9FTUJFRERFRF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfX0JFR0lOICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRU1CRURERURfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX05PTkUgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTm8gZmlsZS4gIFRyYW5zZmVyIGhhcyBuZXZlciBzdGFydGVkIGZvciB0aGlzIGVudHJ5LiAqLworICAgIEJDTU9MVF9FTUJFRERFRF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5fUFJPR1JFU1MgICAgICAgICAgID0gMSwgICAgLyoqPCBUcmFuc2ZlciBoYXMgc3RhcnRlZCBhbmQgbm90IGZpbmlzaGVkLiAqLworICAgIEJDTU9MVF9FTUJFRERFRF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBUcmFuc2ZlciBoYXMgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LiAqLworICAgIEJDTU9MVF9FTUJFRERFRF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfRkFJTFVSRSAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBUcmFuc2ZlciBmYWlsZWQuICBUeXBpY2FsbHkgZHVlIHRvIENSQyBlcnJvci4gKi8KKyAgICBCQ01PTFRfRU1CRURERURfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1czsKKworLyoqIEVQT04gRW5jcnlwdGlvbiBpbmZvcm1hdGlvbiBmb3JtYXQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQKK3sKKyAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9fQkVHSU4gICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENGQi4gKi8KKyAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFIgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQ1RSLiAqLworICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX19OVU1fT0YgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdDsKKworLyoqIGVuZXJneSBkZXRlY3Qgc291cmNlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZQoreworICAgIEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgaW50ZXJuYWwuICovCisgICAgQkNNT0xUX0VORVJHWV9ERVRFQ1RfU09VUkNFX1RSWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFRSWC4gKi8KKyAgICBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfQkNEUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQkNEUi4gKi8KKyAgICBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZTsKKworLyoqIEVQT04gdHVyYm8gbW9kZS4gIEVuYWJsZXMgZG91YmxlIGRvd25zdHJlYW0gc3BlZWQgKDJHKSBvbiAxRyBFUE9OIE5JcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl8xR19UVVJCT19NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fMUdfVFVSQk9fTU9ERV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFR1cmJvIG1vZGUgaXMgZGlzYWJsZWQgLSBFUE9OIE5JIGhhcyBhIGRvd3N0cmVhbSBkYXRhIHJhdGUgb2YgMUcuICovCisgICAgQkNNT0xUX0VQT05fMUdfVFVSQk9fTU9ERV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFR1cmJvIG1vZGUgaXMgZW5hYmxlZCAtIEVQT04gTkkgaGFzIGEgZG93c3RyZWFtIGRhdGEgcmF0ZSBvZiAyRy4gKi8KKyAgICBCQ01PTFRfRVBPTl8xR19UVVJCT19NT0RFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGU7CisKKy8qKiBFUE9OIENsb2NrIFRyYW5zcG9ydCBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9NT0RFX0hPU1RfRFJJVkVOICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBdCBlYWNoIHB1bHNlLCB0aGUgTWFwbGUgd2lsbCBpc3N1ZSBhbiBpbmRpY2F0aW9uIHRvIHRoZSBob3N0IGNvbnRhaW5pbmcgdGhlIGVxdWl2YWxlbnQgTVBDUCB0aW1lIGZvciB0aGlzIFBPTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9DTE9DS19UUkFOU1BPUlRfTU9ERV9FTUJFRERFRF9EUklWRU4gICAgICAgICAgICA9IDEsICAgIC8qKjwgQXQgZWFjaCBwdWxzZSwgdGhlIE1hcGxlIHdpbGwgcGFyc2UgdGhlIFRvRCBmcm9tIHRoZSBzZWNvbmQgVUFSVCAoaWYgYXZhaWxhYmxlKSBhbmQgdGhlbiBmb3JtYXQgYW5kIHNlbmQgZG93biBhbiBJRUVFIDgwMi4xYXMgY2xvY2sgdHJhbnNwb3J0IHRpbWUgc3luYyBtZXNzYWdlIHRvIGVhY2ggdXNlciBsaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9NT0RFX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZTsKKworLyoqIENvbnRyb2wgZm9yIGhvdyB0aGUgREJBIGhhbmRsZXMgcmVjZWl2ZWQgTVBDUCByZXBvcnQgZnJhbWVzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX0RCQV9SRVBPUlRJTkdfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9EQkFfUkVQT1JUSU5HX01PREVfU0lFUE9OX0EgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgSGFuZGxlIHJlcG9ydHMgYXMgc3BlY2lmaWVkIGJ5IFNJRVBPTiBwYWNrYWdlIEEuICovCisgICAgQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9CICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEhhbmRsZSByZXBvcnRzIGFzIHNwZWNpZmllZCBieSBTSUVQT04gcGFja2FnZSBCLiAqLworICAgIEJDTU9MVF9FUE9OX0RCQV9SRVBPUlRJTkdfTU9ERV9TSUVQT05fQyAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBIYW5kbGUgcmVwb3J0cyBhcyBzcGVjaWZpZWQgYnkgU0lFUE9OIHBhY2thZ2UgQyAqLworICAgIEJDTU9MVF9FUE9OX0RCQV9SRVBPUlRJTkdfTU9ERV9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZTsKKworLyoqIEVQT04gbGluayByYXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZQoreworICAgIEJDTU9MVF9FUE9OX0xJTktfUkFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGVuX1Rlbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVGVuX09uZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfT05FX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgT25lX09uZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19yYXRlOworCisvKiogU3RhdHVzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zdGF0dXMKK3sKKyAgICBCQ01PTFRfU1RBVFVTX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NUQVRVU19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXR1cyBpcyBvZmYuICovCisgICAgQkNNT0xUX1NUQVRVU19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFN0YXR1cyBpcyBvbi4gKi8KKyAgICBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgU3RhdHVzIHNob3VsZCBub3QgYmUgY2hhbmdlZCAodmFsaWQgZm9yIFNFVCBBUEkgY2FsbHMgb25seSkuICovCisgICAgQkNNT0xUX1NUQVRVU19fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfc3RhdHVzOworCisvKiogRVBPTiBlbmNyeXB0aW9uIG1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9OT19FTkNSWVBUSU9OICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBObyBlbmNyeXB0aW9uIG9mIGFueSBraW5kLiAqLworICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1RSSVBMRV9DSFVSTklORyAgICAgICAgICAgID0gMSwgICAgLyoqPCBFUE9OIHRyaXBsZS1jaHVybmluZyBtb2RlIHBlciBDVEMgc3BlY2lmaWNhdGlvbi4gICovCisgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX0VQT05fWkVST19PVkVSSEVBRF9BRVMgICAgICAgICAgPSAyLCAgICAvKio8IEVQT04gemVyby1vdmVyaGVhZCBBRVMgbW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZTsKKworLyoqIEVwb24gS2V5IENob2ljZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9rZXlfY2hvaWNlCit7CisgICAgQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBLZXkgMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgS2V5IDEuICovCisgICAgQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2tleV9jaG9pY2U7CisKKy8qKiBFUE9OIEVuY3J5cHRpb24gRGlyZWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9ESVJFQ1RJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fRElSRUNUSU9OX0RPV05TVFJFQU1fT05MWSAgICAgICAgICAgID0gMCwgICAgLyoqPCBFbmNyeXB0IGRvd25zdHJlYW0gdHJhZmZpYyBvbmx5LiAqLworICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fRElSRUNUSU9OX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbjsKKworLyoqIEVQT04gRkVDIGVuYWJsZSBzdGF0ZS4gIFNlZSBmbGFnIGRlc2NyaXB0aW9ucyBmb3IgcmVzdHJpY3Rpb25zLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRkVDIGlzIGRpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBGRUMgaXMgZW5hYmxlZC4gICBOb3RlOiBGRUMgY2FuIG9ubHkgYmUgZW5hYmxlZCBhbmQgZGlzYWJsZWQgUE9OLXdpZGUgZm9yIDEwRyBwYXRocywgYnV0IGNhbiBiZSBlbmFibGVkIGFuZCBkaXNhYmxlZCB3aXRoIGxvZ2ljYWwgbGluayBncmFudWxhcml0eSBmb3IgMUcgcGF0aHMuICovCisgICAgQkNNT0xUX0VQT05fRkVDX0VOX1NUQVRFX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGU7CisKKy8qKiBUaGUgdHlwZXMgb2YgT0FNIHRvIGNob29zZSBmcm9tLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9UWVBFX0JST0FEQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBCcm9hZGNvbSBPQU0gKGZvcm1lcmx5IFRFSykuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RZUEVfQ1RDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IENUQyBPQU0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RZUEVfRFBPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERQb0UgT0FNICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RZUEVfU0lFUE9OQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFNpRVBPTiBPQU0uIChNb3N0bHkgc2ltaWxhciB0byBEUG9FKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVFlQRV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3R5cGU7CisKKy8qKiBlcG9uIGxpbmsgZmVjIHN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0ZFQ19TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRW5hYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0ZFQ19TVEFURV9VU0VfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgVXNlIGRlZmF1bHRzLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGU7CisKKy8qKiBUaGUgY3VycmVudCByZWdpc3RyYXRpb24gc3RhdHVzIG9mIGEgbGluay4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX3N0YXR1cworeworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVFVTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRVU19ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAvKio8IExpbmsgaGFzIGNvbXBsZXRlZCBNUENQIHJlZ2lzdHJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRVU19SRUdJU1RSQVRJT05fUFJFVkVOVEVEICAgICAgICAgICAgICA9IDB4MDAwOCAgICAvKio8IExpbmsgaXMgYmVpbmcgcHJldmVudGVkIGZyb20gcmVnaXN0ZXJpbmcuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzOworCisvKiogTVBDUCBkaXNjb3ZlcnkgaW5mby4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbworeworICAgIEJDTU9MVF9NUENQX0RJU0NPVkVSWV9JTkZPX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTVBDUF9ESVNDT1ZFUllfSU5GT19PTkVfR19DQVBBQkxFICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAvKio8IDFHIENhcGFibGUuICovCisgICAgQkNNT0xUX01QQ1BfRElTQ09WRVJZX0lORk9fVEVOX0dfQ0FQQUJMRSAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgLyoqPCAxMEcgQ2FwYWJsZS4gKi8KKyAgICBCQ01PTFRfTVBDUF9ESVNDT1ZFUllfSU5GT19PTkVfR19XSU5ET1cgICAgICAgICAgICAgICAgICAgICA9IDB4MDAxMCwgICAvKio8IDFHIHdpbmRvdy4gKi8KKyAgICBCQ01PTFRfTVBDUF9ESVNDT1ZFUllfSU5GT19URU5fR19XSU5ET1cgICAgICAgICAgICAgICAgICAgICA9IDB4MDAyMCAgICAvKio8IDEwRyB3aW5kb3cuICovCit9IGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvOworCisvKiogRVBPTiBsaW5rIHN0YXRlIGZsYWdzIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBsaW5rLiAgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzCit7CisgICAgQkNNT0xUX0VQT05fTElOS19TVEFURV9GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVEVfRkxBR1NfTVBDUF9SRUdJU1RSQVRJT05fQ09NUExFVEUgICAgID0gMHgwMDAxICAgIC8qKjwgTGluayBoYXMgY29tcGxldGVkIE1QQ1AgcmVnaXN0cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzOworCisvKiogRVBPTiBMaW5rIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua190eXBlCit7CisgICAgQkNNT0xUX0VQT05fTElOS19UWVBFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfVFlQRV9TWVNURU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgQSBMaW5rIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3Igc3lzdGVtIHVzYWdlLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfVFlQRV9ET1dOU1RSRUFNX09OTFkgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgQSBMaW5rIHRoYXQgZG9lcyBub3QgY29uc3VtZSB1cHN0cmVhbSBiYW5kd2lkdGguICovCisgICAgQkNNT0xUX0VQT05fTElOS19UWVBFX0JJRElSRUNUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBBIExpbmsgdGhhdCB1bmRlcmdvZXMgdGhlIE1QQ1AgcmVnaXN0cmF0aW9uIHByb2Nlc3MuICovCisgICAgQkNNT0xUX0VQT05fTElOS19UWVBFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfdHlwZTsKKworLyoqIE1QQ1AgZ2F0ZSBtb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9tcGNwX2dhdGVfbW9kZQoreworICAgIEJDTU9MVF9NUENQX0dBVEVfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTVBDUF9HQVRFX01PREVfVEVLTk9WVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGVrbm92dXMgTVBDUCByZWdpc3RyYXRpb24gbW9kZS4gKi8KKyAgICBCQ01PTFRfTVBDUF9HQVRFX01PREVfQ1VTVE9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTm9uLVRla25vdnVzIE1QQ1AgcmVnaXN0cmF0aW9uIG1vZGUuICovCisgICAgQkNNT0xUX01QQ1BfR0FURV9NT0RFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9tcGNwX2dhdGVfbW9kZTsKKworLyoqIE1QQ1AgcmVnaXN0cmF0aW9uIGdhdGUgZmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MKK3sKKyAgICBCQ01PTFRfTVBDUF9SRUdJU1RSQVRJT05fR0FURV9GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX01QQ1BfUkVHSVNUUkFUSU9OX0dBVEVfRkxBR1NfRk9SQ0VfUkVQT1JUICAgICAgICAgICAgPSAweDAwMDEgICAgLyoqPCBGb3JjZSByZXBvcnQgYml0LiAqLworfSBiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFnczsKKworLyoqIEVuYWJsZSBzdGF0ZSBvZiB0aGUgRVBPTiBOSS4gIEluaXRpYWxseSB0aGUgb25seSBlbmFibGUgc3RhdGVzIGRlZmluZWQgYXJlIAorICogYGRpc2FibGVkJyBhbmQgYGVuYWJsZWQnLCBidXQgdGhpcyBtYXkgbGF0ZXIgYmUgZXh0ZW5kZWQgdG8gaW5jbHVkZSAKKyAqIGRpZmZlcmVudCBkZWdyZWVzIG9mIGVuYWJsZW1lbnQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBFUE9OIE5JIGlzIGZ1bGx5IGRpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgRVBPTiBOSSBpcyBmdWxseSBlbmFibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgRVBPTiBOSSBpcyBmdWxseSBlbmFibGVkLiByZWR1bmRhbnQgYW5kIGFjdGl2aWx5IGNhcnJ5aW5nIHRyYWZmaWMuICovCisgICAgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPVEVDVEVEX1NUQU5EQlkgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBFUE9OIE5JIGlzIGZ1bGx5IGVuYWJsZWQuIHJlZHVuZGFudCBhbmQgcHJvdGVjdGluZyBhbm90aGVyIFBPTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9QUk9DRVNTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IEVQT04gTkkgaXMgY3VycmVudGx5IHRyYW5zaXRpb25pbmcgYmV0d2VlbiBzdGF0ZXMgKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGU7CisKKy8qKiBFUE9OIE9BTSBFeHRlbnNpb24gVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlc2VydmVkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0JST0FEQ09NICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEJyb2FkY29tICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0NUQyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IENoaW5hIFRlbGVjb20gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfREFTQU4gICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRGFzYW4gTmV0d29ya3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfS1QgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgS29yZWEgVGVsZWNvbSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9EUE9FICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBEUG9FICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlOworCisvKiogMSB0byAxMSBtYXRjaGUgdGhlIERQb0UgcmVzcG9uc2UgY29kZS4gIFJlZmVyIHRvIERQb0UtU1AtT0FNdjEuMC1JMDgtMTQwODA3LCAKKyAqIENsLiAxMi4xLjMuIDIxIHRvIDI4IGFyZSB1c2VkIGZvciBDVEMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9PSyAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9VTkRFRklORUQgICAgICAgICAgICAgPSAxLCAgICAvKio8IFVua25vd24gZXJyb3IsIG9yIG9uZSBub3QgY292ZXJlZCBlbHNld2hlcmUuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfTk9UX0ZPVU5EICAgICAgICAgICAgID0gMiwgICAgLyoqPCBSZWFkIHJlcXVlc3RlZCBmaWxlIHRoYXQgaXMgbm90IGF2YWlsYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9OT19BQ0NFU1MgICAgICAgICAgICAgPSAzLCAgICAvKio8IEFjY2VzcyBwZXJtaXNzaW9ucyBkbyBub3QgYWxsb3cgdGhlIHJlcXVlc3RlZCByZWFkL3dyaXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0ZVTEwgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgU3RvcmFnZSBpcyBmdWxsLCBhbmQgY2Fubm90IGhvbGQgdGhlIHdyaXR0ZW4gZmlsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9JTExFR0FMX09QRVJBVElPTiAgICAgPSA1LCAgICAvKio8IENhbm5vdCBwZXJmb3JtIHJlcXVlc3RlZCBvcGVyYXRpb24gaW4gY3VycmVudCBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9VTktOT1dOX0lEICAgICAgICAgICAgPSA2LCAgICAvKio8IFJlcXVlc3RlZCBmaWxlIElEIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfQkFEX0JMT0NLICAgICAgICAgICAgID0gNywgICAgLyoqPCBCbG9jayByZWNlaXZlZCBpbiBlcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9USU1FT1VUICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IE5vIGJsb2NrIHJlY2VpdmVkIGJlZm9yZSB0aW1lciBleHBpcmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0JVU1kgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgQ2Fubm90IHBlcmZvcm0gcmVxdWVzdGVkIGFjdGlvbiBkdWUgdG8gb3RoZXIgYWN0aXZpdHkuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfSU5DT01QQVRJQkxFX0ZJTEUgICAgID0gMTAsICAgLyoqPCBSZWNlaXZlZCBmaWxlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZGV2aWNlLiBGaWxlIGluY29tcGF0aWJpbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBkZXZpY2UgdmVuZG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0NPUlJVUFRFRF9GSUxFICAgICAgICA9IDExLCAgIC8qKjwgRmlsZSB3YXMgcmVjZWl2ZWQgY29ycnVwdGVkIGFuZCBpcyB1bnVzYWJsZSBieSB0aGlzIGRldmljZS4gRmlsZSBpbnRlZ3JpdHkgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZGV2aWNlIHZlbmRvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FUlJPUl9OT1RfREVGSU5FRCAgICAgPSAyMSwgICAvKio8IE9OVSByZXR1cm5lZCBFUlJPUiBQRFU6IFVuZGVmaW5lZCBlcnJvciBjb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VSUk9SX0FMTE9DX0VYQ0VFREVEICA9IDIyLCAgIC8qKjwgT05VIHJldHVybmVkIEVSUk9SIFBEVTogRGlzayBmdWxsIG9yIGFsbG9jYXRpb24gZXhjZWVkZWQuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRVJST1JfSUxMRUdBTF9PUCAgICAgID0gMjMsICAgLyoqPCBPTlUgcmV0dXJuZWQgRVJST1IgUERVOiBJbGxlZ2FsIFRGVFAgb3BlcmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VSUk9SX0ZJTEVfRVhJU1RTICAgICA9IDI0LCAgIC8qKjwgT05VIHJldHVybmVkIEVSUk9SIFBEVTogTWlycm9yIGZpbGUgYWxyZWFkeSBleGlzdHMuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX1dSSVRJTkdfTlZTICAgICAgID0gMjUsICAgLyoqPCBPTlUgcmV0dXJuZWQgRU5EIFJFU1BPTlNFIFBEVSB3aXRoIGVycm9yOiBXcml0aW5nIGZpbGUgdG8gTlZTICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX0NSQ19FUlJPUiAgICAgICAgID0gMjYsICAgLyoqPCBPTlUgcmV0dXJuZWQgRU5EIFJFU1BPTlNFIFBEVSB3aXRoIGVycm9yOiBDUkMzMiBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VORF9QQVJBTV9FUlJPUiAgICAgICA9IDI3LCAgIC8qKjwgT05VIHJldHVybmVkIEVORCBSRVNQT05TRSBQRFUgd2l0aCBlcnJvcjogUGFyYW1ldGVyIGVycm9yICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX0NNRF9VTlNVUFBPUlRFRCAgID0gMjgsICAgLyoqPCBPTlUgcmV0dXJuZWQgRU5EIFJFU1BPTlNFIFBEVSB3aXRoIGVycm9yOiBDb21tYW5kIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9MQVNUICAgICAgICAgICAgICAgICAgPSAyOSAgICAvKio8IExhc3QuICovCit9IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlOworCisvKiogRVBPTiBPTlUgVXBncmFkZSBSZXR1cm4gQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZQoreworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb21tYW5kIHN1Y2NlZWRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9PTlVfUkVTUE9OU0VfVElNRU9VVCAgICAgICAgPSAxLCAgICAvKio8IE9OVSBkaWQgbm90IHJlc3BvbmQgdG8gYSBtZXNzYWdlIHdpdGhpbiB0aGUgdGltZSBzcGVjaWZpZWQgYnkgdGhlICJXcml0ZSByZXF1ZXN0IHRpbWVvdXQiLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX09OVV9FUlJPUl9SRVNQT05TRSAgICAgICAgICA9IDIsICAgIC8qKjwgRXJyb3IgZm91bmQgaW4gdGhlIE9OVSByZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9TWU5DX0VSUk9SICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEJsb2NrIG51bWJlciBzeW5jIGVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX0NPTU1JVF9GQUlMRUQgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgQ29tbWl0IHNvZnR3YXJlIGNvbW1hbmQgZmFpbGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX0lOVEVSTkFMICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgSW50ZXJuYWwgZXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfUEFSU0VfRVJST1IgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBVbmFibGUgdG8gcGFyc2UgdGhlIE9OVSByZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGU7CisKKy8qKiBJbmRpY2F0ZXMgd2hldGhlciBsaW5rcyBhcmUgdW5wcm90ZWN0ZWQsIHByb3RlY3RlZCBzdGFuZGJ5LCBvciBwcm90ZWN0ZWQgCisgKiB3b3JraW5nLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUKK3sKKyAgICBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1RBVEVfVU5QUk9URUNURUQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIGxpbmsgaXMgbm90IGEgbWVtYmVyIG9mIGEgcHJvdGVjdGlvbiBwYWlyLiAqLworICAgIEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1RBVEVfUFJPVEVDVEVEX1NUQU5EQlkgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVGhlIGxpbmsgaXMgYSBtZW1iZXIgb2YgYSBwcm90ZWN0aW9uIHBhaXIgaW4gdGhlIHN0YW5kYnkgcm9sZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFRoZSBsaW5rIGlzIGEgbWVtYmVyIG9mIGEgcHJvdGVjdGlvbiBwYWlyIGluIHRoZSB3b3JraW5nIHJvbGUuICovCisgICAgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TVEFURV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZTsKKworLyoqIEVQT04gUHJvdGVjdGlvbiBTd2l0Y2hpbmcgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlCit7CisgICAgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9OT19QUk9URUNUSU9OX1NXVElDSElORyAgICAgICA9IDAsICAgIC8qKjwgTm8gcHJvdGVjdGlvbiBzd3RpY2hpbmcuICovCisgICAgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9MSU5FX0NBUkRfUFJPVEVDVElPTl9TV0lUQ0hJTkc9IDEsICAgIC8qKjwgTGluZSBjYXJkIHByb3RlY3Rpb24gc3dpdGNoaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZTsKKworLyoqIFByb3RlY3Rpb24gU3dpdGNoaW5nIERldGVjdGlvbiBPcHRpb25zLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucworeworICAgIEJDTU9MVF9QUk9URUNUSU9OX1NXSVRDSElOR19ERVRFQ1RJT05fT1BUSU9OU19OT05FICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9QUk9URUNUSU9OX1NXSVRDSElOR19ERVRFQ1RJT05fT1BUSU9OU19TVEFOREJZX0xPU19ERVRFQ1RJT04gPSAweDAwMDEgICAgICAgICAgICAvKio8IFN0YW5kYnkgTE9TIGRldGVjdGlvbi4gKi8KK30gYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zOworCisvKiogQ3JpdGVyaWEgZm9yIGxvZ2ljYWwgbGluayBzZWxlY3Rpb24gZHVyaW5nIHJlLXJhbmdpbmcgcHJvY2VzcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zCit7CisgICAgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfUkVSQU5HSU5HX09QVElPTlNfUkVSQU5HRV9OT05FICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTm8gcmUtcmFuZ2luZyBhdCBhbGwgKi8KKyAgICBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NXSVRDSElOR19SRVJBTkdJTkdfT1BUSU9OU19SRVJBTkdFX1NJTkdMRV9MT0dJQ0FMX0xJTksgID0gMiwgICAgLyoqPCBQaWNrIG1pbmltdW0gbG9naWNhbCBsaW5rcyB0byByZS1yYW5nZSAqLworICAgIEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1JFUkFOR0lOR19PUFRJT05TX1JFUkFOR0VfQUxMX0xPR0lDQUxfTElOS1MgICAgPSA0ICAgICAvKio8IEluZGl2aWR1YWxseSByZS1yYW5nZSBhbGwgbG9naWNhbCBsaW5rcyAqLworfSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9uczsKKworLyoqIEdQSU8gcGluIG51bWJlci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bpb19waW4KK3sKKyAgICBCQ01PTFRfR1BJT19QSU5fUElOMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBHUElPIHBpbiAwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEdQSU8gcGluIDEuICovCisgICAgQkNNT0xUX0dQSU9fUElOX1BJTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgR1BJTyBwaW4gMi4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fUElOMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBHUElPIHBpbiAzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEdQSU8gcGluIDQuICovCisgICAgQkNNT0xUX0dQSU9fUElOX1BJTjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgR1BJTyBwaW4gNS4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fUElONiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBHUElPIHBpbiA2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IEdQSU8gcGluIDcuICovCisgICAgQkNNT0xUX0dQSU9fUElOX1BJTjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgR1BJTyBwaW4gOC4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fUElOOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBHUElPIHBpbiA5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IEdQSU8gcGluIDEwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IEdQSU8gcGluIDExLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IEdQSU8gcGluIDEyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IEdQSU8gcGluIDEzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IEdQSU8gcGluIDE0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IEdQSU8gcGluIDE1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IEdQSU8gcGluIDE2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IEdQSU8gcGluIDE3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IEdQSU8gcGluIDE4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IEdQSU8gcGluIDE5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEdQSU8gcGluIDIwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAvKio8IEdQSU8gcGluIDIxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAvKio8IEdQSU8gcGluIDIyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IEdQSU8gcGluIDIzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNCwgICAvKio8IEdQSU8gcGluIDI0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IEdQSU8gcGluIDI1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IEdQSU8gcGluIDI2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAvKio8IEdQSU8gcGluIDI3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAvKio8IEdQSU8gcGluIDI4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAvKio8IEdQSU8gcGluIDI5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAvKio8IEdQSU8gcGluIDMwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAvKio8IEdQSU8gcGluIDMxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAvKio8IEdQSU8gcGluIDMyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAvKio8IEdQSU8gcGluIDMzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNCwgICAvKio8IEdQSU8gcGluIDM0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IEdQSU8gcGluIDM1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAvKio8IEdQSU8gcGluIDM2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAvKio8IEdQSU8gcGluIDM3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAvKio8IEdQSU8gcGluIDM4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOSwgICAvKio8IEdQSU8gcGluIDM5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MCwgICAvKio8IEdQSU8gcGluIDQwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MSwgICAvKio8IEdQSU8gcGluIDQxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MiwgICAvKio8IEdQSU8gcGluIDQyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MywgICAvKio8IEdQSU8gcGluIDQzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NCwgICAvKio8IEdQSU8gcGluIDQ0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NSwgICAvKio8IEdQSU8gcGluIDQ1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NiwgICAvKio8IEdQSU8gcGluIDQ2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NywgICAvKio8IEdQSU8gcGluIDQ3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OCwgICAvKio8IEdQSU8gcGluIDQ4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OSwgICAvKio8IEdQSU8gcGluIDQ5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MCwgICAvKio8IEdQSU8gcGluIDUwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MSwgICAvKio8IEdQSU8gcGluIDUxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MiwgICAvKio8IEdQSU8gcGluIDUyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MywgICAvKio8IEdQSU8gcGluIDUzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NCwgICAvKio8IEdQSU8gcGluIDU0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NSwgICAvKio8IEdQSU8gcGluIDU1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NiwgICAvKio8IEdQSU8gcGluIDU2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NywgICAvKio8IEdQSU8gcGluIDU3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OCwgICAvKio8IEdQSU8gcGluIDU4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OSwgICAvKio8IEdQSU8gcGluIDU5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MCwgICAvKio8IEdQSU8gcGluIDYwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MSwgICAvKio8IEdQSU8gcGluIDYxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MiwgICAvKio8IEdQSU8gcGluIDYyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MywgICAvKio8IEdQSU8gcGluIDYzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NCwgICAvKio8IEdQSU8gcGluIDY0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NSwgICAvKio8IEdQSU8gcGluIDY1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NiwgICAvKio8IEdQSU8gcGluIDY2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NywgICAvKio8IEdQSU8gcGluIDY3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OCwgICAvKio8IEdQSU8gcGluIDY4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OSwgICAvKio8IEdQSU8gcGluIDY5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MCwgICAvKio8IEdQSU8gcGluIDcwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MSwgICAvKio8IEdQSU8gcGluIDcxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MiwgICAvKio8IEdQSU8gcGluIDcyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MywgICAvKio8IEdQSU8gcGluIDczLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NCwgICAvKio8IEdQSU8gcGluIDc0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NSwgICAvKio8IEdQSU8gcGluIDc1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NiwgICAvKio8IEdQSU8gcGluIDc2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NywgICAvKio8IEdQSU8gcGluIDc3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OCwgICAvKio8IEdQSU8gcGluIDc4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OSwgICAvKio8IEdQSU8gcGluIDc5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MCwgICAvKio8IEdQSU8gcGluIDgwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MSwgICAvKio8IEdQSU8gcGluIDgxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MiwgICAvKio8IEdQSU8gcGluIDgyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MywgICAvKio8IEdQSU8gcGluIDgzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NCwgICAvKio8IEdQSU8gcGluIDg0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NSwgICAvKio8IEdQSU8gcGluIDg1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NiwgICAvKio8IEdQSU8gcGluIDg2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NywgICAvKio8IEdQSU8gcGluIDg3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4OCwgICAvKio8IEdQSU8gcGluIDg4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4OSwgICAvKio8IEdQSU8gcGluIDg5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MCwgICAvKio8IEdQSU8gcGluIDkwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MSwgICAvKio8IEdQSU8gcGluIDkxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MiwgICAvKio8IEdQSU8gcGluIDkyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MywgICAvKio8IEdQSU8gcGluIDkzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NCwgICAvKio8IEdQSU8gcGluIDk0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NSwgICAvKio8IEdQSU8gcGluIDk1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NiwgICAvKio8IEdQSU8gcGluIDk2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NywgICAvKio8IEdQSU8gcGluIDk3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OCwgICAvKio8IEdQSU8gcGluIDk4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OSwgICAvKio8IEdQSU8gcGluIDk5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDAsICAvKio8IEdQSU8gcGluIDEwMC4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fUElOMTAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAxLCAgLyoqPCBHUElPIHBpbiAxMDEuICovCisgICAgQkNNT0xUX0dQSU9fUElOX1BJTjEwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMiwgIC8qKjwgR1BJTyBwaW4gMTAyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDMsICAvKio8IEdQSU8gcGluIDEwMy4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fUElOMTA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA0LCAgLyoqPCBHUElPIHBpbiAxMDQuICovCisgICAgQkNNT0xUX0dQSU9fUElOX1BJTjEwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNSwgIC8qKjwgR1BJTyBwaW4gMTA1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDYsICAvKio8IEdQSU8gcGluIDEwNi4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fVU5DT05GSUdVUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU1ICAgLyoqPCBVbmNvbmZpZ3VyZWQgR1BJTyBwaW4uICovCit9IGJjbW9sdF9ncGlvX3BpbjsKKworLyoqIEdQSU8gUG9sYXJpdHkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwaW9fcG9sYXJpdHkKK3sKKyAgICBCQ01PTFRfR1BJT19QT0xBUklUWV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BJT19QT0xBUklUWV9BQ1RJVkVfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBY3RpdmUgTG93LiAqLworICAgIEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEFjdGl2ZSBIaWdoLiAqLworICAgIEJDTU9MVF9HUElPX1BPTEFSSVRZX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bpb19wb2xhcml0eTsKKworLyoqIEV4dGVybmFsIElSUS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXh0X2lycQoreworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEV4dGVybmFsIElSUSAwLiAqLworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEV4dGVybmFsIElSUSAxLiAqLworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEV4dGVybmFsIElSUSAyLiAqLworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEV4dGVybmFsIElSUSAzLiAqLworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEV4dGVybmFsIElSUSA0LiAqLworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEV4dGVybmFsIElSUSA1LiAqLworICAgIEJDTU9MVF9FWFRfSVJRX1VOQ09ORklHVVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTUgICAvKio8IFVuY29uZmlndXJlZCBleHRlcm5hbCBJUlEuICovCit9IGJjbW9sdF9leHRfaXJxOworCisvKiogRmx1c2ggTUFDIHRhYmxlIG9wdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbgoreworICAgIEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsbC4gKi8KKyAgICBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9QRVJfVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQRVIgVklELiAqLworICAgIEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX1BFUl9GTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFBFUiBmbG93LiAqLworICAgIEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX1ZJRF9QTFVTX0ZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFZJRCtmbG93LiAqLworICAgIEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uOworCisvKiogRnJlcXVlbmN5IGFkanVzdG1lbnQgZGlyZWN0aW9uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbgoreworICAgIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fTE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IExvd2VyICovCisgICAgQkNNT0xUX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTl9ISUdIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgSGlnaGVyICovCisgICAgQkNNT0xUX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTl9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uOworCisvKiogR0VNIHBvcnQgSUQgZGlyZWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24KK3sKKyAgICBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX0RPV05TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBkb3duc3RyZWFtIHBvcnQgSUQuICovCisgICAgQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9VUFNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgdXBzdHJlYW0gcG9ydCBJRC4gKi8KKyAgICBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX0JJRElSRUNUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBiaWRpcmVjdGlvbmFsIHBvcnQgIElELiAqLworICAgIEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbjsKKworLyoqIEdFTSBwb3J0IHR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dlbV9wb3J0X3R5cGUKK3sKKyAgICBCQ01PTFRfR0VNX1BPUlRfVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR0VNX1BPUlRfVFlQRV9VTklDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCB1bmljYXN0IHBvcnQgSUQuICovCisgICAgQkNNT0xUX0dFTV9QT1JUX1RZUEVfTVVMVElDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgbXVsdGljYXN0IHBvcnQgSUQuICovCisgICAgQkNNT0xUX0dFTV9QT1JUX1RZUEVfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9nZW1fcG9ydF90eXBlOworCisvKiogR0VNIHBvcnQgb3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24KK3sKKyAgICBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0FDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBY3RpdmF0ZS4gKi8KKyAgICBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0RFQUNUSVZBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBEZWFjdGl2YXRlLiAqLworICAgIEJDTU9MVF9HRU1fUE9SVF9PUEVSQVRJT05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbjsKKworLyoqIEdQSU8gUElOIERpcmVjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bpb19waW5fZGlyCit7CisgICAgQkNNT0xUX0dQSU9fUElOX0RJUl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQSU9fUElOX0RJUl9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgSW5wdXQuICovCisgICAgQkNNT0xUX0dQSU9fUElOX0RJUl9PVVRQVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgT3V0cHV0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9ESVJfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncGlvX3Bpbl9kaXI7CisKKy8qKiBHUElPIFZhbHVlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncGlvX3ZhbHVlCit7CisgICAgQkNNT0xUX0dQSU9fVkFMVUVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQSU9fVkFMVUVfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ2xlYXIuICovCisgICAgQkNNT0xUX0dQSU9fVkFMVUVfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU2V0LiAqLworICAgIEJDTU9MVF9HUElPX1ZBTFVFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncGlvX3ZhbHVlOworCisvKiogR1BPTiBHRU0gUG9ydCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZQoreworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX05PVF9DT05GSUdVUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vdCBjb25maWd1cmVkLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGluYWN0aXZlLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX1BST0NFU1NJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IHByb2Nlc3NpbmcuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgYWN0aXZlLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGU7CisKKy8qKiBLZXkgZXhjaGFuZ2UgbW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfa2V5X2V4Y2hhbmdlX21vZGUKK3sKKyAgICBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBOb3JtYWwuICovCisgICAgQkNNT0xUX0tFWV9FWENIQU5HRV9NT0RFX0VOSEFOQ0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRW5oYW5jZWQuICovCisgICAgQkNNT0xUX0tFWV9FWENIQU5HRV9NT0RFX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfa2V5X2V4Y2hhbmdlX21vZGU7CisKKy8qKiBPTUNJIERldmljZSBJRC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfb21jaV9kZXZpY2VfaWQKK3sKKyAgICBCQ01PTFRfT01DSV9ERVZJQ0VfSURfQkFTRUxJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBCYXNlbGluZS4gKi8KKyAgICBCQ01PTFRfT01DSV9ERVZJQ0VfSURfRVhURU5ERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEgICAgLyoqPCBFeHRlbmRlZC4gKi8KK30gYmNtb2x0X29tY2lfZGV2aWNlX2lkOworCisvKiogR1BPTiBPTlUgVXBncmFkZSBSZXR1cm4gQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZQoreworICAgIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbW1hbmQgc3VjY2VlZGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX09OVV9SRVNQT05TRV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE9OVSBkaWQgbm90IHJlc3BvbmQgdG8gYSBtZXNzYWdlIHdpdGhpbiB0aGUgdGltZSBzcGVjaWZpZWQgYnkgdGhlICJXcml0ZSByZXF1ZXN0IHRpbWVvdXQiLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX09OVV9FUlJPUl9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEVycm9yIGZvdW5kIGluIHRoZSBPTlUgcmVzcG9uc2UuICovCisgICAgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfVENJX01JU01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgVHJhbnNhY3Rpb24gSUQgbWlzbWF0Y2guICovCisgICAgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfR0VUX0lNQUdFX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgR2V0IEltYWdlIEluZm8gY29tbWFuZCBmYWlsZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfQUNUSVZBVElPTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgQWN0aXZhdGlvbiBzb2Z0d2FyZSBjb21tYW5kIGZhaWxlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9JTlRFUk5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBJbnRlcm5hbCBlcnJvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGU7CisKKy8qKiBHLjk4OCBPTUNJIFJlc3VsdCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlCit7CisgICAgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29tbWFuZCBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5LiAqLworICAgIEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1BST0NFU1NJTkdfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IENvbW1hbmQgcHJvY2Vzc2luZyBlcnJvci4gKi8KKyAgICBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBDb21tYW5kIG5vdCBzdXBwb3J0ZWQsIG9yIG5vdCBhcHBsaWNhYmxlIGZvciBFbmQgc29mdHdhcmUgZG93bmxvYWQgbWVzc2FnZS4gKi8KKyAgICBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9QQVJBTUVURVJfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBQYXJhbWV0ZXIgZXJyb3IsIG9yIG5vdCBhcHBsaWNhYmxlIGZvciBFbmQgc29mdHdhcmUgZG93bmxvYWQgbWVzc2FnZS4gKi8KKyAgICBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9VTktOT1dOX0VOVElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBVbmtub3duIG1hbmFnZWQgZW50aXR5LiAqLworICAgIEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1VOS05PV05fSU5TVEFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFVua25vd24gbWFuYWdlZCBlbnRpdHkgaW5zdGFuY2UuICovCisgICAgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfREVWSUNFX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgRGV2aWNlIGJ1c3kuICovCisgICAgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlOworCisvKiogT05VIHN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9vbnVfc3RhdGUKK3sKKyAgICBCQ01PTFRfT05VX1NUQVRFX05PVF9DT05GSUdVUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBub3RfY29uZmlndXJlZC4gKi8KKyAgICBCQ01PTFRfT05VX1NUQVRFX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBpbmFjdGl2ZS4gKi8KKyAgICBCQ01PTFRfT05VX1NUQVRFX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBhY3RpdmUuICovCisgICAgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkVfU1RBTkRCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgYWN0aXZlIHN0YW5kYnkuICovCisgICAgQkNNT0xUX09OVV9TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgZGlzYWJsZWQuICovCisgICAgQkNNT0xUX09OVV9TVEFURV9BV0FLRV9GUkVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgT05VIGlzIGFjdGl2ZSwgYnV0IHBvd2VyIG1hbmFnZW1lbnQgaXMgZW5hYmxlZC4gT05VIGlzIGFsbG93ZWQgdG8gZW50ZXIgbG93IHBvd2VyIHN0YXRlcyBhdCBpdHMgb3duIGRpc2NyZXRpb24uICovCisgICAgQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgcHJvY2Vzc2luZy4gKi8KKyAgICBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9ET1pFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBPTlUgaGFzIGVudGVyZWQgdGhlIERvemUgbG93IHBvd2VyIHN0YXRlLiAqLworICAgIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IE9OVSBoYXMgZW50ZXJlZCB0aGUgU2xlZXAgbG93IHBvd2VyIHN0YXRlLiAqLworICAgIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IE9OVSBoYXMgZW50ZXJlZCB0aGUgV2F0Y2hmdWwgU2xlZXAgbG93IHBvd2VyIHN0YXRlLiAqLworICAgIEJDTU9MVF9PTlVfU1RBVEVfVU5BV0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSAgICAvKio8IE9OVSBpcyBhZGRlZCB0byBkYXRhIGJhc2UgYnV0IG5vIGJ3cyBpcyBzYXZlZCAgKi8KK30gYmNtb2x0X29udV9zdGF0ZTsKKworLyoqIHJzc2kgbG9jYXRpb24gc2lnbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduCit7CisgICAgQkNNT0xUX1JTU0lfTE9DQVRJT05fU0lHTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1JTU0lfTE9DQVRJT05fU0lHTl9CRUZPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYmVmb3JlLiAqLworICAgIEJDTU9MVF9SU1NJX0xPQ0FUSU9OX1NJR05fQUZURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGFmdGVyLiAqLworICAgIEJDTU9MVF9SU1NJX0xPQ0FUSU9OX1NJR05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3Jzc2lfbG9jYXRpb25fc2lnbjsKKworLyoqIE9OVSBwb3N0IGRpc2NvdmVyeSBtb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZQoreworICAgIEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vbmUuICovCisgICAgQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0FDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgYWN0aXZhdGUuICovCisgICAgQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgZGlzYWJsZS4gKi8KKyAgICBCQ01PTFRfT05VX1BPU1RfRElTQ09WRVJZX01PREVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGU7CisKKy8qKiBJbWFnZSB0cmFuc2ZlciBzdGF0dXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cworeworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN1Y2Nlc3MuICovCisgICAgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19NRU1PUllfQUxMT0NBVElPTl9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1VOU1VQUE9SVEVEX0ZJTEVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBVbnN1cHBvcnRlZCBmaWxlIHR5cGUuICovCisgICAgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19DUkNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgQ1JDIGNoZWNrc3VtIGVycm9yLiAqLworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQkxPQ0tfT1VUX09GX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEJsb2NrIG91dCBvZiBzeW5jLiAqLworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5URVJOQUxfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEludGVybmFsIGVycm9yLiAqLworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5WQUxJRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IEludmFsaWQgc3RhdGUuICovCisgICAgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19QUkVNQVRVUkVfVEVSTUlOQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgUHJlbWF0dXJlIHRlcm1pbmF0aW9uLiAqLworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQUNLX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEFDSyB0aW1lb3V0LiAqLworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXM7CisKKy8qKiBpd2YgbW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfaXdmX21vZGUKK3sKKyAgICBCQ01PTFRfSVdGX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfSVdGX01PREVfRElSRUNUX01BUFBJTkdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBESVJFQ1QgTUFQUElORyBNT0RFLiAqLworICAgIEJDTU9MVF9JV0ZfTU9ERV9QRVJfRkxPV19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFBFUiBGTE9XIE1PREUuICovCisgICAgQkNNT0xUX0lXRl9NT0RFX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfaXdmX21vZGU7CisKKy8qKiBsb2cgZmlsZSBpZC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nX2ZpbGVfaWQKK3sKKyAgICBCQ01PTFRfTE9HX0ZJTEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTE9HX0ZJTEVfSURfU1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTUkFNLiAqLworICAgIEJDTU9MVF9MT0dfRklMRV9JRF9ERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEREUi4gKi8KKyAgICBCQ01PTFRfTE9HX0ZJTEVfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nX2ZpbGVfaWQ7CisKKy8qKiBsb2cgbGV2ZWwuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ19sZXZlbAoreworICAgIEJDTU9MVF9MT0dfTEVWRUxfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfTEVWRUxfTk9fTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vIGxvZy4gKi8KKyAgICBCQ01PTFRfTE9HX0xFVkVMX0ZBVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBmYXRhbC4gKi8KKyAgICBCQ01PTFRfTE9HX0xFVkVMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBlcnJvci4gKi8KKyAgICBCQ01PTFRfTE9HX0xFVkVMX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCB3YXJuaW5nLiAqLworICAgIEJDTU9MVF9MT0dfTEVWRUxfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IGluZm8uICovCisgICAgQkNNT0xUX0xPR19MRVZFTF9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgZGVidWcuICovCisgICAgQkNNT0xUX0xPR19MRVZFTF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19sZXZlbDsKKworLyoqIGxvZyBzdHlsZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nX3N0eWxlCit7CisgICAgQkNNT0xUX0xPR19TVFlMRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0xPR19TVFlMRV9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgbm9ybWFsLiAqLworICAgIEJDTU9MVF9MT0dfU1RZTEVfQk9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGJvbGQuICovCisgICAgQkNNT0xUX0xPR19TVFlMRV9VTkRFUkxJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgdW5kZXJsaW5lLiAqLworICAgIEJDTU9MVF9MT0dfU1RZTEVfQkxJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IGJsaW5rLiAqLworICAgIEJDTU9MVF9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHJldmVyc2UgdmlkZW8uICovCisgICAgQkNNT0xUX0xPR19TVFlMRV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19zdHlsZTsKKworLyoqIGxvZyB0eXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dfdHlwZQoreworICAgIEJDTU9MVF9MT0dfVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfVFlQRV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGRvbnQgc2hvdyBsb2cgICovCisgICAgQkNNT0xUX0xPR19UWVBFX1BSSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcHJpbnQuICovCisgICAgQkNNT0xUX0xPR19UWVBFX1NBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgc2F2ZS4gKi8KKyAgICBCQ01PTFRfTE9HX1RZUEVfQk9USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBib3RoLiAqLworICAgIEJDTU9MVF9MT0dfVFlQRV9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ190eXBlOworCisvKiogTUFDIHRhYmxlIG1pc3MgZmFsbGJhY2suIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrCit7CisgICAgQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIHBhY2tldCBpcyBkcm9wcGVkLiAqLworICAgIEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19ERUZBVUxUX0ZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFRoZSBwYWNrZXQgaXMgZm9yd2FyZGVkIHdpdGggdGhlIHByb3Zpc2lvbmVkIGRlZmF1bHQgZmxvdyBJRC4gKi8KKyAgICBCQ01PTFRfTUFDX1RBQkxFX01JU1NfRkFMTEJBQ0tfVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBUaGUgcGFja2V0IGlzIGZvcndhcmRlZCB3aXRoIGEgZmxvdyBJRCBlcXVhbCB0byBpdHMgVklELiAqLworICAgIEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjazsKKworLyoqIE1BQyB0YWJsZSBMZWFybmluZyBtb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZQoreworICAgIEJDTU9MVF9NQUNfVEFCTEVfTEVBUk5JTkdfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9NQUNfVEFCTEVfTEVBUk5JTkdfTU9ERV9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vcm1hbCBtb2RlOiB1cHN0cmVhbSB0cmFmZmljIHRoYXQgbWF0Y2hlcyBvbiBNQUMvVklEIGJ1dCBkb2Vzbid0IG1hdGNoIG9uIGZsb3cgSUQgaXMgc3RpbGwgYWxsb3dlZCB0byBwYXNzLiAqLworICAgIEJDTU9MVF9NQUNfVEFCTEVfTEVBUk5JTkdfTU9ERV9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE5vcm1hbCBtb2RlOiB1cHN0cmVhbSB0cmFmZmljIHRoYXQgbWF0Y2hlcyBvbiBNQUMvVklEIGJ1dCBkb2Vzbid0IG1hdGNoIG9uIGZsb3cgSUQgaXMgY29uc2lkZXJlZCB0byBiZSBhIE1BQyBtb3ZlIGNvbmRpdGlvbi4gKi8KKyAgICBCQ01PTFRfTUFDX1RBQkxFX0xFQVJOSU5HX01PREVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGU7CisKKy8qKiBNYXBwaW5nIHRhZyBtZXRob2QuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZAoreworICAgIEJDTU9MVF9NQVBQSU5HX1RBR19NRVRIT0RfT1VURVJfVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE91dGVyIFZJRC4gKi8KKyAgICBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX0lOTkVSX1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgLyoqPCBJbm5lciBWSUQuICovCit9IGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2Q7CisKKy8qKiBOTkkgQ29ubmVjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbm5pX2Nvbm5lY3Rpb24KK3sKKyAgICBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fUFJJTUFSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQcmltYXJ5LiAqLworICAgIEJDTU9MVF9OTklfQ09OTkVDVElPTl9CQUNLVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEJhY2t1cC4gKi8KKyAgICBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X25uaV9jb25uZWN0aW9uOworCisvKiogVHJpdmFsZW50LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90cml2YWxlbnQKK3sKKyAgICBCQ01PTFRfVFJJVkFMRU5UX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBGYWxzZS4gKi8KKyAgICBCQ01PTFRfVFJJVkFMRU5UX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUcnVlLiAqLworICAgIEJDTU9MVF9UUklWQUxFTlRfTk9UX0FQUExJQ0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IE5vdCBBcHBsaWNhYmxlLiAqLworICAgIEJDTU9MVF9UUklWQUxFTlRfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90cml2YWxlbnQ7CisKKy8qKiBPRE4gQ2xhc3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X29kbl9jbGFzcworeworICAgIEJDTU9MVF9PRE5fQ0xBU1NfTjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE4xLiAqLworICAgIEJDTU9MVF9PRE5fQ0xBU1NfTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE4yLiAqLworICAgIEJDTU9MVF9PRE5fQ0xBU1NfRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEUxLiAqLworICAgIEJDTU9MVF9PRE5fQ0xBU1NfRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAvKio8IEUyLiAqLworfSBiY21vbHRfb2RuX2NsYXNzOworCisvKiogT01DSSBQb3J0IElEIG9wZXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbgoreworICAgIEJDTU9MVF9PTUNJX1BPUlRfSURfT1BFUkFUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9PTUNJX1BPUlRfSURfT1BFUkFUSU9OX0NPTkZJR1VSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGNvbmZpZ3VyZS4gKi8KKyAgICBCQ01PTFRfT01DSV9QT1JUX0lEX09QRVJBVElPTl9SRU1PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCByZW1vdmUuICovCisgICAgQkNNT0xUX09NQ0lfUE9SVF9JRF9PUEVSQVRJT05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb247CisKKy8qKiBPTlUgb3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9vbnVfb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX09OVV9PUEVSQVRJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgSW5hY3RpdmUuICovCisgICAgQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQWN0aXZlLiAqLworICAgIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERpc2FibGUuICovCisgICAgQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRW5hYmxlLiAqLworICAgIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRV9TVEFOREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEFjdGl2ZSBTdGFuZGJ5LiAqLworICAgIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FXQUtFX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFRyYW5zaXRpb25zIHRoZSBPTlUgdG8gYW4gYWN0aXZlIHN0YXRlIHdpdGggcG93ZXIgbWFuYWdlbWVudCBlbmFibGVkLiBBbGxvd2VkIGluIGluYWN0aXZlLCBkaXNhYmxlZCwgYW5kIGFjdGl2ZSBzdGF0ZXMuICovCisgICAgQkNNT0xUX09OVV9PUEVSQVRJT05fX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9vbnVfb3BlcmF0aW9uOworCisvKiogT05VIFBvd2VyIGxldmVsLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWwKK3sKKyAgICBCQ01PTFRfT05VX1BPV0VSX0xFVkVMX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfT05VX1BPV0VSX0xFVkVMX0lOQ1JFQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBpbmNyZWFzZS4gKi8KKyAgICBCQ01PTFRfT05VX1BPV0VSX0xFVkVMX0RFQ1JFQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBkZWNyZWFzZS4gKi8KKyAgICBCQ01PTFRfT05VX1BPV0VSX0xFVkVMX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X29udV9wb3dlcl9sZXZlbDsKKworLyoqIFRDIGxheWVyIHByb3RvY29sLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90Y19wcm90b2NvbAoreworICAgIEJDTU9MVF9UQ19QUk9UT0NPTF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UQ19QUk9UT0NPTF9UQ19MQVlFUl9QUk9UT0NPTF9HXzk4N19QXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFRDIGxheWVyIHByb3RvY29sIEcuOTg3LjMgKi8KKyAgICBCQ01PTFRfVENfUFJPVE9DT0xfVENfTEFZRVJfUFJPVE9DT0xfR185ODlfUF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUQyBsYXllciBwcm90b2NvbCBHLjk4OS4zICovCisgICAgQkNNT0xUX1RDX1BST1RPQ09MX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RjX3Byb3RvY29sOworCisvKiogUGFja2V0IEluamVjdGlvbiBFcnJvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcgoreworICAgIEJDTU9MVF9QQUNLRVRfSU5KRUNUSU9OX0VSUk9SX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9QQUNLRVRfSU5KRUNUSU9OX0VSUk9SX0dFTV9QT1JUX05PVF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEdFTSBQb3J0IE5vdCBBY3RpdmUuICovCisgICAgQkNNT0xUX1BBQ0tFVF9JTkpFQ1RJT05fRVJST1JfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3I7CisKKy8qKiBwYWNrZXQgdHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcGFja2V0X3R5cGUKK3sKKyAgICBCQ01PTFRfUEFDS0VUX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUEFDS0VUX1RZUEVfQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDUFUuICovCisgICAgQkNNT0xUX1BBQ0tFVF9UWVBFX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgT01DSS4gKi8KKyAgICBCQ01PTFRfUEFDS0VUX1RZUEVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcGFja2V0X3R5cGU7CisKKy8qKiBQYXNzd29yZCBhdXRoZW50aWNhdGlvbiBmYWlsIHJlYXNvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24KK3sKKyAgICBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBub25lLiAqLworICAgIEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9QQVNTV09SRF9JTkNPTlNJU1RFTkNZICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFBhc3N3b3JkIGluY29uc2lzdGVuY3kuICovCisgICAgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX1BBU1NXT1JEX01JU01BVENIICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUGFzc3dvcmQgbWlzbWF0Y2guICovCisgICAgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX1RJTUVPVVQgICAgICA9IDMsICAgIC8qKjwgUGFzc3dvcmQgYXV0aGVudGljYXRpb24gdGltZW91dC4gKi8KKyAgICBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fT05VX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBvbnUgYWxhcm0uICovCisgICAgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX0xPU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgbG9zIGV2ZW50LiAqLworICAgIEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9ESVNBQkxFX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IGRpc2FibGUgZXZlbnQuICovCisgICAgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uOworCisvKiogUG9sYXJpdHkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3BvbGFyaXR5Cit7CisgICAgQkNNT0xUX1BPTEFSSVRZX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTG93LiAqLworICAgIEJDTU9MVF9QT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEhpZ2guICovCisgICAgQkNNT0xUX1BPTEFSSVRZX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcG9sYXJpdHk7CisKKy8qKiBQb2xsaW5nIEludGVydmFsLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsCit7CisgICAgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfUE9MTElOR19ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBObyBwb2xsaW5nIGdhdGVzIHdpbGwgYmUgc2VudCB0byB0aGlzIExMSUQuICovCisgICAgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfVVNfNTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwMCwgICAgICAgICAgLyoqPCA1MDAgdXMuICovCisgICAgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMDAsICAgICAgICAgLyoqPCAxIG1zLiAqLworICAgIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX01TXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDAwLCAgICAgICAgIC8qKjwgMiBtcy4gKi8KKyAgICBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU180ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAwMCwgICAgICAgICAvKio8IDQgbXMuICovCisgICAgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwMDAsICAgICAgICAgLyoqPCA4IG1zLiAqLworICAgIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX01TXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjAwMCwgICAgICAgIC8qKjwgMTYgbXMuICovCisgICAgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfQVVUT01BVElDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNDc0ODM2NDdMICAgLyoqPCBGaXJtd2FyZSB3aWxsIGNob29zZSBhbiBhcHByb3ByaWF0ZSB2YWx1ZS4gKi8KK30gYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWw7CisKKy8qKiBQT04gT3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9wb25fb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX1BPTl9PUEVSQVRJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1BPTl9PUEVSQVRJT05fSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJbmFjdGl2ZS4gKi8KKyAgICBCQ01PTFRfUE9OX09QRVJBVElPTl9BQ1RJVkVfV09SS0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFjdGl2ZSBXb3JraW5nLiAqLworICAgIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9TVEFOREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQWN0aXZlIFN0YW5kYnkuICovCisgICAgQkNNT0xUX1BPTl9PUEVSQVRJT05fX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9wb25fb3BlcmF0aW9uOworCisvKiogUE9OIFByb3RlY3Rpb24gU3dpdGNoaW5nIE9wdGlvbnMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zCit7CisgICAgQkNNT0xUX1BPTl9QUk9URUNUSU9OX1NXSVRDSElOR19PUFRJT05TX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1BPTl9QUk9URUNUSU9OX1NXSVRDSElOR19PUFRJT05TX1NXSUZUX1BPUFVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAvKio8IElmIHNldCwgc3dpdGNob3ZlcnMgd2lsbCB1dGlsaXplIHRoZSBTd2lmdF9QT1BVUCBhbmQgUmFuZ2luZ19BZGp1c3RtZW50IFBMT0FNcyBhZGRlZCBpbiBHLjk4NCBhbm5leCBELiAqLworICAgIEJDTU9MVF9QT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfT1BUSU9OU19ERUJVR19GQVNUX1JBTkdJTkcgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIgICAgLyoqPCBJZiBzZXQsIE9OVSBFUURzIHdpbGwgbm90IGJlIGNhbGN1bGF0ZWQgYXMgcGFydCBvZiBhIHN3aXRjaG92ZXIuICBJbnN0ZWFkLCBlYWNoIE9OVSdzIG5ldyBFUUQgd2lsbCBiZSBlcXVhbCB0byBpdHMgbGFzdCBFUUQgd2hlbiB0aGUgUE9OIE5JIHdhcyBpbiBhY3RpdmUtd29ya2luZyBzdGF0ZS4gIFRoaXMgcHJvdmlkZXMgYSBmYXN0IHN3aXRjaG92ZXIsIGJ1dCBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSB0cnVuayBkaXN0YW5jZSBuZXZlciBjaGFuZ2VzLiAqLworfSBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnM7CisKKy8qKiBQT04gc3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3Bvbl9zdGF0ZQoreworICAgIEJDTU9MVF9QT05fU1RBVEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBJbmFjdGl2ZS4gKi8KKyAgICBCQ01PTFRfUE9OX1NUQVRFX1BST0NFU1NJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgUHJvY2Vzc2luZy4gKi8KKyAgICBCQ01PTFRfUE9OX1NUQVRFX0FDVElWRV9XT1JLSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgQWN0aXZlIFdvcmtpbmcuICovCisgICAgQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfU1RBTkRCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IEFjdGl2ZSBTdGFuZGJ5LiAqLworICAgIEJDTU9MVF9QT05fU1RBVEVfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9wb25fc3RhdGU7CisKKy8qKiBwb3dlciBsZXZlbGxpbmcgY29udHJvbC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wKK3sKKyAgICBCQ01PTFRfUE9XRVJfTEVWRUxMSU5HX0NPTlRST0xfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUE9XRVJfTEVWRUxMSU5HX0NPTlRST0xfRElSRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEaXJlY3QuICovCisgICAgQkNNT0xUX1BPV0VSX0xFVkVMTElOR19DT05UUk9MX0RFQ1JFQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRGVjcmVhc2UuICovCisgICAgQkNNT0xUX1BPV0VSX0xFVkVMTElOR19DT05UUk9MX0lOQ1JFQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgSW5jcmVhc2UuICovCisgICAgQkNNT0xUX1BPV0VSX0xFVkVMTElOR19DT05UUk9MX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sOworCisvKiogVGhlIHJlYXNvbiB0aGF0IGEgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24KK3sKKyAgICBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9QT1dFUl9NQU5BR0VNRU5UX0VOQUJMRUQgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBIb3N0IHJlcXVlc3RlZCBwb3dlciBtYW5hZ2VtZW50IGVuYWJsZS4gKi8KKyAgICBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9QT1dFUl9NQU5BR0VNRU5UX0RJU0FCTEVEICAgICAgICAgICAgID0gMSwgICAgLyoqPCBIb3N0IHJlcXVlc3RlZCBwb3dlciBtYW5hZ2VtZW50IGRpc2FibGUuICovCisgICAgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9BV0FLRSAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmVjZWl2ZWQgc2xlZXAgcmVxdWVzdCBQTE9BTSBmcm9tIE9OVS4gKi8KKyAgICBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9TTEVFUF9SRVFVRVNUX0RPWkUgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBSZWNlaXZlZCBzbGVlcCByZXF1ZXN0IFBMT0FNIGZyb20gT05VLiAqLworICAgIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfU0xFRVAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFJlY2VpdmVkIHNsZWVwIHJlcXVlc3QgUExPQU0gZnJvbSBPTlUuICovCisgICAgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9XQVRDSCAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUmVjZWl2ZWQgc2xlZXAgcmVxdWVzdCBQTE9BTSBmcm9tIE9OVS4gKi8KKyAgICBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9URVJJX0VYUElSRUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBUZXJpIHRpbWVyIGV4cGlyZWQuIEl0IGhhcyBiZWVuIHRvbyBsb25nIHNpbmNlIHdlIGhhdmUgcmVjZWl2ZWQgYW4gdXBzdHJlYW0gYnVyc3QgZnJvbSBhbiBPTlUgaW4gYSBsb3cgcG93ZXIgc3RhdGUuICovCisgICAgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fVEFMRVJURURfRVhQSVJFRCAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgVGFsZXJ0ZWQgdGltZXIgZXhwaXJlZC4gSXQgaGFzIGJlZW4gdG9vIGxvbmcgc2luY2UgdGhlIE9OVSB3YXMgcmVxdWVzdGVkIHRvIHdha2UgdXAgd2l0aCBubyBpZGljYXRpb24gdGhhdCBpdCBoYXMgY29tcGxpZWQuICovCisgICAgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgQSBMT1NpL0xPRmkvTE9CaSBhbGFybSBoYXMgYmVuIHJhaXNlZCBhZ2FpbnN0IHRoZSBPTlUuICovCisgICAgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb247CisKKy8qKiBQUkJTIFBvbHlub21pYWwuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3ByYnNfcG9seW5vbWlhbAoreworICAgIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBSQlNfNy4gKi8KKyAgICBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQUkJTXzkuICovCisgICAgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUFJCU18xMS4gKi8KKyAgICBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBQUkJTXzE1LiAqLworICAgIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18yMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFBSQlNfMjMuICovCisgICAgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUFJCU18zMS4gKi8KKyAgICBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBQUkJTXzU4LiAqLworICAgIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcHJic19wb2x5bm9taWFsOworCisvKiogUFJCUyBjaGVja2VyIG1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlCit7CisgICAgQkNNT0xUX1BSQlNfQ0hFQ0tFUl9NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1BSQlNfQ0hFQ0tFUl9NT0RFX1NFTEZfU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU2VsZi1zeW5jIG1vZGUgdy8gaHlzdGVyZXNpcy4gUFJCUyBzZWVkIHJlZ2lzdGVyIGlzIGNvbnRpbnVvdXNseSBzZWVkZWQgd2l0aCBwcmV2aW91cyByZWNlaXZlZCBiaXRzLiAgVGhpcyBtb2RlIHJlc3VsdHMgaW4gZmFzdGVyIGxvY2tpbmcsIGJ1dCBiaXQgZXJyb3JzIGFyZSBjb3VudGVkIG11bHRpcGxlIHRpbWVzIChvZnRlbiBieSAzeCkuICAqLworICAgIEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9JTklUSUFMX1NFRURfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEluaXRpYWwgc2VlZCBtb2RlIHcvIGh5c3RlcmVzaXMuIFBSQlMgc2VlZCByZWdpc3RlcnMgaXMgc2VlZGVkIHdpdGggcHJldmlvdXMgcmVjZWl2ZWQgYml0cyBvbmx5IHRpbGwgUFJCUyBsb2NrIGlzICBhY3F1aXJlZCBhbmQgdGhlbiB0aGV5IHJ1biBsb2NhbGx5IGluZGVwZW5kZW50bHkgZnJvbSB0aGUgcmVjZWl2ZWQgZGF0YSB1bnRpbCB0aGUgY2hlY2tlciBnb2VzIG91dCBvZiBQUkJTIGxvY2suICAqLworICAgIEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9JTklUSUFMX1NFRURfTU9ERV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEluaXRpYWwgc2VlZCBtb2RlIHcvbyBoeXN0ZXJlc2lzLiBTaW1pbGFyIHRvIG1vZGUgMSBhYm92ZSBleGNlcHQgb25jZSBsb2NrZWQgaXQgc3RheXMgbG9ja2VkIHVudGlsIFBSQlMgaXMgZGlzYWJsZWQuICAgICovCisgICAgQkNNT0xUX1BSQlNfQ0hFQ0tFUl9NT0RFX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcHJic19jaGVja2VyX21vZGU7CisKKy8qKiBQUkJTIExvY2sgU3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3ByYnNfbG9ja19zdGF0ZQoreworICAgIEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfVU5MT0NLRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBSQlMgQ2hlY2tlciBpcyBvdXQgb2YgTE9DSyBzdGF0ZSBhbmQgc3RhdGUgbWFjaGluZSBpcyBzZWFyY2hpbmcgZm9yIGEgTE9DSyAqLworICAgIEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfTE9DS0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFBSQlMgQ2hlY2tlciBpcyBpbiBMT0NLRUQgc3RhdGUgKi8KKyAgICBCQ01PTFRfUFJCU19MT0NLX1NUQVRFX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3ByYnNfbG9ja19zdGF0ZTsKKworLyoqIFBvc3NpYmxlIFJhbWFuIE1pdGlnYXRpb24gc2V0dGluZ3MuICBSYW1hbiBtaXRpZ2F0aW9uIGluamVjdHMgcHNldWRvLW5vaXNlIAorICogaW50byB0aGUgMUcgZG93bnN0cmVhbSBkYXRhIHBhdGggdG8gcmVkdWNlIGludGVyZmVyZW5jZSB3aXRoIGFuYWxvZyB2aWRlbyAKKyAqIHNpZ25hbHMgb24gb3RoZXIgd2F2ZWxlbmd0aHMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZQoreworICAgIEJDTU9MVF9SQU1BTl9NSVRJR0FUSU9OX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9SQU1BTl9NSVRJR0FUSU9OX01PREVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vIHBhY2tldHMgYXJlIGdlbmVyYXRlZC4gKi8KKyAgICBCQ01PTFRfUkFNQU5fTUlUSUdBVElPTl9NT0RFX1JBTkRPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQc2V1ZG8tcmFuZG9tIHBhY2tldHMgYXJlIGdlbmVyYXRlZC4gKi8KKyAgICBCQ01PTFRfUkFNQU5fTUlUSUdBVElPTl9NT0RFX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBGaXhlZCBiYWNrZ3JvdW5kIHBhY2tldHMgYXJlIGdlbmVyYXRlZC4gKi8KKyAgICBCQ01PTFRfUkFNQU5fTUlUSUdBVElPTl9NT0RFX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlOworCisvKiogUmFuZ2luZyBmYWlsIHJlYXNvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vbmUuICovCisgICAgQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fUkFOR0lOR19BQ0tfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcmFuZ2luZyBhY2sgdGltZW91dC4gKi8KKyAgICBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9EQVRBX01JU01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBwbG9hbSBkYXRhIG1pc21hdGNoLiAqLworICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1BMT0FNX1RZUEVfTUlTTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IHBsb2FtIHR5cGUgbWlzbWF0Y2guICovCisgICAgQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fUExPQU1fT05VX0lEX01JU01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgcGxvYW0gb251IGlkIG1pc21hdGNoLiAqLworICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0RSSUZUX0VYQ0VFREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IGRyaWZ0IGV4Y2VlZGVkLiAqLworICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX05PX1BMT0FNX1JFQ0VJVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IG5vIHBsb2FtIHJlY2VpdmVkLiAqLworICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0xPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IGxvcy4gKi8KKyAgICBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9BTEFSTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBhbGFybXMuICovCisgICAgQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbjsKKworLyoqIFJlZ2lzdHJhdGlvbiBCZWhhdmlvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yCit7CisgICAgQkNNT0xUX1JFR0lTVFJBVElPTl9CRUhBVklPUl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1JFR0lTVFJBVElPTl9CRUhBVklPUl9BVVRPTUFUSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWxsIGxpbmtzIHdpbGwgYmUgYWxsb3dlZCB0byByZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfUkVHSVNUUkFUSU9OX0JFSEFWSU9SX05PVElGWV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaW5rcyB0aGF0IGFyZSBub3QgcHJlLXByb3Zpc2lvbmVkIHdpbGwgbm90IGJlIGFsbG93ZWQgdG8gcmVnaXN0ZXIuICBBIG1hc2thYmxlIGluZGljYXRpb24gd2lsbCBiZSBzZW50IHRvIHRoZSBob3N0IHdoaWNoIGNhbiB0aGVuIGRlY2lkZSBpZiB0aGUgbGluayBzaG91bGQgYmUgcHJvdmlzaW9uZWQuICovCisgICAgQkNNT0xUX1JFR0lTVFJBVElPTl9CRUhBVklPUl9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcjsKKworLyoqIHJlcXVlc3QgcmVnaXN0cmF0aW9uIGZhaWwgcmVhc29uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX1JFR0lTVFJBVElPTl9QTE9BTV9USU1FT1VUICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcmVnaXN0cmF0aW9uIHBsb2FtIHRpbWVvdXQuICovCisgICAgQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX09OVV9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgb251IGFsYXJtLiAqLworICAgIEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9ERUFDVElWQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IGRlYWN0aXZhdGlvbi4gKi8KKyAgICBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBkaXNhYmxlLiAqLworICAgIEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uOworCisvKiogUmVzdWx0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9yZXN1bHQKK3sKKyAgICBCQ01PTFRfUkVTVUxUX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdWNjZXNzLiAqLworICAgIEJDTU9MVF9SRVNVTFRfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZhaWwuICovCisgICAgQkNNT0xUX1JFU1VMVF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcmVzdWx0OworCisvKiogVHlwZSBvZiB0aGUgcm9ndWUgZGV0ZWN0aW9uIGFsZ29yaXRobS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlCit7CisgICAgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT04gICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRmlybXdhcmUtZHJpdmVuIHBlcmlvZGljIHByb2Nlc3Mgd2hpY2ggcnVucyBpbiB0aGUgYmFja2dyb3VuZCB0byBkZXRlY3QgdGhlIHBvdGVudGlhbCByb2d1ZSBPTlUuICovCisgICAgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVXNlIHRoZSB1c2VyLXByb3Zpc2lvbmVkIHNwZWNpYWwgYmFuZHdpZHRoIG1hcCB1bnRpbCBpdCBpcyB0b2xkIHRvIHN0b3AuICovCisgICAgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgRGVzdHJ1Y3RpdmUgdG9vbCB0aGF0IGV4dGVuZHMgdGhlIGd1YXJkIHRpbWUgb24gYWxsIGJ1cnN0cy4gKi8KKyAgICBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGU7CisKKy8qKiBSb2d1ZSBPTlUgZGV0ZWN0aW9uIG1lYXN1cmVtZW50IHR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cKK3sKKyAgICBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19TSUxFTlRfV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTaWxlbnQgd2luZG93IG1lYXN1cmVtZW50LiAqLworICAgIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0NVVF9PRkZfV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEN1dC1vZmYgd2luZG93IG1lYXN1cmVtZW50LiAqLworICAgIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93OworCisvKiogU3RhdHVzIG9mIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uIHJlc3VsdC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0Cit7CisgICAgQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9SU1NJX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUm9ndWUgT05VIFJTU0kgZGV0ZWN0aW9uIGFjdGl2aXR5IGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX05PVF9QRVJGT1JNRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBSb2d1ZSBPTlUgZGV0ZWN0aW9uIG5vdCBwZXJmb3JtZWQuICovCisgICAgQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9ST0dVRV9DWUNMRV9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUm9ndWUgT05VIGN5Y2xlIGRldGVjdGlvbiBzdG9wcGVkLiAqLworICAgIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUgUlNTSSBtZWFzdXJlbWVudC4gKi8KKyAgICBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfTk9UX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBUaGUgUlNTSSBtZXNhdXJlbWVudCB3YXMgbm90IGNvbXBsZXRlLiAqLworICAgIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQ7CisKKy8qKiBSb2d1ZSBTY2FuIEluZGljYXRpb24gU3RhdHVzIC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXMKK3sKKyAgICBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSb2d1ZSBTY2FuIHdhcyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX0xMSURfU1RBVEVfSVNfQkFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgbGxpZCBpbiB0YXJnZXRlZCBzY2FuIHdhcyBhbiBhY3RpdmUgbGluay4gKi8KKyAgICBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfTExJRF9JU19PT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBsbGlkIGluIHRhcmdldGVkIHNjYW4gaXMgb3V0IG9mIHJhbmdlIGZvciBwb24uICovCisgICAgQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX1NDQU5fRVJSX05PUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgVGhlcmUgd2VyZSBubyBhdmFpbGFibGUgTElNIGluZGV4ZXMgZm9yIHRoZSBzY2FuLi4gKi8KKyAgICBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBBbiBpbnRlcm5hbCBzb2Z0d2FyZSB3YXMgZW5jb3VudGVyZWQuLiAqLworICAgIEJDTU9MVF9ST0dVRV9TQ0FOX1NUQVRVU19fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzOworCisvKiogUlNTSSBtZWFzdXJlbWVudCBmYWlsIHJlYXNvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX1JTU0lfTUVBU1VSRU1FTlRfRkFJTF9SRUFTT05fTk9fREVMSU1JVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTm8gZGVsaW1pdGVyLiAqLworICAgIEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX05PX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IE5vIGFjY2Vzcy4gKi8KKyAgICBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb247CisKKy8qKiBzZWN1cmUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIGZhaWwgcmVhc29uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uCit7CisgICAgQkNNT0xUX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc2VjdXJlIG11dHVhbCBhdXRoZW50aWNhdGlvbiB0aW1lb3V0LiAqLworICAgIEJDTU9MVF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbjsKKworLyoqIHNlcmRlcyByYW5naW5nIG1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUKK3sKKyAgICBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9FRF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBlZCBtb2RlLiAqLworICAgIEJDTU9MVF9TRVJERVNfUkFOR0lOR19NT0RFX0JDRFJfUkVTRVRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEJDRFIgcmVzZXQgbW9kZS4gKi8KKyAgICBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9GQVNUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBmYXN0IG1vZGUuICovCisgICAgQkNNT0xUX1NFUkRFU19SQU5HSU5HX01PREVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZTsKKworLyoqIFNlckRlcyBJbnN0YW5jZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfc2VyZGVzX2luc3RhbmNlCit7CisgICAgQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9JTlNUQU5DRV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUHJpbWFyeSBTZXJkZXMsIG9yIDEwRyBTZXJEZXMgZm9yIEVQT04gcG9uX2lkcy4gKi8KKyAgICBCQ01PTFRfU0VSREVTX0lOU1RBTkNFX0lOU1RBTkNFXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTZWNvbmRhcnkgU2VyZGVzLCBvciAxRy8yRyBTZXJEZXMgZm9yIEVQT04gcG9uX2lkcy4gKi8KKyAgICBCQ01PTFRfU0VSREVTX0lOU1RBTkNFX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3NlcmRlc19pbnN0YW5jZTsKKworLyoqIFNoYXBlciBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zaGFwZXJfbW9kZQoreworICAgIEJDTU9MVF9TSEFQRVJfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9TSEFQRVJfTU9ERV9MQVlFUl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFNoYXBlcnMgd2lsbCBjb3VudCBJUEcsIHByZWFtYmxlLCBmcmFtZSwgYW5kIEZDUyAqLworICAgIEJDTU9MVF9TSEFQRVJfTU9ERV9MQVlFUl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFNoYXBlcnMgd2lsbCBjb3VudCBmcmFtZSBhbmQgRkNTLiAqLworICAgIEJDTU9MVF9TSEFQRVJfTU9ERV9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9zaGFwZXJfbW9kZTsKKworLyoqIEFsbCBwb3NzaWJsZSBzdGF0aXN0aWMgYWxhcm0gdHJpZ2dlciBjb25kaXRpb25zLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlCit7CisgICAgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIGFsYXJtIGlzIGRpc2FibGVkLiAqLworICAgIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFRoZSBhbGFybSBpcyB0cmlnZ2VyZWQgaWYgdGhlIHN0YXRzIGRlbHRhIHZhbHVlIGJldHdlZW4gc2FtcGxlcyBjcm9zc2VzIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZCBib3VuZGFyeS4gKi8KKyAgICBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBUaGUgYWxhcm0gaXMgdHJpZ2dlcmVkIGlmIHRoZSBzdGF0cyBkZWx0YSB2YWx1ZSBiZXR3ZWVuIHNhbXBsZXMgZGV2aWF0ZXMgZnJvbSB0aGUgY29uZmlndXJlZCByYW5nZS4gKi8KKyAgICBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBzYW1wbGUgdmFsdWUgYmVjb21lcyBncmVhdGVyIHRoYW4gdGhpcyBsZXZlbC4gIFRoZSBhbGFybSBpcyBjbGVhcmVkIHdoZW4gdGhlIGhvc3QgcmVhZCB0aGUgc3RhdHMuICovCisgICAgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZTsKKworLyoqIFN3aXRjaCBvdmVyIHR5cGUgYyBvbnUgc3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGUKK3sKKyAgICBCQ01PTFRfU1dJVENIX09WRVJfVFlQRV9DX09OVV9TVEFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfU1dJVENIX09WRVJfVFlQRV9DX09OVV9TVEFURV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBY3RpdmUuICovCisgICAgQkNNT0xUX1NXSVRDSF9PVkVSX1RZUEVfQ19PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQWN0aXZlIHN0YW5kYnkuICovCisgICAgQkNNT0xUX1NXSVRDSF9PVkVSX1RZUEVfQ19PTlVfU1RBVEVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlOworCisvKiogU3lzdGVtIHdvcmtpbmcgbW9kZSAoR1BPTi9FUE9OIGV0Yy4pIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3N5c3RlbV9tb2RlCit7CisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgMTZ4IEdQT04gKi8KKyAgICBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCA4eCBHUE9OICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzRfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNHggR1BPTiAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IDE2eCBFUE9OICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgOHggWEdQT04xICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF9DT0VYSVNURU5DRV9URE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgOHggRVBPTiBjb2V4aXN0ZW5jZSBURE1BICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0FFXzhfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgOHggMTBHIEFjdGl2ZSBFdGhlcm5ldCAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfMTBfRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IDh4IEVQT04gKDEwLzEwIG9ubHkpICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgOHggR1BPTiA0eCBYR1BPTiBjb2V4aXN0ZW5jZSAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IDh4IEVQT04gKDEvMSBvbmx5KSAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IDR4IEVQT04gKDEvMSBvbmx5KSAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IDR4IEVQT04gY29leGlzdGVuY2UgVERNQSAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IDR4IEVQT04gKDEwLzEwIG9ubHkpICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX1hHU19fMl9YXzEwX0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgMnggWEdTLVBPTiAoMTAvMTApICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fMl9YXzEwX0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgMnggTkdQT04yICgxMC8xMCkgKi8KKyAgICBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX184X1hfMl9QXzVfRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCA4eCBOR1BPTjIgKDEwLzIuNSkgKi8KKyAgICBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgLyoqPCA0eCBYR1BPTjEgKi8KKyAgICBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCAyeCBFUE9OICgxMC8xMCBvbmx5KSAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9zeXN0ZW1fbW9kZTsKKworLyoqIFVTIG9wZXJhdGluZyB3YXZlbGVuZ3RoIGJhbmRzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcworeworICAgIEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19FWFBBTkRFRF9TUEVDVFJVTV9XSURFX0JBTkQgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEV4cGFuZGVkIHNwZWN0cnVtIHdpZGUgYmFuZCBvcHRpb24gKi8KKyAgICBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfRVhQQU5ERURfU1BFQ1RSVU1fUkVEVUNFRF9CQU5EICAgICAgICAgICAgID0gMSwgICAgLyoqPCBFeHBhbmRlZCBzcGVjdHJ1bSByZWR1Y2VkIGJhbmQgb3B0aW9uICovCisgICAgQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX0VYUEFOREVEX1NQRUNUUlVNX05BUlJPV19CQU5EICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgRXhwYW5kZWQgc3BlY3RydW0gcmVkdWNlZCBiYW5kIG9wdGlvbiAqLworICAgIEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19TSEFSRURfU1BFQ1RSVU1fV0lERV9CQU5EICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFNoYXJlZCBzcGVjdHJ1bSB3aWRlIGJhbmQgb3B0aW9uICovCisgICAgQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX1NIQVJFRF9TUEVDVFJVTV9SRURVQ0VEX0JBTkQgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgU2hhcmVkIHNwZWN0cnVtIHJlZHVjZWQgYmFuZCBvcHRpb24gKi8KKyAgICBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfU0hBUkVEX1NQRUNUUlVNX05BUlJPV19CQU5EICAgICAgICAgICAgICAgID0gMTggICAgLyoqPCBTaGFyZWQgc3BlY3RydW0gd2lkZSBuYXJyb3cgb3B0aW9uICovCit9IGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kczsKKworLyoqIFRyYWZmaWMgcmVzdW1lIHJlc3VsdC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0Cit7CisgICAgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBGYWlsdXJlLiAqLworICAgIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfU1VTUEVDVEVEX0xPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IHN1c3BlY3RlZF9sb3MuICovCisgICAgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdDsKKworLyoqIHRyeCBjYWxpYnJhdGlvbiB0cmlnZ2VyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcgoreworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9FUE9OX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGVwb24gc3RhdC4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfR1BPTl9CQ0RSX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBncG9uIGJjZHIgcmVzZXQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fVFJYX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgZ3BvbiB0cnggcmVzZXQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fVFJYX0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgZ3BvbiB0cnggZWQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fUlNTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgZ3BvbiByc3NpLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX0VPQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IGdwb24gZW9iLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1JBTkdJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IGdwb24gcmFuZ2luZy4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfU0VSREVTX0JVUlNUX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBzZXJkZXMgYnVyc3QgZW4uICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyOworCisvKiogdHJ4IGNhbGlicmF0aW9uIHRyaWdnZXIgcG9zaXRpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uCit7CisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX1BPU0lUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX1BPU0lUSU9OX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcmlzaW5nIGVkZ2UuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX1BPU0lUSU9OX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgZmFsbGluZyBlZGdlLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9QT1NJVElPTl9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uOworCisvKiogdHJ4IGNhbGlicmF0aW9uIHdpbmRvdyBtb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUKK3sKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX1JBTkdJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCByYW5naW5nLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfTk9OX1JBTkdJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IG5vbiByYW5naW5nLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfQk9USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IHJhbmdpbmcgYW5kIG5vbiByYW5naW5nLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlOworCisvKiogVFJYIHR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3RyeF90eXBlCit7CisgICAgQkNNT0xUX1RSWF9UWVBFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1RSWF9UWVBFX1NQU180M180OF9IX0hQX0NERV9TRF8yMDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU291cmNlUGhvdG9uaWNzIC0gU1BTLTQzLTQ4SC1IUC1DREUtU0QgUmVzZXQgaXMgcmVxdWlyZWQgQkVGT1JFLCBUUlggaXMgU3F1ZWxjaGVkLiB0aWxsIDIwMTMgcmV2LiAgKi8KKyAgICBCQ01PTFRfVFJYX1RZUEVfU09HXzQzMjFfUFNHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdXBlcnhvbiBCKyB0eXBlICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgTElHRU5UIExURTM2ODBNLiAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9TT1VSQ0VfUEhPVE9OSUNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFNvdXJjZSBQaG90b25pY3MuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfVFlQRV9DX1BMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgTElHRU5UIExURTM2ODBQX1RZUEVfQ19QTFVTLiAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9BTlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEFueS4gKi8KKyAgICBCQ01PTFRfVFJYX1RZUEVfQU5ZX1JFU0VUX0dVQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBBbnkgcmVzZXQgZ3VhcmQuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0FOWV9SRVNFVF9QUkVBTUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgQW55IHJlc2V0IHByZWFtYmxlLiAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9XVERfUlRYTV8xNjdfNTI2X0NQTFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IFdURCBSVFhNMTY3IDUyNiBDKy4gKi8KKyAgICBCQ01PTFRfVFJYX1RZUEVfV1REX1JUWE1fMTY3XzUyMl9CUExVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBXVEQgUlRYTTE2NyA1MjIgQisuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgTElHRU5UIEhpU2Vuc2UgTFRFMzY4MFAtQkMuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX1NPR1FfNDMyMV9QU0dCX0NfUExVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgU3VwZXJ4b24gQysgdHlwZSAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9XVERfUlRYTTE2N181MjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IFdURCBSVFhNMTY3XzUyMS4gKi8KKyAgICBCQ01PTFRfVFJYX1RZUEVfTFRFMzY3OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBMVEUzNjc4LiAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9TT0dQXzQzMjFfUFNHQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IFN1cGVyeG9uIFNPR1A0MzIxLVBTR0EuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDEuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDIuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDMuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDQuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDUuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDYuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDcuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDguICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF85ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDkuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF8xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDEwLiAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IGdwb24gZ2VuZXJhbCAxMS4gKi8KKyAgICBCQ01PTFRfVFJYX1RZUEVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90cnhfdHlwZTsKKworLyoqIFR1bmUgaW4gZmFpbCByZWFzb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24KK3sKKyAgICBCQ01PTFRfVFVORV9JTl9GQUlMX1JFQVNPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfVFVORV9JTl9GQUlMX1JFQVNPTl9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBub25lLiAqLworICAgIEJDTU9MVF9UVU5FX0lOX0ZBSUxfUkVBU09OX05PX1RVTklOR19SRVNQT05TRV9QTE9BTV9SRUNFSVZFRCAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE5vIHR1bmluZyByZXNwb25zZSBwbG9hbSByZWNlaXZlZC4gKi8KKyAgICBCQ01PTFRfVFVORV9JTl9GQUlMX1JFQVNPTl9PTlVfQUNUSVZBVElPTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBvbnUgYWN0aXZhdGlvbiBmYWlsZWQuICovCisgICAgQkNNT0xUX1RVTkVfSU5fRkFJTF9SRUFTT05fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbjsKKworLyoqIFR1bmUgb3V0IGZhaWwgcmVhc29uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vbmUuICovCisgICAgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX05BQ0tfUExPQU1fUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTkFDSyBwbG9hbSByZWNlaXZlZC4gKi8KKyAgICBCQ01PTFRfVFVORV9PVVRfRkFJTF9SRUFTT05fTk9fVFVOSU5HX1JFU1BPTlNFX1BMT0FNX1JFQ0VJVkVEICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBubyB0dW5pbmcgcmVzcG9uc2UgcGxvYW0gcmVjZWl2ZWQuICovCisgICAgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX1RTT1VSQ0VfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgdHNvdXJjZSB0aW1lb3V0LiAqLworICAgIEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9ST0xMQkFDS19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHJvbGxiYWNrIHJlcXVlc3QuICovCisgICAgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb247CisKKy8qKiBVQVJUIGJhdWQgcmF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdWFydF9iYXVkcmF0ZQoreworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV80ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFVBUlQgcmF0ZSA0ODAwLiAqLworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV85NjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFVBUlQgcmF0ZSA5NjAwLiAqLworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8xNDQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFVBUlQgcmF0ZSAxNDQwMC4gKi8KKyAgICBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMTkyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBVQVJUIHJhdGUgMTkyMDAuICovCisgICAgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzM4NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgVUFSVCByYXRlIDM4NDAwLiAqLworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV81NzYwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFVBUlQgcmF0ZSA1NzYwMC4gKi8KKyAgICBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMTE1MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBVQVJUIHJhdGUgMTE1MjAwLiAqLworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8yMzA0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFVBUlQgcmF0ZSAyMzA0MDAuICovCisgICAgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzM4MDQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgVUFSVCByYXRlIDM4MDQwMC4gKi8KKyAgICBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfNDYwODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBVQVJUIHJhdGUgNDYwODAwLiAqLworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV85MjE2MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IFVBUlQgcmF0ZSA5MjE2MDAuICovCisgICAgQkNNT0xUX1VBUlRfQkFVRFJBVEVfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF91YXJ0X2JhdWRyYXRlOworCisvKiogdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uCit7CisgICAgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgZGF0YS4gKi8KKyAgICBCQ01PTFRfVVNfR0VNX1BPUlRfREVTVElOQVRJT05fQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBjcHUuICovCisgICAgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgb21jaS4gKi8KKyAgICBCQ01PTFRfVVNfR0VNX1BPUlRfREVTVElOQVRJT05fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb247CisKKy8qKiBVUyBWTEFOIGFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdXNfdmxhbl9hY3Rpb24KK3sKKyAgICBCQ01PTFRfVVNfVkxBTl9BQ1RJT05fQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBBZGQuICovCisgICAgQkNNT0xUX1VTX1ZMQU5fQUNUSU9OX1RSQU5TUEFSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgIC8qKjwgVHJhbnNwYXJlbnQuICovCit9IGJjbW9sdF91c192bGFuX2FjdGlvbjsKKworLyoqIFZMQU4gdG8gZmxvdyBtYXBwaW5nIG1ldGhvZC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kCit7CisgICAgQkNNT0xUX1ZMQU5fVE9fRkxPV19NQVBQSU5HX01FVEhPRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1ZMQU5fVE9fRkxPV19NQVBQSU5HX01FVEhPRF9WSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVklELiAqLworICAgIEJDTU9MVF9WTEFOX1RPX0ZMT1dfTUFQUElOR19NRVRIT0RfTUFDUExVU1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE1BQytWSUQuICovCisgICAgQkNNT0xUX1ZMQU5fVE9fRkxPV19NQVBQSU5HX01FVEhPRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2Q7CisKKy8qKiBYR1BPTiBHRU0gUG9ydCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUKK3sKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVEVfTk9UX0NPTkZJR1VSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBub3QgY29uZmlndXJlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVEVfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBpbmFjdGl2ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVEVfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgLyoqPCBhY3RpdmUuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZTsKKworLyoqIHhncG9uIG51bSBvZiBvbnVzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cworeworICAgIEJDTU9MVF9YR1BPTl9OVU1fT0ZfT05VU19fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OVU1fT0ZfT05VU19YR1BPTl9TVVBQT1JUXzI1Nl9PTlVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHhncG9uIHN1cHBvcnQgMjU2IG9udXMuICovCisgICAgQkNNT0xUX1hHUE9OX05VTV9PRl9PTlVTX1hHUE9OX1NVUFBPUlRfNTEwX09OVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgeGdwb24gc3VwcG9ydCA1MTAgb251cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251czsKKworLyoqIHhncG9uIHNlcmRlcyByYW5naW5nIG1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGUKK3sKKyAgICBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9CQ0RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBiY2RyLiAqLworICAgIEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0ZBU1RfUkFOR0lORzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGZhc3QgcmFuZ2luZzEuICovCisgICAgQkNNT0xUX1hHUE9OX1NFUkRFU19SQU5HSU5HX01PREVfRkFTVF9SQU5HSU5HMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgZmFzdCByYW5naW5nMi4gKi8KKyAgICBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGU7CisKKy8qKiBYR1BPTiBUUlggdHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fdHJ4X3R5cGUKK3sKKyAgICBCQ01PTFRfWEdQT05fVFJYX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRIXzcyMjJfUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBMaWdlbnQgTFRIIDcyMjItUEMuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1VTRVJfREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVXNlciBEZWZpbmVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9XVERfUlRYTTI2Nl83MDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFdURF9SVFhNMjY2XzcwMi4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRIXzcyMjJfQkNfUExVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBTRlArICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUSF83MjI2X1BDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgWEdTICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUSF81MzAyX1BDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgMTBHIEVQT04gZm9yIFhHUyBtb2RlICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1hHUE9OX0dFTkVSQUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgeGdwb24gZ2VuZXJhbCAxLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9YR1BPTl9HRU5FUkFMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IHhncG9uIGdlbmVyYWwgMi4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRXXzYyN19YX1BDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBTdXBwb3J0cyBOR1BPTjIgVFJ4IGZvciB2YXJpb3VzIGNoYW5uZWxzICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1hQUF9YRV9SXzNfQ0RGQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgMTBHIEVQT04gZm9yIFhHUyBtb2RlICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl90cnhfdHlwZTsKKworLyoqIEFjdHVhbCBTY2hlZHVsZXIvU2hhcGVyLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIKK3sKKyAgICBiY21vbHRfdGltZV9xdWFudGEgYWN0dWFsX21ic190cTsgICAgICAgLyoqPCBBY3R1YWwgTUJTIChUUSkuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIGFjdHVhbF93ZWlnaHRfdHE7ICAgIC8qKjwgQWN0dWFsIFdlaWdodCAoVFEpLiAqLworfSBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcjsKKworLyoqIDEyOC1iaXQgQUVTIGtleSB1c2VkIGZvciBPTlUgYXV0aGVudGljYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVzX2tleQoreworICAgIHVpbnQ4X3QgYnl0ZXNbMTZdOyAgLyoqPCBCeXRlcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuICovCit9IGJjbW9sdF9hZXNfa2V5OworCisvKiogV2hhdCBwb3J0aW9uIG9mIHRoZSBjYXB0dXJlIGJ1ZmZlciB0byByZWFkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIKK3sKKyAgICB1aW50MzJfdCBvZmZzZXQ7ICAgIC8qKjwgVGhlIGJ5dGVzIG9mZnNldCB0byByZWFkIGZyb20uICovCisgICAgdWludDMyX3Qgc2l6ZTsgICAgICAvKio8IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4gKi8KK30gYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXI7CisKKy8qKiBDb25maWd1cmF0aW9uIGZvciBBUEkgY2FwdHVyZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcKK3sKKyAgICBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gbG9jYXRpb247ICAgLyoqPCBXaGVyZSB0byBwZXJmb3JtIHRoZSBBUEkgY2FwdHVyZS4gKi8KKyAgICB1aW50MzJfdCBidWZmZXJfc2l6ZV9ieXRlczsgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjYXB0dXJlLiAqLworICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZSBidWZmZXJfbW9kZTsgLyoqPCBXaGF0IHRvIGRvIHdoZW4gdGhlIGNhcHR1cmUgYnVmZmVyIGlzIGZ1bGwuICovCit9IGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWc7CisKKy8qKiBTdGF0aXN0aWNzIG9uIHRoZSBtb3N0IHJlY2VudCBBUEkgY2FwdHVyZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cworeworICAgIHVpbnQzMl90IGJ1ZmZlcl91c2VkX2J5dGVzOyAvKio8IFVzZWQgc3BhY2UgaW4gdGhlIGNhcHR1cmUgYnVmZmVyIChpbiBieXRlcykuICovCisgICAgdWludDMyX3QgYnVmZmVyX3dyYXBfY291bnQ7IC8qKjwgTnVtYmVyIG9mIHRpbWVzIHRoZSBjYXB0dXJlIGJ1ZmZlciBoYXMgd3JhcHBlZC4gKi8KKyAgICB1aW50MzJfdCBldmVudHNfcmVjb3JkZWQ7ICAgLyoqPCBOdW1iZXIgb2YgZXZlbnRzIHJlY29yZGVkIGluIHRoZSBjYXB0dXJlIGJ1ZmZlci4gKi8KKyAgICB1aW50MzJfdCBldmVudHNfZHJvcHBlZDsgICAgLyoqPCBOdW1iZXIgb2YgZXZlbnRzIGRyb3BwZWQgZHVlIHRvIG92ZXJmbG93LiAqLworICAgIHVpbnQzMl90IHJlYWRhYmxlX2J5dGVzOyAgICAvKio8IE51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gcmV0cmlldmUgY2FwdHVyZSBidWZmZXIuICovCit9IGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0czsKKworLyoqIEJvdW5kcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ib3VuZHMKK3sKKyAgICB1aW50MzJfdCBiZXN0X2Nhc2U7ICAgICAvKio8IEJlc3QgQ2FzZS4gKi8KKyAgICB1aW50MzJfdCB3b3JzdF9jYXNlOyAgICAvKio8IFdvcnN0IENhc2UuICovCit9IGJjbW9sdF9ib3VuZHM7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogOHggYm91bmRzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl9ib3VuZHNfOAoreworICAgIGJjbW9sdF9ib3VuZHMgYXJyWzhdOyAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfYm91bmRzXzg7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogOHggY2FsaWJyYXRpb25fcmVjb3JkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOAoreworICAgIGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQgYXJyWzhdOyAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzg7CisKKy8qKiBEUyBmcmVxdWVuY3kgb2Zmc2V0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQKK3sKKyAgICBiY21vbHRfc2lnbiBzaWduOyAgIC8qKjwgc2lnbi4gKi8KKyAgICB1aW50OF90IHZhbHVlOyAgICAgIC8qKjwgdmFsdWUuICovCit9IGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0OworCisvKiogQ2hhbm5lbCBQcm9maWxlIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfY2hhbm5lbF9wcm9maWxlCit7CisgICAgdWludDhfdCB2ZXJzaW9uOyAgICAgICAgLyoqPCBDaGFubmVsIHByb2ZpbGUgdmVyc2lvbiAqLworICAgIHVpbnQ4X3QgY2hhbm5lbF9pbmRleDsgIC8qKjwgQ2hhbm5lbCBwcm9maWxlIGluZGV4ICovCisgICAgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQgZHNfZnJlcXVlbmN5X29mZnNldDsgLyoqPCBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhY3R1YWwgT0xUIENUIFR4IGZyZXF1ZW5jeSBhbmQgdGhlIG5vbWluYWwgY2VudHJhbCBmcmVxdWVuY3kgZm9yIHRoZSBnaXZlbiBEV0xDSCBJRCwgZXhwcmVzc2VkIGluIHVuaXRzIG9mIDAuMUdIeiAqLworICAgIHVpbnQ4X3QgY2hhbm5lbF9wYXJ0aXRpb247ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2hhbm5lbCBwYXJ0aXRpb24gKi8KKyAgICB1aW50OF90IHV3bGNoX2lkOyAgICAgICAvKio8IFRoZSBhc3NpZ25lZCB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgSUQgKi8KKyAgICB1aW50MzJfdCB1c19mcmVxdWVuY3k7ICAvKio8IFRoZSBub21pbmFsIGNlbnRyYWwgZnJlcXVlbmN5IG9mIHRoZSB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgb3IgYSByb290IGZyZXF1ZW5jeSBvZiB0aGUgY3ljbGljIHNldCBvZiBjZW50cmFsIGZyZXF1ZW5jaWVzIGZvcm1pbmcgYW4gdXBzdHJlYW0gd2F2ZWxlbmd0aCBjaGFubmVsLCBpbmRpY2F0ZXMgdGhlIHZhbHVlIGluIHVuaXRzIG9mIDAuMSBHSHouICovCisgICAgYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgdXNfcmF0ZTsgLyoqPCBVUyByYXRlLiAqLworICAgIHVpbnQ4X3QgZGVmYXVsdF9vbnVfYXR0ZW51YXRpb247ICAgICAgICAgICAgICAgIC8qKjwgVGhlIGRlZmF1bHQgT05VIGF0dGVudWF0aW9uIGxldmVsIGluIHN0ZXBzIG9mIDNkQiAqLworICAgIHVpbnQ4X3QgcmVzcG9uc2VfdGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhyZXNob2xkIHJlcHJlc2VudCB0aGUgbWF4aW11bSBudW1iZXIgb2YgUGxvYW1zIHRoZSBPTlUgY2FuIHRyYW5zbWl0IGF0IG5vbi16ZXJvIGF0dGVudWF0aW9uIGxldmVsIHdoaWxlIGF0dGVtcHRpbmcgdG8gZXN0YWJsaXNoIGNvbW11bmljYXRpb24gd2l0aCBPTFQgQ1QgKi8KKyAgICBiY21vbHRfbGlua190eXBlIHVzX2xpbmtfdHlwZTsgICAgICAgICAgICAgICAgICAvKio8IFVTIGxpbmsgdHlwZS4gKi8KKyAgICBiY21vc19ib29sIGlzX3ZhbGlkOyAgICAvKio8IGlzIHZhbGlkLiAqLworfSBiY21vbHRfY2hhbm5lbF9wcm9maWxlOworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDh4IGNoYW5uZWxfcHJvZmlsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzgKK3sKKyAgICBiY21vbHRfY2hhbm5lbF9wcm9maWxlIGFycls4XTsgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzg7CisKKy8qKiBQb3dlciBjb25zdW1wdGlvbiByZXBvcnQgcGVyIGNoYW5uZWwgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydAoreworICAgIHVpbnQ4X3QgZHNfd2F2ZWxlbmd0aF9jaGFubmVsX2lkOyAgIC8qKjwgRG93bnN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgSUQgKi8KKyAgICB1aW50OF90IHVzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZDsgICAvKio8IFVwc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCBJRCAqLworICAgIHVpbnQxNl90IHBvd2VyX2NvbnN1bXB0aW9uOyAgICAgICAgIC8qKjwgUG93ZXIgY29uc3VtcHRpb24gKi8KK30gYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0OworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDh4IHBvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84Cit7CisgICAgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IGFycls4XTsgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84OworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDJ4IFUxNi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfdTE2XzIKK3sKKyAgICB1aW50MTZfdCBhcnJbMl07ICAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfdTE2XzI7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogMnggVTE2LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl91MTZfMl9oZXgKK3sKKyAgICB1aW50MTZfdCBhcnJbMl07ICAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfdTE2XzJfaGV4OworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDV4IFUxNi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfdTE2XzVfaGV4Cit7CisgICAgdWludDE2X3QgYXJyWzVdOyAgICAvKio8IEFycmF5LiAqLworfSBiY21vbHRfYXJyX3UxNl81X2hleDsKKworLyoqIEZpeGVkLUxlbmd0aCBsaXN0OiA3eCBVMTYuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYXJyX3UxNl83Cit7CisgICAgdWludDE2X3QgYXJyWzddOyAgICAvKio8IEFycmF5LiAqLworfSBiY21vbHRfYXJyX3UxNl83OworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDZ4IFUzMi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfdTMyXzYKK3sKKyAgICB1aW50MzJfdCBhcnJbNl07ICAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfdTMyXzY7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogMTB4IFU4LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl91OF8xMAoreworICAgIHVpbnQ4X3QgYXJyWzEwXTsgICAgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl91OF8xMDsKKworLyoqIEZpeGVkLUxlbmd0aCBsaXN0OiAxMnggVTguIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYXJyX3U4XzEyCit7CisgICAgdWludDhfdCBhcnJbMTJdOyAgICAvKio8IEFycmF5LiAqLworfSBiY21vbHRfYXJyX3U4XzEyOworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDEzeCBVOC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfdThfMTMKK3sKKyAgICB1aW50OF90IGFyclsxM107ICAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfdThfMTM7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogMzZ4IFU4LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl91OF8zNgoreworICAgIHVpbnQ4X3QgYXJyWzM2XTsgICAgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl91OF8zNjsKKworLyoqIEZpeGVkLUxlbmd0aCBsaXN0OiA0eCBVOC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfdThfNAoreworICAgIHVpbnQ4X3QgYXJyWzRdOyAvKio8IEFycmF5LiAqLworfSBiY21vbHRfYXJyX3U4XzQ7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogNDB4IFU4LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl91OF80MAoreworICAgIHVpbnQ4X3QgYXJyWzQwXTsgICAgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl91OF80MDsKKworLyoqIFhHUE9OIGJ1cnN0IHByb2ZpbGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZQoreworICAgIHVpbnQ4X3QgcHJvZmlsZV92ZXJzaW9uOyAgICAgICAgICAgIC8qKjwgcHJvZmlsZSB2ZXJzaW9uLiAqLworICAgIGJjbW9zX2Jvb2wgaXNfZmVjX29uOyAgICAgICAgICAgICAgIC8qKjwgaXMgZmVjIG9uLiAqLworICAgIHVpbnQ4X3QgZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXM7ICAgIC8qKjwgZGVsaW1pdGVyIHNpemUgaW4gYnl0ZXMuICovCisgICAgdWludDMyX3QgZGVsaW1pdGVyX3BhdHRlcm5faGlnaDsgICAgLyoqPCBkZWxpbWl0ZXIgcGF0dGVybiBoaWdoLiAqLworICAgIHVpbnQzMl90IGRlbGltaXRlcl9wYXR0ZXJuX2xvdzsgICAgIC8qKjwgZGVsaW1pdGVyIHBhdHRlcm4gbG93LiAqLworICAgIHVpbnQ4X3QgcHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzOyAgIC8qKjwgcHJlYW1ibGUgbGVuZ3RoIGluIGJ5dGVzLiAqLworICAgIHVpbnQ4X3QgcHJlYW1ibGVfcmVwZWF0c19jb3VudDsgICAgIC8qKjwgcHJlYW1ibGUgcmVwZWF0cyBjb3VudC4gKi8KKyAgICB1aW50MzJfdCBwcmVhbWJsZV9wYXR0ZXJuX2hpZ2g7ICAgICAvKio8IHByZWFtYmxlIHBhdHRlcm4gaGlnaC4gKi8KKyAgICB1aW50MzJfdCBwcmVhbWJsZV9wYXR0ZXJuX2xvdzsgICAgICAvKio8IHByZWFtYmxlIHBhdHRlcm4gbG93LiAqLworICAgIHVpbnQ2NF90IHBvbl90YWc7ICAgICAgICAgICAgICAgICAgIC8qKjwgUE9OIHRhZy4gKi8KKyAgICB1aW50MzJfdCBudW1fb2ZfZ3VhcmRfYnl0ZXM7ICAgICAgICAvKio8IG51bWJlciBvZiBndWFyZCBieXRlcy4gKi8KKyAgICBiY21vc19ib29sIGlzX3Byb2ZpbGVfdmFsaWQ7ICAgICAgICAvKio8IGlzIHByb2ZpbGUgdmFsaWQuICovCisgICAgdWludDMyX3QgYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkczsgIC8qKjwgQnVyc3Qgb3ZlcmhlYWQgc2l6ZSBpbiA0LWJ5dGUgd29yZHMgKHdvcmQgc2l6ZSBpcyA0IGJ5dGVzIHJlZ2FyZGxlc3Mgb2YgdXBzdHJlYW0gZGF0YSByYXRlKS4gKi8KK30gYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGU7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogNHggeGdwb25fYnVyc3RfcHJvZmlsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80Cit7CisgICAgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgYXJyWzRdOyAgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQ7CisKKy8qKiBYR1BPTiBUUlggY29uZmlndXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbgoreworICAgIHVpbnQzMl90IHRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0OyAgICAgICAgICAgLyoqPCB0cnggcmVzZXQgcGF0dGVybiBmaXJzdC4gKi8KKyAgICB1aW50MzJfdCB0cnhfcmVzZXRfcGF0dGVybl9taWRkbGU7ICAgICAgICAgIC8qKjwgdHJ4IHJlc2V0IHBhdHRlcm4gbWlkZGxlLiAqLworICAgIHVpbnQzMl90IHRyeF9yZXNldF9wYXR0ZXJuX2xhc3Q7ICAgICAgICAgICAgLyoqPCB0cnggcmVzZXQgcGF0dGVybiBsYXN0LiAqLworICAgIHVpbnQ4X3QgdHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50OyAgICAgLyoqPCB0cnggcmVzZXQgbWlkZGxlIHJlcGVhdHMgY291bnQuICovCisgICAgdWludDE2X3QgdHJ4X3Jlc2V0X2xvY2F0aW9uOyAgICAgICAgICAgICAgICAvKio8IHRyeCByZXNldCBsb2NhdGlvbi4gKi8KKyAgICBiY21vc19ib29sIHRyeF9yZXNldF9wb2xhcml0eTsgICAgICAgICAgICAgIC8qKjwgdHJ4IHJlc2V0IHBvbGFyaXR5LiAqLworICAgIHVpbnQzMl90IGJjZHJfcmVzZXRfcGF0dGVybl9maXJzdDsgICAgICAgICAgLyoqPCBiY2RyIHJlc2V0IHBhdHRlcm4gZmlyc3QuICovCisgICAgdWludDMyX3QgYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZTsgICAgICAgICAvKio8IGJjZHIgcmVzZXQgcGF0dGVybiBtaWRkbGUuICovCisgICAgdWludDMyX3QgYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3Q7ICAgICAgICAgICAvKio8IGJjZHIgcmVzZXQgcGF0dGVybiBsYXN0LiAqLworICAgIHVpbnQ4X3QgYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudDsgICAgLyoqPCBiY2RyIHJlc2V0IG1pZGRsZSByZXBlYXRzIGNvdW50LiAqLworICAgIHVpbnQ4X3QgYmNkcl9yZXNldF9sb2NhdGlvbjsgICAgICAgICAgICAgICAgLyoqPCBiY2RyIHJlc2V0IGxvY2F0aW9uLiAqLworICAgIGJjbW9zX2Jvb2wgYmNkcl9yZXNldF9wb2xhcml0eTsgICAgICAgICAgICAgLyoqPCBiY2RyIHJlc2V0IHBvbGFyaXR5LiAqLworfSBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb247CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogNHggeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQKK3sKKyAgICBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24gYXJyWzRdOyAgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80OworCisvKiogQXV0b21hdGljIE9OVSBkZWFjdGl2YXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24KK3sKKyAgICBiY21vc19ib29sIGxvczsgICAgICAgICAvKio8IEF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIExPUyAqLworICAgIGJjbW9zX2Jvb2wgb251X2FsYXJtczsgIC8qKjwgQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gT05VIGFsYXJtcyAqLworICAgIGJjbW9zX2Jvb2wgdGl3aTsgICAgICAgIC8qKjwgQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gVElXaSBhbGFybSAqLworICAgIGJjbW9zX2Jvb2wgYWNrX3RpbWVvdXQ7IC8qKjwgQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gQWNrIHRpbWVvdXQgKi8KKyAgICBiY21vc19ib29sIHNmaTsgICAgICAgICAvKio8IEF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIFNGaSBhbGFybSAqLworICAgIGJjbW9zX2Jvb2wgbG9raTsgICAgICAgIC8qKjwgQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gTG9raSBhbGFybSAqLworfSBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb247CisKKy8qKiBUUlggUmVzeW5jIHBhdHRlcm4gY29udHJvbC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9yZXN5bmNfY29udHJvbAoreworICAgIHVpbnQ4X3Qgc3RhcnRfcGF0dGVybjsgICAgICAvKio8IHN0YXJ0IHBhdHRlcm4uICovCisgICAgdWludDhfdCBtaWRkbGVfcGF0dGVybjsgICAgIC8qKjwgbWlkZGxlIHBhdHRlcm4uICovCisgICAgdWludDhfdCBsYXN0X3BhdHRlcm47ICAgICAgIC8qKjwgbGFzdCBwYXR0ZXJuLiAqLworICAgIHVpbnQ4X3QgbWlkZGxlX3JlcGV0aXRpb247ICAvKio8IG1pZGRsZSByZXBldGl0aW9uLiAqLworICAgIHVpbnQ4X3QgbG9jYXRpb247ICAgICAgICAgICAvKio8IGxvY2F0aW9uLiAqLworfSBiY21vbHRfcmVzeW5jX2NvbnRyb2w7CisKKy8qKiBCQ0RSIHJlc3luYyBwYXR0ZXJuIGNvbmZpZ3VyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uCit7CisgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHJlc3luY19jb250cm9sOyAgICAgICAgICAgLyoqPCByZXN5bmMgY29udHJvbC4gKi8KKyAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgcmFuZ2luZ19yZXN5bmNfY29udHJvbDsgICAvKio8IHJhbmdpbmcgcmVzeW5jIGNvbnRyb2wuICovCit9IGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb247CisKKy8qKiBCRVIgbW9uaXRvcmluZyBwYXJhbWV0ZXJzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcworeworICAgIHVpbnQzMl90IHVzX2Jlcl9pbnRlcnZhbDsgICAvKio8IEludGVydmFsIGluIG1pbGxpc2Vjb25kcyBmb3IgdXBzdHJlYW0gQkVSIG1vbml0b3JpbmcgKDAgPSBkaXNhYmxlZCkuICovCisgICAgdWludDhfdCBzZl90aHJlc2hvbGQ7ICAgICAgIC8qKjwgU2lnbmFsIGZhaWwgYWxhcm0gaXMgcmFpc2VkIHdoZW4gQkVSIHJhaXNlcyB0byAxMF4teCwgd2hlcmUgeCBpcyB0aGlzIG51bWJlci4gKi8KKyAgICB1aW50OF90IHNkX3RocmVzaG9sZDsgICAgICAgLyoqPCBTaWduYWwgZGVncmFkZSBhbGFybSBpcyByYWlzZWQgd2hlbiBCRVIgcmFpc2VzIHRvIDEwXi14LCB3aGVyZSB4IGlzIHRoaXMgbnVtYmVyLiAqLworfSBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zOworCisvKiogQ0JSIFJUIEFsbG9jYXRpb24gcHJvZmlsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlCit7CisgICAgdWludDE2X3QgbWFfNzsgIC8qKjwgQ0JBIG1heGltdW0gYWxsb2NhdGlvbiBzaXplIGZvciBmcmFtZSBnYXAgNyAqLworICAgIHVpbnQxNl90IG1hXzM7ICAvKio8IENCQSBtYXhpbXVtIGFsbG9jYXRpb24gc2l6ZSBmb3IgZnJhbWUgZ2FwIDMgKi8KKyAgICB1aW50MTZfdCBtYV8xOyAgLyoqPCBDQkEgbWF4aW11bSBhbGxvY2F0aW9uIHNpemUgZm9yIGZyYW1lIGdhcCAxICovCit9IGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlOworCisvKiogUmVzdWx0cyBvZiB0aGUgRERSIHRlc3QgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzIHN0YXR1czsgIC8qKjwgT3V0Y29tZSBvZiB0aGUgRERSIHRlc3QgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9kZHJfdGVzdF9yZXN1bHQgY3B1X3Jlc3VsdDsgICAgICAgICAgLyoqPCBDUFUgUmVzdWx0LiAqLworICAgICAgICAgICAgYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCByYXNfMF9yZXN1bHQ7ICAgICAgICAvKio8IFJBUyAwIFJlc3VsdC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9kZHJfdGVzdF9yZXN1bHQgcmFzXzFfcmVzdWx0OyAgICAgICAgLyoqPCBSQVMgMSBSZXN1bHQuICovCisgICAgICAgIH0gY29tcGxldGVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIHJlYXNvbjsgIC8qKjwgQ29ubmVjdGlvbiBmYWlsIHJlYXNvbi4gKi8KKyAgICAgICAgfSBjb25uZWN0aW9uX2ZhaWxlZDsKKyAgICB9IHU7Cit9IGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQ7CisKKy8qKiBEZWJ1ZyBwYXJhbWV0ZXJzIGZvciBkZXZpY2UgY29uZmlndXJhdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX2RldmljZV9jZmcKK3sKKyAgICB1aW50MTZfdCBob3N0X2RtYV9yeF9xdWV1ZV9zaXplOyAgICAgICAgICAgIC8qKjwgUlggUXVldWUgc2l6ZSBvZiB0aGUgaG9zdCBETUEgICAgICovCisgICAgdWludDE2X3QgaG9zdF9kbWFfdHhfcXVldWVfc2l6ZTsgICAgICAgICAgICAvKio8IFRYIFF1ZXVlIHNpemUgb2YgdGhlIGhvc3QgRE1BICAgICAqLworICAgIGJjbW9zX2Jvb2wgYXZzX2NvbnRyb2w7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBBVlMgY29udHJvbC4gKi8KKyAgICBiY21vc19ib29sIHVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmU7ICAgIC8qKjwgVGhpcyBpcyBhIGZhbGxiYWNrIG9wdGlvbiBpZiB0aGVyZSBhcmUgaXNzdWVzIHdpdGggdGhlIG5ldyBmaXJtd2FyZSAqLworICAgIGJjbW9zX2Jvb2wgdXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZTsgICAgLyoqPCBUaGlzIGlzIGEgZmFsbGJhY2sgb3B0aW9uIGlmIHRoZXJlIGFyZSBpc3N1ZXMgd2l0aCB0aGUgbmV3IGZpcm13YXJlICovCit9IGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnOworCisvKiogRGV2aWNlIE5OSSBTcGVlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkCit7CisgICAgYmNtb2x0X25uaV9zcGVlZCBmaXJzdF9oYWxmOyAgICAvKio8IEludGVyZmFjZSBzcGVlZCBmb3IgdGhlIGZpcnN0IGhhbGYgb2YgdGhlIE5OSSBwb3J0cyBvbiB0aGUgc3lzdGVtLiAqLworICAgIGJjbW9sdF9ubmlfc3BlZWQgc2Vjb25kX2hhbGY7ICAgLyoqPCBJbnRlcmZhY2Ugc3BlZWQgZm9yIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgTk5JIHBvcnRzIG9uIHRoZSBzeXN0ZW0uICovCit9IGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkOworCisvKiBcY29uZCBVTkRPQ1VNRU5URURfU1lNQk9MUyAqLworCisvKiogRHVtbXkgU3RydWN0IEZvciBFbWJlZGRlZCBUeXBlcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzCit7CisgICAgYmNtb2x0X2FnZ3JlZ2F0aW9uX2RvbWFpbiBhZDsgICAgICAgICAgICAgICAvKio8IGFkLiAqLworICAgIGJjbW9sdF9lcG9uX3RvcCBldDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBldC4gKi8KKyAgICBiY21vbHRfZXBtX2xpbV9nbG9iYWwgZWxnOyAgICAgICAgICAgICAgICAgIC8qKjwgZWxnLiAqLworICAgIGJjbW9sdF9kYmFfcG9ydCBkYmFfcG9ydDsgICAgICAgICAgICAgICAgICAgLyoqPCBkYmEgcG9ydC4gKi8KKyAgICBiY21vbHRfZHJ2X3NnYl9pZCBzZ2I7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2diLiAqLworICAgIGJjbW9sdF9kcnZfaWNmX2lkIGljZjsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBpY2YuICovCisgICAgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIHRmYl90cmFwX2JlaGF2aW9yOyAvKio8IHRmYiB0cmFwIGJlaGF2aW9yLiAqLworICAgIGJjbW9sdF90ZmJfbW9kZSB0ZmJfbW9kZTsgICAgICAgICAgICAgICAgICAgLyoqPCB0ZmIgbW9kZS4gKi8KKyAgICBiY21vbHRfbGltX3NlY19tb2RlX3VwIGxpbV9zZWNfbW9kZV91cDsgICAgIC8qKjwgbGltIHNlYyBtb2RlIHVwLiAqLworICAgIGJjbW9sdF9saW1fc2VjX21vZGVfZG4gbGltX3NlY19tb2RlX2RuOyAgICAgLyoqPCBsaW0gc2VjIG1vZGUgZG4uICovCisgICAgYmNtb2x0X3hpbV9zZWNfbW9kZSB4aW1fc2VjX21vZGU7ICAgICAgICAgICAvKio8IHhpbSBzZWMgbW9kZS4gKi8KKyAgICBiY21vbHRfZGJhX3JhbSBkYmFfcmFtOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgZGJhIHJhbS4gKi8KKyAgICBiY21vbHRfaHNjX3JhbSBoc2NfcmFtOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgaHNjIHJhbS4gKi8KKyAgICBiY21vbHRfbGltX3JhbSBsaW1fcmFtOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgbGltIHJhbS4gKi8KKyAgICBiY21vbHRfbGt5X3JhbSBsa3lfcmFtOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgbGt5IHJhbS4gKi8KKyAgICBiY21vbHRfbWljX3JhbSBtaWNfcmFtOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgbWljIHJhbS4gKi8KKyAgICBiY21vbHRfeHBjc3JtX3JhbSB4cGNzX3JhbTsgICAgICAgICAgICAgICAgIC8qKjwgeHBjcyByYW0uICovCisgICAgYmNtb2x0X3hnMmdfaWQgeGcyZ19pZDsgICAgICAgICAgICAgICAgICAgICAvKio8IHhnMmcgaWQuICovCit9IGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzOworCisvKiBcZW5kY29uZCAqLworCisvKiogRW1iZWRkZWQgaW1hZ2UgZW50cnkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkKK3sKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZTsgICAgLyoqPCBUeXBlIG9mIHRoZSBlbWJlZGRlZCBmaWxlIGltYWdlLiAqLworICAgIHVpbnQzMl90IGltYWdlX3NpemU7ICAgICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIGVtYmVkZGVkIGZpbGUgaW1hZ2UuICBVbml0IGlzIGJ5dGVzLiAqLworICAgIHVpbnQzMl90IGNyYzMyOyAvKio8IENSQyAzMiBjaGVja3N1bSBvZiBlbnRpcmUgZmlsZSBpbWFnZSBkYXRhLiAqLworICAgIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgc3RhdHVzOyAgIC8qKjwgSW1hZ2UgdHJhbnNmZXIgc3RhdHVzLiAqLworICAgIGNoYXIgaW1hZ2VfbmFtZVs2NF07ICAgIC8qKjwgTmFtZSBvZiB0aGUgZmlsZSBpbWFnZS4gIE51bGwtdGVybWluYXRlZCBzdHJpbmcuICBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgRFBvRSBPTlUgb25seS4gIERQb0UgcmVxdWlyZXMgdGhlIHdyaXRlIHJlcXVlc3QgT0FNIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAqLworfSBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnk7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBlbWJlZGRlZF9pbWFnZV9lbnRyeS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4Cit7CisgICAgdWludDhfdCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkgKnZhbDsgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4OworCisvKiogRW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIKK3sKKyAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCBmb3JtYXQ7ICAgLyoqPCBGb3JtYXQuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGtleVsxNl07ICAgIC8qKjwgS2V5LiAqLworICAgICAgICB9IGNmYjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBrZXlbMTZdOyAgICAvKio8IEtleS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc2NpWzhdOyAgICAgLyoqPCBTQ0kuICovCisgICAgICAgIH0gY3RyOworICAgIH0gdTsKK30gYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyOworCisvKiogRVBPTiBjbG9jayB0cmFuc3BvcnQgY29uZmlndXJhdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24KK3sKKyAgICBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlOyAvKio8IENsb2NrIFRyYW5zcG9ydCBtb2RlIG9uIHRoaXMgT0xUIFBPTiBQb3J0LiAqLworfSBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbjsKKworLyoqIERhdGEgb2YgdW5rbm93biBsaW5rLCBpbmNsdWRpbmcgcmF0ZSBhbmQgYWxhcm0gc3RhdHVzIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cworeworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSBsaW5rX3JhdGU7ICAgIC8qKjwgVGhlIHJhdGUgb2YgdGhlIHVua25vd24gbGluayAqLworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAgICAgICAgIC8qKjwgV2hldGhlciB0aGUgdW5rbm93biBsaW5rIGFsYXJtIGlzIHJhaXNlZCBvciBjbGVhcmVkLiAqLworfSBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1czsKKworLyoqIERhdGEgb2YgbGFzZXIgb24vb2ZmIHZpb2xhdGluZyBsaW5rLCBpbmNsdWRpbmcgYXR0ZW1wdGVkIGxhc2VyIG9uIHRpbWUsIAorICogYXR0ZW1wdGVkIGxhc2VyIG9mZiB0aW1lLCBhbmQgYWxhcm0gc3RhdHVzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMKK3sKKyAgICBiY21vbHRfdGltZV9xdWFudGEgbGFzZXJfb25fdGltZTsgICAvKio8IFRoZSBsYXNlciBvbiB0aW1lIG9mIHRoZSBPTlUgdGhhdCBpcyB2aW9sYXRpbmcuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIGxhc2VyX29mZl90aW1lOyAgLyoqPCBUaGUgbGFzZXIgb2ZmIHRpbWUgb2YgdGhlIE9OVSB0aGF0IGlzIHZpb2xhdGluZy4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgICAgICAgICAvKio8IFdoZXRoZXIgdGhlIGxhc2VyIG9uL29mZiB2aW9sYXRpb24gYWxhcm0gaXMgcmFpc2VkIG9yIGNsZWFyZWQuICovCit9IGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzOworCisvKiogRGF0YSBvZiByYW5nZSB2aW9sYXRpbmcgbGluaywgaW5jbHVkaW5nIHRoZSByYW5nZSBpdCBhdHRlbXB0ZWQgdG8gdXNlLCBhbmQgCisgKiBhbGFybSBzdGF0dXMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcmFuZ2Vfc3RhdHVzCit7CisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHJhbmdlOyAgIC8qKjwgVGhlIHJhbmdlIHRoYXQgdGhlIHZpb2xhdGluZyBsaW5rIGF0dGVtcHRlZCB0byByZWdpc3RlciBhdC4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBXaGV0aGVyIHRoZSByYW5nZSB2aW9sYXRpb24gYWxhcm0gaXMgcmFpc2VkIG9yIGNsZWFyZWQuICovCit9IGJjbW9sdF9yYW5nZV9zdGF0dXM7CisKKy8qKiBEZXRhaWxzIG9mIFN1c3BlY3RlZCBSb2d1ZSBPTlUgcHJvdmlkZWQgaW4gRGVuaWVkIExpbmsgQWxhcm0gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9yb2d1ZV9zdGF0dXMKK3sKKyAgICBiY21vbHRfZXBvbl9sbGlkIGRlbmllZF9sbGlkOyAgICAgICAvKio8IExMSUQuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIGRlbmllZF9yYW5nZTsgICAgLyoqPCBPTlUgUmFuZ2UuICovCisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7ICAgICAgICAgLyoqPCBBbGFybSBTdGF0ZS4gKi8KK30gYmNtb2x0X3JvZ3VlX3N0YXR1czsKKworLyoqIFRoZSBzdGF0ZSBvZiBhbGwgYWxhcm1zIG9uIGFuIEVQT04gRGVuaWVkIExpbmsuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZQoreworICAgIGJjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzIHVua25vd25fbGlua192aW9sYXRpb247ICAvKio8IFVua25vd24gTGluayBWaW9sYXRpb24uICovCisgICAgYmNtb2x0X3N0YXR1cyBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbjsgICAgICAgICAgIC8qKjwgT3ZlcmhlYWQgUHJvZmlsZSBWaW9sYXRpb24uICovCisgICAgYmNtb2x0X3N0YXR1cyBtYXhfbGlua192aW9sYXRpb247ICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IExpbmsgVmlvbGF0aW9uLiAqLworICAgIGJjbW9sdF9zdGF0dXMgbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbjsgICAgICAgICAgICAvKio8IExMSUQgUG9vbCBFbXB0eSBWaW9sYXRpb24uICovCisgICAgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbjsgIC8qKjwgTGFzZXIgT24vT2ZmIFZpb2xhdGlvbi4gKi8KKyAgICBiY21vbHRfc3RhdHVzIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb247ICAgICAgICAgICAgLyoqPCBTeXN0ZW0gUmVzb3VyY2UgVmlvbGF0aW9uLiAqLworICAgIGJjbW9sdF9yYW5nZV9zdGF0dXMgcmFuZ2VfdmlvbGF0aW9uOyAgICAgICAgICAgICAgICAvKio8IFJhbmdlIFZpb2xhdGlvbi4gKi8KKyAgICBiY21vbHRfc3RhdHVzIHRkbV9jaGFubmVsc19leGhhdXN0ZWQ7ICAgICAgICAgICAgICAgLyoqPCBURE0gQ2hhbm5lbHMgRXhoYXVzdGVkLiAqLworICAgIGJjbW9sdF9yb2d1ZV9zdGF0dXMgcm9ndWVfdmlvbGF0aW9uOyAgICAgICAgICAgICAgICAvKio8IFJvZ3VlIE9OVSBWaW9sYXRpb24uICovCisgICAgYmNtb2x0X3N0YXR1cyB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uOyAgICAgICAgIC8qKjwgVXBzdHJlYW0gQmFuZHdpZHRoIFZpb2xhdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGU7CisKKy8qKiBLZXlzIGFuZCBtb2RlIGZvciBlbmNyeXB0aW5nIHRoZSBFUE9OIGxvZ2ljYWwgbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnCit7CisgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIGRvd25zdHJlYW1fbW9kZTsgICAgLyoqPCBEb3duc3RyZWFtIE1vZGUuICovCisgICAgYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSBkb3duc3RyZWFtX2tleV9jaG9pY2U7ICAgLyoqPCBEb3duc3RyZWFtIEtleSBDaG9pY2UuICovCisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbjsgIC8qKjwgRG93bnN0cmVhbSBFbmNyeXB0aW9uIEluZm9ybWF0aW9uLiAqLworICAgIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSB1cHN0cmVhbV9tb2RlOyAgLyoqPCBVcHN0cmVhbSBNb2RlLiAqLworICAgIGJjbW9sdF9lcG9uX2tleV9jaG9pY2UgdXBzdHJlYW1fa2V5X2Nob2ljZTsgLyoqPCBVcHN0cmVhbSBLZXkgQ2hvaWNlLiAqLworICAgIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciB1cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uOyAgICAvKio8IFVwc3RyZWFtIEVuY3J5cHRpb24gSW5mb3JtYXRpb24uICovCit9IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnOworCisvKiogS2V5IGV4Y2hhbmdlIGNvbmZpZ3VyYXRpb24gdGhhdCBhcHBsaWVzIHRvIHRoZSBFUE9OIGxpbmsuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3R5cGUgb2FtX3R5cGU7ICAgICAgICAgICAgICAvKio8IFRoZSB0eXBlIG9mIE9BTSB0aGF0IGlzIHNlbnQgdG8gc3RhcnQgdGhlIGtleSBleGNoYW5nZS4gKi8KKyAgICB1aW50MTZfdCBwZXJpb2Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgS2V5IGV4Y2hhbmdlIHBlcmlvZCBpbiBzZWNvbmRzLiAgMCBtZWFucyBkaXNhYmxlIGVuY3J5cHRpb24uICovCisgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24gZGlyZWN0aW9uOyAvKio8IEVuY3J5cHRpb24gZGlyZWN0aW9uOiBEb3duc3RyZWFtIG9ubHkgb3IgQmktZGlyZWN0aW9uYWwuICovCit9IGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWc7CisKKy8qKiBFUE9OIGxhc2VyIG92ZXJoZWFkIHBhcmFtZXRlcnMuIChMYXNlciBPbiBhbmQgTGFzZXIgT2ZmIHRpbWVzKSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycworeworICAgIGJjbW9sdF90aW1lX3F1YW50YSBsYXNlcl9vbl90aW1lOyAgIC8qKjwgTnVtYmVyIG9mIHRpbWUgcXVhbnRhIHRvIGFsbG93IGZvciBPTlVzJyBsYXNlci1vbiB0cmFuc2l0aW9uLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBsYXNlcl9vZmZfdGltZTsgIC8qKjwgTnVtYmVyIG9mIHRpbWUgcXVhbnRhIHRvIGFsbG93IGZvciBPTlVzJyBsYXNlci1vZmYgdHJhbnNpdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyczsKKworLyoqIFRoZSBzdGF0ZSBvZiBhbGwgYWxhcm1zIG9uIGFuIEVQT04gTGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUKK3sKKyAgICBiY21vbHRfc3RhdHVzIGtleV9leGNoYW5nZV9mYWlsdXJlOyAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIEZhaWx1cmUuICovCisgICAgYmNtb2x0X3N0YXR1cyBpbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkOyAvKio8IEludmFsaWQgTVBDUCBSZXBvcnQgUmVjZWl2ZWQuICovCisgICAgYmNtb2x0X3N0YXR1cyBtcGNwX3JlcG9ydF90aW1lb3V0OyAgICAgICAgICAvKio8IE1QQ1AgUmVwb3J0IFRpbWVvdXQuICovCisgICAgYmNtb2x0X3N0YXR1cyBvYW1fa2VlcGFsaXZlX3RpbWVvdXQ7ICAgICAgICAvKio8IE9BTSBLZWVwYWxpdmUgVGltZW91dC4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZTsKKworLyoqIERvd25zdHJlYW0gYW5kIHVwc3RyZWFtIEZFQyBlbmFibGUgc3RhdGUgZm9yIGFuIEVQT04gbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuCit7CisgICAgYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUgdXBzdHJlYW07ICAgIC8qKjwgRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSBkb3duc3RyZWFtOyAgLyoqPCBGRUMgZW5hYmxlIHN0YXRlIGZvciBkb3duc3RyZWFtIHBhdGguICovCit9IGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuOworCisvKiogRVBPTiBsb2dpY2FsIGxpbmsuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX2luZm8KK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXR1cyBsaW5rX3N0YXR1czsgICAgICAgICAgICAvKio8IExpbmsgc3RhdHVzIGZsYWdzLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSByYXRlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHJhdGUgYXQgd2hpY2ggdGhlIGxpbmsgb3BlcmF0ZXMuICovCisgICAgYmNtb2x0X2Vwb25fbGxpZCBsbGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgTExJRCBvZiB0aGUgbGluay4gKi8KKyAgICBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbyBtcGNwX2Rpc2NvdmVyeV9pbmZvOyAvKio8IEZsYWdzIGZyb20gTVBDUCBkaXNjb3ZlcnkuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIG9udV9sYXNlcl9vbl90aW1lX3RxOyAgICAgICAgLyoqPCBMYXNlciBvbiB0aW1lIHJlcG9ydGVkIGJ5IE9OVS4gIFRoaXMgaXMgc2V0IHRvIDAgZm9yIDFHLzFHIGxpbmtzIGFzIDFHIE1QQ1AgZG9lcyBub3QgaW5jbHVkZSB0aGlzIGZpZWxkLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBvbnVfbGFzZXJfb2ZmX3RpbWVfdHE7ICAgICAgIC8qKjwgTGFzZXIgb2ZmIHRpbWUgcmVwb3J0ZWQgYnkgT05VLiAqLworICAgIHVpbnQ4X3QgcGVuZGluZ19ncmFudHM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBwZW5kaW5nIGdyYW50cy4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgcmFuZ2VfdmFsdWVfdHE7ICAvKio8IFRoZSBsaW5rJ3MgcmFuZ2UgdmFsdWUgaW4gVFEuICovCisgICAgYmNtb2x0X2Vwb25fdHVubmVsX2lkIHR1bm5lbF9pZDsgICAgLyoqPCBUaGUgdHVubmVsIElEIHRvIHVzZSB3aGVuIHNlbmRpbmcgdHJhZmZpYyB0byB0aGUgbGluay4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19pbmZvOworCisvKiogR2F0ZSBwYXJhbWV0ZXJzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dhdGVfcGFyYW1ldGVycworeworICAgIGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzIGZsYWdzOyAgLyoqPCBGbGFncyB0byBzZXQgZm9yIHRoaXMgZ2F0ZS4gKi8KKyAgICB1aW50MzJfdCBkZWxheV9iZWZvcmVfbXM7ICAgICAgICAgICAgICAgICAgIC8qKjwgRGVsYXkgYmVmb3JlIHNlbmRpbmcgdGhpcyBnYXRlIGluIG1pbGxpc2Vjb25kcy4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgZ2F0ZV9zaXplX3RxOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIGdhdGUgaW4gdGltZSBxdWFudGEuICovCit9IGJjbW9sdF9nYXRlX3BhcmFtZXRlcnM7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBnYXRlX3BhcmFtZXRlcnMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyCit7CisgICAgdWludDMyX3QgbGVuOyAgICAgICAgICAgICAgICAgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgKnZhbDsgICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyOworCisvKiogU3BlY2lmaWNhdGlvbiBvZiB0aGUgRVBPTiBnYXRlIG1vZGUgYW5kIGFzc29jaWF0ZWQgcGFyYW1ldGVycy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUKK3sKKyAgICBiY21vbHRfbXBjcF9nYXRlX21vZGUgcmVnaXN0cmF0aW9uX2dhdGVfbW9kZTsgICAvKio8IE1QQ1AgcmVnaXN0cmF0aW9uIGdhdGUgbW9kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHJlZ19hY2tfdGltZW91dF9tczsgICAgICAgICAgICAvKio8IEFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIGEgbGluayB0byByZXNwb25kIHdpdGggYSByZWdpc3RlciBhY2sgYWZ0ZXIgYSByZWdpc3RlciBpcyBzZW50LiAqLworICAgICAgICB9IHRla25vdnVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyIGdhdGVzOyAgLyoqPCBHYXRlcyB0byBzZW5kIGZvciBSRUcgQUNLLiAqLworICAgICAgICB9IGN1c3RvbTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGU7CisKKy8qKiBDb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gRVBPTiBsb2dpY2FsIGxpbmsgcmVnaXN0cmF0aW9uIGFuZCByZXBvcnRpbmcuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucworeworICAgIGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgcmVnaXN0cmF0aW9uX2dhdGVfbW9kZTsgIC8qKjwgRVBPTiByZWdpc3RyYXRpb24gZ2F0ZSBtb2RlLiAqLworICAgIGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZSByZXBvcnRpbmdfbW9kZTsgICAgICAgICAgICAgIC8qKjwgQ29udHJvbCBmb3IgaG93IHRoZSBEQkEgaGFuZGxlcyByZWNlaXZlZCBNUENQIHJlcG9ydCBmcmFtZXMuICovCisgICAgdWludDE2X3QgbWF4X2xpbmtzOyAvKio8IE1heGltdW0gbnVtYmVyIG9mIGxpbmtzIHRvIHJlZ2lzdGVyIG9uIHRoZSBFUE9OIE5JLiAgQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyBubyBmaXhlZCBsaW1pdC4gVGhpcyBpcyBhbiBhZ2dyZWdhdGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBub24tc3lzdGVtIGxpbmtzIG9uIGEgUE9OLiBUaGlzIGxpbWl0IGFwcGxpZXMgdG8gYm90aCByZWdpc3RlcmVkIGFuZCBub24tcmVnaXN0ZXJlZCBsaW5rcy4gVGhpcyB2YWx1ZSBjYW5ub3QgYmUgcmVkdWNlZCBiZWxvdyB0aGUgY291bnQgb2YgbGlua3MgY3VycmVudGx5IGFsbG9jYXRlZCwgbm9yIGlzIGl0IHZhbGlkIHRvIGluY3JlYXNlIGl0IGFib3ZlIHRoZSBzdW0gb2YgdGhlIHBlciBSUCBtYWNfbGlua3MgbGltaXRzLiAqLworfSBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uczsKKworLyoqIFRoZSBsaXN0IG9mIGFsYXJtcyBkZWZpbmVkIGZvciBhbiBFUE9OIE5JIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZQoreworICAgIGJjbW9sdF9zdGF0dXMgbm9fcmVwb3J0czsgICAvKio8IE5vIFJlcG9ydHMuICovCit9IGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlOworCisvKiogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIHRoYXQgYXBwbGllcyB0byB0aGUgRVBPTiBOSSBhcyBhIHdob2xlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcKK3sKKyAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGU7IC8qKjwgRG93bnN0cmVhbSBlbmNyeXB0aW9uIG1vZGUuICovCisgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIHVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZTsgICAvKio8IFVwc3RyZWFtIGVuY3J5cHRpb24gbW9kZS4gKi8KK30gYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmc7CisKKy8qKiBFUE9OIE9OVSBVcGdyYWRlIFBhcmFtZXRlcnMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUgb2FtX2V4dGVuc2lvbl90eXBlOyAgLyoqPCBPQU0gRXh0ZW5zaW9uIFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXNwb25zZV90aW1lb3V0X21zOyAgICAgICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4gKi8KKyAgICAgICAgfSBicm9hZGNvbTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcmVzcG9uc2VfdGltZW91dF9tczsgICAgICAgICAgICAgICAvKio8IFRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBPTFQgd2lsbCB3YWl0IGZvciB0aGUgT05VIHRvIHJlc3BvbmQuICovCisgICAgICAgIH0gY3RjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXNwb25zZV90aW1lb3V0X21zOyAgICAgICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4gKi8KKyAgICAgICAgfSBkYXNhbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcmVzcG9uc2VfdGltZW91dF9tczsgICAgICAgICAgICAgICAvKio8IFRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBPTFQgd2lsbCB3YWl0IGZvciB0aGUgT05VIHRvIHJlc3BvbmQuICovCisgICAgICAgIH0ga3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlc3BvbnNlX3RpbWVvdXRfbXM7ICAgICAgICAgICAgICAgLyoqPCBUaGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCB0aGUgT0xUIHdpbGwgd2FpdCBmb3IgdGhlIE9OVSB0byByZXNwb25kLiAqLworICAgICAgICAgICAgdWludDE2X3QgYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlIHBlciBkYXRhIGJsb2NrLiAqLworICAgICAgICAgICAgdWludDMyX3QgZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQ7ICAgICAgICAvKio8IFRpbWVvdXQgZm9yIHRoZSBmaW5hbCBBQ0sgcmVzcG9uc2UuICBUaGUgRFBvRSBzdGFuZGFyZCAxLjAgc3BlY2lmaWVzIHRoaXMgc2hvdWxkIGJlIGF0IGxlYXN0IDE1IHNlY29uZHMuICBVbml0IGlzIHNlY29uZHMuICovCisgICAgICAgIH0gZHBvZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtczsKKworLyoqIEVQT04gT05VIFVwZ3JhZGUgU3RhdHVzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3Mgb251X2lkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgSUQuICovCisgICAgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgZXJyb3JfY29kZTsgLyoqPCBVcGdyYWRlIHN0YXR1cy4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZSBvbnVfcmV0dXJuX2NvZGU7ICAvKio8IFJlc3BvbnNlIGNvZGUgZnJvbSB0aGUgT05VLiAqLworfSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXM7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBlcG9uX29udV91cGdyYWRlX3N0YXR1cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMgoreworICAgIHVpbnQzMl90IGxlbjsgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyAqdmFsOyAgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMjsKKworLyoqIEVQT04gcHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbgoreworICAgIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUgcHJvdGVjdGlvbl90eXBlOyAgLyoqPCBQcm90ZWN0aW9uIHNjaGVtZS4gKi8KKyAgICBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9uczsgLyoqPCBQcm90ZWN0aW9uIHN3aXRjaGluZyBvcHRpb25zLiAqLworICAgIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zIHJlcmFuZ2Vfb3B0aW9uczsgICAgICAgICAvKio8IFJlLXJhbmdpbmcgYWxnb3JpdGhtIHNlbGVjdGlvbiAqLworICAgIHVpbnQ4X3QgcmVyYW5nZV9hdHRlbXB0czsgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgdGltZXMgdG8gcmUgcmFuZ2UgZHVyaW5nIGEgc3dpdGNoICovCisgICAgdWludDE2X3QgcmVyYW5nZV9pbnRlcnZhbDsgICAgICAgICAgICAgICAgICAvKio8IEludGVydmFsIGJldHdlZW4gcmUtcmFuZ2UgYXR0ZW1wdHMuICovCisgICAgdWludDE2X3Qgc3luY19nYXRlX2R1cmF0aW9uOyAgICAgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHN5bmMgZ2F0ZS4gKi8KKyAgICBiY21vbHRfZ3Bpb19waW4gZ3Bpb19pbnB1dDsgICAgICAgICAgICAgICAgIC8qKjwgQ29uZmlndXJlcyBzdGF0ZSBvbiBQT04gKHdvcmtpbmcvc3RhbmRieSkgKi8KKyAgICBiY21vbHRfZ3Bpb19wb2xhcml0eSBncGlvX2lucHV0X3BvbGFyaXR5OyAgIC8qKjwgR1BJTyBJbnB1dCBQb2xhcml0eS4gKi8KKyAgICBiY21vbHRfZ3Bpb19waW4gZ3Bpb19vdXRwdXQ7ICAgICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHN0YXRlIG9uIFBPTiAod29ya2luZy9zdGFuZGJ5KSAqLworICAgIGJjbW9sdF9ncGlvX3BvbGFyaXR5IGdwaW9fb3V0cHV0X3BvbGFyaXR5OyAgLyoqPCBHUElPIE91dHB1dCBQb2xhcml0eS4gKi8KK30gYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbjsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIFU4LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3U4X2xpc3RfdTE2Cit7CisgICAgdWludDE2X3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgdWludDhfdCAqdmFsOyAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X3U4X2xpc3RfdTE2OworCisvKiogQSB0ZW1wbGF0ZSBmb3IgYW4gRXRoZXJuZXQgZnJhbWUgb2Ygc29tZSBmaXhlZCBsZW5ndGgsIGFjY29tcGFuaWVkIGJ5IGEgbWFzayAKKyAqIHZlY3RvciBvZiBlcXVhbCBzaXplLiAgV2hlbiB1c2VkIGluIHRoZSBjb250ZXh0IG9mIGZyYW1lIHRyYW5zbWlzc2lvbiwgdGhlIAorICogbWFzayB2ZWN0b3IgZGlzdGluZ3Vpc2hlcyBiaXQgcmVnaW9ucyBvZiB0aGUgdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgCisgKiB0cmFuc21pdHRlZCB2ZXJiYXRpbSAoZS5nLiB0aGUgY29udGVudCBvZiBhbiBPQU0gbWVzc2FnZSkgZnJvbSBiaXQgcmVnaW9ucyAKKyAqIHRoYXQgc2hvdWxkIGJlIGZpbGxlZCBpbiBmYXJ0aGVyIGFsb25nIHRoZSBkYXRhIHBhdGggKGUuZy4gRXRoZXJuZXQgc291cmNlIAorICogb3IgZGVzdGluYXRpb24gYWRkcmVzc2VzKS4gIFdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZiBmcmFtZSByZWNlcHRpb24sIHRoZSAKKyAqIG1hc2sgdmVjdG9yIGRpc3Rpbmd1aXNoZXMgYml0IHJlZ2lvbnMgb2YgdGhlIHRlbXBsYXRlIHRoYXQgYXJlIHRvIGJlIAorICogY29tcGFyZWQgd2l0aCByZWNlaXZlZCBmcmFtZXMgKGUuZy4gZmxhZ3Mgd2l0aGluIE9BTSBoZWFydGJlYXQgbWVzc2FnZXMgCisgKiByZWNlaXZlZCBmcm9tIE9OVXMpIGZyb20gImRvbid0IGNhcmUiIGJpdCByZWdpb25zIChlLmcuIEV0aGVybmV0IHNvdXJjZSAKKyAqIGFkZHJlc3NlcyBmcm9tIHRob3NlIHNhbWUgbWVzc2FnZXMpLiAgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQKK3sKKyAgICBiY21vbHRfdThfbGlzdF91MTYgZnJhbWVfb2N0ZXRzOyAgICAvKio8IEEgY29tcGxldGUgRXRoZXJuZXQgZnJhbWUuICBGb3IgZXZlcnkgemVybyBiaXQgaW4gdGhlIG1hc2tfb2N0ZXRzICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTE2IG1hc2tfb2N0ZXRzOyAgICAgLyoqPCBBIGJpdCB2ZWN0b3Igb2YgdGhlIHNhbWUgbGVuZ3RoIGFzIGZyYW1lX29jdGV0cy4gKi8KK30gYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZDsKKworLyoqIEEgY29tcGxldGUgRXRoZXJuZXQgZnJhbWUsIGJlZ2lubmluZyB3aXRoIHRoZSBEQSAobGF5ZXIgMiBkZXN0aW5hdGlvbiAKKyAqIGFkZHJlc3MpIGFuZCBlbmRpbmcganVzdCBiZWZvcmUgdGhlIEZDUyAoZnJhbWUgY2hlY2sgc2VxdWVuY2UpLiAgSW4gY29udHJhc3QgCisgKiB0byBgbWFza2VkIEV0aGVybmV0IGZyYW1lcywnIHdoaWNoIHNlZSwgdW5tYXNrZWQgRXRoZXJuZXQgZnJhbWVzIGFyZSAKKyAqIHRyYW5zbWl0dGVkIG9yIGludGVycHJldGVkL3JlbGF5ZWQgdmVyYmF0aW0uICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkCit7CisgICAgYmNtb2x0X3U4X2xpc3RfdTE2IGZyYW1lX29jdGV0czsgICAgLyoqPCBDb21wbGV0ZSBjb250ZW50IG9mIHRoZSBFdGhlcm5ldCBmcmFtZSwgYmVnaW5uaW5nIHdpdGggdGhlIERBIChsYXllciAyIGRlc3RpbmF0aW9uICovCit9IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZDsKKworLyoqIEV4dGVuZGVkIEd1YXJkIFRpbWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZQoreworICAgIHVpbnQzMl90IGFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZTsgICAgLyoqPCBBZGRpdGlvbmFsIGd1YXJkIHRpbWUgKGluIGJ5dGVzKSBiZWZvcmUgYWxsIGJ1cnN0cyBmb3IgdGhpcyBPTlUuICovCisgICAgdWludDMyX3QgYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZTsgICAvKio8IEFkZGl0aW9uYWwgZ3VhcmQgdGltZSAoaW4gYnl0ZXMpIGFmdGVyIGFsbCBidXJzdHMgZm9yIHRoaXMgT05VLiAqLworfSBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZTsKKworLyoqIEZpcm13YXJlIFNXIFZlcnNpb24gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uCit7CisgICAgdWludDhfdCBtYWpvcjsgICAgICAgICAgLyoqPCBNYWpvciAuICovCisgICAgdWludDhfdCBtaW5vcjsgICAgICAgICAgLyoqPCBNaW5vci4gKi8KKyAgICB1aW50OF90IHJldmlzaW9uOyAgICAgICAvKio8IFJldmlzaW9uLiAqLworICAgIHVpbnQzMl90IG1vZGVsOyAgICAgICAgIC8qKjwgTW9kZWwuICovCisgICAgY2hhciBidWlsZF90aW1lWzMyXTsgICAgLyoqPCBGaXJtd2FyZSBTVyBidWlsZCB0aW1lICovCit9IGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uOworCisvKiogR0VNIHBvcnQgY29uZmlndXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uCit7CisgICAgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbiBkaXJlY3Rpb247ICAgIC8qKjwgR0VNIHBvcnQgZGlyZWN0aW9uICovCisgICAgYmNtb2x0X2dlbV9wb3J0X3R5cGUgdHlwZTsgICAgICAgICAgICAgIC8qKjwgR0VNIHBvcnQgdHlwZSAqLworfSBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbjsKKworLyoqIEdQT04gQWxsb2MgV2l0aCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUKK3sKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19pZCBhbGxvY19pZDsgIC8qKjwgQWxsb2MgSUQuICovCisgICAgYmNtb2x0X2FsbG9jX3N0YXRlIHN0YXRlOyAgICAgICAvKio8IFN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9hbGxvY193aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIKK3sKKyAgICB1aW50MTZfdCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnZhbDsgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzI7CisKKy8qKiBHUE9OIERlYnVnIEZsb3cgQ29uZmlnLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcKK3sKKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB1bnRhZ2dlZF9mbG93OyAvKio8IElmIGVuYWJsZWQsIHRoaXMgR0VNIHBvcnQgd2lsbCBleHBlY3QgdXBzdHJlYW0gdHJhZmZpYyB0byBiZSB1bnRhZ2dlZCBhbmQgZG93bnN0cmVhbSB0cmFmZmljIHRvIHVzZSBhIGN1c3RvbSBWTEFOIHRhZy4gKi8KKyAgICBiY21vbHRfdmxhbl9pZCB1bnRhZ2dlZF92aWQ7ICAgICAgICAvKio8IFRoZSBWTEFOIElEIHRvIHVzZSB3aGVuIGFkZGluZyBNQUMgdGFibGUgZW50cmllcyBmb3IgdW50YWdnZWQgdHJhZmZpYy4gKi8KK30gYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWc7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX2dlbV9pZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNgoreworICAgIHVpbnQ4X3QgbGVuOyAgICAgICAgICAgICAgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9pZCAqdmFsOyAgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNjsKKworLyoqIEdQT04gR0VNIFBvcnQgV2l0aCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUKK3sKKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX2lkOyAgICAgICAgICAvKio8IEdFTSBJRC4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSBzdGF0ZTsgICAvKio8IFN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4Cit7CisgICAgdWludDE2X3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqdmFsOyAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4OworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2Cit7CisgICAgdWludDE2X3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqdmFsOyAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2OworCisvKiogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlICJ1bnRhZ2dlZCBmbG93IiBmZWF0dXJlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnCit7CisgICAgYmNtb3NfYm9vbCBsZWFybl91bnRhZ2dlZF9mbG93X3ZpZHM7ICAgICAgICAvKio8IFdoZW4gYSBNQUMvVklEIGlzIGxlYXJuZWQgb24gYW4gdW50YWdnZWQgZmxvdywgbGVhcm4gdGhlIHJlY2VpdmVkIE1BQyBhZGRyZXNzIHdpdGggYm90aCB0aGUgdW50YWdnZWQgVklEIGFuZCB0aGUgcmVjZWl2ZWQgVklEIChldmVuIHRob3VnaCBpdCB3aWxsIGJlIGludmFsaWQpLiAqLworICAgIHVpbnQxNl90IHVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjOyAgLyoqPCBJZiB0aGlzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAwLCBsZWFybmluZyBldmVudHMgb24gdW50YWdnZWQgZmxvd3Mgd2lsbCBvbmx5IGJlIGVuYWJsZWQgZm9yIE4gbWlsbGlzZWNvbmRzIGV2ZXJ5IHNlY29uZC4gIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEwIHdvdWxkIG1lYW4gbGVhcm5pbmcgaXMgb25seSBlbmFibGVkIGZvciAxJSBvZiB0aGUgdG90YWwgdGltZS4gKi8KK30gYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnOworCisvKiogR1BPTiBLZXkgRXhjaGFuZ2UgLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlCit7CisgICAgdWludDMyX3QgaW50ZXJ2YWw7ICAgICAgICAgICAgICAvKio8IEtleSBFeGNoYW5nZSBwcm9jZXNzIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgLyoqPCBFbmFibGVcZGlzYWJsZSBwZXJpb2RpYyBwcm9jZXNzIG9mIEtleSBFeGNoYW5nZSBmb3IgYWN0aXZlIE9OVXMgKi8KKyAgICBiY21vbHRfa2V5X2V4Y2hhbmdlX21vZGUgbW9kZTsgIC8qKjwgS2V5IGV4Y2hhbmdlIG1vZGUgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBlbmNyeXB0ZWRfcG9ydHNfb25seTsgIC8qKjwgUGVyZm9ybSBrZXkgZXhjaGFuZ2Ugb25seSB0byBPTlVzIHdpdGggR0VNIHBvcnRzIHRoYXQgaGF2ZSBkb3duc3RyZWFtIGVuY3J5cHRpb24gZW5hYmxlZCAqLworfSBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2U7CisKKy8qKiBHUE9OIE1BQyB0YWJsZSBzY2FuIHJlc3VsdCBmb3IgYSBzaW5nbGUgTUFDIHRhYmxlIGVudHJ5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0Cit7CisgICAgYmNtb2x0X3ZsYW5faWQgdmxhbjsgICAgICAgICAgICAvKio8IFRoZSBWTEFOIElEIG9mIHRoZSBlbnRyeS4gKi8KKyAgICBiY21vbHRfZmxvd19pZCBmbG93X2lkOyAgICAgICAgIC8qKjwgVGhlIGZsb3cgSUQgYXNzaWduZWQgdG8gdHJhZmZpYyB0aGF0IG1hdGNoZXMgdGhpcyBNQUMgdGFibGUgZW50cnkuICovCisgICAgYmNtb3NfYm9vbCBzdGF0OyAgICAgICAgICAgICAgICAvKio8IFdoZXRoZXIgb3Igbm90IHRoZSBNQUMgZW50cnkgaXMgc3RhdGljLiAgU3RhdGljIGVudHJpZXMgZG9uJ3QgYWdlLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9pZCBnZW1fcG9ydF9pZDsgLyoqPCBUaGUgR0VNIHBvcnQgSUQgb2YgdGhlIHRyYWZmaWMgdGhhdCBjcmVhdGVkIHRoaXMgdGFibGUgZW50cnkuICBUaGlzIG9ubHkgYXBwbGllcyB0byBhdXRvbWF0aWNhbGx5LWxlYXJuZWQgZW50cmllcy4gIE1hbnVhbGx5LWFkZGVkIGVudHJpZXMgd2lsbCBoYXZlIHRoZSB2YWx1ZSBCQ01PTFRfUE9OX0dFTV9QT1JUX0lEX0lOVkFMSUQuICovCisgICAgYmNtb2x0X2dwb25fb251X2lkIG9udV9pZDsgICAgICAvKio8IFRoZSBPTlUgSUQgZm9yIHRoZSB0cmFmZmljIHRoYXQgY3JlYXRlZCB0aGlzIHRhYmxlIGVudHJ5LiAgVGhpcyBvbmx5IHZhbGlkIGlmIGdlbV9wb3J0X2lkIGlzIHZhbGlkLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBiZSBzZXQgdG8gQkNNT0xUX0dQT05fT05VX0lEX0lOVkFMSUQuICovCit9IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdDsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2Cit7CisgICAgdWludDE2X3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0ICp2YWw7IC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2OworCisvKiogR1BPTiBOSSBEZWJ1ZyBwYXJhbWV0ZXJzIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZworeworICAgIHVpbnQxNl90IG51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udTsgICAvKio8IE51bWJlciBvZiBHZW0gcG9ydHMgcGVyIE9OVSAqLworfSBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZzsKKworLyoqIEdQT04gT05VIGFjdGl2YXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbgoreworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGtleV9leGNoYW5nZTsgICAgICAgICAgICAgIC8qKjwgUGVyZm9ybSBzaW5nbGUga2V5IGV4Y2hhbmdlIGR1cmluZyBhY3RpdmF0aW9uLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uOyAgIC8qKjwgUGVyZm9ybSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBkdXJpbmcgYWN0aXZhdGlvbiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGZhaWxfZHVlX3RvX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmU7ICAgLyoqPCBEZWFjdGl2YXRlIE9OVSBkdWUgdG8gcGFzc3dvcmQgYXV0aGVudGljYXRpb24gZmFpbHVyZSAqLworfSBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbjsKKworLyoqIEdQT04gT05VIGFsYXJtIHN0YXR1cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZQoreworICAgIGJjbW9sdF9zdGF0dXMgbG9zaTsgICAgIC8qKjwgTG9zcyBvZiBzaWduYWwuICovCisgICAgYmNtb2x0X3N0YXR1cyBsb2ZpOyAgICAgLyoqPCBMb3NzIG9mIGZyYW1lLiAqLworICAgIGJjbW9sdF9zdGF0dXMgbG9hbWk7ICAgIC8qKjwgTG9zcyBvZiBQTE9BTS4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGRnaTsgICAgICAvKio8IER5aW5nIEdhc3AuICovCisgICAgYmNtb2x0X3N0YXR1cyB0aXdpOyAgICAgLyoqPCBUcmFuc21pc3Npb24gaW50ZXJmZXJlbmNlIEFsYXJtLiAqLworICAgIGJjbW9sdF9zdGF0dXMgZG93aTsgICAgIC8qKjwgRHJpZnQgb2YgV2luZG93LiAqLworICAgIGJjbW9sdF9zdGF0dXMgc3VmaTsgICAgIC8qKjwgU3RhcnQgVVAgRmFpbHVyZS4gKi8KKyAgICBiY21vbHRfc3RhdHVzIHNmaTsgICAgICAvKio8IFNpZ25hbCBGYWlsLiAqLworICAgIGJjbW9sdF9zdGF0dXMgc2RpOyAgICAgIC8qKjwgU2lnbmFsIERlZ3JhZGVkLiAqLworICAgIGJjbW9sdF9zdGF0dXMgZGZpOyAgICAgIC8qKjwgRGVhY3RpdmF0aW9uIEZhaWx1cmUuICovCisgICAgYmNtb2x0X3N0YXR1cyBsb2FpOyAgICAgLyoqPCBMb3NzIG9mIGFjay4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxva2k7ICAgICAvKio8IGxvc3Mgb2Yga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGU7CisKKy8qKiBHUE9OIE9OVSBhbGFybXMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zCit7CisgICAgYmNtb2x0X3N0YXR1cyBsb3NpOyAgICAgLyoqPCBMT1NpLiAqLworICAgIGJjbW9sdF9zdGF0dXMgbG9maTsgICAgIC8qKjwgTE9GaS4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxvYW1pOyAgICAvKio8IExPQU1pLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zOworCisvKiogR1BPTiBPTlUgYWxhcm1zIHRocmVzaG9sZHMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMKK3sKKyAgICB1aW50OF90IGxvc2k7ICAgLyoqPCBUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT1NpIGFsYXJtICovCisgICAgdWludDhfdCBsb2ZpOyAgIC8qKjwgVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9GaSBhbGFybSAqLworICAgIHVpbnQ4X3QgbG9hbWk7ICAvKio8IFRocmVzaG9sZCBmb3IgYXNzZXJ0aW5nIExPQU1pIGFsYXJtICovCit9IGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkczsKKworLyoqIEdQT04gT05VIEVRRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9lcWQKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfaWQgb251X2lkOyAgLyoqPCBPTlUgSUQuICovCisgICAgdWludDMyX3QgZXFkOyAgICAgICAgICAgICAgIC8qKjwgRVFELiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZXFkOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9vbnVfZXFkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMgoreworICAgIHVpbnQzMl90IGxlbjsgICAgICAgICAgICAgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9lcWQgKnZhbDsgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzI7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX29udV9pZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2Cit7CisgICAgdWludDMyX3QgbGVuOyAgICAgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X2dwb25fb251X2lkICp2YWw7ICAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTY7CisKKy8qKiBHUE9OIE9OVSB1cGdyYWRlIHBhcmFtcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcworeworICAgIHVpbnQzMl90IHJlc3BvbnNlX3RpbWVvdXRfbXM7ICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4gKi8KKyAgICB1aW50OF90IG1heF9yZXRyeV9jb3VudDsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmV0cmllcy4gKi8KKyAgICBiY21vbHRfb21jaV9kZXZpY2VfaWQgb21jaV9mb3JtYXQ7ICAvKio8IEJhc2VsaW5lICgweDBBKSBvciBFeHRlbmRlZCAoMHgwQikuICovCisgICAgdWludDE2X3Qgd2luZG93X3NpemU7ICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2Ygc2VjdGlvbnMgcGVyIHdpbmRvdy4gKi8KKyAgICBiY21vc19ib29sIGFjdGl2YXRlX2NvbW1pdDsgICAgICAgICAvKio8IEF1dG9tYXRpY2FsbHkgYWN0aXZhdGUgdGhlIG5ldyBpbWFnZSBhbmQgY29tbWl0LiAqLworICAgIHVpbnQzMl90IGRlbGF5X2Zvcl9jb21taXRfbXM7ICAgICAgIC8qKjwgRGVsYXkgdGltZSBiZWZvcmUgQ09NTUlUIGNvbW1hbmQuICBVbml0IGlzIG1pbGxpc2Vjb25kcy4gKi8KKyAgICB1aW50OF90IG1heF9hY3RpdmF0aW9uX2F0dGVtcHRzOyAgICAvKio8IE1heGltdW0gbnVtYmVyIG9mIHJlLWF0dGVtcHRzIHRvIGFjdGl2YXRlIHRoZSBPTlUuICovCit9IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtczsKKworLyoqIEdQT04gT05VIFVwZ3JhZGUgU3RhdHVzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzCit7CisgICAgYmNtb2x0X3Bvbl9vbnVfaWQgb251X2lkOyAgIC8qKjwgT05VIElELiAqLworICAgIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlIGVycm9yX2NvZGU7IC8qKjwgRXJyb3IgQ29kZS4gKi8KKyAgICBiY21vbHRfb21jaV9yZXN1bHRfY29kZSBmYWlsX3JlYXNvbjsgICAgICAgICAgICAvKio8IEZhaWx1cmUgcmVhc29uIHNwZWNpZmljIHRvIHRoZSBFcnJvciBDb2RlIGFib3ZlLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXM7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX29udV91cGdyYWRlX3N0YXR1cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMgoreworICAgIHVpbnQzMl90IGxlbjsgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1cyAqdmFsOyAgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMjsKKworLyoqIEdQT04gT05VIFdpdGggU3RhdGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZQoreworICAgIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWQ7ICAvKio8IE9OVSBJRC4gKi8KKyAgICBiY21vbHRfb251X3N0YXRlIHN0YXRlOyAgICAgLyoqPCBTdGF0ZS4gKi8KK30gYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGU7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX29udV93aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOAoreworICAgIHVpbnQxNl90IGxlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKnZhbDsgICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4OworCisvKiogZ3BvbiBSU1NJIGdlbmVyYWwgY29uZmlndXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uCit7CisgICAgdWludDhfdCBsb2NhdGlvbjsgICAvKio8IHRoZSBwYXR0ZXJuIGFjdGl2YXRpb24gbG9jYXRpb24gaW4gY2xvY2sgY3ljbGVzIHJlbGF0aXZlIChiZWZvcmUpIHRvIHN0YXJ0IG9mIGJ1cnN0LiAqLworICAgIGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24gbG9jYXRpb25fc2lnbjsgICAgLyoqPCB0aGlzIGJpdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGxvY2F0aW9uIG9mIHRoZSBSU1NJIGluIGRhdGEgbW9kZSAoY29uZmlndXJlZCBhcyBSU1NJIHBhdHRlcm4gMSkgd2lsbCBiZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGJ1cnN0IHN0YXJ0LiAqLworICAgIHVpbnQ4X3Qgc3RhcnRfcGF0dGVybjsgICAgICAgICAgICAgICAgICAgICAgLyoqPCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGN5Y2xlIG9mIHRoZSBwYXR0ZXJuICh3aWxsIGJlIHRyYW5zbWl0dGVkIG9uY2UpLiAqLworICAgIHVpbnQ4X3QgbWlkZGxlX3BhdHRlcm47ICAgICAgICAgICAgICAgICAgICAgLyoqPCB0aGUgdmFsdWUgb2YgdGhlIHBhdHRlcm4gdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkIG1pZGRsZV9yZXBldGl0aW9uIHRpbWVzIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLiAqLworICAgIHVpbnQ4X3QgbGFzdF9wYXR0ZXJuOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgY3ljbGUgb2YgdGhlIHBhdHRlcm4uIHdpbGwgYmUgdHJhbnNtaXR0ZWQgb25jZS4gKi8KKyAgICB1aW50OF90IG1pZGRsZV9yZXBlcnRpdGlvbjsgICAgICAgICAgICAgICAgIC8qKjwgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgbWlkZGxlIHBhdHRlcm4gd2lsbCBiZSByZXBlYXRlZC4gKi8KKyAgICB1aW50MTZfdCBtaW5pbXVtX2J1cnN0OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgdGhlIG1pbmltdW0gYnVyc3Qgc2l6ZSBuZWVkZWQgbWVhc3VyZW1lbnQgKi8KK30gYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb247CisKKy8qKiBHUE9OIFNOIEFjcXVpc2l0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24KK3sKKyAgICB1aW50MzJfdCBpbnRlcnZhbDsgICAgICAgICAgICAgIC8qKjwgU04gcHJvY2VzcyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBjb250cm9sOyAgIC8qKjwgU04gcHJvY2VzcyBjb250cm9sICovCisgICAgYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIG9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlOyAvKio8IEF1dG9tYXRpYyBvcGVyYXRpb24gZm9sbG93aW5nIE9OVSBkaXNjb3ZlcnkgKi8KK30gYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb247CisKKy8qKiBIb3N0IFNXIFZlcnNpb24gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24KK3sKKyAgICB1aW50OF90IG1ham9yOyAgICAgICAgICAvKio8IE1ham9yIC4gKi8KKyAgICB1aW50OF90IG1pbm9yOyAgICAgICAgICAvKio8IE1pbm9yLiAqLworICAgIHVpbnQ4X3QgcmV2aXNpb247ICAgICAgIC8qKjwgUmV2aXNpb24uICovCisgICAgdWludDMyX3QgbW9kZWw7ICAgICAgICAgLyoqPCBNb2RlbC4gKi8KKyAgICBjaGFyIGJ1aWxkX3RpbWVbMzJdOyAgICAvKio8IEZpcm13YXJlIFNXIGJ1aWxkIHRpbWUgKi8KK30gYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbjsKKworLyoqIEhXIFBPTiBJRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9od19wb25faWQKK3sKKyAgICB1aW50MzJfdCBwb25faWRfMTsgIC8qKjwgTFNCIDMyIGJpdHMgb2YgUE9OIElELiAqLworICAgIHVpbnQzMl90IHBvbl9pZF8yOyAgLyoqPCBNU0IgMTkgYml0cyBvZiBQT04gSUQuICovCit9IGJjbW9sdF9od19wb25faWQ7CisKKy8qKiBQb3J0IElkZW50aXR5IHVzZWQgaW4gSUVFRSA4MDIuMWFzIENsb2NrIFRyYW5wb3J0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2llZWVfODAyMWFzX3BvcnRfaWRlbnRpdHkKK3sKKyAgICB1aW50OF90IGNsb2NrX2lkZW50aXR5WzhdOyAgLyoqPCBDbG9jayBpZGVudGl0eSBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHVzZWQgaW4gSUVFRSA4MDIuMWFzIGNsb2NrIHRyYW5zcG9ydC4gKi8KKyAgICB1aW50MTZfdCBwb3J0X251bWJlcjsgICAgICAgLyoqPCBQb3J0IE51bWJlci4gKi8KK30gYmNtb2x0X2llZWVfODAyMWFzX3BvcnRfaWRlbnRpdHk7CisKKy8qKiBUaW1lc3RhbXAgdXNlZCBpbiBJRUVFIDgwMi4xYXMgY2xvY2sgdHJhbnNwb3J0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcAoreworICAgIHVpbnQxNl90IHNlY29uZHNfaGlnaDsgIC8qKjwgVGhlIGhpZ2ggMTYgYml0cyBvZiB0aGUgNDggYml0IHNlY29uZHMgZmllbGQgYXMgcmVxdWlyZWQgYnkgSUVFRS4gKi8KKyAgICB1aW50MzJfdCBzZWNvbmRzX2xvdzsgICAvKio8IFRoZSBsb3cgMzIgYnRzIG9mIHRoZSA0OCBiaXQgc2Vjb25kcyBmaWVsZCBhcyByZXF1aXJlZCBieSBJRUVFLiAqLworICAgIHVpbnQzMl90IG5hbm9zZWNvbmRzOyAgIC8qKjwgVGhlIE5hbm9zZWNvbmRzIHBhcnQgb2YgdGhlIHRpbWVzdGFtcC4gKi8KK30gYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcDsKKworLyoqIEZ1bGwgZnJhbWUgb2YgdGhlIElFRUUgODAyLjFhcyB0aW1lIHN5bmMgbWVzc2FnZSB1c2VkIGluIGNsb2NrIHRyYW5zcG9ydC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBkZXN0aW5hdGlvbl9tYWM7ICAvKio8IERlc3RpbmF0aW9uIE1BQyBBZGRyZXNzLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIHNvdXJjZV9tYWM7ICAgICAgIC8qKjwgU291cmNlIE1BQyBBZGRyZXNzLiAqLworICAgIHVpbnQxNl90IGV0aF90eXBlX2xlbjsgICAgICAgICAgICAgIC8qKjwgVHlwZSBvZiBFdGhlcm5ldCBQRFUuICovCisgICAgdWludDhfdCBldGhfc3VidHlwZTsgICAgICAgICAgICAgICAgLyoqPCBTbG93IHByb3RvY29sIFN1YnR5cGUuICovCisgICAgdWludDhfdCBpZWVlX291aVszXTsgICAgICAgICAgICAgICAgLyoqPCBJRUVFIE9VSS4gKi8KKyAgICB1aW50MTZfdCBtc2dfaWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE1lc3NhZ2UgSUQuICovCisgICAgdWludDMyX3QgeDsgLyoqPCBSZWZlcmVuY2UgVGltZS4gKi8KKyAgICBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wIHRvZDsgICAgICAgICAgICAgICAvKio8IFRpbWUgb2YgZGF5IHRpbWVzdGFtcC4gKi8KKyAgICBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSBwb3J0X2lkZW50aXR5OyAvKio8IFNvdXJjZSBwb3J0IGlkZW50aXR5LiAqLworICAgIGludDhfdCBsb2dfbXNnX2ludGVydmFsOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9nIG1lc3NhZ2UgaW50ZXJ2YWwgKGN1cnJlbnRseSB1bnVzZWQgYnV0IHJlcXVpcmVkIGJ5IHNwZWMpLiAqLworICAgIGRvdWJsZSByYXRlX3JhdGlvOyAgICAgICAgICAgICAgICAgIC8qKjwgUmF0aW8gb2YgbG9jYWwgc2Vjb25kIHRvIGdyYW5kbWFzdGVyIHNlY29uZC4gKi8KKyAgICB1aW50MTZfdCBnbV90aW1lX2Jhc2VfaW5kaWNhdG9yOyAgICAvKio8IEdyYW5kbWFzdGVyIHRpbWUgYmFzZSBpbmRpY2F0b3IgKGN1cnJlbnRseSB1bnVzZWQgYnV0IHJlcXVpcmVkIGJ5IHNwZWMpLiAqLworICAgIHVpbnQ4X3QgbGFzdF9nbV9waGFzZV9jaGFuZ2VbMTJdOyAgIC8qKjwgVGltZSBvZiB0aGUgY3VycmVudCBncmFuZG1hc3RlciBtaW51cyB0aGUgdGltZSBvZiB0aGUgcHJldmlvdXMgZ3JhbmRtYXN0ZXIsIGluIHVuaXRzIG9mIDJeLTE2IG5zIChjdXJyZW50bHkgdW51c2VkIGJ1dCByZXF1aXJlZCBieSBzcGVjKS4gKi8KKyAgICBpbnQzMl90IGxhc3RfZnJlcXVlbmN5X2NoYW5nZTsgICAgICAvKio8IEZyYWN0aW9uYWwgZnJlcXVlbmN5IG9mZnNldCBvZiB0aGUgY3VycmVudCBncmFuZG1hc3RlciByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgZ3JhbmRtYXN0ZXIgKE5vdCBjdXJyZW50bHkgdXNlZCBidXQgcmVxdWlyZWQgYnkgc3BlYykuICovCit9IGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmM7CisKKy8qKiBSYXRlIGxpbWl0aW5nIC8gc2hhcGluZyBmb3IgdGhlIGluZGljYXRpb24gY2hhbm5lbC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcKK3sKKyAgICBiY21vc19ib29sIGVuYWJsZWQ7IC8qKjwgV2hldGhlciBvciBub3QgdGhlIGRldmljZSB3aWxsIGxpbWl0IHRoZSByYXRlIG9mIGluZGljYXRpb25zIHNlbnQgdG8gdGhlIGhvc3QuICovCisgICAgdWludDMyX3QgbWF4X3JhdGU7ICAvKio8IE1heGltdW0gbnVtYmVyIG9mIGluZGljYXRpb25zIHBlciBzZWNvbmQgdG8gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZpY2UuICovCisgICAgdWludDMyX3QgbWF4X2J1cnN0OyAvKio8IE1heGltdW0gbnVtYmVyIG9mIGluZGljYXRpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgc2VudCBiYWNrLXRvLWJhY2suICovCit9IGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmc7CisKKy8qKiBMQSByZXN5bmMgcGF0dGVybiBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24KK3sKKyAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgcmVzeW5jX2NvbnRyb2w7ICAgLyoqPCB1c2VkIGluIG5vcm1hbCBtb2RlICovCisgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHJhbmdpbmdfcmVzeW5jX2NvbnRyb2w7ICAgLyoqPCB1c2VkIGluIHJhbmdpbmcgbW9kZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcmFuZ2luZyBjeWNsZSAqLworfSBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbjsKKworLyoqIGxvZyBidWZmZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2J1ZmZlcgoreworICAgIGNoYXIgYnVmZlsyMDQ4XTsgICAgICAgIC8qKjwgYnVmZi4gKi8KKyAgICB1aW50MzJfdCBtc2dfdG9fcmVhZDsgICAvKio8IG1zZ190b19yZWFkLiAqLworfSBiY21vbHRfbG9nX2J1ZmZlcjsKKworLyoqIE1BQyB0YWJsZSBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uCit7CisgICAgYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrIG1pc3NfZmFsbGJhY2s7ICAgLyoqPCBCZWhhdmlvciBmb3IgZG93bnN0cmVhbSB0cmFmZmljIHdoZW4gTUFDIHRhYmxlIGxvb2t1cCBmYWlscy4gKi8KKyAgICBiY21vbHRfZmxvd19pZCBkZWZhdWx0X2Zsb3dfaWQ7ICAgICAgICAgICAgICAgICAvKio8IEZsb3cgSUQgYXNzaWduZWQgdG8gdXBzdHJlYW0gdHJhZmZpYyBvbiBhIE1BQyB0YWJsZSBtaXNzIGlmIG1pc3NfZmFsbGJhY2sgaXMgc2V0IHRvIGRlZmF1bHRfZmxvdy4gKi8KKyAgICB1aW50MzJfdCBhZ2luZ190aW1lOyAgICAvKio8IEFnaW5nIHRpbWUgaW4gc2Vjb25kcy4gIElmIG5vIHRyYWZmaWMgaXMgc2VlbiBmb3IgYSBnaXZlbiBNQUMgYWRkcmVzcyAvIFZJRCBmb3IgdGhpcyBsZW5ndGggb2YgdGltZSwgdGhlIGVudHJ5IHdpbGwgYWdlIGFuZCB0aGUgaG9zdCB3aWxsIGJlIG5vdGlmaWVkIHZpYSBpbmRpY2F0aW9uLiAqLworICAgIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZSBsZWFybmluZ19tb2RlOyAgIC8qKjwgTGVhcm5pbmcgdGFibGUgbW9kZS4gKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBhdXRvbWF0aWNfbWFjX2xlYXJuaW5nOyAgICAvKio8IElmIGVuYWJsZWQsIG5ldyBNQUMgdGFibGUgZW50cmllcyBhcmUgYWRkZWQgYXV0b21hdGljYWxseSB0aGUgZmlyc3QgdGltZSBhIG5ldyBNQUMgYWRkcmVzcy9WSUQgY29tYmluYXRpb24gaXMgc2Vlbi4gIElmIGRpc2FibGVkLCBubyBhY3Rpb25zIGFyZSB0YWtlbiBhdXRvbWF0aWNhbGx5IGV4Y2VwdCBub3RpZnlpbmcgdGhlIGhvc3QgdmlhIGluZGljYXRpb24uICovCisgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgYXV0b21hdGljX21hY19hZ2luZzsgICAgICAgLyoqPCBJZiBlbmFibGVkLCBNQUMgdGFibGUgZW50cmllcyBhcmUgZGVsZXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhleSBhZ2UuICBJZiBkaXNhYmxlZCwgbm8gYWN0aW9ucyBhcmUgdGFrZW4gYXV0b21hdGljYWxseSBleGNlcHQgbm90aWZ5aW5nIHRoZSBob3N0IHZpYSBpbmRpY2F0aW9uLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGF1dG9tYXRpY19tYWNfbW92ZTsgICAgICAgIC8qKjwgT25seSBhcHBsaWNhYmxlIGlmIGxlYXJuaW5nX21vZGUgaXMgbW92ZS4gIElmIGVuYWJsZWQsIE1BQyB0YWJsZSBlbnRyaWVzIGFyZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2hlbiBhIE1BQyBtb3ZlIGNvbmRpdGlvbiBpcyBlbmNvdW50ZXJlZC4gIElmIGRpc2FibGVkLCBubyBhY3Rpb25zIGFyZSB0YWtlbiBhdXRvbWF0aWNhbGx5IGV4Y2VwdCBub3RpZnlpbmcgdGhlIGhvc3QgdmlhIGluZGljYXRpb24uICovCisgICAgYmNtb3NfYm9vbCBhdXRvbWF0aWNfc3RhdGljX21vZGU7ICAgICAgICAgICAgICAgLyoqPCBJZiBlbmFibGVkLCBhbGwgTUFDIGVudHJpZXMgdGhhdCBhcmUgYWRkZWQgYXV0b21hdGljYWxseSB2aWEgYXV0b21hdGljX21hY19sZWFybmluZyBhbmQgYXV0b21hdGljX21hY19tb3ZlIHdpbGwgYmUgdHJlYXRlZCBhcyBzdGF0aWMgKG5vdCBhZ2luZykuICovCit9IGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbjsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIE1hY0FkZHJlc3MuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMgoreworICAgIHVpbnQzMl90IGxlbjsgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgKnZhbDsgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMjsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIE1hY0FkZHJlc3MuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OAoreworICAgIHVpbnQzMl90IGxlbjsgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgKnZhbDsgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0ODsKKworLyoqIE5OSSBMaW5rIFN0YXR1cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfbGlua19zdGF0dXMKK3sKKyAgICBiY21vbHRfdHJpdmFsZW50IGxpbmtfc3RhdHVzOyAgICAgICAvKio8IFRoZSBsb2NhbCBhbmQgcmVtb3RlIHBhcnRuZXJzIGFyZSBhYmxlZCBhbmQgcmVhZHkgdG8gdHJhbnNtaXQvcmVjZWl2ZSB0cmFmZmljLiAqLworICAgIGJjbW9sdF90cml2YWxlbnQgc2lnbmFsX2RldGVjdGVkOyAgIC8qKjwgU2VyZGVzIGNvbnRyb2xsZXIgaGFzIGRldGVjdGVkIGVuZXJneSBvbiB0aGUgbGluZS4gIGRlYnVnZ2luZyBwdXJwb3NlLiAqLworICAgIGJjbW9sdF90cml2YWxlbnQgcG1kX2xvY2tlZDsgICAgICAgIC8qKjwgSW5kaWNhdGVzIFBNRCBsb2NrZWQuICBkZWJ1Z2dpbmcgcHVycG9zZS4gIElmIHRoaXMgaXMgdHJ1ZSwgYnV0IHRoZSBsaW5rcyBzdGF0dXMgaXMgbm90LCB0aGF0IG1lYW5zIHRoZSB0cmFuc2NlaXZlciBpcyBub3QgZW5hYmxlZC4gKi8KK30gYmNtb2x0X25uaV9saW5rX3N0YXR1czsKKworLyoqIE9BTSBoZWFydGJlYXQgY29uZmlndXJhdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnCit7CisgICAgdWludDE2X3Qgc2VuZF9wZXJpb2Q7ICAgICAgICAgICAgICAgLyoqPCBUaGUgcGVyaW9kIGF0IHdoaWNoIHRvIHNlbmQgT0FNIGluZm8gZnJhbWVzLCBhbmQgZXhwZWN0IGluZm8gcmVzcG9uc2VzIG9uIHRoaXMgbGluayAoaW4gc2Vjb25kcykuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTE2IHRyYW5zbWl0X2ZyYW1lOyAgLyoqPCBUaGUgT0FNIFBEVSBwYXlsb2FkIGZyb20gdGhlIEZsYWdzIGZpZWxkIChvZmZzZXQgMTUpIHRvIHRoZSBlbmQgb2YgdGhlIFBEVSAoYmVmb3JlIHRoZSBGQ1MpLiAqLworICAgIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlOyAgICAvKio8IE9BTSBwYWNrZXRzIG1hdGNoaW5nIHRoaXMgbWFza2VkIHBheWxvYWQgd2lsbCBiZSBkcm9wcGVkIHJhdGhlciB0aGFuIGZvcndhcmRlZCB0byB0aGUgaG9zdC4gKi8KKyAgICB1aW50MTZfdCByZWNlaXZlX3RpbWVvdXQ7ICAgICAgIC8qKjwgVGhlIHRpbWUgKGluIHNlY29uZHMpIHRvIHJlcG9ydCBPQU0gdGltZW91dCBhZnRlciB0aGUgbGFzdCByZWNlaXZlZCBPQU0gZnJhbWUuICovCisgICAgdWludDE2X3QgbWF4aW11bV9yZWNlaXZlX3NpemU7ICAvKio8IE1heGltdW0gc2l6ZSBvZiByZWNlaXZlZCBmcmFtZXMuICBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gemVybyB3aWxsIGNhdXNlIGFsbCBPQU0gZnJhbWVzIHRvIGJlIGRyb3BwZWQuICovCit9IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZzsKKworLyoqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIE9OVSBwb3dlciBtYW5hZ2VtZW50IGZlYXR1cmUuIFRoZXNlIHNob3VsZCAKKyAqIG1hdGNoIHRoZSBwYXJhbWV0ZXJzIHNlbnQgdG8gdGhlIE9OVSB2aWEgT01DSS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uCit7CisgICAgdWludDMyX3QgaWxvd3Bvd2VyOyAgICAgICAgIC8qKjwgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgYW55IE9OVSBvbiB0aGlzIE5JIG1heSBzcGVuZCBpbiBhIGxvdyBwb3dlciBzdGF0ZSBpbiB1bml0cyBvZiAxMjV1cy4gKi8KKyAgICB1aW50MzJfdCBpYXdhcmU7ICAgICAgICAgICAgLyoqPCBUaGUgbWluaW11bSBhbW91bnQgb2YgdGltZSBldmVyeSBPTlUgb24gaGlzIE5JIG11c3Qgc3BlbmQgaW4gYW4gYXdhcmUgc3RhdGUgaW4gdW5pdHMgb2YgMTI1dXMuICovCisgICAgdWludDE2X3QgaXRyYW5zaW5pdDsgICAgICAgIC8qKjwgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgYnkgYW55IE9OVSBvbiB0aGlzIE5JIHRvIHBvd2VyIHVwIGl0cyB0cmFuc21pdHRlciBvbmx5IGZyb20gYSBsb3cgcG93ZXIgc3RhdGUgaW4gdW5pdHMgb2YgMTI1dXMuICovCisgICAgdWludDE2X3QgaXR4aW5pdDsgICAgICAgICAgIC8qKjwgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgYnkgYW55IE9OVSBvbiB0aGlzIE5JIHRvIHBvd2VyIHVwIGl0cyB0cmFuc2NlaXZlciAodHJhbnNtaXR0ZXIgKyByZWNlaXZlcikgZnJvbSBhIGxvdyBwb3dlciBzdGF0ZSBpbiB1bml0cyBvZiAxMjV1cy4gKi8KKyAgICB1aW50MzJfdCBpcnhvZmY7ICAgICAgICAgICAgLyoqPCBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSBhbnkgT05VIG9uIHRoaXMgTkkgbWF5IHNwZW5kIHdpdGggaXRzIHJlY2VpdmVyIGRpc2FibGVkIGluIHVuaXRzIG9mIDEyNXVzLiAqLworICAgIHVpbnQxNl90IGxvd19wb3dlcl9jbG9iaTsgICAvKio8IFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgbm9uLWNvbnRpZ3VvdXMgbWlzc2luZyBhbGxvY2F0aW9ucyB0byBhbGxvdyBiZWZvcmUgcmFpc2luZyB0aGUgTE9TaS9MT0ZpL0xPQmkgYWxhcm1zIG9uIGFueSBPTlUgb24gdGhpcyBOSS4gKi8KK30gYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb247CisKKy8qKiBvbnUgdHVuaW5nIGNvbmZpZ3VyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uCit7CisgICAgdWludDMyX3QgdHNvdXJjZTsgICAvKio8IFRzb3VyY2UgdGltZXIgaW4gbXNlYyAqLworICAgIHVpbnQzMl90IHR0YXJnZXQ7ICAgLyoqPCBUdGFyZ2V0IHRpbWVyIGluIG1zZWMgKi8KKyAgICBiY21vc19ib29sIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkOyAgIC8qKjwgaXMgcmVxdWVzdCByZWdpc3RyYXRpb24gcGFydCBvZiB0aGUgdHVuaW5nIGluIHByb2Nlc3MgKi8KK30gYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbjsKKworLyoqIElkZW50aWZpZXMgdGhlIFRXRE0gY2hhbm5lbCB0ZXJtaW5hdGlvbiB3aXRoaW4gYSBjZXJ0YWluIGRvbWFpbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3Bvbl9pZAoreworICAgIHVpbnQzMl90IGFkbWluaXN0cmF0aXZlX2xhYmVsOyAgLyoqPCBNU0IgMjggYml0IG9mIHRoZSBQT04gSUQgKi8KKyAgICB1aW50OF90IGR3bGNoX2lkOyAgICAgICAgICAgICAgIC8qKjwgTFNCIDQgYml0cyBvZiB0aGUgUE9OIElEICovCit9IGJjbW9sdF9wb25faWQ7CisKKy8qKiBPcGVyYXRpb24gQ29udHJvbCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sCit7CisgICAgdWludDhfdCByZTsgICAgICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIFRyYW5zbWl0IE9wdGljYWwgTGV2ZWwgKFRPTCkgY29udGFpbnMgdGhlIGxhdW5jaCBwb3dlciBvZiB0aGUgT1RMIChSRT0wKSBvciBvZiBhIHJlYWNoIGV4dGVuZGVyIChSRT0xKSAqLworICAgIGJjbW9sdF9vZG5fY2xhc3Mgb2RuX2NsYXNzOyAvKio8IElkZW50aWZpZXMgdGhlIG5vbWluYWwgb3B0aWNhbCBwYXJhbWV0ZXJzIG9mIHRoZSB0cmFuc2NlaXZlciBhY2NvcmRpbmcgdG8gdGhlIE9ETiBPcHRpY2FsIFBhdGggTG9zcyAoT1BMKSAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGRzX2ZlY19tb2RlOyAgIC8qKjwgRW5hYmxlL0Rpc2FibGUgdGhlIGRvd25zdHJlYW0gRkVDLiBEZWZhdWx0IGlzIEVuYWJsZS4gQXR0cmlidXRlIGNhbiBiZSBzZXQgb25seSB3aGVuIFBPTiBOSSBzdGF0ZSBpcyBJbmFjdGl2ZS4gKi8KKyAgICBiY21vbHRfdGNfcHJvdG9jb2wgcHJvdG9jb2w7ICAgICAgICAvKio8IFdoZW4gc3lzdGVtIG1vZGUgaXMgTkdQT04yLCB0aGlzIHBhcmFtZXRlciBJbmRpY2F0ZSB0aGUgVEMgbGF5ZXIgcHJvdG9jb2w6IElUVS1UIEcuOTg5LjMgb3IgSVRVLVQgRy45ODcuMyAqLworICAgIGJjbW9sdF9saW5rX3R5cGUgZHNfbGlua190eXBlOyAgICAgIC8qKjwgT3B0aWNhbCBsaW5rIHR5cGUgKFVuc3BlY2lmaWVkLCBBLCBCLCBCb3RoKSAqLworICAgIGJjbW9sdF9wb25faWQgcG9uX2lkOyAgICAgICAgICAgICAgIC8qKjwgSWRlbnRpZmllcyB0aGUgVFdETSBjaGFubmVsIHRlcm1pbmF0aW9uIHdpdGhpbiBhIGNlcnRhaW4gZG9tYWluICovCisgICAgdWludDhfdCBjOyAgLyoqPCBUcmFuc21pdCBvcHRpY2FsIGxldmVsIChUT0wpIHJlZmVyZW5jZSBwb2ludCBpbmRpY2F0b3I6IFMvUi1DRyBvciBTL1ItQ1AgKi8KK30gYmNtb2x0X29wZXJhdGlvbl9jb250cm9sOworCisvKiogUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nCit7CisgICAgdWludDMyX3QgaW50ZXJ2YWw7ICAgICAgICAgICAgICAvKio8IGludGVydmFsIGluIG1zLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgLyoqPCBjb250cm9sLiAqLworfSBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZzsKKworLyoqIFBvcnQgTGV2ZWwgU2hhcGVyIENvbmZpZ3VyYXRpb246LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyCit7CisgICAgdWludDMyX3QgYmFuZHdpZHRoX2ticHM7ICAgIC8qKjwgUmF0ZSBpbiBrYnBzLCAwIGlzIGRpc2FibGVkLCBJZiByYXRlIGlzID4xRyB0aGVuIHVzZSAyNTZrYnBzIGluY3JlbWVudHMsIGlmIHJhdGUgaXMgPCAxRyB0aGVuIHVzZSA2NGticHMgaW5jcmVtZW50cy4gICovCisgICAgdWludDMyX3QgbWJzX2tCOyAgICAgICAgICAgIC8qKjwgTWF4aW11bSBCdXJzdCBTaXplIGluIEtCIDogcmFuZ2UgaXMgMktCIHRvIDRNQiBpbiAxS0IgaW5jcmVtZW50cy4gICovCit9IGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcjsKKworLyoqIFBPTiBBbGxvYyBTTEEuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcG9uX2FsbG9jX3NsYQoreworICAgIHVpbnQzMl90IGNicl9ydF9idzsgICAgIC8qKjwgQ0JSIFJlYWwgVGltZSBCYW5kd2lkdGggd2hpY2ggcmVxdWlyZSBzaGFwaW5nIG9mIHRoZSBiYW5kd2lkdGggYWxsb2NhdGlvbnMgaW4gYSBmaW5lIGdyYW51bGFyaXR5LiAgKi8KKyAgICB1aW50MzJfdCBjYnJfbnJ0X2J3OyAgICAvKio8IEZpeGVkIEJhbmR3aWR0aCB3aXRoIG5vIGNyaXRpY2FsIHJlcXVpcmVtZW50IG9mIHNoYXBpbmcgKi8KKyAgICB1aW50MzJfdCBndWFyYW50ZWVkX2J3OyAvKio8IER5bmFtaWMgYmFuZHdpZHRoIHdoaWNoIHRoZSBPTFQgaXMgY29tbWl0dGVkIHRvIGFsbG9jYXRlIHVwb24gZGVtYW5kICovCisgICAgdWludDMyX3QgbWF4aW11bV9idzsgICAgLyoqPCBNYXhpbXVtIGFsbG9jYXRlZCBiYW5kd2lkdGggYWxsb3dlZCBmb3IgdGhpcyBhbGxvYyBJRCAqLworICAgIGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5IGFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHk7IC8qKjwgQWxsb2MgSUQgYWRkaXRpb25hbCBCVyBlbGlnaWJpbGl0eSAqLworICAgIGJjbW9zX2Jvb2wgY2JyX3J0X2NvbXBlbnNhdGlvbjsgLyoqPCBTZXQgdG8gVHJ1ZSBmb3IgQWxsb2NJRCB3aXRoIENCUiBSVCBCYW5kd2lkdGggdGhhdCByZXF1aXJlcyBjb21wZW5zYXRpb24gZm9yIHNraXBwZWQgYWxsb2NhdGlvbnMgZHVyaW5nIHF1aWV0IHdpbmRvdyAqLworICAgIHVpbnQ4X3QgY2JyX3J0X2FwX2luZGV4OyAgICAgICAgLyoqPCBBbGxvY2F0aW9uIFByb2ZpbGUgaW5kZXggZm9yIENCUiBSVCBCYW5kd2lkdGggKi8KKyAgICB1aW50OF90IGNicl9ucnRfYXBfaW5kZXg7ICAgICAgIC8qKjwgQWxsb2NhdGlvbiBQcm9maWxlIGluZGV4IGZvciBDQlIgbm9uLVJUIEJhbmR3aWR0aCAqLworICAgIGJjbW9sdF9hbGxvY190eXBlIGFsbG9jX3R5cGU7ICAgLyoqPCBUeXBlIG9mIHRoZSBhbGxvYyBJRCAgKi8KKyAgICB1aW50OF90IHdlaWdodDsgICAgICAgICAgICAgICAgIC8qKjwgQWxsb2MgSUQgV2VpZ2h0IHVzZWQgaW4gY2FzZSBvZiBFeHRlbmRlZCBEQkEgbW9kZSAqLworICAgIHVpbnQ4X3QgcHJpb3JpdHk7ICAgICAgICAgICAgICAgLyoqPCBBbGxvYyBJRCBQcmlvcml0eSB1c2VkIGluIGNhc2Ugb2YgRXh0ZW5kZWQgREJBIG1vZGUgKi8KK30gYmNtb2x0X3Bvbl9hbGxvY19zbGE7CisKKy8qKiBQT04gYXZhaWxhYmxlIGJhbmR3aWR0aC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aAoreworICAgIHVpbnQzMl90IGNicl9idzsgICAgICAgICAgICAvKio8IFRvdGFsIEJXIGF2YWlsYWJsZSBmb3IgQ0JSIHJlYWwtdGltZSB0cmFmZmljIChieXRlcy9zZWMpLiAqLworICAgIHVpbnQzMl90IHRvdGFsX2J3OyAgICAgICAgICAvKio8IFRvdGFsIEJXIGF2YWlsYWJsZSBmb3IgZ3VhcmFudGVlZCB0cmFmZmljIChieXRlcy9zZWMpICovCisgICAgdWludDMyX3QgbmV4dF9vbnVfdG90YWxfYnc7IC8qKjwgVG90YWwgQlcgYXZhaWxhYmxlIGZvciBndWFyYW50ZWVkIHRyYWZmaWMgYWZ0ZXIgbmV3IE9OVSBpcyBhZGRlZCAoYnl0ZXMvc2VjKS4gKi8KK30gYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoOworCisvKiogUE9OIERCQS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wb25fZGJhCit7CisgICAgdWludDhfdCBzcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZTsgICAgLyoqPCBPTlUgc3RhdHVzIHJlcG9ydCBibG9jayBzaXplIGluIGJ5dGVzICovCisgICAgYmNtb2x0X2RiYV9tb2RlIGRiYV9tb2RlOyAgICAgICAgICAgLyoqPCBEQkEgbW9kZSAqLworfSBiY21vbHRfcG9uX2RiYTsKKworLyoqIFBPTiBEaXN0YW5jZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wb25fZGlzdGFuY2UKK3sKKyAgICB1aW50MzJfdCBtYXhfbG9nX2Rpc3RhbmNlOyAgLyoqPCBNYXggbG9naWNhbCBkaXN0YW5jZSBvZiBhbiBPTlUgb24gdGhlIFBPTiAqLworICAgIHVpbnQzMl90IG1heF9kaWZmX3JlYWNoOyAgICAvKio8IE1heCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBjbG9zZXN0IGFuZCBmYXJ0aGVzdCBPTlUgKi8KK30gYmNtb2x0X3Bvbl9kaXN0YW5jZTsKKworLyoqIFBPTiBEcmlmdCBDb250cm9sLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sCit7CisgICAgdWludDMyX3QgZHJpZnRfaW50ZXJ2YWw7ICAgICAgICAgICAgLyoqPCBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgZm9yIE9OVSB0cmFuc21pc3Npb24gZHJpZnQgbW9uaXRvcmluZyAoMCA9IGRpc2FibGVkKS4gKi8KKyAgICB1aW50OF90IGRyaWZ0X2xpbWl0OyAgICAgICAgICAgICAgICAvKio8IERPV2kgdGhyZXNob2xkIGluIGJpdHMgKi8KKyAgICB1aW50OF90IHRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0OyAvKio8IFRJV2kgdGhyZXNob2xkIGluIGJpdHMgKi8KK30gYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgcG9uX29udV9pZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyCit7CisgICAgdWludDMyX3QgbGVuOyAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21vbHRfcG9uX29udV9pZCAqdmFsOyAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyOworCisvKiogUE9OIFBvd2VyIExldmVsLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbAoreworICAgIHVpbnQzMl90IHBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZTsgICAvKio8IE1heCBhbGxvY2F0aW9uIHNpemUgZm9yIFBMUyB0cmFuc21pc3Npb24gKi8KKyAgICB1aW50OF90IG1vZGU7ICAgLyoqPCBPTlUgZGVmYXVsdCBwb3dlciBsZXZlbCBtb2RlICovCit9IGJjbW9sdF9wb25fcG93ZXJfbGV2ZWw7CisKKy8qKiBHUE9OIHByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbmZpZ3VyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nCit7CisgICAgdWludDE2X3QgdGltZW91dDsgICAgICAgICAgIC8qKjwgTE9TIHN3aXRjaCBvdmVyIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovCisgICAgYmNtb2x0X2dwaW9fcGluIGdwaW9fcGluOyAgIC8qKjwgR1BJTyBwaW4gZm9yIGlucHV0L291dHB1dCBzaWduYWwgKi8KKyAgICBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgb3B0aW9uczsgICAgLyoqPCBPcHRpb25zIHRvIGNvbnRyb2wgdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIHByb2Nlc3MgKi8KK30gYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZzsKKworLyoqIFBPTiBTdGF0dXMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcG9uX3N0YXR1cworeworICAgIGJjbW9sdF9wb25fc3RhdGUgc3RhdGU7ICAgICAvKio8IHN0YXRlLiAqLworICAgIGJjbW9sdF9zdGF0dXMgbG9zX3N0YXR1czsgICAvKio8IExPUyBzdGF0dXMuICovCit9IGJjbW9sdF9wb25fc3RhdHVzOworCisvKiogUFJCUyBjaGVja2VyIGNvbmZpZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnCit7CisgICAgYmNtb2x0X3ByYnNfcG9seW5vbWlhbCBwb2x5bm9tOyAvKio8IFBSQlMgcG9seW5vbSB0eXBlICovCisgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlIG1vZGU7ICAvKio8IFBSQlMgTE9DSyBzdGF0ZSBtYWNoaW5lLiAqLworICAgIGJjbW9zX2Jvb2wgZGF0YV9pbnZlcnQ7ICAgICAgICAgLyoqPCBJbnZlcnQgb3Igbm8gaW52ZXJ0IGZvciByZWNlaXZlZCBQUkJTIGRhdGEgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBjb250cm9sOyAgIC8qKjwgRW5hYmxlXERpc2FibGUgdGhlIFVTIFBSQlMgY2hlY2tlciAqLworfSBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZzsKKworLyoqIFBSQlMgR2VuZXJhdG9yIGNvbmZpZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcKK3sKKyAgICBiY21vbHRfcHJic19wb2x5bm9taWFsIHBvbHlub207IC8qKjwgUFJCUyBwb2x5bm9tIHR5cGUgKi8KKyAgICBiY21vc19ib29sIGVycm9yX2luc2VydDsgICAgICAgIC8qKjwgMCB0byAxIHRyYW5zaXRpb24gb24gdGhpcyBzaWduYWwgd2lsbCBpbnNlcnQgc2luZ2xlIGJpdCBlcnJvciBpbiB0aGUgTVNCIGJpdCBvZiB0aGUgZGF0YSBidXMuICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnQ7ICAgICAgICAgICAgICAvKio8IEludmVydCBvciBubyBpbnZlcnQgZm9yIHRyYW5zbWl0dGVkIFBSQlMgZGF0YSAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgLyoqPCBFbmFibGVcRGlzYWJsZSB0aGUgRFMgUFJCUyBnZW5lcmF0b3IgKi8KK30gYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZzsKKworLyoqIFRoYXQgc3RhdGUgb2YgdGhlIFBSQlMgdGVzdCwgbG9jayBzdGF0ZSwgYW5kIGVycm9yIGNvdW50ZXJzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3ByYnNfc3RhdHVzCit7CisgICAgYmNtb2x0X3ByYnNfbG9ja19zdGF0ZSBsb2NrX3N0YXRlOyAgLyoqPCBUaGUgc3RhdGUgb2YgdGhlIFBSQlMgbG9jayAqLworICAgIHVpbnQzMl90IGVycm9yX2NvdW50czsgICAgICAgICAgICAgIC8qKjwgVGhlIGJpdCBlcnJvcnMgb2JzZXJ2ZWQgZHVyaW5nIHRoZSBQUkJTIHRlc3QuICBUaGlzIGZpZWxkIGlzIGNsZWFyIG9uIHJlYWQuICovCit9IGJjbW9sdF9wcmJzX3N0YXR1czsKKworLyoqIHJhbmdpbmcgY29udHJvbCBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uCit7CisgICAgdWludDhfdCB3YWl0X3N0YXRlXzFfd2luZG93X3NpemU7ICAgLyoqPCB3YWl0IHN0YXRlIDEgd2luZG93IHNpemUuICovCisgICAgdWludDhfdCB3YWl0X3N0YXRlXzJfd2luZG93X3NpemU7ICAgLyoqPCB3YWl0IHN0YXRlIDIgd2luZG93IHNpemUuICovCisgICAgYmNtb3NfYm9vbCB3YWl0X2FmdGVyX3Jlc3luY180OyAgICAgLyoqPCB3YWl0IGFmdGVyIHJlc3luYyA0LiAqLworfSBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb247CisKKy8qKiByYW5naW5nIHJlc3luYyBjb25kaXRpb25zLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMKK3sKKyAgICBiY21vc19ib29sIGFmdGVyX2luaXQ7ICAgICAgICAgICAgICAvKio8IGFmdGVyIGluaXQuICovCisgICAgYmNtb3NfYm9vbCBhZnRlcl9ub19lZDsgICAgICAgICAgICAgLyoqPCBhZnRlciBubyBlZC4gKi8KKyAgICBiY21vc19ib29sIGFmdGVyX2VkOyAgICAgICAgICAgICAgICAvKio8IGFmdGVyIGVkLiAqLworICAgIGJjbW9zX2Jvb2wgYWZ0ZXJfbm9fZGVsOyAgICAgICAgICAgIC8qKjwgYWZ0ZXIgbm8gZGVsLiAqLworICAgIGJjbW9zX2Jvb2wgYWZ0ZXJfcmFuZ2luZ19hY2Nlc3M7ICAgIC8qKjwgYWZ0ZXIgcmFuZ2luZyBhY2Nlc3MuICovCisgICAgdWludDE2X3QgbWVkX3ZhbDsgICAgICAgICAgICAgICAgICAgLyoqPCBtZWQgdmFsLiAqLworfSBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uczsKKworLyoqIHJhbmdpbmcgcnNzaSBjb250cm9sLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sCit7CisgICAgYmNtb3NfYm9vbCBhZnRlcl9ub19lZDsgICAgIC8qKjwgYWZ0ZXIgbm8gZWQuICovCisgICAgYmNtb3NfYm9vbCBhZnRlcl9lZDsgICAgICAgIC8qKjwgYWZ0ZXIgZWQuICovCisgICAgYmNtb3NfYm9vbCBhZnRlcl9yZXNldF8zOyAgIC8qKjwgYWZ0ZXIgcmVzZXQgMy4gKi8KK30gYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sOworCisvKiogcmVxdWVzdCByZWdpc3RyYXRpb24gc3RhdHVzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cworeworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXRlOyAgICAvKio8IHJlcXVlc3QgcmVnaXN0cmF0aW9uIHN0YXRlLiAqLworICAgIGJjbW9zX2Jvb2wgc21hX2ZsYWc7ICAgIC8qKjwgaXMgcmVxdWVzdCByZWdpc3RyYXRpb24gaXMgcGFydCBvZiBzbWEgcHJvY2VzcyAqLworfSBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzOworCisvKiogUm9ndWUgRGV0ZWN0aW9uIFNwZWNpYWwgTWFwLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcAoreworICAgIHVpbnQzMl90IHBsb19zaXplOyAgICAgICAgICAgICAgLyoqPCBQTE8gc2l6ZS4gKi8KKyAgICBiY21vbHRfcG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAgIC8qKjwgQWxsb2MgSUQuICovCisgICAgYmNtb2x0X3Bvbl9vbnVfaWQgb251X2lkOyAgICAgICAvKio8IE9OVSBJRC4gKi8KKyAgICB1aW50OF90IGFjY2Vzc19zaXplOyAgICAgICAgICAgIC8qKjwgQWNjZXNzIHNpemUuICovCit9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXA7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiByb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84Cit7CisgICAgdWludDMyX3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqdmFsOyAgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzg7CisKKy8qKiBUeXBlIGFuZCBhdHRyaWJ1dGVzIG9mIHRoZSByb2d1ZSBkZXRlY3Rpb24gYWxnb3JpdGhtLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0KK3sKKyAgICBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlIGFsZ29yaXRobV90eXBlOyAgIC8qKjwgVHlwZSBvZiB0aGUgcm9ndWUgZGV0ZWN0aW9uIGFsZ29yaXRobS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IG1lYXN1cmVtZW50X3R5cGU7IC8qKjwgU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyAqLworICAgICAgICAgICAgdWludDMyX3QgaW50ZXJ2YWw7ICAgICAgICAgICAgICAgICAgLyoqPCBQZXJpb2RpYyBwcm9jZXNzIHRpbWVyIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBzZWNvbmRfcmFuZ2luZ193aW5kb3c7ICAgLyoqPCBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNlY29uZCByYW5naW5nIHdpbmRvdyBzaG91bGQgYmUgaW52b2tlZCBvciBub3QuICovCisgICAgICAgICAgICBiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuIGFsbG9jX3R5cGVfdG9fc2NhbjsgICAgICAgICAgICAgICAvKio8IEFsbG9jIHR5cGUgdG8gc2NhbiBkdXJpbmcgcm9ndWUgZGV0ZWN0aW9uLiAgVW51c2VkLCBwcmV2aW91c2x5IHVzZWQsIG9yIGFsbCBBbGxvYy1JRHMuICovCisgICAgICAgIH0gZWFybHlfcm9ndWVfZGV0ZWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84IGFjY2Vzc2VzOyAvKio8IEFjY2Vzc2VzLiAqLworICAgICAgICB9IHNwZWNpYWxfbWFwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBhZGRpdGlvbmFsX2d1YXJkX3RpbWU7IC8qKjwgQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgZm9yIGFsbCBPTlVzIG9uIHRoaXMgUE9OLiAqLworICAgICAgICB9IGV4dGVuZGVkX2d1YXJkX3RpbWU7CisgICAgfSB1OworfSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobTsKKworLyoqIENvbmZpZ3VyZXMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24gcGVyaW9kaWMgcHJvY2Vzcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MKK3sKKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBjb250cm9sOyAgIC8qKjwgRW5hYmxlL0Rpc2FibGUgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24gcHJvY2Vzcy4gKi8KKyAgICBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSBkZXRlY3Rpb25fYWxnb3JpdGhtOyAgIC8qKjwgVHlwZSBhbmQgYXR0cmlidXRlcyBvZiB0aGUgcm9ndWUgZGV0ZWN0aW9uIGFsZ29yaXRobS4gKi8KK30gYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzczsKKworLyoqIHNlcmRlcyBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uCit7CisgICAgYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUgcmFuZ2luZ19tb2RlOyAgICAvKio8IFNlbGVjdCByYW5naW5nIG1vZGUgZm9yIEdQT04vWEdQT04gKi8KKyAgICBiY21vc19ib29sIG11bHRpX2VkX21vZGU7ICAgICAgICAgICAgICAgICAgIC8qKjwgQWxsb3cgZm9yIG11bHRpcGxlIEVEIGZvciBFRCBtb2RlIGZvciBHUE9OL1hHUE9OICovCisgICAgdWludDE2X3QgYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldDsgICAgICAgICAvKio8IFN0YXJ0IG9mZnNldCBmb3Igc3RhdCBjYXB0dXJlIG9uIFNFUkRFUyBjaGFubmVsICovCisgICAgdWludDE2X3QgYnVyc3RfZW5hYmxlX2VuZF9vZmZzZXQ7ICAgICAgICAgICAvKio8IEVuZCBvZmZzZXQgZm9yIHN0YXQgY2FwdHVyZSBvbiBTRVJERVMgY2hhbm5lbCAgKi8KKyAgICBiY21vc19ib29sIGVkX2ludmVydGlvbjsgICAgICAgICAgICAgICAgICAgIC8qKjwgZWQgaW52ZXJ0aW9uLiAqLworfSBiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb247CisKKy8qKiBzZXJpYWwgbnVtYmVyLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3NlcmlhbF9udW1iZXIKK3sKKyAgICB1aW50OF90IHZlbmRvcl9pZFs0XTsgICAgICAgLyoqPCB2ZW5kb3IgaWQuICovCisgICAgdWludDhfdCB2ZW5kb3Jfc3BlY2lmaWNbNF07IC8qKjwgdmVuZG9yIHNwZWNpZmljLiAqLworfSBiY21vbHRfc2VyaWFsX251bWJlcjsKKworLyoqIFNvbGljaXRlZCBTY2hlZHVsZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlcgoreworICAgIGJjbW9sdF9iYW5kd2lkdGhfS2JwcyBiYW5kd2lkdGhfS2JwczsgICAvKio8IFRoZSBtYXhpbXVtIGxheWVyIDEgdGhyb3VnaHB1dCBwcm92aWRlZCBieSB0aGlzIHNjaGVkdWxlciAoaW4gS2JwcykuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIG1heF9idXJzdF9zaXplX3RxOyAgIC8qKjwgVGhlIG1heGltdW0gYnVyc3Qgc2l6ZSAoaW4gVFEpLiAqLworICAgIHVpbnQ4X3QgcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBwcmlvcml0eSBhdCB3aGljaCB0aGlzIHNjaGVkdWxlciBydW5zLiAgVGhpcyBmaWVsZCBpcyByZWFkLW9ubHkgYW5kIGZpeGVkIGF0IDAgZm9yIHRoZSBNSU4gU2hhcGVyL1NjaGVkdWxlciAgZWxlbWVudC4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgd2VpZ2h0X3RxOyAgICAgICAgICAgLyoqPCBUaGUgd2VpZ2h0IG9mIHRoaXMgc2NoZWR1bGVyIChpbiBUUSByb3VuZGVkIHVwIHRvIG5lYXJlc3QgMTI4KS4gTXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gR3JhbnQgVGhyZXNob2xkLiAqLworfSBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlcjsKKworLyoqIFN0YXRpc3RpYyBhbGFybSB0cmlnZ2VyIGNvbmZpZ3VyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZworeworICAgIGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlIHR5cGU7ICAgIC8qKjwgVHlwZSBvZiBjb25kaXRpb24gdG8gdHJpZ2dlciB0aGUgYWxhcm0uICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByaXNpbmc7ICAgICAgICAgICAgLyoqPCBUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBkZWx0YSB2YWx1ZSBwZXIgc2Vjb25kIGJlY29tZXMgZ3JlYXRlciB0aGFuIHRoaXMgdGhyZXNob2xkIGxldmVsLiAqLworICAgICAgICAgICAgdWludDY0X3QgZmFsbGluZzsgICAgICAgICAgIC8qKjwgVGhlIGFsYXJtIGlzIGNsZWFyZWQgaWYgdGhlIHN0YXRzIGRlbHRhIHZhbHVlIHBlciBzZWNvbmQgYmVjb21lcyBsZXNzIHRoYW4gdGhpcyB0aHJlc2hvbGQgbGV2ZWwuICovCisgICAgICAgIH0gcmF0ZV90aHJlc2hvbGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHVwcGVyOyAgICAgICAgICAgICAvKio8IFRoZSBhbGFybSBpcyByYWlzZWQgaWYgdGhlIHN0YXRzIGRlbHRhIHZhbHVlIHBlciBzZWNvbmQgYmVjb21lcyBncmVhdGVyIHRoYW4gdGhpcyB1cHBlciBsZXZlbC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGxvd2VyOyAgICAgICAgICAgICAvKio8IFRoZSBhbGFybSBpcyByYWlzZWQgaWYgdGhlIHN0YXRzIGRlbHRhIHZhbHVlIHBlciBzZWNvbmQgYmVjb21lcyBsZXNzIHRoYW4gdGhpcyBsb3dlciBsZXZlbC4gKi8KKyAgICAgICAgfSByYXRlX3JhbmdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBsaW1pdDsgICAgICAgICAgICAgLyoqPCBUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBzYW1wbGUgdmFsdWUgYmVjb21lcyBncmVhdGVyIHRoYW4gdGhpcyBsZXZlbC4gIFRoZSBhbGFybSBpcyBjbGVhcmVkIHdoZW4gdGhlIGhvc3QgY2xlYXJzIHRoZSBzdGF0cy4gKi8KKyAgICAgICAgfSB2YWx1ZV90aHJlc2hvbGQ7CisgICAgfSB1OworfSBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZzsKKworLyoqIFN0YXRpc3RpY3MgYWxhcm0gc29ha2luZyBjb25maWd1cmF0aW9uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZworeworICAgIHVpbnQzMl90IGFjdGl2ZV9zb2FrX3RpbWU7ICAvKio8IElmIHRoZSBhbGFybSBjb25kaXRpb24gaXMgcmFpc2VkIGFuZCBzdGF5cyBpbiB0aGUgcmFpc2VkIHN0YXRlIGZvciBhdCBsZWFzdCB0aGlzIGFtb3VudCBvZiB0aW1lICh1bml0PXNlY29uZHMpLCB0aGUgYWxhcm0gaW5kaWNhdGlvbiBpcyBzZW50IHRvIHRoZSBob3N0LiAqLworICAgIHVpbnQzMl90IGNsZWFyX3NvYWtfdGltZTsgICAvKio8IEFmdGVyIHRoZSBhbGFybSBpcyByYWlzZWQsIGlmIGl0IGlzIGNsZWFyZWQgYW5kIHN0YXlzIGluIHRoZSBjbGVhcmVkIHN0YXRlIGZvciBhdCBsZWFzdCB0aGlzIGFtb3VudCBvZiB0aW1lICh1bml0PXNlY29uZHMpLCB0aGUgYWxhcm0gaW5kaWNhdGlvbiBpcyBzZW50IHRvIHRoZSBob3N0LiAqLworfSBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZzsKKworLyoqIFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgdHJpZ2dlcjsgICAvKio8IFN0YXRpc3RpY3MgYWxhcm0gdHJpZ2dlciBjb25maWd1cmF0aW9uLiAqLworICAgIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnIHNvYWs7ICAgICAgICAgLyoqPCBTdGF0aXN0aWNzIGFsYXJtIHNvYWtpbmcgY29uZmlndXJhdGlvbiAqLworfSBiY21vbHRfc3RhdF9hbGFybV9jb25maWc7CisKKy8qKiBBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDEwMC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9zdHJfMTAwCit7CisgICAgY2hhciBzdHJbMTAwXTsgIC8qKjwgU3RyaW5nLiAqLworfSBiY21vbHRfc3RyXzEwMDsKKworLyoqIEFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggMTAwMC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9zdHJfMTAwMAoreworICAgIGNoYXIgc3RyWzEwMDBdOyAvKio8IFN0cmluZy4gKi8KK30gYmNtb2x0X3N0cl8xMDAwOworCisvKiogQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAyMDAwLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3N0cl8yMDAwCit7CisgICAgY2hhciBzdHJbMjAwMF07IC8qKjwgU3RyaW5nLiAqLworfSBiY21vbHRfc3RyXzIwMDA7CisKKy8qKiBBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDI1Ni4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9zdHJfMjU2Cit7CisgICAgY2hhciBzdHJbMjU2XTsgIC8qKjwgU3RyaW5nLiAqLworfSBiY21vbHRfc3RyXzI1NjsKKworLyoqIEFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggNjQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc3RyXzY0Cit7CisgICAgY2hhciBzdHJbNjRdOyAgIC8qKjwgU3RyaW5nLiAqLworfSBiY21vbHRfc3RyXzY0OworCisvKiogU1cgRXJyb3IuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc3dfZXJyb3IKK3sKKyAgICB1aW50NjRfdCBmaXJzdF9lcnJvcl90aW1lX3VzOyAgIC8qKjwgVGltZXN0YW1wIChpbiB1cykgd2hlbiBoaXMgZXJyb3IgZmlyc3Qgb2NjdXJyZWQgKi8KKyAgICB1aW50NjRfdCBsYXN0X2Vycm9yX3RpbWVfdXM7ICAgIC8qKjwgVGltZXN0YW1wIChpbiB1cykgd2hlbiBoaXMgZXJyb3IgbGFzdCBvY2N1cnJlZCAqLworICAgIHVpbnQzMl90IGxpbmVfbnVtYmVyOyAgICAgICAgICAgLyoqPCBMaW5lIE51bWJlci4gKi8KKyAgICB1aW50MzJfdCBlcnJvcl9jb3VudGVyOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGVycm9yIGhhcyBvY2N1cnJlZCAqLworICAgIHVpbnQzMl90IGluc3RhbmNlOyAgICAgICAgICAgICAgLyoqPCBJbnN0YW5jZS4gKi8KKyAgICBjaGFyIGZpbGVuYW1lWzY0XTsgICAgICAgICAgICAgIC8qKjwgRmlsZW5hbWUuICovCisgICAgY2hhciB0YXNrX25hbWVbNjRdOyAgICAgICAgICAgICAvKio8IFRhc2sgTmFtZS4gKi8KK30gYmNtb2x0X3N3X2Vycm9yOworCisvKiogU3lzdGVtIHByb2ZpbGUgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9zeXN0ZW1fcHJvZmlsZQoreworICAgIHVpbnQzMl90IG5nXzJfc3lzX2lkOyAgICAgICAvKio8IDIwLWJpdCBpZGVudGlmaWVyIG9mIHRoZSBOR1BPTjIgc3lzdGVtICovCisgICAgdWludDhfdCB2ZXJzaW9uOyAgICAgICAgICAgIC8qKjwgU3lzdGVtIHByb2ZpbGUgdmVyc2lvbi4gKi8KKyAgICB1aW50OF90IGNoYW5uZWxfc3BhY2luZzsgICAgLyoqPCBBbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIGNoYW5uZWwgc3BhY2luZyBpbiB1bml0cyBvZiAxR0h6ICovCisgICAgYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzIHVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzOyAvKio8IFVwc3RyZWFtIG9wZXJhdGluZyB3YXZlbGVuZ3RoIGJhbmRzICovCisgICAgdWludDhfdCB1c19tc2U7IC8qKjwgVXBzdHJlYW0gTWF4aW11bSBTcGVjdHJhbCBFeGN1cnNpb24gKE1TRSkgcmVwcmVzZW50ZWQgYXMgYW4gdW5zaWduZWQgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSB2YWx1ZSBpbiB1bml0cyBvZiAxR0h6ICovCisgICAgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCBsb29zZV9jYWxpYnJhdGlvbl9ib3VuZDsgIC8qKjwgU3BlY3RyYWwgZXhjdXJzaW9uIGJvdW5kIGJlbG93IHdoaWNoIGEgVFdETSBPTlUgY2FuIGJlIGNvbnNpZGVyZWQgYXMgbG9vc2VseSBjYWxpYnJhdGVkICovCisgICAgdWludDE2X3QgZnNyOyAgICAgICAgICAgICAgIC8qKjwgSWYgYSBjeWNsaWMgV00gaXMgdXNlZCBpbiB0aGUgdXBzdHJlYW0sIEZyZWUgU3BlY3RyYWwgUmFuZ2UgaW5kaWNhdGVzIHRoZSB2YWx1ZSBpbiB1bml0cyBvZiAwLjEgR0h6ICovCisgICAgdWludDhfdCB0d2RtX2NoYW5uZWxfY291bnQ7IC8qKjwgVGhlIG51bWJlciBvZiBDaGFubmVsX1Byb2ZpbGUgUExPQU0gbWVzc2FnZXMgd2l0aCBkaXN0aW5jdCBDaGFubmVsIFByb2ZpbGUgaW5kaWNlcyB0aGF0IGFuIE9OVSBjYW4gZXhwZWN0IHRvIHJlY2VpdmUgd2hpbGUgbGlzdGVuaW5nIHRvIHRoaXMgZG93bnN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgKi8KK30gYmNtb2x0X3N5c3RlbV9wcm9maWxlOworCisvKiogVFJYIERlbGltaXRlci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF90cnhfZGVsaW1pdGVyCit7CisgICAgdWludDhfdCBwYXR0ZXJuWzNdOyAgICAgLyoqPCBwYXR0ZXJuLiAqLworICAgIHVpbnQ4X3Qgc2l6ZTsgICAgICAgICAgIC8qKjwgU2l6ZSBpbiBieXRlcy4gKi8KKyAgICB1aW50OF90IHdpbmRvd19zaXplOyAgICAvKio8IFdpbmRvdyBzaXplLiAqLworfSBiY21vbHRfdHJ4X2RlbGltaXRlcjsKKworLyoqIFRSWCBFbmVyZ3kgZGV0ZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0Cit7CisgICAgYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIHJhbmdpbmdfZWRfc291cmNlOyAgICAgIC8qKjwgUmFuZ2luZyBFRCBzb3VyY2UuICovCisgICAgYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIGRlbGltaXRlcl9lZF9zb3VyY2U7ICAgIC8qKjwgRGVsaW1pdGVyIEVEIHNvdXJjZS4gKi8KKyAgICB1aW50OF90IG1pbmltdW1fdGhyZXNob2xkOyAgLyoqPCBNaW5pbXVtIHRocmVzaG9sZC4gKi8KKyAgICB1aW50OF90IG1heGltdW1fdGhyZXNob2xkOyAgLyoqPCBNYXhpbXVtIHRocmVzaG9sZC4gKi8KKyAgICB1aW50OF90IGVkX3BhdHRlcm47ICAgICAgICAgLyoqPCBFRCBwYXR0ZXJuLiAqLworICAgIHVpbnQ4X3QgZWRfcGF0dGVybl9zaXplOyAgICAvKio8IEVEIHBhdHRlcm4gc2l6ZS4gKi8KKyAgICB1aW50OF90IHdpbmRvd19zaXplOyAgICAgICAgLyoqPCBXaW5kb3cgc2l6ZS4gKi8KKyAgICBiY21vc19ib29sIGludmVyc2lvbjsgICAgICAgLyoqPCBJbnZlcnNpb24uICovCisgICAgdWludDhfdCBub19lZF90aHJlc2hvbGQ7ICAgIC8qKjwgbm8gZWQgdGhyZXNob2xkLiAqLworfSBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3Q7CisKKy8qKiBUUlggUHJlYW1ibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdHJ4X3ByZWFtYmxlCit7CisgICAgdWludDhfdCB0eXBlXzFfc2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBUeXBlIDEgc2l6ZS4gKi8KKyAgICB1aW50OF90IHR5cGVfMl9zaXplOyAgICAgICAgICAgICAgICAvKio8IFR5cGUgMiBzaXplLiAqLworICAgIHVpbnQ4X3QgdHlwZV8zX3ByZV9yYW5naW5nX3NpemU7ICAgIC8qKjwgVHlwZSAzIHByZSByYW5naW5nIHNpemUuICovCisgICAgdWludDhfdCB0eXBlXzNfcG9zdF9yYW5naW5nX3NpemU7ICAgLyoqPCBUeXBlIDMgcG9zdCByYW5naW5nIHNpemUuICovCisgICAgdWludDhfdCB0eXBlXzNfcGF0dGVybjsgICAgICAgICAgICAgLyoqPCBUeXBlIDMgcGF0dGVybi4gKi8KK30gYmNtb2x0X3RyeF9wcmVhbWJsZTsKKworLyoqIFRSWCBSWCBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uCit7CisgICAgdWludDhfdCB3YWl0X3dpbmRvd19zaXplOyAgICAgICAgICAgLyoqPCBXYWl0IFdpbmRvdyBzaXplLiAqLworICAgIHVpbnQ4X3QgcmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemU7IC8qKjwgUmFuZ2luZyBhY2Nlc3Mgd2luZG93IHNpemUuICovCit9IGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbjsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIFUzMi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXgKK3sKKyAgICB1aW50MzJfdCBsZW47ICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICB1aW50MzJfdCAqdmFsOyAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4OworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTguIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdThfbGlzdF91MTZfaGV4Cit7CisgICAgdWludDE2X3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgdWludDhfdCAqdmFsOyAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X3U4X2xpc3RfdTE2X2hleDsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIFU4LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3U4X2xpc3RfdTMyCit7CisgICAgdWludDMyX3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgdWludDhfdCAqdmFsOyAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X3U4X2xpc3RfdTMyOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTguIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDgKK3sKKyAgICB1aW50MzJfdCBsZW47ICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICB1aW50OF90ICp2YWw7ICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDg7CisKKy8qKiBVQkQgSW5mby4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF91YmRfaW5mbworeworICAgIHVpbnQxNl90IGFjdHVhbF9wb2xsaW5nX2ludGVydmFsOyAgIC8qKjwgVW5pdHM6IDY1LjUzNnVzICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIGFjdHVhbF9ncmFudF90aHJlc2hvbGRfdHE7ICAgICAgICAgICAgICAgLyoqPCBBY3R1YWwgR3JhbnQgVGhyZXNob2xkIChUUSkuICovCisgICAgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgYWN0dWFsX21pbl9zY2hlZHVsZXJzaGFwZXI7ICAgLyoqPCBBY3R1YWwgTWluIFNjaGVkdWxlci9TaGFwZXIuICovCisgICAgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgYWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXI7ICAgLyoqPCBBY3R1YWwgTWF4IFNjaGVkdWxlci9TaGFwZXIuICovCit9IGJjbW9sdF91YmRfaW5mbzsKKworLyoqIFRoZSB1cHN0cmVhbSBiYW5kd2lkdGggZGlzdHJpYnV0aW9uIGZvciB0aGlzIExMSUQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbgoreworICAgIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsIHBvbGxpbmdfaW50ZXJ2YWxfdXM7ICAgIC8qKjwgVGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gd2hlbiB0aGlzIExMSUQgbGFzdCByZXBvcnRlZCB1cHN0cmVhbSBkYXRhIGFuZCB3aGVuIGl0IHdpbGwgbmV4dCBiZSBwb2xsZWQgKGFwcHJveGltYXRlOiByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QgNjUuNTM2IHVzKS4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgZ3JhbnRfdGhyZXNob2xkX3RxOyAgICAgICAgICAvKio8IFVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGdyYW50IHNpemUgdGhhdCB3aWxsIGJlIGlzc3VlZCB0byB0aGlzIExMSUQgKGluIFRROyByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IDEyOFRROyAxVFEgPSAxNm5zID0gMkJ5dGVzQDFHIG9yIDIwQnl0ZXNAMTBHKS4gKi8KKyAgICBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciBtaW5fc2NoZWR1bGVyc2hhcGVyOyAvKio8IE1pbiBTY2hlZHVsZXIvU2hhcGVyLiAqLworICAgIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyIG1heF9zY2hlZHVsZXJzaGFwZXI7IC8qKjwgTWF4IFNjaGVkdWxlci9TaGFwZXIuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHRkbV9ncmFudF9zaXplX3RxOyAgICAgICAgICAgLyoqPCBTaXplIG9mIFRETSBncmFudHMgKGluIFRRKS4gKi8KKyAgICB1aW50MzJfdCB0ZG1fZ3JhbnRfaW50ZXJ2YWxfdXM7ICAgICAgICAgICAgICAgICAvKio8IEludGVydmFsIGJldHdlZW4gVERNIGdyYW50cyAoaW4gdXMpLiAqLworfSBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbjsKKworLyoqIFZMQU4gdGFnLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3ZsYW5fdGFnCit7CisgICAgYmNtb2x0X3ZsYW5faWQgdmxhbl9pZDsgLyoqPCBWTEFOIElELiAqLworICAgIHVpbnQ4X3QgcGJpdDsgICAgICAgICAgIC8qKjwgUGJpdC4gKi8KK30gYmNtb2x0X3ZsYW5fdGFnOworCisvKiogWEdQT04gQWxsb2MgV2l0aCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlCit7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAvKio8IEFsbG9jIElELiAqLworICAgIGJjbW9sdF9hbGxvY19zdGF0ZSBzdGF0ZTsgICAgICAgLyoqPCBTdGF0ZS4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGU7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiB4Z3Bvbl9hbGxvY193aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyCit7CisgICAgdWludDE2X3QgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSAqdmFsOyAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMjsKKworLyoqIHhncG9uIGVkIHN0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2VkX3N0YXRlCit7CisgICAgYmNtb3NfYm9vbCByZXNldF9vbl9lZF9mYWlsOyAgICAvKio8IHJlc2V0IG9uIEVEIGZhaWwuICovCisgICAgYmNtb3NfYm9vbCByZXNldF9vbl9lZF9zdWNjZXNzOyAvKio8IHJlc2V0IG9uIEVEIHN1Y2Nlc3MuICovCit9IGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZTsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHhncG9uX2dlbV9pZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYKK3sKKyAgICB1aW50OF90IGxlbjsgICAgICAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX2lkICp2YWw7ICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2OworCisvKiogWEdQT04gR0VNIFBvcnQgV2l0aCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlCit7CisgICAgYmNtb2x0X3hncG9uX2dlbV9pZCBnZW1faWQ7ICAgICAgICAgLyoqPCBHRU0gSUQuICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlIHN0YXRlOyAgLyoqPCBTdGF0ZS4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGU7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiB4Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOAoreworICAgIHVpbnQxNl90IGxlbjsgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp2YWw7ICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjg7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiB4Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NgoreworICAgIHVpbnQxNl90IGxlbjsgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp2YWw7ICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTY7CisKKy8qKiBYR1BPTiBLZXkgRXhjaGFuZ2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlCit7CisgICAgdWludDMyX3QgaW50ZXJ2YWw7ICAgICAgICAgICAgICAvKio8IEtleSBFeGNoYW5nZSBwcm9jZXNzIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgLyoqPCBFbmFibGVcZGlzYWJsZSBwZXJpb2RpYyBwcm9jZXNzIG9mIEtleSBFeGNoYW5nZSBmb3IgYWN0aXZlIE9OVXMgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBlbmNyeXB0ZWRfcG9ydHNfb25seTsgIC8qKjwgUGVyZm9ybSBrZXkgZXhjaGFuZ2Ugb25seSB0byBPTlVzIHdpdGggR0VNIHBvcnRzIHRoYXQgaGF2ZSBkb3duc3RyZWFtIGVuY3J5cHRpb24gZW5hYmxlZCAqLworfSBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlOworCisvKiogWEdQT04gTXVsdGljYXN0IGtleS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5Cit7CisgICAgYmNtb2x0X2Flc19rZXkga2V5OyAgICAgLyoqPCBBRVMgZW5jcnlwdGlvbiBrZXkgZm9yIG11bHRpY3NhdCBYR0VNIHBvcnQgSURzICovCisgICAgYmNtb3NfYm9vbCBrZXlfY29udHJvbDsgLyoqPCBFbmFibGVcRGlzYWJsZSBlbmNyeXB0aW9uIG9uIG11bHRpY2FzdCBYR0VNIHBvcnRzICovCit9IGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5OworCisvKiogWEdQT04gTkkgRGVidWcgcGFyYW1ldGVycyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX2RlYnVnCit7CisgICAgYmNtb3NfYm9vbCBpbmNyZWFzZV9hdmFpbGFibGVfY2JyX2J3OyAgIC8qKjwgVXNlIGluY3JlYXNlIGF2YWlsYWJsZSBDQlIgYmFuZHdpZHRoIGZvciBiZXR0ZXIgQlcgdXRpbGl6YXRpb24gKi8KKyAgICB1aW50MTZfdCBpbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXM7ICAgICAgLyoqPCBHYXAgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgYnVyc3RzIGZvciB0aGUgc2FtZSBPTlUgKi8KKyAgICB1aW50MTZfdCBudW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnU7ICAgLyoqPCBOdW1iZXIgb2YgZ2VtIHBvcnRzIHBlciBvbnUgKi8KK30gYmNtb2x0X3hncG9uX25pX2RlYnVnOworCisvKiogWEdQT04gT05VIEFjdGl2YXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24KK3sKKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBrZXlfZXhjaGFuZ2U7ICAvKio8IFBlcmZvcm0gc2luZ2xlIGtleSBleGNoYW5nZSBkdXJpbmcgYWN0aXZhdGlvbi4gKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBmYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWw7ICAgLyoqPCBEZWFjdGl2YXRlIE9OVSBkdWUgdG8gcmVnaXN0cmF0aW9uIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgKi8KK30gYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uOworCisvKiogWEdQT04gT05VIEFFUyBLRVkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2Flc19rZXkKK3sKKyAgICBiY21vbHRfYWVzX2tleSBlbmNyeXB0aW9uX2tleTsgIC8qKjwgZW5jcnlwdGlvbiBrZXkuICovCisgICAgdWludDhfdCBrZXlfaW5kZXg7ICAgICAgICAgICAgICAvKio8IGtleSBpbmRleC4gKi8KK30gYmNtb2x0X3hncG9uX29udV9hZXNfa2V5OworCisvKiogWEdQT04gT05VIGFsYXJtIHN0YXR1cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUKK3sKKyAgICBiY21vbHRfc3RhdHVzIGxvc2k7ICAgICAgICAgICAgIC8qKjwgTG9zcyBvZiBzaWduYWwuICovCisgICAgYmNtb2x0X3N0YXR1cyBsb2JpOyAgICAgICAgICAgICAvKio8IExvc3Mgb2YgYnVyc3QuICovCisgICAgYmNtb2x0X3N0YXR1cyBsb3BjaTsgICAgICAgICAgICAvKio8IExvc3Mgb2YgUExPQU0gY2hhbm5lbC4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxvcGNpX21pY19lcnJvcjsgIC8qKjwgTWljIGVycm9yIG9uIHBsb2FtIGNoYW5uZWwuICovCisgICAgYmNtb2x0X3N0YXR1cyBsb29jaTsgICAgICAgICAgICAvKio8IExvc3Mgb2YgT01DSSBjaGFubmVsLiAqLworICAgIGJjbW9sdF9zdGF0dXMgdGl3aTsgICAgICAgICAgICAgLyoqPCBUcmFuc21pc3Npb24gaW50ZXJmZXJlbmNlIEFsYXJtLiAqLworICAgIGJjbW9sdF9zdGF0dXMgZG93aTsgICAgICAgICAgICAgLyoqPCBEcmlmdCBvZiBXaW5kb3cuICovCisgICAgYmNtb2x0X3N0YXR1cyBzdWZpOyAgICAgICAgICAgICAvKio8IFN0YXJ0IFVQIEZhaWx1cmUuICovCisgICAgYmNtb2x0X3N0YXR1cyBzZmk7ICAgICAgICAgICAgICAvKio8IFNpZ25hbCBGYWlsLiAqLworICAgIGJjbW9sdF9zdGF0dXMgc2RpOyAgICAgICAgICAgICAgLyoqPCBTaWduYWwgRGVncmFkZWQuICovCisgICAgYmNtb2x0X3N0YXR1cyBkZmk7ICAgICAgICAgICAgICAvKio8IERlYWN0aXZhdGlvbiBGYWlsdXJlLiAqLworICAgIGJjbW9sdF9zdGF0dXMgZGdpOyAgICAgICAgICAgICAgLyoqPCBEeWluZyBnYXNwLiAqLworICAgIGJjbW9sdF9zdGF0dXMgcHFzaTsgICAgICAgICAgICAgLyoqPCBQbG9hbSBxdWV1ZSBzdGF0dXMuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGU7CisKKy8qKiBYR1BPTiBPTlUgYWxhcm1zLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9hbGFybXMKK3sKKyAgICBiY21vbHRfc3RhdHVzIGxvc2k7ICAgICAgICAgICAgIC8qKjwgTE9TaS4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxvYmk7ICAgICAgICAgICAgIC8qKjwgTE9CaS4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxvcGNpX21pc3M7ICAgICAgIC8qKjwgTE9QQ2kgbWlzcy4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxvcGNpX21pY19lcnJvcjsgIC8qKjwgTE9QQ2kgbWljIGVycm9yLiAqLworfSBiY21vbHRfeGdwb25fb251X2FsYXJtczsKKworLyoqIFhHUE9OIE9OVSBhbGFybXMgdGhyZXNob2xkcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMKK3sKKyAgICB1aW50OF90IGxvc2k7ICAgLyoqPCBUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT1NpIGFsYXJtLiAqLworICAgIHVpbnQ4X3QgbG9iaTsgICAvKio8IFRocmVzaG9sZCBmb3IgYXNzZXJ0aW5nIExPQmkgYWxhcm0uICovCisgICAgdWludDhfdCBsb29jaTsgIC8qKjwgVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9PQ2kgYWxhcm0uICovCisgICAgdWludDhfdCBsb3BjaTsgIC8qKjwgVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9QQ2kgYWxhcm0uICAqLworfSBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzOworCisvKiogWEdQT04gT05VIEVRRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfZXFkCit7CisgICAgYmNtb2x0X3hncG9uX29udV9pZCBvbnVfaWQ7IC8qKjwgT05VIElELiAqLworICAgIHVpbnQzMl90IGVxZDsgICAgICAgICAgICAgICAvKio8IEVRRC4gKi8KK30gYmNtb2x0X3hncG9uX29udV9lcWQ7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiB4Z3Bvbl9vbnVfZXFkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIKK3sKKyAgICB1aW50MzJfdCBsZW47ICAgICAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2VxZCAqdmFsOyAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMjsKKworLyoqIFhHUE9OIE9OVSByZWdpc3RyYXRpb24ga2V5cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMKK3sKKyAgICBiY21vbHRfYWVzX2tleSBwbG9hbV9pazsgICAgLyoqPCBwbG9hbSBpay4gKi8KKyAgICBiY21vbHRfYWVzX2tleSBvbWNpX2lrOyAgICAgLyoqPCBvbWNpIGlrLiAqLworICAgIGJjbW9sdF9hZXNfa2V5IG9tY2lfazE7ICAgICAvKio8IG9tY2kgazEuICovCisgICAgYmNtb2x0X2Flc19rZXkgb21jaV9rMjsgICAgIC8qKjwgb21jaSBrMi4gKi8KKyAgICBiY21vbHRfYWVzX2tleSBrZWs7ICAgICAgICAgLyoqPCBrZWsuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXM7CisKKy8qKiBYR1BPTiBPTlUgV2l0aCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgb251X2lkOyAvKio8IE9OVSBJRC4gKi8KKyAgICBiY21vbHRfb251X3N0YXRlIHN0YXRlOyAgICAgLyoqPCBTdGF0ZS4gKi8KK30gYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgeGdwb25fb251X3dpdGhfc3RhdGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMAoreworICAgIHVpbnQxNl90IGxlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlICp2YWw7ICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMDsKKworLyoqIFhHUE9OIFBMT0FNIGhhbmRsaW5nLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nCit7CisgICAgdWludDMyX3QgYWNrX3RpbWVvdXQ7ICAgICAgICAgICAgICAgLyoqPCBUaW1lb3V0IGZvciByZWNlaXZpbmcgQUNLIHBsb2FtICovCisgICAgdWludDhfdCByZXRyYW5zX3JhbmdpbmdfdGltZTsgICAgICAgLyoqPCBOdW1iZXIgb2YgUmFuZ2luZyBUaW1lIHBsb2FtIHJldHJhbnNtaXNzaW9ucyBpbiBjYXNlIG9mIEFDSyB0aW1lb3V0ICovCisgICAgdWludDhfdCByZXRyYW5zX2Fzc2lnbl9hbGxvY19pZDsgICAgLyoqPCBOdW1iZXIgb2YgQXNzaWduIEFsbG9jIElEIHBsb2FtIHJldHJhbnNtaXNzaW9ucyBpbiBjYXNlIG9mIEFDSyB0aW1lb3V0ICovCisgICAgdWludDhfdCByZXRyYW5zX2tleV9jb250cm9sOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgS2V5IENvbnRyb2wgcGxvYW0gcmV0cmFuc21pc3Npb25zIGluIGNhc2Ugb2YgQUNLIHRpbWVvdXQgKi8KKyAgICB1aW50OF90IHJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb247ICAgLyoqPCBOdW1iZXIgb2YgUmVxdWVzdCBSZWdpc3RyYXRpb24gcGxvYW0gcmV0cmFuc21pc3Npb25zIGluIGNhc2Ugb2YgQUNLIHRpbWVvdXQgKi8KK30gYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nOworCisvKiogWEdQT04gcHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZworeworICAgIHVpbnQxNl90IHRpbWVvdXQ7ICAgICAgICAgICAvKio8IExPUyBzd2l0Y2ggb3ZlciB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqLworICAgIGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbjsgICAvKio8IEdQSU8gcGluIGZvciBpbnB1dC9vdXRwdXQgc2lnbmFsICovCisgICAgYmNtb3NfYm9vbCBmYXN0X3Jhbmdpbmc7ICAgIC8qKjwgZmFzdCByYW5naW5nICAqLworfSBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmc7CisKKy8qKiB4Z3BvbiBwcm90ZWN0aW9uIHN3aXRjaGluZyBkZWJ1Zy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZworeworICAgIHVpbnQxNl90IGRhdGFfbWFwX2RlbGF5X21zOyAgICAgICAgICAgICAvKio8IGRlbGF5IHRvIHdhaXQgYWZ0ZXIgc2VuZGluZyByYW5naW5nIHRpbWUgZGVsdGEgYmVmb3JlIHJ1bm5pbmcgdGhlIGRhdGEgbWFwICAgKi8KKyAgICBiY21vc19ib29sIHJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWU7ICAgLyoqPCBTaG91bGQgdGhlIFNNIHNlbmQgdGhlIGN1cnJlbnQgcmFuZ2luZyB0aW1lIGJlZm9yZSBkb2luZyB0aGUgcmUtcmFuZ2luZyAgKi8KKyAgICB1aW50MTZfdCByZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5OyAgIC8qKjwgdGhlIGRlbGF5IGJldHdlZW4gc2VuZGluZyB0aGUgcmFuZ2luZyB0aW1lIGFuZCBzdGFydGluZyB0aGUgcmVyYW5nZSAgKi8KK30gYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnOworCisvKiogWEdQT04gUlNTSSBub3JtYWwgY29uZmlndXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcKK3sKKyAgICBiY21vbHRfcG9sYXJpdHkgcG9sYXJpdHk7ICAgLyoqPCBSU1NJIHNpZ25hbCBwb2xhcml0eSAqLworICAgIHVpbnQ4X3QgbG9jYXRpb247ICAgICAgICAgICAvKio8IFJTU0kgc2lnbmFsIGxvY2F0aW9uIGluIHdvcmRzICovCisgICAgYmNtb2x0X3NpZ24gbG9jYXRpb25fc2lnbjsgIC8qKjwgUlNTSSBzaWduYWwgbG9jYXRpb24gc2lnbiAqLworICAgIHVpbnQxNl90IHB1bHNlX3dpZHRoOyAgICAgICAvKio8IFJTU0kgcHVsc2Ugd2lkdGggaW4gd29yZHMgKi8KKyAgICB1aW50MTZfdCBtaW5pbXVtX2J1cnN0OyAgICAgLyoqPCBEYXRhIG1pbmltdW0gYnVyc3Qgc2l6ZSBpbiB3b3JkcyAqLworfSBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnOworCisvKiogeGdwb24gcnNzaSByYW5naW5nIGNvbmZpZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnCit7CisgICAgYmNtb3NfYm9vbCBzdGFydF9vbl9lZDsgICAgICAgICAvKio8IHN0YXJ0IG9uIEVELiAqLworICAgIHVpbnQ4X3QgZnJhbWVfZGVsYXk7ICAgICAgICAgICAgLyoqPCBmcmFtZSBkZWxheSBmcm9tIEVEICovCisgICAgdWludDE2X3Qgd29yZF9kZWxheTsgICAgICAgICAgICAvKio8IHdvcmQgZGVsYXkgZnJvbSBFRCAqLworICAgIHVpbnQ4X3QgZnJhbWVfZGVsYXlfYWZ0ZXJfZWQ7ICAgLyoqPCBmcmFtZSBkZWxheSBmcm9tIHN0YXJ0ICBvZiByYW5naW5nIHdpbmRvdyAqLworICAgIHVpbnQxNl90IHdvcmRfZGVsYXlfYWZ0ZXJfZWQ7ICAgLyoqPCB3b3JkIGRlbGF5IGZyb20gc3RhcnQgIG9mIHJhbmdpbmcgd2luZG93ICovCit9IGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnOworCisvKiogeGdwb24gcnggcmFuZ2luZyBTTSBwYXR0ZXJucy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4KK3sKKyAgICB1aW50MzJfdCB0cnhfcmVzZXRfcGF0dGVybl9maXJzdDsgICAvKio8IHRyeCByZXNldCBwYXR0ZXJuIGZpcnN0LiAqLworICAgIHVpbnQzMl90IHRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZTsgIC8qKjwgdHJ4IHJlc2V0IHBhdHRlcm4gbWlkZGxlLiAqLworICAgIHVpbnQzMl90IHRyeF9yZXNldF9wYXR0ZXJuX2xhc3Q7ICAgIC8qKjwgdHJ4IHJlc2V0IHBhdHRlcm4gbGFzdC4gKi8KKyAgICB1aW50OF90IHRyeF9yZXNldF9taWRkbGVfcmVwZWF0czsgICAvKio8IHRyeCByZXNldCBtaWRkbGUgcmVwZWF0cy4gKi8KKyAgICB1aW50OF90IHRyeF9yZXNldF9sb2NhdGlvbjsgICAgICAgICAvKio8IHRyeCByZXNldCBsb2NhdGlvbi4gKi8KKyAgICB1aW50MzJfdCBiY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3Q7ICAvKio8IGJjZHIgcmVzZXQgcGF0dGVybiBmaXJzdC4gKi8KKyAgICB1aW50MzJfdCBiY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlOyAvKio8IGJjZHIgcmVzZXQgcGF0dGVybiBtaWRkbGUuICovCisgICAgdWludDMyX3QgYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3Q7ICAgLyoqPCBiY2RyIHJlc2V0IHBhdHRlcm4gbGFzdC4gKi8KKyAgICB1aW50OF90IGJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHM7ICAvKio8IGJjZHIgcmVzZXQgbWlkZGxlIHJlcGVhdHMuICovCisgICAgdWludDhfdCBiY2RyX3Jlc2V0X2xvY2F0aW9uOyAgICAgICAgLyoqPCBiY2RyIHJlc2V0IGxvY2F0aW9uLiAqLworICAgIGJjbW9zX2Jvb2wgYmNkcl9yZXNldF9wb2xhcml0eTsgICAgIC8qKjwgYmNkciByZXNldCBwb2xhcml0eS4gKi8KK30gYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybjsKKworLyoqIHhncG9uIHNlcmRlcyBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uCit7CisgICAgYmNtb3NfYm9vbCBtdWx0aV9lZF9tb2RlOyAgIC8qKjwgbXVsdGkgZWQgbW9kZS4gKi8KKyAgICBiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZSByYW5naW5nX21vZGU7ICAvKio8IHJhbmdpbmcgbW9kZS4gKi8KK30gYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uOworCisvKiogWEdQT04gU04gQWNxdWlzaXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24KK3sKKyAgICB1aW50MzJfdCBpbnRlcnZhbDsgICAgICAgICAgICAgIC8qKjwgU04gcHJvY2VzcyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBjb250cm9sOyAgIC8qKjwgU04gcHJvY2VzcyBjb250cm9sICovCisgICAgYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIG9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlOyAvKio8IEF1dG9tYXRpYyBvcGVyYXRpb24gZm9sbG93aW5nIE9OVSBkaXNjb3ZlcnkgKi8KKyAgICBiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCBidXJzdF9wcm9maWxlOyAgICAgICAgICAgICAgIC8qKjwgQnVyc3QgcHJvZmlsZSBpbmRleCB0byB1c2UgZHVyaW5nIFNOIGFjcXVpc2l0aW9uIHdpbmRvdyAqLworfSBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb247CisKKy8qKiB4Z3Bvbl90cnhfZGVidWcuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnCit7CisgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgcnhfcmV2ZXJzZWRfcG9sYXJpdHk7ICAvKio8IHRyYW5zY2VpdmVyIHJldmVyc2VkIHBvbGFyaXR5ICovCisgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgbmVnX291dF9iaXQ7ICAgICAgICAgICAvKio8IHR1cm4gYWxsIDEgdG8gMCBhbmQgYWxsIDAgdG8gMSBhdCB0aGUgb3V0cHV0LiBkZWZhdWx0IGlzIG5vdCB0byBtYWtlIG5lZ2F0aXZlIGJpdHMgKi8KK30gYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZzsKKworLyoqIEB9ICovCisjZW5kaWYgLyogQkNNT0xUX01PREVMX0RBVEFfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbW9kZWxfaWRzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX2lkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTk2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX2lkcy5oCkBAIC0wLDAgKzEsOTYyNCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpwcm9wcmlldGFyeTpzdGFuZGFyZAorIAorICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIAorVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisgCitFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIAorMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKyAKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorIAorMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorICAgIExJTUlURUQgUkVNRURZLgorOj4KKyovCisjaWZuZGVmIEJDTU9MVF9NT0RFTF9JRFNfSF8KKyNkZWZpbmUgQkNNT0xUX01PREVMX0lEU19IXworCisvKiogXGFkZHRvZ3JvdXAgYXBpX2RhdGFfdHlwZXMgCisgKiBAeyAKKyAqLworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfbmlfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9uaV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfQUVfTklfQ0ZHX0lEX19CRUdJTiAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUyAgICAgPSAwLCAgICAgICAgICAgICAgICAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4gICAgICAgID0gMSwgICAgICAgICAgICAgICAgLyoqPCBBRSBOSSBlbmFibGUgc3RhdGUuICovCisgICAgQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHICAgICAgICAgPSAyLCAgICAgICAgICAgICAgICAvKio8IE1UVS4gKi8KKyAgICBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SICA9IDMsICAgICAgICAgICAgICAgIC8qKjwgUFJCUyBHZW5lcmF0b3IuICovCisgICAgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0NIRUNLRVIgICAgPSA0LCAgICAgICAgICAgICAgICAvKio8IFBSQlMgQ2hlY2tlci4gKi8KKyAgICBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTICAgICA9IDUsICAgICAgICAgICAgICAgIC8qKjwgUFJCUyBzdGF0dXMuICovCisgICAgQkNNT0xUX0FFX05JX0NGR19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hZV9uaV9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9uaV9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX25pX2tleV9pZAoreworICAgIEJDTU9MVF9BRV9OSV9LRVlfSURfX0JFR0lOICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfTklfS0VZX0lEX0FFX05JICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgIC8qKjwgQUUgTkkgbnVtYmVyLiAqLworICAgIEJDTU9MVF9BRV9OSV9LRVlfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfYWVfbmlfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZAoreworICAgIEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfX0JFR0lOICAgPSAwLAorICAgIEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFPSAwLCAgICAgICAgLyoqPCBOZXcgQUUgTkkgZW5hYmxlIHN0YXRlLiAqLworICAgIEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfX05VTV9PRiAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19hdXRvX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX2RzX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF9kc19rZXlfaWQKK3sKKyAgICBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfS0VZX0lEX0FFX05JICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFFIE5JIChBY3RpdmUgRXRoZXJuZXQgTmV0d29yayBJbnRlcmZhY2UpIG51bWJlci4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBhZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQKK3sKKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICA9IDAsCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgPSAwLAorICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0NGR19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX2RzX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQnl0ZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVMgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NCAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNjQgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3ICAgICAgICAgPSAzLCAgICAvKio8IDY1LTEyNyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1ICAgICAgICA9IDQsICAgIC8qKjwgMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExICAgICAgICA9IDUsICAgIC8qKjwgMjU2LTUxMSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyAgICAgICA9IDYsICAgIC8qKjwgNTEyLTEwMjMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgPSA3LCAgICAvKio8IDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgICAgICA9IDgsICAgIC8qKjwgMTUxOS0yMDQ3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSAgICAgID0gOSwgICAgLyoqPCAyMDQ4XzQwOTUgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgPSAxMCwgICAvKio8IDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzICAgICA9IDExLCAgIC8qKjwgOTIxNy0xNjM4MyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgICAgICA9IDEyLCAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0RBVEFfQllURVMgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRGF0YSBCeXRlcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMgICAgICA9IDE0LCAgIC8qKjwgTXVsaXRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTICAgICAgICA9IDE1LCAgIC8qKjwgVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgICAgICAgICAgPSAxNiwgICAvKio8IEFib3J0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfdXNfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCA9IDEsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkCit7CisgICAgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9BRV9OSSAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBRSBOSS4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19LRVlfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBhZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQKK3sKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICA9IDAsCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgPSAwLAorICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX3VzX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JZVEVTICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQnl0ZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NCAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNjQgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3ICAgICAgICAgPSAzLCAgICAvKio8IDY1LTEyNyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1ICAgICAgICA9IDQsICAgIC8qKjwgMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExICAgICAgICA9IDUsICAgIC8qKjwgMjU2LTUxMSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyAgICAgICA9IDYsICAgIC8qKjwgNTEyLTEwMjMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgPSA3LCAgICAvKio8IDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgICAgICA9IDgsICAgIC8qKjwgMTUxOS0yMDQ3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSAgICAgID0gOSwgICAgLyoqPCAyMDQ4XzQwOTUgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgPSAxMCwgICAvKio8IDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzICAgICA9IDExLCAgIC8qKjwgOTIxNy0xNjM4MyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgICAgICA9IDEyLCAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0RBVEFfQllURVMgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRGF0YSBCeXRlcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMgICAgICA9IDE0LCAgIC8qKjwgTXVsaXRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTICAgICAgICA9IDE1LCAgIC8qKjwgVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgICAgICAgICAgPSAxNiwgICAvKio8IEFib3J0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZDU19FUlJPUiAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgRkNTIEVycm9yLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IgICAgICAgID0gMTgsICAgLyoqPCBPdmVyc2l6ZSBFcnJvci4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1JVTlRfRVJST1IgICAgICAgICAgICA9IDE5LCAgIC8qKjwgUnVudCBFcnJvci4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGNoYW5uZWxfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9jaGFubmVsX2NmZ19pZAoreworICAgIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wgICAgICAgICA9IDAsICAgIC8qKjwgT3BlcmF0aW9uIGNvbnRyb2wuICovCisgICAgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1RPTCAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFRPTC4gKi8KKyAgICBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUgICAgICAgICAgICA9IDIsICAgIC8qKjwgU3lzdGVtIHByb2ZpbGUuICovCisgICAgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSAgICAgICAgICAgPSAzLCAgICAvKio8IENoYW5uZWwgcHJvZmlsZS4gKi8KKyAgICBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2NoYW5uZWxfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgY2hhbm5lbF9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2NoYW5uZWxfa2V5X2lkCit7CisgICAgQkNNT0xUX0NIQU5ORUxfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCisgICAgQkNNT0xUX0NIQU5ORUxfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9jaGFubmVsX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2F1dG9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfQ0xJX09VVFBVVCAgICAgICAgICAgICA9IDAsICAgIC8qKjwgY2xpX291dHB1dC4gKi8KKyAgICBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfRklMRV9BTE1PU1RfRlVMTCAgICAgICA9IDEsICAgIC8qKjwgZmlsZV9hbG1vc3RfZnVsbC4gKi8KKyAgICBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19jZmdfaWQKK3sKKyAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9DT05TT0xFX1JFRElSRUNUSU9OICAgICAgICAgPSAwLCAgICAvKio8IENvbnNvbGVfcmVkaXJlY3Rpb24uICovCisgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEICAgICAgICAgPSAxLCAgICAvKio8IEluZGljYXRpb25zIERyb3BwZWQuICovCisgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9GSUxFX1VTRURfUEVSQ0VOVCAgICAgICAgICAgPSAyLCAgICAvKio8IEZpbGUgdXNlZCBwZXJjZW50LiAqLworICAgIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQ0ZHICAgICAgICAgICAgID0gMywgICAgLyoqPCBBUEkgQ2FwdHVyZSBDZmcuICovCisgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9TVEFUUyAgICAgICAgICAgPSA0LCAgICAvKio8IEFQSSBDYXB0dXJlIFN0YXRzLiAqLworICAgIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQgICAgID0gNSwgICAgLyoqPCBBUEkgQ2FwdHVyZSBCdWZmZXIgUmVhZC4gKi8KKyAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUiAgICAgICAgICA9IDYsICAgIC8qKjwgQVBJIENhcHR1cmUgQnVmZmVyLiAqLworICAgIEJDTU9MVF9ERUJVR19DRkdfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZWJ1Z19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZWJ1Z19jbGlfaW5wdXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZAoreworICAgIEJDTU9MVF9ERUJVR19DTElfSU5QVVRfSURfX0JFR0lOICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgZGF0YS4gKi8KKyAgICBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2NsaV9vdXRwdXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWQKK3sKKyAgICBCQ01PTFRfREVCVUdfQ0xJX09VVFBVVF9JRF9fQkVHSU4gICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfREFUQSAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGRhdGEuICovCisgICAgQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfZmlsZV9hbG1vc3RfZnVsbCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkCit7CisgICAgQkNNT0xUX0RFQlVHX0ZJTEVfQUxNT1NUX0ZVTExfSURfX05VTV9PRiAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19rZXlfaWQKK3sKKyAgICBCQ01PTFRfREVCVUdfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFQlVHX0tFWV9JRF9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlc2VydmVkLiAqLworICAgIEJDTU9MVF9ERUJVR19LRVlfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGVidWdfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfcmVzZXRfYXBpX2NhcHR1cmUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWQKK3sKKyAgICBCQ01PTFRfREVCVUdfUkVTRVRfQVBJX0NBUFRVUkVfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfc3RhcnRfYXBpX2NhcHR1cmUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWQKK3sKKyAgICBCQ01PTFRfREVCVUdfU1RBUlRfQVBJX0NBUFRVUkVfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfc3RvcF9hcGlfY2FwdHVyZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkCit7CisgICAgQkNNT0xUX0RFQlVHX1NUT1BfQVBJX0NBUFRVUkVfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2F1dG9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9DT01QTEVURSAgICAgICA9IDAsICAgIC8qKjwgQ29ubmVjdGlvbiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQgICAgPSAxLCAgICAvKio8IENvbm5lY3Rpb24gRXN0YWJsaXNoZWQgKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRkFJTFVSRSAgICAgICAgPSAyLCAgICAvKio8IENvbm5lY3Rpb24gRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0REUl9URVNUX0NPTVBMRVRFICAgICAgICAgPSAzLCAgICAvKio8IEREUiBUZXN0IENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX0tFRVBfQUxJVkUgICAgICAgICA9IDQsICAgIC8qKjwgRGV2aWNlIEtlZXAgQWxpdmUgKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9SRUFEWSAgICAgICAgICAgICAgPSA1LCAgICAvKio8IERldmljZSBSZWFkeSAoSW50ZXJuYWwpLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRElTQ09OTkVDVElPTl9DT01QTEVURSAgICA9IDYsICAgIC8qKjwgRGlzY29ubmVjdGlvbiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFICAgPSA3LCAgICAvKio8IEltYWdlIFRyYW5zZmVyIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCAgICAgICA9IDgsICAgIC8qKjwgSW5kaWNhdGlvbnMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IHN3IGVycm9yLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVhDRVBUSU9OICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgc3cgZXhjZXB0aW9uLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9TWVNURU1fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzeXN0ZW1fbW9kZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBEZXZpY2UgS2VlcGFsaXZlIEludGVydmFsLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9UT0xFUkFOQ0UgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERldmljZSBLZWVwYWxpdmUgdG9sZXJhbmNlIC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9GSVJNV0FSRV9TV19WRVJTSU9OICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBGaXJtd2FyZSBTVyBWZXJzaW9uLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEhvc3QgU1cgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBDaGlwIFJldmlzaW9uLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IERldmljZSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBkZWJ1ZyBwYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IE5OSSBTcGVlZC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19FWFRfSVJRICAgICAgID0gOSwgICAgLyoqPCBQcm90ZWN0aW9uIFN3aXRjaGluZyBFeHRlcm5hbCBJUlEuICovCisgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZICA9IDEwLCAgIC8qKjwgRVBPTiBDbG9jayBUcmFuc3BvcnQgU2FtcGxlIERlbGF5LiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORyAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IEluZGljYXRpb24gU2hhcGluZy4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBjaGlwIHRlbXBlcmF0dXJlIC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBHUE9OL1hHUE9OIFRvRCBlbmFibGUuICovCisgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4gICAgICAgICAgICA9IDE0LCAgIC8qKjwgR1BPTi9YR1BPTiBUb0QgR1BJTyBwaW4uICovCisgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfQ09OTkVDVEVEX0lOVEVSTkFMTFk9IDE1LCAgIC8qKjwgR1BPTi9YR1BPTiBpcyBUb0QgaW50ZXJuYWxseS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCAgICAgICAgICAgID0gMTYsICAgLyoqPCBFUE9OIDgwMi4xQVMgVG9EIEZvcm1hdC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBFUE9OIFNoYXBlciBNb2RlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IEVtYmVkZGVkIGltYWdlIGxpc3QuICovCisgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9WT0xUQUdFICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgY2hpcCB2b2x0YWdlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORyAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEVQT04gVG9EIFN0cmluZy4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9YR1BPTl9OVU1fT0ZfT05VUyAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCB4Z3BvbiBudW0gb2Ygb251cy4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfSVBfQUREUkVTUyAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCBEZXZpY2UgSVAgQWRkcmVzcy4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQgICAgICAgICAgICAgICAgICAgID0gMjMsICAgLyoqPCBEZXZpY2UgVURQIHBvcnQuICovCisgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgVUFSVCBiYXVkcmF0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9TVFJJTkdfTEVOR1RIICAgICAgID0gMjUsICAgLyoqPCBHUE9OL1hHUE9OIFRvRCBzdHJpbmcgbGVuZ3RoLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX19OVU1fT0YgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfY29ubmVjdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2Nvbm5lY3RfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX19CRUdJTiAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUgICAgICAgICA9IDAsICAgIC8qKjwgU3RhbmRhbG9uZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fQ09NUExFVEVfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGRldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9FU1RBQkxJU0hFRF9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jb25uZWN0aW9uX2ZhaWx1cmUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9GQUlMVVJFX0lEX19CRUdJTiAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9GQUlMVVJFX0lEX1JFQVNPTiAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbm5lY3Rpb24gZmFpbCByZWFzb24uICovCisgICAgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfZGRyX3Rlc3RfY29tcGxldGUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9fQkVHSU4gICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRERSIFRlc3QuICovCisgICAgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX19CRUdJTiAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUiAgICAgID0gMCwgICAgLyoqPCBzZXF1ZW5jZSBudW1iZXIuICovCisgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QICAgICAgICAgICA9IDEsICAgIC8qKjwgdGltZSBzdGFtcC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2RldmljZV9yZWFkeSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04gICAgICAgPSAwLCAgICAvKio8IFNvZnR3YXJlIFZlcnNpb24uICovCisgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfU1lTVEVNX01PREUgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU3lzdGVtIE1vZGUuICovCisgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfTk5JX1NQRUVEICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgTk5JIFNwZWVkLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0NISVBfUkVWSVNJT04gICAgICAgICAgICAgPSAzLCAgICAvKio8IENoaXAgUmV2aXNpb24uICovCisgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRSAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgVG9EIGNvbnRyb2wuICovCisgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0dQSU9fUElOICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgR1BJTyBwaW4gaXMgdXNlZCB3aGVuIFRvRCBVQVJUIGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIGVtYmVkZGVkLCBhbmQgVE9EIHZhbHVlIGlzIG9idGFpbmVkIGJ5IHRoZSBob3N0LiAqLworICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX19OVU1fT0YgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfZGlzY29ubmVjdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0RJU0NPTk5FQ1RfSURfX05VTV9PRiAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9ESVNDT05ORUNUSU9OX0NPTVBMRVRFX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfaG9zdF9rZWVwX2FsaXZlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIgICAgICAgID0gMCwgICAgLyoqPCBzZXF1ZW5jZSBudW1iZXIuICovCisgICAgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCAgICAgICAgICAgICA9IDEsICAgIC8qKjwgdGltZSBzdGFtcC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX19CRUdJTiAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX0lNQUdFX1RZUEUgICAgID0gMCwgICAgLyoqPCBJbWFnZSB0eXBlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSICAgPSAxLCAgICAvKio8IEJsb2NrIG51bWJlci4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX1NUQVRVUyAgICAgICAgID0gMiwgICAgLyoqPCBTdGF0dXMuICovCisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9fTlVNX09GICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX19CRUdJTiAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUiAgICAgICA9IDAsICAgIC8qKjwgQmxvY2sgbnVtYmVyLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEgICAgICAgICAgPSAxLCAgICAvKio8IE1vcmUgRGF0YS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfREFUQSAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBEYXRhLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX19CRUdJTiAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1RZUEUgICAgICAgID0gMCwgICAgLyoqPCBJbWFnZSB0eXBlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfU0laRSAgICAgICAgPSAxLCAgICAvKio8IEltYWdlIFNpemUuICovCisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9DUkMzMiAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQ1JDMzIuICovCisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9OQU1FICAgICAgICA9IDMsICAgIC8qKjwgSW1hZ2UgbmFtZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0lORElDQVRJT05TX0RST1BQRURfSURfX0JFR0lOICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0lORElDQVRJT05TX0RST1BQRURfSURfVE9UQUxfQ09VTlQgICAgICAgID0gMCwgICAgLyoqPCBUb3RhbCBDb3VudC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lORElDQVRJT05TX0RST1BQRURfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Vfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2Vfa2V5X2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFVklDRV9LRVlfSURfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgQkNNT0xUX0RFVklDRV9LRVlfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2Vfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3Jlc2V0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBNb2RlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX3Jlc2V0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3J1bl9kZHJfdGVzdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX0NQVSAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENQVS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBSQVMgMC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMSAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBSQVMgMS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9zd19lcnJvciBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgdGFzayBuYW1lLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGZpbGUgbmFtZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0xJTkVfTlVNQkVSICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBsaW5lIG51bWJlci4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBwb25fbmkuICovCisgICAgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3N3X2V4Y2VwdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX0NQVV9JRCAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENQVSBJRC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9URVhUICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCB0ZXh0LiAqLworICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX19OVU1fT0YgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfU1dfVVBHUkFERV9BQ1RJVkFURV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OICAgICAgPSAwLCAgICAvKio8IExhc2VyIE9uL09mZiBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTiAgID0gMSwgICAgLyoqPCBMTElEIFBvb2wgRW1wdHkgVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX01BWF9MSU5LX1ZJT0xBVElPTiAgICAgICAgICA9IDIsICAgIC8qKjwgTWF4IExpbmsgVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OICA9IDMsICAgIC8qKjwgT3ZlcmhlYWQgUHJvZmlsZSBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVklPTEFUSU9OICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSYW5nZSBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUk9HVUVfVklPTEFUSU9OICAgICAgICAgICAgID0gNSwgICAgLyoqPCBSb2d1ZSBPTlUgRGV0ZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTiAgID0gNiwgICAgLyoqPCBTeXN0ZW0gUmVzb3VyY2UgVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQgICAgICA9IDcsICAgIC8qKjwgVERNIENoYW5uZWxzIEV4aGF1c3RlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OICAgICAgPSA4LCAgICAvKio8IFVua25vd24gTGluayBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTj0gOSwgICAgLyoqPCBVcHN0cmVhbSBCYW5kd2lkdGggVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBbGFybSBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9FUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRVBPTiBOSSBJZGVudGlmaWVyLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb24gZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZAoreworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfX0JFR0lOICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgID0gMCwgICAgICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICA9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZAoreworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24gZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWQKK3sKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgID0gMCwgICAgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZAoreworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT05fSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZAoreworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19ST0dVRV9WSU9MQVRJT05fSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICA9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9fQkVHSU4gICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9BTEFSTV9TVEFUVVMgICAgICA9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1RETV9DSEFOTkVMU19FWEhBVVNURURfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICAgICA9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVM9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QgICAgPSAwLCAgICAvKio8IER1cGxpY2F0ZSBNUENQIFJlZ2lzdHJhdGlvbiBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRU5DUllQVElPTl9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEVuY3J5cHRpb24gRW5hYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBLZXkgRXhjaGFuZ2UgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVEICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBrZXlfZXhjaGFuZ2Vfc3RhcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBrZXlfZXhjaGFuZ2Vfc3RvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfREVMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBMaW5rIERlbGV0ZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX1NQRUVEX01JU01BVENIICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgTGluayBhdHRlbXB0ZWQgdG8gcmVnaXN0ZXIgYXQgYSBkaWZmZXJlbnQgc3BlZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RFUkVHSVNURVJFRCAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgTVBDUCBEZXJlZ2lzdGVyZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RJU0NPVkVSRUQgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgTVBDUCBEaXNjb3ZlcmVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IE1QQ1AgUmVnIEFjayBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IE1QQ1AgUmVwb3J0IFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgT0FNIEtlZXBhbGl2ZSBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEICAgICAgICAgICAgPSAxMiwgICAvKio8IE9BTSBrZWVwYWxpdmUgdGltZXIgc3RhcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRCAgICAgICAgICAgID0gMTMsICAgLyoqPCBPQU0ga2VlcGFsaXZlIHRpbWVyIHN0b3BwZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQgICAgICAgICAgICA9IDE0LCAgIC8qKjwgUHJlcHJvdmlzaW9uZWQgTGluayBDcmVhdGVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQgICAgICAgICAgICAgPSAxNSwgICAvKio8IFByb3RlY3Rpb24gU3dpdGNoIE9jY3VycmVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVkFMVUVfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFJhbmdlIFZhbHVlIENoYW5nZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgUmUtcmFuZ2UgZmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkUgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgU3RhdGljIHJlZ2lzdHJhdGlvbiBkb25lLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRVBPTiBsaW5rIHJhdGUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfU1RBVEVfRkxBR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRVBPTiBsaW5rIHN0YXRlIGZsYWdzLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEVQT04gbG9naWNhbCBsaW5rIGlkZW50aWZpZXIuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgTGFzZXItb24gdGltZSAoVFEpLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09GRl9USU1FX1RRICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IExhc2VyLW9mZiB0aW1lIChUUSkuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfUkFOR0VfVkFMVUVfVFEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUmFuZ2UgdmFsdWUgKFRRKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBEaXN0YW5jZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBBbGFybSBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9UVU5ORUxfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBUdW5uZWwgSUQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgQXNzb2NpYXRlZCBPTlUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTUlOX0xBU0VSX09WRVJIRUFEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgTWluIExhc2VyIE92ZXJoZWFkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IEtleSBleGNoYW5nZSBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IEVQT04gRW5jcnlwdGlvbiAuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRkVDIGVuYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBPQU0gaGVhcnRiZWF0IGNvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgVXBzdHJlYW0gQmFuZHdpZHRoLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VCRF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFVCRCBJbmZvLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IENsb2NrIFRyYW5zcG9ydCBFbmFibGUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfUEVORElOR19HUkFOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgUGVuZGluZyBncmFudHMuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgTGluayBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX19OVU1fT0YgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2RlbGV0ZV9saW5rIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0RFTEVURV9MSU5LX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfX0JFR0lOICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0lOSVRJQUxfUkFOR0VfVFE9IDAsICAgIC8qKjwgSW5pdGlhbCByYW5nZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0NVUlJFTlRfUkFOR0VfVFE9IDEsICAgIC8qKjwgQ3VycmVudCByYW5nZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfRU5DUllQVElPTl9FTkFCTEVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnkgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19GT1JDRV9SRURJU0NPVkVSWV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX0ZSQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVjZWl2ZWQgZnJhbWUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19GUkFNRV9DQVBUVVJFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfaW5qZWN0X2ZyYW1lIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEZyYW1lIHRvIHRyYW5zbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfSU5KRUNUX0ZSQU1FX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfRkFJTFVSRV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUQVJUX0lEX1BFUklPRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBwZXJpb2QuICovCisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfX05VTV9PRiAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QX0lEX19OVU1fT0YgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUT1BQRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBFUE9OIE5JIGlkZW50aWZpZXIuICovCisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE1BQyBhZGRyZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX19OVU1fT0YgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19saW5rX2RlbGV0ZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfTElOS19ERUxFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2ggZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQcmV2aW91cyByYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9DVVJSRU5UX1JBVEUgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBDdXJyZW50IHJhdGUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19NUENQX0RFUkVHSVNURVJFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEX0lEX0xJTktfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBMaW5rIGluZm9ybWF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEX0lEX19OVU1fT0YgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRUdfQUNLX1RJTUVPVVRfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfUkVQT1JUX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBbGFybSBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRfSURfU0VORF9QRVJJT0QgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU2VuZCBwZXJpb2QuICovCisgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRF9JRF9MSU5LX0lORk8gICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTGluayBpbmZvcm1hdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUFJPVEVDVElPTl9TVEFUVVMgICAgICAgID0gMCwgICAgLyoqPCBQcm90ZWN0aW9uIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1JBTkdFX1ZBTFVFX1RRICAgICAgICAgICA9IDEsICAgIC8qKjwgUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEuICovCisgICAgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JBTkdFX1ZBTFVFX0NIQU5HRURfSURfUkFOR0VfVkFMVUVfVFEgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEuICovCisgICAgQkNNT0xUX0VQT05fTElOS19SQU5HRV9WQUxVRV9DSEFOR0VEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JFUkFOR0VfRkFJTFVSRV9JRF9fTlVNX09GICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEYXRhIEJ5dGVzIFJYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBEYXRhIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNjQgQnl0ZSBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IDY1LTEyNyBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgMTI4LTI1NSBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgMjU2LTUxMSBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgNTEyLTEwMjMgQnl0ZSBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IDEwMjQtMTUxOCBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgMTUxOS0yMDQ3IEJ5dGUgRnJhbWVzIFJYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCAyMDQ4LTQwOTUgQnl0ZSBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IDQwOTYtOTIxNiBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgOTIxNy0xNjM4MyBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgT0FNIEJ5dGVzIFJYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBPQU0gRnJhbWVzIFJYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NUENQX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBNUENQIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgVW5pY2FzdCBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IE11bHRpY2FzdCBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IFJlcG9ydCBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZDU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IEZDUyBFcnJvciBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgT3ZlcnNpemUgRXJyb3IgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAvKio8IFJ1bnQgRXJyb3IgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0xJTkVfQ09ERV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAvKio8IExpbmUgQ29kZSBFcnJvciBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWCAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgTGluZSBDb2RlIEVycm9yIE1heCBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgRGF0YSBCeXRlcyBUWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qKjwgRGF0YSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IDY0IEJ5dGUgRnJhbWVzIFRYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgLyoqPCA2NS0xMjcgQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAvKio8IDEyOC0yNTUgQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAvKio8IDI1Ni01MTEgQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAvKio8IDUxMi0xMDIzIEJ5dGUgRnJhbWVzIFRYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCAxMDI0LTE1MTggQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAvKio8IDE1MTktMjA0NyBCeXRlIEZyYW1lcyBUWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgIC8qKjwgMjA0OC00MDk1IEJ5dGUgRnJhbWVzIFRYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgLyoqPCA0MDk2LTkyMTYgQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IDkyMTctMTYzODMgQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAvKio8IE9BTSBCeXRlcyBUWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3LCAgIC8qKjwgT0FNIEZyYW1lcyBUWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4LCAgIC8qKjwgTVBDUCBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOSwgICAvKio8IEJyb2FkY2FzdCBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MCwgICAvKio8IFVuaWNhc3QgRnJhbWVzIFRYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDEsICAgLyoqPCBNdWx0aWNhc3QgRnJhbWVzIFRYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9HQVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDIsICAgLyoqPCBHYXRlcyBUWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkVfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST05fVElNRV9UUSAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IExhc2VyLW9uIHRpbWUgKFRRKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPRkZfVElNRV9UUSAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTGFzZXItb2ZmIHRpbWUgKFRRKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUkFOR0VfVkFMVUVfVFEgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmFuZ2UgdmFsdWUgKFRRKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUEVORElOR19HUkFOVFMgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUGVuZGluZyBHcmFudHMuICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2FkZF9saW5rIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBNQUMgYWRkcmVzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUmF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmsgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9BRERfTVVMVElDQVNUX0xJTktfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE1BQyBhZGRyZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBSYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBNQUMgYWRkcmVzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9XT1JLSU5HX0xJTktfSU5GTyAgICAgICAgICA9IDEsICAgIC8qKjwgV29ya2luZyBsaW5rIGluZm8uICovCisgICAgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9hdXRvX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgMTBHIEVwb24gQXV0b25vbW91cyBSb2d1ZSBTY2FuIGZhaWx1cmUgZGV0ZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IDFHIEVwb24gQXV0b25vbW91cyBSb2d1ZSBTY2FuIGZhaWx1cmUgZGV0ZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTExJRF9RVUFSQU5USU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IExMSUQgUXVhcmFudGluZWQuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IE1QQ1AgVGltZXN0YW1wIENoYW5nZWQuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTk9fUkVQT1JUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IE5vIFJlcG9ydHMuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE9OVSBVcGdyYWRlIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JFUkFOR0VfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBSZS1yYW5nZSBmYWlsdXJlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX1NDQU5fQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBSb2d1ZSBTY2FuIGlzIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgU3RhdGUgQ2hhbmdlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX05JX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmVnaXN0cmF0aW9uIEJlaGF2aW9yLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCAxRyBNVFUuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xMEcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IDEwRyBNVFUuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01JTklNVU1fRklCRVJfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1pbmltdW0gRmliZXIgTGVuZ3RoLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQVhJTVVNX0ZJQkVSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBNYXhpbXVtIEZpYmVyIExlbmd0aC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgR3JhbnQgU3BhY2luZyAoVFEpLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX0xPR0lDQUxfTElOS19PUFRJT05TICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBFUE9OIGxvZ2ljYWwgbGluayBvcHRpb25zLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBNUENQIGRpc2NvdmVyeSBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBBbGFybSBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxMX0xJTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgQWxsIGxpbmtzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBFUE9OIE5JIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgQ2xvY2sgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IERyb3AtZG93biBXZWlnaHRzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9TT0xJQ0lURURfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgLyoqPCBBcHByb3hpbWF0ZSBTb2xpY2l0ZWQgVXNhZ2UuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1RETV9VU0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IEFwcHJveGltYXRlIFRETSBVc2FnZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgTm8gUmVwb3J0cyBzb2FrIHRpbWUuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IFBPTiBBZ2dyZWdhdGUgU2hhcGVyLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FU1RJTUFURURfUE9OX0xBVEVOQ1lfVFEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgLyoqPCBFc3RpbWF0ZWQgUE9OIExhdGVuY3kgKFRRKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgT05VIHVwZ3JhZGUgcGFyYW1zLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCAxMEcgRXBvbiBBdXRvbm9tb3VzIFJvZ3VlIERldGVjdGlvbiBFbmFibGUuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzFHX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IDFHIEVwb24gQXV0b25vbW91cyBSb2d1ZSBEZXRlY3QgRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgID0gMjQsICAgLyoqPCAxMEcgRXBvbiBBdXRvIFJvZ3VlIERldGVjdCBUaHJlc2hvbGQuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfaXNzdWVfcnNzaV9ncmFudCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9HUkFOVEVEX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEdyYW50ZWQgTGluay4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUnNzaSBUcmlnZ2VyIFdpZHRoIGluIG5zLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBSc3NpIFRyaWdnZXIgRGVsYXkgaW4gbnMuICovCisgICAgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9TQU1QTEVfUEVSSU9EICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJzc2kgU2FtcGUgUGVyaW9kIGluIHVzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfa2V5X2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBFUE9OIE5JIG51bWJlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9LRVlfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTExJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTGluayBSYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBMaW5rIE1BQy4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX1JBTkdFX1ZBTFVFX1RRICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEuICovCisgICAgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX01QQ1BfVElNRVNUQU1QX0NIQU5HRURfSURfTVBDUF9USU1FU1RBTVAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBNUENQIFRpbWVzdGFtcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9NUENQX1RJTUVTVEFNUF9DSEFOR0VEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9ub19yZXBvcnRzIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfTk9fUkVQT1JUU19JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMgICAgICAgICAgPSAxLCAgICAvKio8IExpc3Qgb2YgZmFpbGVkIGVudGl0aWVzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQV9JRF9fQkVHSU4gICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEFfSURfUkVSQU5HRV9ERUxUQT0gMCwgICAgLyoqPCBSZS1yYW5nZSBkZWx0YS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX19OVU1fT0YgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcmVyYW5nZV9mYWlsdXJlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfUkVSQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcm9ndWVfbGxpZF9zY2FuIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTY2FuIEFsbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTExJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFX0lEX1JFVFVSTl9JTkRfU1RBVFVTICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdHVzIG9mIGNvbXBsZXRlZCBzY2FuLiAqLworICAgIEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMTElELiAqLworICAgIEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xJTktfTUFDICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBMaW5rIE1BQyAuICovCisgICAgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfU0VUX0VQT05fTklfRU5fU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fTklfU0VUX0VQT05fTklfRU5fU1RBVEVfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTGlzdCBvZiBPTlUgSURzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19DRkdfSURfQUxMX0xJTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsbCBMaW5rcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEVQT04gTkkuICovCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE9OVSBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUwgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRkVDIENvZGUgV29yZHMgVG90YWwuICovCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX0RFQ09ERV9GQUlMUyAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZFQyBDb2RlIFdvcmRzIERlY29kZSBGYWlscy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX1pFUk9FU19DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgRkVDIFplcm9lcyBDb3JyZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEZFQyBPbmVzIENvcnJlY3RlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xZ191c19hdXRvX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9BTExfTElOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsbCBMaW5rcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9FUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEVQT04gTkkuICovCisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE9OVSBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzFnX3VzX3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xZ191c19zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkCit7CisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBHb29kIGZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgR29vZCBieXRlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgT3ZlcnNpemVkIGZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgTm9uLUZFQyBHb29kIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfQllURVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgTm9uLUZFQyBHb29kIEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBGRUMgR29vZCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IEZFQyBHb29kIEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlMgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBGRUMgRnJhbWVzIHdoaWNoIGV4Y2VlZGVkIDggc3ltYm9sIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19OT19FUlJTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgRkVDIEJsb2NrcyB3aXRoIG5vIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19DT1JSX0VSUlMgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgRkVDIEJsb2NrcyB3aXRoIGNvcnJlY3RhYmxlIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19VTkNPUlJfRVJSUyAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgRkVDIEJsb2NrcyB3aXRoIHVuY29ycmVjdGFibGUgZXJyb3JzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBGRUMgQ29ycmVjdGVkIEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBGRUMgQ29ycmVjdGVkIFplcm9lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9PTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRkVDIENvcnJlY3RlZCBPbmVzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBVbmRlcnNpemUgZnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBFcnJvcmVkIGZyYW1lIC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX0ZFQ19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBhdGggRkVDIHN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQUkJTIEdlbmVyYXRvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIG51bWJlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ19kc19zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IDY0IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCA2NS0xMjcgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IDEyOC0yNTUgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IDI1Ni01MTEgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IDUxMi0xMDIzIEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCAxMDI0LTE1MTggQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IDE1MTktMjA0NyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgMjA0OF80MDk1IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCA0MDk2LTkyMTYgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IDkyMTctMTYzODMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IEJyb2FkY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IERhdGEgQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IE11bGl0Y2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IFVuaWNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgLyoqPCBPQU0gQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IE9BTSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IEdhdGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCBNUENQIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgQWJvcnQgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ191c19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9GRUNfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQYXRoIEZFQyBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfU1lOQ19USU1FX1RRICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU3luYyBUaW1lIChUUSkuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFBSQlMgQ2hlY2tlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUFJCUyBzdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ191c19rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBFUE9OIE5JLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX3VzX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNjQgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IDY1LTEyNyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgMjU2LTUxMSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgNTEyLTEwMjMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgMTUxOS0yMDQ3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCAyMDQ4XzQwOTUgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgOTIxNy0xNjM4MyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0RBVEFfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRGF0YSBCeXRlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgTXVsaXRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IE1QQ1AgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBPQU0gQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IE9BTSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IFJlcG9ydCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEFib3J0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgRkNTIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCBDUkM4IEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgLyoqPCBPdXQgb2YgU2xvdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgT3ZlcnNpemUgRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFJ1bnQgRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19hdXRvX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfZHNfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEZWZhdWx0IEZFQyBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUmFtYW4gbW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgVHVyYm8gMkcgbW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUFJCUyBHZW5lcmF0b3IuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfZHNfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBFUE9OIE5JLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX2RzX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBCeXRlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCA2NCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgNjUtMTI3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCAxMjgtMjU1IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCAyNTYtNTExIEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCA1MTItMTAyMyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgMTAyNC0xNTE4IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCAxNTE5LTIwNDcgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IDIwNDhfNDA5NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgNDA5Ni05MjE2IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCA5MjE3LTE2MzgzIEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBCcm9hZGNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBEYXRhIEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBNdWxpdGNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBVbmljYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgT0FNIEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBPQU0gRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBHYXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgTVBDUCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEFib3J0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRGVmYXVsdCBGRUMgc3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfU1lOQ19USU1FX1RRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFN5bmMgVGltZSAoVFEpLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBQUkJTIENoZWNrZXIuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFBSQlMgc3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRVBPTiBOSS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ191c19zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNjQgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IDY1LTEyNyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgMjU2LTUxMSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgNTEyLTEwMjMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgMTUxOS0yMDQ3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1ICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCAyMDQ4XzQwOTUgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgOTIxNy0xNjM4MyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRGF0YSBCeXRlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgTXVsaXRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IE1QQ1AgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBPQU0gQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IE9BTSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IFJlcG9ydCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEFib3J0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgRkNTIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCBDUkM4IEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgLyoqPCBPdXQgb2YgU2xvdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgT3ZlcnNpemUgRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JVTlRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFJ1bnQgRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9ycF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcnBfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBCYXNlIGxvZ2ljYWwgbGluayBpZGVudGlmaWVyLiAqLworICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBNUENQIGRpc2NvdmVyeSBlbmFibGUuICovCisgICAgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IE1QQ1AgZGlzY292ZXJ5IGdyYW50IGxlbmd0aCBUUS4gKi8KKyAgICBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgTVBDUCByZXBvcnQgdGltZW91dCBtUy4gKi8KKyAgICBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX01QQ1BfUkVHX1BFUl9ESVNDX1dJTkRPVyAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgTWF4aW11bSBNUENQIHJlZ2lzdHJhdGlvbnMgcGVyIGRpc2NvdmVyeSB3aW5kb3cuICovCisgICAgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1heGltdW0gbnVtYmVyIG9mIGxpbmtzLiAqLworICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBEZWZhdWx0IFVwc3RyZWFtIEJhbmR3aWR0aC4gKi8KKyAgICBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgUmF0ZSBvZiBSZWZyYWN0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9ycF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3JwX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9ycF9rZXlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9SUF9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEVQT04gTkkgbnVtYmVyLiAqLworICAgIEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9MSU5LX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaW5rIHJhdGUuICovCisgICAgQkNNT0xUX0VQT05fUlBfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3JwX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwaW9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncGlvX2NmZ19pZAoreworICAgIEJDTU9MVF9HUElPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BJT19DRkdfSURfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRGlyZWN0aW9uLiAqLworICAgIEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICBCQ01PTFRfR1BJT19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bpb19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncGlvX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bpb19rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BJT19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQSU9fS0VZX0lEX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlc2VydmVkLiAqLworICAgIEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBHUElPIElELiAqLworICAgIEJDTU9MVF9HUElPX0tFWV9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncGlvX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2NfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBHZXQgYWxsb2MgSUQgc3RhdGlzdGljcyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsbG9jIElEIHN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TTEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBBbGxvYyBJRCBTTEEuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IG9udV9pZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRW5hYmxlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBvbiB0aGUgYWxsb2MgaWQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgbmV3IHN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX1VTRUQgICAgICAgICA9IDEsICAgIC8qKjwgQXZlcmFnZSBOU1IgdXNlZCBieXRlcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX0FMTE9DQVRFRCAgICA9IDIsICAgIC8qKjwgQXZlcmFnZSBOU1IgYWxsb2NhdGVkIGJ5dGVzLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQgICAgICAgID0gMywgICAgLyoqPCBBdmVyYWdlIFNSIHJlcG9ydC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2NfZ2V0X3N0YXRzIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZAoreworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTnVtYmVyIG9mIGN5Y2xlcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQWxsb2MgSUQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX3NldF9zdGF0ZSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9hbGxvY19zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2Nfc3RhdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkCit7CisgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZWNlaXZlZCBCeXRlcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fZ2VtX3BvcnRfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBnZW0gcG9ydCBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRG93bnN0cmVhbSBlbmNyeXB0aW9uIG1vZGUuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFVwc3RyZWFtIGRlc3RpbmF0aW9uIHF1ZXVlLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBjb250cm9sLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBEZWJ1ZyBmbG93IGNvbmZpZy4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgTUFDIHRhYmxlIGVudHJ5IGxpbWl0LiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IG5ldyBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgR0VNIFBvcnQgSUQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X3NldF9zdGF0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZAoreworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TRVRfU1RBVEVfSURfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU0VUX1NUQVRFX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9nZW1fcG9ydF9zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlY2VpdmVkIEdFTSBmcmFtZXMuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJlY2VpdmVkIGJ5dGVzLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBUcmFuc21pdHRlZCBHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBUcmFuc21pdHRlZCBieXRlcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBGbHVzaCBNQUMgVGFibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TQ0FOX01BQ19UQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTY2FuIE1BQyBUYWJsZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0lXRl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgSVdGIG1vZGUuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19UUElEX1BFUl9GTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFVTIHRwaWQgcGVyIGZsb3cuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFVTIG90YWcgZGlyZWN0IHRwaWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9QQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFVTIG90YWcgZGlyZWN0IHBiaXQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IERTIHRwaWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1BQyB0YWJsZSBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfREVCVUdfRkxPV19DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBEZWJ1ZyBmbG93IGNvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IE1BQyB0YWJsZSBlbnRyeSBjb3VudC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0ZPUkJJRERFTl9WTEFOX0ZMT1dfR0VNX1JBTkdFX1NUQVJUICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgVmxhbiwgZmxvdywgR2VtIGZvcmJpZGRlbiByYW5nZSBzdGFydCB2YWx1ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEdFTSBwb3J0LiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfUEJJVF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQYml0IGNvbnRyb2wuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBGbG93IElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRCAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTWFwcGluZyBtZXRob2QuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE1hcHBpbmcgdGFnLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBWTEFOIGFjdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHZsYW4gSUQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfX05VTV9PRiAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgY29udHJvbC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVklELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfRkxPV19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBGTE9XIElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9hdXRvX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfQUdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE1BQyBBZ2VkLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBNQUMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgTUFDIE1vdmUuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9ORVdfTUFDICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IE5ldyBNQUMuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0ZMT1dfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBGbG93IElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBzdGF0aWMuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfR0VNX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEdFTSBQb3J0IElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBPTlUgSUQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE1BQyBhZGRyZXNzLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBWTEFOLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX19OVU1fT0YgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfQUdFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX0ZMT1dfSUQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgZmxvdyBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgb2xkIGZsb3cgSUQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9ORVdfRkxPV19JRCAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IG5ldyBmbG93IGlkLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9uZXdfbWFjIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9ORVdfTUFDX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQ19JRF9GTE9XX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBmbG93IElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQ19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9FTlRSSUVTICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEVudHJpZXMuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX3NjYW5fbWFjX3RhYmxlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9NQUNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBNQUMgQWRkcmVzcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEUyBoaXQgZXZlbnQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IERTIG1pc3MgZXZlbnQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERTIGRyb3AgZHVlIHRvIG1pc3MgZXZlbnQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IERTIGRyb3AgZHVlIHRvIGhpdCBldmVudC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTSAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgRFMgZHJvcCB0byBkaXNhYmxlZCBHRU0uICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE5ldyBNQUMgZGlzY292ZXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9NT1ZFX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgTW92ZSBldmVudC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTCAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgTmV3IE1BQyBkcm9wIGR1ZSB0byBmaWZvIGZ1bGwuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfdXNfZmxvd19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBGbG93IElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9NQUNfTEVBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBNQUMgbGVhcm5pbmcuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFZMQU4gYWN0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBWbGFuIHRhZy4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgVFBJRCBpbmRleC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl91c19mbG93X2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgR0VNIFBvcnQgIElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2F1dG9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IENQVSBQYWNrZXRzIEZhaWx1cmUuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGRlYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBkaXNhYmxlIGFsbCBvbnVzIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgZW5hYmxlIGFsbCBvbnVzIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgTE9TLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBPTlUgRGlzY292ZXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgT05VIFVwZ3JhZGUgQ29tcGxldGUuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQgICAgICAgICAgICAgPSA4LCAgICAvKio8IFByb3RlY3Rpb24gU3dpdGNoaW5nIE9OVXMgUmFuZ2VkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEICAgID0gOSwgICAgLyoqPCBQcm90ZWN0aW9uIFN3aXRjaGluZyBTd2l0Y2hvdmVyIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSAgICAgICAgICA9IDEwLCAgIC8qKjwgUHJvdGVjdGlvbiBTd2l0Y2hpbmcgVHJhZmZpYyBSZXN1bWUuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IFJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUICAgICAgICAgICAgPSAxMiwgICAvKio8IFJvZ3VlIE9OVSBzcGVjaWFsIG1hcCBjeWNsZSBzdGFydC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUICAgICAgICA9IDEzLCAgIC8qKjwgU2VyaWFsIE51bWJlciBBY3F1aXNpdGlvbiBDeWNsZSBTdGFydC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCAgICAgICA9IDE0LCAgIC8qKjwgU3RhbmRieSBQT04gTW9uaXRvcmluZyBDeWNsZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IFN0YXRlIENoYW5nZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IFRPRCByZXF1ZXN0IGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGxvYW0uICovCisgICAgQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQXZhaWxhYmxlIEJhbmR3aWR0aC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgbnVtYmVyIG9mIGFjdGl2ZSBvbnVzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX1NUQU5EQllfT05VUyAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBudW1iZXIgb2YgYWN0aXZlIHN0YW5kYnkgb251cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgUFJCUyBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFBvbiBkaXN0YW5jZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgUmFuZ2luZyB3aW5kb3cgc2l6ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJFQVNTSUdORURfRVFVQUxJWkFUSU9OX0RFTEFZICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgUHJlLWFzc2lnbmVkIEVxdWFsaXphdGlvbiBEZWxheSBbYml0c10uICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEVxRCBtZWFzdXJlbWVudCBjeWNsZXMgbnVtYmVyLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBQb3dlciBsZXZlbC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgRFMgRkVDIG1vZGUuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IERyaWZ0IGNvbnRyb2wuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IERTIEJFUiByZXBvcnRpbmcgaW50ZXJ2YWwgaW4gbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IExPUyBhbGFybSB0aHJlc2hvbGQuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IExPUyBpbml0aWFsIHZhbHVlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBPTlUgYWxhcm1zIHRocmVzaG9sZHMuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IEJFUiBtb25pdG9yaW5nIHBhcmFtcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgUGxvYW0gQUNLIHRpbWVvdXQuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IE9OVSBhY3RpdmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCBTTiBBY3F1aXNpdGlvbiAuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEtleSBleGNoYW5nZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgUHJvdGVjdGlvbiBzd2l0Y2hpbmcuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAvKio8IENCUiBSVCBBbGxvY2F0aW9uIHByb2ZpbGUuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IENCUiBOUlQgQWxsb2NhdGlvbiBQcm9maWxlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgLyoqPCBEQkEuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFBvd2VyIE1hbmFnZW1lbnQuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IFJvZ3VlIE9OVSBkZXRlY3Rpb24gcHJvY2Vzcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORyAgICAgICAgICAgICAgICAgICA9IDI3LCAgIC8qKjwgUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgIC8qKjwgUFJCUyBDaGVja2VyLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBQUkJTIEdlbmVyYXRvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgIC8qKjwgTWluaW11bSBEYXRhIEFsbG9jIElELiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTiAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCBBdXRvbWF0aWMgT05VIGRlYWN0aXZhdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgIC8qKjwgVVMgYmFuZHdpZHRoIExpbWl0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfT05VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgLyoqPCBhbGwgT05Vcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0LCAgIC8qKjwgYWxsIG11bHRpY2FzdCBHRU0gcG9ydHMuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IFBPTiBOSSBkZWJ1ZyBwYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYsICAgLyoqPCBPTlUgdXBncmFkZSBwYXJhbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQgICAgICAgICAgICAgPSAzNywgICAvKio8IHByb3RlY3Rpb24gc3dpdGNoaW5nIHR5cGUgYyB3YWl0IGJlZm9yZSBkZWFjdGl2YXRpb24gdGltZW91dC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQklQMzJfSU5ESUNBVElPTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4LCAgIC8qKjwgYmlwMzIgaW5kaWNhdGlvbiBjb250cm9sLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBFcnJvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgR0VNIFBvcnQgSUQuICovCisgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9jcHVfcGFja2V0cyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGFja2V0IHR5cGUuICovCisgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGNhbGMgY3JjLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBnZW0gcG9ydCBsaXN0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBidWZmZXIuICovCisgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGNvbnRyb2wuICovCisgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHNlcmlhbCBudW1iZXIuICovCisgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX19OVU1fT0YgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0VOQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9LRVlfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9sb3MgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfbG9zX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfTE9TX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fTklfTE9TX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2xvc19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfb251X2Rpc2NvdmVyZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc2VyaWFsIG51bWJlci4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9SQU5HSU5HX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcmFuZ2luZyB0aW1lLiAqLworICAgIEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBvbnVfaWQuICovCisgICAgQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMgICAgICAgICAgPSAxLCAgICAvKio8IExpc3Qgb2YgZmFpbGVkIGVudGl0aWVzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUyAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT05Vcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBSZXN1bHQuICovCisgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9fQkVHSU4gICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUmVzdWx0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfX0JFR0lOICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFICA9IDAsICAgIC8qKjwgb251IHN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9MSVNUICAgPSAxLCAgICAvKio8IG9udSBsaXN0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX19OVU1fT0YgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9yZXNldCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1JFU0VUX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBXaW5kb3cgdHlwZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBNZWFzdXJlbWVudCBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQWxsb2MgSUQuICovCisgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfREVMSU5FQVRJT04gICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IElzIGRlbGluZWF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IElzIEVELiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJlY2VpdmVkIGRhdGEuICovCisgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgcGxvYW1fcmVjZWl2ZWRfb251X2lkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfQ1JDX0VSUk9SICAgICAgICAgICAgPSA4LCAgICAvKio8IHBsb2FtX3JlY2VpdmVkX2NyY19lcnJvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFdpbmRvdyB0eXBlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEFsbG9jIElELiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IE9OVSBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVyAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBTZWNvbmQgcmFuZ2luZyB3aW5kb3cuICovCisgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9fTlVNX09GICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3NldF9vbnVfc3RhdGUgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE9OVSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gc3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSICAgPSAwLCAgICAvKio8IG51bWJlciBvZiBkZXRlY3RlZCBkZWxpbWl0ZXIuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwgICAgICAgICAgID0gMSwgICAgLyoqPCBlbmVyZ3kgZGV0ZWN0IHNpZ25hbC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3N0YXJ0X29udV91cGdyYWRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTGlzdCBvZiBPTlUgSURzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfc3RhdF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZWNlaXZlZCBGRUMgY29kZXdvcmRzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUmVjZWl2ZWQgdW5jb3JyZWN0ZWQgRkVDIGNvZGV3b3Jkcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXA4LiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUmVjZWl2ZWQgYmlwOCBlcnJvcnMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSZWNlaXZlZCBHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUmVjZWl2ZWQgZHJvcHBlZCBHRU0gSUQgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJlY2VpdmVkIGlkbGUgR0VNIGZyYW1lcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFJlY2VpdmVkIGNvcnJlY3RlZCBHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lMTEVHQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgUmVjZWl2ZWQgaWxsZWdhbCBHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBSZWNlaXZlZCBQbG9hbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBSZWNlaXZlZCBub24gaWRsZSBQbG9hbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBSZWNlaXZlZCBlcnJvciBQbG9hbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBSZWNlaXZlZCBkcm9wcGVkIFBsb2Ftcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NQVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFJlY2VpdmVkIENQVSBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgUmVjZWl2ZWQgT01DSSBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IFJlY2VpdmVkIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBzaG9ydC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IFJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIGxvbmcuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gY3JjIGVycm9yLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGtleSBlcnJvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UU19FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IFJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBmcmFnbWVudGF0aW9uIGVycm9yLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgR2xvYmFsIGRyb3BwZWQgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFRyYW5zbWl0dGVkIEdFTSBmcmFtZXMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgLyoqPCBUcmFuc21pdHRlZCBQbG9hbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU1fRlJBR01FTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgLyoqPCBUcmFuc21pdHRlZCBHRU0gZnJhZ21lbnRzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgIC8qKjwgVHJhbnNtaXR0ZWQgQ1BVIHBhY2tldHMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgLyoqPCBUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgIC8qKjwgVHJhbnNtaXR0ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgIC8qKjwgRHJvcHBlZCBiZWNhdXNlIG9mIFRQSUQgbWlzcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAvKio8IERyb3BwZWQgYmVjYXVzZSBvZiBWSUQgbWlzcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVzdWx0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUHJldmlvdXMgc3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBOZXcgc3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHRvZF9zdHJpbmcuICovCisgICAgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBzZmMuICovCisgICAgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfU0VDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBydGNfb2Zmc2V0X3NlYy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IHJ0Y19vZmZzZXRfbnNlYy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfdG9kX3JlcXVlc3QgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9JRF9fTlVNX09GICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJFUiBJbnRlcnZhbCBDb25maWd1cmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ER0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBEcmlmdCBvZiBXaW5kb3cgb2YgT05VaS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEVSUi4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEludmFsaWQgREJSdSBSZXBvcnQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBLZXkgRXhjaGFuZ2UgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgS2V5IEV4Y2hhbmdlIEN5Y2xlIFNraXBwZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBLZXkgRXhjaGFuZ2UgRGVjcnlwdCBSZXF1aXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IEtleSBFeGNoYW5nZSBLZXkgTWlzbWF0Y2guICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBLZXkgRXhjaGFuZ2UgS2V5IFJlcXVlc3QgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IEtleSBFeGNoYW5nZSBVbmNvbnNlY3V0aXZlIEluZGV4LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0FJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgTE9BaS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTE9LSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IExPa2kuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX01FTUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBNRU1pLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgT01DSSBQT1JUIElEIENvbmZpZ3VyYXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgT05VIEFjdGl2YXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgb251IGFjdGl2YXRpb24gc3RhbmRieSBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBPTlUgQWxhcm0uICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCBPTlUgRGVhY3RpdmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IE9OVSBEaXNhYmxlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAvKio8IE9OVSBFbmFibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgT3B0aWNhbCBSZWZsZWN0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgUGFzc3dvcmQgQXV0aGVudGljYXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgUEVFLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QT1NTSUJMRV9EUklGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qKjwgUG9zc2libGUgRHJpZnQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgLyoqPCBQb3dlciBNYW5hZ2VtZW50IFN0YXRlIENoYW5nZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAvKio8IFBTVC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUkFOR0lOR19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAvKio8IFJhbmdpbmcgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SRUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5LCAgIC8qKjwgUkVJLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgIC8qKjwgUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCBTaWduYWwgRGVncmFkZWQgb2YgT05VaS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAvKio8IFNpZ25hbCBGYWlsIG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IFNVRmkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1RJV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYsICAgLyoqPCBUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmcuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0JFUl9JTlRFUlZBTCAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJFUiBpbnRlcnZhbCBpbiBtcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJlc3VsdC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgb251IHN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU2VyaWFsIG51bWJlci4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1BBU1NXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IHBhc3N3b3JkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQVVUT19QQVNTV09SRF9MRUFSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgYXV0byBwYXNzd29yZCBsZWFybmluZy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1VTX0ZFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFVTIEZFQy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE9NQ0kgcG9ydCBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IERTIEJFUiByZXBvcnRpbmcgaW50ZXJ2YWwgaW4gbXMuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBBRVMgZW5jcnlwdGlvbiBrZXkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBhbGFybSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IHJhbmdpbmcgdGltZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IERpc2FibGVkIGFmdGVyIERpc2NvdmVyeS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IGRlYWN0aXZhdGlvbiByZWFzb24uICovCisgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBhbGwgR0VNIHBvcnRzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgYWxsIGFsbG9jcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IG9udSBwcm90ZWN0aW9uIHN3aXRjaGluZyB0eXBlIGMuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBFeHRlbmRlZCBHdWFyZCBUaW1lLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTF9JRF9QT1dFUl9MRVZFTF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBwb3dlciBsZXZlbCBhY3Rpb24uICovCisgICAgQkNNT0xUX0dQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfY3B1X3BhY2tldCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBwb3J0X2lkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgY3JjX29rLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcGFja2V0X3NpemUuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBidWZmZXIuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9jcHVfcGFja2V0cyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGFja2V0IHR5cGUuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBjYWxjIGNyYy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IG51bWJlciBvZiBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU2luZ2xlIHBhY2tldCBzaXplLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgYnVmZmVyLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2RmaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0RGSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2RmaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2RnaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0RHSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2RnaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2Rvd2kgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2Rvd2lfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWxhcm0gc3RhdHVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRHJpZnQgdmFsdWUuICovCisgICAgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfTkVXX0VRRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBOZXcgRVFELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2VyciBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0VSUl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX0JJUDhfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJJUDggZXJyb3JzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9FUlJfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsbG9jLUlELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgbmV3IGtleS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEX0lEX05FV19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBuZXcga2V5LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGV4cGVjdGVkIGtleS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHJlY2VpdmVkIGtleS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9fTlVNX09GICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXggZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfRVhQRUNURURfSU5ERVggICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGV4cGVjdGVkIGluZGV4LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9BQ1RVQUxfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgYWN0dWFsIGluZGV4LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfbG9haSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9MT0FJX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX0xPQUlfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fT05VX0xPQUlfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9sb2FpX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfbG9raSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9MT0tJX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX0xPS0lfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fT05VX0xPS0lfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9sb2tpX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfbWVtaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX01FTUlfSURfUExPQU1fQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQTE9BTSBidWZmZXIuICovCisgICAgQkNNT0xUX0dQT05fT05VX01FTUlfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9tZW1pX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb21jaV9wYWNrZXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHBvcnRfaWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBjcmNfb2suICovCisgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBwYWNrZXRfc2l6ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IGJ1ZmZlci4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0dFTV9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEdFTSBQb3J0IElELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgc3RhdHVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfT1BFUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgT3BlcmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGZhaWwgcmVhc29uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEX0lEX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCByZXN1bHQuICovCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vbnVfYWxhcm0gZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBvbnUgYWxhcm0uICovCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9PUFRJQ0FMX1JFRkxFQ1RJT05fSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc3RhdHVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgZmFpbCByZWFzb24uICovCisgICAgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9QQVNTV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBwYXNzd29yZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcGVlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9wZWVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9QRUVfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYWxhcm0gc3RhdHVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QRUVfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcGxvYW1fcGFja2V0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGxvYW0uICovCisgICAgQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0IAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEVzdGltYXRlZCBEcmlmdC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgT2xkIFN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTmV3IFN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmVhc29uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcHN0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9wc3RfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfTElOS19OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgbGluayBudW1iZXIuICovCisgICAgQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBLMS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0syICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEsyLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc3RhdHVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgZmFpbCByZWFzb24uICovCisgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBudW1iZXIgb2YgUExPQU1zLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9FUUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRVFELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgUG93ZXIgTGV2ZWwuICovCisgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9yZWkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3JlaV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9SRUlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX1JFSV9JRF9CSVA4X0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBCSVA4IGVycm9ycy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUkVJX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3JlaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGZhaWwgcmVhc29uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9yc3NpX21lYXN1cmVtZW50IAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9JRF9fTlVNX09GICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zZGkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3NkaV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9TRElfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NESV9JRF9CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBCRVIuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NESV9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9zZGlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zZXRfb251X3N0YXRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgT05VIHN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3NmaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1NGSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0JFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEJFUi4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3NmaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3N0YXRfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0NGR19JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc3RhdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBUb3RhbCByZWNlaXZlZCBGRUMgY29kZXdvcmRzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRkVDIGNvZGV3b3JkcyBjb3JyZWN0ZWQgYnl0ZXMuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBGRUMgY29ycmVjdGVkIGNvZGV3b3JkcyBlcnJvciAuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBGRUMgbm90IGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSZWNlaXZlZCBieXRlcyBmb3IgQklQOC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEJpdCBlcnJvciBhY2NvcmRpbmcgdG8gQklQOC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJlY2VpdmVkIFBMT0FNcyB3aXRoIENSQyBlcnJvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFJlY2VpdmVkIG5vbiBpZGxlIFBMT0FNcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IFBvc2l0aXZlIGRyaWZ0LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgTmVnYXRpdmUgZHJpZnQuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBSZWNlaXZlZCBPTUNJIHBhY2tldHMuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JFUl9SRVBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgQkVSIHJlcG9ydGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgVW5yZWNlaXZlZCBidXJzdC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9MQ0RHX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IExDREcgZXJyb3JzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JESV9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgUkRJIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IHJ4IGJ5dGVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgcnggcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IHR4IGJ5dGVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgdHggcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zdWZpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9zdWZpX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1NVRklfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3N1ZmlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV90aXdpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV90aXdpX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IERyaWZ0IHZhbHVlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fdHJ4X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHRyYW5zY2VpdmVyIHR5cGUuICovCisgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMQSBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQkNEUi4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IExBIHJhbmdpbmcgYWZ0ZXIgbm8gZWQgcmVzeW5jIC4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEJDRFIgcmFuZ2luZyBhZnRlciBubyBlZCByZXN5bmMgY29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IExBIHJhbmdpbmcgYWZ0ZXIgZWQgcmVzeW5jIC4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IEJDRFIgcmFuZ2luZyBhZnRlciBlZCByZXN5bmMuICovCisgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBsYSByZXN5bmMgcG9sYXJpdHkuICovCisgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JFU1lOQ19QT0xBUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBCQ0RSIHJlc3luYyBwb2xhcml0eS4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IGJjZHIgcmFuZ2luZyByZXN5bmMgY29uZGl0aW9ucy4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IGxhIHJhbmdpbmcgcmVzeW5jIGNvbmRpdGlvbnMuICovCisgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBSWCBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgcmFuZ2luZyBjb250cm9sIHN0YWdlcyBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRW5lcmd5IERldGVjdC4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9EQVRBX1BBVFRFUk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IGVuZCBvZiBidXJzdCBkYXRhIHBhdHRlcm4gLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgZW5kIG9mIGJ1cnN0IHJhbmdpbmcgcGF0dGVybi4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFByZWFtYmxlLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgRGVsaW1pdGVyLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfR1VBUkRfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgR3VhcmQgYml0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IHNlcmRlcyBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX1JBTkdJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgUExPIGZvciByYW5naW5nLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgUExPIGZvciBkYXRhLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgcnNzaSBub3JtYWwgY29uZmlnLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgcmFuZ2luZyByc3NpIHJlc3luYyBjb250cm9sLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl90cnhfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl90cnhfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nX2VudHJ5X2F1dG9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgZGVmYXVsdCBsb2cgbGV2ZWwuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBkZWZhdWx0IGxvZyB0eXBlLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9QUklOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgbG9nIGxldmVsIHByaW50LiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9TQVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgbG9nIGxldmVsIHNhdmUuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBsb2cgdHlwZS4gKi8KKyAgICBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IGxvZ19zdHlsZS4gKi8KKyAgICBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IGxvZyBuYW1lLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgbG9nIGlkLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcmVzZXJ2ZWQuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBuYW1lLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkCit7CisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZAoreworICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX01TR19DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBtc2cgY291bnQuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX0xPU1RfTVNHX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBsb3N0IG1zZyBjb3VudC4gKi8KKyAgICBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9hdXRvX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ2dlcl9jZmdfaWQKK3sKKyAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYnVmZmVyLiAqLworICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX1dSQVBfQVJPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgd3JhcCBhcm91bmQuICovCisgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfQ0xFQVJfQUZURVJfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBjbGVhcl9hZnRlcl9yZWFkLiAqLworICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0VOQUJMRV9MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgZW5hYmxlIGxvZy4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IGxvZ19uYW1lcy4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9fTlVNX09GICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9sb2dnZXJfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nZ2VyX2NsZWFyX2xvZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZAoreworICAgIEJDTU9MVF9MT0dHRVJfQ0xFQVJfTE9HX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dnZXJfa2V5X2lkCit7CisgICAgQkNNT0xUX0xPR0dFUl9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHJlc2VydmVkLiAqLworICAgIEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgZmlsZSBpZC4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX0tFWV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ2dlcl9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQKK3sKKyAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nZ2VyX3N0YXRfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQKK3sKKyAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfc3RhdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nZ2VyX3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfTE9HR0VSX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9JRF9MSU5FU19JTl9MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgbGluZXMgaW4gbG9nLiAqLworICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nZ2VyX3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9OTklfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRVU19DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFN0YXR1cyBjaGFuZ2VkLiAqLworICAgIEJDTU9MVF9OTklfQVVUT19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbm5pX2NmZ19pZAoreworICAgIEJDTU9MVF9OTklfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX05OSV9DRkdfSURfUkVNT1RFX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZW1vdGUgbG9vcGJhY2suICovCisgICAgQkNNT0xUX05OSV9DRkdfSURfTElORV9MT09QQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaW5lIGxvb3BiYWNrLiAqLworICAgIEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgTWFjIEFkZHJlc3MuICovCisgICAgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBOTkkgU3RhdHVzLiAqLworICAgIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgTk5JIEJhY2t1cCBTdGF0dXMuICovCisgICAgQkNNT0xUX05OSV9DRkdfSURfQUNUSVZFX05OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBBY3RpdmUgTk5JLiAqLworICAgIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgTk5JIFN0YXR1cyBQb2xsaW5nIEludGVydmFsIChtcykuICovCisgICAgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBBdXRvLVN3aXRjaC4gKi8KKyAgICBCQ01PTFRfTk5JX0NGR19JRF9GTE9XX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEZsb3cgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfTk5JX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbm5pX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfTk5JX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIE5JLiAqLworICAgIEJDTU9MVF9OTklfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3NlcmRlc19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkCit7CisgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfVkdBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJ4IFZnYS4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJ4IFBGLiAqLworICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9MRlBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUnggTEZQRi4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJ4IERGRTEuICovCisgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSeCBERkUyLiAqLworICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUnggREZFMy4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJ4IERGRTQuICovCisgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBSeCBERkU1LiAqLworICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgVHggUHJlLiAqLworICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgVHggTWFpbi4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IFR4IFBvc3QxLiAqLworICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgVHggUG9zdDIuICovCisgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBUeCBQb3N0My4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IFR4IEFtcC4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zZXJkZXNfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZAoreworICAgIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gTkkuICovCisgICAgQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX0lOU1RBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBJbnN0YW5jZS4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zdGF0X2FsYXJtX2NsZWFyZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX05OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfc3RhdF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9OTklfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9zdGF0X2lkCit7CisgICAgQkNNT0xUX05OSV9TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJYIDY0IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUlggNjUtMTI3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUlggMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJYIDI1Ni01MTEgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSWCA1MTItMTAyMyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFJYIDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJYIDE1MTktMjA0NyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFJYIDIwNDgtNDA5NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IFJYIDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IFJYIDkyMTctMTYzODMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBSWCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBSWCBCeXRlcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfR09PRF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IFJYIEdvb2QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgUlggVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBSWCBNdWx0aWNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgUlggQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRkNTX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFJYIEZDUyBFcnJvcnMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBSWCBDb250cm9sIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEFVU0VfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IFJYIFBhdXNlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEZDX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IFJYIFBGQyBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX09QQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgLyoqPCBSWCBVbnN1cHBvcnRlZCBPcGNvZGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgUlggVW5zdXBwb3J0ZWQgREEgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9BTElHTk1FTlRfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgUlggQWxpZ25tZW50IEVycm9ycy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IFJYIExlbmd0aCBPdXQgb2YgUmFuZ2UuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPREVfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgLyoqPCBSWCBDb2RlIEVycm9ycy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfT1ZFUlNJWkVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFJYIE92ZXJzaXplZCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgLyoqPCBSWCBKYWJiZXIgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVFVfQ0hFQ0tfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgIC8qKjwgUlggTVRVIENoZWNrIEVycm9ycy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAvKio8IFJYIFByb21pc2N1b3VzIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVkxBTl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAvKio8IFJYIFZMQU4gRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgIC8qKjwgUlggRG91YmxlIFZMQU4gRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9UUlVOQ0FURURfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgIC8qKjwgUlggVHJ1bmNhdGVkIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAvKio8IFJYIFVuZGVyc2l6ZWQgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFHTUVOVEVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgIC8qKjwgUlggRnJhZ21lbnRlZCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1JVTlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgLyoqPCBSWCBSdW50IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IFRYIDY0IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgIC8qKjwgVFggNjUtMTI3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3LCAgIC8qKjwgVFggMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAvKio8IFRYIDI1Ni01MTEgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzksICAgLyoqPCBUWCA1MTItMTAyMyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MCwgICAvKio8IFRYIDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MSwgICAvKio8IFRYIDE1MTktMjA0NyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MiwgICAvKio8IFRYIDIwNDgtNDA5NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MywgICAvKio8IFRYIDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NCwgICAvKio8IFRYIDkyMTctMTYzODMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDUsICAgLyoqPCBUWCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDYsICAgLyoqPCBUWCBCeXRlcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NywgICAvKio8IFRYIEdvb2QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ4LCAgIC8qKjwgVFggVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDksICAgLyoqPCBUWCBNdWx0aWNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwLCAgIC8qKjwgVFggQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEFVU0VfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MSwgICAvKio8IFRYIFBhdXNlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEZDX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MiwgICAvKio8IFRYIFBGQyBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTMsICAgLyoqPCBUWCBKYWJiZXIgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GQ1NfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0LCAgIC8qKjwgVFggRkNTIEVycm9ycy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NSwgICAvKio8IFRYIENvbnRyb2wgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9PVkVSU0laRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2LCAgIC8qKjwgVFggT3ZlcnNpemUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU3LCAgIC8qKjwgVFggRnJhZ21lbnRlZCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0VSUk9SX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgsICAgLyoqPCBUWCBFcnJvciBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTksICAgLyoqPCBUWCBWTEFOIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRE9VQkxFX1ZMQU5fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MCwgICAvKio8IFRYIERvdWJsZSBWTEFOIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUlVOVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MSwgICAvKio8IFRYIFJ1bnQgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTkRFUlJVTl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyLCAgIC8qKjwgVFggVW5kZXJydW4gRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zdGF0dXNfY2hhbmdlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkCit7CisgICAgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5ldyBOTkkgTGluayBTdGF0dXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaW5rLiAqLworICAgIEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfUFJFVklPVVNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUHJldmlvdXMgQWN0aXZlLiAqLworICAgIEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgTmV3IEFjdGl2ZS4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgc29mdHdhcmVfZXJyb3JfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWQKK3sKKyAgICBCQ01PTFRfU09GVFdBUkVfRVJST1JfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRW50cnkuICovCisgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlX2Vycm9yX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkCit7CisgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlc2VydmVkLiAqLworICAgIEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9LRVlfSURfSURYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgSW5kZXguICovCisgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19DRkdfSURfQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ2FwdHVyZSB3aW5kb3cgYW5kIHN0YXRpc3RpYyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHRyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0RBVEFfV0lORE9XICAgICAgICAgICAgPSAwLCAgICAvKio8IGRhdGEgd2luZG93LiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVyAgICAgICAgICA9IDEsICAgIC8qKjwgc3Ryb2JlIHdpbmRvdy4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUlOICAgICAgPSAyLCAgICAvKio8IGVkZ2UgcmlzZSBtaW4gbWluLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NQVggICAgICA9IDMsICAgIC8qKjwgZWRnZSByaXNlIG1pbiBtYXguICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUFYX01JTiAgICAgID0gNCwgICAgLyoqPCBlZGdlIHJpc2UgbWF4IG1pbi4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUFYICAgICAgPSA1LCAgICAvKio8IGVkZ2UgcmlzZSBtYXggbWF4LiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NSU4gICAgICA9IDYsICAgIC8qKjwgZWRnZSBmYWxsIG1pbiBtaW4gLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NQVggICAgICA9IDcsICAgIC8qKjwgZWRnZSBmYWxsIG1pbiBtYXguICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUFYX01JTiAgICAgID0gOCwgICAgLyoqPCBlZGdlIGZhbGwgbWF4IG1pbi4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYICAgICAgPSA5LCAgICAvKio8IGVkZ2UgZmFsbCBtYXggbWF4LiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfUkVTVUxUICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgcmVzdWx0LiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRyeF9jYWxpYnJhdGlvbl9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWQKK3sKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fS0VZX0lEX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9LRVlfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHRyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkCit7CisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHBvbl9uaS4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHRyaWdnZXIuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVFJPQkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBzdHJvYmUuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCB3aW5kb3cgbW9kZS4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IG9udSBpZC4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVJfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IHRyaWdnZXIgcG9zaXRpb24uICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVE9QX0RVRV9UT19DT1JSVVBUX1NUUk9CRSAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBzdG9wIGR1ZSB0byBjb3JydXB0IHN0cm9iZS4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUQVJUX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IHN0YXJ0IG9mZnNldC4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX0VORF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IGVuZCBvZmZzZXQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9OVU1CRVJfT0ZfQ1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBudW1iZXIgb2YgY3ljbGVzLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB0cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQKK3sKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1dfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RPUF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcG9uX25pLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RPUF9DQVBUVVJFX1dJTkRPV19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19hdXRvX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBHZXQgYWxsb2MgSUQgc3RhdGlzdGljcyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NMQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHNsYS4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IG9udV9pZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEVuYWJsZSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gb24gdGhlIGFsbG9jIGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IG5ldyBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEF2ZXJhZ2UgTlNSIHVzZWQgd29yZHMuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVEICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBBdmVyYWdlIE5TUiBhbGxvY2F0ZWQgd29yZHMuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBBdmVyYWdlIFNSIHJlcG9ydC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19nZXRfc3RhdHMgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBOdW1iZXIgb2YgY3ljbGVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBBbGxvYyBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19zZXRfc3RhdGUgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX3N0YXRfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVjZWl2ZWQgQnl0ZXMuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgZ2VtIHBvcnQgc3RhdGUuICovCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBFbmNyeXB0aW9uIG1vZGUuICovCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBVcHN0cmVhbSBkZXN0aW5hdGlvbiBxdWV1ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IGNvbnRyb2wuICovCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEdFTSBQT1JUIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVFggYnl0ZXMuICovCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUWCBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUlggcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJYIGJ5dGVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25faXdmX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25faXdmX2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBVUyBvdGFnIGRpcmVjdCB0cGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRFMgdHBpZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9pd2Zfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTZXJpbCBudW1iZXIuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBGcmVxdW5jeSBhZGp1c3RtZW50IGRpcmVjdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEZyZXF1ZW5jeSBhZGp1c3RtZW50IHNpemUuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9hdXRvX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQ1BVIFBhY2tldHMgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGRlYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgZGlzYWJsZSBhbGwgb251cyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBlbmFibGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgTE9TLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgT05VIERpc2NvdmVyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBPTlUgVXBncmFkZSBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IFByb3RlY3Rpb24gU3dpdGNoaW5nIE9OVXMgUmFuZ2VkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgUHJvdGVjdGlvbiBTd2l0Y2hpbmcgU3dpdGNob3ZlciBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBQcm90ZWN0aW9uIFN3aXRjaGluZyBUcmFmZmljIFJlc3VtZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IFJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBSb2d1ZSBPTlUgc3BlY2lhbCBtYXAgY3ljbGUgc3RhcnQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBTZXJpYWwgTnVtYmVyIEFjcXVpc2l0aW9uIEN5Y2xlIFN0YXJ0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgU3RhbmRieSBQT04gTW9uaXRvcmluZyBDeWNsZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IFN0YXRlIENoYW5nZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBUT0QgcmVxdWVzdCBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGxvYW0uICovCisgICAgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9IV19QT05fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBIVyBwb24gaWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBBdmFpbGFibGUgQmFuZHdpZHRoLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgbnVtYmVyIG9mIGFjdGl2ZSBvbnVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUE9OIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFBPTiBkaXN0YW5jZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFJhbmdpbmcgd2luZG93IHNpemUuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBFcUQgbWVhc3VyZW1lbnQgY3ljbGVzIG51bWJlci4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IGRyaWZ0IGNvbnRyb2wuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBsb3MgYWxhcm0gdGhyZXNob2xkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgbG9zIGluaXRpYWxpemF0aW9uIHZhbHVlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgT05VIGFsYXJtcyB0aHJlc2hvbGRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgQkVSIG1vbml0b3JpbmcgcGFyYW1zLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgT05VIEFjdGl2YXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBzbiBhY3F1aXNpdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IGtleSBleGNoYW5nZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IFByb3RlY3Rpb24gc3dpdGNoaW5nLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgZGVidWcgLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgQ0JSIFJUIEFsbG9jYXRpb24gcHJvZmlsZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IENCUiBOUlQgQWxsb2NhdGlvbiBQcm9maWxlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgUG93ZXIgTWFuYWdlbWVudC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IFJvZ3VlIE9OVSBkZXRlY3Rpb24gcHJvY2Vzcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAvKio8IFBlcmlvZGljIHN0YW5kYnkgUE9OIG1vbml0b3JpbmcuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCBEQkEgbW9kZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BMT0FNX0hBTkRMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IFBsb2FtIGhhbmRsaW5nLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgTWluaW11bSBkYXRhIGFsbG9jIGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfR0VNX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qKjwgTWluaW11bSBkYXRhIHBvcnQgaWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NVUxUSUNBU1RfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgLyoqPCBtdWx0aWNhc3Qga2V5LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgIC8qKjwgUFJCUyBDaGVja2VyLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgIC8qKjwgUFJCUyBHZW5lcmF0b3IuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBQUkJTIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAvKio8IEF1dG9tYXRpYyBPTlUgZGVhY3RpdmF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgIC8qKjwgVVMgYmFuZHdpZHRoIExpbWl0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgIC8qKjwgYWxsIE9OVXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgLyoqPCBhbGwgbXVsdGljYXN0IEdFTSBwb3J0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNCwgICAvKio8IFBPTiBOSSBkZWJ1ZyBwYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1LCAgIC8qKjwgT05VIHVwZ3JhZGUgcGFyYW1zLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgIC8qKjwgRFMgRkVDIG1vZGUuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzcsICAgLyoqPCBEQkEgdHlwZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9UVU5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAvKio8IG9udSB0dW5pbmcuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRXJyb3IuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBHRU0gUG9ydCBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfY3B1X3BhY2tldHMgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHBhY2tldCB0eXBlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgY2FsYyBjcmMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBnZW0gcG9ydCBsaXN0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgYnVmZmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEX0lEX19OVU1fT0YgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGNvbnRyb2wuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfX05VTV9PRiAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX0VOQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfbG9zIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfTE9TX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc3RhdHVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfbG9zX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfb251X2Rpc2NvdmVyZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc2VyaWFsIG51bWJlci4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHJhbmdpbmcgdGltZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IG9udV9pZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IHVwc3RyZWFtIGxpbmUgcmF0ZSBjYXBhYmlsaXRpZXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfRE9XTlNUUkVBTV9QT05fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBjdXJyZW50IGRvd25zdHJlYW0gcG9uIGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DVVJSRU5UX1VQU1RSRUFNX1BPTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgY3VycmVudCB1cHN0cmVhbSBwb24gaWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NBTElCUkFUSU9OX1JFQ09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBjYWxpYnJhdGlvbiByZWNvcmQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1RVTklOR19HUkFOVUxBUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCB0dW5pbmcgZ3JhbnVsYXJpdHkuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NURVBfVFVOSU5HX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBzdGVwIHR1bmluZyB0aW1lLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgYXR0ZW51ZXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBwb3dlciBsZXZlbGxpbmcgY2FwYWJpbGl0aWVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaXN0IG9mIGZhaWxlZCBlbnRpdGllcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE9OVXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZXN1bHQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZXN1bHQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfcmVzZXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1JFU0VUX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfcmVzZXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgV2luZG93IHR5cGUuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBNZWFzdXJlbWVudCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBBbGxvYyBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IE9OVSBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IElzIGRlbGluZWF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgSXMgRUQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBSZWNlaXZlZCBkYXRhLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgcGxvYW1fcmVjZWl2ZWRfb251X2lkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX01JQ19FUlJPUiAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgcGxvYW1fcmVjZWl2ZWRfbWljX2Vycm9yLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBXaW5kb3cgdHlwZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEFsbG9jIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVyAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU2Vjb25kIHJhbmdpbmcgd2luZG93LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX19OVU1fT0YgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlRfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXAgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX05VTUJFUl9PRl9DWUNMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG51bWJlciBvZiBjeWNsZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0FMTE9DQVRJT05fTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGFsbG9jYXRpb24gbnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQldfTUFQX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgYncgbWFwIGFycmF5LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlRfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc2V0X29udV9zdGF0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE9OVSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfU0VUX1BPTl9TVEFURV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUiAgPSAwLCAgICAvKio8IG51bWJlciBvZiBkZXRlY3RlZCBkZWxpbWl0ZXIuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMICAgICAgICAgID0gMSwgICAgLyoqPCBlbmVyZ3kgZGV0ZWN0IHNpZ25hbC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTGlzdCBvZiBPTlUgSURzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlY2VpdmUgRkVDIGNvZGV3b3Jkcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXAzMi4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFJlY2VpdmVkIGJpcDMyIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJlY2VpdmVkIHZhbGlkIFhHVEMgaGVhZGVycy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFJlY2VpdmVkIGNvcnJlY3RlZCBYR1RDIGhlYWRlcnMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19VTkNPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBSZWNlaXZlZCB1bmNvcnJlY3RlZCBYR1RDIGhlYWRlcnMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBSZWNlaXZlZCB2YWxpZCBYR0VNIGZyYW1lcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFJlY2VpdmVkIGRyb3BwZWQgWEdFTSBJRCBmcmFtZXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBSZWNlaXZlZCBpZGxlIFhHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgUmVjZWl2ZWQgY29ycmVjdGVkIFhHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgUmVjZWl2ZWQgcGFja2V0cyB3aXRoIENSQyBlcnJvci4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IFJlY2VpdmVkIGZyYWdtZW50IGVycm9ycy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IEdsb2JhbCBkcm9wcGVkIHBhY2tldHMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBSZWNlaXZlZCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gc2hvcnQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgUmVjZWl2ZWQga2V5IGVycm9ycy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFRyYW5zbWl0dGVkIFBsb2Ftcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IFJlY2VpdmVkIGRyb3BwZWQgUGxvYW1zLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCBSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBSZWNlaXZlZCBQbG9hbXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCBSZWNlaXZlZCBub24gaWRsZSBQbG9hbXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgLyoqPCBSZWNlaXZlZCBlcnJvciBQbG9hbXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgLyoqPCBSZWNlaXZlZCBDUFUgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgLyoqPCBUcmFuc21pdHRlZCBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgIC8qKjwgVHJhbnNtaXR0ZWQgWEdFTSBmcmFnbWVudHMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBUcmFuc21pdHRlZCBDUFUgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAvKio8IFRyYW5zbWl0dGVkIE9NQ0kgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAvKio8IFRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGguICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgLyoqPCBUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgIC8qKjwgVHJhbnNtaXQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBUUElEIG1pc3MuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgLyoqPCBUcmFuc21pdCBwYWNrZXRzIGRyb3BlZCBkdWUgdG8gVklEIG1pc3MuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlc3VsdC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9QUkVWSU9VU19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFByZXZpb3VzIHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgbmV3IHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCB0b2Rfc3RyaW5nLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU0ZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgc2ZjLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcnRjX29mZnNldF9zZWMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX05TRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBydGNfb2Zmc2V0X25zZWMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3RvZF9yZXF1ZXN0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9JRF9fTlVNX09GICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRnJlcXVlbmN5IGFkanVzdG1lbnQgZGlyZWN0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRnJlcXVlbmN5IGFkanVzdG1lbnQgc2l6ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2F1dG9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ER0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBSZWNlaXZlIER5aW5nLUdhc3Agb2YgT05VaS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERyaWZ0IG9mIFdpbmRvdyBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgSW52YWxpZCBEQlJ1IFJlcG9ydC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEtleSBFeGNoYW5nZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBLZXkgRXhjaGFuZ2UgQ3ljbGUgU2tpcHBlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IEtleSBFeGNoYW5nZSBLZXkgTWlzbWF0Y2guICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBLZXkgRXhjaGFuZ2UgS2V5IFJlcXVlc3QgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0xPT0NJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IExPT0NpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgT05VIEFjdGl2YXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgT05VIEFsYXJtLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgT05VIERlYWN0aXZhdGlvbiBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBPTlUgRGlzYWJsZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBPTlUgRW5hYmxlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IE9OVSBUdW5pbmcgaW4gY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgT05VIFR1bmluZyBvdXQgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgT3B0aWNhbCBSZWZsZWN0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgUG9zc2libGUgRHJpZnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBQb3dlciBjb25zdW1wdGlvbiByZXBvcnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9MRVZFTF9SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCBQb3dlciBsZXZlbCByZXBvcnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgLyoqPCBQb3dlciBNYW5hZ2VtZW50IFN0YXRlIENoYW5nZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAvKio8IHBsb2FtIHF1ZXVlIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAvKio8IFJhbmdpbmcgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkVHSVNUUkFUSU9OX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgUmVnaXN0cmF0aW9uIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgLyoqPCBTaWduYWwgRGVncmFkZWQgb2YgT05VaS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAvKio8IFNpZ25hbCBGYWlsIG9mIE9OVWkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAvKio8IFNVRmkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9USVdJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCBUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmcuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9UVU5JTkdfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgLyoqPCBUdW5pbmcgcmVzcG9uc2UuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgb251IHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9PTERfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgb251IG9sZCBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGFsYXJtIHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgcmVnaXN0cmF0aW9uIGVuY3J5cHRpb24ga2V5cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DVVJSRU5UX0VOQ1JZUFRJT05fS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IGN1cnJlbnQgZW5jcnlwdGlvbiBrZXkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgcmVnaXN0cmF0aW9uIGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgUmVnaXN0cmF0aW9uIElEIGF1dG8gbGVhcm5pbmcuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19CVVJTVF9QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCByYW5naW5nIGJ1cnN0IHByb2ZpbGUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBkYXRhIGJ1cnN0IHByb2ZpbGUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCByYW5naW5nIHRpbWUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBEaXNhYmxlZCBhZnRlciBEaXNjb3ZlcnkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREVBQ1RJVkFUSU9OX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBkZWFjdGl2YXRpb24gcmVhc29uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgYWxsIEdFTSBwb3J0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IGFsbCBhbGxvY3MuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBFeHRlbmRlZCBHdWFyZCBUaW1lLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgVVMgbGluZSByYXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NBTElCUkFUSU9OX1JFQ09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgQ2FsaWJyYXRpb24gcmVjb3JkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1RVTklOR19HUkFOVUxBUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgVHVuaW5nIGdyYW51bGFyaXR5LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NURVBfVFVOSU5HX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgU3RlcCB0dW5pbmcgdGltZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IFBvd2VyIGxldmVsbGluZyBjYXBhYmlsaXRpZXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBSZXF1ZXN0IHJlZ2lzdHJhdGlvbiBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgY29udHJvbC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEF0dGVudWF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9jcHVfcGFja2V0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBwb3J0IGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgY3JjIG9rLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcGFja2V0IHNpemUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBidWZmZXIuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2NwdV9wYWNrZXRzIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGFja2V0IHR5cGUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBjYWxjIGNyYy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IG51bWJlciBvZiBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU2luZ2xlIHBhY2tldCBzaXplLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgYnVmZmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfZGZpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9ERklfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0RGSV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9kZmlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfZGdpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX0RHSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0RHSV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9kZ2lfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfZG93aSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X2Rvd2lfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWxhcm0gc3RhdHVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9EUklGVF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRHJpZnQgdmFsdWUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX05FV19FUUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBOZXcgRVFELiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfR0VUX1BPV0VSX0NPTlNVTVBUSU9OX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2dldF9wb3dlcl9sZXZlbCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9HRVRfUE9XRVJfTEVWRUxfSURfX05VTV9PRiAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBbGxvYy1JRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5ldyBrZXkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGV4cGVjdGVkIGtleS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHJlY2VpdmVkIGtleS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfX05VTV9PRiAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgb251IGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9sb29jaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9MT09DSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb21jaV9wYWNrZXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBwb3J0IGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgY3JjIG9rLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcGFja2V0IHNpemUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBidWZmZXIuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IHJlZ2lzdHJhdGlvbiBpZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IHJlZ2lzdHJhdGlvbiBlbmNyeXB0aW9uIGtleXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X29udV9hbGFybSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBvbnUgYWxhcm0uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUxBUk1fSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHJlc3VsdC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGZhaWwgcmVhc29uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbiAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9JRF9fTlVNX09GICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfUkVTVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCByZXN1bHQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb251X3R1bmluZ19vdXQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHRhcmdldCBkcyBwb24gaWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfVVNfUE9OX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCB0YXJnZXQgdXMgcG9uIGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgdGltZSB0byBzd2l0Y2guICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9ST0xMQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCByb2xsYmFjay4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX19OVU1fT0YgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX09QVElDQUxfUkVGTEVDVElPTl9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3Bsb2FtX3BhY2tldCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9ERUZBVUxUX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGRlZmF1bHQga2V5LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcGxvYW0uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0IAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBbGFybSBTdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9FU1RJTUFURURfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBFc3RpbWF0ZWQgRHJpZnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcG93ZXIgY29uc3VtcHRpb24gcmVwb3J0LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBdHRlbnVhdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFBvd2VyIGxldmVsbGluZyBjYXBhYmlsaXR5LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE9sZCBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE5ldyBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFJlYXNvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcHFzaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3Bxc2lfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1BRU0lfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYWxhcm0gc3RhdHVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wcXNpX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEVRRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IG51bWJlciBvZiBwbG9hbXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBwb3dlciBsZXZlbC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFR0lTVFJBVElPTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVnaXN0cmF0aW9uIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcmVxdWVzdCByZWdpc3RyYXRpb24gc3RhdHVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcmVxdWVzdCByZWdpc3RyYXRpb24gZmFpbCByZWFzb24uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb24gZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9SRVFVRVNUX1JFR0lTVFJBVElPTl9JRF9TTUFfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTTUEgZmxhZy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9yc3NpX21lYXN1cmVtZW50IAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0lEX19OVU1fT0YgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9zZGkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9zZGlfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYWxhcm0gc3RhdHVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0JFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQkVSLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X3NkaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfRkFJTF9SRUFTT04gICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBzZWN1cmUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIGZhaWwgcmVhc29uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24gZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUFTVEVSX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG1hc3RlciBrZXkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBPTUNJIGRhdGEgYnVmZmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgbWljLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3NldF9vbnVfc3RhdGUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgT05VIHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc2ZpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEJFUi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zZmlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcG9zaXRpdmUgZHJpZnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBuZWdhdGl2ZSBkcmlmdC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGRlbGltaXRlciBtaXNzIGRldGVjdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfQklQMzJfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IGJpcDMyIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfV09SRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHJlY2VpdmVkIHdvcmRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX1NZTUJPTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgZmVjIGNvcnJlY3RlZCBzeW1ib2xzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgZmVjIGNvcnJlY3RlZCBjb2Rld29yZHMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBmZWMgdW5jb3JyZWN0YWJsZSBjb2Rld29yZHMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBmZWMgdG90YWwgY29kZXdvcmRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgZmVjIGNvcnJlY3RlZCBiaXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0tFWV9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgeGdlbSBrZXkgZXJyb3IuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCB4Z2VtIGxvc3MgLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgbWljIGVycm9yIHBsb2FtLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgbm9uIGlkbGUgcGxvYW0uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBSZWNlaXZlZCBPTUNJIHBhY2tldHMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgcnggYnl0ZXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCByeCBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgdHggYnl0ZXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCB0eCBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3N1ZmkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9zdWZpX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9TVUZJX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV90aXdpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9USVdJX0lEX0RSSUZUX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBEcmlmdCB2YWx1ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV90dW5pbmdfcmVzcG9uc2UgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBhY2suICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfUkVTVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCByZXN1bHQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fdHJ4X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBidXJzdCBwcm9maWxlLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgdHJhbnNjZWl2ZXIgY29uZmlnLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgdHJ4IHR5cGUuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBkZWJ1Zy4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHJzc2kgbm9ybWFsIGNvbmZpZy4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IHJzc2kgcmFuZ2luZyBjb25maWcuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBzZXJkZXMgY29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFX0RFTElNSVRFUl9NQVhfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IGJ1cnN0IHByb2ZpbGUgZGVsaW1pdGVyIG1heCBlcnJvcnMuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCByYW5naW5nIHNtIHBhdHRlcm5zIGF0IGluaXQuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCByYW5naW5nIHNtIHBhdHRlcm5zIEVEIGZhaWx1cmUuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCByZXNldCBvbiBkZWwgbWlzcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IGVkIHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0lOVkVSVF9FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgaW52ZXJ0IEVELiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgZW5kIG9mIGJ1cnN0IHJlc2V0LiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSWF9SU1RfUE9MQVJJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgVFJYIHJlc2V0IHBvbGFyaXR5LiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX3RyeF9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fdHJ4X2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhwb25fc2VyZGVzX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkCit7CisgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJ4IFZnYS4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1BGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJ4IFBGLiAqLworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfTEZQRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUnggTEZQRi4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJ4IERGRTEuICovCisgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSeCBERkUyLiAqLworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUnggREZFMy4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJ4IERGRTQuICovCisgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBSeCBERkU1LiAqLworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgVHggUHJlLiAqLworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgVHggTWFpbi4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IFR4IFBvc3QxLiAqLworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgVHggUG9zdDIuICovCisgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBUeCBQb3N0My4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX0FNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IFR4IEFtcC4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4cG9uX3NlcmRlc19rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZAoreworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gTkkuICovCisgICAgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBJbnN0YW5jZS4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWQ7CisKKy8qKiBBbGwgb2JqZWN0IHRhZ3MgZm9yIGFsbCBvYmplY3RzIGluIHRoZSBzeXN0ZW0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X29ial90YWcKK3sKKyAgICBCQ01PTFRfT0JKX1RBR19fQkVHSU4sCisgICAgQkNNT0xUX09CSl9UQUdfRVBPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfT0JKX1RBR19BRSwKKyAgICBCQ01PTFRfT0JKX1RBR19HUE9OLAorICAgIEJDTU9MVF9PQkpfVEFHX1hHUE9OLAorICAgIEJDTU9MVF9PQkpfVEFHX19OVU1fT0YgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X29ial90YWc7CisKKy8qIFRoZSBmb2xsb3dpbmcgY29uZmlnIG1vZGVzIGFyZSBlbmFibGVkIGZvciB0aGlzIGJ1aWxkICovCisjZGVmaW5lIEJDTU9MVF9DT05GSUdfTU9ERV9FUE9OIDEKKworLyogVGhlIGZvbGxvd2luZyBjb25maWcgbW9kZXMgYXJlIGVuYWJsZWQgZm9yIHRoaXMgYnVpbGQgKi8KKyNkZWZpbmUgQkNNT0xUX0NPTkZJR19NT0RFX0FFICAgMQorCisvKiBUaGUgZm9sbG93aW5nIGNvbmZpZyBtb2RlcyBhcmUgZW5hYmxlZCBmb3IgdGhpcyBidWlsZCAqLworI2RlZmluZSBCQ01PTFRfQ09ORklHX01PREVfR1BPTiAxCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uZmlnIG1vZGVzIGFyZSBlbmFibGVkIGZvciB0aGlzIGJ1aWxkICovCisjZGVmaW5lIEJDTU9MVF9DT05GSUdfTU9ERV9YR1BPTiAgICAxCisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIG9iamVjdHMgaW4gdGhlIHN5c3RlbS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfb2JqX2lkCit7CisgICAgQkNNT0xUX09CSl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX09CSl9JRF9BRV9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBRSBOSSAoQWN0aXZlIEV0aGVybmV0IE5ldHdvcmsgSW50ZXJmYWNlKSAqLworICAgIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9EUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtICovCisgICAgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtICovCisgICAgQkNNT0xUX09CSl9JRF9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBDaGFubmVsICovCisgICAgQkNNT0xUX09CSl9JRF9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBEZWJ1ZyAqLworICAgIEJDTU9MVF9PQkpfSURfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgRGV2aWNlICovCisgICAgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBFUE9OIERlbmllZCBMaW5rICovCisgICAgQkNNT0xUX09CSl9JRF9FUE9OX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBFUE9OIGxpbmsgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0VQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpICovCisgICAgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBFUE9OIE9OVSAxMEcgVVMgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IEVQT04gT05VIDFHIFVTICovCisgICAgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gKi8KKyAgICBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gKi8KKyAgICBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IEVQT04gcGF0aCAxRyBkb3duc3RyZWFtICovCisgICAgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gKi8KKyAgICBCQ01PTFRfT0JKX0lEX0VQT05fUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IEVQT04gUmVjb25jaWxpYXRpb24gUGF0aCAqLworICAgIEJDTU9MVF9PQkpfSURfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgR1BJTyAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgR1BPTiBBbGxvYyAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgR1BPTiBHRU0gUG9ydCAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9JV0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgR1BPTiBJV0YgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEdQT04gSVdGIERTIGVncmVzcyBmbG93ICovCisgICAgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBHUE9OIElXRiBEUyBpbmdyZXNzIGZsb3cgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAvKio8IEdQT04gSVdGIE1BQyB0YWJsZSAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgR1BPTiBJV0YgVVMgZmxvdyAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qKjwgR1BPTiBPTlUgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0dQT05fVFJYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IEdQT04gVFJYICovCisgICAgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgLyoqPCBsb2cgZW50cnkgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0xPR0dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAvKio8IGxvZ2dlciAqLworICAgIEJDTU9MVF9PQkpfSURfTk5JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5LCAgIC8qKjwgTk5JICovCisgICAgQkNNT0xUX09CSl9JRF9OTklfU0VSREVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgLyoqPCBubmlfc2VyZGVzICovCisgICAgQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCBTb2Z0d2FyZSBFcnJvciAqLworICAgIEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgIC8qKjwgVFJYIENhbGlicmF0aW9uICovCisgICAgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgLyoqPCBYR1BPTiBBbGxvYyAqLworICAgIEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0LCAgIC8qKjwgWEdQT04gR0VNIHBvcnQgKi8KKyAgICBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IFhHUE9OIElXRiAqLworICAgIEJDTU9MVF9PQkpfSURfWEdQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAvKio8IFhHUE9OIE9OVSAqLworICAgIEJDTU9MVF9PQkpfSURfWEdQT05fVFJYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4LCAgIC8qKjwgWEdQT04gVFJYICovCisgICAgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzksICAgLyoqPCB4cG9uX3NlcmRlcyAqLworICAgIEJDTU9MVF9PQkpfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X29ial9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcG9zc2libGUgZ3JvdXBzIHVuZGVyIGFsbCBvYmplY3RzIGluIHRoZSBzeXN0ZW0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dyb3VwX2lkCit7CisgICAgQkNNT0xUX0dST1VQX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfTklfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFFIE5JIChBY3RpdmUgRXRoZXJuZXQgTmV0d29yayBJbnRlcmZhY2UpIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX05JX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBBRSBOSSAoQWN0aXZlIEV0aGVybmV0IE5ldHdvcmsgSW50ZXJmYWNlKSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQUUgTkkgKEFjdGl2ZSBFdGhlcm5ldCBOZXR3b3JrIEludGVyZmFjZSkgLSBTZXQgQUUgTkkgRW5hYmxlIFN0YXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19GUkFNRVNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19GUkFNRVNfMjA0OF80MDk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfREFUQV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfQUJPUlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0ZSQU1FU182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0ZSQU1FU18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzcsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5LCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfREFUQV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MSwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX1VOSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyLCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfQUJPUlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDMsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GQ1NfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NCwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX09WRVJTSVpFX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1LCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfUlVOVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDYsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NywgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OCwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ5LCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9DSEFOTkVMX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwLCAgIC8qKjwgQ2hhbm5lbCAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9DSEFOTkVMX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxLCAgIC8qKjwgQ2hhbm5lbCAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERUJVR19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyLCAgIC8qKjwgRGVidWcgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVCVUdfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MywgICAvKio8IERlYnVnIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFQlVHX0NMSV9PVVRQVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQsICAgLyoqPCBEZWJ1ZyAtIGNsaV9vdXRwdXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVCVUdfRklMRV9BTE1PU1RfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NSwgICAvKio8IERlYnVnIC0gZmlsZV9hbG1vc3RfZnVsbCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERUJVR19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2LCAgIC8qKjwgRGVidWcgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVCVUdfQ0xJX0lOUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NywgICAvKio8IERlYnVnIC0gQ0xJX2lucHV0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFQlVHX1JFU0VUX0FQSV9DQVBUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgsICAgLyoqPCBEZWJ1ZyAtIFJlc2V0IEFQSSBDYXB0dXJlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFQlVHX1NUQVJUX0FQSV9DQVBUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTksICAgLyoqPCBEZWJ1ZyAtIFN0YXJ0IEFQSSBDYXB0dXJlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFQlVHX1NUT1BfQVBJX0NBUFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjAsICAgLyoqPCBEZWJ1ZyAtIFN0b3AgQVBJIENhcHR1cmUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MSwgICAvKio8IERldmljZSAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyLCAgIC8qKjwgRGV2aWNlIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjMsICAgLyoqPCBEZXZpY2UgLSBDb25uZWN0aW9uIENvbXBsZXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9DT05ORUNUSU9OX0VTVEFCTElTSEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQsICAgLyoqPCBEZXZpY2UgLSBDb25uZWN0aW9uIEVzdGFibGlzaGVkIChJbnRlcm5hbCkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NSwgICAvKio8IERldmljZSAtIENvbm5lY3Rpb24gRmFpbHVyZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfRERSX1RFU1RfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY2LCAgIC8qKjwgRGV2aWNlIC0gRERSIFRlc3QgQ29tcGxldGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NywgICAvKio8IERldmljZSAtIERldmljZSBLZWVwIEFsaXZlIChJbnRlcm5hbCkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0RFVklDRV9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OCwgICAvKio8IERldmljZSAtIERldmljZSBSZWFkeSAoSW50ZXJuYWwpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9ESVNDT05ORUNUSU9OX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjksICAgLyoqPCBEZXZpY2UgLSBEaXNjb25uZWN0aW9uIENvbXBsZXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAsICAgLyoqPCBEZXZpY2UgLSBJbWFnZSBUcmFuc2ZlciBDb21wbGV0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcxLCAgIC8qKjwgRGV2aWNlIC0gSW5kaWNhdGlvbnMgRHJvcHBlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfU1dfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyLCAgIC8qKjwgRGV2aWNlIC0gc3cgZXJyb3IgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX1NXX0VYQ0VQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MywgICAvKio8IERldmljZSAtIHN3IGV4Y2VwdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0LCAgIC8qKjwgRGV2aWNlIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9DT05ORUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzUsICAgLyoqPCBEZXZpY2UgLSBDb25uZWN0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9ESVNDT05ORUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzYsICAgLyoqPCBEZXZpY2UgLSBEZXZpY2UgRGlzY29ubmVjdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3LCAgIC8qKjwgRGV2aWNlIC0gSG9zdCBLZWVwIEFsaXZlIChJbnRlcm5hbCkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OCwgICAvKio8IERldmljZSAtIEltYWdlIERhdGEgVHJhbnNmZXIgT3BlcmF0aW9uIChJbnRlcm5hbCkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OSwgICAvKio8IERldmljZSAtIFN0YXJ0IEltYWdlIFRyYW5zZmVyIE9wZXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwLCAgIC8qKjwgRGV2aWNlIC0gRGV2aWNlIFJlc2V0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9SVU5fRERSX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODEsICAgLyoqPCBEZXZpY2UgLSBSdW4gRERSIFRlc3QgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX1NXX1VQR1JBREVfQUNUSVZBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MiwgICAvKio8IERldmljZSAtIFNXIHVwZ3JhZGUgYWN0aXZhdGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MywgICAvKio8IEVQT04gRGVuaWVkIExpbmsgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NCwgICAvKio8IEVQT04gRGVuaWVkIExpbmsgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NSwgICAvKio8IEVQT04gRGVuaWVkIExpbmsgLSBMYXNlciBPbi9PZmYgVmlvbGF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODYsICAgLyoqPCBFUE9OIERlbmllZCBMaW5rIC0gTExJRCBQb29sIEVtcHR5IFZpb2xhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg3LCAgIC8qKjwgRVBPTiBEZW5pZWQgTGluayAtIE1heCBMaW5rIFZpb2xhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg4LCAgIC8qKjwgRVBPTiBEZW5pZWQgTGluayAtIE92ZXJoZWFkIFByb2ZpbGUgVmlvbGF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfUkFOR0VfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODksICAgLyoqPCBFUE9OIERlbmllZCBMaW5rIC0gUmFuZ2UgVmlvbGF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTAsICAgLyoqPCBFUE9OIERlbmllZCBMaW5rIC0gUm9ndWUgT05VIERldGVjdGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTEsICAgLyoqPCBFUE9OIERlbmllZCBMaW5rIC0gU3lzdGVtIFJlc291cmNlIFZpb2xhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX1RETV9DSEFOTkVMU19FWEhBVVNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkyLCAgIC8qKjwgRVBPTiBEZW5pZWQgTGluayAtIFRETSBDaGFubmVscyBFeGhhdXN0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19VTktOT1dOX0xJTktfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MywgICAvKio8IEVQT04gRGVuaWVkIExpbmsgLSBVbmtub3duIExpbmsgVmlvbGF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTQsICAgLyoqPCBFUE9OIERlbmllZCBMaW5rIC0gVXBzdHJlYW0gQmFuZHdpZHRoIFZpb2xhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk1LCAgIC8qKjwgRVBPTiBEZW5pZWQgTGluayAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk2LCAgIC8qKjwgRVBPTiBsaW5rIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTcsICAgLyoqPCBFUE9OIGxpbmsgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OCwgICAvKio8IEVQT04gbGluayAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0RBVEFfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OSwgICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAwLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMSwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDIsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAzLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDUsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA2LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNywgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDgsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA5LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX09BTV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTEsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEyLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMywgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTQsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE1LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNiwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX1JFUE9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTcsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GQ1NfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE4LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfT1ZFUlNJWkVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExOSwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX1JVTlRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjAsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9MSU5FX0NPREVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIxLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfTElORV9DT0RFX0VSUk9SX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyMiwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0RBVEFfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjMsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI0LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyNSwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjYsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI3LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMwLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzIsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMzLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX09BTV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzUsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM2LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNywgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzgsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM5LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0dBVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDEsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQyLCAgLyoqPCBFUE9OIGxpbmsgLSBEdXBsaWNhdGUgTVBDUCBSZWdpc3RyYXRpb24gUmVxdWVzdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfRU5DUllQVElPTl9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MywgIC8qKjwgRVBPTiBsaW5rIC0gRW5jcnlwdGlvbiBFbmFibGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19LRVlfRVhDSEFOR0VfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ0LCAgLyoqPCBFUE9OIGxpbmsgLSBLZXkgRXhjaGFuZ2UgRmFpbHVyZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUQVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NSwgIC8qKjwgRVBPTiBsaW5rIC0ga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDYsICAvKio8IEVQT04gbGluayAtIGtleV9leGNoYW5nZV9zdG9wcGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19MSU5LX0RFTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ3LCAgLyoqPCBFUE9OIGxpbmsgLSBMaW5rIERlbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDgsICAvKio8IEVQT04gbGluayAtIExpbmsgYXR0ZW1wdGVkIHRvIHJlZ2lzdGVyIGF0IGEgZGlmZmVyZW50IHNwZWVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19NUENQX0RFUkVHSVNURVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ5LCAgLyoqPCBFUE9OIGxpbmsgLSBNUENQIERlcmVnaXN0ZXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MCwgIC8qKjwgRVBPTiBsaW5rIC0gTVBDUCBEaXNjb3ZlcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19NUENQX1JFR19BQ0tfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUxLCAgLyoqPCBFUE9OIGxpbmsgLSBNUENQIFJlZyBBY2sgVGltZW91dCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MiwgIC8qKjwgRVBPTiBsaW5rIC0gTVBDUCBSZXBvcnQgVGltZW91dCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MywgIC8qKjwgRVBPTiBsaW5rIC0gT0FNIEtlZXBhbGl2ZSBUaW1lb3V0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU0LCAgLyoqPCBFUE9OIGxpbmsgLSBPQU0ga2VlcGFsaXZlIHRpbWVyIHN0YXJ0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTUsICAvKio8IEVQT04gbGluayAtIE9BTSBrZWVwYWxpdmUgdGltZXIgc3RvcHBlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NiwgIC8qKjwgRVBPTiBsaW5rIC0gUHJlcHJvdmlzaW9uZWQgTGluayBDcmVhdGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU3LCAgLyoqPCBFUE9OIGxpbmsgLSBQcm90ZWN0aW9uIFN3aXRjaCBPY2N1cnJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1OCwgIC8qKjwgRVBPTiBsaW5rIC0gUmFuZ2UgVmFsdWUgQ2hhbmdlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfUkVSQU5HRV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1OSwgIC8qKjwgRVBPTiBsaW5rIC0gUmUtcmFuZ2UgZmFpbHVyZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYxLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MiwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGljIHJlZ2lzdHJhdGlvbiBkb25lICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYzLCAgLyoqPCBFUE9OIGxpbmsgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0RFTEVURV9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjQsICAvKio8IEVQT04gbGluayAtIERlbGV0ZSBMaW5rICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19GT1JDRV9SRURJU0NPVkVSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY1LCAgLyoqPCBFUE9OIGxpbmsgLSBGb3JjZSBMaW5rIFJlZGlzY292ZXJ5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY2LCAgLyoqPCBFUE9OIGxpbmsgLSBLZXkgZXhjaGFuZ2Ugc3RhcnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjcsICAvKio8IEVQT04gbGluayAtIEtleSBleGNoYW5nZSBzdG9wICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY4LCAgLyoqPCBFUE9OIGxpbmsgLSBPQU0gS2VlcGFsaXZlIFRpbWVyIFN0YXJ0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY5LCAgLyoqPCBFUE9OIGxpbmsgLSBPQU0gS2VlcGFsaXZlIFRpbWVyIFN0b3AgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzAsICAvKio8IEVQT04gbGluayAtIHN0YXRpY19yZWdpc3RyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzEsICAvKio8IEVQT04gbGluayAtIEluamVjdCBGcmFtZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3MiwgIC8qKjwgRVBPTiBsaW5rIC0gRnJhbWUgQ2FwdHVyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzMsICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc0LCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NSwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSAxMEcgRXBvbiBBdXRvbm9tb3VzIFJvZ3VlIFNjYW4gZmFpbHVyZSBkZXRlY3RlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NiwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSAxRyBFcG9uIEF1dG9ub21vdXMgUm9ndWUgU2NhbiBmYWlsdXJlIGRldGVjdGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfTExJRF9RVUFSQU5USU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc3LCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIExMSUQgUXVhcmFudGluZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9NUENQX1RJTUVTVEFNUF9DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzgsICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIC0gTVBDUCBUaW1lc3RhbXAgQ2hhbmdlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX05PX1JFUE9SVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OSwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBObyBSZXBvcnRzICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgwLCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIE9OVSBVcGdyYWRlIENvbXBsZXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfUkVSQU5HRV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgxLCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIFJlLXJhbmdlIGZhaWx1cmUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODIsICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIC0gUm9ndWUgU2NhbiBpcyBDb21wbGV0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4MywgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NCwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBTdGF0ZSBDaGFuZ2UgQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTg1LCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX0FERF9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NiwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBBZGQgbGluayAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NywgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBBZGQgTXV0bHRpY2FzdGxpbmsgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODgsICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIC0gQWRkIFByb3RlY3RlZCBTdGFuZGJ5IExpbmsgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODksICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIC0gSXNzdWUgYW4gUnggUG93ZXIgTWVhc3VyZW1lbnQgUmVxdWVzdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEEgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MCwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBQcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBseSByZS1yYW5nZSBkZWx0YSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MSwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBSdW4gUm9ndWUgTExJRCBTY2FuICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfU0VUX0VQT05fTklfRU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTkyLCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIFNldCBFUE9OIE5JIEVuYWJsZSBTdGF0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MywgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBTdGFydCBPTlUgRmlybXdhcmUgVXBncmFkZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5NCwgIC8qKjwgRVBPTiBPTlUgMTBHIFVTIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk1LCAgLyoqPCBFUE9OIE9OVSAxMEcgVVMgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTYsICAvKio8IEVQT04gT05VIDEwRyBVUyAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0ZFQ19DT0RFX1dPUkRTX1RPVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTcsICAvKio8IEVQT04gT05VIDEwRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFMgICAgICAgICAgICAgICAgICAgID0gMTk4LCAgLyoqPCBFUE9OIE9OVSAxMEcgVVMgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfRkVDX1pFUk9FU19DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5OSwgIC8qKjwgRVBPTiBPTlUgMTBHIFVTIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0ZFQ19PTkVTX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDAsICAvKio8IEVQT04gT05VIDEwRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAxLCAgLyoqPCBFUE9OIE9OVSAxMEcgVVMgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDIsICAvKio8IEVQT04gT05VIDEwRyBVUyAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAzLCAgLyoqPCBFUE9OIE9OVSAxMEcgVVMgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDQsICAvKio8IEVQT04gT05VIDFHIFVTIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNiwgIC8qKjwgRVBPTiBPTlUgMUcgVVMgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0dPT0RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA3LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0dPT0RfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA4LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX09WRVJTWl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA5LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX05PTl9GRUNfR09PRF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEwLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX05PTl9GRUNfR09PRF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjExLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19HT09EX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEyLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19HT09EX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEzLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19GUkFNRVNfRVhDX0VSUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE0LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19CTEtTX05PX0VSUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE1LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19CTEtTX0NPUlJfRVJSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE2LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19CTEtTX1VOQ09SUl9FUlJTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE3LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19DT1JSX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE4LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19DT1JSX1pFUk9FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE5LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19DT1JSX09ORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIwLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX1VOREVSU1pfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIxLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0VSUk9SU1pfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIyLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIzLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXQgQWxhcm0gQ2xlYXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyNCwgIC8qKjwgRVBPTiBPTlUgMUcgVVMgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyNSwgIC8qKjwgRVBPTiBPTlUgMUcgVVMgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjYsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyNywgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI4LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI5LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMCwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzEsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMyLCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMywgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzQsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM1LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzNiwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzcsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM4LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FU180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzOSwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDAsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQxLCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0RBVEFfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0MiwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDMsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQ0LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX09BTV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0NSwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDYsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfR0FURV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQ3LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX01QQ1BfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0OCwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19BQk9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDksICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUwLCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTEsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUyLCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTMsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTQsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTUsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU2LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTcsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FU182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1OCwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU5LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjAsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FU18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MSwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYyLCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjMsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FU18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NCwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY1LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjYsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FU185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NywgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY4LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19EQVRBX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjksICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3MCwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcxLCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19NUENQX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzIsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX09BTV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3MywgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjc0LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19SRVBPUlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzUsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0FCT1JUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3NiwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRkNTX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjc3LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19DUkNfOF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzgsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX09VVF9PRl9TTE9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3OSwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfT1ZFUlNJWkVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgwLCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19SVU5UX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODEsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4MiwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXQgQWxhcm0gQ2xlYXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4MywgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjg0LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjg1LCAgLyoqPCBFUE9OIHBhdGggMUcgZG93bnN0cmVhbSAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4NiwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODcsICAvKio8IEVQT04gcGF0aCAxRyBkb3duc3RyZWFtIC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4OCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4OSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MiwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MywgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5NCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5NSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5NiwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5NywgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5OCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5OSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwMCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfREFUQV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwMSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwMiwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwMywgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfT0FNX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwNCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwNSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfR0FURV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwNiwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwNywgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfQUJPUlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwOCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwOSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTAsICAvKio8IEVQT04gcGF0aCAxRyBkb3duc3RyZWFtIC0gU3RhdCBBbGFybSBSYWlzZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTEsICAvKio8IEVQT04gcGF0aCAxRyBkb3duc3RyZWFtIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEyLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTMsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxNCwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxNSwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTYsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE3LCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxOCwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FU18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTksICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIwLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMSwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FU18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjIsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIzLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNCwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FU180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjUsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI2LCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNywgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0RBVEFfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjgsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI5LCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzMCwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX01QQ1BfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMzEsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19PQU1fQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMyLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzMywgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX1JFUE9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMzQsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19BQk9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzM1LCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRkNTX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzNiwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0NSQ184X0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMzcsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19PVVRfT0ZfU0xPVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzM4LCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfT1ZFUlNJWkVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzOSwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX1JVTlRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNDAsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQxLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNDIsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQzLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9SUF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNDQsICAvKio8IEVQT04gUmVjb25jaWxpYXRpb24gUGF0aCAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1JQX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0NSwgIC8qKjwgRVBPTiBSZWNvbmNpbGlhdGlvbiBQYXRoIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQSU9fS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQ2LCAgLyoqPCBHUElPIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQSU9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQ3LCAgLyoqPCBHUElPIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQ4LCAgLyoqPCBHUE9OIEFsbG9jIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQ5LCAgLyoqPCBHUE9OIEFsbG9jIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUwLCAgLyoqPCBHUE9OIEFsbG9jIC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX1NUQVRfQ0ZHX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1MSwgIC8qKjwgR1BPTiBBbGxvYyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUyLCAgLyoqPCBHUE9OIEFsbG9jIC0gQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNTMsICAvKio8IEdQT04gQWxsb2MgLSBHZXQgYWxsb2MgSUQgc3RhdGlzdGljcyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNTQsICAvKio8IEdQT04gQWxsb2MgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNTUsICAvKio8IEdQT04gQWxsb2MgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1NiwgIC8qKjwgR1BPTiBBbGxvYyAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX0dFVF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1NywgIC8qKjwgR1BPTiBBbGxvYyAtIEdldCBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfU0VUX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzU4LCAgLyoqPCBHUE9OIEFsbG9jIC0gU2V0IHN0YXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzU5LCAgLyoqPCBHUE9OIEdFTSBQb3J0IC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYwLCAgLyoqPCBHUE9OIEdFTSBQb3J0IC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYxLCAgLyoqPCBHUE9OIEdFTSBQb3J0IC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX1JYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2MiwgIC8qKjwgR1BPTiBHRU0gUG9ydCAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfUlhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYzLCAgLyoqPCBHUE9OIEdFTSBQb3J0IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19UWF9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjQsICAvKio8IEdQT04gR0VNIFBvcnQgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX1RYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2NSwgIC8qKjwgR1BPTiBHRU0gUG9ydCAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzY2LCAgLyoqPCBHUE9OIEdFTSBQb3J0IC0gQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjcsICAvKio8IEdQT04gR0VNIFBvcnQgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjgsICAvKio8IEdQT04gR0VNIFBvcnQgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2OSwgIC8qKjwgR1BPTiBHRU0gUG9ydCAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3MCwgIC8qKjwgR1BPTiBHRU0gUG9ydCAtIFNldCBzdGF0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3MSwgIC8qKjwgR1BPTiBJV0YgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzIsICAvKio8IEdQT04gSVdGIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzczLCAgLyoqPCBHUE9OIElXRiAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfSElUX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzQsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfTUlTU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzUsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzYsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzcsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzgsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfTkVXX01BQ19ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzksICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfTU9WRV9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODAsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODEsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODIsICAvKio8IEdQT04gSVdGIC0gRmx1c2ggTUFDIFRhYmxlIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4MywgIC8qKjwgR1BPTiBJV0YgLSBTY2FuIE1BQyBUYWJsZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODQsICAvKio8IEdQT04gSVdGIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzg1LCAgLyoqPCBHUE9OIElXRiAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzg2LCAgLyoqPCBHUE9OIElXRiAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4NywgIC8qKjwgR1BPTiBJV0YgLSBGbHVzaCBNQUMgVGFibGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODgsICAvKio8IEdQT04gSVdGIC0gU2NhbiBNQUMgVGFibGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODksICAvKio8IEdQT04gSVdGIERTIGVncmVzcyBmbG93IC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzkwLCAgLyoqPCBHUE9OIElXRiBEUyBlZ3Jlc3MgZmxvdyAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5MSwgIC8qKjwgR1BPTiBJV0YgRFMgaW5ncmVzcyBmbG93IC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzkyLCAgLyoqPCBHUE9OIElXRiBEUyBpbmdyZXNzIGZsb3cgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOTMsICAvKio8IEdQT04gSVdGIE1BQyB0YWJsZSAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5NCwgIC8qKjwgR1BPTiBJV0YgTUFDIHRhYmxlIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfQUdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzk1LCAgLyoqPCBHUE9OIElXRiBNQUMgdGFibGUgLSBNQUMgQWdlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5NiwgIC8qKjwgR1BPTiBJV0YgTUFDIHRhYmxlIC0gTUFDIERyb3BwZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOTcsICAvKio8IEdQT04gSVdGIE1BQyB0YWJsZSAtIE1BQyBNb3ZlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX01BQ19UQUJMRV9ORVdfTUFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzk4LCAgLyoqPCBHUE9OIElXRiBNQUMgdGFibGUgLSBOZXcgTUFDICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzk5LCAgLyoqPCBHUE9OIElXRiBNQUMgdGFibGUgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfVVNfRkxPV19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDAsICAvKio8IEdQT04gSVdGIFVTIGZsb3cgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfVVNfRkxPV19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDEsICAvKio8IEdQT04gSVdGIFVTIGZsb3cgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDIsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDMsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDQsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfRkVDX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDA1LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDYsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX0JJUDhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQwNywgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfQklQOF9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDA4LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9HRU1fUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDksICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0dFTV9EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxMCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfR0VNX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDExLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9HRU1fQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTIsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0dFTV9JTExFR0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxMywgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfQUxMT0NBVElPTlNfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDE0LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9BTExPQ0FUSU9OU19JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTUsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxNiwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfUExPQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDE3LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9QTE9BTVNfTk9OX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTgsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxOSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfUExPQU1TX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDIwLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9DUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MjEsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyMiwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDIzLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9EUk9QUEVEX1RPT19TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MjQsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0RST1BQRURfVE9PX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyNSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfQ1JDX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDI2LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9LRVlfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MjcsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0ZSQUdNRU5UU19FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyOCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfUEFDS0VUU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDI5LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19UWF9HRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MzAsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX1BMT0FNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzMSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfR0VNX0ZSQUdNRU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDMyLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19UWF9DUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MzMsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzNCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDM1LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MzYsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfVFBJRF9NSVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzNywgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfRFJPUFBFRF9WSURfTUlTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDM4LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MzksICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NDAsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBDUFUgUGFja2V0cyBGYWlsdXJlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDQxLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gZGVhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NDIsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBkaXNhYmxlIGFsbCBvbnVzIGNvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ0MywgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGVuYWJsZSBhbGwgb251cyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9MT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NDQsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBMT1MgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9PTlVfRElTQ09WRVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NDUsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBPTlUgRGlzY292ZXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ0NiwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIE9OVSBVcGdyYWRlIENvbXBsZXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ3LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gUHJvdGVjdGlvbiBTd2l0Y2hpbmcgT05VcyBSYW5nZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgPSA0NDgsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBQcm90ZWN0aW9uIFN3aXRjaGluZyBTd2l0Y2hvdmVyIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ0OSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDUwLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gUm9ndWUgZGV0ZWN0aW9uIGNvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1MSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFJvZ3VlIE9OVSBzcGVjaWFsIG1hcCBjeWNsZSBzdGFydCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1MiwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFNlcmlhbCBOdW1iZXIgQWNxdWlzaXRpb24gQ3ljbGUgU3RhcnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NTMsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGFuZGJ5IFBPTiBNb25pdG9yaW5nIEN5Y2xlIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1NCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXQgQWxhcm0gQ2xlYXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1NSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDU2LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGUgQ2hhbmdlIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1NywgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFRPRCByZXF1ZXN0IGNvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1OCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1OSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIERpc2FibGUgU2VyaWFsIE51bWJlciAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFICAgICAgICAgICAgICA9IDQ2MCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIHByb3RlY3Rpb24gc3dpdGNoaW5nIHR5cGUgYyBzZXQgbXVsdGlwbGUgb251IHN0YXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDYxLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gUmVzZXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjIsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBSb2d1ZSBEZXRlY3Rpb24gV2luZG93ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU0VUX09OVV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDYzLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU2V0IE9OVSBTdGF0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NFVF9QT05fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2NCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFNldCBQT04gU3RhdGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjUsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTaW5nbGUgcmVxdWVzdCBmb3Igc3RhbmRieSBQT04gbW9uaXRvcmluZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2NiwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXJ0IE9OVSBGaXJtd2FyZSBVcGdyYWRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfVE9EX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDY3LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gVE9EIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjgsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBCcm9hZGNhc3QgUExPQU0gUGFja2V0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfQ1BVX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDY5LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gR1BPTiBDUFUgUGFja2V0cyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3MCwgIC8qKjwgR1BPTiBPTlUgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzEsICAvKio8IEdQT04gT05VIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDcyLCAgLyoqPCBHUE9OIE9OVSAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzMsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0JZVEVTX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzQsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPREVXT1JEU19DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzUsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzYsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfQklQOF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzcsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfQklQOF9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzgsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfUExPQU1TX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzksICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfUExPQU1TX05PTl9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODAsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUE9TSVRJVkVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODEsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfTkVHQVRJVkVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODIsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfT01DSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODMsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODQsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfQkVSX1JFUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODUsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfVU5SRUNFSVZFRF9CVVJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODYsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfTENER19FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODcsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUkRJX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODgsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODksICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OTAsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfVFhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OTEsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfVFhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OTIsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OTMsICAvKio8IEdQT04gT05VIC0gQkVSIEludGVydmFsIENvbmZpZ3VyYXRpb24gQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDk0LCAgLyoqPCBHUE9OIE9OVSAtIFJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RHSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDk1LCAgLyoqPCBHUE9OIE9OVSAtIFJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RPV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDk2LCAgLyoqPCBHUE9OIE9OVSAtIERyaWZ0IG9mIFdpbmRvdyBvZiBPTlVpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDk3LCAgLyoqPCBHUE9OIE9OVSAtIEVSUiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ5OCwgIC8qKjwgR1BPTiBPTlUgLSBJbnZhbGlkIERCUnUgUmVwb3J0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDk5LCAgLyoqPCBHUE9OIE9OVSAtIEtleSBFeGNoYW5nZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDAsICAvKio8IEdQT04gT05VIC0gS2V5IEV4Y2hhbmdlIEN5Y2xlIFNraXBwZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDEsICAvKio8IEdQT04gT05VIC0gS2V5IEV4Y2hhbmdlIERlY3J5cHQgUmVxdWlyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDIsICAvKio8IEdQT04gT05VIC0gS2V5IEV4Y2hhbmdlIEtleSBNaXNtYXRjaCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwMywgIC8qKjwgR1BPTiBPTlUgLSBLZXkgRXhjaGFuZ2UgS2V5IFJlcXVlc3QgVGltZW91dCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwNCwgIC8qKjwgR1BPTiBPTlUgLSBLZXkgRXhjaGFuZ2UgVW5jb25zZWN1dGl2ZSBJbmRleCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9MT0FJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwNSwgIC8qKjwgR1BPTiBPTlUgLSBMT0FpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0xPS0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTA2LCAgLyoqPCBHUE9OIE9OVSAtIExPa2kgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfTUVNSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDcsICAvKio8IEdQT04gT05VIC0gTUVNaSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwOCwgIC8qKjwgR1BPTiBPTlUgLSBPTUNJIFBPUlQgSUQgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDksICAvKio8IEdQT04gT05VIC0gT05VIEFjdGl2YXRpb24gQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTEwLCAgLyoqPCBHUE9OIE9OVSAtIG9udSBhY3RpdmF0aW9uIHN0YW5kYnkgY29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09OVV9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTExLCAgLyoqPCBHUE9OIE9OVSAtIE9OVSBBbGFybSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxMiwgIC8qKjwgR1BPTiBPTlUgLSBPTlUgRGVhY3RpdmF0aW9uIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxMywgIC8qKjwgR1BPTiBPTlUgLSBPTlUgRGlzYWJsZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTQsICAvKio8IEdQT04gT05VIC0gT05VIEVuYWJsZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT1BUSUNBTF9SRUZMRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTUsICAvKio8IEdQT04gT05VIC0gT3B0aWNhbCBSZWZsZWN0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE2LCAgLyoqPCBHUE9OIE9OVSAtIFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9QRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxNywgIC8qKjwgR1BPTiBPTlUgLSBQRUUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTgsICAvKio8IEdQT04gT05VIC0gUG9zc2libGUgRHJpZnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTksICAvKio8IEdQT04gT05VIC0gUG93ZXIgTWFuYWdlbWVudCBTdGF0ZSBDaGFuZ2UgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfUFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjAsICAvKio8IEdQT04gT05VIC0gUFNUICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTIxLCAgLyoqPCBHUE9OIE9OVSAtIFJhbmdpbmcgQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1JFSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTIyLCAgLyoqPCBHUE9OIE9OVSAtIFJFSSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyMywgIC8qKjwgR1BPTiBPTlUgLSBSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNCwgIC8qKjwgR1BPTiBPTlUgLSBTaWduYWwgRGVncmFkZWQgb2YgT05VaSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNSwgIC8qKjwgR1BPTiBPTlUgLSBTaWduYWwgRmFpbCBvZiBPTlVpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTI2LCAgLyoqPCBHUE9OIE9OVSAtIFN0YXQgQWxhcm0gQ2xlYXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNywgIC8qKjwgR1BPTiBPTlUgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVUZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyOCwgIC8qKjwgR1BPTiBPTlUgLSBTVUZpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1RJV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTI5LCAgLyoqPCBHUE9OIE9OVSAtIFRyYW5zbWlzc2lvbiBJbnRlcmZlcmVuY2UgV2FybmluZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzMCwgIC8qKjwgR1BPTiBPTlUgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzEsICAvKio8IEdQT04gT05VIC0gQ2hhbmdlIFBvd2VyIExldmVsICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTMyLCAgLyoqPCBHUE9OIE9OVSAtIFJTU0kgTWVhc3VyZW1lbnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU0VUX09OVV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzMsICAvKio8IEdQT04gT05VIC0gU2V0IE9OVSBTdGF0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9DUFVfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzNCwgIC8qKjwgR1BPTiBPTlUgLSBHUE9OIENQVSBQYWNrZXRzICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1BMT0FNX1BBQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTM1LCAgLyoqPCBHUE9OIE9OVSAtIFBMT0FNIFBhY2tldCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9DUFVfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzNiwgIC8qKjwgR1BPTiBPTlUgLSBHUE9OIENQVSBwYWNrZXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT01DSV9QQUNLRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzcsICAvKio8IEdQT04gT05VIC0gR1BPTiBPTUNJIHBhY2tldCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX1RSWF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzOCwgIC8qKjwgR1BPTiBUUlggLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9UUlhfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzksICAvKio8IEdQT04gVFJYIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQwLCAgLyoqPCBsb2cgZW50cnkgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTE9HX0VOVFJZX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NDEsICAvKio8IGxvZyBlbnRyeSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9MT0dfRU5UUllfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0MiwgIC8qKjwgbG9nIGVudHJ5IC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9MT0dfRU5UUllfU1RBVF9DRkdfTVNHX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0MywgIC8qKjwgbG9nIGVudHJ5IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTE9HX0VOVFJZX1NUQVRfQ0ZHX0xPU1RfTVNHX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NDQsICAvKio8IGxvZyBlbnRyeSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ1LCAgLyoqPCBsb2cgZW50cnkgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTE9HX0VOVFJZX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NDYsICAvKio8IGxvZyBlbnRyeSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ3LCAgLyoqPCBsb2cgZW50cnkgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTE9HR0VSX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NDgsICAvKio8IGxvZ2dlciAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0OSwgIC8qKjwgbG9nZ2VyIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUwLCAgLyoqPCBsb2dnZXIgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9TVEFUX0NGR19MSU5FU19JTl9MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUxLCAgLyoqPCBsb2dnZXIgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1MiwgIC8qKjwgbG9nZ2VyIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUzLCAgLyoqPCBsb2dnZXIgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1NCwgIC8qKjwgbG9nZ2VyIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9DTEVBUl9MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTU1LCAgLyoqPCBsb2dnZXIgLSBjbGVhciBsb2cgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NTYsICAvKio8IE5OSSAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1NywgIC8qKjwgTk5JIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTU4LCAgLyoqPCBOTkkgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTU5LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2MCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjEsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTYyLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2MywgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjQsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTY1LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2NiwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjcsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTY4LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2OSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NzAsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9HT09EX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTcxLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU3MiwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NzMsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTc0LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRkNTX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU3NSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0NPTlRST0xfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NzYsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9QQVVTRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTc3LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfUEZDX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU3OCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX1VOU1VQUE9SVEVEX09QQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NzksICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9VTlNVUFBPUlRFRF9EQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgwLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfQUxJR05NRU5UX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU4MSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0xFTkdUSF9PVVRfT0ZfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ODIsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9DT0RFX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgzLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfT1ZFUlNJWkVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU4NCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0pBQkJFUl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ODUsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9NVFVfQ0hFQ0tfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTg2LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU4NywgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX1ZMQU5fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ODgsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9ET1VCTEVfVkxBTl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTg5LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfVFJVTkNBVEVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5MCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX1VOREVSU0laRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OTEsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFHTUVOVEVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTkyLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfUlVOVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5MywgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OTQsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTk1LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5NiwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OTcsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTk4LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5OSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MDAsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfMjA0OF80MDk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjAxLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYwMiwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MDMsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjA0LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYwNSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0dPT0RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MDYsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjA3LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYwOCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MDksICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9QQVVTRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjEwLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfUEZDX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYxMSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0pBQkJFUl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MTIsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GQ1NfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjEzLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfQ09OVFJPTF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYxNCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX09WRVJTSVpFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MTUsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFHTUVOVEVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjE2LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRVJST1JfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYxNywgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX1ZMQU5fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MTgsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9ET1VCTEVfVkxBTl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjE5LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfUlVOVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyMCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX1VOREVSUlVOX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MjEsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjIyLCAgLyoqPCBOTkkgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MjMsICAvKio8IE5OSSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUVVNfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjI0LCAgLyoqPCBOTkkgLSBTdGF0dXMgY2hhbmdlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyNSwgIC8qKjwgTk5JIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TRVJERVNfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjI2LCAgLyoqPCBubmlfc2VyZGVzIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TRVJERVNfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjI3LCAgLyoqPCBubmlfc2VyZGVzIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX1NPRlRXQVJFX0VSUk9SX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjI4LCAgLyoqPCBTb2Z0d2FyZSBFcnJvciAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9TT0ZUV0FSRV9FUlJPUl9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyOSwgIC8qKjwgU29mdHdhcmUgRXJyb3IgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfVFJYX0NBTElCUkFUSU9OX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MzAsICAvKio8IFRSWCBDYWxpYnJhdGlvbiAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQgICAgICAgICAgICAgICAgICA9IDYzMSwgIC8qKjwgVFJYIENhbGlicmF0aW9uIC0gQ2FwdHVyZSB3aW5kb3cgYW5kIHN0YXRpc3RpYyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MzIsICAvKio8IFRSWCBDYWxpYnJhdGlvbiAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYzMywgIC8qKjwgVFJYIENhbGlicmF0aW9uIC0gc3RhcnQgY2FwdHVyZSB3aW5kb3cgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MzQsICAvKio8IFRSWCBDYWxpYnJhdGlvbiAtIHN0b3AgY2FwdHVyZSB3aW5kb3cgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MzUsICAvKio8IFhHUE9OIEFsbG9jIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjM2LCAgLyoqPCBYR1BPTiBBbGxvYyAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYzNywgIC8qKjwgWEdQT04gQWxsb2MgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX1NUQVRfQ0ZHX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjM4LCAgLyoqPCBYR1BPTiBBbGxvYyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjM5LCAgLyoqPCBYR1BPTiBBbGxvYyAtIENvbmZpZ3VyYXRpb24gQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQwLCAgLyoqPCBYR1BPTiBBbGxvYyAtIEdldCBhbGxvYyBJRCBzdGF0aXN0aWNzIGNvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY0MSwgIC8qKjwgWEdQT04gQWxsb2MgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NDIsICAvKio8IFhHUE9OIEFsbG9jIC0gU3RhdCBBbGFybSBSYWlzZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NDMsICAvKio8IFhHUE9OIEFsbG9jIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX0dFVF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQ0LCAgLyoqPCBYR1BPTiBBbGxvYyAtIEdldCBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX1NFVF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQ1LCAgLyoqPCBYR1BPTiBBbGxvYyAtIFNldCBzdGF0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9HRU1fUE9SVF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY0NiwgIC8qKjwgWEdQT04gR0VNIHBvcnQgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NDcsICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQ4LCAgLyoqPCBYR1BPTiBHRU0gcG9ydCAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfVFhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NDksICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfVFhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NTAsICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfUlhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NTEsICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfUlhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NTIsICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NTMsICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU0LCAgLyoqPCBYR1BPTiBHRU0gcG9ydCAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU1LCAgLyoqPCBYR1BPTiBHRU0gcG9ydCAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9JV0ZfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY1NiwgIC8qKjwgWEdQT04gSVdGIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0lXRl9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU3LCAgLyoqPCBYR1BPTiBJV0YgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NTgsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY2MCwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX0ZFQ19DT0RFV09SRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYxLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX0JJUDMyX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX0JJUDMyX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYzLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHVENfSEVBREVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY0LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHVENfQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHVENfVU5DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY2LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHRU1fRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY4LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHRU1fSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHRU1fQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjcwLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjcxLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0ZSQUdNRU5UX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjcyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BBQ0tFVFNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjczLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0RST1BQRURfVE9PX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc0LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0RST1BQRURfVE9PX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0tFWV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc2LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX1BMT0FNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc4LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0FMTE9DQVRJT05TX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjgwLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjgxLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjgyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19OT05fSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjgzLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg0LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0NQVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg2LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg4LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX1hHRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0NQVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjkwLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjkxLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjkyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjkzLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfVFBJRF9NSVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjk0LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfVklEX01JU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjk1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjk2LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGFjdGl2YXRlIGFsbCBvbnVzIGNvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY5NywgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBDUFUgUGFja2V0cyBGYWlsdXJlICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjk4LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGRlYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjk5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGRpc2FibGUgYWxsIG9udXMgY29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAwLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGVuYWJsZSBhbGwgb251cyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MDEsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gTE9TICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIE9OVSBEaXNjb3ZlcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAzLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIE9OVSBVcGdyYWRlIENvbXBsZXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzA0LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFByb3RlY3Rpb24gU3dpdGNoaW5nIE9OVXMgUmFuZ2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgID0gNzA1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFByb3RlY3Rpb24gU3dpdGNoaW5nIFN3aXRjaG92ZXIgQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzA2LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzA3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MDgsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gUm9ndWUgT05VIHNwZWNpYWwgbWFwIGN5Y2xlIHN0YXJ0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzA5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFNlcmlhbCBOdW1iZXIgQWNxdWlzaXRpb24gQ3ljbGUgU3RhcnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MTAsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhbmRieSBQT04gTW9uaXRvcmluZyBDeWNsZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MTEsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzEyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzEzLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRlIENoYW5nZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MTQsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gVE9EIHJlcXVlc3QgY29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzE1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcxNiwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBBZGp1c3QgVHggV2F2ZWxlbmdoICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzE3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIERpc2FibGUgU2VyaWFsIE51bWJlciAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcxOCwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBSZXNldCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcxOSwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBSb2d1ZSBEZXRlY3Rpb24gV2luZG93ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzIwLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFJ1biBTcGVjaWFsIEJXIE1hcCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TRVRfT05VX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyMSwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTZXQgT05VIFN0YXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NFVF9QT05fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzIyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFNldCBQT04gU3RhdGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MjMsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU2luZ2xlIHJlcXVlc3Qgc3RhbmRieSBQT04gTW9uaXRvcmluZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyNCwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGFydCBPTlUgRmlybXdhcmUgVXBncmFkZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9UT0RfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyNSwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBUT0QgcmVxdWVzdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyNiwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBCcm9hZGNhc3QgUExPQU0gUGFja2V0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0NQVV9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzI3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFhHUE9OIENQVSBwYWNrZXRzICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzI4LCAgLyoqPCBYR1BPTiBPTlUgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MjksICAvKio8IFhHUE9OIE9OVSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczMCwgIC8qKjwgWEdQT04gT05VIC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUE9TSVRJVkVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczMSwgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX05FR0FUSVZFX0RSSUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MzIsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19ERUxJTUlURVJfTUlTU19ERVRFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzMzLCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfQklQMzJfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczNCwgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1JYX1dPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MzUsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19GRUNfQ09SUkVDVEVEX1NZTUJPTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzM2LCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPUlJFQ1RFRF9DT0RFV09SRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczNywgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MzgsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19GRUNfQ09ERVdPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzM5LCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPUlJFQ1RFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0MCwgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1hHRU1fS0VZX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NDEsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19YR0VNX0xPU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQyLCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUlhfUExPQU1TX01JQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0MywgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1JYX1BMT0FNU19OT05fSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NDQsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19SWF9PTUNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQ1LCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0NiwgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NDcsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19SWF9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQ4LCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfVFhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0OSwgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1RYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NTAsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9ERkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzUxLCAgLyoqPCBYR1BPTiBPTlUgLSBSZWNlaXZlIER5aW5nLUdhc3Agb2YgT05VaSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfREdJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc1MiwgIC8qKjwgWEdQT04gT05VIC0gUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0RPV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NTMsICAvKio8IFhHUE9OIE9OVSAtIERyaWZ0IG9mIFdpbmRvdyBvZiBPTlVpICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzU0LCAgLyoqPCBYR1BPTiBPTlUgLSBJbnZhbGlkIERCUnUgUmVwb3J0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzU1LCAgLyoqPCBYR1BPTiBPTlUgLSBLZXkgRXhjaGFuZ2UgQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzU2LCAgLyoqPCBYR1BPTiBPTlUgLSBLZXkgRXhjaGFuZ2UgQ3ljbGUgU2tpcHBlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc1NywgIC8qKjwgWEdQT04gT05VIC0gS2V5IEV4Y2hhbmdlIEtleSBNaXNtYXRjaCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc1OCwgIC8qKjwgWEdQT04gT05VIC0gS2V5IEV4Y2hhbmdlIEtleSBSZXF1ZXN0IFRpbWVvdXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0xPT0NJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NTksICAvKio8IFhHUE9OIE9OVSAtIExPT0NpICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzYwLCAgLyoqPCBYR1BPTiBPTlUgLSBPTlUgQWN0aXZhdGlvbiBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjEsICAvKio8IFhHUE9OIE9OVSAtIE9OVSBBbGFybSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2MiwgIC8qKjwgWEdQT04gT05VIC0gT05VIERlYWN0aXZhdGlvbiBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjMsICAvKio8IFhHUE9OIE9OVSAtIE9OVSBEaXNhYmxlIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2NCwgIC8qKjwgWEdQT04gT05VIC0gT05VIEVuYWJsZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjUsICAvKio8IFhHUE9OIE9OVSAtIE9OVSBUdW5pbmcgaW4gY29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzY2LCAgLyoqPCBYR1BPTiBPTlUgLSBPTlUgVHVuaW5nIG91dCBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09QVElDQUxfUkVGTEVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjcsICAvKio8IFhHUE9OIE9OVSAtIE9wdGljYWwgUmVmbGVjdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2OCwgIC8qKjwgWEdQT04gT05VIC0gUG9zc2libGUgRHJpZnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjksICAvKio8IFhHUE9OIE9OVSAtIFBvd2VyIGNvbnN1bXB0aW9uIHJlcG9ydCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3MCwgIC8qKjwgWEdQT04gT05VIC0gUG93ZXIgbGV2ZWwgcmVwb3J0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzcxLCAgLyoqPCBYR1BPTiBPTlUgLSBQb3dlciBNYW5hZ2VtZW50IFN0YXRlIENoYW5nZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUFFTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3MiwgIC8qKjwgWEdQT04gT05VIC0gcGxvYW0gcXVldWUgc3RhdHVzICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzczLCAgLyoqPCBYR1BPTiBPTlUgLSBSYW5naW5nIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3NCwgIC8qKjwgWEdQT04gT05VIC0gUmVnaXN0cmF0aW9uIElEICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzc1LCAgLyoqPCBYR1BPTiBPTlUgLSBSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU0RJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3NiwgIC8qKjwgWEdQT04gT05VIC0gU2lnbmFsIERlZ3JhZGVkIG9mIE9OVWkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NzcsICAvKio8IFhHUE9OIE9OVSAtIHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbHVyZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3OCwgIC8qKjwgWEdQT04gT05VIC0gU2lnbmFsIEZhaWwgb2YgT05VaSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3OSwgIC8qKjwgWEdQT04gT05VIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzgwLCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1VGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4MSwgIC8qKjwgWEdQT04gT05VIC0gU1VGaSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfVElXSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4MiwgIC8qKjwgWEdQT04gT05VIC0gVHJhbnNtaXNzaW9uIEludGVyZmVyZW5jZSBXYXJuaW5nICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzgzLCAgLyoqPCBYR1BPTiBPTlUgLSBUdW5pbmcgcmVzcG9uc2UgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODQsICAvKio8IFhHUE9OIE9OVSAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4NSwgIC8qKjwgWEdQT04gT05VIC0gQWRqdXN0IFR4IHdhdmVsZW5ndGggKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODYsICAvKio8IFhHUE9OIE9OVSAtIENoYW5nZSBwb3dlciBsZXZlbGxpbmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0dFVF9QT1dFUl9DT05TVU1QVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODcsICAvKio8IFhHUE9OIE9OVSAtIEdldCBwb3dlciBjb25zdW1wdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfR0VUX1BPV0VSX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4OCwgIC8qKjwgWEdQT04gT05VIC0gR2V0IHBvd2VyIGxldmVsICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzg5LCAgLyoqPCBYR1BPTiBPTlUgLSBPTlUgVHVuaW5nIGluICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzkwLCAgLyoqPCBYR1BPTiBPTlUgLSBPTlUgVHVuaW5nIG91dCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc5MSwgIC8qKjwgWEdQT04gT05VIC0gUmVxdWVzdCByZWdpc3RyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTIsICAvKio8IFhHUE9OIE9OVSAtIFJTU0kgTWVhc3VyZW1lbnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTMsICAvKio8IFhHUE9OIE9OVSAtIFNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NFVF9PTlVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTQsICAvKio8IFhHUE9OIE9OVSAtIFNldCBPTlUgU3RhdGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0NQVV9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTUsICAvKio8IFhHUE9OIE9OVSAtIFhHUE9OIENQVSBwYWNrZXRzICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9QTE9BTV9QQUNLRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzk2LCAgLyoqPCBYR1BPTiBPTlUgLSBQTE9BTSBQYWNrZXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0NQVV9QQUNLRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTcsICAvKio8IFhHUE9OIE9OVSAtIFhHUE9OIENQVSBwYWNrZXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09NQ0lfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTgsICAvKio8IFhHUE9OIE9OVSAtIFhHUE9OIE9NQ0kgcGFja2V0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX1RSWF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzk5LCAgLyoqPCBYR1BPTiBUUlggLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fVFJYX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MDAsICAvKio8IFhHUE9OIFRSWCAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YUE9OX1NFUkRFU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwMSwgIC8qKjwgeHBvbl9zZXJkZXMgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWFBPTl9TRVJERVNfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MDIsICAvKio8IHhwb25fc2VyZGVzIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3JvdXBfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBhZV9uaSBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9uaV9vcGVyX2lkCit7CisgICAgQkNNT0xUX0FFX05JX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9BRV9OSV9PUEVSX0lEX1NFVF9BRV9OSV9FTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU2V0IEFFIE5JIEVuYWJsZSBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfQUVfTklfT1BFUl9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX25pX29wZXJfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBhZV9wYXRoX2RzIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgYWVfcGF0aF91cyBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGRlYnVnIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RlYnVnX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfREVCVUdfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0RFQlVHX0FVVE9fSURfQ0xJX09VVFBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBjbGlfb3V0cHV0LiAqLworICAgIEJDTU9MVF9ERUJVR19BVVRPX0lEX0ZJTEVfQUxNT1NUX0ZVTEwsICAvKio8IGZpbGVfYWxtb3N0X2Z1bGwuICovCisgICAgQkNNT0xUX0RFQlVHX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBkZWJ1ZyBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19vcGVyX2lkCit7CisgICAgQkNNT0xUX0RFQlVHX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX0NMSV9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ0xJX2lucHV0LiAqLworICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX1JFU0VUX0FQSV9DQVBUVVJFLCAvKio8IFJlc2V0IEFQSSBDYXB0dXJlLiAqLworICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUQVJUX0FQSV9DQVBUVVJFLCAvKio8IFN0YXJ0IEFQSSBDYXB0dXJlLiAqLworICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkUsICAvKio8IFN0b3AgQVBJIENhcHR1cmUuICovCisgICAgQkNNT0xUX0RFQlVHX09QRVJfSURfX05VTV9PRiAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX29wZXJfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBkZXZpY2UgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29ubmVjdGlvbiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCwgICAvKio8IENvbm5lY3Rpb24gRXN0YWJsaXNoZWQgKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9GQUlMVVJFLCAgICAgICAvKio8IENvbm5lY3Rpb24gRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfRERSX1RFU1RfQ09NUExFVEUsICAgICAgICAvKio8IEREUiBUZXN0IENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfS0VFUF9BTElWRSwgICAgICAgIC8qKjwgRGV2aWNlIEtlZXAgQWxpdmUgKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX1JFQURZLCAgICAgICAgICAgICAvKio8IERldmljZSBSZWFkeSAoSW50ZXJuYWwpLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFLCAgIC8qKjwgRGlzY29ubmVjdGlvbiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsICAvKio8IEltYWdlIFRyYW5zZmVyIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9JTkRJQ0FUSU9OU19EUk9QUEVELCAgICAgIC8qKjwgSW5kaWNhdGlvbnMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVJST1IsICAgICAgICAgICAgICAgICAvKio8IHN3IGVycm9yLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9TV19FWENFUFRJT04sICAgICAgICAgICAgIC8qKjwgc3cgZXhjZXB0aW9uLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgZGV2aWNlIGdyb3VwcyBvZiB0eXBlIG9wZXIuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9vcGVyX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfQ09OTkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbm5lY3QuICovCisgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0RJU0NPTk5FQ1QsICAgICAgICAgICAvKio8IERldmljZSBEaXNjb25uZWN0LiAqLworICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkUsICAgICAgLyoqPCBIb3N0IEtlZXAgQWxpdmUgKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfREFUQSwgIC8qKjwgSW1hZ2UgRGF0YSBUcmFuc2ZlciBPcGVyYXRpb24gKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQsIC8qKjwgU3RhcnQgSW1hZ2UgVHJhbnNmZXIgT3BlcmF0aW9uLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SRVNFVCwgICAgICAgICAgICAgICAgLyoqPCBEZXZpY2UgUmVzZXQuICovCisgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JVTl9ERFJfVEVTVCwgICAgICAgICAvKio8IFJ1biBERFIgVGVzdC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfU1dfVVBHUkFERV9BQ1RJVkFURSwgIC8qKjwgU1cgdXBncmFkZSBhY3RpdmF0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfX05VTV9PRiAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9vcGVyX2lkOworCisvKiogTGlzdCBvZiBhbGwgZXBvbl9kZW5pZWRfbGluayBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IExhc2VyIE9uL09mZiBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OLCAgICAgIC8qKjwgTExJRCBQb29sIEVtcHR5IFZpb2xhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX01BWF9MSU5LX1ZJT0xBVElPTiwgICAgICAgICAgICAgLyoqPCBNYXggTGluayBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTiwgICAgIC8qKjwgT3ZlcmhlYWQgUHJvZmlsZSBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9SQU5HRV9WSU9MQVRJT04sICAgICAgICAgICAgICAgIC8qKjwgUmFuZ2UgVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfUk9HVUVfVklPTEFUSU9OLCAgICAgICAgICAgICAgICAvKio8IFJvZ3VlIE9OVSBEZXRlY3RlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT04sICAgICAgLyoqPCBTeXN0ZW0gUmVzb3VyY2UgVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVERNX0NIQU5ORUxTX0VYSEFVU1RFRCwgICAgICAgICAvKio8IFRETSBDaGFubmVscyBFeGhhdXN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OLCAgICAgICAgIC8qKjwgVW5rbm93biBMaW5rIFZpb2xhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT04sICAgLyoqPCBVcHN0cmVhbSBCYW5kd2lkdGggVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBlcG9uX2xpbmsgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRHVwbGljYXRlIE1QQ1AgUmVnaXN0cmF0aW9uIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0VOQ1JZUFRJT05fRU5BQkxFRCwgICAgICAgICAgICAvKio8IEVuY3J5cHRpb24gRW5hYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0ZBSUxVUkUsICAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIEZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVELCAgICAgICAgICAvKio8IGtleV9leGNoYW5nZV9zdGFydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRCwgICAgICAgICAgLyoqPCBrZXlfZXhjaGFuZ2Vfc3RvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTElOS19ERUxFVEVELCAgICAgICAgICAgICAgICAgIC8qKjwgTGluayBEZWxldGVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX1NQRUVEX01JU01BVENILCAgICAgICAgICAgLyoqPCBMaW5rIGF0dGVtcHRlZCB0byByZWdpc3RlciBhdCBhIGRpZmZlcmVudCBzcGVlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9ERVJFR0lTVEVSRUQsICAgICAgICAgICAgIC8qKjwgTVBDUCBEZXJlZ2lzdGVyZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfRElTQ09WRVJFRCwgICAgICAgICAgICAgICAvKio8IE1QQ1AgRGlzY292ZXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQsICAgICAgICAgIC8qKjwgTVBDUCBSZWcgQWNrIFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQsICAgICAgICAgICAvKio8IE1QQ1AgUmVwb3J0IFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX09BTV9LRUVQQUxJVkVfVElNRU9VVCwgICAgICAgICAvKio8IE9BTSBLZWVwYWxpdmUgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVELCAgIC8qKjwgT0FNIGtlZXBhbGl2ZSB0aW1lciBzdGFydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQsICAgLyoqPCBPQU0ga2VlcGFsaXZlIHRpbWVyIHN0b3BwZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRCwgICAvKio8IFByZXByb3Zpc2lvbmVkIExpbmsgQ3JlYXRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQsICAgIC8qKjwgUHJvdGVjdGlvbiBTd2l0Y2ggT2NjdXJyZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1JBTkdFX1ZBTFVFX0NIQU5HRUQsICAgICAgICAgICAvKio8IFJhbmdlIFZhbHVlIENoYW5nZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1JFUkFOR0VfRkFJTFVSRSwgICAgICAgICAgICAgICAvKio8IFJlLXJhbmdlIGZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgICAgICAgICAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgICAgICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORSwgICAgICAvKio8IFN0YXRpYyByZWdpc3RyYXRpb24gZG9uZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgZXBvbl9saW5rIGdyb3VwcyBvZiB0eXBlIG9wZXIuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19vcGVyX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfREVMRVRFX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IERlbGV0ZSBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9GT1JDRV9SRURJU0NPVkVSWSwgICAgICAgICAvKio8IEZvcmNlIExpbmsgUmVkaXNjb3ZlcnkuICovCisgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0tFWV9FWENIQU5HRV9TVEFSVCwgICAgICAgIC8qKjwgS2V5IGV4Y2hhbmdlIHN0YXJ0LiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RPUCwgICAgICAgICAvKio8IEtleSBleGNoYW5nZSBzdG9wLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJULCAvKio8IE9BTSBLZWVwYWxpdmUgVGltZXIgU3RhcnQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUCwgIC8qKjwgT0FNIEtlZXBhbGl2ZSBUaW1lciBTdG9wLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9TVEFUSUNfUkVHSVNUUkFUSU9OLCAgICAgICAvKio8IHN0YXRpY19yZWdpc3RyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19vcGVyX2lkOworCisvKiogTGlzdCBvZiBhbGwgZXBvbl9saW5rIGdyb3VwcyBvZiB0eXBlIHByb3h5LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfcHJveHlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX0lEX0lOSkVDVF9GUkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEluamVjdCBGcmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcHJveHlfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBlcG9uX2xpbmsgZ3JvdXBzIG9mIHR5cGUgcHJveHlfcnguIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19wcm94eV9yeF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfX0JFR0lOLAorICAgIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfRlJBTUVfQ0FQVFVSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRnJhbWUgQ2FwdHVyZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19QUk9YWV9SWF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19wcm94eV9yeF9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGVwb25fbmkgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9hdXRvX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCAxMEcgRXBvbiBBdXRvbm9tb3VzIFJvZ3VlIFNjYW4gZmFpbHVyZSBkZXRlY3RlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFLCAgLyoqPCAxRyBFcG9uIEF1dG9ub21vdXMgUm9ndWUgU2NhbiBmYWlsdXJlIGRldGVjdGVkLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTExJRF9RVUFSQU5USU5FRCwgICAgICAgICAgICAvKio8IExMSUQgUXVhcmFudGluZWQuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VELCAgICAgIC8qKjwgTVBDUCBUaW1lc3RhbXAgQ2hhbmdlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX05PX1JFUE9SVFMsICAgICAgICAgICAgICAgICAgLyoqPCBObyBSZXBvcnRzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEUsICAgICAgICAvKio8IE9OVSBVcGdyYWRlIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUkVSQU5HRV9GQUlMVVJFLCAgICAgICAgICAgICAvKio8IFJlLXJhbmdlIGZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFLCAgICAgICAgIC8qKjwgUm9ndWUgU2NhbiBpcyBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVELCAgLyoqPCBSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsICAgICAgLyoqPCBTdGF0ZSBDaGFuZ2UgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBlcG9uX25pIGdyb3VwcyBvZiB0eXBlIG9wZXIuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfb3Blcl9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWRkIGxpbmsuICovCisgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTVVMVElDQVNUX0xJTkssICAgICAgICAgIC8qKjwgQWRkIE11dGx0aWNhc3RsaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTkssICAvKio8IEFkZCBQcm90ZWN0ZWQgU3RhbmRieSBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVCwgICAgICAgICAgICAvKio8IElzc3VlIGFuIFJ4IFBvd2VyIE1lYXN1cmVtZW50IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBLCAgICAvKio8IFByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGx5IHJlLXJhbmdlIGRlbHRhLiAqLworICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUk9HVUVfTExJRF9TQ0FOLCAgICAgICAgIC8qKjwgUnVuIFJvZ3VlIExMSUQgU2Nhbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NFVF9FUE9OX05JX0VOX1NUQVRFLCAgICAvKio8IFNldCBFUE9OIE5JIEVuYWJsZSBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFLCAgICAgICAvKio8IFN0YXJ0IE9OVSBGaXJtd2FyZSBVcGdyYWRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGVwb25fb251XzEwZ191cyBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgZXBvbl9vbnVfMWdfdXMgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGVwb25fcGF0aF8xMGdfZHMgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGVwb25fcGF0aF8xMGdfdXMgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGVwb25fcGF0aF8xZ19kcyBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgZXBvbl9wYXRoXzFnX3VzIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBncG9uX2FsbG9jIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZAoreworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVELCAgICAvKio8IEdldCBhbGxvYyBJRCBzdGF0aXN0aWNzIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgICAgICAgICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgICAgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fYWxsb2MgZ3JvdXBzIG9mIHR5cGUgb3Blci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19vcGVyX2lkCit7CisgICAgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBHZXQgc3RhdGlzdGljcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURSwgICAgLyoqPCBTZXQgc3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9fTlVNX09GICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2Nfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fZ2VtX3BvcnQgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2lkCit7CisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fZ2VtX3BvcnQgZ3JvdXBzIG9mIHR5cGUgb3Blci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9vcGVyX2lkCit7CisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfT1BFUl9JRF9TRVRfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTZXQgc3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfT1BFUl9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25faXdmIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBGbHVzaCBNQUMgVGFibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCwgICAvKio8IFNjYW4gTUFDIFRhYmxlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICAgICAgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBncG9uX2l3ZiBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9vcGVyX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX0ZMVVNIX01BQ19UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRmx1c2ggTUFDIFRhYmxlLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX1NDQU5fTUFDX1RBQkxFLCAvKio8IFNjYW4gTUFDIFRhYmxlLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX19OVU1fT0YgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9vcGVyX2lkOworCisvKiogTGlzdCBvZiBhbGwgZ3Bvbl9pd2ZfbWFjX3RhYmxlIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTUFDX0FHRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE1BQyBBZ2VkLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfRFJPUFBFRCwgIC8qKjwgTUFDIERyb3BwZWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19NT1ZFLCAgICAgLyoqPCBNQUMgTW92ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTkVXX01BQywgICAgICAvKio8IE5ldyBNQUMuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX19OVU1fT0YgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBncG9uX25pIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfYXV0b19pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSwgICAgICAgICAgICAgLyoqPCBDUFUgUGFja2V0cyBGYWlsdXJlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsICAgLyoqPCBkZWFjdGl2YXRlIGFsbCBvbnVzIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVELCAgICAgIC8qKjwgZGlzYWJsZSBhbGwgb251cyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCAgICAgICAvKio8IGVuYWJsZSBhbGwgb251cyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1MsICAgICAgICAgICAgICAgICAgICAgLyoqPCBMT1MuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRCwgICAgICAgICAgLyoqPCBPTlUgRGlzY292ZXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFLCAgICAvKio8IE9OVSBVcGdyYWRlIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQsICAgICAgICAgICAgLyoqPCBQcm90ZWN0aW9uIFN3aXRjaGluZyBPTlVzIFJhbmdlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVELCAgIC8qKjwgUHJvdGVjdGlvbiBTd2l0Y2hpbmcgU3dpdGNob3ZlciBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgICAgICAgICAvKio8IFByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCwgICAgICAgICAgICAgICAgICAgLyoqPCBSb2d1ZSBkZXRlY3Rpb24gY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJULCAgICAgICAgICAgLyoqPCBSb2d1ZSBPTlUgc3BlY2lhbCBtYXAgY3ljbGUgc3RhcnQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCAgICAgICAvKio8IFNlcmlhbCBOdW1iZXIgQWNxdWlzaXRpb24gQ3ljbGUgU3RhcnQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCwgICAgICAvKio8IFN0YW5kYnkgUE9OIE1vbml0b3JpbmcgQ3ljbGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVELCAgICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVELCAgLyoqPCBTdGF0ZSBDaGFuZ2UgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfVE9EX1JFUVVFU1RfQ09NUExFVEVELCAgIC8qKjwgVE9EIHJlcXVlc3QgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fbmkgZ3JvdXBzIG9mIHR5cGUgb3Blci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9vcGVyX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEaXNhYmxlIFNlcmlhbCBOdW1iZXIuICovCisgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURSwgICAgICAgICAgICAgICAgICAgICAgLyoqPCBwcm90ZWN0aW9uIHN3aXRjaGluZyB0eXBlIGMgc2V0IG11bHRpcGxlIG9udSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JFU0VULCAgICAgICAgICAgICAgICAgICAvKio8IFJlc2V0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVywgIC8qKjwgUm9ndWUgRGV0ZWN0aW9uIFdpbmRvdy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUsICAgICAgICAgICAvKio8IFNldCBPTlUgU3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFLCAgICAgICAgICAgLyoqPCBTZXQgUE9OIFN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORywgICAvKio8IFNpbmdsZSByZXF1ZXN0IGZvciBzdGFuZGJ5IFBPTiBtb25pdG9yaW5nLiAqLworICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREUsICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXJ0IE9OVSBGaXJtd2FyZSBVcGdyYWRlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1QsIC8qKjwgVE9EIHJlcXVlc3QuICovCisgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9fTlVNX09GICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9vcGVyX2lkOworCisvKiogTGlzdCBvZiBhbGwgZ3Bvbl9uaSBncm91cHMgb2YgdHlwZSBwcm94eS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9wcm94eV9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1BST1hZX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJyb2FkY2FzdCBQTE9BTSBQYWNrZXQuICovCisgICAgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsICAgIC8qKjwgR1BPTiBDUFUgUGFja2V0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9fTlVNX09GICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm94eV9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fb251IGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2F1dG9faWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBCRVIgSW50ZXJ2YWwgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREZJLCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREdJLCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRE9XSSwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRHJpZnQgb2YgV2luZG93IG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRVJSLCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRVJSLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQsICAgICAgICAvKio8IEludmFsaWQgREJSdSBSZXBvcnQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCwgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCwgLyoqPCBLZXkgRXhjaGFuZ2UgQ3ljbGUgU2tpcHBlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRCwgICAgICAvKio8IEtleSBFeGNoYW5nZSBEZWNyeXB0IFJlcXVpcmVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gsICAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIEtleSBNaXNtYXRjaC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCwgICAvKio8IEtleSBFeGNoYW5nZSBLZXkgUmVxdWVzdCBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYLCAgIC8qKjwgS2V5IEV4Y2hhbmdlIFVuY29uc2VjdXRpdmUgSW5kZXguICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTE9BSSwgICAvKio8IExPQWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTE9LSSwgICAvKio8IExPa2kuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTUVNSSwgICAvKio8IE1FTWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCAgIC8qKjwgT01DSSBQT1JUIElEIENvbmZpZ3VyYXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCwgICAgICAgICAgICAgICAvKio8IE9OVSBBY3RpdmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRCwgICAgICAgLyoqPCBvbnUgYWN0aXZhdGlvbiBzdGFuZGJ5IGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUxBUk0sICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgQWxhcm0uICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQsIC8qKjwgT05VIERlYWN0aXZhdGlvbiBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVELCAgICAgIC8qKjwgT05VIERpc2FibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVELCAgICAgICAvKio8IE9OVSBFbmFibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09QVElDQUxfUkVGTEVDVElPTiwgICAgICAgICAvKio8IE9wdGljYWwgUmVmbGVjdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQsICAvKio8IFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QRUUsICAgICAgICAgICAgLyoqPCBQRUUuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUE9TU0lCTEVfRFJJRlQsIC8qKjwgUG9zc2libGUgRHJpZnQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UsICAvKio8IFBvd2VyIE1hbmFnZW1lbnQgU3RhdGUgQ2hhbmdlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BTVCwgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBTVC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRCwgICAgICAgICAgLyoqPCBSYW5naW5nIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SRUksICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSRUkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQsIC8qKjwgUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0RJLCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2lnbmFsIERlZ3JhZGVkIG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0ZJLCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2lnbmFsIEZhaWwgb2YgT05VaS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICAgICAgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1VGSSwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU1VGaS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9USVdJLCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmcuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBncG9uX29udSBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9vcGVyX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ2hhbmdlIFBvd2VyIExldmVsLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1JTU0lfTUVBU1VSRU1FTlQsICAgLyoqPCBSU1NJIE1lYXN1cmVtZW50LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUsICAgICAgLyoqPCBTZXQgT05VIFN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX19OVU1fT0YgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fb251IGdyb3VwcyBvZiB0eXBlIHByb3h5LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9wcm94eV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBHUE9OIENQVSBQYWNrZXRzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQsICAvKio8IFBMT0FNIFBhY2tldC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfX05VTV9PRiAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcHJveHlfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBncG9uX29udSBncm91cHMgb2YgdHlwZSBwcm94eV9yeC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfcHJveHlfcnhfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfX0JFR0lOLAorICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgR1BPTiBDUFUgcGFja2V0LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9PTUNJX1BBQ0tFVCwgICAgLyoqPCBHUE9OIE9NQ0kgcGFja2V0LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9fTlVNX09GICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcHJveHlfcnhfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBsb2dfZW50cnkgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nX2VudHJ5X2F1dG9faWQKK3sKKyAgICBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9MT0dfRU5UUllfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgbG9nZ2VyIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ2dlcl9hdXRvX2lkCit7CisgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfTE9HR0VSX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9sb2dnZXJfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGxvZ2dlciBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dnZXJfb3Blcl9pZAoreworICAgIEJDTU9MVF9MT0dHRVJfT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX0NMRUFSX0xPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBjbGVhciBsb2cuICovCisgICAgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9sb2dnZXJfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIG5uaSBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ubmlfYXV0b19pZAoreworICAgIEJDTU9MVF9OTklfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRVU19DSEFOR0VELCAgICAgIC8qKjwgU3RhdHVzIGNoYW5nZWQuICovCisgICAgQkNNT0xUX05OSV9BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X25uaV9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgdHJ4X2NhbGlicmF0aW9uIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2lkCit7CisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fSURfQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENhcHR1cmUgd2luZG93IGFuZCBzdGF0aXN0aWMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIHRyeF9jYWxpYnJhdGlvbiBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fb3Blcl9pZAoreworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGFydCBjYXB0dXJlIHdpbmRvdy4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RPUF9DQVBUVVJFX1dJTkRPVywgLyoqPCBzdG9wIGNhcHR1cmUgd2luZG93LiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9fTlVNX09GICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIHhncG9uX2FsbG9jIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVELCAgIC8qKjwgR2V0IGFsbG9jIElEIHN0YXRpc3RpY3MgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgICAgICAgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgICAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIHhncG9uX2FsbG9jIGdyb3VwcyBvZiB0eXBlIG9wZXIuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX29wZXJfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBHZXQgc3RhdGlzdGljcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9TRVRfU1RBVEUsICAgLyoqPCBTZXQgc3RhdGUuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfX05VTV9PRiAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX29wZXJfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCB4Z3Bvbl9nZW1fcG9ydCBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgeGdwb25fbmkgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfYXV0b19pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFjdGl2YXRlIGFsbCBvbnVzIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9DUFVfUEFDS0VUU19GQUlMVVJFLCAgICAgICAgICAgIC8qKjwgQ1BVIFBhY2tldHMgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCwgIC8qKjwgZGVhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQsICAgICAvKio8IGRpc2FibGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQsICAgICAgLyoqPCBlbmFibGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0xPUywgICAgICAgICAgICAgICAgICAgIC8qKjwgTE9TLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX09OVV9ESVNDT1ZFUkVELCAgICAgICAgIC8qKjwgT05VIERpc2NvdmVyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEUsICAgLyoqPCBPTlUgVXBncmFkZSBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRCwgICAgICAgICAgIC8qKjwgUHJvdGVjdGlvbiBTd2l0Y2hpbmcgT05VcyBSYW5nZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQsICAvKio8IFByb3RlY3Rpb24gU3dpdGNoaW5nIFN3aXRjaG92ZXIgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FLCAgICAgICAgLyoqPCBQcm90ZWN0aW9uIFN3aXRjaGluZyBUcmFmZmljIFJlc3VtZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVELCAgICAgICAgICAgICAgICAgIC8qKjwgUm9ndWUgZGV0ZWN0aW9uIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQsICAgICAgICAgIC8qKjwgUm9ndWUgT05VIHNwZWNpYWwgbWFwIGN5Y2xlIHN0YXJ0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQsICAgICAgLyoqPCBTZXJpYWwgTnVtYmVyIEFjcXVpc2l0aW9uIEN5Y2xlIFN0YXJ0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVELCAgICAgLyoqPCBTdGFuZGJ5IFBPTiBNb25pdG9yaW5nIEN5Y2xlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgICAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsIC8qKjwgU3RhdGUgQ2hhbmdlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQsICAvKio8IFRPRCByZXF1ZXN0IGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgeGdwb25fbmkgZ3JvdXBzIG9mIHR5cGUgb3Blci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFkanVzdCBUeCBXYXZlbGVuZ2guICovCisgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSLCAgICAgICAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBTZXJpYWwgTnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JFU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlc2V0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1csICAgICAgICAgICAgICAgICAvKio8IFJvZ3VlIERldGVjdGlvbiBXaW5kb3cuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUlVOX1NQRUNJQUxfQldfTUFQLCAgICAgICAgICAgICAgICAgICAgIC8qKjwgUnVuIFNwZWNpYWwgQlcgTWFwLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUsICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNldCBPTlUgU3RhdGUuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2V0IFBPTiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HLCAgLyoqPCBTaW5nbGUgcmVxdWVzdCBzdGFuZGJ5IFBPTiBNb25pdG9yaW5nLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFLCAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXJ0IE9OVSBGaXJtd2FyZSBVcGdyYWRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1RPRF9SRVFVRVNULCAgICAvKio8IFRPRCByZXF1ZXN0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX19OVU1fT0YgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkOworCisvKiogTGlzdCBvZiBhbGwgeGdwb25fbmkgZ3JvdXBzIG9mIHR5cGUgcHJveHkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3Byb3h5X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJyb2FkY2FzdCBQTE9BTSBQYWNrZXQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTLCAgIC8qKjwgWEdQT04gQ1BVIHBhY2tldHMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX19OVU1fT0YgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3h5X2lkOworCisvKiogTGlzdCBvZiBhbGwgeGdwb25fb251IGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9hdXRvX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ER0ksICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ET1dJLCAgICAgICAgICAgICAgICAgICAgICAvKio8IERyaWZ0IG9mIFdpbmRvdyBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9JTlZBTElEX0RCUlVfUkVQT1JULCAgICAgICAvKio8IEludmFsaWQgREJSdSBSZXBvcnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQsICAgIC8qKjwgS2V5IEV4Y2hhbmdlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQsICAgICAgICAvKio8IEtleSBFeGNoYW5nZSBDeWNsZSBTa2lwcGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENILCAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIEtleSBNaXNtYXRjaC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQsICAvKio8IEtleSBFeGNoYW5nZSBLZXkgUmVxdWVzdCBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9MT09DSSwgICAgICAgICAgICAgICAgICAgICAvKio8IExPT0NpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQsICAvKio8IE9OVSBBY3RpdmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0FMQVJNLCAgICAgICAgICAgICAgICAgLyoqPCBPTlUgQWxhcm0uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVELCAgICAvKio8IE9OVSBEZWFjdGl2YXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQsICAgICAgICAgLyoqPCBPTlUgRGlzYWJsZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVELCAgICAgICAgICAvKio8IE9OVSBFbmFibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCwgICAgICAgLyoqPCBPTlUgVHVuaW5nIGluIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVELCAgICAgIC8qKjwgT05VIFR1bmluZyBvdXQgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04sICAgICAgICAgICAgLyoqPCBPcHRpY2FsIFJlZmxlY3Rpb24uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPU1NJQkxFX0RSSUZULCAgICAgICAgICAgICAgICAvKio8IFBvc3NpYmxlIERyaWZ0LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQsICAgICAgLyoqPCBQb3dlciBjb25zdW1wdGlvbiByZXBvcnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPV0VSX0xFVkVMX1JFUE9SVCwgICAgICAgICAgICAvKio8IFBvd2VyIGxldmVsIHJlcG9ydC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UsIC8qKjwgUG93ZXIgTWFuYWdlbWVudCBTdGF0ZSBDaGFuZ2UuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BRU0ksICAgICAgICAgICAgICAvKio8IHBsb2FtIHF1ZXVlIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUkFOR0lOR19DT01QTEVURUQsIC8qKjwgUmFuZ2luZyBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JFR0lTVFJBVElPTl9JRCwgICAvKio8IFJlZ2lzdHJhdGlvbiBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQsICAgIC8qKjwgUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NESSwgICAvKio8IFNpZ25hbCBEZWdyYWRlZCBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUsICAvKio8IHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0ZJLCAgICAgICAgICAgICAgICAgICAvKio8IFNpZ25hbCBGYWlsIG9mIE9OVWkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU1VGSSwgICAgICAgICAgICAgICAgICAvKio8IFNVRmkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RJV0ksICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmcuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RVTklOR19SRVNQT05TRSwgICAgICAgLyoqPCBUdW5pbmcgcmVzcG9uc2UuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCB4Z3Bvbl9vbnUgZ3JvdXBzIG9mIHR5cGUgb3Blci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29wZXJfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWRqdXN0IFR4IHdhdmVsZW5ndGguICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTExJTkcsICAgICAgICAvKio8IENoYW5nZSBwb3dlciBsZXZlbGxpbmcuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9DT05TVU1QVElPTiwgICAgICAgICAvKio8IEdldCBwb3dlciBjb25zdW1wdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0xFVkVMLCAgICAgICAgICAgICAgIC8qKjwgR2V0IHBvd2VyIGxldmVsLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX0lOLCAgICAgICAgICAgICAgICAgLyoqPCBPTlUgVHVuaW5nIGluLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX09VVCwgICAgICAgICAgICAgICAgLyoqPCBPTlUgVHVuaW5nIG91dC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfUkVRVUVTVF9SRUdJU1RSQVRJT04sICAgICAgICAgIC8qKjwgUmVxdWVzdCByZWdpc3RyYXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1JTU0lfTUVBU1VSRU1FTlQsICAgICAgICAgICAgICAvKio8IFJTU0kgTWVhc3VyZW1lbnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT04sICAvKio8IFNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUsICAgICAgICAgICAgICAgICAvKio8IFNldCBPTlUgU3RhdGUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIHhncG9uX29udSBncm91cHMgb2YgdHlwZSBwcm94eS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3Byb3h5X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9fQkVHSU4sCisgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBYR1BPTiBDUFUgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVCwgLyoqPCBQTE9BTSBQYWNrZXQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9fTlVNX09GICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wcm94eV9pZDsKKworLyoqIExpc3Qgb2YgYWxsIHhncG9uX29udSBncm91cHMgb2YgdHlwZSBwcm94eV9yeC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3Byb3h5X3J4X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9fQkVHSU4sCisgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBYR1BPTiBDUFUgcGFja2V0LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfUlhfSURfT01DSV9QQUNLRVQsICAgLyoqPCBYR1BPTiBPTUNJIHBhY2tldC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BST1hZX1JYX0lEX19OVU1fT0YgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wcm94eV9yeF9pZDsKKworI2RlZmluZSBiY21vbHRfYWVfbmlfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfTklfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX05JX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9jaGFubmVsX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9jaGFubmVsX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfY2xpX2lucHV0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0ZJTEVfQUxNT1NUX0ZVTExfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfU1RBUlRfQVBJX0NBUFRVUkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfU1RPUF9BUElfQ0FQVFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19SRVNFVF9BUElfQ0FQVFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0RJU0NPTk5FQ1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX3Jlc2V0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1NXX1VQR1JBREVfQUNUSVZBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9FU1RBQkxJU0hFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfRElTQ09OTkVDVElPTl9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0REUl9URVNUX0NPTVBMRVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1RETV9DSEFOTkVMU19FWEhBVVNURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19ST0dVRV9WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19GT1JDRV9SRURJU0NPVkVSWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfREVMRVRFX0xJTktfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19FTkNSWVBUSU9OX0VOQUJMRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfUkVHX0FDS19USU1FT1VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19SQU5HRV9WQUxVRV9DSEFOR0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfUkVQT1JUX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRU9VVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19NUENQX0RFUkVHSVNURVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUT1BfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUT1BQRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfUkVSQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19MSU5LX0RFTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUkVSQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUk9HVUVfU0NBTl9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX01QQ1BfVElNRVNUQU1QX0NIQU5HRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3JwX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncGlvX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUElPX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncGlvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUElPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TRVRfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9ORVdfTUFDX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfQUdFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcmVzZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUkVTRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU0VUX09OVV9TVEFURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9sb3NfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9MT1NfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF9hbGxfcHJvcGVydGllcyBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FMQVJNX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3NkaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NESV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9kZmlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ERklfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9sb2FpX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9MT0FJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2RnaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0RHSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wZWVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QRUVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3Rpd2lfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9tZW1pX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3JlaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JFSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PUFRJQ0FMX1JFRkxFQ1RJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DTEVBUl9MT0dfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1dfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25faXdmX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JFU0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9BTEFSTV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZGlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2RmaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0RGSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1VGSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfTE9PQ0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PUFRJQ0FMX1JFRkxFQ1RJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9kZ2lfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0dFVF9QT1dFUl9MRVZFTF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfR0VUX1BPV0VSX0NPTlNVTVBUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fdHJ4X2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfX05VTV9PRgorCisvKiBUaGUgZm9sbG93aW5nIGFyZSByZXF1aXJlZCBmb3IgdGhlIEFQSSBJbml0L1NldC9ldGMgbWFjcm9zICovCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfb2JqX2lkX2FlX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9BRV9OSQorI2RlZmluZSBiY21vbHRfb2JqX2lkX2FlX3BhdGhfZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfYWVfcGF0aF91cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9jaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfQ0hBTk5FTAorI2RlZmluZSBiY21vbHRfb2JqX2lkX2RlYnVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9ERUJVRworI2RlZmluZSBiY21vbHRfb2JqX2lkX2RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9ERVZJQ0UKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9lcG9uX2RlbmllZF9saW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSworI2RlZmluZSBiY21vbHRfb2JqX2lkX2Vwb25fbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9FUE9OX0xJTksKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9lcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfRVBPTl9OSQorI2RlZmluZSBiY21vbHRfb2JqX2lkX2Vwb25fb251XzEwZ191cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9lcG9uX29udV8xZ191cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9lcG9uX3BhdGhfMTBnX2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUworI2RlZmluZSBiY21vbHRfb2JqX2lkX2Vwb25fcGF0aF8xMGdfdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfZXBvbl9wYXRoXzFnX2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUworI2RlZmluZSBiY21vbHRfb2JqX2lkX2Vwb25fcGF0aF8xZ191cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9lcG9uX3JwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfRVBPTl9SUAorI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUElPCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfZ3Bvbl9hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9ncG9uX2dlbV9wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVAorI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwb25faXdmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUE9OX0lXRgorI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwb25faXdmX2RzX2VncmVzc19mbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVworI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1cKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9ncG9uX2l3Zl9tYWNfdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfZ3Bvbl9pd2ZfdXNfZmxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1cKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9ncG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfR1BPTl9OSQorI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwb25fb251ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUE9OX09OVQorI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwb25fdHJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUE9OX1RSWAorI2RlZmluZSBiY21vbHRfb2JqX2lkX2xvZ19lbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlkKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9sb2dnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfTE9HR0VSCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfbm5pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX05OSQorI2RlZmluZSBiY21vbHRfb2JqX2lkX25uaV9zZXJkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9OTklfU0VSREVTCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfc29mdHdhcmVfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfdHJ4X2NhbGlicmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTgorI2RlZmluZSBiY21vbHRfb2JqX2lkX3hncG9uX2FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQworI2RlZmluZSBiY21vbHRfb2JqX2lkX3hncG9uX2dlbV9wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVAorI2RlZmluZSBiY21vbHRfb2JqX2lkX3hncG9uX2l3ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YKKyNkZWZpbmUgYmNtb2x0X29ial9pZF94Z3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfWEdQT05fTkkKKyNkZWZpbmUgYmNtb2x0X29ial9pZF94Z3Bvbl9vbnUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfWEdQT05fT05VCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfeGdwb25fdHJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWAorI2RlZmluZSBiY21vbHRfb2JqX2lkX3hwb25fc2VyZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUworI2RlZmluZSBiY21vbHRfb2JqX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9uaV9vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfTklfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2FlX25pX29wZXJfaWRfc2V0X2FlX25pX2VuX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9PUEVSX0lEX1NFVF9BRV9OSV9FTl9TVEFURQorI2RlZmluZSBiY21vbHRfYWVfbmlfb3Blcl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX05JX09QRVJfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2F1dG9faWRfY2xpX291dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19BVVRPX0lEX0NMSV9PVVRQVVQKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2F1dG9faWRfZmlsZV9hbG1vc3RfZnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19BVVRPX0lEX0ZJTEVfQUxNT1NUX0ZVTEwKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZGVidWdfb3Blcl9pZF9jbGlfaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX09QRVJfSURfQ0xJX0lOUFVUCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19vcGVyX2lkX3Jlc2V0X2FwaV9jYXB0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfT1BFUl9JRF9SRVNFVF9BUElfQ0FQVFVSRQorI2RlZmluZSBiY21vbHRfZGVidWdfb3Blcl9pZF9zdGFydF9hcGlfY2FwdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX09QRVJfSURfU1RBUlRfQVBJX0NBUFRVUkUKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX29wZXJfaWRfc3RvcF9hcGlfY2FwdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkUKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX2Nvbm5lY3Rpb25fY29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0NPTVBMRVRFCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19pZF9jb25uZWN0aW9uX2VzdGFibGlzaGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9faWRfY29ubmVjdGlvbl9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRkFJTFVSRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9faWRfZGRyX3Rlc3RfY29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0REUl9URVNUX0NPTVBMRVRFCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19pZF9kZXZpY2Vfa2VlcF9hbGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX0tFRVBfQUxJVkUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX2RldmljZV9yZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfUkVBRFkKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19pZF9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX2luZGljYXRpb25zX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9JTkRJQ0FUSU9OU19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19pZF9zd19lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX3N3X2V4Y2VwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9TV19FWENFUFRJT04KKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfb3Blcl9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfb3Blcl9pZF9jb25uZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfQ09OTkVDVAorI2RlZmluZSBiY21vbHRfZGV2aWNlX29wZXJfaWRfZGlzY29ubmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0RJU0NPTk5FQ1QKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9vcGVyX2lkX2hvc3Rfa2VlcF9hbGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9vcGVyX2lkX2ltYWdlX3RyYW5zZmVyX2RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfb3Blcl9pZF9pbWFnZV90cmFuc2Zlcl9zdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9vcGVyX2lkX3Jlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SRVNFVAorI2RlZmluZSBiY21vbHRfZGV2aWNlX29wZXJfaWRfcnVuX2Rkcl90ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JVTl9ERFJfVEVTVAorI2RlZmluZSBiY21vbHRfZGV2aWNlX29wZXJfaWRfc3dfdXBncmFkZV9hY3RpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1NXX1VQR1JBREVfQUNUSVZBVEUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9vcGVyX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2lkX2xhc2VyX29uX29mZl92aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWRfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19pZF9tYXhfbGlua192aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTUFYX0xJTktfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWRfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWRfcmFuZ2VfdmlvbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1JBTkdFX1ZJT0xBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2lkX3JvZ3VlX3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9ST0dVRV9WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19pZF9zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2lkX3RkbV9jaGFubmVsc19leGhhdXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9URE1fQ0hBTk5FTFNfRVhIQVVTVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWRfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1VOS05PV05fTElOS19WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19pZF91cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19pZF9kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX2VuY3J5cHRpb25fZW5hYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9FTkNSWVBUSU9OX0VOQUJMRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX2tleV9leGNoYW5nZV9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWRfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19pZF9rZXlfZXhjaGFuZ2Vfc3RvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1NUT1BQRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX2xpbmtfZGVsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX0RFTEVURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX2xpbmtfc3BlZWRfbWlzbWF0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX1NQRUVEX01JU01BVENICisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19pZF9tcGNwX2RlcmVnaXN0ZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9ERVJFR0lTVEVSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX21wY3BfZGlzY292ZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX0RJU0NPVkVSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX21wY3BfcmVnX2Fja190aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX1JFR19BQ0tfVElNRU9VVAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWRfbXBjcF9yZXBvcnRfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX29hbV9rZWVwYWxpdmVfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWRfcmFuZ2VfdmFsdWVfY2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1JBTkdFX1ZBTFVFX0NIQU5HRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX3JlcmFuZ2VfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9SRVJBTkdFX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWRfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vcGVyX2lkX2RlbGV0ZV9saW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9ERUxFVEVfTElOSworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29wZXJfaWRfZm9yY2VfcmVkaXNjb3ZlcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0ZPUkNFX1JFRElTQ09WRVJZCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZF9rZXlfZXhjaGFuZ2Vfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUQVJUCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZF9rZXlfZXhjaGFuZ2Vfc3RvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUT1AKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vcGVyX2lkX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZF9vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZF9zdGF0aWNfcmVnaXN0cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfU1RBVElDX1JFR0lTVFJBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19wcm94eV9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJveHlfaWRfaW5qZWN0X2ZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX0lEX0lOSkVDVF9GUkFNRQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3Byb3h5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19QUk9YWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJveHlfcnhfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX1JYX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3Byb3h5X3J4X2lkX2ZyYW1lX2NhcHR1cmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19QUk9YWV9SWF9JRF9GUkFNRV9DQVBUVVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3Byb3h5X3J4X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19QUk9YWV9SWF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2lkX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9sbGlkX3F1YXJhbnRpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTExJRF9RVUFSQU5USU5FRAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2lkX21wY3BfdGltZXN0YW1wX2NoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9faWRfbm9fcmVwb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX05PX1JFUE9SVFMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9vbnVfdXBncmFkZV9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9yZXJhbmdlX2ZhaWx1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUkVSQU5HRV9GQUlMVVJFCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9faWRfcm9ndWVfc2Nhbl9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JPR1VFX1NDQU5fQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX2FkZF9saW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTElOSworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX2FkZF9tdWx0aWNhc3RfbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTVVMVElDQVNUX0xJTksKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfb3Blcl9pZF9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTksKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfb3Blcl9pZF9pc3N1ZV9yc3NpX2dyYW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX29wZXJfaWRfcm9ndWVfbGxpZF9zY2FuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1JPR1VFX0xMSURfU0NBTgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX3NldF9lcG9uX25pX2VuX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9TRVRfRVBPTl9OSV9FTl9TVEFURQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX3N0YXJ0X29udV91cGdyYWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZF9nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfb3Blcl9pZF9nZXRfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX29wZXJfaWRfc2V0X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19vcGVyX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfb3Blcl9pZF9zZXRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX09QRVJfSURfU0VUX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19pZF9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19pZF9zY2FuX21hY190YWJsZV9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX29wZXJfaWRfZmx1c2hfbWFjX3RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX0ZMVVNIX01BQ19UQUJMRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfb3Blcl9pZF9zY2FuX21hY190YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfU0NBTl9NQUNfVEFCTEUKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2lkX21hY19hZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfQUdFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9faWRfbWFjX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19pZF9tYWNfbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTUFDX01PVkUKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2lkX25ld19tYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9ORVdfTUFDCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2F1dG9faWRfY3B1X3BhY2tldHNfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9lbmFibGVfYWxsX29udXNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX2xvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1MKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9vbnVfZGlzY292ZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfT05VX0RJU0NPVkVSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9vbnVfdXBncmFkZV9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb3Blcl9pZF9kaXNhYmxlX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29wZXJfaWRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29wZXJfaWRfcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JFU0VUCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29wZXJfaWRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1cKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb3Blcl9pZF9zZXRfb251X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vcGVyX2lkX3NldF9wb25fc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29wZXJfaWRfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NJTkdMRV9SRVFVRVNUX1NUQU5EQllfUE9OX01PTklUT1JJTkcKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb3Blcl9pZF9zdGFydF9vbnVfdXBncmFkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb3Blcl9pZF90b2RfcmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1QKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb3Blcl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm94eV9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3h5X2lkX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3h5X2lkX2NwdV9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm94eV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfZGZpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0RGSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9kZ2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREdJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2Rvd2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ET1dJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9FUlIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfaW52YWxpZF9kYnJ1X3JlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2xvYWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0FJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2xva2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0tJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX21lbWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9NRU1JCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfb251X2FjdGl2YXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfb251X2FsYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfb251X2Rpc2FibGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9vbnVfZW5hYmxlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfb3B0aWNhbF9yZWZsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09QVElDQUxfUkVGTEVDVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX3BlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QRUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfcG9zc2libGVfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BPU1NJQkxFX0RSSUZUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9wc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUFNUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX3JhbmdpbmdfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9yZWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUkVJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9zZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0RJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX3NmaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TRkkKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfc3VmaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NVRkkKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfdGl3aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1RJV0kKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb3Blcl9pZF9jaGFuZ2VfcG93ZXJfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vcGVyX2lkX3Jzc2lfbWVhc3VyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vcGVyX2lkX3NldF9vbnVfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9TRVRfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vcGVyX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wcm94eV9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wcm94eV9pZF9jcHVfcGFja2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3Byb3h5X2lkX3Bsb2FtX3BhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3Byb3h5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wcm94eV9yeF9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wcm94eV9yeF9pZF9jcHVfcGFja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfQ1BVX1BBQ0tFVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcHJveHlfcnhfaWRfb21jaV9wYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BST1hZX1JYX0lEX09NQ0lfUEFDS0VUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wcm94eV9yeF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX29wZXJfaWRfY2xlYXJfbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX0NMRUFSX0xPRworI2RlZmluZSBiY21vbHRfbG9nZ2VyX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X25uaV9hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X25uaV9hdXRvX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfbm5pX2F1dG9faWRfc3RhdHVzX2NoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRVU19DSEFOR0VECisjZGVmaW5lIGJjbW9sdF9ubmlfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9faWRfY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX29wZXJfaWRfc3RhcnRfY2FwdHVyZV93aW5kb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fb3Blcl9pZF9zdG9wX2NhcHR1cmVfd2luZG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RPUF9DQVBUVVJFX1dJTkRPVworI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9faWRfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfb3Blcl9pZF9nZXRfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19vcGVyX2lkX3NldF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9TRVRfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2lkX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfY3B1X3BhY2tldHNfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2lkX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9lbmFibGVfYWxsX29udXNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9sb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfTE9TCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2lkX29udV9kaXNjb3ZlcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9vbnVfdXBncmFkZV9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2lkX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfdG9kX3JlcXVlc3RfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX2FkanVzdF90eF93YXZlbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZF9kaXNhYmxlX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX3Jlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9SRVNFVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZF9ydW5fc3BlY2lhbF9id19tYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUlVOX1NQRUNJQUxfQldfTUFQCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX3NldF9vbnVfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TRVRfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX3NldF9wb25fc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX3N0YXJ0X29udV91cGdyYWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZF90b2RfcmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1QKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3h5X2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3h5X2lkX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9wcm94eV9pZF9jcHVfcGFja2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3h5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9kZmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREZJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9kZ2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREdJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9kb3dpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfRE9XSQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfaW52YWxpZF9kYnJ1X3JlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX2tleV9leGNoYW5nZV9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENICisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX2xvb2NpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9MT09DSQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfb251X2FjdGl2YXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfb251X2FsYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9vbnVfZW5hYmxlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX29udV90dW5pbmdfaW5fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfb251X3R1bmluZ19vdXRfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfb3B0aWNhbF9yZWZsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09QVElDQUxfUkVGTEVDVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfcG9zc2libGVfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPU1NJQkxFX0RSSUZUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9wb3dlcl9sZXZlbF9yZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTEVWRUxfUkVQT1JUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX3Bxc2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QUVNJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9yYW5naW5nX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUkFOR0lOR19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX3JlZ2lzdHJhdGlvbl9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SRUdJU1RSQVRJT05fSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfc2RpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NESQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfc2ZpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NGSQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9zdWZpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU1VGSQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfdGl3aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RJV0kKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX3R1bmluZ19yZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9UVU5JTkdfUkVTUE9OU0UKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9hZGp1c3RfdHhfd2F2ZWxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEgKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vcGVyX2lkX2NoYW5nZV9wb3dlcl9sZXZlbGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9nZXRfcG93ZXJfY29uc3VtcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0NPTlNVTVBUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9nZXRfcG93ZXJfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0xFVkVMCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9vbnVfdHVuaW5nX2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19JTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29wZXJfaWRfb251X3R1bmluZ19vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfT1VUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfUkVRVUVTVF9SRUdJU1RSQVRJT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vcGVyX2lkX3Jzc2lfbWVhc3VyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29wZXJfaWRfc2V0X29udV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vcGVyX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcHJveHlfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Byb3h5X2lkX2NwdV9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Byb3h5X2lkX3Bsb2FtX3BhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wcm94eV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Byb3h5X3J4X2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wcm94eV9yeF9pZF9jcHVfcGFja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfUlhfSURfQ1BVX1BBQ0tFVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Byb3h5X3J4X2lkX29tY2lfcGFja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9PTUNJX1BBQ0tFVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Byb3h5X3J4X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9uaV9rZXlfaWRfYWVfbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfTklfS0VZX0lEX0FFX05JCisjZGVmaW5lIGJjbW9sdF9hZV9uaV9rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfTklfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9tYWNfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfTUFDX0FERFJFU1MKKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9hZV9uaV9lbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4KKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9tdHVfMTBnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfTVRVXzEwRworI2RlZmluZSBiY21vbHRfYWVfbmlfY2ZnX2lkX3ByYnNfZ2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUgorI2RlZmluZSBiY21vbHRfYWVfbmlfY2ZnX2lkX3ByYnNfY2hlY2tlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0NIRUNLRVIKKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9wcmJzX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkX25ld19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX05JX1NFVF9BRV9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19rZXlfaWRfYWVfbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfS0VZX0lEX0FFX05JCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CWVRFUworI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0CisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfZnJhbWVzXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfZnJhbWVzXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NworI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX2ZyYW1lc18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1CisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfZnJhbWVzXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9icm9hZGNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX2RhdGFfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9EQVRBX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfbXVsdGljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF91bmljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9hYm9ydF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWRfY2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRworI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF9hZV9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19LRVlfSURfQUVfTkkKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FUworI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjQKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9mcmFtZXNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNworI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NQorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMQorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9mcmFtZXNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOAorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3CisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfZnJhbWVzXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9mcmFtZXNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MworI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2Jyb2FkY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfZGF0YV9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0RBVEFfQllURVMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9tdWx0aWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX3VuaWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2Fib3J0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9mY3NfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfb3ZlcnNpemVfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfcnVudF9lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1JVTlRfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2NoYW5uZWxfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X2NoYW5uZWxfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9jaGFubmVsX2NmZ19pZF9vcGVyYXRpb25fY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wKKyNkZWZpbmUgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3RvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0wKKyNkZWZpbmUgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3N5c3RlbV9wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9TWVNURU1fUFJPRklMRQorI2RlZmluZSBiY21vbHRfY2hhbm5lbF9jZmdfaWRfY2hhbm5lbF9wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRQorI2RlZmluZSBiY21vbHRfY2hhbm5lbF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2tleV9pZF9yZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19LRVlfSURfUkVTRVJWRUQKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfY2ZnX2lkX2NvbnNvbGVfcmVkaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9DT05TT0xFX1JFRElSRUNUSU9OCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jZmdfaWRfaW5kaWNhdGlvbnNfZHJvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2NmZ19pZF9maWxlX3VzZWRfcGVyY2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19DRkdfSURfRklMRV9VU0VEX1BFUkNFTlQKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2NmZ19pZF9hcGlfY2FwdHVyZV9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQ0ZHCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jZmdfaWRfYXBpX2NhcHR1cmVfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX1NUQVRTCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jZmdfaWRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFECisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jZmdfaWRfYXBpX2NhcHR1cmVfYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUgorI2RlZmluZSBiY21vbHRfZGVidWdfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkX2RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0xJX09VVFBVVF9JRF9EQVRBCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0xJX09VVFBVVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfRklMRV9BTE1PU1RfRlVMTF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF9jbGlfb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfQ0xJX09VVFBVVAorI2RlZmluZSBiY21vbHRfZGVidWdfYXV0b19jZmdfaWRfZmlsZV9hbG1vc3RfZnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0ZJTEVfQUxNT1NUX0ZVTEwKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWRfZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19DTElfSU5QVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX1JFU0VUX0FQSV9DQVBUVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19TVEFSVF9BUElfQ0FQVFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfU1RPUF9BUElfQ0FQVFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfa2V5X2lkX3Jlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0tFWV9JRF9SRVNFUlZFRAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9zeXN0ZW1fbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfU1lTVEVNX01PREUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfa2VlcGFsaXZlX2ludGVydmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9JTlRFUlZBTAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9rZWVwYWxpdmVfdG9sZXJhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX1RPTEVSQU5DRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9maXJtd2FyZV9zd192ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9ob3N0X3N3X3ZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfSE9TVF9TV19WRVJTSU9OCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2NoaXBfcmV2aXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9TVEFURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9kZWJ1ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfREVCVUcKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfbm5pX3NwZWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfRVhUX0lSUQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2luZGljYXRpb25fc2hhcGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfY2hpcF90ZW1wZXJhdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0VOQUJMRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9ncG9uX3hncG9uX3RvZF9ncGlvX3BpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4KKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0NPTk5FQ1RFRF9JTlRFUk5BTExZCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2Vwb25fODAyMV9hc190b2RfZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9lcG9uX3NoYXBlcl9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9TSEFQRVJfTU9ERQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9lbWJlZGRlZF9pbWFnZV9saXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfRU1CRURERURfSU1BR0VfTElTVAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9jaGlwX3ZvbHRhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9WT0xUQUdFCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2Vwb25fdG9kX3N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1RPRF9TVFJJTkcKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfeGdwb25fbnVtX29mX29udXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1hHUE9OX05VTV9PRl9PTlVTCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2RldmljZV9pcF9hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfSVBfQUREUkVTUworI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9kZXZpY2VfdWRwX3BvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX1VEUF9QT1JUCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX3RvZF91YXJ0X2JhdWRyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9ncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWRfc3RhbmRhbG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRVNUQUJMSVNIRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZF9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWRfZGRyX3Rlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0REUl9URVNUX0NPTVBMRVRFX0lEX0REUl9URVNUCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0REUl9URVNUX0NPTVBMRVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZF9zZXF1ZW5jZV9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfU0VRVUVOQ0VfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWRfdGltZV9zdGFtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1RJTUVfU1RBTVAKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9maXJtd2FyZV9zd192ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfRklSTVdBUkVfU1dfVkVSU0lPTgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9zeXN0ZW1fbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfU1lTVEVNX01PREUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWRfbm5pX3NwZWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX05OSV9TUEVFRAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9jaGlwX3JldmlzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfQ0hJUF9SRVZJU0lPTgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF90b2RfZW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF90b2RfZ3Bpb19waW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0dQSU9fUElOCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0RJU0NPTk5FQ1RJT05fQ09NUExFVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkX2ltYWdlX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWRfYmxvY2tfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX0JMT0NLX05VTUJFUgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWRfdG90YWxfY291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTkRJQ0FUSU9OU19EUk9QUEVEX0lEX1RPVEFMX0NPVU5UCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lORElDQVRJT05TX0RST1BQRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkX3Rhc2tfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZF9maWxlX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWRfbGluZV9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0xJTkVfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkX2NwdV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9DUFVfSUQKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWRfdGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX1RFWFQKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZF9jb25uZWN0aW9uX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9DT01QTEVURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0VTVEFCTElTSEVECisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWRfY29ubmVjdGlvbl9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRkFJTFVSRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2Rkcl90ZXN0X2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERFJfVEVTVF9DT01QTEVURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2RldmljZV9rZWVwX2FsaXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERVZJQ0VfS0VFUF9BTElWRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2RldmljZV9yZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERVZJQ0VfUkVBRFkKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZF9kaXNjb25uZWN0aW9uX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRElTQ09OTkVDVElPTl9DT01QTEVURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2luZGljYXRpb25zX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWRfc3dfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWRfc3dfZXhjZXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VYQ0VQVElPTgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ESVNDT05ORUNUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWRfc2VxdWVuY2VfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZF90aW1lX3N0YW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfYmxvY2tfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfbW9yZV9kYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX01PUkVfREFUQQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0RBVEEKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWRfaW1hZ2VfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1RZUEUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZF9pbWFnZV9zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfU0laRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX2NyYzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9DUkMzMgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX2ltYWdlX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9OQU1FCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9yZXNldF9pZF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERQorI2RlZmluZSBiY21vbHRfZGV2aWNlX3Jlc2V0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9SRVNFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkX2NwdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9DUFUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWRfcmFzXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18wCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkX3Jhc18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMQorI2RlZmluZSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9TV19VUEdSQURFX0FDVElWQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkX2Vwb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9FUE9OX05JCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF9tYWNfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfTUFDX0FERFJFU1MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZF9hbGFybV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfQUxBUk1fU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1RETV9DSEFOTkVMU19FWEhBVVNURURfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19URE1fQ0hBTk5FTFNfRVhIQVVTVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VTktOT1dOX0xJTktfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfbWF4X2xpbmtfdmlvbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX01BWF9MSU5LX1ZJT0xBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfcmFuZ2VfdmlvbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JBTkdFX1ZJT0xBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9yb2d1ZV92aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUk9HVUVfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkX3RkbV9jaGFubmVsc19leGhhdXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9URE1fQ0hBTk5FTFNfRVhIQVVTVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkX3Vua25vd25fbGlua192aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkX2Vwb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkX21hY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9saW5rX3JhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19SQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3N0YXRlX2ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9TVEFURV9GTEFHUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9sbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9sYXNlcl9vbl90aW1lX3RxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9sYXNlcl9vZmZfdGltZV90cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT0ZGX1RJTUVfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfcmFuZ2VfdmFsdWVfdHEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1JBTkdFX1ZBTFVFX1RRCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX2Rpc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9hbGFybV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfQUxBUk1fU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfdHVubmVsX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX21pbl9sYXNlcl9vdmVyaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9NSU5fTEFTRVJfT1ZFUkhFQUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfa2V5X2V4Y2hhbmdlX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfZXBvbl9lbmNyeXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9mZWNfZW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9vYW1faGVhcnRiZWF0X2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT0FNX0hFQVJUQkVBVF9DT05GSUcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfdXBzdHJlYW1fYmFuZHdpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF91YmRfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVUJEX0lORk8KKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9FTkFCTEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfcGVuZGluZ19ncmFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1BFTkRJTkdfR1JBTlRTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX2xpbmtfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1RZUEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2RhdGFfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9kYXRhX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2ZyYW1lc182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2ZyYW1lc182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3CisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9mcmFtZXNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2ZyYW1lc18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfZnJhbWVzXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfZnJhbWVzXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTgKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2ZyYW1lc18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3CisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9mcmFtZXNfMjA0OF80MDk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfZnJhbWVzXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2ZyYW1lc185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfb2FtX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfb2FtX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X21wY3BfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NUENQX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfYnJvYWRjYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X3VuaWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfbXVsdGljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X3JlcG9ydF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9mY3NfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9vdmVyc2l6ZV9lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X3J1bnRfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9saW5lX2NvZGVfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9saW5lX2NvZGVfZXJyb3JfbWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZGF0YV9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3R4X2RhdGFfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZnJhbWVzXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZnJhbWVzXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3R4X2ZyYW1lc18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZnJhbWVzXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9mcmFtZXNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9mcmFtZXNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZnJhbWVzXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3R4X2ZyYW1lc18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1CisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9mcmFtZXNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZnJhbWVzXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9vYW1fYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9vYW1fZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfbXBjcF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01QQ1BfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9icm9hZGNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfdW5pY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9tdWx0aWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZ2F0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkX2NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0NGR19JRF9DRkcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkX2luaXRpYWxfcmFuZ2VfdHEgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9JTklUSUFMX1JBTkdFX1RRCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfY3VycmVudF9yYW5nZV90cSAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0NVUlJFTlRfUkFOR0VfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19FTkNSWVBUSU9OX0VOQUJMRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfRkFJTFVSRV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QUEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfTElOS19ERUxFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkX3ByZXZpb3VzX3JhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZF9jdXJyZW50X3JhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfQ1VSUkVOVF9SQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19NUENQX0RFUkVHSVNURVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkX2xpbmtfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfRElTQ09WRVJFRF9JRF9MSU5LX0lORk8KKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRUdfQUNLX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19NUENQX1JFUE9SVF9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19NUENQX1JFUE9SVF9USU1FT1VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZF9saW5rX2luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURURfSURfTElOS19JTkZPCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWRfcHJvdGVjdGlvbl9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWRfcmFuZ2VfdmFsdWVfdHEgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1JBTkdFX1ZBTFVFX1RRCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX3JhbmdlX3ZhbHVlX3RxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9SQU5HRV9WQUxVRV9UUQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19SQU5HRV9WQUxVRV9DSEFOR0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfUkVSQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfZW5jcnlwdGlvbl9lbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0VOQ1JZUFRJT05fRU5BQkxFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV9zdGFydGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV9zdG9wcGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX2xpbmtfZGVsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX0RFTEVURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9saW5rX3NwZWVkX21pc21hdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19TUEVFRF9NSVNNQVRDSAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX21wY3BfZGVyZWdpc3RlcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RFUkVHSVNURVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX21wY3BfZGlzY292ZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RJU0NPVkVSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9tcGNwX3JlZ19hY2tfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9tcGNwX3JlcG9ydF90aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX29hbV9rZWVwYWxpdmVfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9yYW5nZV92YWx1ZV9jaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVkFMVUVfQ0hBTkdFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX3JlcmFuZ2VfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0RFTEVURV9MSU5LX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfRk9SQ0VfUkVESVNDT1ZFUllfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZF9wZXJpb2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfUEVSSU9ECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX3NlbmRfcGVyaW9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVF9JRF9TRU5EX1BFUklPRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX2xhc2Vyb25fdGltZV90cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9OX1RJTUVfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX2xhc2Vyb2ZmX3RpbWVfdHEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9GRl9USU1FX1RRCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZF9yYW5nZV92YWx1ZV90cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUkFOR0VfVkFMVUVfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX3BlbmRpbmdfZ3JhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9QRU5ESU5HX0dSQU5UUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWRfZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfSU5KRUNUX0ZSQU1FX0lEX0ZSQU1FCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWRfZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX0ZSQU1FCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfa2V5X2lkX2Vwb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfbWFjX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9lcG9uX25pX2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfbXR1XzFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xRworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfbXR1XzEwZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xMEcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX21pbmltdW1fZmliZXJfbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NSU5JTVVNX0ZJQkVSX0xFTkdUSAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfbWF4aW11bV9maWJlcl9sZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BWElNVU1fRklCRVJfTEVOR1RICisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9ncmFudF9zcGFjaW5nX3RxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX21wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX2FsYXJtX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfYWxsX2xpbmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMTF9MSU5LUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfZW5jcnlwdGlvbl9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VOQ1JZUFRJT05fQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9jbG9ja190cmFuc3BvcnRfY2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfZHJvcGRvd25fd2VpZ2h0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX2FwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9TT0xJQ0lURURfVVNBR0UKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX2FwcHJveGltYXRlX3RkbV91c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX25vX3JlcG9ydHNfc29ha190aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9lc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVNUSU1BVEVEX1BPTl9MQVRFTkNZX1RRCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9vbnVfdXBncmFkZV9wYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9hdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX0VOCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9hdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMUdfRU4KKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX2F1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfVEhSRVNIT0xECisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19ST0dVRV9TQ0FOXzEwR19GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9sbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTExJRAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkX2xpbmtfcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MSU5LX1JBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9saW5rX21hYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9yYW5nZV92YWx1ZV90cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfUkFOR0VfVkFMVUVfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX21wY3BfdGltZXN0YW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9NUENQX1RJTUVTVEFNUAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfTk9fUkVQT1JUU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9SRVJBTkdFX0ZBSUxVUkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkX3JldHVybl9pbmRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUk9HVUVfU0NBTl9DT01QTEVURV9JRF9SRVRVUk5fSU5EX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUk9HVUVfU0NBTl9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfbGxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfbGlua19tYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xJTktfTUFDCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfbmV3X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWRfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX2xsaWRfcXVhcmFudGluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9MTElEX1FVQVJBTlRJTkVECisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX21wY3BfdGltZXN0YW1wX2NoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX25vX3JlcG9ydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX29udV91cGdyYWRlX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF9yZXJhbmdlX2ZhaWx1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX3JvZ3VlX3NjYW5fY29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZF9tYWNfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX1JBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkX21hY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX1JBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkX21hY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZF93b3JraW5nX2xpbmtfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfV09SS0lOR19MSU5LX0lORk8KKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZF9ncmFudGVkX2xpbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfR1JBTlRFRF9MSU5LCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWRfdHJpZ2dlcl93aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfV0lEVEgKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZF90cmlnZ2VyX2RlbGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9ERUxBWQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkX3NhbXBsZV9wZXJpb2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9TQU1QTEVfUEVSSU9ECisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZF9yZXJhbmdlX2RlbHRhICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEFfSURfUkVSQU5HRV9ERUxUQQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTU9ERQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5faWRfbGxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX0xMSUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkX25ld19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfbGlzdF9vZl9vbnVfaWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZF9lcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSQorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkX2FsbF9saW5rcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9BTExfTElOS1MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX2ZlY19jb2RlX3dvcmRzX3RvdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19UT1RBTAorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX0RFQ09ERV9GQUlMUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfZmVjX3plcm9lc19jb3JyZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19aRVJPRVNfQ09SUkVDVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZF9mZWNfb25lc19jb3JyZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkX2NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19JRF9DRkcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZF9lcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSQorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkX29udV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkX2FsbF9saW5rcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9BTExfTElOS1MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9nb29kX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfZ29vZF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfb3ZlcnN6X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX09WRVJTWl9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfbm9uX2ZlY19nb29kX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfbm9uX2ZlY19nb29kX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfZ29vZF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX2ZlY19nb29kX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfZnJhbWVzX2V4Y19lcnJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0ZSQU1FU19FWENfRVJSUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfYmxrc19ub19lcnJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfTk9fRVJSUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfYmxrc19jb3JyX2VycnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfQ09SUl9FUlJTCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX2ZlY19ibGtzX3VuY29ycl9lcnJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19VTkNPUlJfRVJSUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfY29ycl9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfZmVjX2NvcnJfemVyb2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfY29ycl9vbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfT05FUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF91bmRlcnN6X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfVU5ERVJTWl9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfZXJyb3Jzel9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWRfZXBvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkkKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF9mZWNfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF9wcmJzX2dlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9mcmFtZXNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NQorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMQorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9mcmFtZXNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfZnJhbWVzXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9mcmFtZXNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2Jyb2FkY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfZGF0YV9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9tdWx0aWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX3VuaWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX29hbV9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9vYW1fZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2dhdGVfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX21wY3BfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2Fib3J0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkX2Vwb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfZmVjX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX0ZFQ19TVEFURQorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfc3luY190aW1lX3RxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUQorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfcHJic19jaGVja2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfcHJic19zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY0CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfZnJhbWVzXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfZnJhbWVzXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX2ZyYW1lc18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfZnJhbWVzXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9icm9hZGNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX2RhdGFfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfbXVsdGljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF91bmljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9tcGNwX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9vYW1fYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfb2FtX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9yZXBvcnRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX2Fib3J0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mY3NfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRkNTX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfY3JjXzhfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0NSQ184X0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfb3V0X29mX3Nsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9UCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfb3ZlcnNpemVfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfcnVudF9lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JVTlRfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWRfZXBvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkkKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfZGVmYXVsdF9mZWNfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkX3JhbWFuX21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkX3R1cmJvXzJnX21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkX3ByYnNfZ2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY0CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfZnJhbWVzXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX2ZyYW1lc181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX2ZyYW1lc18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfZnJhbWVzXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX2ZyYW1lc180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX2Jyb2FkY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9kYXRhX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfREFUQV9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfbXVsdGljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3VuaWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfb2FtX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfb2FtX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX2dhdGVfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfbXBjcF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9hYm9ydF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX2NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWRfZXBvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkkKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfZGVmYXVsdF9mZWNfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkX3N5bmNfdGltZV90cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfcHJic19jaGVja2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZF9wcmJzX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX2ZyYW1lc18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NQorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9mcmFtZXNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9mcmFtZXNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX2ZyYW1lc18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9mcmFtZXNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9icm9hZGNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZGF0YV9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0RBVEFfQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX211bHRpY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF91bmljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX21wY3BfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfb2FtX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfb2FtX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX3JlcG9ydF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9hYm9ydF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9mY3NfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9jcmNfOF9lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX291dF9vZl9zbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfb3ZlcnNpemVfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9ydW50X2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUlVOVF9FUlJPUgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3JwX2tleV9pZF9lcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9SUF9LRVlfSURfRVBPTl9OSQorI2RlZmluZSBiY21vbHRfZXBvbl9ycF9rZXlfaWRfbGlua19yYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURQorI2RlZmluZSBiY21vbHRfZXBvbl9ycF9rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUlBfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX2Jhc2VfbGxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX21wY3BfZGlzY19lbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfRU4KKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX21wY3BfZGlzY19nbnRfbGVuX3RxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfR05UX0xFTl9UUQorI2RlZmluZSBiY21vbHRfZXBvbl9ycF9jZmdfaWRfbXBjcF9yZXBvcnRfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX21heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTVBDUF9SRUdfUEVSX0RJU0NfV0lORE9XCisjZGVmaW5lIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF9tYXhfbGlua3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX0xJTktTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF9kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9SUF9DRkdfSURfREVGQVVMVF9VUFNUUkVBTV9CQU5EV0lEVEgKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX3JhdGVfb2ZfcmVmcmFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9SQVRFX09GX1JFRlJBQ1RJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncGlvX2tleV9pZF9yZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BJT19LRVlfSURfUkVTRVJWRUQKKyNkZWZpbmUgYmNtb2x0X2dwaW9fa2V5X2lkX2dwaW9faWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lECisjZGVmaW5lIGJjbW9sdF9ncGlvX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BJT19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bpb19jZmdfaWRfZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQSU9fQ0ZHX0lEX0RJUkVDVElPTgorI2RlZmluZSBiY21vbHRfZ3Bpb19jZmdfaWRfdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQSU9fQ0ZHX0lEX1ZBTFVFCisjZGVmaW5lIGJjbW9sdF9ncGlvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BJT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfYWxsb2NfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF9zbGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU0xBCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF9jb2xsZWN0X3N0YXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUworI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZF9yeF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfbmV3X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9hdmVyYWdlX25zcl91c2VkICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX2F2ZXJhZ2VfbnNyX2FsbG9jYXRlZCAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9hdmVyYWdlX3NyX3JlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfbnVtX29mX2N5Y2xlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZF9nZW1fcG9ydF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZF9jb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfZ2VtX3BvcnRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZF9kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkX3Vwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0wKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkX2RlYnVnX2Zsb3dfY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRworI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfbWFjX3RhYmxlX2VudHJ5X2xpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX01BQ19UQUJMRV9FTlRSWV9MSU1JVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZF9yeF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3J4X2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUworI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3R4X3BhY2tldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfdHhfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfY2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRworI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX25ld19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU0VUX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2NmZ19pZF9pd2ZfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2NmZ19pZF91c190cGlkX3Blcl9mbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVworI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX3VzX290YWdfZGlyZWN0X3RwaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfdXNfb3RhZ19kaXJlY3RfcGJpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2NmZ19pZF9kc190cGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRFNfVFBJRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX21hY190YWJsZV9jb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09ORklHVVJBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX2RlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJR1VSQVRJT04KKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2NmZ19pZF9tYWNfdGFibGVfY291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPVU5UCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0ZPUkJJRERFTl9WTEFOX0ZMT1dfR0VNX1JBTkdFX1NUQVJUCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfZHNfaGl0X2V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9kc19taXNzX2V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9kc19kcm9wX2R1ZV90b19taXNzX2V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9kc19kcm9wX2R1ZV90b19oaXRfZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX2RzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTQorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9uZXdfbWFjX2Rpc2NvdmVyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX21vdmVfZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9NT1ZFX0VWRU5UCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX25ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfY2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX0NGRworI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9tYWNfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfTUFDX0FERFJFU1MKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9lbnRyaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfRU5UUklFUworI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX2NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9DT05UUk9MCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWRfdmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX1ZJRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkX21hY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfaWRfZmxvd19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX0ZMT1dfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkX2dlbV9wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkX3BiaXRfY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9QQklUX0NPTlRST0wKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3ZsYW5faWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9WTEFOX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkX21hcHBpbmdfbWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF9tYXBwaW5nX3RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWRfdmxhbl9hY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWRfbWFjX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX01BQ19BRERSRVNTCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3ZsYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkX2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkX2dlbV9wb3J0X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9HRU1fUE9SVF9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19BR0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9pZF9mbG93X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRURfSURfRkxPV19JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfRFJPUFBFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfb2xkX2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfbmV3X2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkX2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQ19JRF9GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX21hY19hZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfQUdFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX21hY19kcm9wcGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX21hY19tb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfTU9WRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX25ld19tYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9ORVdfTUFDCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkX2dlbV9wb3J0X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9HRU1fUE9SVF9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF9tYWNfbGVhcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfTUFDX0xFQVJOSU5HCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF92bGFuX2FjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04KKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX3ZsYW5fdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRworI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWRfdHBpZF9pbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1RQSURfSU5ERVgKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcG9uX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2F2YWlsYWJsZV9iYW5kd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRICisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9udW1iZXJfb2ZfYWN0aXZlX29udXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9udW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9TVEFOREJZX09OVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3ByYnNfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcG9uX2Rpc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcmFuZ2luZ193aW5kb3dfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3ByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2VxZF9jeWNsZXNfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcG93ZXJfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX0xFVkVMCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9kc19mZWNfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2RyaWZ0X2NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfbG9zX2FsYXJtX3RocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2xvc19pbml0aWFsX3ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfb251X2FsYXJtc190aHJlc2hvbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfYmVyX21vbml0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9wbG9hbV9hY2tfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX29udV9hY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfc25fYWNxdWlzaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9rZXlfZXhjaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2RiYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EQkEKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3Bvd2VyX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcHJic19jaGVja2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcHJic19nZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9taW5fZGF0YV9hbGxvY19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfdXNfYmFuZHdpZHRoX2xpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfYWxsX29udXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9hbGxfbWNhc3RfZ2VtX3BvcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfZGVidWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9vbnVfdXBncmFkZV9wYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9wc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFNfQ19XQUlUX0JFRk9SRV9ERUFDVElWQVRJT05fVElNRU9VVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JJUDMyX0lORElDQVRJT05fQ09OVFJPTAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9mZWNfY29kZXdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX2ZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfYmlwOF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfQllURVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9iaXA4X2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9nZW1fcGFja2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9nZW1fZHJvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9nZW1faWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lETEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9nZW1fY29ycmVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X2dlbV9pbGxlZ2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSUxMRUdBTAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X2FsbG9jYXRpb25zX3ZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X2FsbG9jYXRpb25zX2ludmFsaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19JTlZBTElECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfcGxvYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X3Bsb2Ftc19ub25faWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9wbG9hbXNfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfcGxvYW1zX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NQVQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X29tY2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9kcm9wcGVkX3Rvb19zaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9kcm9wcGVkX3Rvb19sb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X2NyY19lcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1JTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfa2V5X2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9mcmFnbWVudHNfZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X3BhY2tldHNfZHJvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF90eF9nZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdHhfcGxvYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX1BMT0FNUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3R4X2dlbV9mcmFnbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU1fRlJBR01FTlRTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdHhfY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3R4X29tY2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3R4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RICisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdHhfZHJvcHBlZF90cGlkX21pc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdHhfZHJvcHBlZF92aWRfbWlzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX2dlbV9wb3J0X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfbG9zX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfbG9zX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0xPU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3JhbmdpbmdfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9SQU5HSU5HX1RJTUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX2xpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9vbnVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9yZXN1bHQgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF93aW5kb3dfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfV0lORE9XX1RZUEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9tZWFzdXJlbWVudF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfYWxsb2NfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX2lzX2RlbGluZWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX2lzX2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19FRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3J4X2RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfcGxvYW1fcmVjZWl2ZWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3Bsb2FtX3JlY2VpdmVkX2NyY19lcnJvciAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9DUkNfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9udW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyICAgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9lbmVyZ3lfZGV0ZWN0X3NpZ25hbCAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9wcmV2aW91c19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9uZXdfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3RvZF9zdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9zZmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU0ZDCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9ydGNfb2Zmc2V0X3NlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3J0Y19vZmZzZXRfbnNlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX05TRUMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfY3B1X3BhY2tldHNfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9lbmFibGVfYWxsX29udXNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9sb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfTE9TCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX29udV9kaXNjb3ZlcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9vbnVfdXBncmFkZV9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfdG9kX3JlcXVlc3RfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF9vbnVfc3RhdGUgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkX29udV9saXN0ICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF9fbnVtX29mICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUkVTRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3dpbmRvd190eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX2FsbG9jX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX29udV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9zZWNvbmRfcmFuZ2luZ193aW5kb3cgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9vbnVfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9wb25fc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NJTkdMRV9SRVFVRVNUX1NUQU5EQllfUE9OX01PTklUT1JJTkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9saXN0X29mX29udV9pZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfcGxvYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfcGFja2V0X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkX2NhbGNfY3JjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZF9nZW1fcG9ydF9saXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZF9idWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkX29udV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX29udV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9zZXJpYWxfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX3Bhc3N3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX2F1dG9fcGFzc3dvcmRfbGVhcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfdXNfZmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1VTX0ZFQworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX29tY2lfcG9ydF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTUNJX1BPUlRfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX2Flc19lbmNyeXB0aW9uX2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9hbGFybV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9yYW5naW5nX3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX2RlYWN0aXZhdGlvbl9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfYWxsX2dlbV9wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9hbGxfYWxsb2NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX29udV9wc190eXBlX2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfUFNfVFlQRV9DCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfZXh0ZW5kZWRfZ3VhcmRfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9mZWNfY29kZXdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9mZWNfYnl0ZXNfY29ycmVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0JZVEVTX0NPUlJFQ1RFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9mZWNfY29kZXdvcmRzX2NvcnJlY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfYmlwOF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfQllURVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfYmlwOF9lcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfRVJST1JTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3J4X3Bsb2Ftc19jcmNfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3J4X3Bsb2Ftc19ub25faWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfcG9zaXRpdmVfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX25lZ2F0aXZlX2RyaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9yeF9vbWNpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9iZXJfcmVwb3J0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQkVSX1JFUE9SVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3VucmVjZWl2ZWRfYnVyc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9VTlJFQ0VJVkVEX0JVUlNUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX2xjZGdfZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9MQ0RHX0VSUk9SUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9yZGlfZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUkRJX0VSUk9SUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9yeF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfQllURVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfcnhfcGFja2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfdHhfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3R4X3BhY2tldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9QQUNLRVRTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX2Jlcl9pbnRlcnZhbCAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9yZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfUkVTVUxUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2RmaV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ERklfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9kZmlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2RnaV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9kZ2lfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF9kcmlmdF92YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfbmV3X2VxZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX05FV19FUUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Vycl9pZF9iaXA4X2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9FUlJfSURfQklQOF9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Vycl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9FUlJfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9hbGxvY19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfQUxMT0NfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfbmV3X2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF9uZXdfa2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRURfSURfTkVXX0tFWQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfZXhwZWN0ZWRfa2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9yZWNlaXZlZF9rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfaWRfZXhwZWN0ZWRfaW5kZXggICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX0VYUEVDVEVEX0lOREVYCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9hY3R1YWxfaW5kZXggICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfQUNUVUFMX0lOREVYCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0xPQUlfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9sb2FpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfTE9BSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9sb2tpX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2xva2lfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9MT0tJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X21lbWlfaWRfcGxvYW1fYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX1BMT0FNX0JVRkZFUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX01FTUlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX2dlbV9wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9HRU1fUE9SVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9vcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfT1BFUkFUSU9OCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfZmFpbF9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRF9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWRfb251X2FsYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09QVElDQUxfUkVGTEVDVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkX2ZhaWxfcmVhc29uICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkX3Bhc3N3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9QQVNTV09SRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wZWVfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BFRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9lc3RpbWF0ZWRfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfb2xkX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfbmV3X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfcmVhc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3BzdF9pZF9saW5rX251bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfTElOS19OVU1CRVIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3BzdF9pZF9rMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzEKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3BzdF9pZF9rMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3BzdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfZmFpbF9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9udW1iZXJfb2ZfcGxvYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfZXFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfcG93ZXJfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX2JpcDhfZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JFSV9JRF9CSVA4X0VSUk9SUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JFSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9mYWlsX3JlYXNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04KKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zZGlfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkX2JlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NESV9JRF9CRVIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3NkaV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TRElfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3NmaV9pZF9iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TRklfSURfQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zZmlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N1ZmlfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NVRklfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV90aXdpX2lkX2RyaWZ0X3ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfZGZpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfZGdpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfZG93aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9FUlIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2ludmFsaWRfZGJydV9yZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9rZXlfZXhjaGFuZ2VfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENICisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfbG9haSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUkKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2xva2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0tJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9tZW1pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTUVNSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfb251X2FjdGl2YXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfYWxhcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX29udV9kaXNhYmxlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX29udV9lbmFibGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfb3B0aWNhbF9yZWZsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcGVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BFRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcG9zc2libGVfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3BzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3JhbmdpbmdfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcmVpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9zZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9zZmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3N1ZmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF90aXdpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZF9wb3dlcl9sZXZlbF9hY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWRfb251X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfcGFja2V0X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZF9jYWxjX2NyYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX251bWJlcl9vZl9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfcGFja2V0X3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZF9idWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3Bsb2FtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX3BvcnRfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX2NyY19vayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0sKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfcGFja2V0X3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX3BvcnRfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZF9jcmNfb2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZF9wYWNrZXRfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfdHJhbnNjZWl2ZXJfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9sYV9jb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfQ09ORklHVVJBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX2JjZHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQworI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX2xhX3Jlc3luY19wb2xhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFkKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9iY2RyX3Jlc3luY19wb2xhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFkKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9yeF9jb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlhfQ09ORklHVVJBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX3JhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SQU5HSU5HX0NPTlRST0xfU1RBR0VTX0NPTkZJR1VSQVRJT04KKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9lbmVyZ3lfZGV0ZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVAorI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX2VuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfREFUQV9QQVRURVJOCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SQU5HSU5HX1BBVFRFUk4KKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9wcmVhbWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9kZWxpbWl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfZ3VhcmRfYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0dVQVJEX0JJVFMKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9zZXJkZXNfY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04KKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9wbG9fcmFuZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX1JBTkdJTkcKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9wbG9fZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX0RBVEEKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9yc3NpX25vcm1hbF9jb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfUlNTSV9SRVNZTkNfQ09OVFJPTAorI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkX2xvZ19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVECisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX2RlZmF1bHRfbG9nX2xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19MRVZFTAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9kZWZhdWx0X2xvZ190eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfVFlQRQorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9sb2dfbGV2ZWxfcHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1BSSU5UCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX2xvZ19sZXZlbF9zYXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRQorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9sb2dfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1RZUEUKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWRfbG9nX3N0eWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19TVFlMRQorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9sb2dfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX05BTUUKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX21zZ19jb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9NU0dfQ09VTlQKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX2xvc3RfbXNnX2NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9MT1NUX01TR19DT1VOVAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfa2V5X2lkX3Jlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2tleV9pZF9maWxlX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2NmZ19pZF9idWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfQlVGRkVSCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfY2ZnX2lkX3dyYXBfYXJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9XUkFQX0FST1VORAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2NmZ19pZF9jbGVhcl9hZnRlcl9yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfQ0xFQVJfQUZURVJfUkVBRAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2NmZ19pZF9lbmFibGVfbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfRU5BQkxFX0xPRworI2RlZmluZSBiY21vbHRfbG9nZ2VyX2NmZ19pZF9sb2dfbmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfTE9HX05BTUVTCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfc3RhdF9pZF9saW5lc19pbl9sb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX2NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0NGR19JRF9DRkcKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfQ0xFQVJfTE9HX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9rZXlfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfbm5pX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX2NmZ19pZF9yZW1vdGVfbG9vcGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfUkVNT1RFX0xPT1BCQUNLCisjZGVmaW5lIGJjbW9sdF9ubmlfY2ZnX2lkX2xpbmVfbG9vcGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLCisjZGVmaW5lIGJjbW9sdF9ubmlfY2ZnX2lkX21hY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX0NGR19JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21vbHRfbm5pX2NmZ19pZF9ubmlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUworI2RlZmluZSBiY21vbHRfbm5pX2NmZ19pZF9ubmlfYmFja3VwX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X25uaV9jZmdfaWRfYWN0aXZlX25uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkKKyNkZWZpbmUgYmNtb2x0X25uaV9jZmdfaWRfbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUworI2RlZmluZSBiY21vbHRfbm5pX2NmZ19pZF9hdXRvc3dpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSAorI2RlZmluZSBiY21vbHRfbm5pX2NmZ19pZF9mbG93X2NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MCisjZGVmaW5lIGJjbW9sdF9ubmlfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFtZXNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0CisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFtZXNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfZnJhbWVzXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1CisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFtZXNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2ZyYW1lc181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2ZyYW1lc18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4CisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFtZXNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfZnJhbWVzXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2ZyYW1lc180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2CisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFtZXNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CWVRFUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfZ29vZF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0dPT0RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF91bmljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X211bHRpY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9icm9hZGNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfZmNzX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2NvbnRyb2xfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT05UUk9MX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfcGF1c2VfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BBVVNFX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfcGZjX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3Vuc3VwcG9ydGVkX29wY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9PUENPREUKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3Vuc3VwcG9ydGVkX2RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQQorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfYWxpZ25tZW50X2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0FMSUdOTUVOVF9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9MRU5HVEhfT1VUX09GX1JBTkdFCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9jb2RlX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X292ZXJzaXplZF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9PVkVSU0laRURfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9qYWJiZXJfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfSkFCQkVSX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfbXR1X2NoZWNrX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01UVV9DSEVDS19FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3Byb21pc2N1b3VzX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QUk9NSVNDVU9VU19GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3ZsYW5fZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9WTEFOX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfZG91YmxlX3ZsYW5fZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0RPVUJMRV9WTEFOX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfdHJ1bmNhdGVkX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1RSVU5DQVRFRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3VuZGVyc2l6ZV9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTkRFUlNJWkVfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFnbWVudGVkX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3J1bnRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhbWVzXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NAorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhbWVzXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X2ZyYW1lc18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NQorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhbWVzXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9mcmFtZXNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9mcmFtZXNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOAorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhbWVzXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X2ZyYW1lc18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1CisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9mcmFtZXNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNgorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhbWVzXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQllURVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X2dvb2RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9HT09EX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfdW5pY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9tdWx0aWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfYnJvYWRjYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X3BhdXNlX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QQVVTRV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X3BmY19mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QRkNfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9qYWJiZXJfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfSkFCQkVSX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZmNzX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZDU19FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X2NvbnRyb2xfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9DT05UUk9MX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfb3ZlcnNpemVfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX09WRVJTSVpFX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhZ21lbnRlZF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQUdNRU5URURfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9lcnJvcl9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRVJST1JfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF92bGFuX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVkxBTl9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X2RvdWJsZV92bGFuX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9ET1VCTEVfVkxBTl9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X3J1bnRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfdW5kZXJydW5fZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWRfbmV3X3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZF9saW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTElOSworI2RlZmluZSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkX3ByZXZpb3VzX2FjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9QUkVWSU9VU19BQ1RJVkUKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZF9uZXdfYWN0aXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX0FDVElWRQorI2RlZmluZSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkX3N0YXR1c19jaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUVVNfQ0hBTkdFRAorI2RlZmluZSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZF9pbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9yeF92Z2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfVkdBCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9yeF9wZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3J4X2xmcGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9MRlBGCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9yeF9kZmUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMQorI2RlZmluZSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfcnhfZGZlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3J4X2RmZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUzCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9yeF9kZmU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNAorI2RlZmluZSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfcnhfZGZlNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3R4X3ByZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QUkUKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3R4X21haW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9NQUlOCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF90eF9wb3N0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDEKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3R4X3Bvc3QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMgorI2RlZmluZSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfdHhfcG9zdDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF90eF9hbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkX3Jlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9SRVNFUlZFRAorI2RlZmluZSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkX2lkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgKKyNkZWZpbmUgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkX2VudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9FTlRSWQorI2RlZmluZSBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkX3Jlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0tFWV9JRF9SRVNFUlZFRAorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkX2RhdGFfd2luZG93ICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9EQVRBX1dJTkRPVworI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkX3N0cm9iZV93aW5kb3cgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9TVFJPQkVfV0lORE9XCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9yaXNlX21pbl9taW4gICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUlOCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9yaXNlX21pbl9tYXggICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUFYCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9yaXNlX21heF9taW4gICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUlOCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9yaXNlX21heF9tYXggICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUFYCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9mYWxsX21pbl9taW4gICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUlOCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9mYWxsX21pbl9tYXggICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9mYWxsX21heF9taW4gICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUlOCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9mYWxsX21heF9tYXggICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfcmVzdWx0ICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1JFU1VMVAorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWRfY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfdHJpZ2dlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVIKKyNkZWZpbmUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF9zdHJvYmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfd2luZG93X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1dJTkRPV19NT0RFCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkX3RyaWdnZXJfcG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfc3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUT1BfRFVFX1RPX0NPUlJVUFRfU1RST0JFCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfc3RhcnRfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUQVJUX09GRlNFVAorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkX2VuZF9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9FTkRfT0ZGU0VUCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfbnVtYmVyX29mX2N5Y2xlcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX05VTUJFUl9PRl9DWUNMRVMKKyNkZWZpbmUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWRfYWxsb2NfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZF9zbGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU0xBCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2lkX2NvbGxlY3Rfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfcnhfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfbmV3X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURQorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9hdmVyYWdlX25zcl91c2VkICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9hdmVyYWdlX25zcl9hbGxvY2F0ZWQgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX2F2ZXJhZ2Vfc3JfcmVwb3J0ICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX251bV9vZl9jeWNsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF9nZW1fcG9ydF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX2NvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX2dlbV9wb3J0X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURQorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX2VuY3J5cHRpb25fbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZF91cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZF9jb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTAorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3R4X2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUworI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF90eF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9yeF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9yeF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX2NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9JV0ZfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfdXNfb3RhZ19kaXJlY3RfdHBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfZHNfdHBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9od19wb25faWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfSFdfUE9OX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfYXZhaWxhYmxlX2JhbmR3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9udW1iZXJfb2ZfYWN0aXZlX29udXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcG9uX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9wb25fZGlzdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcmFuZ2luZ193aW5kb3dfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9lcWRfY3ljbGVzX251bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9kcmlmdF9jb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRFJJRlRfQ09OVFJPTAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2xvc19hbGFybV90aHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfbG9zX2luaXRpYWxfdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfb251X2FsYXJtc190aHJlc2hvbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2Jlcl9tb25pdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX29udV9hY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX3NuX2FjcXVpc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2tleV9leGNoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2Nicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX3Bvd2VyX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfZGJhX21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9NT0RFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcGxvYW1faGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BMT0FNX0hBTkRMSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfbWluX2RhdGFfYWxsb2NfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfbWluX2RhdGFfZ2VtX3BvcnRfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfbXVsdGljYXN0X2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9wcmJzX2NoZWNrZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcHJic19nZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcHJic19zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfdXNfYmFuZHdpZHRoX2xpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2FsbF9vbnVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfT05VUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2FsbF9tY2FzdF9nZW1fcG9ydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfZGVidWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfb251X3VwZ3JhZGVfcGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2RzX2ZlY19tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2RiYV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX29udV90dW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVFVOSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfZmVjX2NvZGV3b3JkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfYmlwMzJfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX2JpcDMyX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfeGd0Y19oZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfSEVBREVSUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF94Z3RjX2NvcnJlY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19DT1JSRUNURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfeGd0Y191bmNvcnJlY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfVU5DT1JSRUNURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfeGdlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU0KKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfeGdlbV9kcm9wcGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF94Z2VtX2lkbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9JRExFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3J4X3hnZW1fY29ycmVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0NPUlJFQ1RFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9jcmNfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3J4X2ZyYWdtZW50X2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9wYWNrZXRzX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3J4X2Ryb3BwZWRfdG9vX3Nob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9kcm9wcGVkX3Rvb19sb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9rZXlfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3R4X3Bsb2FtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfcGxvYW1zX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3J4X2FsbG9jYXRpb25zX3ZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9hbGxvY2F0aW9uc19pbnZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9hbGxvY2F0aW9uc19kaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfcGxvYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9wbG9hbXNfbm9uX2lkbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3J4X3Bsb2Ftc19lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1IKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NQVQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9vbWNpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF90eF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF90eF94Z2VtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF90eF9jcHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3R4X29tY2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3R4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEgKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfdHhfZHJvcHBlZF90cGlkX21pc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3R4X2Ryb3BwZWRfdmlkX21pc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9nZW1fcG9ydF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0VOQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfbG9zX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2xvc19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfc2VyaWFsX251bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3JhbmdpbmdfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9SQU5HSU5HX1RJTUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX29udV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9jdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9ET1dOU1RSRUFNX1BPTl9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfY3VycmVudF91cHN0cmVhbV9wb25faWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfVVBTVFJFQU1fUE9OX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9jYWxpYnJhdGlvbl9yZWNvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ0FMSUJSQVRJT05fUkVDT1JECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF90dW5pbmdfZ3JhbnVsYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVFVOSU5HX0dSQU5VTEFSSVRZCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9zdGVwX3R1bmluZ190aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU1RFUF9UVU5JTkdfVElNRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfYXR0ZW51YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0FUVEVOVUFUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX2xpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX29udXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWRfcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3dpbmRvd190eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9tZWFzdXJlbWVudF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX2FsbG9jX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX2lzX2RlbGluZWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9pc19lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfcnhfZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfcGxvYW1fcmVjZWl2ZWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9wbG9hbV9yZWNlaXZlZF9taWNfZXJyb3IgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfTUlDX0VSUk9SCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX251bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIgIEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9lbmVyZ3lfZGV0ZWN0X3NpZ25hbCAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfcHJldmlvdXNfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX25ld19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF90b2Rfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3NmYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9ydGNfb2Zmc2V0X3NlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9ydGNfb2Zmc2V0X25zZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9jcHVfcGFja2V0c19mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9sb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfTE9TCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9vbnVfZGlzY292ZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX29udV91cGdyYWRlX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9zZXJpYWxfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfU0VSSUFMX05VTUJFUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfZnJlcWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9jb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9SRVNFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3dpbmRvd190eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9hbGxvY19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9zZWNvbmRfcmFuZ2luZ193aW5kb3cgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWRfbnVtYmVyX29mX2N5Y2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX05VTUJFUl9PRl9DWUNMRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX2FsbG9jYXRpb25fbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9BTExPQ0FUSU9OX05VTUJFUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX2J3X21hcF9hcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9CV19NQVBfQVJSQVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9vbnVfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3Bvbl9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX2xpc3Rfb2Zfb251X2lkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9wbG9hbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfUExPQU0KKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3BhY2tldF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWRfY2FsY19jcmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZF9nZW1fcG9ydF9saXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWRfYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2tleV9pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX29udV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfb251X29sZF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9PTERfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfYWxhcm1fc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3JlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX2N1cnJlbnRfZW5jcnlwdGlvbl9rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DVVJSRU5UX0VOQ1JZUFRJT05fS0VZCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3JlZ2lzdHJhdGlvbl9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3JhbmdpbmdfYnVyc3RfcHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfZGF0YV9idXJzdF9wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RBVEFfQlVSU1RfUFJPRklMRQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NmZ19pZF9yYW5naW5nX3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX2Rpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfZGVhY3RpdmF0aW9uX3JlYXNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfYWxsX2dlbV9wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfYWxsX2FsbG9jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfZXh0ZW5kZWRfZ3VhcmRfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfdXNfbGluZV9yYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NmZ19pZF9jYWxpYnJhdGlvbl9yZWNvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3R1bmluZ19ncmFudWxhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfc3RlcF90dW5pbmdfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NURVBfVFVOSU5HX1RJTUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfcG9zaXRpdmVfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9uZWdhdGl2ZV9kcmlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX2RlbGltaXRlcl9taXNzX2RldGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX2JpcDMyX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3J4X3dvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfZmVjX2NvcnJlY3RlZF9zeW1ib2xzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9mZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9mZWNfY29kZXdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfZmVjX2NvcnJlY3RlZF9iaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQklUUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfeGdlbV9rZXlfZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfeGdlbV9sb3NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfcnhfcGxvYW1zX21pY19lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19NSUNfRVJST1IKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3J4X3Bsb2Ftc19ub25faWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3J4X29tY2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfcnhfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9yeF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfdHhfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF90eF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9kZmlfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X2RmaV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9ERklfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2RnaV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0RHSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9kcmlmdF92YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkX25ld19lcWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9ORVdfRVFECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfYWxsb2NfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfbmV3X2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX2V4cGVjdGVkX2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX3JlY2VpdmVkX2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9sb29jaV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfTE9PQ0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9mYWlsX3JlYXNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfcmVnaXN0cmF0aW9uX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZF9vbnVfYWxhcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9BTEFSTV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWRfc2VyaWFsX251bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZF9mYWlsX3JlYXNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF9yZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfUkVTVUxUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkX2ZhaWxfcmVhc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PUFRJQ0FMX1JFRkxFQ1RJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9lc3RpbWF0ZWRfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWRfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0ICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZF9hdHRlbnVhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfQVRURU5VQVRJT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdHkgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRZCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfb2xkX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX25ld19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfUkVBU09OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wcXNpX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wcXNpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX2ZhaWxfcmVhc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX2VxZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9FUUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9udW1iZXJfb2ZfcGxvYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3Bvd2VyX2xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkX3JlZ2lzdHJhdGlvbl9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRUdJU1RSQVRJT05fSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfZmFpbF9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZGlfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3NkaV9pZF9iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWRfZmFpbF9yZWFzb24gICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX0ZBSUxfUkVBU09OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZmlfaWRfYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3NmaV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1VGSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZF9kcmlmdF92YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV90aXdpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX2FjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9BQ0sKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWRfcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX1JFU1VMVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX2RmaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ERkkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9kZ2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREdJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfZG93aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9pbnZhbGlkX2RicnVfcmVwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9sb29jaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfTE9PQ0kKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfb251X2FsYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX29udV9kaXNhYmxlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfZW5hYmxlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19JTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfb3B0aWNhbF9yZWZsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3Bvc3NpYmxlX2RyaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1NTSUJMRV9EUklGVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9wb3dlcl9sZXZlbF9yZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTEVWRUxfUkVQT1JUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfcHFzaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9yYW5naW5nX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkFOR0lOR19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9yZWdpc3RyYXRpb25faWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkVHSVNUUkFUSU9OX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfc2RpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NESQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9zZmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3N1ZmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfdGl3aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1RJV0kKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF90dW5pbmdfcmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVFVOSU5HX1JFU1BPTlNFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWRfY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0NPTlRST0wKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkX2F0dGVudWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9BVFRFTlVBVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfR0VUX1BPV0VSX0NPTlNVTVBUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfR0VUX1BPV0VSX0xFVkVMX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWRfdGFyZ2V0X2RzX3Bvbl9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZF90YXJnZXRfdXNfcG9uX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkX3RpbWVfdG9fc3dpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9USU1FX1RPX1NXSVRDSAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkX3JvbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9ST0xMQkFDSworI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkX3NtYV9mbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SRVFVRVNUX1JFR0lTVFJBVElPTl9JRF9TTUFfRkxBRworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SRVFVRVNUX1JFR0lTVFJBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWRfbWFzdGVyX2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX01BU1RFUl9LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkX21pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NSUMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9vbnVfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2tldF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX2NhbGNfY3JjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQworI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX251bWJlcl9vZl9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2tldF9zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZF9kZWZhdWx0X2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfREVGQVVMVF9LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfcGxvYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9wb3J0X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfY3JjX29rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSworI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfcGFja2V0X3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9idWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX3BvcnRfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfY3JjX29rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSworI2RlZmluZSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX3BhY2tldF9zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fdHJ4X2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX1RSWF9LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX2J1cnN0X3Byb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX3RyYW5zY2VpdmVyX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9DT05GSUcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfdHJhbnNjZWl2ZXJfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfZGVidWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX3Jzc2lfbm9ybWFsX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfcnNzaV9yYW5naW5nX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfUkFOR0lOR19DT05GSUcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfc2VyZGVzX2NvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX2J1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFX0RFTElNSVRFUl9NQVhfRVJST1JTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX3Jhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0FUX0lOSVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfRURfRkFJTFVSRQorI2RlZmluZSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF9yZXNldF9vbl9kZWxfbWlzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfZWRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX2ludmVydF9lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9JTlZFUlRfRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfZW5kX29mX2J1cnN0X3Jlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVAorI2RlZmluZSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF90cnhfcnN0X3BvbGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWQorI2RlZmluZSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZF9pbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkX3J4X3ZnYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0EKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF9yeF9wZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfUEYKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF9yeF9sZnBmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfTEZQRgorI2RlZmluZSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkX3J4X2RmZTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxCisjZGVmaW5lIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfcnhfZGZlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF9yeF9kZmUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMworI2RlZmluZSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkX3J4X2RmZTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0CisjZGVmaW5lIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfcnhfZGZlNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF90eF9wcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFCisjZGVmaW5lIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfdHhfbWFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX01BSU4KKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF90eF9wb3N0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF90eF9wb3N0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDIKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF90eF9wb3N0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDMKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF90eF9hbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QCisjZGVmaW5lIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX19OVU1fT0YKKworLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgdHlwZSBoYXMgdGhlIGdpdmVuIHRhZy4gCisgKgorICogXHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIHRoZSBnaXZlbiB0YWcsIGZhbHNlIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb2JqX2hhc190YWcoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9vYmpfdGFnIHRhZyk7CisKKy8qKiBAfSAqLworI2VuZGlmIC8qIEJDTU9MVF9NT0RFTF9JRFNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbW9kZWxfcmV2aXNpb24uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbW9kZWxfcmV2aXNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZjkzODgwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tb2RlbF9yZXZpc2lvbi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKyAKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIAorRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyAKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisgCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyAKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2RlZmluZSBCQ01PTFRfTU9ERUxfUkVWSVNJT04gMQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tb2RlbF90eXBlcy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tb2RlbF90eXBlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZTNjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX3R5cGVzLmMKQEAgLTAsMCArMSwxMDU0ODQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2luY2x1ZGUgImJjbW9sdF9tb2RlbF90eXBlcy5oIgorI2luY2x1ZGUgImJjbW9sdF9tb2RlbF9pZHMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5X3BhY2soYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eV91bnBhY2soYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfY2ZnX2lkX3BhY2soYmNtb2x0X2FlX25pX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2NmZ19pZF91bnBhY2soYmNtb2x0X2FlX25pX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2VuX3N0YXRlX3BhY2soYmNtb2x0X2FlX25pX2VuX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2VuX3N0YXRlX3VucGFjayhiY21vbHRfYWVfbmlfZW5fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X2lkX3BhY2soYmNtb2x0X2FlX25pX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2tleV9pZF91bnBhY2soYmNtb2x0X2FlX25pX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZF9wYWNrKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19rZXlfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfcGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9hbGxvY19vcGVyYXRpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uX3VucGFjayhiY21vbHRfYWxsb2Nfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3N0YXRlX3BhY2soYmNtb2x0X2FsbG9jX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3N0YXRlX3VucGFjayhiY21vbHRfYWxsb2Nfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWxsb2NfdHlwZV9wYWNrKGJjbW9sdF9hbGxvY190eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3R5cGVfdW5wYWNrKGJjbW9sdF9hbGxvY190eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2Nhbl9wYWNrKGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuX3VucGFjayhiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlX3BhY2soYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlX3VucGFjayhiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb25fcGFjayhiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb25fdW5wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmRfcGFjayhiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF91bnBhY2soYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zaWduX3BhY2soYmNtb2x0X3NpZ24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc2lnbl91bnBhY2soYmNtb2x0X3NpZ24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc19wYWNrKGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXNfdW5wYWNrKGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbmtfdHlwZV9wYWNrKGJjbW9sdF9saW5rX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbGlua190eXBlX3VucGFjayhiY21vbHRfbGlua190eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbF9wYWNrKGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsX3VucGFjayhiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3BhY2soYmNtb2x0X2NoYW5uZWxfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9jaGFubmVsX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfa2V5X2lkX3BhY2soYmNtb2x0X2NoYW5uZWxfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9rZXlfaWRfdW5wYWNrKGJjbW9sdF9jaGFubmVsX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb25fcGFjayhiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uX3VucGFjayhiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2soYmNtb2x0X2NvbnRyb2xfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soYmNtb2x0X2NvbnRyb2xfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX21vZGVfcGFjayhiY21vbHRfZGJhX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX21vZGVfdW5wYWNrKGJjbW9sdF9kYmFfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kYmFfcmFtX3BhY2soYmNtb2x0X2RiYV9yYW0gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX3JhbV91bnBhY2soYmNtb2x0X2RiYV9yYW0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX3R5cGVfcGFjayhiY21vbHRfZGJhX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX3R5cGVfdW5wYWNrKGJjbW9sdF9kYmFfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9zdGF0dXNfcGFjayhiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rkcl90ZXN0X3N0YXR1c191bnBhY2soYmNtb2x0X2Rkcl90ZXN0X3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9yZXN1bHRfcGFjayhiY21vbHRfZGRyX3Rlc3RfcmVzdWx0IHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF91bnBhY2soYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uX3BhY2soYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbl91bnBhY2soYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZGVidWdfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2ZnX2lkX3BhY2soYmNtb2x0X2RlYnVnX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NmZ19pZF91bnBhY2soYmNtb2x0X2RlYnVnX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF9wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkX3BhY2soYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkX3VucGFjayhiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWRfcGFjayhiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfa2V5X2lkX3BhY2soYmNtb2x0X2RlYnVnX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9pZF91bnBhY2soYmNtb2x0X2RlYnVnX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkX3BhY2soYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkX3BhY2soYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWRfcGFjayhiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfaWRfcGFjayhiY21vbHRfZGV2aWNlX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fcGFjayhiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fdW5wYWNrKGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkX3BhY2soYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF91bnBhY2soYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkX3BhY2soYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWRfcGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGVfcGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGVfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfa2V5X2lkX3BhY2soYmNtb2x0X2RldmljZV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfa2V5X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zcGVlZF9wYWNrKGJjbW9sdF9ubmlfc3BlZWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NwZWVkX3VucGFjayhiY21vbHRfbm5pX3NwZWVkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9yZXNldF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV9wYWNrKGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV91bnBhY2soYmNtb2x0X2RldmljZV9yZXNldF9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWRfcGFjayhiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N0YXRlX3BhY2soYmNtb2x0X2RldmljZV9zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zdGF0ZV91bnBhY2soYmNtb2x0X2RldmljZV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZF9wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkX3BhY2soYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX2lkX3BhY2soYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sX3BhY2soYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sX3VucGFjayhiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZHJ2X2ljZl9pZF9wYWNrKGJjbW9sdF9kcnZfaWNmX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rydl9pY2ZfaWRfdW5wYWNrKGJjbW9sdF9kcnZfaWNmX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rydl9zZ2JfaWRfcGFjayhiY21vbHRfZHJ2X3NnYl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kcnZfc2diX2lkX3VucGFjayhiY21vbHRfZHJ2X3NnYl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kc192bGFuX2FjdGlvbl9wYWNrKGJjbW9sdF9kc192bGFuX2FjdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kc192bGFuX2FjdGlvbl91bnBhY2soYmNtb2x0X2RzX3ZsYW5fYWN0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3BhY2soYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3VucGFjayhiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdGZiX21vZGVfcGFjayhiY21vbHRfdGZiX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdGZiX21vZGVfdW5wYWNrKGJjbW9sdF90ZmJfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9saW1fc2VjX21vZGVfdXBfcGFjayhiY21vbHRfbGltX3NlY19tb2RlX3VwIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbV9zZWNfbW9kZV91cF91bnBhY2soYmNtb2x0X2xpbV9zZWNfbW9kZV91cCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9saW1fc2VjX21vZGVfZG5fcGFjayhiY21vbHRfbGltX3NlY19tb2RlX2RuIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbV9zZWNfbW9kZV9kbl91bnBhY2soYmNtb2x0X2xpbV9zZWNfbW9kZV9kbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94aW1fc2VjX21vZGVfcGFjayhiY21vbHRfeGltX3NlY19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hpbV9zZWNfbW9kZV91bnBhY2soYmNtb2x0X3hpbV9zZWNfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9oc2NfcmFtX3BhY2soYmNtb2x0X2hzY19yYW0gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaHNjX3JhbV91bnBhY2soYmNtb2x0X2hzY19yYW0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbGltX3JhbV9wYWNrKGJjbW9sdF9saW1fcmFtIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbV9yYW1fdW5wYWNrKGJjbW9sdF9saW1fcmFtICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xreV9yYW1fcGFjayhiY21vbHRfbGt5X3JhbSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sa3lfcmFtX3VucGFjayhiY21vbHRfbGt5X3JhbSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9taWNfcmFtX3BhY2soYmNtb2x0X21pY19yYW0gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWljX3JhbV91bnBhY2soYmNtb2x0X21pY19yYW0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeHBjc3JtX3JhbV9wYWNrKGJjbW9sdF94cGNzcm1fcmFtIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwY3NybV9yYW1fdW5wYWNrKGJjbW9sdF94cGNzcm1fcmFtICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1c19wYWNrKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzX3VucGFjayhiY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfcGFjayhiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0X3VucGFjayhiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZV9wYWNrKGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZV91bnBhY2soYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV9wYWNrKGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl8xZ190dXJib19tb2RlX3VucGFjayhiY21vbHRfZXBvbl8xZ190dXJib19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfcGFjayhiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2soYmNtb2x0X2Vwb25fbGlua19yYXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXR1c19wYWNrKGJjbW9sdF9zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdHVzX3VucGFjayhiY21vbHRfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2lkX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2tleV9jaG9pY2VfcGFjayhiY21vbHRfZXBvbl9rZXlfY2hvaWNlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2Nob2ljZV91bnBhY2soYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfcGFjayhiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGlua19pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mb19wYWNrKGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mb191bnBhY2soYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua190eXBlX3BhY2soYmNtb2x0X2Vwb25fbGlua190eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua190eXBlX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9nYXRlX21vZGVfcGFjayhiY21vbHRfbXBjcF9nYXRlX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9nYXRlX21vZGVfdW5wYWNrKGJjbW9sdF9tcGNwX2dhdGVfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzX3BhY2soYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzX3VucGFjayhiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFncyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZF9wYWNrKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX3BhY2soYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnNfcGFjayhiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9uc191bnBhY2soYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19waW5fcGFjayhiY21vbHRfZ3Bpb19waW4gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19waW5fdW5wYWNrKGJjbW9sdF9ncGlvX3BpbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3BvbGFyaXR5X3BhY2soYmNtb2x0X2dwaW9fcG9sYXJpdHkgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19wb2xhcml0eV91bnBhY2soYmNtb2x0X2dwaW9fcG9sYXJpdHkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9ycF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9ycF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcnBfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9ycF9rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9ycF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fcnBfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXh0X2lycV9wYWNrKGJjbW9sdF9leHRfaXJxIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V4dF9pcnFfdW5wYWNrKGJjbW9sdF9leHRfaXJxICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb25fcGFjayhiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uX3VucGFjayhiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb25fcGFjayhiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb25fcGFjayhiY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF90eXBlX3BhY2soYmNtb2x0X2dlbV9wb3J0X3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfdHlwZV91bnBhY2soYmNtb2x0X2dlbV9wb3J0X3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uX3BhY2soYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19jZmdfaWRfcGFjayhiY21vbHRfZ3Bpb19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwaW9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19rZXlfaWRfcGFjayhiY21vbHRfZ3Bpb19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2tleV9pZF91bnBhY2soYmNtb2x0X2dwaW9fa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19waW5fZGlyX3BhY2soYmNtb2x0X2dwaW9fcGluX2RpciB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3Bpbl9kaXJfdW5wYWNrKGJjbW9sdF9ncGlvX3Bpbl9kaXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb192YWx1ZV9wYWNrKGJjbW9sdF9ncGlvX3ZhbHVlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fdmFsdWVfdW5wYWNrKGJjbW9sdF9ncGlvX3ZhbHVlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZF9wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZF9wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2tleV9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV9wYWNrKGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV91bnBhY2soYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2tleV9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9sb3NfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9sb3NfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfbG9zX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfcmVzZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX3BhY2soYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RmaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9kZmlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZmlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9kZmlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZ2lfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9kb3dpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2Rvd2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcnJfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25fb251X2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xvYWlfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xvYWlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2FpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9sb2tpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2xva2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2lkX3BhY2soYmNtb2x0X2dwb25fb251X21lbWlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX3BhY2soYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX3BhY2soYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BlZV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9wZWVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wZWVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9wZWVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkX3BhY2soYmNtb2x0X2dwb25fb251X3BzdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BzdF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3BzdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JlaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9yZWlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yZWlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9yZWlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3BhY2soYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NkaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zZGlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZGlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zZGlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NmaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zZmlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZmlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zZmlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3N1ZmlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV90aXdpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb21jaV9kZXZpY2VfaWRfcGFjayhiY21vbHRfb21jaV9kZXZpY2VfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb21jaV9kZXZpY2VfaWRfdW5wYWNrKGJjbW9sdF9vbWNpX2RldmljZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlX3BhY2soYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV91bnBhY2soYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb21jaV9yZXN1bHRfY29kZV9wYWNrKGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29tY2lfcmVzdWx0X2NvZGVfdW5wYWNrKGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9zdGF0ZV9wYWNrKGJjbW9sdF9vbnVfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3N0YXRlX3VucGFjayhiY21vbHRfb251X3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jzc2lfbG9jYXRpb25fc2lnbl9wYWNrKGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduX3VucGFjayhiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlX3BhY2soYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlX3VucGFjayhiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2tleV9pZF9wYWNrKGJjbW9sdF9ncG9uX3RyeF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX3RyeF9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfcGFjayhiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1c191bnBhY2soYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pd2ZfbW9kZV9wYWNrKGJjbW9sdF9pd2ZfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pd2ZfbW9kZV91bnBhY2soYmNtb2x0X2l3Zl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfcGFjayhiY21vbHRfbG9nX2VudHJ5X2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19maWxlX2lkX3BhY2soYmNtb2x0X2xvZ19maWxlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19maWxlX2lkX3VucGFjayhiY21vbHRfbG9nX2ZpbGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2xldmVsX3BhY2soYmNtb2x0X2xvZ19sZXZlbCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfbGV2ZWxfdW5wYWNrKGJjbW9sdF9sb2dfbGV2ZWwgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX3N0eWxlX3BhY2soYmNtb2x0X2xvZ19zdHlsZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfc3R5bGVfdW5wYWNrKGJjbW9sdF9sb2dfc3R5bGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX3R5cGVfcGFjayhiY21vbHRfbG9nX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX3R5cGVfdW5wYWNrKGJjbW9sdF9sb2dfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2NmZ19pZF9wYWNrKGJjbW9sdF9sb2dnZXJfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2NmZ19pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfaWRfcGFjayhiY21vbHRfbG9nZ2VyX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfaWRfdW5wYWNrKGJjbW9sdF9sb2dnZXJfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrX3BhY2soYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrX3VucGFjayhiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2sgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGVfcGFjayhiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGVfdW5wYWNrKGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2RfcGFjayhiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZF91bnBhY2soYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfbm5pX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfbm5pX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19pZF9wYWNrKGJjbW9sdF9ubmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19pZF91bnBhY2soYmNtb2x0X25uaV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfY29ubmVjdGlvbl9wYWNrKGJjbW9sdF9ubmlfY29ubmVjdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfY29ubmVjdGlvbl91bnBhY2soYmNtb2x0X25uaV9jb25uZWN0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9rZXlfaWRfcGFjayhiY21vbHRfbm5pX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ubmlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJpdmFsZW50X3BhY2soYmNtb2x0X3RyaXZhbGVudCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cml2YWxlbnRfdW5wYWNrKGJjbW9sdF90cml2YWxlbnQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfcGFjayhiY21vbHRfbm5pX3NlcmRlc19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF91bnBhY2soYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWRfcGFjayhiY21vbHRfbm5pX3NlcmRlc19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZF91bnBhY2soYmNtb2x0X25uaV9zZXJkZXNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X25uaV9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X25uaV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2lkX3BhY2soYmNtb2x0X25uaV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZF9wYWNrKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vZG5fY2xhc3NfcGFjayhiY21vbHRfb2RuX2NsYXNzIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29kbl9jbGFzc191bnBhY2soYmNtb2x0X29kbl9jbGFzcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uX3BhY2soYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X29wZXJhdGlvbl9wYWNrKGJjbW9sdF9vbnVfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9vbnVfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3dlcl9sZXZlbF9wYWNrKGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWwgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvd2VyX2xldmVsX3VucGFjayhiY21vbHRfb251X3Bvd2VyX2xldmVsICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RjX3Byb3RvY29sX3BhY2soYmNtb2x0X3RjX3Byb3RvY29sIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RjX3Byb3RvY29sX3VucGFjayhiY21vbHRfdGNfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl9wYWNrKGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3JfdW5wYWNrKGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BhY2tldF90eXBlX3BhY2soYmNtb2x0X3BhY2tldF90eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BhY2tldF90eXBlX3VucGFjayhiY21vbHRfcGFja2V0X3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb2xhcml0eV9wYWNrKGJjbW9sdF9wb2xhcml0eSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb2xhcml0eV91bnBhY2soYmNtb2x0X3BvbGFyaXR5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWxfcGFjayhiY21vbHRfcG9sbGluZ19pbnRlcnZhbCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfczMyKGJ1ZiwgKGludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9sbGluZ19pbnRlcnZhbF91bnBhY2soYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWwgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfczMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vcGVyYXRpb25fcGFjayhiY21vbHRfcG9uX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fb3BlcmF0aW9uX3VucGFjayhiY21vbHRfcG9uX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9uc19wYWNrKGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3VucGFjayhiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fc3RhdGVfcGFjayhiY21vbHRfcG9uX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9zdGF0ZV91bnBhY2soYmNtb2x0X3Bvbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbF9wYWNrKGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbF91bnBhY2soYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb25fcGFjayhiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uX3VucGFjayhiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX3BvbHlub21pYWxfcGFjayhiY21vbHRfcHJic19wb2x5bm9taWFsIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfcG9seW5vbWlhbF91bnBhY2soYmNtb2x0X3ByYnNfcG9seW5vbWlhbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZV9wYWNrKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZV91bnBhY2soYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfbG9ja19zdGF0ZV9wYWNrKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19sb2NrX3N0YXRlX3VucGFjayhiY21vbHRfcHJic19sb2NrX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV9wYWNrKGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlX3VucGFjayhiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3JfcGFjayhiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcl91bnBhY2soYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbl9wYWNrKGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jlc3VsdF9wYWNrKGJjbW9sdF9yZXN1bHQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmVzdWx0X3VucGFjayhiY21vbHRfcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZV9wYWNrKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlX3VucGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3VucGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHRfcGFjayhiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0IHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdF91bnBhY2soYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1c19wYWNrKGJjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1cyB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1c191bnBhY2soYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3BhY2soYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZV9wYWNrKGJjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGVfdW5wYWNrKGJjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19pbnN0YW5jZV9wYWNrKGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc2VyZGVzX2luc3RhbmNlX3VucGFjayhiY21vbHRfc2VyZGVzX2luc3RhbmNlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NoYXBlcl9tb2RlX3BhY2soYmNtb2x0X3NoYXBlcl9tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NoYXBlcl9tb2RlX3VucGFjayhiY21vbHRfc2hhcGVyX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkX3BhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZF91bnBhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZF9wYWNrKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWRfdW5wYWNrKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlX3BhY2soYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZV91bnBhY2soYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV9wYWNrKGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGVfdW5wYWNrKGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N5c3RlbV9tb2RlX3BhY2soYmNtb2x0X3N5c3RlbV9tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N5c3RlbV9tb2RlX3VucGFjayhiY21vbHRfc3lzdGVtX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHNfcGFjayhiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHNfdW5wYWNrKGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHRfcGFjayhiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdF91bnBhY2soYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkX3BhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkX3BhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3BhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb25fcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb25fdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGVfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZV91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfdHlwZV9wYWNrKGJjbW9sdF90cnhfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfdHlwZV91bnBhY2soYmNtb2x0X3RyeF90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90dW5lX2luX2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl9wYWNrKGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X3R1bmVfb3V0X2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VhcnRfYmF1ZHJhdGVfcGFjayhiY21vbHRfdWFydF9iYXVkcmF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91YXJ0X2JhdWRyYXRlX3VucGFjayhiY21vbHRfdWFydF9iYXVkcmF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl9wYWNrKGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl91bnBhY2soYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VzX3ZsYW5fYWN0aW9uX3BhY2soYmNtb2x0X3VzX3ZsYW5fYWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VzX3ZsYW5fYWN0aW9uX3VucGFjayhiY21vbHRfdXNfdmxhbl9hY3Rpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3BhY2soYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2RfdW5wYWNrKGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfcGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfcGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZV9wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25faXdmX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2tleV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2tleV9pZF91bnBhY2soYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfbG9zX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX2xvc19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2xvc19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2xvc19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcmVzZXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbnVtX29mX29udXNfcGFjayhiY21vbHRfeGdwb25fbnVtX29mX29udXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbnVtX29mX29udXNfdW5wYWNrKGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2RmaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RnaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RnaV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZ2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2Rvd2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9sb29jaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wcXNpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9wcXNpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZGlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3NmaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zdWZpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV90aXdpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Rpd2lfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZV9wYWNrKGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fdHJ4X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2tleV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2tleV9pZF91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfdHlwZV9wYWNrKGJjbW9sdF94Z3Bvbl90cnhfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfdHlwZV91bnBhY2soYmNtb2x0X3hncG9uX3RyeF90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF9wYWNrKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfdW5wYWNrKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWRfcGFjayhiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkX3VucGFjayhiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcl9zZXRfZGVmYXVsdChiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciAqdGhpcykKK3sKKyAgICB0aGlzLT5hY3R1YWxfbWJzX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfcGFjayhjb25zdCBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmFjdHVhbF9tYnNfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmFjdHVhbF93ZWlnaHRfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcl91bnBhY2soYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmFjdHVhbF9tYnNfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+YWN0dWFsX3dlaWdodF90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Flc19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Flc19rZXkgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+Ynl0ZXMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Flc19rZXlfcGFjayhjb25zdCBiY21vbHRfYWVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPmJ5dGVzLCAxNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZXNfa2V5X3VucGFjayhiY21vbHRfYWVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+Ynl0ZXMsIDE2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Flc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZXNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVzX2tleSAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfc2V0X2RlZmF1bHQoYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgKnRoaXMpCit7CisgICAgdGhpcy0+b2Zmc2V0ID0gMDsKKyAgICB0aGlzLT5zaXplID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfcGFjayhjb25zdCBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfdW5wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm9mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlcl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5sb2NhdGlvbiA9IEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9ERVZJQ0U7CisgICAgdGhpcy0+YnVmZmVyX3NpemVfYnl0ZXMgPSAxNjM4NDsKKyAgICB0aGlzLT5idWZmZXJfbW9kZSA9IEJDTU9MVF9BUElfQ0FQVFVSRV9CVUZGRVJfTU9ERV9XUkFQOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnX3BhY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3BhY2sodGhpcy0+bG9jYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJ1ZmZlcl9zaXplX2J5dGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZV9wYWNrKHRoaXMtPmJ1ZmZlcl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnX3VucGFjayhiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb25fdW5wYWNrKCZ0aGlzLT5sb2NhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YnVmZmVyX3NpemVfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlX3VucGFjaygmdGhpcy0+YnVmZmVyX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmxvY2F0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fREVWSUNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX0hPU1Q6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+YnVmZmVyX3NpemVfYnl0ZXMgPCAxNjM4NCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJ1ZmZlcl9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQVBJX0NBUFRVUkVfQlVGRkVSX01PREVfT1ZFUkZMT1c6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQVBJX0NBUFRVUkVfQlVGRkVSX01PREVfV1JBUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfc2V0X2RlZmF1bHQoYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzICp0aGlzKQoreworICAgIHRoaXMtPmJ1ZmZlcl91c2VkX2J5dGVzID0gMDsKKyAgICB0aGlzLT5idWZmZXJfd3JhcF9jb3VudCA9IDA7CisgICAgdGhpcy0+ZXZlbnRzX3JlY29yZGVkID0gMDsKKyAgICB0aGlzLT5ldmVudHNfZHJvcHBlZCA9IDA7CisgICAgdGhpcy0+cmVhZGFibGVfYnl0ZXMgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfcGFjayhjb25zdCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YnVmZmVyX3VzZWRfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5idWZmZXJfd3JhcF9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmV2ZW50c19yZWNvcmRlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmV2ZW50c19kcm9wcGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmVhZGFibGVfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfdW5wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5idWZmZXJfdXNlZF9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJ1ZmZlcl93cmFwX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZXZlbnRzX3JlY29yZGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZXZlbnRzX2Ryb3BwZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZWFkYWJsZV9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ib3VuZHNfc2V0X2RlZmF1bHQoYmNtb2x0X2JvdW5kcyAqdGhpcykKK3sKKyAgICB0aGlzLT5iZXN0X2Nhc2UgPSAwOworICAgIHRoaXMtPndvcnN0X2Nhc2UgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYm91bmRzX3BhY2soY29uc3QgYmNtb2x0X2JvdW5kcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iZXN0X2Nhc2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT53b3JzdF9jYXNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JvdW5kc191bnBhY2soYmNtb2x0X2JvdW5kcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5iZXN0X2Nhc2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT53b3JzdF9jYXNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JvdW5kc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYm91bmRzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYm91bmRzICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX2JvdW5kc184X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfYm91bmRzXzggKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmFyciwgMCwgc2l6ZW9mKHRoaXMtPmFycikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2JvdW5kc184X3BhY2soY29uc3QgYmNtb2x0X2Fycl9ib3VuZHNfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ib3VuZHNfcGFjaygmdGhpcy0+YXJyW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfYm91bmRzXzhfdW5wYWNrKGJjbW9sdF9hcnJfYm91bmRzXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYm91bmRzX3VucGFjaygmdGhpcy0+YXJyW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9ib3VuZHNfOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDY0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9ib3VuZHNfOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl9ib3VuZHNfOCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9zZXRfZGVmYXVsdChiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84ICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5hcnIsIDAsIHNpemVvZih0aGlzLT5hcnIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkX3BhY2sodGhpcy0+YXJyW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzhfdW5wYWNrKGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkX3VucGFjaygmdGhpcy0+YXJyW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXRfc2V0X2RlZmF1bHQoYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQgKnRoaXMpCit7CisgICAgdGhpcy0+c2lnbiA9IEJDTU9MVF9TSUdOX1BPU0lUSVZFOworICAgIHRoaXMtPnZhbHVlID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXRfcGFjayhjb25zdCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3NpZ25fcGFjayh0aGlzLT5zaWduLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXRfdW5wYWNrKGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfc2lnbl91bnBhY2soJnRoaXMtPnNpZ24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5zaWduKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU0lHTl9QT1NJVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TSUdOX05FR0FUSVZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfc2V0X2RlZmF1bHQoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSAqdGhpcykKK3sKKyAgICB0aGlzLT52ZXJzaW9uID0gMDsKKyAgICB0aGlzLT5jaGFubmVsX2luZGV4ID0gMDsKKyAgICB0aGlzLT5kc19mcmVxdWVuY3lfb2Zmc2V0LnNpZ24gPSBCQ01PTFRfU0lHTl9QT1NJVElWRTsKKyAgICB0aGlzLT5kc19mcmVxdWVuY3lfb2Zmc2V0LnZhbHVlID0gMDsKKyAgICB0aGlzLT5jaGFubmVsX3BhcnRpdGlvbiA9IDA7CisgICAgdGhpcy0+dXdsY2hfaWQgPSAwOworICAgIHRoaXMtPnVzX2ZyZXF1ZW5jeSA9IDA7CisgICAgdGhpcy0+dXNfcmF0ZSA9IEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMl9QXzVfRzsKKyAgICB0aGlzLT5kZWZhdWx0X29udV9hdHRlbnVhdGlvbiA9IDA7CisgICAgdGhpcy0+cmVzcG9uc2VfdGhyZXNob2xkID0gMDsKKyAgICB0aGlzLT51c19saW5rX3R5cGUgPSBCQ01PTFRfTElOS19UWVBFX1VOU1BFQ0lGSUVEOworICAgIHRoaXMtPmlzX3ZhbGlkID0gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfcHJvZmlsZV9wYWNrKGNvbnN0IGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT52ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jaGFubmVsX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X3BhY2soJnRoaXMtPmRzX2ZyZXF1ZW5jeV9vZmZzZXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y2hhbm5lbF9wYXJ0aXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnV3bGNoX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dXNfZnJlcXVlbmN5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzX3BhY2sodGhpcy0+dXNfcmF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kZWZhdWx0X29udV9hdHRlbnVhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmVzcG9uc2VfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9saW5rX3R5cGVfcGFjayh0aGlzLT51c19saW5rX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pc192YWxpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfdW5wYWNrKGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT52ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jaGFubmVsX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X3VucGFjaygmdGhpcy0+ZHNfZnJlcXVlbmN5X29mZnNldCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNoYW5uZWxfcGFydGl0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT51d2xjaF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnVzX2ZyZXF1ZW5jeSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc191bnBhY2soJnRoaXMtPnVzX3JhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlc3BvbnNlX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGlua190eXBlX3VucGFjaygmdGhpcy0+dXNfbGlua190eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfdmFsaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9wcm9maWxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9wcm9maWxlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfY2hhbm5lbF9wcm9maWxlICp0aGlzKQoreworICAgIGlmICh0aGlzLT52ZXJzaW9uID4gMTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmNoYW5uZWxfaW5kZXggPiAxNSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X2JvdW5kc19jaGVjaygmdGhpcy0+ZHNfZnJlcXVlbmN5X29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmNoYW5uZWxfcGFydGl0aW9uID4gMTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnV3bGNoX2lkID4gMTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT51c19yYXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFU19SQVRFXzJfUF81X0c6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFU19SQVRFXzEwX0c6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+ZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24gPiA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXNfbGlua190eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElOS19UWVBFX1VOU1BFQ0lGSUVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTktfVFlQRV9COgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTktfVFlQRV9BOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTktfVFlQRV9BX0FORF9COgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+YXJyLCAwLCBzaXplb2YodGhpcy0+YXJyKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfcGFjayhjb25zdCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NoYW5uZWxfcHJvZmlsZV9wYWNrKCZ0aGlzLT5hcnJbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOF91bnBhY2soYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfdW5wYWNrKCZ0aGlzLT5hcnJbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0X3NldF9kZWZhdWx0KGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCAqdGhpcykKK3sKKyAgICB0aGlzLT5kc193YXZlbGVuZ3RoX2NoYW5uZWxfaWQgPSAwOworICAgIHRoaXMtPnVzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZCA9IDA7CisgICAgdGhpcy0+cG93ZXJfY29uc3VtcHRpb24gPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfcGFjayhjb25zdCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kc193YXZlbGVuZ3RoX2NoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnVzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0X3VucGFjayhiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kc193YXZlbGVuZ3RoX2NoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnVzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0Xzhfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84ICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5hcnIsIDAsIHNpemVvZih0aGlzLT5hcnIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X3BhY2soY29uc3QgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0X3BhY2soJnRoaXMtPmFycltpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzhfdW5wYWNrKGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF91bnBhY2soJnRoaXMtPmFycltpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzggKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcnJfdTE2XzJfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91MTZfMiAqdGhpcykKK3sKKyAgICB0aGlzLT5hcnJbMF0gPSA0MDk2OworICAgIHRoaXMtPmFyclsxXSA9IDgxOTI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfcGFjayhjb25zdCBiY21vbHRfYXJyX3UxNl8yICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5hcnJbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCAyOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmFycltpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3UxNl8yICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3UxNl8yX2hleF9zZXRfZGVmYXVsdChiY21vbHRfYXJyX3UxNl8yX2hleCAqdGhpcykKK3sKKyAgICB0aGlzLT5hcnJbMF0gPSAzMzAyNFU7CisgICAgdGhpcy0+YXJyWzFdID0gMzMwMjRVOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX2hleF9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfdTE2XzJfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5hcnJbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfaGV4X3VucGFjayhiY21vbHRfYXJyX3UxNl8yX2hleCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDI7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+YXJyW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX2hleF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX2hleF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91MTZfMl9oZXggKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdTE2XzVfaGV4ICp0aGlzKQoreworICAgIHRoaXMtPmFyclswXSA9IDMzMDI0VTsKKyAgICB0aGlzLT5hcnJbMV0gPSAzNDk4NFU7CisgICAgdGhpcy0+YXJyWzJdID0gMzcxMjBVOworICAgIHRoaXMtPmFyclszXSA9IDM3Mzc2VTsKKyAgICB0aGlzLT5hcnJbNF0gPSAzMzAyNFU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3BhY2soY29uc3QgYmNtb2x0X2Fycl91MTZfNV9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA1OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmFycltpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfNV9oZXhfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzVfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgNTsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5hcnJbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl81X2hleF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91MTZfNV9oZXggKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcnJfdTE2Xzdfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91MTZfNyAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+YXJyLCAwLCBzaXplb2YodGhpcy0+YXJyKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzdfcGFjayhjb25zdCBiY21vbHRfYXJyX3UxNl83ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgNzsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5hcnJbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzdfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA3OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmFycltpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfN19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfN19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91MTZfNyAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Fycl91MzJfNl9zZXRfZGVmYXVsdChiY21vbHRfYXJyX3UzMl82ICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5hcnIsIDAsIHNpemVvZih0aGlzLT5hcnIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MzJfNl9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfdTMyXzYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA2OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmFycltpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MzJfNl91bnBhY2soYmNtb2x0X2Fycl91MzJfNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDY7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YXJyW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UzMl82X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UzMl82X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3UzMl82ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3U4XzEwX3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfMTAgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmFyciwgMCwgc2l6ZW9mKHRoaXMtPmFycikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEwX3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF8xMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPmFyciwgMTApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEwX3VucGFjayhiY21vbHRfYXJyX3U4XzEwICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5hcnIsIDEwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91OF8xMCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Fycl91OF8xMl9zZXRfZGVmYXVsdChiY21vbHRfYXJyX3U4XzEyICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5hcnIsIDAsIHNpemVvZih0aGlzLT5hcnIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMl9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfdThfMTIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5hcnIsIDEyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMl91bnBhY2soYmNtb2x0X2Fycl91OF8xMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+YXJyLCAxMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfdThfMTIgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcnJfdThfMTNfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91OF8xMyAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+YXJyLCAwLCBzaXplb2YodGhpcy0+YXJyKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTNfcGFjayhjb25zdCBiY21vbHRfYXJyX3U4XzEzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+YXJyLCAxMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTNfdW5wYWNrKGJjbW9sdF9hcnJfdThfMTMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPmFyciwgMTMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3U4XzEzICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3U4XzM2X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfMzYgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmFyciwgMCwgc2l6ZW9mKHRoaXMtPmFycikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzM2X3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF8zNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPmFyciwgMzYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzM2X3VucGFjayhiY21vbHRfYXJyX3U4XzM2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5hcnIsIDM2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8zNl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDM2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8zNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91OF8zNiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Fycl91OF80X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfNCAqdGhpcykKK3sKKyAgICB0aGlzLT5hcnJbMF0gPSA3OworICAgIHRoaXMtPmFyclsxXSA9IDc7CisgICAgdGhpcy0+YXJyWzJdID0gNzsKKyAgICB0aGlzLT5hcnJbM10gPSA3OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzRfcGFjayhjb25zdCBiY21vbHRfYXJyX3U4XzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5hcnIsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzRfdW5wYWNrKGJjbW9sdF9hcnJfdThfNCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+YXJyLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF80X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfNF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91OF80ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3U4XzQwX3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfNDAgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmFyciwgMCwgc2l6ZW9mKHRoaXMtPmFycikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzQwX3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF80MCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPmFyciwgNDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzQwX3VucGFjayhiY21vbHRfYXJyX3U4XzQwICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5hcnIsIDQwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF80MF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF80MF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91OF80MCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgKnRoaXMpCit7CisgICAgdGhpcy0+cHJvZmlsZV92ZXJzaW9uID0gMDsKKyAgICB0aGlzLT5pc19mZWNfb24gPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDA7CisgICAgdGhpcy0+ZGVsaW1pdGVyX3BhdHRlcm5faGlnaCA9IDA7CisgICAgdGhpcy0+ZGVsaW1pdGVyX3BhdHRlcm5fbG93ID0gODsKKyAgICB0aGlzLT5wcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMgPSA4OworICAgIHRoaXMtPnByZWFtYmxlX3JlcGVhdHNfY291bnQgPSAwOworICAgIHRoaXMtPnByZWFtYmxlX3BhdHRlcm5faGlnaCA9IDA7CisgICAgdGhpcy0+cHJlYW1ibGVfcGF0dGVybl9sb3cgPSAwOworICAgIHRoaXMtPnBvbl90YWcgPSAwOworICAgIHRoaXMtPm51bV9vZl9ndWFyZF9ieXRlcyA9IDA7CisgICAgdGhpcy0+aXNfcHJvZmlsZV92YWxpZCA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cHJvZmlsZV92ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmlzX2ZlY19vbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZGVsaW1pdGVyX3BhdHRlcm5fbG93KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnByZWFtYmxlX3JlcGVhdHNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2gpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wcmVhbWJsZV9wYXR0ZXJuX2xvdykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnBvbl90YWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5udW1fb2ZfZ3VhcmRfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfcHJvZmlsZV92YWxpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZV91bnBhY2soYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wcm9maWxlX3ZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfZmVjX29uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2gpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5kZWxpbWl0ZXJfcGF0dGVybl9sb3cpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cHJlYW1ibGVfcmVwZWF0c19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnByZWFtYmxlX3BhdHRlcm5faGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnByZWFtYmxlX3BhdHRlcm5fbG93KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cG9uX3RhZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm51bV9vZl9ndWFyZF9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pc19wcm9maWxlX3ZhbGlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMzgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmRlbGltaXRlcl9zaXplX2luX2J5dGVzID4gOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+cHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzIDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+cHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID4gOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgKnRoaXMpCit7CisgICAgdGhpcy0+YXJyWzBdLnByb2ZpbGVfdmVyc2lvbiA9IDA7CisgICAgdGhpcy0+YXJyWzBdLmlzX2ZlY19vbiA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFyclswXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgdGhpcy0+YXJyWzBdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgdGhpcy0+YXJyWzBdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICB0aGlzLT5hcnJbMF0ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICB0aGlzLT5hcnJbMF0ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDIwOworICAgIHRoaXMtPmFyclswXS5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2ggPSAyODYzMzExNTMwVUw7CisgICAgdGhpcy0+YXJyWzBdLnByZWFtYmxlX3BhdHRlcm5fbG93ID0gMjg2MzMxMTUzMFVMOworICAgIHRoaXMtPmFyclswXS5wb25fdGFnID0gMDsKKyAgICB0aGlzLT5hcnJbMF0ubnVtX29mX2d1YXJkX2J5dGVzID0gMTY7CisgICAgdGhpcy0+YXJyWzBdLmlzX3Byb2ZpbGVfdmFsaWQgPSBCQ01PU19UUlVFOworICAgIHRoaXMtPmFyclswXS5idXJzdF9vdmVyaGVhZF9zaXplX2luX3dvcmRzID0gNzg7CisgICAgdGhpcy0+YXJyWzFdLnByb2ZpbGVfdmVyc2lvbiA9IDA7CisgICAgdGhpcy0+YXJyWzFdLmlzX2ZlY19vbiA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFyclsxXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgdGhpcy0+YXJyWzFdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgdGhpcy0+YXJyWzFdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICB0aGlzLT5hcnJbMV0ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICB0aGlzLT5hcnJbMV0ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDk7CisgICAgdGhpcy0+YXJyWzFdLnByZWFtYmxlX3BhdHRlcm5faGlnaCA9IDI4NjMzMTE1MzBVTDsKKyAgICB0aGlzLT5hcnJbMV0ucHJlYW1ibGVfcGF0dGVybl9sb3cgPSAyODYzMzExNTMwVUw7CisgICAgdGhpcy0+YXJyWzFdLnBvbl90YWcgPSAwOworICAgIHRoaXMtPmFyclsxXS5udW1fb2ZfZ3VhcmRfYnl0ZXMgPSAxNjsKKyAgICB0aGlzLT5hcnJbMV0uaXNfcHJvZmlsZV92YWxpZCA9IEJDTU9TX1RSVUU7CisgICAgdGhpcy0+YXJyWzFdLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgPSA1NjsKKyAgICB0aGlzLT5hcnJbMl0ucHJvZmlsZV92ZXJzaW9uID0gMDsKKyAgICB0aGlzLT5hcnJbMl0uaXNfZmVjX29uID0gQkNNT1NfVFJVRTsKKyAgICB0aGlzLT5hcnJbMl0uZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMgPSA4OworICAgIHRoaXMtPmFyclsyXS5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoID0gMzAxNTU2MjAwMFVMOworICAgIHRoaXMtPmFyclsyXS5kZWxpbWl0ZXJfcGF0dGVybl9sb3cgPSAyOTk5MjU5MDQxVUw7CisgICAgdGhpcy0+YXJyWzJdLnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcyA9IDg7CisgICAgdGhpcy0+YXJyWzJdLnByZWFtYmxlX3JlcGVhdHNfY291bnQgPSAyMDsKKyAgICB0aGlzLT5hcnJbMl0ucHJlYW1ibGVfcGF0dGVybl9oaWdoID0gMjg2MzMxMTUzMFVMOworICAgIHRoaXMtPmFyclsyXS5wcmVhbWJsZV9wYXR0ZXJuX2xvdyA9IDI4NjMzMTE1MzBVTDsKKyAgICB0aGlzLT5hcnJbMl0ucG9uX3RhZyA9IDA7CisgICAgdGhpcy0+YXJyWzJdLm51bV9vZl9ndWFyZF9ieXRlcyA9IDE2OworICAgIHRoaXMtPmFyclsyXS5pc19wcm9maWxlX3ZhbGlkID0gQkNNT1NfVFJVRTsKKyAgICB0aGlzLT5hcnJbMl0uYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyA9IDc4OworICAgIHRoaXMtPmFyclszXS5wcm9maWxlX3ZlcnNpb24gPSAwOworICAgIHRoaXMtPmFyclszXS5pc19mZWNfb24gPSBCQ01PU19UUlVFOworICAgIHRoaXMtPmFyclszXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgdGhpcy0+YXJyWzNdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgdGhpcy0+YXJyWzNdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICB0aGlzLT5hcnJbM10ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICB0aGlzLT5hcnJbM10ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDk7CisgICAgdGhpcy0+YXJyWzNdLnByZWFtYmxlX3BhdHRlcm5faGlnaCA9IDI4NjMzMTE1MzBVTDsKKyAgICB0aGlzLT5hcnJbM10ucHJlYW1ibGVfcGF0dGVybl9sb3cgPSAyODYzMzExNTMwVUw7CisgICAgdGhpcy0+YXJyWzNdLnBvbl90YWcgPSAwOworICAgIHRoaXMtPmFyclszXS5udW1fb2ZfZ3VhcmRfYnl0ZXMgPSAxNjsKKyAgICB0aGlzLT5hcnJbM10uaXNfcHJvZmlsZV92YWxpZCA9IEJDTU9TX1RSVUU7CisgICAgdGhpcy0+YXJyWzNdLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgPSA1NjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfcGFjayhjb25zdCBiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX3BhY2soJnRoaXMtPmFycltpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNF91bnBhY2soYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZV91bnBhY2soJnRoaXMtPmFycltpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTUyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gMDsKKyAgICB0aGlzLT50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAwOworICAgIHRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgIHRoaXMtPnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IDA7CisgICAgdGhpcy0+dHJ4X3Jlc2V0X2xvY2F0aW9uID0gMDsKKyAgICB0aGlzLT50cnhfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICB0aGlzLT5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gMDsKKyAgICB0aGlzLT5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMDsKKyAgICB0aGlzLT5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50cnhfcmVzZXRfcGF0dGVybl9maXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnRyeF9yZXNldF9sb2NhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT50cnhfcmVzZXRfcG9sYXJpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmJjZHJfcmVzZXRfbG9jYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YmNkcl9yZXNldF9wb2xhcml0eSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dHJ4X3Jlc2V0X2xvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnRyeF9yZXNldF9wb2xhcml0eSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+YmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+YmNkcl9yZXNldF9sb2NhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5iY2RyX3Jlc2V0X3BvbGFyaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMzEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+dHJ4X3Jlc2V0X2xvY2F0aW9uID4gNTExKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzRfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80ICp0aGlzKQoreworICAgIHRoaXMtPmFyclswXS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgdGhpcy0+YXJyWzBdLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDQyOTQ5NjcyOTVVTDsKKyAgICB0aGlzLT5hcnJbMF0udHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgdGhpcy0+YXJyWzBdLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IDQ7CisgICAgdGhpcy0+YXJyWzBdLnRyeF9yZXNldF9sb2NhdGlvbiA9IDA7CisgICAgdGhpcy0+YXJyWzBdLnRyeF9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFyclswXS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPmFyclswXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gMjU1OworICAgIHRoaXMtPmFyclswXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgdGhpcy0+YXJyWzBdLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSAxOworICAgIHRoaXMtPmFyclswXS5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMjA7CisgICAgdGhpcy0+YXJyWzBdLmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5hcnJbMV0udHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPmFyclsxXS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSA0Mjk0OTY3Mjk1VUw7CisgICAgdGhpcy0+YXJyWzFdLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgIHRoaXMtPmFyclsxXS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSA0OworICAgIHRoaXMtPmFyclsxXS50cnhfcmVzZXRfbG9jYXRpb24gPSAzMzsKKyAgICB0aGlzLT5hcnJbMV0udHJ4X3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+YXJyWzFdLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgdGhpcy0+YXJyWzFdLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAyNTU7CisgICAgdGhpcy0+YXJyWzFdLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICB0aGlzLT5hcnJbMV0uYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IDE7CisgICAgdGhpcy0+YXJyWzFdLmJjZHJfcmVzZXRfbG9jYXRpb24gPSAyMzsKKyAgICB0aGlzLT5hcnJbMV0uYmNkcl9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFyclsyXS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgdGhpcy0+YXJyWzJdLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDQyOTQ5NjcyOTVVTDsKKyAgICB0aGlzLT5hcnJbMl0udHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgdGhpcy0+YXJyWzJdLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IDQ7CisgICAgdGhpcy0+YXJyWzJdLnRyeF9yZXNldF9sb2NhdGlvbiA9IDA7CisgICAgdGhpcy0+YXJyWzJdLnRyeF9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFyclsyXS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPmFyclsyXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gMjU1OworICAgIHRoaXMtPmFyclsyXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgdGhpcy0+YXJyWzJdLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSAxOworICAgIHRoaXMtPmFyclsyXS5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMjA7CisgICAgdGhpcy0+YXJyWzJdLmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5hcnJbM10udHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPmFyclszXS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSA0Mjk0OTY3Mjk1VUw7CisgICAgdGhpcy0+YXJyWzNdLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgIHRoaXMtPmFyclszXS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSA0OworICAgIHRoaXMtPmFyclszXS50cnhfcmVzZXRfbG9jYXRpb24gPSAzMzsKKyAgICB0aGlzLT5hcnJbM10udHJ4X3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+YXJyWzNdLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgdGhpcy0+YXJyWzNdLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAyNTU7CisgICAgdGhpcy0+YXJyWzNdLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICB0aGlzLT5hcnJbM10uYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IDE7CisgICAgdGhpcy0+YXJyWzNdLmJjZHJfcmVzZXRfbG9jYXRpb24gPSAyMzsKKyAgICB0aGlzLT5hcnJbM10uYmNkcl9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzRfcGFjayhjb25zdCBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+YXJyW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF91bnBhY2soYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+YXJyW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTI0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+bG9zID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+b251X2FsYXJtcyA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPnRpd2kgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5hY2tfdGltZW91dCA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPnNmaSA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmxva2kgPSBCQ01PU19GQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5sb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2FsYXJtcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT50aXdpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmFja190aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnNmaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5sb2tpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uX3VucGFjayhiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmxvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfYWxhcm1zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnRpd2kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YWNrX3RpbWVvdXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c2ZpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmxva2kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9yZXN5bmNfY29udHJvbF9zZXRfZGVmYXVsdChiY21vbHRfcmVzeW5jX2NvbnRyb2wgKnRoaXMpCit7CisgICAgdGhpcy0+c3RhcnRfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICB0aGlzLT5sYXN0X3BhdHRlcm4gPSAwOworICAgIHRoaXMtPm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICB0aGlzLT5sb2NhdGlvbiA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXN5bmNfY29udHJvbF9wYWNrKGNvbnN0IGJjbW9sdF9yZXN5bmNfY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnN0YXJ0X3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1pZGRsZV9wYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sYXN0X3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1pZGRsZV9yZXBldGl0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb2NhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXN5bmNfY29udHJvbF91bnBhY2soYmNtb2x0X3Jlc3luY19jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c3RhcnRfcGF0dGVybikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWlkZGxlX3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxhc3RfcGF0dGVybikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWlkZGxlX3JlcGV0aXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jlc3luY19jb250cm9sX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXN5bmNfY29udHJvbF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Jlc3luY19jb250cm9sICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+cmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICB0aGlzLT5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSAwOworICAgIHRoaXMtPnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICB0aGlzLT5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IDM0OworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gPSAwOworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gMDsKKyAgICB0aGlzLT5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICB0aGlzLT5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uID0gNzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF9wYWNrKCZ0aGlzLT5yZXN5bmNfY29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF9wYWNrKCZ0aGlzLT5yYW5naW5nX3Jlc3luY19jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfdW5wYWNrKCZ0aGlzLT5yZXN5bmNfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX3VucGFjaygmdGhpcy0+cmFuZ2luZ19yZXN5bmNfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+cmVzeW5jX2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+cmFuZ2luZ19yZXN5bmNfY29udHJvbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfc2V0X2RlZmF1bHQoYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyAqdGhpcykKK3sKKyAgICB0aGlzLT51c19iZXJfaW50ZXJ2YWwgPSA1MDAwOworICAgIHRoaXMtPnNmX3RocmVzaG9sZCA9IDM7CisgICAgdGhpcy0+c2RfdGhyZXNob2xkID0gNTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19wYWNrKGNvbnN0IGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dXNfYmVyX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zZl90aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnNkX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfdW5wYWNrKGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dXNfYmVyX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5zZl90aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnNkX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+dXNfYmVyX2ludGVydmFsID4gNjAwMDBVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+c2ZfdGhyZXNob2xkIDwgMykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+c2ZfdGhyZXNob2xkID4gOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+c2RfdGhyZXNob2xkIDwgNCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+c2RfdGhyZXNob2xkID4gOSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfc2V0X2RlZmF1bHQoYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgKnRoaXMpCit7CisgICAgdGhpcy0+bWFfNyA9IDY0OworICAgIHRoaXMtPm1hXzMgPSAyNTY7CisgICAgdGhpcy0+bWFfMSA9IDUxMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfcGFjayhjb25zdCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tYV83KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWFfMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1hXzEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV91bnBhY2soYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bWFfNykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1hXzMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tYV8xKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX3NldF9kZWZhdWx0KGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKnRoaXMpCit7CisgICAgdGhpcy0+c3RhdHVzID0gKGJjbW9sdF9kZHJfdGVzdF9zdGF0dXMpIDI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfcGFjayhjb25zdCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzX3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9kZHJfdGVzdF9yZXN1bHRfcGFjayh0aGlzLT51LmNvbXBsZXRlZC5jcHVfcmVzdWx0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF9wYWNrKHRoaXMtPnUuY29tcGxldGVkLnJhc18wX3Jlc3VsdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9kZHJfdGVzdF9yZXN1bHRfcGFjayh0aGlzLT51LmNvbXBsZXRlZC5yYXNfMV9yZXN1bHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT05ORUNUSU9OX0ZBSUxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb25fcGFjayh0aGlzLT51LmNvbm5lY3Rpb25fZmFpbGVkLnJlYXNvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX1RJTUVPVVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTk5FQ1RJT05fRkFJTEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX1RJTUVPVVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfdW5wYWNrKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9kZHJfdGVzdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnUuY29tcGxldGVkLmNwdV9yZXN1bHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZGRyX3Rlc3RfcmVzdWx0X3VucGFjaygmdGhpcy0+dS5jb21wbGV0ZWQucmFzXzBfcmVzdWx0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnUuY29tcGxldGVkLnJhc18xX3Jlc3VsdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTk5FQ1RJT05fRkFJTEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbl91bnBhY2soJnRoaXMtPnUuY29ubmVjdGlvbl9mYWlsZWQucmVhc29uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfVElNRU9VVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9kZHJfdGVzdF9zdGF0dXMgc3RhdHVzOworICAgIGlmICghYmNtb2x0X2Rkcl90ZXN0X3N0YXR1c191bnBhY2soJnN0YXR1cywgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN0YXR1cykKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT01QTEVURUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT05ORUNUSU9OX0ZBSUxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfVElNRU9VVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMtPnUuY29tcGxldGVkLmNwdV9yZXN1bHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfUEhZX0lOSVRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX0RSQU1fSU5JVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU0hNT09fRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX0VESVNfVEVTVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfTUVNX1RFU1RfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX05PVF9URVNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMtPnUuY29tcGxldGVkLnJhc18wX3Jlc3VsdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9QSFlfSU5JVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfRFJBTV9JTklUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9TSE1PT19FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfRURJU19URVNUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9NRU1fVEVTVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfTk9UX1RFU1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy0+dS5jb21wbGV0ZWQucmFzXzFfcmVzdWx0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1BIWV9JTklUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9EUkFNX0lOSVRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1NITU9PX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9FRElTX1RFU1RfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX01FTV9URVNUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9OT1RfVEVTVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT05ORUNUSU9OX0ZBSUxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMtPnUuY29ubmVjdGlvbl9mYWlsZWQucmVhc29uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0tFRVBBTElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVVNFUl9DQUxMQkFDS19FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU09GVFdBUkVfVkVSU0lPTl9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU1lTVEVNX01PREVfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05OSV9TUEVFRF9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fUkVDT05ORUNUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0lOVEVSTkFMX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TWVNURU1fTU9ERV9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9QQVJBTUVURVI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX1RJTUVPVVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19zZXRfZGVmYXVsdChiY21vbHRfZGVidWdfZGV2aWNlX2NmZyAqdGhpcykKK3sKKyAgICB0aGlzLT5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplID0gMTI4OworICAgIHRoaXMtPmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUgPSAxMjg7CisgICAgdGhpcy0+YXZzX2NvbnRyb2wgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT51c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+dXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSA9IEJDTU9TX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19wYWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5ob3N0X2RtYV90eF9xdWV1ZV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmF2c19jb250cm9sKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnX3VucGFjayhiY21vbHRfZGVidWdfZGV2aWNlX2NmZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aG9zdF9kbWFfdHhfcXVldWVfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdnNfY29udHJvbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT51c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnVzZV9wcmV2X25uaV9zZXJkZXNfZmlybXdhcmUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplID4gMTAyNCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+aG9zdF9kbWFfdHhfcXVldWVfc2l6ZSA8IDEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUgPiAxMDI0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZF9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqdGhpcykKK3sKKyAgICB0aGlzLT5maXJzdF9oYWxmID0gQkNNT0xUX05OSV9TUEVFRF9HQlBTXzE7CisgICAgdGhpcy0+c2Vjb25kX2hhbGYgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X25uaV9zcGVlZF9wYWNrKHRoaXMtPmZpcnN0X2hhbGYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbm5pX3NwZWVkX3BhY2sodGhpcy0+c2Vjb25kX2hhbGYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX3VucGFjayhiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X25uaV9zcGVlZF91bnBhY2soJnRoaXMtPmZpcnN0X2hhbGYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbm5pX3NwZWVkX3VucGFjaygmdGhpcy0+c2Vjb25kX2hhbGYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmZpcnN0X2hhbGYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1BFRURfR0JQU18xOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TUEVFRF9HQlBTXzJQNToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1BFRURfR0JQU18xMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1BFRURfR0JQU18xMlA1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEwX0dfTVVYOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zZWNvbmRfaGFsZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TUEVFRF9HQlBTXzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMlA1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEyUDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTBfR19NVVg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyogXGNvbmQgVU5ET0NVTUVOVEVEX1NZTUJPTFMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfc2V0X2RlZmF1bHQoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMgKnRoaXMpCit7CisgICAgdGhpcy0+YWQgPSAoYmNtb2x0X2FnZ3JlZ2F0aW9uX2RvbWFpbikgMDsKKyAgICB0aGlzLT5ldCA9IChiY21vbHRfZXBvbl90b3ApIDA7CisgICAgdGhpcy0+ZWxnID0gKGJjbW9sdF9lcG1fbGltX2dsb2JhbCkgMDsKKyAgICB0aGlzLT5kYmFfcG9ydCA9IChiY21vbHRfZGJhX3BvcnQpIDA7CisgICAgdGhpcy0+c2diID0gQkNNT0xUX0RSVl9TR0JfSURfSURYMDsKKyAgICB0aGlzLT5pY2YgPSBCQ01PTFRfRFJWX0lDRl9JRF9JRFgwOworICAgIHRoaXMtPnRmYl90cmFwX2JlaGF2aW9yID0gQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0RST1A7CisgICAgdGhpcy0+dGZiX21vZGUgPSBCQ01PTFRfVEZCX01PREVfR1BPTjsKKyAgICB0aGlzLT5saW1fc2VjX21vZGVfdXAgPSBCQ01PTFRfTElNX1NFQ19NT0RFX1VQX1RFSzsKKyAgICB0aGlzLT5saW1fc2VjX21vZGVfZG4gPSBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX1RFSzsKKyAgICB0aGlzLT54aW1fc2VjX21vZGUgPSBCQ01PTFRfWElNX1NFQ19NT0RFX1JFU0VSVkVEXzA7CisgICAgdGhpcy0+ZGJhX3JhbSA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzA7CisgICAgdGhpcy0+aHNjX3JhbSA9IEJDTU9MVF9IU0NfUkFNX0xMQ19UMTsKKyAgICB0aGlzLT5saW1fcmFtID0gQkNNT0xUX0xJTV9SQU1fTExJRF9VUDsKKyAgICB0aGlzLT5sa3lfcmFtID0gQkNNT0xUX0xLWV9SQU1fVFhfS0VZX1JBTTsKKyAgICB0aGlzLT5taWNfcmFtID0gQkNNT0xUX01JQ19SQU1fUkFOR0U7CisgICAgdGhpcy0+eHBjc19yYW0gPSBCQ01PTFRfWFBDU1JNX1JBTV9DQVBUVVJFX0ZJRk87CisgICAgdGhpcy0+eGcyZ19pZCA9IChiY21vbHRfeGcyZ19pZCkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfcGFjayhjb25zdCBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5hZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPmV0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+ZWxnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+ZGJhX3BvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Rydl9zZ2JfaWRfcGFjayh0aGlzLT5zZ2IsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZHJ2X2ljZl9pZF9wYWNrKHRoaXMtPmljZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF90ZmJfdHJhcF9iZWhhdmlvcl9wYWNrKHRoaXMtPnRmYl90cmFwX2JlaGF2aW9yLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3RmYl9tb2RlX3BhY2sodGhpcy0+dGZiX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGltX3NlY19tb2RlX3VwX3BhY2sodGhpcy0+bGltX3NlY19tb2RlX3VwLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xpbV9zZWNfbW9kZV9kbl9wYWNrKHRoaXMtPmxpbV9zZWNfbW9kZV9kbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF94aW1fc2VjX21vZGVfcGFjayh0aGlzLT54aW1fc2VjX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZGJhX3JhbV9wYWNrKHRoaXMtPmRiYV9yYW0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfaHNjX3JhbV9wYWNrKHRoaXMtPmhzY19yYW0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGltX3JhbV9wYWNrKHRoaXMtPmxpbV9yYW0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGt5X3JhbV9wYWNrKHRoaXMtPmxreV9yYW0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbWljX3JhbV9wYWNrKHRoaXMtPm1pY19yYW0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfeHBjc3JtX3JhbV9wYWNrKHRoaXMtPnhwY3NfcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT54ZzJnX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfdW5wYWNrKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+YWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPmV0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5lbGcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPmRiYV9wb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9kcnZfc2diX2lkX3VucGFjaygmdGhpcy0+c2diLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Rydl9pY2ZfaWRfdW5wYWNrKCZ0aGlzLT5pY2YsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3JfdW5wYWNrKCZ0aGlzLT50ZmJfdHJhcF9iZWhhdmlvciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF90ZmJfbW9kZV91bnBhY2soJnRoaXMtPnRmYl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xpbV9zZWNfbW9kZV91cF91bnBhY2soJnRoaXMtPmxpbV9zZWNfbW9kZV91cCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9saW1fc2VjX21vZGVfZG5fdW5wYWNrKCZ0aGlzLT5saW1fc2VjX21vZGVfZG4sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfeGltX3NlY19tb2RlX3VucGFjaygmdGhpcy0+eGltX3NlY19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2RiYV9yYW1fdW5wYWNrKCZ0aGlzLT5kYmFfcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2hzY19yYW1fdW5wYWNrKCZ0aGlzLT5oc2NfcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xpbV9yYW1fdW5wYWNrKCZ0aGlzLT5saW1fcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xreV9yYW1fdW5wYWNrKCZ0aGlzLT5sa3lfcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X21pY19yYW1fdW5wYWNrKCZ0aGlzLT5taWNfcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3hwY3NybV9yYW1fdW5wYWNrKCZ0aGlzLT54cGNzX3JhbSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT54ZzJnX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+YWQgPiAoYmNtb2x0X2FnZ3JlZ2F0aW9uX2RvbWFpbikgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+ZXQgPiAoYmNtb2x0X2Vwb25fdG9wKSA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5lbGcgPiAoYmNtb2x0X2VwbV9saW1fZ2xvYmFsKSAxNSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+ZGJhX3BvcnQgPiAoYmNtb2x0X2RiYV9wb3J0KSA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c2diKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRFJWX1NHQl9JRF9JRFgwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RSVl9TR0JfSURfSURYMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+aWNmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRFJWX0lDRl9JRF9JRFgwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RSVl9JQ0ZfSURfSURYMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EUlZfSUNGX0lEX0lEWDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRFJWX0lDRl9JRF9JRFgzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50ZmJfdHJhcF9iZWhhdmlvcikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0RST1A6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfRk9SV0FSRF9OTkk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfRk9SV0FSRF9DUFU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfU05PT1A6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnRmYl9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfVEZCX01PREVfR1BPTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9URkJfTU9ERV9YR1BPTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9URkJfTU9ERV9FUE9OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RGQl9NT0RFX1hFUE9OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RGQl9NT0RFX0NPRVg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxpbV9zZWNfbW9kZV91cCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9URUs6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElNX1NFQ19NT0RFX1VQX1BFUl9MTElEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9OVFQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxpbV9zZWNfbW9kZV9kbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTV9TRUNfTU9ERV9ETl9URUs6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX1BFUl9MTElEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTV9TRUNfTU9ERV9ETl9OVFQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX0NFUE9OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT54aW1fc2VjX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YSU1fU0VDX01PREVfUkVTRVJWRURfMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YSU1fU0VDX01PREVfUEVSX0xMSUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWElNX1NFQ19NT0RFX1JFU0VSVkVEXzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWElNX1NFQ19NT0RFX0NFUE9OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5kYmFfcmFtKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV8wOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV8zOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV82OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fNzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX0dSQU5UU19PVVRfUkFNOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fR1JBTlRTX0lOX1JBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX0dSQU5UU19SRVRJUkVEX1JBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1JFUE9SVF9SQU06CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9HUkFOVF9DRkdfUkFNOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fREVGQVVMVF9UT0tFTlNfUkFNOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fUE9MTF9SRUNPUkRTX1JBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX0hFSVJfUE9MTF9SQU06CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9MQVNUX1BPTExfVElNRV9SQU06CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9QT0xMX09SREVSX1JBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+aHNjX3JhbSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fTExDX1QxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fTExDX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fTExDX1QzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fR1JQX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fR1JQX1QzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fU0hQX1QxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fU0hQX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fU0hQX1QzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fUFJGX1QxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fUFJGX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fUFJGX1QzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fQ1JFX1QxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fQ1JFX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fQ1JFX1QzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fRUxVOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fUFRSX1QxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fUFRSX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fQUdSX1NIUF9UMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9IU0NfUkFNX0FFTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9IU0NfUkFNX0FMTF9MTEM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxpbV9yYW0pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9MSU1fUkFNX0xMSURfVVA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElNX1JBTV9QRVJfT05VX1NUQVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElNX1JBTV9GRUNfVVBfRlVMTF9TOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTV9SQU1fRkVDX1VQX0RBVEE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxreV9yYW0pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9MS1lfUkFNX1RYX0tFWV9SQU06CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTEtZX1JBTV9UWF9LRVlfQlVGRkVSOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xLWV9SQU1fUlhfS0VZX1JBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9MS1lfUkFNX1JYX0tFWV9CVUZGRVI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm1pY19yYW0pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9NSUNfUkFNX1JBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01JQ19SQU1fTExJRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NSUNfUkFNX0lEWDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NSUNfUkFNX0dSQU5UX01JU1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUlDX1JBTV9HUkFOVF9JRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NSUNfUkFNX1RYX0lWOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01JQ19SQU1fUlhfSVY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUlDX1JBTV9UWF9QT1JUX1NUQVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUlDX1JBTV9SWF9QT1JUX1NUQVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnhwY3NfcmFtKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWFBDU1JNX1JBTV9DQVBUVVJFX0ZJRk86CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWFBDU1JNX1JBTV9GRUNfREVDT0RFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hQQ1NSTV9SQU1fRkVDX1NUQVRTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hQQ1NSTV9SQU1fRkVDX0VOUVVFVUU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWFBDU1JNX1JBTV9JRExFX0lOU0VSVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT54ZzJnX2lkID4gKGJjbW9sdF94ZzJnX2lkKSA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKiBcZW5kY29uZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfc2V0X2RlZmF1bHQoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5ICp0aGlzKQoreworICAgIHRoaXMtPmltYWdlX3R5cGUgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQk9PVExPQURFUjsKKyAgICB0aGlzLT5pbWFnZV9zaXplID0gMDsKKyAgICB0aGlzLT5jcmMzMiA9IDA7CisgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19OT05FOworICAgIG1lbXNldCh0aGlzLT5pbWFnZV9uYW1lLCAwLCA2NCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9wYWNrKGNvbnN0IGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3BhY2sodGhpcy0+aW1hZ2VfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW1hZ2Vfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNyYzMyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+aW1hZ2VfbmFtZSwgNjQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfdW5wYWNrKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3VucGFjaygmdGhpcy0+aW1hZ2VfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW1hZ2Vfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNyYzMyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5pbWFnZV9uYW1lLCA2NCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDc0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5pbWFnZV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQk9PVExPQURFUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9JVFVfUE9OX09OVV9GSVJNV0FSRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9FUE9OX09OVV9GSVJNV0FSRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRU1CRURERURfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX05PTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRU1CRURERURfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0lOX1BST0dSRVNTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19TVUNDRVNTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19GQUlMVVJFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3NldF9kZWZhdWx0KGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfcGFjayhjb25zdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICg3NCAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3VucGFjayhiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV91bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDc0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfc2V0X2RlZmF1bHQoYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICp0aGlzKQoreworICAgIHRoaXMtPmZvcm1hdCA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3BhY2soY29uc3QgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdF9wYWNrKHRoaXMtPmZvcm1hdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmZvcm1hdCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPnUuY2ZiLmtleSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmN0ci5rZXksIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmN0ci5zY2ksIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5mb3JtYXQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfdW5wYWNrKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfdW5wYWNrKCZ0aGlzLT5mb3JtYXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5mb3JtYXQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnUuY2ZiLmtleSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnUuY3RyLmtleSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5jdHIuc2NpLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0IGZvcm1hdDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0X3VucGFjaygmZm9ybWF0LCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoZm9ybWF0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+Zm9ybWF0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+ZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSA9IEJDTU9MVF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9NT0RFX0hPU1RfRFJJVkVOOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZV9wYWNrKHRoaXMtPmVwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfdW5wYWNrKCZ0aGlzLT5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9DTE9DS19UUkFOU1BPUlRfTU9ERV9IT1NUX0RSSVZFTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9NT0RFX0VNQkVEREVEX0RSSVZFTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyAqdGhpcykKK3sKKyAgICB0aGlzLT5saW5rX3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+bGlua19yYXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfdW5wYWNrKGJjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3JhdGVfdW5wYWNrKCZ0aGlzLT5saW5rX3JhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5saW5rX3JhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9PTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfT05FX09ORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyAqdGhpcykKK3sKKyAgICB0aGlzLT5sYXNlcl9vbl90aW1lID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5sYXNlcl9vZmZfdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5sYXNlcl9vbl90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5sYXNlcl9vZmZfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c191bnBhY2soYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmxhc2VyX29uX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+bGFzZXJfb2ZmX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcmFuZ2Vfc3RhdHVzX3NldF9kZWZhdWx0KGJjbW9sdF9yYW5nZV9zdGF0dXMgKnRoaXMpCit7CisgICAgdGhpcy0+cmFuZ2UgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2Vfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X3JhbmdlX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPnJhbmdlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5nZV9zdGF0dXNfdW5wYWNrKGJjbW9sdF9yYW5nZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnJhbmdlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5nZV9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdlX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JhbmdlX3N0YXR1cyAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3JvZ3VlX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfcm9ndWVfc3RhdHVzICp0aGlzKQoreworICAgIHRoaXMtPmRlbmllZF9sbGlkID0gKGJjbW9sdF9lcG9uX2xsaWQpIDA7CisgICAgdGhpcy0+ZGVuaWVkX3JhbmdlID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3N0YXR1c19wYWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5kZW5pZWRfbGxpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+ZGVuaWVkX3JhbmdlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9zdGF0dXNfdW5wYWNrKGJjbW9sdF9yb2d1ZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmRlbmllZF9sbGlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmRlbmllZF9yYW5nZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfc3RhdHVzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9zdGF0dXMgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlICp0aGlzKQoreworICAgIHRoaXMtPnVua25vd25fbGlua192aW9sYXRpb24ubGlua19yYXRlID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU47CisgICAgdGhpcy0+dW5rbm93bl9saW5rX3Zpb2xhdGlvbi5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPm1heF9saW5rX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24gPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmxhc2VyX29uX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPmxhc2VyX29uX29mZl92aW9sYXRpb24ubGFzZXJfb2ZmX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPmxhc2VyX29uX29mZl92aW9sYXRpb24uYWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+c3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPnJhbmdlX3Zpb2xhdGlvbi5yYW5nZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgdGhpcy0+cmFuZ2VfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPnRkbV9jaGFubmVsc19leGhhdXN0ZWQgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5yb2d1ZV92aW9sYXRpb24uZGVuaWVkX2xsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICB0aGlzLT5yb2d1ZV92aW9sYXRpb24uZGVuaWVkX3JhbmdlID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5yb2d1ZV92aW9sYXRpb24uYWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19wYWNrKCZ0aGlzLT51bmtub3duX2xpbmtfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPm1heF9saW5rX3Zpb2xhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfcGFjaygmdGhpcy0+bGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3JhbmdlX3N0YXR1c19wYWNrKCZ0aGlzLT5yYW5nZV92aW9sYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+dGRtX2NoYW5uZWxzX2V4aGF1c3RlZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9zdGF0dXNfcGFjaygmdGhpcy0+cm9ndWVfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfdW5wYWNrKCZ0aGlzLT51bmtub3duX2xpbmtfdmlvbGF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+b3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bWF4X2xpbmtfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c191bnBhY2soJnRoaXMtPmxhc2VyX29uX29mZl92aW9sYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3JhbmdlX3N0YXR1c191bnBhY2soJnRoaXMtPnJhbmdlX3Zpb2xhdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPnRkbV9jaGFubmVsc19leGhhdXN0ZWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfcm9ndWVfc3RhdHVzX3VucGFjaygmdGhpcy0+cm9ndWVfdmlvbGF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSAqdGhpcykKK3sKKyAgICBpZiAoIWJjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzX2JvdW5kc19jaGVjaygmdGhpcy0+dW5rbm93bl9saW5rX3Zpb2xhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm1heF9saW5rX3Zpb2xhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c19ib3VuZHNfY2hlY2soJnRoaXMtPmxhc2VyX29uX29mZl92aW9sYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yYW5nZV9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5yYW5nZV92aW9sYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dGRtX2NoYW5uZWxzX2V4aGF1c3RlZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5yb2d1ZV92aW9sYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgKnRoaXMpCit7CisgICAgdGhpcy0+ZG93bnN0cmVhbV9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047CisgICAgdGhpcy0+ZG93bnN0cmVhbV9rZXlfY2hvaWNlID0gQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9LRVlfMDsKKyAgICB0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCOworICAgIG1lbXNldCh0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jZmIua2V5LCAwLCBzaXplb2YodGhpcy0+ZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY2ZiLmtleSkpOworICAgIHRoaXMtPnVwc3RyZWFtX21vZGUgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTjsKKyAgICB0aGlzLT51cHN0cmVhbV9rZXlfY2hvaWNlID0gQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9LRVlfMDsKKyAgICB0aGlzLT51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjsKKyAgICBtZW1zZXQodGhpcy0+dXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXksIDAsIHNpemVvZih0aGlzLT51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY2ZiLmtleSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGVfcGFjayh0aGlzLT5kb3duc3RyZWFtX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3BhY2sodGhpcy0+ZG93bnN0cmVhbV9rZXlfY2hvaWNlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3BhY2soJnRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV9wYWNrKHRoaXMtPnVwc3RyZWFtX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3BhY2sodGhpcy0+dXBzdHJlYW1fa2V5X2Nob2ljZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9wYWNrKCZ0aGlzLT51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgKnRoaXMpCit7CisgICAgcmV0dXJuIDYgKyBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbikgKyBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV91bnBhY2soJnRoaXMtPmRvd25zdHJlYW1fbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2tleV9jaG9pY2VfdW5wYWNrKCZ0aGlzLT5kb3duc3RyZWFtX2tleV9jaG9pY2UsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfdW5wYWNrKCZ0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV91bnBhY2soJnRoaXMtPnVwc3RyZWFtX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3VucGFjaygmdGhpcy0+dXBzdHJlYW1fa2V5X2Nob2ljZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl91bnBhY2soJnRoaXMtPnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+ZG93bnN0cmVhbV9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1RSSVBMRV9DSFVSTklORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5kb3duc3RyZWFtX2tleV9jaG9pY2UpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8xOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXBzdHJlYW1fbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9UUklQTEVfQ0hVUk5JTkc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXBzdHJlYW1fa2V5X2Nob2ljZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9LRVlfMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9ib3VuZHNfY2hlY2soJnRoaXMtPnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgKnRoaXMpCit7CisgICAgdGhpcy0+b2FtX3R5cGUgPSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9CUk9BRENPTTsKKyAgICB0aGlzLT5wZXJpb2QgPSAwOworICAgIHRoaXMtPmRpcmVjdGlvbiA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fRElSRUNUSU9OX0RPV05TVFJFQU1fT05MWTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90eXBlX3BhY2sodGhpcy0+b2FtX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBlcmlvZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl9wYWNrKHRoaXMtPmRpcmVjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3R5cGVfdW5wYWNrKCZ0aGlzLT5vYW1fdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cGVyaW9kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+ZGlyZWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5vYW1fdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9DVEM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9EUE9FOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RZUEVfU0lFUE9OQToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGlyZWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0RJUkVDVElPTl9ET1dOU1RSRUFNX09OTFk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyc19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzICp0aGlzKQoreworICAgIHRoaXMtPmxhc2VyX29uX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAzMjsKKyAgICB0aGlzLT5sYXNlcl9vZmZfdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDMyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmxhc2VyX29uX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmxhc2VyX29mZl90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyc191bnBhY2soYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+bGFzZXJfb25fdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5sYXNlcl9vZmZfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGFzZXJfb25fdGltZSA+IChiY21vbHRfdGltZV9xdWFudGEpIDYyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sYXNlcl9vZmZfdGltZSA+IChiY21vbHRfdGltZV9xdWFudGEpIDYyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgKnRoaXMpCit7CisgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2ZhaWx1cmUgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5pbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+bXBjcF9yZXBvcnRfdGltZW91dCA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPm9hbV9rZWVwYWxpdmVfdGltZW91dCA9IEJDTU9MVF9TVEFUVVNfT0ZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmtleV9leGNoYW5nZV9mYWlsdXJlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmludmFsaWRfbXBjcF9yZXBvcnRfcmVjZWl2ZWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bXBjcF9yZXBvcnRfdGltZW91dCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5vYW1fa2VlcGFsaXZlX3RpbWVvdXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5rZXlfZXhjaGFuZ2VfZmFpbHVyZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5pbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPm1wY3BfcmVwb3J0X3RpbWVvdXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lb3V0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5rZXlfZXhjaGFuZ2VfZmFpbHVyZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmludmFsaWRfbXBjcF9yZXBvcnRfcmVjZWl2ZWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5tcGNwX3JlcG9ydF90aW1lb3V0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lb3V0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbl9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2ZlY19lbiAqdGhpcykKK3sKKyAgICB0aGlzLT51cHN0cmVhbSA9IEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX1VTRV9ERUZBVUxUOworICAgIHRoaXMtPmRvd25zdHJlYW0gPSBCQ01PTFRfRVBPTl9MSU5LX0ZFQ19TVEFURV9VU0VfREVGQVVMVDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGVfcGFjayh0aGlzLT51cHN0cmVhbSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlX3BhY2sodGhpcy0+ZG93bnN0cmVhbSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZV91bnBhY2soJnRoaXMtPnVwc3RyZWFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGVfdW5wYWNrKCZ0aGlzLT5kb3duc3RyZWFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT51cHN0cmVhbSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0ZFQ19TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfVVNFX0RFRkFVTFQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmRvd25zdHJlYW0pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfRU5BQkxFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX1VTRV9ERUZBVUxUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfaW5mb19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2luZm8gKnRoaXMpCit7CisgICAgdGhpcy0+bGlua19zdGF0dXMgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0dXMpIDA7CisgICAgdGhpcy0+cmF0ZSA9IEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOworICAgIHRoaXMtPmxsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICB0aGlzLT5tcGNwX2Rpc2NvdmVyeV9pbmZvID0gKGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvKSAwOworICAgIHRoaXMtPm9udV9sYXNlcl9vbl90aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5vbnVfbGFzZXJfb2ZmX3RpbWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPnBlbmRpbmdfZ3JhbnRzID0gMDsKKyAgICB0aGlzLT5yYW5nZV92YWx1ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgdGhpcy0+dHVubmVsX2lkID0gKGJjbW9sdF9lcG9uX3R1bm5lbF9pZCkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmZvX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19pbmZvICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3N0YXR1c19wYWNrKHRoaXMtPmxpbmtfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+cmF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5sbGlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvX3BhY2sodGhpcy0+bXBjcF9kaXNjb3ZlcnlfaW5mbywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5vbnVfbGFzZXJfb25fdGltZV90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+b251X2xhc2VyX29mZl90aW1lX3RxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wZW5kaW5nX2dyYW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+cmFuZ2VfdmFsdWVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPnR1bm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5mb191bnBhY2soYmNtb2x0X2Vwb25fbGlua19pbmZvICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3N0YXR1c191bnBhY2soJnRoaXMtPmxpbmtfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3VucGFjaygmdGhpcy0+cmF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmxsaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm9fdW5wYWNrKCZ0aGlzLT5tcGNwX2Rpc2NvdmVyeV9pbmZvLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+b251X2xhc2VyX29uX3RpbWVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+b251X2xhc2VyX29mZl90aW1lX3RxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wZW5kaW5nX2dyYW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5yYW5nZV92YWx1ZV90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT50dW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2luZm9fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5mb19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19pbmZvICp0aGlzKQoreworICAgIGlmICgodGhpcy0+bGlua19zdGF0dXMgJiAweDAwRjYpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5yYXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fT05FOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm1wY3BfZGlzY292ZXJ5X2luZm8gJiAweEZGQ0NVKSAhPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX3NldF9kZWZhdWx0KGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgKnRoaXMpCit7CisgICAgdGhpcy0+ZmxhZ3MgPSAoYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MpIDA7CisgICAgdGhpcy0+ZGVsYXlfYmVmb3JlX21zID0gNTA7CisgICAgdGhpcy0+Z2F0ZV9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgNDI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfcGFjayhjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFnc19wYWNrKHRoaXMtPmZsYWdzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5kZWxheV9iZWZvcmVfbXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmdhdGVfc2l6ZV90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfdW5wYWNrKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzX3VucGFjaygmdGhpcy0+ZmxhZ3MsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmRlbGF5X2JlZm9yZV9tcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5nYXRlX3NpemVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzICp0aGlzKQoreworICAgIGlmICgodGhpcy0+ZmxhZ3MgJiAweEZGRkZGRkZFVUwpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmRlbGF5X2JlZm9yZV9tcyA+IDM2MDAwMDBVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+Z2F0ZV9zaXplX3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgNjU1MzVVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMl9zZXRfZGVmYXVsdChiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgKnRoaXMpCit7CisgICAgcmV0dXJuIDQgKyAoMTIgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX3VucGFjayhiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2dhdGVfcGFyYW1ldGVycyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dhdGVfcGFyYW1ldGVyc191bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2dhdGVfcGFyYW1ldGVycykgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMTIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgKnRoaXMpCit7CisgICAgdGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSA9IChiY21vbHRfbXBjcF9nYXRlX21vZGUpIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfcGFjayhjb25zdCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfbXBjcF9nYXRlX21vZGVfcGFjayh0aGlzLT5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnRla25vdnVzLnJlZ19hY2tfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzJfcGFjaygmdGhpcy0+dS5jdXN0b20uZ2F0ZXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTVBDUF9HQVRFX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY3VzdG9tLmdhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfbXBjcF9nYXRlX21vZGVfdW5wYWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnRla25vdnVzLnJlZ19hY2tfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT51LmN1c3RvbS5nYXRlcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9tcGNwX2dhdGVfbW9kZSByZWdpc3RyYXRpb25fZ2F0ZV9tb2RlOworICAgIGlmICghYmNtb2x0X21wY3BfZ2F0ZV9tb2RlX3VucGFjaygmcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlZ2lzdHJhdGlvbl9nYXRlX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9NUENQX0dBVEVfTU9ERV9URUtOT1ZVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NUENQX0dBVEVfTU9ERV9DVVNUT006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnRla25vdnVzLnJlZ19hY2tfdGltZW91dF9tcyA8IDUwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnRla25vdnVzLnJlZ19hY2tfdGltZW91dF9tcyA+IDIwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTVBDUF9HQVRFX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMl9ib3VuZHNfY2hlY2soJnRoaXMtPnUuY3VzdG9tLmdhdGVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgKnRoaXMpCit7CisgICAgdGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlID0gQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOworICAgIHRoaXMtPnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS50ZWtub3Z1cy5yZWdfYWNrX3RpbWVvdXRfbXMgPSAxMDA7CisgICAgdGhpcy0+cmVwb3J0aW5nX21vZGUgPSBCQ01PTFRfRVBPTl9EQkFfUkVQT1JUSU5HX01PREVfU0lFUE9OX0E7CisgICAgdGhpcy0+bWF4X2xpbmtzID0gNTEyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3BhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGVfcGFjayh0aGlzLT5yZXBvcnRpbmdfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4X2xpbmtzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zICp0aGlzKQoreworICAgIHJldHVybiAzICsgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV91bnBhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZV91bnBhY2soJnRoaXMtPnJlcG9ydGluZ19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tYXhfbGlua3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgKnRoaXMpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2JvdW5kc19jaGVjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5yZXBvcnRpbmdfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9BOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9COgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9DOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPm1heF9saW5rcyA+IDIwNDQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlICp0aGlzKQoreworICAgIHRoaXMtPm5vX3JlcG9ydHMgPSBCQ01PTFRfU1RBVFVTX09GRjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPm5vX3JlcG9ydHMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPm5vX3JlcG9ydHMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPm5vX3JlcG9ydHMpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnICp0aGlzKQoreworICAgIHRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047CisgICAgdGhpcy0+dXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV9wYWNrKHRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlX3BhY2sodGhpcy0+dXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ191bnBhY2soYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV91bnBhY2soJnRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlX3VucGFjaygmdGhpcy0+dXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9UUklQTEVfQ0hVUk5JTkc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1RSSVBMRV9DSFVSTklORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKnRoaXMpCit7CisgICAgdGhpcy0+b2FtX2V4dGVuc2lvbl90eXBlID0gKGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZSkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGVfcGFjayh0aGlzLT5vYW1fZXh0ZW5zaW9uX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vYW1fZXh0ZW5zaW9uX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9SRVNFUlZFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9CUk9BRENPTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5icm9hZGNvbS5yZXNwb25zZV90aW1lb3V0X21zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmN0Yy5yZXNwb25zZV90aW1lb3V0X21zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfREFTQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZGFzYW4ucmVzcG9uc2VfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0tUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lmt0LnJlc3BvbnNlX3RpbWVvdXRfbXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmRwb2UucmVzcG9uc2VfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZHBvZS5ibG9ja19zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5kcG9lLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+b2FtX2V4dGVuc2lvbl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfUkVTRVJWRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9EQVNBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0tUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlX3VucGFjaygmdGhpcy0+b2FtX2V4dGVuc2lvbl90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b2FtX2V4dGVuc2lvbl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfUkVTRVJWRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuYnJvYWRjb20ucmVzcG9uc2VfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5jdGMucmVzcG9uc2VfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RBU0FOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmRhc2FuLnJlc3BvbnNlX3RpbWVvdXRfbXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9LVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5rdC5yZXNwb25zZV90aW1lb3V0X21zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5kcG9lLnJlc3BvbnNlX3RpbWVvdXRfbXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRwb2UuYmxvY2tfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZHBvZS5maW5hbF9hY2tfcmVzcG9uc2VfdGltZW91dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUgb2FtX2V4dGVuc2lvbl90eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlX3VucGFjaygmb2FtX2V4dGVuc2lvbl90eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob2FtX2V4dGVuc2lvbl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfUkVTRVJWRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RBU0FOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0tUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+b2FtX2V4dGVuc2lvbl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfUkVTRVJWRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuYnJvYWRjb20ucmVzcG9uc2VfdGltZW91dF9tcyA8IDUwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuY3RjLnJlc3BvbnNlX3RpbWVvdXRfbXMgPCAxMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RBU0FOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRhc2FuLnJlc3BvbnNlX3RpbWVvdXRfbXMgPCA1MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfS1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUua3QucmVzcG9uc2VfdGltZW91dF9tcyA8IDUwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRwb2UucmVzcG9uc2VfdGltZW91dF9tcyA8IDEwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZHBvZS5ibG9ja19zaXplIDwgMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kcG9lLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0IDwgMTUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMpCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+b251X2lkKTsKKyAgICB0aGlzLT5lcnJvcl9jb2RlID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1VDQ0VTUzsKKyAgICB0aGlzLT5vbnVfcmV0dXJuX2NvZGUgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+b251X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlX3BhY2sodGhpcy0+ZXJyb3JfY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlX3BhY2sodGhpcy0+b251X3JldHVybl9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm9udV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV91bnBhY2soJnRoaXMtPmVycm9yX2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZV91bnBhY2soJnRoaXMtPm9udV9yZXR1cm5fY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+ZXJyb3JfY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1VDQ0VTUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX09OVV9SRVNQT05TRV9USU1FT1VUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfT05VX0VSUk9SX1JFU1BPTlNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1lOQ19FUlJPUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX0NPTU1JVF9GQUlMRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9JTlRFUk5BTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1BBUlNFX0VSUk9SOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vbnVfcmV0dXJuX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX09LOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfVU5ERUZJTkVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfTk9UX0ZPVU5EOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfTk9fQUNDRVNTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRlVMTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0lMTEVHQUxfT1BFUkFUSU9OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfVU5LTk9XTl9JRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0JBRF9CTE9DSzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX1RJTUVPVVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9CVVNZOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfSU5DT01QQVRJQkxFX0ZJTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9DT1JSVVBURURfRklMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VSUk9SX05PVF9ERUZJTkVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRVJST1JfQUxMT0NfRVhDRUVERUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FUlJPUl9JTExFR0FMX09QOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRVJST1JfRklMRV9FWElTVFM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FTkRfV1JJVElOR19OVlM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FTkRfQ1JDX0VSUk9SOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX1BBUkFNX0VSUk9SOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX0NNRF9VTlNVUFBPUlRFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0xBU1Q6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDggKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c191bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPnByb3RlY3Rpb25fdHlwZSA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfTk9fUFJPVEVDVElPTl9TV1RJQ0hJTkc7CisgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyA9IChiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMpIDA7CisgICAgdGhpcy0+cmVyYW5nZV9vcHRpb25zID0gQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfUkVSQU5HSU5HX09QVElPTlNfUkVSQU5HRV9OT05FOworICAgIHRoaXMtPnJlcmFuZ2VfYXR0ZW1wdHMgPSAwOworICAgIHRoaXMtPnJlcmFuZ2VfaW50ZXJ2YWwgPSAwOworICAgIHRoaXMtPnN5bmNfZ2F0ZV9kdXJhdGlvbiA9IDA7CisgICAgdGhpcy0+Z3Bpb19pbnB1dCA9IEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ7CisgICAgdGhpcy0+Z3Bpb19pbnB1dF9wb2xhcml0eSA9IEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9ISUdIOworICAgIHRoaXMtPmdwaW9fb3V0cHV0ID0gQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRDsKKyAgICB0aGlzLT5ncGlvX291dHB1dF9wb2xhcml0eSA9IEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9ISUdIOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9wYWNrKHRoaXMtPnByb3RlY3Rpb25fdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9uc19wYWNrKHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9uc19wYWNrKHRoaXMtPnJlcmFuZ2Vfb3B0aW9ucywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXJhbmdlX2F0dGVtcHRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cmVyYW5nZV9pbnRlcnZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnN5bmNfZ2F0ZV9kdXJhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bpb19waW5fcGFjayh0aGlzLT5ncGlvX2lucHV0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dwaW9fcG9sYXJpdHlfcGFjayh0aGlzLT5ncGlvX2lucHV0X3BvbGFyaXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dwaW9fcGluX3BhY2sodGhpcy0+Z3Bpb19vdXRwdXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bpb19wb2xhcml0eV9wYWNrKHRoaXMtPmdwaW9fb3V0cHV0X3BvbGFyaXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX3VucGFjaygmdGhpcy0+cHJvdGVjdGlvbl90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zX3VucGFjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zX3VucGFjaygmdGhpcy0+cmVyYW5nZV9vcHRpb25zLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlcmFuZ2VfYXR0ZW1wdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5yZXJhbmdlX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c3luY19nYXRlX2R1cmF0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl91bnBhY2soJnRoaXMtPmdwaW9faW5wdXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bpb19wb2xhcml0eV91bnBhY2soJnRoaXMtPmdwaW9faW5wdXRfcG9sYXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bpb19waW5fdW5wYWNrKCZ0aGlzLT5ncGlvX291dHB1dCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ncGlvX3BvbGFyaXR5X3VucGFjaygmdGhpcy0+Z3Bpb19vdXRwdXRfcG9sYXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5wcm90ZWN0aW9uX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfTk9fUFJPVEVDVElPTl9TV1RJQ0hJTkc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0xJTkVfQ0FSRF9QUk9URUNUSU9OX1NXSVRDSElORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyAmIDB4MDBGRSkgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnJlcmFuZ2Vfb3B0aW9ucykKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfUkVSQU5HSU5HX09QVElPTlNfUkVSQU5HRV9OT05FOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfUkVSQU5HSU5HX09QVElPTlNfUkVSQU5HRV9TSU5HTEVfTE9HSUNBTF9MSU5LOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfUkVSQU5HSU5HX09QVElPTlNfUkVSQU5HRV9BTExfTE9HSUNBTF9MSU5LUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Z3Bpb19pbnB1dCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Z3Bpb19pbnB1dF9wb2xhcml0eSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUE9MQVJJVFlfQUNUSVZFX0xPVzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9ISUdIOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5ncGlvX291dHB1dCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Z3Bpb19vdXRwdXRfcG9sYXJpdHkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9MT1c6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QT0xBUklUWV9BQ1RJVkVfSElHSDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdThfbGlzdF91MTZfc2V0X2RlZmF1bHQoYmNtb2x0X3U4X2xpc3RfdTE2ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTE2X3BhY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UxNlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT52YWwsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdThfbGlzdF91MTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTE2ICp0aGlzKQoreworICAgIHJldHVybiAyICsgdGhpcy0+bGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfdW5wYWNrKGJjbW9sdF91OF9saXN0X3UxNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UxNlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dmFsLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UxNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTE2ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3NldF9kZWZhdWx0KGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgKnRoaXMpCit7CisgICAgdGhpcy0+ZnJhbWVfb2N0ZXRzLmxlbiA9IDA7CisgICAgdGhpcy0+ZnJhbWVfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgdGhpcy0+bWFza19vY3RldHMubGVuID0gMDsKKyAgICB0aGlzLT5tYXNrX29jdGV0cy52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3BhY2soY29uc3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X3BhY2soJnRoaXMtPmZyYW1lX29jdGV0cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9wYWNrKCZ0aGlzLT5tYXNrX29jdGV0cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCAqdGhpcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X3U4X2xpc3RfdTE2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5mcmFtZV9vY3RldHMpICsgYmNtb2x0X3U4X2xpc3RfdTE2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5tYXNrX29jdGV0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfdW5wYWNrKGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl91bnBhY2soJnRoaXMtPmZyYW1lX29jdGV0cywgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X3VucGFjaygmdGhpcy0+bWFza19vY3RldHMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCAqdGhpcykKK3sKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9ib3VuZHNfY2hlY2soJnRoaXMtPmZyYW1lX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MTZfYm91bmRzX2NoZWNrKCZ0aGlzLT5tYXNrX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9zZXRfZGVmYXVsdChiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgKnRoaXMpCit7CisgICAgdGhpcy0+ZnJhbWVfb2N0ZXRzLmxlbiA9IDA7CisgICAgdGhpcy0+ZnJhbWVfb2N0ZXRzLnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9wYWNrKGNvbnN0IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X3BhY2soJnRoaXMtPmZyYW1lX29jdGV0cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgKnRoaXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF91OF9saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZnJhbWVfb2N0ZXRzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX3VucGFjayhiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl91bnBhY2soJnRoaXMtPmZyYW1lX29jdGV0cywgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MTZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X2JvdW5kc19jaGVjaygmdGhpcy0+ZnJhbWVfb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfc2V0X2RlZmF1bHQoYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgKnRoaXMpCit7CisgICAgdGhpcy0+YWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lID0gMDsKKyAgICB0aGlzLT5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfcGFjayhjb25zdCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfdW5wYWNrKGJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSA+IDUwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+YWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSA+IDUwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKnRoaXMpCit7CisgICAgdGhpcy0+bWFqb3IgPSAwOworICAgIHRoaXMtPm1pbm9yID0gMDsKKyAgICB0aGlzLT5yZXZpc2lvbiA9IDA7CisgICAgdGhpcy0+bW9kZWwgPSAwOworICAgIG1lbXNldCh0aGlzLT5idWlsZF90aW1lLCAwLCAzMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uX3BhY2soY29uc3QgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tYWpvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWlub3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJldmlzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bW9kZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPmJ1aWxkX3RpbWUsIDMyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWFqb3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pbm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXZpc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1vZGVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPmJ1aWxkX3RpbWUsIDMyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzOSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+ZGlyZWN0aW9uID0gQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9ET1dOU1RSRUFNOworICAgIHRoaXMtPnR5cGUgPSBCQ01PTFRfR0VNX1BPUlRfVFlQRV9VTklDQVNUOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uX3BhY2sodGhpcy0+ZGlyZWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb25fdW5wYWNrKCZ0aGlzLT5kaXJlY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ2VtX3BvcnRfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmRpcmVjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9ET1dOU1RSRUFNOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9VUFNUUkVBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fQklESVJFQ1RJT05BTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dFTV9QT1JUX1RZUEVfVU5JQ0FTVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HRU1fUE9SVF9UWVBFX01VTFRJQ0FTVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMpCit7CisgICAgdGhpcy0+YWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIDA7CisgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+YWxsb2NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FsbG9jX3N0YXRlX3BhY2sodGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmFsbG9jX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hbGxvY19zdGF0ZV91bnBhY2soJnRoaXMtPnN0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSA0MDk1KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDMyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKQoreworICAgIHJldHVybiAyICsgKDMgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAzMikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfdW5wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiAzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAzMikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgKnRoaXMpCit7CisgICAgdGhpcy0+dW50YWdnZWRfZmxvdyA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgdGhpcy0+dW50YWdnZWRfdmlkID0gKGJjbW9sdF92bGFuX2lkKSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPnVudGFnZ2VkX2Zsb3csIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+dW50YWdnZWRfdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfdW5wYWNrKGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPnVudGFnZ2VkX2Zsb3csIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT51bnRhZ2dlZF92aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT51bnRhZ2dlZF9mbG93KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnVudGFnZ2VkX3ZpZCA+IChiY21vbHRfdmxhbl9pZCkgNDA5NSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAxNikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKQoreworICAgIHJldHVybiAxICsgKDIgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKGJjbW9sdF9ncG9uX2dlbV9pZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9pZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9pZCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAxNikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKQoreworICAgIHRoaXMtPmdlbV9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIDA7CisgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5nZW1faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGVfcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+Z2VtX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3VucGFjaygmdGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+Z2VtX2lkID4gKGJjbW9sdF9ncG9uX2dlbV9pZCkgNDA5NSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMTI4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoMyAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDEyOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfdW5wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAxMjgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3BhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcykKK3sKKyAgICByZXR1cm4gMiArICgzICogdGhpcy0+bGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMjU2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV91bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiAzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbiA+IDI1NikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5sZWFybl91bnRhZ2dlZF9mbG93X3ZpZHMgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bGVhcm5fdW50YWdnZWRfZmxvd192aWRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dW50YWdnZWRfZmxvd19zaGFwaW5nX21zX3Blcl9zZWMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bGVhcm5fdW50YWdnZWRfZmxvd192aWRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dW50YWdnZWRfZmxvd19zaGFwaW5nX21zX3Blcl9zZWMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPnVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjID4gMTAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSAqdGhpcykKK3sKKyAgICB0aGlzLT5pbnRlcnZhbCA9IDEwMDAwOworICAgIHRoaXMtPmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPm1vZGUgPSBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfTk9STUFMOworICAgIHRoaXMtPmVuY3J5cHRlZF9wb3J0c19vbmx5ID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2VfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlX3BhY2sodGhpcy0+bW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+ZW5jcnlwdGVkX3BvcnRzX29ubHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZV91bnBhY2soYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV91bnBhY2soJnRoaXMtPm1vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmVuY3J5cHRlZF9wb3J0c19vbmx5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2Vfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmludGVydmFsIDwgMTAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+aW50ZXJ2YWwgPiAzNjAwMDAwVUwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb250cm9sKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfTk9STUFMOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0tFWV9FWENIQU5HRV9NT0RFX0VOSEFOQ0VEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5lbmNyeXB0ZWRfcG9ydHNfb25seSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0ICp0aGlzKQoreworICAgIHRoaXMtPnZsYW4gPSAoYmNtb2x0X3ZsYW5faWQpIDA7CisgICAgdGhpcy0+Zmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgMDsKKyAgICB0aGlzLT5zdGF0ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+Z2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSAwOworICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmZsb3dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX3BvcnRfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm9udV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF91bnBhY2soYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT52bGFuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmZsb3dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmZsb3dfaWQgPiAoYmNtb2x0X2Zsb3dfaWQpIDQwOTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmdlbV9wb3J0X2lkID4gKGJjbW9sdF9ncG9uX2dlbV9pZCkgNDA5NSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9ncG9uX29udV9pZCkgMTI3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X3BhY2soY29uc3QgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYgKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoOSAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNl91bnBhY2soYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X3VucGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbjsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogOSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9kZWJ1Z19zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyAqdGhpcykKK3sKKyAgICB0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPSA2NDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVidWdfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kZWJ1Z191bnBhY2soYmNtb2x0X2dwb25fbmlfZGVidWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVidWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVidWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2RlYnVnICp0aGlzKQoreworICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPCA4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPmtleV9leGNoYW5nZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgdGhpcy0+cGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgdGhpcy0+ZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5rZXlfZXhjaGFuZ2UsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5mYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbl91bnBhY2soYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+a2V5X2V4Y2hhbmdlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+ZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+a2V5X2V4Y2hhbmdlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5wYXNzd29yZF9hdXRoZW50aWNhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlICp0aGlzKQoreworICAgIHRoaXMtPmxvc2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sb2ZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+bG9hbWkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5kZ2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT50aXdpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+ZG93aSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPnN1ZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5zZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5zZGkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5kZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sb2FpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+bG9raSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9hbWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+ZGdpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnRpd2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+ZG93aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5zdWZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnNmaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5zZGksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+ZGZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvYWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9raSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9hbWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+ZGdpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPnRpd2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+ZG93aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdWZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPnNmaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zZGksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+ZGZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvYWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9raSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmxvc2kpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb2ZpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bG9hbWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5kZ2kpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50aXdpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZG93aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1ZmkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zZmkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zZGkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5kZmkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb2FpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bG9raSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2FsYXJtc19zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zICp0aGlzKQoreworICAgIHRoaXMtPmxvc2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sb2ZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+bG9hbWkgPSBCQ01PTFRfU1RBVFVTX09GRjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtc19wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9hbWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9hbGFybXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9hbWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2FsYXJtcyAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmxvc2kpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb2ZpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bG9hbWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpCit7CisgICAgdGhpcy0+bG9zaSA9IDQ7CisgICAgdGhpcy0+bG9maSA9IDQ7CisgICAgdGhpcy0+bG9hbWkgPSAzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb3NpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb2ZpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb2FtaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc191bnBhY2soYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9zaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9maSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9hbWkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxvc2kgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sb3NpID4gMTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxvZmkgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sb2ZpID4gMTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxvYW1pIDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bG9hbWkgPiAxNSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2VxZF9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZXFkICp0aGlzKQoreworICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDA7CisgICAgdGhpcy0+ZXFkID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5lcWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXFkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZXFkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5lcWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXFkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcWRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWQgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDEyNykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9lcWRfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpCit7CisgICAgcmV0dXJuIDQgKyAoNiAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfZXFkICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X2dwb25fb251X2VxZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfZXFkX3VucGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZXFkKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1Nl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgKnRoaXMpCit7CisgICAgcmV0dXJuIDQgKyAoMiAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9pZCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGVuID4gMjU2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXNfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzKQoreworICAgIHRoaXMtPnJlc3BvbnNlX3RpbWVvdXRfbXMgPSAxMDAwOworICAgIHRoaXMtPm1heF9yZXRyeV9jb3VudCA9IDIzOworICAgIHRoaXMtPm9tY2lfZm9ybWF0ID0gQkNNT0xUX09NQ0lfREVWSUNFX0lEX0VYVEVOREVEOworICAgIHRoaXMtPndpbmRvd19zaXplID0gMzI7CisgICAgdGhpcy0+YWN0aXZhdGVfY29tbWl0ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+ZGVsYXlfZm9yX2NvbW1pdF9tcyA9IDQwMDAwVUw7CisgICAgdGhpcy0+bWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgPSAyMzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlc3BvbnNlX3RpbWVvdXRfbXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1heF9yZXRyeV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfb21jaV9kZXZpY2VfaWRfcGFjayh0aGlzLT5vbWNpX2Zvcm1hdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+d2luZG93X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWN0aXZhdGVfY29tbWl0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZGVsYXlfZm9yX2NvbW1pdF9tcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXNfdW5wYWNrKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZXNwb25zZV90aW1lb3V0X21zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5tYXhfcmV0cnlfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29tY2lfZGV2aWNlX2lkX3VucGFjaygmdGhpcy0+b21jaV9mb3JtYXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPndpbmRvd19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmFjdGl2YXRlX2NvbW1pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmRlbGF5X2Zvcl9jb21taXRfbXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+cmVzcG9uc2VfdGltZW91dF9tcyA8IDUwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b21jaV9mb3JtYXQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PTUNJX0RFVklDRV9JRF9CQVNFTElORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTUNJX0RFVklDRV9JRF9FWFRFTkRFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aW5kb3dfc2l6ZSA8IDEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpbmRvd19zaXplID4gMjU2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzICp0aGlzKQoreworICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfcG9uX29udV9pZCkgMDsKKyAgICB0aGlzLT5lcnJvcl9jb2RlID0gQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1VDQ0VTUzsKKyAgICB0aGlzLT5mYWlsX3JlYXNvbiA9IEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX05PX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGVfcGFjayh0aGlzLT5lcnJvcl9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29tY2lfcmVzdWx0X2NvZGVfcGFjayh0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9udV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV91bnBhY2soJnRoaXMtPmVycm9yX2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfb21jaV9yZXN1bHRfY29kZV91bnBhY2soJnRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfcG9uX29udV9pZCkgNTExKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZXJyb3JfY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1VDQ0VTUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX09OVV9SRVNQT05TRV9USU1FT1VUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfT05VX0VSUk9SX1JFU1BPTlNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfVENJX01JU01BVENIOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfR0VUX0lNQUdFX0ZBSUxFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX0FDVElWQVRJT05fRkFJTEVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfSU5URVJOQUw6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmZhaWxfcmVhc29uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9OT19FUlJPUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1BST0NFU1NJTkdfRVJST1I6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfUEFSQU1FVEVSX0VSUk9SOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfVU5LTk9XTl9FTlRJVFk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9VTktOT1dOX0lOU1RBTkNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfREVWSUNFX0JVU1k6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDQgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c191bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKnRoaXMpCit7CisgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgMDsKKyAgICB0aGlzLT5zdGF0ZSA9IEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29udV9zdGF0ZV9wYWNrKHRoaXMtPnN0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV91bnBhY2soYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9udV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfb251X3N0YXRlX3VucGFjaygmdGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9ncG9uX29udV9pZCkgMTI3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX0RPWkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9VTkFXQVJFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDEyOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3BhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKQoreworICAgIHJldHVybiAyICsgKDMgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDEyOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3VucGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbiA+IDEyOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+bG9jYXRpb24gPSAyMDsKKyAgICB0aGlzLT5sb2NhdGlvbl9zaWduID0gQkNNT0xUX1JTU0lfTE9DQVRJT05fU0lHTl9CRUZPUkU7CisgICAgdGhpcy0+c3RhcnRfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPm1pZGRsZV9wYXR0ZXJuID0gMTU7CisgICAgdGhpcy0+bGFzdF9wYXR0ZXJuID0gMTU7CisgICAgdGhpcy0+bWlkZGxlX3JlcGVydGl0aW9uID0gNTA7CisgICAgdGhpcy0+bWluaW11bV9idXJzdCA9IDU1OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bG9jYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Jzc2lfbG9jYXRpb25fc2lnbl9wYWNrKHRoaXMtPmxvY2F0aW9uX3NpZ24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c3RhcnRfcGF0dGVybikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWlkZGxlX3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxhc3RfcGF0dGVybikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWlkZGxlX3JlcGVydGl0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWluaW11bV9idXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ25fdW5wYWNrKCZ0aGlzLT5sb2NhdGlvbl9zaWduLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnN0YXJ0X3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pZGRsZV9wYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sYXN0X3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pZGRsZV9yZXBlcnRpdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1pbmltdW1fYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5sb2NhdGlvbl9zaWduKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfUlNTSV9MT0NBVElPTl9TSUdOX0JFRk9SRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9SU1NJX0xPQ0FUSU9OX1NJR05fQUZURVI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+aW50ZXJ2YWwgPSAxMDAwOworICAgIHRoaXMtPmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0RJU0FCTEU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX3BhY2soY29uc3QgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlX3BhY2sodGhpcy0+b251X3Bvc3RfZGlzY292ZXJ5X21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX3VucGFjayhiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pbnRlcnZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmNvbnRyb2wsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGVfdW5wYWNrKCZ0aGlzLT5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uICp0aGlzKQoreworICAgIGlmICh0aGlzLT5pbnRlcnZhbCA8IDEwMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmludGVydmFsID4gMjE0NzQ4M1VMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b251X3Bvc3RfZGlzY292ZXJ5X21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9OT05FOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0FDVElWQVRFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9zZXRfZGVmYXVsdChiY21vbHRfaG9zdF9zd192ZXJzaW9uICp0aGlzKQoreworICAgIHRoaXMtPm1ham9yID0gMDsKKyAgICB0aGlzLT5taW5vciA9IDA7CisgICAgdGhpcy0+cmV2aXNpb24gPSAwOworICAgIHRoaXMtPm1vZGVsID0gMDsKKyAgICBtZW1zZXQodGhpcy0+YnVpbGRfdGltZSwgMCwgMzIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX3BhY2soY29uc3QgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1ham9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5taW5vcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmV2aXNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tb2RlbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+YnVpbGRfdGltZSwgMzIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX3VucGFjayhiY21vbHRfaG9zdF9zd192ZXJzaW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWFqb3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pbm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXZpc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1vZGVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPmJ1aWxkX3RpbWUsIDMyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDM5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2h3X3Bvbl9pZF9zZXRfZGVmYXVsdChiY21vbHRfaHdfcG9uX2lkICp0aGlzKQoreworICAgIHRoaXMtPnBvbl9pZF8xID0gMDsKKyAgICB0aGlzLT5wb25faWRfMiA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9od19wb25faWRfcGFjayhjb25zdCBiY21vbHRfaHdfcG9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnBvbl9pZF8xKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cG9uX2lkXzIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaHdfcG9uX2lkX3VucGFjayhiY21vbHRfaHdfcG9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBvbl9pZF8xKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cG9uX2lkXzIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaHdfcG9uX2lkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9od19wb25faWRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9od19wb25faWQgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X3NldF9kZWZhdWx0KGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5ICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5jbG9ja19pZGVudGl0eSwgMCwgc2l6ZW9mKHRoaXMtPmNsb2NrX2lkZW50aXR5KSk7CisgICAgdGhpcy0+cG9ydF9udW1iZXIgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9wYWNrKGNvbnN0IGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+Y2xvY2tfaWRlbnRpdHksIDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wb3J0X251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X3VucGFjayhiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+Y2xvY2tfaWRlbnRpdHksIDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3J0X251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2llZWVfODAyMWFzX3BvcnRfaWRlbnRpdHkgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfc2V0X2RlZmF1bHQoYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcCAqdGhpcykKK3sKKyAgICB0aGlzLT5zZWNvbmRzX2hpZ2ggPSAwOworICAgIHRoaXMtPnNlY29uZHNfbG93ID0gMDsKKyAgICB0aGlzLT5uYW5vc2Vjb25kcyA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfcGFjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnNlY29uZHNfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNlY29uZHNfbG93KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bmFub3NlY29uZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wX3VucGFjayhiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnNlY29uZHNfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNlY29uZHNfbG93KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bmFub3NlY29uZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX3NldF9kZWZhdWx0KGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgKnRoaXMpCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+ZGVzdGluYXRpb25fbWFjKTsKKyAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5zb3VyY2VfbWFjKTsKKyAgICB0aGlzLT5ldGhfdHlwZV9sZW4gPSAwOworICAgIHRoaXMtPmV0aF9zdWJ0eXBlID0gMDsKKyAgICBtZW1zZXQodGhpcy0+aWVlZV9vdWksIDAsIHNpemVvZih0aGlzLT5pZWVlX291aSkpOworICAgIHRoaXMtPm1zZ19pZCA9IDA7CisgICAgdGhpcy0+eCA9IDA7CisgICAgdGhpcy0+dG9kLnNlY29uZHNfaGlnaCA9IDA7CisgICAgdGhpcy0+dG9kLnNlY29uZHNfbG93ID0gMDsKKyAgICB0aGlzLT50b2QubmFub3NlY29uZHMgPSAwOworICAgIG1lbXNldCh0aGlzLT5wb3J0X2lkZW50aXR5LmNsb2NrX2lkZW50aXR5LCAwLCBzaXplb2YodGhpcy0+cG9ydF9pZGVudGl0eS5jbG9ja19pZGVudGl0eSkpOworICAgIHRoaXMtPnBvcnRfaWRlbnRpdHkucG9ydF9udW1iZXIgPSAwOworICAgIHRoaXMtPmxvZ19tc2dfaW50ZXJ2YWwgPSAwOworICAgIHRoaXMtPnJhdGVfcmF0aW8gPSAwOworICAgIHRoaXMtPmdtX3RpbWVfYmFzZV9pbmRpY2F0b3IgPSAwOworICAgIG1lbXNldCh0aGlzLT5sYXN0X2dtX3BoYXNlX2NoYW5nZSwgMCwgc2l6ZW9mKHRoaXMtPmxhc3RfZ21fcGhhc2VfY2hhbmdlKSk7CisgICAgdGhpcy0+bGFzdF9mcmVxdWVuY3lfY2hhbmdlID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVfc3luY19wYWNrKGNvbnN0IGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5kZXN0aW5hdGlvbl9tYWMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnNvdXJjZV9tYWMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5ldGhfdHlwZV9sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmV0aF9zdWJ0eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5pZWVlX291aSwgMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1zZ19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPngpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcF9wYWNrKCZ0aGlzLT50b2QsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9wYWNrKCZ0aGlzLT5wb3J0X2lkZW50aXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zOChidWYsIHRoaXMtPmxvZ19tc2dfaW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9kb3VibGUoYnVmLCB0aGlzLT5yYXRlX3JhdGlvKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+Z21fdGltZV9iYXNlX2luZGljYXRvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+bGFzdF9nbV9waGFzZV9jaGFuZ2UsIDEyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfczMyKGJ1ZiwgdGhpcy0+bGFzdF9mcmVxdWVuY3lfY2hhbmdlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVfc3luY191bnBhY2soYmNtb2x0X2llZWVfODAyMWFzX3RpbWVfc3luYyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmRlc3RpbmF0aW9uX21hYykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+c291cmNlX21hYykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmV0aF90eXBlX2xlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZXRoX3N1YnR5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aWVlZV9vdWksIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tc2dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT54KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfdW5wYWNrKCZ0aGlzLT50b2QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X3VucGFjaygmdGhpcy0+cG9ydF9pZGVudGl0eSwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPmxvZ19tc2dfaW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2RvdWJsZShidWYsICZ0aGlzLT5yYXRlX3JhdGlvKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+Z21fdGltZV9iYXNlX2luZGljYXRvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5sYXN0X2dtX3BoYXNlX2NoYW5nZSwgMTIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3MzMihidWYsICZ0aGlzLT5sYXN0X2ZyZXF1ZW5jeV9jaGFuZ2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNzEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcF9ib3VuZHNfY2hlY2soJnRoaXMtPnRvZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9ib3VuZHNfY2hlY2soJnRoaXMtPnBvcnRfaWRlbnRpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX3NldF9kZWZhdWx0KGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgKnRoaXMpCit7CisgICAgdGhpcy0+ZW5hYmxlZCA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPm1heF9yYXRlID0gMTAwMDsKKyAgICB0aGlzLT5tYXhfYnVyc3QgPSAxMDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmdfcGFjayhjb25zdCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5lbmFibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWF4X3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhfYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX3VucGFjayhiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5lbmFibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tYXhfYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm1heF9yYXRlIDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bWF4X3JhdGUgPiAxMDAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bWF4X2J1cnN0IDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bWF4X2J1cnN0ID4gMTAwMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSAxNTsKKyAgICB0aGlzLT5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICB0aGlzLT5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IDQwOworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gPSAxNTsKKyAgICB0aGlzLT5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSAwOworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24gPSAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+cmVzeW5jX2NvbnRyb2wsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+cmFuZ2luZ19yZXN5bmNfY29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfdW5wYWNrKCZ0aGlzLT5yZXN5bmNfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX3VucGFjaygmdGhpcy0+cmFuZ2luZ19yZXN5bmNfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+cmVzeW5jX2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+cmFuZ2luZ19yZXN5bmNfY29udHJvbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9sb2dfYnVmZmVyX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfYnVmZmVyICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5idWZmLCAwLCAyMDQ4KTsKKyAgICB0aGlzLT5tc2dfdG9fcmVhZCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfYnVmZmVyX3BhY2soY29uc3QgYmNtb2x0X2xvZ19idWZmZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5idWZmLCAyMDQ4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bXNnX3RvX3JlYWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2J1ZmZlcl91bnBhY2soYmNtb2x0X2xvZ19idWZmZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPmJ1ZmYsIDIwNDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tc2dfdG9fcmVhZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfYnVmZmVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjA1Mik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfYnVmZmVyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nX2J1ZmZlciAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICB0aGlzLT5taXNzX2ZhbGxiYWNrID0gQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX0RST1A7CisgICAgdGhpcy0+ZGVmYXVsdF9mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSAwOworICAgIHRoaXMtPmFnaW5nX3RpbWUgPSAzMDsKKyAgICB0aGlzLT5sZWFybmluZ19tb2RlID0gQkNNT0xUX01BQ19UQUJMRV9MRUFSTklOR19NT0RFX05PUk1BTDsKKyAgICB0aGlzLT5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB0aGlzLT5hdXRvbWF0aWNfbWFjX2FnaW5nID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB0aGlzLT5hdXRvbWF0aWNfbWFjX21vdmUgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPmF1dG9tYXRpY19zdGF0aWNfbW9kZSA9IEJDTU9TX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFja19wYWNrKHRoaXMtPm1pc3NfZmFsbGJhY2ssIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZGVmYXVsdF9mbG93X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YWdpbmdfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGVfcGFjayh0aGlzLT5sZWFybmluZ19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5hdXRvbWF0aWNfbWFjX2FnaW5nLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5hdXRvbWF0aWNfbWFjX21vdmUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5hdXRvbWF0aWNfc3RhdGljX21vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrX3VucGFjaygmdGhpcy0+bWlzc19mYWxsYmFjaywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmRlZmF1bHRfZmxvd19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmFnaW5nX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlX3VucGFjaygmdGhpcy0+bGVhcm5pbmdfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+YXV0b21hdGljX21hY19sZWFybmluZywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+YXV0b21hdGljX21hY19hZ2luZywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+YXV0b21hdGljX21hY19tb3ZlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YXV0b21hdGljX3N0YXRpY19tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPm1pc3NfZmFsbGJhY2spCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19EUk9QOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX0RFRkFVTFRfRkxPVzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19WSUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+ZGVmYXVsdF9mbG93X2lkID4gKGJjbW9sdF9mbG93X2lkKSA0MDk1KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5hZ2luZ190aW1lIDwgMzApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmFnaW5nX3RpbWUgPiA4NjQwMFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhcm5pbmdfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01BQ19UQUJMRV9MRUFSTklOR19NT0RFX05PUk1BTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NQUNfVEFCTEVfTEVBUk5JTkdfTU9ERV9NT1ZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hdXRvbWF0aWNfbWFjX2FnaW5nKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hdXRvbWF0aWNfbWFjX21vdmUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDYgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl91bnBhY2soYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb3NfbWFjX2FkZHJlc3MgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vc19tYWNfYWRkcmVzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vc19tYWNfYWRkcmVzcykgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfc2V0X2RlZmF1bHQoYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9wYWNrKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyMDQ4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDYgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF91bnBhY2soYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb3NfbWFjX2FkZHJlc3MgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vc19tYWNfYWRkcmVzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDIwNDgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vc19tYWNfYWRkcmVzcykgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGVuID4gMjA0OCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9saW5rX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfbm5pX2xpbmtfc3RhdHVzICp0aGlzKQoreworICAgIHRoaXMtPmxpbmtfc3RhdHVzID0gQkNNT0xUX1RSSVZBTEVOVF9GQUxTRTsKKyAgICB0aGlzLT5zaWduYWxfZGV0ZWN0ZWQgPSBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFOworICAgIHRoaXMtPnBtZF9sb2NrZWQgPSBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2xpbmtfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X25uaV9saW5rX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3RyaXZhbGVudF9wYWNrKHRoaXMtPmxpbmtfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3RyaXZhbGVudF9wYWNrKHRoaXMtPnNpZ25hbF9kZXRlY3RlZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF90cml2YWxlbnRfcGFjayh0aGlzLT5wbWRfbG9ja2VkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2xpbmtfc3RhdHVzX3VucGFjayhiY21vbHRfbm5pX2xpbmtfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfdHJpdmFsZW50X3VucGFjaygmdGhpcy0+bGlua19zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdHJpdmFsZW50X3VucGFjaygmdGhpcy0+c2lnbmFsX2RldGVjdGVkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3RyaXZhbGVudF91bnBhY2soJnRoaXMtPnBtZF9sb2NrZWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfbGlua19zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9saW5rX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9saW5rX3N0YXR1cyAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmxpbmtfc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RSSVZBTEVOVF9UUlVFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RSSVZBTEVOVF9OT1RfQVBQTElDQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c2lnbmFsX2RldGVjdGVkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RSSVZBTEVOVF9UUlVFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RSSVZBTEVOVF9OT1RfQVBQTElDQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cG1kX2xvY2tlZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1RSSVZBTEVOVF9GQUxTRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9UUklWQUxFTlRfVFJVRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9UUklWQUxFTlRfTk9UX0FQUExJQ0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5zZW5kX3BlcmlvZCA9IDA7CisgICAgdGhpcy0+dHJhbnNtaXRfZnJhbWUubGVuID0gMDsKKyAgICB0aGlzLT50cmFuc21pdF9mcmFtZS52YWwgPSBOVUxMOworICAgIHRoaXMtPmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMubGVuID0gMDsKKyAgICB0aGlzLT5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgdGhpcy0+aWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLmxlbiA9IDA7CisgICAgdGhpcy0+aWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgdGhpcy0+cmVjZWl2ZV90aW1lb3V0ID0gMTsKKyAgICB0aGlzLT5tYXhpbXVtX3JlY2VpdmVfc2l6ZSA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5zZW5kX3BlcmlvZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MTZfcGFjaygmdGhpcy0+dHJhbnNtaXRfZnJhbWUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3BhY2soJnRoaXMtPmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cmVjZWl2ZV90aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4aW11bV9yZWNlaXZlX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcykKK3sKKyAgICByZXR1cm4gNiArIGJjbW9sdF91OF9saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dHJhbnNtaXRfZnJhbWUpICsgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+aWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX3VucGFjayhiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c2VuZF9wZXJpb2QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X3VucGFjaygmdGhpcy0+dHJhbnNtaXRfZnJhbWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfdW5wYWNrKCZ0aGlzLT5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cmVjZWl2ZV90aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bWF4aW11bV9yZWNlaXZlX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcykKK3sKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9ib3VuZHNfY2hlY2soJnRoaXMtPnRyYW5zbWl0X2ZyYW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfYm91bmRzX2NoZWNrKCZ0aGlzLT5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5yZWNlaXZlX3RpbWVvdXQgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICB0aGlzLT5pbG93cG93ZXIgPSAxNjAwOworICAgIHRoaXMtPmlhd2FyZSA9IDE2MDsKKyAgICB0aGlzLT5pdHJhbnNpbml0ID0gODA7CisgICAgdGhpcy0+aXR4aW5pdCA9IDQwOworICAgIHRoaXMtPmlyeG9mZiA9IDE2MDA7CisgICAgdGhpcy0+bG93X3Bvd2VyX2Nsb2JpID0gODsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pbG93cG93ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pYXdhcmUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5pdHJhbnNpbml0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+aXR4aW5pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlyeG9mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxvd19wb3dlcl9jbG9iaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pbG93cG93ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pYXdhcmUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5pdHJhbnNpbml0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aXR4aW5pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlyeG9mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxvd19wb3dlcl9jbG9iaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmlsb3dwb3dlciA8IDgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmlsb3dwb3dlciA+IDQ4MDAwMFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5pYXdhcmUgPCA4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5pYXdhcmUgPiA0ODAwMDBVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+aXRyYW5zaW5pdCA+IDgwMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPml0eGluaXQgPiA4MDAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5pcnhvZmYgPCA4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5pcnhvZmYgPiA0ODAwMDBVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bG93X3Bvd2VyX2Nsb2JpIDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bG93X3Bvd2VyX2Nsb2JpID4gMTAyMykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPnRzb3VyY2UgPSAxMDAwOworICAgIHRoaXMtPnR0YXJnZXQgPSAxMDAwOworICAgIHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkID0gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dHNvdXJjZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnR0YXJnZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmVxdWVzdF9yZWdpc3RyYXRpb25fcmVxdWlyZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRzb3VyY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50dGFyZ2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcG9uX2lkX3NldF9kZWZhdWx0KGJjbW9sdF9wb25faWQgKnRoaXMpCit7CisgICAgdGhpcy0+YWRtaW5pc3RyYXRpdmVfbGFiZWwgPSAwOworICAgIHRoaXMtPmR3bGNoX2lkID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9pZF9wYWNrKGNvbnN0IGJjbW9sdF9wb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YWRtaW5pc3RyYXRpdmVfbGFiZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmR3bGNoX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9pZF91bnBhY2soYmNtb2x0X3Bvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hZG1pbmlzdHJhdGl2ZV9sYWJlbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZHdsY2hfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2lkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25faWRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25faWQgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmFkbWluaXN0cmF0aXZlX2xhYmVsID4gNDI5NDk2NzI4MFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5kd2xjaF9pZCA+IDcpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9vcGVyYXRpb25fY29udHJvbF9zZXRfZGVmYXVsdChiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgKnRoaXMpCit7CisgICAgdGhpcy0+cmUgPSAwOworICAgIHRoaXMtPm9kbl9jbGFzcyA9IEJDTU9MVF9PRE5fQ0xBU1NfTjE7CisgICAgdGhpcy0+ZHNfZmVjX21vZGUgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgdGhpcy0+cHJvdG9jb2wgPSBCQ01PTFRfVENfUFJPVE9DT0xfVENfTEFZRVJfUFJPVE9DT0xfR185ODlfUF8zOworICAgIHRoaXMtPmRzX2xpbmtfdHlwZSA9IEJDTU9MVF9MSU5LX1RZUEVfVU5TUEVDSUZJRUQ7CisgICAgdGhpcy0+cG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsID0gMDsKKyAgICB0aGlzLT5wb25faWQuZHdsY2hfaWQgPSAwOworICAgIHRoaXMtPmMgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfcGFjayhjb25zdCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfb2RuX2NsYXNzX3BhY2sodGhpcy0+b2RuX2NsYXNzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5kc19mZWNfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF90Y19wcm90b2NvbF9wYWNrKHRoaXMtPnByb3RvY29sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xpbmtfdHlwZV9wYWNrKHRoaXMtPmRzX2xpbmtfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9wb25faWRfcGFjaygmdGhpcy0+cG9uX2lkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfdW5wYWNrKGJjbW9sdF9vcGVyYXRpb25fY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9vZG5fY2xhc3NfdW5wYWNrKCZ0aGlzLT5vZG5fY2xhc3MsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmRzX2ZlY19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3RjX3Byb3RvY29sX3VucGFjaygmdGhpcy0+cHJvdG9jb2wsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGlua190eXBlX3VucGFjaygmdGhpcy0+ZHNfbGlua190eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Bvbl9pZF91bnBhY2soJnRoaXMtPnBvbl9pZCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vcGVyYXRpb25fY29udHJvbF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sICp0aGlzKQoreworICAgIGlmICh0aGlzLT5yZSA+IDEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vZG5fY2xhc3MpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PRE5fQ0xBU1NfTjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0ROX0NMQVNTX04yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09ETl9DTEFTU19FMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PRE5fQ0xBU1NfRTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmRzX2ZlY19tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5wcm90b2NvbCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1RDX1BST1RPQ09MX1RDX0xBWUVSX1BST1RPQ09MX0dfOTg3X1BfMzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9UQ19QUk9UT0NPTF9UQ19MQVlFUl9QUk9UT0NPTF9HXzk4OV9QXzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmRzX2xpbmtfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTktfVFlQRV9VTlNQRUNJRklFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9MSU5LX1RZUEVfQjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9MSU5LX1RZUEVfQToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9MSU5LX1RZUEVfQV9BTkRfQjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Bvbl9pZF9ib3VuZHNfY2hlY2soJnRoaXMtPnBvbl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmMgPiAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ19zZXRfZGVmYXVsdChiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyAqdGhpcykKK3sKKyAgICB0aGlzLT5pbnRlcnZhbCA9IDUwMDA7CisgICAgdGhpcy0+Y29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3BhY2soY29uc3QgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ191bnBhY2soYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmludGVydmFsIDwgMTAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRyb2wpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciAqdGhpcykKK3sKKyAgICB0aGlzLT5iYW5kd2lkdGhfa2JwcyA9IDA7CisgICAgdGhpcy0+bWJzX2tCID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJhbmR3aWR0aF9rYnBzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWJzX2tCKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3VucGFjayhiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YmFuZHdpZHRoX2ticHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tYnNfa0IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm1ic19rQiA+IDQwMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fYWxsb2Nfc2xhICp0aGlzKQoreworICAgIHRoaXMtPmNicl9ydF9idyA9IDA7CisgICAgdGhpcy0+Y2JyX25ydF9idyA9IDA7CisgICAgdGhpcy0+Z3VhcmFudGVlZF9idyA9IDA7CisgICAgdGhpcy0+bWF4aW11bV9idyA9IDA7CisgICAgdGhpcy0+YWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSA9IEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX05PTkU7CisgICAgdGhpcy0+Y2JyX3J0X2NvbXBlbnNhdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmNicl9ydF9hcF9pbmRleCA9IDA7CisgICAgdGhpcy0+Y2JyX25ydF9hcF9pbmRleCA9IDA7CisgICAgdGhpcy0+YWxsb2NfdHlwZSA9IEJDTU9MVF9BTExPQ19UWVBFX05PTkU7CisgICAgdGhpcy0+d2VpZ2h0ID0gMDsKKyAgICB0aGlzLT5wcmlvcml0eSA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9hbGxvY19zbGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y2JyX3J0X2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y2JyX25ydF9idykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmd1YXJhbnRlZWRfYncpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhpbXVtX2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5X3BhY2sodGhpcy0+YWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNicl9ydF9jb21wZW5zYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNicl9ydF9hcF9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y2JyX25ydF9hcF9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWxsb2NfdHlwZV9wYWNrKHRoaXMtPmFsbG9jX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+d2VpZ2h0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wcmlvcml0eSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3VucGFjayhiY21vbHRfcG9uX2FsbG9jX3NsYSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jYnJfcnRfYncpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jYnJfbnJ0X2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Z3VhcmFudGVlZF9idykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1heGltdW1fYncpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHlfdW5wYWNrKCZ0aGlzLT5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y2JyX3J0X2NvbXBlbnNhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y2JyX3J0X2FwX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jYnJfbnJ0X2FwX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hbGxvY190eXBlX3VucGFjaygmdGhpcy0+YWxsb2NfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT53ZWlnaHQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnByaW9yaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hbGxvY19zbGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWxsb2Nfc2xhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2FsbG9jX3NsYSAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX05PTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQURESVRJT05BTF9CV19FTElHSUJJTElUWV9OT05fQVNTVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX0JFU1RfRUZGT1JUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmNicl9ydF9hcF9pbmRleCA+IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmNicl9ucnRfYXBfaW5kZXggPiAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWxsb2NfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1RZUEVfTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19UWVBFX05TUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19UWVBFX1NSOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndlaWdodCA+IDEwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+cHJpb3JpdHkgPiA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoICp0aGlzKQoreworICAgIHRoaXMtPmNicl9idyA9IDA7CisgICAgdGhpcy0+dG90YWxfYncgPSAwOworICAgIHRoaXMtPm5leHRfb251X3RvdGFsX2J3ID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNicl9idykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnRvdGFsX2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bmV4dF9vbnVfdG90YWxfYncpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfdW5wYWNrKGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jYnJfYncpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50b3RhbF9idykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm5leHRfb251X3RvdGFsX2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Bvbl9kYmFfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9kYmEgKnRoaXMpCit7CisgICAgdGhpcy0+c3JfcmVwb3J0aW5nX2Jsb2NrX3NpemUgPSA0ODsKKyAgICB0aGlzLT5kYmFfbW9kZSA9IEJDTU9MVF9EQkFfTU9ERV9OT1JNQUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZGJhX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9kYmEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZGJhX21vZGVfcGFjayh0aGlzLT5kYmFfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kYmFfdW5wYWNrKGJjbW9sdF9wb25fZGJhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c3JfcmVwb3J0aW5nX2Jsb2NrX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2RiYV9tb2RlX3VucGFjaygmdGhpcy0+ZGJhX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZGJhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZGJhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2RiYSAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmRiYV9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX01PREVfTk9STUFMOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9NT0RFX0VYVEVOREVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wb25fZGlzdGFuY2Vfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9kaXN0YW5jZSAqdGhpcykKK3sKKyAgICB0aGlzLT5tYXhfbG9nX2Rpc3RhbmNlID0gMjA7CisgICAgdGhpcy0+bWF4X2RpZmZfcmVhY2ggPSAyMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kaXN0YW5jZV9wYWNrKGNvbnN0IGJjbW9sdF9wb25fZGlzdGFuY2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWF4X2xvZ19kaXN0YW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1heF9kaWZmX3JlYWNoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kaXN0YW5jZV91bnBhY2soYmNtb2x0X3Bvbl9kaXN0YW5jZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tYXhfbG9nX2Rpc3RhbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X2RpZmZfcmVhY2gpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2Rpc3RhbmNlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZGlzdGFuY2VfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25fZGlzdGFuY2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm1heF9sb2dfZGlzdGFuY2UgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5tYXhfbG9nX2Rpc3RhbmNlID4gMTAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5tYXhfZGlmZl9yZWFjaCA8IDEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPm1heF9kaWZmX3JlYWNoID4gNjApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbF9zZXRfZGVmYXVsdChiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgKnRoaXMpCit7CisgICAgdGhpcy0+ZHJpZnRfaW50ZXJ2YWwgPSAxMDAwOworICAgIHRoaXMtPmRyaWZ0X2xpbWl0ID0gNDsKKyAgICB0aGlzLT50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCA9IDg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbF9wYWNrKGNvbnN0IGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5kcmlmdF9pbnRlcnZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZHJpZnRfbGltaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX3VucGFjayhiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZHJpZnRfaW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmRyaWZ0X2xpbWl0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+ZHJpZnRfaW50ZXJ2YWwgPiA2MDAwMFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5kcmlmdF9saW1pdCA8IDEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmRyaWZ0X2xpbWl0ID4gMzIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0IDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+dHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQgPiA2NCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDIgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl91bnBhY2soYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X3Bvbl9vbnVfaWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfcG9uX29udV9pZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9wb25fb251X2lkKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgKnRoaXMpCit7CisgICAgdGhpcy0+cGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplID0gMTIwOworICAgIHRoaXMtPm1vZGUgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wbHNfbWF4aW11bV9hbGxvY2F0aW9uX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3VucGFjayhiY21vbHRfcG9uX3Bvd2VyX2xldmVsICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bW9kZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWxfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zZXRfZGVmYXVsdChiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzKQoreworICAgIHRoaXMtPnRpbWVvdXQgPSAxMDA7CisgICAgdGhpcy0+Z3Bpb19waW4gPSBCQ01PTFRfR1BJT19QSU5fVU5DT05GSUdVUkVEOworICAgIHRoaXMtPm9wdGlvbnMgPSAoYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zKSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT50aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl9wYWNrKHRoaXMtPmdwaW9fcGluLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3BhY2sodGhpcy0+b3B0aW9ucywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ191bnBhY2soYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT50aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl91bnBhY2soJnRoaXMtPmdwaW9fcGluLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3VucGFjaygmdGhpcy0+b3B0aW9ucywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+Z3Bpb19waW4pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4wOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjExOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjczOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwMzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwNjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm9wdGlvbnMgJiAweEZGRkZGRkZDVUwpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wb25fc3RhdHVzX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fc3RhdHVzICp0aGlzKQoreworICAgIHRoaXMtPnN0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICB0aGlzLT5sb3Nfc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9wb25fc3RhdGVfcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3Nfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3N0YXR1c191bnBhY2soYmNtb2x0X3Bvbl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9wb25fc3RhdGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3Nfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9zdGF0dXMgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUE9OX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb3Nfc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5wb2x5bm9tID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzc7CisgICAgdGhpcy0+bW9kZSA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9TRUxGX1NZTkM7CisgICAgdGhpcy0+ZGF0YV9pbnZlcnQgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfcGFjayhjb25zdCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3ByYnNfcG9seW5vbWlhbF9wYWNrKHRoaXMtPnBvbHlub20sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfcHJic19jaGVja2VyX21vZGVfcGFjayh0aGlzLT5tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGF0YV9pbnZlcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ191bnBhY2soYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9wcmJzX3BvbHlub21pYWxfdW5wYWNrKCZ0aGlzLT5wb2x5bm9tLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlX3VucGFjaygmdGhpcy0+bW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmRhdGFfaW52ZXJ0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+cG9seW5vbSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfOToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18xMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18xNToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18yMzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18zMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU181ODoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfQ0hFQ0tFUl9NT0RFX1NFTEZfU1lOQzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9JTklUSUFMX1NFRURfTU9ERToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9JTklUSUFMX1NFRURfTU9ERV8yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb250cm9sKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5wb2x5bm9tID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzc7CisgICAgdGhpcy0+ZXJyb3JfaW5zZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+aW52ZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+Y29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfcGFjayhjb25zdCBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfcHJic19wb2x5bm9taWFsX3BhY2sodGhpcy0+cG9seW5vbSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmVycm9yX2luc2VydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pbnZlcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3VucGFjayhiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfcHJic19wb2x5bm9taWFsX3VucGFjaygmdGhpcy0+cG9seW5vbSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmVycm9yX2luc2VydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pbnZlcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5wb2x5bm9tKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU185OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzExOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzE1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzIzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzMxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzU4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb250cm9sKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wcmJzX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfcHJic19zdGF0dXMgKnRoaXMpCit7CisgICAgdGhpcy0+bG9ja19zdGF0ZSA9IEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfVU5MT0NLRUQ7CisgICAgdGhpcy0+ZXJyb3JfY291bnRzID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X3ByYnNfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfcHJic19sb2NrX3N0YXRlX3BhY2sodGhpcy0+bG9ja19zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZXJyb3JfY291bnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfc3RhdHVzX3VucGFjayhiY21vbHRfcHJic19zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9wcmJzX2xvY2tfc3RhdGVfdW5wYWNrKCZ0aGlzLT5sb2NrX3N0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5lcnJvcl9jb3VudHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfc3RhdHVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcHJic19zdGF0dXMgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5sb2NrX3N0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfUFJCU19MT0NLX1NUQVRFX1VOTE9DS0VEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfTE9DS19TVEFURV9MT0NLRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICB0aGlzLT53YWl0X3N0YXRlXzFfd2luZG93X3NpemUgPSAwOworICAgIHRoaXMtPndhaXRfc3RhdGVfMl93aW5kb3dfc2l6ZSA9IDA7CisgICAgdGhpcy0+d2FpdF9hZnRlcl9yZXN5bmNfNCA9IEJDTU9TX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53YWl0X3N0YXRlXzFfd2luZG93X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndhaXRfc3RhdGVfMl93aW5kb3dfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT53YWl0X2FmdGVyX3Jlc3luY180KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT53YWl0X3N0YXRlXzFfd2luZG93X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndhaXRfc3RhdGVfMl93aW5kb3dfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT53YWl0X2FmdGVyX3Jlc3luY180KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19zZXRfZGVmYXVsdChiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyAqdGhpcykKK3sKKyAgICB0aGlzLT5hZnRlcl9pbml0ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+YWZ0ZXJfbm9fZWQgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5hZnRlcl9lZCA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFmdGVyX25vX2RlbCA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFmdGVyX3JhbmdpbmdfYWNjZXNzID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+bWVkX3ZhbCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zX3BhY2soY29uc3QgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmFmdGVyX2luaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfbm9fZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfbm9fZGVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmFmdGVyX3JhbmdpbmdfYWNjZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWVkX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zX3VucGFjayhiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YWZ0ZXJfaW5pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9ub19lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9ub19kZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YWZ0ZXJfcmFuZ2luZ19hY2Nlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tZWRfdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2xfc2V0X2RlZmF1bHQoYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sICp0aGlzKQoreworICAgIHRoaXMtPmFmdGVyX25vX2VkID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+YWZ0ZXJfZWQgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5hZnRlcl9yZXNldF8zID0gQkNNT1NfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9wYWNrKGNvbnN0IGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfbm9fZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfcmVzZXRfMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF91bnBhY2soYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9ub19lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9yZXNldF8zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzX3NldF9kZWZhdWx0KGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgKnRoaXMpCit7CisgICAgdGhpcy0+cmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdGUgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPnNtYV9mbGFnID0gQkNNT1NfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c21hX2ZsYWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzX3VucGFjayhiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c21hX2ZsYWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX3NldF9kZWZhdWx0KGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgKnRoaXMpCit7CisgICAgdGhpcy0+cGxvX3NpemUgPSAwOworICAgIHRoaXMtPmFsbG9jX2lkID0gKGJjbW9sdF9wb25fYWxsb2NfaWQpIDA7CisgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF9wb25fb251X2lkKSAwOworICAgIHRoaXMtPmFjY2Vzc19zaXplID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9wYWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cGxvX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmFsbG9jX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmFjY2Vzc19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF91bnBhY2soYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5wbG9fc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmFjY2Vzc19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwICp0aGlzKQoreworICAgIGlmICh0aGlzLT5hbGxvY19pZCA+IChiY21vbHRfcG9uX2FsbG9jX2lkKSAxNjM4MykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9wb25fb251X2lkKSA1MTEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzhfc2V0X2RlZmF1bHQoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhfcGFjayhjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX3BhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84ICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDkgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84X3VucGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiA4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF91bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogOSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzggKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbiA+IDgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NldF9kZWZhdWx0KGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtICp0aGlzKQoreworICAgIHRoaXMtPmFsZ29yaXRobV90eXBlID0gKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUpIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3BhY2soY29uc3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfcGFjayh0aGlzLT5hbGdvcml0aG1fdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFsZ29yaXRobV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VBUkxZX1JPR1VFX0RFVEVDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3BhY2sodGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uc2Vjb25kX3Jhbmdpbmdfd2luZG93KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW5fcGFjayh0aGlzLT51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhfcGFjaygmdGhpcy0+dS5zcGVjaWFsX21hcC5hY2Nlc3NlcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VYVEVOREVEX0dVQVJEX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0gKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+YWxnb3JpdGhtX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRUFSTFlfUk9HVUVfREVURUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX1NQRUNJQUxfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdW5wYWNrKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlX3VucGFjaygmdGhpcy0+YWxnb3JpdGhtX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hbGdvcml0aG1fdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd191bnBhY2soJnRoaXMtPnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLnNlY29uZF9yYW5naW5nX3dpbmRvdykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuX3VucGFjaygmdGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uYWxsb2NfdHlwZV90b19zY2FuLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfU1BFQ0lBTF9NQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84X3VucGFjaygmdGhpcy0+dS5zcGVjaWFsX21hcC5hY2Nlc3NlcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRVhURU5ERURfR1VBUkRfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUgYWxnb3JpdGhtX3R5cGU7CisgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlX3VucGFjaygmYWxnb3JpdGhtX3R5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChhbGdvcml0aG1fdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX1NQRUNJQUxfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VYVEVOREVEX0dVQVJEX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+YWxnb3JpdGhtX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRUFSTFlfUk9HVUVfREVURUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfU0lMRU5UX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0NVVF9PRkZfV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmludGVydmFsIDwgMTAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwgPiAxMDAwMDAwMFVMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uYWxsb2NfdHlwZV90b19zY2FuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX1VOVVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fUFJFVklPVVNMWV9VU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1RZUEVfVE9fU0NBTl9BTEw6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX1NQRUNJQUxfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbiA+IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84X2JvdW5kc19jaGVjaygmdGhpcy0+dS5zcGVjaWFsX21hcC5hY2Nlc3NlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9ndWFyZF90aW1lID4gNTAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX3NldF9kZWZhdWx0KGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgKnRoaXMpCit7CisgICAgdGhpcy0+Y29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRUFSTFlfUk9HVUVfREVURUNUSU9OOworICAgIHRoaXMtPmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c7CisgICAgdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5pbnRlcnZhbCA9IDEwMDAwOworICAgIHRoaXMtPmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uc2Vjb25kX3Jhbmdpbmdfd2luZG93ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4gPSBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX0FMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzc19wYWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3BhY2soJnRoaXMtPmRldGVjdGlvbl9hbGdvcml0aG0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfdW5wYWNrKGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3VucGFjaygmdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobSwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRyb2wpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2JvdW5kc19jaGVjaygmdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+cmFuZ2luZ19tb2RlID0gQkNNT0xUX1NFUkRFU19SQU5HSU5HX01PREVfQkNEUl9SRVNFVF9NT0RFOworICAgIHRoaXMtPm11bHRpX2VkX21vZGUgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5idXJzdF9lbmFibGVfc3RhcnRfb2Zmc2V0ID0gMDsKKyAgICB0aGlzLT5idXJzdF9lbmFibGVfZW5kX29mZnNldCA9IDA7CisgICAgdGhpcy0+ZWRfaW52ZXJ0aW9uID0gQkNNT1NfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGVfcGFjayh0aGlzLT5yYW5naW5nX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tdWx0aV9lZF9tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+YnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmVkX2ludmVydGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZV91bnBhY2soJnRoaXMtPnJhbmdpbmdfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm11bHRpX2VkX21vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5idXJzdF9lbmFibGVfc3RhcnRfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+YnVyc3RfZW5hYmxlX2VuZF9vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZWRfaW52ZXJ0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+cmFuZ2luZ19tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9FRF9NT0RFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NFUkRFU19SQU5HSU5HX01PREVfQkNEUl9SRVNFVF9NT0RFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NFUkRFU19SQU5HSU5HX01PREVfRkFTVF9NT0RFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3NldF9kZWZhdWx0KGJjbW9sdF9zZXJpYWxfbnVtYmVyICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT52ZW5kb3JfaWQsIDAsIHNpemVvZih0aGlzLT52ZW5kb3JfaWQpKTsKKyAgICBtZW1zZXQodGhpcy0+dmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+dmVuZG9yX3NwZWNpZmljKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3BhY2soY29uc3QgYmNtb2x0X3NlcmlhbF9udW1iZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT52ZW5kb3JfaWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPnZlbmRvcl9zcGVjaWZpYywgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjayhiY21vbHRfc2VyaWFsX251bWJlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dmVuZG9yX2lkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnZlbmRvcl9zcGVjaWZpYywgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfc2VyaWFsX251bWJlciAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfc2V0X2RlZmF1bHQoYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgKnRoaXMpCit7CisgICAgdGhpcy0+YmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSAwOworICAgIHRoaXMtPm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5wcmlvcml0eSA9IDA7CisgICAgdGhpcy0+d2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfcGFjayhjb25zdCBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmJhbmR3aWR0aF9LYnBzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5tYXhfYnVyc3Rfc2l6ZV90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cHJpb3JpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPndlaWdodF90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3VucGFjayhiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+YmFuZHdpZHRoX0ticHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+bWF4X2J1cnN0X3NpemVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnByaW9yaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPndlaWdodF90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPnByaW9yaXR5ID4gNykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2VpZ2h0X3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgMjYyMTA2VUwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzKQoreworICAgIHRoaXMtPnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3BhY2soY29uc3QgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJhdGVfdGhyZXNob2xkLnJpc2luZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yYXRlX3JhbmdlLnVwcGVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yYXRlX3JhbmdlLmxvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudmFsdWVfdGhyZXNob2xkLmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfdW5wYWNrKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dS5yYXRlX3RocmVzaG9sZC5yaXNpbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnUucmF0ZV9yYW5nZS51cHBlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnUucmF0ZV9yYW5nZS5sb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51LnZhbHVlX3RocmVzaG9sZC5saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSB0eXBlOworICAgIGlmICghYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICB0aGlzLT5jbGVhcl9zb2FrX3RpbWUgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmFjdGl2ZV9zb2FrX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jbGVhcl9zb2FrX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZ191bnBhY2soYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YWN0aXZlX3NvYWtfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNsZWFyX3NvYWtfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgIHRoaXMtPnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IDA7CisgICAgdGhpcy0+c29hay5jbGVhcl9zb2FrX3RpbWUgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjayhjb25zdCBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3BhY2soJnRoaXMtPnRyaWdnZXIsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZ19wYWNrKCZ0aGlzLT5zb2FrLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyAqdGhpcykKK3sKKyAgICByZXR1cm4gOCArIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT50cmlnZ2VyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjayhiY21vbHRfc3RhdF9hbGFybV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3VucGFjaygmdGhpcy0+dHJpZ2dlciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWdfdW5wYWNrKCZ0aGlzLT5zb2FrLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT50cmlnZ2VyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+c29haykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9zdHJfMTAwX3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfMTAwICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5zdHIsIDAsIDEwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwX3BhY2soY29uc3QgYmNtb2x0X3N0cl8xMDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5zdHIsIDEwMCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwX3VucGFjayhiY21vbHRfc3RyXzEwMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+c3RyLCAxMDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzEwMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfc3RyXzEwMCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N0cl8xMDAwX3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfMTAwMCAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+c3RyLCAwLCAxMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8xMDAwX3BhY2soY29uc3QgYmNtb2x0X3N0cl8xMDAwICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+c3RyLCAxMDAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8xMDAwX3VucGFjayhiY21vbHRfc3RyXzEwMDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnN0ciwgMTAwMCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzEwMDBfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfMTAwMCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N0cl8yMDAwX3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfMjAwMCAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+c3RyLCAwLCAyMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yMDAwX3BhY2soY29uc3QgYmNtb2x0X3N0cl8yMDAwICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+c3RyLCAyMDAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yMDAwX3VucGFjayhiY21vbHRfc3RyXzIwMDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnN0ciwgMjAwMCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMjAwMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzIwMDBfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfMjAwMCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N0cl8yNTZfc2V0X2RlZmF1bHQoYmNtb2x0X3N0cl8yNTYgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPnN0ciwgMCwgMjU2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yNTZfcGFjayhjb25zdCBiY21vbHRfc3RyXzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPnN0ciwgMjU2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yNTZfdW5wYWNrKGJjbW9sdF9zdHJfMjU2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5zdHIsIDI1NikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMjU2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjU2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yNTZfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfMjU2ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfc3RyXzY0X3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfNjQgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPnN0ciwgMCwgNjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzY0X3BhY2soY29uc3QgYmNtb2x0X3N0cl82NCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPnN0ciwgNjQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzY0X3VucGFjayhiY21vbHRfc3RyXzY0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5zdHIsIDY0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl82NF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDY0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl82NF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N0cl82NCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N3X2Vycm9yX3NldF9kZWZhdWx0KGJjbW9sdF9zd19lcnJvciAqdGhpcykKK3sKKyAgICB0aGlzLT5maXJzdF9lcnJvcl90aW1lX3VzID0gMDsKKyAgICB0aGlzLT5sYXN0X2Vycm9yX3RpbWVfdXMgPSAwOworICAgIHRoaXMtPmxpbmVfbnVtYmVyID0gMDsKKyAgICB0aGlzLT5lcnJvcl9jb3VudGVyID0gMDsKKyAgICB0aGlzLT5pbnN0YW5jZSA9IDA7CisgICAgbWVtc2V0KHRoaXMtPmZpbGVuYW1lLCAwLCA2NCk7CisgICAgbWVtc2V0KHRoaXMtPnRhc2tfbmFtZSwgMCwgNjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3dfZXJyb3JfcGFjayhjb25zdCBiY21vbHRfc3dfZXJyb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Zmlyc3RfZXJyb3JfdGltZV91cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmxhc3RfZXJyb3JfdGltZV91cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxpbmVfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZXJyb3JfY291bnRlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmluc3RhbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5maWxlbmFtZSwgNjQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPnRhc2tfbmFtZSwgNjQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3dfZXJyb3JfdW5wYWNrKGJjbW9sdF9zd19lcnJvciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5maXJzdF9lcnJvcl90aW1lX3VzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bGFzdF9lcnJvcl90aW1lX3VzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGluZV9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5lcnJvcl9jb3VudGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+ZmlsZW5hbWUsIDY0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnRhc2tfbmFtZSwgNjQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3dfZXJyb3Jfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3dfZXJyb3JfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zd19lcnJvciAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N5c3RlbV9wcm9maWxlX3NldF9kZWZhdWx0KGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSAqdGhpcykKK3sKKyAgICB0aGlzLT5uZ18yX3N5c19pZCA9IDA7CisgICAgdGhpcy0+dmVyc2lvbiA9IDA7CisgICAgdGhpcy0+Y2hhbm5lbF9zcGFjaW5nID0gMDsKKyAgICB0aGlzLT51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyA9IEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19FWFBBTkRFRF9TUEVDVFJVTV9XSURFX0JBTkQ7CisgICAgdGhpcy0+dXNfbXNlID0gMDsKKyAgICB0aGlzLT5sb29zZV9jYWxpYnJhdGlvbl9ib3VuZCA9IEJDTU9MVF9DQUxJQlJBVElPTl9SRUNPUkRfVU5TUEVDSUZJRUQ7CisgICAgdGhpcy0+ZnNyID0gMDsKKyAgICB0aGlzLT50d2RtX2NoYW5uZWxfY291bnQgPSA4OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3lzdGVtX3Byb2ZpbGVfcGFjayhjb25zdCBiY21vbHRfc3lzdGVtX3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bmdfMl9zeXNfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNoYW5uZWxfc3BhY2luZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHNfcGFjayh0aGlzLT51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51c19tc2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF9wYWNrKHRoaXMtPmxvb3NlX2NhbGlicmF0aW9uX2JvdW5kLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5mc3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR3ZG1fY2hhbm5lbF9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZV91bnBhY2soYmNtb2x0X3N5c3RlbV9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm5nXzJfc3lzX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT52ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jaGFubmVsX3NwYWNpbmcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzX3VucGFjaygmdGhpcy0+dXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dXNfbXNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmRfdW5wYWNrKCZ0aGlzLT5sb29zZV9jYWxpYnJhdGlvbl9ib3VuZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+ZnNyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50d2RtX2NoYW5uZWxfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3lzdGVtX3Byb2ZpbGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N5c3RlbV9wcm9maWxlICp0aGlzKQoreworICAgIGlmICh0aGlzLT5uZ18yX3N5c19pZCA+IDEwNDg1NzVVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+dmVyc2lvbiA+IDE1KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19FWFBBTkRFRF9TUEVDVFJVTV9XSURFX0JBTkQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfRVhQQU5ERURfU1BFQ1RSVU1fUkVEVUNFRF9CQU5EOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX0VYUEFOREVEX1NQRUNUUlVNX05BUlJPV19CQU5EOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX1NIQVJFRF9TUEVDVFJVTV9XSURFX0JBTkQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfU0hBUkVEX1NQRUNUUlVNX1JFRFVDRURfQkFORDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19TSEFSRURfU1BFQ1RSVU1fTkFSUk9XX0JBTkQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxvb3NlX2NhbGlicmF0aW9uX2JvdW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX1VOU1BFQ0lGSUVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9VTkNBTElCUkFURUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX0xPT1NFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9TVUZGSUNJRU5UOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnR3ZG1fY2hhbm5lbF9jb3VudCA+IDE1KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdHJ4X2RlbGltaXRlcl9zZXRfZGVmYXVsdChiY21vbHRfdHJ4X2RlbGltaXRlciAqdGhpcykKK3sKKyAgICB0aGlzLT5wYXR0ZXJuWzBdID0gMTcxOworICAgIHRoaXMtPnBhdHRlcm5bMV0gPSA4OTsKKyAgICB0aGlzLT5wYXR0ZXJuWzJdID0gMTMxOworICAgIHRoaXMtPnNpemUgPSAzOworICAgIHRoaXMtPndpbmRvd19zaXplID0gMTI0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2RlbGltaXRlcl9wYWNrKGNvbnN0IGJjbW9sdF90cnhfZGVsaW1pdGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+cGF0dGVybiwgMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+d2luZG93X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2RlbGltaXRlcl91bnBhY2soYmNtb2x0X3RyeF9kZWxpbWl0ZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnBhdHRlcm4sIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnNpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpbmRvd19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9kZWxpbWl0ZXJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9kZWxpbWl0ZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfZGVsaW1pdGVyICp0aGlzKQoreworICAgIGlmICh0aGlzLT53aW5kb3dfc2l6ZSA8IDIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF9zZXRfZGVmYXVsdChiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgKnRoaXMpCit7CisgICAgdGhpcy0+cmFuZ2luZ19lZF9zb3VyY2UgPSBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfVFJYOworICAgIHRoaXMtPmRlbGltaXRlcl9lZF9zb3VyY2UgPSBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfVFJYOworICAgIHRoaXMtPm1pbmltdW1fdGhyZXNob2xkID0gMDsKKyAgICB0aGlzLT5tYXhpbXVtX3RocmVzaG9sZCA9IDQxOworICAgIHRoaXMtPmVkX3BhdHRlcm4gPSAxNzA7CisgICAgdGhpcy0+ZWRfcGF0dGVybl9zaXplID0gMDsKKyAgICB0aGlzLT53aW5kb3dfc2l6ZSA9IDEyNDsKKyAgICB0aGlzLT5pbnZlcnNpb24gPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5ub19lZF90aHJlc2hvbGQgPSAxMjc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF9wYWNrKGNvbnN0IGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlX3BhY2sodGhpcy0+cmFuZ2luZ19lZF9zb3VyY2UsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2VfcGFjayh0aGlzLT5kZWxpbWl0ZXJfZWRfc291cmNlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1pbmltdW1fdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tYXhpbXVtX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZWRfcGF0dGVybikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZWRfcGF0dGVybl9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aW5kb3dfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pbnZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm5vX2VkX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF91bnBhY2soYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2VfdW5wYWNrKCZ0aGlzLT5yYW5naW5nX2VkX3NvdXJjZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZV91bnBhY2soJnRoaXMtPmRlbGltaXRlcl9lZF9zb3VyY2UsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWluaW11bV90aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1heGltdW1fdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5lZF9wYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5lZF9wYXR0ZXJuX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpbmRvd19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmludmVyc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bm9fZWRfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0ICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+cmFuZ2luZ19lZF9zb3VyY2UpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9JTlRFUk5BTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9UUlg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfQkNEUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGVsaW1pdGVyX2VkX3NvdXJjZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VORVJHWV9ERVRFQ1RfU09VUkNFX0lOVEVSTkFMOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VORVJHWV9ERVRFQ1RfU09VUkNFX1RSWDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9CQ0RSOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpbmRvd19zaXplIDwgMikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3RyeF9wcmVhbWJsZV9zZXRfZGVmYXVsdChiY21vbHRfdHJ4X3ByZWFtYmxlICp0aGlzKQoreworICAgIHRoaXMtPnR5cGVfMV9zaXplID0gMDsKKyAgICB0aGlzLT50eXBlXzJfc2l6ZSA9IDA7CisgICAgdGhpcy0+dHlwZV8zX3ByZV9yYW5naW5nX3NpemUgPSA1MDsKKyAgICB0aGlzLT50eXBlXzNfcG9zdF9yYW5naW5nX3NpemUgPSAxNTsKKyAgICB0aGlzLT50eXBlXzNfcGF0dGVybiA9IDE3MDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9wcmVhbWJsZV9wYWNrKGNvbnN0IGJjbW9sdF90cnhfcHJlYW1ibGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50eXBlXzFfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHlwZV8yX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR5cGVfM19wcmVfcmFuZ2luZ19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50eXBlXzNfcG9zdF9yYW5naW5nX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR5cGVfM19wYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9wcmVhbWJsZV91bnBhY2soYmNtb2x0X3RyeF9wcmVhbWJsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnR5cGVfMV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50eXBlXzJfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHlwZV8zX3ByZV9yYW5naW5nX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHlwZV8zX3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3ByZWFtYmxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfcHJlYW1ibGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfcHJlYW1ibGUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSA8IDUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSA+IDEyMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICB0aGlzLT53YWl0X3dpbmRvd19zaXplID0gMDsKKyAgICB0aGlzLT5yYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSA9IDE1OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53YWl0X3dpbmRvd19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+d2FpdF93aW5kb3dfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPnJhbmdpbmdfYWNjZXNzX3dpbmRvd19zaXplIDwgNykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9zZXRfZGVmYXVsdChiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9wYWNrKGNvbnN0IGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gNTAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggKnRoaXMpCit7CisgICAgcmV0dXJuIDQgKyAoNCAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfdW5wYWNrKGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9ICh1aW50MzJfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gNTAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDMyX3QpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4ICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiA1MDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF91OF9saXN0X3UxNl9oZXhfc2V0X2RlZmF1bHQoYmNtb2x0X3U4X2xpc3RfdTE2X2hleCAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UxNl9oZXhfcGFjayhjb25zdCBiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UxNl9oZXhcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dmFsLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzKQoreworICAgIHJldHVybiAyICsgdGhpcy0+bGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfaGV4X3VucGFjayhiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X3U4X2xpc3RfdTE2X2hleFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dmFsLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfaGV4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbjsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfaGV4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdThfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT52YWwsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiA0ICsgdGhpcy0+bGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF91OF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dmFsLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfc2V0X2RlZmF1bHQoYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3BhY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMjA0OCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT52YWwsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKQoreworICAgIHJldHVybiA0ICsgdGhpcy0+bGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyMDQ4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dmFsLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAyMDQ4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdWJkX2luZm9fc2V0X2RlZmF1bHQoYmNtb2x0X3ViZF9pbmZvICp0aGlzKQoreworICAgIHRoaXMtPmFjdHVhbF9wb2xsaW5nX2ludGVydmFsID0gMDsKKyAgICB0aGlzLT5hY3R1YWxfZ3JhbnRfdGhyZXNob2xkX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ViZF9pbmZvX3BhY2soY29uc3QgYmNtb2x0X3ViZF9pbmZvICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmFjdHVhbF9wb2xsaW5nX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5hY3R1YWxfZ3JhbnRfdGhyZXNob2xkX3RxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX3BhY2soJnRoaXMtPmFjdHVhbF9taW5fc2NoZWR1bGVyc2hhcGVyLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfcGFjaygmdGhpcy0+YWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXIsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91YmRfaW5mb191bnBhY2soYmNtb2x0X3ViZF9pbmZvICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmFjdHVhbF9wb2xsaW5nX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmFjdHVhbF9ncmFudF90aHJlc2hvbGRfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfdW5wYWNrKCZ0aGlzLT5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfdW5wYWNrKCZ0aGlzLT5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdWJkX2luZm9fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91YmRfaW5mb19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3ViZF9pbmZvICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcl9ib3VuZHNfY2hlY2soJnRoaXMtPmFjdHVhbF9tYXhfc2NoZWR1bGVyc2hhcGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+cG9sbGluZ19pbnRlcnZhbF91cyA9IEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX0FVVE9NQVRJQzsKKyAgICB0aGlzLT5ncmFudF90aHJlc2hvbGRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSAwOworICAgIHRoaXMtPm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPm1pbl9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSAwOworICAgIHRoaXMtPm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gKGJjbW9sdF9iYW5kd2lkdGhfS2JwcykgMDsKKyAgICB0aGlzLT5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gMDsKKyAgICB0aGlzLT5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgdGhpcy0+dGRtX2dyYW50X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPnRkbV9ncmFudF9pbnRlcnZhbF91cyA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX3BhY2soY29uc3QgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9wb2xsaW5nX2ludGVydmFsX3BhY2sodGhpcy0+cG9sbGluZ19pbnRlcnZhbF91cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5ncmFudF90aHJlc2hvbGRfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfcGFjaygmdGhpcy0+bWluX3NjaGVkdWxlcnNoYXBlciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3BhY2soJnRoaXMtPm1heF9zY2hlZHVsZXJzaGFwZXIsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+dGRtX2dyYW50X3NpemVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbl91bnBhY2soYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9wb2xsaW5nX2ludGVydmFsX3VucGFjaygmdGhpcy0+cG9sbGluZ19pbnRlcnZhbF91cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmdyYW50X3RocmVzaG9sZF90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlcl91bnBhY2soJnRoaXMtPm1pbl9zY2hlZHVsZXJzaGFwZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3VucGFjaygmdGhpcy0+bWF4X3NjaGVkdWxlcnNoYXBlciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+dGRtX2dyYW50X3NpemVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+cG9sbGluZ19pbnRlcnZhbF91cykKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfUE9MTElOR19ESVNBQkxFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX1VTXzUwMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX01TXzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU18yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX01TXzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU18xNjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX0FVVE9NQVRJQzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5ncmFudF90aHJlc2hvbGRfdHEgPiAoYmNtb2x0X3RpbWVfcXVhbnRhKSA2NTQwOFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5taW5fc2NoZWR1bGVyc2hhcGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX2JvdW5kc19jaGVjaygmdGhpcy0+bWF4X3NjaGVkdWxlcnNoYXBlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnRkbV9ncmFudF9zaXplX3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgNjU0MDhVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+dGRtX2dyYW50X2ludGVydmFsX3VzID4gNTAwMDBVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3ZsYW5fdGFnX3NldF9kZWZhdWx0KGJjbW9sdF92bGFuX3RhZyAqdGhpcykKK3sKKyAgICB0aGlzLT52bGFuX2lkID0gKGJjbW9sdF92bGFuX2lkKSAwOworICAgIHRoaXMtPnBiaXQgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90YWdfcGFjayhjb25zdCBiY21vbHRfdmxhbl90YWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT52bGFuX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wYml0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ZsYW5fdGFnX3VucGFjayhiY21vbHRfdmxhbl90YWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPnZsYW5faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBiaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90YWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ZsYW5fdGFnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdmxhbl90YWcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPnZsYW5faWQgPiAoYmNtb2x0X3ZsYW5faWQpIDQwOTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnBiaXQgPiA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSAqdGhpcykKK3sKKyAgICB0aGlzLT5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDA7CisgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hbGxvY19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWxsb2Nfc3RhdGVfcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWxsb2Nfc3RhdGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzKQoreworICAgIGlmICh0aGlzLT5hbGxvY19pZCA+IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDE2MzgzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMzIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoMyAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMzIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV91bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAzMikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2VkX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSAqdGhpcykKK3sKKyAgICB0aGlzLT5yZXNldF9vbl9lZF9mYWlsID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+cmVzZXRfb25fZWRfc3VjY2VzcyA9IEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmVzZXRfb25fZWRfZmFpbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yZXNldF9vbl9lZF9zdWNjZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2VkX3N0YXRlX3VucGFjayhiY21vbHRfeGdwb25fZWRfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlc2V0X29uX2VkX2ZhaWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cmVzZXRfb25fZWRfc3VjY2VzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZWRfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICgyICogdGhpcy0+bGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfeGdwb25fZ2VtX2lkICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9pZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfeGdwb25fZ2VtX2lkKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGVuID4gMTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKQoreworICAgIHRoaXMtPmdlbV9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSAwOworICAgIHRoaXMtPnN0YXRlID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRFX05PVF9DT05GSUdVUkVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZV9wYWNrKHRoaXMtPnN0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmdlbV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKQoreworICAgIGlmICh0aGlzLT5nZW1faWQgPiAoYmNtb2x0X3hncG9uX2dlbV9pZCkgNjU1MzNVKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMTI4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoMyAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMTI4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfdW5wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbjsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiAzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGVuID4gMTI4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcykKK3sKKyAgICByZXR1cm4gMiArICgzICogdGhpcy0+bGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV91bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2Vfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSAqdGhpcykKK3sKKyAgICB0aGlzLT5pbnRlcnZhbCA9IDEwMDAwOworICAgIHRoaXMtPmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPmVuY3J5cHRlZF9wb3J0c19vbmx5ID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5lbmNyeXB0ZWRfcG9ydHNfb25seSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV91bnBhY2soYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pbnRlcnZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmNvbnRyb2wsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmVuY3J5cHRlZF9wb3J0c19vbmx5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2VfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmludGVydmFsIDwgMTAwMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmludGVydmFsID4gMzYwMDAwMFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZW5jcnlwdGVkX3BvcnRzX29ubHkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmtleS5ieXRlcywgMCwgc2l6ZW9mKHRoaXMtPmtleS5ieXRlcykpOworICAgIHRoaXMtPmtleV9jb250cm9sID0gQkNNT1NfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3BhY2soJnRoaXMtPmtleSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmtleV9jb250cm9sKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXlfdW5wYWNrKGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPmtleSwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+a2V5X2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5ICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5rZXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfZGVidWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2RlYnVnICp0aGlzKQoreworICAgIHRoaXMtPmluY3JlYXNlX2F2YWlsYWJsZV9jYnJfYncgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMgPSA1MTI7CisgICAgdGhpcy0+bnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251ID0gNjQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1Z19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmludGVyX2J1cnN0X2dhcF9pbl9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1Z191bnBhY2soYmNtb2x0X3hncG9uX25pX2RlYnVnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pbmNyZWFzZV9hdmFpbGFibGVfY2JyX2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aW50ZXJfYnVyc3RfZ2FwX2luX2J5dGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2RlYnVnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1Z19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2RlYnVnICp0aGlzKQoreworICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPCA4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+a2V5X2V4Y2hhbmdlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB0aGlzLT5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5rZXlfZXhjaGFuZ2UsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPmZhaWxfZHVlX3RvX3JlZ2lzX2F1dG9fZmFpbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uX3VucGFjayhiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+a2V5X2V4Y2hhbmdlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmtleV9leGNoYW5nZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmFpbF9kdWVfdG9fcmVnaXNfYXV0b19mYWlsKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2Flc19rZXkgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmVuY3J5cHRpb25fa2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+ZW5jcnlwdGlvbl9rZXkuYnl0ZXMpKTsKKyAgICB0aGlzLT5rZXlfaW5kZXggPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2Flc19rZXlfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2Flc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3BhY2soJnRoaXMtPmVuY3J5cHRpb25fa2V5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmtleV9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV91bnBhY2soYmNtb2x0X3hncG9uX29udV9hZXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPmVuY3J5cHRpb25fa2V5LCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+a2V5X2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hZXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2Flc19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSAqdGhpcykKK3sKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X2JvdW5kc19jaGVjaygmdGhpcy0+ZW5jcnlwdGlvbl9rZXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMpCit7CisgICAgdGhpcy0+bG9zaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmxvYmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sb3BjaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmxvcGNpX21pY19lcnJvciA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmxvb2NpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+dGl3aSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmRvd2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5zdWZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+c2ZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+c2RpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+ZGZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+ZGdpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+cHFzaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvc2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9iaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3BjaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3BjaV9taWNfZXJyb3IsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9vY2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+dGl3aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5kb3dpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnN1ZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+c2ZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnNkaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5kZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+ZGdpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnBxc2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvYmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9wY2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9wY2lfbWljX2Vycm9yLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvb2NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPnRpd2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+ZG93aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdWZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPnNmaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zZGksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+ZGZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmRnaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5wcXNpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+bG9zaSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxvYmkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb3BjaSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxvcGNpX21pY19lcnJvcikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxvb2NpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dGl3aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmRvd2kpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdWZpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c2ZpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c2RpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGZpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGdpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cHFzaSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9hbGFybXNfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9hbGFybXMgKnRoaXMpCit7CisgICAgdGhpcy0+bG9zaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmxvYmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sb3BjaV9taXNzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+bG9wY2lfbWljX2Vycm9yID0gQkNNT0xUX1NUQVRVU19PRkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hbGFybXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvYmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9wY2lfbWlzcywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3BjaV9taWNfZXJyb3IsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3VucGFjayhiY21vbHRfeGdwb25fb251X2FsYXJtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvc2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9iaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3BjaV9taXNzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvcGNpX21pY19lcnJvciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+bG9zaSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxvYmkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb3BjaV9taXNzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bG9wY2lfbWljX2Vycm9yKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpCit7CisgICAgdGhpcy0+bG9zaSA9IDQ7CisgICAgdGhpcy0+bG9iaSA9IDQ7CisgICAgdGhpcy0+bG9vY2kgPSAzOworICAgIHRoaXMtPmxvcGNpID0gMzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb3NpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb2JpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb29jaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bG9wY2kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3VucGFjayhiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9zaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9iaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9vY2kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxvcGNpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2VxZF9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2VxZCAqdGhpcykKK3sKKyAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgMDsKKyAgICB0aGlzLT5lcWQgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZXFkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+b251X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZXFkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZXFkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5lcWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9lcWQgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfeGdwb25fb251X2lkKSA1MTEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfZXFkX3BhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpCit7CisgICAgcmV0dXJuIDQgKyAoNiAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyX3VucGFjayhiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfeGdwb25fb251X2VxZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZXFkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfZXFkX3VucGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X3hncG9uX29udV9lcWQpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXNfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+cGxvYW1faWsuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5wbG9hbV9pay5ieXRlcykpOworICAgIG1lbXNldCh0aGlzLT5vbWNpX2lrLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+b21jaV9pay5ieXRlcykpOworICAgIG1lbXNldCh0aGlzLT5vbWNpX2sxLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+b21jaV9rMS5ieXRlcykpOworICAgIG1lbXNldCh0aGlzLT5vbWNpX2syLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+b21jaV9rMi5ieXRlcykpOworICAgIG1lbXNldCh0aGlzLT5rZWsuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5rZWsuYnl0ZXMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3BhY2soJnRoaXMtPnBsb2FtX2lrLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Flc19rZXlfcGFjaygmdGhpcy0+b21jaV9paywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3BhY2soJnRoaXMtPm9tY2lfazEsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5vbWNpX2syLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Flc19rZXlfcGFjaygmdGhpcy0+a2VrLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3VucGFjayhiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPnBsb2FtX2lrLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPm9tY2lfaWssIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3VucGFjaygmdGhpcy0+b21jaV9rMSwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Flc19rZXlfdW5wYWNrKCZ0aGlzLT5vbWNpX2syLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPmtlaywgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgODApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5wbG9hbV9paykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWVzX2tleV9ib3VuZHNfY2hlY2soJnRoaXMtPm9tY2lfaWspKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5vbWNpX2sxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X2JvdW5kc19jaGVjaygmdGhpcy0+b21jaV9rMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWVzX2tleV9ib3VuZHNfY2hlY2soJnRoaXMtPmtlaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgKnRoaXMpCit7CisgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIDA7CisgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfT05VX1NUQVRFX05PVF9DT05GSUdVUkVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29udV9zdGF0ZV9wYWNrKHRoaXMtPnN0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlICp0aGlzKQoreworICAgIGlmICh0aGlzLT5vbnVfaWQgPiAoYmNtb2x0X3hncG9uX29udV9pZCkgNTExKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX0RPWkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9VTkFXQVJFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gNTEwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX3BhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoMyAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwX3VucGFjayhiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiA1MTApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfdW5wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbiA+IDUxMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZyAqdGhpcykKK3sKKyAgICB0aGlzLT5hY2tfdGltZW91dCA9IDIwMDA7CisgICAgdGhpcy0+cmV0cmFuc19yYW5naW5nX3RpbWUgPSAwOworICAgIHRoaXMtPnJldHJhbnNfYXNzaWduX2FsbG9jX2lkID0gMDsKKyAgICB0aGlzLT5yZXRyYW5zX2tleV9jb250cm9sID0gMDsKKyAgICB0aGlzLT5yZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmFja190aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXRyYW5zX3JhbmdpbmdfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmV0cmFuc19hc3NpZ25fYWxsb2NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJldHJhbnNfa2V5X2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfdW5wYWNrKGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hY2tfdGltZW91dCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmV0cmFuc19yYW5naW5nX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJldHJhbnNfYXNzaWduX2FsbG9jX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXRyYW5zX2tleV9jb250cm9sKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzKQoreworICAgIHRoaXMtPnRpbWVvdXQgPSAxMDA7CisgICAgdGhpcy0+Z3Bpb19waW4gPSBCQ01PTFRfR1BJT19QSU5fVU5DT05GSUdVUkVEOworICAgIHRoaXMtPmZhc3RfcmFuZ2luZyA9IEJDTU9TX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dGltZW91dCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bpb19waW5fcGFjayh0aGlzLT5ncGlvX3BpbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmZhc3RfcmFuZ2luZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ191bnBhY2soYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnRpbWVvdXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dwaW9fcGluX3VucGFjaygmdGhpcy0+Z3Bpb19waW4sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5mYXN0X3JhbmdpbmcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5ncGlvX3BpbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnICp0aGlzKQoreworICAgIHRoaXMtPmRhdGFfbWFwX2RlbGF5X21zID0gMDsKKyAgICB0aGlzLT5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+cmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZV9kZWxheSA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Z19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5kYXRhX21hcF9kZWxheV9tcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZV9kZWxheSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Z191bnBhY2soYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmRhdGFfbWFwX2RlbGF5X21zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Z19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgKnRoaXMpCit7CisgICAgdGhpcy0+cG9sYXJpdHkgPSBCQ01PTFRfUE9MQVJJVFlfTE9XOworICAgIHRoaXMtPmxvY2F0aW9uID0gMzU7CisgICAgdGhpcy0+bG9jYXRpb25fc2lnbiA9IEJDTU9MVF9TSUdOX1BPU0lUSVZFOworICAgIHRoaXMtPnB1bHNlX3dpZHRoID0gODA7CisgICAgdGhpcy0+bWluaW11bV9idXJzdCA9IDIwMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9wb2xhcml0eV9wYWNrKHRoaXMtPnBvbGFyaXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zaWduX3BhY2sodGhpcy0+bG9jYXRpb25fc2lnbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cHVsc2Vfd2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5taW5pbXVtX2J1cnN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZ191bnBhY2soYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X3BvbGFyaXR5X3VucGFjaygmdGhpcy0+cG9sYXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9jYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3NpZ25fdW5wYWNrKCZ0aGlzLT5sb2NhdGlvbl9zaWduLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wdWxzZV93aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1pbmltdW1fYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5wb2xhcml0eSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1BPTEFSSVRZX0xPVzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT0xBUklUWV9ISUdIOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb2NhdGlvbl9zaWduKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU0lHTl9QT1NJVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TSUdOX05FR0FUSVZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnICp0aGlzKQoreworICAgIHRoaXMtPnN0YXJ0X29uX2VkID0gQkNNT1NfVFJVRTsKKyAgICB0aGlzLT5mcmFtZV9kZWxheSA9IDA7CisgICAgdGhpcy0+d29yZF9kZWxheSA9IDIwOworICAgIHRoaXMtPmZyYW1lX2RlbGF5X2FmdGVyX2VkID0gMDsKKyAgICB0aGlzLT53b3JkX2RlbGF5X2FmdGVyX2VkID0gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhcnRfb25fZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmZyYW1lX2RlbGF5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+d29yZF9kZWxheSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZnJhbWVfZGVsYXlfYWZ0ZXJfZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT53b3JkX2RlbGF5X2FmdGVyX2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfdW5wYWNrKGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGFydF9vbl9lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZnJhbWVfZGVsYXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT53b3JkX2RlbGF5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5mcmFtZV9kZWxheV9hZnRlcl9lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPndvcmRfZGVsYXlfYWZ0ZXJfZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmZyYW1lX2RlbGF5ID4gMzEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndvcmRfZGVsYXkgPiAxNjM4MykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+ZnJhbWVfZGVsYXlfYWZ0ZXJfZWQgPiAzMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d29yZF9kZWxheV9hZnRlcl9lZCA+IDE2MzgzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gKnRoaXMpCit7CisgICAgdGhpcy0+dHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDA7CisgICAgdGhpcy0+dHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgdGhpcy0+dHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzID0gMDsKKyAgICB0aGlzLT50cnhfcmVzZXRfbG9jYXRpb24gPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgdGhpcy0+YmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDA7CisgICAgdGhpcy0+YmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfbG9jYXRpb24gPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50cnhfcmVzZXRfcGF0dGVybl9sYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnRyeF9yZXNldF9sb2NhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YmNkcl9yZXNldF9sb2NhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5iY2RyX3Jlc2V0X3BvbGFyaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl91bnBhY2soYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50cnhfcmVzZXRfcGF0dGVybl9maXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHJ4X3Jlc2V0X2xvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5iY2RyX3Jlc2V0X2xvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmJjZHJfcmVzZXRfcG9sYXJpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPm11bHRpX2VkX21vZGUgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5yYW5naW5nX21vZGUgPSBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9CQ0RSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm11bHRpX2VkX21vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfcGFjayh0aGlzLT5yYW5naW5nX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5tdWx0aV9lZF9tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlX3VucGFjaygmdGhpcy0+cmFuZ2luZ19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5yYW5naW5nX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0VEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX1NFUkRFU19SQU5HSU5HX01PREVfQkNEUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0ZBU1RfUkFOR0lORzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9GQVNUX1JBTkdJTkcyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+aW50ZXJ2YWwgPSAxMDAwOworICAgIHRoaXMtPmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX05PTkU7CisgICAgdGhpcy0+YnVyc3RfcHJvZmlsZSA9IChiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZV9wYWNrKHRoaXMtPm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5idXJzdF9wcm9maWxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX3VucGFjayhiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlX3VucGFjaygmdGhpcy0+b251X3Bvc3RfZGlzY292ZXJ5X21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+YnVyc3RfcHJvZmlsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+aW50ZXJ2YWwgPCAxMDAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5pbnRlcnZhbCA+IDIxNDc0ODNVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRyb2wpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1BPU1RfRElTQ09WRVJZX01PREVfTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9BQ1RJVkFURToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmJ1cnN0X3Byb2ZpbGUgPiAoYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXgpIDMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl90cnhfZGVidWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyAqdGhpcykKK3sKKyAgICB0aGlzLT5yeF9yZXZlcnNlZF9wb2xhcml0eSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgdGhpcy0+bmVnX291dF9iaXQgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5yeF9yZXZlcnNlZF9wb2xhcml0eSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+bmVnX291dF9iaXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfZGVidWdfdW5wYWNrKGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+cnhfcmV2ZXJzZWRfcG9sYXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPm5lZ19vdXRfYml0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfZGVidWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5yeF9yZXZlcnNlZF9wb2xhcml0eSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bmVnX291dF9iaXQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FlX25pX2tleV9zZXRfZGVmYXVsdChiY21vbHRfYWVfbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hZV9uaSA9IChiY21vbHRfYWVfbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X3BhY2soY29uc3QgYmNtb2x0X2FlX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hZV9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2FlX25pX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9LRVlfSURfQUVfTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9rZXlfdW5wYWNrKGJjbW9sdF9hZV9uaV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9LRVlfSURfQUVfTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hZV9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9uaV9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tYWNfYWRkcmVzcy51OFswXSA9IDB4MDAwMDsKKyAgICAgICAgdGhpcy0+bWFjX2FkZHJlc3MudThbMV0gPSAweDAwMEQ7CisgICAgICAgIHRoaXMtPm1hY19hZGRyZXNzLnU4WzJdID0gMHgwMEI2OworICAgICAgICB0aGlzLT5tYWNfYWRkcmVzcy51OFszXSA9IDB4MDAwMDsKKyAgICAgICAgdGhpcy0+bWFjX2FkZHJlc3MudThbNF0gPSAweDAwMDA7CisgICAgICAgIHRoaXMtPm1hY19hZGRyZXNzLnU4WzVdID0gMHgwMDAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX0FFX05JX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFlX25pX2VuID0gQkNNT0xUX0FFX05JX0VOX1NUQVRFX0RJU0FCTEVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX01UVV8xMEcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXR1XzEwZyA9IDE1MzY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IuaW52ZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIubW9kZSA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9TRUxGX1NZTkM7CisgICAgICAgIHRoaXMtPnByYnNfY2hlY2tlci5kYXRhX2ludmVydCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19zdGF0dXMubG9ja19zdGF0ZSA9IEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfVU5MT0NLRUQ7CisgICAgICAgIHRoaXMtPnByYnNfc3RhdHVzLmVycm9yX2NvdW50cyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9BRV9OSV9FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZV9uaV9lbl9zdGF0ZV9wYWNrKHRoaXMtPmFlX25pX2VuLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tdHVfMTBnKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19wYWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfc3RhdHVzX3BhY2soJnRoaXMtPnByYnNfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9uaV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX0FFX05JX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfTVRVXzEwRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVfbmlfZW5fc3RhdGVfdW5wYWNrKCZ0aGlzLT5hZV9uaV9lbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfTVRVXzEwRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXR1XzEwZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZ191bnBhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3VucGFjaygmdGhpcy0+cHJic19jaGVja2VyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfc3RhdHVzX3VucGFjaygmdGhpcy0+cHJic19zdGF0dXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfTVRVXzEwRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX25pX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hZV9uaV9lbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfTklfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9OSV9FTl9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX0FFX05JX0VOOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX01UVV8xMEcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm10dV8xMGcgPCA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPm10dV8xMGcgPiAxMDAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19nZW5lcmF0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfc3RhdHVzX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfc3RhdGUgPSBCQ01PTFRfQUVfTklfRU5fU1RBVEVfRElTQUJMRUQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FlX25pX2VuX3N0YXRlX3BhY2sodGhpcy0+bmV3X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX1NFVF9BRV9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZV9uaV9lbl9zdGF0ZV91bnBhY2soJnRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm5ld19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfTklfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9OSV9FTl9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hZV9uaSA9IChiY21vbHRfYWVfbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19rZXlfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hZV9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2tleV91bnBhY2soYmNtb2x0X2FlX3BhdGhfZHNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hZV9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Ynl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNjQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzY1XzEyNyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18yNTZfNTExID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzUxMl8xMDIzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzE1MTlfMjA0NyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMjA0OF80MDk1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc185MjE3XzE2MzgzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJyb2FkY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGF0YV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tdWx0aWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51bmljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFib3J0X2ZyYW1lcyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJ5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc182NV8xMjcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc181MTJfMTAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzIwNDhfNDA5NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm11bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJ5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NV8xMjcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc181MTJfMTAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzIwNDhfNDA5NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm11bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jZmcudHJpZ2dlci50eXBlID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORTsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IDA7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3BhY2soJnRoaXMtPmNmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y2ZnKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ191bnBhY2soJnRoaXMtPmNmZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmNmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWVfcGF0aF91c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX0FFX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFlX25pID0gKGJjbW9sdF9hZV9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX0FFX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmFlX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF91c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X3VucGFjayhiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmFlX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc182NCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNjVfMTI3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMTI4XzI1NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzI1Nl81MTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNTEyXzEwMjMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzEwMjRfMTUxOCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18yMDQ4XzQwOTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzQwOTZfOTIxNiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnJvYWRjYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kYXRhX2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm11bHRpY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVuaWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWJvcnRfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmNzX2Vycm9yID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vdmVyc2l6ZV9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ydW50X2Vycm9yID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YWJvcnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mY3NfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b3ZlcnNpemVfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ydW50X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+YWJvcnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mY3NfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b3ZlcnNpemVfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5ydW50X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9jaGFubmVsX2tleV9zZXRfZGVmYXVsdChiY21vbHRfY2hhbm5lbF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfa2V5X3BhY2soY29uc3QgYmNtb2x0X2NoYW5uZWxfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9jaGFubmVsX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfY2hhbm5lbF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfa2V5X3VucGFjayhiY21vbHRfY2hhbm5lbF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2NoYW5uZWxfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2NoYW5uZWxfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9wb25fbmkpIDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9wZXJhdGlvbl9jb250cm9sLnJlID0gMDsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wub2RuX2NsYXNzID0gQkNNT0xUX09ETl9DTEFTU19OMTsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wuZHNfZmVjX21vZGUgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgICAgIHRoaXMtPm9wZXJhdGlvbl9jb250cm9sLnByb3RvY29sID0gQkNNT0xUX1RDX1BST1RPQ09MX1RDX0xBWUVSX1BST1RPQ09MX0dfOTg5X1BfMzsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wuZHNfbGlua190eXBlID0gQkNNT0xUX0xJTktfVFlQRV9VTlNQRUNJRklFRDsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsID0gMDsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmR3bGNoX2lkID0gMDsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wuYyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dG9sID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN5c3RlbV9wcm9maWxlLm5nXzJfc3lzX2lkID0gMDsKKyAgICAgICAgdGhpcy0+c3lzdGVtX3Byb2ZpbGUudmVyc2lvbiA9IDA7CisgICAgICAgIHRoaXMtPnN5c3RlbV9wcm9maWxlLmNoYW5uZWxfc3BhY2luZyA9IDA7CisgICAgICAgIHRoaXMtPnN5c3RlbV9wcm9maWxlLnVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzID0gQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX0VYUEFOREVEX1NQRUNUUlVNX1dJREVfQkFORDsKKyAgICAgICAgdGhpcy0+c3lzdGVtX3Byb2ZpbGUudXNfbXNlID0gMDsKKyAgICAgICAgdGhpcy0+c3lzdGVtX3Byb2ZpbGUubG9vc2VfY2FsaWJyYXRpb25fYm91bmQgPSBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX1VOU1BFQ0lGSUVEOworICAgICAgICB0aGlzLT5zeXN0ZW1fcHJvZmlsZS5mc3IgPSAwOworICAgICAgICB0aGlzLT5zeXN0ZW1fcHJvZmlsZS50d2RtX2NoYW5uZWxfY291bnQgPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfQ0hBTk5FTF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5jaGFubmVsX3Byb2ZpbGUuYXJyLCAwLCBzaXplb2YodGhpcy0+Y2hhbm5lbF9wcm9maWxlLmFycikpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29wZXJhdGlvbl9jb250cm9sX3BhY2soJnRoaXMtPm9wZXJhdGlvbl9jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1RPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dG9sKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9TWVNURU1fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zeXN0ZW1fcHJvZmlsZV9wYWNrKCZ0aGlzLT5zeXN0ZW1fcHJvZmlsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9DSEFOTkVMX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X3BhY2soJnRoaXMtPmNoYW5uZWxfcHJvZmlsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfQ0hBTk5FTF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEyMDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3VucGFjayhiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29wZXJhdGlvbl9jb250cm9sX3VucGFjaygmdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnRvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3lzdGVtX3Byb2ZpbGVfdW5wYWNrKCZ0aGlzLT5zeXN0ZW1fcHJvZmlsZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfdW5wYWNrKCZ0aGlzLT5jaGFubmVsX3Byb2ZpbGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1RPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEyMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfY2hhbm5lbF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfYm91bmRzX2NoZWNrKCZ0aGlzLT5vcGVyYXRpb25fY29udHJvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9PUEVSQVRJT05fQ09OVFJPTDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfVE9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50b2wgPiA1MTEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0w7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N5c3RlbV9wcm9maWxlX2JvdW5kc19jaGVjaygmdGhpcy0+c3lzdGVtX3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfYm91bmRzX2NoZWNrKCZ0aGlzLT5jaGFubmVsX3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfQ0hBTk5FTF9QUk9GSUxFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9kZWJ1Z19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2RlYnVnX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzZXJ2ZWQgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGVidWdfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZWJ1Z19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV91bnBhY2soYmNtb2x0X2RlYnVnX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGVidWdfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQ09OU09MRV9SRURJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb25zb2xlX3JlZGlyZWN0aW9uID0gQkNNT0xUX0NPTlNPTEVfUkVESVJFQ1RJT05fTk9ORTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmluZGljYXRpb25zX2Ryb3BwZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0ZJTEVfVVNFRF9QRVJDRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZpbGVfdXNlZF9wZXJjZW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uID0gQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX0RFVklDRTsKKyAgICAgICAgdGhpcy0+YXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzID0gMTYzODQ7CisgICAgICAgIHRoaXMtPmFwaV9jYXB0dXJlX2NmZy5idWZmZXJfbW9kZSA9IEJDTU9MVF9BUElfQ0FQVFVSRV9CVUZGRVJfTU9ERV9XUkFQOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFwaV9jYXB0dXJlX3N0YXRzLmJ1ZmZlcl91c2VkX2J5dGVzID0gMDsKKyAgICAgICAgdGhpcy0+YXBpX2NhcHR1cmVfc3RhdHMuYnVmZmVyX3dyYXBfY291bnQgPSAwOworICAgICAgICB0aGlzLT5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfcmVjb3JkZWQgPSAwOworICAgICAgICB0aGlzLT5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfZHJvcHBlZCA9IDA7CisgICAgICAgIHRoaXMtPmFwaV9jYXB0dXJlX3N0YXRzLnJlYWRhYmxlX2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5vZmZzZXQgPSAwOworICAgICAgICB0aGlzLT5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5zaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmFwaV9jYXB0dXJlX2J1ZmZlci52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RlYnVnX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbl9wYWNrKHRoaXMtPmNvbnNvbGVfcmVkaXJlY3Rpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmluZGljYXRpb25zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9GSUxFX1VTRURfUEVSQ0VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5maWxlX3VzZWRfcGVyY2VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfcGFjaygmdGhpcy0+YXBpX2NhcHR1cmVfY2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9TVEFUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0c19wYWNrKCZ0aGlzLT5hcGlfY2FwdHVyZV9zdGF0cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlcl9wYWNrKCZ0aGlzLT5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soJnRoaXMtPmFwaV9jYXB0dXJlX2J1ZmZlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGVidWdfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RlYnVnX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQ09OU09MRV9SRURJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9GSUxFX1VTRURfUEVSQ0VOVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDIwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2RlYnVnX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbl91bnBhY2soJnRoaXMtPmNvbnNvbGVfcmVkaXJlY3Rpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmluZGljYXRpb25zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9GSUxFX1VTRURfUEVSQ0VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5maWxlX3VzZWRfcGVyY2VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfdW5wYWNrKCZ0aGlzLT5hcGlfY2FwdHVyZV9jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfdW5wYWNrKCZ0aGlzLT5hcGlfY2FwdHVyZV9zdGF0cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX3VucGFjaygmdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3VucGFjaygmdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9GSUxFX1VTRURfUEVSQ0VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RlYnVnX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RlYnVnX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQ09OU09MRV9SRURJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmNvbnNvbGVfcmVkaXJlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlNPTEVfUkVESVJFQ1RJT05fTk9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlNPTEVfUkVESVJFQ1RJT05fUkVESVJFQ1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX0NMT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmFwaV9jYXB0dXJlX2NmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfYm91bmRzX2NoZWNrKCZ0aGlzLT5hcGlfY2FwdHVyZV9zdGF0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX2JvdW5kc19jaGVjaygmdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX2JvdW5kc19jaGVjaygmdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfREFUQSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kYXRhLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmRhdGEudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0xJX09VVFBVVF9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soJnRoaXMtPmRhdGEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DTElfT1VUUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3U4X2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfdW5wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DTElfT1VUUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5kYXRhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DTElfT1VUUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfREFUQTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9DTElfT1VUUFVUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNsaV9vdXRwdXQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0ZJTEVfQUxNT1NUX0ZVTEwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmlsZV9hbG1vc3RfZnVsbCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0NMSV9PVVRQVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jbGlfb3V0cHV0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9GSUxFX0FMTU9TVF9GVUxMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZmlsZV9hbG1vc3RfZnVsbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0NMSV9PVVRQVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0ZJTEVfQUxNT1NUX0ZVTEwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0NMSV9PVVRQVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jbGlfb3V0cHV0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9GSUxFX0FMTU9TVF9GVUxMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZmlsZV9hbG1vc3RfZnVsbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9DTElfT1VUUFVUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfRklMRV9BTE1PU1RfRlVMTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DTElfSU5QVVRfSURfREFUQSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kYXRhLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmRhdGEudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NMSV9JTlBVVF9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soJnRoaXMtPmRhdGEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3U4X2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV91bnBhY2soYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5kYXRhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFQlVHX0NMSV9JTlBVVF9JRF9EQVRBOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9kZXZpY2Vfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2Vfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzZXJ2ZWQgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2Vfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9TWVNURU1fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zeXN0ZW1fbW9kZSA9IEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2VlcGFsaXZlX2ludGVydmFsID0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX1RPTEVSQU5DRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZWVwYWxpdmVfdG9sZXJhbmNlID0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5maXJtd2FyZV9zd192ZXJzaW9uLm1ham9yID0gMDsKKyAgICAgICAgdGhpcy0+ZmlybXdhcmVfc3dfdmVyc2lvbi5taW5vciA9IDA7CisgICAgICAgIHRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24ucmV2aXNpb24gPSAwOworICAgICAgICB0aGlzLT5maXJtd2FyZV9zd192ZXJzaW9uLm1vZGVsID0gMDsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24uYnVpbGRfdGltZSwgMCwgMzIpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9IT1NUX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+aG9zdF9zd192ZXJzaW9uLm1ham9yID0gMDsKKyAgICAgICAgdGhpcy0+aG9zdF9zd192ZXJzaW9uLm1pbm9yID0gMDsKKyAgICAgICAgdGhpcy0+aG9zdF9zd192ZXJzaW9uLnJldmlzaW9uID0gMDsKKyAgICAgICAgdGhpcy0+aG9zdF9zd192ZXJzaW9uLm1vZGVsID0gMDsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmhvc3Rfc3dfdmVyc2lvbi5idWlsZF90aW1lLCAwLCAzMik7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfUkVWSVNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2hpcF9yZXZpc2lvbiA9IChiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24pIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYnVnLmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUgPSAxMjg7CisgICAgICAgIHRoaXMtPmRlYnVnLmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUgPSAxMjg7CisgICAgICAgIHRoaXMtPmRlYnVnLmF2c19jb250cm9sID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmRlYnVnLnVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmUgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+ZGVidWcudXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9OTklfU1BFRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bm5pX3NwZWVkLmZpcnN0X2hhbGYgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTsKKyAgICAgICAgdGhpcy0+bm5pX3NwZWVkLnNlY29uZF9oYWxmID0gQkNNT0xUX05OSV9TUEVFRF9HQlBTXzE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0VYVF9JUlEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSA9IEJDTU9MVF9FWFRfSVJRX1VOQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbmRpY2F0aW9uX3NoYXBpbmcuZW5hYmxlZCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5pbmRpY2F0aW9uX3NoYXBpbmcubWF4X3JhdGUgPSAxMDAwOworICAgICAgICB0aGlzLT5pbmRpY2F0aW9uX3NoYXBpbmcubWF4X2J1cnN0ID0gMTAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1RFTVBFUkFUVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNoaXBfdGVtcGVyYXR1cmUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z3Bvbl94Z3Bvbl90b2RfZW5hYmxlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4gPSBCQ01PTFRfR1BJT19QSU5fVU5DT05GSUdVUkVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9DT05ORUNURURfSU5URVJOQUxMWSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+ZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQuc3RyLCAwLCAyNTYpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fc2hhcGVyX21vZGUgPSBCQ01PTFRfU0hBUEVSX01PREVfTEFZRVJfMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRU1CRURERURfSU1BR0VfTElTVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbWJlZGRlZF9pbWFnZV9saXN0LmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmVtYmVkZGVkX2ltYWdlX2xpc3QudmFsID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9WT0xUQUdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNoaXBfdm9sdGFnZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+ZXBvbl90b2Rfc3RyaW5nLnN0ciwgMCwgMjU2KTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+eGdwb25fbnVtX29mX29udXMgPSBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfWEdQT05fU1VQUE9SVF8yNTZfT05VUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX0lQX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzX2luaXQoJnRoaXMtPmRldmljZV9pcF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX1VEUF9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRldmljZV91ZHBfcG9ydCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1RPRF9VQVJUX0JBVURSQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRvZF91YXJ0X2JhdWRyYXRlID0gQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzk2MDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCA9IDE2OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N5c3RlbV9tb2RlX3BhY2sodGhpcy0+c3lzdGVtX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmtlZXBhbGl2ZV9pbnRlcnZhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfVE9MRVJBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5rZWVwYWxpdmVfdG9sZXJhbmNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl9wYWNrKCZ0aGlzLT5maXJtd2FyZV9zd192ZXJzaW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfSE9TVF9TV19WRVJTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9wYWNrKCZ0aGlzLT5ob3N0X3N3X3ZlcnNpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uX3BhY2sodGhpcy0+Y2hpcF9yZXZpc2lvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9zdGF0ZV9wYWNrKHRoaXMtPnN0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19wYWNrKCZ0aGlzLT5kZWJ1ZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX3BhY2soJnRoaXMtPm5uaV9zcGVlZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0VYVF9JUlEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXh0X2lycV9wYWNrKHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9TQU1QTEVfREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX3BhY2soJnRoaXMtPmluZGljYXRpb25fc2hhcGluZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNoaXBfdGVtcGVyYXR1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5ncG9uX3hncG9uX3RvZF9lbmFibGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9HUElPX1BJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl9wYWNrKHRoaXMtPmdwb25feGdwb25fdG9kX2dwaW9fcGluLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfQ09OTkVDVEVEX0lOVEVSTkFMTFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjU2X3BhY2soJnRoaXMtPmVwb25fODAyMV9hc190b2RfZm9ybWF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9TSEFQRVJfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zaGFwZXJfbW9kZV9wYWNrKHRoaXMtPmVwb25fc2hhcGVyX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FTUJFRERFRF9JTUFHRV9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfcGFjaygmdGhpcy0+ZW1iZWRkZWRfaW1hZ2VfbGlzdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVk9MVEFHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y2hpcF92b2x0YWdlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjU2X3BhY2soJnRoaXMtPmVwb25fdG9kX3N0cmluZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1hHUE9OX05VTV9PRl9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX251bV9vZl9vbnVzX3BhY2sodGhpcy0+eGdwb25fbnVtX29mX29udXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfSVBfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+ZGV2aWNlX2lwX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX1VEUF9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5kZXZpY2VfdWRwX3BvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdWFydF9iYXVkcmF0ZV9wYWNrKHRoaXMtPnRvZF91YXJ0X2JhdWRyYXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5ncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1lTVEVNX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9UT0xFUkFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfSE9TVF9TV19WRVJTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDM5OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19FWFRfSVJRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX1NBTVBMRV9ERUxBWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gOTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9URU1QRVJBVFVSRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfQ09OTkVDVEVEX0lOVEVSTkFMTFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl84MDIxX0FTX1RPRF9GT1JNQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjU2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmVtYmVkZGVkX2ltYWdlX2xpc3QpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1ZPTFRBR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI1NjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX0lQX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX1VEUF9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1RPRF9VQVJUX0JBVURSQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N5c3RlbV9tb2RlX3VucGFjaygmdGhpcy0+c3lzdGVtX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmtlZXBhbGl2ZV9pbnRlcnZhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfVE9MRVJBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5rZWVwYWxpdmVfdG9sZXJhbmNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl91bnBhY2soJnRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ob3N0X3N3X3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT5ob3N0X3N3X3ZlcnNpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfUkVWSVNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fdW5wYWNrKCZ0aGlzLT5jaGlwX3JldmlzaW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX3N0YXRlX3VucGFjaygmdGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9ERUJVRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnX3VucGFjaygmdGhpcy0+ZGVidWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX3VucGFjaygmdGhpcy0+bm5pX3NwZWVkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19FWFRfSVJRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2V4dF9pcnFfdW5wYWNrKCZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfSU5ESUNBVElPTl9TSEFQSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ191bnBhY2soJnRoaXMtPmluZGljYXRpb25fc2hhcGluZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9URU1QRVJBVFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Y2hpcF90ZW1wZXJhdHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmdwb25feGdwb25fdG9kX2VuYWJsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwaW9fcGluX3VucGFjaygmdGhpcy0+Z3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9DT05ORUNURURfSU5URVJOQUxMWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fODAyMV9BU19UT0RfRk9STUFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8yNTZfdW5wYWNrKCZ0aGlzLT5lcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9TSEFQRVJfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zaGFwZXJfbW9kZV91bnBhY2soJnRoaXMtPmVwb25fc2hhcGVyX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FTUJFRERFRF9JTUFHRV9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfdW5wYWNrKCZ0aGlzLT5lbWJlZGRlZF9pbWFnZV9saXN0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1ZPTFRBR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNoaXBfdm9sdGFnZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1RPRF9TVFJJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzI1Nl91bnBhY2soJnRoaXMtPmVwb25fdG9kX3N0cmluZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fbnVtX29mX29udXNfdW5wYWNrKCZ0aGlzLT54Z3Bvbl9udW1fb2Zfb251cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9JUF9BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT5kZXZpY2VfaXBfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmRldmljZV91ZHBfcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91YXJ0X2JhdWRyYXRlX3VucGFjaygmdGhpcy0+dG9kX3VhcnRfYmF1ZHJhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9TVFJJTkdfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9UT0xFUkFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzOSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9IT1NUX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzOSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfRVhUX0lSUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0NPTk5FQ1RFRF9JTlRFUk5BTExZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDI1NikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FTUJFRERFRF9JTUFHRV9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1ZPTFRBR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDI1NikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9YR1BPTl9OVU1fT0ZfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX0lQX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9VRFBfUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3lzdGVtX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fOF9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YX0NPRVhJU1RFTkNFX1RETUE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9BRV84X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfMTBfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdTX18yX1hfMTBfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fMl9YXzEwX0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmtlZXBhbGl2ZV9pbnRlcnZhbCA+IDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUw7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX1RPTEVSQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+a2VlcGFsaXZlX3RvbGVyYW5jZSA+IDUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9UT0xFUkFOQ0U7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uX2JvdW5kc19jaGVjaygmdGhpcy0+ZmlybXdhcmVfc3dfdmVyc2lvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT047CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfSE9TVF9TV19WRVJTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9ib3VuZHNfY2hlY2soJnRoaXMtPmhvc3Rfc3dfdmVyc2lvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y2hpcF9yZXZpc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0NISVBfUkVWSVNJT05fQTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQ0hJUF9SRVZJU0lPTl9CMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9SRVZJU0lPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9TVEFURV9DT05ORUNUSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX1NUQVRFX1JFQURZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX1NUQVRFX1dBSVRJTkdfRk9SX0RFVklDRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9TVEFURV9URVNUSU5HX0REUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfYm91bmRzX2NoZWNrKCZ0aGlzLT5kZWJ1ZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX2JvdW5kc19jaGVjaygmdGhpcy0+bm5pX3NwZWVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfTk5JX1NQRUVEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0VYVF9JUlEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVhUX0lSUV9FWFRfSVJRMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VYVF9JUlFfRVhUX0lSUTI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVhUX0lSUV9FWFRfSVJRNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VYVF9JUlFfRVhUX0lSUTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FWFRfSVJRX1VOQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfRVhUX0lSUTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfSU5ESUNBVElPTl9TSEFQSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19ib3VuZHNfY2hlY2soJnRoaXMtPmluZGljYXRpb25fc2hhcGluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5ncG9uX3hncG9uX3RvZF9lbmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Z3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yNToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjU2X2JvdW5kc19jaGVjaygmdGhpcy0+ZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZXBvbl9zaGFwZXJfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU0hBUEVSX01PREVfTEFZRVJfMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NIQVBFUl9NT0RFX0xBWUVSXzI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fU0hBUEVSX01PREU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OF9ib3VuZHNfY2hlY2soJnRoaXMtPmVtYmVkZGVkX2ltYWdlX2xpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FTUJFRERFRF9JTUFHRV9MSVNUOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjU2X2JvdW5kc19jaGVjaygmdGhpcy0+ZXBvbl90b2Rfc3RyaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9UT0RfU1RSSU5HOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1hHUE9OX05VTV9PRl9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+eGdwb25fbnVtX29mX29udXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05VTV9PRl9PTlVTX1hHUE9OX1NVUFBPUlRfMjU2X09OVVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OVU1fT0ZfT05VU19YR1BPTl9TVVBQT1JUXzUxMF9PTlVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9YR1BPTl9OVU1fT0ZfT05VUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50b2RfdWFydF9iYXVkcmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfNDgwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzk2MDA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8xNDQwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzE5MjAwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMzg0MDA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV81NzYwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzExNTIwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzIzMDQwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzM4MDQwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzQ2MDgwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzkyMTYwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGggPiA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9DT01QTEVURV9JRF9TVEFOREFMT05FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YW5kYWxvbmUgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9DT01QTEVURV9JRF9TVEFOREFMT05FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhbmRhbG9uZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGFuZGFsb25lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9GQUlMVVJFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPnJlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRV9JRF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+cmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9GQUlMVVJFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9LRUVQQUxJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVVNFUl9DQUxMQkFDS19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TT0ZUV0FSRV9WRVJTSU9OX01JU01BVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NZU1RFTV9NT0RFX01JU01BVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05OSV9TUEVFRF9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9SRUNPTk5FQ1RfVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9JTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TWVNURU1fTU9ERV9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1BBUkFNRVRFUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kZHJfdGVzdC5zdGF0dXMgPSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTVBMRVRFRDsKKyAgICAgICAgdGhpcy0+ZGRyX3Rlc3QudS5jb21wbGV0ZWQuY3B1X3Jlc3VsdCA9IEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICAgICAgdGhpcy0+ZGRyX3Rlc3QudS5jb21wbGV0ZWQucmFzXzBfcmVzdWx0ID0gQkNNT0xUX0REUl9URVNUX1JFU1VMVF9TVUNDRVNTOworICAgICAgICB0aGlzLT5kZHJfdGVzdC51LmNvbXBsZXRlZC5yYXNfMV9yZXN1bHQgPSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfRERSX1RFU1RfQ09NUExFVEVfSURfRERSX1RFU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX3BhY2soJnRoaXMtPmRkcl90ZXN0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5kZHJfdGVzdCk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfdW5wYWNrKCZ0aGlzLT5kZHJfdGVzdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0REUl9URVNUX0NPTVBMRVRFX0lEX0REUl9URVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9ib3VuZHNfY2hlY2soJnRoaXMtPmRkcl90ZXN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2VxdWVuY2VfbnVtYmVyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRpbWVfc3RhbXAgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dGltZV9zdGFtcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1RJTUVfU1RBTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dGltZV9zdGFtcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9GSVJNV0FSRV9TV19WRVJTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24ubWFqb3IgPSAwOworICAgICAgICB0aGlzLT5maXJtd2FyZV9zd192ZXJzaW9uLm1pbm9yID0gMDsKKyAgICAgICAgdGhpcy0+ZmlybXdhcmVfc3dfdmVyc2lvbi5yZXZpc2lvbiA9IDA7CisgICAgICAgIHRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24ubW9kZWwgPSAwOworICAgICAgICBtZW1zZXQodGhpcy0+ZmlybXdhcmVfc3dfdmVyc2lvbi5idWlsZF90aW1lLCAwLCAzMik7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN5c3RlbV9tb2RlID0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1g7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ubmlfc3BlZWQuZmlyc3RfaGFsZiA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18xOworICAgICAgICB0aGlzLT5ubmlfc3BlZWQuc2Vjb25kX2hhbGYgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfQ0hJUF9SRVZJU0lPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jaGlwX3JldmlzaW9uID0gKGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbikgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50b2RfZW5hYmxlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0dQSU9fUElOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRvZF9ncGlvX3BpbiA9IEJDTU9MVF9HUElPX1BJTl9QSU4wOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl9wYWNrKCZ0aGlzLT5maXJtd2FyZV9zd192ZXJzaW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfU1lTVEVNX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3lzdGVtX21vZGVfcGFjayh0aGlzLT5zeXN0ZW1fbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX3BhY2soJnRoaXMtPm5uaV9zcGVlZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0NISVBfUkVWSVNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fcGFjayh0aGlzLT5jaGlwX3JldmlzaW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+dG9kX2VuYWJsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1RPRF9HUElPX1BJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl9wYWNrKHRoaXMtPnRvZF9ncGlvX3BpbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfRklSTVdBUkVfU1dfVkVSU0lPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfU1lTVEVNX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfTk5JX1NQRUVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0NISVBfUkVWSVNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl91bnBhY2soJnRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N5c3RlbV9tb2RlX3VucGFjaygmdGhpcy0+c3lzdGVtX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9OTklfU1BFRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX25uaV9zcGVlZF91bnBhY2soJnRoaXMtPm5uaV9zcGVlZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfQ0hJUF9SRVZJU0lPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbl91bnBhY2soJnRoaXMtPmNoaXBfcmV2aXNpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT50b2RfZW5hYmxlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0dQSU9fUElOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwaW9fcGluX3VucGFjaygmdGhpcy0+dG9kX2dwaW9fcGluLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzOSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9TWVNURU1fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfTk5JX1NQRUVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl9ib3VuZHNfY2hlY2soJnRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24pKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9GSVJNV0FSRV9TV19WRVJTSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3lzdGVtX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fOF9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YX0NPRVhJU1RFTkNFX1RETUE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9BRV84X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfMTBfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdTX18yX1hfMTBfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fMl9YXzEwX0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1NZU1RFTV9NT0RFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9OTklfU1BFRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX25uaV9zcGVlZF9ib3VuZHNfY2hlY2soJnRoaXMtPm5uaV9zcGVlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX05OSV9TUEVFRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y2hpcF9yZXZpc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0NISVBfUkVWSVNJT05fQTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQ0hJUF9SRVZJU0lPTl9CMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfQ0hJUF9SRVZJU0lPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnRvZF9lbmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfRU5BQkxFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50b2RfZ3Bpb19waW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yNToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1RPRF9HUElPX1BJTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfSU1BR0VfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbWFnZV90eXBlID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJsb2NrX251bWJlciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3BhY2sodGhpcy0+aW1hZ2VfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5ibG9ja19udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzX3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3VucGFjaygmdGhpcy0+aW1hZ2VfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5ibG9ja19udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzX3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX0JMT0NLX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfSU1BR0VfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmltYWdlX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0lUVV9QT05fT05VX0ZJUk1XQVJFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfRVBPTl9PTlVfRklSTVdBUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfSU1BR0VfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX01FTU9SWV9BTExPQ0FUSU9OX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfVU5TVVBQT1JURURfRklMRV9UWVBFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19CTE9DS19PVVRfT0ZfU1lOQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19JTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19JTlZBTElEX1NUQVRFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1BSRU1BVFVSRV9URVJNSU5BVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19BQ0tfVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTkRJQ0FUSU9OU19EUk9QUEVEX0lEX1RPVEFMX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRvdGFsX2NvdW50ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRF9JRF9UT1RBTF9DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dG90YWxfY291bnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRF9JRF9UT1RBTF9DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lORElDQVRJT05TX0RST1BQRURfSURfVE9UQUxfQ09VTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRvdGFsX2NvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTkRJQ0FUSU9OU19EUk9QUEVEX0lEX1RPVEFMX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnRhc2tfbmFtZS5zdHIsIDAsIDEwMCk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5maWxlX25hbWUuc3RyLCAwLCAxMDApOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0xJTkVfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxpbmVfbnVtYmVyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMF9wYWNrKCZ0aGlzLT50YXNrX25hbWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0ZJTEVfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMTAwX3BhY2soJnRoaXMtPmZpbGVfbmFtZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfTElORV9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxpbmVfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1RBU0tfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEwMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9MSU5FX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfVEFTS19OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8xMDBfdW5wYWNrKCZ0aGlzLT50YXNrX25hbWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8xMDBfdW5wYWNrKCZ0aGlzLT5maWxlX25hbWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfTElORV9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmxpbmVfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1RBU0tfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0ZJTEVfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0xJTkVfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMF9ib3VuZHNfY2hlY2soJnRoaXMtPnRhc2tfbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfVEFTS19OQU1FOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8xMDBfYm91bmRzX2NoZWNrKCZ0aGlzLT5maWxlX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0ZJTEVfTkFNRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9DUFVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y3B1X2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+dGV4dC5zdHIsIDAsIDIwMDApOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX0NQVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jcHVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjAwMF9wYWNrKCZ0aGlzLT50ZXh0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9DUFVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyMDAwOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfQ1BVX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNwdV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9URVhUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8yMDAwX3VucGFjaygmdGhpcy0+dGV4dCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX0NQVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIwMDApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjAwMF9ib3VuZHNfY2hlY2soJnRoaXMtPnRleHQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9URVhUOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29ubmVjdGlvbl9jb21wbGV0ZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29ubmVjdGlvbl9lc3RhYmxpc2hlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb25uZWN0aW9uX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERFJfVEVTVF9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kZHJfdGVzdF9jb21wbGV0ZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRldmljZV9rZWVwX2FsaXZlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX1JFQURZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRldmljZV9yZWFkeSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGlzY29ubmVjdGlvbl9jb21wbGV0ZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmltYWdlX3RyYW5zZmVyX2NvbXBsZXRlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbmRpY2F0aW9uc19kcm9wcGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3dfZXJyb3IgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FWENFUFRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3dfZXhjZXB0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNvbm5lY3Rpb25fY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0VTVEFCTElTSEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Y29ubmVjdGlvbl9lc3RhYmxpc2hlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNvbm5lY3Rpb25fZmFpbHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0REUl9URVNUX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGRyX3Rlc3RfY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERVZJQ0VfS0VFUF9BTElWRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmRldmljZV9rZWVwX2FsaXZlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX1JFQURZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGV2aWNlX3JlYWR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRElTQ09OTkVDVElPTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmRpc2Nvbm5lY3Rpb25fY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmltYWdlX3RyYW5zZmVyX2NvbXBsZXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmluZGljYXRpb25zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN3X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVhDRVBUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3dfZXhjZXB0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERFJfVEVTVF9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX1JFQURZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRElTQ09OTkVDVElPTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVhDRVBUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y29ubmVjdGlvbl9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jb25uZWN0aW9uX2VzdGFibGlzaGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y29ubmVjdGlvbl9mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRERSX1RFU1RfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kZHJfdGVzdF9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZGV2aWNlX2tlZXBfYWxpdmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERVZJQ0VfUkVBRFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kZXZpY2VfcmVhZHkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZGlzY29ubmVjdGlvbl9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aW1hZ2VfdHJhbnNmZXJfY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aW5kaWNhdGlvbnNfZHJvcHBlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3dfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FWENFUFRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zd19leGNlcHRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0REUl9URVNUX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9SRUFEWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVhDRVBUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2VxdWVuY2VfbnVtYmVyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50aW1lX3N0YW1wID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNlcXVlbmNlX251bWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50aW1lX3N0YW1wKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfU0VRVUVOQ0VfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1RJTUVfU1RBTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1RJTUVfU1RBTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRpbWVfc3RhbXApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJsb2NrX251bWJlciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bW9yZV9kYXRhID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRhdGEubGVuID0gMDsKKyAgICAgICAgdGhpcy0+ZGF0YS52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YmxvY2tfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tb3JlX2RhdGEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MTZfaGV4X3BhY2soJnRoaXMtPmRhdGEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfTU9SRV9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UxNl9oZXhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmRhdGEpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5ibG9ja19udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX01PUkVfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1vcmVfZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9oZXhfdW5wYWNrKCZ0aGlzLT5kYXRhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9CTE9DS19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9ib3VuZHNfY2hlY2soJnRoaXMtPmRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfREFUQTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmltYWdlX3R5cGUgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQk9PVExPQURFUjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmltYWdlX3NpemUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0NSQzMyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNyYzMyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5pbWFnZV9uYW1lLnN0ciwgMCwgNjQpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGVfcGFjayh0aGlzLT5pbWFnZV90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pbWFnZV9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfQ1JDMzIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNyYzMyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfNjRfcGFjaygmdGhpcy0+aW1hZ2VfbmFtZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9DUkMzMikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3VucGFjaygmdGhpcy0+aW1hZ2VfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW1hZ2Vfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0NSQzMyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jcmMzMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzY0X3VucGFjaygmdGhpcy0+aW1hZ2VfbmFtZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfQ1JDMzIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmltYWdlX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0lUVV9QT05fT05VX0ZJUk1XQVJFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfRVBPTl9PTlVfRklSTVdBUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl82NF9ib3VuZHNfY2hlY2soJnRoaXMtPmltYWdlX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX05BTUU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tb2RlID0gKGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9SRVNFVF9JRF9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9yZXNldF9tb2RlX3BhY2sodGhpcy0+bW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV91bnBhY2soJnRoaXMtPm1vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9yZXNldF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0RFVklDRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0hPU1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfUkVTRVRfTU9ERV9BTEw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfQ1BVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNwdSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYXNfMCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYXNfMSA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJhc18wKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18xKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmFzXzEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfUkFTXzApKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfUkFTXzEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJhc18wKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18xKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cmFzXzEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfUkFTXzApKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18xKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzX2luaXQoJnRoaXMtPm1hY19hZGRyZXNzKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5lcG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnVua25vd25fbGlua192aW9sYXRpb24ubGlua19yYXRlID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU47CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnVua25vd25fbGlua192aW9sYXRpb24uYWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLm1heF9saW5rX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24ubGFzZXJfb25fdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24ubGFzZXJfb2ZmX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnJhbmdlX3Zpb2xhdGlvbi5yYW5nZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnJhbmdlX3Zpb2xhdGlvbi5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUudGRtX2NoYW5uZWxzX2V4aGF1c3RlZCA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24uZGVuaWVkX2xsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUucm9ndWVfdmlvbGF0aW9uLmRlbmllZF9yYW5nZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnJvZ3VlX3Zpb2xhdGlvbi5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUudXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGVfcGFjaygmdGhpcy0+YWxhcm1fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDMwOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV91bnBhY2soJnRoaXMtPmFsYXJtX3N0YXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX2JvdW5kc19jaGVjaygmdGhpcy0+YWxhcm1fc3RhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfQUxBUk1fU1RBVEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cy5sYXNlcl9vbl90aW1lID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLmxhc2VyX29mZl90aW1lID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzX3BhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTUFYX0xJTktfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTUFYX0xJTktfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLnJhbmdlID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUkFOR0VfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5nZV9zdGF0dXNfcGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUkFOR0VfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5nZV9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUkFOR0VfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUkFOR0VfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5nZV9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMuZGVuaWVkX2xsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLmRlbmllZF9yYW5nZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cy5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfc3RhdHVzX3BhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19ST0dVRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDc7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfc3RhdHVzX2JvdW5kc19jaGVjaygmdGhpcy0+YWxhcm1fc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19URE1fQ0hBTk5FTFNfRVhIQVVTVEVEX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19URE1fQ0hBTk5FTFNfRVhIQVVTVEVEX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19URE1fQ0hBTk5FTFNfRVhIQVVTVEVEX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19URE1fQ0hBTk5FTFNfRVhIQVVTVEVEX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cy5saW5rX3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VTktOT1dOX0xJTktfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzX3BhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDM7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VTktOT1dOX0xJTktfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTUFYX0xJTktfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1heF9saW5rX3Zpb2xhdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9SQU5HRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2VfdmlvbGF0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yb2d1ZV92aW9sYXRpb24gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dGRtX2NoYW5uZWxzX2V4aGF1c3RlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVua25vd25fbGlua192aW9sYXRpb24gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmxhc2VyX29uX29mZl92aW9sYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTUFYX0xJTktfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bWF4X2xpbmtfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmFuZ2VfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJvZ3VlX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9URE1fQ0hBTk5FTFNfRVhIQVVTVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dGRtX2NoYW5uZWxzX2V4aGF1c3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dW5rbm93bl9saW5rX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9NQVhfTElOS19WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bGFzZXJfb25fb2ZmX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9NQVhfTElOS19WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5tYXhfbGlua192aW9sYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9SQU5HRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yYW5nZV92aW9sYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUk9HVUVfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cm9ndWVfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT50ZG1fY2hhbm5lbHNfZXhoYXVzdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1VOS05PV05fTElOS19WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT51bmtub3duX2xpbmtfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9NQVhfTElOS19WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9SQU5HRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVERNX0NIQU5ORUxTX0VYSEFVU1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzX2luaXQoJnRoaXMtPm1hY19hZGRyZXNzKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5rX3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfU1RBVEVfRkxBR1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGVfZmxhZ3MgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncykgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sbGlkID0gKGJjbW9sdF9lcG9uX2xsaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09OX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGFzZXJfb25fdGltZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09GRl9USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxhc2VyX29mZl90aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2VfdmFsdWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kaXN0YW5jZSA9IChiY21vbHRfbWV0ZXJzKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5rZXlfZXhjaGFuZ2VfZmFpbHVyZSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5pbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLm1wY3BfcmVwb3J0X3RpbWVvdXQgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUub2FtX2tlZXBhbGl2ZV90aW1lb3V0ID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50dW5uZWxfaWQgPSAoYmNtb2x0X2Vwb25fdHVubmVsX2lkKSAyMTY0MjYwODY0VUw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSAyNTU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5taW5fbGFzZXJfb3ZlcmhlYWQubGFzZXJfb25fdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDMyOworICAgICAgICB0aGlzLT5taW5fbGFzZXJfb3ZlcmhlYWQubGFzZXJfb2ZmX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAzMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2VfY29uZmlnLm9hbV90eXBlID0gQkNNT0xUX0VQT05fT0FNX1RZUEVfQlJPQURDT007CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9jb25maWcucGVyaW9kID0gMDsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbmZpZy5kaXJlY3Rpb24gPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0RJUkVDVElPTl9ET1dOU1RSRUFNX09OTFk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047CisgICAgICAgIHRoaXMtPmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2tleV9jaG9pY2UgPSBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8wOworICAgICAgICB0aGlzLT5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jZmIua2V5LCAwLCBzaXplb2YodGhpcy0+ZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXkpKTsKKyAgICAgICAgdGhpcy0+ZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX21vZGUgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTjsKKyAgICAgICAgdGhpcy0+ZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2tleV9jaG9pY2UgPSBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8wOworICAgICAgICB0aGlzLT5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI7CisgICAgICAgIG1lbXNldCh0aGlzLT5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXksIDAsIHNpemVvZih0aGlzLT5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXkpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfZW5hYmxlLnVwc3RyZWFtID0gQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfVVNFX0RFRkFVTFQ7CisgICAgICAgIHRoaXMtPmZlY19lbmFibGUuZG93bnN0cmVhbSA9IEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX1VTRV9ERUZBVUxUOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vYW1faGVhcnRiZWF0X2NvbmZpZy5zZW5kX3BlcmlvZCA9IDA7CisgICAgICAgIHRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnLnRyYW5zbWl0X2ZyYW1lLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnLnRyYW5zbWl0X2ZyYW1lLnZhbCA9IE5VTEw7CisgICAgICAgIHRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+b2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy52YWwgPSBOVUxMOworICAgICAgICB0aGlzLT5vYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+b2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgICAgIHRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnLnJlY2VpdmVfdGltZW91dCA9IDE7CisgICAgICAgIHRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnLm1heGltdW1fcmVjZWl2ZV9zaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfQVVUT01BVElDOworICAgICAgICB0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGguZ3JhbnRfdGhyZXNob2xkX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSAwOworICAgICAgICB0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSAwOworICAgICAgICB0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPnVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9pbnRlcnZhbF91cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VCRF9JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnViZF9pbmZvLmFjdHVhbF9wb2xsaW5nX2ludGVydmFsID0gMDsKKyAgICAgICAgdGhpcy0+dWJkX2luZm8uYWN0dWFsX2dyYW50X3RocmVzaG9sZF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPnViZF9pbmZvLmFjdHVhbF9taW5fc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF9tYnNfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT51YmRfaW5mby5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+dWJkX2luZm8uYWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXIuYWN0dWFsX21ic190cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPnViZF9pbmZvLmFjdHVhbF9tYXhfc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF93ZWlnaHRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNsb2NrX3RyYW5zcG9ydF9lbmFibGUgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9QRU5ESU5HX0dSQU5UUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wZW5kaW5nX2dyYW50cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5rX3R5cGUgPSBCQ01PTFRfRVBPTl9MSU5LX1RZUEVfU1lTVEVNOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfcmF0ZV9wYWNrKHRoaXMtPmxpbmtfcmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFnc19wYWNrKHRoaXMtPnN0YXRlX2ZsYWdzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5sbGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09OX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+bGFzZXJfb25fdGltZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MQVNFUl9PRkZfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5sYXNlcl9vZmZfdGltZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5yYW5nZV92YWx1ZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5kaXN0YW5jZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfcGFjaygmdGhpcy0+YWxhcm1fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9UVU5ORUxfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+dHVubmVsX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfcGFjaygmdGhpcy0+bWluX2xhc2VyX292ZXJoZWFkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWdfcGFjaygmdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbmZpZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX3BhY2soJnRoaXMtPmVwb25fZW5jcnlwdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0ZFQ19FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX2ZlY19lbl9wYWNrKCZ0aGlzLT5mZWNfZW5hYmxlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT0FNX0hFQVJUQkVBVF9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfcGFjaygmdGhpcy0+b2FtX2hlYXJ0YmVhdF9jb25maWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbl9wYWNrKCZ0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGgsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91YmRfaW5mb19wYWNrKCZ0aGlzLT51YmRfaW5mbywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jbG9ja190cmFuc3BvcnRfZW5hYmxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1BFTkRJTkdfR1JBTlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBlbmRpbmdfZ3JhbnRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfdHlwZV9wYWNrKHRoaXMtPmxpbmtfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MQVNFUl9PRkZfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9UVU5ORUxfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZXBvbl9lbmNyeXB0aW9uKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9QRU5ESU5HX0dSQU5UUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfcmF0ZV91bnBhY2soJnRoaXMtPmxpbmtfcmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFnc191bnBhY2soJnRoaXMtPnN0YXRlX2ZsYWdzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmxhc2VyX29uX3RpbWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT0ZGX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5sYXNlcl9vZmZfdGltZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnJhbmdlX3ZhbHVlX3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0RJU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+ZGlzdGFuY2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnR1bm5lbF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfdW5wYWNrKCZ0aGlzLT5taW5fbGFzZXJfb3ZlcmhlYWQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnX3VucGFjaygmdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbmZpZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRVBPTl9FTkNSWVBUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfdW5wYWNrKCZ0aGlzLT5lcG9uX2VuY3J5cHRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0ZFQ19FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX2ZlY19lbl91bnBhY2soJnRoaXMtPmZlY19lbmFibGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09BTV9IRUFSVEJFQVRfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX3VucGFjaygmdGhpcy0+b2FtX2hlYXJ0YmVhdF9jb25maWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX3VucGFjaygmdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91YmRfaW5mb191bnBhY2soJnRoaXMtPnViZF9pbmZvLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y2xvY2tfdHJhbnNwb3J0X2VuYWJsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9QRU5ESU5HX0dSQU5UUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wZW5kaW5nX2dyYW50cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3R5cGVfdW5wYWNrKCZ0aGlzLT5saW5rX3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9TVEFURV9GTEFHUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT0ZGX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1JBTkdFX1ZBTFVFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9NSU5fTEFTRVJfT1ZFUkhFQUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT0FNX0hFQVJUQkVBVF9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0MikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1BFTkRJTkdfR1JBTlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxpbmtfcmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9PTkVfT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1JBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICgodGhpcy0+c3RhdGVfZmxhZ3MgJiAweDAwRkUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZV9ib3VuZHNfY2hlY2soJnRoaXMtPmFsYXJtX3N0YXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfQUxBUk1fU1RBVEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVFVOTkVMX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50dW5uZWxfaWQgPCAoYmNtb2x0X2Vwb25fdHVubmVsX2lkKSAyMTY0MjYwODY0VUwpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT50dW5uZWxfaWQgPiAoYmNtb2x0X2Vwb25fdHVubmVsX2lkKSAyMTY0MjY0OTU5VUwpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfZXBvbl9vbnVfaWQpIDEyNykKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfYm91bmRzX2NoZWNrKCZ0aGlzLT5taW5fbGFzZXJfb3ZlcmhlYWQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9NSU5fTEFTRVJfT1ZFUkhFQUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5rZXlfZXhjaGFuZ2VfY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9FUE9OX0VOQ1JZUFRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmVwb25fZW5jcnlwdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9GRUNfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fYm91bmRzX2NoZWNrKCZ0aGlzLT5mZWNfZW5hYmxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfT0FNX0hFQVJUQkVBVF9DT05GSUc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGgpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEg7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVUJEX0lORk8pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdWJkX2luZm9fYm91bmRzX2NoZWNrKCZ0aGlzLT51YmRfaW5mbykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VCRF9JTkZPOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxpbmtfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1RZUEVfU1lTVEVNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1RZUEVfRE9XTlNUUkVBTV9PTkxZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1RZUEVfQklESVJFQ1RJT05BTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2RhdGFfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGF0YV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc182NCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc182NV8xMjcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzI1Nl81MTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc181MTJfMTAyMyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9mcmFtZXNfMTUxOV8yMDQ3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzIwNDhfNDA5NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzkyMTdfMTYzODMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X29hbV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X29hbV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfbXBjcF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9icm9hZGNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3VuaWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfbXVsdGljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3JlcG9ydF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2Zjc19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9vdmVyc2l6ZV9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3J1bnRfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2xpbmVfY29kZV9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2xpbmVfY29kZV9lcnJvcl9tYXggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9kYXRhX2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2RhdGFfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfNjQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfNjVfMTI3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc18xMjhfMjU1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc18yNTZfNTExID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfNTEyXzEwMjMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfMTAyNF8xNTE4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZnJhbWVzXzE1MTlfMjA0NyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc18yMDQ4XzQwOTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfNDA5Nl85MjE2ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc185MjE3XzE2MzgzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9vYW1fYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9vYW1fZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X21wY3BfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfYnJvYWRjYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF91bmljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X211bHRpY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZ2F0ZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2RhdGFfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9kYXRhX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9mcmFtZXNfNjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc182NV8xMjcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc18yNTZfNTExKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc181MTJfMTAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzE1MTlfMjA0NykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzIwNDhfNDA5NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc185MjE3XzE2MzgzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X29hbV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb2FtX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X21wY3BfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfdW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3JlcG9ydF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZDU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZmNzX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb3ZlcnNpemVfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3J1bnRfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0xJTkVfQ09ERV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfbGluZV9jb2RlX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9saW5lX2NvZGVfZXJyb3JfbWF4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZGF0YV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9vYW1fYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X29hbV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9tcGNwX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X3VuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9HQVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZ2F0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09WRVJTSVpFX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0xJTkVfQ09ERV9FUlJPUl9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZGF0YV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9vYW1fYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X29hbV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9tcGNwX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3VuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9yZXBvcnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Zjc19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X292ZXJzaXplX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ydW50X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2xpbmVfY29kZV9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfbGluZV9jb2RlX2Vycm9yX21heCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2RhdGFfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2ZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2ZyYW1lc18xMjhfMjU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMTAyNF8xNTE4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfNDA5Nl85MjE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfb2FtX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9vYW1fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfbXBjcF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF91bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfbXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2dhdGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jZmcudHJpZ2dlci50eXBlID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORTsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IDA7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3BhY2soJnRoaXMtPmNmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y2ZnKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ191bnBhY2soJnRoaXMtPmNmZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmNmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0lOSVRJQUxfUkFOR0VfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+aW5pdGlhbF9yYW5nZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfQ1VSUkVOVF9SQU5HRV9UUSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jdXJyZW50X3JhbmdlX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9JTklUSUFMX1JBTkdFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmluaXRpYWxfcmFuZ2VfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9DVVJSRU5UX1JBTkdFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmN1cnJlbnRfcmFuZ2VfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9JTklUSUFMX1JBTkdFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfQ1VSUkVOVF9SQU5HRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfSU5JVElBTF9SQU5HRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmluaXRpYWxfcmFuZ2VfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9DVVJSRU5UX1JBTkdFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+Y3VycmVudF9yYW5nZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0lOSVRJQUxfUkFOR0VfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfQ1VSUkVOVF9SQU5HRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByZXZpb3VzX3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX0NVUlJFTlRfUkFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jdXJyZW50X3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+cHJldmlvdXNfcmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9DVVJSRU5UX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3JhdGVfcGFjayh0aGlzLT5jdXJyZW50X3JhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX1BSRVZJT1VTX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX0NVUlJFTlRfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfUFJFVklPVVNfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfcmF0ZV91bnBhY2soJnRoaXMtPnByZXZpb3VzX3JhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfQ1VSUkVOVF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3VucGFjaygmdGhpcy0+Y3VycmVudF9yYXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfUFJFVklPVVNfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX0NVUlJFTlRfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX1BSRVZJT1VTX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5wcmV2aW91c19yYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfQ1VSUkVOVF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y3VycmVudF9yYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9DVVJSRU5UX1JBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5rX2luZm8ubGlua19zdGF0dXMgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0dXMpIDA7CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby5yYXRlID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU47CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby5sbGlkID0gKGJjbW9sdF9lcG9uX2xsaWQpIDA7CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby5tcGNwX2Rpc2NvdmVyeV9pbmZvID0gKGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvKSAwOworICAgICAgICB0aGlzLT5saW5rX2luZm8ub251X2xhc2VyX29uX3RpbWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT5saW5rX2luZm8ub251X2xhc2VyX29mZl90aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLnBlbmRpbmdfZ3JhbnRzID0gMDsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLnJhbmdlX3ZhbHVlX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLnR1bm5lbF9pZCA9IChiY21vbHRfZXBvbl90dW5uZWxfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19pbmZvX3BhY2soJnRoaXMtPmxpbmtfaW5mbywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19pbmZvX3VucGFjaygmdGhpcy0+bGlua19pbmZvLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19pbmZvX2JvdW5kc19jaGVjaygmdGhpcy0+bGlua19pbmZvKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX1JFUE9SVF9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX1JFUE9SVF9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfUkVQT1JUX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRF9JRF9MSU5LX0lORk8pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLmxpbmtfc3RhdHVzID0gKGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzKSAwOworICAgICAgICB0aGlzLT5saW5rX2luZm8ucmF0ZSA9IEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOworICAgICAgICB0aGlzLT5saW5rX2luZm8ubGxpZCA9IChiY21vbHRfZXBvbl9sbGlkKSAwOworICAgICAgICB0aGlzLT5saW5rX2luZm8ubXBjcF9kaXNjb3ZlcnlfaW5mbyA9IChiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbykgMDsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLm9udV9sYXNlcl9vbl90aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLm9udV9sYXNlcl9vZmZfdGltZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby5wZW5kaW5nX2dyYW50cyA9IDA7CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby5yYW5nZV92YWx1ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby50dW5uZWxfaWQgPSAoYmNtb2x0X2Vwb25fdHVubmVsX2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfaW5mb19wYWNrKCZ0aGlzLT5saW5rX2luZm8sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfaW5mb191bnBhY2soJnRoaXMtPmxpbmtfaW5mbywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDI0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfaW5mb19ib3VuZHNfY2hlY2soJnRoaXMtPmxpbmtfaW5mbykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9QUk9URUNUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N0YXR1cyA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1RBVEVfVU5QUk9URUNURUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2VfdmFsdWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZV9wYWNrKHRoaXMtPnByb3RlY3Rpb25fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5yYW5nZV92YWx1ZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZV91bnBhY2soJnRoaXMtPnByb3RlY3Rpb25fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnJhbmdlX3ZhbHVlX3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUFJPVEVDVElPTl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUFJPVEVDVElPTl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5wcm90ZWN0aW9uX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX1VOUFJPVEVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX1BST1RFQ1RFRF9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5nZV92YWx1ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1JBTkdFX1ZBTFVFX0NIQU5HRURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+cmFuZ2VfdmFsdWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1JBTkdFX1ZBTFVFX0NIQU5HRURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5yYW5nZV92YWx1ZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9CWVRFUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9FTkNSWVBUSU9OX0VOQUJMRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5jcnlwdGlvbl9lbmFibGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2Vfc3RhcnRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9zdG9wcGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19ERUxFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxpbmtfZGVsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfU1BFRURfTUlTTUFUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGlua19zcGVlZF9taXNtYXRjaCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfREVSRUdJU1RFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZGVyZWdpc3RlcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZGlzY292ZXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfUkVHX0FDS19USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfcmVnX2Fja190aW1lb3V0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tcGNwX3JlcG9ydF90aW1lb3V0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9hbV9rZWVwYWxpdmVfdGltZW91dCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVkFMVUVfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5nZV92YWx1ZV9jaGFuZ2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlcmFuZ2VfZmFpbHVyZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRU5DUllQVElPTl9FTkFCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZW5jcnlwdGlvbl9lbmFibGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5rZXlfZXhjaGFuZ2VfZmFpbHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX3N0YXJ0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmtleV9leGNoYW5nZV9zdG9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19ERUxFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bGlua19kZWxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19TUEVFRF9NSVNNQVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmxpbmtfc3BlZWRfbWlzbWF0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RFUkVHSVNURVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1wY3BfZGVyZWdpc3RlcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bXBjcF9kaXNjb3ZlcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tcGNwX3JlZ19hY2tfdGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tcGNwX3JlcG9ydF90aW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1JBTkdFX1ZBTFVFX0NIQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yYW5nZV92YWx1ZV9jaGFuZ2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmVyYW5nZV9mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRU5DUllQVElPTl9FTkFCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19ERUxFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19TUEVFRF9NSVNNQVRDSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfREVSRUdJU1RFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SQU5HRV9WQUxVRV9DSEFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9FTkNSWVBUSU9OX0VOQUJMRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5lbmNyeXB0aW9uX2VuYWJsZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmtleV9leGNoYW5nZV9mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1NUQVJURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2Vfc3RhcnRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+a2V5X2V4Y2hhbmdlX3N0b3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX0RFTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5saW5rX2RlbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX1NQRUVEX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bGlua19zcGVlZF9taXNtYXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfREVSRUdJU1RFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bXBjcF9kZXJlZ2lzdGVyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RJU0NPVkVSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5tcGNwX2Rpc2NvdmVyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFR19BQ0tfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1wY3BfcmVnX2Fja190aW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1wY3BfcmVwb3J0X3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vYW1fa2VlcGFsaXZlX3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVkFMVUVfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJhbmdlX3ZhbHVlX2NoYW5nZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yZXJhbmdlX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRU5DUllQVElPTl9FTkFCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfREVMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX1NQRUVEX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfREVSRUdJU1RFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFR19BQ0tfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SQU5HRV9WQUxVRV9DSEFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1JFUkFOR0VfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGVyaW9kID0gMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBlcmlvZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUQVJUX0lEX1BFUklPRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfUEVSSU9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wZXJpb2QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUQVJUX0lEX1BFUklPRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfUEVSSU9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wZXJpb2QgPCAxKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9QRVJJT0Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRfSURfU0VORF9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2VuZF9wZXJpb2QgPSAxOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX1NFTkRfUEVSSU9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5zZW5kX3BlcmlvZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX1NFTkRfUEVSSU9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVF9JRF9TRU5EX1BFUklPRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c2VuZF9wZXJpb2QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRfSURfU0VORF9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVF9JRF9TRU5EX1BFUklPRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+c2VuZF9wZXJpb2QgPCAxKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRfSURfU0VORF9QRVJJT0Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPTl9USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxhc2Vyb25fdGltZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9GRl9USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxhc2Vyb2ZmX3RpbWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2VfdmFsdWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUEVORElOR19HUkFOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGVuZGluZ19ncmFudHMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5sYXNlcm9uX3RpbWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST0ZGX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+bGFzZXJvZmZfdGltZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+cmFuZ2VfdmFsdWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBlbmRpbmdfZ3JhbnRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPTl9USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9GRl9USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUEVORElOR19HUkFOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmxhc2Vyb25fdGltZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPRkZfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmxhc2Vyb2ZmX3RpbWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1JBTkdFX1ZBTFVFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+cmFuZ2VfdmFsdWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBlbmRpbmdfZ3JhbnRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST0ZGX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRV9JRF9GUkFNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZS5mcmFtZV9vY3RldHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+ZnJhbWUuZnJhbWVfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfcGFjaygmdGhpcy0+ZnJhbWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfSU5KRUNUX0ZSQU1FX0lEX0ZSQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZnJhbWUpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfdW5wYWNrKCZ0aGlzLT5mcmFtZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfSU5KRUNUX0ZSQU1FX0lEX0ZSQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfYm91bmRzX2NoZWNrKCZ0aGlzLT5mcmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfSU5KRUNUX0ZSQU1FX0lEX0ZSQU1FOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX0ZSQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmZyYW1lLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfcGFjaygmdGhpcy0+ZnJhbWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX0ZSQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZnJhbWUpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5mcmFtZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19GUkFNRV9DQVBUVVJFRF9JRF9GUkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5mcmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfRlJBTUU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9rZXlfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmVwb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2tleV91bnBhY2soYmNtb2x0X2Vwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmVwb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWFjX2FkZHJlc3MudThbMF0gPSAweDAwMDA7CisgICAgICAgIHRoaXMtPm1hY19hZGRyZXNzLnU4WzFdID0gMHgwMDBEOworICAgICAgICB0aGlzLT5tYWNfYWRkcmVzcy51OFsyXSA9IDB4MDBCNjsKKyAgICAgICAgdGhpcy0+bWFjX2FkZHJlc3MudThbM10gPSAweDAwMDA7CisgICAgICAgIHRoaXMtPm1hY19hZGRyZXNzLnU4WzRdID0gMHgwMDAwOworICAgICAgICB0aGlzLT5tYWNfYWRkcmVzcy51OFs1XSA9IDB4MDAwMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTklfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaV9lbiA9IEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX0RJU0FCTEVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlZ2lzdHJhdGlvbl9iZWhhdmlvciA9IEJDTU9MVF9SRUdJU1RSQVRJT05fQkVIQVZJT1JfQVVUT01BVElDOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm10dV8xZyA9IDE1MzY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMTBHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm10dV8xMGcgPSAxNTM2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUlOSU1VTV9GSUJFUl9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWluaW11bV9maWJlcl9sZW5ndGggPSAoYmNtb2x0X21ldGVycykgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BWElNVU1fRklCRVJfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1heGltdW1fZmliZXJfbGVuZ3RoID0gKGJjbW9sdF9tZXRlcnMpIDIwMDAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ncmFudF9zcGFjaW5nX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMzI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX0xPR0lDQUxfTElOS19PUFRJT05TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlID0gQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOworICAgICAgICB0aGlzLT5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS50ZWtub3Z1cy5yZWdfYWNrX3RpbWVvdXRfbXMgPSAxMDA7CisgICAgICAgIHRoaXMtPmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVwb3J0aW5nX21vZGUgPSBCQ01PTFRfRVBPTl9EQkFfUkVQT1JUSU5HX01PREVfU0lFUE9OX0E7CisgICAgICAgIHRoaXMtPmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMubWF4X2xpbmtzID0gNTEyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVBDUF9ESVNDT1ZFUllfUEVSSU9EX01TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyA9IDEwMDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5ub19yZXBvcnRzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsX2xpbmtzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmFsbF9saW5rcy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRU5DUllQVElPTl9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5jcnlwdGlvbl9jZmcuZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTjsKKyAgICAgICAgdGhpcy0+ZW5jcnlwdGlvbl9jZmcudXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnByb3RlY3Rpb25fdHlwZSA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfTk9fUFJPVEVDVElPTl9TV1RJQ0hJTkc7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zID0gKGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucykgMDsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2Vfb3B0aW9ucyA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1JFUkFOR0lOR19PUFRJT05TX1JFUkFOR0VfTk9ORTsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2VfYXR0ZW1wdHMgPSAwOworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9pbnRlcnZhbCA9IDA7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5zeW5jX2dhdGVfZHVyYXRpb24gPSAwOworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19pbnB1dCA9IEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0X3BvbGFyaXR5ID0gQkNNT0xUX0dQSU9fUE9MQVJJVFlfQUNUSVZFX0hJR0g7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX291dHB1dCA9IEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX291dHB1dF9wb2xhcml0eSA9IEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9ISUdIOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jbG9ja190cmFuc3BvcnRfY2ZnLmVwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUgPSBCQ01PTFRfRVBPTl9DTE9DS19UUkFOU1BPUlRfTU9ERV9IT1NUX0RSSVZFTjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmRyb3Bkb3duX3dlaWdodHMuYXJyLCAwLCBzaXplb2YodGhpcy0+ZHJvcGRvd25fd2VpZ2h0cy5hcnIpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+YXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlLmFyciwgMCwgc2l6ZW9mKHRoaXMtPmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1RETV9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hcHByb3hpbWF0ZV90ZG1fdXNhZ2UgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bm9fcmVwb3J0c19zb2FrX3RpbWUgPSAyNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9hZ2dyZWdhdGVfc2hhcGVyLmJhbmR3aWR0aF9rYnBzID0gMDsKKyAgICAgICAgdGhpcy0+cG9uX2FnZ3JlZ2F0ZV9zaGFwZXIubWJzX2tCID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUSkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+ZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyciwgMCwgc2l6ZW9mKHRoaXMtPmVzdGltYXRlZF9wb25fbGF0ZW5jeV90cS5hcnIpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMub2FtX2V4dGVuc2lvbl90eXBlID0gQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RQT0U7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy51LmRwb2UucmVzcG9uc2VfdGltZW91dF9tcyA9IDEwMDA7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy51LmRwb2UuYmxvY2tfc2l6ZSA9IDYwOworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMudS5kcG9lLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0ID0gMTU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkID0gMTI4OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX05JX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGVfcGFjayh0aGlzLT5lcG9uX25pX2VuLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3JfcGFjayh0aGlzLT5yZWdpc3RyYXRpb25fYmVoYXZpb3IsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tdHVfMWcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xMEcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm10dV8xMGcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01JTklNVU1fRklCRVJfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPm1pbmltdW1fZmliZXJfbGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQVhJTVVNX0ZJQkVSX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5tYXhpbXVtX2ZpYmVyX2xlbmd0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5ncmFudF9zcGFjaW5nX3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX0xPR0lDQUxfTElOS19PUFRJT05TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfcGFjaygmdGhpcy0+ZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZV9wYWNrKCZ0aGlzLT5hbGFybV9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9wYWNrKCZ0aGlzLT5hbGxfbGlua3MsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRU5DUllQVElPTl9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ19wYWNrKCZ0aGlzLT5lbmNyeXB0aW9uX2NmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3BhY2soJnRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+Y2xvY2tfdHJhbnNwb3J0X2NmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9EUk9QRE9XTl9XRUlHSFRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MTZfN19wYWNrKCZ0aGlzLT5kcm9wZG93bl93ZWlnaHRzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfYm91bmRzXzhfcGFjaygmdGhpcy0+YXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1RETV9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YXBwcm94aW1hdGVfdGRtX3VzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bm9fcmVwb3J0c19zb2FrX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3BhY2soJnRoaXMtPnBvbl9hZ2dyZWdhdGVfc2hhcGVyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfYm91bmRzXzhfcGFjaygmdGhpcy0+ZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19wYWNrKCZ0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfVEhSRVNIT0xEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xMEcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01JTklNVU1fRklCRVJfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQVhJTVVNX0ZJQkVSX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9MT0dJQ0FMX0xJTktfT1BUSU9OUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9saW5rcyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRFJPUERPV05fV0VJR0hUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2NDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1RETV9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FU1RJTUFURURfUE9OX0xBVEVOQ1lfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTklfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV91bnBhY2soJnRoaXMtPmVwb25fbmlfZW4sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcl91bnBhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9iZWhhdmlvciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm10dV8xZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzEwRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXR1XzEwZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUlOSU1VTV9GSUJFUl9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5taW5pbXVtX2ZpYmVyX2xlbmd0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFYSU1VTV9GSUJFUl9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5tYXhpbXVtX2ZpYmVyX2xlbmd0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmdyYW50X3NwYWNpbmdfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc191bnBhY2soJnRoaXMtPmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZV91bnBhY2soJnRoaXMtPmFsYXJtX3N0YXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKCZ0aGlzLT5hbGxfbGlua3MsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3VucGFjaygmdGhpcy0+ZW5jcnlwdGlvbl9jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+Y2xvY2tfdHJhbnNwb3J0X2NmZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3UxNl83X3VucGFjaygmdGhpcy0+ZHJvcGRvd25fd2VpZ2h0cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfYm91bmRzXzhfdW5wYWNrKCZ0aGlzLT5hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmFwcHJveGltYXRlX3RkbV91c2FnZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm5vX3JlcG9ydHNfc29ha190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QT05fQUdHUkVHQVRFX1NIQVBFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcl91bnBhY2soJnRoaXMtPnBvbl9hZ2dyZWdhdGVfc2hhcGVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVNUSU1BVEVEX1BPTl9MQVRFTkNZX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl9ib3VuZHNfOF91bnBhY2soJnRoaXMtPmVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc191bnBhY2soJnRoaXMtPm9udV91cGdyYWRlX3BhcmFtcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzEwR19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMUdfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdXRvX3JvZ3VlX2RldGVjdF8xZ19lbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xMEcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NSU5JTVVNX0ZJQkVSX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BWElNVU1fRklCRVJfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMTF9MSU5LUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VOQ1JZUFRJT05fQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9EUk9QRE9XTl9XRUlHSFRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVNUSU1BVEVEX1BPTl9MQVRFTkNZX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzEwR19USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX05JX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZXBvbl9uaV9lbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPVEVDVEVEX1dPUktJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlZ2lzdHJhdGlvbl9iZWhhdmlvcikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVHSVNUUkFUSU9OX0JFSEFWSU9SX0FVVE9NQVRJQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFR0lTVFJBVElPTl9CRUhBVklPUl9OT1RJRllfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xRykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+bXR1XzFnIDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+bXR1XzFnID4gMjAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzEwRykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+bXR1XzEwZyA8IDY0KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzEwRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT5tdHVfMTBnID4gMTAwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMTBHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9HUkFOVF9TUEFDSU5HX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5ncmFudF9zcGFjaW5nX3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgNjU1MzVVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0dSQU5UX1NQQUNJTkdfVFE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19ib3VuZHNfY2hlY2soJnRoaXMtPmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9MT0dJQ0FMX0xJTktfT1BUSU9OUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVBDUF9ESVNDT1ZFUllfUEVSSU9EX01TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5tcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMgPCAxMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGFybV9zdGF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxfbGlua3MubGVuID4gMjA0OCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9ib3VuZHNfY2hlY2soJnRoaXMtPmFsbF9saW5rcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTExfTElOS1M7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VOQ1JZUFRJT05fQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmdfYm91bmRzX2NoZWNrKCZ0aGlzLT5lbmNyeXB0aW9uX2NmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPmNsb2NrX3RyYW5zcG9ydF9jZmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRFJPUERPV05fV0VJR0hUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzdfYm91bmRzX2NoZWNrKCZ0aGlzLT5kcm9wZG93bl93ZWlnaHRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfYm91bmRzXzhfYm91bmRzX2NoZWNrKCZ0aGlzLT5hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVBQUk9YSU1BVEVfU09MSUNJVEVEX1VTQUdFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+bm9fcmVwb3J0c19zb2FrX3RpbWUgPiA2NykKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX05PX1JFUE9SVFNfU09BS19USU1FOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QT05fQUdHUkVHQVRFX1NIQVBFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnBvbl9hZ2dyZWdhdGVfc2hhcGVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FU1RJTUFURURfUE9OX0xBVEVOQ1lfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX2JvdW5kc184X2JvdW5kc19jaGVjaygmdGhpcy0+ZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2JvdW5kc19jaGVjaygmdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MSU5LX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGlua19yYXRlID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU47CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+bGlua19tYWMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX1JBTkdFX1ZBTFVFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJhbmdlX3ZhbHVlX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MSU5LX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3JhdGVfcGFjayh0aGlzLT5saW5rX3JhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfTUFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmxpbmtfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+cmFuZ2VfdmFsdWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MSU5LX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3JhdGVfdW5wYWNrKCZ0aGlzLT5saW5rX3JhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfTUFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmxpbmtfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5yYW5nZV92YWx1ZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfTUFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX1JBTkdFX1ZBTFVFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxpbmtfcmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9PTkVfT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfUkFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX01QQ1BfVElNRVNUQU1QX0NIQU5HRURfSURfTVBDUF9USU1FU1RBTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXBjcF90aW1lc3RhbXAgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9NUENQX1RJTUVTVEFNUF9DSEFOR0VEX0lEX01QQ1BfVElNRVNUQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tcGNwX3RpbWVzdGFtcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9NUENQX1RJTUVTVEFNUF9DSEFOR0VEX0lEX01QQ1BfVElNRVNUQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9NUENQX1RJTUVTVEFNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bXBjcF90aW1lc3RhbXApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9NUENQX1RJTUVTVEFNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX05PX1JFUE9SVFNfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX05PX1JFUE9SVFNfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX05PX1JFUE9SVFNfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX05PX1JFUE9SVFNfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3BhY2soJnRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9ib3VuZHNfY2hlY2soJnRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfUkVUVVJOX0lORF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmV0dXJuX2luZF9zdGF0dXMgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfQ09NUExFVEU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfUkVUVVJOX0lORF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXNfcGFjayh0aGlzLT5yZXR1cm5faW5kX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfUkVUVVJOX0lORF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFX0lEX1JFVFVSTl9JTkRfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzX3VucGFjaygmdGhpcy0+cmV0dXJuX2luZF9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFX0lEX1JFVFVSTl9JTkRfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFX0lEX1JFVFVSTl9JTkRfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cmV0dXJuX2luZF9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfTExJRF9TVEFURV9JU19CQUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9TQ0FOX1NUQVRVU19MTElEX0lTX09PUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX1NDQU5fRVJSX05PUkVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfSU5URVJOQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfUkVUVVJOX0lORF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGxpZCA9IChiY21vbHRfZXBvbl9sbGlkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MSU5LX01BQykpICE9IDApCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5saW5rX21hYyk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+bGxpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MSU5LX01BQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5saW5rX21hYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xJTktfTUFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfTElOS19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bGlua19tYWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfTElOS19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X3N0YXRlID0gQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRElTQUJMRUQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGVfcGFjayh0aGlzLT5uZXdfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGVfdW5wYWNrKCZ0aGlzLT5uZXdfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5uZXdfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9QUk9URUNURURfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTExJRF9RVUFSQU5USU5FRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sbGlkX3F1YXJhbnRpbmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX01QQ1BfVElNRVNUQU1QX0NIQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXBjcF90aW1lc3RhbXBfY2hhbmdlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5vX3JlcG9ydHMgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfY29tcGxldGUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlcmFuZ2VfZmFpbHVyZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJvZ3VlX3NjYW5fY29tcGxldGUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ZV9jaGFuZ2VfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzEwR19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTExJRF9RVUFSQU5USU5FRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmxsaWRfcXVhcmFudGluZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1wY3BfdGltZXN0YW1wX2NoYW5nZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTk9fUkVQT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm5vX3JlcG9ydHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfdXBncmFkZV9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yZXJhbmdlX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUk9HVUVfU0NBTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJvZ3VlX3NjYW5fY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdGVfY2hhbmdlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9MTElEX1FVQVJBTlRJTkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX01QQ1BfVElNRVNUQU1QX0NIQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTk9fUkVQT1JUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUk9HVUVfU0NBTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9MTElEX1FVQVJBTlRJTkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bGxpZF9xdWFyYW50aW5lZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bXBjcF90aW1lc3RhbXBfY2hhbmdlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bm9fcmVwb3J0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9udV91cGdyYWRlX2NvbXBsZXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JFUkFOR0VfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlcmFuZ2VfZmFpbHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cm9ndWVfc2Nhbl9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9MTElEX1FVQVJBTlRJTkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+bWFjX2FkZHJlc3MpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+cmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfcmF0ZV91bnBhY2soJnRoaXMtPnJhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX1JBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzX2luaXQoJnRoaXMtPm1hY19hZGRyZXNzKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmF0ZSA9IEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+cmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfTVVMVElDQVNUX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3VucGFjaygmdGhpcy0+cmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfTVVMVElDQVNUX0xJTktfSURfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9SQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5tYWNfYWRkcmVzcyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX1dPUktJTkdfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPndvcmtpbmdfbGlua19pbmZvLmxpbmtfc3RhdHVzID0gKGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzKSAwOworICAgICAgICB0aGlzLT53b3JraW5nX2xpbmtfaW5mby5yYXRlID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU47CisgICAgICAgIHRoaXMtPndvcmtpbmdfbGlua19pbmZvLmxsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICAgICAgdGhpcy0+d29ya2luZ19saW5rX2luZm8ubXBjcF9kaXNjb3ZlcnlfaW5mbyA9IChiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbykgMDsKKyAgICAgICAgdGhpcy0+d29ya2luZ19saW5rX2luZm8ub251X2xhc2VyX29uX3RpbWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT53b3JraW5nX2xpbmtfaW5mby5vbnVfbGFzZXJfb2ZmX3RpbWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT53b3JraW5nX2xpbmtfaW5mby5wZW5kaW5nX2dyYW50cyA9IDA7CisgICAgICAgIHRoaXMtPndvcmtpbmdfbGlua19pbmZvLnJhbmdlX3ZhbHVlX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+d29ya2luZ19saW5rX2luZm8udHVubmVsX2lkID0gKGJjbW9sdF9lcG9uX3R1bm5lbF9pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9XT1JLSU5HX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfaW5mb19wYWNrKCZ0aGlzLT53b3JraW5nX2xpbmtfaW5mbywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfV09SS0lOR19MSU5LX0lORk8pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9XT1JLSU5HX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfaW5mb191bnBhY2soJnRoaXMtPndvcmtpbmdfbGlua19pbmZvLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX1dPUktJTkdfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfV09SS0lOR19MSU5LX0lORk8pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX2luZm9fYm91bmRzX2NoZWNrKCZ0aGlzLT53b3JraW5nX2xpbmtfaW5mbykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX1dPUktJTkdfTElOS19JTkZPOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSykpICE9IDApCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5ncmFudGVkX2xpbmspOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHJpZ2dlcl93aWR0aCA9IDMyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHJpZ2dlcl9kZWxheSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfU0FNUExFX1BFUklPRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zYW1wbGVfcGVyaW9kID0gNTAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5ncmFudGVkX2xpbmspKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX1dJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT50cmlnZ2VyX3dpZHRoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9ERUxBWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dHJpZ2dlcl9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnNhbXBsZV9wZXJpb2QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9HUkFOVEVEX0xJTkspKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX1dJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9ERUxBWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5ncmFudGVkX2xpbmspKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX1dJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT50cmlnZ2VyX3dpZHRoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9ERUxBWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dHJpZ2dlcl9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnNhbXBsZV9wZXJpb2QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9HUkFOVEVEX0xJTkspKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9XSURUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX0RFTEFZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9XSURUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHJpZ2dlcl93aWR0aCA8IDMyKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfV0lEVEg7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+dHJpZ2dlcl93aWR0aCA+IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9XSURUSDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnRyaWdnZXJfZGVsYXkgPiAxNTAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9TQU1QTEVfUEVSSU9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5zYW1wbGVfcGVyaW9kIDwgMTAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+c2FtcGxlX3BlcmlvZCA+IDkwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9TQU1QTEVfUEVSSU9EOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX1JFUkFOR0VfREVMVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVyYW5nZV9kZWx0YSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEFfSURfUkVSQU5HRV9ERUxUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmVyYW5nZV9kZWx0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX1JFUkFOR0VfREVMVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX1JFUkFOR0VfREVMVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnJlcmFuZ2VfZGVsdGEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQV9JRF9SRVJBTkdFX0RFTFRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1vZGUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGxpZCA9IChiY21vbHRfZXBvbl9sbGlkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tb2RlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bW9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfc3RhdGUgPSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9ESVNBQkxFRDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfU0VUX0VQT05fTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV91bnBhY2soJnRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm5ld19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPVEVDVEVEX1dPUktJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saXN0X29mX29udV9pZHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+bGlzdF9vZl9vbnVfaWRzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfcGFjaygmdGhpcy0+bGlzdF9vZl9vbnVfaWRzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmxpc3Rfb2Zfb251X2lkcyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl91bnBhY2soJnRoaXMtPmxpc3Rfb2Zfb251X2lkcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5saXN0X29mX29udV9pZHMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5lcG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9lcG9uX29udV9pZCkgMTI3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbF9saW5rcy5sZW4gPSAwOworICAgICAgICB0aGlzLT5hbGxfbGlua3MudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9wYWNrKCZ0aGlzLT5hbGxfbGlua3MsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX0FMTF9MSU5LUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YWxsX2xpbmtzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX0FMTF9MSU5LUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X3VucGFjaygmdGhpcy0+YWxsX2xpbmtzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbF9saW5rcy5sZW4gPiAyMDQ4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X2JvdW5kc19jaGVjaygmdGhpcy0+YWxsX2xpbmtzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19DRkdfSURfQUxMX0xJTktTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb2RlX3dvcmRzX3RvdGFsID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX0RFQ09ERV9GQUlMUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX1pFUk9FU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX3plcm9lc19jb3JyZWN0ZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19vbmVzX2NvcnJlY3RlZCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2RlX3dvcmRzX3RvdGFsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX1pFUk9FU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY196ZXJvZXNfY29ycmVjdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfT05FU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19vbmVzX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19aRVJPRVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfT05FU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29kZV93b3Jkc190b3RhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfREVDT0RFX0ZBSUxTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19aRVJPRVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfemVyb2VzX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfb25lc19jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfWkVST0VTX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19JRF9DRkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfWkVST0VTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfWkVST0VTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5lcG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmVwb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5vbnVfaWQgPiAoYmNtb2x0X2Vwb25fb251X2lkKSAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX0FMTF9MSU5LUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxfbGlua3MubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YWxsX2xpbmtzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfcGFjaygmdGhpcy0+YWxsX2xpbmtzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9saW5rcyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl91bnBhY2soJnRoaXMtPmFsbF9saW5rcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGxfbGlua3MpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX0FMTF9MSU5LUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nb29kX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z29vZF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX09WRVJTWl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b3ZlcnN6X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bm9uX2ZlY19nb29kX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ub25fZmVjX2dvb2RfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2dvb2RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2dvb2RfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfRlJBTUVTX0VYQ19FUlJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19mcmFtZXNfZXhjX2VycnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19OT19FUlJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19ibGtzX25vX2VycnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19DT1JSX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2Jsa3NfY29ycl9lcnJzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2Jsa3NfdW5jb3JyX2VycnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29ycl9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29ycl96ZXJvZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9PTkVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb3JyX29uZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9VTkRFUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51bmRlcnN6X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVycm9yc3pfZnJhbWVzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Z29vZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Z29vZF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5vdmVyc3pfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm5vbl9mZWNfZ29vZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfTk9OX0ZFQ19HT09EX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ub25fZmVjX2dvb2RfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mZWNfZ29vZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19nb29kX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19mcmFtZXNfZXhjX2VycnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfTk9fRVJSUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2Jsa3Nfbm9fZXJycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19DT1JSX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19ibGtzX2NvcnJfZXJycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19VTkNPUlJfRVJSUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2Jsa3NfdW5jb3JyX2VycnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb3JyX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2NvcnJfemVyb2VzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb3JyX29uZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfVU5ERVJTWl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVuZGVyc3pfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5lcnJvcnN6X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfT1ZFUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0ZSQU1FU19FWENfRVJSUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19OT19FUlJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX0NPUlJfRVJSUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19VTkNPUlJfRVJSUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfT05FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9VTkRFUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmdvb2RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmdvb2RfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfT1ZFUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b3ZlcnN6X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5ub25fZmVjX2dvb2RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bm9uX2ZlY19nb29kX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2dvb2RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfZ29vZF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfRlJBTUVTX0VYQ19FUlJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfZnJhbWVzX2V4Y19lcnJzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX05PX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19ibGtzX25vX2VycnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfQ09SUl9FUlJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfYmxrc19jb3JyX2VycnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19ibGtzX3VuY29ycl9lcnJzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29ycl9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19jb3JyX3plcm9lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9PTkVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29ycl9vbmVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmRlcnN6X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZXJyb3Jzel9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX05PX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX0NPUlJfRVJSUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX05PX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX0NPUlJfRVJSUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX05PX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX0NPUlJfRVJSUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX3N0YXRlID0gQkNNT0xUX0VQT05fRkVDX0VOX1NUQVRFX0VOQUJMRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5wb2x5bm9tID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzc7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5pbnZlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3BhY2sodGhpcy0+ZmVjX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZ19wYWNrKCZ0aGlzLT5wcmJzX2dlbmVyYXRvciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3VucGFjaygmdGhpcy0+ZmVjX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZ191bnBhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZlY19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19nZW5lcmF0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1I7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Ynl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNjQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzY1XzEyNyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18yNTZfNTExID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzUxMl8xMDIzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzE1MTlfMjA0NyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMjA0OF80MDk1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc185MjE3XzE2MzgzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJyb2FkY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGF0YV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tdWx0aWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51bmljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9hbV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vYW1fZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nYXRlX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXBjcF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hYm9ydF9mcmFtZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xMjhfMjU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18yNTZfNTExKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMTAyNF8xNTE4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzE1MTlfMjA0NykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNDA5Nl85MjE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc185MjE3XzE2MzgzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRhdGFfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5vYW1fYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5vYW1fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmdhdGVfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm1wY3BfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5hYm9ydF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJ5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NV8xMjcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc181MTJfMTAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzIwNDhfNDA5NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm11bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm9hbV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm9hbV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Z2F0ZV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bXBjcF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jZmcudHJpZ2dlci50eXBlID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORTsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IDA7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3BhY2soJnRoaXMtPmNmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y2ZnKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ191bnBhY2soJnRoaXMtPmNmZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmNmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX3N0YXRlID0gQkNNT0xUX0VQT05fRkVDX0VOX1NUQVRFX0VOQUJMRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3luY190aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMzI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLnBvbHlub20gPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNzsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLm1vZGUgPSBCQ01PTFRfUFJCU19DSEVDS0VSX01PREVfU0VMRl9TWU5DOworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19zdGF0dXMubG9ja19zdGF0ZSA9IEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfVU5MT0NLRUQ7CisgICAgICAgIHRoaXMtPnByYnNfc3RhdHVzLmVycm9yX2NvdW50cyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3BhY2sodGhpcy0+ZmVjX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5zeW5jX3RpbWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfY2hlY2tlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c19wYWNrKCZ0aGlzLT5wcmJzX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZV91bnBhY2soJnRoaXMtPmZlY19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5zeW5jX3RpbWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3VucGFjaygmdGhpcy0+cHJic19jaGVja2VyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19zdGF0dXNfdW5wYWNrKCZ0aGlzLT5wcmJzX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfU1lOQ19USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mZWNfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRkVDX0VOX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX0ZFQ19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+c3luY190aW1lX3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgNjU1MzVVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c19ib3VuZHNfY2hlY2soJnRoaXMtPnByYnNfc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzY0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc182NV8xMjcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xMjhfMjU1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMjU2XzUxMSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc181MTJfMTAyMyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMTAyNF8xNTE4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xNTE5XzIwNDcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzIwNDhfNDA5NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNDA5Nl85MjE2ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfOTIxN18xNjM4MyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5icm9hZGNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRhdGFfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXVsdGljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dW5pY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b2FtX2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9hbV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVwb3J0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFib3J0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZjc19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y3JjXzhfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm91dF9vZl9zbG90ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vdmVyc2l6ZV9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ydW50X2Vycm9yID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5tcGNwX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b2FtX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b2FtX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJlcG9ydF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmNzX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmNyY184X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm91dF9vZl9zbG90KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm92ZXJzaXplX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnVudF9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5tcGNwX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b2FtX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b2FtX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJlcG9ydF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmNzX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmNyY184X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm91dF9vZl9zbG90KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm92ZXJzaXplX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnVudF9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRkNTX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0NSQ184X0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF9mZWNfc3RhdGUgPSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1JBTUFOX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFtYW5fbW9kZSA9IEJDTU9MVF9SQU1BTl9NSVRJR0FUSU9OX01PREVfRElTQUJMRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1RVUkJPXzJHX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHVyYm9fMmdfbW9kZSA9IEJDTU9MVF9FUE9OXzFHX1RVUkJPX01PREVfRElTQUJMRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLnBvbHlub20gPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNzsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLmludmVydCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZV9wYWNrKHRoaXMtPmRlZmF1bHRfZmVjX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUkFNQU5fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGVfcGFjayh0aGlzLT5yYW1hbl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfVFVSQk9fMkdfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGVfcGFjayh0aGlzLT50dXJib18yZ19tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1RVUkJPXzJHX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3VucGFjaygmdGhpcy0+ZGVmYXVsdF9mZWNfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV91bnBhY2soJnRoaXMtPnJhbWFuX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV91bnBhY2soJnRoaXMtPnR1cmJvXzJnX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfdW5wYWNrKCZ0aGlzLT5wcmJzX2dlbmVyYXRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kZWZhdWx0X2ZlY19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUkFNQU5fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJhbWFuX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JBTUFOX01JVElHQVRJT05fTU9ERV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JBTUFOX01JVElHQVRJT05fTU9ERV9SQU5ET006CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU1BTl9NSVRJR0FUSU9OX01PREVfRklYRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1JBTUFOX01PREU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1RVUkJPXzJHX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50dXJib18yZ19tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OXzFHX1RVUkJPX01PREVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OXzFHX1RVUkJPX01PREVfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfVFVSQk9fMkdfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19nZW5lcmF0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNjQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNjVfMTI3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xMjhfMjU1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18yNTZfNTExID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNTEyXzEwMjMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMTAyNF8xNTE4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzE1MTlfMjA0NyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18yMDQ4XzQwOTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNDA5Nl85MjE2ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc185MjE3XzE2MzgzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnJvYWRjYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRhdGFfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tdWx0aWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVuaWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vYW1fYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vYW1fZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdhdGVfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hYm9ydF9mcmFtZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm9hbV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b2FtX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmdhdGVfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXBjcF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YWJvcnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xMjhfMjU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTAyNF8xNTE4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfNDA5Nl85MjE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRhdGFfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm11bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5vYW1fYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm9hbV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5nYXRlX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm1wY3BfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmVwb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmVwb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlZmF1bHRfZmVjX3N0YXRlID0gQkNNT0xUX0VQT05fRkVDX0VOX1NUQVRFX0RJU0FCTEVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3luY190aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMzI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIubW9kZSA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9TRUxGX1NZTkM7CisgICAgICAgIHRoaXMtPnByYnNfY2hlY2tlci5kYXRhX2ludmVydCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByYnNfc3RhdHVzLmxvY2tfc3RhdGUgPSBCQ01PTFRfUFJCU19MT0NLX1NUQVRFX1VOTE9DS0VEOworICAgICAgICB0aGlzLT5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3BhY2sodGhpcy0+ZGVmYXVsdF9mZWNfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+c3luY190aW1lX3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfY2hlY2tlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfc3RhdHVzX3BhY2soJnRoaXMtPnByYnNfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZV91bnBhY2soJnRoaXMtPmRlZmF1bHRfZmVjX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfU1lOQ19USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+c3luY190aW1lX3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3VucGFjaygmdGhpcy0+cHJic19jaGVja2VyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c191bnBhY2soJnRoaXMtPnByYnNfc3RhdHVzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kZWZhdWx0X2ZlY19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfU1lOQ19USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5zeW5jX3RpbWVfdHEgPiAoYmNtb2x0X3RpbWVfcXVhbnRhKSA2NTUzNVVMKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9QUkJTX0NIRUNLRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcmJzX3N0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc182NCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc182NV8xMjcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzI1Nl81MTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc181MTJfMTAyMyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzIwNDhfNDA5NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5icm9hZGNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGF0YV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm11bHRpY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dW5pY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXBjcF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9hbV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9hbV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXBvcnRfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hYm9ydF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZjc19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jcmNfOF9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vdXRfb2Zfc2xvdCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vdmVyc2l6ZV9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ1bnRfZXJyb3IgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXBjcF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b2FtX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5vYW1fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yZXBvcnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mY3NfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0NSQ184X0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5jcmNfOF9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm91dF9vZl9zbG90KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b3ZlcnNpemVfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JVTlRfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ1bnRfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xMjhfMjU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTAyNF8xNTE4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfNDA5Nl85MjE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRhdGFfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm11bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm1wY3BfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm9hbV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b2FtX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cmVwb3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5hYm9ydF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZDU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmNzX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Y3JjXzhfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09VVF9PRl9TTE9UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5vdXRfb2Zfc2xvdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm92ZXJzaXplX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5ydW50X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09VVF9PRl9TTE9UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2ZnLnRyaWdnZXIudHlwZSA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSAwOworICAgICAgICB0aGlzLT5jZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19wYWNrKCZ0aGlzLT5jZmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmNmZyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfdW5wYWNrKCZ0aGlzLT5jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5jZmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUlVOVF9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0NSQ184X0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1VUX09GX1NMT1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9ycF9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcnBfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5rX3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3JwX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+bGlua19yYXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3JwX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9ycF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfa2V5X3VucGFjayhiY21vbHRfZXBvbl9ycF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3VucGFjaygmdGhpcy0+bGlua19yYXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9MSU5LX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcnBfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcnBfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxpbmtfcmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9PTkVfT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmFzZV9sbGlkID0gKGJjbW9sdF9lcG9uX2xsaWQpIDE1MzYwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZGlzY19lbiA9IEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfR05UX0xFTl9UUSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tcGNwX2Rpc2NfZ250X2xlbl90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDgxNjA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfcmVwb3J0X3RpbWVvdXQgPSA1MDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWF4X2xpbmtzID0gMjU2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfREVGQVVMVF9VUFNUUkVBTV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgucG9sbGluZ19pbnRlcnZhbF91cyA9IEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX0FVVE9NQVRJQzsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGguZ3JhbnRfdGhyZXNob2xkX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyA9IChiY21vbHRfYmFuZHdpZHRoX0ticHMpIDA7CisgICAgICAgIHRoaXMtPmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gMDsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gKGJjbW9sdF9iYW5kd2lkdGhfS2JwcykgMDsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSAwOworICAgICAgICB0aGlzLT5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X2ludGVydmFsX3VzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX1JBVEVfT0ZfUkVGUkFDVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYXRlX29mX3JlZnJhY3Rpb24gPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5iYXNlX2xsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1wY3BfZGlzY19lbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0dOVF9MRU5fVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+bXBjcF9kaXNjX2dudF9sZW5fdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1wY3BfcmVwb3J0X3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3cpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4X2xpbmtzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX3BhY2soJnRoaXMtPmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX1JBVEVfT0ZfUkVGUkFDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfZG91YmxlKGJ1ZiwgdGhpcy0+cmF0ZV9vZl9yZWZyYWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfQkFTRV9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTVBDUF9SRUdfUEVSX0RJU0NfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0RFRkFVTFRfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5iYXNlX2xsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1wY3BfZGlzY19lbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0dOVF9MRU5fVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5tcGNwX2Rpc2NfZ250X2xlbl90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXBjcF9yZXBvcnRfdGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX01QQ1BfUkVHX1BFUl9ESVNDX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tYXhfbGlua3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0RFRkFVTFRfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fdW5wYWNrKCZ0aGlzLT5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX1JBVEVfT0ZfUkVGUkFDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9kb3VibGUoYnVmLCAmdGhpcy0+cmF0ZV9vZl9yZWZyYWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9SQVRFX09GX1JFRlJBQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3JwX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmJhc2VfbGxpZCA+IChiY21vbHRfZXBvbl9sbGlkKSAzMjUxMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0dOVF9MRU5fVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm1wY3BfZGlzY19nbnRfbGVuX3RxIDwgKGJjbW9sdF90aW1lX3F1YW50YSkgNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RROworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPm1wY3BfZGlzY19nbnRfbGVuX3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgNjU1MzVVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RROworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm1heF9saW5rcyA+IDIwNDYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1M7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0RFRkFVTFRfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bpb19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwaW9fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc2VydmVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z3Bpb19pZCA9IEJDTU9MVF9HUElPX1BJTl9QSU4wOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwaW9fa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwaW9fcGluX3BhY2sodGhpcy0+Z3Bpb19pZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bpb19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwaW9fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19LRVlfSURfR1BJT19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fa2V5X3VucGFjayhiY21vbHRfZ3Bpb19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bpb19waW5fdW5wYWNrKCZ0aGlzLT5ncGlvX2lkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19LRVlfSURfR1BJT19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bpb19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bpb19rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19LRVlfSURfR1BJT19JRCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmdwaW9faWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yNToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lEOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bpb19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGlyZWN0aW9uID0gQkNNT0xUX0dQSU9fUElOX0RJUl9JTlBVVDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fQ0ZHX0lEX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnZhbHVlID0gQkNNT0xUX0dQSU9fVkFMVUVfQ0xFQVI7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncGlvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19DRkdfSURfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwaW9fcGluX2Rpcl9wYWNrKHRoaXMtPmRpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncGlvX3ZhbHVlX3BhY2sodGhpcy0+dmFsdWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwaW9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fQ0ZHX0lEX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19DRkdfSURfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fQ0ZHX0lEX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl9kaXJfdW5wYWNrKCZ0aGlzLT5kaXJlY3Rpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19DRkdfSURfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bpb192YWx1ZV91bnBhY2soJnRoaXMtPnZhbHVlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19DRkdfSURfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19DRkdfSURfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncGlvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kaXJlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX0RJUl9JTlBVVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX0RJUl9PVVRQVVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1ZBTFVFX0NMRUFSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19WQUxVRV9TRVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+YWxsb2NfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2tleV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9ncG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2xhLmNicl9ydF9idyA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5jYnJfbnJ0X2J3ID0gMDsKKyAgICAgICAgdGhpcy0+c2xhLmd1YXJhbnRlZWRfYncgPSAwOworICAgICAgICB0aGlzLT5zbGEubWF4aW11bV9idyA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ID0gQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfTk9ORTsKKyAgICAgICAgdGhpcy0+c2xhLmNicl9ydF9jb21wZW5zYXRpb24gPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+c2xhLmNicl9ydF9hcF9pbmRleCA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5jYnJfbnJ0X2FwX2luZGV4ID0gMDsKKyAgICAgICAgdGhpcy0+c2xhLmFsbG9jX3R5cGUgPSBCQ01PTFRfQUxMT0NfVFlQRV9OT05FOworICAgICAgICB0aGlzLT5zbGEud2VpZ2h0ID0gMDsKKyAgICAgICAgdGhpcy0+c2xhLnByaW9yaXR5ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb2xsZWN0X3N0YXRzID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWxsb2Nfc3RhdGVfcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2FsbG9jX3NsYV9wYWNrKCZ0aGlzLT5zbGEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNvbGxlY3Rfc3RhdHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU0xBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDIzOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY19zdGF0ZV91bnBhY2soJnRoaXMtPnN0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWxsb2Nfc2xhX3VucGFjaygmdGhpcy0+c2xhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y29sbGVjdF9zdGF0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX1BST0NFU1NJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWxsb2Nfc2xhX2JvdW5kc19jaGVjaygmdGhpcy0+c2xhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5vbnVfaWQgPiAoYmNtb2x0X2dwb25fb251X2lkKSAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYnl0ZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfc3RhdGUgPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY19zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY19zdGF0ZV91bnBhY2soJnRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm5ld19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX1BST0NFU1NJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF2ZXJhZ2VfbnNyX3VzZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX0FMTE9DQVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdmVyYWdlX25zcl9hbGxvY2F0ZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF2ZXJhZ2Vfc3JfcmVwb3J0ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hdmVyYWdlX25zcl91c2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hdmVyYWdlX25zcl9hbGxvY2F0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YXZlcmFnZV9zcl9yZXBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX1VTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmF2ZXJhZ2VfbnNyX3VzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hdmVyYWdlX3NyX3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX0FMTE9DQVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNvbmZpZ3VyYXRpb25fY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Z2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5udW1fb2ZfY3ljbGVzID0gMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5udW1fb2ZfY3ljbGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bnVtX29mX2N5Y2xlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+bnVtX29mX2N5Y2xlcyA8IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRlID0gQkNNT0xUX0FMTE9DX09QRVJBVElPTl9BQ1RJVkFURTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY19vcGVyYXRpb25fcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FsbG9jX29wZXJhdGlvbl91bnBhY2soJnRoaXMtPnN0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19PUEVSQVRJT05fQUNUSVZBVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19PUEVSQVRJT05fREVBQ1RJVkFURToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9ncG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmdlbV9wb3J0X2lkID4gKGJjbW9sdF9ncG9uX2dlbV9pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29uZmlndXJhdGlvbi5kaXJlY3Rpb24gPSBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX0RPV05TVFJFQU07CisgICAgICAgIHRoaXMtPmNvbmZpZ3VyYXRpb24udHlwZSA9IEJDTU9MVF9HRU1fUE9SVF9UWVBFX1VOSUNBU1Q7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X3N0YXRlID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ET1dOU1RSRUFNX0VOQ1JZUFRJT05fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSA9IEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9EQVRBOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX2Zsb3cgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgICAgICB0aGlzLT5kZWJ1Z19mbG93X2NvbmZpZy51bnRhZ2dlZF92aWQgPSAoYmNtb2x0X3ZsYW5faWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9NQUNfVEFCTEVfRU5UUllfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWFjX3RhYmxlX2VudHJ5X2xpbWl0ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+Y29uZmlndXJhdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3BhY2sodGhpcy0+Z2VtX3BvcnRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uX3BhY2sodGhpcy0+dXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnX3BhY2soJnRoaXMtPmRlYnVnX2Zsb3dfY29uZmlnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX01BQ19UQUJMRV9FTlRSWV9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWFjX3RhYmxlX2VudHJ5X2xpbWl0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5jb25maWd1cmF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3VucGFjaygmdGhpcy0+Z2VtX3BvcnRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uX3VucGFjaygmdGhpcy0+dXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnX3VucGFjaygmdGhpcy0+ZGVidWdfZmxvd19jb25maWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9NQUNfVEFCTEVfRU5UUllfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1hY190YWJsZV9lbnRyeV9saW1pdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ET1dOU1RSRUFNX0VOQ1JZUFRJT05fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjaygmdGhpcy0+Y29uZmlndXJhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDEyNykKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5nZW1fcG9ydF9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX1BST0NFU1NJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ET1dOU1RSRUFNX0VOQ1JZUFRJT05fTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+dXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX0RBVEE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfREVCVUdfRkxPV19DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmRlYnVnX2Zsb3dfY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9NQUNfVEFCTEVfRU5UUllfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm1hY190YWJsZV9lbnRyeV9saW1pdCA+IDEyOCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX01BQ19UQUJMRV9FTlRSWV9MSU1JVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2J5dGVzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jZmcudHJpZ2dlci50eXBlID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORTsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IDA7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3BhY2soJnRoaXMtPmNmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y2ZnKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ191bnBhY2soJnRoaXMtPmNmZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmNmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X3N0YXRlID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3BhY2sodGhpcy0+bmV3X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGVfdW5wYWNrKCZ0aGlzLT5uZXdfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5uZXdfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRlID0gQkNNT0xUX0dFTV9QT1JUX09QRVJBVElPTl9BQ1RJVkFURTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbl91bnBhY2soJnRoaXMtPnN0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HRU1fUE9SVF9PUEVSQVRJT05fQUNUSVZBVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HRU1fUE9SVF9PUEVSQVRJT05fREVBQ1RJVkFURToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU0VUX1NUQVRFX0lEX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wb25fbmkgPiAoYmNtb2x0X2dwb25fbmkpIDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pd2ZfbW9kZSA9IEJDTU9MVF9JV0ZfTU9ERV9ESVJFQ1RfTUFQUElOR19NT0RFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX1RQSURfUEVSX0ZMT1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dXNfdHBpZF9wZXJfZmxvdy5hcnJbMF0gPSAzMzAyNFU7CisgICAgICAgIHRoaXMtPnVzX3RwaWRfcGVyX2Zsb3cuYXJyWzFdID0gMzMwMjRVOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dXNfb3RhZ19kaXJlY3RfdHBpZCA9IDMzMDI0VTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9QQklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVzX290YWdfZGlyZWN0X3BiaXQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHNfdHBpZC5hcnJbMF0gPSAzMzAyNFU7CisgICAgICAgIHRoaXMtPmRzX3RwaWQuYXJyWzFdID0gMzQ5ODRVOworICAgICAgICB0aGlzLT5kc190cGlkLmFyclsyXSA9IDM3MTIwVTsKKyAgICAgICAgdGhpcy0+ZHNfdHBpZC5hcnJbM10gPSAzNzM3NlU7CisgICAgICAgIHRoaXMtPmRzX3RwaWQuYXJyWzRdID0gMzMwMjRVOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1hY190YWJsZV9jb25maWd1cmF0aW9uLm1pc3NfZmFsbGJhY2sgPSBCQ01PTFRfTUFDX1RBQkxFX01JU1NfRkFMTEJBQ0tfRFJPUDsKKyAgICAgICAgdGhpcy0+bWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uZGVmYXVsdF9mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSAwOworICAgICAgICB0aGlzLT5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hZ2luZ190aW1lID0gMzA7CisgICAgICAgIHRoaXMtPm1hY190YWJsZV9jb25maWd1cmF0aW9uLmxlYXJuaW5nX21vZGUgPSBCQ01PTFRfTUFDX1RBQkxFX0xFQVJOSU5HX01PREVfTk9STUFMOworICAgICAgICB0aGlzLT5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICAgICAgdGhpcy0+bWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19hZ2luZyA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbW92ZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19zdGF0aWNfbW9kZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24ubGVhcm5fdW50YWdnZWRfZmxvd192aWRzID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1hY190YWJsZV9jb3VudCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Zm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQgPSAxMjg7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaXdmX21vZGVfcGFjayh0aGlzLT5pd2ZfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfaGV4X3BhY2soJnRoaXMtPnVzX3RwaWRfcGVyX2Zsb3csIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVzX290YWdfZGlyZWN0X3RwaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9QQklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnVzX290YWdfZGlyZWN0X3BiaXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MTZfNV9oZXhfcGFjaygmdGhpcy0+ZHNfdHBpZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+bWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZ19wYWNrKCZ0aGlzLT5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWFjX3RhYmxlX2NvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19UUElEX1BFUl9GTE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0ZPUkJJRERFTl9WTEFOX0ZMT1dfR0VNX1JBTkdFX1NUQVJUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9pd2ZfbW9kZV91bnBhY2soJnRoaXMtPml3Zl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19UUElEX1BFUl9GTE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MTZfMl9oZXhfdW5wYWNrKCZ0aGlzLT51c190cGlkX3Blcl9mbG93LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnVzX290YWdfZGlyZWN0X3RwaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9QQklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnVzX290YWdfZGlyZWN0X3BiaXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MTZfNV9oZXhfdW5wYWNrKCZ0aGlzLT5kc190cGlkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+bWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfREVCVUdfRkxPV19DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnX3VucGFjaygmdGhpcy0+ZGVidWdfZmxvd19jb25maWd1cmF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bWFjX3RhYmxlX2NvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRFNfVFBJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09VTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5pd2ZfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSVdGX01PREVfRElSRUNUX01BUFBJTkdfTU9ERToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lXRl9NT0RFX1BFUl9GTE9XX01PREU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfaGV4X2JvdW5kc19jaGVjaygmdGhpcy0+dXNfdHBpZF9wZXJfZmxvdykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnVzX290YWdfZGlyZWN0X3BiaXQgPiA3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MTZfNV9oZXhfYm91bmRzX2NoZWNrKCZ0aGlzLT5kc190cGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5tYWNfdGFibGVfY29uZmlndXJhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPTkZJR1VSQVRJT047CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19ISVRfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHNfaGl0X2V2ZW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kc19taXNzX2V2ZW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kc19kcm9wX2R1ZV90b19taXNzX2V2ZW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfVE9fRElTQUJMRURfR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19tYWNfZGlzY292ZXJlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bW92ZV9ldmVudCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRFJPUF9EVUVfVE9fRklGT19GVUxMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19ISVRfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRzX2hpdF9ldmVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19NSVNTX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kc19taXNzX2V2ZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX01JU1NfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kc19kcm9wX2R1ZV90b19oaXRfZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bmV3X21hY19kaXNjb3ZlcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm1vdmVfZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfSElUX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX01JU1NfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19ISVRfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZHNfaGl0X2V2ZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX01JU1NfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRzX21pc3NfZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19ISVRfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZHNfZHJvcF90b19kaXNhYmxlZF9nZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5uZXdfbWFjX2Rpc2NvdmVyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTU9WRV9FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bW92ZV9ldmVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9NT1ZFX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5tYWNfYWRkcmVzcyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfRU5UUklFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbnRyaWVzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmVudHJpZXMudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX0VOVFJJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfcGFjaygmdGhpcy0+ZW50cmllcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9FTlRSSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZW50cmllcyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX0VOVFJJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfdW5wYWNrKCZ0aGlzLT5lbnRyaWVzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX0VOVFJJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX0VOVFJJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfYm91bmRzX2NoZWNrKCZ0aGlzLT5lbnRyaWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9FTlRSSUVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9NT1ZFX0VWRU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19ISVRfRVZFTlQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19ISVRfRVZFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX01JU1NfRVZFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX01JU1NfRVZFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX0hJVF9FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTU9WRV9FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zY2FuX21hY190YWJsZV9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Zmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c2Nhbl9tYWNfdGFibGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNvbnRyb2wgPSBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9BTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfVklEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnZpZCA9IChiY21vbHRfdmxhbl9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfVklEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnZpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Zmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9WSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb25fdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9WSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT52aWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+Zmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfVklEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmNvbnRyb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0ZMVVNIX01BQ19UQUJMRV9PUFRJT05fQUxMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9QRVJfVklEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9QRVJfRkxPVzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0ZMVVNIX01BQ19UQUJMRV9PUFRJT05fVklEX1BMVVNfRkxPVzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9DT05UUk9MOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX1ZJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dmlkID4gKGJjbW9sdF92bGFuX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX1ZJRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmZsb3dfaWQgPiAoYmNtb2x0X2Zsb3dfaWQpIDQwOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfRkxPV19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5tYWNfYWRkcmVzcyk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Zmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfZ3Bvbl9uaSkgMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Zmxvd19pZCA+IChiY21vbHRfZmxvd19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9GTE9XX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX0dFTV9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0ID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9QQklUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGJpdF9jb250cm9sID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfR0VNX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX3BvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9QQklUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wYml0X2NvbnRyb2wpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX1BCSVRfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfR0VNX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX1BCSVRfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBiaXRfY29udHJvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX0dFTV9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX1BCSVRfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Z2VtX3BvcnQgPiAoYmNtb2x0X2dwb25fZ2VtX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX0dFTV9QT1JUOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT52bGFuX2lkID0gKGJjbW9sdF92bGFuX2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT52bGFuX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT52bGFuX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9WTEFOX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9ncG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnZsYW5faWQgPiAoYmNtb2x0X3ZsYW5faWQpIDQwOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19NRVRIT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWFwcGluZ19tZXRob2QgPSBCQ01PTFRfVkxBTl9UT19GTE9XX01BUFBJTkdfTUVUSE9EX1ZJRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWFwcGluZ190YWcgPSBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX09VVEVSX1ZJRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dmxhbl9hY3Rpb24gPSBCQ01PTFRfRFNfVkxBTl9BQ1RJT05fUkVNT1ZFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfTUVUSE9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZF9wYWNrKHRoaXMtPm1hcHBpbmdfbWV0aG9kLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kX3BhY2sodGhpcy0+bWFwcGluZ190YWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kc192bGFuX2FjdGlvbl9wYWNrKHRoaXMtPnZsYW5fYWN0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX1RBRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19NRVRIT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3VucGFjaygmdGhpcy0+bWFwcGluZ19tZXRob2QsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX1RBRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2RfdW5wYWNrKCZ0aGlzLT5tYXBwaW5nX3RhZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RzX3ZsYW5fYWN0aW9uX3VucGFjaygmdGhpcy0+dmxhbl9hY3Rpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19NRVRIT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfVEFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19NRVRIT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5tYXBwaW5nX21ldGhvZCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVkxBTl9UT19GTE9XX01BUFBJTkdfTUVUSE9EX1ZJRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1ZMQU5fVE9fRkxPV19NQVBQSU5HX01FVEhPRF9NQUNQTFVTVklEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5tYXBwaW5nX3RhZykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX09VVEVSX1ZJRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX01BUFBJTkdfVEFHX01FVEhPRF9JTk5FUl9WSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfVEFHOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnZsYW5fYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EU19WTEFOX0FDVElPTl9SRU1PVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EU19WTEFOX0FDVElPTl9UUkFOU1BBUkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfVkxBTl9BQ1RJT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+bWFjX2FkZHJlc3MpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnZsYW4gPSAoYmNtb2x0X3ZsYW5faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnZsYW4pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfVkxBTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPnZsYW4pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9ncG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Zmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5mbG93X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmdlbV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+Zmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmdlbV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Zmxvd19pZCA+IChiY21vbHRfZmxvd19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfRkxPV19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Z2VtX3BvcnRfaWQgPiAoYmNtb2x0X2dwb25fZ2VtX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9HRU1fUE9SVF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDEyNykKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Zmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfRFJPUFBFRF9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfRFJPUFBFRF9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfRFJPUFBFRF9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+Zmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRURfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Zmxvd19pZCA+IChiY21vbHRfZmxvd19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfRFJPUFBFRF9JRF9GTE9XX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9sZF9mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm9sZF9mbG93X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfTkVXX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+bmV3X2Zsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9PTERfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9PTERfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9sZF9mbG93X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfTkVXX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5uZXdfZmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5vbGRfZmxvd19pZCA+IChiY21vbHRfZmxvd19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9PTERfRkxPV19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5uZXdfZmxvd19pZCA+IChiY21vbHRfZmxvd19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9ORVdfRkxPV19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQ19JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5mbG93X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9ORVdfTUFDX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmZsb3dfaWQgPiAoYmNtb2x0X2Zsb3dfaWQpIDQwOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQ19JRF9GTE9XX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19BR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1hY19hZ2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWFjX2Ryb3BwZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfTU9WRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tYWNfbW92ZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX05FV19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X21hYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19BR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bWFjX2FnZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1hY19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX01PVkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tYWNfbW92ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX05FV19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5uZXdfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0FHRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19NT1ZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTkVXX01BQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0FHRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5tYWNfYWdlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bWFjX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfTU9WRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1hY19tb3ZlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTkVXX01BQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm5ld19tYWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfQUdFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfTU9WRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9ORVdfTUFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV91bnBhY2soYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9ncG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmdlbV9wb3J0X2lkID4gKGJjbW9sdF9ncG9uX2dlbV9pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX0dFTV9QT1JUX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Zmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX01BQ19MRUFSTklORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tYWNfbGVhcm5pbmcgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnZsYW5fYWN0aW9uID0gQkNNT0xUX1VTX1ZMQU5fQUNUSU9OX0FERDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fVEFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnZsYW5fdGFnLnZsYW5faWQgPSAoYmNtb2x0X3ZsYW5faWQpIDA7CisgICAgICAgIHRoaXMtPnZsYW5fdGFnLnBiaXQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50cGlkX2luZGV4ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX01BQ19MRUFSTklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1hY19sZWFybmluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXNfdmxhbl9hY3Rpb25fcGFjayh0aGlzLT52bGFuX2FjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF92bGFuX3RhZ19wYWNrKCZ0aGlzLT52bGFuX3RhZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9UUElEX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnRwaWRfaW5kZXgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9NQUNfTEVBUk5JTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX01BQ19MRUFSTklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1hY19sZWFybmluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXNfdmxhbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT52bGFuX2FjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF92bGFuX3RhZ191bnBhY2soJnRoaXMtPnZsYW5fdGFnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50cGlkX2luZGV4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9NQUNfTEVBUk5JTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fVEFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmZsb3dfaWQgPiAoYmNtb2x0X2Zsb3dfaWQpIDQwOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnZsYW5fYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VU19WTEFOX0FDVElPTl9BREQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VU19WTEFOX0FDVElPTl9UUkFOU1BBUkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9UQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdmxhbl90YWdfYm91bmRzX2NoZWNrKCZ0aGlzLT52bGFuX3RhZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHBpZF9pbmRleCA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9UUElEX0lOREVYOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX2tleV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2tleV91bnBhY2soYmNtb2x0X2dwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfZ3Bvbl9uaSkgMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fc3RhdHVzLnN0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICAgICAgdGhpcy0+cG9uX3N0YXR1cy5sb3Nfc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF2YWlsYWJsZV9iYW5kd2lkdGguY2JyX2J3ID0gMDsKKyAgICAgICAgdGhpcy0+YXZhaWxhYmxlX2JhbmR3aWR0aC50b3RhbF9idyA9IDA7CisgICAgICAgIHRoaXMtPmF2YWlsYWJsZV9iYW5kd2lkdGgubmV4dF9vbnVfdG90YWxfYncgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9hY3RpdmVfb251cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX1NUQU5EQllfT05VUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5udW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcmJzX3N0YXR1cy5sb2NrX3N0YXRlID0gQkNNT0xUX1BSQlNfTE9DS19TVEFURV9VTkxPQ0tFRDsKKyAgICAgICAgdGhpcy0+cHJic19zdGF0dXMuZXJyb3JfY291bnRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSA9IDIwOworICAgICAgICB0aGlzLT5wb25fZGlzdGFuY2UubWF4X2RpZmZfcmVhY2ggPSAyMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ193aW5kb3dfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVxZF9jeWNsZXNfbnVtYmVyID0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX2xldmVsLnBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSA9IDEyMDsKKyAgICAgICAgdGhpcy0+cG93ZXJfbGV2ZWwubW9kZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kc19mZWNfbW9kZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHJpZnRfY29udHJvbC5kcmlmdF9pbnRlcnZhbCA9IDEwMDA7CisgICAgICAgIHRoaXMtPmRyaWZ0X2NvbnRyb2wuZHJpZnRfbGltaXQgPSA0OworICAgICAgICB0aGlzLT5kcmlmdF9jb250cm9sLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0ID0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCA9IChiY21vbHRfYmVyX2ludGVydmFsKSA1MDAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb3NfYWxhcm1fdGhyZXNob2xkID0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxvc19pbml0aWFsX3ZhbHVlID0gQkNNT0xUX1NUQVRVU19PTjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSA9IDQ7CisgICAgICAgIHRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2ZpID0gNDsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtc190aHJlc2hvbGRzLmxvYW1pID0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJlcl9tb25pdG9yLnVzX2Jlcl9pbnRlcnZhbCA9IDUwMDA7CisgICAgICAgIHRoaXMtPmJlcl9tb25pdG9yLnNmX3RocmVzaG9sZCA9IDM7CisgICAgICAgIHRoaXMtPmJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCA9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QTE9BTV9BQ0tfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wbG9hbV9hY2tfdGltZW91dCA9IDIwMDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfYWN0aXZhdGlvbi5rZXlfZXhjaGFuZ2UgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgICAgICB0aGlzLT5vbnVfYWN0aXZhdGlvbi5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKKyAgICAgICAgdGhpcy0+b251X2FjdGl2YXRpb24uZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNuX2FjcXVpc2l0aW9uLmludGVydmFsID0gMTAwMDsKKyAgICAgICAgdGhpcy0+c25fYWNxdWlzaXRpb24uY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPnNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlLmludGVydmFsID0gMTAwMDA7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZS5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlLm1vZGUgPSBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfTk9STUFMOworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0ID0gMTAwOworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZy5ncGlvX3BpbiA9IEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nLm9wdGlvbnMgPSAoYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzcgPSA2NDsKKyAgICAgICAgdGhpcy0+Y2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8zID0gMjU2OworICAgICAgICB0aGlzLT5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEgPSA1MTI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnJbMF0gPSA0MDk2OworICAgICAgICB0aGlzLT5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnJbMV0gPSA4MTkyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREJBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRiYS5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSA9IDQ4OworICAgICAgICB0aGlzLT5kYmEuZGJhX21vZGUgPSBCQ01PTFRfREJBX01PREVfTk9STUFMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50Lmlsb3dwb3dlciA9IDE2MDA7CisgICAgICAgIHRoaXMtPnBvd2VyX21hbmFnZW1lbnQuaWF3YXJlID0gMTYwOworICAgICAgICB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQgPSA4MDsKKyAgICAgICAgdGhpcy0+cG93ZXJfbWFuYWdlbWVudC5pdHhpbml0ID0gNDA7CisgICAgICAgIHRoaXMtPnBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmID0gMTYwMDsKKyAgICAgICAgdGhpcy0+cG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkgPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICAgICAgdGhpcy0+cm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUgPSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VBUkxZX1JPR1VFX0RFVEVDVElPTjsKKyAgICAgICAgdGhpcy0+cm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c7CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmludGVydmFsID0gMTAwMDA7CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLnNlY29uZF9yYW5naW5nX3dpbmRvdyA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4gPSBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX0FMTDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5pbnRlcnZhbCA9IDUwMDA7CisgICAgICAgIHRoaXMtPnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLnBvbHlub20gPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNzsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLm1vZGUgPSBCQ01PTFRfUFJCU19DSEVDS0VSX01PREVfU0VMRl9TWU5DOworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IuaW52ZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWluX2RhdGFfYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIDI1NjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyA9IEJDTU9TX1RSVUU7CisgICAgICAgIHRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMgPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpID0gQkNNT1NfVFJVRTsKKyAgICAgICAgdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uYWNrX3RpbWVvdXQgPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5zZmkgPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpID0gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51c19iYW5kd2lkdGhfbGltaXQgPSAxNTU1MjAwMDBVTDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbF9vbnVzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmFsbF9vbnVzLnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbF9tY2FzdF9nZW1fcG9ydHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVidWcubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251ID0gNjQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSAxMDAwOworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMubWF4X3JldHJ5X2NvdW50ID0gMjM7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy5vbWNpX2Zvcm1hdCA9IEJDTU9MVF9PTUNJX0RFVklDRV9JRF9FWFRFTkRFRDsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplID0gMzI7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy5hY3RpdmF0ZV9jb21taXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLmRlbGF5X2Zvcl9jb21taXRfbXMgPSA0MDAwMFVMOworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgPSAyMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCA9IDEwMDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmlwMzJfaW5kaWNhdGlvbl9jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX3N0YXR1c19wYWNrKCZ0aGlzLT5wb25fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfcGFjaygmdGhpcy0+YXZhaWxhYmxlX2JhbmR3aWR0aCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm51bWJlcl9vZl9hY3RpdmVfb251cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9TVEFOREJZX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c19wYWNrKCZ0aGlzLT5wcmJzX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2Rpc3RhbmNlX3BhY2soJnRoaXMtPnBvbl9kaXN0YW5jZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9SQU5HSU5HX1dJTkRPV19TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yYW5naW5nX3dpbmRvd19zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmVxZF9jeWNsZXNfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcG93ZXJfbGV2ZWxfcGFjaygmdGhpcy0+cG93ZXJfbGV2ZWwsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPmRzX2ZlY19tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfcGFjaygmdGhpcy0+ZHJpZnRfY29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bG9zX2FsYXJtX3RocmVzaG9sZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9zX2luaXRpYWxfdmFsdWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3BhY2soJnRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfcGFjaygmdGhpcy0+YmVyX21vbml0b3IsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBsb2FtX2Fja190aW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uX3BhY2soJnRoaXMtPm9udV9hY3RpdmF0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fcGFjaygmdGhpcy0+c25fYWNxdWlzaXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX3BhY2soJnRoaXMtPmtleV9leGNoYW5nZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcGFjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX3BhY2soJnRoaXMtPmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3UxNl8yX3BhY2soJnRoaXMtPmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RCQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fZGJhX3BhY2soJnRoaXMtPmRiYSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+cG93ZXJfbWFuYWdlbWVudCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9ST0dVRV9PTlVfREVURUNUSU9OX1BST0NFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX3BhY2soJnRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcGFjaygmdGhpcy0+cGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19wYWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm1pbl9kYXRhX2FsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl9wYWNrKCZ0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnVzX2JhbmR3aWR0aF9saW1pdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3BhY2soJnRoaXMtPmFsbF9vbnVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9NQ0FTVF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfcGFjaygmdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9ERUJVRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX25pX2RlYnVnX3BhY2soJnRoaXMtPmRlYnVnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc19wYWNrKCZ0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFNfQ19XQUlUX0JFRk9SRV9ERUFDVElWQVRJT05fVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQklQMzJfSU5ESUNBVElPTl9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5iaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfU1RBTkRCWV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9SQU5HSU5HX1dJTkRPV19TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QTE9BTV9BQ0tfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREJBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YWxsX29udXMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9tY2FzdF9nZW1fcG9ydHMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JJUDMyX0lORElDQVRJT05fQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fc3RhdHVzX3VucGFjaygmdGhpcy0+cG9uX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfdW5wYWNrKCZ0aGlzLT5hdmFpbGFibGVfYmFuZHdpZHRoLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5udW1iZXJfb2ZfYWN0aXZlX29udXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfU1RBTkRCWV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5udW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19zdGF0dXNfdW5wYWNrKCZ0aGlzLT5wcmJzX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fZGlzdGFuY2VfdW5wYWNrKCZ0aGlzLT5wb25fZGlzdGFuY2UsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9SQU5HSU5HX1dJTkRPV19TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yYW5naW5nX3dpbmRvd19zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmVxZF9jeWNsZXNfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcG93ZXJfbGV2ZWxfdW5wYWNrKCZ0aGlzLT5wb3dlcl9sZXZlbCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5kc19mZWNfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX3VucGFjaygmdGhpcy0+ZHJpZnRfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxvc19hbGFybV90aHJlc2hvbGQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvc19pbml0aWFsX3ZhbHVlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc191bnBhY2soJnRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc191bnBhY2soJnRoaXMtPmJlcl9tb25pdG9yLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBsb2FtX2Fja190aW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uX3VucGFjaygmdGhpcy0+b251X2FjdGl2YXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX3VucGFjaygmdGhpcy0+c25fYWNxdWlzaXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2VfdW5wYWNrKCZ0aGlzLT5rZXlfZXhjaGFuZ2UsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdW5wYWNrKCZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV91bnBhY2soJnRoaXMtPmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfdW5wYWNrKCZ0aGlzLT5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RCQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fZGJhX3VucGFjaygmdGhpcy0+ZGJhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+cG93ZXJfbWFuYWdlbWVudCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfdW5wYWNrKCZ0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfdW5wYWNrKCZ0aGlzLT5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfdW5wYWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfdW5wYWNrKCZ0aGlzLT5wcmJzX2dlbmVyYXRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+bWluX2RhdGFfYWxsb2NfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uX3VucGFjaygmdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnVzX2JhbmR3aWR0aF9saW1pdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3VucGFjaygmdGhpcy0+YWxsX29udXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3VucGFjaygmdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fbmlfZGVidWdfdW5wYWNrKCZ0aGlzLT5kZWJ1ZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc191bnBhY2soJnRoaXMtPm9udV91cGdyYWRlX3BhcmFtcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JJUDMyX0lORElDQVRJT05fQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+YmlwMzJfaW5kaWNhdGlvbl9jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9TVEFOREJZX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EQkEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3Nfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5wb25fc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfYm91bmRzX2NoZWNrKCZ0aGlzLT5hdmFpbGFibGVfYmFuZHdpZHRoKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEg7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfc3RhdHVzX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fZGlzdGFuY2VfYm91bmRzX2NoZWNrKCZ0aGlzLT5wb25fZGlzdGFuY2UpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSA+IDE2Nzc2OTYwVUwpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5lcWRfY3ljbGVzX251bWJlciA+IDI1NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcG93ZXJfbGV2ZWxfYm91bmRzX2NoZWNrKCZ0aGlzLT5wb3dlcl9sZXZlbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kc19mZWNfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfYm91bmRzX2NoZWNrKCZ0aGlzLT5kcmlmdF9jb250cm9sKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0w7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwgPiAoYmNtb2x0X2Jlcl9pbnRlcnZhbCkgNTM2ODcwOTExVUwpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxvc19pbml0aWFsX3ZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzX2JvdW5kc19jaGVjaygmdGhpcy0+b251X2FsYXJtc190aHJlc2hvbGRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX2JvdW5kc19jaGVjaygmdGhpcy0+YmVyX21vbml0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1I7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5vbnVfYWN0aXZhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPnNuX2FjcXVpc2l0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2VfYm91bmRzX2NoZWNrKCZ0aGlzLT5rZXlfZXhjaGFuZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX2JvdW5kc19jaGVjaygmdGhpcy0+Y2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREJBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9kYmFfYm91bmRzX2NoZWNrKCZ0aGlzLT5kYmEpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREJBOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5wb3dlcl9tYW5hZ2VtZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfYm91bmRzX2NoZWNrKCZ0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19jaGVja2VyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19nZW5lcmF0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1I7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5taW5fZGF0YV9hbGxvY19pZCA8IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgMjU2KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+bWluX2RhdGFfYWxsb2NfaWQgPiAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIDMyMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT51c19iYW5kd2lkdGhfbGltaXQgPCA4MDAwMDBVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT51c19iYW5kd2lkdGhfbGltaXQgPiAxNTU1MjAwMDBVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbF9vbnVzLmxlbiA+IDEyOCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2JvdW5kc19jaGVjaygmdGhpcy0+YWxsX29udXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9NQ0FTVF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbF9tY2FzdF9nZW1fcG9ydHMubGVuID4gMTI4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9ib3VuZHNfY2hlY2soJnRoaXMtPmFsbF9tY2FzdF9nZW1fcG9ydHMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9uaV9kZWJ1Z19ib3VuZHNfY2hlY2soJnRoaXMtPmRlYnVnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5iaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQklQMzJfSU5ESUNBVElPTl9DT05UUk9MOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb2Rld29yZHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iaXA4X2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iaXA4X2Vycm9ycyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZ2VtX3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2dlbV9kcm9wcGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9nZW1faWRsZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9nZW1fY29ycmVjdGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSUxMRUdBTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9nZW1faWxsZWdhbCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYWxsb2NhdGlvbnNfdmFsaWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYWxsb2NhdGlvbnNfaW52YWxpZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfbm9uX2lkbGUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3Bsb2Ftc19kcm9wcGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfY3B1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X29tY2kgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZHJvcHBlZF90b29fc2hvcnQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZHJvcHBlZF90b29fbG9uZyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9jcmNfZXJyb3JzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2tleV9lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UU19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhZ21lbnRzX2Vycm9ycyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3BhY2tldHNfZHJvcHBlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2dlbSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3Bsb2FtcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNX0ZSQUdNRU5UUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9nZW1fZnJhZ21lbnRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfY3B1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X29tY2kgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZHJvcHBlZF90cGlkX21pc3MgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZHJvcHBlZF92aWRfbWlzcyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2NvZGV3b3JkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5iaXA4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJpcDhfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2dlbV9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2dlbV9kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2dlbV9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZ2VtX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9nZW1faWxsZWdhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9hbGxvY2F0aW9uc192YWxpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2FsbG9jYXRpb25zX2ludmFsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX25vbl9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9wbG9hbXNfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2NwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZHJvcHBlZF90b29fbG9uZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2NyY19lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9rZXlfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhZ21lbnRzX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGFja2V0c19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9nZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2dlbV9mcmFnbWVudHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2NwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9kcm9wcGVkX3RwaWRfbWlzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2Ryb3BwZWRfdmlkX21pc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSUxMRUdBTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2NvZGV3b3JkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5iaXA4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJpcDhfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2dlbV9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2dlbV9kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2dlbV9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZ2VtX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9nZW1faWxsZWdhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9hbGxvY2F0aW9uc192YWxpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2FsbG9jYXRpb25zX2ludmFsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGxvYW1zX25vbl9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wbG9hbXNfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGxvYW1zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2NwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZHJvcHBlZF90b29fbG9uZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2NyY19lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9rZXlfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhZ21lbnRzX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGFja2V0c19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9nZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2dlbV9mcmFnbWVudHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2NwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9kcm9wcGVkX3RwaWRfbWlzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2Ryb3BwZWRfdmlkX21pc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1BVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVFNfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVycm9yID0gQkNNT0xUX1BBQ0tFVF9JTkpFQ1RJT05fRVJST1JfR0VNX1BPUlRfTk9UX0FDVElWRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl9wYWNrKHRoaXMtPmVycm9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3JfdW5wYWNrKCZ0aGlzLT5lcnJvciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZXJyb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBQ0tFVF9JTkpFQ1RJT05fRVJST1JfR0VNX1BPUlRfTk9UX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Z2VtX3BvcnRfaWQgPiAoYmNtb2x0X2dwb25fZ2VtX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfTE9TX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfTE9TX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2xvc19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9MT1NfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCwgMCwgc2l6ZW9mKHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkKSk7CisgICAgICAgIG1lbXNldCh0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYywgMCwgc2l6ZW9mKHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5naW5nX3RpbWUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmFuZ2luZ190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl91bnBhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmFuZ2luZ190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnNlcmlhbF9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9ncG9uX29udV9pZCkgMTI3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcy5sZW4gPSAwOworICAgICAgICB0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcy52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9wYWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+bGlzdF9vZl9mYWlsZWRfZW50aXRpZXMpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3VucGFjaygmdGhpcy0+bGlzdF9vZl9mYWlsZWRfZW50aXRpZXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251cy5sZW4gPSAwOworICAgICAgICB0aGlzLT5vbnVzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfcGFjaygmdGhpcy0+b251cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5vbnVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyX3VucGFjaygmdGhpcy0+b251cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5vbnVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzdWx0ID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzdWx0ID0gQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVUNDRVNTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHRfcGFjayh0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdF91bnBhY2soJnRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfRkFJTFVSRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVVNQRUNURURfTE9TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPndpbmRvd190eXBlID0gQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfU0lMRU5UX1dJTkRPVzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9NRUFTVVJFTUVOVF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWVhc3VyZW1lbnRfc3RhdHVzID0gQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9SU1NJX0NPTVBMRVRFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbG9jX2lkID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmlzX2RlbGluZWF0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+aXNfZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2RhdGEubGVuID0gMDsKKyAgICAgICAgdGhpcy0+cnhfZGF0YS52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wbG9hbV9yZWNlaXZlZF9vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3IgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3BhY2sodGhpcy0+d2luZG93X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHRfcGFjayh0aGlzLT5tZWFzdXJlbWVudF9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfZGVsaW5lYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19FRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmlzX2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9wYWNrKCZ0aGlzLT5yeF9kYXRhLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+cGxvYW1fcmVjZWl2ZWRfb251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cGxvYW1fcmVjZWl2ZWRfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9NRUFTVVJFTUVOVF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+cnhfZGF0YSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3VucGFjaygmdGhpcy0+d2luZG93X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5tZWFzdXJlbWVudF9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+YWxsb2NfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmlzX2RlbGluZWF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pc19lZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5yeF9kYXRhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPnBsb2FtX3JlY2VpdmVkX29udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBsb2FtX3JlY2VpdmVkX2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfREVMSU5FQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPndpbmRvd190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0NVVF9PRkZfV0lORE9XOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm1lYXN1cmVtZW50X3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfTk9UX1BFUkZPUk1FRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9ST0dVRV9DWUNMRV9TVE9QOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9OT1RfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxvY19pZCA+IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9ncG9uX29udV9pZCkgMTI3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5yeF9kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wbG9hbV9yZWNlaXZlZF9vbnVfaWQgPiAoYmNtb2x0X2dwb25fb251X2lkKSAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9ERVRFQ1RFRF9ERUxJTUlURVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVuZXJneV9kZXRlY3Rfc2lnbmFsID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5lbmVyZ3lfZGV0ZWN0X3NpZ25hbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5lbmVyZ3lfZGV0ZWN0X3NpZ25hbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5lbmVyZ3lfZGV0ZWN0X3NpZ25hbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fbmlfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0VSUk9SUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1BVOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVFNfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfUExPQU1TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9QQUNLRVRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lMTEVHQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UU19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNX0ZSQUdNRU5UUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfT01DSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzdWx0ID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByZXZpb3VzX3N0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X3N0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9QUkVWSU9VU19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fc3RhdGVfcGFjayh0aGlzLT5wcmV2aW91c19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV91bnBhY2soJnRoaXMtPnByZXZpb3VzX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX3N0YXRlX3VucGFjaygmdGhpcy0+bmV3X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5wcmV2aW91c19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX1NUQVRFX1BST0NFU1NJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bmV3X3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfV09SS0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnRvZF9zdHJpbmcuc3RyLCAwLCA2NCk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2ZjID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ0Y19vZmZzZXRfc2VjID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ydGNfb2Zmc2V0X25zZWMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl82NF9wYWNrKCZ0aGlzLT50b2Rfc3RyaW5nLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c2ZjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnRjX29mZnNldF9zZWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cnRjX29mZnNldF9uc2VjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU0ZDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzY0X3VucGFjaygmdGhpcy0+dG9kX3N0cmluZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c2ZjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnRjX29mZnNldF9zZWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cnRjX29mZnNldF9uc2VjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzY0X2JvdW5kc19jaGVjaygmdGhpcy0+dG9kX3N0cmluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jcHVfcGFja2V0c19mYWlsdXJlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRpc2FibGVfYWxsX29udXNfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bG9zID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9kaXNjb3ZlcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX2NvbXBsZXRlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGVfY2hhbmdlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dG9kX3JlcXVlc3RfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jcHVfcGFja2V0c19mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5sb3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfZGlzY292ZXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9udV91cGdyYWRlX2NvbXBsZXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnRvZF9yZXF1ZXN0X2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfTE9TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNwdV9wYWNrZXRzX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5lbmFibGVfYWxsX29udXNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmxvcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9udV9kaXNjb3ZlcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X3VwZ3JhZGVfY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dG9kX3JlcXVlc3RfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfTE9TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb250cm9sID0gQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX1VOSUNBU1RfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbF91bnBhY2soJnRoaXMtPmNvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfVU5JQ0FTVF9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfVU5JQ0FTVF9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9CUk9BRENBU1RfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfQlJPQURDQVNUX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9ESVNBQkxFX0RJU0NPVkVSWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0w7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9zdGF0ZSA9IEJDTU9MVF9TV0lUQ0hfT1ZFUl9UWVBFX0NfT05VX1NUQVRFX0FDVElWRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2xpc3QubGVuID0gMDsKKyAgICAgICAgdGhpcy0+b251X2xpc3QudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV9wYWNrKHRoaXMtPm9udV9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfcGFjaygmdGhpcy0+b251X2xpc3QsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1Nl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+b251X2xpc3QpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGVfdW5wYWNrKCZ0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X3VucGFjaygmdGhpcy0+b251X2xpc3QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbnVfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NXSVRDSF9PVkVSX1RZUEVfQ19PTlVfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1dJVENIX09WRVJfVFlQRV9DX09OVV9TVEFURV9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2xpc3QubGVuID4gMjU2KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X2JvdW5kc19jaGVjaygmdGhpcy0+b251X2xpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT53aW5kb3dfdHlwZSA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNlY29uZF9yYW5naW5nX3dpbmRvdyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcGFjayh0aGlzLT53aW5kb3dfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+YWxsb2NfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2Vjb25kX3Jhbmdpbmdfd2luZG93KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd191bnBhY2soJnRoaXMtPndpbmRvd190eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c2Vjb25kX3Jhbmdpbmdfd2luZG93KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPndpbmRvd190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0NVVF9PRkZfV0lORE9XOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxvY19pZCA+IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9ncG9uX29udV9pZCkgMTI3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3N0YXRlID0gQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fcGFjayh0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbnVfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fc3RhdGUgPSBCQ01PTFRfUE9OX09QRVJBVElPTl9JTkFDVElWRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX29wZXJhdGlvbl9wYWNrKHRoaXMtPnBvbl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX29wZXJhdGlvbl91bnBhY2soJnRoaXMtPnBvbl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnBvbl9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX09QRVJBVElPTl9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1dPUktJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxpc3Rfb2Zfb251X2lkcy5sZW4gPSAwOworICAgICAgICB0aGlzLT5saXN0X29mX29udV9pZHMudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl9wYWNrKCZ0aGlzLT5saXN0X29mX29udV9pZHMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+bGlzdF9vZl9vbnVfaWRzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX3VucGFjaygmdGhpcy0+bGlzdF9vZl9vbnVfaWRzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl9ib3VuZHNfY2hlY2soJnRoaXMtPmxpc3Rfb2Zfb251X2lkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+cGxvYW0uYXJyLCAwLCBzaXplb2YodGhpcy0+cGxvYW0uYXJyKSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzEyX3BhY2soJnRoaXMtPnBsb2FtLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMl91bnBhY2soJnRoaXMtPnBsb2FtLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfMTJfYm91bmRzX2NoZWNrKCZ0aGlzLT5wbG9hbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfUExPQU07CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGFja2V0X3R5cGUgPSBCQ01PTFRfUEFDS0VUX1RZUEVfQ1BVOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYWxjX2NyYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X2xpc3QubGVuID0gMDsKKyAgICAgICAgdGhpcy0+Z2VtX3BvcnRfbGlzdC52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnVmZmVyLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmJ1ZmZlci52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BhY2tldF90eXBlX3BhY2sodGhpcy0+cGFja2V0X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNhbGNfY3JjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfcGFjaygmdGhpcy0+Z2VtX3BvcnRfbGlzdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5nZW1fcG9ydF9saXN0KTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BhY2tldF90eXBlX3VucGFjaygmdGhpcy0+cGFja2V0X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNhbGNfY3JjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfdW5wYWNrKCZ0aGlzLT5nZW1fcG9ydF9saXN0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnBhY2tldF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQUNLRVRfVFlQRV9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQUNLRVRfVFlQRV9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Z2VtX3BvcnRfbGlzdC5sZW4gPiAxNikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfYm91bmRzX2NoZWNrKCZ0aGlzLT5nZW1fcG9ydF9saXN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmJ1ZmZlci5sZW4gPiAyMDQ4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9ib3VuZHNfY2hlY2soJnRoaXMtPmJ1ZmZlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV91bnBhY2soYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfZ3Bvbl9uaSkgMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5vbnVfaWQgPiAoYmNtb2x0X2dwb25fb251X2lkKSAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfc3RhdGUgPSBCQ01PTFRfT05VX1NUQVRFX05PVF9DT05GSUdVUkVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+cGFzc3dvcmQuYXJyLCAwLCBzaXplb2YodGhpcy0+cGFzc3dvcmQuYXJyKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQVVUT19QQVNTV09SRF9MRUFSTklORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdXRvX3Bhc3N3b3JkX2xlYXJuaW5nID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVzX2ZlYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbWNpX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSA2NTUzNVU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsID0gKGJjbW9sdF9iZXJfaW50ZXJ2YWwpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUVTX0VOQ1JZUFRJT05fS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5hZXNfZW5jcnlwdGlvbl9rZXkuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5hZXNfZW5jcnlwdGlvbl9rZXkuYnl0ZXMpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5sb3NpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxvZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUubG9hbWkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUuZGdpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnRpd2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUuZG93aSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5zdWZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnNmaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5zZGkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUuZGZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxvYWkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUubG9raSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5naW5nX3RpbWUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYWN0aXZhdGlvbl9yZWFzb24gPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9OT05FOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsX2dlbV9wb3J0cy5sZW4gPSAwOworICAgICAgICB0aGlzLT5hbGxfZ2VtX3BvcnRzLnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxfYWxsb2NzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmFsbF9hbGxvY3MudmFsID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfUFNfVFlQRV9DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9wc190eXBlX2MgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lID0gMDsKKyAgICAgICAgdGhpcy0+ZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3N0YXRlX3BhY2sodGhpcy0+b251X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUEFTU1dPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzEwX3BhY2soJnRoaXMtPnBhc3N3b3JkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YXV0b19wYXNzd29yZF9sZWFybmluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1VTX0ZFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnVzX2ZlYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbWNpX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5hZXNfZW5jcnlwdGlvbl9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlX3BhY2soJnRoaXMtPmFsYXJtX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9SQU5HSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJhbmdpbmdfdGltZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbl9wYWNrKHRoaXMtPmRlYWN0aXZhdGlvbl9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfcGFjaygmdGhpcy0+YWxsX2dlbV9wb3J0cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3BhY2soJnRoaXMtPmFsbF9hbGxvY3MsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfcHNfdHlwZV9jKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lX3BhY2soJnRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT01DSV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FFU19FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9SQU5HSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9nZW1fcG9ydHMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9hbGxvY3MpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3N0YXRlX3VucGFjaygmdGhpcy0+b251X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfdW5wYWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMF91bnBhY2soJnRoaXMtPnBhc3N3b3JkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FVVE9fUEFTU1dPUkRfTEVBUk5JTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dXNfZmVjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT01DSV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b21jaV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPmFlc19lbmNyeXB0aW9uX2tleSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZV91bnBhY2soJnRoaXMtPmFsYXJtX3N0YXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmFuZ2luZ190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfREVBQ1RJVkFUSU9OX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uX3VucGFjaygmdGhpcy0+ZGVhY3RpdmF0aW9uX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl91bnBhY2soJnRoaXMtPmFsbF9nZW1fcG9ydHMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3VucGFjaygmdGhpcy0+YWxsX2FsbG9jcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfUFNfVFlQRV9DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X3BzX3R5cGVfYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV91bnBhY2soJnRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUEFTU1dPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FVVE9fUEFTU1dPUkRfTEVBUk5JTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FFU19FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfREVBQ1RJVkFUSU9OX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfQUxMT0NTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbnVfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9ET1pFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfV0FUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfVU5BV0FSRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX2JvdW5kc19jaGVjaygmdGhpcy0+c2VyaWFsX251bWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMF9ib3VuZHNfY2hlY2soJnRoaXMtPnBhc3N3b3JkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b21jaV9wb3J0X2lkID4gKGJjbW9sdF9ncG9uX2dlbV9pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTUNJX1BPUlRfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsID4gKGJjbW9sdF9iZXJfaW50ZXJ2YWwpIDUzNjg3MDkxMVVMKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUw7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9ib3VuZHNfY2hlY2soJnRoaXMtPmFlc19lbmNyeXB0aW9uX2tleSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUVTX0VOQ1JZUFRJT05fS0VZOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGFybV9zdGF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZGVhY3RpdmF0aW9uX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9ERUFDVElWQVRJT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0FDS19USU1FT1VUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9TRkk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1RJV0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9PTlVfQUxBUk06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0xPUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fTE9LSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fUkVSQU5HRV9GQUlMVVJFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+YWxsX2dlbV9wb3J0cy5sZW4gPiAyNTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X2JvdW5kc19jaGVjaygmdGhpcy0+YWxsX2dlbV9wb3J0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbF9hbGxvY3MubGVuID4gMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGxfYWxsb2NzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfQUxMT0NTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lX2JvdW5kc19jaGVjaygmdGhpcy0+ZXh0ZW5kZWRfZ3VhcmRfdGltZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb2Rld29yZHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQllURVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19ieXRlc19jb3JyZWN0ZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29kZXdvcmRzX2NvcnJlY3RlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmlwOF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJpcDhfZXJyb3JzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfY3JjX2Vycm9yID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3Bsb2Ftc19ub25faWRsZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvc2l0aXZlX2RyaWZ0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmVnYXRpdmVfZHJpZnQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X29tY2kgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CRVJfUkVQT1JURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmVyX3JlcG9ydGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVU5SRUNFSVZFRF9CVVJTVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51bnJlY2VpdmVkX2J1cnN0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGNkZ19lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SRElfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJkaV9lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcGFja2V0cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wYWNrZXRzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mZWNfY29kZXdvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19ieXRlc19jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2Rld29yZHNfY29ycmVjdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YmlwOF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YmlwOF9lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3Bsb2Ftc19ub25faWRsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cG9zaXRpdmVfZHJpZnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm5lZ2F0aXZlX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CRVJfUkVQT1JURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJlcl9yZXBvcnRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9VTlJFQ0VJVkVEX0JVUlNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51bnJlY2VpdmVkX2J1cnN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0xDREdfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5sY2RnX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SRElfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yZGlfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQllURVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQkVSX1JFUE9SVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUkRJX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19jb2Rld29yZHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0JZVEVTX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2J5dGVzX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5iaXA4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5iaXA4X2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wbG9hbXNfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGxvYW1zX25vbl9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5wb3NpdGl2ZV9kcmlmdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bmVnYXRpdmVfZHJpZnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfb21jaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JFUl9SRVBPUlRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+YmVyX3JlcG9ydGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVucmVjZWl2ZWRfYnVyc3QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmxjZGdfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JESV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJkaV9lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JFUl9SRVBPUlRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVU5SRUNFSVZFRF9CVVJTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JESV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmVyX2ludGVydmFsID0gKGJjbW9sdF9iZXJfaW50ZXJ2YWwpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc3VsdCA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+YmVyX2ludGVydmFsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfQkVSX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5iZXJfaW50ZXJ2YWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9SRVNVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2RmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9kZ2lfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRyaWZ0X3ZhbHVlID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfTkVXX0VRRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfZXFkID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3MzMihidWYsIHRoaXMtPmRyaWZ0X3ZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX05FV19FUUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm5ld19lcWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfTkVXX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3MzMihidWYsICZ0aGlzLT5kcmlmdF92YWx1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9ORVdfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5uZXdfZXFkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9ORVdfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2Rvd2lfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJpcDhfZXJyb3JzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0VSUl9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5iaXA4X2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0VSUl9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5iaXA4X2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9lcnJfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5uZXdfa2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+bmV3X2tleS5ieXRlcykpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5uZXdfa2V5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3VucGFjaygmdGhpcy0+bmV3X2tleSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5uZXdfa2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5uZXdfa2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+bmV3X2tleS5ieXRlcykpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEX0lEX05FV19LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5uZXdfa2V5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3VucGFjaygmdGhpcy0+bmV3X2tleSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5uZXdfa2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEX0lEX05FV19LRVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5leHBlY3RlZF9rZXkuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5leHBlY3RlZF9rZXkuYnl0ZXMpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWNlaXZlZF9rZXkuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWNlaXZlZF9rZXkuYnl0ZXMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5leHBlY3RlZF9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5yZWNlaXZlZF9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfdW5wYWNrKCZ0aGlzLT5leHBlY3RlZF9rZXksIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX1JFQ0VJVkVEX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3VucGFjaygmdGhpcy0+cmVjZWl2ZWRfa2V5LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5leHBlY3RlZF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5yZWNlaXZlZF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfRVhQRUNURURfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXhwZWN0ZWRfaW5kZXggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfQUNUVUFMX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFjdHVhbF9pbmRleCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfRVhQRUNURURfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmV4cGVjdGVkX2luZGV4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9BQ1RVQUxfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmFjdHVhbF9pbmRleCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX0VYUEVDVEVEX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9BQ1RVQUxfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX0VYUEVDVEVEX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5leHBlY3RlZF9pbmRleCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfQUNUVUFMX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hY3R1YWxfaW5kZXgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfRVhQRUNURURfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9BQ1RVQUxfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9MT0FJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9BSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9BSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9MT0FJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0xPQUlfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2xvYWlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9BSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfTE9BSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9MT0tJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9MT0tJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0xPS0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2xva2lfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX1BMT0FNX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+cGxvYW1fYnVmZmVyLmFyciwgMCwgc2l6ZW9mKHRoaXMtPnBsb2FtX2J1ZmZlci5hcnIpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTUVNSV9JRF9QTE9BTV9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzEzX3BhY2soJnRoaXMtPnBsb2FtX2J1ZmZlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX01FTUlfSURfUExPQU1fQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEzOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX01FTUlfSURfUExPQU1fQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xM191bnBhY2soJnRoaXMtPnBsb2FtX2J1ZmZlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX1BMT0FNX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX1BMT0FNX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfMTNfYm91bmRzX2NoZWNrKCZ0aGlzLT5wbG9hbV9idWZmZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfTUVNSV9JRF9QTE9BTV9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfR0VNX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z2VtX3BvcnQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfT1BFUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9wZXJhdGlvbiA9IEJDTU9MVF9PTUNJX1BPUlRfSURfT1BFUkFUSU9OX0NPTkZJR1VSRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9HRU1fUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5nZW1fcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX09QRVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uX3BhY2sodGhpcy0+b3BlcmF0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9HRU1fUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX09QRVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfR0VNX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX09QRVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+b3BlcmF0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9HRU1fUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfT1BFUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0dFTV9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5nZW1fcG9ydCA+IChiY21vbHRfZ3Bvbl9nZW1faWQpIDQwOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfR0VNX1BPUlQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX09QRVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT01DSV9QT1JUX0lEX09QRVJBVElPTl9DT05GSUdVUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTUNJX1BPUlRfSURfT1BFUkFUSU9OX1JFTU9WRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmFpbF9yZWFzb24gPSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb25fcGFjayh0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb25fdW5wYWNrKCZ0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mYWlsX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9SQU5HSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9QQVNTV09SRF9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fTE9TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9PTlVfQUxBUk06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXN1bHQgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfUkVTVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtLmxvc2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtLmxvZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtLmxvYW1pID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtc19wYWNrKCZ0aGlzLT5vbnVfYWxhcm0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtc191bnBhY2soJnRoaXMtPm9udV9hbGFybSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtc19ib3VuZHNfY2hlY2soJnRoaXMtPm9udV9hbGFybSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCwgMCwgc2l6ZW9mKHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkKSk7CisgICAgICAgIG1lbXNldCh0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYywgMCwgc2l6ZW9mKHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljKSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3BhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl91bnBhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnNlcmlhbF9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZhaWxfcmVhc29uID0gQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX05PTkU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfUEFTU1dPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnBhc3N3b3JkLmFyciwgMCwgc2l6ZW9mKHRoaXMtPnBhc3N3b3JkLmFycikpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3BhY2sodGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMF9wYWNrKCZ0aGlzLT5wYXNzd29yZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMF91bnBhY2soJnRoaXMtPnBhc3N3b3JkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZhaWxfcmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fUEFTU1dPUkRfSU5DT05TSVNURU5DWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX1BBU1NXT1JEX01JU01BVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX0xPU19FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX0RJU0FCTEVfRVZFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfUEFTU1dPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzEwX2JvdW5kc19jaGVjaygmdGhpcy0+cGFzc3dvcmQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1BBU1NXT1JEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BFRV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BFRV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3BlZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BFRV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVzdGltYXRlZF9kcmlmdCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9FU1RJTUFURURfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3MzMihidWYsIHRoaXMtPmVzdGltYXRlZF9kcmlmdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zMzIoYnVmLCAmdGhpcy0+ZXN0aW1hdGVkX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbGRfc3RhdGUgPSBCQ01PTFRfT05VX1NUQVRFX05PVF9DT05GSUdVUkVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19zdGF0ZSA9IEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVhc29uID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fUE9XRVJfTUFOQUdFTUVOVF9FTkFCTEVEOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfcGFjayh0aGlzLT5vbGRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbl9wYWNrKHRoaXMtPnJlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9zdGF0ZV91bnBhY2soJnRoaXMtPm9sZF9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3N0YXRlX3VucGFjaygmdGhpcy0+bmV3X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uX3VucGFjaygmdGhpcy0+cmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b2xkX3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FXQUtFX0ZSRUU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfRE9aRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfU0xFRVA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX1VOQVdBUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5uZXdfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9ET1pFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfV0FUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfVU5BV0FSRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9QT1dFUl9NQU5BR0VNRU5UX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1BPV0VSX01BTkFHRU1FTlRfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfQVdBS0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfRE9aRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9XQVRDSDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fVEVSSV9FWFBJUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9UQUxFUlRFRF9FWFBJUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9BTEFSTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfTElOS19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGlua19udW1iZXIgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0sxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmsxID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rMiA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfTElOS19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxpbmtfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+azEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5rMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0xJTktfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfTElOS19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmxpbmtfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+azEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5rMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0xJTktfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0sxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0syKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9wc3RfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmFpbF9yZWFzb24gPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9OT05FOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5udW1iZXJfb2ZfcGxvYW1zID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lcWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfUE9XRVJfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG93ZXJfbGV2ZWwgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bnVtYmVyX29mX3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5lcWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBvd2VyX2xldmVsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5udW1iZXJfb2ZfcGxvYW1zKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9FUUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmVxZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfUE9XRVJfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cG93ZXJfbGV2ZWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfUE9XRVJfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZhaWxfcmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX05PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1JBTkdJTkdfQUNLX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1BMT0FNX0RBVEFfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1BMT0FNX1RZUEVfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1BMT0FNX09OVV9JRF9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fRFJJRlRfRVhDRUVERUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX05PX1BMT0FNX1JFQ0VJVkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9MT1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0FMQVJNUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3JlaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JFSV9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iaXA4X2Vycm9ycyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SRUlfSURfQklQOF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJpcDhfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SRUlfSURfQklQOF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3JlaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkVJX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5iaXA4X2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkVJX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9yZWlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmFpbF9yZWFzb24gPSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb25fdW5wYWNrKCZ0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mYWlsX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT19ERUxJTUlURVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX05PX0FDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJlciA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRElfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NESV9JRF9CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRElfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NkaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iZXIgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRklfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NGSV9JRF9CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NGSV9JRF9CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3NmaV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQllURVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19DUkNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CRVJfUkVQT1JURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0xDREdfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SRElfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JFUl9SRVBPUlRFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVU5SRUNFSVZFRF9CVVJTVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JESV9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3N1ZmlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHJpZnRfdmFsdWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfczMyKGJ1ZiwgdGhpcy0+ZHJpZnRfdmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zMzIoYnVmLCAmdGhpcy0+ZHJpZnRfdmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRmaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREdJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRnaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kb3dpID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9FUlIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXJyID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmludmFsaWRfZGJydV9yZXBvcnQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTE9BSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb2FpID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0tJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxva2kgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX01FTUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWVtaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfYWxhcm0gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2Rpc2FibGVfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfZW5hYmxlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9wdGljYWxfcmVmbGVjdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUEVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBlZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9zc2libGVfZHJpZnQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHN0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5naW5nX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUkVJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NESSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZGkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NGSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZmkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN1ZmkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1RJV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dGl3aSA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ER0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5kZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5kb3dpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9FUlIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5lcnIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0lOVkFMSURfREJSVV9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pbnZhbGlkX2RicnVfcmVwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5sb2FpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0tJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bG9raSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTUVNSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1lbWkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2FjdGl2YXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfYWxhcm0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9udV9kaXNhYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfZW5hYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b3B0aWNhbF9yZWZsZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BFRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnBlZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wb3NzaWJsZV9kcmlmdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUFNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJhbmdpbmdfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SRUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yZWkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NESSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnNkaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2ZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdWZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9USVdJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dGl3aSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ER0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0VSUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPS0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX01FTUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BFRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SRUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TREkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NGSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ERkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kZmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmRnaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmRvd2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0VSUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmVycikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmludmFsaWRfZGJydV9yZXBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2VfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+a2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTE9BSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmxvYWkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPS0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5sb2tpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9NRU1JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bWVtaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9udV9hbGFybSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X2Rpc2FibGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9udV9lbmFibGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vcHRpY2FsX3JlZmxlY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUEVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cGVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QT1NTSUJMRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBvc3NpYmxlX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wc3QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cmFuZ2luZ19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c2RpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zZmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN1ZmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1RJV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT50aXdpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9FUlIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0tJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTUVNSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BFRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX2xldmVsX2FjdGlvbiA9IEJDTU9MVF9PTlVfUE9XRVJfTEVWRUxfSU5DUkVBU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9wb3dlcl9sZXZlbF9wYWNrKHRoaXMtPnBvd2VyX2xldmVsX2FjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTF9JRF9QT1dFUl9MRVZFTF9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3Bvd2VyX2xldmVsX3VucGFjaygmdGhpcy0+cG93ZXJfbGV2ZWxfYWN0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTF9JRF9QT1dFUl9MRVZFTF9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cG93ZXJfbGV2ZWxfYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfUE9XRVJfTEVWRUxfSU5DUkVBU0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfUE9XRVJfTEVWRUxfREVDUkVBU0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3N0YXRlID0gQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fcGFjayh0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbnVfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wYWNrZXRfdHlwZSA9IEJDTU9MVF9QQUNLRVRfVFlQRV9DUFU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYWxjX2NyYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bnVtYmVyX29mX3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGFja2V0X3NpemUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ1ZmZlci5sZW4gPSAwOworICAgICAgICB0aGlzLT5idWZmZXIudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wYWNrZXRfdHlwZV9wYWNrKHRoaXMtPnBhY2tldF90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Y2FsY19jcmMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm51bWJlcl9vZl9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcGFja2V0X3R5cGVfdW5wYWNrKCZ0aGlzLT5wYWNrZXRfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNhbGNfY3JjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5udW1iZXJfb2ZfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBhY2tldF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cGFja2V0X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBQ0tFVF9UWVBFX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfcGFja2V0cyA+IDMyKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wYWNrZXRfc2l6ZSA+IDIwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5idWZmZXIubGVuID4gMjA0OCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfYm91bmRzX2NoZWNrKCZ0aGlzLT5idWZmZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5wbG9hbS5hcnIsIDAsIHNpemVvZih0aGlzLT5wbG9hbS5hcnIpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfMTJfcGFjaygmdGhpcy0+cGxvYW0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzEyX3VucGFjaygmdGhpcy0+cGxvYW0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMl9ib3VuZHNfY2hlY2soJnRoaXMtPnBsb2FtKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvcnRfaWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y3JjX29rID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBhY2tldF9zaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ1ZmZlci5sZW4gPSAwOworICAgICAgICB0aGlzLT5idWZmZXIudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNyY19vaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soJnRoaXMtPmJ1ZmZlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y3JjX29rKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5wYWNrZXRfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5idWZmZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3J0X2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jcmNfb2sgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBhY2tldF9zaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5idWZmZXIubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YnVmZmVyLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Y3JjX29rKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmJ1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jcmNfb2spKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5wYWNrZXRfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3VucGFjaygmdGhpcy0+YnVmZmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX2JvdW5kc19jaGVjaygmdGhpcy0+YnVmZmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl90cnhfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25fdHJ4X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fdHJ4X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fdHJ4X2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wb25fbmkgPiAoYmNtb2x0X2dwb25fbmkpIDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX3R5cGUgPSBCQ01PTFRfVFJYX1RZUEVfTFRFXzM2ODBfTTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IDE1OworICAgICAgICB0aGlzLT5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSAwOworICAgICAgICB0aGlzLT5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLmxvY2F0aW9uID0gNDA7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IDE1OworICAgICAgICB0aGlzLT5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iY2RyLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSAxNTsKKyAgICAgICAgdGhpcy0+YmNkci5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHIucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+YmNkci5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHIucmVzeW5jX2NvbnRyb2wubG9jYXRpb24gPSAzNDsKKyAgICAgICAgdGhpcy0+YmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSAxNTsKKyAgICAgICAgdGhpcy0+YmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+YmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IDc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiA9IDA7CisgICAgICAgIHRoaXMtPmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubGFzdF9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gPSAwOworICAgICAgICB0aGlzLT5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiA9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gPSAwOworICAgICAgICB0aGlzLT5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4gPSAwOworICAgICAgICB0aGlzLT5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiA9IDc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiA9IDA7CisgICAgICAgIHRoaXMtPmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gPSAwOworICAgICAgICB0aGlzLT5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sb2NhdGlvbiA9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gPSAxNTsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubG9jYXRpb24gPSA3OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sYV9yZXN5bmNfcG9sYXJpdHkgPSBCQ01PTFRfUE9MQVJJVFlfTE9XOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkVTWU5DX1BPTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJjZHJfcmVzeW5jX3BvbGFyaXR5ID0gQkNNT0xUX1BPTEFSSVRZX0xPVzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2luaXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2VkID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCA9IEJDTU9TX1RSVUU7CisgICAgICAgIHRoaXMtPmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19kZWwgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfaW5pdCA9IEJDTU9TX1RSVUU7CisgICAgICAgIHRoaXMtPmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzID0gQkNNT1NfVFJVRTsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2NvbmZpZ3VyYXRpb24ud2FpdF93aW5kb3dfc2l6ZSA9IDA7CisgICAgICAgIHRoaXMtPnJ4X2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUgPSAxNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SQU5HSU5HX0NPTlRST0xfU1RBR0VTX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSA9IDA7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi53YWl0X3N0YXRlXzJfd2luZG93X3NpemUgPSAwOworICAgICAgICB0aGlzLT5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9hZnRlcl9yZXN5bmNfNCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORVJHWV9ERVRFQ1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5lcmd5X2RldGVjdC5yYW5naW5nX2VkX3NvdXJjZSA9IEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9UUlg7CisgICAgICAgIHRoaXMtPmVuZXJneV9kZXRlY3QuZGVsaW1pdGVyX2VkX3NvdXJjZSA9IEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9UUlg7CisgICAgICAgIHRoaXMtPmVuZXJneV9kZXRlY3QubWluaW11bV90aHJlc2hvbGQgPSAwOworICAgICAgICB0aGlzLT5lbmVyZ3lfZGV0ZWN0Lm1heGltdW1fdGhyZXNob2xkID0gNDE7CisgICAgICAgIHRoaXMtPmVuZXJneV9kZXRlY3QuZWRfcGF0dGVybiA9IDE3MDsKKyAgICAgICAgdGhpcy0+ZW5lcmd5X2RldGVjdC5lZF9wYXR0ZXJuX3NpemUgPSAwOworICAgICAgICB0aGlzLT5lbmVyZ3lfZGV0ZWN0LndpbmRvd19zaXplID0gMTI0OworICAgICAgICB0aGlzLT5lbmVyZ3lfZGV0ZWN0LmludmVyc2lvbiA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5lbmVyZ3lfZGV0ZWN0Lm5vX2VkX3RocmVzaG9sZCA9IDEyNzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfREFUQV9QQVRURVJOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4uc3RhcnRfcGF0dGVybiA9IDE1OworICAgICAgICB0aGlzLT5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubGFzdF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24gPSAwOworICAgICAgICB0aGlzLT5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxvY2F0aW9uID0gMTE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4gPSAwOworICAgICAgICB0aGlzLT5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+ZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sYXN0X3BhdHRlcm4gPSAwOworICAgICAgICB0aGlzLT5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICAgICAgdGhpcy0+ZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sb2NhdGlvbiA9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJlYW1ibGUudHlwZV8xX3NpemUgPSAwOworICAgICAgICB0aGlzLT5wcmVhbWJsZS50eXBlXzJfc2l6ZSA9IDA7CisgICAgICAgIHRoaXMtPnByZWFtYmxlLnR5cGVfM19wcmVfcmFuZ2luZ19zaXplID0gNTA7CisgICAgICAgIHRoaXMtPnByZWFtYmxlLnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSA9IDE1OworICAgICAgICB0aGlzLT5wcmVhbWJsZS50eXBlXzNfcGF0dGVybiA9IDE3MDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9ERUxJTUlURVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVsaW1pdGVyLnBhdHRlcm5bMF0gPSAxNzE7CisgICAgICAgIHRoaXMtPmRlbGltaXRlci5wYXR0ZXJuWzFdID0gODk7CisgICAgICAgIHRoaXMtPmRlbGltaXRlci5wYXR0ZXJuWzJdID0gMTMxOworICAgICAgICB0aGlzLT5kZWxpbWl0ZXIuc2l6ZSA9IDM7CisgICAgICAgIHRoaXMtPmRlbGltaXRlci53aW5kb3dfc2l6ZSA9IDEyNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9HVUFSRF9CSVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmd1YXJkX2JpdHMgPSA2NDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZXJkZXNfY29uZmlndXJhdGlvbi5yYW5naW5nX21vZGUgPSBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9CQ0RSX1JFU0VUX01PREU7CisgICAgICAgIHRoaXMtPnNlcmRlc19jb25maWd1cmF0aW9uLm11bHRpX2VkX21vZGUgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+c2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCA9IDA7CisgICAgICAgIHRoaXMtPnNlcmRlc19jb25maWd1cmF0aW9uLmJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0ID0gMDsKKyAgICAgICAgdGhpcy0+c2VyZGVzX2NvbmZpZ3VyYXRpb24uZWRfaW52ZXJ0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX1JBTkdJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGxvX3JhbmdpbmcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBsb19kYXRhID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uID0gMjA7CisgICAgICAgIHRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbl9zaWduID0gQkNNT0xUX1JTU0lfTE9DQVRJT05fU0lHTl9CRUZPUkU7CisgICAgICAgIHRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZy5zdGFydF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcGF0dGVybiA9IDE1OworICAgICAgICB0aGlzLT5yc3NpX25vcm1hbF9jb25maWcubGFzdF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcmVwZXJ0aXRpb24gPSA1MDsKKyAgICAgICAgdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QgPSA1NTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SQU5HSU5HX1JTU0lfUkVTWU5DX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX25vX2VkID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9lZCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5yYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfcmVzZXRfMyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X3R5cGVfcGFjayh0aGlzLT50cmFuc2NlaXZlcl90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+bGFfY29uZmlndXJhdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+YmNkciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkVTWU5DX1BPTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BvbGFyaXR5X3BhY2sodGhpcy0+bGFfcmVzeW5jX3BvbGFyaXR5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb2xhcml0eV9wYWNrKHRoaXMtPmJjZHJfcmVzeW5jX3BvbGFyaXR5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19wYWNrKCZ0aGlzLT5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19wYWNrKCZ0aGlzLT5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX3BhY2soJnRoaXMtPnJ4X2NvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfQ09OVFJPTF9TVEFHRVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbl9wYWNrKCZ0aGlzLT5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORVJHWV9ERVRFQ1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3RfcGFjaygmdGhpcy0+ZW5lcmd5X2RldGVjdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF9wYWNrKCZ0aGlzLT5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkFOR0lOR19QQVRURVJOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX3BhY2soJnRoaXMtPmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BSRUFNQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9wcmVhbWJsZV9wYWNrKCZ0aGlzLT5wcmVhbWJsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9kZWxpbWl0ZXJfcGFjaygmdGhpcy0+ZGVsaW1pdGVyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9HVUFSRF9CSVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5ndWFyZF9iaXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+c2VyZGVzX2NvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19SQU5HSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wbG9fcmFuZ2luZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wbG9fZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX3BhY2soJnRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX3BhY2soJnRoaXMtPnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA3OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDM7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA5OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9EQVRBX1BBVFRFUk4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkFOR0lOR19QQVRURVJOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9ERUxJTUlURVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9HVUFSRF9CSVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fUkFOR0lORykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDM7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF90eXBlX3VucGFjaygmdGhpcy0+dHJhbnNjZWl2ZXJfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+bGFfY29uZmlndXJhdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl91bnBhY2soJnRoaXMtPmJjZHIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfdW5wYWNrKCZ0aGlzLT5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX3VucGFjaygmdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF91bnBhY2soJnRoaXMtPmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfdW5wYWNrKCZ0aGlzLT5iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb2xhcml0eV91bnBhY2soJnRoaXMtPmxhX3Jlc3luY19wb2xhcml0eSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9sYXJpdHlfdW5wYWNrKCZ0aGlzLT5iY2RyX3Jlc3luY19wb2xhcml0eSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfdW5wYWNrKCZ0aGlzLT5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zX3VucGFjaygmdGhpcy0+bGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+cnhfY29uZmlndXJhdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SQU5HSU5HX0NPTlRST0xfU1RBR0VTX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF91bnBhY2soJnRoaXMtPmVuZXJneV9kZXRlY3QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF91bnBhY2soJnRoaXMtPmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF91bnBhY2soJnRoaXMtPmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X3ByZWFtYmxlX3VucGFjaygmdGhpcy0+cHJlYW1ibGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9kZWxpbWl0ZXJfdW5wYWNrKCZ0aGlzLT5kZWxpbWl0ZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfR1VBUkRfQklUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Z3VhcmRfYml0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+c2VyZGVzX2NvbmZpZ3VyYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX1JBTkdJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBsb19yYW5naW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBsb19kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5yc3NpX25vcm1hbF9jb25maWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX3VucGFjaygmdGhpcy0+cmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfQ09OVFJPTF9TVEFHRVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkVSR1lfREVURUNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9EQVRBX1BBVFRFUk4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QUkVBTUJMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9ERUxJTUlURVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfR1VBUkRfQklUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fUkFOR0lORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50cmFuc2NlaXZlcl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9TUFNfNDNfNDhfSF9IUF9DREVfU0RfMjAxMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX1NPR180MzIxX1BTR0I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9MVEVfMzY4MF9NOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfU09VUkNFX1BIT1RPTklDUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfVFlQRV9DX1BMVVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9BTlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9BTllfUkVTRVRfR1VBUkQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9BTllfUkVTRVRfUFJFQU1CTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9XVERfUlRYTV8xNjdfNTI2X0NQTFVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfV1REX1JUWE1fMTY3XzUyMl9CUExVUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfQkM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9TT0dRXzQzMjFfUFNHQl9DX1BMVVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9XVERfUlRYTTE2N181MjE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9MVEUzNjc4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfU09HUF80MzIxX1BTR0E6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF8yOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF81OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF84OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5sYV9jb25maWd1cmF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5iY2RyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfYm91bmRzX2NoZWNrKCZ0aGlzLT5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF9ib3VuZHNfY2hlY2soJnRoaXMtPmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sYV9yZXN5bmNfcG9sYXJpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTEFSSVRZX0xPVzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTEFSSVRZX0hJR0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkVTWU5DX1BPTEFSSVRZOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkVTWU5DX1BPTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YmNkcl9yZXN5bmNfcG9sYXJpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTEFSSVRZX0xPVzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTEFSSVRZX0hJR0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfYm91bmRzX2NoZWNrKCZ0aGlzLT5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19ib3VuZHNfY2hlY2soJnRoaXMtPmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjaygmdGhpcy0+cnhfY29uZmlndXJhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlhfQ09ORklHVVJBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfQ09OVFJPTF9TVEFHRVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPnJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF9ib3VuZHNfY2hlY2soJnRoaXMtPmVuZXJneV9kZXRlY3QpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORVJHWV9ERVRFQ1Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfREFUQV9QQVRURVJOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+ZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SQU5HSU5HX1BBVFRFUk4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfYm91bmRzX2NoZWNrKCZ0aGlzLT5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkFOR0lOR19QQVRURVJOOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X3ByZWFtYmxlX2JvdW5kc19jaGVjaygmdGhpcy0+cHJlYW1ibGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BSRUFNQkxFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9kZWxpbWl0ZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5kZWxpbWl0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0RFTElNSVRFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjaygmdGhpcy0+c2VyZGVzX2NvbmZpZ3VyYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5yc3NpX25vcm1hbF9jb25maWcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfUlNTSV9SRVNZTkNfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9ib3VuZHNfY2hlY2soJnRoaXMtPnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9sb2dfZW50cnlfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfZW50cnlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTE9HX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxvZ19pZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc2VydmVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+bmFtZS5zdHIsIDAsIDEwMCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2tleV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxvZ19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8xMDBfcGFjaygmdGhpcy0+bmFtZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbG9nX2VudHJ5X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMDA7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2tleV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bG9nX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlc2VydmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMF91bnBhY2soJnRoaXMtPm5hbWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTE9HX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nX2VudHJ5X2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMF9ib3VuZHNfY2hlY2soJnRoaXMtPm5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlZmF1bHRfbG9nX2xldmVsID0gQkNNT0xUX0xPR19MRVZFTF9OT19MT0c7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF9sb2dfdHlwZSA9IEJDTU9MVF9MT0dfVFlQRV9OT05FOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfUFJJTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bG9nX2xldmVsX3ByaW50ID0gQkNNT0xUX0xPR19MRVZFTF9OT19MT0c7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9TQVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxvZ19sZXZlbF9zYXZlID0gQkNNT0xUX0xPR19MRVZFTF9OT19MT0c7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxvZ190eXBlID0gQkNNT0xUX0xPR19UWVBFX05PTkU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19TVFlMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb2dfc3R5bGUgPSBCQ01PTFRfTE9HX1NUWUxFX05PUk1BTDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmxvZ19uYW1lLnN0ciwgMCwgMTAwKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfbGV2ZWxfcGFjayh0aGlzLT5kZWZhdWx0X2xvZ19sZXZlbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX3R5cGVfcGFjayh0aGlzLT5kZWZhdWx0X2xvZ190eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1BSSU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ19sZXZlbF9wYWNrKHRoaXMtPmxvZ19sZXZlbF9wcmludCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9TQVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ19sZXZlbF9wYWNrKHRoaXMtPmxvZ19sZXZlbF9zYXZlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX3R5cGVfcGFjayh0aGlzLT5sb2dfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19TVFlMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfc3R5bGVfcGFjayh0aGlzLT5sb2dfc3R5bGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMTAwX3BhY2soJnRoaXMtPmxvZ19uYW1lLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9QUklOVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTAwOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX2xldmVsX3VucGFjaygmdGhpcy0+ZGVmYXVsdF9sb2dfbGV2ZWwsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ190eXBlX3VucGFjaygmdGhpcy0+ZGVmYXVsdF9sb2dfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9QUklOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfbGV2ZWxfdW5wYWNrKCZ0aGlzLT5sb2dfbGV2ZWxfcHJpbnQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfbGV2ZWxfdW5wYWNrKCZ0aGlzLT5sb2dfbGV2ZWxfc2F2ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ190eXBlX3VucGFjaygmdGhpcy0+bG9nX3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX3N0eWxlX3VucGFjaygmdGhpcy0+bG9nX3N0eWxlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMF91bnBhY2soJnRoaXMtPmxvZ19uYW1lLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9QUklOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1NBVkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZGVmYXVsdF9sb2dfbGV2ZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9OT19MT0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRkFUQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfV0FSTklORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9JTkZPOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0xFVkVMX0RFQlVHOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19MRVZFTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmRlZmF1bHRfbG9nX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfVFlQRV9QUklOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19UWVBFX1NBVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfVFlQRV9CT1RIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfUFJJTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sb2dfbGV2ZWxfcHJpbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9OT19MT0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRkFUQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfV0FSTklORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9JTkZPOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0xFVkVMX0RFQlVHOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfUFJJTlQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9TQVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bG9nX2xldmVsX3NhdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9OT19MT0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRkFUQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfV0FSTklORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9JTkZPOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0xFVkVMX0RFQlVHOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sb2dfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19UWVBFX1BSSU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX1RZUEVfU0FWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19UWVBFX0JPVEg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sb2dfc3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19TVFlMRV9OT1JNQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfU1RZTEVfQk9MRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19TVFlMRV9VTkRFUkxJTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfU1RZTEVfQkxJTks6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1NUWUxFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMTAwX2JvdW5kc19jaGVjaygmdGhpcy0+bG9nX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9NU0dfQ09VTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPm1zZ19jb3VudC5hcnIsIDAsIHNpemVvZih0aGlzLT5tc2dfY291bnQuYXJyKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9MT1NUX01TR19DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb3N0X21zZ19jb3VudCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MzJfNl9wYWNrKCZ0aGlzLT5tc2dfY291bnQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTE9TVF9NU0dfQ09VTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxvc3RfbXNnX2NvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTE9TVF9NU0dfQ09VTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX01TR19DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTMyXzZfdW5wYWNrKCZ0aGlzLT5tc2dfY291bnQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9MT1NUX01TR19DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bG9zdF9tc2dfY291bnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX0xPU1RfTVNHX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MzJfNl9ib3VuZHNfY2hlY2soJnRoaXMtPm1zZ19jb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9NU0dfQ09VTlQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9DRkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX01TR19DT1VOVDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX01TR19DT1VOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX0xPU1RfTVNHX0NPVU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTE9TVF9NU0dfQ09VTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX2tleV9zZXRfZGVmYXVsdChiY21vbHRfbG9nZ2VyX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc2VydmVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5maWxlX2lkID0gQkNNT0xUX0xPR19GSUxFX0lEX1NSQU07CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfZmlsZV9pZF9wYWNrKHRoaXMtPmZpbGVfaWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ2dlcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfdW5wYWNrKGJjbW9sdF9sb2dnZXJfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfZmlsZV9pZF91bnBhY2soJnRoaXMtPmZpbGVfaWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5maWxlX2lkKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRklMRV9JRF9TUkFNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0ZJTEVfSURfRERSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lEOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmJ1ZmZlci5idWZmLCAwLCAyMDQ4KTsKKyAgICAgICAgdGhpcy0+YnVmZmVyLm1zZ190b19yZWFkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfV1JBUF9BUk9VTkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+d3JhcF9hcm91bmQgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNsZWFyX2FmdGVyX3JlYWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfRU5BQkxFX0xPRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbmFibGVfbG9nID0gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfTE9HX05BTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5sb2dfbmFtZXMuc3RyLCAwLCAxMDAwKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX2J1ZmZlcl9wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9XUkFQX0FST1VORCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPndyYXBfYXJvdW5kKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0NMRUFSX0FGVEVSX1JFQUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jbGVhcl9hZnRlcl9yZWFkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0VOQUJMRV9MT0cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5lbmFibGVfbG9nKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0xPR19OQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMTAwMF9wYWNrKCZ0aGlzLT5sb2dfbmFtZXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyMDUyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9XUkFQX0FST1VORCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0VOQUJMRV9MT0cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfTE9HX05BTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEwMDA7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbG9nZ2VyX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX2J1ZmZlcl91bnBhY2soJnRoaXMtPmJ1ZmZlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfV1JBUF9BUk9VTkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT53cmFwX2Fyb3VuZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y2xlYXJfYWZ0ZXJfcmVhZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9FTkFCTEVfTE9HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZW5hYmxlX2xvZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMDBfdW5wYWNrKCZ0aGlzLT5sb2dfbmFtZXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyMDUyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX1dSQVBfQVJPVU5EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9FTkFCTEVfTE9HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMDAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfYnVmZmVyX2JvdW5kc19jaGVjaygmdGhpcy0+YnVmZmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfQlVGRkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0xPR19OQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMTAwMF9ib3VuZHNfY2hlY2soJnRoaXMtPmxvZ19uYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0xPR19OQU1FUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfU1RBVF9JRF9MSU5FU19JTl9MT0cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGluZXNfaW5fbG9nID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfU1RBVF9JRF9MSU5FU19JTl9MT0cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxpbmVzX2luX2xvZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0lEX0xJTkVTX0lOX0xPRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5saW5lc19pbl9sb2cpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX3N0YXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2ZnLnRyaWdnZXIudHlwZSA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSAwOworICAgICAgICB0aGlzLT5jZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19wYWNrKCZ0aGlzLT5jZmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmNmZyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfdW5wYWNrKCZ0aGlzLT5jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5jZmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nZ2VyX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nZ2VyX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gKGJjbW9sdF9wb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2tleV91bnBhY2soYmNtb2x0X25uaV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ubmlfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wb25fbmkgPiAoYmNtb2x0X3Bvbl9uaSkgMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbm5pX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9SRU1PVEVfTE9PUEJBQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVtb3RlX2xvb3BiYWNrID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTElORV9MT09QQkFDSykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5lX2xvb3BiYWNrID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+bWFjX2FkZHJlc3MpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5uaV9zdGF0dXMubGlua19zdGF0dXMgPSBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFOworICAgICAgICB0aGlzLT5ubmlfc3RhdHVzLnNpZ25hbF9kZXRlY3RlZCA9IEJDTU9MVF9UUklWQUxFTlRfRkFMU0U7CisgICAgICAgIHRoaXMtPm5uaV9zdGF0dXMucG1kX2xvY2tlZCA9IEJDTU9MVF9UUklWQUxFTlRfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5uaV9iYWNrdXBfc3RhdHVzLmxpbmtfc3RhdHVzID0gQkNNT0xUX1RSSVZBTEVOVF9GQUxTRTsKKyAgICAgICAgdGhpcy0+bm5pX2JhY2t1cF9zdGF0dXMuc2lnbmFsX2RldGVjdGVkID0gQkNNT0xUX1RSSVZBTEVOVF9GQUxTRTsKKyAgICAgICAgdGhpcy0+bm5pX2JhY2t1cF9zdGF0dXMucG1kX2xvY2tlZCA9IEJDTU9MVF9UUklWQUxFTlRfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWN0aXZlX25uaSA9IEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTX1BPTExJTkdfSU5URVJWQUxfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zID0gNTA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FVVE9TV0lUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXV0b3N3aXRjaCA9IEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mbG93X2NvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfUkVNT1RFX0xPT1BCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5yZW1vdGVfbG9vcGJhY2ssIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5saW5lX2xvb3BiYWNrLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfbGlua19zdGF0dXNfcGFjaygmdGhpcy0+bm5pX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9saW5rX3N0YXR1c19wYWNrKCZ0aGlzLT5ubmlfYmFja3VwX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbm5pX2Nvbm5lY3Rpb25fcGFjayh0aGlzLT5hY3RpdmVfbm5pLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVU19QT0xMSU5HX0lOVEVSVkFMX01TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5ubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmF1dG9zd2l0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5mbG93X2NvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfQUNUSVZFX05OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTX1BPTExJTkdfSU5URVJWQUxfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9GTE9XX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ubmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+cmVtb3RlX2xvb3BiYWNrLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTElORV9MT09QQkFDSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+bGluZV9sb29wYmFjaywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbm5pX2xpbmtfc3RhdHVzX3VucGFjaygmdGhpcy0+bm5pX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbm5pX2xpbmtfc3RhdHVzX3VucGFjaygmdGhpcy0+bm5pX2JhY2t1cF9zdGF0dXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbm5pX2Nvbm5lY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3RpdmVfbm5pLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVU19QT0xMSU5HX0lOVEVSVkFMX01TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5ubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmF1dG9zd2l0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5mbG93X2NvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfUkVNT1RFX0xPT1BCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9SRU1PVEVfTE9PUEJBQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZW1vdGVfbG9vcGJhY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX0NGR19JRF9SRU1PVEVfTE9PUEJBQ0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0xJTkVfTE9PUEJBQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5saW5lX2xvb3BiYWNrKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9DRkdfSURfTElORV9MT09QQkFDSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfbGlua19zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5ubmlfc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9OTklfQkFDS1VQX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfbGlua19zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5ubmlfYmFja3VwX3N0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hY3RpdmVfbm5pKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fQkFDS1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX0NGR19JRF9BQ1RJVkVfTk5JOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTX1BPTExJTkdfSU5URVJWQUxfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyA+IDM2MDAwMDBVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVU19QT0xMSU5HX0lOVEVSVkFMX01TOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZsb3dfY29udHJvbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfQ0ZHX0lEX0ZMT1dfQ09OVFJPTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc182NCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc182NV8xMjcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzI1Nl81MTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc181MTJfMTAyMyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9mcmFtZXNfMTUxOV8yMDQ3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzIwNDhfNDA5NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzkyMTdfMTYzODMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9nb29kX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF91bmljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X211bHRpY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9icm9hZGNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZmNzX2Vycm9ycyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT05UUk9MX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9jb250cm9sX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QQVVTRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcGF1c2VfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcGZjX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9PUENPREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfdW5zdXBwb3J0ZWRfb3Bjb2RlID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX0RBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3Vuc3VwcG9ydGVkX2RhID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0FMSUdOTUVOVF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYWxpZ25tZW50X2Vycm9ycyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9MRU5HVEhfT1VUX09GX1JBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfY29kZV9lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfT1ZFUlNJWkVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9vdmVyc2l6ZWRfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfamFiYmVyX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVFVfQ0hFQ0tfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X210dV9jaGVja19lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3Byb21pc2N1b3VzX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF92bGFuX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZG91YmxlX3ZsYW5fZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1RSVU5DQVRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfdHJ1bmNhdGVkX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTkRFUlNJWkVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3VuZGVyc2l6ZV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhZ21lbnRlZF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUlVOVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcnVudF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc182NCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc182NV8xMjcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZnJhbWVzXzI1Nl81MTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc181MTJfMTAyMyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfMTUxOV8yMDQ3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZnJhbWVzXzIwNDhfNDA5NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZnJhbWVzXzkyMTdfMTYzODMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9nb29kX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF91bmljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X211bHRpY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9icm9hZGNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BBVVNFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wYXVzZV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEZDX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wZmNfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfamFiYmVyX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GQ1NfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2Zjc19lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfY29udHJvbF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfT1ZFUlNJWkVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X292ZXJzaXplX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFnbWVudGVkX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZXJyb3JfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3ZsYW5fZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0RPVUJMRV9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9kb3VibGVfdmxhbl9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUlVOVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcnVudF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5ERVJSVU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3VuZGVycnVuX2ZyYW1lcyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9mcmFtZXNfNjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc182NV8xMjcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc18yNTZfNTExKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc181MTJfMTAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzE1MTlfMjA0NykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzIwNDhfNDA5NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc185MjE3XzE2MzgzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZ29vZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF91bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfbXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRkNTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZmNzX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09OVFJPTF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2NvbnRyb2xfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QQVVTRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3BhdXNlX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEZDX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGZjX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfT1BDT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF91bnN1cHBvcnRlZF9vcGNvZGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX0RBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF91bnN1cHBvcnRlZF9kYSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQUxJR05NRU5UX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfYWxpZ25tZW50X2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfbGVuZ3RoX291dF9vZl9yYW5nZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2NvZGVfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9PVkVSU0laRURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9vdmVyc2l6ZWRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9KQUJCRVJfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9qYWJiZXJfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVFVfQ0hFQ0tfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9tdHVfY2hlY2tfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QUk9NSVNDVU9VU19GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3Byb21pc2N1b3VzX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3ZsYW5fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2RvdWJsZV92bGFuX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVFJVTkNBVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfdHJ1bmNhdGVkX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfdW5kZXJzaXplX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYWdtZW50ZWRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcnVudF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2dvb2RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfdW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BBVVNFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfcGF1c2VfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QRkNfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9wZmNfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9KQUJCRVJfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9qYWJiZXJfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GQ1NfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mY3NfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9DT05UUk9MX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfY29udHJvbF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX09WRVJTSVpFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfb3ZlcnNpemVfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZnJhZ21lbnRlZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0VSUk9SX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZXJyb3JfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfdmxhbl9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0RPVUJMRV9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZG91YmxlX3ZsYW5fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfcnVudF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfdW5kZXJydW5fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbm5pX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRkNTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09OVFJPTF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BBVVNFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEZDX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfT1BDT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQUxJR05NRU5UX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX09WRVJTSVpFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01UVV9DSEVDS19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BST01JU0NVT1VTX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0RPVUJMRV9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVFJVTkNBVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1JVTlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QQVVTRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BGQ19GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZDU19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0NPTlRST0xfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9PVkVSU0laRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQUdNRU5URURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9ET1VCTEVfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1JVTlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTkRFUlJVTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2dvb2RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfdW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Zjc19lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9jb250cm9sX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEFVU0VfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wYXVzZV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3BmY19mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX09QQ09ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfdW5zdXBwb3J0ZWRfb3Bjb2RlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfdW5zdXBwb3J0ZWRfZGEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0FMSUdOTUVOVF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2FsaWdubWVudF9lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0xFTkdUSF9PVVRfT0ZfUkFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPREVfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9jb2RlX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfT1ZFUlNJWkVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfb3ZlcnNpemVkX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfSkFCQkVSX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfamFiYmVyX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVRVX0NIRUNLX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfbXR1X2NoZWNrX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wcm9taXNjdW91c19mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF92bGFuX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRE9VQkxFX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9kb3VibGVfdmxhbl9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1RSVU5DQVRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3RydW5jYXRlZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOREVSU0laRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3VuZGVyc2l6ZV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQUdNRU5URURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFnbWVudGVkX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUlVOVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3J1bnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2ZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2ZyYW1lc18xMjhfMjU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMTAyNF8xNTE4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfNDA5Nl85MjE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9nb29kX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3VuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QQVVTRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3BhdXNlX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEZDX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfcGZjX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfSkFCQkVSX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfamFiYmVyX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRkNTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZmNzX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2NvbnRyb2xfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9PVkVSU0laRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X292ZXJzaXplX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBR01FTlRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2ZyYWdtZW50ZWRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2Vycm9yX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3ZsYW5fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9ET1VCTEVfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2RvdWJsZV92bGFuX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUlVOVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3J1bnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTkRFUlJVTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3VuZGVycnVuX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRkNTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEFVU0VfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEZDX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX09QQ09ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX0RBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQUxJR05NRU5UX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0xFTkdUSF9PVVRfT0ZfUkFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT0RFX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX09WRVJTSVpFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9KQUJCRVJfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVRVX0NIRUNLX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BST01JU0NVT1VTX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRE9VQkxFX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVFJVTkNBVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOREVSU0laRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFHTUVOVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1JVTlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BBVVNFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BGQ19GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9KQUJCRVJfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRkNTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0NPTlRST0xfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfT1ZFUlNJWkVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBR01FTlRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0RPVUJMRV9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1JVTlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5ERVJSVU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbm5pX3N0YXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2ZnLnRyaWdnZXIudHlwZSA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSAwOworICAgICAgICB0aGlzLT5jZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19wYWNrKCZ0aGlzLT5jZmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmNmZyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfdW5wYWNrKCZ0aGlzLT5jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5jZmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbm5pX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT05UUk9MX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BBVVNFX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9PUENPREU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0FMSUdOTUVOVF9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9MRU5HVEhfT1VUX09GX1JBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9PVkVSU0laRURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfSkFCQkVSX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01UVV9DSEVDS19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QUk9NSVNDVU9VU19GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9WTEFOX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0RPVUJMRV9WTEFOX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1RSVU5DQVRFRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTkRFUlNJWkVfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QQVVTRV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QRkNfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfSkFCQkVSX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZDU19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9DT05UUk9MX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX09WRVJTSVpFX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQUdNRU5URURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRVJST1JfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9ET1VCTEVfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GQ1NfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09OVFJPTF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QQVVTRV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QRkNfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfT1BDT0RFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfREE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9BTElHTk1FTlRfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPREVfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfT1ZFUlNJWkVEX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVFVfQ0hFQ0tfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9UUlVOQ0FURURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQUdNRU5URURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUlVOVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEFVU0VfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEZDX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GQ1NfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9PVkVSU0laRV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0VSUk9SX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRE9VQkxFX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUlVOVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTkRFUlJVTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTElOSykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5rID0gQkNNT0xUX05OSV9DT05ORUNUSU9OX1BSSU1BUlk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfUFJFVklPVVNfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByZXZpb3VzX2FjdGl2ZSA9IEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19BQ1RJVkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X2FjdGl2ZSA9IEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bmV3X3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTElOSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfY29ubmVjdGlvbl9wYWNrKHRoaXMtPmxpbmssIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX1BSRVZJT1VTX0FDVElWRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfY29ubmVjdGlvbl9wYWNrKHRoaXMtPnByZXZpb3VzX2FjdGl2ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX0FDVElWRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfY29ubmVjdGlvbl9wYWNrKHRoaXMtPm5ld19hY3RpdmUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9MSU5LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfUFJFVklPVVNfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX0FDVElWRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5uZXdfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9MSU5LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9jb25uZWN0aW9uX3VucGFjaygmdGhpcy0+bGluaywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfUFJFVklPVVNfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9jb25uZWN0aW9uX3VucGFjaygmdGhpcy0+cHJldmlvdXNfYWN0aXZlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9jb25uZWN0aW9uX3VucGFjaygmdGhpcy0+bmV3X2FjdGl2ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9MSU5LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX1BSRVZJT1VTX0FDVElWRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5uZXdfc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX0xJTkspKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5saW5rKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fQkFDS1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX0xJTks7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfUFJFVklPVVNfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cHJldmlvdXNfYWN0aXZlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fQkFDS1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX1BSRVZJT1VTX0FDVElWRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bmV3X2FjdGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fUFJJTUFSWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9DT05ORUNUSU9OX0JBQ0tVUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfQUNUSVZFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUVVNfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXNfY2hhbmdlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUVVNfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXR1c19jaGFuZ2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUVVNfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRVU19DSEFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdHVzX2NoYW5nZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVFVTX0NIQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+aW5zdGFuY2UgPSBCQ01PTFRfU0VSREVTX0lOU1RBTkNFX0lOU1RBTkNFXzA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfcGFjayhjb25zdCBiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyZGVzX2luc3RhbmNlX3BhY2sodGhpcy0+aW5zdGFuY2UsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9zZXJkZXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ubmlfc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfa2V5X3VucGFjayhiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJkZXNfaW5zdGFuY2VfdW5wYWNrKCZ0aGlzLT5pbnN0YW5jZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wb25fbmkgPiAoYmNtb2x0X3Bvbl9uaSkgMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX0lOU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+aW5zdGFuY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9JTlNUQU5DRV8wOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU0VSREVTX0lOU1RBTkNFX0lOU1RBTkNFXzE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9JTlNUQU5DRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfVkdBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3ZnYSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wZiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9MRlBGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2xmcGYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9kZmUxID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGZlMiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2RmZTMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9kZmU0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGZlNSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcHJlID0gMTI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9NQUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X21haW4gPSAxMDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wb3N0MSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wb3N0MiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wb3N0MyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9BTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfYW1wID0gMTI7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfVkdBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJ4X3ZnYSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cnhfcGYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cnhfbGZwZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yeF9kZmUxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zOChidWYsIHRoaXMtPnJ4X2RmZTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+cnhfZGZlMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfczgoYnVmLCB0aGlzLT5yeF9kZmU0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zOChidWYsIHRoaXMtPnJ4X2RmZTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50eF9wcmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX01BSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHhfbWFpbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHhfcG9zdDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zOChidWYsIHRoaXMtPnR4X3Bvc3QyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfczgoYnVmLCB0aGlzLT50eF9wb3N0MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR4X2FtcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BSRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV91bnBhY2soYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9WR0EpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cnhfdmdhKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yeF9wZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfTEZQRikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yeF9sZnBmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfczgoYnVmLCAmdGhpcy0+cnhfZGZlMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zOChidWYsICZ0aGlzLT5yeF9kZmUzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfczgoYnVmLCAmdGhpcy0+cnhfZGZlNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUFJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnR4X3ByZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50eF9tYWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50eF9wb3N0MSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfczgoYnVmLCAmdGhpcy0+dHhfcG9zdDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnR4X3Bvc3QzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9BTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHhfYW1wKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1BGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfTEZQRikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUFJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX0FNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfdmdhID4gNDUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9WR0E7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1BGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5yeF9wZiA+IDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEY7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2xmcGYgPiA3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfTEZQRjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfZGZlMSA+IDYzKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfZGZlMiA8IC0zMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+cnhfZGZlMiA+IDMxKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfZGZlMyA8IC0zMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+cnhfZGZlMyA+IDMxKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfZGZlNCA8IC0xNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+cnhfZGZlNCA+IDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfZGZlNSA8IC0xNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+cnhfZGZlNSA+IDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUFJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50eF9wcmUgPiAzMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BSRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHhfbWFpbiA+IDExMikKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX01BSU47CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50eF9wb3N0MSA+IDYzKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50eF9wb3N0MiA8IC0xNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPnR4X3Bvc3QyID4gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnR4X3Bvc3QzIDwgLTcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT50eF9wb3N0MyA+IDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50eF9hbXAgPiAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX0FNUDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc2VydmVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+aWR4ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfcGFjayhjb25zdCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX0lEWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aWR4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX0lEWCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV91bnBhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlkeCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW50cnkuZmlyc3RfZXJyb3JfdGltZV91cyA9IDA7CisgICAgICAgIHRoaXMtPmVudHJ5Lmxhc3RfZXJyb3JfdGltZV91cyA9IDA7CisgICAgICAgIHRoaXMtPmVudHJ5LmxpbmVfbnVtYmVyID0gMDsKKyAgICAgICAgdGhpcy0+ZW50cnkuZXJyb3JfY291bnRlciA9IDA7CisgICAgICAgIHRoaXMtPmVudHJ5Lmluc3RhbmNlID0gMDsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmVudHJ5LmZpbGVuYW1lLCAwLCA2NCk7CisgICAgICAgIG1lbXNldCh0aGlzLT5lbnRyeS50YXNrX25hbWUsIDAsIDY0KTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9FTlRSWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zd19lcnJvcl9wYWNrKCZ0aGlzLT5lbnRyeSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTU2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3VucGFjayhiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3dfZXJyb3JfdW5wYWNrKCZ0aGlzLT5lbnRyeSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9FTlRSWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE1NikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfU09GVFdBUkVfRVJST1JfQ0ZHX0lEX0VOVFJZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N3X2Vycm9yX2JvdW5kc19jaGVjaygmdGhpcy0+ZW50cnkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfU09GVFdBUkVfRVJST1JfQ0ZHX0lEX0VOVFJZOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X3NldF9kZWZhdWx0KGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzZXJ2ZWQgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfcGFjayhjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9EQVRBX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kYXRhX3dpbmRvdy5sZW4gPSAwOworICAgICAgICB0aGlzLT5kYXRhX3dpbmRvdy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1NUUk9CRV9XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3Ryb2JlX3dpbmRvdy5sZW4gPSAwOworICAgICAgICB0aGlzLT5zdHJvYmVfd2luZG93LnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZWRnZV9yaXNlX21pbl9taW4gPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVkZ2VfcmlzZV9taW5fbWF4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUFYX01JTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lZGdlX3Jpc2VfbWF4X21pbiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01BWF9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZWRnZV9yaXNlX21heF9tYXggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVkZ2VfZmFsbF9taW5fbWluID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUlOX01BWCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lZGdlX2ZhbGxfbWluX21heCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZWRnZV9mYWxsX21heF9taW4gPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVkZ2VfZmFsbF9tYXhfbWF4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzdWx0ID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0RBVEFfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9wYWNrKCZ0aGlzLT5kYXRhX3dpbmRvdywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfcGFjaygmdGhpcy0+c3Ryb2JlX3dpbmRvdywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfcmlzZV9taW5fbWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfcmlzZV9taW5fbWF4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01BWF9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfcmlzZV9tYXhfbWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01BWF9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfcmlzZV9tYXhfbWF4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfZmFsbF9taW5fbWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfZmFsbF9taW5fbWF4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfZmFsbF9tYXhfbWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfZmFsbF9tYXhfbWF4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfREFUQV9XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZGF0YV93aW5kb3cpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1NUUk9CRV9XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+c3Ryb2JlX3dpbmRvdyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUlOX01BWCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01BWF9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUlOX01JTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUFYX01BWCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfREFUQV9XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X3VucGFjaygmdGhpcy0+ZGF0YV93aW5kb3csIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfdW5wYWNrKCZ0aGlzLT5zdHJvYmVfd2luZG93LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX3Jpc2VfbWluX21pbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX3Jpc2VfbWluX21heCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX3Jpc2VfbWF4X21pbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX3Jpc2VfbWF4X21heCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX2ZhbGxfbWluX21pbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX2ZhbGxfbWluX21heCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX2ZhbGxfbWF4X21pbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX2ZhbGxfbWF4X21heCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0RBVEFfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9EQVRBX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+ZGF0YV93aW5kb3cubGVuIDwgMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPmRhdGFfd2luZG93LmxlbiA+IDUwMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X2JvdW5kc19jaGVjaygmdGhpcy0+ZGF0YV93aW5kb3cpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0RBVEFfV0lORE9XOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+c3Ryb2JlX3dpbmRvdy5sZW4gPCAyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+c3Ryb2JlX3dpbmRvdy5sZW4gPiA1MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9ib3VuZHNfY2hlY2soJnRoaXMtPnN0cm9iZV93aW5kb3cpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1NUUk9CRV9XSU5ET1c7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfUkVTVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0NGR19JRF9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Y2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0NGR19JRF9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19DRkdfSURfQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRyaWdnZXIgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfRVBPTl9TVEFUOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUUk9CRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdHJvYmUgPSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX0dQT05fQkNEUl9SRVNFVDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT53aW5kb3dfbW9kZSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfUkFOR0lORzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRyaWdnZXJfcG9zaXRpb24gPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfUE9TSVRJT05fUklTSU5HOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUT1BfRFVFX1RPX0NPUlJVUFRfU1RST0JFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RBUlRfT0ZGU0VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXJ0X29mZnNldCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfRU5EX09GRlNFVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbmRfb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9OVU1CRVJfT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9jeWNsZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3BhY2sodGhpcy0+dHJpZ2dlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbF9wYWNrKHRoaXMtPnN0cm9iZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfV0lORE9XX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlX3BhY2sodGhpcy0+d2luZG93X21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUl9QT1NJVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbl9wYWNrKHRoaXMtPnRyaWdnZXJfcG9zaXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUT1BfRFVFX1RPX0NPUlJVUFRfU1RST0JFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVEFSVF9PRkZTRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnN0YXJ0X29mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX0VORF9PRkZTRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmVuZF9vZmZzZXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9OVU1CRVJfT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm51bWJlcl9vZl9jeWNsZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfV0lORE9XX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RPUF9EVUVfVE9fQ09SUlVQVF9TVFJPQkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVEFSVF9PRkZTRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9FTkRfT0ZGU0VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfTlVNQkVSX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfdW5wYWNrKCZ0aGlzLT50cmlnZ2VyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVFJPQkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsX3VucGFjaygmdGhpcy0+c3Ryb2JlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGVfdW5wYWNrKCZ0aGlzLT53aW5kb3dfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uX3VucGFjaygmdGhpcy0+dHJpZ2dlcl9wb3NpdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RPUF9EVUVfVE9fQ09SUlVQVF9TVFJPQkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUQVJUX09GRlNFVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c3RhcnRfb2Zmc2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfRU5EX09GRlNFVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+ZW5kX29mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX05VTUJFUl9PRl9DWUNMRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2N5Y2xlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUUk9CRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUl9QT1NJVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVE9QX0RVRV9UT19DT1JSVVBUX1NUUk9CRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVEFSVF9PRkZTRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfRU5EX09GRlNFVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9OVU1CRVJfT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50cmlnZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9FUE9OX1NUQVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX0JDRFJfUkVTRVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1RSWF9SRVNFVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fVFJYX0VEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfR1BPTl9SU1NJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfR1BPTl9FT0I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1JBTkdJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9TRVJERVNfQlVSU1RfRU46CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVFJPQkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdHJvYmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9HUE9OX0JDRFJfUkVTRVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfR1BPTl9UUlhfRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfR1BPTl9SU1NJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX0dQT05fRU9COgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX1NFUkRFU19CVVJTVF9FTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9TRVJERVNfUlhfTE9DSzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVFJPQkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfV0lORE9XX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT53aW5kb3dfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX1JBTkdJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfTk9OX1JBTkdJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfQk9USDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+dHJpZ2dlcl9wb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfUE9TSVRJT05fUklTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfUE9TSVRJT05fRkFMTElORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RPUF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RPUF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1dfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RPUF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2Nfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2tleV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfeGdwb25fbmkpIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMTYzODMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU0xBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNsYS5jYnJfcnRfYncgPSAwOworICAgICAgICB0aGlzLT5zbGEuY2JyX25ydF9idyA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5ndWFyYW50ZWVkX2J3ID0gMDsKKyAgICAgICAgdGhpcy0+c2xhLm1heGltdW1fYncgPSAwOworICAgICAgICB0aGlzLT5zbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSA9IEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX05PTkU7CisgICAgICAgIHRoaXMtPnNsYS5jYnJfcnRfY29tcGVuc2F0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnNsYS5jYnJfcnRfYXBfaW5kZXggPSAwOworICAgICAgICB0aGlzLT5zbGEuY2JyX25ydF9hcF9pbmRleCA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5hbGxvY190eXBlID0gQkNNT0xUX0FMTE9DX1RZUEVfTk9ORTsKKyAgICAgICAgdGhpcy0+c2xhLndlaWdodCA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5wcmlvcml0eSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29sbGVjdF9zdGF0cyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FsbG9jX3N0YXRlX3BhY2sodGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWxsb2Nfc2xhX3BhY2soJnRoaXMtPnNsYSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jb2xsZWN0X3N0YXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjM7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWxsb2Nfc3RhdGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU0xBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9hbGxvY19zbGFfdW5wYWNrKCZ0aGlzLT5zbGEsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNvbGxlY3Rfc3RhdHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX05PVF9DT05GSUdVUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWxsb2Nfc2xhX2JvdW5kc19jaGVjaygmdGhpcy0+c2xhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TTEE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfeGdwb25fb251X2lkKSA1MTEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2J5dGVzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19zdGF0ZSA9IEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY19zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FsbG9jX3N0YXRlX3VucGFjaygmdGhpcy0+bmV3X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bmV3X3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdmVyYWdlX25zcl91c2VkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF2ZXJhZ2Vfc3JfcmVwb3J0ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YXZlcmFnZV9uc3JfdXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YXZlcmFnZV9zcl9yZXBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hdmVyYWdlX25zcl91c2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX0FMTE9DQVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YXZlcmFnZV9uc3JfYWxsb2NhdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hdmVyYWdlX3NyX3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Z2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y29uZmlndXJhdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bnVtX29mX2N5Y2xlcyA9IDE7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bnVtX29mX2N5Y2xlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm51bV9vZl9jeWNsZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm51bV9vZl9jeWNsZXMgPCAxKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfQUxMT0NfT1BFUkFUSU9OX0FDVElWQVRFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FsbG9jX29wZXJhdGlvbl9wYWNrKHRoaXMtPnN0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWxsb2Nfb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9BQ1RJVkFURToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9ERUFDVElWQVRFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmdlbV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfeGdwb25fbmkpIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmdlbV9wb3J0X2lkID4gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIDY1NTMzVSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNvbmZpZ3VyYXRpb24uZGlyZWN0aW9uID0gQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9ET1dOU1RSRUFNOworICAgICAgICB0aGlzLT5jb25maWd1cmF0aW9uLnR5cGUgPSBCQ01PTFRfR0VNX1BPUlRfVFlQRV9VTklDQVNUOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nZW1fcG9ydF9zdGF0ZSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5jcnlwdGlvbl9tb2RlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSA9IEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9EQVRBOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uX3BhY2soJnRoaXMtPmNvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZV9wYWNrKHRoaXMtPmdlbV9wb3J0X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPmVuY3J5cHRpb25fbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb25fcGFjayh0aGlzLT51cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfRU5DUllQVElPTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5jb25maWd1cmF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlX3VucGFjaygmdGhpcy0+Z2VtX3BvcnRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0VOQ1JZUFRJT05fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+ZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl91bnBhY2soJnRoaXMtPnVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5jb25maWd1cmF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5vbnVfaWQgPiAoYmNtb2x0X3hncG9uX29udV9pZCkgNTExKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Z2VtX3BvcnRfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRFX05PVF9DT05GSUdVUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfRU5DUllQVElPTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZW5jcnlwdGlvbl9tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT51cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVVNfR0VNX1BPUlRfREVTVElOQVRJT05fREFUQToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX0NQVToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmNvbnRyb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0w7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wYWNrZXRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wYWNrZXRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYnl0ZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2ZnLnRyaWdnZXIudHlwZSA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSAwOworICAgICAgICB0aGlzLT5jZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19wYWNrKCZ0aGlzLT5jZmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmNmZyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfdW5wYWNrKCZ0aGlzLT5jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5jZmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2tleV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2l3Zl9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2tleV91bnBhY2soYmNtb2x0X3hncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wb25fbmkgPiAoYmNtb2x0X3hncG9uX25pKSA3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51c19vdGFnX2RpcmVjdF90cGlkID0gMzMwMjRVOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRzX3RwaWQuYXJyWzBdID0gMzMwMjRVOworICAgICAgICB0aGlzLT5kc190cGlkLmFyclsxXSA9IDM0OTg0VTsKKyAgICAgICAgdGhpcy0+ZHNfdHBpZC5hcnJbMl0gPSAzNzEyMFU7CisgICAgICAgIHRoaXMtPmRzX3RwaWQuYXJyWzNdID0gMzczNzZVOworICAgICAgICB0aGlzLT5kc190cGlkLmFycls0XSA9IDMzMDI0VTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51c19vdGFnX2RpcmVjdF90cGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3UxNl81X2hleF9wYWNrKCZ0aGlzLT5kc190cGlkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTA7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51c19vdGFnX2RpcmVjdF90cGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3UxNl81X2hleF91bnBhY2soJnRoaXMtPmRzX3RwaWQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfRFNfVFBJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzVfaGV4X2JvdW5kc19jaGVjaygmdGhpcy0+ZHNfdHBpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9rZXlfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9rZXlfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfeGdwb25fbmkpIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5od19wb25faWQucG9uX2lkXzEgPSAwOworICAgICAgICB0aGlzLT5od19wb25faWQucG9uX2lkXzIgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXZhaWxhYmxlX2JhbmR3aWR0aC5jYnJfYncgPSAwOworICAgICAgICB0aGlzLT5hdmFpbGFibGVfYmFuZHdpZHRoLnRvdGFsX2J3ID0gMDsKKyAgICAgICAgdGhpcy0+YXZhaWxhYmxlX2JhbmR3aWR0aC5uZXh0X29udV90b3RhbF9idyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9hY3RpdmVfb251cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fc3RhdHVzLnN0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICAgICAgdGhpcy0+cG9uX3N0YXR1cy5sb3Nfc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9kaXN0YW5jZS5tYXhfbG9nX2Rpc3RhbmNlID0gMjA7CisgICAgICAgIHRoaXMtPnBvbl9kaXN0YW5jZS5tYXhfZGlmZl9yZWFjaCA9IDIwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ193aW5kb3dfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXFkX2N5Y2xlc19udW1iZXIgPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHJpZnRfY29udHJvbC5kcmlmdF9pbnRlcnZhbCA9IDEwMDA7CisgICAgICAgIHRoaXMtPmRyaWZ0X2NvbnRyb2wuZHJpZnRfbGltaXQgPSA4OworICAgICAgICB0aGlzLT5kcmlmdF9jb250cm9sLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0ID0gMTY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb3NfYWxhcm1fdGhyZXNob2xkID0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb3NfaW5pdGlhbF92YWx1ZSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSA9IDQ7CisgICAgICAgIHRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2JpID0gNDsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtc190aHJlc2hvbGRzLmxvb2NpID0gMzsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtc190aHJlc2hvbGRzLmxvcGNpID0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwgPSA1MDAwOworICAgICAgICB0aGlzLT5iZXJfbW9uaXRvci5zZl90aHJlc2hvbGQgPSAzOworICAgICAgICB0aGlzLT5iZXJfbW9uaXRvci5zZF90aHJlc2hvbGQgPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9hY3RpdmF0aW9uLmtleV9leGNoYW5nZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPm9udV9hY3RpdmF0aW9uLmZhaWxfZHVlX3RvX3JlZ2lzX2F1dG9fZmFpbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCA9IDEwMDA7CisgICAgICAgIHRoaXMtPnNuX2FjcXVpc2l0aW9uLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgICAgICB0aGlzLT5zbl9hY3F1aXNpdGlvbi5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSA9IEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9OT05FOworICAgICAgICB0aGlzLT5zbl9hY3F1aXNpdGlvbi5idXJzdF9wcm9maWxlID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2UuaW50ZXJ2YWwgPSAxMDAwMDsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nLnRpbWVvdXQgPSAxMDA7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluID0gQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRDsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmcuZmFzdF9yYW5naW5nID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcuZGF0YV9tYXBfZGVsYXlfbXMgPSAwOworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWVfZGVsYXkgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV83ID0gNjQ7CisgICAgICAgIHRoaXMtPmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMyA9IDI1NjsKKyAgICAgICAgdGhpcy0+Y2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8xID0gNTEyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyclswXSA9IDQwOTY7CisgICAgICAgIHRoaXMtPmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyclsxXSA9IDgxOTI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50Lmlsb3dwb3dlciA9IDE2MDA7CisgICAgICAgIHRoaXMtPnBvd2VyX21hbmFnZW1lbnQuaWF3YXJlID0gMTYwOworICAgICAgICB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQgPSA4MDsKKyAgICAgICAgdGhpcy0+cG93ZXJfbWFuYWdlbWVudC5pdHhpbml0ID0gNDA7CisgICAgICAgIHRoaXMtPnBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmID0gMTYwMDsKKyAgICAgICAgdGhpcy0+cG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkgPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlID0gQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT047CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUgPSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19TSUxFTlRfV0lORE9XOworICAgICAgICB0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5pbnRlcnZhbCA9IDEwMDAwOworICAgICAgICB0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uYWxsb2NfdHlwZV90b19zY2FuID0gQkNNT0xUX0FMTE9DX1RZUEVfVE9fU0NBTl9BTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmludGVydmFsID0gNTAwMDsKKyAgICAgICAgdGhpcy0+cGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kYmFfbW9kZSA9IEJDTU9MVF9EQkFfTU9ERV9OT1JNQUw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUExPQU1fSEFORExJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGxvYW1faGFuZGxpbmcuYWNrX3RpbWVvdXQgPSAyMDAwOworICAgICAgICB0aGlzLT5wbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JhbmdpbmdfdGltZSA9IDA7CisgICAgICAgIHRoaXMtPnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfYXNzaWduX2FsbG9jX2lkID0gMDsKKyAgICAgICAgdGhpcy0+cGxvYW1faGFuZGxpbmcucmV0cmFuc19rZXlfY29udHJvbCA9IDA7CisgICAgICAgIHRoaXMtPnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24gPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1pbl9kYXRhX2FsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMTAyNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5taW5fZGF0YV9nZW1fcG9ydF9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSAxMDI0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPm11bHRpY2FzdF9rZXkua2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+bXVsdGljYXN0X2tleS5rZXkuYnl0ZXMpKTsKKyAgICAgICAgdGhpcy0+bXVsdGljYXN0X2tleS5rZXlfY29udHJvbCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIubW9kZSA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9TRUxGX1NZTkM7CisgICAgICAgIHRoaXMtPnByYnNfY2hlY2tlci5kYXRhX2ludmVydCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IuaW52ZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByYnNfc3RhdHVzLmxvY2tfc3RhdGUgPSBCQ01PTFRfUFJCU19MT0NLX1NUQVRFX1VOTE9DS0VEOworICAgICAgICB0aGlzLT5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5vbnVfYWxhcm1zID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnRpd2kgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uYWNrX3RpbWVvdXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uc2ZpID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxva2kgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dXNfYmFuZHdpZHRoX2xpbWl0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfT05VUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxfb251cy5sZW4gPSAwOworICAgICAgICB0aGlzLT5hbGxfb251cy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FMTF9NQ0FTVF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cy5sZW4gPSAwOworICAgICAgICB0aGlzLT5hbGxfbWNhc3RfZ2VtX3BvcnRzLnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVidWcuaW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idyA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5kZWJ1Zy5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMgPSA1MTI7CisgICAgICAgIHRoaXMtPmRlYnVnLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSA9IDY0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyA9IDEwMDA7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy5tYXhfcmV0cnlfY291bnQgPSAyMzsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLm9tY2lfZm9ybWF0ID0gQkNNT0xUX09NQ0lfREVWSUNFX0lEX0VYVEVOREVEOworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMud2luZG93X3NpemUgPSAzMjsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLmFjdGl2YXRlX2NvbW1pdCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyA9IDQwMDAwVUw7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyA9IDIzOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRzX2ZlY19tb2RlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRiYV90eXBlID0gQkNNT0xUX0RCQV9UWVBFX0lOVEVSTkFMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9UVU5JTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3R1bmluZy50c291cmNlID0gMTAwMDsKKyAgICAgICAgdGhpcy0+b251X3R1bmluZy50dGFyZ2V0ID0gMTAwMDsKKyAgICAgICAgdGhpcy0+b251X3R1bmluZy5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9yZXF1aXJlZCA9IEJDTU9TX1RSVUU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfSFdfUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2h3X3Bvbl9pZF9wYWNrKCZ0aGlzLT5od19wb25faWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfcGFjaygmdGhpcy0+YXZhaWxhYmxlX2JhbmR3aWR0aCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5udW1iZXJfb2ZfYWN0aXZlX29udXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0dXNfcGFjaygmdGhpcy0+cG9uX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9kaXN0YW5jZV9wYWNrKCZ0aGlzLT5wb25fZGlzdGFuY2UsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJhbmdpbmdfd2luZG93X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZXFkX2N5Y2xlc19udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX3BhY2soJnRoaXMtPmRyaWZ0X2NvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bG9zX2FsYXJtX3RocmVzaG9sZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvc19pbml0aWFsX3ZhbHVlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3BhY2soJnRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX3BhY2soJnRoaXMtPmJlcl9tb25pdG9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl9wYWNrKCZ0aGlzLT5vbnVfYWN0aXZhdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb25fcGFjaygmdGhpcy0+c25fYWNxdWlzaXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2VfcGFjaygmdGhpcy0+a2V5X2V4Y2hhbmdlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19wYWNrKCZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfcGFjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9wYWNrKCZ0aGlzLT5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfcGFjaygmdGhpcy0+Y2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9wYWNrKCZ0aGlzLT5wb3dlcl9tYW5hZ2VtZW50LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9ST0dVRV9PTlVfREVURUNUSU9OX1BST0NFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX3BhY2soJnRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3BhY2soJnRoaXMtPnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RiYV9tb2RlX3BhY2sodGhpcy0+ZGJhX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BMT0FNX0hBTkRMSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX3BhY2soJnRoaXMtPnBsb2FtX2hhbmRsaW5nLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5taW5fZGF0YV9hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm1pbl9kYXRhX2dlbV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTVVMVElDQVNUX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X3BhY2soJnRoaXMtPm11bHRpY2FzdF9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfY2hlY2tlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c19wYWNrKCZ0aGlzLT5wcmJzX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fcGFjaygmdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dXNfYmFuZHdpZHRoX2xpbWl0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9wYWNrKCZ0aGlzLT5hbGxfb251cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfcGFjaygmdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fbmlfZGVidWdfcGFjaygmdGhpcy0+ZGVidWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc19wYWNrKCZ0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5kc19mZWNfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGJhX3R5cGVfcGFjayh0aGlzLT5kYmFfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1RVTklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+b251X3R1bmluZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfSFdfUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRFJJRlRfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA3OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BMT0FNX0hBTkRMSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9vbnVzKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9tY2FzdF9nZW1fcG9ydHMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVFVOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9IV19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaHdfcG9uX2lkX3VucGFjaygmdGhpcy0+aHdfcG9uX2lkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfdW5wYWNrKCZ0aGlzLT5hdmFpbGFibGVfYmFuZHdpZHRoLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2FjdGl2ZV9vbnVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fc3RhdHVzX3VucGFjaygmdGhpcy0+cG9uX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2Rpc3RhbmNlX3VucGFjaygmdGhpcy0+cG9uX2Rpc3RhbmNlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnJhbmdpbmdfd2luZG93X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZXFkX2N5Y2xlc19udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX3VucGFjaygmdGhpcy0+ZHJpZnRfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxvc19hbGFybV90aHJlc2hvbGQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3NfaW5pdGlhbF92YWx1ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc191bnBhY2soJnRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfdW5wYWNrKCZ0aGlzLT5iZXJfbW9uaXRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl91bnBhY2soJnRoaXMtPm9udV9hY3RpdmF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX3VucGFjaygmdGhpcy0+c25fYWNxdWlzaXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV91bnBhY2soJnRoaXMtPmtleV9leGNoYW5nZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ191bnBhY2soJnRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnX3VucGFjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX3VucGFjaygmdGhpcy0+Y2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfdW5wYWNrKCZ0aGlzLT5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5wb3dlcl9tYW5hZ2VtZW50LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfdW5wYWNrKCZ0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3VucGFjaygmdGhpcy0+cGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kYmFfbW9kZV91bnBhY2soJnRoaXMtPmRiYV9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QTE9BTV9IQU5ETElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZ191bnBhY2soJnRoaXMtPnBsb2FtX2hhbmRsaW5nLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+bWluX2RhdGFfYWxsb2NfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm1pbl9kYXRhX2dlbV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTVVMVElDQVNUX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X3VucGFjaygmdGhpcy0+bXVsdGljYXN0X2tleSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ191bnBhY2soJnRoaXMtPnByYnNfY2hlY2tlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfdW5wYWNrKCZ0aGlzLT5wcmJzX2dlbmVyYXRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c191bnBhY2soJnRoaXMtPnByYnNfc3RhdHVzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uX3VucGFjaygmdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51c19iYW5kd2lkdGhfbGltaXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwX3VucGFjaygmdGhpcy0+YWxsX29udXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfdW5wYWNrKCZ0aGlzLT5hbGxfbWNhc3RfZ2VtX3BvcnRzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX25pX2RlYnVnX3VucGFjaygmdGhpcy0+ZGVidWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3VucGFjaygmdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5kc19mZWNfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGJhX3R5cGVfdW5wYWNrKCZ0aGlzLT5kYmFfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1RVTklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5vbnVfdHVuaW5nLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19ERUJVRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3Nfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUExPQU1fSEFORExJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTVVMVElDQVNUX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVFVOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9od19wb25faWRfYm91bmRzX2NoZWNrKCZ0aGlzLT5od19wb25faWQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfYm91bmRzX2NoZWNrKCZ0aGlzLT5hdmFpbGFibGVfYmFuZHdpZHRoKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRIOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fc3RhdHVzX2JvdW5kc19jaGVjaygmdGhpcy0+cG9uX3N0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fZGlzdGFuY2VfYm91bmRzX2NoZWNrKCZ0aGlzLT5wb25fZGlzdGFuY2UpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5lcWRfY3ljbGVzX251bWJlciA+IDI1NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfYm91bmRzX2NoZWNrKCZ0aGlzLT5kcmlmdF9jb250cm9sKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sb3NfaW5pdGlhbF92YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19ib3VuZHNfY2hlY2soJnRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX2JvdW5kc19jaGVjaygmdGhpcy0+YmVyX21vbml0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5vbnVfYWN0aXZhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT047CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPnNuX2FjcXVpc2l0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2VfYm91bmRzX2NoZWNrKCZ0aGlzLT5rZXlfZXhjaGFuZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2JvdW5kc19jaGVjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfYm91bmRzX2NoZWNrKCZ0aGlzLT5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3UxNl8yX2JvdW5kc19jaGVjaygmdGhpcy0+Y2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjaygmdGhpcy0+cG93ZXJfbWFuYWdlbWVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfYm91bmRzX2NoZWNrKCZ0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ19ib3VuZHNfY2hlY2soJnRoaXMtPnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmRiYV9tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EQkFfTU9ERV9OT1JNQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EQkFfTU9ERV9FWFRFTkRFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QTE9BTV9IQU5ETElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZ19ib3VuZHNfY2hlY2soJnRoaXMtPnBsb2FtX2hhbmRsaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QTE9BTV9IQU5ETElORzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5taW5fZGF0YV9hbGxvY19pZCA8IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDEwMjQpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+bWluX2RhdGFfYWxsb2NfaWQgPiAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSAxNDU5MSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5taW5fZGF0YV9nZW1fcG9ydF9pZCA8IChiY21vbHRfeGdwb25fZ2VtX2lkKSAxMDI0KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPm1pbl9kYXRhX2dlbV9wb3J0X2lkID4gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIDU3NTk4VSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9ib3VuZHNfY2hlY2soJnRoaXMtPm11bHRpY2FzdF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPnByYnNfY2hlY2tlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19nZW5lcmF0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcmJzX3N0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FMTF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxfb251cy5sZW4gPiA1MTApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGxfb251cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxfbWNhc3RfZ2VtX3BvcnRzLmxlbiA+IDEyOCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2JvdW5kc19jaGVjaygmdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX25pX2RlYnVnX2JvdW5kc19jaGVjaygmdGhpcy0+ZGVidWcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX2JvdW5kc19jaGVjaygmdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmRzX2ZlY19tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmRiYV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EQkFfVFlQRV9JTlRFUk5BTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9UWVBFX1BBUlRJQUxfRVhURVJOQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EQkFfVFlQRV9FWFRFUk5BTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVFVOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPm9udV90dW5pbmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9UVU5JTkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29kZXdvcmRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmlwMzJfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmlwMzJfZXJyb3JzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19IRUFERVJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3hndGNfaGVhZGVycyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3hndGNfY29ycmVjdGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19VTkNPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF94Z3RjX3VuY29ycmVjdGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF94Z2VtID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3hnZW1fZHJvcHBlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF94Z2VtX2lkbGUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF94Z2VtX2NvcnJlY3RlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9jcmNfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9mcmFnbWVudF9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wYWNrZXRzX2Ryb3BwZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9kcm9wcGVkX3Rvb19zaG9ydCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZHJvcHBlZF90b29fbG9uZyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9rZXlfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcGxvYW1zID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcGxvYW1zX2Ryb3BwZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9hbGxvY2F0aW9uc192YWxpZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYWxsb2NhdGlvbnNfaW52YWxpZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3Bsb2FtcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfbm9uX2lkbGUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcGxvYW1zX2Vycm9yID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1BVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2NwdSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfb21jaSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcGFja2V0cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfeGdlbSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9jcHUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X29tY2kgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZHJvcHBlZF90cGlkX21pc3MgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2Ryb3BwZWRfdmlkX21pc3MgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2Rld29yZHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJpcDMyX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YmlwMzJfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfSEVBREVSUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfeGd0Y19oZWFkZXJzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF94Z3RjX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF94Z3RjX3VuY29ycmVjdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3hnZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF94Z2VtX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF94Z2VtX2lkbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3hnZW1fY29ycmVjdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9mcmFnbWVudF9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3BhY2tldHNfZHJvcHBlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZHJvcHBlZF90b29fc2hvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZHJvcHBlZF90b29fbG9uZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2tleV9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2FsbG9jYXRpb25zX3ZhbGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2FsbG9jYXRpb25zX2ludmFsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX25vbl9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfY3B1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X3hnZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9jcHUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfb21jaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2Ryb3BwZWRfdHBpZF9taXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2Ryb3BwZWRfdmlkX21pc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19VTkNPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29kZXdvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5iaXAzMl9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJpcDMyX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3hndGNfaGVhZGVycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfeGd0Y19jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19VTkNPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfeGd0Y191bmNvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF94Z2VtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfeGdlbV9kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfeGdlbV9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF94Z2VtX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhZ21lbnRfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wYWNrZXRzX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Ryb3BwZWRfdG9vX2xvbmcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9rZXlfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9wbG9hbXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3Bsb2Ftc19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9hbGxvY2F0aW9uc192YWxpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19JTlZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9hbGxvY2F0aW9uc19pbnZhbGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9hbGxvY2F0aW9uc19kaXNhYmxlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3Bsb2Ftc19ub25faWRsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3Bsb2Ftc19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2NwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9vbWNpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9YR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF94Z2VtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfY3B1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9kcm9wcGVkX3RwaWRfbWlzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9kcm9wcGVkX3ZpZF9taXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lcnJvciA9IEJDTU9MVF9QQUNLRVRfSU5KRUNUSU9OX0VSUk9SX0dFTV9QT1JUX05PVF9BQ1RJVkU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl9wYWNrKHRoaXMtPmVycm9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl91bnBhY2soJnRoaXMtPmVycm9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmVycm9yKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQUNLRVRfSU5KRUNUSU9OX0VSUk9SX0dFTV9QT1JUX05PVF9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Z2VtX3BvcnRfaWQgPiAoYmNtb2x0X3hncG9uX2dlbV9pZCkgNjU1MzNVKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2xvc19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5naW5nX3RpbWUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzID0gQkNNT0xUX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVNfUkFURV8yX1BfNV9HOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9ET1dOU1RSRUFNX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfVVBTVFJFQU1fUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmN1cnJlbnRfdXBzdHJlYW1fcG9uX2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NBTElCUkFUSU9OX1JFQ09SRCkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+Y2FsaWJyYXRpb25fcmVjb3JkLmFyciwgMCwgc2l6ZW9mKHRoaXMtPmNhbGlicmF0aW9uX3JlY29yZC5hcnIpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1RVTklOR19HUkFOVUxBUklUWSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50dW5pbmdfZ3JhbnVsYXJpdHkgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU1RFUF9UVU5JTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGVwX3R1bmluZ190aW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0FUVEVOVUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF0dGVudWF0aW9uID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3BhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yYW5naW5nX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc19wYWNrKHRoaXMtPnVwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9ET1dOU1RSRUFNX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DVVJSRU5UX1VQU1RSRUFNX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jdXJyZW50X3Vwc3RyZWFtX3Bvbl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ0FMSUJSQVRJT05fUkVDT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9wYWNrKCZ0aGlzLT5jYWxpYnJhdGlvbl9yZWNvcmQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVFVOSU5HX0dSQU5VTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR1bmluZ19ncmFudWxhcml0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU1RFUF9UVU5JTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zdGVwX3R1bmluZ190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5hdHRlbnVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfRE9XTlNUUkVBTV9QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfVVBTVFJFQU1fUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DQUxJQlJBVElPTl9SRUNPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1RVTklOR19HUkFOVUxBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU1RFUF9UVU5JTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQVRURU5VQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl91bnBhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9SQU5HSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnJhbmdpbmdfdGltZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXNfdW5wYWNrKCZ0aGlzLT51cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfRE9XTlNUUkVBTV9QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9VUFNUUkVBTV9QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y3VycmVudF91cHN0cmVhbV9wb25faWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NBTElCUkFUSU9OX1JFQ09SRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzhfdW5wYWNrKCZ0aGlzLT5jYWxpYnJhdGlvbl9yZWNvcmQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9UVU5JTkdfR1JBTlVMQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHVuaW5nX2dyYW51bGFyaXR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TVEVQX1RVTklOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnN0ZXBfdHVuaW5nX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0FUVEVOVUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmF0dGVudWF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DVVJSRU5UX0RPV05TVFJFQU1fUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9VUFNUUkVBTV9QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DQUxJQlJBVElPTl9SRUNPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9UVU5JTkdfR1JBTlVMQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TVEVQX1RVTklOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQVRURU5VQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX2JvdW5kc19jaGVjaygmdGhpcy0+c2VyaWFsX251bWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfeGdwb25fb251X2lkKSA1MTEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT51cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMl9QXzVfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVNfUkFURV8xMF9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NBTElCUkFUSU9OX1JFQ09SRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzhfYm91bmRzX2NoZWNrKCZ0aGlzLT5jYWxpYnJhdGlvbl9yZWNvcmQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ0FMSUJSQVRJT05fUkVDT1JEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+YXR0ZW51YXRpb24gPiA3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQVRURU5VQVRJT047CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMgPiAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9wYWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udXMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+b251cy52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl9wYWNrKCZ0aGlzLT5vbnVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5vbnVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl91bnBhY2soJnRoaXMtPm9udXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5vbnVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc3VsdCA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXN1bHQgPSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0X3VucGFjaygmdGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9GQUlMVVJFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVU1BFQ1RFRF9MT1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPndpbmRvd190eXBlID0gQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfU0lMRU5UX1dJTkRPVzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1lYXN1cmVtZW50X3N0YXR1cyA9IEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9DT01QTEVURTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsb2NfaWQgPSAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmlzX2RlbGluZWF0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmlzX2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGF0YS5sZW4gPSAwOworICAgICAgICB0aGlzLT5yeF9kYXRhLnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wbG9hbV9yZWNlaXZlZF9vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfTUlDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBsb2FtX3JlY2VpdmVkX21pY19lcnJvciA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcGFjayh0aGlzLT53aW5kb3dfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHRfcGFjayh0aGlzLT5tZWFzdXJlbWVudF9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfZGVsaW5lYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pc19lZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soJnRoaXMtPnJ4X2RhdGEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+cGxvYW1fcmVjZWl2ZWRfb251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX01JQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnBsb2FtX3JlY2VpdmVkX21pY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfREVMSU5FQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnJ4X2RhdGEpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfTUlDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3VucGFjaygmdGhpcy0+d2luZG93X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9NRUFTVVJFTUVOVF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0X3VucGFjaygmdGhpcy0+bWVhc3VyZW1lbnRfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfREVMSU5FQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pc19kZWxpbmVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19FRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmlzX2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5yeF9kYXRhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5wbG9hbV9yZWNlaXZlZF9vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfTUlDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cGxvYW1fcmVjZWl2ZWRfbWljX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX01JQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT53aW5kb3dfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19TSUxFTlRfV0lORE9XOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19DVVRfT0ZGX1dJTkRPVzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfV0lORE9XX1RZUEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm1lYXN1cmVtZW50X3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfTk9UX1BFUkZPUk1FRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9ST0dVRV9DWUNMRV9TVE9QOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9OT1RfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMTYzODMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIDUxMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5yeF9kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBsb2FtX3JlY2VpdmVkX29udV9pZCA+IChiY21vbHRfeGdwb25fb251X2lkKSA1MTEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5lcmd5X2RldGVjdF9zaWduYWwgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5udW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5lbmVyZ3lfZGV0ZWN0X3NpZ25hbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9ERVRFQ1RFRF9ERUxJTUlURVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmVuZXJneV9kZXRlY3Rfc2lnbmFsLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5lbmVyZ3lfZGV0ZWN0X3NpZ25hbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfSEVBREVSUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfVU5DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NQVToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fSURMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUExPQU1TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfT01DSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXN1bHQgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByZXZpb3VzX3N0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19zdGF0ZSA9IEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV9wYWNrKHRoaXMtPnByZXZpb3VzX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV91bnBhY2soJnRoaXMtPnByZXZpb3VzX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV91bnBhY2soJnRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9QUkVWSU9VU19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnByZXZpb3VzX3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfV09SS0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm5ld19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX1NUQVRFX1BST0NFU1NJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+dG9kX3N0cmluZy5zdHIsIDAsIDY0KTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2ZjID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ydGNfb2Zmc2V0X3NlYyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ0Y19vZmZzZXRfbnNlYyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl82NF9wYWNrKCZ0aGlzLT50b2Rfc3RyaW5nLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnNmYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ydGNfb2Zmc2V0X3NlYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cnRjX29mZnNldF9uc2VjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2NDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfNjRfdW5wYWNrKCZ0aGlzLT50b2Rfc3RyaW5nLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+c2ZjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ0Y19vZmZzZXRfc2VjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5ydGNfb2Zmc2V0X25zZWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl82NF9ib3VuZHNfY2hlY2soJnRoaXMtPnRvZF9zdHJpbmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNwdV9wYWNrZXRzX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbmFibGVfYWxsX29udXNfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bG9zID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfZGlzY292ZXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfY29tcGxldGUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGVfY2hhbmdlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRvZF9yZXF1ZXN0X2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNwdV9wYWNrZXRzX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5lbmFibGVfYWxsX29udXNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5sb3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2Rpc2NvdmVyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X3VwZ3JhZGVfY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT50b2RfcmVxdWVzdF9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfTE9TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y3B1X3BhY2tldHNfZmFpbHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmxvcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfZGlzY292ZXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfdXBncmFkZV9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnRvZF9yZXF1ZXN0X2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQsIDAsIHNpemVvZih0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCkpOworICAgICAgICBtZW1zZXQodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMsIDAsIHNpemVvZih0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYykpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJlcWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gPSBCQ01PTFRfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OX0xPV0VSOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplID0gMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb25fcGFjayh0aGlzLT5mcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl91bnBhY2soJnRoaXMtPmZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX2JvdW5kc19jaGVjaygmdGhpcy0+c2VyaWFsX251bWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9TRVJJQUxfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fTE9XRVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fSElHSEVSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplID4gMTApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29udHJvbCA9IEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9VTklDQVNUX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQsIDAsIHNpemVvZih0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCkpOworICAgICAgICBtZW1zZXQodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMsIDAsIHNpemVvZih0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYykpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2xfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2xfdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfdW5wYWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfVU5JQ0FTVF9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfVU5JQ0FTVF9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9CUk9BRENBU1RfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfQlJPQURDQVNUX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9ESVNBQkxFX0RJU0NPVkVSWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnNlcmlhbF9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+d2luZG93X3R5cGUgPSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19TSUxFTlRfV0lORE9XOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNlY29uZF9yYW5naW5nX3dpbmRvdyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcGFjayh0aGlzLT53aW5kb3dfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2Vjb25kX3Jhbmdpbmdfd2luZG93KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd191bnBhY2soJnRoaXMtPndpbmRvd190eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c2Vjb25kX3Jhbmdpbmdfd2luZG93KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPndpbmRvd190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0NVVF9PRkZfV0lORE9XOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMTYzODMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIDUxMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX05VTUJFUl9PRl9DWUNMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5udW1iZXJfb2ZfY3ljbGUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0FMTE9DQVRJT05fTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbG9jYXRpb25fbnVtYmVyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9CV19NQVBfQVJSQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YndfbWFwX2FycmF5ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9OVU1CRVJfT0ZfQ1lDTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bnVtYmVyX29mX2N5Y2xlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQUxMT0NBVElPTl9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YWxsb2NhdGlvbl9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9CV19NQVBfQVJSQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YndfbWFwX2FycmF5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfTlVNQkVSX09GX0NZQ0xFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQUxMT0NBVElPTl9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9CV19NQVBfQVJSQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX05VTUJFUl9PRl9DWUNMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5udW1iZXJfb2ZfY3ljbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9BTExPQ0FUSU9OX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hbGxvY2F0aW9uX251bWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0JXX01BUF9BUlJBWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5id19tYXBfYXJyYXkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9OVU1CRVJfT0ZfQ1lDTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQUxMT0NBVElPTl9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQldfTUFQX0FSUkFZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3N0YXRlID0gQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fcGFjayh0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbnVfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX3N0YXRlID0gQkNNT0xUX1BPTl9PUEVSQVRJT05fSU5BQ1RJVkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9vcGVyYXRpb25fcGFjayh0aGlzLT5wb25fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT5wb25fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5wb25fc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9PUEVSQVRJT05fSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9XT1JLSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGlzdF9vZl9vbnVfaWRzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmxpc3Rfb2Zfb251X2lkcy52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX3BhY2soJnRoaXMtPmxpc3Rfb2Zfb251X2lkcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5saXN0X29mX29udV9pZHMpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5saXN0X29mX29udV9pZHMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX2JvdW5kc19jaGVjaygmdGhpcy0+bGlzdF9vZl9vbnVfaWRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+cGxvYW0uYXJyLCAwLCBzaXplb2YodGhpcy0+cGxvYW0uYXJyKSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzQwX3BhY2soJnRoaXMtPnBsb2FtLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0MDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF80MF91bnBhY2soJnRoaXMtPnBsb2FtLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0MCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfNDBfYm91bmRzX2NoZWNrKCZ0aGlzLT5wbG9hbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBhY2tldF90eXBlID0gQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNhbGNfY3JjID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X2xpc3QubGVuID0gMDsKKyAgICAgICAgdGhpcy0+Z2VtX3BvcnRfbGlzdC52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ1ZmZlci5sZW4gPSAwOworICAgICAgICB0aGlzLT5idWZmZXIudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wYWNrZXRfdHlwZV9wYWNrKHRoaXMtPnBhY2tldF90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Y2FsY19jcmMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X3BhY2soJnRoaXMtPmdlbV9wb3J0X2xpc3QsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3BhY2soJnRoaXMtPmJ1ZmZlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmdlbV9wb3J0X2xpc3QpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BhY2tldF90eXBlX3VucGFjaygmdGhpcy0+cGFja2V0X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jYWxjX2NyYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfdW5wYWNrKCZ0aGlzLT5nZW1fcG9ydF9saXN0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3VucGFjaygmdGhpcy0+YnVmZmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cGFja2V0X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBQ0tFVF9UWVBFX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmdlbV9wb3J0X2xpc3QubGVuID4gMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9ib3VuZHNfY2hlY2soJnRoaXMtPmdlbV9wb3J0X2xpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5idWZmZXIubGVuID4gMjA0OCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfYm91bmRzX2NoZWNrKCZ0aGlzLT5idWZmZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X3VucGFjayhiY21vbHRfeGdwb25fb251X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfeGdwb25fbmkpIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfeGdwb25fb251X2lkKSA1MTEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3N0YXRlID0gQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfb2xkX3N0YXRlID0gQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUubG9zaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5sb2JpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxvcGNpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxvcGNpX21pY19lcnJvciA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5sb29jaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS50aXdpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmRvd2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUuc3VmaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5zZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUuc2RpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmRmaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5kZ2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUucHFzaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9pay5ieXRlcykpOworICAgICAgICBtZW1zZXQodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrLmJ5dGVzKSk7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuYnl0ZXMpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi5ieXRlcywgMCwgc2l6ZW9mKHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi5ieXRlcykpOworICAgICAgICBtZW1zZXQodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5rZWsuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlay5ieXRlcykpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DVVJSRU5UX0VOQ1JZUFRJT05fS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+Y3VycmVudF9lbmNyeXB0aW9uX2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcykpOworICAgICAgICB0aGlzLT5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmtleV9pbmRleCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWdpc3RyYXRpb25faWQuYXJyLCAwLCBzaXplb2YodGhpcy0+cmVnaXN0cmF0aW9uX2lkLmFycikpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSURfQVVUT19MRUFSTklORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19idXJzdF9wcm9maWxlID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9EQVRBX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGF0YV9idXJzdF9wcm9maWxlID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ190aW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYWN0aXZhdGlvbl9yZWFzb24gPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9OT05FOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbF9nZW1fcG9ydHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YWxsX2dlbV9wb3J0cy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbF9hbGxvY3MubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YWxsX2FsbG9jcy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lID0gMDsKKyAgICAgICAgdGhpcy0+ZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVzX2xpbmVfcmF0ZSA9IEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMl9QXzVfRzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5jYWxpYnJhdGlvbl9yZWNvcmQuYXJyLCAwLCBzaXplb2YodGhpcy0+Y2FsaWJyYXRpb25fcmVjb3JkLmFycikpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHVuaW5nX2dyYW51bGFyaXR5ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU1RFUF9UVU5JTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGVwX3R1bmluZ190aW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cy5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0ZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cy5zbWFfZmxhZyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfcGFjayh0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfT0xEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9zdGF0ZV9wYWNrKHRoaXMtPm9udV9vbGRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfcGFjaygmdGhpcy0+YWxhcm1fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c19wYWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9wYWNrKCZ0aGlzLT5jdXJyZW50X2VuY3J5cHRpb25fa2V5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3BhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzM2X3BhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5yYW5naW5nX2J1cnN0X3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5kYXRhX2J1cnN0X3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yYW5naW5nX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbl9wYWNrKHRoaXMtPmRlYWN0aXZhdGlvbl9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9wYWNrKCZ0aGlzLT5hbGxfZ2VtX3BvcnRzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9wYWNrKCZ0aGlzLT5hbGxfYWxsb2NzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lX3BhY2soJnRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9VU19MSU5FX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc19wYWNrKHRoaXMtPnVzX2xpbmVfcmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NBTElCUkFUSU9OX1JFQ09SRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzhfcGFjaygmdGhpcy0+Y2FsaWJyYXRpb25fcmVjb3JkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVFVOSU5HX0dSQU5VTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR1bmluZ19ncmFudWxhcml0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TVEVQX1RVTklOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnN0ZXBfdHVuaW5nX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfcGFjaygmdGhpcy0+cmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4MDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxNzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfQlVSU1RfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9EQVRBX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YWxsX2dlbV9wb3J0cyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5hbGxfYWxsb2NzKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9VU19MSU5FX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1RVTklOR19HUkFOVUxBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TVEVQX1RVTklOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3N0YXRlX3VucGFjaygmdGhpcy0+b251X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfdW5wYWNrKCZ0aGlzLT5vbnVfb2xkX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3VucGFjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV91bnBhY2soJnRoaXMtPmN1cnJlbnRfZW5jcnlwdGlvbl9rZXksIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl91bnBhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfMzZfdW5wYWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25faWQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnJhbmdpbmdfYnVyc3RfcHJvZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9EQVRBX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+ZGF0YV9idXJzdF9wcm9maWxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmFuZ2luZ190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb25fdW5wYWNrKCZ0aGlzLT5kZWFjdGl2YXRpb25fcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfdW5wYWNrKCZ0aGlzLT5hbGxfZ2VtX3BvcnRzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3VucGFjaygmdGhpcy0+YWxsX2FsbG9jcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lX3VucGFjaygmdGhpcy0+ZXh0ZW5kZWRfZ3VhcmRfdGltZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXNfdW5wYWNrKCZ0aGlzLT51c19saW5lX3JhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DQUxJQlJBVElPTl9SRUNPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84X3VucGFjaygmdGhpcy0+Y2FsaWJyYXRpb25fcmVjb3JkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHVuaW5nX2dyYW51bGFyaXR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NURVBfVFVOSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c3RlcF90dW5pbmdfdGltZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1c191bnBhY2soJnRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgODApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDM2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RBVEFfQlVSU1RfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NURVBfVFVOSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b251X3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FXQUtFX0ZSRUU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfRE9aRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfU0xFRVA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX1VOQVdBUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm9udV9vbGRfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9ET1pFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfV0FUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfVU5BV0FSRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX2JvdW5kc19jaGVjaygmdGhpcy0+YWxhcm1fc3RhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c19ib3VuZHNfY2hlY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NVUlJFTlRfRU5DUllQVElPTl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5jdXJyZW50X2VuY3J5cHRpb25fa2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzM2X2JvdW5kc19jaGVjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfQlVSU1RfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cmFuZ2luZ19idXJzdF9wcm9maWxlID4gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSAzKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5kYXRhX2J1cnN0X3Byb2ZpbGUgPiAoYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXgpIDMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RBVEFfQlVSU1RfUFJPRklMRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kZWFjdGl2YXRpb25fcmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX05PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0RFQUNUSVZBVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fQUNLX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1NGSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fVElXSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fUEFTU1dPUkRfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fTE9TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9MT0tJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9SRVJBTkdFX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbF9nZW1fcG9ydHMubGVuID4gMjU2KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGxfZ2VtX3BvcnRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxfYWxsb2NzLmxlbiA+IDMyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9ib3VuZHNfY2hlY2soJnRoaXMtPmFsbF9hbGxvY3MpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV9ib3VuZHNfY2hlY2soJnRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnVzX2xpbmVfcmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFU19SQVRFXzJfUF81X0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMTBfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DQUxJQlJBVElPTl9SRUNPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84X2JvdW5kc19jaGVjaygmdGhpcy0+Y2FsaWJyYXRpb25fcmVjb3JkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFUVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9zaXRpdmVfZHJpZnQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmVnYXRpdmVfZHJpZnQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlbGltaXRlcl9taXNzX2RldGVjdGlvbiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmlwMzJfZXJyb3JzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1dPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3dvcmRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29ycmVjdGVkX3N5bWJvbHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb2Rld29yZHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9CSVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb3JyZWN0ZWRfYml0cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0tFWV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+eGdlbV9rZXlfZXJyb3JzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT54Z2VtX2xvc3MgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX01JQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfbWljX2Vycm9yID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfbm9uX2lkbGUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9vbWNpID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wYWNrZXRzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cG9zaXRpdmVfZHJpZnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5uZWdhdGl2ZV9kcmlmdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0JJUDMyX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YmlwMzJfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfd29yZHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2NvcnJlY3RlZF9zeW1ib2xzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mZWNfY29kZXdvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb3JyZWN0ZWRfYml0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9LRVlfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT54Z2VtX2tleV9lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+eGdlbV9sb3NzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9wbG9hbXNfbWljX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3Bsb2Ftc19ub25faWRsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb21jaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0RFTElNSVRFUl9NSVNTX0RFVEVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfQklQMzJfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9TWU1CT0xTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9MT1NTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnBvc2l0aXZlX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bmVnYXRpdmVfZHJpZnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0RFTElNSVRFUl9NSVNTX0RFVEVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJpcDMyX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3dvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX1NZTUJPTFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19jb3JyZWN0ZWRfc3ltYm9scykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19jb3JyZWN0ZWRfY29kZXdvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfVU5DT1JSRUNUQUJMRV9DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2NvZGV3b3JkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9CSVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29ycmVjdGVkX2JpdHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+eGdlbV9rZXlfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0xPU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnhnZW1fbG9zcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX01JQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGxvYW1zX21pY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wbG9hbXNfbm9uX2lkbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQklUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19NSUNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2RmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ERklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ERklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2RmaV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2RnaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RHSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2RnaV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHJpZnRfdmFsdWUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfTkVXX0VRRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfZXFkID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zMzIoYnVmLCB0aGlzLT5kcmlmdF92YWx1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfTkVXX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bmV3X2VxZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX05FV19FUUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfczMyKGJ1ZiwgJnRoaXMtPmRyaWZ0X3ZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9ORVdfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5uZXdfZXFkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfTkVXX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMTYzODMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5uZXdfa2V5LmVuY3J5cHRpb25fa2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+bmV3X2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcykpOworICAgICAgICB0aGlzLT5uZXdfa2V5LmtleV9pbmRleCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9wYWNrKCZ0aGlzLT5uZXdfa2V5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE3OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV91bnBhY2soJnRoaXMtPm5ld19rZXksIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9ib3VuZHNfY2hlY2soJnRoaXMtPm5ld19rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmV4cGVjdGVkX2tleS5ieXRlcywgMCwgc2l6ZW9mKHRoaXMtPmV4cGVjdGVkX2tleS5ieXRlcykpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWNlaXZlZF9rZXkuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWNlaXZlZF9rZXkuYnl0ZXMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5leHBlY3RlZF9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfcGFjaygmdGhpcy0+cmVjZWl2ZWRfa2V5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTY7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPmV4cGVjdGVkX2tleSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX1JFQ0VJVkVEX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3VucGFjaygmdGhpcy0+cmVjZWl2ZWRfa2V5LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X2JvdW5kc19jaGVjaygmdGhpcy0+ZXhwZWN0ZWRfa2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5yZWNlaXZlZF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9MT09DSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9MT09DSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9MT09DSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmFpbF9yZWFzb24gPSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnJlZ2lzdHJhdGlvbl9pZC5hcnIsIDAsIHNpemVvZih0aGlzLT5yZWdpc3RyYXRpb25faWQuYXJyKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzKSk7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuYnl0ZXMpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS5ieXRlcywgMCwgc2l6ZW9mKHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS5ieXRlcykpOworICAgICAgICBtZW1zZXQodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLmJ5dGVzKSk7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlay5ieXRlcywgMCwgc2l6ZW9mKHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrLmJ5dGVzKSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb25fcGFjayh0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfMzZfcGFjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2lkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXNfcGFjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4MDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzM2X3VucGFjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2lkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c191bnBhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgODApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZmFpbF9yZWFzb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fTk9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fUkFOR0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fUEFTU1dPUkRfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX0xPUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fT05VX0FMQVJNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8zNl9ib3VuZHNfY2hlY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c19ib3VuZHNfY2hlY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfYWxhcm0ubG9zaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5vbnVfYWxhcm0ubG9iaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5vbnVfYWxhcm0ubG9wY2lfbWlzcyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5vbnVfYWxhcm0ubG9wY2lfbWljX2Vycm9yID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9hbGFybXNfcGFjaygmdGhpcy0+b251X2FsYXJtLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3VucGFjaygmdGhpcy0+b251X2FsYXJtLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2FsYXJtc19ib3VuZHNfY2hlY2soJnRoaXMtPm9udV9hbGFybSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnNlcmlhbF9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnNlcmlhbF9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc3VsdCA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mYWlsX3JlYXNvbiA9IEJDTU9MVF9UVU5FX0lOX0ZBSUxfUkVBU09OX05PTkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbl91bnBhY2soJnRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX1JFU1VMVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZhaWxfcmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UVU5FX0lOX0ZBSUxfUkVBU09OX05PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UVU5FX0lOX0ZBSUxfUkVBU09OX05PX1RVTklOR19SRVNQT05TRV9QTE9BTV9SRUNFSVZFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RVTkVfSU5fRkFJTF9SRUFTT05fT05VX0FDVElWQVRJT05fRkFJTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzdWx0ID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mYWlsX3JlYXNvbiA9IEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl91bnBhY2soJnRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfUkVTVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZhaWxfcmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFVORV9PVVRfRkFJTF9SRUFTT05fTkFDS19QTE9BTV9SRUNFSVZFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX05PX1RVTklOR19SRVNQT05TRV9QTE9BTV9SRUNFSVZFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX1RTT1VSQ0VfVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX1JPTExCQUNLX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVzdGltYXRlZF9kcmlmdCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zMzIoYnVmLCB0aGlzLT5lc3RpbWF0ZWRfZHJpZnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9FU1RJTUFURURfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zMzIoYnVmLCAmdGhpcy0+ZXN0aW1hdGVkX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlRfSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQuYXJyLCAwLCBzaXplb2YodGhpcy0+cG93ZXJfY29uc3VtcHRpb25fcmVwb3J0LmFycikpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF9wYWNrKCZ0aGlzLT5wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF91bnBhY2soJnRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF9ib3VuZHNfY2hlY2soJnRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdHRlbnVhdGlvbiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXR5ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5hdHRlbnVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX0FUVEVOVUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hdHRlbnVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfQVRURU5VQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b2xkX3N0YXRlID0gQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X3N0YXRlID0gQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVhc29uID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fUE9XRVJfTUFOQUdFTUVOVF9FTkFCTEVEOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfcGFjayh0aGlzLT5vbGRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfcGFjayh0aGlzLT5uZXdfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uX3BhY2sodGhpcy0+cmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfdW5wYWNrKCZ0aGlzLT5vbGRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfdW5wYWNrKCZ0aGlzLT5uZXdfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uX3VucGFjaygmdGhpcy0+cmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbGRfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9ET1pFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfV0FUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfVU5BV0FSRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bmV3X3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FXQUtFX0ZSRUU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfRE9aRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfU0xFRVA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX1VOQVdBUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9QT1dFUl9NQU5BR0VNRU5UX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1BPV0VSX01BTkFHRU1FTlRfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfQVdBS0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfRE9aRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9XQVRDSDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fVEVSSV9FWFBJUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9UQUxFUlRFRF9FWFBJUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9BTEFSTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QUVNJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QUVNJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX1BRU0lfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZhaWxfcmVhc29uID0gQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fTk9ORTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9FUUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXFkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9wbG9hbXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX2xldmVsID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uX3BhY2sodGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZXFkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5udW1iZXJfb2ZfcGxvYW1zKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfUE9XRVJfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cG93ZXJfbGV2ZWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbl91bnBhY2soJnRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9FUUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmVxZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtYmVyX29mX3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvd2VyX2xldmVsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mYWlsX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9SQU5HSU5HX0FDS19USU1FT1VUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9EQVRBX01JU01BVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9UWVBFX01JU01BVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9PTlVfSURfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0RSSUZUX0VYQ0VFREVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9OT19QTE9BTV9SRUNFSVZFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fTE9TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9BTEFSTVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+cmVnaXN0cmF0aW9uX2lkLmFyciwgMCwgc2l6ZW9mKHRoaXMtPnJlZ2lzdHJhdGlvbl9pZC5hcnIpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gPSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fTk9ORTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzM2X3BhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8zNl91bnBhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+cmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMzYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8zNl9ib3VuZHNfY2hlY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFR0lTVFJBVElPTl9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fTk9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX1JFR0lTVFJBVElPTl9QTE9BTV9USU1FT1VUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fT05VX0FMQVJNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fREVBQ1RJVkFUSU9OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmFpbF9yZWFzb24gPSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb25fcGFjayh0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb25fdW5wYWNrKCZ0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mYWlsX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT19ERUxJTUlURVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX05PX0FDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmVyID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zZGlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZhaWxfcmVhc29uID0gQkNNT0xUX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fVElNRU9VVDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZmFpbF9yZWFzb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfRkFJTF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJlciA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfQklQMzJfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfV09SRFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX1NZTUJPTFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0tFWV9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0xPU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQklUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19NSUNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3N1ZmlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHJpZnRfdmFsdWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3MzMihidWYsIHRoaXMtPmRyaWZ0X3ZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zMzIoYnVmLCAmdGhpcy0+ZHJpZnRfdmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9BQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWNrID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXN1bHQgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWNrKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX0FDSykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX0FDSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmFjaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX0FDSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX1JFU1VMVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRmaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kZ2kgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ET1dJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRvd2kgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmludmFsaWRfZGJydV9yZXBvcnQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfTE9PQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bG9vY2kgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2FjdGl2YXRpb25fY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9hbGFybSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9kaXNhYmxlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9lbmFibGVfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19JTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3R1bmluZ19pbl9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3R1bmluZ19vdXRfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9wdGljYWxfcmVmbGVjdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvc3NpYmxlX2RyaWZ0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0xFVkVMX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3dlcl9sZXZlbF9yZXBvcnQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHFzaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlZ2lzdHJhdGlvbl9pZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNkaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2ZpID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdWZpID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50aXdpID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVFVOSU5HX1JFU1BPTlNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR1bmluZ19yZXNwb25zZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmRmaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmRnaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5kb3dpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmludmFsaWRfZGJydV9yZXBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9MT09DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmxvb2NpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2FjdGl2YXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2FsYXJtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9udV9kaXNhYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2VuYWJsZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9udV90dW5pbmdfaW5fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X3R1bmluZ19vdXRfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b3B0aWNhbF9yZWZsZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wb3NzaWJsZV9kcmlmdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0xFVkVMX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnBvd2VyX2xldmVsX3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QUVNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHFzaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmFuZ2luZ19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yZWdpc3RyYXRpb25faWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2RpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2ZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdWZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnRpd2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9UVU5JTkdfUkVTUE9OU0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT50dW5pbmdfcmVzcG9uc2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ERkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ER0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ET1dJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0xPT0NJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9MRVZFTF9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1RVTklOR19SRVNQT05TRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZGZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREdJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZGdpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmRvd2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aW52YWxpZF9kYnJ1X3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2VfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0xPT0NJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bG9vY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfYWxhcm0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X2Rpc2FibGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfZW5hYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X3R1bmluZ19pbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vcHRpY2FsX3JlZmxlY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1NTSUJMRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBvc3NpYmxlX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cG93ZXJfY29uc3VtcHRpb25fcmVwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTEVWRUxfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cG93ZXJfbGV2ZWxfcmVwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcXNpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkFOR0lOR19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yYW5naW5nX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TREkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zZGkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zZmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN1ZmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9USVdJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dGl3aSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1RVTklOR19SRVNQT05TRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnR1bmluZ19yZXNwb25zZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ER0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9MT09DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9MRVZFTF9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUFFTSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9UVU5JTkdfUkVTUE9OU0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gPSBCQ01PTFRfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OX0xPV0VSOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl9wYWNrKHRoaXMtPmZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl91bnBhY2soJnRoaXMtPmZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fTE9XRVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fSElHSEVSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb250cm9sID0gQkNNT0xUX1BPV0VSX0xFVkVMTElOR19DT05UUk9MX0RJUkVDVDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0FUVEVOVUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF0dGVudWF0aW9uID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5hdHRlbnVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0FUVEVOVUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sX3VucGFjaygmdGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hdHRlbnVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQVRURU5VQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTEVWRUxMSU5HX0NPTlRST0xfRElSRUNUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTEVWRUxMSU5HX0NPTlRST0xfREVDUkVBU0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9MRVZFTExJTkdfQ09OVFJPTF9JTkNSRUFTRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0NPTlRST0w7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dGFyZ2V0X2RzX3Bvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCA9IDA7CisgICAgICAgIHRoaXMtPnRhcmdldF9kc19wb25faWQuZHdsY2hfaWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9VU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dGFyZ2V0X3VzX3Bvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCA9IDA7CisgICAgICAgIHRoaXMtPnRhcmdldF91c19wb25faWQuZHdsY2hfaWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RJTUVfVE9fU1dJVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRpbWVfdG9fc3dpdGNoID0gNTAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1JPTExCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJvbGxiYWNrID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2lkX3BhY2soJnRoaXMtPnRhcmdldF9kc19wb25faWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9VU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2lkX3BhY2soJnRoaXMtPnRhcmdldF91c19wb25faWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RJTUVfVE9fU1dJVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50aW1lX3RvX3N3aXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1JPTExCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cm9sbGJhY2spKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfRFNfUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RJTUVfVE9fU1dJVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfUk9MTEJBQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2lkX3VucGFjaygmdGhpcy0+dGFyZ2V0X2RzX3Bvbl9pZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfVVNfUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9pZF91bnBhY2soJnRoaXMtPnRhcmdldF91c19wb25faWQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRpbWVfdG9fc3dpdGNoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfUk9MTEJBQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yb2xsYmFjaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9USU1FX1RPX1NXSVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9ST0xMQkFDSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX0RTX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25faWRfYm91bmRzX2NoZWNrKCZ0aGlzLT50YXJnZXRfZHNfcG9uX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfRFNfUE9OX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25faWRfYm91bmRzX2NoZWNrKCZ0aGlzLT50YXJnZXRfdXNfcG9uX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfVVNfUE9OX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnRpbWVfdG9fc3dpdGNoIDwgNTAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RJTUVfVE9fU1dJVENIOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0lEX1NNQV9GTEFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNtYV9mbGFnID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfU01BX0ZMQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zbWFfZmxhZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0lEX1NNQV9GTEFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRVFVRVNUX1JFR0lTVFJBVElPTl9JRF9TTUFfRkxBRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnNtYV9mbGFnKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfU01BX0ZMQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX01BU1RFUl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPm1hc3Rlcl9rZXkuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5tYXN0ZXJfa2V5LmJ5dGVzKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnVmZmVyLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmJ1ZmZlci52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1pYyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUFTVEVSX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3BhY2soJnRoaXMtPm1hc3Rlcl9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3BhY2soJnRoaXMtPmJ1ZmZlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NSUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1pYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX01BU1RFUl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5idWZmZXIpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NQVNURVJfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfdW5wYWNrKCZ0aGlzLT5tYXN0ZXJfa2V5LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3VucGFjaygmdGhpcy0+YnVmZmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5taWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUFTVEVSX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUFTVEVSX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X2JvdW5kc19jaGVjaygmdGhpcy0+bWFzdGVyX2tleSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NQVNURVJfS0VZOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmJ1ZmZlci5sZW4gPiAyMDQ4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9ib3VuZHNfY2hlY2soJnRoaXMtPmJ1ZmZlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9zdGF0ZSA9IEJDTU9MVF9PTlVfT1BFUkFUSU9OX0lOQUNUSVZFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfb3BlcmF0aW9uX3BhY2sodGhpcy0+b251X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+b251X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b251X3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0lOQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0VOQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FXQUtFX0ZSRUU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBhY2tldF90eXBlID0gQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYWxjX2NyYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9wYWNrZXRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wYWNrZXRfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ1ZmZlci5sZW4gPSAwOworICAgICAgICB0aGlzLT5idWZmZXIudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wYWNrZXRfdHlwZV9wYWNrKHRoaXMtPnBhY2tldF90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNhbGNfY3JjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bnVtYmVyX29mX3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfcGFjaygmdGhpcy0+YnVmZmVyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmJ1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wYWNrZXRfdHlwZV91bnBhY2soJnRoaXMtPnBhY2tldF90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNhbGNfY3JjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtYmVyX29mX3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnBhY2tldF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQUNLRVRfVFlQRV9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQUNLRVRfVFlQRV9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfcGFja2V0cyA+IDMyKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBhY2tldF9zaXplID4gMjAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+YnVmZmVyLmxlbiA+IDIwNDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X2JvdW5kc19jaGVjaygmdGhpcy0+YnVmZmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfREVGQVVMVF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF9rZXkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnBsb2FtLmFyciwgMCwgc2l6ZW9mKHRoaXMtPnBsb2FtLmFycikpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX0RFRkFVTFRfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGVmYXVsdF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzQwX3BhY2soJnRoaXMtPnBsb2FtLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9ERUZBVUxUX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0MDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX0RFRkFVTFRfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZGVmYXVsdF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzQwX3VucGFjaygmdGhpcy0+cGxvYW0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9ERUZBVUxUX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0MCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfNDBfYm91bmRzX2NoZWNrKCZ0aGlzLT5wbG9hbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9ydF9pZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y3JjX29rID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wYWNrZXRfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnVmZmVyLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmJ1ZmZlci52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNyY19vaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnBhY2tldF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfcGFjaygmdGhpcy0+YnVmZmVyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3U4X2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y3JjX29rKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl91bnBhY2soJnRoaXMtPmJ1ZmZlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9ib3VuZHNfY2hlY2soJnRoaXMtPmJ1ZmZlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3J0X2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y3JjX29rID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGFja2V0X3NpemUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5idWZmZXIubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YnVmZmVyLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNyY19vaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wYWNrZXRfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmJ1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y3JjX29rKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBhY2tldF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3VucGFjaygmdGhpcy0+YnVmZmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX2JvdW5kc19jaGVjaygmdGhpcy0+YnVmZmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX3RyeF9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fdHJ4X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fdHJ4X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3VucGFjayhiY21vbHRfeGdwb25fdHJ4X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfeGdwb25fbmkpIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLnByb2ZpbGVfdmVyc2lvbiA9IDA7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLmlzX2ZlY19vbiA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclswXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMF0ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMF0ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDIwOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclswXS5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2ggPSAyODYzMzExNTMwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLnByZWFtYmxlX3BhdHRlcm5fbG93ID0gMjg2MzMxMTUzMFVMOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclswXS5wb25fdGFnID0gMDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMF0ubnVtX29mX2d1YXJkX2J5dGVzID0gMTY7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLmlzX3Byb2ZpbGVfdmFsaWQgPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclswXS5idXJzdF9vdmVyaGVhZF9zaXplX2luX3dvcmRzID0gNzg7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLnByb2ZpbGVfdmVyc2lvbiA9IDA7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLmlzX2ZlY19vbiA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsxXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMV0ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMV0ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDk7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLnByZWFtYmxlX3BhdHRlcm5faGlnaCA9IDI4NjMzMTE1MzBVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMV0ucHJlYW1ibGVfcGF0dGVybl9sb3cgPSAyODYzMzExNTMwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLnBvbl90YWcgPSAwOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsxXS5udW1fb2ZfZ3VhcmRfYnl0ZXMgPSAxNjsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMV0uaXNfcHJvZmlsZV92YWxpZCA9IEJDTU9TX1RSVUU7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgPSA1NjsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0ucHJvZmlsZV92ZXJzaW9uID0gMDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0uaXNfZmVjX29uID0gQkNNT1NfVFJVRTsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0uZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMgPSA4OworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsyXS5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoID0gMzAxNTU2MjAwMFVMOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsyXS5kZWxpbWl0ZXJfcGF0dGVybl9sb3cgPSAyOTk5MjU5MDQxVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzJdLnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcyA9IDg7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzJdLnByZWFtYmxlX3JlcGVhdHNfY291bnQgPSAyMDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0ucHJlYW1ibGVfcGF0dGVybl9oaWdoID0gMjg2MzMxMTUzMFVMOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsyXS5wcmVhbWJsZV9wYXR0ZXJuX2xvdyA9IDI4NjMzMTE1MzBVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0ucG9uX3RhZyA9IDA7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzJdLm51bV9vZl9ndWFyZF9ieXRlcyA9IDE2OworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsyXS5pc19wcm9maWxlX3ZhbGlkID0gQkNNT1NfVFJVRTsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0uYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyA9IDc4OworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclszXS5wcm9maWxlX3ZlcnNpb24gPSAwOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclszXS5pc19mZWNfb24gPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclszXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzNdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzNdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbM10ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbM10ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDk7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzNdLnByZWFtYmxlX3BhdHRlcm5faGlnaCA9IDI4NjMzMTE1MzBVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbM10ucHJlYW1ibGVfcGF0dGVybl9sb3cgPSAyODYzMzExNTMwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzNdLnBvbl90YWcgPSAwOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclszXS5udW1fb2ZfZ3VhcmRfYnl0ZXMgPSAxNjsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbM10uaXNfcHJvZmlsZV92YWxpZCA9IEJDTU9TX1RSVUU7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzNdLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgPSA1NjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMF0udHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzBdLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDQyOTQ5NjcyOTVVTDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclswXS50cnhfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclswXS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSA0OworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzBdLnRyeF9yZXNldF9sb2NhdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMF0udHJ4X3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMF0uYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclswXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gMjU1OworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzBdLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclswXS5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gMTsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclswXS5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMjA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMF0uYmNkcl9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzFdLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsxXS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSA0Mjk0OTY3Mjk1VUw7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMV0udHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMV0udHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gNDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsxXS50cnhfcmVzZXRfbG9jYXRpb24gPSAzMzsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsxXS50cnhfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsxXS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzFdLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAyNTU7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMV0uYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzFdLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSAxOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzFdLmJjZHJfcmVzZXRfbG9jYXRpb24gPSAyMzsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsxXS5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMl0udHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzJdLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDQyOTQ5NjcyOTVVTDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsyXS50cnhfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsyXS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSA0OworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzJdLnRyeF9yZXNldF9sb2NhdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMl0udHJ4X3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMl0uYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsyXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gMjU1OworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzJdLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsyXS5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gMTsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsyXS5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMjA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMl0uYmNkcl9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzNdLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclszXS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSA0Mjk0OTY3Mjk1VUw7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbM10udHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbM10udHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gNDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclszXS50cnhfcmVzZXRfbG9jYXRpb24gPSAzMzsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclszXS50cnhfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclszXS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzNdLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAyNTU7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbM10uYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzNdLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSAxOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzNdLmJjZHJfcmVzZXRfbG9jYXRpb24gPSAyMzsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclszXS5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfdHlwZSA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVEhfNzIyMl9QQzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVidWcucnhfcmV2ZXJzZWRfcG9sYXJpdHkgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgICAgICB0aGlzLT5kZWJ1Zy5uZWdfb3V0X2JpdCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yc3NpX25vcm1hbF9jb25maWcucG9sYXJpdHkgPSBCQ01PTFRfUE9MQVJJVFlfTE9XOworICAgICAgICB0aGlzLT5yc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24gPSAzNTsKKyAgICAgICAgdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24gPSBCQ01PTFRfU0lHTl9QT1NJVElWRTsKKyAgICAgICAgdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLnB1bHNlX3dpZHRoID0gODA7CisgICAgICAgIHRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZy5taW5pbXVtX2J1cnN0ID0gMjAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJzc2lfcmFuZ2luZ19jb25maWcuc3RhcnRfb25fZWQgPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5yc3NpX3JhbmdpbmdfY29uZmlnLmZyYW1lX2RlbGF5ID0gMDsKKyAgICAgICAgdGhpcy0+cnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5ID0gMjA7CisgICAgICAgIHRoaXMtPnJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXlfYWZ0ZXJfZWQgPSAwOworICAgICAgICB0aGlzLT5yc3NpX3JhbmdpbmdfY29uZmlnLndvcmRfZGVsYXlfYWZ0ZXJfZWQgPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSA9IEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0JDRFI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnJbMF0gPSA3OworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLmFyclsxXSA9IDc7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMuYXJyWzJdID0gNzsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnJbM10gPSA3OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0FUX0lOSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gNDI5NDk2NzI5NVVMOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gNDI5NDk2NzI5NVVMOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDQyOTQ5NjcyOTVVTDsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyA9IDg7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfbG9jYXRpb24gPSAyOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gNDI5NDk2NzI5NVVMOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDQyOTQ5NjcyOTVVTDsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gNDI5NDk2NzI5NVVMOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyA9IDQ7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMjsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAwOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSAwOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X2xvY2F0aW9uID0gMDsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gMDsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSAwOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9sb2NhdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JFU0VUX09OX0RFTF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc2V0X29uX2RlbF9taXNzID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVkX3N0YXRlLnJlc2V0X29uX2VkX2ZhaWwgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+ZWRfc3RhdGUucmVzZXRfb25fZWRfc3VjY2VzcyA9IEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0lOVkVSVF9FRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbnZlcnRfZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JFU0VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVuZF9vZl9idXJzdF9yZXNldCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUlhfUlNUX1BPTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRyeF9yc3RfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfcGFjaygmdGhpcy0+YnVyc3RfcHJvZmlsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF9wYWNrKCZ0aGlzLT50cmFuc2NlaXZlcl9jb25maWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3RyeF90eXBlX3BhY2sodGhpcy0+dHJhbnNjZWl2ZXJfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3RyeF9kZWJ1Z19wYWNrKCZ0aGlzLT5kZWJ1ZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfcGFjaygmdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9SQU5HSU5HX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnX3BhY2soJnRoaXMtPnJzc2lfcmFuZ2luZ19jb25maWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9wYWNrKCZ0aGlzLT5zZXJkZXNfY29uZmlndXJhdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzRfcGFjaygmdGhpcy0+YnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfQVRfSU5JVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm5fcGFjaygmdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl9wYWNrKCZ0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SRVNFVF9PTl9ERUxfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJlc2V0X29uX2RlbF9taXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2VkX3N0YXRlX3BhY2soJnRoaXMtPmVkX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfSU5WRVJUX0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aW52ZXJ0X2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmVuZF9vZl9idXJzdF9yZXNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUlhfUlNUX1BPTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dHJ4X3JzdF9wb2xhcml0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTUyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTI0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA3OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI5OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0VEX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JFU0VUX09OX0RFTF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0lOVkVSVF9FRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkVTRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X3VucGFjaygmdGhpcy0+YnVyc3RfcHJvZmlsZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X3VucGFjaygmdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3RyeF90eXBlX3VucGFjaygmdGhpcy0+dHJhbnNjZWl2ZXJfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3RyeF9kZWJ1Z191bnBhY2soJnRoaXMtPmRlYnVnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnX3VucGFjaygmdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfdW5wYWNrKCZ0aGlzLT5yc3NpX3JhbmdpbmdfY29uZmlnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl91bnBhY2soJnRoaXMtPnNlcmRlc19jb25maWd1cmF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFX0RFTElNSVRFUl9NQVhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF80X3VucGFjaygmdGhpcy0+YnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl91bnBhY2soJnRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl91bnBhY2soJnRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yZXNldF9vbl9kZWxfbWlzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9lZF9zdGF0ZV91bnBhY2soJnRoaXMtPmVkX3N0YXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9JTlZFUlRfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pbnZlcnRfZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JFU0VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZW5kX29mX2J1cnN0X3Jlc2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSWF9SU1RfUE9MQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT50cnhfcnN0X3BvbGFyaXR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTUyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEyNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9ERUJVRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRV9ERUxJTUlURVJfTUFYX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9JTlZFUlRfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X2JvdW5kc19jaGVjaygmdGhpcy0+YnVyc3RfcHJvZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X2JvdW5kc19jaGVjaygmdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50cmFuc2NlaXZlcl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVEhfNzIyMl9QQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1VTRVJfREVGSU5FRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1dURF9SVFhNMjY2XzcwMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUSF83MjIyX0JDX1BMVVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVEhfNzIyNl9QQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUSF81MzAyX1BDOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfWEdQT05fR0VORVJBTF8xOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfWEdQT05fR0VORVJBTF8yOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRXXzYyN19YX1BDOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfWFBQX1hFX1JfM19DREZCOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9ERUJVRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl90cnhfZGVidWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5kZWJ1ZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5yc3NpX25vcm1hbF9jb25maWcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9SQU5HSU5HX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cnNzaV9yYW5naW5nX2NvbmZpZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfUkFOR0lOR19DT05GSUc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5zZXJkZXNfY29uZmlndXJhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzRfYm91bmRzX2NoZWNrKCZ0aGlzLT5idXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRV9ERUxJTUlURVJfTUFYX0VSUk9SUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0FUX0lOSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX2JvdW5kc19jaGVjaygmdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfRURfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm5fYm91bmRzX2NoZWNrKCZ0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0VEX0ZBSUxVUkU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZWRfc3RhdGVfYm91bmRzX2NoZWNrKCZ0aGlzLT5lZF9zdGF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX0lOU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmluc3RhbmNlID0gQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9JTlNUQU5DRV8wOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF94cG9uX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJkZXNfaW5zdGFuY2VfcGFjayh0aGlzLT5pbnN0YW5jZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94cG9uX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV91bnBhY2soYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyZGVzX2luc3RhbmNlX3VucGFjaygmdGhpcy0+aW5zdGFuY2UsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94cG9uX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfcG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmluc3RhbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TRVJERVNfSU5TVEFOQ0VfSU5TVEFOQ0VfMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9JTlNUQU5DRV8xOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX0lOU1RBTkNFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0EpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfdmdhID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wZiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfTEZQRikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9sZnBmID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2RmZTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGZlMiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9kZmUzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2RmZTQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGZlNSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3ByZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9tYWluID0gNDM7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcG9zdDEgPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3Bvc3QyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wb3N0MyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2FtcCA9IDEyOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yeF92Z2EpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yeF9wZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cnhfbGZwZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cnhfZGZlMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+cnhfZGZlMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+cnhfZGZlMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+cnhfZGZlNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+cnhfZGZlNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50eF9wcmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR4X21haW4pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50eF9wb3N0MSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zOChidWYsIHRoaXMtPnR4X3Bvc3QyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+dHhfcG9zdDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9BTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHhfYW1wKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfVkdBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0EpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cnhfdmdhKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cnhfcGYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJ4X2xmcGYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHhfcHJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50eF9tYWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHhfcG9zdDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zOChidWYsICZ0aGlzLT50eF9wb3N0MikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnR4X3Bvc3QzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnR4X2FtcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9BTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfVkdBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5yeF92Z2EgPiA0NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0E7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfcGYgPiAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2xmcGYgPiA3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0xGUEY7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5yeF9kZmUxID4gNjMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2RmZTIgPCAtMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT5yeF9kZmUyID4gMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2RmZTMgPCAtMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT5yeF9kZmUzID4gMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2RmZTQgPCAtMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT5yeF9kZmU0ID4gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2RmZTUgPCAtMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT5yeF9kZmU1ID4gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHhfcHJlID4gMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHhfbWFpbiA+IDExMikKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnR4X3Bvc3QxID4gNjMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHhfcG9zdDIgPCAtMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+dHhfcG9zdDIgPiAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50eF9wb3N0MyA8IC03KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPnR4X3Bvc3QzID4gNykKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX0FNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHhfYW1wID4gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK2JjbW9zX2Jvb2wgYmNtb2x0X29ial9oYXNfdGFnKGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfb2JqX3RhZyB0YWcpCit7CisgICAgc3dpdGNoIChvYmopCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfTkk6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19BRSk7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfQUUpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9VUzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0FFKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0NIQU5ORUw6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9ERUJVRzoKKyAgICAgICAgICAgIHJldHVybiAoKCh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTikgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTikpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVWSUNFOgorICAgICAgICAgICAgcmV0dXJuICgoKCh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTikgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTikpIHx8ICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfQUUpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTks6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fTElOSzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9OSToKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVM6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUlA6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQSU86CisgICAgICAgICAgICByZXR1cm4gKCgoKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19BRSkpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVDoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0Y6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1c6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRToKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9OSToKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9PTlU6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fVFJYOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlk6CisgICAgICAgICAgICByZXR1cm4gKCgodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0xPR0dFUjoKKyAgICAgICAgICAgIHJldHVybiAoKCh0YWcgPT0gQkNNT0xUX09CSl9UQUdfR1BPTikgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTikpIHx8ICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTikpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTk5JOgorICAgICAgICAgICAgcmV0dXJuICgoKCh0YWcgPT0gQkNNT0xUX09CSl9UQUdfR1BPTikgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTikpIHx8ICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTikpIHx8ICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfQUUpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX05OSV9TRVJERVM6CisgICAgICAgICAgICByZXR1cm4gKCgoKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19BRSkpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gKCgoKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19BRSkpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OOgorICAgICAgICAgICAgcmV0dXJuICgoKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfWEdQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fSVdGOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfWEdQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fTkk6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9UUlg6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUzoKKyAgICAgICAgICAgIHJldHVybiAoKCgodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pIHx8ICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfWEdQT04pKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX0FFKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKiBNYXBsZSBkZXZpY2Ugc2VsZWN0ZWQgYXMgYSB0YXJnZXQgZm9yIENMSSBjb21tYW5kcyAqLworYmNtb2x0X2RldmlkIGN1cnJlbnRfZGV2aWNlOworCisvKiBTeXN0ZW0gbW9kZSAqLworc3RhdGljIGJjbW9sdF9zeXN0ZW1fbW9kZSBkZXZpY2Vfc3lzdGVtX21vZGVbQkNNVFJfTUFYX09MVFNdOworCisvKiogU2V0IHN5c3RlbSBtb2RlCisgKiBccGFyYW1baW5dICBkZXYgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gIHN5c3RlbV9tb2RlICAgIFN5c3RlbSBtb2RlCisgKiBccmV0dXJucyBCQ01fRVJSX09LLCBCQ01fRVJSX05PVF9TVVBQT1JURUQKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N5c3RlbV9tb2RlX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGUpCit7CisgICAgaWYgKGRldiA+PSBCQ01UUl9NQVhfT0xUUykgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICBkZXZpY2Vfc3lzdGVtX21vZGVbZGV2XSA9IHN5c3RlbV9tb2RlOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogR2V0IHN5c3RlbSBtb2RlCisgKiBccGFyYW1baW5dICBkZXYgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gIHN5c3RlbV9tb2RlICAgIFN5c3RlbSBtb2RlCisgKiBccmV0dXJucyBCQ01fRVJSX09LCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X3N5c3RlbV9tb2RlICpzeXN0ZW1fbW9kZSkKK3sKKyAgICBpZiAoZGV2ID49IEJDTVRSX01BWF9PTFRTKSByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICpzeXN0ZW1fbW9kZSA9IGRldmljZV9zeXN0ZW1fbW9kZVtkZXZdOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogTWFwcGluZyBvZiBzeXN0ZW0gbW9kZSB0byBvYmplY3QgdGFnLgorICogVGhpcyBmdW5jdGlvbiBpcyBoYW5kLXdyaXR0ZW4gYW5kIG11c3QgYmUgdXBkYXRlZCB3aGVuZXZlciBhIG5ldyBzeXN0ZW0gbW9kZSBpcyBhZGRlZCBvciBvYmplY3QgdGFncyBjaGFuZ2UuCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29ial90YWdfdmFsaWRfZm9yX3N5c3RlbV9tb2RlKGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSwgYmNtb2x0X29ial90YWcgdGFnKQoreworICAgIHN3aXRjaCAoc3lzdGVtX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YOiAvKiBGYWxsLXRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgICAgICAgICByZXR1cm4gdGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT047CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1g6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUE6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0c6CisgICAgICAgICAgICByZXR1cm4gdGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT047CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzJfWF8xMF9HOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HOgorICAgICAgICAgICAgcmV0dXJuIHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTjsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl84X1hHUE9OXzRfWF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgIHJldHVybiB0YWcgPT0gQkNNT0xUX09CSl9UQUdfR1BPTiB8fCB0YWcgPT0gQkNNT0xUX09CSl9UQUdfWEdQT047CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0FFXzhfWDoKKyAgICAgICAgICAgIHJldHVybiB0YWcgPT0gQkNNT0xUX09CSl9UQUdfQUU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCitiY21vc19ib29sIGJjbW9sdF9vYmplY3RfaXNfc3VwcG9ydGVkKGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSwgYmNtb2x0X29ial9pZCBvYmopCit7CisgICAgYmNtb2x0X29ial90YWcgdGFnOworCisgICAgZm9yICh0YWcgPSAwOyB0YWcgPCBCQ01PTFRfT0JKX1RBR19fTlVNX09GOyB0YWcrKykKKyAgICB7CisgICAgICAgIGlmIChiY21vbHRfb2JqX3RhZ192YWxpZF9mb3Jfc3lzdGVtX21vZGUoc3lzdGVtX21vZGUsIHRhZykgJiYgYmNtb2x0X29ial9oYXNfdGFnKG9iaiwgdGFnKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK2NvbnN0IGNoYXIgKmJjbW9sdF9zeXN0ZW1fbW9kZV9uYW1lKGJjbW9sdF9zeXN0ZW1fbW9kZSBtb2RlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICptb2RlX25hbWVbXSA9IHsgW0JDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YXSA9ICJHUE9OXzE2IiwgW0JDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1hdID0gIkdQT05fOCIsIFtCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fNF9YXSA9ICJHUE9OXzQiLCBbQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1hdID0gIkVQT05fMTYiLCBbQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF0gPSAiRVBPTl84IiwgW0JDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hdID0gIkVQT05fNCIsIFtCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fOF9YXSA9ICJYR1BPTjFfOCIsIFtCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YX0NPRVhJU1RFTkNFX1RETUFdID0gIkVQT05fOF9URE1BIiwgW0JDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQV0gPSAiRVBPTl80X1RETUEiLCBbQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HXSA9ICJFUE9OXzhfMTBHIiwgW0JDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfR10gPSAiRVBPTl80XzEwRyIsIFtCQ01PTFRfU1lTVEVNX01PREVfR1BPTl84X1hHUE9OXzRfWF9DT0VYSVNURU5DRV0gPSAiR1BPTl84X1hHUE9OXzQiLCBbQkNNT0xUX1NZU1RFTV9NT0RFX0FFXzhfWF0gPSAiQUVfOCIsIFtCQ01PTFRfU1lTVEVNX01PREVfWEdTX18yX1hfMTBfR10gPSAiWEdTXzJfMTBHIiwgW0JDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzJfWF8xMF9HXSA9ICJOR1BPTjJfMl8xMEciLCBbQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fOF9YXzJfUF81X0ddID0gIk5HUE9OMl8yXzJfNUciLCBbQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzRfWF0gPSAiWEdQT04xXzQiLCBbQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HXSA9ICJFUE9OXzJfMTBHIiwgfTsKKworICAgIGNvbnN0IGNoYXIgKnVuc2V0ID0gIip1bmNvbmZpZ3VyZWQqIjsKKyAgICBjb25zdCBjaGFyICppbnZhbGlkID0gIippbnZhbGlkKiI7CisKKyAgICBpZiAobW9kZSA+PSBCQ01PTFRfU1lTVEVNX01PREVfX05VTV9PRikKKyAgICB7CisgICAgICAgIHJldHVybiB1bnNldDsKKyAgICB9CisKKyAgICBpZiAobW9kZV9uYW1lW21vZGVdID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gaW52YWxpZDsKKyAgICB9CisKKyAgICByZXR1cm4gbW9kZV9uYW1lW21vZGVdOworfQorCisvKiBYR1BPTiBudW0gb2Ygb251cyAqLworc3RhdGljIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyBkZXZpY2VfeGdwb25fbnVtX29mX29udXNbQkNNVFJfTUFYX09MVFNdOworCisvKiogU2V0IHhncG9uIG51bSBvZiBvbnVzCisgKiBccGFyYW1baW5dICBkZXYgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gIHhncG9uX251bV9vZl9vbnVzICAgIFhHUE9OIG51bSBvZiBvbnVzCisgKiBccmV0dXJucyBCQ01fRVJSX09LLCBCQ01fRVJSX1BBUk0KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3hncG9uX251bV9vZl9vbnVzX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfeGdwb25fbnVtX29mX29udXMgeGdwb25fbnVtX29mX29udXMpCit7CisgICAgaWYgKGRldiA+PSBCQ01UUl9NQVhfT0xUUykgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICBkZXZpY2VfeGdwb25fbnVtX29mX29udXNbZGV2XSA9IHhncG9uX251bV9vZl9vbnVzOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogR2V0IHhncG9uIG51bSBvZiBvbnVzCisgKiBccGFyYW1baW5dICBkZXYgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gIHhncG9uX251bV9vZl9vbnVzICAgIFhHUE9OIG51bSBvZiBvbnVzCisgKiBccmV0dXJucyBCQ01fRVJSX09LLCBCQ01fRVJSX1BBUk0KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3hncG9uX251bV9vZl9vbnVzX2dldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfeGdwb25fbnVtX29mX29udXMgKnhncG9uX251bV9vZl9vbnVzKQoreworICAgIGlmIChkZXYgPj0gQkNNVFJfTUFYX09MVFMpIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgKnhncG9uX251bV9vZl9vbnVzID0gZGV2aWNlX3hncG9uX251bV9vZl9vbnVzW2Rldl07CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX3R5cGVzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4NWIwMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbW9kZWxfdHlwZXMuaApAQCAtMCwwICsxLDQ2OTg3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpZm5kZWYgQkNNT0xUX01PREVMX1RZUEVTX0hfCisjZGVmaW5lIEJDTU9MVF9NT0RFTF9UWVBFU19IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb3NfZXJybm8uaCIKKyNpbmNsdWRlICJiY21vbHRfYnVmLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZy5oIgorI2luY2x1ZGUgImJjbW9sdF9tb2RlbF9kYXRhLmgiCisKKy8qKiBcYWRkdG9ncm91cCBvYmplY3RfbW9kZWwKKyAqIEB7CisgKi8KKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJhZV9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX25pX2tleQoreworICAgIGJjbW9sdF9hZV9uaSBhZV9uaTsgLyoqPCBUaGUgaW5kZXggb2YgYSBzcGVjaWZpYyBBRSBOSSBpbnN0YW5jZSBhcyBzZWVuIGJ5IHRoZSBob3N0LiAqLworfSBiY21vbHRfYWVfbmlfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImFlX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfbmlfY2ZnX2RhdGEKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgIC8qKjwgVGhlIE1BQyBhZGRyZXNzIHVzZWQgZm9yIGFsbCBmcmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBPTFQgb24gdGhlIG5ldHdvcmsuICBUaGlzIHZhbHVlIG11c3QgYmUgc2V0IGJlZm9yZSBBRV9OSSBpcyBmaXJzdCBlbmFibGVkLCBhbmQgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEFFX05JIGlzIGVuYWJsZWQuICovCisgICAgYmNtb2x0X2FlX25pX2VuX3N0YXRlIGFlX25pX2VuOyAvKio8IEluZGljYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBBRSBOSS4gKi8KKyAgICB1aW50MTZfdCBtdHVfMTBnOyAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMTBHIHBhdGguIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgQUVfTkkuICovCisgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyBwcmJzX2dlbmVyYXRvcjsgICAgLyoqPCBEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uICovCisgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgcHJic19jaGVja2VyOyAgICAgICAgLyoqPCBVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9wcmJzX3N0YXR1cyBwcmJzX3N0YXR1czsgICAgICAgICAgICAgICAgIC8qKjwgUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciAqLworfSBiY21vbHRfYWVfbmlfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiYWVfbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9uaV9jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9hZV9uaV9rZXkga2V5OyAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2FlX25pX2NmZ19kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX25pX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9hZV9uaV9lbl9zdGF0ZSIgZ3JvdXAgb2YgdGhlICJhZV9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNldCB0aGUgQUUgTkkgZW5hYmxlIHN0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhCit7CisgICAgYmNtb2x0X2FlX25pX2VuX3N0YXRlIG5ld19zdGF0ZTsgICAgLyoqPCBOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuICovCit9IGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZXRfYWVfbmlfZW5fc3RhdGUiIGdyb3VwIG9mICJhZV9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9hZV9uaV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19rZXkKK3sKKyAgICBiY21vbHRfYWVfbmkgYWVfbmk7IC8qKjwgQUUgTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIGRvd25zdHJlYW0gcGF0aC4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCBieXRlczsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXM7ICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzY0OyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzY1XzEyNzsgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xMjhfMjU1OyAgICAvKio8IFRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzI1Nl81MTE7ICAgIC8qKjwgVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNTEyXzEwMjM7ICAgLyoqPCBUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMTAyNF8xNTE4OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzE1MTlfMjA0NzsgIC8qKjwgVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18yMDQ4XzQwOTU7ICAvKio8IFRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNDA5Nl85MjE2OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzkyMTdfMTYzODM7IC8qKjwgVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBicm9hZGNhc3RfZnJhbWVzOyAgLyoqPCBUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGRhdGFfYnl0ZXM7ICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgbXVsdGljYXN0X2ZyYW1lczsgIC8qKjwgVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCB1bmljYXN0X2ZyYW1lczsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBhYm9ydF9mcmFtZXM7ICAgICAgLyoqPCBOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJhZV9wYXRoX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0Cit7CisgICAgYmNtb2x0X3N0YXQgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXk7ICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAiYWVfcGF0aF9kcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAiYWVfcGF0aF9kcyIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgImFlX3BhdGhfZHMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAiYWVfcGF0aF9kcyIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCBzdGF0OyAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAiYWVfcGF0aF9kcyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiYWVfcGF0aF9kcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJhZV9wYXRoX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleTsgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF91c19rZXkKK3sKKyAgICBiY21vbHRfYWVfbmkgYWVfbmk7IC8qKjwgQUUgTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIHVwc3RyZWFtIHBhdGguICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAiYWVfcGF0aF91cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgYnl0ZXM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzY0OyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc182NV8xMjc7ICAgICAvKio8IFRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzEyOF8yNTU7ICAgIC8qKjwgVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzI1Nl81MTE7ICAgIC8qKjwgVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzUxMl8xMDIzOyAgIC8qKjwgVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xMDI0XzE1MTg7ICAvKio8IFRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzE1MTlfMjA0NzsgIC8qKjwgVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMjA0OF80MDk1OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc180MDk2XzkyMTY7ICAvKio8IFRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzkyMTdfMTYzODM7IC8qKjwgVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgYnJvYWRjYXN0X2ZyYW1lczsgIC8qKjwgVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZGF0YV9ieXRlczsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgbXVsdGljYXN0X2ZyYW1lczsgIC8qKjwgVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgdW5pY2FzdF9mcmFtZXM7ICAgIC8qKjwgVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGFib3J0X2ZyYW1lczsgICAgICAvKio8IFRoZSBudW1iZXIgb2YgYWJvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZmNzX2Vycm9yOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG92ZXJzaXplX2Vycm9yOyAgICAvKio8IFRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgcnVudF9lcnJvcjsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworfSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImFlX3BhdGhfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleTsgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImFlX3BhdGhfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgY2ZnOyAgIC8qKjwgU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJhZV9wYXRoX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX3VzIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgc3RhdDsgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAiYWVfcGF0aF91cyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX3VzIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mICJhZV9wYXRoX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImFlX3BhdGhfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19rZXkga2V5OyAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImNoYW5uZWwiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9jaGFubmVsX2tleQoreworICAgIGJjbW9sdF9wb25fbmkgcG9uX25pOyAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworfSBiY21vbHRfY2hhbm5lbF9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiY2hhbm5lbCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgb3BlcmF0aW9uX2NvbnRyb2w7IC8qKjwgT3BlcmF0aW9uIGNvbnRyb2wuICovCisgICAgdWludDE2X3QgdG9sOyAgIC8qKjwgVHJhbnNtaXQgT3B0aWNhbCBMZXZlbC4gQW4gaW5kaWNhdGlvbiBvZiB0aGUgY3VycmVudCBPTFQgQ1QgdHJhbnNjZWl2ZXIgY2hhbm5lbCBsYXVuY2ggcG93ZXIgaW50byB0aGUgT0ROICovCisgICAgYmNtb2x0X3N5c3RlbV9wcm9maWxlIHN5c3RlbV9wcm9maWxlOyAgICAgICAgICAgLyoqPCBTeXN0ZW0gcHJvZmlsZS4gKi8KKyNkZWZpbmUgQkNNT0xUX0NIQU5ORUxfQ0ZHX0RBVEFfQ0hBTk5FTF9QUk9GSUxFX0xFTiA4CisgICAgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCBjaGFubmVsX3Byb2ZpbGU7ICAgLyoqPCBDaGFubmVsIHByb2ZpbGUuICovCit9IGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImNoYW5uZWwiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9jaGFubmVsX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9jaGFubmVsX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfY2hhbm5lbF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZGVidWciIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZWJ1Z19rZXkKK3sKKyAgICB1aW50MzJfdCByZXNlcnZlZDsgIC8qKjwgUmVzZXJ2ZWQgKHNldCB0byAwKSAqLworfSBiY21vbHRfZGVidWdfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImRlYnVnIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGVidWdfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiBjb25zb2xlX3JlZGlyZWN0aW9uOyAgICAgICAgICAgICAvKio8IExvZyBvdXRwdXQgcmVkaXJlY3Rpb24gKi8KKyAgICB1aW50MzJfdCBpbmRpY2F0aW9uc19kcm9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBpbmRpY2F0aW9ucyBkcm9wcGVkIGR1ZSB0byBjb25nZXN0aW9uIC8gc2hhcGluZy4gKi8KKyAgICB1aW50OF90IGZpbGVfdXNlZF9wZXJjZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEREUiBsb2cgZmlsZSB1c2VkIHBlcmNlbnQgKi8KKyAgICBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnIGFwaV9jYXB0dXJlX2NmZzsgICAgICAgICAgICAgICAgICAvKio8IENvbmZpZ3VyYXRpb24gZm9yIEFQSSBjYXB0dXJlLiAqLworICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyBhcGlfY2FwdHVyZV9zdGF0czsgICAgICAgICAgICAgICAgIC8qKjwgU3RhdGlzdGljcyBvbiB0aGUgbW9zdCByZWNlbnQgQVBJIGNhcHR1cmUuICovCisgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQ7ICAgLyoqPCBDb250cm9scyB3aGF0IHBvcnRpb24gb2YgdGhlIGNhcHR1cmUgYnVmZmVyIGlzIHJldHVybmVkIHdoZW4gcGVyZm9ybWluZyBhIGNmZ19nZXQuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIGFwaV9jYXB0dXJlX2J1ZmZlcjsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgcG9ydGlvbiBvZiB0aGUgY2FwdHVyZSBidWZmZXIgY3VycmVudGx5IHNwZWNpZmllZCBieSBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZC4gKi8KK30gYmNtb2x0X2RlYnVnX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImRlYnVnIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGVidWdfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZWJ1Z19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjbGlfb3V0cHV0IiBncm91cCBvZiB0aGUgImRlYnVnIiBvYmplY3QuIAorICoKKyAqIENMSSBPdXRwdXQgU3RyaW5nIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhCit7CisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIGRhdGE7ICAgIC8qKjwgb3V0cHV0IGRhdGEgKi8KK30gYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjbGlfb3V0cHV0IiBncm91cCBvZiAiZGVidWciIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5OyAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0OworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImZpbGVfYWxtb3N0X2Z1bGwiIGdyb3VwIG9mICJkZWJ1ZyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGwKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImRlYnVnIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgY2xpX291dHB1dDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJjbGlfb3V0cHV0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGZpbGVfYWxtb3N0X2Z1bGw7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZmlsZV9hbG1vc3RfZnVsbCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZGVidWciIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZWJ1Z19hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleTsgICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGVidWdfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjbGlfaW5wdXQiIGdyb3VwIG9mIHRoZSAiZGVidWciIG9iamVjdC4gCisgKgorICogQ0xJIElucHV0IFN0cmluZyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhCit7CisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIGRhdGE7ICAgIC8qKjwgSW5wdXQgU3RyaW5nICovCit9IGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjbGlfaW5wdXQiIGdyb3VwIG9mICJkZWJ1ZyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleTsgICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGVidWdfY2xpX2lucHV0OworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlc2V0X2FwaV9jYXB0dXJlIiBncm91cCBvZiAiZGVidWciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXJ0X2FwaV9jYXB0dXJlIiBncm91cCBvZiAiZGVidWciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0b3BfYXBpX2NhcHR1cmUiIGdyb3VwIG9mICJkZWJ1ZyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2Vfa2V5Cit7CisgICAgdWludDMyX3QgcmVzZXJ2ZWQ7ICAvKio8IFJlc2VydmVkIChzZXQgdG8gMCkuICovCit9IGJjbW9sdF9kZXZpY2Vfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZTsgLyoqPCBTeXN0ZW0gbW9kZSAtIHRoaXMgbXVzdCBiZSBzZXQgYnkgdGhlIGhvc3Qgd2hlbiBpbml0aWFsbHkgcHJvdmlzaW9uaW5nIHRoZSBzeXN0ZW0uICBTZXR0aW5nIHRoaXMgYWxzbyBzZXRzIHRoZSAibm5pX3NwZWVkIiBwcm9wZXJ0eSwgdW5sZXNzIGl0IGlzIG92ZXJyaWRkZW4uICovCisgICAgdWludDMyX3Qga2VlcGFsaXZlX2ludGVydmFsOyAgICAvKio8IEtlZXBhbGl2ZSBJbnRlcnZhbCBpbiBTZWNvbmRzICAoMCA9IERpc2FibGUpICovCisgICAgdWludDMyX3Qga2VlcGFsaXZlX3RvbGVyYW5jZTsgICAvKio8IEhvdyBtYW55IGtlZXBhbGl2ZSBtZXNzYWdlcyBjYW4gYmUgbG9zdCBiZWZvcmUgdHJpZ2dlcmluZyBhIGRpc2Nvbm5lY3Qgc2VxdWVuY2UgICovCisgICAgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gZmlybXdhcmVfc3dfdmVyc2lvbjsgICAgICAgICAgICAgLyoqPCBGaXJtd2FyZSBTVyBWZXJzaW9uICovCisgICAgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiBob3N0X3N3X3ZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgLyoqPCBIb3N0IFNXIFZlcnNpb24gKi8KKyAgICBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gY2hpcF9yZXZpc2lvbjsgICAgICAgICAgICAgICAgICAvKio8IFJldmlzaW9uIG9mIHRoZSBCQ002ODYyMCBkZXZpY2UuICovCisgICAgYmNtb2x0X2RldmljZV9zdGF0ZSBzdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEZXZpY2Ugc3RhdGUgKi8KKyAgICBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyBkZWJ1ZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERldmljZSBjb25maWd1cmF0aW9uIGRlYnVnIHBhcmFtZXRlcnMgKi8KKyAgICBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCBubmlfc3BlZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNwZWVkIG9mIHRoZSBOTkkgaW50ZXJmYWNlLiAgVGhpcyBpcyBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgInN5c3RlbV9tb2RlIiBwcm9wZXJ0eSBpcyBzZXQsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgaG9zdC4gKi8KKyAgICBiY21vbHRfZXh0X2lycSBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxOyAgICAgICAgICAgICAgICAvKio8IFRoZSBzZWxlY3RlZCBleHRlcm5hbCBJUlEgZm9yIHByb3RlY3Rpb24gc3dpdGNoaW5nICovCisgICAgdWludDMyX3QgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5OyAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdGltZSAoaW4gVFEpIHRoYXQgaXQgdGFrZXMgZnJvbSB3aGVuIGEgcHVsc2UgaXMgZ2VuZXJhdGVkIGF0IHRoZSBleHRlcm5hbCBzb3VyY2UgdG8gd2hlbiB3ZSBzYW1wbGUgaXQuICovCisgICAgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyBpbmRpY2F0aW9uX3NoYXBpbmc7ICAgICAgICAgICAgICAgLyoqPCBTaGFwaW5nIC8gcmF0ZSBsaW1pdGluZyBmb3IgdGhlIGluZGljYXRpb24gY2hhbm5lbC4gKi8KKyAgICB1aW50MzJfdCBjaGlwX3RlbXBlcmF0dXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgZGllIHRlbXBlcmF0dXJlLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGdwb25feGdwb25fdG9kX2VuYWJsZTsgICAgICAgICAgICAgICAgIC8qKjwgR1BPTi9YR1BPTiBUb0QgY29udHJvbCBzdGF0ZSAqLworICAgIGJjbW9sdF9ncGlvX3BpbiBncG9uX3hncG9uX3RvZF9ncGlvX3BpbjsgICAgICAgICAgICAgICAgICAgIC8qKjwgR1BPTi9YR1BPTiBUb0QgR0lPIHBpbiAqLworICAgIGJjbW9zX2Jvb2wgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHk7ICAgICAgICAgICAgIC8qKjwgR1BPTi9YR1BPTiBpcyBUb0QgaW50ZXJuYWxseSAqLworICAgIGJjbW9sdF9zdHJfMjU2IGVwb25fODAyMV9hc190b2RfZm9ybWF0OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGZvcm1hdCBvZiB0aGUgODAyLjFBUyBUb0Qgc3RyaW5nLiAqLworICAgIGJjbW9sdF9zaGFwZXJfbW9kZSBlcG9uX3NoYXBlcl9tb2RlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29udHJvbHMgRVBPTiBzaGFwZXIgYmVoYXZpb3IuICovCisgICAgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggZW1iZWRkZWRfaW1hZ2VfbGlzdDsgICAgLyoqPCBMaXN0IG9mIGFsbCBmaWxlIGltYWdlcyBzdG9yZWQgaW4gdGhlIE9MVC4gKi8KKyAgICB1aW50MzJfdCBjaGlwX3ZvbHRhZ2U7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2hpcCB2b2x0YWdlIGluIG1WICovCisgICAgYmNtb2x0X3N0cl8yNTYgZXBvbl90b2Rfc3RyaW5nOyAgICAgICAgICAgICAvKio8IFRoZSBjdXJyZW50IFRvRCBzdHJpbmcgdG8gYmUgdXNlZCBmb3IgY2xvY2sgdHJhbnNwb3J0IChFUE9OIG9ubHkpLiAqLworICAgIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyB4Z3Bvbl9udW1fb2Zfb251czsgLyoqPCB4Z3BvbiBudW0gb2Ygb251cy4gKi8KKyAgICBiY21vc19pcHY0X2FkZHJlc3MgZGV2aWNlX2lwX2FkZHJlc3M7ICAgICAgIC8qKjwgVGhlIElQIEFkZHJlc3Mgb2YgdGhlIGRldmljZSAqLworICAgIHVpbnQxNl90IGRldmljZV91ZHBfcG9ydDsgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgVURQIHBvcnQgb2YgdGhlIERldmljZSAqLworICAgIGJjbW9sdF91YXJ0X2JhdWRyYXRlIHRvZF91YXJ0X2JhdWRyYXRlOyAgICAgLyoqPCBVQVJUIGJhdWQgcmF0ZSAqLworICAgIHVpbnQ4X3QgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aDsgICAgICAgLyoqPCBHUE9OL1hHUE9OIFRvRCBzdHJpbmcgbGVuZ3RoICovCit9IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGV2aWNlX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNvbm5lY3Rpb25fY29tcGxldGUiIGdyb3VwIG9mIHRoZSAiZGV2aWNlIiAKKyAqIG9iamVjdC4gCisgKgorICogVGhlIGhvc3Qgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB0aGUgZGV2aWNlLiAgVGhlIGRldmljZSBoYXMgZWl0aGVyIGJlZW4gCisgKiByZXByb2dyYW1tZWQgd2l0aCBuZXcgZmlybXdhcmUsIG9yIGEgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQgd2l0aCBhbiAKKyAqIGV4aXN0aW5nIGRldmljZSAoc2VlIHRoZSAic3RhbmRhbG9uZSIgZmllbGQpLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEKK3sKKyAgICBiY21vc19ib29sIHN0YW5kYWxvbmU7ICAvKio8IElmIHRydWUsIHRoZSBkZXZpY2Ugd2FzIHByZXZpb3VzbHkgcnVubmluZyBpbiBzdGFuZGFsb25lIG1vZGUgYmVmb3JlIHRoaXMgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQuICBJZiBmYWxzZSwgdGhlIGRldmljZSB3YXMgYm9vdGVkIGZyb20gcmVzZXQgd2l0aCBuZXcgZmlybXdhcmUsIGV0Yy4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY29ubmVjdGlvbl9jb21wbGV0ZSIgZ3JvdXAgb2YgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNvbm5lY3Rpb25fZXN0YWJsaXNoZWQiIGdyb3VwIG9mICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY29ubmVjdGlvbl9mYWlsdXJlIiBncm91cCBvZiB0aGUgImRldmljZSIgCisgKiBvYmplY3QuIAorICoKKyAqIFRoZSBob3N0IGZhaWxlZCB0byBjb25uZWN0IHRvIHRoZSBkZXZpY2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhCit7CisgICAgYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiByZWFzb247ICAvKio8IENvbm5lY3Rpb24gZmFpbCByZWFzb24uICovCit9IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY29ubmVjdGlvbl9mYWlsdXJlIiBncm91cCBvZiAiZGV2aWNlIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJkZHJfdGVzdF9jb21wbGV0ZSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqCisgKiBUaGUgRERSIFRlc3QgaGFzIGNvbXBsZXRlZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhCit7CisgICAgYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCBkZHJfdGVzdDsgLyoqPCBSZXN1bHRzIG9mIHRoZSBERFIgVGVzdCAqLworfSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGRyX3Rlc3RfY29tcGxldGUiIGdyb3VwIG9mICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJkZXZpY2Vfa2VlcF9hbGl2ZSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqCisgKiBLZWVwIGFsaXZlIG1lc3NhZ2UgZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBob3N0IC0gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgCisgKiBsaWJyYXJ5IChub3Qgc2VudCB0byB0aGUgaG9zdCBhcHBsaWNhdGlvbikuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEKK3sKKyAgICB1aW50MzJfdCBzZXF1ZW5jZV9udW1iZXI7ICAgLyoqPCBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB1aW50MzJfdCB0aW1lX3N0YW1wOyAgICAgICAgLyoqPCB0aW1lIHN0YW1wICovCit9IGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkZXZpY2Vfa2VlcF9hbGl2ZSIgZ3JvdXAgb2YgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImRldmljZV9yZWFkeSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIG9iamVjdC4gCisgKgorICogRGV2aWNlIHJlYWR5IGluZGljYXRpb24gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAobm90IHNlbnQgdG8gdGhlIAorICogaG9zdCBhcHBsaWNhdGlvbikuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhCit7CisgICAgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gZmlybXdhcmVfc3dfdmVyc2lvbjsgLyoqPCBTb2Z0d2FyZSBWZXJzaW9uLiAqLworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZTsgICAgICAgICAgICAgICAgIC8qKjwgU3lzdGVtIE1vZGUuICovCisgICAgYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgbm5pX3NwZWVkOyAgICAgICAgICAgICAgLyoqPCBOTkkgU3BlZWQuICovCisgICAgYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uIGNoaXBfcmV2aXNpb247ICAgICAgLyoqPCBDaGlwIFJldmlzaW9uLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHRvZF9lbmFibGU7ICAgICAgICAgICAgICAgIC8qKjwgVG9EIGNvbnRyb2wuICovCisgICAgYmNtb2x0X2dwaW9fcGluIHRvZF9ncGlvX3BpbjsgICAgICAgICAgICAgICAgICAgLyoqPCBHUElPIHBpbiBpcyB1c2VkIHdoZW4gVG9EIFVBUlQgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUgZW1iZWRkZWQsIGFuZCBUT0QgdmFsdWUgaXMgb2J0YWluZWQgYnkgdGhlIGhvc3QuICovCit9IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGV2aWNlX3JlYWR5IiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkaXNjb25uZWN0aW9uX2NvbXBsZXRlIiBncm91cCBvZiAiZGV2aWNlIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIiBncm91cCBvZiB0aGUgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEKK3sKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZTsgICAgLyoqPCBJbWFnZSB0eXBlLiAqLworICAgIHVpbnQzMl90IGJsb2NrX251bWJlcjsgICAgICAgICAgICAgICAgICAvKio8IEJsb2NrIG51bWJlci4gKi8KKyAgICBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1czsgICAgLyoqPCBJbWFnZSB0cmFuc2ZlciBzdGF0dXMuICovCit9IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSIgZ3JvdXAgb2YgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaW5kaWNhdGlvbnNfZHJvcHBlZCIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gaW5kaWNhdGlvbnMgYXJlIGRyb3BwZWQgZHVlIHRvIGNvbmdlc3Rpb24gLyBzaGFwaW5nLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEKK3sKKyAgICB1aW50MzJfdCB0b3RhbF9jb3VudDsgICAvKio8IFRvdGFsIG51bWJlciBvZiBpbmRpY2F0aW9ucyBkcm9wcGVkIHNpbmNlIHRoZSBzeXN0ZW0gd2FzIHN0YXJ0ZWQuICovCit9IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImluZGljYXRpb25zX2Ryb3BwZWQiIGdyb3VwIG9mICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN3X2Vycm9yIiBncm91cCBvZiB0aGUgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhCit7CisgICAgYmNtb2x0X3N0cl8xMDAgdGFza19uYW1lOyAgIC8qKjwgdGFzayBuYW1lLiAqLworICAgIGJjbW9sdF9zdHJfMTAwIGZpbGVfbmFtZTsgICAvKio8IGZpbGUgbmFtZS4gKi8KKyAgICB1aW50MzJfdCBsaW5lX251bWJlcjsgICAgICAgLyoqPCBsaW5lIG51bWJlci4gKi8KKyAgICB1aW50OF90IHBvbl9uaTsgICAgICAgICAgICAgLyoqPCBwb25fbmkuICovCit9IGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzd19lcnJvciIgZ3JvdXAgb2YgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9zd19lcnJvcgoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3dfZXhjZXB0aW9uIiBncm91cCBvZiB0aGUgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YQoreworICAgIHVpbnQ4X3QgY3B1X2lkOyAgICAgICAgIC8qKjwgQ1BVIElELiAqLworICAgIGJjbW9sdF9zdHJfMjAwMCB0ZXh0OyAgIC8qKjwgdGV4dC4gKi8KK30gYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzd19leGNlcHRpb24iIGdyb3VwIG9mICJkZXZpY2UiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBjb25uZWN0aW9uX2NvbXBsZXRlOyAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJjb25uZWN0aW9uX2NvbXBsZXRlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGNvbm5lY3Rpb25fZXN0YWJsaXNoZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImNvbm5lY3Rpb25fZXN0YWJsaXNoZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgY29ubmVjdGlvbl9mYWlsdXJlOyAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiY29ubmVjdGlvbl9mYWlsdXJlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRkcl90ZXN0X2NvbXBsZXRlOyAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRkcl90ZXN0X2NvbXBsZXRlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRldmljZV9rZWVwX2FsaXZlOyAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRldmljZV9rZWVwX2FsaXZlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRldmljZV9yZWFkeTsgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRldmljZV9yZWFkeSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBkaXNjb25uZWN0aW9uX2NvbXBsZXRlOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJkaXNjb25uZWN0aW9uX2NvbXBsZXRlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGltYWdlX3RyYW5zZmVyX2NvbXBsZXRlOyAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGluZGljYXRpb25zX2Ryb3BwZWQ7ICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImluZGljYXRpb25zX2Ryb3BwZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3dfZXJyb3I7ICAgICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3dfZXJyb3IiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3dfZXhjZXB0aW9uOyAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3dfZXhjZXB0aW9uIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZXZpY2VfYXV0b19jZmc7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY29ubmVjdCIgZ3JvdXAgb2YgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9jb25uZWN0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0OworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImRpc2Nvbm5lY3QiIGdyb3VwIG9mICJkZXZpY2UiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImhvc3Rfa2VlcF9hbGl2ZSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIG9iamVjdC4gCisgKgorICogS2VlcCBhbGl2ZSBtZXNzYWdlIGZyb20gdGhlIGhvc3QgdG8gdGhlIGRldmljZSAtIHVzZWQgYnkgdGhlIGRldmljZSBjb250cm9sIAorICogbGlicmFyeSAoc2hvdWxkIG5vdCBiZSBzZW50IGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uKS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEKK3sKKyAgICB1aW50MzJfdCBzZXF1ZW5jZV9udW1iZXI7ICAgLyoqPCBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB1aW50MzJfdCB0aW1lX3N0YW1wOyAgICAgICAgLyoqPCB0aW1lIHN0YW1wICovCit9IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiaG9zdF9rZWVwX2FsaXZlIiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZQoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaW1hZ2VfdHJhbnNmZXJfZGF0YSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqCisgKiB1c2VkIGZvciB0cmFuc2ZlcnJpbmcgdGhlIGFjdHVhbCBkYXRhIGZyb20vdG8gdGhlIE9MVC4gICBub3QgdG8gYmUgZGlyZWN0bHkgCisgKiBjYWxsZWQgYnkgdGhlIHVzZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YQoreworICAgIHVpbnQzMl90IGJsb2NrX251bWJlcjsgICAgICAgICAgLyoqPCBCbG9jayBudW1iZXIuICovCisgICAgYmNtb3NfYm9vbCBtb3JlX2RhdGE7ICAgICAgICAgICAvKio8IFNwZWNpZmllcyB0aGF0IHRoZXJlIGFyZSBtb3JlIGRhdGEgdG8gY29tZS4gKi8KKyAgICBiY21vbHRfdThfbGlzdF91MTZfaGV4IGRhdGE7ICAgIC8qKjwgRGF0YS4gKi8KK30gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiaW1hZ2VfdHJhbnNmZXJfZGF0YSIgZ3JvdXAgb2YgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGEKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaW1hZ2VfdHJhbnNmZXJfc3RhcnQiIGdyb3VwIG9mIHRoZSAiZGV2aWNlIiAKKyAqIG9iamVjdC4gCisgKgorICogVGhpcyBBUEkgbWVzc2FnZSBpbmZvcm1zIHRoZSBPTFQgb2YgdGhlIHN0YXJ0IG9mIGltYWdlIHRyYW5zZmVyLCBhbmQgCisgKiBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGZpbGUgaW1hZ2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEKK3sKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZTsgICAgLyoqPCBGaWxlIHR5cGUuICovCisgICAgdWludDMyX3QgaW1hZ2Vfc2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZmlsZSBpbWFnZS4gIElnbm9yZWQgZm9yIFJSUSBvcGVyYXRpb24uICovCisgICAgdWludDMyX3QgY3JjMzI7ICAgICAgICAgICAgIC8qKjwgQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIGVudGlyZSBmaWxlIGltYWdlLiAqLworICAgIGJjbW9sdF9zdHJfNjQgaW1hZ2VfbmFtZTsgICAvKio8IE5hbWUgb2YgdGhlIGZpbGUgaW1hZ2UuICBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIERQb0UgT05VIG9ubHkuICBEUG9FIHJlcXVpcmVzIHRoZSB3cml0ZSByZXF1ZXN0IE9BTSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gKi8KK30gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImltYWdlX3RyYW5zZmVyX3N0YXJ0IiBncm91cCBvZiAiZGV2aWNlIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnQKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJlc2V0IiBncm91cCBvZiB0aGUgImRldmljZSIgb2JqZWN0LiAKKyAqCisgKiBSZXNldHMgdGhlIGhvc3QvZGV2aWNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhCit7CisgICAgYmNtb2x0X2RldmljZV9yZXNldF9tb2RlIG1vZGU7ICAvKio8IE9wdGlvbnMgdG8gY29udHJvbCB3aGF0IHNob3VsZCBiZSByZXNldC4gKi8KK30gYmNtb2x0X2RldmljZV9yZXNldF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlc2V0IiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX3Jlc2V0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZXZpY2VfcmVzZXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJydW5fZGRyX3Rlc3QiIGdyb3VwIG9mIHRoZSAiZGV2aWNlIiBvYmplY3QuIAorICoKKyAqIFJ1biBhIHRlc3Qgb24gb25lIG9yIG1vcmUgb2YgdGhlIEREUiBjb21wb25lbnRzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgY3B1OyAgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCB0byB0ZXN0IHRoZSBDUFUgRERSICovCisgICAgYmNtb3NfYm9vbCByYXNfMDsgICAvKio8IFdoZXRoZXIgb3Igbm90IHRvIHRlc3QgUkFTIDAgRERSICovCisgICAgYmNtb3NfYm9vbCByYXNfMTsgICAvKio8IFdoZXRoZXIgb3Igbm90IHRvIHRlc3QgUkFTIDEgRERSICovCit9IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicnVuX2Rkcl90ZXN0IiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3Q7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3dfdXBncmFkZV9hY3RpdmF0ZSIgZ3JvdXAgb2YgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZXBvbl9kZW5pZWRfbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5Cit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsgICAgICAgICAvKio8IFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEVQT04gTkkgY29udGFpbmluZyB0aGUgbGluay4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgIC8qKjwgVGhlIE1BQyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRVBPTiBsaW5rLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9kZW5pZWRfbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsgICAgLyoqPCBUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIGxpbmsuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAibGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKgorICogVGhpcyBpcyB3aGVuIGEgbGluayB0cmllcyB0byByZWlnc3RlciB3aXRoIGFuIGltcG9zc2libGUgbGFzZXIgb24gb3Igb2ZmIAorICogdGltZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YQoreworICAgIGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzIGFsYXJtX3N0YXR1czsgICAgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIiBncm91cCBvZiAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9kZW5pZWRfbGluayIgb2JqZWN0LiAKKyAqCisgKiBBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgYW5kIGl0IHRoZXJlIGFyZSBubyBMTElEcyBhdmFpbGFibGUuIElmIHRoaXMgCisgKiBvY2N1cnMsIGl0IGlzIHBvc3NpYmxlIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggeW91ciAnbWF4IGxpbmtzJyBhbmQvb3IgJ0Jhc2UgCisgKiBMTElEJyBmaWVsZHMgb24geW91ciBSUC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24iIGdyb3VwIG9mIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24KK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJtYXhfbGlua192aW9sYXRpb24iIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICoKKyAqIEEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgaXQgd291bGQgaGF2ZSBwdXQgdXMgb3ZlciB0aGUgcHJvdmlzaW9uZWQgbWF4IAorICogbGlua3MgZm9yIHRoZSBjb3JyZXNwb25kaW5nIEVQT04gTkkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibWF4X2xpbmtfdmlvbGF0aW9uIiBncm91cCBvZiAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb24KK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKgorICogVGhpcyBpcyB3aGVuIGxpbmsgdHJpZXMgdG8gcmVnaXN0ZXIgYW5kIHRoZXJlIGFyZSBhbHJlYWR5IHRvbyBtYW55IGV4aXN0aW5nIAorICogbGFzZXIgb24vb2ZmIGNvbWJpbmF0aW9ucy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBzdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iIGdyb3VwIG9mIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJhbmdlX3Zpb2xhdGlvbiIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKgorICogQSBsaW5rIHRyaWVkIHRvIHJlZ2lzdGVyIHdpdGggYSByYW5nZSB2YWx1ZSB0aGF0IHdhcyBvdXRzaWRlIG9mIHRoZSBtaW4vbWF4IAorICogZmliZXIgbGVuZ3RoLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEKK3sKKyAgICBiY21vbHRfcmFuZ2Vfc3RhdHVzIGFsYXJtX3N0YXR1czsgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicmFuZ2VfdmlvbGF0aW9uIiBncm91cCBvZiAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb24KK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJvZ3VlX3Zpb2xhdGlvbiIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKgorICogQSBSb2d1ZSBPTlUgd2FzIGRldGVjdGVkIG9uIHRoaXMgbGluay9MTElELiAgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX3N0YXR1cyBhbGFybV9zdGF0dXM7ICAgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX3Zpb2xhdGlvbiIgZ3JvdXAgb2YgCisgKiAiZXBvbl9kZW5pZWRfbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9kZW5pZWRfbGluayIgb2JqZWN0LiAKKyAqCisgKiBBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgYW5kIHdlIHdlcmUgdW5hYmxlIHRvIGFsbG9jYXRlIHN5c3RlbSByZXNvdXJjZXMgZm9yIAorICogaXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIiBncm91cCBvZiAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAidGRtX2NoYW5uZWxzX2V4aGF1c3RlZCIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInRkbV9jaGFubmVsc19leGhhdXN0ZWQiIGdyb3VwIG9mIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInVua25vd25fbGlua192aW9sYXRpb24iIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICoKKyAqIEEgbGluayB0cmllZCB0byByZWdpc3RlciB3aGlsZSB0aGUgUE9OIHdhcyBzZXQgdG8gIm5vdGlmeSB1bmtub3duIiAKKyAqIHJlZ2lzdHJhdGlvbiBiZWhhdmlvciBhbmQgdGhpcyBsaW5rIHdhcyBub3QgcHJlLXByb3Zpc2lvbmVkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhCit7CisgICAgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgYWxhcm1fc3RhdHVzOyAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInVua25vd25fbGlua192aW9sYXRpb24iIGdyb3VwIG9mIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb24KK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICoKKyAqIFRoaXMgbGluayBmYWlsZWQgdG8gcmVnaXN0ZXIgYmVjYXVzZSB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IHVwc3RyZWFtIAorICogYmFuZHdpZHRoIGF2YWlsYWJsZSB0byBwcm92aWRlIHRoZSBkZWZhdWx0IFVCRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iIGdyb3VwIG9mIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24KK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX2RlbmllZF9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIGxhc2VyX29uX29mZl92aW9sYXRpb247ICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uOyAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbWF4X2xpbmtfdmlvbGF0aW9uOyAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJtYXhfbGlua192aW9sYXRpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb247ICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByYW5nZV92aW9sYXRpb247ICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJhbmdlX3Zpb2xhdGlvbiIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByb2d1ZV92aW9sYXRpb247ICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJvZ3VlX3Zpb2xhdGlvbiIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uOyAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgdGRtX2NoYW5uZWxzX2V4aGF1c3RlZDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHVua25vd25fbGlua192aW9sYXRpb247ICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAidW5rbm93bl9saW5rX3Zpb2xhdGlvbiIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uOyAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZXBvbl9kZW5pZWRfbGluayIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXk7ICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5Cit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsgICAgICAgICAvKio8IFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEVQT04gTkkgY29udGFpbmluZyB0aGUgbGluay4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgIC8qKjwgVGhlIE1BQyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRVBPTiBsaW5rLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX3JhdGUgbGlua19yYXRlOyAgICAgICAgICAgIC8qKjwgVGhpcyBsaW5rJ3MgZG93bnN0cmVhbSBhbmQgdXBzdHJlYW0gcmF0ZS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzIHN0YXRlX2ZsYWdzOyAgIC8qKjwgRVBPTiBsaW5rIHN0YXRlIGZsYWdzIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBsaW5rLiAgIFJlZ2lzdGVyZWQgc3RhdGUgZmxhZyBpcyBjb250cm9sZWQgYnkgdGhlIHN0YXRpYyByZWdpc3RyYXRpb24gb3BlcmF0aW9uIGZvciBsaW5rcyBvbiBhIHByb3RlY3RlZC1zdGFuZGJ5IFBPTi4gKi8KKyAgICBiY21vbHRfZXBvbl9sbGlkIGxsaWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTExJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaW5rLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBsYXNlcl9vbl90aW1lX3RxOyAgICAgICAgLyoqPCBMYXNlci1vbiB0aW1lIGluIHRpbWUgcXVhbnRhLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBsYXNlcl9vZmZfdGltZV90cTsgICAgICAgLyoqPCBMYXNlci1vZmYgdGltZSBpbiB0aW1lIHF1YW50YS4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgcmFuZ2VfdmFsdWVfdHE7ICAgICAgICAgIC8qKjwgUmFuZ2UgdmFsdWUgdXNlZCBmb3IgdGhpcyBsaW5rIC0gaW4gdGltZSBxdWFudGEuICovCisgICAgYmNtb2x0X21ldGVycyBkaXN0YW5jZTsgICAgICAgICAgICAgICAgICAgICAvKio8IERpc3RhbmNlIHRvIHRoZSBPTlUgKERpZmZlcnMgZnJvbSByYW5nZSB2YWx1ZSBpbiB0aGF0IHRoaXMgaWdub3JlcyBpbnRlcm5hbCBkZWxheXMpICovCisgICAgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsgICAvKio8IFRoZSBzdGF0ZSBvZiB0aGUgYWxhcm1zIG9uIHRoaXMgbGluay4gKi8KKyAgICBiY21vbHRfZXBvbl90dW5uZWxfaWQgdHVubmVsX2lkOyAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0gYW5kIGRvd25zdHJlYW0gdHVubmVsIElEIGZvciB0aGlzIGxpbmsuICovCisgICAgYmNtb2x0X2Vwb25fb251X2lkIG9udV9pZDsgICAgICAgICAgICAgICAgICAvKio8IE9OVSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFUE9OIGxpbmsuICBBIHZhbHVlIG9mIDB4RkYgaW5kaWNhdGVzIHRoYXQgdGhlIGxpbmsgaGFzIG5vdCBiZWVuIGFzc29jaWF0ZWQgd2l0aCBhbiBPTlUuICovCisgICAgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyBtaW5fbGFzZXJfb3ZlcmhlYWQ7ICAgLyoqPCBGb3IgMUcgT05VcyAsdGhlc2UgdmFsdWVzIHdpbGwgb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIHZhbHVlcyBvZiAzMi4gKi8KKyAgICBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIGtleV9leGNoYW5nZV9jb25maWc7ICAgICAgICAvKio8IEVuY3J5cHRpb24ga2V5IGV4Y2hhbmdlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgbGluay4gKi8KKyAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyBlcG9uX2VuY3J5cHRpb247ICAgICAgICAgICAgICAvKio8IEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhpcyBsaW5rLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuIGZlY19lbmFibGU7ICAgICAgICAgICAgICAgICAvKio8IEZFQyBlbmFibGUgc3RhdGUgZm9yIHRoaXMgbGluay4gKi8KKyAgICBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgb2FtX2hlYXJ0YmVhdF9jb25maWc7ICAgLyoqPCBPQU0gaGVhcnRiZWF0IGNvbmZpZ3VyYXRpb24uICBUaGlzIGluY2x1ZGVzIHRoZSBmcmFtZSB0byB0cmFuc21pdCB0byB0aGUgbGluaywgYW5kIHRoZSBleHBlY3RlZCBmcmFtZS9tYXNrIGZyb20gdGhlIE9OVS4gICAqLworICAgIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHVwc3RyZWFtX2JhbmR3aWR0aDsgIC8qKjwgVXBzdHJlYW0gQmFuZHdpZHRoLiAqLworICAgIGJjbW9sdF91YmRfaW5mbyB1YmRfaW5mbzsgICAgICAgICAgIC8qKjwgUmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBVQkQuIFVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzZWUgd2hhdCB2YWx1ZSB0aGUgZmlybXdhcmUgY2hvc2UgZm9yIGEgZmllbGQgc2V0IHRvICdhdXRvbWF0aWMnLiAqLworICAgIGJjbW9zX2Jvb2wgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZTsgIC8qKjwgV2hldGhlciBvciBub3QgdG8gZW5hYmxlIGNsb2NrIHRyYW5zcG9ydCBvbiB0aGlzIGxpbmsuICovCisgICAgdWludDhfdCBwZW5kaW5nX2dyYW50czsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgZ3JhbnRzLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfdHlwZSBsaW5rX3R5cGU7ICAgIC8qKjwgTGluayBUeXBlLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImVwb25fbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0IiBncm91cCBvZiB0aGUgImVwb25fbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCByeF9kYXRhX2J5dGVzOyAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KKyAgICB1aW50NjRfdCByeF9kYXRhX2ZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZGF0YSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzY0OyAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzY1XzEyNzsgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHJ4X2ZyYW1lc18xMjhfMjU1OyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzI1Nl81MTE7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfNTEyXzEwMjM7ICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfMTAyNF8xNTE4OyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzE1MTlfMjA0NzsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHJ4X2ZyYW1lc18yMDQ4XzQwOTU7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfNDA5Nl85MjE2OyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzkyMTdfMTYzODM7ICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCByeF9vYW1fYnl0ZXM7ICAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiAqLworICAgIHVpbnQ2NF90IHJ4X29hbV9mcmFtZXM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiAqLworICAgIHVpbnQ2NF90IHJ4X21wY3BfZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KKyAgICB1aW50NjRfdCByeF9icm9hZGNhc3RfZnJhbWVzOyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KKyAgICB1aW50NjRfdCByeF91bmljYXN0X2ZyYW1lczsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgcnhfbXVsdGljYXN0X2ZyYW1lczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgcnhfcmVwb3J0X2ZyYW1lczsgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJlcG9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgcnhfZmNzX2Vycm9yOyAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3Qgcnhfb3ZlcnNpemVfZXJyb3I7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHJ4X3J1bnRfZXJyb3I7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHJ4X2xpbmVfY29kZV9lcnJvcjsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBsaW5lIGNvZGUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgcnhfbGluZV9jb2RlX2Vycm9yX21heDsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGxpbmUgY29kZSBlcnJvcnMgbWF4IHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgdHhfZGF0YV9ieXRlczsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgdHhfZGF0YV9mcmFtZXM7ICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc182NDsgICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc182NV8xMjc7ICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfMTI4XzI1NTsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc18yNTZfNTExOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgdHhfZnJhbWVzXzUxMl8xMDIzOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgdHhfZnJhbWVzXzEwMjRfMTUxODsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc18xNTE5XzIwNDc7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfMjA0OF80MDk1OyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgdHhfZnJhbWVzXzQwOTZfOTIxNjsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc185MjE3XzE2MzgzOyAgICAgIC8qKjwgVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgdHhfb2FtX2J5dGVzOyAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KKyAgICB1aW50NjRfdCB0eF9vYW1fZnJhbWVzOyAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KKyAgICB1aW50NjRfdCB0eF9tcGNwX2ZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgdHhfYnJvYWRjYXN0X2ZyYW1lczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgdHhfdW5pY2FzdF9mcmFtZXM7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiAqLworICAgIHVpbnQ2NF90IHR4X211bHRpY2FzdF9mcmFtZXM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiAqLworICAgIHVpbnQ2NF90IHR4X2dhdGVzOyAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBnYXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImVwb25fbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19zdGF0Cit7CisgICAgYmNtb2x0X3N0YXQgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImVwb25fbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0IiBncm91cCBvZiAKKyAqIHRoZSAiZXBvbl9saW5rIiBvYmplY3QuIAorICoKKyAqIEEgcmVnaXN0ZXIgcmVxdWVzdGVkIHdhcyByZWNlaXZlZCBmb3IgYSBsaW5rIHdpdGggdGhlIHNhbWUgTUFDIGFkZHJlc3MgYXMgYSAKKyAqIGxpbmsgdGhhdCBoYXMgYWxyZWFkeSByZWdpc3RlcmVkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhCit7CisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIGluaXRpYWxfcmFuZ2VfdHE7ICAgIC8qKjwgUmFuZ2UgYXMgY2FsY3VsYXRlZCBmcm9tIHRoZSBmaXJzdCBmcmFtZSByZWNlaXZlZC4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgY3VycmVudF9yYW5nZV90cTsgICAgLyoqPCBSYW5nZSBhcyBjYWxjdWxhdGVkIGZyb20gdGhlIGN1cnJlbnQgZnJhbWUuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCIgZ3JvdXAgCisgKiBvZiAiZXBvbl9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3Q7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZW5jcnlwdGlvbl9lbmFibGVkIiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9mYWlsdXJlIiBncm91cCBvZiB0aGUgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICoKKyAqIFRoZSBPTFQgZmFpbGVkIHRvIHJlY2VpdmUgYW4gdXBkYXRlZCBlbmNyeXB0aW9uIGtleSB3aXRoaW4gdGhlIGV4cGVjdGVkIHRpbWUgCisgKiBwZXJpb2QgYWZ0ZXIgZW5jcnlwdGlvbiBrZXkgZXhjaGFuZ2UgaGFzIGJlZW4gaW5pdGlhdGVkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX2ZhaWx1cmUiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImtleV9leGNoYW5nZV9zdGFydGVkIiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX3N0b3BwZWQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZDsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJsaW5rX2RlbGV0ZWQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImxpbmtfc3BlZWRfbWlzbWF0Y2giIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogSG9zdCB3aWxsIHJlY2VpdmUgdGhpcyBpbmRpY2F0aW9uIGlmIGEgbGluayByZWdpc3RlcnMgdGhlbiBhdHRlbXB0cyB0byAKKyAqIHJlZ2lzdGVyIGxhdGVyIGF0IGEgZGlmZmVyZW50IHNwZWVkLCBvciBpZiB0aGUgbGluayByZWdpc3RlcnMgYXQgYSBkaWZmZXJlbnQgCisgKiBzcGVlZCB0aGFuIHRoZSBzcGVlZCB3aXRoIHdoaWNoIGl0IHdhcyBwcmUtcHJvdmlzaW9uZWQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSBwcmV2aW91c19yYXRlOyAgICAvKio8IFBPTiByYXRlIGxpbmsgaW5pdGlhbGx5IHJlZ2lzdGVyZWQgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3JhdGUgY3VycmVudF9yYXRlOyAgICAgLyoqPCBQT04gcmF0ZSBsaW5rIGlzIGN1cnJlbnRseSBhdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGF0ICovCit9IGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxpbmtfc3BlZWRfbWlzbWF0Y2giIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm1wY3BfZGVyZWdpc3RlcmVkIiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJtcGNwX2Rpc2NvdmVyZWQiIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogQSBsaW5rIGhhcyBjb21wbGV0ZWQgTVBDUCBsaW5rIHJlZ2lzdHJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX2luZm8gbGlua19pbmZvOyAgICAvKio8IEluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlzY292ZXJlZCBsaW5rLiAqLworfSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm1wY3BfZGlzY292ZXJlZCIgZ3JvdXAgb2YgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibXBjcF9yZWdfYWNrX3RpbWVvdXQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm1wY3BfcmVwb3J0X3RpbWVvdXQiIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogVGhlIHByb3Zpc2lvbmVkIGxpbWl0IGJldHdlZW4gcmVwb3J0cyBmb3IgdGhlIHNwZWNpZmllZCBsaW5rIGhhcyBiZWVuIAorICogZXhjZWVkZWQuICBUaGlzIGxpbmsgd2lsbCBiZSBkZS1yZWdpc3RlcmVkLCBhbmQgdGhlIGFsYXJtX3N0YXR1cyBzZXQgd2hlbiAKKyAqIHRoaXMgb2NjdXJzLiAgVGhlIGFsYXJtX3N0YXR1cyB3aWxsIGJlIGNsZWFyZWQgd2hlbiB0aGUgbGluayBhdHRlbXB0cyB0byAKKyAqIHJlZ2lzdGVyIGFnYWluLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm1wY3BfcmVwb3J0X3RpbWVvdXQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib2FtX2tlZXBhbGl2ZV90aW1lb3V0IiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9saW5rIiBvYmplY3QuIAorICoKKyAqIFRoZSBwcm92aXNpb25lZCB0aW1lIGxpbWl0IGJldHdlZW4gcmVjZWl2aW5nIHVwc3RyZWFtIGluZm8gZnJhbWVzIGhhcyBiZWVuIAorICogZXhjZWVkZWQuICBOb3JtYWxseSBhbiBPTlUgd2lsbCByZXNldCBpdHMgT0FNIHN0YXRlIG1hY2hpbmUgd2hlbiB0aGlzIAorICogb2NjdXJycyBhbmQgdGhlIGhvc3QgbXVzdCByZS1uZWdvdGlhdGUgT0FNIGFuZCByZXByb3Zpc2lvbiB0aGUgbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib2FtX2tlZXBhbGl2ZV90aW1lb3V0IiBncm91cCBvZiAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0OworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCIgZ3JvdXAgb2YgCisgKiAiZXBvbl9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIiBncm91cCBvZiAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fbGluayIgb2JqZWN0LiAKKyAqCisgKiBSYWlzZWQgYWZ0ZXIgYW4gJ2FkZF9saW5rJyBvcGVyYXRpb24gb24gYW4gRVBPTiBOSSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fbGlua19pbmZvIGxpbmtfaW5mbzsgICAgLyoqPCBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkIiBncm91cCBvZiAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9saW5rIiBvYmplY3QuIAorICoKKyAqIFRoZSBsaW5rIGhhcyB1bmRlcmdvbmUgYSBwcm90ZWN0aW9uIHN3aXRjaCBldmVudC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUgcHJvdGVjdGlvbl9zdGF0dXM7IC8qKjwgVGhlIGxpbmsncyBwb3N0LXN3aXRjaCByb2xlICh3b3JraW5nIG9yIHN0YW5kYnkpLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSByYW5nZV92YWx1ZV90cTsgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCByYW5nZSB2YWx1ZSBpbiB0aW1lIHF1YW50YS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkIiBncm91cCBvZiAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJyYW5nZV92YWx1ZV9jaGFuZ2VkIiBncm91cCBvZiB0aGUgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICoKKyAqIEluZGljYXRpb24gc2VudCB3aGVuIGEgcmFuZ2UgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhCit7CisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHJhbmdlX3ZhbHVlX3RxOyAgLyoqPCBOZXcgcmFuZ2UgdmFsdWUuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJhbmdlX3ZhbHVlX2NoYW5nZWQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlcmFuZ2VfZmFpbHVyZSIgZ3JvdXAgb2YgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkIHN0YXQ7ICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCBzdGF0OyAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSIgZ3JvdXAgb2YgCisgKiAiZXBvbl9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3Q7IC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgZW5jcnlwdGlvbl9lbmFibGVkOyAgICAgICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZW5jcnlwdGlvbl9lbmFibGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGtleV9leGNoYW5nZV9mYWlsdXJlOyAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImtleV9leGNoYW5nZV9mYWlsdXJlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGtleV9leGNoYW5nZV9zdGFydGVkOyAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImtleV9leGNoYW5nZV9zdGFydGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGtleV9leGNoYW5nZV9zdG9wcGVkOyAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImtleV9leGNoYW5nZV9zdG9wcGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGxpbmtfZGVsZXRlZDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImxpbmtfZGVsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBsaW5rX3NwZWVkX21pc21hdGNoOyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJsaW5rX3NwZWVkX21pc21hdGNoIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG1wY3BfZGVyZWdpc3RlcmVkOyAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm1wY3BfZGVyZWdpc3RlcmVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG1wY3BfZGlzY292ZXJlZDsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm1wY3BfZGlzY292ZXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBtcGNwX3JlZ19hY2tfdGltZW91dDsgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJtcGNwX3JlZ19hY2tfdGltZW91dCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBtcGNwX3JlcG9ydF90aW1lb3V0OyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJtcGNwX3JlcG9ydF90aW1lb3V0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9hbV9rZWVwYWxpdmVfdGltZW91dDsgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9hbV9rZWVwYWxpdmVfdGltZW91dCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQ7ICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkOyAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZDsgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByYW5nZV92YWx1ZV9jaGFuZ2VkOyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyYW5nZV92YWx1ZV9jaGFuZ2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHJlcmFuZ2VfZmFpbHVyZTsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJlcmFuZ2VfZmFpbHVyZSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9yYWlzZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lOyAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZXBvbl9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmc7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGVsZXRlX2xpbmsiIGdyb3VwIG9mICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmsKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbms7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZm9yY2VfcmVkaXNjb3ZlcnkiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeQoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9zdGFydCIgZ3JvdXAgb2YgdGhlICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqCisgKiBBcHBseSB0aGUgY29ycmVzcG9uZGluZyBwcm92aXNpb25pbmcgZm9yICdlcG9uX2xpbmsua2V5X2V4Y2hhbmdlX2NvbmZpZycgCisgKiBhZ2FpbnN0IHRoaXMgbGluayBhbmQgdGhlbiBzdGFydCBrZXkgZXhjaGFuZ2UgdGltZXIgd2l0aCB0aGUgZ2l2ZW4gcGVyaW9kLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YQoreworICAgIHVpbnQxNl90IHBlcmlvZDsgICAgLyoqPCBLZXkgZXhjaGFuZ2UgcGVyaW9kIGluIHNlY29uZHMuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX3N0YXJ0IiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX3N0b3AiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKgorICogU3RhcnQgdGhlIE9BTSBrZWVwYWxpdmUgdGltZXIgYWdhaW5zdCB0aGlzIGxpbmsuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YQoreworICAgIHVpbnQxNl90IHNlbmRfcGVyaW9kOyAgIC8qKjwgVGhlIHBlcmlvZCBhdCB3aGljaCB0byBzZW5kIE9BTSBpbmZvIGZyYW1lcyAoaW4gc2Vjb25kcykuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQiIGdyb3VwIG9mIAorICogImVwb25fbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wIiBncm91cCBvZiAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRpY19yZWdpc3RyYXRpb24iIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogU3RhdGljYWxseSByZWdpc3RlcnMgdGhlIGxvZ2ljYWwgbGluayAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEKK3sKKyAgICBiY21vbHRfdGltZV9xdWFudGEgbGFzZXJvbl90aW1lX3RxOyAgICAgLyoqPCBMYXNlci1vbiB0aW1lIGluIHRpbWUgcXVhbnRhLlwgKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgbGFzZXJvZmZfdGltZV90cTsgICAgLyoqPCBMYXNlci1vZmYgdGltZSBpbiB0aW1lIHF1YW50YS4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgcmFuZ2VfdmFsdWVfdHE7ICAgICAgLyoqPCBSYW5nZSB2YWx1ZSB1c2VkIGZvciB0aGlzIGxpbmsgLSBpbiB0aW1lIHF1YW50YS4gKi8KKyAgICB1aW50OF90IHBlbmRpbmdfZ3JhbnRzOyAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgZ3JhbnRzLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0aWNfcmVnaXN0cmF0aW9uIiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbgoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImluamVjdF9mcmFtZSIgZ3JvdXAgb2YgdGhlICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKgorICogU2VuZCBhbiBhcmJpdHJhcnkgZnJhbWUgYWNyb3NzIHRoZSBzcGVjaWZpZWQgbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEKK3sKKyAgICBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgZnJhbWU7ICAgLyoqPCBDb21wbGV0ZSBjb250ZW50cyBvZiB0aGUgZnJhbWUgYmVnaW5uaW5nIHdpdGggdGhlIERBIHVwIHRocm91Z2ggYnV0IG5vdCBpbmNsdWRpbmcgdGhlIENSQy4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJpbmplY3RfZnJhbWUiIGdyb3VwIG9mICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lCit7CisgICAgYmNtb2x0X3Byb3h5IGhkcjsgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImZyYW1lX2NhcHR1cmVkIiBncm91cCBvZiB0aGUgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICoKKyAqIEEgZnJhbWUgbWF0Y2hpbmcgaG9zdC1zcGVjaWZpZWQgY3JpdGVyaWEgd2FzIHJlY2VpdmVkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhCit7CisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIGZyYW1lOyAgIC8qKjwgQ29udGVudHMgb2YgdGhlIGZyYW1lLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZnJhbWVfY2FwdHVyZWQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZAoreworICAgIGJjbW9sdF9wcm94eV9yeCBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImVwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2tleQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb25fbmk7IC8qKjwgVGhlIGluZGV4IG9mIGEgc3BlY2lmaWMgRVBPTiBOSSBpbnN0YW5jZSBhcyBzZWVuIGJ5IHRoZSBob3N0LiAqLworfSBiY21vbHRfZXBvbl9uaV9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgICAgICAvKio8IFRoZSBNQUMgYWRkcmVzcyB1c2VkIGZvciBhbGwgZnJhbWVzIGdlbmVyYXRlZCBieSB0aGUgT0xUIG9uIHRoZSBQT04uICBUaGlzIHZhbHVlIG11c3QgYmUgc2V0IGJlZm9yZSBFUE9OX05JIGlzIGZpcnN0IGVuYWJsZWQsIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlIGVwb25fbmlfZW47IC8qKjwgSW5kaWNhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIEVQT04gTkkuICovCisgICAgYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciByZWdpc3RyYXRpb25fYmVoYXZpb3I7IC8qKjwgRGV0ZXJtaW5lcyBob3cgcmVnaXN0cmF0aW9uIHJlcXVlc3RzIGZyb20gdW5rbm93biBsaW5rcyBhcmUgaGFuZGxlZC4gIFNldCB0byAnTm90aWZ5IFVua25vd24nIHRvIGZvcmNlIGFsbCBsaW5rcyB0byBiZSBwcmUtcHJvdmlzaW9uZWQuICBJZiBpbiAnTm90aWZ5IFVua25vd24nIG1vZGUsIE1QQ1AgUmVnaXN0cmF0aW9uIG9mIGFuIHVua25vd24gbGluayB3aWxsIGJlIGRlbmllZCwgYW5kIGEgJ1doaXRlIExpc3QgVmlvbGF0aW9uIiB3aWxsIGJlIHNlbnQgdG8gdGhlIGhvc3QuIElmIHNldCB0byAnQXV0b21hdGljJywgdGhlIGxpbmsgcmVnaXN0ZXJzIGZ1bGx5IHdpdGhvdXQgaG9zdCBpbnRlcmFjdGlvbi4gICovCisgICAgdWludDE2X3QgbXR1XzFnOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMUcgcGF0aC4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgYW4gb2RkIHZhbHVlLiAqLworICAgIHVpbnQxNl90IG10dV8xMGc7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1heGltdW0gZnJhbWUgc2l6ZSAoaW5jbHVkaW5nIEZDUykgb24gdGhlIDEwRyBwYXRoLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBhbiBvZGQgdmFsdWUuICovCisgICAgYmNtb2x0X21ldGVycyBtaW5pbXVtX2ZpYmVyX2xlbmd0aDsgICAgIC8qKjwgVGhlIG1pbmltdW0gZmliZXIgbGVuZ3RoLCBpbiBtZXRlcnMsIGF0IHdoaWNoIHdlIGV4cGVjdCB0byBmaW5kIGFuIE9OVS4gTm90ZXM6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZmliZXIgbGVuZ3RoIGNhbm5vdCBleGNlZWQgMTAwIGttLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIFNvbWUgT05VcyBjYW4gcmVnaXN0ZXIgYXQgZGlzdGFuY2VzIHRoYXQgYXJlIGxlc3MgdGhhbiB0aGUgcHJvdmlzaW9uZWQgbWluaW11bS4gKi8KKyAgICBiY21vbHRfbWV0ZXJzIG1heGltdW1fZmliZXJfbGVuZ3RoOyAgICAgLyoqPCBUaGUgbWF4aW11bSBmaWJlciBsZW5ndGgsIGluIG1ldGVycywgYXQgd2hpY2ggd2UgZXhwZWN0IHRvIGZpbmQgYW4gT05VLiBOb3RlczogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBmaWJlciBsZW5ndGggY2Fubm90IGV4Y2VlZCAxMDAga20uIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gU29tZSBPTlVzIGNhbiByZWdpc3RlciBhdCBkaXN0YW5jZXMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIHRoZSBwcm92aXNpb25lZCBtYXhpbXVtLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBncmFudF9zcGFjaW5nX3RxOyAgICAvKio8IFRoZSBkZWFkIHRpbWUgb24gdGhlIFBPTiBiZXR3ZWVuIHVwc3RyZWFtIGJ1cnN0cy4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gKi8KKyAgICBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zOyAvKio8IENvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBFUE9OIGxpbmtzIHJlZ2lzdHJhdGlvbiBhbmQgcmVwb3J0aW5nLiBUaGlzIHZhbHVlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gKi8KKyAgICB1aW50MzJfdCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXM7ICAgICAgICAgICAgICAvKio8IFBlcmlvZCBvZiBNUENQIGRpc2NvdmVyeSB3aW5kb3dzLiAgSW4gdGhpcyB0aW1lIHBlcmlvZCwgb25lIGRpc2NvdmVyeSBnYXRlIHdpbGwgYmUgc2VudCBmb3IgZXZlcnkgZW5hYmxlZCBSUC4gIFRoZSBkaXNjb3ZlcnkgZ2F0ZXMgd2lsbCBiZSBzcGFjZWQgZXF1YWxseSBhY3Jvc3MgdGhlIHRpbWUgcGVyaW9kLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOyAgICAgICAgIC8qKjwgVGhlIHN0YXRlIG9mIHRoZSBhbGFybXMgb24gdGhpcyBFUE9OIE5JLiAqLworICAgIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4IGFsbF9saW5rczsgIC8qKjwgTGlzdCBvZiBhbGwgbGlua3Mgb24gdGhlIEVQT04gTkkuICovCisgICAgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgZW5jcnlwdGlvbl9jZmc7ICAgLyoqPCBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gdGhhdCBhcHBsaWVzIHRvIHRoZSBFUE9OIE5JIGFzIGEgd2hvbGUuICovCisgICAgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmc7ICAgIC8qKjwgUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbi4gKi8KKyAgICBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiBjbG9ja190cmFuc3BvcnRfY2ZnOyAgICAgICAgICAgICAgLyoqPCBDbG9jayB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi4gKi8KKyNkZWZpbmUgQkNNT0xUX0VQT05fTklfQ0ZHX0RBVEFfRFJPUERPV05fV0VJR0hUU19MRU4gICAgNworICAgIGJjbW9sdF9hcnJfdTE2XzcgZHJvcGRvd25fd2VpZ2h0czsgICAgICAgICAgICAgICAgICAvKio8IFRoZSBzb2xpY2l0ZWQgc2NoZWR1bGluZyBkcm9wIGRvd24gd2VpZ2h0cyBmb3IgcHJpb3JpdGllcyAwLTYgKHBlcmNlbnRhZ2VzIHJlbGF0aXZlIHRvIHRoYXQgcHJpb3JpdHkpLiBQcmlvcml0eSA3IGhhcyBubyBkcm9wLWRvd24sIGFzIGl0IGlzIHRoZSBsb3dlc3QgcHJpb3JpdHkuIFRoZSBkcm9wLWRvd24gd2VpZ2h0cyBhcmUgaG93IG11Y2ggYmFuZHdpZHRoIHRvIGFsbG9jYXRlIHRvIHNvbGljaXRlZCBzY2hlZHVsZXJzIGF0IHRoZSBuZXh0IGxvd2VyIHByaW9yaXR5IGxldmVsIChldmVuIHdoZW4gZWxlbWVudHMgYXQgdGhpcyBsZXZlbCBhcmUgc3RpbGwgYWN0aXZlKS4gIFRoaXMgaXMgTk9UIHRoZSBwZXJjZW50YWdlIGFsbG9jYXRlZCB0byB0aGUgZHJvcCBkb3duLCBpdCBpcyB0aGUgcmF0aW8gYmV0d2VlbiBhIHByaW9yaXR5IGFuZCBpdHMgZHJvcGRvd24gKi8KKyNkZWZpbmUgQkNNT0xUX0VQT05fTklfQ0ZHX0RBVEFfQVBQUk9YSU1BVEVfU09MSUNJVEVEX1VTQUdFX0xFTiA4CisgICAgYmNtb2x0X2Fycl9ib3VuZHNfOCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2U7ICAgIC8qKjwgVGhlIGFwcHJveGltYXRlIHBlcmNlbnRhZ2Ugb2YgdGhlIFBPTiB0aW1lIG5lY2Vzc2FyeSB0byBzY2hlZHVsZSBhbGwgZWxlbWVudHMgYXQgb3IgYWJvdmUgZWFjaCBwcmlvcml0eS4gKi8KKyAgICB1aW50MzJfdCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2U7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgYXBwcm94aW1hdGUgcGVyY2VudGFnZSBvZiB0aGUgUE9OIHRpbWUgbmVjZXNzYXJ5IHRvIGFjY29tb2RhdGUgYWxsIFRETSBncmFudHMuICovCisgICAgdWludDE2X3Qgbm9fcmVwb3J0c19zb2FrX3RpbWU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUGVyaW9kIG9mIHRpbWUgYWZ0ZXIgbGFzdCByZXBvcnQgcmVjZWl2ZWQgdG8gc2VuZCBubyByZXBvcnRzIGFsYXJtIChpbiBtcykuICovCisgICAgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyIHBvbl9hZ2dyZWdhdGVfc2hhcGVyOyAgIC8qKjwgUE9OIEFnZ3JlZ2F0ZSBTaGFwZXIuICovCisjZGVmaW5lIEJDTU9MVF9FUE9OX05JX0NGR19EQVRBX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUV9MRU4gICAgOAorICAgIGJjbW9sdF9hcnJfYm91bmRzXzggZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxOyAgICAgICAvKio8IFRoZSBlc3RpbWF0ZWQgdGltZSBiZXR3ZWVuIHdoZW4gdGhlIE9MVCByZWNlaXZlcyBhIG5vbi16ZXJvIHJlcG9ydCBmcm9tIGFuIE9OVSBhbmQgd2hlbiB0aGUgT0xUIHdpbGwgZ2VuZXJhdGUgYSBncmFudCB0byB0aGF0IE9OVSBmb3IgZWFjaCBwcmlvcml0eSBsZXZlbC4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgb251X3VwZ3JhZGVfcGFyYW1zOyAgLyoqPCBPTlUgdXBncmFkZSBwYXJhbXMuICovCisgICAgYmNtb3NfYm9vbCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW47ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIDEwRyBBdXRvbm9tb3VzIFJvZ3VlIERlY3Rpb24gZHVyaW5nIGRpc2NvdmVyeSB3aW5kb3cgKi8KKyAgICBiY21vc19ib29sIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuOyAgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgMUcgQXV0b25vbW91cyBSb2d1ZSBEZWN0aW9uIGR1cmluZyBkaXNjb3Zlcnkgd2luZG93ICovCisgICAgdWludDhfdCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkOyAgICAgICAgICAgIC8qKjwgU2V0IHRocmVzaG9sZCBmb3IgbnVtYmVyIG9mIFN5bmNQYXR0ZXJucyByZWNlaXZlZCB3aXRob3V0IGEgQnVyc3QgRGVsaW1pdGVyIHRvIHRyaWdnZXIgdGhlIGZhdWx0LiAqLworfSBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJlcG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5OyAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfY2ZnOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSIgZ3JvdXAgb2YgCisgKiAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlIiBncm91cCBvZiAKKyAqICJlcG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAibGxpZF9xdWFyYW50aW5lZCIgZ3JvdXAgb2YgdGhlICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX2xsaWQgbGxpZDsgICAgICAgICAgICAgIC8qKjwgTExJRC4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3JhdGUgbGlua19yYXRlOyAgICAvKio8IExpbmsgUmF0ZS4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBsaW5rX21hYzsgICAgICAgICAvKio8IExpbmsgTUFDLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSByYW5nZV92YWx1ZV90cTsgIC8qKjwgUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEuICovCit9IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJsbGlkX3F1YXJhbnRpbmVkIiBncm91cCBvZiAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm1wY3BfdGltZXN0YW1wX2NoYW5nZWQiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIEEgY2xvY2sgdHJhbnNwb3J0IHB1bHNlIHdhcyByZWNlaXZlZCBhdCB0aGUgZ2l2ZW4gTVBDUCB0aW1lc3RhbXAuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEKK3sKKyAgICB1aW50MzJfdCBtcGNwX3RpbWVzdGFtcDsgICAgLyoqPCBUaGUgTVBDUCB0aW1lIGF0IHdoaWNoIHRoZSBwdWxzZSB3YXMgcmVjZWl2ZWQuICovCit9IGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkIiBncm91cCBvZiAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAibm9fcmVwb3J0cyIgZ3JvdXAgb2YgdGhlICJlcG9uX25pIiBvYmplY3QuIAorICoKKyAqIExvc3Mgb2YgYWxsIHJlcG9ydHMgb24gYWxsIGxpbmtzIG9uIHRoZSBFUE9OIE5JIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJub19yZXBvcnRzIiBncm91cCBvZiAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0cworeworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib251X3VwZ3JhZGVfY29tcGxldGUiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhCit7CisgICAgYmNtb3NfYm9vbCBzdGF0dXM7ICAvKio8IFN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEFnYWluc3QgZW50aXJlIHVwZ3JhZGUgcHJvY2Vzcy4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgbGlzdF9vZl9mYWlsZWRfZW50aXRpZXM7ICAgIC8qKjwgTGlzdCBvZiBPTlUtSURzIHRoZSB1cGdyYWRlIGZhaWxlZCBmb3IuICovCit9IGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib251X3VwZ3JhZGVfY29tcGxldGUiIGdyb3VwIG9mICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlcmFuZ2VfZmFpbHVyZSIgZ3JvdXAgb2YgImVwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicm9ndWVfc2Nhbl9jb21wbGV0ZSIgZ3JvdXAgb2YgdGhlICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKgorICogSW5kY2lhdGlvbiB0aGF0IGEgc2NhbiBpcyBjb21wbGV0ZSwgYW55IGVycm9yIGlzIGFsc28gcmV0dXJuZWQuICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzIHJldHVybl9pbmRfc3RhdHVzOyAvKio8IFN0YXR1cyBvZiBjb21wbGV0ZWQgc2Nhbi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX3NjYW5fY29tcGxldGUiIGdyb3VwIG9mICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGUKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgICAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBiY21vbHRfZXBvbl9sbGlkIGxsaWQ7ICAgICAgLyoqPCBMTElELiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGxpbmtfbWFjOyAvKio8IExpbmsgTUFDIC4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgYWZ0ZXIgYSAnc2V0X2Vwb25fbmlfZW5fc3RhdGUnIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUgbmV3X3N0YXRlOyAgLyoqPCBOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuICovCit9IGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiBncm91cCBvZiAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlOyAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZTsgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbGxpZF9xdWFyYW50aW5lZDsgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImxsaWRfcXVhcmFudGluZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbXBjcF90aW1lc3RhbXBfY2hhbmdlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm1wY3BfdGltZXN0YW1wX2NoYW5nZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbm9fcmVwb3J0czsgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm5vX3JlcG9ydHMiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X3VwZ3JhZGVfY29tcGxldGU7ICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV91cGdyYWRlX2NvbXBsZXRlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHJlcmFuZ2VfZmFpbHVyZTsgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyZXJhbmdlX2ZhaWx1cmUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcm9ndWVfc2Nhbl9jb21wbGV0ZTsgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJvZ3VlX3NjYW5fY29tcGxldGUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQ7ICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImVwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7ICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYWRkX2xpbmsiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqCisgKiBQcmUtcHJvdmlzaW9uIGFuIEVQT04gbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgIC8qKjwgVGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBFUE9OIGxpbmsuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19yYXRlIHJhdGU7ICAgICAvKio8IFJhdGUgb2YgbGluayB0byBwcmUtcHJvdmlzaW9uLiAqLworfSBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImFkZF9saW5rIiBncm91cCBvZiAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmsKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYWRkX2xpbms7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhZGRfbXVsdGljYXN0X2xpbmsiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFByZS1wcm92aXNpb24gYW4gRVBPTiBtdWx0aWNhc3QgbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjX2FkZHJlc3M7ICAvKio8IFRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgRVBPTiBsaW5rLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSByYXRlOyAgICAgLyoqPCBSYXRlIG9mIGxpbmsgdG8gcHJlLXByb3Zpc2lvbi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYWRkX211bHRpY2FzdF9saW5rIiBncm91cCBvZiAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmsKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmsiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX25pIiBvYmplY3QuIAorICoKKyAqIEFkZHMgYSBwcm90ZWN0ZWQgc3RhbmRieSBsaW5rLiAgT25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkLCB0aGUgbGluayBpcyAKKyAqIGNvbnNpZGVyZWQgInN0YW5kYnkiIGZvciB0aGUgcHVwb3NlcyBvZiBwcm90ZWN0aW9uIHN3aXRjaGluZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgICAgICAgICAgICAgIC8qKjwgVGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBFUE9OIGxpbmsuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19pbmZvIHdvcmtpbmdfbGlua19pbmZvOyAgICAvKio8IExpbmsgaW5mbyBmb3IgdGhlIGFzc29jaWF0ZWQgd29ya2luZyBsaW5rLiAqLworfSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImFkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rIiBncm91cCBvZiAKKyAqICJlcG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaXNzdWVfcnNzaV9ncmFudCIgZ3JvdXAgb2YgdGhlICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKgorICogSXNzdWVzIGFuIFJTU0kgZ3JhbnQgdG8gcmVhZCBSWCBQb3dlciAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZ3JhbnRlZF9saW5rOyAvKio8IExvZ2ljYWwgbGluayB0byBncmFudCwgd2hpY2ggc2hvdWxkIGVpdGhlciBiZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHVuaWNhc3QgbGluayBvZiBpbnRlcmVzdCBvbiB0aGUgUE9OIG9yLCAwIGZvciBpZGxlIHBvd2VyIG1lYXN1cmVtZW50LiAwIHdpbGwgdXNlIGEgbGluayB0aGF0IHdpbGwgbm90IHJlc3VsdCBpbiB1cHN0cmVhbSB0cmFuc21pc3Npb24gYnkgYW55IGRldmljZSBvbiB0aGUgUE9OLiAqLworICAgIHVpbnQxNl90IHRyaWdnZXJfd2lkdGg7ICAgICAgICAgLyoqPCBSU1NJIFRyaWdnZXIgV2lkdGggKFR3KSBpbiBucywgRGVzaXJlZCB3aWR0aCBvZiBSU1NJIFRyaWdnZXIgYmFzZWQgb24gdGhlIE9wdGljYWwgTW9kdWxlIFNwZWNpZmljYXRpb25zLiAqLworICAgIHVpbnQxNl90IHRyaWdnZXJfZGVsYXk7ICAgICAgICAgLyoqPCBSU1NJIFRyaWdnZXIgRGVsYXkoVGQpLCBpbiBucywgZm9yIHRoaXMgbGluayB0byBtZWV0IHRoZSAoVGQpIGRlbGF5IHRpbWluZyByZXF1aXJlbWVudCBvZiB0aGUgT3B0aWNhbCBNb2R1bGUgU3BlY2lmaWNhdGlvbnMuICovCisgICAgdWludDE2X3Qgc2FtcGxlX3BlcmlvZDsgICAgICAgICAvKio8IFNhbXBsZSBwZXJpb2QgaW4gdXMsIGludGVybmFsIEkyQyBob2xkL3Byb2hpYml0IHRpbWUgd2hlcmUgYWNjZXNzIHRvIGRldmljZSBpcyBub3QgYWxsb3dlZC4gKi8KK30gYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImlzc3VlX3Jzc2lfZ3JhbnQiIGdyb3VwIG9mICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSIgCisgKiBncm91cCBvZiB0aGUgImVwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YQoreworICAgIHVpbnQzMl90IHJlcmFuZ2VfZGVsdGE7IC8qKjwgUmUtcmFuZ2UgZGVsdGEuICovCit9IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhIiAKKyAqIGdyb3VwIG9mICJlcG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJvZ3VlX2xsaWRfc2NhbiIgZ3JvdXAgb2YgdGhlICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKgorICogSXNzdWUgYSByZXF1ZXN0IHRvIHNjYW4gYWxsIExMSURzIG9yIGEgc3BlY2lmaWMgTExJRCBvbiBhIFBPTiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEKK3sKKyAgICBiY21vc19ib29sIG1vZGU7ICAgICAgICAvKio8IFRydWUgPSBTY2FuIGFsbCBMTElEUyBvbiB0aGUgUE9OICovCisgICAgYmNtb2x0X2Vwb25fbGxpZCBsbGlkOyAgLyoqPCBTcGVjaWZpYyBMTElEIHRvIHNjYW4gb3IgMCB0byBzY2FuIGFsbCB3aGVuIG1vZGUgaXMgQUxMICovCit9IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX2xsaWRfc2NhbiIgZ3JvdXAgb2YgImVwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2V0X2Vwb25fbmlfZW5fc3RhdGUiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNldCB0aGUgRVBPTiBOSSBlbmFibGUgc3RhdGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUgbmV3X3N0YXRlOyAgLyoqPCBOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuICovCit9IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2V0X2Vwb25fbmlfZW5fc3RhdGUiIGdyb3VwIG9mICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhcnRfb251X3VwZ3JhZGUiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhCit7CisgICAgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgbGlzdF9vZl9vbnVfaWRzOyAvKio8IExpc3Qgb2YgT05VcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4gKi8KK30gYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGFydF9vbnVfdXBncmFkZSIgZ3JvdXAgb2YgImVwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJlcG9uX29udV8xMGdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5Cit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsgICAgIC8qKjwgRVBPTiBOSSB3aXRoIHdoaWNoIHRoaXMgT05VIGludGVyZmFjZSBpcyBhc3NvY2lhdGVkLiAqLworICAgIGJjbW9sdF9lcG9uX29udV9pZCBvbnVfaWQ7ICAvKio8IFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBPTlUgaW50ZXJmYWNlIHdpdGhpbiBpdHMgRVBPTiBOSS4gKi8KK30gYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9vbnVfMTBnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggYWxsX2xpbmtzOyAgLyoqPCBMaXN0IG9mIE1BQyBBZGRyZXNzZXMgZm9yIGFsbCBsaW5rcyBvbiB0aGUgT05VIElkLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImVwb25fb251XzEwZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAiZXBvbl9vbnVfMTBnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGZlY19jb2RlX3dvcmRzX3RvdGFsOyAgICAgICAgICAvKio8IEZFQyBzdGF0cyBjb2RlIHdvcmRzIHRvdGFsICovCisgICAgdWludDY0X3QgZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzOyAgIC8qKjwgRkVDIHN0YXRzIGNvZGUgd29yZHMgZGVjb2RlIGZhaWxzICovCisgICAgdWludDY0X3QgZmVjX3plcm9lc19jb3JyZWN0ZWQ7ICAgICAgICAgIC8qKjwgRkVDIHN0YXRzIHplcm9zIGNvcnJlY3RlZCAqLworICAgIHVpbnQ2NF90IGZlY19vbmVzX2NvcnJlY3RlZDsgICAgICAgICAgICAvKio8IEZFQyBzdGF0cyBvbmVzIGNvcmVjdGVkICovCit9IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJlcG9uX29udV8xMGdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5OyAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX29udV8xMGdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJlcG9uX29udV8xMGdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9vbnVfMTBnX3VzIiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgCisgKiAiZXBvbl9vbnVfMTBnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9vbnVfMTBnX3VzIiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgc3RhdDsgICAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAKKyAqICJlcG9uX29udV8xMGdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9vbnVfMTBnX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImVwb25fb251XzEwZ191cyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZXBvbl9vbnVfMWdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uX25pOyAgICAgLyoqPCBFUE9OIE5JIHdpdGggd2hpY2ggdGhpcyBPTlUgaW50ZXJmYWNlIGlzIGFzc29jaWF0ZWQuICovCisgICAgYmNtb2x0X2Vwb25fb251X2lkIG9udV9pZDsgIC8qKjwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE9OVSBpbnRlcmZhY2Ugd2l0aGluIGl0cyBFUE9OIE5JLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImVwb25fb251XzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiBhbGxfbGlua3M7ICAgLyoqPCBMaXN0IG9mIE1BQyBBZGRyZXNzZXMgZm9yIGFsbCBsaW5rcyBvbiB0aGUgT05VIElkLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZXBvbl9vbnVfMWdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJlcG9uX29udV8xZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGdvb2RfZnJhbWVzOyAgICAgICAgICAgLyoqPCBHb29kIEZyYW1lIENvdW50LCBpbmNsdWRpbmcgbm9uRkVDIGFuZCBGRUMgKi8KKyAgICB1aW50NjRfdCBnb29kX2J5dGVzOyAgICAgICAgICAgIC8qKjwgR29vZCBCeXRlIENvdW50LCBpbmNsdWRpbmcgbm9uRkVDIGFuZCBGRUMgKi8KKyAgICB1aW50NjRfdCBvdmVyc3pfZnJhbWVzOyAgICAgICAgIC8qKjwgT3ZlcnNpemVkIGZyYW1lIGNvdW50IChmcmFtZXMgbGFyZ2VyIHRoYW4gMjAwMCBieXRlcykgKi8KKyAgICB1aW50NjRfdCBub25fZmVjX2dvb2RfZnJhbWVzOyAgIC8qKjwgTm9uIEZFQyBHb29kIEZyYW1lIENvdW50ICovCisgICAgdWludDY0X3Qgbm9uX2ZlY19nb29kX2J5dGVzOyAgICAvKio8IE5vbiBGRUMgR29vZCBCeXRlIENvdW50ICovCisgICAgdWludDY0X3QgZmVjX2dvb2RfZnJhbWVzOyAgICAgICAvKio8IEZFQyBHb29kIEZyYW1lIENvdW50ICovCisgICAgdWludDY0X3QgZmVjX2dvb2RfYnl0ZXM7ICAgICAgICAvKio8IEZFQyBHb29kIEJ5dGUgQ291bnQgKi8KKyAgICB1aW50NjRfdCBmZWNfZnJhbWVzX2V4Y19lcnJzOyAgIC8qKjwgRkVDIEZyYW1lcyB3aGljaCBleGNlZWRlZCA4IHN5bWJvbCBlcnJvcnMgKi8KKyAgICB1aW50NjRfdCBmZWNfYmxrc19ub19lcnJzOyAgICAgIC8qKjwgRkVDIEJsb2NrcyB3aXRoIG5vIGVycm9ycyAqLworICAgIHVpbnQ2NF90IGZlY19ibGtzX2NvcnJfZXJyczsgICAgLyoqPCBGRUMgQmxvY2tzIHdpdGggY29ycmVjdGFibGUgZXJyb3JzICovCisgICAgdWludDY0X3QgZmVjX2Jsa3NfdW5jb3JyX2VycnM7ICAvKio8IEZFQyBCbG9ja3Mgd2l0aCB1bmNvcnJlY3RhYmxlIGVycm9ycyAqLworICAgIHVpbnQ2NF90IGZlY19jb3JyX2J5dGVzOyAgICAgICAgLyoqPCBGRUMgQ29ycmVjdGVkIEJ5dGVzL1N5bWJvbHMgKi8KKyAgICB1aW50NjRfdCBmZWNfY29ycl96ZXJvZXM7ICAgICAgIC8qKjwgRkVDIENvcnJlY3RlZCBaZXJvZXMsIDhiIGRvbWFpbiAqLworICAgIHVpbnQ2NF90IGZlY19jb3JyX29uZXM7ICAgICAgICAgLyoqPCBGRUMgQ29ycmVjdGVkIE9uZXMsIDhiIGRvbWFpbiAqLworICAgIHVpbnQ2NF90IHVuZGVyc3pfZnJhbWVzOyAgICAgICAgLyoqPCBVbmRlcnNpemUgZnJhbWUgY291bnQgKGZyYW1lcyBsZXNzIHRoYW4gNjQgYnl0ZXMpICovCisgICAgdWludDY0X3QgZXJyb3Jzel9mcmFtZXM7ICAgICAgICAvKio8IEVycm9yZWQgZnJhbWUgICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImVwb25fb251XzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXk7ICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImVwb25fb251XzFnX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2NmZyIgZ3JvdXAgb2YgImVwb25fb251XzFnX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX29udV8xZ191cyIgb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIAorICogImVwb25fb251XzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9vbnVfMWdfdXMiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgc3RhdDsgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIAorICogImVwb25fb251XzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX29udV8xZ191cyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZXBvbl9vbnVfMWdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXk7ICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMTBnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uX25pOyAvKio8IEVQT04gTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIGRvd25zdHJlYW0gcGF0aC4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xMGdfZHMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIGZlY19zdGF0ZTsgLyoqPCBGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMTBHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiAqLworICAgIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgcHJic19nZW5lcmF0b3I7ICAgIC8qKjwgRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJlcG9uX3BhdGhfMTBnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzEwZ19kcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgYnl0ZXM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc182NDsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc182NV8xMjc7ICAgICAvKio8IFRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMTI4XzI1NTsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18yNTZfNTExOyAgICAvKio8IFRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzUxMl8xMDIzOyAgIC8qKjwgVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzEwMjRfMTUxODsgIC8qKjwgVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xNTE5XzIwNDc7ICAvKio8IFRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMjA0OF80MDk1OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzQwOTZfOTIxNjsgIC8qKjwgVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc185MjE3XzE2MzgzOyAvKio8IFRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgYnJvYWRjYXN0X2ZyYW1lczsgIC8qKjwgVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBkYXRhX2J5dGVzOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG11bHRpY2FzdF9mcmFtZXM7ICAvKio8IFRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgdW5pY2FzdF9mcmFtZXM7ICAgIC8qKjwgVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3Qgb2FtX2J5dGVzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIE9BTSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3Qgb2FtX2ZyYW1lczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGdhdGVfZnJhbWVzOyAgICAgICAvKio8IE51bWJlciBvZiBnYXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgbXBjcF9mcmFtZXM7ICAgICAgIC8qKjwgTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBhYm9ydF9mcmFtZXM7ICAgICAgLyoqPCBOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJlcG9uX3BhdGhfMTBnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0Cit7CisgICAgYmNtb2x0X3N0YXQgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9jZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzEwZ19kcyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAiZXBvbl9wYXRoXzEwZ19kcyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXk7ICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fcGF0aF8xMGdfZHMiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgc3RhdDsgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIAorICogImVwb25fcGF0aF8xMGdfZHMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9wYXRoXzEwZ19kcyIgb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgc3RhdDsgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAKKyAqICJlcG9uX3BhdGhfMTBnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzEwZ19kcyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xMGdfZHMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcKK3sKKyAgICBiY21vbHRfYXV0b19jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5OyAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzEwZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5Cit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsgLyoqPCBFUE9OIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDEwRyB1cHN0cmVhbSBwYXRoLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzEwZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgZmVjX3N0YXRlOyAgICAgICAgIC8qKjwgRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIDEwRyB1cHN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHN5bmNfdGltZV90cTsgICAgICAgICAgICAvKio8IFRpbWUgcXVhbnRhIG9mIHN5bmMgYXQgc3RhcnQgb2YgVVMgYnVyc3QuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiAqLworICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHByYnNfY2hlY2tlcjsgICAgLyoqPCBVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9wcmJzX3N0YXR1cyBwcmJzX3N0YXR1czsgICAgICAgICAgICAgLyoqPCBSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xMGdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMTBnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCBieXRlczsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNjQ7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzY1XzEyNzsgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMTI4XzI1NTsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMjU2XzUxMTsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNTEyXzEwMjM7ICAgLyoqPCBUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzEwMjRfMTUxODsgIC8qKjwgVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMTUxOV8yMDQ3OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18yMDQ4XzQwOTU7ICAvKio8IFRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzQwOTZfOTIxNjsgIC8qKjwgVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfOTIxN18xNjM4MzsgLyoqPCBUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBicm9hZGNhc3RfZnJhbWVzOyAgLyoqPCBUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBkYXRhX2J5dGVzOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBtdWx0aWNhc3RfZnJhbWVzOyAgLyoqPCBUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCB1bmljYXN0X2ZyYW1lczsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgbXBjcF9mcmFtZXM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG9hbV9ieXRlczsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3Qgb2FtX2ZyYW1lczsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgcmVwb3J0X2ZyYW1lczsgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZXBvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgYWJvcnRfZnJhbWVzOyAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmY3NfZXJyb3I7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgY3JjXzhfZXJyb3I7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBDUkM4IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG91dF9vZl9zbG90OyAgICAgICAvKio8IFRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3Qgb3ZlcnNpemVfZXJyb3I7ICAgIC8qKjwgVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBydW50X2Vycm9yOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0IiBncm91cCBvZiAiZXBvbl9wYXRoXzEwZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xMGdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2NmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xMGdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5OyAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX3BhdGhfMTBnX3VzIiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIHN0YXQ7ICAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAKKyAqICJlcG9uX3BhdGhfMTBnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fcGF0aF8xMGdfdXMiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIHN0YXQ7ICAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgCisgKiAiZXBvbl9wYXRoXzEwZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xMGdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJlcG9uX3BhdGhfMTBnX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleTsgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xZ19kcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uX25pOyAvKio8IEVQT04gTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMUcgZG93bnN0cmVhbSBwYXRoLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMWdfZHMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgZGVmYXVsdF9mZWNfc3RhdGU7IC8qKjwgRGVmYXVsdCBGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMUcgZG93bnN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuICovCisgICAgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSByYW1hbl9tb2RlOyAgICAvKio8IFJhbWFuIG1pdGlnYXRpb24gbW9kZSBmb3IgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBSYW1hbiBtaXRpZ2F0aW9uIGNhbm5vdCBjb2V4aXN0IHdpdGggdHVyYm8gbW9kZS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuICovCisgICAgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSB0dXJib18yZ19tb2RlOyAgICAvKio8IE9wZXJhdGUgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBhdCB0aGUgdHVyYm8gMkcgZGF0YSByYXRlIG9uIHRoaXMgRVBPTiBOSS4gIFJhbWFuIG1pdGlnYXRpb24gY2Fubm90IGNvZXhpc3Qgd2l0aCB0dXJibyBtb2RlLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4gKi8KKyAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHByYnNfZ2VuZXJhdG9yOyAgICAvKio8IERTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJlcG9uX3BhdGhfMWdfZHMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0IiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xZ19kcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCBieXRlczsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc182NDsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzY1XzEyNzsgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzEyOF8yNTU7ICAgIC8qKjwgVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18yNTZfNTExOyAgICAvKio8IFRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNTEyXzEwMjM7ICAgLyoqPCBUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xMDI0XzE1MTg7ICAvKio8IFRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xNTE5XzIwNDc7ICAvKio8IFRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18yMDQ4XzQwOTU7ICAvKio8IFRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc180MDk2XzkyMTY7ICAvKio8IFRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc185MjE3XzE2MzgzOyAvKio8IFRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBicm9hZGNhc3RfZnJhbWVzOyAgLyoqPCBUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZGF0YV9ieXRlczsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG11bHRpY2FzdF9mcmFtZXM7ICAvKio8IFRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCB1bmljYXN0X2ZyYW1lczsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG9hbV9ieXRlczsgICAgICAgICAvKio8IE51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3Qgb2FtX2ZyYW1lczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZ2F0ZV9mcmFtZXM7ICAgICAgIC8qKjwgTnVtYmVyIG9mIGdhdGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG1wY3BfZnJhbWVzOyAgICAgICAvKio8IE51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBhYm9ydF9mcmFtZXM7ICAgICAgLyoqPCBOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0IiBncm91cCBvZiAiZXBvbl9wYXRoXzFnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMWdfZHMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJlcG9uX3BhdGhfMWdfZHMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleTsgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9wYXRoXzFnX2RzIiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgCisgKiAiZXBvbl9wYXRoXzFnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9wYXRoXzFnX2RzIiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgc3RhdDsgICAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAKKyAqICJlcG9uX3BhdGhfMWdfZHMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzFnX2RzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xZ19kcyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb25fbmk7IC8qKjwgRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxRyB1cHN0cmVhbSBwYXRoLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMWdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgZGVmYXVsdF9mZWNfc3RhdGU7IC8qKjwgRGVmYXVsdCBGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMUcgdXBzdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBzeW5jX3RpbWVfdHE7ICAgICAgICAgICAgLyoqPCBUaW1lIHF1YW50YSBvZiBzeW5jIGF0IHN0YXJ0IG9mIFVTIGJ1cnN0LiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4gKi8KKyAgICBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyBwcmJzX2NoZWNrZXI7ICAgIC8qKjwgVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfcHJic19zdGF0dXMgcHJic19zdGF0dXM7ICAgICAgICAgICAgIC8qKjwgUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGJ5dGVzOyAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNjQ7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNjVfMTI3OyAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzEyOF8yNTU7ICAgIC8qKjwgVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMjU2XzUxMTsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc181MTJfMTAyMzsgICAvKio8IFRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xMDI0XzE1MTg7ICAvKio8IFRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMTUxOV8yMDQ3OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzIwNDhfNDA5NTsgIC8qKjwgVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc180MDk2XzkyMTY7ICAvKio8IFRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfOTIxN18xNjM4MzsgLyoqPCBUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGJyb2FkY2FzdF9mcmFtZXM7ICAvKio8IFRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZGF0YV9ieXRlczsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBtdWx0aWNhc3RfZnJhbWVzOyAgLyoqPCBUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IHVuaWNhc3RfZnJhbWVzOyAgICAvKio8IFRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG1wY3BfZnJhbWVzOyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG9hbV9ieXRlczsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBvYW1fZnJhbWVzOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IHJlcG9ydF9mcmFtZXM7ICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgYWJvcnRfZnJhbWVzOyAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZjc19lcnJvcjsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGNyY184X2Vycm9yOyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgQ1JDOCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG91dF9vZl9zbG90OyAgICAgICAvKio8IFRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBvdmVyc2l6ZV9lcnJvcjsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgcnVudF9lcnJvcjsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJlcG9uX3BhdGhfMWdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xZ191cyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgY2ZnOyAgIC8qKjwgU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2NmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xZ191cyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX3BhdGhfMWdfdXMiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkIHN0YXQ7ICAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAKKyAqICJlcG9uX3BhdGhfMWdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX3BhdGhfMWdfdXMiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIAorICogImVwb25fcGF0aF8xZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMWdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZXBvbl9wYXRoXzFnX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcKK3sKKyAgICBiY21vbHRfYXV0b19jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXk7ICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJlcG9uX3JwIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9ycF9rZXkKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uX25pOyAgICAgICAgICAgICAvKio8IEVQT04gTkkgY29udGFpbmluZyB0aGlzIFJQLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSBsaW5rX3JhdGU7ICAgIC8qKjwgTGluayByYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJQLiAgTXVzdCBiZSBvbmUgb2YgMTAvMTAsIDEwLzEsIG9yIDEvMS4gKi8KK30gYmNtb2x0X2Vwb25fcnBfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImVwb25fcnAiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fbGxpZCBiYXNlX2xsaWQ7ICAgICAgICAgICAgICAgICAvKio8IEJhc2UgKGxvd2VzdCkgbG9naWNhbCBsaW5rIGlkZW50aWZpZXIgZm9yIHRoaXMgUlAuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLCBub3Igd2hpbGUgYW55IG5vbi1zeXN0ZW0gbGlua3MgZXhpc3QuICBUaGUgc3VtIG9mIHRoaXMgdmFsdWUgYW5kIG1heF9saW5rcyBmb3IgdGhpcyBSUCBtdXN0IGJlIDB4N2VmZiBvciBzbWFsbGVyLiAqLworICAgIGJjbW9zX2Jvb2wgbXBjcF9kaXNjX2VuOyAgICAgICAgICAgICAgICAgICAgLyoqPCBHb3Zlcm5zIHdoZXRoZXIgZGlzY292ZXJ5IGdhdGVzIGZvciB0aGlzIFJQIGFyZSBpc3N1ZWQgICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIG1wY3BfZGlzY19nbnRfbGVuX3RxOyAgICAvKio8IExlbmd0aCBvZiBkaXNjb3ZlcnkgZ3JhbnRzIGluIHRpbWUgcXVhbnRhIGZvciB0aGlzIFJQLiAqLworICAgIHVpbnQxNl90IG1wY3BfcmVwb3J0X3RpbWVvdXQ7ICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgbXMgYmVmb3JlIGxpbmtzIGFyZSBkZXJlZ2lzdGVyZWQgZHVlIHRvIG5vIHJlcG9ydCByZWNlaXZlZC4gKi8KKyAgICB1aW50MTZfdCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93OyAgICAgIC8qKjwgTWF4aW11bSBudW1iZXIgb2YgTVBDUCByZWdpc3RyYXRpb25zIHBlciBkaXNjb3Zlcnkgd2luZG93IG9uIHRoaXMgUlAgKDAgaW5kaWNhdGVzIHVubGltaXRlZCkuICovCisgICAgdWludDE2X3QgbWF4X2xpbmtzOyAvKio8IE1heGltdW0gbnVtYmVyIG9mIGxpbmtzIHRvIHJlZ2lzdGVyIG9uIHRoaXMgRVBPTl9SUC4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQsIG5vciB3aGlsZSBhbnkgbm9uLXN5c3RlbSBsaW5rcyBleGlzdC4gIFRoZSBhY3R1YWwgbGltaXQgaXMgZGVwZW5kZW50IG9uIHRoZSBzeXN0ZW0gbW9kZS4gKi8KKyAgICBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aDsgIC8qKjwgRGVmYXVsdCB1cHN0cmVhbSBiYW5kd2lkdGggZm9yIG5ld2x5IGNyZWF0ZWQgbGlua3MuICovCisgICAgZG91YmxlIHJhdGVfb2ZfcmVmcmFjdGlvbjsgIC8qKjwgVGhlc2UgYXJlIG1hZ2ljIG51bWJlcnMgZGVyaXZlZCB1c2luZyB0aGUgcHJvY2VzcyBkZWZpbmVkIGluIElUVS1UIEcuOTg0LjMgQXBwZW5kaXggVklJIChodHRwOi8vd3d3Lml0dS5pbnQvcmVjL1QtUkVDLUcuOTg0LjMtMjAwOTExLVMhQW1kMi9lbikgYW5kIElUVS1UIEcuOTg3LjMgQXBwZW5kaXggSUkgKGh0dHA6Ly93d3cuaXR1LmludC9yZWMvVC1SRUMtRy45ODcuMy0yMDEwMTAtUy9lbikgKi8KK30gYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZXBvbl9ycCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcnBfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcnBfa2V5IGtleTsgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3JwX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJncGlvIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bpb19rZXkKK3sKKyAgICB1aW50MzJfdCByZXNlcnZlZDsgICAgICAgICAgLyoqPCBSZXNlcnZlZCAoc2V0IHRvIDApLiAqLworICAgIGJjbW9sdF9ncGlvX3BpbiBncGlvX2lkOyAgICAvKio8IEdQSU8gSUQuICovCit9IGJjbW9sdF9ncGlvX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncGlvIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bpb19jZmdfZGF0YQoreworICAgIGJjbW9sdF9ncGlvX3Bpbl9kaXIgZGlyZWN0aW9uOyAgLyoqPCBHUElPIFBJTiBkaXJlY3Rpb24gKGlucHV0IG9yIG91dHB1dCkgKi8KKyAgICBiY21vbHRfZ3Bpb192YWx1ZSB2YWx1ZTsgICAgICAgIC8qKjwgVmFsdWUgdG8gd3JpdGUuICovCit9IGJjbW9sdF9ncGlvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImdwaW8iIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncGlvX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwaW9fa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bpb19jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bpb19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2Nfa2V5Cit7CisgICAgYmNtb2x0X2dwb25fbmkgcG9uX25pOyAgICAgICAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19pZCBhbGxvY19pZDsgIC8qKjwgQWxsb2MgSUQuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YQoreworICAgIGJjbW9sdF9hbGxvY19zdGF0ZSBzdGF0ZTsgICAvKio8IEN1cnJlbnQgQWxsb2MgSUQgc3RhdGUgKi8KKyAgICBiY21vbHRfcG9uX2FsbG9jX3NsYSBzbGE7ICAgLyoqPCBBbGxvYyBJRCBTTEEgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfaWQgb251X2lkOyAgLyoqPCBPTlUgSUQgdGhlIGFsbG9jIElEIGlzIGFzc2lnbmVkIHRvICovCisgICAgYmNtb3NfYm9vbCBjb2xsZWN0X3N0YXRzOyAgIC8qKjwgRW5hYmxlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgdGhpcyBhbGxvYyBJRCAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleTsgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCByeF9ieXRlczsgIC8qKjwgTnVtYmVyIG9mIGFsbG9jIElEIHJlY2VpdmVkIGJ5dGVzLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleTsgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgY2ZnOyAgIC8qKjwgU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgICAgICAgICAgLyoqPCBTdGF0dXMuICovCisgICAgYmNtb2x0X2FsbG9jX3N0YXRlIG5ld19zdGF0ZTsgICAvKio8IG5ldyBzdGF0ZS4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fYWxsb2MiIG9iamVjdC4gCisgKgorICogQ29sbGVjdGVkIGFsbG9jIElEIHN0YXRpc3RpY3MgZnJvbSBnZXRfc3RhdHMgb3BlcmF0aW9uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgICAgIC8qKjwgc3RhdHVzLiAqLworICAgIHVpbnQzMl90IGF2ZXJhZ2VfbnNyX3VzZWQ7ICAgICAgLyoqPCBBdmVyYWdlIE5TUiB1c2VkIGJ5dGVzLiAqLworICAgIHVpbnQzMl90IGF2ZXJhZ2VfbnNyX2FsbG9jYXRlZDsgLyoqPCBBdmVyYWdlIE5TUiBhbGxvY2F0ZWQgYnl0ZXMuICovCisgICAgdWludDMyX3QgYXZlcmFnZV9zcl9yZXBvcnQ7ICAgICAvKio8IEF2ZXJhZ2UgU1IgcmVwb3J0LiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlICJncG9uX2FsbG9jIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgc3RhdDsgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAiZ3Bvbl9hbGxvYyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJncG9uX2FsbG9jIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mICJncG9uX2FsbG9jIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZDsgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9yYWlzZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmcKK3sKKyAgICBiY21vbHRfYXV0b19jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXk7ICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJnZXRfc3RhdHMiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqCisgKiBSdW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YQoreworICAgIHVpbnQzMl90IG51bV9vZl9jeWNsZXM7IC8qKjwgVGhlIG51bWJlciBvZiBjeWNsZXMgdG8gcnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJnZXRfc3RhdHMiIGdyb3VwIG9mICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHMKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXk7ICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2V0X3N0YXRlIiBncm91cCBvZiB0aGUgImdwb25fYWxsb2MiIG9iamVjdC4gCisgKgorICogU2V0cyB0aGUgYWxsb2MncyBhY3RpdmF0aW9uIHN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHByb3RlY3Rpb24gCisgKiBzd2l0Y2hpbmcgb24gYW4gYWN0aXZlLXN0YW5kYnkgUE9OLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgdGhpcyBpc24ndCAKKyAqIG5lY2Vzc2FyeSBzaW5jZSBhbGxvY3MgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggCisgKiB0aGUgT05VLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEKK3sKKyAgICBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uIHN0YXRlOyAgIC8qKjwgU3RhdGUuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInNldF9zdGF0ZSIgZ3JvdXAgb2YgImdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZQoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleTsgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5Cit7CisgICAgYmNtb2x0X2dwb25fbmkgcG9uX25pOyAgICAgICAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7IC8qKjwgR0VNIFBvcnQgSUQuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247ICAgICAgICAgICAgICAgIC8qKjwgR0VNIHBvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisgICAgYmNtb2x0X2dwb25fb251X2lkIG9udV9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgSUQgdGhpcyBHRU0gcG9ydCBpcyBhc3NpZ25lZCB0byAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIGdlbV9wb3J0X3N0YXRlOyAgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBHRU0gcG9ydCBzdGF0ZSAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlOyAgICAgICAgICAgIC8qKjwgRW5hYmxlL0Rpc2FibGUgdGhlIGRvd25zdHJlYW0gZW5jcnlwdGlvbiBtb2RlIG9mIHRoZSBHRU0gUG9ydCAqLworICAgIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZTsgIC8qKjwgVGhlIGRlc3RpbmF0aW9uIHF1ZXVlIG9mIHRoZSBwYWNrZXRzIGFycml2aW5nIG9uIHRoaXMgR0VNIFBvcnQgb24gdGhlIHVwc3RyZWFtIGRpcmVjdGlvbiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEVuYWJsZS9EaXNhYmxlIHRoZSBHRU0gUG9ydCBJRCBpbiB0aGUgT0xUICovCisgICAgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgZGVidWdfZmxvd19jb25maWc7ICAgIC8qKjwgVHJhZmZpYyBmbG93IGRlYnVnIG9wdGlvbnMgKi8KKyAgICB1aW50MTZfdCBtYWNfdGFibGVfZW50cnlfbGltaXQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbWF4aW11bSBudW1iZXIgb2YgTUFDIHRhYmxlIGVudHJpZXMgYWxsb3dlZCBmb3IgdGhpcyBHRU0gcG9ydCAoMCA9IG5vIGxpbWl0KS4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgcnhfcGFja2V0czsgICAgLyoqPCBSZWNlaXZlZCBHRU0gZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHJ4X2J5dGVzOyAgICAgIC8qKjwgUmVjZWl2ZWQgYnl0ZXMuICovCisgICAgdWludDY0X3QgdHhfcGFja2V0czsgICAgLyoqPCBUcmFuc21pdHRlZCBHRU0gZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHR4X2J5dGVzOyAgICAgIC8qKjwgVHJhbnNtaXR0ZWQgYnl0ZXMuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0IiBncm91cCBvZiAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5OyAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgICAgICAgICAgICAgLyoqPCBzdGF0dXMuICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgbmV3X3N0YXRlOyAgIC8qKjwgbmV3IHN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgc3RhdDsgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCBzdGF0OyAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkOyAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fY2xlYXJlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9zdGF0ZSIgZ3JvdXAgb2YgdGhlICJncG9uX2dlbV9wb3J0IiAKKyAqIG9iamVjdC4gCisgKgorICogU2V0cyB0aGUgR0VNIHBvcnQncyBhY3RpdmF0aW9uIHN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHByb3RlY3Rpb24gCisgKiBzd2l0Y2hpbmcgb24gYW4gYWN0aXZlLXN0YW5kYnkgUE9OLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgdGhpcyBpc24ndCAKKyAqIG5lY2Vzc2FyeSBzaW5jZSBHRU0gcG9ydHMgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggCisgKiB0aGUgT05VLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEKK3sKKyAgICBiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uIHN0YXRlOyAgICAvKio8IFN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZXRfc3RhdGUiIGdyb3VwIG9mICJncG9uX2dlbV9wb3J0IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZQoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2YiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9rZXkKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaSBwb25fbmk7ICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KK30gYmNtb2x0X2dwb25faXdmX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2l3Zl9tb2RlIGl3Zl9tb2RlOyAgICAgICAgICAgICAgIC8qKjwgSVdGIG1hcHBpbmcgbW9kZSAqLworI2RlZmluZSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0RBVEFfVVNfVFBJRF9QRVJfRkxPV19MRU4gICAyCisgICAgYmNtb2x0X2Fycl91MTZfMl9oZXggdXNfdHBpZF9wZXJfZmxvdzsgIC8qKjwgVFBJRCB2YWx1ZSBvZiB0aGUgVkxBTiB0YWcgYWRkZWQgdG8gdXBzdHJlYW0gcGFja2V0IHdoZW4gSVdGIG1vZGUgaXMgc2V0IHRvIHBlciBmbG93ICovCisgICAgdWludDE2X3QgdXNfb3RhZ19kaXJlY3RfdHBpZDsgICAgICAgICAgIC8qKjwgVFBJRCB2YWx1ZSBvZiB0aGUgVkxBTiB0YWcgYWRkZWQgdG8gdXBzdHJlYW0gcGFja2V0IHdoZW4gSVdGIG1vZGUgaXMgc2V0IHRvIGRpcmVjdCBtb2RlICovCisgICAgdWludDhfdCB1c19vdGFnX2RpcmVjdF9wYml0OyAgICAgICAgICAgIC8qKjwgUC1iaXQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBkaXJlY3QgbW9kZSAqLworI2RlZmluZSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0RBVEFfRFNfVFBJRF9MRU4gICAgNQorICAgIGJjbW9sdF9hcnJfdTE2XzVfaGV4IGRzX3RwaWQ7ICAgICAgICAgICAvKio8IFBhY2tldHMgbWFya2VkIHdpdGggb25lIG9mIHRoZSBmaXZlIGNvbmZpZ3VyZWQgRFMgVFBJRCBvcHRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLCBhbGwgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkICovCisgICAgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIG1hY190YWJsZV9jb25maWd1cmF0aW9uOyAgICAgLyoqPCBNQUMgdGFibGUgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb247IC8qKjwgTUFDIHRhYmxlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICB1aW50MTZfdCBtYWNfdGFibGVfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBNQUMgdGFibGUgZW50cmllcyBjb25maWd1cmVkIGluIHRoZSBNQUMgdGFibGUgKi8KKyAgICB1aW50MTZfdCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydDsgICAvKio8IEZvcmJpZGRlbiByYW5nZSBmb3IgVmxhbnMsIEZsb3dzIGFuZCBHZW1zIHN0YXJ0IHZhbHVlICovCit9IGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGRzX2hpdF9ldmVudDsgICAgICAgICAgICAgIC8qKjwgRFMgaGl0IGV2ZW50LiAqLworICAgIHVpbnQ2NF90IGRzX21pc3NfZXZlbnQ7ICAgICAgICAgICAgIC8qKjwgRFMgbWlzcyBldmVudC4gKi8KKyAgICB1aW50NjRfdCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50OyAvKio8IERTIGRyb3AgZHVlIHRvIG1pc3MgZXZlbnQuICovCisgICAgdWludDY0X3QgZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50OyAgLyoqPCBEUyBkcm9wIGR1ZSB0byBoaXQgZXZlbnQuICovCisgICAgdWludDY0X3QgZHNfZHJvcF90b19kaXNhYmxlZF9nZW07ICAgLyoqPCBEUyBkcm9wIHRvIGRpc2FibGVkIEdFTS4gKi8KKyAgICB1aW50NjRfdCBuZXdfbWFjX2Rpc2NvdmVyZWQ7ICAgICAgICAvKio8IE5ldyBNQUMgZGlzY292ZXJlZC4gKi8KKyAgICB1aW50NjRfdCBtb3ZlX2V2ZW50OyAgICAgICAgICAgICAgICAvKio8IE1vdmUgZXZlbnQuICovCisgICAgdWludDY0X3QgbmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGw7IC8qKjwgTmV3IE1BQyBkcm9wIGR1ZSB0byBmaWZvIGZ1bGwuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImdwb25faXdmIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImdwb25faXdmIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5OyAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZzsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9pd2YiIG9iamVjdC4gCisgKgorICogQSBNQUMgdGFibGUgc2NhbiBpbml0aWF0ZWQgdXNpbmcgdGhlICJzY2FuX21hY190YWJsZSIgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjX2FkZHJlc3M7ICAvKio8IEVudHJ5IE1BQyBhZGRyZXNzLiAqLworICAgIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiBlbnRyaWVzOyAvKio8IFNjYW4gcmVzdWx0cyBmb3IgdGhpcyBlbnRyeS4gIElmIHRoaXMgbGlzdCBpcyBlbXB0eSwgdGhlIE1BQyBhZGRyZXNzIHdhcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgImdwb25faXdmIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCBzdGF0OyAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mICJncG9uX2l3ZiIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgImdwb25faXdmIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgc3RhdDsgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgImdwb25faXdmIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImdwb25faXdmIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkOyAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9jbGVhcmVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fcmFpc2VkOyAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZ3Bvbl9pd2YiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleTsgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJmbHVzaF9tYWNfdGFibGUiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2YiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhCit7CisgICAgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24gY29udHJvbDsgIC8qKjwgY29udHJvbC4gKi8KKyAgICBiY21vbHRfdmxhbl9pZCB2aWQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWSUQuICovCisgICAgYmNtb2x0X2Zsb3dfaWQgZmxvd19pZDsgICAgICAgICAgICAgICAgIC8qKjwgRkxPVyBJRC4gKi8KK30gYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImZsdXNoX21hY190YWJsZSIgZ3JvdXAgb2YgImdwb25faXdmIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzY2FuX21hY190YWJsZSIgZ3JvdXAgb2YgdGhlICJncG9uX2l3ZiIgCisgKiBvYmplY3QuIAorICoKKyAqIFNjYW5zIE1BQyB0YWJsZSBmb3IgYSBnaXZlbiBNQUMgYWRkcmVzcyB0aGVuIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgCisgKiBpbmZvcm1hdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgIC8qKjwgRW50cnkgTUFDIGFkZHJlc3MuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInNjYW5fbWFjX3RhYmxlIiBncm91cCBvZiAiZ3Bvbl9pd2YiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3ciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleQoreworICAgIGJjbW9sdF9ncG9uX25pIHBvbl9uaTsgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIGJjbW9sdF9mbG93X2lkIGZsb3dfaWQ7IC8qKjwgRmxvdyBJRC4gKi8KK30gYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX3BvcnQ7ICAgIC8qKjwgR0VNIHBvcnQgSUQgKi8KKyAgICBiY21vc19ib29sIHBiaXRfY29udHJvbDsgICAgICAgIC8qKjwgSWYgZW5hYmxlZCwgdGhlIFBiaXRzIHZhbHVlIGlzIHRha2VuIGZyb20gdGhlIG1hcHBpbmcgVkxBTiB0YWcgKElubmVyL091dGVyKSBWTEFOIFBiaXRzIGxvY2F0aW9uIGFuZCBhZGRlZCB0byB0aGUgY29uZmlndXJlZCBHRU0gcG9ydCBJRCB2YWx1ZSB0byBjcmVhdGUgdGhlIEZpbmFsIEdFTSBJRCAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3ciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3ciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaSBwb25fbmk7ICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBiY21vbHRfdmxhbl9pZCB2bGFuX2lkOyAvKio8IHZsYW4gSUQuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCBtYXBwaW5nX21ldGhvZDsgIC8qKjwgVGhlIE1hcHBpbmcgbWV0aG9kIGRlZmluZXMgaG93IHRoZSBmbG93IElEIHdpbGwgYmUgZGV0ZXJtaW5lZCAqLworICAgIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QgbWFwcGluZ190YWc7ICAgICAgICAgICAgICAvKio8IERlZmluZSBpZiB0aGUgb3V0ZXIgb3IgdGhlIGlubmVyIFZMQU4gdGFnIG9mIHRoZSBwYWNrZXQgd2lsbCBkZXRlcm1pbmUgdGhlIGZsb3cgSUQgKi8KKyAgICBiY21vbHRfZHNfdmxhbl9hY3Rpb24gdmxhbl9hY3Rpb247ICAgICAgICAgICAgICAgICAgLyoqPCBEZWZpbmUgdGhlIG91dGVyIFZMQU4gdGFnIG1hbmlwdWxhdGlvbiBvbiB0aGUgcGFja2V0OiB0cmFuc3BhcmVudCBvciByZW1vdmUgKi8KK30gYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3ciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImdwb25faXdmX21hY190YWJsZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaSBwb25fbmk7ICAgICAgICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOyAgLyoqPCBNQUMgYWRkcmVzcy4gKi8KKyAgICBiY21vbHRfdmxhbl9pZCB2bGFuOyAgICAgICAgICAgIC8qKjwgVkxBTi4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2ZfbWFjX3RhYmxlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2Zsb3dfaWQgZmxvd19pZDsgICAgICAgICAvKio8IFRoZSBmbG93IElEIGFzc2lnbmVkIHRvIHRyYWZmaWMgdGhhdCBtYXRjaGVzIHRoaXMgTUFDIHRhYmxlIGVudHJ5LiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdDsgICAgICAgICAgICAgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCB0aGUgTUFDIGVudHJ5IGlzIHN0YXRpYy4gIFN0YXRpYyBlbnRyaWVzIGRvbid0IGFnZS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7IC8qKjwgVGhlIEdFTSBwb3J0IElEIG9mIHRoZSB0cmFmZmljIHRoYXQgY3JlYXRlZCB0aGlzIHRhYmxlIGVudHJ5LiAgVGhpcyBvbmx5IGFwcGxpZXMgdG8gYXV0b21hdGljYWxseS1sZWFybmVkIGVudHJpZXMuICBNYW51YWxseS1hZGRlZCBlbnRyaWVzIHdpbGwgaGF2ZSB0aGUgdmFsdWUgQkNNT0xUX1BPTl9HRU1fUE9SVF9JRF9JTlZBTElELiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWQ7ICAgICAgLyoqPCBUaGUgT05VIElEIGZvciB0aGUgdHJhZmZpYyB0aGF0IGNyZWF0ZWQgdGhpcyB0YWJsZSBlbnRyeS4gIFRoaXMgb25seSB2YWxpZCBpZiBnZW1fcG9ydF9pZCBpcyB2YWxpZC4gIE90aGVyd2lzZSB0aGlzIHdpbGwgYmUgc2V0IHRvIEJDTU9MVF9HUE9OX09OVV9JRF9JTlZBTElELiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImdwb25faXdmX21hY190YWJsZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZzsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJtYWNfYWdlZCIgZ3JvdXAgb2YgImdwb25faXdmX21hY190YWJsZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm1hY19kcm9wcGVkIiBncm91cCBvZiB0aGUgImdwb25faXdmX21hY190YWJsZSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhbiBlbnRyeSBjYW5ub3QgYmUgbGVhcm5lZCBzaW5jZSB0aGUgTUFDIHRhYmxlIGlzIGZ1bGwuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEKK3sKKyAgICBiY21vbHRfZmxvd19pZCBmbG93X2lkOyAvKio8IFRoZSBmbG93IElEIG9mIHRoZSBlbnRyeSB0aGF0IHdhcyBkcm9wcGVkLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibWFjX2Ryb3BwZWQiIGdyb3VwIG9mICJncG9uX2l3Zl9tYWNfdGFibGUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm1hY19tb3ZlIiBncm91cCBvZiB0aGUgImdwb25faXdmX21hY190YWJsZSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiB0aGUgTUFDIHRhYmxlIGlzIGluIG1vdmUgbW9kZSBhbmQgYSBwYWNrZXQgaXMgc2VlbiB0aGF0IG1hdGNoZXMgb24gCisgKiBNQUMgYWRkcmVzcyAvIFZJRCBidXQgZG9lc24ndCBtYXRjaCBvbiBmbG93IElELiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhCit7CisgICAgYmNtb2x0X2Zsb3dfaWQgb2xkX2Zsb3dfaWQ7IC8qKjwgVGhlIGZsb3cgSUQgaW4gdGhlIGN1cnJlbnQgTUFDIHRhYmxlIGVudHJ5LiAqLworICAgIGJjbW9sdF9mbG93X2lkIG5ld19mbG93X2lkOyAvKio8IFRoZSBmbG93IElEIHNlZW4gaW4gdGhlIHRyYWZmaWMgc3RyZWFtLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibWFjX21vdmUiIGdyb3VwIG9mICJncG9uX2l3Zl9tYWNfdGFibGUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAibmV3X21hYyIgZ3JvdXAgb2YgdGhlICJncG9uX2l3Zl9tYWNfdGFibGUiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBuZXcgTUFDIGFkZHJlc3MgLyBWSUQgY29tYmluYXRpb24gaXMgc2VlbiBpbiB0aGUgdXBzdHJlYW0gCisgKiB0cmFmZmljIHN0cmVhbS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhCit7CisgICAgYmNtb2x0X2Zsb3dfaWQgZmxvd19pZDsgLyoqPCBUaGUgZmxvdyBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBlbnRyeS4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibmV3X21hYyIgZ3JvdXAgb2YgImdwb25faXdmX21hY190YWJsZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWMKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2ZfbWFjX3RhYmxlIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgbWFjX2FnZWQ7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibWFjX2FnZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbWFjX2Ryb3BwZWQ7IC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibWFjX2Ryb3BwZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbWFjX21vdmU7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibWFjX21vdmUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbmV3X21hYzsgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibmV3X21hYyIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImdwb25faXdmX21hY190YWJsZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2ZfdXNfZmxvdyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5Cit7CisgICAgYmNtb2x0X2dwb25fbmkgcG9uX25pOyAgICAgICAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7IC8qKjwgR0VNIFBvcnQgIElELiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2ZfdXNfZmxvdyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZmxvd19pZCBmbG93X2lkOyAgICAgICAgICAgICAvKio8IEZsb3cgSUQuICovCisgICAgYmNtb3NfYm9vbCBtYWNfbGVhcm5pbmc7ICAgICAgICAgICAgLyoqPCBNQUMgbGVhcm5pbmcuICovCisgICAgYmNtb2x0X3VzX3ZsYW5fYWN0aW9uIHZsYW5fYWN0aW9uOyAgLyoqPCBWTEFOIGFjdGlvbi4gKi8KKyAgICBiY21vbHRfdmxhbl90YWcgdmxhbl90YWc7ICAgICAgICAgICAvKio8IFZsYW4gdGFnLiAqLworICAgIHVpbnQ4X3QgdHBpZF9pbmRleDsgICAgICAgICAgICAgICAgIC8qKjwgVFBJRCBpbmRleC4gKi8KK30gYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZ3Bvbl9pd2ZfdXNfZmxvdyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfa2V5Cit7CisgICAgYmNtb2x0X2dwb25fbmkgcG9uX25pOyAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCit9IGJjbW9sdF9ncG9uX25pX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YQoreworICAgIGJjbW9sdF9wb25fc3RhdHVzIHBvbl9zdGF0dXM7ICAgLyoqPCBQT04gc3RhdHVzIHBhcmFtZXRlcnMgKi8KKyAgICBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggYXZhaWxhYmxlX2JhbmR3aWR0aDsgLyoqPCBQT04gYXZhaWxhYmxlIGJhbmR3aWR0aCBwYXJhbWV0ZXJzICovCisgICAgdWludDE2X3QgbnVtYmVyX29mX2FjdGl2ZV9vbnVzOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGFjdGl2ZSBPTlVzIG9uIHRoZSBQT04gKi8KKyAgICB1aW50MTZfdCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251czsgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgYWN0aXZlIHN0YW5kYnkgb251cy4gKi8KKyAgICBiY21vbHRfcHJic19zdGF0dXMgcHJic19zdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyICovCisgICAgYmNtb2x0X3Bvbl9kaXN0YW5jZSBwb25fZGlzdGFuY2U7ICAgICAgICAgICAgICAgICAgIC8qKjwgUE9OIGRpc3RhbmNlICovCisgICAgdWludDMyX3QgcmFuZ2luZ193aW5kb3dfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmFuZ2luZyB3aW5kb3cgc2l6ZSAqLworICAgIHVpbnQzMl90IHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheTsgICAgICAgICAgICAvKio8IE9OVSBwcmUtYXNzaWduZWQgZXF1YWxpemF0aW9uIGRlbGF5ICovCisgICAgdWludDMyX3QgZXFkX2N5Y2xlc19udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBIb3cgbWFueSByYW5naW5nIHdpbmRvd3MgYXJlIG9wZW5lZCBkdXJpbmcgYSBzaW5nbGUgT05VIGFjdGl2YXRpb24gcHJvY2VzcyAqLworICAgIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgcG93ZXJfbGV2ZWw7ICAgICAgICAgICAgIC8qKjwgT05VIHBvd2VyIGxldmVsIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBkc19mZWNfbW9kZTsgICAgICAgICAgICAgICAvKio8IERTIEZFQyBtb2RlICovCisgICAgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIGRyaWZ0X2NvbnRyb2w7ICAgICAgICAgLyoqPCBEcmlmdCBjb250cm9sIHByb2Nlc3MgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9iZXJfaW50ZXJ2YWwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbDsgIC8qKjwgRFMgQkVSIHJlcG9ydGluZyBpbnRlcnZhbCAqLworICAgIHVpbnQ4X3QgbG9zX2FsYXJtX3RocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTE9TIGFsYXJtIHRocmVzaG9sZCAqLworICAgIGJjbW9sdF9zdGF0dXMgbG9zX2luaXRpYWxfdmFsdWU7ICAgICAgICAgICAgICAgIC8qKjwgTE9TIGluaXRpYWwgdmFsdWUgZm9sbG93aW5nIFBPTiBhY3RpdmF0aW9uICovCisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzIG9udV9hbGFybXNfdGhyZXNob2xkczsgICAgLyoqPCBPTlUgYWxhcm1zIHRocmVzaG9sZHMgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgYmVyX21vbml0b3I7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQkVSIG1vbml0b3IgcHJvY2VzcyBjb25maWd1cmF0aW9uICovCisgICAgdWludDE2X3QgcGxvYW1fYWNrX3RpbWVvdXQ7ICAgICAgICAgICAgICAgICAvKio8IFRpbWVvdXQgZm9yIHJlY2VpdmluZyBBQ0sgcGxvYW0gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiBvbnVfYWN0aXZhdGlvbjsgIC8qKjwgT05VIGFjdGl2YXRpb24gY29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gc25fYWNxdWlzaXRpb247ICAvKio8IFNlcmlhbCBOdW1iZXIgcHJvY2VzcyBjb25maWd1cmF0aW9uICovCisgICAgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlIGtleV9leGNoYW5nZTsgICAgICAvKio8IEtleSBFeGNoYW5nZSBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHByb3RlY3Rpb25fc3dpdGNoaW5nOyAgICAgICAvKio8IFByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbnRyb2wgKi8KKyAgICBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlOyAvKio8IENCUiBSZWFsIFRpbWUgYWxsb2NhdGlvbiBwcm9maWxlICovCisjZGVmaW5lIEJDTU9MVF9HUE9OX05JX0NGR19EQVRBX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFX0xFTiAgMgorICAgIGJjbW9sdF9hcnJfdTE2XzIgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGU7ICAgICAgICAgICAgICAgIC8qKjwgQ0JSIG5vbiBSZWFsIFRpbWUgYWxsb2NhdGlvbiBwcm9maWxlICovCisgICAgYmNtb2x0X3Bvbl9kYmEgZGJhOyAvKio8IERCQSBjb25maWd1cmF0aW9uICovCisgICAgYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gcG93ZXJfbWFuYWdlbWVudDsgICAgICAgICAgICAgLyoqPCBPTlUgcG93ZXIgbWFuYWdlbWVudCBjb250cm9sICovCisgICAgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3M7ICAgICAgICAgLyoqPCBSb2d1ZSBPTlUgZGV0ZWN0aW9uIHByb2Nlc3MgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3Jpbmc7IC8qKjwgUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZyAqLworICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHByYnNfY2hlY2tlcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVTIFBSQlMgY2hlY2tlciBjb25maWd1cmF0aW9uICovCisgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyBwcmJzX2dlbmVyYXRvcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2lkIG1pbl9kYXRhX2FsbG9jX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1pbiBkYXRhIEFsbG9jIElEIHZhbHVlICovCisgICAgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uOyAgIC8qKjwgT3B0aW9uIHRvIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBkZWFjdGl2YXRpb24gb2YgT05VcyBkdWUgdG8gYWxhcm1zICovCisgICAgdWludDMyX3QgdXNfYmFuZHdpZHRoX2xpbWl0OyAgICAvKio8IFRvdGFsIFBPTiB1cHN0cmVhbSBiYW5kd2lkdGggbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZC4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IGFsbF9vbnVzOyAgICAgICAgICAgICAgICAgICAvKio8IEFsbCBPTlVzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggYWxsX21jYXN0X2dlbV9wb3J0czsgICAvKio8IEFsbCBtdWx0aWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyBkZWJ1ZzsgLyoqPCBQT04gTkkgZGVidWcgcGFyYW1ldGVycyAqLworICAgIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyBvbnVfdXBncmFkZV9wYXJhbXM7ICAvKio8IE9OVSB1cGdyYWRlIHBhcmFtcy4gKi8KKyAgICB1aW50MTZfdCBwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0OyAgICAgLyoqPCBQUyB0eXBlIEMgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2w7ICAgICAgLyoqPCBPcHRpb24gdG8gZGlzYWJsZSB0aGUgYmlwMzIgaW5kaWNhdGlvbiB3aGVuIHRoZSB2YWx1ZSBpcyB6ZXJvICovCit9IGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0IiBncm91cCBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGZlY19jb2Rld29yZHM7ICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgRkVDIGNvZGV3b3Jkcy4gKi8KKyAgICB1aW50NjRfdCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkOyAvKio8IFJlY2VpdmVkIHVuY29ycmVjdGVkIEZFQyBjb2Rld29yZHMuICovCisgICAgdWludDY0X3QgYmlwOF9ieXRlczsgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBieXRlcyBwcm90ZWN0ZWQgYnkgYmlwOC4gKi8KKyAgICB1aW50NjRfdCBiaXA4X2Vycm9yczsgICAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIGJpcDggZXJyb3JzLiAqLworICAgIHVpbnQ2NF90IHJ4X2dlbV9wYWNrZXRzOyAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgR0VNIGZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCByeF9nZW1fZHJvcHBlZDsgICAgICAgICAgICAvKio8IFJlY2VpdmVkIGRyb3BwZWQgR0VNIElEIHBhY2tldHMuICovCisgICAgdWludDY0X3QgcnhfZ2VtX2lkbGU7ICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBpZGxlIEdFTSBmcmFtZXMuICovCisgICAgdWludDY0X3QgcnhfZ2VtX2NvcnJlY3RlZDsgICAgICAgICAgLyoqPCBSZWNlaXZlZCBjb3JyZWN0ZWQgR0VNIGZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCByeF9nZW1faWxsZWdhbDsgICAgICAgICAgICAvKio8IFJlY2VpdmVkIGlsbGVnYWwgR0VNIGZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCByeF9hbGxvY2F0aW9uc192YWxpZDsgICAgICAvKio8IFJlY2VpdmVkIHZhbGlkIGFsbG9jYXRpb25zLiAqLworICAgIHVpbnQ2NF90IHJ4X2FsbG9jYXRpb25zX2ludmFsaWQ7ICAgIC8qKjwgUmVjZWl2ZWQgaW52YWxpZCBhbGxvY2F0aW9ucy4gKi8KKyAgICB1aW50NjRfdCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZDsgICAvKio8IFJlY2VpdmVkIGRpc2FibGVkIGFsbG9jYXRpb25zLiAqLworICAgIHVpbnQ2NF90IHJ4X3Bsb2FtczsgICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgUGxvYW1zLiAqLworICAgIHVpbnQ2NF90IHJ4X3Bsb2Ftc19ub25faWRsZTsgICAgICAgIC8qKjwgUmVjZWl2ZWQgbm9uIGlkbGUgUGxvYW1zLiAqLworICAgIHVpbnQ2NF90IHJ4X3Bsb2Ftc19lcnJvcjsgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgZXJyb3IgUGxvYW1zLiAqLworICAgIHVpbnQ2NF90IHJ4X3Bsb2Ftc19kcm9wcGVkOyAgICAgICAgIC8qKjwgUmVjZWl2ZWQgZHJvcHBlZCBQbG9hbXMuICovCisgICAgdWludDY0X3QgcnhfY3B1OyAgICAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBDUFUgcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCByeF9vbWNpOyAgICAgICAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yOyAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMuICovCisgICAgdWludDY0X3QgcnhfZHJvcHBlZF90b29fc2hvcnQ7ICAgICAgLyoqPCBSZWNlaXZlZCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gc2hvcnQuICovCisgICAgdWludDY0X3QgcnhfZHJvcHBlZF90b29fbG9uZzsgICAgICAgLyoqPCBSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nLiAqLworICAgIHVpbnQ2NF90IHJ4X2NyY19lcnJvcnM7ICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGNyYyBlcnJvci4gKi8KKyAgICB1aW50NjRfdCByeF9rZXlfZXJyb3JzOyAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBrZXkgZXJyb3IuICovCisgICAgdWludDY0X3QgcnhfZnJhZ21lbnRzX2Vycm9yczsgICAgICAgLyoqPCBSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gZnJhZ21lbnRhdGlvbiBlcnJvci4gKi8KKyAgICB1aW50NjRfdCByeF9wYWNrZXRzX2Ryb3BwZWQ7ICAgICAgICAvKio8IEdsb2JhbCBkcm9wcGVkIHBhY2tldHMuICovCisgICAgdWludDY0X3QgdHhfZ2VtOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc21pdHRlZCBHRU0gZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHR4X3Bsb2FtczsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNtaXR0ZWQgUGxvYW1zLiAqLworICAgIHVpbnQ2NF90IHR4X2dlbV9mcmFnbWVudHM7ICAgICAgICAgIC8qKjwgVHJhbnNtaXR0ZWQgR0VNIGZyYWdtZW50cy4gKi8KKyAgICB1aW50NjRfdCB0eF9jcHU7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zbWl0dGVkIENQVSBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHR4X29tY2k7ICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNtaXR0ZWQgT01DSSBwYWNrZXRzLiAqLworICAgIHVpbnQ4X3QgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkOyAgICAvKio8IFRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGguICovCisgICAgdWludDY0X3QgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aDsgICAgIC8qKjwgVHJhbnNtaXR0ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoLiAqLworICAgIHVpbnQ2NF90IHR4X2Ryb3BwZWRfdHBpZF9taXNzOyAgICAgICAgICAvKio8IERyb3BwZWQgYmVjYXVzZSBvZiBUUElEIG1pc3MuICovCisgICAgdWludDY0X3QgdHhfZHJvcHBlZF92aWRfbWlzczsgICAgICAgICAgIC8qKjwgRHJvcHBlZCBiZWNhdXNlIG9mIFZJRCBtaXNzLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgY2ZnOyAgIC8qKjwgU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uICovCit9IGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZzsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNwdV9wYWNrZXRzX2ZhaWx1cmUiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIEEgZmFpbHVyZSB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSAiY3B1X3BhY2tldHMiIHByb3h5IG9wZXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YQoreworICAgIGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIGVycm9yOyAgICAvKio8IFRoZSBlcnJvciB0aGF0IHdhcyBlbmNvdW50ZXJlZC4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7ICAgICAgICAgLyoqPCBUaGUgR0VNIHBvcnQgdGhhdCBjYXVzZWQgdGhlIGVycm9yLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY3B1X3BhY2tldHNfZmFpbHVyZSIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAibG9zIiBncm91cCBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBzdGF0dXM7ICAgLyoqPCBzdGF0dXMuICovCit9IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxvcyIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2xvcworeworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9sb3M7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfZGlzY292ZXJlZCIgZ3JvdXAgb2YgdGhlICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhCit7CisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlcjsgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIHVpbnQzMl90IHJhbmdpbmdfdGltZTsgICAgICAgICAgICAgIC8qKjwgcmFuZ2luZyB0aW1lLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWQ7ICAgICAgICAgIC8qKjwgb251X2lkLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9kaXNjb3ZlcmVkIiBncm91cCBvZiAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV91cGdyYWRlX2NvbXBsZXRlIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdHVzOyAgLyoqPCBTdWNjZXNzIG9yIGZhaWx1cmUuICBBZ2FpbnN0IGVudGlyZSB1cGdyYWRlIHByb2Nlc3MuICovCisgICAgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIGxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzOyAgICAvKio8IExpc3Qgb2YgT05VLUlEcyB0aGUgdXBncmFkZSBmYWlsZWQgZm9yLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV91cGdyYWRlX2NvbXBsZXRlIiBncm91cCBvZiAiZ3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqCisgKiBBZnRlciBhIHN3aXRjaG92ZXIgaXMgY29tcGxldGUgYW5kIGFsbCBPTlUgcmFuZ2luZyB0aW1lcyBoYXZlIHN0YWJpbGl6ZWQsIAorICogdGhpcyBpbmRpY2F0aW9uIGlzIHNlbnQgdG8gaW5mb3JtIHRoZSBob3N0IG9mIGFsbCBuZXcgT05VIEVRRHMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiBvbnVzOyAgLyoqPCBPTlVzLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiBncm91cCBvZiAKKyAqICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiAKKyAqIGdyb3VwIG9mIHRoZSAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgcmVzdWx0OyAgIC8qKjwgUmVzdWx0LiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiAKKyAqIGdyb3VwIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiIGdyb3VwIG9mIAorICogdGhlICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhCit7CisgICAgYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCByZXN1bHQ7ICAgIC8qKjwgUmVzdWx0LiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIiBncm91cCAKKyAqIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgd2luZG93X3R5cGU7ICAgICAgICAgIC8qKjwgU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyAqLworICAgIGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgbWVhc3VyZW1lbnRfc3RhdHVzOyAvKio8IFN0YXR1cyBvZiB0aGUgcm9ndWUgT05VIGRldGVjdGlvbiByZXN1bHQuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2NfaWQgYWxsb2NfaWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWxsb2MtSUQgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfaWQgb251X2lkOyAgICAgICAgICAgICAgICAgIC8qKjwgT05VLUlEICovCisgICAgYmNtb3NfYm9vbCBpc19kZWxpbmVhdGlvbjsgICAgICAgICAgICAgICAgICAvKio8IEJ1cnN0IERlbGluZWF0aW9uIGRldGVjdGVkIGR1cmluZyB0aGUgcm9ndWUgT05VIGRldGVjdGlvbi4gKi8KKyAgICBiY21vc19ib29sIGlzX2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSXMgRUQuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIHJ4X2RhdGE7ICAgICAgICAgICAgICAgICAvKio8IENhcHR1cmVkIFBMT0FNdSBtZXNzYWdlIGlmIHRoZSBidXJzdCBkZWxpbmllYXRpb24gd2FzIGRldGVjdGVkLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZCBwbG9hbV9yZWNlaXZlZF9vbnVfaWQ7ICAgLyoqPCBPTlUgSUQgcmVjZWl2ZWQgaW4gdGhlIHBsb2FtICovCisgICAgYmNtb3NfYm9vbCBwbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3I7ICAgICAgICAvKio8IENyYyBlcnJvciBpbiB0aGUgcmVjZWl2ZWQgcGxvYW0gKi8KK30gYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IiBncm91cCAKKyAqIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIgCisgKiBncm91cCBvZiAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCIgZ3JvdXAgCisgKiBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEKK3sKKyAgICB1aW50MzJfdCBudW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyOyAgLyoqPCBudW1iZXIgb2YgZGV0ZWN0ZWQgZGVsaW1pdGVyLiAqLworICAgIGJjbW9sdF9zdGF0dXMgZW5lcmd5X2RldGVjdF9zaWduYWw7ICAgICAvKio8IGVuZXJneSBkZXRlY3Qgc2lnbmFsLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiAKKyAqIGdyb3VwIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25fbmlfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mICJncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIHN0YXQ7ICAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mICJncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3Jlc3VsdCByZXN1bHQ7ICAgICAgICAgICAgICAgLyoqPCBSZXN1bHQuICovCisgICAgYmNtb2x0X3Bvbl9zdGF0ZSBwcmV2aW91c19zdGF0ZTsgICAgLyoqPCBQcmV2aW91cyBzdGF0ZS4gKi8KKyAgICBiY21vbHRfcG9uX3N0YXRlIG5ld19zdGF0ZTsgICAgICAgICAvKio8IE5ldyBzdGF0ZS4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiIGdyb3VwIG9mICJncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9zdHJfNjQgdG9kX3N0cmluZzsgICAvKio8IHRvZF9zdHJpbmcuICovCisgICAgdWludDMyX3Qgc2ZjOyAgICAgICAgICAgICAgIC8qKjwgc2ZjLiAqLworICAgIHVpbnQ2NF90IHJ0Y19vZmZzZXRfc2VjOyAgICAvKio8IHJ0Y19vZmZzZXRfc2VjLiAqLworICAgIHVpbnQzMl90IHJ0Y19vZmZzZXRfbnNlYzsgICAvKio8IHJ0Y19vZmZzZXRfbnNlYy4gKi8KKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgLyoqPCBzdGF0dXMuICovCit9IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIGFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZDsgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGNwdV9wYWNrZXRzX2ZhaWx1cmU7ICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiY3B1X3BhY2tldHNfZmFpbHVyZSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkOyAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGxvczsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImxvcyIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvbnVfZGlzY292ZXJlZDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfZGlzY292ZXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvbnVfdXBncmFkZV9jb21wbGV0ZTsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfdXBncmFkZV9jb21wbGV0ZSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZDsgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWU7ICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkOyAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0OyAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkOyAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9jbGVhcmVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fcmFpc2VkOyAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgdG9kX3JlcXVlc3RfY29tcGxldGVkOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAidG9kX3JlcXVlc3RfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7ICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiZGlzYWJsZV9zZXJpYWxfbnVtYmVyIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEKK3sKKyAgICBiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgY29udHJvbDsgICAvKio8IGNvbnRyb2wuICovCisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlcjsgICAgICAgICAgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkaXNhYmxlX3NlcmlhbF9udW1iZXIiIGdyb3VwIG9mICJncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcgoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXI7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlIAorICogInByb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YQoreworICAgIGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlIG9udV9zdGF0ZTsgIC8qKjwgb251IHN0YXRlLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2IG9udV9saXN0OyAgIC8qKjwgb251IGxpc3QuICovCit9IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAKKyAqICJwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyZXNldCIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3Jlc2V0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2dwb25fbmlfcmVzZXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJyb2d1ZV9kZXRlY3Rpb25fd2luZG93IiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgd2luZG93X3R5cGU7ICAvKio8IFR5cGUgb2Ygc2lsZW50IG1lYXN1cmVtZW50IHRvIGV4ZWN1dGUgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19pZCBhbGxvY19pZDsgICAgICAgICAgICAgIC8qKjwgQUxMT0MgSUQgdG8gc2NhbiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWQ7ICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgSUQgdG8gc2NhbiAqLworICAgIGJjbW9zX2Jvb2wgc2Vjb25kX3Jhbmdpbmdfd2luZG93OyAgICAgICAgICAgLyoqPCBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLworfSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9vbnVfc3RhdGUiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqCisgKiBTZXQgdGhlIG9wZXJhdGlvbiBzdGF0ZSBvZiBhbGwgT05Vcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YQoreworICAgIGJjbW9sdF9vbnVfb3BlcmF0aW9uIG9udV9zdGF0ZTsgLyoqPCBOZXcgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiAgVGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1heSBiZSBjb25maWd1cmVkIGJ5IHRoZSBHUE9OIE5JIGNvbmZpZ3VyYXRpb24gb2JqZWN0IDogZ3Bvbl9uaS5jZmcuc25fYWNxdWlzaXRpb24uICovCit9IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZXRfb251X3N0YXRlIiBncm91cCBvZiAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZQoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2V0X3Bvbl9zdGF0ZSIgZ3JvdXAgb2YgdGhlICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEKK3sKKyAgICBiY21vbHRfcG9uX29wZXJhdGlvbiBwb25fc3RhdGU7IC8qKjwgUE9OIHN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2V0X3Bvbl9zdGF0ZSIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7ICAgICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIiAKKyAqIGdyb3VwIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXJ0X29udV91cGdyYWRlIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqCisgKiBPTFQgdG8gT05VIGZpcm13YXJlIHRyYW5zZmVyIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhCit7CisgICAgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgbGlzdF9vZl9vbnVfaWRzOyAvKio8IExpc3Qgb2YgT05VIElEcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGFydF9vbnVfdXBncmFkZSIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJ0b2RfcmVxdWVzdCIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3Q7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJicm9hZGNhc3RfcGxvYW1fcGFja2V0IiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhCit7CisjZGVmaW5lIEJDTU9MVF9HUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfREFUQV9QTE9BTV9MRU4gICAgMTIKKyAgICBiY21vbHRfYXJyX3U4XzEyIHBsb2FtOyAvKio8IHBsb2FtLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldAoreworICAgIGJjbW9sdF9wcm94eSBoZHI7ICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNwdV9wYWNrZXRzIiBncm91cCBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEKK3sKKyAgICBiY21vbHRfcGFja2V0X3R5cGUgcGFja2V0X3R5cGU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBwYWNrZXQgdHlwZS4gKi8KKyAgICBiY21vc19ib29sIGNhbGNfY3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBjYWxjIGNyYy4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgZ2VtX3BvcnRfbGlzdDsgICAgLyoqPCBnZW0gcG9ydCBsaXN0LiAqLworICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBidWZmZXI7ICAgICAgICAgICAgICAgICAvKio8IGJ1ZmZlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjcHVfcGFja2V0cyIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzCit7CisgICAgYmNtb2x0X3Byb3h5IGhkcjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfa2V5Cit7CisgICAgYmNtb2x0X2dwb25fbmkgcG9uX25pOyAgICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWQ7ICAvKio8IE9OVSBJRC4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X29udV9zdGF0ZSBvbnVfc3RhdGU7ICAgICAgICAgLyoqPCBDdXJyZW50IE9OVSBzdGF0ZSAqLworICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyIHNlcmlhbF9udW1iZXI7IC8qKjwgT05VIHNlcmlhbCBudW1iZXIgKi8KKyNkZWZpbmUgQkNNT0xUX0dQT05fT05VX0NGR19EQVRBX1BBU1NXT1JEX0xFTiAgIDEwCisgICAgYmNtb2x0X2Fycl91OF8xMCBwYXNzd29yZDsgICAgICAgICAgLyoqPCBPTlUgcGFzc3dvcmQgKi8KKyAgICBiY21vc19ib29sIGF1dG9fcGFzc3dvcmRfbGVhcm5pbmc7ICAvKio8IEVuYWJsZVxEaXNhYmxlIGF1dG9tYXRpYyBwYXNzd29yZCBsZWFybmluZyAqLworICAgIGJjbW9zX2Jvb2wgdXNfZmVjOyAgICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlXERpc2FibGUgVVMgRkVDIGZvciBPTlUgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgb21jaV9wb3J0X2lkOyAgICAvKio8IE9NQ0kgcG9ydCBJRCAgKi8KKyAgICBiY21vbHRfYmVyX2ludGVydmFsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWw7ICAvKio8IERTIEJFUiByZXBvcnRpbmcgaW50ZXJ2YWwgKi8KKyAgICBiY21vbHRfYWVzX2tleSBhZXNfZW5jcnlwdGlvbl9rZXk7ICAgICAgICAgICAgICAvKio8IEFFUyBlbmNyeXB0aW9uIGtleS4gICovCisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOyAgICAgICAgLyoqPCBTdGF0ZSBvZiBhbGwgT05VIGFsYXJtcy4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiAqLworICAgIHVpbnQzMl90IHJhbmdpbmdfdGltZTsgICAgICAgICAgICAgICAgICAvKio8IE9OVSByYW5naW5nIHRpbWUuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeTsgLyoqPCBUaGlzIE9OVSB3YXMgZGlzYWJsZWQgYWZ0ZXIgU04gZGlzY292ZXJ5ICovCisgICAgYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gZGVhY3RpdmF0aW9uX3JlYXNvbjsgICAgICAgICAgICAgICAgIC8qKjwgUmVhc29uIGZvciB0aGUgbGFzdCBPTlUgZGVhY3RpdmF0aW9uICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IGFsbF9nZW1fcG9ydHM7IC8qKjwgQWxsIHVuaWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiBhbGxfYWxsb2NzOyAgICAgICAgLyoqPCBBbGwgYWxsb2MgSURzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4gKi8KKyAgICBiY21vc19ib29sIG9udV9wc190eXBlX2M7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IG9udSBwcm90ZWN0aW9uIHN3aXRjaGluZyB0eXBlIGMuICovCisgICAgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgZXh0ZW5kZWRfZ3VhcmRfdGltZTsgLyoqPCBBZGRpdGlvbmFsIGd1YXJkIHRpbWUgKGluIGJ5dGVzKSBmb3IgdGhpcyBPTlUuICovCit9IGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGZlY19jb2Rld29yZHM7ICAgICAgICAgICAgIC8qKjwgVG90YWwgcmVjZWl2ZWQgRkVDIGNvZGV3b3Jkcy4gKi8KKyAgICB1aW50NjRfdCBmZWNfYnl0ZXNfY29ycmVjdGVkOyAgICAgICAvKio8IEZFQyBjb2Rld29yZHMgY29ycmVjdGVkIGJ5dGVzLiAqLworICAgIHVpbnQ2NF90IGZlY19jb2Rld29yZHNfY29ycmVjdGVkOyAgIC8qKjwgRkVDIGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IgLiAqLworICAgIHVpbnQ2NF90IGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQ7IC8qKjwgRkVDIG5vdCBjb3JyZWN0ZWQgY29kZXdvcmRzIGVycm9yLiAqLworICAgIHVpbnQ2NF90IGJpcDhfYnl0ZXM7ICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgYnl0ZXMgZm9yIEJJUDguICovCisgICAgdWludDY0X3QgYmlwOF9lcnJvcnM7ICAgICAgICAgICAgICAgLyoqPCBCaXQgZXJyb3IgYWNjb3JkaW5nIHRvIEJJUDguICovCisgICAgdWludDY0X3QgcnhfcGxvYW1zX2NyY19lcnJvcjsgICAgICAgLyoqPCBSZWNlaXZlZCBQTE9BTXMgd2l0aCBDUkMgZXJyb3IuICovCisgICAgdWludDY0X3QgcnhfcGxvYW1zX25vbl9pZGxlOyAgICAgICAgLyoqPCBSZWNlaXZlZCBub24gaWRsZSBQTE9BTXMuICovCisgICAgdWludDY0X3QgcG9zaXRpdmVfZHJpZnQ7ICAgICAgICAgICAgLyoqPCBQb3NpdGl2ZSBkcmlmdC4gKi8KKyAgICB1aW50NjRfdCBuZWdhdGl2ZV9kcmlmdDsgICAgICAgICAgICAvKio8IE5lZ2F0aXZlIGRyaWZ0LiAqLworICAgIHVpbnQ2NF90IHJ4X29tY2k7ICAgICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgT01DSSBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3I7IC8qKjwgUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCBiZXJfcmVwb3J0ZWQ7ICAgICAgICAgICAgICAvKio8IEJFUiByZXBvcnRlZC4gKi8KKyAgICB1aW50NjRfdCB1bnJlY2VpdmVkX2J1cnN0OyAgICAgICAgICAvKio8IFVucmVjZWl2ZWQgYnVyc3QuICovCisgICAgdWludDY0X3QgbGNkZ19lcnJvcnM7ICAgICAgICAgICAgICAgLyoqPCBMQ0RHIGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCByZGlfZXJyb3JzOyAgICAgICAgICAgICAgICAvKio8IFJESSBlcnJvcnMuICovCisgICAgdWludDY0X3QgcnhfYnl0ZXM7ICAgICAgICAgICAgICAgICAgLyoqPCByeCBieXRlcy4gKi8KKyAgICB1aW50NjRfdCByeF9wYWNrZXRzOyAgICAgICAgICAgICAgICAvKio8IHJ4IHBhY2tldHMuICovCisgICAgdWludDY0X3QgdHhfYnl0ZXM7ICAgICAgICAgICAgICAgICAgLyoqPCB0eCBieXRlcy4gKi8KKyAgICB1aW50NjRfdCB0eF9wYWNrZXRzOyAgICAgICAgICAgICAgICAvKio8IHR4IHBhY2tldHMuICovCit9IGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfYmVyX2ludGVydmFsIGJlcl9pbnRlcnZhbDsgICAvKio8IEJFUiBpbnRlcnZhbCBpbiBtcy4gKi8KKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAgICAgICAgICAgICAvKio8IFJlc3VsdC4gKi8KK30gYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIgCisgKiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImRmaSIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGZpIiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9kZmkKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2RmaTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImRnaSIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGdpIiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9kZ2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2RnaTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImRvd2kiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgaW50MzJfdCBkcmlmdF92YWx1ZTsgICAgICAgIC8qKjwgQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiAqLworICAgIHVpbnQzMl90IG5ld19lcWQ7ICAgICAgICAgICAvKio8IE5ldyBFUUQgYWZ0ZXIgZHJpZnQgaXMgY29ycmVjdGVkIChvbmx5IHZhbGlkIGlmIHN0YXR1cyBpcyAnb24nKS4gKi8KK30gYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkb3dpIiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9kb3dpCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9kb3dpOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiZXJyIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEKK3sKKyAgICB1aW50OF90IGJpcDhfZXJyb3JzOyAgICAvKio8IEJJUDggZXJyb3JzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZXJyIiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9lcnIKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2VycjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImludmFsaWRfZGJydV9yZXBvcnQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YQoreworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAgLyoqPCBBbGxvYy1JRC4gKi8KK30gYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJpbnZhbGlkX2RicnVfcmVwb3J0IiBncm91cCBvZiAiZ3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9hZXNfa2V5IG5ld19rZXk7IC8qKjwgbmV3IGtleS4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiIGdyb3VwIG9mIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2Flc19rZXkgbmV3X2tleTsgLyoqPCBuZXcga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giIGdyb3VwIG9mIHRoZSAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YQoreworICAgIGJjbW9sdF9hZXNfa2V5IGV4cGVjdGVkX2tleTsgICAgLyoqPCBleHBlY3RlZCBrZXkuICovCisgICAgYmNtb2x0X2Flc19rZXkgcmVjZWl2ZWRfa2V5OyAgICAvKio8IHJlY2VpdmVkIGtleS4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIiBncm91cCBvZiAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IiBncm91cCBvZiAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YQoreworICAgIHVpbnQzMl90IGV4cGVjdGVkX2luZGV4OyAgICAvKio8IGV4cGVjdGVkIGluZGV4LiAqLworICAgIHVpbnQzMl90IGFjdHVhbF9pbmRleDsgICAgICAvKio8IGFjdHVhbCBpbmRleC4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgiIGdyb3VwIG9mIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXg7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJsb2FpIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxvYWkiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2xvYWkKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2xvYWk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJsb2tpIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxva2kiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2xva2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2xva2k7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJtZW1pIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhCit7CisjZGVmaW5lIEJDTU9MVF9HUE9OX09OVV9NRU1JX0RBVEFfUExPQU1fQlVGRkVSX0xFTiAgMTMKKyAgICBiY21vbHRfYXJyX3U4XzEzIHBsb2FtX2J1ZmZlcjsgIC8qKjwgUExPQU0gYnVmZmVyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm1lbWkiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X21lbWkKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X21lbWk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25fZ2VtX2lkIGdlbV9wb3J0OyAgICAvKio8IEdFTSBQb3J0IElELiAqLworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgICAgICAgICAgLyoqPCBzdGF0dXMuICovCisgICAgYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24gb3BlcmF0aW9uOyAgICAvKio8IE9wZXJhdGlvbi4gKi8KK30gYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIgCisgKiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uOyAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3Jlc3VsdCByZXN1bHQ7ICAgLyoqPCByZXN1bHQuICovCit9IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib251X2FsYXJtIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zIG9udV9hbGFybTsgICAvKio8IG9udSBhbGFybS4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9hbGFybSIgZ3JvdXAgb2YgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm07CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib251X2Rpc2FibGVfY29tcGxldGVkIiBncm91cCBvZiB0aGUgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyIHNlcmlhbF9udW1iZXI7IC8qKjwgc2VyaWFsIG51bWJlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV9lbmFibGVfY29tcGxldGVkIiBncm91cCBvZiB0aGUgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlcjsgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZDsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvcHRpY2FsX3JlZmxlY3Rpb24iIGdyb3VwIG9mICJncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIiBncm91cCBvZiAKKyAqIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiBmYWlsX3JlYXNvbjsgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyNkZWZpbmUgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9EQVRBX1BBU1NXT1JEX0xFTiAxMAorICAgIGJjbW9sdF9hcnJfdThfMTAgcGFzc3dvcmQ7ICAvKio8IHBhc3N3b3JkLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIiBncm91cCAKKyAqIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicGVlIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCit9IGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwZWUiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3BlZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcGVlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicG9zc2libGVfZHJpZnQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBBbiBPTlUgaW4gYSBsb3cgcG93ZXIgc3RhdGUgbWF5IGJlIGV4cGVyaWVuY2luZyBkcmlmdCBiZXlvbmQgdGhlIGNvbmZpZ3VyZWQgCisgKiB0aHJlc2hvbGQuIFRoZSBlc3RpbWF0ZSBtYXkgYmUgaW5hY2N1cmF0ZSBkZXBlbmRpbmcgb24gT05VIGJlaGF2aW9yLiBBY3R1YWwgCisgKiBkcmlmdCBtYXkgYmUgbGVzcyB0aGFuIGVzdGltYXRlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgT246IGVzdGltYXRlZCBkcmlmdCBoYXMgZXhjZWVkZWQgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkLiAqLworICAgIGludDMyX3QgZXN0aW1hdGVkX2RyaWZ0OyAgICAvKio8IElmIHN0YXR1cyBpcyBvbiwgdGhlIGVzdGltYXRlZCBkcmlmdCB2YWx1ZSwgb3RoZXJ3aXNlIHplcm8gKDApLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwb3NzaWJsZV9kcmlmdCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiIGdyb3VwIG9mIHRoZSAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqCisgKiBOb3RpZmljYXRpb24gdGhhdCBhbiBPTlVzIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgaGFzIGNoYW5nZWQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YQoreworICAgIGJjbW9sdF9vbnVfc3RhdGUgb2xkX3N0YXRlOyAvKio8IFRoZSBzdGF0ZSB0aGUgT05VIHdhcyBwcmV2aW91c2x5IGluLiAqLworICAgIGJjbW9sdF9vbnVfc3RhdGUgbmV3X3N0YXRlOyAvKio8IFRoZSBzdGF0ZSB0aGUgT05VIGlzIGN1cnJlbnRseSBpbi4gKi8KKyAgICBiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiByZWFzb247ICAgLyoqPCBUaGUgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInBzdCIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhCit7CisgICAgdWludDMyX3QgbGlua19udW1iZXI7ICAgLyoqPCBsaW5rIG51bWJlci4gKi8KKyAgICB1aW50OF90IGsxOyAgICAgICAgICAgICAvKio8IEsxLiAqLworICAgIHVpbnQ4X3QgazI7ICAgICAgICAgICAgIC8qKjwgSzIuICovCit9IGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwc3QiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3BzdAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcHN0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicmFuZ2luZ19jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgICAgICAgICAgICAgLyoqPCBzdGF0dXMuICovCisgICAgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb24gZmFpbF9yZWFzb247IC8qKjwgZmFpbCByZWFzb24uICovCisgICAgdWludDhfdCBudW1iZXJfb2ZfcGxvYW1zOyAgICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIFBMT0FNcy4gKi8KKyAgICB1aW50MzJfdCBlcWQ7ICAgICAgICAgICAvKio8IEVRRC4gKi8KKyAgICB1aW50OF90IHBvd2VyX2xldmVsOyAgICAvKio8IFBvd2VyIExldmVsLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyYW5naW5nX2NvbXBsZXRlZCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJlaSIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhCit7CisgICAgdWludDMyX3QgYmlwOF9lcnJvcnM7ICAgLyoqPCBCSVA4IGVycm9ycy4gKi8KK30gYmNtb2x0X2dwb25fb251X3JlaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlaSIgZ3JvdXAgb2YgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfcmVpCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9yZWk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uOyAgICAvKio8IGZhaWwgcmVhc29uLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2RpIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgdWludDMyX3QgYmVyOyAgICAgICAgICAgICAgIC8qKjwgSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuICovCit9IGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZGkiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3NkaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc2RpOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2ZpIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgdWludDMyX3QgYmVyOyAgICAgICAgICAgICAgIC8qKjwgSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuICovCit9IGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZmkiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3NmaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc2ZpOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCBzdGF0OyAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mICJncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25fb251X3N0YXRfaWQgc3RhdDsgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN1ZmkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCit9IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3VmaSIgZ3JvdXAgb2YgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc3VmaTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInRpd2kiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgaW50MzJfdCBkcmlmdF92YWx1ZTsgICAgICAgIC8qKjwgQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInRpd2kiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3Rpd2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X3Rpd2k7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIGJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZDsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgZGZpOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZGZpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRnaTsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRnaSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBkb3dpOyAgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJkb3dpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGVycjsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImVyciIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBpbnZhbGlkX2RicnVfcmVwb3J0OyAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJpbnZhbGlkX2RicnVfcmVwb3J0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGtleV9leGNoYW5nZV9jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQ7ICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wga2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQ7ICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAia2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaDsgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dDsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleDsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBsb2FpOyAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImxvYWkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbG9raTsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJsb2tpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG1lbWk7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibWVtaSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQ7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZDsgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQ7ICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV9hbGFybTsgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfYWxhcm0iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV9kaXNhYmxlX2NvbXBsZXRlZDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2VuYWJsZV9jb21wbGV0ZWQ7ICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV9lbmFibGVfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9wdGljYWxfcmVmbGVjdGlvbjsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvcHRpY2FsX3JlZmxlY3Rpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHBlZTsgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwZWUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcG9zc2libGVfZHJpZnQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInBvc3NpYmxlX2RyaWZ0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcHN0OyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwc3QiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcmFuZ2luZ19jb21wbGV0ZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyYW5naW5nX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByZWk7ICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJlaSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZDsgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc2RpOyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzZGkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc2ZpOyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzZmkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdWZpOyAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN1ZmkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgdGl3aTsgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJ0aXdpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNoYW5nZV9wb3dlcl9sZXZlbCIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEKK3sKKyAgICBiY21vbHRfb251X3Bvd2VyX2xldmVsIHBvd2VyX2xldmVsX2FjdGlvbjsgIC8qKjwgcG93ZXIgbGV2ZWwgYWN0aW9uLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2hhbmdlX3Bvd2VyX2xldmVsIiBncm91cCBvZiAiZ3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWw7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicnNzaV9tZWFzdXJlbWVudCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9vbnVfc3RhdGUiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEKK3sKKyAgICBiY21vbHRfb251X29wZXJhdGlvbiBvbnVfc3RhdGU7IC8qKjwgT05VIHN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInNldF9vbnVfc3RhdGUiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY3B1X3BhY2tldHMiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhCit7CisgICAgYmNtb2x0X3BhY2tldF90eXBlIHBhY2tldF90eXBlOyAgICAgLyoqPCBwYWNrZXQgdHlwZS4gKi8KKyAgICBiY21vc19ib29sIGNhbGNfY3JjOyAgICAgICAgICAgICAgICAvKio8IGNhbGMgY3JjLiAqLworICAgIHVpbnQ4X3QgbnVtYmVyX29mX3BhY2tldHM7ICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIHBhY2tldHMuICovCisgICAgdWludDE2X3QgcGFja2V0X3NpemU7ICAgICAgICAgICAgICAgLyoqPCBTaW5nbGUgcGFja2V0IHNpemUuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlcjsgLyoqPCBidWZmZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNwdV9wYWNrZXRzIiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cworeworICAgIGJjbW9sdF9wcm94eSBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHM7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJwbG9hbV9wYWNrZXQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YQoreworI2RlZmluZSBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0RBVEFfUExPQU1fTEVOIDEyCisgICAgYmNtb2x0X2Fycl91OF8xMiBwbG9hbTsgLyoqPCBwbG9hbS4gKi8KK30gYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInBsb2FtX3BhY2tldCIgZ3JvdXAgb2YgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0Cit7CisgICAgYmNtb2x0X3Byb3h5IGhkcjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjcHVfcGFja2V0IiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICoKKyAqIEluZGljYXRlcyBDUFUgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YQoreworICAgIHVpbnQxNl90IHBvcnRfaWQ7ICAgICAgICAgICAvKio8IHBvcnRfaWQuICovCisgICAgYmNtb3NfYm9vbCBjcmNfb2s7ICAgICAgICAgIC8qKjwgY3JjX29rLiAqLworICAgIHVpbnQzMl90IHBhY2tldF9zaXplOyAgICAgICAvKio8IHBhY2tldF9zaXplLiAqLworICAgIGJjbW9sdF91OF9saXN0X3UzMiBidWZmZXI7ICAvKio8IGJ1ZmZlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjcHVfcGFja2V0IiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0Cit7CisgICAgYmNtb2x0X3Byb3h5X3J4IGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib21jaV9wYWNrZXQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKgorICogSW5kaWNhdGVzIE9NQ0kgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEKK3sKKyAgICB1aW50MTZfdCBwb3J0X2lkOyAgICAgICAgICAgLyoqPCBwb3J0X2lkLiAqLworICAgIGJjbW9zX2Jvb2wgY3JjX29rOyAgICAgICAgICAvKio8IGNyY19vay4gKi8KKyAgICB1aW50MzJfdCBwYWNrZXRfc2l6ZTsgICAgICAgLyoqPCBwYWNrZXRfc2l6ZS4gKi8KKyAgICBiY21vbHRfdThfbGlzdF91MzIgYnVmZmVyOyAgLyoqPCBidWZmZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9tY2lfcGFja2V0IiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldAoreworICAgIGJjbW9sdF9wcm94eV9yeCBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl90cngiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX3RyeF9rZXkKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaSBwb25fbmk7ICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KK30gYmNtb2x0X2dwb25fdHJ4X2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX3RyeCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3RyeF90eXBlIHRyYW5zY2VpdmVyX3R5cGU7ICAgLyoqPCB0cmFuc2NlaXZlciB0eXBlLiAqLworICAgIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIGxhX2NvbmZpZ3VyYXRpb247ICAgIC8qKjwgTEEgY29uZmlndXJhdGlvbi4gKi8KKyAgICBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIGJjZHI7ICAgICAgICAgICAgICAvKio8IEJDRFIuICovCisgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jOyAgICAgICAgLyoqPCBMQSByYW5naW5nIGFmdGVyIG5vIGVkIHJlc3luYyAuICovCisgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmM7ICAgICAgLyoqPCB1c2VkIGluIHJhbmdpbmcgbW9kZSBhZnRlciBubyBlZCBmb3VuZCAqLworICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYzsgICAgICAgICAgIC8qKjwgTEEgcmFuZ2luZyBhZnRlciBlZCByZXN5bmMgLiAqLworICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jOyAgICAgICAgIC8qKjwgQkNEUiByYW5naW5nIGFmdGVyIGVkIHJlc3luYy4gKi8KKyAgICBiY21vbHRfcG9sYXJpdHkgbGFfcmVzeW5jX3BvbGFyaXR5OyAgICAgLyoqPCBsYSByZXN5bmMgcG9sYXJpdHkuICovCisgICAgYmNtb2x0X3BvbGFyaXR5IGJjZHJfcmVzeW5jX3BvbGFyaXR5OyAgIC8qKjwgQkNEUiByZXN5bmMgcG9sYXJpdHkuICovCisgICAgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zOyAgICAgICAgICAgIC8qKjwgYmNkciByYW5naW5nIHJlc3luYyBjb25kaXRpb25zLiAqLworICAgIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnM7ICAgICAgICAgICAgICAvKio8IGxhIHJhbmdpbmcgcmVzeW5jIGNvbmRpdGlvbnMuICovCisgICAgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIHJ4X2NvbmZpZ3VyYXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUlggY29uZmlndXJhdGlvbi4gKi8KKyAgICBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uOyAgLyoqPCByYW5naW5nIGNvbnRyb2wgc3RhZ2VzIGNvbmZpZ3VyYXRpb24uICovCisgICAgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IGVuZXJneV9kZXRlY3Q7ICAgICAgICAgICAgIC8qKjwgRW5lcmd5IERldGVjdC4gKi8KKyAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybjsgICAgLyoqPCBlbmQgb2YgYnVyc3QgZGF0YSBwYXR0ZXJuIC4gKi8KKyAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybjsgLyoqPCBlbmQgb2YgYnVyc3QgcmFuZ2luZyBwYXR0ZXJuLiAqLworICAgIGJjbW9sdF90cnhfcHJlYW1ibGUgcHJlYW1ibGU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFByZWFtYmxlLiAqLworICAgIGJjbW9sdF90cnhfZGVsaW1pdGVyIGRlbGltaXRlcjsgICAgICAgICAgICAgICAgICAgICAvKio8IERlbGltaXRlci4gKi8KKyAgICB1aW50MzJfdCBndWFyZF9iaXRzOyAgICAvKio8IEd1YXJkIGJpdHMuICovCisgICAgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIHNlcmRlc19jb25maWd1cmF0aW9uOyAgIC8qKjwgc2VyZGVzIGNvbmZpZ3VyYXRpb24uICovCisgICAgdWludDMyX3QgcGxvX3Jhbmdpbmc7ICAgLyoqPCBQTE8gZm9yIHJhbmdpbmcuICovCisgICAgdWludDMyX3QgcGxvX2RhdGE7ICAgICAgLyoqPCBQTE8gZm9yIGRhdGEuICovCisgICAgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gcnNzaV9ub3JtYWxfY29uZmlnOyAgLyoqPCByc3NpIG5vcm1hbCBjb25maWcuICovCisgICAgYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbDsgICAgLyoqPCByYW5naW5nIHJzc2kgcmVzeW5jIGNvbnRyb2wuICovCit9IGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJncG9uX3RyeCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fdHJ4X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX3RyeF9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl90cnhfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImxvZ19lbnRyeSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xvZ19lbnRyeV9rZXkKK3sKKyAgICB1aW50MzJfdCBsb2dfaWQ7ICAgICAgICAvKio8IGxvZyBpZC4gKi8KKyAgICB1aW50OF90IHJlc2VydmVkOyAgICAgICAvKio8IHJlc2VydmVkLiAqLworICAgIGJjbW9sdF9zdHJfMTAwIG5hbWU7ICAgIC8qKjwgbmFtZS4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAibG9nX2VudHJ5IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2xvZ19sZXZlbCBkZWZhdWx0X2xvZ19sZXZlbDsgLyoqPCBkZWZhdWx0IGxvZyBsZXZlbC4gKi8KKyAgICBiY21vbHRfbG9nX3R5cGUgZGVmYXVsdF9sb2dfdHlwZTsgICAvKio8IGRlZmF1bHQgbG9nIHR5cGUuICovCisgICAgYmNtb2x0X2xvZ19sZXZlbCBsb2dfbGV2ZWxfcHJpbnQ7ICAgLyoqPCBsb2cgbGV2ZWwgcHJpbnQuICovCisgICAgYmNtb2x0X2xvZ19sZXZlbCBsb2dfbGV2ZWxfc2F2ZTsgICAgLyoqPCBsb2cgbGV2ZWwgc2F2ZS4gKi8KKyAgICBiY21vbHRfbG9nX3R5cGUgbG9nX3R5cGU7ICAgICAgICAgICAvKio8IGxvZyB0eXBlLiAqLworICAgIGJjbW9sdF9sb2dfc3R5bGUgbG9nX3N0eWxlOyAgICAgICAgIC8qKjwgbG9nX3N0eWxlLiAqLworICAgIGJjbW9sdF9zdHJfMTAwIGxvZ19uYW1lOyAgICAgICAgICAgIC8qKjwgbG9nIG5hbWUuICovCit9IGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAibG9nX2VudHJ5IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAibG9nX2VudHJ5IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YQoreworI2RlZmluZSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfREFUQV9NU0dfQ09VTlRfTEVOICAgIDYKKyAgICBiY21vbHRfYXJyX3UzMl82IG1zZ19jb3VudDsgLyoqPCBtc2cgY291bnQuICovCisgICAgdWludDMyX3QgbG9zdF9tc2dfY291bnQ7ICAgIC8qKjwgbG9zdCBtc2cgY291bnQuICovCit9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJsb2dfZW50cnkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXk7ICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJsb2dfZW50cnkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAibG9nX2VudHJ5IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAibG9nX2VudHJ5IiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIHN0YXQ7ICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgImxvZ19lbnRyeSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAibG9nX2VudHJ5IiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCBzdGF0OyAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAibG9nX2VudHJ5IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAibG9nX2VudHJ5IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fY2xlYXJlZDsgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9jbGVhcmVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fcmFpc2VkOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9yYWlzZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJsb2dfZW50cnkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmcKK3sKKyAgICBiY21vbHRfYXV0b19jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleTsgICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJsb2dnZXIiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfa2V5Cit7CisgICAgdWludDMyX3QgcmVzZXJ2ZWQ7ICAgICAgICAgIC8qKjwgcmVzZXJ2ZWQuICovCisgICAgYmNtb2x0X2xvZ19maWxlX2lkIGZpbGVfaWQ7IC8qKjwgc2hvdWxkIGJlIDAgKi8KK30gYmNtb2x0X2xvZ2dlcl9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAibG9nZ2VyIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2xvZ19idWZmZXIgYnVmZmVyOyAgICAgICAvKio8IENvbnRhaW5zICJuZXh0IiBsb2cgcmVjb3JkcyByZWFkIGJ5ICJiY21vbHRfY2ZnX2dldCgpIEFQSSAqLworICAgIGJjbW9zX2Jvb2wgd3JhcF9hcm91bmQ7ICAgICAgICAgLyoqPCBMb2cgZmlsZSB3cmFwLWFyb3VuZCBvcHRpb24uIFRSVUU9d3JhcCBhcm91bmQgd2hlbiBmdWxsLiBGQUxTRT1zdG9wIHdoZW4gZnVsbCAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfYWZ0ZXJfcmVhZDsgICAgLyoqPCBDbGVhciBsb2cgYWZ0ZXIgbGFzdCByZWNvcmQgaGFzIGJlZW4gcmVhZCAqLworICAgIGJjbW9zX2Jvb2wgZW5hYmxlX2xvZzsgICAgICAgICAgLyoqPCBFbmFibGUgbG9nZ2VyICovCisgICAgYmNtb2x0X3N0cl8xMDAwIGxvZ19uYW1lczsgICAgICAvKio8IGxvZ19uYW1lcy4gKi8KK30gYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJsb2dnZXIiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5OyAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9sb2dnZXJfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJsb2dnZXIiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhCit7CisgICAgdWludDMyX3QgbGluZXNfaW5fbG9nOyAgLyoqPCBsaW5lcyBpbiBsb2cuICovCit9IGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJsb2dnZXIiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleTsgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbG9nZ2VyX3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJsb2dnZXIiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAibG9nZ2VyIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleTsgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9sb2dnZXJfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAibG9nZ2VyIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAibG9nZ2VyIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJsb2dnZXIiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgImxvZ2dlciIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImxvZ2dlciIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAibG9nZ2VyIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleTsgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9sb2dnZXJfYXV0b19jZmc7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2xlYXJfbG9nIiBncm91cCBvZiAibG9nZ2VyIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgIm5uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9rZXkKK3sKKyAgICBiY21vbHRfcG9uX25pIHBvbl9uaTsgICAvKio8IFBPTiBOSS4gKi8KK30gYmNtb2x0X25uaV9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAibm5pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgcmVtb3RlX2xvb3BiYWNrOyAgIC8qKjwgSW5jb21pbmcgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgUE9OICh1cHN0cmVhbSkgYW5kIGdvaW5nIGJhY2sgdG8gdGhlIFBPTiAoRG93bnN0cmVhbSkgICovCisgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgbGluZV9sb29wYmFjazsgICAgIC8qKjwgSW5jb21pbmcgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgTk5JIGludGVyZmFjZSB0byB0aGUgUE0gYW5kIGdvaW5nIGJhY2sgdG93YXJkcyB0aGUgTk5JIGludGVyZmFjZSAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOyAgICAgICAgICAvKio8IE1hYyBhZGRyZXNzIHRvIGJlIHVzZWQgZm9yIHRoaXMgTk5JLiAqLworICAgIGJjbW9sdF9ubmlfbGlua19zdGF0dXMgbm5pX3N0YXR1czsgICAgICAvKio8IE5OSSBzdGF0dXMgKi8KKyAgICBiY21vbHRfbm5pX2xpbmtfc3RhdHVzIG5uaV9iYWNrdXBfc3RhdHVzOyAgIC8qKjwgU3RhdHVzIG9mIHRoZSBiYWNrdXAgTk5JLiAqLworICAgIGJjbW9sdF9ubmlfY29ubmVjdGlvbiBhY3RpdmVfbm5pOyAgICAgICAgICAgLyoqPCBXaGljaCBOTkkgaXMgY3VycmVudGx5IGFjdGl2ZS4gKi8KKyAgICB1aW50MzJfdCBubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXM7ICAgIC8qKjwgSG93IG9mdGVuIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHByaW1hcnkgYW5kIGJhY2t1cCBOTklzICh1bml0czogbXMpLiBaZXJvICgwKSBkaXNhYmxlcyBzdGF0dXMgcG9sbGluZy4gKi8KKyAgICBiY21vc19ib29sIGF1dG9zd2l0Y2g7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2hvdWxkIGZpcm13YXJlIGF1dG9tYXRpY2FsbHkgc3dpdGNoIGJldHdlZW4gcHJpbWFyeS9iYWNrdXAgTk5JcyB3aGVuIExvc3Mgb2YgTGluayBpcyBkZXRlY3RlZD8gKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBmbG93X2NvbnRyb2w7ICAgICAgICAgIC8qKjwgTk5JIEZsb3cgY29udHJvbC4gKi8KK30gYmNtb2x0X25uaV9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJubmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ubmlfY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ubmlfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJubmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgcnhfZnJhbWVzXzY0OyAgICAgICAgICAgICAgLyoqPCBUaGUgY291bnQgb2YgUlggNjQgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzY1XzEyNzsgICAgICAgICAgLyoqPCBUaGUgY291bnQgb2YgUlggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2ZyYW1lc18xMjhfMjU1OyAgICAgICAgIC8qKjwgVGhlIGNvdW50IG9mIFJYIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzI1Nl81MTE7ICAgICAgICAgLyoqPCBUaGUgY291bnQgb2YgUlggMjU2IHRvIDUxMSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfNTEyXzEwMjM7ICAgICAgICAvKio8IFRoZSBjb3VudCBvZiBSWCA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfMTAyNF8xNTE4OyAgICAgICAvKio8IFRoZSBjb3VudCBvZiBSWCAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzE1MTlfMjA0NzsgICAgICAgLyoqPCBUaGUgY291bnQgb2YgUlggMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2ZyYW1lc18yMDQ4XzQwOTU7ICAgICAgIC8qKjwgVGhlIGNvdW50IG9mIFJYIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfNDA5Nl85MjE2OyAgICAgICAvKio8IFRoZSBjb3VudCBvZiBSWCA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzkyMTdfMTYzODM7ICAgICAgLyoqPCBUaGUgY291bnQgb2YgUlggOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXM7ICAgICAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiAqLworICAgIHVpbnQ2NF90IHJ4X2J5dGVzOyAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4gKi8KKyAgICB1aW50NjRfdCByeF9nb29kX2ZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZ29vZCBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfdW5pY2FzdF9mcmFtZXM7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHVuaWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X211bHRpY2FzdF9mcmFtZXM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBtdWx0aWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2Jyb2FkY2FzdF9mcmFtZXM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBicm9hZGNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2Zjc19lcnJvcnM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBGQ1MgZXJyb3JzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2NvbnRyb2xfZnJhbWVzOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb250cm9sIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9wYXVzZV9mcmFtZXM7ICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGF1c2UgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X3BmY19mcmFtZXM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBQRkMgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X3Vuc3VwcG9ydGVkX29wY29kZTsgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBVbnN1cHBvcnRlZCBPcGNvZGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X3Vuc3VwcG9ydGVkX2RhOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCB1bnN1cHBvcnRlZCBEQSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfYWxpZ25tZW50X2Vycm9yczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGFsaWdubWVudCBlcnJvcnMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfbGVuZ3RoX291dF9vZl9yYW5nZTsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGxlbmd0aCBvdXQgb2YgcmFuZ2UgZXJyb3JzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2NvZGVfZXJyb3JzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb2RlIGVycm9ycyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9vdmVyc2l6ZWRfZnJhbWVzOyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgb3ZlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9qYWJiZXJfZnJhbWVzOyAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgamFiYmVyIGZyYW1lcyBvbiB0aGlzIE5OSS4gdGhlc2UgYXJlIG92ZXJzaXplZCBmcmFtZXMgdGhhdCBhbHNvIGNvbnRhaW4gYW4gaW52YWxpZCBDUkMsIGNvZGUgZXJyb3IsIG9yIElFRUUgbGVuZ3RoIGNoZWNrIGVycm9yLiAqLworICAgIHVpbnQ2NF90IHJ4X210dV9jaGVja19lcnJvcnM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBNVFUgQ2hlY2sgRXJyb3JzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X3Byb21pc2N1b3VzX2ZyYW1lczsgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFtZXMgb24gdGhpcyBOTkkgdGhhdCBhcmUgbm90IGNvbnRyb2wgcGFja2V0cyBhbmQgaGF2ZSBhIERBIHRoYXQgaXMgbm90IG1hdGNoaW5nIHdpdGggdGhlIFJYIFNBLiAqLworICAgIHVpbnQ2NF90IHJ4X3ZsYW5fZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gVGhpcyBjb3VudHMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB0YWdnZWQgZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHJ4X2RvdWJsZV92bGFuX2ZyYW1lczsgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBkb3VibGUgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuICAqLworICAgIHVpbnQ2NF90IHJ4X3RydW5jYXRlZF9mcmFtZXM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCB0cnVuY2F0ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gUlggRklGTyBGdWxsLiAgKi8KKyAgICB1aW50NjRfdCByeF91bmRlcnNpemVfZnJhbWVzOyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgdW5kZXJzaXplZCBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfZnJhZ21lbnRlZF9mcmFtZXM7ICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYWdtZW50ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X3J1bnRfZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBydW50IGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfNjQ7ICAgICAgICAgICAgICAvKio8IFRoZSBjb3VudCBvZiBUWCA2NCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfNjVfMTI3OyAgICAgICAgICAvKio8IFRoZSBjb3VudCBvZiBUWCA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgdHhfZnJhbWVzXzEyOF8yNTU7ICAgICAgICAgLyoqPCBUaGUgY291bnQgb2YgVFggMTI4IHRvIDI1NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfMjU2XzUxMTsgICAgICAgICAvKio8IFRoZSBjb3VudCBvZiBUWCAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc181MTJfMTAyMzsgICAgICAgIC8qKjwgVGhlIGNvdW50IG9mIFRYIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc18xMDI0XzE1MTg7ICAgICAgIC8qKjwgVGhlIGNvdW50IG9mIFRYIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfMTUxOV8yMDQ3OyAgICAgICAvKio8IFRoZSBjb3VudCBvZiBUWCAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgdHhfZnJhbWVzXzIwNDhfNDA5NTsgICAgICAgLyoqPCBUaGUgY291bnQgb2YgVFggMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc180MDk2XzkyMTY7ICAgICAgIC8qKjwgVGhlIGNvdW50IG9mIFRYIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfOTIxN18xNjM4MzsgICAgICAvKio8IFRoZSBjb3VudCBvZiBUWCA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lczsgICAgICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaW5jbHVkZXMgYWxsIGVycm9yZWQgZnJhbWVzIGFzIHdlbGwuICovCisgICAgdWludDY0X3QgdHhfYnl0ZXM7ICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJ5dGVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiAqLworICAgIHVpbnQ2NF90IHR4X2dvb2RfZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBnb29kIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF91bmljYXN0X2ZyYW1lczsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgdW5pY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgdHhfbXVsdGljYXN0X2ZyYW1lczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIG11bHRpY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgdHhfYnJvYWRjYXN0X2ZyYW1lczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJyb2FkY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgdHhfcGF1c2VfZnJhbWVzOyAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHBhdXNlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9wZmNfZnJhbWVzOyAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgUEZDIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9qYWJiZXJfZnJhbWVzOyAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgamFiYmVyIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGhlc2UgYXJlIG92ZXJzaXplZCBmcmFtZXMgdGhhdCBhbHNvIGNvbnRhaW4gYW4gaW52YWxpZCBGQ1MuICovCisgICAgdWludDY0X3QgdHhfZmNzX2Vycm9yczsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIEZDUyBlcnJvcnMgb24gdGhpcyBOTkkuICAqLworICAgIHVpbnQ2NF90IHR4X2NvbnRyb2xfZnJhbWVzOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBjb250cm9sIGZyYW1lcyBvbiB0aGlzIE5OSS4gICovCisgICAgdWludDY0X3QgdHhfb3ZlcnNpemVfZnJhbWVzOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIG92ZXJzaXplZCBmcmFtZXMgb24gdGhpcyBOTkkuICAqLworICAgIHVpbnQ2NF90IHR4X2ZyYWdtZW50ZWRfZnJhbWVzOyAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBmcmFnbWVudGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gICovCisgICAgdWludDY0X3QgdHhfZXJyb3JfZnJhbWVzOyAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGVycm9yZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAgKi8KKyAgICB1aW50NjRfdCB0eF92bGFuX2ZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuIFRoaXMgY291bnRzIGJvdGggc2luZ2xlIGFuZCBkb3VibGUgdGFnZ2VkIGZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCB0eF9kb3VibGVfdmxhbl9mcmFtZXM7ICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZG91YmxlIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiAgKi8KKyAgICB1aW50NjRfdCB0eF9ydW50X2ZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcnVudCBmcmFtZXMgb24gdGhpcyBOTkkuICAqLworICAgIHVpbnQ2NF90IHR4X3VuZGVycnVuX2ZyYW1lczsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCB1bmRlcnJ1biBmcmFtZXMgb24gdGhpcyBOTkkuIFRodXMgaGFwcGVucyB3aGVuIGEgZnJhbWUgZW5jb3VudGVycyBhIE1BQyB1bmRlcnJ1biAoVHggU3luYyBGSUZPIHJ1bnMgb3V0IG9mIGRhdGEgYmVmb3JlIHRoZSBlbmQgb2YgcGFja2V0KS4gKi8KK30gYmNtb2x0X25uaV9zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgIm5uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zdGF0Cit7CisgICAgYmNtb2x0X3N0YXQgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ubmlfc3RhdF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ubmlfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgIm5uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJubmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXk7ICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X25uaV9zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlICJubmkiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X25uaV9zdGF0X2lkIHN0YXQ7ICAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAibm5pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ubmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgIm5uaSIgb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X25uaV9zdGF0X2lkIHN0YXQ7ICAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgIm5uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdHVzX2NoYW5nZWQiIGdyb3VwIG9mIHRoZSAibm5pIiBvYmplY3QuIAorICoKKyAqIE5OSSBMaW5rIHN0YXR1cyBjaGFuZ2VkIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIG5ld19zdGF0dXM7ICAgICAgICAgICAgICAgLyoqPCBOZXcgTk5JIExpbmsgU3RhdHVzICovCisgICAgYmNtb2x0X25uaV9jb25uZWN0aW9uIGxpbms7ICAgICAgICAgICAgIC8qKjwgV2hpY2ggTk5JIHRoaXMgaW5kaWNhdGlvbiBwZXJ0YWlucyB0by4gKi8KKyAgICBiY21vbHRfbm5pX2Nvbm5lY3Rpb24gcHJldmlvdXNfYWN0aXZlOyAgLyoqPCBXaGljaCBOTkkgd2FzIGFjdGl2ZSBiZWZvcmUgdGhpcyBzdGF0dXMgY2hhbmdlLiAqLworICAgIGJjbW9sdF9ubmlfY29ubmVjdGlvbiBuZXdfYWN0aXZlOyAgICAgICAvKio8IFdoaWNoIE5OSSBpcyBub3cgYWN0aXZlIGFmdGVyIHRoaXMgc3RhdHVzIGNoYW5nZS4gKi8KK30gYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXR1c19jaGFuZ2VkIiBncm91cCBvZiAibm5pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXk7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJubmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0dXNfY2hhbmdlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXR1c19jaGFuZ2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAibm5pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ubmlfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAibm5pX3NlcmRlcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zZXJkZXNfa2V5Cit7CisgICAgYmNtb2x0X3Bvbl9uaSBwb25fbmk7ICAgICAgICAgICAgICAgLyoqPCBQT04gTkkuICovCisgICAgYmNtb2x0X3NlcmRlc19pbnN0YW5jZSBpbnN0YW5jZTsgICAgLyoqPCBTZXJEZXMgaW5zdGFuY2UuOiAwID0gUHJpbWFyeSwgMSA9IFNlY29uZGFyeS4gKi8KK30gYmNtb2x0X25uaV9zZXJkZXNfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgIm5uaV9zZXJkZXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhCit7CisgICAgdWludDhfdCByeF92Z2E7ICAgICAvKio8IFJ4IFZnYS4gKi8KKyAgICB1aW50OF90IHJ4X3BmOyAgICAgIC8qKjwgUGVha2luZyBGaWx0ZXIgKi8KKyAgICB1aW50OF90IHJ4X2xmcGY7ICAgIC8qKjwgTG93IEZyZXF1ZW5jeSBQZWFraW5nIEZpbHRlciAqLworICAgIHVpbnQ4X3QgcnhfZGZlMTsgICAgLyoqPCBSeCBERkUxLiAqLworICAgIGludDhfdCByeF9kZmUyOyAgICAgLyoqPCBSeCBERkUyLiAqLworICAgIGludDhfdCByeF9kZmUzOyAgICAgLyoqPCBSeCBERkUzLiAqLworICAgIGludDhfdCByeF9kZmU0OyAgICAgLyoqPCBSeCBERkU0LiAqLworICAgIGludDhfdCByeF9kZmU1OyAgICAgLyoqPCBSeCBERkU1LiAqLworICAgIHVpbnQ4X3QgdHhfcHJlOyAgICAgLyoqPCBUeCBQcmUuICovCisgICAgdWludDhfdCB0eF9tYWluOyAgICAvKio8IFR4IE1haW4uICovCisgICAgdWludDhfdCB0eF9wb3N0MTsgICAvKio8IFR4IFBvc3QxLiAqLworICAgIGludDhfdCB0eF9wb3N0MjsgICAgLyoqPCBUeCBQb3N0Mi4gKi8KKyAgICBpbnQ4X3QgdHhfcG9zdDM7ICAgIC8qKjwgVHggUG9zdDMuICovCisgICAgdWludDhfdCB0eF9hbXA7ICAgICAvKio8IFR4IEFtcC4gKi8KK30gYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAibm5pX3NlcmRlcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zZXJkZXNfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ubmlfc2VyZGVzX2tleSBrZXk7ICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ubmlfc2VyZGVzX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJzb2Z0d2FyZV9lcnJvciIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleQoreworICAgIHVpbnQzMl90IHJlc2VydmVkOyAgLyoqPCBSZXNlcnZlZCAoc2V0IHRvIDApLiAqLworICAgIHVpbnQzMl90IGlkeDsgICAgICAgLyoqPCBJbmRleC4gKi8KK30gYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJzb2Z0d2FyZV9lcnJvciIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N3X2Vycm9yIGVudHJ5OyAgLyoqPCBFbnRyeS4gKi8KK30gYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgInNvZnR3YXJlX2Vycm9yIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ0cnhfY2FsaWJyYXRpb24iIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5Cit7CisgICAgdWludDMyX3QgcmVzZXJ2ZWQ7ICAvKio8IFJlc2VydmVkIChzZXQgdG8gMCkgKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCIgZ3JvdXAgCisgKiBvZiB0aGUgInRyeF9jYWxpYnJhdGlvbiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCBkYXRhX3dpbmRvdzsgICAgLyoqPCBkYXRhIHdpbmRvdy4gKi8KKyAgICBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IHN0cm9iZV93aW5kb3c7ICAvKio8IHN0cm9iZSB3aW5kb3cuICovCisgICAgdWludDY0X3QgZWRnZV9yaXNlX21pbl9taW47ICAgICAgICAgICAgICAgICAgICAgLyoqPCBlZGdlIHJpc2UgbWluIG1pbi4gKi8KKyAgICB1aW50NjRfdCBlZGdlX3Jpc2VfbWluX21heDsgICAgICAgICAgICAgICAgICAgICAvKio8IGVkZ2UgcmlzZSBtaW4gbWF4LiAqLworICAgIHVpbnQ2NF90IGVkZ2VfcmlzZV9tYXhfbWluOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgZWRnZSByaXNlIG1heCBtaW4uICovCisgICAgdWludDY0X3QgZWRnZV9yaXNlX21heF9tYXg7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBlZGdlIHJpc2UgbWF4IG1heC4gKi8KKyAgICB1aW50NjRfdCBlZGdlX2ZhbGxfbWluX21pbjsgICAgICAgICAgICAgICAgICAgICAvKio8IGVkZ2UgZmFsbCBtaW4gbWluIC4gKi8KKyAgICB1aW50NjRfdCBlZGdlX2ZhbGxfbWluX21heDsgICAgICAgICAgICAgICAgICAgICAvKio8IGVkZ2UgZmFsbCBtaW4gbWF4LiAqLworICAgIHVpbnQ2NF90IGVkZ2VfZmFsbF9tYXhfbWluOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgZWRnZSBmYWxsIG1heCBtaW4uICovCisgICAgdWludDY0X3QgZWRnZV9mYWxsX21heF9tYXg7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBlZGdlIGZhbGwgbWF4IG1heC4gKi8KKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAvKio8IHJlc3VsdC4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkIiAKKyAqIGdyb3VwIG9mICJ0cnhfY2FsaWJyYXRpb24iIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAidHJ4X2NhbGlicmF0aW9uIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAidHJ4X2NhbGlicmF0aW9uIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmcKK3sKKyAgICBiY21vbHRfYXV0b19jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSBrZXk7ICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXJ0X2NhcHR1cmVfd2luZG93IiBncm91cCBvZiB0aGUgCisgKiAidHJ4X2NhbGlicmF0aW9uIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEKK3sKKyAgICB1aW50OF90IHBvbl9uaTsgLyoqPCBwb25fbmkuICovCisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIHRyaWdnZXI7ICAgICAgICAgLyoqPCB0cmlnZ2VyLiAqLworICAgIGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgc3Ryb2JlOyAgICAgICAgICAgIC8qKjwgc3Ryb2JlLiAqLworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgd2luZG93X21vZGU7IC8qKjwgd2luZG93IG1vZGUuICovCisgICAgdWludDE2X3Qgb251X2lkOyAgICAvKio8IG9udSBpZC4gKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gdHJpZ2dlcl9wb3NpdGlvbjsgICAvKio8IHRyaWdnZXIgcG9zaXRpb24uICovCisgICAgYmNtb3NfYm9vbCBzdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBlbmFibGUvZGlzYWJsZSBjb3JydXB0IHN0cm9iZSBmcm9tIE1BQyB0byB0ZXJtaW5hdGUgc3RhdCB3aW5kb3cgKi8KKyAgICB1aW50MTZfdCBzdGFydF9vZmZzZXQ7ICAgICAgLyoqPCBzdGFydCBvZmZzZXQuICovCisgICAgdWludDE2X3QgZW5kX29mZnNldDsgICAgICAgIC8qKjwgZW5kIG9mZnNldC4gKi8KKyAgICB1aW50OF90IG51bWJlcl9vZl9jeWNsZXM7ICAgLyoqPCBudW1iZXIgb2YgY3ljbGVzLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhcnRfY2FwdHVyZV93aW5kb3ciIGdyb3VwIG9mIAorICogInRyeF9jYWxpYnJhdGlvbiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RvcF9jYXB0dXJlX3dpbmRvdyIgZ3JvdXAgb2YgdGhlIAorICogInRyeF9jYWxpYnJhdGlvbiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEKK3sKKyAgICB1aW50OF90IHBvbl9uaTsgLyoqPCBwb25fbmkuICovCit9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0b3BfY2FwdHVyZV93aW5kb3ciIGdyb3VwIG9mIAorICogInRyeF9jYWxpYnJhdGlvbiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX2tleQoreworICAgIGJjbW9sdF94Z3Bvbl9uaSBwb25fbmk7ICAgICAgICAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAvKio8IEFsbG9jIElELiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfYWxsb2Nfc3RhdGUgc3RhdGU7ICAgLyoqPCBDdXJyZW50IEFsbG9jIElEIHN0YXRlICovCisgICAgYmNtb2x0X3Bvbl9hbGxvY19zbGEgc2xhOyAgIC8qKjwgQWxsb2MgSUQgU0xBICovCisgICAgYmNtb2x0X3hncG9uX29udV9pZCBvbnVfaWQ7IC8qKjwgT05VIElEIHRoZSBhbGxvYyBJRCBpcyBhc3NpZ25lZCB0byAqLworICAgIGJjbW9zX2Jvb2wgY29sbGVjdF9zdGF0czsgICAvKio8IEVuYWJsZSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gZm9yIHRoaXMgYWxsb2MgSUQgKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5OyAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0IiBncm91cCBvZiB0aGUgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgcnhfYnl0ZXM7ICAvKio8IE51bWJlciBvZiBhbGxvYyBJRCByZWNlaXZlZCBieXRlcy4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0IiBncm91cCBvZiAieGdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0Cit7CisgICAgYmNtb2x0X3N0YXQgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5OyAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9jZmciIGdyb3VwIG9mIHRoZSAieGdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2NmZyIgZ3JvdXAgb2YgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgICAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9hbGxvY19zdGF0ZSBuZXdfc3RhdGU7ICAgLyoqPCBuZXcgc3RhdGUuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fYWxsb2MiIG9iamVjdC4gCisgKgorICogQ29sbGVjdGVkIGFsbG9jIElEIHN0YXRpc3RpY3MgZnJvbSBnZXRfc3RhdHMgb3BlcmF0aW9uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3Jlc3VsdCBzdGF0dXM7ICAgICAgICAgICAvKio8IHN0YXR1cy4gKi8KKyAgICB1aW50MzJfdCBhdmVyYWdlX25zcl91c2VkOyAgICAgIC8qKjwgQXZlcmFnZSBOU1IgdXNlZCB3b3Jkcy4gKi8KKyAgICB1aW50MzJfdCBhdmVyYWdlX25zcl9hbGxvY2F0ZWQ7IC8qKjwgQXZlcmFnZSBOU1IgYWxsb2NhdGVkIHdvcmRzLiAqLworICAgIHVpbnQzMl90IGF2ZXJhZ2Vfc3JfcmVwb3J0OyAgICAgLyoqPCBBdmVyYWdlIFNSIHJlcG9ydC4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgInhncG9uX2FsbG9jIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAieGdwb25fYWxsb2MiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAieGdwb25fYWxsb2MiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgInhncG9uX2FsbG9jIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQ7ICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fY2xlYXJlZDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleTsgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImdldF9zdGF0cyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqCisgKiBSdW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEKK3sKKyAgICB1aW50MzJfdCBudW1fb2ZfY3ljbGVzOyAvKio8IFRoZSBudW1iZXIgb2YgY3ljbGVzIHRvIHJ1biBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImdldF9zdGF0cyIgZ3JvdXAgb2YgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleTsgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHM7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzZXRfc3RhdGUiIGdyb3VwIG9mIHRoZSAieGdwb25fYWxsb2MiIG9iamVjdC4gCisgKgorICogU2V0cyB0aGUgYWxsb2MncyBhY3RpdmF0aW9uIHN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHByb3RlY3Rpb24gCisgKiBzd2l0Y2hpbmcgb24gYW4gYWN0aXZlLXN0YW5kYnkgUE9OLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgdGhpcyBpc24ndCAKKyAqIG5lY2Vzc2FyeSBzaW5jZSBhbGxvY3MgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggCisgKiB0aGUgT05VLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhCit7CisgICAgYmNtb2x0X2FsbG9jX29wZXJhdGlvbiBzdGF0ZTsgICAvKio8IFN0YXRlLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2V0X3N0YXRlIiBncm91cCBvZiAieGdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleQoreworICAgIGJjbW9sdF94Z3Bvbl9uaSBwb25fbmk7ICAgICAgICAgICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7ICAgIC8qKjwgR0VNIFBPUlQgSUQuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAieGdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247ICAgICAgICAgICAgICAgIC8qKjwgR0VNIHBvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisgICAgYmNtb2x0X3hncG9uX29udV9pZCBvbnVfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgSUQgdGhpcyBHRU0gcG9ydCBpcyBhc3NpZ25lZCB0byAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSBnZW1fcG9ydF9zdGF0ZTsgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBHRU0gcG9ydCBzdGF0ZSAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGVuY3J5cHRpb25fbW9kZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlL0Rpc2FibGUgdGhlIGRvd25zdHJlYW0gZW5jcnlwdGlvbiBtb2RlIG9mIHRoZSBHRU0gUG9ydCAqLworICAgIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZTsgIC8qKjwgVGhlIGRlc3RpbmF0aW9uIHF1ZXVlIG9mIHRoZSBwYWNrZXRzIGFycml2aW5nIG9uIHRoaXMgR0VNIFBvcnQgb24gdGhlIHVwc3RyZWFtIGRpcmVjdGlvbiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgLyoqPCBFbmFibGUvRGlzYWJsZSB0aGUgR0VNIFBvcnQgSUQgaW4gdGhlIE9MVCAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieGdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IHR4X2J5dGVzOyAgICAgIC8qKjwgVFggYnl0ZXMuICovCisgICAgdWludDY0X3QgdHhfcGFja2V0czsgICAgLyoqPCBUWCBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHJ4X3BhY2tldHM7ICAgIC8qKjwgUlggcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCByeF9ieXRlczsgICAgICAvKio8IFJYIGJ5dGVzLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJ4Z3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5OyAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9nZW1fcG9ydCIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJ4Z3Bvbl9nZW1fcG9ydCIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCBzdGF0OyAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlIAorICogInhncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAieGdwb25fZ2VtX3BvcnQiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fY2xlYXJlZDsgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9jbGVhcmVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fcmFpc2VkOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9yYWlzZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgInhncG9uX2dlbV9wb3J0IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5OyAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAieGdwb25faXdmIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25faXdmX2tleQoreworICAgIGJjbW9sdF94Z3Bvbl9uaSBwb25fbmk7IC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworfSBiY21vbHRfeGdwb25faXdmX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9pd2YiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEKK3sKKyAgICB1aW50MTZfdCB1c19vdGFnX2RpcmVjdF90cGlkOyAgIC8qKjwgVFBJRCB2YWx1ZSBvZiB0aGUgVkxBTiB0YWcgYWRkZWQgdG8gdXBzdHJlYW0gcGFja2V0ICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0RBVEFfRFNfVFBJRF9MRU4gICA1CisgICAgYmNtb2x0X2Fycl91MTZfNV9oZXggZHNfdHBpZDsgICAvKio8IFBhY2tldHMgbWFya2VkIHdpdGggb25lIG9mIHRoZSBmaXZlIGNvbmZpZ3VyZWQgRFMgVFBJRCBvcHRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLCBhbGwgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkICovCit9IGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieGdwb25faXdmIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25faXdmX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25faXdmX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX2tleQoreworICAgIGJjbW9sdF94Z3Bvbl9uaSBwb25fbmk7IC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworfSBiY21vbHRfeGdwb25fbmlfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfaHdfcG9uX2lkIGh3X3Bvbl9pZDsgLyoqPCA1MSBiaXQgUE9OIGlkZW50aWZpZXIuIFRoaXMgYXR0cmlidXRlIGlzIHBhcnQgb2YgdGhlIGRvd25zdHJlYW0gcGh5c2ljYWwgc3luY2hyb25pemF0aW9uIGJsb2NrIChQU0JkKSAqLworICAgIGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCBhdmFpbGFibGVfYmFuZHdpZHRoOyAvKio8IFBPTiBhdmFpbGFibGUgYmFuZHdpZHRoIHBhcmFtZXRlcnMgKi8KKyAgICB1aW50MTZfdCBudW1iZXJfb2ZfYWN0aXZlX29udXM7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYWN0aXZlIE9OVXMgb24gdGhlIFBPTiAqLworICAgIGJjbW9sdF9wb25fc3RhdHVzIHBvbl9zdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBPTiBzdGF0dXMgcGFyYW1ldGVycyAqLworICAgIGJjbW9sdF9wb25fZGlzdGFuY2UgcG9uX2Rpc3RhbmNlOyAgICAgICAgICAgICAgICAgICAvKio8IFBPTiBkaXN0YW5jZSAqLworICAgIHVpbnQzMl90IHJhbmdpbmdfd2luZG93X3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJhbmdpbmcgd2luZG93IHNpemUgaW4gQlcgdW5pdHMgKDQtYnl0ZSB3b3JkcyBmb3IgMi41RyB1cHN0cmVhbSwgMTYtYnl0ZSBibG9ja3MgZm9yIDEwRyB1cHN0cmVhbSkgKi8KKyAgICB1aW50MzJfdCBlcWRfY3ljbGVzX251bWJlcjsgICAgICAgICAgICAgLyoqPCBIb3cgbWFueSByYW5naW5nIHdpbmRvd3MgYXJlIG9wZW5lZCBkdXJpbmcgYSBzaW5nbGUgT05VIGFjdGl2YXRpb24gcHJvY2VzcyAqLworICAgIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCBkcmlmdF9jb250cm9sOyAvKio8IERyaWZ0IGNvbnRyb2wgcHJvY2VzcyBjb25maWd1cmF0aW9uICovCisgICAgdWludDhfdCBsb3NfYWxhcm1fdGhyZXNob2xkOyAgICAgICAgICAgIC8qKjwgTE9TIGFsYXJtIHRocmVzaG9sZCAqLworICAgIGJjbW9sdF9zdGF0dXMgbG9zX2luaXRpYWxfdmFsdWU7ICAgICAgICAvKio8IExPUyBpbml0aWFsIHZhbHVlIGZvbGxvd2luZyBQT04gYWN0aXZhdGlvbiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgb251X2FsYXJtc190aHJlc2hvbGRzOyAgICAgICAgICAgICAgIC8qKjwgT05VIGFsYXJtcyB0aHJlc2hvbGRzIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIGJlcl9tb25pdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJFUiBtb25pdG9yIHByb2Nlc3MgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiBvbnVfYWN0aXZhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT05VIGFjdGl2YXRpb24gY29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIHNuX2FjcXVpc2l0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTZXJpYWwgTnVtYmVyIHByb2Nlc3MgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2Uga2V5X2V4Y2hhbmdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIHByb2Nlc3MgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyBwcm90ZWN0aW9uX3N3aXRjaGluZzsgICAgICAgICAgICAgICAgIC8qKjwgUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29udHJvbCAqLworICAgIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZzsgICAgIC8qKjwgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgZGVidWcgLiAqLworICAgIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGU7ICAgICAgICAgICAgIC8qKjwgQ0JSIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUgKi8KKyNkZWZpbmUgQkNNT0xUX1hHUE9OX05JX0NGR19EQVRBX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFX0xFTiAyCisgICAgYmNtb2x0X2Fycl91MTZfMiBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDQlIgbm9uIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUgKi8KKyAgICBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiBwb3dlcl9tYW5hZ2VtZW50OyAgICAgICAgICAgICAvKio8IE9OVSBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgKi8KKyAgICBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzczsgICAgICAgICAvKio8IFRCRCAqLworICAgIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3Jpbmc7IC8qKjwgUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZyAqLworICAgIGJjbW9sdF9kYmFfbW9kZSBkYmFfbW9kZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgREJBIG1vZGUgKi8KKyAgICBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgcGxvYW1faGFuZGxpbmc7ICAgICAvKio8IFBsb2FtIGhhbmRsaW5nIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2NfaWQgbWluX2RhdGFfYWxsb2NfaWQ7ICAgICAgICAvKio8IE1pbiBkYXRhIEFsbG9jIElEIHZhbHVlICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9pZCBtaW5fZGF0YV9nZW1fcG9ydF9pZDsgICAgICAgLyoqPCBNaW4gZGF0YSBYR0VNIHBvcnQgSUQgdmFsdWUgKi8KKyAgICBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSBtdWx0aWNhc3Rfa2V5OyAgICAgICAvKio8IE11bHRpY2FzdCBYR0VNIHBvcnRzIGVuY3J5cHRpb24gY29udHJvbCAqLworICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHByYnNfY2hlY2tlcjsgICAgICAgIC8qKjwgVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHByYnNfZ2VuZXJhdG9yOyAgICAvKio8IERTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfcHJic19zdGF0dXMgcHJic19zdGF0dXM7ICAgICAgICAgICAgICAgICAvKio8IFJlc3VsdCBvZiBVUyBQUkJTIGNoZWNrZXIgKi8KKyAgICBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gYXV0b21hdGljX29udV9kZWFjdGl2YXRpb247ICAgLyoqPCBPcHRpb24gdG8gZGlzYWJsZSB0aGUgYXV0b21hdGljIGRlYWN0aXZhdGlvbiBvZiBPTlVzIGR1ZSB0byBhbGFybXMgKi8KKyAgICB1aW50MzJfdCB1c19iYW5kd2lkdGhfbGltaXQ7ICAgIC8qKjwgVG90YWwgUE9OIHVwc3RyZWFtIGJhbmR3aWR0aCBsaW1pdCBpbiBieXRlcyBwZXIgc2Vjb25kLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIGFsbF9vbnVzOyAgICAgICAgICAgICAgICAgIC8qKjwgQWxsIE9OVXMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggYWxsX21jYXN0X2dlbV9wb3J0czsgIC8qKjwgQWxsIG11bHRpY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyBkZWJ1ZzsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBPTiBOSSBkZWJ1ZyBwYXJhbWV0ZXJzICovCisgICAgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIG9udV91cGdyYWRlX3BhcmFtczsgIC8qKjwgT05VIHVwZ3JhZGUgcGFyYW1zLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGRzX2ZlY19tb2RlOyAgICAgICAgICAgICAgICAgICAvKio8IERTIEZFQyBtb2RlLiAqLworICAgIGJjbW9sdF9kYmFfdHlwZSBkYmFfdHlwZTsgICAgICAgICAgICAgICAgICAgLyoqPCBEQkEgaW1wbGVtZW50YXRpb24gdHlwZSAqLworICAgIGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gb251X3R1bmluZzsgLyoqPCBvbnUgdHVuaW5nLiAqLworfSBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCBmZWNfY29kZXdvcmRzOyAgICAgICAgICAgICAvKio8IFJlY2VpdmUgRkVDIGNvZGV3b3Jkcy4gKi8KKyAgICB1aW50NjRfdCBiaXAzMl9ieXRlczsgICAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXAzMi4gKi8KKyAgICB1aW50NjRfdCBiaXAzMl9lcnJvcnM7ICAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIGJpcDMyIGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCByeF94Z3RjX2hlYWRlcnM7ICAgICAgICAgICAvKio8IFJlY2VpdmVkIHZhbGlkIFhHVEMgaGVhZGVycy4gKi8KKyAgICB1aW50NjRfdCByeF94Z3RjX2NvcnJlY3RlZDsgICAgICAgICAvKio8IFJlY2VpdmVkIGNvcnJlY3RlZCBYR1RDIGhlYWRlcnMuICovCisgICAgdWludDY0X3QgcnhfeGd0Y191bmNvcnJlY3RlZDsgICAgICAgLyoqPCBSZWNlaXZlZCB1bmNvcnJlY3RlZCBYR1RDIGhlYWRlcnMuICovCisgICAgdWludDY0X3QgcnhfeGdlbTsgICAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCB2YWxpZCBYR0VNIGZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCByeF94Z2VtX2Ryb3BwZWQ7ICAgICAgICAgICAvKio8IFJlY2VpdmVkIGRyb3BwZWQgWEdFTSBJRCBmcmFtZXMuICovCisgICAgdWludDY0X3QgcnhfeGdlbV9pZGxlOyAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBpZGxlIFhHRU0gZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHJ4X3hnZW1fY29ycmVjdGVkOyAgICAgICAgIC8qKjwgUmVjZWl2ZWQgY29ycmVjdGVkIFhHRU0gZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHJ4X2NyY19lcnJvcjsgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgcGFja2V0cyB3aXRoIENSQyBlcnJvci4gKi8KKyAgICB1aW50NjRfdCByeF9mcmFnbWVudF9lcnJvcjsgICAgICAgICAvKio8IFJlY2VpdmVkIGZyYWdtZW50IGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCByeF9wYWNrZXRzX2Ryb3BwZWQ7ICAgICAgICAvKio8IEdsb2JhbCBkcm9wcGVkIHBhY2tldHMuICovCisgICAgdWludDY0X3QgcnhfZHJvcHBlZF90b29fc2hvcnQ7ICAgICAgLyoqPCBSZWNlaXZlZCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gc2hvcnQuICovCisgICAgdWludDY0X3QgcnhfZHJvcHBlZF90b29fbG9uZzsgICAgICAgLyoqPCBSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nLiAqLworICAgIHVpbnQ2NF90IHJ4X2tleV9lcnJvcjsgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQga2V5IGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCB0eF9wbG9hbXM7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zbWl0dGVkIFBsb2Ftcy4gKi8KKyAgICB1aW50NjRfdCByeF9wbG9hbXNfZHJvcHBlZDsgICAgICAgICAvKio8IFJlY2VpdmVkIGRyb3BwZWQgUGxvYW1zLiAqLworICAgIHVpbnQ2NF90IHJ4X2FsbG9jYXRpb25zX3ZhbGlkOyAgICAgIC8qKjwgUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMuICovCisgICAgdWludDY0X3QgcnhfYWxsb2NhdGlvbnNfaW52YWxpZDsgICAgLyoqPCBSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zLiAqLworICAgIHVpbnQ2NF90IHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkOyAgIC8qKjwgUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMuICovCisgICAgdWludDY0X3QgcnhfcGxvYW1zOyAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBQbG9hbXMuICovCisgICAgdWludDY0X3QgcnhfcGxvYW1zX25vbl9pZGxlOyAgICAgICAgLyoqPCBSZWNlaXZlZCBub24gaWRsZSBQbG9hbXMuICovCisgICAgdWludDY0X3QgcnhfcGxvYW1zX2Vycm9yOyAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBlcnJvciBQbG9hbXMuICovCisgICAgdWludDY0X3QgcnhfY3B1OyAgICAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBDUFUgcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCByeF9vbWNpOyAgICAgICAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yOyAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMuICovCisgICAgdWludDY0X3QgdHhfcGFja2V0czsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc21pdHRlZCBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHR4X3hnZW07ICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNtaXR0ZWQgWEdFTSBmcmFnbWVudHMuICovCisgICAgdWludDY0X3QgdHhfY3B1OyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc21pdHRlZCBDUFUgcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCB0eF9vbWNpOyAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zbWl0dGVkIE9NQ0kgcGFja2V0cy4gKi8KKyAgICB1aW50OF90IHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZDsgICAgLyoqPCBUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoLiAqLworICAgIHVpbnQ2NF90IHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGg7ICAgICAvKio8IFRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGguICovCisgICAgdWludDY0X3QgdHhfZHJvcHBlZF90cGlkX21pc3M7ICAgICAgICAgIC8qKjwgVHJhbnNtaXQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBUUElEIG1pc3MuICovCisgICAgdWludDY0X3QgdHhfZHJvcHBlZF92aWRfbWlzczsgICAgICAgICAgIC8qKjwgVHJhbnNtaXQgcGFja2V0cyBkcm9wZWQgZHVlIHRvIFZJRCBtaXNzLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgY2ZnOyAgIC8qKjwgU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmc7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNwdV9wYWNrZXRzX2ZhaWx1cmUiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqCisgKiBBIGZhaWx1cmUgd2FzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgImNwdV9wYWNrZXRzIiBwcm94eSBvcGVyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhCit7CisgICAgYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IgZXJyb3I7ICAgIC8qKjwgVGhlIGVycm9yIHRoYXQgd2FzIGVuY291bnRlcmVkLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7ICAgICAgICAvKio8IFRoZSBHRU0gcG9ydCB0aGF0IGNhdXNlZCB0aGUgZXJyb3IuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY3B1X3BhY2tldHNfZmFpbHVyZSIgZ3JvdXAgb2YgInhncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmU7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZDsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJsb3MiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworfSBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibG9zIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9sb3MKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX2xvczsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV9kaXNjb3ZlcmVkIiBncm91cCBvZiB0aGUgInhncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhCit7CisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlcjsgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIHVpbnQzMl90IHJhbmdpbmdfdGltZTsgICAgICAgICAgICAgIC8qKjwgcmFuZ2luZyB0aW1lLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgb251X2lkOyAgICAgICAgIC8qKjwgb251X2lkLiAqLworICAgIGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHVwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXM7IC8qKjwgVXBzdHJlYW0gbGluZSByYXRlIGNhcGFiaWxpdGllcyAqLworICAgIHVpbnQ4X3QgY3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZDsgICAgICAgICAgICAgICAgICAvKio8IFRoZSBQT04tSUQgcmVjZWl2ZWQgYnkgdGhlIE9OVSBpbiBpdHMgY3VycmVudCBkb3duc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCAqLworICAgIHVpbnQ4X3QgY3VycmVudF91cHN0cmVhbV9wb25faWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBQT04tSUQgb2YgdGhlIENoYW5uZWwgUHJvZmlsZSBjb250YWluaW5nIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgaW4gd2hpY2ggdGhlIE9OVSBpcyB0cmFuc21pdHRpbmcgKi8KKyNkZWZpbmUgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0RBVEFfQ0FMSUJSQVRJT05fUkVDT1JEX0xFTiAgOAorICAgIGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggY2FsaWJyYXRpb25fcmVjb3JkOyAvKio8IENhbGlicmF0aW9uIHJlY29yZCAqLworICAgIHVpbnQ4X3QgdHVuaW5nX2dyYW51bGFyaXR5OyAgICAgICAgICAgICAvKio8IFRoZSB0dW5pbmcgZ3JhbnVsYXJpdHkgb2YgdGhlIE9OVSB0cmFuc21pdHRlZCBleHByZXNzZWQgaW4gdW5pdHMgb2YgMUdoei4gVmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgT05VIGRvZXMgbm90IHN1cHBvcnQgZmluZSB0dW5pbmcgLyBkaXRoZXJpbmcgKi8KKyAgICB1aW50OF90IHN0ZXBfdHVuaW5nX3RpbWU7ICAgICAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgb2YgdGhlIHR1bmluZyB0aW1lIGZvciBhIHNpbmdsZSBncmFudWxhcml0eSBzdGVwLCBleHByZXNzZWQgaW4gdW5pdCBvZiBQSFkgZnJhbWVzLiBUaGUgdmFsdWUgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgT05VIGRvZXMgbm90IHN1cHBvcnQgZmluZSB0dW5pbmcgLyBkaXRoZXJpbmcgKi8KKyAgICB1aW50OF90IGF0dGVudWF0aW9uOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgT05VIGF0dGVudWF0aW9uIGluIHN0ZXBzIG9mIDNkQiBhdCB0aGUgdGltZSBvZiB0aGUgbWVzc2FnZSB0cmFuc21pc3Npb24gYXMgcGFydCBvZiB0aGUgcG93ZXIgbGV2ZWxsaW5nIHJlcG9ydC4gVmFsdWUgb2YgMCByZXByZXNlbnRzIHVuLWF0dGVudWF0ZWQgdHJhbnNtaXNzaW9uICovCisgICAgdWludDhfdCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzOyAgIC8qKjwgVGhlIE9OVSBzdXBwb3J0cyBhdHRlbnVhdGlvbiBsZXZlbCBpbiBzdGVwIG9mIDNkQiAqLworfSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfZGlzY292ZXJlZCIgZ3JvdXAgb2YgInhncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib251X3VwZ3JhZGVfY29tcGxldGUiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEKK3sKKyAgICBiY21vc19ib29sIHN0YXR1czsgIC8qKjwgU3VjY2VzcyBvciBmYWlsdXJlLiAgQWdhaW5zdCBlbnRpcmUgdXBncmFkZSBwcm9jZXNzLiAgVGhpcyBpcyBhZGRlZCBwZXIgQW5hdCdzIHJlcXVlc3QuICovCisgICAgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIGxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzOyAgICAvKio8IExpc3Qgb2YgT05VLUlEcyB0aGUgdXBncmFkZSBmYWlsZWQgZm9yLiAqLworfSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfdXBncmFkZV9jb21wbGV0ZSIgZ3JvdXAgb2YgInhncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fbmkiIG9iamVjdC4gCisgKgorICogQWZ0ZXIgYSBzd2l0Y2hvdmVyIGlzIGNvbXBsZXRlIGFuZCBhbGwgT05VIHJhbmdpbmcgdGltZXMgaGF2ZSBzdGFiaWxpemVkLCAKKyAqIHRoaXMgaW5kaWNhdGlvbiBpcyBzZW50IHRvIGluZm9ybSB0aGUgaG9zdCBvZiBhbGwgbmV3IE9OVSBFUURzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiBvbnVzOyAvKio8IE9OVXMuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiIAorICogZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAvKio8IFJlc3VsdC4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiIAorICogZ3JvdXAgb2YgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIgZ3JvdXAgb2YgCisgKiB0aGUgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YQoreworICAgIGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHQgcmVzdWx0OyAgICAvKio8IFJlc3VsdC4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiIGdyb3VwIAorICogb2YgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgd2luZG93X3R5cGU7ICAgICAgICAgIC8qKjwgU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyAqLworICAgIGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgbWVhc3VyZW1lbnRfc3RhdHVzOyAvKio8IFN0YXR1cyBvZiB0aGUgcm9ndWUgT05VIGRldGVjdGlvbiByZXN1bHQuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWxsb2MtSUQgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2lkIG9udV9pZDsgICAgICAgICAgICAgICAgIC8qKjwgT05VLUlEICovCisgICAgYmNtb3NfYm9vbCBpc19kZWxpbmVhdGlvbjsgICAgICAgICAgICAgICAgICAvKio8IEJ1cnN0IERlbGluZWF0aW9uIGRldGVjdGVkIGR1cmluZyB0aGUgcm9ndWUgT05VIGRldGVjdGlvbi4gKi8KKyAgICBiY21vc19ib29sIGlzX2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSXMgRUQuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIHJ4X2RhdGE7ICAgICAgICAgICAgICAgICAvKio8IENhcHR1cmVkIFBMT0FNdSBtZXNzYWdlIGlmIHRoZSBidXJzdCBkZWxpbmllYXRpb24gd2FzIGRldGVjdGVkLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgcGxvYW1fcmVjZWl2ZWRfb251X2lkOyAgLyoqPCBPTlUgSUQgcmVjZWl2ZWQgaW4gdGhlIHBsb2FtICovCisgICAgYmNtb3NfYm9vbCBwbG9hbV9yZWNlaXZlZF9taWNfZXJyb3I7ICAgICAgICAvKio8IE1pYyBlcnJvciBpbiB0aGUgcmVjZWl2ZWQgcGxvYW0gKi8KK30gYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCIgZ3JvdXAgCisgKiBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIgCisgKiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiBncm91cCAKKyAqIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgdWludDMyX3QgbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlcjsgIC8qKjwgbnVtYmVyIG9mIGRldGVjdGVkIGRlbGltaXRlci4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGVuZXJneV9kZXRlY3Rfc2lnbmFsOyAgICAgLyoqPCBlbmVyZ3kgZGV0ZWN0IHNpZ25hbC4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiIAorICogZ3JvdXAgb2YgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgc3RhdDsgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkIHN0YXQ7ICAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAgICAgICAgICAgICAvKio8IFJlc3VsdC4gKi8KKyAgICBiY21vbHRfcG9uX3N0YXRlIHByZXZpb3VzX3N0YXRlOyAgICAvKio8IFByZXZpb3VzIHN0YXRlLiAqLworICAgIGJjbW9sdF9wb25fc3RhdGUgbmV3X3N0YXRlOyAgICAgICAgIC8qKjwgbmV3IHN0YXRlLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfc3RyXzY0IHRvZF9zdHJpbmc7ICAgLyoqPCB0b2Rfc3RyaW5nLiAqLworICAgIHVpbnQ2NF90IHNmYzsgICAgICAgICAgICAgICAvKio8IHNmYy4gKi8KKyAgICB1aW50NjRfdCBydGNfb2Zmc2V0X3NlYzsgICAgLyoqPCBydGNfb2Zmc2V0X3NlYy4gKi8KKyAgICB1aW50MzJfdCBydGNfb2Zmc2V0X25zZWM7ICAgLyoqPCBydGNfb2Zmc2V0X25zZWMuICovCisgICAgYmNtb2x0X3Jlc3VsdCBzdGF0dXM7ICAgICAgIC8qKjwgc3RhdHVzLiAqLworfSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAidG9kX3JlcXVlc3RfY29tcGxldGVkIiBncm91cCBvZiAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQ7ICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBjcHVfcGFja2V0c19mYWlsdXJlOyAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImNwdV9wYWNrZXRzX2ZhaWx1cmUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQ7ICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBsb3M7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJsb3MiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2Rpc2NvdmVyZWQ7ICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib251X2Rpc2NvdmVyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X3VwZ3JhZGVfY29tcGxldGU7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib251X3VwZ3JhZGVfY29tcGxldGUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQ7ICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lOyAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZDsgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydDsgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQ7ICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fY2xlYXJlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhZGp1c3RfdHhfd2F2ZWxlbmd0aCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIEluc3RydWN0IGFuIHVuYXNzaWduZWQgT05VIHRvIGFkanVzdCBpdHMgdXBzdHJlYW0gdHJhbnNtaXR0ZXIgd2F2ZWxlbmd0aCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEKK3sKKyAgICBiY21vbHRfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyOyAvKio8IFNlcmlhbCBudW1iZXIgKi8KKyAgICBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIGZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uOyAgICAvKio8IEZyZXF1ZW5jeSBhZGp1c3RtZW50IGRpcmVjdGlvbiAqLworICAgIHVpbnQ4X3QgZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZTsgIC8qKjwgVGhlIHNpemUgb2YgdGhlIGZyZXF1bmN5IGFkanVzdG1lbnQgaW4gdW5pdHMgb2YgMC4xIEdoeiAqLworfSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhZGp1c3RfdHhfd2F2ZWxlbmd0aCIgZ3JvdXAgb2YgInhncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImRpc2FibGVfc2VyaWFsX251bWJlciIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEKK3sKKyAgICBiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgY29udHJvbDsgICAvKio8IGNvbnRyb2wuICovCisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlcjsgICAgICAgICAgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworfSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGlzYWJsZV9zZXJpYWxfbnVtYmVyIiBncm91cCBvZiAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcgoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlc2V0IiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9yZXNldAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Jlc2V0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyIgZ3JvdXAgb2YgdGhlIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgd2luZG93X3R5cGU7ICAvKio8IFR5cGUgb2Ygc2lsZW50IG1lYXN1cmVtZW50IHRvIGV4ZWN1dGUgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2NfaWQgYWxsb2NfaWQ7ICAgICAgICAgICAgIC8qKjwgQUxMT0MgSUQgdG8gc2NhbiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgb251X2lkOyAgICAgICAgICAgICAgICAgLyoqPCBPTlUgSUQgdG8gc2NhbiAqLworICAgIGJjbW9zX2Jvb2wgc2Vjb25kX3Jhbmdpbmdfd2luZG93OyAgICAgICAgICAgLyoqPCBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLworfSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX2RldGVjdGlvbl93aW5kb3ciIGdyb3VwIG9mIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJ1bl9zcGVjaWFsX2J3X21hcCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEKK3sKKyAgICB1aW50OF90IG51bWJlcl9vZl9jeWNsZTsgICAgLyoqPCBudW1iZXIgb2YgY3ljbGUuICovCisgICAgdWludDhfdCBhbGxvY2F0aW9uX251bWJlcjsgIC8qKjwgYWxsb2NhdGlvbiBudW1iZXIuICovCisgICAgdWludDhfdCBid19tYXBfYXJyYXk7ICAgICAgIC8qKjwgYncgbWFwIGFycmF5LiAqLworfSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicnVuX3NwZWNpYWxfYndfbWFwIiBncm91cCBvZiAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXA7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzZXRfb251X3N0YXRlIiBncm91cCBvZiB0aGUgInhncG9uX25pIiBvYmplY3QuIAorICoKKyAqIFNldCB0aGUgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YQoreworICAgIGJjbW9sdF9vbnVfb3BlcmF0aW9uIG9udV9zdGF0ZTsgLyoqPCBOZXcgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiAgVGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1heSBiZSBjb25maWd1cmVkIGJ5IHRoZSBYR1BPTiBOSSBjb25maWd1cmF0aW9uIG9iamVjdCA6IHhncG9uX25pLmNmZy5zbl9hY3F1aXNpdGlvbi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZXRfb251X3N0YXRlIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9wb25fc3RhdGUiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEKK3sKKyAgICBiY21vbHRfcG9uX29wZXJhdGlvbiBwb25fc3RhdGU7IC8qKjwgUE9OIHN0YXRlLiAqLworfSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInNldF9wb25fc3RhdGUiIGdyb3VwIG9mICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInNpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmciIAorICogZ3JvdXAgb2YgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3Jpbmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGFydF9vbnVfdXBncmFkZSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIE9MVCB0byBPTlUgZmlybXdhcmUgdHJhbnNmZXIgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhCit7CisgICAgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgbGlzdF9vZl9vbnVfaWRzOyAvKio8IExpc3Qgb2YgT05VIElEcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhcnRfb251X3VwZ3JhZGUiIGdyb3VwIG9mICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGU7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAidG9kX3JlcXVlc3QiIGdyb3VwIG9mICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3Q7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJicm9hZGNhc3RfcGxvYW1fcGFja2V0IiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEKK3sKKyNkZWZpbmUgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfREFUQV9QTE9BTV9MRU4gICA0MAorICAgIGJjbW9sdF9hcnJfdThfNDAgcGxvYW07IC8qKjwgcGxvYW0uICovCit9IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCIgZ3JvdXAgb2YgCisgKiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0Cit7CisgICAgYmNtb2x0X3Byb3h5IGhkcjsgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY3B1X3BhY2tldHMiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhCit7CisgICAgYmNtb2x0X3BhY2tldF90eXBlIHBhY2tldF90eXBlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgcGFja2V0IHR5cGUuICovCisgICAgYmNtb3NfYm9vbCBjYWxjX2NyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgY2FsYyBjcmMuICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiBnZW1fcG9ydF9saXN0OyAgIC8qKjwgZ2VtIHBvcnQgbGlzdC4gKi8KKyAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggYnVmZmVyOyAgICAgICAgICAgICAgICAgLyoqPCBidWZmZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNwdV9wYWNrZXRzIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0cworeworICAgIGJjbW9sdF9wcm94eSBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHM7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2tleQoreworICAgIGJjbW9sdF94Z3Bvbl9uaSBwb25fbmk7ICAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2lkIG9udV9pZDsgLyoqPCBvbnUgaWQuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YQoreworICAgIGJjbW9sdF9vbnVfc3RhdGUgb251X3N0YXRlOyAgICAgLyoqPCBDdXJyZW50IE9OVSBzdGF0ZSAqLworICAgIGJjbW9sdF9vbnVfc3RhdGUgb251X29sZF9zdGF0ZTsgLyoqPCBvbnUgb2xkIHN0YXRlLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7ICAgLyoqPCBTdGF0ZSBvZiBhbGwgT05VIGFsYXJtcy4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5czsgICAgLyoqPCBBRVMgZW5jcnlwdGlvbiBrZXlzIGxlYXJuZWQgZHVyaW5nIE9OVSByZWdpc3RyYXRpb24uICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2Flc19rZXkgY3VycmVudF9lbmNyeXB0aW9uX2tleTsgICAgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBBRVMgZW5jcnlwdGlvbiBrZXkuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4gKi8KKyAgICBiY21vbHRfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyOyAgICAgICAgICAgICAgICAgLyoqPCBPTlUgc2VyaWFsIG51bWJlciAqLworI2RlZmluZSBCQ01PTFRfWEdQT05fT05VX0NGR19EQVRBX1JFR0lTVFJBVElPTl9JRF9MRU4gICAzNgorICAgIGJjbW9sdF9hcnJfdThfMzYgcmVnaXN0cmF0aW9uX2lkOyAgICAgICAgICAgICAgICAgICAvKio8IE9OVSByZWdpc3RyYXRpb24gSUQgKi8KKyAgICBiY21vc19ib29sIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nOyAgICAgICAgICAgLyoqPCBFbmFibGVcRGlzYWJsZSBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIGxlYXJuaW5nICovCisgICAgYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXggcmFuZ2luZ19idXJzdF9wcm9maWxlOyAgIC8qKjwgQnVyc3QgcHJvZmlsZSBpbmRleCBmb3IgcmFuZ2luZyBhbGxvY2F0aW9ucyAqLworICAgIGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4IGRhdGFfYnVyc3RfcHJvZmlsZTsgICAgICAvKio8IEJ1cnN0IHByb2ZpbGUgaW5kZXggZm9yIGRhdGEgYWxsb2NhdGlvbnMgKi8KKyAgICB1aW50MzJfdCByYW5naW5nX3RpbWU7ICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgcmFuZ2luZyB0aW1lLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuICovCisgICAgYmNtb2x0X3N0YXR1cyBkaXNhYmxlZF9hZnRlcl9kaXNjb3Zlcnk7IC8qKjwgVGhpcyBPTlUgd2FzIGRpc2FibGVkIGFmdGVyIFNOIGRpc2NvdmVyeSAqLworICAgIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uIGRlYWN0aXZhdGlvbl9yZWFzb247ICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWFjdGl2YXRpb24gcmVhc29uLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgYWxsX2dlbV9wb3J0czsgICAgLyoqPCBBbGwgdW5pY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgT05VLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiBhbGxfYWxsb2NzOyAgICAgICAgICAgLyoqPCBBbGwgYWxsb2MgSURzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4gKi8KKyAgICBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSBleHRlbmRlZF9ndWFyZF90aW1lOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgZm9yIHRoaXMgT05VLiAqLworICAgIGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHVzX2xpbmVfcmF0ZTsgICAgICAgICAgICAgICAgLyoqPCBVUyBsaW5lIHJhdGUuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0RBVEFfQ0FMSUJSQVRJT05fUkVDT1JEX0xFTiAgICA4CisgICAgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCBjYWxpYnJhdGlvbl9yZWNvcmQ7ICAgICAgICAgICAgICAgICAvKio8IENhbGlicmF0aW9uIHJlY29yZC4gKi8KKyAgICB1aW50OF90IHR1bmluZ19ncmFudWxhcml0eTsgICAgICAgICAgICAgLyoqPCBUaGUgdHVuaW5nIGdyYW51bGFyaXR5IG9mIHRoZSBPTlUgdHJhbnNtaXR0ZWQgZXhwcmVzc2VkIGluIHVuaXRzIG9mIDFHSHouIFZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIE9OVSBkb2VzIG5vdCBzdXBwb3J0IGZpbmUgdHVuaW5nL2RpdGhlcmluZyAqLworICAgIHVpbnQ4X3Qgc3RlcF90dW5pbmdfdGltZTsgICAgICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSBvZiB0aGUgdHVuaW5nIHRpbWUgZm9yIGEgc2luZ2xlIGdyYW51bGFyaXR5IHN0ZXAsIGV4cHJlc3NlZCBpbiB1bml0cyBvZiBQSFkgZnJhbWVzLiAqLworICAgIHVpbnQ4X3QgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllczsgICAvKio8IFBvd2VyIGxldmVsbGluZyBjYXBhYmlsaXRpZXMuICovCisgICAgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXM7IC8qKjwgVGhpcyB2YWx1ZSBpbmRpY2F0ZSB0aGF0IHRoZSBvbnUgaXMgaW4gdGhlIG1pZGRsZSBvZiByZXF1ZXN0IHJlZ2lzdHJhdGlvbiBwcm9jZXNzICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IHBvc2l0aXZlX2RyaWZ0OyAgICAgICAgICAgIC8qKjwgcG9zaXRpdmUgZHJpZnQuICovCisgICAgdWludDY0X3QgbmVnYXRpdmVfZHJpZnQ7ICAgICAgICAgICAgLyoqPCBuZWdhdGl2ZSBkcmlmdC4gKi8KKyAgICB1aW50NjRfdCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb247ICAvKio8IGRlbGltaXRlciBtaXNzIGRldGVjdGlvbi4gKi8KKyAgICB1aW50NjRfdCBiaXAzMl9lcnJvcnM7ICAgICAgICAgICAgICAvKio8IGJpcDMyIGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCByeF93b3JkczsgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiA0LWJ5dGUgd29yZHMgcmVjZWl2ZWQgKHdvcmQgc2l6ZSBpcyA0IGJ5dGVzIHJlZ2FyZGxlc3Mgb2YgdXBzdHJlYW0gZGF0YSByYXRlKS4gKi8KKyAgICB1aW50NjRfdCBmZWNfY29ycmVjdGVkX3N5bWJvbHM7ICAgICAvKio8IGZlYyBjb3JyZWN0ZWQgc3ltYm9scy4gKi8KKyAgICB1aW50NjRfdCBmZWNfY29ycmVjdGVkX2NvZGV3b3JkczsgICAvKio8IGZlYyBjb3JyZWN0ZWQgY29kZXdvcmRzLiAqLworICAgIHVpbnQ2NF90IGZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkczsgICAvKio8IGZlYyB1bmNvcnJlY3RhYmxlIGNvZGV3b3Jkcy4gKi8KKyAgICB1aW50NjRfdCBmZWNfY29kZXdvcmRzOyAgICAgICAgICAgICAgICAgLyoqPCBmZWMgdG90YWwgY29kZXdvcmRzLiAqLworICAgIHVpbnQ2NF90IGZlY19jb3JyZWN0ZWRfYml0czsgICAgICAgICAgICAvKio8IGZlYyBjb3JyZWN0ZWQgYml0cy4gKi8KKyAgICB1aW50NjRfdCB4Z2VtX2tleV9lcnJvcnM7ICAgICAgICAgICAgICAgLyoqPCB4Z2VtIGtleSBlcnJvci4gKi8KKyAgICB1aW50NjRfdCB4Z2VtX2xvc3M7ICAgICAgICAgICAgICAgICAgICAgLyoqPCB4Z2VtIGxvc3MgLiAqLworICAgIHVpbnQ2NF90IHJ4X3Bsb2Ftc19taWNfZXJyb3I7ICAgICAgICAgICAvKio8IG1pYyBlcnJvciBwbG9hbS4gKi8KKyAgICB1aW50NjRfdCByeF9wbG9hbXNfbm9uX2lkbGU7ICAgICAgICAgICAgLyoqPCBub24gaWRsZSBwbG9hbS4gKi8KKyAgICB1aW50NjRfdCByeF9vbWNpOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBPTUNJIHBhY2tldHMuICovCisgICAgdWludDY0X3Qgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcjsgICAgIC8qKjwgUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCByeF9ieXRlczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCByeCBieXRlcy4gKi8KKyAgICB1aW50NjRfdCByeF9wYWNrZXRzOyAgICAgICAgICAgICAgICAgICAgLyoqPCByeCBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHR4X2J5dGVzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IHR4IGJ5dGVzLiAqLworICAgIHVpbnQ2NF90IHR4X3BhY2tldHM7ICAgICAgICAgICAgICAgICAgICAvKio8IHR4IHBhY2tldHMuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJkZmkiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImRmaSIgZ3JvdXAgb2YgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9kZmkKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9kZmk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJkZ2kiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImRnaSIgZ3JvdXAgb2YgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9kZ2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9kZ2k7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJkb3dpIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgaW50MzJfdCBkcmlmdF92YWx1ZTsgICAgICAgIC8qKjwgQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiAqLworICAgIHVpbnQzMl90IG5ld19lcWQ7ICAgICAgICAgICAvKio8IE5ldyBFUUQgYWZ0ZXIgZHJpZnQgaXMgY29ycmVjdGVkIChvbmx5IHZhbGlkIGlmIHN0YXR1cyBpcyAnb24nKS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZG93aSIgZ3JvdXAgb2YgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9kb3dpCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfZG93aTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImludmFsaWRfZGJydV9yZXBvcnQiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhCit7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAvKio8IEFsbG9jLUlELiAqLworfSBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJpbnZhbGlkX2RicnVfcmVwb3J0IiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IG5ld19rZXk7ICAgLyoqPCBuZXcga2V5LiAqLworfSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiIGdyb3VwIG9mIAorICogInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhCit7CisgICAgYmNtb2x0X2Flc19rZXkgZXhwZWN0ZWRfa2V5OyAgICAvKio8IGV4cGVjdGVkIGtleS4gKi8KKyAgICBiY21vbHRfYWVzX2tleSByZWNlaXZlZF9rZXk7ICAgIC8qKjwgcmVjZWl2ZWQga2V5LiAqLworfSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJsb29jaSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IGFsYXJtIHN0YXR1cy4gKi8KK30gYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxvb2NpIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2xvb2NpCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2k7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAvKio8IHN0YXR1cy4gKi8KKyAgICBiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiBmYWlsX3JlYXNvbjsgIC8qKjwgZmFpbCByZWFzb24uICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0RBVEFfUkVHSVNUUkFUSU9OX0lEX0xFTiAgMzYKKyAgICBiY21vbHRfYXJyX3U4XzM2IHJlZ2lzdHJhdGlvbl9pZDsgICAgICAgICAgIC8qKjwgcmVnaXN0cmF0aW9uIGlkLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5czsgICAgLyoqPCByZWdpc3RyYXRpb24gZW5jcnlwdGlvbiBrZXlzLiAqLworfSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfYWxhcm0iIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhCit7CisgICAgYmNtb2x0X3hncG9uX29udV9hbGFybXMgb251X2FsYXJtOyAgLyoqPCBvbnUgYWxhcm0uICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib251X2FsYXJtIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X29udV9hbGFybTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAvKio8IFN0YXR1cy4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyOyAvKio8IHNlcmlhbCBudW1iZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib251X2Rpc2FibGVfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib251X2VuYWJsZV9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyIHNlcmlhbF9udW1iZXI7IC8qKjwgc2VyaWFsIG51bWJlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9lbmFibGVfY29tcGxldGVkIiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV90dW5pbmdfaW5fY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAgICAgICAgICAgICAgICAgLyoqPCByZXN1bHQuICovCisgICAgYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24gZmFpbF9yZWFzb247IC8qKjwgZmFpbCByZWFzb24uICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgcmVzdWx0LiAqLworICAgIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiBmYWlsX3JlYXNvbjsgICAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9wdGljYWxfcmVmbGVjdGlvbiIgZ3JvdXAgb2YgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbgoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJwb3NzaWJsZV9kcmlmdCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBBbiBPTlUgaW4gYSBsb3cgcG93ZXIgc3RhdGUgbWF5IGJlIGV4cGVyaWVuY2luZyBkcmlmdCBiZXlvbmQgdGhlIGNvbmZpZ3VyZWQgCisgKiB0aHJlc2hvbGQuIFRoZSBlc3RpbWF0ZSBtYXkgYmUgaW5hY2N1cmF0ZSBkZXBlbmRpbmcgb24gT05VIGJlaGF2aW9yLiBBY3R1YWwgCisgKiBkcmlmdCBtYXkgYmUgbGVzcyB0aGFuIGVzdGltYXRlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IE9uOiBlc3RpbWF0ZWQgZHJpZnQgaGFzIGV4Y2VlZGVkIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZC4gKi8KKyAgICBpbnQzMl90IGVzdGltYXRlZF9kcmlmdDsgICAgLyoqPCBJZiBzdGF0dXMgaXMgb24sIHRoZSBlc3RpbWF0ZWQgZHJpZnQgdmFsdWUsIG90aGVyd2lzZSB6ZXJvICgwKS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInBvc3NpYmxlX2RyaWZ0IiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKgorICogUG93ZXIgY29uc3VtcHRpb24gcmVwb3J0IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhCit7CisjZGVmaW5lIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0RBVEFfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0xFTiA4CisgICAgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84IHBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydDsgLyoqPCBwb3dlciBjb25zdW1wdGlvbiByZXBvcnQuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInBvd2VyX2xldmVsX3JlcG9ydCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBQb3dlciBsZXZlbCByZXBvcnQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEKK3sKKyAgICB1aW50OF90IGF0dGVudWF0aW9uOyAgICAgICAgICAgICAgICAvKio8IEF0dGVudWF0aW9uLiAqLworICAgIHVpbnQ4X3QgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdHk7IC8qKjwgUG93ZXIgbGV2ZWxsaW5nIGNhcGFiaWxpdHkuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicG93ZXJfbGV2ZWxfcmVwb3J0IiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIgZ3JvdXAgb2YgdGhlIAorICogInhncG9uX29udSIgb2JqZWN0LiAKKyAqCisgKiBOb3RpZmljYXRpb24gdGhhdCBhbiBPTlVzIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgaGFzIGNoYW5nZWQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEKK3sKKyAgICBiY21vbHRfb251X3N0YXRlIG9sZF9zdGF0ZTsgLyoqPCBUaGUgc3RhdGUgdGhlIE9OVSB3YXMgcHJldmlvdXNseSBpbi4gKi8KKyAgICBiY21vbHRfb251X3N0YXRlIG5ld19zdGF0ZTsgLyoqPCBUaGUgc3RhdGUgdGhlIE9OVSBpcyBjdXJyZW50bHkgaW4uICovCisgICAgYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gcmVhc29uOyAgIC8qKjwgVGhlIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicHFzaSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwcXNpIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3Bxc2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wcXNpOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicmFuZ2luZ19jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiBmYWlsX3JlYXNvbjsgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyAgICB1aW50MzJfdCBlcWQ7ICAgICAgICAgICAgICAgLyoqPCBFUUQuICovCisgICAgdWludDhfdCBudW1iZXJfb2ZfcGxvYW1zOyAgIC8qKjwgbnVtYmVyIG9mIHBsb2Ftcy4gKi8KKyAgICB1aW50OF90IHBvd2VyX2xldmVsOyAgICAgICAgLyoqPCBwb3dlciBsZXZlbC4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJhbmdpbmdfY29tcGxldGVkIiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicmVnaXN0cmF0aW9uX2lkIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICoKKyAqIFJlZ2lzdHJhdGlvbiBJRCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YQoreworI2RlZmluZSBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9EQVRBX1JFR0lTVFJBVElPTl9JRF9MRU4gICAzNgorICAgIGJjbW9sdF9hcnJfdThfMzYgcmVnaXN0cmF0aW9uX2lkOyAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gSUQuICovCisgICAgYmNtb2x0X3Jlc3VsdCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXM7ICAvKio8IHJlcXVlc3QgcmVnaXN0cmF0aW9uIHN0YXR1cy4gKi8KKyAgICBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb247ICAgLyoqPCByZXF1ZXN0IHJlZ2lzdHJhdGlvbiBmYWlsIHJlYXNvbi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyZWdpc3RyYXRpb25faWQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uOyAgICAvKio8IGZhaWwgcmVhc29uLiAqLworfSBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNkaSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgdWludDMyX3QgYmVyOyAgICAgICAgICAgICAgIC8qKjwgSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2RpIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3NkaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3NkaTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSIgZ3JvdXAgb2YgCisgKiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqCisgKiBGYWlsdXJlIG9mIHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZHVlIHRvIE1JQyBlcnJvciAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uOyAgICAvKio8IHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbCByZWFzb24uICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIiAKKyAqIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNmaSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgdWludDMyX3QgYmVyOyAgICAgICAgICAgICAgIC8qKjwgSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2ZpIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3NmaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3NmaTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfeGdwb25fb251X3N0YXRfaWQgc3RhdDsgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkIHN0YXQ7ICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdWZpIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN1ZmkiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3N1Zmk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJ0aXdpIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgaW50MzJfdCBkcmlmdF92YWx1ZTsgICAgICAgIC8qKjwgQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiAqLworfSBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJ0aXdpIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3Rpd2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV90aXdpOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAidHVuaW5nX3Jlc3BvbnNlIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhCit7CisgICAgYmNtb3NfYm9vbCBhY2s7ICAgICAgICAgLyoqPCBpcyB0dW5pbmcgcmVzcG9uc2UgcmVjZWl2ZWQgd2l0aCBhY2sgb3IgbmFjayAqLworICAgIGJjbW9sdF9yZXN1bHQgcmVzdWx0OyAgIC8qKjwgcmVzdWx0LiAqLworfSBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInR1bmluZ19yZXNwb25zZSIgZ3JvdXAgb2YgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2U7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgZGZpOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZGZpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRnaTsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRnaSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBkb3dpOyAgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJkb3dpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGludmFsaWRfZGJydV9yZXBvcnQ7ICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImludmFsaWRfZGJydV9yZXBvcnQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZDsgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoOyAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0OyAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGxvb2NpOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJsb29jaSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQ7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV9hbGFybTsgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfYWxhcm0iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV9kaXNhYmxlX2NvbXBsZXRlZDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2VuYWJsZV9jb21wbGV0ZWQ7ICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV9lbmFibGVfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV90dW5pbmdfaW5fY29tcGxldGVkOyAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQ7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib251X3R1bmluZ19vdXRfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9wdGljYWxfcmVmbGVjdGlvbjsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvcHRpY2FsX3JlZmxlY3Rpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcG9zc2libGVfZHJpZnQ7ICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInBvc3NpYmxlX2RyaWZ0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydDsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcG93ZXJfbGV2ZWxfcmVwb3J0OyAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInBvd2VyX2xldmVsX3JlcG9ydCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZTsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHBxc2k7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwcXNpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHJhbmdpbmdfY29tcGxldGVkOyAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyYW5naW5nX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByZWdpc3RyYXRpb25faWQ7ICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicmVnaXN0cmF0aW9uX2lkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzZGk7IC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic2RpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZTsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc2ZpOyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzZmkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdWZpOyAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN1ZmkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgdGl3aTsgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJ0aXdpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHR1bmluZ19yZXNwb25zZTsgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAidHVuaW5nX3Jlc3BvbnNlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhZGp1c3RfdHhfd2F2ZWxlbmd0aCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBJbnN0cnVjdCB0aGUgT05VIHRvIGFkanVzdCBpdHMgdXBzdHJlYW0gdHJhbnNtaXR0ZXIgd2F2ZWxlbmd0aCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhCit7CisgICAgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiBmcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb247ICAgLyoqPCBGcmVxdWVuY3kgYWRqdXN0bWVudCBkaXJlY3Rpb24uICovCisgICAgdWludDhfdCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplOyAgLyoqPCBUaGUgc2l6ZSBvZiB0aGUgZnJlcXVlbmN5IGFkanVzdG1lbnQgaW4gdW5pdHMgb2YgMC4xR0h6ICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhZGp1c3RfdHhfd2F2ZWxlbmd0aCIgZ3JvdXAgb2YgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGg7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fb251IiBvYmplY3QuIAorICoKKyAqIENoYW5nZSBwb3dlciBsZXZlbGxpbmcgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhCit7CisgICAgYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sIGNvbnRyb2w7IC8qKjwgY29udHJvbC4gKi8KKyAgICB1aW50OF90IGF0dGVudWF0aW9uOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgcmVxdWVzdGVkIGF0dGVudWF0aW9uIGluIHN0ZXBzIG9mIDNkQiBhcyBwYXJ0IG9mIHBvd2VyIGxldmVsbGluZyBpbnN0cnVjdGlvbiAqLworfSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmc7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbjsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJnZXRfcG93ZXJfbGV2ZWwiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWwKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV90dW5pbmdfaW4iIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW47CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfdHVuaW5nX291dCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhCit7CisgICAgYmNtb2x0X3Bvbl9pZCB0YXJnZXRfZHNfcG9uX2lkOyAvKio8IHRhcmdldCBkcyBwb24gaWQuICovCisgICAgYmNtb2x0X3Bvbl9pZCB0YXJnZXRfdXNfcG9uX2lkOyAvKio8IHRhcmdldCB1cyBwb24gaWQuICovCisgICAgdWludDMyX3QgdGltZV90b19zd2l0Y2g7ICAgICAgICAvKio8IFRpbWUgdG8gc3dpdGNoIGluIG1zICovCisgICAgYmNtb3NfYm9vbCByb2xsYmFjazsgICAgICAgICAgICAvKio8IHJvbGxiYWNrLiAqLworICAgIGJjbW9sdF9zdGF0dXMgc3RhdHVzOyAgICAgICAgICAgLyoqPCBvbi0gdG8gc3RhcnQgdHVuaW5nIG91dCBvZmYtIHRvIHN0b3AgdHVuaW5nIG91dCAqLworfSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib251X3R1bmluZ19vdXQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJlcXVlc3RfcmVnaXN0cmF0aW9uIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICoKKyAqIFJlcXVlc3QgdGhlIE9OVSB0byBzZW5kIGl0cyBSZWdpc3RyYXRpb24gSUQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc21hX2ZsYWc7ICAgIC8qKjwgSXMgdGhlIHJlcXVlc3QgcmVnaXN0cmF0aW9uIHByb2Nlc3MgaXMgcGFydCBvZiB0aGUgU01BIHByb2Nlc3MgKi8KK30gYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlcXVlc3RfcmVnaXN0cmF0aW9uIiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb24KK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbjsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyc3NpX21lYXN1cmVtZW50IiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiIgZ3JvdXAgb2YgdGhlIAorICogInhncG9uX29udSIgb2JqZWN0LiAKKyAqCisgKiBPTUNJIGJhc2Ugc2VjdXJlIG11dHVhbCBhdXRoZW50aWNhdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEKK3sKKyAgICBiY21vbHRfYWVzX2tleSBtYXN0ZXJfa2V5OyAgICAgICAgICAvKio8IG1hc3RlciBrZXkuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlcjsgLyoqPCBPTUNJIGRhdGEgYnVmZmVyLiAqLworICAgIHVpbnQzMl90IG1pYzsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgbWljLiAqLworfSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbgoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9vbnVfc3RhdGUiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhCit7CisgICAgYmNtb2x0X29udV9vcGVyYXRpb24gb251X3N0YXRlOyAvKio8IE9OVSBzdGF0ZS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2V0X29udV9zdGF0ZSIgZ3JvdXAgb2YgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNwdV9wYWNrZXRzIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhCit7CisgICAgYmNtb2x0X3BhY2tldF90eXBlIHBhY2tldF90eXBlOyAgICAgLyoqPCBwYWNrZXQgdHlwZS4gKi8KKyAgICBiY21vc19ib29sIGNhbGNfY3JjOyAgICAgICAgICAgICAgICAvKio8IGNhbGMgY3JjLiAqLworICAgIHVpbnQ4X3QgbnVtYmVyX29mX3BhY2tldHM7ICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIHBhY2tldHMuICovCisgICAgdWludDE2X3QgcGFja2V0X3NpemU7ICAgICAgICAgICAgICAgLyoqPCBTaW5nbGUgcGFja2V0IHNpemUuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlcjsgLyoqPCBidWZmZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjcHVfcGFja2V0cyIgZ3JvdXAgb2YgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0cworeworICAgIGJjbW9sdF9wcm94eSBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicGxvYW1fcGFja2V0IiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgZGVmYXVsdF9rZXk7IC8qKjwgZGVmYXVsdCBrZXkuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0RBVEFfUExPQU1fTEVOICAgIDQwCisgICAgYmNtb2x0X2Fycl91OF80MCBwbG9hbTsgLyoqPCBwbG9hbS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwbG9hbV9wYWNrZXQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0Cit7CisgICAgYmNtb2x0X3Byb3h5IGhkcjsgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNwdV9wYWNrZXQiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICoKKyAqIEluZGljYXRlcyBDUFUgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEKK3sKKyAgICB1aW50MTZfdCBwb3J0X2lkOyAgICAgICAgICAgLyoqPCBwb3J0IGlkLiAqLworICAgIGJjbW9zX2Jvb2wgY3JjX29rOyAgICAgICAgICAvKio8IGNyYyBvay4gKi8KKyAgICB1aW50MzJfdCBwYWNrZXRfc2l6ZTsgICAgICAgLyoqPCBwYWNrZXQgc2l6ZS4gKi8KKyAgICBiY21vbHRfdThfbGlzdF91MzIgYnVmZmVyOyAgLyoqPCBidWZmZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNwdV9wYWNrZXQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldAoreworICAgIGJjbW9sdF9wcm94eV9yeCBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbWNpX3BhY2tldCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKgorICogSW5kaWNhdGVzIE9NQ0kgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhCit7CisgICAgdWludDE2X3QgcG9ydF9pZDsgICAgICAgICAgIC8qKjwgcG9ydCBpZC4gKi8KKyAgICBiY21vc19ib29sIGNyY19vazsgICAgICAgICAgLyoqPCBjcmMgb2suICovCisgICAgdWludDMyX3QgcGFja2V0X3NpemU7ICAgICAgIC8qKjwgcGFja2V0IHNpemUuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIGJ1ZmZlcjsgIC8qKjwgYnVmZmVyLiAqLworfSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib21jaV9wYWNrZXQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXQKK3sKKyAgICBiY21vbHRfcHJveHlfcnggaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl90cngiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl90cnhfa2V5Cit7CisgICAgYmNtb2x0X3hncG9uX25pIHBvbl9uaTsgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCit9IGJjbW9sdF94Z3Bvbl90cnhfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInhncG9uX3RyeCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YQoreworI2RlZmluZSBCQ01PTFRfWEdQT05fVFJYX0NGR19EQVRBX0JVUlNUX1BST0ZJTEVfTEVOIDQKKyAgICBiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCBidXJzdF9wcm9maWxlOyAgICAgICAgICAgICAvKio8IGJ1cnN0IHByb2ZpbGUuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0RBVEFfVFJBTlNDRUlWRVJfQ09ORklHX0xFTiAgICA0CisgICAgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80IHRyYW5zY2VpdmVyX2NvbmZpZzsgICAgLyoqPCB0cmFuc2NlaXZlciBjb25maWcuICovCisgICAgYmNtb2x0X3hncG9uX3RyeF90eXBlIHRyYW5zY2VpdmVyX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCB0cnggdHlwZS4gKi8KKyAgICBiY21vbHRfeGdwb25fdHJ4X2RlYnVnIGRlYnVnOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWJ1Zy4gKi8KKyAgICBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnIHJzc2lfbm9ybWFsX2NvbmZpZzsgLyoqPCByc3NpIG5vcm1hbCBjb25maWcuICovCisgICAgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgcnNzaV9yYW5naW5nX2NvbmZpZzsgICAgICAgICAgICAgICAvKio8IHJzc2kgcmFuZ2luZyBjb25maWcuICovCisgICAgYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uIHNlcmRlc19jb25maWd1cmF0aW9uOyAgICAgICAgICAgICAvKio8IHNlcmRlcyBjb25maWd1cmF0aW9uLiAqLworI2RlZmluZSBCQ01PTFRfWEdQT05fVFJYX0NGR19EQVRBX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlNfTEVOICAgIDQKKyAgICBiY21vbHRfYXJyX3U4XzQgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9yczsgICAgICAgICAgICAgICAgIC8qKjwgYnVyc3QgcHJvZmlsZSBkZWxpbWl0ZXIgbWF4IGVycm9ycy4gKi8KKyAgICBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdDsgICAgIC8qKjwgUmVzZXQgcGF0dGVybnMgdXNlZCBhdCBJbml0IG9mIFJhbmdpbmctV2luZG93IGFuZCBhZnRlciBBY2Nlc3MgKi8KKyAgICBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZTsgIC8qKjwgcmFuZ2luZyBzbSBwYXR0ZXJucyBFRCBmYWlsdXJlLiAqLworICAgIGJjbW9zX2Jvb2wgcmVzZXRfb25fZGVsX21pc3M7ICAgLyoqPCByZXNldCBvbiBkZWwgbWlzcy4gKi8KKyAgICBiY21vbHRfeGdwb25fZWRfc3RhdGUgZWRfc3RhdGU7IC8qKjwgZWQgc3RhdGUuICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZWQ7ICAgICAgICAgICAvKio8IGludmVydCBFRC4gKi8KKyAgICBiY21vc19ib29sIGVuZF9vZl9idXJzdF9yZXNldDsgIC8qKjwgZW5kIG9mIGJ1cnN0IHJlc2V0LiAqLworICAgIGJjbW9zX2Jvb2wgdHJ4X3JzdF9wb2xhcml0eTsgICAgLyoqPCBUUlggcmVzZXQgcG9sYXJpdHkuICovCit9IGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieGdwb25fdHJ4IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fdHJ4X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl90cnhfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fdHJ4X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ4cG9uX3NlcmRlcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hwb25fc2VyZGVzX2tleQoreworICAgIGJjbW9sdF9wb25fbmkgcG9uX25pOyAgICAgICAgICAgICAgIC8qKjwgUE9OIE5JLiAqLworICAgIGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UgaW5zdGFuY2U7ICAgIC8qKjwgU2VyRGVzIGluc3RhbmNlOiAqLworfSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInhwb25fc2VyZGVzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEKK3sKKyAgICB1aW50OF90IHJ4X3ZnYTsgICAgIC8qKjwgUnggVmdhLiAqLworICAgIHVpbnQ4X3QgcnhfcGY7ICAgICAgLyoqPCBQZWFraW5nIEZpbHRlciAqLworICAgIHVpbnQ4X3QgcnhfbGZwZjsgICAgLyoqPCBMb3cgRnJlcXVlbmN5IFBlYWtpbmcgRmlsdGVyICovCisgICAgdWludDhfdCByeF9kZmUxOyAgICAvKio8IFJ4IERGRTEuICovCisgICAgaW50OF90IHJ4X2RmZTI7ICAgICAvKio8IFJ4IERGRTIuICovCisgICAgaW50OF90IHJ4X2RmZTM7ICAgICAvKio8IFJ4IERGRTMuICovCisgICAgaW50OF90IHJ4X2RmZTQ7ICAgICAvKio8IFJ4IERGRTQuICovCisgICAgaW50OF90IHJ4X2RmZTU7ICAgICAvKio8IFJ4IERGRTUuICovCisgICAgdWludDhfdCB0eF9wcmU7ICAgICAvKio8IFR4IFByZS4gKi8KKyAgICB1aW50OF90IHR4X21haW47ICAgIC8qKjwgVHggTWFpbi4gKi8KKyAgICB1aW50OF90IHR4X3Bvc3QxOyAgIC8qKjwgVHggUG9zdDEuICovCisgICAgaW50OF90IHR4X3Bvc3QyOyAgICAvKio8IFR4IFBvc3QyLiAqLworICAgIGludDhfdCB0eF9wb3N0MzsgICAgLyoqPCBUeCBQb3N0My4gKi8KKyAgICB1aW50OF90IHR4X2FtcDsgICAgIC8qKjwgVHggQW1wLiAqLworfSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieHBvbl9zZXJkZXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94cG9uX3NlcmRlc19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hwb25fc2VyZGVzX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hwb25fc2VyZGVzX2NmZzsKKworLyoqIEB9ICovCisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3BhY2soYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHlfcGFjayhiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHlfdW5wYWNrKGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfbmlfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfaWRfcGFjayhiY21vbHRfYWVfbmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX25pX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfaWRfdW5wYWNrKGJjbW9sdF9hZV9uaV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9uaV9lbl9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfZW5fc3RhdGVfcGFjayhiY21vbHRfYWVfbmlfZW5fc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfbmlfZW5fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfZW5fc3RhdGVfdW5wYWNrKGJjbW9sdF9hZV9uaV9lbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX25pX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X2lkX3BhY2soYmNtb2x0X2FlX25pX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9uaV9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X2lkX3VucGFjayhiY21vbHRfYWVfbmlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWRfcGFjayhiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZF91bnBhY2soYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfcGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfcGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hbGxvY19vcGVyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9hbGxvY19vcGVyYXRpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2FsbG9jX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FsbG9jX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hbGxvY19zdGF0ZV9wYWNrKGJjbW9sdF9hbGxvY19zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hbGxvY19zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hbGxvY19zdGF0ZV91bnBhY2soYmNtb2x0X2FsbG9jX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWxsb2NfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWxsb2NfdHlwZV9wYWNrKGJjbW9sdF9hbGxvY190eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FsbG9jX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWxsb2NfdHlwZV91bnBhY2soYmNtb2x0X2FsbG9jX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2Nhbl9wYWNrKGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2Nhbl91bnBhY2soYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZV9wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZV91bnBhY2soYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3BhY2soYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3VucGFjayhiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF9wYWNrKGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF91bnBhY2soYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3NpZ24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NpZ25fcGFjayhiY21vbHRfc2lnbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zaWduIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NpZ25fdW5wYWNrKGJjbW9sdF9zaWduICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc19wYWNrKGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc191bnBhY2soYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9saW5rX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbmtfdHlwZV9wYWNrKGJjbW9sdF9saW5rX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbGlua190eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbmtfdHlwZV91bnBhY2soYmNtb2x0X2xpbmtfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsX3BhY2soYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsX3VucGFjayhiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfY2hhbm5lbF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3BhY2soYmNtb2x0X2NoYW5uZWxfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3VucGFjayhiY21vbHRfY2hhbm5lbF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9jaGFubmVsX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9rZXlfaWRfcGFjayhiY21vbHRfY2hhbm5lbF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfY2hhbm5lbF9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9rZXlfaWRfdW5wYWNrKGJjbW9sdF9jaGFubmVsX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb25fcGFjayhiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfY29udHJvbF9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKGJjbW9sdF9jb250cm9sX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2NvbnRyb2xfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soYmNtb2x0X2NvbnRyb2xfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kYmFfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX21vZGVfcGFjayhiY21vbHRfZGJhX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGJhX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX21vZGVfdW5wYWNrKGJjbW9sdF9kYmFfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RiYV9yYW0gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RiYV9yYW1fcGFjayhiY21vbHRfZGJhX3JhbSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kYmFfcmFtIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RiYV9yYW1fdW5wYWNrKGJjbW9sdF9kYmFfcmFtICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGJhX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RiYV90eXBlX3BhY2soYmNtb2x0X2RiYV90eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RiYV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RiYV90eXBlX3VucGFjayhiY21vbHRfZGJhX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZHJfdGVzdF9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rkcl90ZXN0X3N0YXR1c19wYWNrKGJjbW9sdF9kZHJfdGVzdF9zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rkcl90ZXN0X3N0YXR1c191bnBhY2soYmNtb2x0X2Rkcl90ZXN0X3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGRyX3Rlc3RfcmVzdWx0X3BhY2soYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZHJfdGVzdF9yZXN1bHQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGRyX3Rlc3RfcmVzdWx0X3VucGFjayhiY21vbHRfZGRyX3Rlc3RfcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uX3BhY2soYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uX3VucGFjayhiY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGVidWdfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jZmdfaWRfcGFjayhiY21vbHRfZGVidWdfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RlYnVnX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jZmdfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF9wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfY2xpX2lucHV0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF91bnBhY2soYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWRfcGFjayhiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZF9wYWNrKGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZF91bnBhY2soYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZWJ1Z19rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9pZF9wYWNrKGJjbW9sdF9kZWJ1Z19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9pZF91bnBhY2soYmNtb2x0X2RlYnVnX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZF9wYWNrKGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZF91bnBhY2soYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkX3BhY2soYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkX3VucGFjayhiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkX3BhY2soYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkX3VucGFjayhiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NmZ19pZF9wYWNrKGJjbW9sdF9kZXZpY2VfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NmZ19pZF91bnBhY2soYmNtb2x0X2RldmljZV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fcGFjayhiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fdW5wYWNrKGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9jb25uZWN0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF91bnBhY2soYmNtb2x0X2RldmljZV9jb25uZWN0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWRfcGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZF91bnBhY2soYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWRfcGFjayhiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3BhY2soYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfcGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX3BhY2soYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3BhY2soYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3VucGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWRfcGFjayhiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfaWRfcGFjayhiY21vbHRfZGV2aWNlX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2Vfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3NwZWVkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3BlZWRfcGFjayhiY21vbHRfbm5pX3NwZWVkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9zcGVlZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3BlZWRfdW5wYWNrKGJjbW9sdF9ubmlfc3BlZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9yZXNldF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3Jlc2V0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9yZXNldF9pZF91bnBhY2soYmNtb2x0X2RldmljZV9yZXNldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9yZXNldF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV9wYWNrKGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV91bnBhY2soYmNtb2x0X2RldmljZV9yZXNldF9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZF91bnBhY2soYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2Vfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zdGF0ZV9wYWNrKGJjbW9sdF9kZXZpY2Vfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zdGF0ZV91bnBhY2soYmNtb2x0X2RldmljZV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkX3BhY2soYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZF9wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZF91bnBhY2soYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfcGFjayhiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbF9wYWNrKGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbF91bnBhY2soYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZHJ2X2ljZl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZHJ2X2ljZl9pZF9wYWNrKGJjbW9sdF9kcnZfaWNmX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Rydl9pY2ZfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZHJ2X2ljZl9pZF91bnBhY2soYmNtb2x0X2Rydl9pY2ZfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kcnZfc2diX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kcnZfc2diX2lkX3BhY2soYmNtb2x0X2Rydl9zZ2JfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZHJ2X3NnYl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kcnZfc2diX2lkX3VucGFjayhiY21vbHRfZHJ2X3NnYl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RzX3ZsYW5fYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kc192bGFuX2FjdGlvbl9wYWNrKGJjbW9sdF9kc192bGFuX2FjdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kc192bGFuX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kc192bGFuX2FjdGlvbl91bnBhY2soYmNtb2x0X2RzX3ZsYW5fYWN0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3BhY2soYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3VucGFjayhiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90ZmJfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdGZiX21vZGVfcGFjayhiY21vbHRfdGZiX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdGZiX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdGZiX21vZGVfdW5wYWNrKGJjbW9sdF90ZmJfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xpbV9zZWNfbW9kZV91cCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGltX3NlY19tb2RlX3VwX3BhY2soYmNtb2x0X2xpbV9zZWNfbW9kZV91cCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9saW1fc2VjX21vZGVfdXAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGltX3NlY19tb2RlX3VwX3VucGFjayhiY21vbHRfbGltX3NlY19tb2RlX3VwICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbGltX3NlY19tb2RlX2RuIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9saW1fc2VjX21vZGVfZG5fcGFjayhiY21vbHRfbGltX3NlY19tb2RlX2RuIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xpbV9zZWNfbW9kZV9kbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9saW1fc2VjX21vZGVfZG5fdW5wYWNrKGJjbW9sdF9saW1fc2VjX21vZGVfZG4gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94aW1fc2VjX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hpbV9zZWNfbW9kZV9wYWNrKGJjbW9sdF94aW1fc2VjX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGltX3NlY19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hpbV9zZWNfbW9kZV91bnBhY2soYmNtb2x0X3hpbV9zZWNfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2hzY19yYW0gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2hzY19yYW1fcGFjayhiY21vbHRfaHNjX3JhbSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9oc2NfcmFtIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2hzY19yYW1fdW5wYWNrKGJjbW9sdF9oc2NfcmFtICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbGltX3JhbSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGltX3JhbV9wYWNrKGJjbW9sdF9saW1fcmFtIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xpbV9yYW0gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGltX3JhbV91bnBhY2soYmNtb2x0X2xpbV9yYW0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sa3lfcmFtIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sa3lfcmFtX3BhY2soYmNtb2x0X2xreV9yYW0gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbGt5X3JhbSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sa3lfcmFtX3VucGFjayhiY21vbHRfbGt5X3JhbSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X21pY19yYW0gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21pY19yYW1fcGFjayhiY21vbHRfbWljX3JhbSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9taWNfcmFtIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21pY19yYW1fdW5wYWNrKGJjbW9sdF9taWNfcmFtICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeHBjc3JtX3JhbSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeHBjc3JtX3JhbV9wYWNrKGJjbW9sdF94cGNzcm1fcmFtIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hwY3NybV9yYW0gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeHBjc3JtX3JhbV91bnBhY2soYmNtb2x0X3hwY3NybV9yYW0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1c19wYWNrKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1c191bnBhY2soYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfcGFjayhiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfdW5wYWNrKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlX3BhY2soYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlX3VucGFjayhiY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV9wYWNrKGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl8xZ190dXJib19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfcGFjayhiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhdGVfcGFjayhiY21vbHRfZXBvbl9saW5rX3JhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3JhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdHVzX3BhY2soYmNtb2x0X3N0YXR1cyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdHVzX3VucGFjayhiY21vbHRfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3BhY2soYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2tleV9jaG9pY2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3VucGFjayhiY21vbHRfZXBvbl9rZXlfY2hvaWNlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfcGFjayhiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGlua19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGlua19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnlfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXR1cyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mb19wYWNrKGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mb191bnBhY2soYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua190eXBlX3BhY2soYmNtb2x0X2Vwb25fbGlua190eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua190eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua190eXBlX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9tcGNwX2dhdGVfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9nYXRlX21vZGVfcGFjayhiY21vbHRfbXBjcF9nYXRlX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbXBjcF9nYXRlX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9nYXRlX21vZGVfdW5wYWNrKGJjbW9sdF9tcGNwX2dhdGVfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3NfcGFjayhiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFncyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3NfdW5wYWNrKGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfcGFjayhiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnNfcGFjayhiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9ucyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bpb19waW4gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fcGluX3BhY2soYmNtb2x0X2dwaW9fcGluIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwaW9fcGluIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fcGluX3VucGFjayhiY21vbHRfZ3Bpb19waW4gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncGlvX3BvbGFyaXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3BvbGFyaXR5X3BhY2soYmNtb2x0X2dwaW9fcG9sYXJpdHkgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bpb19wb2xhcml0eSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3BvbGFyaXR5X3VucGFjayhiY21vbHRfZ3Bpb19wb2xhcml0eSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX3JwX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3JwX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcnBfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9ycF9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfa2V5X2lkX3BhY2soYmNtb2x0X2Vwb25fcnBfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcnBfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfa2V5X2lkX3VucGFjayhiY21vbHRfZXBvbl9ycF9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9leHRfaXJxIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9leHRfaXJxX3BhY2soYmNtb2x0X2V4dF9pcnEgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXh0X2lycSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9leHRfaXJxX3VucGFjayhiY21vbHRfZXh0X2lycSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb25fcGFjayhiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb25fdW5wYWNrKGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb25fcGFjayhiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl9wYWNrKGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dlbV9wb3J0X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X3R5cGVfcGFjayhiY21vbHRfZ2VtX3BvcnRfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9nZW1fcG9ydF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X3R5cGVfdW5wYWNrKGJjbW9sdF9nZW1fcG9ydF90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fcGFjayhiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncGlvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19jZmdfaWRfcGFjayhiY21vbHRfZ3Bpb19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bpb19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncGlvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwaW9fa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2tleV9pZF9wYWNrKGJjbW9sdF9ncGlvX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncGlvX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2tleV9pZF91bnBhY2soYmNtb2x0X2dwaW9fa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bpb19waW5fZGlyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3Bpbl9kaXJfcGFjayhiY21vbHRfZ3Bpb19waW5fZGlyIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwaW9fcGluX2RpciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3Bpbl9kaXJfdW5wYWNrKGJjbW9sdF9ncGlvX3Bpbl9kaXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncGlvX3ZhbHVlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3ZhbHVlX3BhY2soYmNtb2x0X2dwaW9fdmFsdWUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bpb192YWx1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3ZhbHVlX3VucGFjayhiY21vbHRfZ3Bpb192YWx1ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZF9wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2tleV9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2tleV9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV9wYWNrKGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV91bnBhY2soYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfbG9zX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2xvc19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2xvc19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfbG9zX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZCAKKyAqIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcmVzZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9kZmlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RmaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9kZmlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RmaV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2RmaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2RnaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2RnaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9kZ2lfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9kb3dpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2Rvd2lfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2Rvd2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9lcnJfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Vycl9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9lcnJfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Vycl9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2Vycl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9sb2FpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2xvYWlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2xva2lfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xva2lfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9sb2tpX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xva2lfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2tpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9tZW1pX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X21lbWlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X21lbWlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX3BhY2soYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3BlZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3BlZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wZWVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wc3RfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3BzdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wc3RfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9wc3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3JlaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3JlaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9yZWlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3BhY2soYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3NkaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3NkaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zZGlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zZmlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NmaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zZmlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NmaV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3NmaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zdWZpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N1ZmlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3N1ZmlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV90aXdpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3Rpd2lfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X29tY2lfZGV2aWNlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9vbWNpX2RldmljZV9pZF9wYWNrKGJjbW9sdF9vbWNpX2RldmljZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9vbWNpX2RldmljZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9vbWNpX2RldmljZV9pZF91bnBhY2soYmNtb2x0X29tY2lfZGV2aWNlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9wYWNrKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV91bnBhY2soYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlX3BhY2soYmNtb2x0X29tY2lfcmVzdWx0X2NvZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfb21jaV9yZXN1bHRfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlX3VucGFjayhiY21vbHRfb21jaV9yZXN1bHRfY29kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X29udV9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3N0YXRlX3BhY2soYmNtb2x0X29udV9zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9vbnVfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3N0YXRlX3VucGFjayhiY21vbHRfb251X3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ25fcGFjayhiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Jzc2lfbG9jYXRpb25fc2lnbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ25fdW5wYWNrKGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGVfcGFjayhiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGVfdW5wYWNrKGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl90cnhfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl90cnhfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fdHJ4X2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX3RyeF9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1c19wYWNrKGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1c191bnBhY2soYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2l3Zl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9pd2ZfbW9kZV9wYWNrKGJjbW9sdF9pd2ZfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9pd2ZfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9pd2ZfbW9kZV91bnBhY2soYmNtb2x0X2l3Zl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfcGFjayhiY21vbHRfbG9nX2VudHJ5X2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dfZmlsZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2ZpbGVfaWRfcGFjayhiY21vbHRfbG9nX2ZpbGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX2ZpbGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2ZpbGVfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZmlsZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19sZXZlbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2xldmVsX3BhY2soYmNtb2x0X2xvZ19sZXZlbCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfbGV2ZWwgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2xldmVsX3VucGFjayhiY21vbHRfbG9nX2xldmVsICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX3N0eWxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfc3R5bGVfcGFjayhiY21vbHRfbG9nX3N0eWxlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19zdHlsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfc3R5bGVfdW5wYWNrKGJjbW9sdF9sb2dfc3R5bGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX3R5cGVfcGFjayhiY21vbHRfbG9nX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX3R5cGVfdW5wYWNrKGJjbW9sdF9sb2dfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nZ2VyX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2NmZ19pZF9wYWNrKGJjbW9sdF9sb2dnZXJfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2NmZ19pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfaWRfcGFjayhiY21vbHRfbG9nZ2VyX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dnZXJfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfaWRfdW5wYWNrKGJjbW9sdF9sb2dnZXJfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjayB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2tfcGFjayhiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2sgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2sgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2tfdW5wYWNrKGJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjayAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZV9wYWNrKGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZV91bnBhY2soYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2RfcGFjayhiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2RfdW5wYWNrKGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9ubmlfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X25uaV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jZmdfaWRfcGFjayhiY21vbHRfbm5pX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ubmlfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX2Nvbm5lY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jb25uZWN0aW9uX3BhY2soYmNtb2x0X25uaV9jb25uZWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9jb25uZWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jb25uZWN0aW9uX3VucGFjayhiY21vbHRfbm5pX2Nvbm5lY3Rpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfa2V5X2lkX3BhY2soYmNtb2x0X25uaV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfa2V5X2lkX3VucGFjayhiY21vbHRfbm5pX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyaXZhbGVudCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJpdmFsZW50X3BhY2soYmNtb2x0X3RyaXZhbGVudCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90cml2YWxlbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJpdmFsZW50X3VucGFjayhiY21vbHRfdHJpdmFsZW50ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3BhY2soYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3VucGFjayhiY21vbHRfbm5pX3NlcmRlc19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWRfcGFjayhiY21vbHRfbm5pX3NlcmRlc19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9ubmlfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X25uaV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9pZF9wYWNrKGJjbW9sdF9ubmlfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9pZF91bnBhY2soYmNtb2x0X25uaV9zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWRfcGFjayhiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9vZG5fY2xhc3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29kbl9jbGFzc19wYWNrKGJjbW9sdF9vZG5fY2xhc3MgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfb2RuX2NsYXNzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29kbl9jbGFzc191bnBhY2soYmNtb2x0X29kbl9jbGFzcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb25fcGFjayhiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfb251X29wZXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X29wZXJhdGlvbl9wYWNrKGJjbW9sdF9vbnVfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X29udV9vcGVyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X29wZXJhdGlvbl91bnBhY2soYmNtb2x0X29udV9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWwgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3dlcl9sZXZlbF9wYWNrKGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWwgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfb251X3Bvd2VyX2xldmVsIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3dlcl9sZXZlbF91bnBhY2soYmNtb2x0X29udV9wb3dlcl9sZXZlbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RjX3Byb3RvY29sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90Y19wcm90b2NvbF9wYWNrKGJjbW9sdF90Y19wcm90b2NvbCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90Y19wcm90b2NvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90Y19wcm90b2NvbF91bnBhY2soYmNtb2x0X3RjX3Byb3RvY29sICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl9wYWNrKGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl91bnBhY2soYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wYWNrZXRfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcGFja2V0X3R5cGVfcGFjayhiY21vbHRfcGFja2V0X3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcGFja2V0X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcGFja2V0X3R5cGVfdW5wYWNrKGJjbW9sdF9wYWNrZXRfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl9wYWNrKGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9sYXJpdHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BvbGFyaXR5X3BhY2soYmNtb2x0X3BvbGFyaXR5IHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3BvbGFyaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BvbGFyaXR5X3VucGFjayhiY21vbHRfcG9sYXJpdHkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsX3BhY2soYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWwgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9sbGluZ19pbnRlcnZhbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsX3VucGFjayhiY21vbHRfcG9sbGluZ19pbnRlcnZhbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvbl9vcGVyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vcGVyYXRpb25fcGFjayhiY21vbHRfcG9uX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wb25fb3BlcmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9wb25fb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3BhY2soYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3VucGFjayhiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wb25fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9zdGF0ZV9wYWNrKGJjbW9sdF9wb25fc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9zdGF0ZV91bnBhY2soYmNtb2x0X3Bvbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbF9wYWNrKGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbF91bnBhY2soYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbl9wYWNrKGJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbl91bnBhY2soYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wcmJzX3BvbHlub21pYWwgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfcG9seW5vbWlhbF9wYWNrKGJjbW9sdF9wcmJzX3BvbHlub21pYWwgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcHJic19wb2x5bm9taWFsIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfcG9seW5vbWlhbF91bnBhY2soYmNtb2x0X3ByYnNfcG9seW5vbWlhbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZV9wYWNrKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZV91bnBhY2soYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcHJic19sb2NrX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2xvY2tfc3RhdGVfcGFjayhiY21vbHRfcHJic19sb2NrX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3ByYnNfbG9ja19zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2xvY2tfc3RhdGVfdW5wYWNrKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV9wYWNrKGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV91bnBhY2soYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3JfcGFjayhiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3JfdW5wYWNrKGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Jlc3VsdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVzdWx0X3BhY2soYmNtb2x0X3Jlc3VsdCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yZXN1bHQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVzdWx0X3VucGFjayhiY21vbHRfcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfcGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfdW5wYWNrKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3BhY2soYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3VucGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0X3BhY2soYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0X3VucGFjayhiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzX3BhY2soYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzX3VucGFjayhiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uX3BhY2soYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZV9wYWNrKGJjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZV91bnBhY2soYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19pbnN0YW5jZV9wYWNrKGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc2VyZGVzX2luc3RhbmNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19pbnN0YW5jZV91bnBhY2soYmNtb2x0X3NlcmRlc19pbnN0YW5jZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3NoYXBlcl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9zaGFwZXJfbW9kZV9wYWNrKGJjbW9sdF9zaGFwZXJfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zaGFwZXJfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9zaGFwZXJfbW9kZV91bnBhY2soYmNtb2x0X3NoYXBlcl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWRfcGFjayhiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWRfdW5wYWNrKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZF9wYWNrKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZF91bnBhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGVfcGFjayhiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGVfdW5wYWNrKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV9wYWNrKGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV91bnBhY2soYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zeXN0ZW1fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3lzdGVtX21vZGVfcGFjayhiY21vbHRfc3lzdGVtX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc3lzdGVtX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3lzdGVtX21vZGVfdW5wYWNrKGJjbW9sdF9zeXN0ZW1fbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kc19wYWNrKGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kc191bnBhY2soYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHRfcGFjayhiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHRfdW5wYWNrKGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZCB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZCAKKyAqIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlciB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uX3BhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZV9wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZV91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfdHlwZV9wYWNrKGJjbW9sdF90cnhfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90cnhfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfdHlwZV91bnBhY2soYmNtb2x0X3RyeF90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbl9wYWNrKGJjbW9sdF90dW5lX2luX2ZhaWxfcmVhc29uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3VhcnRfYmF1ZHJhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VhcnRfYmF1ZHJhdGVfcGFjayhiY21vbHRfdWFydF9iYXVkcmF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF91YXJ0X2JhdWRyYXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VhcnRfYmF1ZHJhdGVfdW5wYWNrKGJjbW9sdF91YXJ0X2JhdWRyYXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uX3BhY2soYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uX3VucGFjayhiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF91c192bGFuX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdXNfdmxhbl9hY3Rpb25fcGFjayhiY21vbHRfdXNfdmxhbl9hY3Rpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdXNfdmxhbl9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdXNfdmxhbl9hY3Rpb25fdW5wYWNrKGJjbW9sdF91c192bGFuX2FjdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3BhY2soYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3VucGFjayhiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfcGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlX3BhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25faXdmX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkX3VucGFjayhiY21vbHRfeGdwb25faXdmX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWRfcGFjayhiY21vbHRfeGdwb25faXdmX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfa2V5X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfbG9zX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfbG9zX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2xvc19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX251bV9vZl9vbnVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251c19wYWNrKGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251c191bnBhY2soYmNtb2x0X3hncG9uX251bV9vZl9vbnVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2RmaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RmaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9kZmlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RmaV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZmlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9kZ2lfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2RnaV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2RnaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9kb3dpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9sb29jaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9sb29jaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2xvb2NpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bxc2lfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bxc2lfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zZGlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3NkaV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3NkaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWRfcGFjayhiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3NmaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NmaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZmlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NmaV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZmlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zdWZpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Rpd2lfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV90aXdpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV90aXdpX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Rpd2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfcGFjayhiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkX3BhY2soYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fdHJ4X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3RyeF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfdHlwZV9wYWNrKGJjbW9sdF94Z3Bvbl90cnhfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl90cnhfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfdHlwZV91bnBhY2soYmNtb2x0X3hncG9uX3RyeF90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfcGFjayhiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfdW5wYWNrKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZF9wYWNrKGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZF91bnBhY2soYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX3NldF9kZWZhdWx0KGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX3BhY2soY29uc3QgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfdW5wYWNrKGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Flc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hZXNfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9hZXNfa2V5ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Flc19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZXNfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Flc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Flc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Flc19rZXlfdW5wYWNrKGJjbW9sdF9hZXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWVzX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZXNfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZXNfa2V5ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX3NldF9kZWZhdWx0KGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX3BhY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfdW5wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnX3VucGFjayhiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzX3NldF9kZWZhdWx0KGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzX3BhY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfdW5wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2JvdW5kcyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ib3VuZHNfc2V0X2RlZmF1bHQoYmNtb2x0X2JvdW5kcyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ib3VuZHMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ib3VuZHNfcGFjayhjb25zdCBiY21vbHRfYm91bmRzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ib3VuZHMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JvdW5kc191bnBhY2soYmNtb2x0X2JvdW5kcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2JvdW5kcyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ib3VuZHNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2JvdW5kcyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ib3VuZHNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ib3VuZHMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX2JvdW5kc184IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX2JvdW5kc184X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfYm91bmRzXzggKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX2JvdW5kc184IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2JvdW5kc184X3BhY2soY29uc3QgYmNtb2x0X2Fycl9ib3VuZHNfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX2JvdW5kc184IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfYm91bmRzXzhfdW5wYWNrKGJjbW9sdF9hcnJfYm91bmRzXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfYm91bmRzXzggc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2JvdW5kc184X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfYm91bmRzXzggaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2JvdW5kc184X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX2JvdW5kc184ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9zZXRfZGVmYXVsdChiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84X3VucGFjayhiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9zZXRfZGVmYXVsdChiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9wYWNrKGNvbnN0IGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X3VucGFjayhiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfc2V0X2RlZmF1bHQoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfcGFjayhjb25zdCBiY21vbHRfY2hhbm5lbF9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfcHJvZmlsZV91bnBhY2soYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzggKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X3BhY2soY29uc3QgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfdW5wYWNrKGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzggc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzggaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfcGFjayhjb25zdCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF91bnBhY2soYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X3BhY2soY29uc3QgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzhfdW5wYWNrKGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzggKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX3UxNl8yIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX3UxNl8yX3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdTE2XzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX3UxNl8yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX3BhY2soY29uc3QgYmNtb2x0X2Fycl91MTZfMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX3UxNl8yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfdTE2XzIgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdTE2XzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3UxNl8yICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl91MTZfMl9oZXggc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfdTE2XzJfaGV4X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdTE2XzJfaGV4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl91MTZfMl9oZXggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfaGV4X3BhY2soY29uc3QgYmNtb2x0X2Fycl91MTZfMl9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl91MTZfMl9oZXggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfMl9oZXhfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzJfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3UxNl8yX2hleCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfaGV4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdTE2XzJfaGV4IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfMl9oZXhfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfdTE2XzJfaGV4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl91MTZfNV9oZXggc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdTE2XzVfaGV4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl91MTZfNV9oZXggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3BhY2soY29uc3QgYmNtb2x0X2Fycl91MTZfNV9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl91MTZfNV9oZXggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfNV9oZXhfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzVfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3UxNl81X2hleCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdTE2XzVfaGV4IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfNV9oZXhfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfdTE2XzVfaGV4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl91MTZfNyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Fycl91MTZfN19zZXRfZGVmYXVsdChiY21vbHRfYXJyX3UxNl83ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl91MTZfNyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfN19wYWNrKGNvbnN0IGJjbW9sdF9hcnJfdTE2XzcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl91MTZfNyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl83X3VucGFjayhiY21vbHRfYXJyX3UxNl83ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3UxNl83IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfN19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYXJyX3UxNl83IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfN19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91MTZfNyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hcnJfdTMyXzYgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfdTMyXzZfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91MzJfNiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hcnJfdTMyXzYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTMyXzZfcGFjayhjb25zdCBiY21vbHRfYXJyX3UzMl82ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hcnJfdTMyXzYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MzJfNl91bnBhY2soYmNtb2x0X2Fycl91MzJfNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Fycl91MzJfNiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTMyXzZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Fycl91MzJfNiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTMyXzZfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfdTMyXzYgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX3U4XzEwIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX3U4XzEwX3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfMTAgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX3U4XzEwIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEwX3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF8xMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX3U4XzEwIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTBfdW5wYWNrKGJjbW9sdF9hcnJfdThfMTAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfdThfMTAgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEwX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdThfMTAgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEwX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3U4XzEwICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl91OF8xMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Fycl91OF8xMl9zZXRfZGVmYXVsdChiY21vbHRfYXJyX3U4XzEyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl91OF8xMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMl9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfdThfMTIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl91OF8xMiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEyX3VucGFjayhiY21vbHRfYXJyX3U4XzEyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3U4XzEyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYXJyX3U4XzEyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91OF8xMiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hcnJfdThfMTMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfdThfMTNfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91OF8xMyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hcnJfdThfMTMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTNfcGFjayhjb25zdCBiY21vbHRfYXJyX3U4XzEzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hcnJfdThfMTMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xM191bnBhY2soYmNtb2x0X2Fycl91OF8xMyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Fycl91OF8xMyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Fycl91OF8xMyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfdThfMTMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX3U4XzM2IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX3U4XzM2X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfMzYgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX3U4XzM2IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzM2X3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF8zNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX3U4XzM2IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMzZfdW5wYWNrKGJjbW9sdF9hcnJfdThfMzYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfdThfMzYgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzM2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdThfMzYgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzM2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3U4XzM2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl91OF80IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX3U4XzRfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91OF80ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl91OF80IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzRfcGFjayhjb25zdCBiY21vbHRfYXJyX3U4XzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl91OF80IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfNF91bnBhY2soYmNtb2x0X2Fycl91OF80ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3U4XzQgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Fycl91OF80IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF80X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3U4XzQgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX3U4XzQwIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX3U4XzQwX3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfNDAgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX3U4XzQwIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzQwX3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF80MCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX3U4XzQwIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfNDBfdW5wYWNrKGJjbW9sdF9hcnJfdThfNDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfdThfNDAgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzQwX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdThfNDAgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzQwX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3U4XzQwICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X3BhY2soY29uc3QgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfdW5wYWNrKGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF9zZXRfZGVmYXVsdChiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X3VucGFjayhiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fcGFjayhjb25zdCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl91bnBhY2soYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yZXN5bmNfY29udHJvbCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Jlc3luY19jb250cm9sX3NldF9kZWZhdWx0KGJjbW9sdF9yZXN5bmNfY29udHJvbCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yZXN5bmNfY29udHJvbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jlc3luY19jb250cm9sX3BhY2soY29uc3QgYmNtb2x0X3Jlc3luY19jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yZXN5bmNfY29udHJvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVzeW5jX2NvbnRyb2xfdW5wYWNrKGJjbW9sdF9yZXN5bmNfY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3Jlc3luY19jb250cm9sIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jlc3luY19jb250cm9sX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9yZXN5bmNfY29udHJvbCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yZXN5bmNfY29udHJvbF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Jlc3luY19jb250cm9sICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19zZXRfZGVmYXVsdChiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19wYWNrKGNvbnN0IGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX3VucGFjayhiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9zZXRfZGVmYXVsdChiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9wYWNrKGNvbnN0IGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX3VucGFjayhiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfc2V0X2RlZmF1bHQoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfcGFjayhjb25zdCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF91bnBhY2soYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfc2V0X2RlZmF1bHQoYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfcGFjayhjb25zdCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ191bnBhY2soYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZF91bnBhY2soYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgKnRoaXMpOworCisvKiBcY29uZCBVTkRPQ1VNRU5URURfU1lNQk9MUyAqLworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfc2V0X2RlZmF1bHQoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfcGFjayhjb25zdCBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlc191bnBhY2soYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyAqdGhpcyk7CisKKy8qIFxlbmRjb25kICovCisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X3NldF9kZWZhdWx0KGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X3BhY2soY29uc3QgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfdW5wYWNrKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3NldF9kZWZhdWx0KGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3BhY2soY29uc3QgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfdW5wYWNrKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9zZXRfZGVmYXVsdChiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9wYWNrKGNvbnN0IGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3VucGFjayhiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c191bnBhY2soYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c191bnBhY2soYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcmFuZ2Vfc3RhdHVzIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcmFuZ2Vfc3RhdHVzX3NldF9kZWZhdWx0KGJjbW9sdF9yYW5nZV9zdGF0dXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcmFuZ2Vfc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2Vfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X3JhbmdlX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcmFuZ2Vfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yYW5nZV9zdGF0dXNfdW5wYWNrKGJjbW9sdF9yYW5nZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9yYW5nZV9zdGF0dXMgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2Vfc3RhdHVzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9yYW5nZV9zdGF0dXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2Vfc3RhdHVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcmFuZ2Vfc3RhdHVzICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3JvZ3VlX3N0YXR1cyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3JvZ3VlX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfcm9ndWVfc3RhdHVzICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3JvZ3VlX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3N0YXR1c19wYWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3JvZ3VlX3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfc3RhdHVzX3VucGFjayhiY21vbHRfcm9ndWVfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcm9ndWVfc3RhdHVzIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcm9ndWVfc3RhdHVzIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JvZ3VlX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfcGFjayhjb25zdCBiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyc191bnBhY2soYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbl91bnBhY2soYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2luZm8gc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfaW5mb19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2luZm8gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2luZm8gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5mb19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfaW5mbyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmZvX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2luZm8gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfaW5mbyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5mb19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX2luZm8gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2luZm9fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfaW5mbyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfc2V0X2RlZmF1bHQoYmNtb2x0X2dhdGVfcGFyYW1ldGVycyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfcGFjayhjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc191bnBhY2soYmNtb2x0X2dhdGVfcGFyYW1ldGVycyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dhdGVfcGFyYW1ldGVycyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dhdGVfcGFyYW1ldGVycyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX3BhY2soY29uc3QgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMiB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmdfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc191bnBhY2soYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdThfbGlzdF91MTYgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF91OF9saXN0X3UxNl9zZXRfZGVmYXVsdChiY21vbHRfdThfbGlzdF91MTYgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfdThfbGlzdF91MTYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UxNl9wYWNrKGNvbnN0IGJjbW9sdF91OF9saXN0X3UxNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3U4X2xpc3RfdTE2IHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3U4X2xpc3RfdTE2X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF91OF9saXN0X3UxNiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3U4X2xpc3RfdTE2IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UxNl91bnBhY2soYmNtb2x0X3U4X2xpc3RfdTE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdThfbGlzdF91MTYgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3U4X2xpc3RfdTE2IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTE2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdThfbGlzdF91MTYgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3NldF9kZWZhdWx0KGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3BhY2soY29uc3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfdW5wYWNrKGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfc2V0X2RlZmF1bHQoYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfcGFjayhjb25zdCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF91bnBhY2soYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfc2V0X2RlZmF1bHQoYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfcGFjayhjb25zdCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV91bnBhY2soYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fcGFjayhjb25zdCBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl91bnBhY2soYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ191bnBhY2soYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X3VucGFjayhiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZ191bnBhY2soYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX3BhY2soY29uc3QgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2VfdW5wYWNrKGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF91bnBhY2soYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0IGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X3BhY2soY29uc3QgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfdW5wYWNrKGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfZGVidWdfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfZGVidWcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVidWdfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kZWJ1Z191bnBhY2soYmNtb2x0X2dwb25fbmlfZGVidWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX2RlYnVnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVidWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfZGVidWcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kZWJ1Z19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfZGVidWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbl91bnBhY2soYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9hbGFybXMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9hbGFybXNfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2FsYXJtcyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9hbGFybXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9hbGFybXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtc191bnBhY2soYmNtb2x0X2dwb25fb251X2FsYXJtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2FsYXJtcyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2FsYXJtcyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2VxZCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2VxZF9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZXFkICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2VxZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2VxZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXFkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZXFkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfZXFkIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfZXFkIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2VxZCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMl91bnBhY2soYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1Nl91bnBhY2soYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXNfdW5wYWNrKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c191bnBhY2soYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl91bnBhY2soYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfaG9zdF9zd192ZXJzaW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX3NldF9kZWZhdWx0KGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfaG9zdF9zd192ZXJzaW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX3BhY2soY29uc3QgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfaG9zdF9zd192ZXJzaW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ob3N0X3N3X3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfaG9zdF9zd192ZXJzaW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2h3X3Bvbl9pZCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2h3X3Bvbl9pZF9zZXRfZGVmYXVsdChiY21vbHRfaHdfcG9uX2lkICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2h3X3Bvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2h3X3Bvbl9pZF9wYWNrKGNvbnN0IGJjbW9sdF9od19wb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2h3X3Bvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaHdfcG9uX2lkX3VucGFjayhiY21vbHRfaHdfcG9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfaHdfcG9uX2lkIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2h3X3Bvbl9pZF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfaHdfcG9uX2lkIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2h3X3Bvbl9pZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2h3X3Bvbl9pZCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9zZXRfZGVmYXVsdChiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9wYWNrKGNvbnN0IGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X3VucGFjayhiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2llZWVfODAyMWFzX3BvcnRfaWRlbnRpdHkgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXAgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfc2V0X2RlZmF1bHQoYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXAgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfcGFjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcF91bnBhY2soYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXAgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX3NldF9kZWZhdWx0KGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX3BhY2soY29uc3QgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVfc3luYyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmNfdW5wYWNrKGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19zZXRfZGVmYXVsdChiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19wYWNrKGNvbnN0IGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX3VucGFjayhiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2xvZ19idWZmZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9sb2dfYnVmZmVyX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfYnVmZmVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19idWZmZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfYnVmZmVyX3BhY2soY29uc3QgYmNtb2x0X2xvZ19idWZmZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19idWZmZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19idWZmZXJfdW5wYWNrKGJjbW9sdF9sb2dfYnVmZmVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nX2J1ZmZlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfYnVmZmVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9sb2dfYnVmZmVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19idWZmZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dfYnVmZmVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfcGFjayhjb25zdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl91bnBhY2soYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfc2V0X2RlZmF1bHQoYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfcGFjayhjb25zdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF91bnBhY2soYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ubmlfbGlua19zdGF0dXMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ubmlfbGlua19zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9saW5rX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfbGlua19zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfbGlua19zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfbm5pX2xpbmtfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfbGlua19zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9saW5rX3N0YXR1c191bnBhY2soYmNtb2x0X25uaV9saW5rX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X25uaV9saW5rX3N0YXR1cyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfbGlua19zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X25uaV9saW5rX3N0YXR1cyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfbGlua19zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfbGlua19zdGF0dXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX3VucGFjayhiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9wb25faWQgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX2lkX3NldF9kZWZhdWx0KGJjbW9sdF9wb25faWQgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2lkX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25faWRfdW5wYWNrKGJjbW9sdF9wb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wb25faWQgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2lkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9wb25faWQgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2lkX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2lkICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfc2V0X2RlZmF1bHQoYmNtb2x0X29wZXJhdGlvbl9jb250cm9sICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfcGFjayhjb25zdCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9vcGVyYXRpb25fY29udHJvbF91bnBhY2soYmNtb2x0X29wZXJhdGlvbl9jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3Jpbmdfc2V0X2RlZmF1bHQoYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcGFjayhjb25zdCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ191bnBhY2soYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3Jpbmdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXJfdW5wYWNrKGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3Bvbl9hbGxvY19zbGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fYWxsb2Nfc2xhICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvbl9hbGxvY19zbGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9hbGxvY19zbGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvbl9hbGxvY19zbGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hbGxvY19zbGFfdW5wYWNrKGJjbW9sdF9wb25fYWxsb2Nfc2xhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcG9uX2FsbG9jX3NsYSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9wb25fYWxsb2Nfc2xhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hbGxvY19zbGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25fYWxsb2Nfc2xhICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfcGFjayhjb25zdCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aF91bnBhY2soYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcG9uX2RiYSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Bvbl9kYmFfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9kYmEgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX2RiYSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kYmFfcGFjayhjb25zdCBiY21vbHRfcG9uX2RiYSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX2RiYSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2RiYV91bnBhY2soYmNtb2x0X3Bvbl9kYmEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wb25fZGJhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kYmFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Bvbl9kYmEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2RiYV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9kYmEgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcG9uX2Rpc3RhbmNlIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX2Rpc3RhbmNlX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fZGlzdGFuY2UgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX2Rpc3RhbmNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2Rpc3RhbmNlX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9kaXN0YW5jZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX2Rpc3RhbmNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fZGlzdGFuY2VfdW5wYWNrKGJjbW9sdF9wb25fZGlzdGFuY2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wb25fZGlzdGFuY2Ugc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2Rpc3RhbmNlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9wb25fZGlzdGFuY2UgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2Rpc3RhbmNlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2Rpc3RhbmNlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfcGFjayhjb25zdCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbF91bnBhY2soYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfcGFjayhjb25zdCBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl91bnBhY2soYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcG9uX3Bvd2VyX2xldmVsIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX3Bvd2VyX2xldmVsIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX3Bvd2VyX2xldmVsIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWxfdW5wYWNrKGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zZXRfZGVmYXVsdChiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19wYWNrKGNvbnN0IGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3VucGFjayhiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9wb25fc3RhdHVzIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfcG9uX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wb25fc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3N0YXR1c19wYWNrKGNvbnN0IGJjbW9sdF9wb25fc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wb25fc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fc3RhdHVzX3VucGFjayhiY21vbHRfcG9uX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3Bvbl9zdGF0dXMgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcG9uX3N0YXR1cyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fc3RhdHVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3VucGFjayhiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfcGFjayhjb25zdCBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZ191bnBhY2soYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcHJic19zdGF0dXMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9wcmJzX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfcHJic19zdGF0dXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcHJic19zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX3N0YXR1c19wYWNrKGNvbnN0IGJjbW9sdF9wcmJzX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcHJic19zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfc3RhdHVzX3VucGFjayhiY21vbHRfcHJic19zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wcmJzX3N0YXR1cyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcHJic19zdGF0dXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wcmJzX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfc2V0X2RlZmF1bHQoYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfcGFjayhjb25zdCBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc191bnBhY2soYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9zZXRfZGVmYXVsdChiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9wYWNrKGNvbnN0IGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX3VucGFjayhiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2xfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1c191bnBhY2soYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfc2V0X2RlZmF1bHQoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfcGFjayhjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF91bnBhY2soYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzggc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzhfc2V0X2RlZmF1bHQoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhfcGFjayhjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzggd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzggKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOF91bnBhY2soYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9zZXRfZGVmYXVsdChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9wYWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0gKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3VucGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3Mgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3Nfc2V0X2RlZmF1bHQoYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfcGFjayhjb25zdCBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzc191bnBhY2soYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3Nfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3NlcmlhbF9udW1iZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3NldF9kZWZhdWx0KGJjbW9sdF9zZXJpYWxfbnVtYmVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3NlcmlhbF9udW1iZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3BhY2soY29uc3QgYmNtb2x0X3NlcmlhbF9udW1iZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3NlcmlhbF9udW1iZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmlhbF9udW1iZXJfdW5wYWNrKGJjbW9sdF9zZXJpYWxfbnVtYmVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc2VyaWFsX251bWJlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zZXJpYWxfbnVtYmVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmlhbF9udW1iZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zZXJpYWxfbnVtYmVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3NldF9kZWZhdWx0KGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3BhY2soY29uc3QgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfdW5wYWNrKGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3BhY2soY29uc3QgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfdW5wYWNrKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX3BhY2soY29uc3QgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWdfdW5wYWNrKGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjayhjb25zdCBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ191bnBhY2soYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfc3RyXzEwMCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3N0cl8xMDBfc2V0X2RlZmF1bHQoYmNtb2x0X3N0cl8xMDAgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfc3RyXzEwMCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8xMDBfcGFjayhjb25zdCBiY21vbHRfc3RyXzEwMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc3RyXzEwMCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzEwMF91bnBhY2soYmNtb2x0X3N0cl8xMDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9zdHJfMTAwIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8xMDBfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3N0cl8xMDAgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzEwMF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N0cl8xMDAgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfc3RyXzEwMDAgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zdHJfMTAwMF9zZXRfZGVmYXVsdChiY21vbHRfc3RyXzEwMDAgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfc3RyXzEwMDAgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwMF9wYWNrKGNvbnN0IGJjbW9sdF9zdHJfMTAwMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc3RyXzEwMDAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8xMDAwX3VucGFjayhiY21vbHRfc3RyXzEwMDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9zdHJfMTAwMCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfc3RyXzEwMDAgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzEwMDBfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfMTAwMCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9zdHJfMjAwMCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3N0cl8yMDAwX3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfMjAwMCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zdHJfMjAwMCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yMDAwX3BhY2soY29uc3QgYmNtb2x0X3N0cl8yMDAwICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zdHJfMjAwMCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzIwMDBfdW5wYWNrKGJjbW9sdF9zdHJfMjAwMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3N0cl8yMDAwIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yMDAwX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zdHJfMjAwMCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMjAwMF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N0cl8yMDAwICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3N0cl8yNTYgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zdHJfMjU2X3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfMjU2ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0cl8yNTYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMjU2X3BhY2soY29uc3QgYmNtb2x0X3N0cl8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3N0cl8yNTYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yNTZfdW5wYWNrKGJjbW9sdF9zdHJfMjU2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc3RyXzI1NiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMjU2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zdHJfMjU2IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yNTZfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfMjU2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3N0cl82NCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zdHJfNjRfc2V0X2RlZmF1bHQoYmNtb2x0X3N0cl82NCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zdHJfNjQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfNjRfcGFjayhjb25zdCBiY21vbHRfc3RyXzY0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zdHJfNjQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl82NF91bnBhY2soYmNtb2x0X3N0cl82NCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3N0cl82NCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfNjRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3N0cl82NCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfNjRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfNjQgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfc3dfZXJyb3Igc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zd19lcnJvcl9zZXRfZGVmYXVsdChiY21vbHRfc3dfZXJyb3IgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfc3dfZXJyb3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zd19lcnJvcl9wYWNrKGNvbnN0IGJjbW9sdF9zd19lcnJvciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc3dfZXJyb3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N3X2Vycm9yX3VucGFjayhiY21vbHRfc3dfZXJyb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9zd19lcnJvciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zd19lcnJvcl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfc3dfZXJyb3IgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3dfZXJyb3JfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zd19lcnJvciAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3N5c3RlbV9wcm9maWxlX3NldF9kZWZhdWx0KGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N5c3RlbV9wcm9maWxlX3BhY2soY29uc3QgYmNtb2x0X3N5c3RlbV9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3lzdGVtX3Byb2ZpbGVfdW5wYWNrKGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3N5c3RlbV9wcm9maWxlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N5c3RlbV9wcm9maWxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N5c3RlbV9wcm9maWxlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF90cnhfZGVsaW1pdGVyX3NldF9kZWZhdWx0KGJjbW9sdF90cnhfZGVsaW1pdGVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfZGVsaW1pdGVyX3BhY2soY29uc3QgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9kZWxpbWl0ZXJfdW5wYWNrKGJjbW9sdF90cnhfZGVsaW1pdGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdHJ4X2RlbGltaXRlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfZGVsaW1pdGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF90cnhfZGVsaW1pdGVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9kZWxpbWl0ZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfZGVsaW1pdGVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3Rfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3RfcGFjayhjb25zdCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF91bnBhY2soYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3Qgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3Rfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdHJ4X3ByZWFtYmxlIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfdHJ4X3ByZWFtYmxlX3NldF9kZWZhdWx0KGJjbW9sdF90cnhfcHJlYW1ibGUgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJ4X3ByZWFtYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3ByZWFtYmxlX3BhY2soY29uc3QgYmNtb2x0X3RyeF9wcmVhbWJsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X3ByZWFtYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfcHJlYW1ibGVfdW5wYWNrKGJjbW9sdF90cnhfcHJlYW1ibGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF90cnhfcHJlYW1ibGUgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3ByZWFtYmxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF90cnhfcHJlYW1ibGUgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3ByZWFtYmxlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X3ByZWFtYmxlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X3NldF9kZWZhdWx0KGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X3BhY2soY29uc3QgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfdW5wYWNrKGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9zZXRfZGVmYXVsdChiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9wYWNrKGNvbnN0IGJjbW9sdF91OF9saXN0X3UxNl9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF91OF9saXN0X3UxNl9oZXggd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF91OF9saXN0X3UxNl9oZXhfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfaGV4X3VucGFjayhiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdThfbGlzdF91MTZfaGV4IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfdThfbGlzdF91MTZfaGV4IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF91OF9saXN0X3UzMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3U4X2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF91OF9saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF91OF9saXN0X3UzMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfdThfbGlzdF91MzIgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdThfbGlzdF91MzIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX3VucGFjayhiY21vbHRfdThfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF91OF9saXN0X3UzMiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfdThfbGlzdF91MzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF91OF9saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3NldF9kZWZhdWx0KGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3BhY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3ViZF9pbmZvIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfdWJkX2luZm9fc2V0X2RlZmF1bHQoYmNtb2x0X3ViZF9pbmZvICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3ViZF9pbmZvIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdWJkX2luZm9fcGFjayhjb25zdCBiY21vbHRfdWJkX2luZm8gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3ViZF9pbmZvIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91YmRfaW5mb191bnBhY2soYmNtb2x0X3ViZF9pbmZvICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdWJkX2luZm8gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdWJkX2luZm9fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3ViZF9pbmZvIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ViZF9pbmZvX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdWJkX2luZm8gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fcGFjayhjb25zdCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbl91bnBhY2soYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF92bGFuX3RhZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3ZsYW5fdGFnX3NldF9kZWZhdWx0KGJjbW9sdF92bGFuX3RhZyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF92bGFuX3RhZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ZsYW5fdGFnX3BhY2soY29uc3QgYmNtb2x0X3ZsYW5fdGFnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF92bGFuX3RhZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90YWdfdW5wYWNrKGJjbW9sdF92bGFuX3RhZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3ZsYW5fdGFnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ZsYW5fdGFnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF92bGFuX3RhZyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF92bGFuX3RhZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3ZsYW5fdGFnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2VkX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2VkX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2VkX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZWRfc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2VkX3N0YXRlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2VkX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2VkX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X3VucGFjayhiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlX3VucGFjayhiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X3VucGFjayhiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2RlYnVnX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2RlYnVnX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2RlYnVnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZGVidWdfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX2RlYnVnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2RlYnVnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1Z19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2RlYnVnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl91bnBhY2soYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2Flc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2Flc19rZXkgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2Flc19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2Flc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hZXNfa2V5X3VucGFjayhiY21vbHRfeGdwb25fb251X2Flc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2Flc19rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2Flc19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZV91bnBhY2soYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2FsYXJtcyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9hbGFybXNfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9hbGFybXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2FsYXJtcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FsYXJtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2FsYXJtcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc191bnBhY2soYmNtb2x0X3hncG9uX29udV9hbGFybXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9hbGFybXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hbGFybXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2VxZCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9lcWRfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9lcWQgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2VxZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2VxZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2VxZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9lcWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfZXFkIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9lcWQgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9lcWQgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl91bnBhY2soYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXNfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX3VucGFjayhiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwX3VucGFjayhiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZ191bnBhY2soYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3VucGFjayhiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Z191bnBhY2soYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZ191bnBhY2soYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZ191bnBhY2soYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm5fdW5wYWNrKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm5fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb25fcGFjayhjb25zdCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl91bnBhY2soYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fdHJ4X2RlYnVnIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2RlYnVnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2RlYnVnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfZGVidWdfdW5wYWNrKGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FlX25pX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2FlX25pX2tleV9zZXRfZGVmYXVsdChiY21vbHRfYWVfbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9uaV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9rZXlfcGFjayhjb25zdCBiY21vbHRfYWVfbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2FlX25pX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9uaV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9uaV9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2tleV91bnBhY2soYmNtb2x0X2FlX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9uaV9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYWVfbmlfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9uaV9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FlX25pX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9uaV9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2FlX25pX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX25pX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2FlX25pX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYWVfbmlfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9uaV9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYWVfcGF0aF9kc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF9kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19rZXlfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfYWVfcGF0aF9kc19rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX2RzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF9kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWVfcGF0aF9kc19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX2RzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYWVfcGF0aF91c19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19rZXlfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfYWVfcGF0aF91c19rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX3VzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X3VucGFjayhiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWVfcGF0aF91c19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX3VzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfY2hhbm5lbF9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9jaGFubmVsX2tleV9zZXRfZGVmYXVsdChiY21vbHRfY2hhbm5lbF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2NoYW5uZWxfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9rZXlfcGFjayhjb25zdCBiY21vbHRfY2hhbm5lbF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfY2hhbm5lbF9rZXkgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfY2hhbm5lbF9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2NoYW5uZWxfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2NoYW5uZWxfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2tleV91bnBhY2soYmNtb2x0X2NoYW5uZWxfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2NoYW5uZWxfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfY2hhbm5lbF9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9jaGFubmVsX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9jaGFubmVsX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9jaGFubmVsX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGVidWdfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9kZWJ1Z19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGVidWdfa2V5IHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2RlYnVnX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGVidWdfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RlYnVnX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfa2V5X3VucGFjayhiY21vbHRfZGVidWdfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RlYnVnX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZWJ1Z19rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGVidWdfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RlYnVnX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGVidWdfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGVidWdfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGVidWdfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGVidWdfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZGVidWdfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGVidWdfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RlYnVnX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RlYnVnX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfdW5wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhX3VucGFjayhiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfa2V5X3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2Vfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2Vfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RldmljZV9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9yZXNldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhIHN0cnVjdC4gCisgKiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSAKKyAqIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgc3RydWN0LiAKKyAqICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhIHN0cnVjdC4gIAorICogVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSAKKyAqIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSAKKyAqIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhIAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhIAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfa2V5IHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3JwX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcnBfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3JwX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9ycF9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3JwX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3JwX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3JwX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9ycF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9ycF9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfa2V5X3VucGFjayhiY21vbHRfZXBvbl9ycF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9ycF9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9ycF9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3JwX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcnBfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcnBfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncGlvX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwaW9fa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncGlvX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bpb19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncGlvX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncGlvX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncGlvX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bpb19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bpb19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fa2V5X3VucGFjayhiY21vbHRfZ3Bpb19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bpb19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncGlvX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwaW9fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwaW9fa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncGlvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bpb19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bpb19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncGlvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bpb19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncGlvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncGlvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncGlvX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncGlvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwaW9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2FsbG9jX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9rZXkgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9rZXlfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2Zfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9uaV9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9sb3NfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgCisgKiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgdG8gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIAorICogYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2tleV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV91bnBhY2soYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2RmaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2RnaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2Vycl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhIHN0cnVjdC4gIAorICogVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xva2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xva2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgCisgKiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuIAorICogIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3BlZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIHN0cnVjdC4gIAorICogVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3BzdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3BzdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9wc3RfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3JlaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3NkaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3NkaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3NkaV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NkaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl90cnhfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl90cnhfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fdHJ4X2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl90cnhfa2V5IHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fdHJ4X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fdHJ4X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fdHJ4X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3RyeF9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX3RyeF9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fdHJ4X2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nX2VudHJ5X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2xvZ19lbnRyeV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfa2V5X3BhY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nX2VudHJ5X2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2xvZ19lbnRyeV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2tleV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nX2VudHJ5X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nX2VudHJ5X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nZ2VyX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2xvZ2dlcl9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ2dlcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfa2V5X3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nZ2VyX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dnZXJfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dnZXJfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfdW5wYWNrKGJjbW9sdF9sb2dnZXJfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2xvZ2dlcl9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xvZ2dlcl9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dnZXJfc3RhdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X25uaV9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ubmlfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X25uaV9rZXkgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbm5pX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfa2V5X3VucGFjayhiY21vbHRfbm5pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X25uaV9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X25uaV9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbm5pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X25uaV9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X25uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbm5pX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ubmlfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ubmlfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbm5pX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ubmlfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbm5pX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbm5pX3NlcmRlc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9zZXJkZXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfcGFjayhjb25zdCBiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbm5pX3NlcmRlc19rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfc2VyZGVzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX3NlcmRlc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfa2V5X3VucGFjayhiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbm5pX3NlcmRlc19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfc2VyZGVzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9zZXJkZXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zZXJkZXNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3BhY2soY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV91bnBhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X3NldF9kZWZhdWx0KGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9wYWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSAKKyAqIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgCisgKiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgCisgKiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YV91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2tleV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIAorICogVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfcGFjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25faXdmX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25faXdmX2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfcGFjayhjb25zdCBiY21vbHRfeGdwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25faXdmX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X3VucGFjayhiY21vbHRfeGdwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9rZXlfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2tleV91bnBhY2soYmNtb2x0X3hncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2xvc19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAKKyAqIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgCisgKiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Bxc2lfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zZGlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSAKKyAqIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3NmaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3N1ZmlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Rpd2lfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhIHN0cnVjdC4gIAorICogVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fdHJ4X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX3RyeF9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3RyeF9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fdHJ4X2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX3RyeF9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2tleV91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fdHJ4X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fdHJ4X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fdHJ4X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94cG9uX3NlcmRlc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94cG9uX3NlcmRlc19rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94cG9uX3NlcmRlc19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94cG9uX3NlcmRlc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV91bnBhY2soYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94cG9uX3NlcmRlc19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyogTWFwbGUgZGV2aWNlIHNlbGVjdGVkIGFzIGEgdGFyZ2V0IGZvciBDTEkgY29tbWFuZHMgKi8KK2V4dGVybiBiY21vbHRfZGV2aWQgY3VycmVudF9kZXZpY2U7CisKKy8qKiBTZXQgc3lzdGVtIG1vZGUKKyAqIFxwYXJhbVtpbl0gIGRldiAgICAgICAgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgc3lzdGVtX21vZGUgICAgU3lzdGVtIG1vZGUKKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0ssIEJDTV9FUlJfTk9UX1NVUFBPUlRFRAorICovCitiY21vc19lcnJubyBiY21vbHRfc3lzdGVtX21vZGVfc2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSk7CisKKy8qKiBHZXQgc3lzdGVtIG1vZGUKKyAqIFxwYXJhbVtpbl0gIGRldiAgICAgICAgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgc3lzdGVtX21vZGUgICAgU3lzdGVtIG1vZGUKKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0sKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N5c3RlbV9tb2RlX2dldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfc3lzdGVtX21vZGUgKnN5c3RlbV9tb2RlKTsKKworLyoqIENoZWNrcyBpZiBvYmplY3RzIHdpdGggdGhlIGdpdmVuIHRhZyBhcmUgdmFsaWQgaW4gdGhlIGdpdmVuIHN5c3RlbSBtb2RlLiAqLworYmNtb3NfYm9vbCBiY21vbHRfb2JqX3RhZ192YWxpZF9mb3Jfc3lzdGVtX21vZGUoYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlLCBiY21vbHRfb2JqX3RhZyB0YWcpOworCisvKiogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgc3VwcG9ydGVkIGluIHRoZSBnaXZlbiBzeXN0ZW0gbW9kZS4KKyAqIFxwYXJhbVtpbl0gc3lzdGVtX21vZGUgU3lzdGVtIG1vZGUKKyAqIFxwYXJhbVtpbl0gb2JqICAgICAgICAgT2JqZWN0IElECisgKiBccmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBzdXBwb3J0ZWQgaW4gdGhlIGdpdmVuIHN5c3RlbSBtb2RlLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29iamVjdF9pc19zdXBwb3J0ZWQoYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlLCBiY21vbHRfb2JqX2lkIG9iaik7CisKKy8qKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBzeXN0ZW0gbW9kZSBhcyBhIHN0cmluZy4gKi8KK2NvbnN0IGNoYXIgKmJjbW9sdF9zeXN0ZW1fbW9kZV9uYW1lKGJjbW9sdF9zeXN0ZW1fbW9kZSBtb2RlKTsKKworLyoqIFNldCB4Z3BvbiBudW0gb2Ygb251cworICogXHBhcmFtW2luXSAgZGV2ICAgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICB4Z3Bvbl9udW1fb2Zfb251cyAgICBYR1BPTiBudW0gb2Ygb251cworICogXHJldHVybnMgQkNNX0VSUl9PSywgQkNNX0VSUl9OT1RfU1VQUE9SVEVECisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251c19zZXQoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X3hncG9uX251bV9vZl9vbnVzIHhncG9uX251bV9vZl9vbnVzKTsKKworLyoqIEdldCB4Z3BvbiBudW0gb2Ygb251cworICogXHBhcmFtW2luXSAgZGV2ICAgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICB4Z3Bvbl9udW1fb2Zfb251cyAgICBYR1BPTiBudW0gb2Ygb251cworICogXHJldHVybnMgQkNNX0VSUl9PSworICovCitiY21vc19lcnJubyBiY21vbHRfeGdwb25fbnVtX29mX29udXNfZ2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyAqeGdwb25fbnVtX29mX29udXMpOworI2VuZGlmIC8qIEJDTU9MVF9NT0RFTF9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tc2dfcGFjay5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tc2dfcGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTdmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21zZ19wYWNrLmMKQEAgLTAsMCArMSwyMTQ1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpbmNsdWRlIDxiY21vbHRfYnVmLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgImJjbW9sdF9tc2dfcGFjay5oIgorCit0eXBlZGVmIHVpbnQzMl90ICgqYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgKHZvaWQgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKK3R5cGVkZWYgYmNtb3NfYm9vbCAoKmJjbW9sdF9mdW5jX3BhY2spICh2b2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKK3R5cGVkZWYgYmNtb3NfYm9vbCAoKmJjbW9sdF9mdW5jX3VucGFjaykgKHZvaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOwordHlwZWRlZiBiY21vc19ib29sICgqYmNtb2x0X2Z1bmNfbWVtX3NjYW4pIChiY21vbHRfYnVmICogYnVmLCB1aW50MzJfdCAqIGV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dyb3VwX2luZm8KK3sKKyAgICBiY21vbHRfb2JqX2lkIG9ial90eXBlOworICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXA7CisgICAgdWludDE2X3Qgc3ViZ3JvdXA7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBjb250YWluZXJfc2l6ZTsgICAgLyogc2l6ZW9mKCkgdGhlIGtleS9kYXRhIGNvbnRhaW5lciBzdHJ1Y3QgKDAgZm9yIGtleSBncm91cHMpICovCisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQ7ICAgICAgIC8qIG9mZnNldG9mKCkgZGF0YSBmaWVsZCB3aXRoaW4gY29udGFpbmVyIHN0cnVjdCAoMCBmb3Iga2V5IGdyb3VwcykgKi8KKyAgICBiY21vbHRfZnVuY19wYWNrZWRfbGVuIGdldF9wYWNrZWRfbGVuZ3RoOworICAgIGJjbW9sdF9mdW5jX3BhY2sgcGFjazsKKyAgICBiY21vbHRfZnVuY191bnBhY2sgdW5wYWNrOworICAgIGJjbW9sdF9mdW5jX21lbV9zY2FuIG1lbV9zY2FuOworfSBiY21vbHRfZ3JvdXBfaW5mbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncm91cF9pZHMKK3sKKyAgICB1aW50MzJfdCBzdWJncm91cF9jb3VudDsKKyAgICBiY21vbHRfZ3JvdXBfaWQgKnN1Ymdyb3VwX2lkczsKK30gYmNtb2x0X2dyb3VwX2lkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9pbnN0YW5jZV9pbmZvCit7CisgICAgaW50OF90IG9mZnNldDsKKyAgICBpbnQ4X3Qgc2l6ZTsKK30gYmNtb2x0X2luc3RhbmNlX2luZm87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9uaV9rZXkgPSB7IEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2FlX25pX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfYWVfbmlfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX25pX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfYWVfbmlfa2V5X3VucGFjaywgYmNtb2x0X2FlX25pX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9uaV9jZmcgPSB7IEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9uaV9jZmcpLCBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlID0geyBCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZSksIG9mZnNldG9mKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV91bnBhY2ssIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9wYXRoX2RzX2tleSA9IHsgQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfYWVfcGF0aF9kc19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfYWVfcGF0aF9kc19rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X3VucGFjaywgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IEJDTU9MVF9PQkpfSURfQUVfUEFUSF9EUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9wYXRoX2RzX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfcGF0aF91c19rZXkgPSB7IEJDTU9MVF9PQkpfSURfQUVfUEFUSF9VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfYWVfcGF0aF91c19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9wYXRoX3VzX2tleV91bnBhY2ssIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfQUVfUEFUSF9VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXQpLCBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfdW5wYWNrLCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMCwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCksIG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfcGF0aF91c19hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2NoYW5uZWxfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2NoYW5uZWxfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9jaGFubmVsX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9jaGFubmVsX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfY2hhbm5lbF9rZXlfdW5wYWNrLCBiY21vbHRfY2hhbm5lbF9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fY2hhbm5lbF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfQ0hBTk5FTCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfY2hhbm5lbF9jZmcpLCBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RlYnVnX2tleSA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZGVidWdfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZWJ1Z19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGVidWdfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZWJ1Z19rZXlfdW5wYWNrLCBiY21vbHRfZGVidWdfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RlYnVnX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2RlYnVnX2NmZyksIG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZWJ1Z19jbGlfb3V0cHV0ID0geyBCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0KSwgb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV91bnBhY2ssIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZGVidWdfZmlsZV9hbG1vc3RfZnVsbCA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZWJ1Z19hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZGVidWdfY2xpX2lucHV0ID0geyBCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2RlYnVnX2NsaV9pbnB1dCksIG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV91bnBhY2ssIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZSA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZSA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAyLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlID0geyBCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDMsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9rZXkgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2Vfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9rZXlfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUpLCBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyLCBzaXplb2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZSksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZSA9IHsgQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMywgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSA9IHsgQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNCwgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX3VucGFjaywgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9kZXZpY2VfcmVhZHkgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDUsIHNpemVvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5KSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDYsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSA9IHsgQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNywgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA4LCBzaXplb2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2Vfc3dfZXJyb3IgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDksIHNpemVvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9zd19lcnJvciksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3IsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2Vfc3dfZXhjZXB0aW9uID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMCwgc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9zd19leGNlcHRpb24pLCBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZGV2aWNlX2Nvbm5lY3QgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9kaXNjb25uZWN0ID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfaG9zdF9rZWVwX2FsaXZlID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAyLCBzaXplb2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZSksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAzLCBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnQgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDQsIHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfcmVzZXQgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDUsIHNpemVvZihiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9yZXNldCksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcmVzZXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfcnVuX2Rkcl90ZXN0ID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA2LCBzaXplb2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdCksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA3LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX2tleSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X3VucGFjaywgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb24gPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb24pLCBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uID0geyBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uID0geyBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbiksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMsIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24sIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb24gPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA0LCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDUsIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb24pLCBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb24sIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDYsIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24sIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA3LCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uID0geyBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgOCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDksIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX2tleSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbGlua19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX2tleV91bnBhY2ssIGJjbW9sdF9lcG9uX2xpbmtfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMywgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA0LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfbGlua19kZWxldGVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA1LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNiwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA3LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA4LCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgOSwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEwLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTMsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE0LCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTUsIHNpemVvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTYsIHNpemVvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmUgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE3LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxOCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE5LCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfZGVsZXRlX2xpbmsgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMSwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3AgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDMsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA0LCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA1LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNiwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX2luamVjdF9mcmFtZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIDAsIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9uaV9rZXlfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMCwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIsIHNpemVvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9ub19yZXBvcnRzID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNCwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0cywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA1LCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSksIG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNywgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA4LCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDksIHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX25pX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9hZGRfbGluayA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmssIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmsgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmspLCBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAzLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNCwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2NhbiksIG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2NhbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDYsIHNpemVvZihiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDcsIHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX2tleSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX29udV8xMGdfdXNfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX2tleSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfdW5wYWNrLCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyksIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX29udV8xZ191c19zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19rZXkgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZyksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX2tleSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcnBfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcnBfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3JwX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3JwX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9ycF9rZXlfdW5wYWNrLCBiY21vbHRfZXBvbl9ycF9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9ycF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9ycF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwaW9fa2V5ID0geyBCQ01PTFRfT0JKX0lEX0dQSU8sIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2dwaW9fa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncGlvX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncGlvX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bpb19rZXlfdW5wYWNrLCBiY21vbHRfZ3Bpb19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bpb19jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bpb19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bpb19jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bpb19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bpb19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bpb19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncGlvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fYWxsb2Nfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfdW5wYWNrLCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fYWxsb2Nfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2FsbG9jX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMsIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fYWxsb2NfZ2V0X3N0YXRzID0geyBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0cyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0cywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19zZXRfc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2dlbV9wb3J0X2tleSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X3VucGFjaywgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2dlbV9wb3J0X3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIsIHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlID0geyBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2Zfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMywgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX2ZsdXNoX21hY190YWJsZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAwLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGUpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGUgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfdW5wYWNrLCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl91c19mbG93X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9rZXkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDQsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfbG9zID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2xvc19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2xvcyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2xvcywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDYsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDcsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDgsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDksIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEwLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDExLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTMsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxNCwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE1LCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTYsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTcsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE4LCBzaXplb2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3Jlc2V0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMywgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93KSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfc2V0X29udV9zdGF0ZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDQsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3NldF9wb25fc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA1LCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDcsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV90b2RfcmVxdWVzdCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDgsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9jcHVfcGFja2V0cyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCAxLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0cyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2tleSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfZGZpID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2RmaSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZmksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9kZ2kgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZGdpKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2RnaSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2Rvd2kgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMywgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2Rvd2kpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZG93aSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9lcnIgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZXJyKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2VyciwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDYsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNywgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgOCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA5LCBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEwLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfbG9haSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMiwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2xvYWkpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbG9haSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9sb2tpID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEzLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfbG9raSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9sb2tpLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X21lbWkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTQsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9tZW1pKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X21lbWksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE1LCBzaXplb2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE2LCBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTcsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X29udV9hbGFybSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxOCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hbGFybSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE5LCBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIyLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjMsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9wZWUgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjQsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3BlZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wZWUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9wb3NzaWJsZV9kcmlmdCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyNSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjYsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X3BzdCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyNywgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcHN0KSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3BzdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDI4LCBzaXplb2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9yZWkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3JlaSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yZWksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfc2RpID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMxLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3NkaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZGkpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2RpLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfc2ZpID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMyLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3NmaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZmkpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2ZpLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMzLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMzQsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X3N1ZmkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMzUsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdWZpKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N1ZmksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfdGl3aSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzNiwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3Rpd2kpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdGl3aSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWwsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9yc3NpX21lYXN1cmVtZW50ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDEsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X3NldF9vbnVfc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9jcHVfcGFja2V0cyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfcGxvYW1fcGFja2V0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCAxLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfY3B1X3BhY2tldCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9vbWNpX3BhY2tldCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCwgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl90cnhfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fdHJ4X2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX3RyeF9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fdHJ4X2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX3RyeF9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl90cnhfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl90cnhfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2xvZ19lbnRyeV9rZXkgPSB7IEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dfZW50cnlfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ19lbnRyeV9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2xvZ19lbnRyeV9rZXlfdW5wYWNrLCBiY21vbHRfbG9nX2VudHJ5X2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dfZW50cnlfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbG9nX2VudHJ5X3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSksIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXQpLCBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2xvZ19lbnRyeV9zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZCksIG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZCA9IHsgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2xvZ19lbnRyeV9hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dnZXJfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbG9nZ2VyX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9sb2dnZXJfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dnZXJfa2V5X3VucGFjaywgYmNtb2x0X2xvZ2dlcl9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbG9nZ2VyX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfbG9nZ2VyX2NmZyksIG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2xvZ2dlcl9zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfdW5wYWNrLCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dnZXJfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMCwgc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dnZXJfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbG9nZ2VyX2NsZWFyX2xvZyA9IHsgQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMCwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX2tleSA9IHsgQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X25uaV9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X25uaV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbm5pX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX2tleV91bnBhY2ssIGJjbW9sdF9ubmlfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX25uaV9jZmcgPSB7IEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X25uaV9jZmcpLCBvZmZzZXRvZihiY21vbHRfbm5pX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbm5pX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X25uaV9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X25uaV9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ubmlfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbm5pX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ubmlfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ubmlfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X25uaV9zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfbm5pX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX25uaV9zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX3N0YXR1c19jaGFuZ2VkID0geyBCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyLCBzaXplb2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWQpLCBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfbm5pX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X25uaV9hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX25uaV9zZXJkZXNfa2V5ID0geyBCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX3NlcmRlc19rZXlfdW5wYWNrLCBiY21vbHRfbm5pX3NlcmRlc19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX3NlcmRlc19jZmcgPSB7IEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19jZmcpLCBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3NvZnR3YXJlX2Vycm9yX2tleSA9IHsgQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfdW5wYWNrLCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3NvZnR3YXJlX2Vycm9yX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZyksIG9mZnNldG9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb190cnhfY2FsaWJyYXRpb25fa2V5ID0geyBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X3VucGFjaywgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdyA9IHsgQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMCwgc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSksIHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93KSwgb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3VucGFjaywgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93ID0geyBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEpLCBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93KSwgb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfdW5wYWNrLCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19rZXkgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X3VucGFjaywgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19jZmcgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fYWxsb2Nfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX2FsbG9jX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIsIHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fYWxsb2NfZ2V0X3N0YXRzID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0cyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHMsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19zZXRfc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X2tleSA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfdW5wYWNrLCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9nZW1fcG9ydF9zdGF0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX2l3Zl9rZXkgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2l3Zl9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2l3Zl9rZXlfdW5wYWNrLCBiY21vbHRfeGdwb25faXdmX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9pd2ZfY2ZnID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2l3Zl9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfa2V5ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX25pX2tleV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfY2ZnID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDQsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX2xvcyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA1LCBzaXplb2YoYmNtb2x0X3hncG9uX25pX2xvc19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9sb3MpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfbG9zLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfb251X2Rpc2NvdmVyZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNywgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgOCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgOSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTAsIHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTEsIHNpemVvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEyLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEzLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxNCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE1LCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTYsIHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTcsIHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE4LCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGgpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCBzaXplb2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcmVzZXQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAzLCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA0LCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXApLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfc2V0X29udV9zdGF0ZSA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA1LCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3NldF9wb25fc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDcsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDgsIHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3RvZF9yZXF1ZXN0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDksIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIDAsIHNpemVvZihiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfY3B1X3BhY2tldHMgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIDEsIHNpemVvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHMpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHMsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9rZXkgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9rZXlfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfY2ZnID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfZGZpID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X2RmaSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZGZpLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9kZ2kgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfeGdwb25fb251X2RnaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZGdpKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kZ2ksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X2Rvd2kgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIsIHNpemVvZihiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X2Rvd2kpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2Rvd2ksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA1LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA3LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfbG9vY2kgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDgsIHNpemVvZihiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9sb29jaSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2ksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA5LCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vbnVfYWxhcm0gPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEwLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9hbGFybSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTEsIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEzLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxNCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE1LCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb24gPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE2LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE3LCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTgsIHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTksIHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9wcXNpID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyMiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9yZWdpc3RyYXRpb25faWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIzLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjQsIHNpemVvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc2RpID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyNSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZGkpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NkaSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyNiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc2ZpID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyNywgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZmkpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NmaSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyOCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDI5LCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3N1ZmkgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMwLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdWZpKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdWZpLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfdGl3aSA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMzEsIHNpemVvZihiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3Rpd2kpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Rpd2ksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV90dW5pbmdfcmVzcG9uc2UgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMyLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGggPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X2dldF9wb3dlcl9sZXZlbCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMywgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X29udV90dW5pbmdfaW4gPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDQsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vbnVfdHVuaW5nX291dCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA3LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgOCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3NldF9vbnVfc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDksIHNpemVvZihiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9jcHVfcGFja2V0cyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0cyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHMsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcGxvYW1fcGFja2V0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfY3B1X3BhY2tldCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vbWNpX3BhY2tldCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgsIDEsIHNpemVvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl90cnhfa2V5ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fdHJ4X2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3VucGFjaywgYmNtb2x0X3hncG9uX3RyeF9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fdHJ4X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hwb25fc2VyZGVzX2tleSA9IHsgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfeHBvbl9zZXJkZXNfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfdW5wYWNrLCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hwb25fc2VyZGVzX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZyksIG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gKmdyb3VwX2luZm9bXSA9Cit7CisgICAgJmdyb3VwX2luZm9fYWVfbmlfa2V5LAorICAgICZncm91cF9pbmZvX2FlX25pX2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGUsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19rZXksCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0LAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19rZXksCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0LAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fY2hhbm5lbF9rZXksCisgICAgJmdyb3VwX2luZm9fY2hhbm5lbF9jZmcsCisgICAgJmdyb3VwX2luZm9fZGVidWdfa2V5LAorICAgICZncm91cF9pbmZvX2RlYnVnX2NmZywKKyAgICAmZ3JvdXBfaW5mb19kZWJ1Z19jbGlfb3V0cHV0LAorICAgICZncm91cF9pbmZvX2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGwsCisgICAgJmdyb3VwX2luZm9fZGVidWdfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZGVidWdfY2xpX2lucHV0LAorICAgICZncm91cF9pbmZvX2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlLAorICAgICZncm91cF9pbmZvX2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlLAorICAgICZncm91cF9pbmZvX2RlYnVnX3N0b3BfYXBpX2NhcHR1cmUsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX2tleSwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfY2ZnLAorICAgICZncm91cF9pbmZvX2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlLAorICAgICZncm91cF9pbmZvX2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkLAorICAgICZncm91cF9pbmZvX2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmUsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlLAorICAgICZncm91cF9pbmZvX2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfZGV2aWNlX3JlYWR5LAorICAgICZncm91cF9pbmZvX2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlLAorICAgICZncm91cF9pbmZvX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZCwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2Vfc3dfZXJyb3IsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX3N3X2V4Y2VwdGlvbiwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX2Nvbm5lY3QsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX2Rpc2Nvbm5lY3QsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZSwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YSwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnQsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX3Jlc2V0LAorICAgICZncm91cF9pbmZvX2RldmljZV9ydW5fZGRyX3Rlc3QsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGUsCisgICAgJmdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLAorICAgICZncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbiwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uLAorICAgICZncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uLAorICAgICZncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uLAorICAgICZncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uLAorICAgICZncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0LAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2xpbmtfZGVsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19hdXRvX2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfZGVsZXRlX2xpbmssCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5LAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0LAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3AsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb24sCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2luamVjdF9mcmFtZSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX25pX2xsaWRfcXVhcmFudGluZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfbm9fcmVwb3J0cywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX25pX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfYWRkX2xpbmssCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmssCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX29udV8xMGdfdXNfa2V5LAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX29udV8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19hdXRvX2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX29udV8xZ191c19rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX3N0YXQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfa2V5LAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0LAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX2tleSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0LAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfa2V5LAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9ycF9rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9ycF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bpb19rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bpb19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19zdGF0LAorICAgICZncm91cF9pbmZvX2dwb25fYWxsb2Nfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2FsbG9jX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fYWxsb2NfZ2V0X3N0YXRzLAorICAgICZncm91cF9pbmZvX2dwb25fYWxsb2Nfc2V0X3N0YXRlLAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfa2V5LAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX2tleSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2Zfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX3NjYW5fbWFjX3RhYmxlLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hYywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfdXNfZmxvd19rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfdXNfZmxvd19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0LAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9sb3MsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9yZXNldCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3csCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zZXRfb251X3N0YXRlLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc2V0X3Bvbl9zdGF0ZSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3RvZF9yZXF1ZXN0LAorICAgICZncm91cF9pbmZvX2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX2NwdV9wYWNrZXRzLAorICAgICZncm91cF9pbmZvX2dwb25fb251X2tleSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfZGZpLAorICAgICZncm91cF9pbmZvX2dwb25fb251X2RnaSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9kb3dpLAorICAgICZncm91cF9pbmZvX2dwb25fb251X2VyciwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0LAorICAgICZncm91cF9pbmZvX2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9sb2FpLAorICAgICZncm91cF9pbmZvX2dwb25fb251X2xva2ksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfbWVtaSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX2dwb25fb251X29udV9hbGFybSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uLAorICAgICZncm91cF9pbmZvX2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9wZWUsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfcHN0LAorICAgICZncm91cF9pbmZvX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX2dwb25fb251X3JlaSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zZGksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfc2ZpLAorICAgICZncm91cF9pbmZvX2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdWZpLAorICAgICZncm91cF9pbmZvX2dwb25fb251X3Rpd2ksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsLAorICAgICZncm91cF9pbmZvX2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9jcHVfcGFja2V0cywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9wbG9hbV9wYWNrZXQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfY3B1X3BhY2tldCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9vbWNpX3BhY2tldCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX3RyeF9rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl90cnhfY2ZnLAorICAgICZncm91cF9pbmZvX2xvZ19lbnRyeV9rZXksCisgICAgJmdyb3VwX2luZm9fbG9nX2VudHJ5X2NmZywKKyAgICAmZ3JvdXBfaW5mb19sb2dfZW50cnlfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19sb2dfZW50cnlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbG9nX2VudHJ5X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2xvZ19lbnRyeV9hdXRvX2NmZywKKyAgICAmZ3JvdXBfaW5mb19sb2dnZXJfa2V5LAorICAgICZncm91cF9pbmZvX2xvZ2dlcl9jZmcsCisgICAgJmdyb3VwX2luZm9fbG9nZ2VyX3N0YXQsCisgICAgJmdyb3VwX2luZm9fbG9nZ2VyX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2xvZ2dlcl9hdXRvX2NmZywKKyAgICAmZ3JvdXBfaW5mb19sb2dnZXJfY2xlYXJfbG9nLAorICAgICZncm91cF9pbmZvX25uaV9rZXksCisgICAgJmdyb3VwX2luZm9fbm5pX2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9hbGFybV9jbGVhcmVkLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdHVzX2NoYW5nZWQsCisgICAgJmdyb3VwX2luZm9fbm5pX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zZXJkZXNfa2V5LAorICAgICZncm91cF9pbmZvX25uaV9zZXJkZXNfY2ZnLAorICAgICZncm91cF9pbmZvX3NvZnR3YXJlX2Vycm9yX2tleSwKKyAgICAmZ3JvdXBfaW5mb19zb2Z0d2FyZV9lcnJvcl9jZmcsCisgICAgJmdyb3VwX2luZm9fdHJ4X2NhbGlicmF0aW9uX2tleSwKKyAgICAmZ3JvdXBfaW5mb190cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdywKKyAgICAmZ3JvdXBfaW5mb190cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19rZXksCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2NfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX2FsbG9jX3N0YXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2Nfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2NfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2NfZ2V0X3N0YXRzLAorICAgICZncm91cF9pbmZvX3hncG9uX2FsbG9jX3NldF9zdGF0ZSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9nZW1fcG9ydF9rZXksCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X3N0YXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkLAorICAgICZncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX2l3Zl9rZXksCisgICAgJmdyb3VwX2luZm9feGdwb25faXdmX2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9rZXksCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3N0YXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9sb3MsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfb251X2Rpc2NvdmVyZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGgsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3Jlc2V0LAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3csCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3NldF9vbnVfc3RhdGUsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3RvZF9yZXF1ZXN0LAorICAgICZncm91cF9pbmZvX3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfY3B1X3BhY2tldHMsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X2tleSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X2RmaSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfZGdpLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9kb3dpLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X2xvb2NpLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X29udV9hbGFybSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbiwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcHFzaSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3NkaSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zZmksCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N1ZmksCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3Rpd2ksCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3R1bmluZ19yZXNwb25zZSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb24sCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X2dldF9wb3dlcl9sZXZlbCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X3R1bmluZ19pbiwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X3R1bmluZ19vdXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zZXRfb251X3N0YXRlLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9jcHVfcGFja2V0cywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcGxvYW1fcGFja2V0LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9jcHVfcGFja2V0LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9vbWNpX3BhY2tldCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl90cnhfa2V5LAorICAgICZncm91cF9pbmZvX3hncG9uX3RyeF9jZmcsCisgICAgJmdyb3VwX2luZm9feHBvbl9zZXJkZXNfa2V5LAorICAgICZncm91cF9pbmZvX3hwb25fc2VyZGVzX2NmZworfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2FlX25pX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfTklfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19hZV9uaV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0FFX05JX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfYWVfbmlfb3BlcltdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19hZV9wYXRoX2RzX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2FlX3BhdGhfZHNfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19hZV9wYXRoX2RzX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU182NCwgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTXzEyOF8yNTUsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18yNTZfNTExLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19GUkFNRVNfNTEyXzEwMjMsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xMDI0XzE1MTgsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xNTE5XzIwNDcsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18yMDQ4XzQwOTUsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU180MDk2XzkyMTYsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU185MjE3XzE2MzgzLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19CUk9BRENBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19EQVRBX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19NVUxUSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19VTklDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfQUJPUlRfRlJBTUVTIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19hZV9wYXRoX2RzX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVELCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfYWVfcGF0aF9kc19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfYWVfcGF0aF91c19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19hZV9wYXRoX3VzX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfYWVfcGF0aF91c19zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19CWVRFUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfNjQsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0ZSQU1FU182NV8xMjcsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSwgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3LCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMjA0OF80MDk1LCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfREFUQV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfTVVMVElDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0FCT1JUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRkNTX0VSUk9SLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19PVkVSU0laRV9FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfUlVOVF9FUlJPUiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfYWVfcGF0aF91c19hdXRvW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2FlX3BhdGhfdXNfYXV0b19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2NoYW5uZWxfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9DSEFOTkVMX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfY2hhbm5lbF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0NIQU5ORUxfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZWJ1Z19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0RFQlVHX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZGVidWdfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9ERUJVR19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2RlYnVnX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0RFQlVHX0NMSV9PVVRQVVQsIEJDTU9MVF9HUk9VUF9JRF9ERUJVR19GSUxFX0FMTU9TVF9GVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZWJ1Z19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfREVCVUdfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2RlYnVnX29wZXJbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0RFQlVHX0NMSV9JTlBVVCwgQkNNT0xUX0dST1VQX0lEX0RFQlVHX1JFU0VUX0FQSV9DQVBUVVJFLCBCQ01PTFRfR1JPVVBfSURfREVCVUdfU1RBUlRfQVBJX0NBUFRVUkUsIEJDTU9MVF9HUk9VUF9JRF9ERUJVR19TVE9QX0FQSV9DQVBUVVJFIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZXZpY2Vfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZXZpY2VfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZXZpY2VfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0NPTk5FQ1RJT05fQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfRERSX1RFU1RfQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfREVWSUNFX1JFQURZLCBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRCwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9TV19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9TV19FWENFUFRJT04gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2RldmljZV9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZXZpY2Vfb3BlcltdID0geyBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0NPTk5FQ1QsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfRElTQ09OTkVDVCwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9IT1NUX0tFRVBfQUxJVkUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQSwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVCwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9SRVNFVCwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9SVU5fRERSX1RFU1QsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfU1dfVVBHUkFERV9BQ1RJVkFURSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9kZW5pZWRfbGlua19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX2RlbmllZF9saW5rX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fZGVuaWVkX2xpbmtfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT04sIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT04sIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTiwgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTiwgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTiwgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9saW5rX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9saW5rX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9saW5rX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX2xpbmtfc3RhdF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9EQVRBX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0RBVEFfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU182NCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfNjVfMTI3LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU18yNTZfNTExLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU181MTJfMTAyMywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xNTE5XzIwNDcsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfRlJBTUVTXzIwNDhfNDA5NSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU185MjE3XzE2MzgzLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX09BTV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9PQU1fRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX01QQ1BfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0JST0FEQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfVU5JQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfTVVMVElDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9SRVBPUlRfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZDU19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9PVkVSU0laRV9FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9SVU5UX0VSUk9SLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0xJTkVfQ09ERV9FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9MSU5FX0NPREVfRVJST1JfTUFYLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0RBVEFfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfREFUQV9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzY0LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU182NV8xMjcsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzEyOF8yNTUsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzI1Nl81MTEsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzUxMl8xMDIzLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU18xMDI0XzE1MTgsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzE1MTlfMjA0NywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9GUkFNRVNfMjA0OF80MDk1LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU180MDk2XzkyMTYsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzkyMTdfMTYzODMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfT0FNX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX09BTV9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfTVBDUF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfQlJPQURDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9VTklDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9NVUxUSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0dBVEVTIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX2xpbmtfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNULCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0VOQ1JZUFRJT05fRU5BQkxFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19LRVlfRVhDSEFOR0VfRkFJTFVSRSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RPUFBFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19MSU5LX0RFTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19NUENQX0RFUkVHSVNURVJFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19NUENQX0RJU0NPVkVSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfTVBDUF9SRUdfQUNLX1RJTUVPVVQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVELCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19SRVJBTkdFX0ZBSUxVUkUsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVELCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQUxBUk1fUkFJU0VELCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9saW5rX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fbGlua19vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfREVMRVRFX0xJTkssIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfRk9SQ0VfUkVESVNDT1ZFUlksIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUQVJULCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT04gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fbGlua19wcm94eVtdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9saW5rX3Byb3h5X3J4W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fbmlfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9uaV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX25pX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQVVUT19ST0dVRV9TQ0FOXzEwR19GQUlMVVJFLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfTExJRF9RVUFSQU5USU5FRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfTk9fUkVQT1JUUywgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1JFUkFOR0VfRkFJTFVSRSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfUk9HVUVfU0NBTl9DT01QTEVURSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fbmlfYXV0b19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fbmlfb3BlcltdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9BRERfTElOSywgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOSywgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREUgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfRkVDX0NPREVfV09SRFNfVE9UQUwsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfRkVDX0NPREVfV09SRFNfREVDT0RFX0ZBSUxTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0ZFQ19aRVJPRVNfQ09SUkVDVEVELCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0ZFQ19PTkVTX0NPUlJFQ1RFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9vbnVfMTBnX3VzX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX29udV8xZ191c19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9vbnVfMWdfdXNfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzFnX3VzX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19HT09EX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0dPT0RfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19PVkVSU1pfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfTk9OX0ZFQ19HT09EX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX05PTl9GRUNfR09PRF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19HT09EX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19HT09EX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfRkVDX0ZSQU1FU19FWENfRVJSUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19CTEtTX05PX0VSUlMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19GRUNfQkxLU19DT1JSX0VSUlMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19GRUNfQkxLU19VTkNPUlJfRVJSUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19DT1JSX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfRkVDX0NPUlJfWkVST0VTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfRkVDX0NPUlJfT05FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX1VOREVSU1pfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfRVJST1JTWl9GUkFNRVMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzFnX3VzX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX29udV8xZ191c19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfZHNfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ19kc19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX2RzX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfNjQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FU182NV8xMjcsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMjA0OF80MDk1LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfREFUQV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfTVVMVElDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX09BTV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfT0FNX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfR0FURV9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX01QQ1BfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19BQk9SVF9GUkFNRVMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfZHNfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fUkFJU0VEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX3VzX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfdXNfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ191c19zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzY0LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVNfNjVfMTI3LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVNfMTI4XzI1NSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzI1Nl81MTEsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FU181MTJfMTAyMywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzEwMjRfMTUxOCwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzE1MTlfMjA0NywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzQwOTZfOTIxNiwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzkyMTdfMTYzODMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0JST0FEQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0RBVEFfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX01VTFRJQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX1VOSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19NUENQX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfT0FNX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19PQU1fRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19SRVBPUlRfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19BQk9SVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZDU19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfQ1JDXzhfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX09VVF9PRl9TTE9ULCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19PVkVSU0laRV9FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfUlVOVF9FUlJPUiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ191c19hdXRvW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ19kc19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ19kc19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ19kc19zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU182NCwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19GUkFNRVNfNjVfMTI3LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18yNTZfNTExLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU181MTJfMTAyMywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xNTE5XzIwNDcsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU185MjE3XzE2MzgzLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0JST0FEQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfREFUQV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19NVUxUSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX1VOSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX09BTV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19PQU1fRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0dBVEVfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX01QQ1BfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0FCT1JUX0ZSQU1FUyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX2RzX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfdXNfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfdXNfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfdXNfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfNjQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfMTI4XzI1NSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfNTEyXzEwMjMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzEwMjRfMTUxOCwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FU18yMDQ4XzQwOTUsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzQwOTZfOTIxNiwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19CUk9BRENBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0RBVEFfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfTVVMVElDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19VTklDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19NUENQX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19PQU1fQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfT0FNX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19SRVBPUlRfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0FCT1JUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GQ1NfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfQ1JDXzhfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfT1VUX09GX1NMT1QsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfT1ZFUlNJWkVfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfUlVOVF9FUlJPUiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX3VzX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3JwX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9SUF9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcnBfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1JQX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bpb19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQSU9fS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncGlvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BJT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fYWxsb2Nfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9hbGxvY19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2FsbG9jX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9hbGxvY19zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19TVEFUX0NGR19SWF9CWVRFUyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9hbGxvY19hdXRvW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2FsbG9jX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2FsbG9jX29wZXJbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfR0VUX1NUQVRTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19TRVRfU1RBVEUgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fZ2VtX3BvcnRfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19SWF9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19SWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfVFhfUEFDS0VUUywgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfVFhfQllURVMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fZ2VtX3BvcnRfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9pd2Zfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2l3Zl9zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9TVEFUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2l3Zl9zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfSElUX0VWRU5ULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfTUlTU19FVkVOVCwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQ0ZHX0RTX0RST1BfRFVFX1RPX01JU1NfRVZFTlQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9TVEFUX0NGR19EU19EUk9QX0RVRV9UT19ISVRfRVZFTlQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9TVEFUX0NGR19EU19EUk9QX1RPX0RJU0FCTEVEX0dFTSwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQ0ZHX05FV19NQUNfRElTQ09WRVJFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQ0ZHX01PVkVfRVZFTlQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9TVEFUX0NGR19ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9pd2ZfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2l3Zl9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX29wZXJbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRSwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX21hY190YWJsZV9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX01BQ19UQUJMRV9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX21hY190YWJsZV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX01BQ19UQUJMRV9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX21hY190YWJsZV9hdXRvW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0FHRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX3VzX2Zsb3dfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9VU19GTE9XX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX25pX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fbmlfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9uaV9zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fbmlfc3RhdF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfRkVDX0NPREVXT1JEUywgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfQklQOF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfQklQOF9FUlJPUlMsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0dFTV9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9HRU1fRFJPUFBFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfR0VNX0lETEUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0dFTV9DT1JSRUNURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0dFTV9JTExFR0FMLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9BTExPQ0FUSU9OU19WQUxJRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNUywgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfUExPQU1TX05PTl9JRExFLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9QTE9BTVNfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19EUk9QUEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9DUFUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0ksIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0RST1BQRURfVE9PX1NIT1JULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9EUk9QUEVEX1RPT19MT05HLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9DUkNfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9LRVlfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9GUkFHTUVOVFNfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9QQUNLRVRTX0RST1BQRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX0dFTSwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfUExPQU1TLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19UWF9HRU1fRlJBR01FTlRTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19UWF9DUFUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX09NQ0ksIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfRFJPUFBFRF9UUElEX01JU1MsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfVklEX01JU1MgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fbmlfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfTE9TLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9PTlVfRElTQ09WRVJFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9uaV9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9uaV9vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUiwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1JFU0VULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TRVRfT05VX1NUQVRFLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TRVRfUE9OX1NUQVRFLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERSwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfVE9EX1JFUVVFU1QgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fbmlfcHJveHlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfQ1BVX1BBQ0tFVFMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fb251X2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX29udV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9vbnVfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9vbnVfc3RhdF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX0ZFQ19DT0RFV09SRFMsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19GRUNfQllURVNfQ09SUkVDVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPREVXT1JEU19DT1JSRUNURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfQklQOF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX0JJUDhfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfUExPQU1TX0NSQ19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1JYX1BMT0FNU19OT05fSURMRSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1BPU0lUSVZFX0RSSUZULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfTkVHQVRJVkVfRFJJRlQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19SWF9PTUNJLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX0JFUl9SRVBPUlRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1VOUkVDRUlWRURfQlVSU1QsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19MQ0RHX0VSUk9SUywgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1JESV9FUlJPUlMsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19SWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1JYX1BBQ0tFVFMsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19UWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1RYX1BBQ0tFVFMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fb251X2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RGSSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RHSSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RPV0ksIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9FUlIsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENILCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0xPQUksIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9MT0tJLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfTUVNSSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT05VX0FMQVJNLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09QVElDQUxfUkVGTEVDVElPTiwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1BFRSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1BPU1NJQkxFX0RSSUZULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9QU1QsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1JFSSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU0RJLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU0ZJLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVUZJLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfVElXSSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9vbnVfYXV0b19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX29udV9vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUwsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5ULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU0VUX09OVV9TVEFURSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9vbnVfcHJveHlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0NQVV9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfUExPQU1fUEFDS0VUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX29udV9wcm94eV9yeFtdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfQ1BVX1BBQ0tFVCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09NQ0lfUEFDS0VUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX3RyeF9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fVFJYX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl90cnhfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX1RSWF9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ19lbnRyeV9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ19lbnRyeV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ19lbnRyeV9zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dfRU5UUllfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfbG9nX2VudHJ5X3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dfRU5UUllfU1RBVF9DRkdfTVNHX0NPVU5ULCBCQ01PTFRfR1JPVVBfSURfTE9HX0VOVFJZX1NUQVRfQ0ZHX0xPU1RfTVNHX0NPVU5UIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19sb2dfZW50cnlfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfTE9HX0VOVFJZX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfbG9nX2VudHJ5X2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dfRU5UUllfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ2dlcl9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ2dlcl9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ2dlcl9zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfbG9nZ2VyX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfU1RBVF9DRkdfTElORVNfSU5fTE9HIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19sb2dnZXJfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfbG9nZ2VyX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ2dlcl9vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfQ0xFQVJfTE9HIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ubmlfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9OTklfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ubmlfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9OTklfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ubmlfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX25uaV9zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU182NCwgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfNjVfMTI3LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU18yNTZfNTExLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU181MTJfMTAyMywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xNTE5XzIwNDcsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRlJBTUVTXzIwNDhfNDA5NSwgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU185MjE3XzE2MzgzLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9HT09EX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9VTklDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9NVUxUSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0JST0FEQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRkNTX0VSUk9SUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9DT05UUk9MX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9QQVVTRV9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfUEZDX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9VTlNVUFBPUlRFRF9PUENPREUsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfVU5TVVBQT1JURURfREEsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfQUxJR05NRU5UX0VSUk9SUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9MRU5HVEhfT1VUX09GX1JBTkdFLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0NPREVfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX09WRVJTSVpFRF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfSkFCQkVSX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9NVFVfQ0hFQ0tfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX1BST01JU0NVT1VTX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9WTEFOX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9ET1VCTEVfVkxBTl9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfVFJVTkNBVEVEX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9VTkRFUlNJWkVfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQUdNRU5URURfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX1JVTlRfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU182NCwgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfNjVfMTI3LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU18yNTZfNTExLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU181MTJfMTAyMywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU18xNTE5XzIwNDcsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRlJBTUVTXzIwNDhfNDA5NSwgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU185MjE3XzE2MzgzLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9HT09EX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9VTklDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9NVUxUSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0JST0FEQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfUEFVU0VfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX1BGQ19GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfSkFCQkVSX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GQ1NfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0NPTlRST0xfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX09WRVJTSVpFX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFHTUVOVEVEX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9FUlJPUl9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfVkxBTl9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRE9VQkxFX1ZMQU5fRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX1JVTlRfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX1VOREVSUlVOX0ZSQU1FUyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfbm5pX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9BTEFSTV9SQUlTRUQsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVFVTX0NIQU5HRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX25uaV9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfTk5JX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ubmlfc2VyZGVzX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfTk5JX1NFUkRFU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX25uaV9zZXJkZXNfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9OTklfU0VSREVTX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfc29mdHdhcmVfZXJyb3Jfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9TT0ZUV0FSRV9FUlJPUl9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3NvZnR3YXJlX2Vycm9yX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfU09GVFdBUkVfRVJST1JfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc190cnhfY2FsaWJyYXRpb25fa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9UUlhfQ0FMSUJSQVRJT05fS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc190cnhfY2FsaWJyYXRpb25fYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc190cnhfY2FsaWJyYXRpb25fYXV0b19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1RSWF9DQUxJQlJBVElPTl9BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfdHJ4X2NhbGlicmF0aW9uX29wZXJbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPVywgQkNNT0xUX0dST1VQX0lEX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9hbGxvY19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fYWxsb2NfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2FsbG9jX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2FsbG9jX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19TVEFUX0NGR19SWF9CWVRFUyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fYWxsb2NfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2FsbG9jX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fYWxsb2Nfb3BlcltdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfR0VUX1NUQVRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfU0VUX1NUQVRFIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9nZW1fcG9ydF9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fZ2VtX3BvcnRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9HRU1fUE9SVF9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2dlbV9wb3J0X3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19UWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX1RYX1BBQ0tFVFMsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19SWF9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfUlhfQllURVMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2dlbV9wb3J0X2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2l3Zl9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0lXRl9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2l3Zl9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0lXRl9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX25pX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9uaV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fbmlfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fbmlfc3RhdF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX0ZFQ19DT0RFV09SRFMsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19CSVAzMl9CWVRFUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX0JJUDMyX0VSUk9SUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHVENfSEVBREVSUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHVENfQ09SUkVDVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfUlhfWEdUQ19VTkNPUlJFQ1RFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHRU0sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9YR0VNX0RST1BQRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9YR0VNX0lETEUsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9YR0VNX0NPUlJFQ1RFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0NSQ19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0ZSQUdNRU5UX0VSUk9SLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfUlhfUEFDS0VUU19EUk9QUEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfUlhfRFJPUFBFRF9UT09fU0hPUlQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9EUk9QUEVEX1RPT19MT05HLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfUlhfS0VZX0VSUk9SLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfVFhfUExPQU1TLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfUlhfUExPQU1TX0RST1BQRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9BTExPQ0FUSU9OU19WQUxJRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19OT05fSURMRSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0NQVSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0ksIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfVFhfUEFDS0VUUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX1hHRU0sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19UWF9DUFUsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19UWF9PTUNJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfVFBJRF9NSVNTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfVFhfRFJPUFBFRF9WSURfTUlTUyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fbmlfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfTE9TLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfT05VX0RJU0NPVkVSRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX25pX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fbmlfb3BlcltdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEgsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVIsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9SRVNFVCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1csIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVAsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TRVRfT05VX1NUQVRFLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU0VUX1BPTl9TVEFURSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NJTkdMRV9SRVFVRVNUX1NUQU5EQllfUE9OX01PTklUT1JJTkcsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1RPRF9SRVFVRVNUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9uaV9wcm94eVtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0NQVV9QQUNLRVRTIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9vbnVfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9vbnVfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9vbnVfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX29udV9zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1BPU0lUSVZFX0RSSUZULCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX05FR0FUSVZFX0RSSUZULCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX0RFTElNSVRFUl9NSVNTX0RFVEVDVElPTiwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19CSVAzMl9FUlJPUlMsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUlhfV09SRFMsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPUlJFQ1RFRF9TWU1CT0xTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19GRUNfQ09ERVdPUkRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX0ZFQ19DT1JSRUNURURfQklUUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19YR0VNX0tFWV9FUlJPUlMsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfWEdFTV9MT1NTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1JYX1BMT0FNU19NSUNfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUlhfUExPQU1TX05PTl9JRExFLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1JYX09NQ0ksIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19SWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19SWF9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1RYX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1RYX1BBQ0tFVFMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX29udV9hdXRvW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfREZJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0RHSSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9ET1dJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENILCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VULCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0xPT0NJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTlVfQUxBUk0sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PUFRJQ0FMX1JFRkxFQ1RJT04sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JULCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9QUVNJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TREksIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NGSSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1VGSSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9USVdJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1RVTklOR19SRVNQT05TRSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fb251X2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX29udV9vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEgsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElORywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9HRVRfUE9XRVJfQ09OU1VNUFRJT04sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfR0VUX1BPV0VSX0xFVkVMLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9UVU5JTkdfSU4sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT04sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NFVF9PTlVfU1RBVEUgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX29udV9wcm94eVtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0NQVV9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1BMT0FNX1BBQ0tFVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fb251X3Byb3h5X3J4W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTUNJX1BBQ0tFVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fdHJ4X2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fVFJYX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fdHJ4X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fVFJYX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeHBvbl9zZXJkZXNfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YUE9OX1NFUkRFU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hwb25fc2VyZGVzX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfWFBPTl9TRVJERVNfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2FlX25pW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2FlX25pX2tleSB9LCB7IDEsIGdyb3VwX2lkc19hZV9uaV9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMSwgZ3JvdXBfaWRzX2FlX25pX29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2FlX3BhdGhfZHNbXSA9IHsgeyAxLCBncm91cF9pZHNfYWVfcGF0aF9kc19rZXkgfSwgeyAwLCBOVUxMIH0sIHsgMSwgZ3JvdXBfaWRzX2FlX3BhdGhfZHNfc3RhdCB9LCB7IDE3LCBncm91cF9pZHNfYWVfcGF0aF9kc19zdGF0X2NmZyB9LCB7IDIsIGdyb3VwX2lkc19hZV9wYXRoX2RzX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfYWVfcGF0aF9kc19hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2FlX3BhdGhfdXNbXSA9IHsgeyAxLCBncm91cF9pZHNfYWVfcGF0aF91c19rZXkgfSwgeyAwLCBOVUxMIH0sIHsgMSwgZ3JvdXBfaWRzX2FlX3BhdGhfdXNfc3RhdCB9LCB7IDIwLCBncm91cF9pZHNfYWVfcGF0aF91c19zdGF0X2NmZyB9LCB7IDIsIGdyb3VwX2lkc19hZV9wYXRoX3VzX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfYWVfcGF0aF91c19hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2NoYW5uZWxbXSA9IHsgeyAxLCBncm91cF9pZHNfY2hhbm5lbF9rZXkgfSwgeyAxLCBncm91cF9pZHNfY2hhbm5lbF9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZGVidWdbXSA9IHsgeyAxLCBncm91cF9pZHNfZGVidWdfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2RlYnVnX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMiwgZ3JvdXBfaWRzX2RlYnVnX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfZGVidWdfYXV0b19jZmcgfSwgeyA0LCBncm91cF9pZHNfZGVidWdfb3BlciB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZGV2aWNlW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2RldmljZV9rZXkgfSwgeyAxLCBncm91cF9pZHNfZGV2aWNlX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMTEsIGdyb3VwX2lkc19kZXZpY2VfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19kZXZpY2VfYXV0b19jZmcgfSwgeyA4LCBncm91cF9pZHNfZGV2aWNlX29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2Vwb25fZGVuaWVkX2xpbmtbXSA9IHsgeyAxLCBncm91cF9pZHNfZXBvbl9kZW5pZWRfbGlua19rZXkgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9kZW5pZWRfbGlua19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDEwLCBncm91cF9pZHNfZXBvbl9kZW5pZWRfbGlua19hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9lcG9uX2xpbmtbXSA9IHsgeyAxLCBncm91cF9pZHNfZXBvbl9saW5rX2tleSB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX2xpbmtfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fbGlua19zdGF0IH0sIHsgNDMsIGdyb3VwX2lkc19lcG9uX2xpbmtfc3RhdF9jZmcgfSwgeyAyMSwgZ3JvdXBfaWRzX2Vwb25fbGlua19hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fbGlua19hdXRvX2NmZyB9LCB7IDcsIGdyb3VwX2lkc19lcG9uX2xpbmtfb3BlciB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX2xpbmtfcHJveHkgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9saW5rX3Byb3h5X3J4IH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZXBvbl9uaVtdID0geyB7IDEsIGdyb3VwX2lkc19lcG9uX25pX2tleSB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX25pX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMTAsIGdyb3VwX2lkc19lcG9uX25pX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfZXBvbl9uaV9hdXRvX2NmZyB9LCB7IDgsIGdyb3VwX2lkc19lcG9uX25pX29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2Vwb25fb251XzEwZ191c1tdID0geyB7IDEsIGdyb3VwX2lkc19lcG9uX29udV8xMGdfdXNfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19jZmcgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9vbnVfMTBnX3VzX3N0YXQgfSwgeyA0LCBncm91cF9pZHNfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2Vwb25fb251XzFnX3VzW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2Vwb25fb251XzFnX3VzX2tleSB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX29udV8xZ191c19jZmcgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9vbnVfMWdfdXNfc3RhdCB9LCB7IDE2LCBncm91cF9pZHNfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcgfSwgeyAyLCBncm91cF9pZHNfZXBvbl9vbnVfMWdfdXNfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX29udV8xZ191c19hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2Vwb25fcGF0aF8xMGdfZHNbXSA9IHsgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ19kc19rZXkgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ19kc19jZmcgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ19kc19zdGF0IH0sIHsgMjEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfZHNfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZXBvbl9wYXRoXzEwZ191c1tdID0geyB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX3VzX2tleSB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX3VzX2NmZyB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX3VzX3N0YXQgfSwgeyAyNiwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcgfSwgeyAyLCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ191c19hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9lcG9uX3BhdGhfMWdfZHNbXSA9IHsgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX2RzX2tleSB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfZHNfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ19kc19zdGF0IH0sIHsgMjEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgfSwgeyAyLCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX2RzX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZXBvbl9wYXRoXzFnX3VzW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ191c19rZXkgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX3VzX2NmZyB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfdXNfc3RhdCB9LCB7IDI2LCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ191c19hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2Vwb25fcnBbXSA9IHsgeyAxLCBncm91cF9pZHNfZXBvbl9ycF9rZXkgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9ycF9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bpb1tdID0geyB7IDEsIGdyb3VwX2lkc19ncGlvX2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncGlvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9ncG9uX2FsbG9jW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2dwb25fYWxsb2Nfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fYWxsb2NfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fYWxsb2Nfc3RhdCB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2FsbG9jX3N0YXRfY2ZnIH0sIHsgNCwgZ3JvdXBfaWRzX2dwb25fYWxsb2NfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2FsbG9jX2F1dG9fY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX2dwb25fYWxsb2Nfb3BlciB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bvbl9nZW1fcG9ydFtdID0geyB7IDEsIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X2NmZyB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X3N0YXQgfSwgeyA0LCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZyB9LCB7IDMsIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X2F1dG8gfSwgeyAxLCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2dwb25faXdmW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2dwb25faXdmX2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2l3Zl9jZmcgfSwgeyAxLCBncm91cF9pZHNfZ3Bvbl9pd2Zfc3RhdCB9LCB7IDgsIGdyb3VwX2lkc19ncG9uX2l3Zl9zdGF0X2NmZyB9LCB7IDQsIGdyb3VwX2lkc19ncG9uX2l3Zl9hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25faXdmX2F1dG9fY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX2dwb25faXdmX29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2dwb25faXdmX2RzX2VncmVzc19mbG93W10gPSB7IHsgMSwgZ3JvdXBfaWRzX2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93W10gPSB7IHsgMSwgZ3JvdXBfaWRzX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgfSwgeyAxLCBncm91cF9pZHNfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9ncG9uX2l3Zl9tYWNfdGFibGVbXSA9IHsgeyAxLCBncm91cF9pZHNfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyA0LCBncm91cF9pZHNfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bvbl9pd2ZfdXNfZmxvd1tdID0geyB7IDEsIGdyb3VwX2lkc19ncG9uX2l3Zl91c19mbG93X2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2l3Zl91c19mbG93X2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9ncG9uX25pW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2dwb25fbmlfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fbmlfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fbmlfc3RhdCB9LCB7IDM0LCBncm91cF9pZHNfZ3Bvbl9uaV9zdGF0X2NmZyB9LCB7IDE5LCBncm91cF9pZHNfZ3Bvbl9uaV9hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fbmlfYXV0b19jZmcgfSwgeyA5LCBncm91cF9pZHNfZ3Bvbl9uaV9vcGVyIH0sIHsgMiwgZ3JvdXBfaWRzX2dwb25fbmlfcHJveHkgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bvbl9vbnVbXSA9IHsgeyAxLCBncm91cF9pZHNfZ3Bvbl9vbnVfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fb251X2NmZyB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX29udV9zdGF0IH0sIHsgMjAsIGdyb3VwX2lkc19ncG9uX29udV9zdGF0X2NmZyB9LCB7IDM3LCBncm91cF9pZHNfZ3Bvbl9vbnVfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX29udV9hdXRvX2NmZyB9LCB7IDMsIGdyb3VwX2lkc19ncG9uX29udV9vcGVyIH0sIHsgMiwgZ3JvdXBfaWRzX2dwb25fb251X3Byb3h5IH0sIHsgMiwgZ3JvdXBfaWRzX2dwb25fb251X3Byb3h5X3J4IH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bvbl90cnhbXSA9IHsgeyAxLCBncm91cF9pZHNfZ3Bvbl90cnhfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fdHJ4X2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9sb2dfZW50cnlbXSA9IHsgeyAxLCBncm91cF9pZHNfbG9nX2VudHJ5X2tleSB9LCB7IDEsIGdyb3VwX2lkc19sb2dfZW50cnlfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2xvZ19lbnRyeV9zdGF0IH0sIHsgMiwgZ3JvdXBfaWRzX2xvZ19lbnRyeV9zdGF0X2NmZyB9LCB7IDIsIGdyb3VwX2lkc19sb2dfZW50cnlfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19sb2dfZW50cnlfYXV0b19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9sb2dnZXJbXSA9IHsgeyAxLCBncm91cF9pZHNfbG9nZ2VyX2tleSB9LCB7IDEsIGdyb3VwX2lkc19sb2dnZXJfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2xvZ2dlcl9zdGF0IH0sIHsgMSwgZ3JvdXBfaWRzX2xvZ2dlcl9zdGF0X2NmZyB9LCB7IDIsIGdyb3VwX2lkc19sb2dnZXJfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19sb2dnZXJfYXV0b19jZmcgfSwgeyAxLCBncm91cF9pZHNfbG9nZ2VyX29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX25uaVtdID0geyB7IDEsIGdyb3VwX2lkc19ubmlfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX25uaV9jZmcgfSwgeyAxLCBncm91cF9pZHNfbm5pX3N0YXQgfSwgeyA2MywgZ3JvdXBfaWRzX25uaV9zdGF0X2NmZyB9LCB7IDMsIGdyb3VwX2lkc19ubmlfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19ubmlfYXV0b19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9ubmlfc2VyZGVzW10gPSB7IHsgMSwgZ3JvdXBfaWRzX25uaV9zZXJkZXNfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX25uaV9zZXJkZXNfY2ZnIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX3NvZnR3YXJlX2Vycm9yW10gPSB7IHsgMSwgZ3JvdXBfaWRzX3NvZnR3YXJlX2Vycm9yX2tleSB9LCB7IDEsIGdyb3VwX2lkc19zb2Z0d2FyZV9lcnJvcl9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfdHJ4X2NhbGlicmF0aW9uW10gPSB7IHsgMSwgZ3JvdXBfaWRzX3RyeF9jYWxpYnJhdGlvbl9rZXkgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAxLCBncm91cF9pZHNfdHJ4X2NhbGlicmF0aW9uX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX3RyeF9jYWxpYnJhdGlvbl9vcGVyIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial94Z3Bvbl9hbGxvY1tdID0geyB7IDEsIGdyb3VwX2lkc194Z3Bvbl9hbGxvY19rZXkgfSwgeyAxLCBncm91cF9pZHNfeGdwb25fYWxsb2NfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX2FsbG9jX3N0YXQgfSwgeyAxLCBncm91cF9pZHNfeGdwb25fYWxsb2Nfc3RhdF9jZmcgfSwgeyA0LCBncm91cF9pZHNfeGdwb25fYWxsb2NfYXV0byB9LCB7IDEsIGdyb3VwX2lkc194Z3Bvbl9hbGxvY19hdXRvX2NmZyB9LCB7IDIsIGdyb3VwX2lkc194Z3Bvbl9hbGxvY19vcGVyIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial94Z3Bvbl9nZW1fcG9ydFtdID0geyB7IDEsIGdyb3VwX2lkc194Z3Bvbl9nZW1fcG9ydF9rZXkgfSwgeyAxLCBncm91cF9pZHNfeGdwb25fZ2VtX3BvcnRfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX2dlbV9wb3J0X3N0YXQgfSwgeyA0LCBncm91cF9pZHNfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgfSwgeyAyLCBncm91cF9pZHNfeGdwb25fZ2VtX3BvcnRfYXV0byB9LCB7IDEsIGdyb3VwX2lkc194Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX3hncG9uX2l3ZltdID0geyB7IDEsIGdyb3VwX2lkc194Z3Bvbl9pd2Zfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX2l3Zl9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfeGdwb25fbmlbXSA9IHsgeyAxLCBncm91cF9pZHNfeGdwb25fbmlfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX25pX2NmZyB9LCB7IDEsIGdyb3VwX2lkc194Z3Bvbl9uaV9zdGF0IH0sIHsgMzUsIGdyb3VwX2lkc194Z3Bvbl9uaV9zdGF0X2NmZyB9LCB7IDE5LCBncm91cF9pZHNfeGdwb25fbmlfYXV0byB9LCB7IDEsIGdyb3VwX2lkc194Z3Bvbl9uaV9hdXRvX2NmZyB9LCB7IDEwLCBncm91cF9pZHNfeGdwb25fbmlfb3BlciB9LCB7IDIsIGdyb3VwX2lkc194Z3Bvbl9uaV9wcm94eSB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial94Z3Bvbl9vbnVbXSA9IHsgeyAxLCBncm91cF9pZHNfeGdwb25fb251X2tleSB9LCB7IDEsIGdyb3VwX2lkc194Z3Bvbl9vbnVfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX29udV9zdGF0IH0sIHsgMjAsIGdyb3VwX2lkc194Z3Bvbl9vbnVfc3RhdF9jZmcgfSwgeyAzMywgZ3JvdXBfaWRzX3hncG9uX29udV9hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX29udV9hdXRvX2NmZyB9LCB7IDEwLCBncm91cF9pZHNfeGdwb25fb251X29wZXIgfSwgeyAyLCBncm91cF9pZHNfeGdwb25fb251X3Byb3h5IH0sIHsgMiwgZ3JvdXBfaWRzX3hncG9uX29udV9wcm94eV9yeCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX3hncG9uX3RyeFtdID0geyB7IDEsIGdyb3VwX2lkc194Z3Bvbl90cnhfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX3RyeF9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfeHBvbl9zZXJkZXNbXSA9IHsgeyAxLCBncm91cF9pZHNfeHBvbl9zZXJkZXNfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX3hwb25fc2VyZGVzX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgKmdyb3VwX2lkc1tdID0geyBncm91cF9pZHNfb2JqX2FlX25pLCBncm91cF9pZHNfb2JqX2FlX3BhdGhfZHMsIGdyb3VwX2lkc19vYmpfYWVfcGF0aF91cywgZ3JvdXBfaWRzX29ial9jaGFubmVsLCBncm91cF9pZHNfb2JqX2RlYnVnLCBncm91cF9pZHNfb2JqX2RldmljZSwgZ3JvdXBfaWRzX29ial9lcG9uX2RlbmllZF9saW5rLCBncm91cF9pZHNfb2JqX2Vwb25fbGluaywgZ3JvdXBfaWRzX29ial9lcG9uX25pLCBncm91cF9pZHNfb2JqX2Vwb25fb251XzEwZ191cywgZ3JvdXBfaWRzX29ial9lcG9uX29udV8xZ191cywgZ3JvdXBfaWRzX29ial9lcG9uX3BhdGhfMTBnX2RzLCBncm91cF9pZHNfb2JqX2Vwb25fcGF0aF8xMGdfdXMsIGdyb3VwX2lkc19vYmpfZXBvbl9wYXRoXzFnX2RzLCBncm91cF9pZHNfb2JqX2Vwb25fcGF0aF8xZ191cywgZ3JvdXBfaWRzX29ial9lcG9uX3JwLCBncm91cF9pZHNfb2JqX2dwaW8sIGdyb3VwX2lkc19vYmpfZ3Bvbl9hbGxvYywgZ3JvdXBfaWRzX29ial9ncG9uX2dlbV9wb3J0LCBncm91cF9pZHNfb2JqX2dwb25faXdmLCBncm91cF9pZHNfb2JqX2dwb25faXdmX2RzX2VncmVzc19mbG93LCBncm91cF9pZHNfb2JqX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgZ3JvdXBfaWRzX29ial9ncG9uX2l3Zl9tYWNfdGFibGUsIGdyb3VwX2lkc19vYmpfZ3Bvbl9pd2ZfdXNfZmxvdywgZ3JvdXBfaWRzX29ial9ncG9uX25pLCBncm91cF9pZHNfb2JqX2dwb25fb251LCBncm91cF9pZHNfb2JqX2dwb25fdHJ4LCBncm91cF9pZHNfb2JqX2xvZ19lbnRyeSwgZ3JvdXBfaWRzX29ial9sb2dnZXIsIGdyb3VwX2lkc19vYmpfbm5pLCBncm91cF9pZHNfb2JqX25uaV9zZXJkZXMsIGdyb3VwX2lkc19vYmpfc29mdHdhcmVfZXJyb3IsIGdyb3VwX2lkc19vYmpfdHJ4X2NhbGlicmF0aW9uLCBncm91cF9pZHNfb2JqX3hncG9uX2FsbG9jLCBncm91cF9pZHNfb2JqX3hncG9uX2dlbV9wb3J0LCBncm91cF9pZHNfb2JqX3hncG9uX2l3ZiwgZ3JvdXBfaWRzX29ial94Z3Bvbl9uaSwgZ3JvdXBfaWRzX29ial94Z3Bvbl9vbnUsIGdyb3VwX2lkc19vYmpfeGdwb25fdHJ4LCBncm91cF9pZHNfb2JqX3hwb25fc2VyZGVzIH07CitzdGF0aWMgYmNtb2x0X3ByZXNlbmNlX21hc2sgcmVhZG9ubHlfcHJvcF9tYXNrW10gPSB7ICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4pIHwgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX1NUQVRVUyksIDAsIDAsIDAsICgoKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEKSB8ICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfRklMRV9VU0VEX1BFUkNFTlQpKSB8ICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMpKSB8ICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSwgKCgoKCgoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9GSVJNV0FSRV9TV19WRVJTSU9OKSB8ICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTikpIHwgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9SRVZJU0lPTikpIHwgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1RBVEUpKSB8ICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUpKSB8ICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QpKSB8ICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVk9MVEFHRSksIDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAoKCgoKCgoKCgoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1JBVEUpIHwgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfU1RBVEVfRkxBR1MpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xMSUQpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09OX1RJTUVfVFEpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09GRl9USU1FX1RRKSkgfCAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9SQU5HRV9WQUxVRV9UUSkpIHwgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRElTVEFOQ0UpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgfCAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTykpIHwgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfUEVORElOR19HUkFOVFMpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfVFlQRSksICgoKCgoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTikgfCAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxBUk1fU1RBVEUpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTExfTElOS1MpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9TT0xJQ0lURURfVVNBR0UpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FU1RJTUFURURfUE9OX0xBVEVOQ1lfVFEpLCAxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX0FMTF9MSU5LUywgMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX0FMTF9MSU5LUywgMCwgMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMsIDAsIDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMsIDAsIDAsIDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFLCAxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSwgMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCwgMCwgMCwgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfR0VNX1BPUlRfSUQpIHwgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lEKSwgMCwgKCgoKCgoKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMpIHwgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSB8ICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMpKSB8ICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX1NUQU5EQllfT05VUykpIHwgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgfCAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSkpIHwgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTKSkgfCAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUyksICgoKCgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1NUQVRFKSB8ICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZKSkgfCAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04pKSB8ICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpIHwgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfQUxMT0NTKSwgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fUkFOR0lORykgfCAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19EQVRBKSwgKCgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX0xFVkVMKSB8ICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUpKSB8ICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19OQU1FKSwgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfQlVGRkVSKSB8ICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0xPR19OQU1FUyksICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVMpIHwgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMpLCAwLCAxVUxMIDw8IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlksIDAsIDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TVEFURSwgMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFLCAwLCAoKCgoKCgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCkgfCAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfT05VUykpIHwgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fU1RBVFVTKSkgfCAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSB8ICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSB8ICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSB8ICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUyksICgoKCgoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfT0xEX1NUQVRFKSB8ICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSkpIHwgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREVBQ1RJVkFUSU9OX1JFQVNPTikpIHwgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpIHwgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpIHwgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSwgMCwgMCB9Oworc3RhdGljIGJjbW9sdF9pbnN0YW5jZV9pbmZvIGluc3RhbmNlX2luZm9bXSA9IHsgeyBvZmZzZXRvZihiY21vbHRfYWVfbmlfa2V5LCBhZV9uaSksIHNpemVvZihiY21vbHRfYWVfbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5LCBhZV9uaSksIHNpemVvZihiY21vbHRfYWVfbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5LCBhZV9uaSksIHNpemVvZihiY21vbHRfYWVfbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X3Bvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfZGVidWdfa2V5LCByZXNlcnZlZCksIHNpemVvZih1aW50MzJfdCkgfSwgeyBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2tleSwgcmVzZXJ2ZWQpLCBzaXplb2YodWludDMyX3QpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5LCBlcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5LCBlcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2tleSwgZXBvbl9uaSksIHNpemVvZihiY21vbHRfZXBvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSwgZXBvbl9uaSksIHNpemVvZihiY21vbHRfZXBvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5LCBlcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSwgZXBvbl9uaSksIHNpemVvZihiY21vbHRfZXBvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXksIGVwb25fbmkpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXksIGVwb25fbmkpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXksIGVwb25fbmkpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfa2V5LCBlcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9ncGlvX2tleSwgcmVzZXJ2ZWQpLCBzaXplb2YodWludDMyX3QpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X2dwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X2dwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXksIHBvbl9uaSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X2dwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X2dwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X2dwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9rZXksIHBvbl9uaSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2tleSwgcmVzZXJ2ZWQpLCBzaXplb2YodWludDhfdCkgfSwgeyBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2tleSwgcmVzZXJ2ZWQpLCBzaXplb2YodWludDMyX3QpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X25uaV9rZXksIHBvbl9uaSksIHNpemVvZihiY21vbHRfcG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9wb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSwgcmVzZXJ2ZWQpLCBzaXplb2YodWludDMyX3QpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXksIHJlc2VydmVkKSwgc2l6ZW9mKHVpbnQzMl90KSB9LCB7IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXksIHBvbl9uaSksIHNpemVvZihiY21vbHRfeGdwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfeGdwb25faXdmX2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXksIHBvbl9uaSksIHNpemVvZihiY21vbHRfcG9uX25pKSB9IH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfYm9vbCBiY21vbHRfZ2V0X2dyb3VwX2luZm8oY29uc3QgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfZ3JvdXBfaW5mbyAqKmdyb3VwLCBiY21vbHRfZ3JvdXBfaW5mbyAqKmtleSkKK3sKKyAgICBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWQ7CisgICAgYmNtb2x0X2dyb3VwX2lkIGtleV9pZDsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBlcnIgPSBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAmZ3JvdXBfaWQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShtc2ctPm9ial90eXBlLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgJmtleV9pZCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpncm91cCA9IGdyb3VwX2luZm9bZ3JvdXBfaWRdOworICAgICprZXkgPSBncm91cF9pbmZvW2tleV9pZF07CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IGJjbW9sdF9tc2dfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X21zZyAqbXNnKQoreworICAgIHVpbnQ4X3QgKmtleV9wdHI7CisgICAgYmNtb2x0X2dyb3VwX2luZm8gKmdyb3VwOworICAgIGJjbW9sdF9ncm91cF9pbmZvICprZXk7CisKKyAgICBpbnQzMl90IHJldCA9IGJjbW9sdF9tc2dfaGRyX2dldF9wYWNrZWRfbGVuZ3RoKG1zZyk7CisgICAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dldF9ncm91cF9pbmZvKG1zZywgJmdyb3VwLCAma2V5KSkKKyAgICB7CisgICAgICAgIHJldHVybiAoaW50MzJfdCkgQkNNX0VSUl9NU0dfRVJST1I7CisgICAgfQorCisgICAga2V5X3B0ciA9ICh1aW50OF90ICopIChtc2cgKyAxKTsKKyAgICByZXQgKz0ga2V5LT5nZXRfcGFja2VkX2xlbmd0aChrZXlfcHRyLCBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEwpOworCisgICAgaWYgKGJjbW9sdF9tc2dfc2hvdWxkX3BhY2tfZGF0YShtc2cpICYmIChncm91cC0+Z2V0X3BhY2tlZF9sZW5ndGggIT0gTlVMTCkpCisgICAgeworICAgICAgICB1aW50OF90ICpkYXRhX3B0ciA9ICh1aW50OF90ICopICgobG9uZyltc2cgKyBncm91cC0+ZGF0YV9vZmZzZXQpOworICAgICAgICByZXQgKz0gZ3JvdXAtPmdldF9wYWNrZWRfbGVuZ3RoKGRhdGFfcHRyLCBtc2ctPnByZXNlbmNlX21hc2spOworICAgIH0KKworICAgIGlmIChtc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfTVVMVEkpCisgICAgeworICAgICAgICBpZiAobXNnLT5tc2dfc2V0ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCkgQkNNX0VSUl9OVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1zZy0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFUVVFU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCArPSAxOTsgIC8qIGdyb3VwOiAxLCBtYXhfaW5zdGFuY2VzOiAyLCBwcmVzZW5jZV9tYXNrOiA4LCBmaWx0ZXJfZmxhZ3M6IDggKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaW50MzJfdCBzdWJfbXNnX3JldDsKKworICAgICAgICAgICAgcmV0ICs9IDM7ICAgLyogZ3JvdXA6IG51bV9pbnN0YW5jZXM6IDIsIG1vcmU6IDEgKi8KKyAgICAgICAgICAgIHJldCArPSBrZXktPmdldF9wYWNrZWRfbGVuZ3RoKGtleV9wdHIsIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCk7ICAgLyogbmV4dCBrZXkgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtc2ctPm1zZ19zZXQtPm51bV9pbnN0YW5jZXM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5tc2dfc2V0LT5tc2dbaV0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCkgQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdWJfbXNnX3JldCA9IGJjbW9sdF9tc2dfZ2V0X3BhY2tlZF9sZW5ndGgobXNnLT5tc2dfc2V0LT5tc2dbaV0pOworICAgICAgICAgICAgICAgIGlmIChzdWJfbXNnX3JldCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ViX21zZ19yZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0ICs9IHN1Yl9tc2dfcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyogQ3JlYXRlIG1lc3NhZ2Ugc2V0ICovCitiY21vc19lcnJubyBiY21vbHRfbXNnX3NldF9hbGxvYyhiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X21ndF9ncm91cCBncm91cCwgdWludDMyX3QgbWF4X2luc3RhbmNlcywgYmNtb2x0X21zZ19zZXQgKiptc2dfc2V0KQoreworICAgIGJjbW9sdF9tc2cgaGRyID0geyB9OworICAgIHVpbnQzMl90IHNpemU7CisgICAgYmNtb2x0X2dyb3VwX2luZm8gKmdycDsKKyAgICBiY21vbHRfZ3JvdXBfaW5mbyAqa2V5OworCisgICAgaWYgKG1zZ19zZXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJtc2dfc2V0IHBhcmFtZXRlciBtdXN0IGJlIHNldFxuIik7CisgICAgfQorCisgICAgaWYgKGdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHICYmIGdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfU1RBVCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PVF9TVVBQT1JURUQsICJncm91cCBtdXN0IGJlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHIG9yIEJDTU9MVF9NR1RfR1JPVVBfU1RBVFxuIik7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIG1lc3NhZ2Ugc2V0IHNpemUgKi8KKyAgICBoZHIub2JqX3R5cGUgPSBvYmo7CisgICAgaGRyLmdyb3VwID0gZ3JvdXA7CisgICAgaGRyLmRpciA9IEJDTU9MVF9NU0dfRElSX1JFUVVFU1Q7CisgICAgaWYgKCFiY21vbHRfZ2V0X2dyb3VwX2luZm8oJmhkciwgJmdycCwgJmtleSkpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT1RfU1VQUE9SVEVELCAiTm90IHN1cHBvcnRlZCBmb3IgdGhlIG9iamVjdFxuIik7CisgICAgfQorCisgICAgc2l6ZSA9IHNpemVvZihiY21vbHRfbXNnX3NldCkgKyBrZXktPnNpemUgKyBtYXhfaW5zdGFuY2VzICogc2l6ZW9mKGJjbW9sdF9tc2cgKik7CisgICAgKm1zZ19zZXQgPSBiY21vc19jYWxsb2Moc2l6ZSk7CisgICAgaWYgKCptc2dfc2V0ID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT01FTSwgIkNhbid0IGFsbG9jYXRlIG1lc3NhZ2Ugc2V0XG4iKTsKKyAgICB9CisgICAgKCptc2dfc2V0KS0+Z3JvdXAgPSBncm91cDsKKyAgICAoKm1zZ19zZXQpLT5tYXhfaW5zdGFuY2VzID0gbWF4X2luc3RhbmNlczsKKyAgICAoKm1zZ19zZXQpLT5uZXh0X2tleSA9ICh2b2lkICopKCYoKCptc2dfc2V0KS0+bXNnW21heF9pbnN0YW5jZXNdKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogUmVsZWFzZSBtZXNzYWdlIHNldAorICogXHBhcmFtW2luXSAgIG1zZ19zZXQKKyAqLwordm9pZCBiY21vbHRfbXNnX3NldF9mcmVlKGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0KQoreworICAgIHVpbnQzMl90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXNnX3NldC0+bWF4X2luc3RhbmNlcyAmJiBtc2dfc2V0LT5tc2dbaV0gIT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKG1zZ19zZXQtPm1zZ1tpXSk7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShtc2dfc2V0KTsKK30KKworLyogUGFjayBtZXNzYWdlIHNldCwgZXhjbHVkaW5nIHRoZSBmaWx0ZXItaGVhZGVyIHdoaWNoIGlzIGFscmVhZHkgcGFja2VkICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X21zZ19zZXRfcGFjayhjb25zdCBiY21vbHRfbXNnICptc2csIGJjbW9sdF9idWYgKmJ1ZiwgY29uc3QgYmNtb2x0X2dyb3VwX2luZm8gKmtleV9pbmZvKQoreworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gbXNnLT5tc2dfc2V0OworICAgIGludCBpOworICAgIGJjbW9zX2Jvb2wgcmV0OworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBpZiAoIW1zZ19zZXQpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTlRFUk5BTCwgIm1zaC0+bXNnX3NldCA9PSBOVUxMXG4iKTsKKyAgICB9CisKKyAgICAvKiBSRVFVRVNUOgorICAgICAqIC0gZmlsdGVyIChhbHJlYWR5IHBhY2tlZCBhdCB0aGlzIHBvaW50LCBjb250YWlucyBmaXJzdCBrZXkgdG8gY2hlY2spCisgICAgICogLSBncm91cCAoRkZVKQorICAgICAqIC0gbWF4X2luc3RhbmNlcworICAgICAqIC0gcHJlc2VuY2VfbWFzaworICAgICAqIC0gZmlsdGVyX2ZsYWdzCisgICAgICoKKyAgICAgKiBSRVNQT05TRToKKyAgICAgKiAtIGZpbHRlciAoYWxyZWFkeSBwYWNrZWQgYXQgdGhpcyBwb2ludCkKKyAgICAgKiAtIG51bV9pbnN0YW5jZXMKKyAgICAgKiAtIG1vcmUKKyAgICAgKiAtIG5leHRfa2V5CisgICAgICogLSBudW1faW5zdGFuY2VzICogbXNnCisgICAgICovCisgICAgaWYgKG1zZy0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFUVVFU1QpCisgICAgeworICAgICAgICByZXQgPSBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIG1zZ19zZXQtPmdyb3VwKTsKKyAgICAgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgbXNnX3NldC0+bWF4X2luc3RhbmNlcyk7CisgICAgICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIG1zZ19zZXQtPnByZXNlbmNlX21hc2spOworICAgICAgICByZXQgPSByZXQgJiYgYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCBtc2dfc2V0LT5maWx0ZXJfZmxhZ3MpOworICAgICAgICBpZiAoIXJldCkgZXJyID0gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0ID0gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCBtc2dfc2V0LT5udW1faW5zdGFuY2VzKTsKKyAgICAgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgbXNnX3NldC0+bW9yZSk7CisgICAgICAgIHJldCA9IHJldCAmJiBrZXlfaW5mby0+cGFjayhtc2dfc2V0LT5uZXh0X2tleSwgYnVmLCBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEwpOworICAgICAgICBpZiAoIXJldCkgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1zZ19zZXQtPm51bV9pbnN0YW5jZXMgJiYgZXJyID09IEJDTV9FUlJfT0s7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1zZ19zZXQtPm1zZ1tpXSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfcGFjayhtc2dfc2V0LT5tc2dbaV0sIGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtb2x0X21zZ19wYWNrKGJjbW9sdF9tc2cgKm1zZywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgKmtleV9wdHI7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncm91cF9pbmZvICpncm91cDsKKyAgICBiY21vbHRfZ3JvdXBfaW5mbyAqa2V5OworCisgICAgaWYgKCFiY21vbHRfZ2V0X2dyb3VwX2luZm8obXNnLCAmZ3JvdXAsICZrZXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTVNHX0VSUk9SOworICAgIH0KKworICAgIGVyciA9IGJjbW9sdF9tc2dfaGRyX3BhY2sobXNnLCBidWYpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAga2V5X3B0ciA9ICh1aW50OF90ICopIChtc2cgKyAxKTsKKyAgICBpZiAoIWtleS0+cGFjayhrZXlfcHRyLCBidWYsIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICBpZiAoYmNtb2x0X21zZ19zaG91bGRfcGFja19kYXRhKG1zZykgJiYgKGdyb3VwLT5wYWNrICE9IE5VTEwpKQorICAgIHsKKyAgICAgICAgdWludDhfdCAqZGF0YV9wdHIgPSAodWludDhfdCAqKSAoKGxvbmcpbXNnICsgZ3JvdXAtPmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgaWYgKCFncm91cC0+cGFjayhkYXRhX3B0ciwgYnVmLCBtc2ctPnByZXNlbmNlX21hc2spKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIGl0IGlzIGEgbXVsdGktbWVzc2FnZSBwYWNrIHdoYXQgZm9sbG93cyB0aGUgcmVzdCBvZiB0aGUgc2V0ICovCisgICAgaWYgKG1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9NVUxUSSkKKyAgICB7CisgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfc2V0X3BhY2sobXNnLCBidWYsIGtleSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworLyogc2NhbiB0aGUgaW5wdXQgYnVmZmVyIHRvIGRldGVybWluZSBob3cgbXVjaCBtZW1vcnkgd2lsbCBiZSByZXF1aXJlZCB0byB1bnBhY2sgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfbXNnX2xpc3RfbWVtX3NjYW4oYmNtb2x0X2J1ZiAqYnVmLCBjb25zdCBiY21vbHRfbXNnICpoZHIsIGNvbnN0IGJjbW9sdF9ncm91cF9pbmZvICpncm91cCwgY29uc3QgYmNtb2x0X2dyb3VwX2luZm8gKmtleSwgdWludDMyX3QgKnNpemUpCit7CisgICAgdWludDMyX3QgcG9zX2JlZm9yZV9zY2FuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgaWYgKCFrZXktPm1lbV9zY2FuKGJ1Ziwgc2l6ZSwgQkNNT0xUX1BSRVNFTkNFX01BU0tfQUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKworICAgIGlmIChiY21vbHRfbXNnX3Nob3VsZF9wYWNrX2RhdGEoaGRyKSAmJiAoZ3JvdXAtPm1lbV9zY2FuICE9IE5VTEwpICYmICFncm91cC0+bWVtX3NjYW4oYnVmLCBzaXplLCBoZHItPnByZXNlbmNlX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3Jld2luZChidWYsIGJjbW9sdF9idWZfZ2V0X3VzZWQoYnVmKSAtIHBvc19iZWZvcmVfc2NhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogUGFjayBtZXNzYWdlIHNldCwgZXhjbHVkaW5nIHRoZSBmaWx0ZXItaGVhZGVyIHdoaWNoIGlzIGFscmVhZHkgcGFja2VkICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X21zZ19zZXRfdW5wYWNrKGJjbW9sdF9tc2cgKm1zZywgYmNtb2x0X2J1ZiAqYnVmLCBjb25zdCBiY21vbHRfZ3JvdXBfaW5mbyAqa2V5X2luZm8pCit7CisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQ7CisgICAgaW50IGk7CisgICAgYmNtb3NfYm9vbCByZXQ7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qCisgICAgICogU2VlIGVuY29kaW5nIGluIGJjbW9sdF9tc2dfc2V0X3BhY2soKQorICAgICAqLworICAgIGlmIChtc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVFVRVNUKQorICAgIHsKKyAgICAgICAgdWludDhfdCBncm91cDsKKyAgICAgICAgdWludDE2X3QgbWF4X2luc3RhbmNlczsKKyAgICAgICAgdWludDY0X3QgZmlsdGVyX2ZsYWdzOworCisgICAgICAgIHJldCA9IGJjbW9sdF9idWZfcmVhZF91OChidWYsICZncm91cCk7CisgICAgICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm1heF9pbnN0YW5jZXMpOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBiY21vbHRfbXNnX3NldF9hbGxvYyhtc2ctPm9ial90eXBlLCBncm91cCwgbWF4X2luc3RhbmNlcywgJm1zZ19zZXQpOworICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgICAgICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJm1zZ19zZXQtPnByZXNlbmNlX21hc2spOworICAgICAgICByZXQgPSByZXQgJiYgYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZmaWx0ZXJfZmxhZ3MpOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X21zZ19zZXRfZnJlZShtc2dfc2V0KTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgICAgICB9CisKKyAgICAgICAgbXNnX3NldC0+ZmlsdGVyX2ZsYWdzID0gZmlsdGVyX2ZsYWdzOworICAgICAgICBtc2ctPm1zZ19zZXQgPSBtc2dfc2V0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50OF90IGlzX21vcmU7CisgICAgICAgIHVpbnQxNl90IG51bV9pbnN0YW5jZXM7CisKKyAgICAgICAgcmV0ID0gYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1faW5zdGFuY2VzKTsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1zZy0+bXNnX3NldCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBiY21vbHRfbXNnX3NldF9hbGxvYyhtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBudW1faW5zdGFuY2VzLCAmbXNnLT5tc2dfc2V0KTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbXNnX3NldCA9IG1zZy0+bXNnX3NldDsKKyAgICAgICAgbXNnX3NldC0+bnVtX2luc3RhbmNlcyA9IG51bV9pbnN0YW5jZXM7CisgICAgICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmaXNfbW9yZSk7CisgICAgICAgIHJldCA9IHJldCAmJiBrZXlfaW5mby0+dW5wYWNrKG1zZ19zZXQtPm5leHRfa2V5LCBidWYsIE5VTEwsIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCk7CisgICAgICAgIGlmICghcmV0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICAgICAgfQorCisgICAgICAgIG1zZ19zZXQtPm1vcmUgPSAoYmNtb3NfYm9vbCkgaXNfbW9yZTsKKyAgICAgICAgaWYgKG1zZ19zZXQtPm51bV9pbnN0YW5jZXMgPiBtc2dfc2V0LT5tYXhfaW5zdGFuY2VzKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTlRFUk5BTCwgIm1zZ19zZXQgdW5wYWNrOiBudW1faW5zdGFuY2VzICV1ID4gbWF4X2luc3RhbmNlcyAldVxuIiwgbXNnX3NldC0+bnVtX2luc3RhbmNlcywgbXNnX3NldC0+bWF4X2luc3RhbmNlcyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnX3NldC0+bnVtX2luc3RhbmNlcyAmJiBlcnIgPT0gQkNNX0VSUl9PSzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBiY21vbHRfbXNnX3VucGFjayhidWYsICZtc2dfc2V0LT5tc2dbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9tc2dfdW5wYWNrKGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X21zZyAqKnVucGFja2VkKQoreworICAgIGJjbW9sdF9tc2cgaGRyID0geyB9OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3JvdXBfaW5mbyAqZ3JvdXA7CisgICAgYmNtb2x0X2dyb3VwX2luZm8gKmtleTsKKyAgICBiY21vc19ib29sIGRpZF9tYWxsb2MgPSBCQ01PU19GQUxTRTsKKyAgICB1aW50OF90ICprZXlfcHRyOworICAgIHZvaWQgKmxpc3RfbWVtID0gTlVMTDsKKyAgICB2b2lkICoqbGlzdF9tZW1fcHRyID0gTlVMTDsKKworICAgIGVyciA9IGJjbW9sdF9tc2dfaGRyX3VucGFjaygmaGRyLCBidWYpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ2V0X2dyb3VwX2luZm8oJmhkciwgJmdyb3VwLCAma2V5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX01TR19FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoKnVucGFja2VkID09IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCBzaXplID0gZ3JvdXAtPmNvbnRhaW5lcl9zaXplID09IDAgPyBzaXplb2YoYmNtb2x0X21zZykgKyBrZXktPnNpemUgOiBncm91cC0+Y29udGFpbmVyX3NpemU7CisgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfbGlzdF9tZW1fc2NhbihidWYsICZoZHIsIGdyb3VwLCBrZXksICZzaXplKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgKnVucGFja2VkID0gYmNtb3NfY2FsbG9jKHNpemUpOworICAgICAgICBpZiAoKnVucGFja2VkID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgbGlzdF9tZW0gPSAodWludDhfdCAqKSAoKnVucGFja2VkKSArIGdyb3VwLT5jb250YWluZXJfc2l6ZTsKKyAgICAgICAgbGlzdF9tZW1fcHRyID0gJmxpc3RfbWVtOworICAgICAgICBkaWRfbWFsbG9jID0gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCgqdW5wYWNrZWQpLT5saXN0X2J1ZiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gMDsKKyAgICAgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfbGlzdF9tZW1fc2NhbihidWYsICZoZHIsIGdyb3VwLCBrZXksICZzaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2l6ZSA+ICgqdW5wYWNrZWQpLT5saXN0X2J1Zl9zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOU1VGRklDSUVOVF9MSVNUX01FTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGlzdF9tZW0gPSAoKnVucGFja2VkKS0+bGlzdF9idWY7CisgICAgICAgICAgICBsaXN0X21lbV9wdHIgPSAmbGlzdF9tZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBoZHIubXNnX3NldCA9ICgqdW5wYWNrZWQpLT5tc2dfc2V0OworICAgICoqdW5wYWNrZWQgPSBoZHI7CisKKyAgICBrZXlfcHRyID0gKHVpbnQ4X3QgKikgKCp1bnBhY2tlZCArIDEpOworICAgIGlmICgha2V5LT51bnBhY2soa2V5X3B0ciwgYnVmLCBsaXN0X21lbV9wdHIsIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCkpCisgICAgeworICAgICAgICBpZiAoZGlkX21hbGxvYykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZnJlZSgqdW5wYWNrZWQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgaWYgKGJjbW9sdF9tc2dfc2hvdWxkX3BhY2tfZGF0YSgmaGRyKSkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgKmRhdGFfcHRyID0gKHVpbnQ4X3QgKikgKCp1bnBhY2tlZCkgKyBncm91cC0+ZGF0YV9vZmZzZXQ7CisgICAgICAgIGlmICgoZ3JvdXAtPnVucGFjayAhPSBOVUxMKSAmJiAhZ3JvdXAtPnVucGFjayhkYXRhX3B0ciwgYnVmLCBsaXN0X21lbV9wdHIsIGhkci5wcmVzZW5jZV9tYXNrKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRpZF9tYWxsb2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfZnJlZSgqdW5wYWNrZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIGl0IGlzIGEgbXVsdGktbWVzc2FnZSBwYWNrIHdoYXQgZm9sbG93cyB0aGUgcmVzdCBvZiB0aGUgc2V0ICovCisgICAgaWYgKGhkci50eXBlICYgQkNNT0xUX01TR19UWVBFX01VTFRJKQorICAgIHsKKyAgICAgICAgZXJyID0gYmNtb2x0X21zZ19zZXRfdW5wYWNrKCp1bnBhY2tlZCwgYnVmLCBrZXkpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkaWRfbWFsbG9jKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX2ZyZWUoKnVucGFja2VkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtb2x0X2dyb3VwX2lkX3NwbGl0KGJjbW9sdF9ncm91cF9pZCBncm91cF9pZCwgYmNtb2x0X29ial9pZCAqb2JqLCBiY21vbHRfbWd0X2dyb3VwICpncm91cCwgdWludDE2X3QgKnN1Ymdyb3VwKQoreworICAgIGlmICgoZ3JvdXBfaWQgPj0gQkNNT0xUX0dST1VQX0lEX19OVU1fT0YpIHx8IChncm91cF9pbmZvW2dyb3VwX2lkXSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgICpvYmogPSBncm91cF9pbmZvW2dyb3VwX2lkXS0+b2JqX3R5cGU7CisgICAgKmdyb3VwID0gZ3JvdXBfaW5mb1tncm91cF9pZF0tPmdyb3VwOworICAgICpzdWJncm91cCA9IGdyb3VwX2luZm9bZ3JvdXBfaWRdLT5zdWJncm91cDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgYmNtb2x0X2dyb3VwX2lkICpncm91cF9pZCkKK3sKKyAgICBpZiAoKG9iaiA+PSBCQ01PTFRfT0JKX0lEX19OVU1fT0YpIHx8IChncm91cCA+PSBCQ01PTFRfTUdUX0dST1VQX19OVU1fT0YpIHx8IChncm91cF9pZHNbb2JqXSA9PSBOVUxMKSB8fCAoc3ViZ3JvdXAgPj0gZ3JvdXBfaWRzW29ial1bZ3JvdXBdLnN1Ymdyb3VwX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgICpncm91cF9pZCA9IGdyb3VwX2lkc1tvYmpdW2dyb3VwXS5zdWJncm91cF9pZHNbc3ViZ3JvdXBdOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDhfdCBiY21vbHRfbXNnX2luc3RhbmNlKGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBjb25zdCB2b2lkICp2YWxfcHRyOworCisgICAgaWYgKG1zZy0+b2JqX3R5cGUgPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGluc3RhbmNlX2luZm9bbXNnLT5vYmpfdHlwZV0ub2Zmc2V0IDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZhbF9wdHIgPSAoKGNvbnN0IHVpbnQ4X3QgKikobXNnICsgMSkpICsgaW5zdGFuY2VfaW5mb1ttc2ctPm9ial90eXBlXS5vZmZzZXQ7CisKKyAgICAvKiogVGhpcyBpcyBwcm9iYWJseSBub3QgdGhlIHNtYXJ0ZXN0IHdheSB0byBkbyB0aGlzLi4uIFRPRE86IHJldmlzaXQgKi8KKyAgICBzd2l0Y2ggKGluc3RhbmNlX2luZm9bbXNnLT5vYmpfdHlwZV0uc2l6ZSkKKyAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiAqKChjb25zdCB1aW50OF90ICopdmFsX3B0cik7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHJldHVybiAodWludDhfdCkgKCooKGNvbnN0IHVpbnQxNl90ICopdmFsX3B0cikpOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICByZXR1cm4gKHVpbnQ4X3QpICgqKChjb25zdCB1aW50MzJfdCAqKXZhbF9wdHIpKTsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgcmV0dXJuICh1aW50OF90KSAoKigoY29uc3QgdWludDY0X3QgKil2YWxfcHRyKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21vbHRfbXNnX2Nsb25lKGJjbW9sdF9tc2cgKipkZXN0LCBiY21vbHRfbXNnICpzcmMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGludDMyX3QgcGFja2VkX2xlbjsKKyAgICB1aW50OF90ICptZW07CisgICAgYmNtb2x0X2J1ZiBidWY7CisKKyAgICBwYWNrZWRfbGVuID0gYmNtb2x0X21zZ19nZXRfcGFja2VkX2xlbmd0aChzcmMpOworICAgIGlmIChwYWNrZWRfbGVuIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoYmNtb3NfZXJybm8pIHBhY2tlZF9sZW47CisgICAgfQorCisgICAgbWVtID0gYmNtb3NfY2FsbG9jKCh1aW50MzJfdCkgcGFja2VkX2xlbik7CisgICAgaWYgKG1lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsICh1aW50MzJfdCkgcGFja2VkX2xlbiwgbWVtLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgZXJyID0gYmNtb2x0X21zZ19wYWNrKHNyYywgJmJ1Zik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShtZW0pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJ1Zi5jdXJyID0gYnVmLnN0YXJ0OworICAgIGVyciA9IGJjbW9sdF9tc2dfdW5wYWNrKCZidWYsIGRlc3QpOworICAgIGJjbW9zX2ZyZWUobWVtKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtb2x0X2dldF9wcm9wX3JlYWRvbmx5X21hc2soYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9wcmVzZW5jZV9tYXNrICptYXNrKQoreworICAgIGlmIChvYmogPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgKm1hc2sgPSByZWFkb25seV9wcm9wX21hc2tbb2JqXTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2lmZGVmIF9fS0VSTkVMX18KK0VYUE9SVF9TWU1CT0woYmNtb2x0X21zZ19nZXRfcGFja2VkX2xlbmd0aCk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9tc2dfcGFjayk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9tc2dfdW5wYWNrKTsKK0VYUE9SVF9TWU1CT0woYmNtb2x0X2dyb3VwX2lkX3NwbGl0KTsKK0VYUE9SVF9TWU1CT0woYmNtb2x0X2dyb3VwX2lkX2NvbWJpbmUpOworRVhQT1JUX1NZTUJPTChiY21vbHRfbXNnX2luc3RhbmNlKTsKK0VYUE9SVF9TWU1CT0woYmNtb2x0X2dldF9wcm9wX3JlYWRvbmx5X21hc2spOworRVhQT1JUX1NZTUJPTChiY21vbHRfbXNnX3NldF9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9tc2dfc2V0X2ZyZWUpOworCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbXNnX3BhY2suaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbXNnX3BhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzAxYmZmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tc2dfcGFjay5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKworI2lmbmRlZiBCQ01PTFRfTVNHX1BBQ0tfSF8KKyNkZWZpbmUgQkNNT0xUX01TR19QQUNLX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vc19jb21tb24uaCIKKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImJjbW9sdF9idWYuaCIKKyNpbmNsdWRlICJiY21vbHRfbXNnLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYSBtZXNzYWdlIHdvdWxkIG9jY3VweSB3aGVuIHBhY2tlZC4KKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgbWVzc2FnZSB0byBzY2FuLgorICogXHJldHVybiBUaGUgc2l6ZSBpbiBieXRlcyBpZiA+IDAsIG9yIGFuIGVycm9yIGFzIGRlZmluZWQgaW4gYmNtb3NfZXJybm8uCisgKi8KK2ludDMyX3QgYmNtb2x0X21zZ19nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfbXNnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgbWVzc2FnZSB0byBhIGJ5dGUgc3RyZWFtLgorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBtZXNzYWdlIHRvIHBhY2suCisgKiBccGFyYW0gYnVmIFRoZSBzdHJlYW0gdG8gcGFjayBpbnRvLgorICogXHJldHVybiBBbiBlcnJvciBjb2RlIG9yIEJDTV9FUlJfT0sgZm9yIHN1Y2Nlc3MuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9tc2dfcGFjayhiY21vbHRfbXNnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIG1lc3NhZ2UgZnJvbSBhIGJ5dGUgc3RyZWFtLgorICoKKyAqIFRoaXMgdW5wYWNrcyB0aGUgbWVzc2FnZSBmcm9tIHRoZSBwYWNrZWQgZm9ybSBpbnRvIHRoZSBzdHJ1Y3QgZm9sbG93aW5nIHRoZSAidW5wYWNrZWQiIHBvaW50ZXIuICBUaGVyZSBhcmUgc2V2ZXJhbAorICogc3BlY2lhbCBjYXNlczoKKyAqCisgKiBpZiAqdW5wYWNrZWQgPT0gTlVMTDoKKyAqICAgKnVucGFja2VkIHdpbGwgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5IHZpYSBiY21vc19jYWxsb2MsIGluIGEgY29udGlndW91cyBibG9jayBvZiBtZW1vcnkgd2l0aCB0aGUgc3RydWN0CisgKiAgIGl0c2VsZiBmb2xsb3dlZCBieSB0aGUgbWVtb3J5IHJlcXVpcmVkIGZvciBhbGwgdmFyaWFibGUtc2l6ZWQgbGlzdHMuCisgKgorICogaWYgKCp1bnBhY2tlZCktPmxpc3RfYnVmICE9IE5VTEw6CisgKiAgIFdoZW4gYSB2YXJpYWJsZS1sZW5ndGggbGlzdCBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgaW5wdXQgc3RyZWFtLCBhbmQgdGhlIGFycmF5IGZpZWxkIHdlJ3JlIHVucGFja2luZyBpbnRvIGlzIE5VTEwsCisgKiAgIG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCBzdGFydGluZyBmcm9tICgqdW5wYWNrZWQpLT5saXN0X2J1Zi4gIElmIG11bHRpcGxlIHN1Y2ggbGlzdHMgZXhpc3QsIHRoZXkgd2lsbCBzaGFyZSB0aGlzCisgKiAgIGJ1ZmZlci4gIElmIHRoZSAoKnVucGFja2VkKS0+bGlzdF9idWZfc2l6ZSBpcyBub3QgbGFyZ2UgZW5vdWdoLCB0aGlzIHdpbGwgcmV0dXJuIEJDTV9FUlJfSU5TVUZGSUNJRU5UX0xJU1RfTUVNLgorICoKKyAqIFxwYXJhbSBidWYgICAgICAgICAgIFRoZSBzdHJlYW0gdG8gdW5wYWNrIGZyb20uCisgKiBccGFyYW0gdW5wYWNrZWQgICAgICBBIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdG8gdW5wYWNrLgorICogXHJldHVybiBBbiBlcnJvciBhcyBkZWZpbmVkIGluIGJjbW9zX2Vycm5vLgorICovCitiY21vc19lcnJubyBiY21vbHRfbXNnX3VucGFjayhiY21vbHRfYnVmICpidWYsIGJjbW9sdF9tc2cgKip1bnBhY2tlZCk7CisKKy8qKiBDb252ZXJ0cyBhIGdlbmVyaWMgZ3JvdXAgSUQgaW50byBhIHNwZWNpZmljIG9iamVjdCB0eXBlLCBncm91cCBhbmQgc3ViZ3JvdXAuCisgKgorICogXHBhcmFtIGdyb3VwX2lkIFRoZSBnZW5lcmljIGdyb3VwIElELgorICogXHBhcmFtIG9iaiBUaGUgb2JqZWN0IHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ3JvdXAgSUQuCisgKiBccGFyYW0gZ3JvdXAgVGhlIGdyb3VwIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ3JvdXAgSUQuCisgKiBccGFyYW0gc3ViZ3JvdXAgVGhlIHN1Ymdyb3VwIGluZGV4IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdyb3VwIElELgorICogXHJldHVybiBBbiBlcnJvciBjb2RlIG9yIEJDTV9FUlJfT0sgZm9yIHN1Y2Nlc3MuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9ncm91cF9pZF9zcGxpdChiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X29ial9pZCAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9tZ3RfZ3JvdXAgKmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpzdWJncm91cCk7CisKKy8qKiBDb252ZXJ0cyBhIHNwZWNpZmljIG9iamVjdCB0eXBlLCBncm91cCBhbmQgc3ViZ3JvdXAgaW50byBhIGdlbmVyaWMgZ3JvdXAgSUQuCisgKgorICogXHBhcmFtIG9iaiBUaGUgb2JqZWN0IHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ3JvdXAgSUQuCisgKiBccGFyYW0gZ3JvdXAgVGhlIGdyb3VwIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ3JvdXAgSUQuCisgKiBccGFyYW0gc3ViZ3JvdXAgVGhlIHN1Ymdyb3VwIGluZGV4IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdyb3VwIElELgorICogXHBhcmFtIGdyb3VwX2lkIFRoZSBnZW5lcmljIGdyb3VwIElELgorICogXHJldHVybiBBbiBlcnJvciBjb2RlIG9yIEJDTV9FUlJfT0sgZm9yIHN1Y2Nlc3MuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKGJjbW9sdF9vYmpfaWQgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X21ndF9ncm91cCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1Ymdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dyb3VwX2lkICpncm91cF9pZCk7CisKKy8qKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBudW1iZXIgb2YgYSBnaXZlbiBtZXNzYWdlLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvYmplY3Qga2V5LgorICoKKyAqIFxwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gY2hlY2suCisgKiBccmV0dXJuIFRoZSBpbnN0YW5jZSBudW1iZXIgb2YgdGhlIG1lc3NhZ2UuCisgKi8KK3VpbnQ4X3QgYmNtb2x0X21zZ19pbnN0YW5jZShjb25zdCBiY21vbHRfbXNnICptc2cpOworCisvKiogR2V0cyBhIG1hc2sgb2YgYWxsIHJlYWRvbmx5IHByb3BlcnRpZXMgZm9yIGFuIG9iamVjdCdzIGNmZyBncm91cC4KKyAqCisgKiBccGFyYW0gb2JqIFRoZSBvYmplY2N0IHRvIGNoZWNrLgorICogXHBhcmFtIG1hc2sgQSBtYXNrIG9mIGJpdHMgc2V0IHRvIDEgcGVyIHJlYWQtb25seSBwcm9wZXJ0eS4KKyAqIFxyZXR1cm4gQW4gZXJyb3IgY29kZSBvciBCQ01fRVJSX09LIGZvciBzdWNjZXNzLgorICovCitiY21vc19lcnJubyBiY21vbHRfZ2V0X3Byb3BfcmVhZG9ubHlfbWFzayhiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgKm1hc2spOworCisvKiogQ2xvbmVzIGEgbWVzc2FnZSBieSBwYWNraW5nIGl0IHRvIGEgYnVmZmVyIHRoZW4gdW5wYWNraW5nIGl0IGludG8gdGhlIGRlc3RpbmF0aW9uIG1lc3NhZ2UuCisgKiBUaGlzIHVzZXMgYmNtb2x0X21zZ191bnBhY2ssIHNvIGlmICpkZXN0IGlzIE5VTEwsIG1lbW9yeSB3aWxsIGJ5IGFsbG9jYXRlZCBkeW5hbWljYWxseSB1c2luZyBiY21vc19jYWxsb2MuCisgKgorICogXHBhcmFtIGRlc3QgQSBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiBpbiBtZW1vcnkgdGhhdCB3aWxsIGhvbGQgdGhlIGNsb25lZCBtZXNzYWdlLgorICogXHBhcmFtIHNyYyBUaGUgbWVzc2FnZSB0aGF0IHNob3VsZCBiZSBjb3BpZWQuCisgKiBccmV0dXJuIEFuIGVycm9yIGNvZGUgb3IgQkNNX0VSUl9PSyBmb3Igc3VjY2Vzcy4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X21zZ19jbG9uZShiY21vbHRfbXNnICoqZGVzdCwgYmNtb2x0X21zZyAqc3JjKTsKKworI2VuZGlmIC8qIEJDTU9MVF9NU0dfUEFDS19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvcGNpZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGNjMThiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvTWFrZWZpbGUKQEAgLTAsMCArMSwzNSBAQAorIyBQQ0llIGRyaXZlcgorIyAtIGxvdy1sZXZlbCBQQ0llIGRyaXZlciAoc2VuZC9yeCBmdW5jdGlvbnMpCisjCitNT0RfTkFNRSA9IHBjaWUKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCitNT0RfVFlQRSA9IGxpbnV4X2xpYgorZWxzZQorTU9EX1RZUEUgPSBsaWIKK2VuZGlmCisKK01PRF9ERUZTID0gLURDSEVDS19QQVJBTQorI01PRF9ERUZTICs9IC1ESEFSRFdBUkVfVEVTVDEKKworaWZlcSAoIiQoU1VCU1lTVEVNKSIsICJlbWJlZGRlZCIpCisgICAgTU9EX0lOQ19ESVJTID0gJChTUkNfRElSKSBlbWJlZGRlZC9zeXMvZHJ2CitlbHNlCisgICAgaWZuZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorICAgICAgICBNT0RfSU5DX0RJUlMgPSAkKFNSQ19ESVIpIGhvc3QvZHJpdmVyLyQoUExBVEZPUk0pL3BjaWUKKyAgICBlbmRpZgorZW5kaWYKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK2lmbmVxICgiJChSQVdfVFJBTlNQT1JUX1ZJQV9VRFApIiwgInkiKQorICAgIHNyY3MgPSBiY210cl9wY2llLmMKK2VuZGlmCisKK1VTRV9MSU5UID0geWVzCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9wY2llL2JjbW9sdF90cl9wY2llX3NwZWNpZmljLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQxMDJiYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9wY2llL2JjbW9sdF90cl9wY2llX3NwZWNpZmljLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY210cl9wY2llLmgiCisjaW5jbHVkZSAiYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaCIKKworZXh0ZXJuIGZfYmNtdHJfaW50IGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXI7CitleHRlcm4gZl9iY210cl9pbnQgYmNtdHJfcGNpZV90eF9pcnFfaGFuZGxlcjsKK3N0YXRpYyBiY21vc19mYXN0bG9jayBpc3JfbG9jazsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG5lZWQgdG8gcGFzcyB0aHJ1IGFsbCB0aGUgZGV2aWNlcyAtIGNoZWNrIGlmIGlycSBpcyBTSEFSRUQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGJjbXRyX3J4X2lzcihpbnQgaXJxLCB2b2lkICppc3JfaW5mbykKK3sKKyAgICB1aW50MzJfdCBpc3JfcmVnOworICAgIHVpbnQzMl90IG1hc2tfcmVnOworICAgIGxvbmcgZmxhZ3M7CisgICAgaW50IGhhbmRsZWQgPSAwOworICAgIGJjbV9wY2llZF9pc3JfZGF0YSAqaXNyX2RhdGEgPSAoYmNtX3BjaWVkX2lzcl9kYXRhICopaXNyX2luZm87CisKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmlzcl9sb2NrKTsKKworICAgIGlzcl9yZWcgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QqKShpc3JfZGF0YS0+cGNpZV9yZWdfYmFzZSArIERNQV9JTlRSX1NUQVRVUykpOworICAgIG1hc2tfcmVnID0gfmJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCopKGlzcl9kYXRhLT5wY2llX3JlZ19iYXNlICsgRE1BX0lOVFJfTUFTS19TVEFUVVMpKTsKKworICAgIGlmICgoaXNyX3JlZyAmIG1hc2tfcmVnKSYgRE1BX1RYX0RPTkVfTUFTSykKKyAgICB7CisgICAgICAgIC8qIGhhbmRsZSBUWCBET05FIGludGVycnVwdCAqLworICAgICAgICBpc3JfZGF0YS0+dHhfZG9uZV9udW0rKzsKKworICAgICAgICBpZiAoYmNtdHJfcGNpZV90eF9pcnFfaGFuZGxlcikKKyAgICAgICAgICAgIGJjbXRyX3BjaWVfdHhfaXJxX2hhbmRsZXIoaXNyX2RhdGEtPmRldmljZSk7CisKKyAgICAgICAgaGFuZGxlZCA9IDE7CisgICAgfQorCisgICAgaWYgKChpc3JfcmVnICYgbWFza19yZWcgKSAmIERNQV9SWF9ET05FX01BU0spCisgICAgeworICAgICAgICAvKiBoYW5kbGUgUlggRE9ORSBpbnRlcnJ1cHQgKi8KKyAgICAgICAgaXNyX2RhdGEtPnJ4X2RvbmVfbnVtKys7CisKKyAgICAgICAgaWYgKGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXIpCisgICAgICAgICAgICBiY210cl9wY2llX3J4X2lycV9oYW5kbGVyKGlzcl9kYXRhLT5kZXZpY2UpOworCisgICAgICAgIGhhbmRsZWQgPSAxOworICAgIH0KKworICAgIGlmIChpc3JfcmVnICYgKERNQV9SWF9FUlJPUl9NQVNLIHwgRE1BX1RYX0VSUk9SX01BU0spKQorICAgIHsKKyAgICAgICAgaWYgKGlzcl9yZWcgJiBETUFfUlhfRVJST1JfTUFTSykKKyAgICAgICAgICAgIGlzcl9kYXRhLT5yeF9lcnJfbnVtKys7CisgICAgICAgIGlmIChpc3JfcmVnICYgRE1BX1RYX0VSUk9SX01BU0spCisgICAgICAgICAgICBpc3JfZGF0YS0+dHhfZXJyX251bSsrOworICAgICAgICAvKiBjbGVhciBpbnRlcnJ1cHQgZXJyb3IgaW50ZXJydXB0ICovCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigodWludDMyX3QqKShpc3JfZGF0YS0+cGNpZV9yZWdfYmFzZSArIERNQV9JTlRSX0NMRUFSKSwgRE1BX1JYX0VSUk9SX01BU0sgfCBETUFfVFhfRVJST1JfTUFTSyk7CisgICAgICAgIGhhbmRsZWQgPSAxOworICAgIH0KKworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmaXNyX2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBoYW5kbGVkOworfQorCit2b2lkIGJjbXRyX2Nvbm5lY3RfaXNyKHZvaWQgKmlzcl9pbmZvKQoreworICAgIHVpbnQzMl90ICAgIGZsYWdzID0gMDsKKworICAgIGJjbV9wY2llZF9pc3JfZGF0YSAqaXNyX2RhdGEgPSAoYmNtX3BjaWVkX2lzcl9kYXRhICopaXNyX2luZm87CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmaXNyX2xvY2ssIGZsYWdzKTsKKyAgICAvKiBjb25uZWN0IGludGVycnVwdCB0byBzeXN0ZW0gY3B1IC0gMCAqLworICAgIGJjbW9zX2ludF9jb25uZWN0KChpbnQpaXNyX2RhdGEtPnJ4X2lycSwgMCwgQkNNT1NfSVJRX1NIQVJFRCwgYmNtdHJfcnhfaXNyLCAiZG1haXNyIiwgaXNyX2RhdGEpOworfQorCisjaWZkZWYgX19LRVJORUxfXworRVhQT1JUX1NZTUJPTChiY210cl9jb25uZWN0X2lzcik7CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvcGNpZS9iY21vbHRfdHJfcGNpZV9zcGVjaWZpYy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGM4YWMxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PTFRfVFJfUENJRV9TUEVDSUZJQ19IXworI2RlZmluZSBCQ01PTFRfVFJfUENJRV9TUEVDSUZJQ19IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtdHJfcGNpZS5oIgorCisjZGVmaW5lIERFU0NSSVBUT1JfQ09OVFJPTCAgICAgIDB4MDAwNjQ0MTAgLyogVHggU29mdHdhcmUgRGVzY3JpcHRvciBMaXN0IENvbnRyb2wgYW5kIFN0YXR1cyAqLworI2RlZmluZSBXQUtFVVBfRE1BICAgICAgICAgICAgICAweDAwMDY0NDE0IC8qIFR4IFdha2UgQ29udHJvbCAqLworI2RlZmluZSBFUlJPUl9TVEFUVVMgICAgICAgICAgICAweDAwMDY0NDE4IC8qIFR4IEVuZ2luZSBFcnJvciBTdGF0dXMgKi8KKworI2RlZmluZSBJTlRSMl9QQ0lfU1RBVFVTICAgICAgICAweDAwMDY0MzE4IC8qIFBDSSBpbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgRE1BX1RYX1NXX0RFU0NfTElTVF9DVFJMX1NUU19UWF9ETUFfUlVOX1NUT1BfTUFTSyAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRE1BX1RYX1dBS0VfQ1RSTF9XQUtFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBETUFfSU5UUl9TVEFUVVMJICAgICAgICAweDAwMDY0MzE4IC8qIFBDSSBpbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9JTlRSX0NMRUFSICAgICAgICAgIDB4MDAwNjQzMjAgLyogUENJIGludGVycnVwdCBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UUl9NQVNLX1NFVCAgICAgICAweDAwMDY0MzI4IC8qIFBDSSBpbnRlcnJ1cHQgTWFzayBTZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFJfTUFTS19DTEVBUiAgICAgMHgwMDA2NDMyYyAvKiBQQ0kgaW50ZXJydXB0IE1hc2sgQ2xlYXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFJfTUFTS19TVEFUVVMgICAgMHgwMDA2NDMyNCAvKiBQQ0kgaW50ZXJydXB0IE1hc2sgJiBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBETUFfUlhfRVJST1JfTUFTSyAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERNQV9SWF9ET05FX01BU0sgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRE1BX1RYX0RPTkVfTUFTSyAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBETUFfVFhfRVJST1JfTUFTSyAgICAgICAweDAwMDAwMDAyCisKKyNkZWZpbmUgUENJRV9MMl9JTlRSX01BU0sgICAgICAgMHgwMDAwMDAyMCAvKiBMMiBpbnRlcnJ1cHQgYml0IGluIEwxIGludGVycnVwdCBzdGF0dXMgKi8KKworI2RlZmluZSBETUFfSU5UUjFfU1RBVFVTICAgICAgICAweDAwMDY5MzAwIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFIxX01BU0tfQ0xFQVIgICAgMHgwMDA2OTMwYyAvKiBJbnRlcnJ1cHQgTWFzayBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UUjFfTUFTS19TRVQgICAgICAweDAwMDY5MzA4IC8qIEludGVycnVwdCBNYXNrIFNldCBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UQV9NQVNLICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERNQV9JTlRBX1NISUZUICAgICAgICAgIDEKKyNkZWZpbmUgUENJRV9TVEFUVVNfT0ZGU0VUICAgICAgMHgwMDA2NDA2OCAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfUENJRV9TVEFUVVMgKi8KKwordm9pZCBiY210cl9jb25uZWN0X2lzcih2b2lkICppc3JfaW5mbyk7CisKKy8qIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgZGVzdCBQRCwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIHNvdXJjZSBmaWVsZCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3NldF9kZXN0X2J1ZmZlcl9hZGRyZXNzKHVpbnQzMl90ICpwZCwgdm9pZCAqdmFsdWUpCit7CisgICAgdWludDY0X3QgdG1wID0gYmNtb3NfdmlydF90b19waHlzKHZhbHVlKTsKKworICAgIGJjbV9wY2lfd3JpdGUzMigmcGRbUENJX1BBQ0tFVF9MT1dfSU5ERVhdLCAgKHVpbnQzMl90KSggdG1wICYgMHhmZmZmZmZmZlVMKSk7CisgICAgYmNtX3BjaV93cml0ZTMyKCZwZFtQQ0lfUEFDS0VUX0hJR0hfSU5ERVhdLCAodWludDMyX3QpKCh0bXAgPj4gMzIpICYgMHhmZmZmZmZmZlVMKSk7Cit9CisKKy8qIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgZGVzdCBQRCwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIHNvdXJjZSBmaWVsZCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3NldF9zb3VyY2VfYnVmZmVyX2FkZHJlc3ModWludDMyX3QgKnBkLCB2b2lkICp2YWx1ZSkKK3sKKyAgICB1aW50NjRfdCB0bXAgPSBiY21vc192aXJ0X3RvX3BoeXModmFsdWUpOworCisgICAgYmNtX3BjaV93cml0ZTMyKCZwZFtQQ0lfUEFDS0VUX0xPV19JTkRFWF0sICAodWludDMyX3QpKCB0bXAgJiAweGZmZmZmZmZmVUwpKTsKKyAgICBiY21fcGNpX3dyaXRlMzIoJnBkW1BDSV9QQUNLRVRfSElHSF9JTkRFWF0sICh1aW50MzJfdCkoKHRtcCA+PiAzMikgJiAweGZmZmZmZmZmVUwpKTsKK30KKworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY210cl9jcmVhdGVfdHVfcmluZ3ModWludDMyX3QgdHhsZW5ndGgsIHVpbnQzMl90IHJ4bGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnR4cHRyLCB2b2lkICoqcnhwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqdHhwdHJfb3JpZywgdm9pZCAqKnJ4cHRyX29yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBjaWVfcmVnX2Jhc2UpCit7CisgICAgKnR4cHRyICAgICAgPSBOVUxMOworICAgICpyeHB0cl9vcmlnID0gTlVMTDsKKyAgICAqdHhwdHIgICAgICA9IE5VTEw7CisgICAgKnJ4cHRyX29yaWcgPSBOVUxMOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtdHJfcGNpZV9zcGVjaWZpY19pbml0KHVuc2lnbmVkIGxvbmcgcGNpZV9yZWdfYmFzZSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY210cl9wY2llX2ZyZWVfcmluZ3ModWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqdHhfcHRyLCB1aW50MzJfdCAqIHJ4X3B0cil7fQorc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3BjaWVfZnJlZV9pcnEodWludDMyX3QgaXJxLCB2b2lkICpwcml2KQoreworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgYmNtb3NfaW50X2Rpc2Nvbm5lY3QoKGludClpcnEsIHByaXYpOworI2VuZGlmCit9CisKKyNkZWZpbmUgVFhfTE9DS0RFRiAgICAgICAgIGJjbW9zX211dGV4ICB0eF9sb2NrOworI2RlZmluZSBDUkVBVEVfVFhMT0NLKGkpICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZiY210cl9wY2llX2RhdGFbaV0udHhfbG9jaywgMCwgTlVMTCkKKyNkZWZpbmUgREVTVFJPWV9UWExPQ0soaSkgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmJjbXRyX3BjaWVfZGF0YVtpXS50eF9sb2NrKQorI2RlZmluZSBMT0NLX1RYKCkgICAgICAgICAgYmNtb3NfbXV0ZXhfbG9jaygmY3VycmVudF9kZXZpY2UtPnR4X2xvY2spCisjZGVmaW5lIFVOTE9DS19UWCgpICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmN1cnJlbnRfZGV2aWNlLT50eF9sb2NrKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtdHJfcGNpZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtdHJfcGNpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YjU3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvcGNpZS9iY210cl9wY2llLmMKQEAgLTAsMCArMSwxMjU2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworI2luY2x1ZGUgImJjbXRyX3BjaWUuaCIKKyNpbmNsdWRlICJiY21vbHRfdHJfcGNpZV9zcGVjaWZpYy5oIgorCisKKy8qCisgICAgU3luY2hyb25pemF0aW9uIGZsb3cgb2YgRE1BIGRhdGEgYmFzZSBiZXR3ZWVuIEhvc3QgYW5kIE1hcGxlCisgICAgVGhlIHByb2Nlc3MgdGFrZXMgcGxhY2UgYWZ0ZXIgTWFwbGUgaXMgbG9hZGVkIGFuZCBydW4gZnJvbSBERFIuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBIb3N0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcGxlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIHdyaXRlIHRvIFNSQU0gaXRzIFRYIGFuZCBSWCBxdWV1ZSBzaXplCisgICAgd3JpdGUgdG8gU1JBTSBERFJfRklOSVNIIGluZGljYXRpb24KKyAgICB3YWl0IGZvciBQUk1fQklUIGZyb20gTWFwbGUgICAgICAgICAgICAgICAgICAgICAgcnVuIGZyb20gRERSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBmcm9tIFNSQU0gaG9zdCB0eCBhbmQgcnggcXVldWUgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxscyBwcmVfY29ubmVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSB0byBTUkFNIG9wYXF1ZSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIHRvIFNSQU0gUFJNX0JJVAorICAgIHJlYWQgZnJvbSBTUkFNIG9wYXF1ZSBkYXRhICAgICAgICAgICAgICAgICAgICAgICBjYWxscyBjb25uZWN0CisgICAgY2xlYXIgUFJNX0JJVCBmcm9tIE1hcGxlICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQgZm9yIFBSTV9CSVQgZnJvbSBIb3N0CisgICAgY2FsbHMgcHJlX2Nvbm5lY3QKKyAgICBjYWxscyBjb25uZWN0CisgICAgd3JpdGUgdG8gU1JBTSBQUk1fQklUCisgICAgcmVnaXN0ZXIgcnggaW50ZXJydXB0IGhhbmRsZXIgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHJ4IGludGVycnVwdCBoYW5kbGVyCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICBCb3RoIHJlYWR5IHRvIHNlbmQvcmVjZWl2ZSBwYWNrZXRzIHRocnUgRE1BOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLyogbWlzYyBsb2NhbF9iZCBpbmZvIHN0cnVjdHVyZQorIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCit8X19fMzEgLSAyNV9fX19ffCAgIDI0ICB8X19fXzIzIC0xNl9fX19ffF9fX18xNS0wX19fX198Cit8X19yZXNlcnZlZF9fX19ffF9fT1dOX198X19fY2hhbmFsIElEX19ffF9fX19sZW5ndGhfX198CisKKyovCisjZGVmaW5lIEJDTV9QQ0lFRF9CRF9PV05FUlNISVBfU0hJRlQgICAgICAgIDI0CisjZGVmaW5lIEJDTV9QQ0lFRF9CRF9PV05FUlNISVBfTUFTSyAgICAgICAgICgweDFVTCA8PCBCQ01fUENJRURfQkRfT1dORVJTSElQX1NISUZUKQorCisjZGVmaW5lIEJDTV9QQ0lFRF9CRF9DSEFOTkVMX0lEX1NISUZUICAgICAgIDE2CisjZGVmaW5lIEJDTV9QQ0lFRF9CRF9DSEFOTkVMX0lEX01BU0sgICAgICAgICgweGZmVUwgPDwgQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfU0hJRlQpCisKKyNkZWZpbmUgQkNNX1BDSUVEX0JEX1BLVF9MRU5HVEhfTUFTSyAgICAgICAgMHhmZmZmCisKKy8qIGxlbmd0aF9hbmRfaXNyZW5hYmxlICovCisjZGVmaW5lIEJDTV9QQ0lFRF9JTlRSX0VOQUJMRV9TSElGVCAgICAgICAgIDMxCisjZGVmaW5lIEJDTV9QQ0lFRF9JTlRSX0VOQUJMRV9NQVNLICAgICAgICAgICgweDFVTCA8PCBCQ01fUENJRURfSU5UUl9FTkFCTEVfU0hJRlQpCisKKyNkZWZpbmUgQkNNX1BDSUVEX1RSQU5TRkVSX1NJWkVfTUFTSyAgICAgICAgMHgwMWZmZmZmZlVMCisjZGVmaW5lIEJDTV9QQ0lFRF9UUkFOU0ZFUl9TSVpFX1NISUZUICAgICAgIDAKKworLyogbGFzdF9uZXh0X2luZGljYXRvciAqLworI2RlZmluZSBCQ01fUENJRURfTEFTVF9SRUNPUkRfU0hJRlQgICAgICAgICAzMQorI2RlZmluZSBCQ01fUENJRURfTEFTVF9SRUNPUkRfTUFTSyAgICAgICAgICAoMHgxVUwgPDwgQkNNX1BDSUVEX0xBU1RfUkVDT1JEX1NISUZUKQorCisKKyNkZWZpbmUgQkNNX1BDSUVEX05FWFRfQ09OVElOT1VTX1NISUZUICAgICAgMgorI2RlZmluZSBCQ01fUENJRURfTkVYVF9DT05USU5PVVNfTUFTSyAgICAgICAoMHgxVUwgPDwgQkNNX1BDSUVEX05FWFRfQ09OVElOT1VTX1NISUZUKQorCisjZGVmaW5lIEJDTV9QQ0lFX0FMTF9ETUFfSU5URVJSVVBUU19NQVNLICAgIChETUFfUlhfRE9ORV9NQVNLIHwgRE1BX1JYX0VSUk9SX01BU0sgfCBETUFfVFhfRE9ORV9NQVNLIHwgRE1BX1RYX0VSUk9SX01BU0spCisKKy8qIHBhY2tldCBkZXNjcmlwdG9yIC0gdXNlZCBieSBIVyBETUEgbWVjaGFuaXNtICwgZGVmaW5lZCBieSBIVyBkbyBub3QgY2hhbmdlIGl0ICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90ICAgIGRkcl9idWZmX2FkZHJlc3NfbG93OyAgIC8qIE1hcGxlIGFkZHJlc3MgLSB3b3JkWzBdKi8KKyAgICB1aW50MzJfdCAgICBwY2llX3BrdF9hZGRyZXNzX2xvdzsgICAvKiBIb3N0IGFkZHJlc3MgIC0gd29yZFsxXSovCisgICAgdWludDMyX3QgICAgcGNpZV9wa3RfYWRkcmVzc19oaWdoOyAgLyogICAgICAgICAgICAgICAtIHdvcmRbMl0qLworICAgIHVpbnQzMl90ICAgIGxlbmd0aF9hbmRfaXNyZW5hYmxlOyAgIC8qIGJpdCAzMSAtIGludGVycnVwdCBlbmFibGU7IGJpdHMgMjQ6MiAtIHRyYW5zZmVyIGxlbmd0aCAqLworICAgIHVpbnQzMl90ICAgIGxhc3RfbmV4dF9pbmRpY2F0b3I7ICAgIC8qIGJpdCAzMSAtIGxhc3QgaW5kaWNhdG9yOyBiaXQgMzAgLSBkaXJlY3Rpb247IGJpdCAyIC0gbmV4dCBkZXNjcmlwdG9yLCBpZiAxIC0+IGNvbnRpbnVvdXMgKi8KKyAgICB1aW50MzJfdCAgICBuZXh0X3BkX2FkZHJlc3NfbG93OworICAgIHVpbnQzMl90ICAgIG5leHRfcGRfYWRkcmVzc19oaWdoOworICAgIHVpbnQzMl90ICAgIGRkcl9idWZmX2FkZHJlc3NfaGlnaDsgIC8qICAgICAgICAgICAgICAgLSB3b3JkWzddKi8KK30gYmNtX3BjaWVkX3BkOworCisvKiB0cmFuc2ZlciB1bml0IGZvciBUWC9SWCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21fcGNpZWRfcGQgICAgZGF0YV9wZDsgICAgICAgICAgICAvKiBQRCB1c2VkIHRvIHRyYW5zZmVyIGRhdGEgcGFja2V0ICovCisgICAgYmNtX3BjaWVkX3BkICAgIHJlbW90ZV90b19sb2NhbF9wZDsgLyogUEQgdXNlZCB0byB0cmFuc2ZlciBzaGFkb3dfcmJkIGZpZWxkIGZyb20gbG9jYWwgQ1BVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGxvY2FsX2JkIGZpZWxkIG9uIHBlZXIgQ1BVICAgKi8KK30gYmNtX3BjaWVkX3R1OworCisvKiBvcGFxdWUgZGF0YSwgaW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHNlbnQgZnJvbSB0aGUgTWFwbGUgdG8gSG9zdCBvbmx5LgorICAgUHJvdmlkZSBvZmZzZXRzIGZyb20gdGhlIHN0YXJ0IG9mIE1hcGxlIEREUiB3aW5kb3cgZm9yIHR4IGFuZCByeCBUVSByaW5ncyAod2hlcmUgdHggYW5kIHJ4IHJpbmdzIGluIHRlcm0gb2YgSG9zdCkKKyovCitzdHJ1Y3QgYmNtdHJfcGNpZV9vcGFxdWVfZGF0YQoreworICAgIHVpbnQzMl90ICAgIHR4X3R1X3Jpbmdfb2Zmc2V0OworICAgIHVpbnQzMl90ICAgIHJ4X3R1X3Jpbmdfb2Zmc2V0OworfTsKKworLyogbWFpbiBzdHJ1Y3R1cmUgb2YgdGhlIGRyaXZlciAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21fcGNpZWRfdHUgICAgICAgICp0eF90dV9yaW5nOyAgICAgICAgLyogVFggRE1BIHJpbmcgKi8KKyAgICBiY21fcGNpZWRfdHUgICAgICAgICpyeF90dV9yaW5nOyAgICAgICAgLyogUlggRE1BIHJpbmcgKi8KKworICAgIHVpbnQzMl90ICAgICAgICAgICAgKmxvY2FsX2JkOyAgICAgICAgICAvKiB1c2VkIGZvciByZWNlaXZlLCB1cGRhdGVkIGJ5IHBlZXIgaW4gdHggKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgICpzaGFkb3dfcmJkOyAgICAgICAgIC8qIHVzZWQgYnkgbG9jYWwgaW4gdHggYXMganVzdCBidWZmZXIgZm9yIHVwZGF0ZSByZW1vdGUgbG9jYWxfYmQgKi8KKworICAgIHVpbnQzMl90ICAgICAgICAgICAgKnR4X293bmVyOyAgICAgICAgICAvKiB1c2VkIGZvciBsb2NhbCBpbiB0eCBmb3IgbG9va3VwIHRoYXQgdHUgbWluZSwgdXBkYXRlZCBieSBsb2NhbCBhbmQgcGVlciAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgKnBlZXJfdHhfb3duZXI7ICAgICAvKiB1c2VkIGluIHJ4IGZvciB1cGRhdGUgdHhfb3duZXIgb2YgdGhlIHJlbW90ZSovCisKKyAgICBiY21vc19idWYgICAgICAgICAgICoqdHhfbmJ1ZmZfc2F2ZTsgICAgLyogYXJyYXkgb2YgbmV0d29yayBidWZmZXJzIHBvaW50ZXJzLCB1c2VkIGJ5IFRYLCB0byBzdG9yZSBzZW50IGJ1ZmZlcnMgKi8KKyAgICBiY21vc19idWYgICAgICAgICAgICoqcnhfbmJ1ZmZfc2F2ZTsgICAgLyogYXJyYXkgb2YgbmV0d29yayBidWZmZXJzIHBvaW50ZXJzLCB1c2VkIGJ5IFJYLCB0byBzdG9yZSBhbGxvY2F0ZWQgZm9yIHJ4IGJ1ZmZlcnMgKi8KKworICAgIHVpbnQzMl90ICAgICAgICAgICAgY3VycmVudF90eDsgICAgICAgICAvKiBpbmRleCBvZiBjdXJyZW50IHR4IHR1ICovCisgICAgdWludDMyX3QgICAgICAgICAgICBjb25mX3R4OyAgICAgICAgICAgIC8qIGluZGV4IG9mIHRoZSBsYXN0IHJlY2xhaW1lZCB0eCB0dSAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgY3VycmVudF9yeDsgICAgICAgICAvKiBpbmRleCBvZiBjdXJyZW50IHJ4IHR1ICovCisgICAgaW50MzJfdCAgICAgICAgICAgICBwcmV2X3R4OworCisgICAgdWludDMyX3QgICAgICAgICAgICBtYXhfdHhfaW5kZXg7CisgICAgdWludDMyX3QgICAgICAgICAgICBtYXhfcnhfaW5kZXg7CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1heF9tdHU7CisKKyAgICB1bnNpZ25lZCBsb25nICAgICAgIGRkcl93aW5fYmFzZTsKKyAgICBiY21fcGNpZWRfaXNyX2RhdGEgIGlzcmRhdGE7ICAgICAgICAgICAgLyogaW5jbHVkZXMgcGNpZSByZWdpc3RlciBiYXNlLCBpZCBhbmQgaXJxIG51bWJlciAqLworCisgICAgVFhfTE9DS0RFRgorCisgICAgLyogY291bnRlcnMgICovCisgICAgdWludDMyX3QgICAgICAgICAgICByeF9jb3VudGVyOworICAgIHVpbnQzMl90ICAgICAgICAgICAgdHhfY291bnRlcjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJ4X3BjaWVfZW1wdHlfY291bnRlcjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHR4X3BjaWVfZnVsbF9jb3VudGVyOworCisgICAgLyogc2F2ZWQgbWV0YS1kYXRhICovCisgICAgdWludDMyX3QgICAgICAgICAgICB0eHFfbGVuZ3RoOworICAgIHVpbnQzMl90ICAgICAgICAgICAgcnhxX2xlbmd0aDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICp0eF90dV9yaW5nX29yaWc7ICAgLyogVFggRE1BIHJpbmcgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgICpyeF90dV9yaW5nX29yaWc7ICAgLyogUlggRE1BIHJpbmcgKi8KKworfSBiY21fcGNpZWRfY29tbV9kYXRhOworCitmX2JjbXRyX2ludCBiY210cl9wY2llX3J4X2lycV9oYW5kbGVyOworZl9iY210cl9pbnQgYmNtdHJfcGNpZV90eF9pcnFfaGFuZGxlcjsKKworc3RhdGljIHZvaWQgZGVmYXVsdF90eF9kb25lX2NhbGxiYWNrKHVpbnQ4X3QgZGV2aWNlLCBiY21vc19idWYgKmJ1Zik7CisKK3N0YXRpYyBmX2JjbXRyX2RvbmUgdHhfZG9uZV9oYW5kbGVyID0gZGVmYXVsdF90eF9kb25lX2NhbGxiYWNrOworCisvKiB1c2VkIGZvciBlcnJvciBtZXNzYWdlcyAqLworI2lmIGRlZmluZWQoX19LRVJORUxfXykKKyNkZWZpbmUgcGNpZV9wcmludChmbXQsIGFyZ3MuLi4pIHByaW50aygiJXM6ICVkOiAiIGZtdCwgX19GVU5DVElPTl9fICwgX19MSU5FX18sICMjYXJncykKKyNlbHNlCisjZGVmaW5lIHBjaWVfcHJpbnQgYmNtb3NfcHJpbnRmCisjZW5kaWYKKworI2RlZmluZSBMT0NBTF9PV05FUiAgICAgICAgICAgMAorI2RlZmluZSBSRU1PVEVfT1dORVIgICAgICAgICAgMQorCisjZGVmaW5lIElOQ1JFTUVOVF9SRUNFSVZFRChkZXZpY2UpICAgICAgYmNtdHJfcGNpZV9kYXRhW2RldmljZV0ucnhfY291bnRlcisrCisjZGVmaW5lIElOQ1JFTUVOVF9UUkFOU01JVEVEKGRldmljZSkgICAgYmNtdHJfcGNpZV9kYXRhW2RldmljZV0udHhfY291bnRlcisrCisKKy8qIHNldCBuZXh0IGluZGV4IGludG8gYSBETUEgcmluZyAqLworI2RlZmluZSBORVhUX0lOREVYKG1heGluZGV4LCBpbmRleCkgXAorZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluZGV4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChpbmRleCA+IG1heGluZGV4KSAgICAgICAgICAgXAorICAgICAgICBpbmRleCA9IDA7ICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisvKiBjYWxjdWxhdGUgcmVnaXN0ZXIgYWRkcmVzcyBhY2NvcmRpbmcgdG8gcmVnaXN0ZXJzJ2Jhc2UgYW5kIG9mZnNldCAqLworI2RlZmluZSBQQ0lfUkVHX0FERFJFU1MocmVnKSAgICAgICAgICAgICAgICh1aW50MzJfdCAqKShiY210cl9wY2llX2RhdGFbZGV2aWNlXS5pc3JkYXRhLnBjaWVfcmVnX2Jhc2UgKyByZWcpCisKKy8qIEp1c3QgZm9yIGF2b2lkIG9mIHVzaW5nIHRoaXMgIkJDTV9FUlJfT0siICBzdHVwaWQgIGRlZmluZSAsIGkgY2FuIG5vdCB1bmRlcnN0YW5kIGhvdyAiZXJyb3IiIGNhbiBiZSAib2siIChELkIuKSAqLworI2RlZmluZSBCQ01UUl9TVUNDRVNTICBCQ01fRVJSX09LCisKKyNkZWZpbmUgQkNNVFJfUEFSQU5PSURfQ0hFQ0soKSAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghYmNtdHJfcGNpZV9kYXRhKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOyAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZGV2aWNlID49IGJjbXRyX21heF9kZXZpY2VzX251bWJlcilcCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfVFlQRSh0KSAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghYmNtdHJfcGNpZV9kYXRhKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiAodClCQ01fRVJSX05PUkVTOyAgICAgICAgICAgXAorICAgICAgICBpZiAoZGV2aWNlID49IGJjbXRyX21heF9kZXZpY2VzX251bWJlcilcCisgICAgICAgICAgICByZXR1cm4gKHQpQkNNX0VSUl9SQU5HRTsgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfRVhUKCkgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghYmNtdHJfcGNpZV9kYXRhKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOyAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZGV2aWNlID49IGJjbXRyX21heF9kZXZpY2VzX251bWJlcilcCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFiY210cl9wY2llX2RhdGFbZGV2aWNlXS5pc3JkYXRhLnBjaWVfcmVnX2Jhc2UpXAorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7ICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorCisgICAgLyogZGV2aWNlIGRhdGEgYXJyYXkgKi8KK3N0YXRpYyBiY21fcGNpZWRfY29tbV9kYXRhICpiY210cl9wY2llX2RhdGE7CisKK3N0YXRpYyB1aW50MzJfdCBiY210cl9tYXhfZGV2aWNlc19udW1iZXI7CisKKy8qIHN0b3Agb25lIGRtYSBlbmdpbmUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX2RtYSh1aW50OF90IGRldmljZSkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIHZhbHVlID0gYmNtX3BjaV9yZWFkMzIoUENJX1JFR19BRERSRVNTKCh1aW50MzJfdClERVNDUklQVE9SX0NPTlRST0wpKTsKKyAgICB2YWx1ZSAmPSB+RE1BX1RYX1NXX0RFU0NfTElTVF9DVFJMX1NUU19UWF9ETUFfUlVOX1NUT1BfTUFTSzsKKyAgICBiY21fcGNpX3dyaXRlMzIoUENJX1JFR19BRERSRVNTKERFU0NSSVBUT1JfQ09OVFJPTCksIHZhbHVlKTsKK30KKworLyogRGVmYXVsdCB0eC1kb25lIGNhbGxiYWNrICovCitzdGF0aWMgdm9pZCBkZWZhdWx0X3R4X2RvbmVfY2FsbGJhY2sodWludDhfdCBkZXZpY2UsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIGJjbW9zX2ZyZWUoYnVmKTsKK30KKworLyogZnJlZSBhbGwgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KK3N0YXRpYyBiY21vc19lcnJubyBmcmVlX2J1ZmZlcnModWludDhfdCBkZXZpY2UsIGNvbnN0IGNoYXIgKmVycm9yX3N0cmluZykKK3sKKyAgICB1aW50MzJfdCBpOworICAgIGJjbV9wY2llZF9jb21tX2RhdGEgKmN1cnJlbnRfZGV2aWNlID0gJmJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdOworCisgICAgcGNpZV9wcmludCgiJXMiLCBlcnJvcl9zdHJpbmcpOworCisgICAgaWYgKGN1cnJlbnRfZGV2aWNlLT5yeF9uYnVmZl9zYXZlKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZVtpXSkKKyAgICAgICAgICAgICAgICBiY21vc19idWZfZnJlZShjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgYmNtb3NfZnJlZShjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZSk7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRfZGV2aWNlLT50eF9uYnVmZl9zYXZlKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfZGV2aWNlLT50eHFfbGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtpXSkKKyAgICAgICAgICAgICAgICBiY21vc19idWZfZnJlZShjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgYmNtb3NfZnJlZShjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZSk7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZCkKKyAgICAgICAgYmNtb3NfZG1hX2ZyZWUoZGV2aWNlLCBjdXJyZW50X2RldmljZS0+bG9jYWxfYmQpOworCisgICAgaWYgKGN1cnJlbnRfZGV2aWNlLT5zaGFkb3dfcmJkKQorICAgICAgICBiY21vc19kbWFfZnJlZShkZXZpY2UsIGN1cnJlbnRfZGV2aWNlLT5zaGFkb3dfcmJkKTsKKworICAgIERFU1RST1lfVFhMT0NLKGRldmljZSk7CisKKyAgICBiY210cl9wY2llX2ZyZWVfcmluZ3MoZGV2aWNlLCBjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZ19vcmlnLCBjdXJyZW50X2RldmljZS0+cnhfdHVfcmluZ19vcmlnKTsKKworICAgIG1lbXNldCgmYmNtdHJfcGNpZV9kYXRhW2RldmljZV0sIDAsIHNpemVvZihiY21fcGNpZWRfY29tbV9kYXRhKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKK30KKworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9pbml0KHVpbnQ4X3QgbWF4X2RldmljZXMpCit7CisgICAgYmNtdHJfbWF4X2RldmljZXNfbnVtYmVyID0gbWF4X2RldmljZXM7CisKKyAgICBiY210cl9wY2llX2RhdGEgPSAoYmNtX3BjaWVkX2NvbW1fZGF0YSAqKWJjbW9zX2NhbGxvYyhiY210cl9tYXhfZGV2aWNlc19udW1iZXIgKiBzaXplb2YoYmNtX3BjaWVkX2NvbW1fZGF0YSkpOworICAgIGlmICghYmNtdHJfcGNpZV9kYXRhKQorICAgIHsKKyAgICAgICAgcGNpZV9wcmludCgiRHJpdmVyIGNhbm5vdCBiZSBpbml0aWFsaXplZFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3ByZV9jb25uZWN0KHVpbnQ4X3QgZGV2aWNlLCBjb25zdCBiY210cl9wY2llX3ByZV9jb25uZWN0X2NmZyAqY2ZnLCBiY210cl9wY2llX29wYXF1ZV9kYXRhICpvcGFxdWVfZGF0YSkKK3sKKyAgICBiY21fcGNpZWRfY29tbV9kYXRhICpjdXJyZW50X2RldmljZTsKKyAgICBiY21vc19lcnJubyAgICAgICAgIHJldF9jb2RlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgaTsKKworICAgIEJDTVRSX1BBUkFOT0lEX0NIRUNLKCk7CisKKyAgICBpZiAoIWNmZykKKyAgICB7CisgICAgICAgIHBjaWVfcHJpbnQoIlNlY29uZCBwYXJhbWV0ZXIoY29uZmlnKSBpcyBOVUxMIHBvaW50ZXJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OVUxMOworICAgIH0KKworICAgIGlmICghb3BhcXVlX2RhdGEpCisgICAgeworICAgICAgICBwY2llX3ByaW50KCJSZXR1cm4gYXJlYSBwb2ludGVyKFRoaXJkIHBhcmFtZXRlcikgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05VTEw7CisgICAgfQorCisgICAgY3VycmVudF9kZXZpY2UgPSAmYmNtdHJfcGNpZV9kYXRhW2RldmljZV07CisKKyAgICBDUkVBVEVfVFhMT0NLKGRldmljZSk7CisKKyAgICAvKiBjb3B5IHVzZXIncyBkYXRhIHRvIGludGVybmFsIGRhdGEgYmFzZSAqLworICAgIGN1cnJlbnRfZGV2aWNlLT50eHFfbGVuZ3RoICAgICAgICAgICAgICA9IGNmZy0+dHhxX3NpemU7CisgICAgY3VycmVudF9kZXZpY2UtPnJ4cV9sZW5ndGggICAgICAgICAgICAgID0gY2ZnLT5yeHFfc2l6ZTsKKyAgICBjdXJyZW50X2RldmljZS0+bWF4X3R4X2luZGV4ICAgICAgICAgICAgPSBjZmctPnR4cV9zaXplIC0gMTsKKyAgICBjdXJyZW50X2RldmljZS0+bWF4X3J4X2luZGV4ICAgICAgICAgICAgPSBjZmctPnJ4cV9zaXplIC0gMTsKKyAgICBjdXJyZW50X2RldmljZS0+bWF4X210dSAgICAgICAgICAgICAgICAgPSBjZmctPm1heF9tdHU7CisgICAgY3VycmVudF9kZXZpY2UtPmlzcmRhdGEuZGV2aWNlICAgICAgICAgID0gZGV2aWNlOworICAgIGN1cnJlbnRfZGV2aWNlLT5pc3JkYXRhLnJ4X2lycSAgICAgICAgICA9IGNmZy0+cnhfaXJxOworICAgIGN1cnJlbnRfZGV2aWNlLT5pc3JkYXRhLnBjaWVfcmVnX2Jhc2UgICA9IGNmZy0+cGNpZV9yZWdfYmFzZTsKKyAgICBjdXJyZW50X2RldmljZS0+ZGRyX3dpbl9iYXNlICAgICAgICAgICAgPSBjZmctPmRkcl93aW5fYmFzZTsKKyAgICBjdXJyZW50X2RldmljZS0+cHJldl90eCAgICAgICAgICAgICAgICAgPSAtMTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIGFsbG9jYXRlIGRhdGEgYmFzZSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqLworCisgICAgYmNtdHJfcGNpZV9zcGVjaWZpY19pbml0KGN1cnJlbnRfZGV2aWNlLT5pc3JkYXRhLnBjaWVfcmVnX2Jhc2UpOworCisgICAgcmV0X2NvZGUgPSAgYmNtdHJfY3JlYXRlX3R1X3JpbmdzKGN1cnJlbnRfZGV2aWNlLT50eHFfbGVuZ3RoLCBjdXJyZW50X2RldmljZS0+cnhxX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikmY3VycmVudF9kZXZpY2UtPnR4X3R1X3JpbmcsICh2b2lkICoqKSZjdXJyZW50X2RldmljZS0+cnhfdHVfcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikmY3VycmVudF9kZXZpY2UtPnR4X3R1X3Jpbmdfb3JpZywgKHZvaWQgKiopJmN1cnJlbnRfZGV2aWNlLT5yeF90dV9yaW5nX29yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9kZXZpY2UtPmlzcmRhdGEucGNpZV9yZWdfYmFzZSk7CisgICAgaWYgKHJldF9jb2RlICE9IEJDTVRSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBwY2llX3ByaW50KCJGYWlsZWQgdG8gY3JlYXRlIHRyYW5zZmVyIHVuaXQgcmluZ3MgOiAoZXJyb3I9JWQpXG4iLHJldF9jb2RlKTsKKyAgICAgICAgcmV0dXJuIHJldF9jb2RlOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIGFycmF5IG9mIGxvY2FsX2JkIGZvciBSWCBjaGFpbiAqLworICAgIGN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZCA9ICh1aW50MzJfdCAqKWJjbW9zX2RtYV9hbGxvYyhkZXZpY2UsIHNpemVvZigqY3VycmVudF9kZXZpY2UtPmxvY2FsX2JkKSAqIGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoKTsKKyAgICBpZiAoIWN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZCkKKyAgICAgICAgcmV0dXJuIGZyZWVfYnVmZmVycyhkZXZpY2UsICJGYWlsZWQgdG8gYWxsb2NhdGUgbG9jYWxfYmQgZm9yIFJYIHJpbmdcbiIpOworCisgICAgIC8qIHNldCByZW1vdGUgc2lkZSBhcyBvd25lciBmb3IgYWxsIGxvY2FsX2JkICovCisgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoOyBpKyspCisgICAgICAgICoodWludDMyX3QqKSgmY3VycmVudF9kZXZpY2UtPmxvY2FsX2JkW2ldKT0KKyAgICAgICAgICAgIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UzMigodWludDMyX3QpKFJFTU9URV9PV05FUiA8PCBCQ01fUENJRURfQkRfT1dORVJTSElQX1NISUZUKSk7CisKKyAgICAvKiBhbGxvY2F0ZSBhcnJheSBvZiBsb2NhbF9iZCBmb3IgVFggY2hhaW4gKi8KKyAgICBjdXJyZW50X2RldmljZS0+c2hhZG93X3JiZCA9ICh1aW50MzJfdCAqKWJjbW9zX2RtYV9hbGxvYyhkZXZpY2UsIHNpemVvZigqY3VycmVudF9kZXZpY2UtPnNoYWRvd19yYmQpICogY3VycmVudF9kZXZpY2UtPnR4cV9sZW5ndGgpOworICAgIGlmICghY3VycmVudF9kZXZpY2UtPnNoYWRvd19yYmQgKQorICAgICAgIHJldHVybiAgZnJlZV9idWZmZXJzKGRldmljZSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzaGFkb3dfcmJkIGZvciBUWCByaW5nXG4iKTsKKyAgICAvKiBjbGVhciBhbGwgc2hhZG93X3JiZCAsIGFjdHVhbHkgbm8gbmVlZCBidXQgc3VhdGJsZSBmb3IgZGVidWdnaW5nICovCisgICAgbWVtc2V0KGN1cnJlbnRfZGV2aWNlLT5zaGFkb3dfcmJkLCAwLCBzaXplb2YoKmN1cnJlbnRfZGV2aWNlLT5zaGFkb3dfcmJkKSAqIGN1cnJlbnRfZGV2aWNlLT50eHFfbGVuZ3RoKTsKKworICAgIC8qIGFsbG9jYXRlIG5ldG93cmsgYnVmZmVyIHBvaW50ZXJzIGFycmFpZXMgKi8KKyAgICBjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZSA9IChiY21vc19idWYqKiliY21vc19jYWxsb2Moc2l6ZW9mKGJjbW9zX2J1ZiopICogY3VycmVudF9kZXZpY2UtPnR4cV9sZW5ndGgpOworICAgIGlmICghY3VycmVudF9kZXZpY2UtPnR4X25idWZmX3NhdmUpCisgICAgICAgIHJldHVybiBmcmVlX2J1ZmZlcnMoZGV2aWNlLCJGYWlsZWQgdG8gYWxsb2NhdGUgYXJyYXkgZm9yIFRYIGJ1ZmZlcnMgcG9pbnRlcnNcbiIpOworCisgICAgY3VycmVudF9kZXZpY2UtPnJ4X25idWZmX3NhdmUgPSAoYmNtb3NfYnVmKiopYmNtb3NfY2FsbG9jKHNpemVvZihiY21vc19idWYqKSAqIGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoKTsKKyAgICBpZiAoIWN1cnJlbnRfZGV2aWNlLT5yeF9uYnVmZl9zYXZlKQorICAgICAgICByZXR1cm4gZnJlZV9idWZmZXJzKGRldmljZSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBhcnJheSBmb3IgUlggYnVmZmVycyBwb2ludGVyc1xuIik7CisKKyAgICAvKiB1cGRhdGUgcmV0dXJuIHZhbHVlLCBjcm9zcyB0eCBhbmQgcnggZm9yIHBlZXIKKyAgICAgICAgSWYgd2UgZG8gbm90IGFsbG9jYXRlIHRoZSBjb3JyZXNwb25kZWQgYXJlYSBqdXN0IHNlbmQgemVybyB0byBwZWVyIGZvciBpbmRpY2F0ZSBpdAorICAgICovCisgICAgaWYgKGN1cnJlbnRfZGV2aWNlLT50eF90dV9yaW5nKQorICAgICAgICBvcGFxdWVfZGF0YS0+cnhfdHVfcmluZ19vZmZzZXQgPSAodW5zaWduZWQgbG9uZyljdXJyZW50X2RldmljZS0+dHhfdHVfcmluZyAtIGN1cnJlbnRfZGV2aWNlLT5kZHJfd2luX2Jhc2U7CisKKyAgICBpZiAoY3VycmVudF9kZXZpY2UtPnJ4X3R1X3JpbmcpCisgICAgICAgIG9wYXF1ZV9kYXRhLT50eF90dV9yaW5nX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWN1cnJlbnRfZGV2aWNlLT5yeF90dV9yaW5nIC0gY3VycmVudF9kZXZpY2UtPmRkcl93aW5fYmFzZTsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX2Nvbm5lY3QodWludDhfdCBkZXZpY2UsIGNvbnN0IGJjbXRyX3BjaWVfb3BhcXVlX2RhdGEgKm9wYXF1ZV9kYXRhKQoreworICAgIHVpbnQzMl90ICAgICAgICAgICAgaTsKKyAgICBiY21fcGNpZWRfY29tbV9kYXRhICpjdXJyZW50X2RldmljZTsKKyAgICBiY21fcGNpZWRfdHUgICAgICAgICp0dV9wdHIgPSBOVUxMOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgKnBrdF9wdHI7CisKKyAgICBCQ01UUl9QQVJBTk9JRF9DSEVDSygpOworCisgICAgY3VycmVudF9kZXZpY2UgPSAmYmNtdHJfcGNpZV9kYXRhW2RldmljZV07CisKKyAgICAvKiB1cGRhdGUgbG9jYWwgdHVfcmluZ3MgcG9pbnRlcnMgLCBubyBuZWVkIGNyb3NzIHNpbmNlIHdlIGFscmVhZHkgZG8gaW4gcHJlLWNvbm5lY3QKKyAgICAgICAgdXBkYXRlIG9ubHkgbm90IHplcm8gcG9pbnRlcnMgKi8KKyAgICBpZiAoIWN1cnJlbnRfZGV2aWNlLT5yeF90dV9yaW5nKQorICAgICAgICBjdXJyZW50X2RldmljZS0+cnhfdHVfcmluZyA9IChiY21fcGNpZWRfdHUqKShvcGFxdWVfZGF0YS0+cnhfdHVfcmluZ19vZmZzZXQgKyBjdXJyZW50X2RldmljZS0+ZGRyX3dpbl9iYXNlKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBzZXQgbmV4dCB0byBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByaW5nICovCisgICAgICAgIHR1X3B0ciA9ICZjdXJyZW50X2RldmljZS0+cnhfdHVfcmluZ1tjdXJyZW50X2RldmljZS0+bWF4X3J4X2luZGV4XTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubmV4dF9wZF9hZGRyZXNzX2xvdyksICh1aW50MzJfdCliY21vc192aXJ0X3RvX3BoeXMoY3VycmVudF9kZXZpY2UtPnJ4X3R1X3JpbmcpKTsKKyAgICB9CisKKyAgICBpZiAoIWN1cnJlbnRfZGV2aWNlLT50eF90dV9yaW5nKQorICAgICAgICBjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZyA9IChiY21fcGNpZWRfdHUqKShvcGFxdWVfZGF0YS0+dHhfdHVfcmluZ19vZmZzZXQgKyBjdXJyZW50X2RldmljZS0+ZGRyX3dpbl9iYXNlKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBzZXQgbmV4dCB0byBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByaW5nICovCisgICAgICAgIHR1X3B0ciA9ICZjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZ1tjdXJyZW50X2RldmljZS0+bWF4X3R4X2luZGV4XTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubmV4dF9wZF9hZGRyZXNzX2xvdyksICh1aW50MzJfdCliY21vc192aXJ0X3RvX3BoeXMoY3VycmVudF9kZXZpY2UtPnR4X3R1X3JpbmcpKTsKKyAgICB9CisKKyAgICAvKiBub3cgYWxsIHR1X3JpbmdzIGFsbG9jYXRlZCBhbmQgc3luY2hyb25pemUgICwgdGltZSB0byBzZXQgdGhlIHR4X293bmVyIGFuZCBwZWVyX3R4X293bmVyICovCisgICAgY3VycmVudF9kZXZpY2UtPnR4X293bmVyICAgICAgPSAodWludDMyX3QqKSgodW5zaWduZWQgbG9uZyljdXJyZW50X2RldmljZS0+dHhfdHVfcmluZyArIHNpemVvZihiY21fcGNpZWRfdHUpICogY3VycmVudF9kZXZpY2UtPnR4cV9sZW5ndGgpOworICAgIGN1cnJlbnRfZGV2aWNlLT5wZWVyX3R4X293bmVyID0gKHVpbnQzMl90KikoKHVuc2lnbmVkIGxvbmcpY3VycmVudF9kZXZpY2UtPnJ4X3R1X3JpbmcgKyBzaXplb2YoYmNtX3BjaWVkX3R1KSAqIGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoKTsKKworICAgIC8qIHByZWFsbG9jYXRlIHJ4IG5ldCBidWZmZXJzICovCisgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoOyBpKyspCisgICAgeworICAgICAgICBjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZVtpXSA9IGJjbW9zX2J1Zl9hbGxvYyhjdXJyZW50X2RldmljZS0+bWF4X210dSk7CisgICAgICAgIGlmICghY3VycmVudF9kZXZpY2UtPnJ4X25idWZmX3NhdmVbaV0pCisgICAgICAgICAgICByZXR1cm4gZnJlZV9idWZmZXJzKGRldmljZSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIFJYXG4iKTsKKyAgICB9CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBPSyAsIG5vdyB3ZSBhcmUgcmVhZHkgdG8gaW5pdGlhbGl6ZSB0dV9yaW5ncworICAgIE5PVEU6IGFsbCBzdHVmZiByZWxhdGVkIHRvIGNyZWF0ZSByaW5ncyAobGFzdF9uZXh0X2luZGljYXRvcixuZXh0X3BkX2FkZHJlc3NfbG93ci9oaWdoIGFscmVhZHkKKyAgICBkb25lIGJ5IGJjbXRyX2NyZWF0ZV90dV9yaW5ncworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLypGaWxsIFRYIHJpbmcsIGZpbGwgb25seSBmaWVsZHMgd2hpY2ggSSAia25vdyIsCisgICAgIGFsbCBwZWVyIHJlbGF0ZWQgcG9pbnRlcnMgd2lsbCBiZSB1cGRhdGVkIGJ5IHBlZXIgKi8KKyAgICBmb3IgKGkgPSAwLCB0dV9wdHIgPSBjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZzsgaSA8IGN1cnJlbnRfZGV2aWNlLT50eHFfbGVuZ3RoOyBpKyssIHR1X3B0cisrKQorICAgIHsKKyAgICAgICAgLyogZmlsbCB0aGUgcmVtb3RlX3RvX2xvY2FsX3BkIC0gb25seSBsYXN0IGluZGljYXRvciAqLworICAgICAgICBpZiAoaSA9PSBjdXJyZW50X2RldmljZS0+bWF4X3R4X2luZGV4KQorICAgICAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciksIEJDTV9QQ0lFRF9MQVNUX1JFQ09SRF9NQVNLKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciksIChCQ01fUENJRURfTEFTVF9SRUNPUkRfTUFTSyB8IEJDTV9QQ0lFRF9ORVhUX0NPTlRJTk9VU19NQVNLKSk7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgZmlsbCBkYXRhX3BkCisgICAgICAgICAtIGxlYXZlIGxlbmd0aF9hbmRfaXNyZW5hYmxlIGluIHplcm8gLCB3aWxsIGJlIHNldCBkdXJpbmcgdHgKKyAgICAgICAgIC0gbGVhdmUgc291cmNlIGRhdGEgYnVmZmVyICBwb2ludGVycyBpbiB6ZXJvLCB3aWxsIGJlIHNldCBpbiBkdXJpbmcgdHgKKyAgICAgICAgIC0gZGVzdC4gZGF0YSBidWZmZXIgd2lsbCBiZSBzZXQgYnkgcGVlcgorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgIGZpbGwgcmVtb3RlX3RvX2xvY2FsX3BkCisgICAgICAgICAgICAgZGVzdC4gZGF0YSBidWZmZXIgd2lsbCBiZSBzZXQgYnkgcGVlcgorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBiY210cl9zZXRfc291cmNlX2J1ZmZlcl9hZGRyZXNzKCh1aW50MzJfdCAqKSZ0dV9wdHItPnJlbW90ZV90b19sb2NhbF9wZCwgJmN1cnJlbnRfZGV2aWNlLT5zaGFkb3dfcmJkW2ldKTsKKworICAgICAgICAvKiBzZXQgbGFzdCBpbmRpY2F0b3IgZm9yIHRoZSBjdXJyZW50IHR1ICovCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigmdHVfcHRyLT5kYXRhX3BkLmxhc3RfbmV4dF9pbmRpY2F0b3IsIEJDTV9QQ0lFRF9ORVhUX0NPTlRJTk9VU19NQVNLKTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciksIEJDTV9QQ0lFRF9ORVhUX0NPTlRJTk9VU19NQVNLKTsKKworICAgICAgICAvKiBzZXQgdGhlIGxlbmd0aCBhbmQgaW50ZXJydXB0IGluZGljYXRvciAgKi8KKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCZ0dV9wdHItPnJlbW90ZV90b19sb2NhbF9wZC5sZW5ndGhfYW5kX2lzcmVuYWJsZSwgKEJDTV9QQ0lFRF9JTlRSX0VOQUJMRV9NQVNLIHwgKHNpemVvZih1aW50MzJfdCkgPDwgQkNNX1BDSUVEX1RSQU5TRkVSX1NJWkVfU0hJRlQpKSk7CisgICAgfQorCisgICAgLypGaWxsIFJYIHJpbmcsIGZpbGwgb25seSBmaWVsZHMgd2hpY2ggSSAia25vdyIsCisgICAgIGFsbCBwZWVyIHJlbGF0ZWQgcG9pbnRlcnMgd2lsbCBiZSB1cGRhdGVkIGJ5IHBlZXIgKi8KKyAgICBmb3IgKGkgPSAwLCB0dV9wdHIgPSBjdXJyZW50X2RldmljZS0+cnhfdHVfcmluZzsgaSA8IGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoOyBpKyssIHR1X3B0cisrKQorICAgIHsKKyAgICAgICAgLyogZmlsbCB0aGUgcmVtb3RlX3RvX2xvY2FsX3BkIC0gb25seSBsYXN0IGluZGljYXRvciAqLworICAgICAgICBpZiAoaSA9PSBjdXJyZW50X2RldmljZS0+bWF4X3J4X2luZGV4KQorICAgICAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciksIEJDTV9QQ0lFRF9MQVNUX1JFQ09SRF9NQVNLKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciksIChCQ01fUENJRURfTEFTVF9SRUNPUkRfTUFTSyB8IEJDTV9QQ0lFRF9ORVhUX0NPTlRJTk9VU19NQVNLKSk7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICBmaWxsIGRhdGFfcGQKKyAgICAgICAgLSBsZWF2ZSBsZW5ndGhfYW5kX2lzcmVuYWJsZSBpbiB6ZXJvICwgd2lsbCBiZSBzZXQgIGJ5IHBlZXIgZHVyaW5nIHR4CisgICAgICAgIC0gbGVhdmUgc291cmNlIGRhdGEgYnVmZmVyICBwb2ludGVycyBpbiB6ZXJvLCB3aWxsIGJlIHNldCBieSBwZWVyIGR1cmluZyB0eAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIC8qIHRha2UgZGF0YSBwb2ludGVyICBmcm9tIG5idWYgc2F2ZWQgaW4gcnhfbmJ1ZmZfc2F2ZSovCisgICAgICAgIHBrdF9wdHIgPSBiY21vc19idWZfZGF0YShjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZVtpXSk7CisKKyAgICAgICAgLyogaW52YWxpZGF0ZSBjYWNoZSBmb3IgdGhlIGRhdGEgYnVmZmVycyAqLworICAgICAgICBiY21vc19wcmVwYXJlX2Zvcl9kbWFfcmVhZChwa3RfcHRyLCBjdXJyZW50X2RldmljZS0+bWF4X210dSk7CisKKyAgICAgICAgLyogc2V0IGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyICovCisgICAgICAgIGJjbXRyX3NldF9kZXN0X2J1ZmZlcl9hZGRyZXNzKCh1aW50MzJfdCAqKSZ0dV9wdHItPmRhdGFfcGQsIHBrdF9wdHIpOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgIGZpbGwgcmVtb3RlX3RvX2xvY2FsX3BkCisgICAgICAgICAgICAtIHJlbW90ZV90b19sb2NhbF9wZC5sZW5ndGhfYW5kX2lzcmVuYWJsZSBhbHJlYWR5IHNldCBieSBwZWVyCisgICAgICAgICAgICAtIGxhc3RfbmV4dF9pbmRpY2F0b3Igd2lsbCBiZSBzZXQgYnkgcGVlciBkdXJpbmcgdHgKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIC8qIHNldCBkZXN0aW5hdGlvbiBmb3IgdGhlIEJEICovCisgICAgICAgIGJjbXRyX3NldF9kZXN0X2J1ZmZlcl9hZGRyZXNzKCh1aW50MzJfdCAqKSZ0dV9wdHItPnJlbW90ZV90b19sb2NhbF9wZCwgJmN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZFtpXSk7CisKKyAgICAgICAgLyogc2V0IG5leHQgUEQgbmV4dCBwZCBpbmRpY2F0b3IgZm9yIGJvdGggcGFydHMgb2YgdGhlIHRyYW5zZmVyIHVuaXQgKi8KKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCZ0dV9wdHItPmRhdGFfcGQubGFzdF9uZXh0X2luZGljYXRvciwgICAgICAgICAgICBCQ01fUENJRURfTkVYVF9DT05USU5PVVNfTUFTSyk7CisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigmdHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciwgQkNNX1BDSUVEX05FWFRfQ09OVElOT1VTX01BU0spOworCisgICAgICAgIC8qIHNldCB0aGUgbGVuZ3RoIGFuZCBpbnRlcnJ1cHQgaW5kaWNhdG9yICAqLworICAgICAgICBiY21fcGNpX3dyaXRlMzIoJnR1X3B0ci0+cmVtb3RlX3RvX2xvY2FsX3BkLmxlbmd0aF9hbmRfaXNyZW5hYmxlLCAoQkNNX1BDSUVEX0lOVFJfRU5BQkxFX01BU0sgfCAoc2l6ZW9mKHVpbnQzMl90KSA8PCBCQ01fUENJRURfVFJBTlNGRVJfU0laRV9TSElGVCkpKTsKKworICAgIH0KKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIGJjbXRyX2Nvbm5lY3RfaXNyKCZjdXJyZW50X2RldmljZS0+aXNyZGF0YSk7CisjZW5kaWYKKworICAgIC8qIENsZWFyIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGF0IEwyICovCisgICAgYmNtX3BjaV93cml0ZTMyKFBDSV9SRUdfQUREUkVTUyhETUFfSU5UUl9NQVNLX1NFVCksIEJDTV9QQ0lFX0FMTF9ETUFfSU5URVJSVVBUU19NQVNLKTsKKyAgICBiY21fcGNpX3dyaXRlMzIoUENJX1JFR19BRERSRVNTKERNQV9JTlRSX0NMRUFSKSwgQkNNX1BDSUVfQUxMX0RNQV9JTlRFUlJVUFRTX01BU0spOworCisgICAgLyogRW5hYmxlIEwyIGludGVycnVwdHMgYXQgTDEgKi8KKyAgICBiY21fcGNpX3dyaXRlMzIoUENJX1JFR19BRERSRVNTKERNQV9JTlRSMV9NQVNLX0NMRUFSKSwgUENJRV9MMl9JTlRSX01BU0spOworCisgICAgcmV0dXJuIEJDTVRSX1NVQ0NFU1M7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfc2VuZCh1aW50OF90IGRldmljZSwgdWludDhfdCBjaGFubmVsLCBiY21vc19idWYgKm5ldF9idWZmKQoreworICAgIGJjbV9wY2llZF9jb21tX2RhdGEgKmN1cnJlbnRfZGV2aWNlOworICAgIGJjbV9wY2llZF90dSAgICAgICAgKmN1cnJlbnRfdHU7CisgICAgdWludDMyX3QgICAgICAgICAgICBjdXJyZW50X3R4OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbmV4dF90eDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIGxlbmd0aDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICpwa3RfcHRyOworI2lmZGVmIENIRUNLX1BBUkFNCisgICAgQkNNVFJfUEFSQU5PSURfQ0hFQ0soKTsKKworICAgIGlmKCFuZXRfYnVmZikKKyAgICB7CisgICAgICAgIHBjaWVfcHJpbnQoIk5ldHdvcmsgYnVmZmVyIGlzIG51bGxcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgY3VycmVudF9kZXZpY2UgPSAmYmNtdHJfcGNpZV9kYXRhW2RldmljZV07CisKKyAgICBsZW5ndGggPSBiY21vc19idWZfbGVuZ3RoKG5ldF9idWZmKTsKKyAgICBpZigobGVuZ3RoID4gY3VycmVudF9kZXZpY2UtPm1heF9tdHUpIHx8IChsZW5ndGggPT0gMCkpCisgICAgeworICAgICAgICBwY2llX3ByaW50KCJQYWNrZXQgbGVuZ3RoICVkIGVycm9yIChNVFU9JWQpXG4iLCBsZW5ndGgsIGN1cnJlbnRfZGV2aWNlLT5tYXhfbXR1KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgTE9DS19UWCgpOworCisgICAgY3VycmVudF90eCA9IGN1cnJlbnRfZGV2aWNlLT5jdXJyZW50X3R4OworCisgICAgLyogY2hlY2sgb3duZXIgaW4gdHhfb3duZXIgbGlzdCovCisgICAgaWYoYmNtX3BjaV9yZWFkMzIoJmN1cnJlbnRfZGV2aWNlLT50eF9vd25lcltjdXJyZW50X3R4XSkgIT0gTE9DQUxfT1dORVIpCisgICAgeworICAgICAgICBVTkxPQ0tfVFgoKTsKKyAgICAgICAgYmNtdHJfcGNpZV9kYXRhW2RldmljZV0udHhfcGNpZV9mdWxsX2NvdW50ZXIrKzsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUVVFVUVfRlVMTDsKKyAgICB9CisKKyAgICAvKiBEbyBub3QgZm9yZ2V0IGNoYW5nZSBvd25lciAqLworICAgIGJjbV9wY2lfd3JpdGUzMigmY3VycmVudF9kZXZpY2UtPnR4X293bmVyW2N1cnJlbnRfdHhdLCBSRU1PVEVfT1dORVIpOworCisgICAgLyogUHJlcGFyZSBzaGFkb3dfcmJkICovCisgICAgKih1aW50MzJfdCopKCZjdXJyZW50X2RldmljZS0+c2hhZG93X3JiZFtjdXJyZW50X3R4XSk9CisgICAgICAgIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UzMigodWludDMyX3QpKGxlbmd0aCB8IGNoYW5uZWwgPDwgQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfU0hJRlQgfCBMT0NBTF9PV05FUiA8PCBCQ01fUENJRURfQkRfT1dORVJTSElQX1NISUZUKSk7CisKKyAgICBjdXJyZW50X3R1ID0gJmN1cnJlbnRfZGV2aWNlLT50eF90dV9yaW5nW2N1cnJlbnRfdHhdOworCisgICAgLyogdGFrZSBkYXRhIGJ1ZmZlciBmcm9tIG5idWZmZXIgKi8KKyAgICBwa3RfcHRyID0gYmNtb3NfYnVmX2RhdGEobmV0X2J1ZmYpOworCisgICAgLyogc2V0IGRhdGFfcGQgZGVzdGluYXRpb24gZGF0YSBidWZmZXIqLworICAgIGJjbXRyX3NldF9zb3VyY2VfYnVmZmVyX2FkZHJlc3MoKHVpbnQzMl90ICopJmN1cnJlbnRfdHUtPmRhdGFfcGQsIHBrdF9wdHIpOworCisjaWZuZGVmIEhBUkRXQVJFX1RFU1QxCisgICAgLyogZmx1c2ggdGhlIGNhc2hlIGZvciB0aGUgZGF0YSBidWZmZXIgKi8KKyAgICBiY21vc19wcmVwYXJlX2Zvcl9kbWFfd3JpdGUocGt0X3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisgICAgLyogc2V0IGRhdGFfcGQgbGVuZ3RoX2FuZF9pc3JlbmFibGUgKG5vIG5lZWQgZW5hYmxlIGludGVycnVwdCBmb3IgZGF0YV9wZCAqLworICAgIGJjbV9wY2lfd3JpdGUzMigmY3VycmVudF90dS0+ZGF0YV9wZC5sZW5ndGhfYW5kX2lzcmVuYWJsZSwgbGVuZ3RoIDw8IEJDTV9QQ0lFRF9UUkFOU0ZFUl9TSVpFX1NISUZUKTsKKworICAgIC8qIHNldCAnbGFzdF9pbmRpY2F0b3InIGJpdCBpbnRvIGN1cnJlbnQgVFUsIHRha2VzIGNhcmUgb2Ygd3JhcHBpbmcgKi8KKyAgICBpZihjdXJyZW50X3R4ID09IGN1cnJlbnRfZGV2aWNlLT5tYXhfdHhfaW5kZXgpCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigmY3VycmVudF90dS0+cmVtb3RlX3RvX2xvY2FsX3BkLmxhc3RfbmV4dF9pbmRpY2F0b3IsIEJDTV9QQ0lFRF9MQVNUX1JFQ09SRF9NQVNLKTsKKyAgICBlbHNlCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigmY3VycmVudF90dS0+cmVtb3RlX3RvX2xvY2FsX3BkLmxhc3RfbmV4dF9pbmRpY2F0b3IsIEJDTV9QQ0lFRF9MQVNUX1JFQ09SRF9NQVNLIHwgQkNNX1BDSUVEX05FWFRfQ09OVElOT1VTX01BU0spOworCisgICAgYmNtb3NfYmFycmllcigpOworCisgICAgLyogY2xlYXIgJ2xhc3RfaW5kaWNhdG9yJyBiaXQgaW50byBwcmV2aW91c19UVSwgdGFrZXMgY2FyZSBvZiB3cmFwcGluZyAqLworICAgIGlmIChjdXJyZW50X2RldmljZS0+cHJldl90eCAhPSBjdXJyZW50X2RldmljZS0+bWF4X3R4X2luZGV4KQorICAgICAgICBiY21fcGNpX3dyaXRlMzIoJihjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZ1tjdXJyZW50X2RldmljZS0+cHJldl90eF0ucmVtb3RlX3RvX2xvY2FsX3BkLmxhc3RfbmV4dF9pbmRpY2F0b3IpLCBCQ01fUENJRURfTkVYVF9DT05USU5PVVNfTUFTSyk7CisgICAgZWxzZQorICAgICAgICBiY21fcGNpX3dyaXRlMzIoJihjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZ1tjdXJyZW50X2RldmljZS0+cHJldl90eF0ucmVtb3RlX3RvX2xvY2FsX3BkLmxhc3RfbmV4dF9pbmRpY2F0b3IpLCAwKTsKKworICAgIGJjbW9zX2JhcnJpZXIoKTsKKworICAgIC8qIHNldCBXQUtFIGJpdCBpbiBETUEgcmVnaXN0ZXJzICovCisgICAgYmNtX3BjaV93cml0ZTMyKFBDSV9SRUdfQUREUkVTUyhXQUtFVVBfRE1BKSwgRE1BX1RYX1dBS0VfQ1RSTF9XQUtFX01BU0spOworCisgICAgSU5DUkVNRU5UX1RSQU5TTUlURUQoZGV2aWNlKTsKKworICAgIG5leHRfdHggPSBjdXJyZW50X3R4ICsgMTsKKyAgICBpZiAobmV4dF90eCA+IGN1cnJlbnRfZGV2aWNlLT5tYXhfdHhfaW5kZXgpCisgICAgICAgIG5leHRfdHggPSAwOworCisjaWZuZGVmIEhBUkRXQVJFX1RFU1QxCisgICAgLyogcmVsZWFzZSBwcmV2aW91cyBuZXR3b3JrIGJ1ZmZlciAqLworICAgIGlmIChjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtjdXJyZW50X3R4XSkKKyAgICB7CisgICAgICAgIHR4X2RvbmVfaGFuZGxlcihkZXZpY2UsIGN1cnJlbnRfZGV2aWNlLT50eF9uYnVmZl9zYXZlW2N1cnJlbnRfdHhdKTsKKyAgICAgICAgY3VycmVudF9kZXZpY2UtPmNvbmZfdHggPSBuZXh0X3R4OworICAgIH0KKworICAgIC8qIHN0b3JlIG5ldHdvcmsgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICBjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtjdXJyZW50X2RldmljZS0+Y3VycmVudF90eF0gPSBuZXRfYnVmZjsKKyNlbmRpZgorICAgIC8qIG1vdmUgY3VycmVudF90eCBpbmRleCAqLworICAgIGN1cnJlbnRfZGV2aWNlLT5wcmV2X3R4ID0gKGludDMyX3QpY3VycmVudF9kZXZpY2UtPmN1cnJlbnRfdHg7CisgICAgY3VycmVudF9kZXZpY2UtPmN1cnJlbnRfdHggPSBuZXh0X3R4OworCisgICAgVU5MT0NLX1RYKCk7CisgICAgcmV0dXJuIEJDTVRSX1NVQ0NFU1M7Cit9CisKKy8qKiBSZWNsYWltIGJ1ZmZlcnMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiB0cmFuc21pdHRlZAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxyZXR1cm5zOiBudW1iZXIgb2YgcmVjbGFpbWVkIFRYIGJ1ZmZlcnMgPj0gMCBvciBiY21vc19lcnJubyBlcnJvciBjb2RlIDwwCisgKi8KK2ludCBiY210cl9wY2llX3R4X2NvbGxlY3QodWludDhfdCBkZXZpY2UpCit7CisgICAgYmNtX3BjaWVkX2NvbW1fZGF0YSAqY3VycmVudF9kZXZpY2U7CisgICAgdWludDMyX3QgICAgICAgICAgICBjb25mX3R4OworICAgIGludCBuID0gMDsKKworI2lmZGVmIENIRUNLX1BBUkFNCisgICAgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfVFlQRShpbnQpOworI2VuZGlmCisKKyAgICBjdXJyZW50X2RldmljZSA9ICZiY210cl9wY2llX2RhdGFbZGV2aWNlXTsKKworICAgIExPQ0tfVFgoKTsKKworICAgIGNvbmZfdHggPSBjdXJyZW50X2RldmljZS0+Y29uZl90eDsKKyAgICB3aGlsZSAoYmNtX3BjaV9yZWFkMzIoJmN1cnJlbnRfZGV2aWNlLT50eF9vd25lcltjb25mX3R4XSkgPT0gTE9DQUxfT1dORVIgJiYKKyAgICAgICAgICAgY3VycmVudF9kZXZpY2UtPnR4X25idWZmX3NhdmVbY29uZl90eF0pCisgICAgeworICAgICAgICArK247CisKKyAgICAgICAgLyogcmVsZWFzZSBwcmV2aW91cyBuZXR3b3JrIGJ1ZmZlciAqLworICAgICAgICB0eF9kb25lX2hhbmRsZXIoZGV2aWNlLCBjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtjb25mX3R4XSk7CisgICAgICAgIGN1cnJlbnRfZGV2aWNlLT50eF9uYnVmZl9zYXZlW2NvbmZfdHhdID0gTlVMTDsKKworICAgICAgICBjb25mX3R4Kys7CisgICAgICAgIGlmIChjb25mX3R4ID4gY3VycmVudF9kZXZpY2UtPm1heF90eF9pbmRleCkKKyAgICAgICAgICAgIGNvbmZfdHggPSAwOworICAgIH0KKyAgICBjdXJyZW50X2RldmljZS0+Y29uZl90eCA9IGNvbmZfdHg7CisKKyAgICBVTkxPQ0tfVFgoKTsKKworICAgIHJldHVybiBuOworfQorCisvKgorICAgIFJlY2VpdmUgYSBkYXRhIHBhY2tldAorICAgIHJldHVybnMgY2hhbm5lbCBhbmQgcG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhCisqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9yZWNlaXZlKHVpbnQ4X3QgZGV2aWNlLCB1aW50OF90ICpjaGFubmVsLCBiY21vc19idWYgKipidWYpCit7CisgICAgYmNtX3BjaWVkX2NvbW1fZGF0YSAqY3VycmVudF9kZXZpY2U7CisgICAgYmNtX3BjaWVkX3R1ICAgICAgICAqY3VycmVudF90dTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIGJkX2luZm87CisgICAgdWludDMyX3QgICAgICAgICAgICBsZW5ndGg7CisgICAgdWludDMyX3QgICAgICAgICAgICBjdXJyZW50X3J4OworCisjaWZuZGVmIEhBUkRXQVJFX1RFU1QxCisgICAgYmNtb3NfYnVmICAgICAgICAgICAqbmV0X3B0ciA9IE5VTEw7CisgICAgdWludDhfdCAgICAgICAgICAgICAqcGt0X3B0ciA9IE5VTEw7CisjZW5kaWYKKworI2lmZGVmIENIRUNLX1BBUkFNCisgICAgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfRVhUKCk7CisgICAgaWYgKCFjaGFubmVsIHx8ICFidWYpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05VTEw7CisjZW5kaWYKKyAgICAqYnVmID0gTlVMTDsKKworICAgIGN1cnJlbnRfZGV2aWNlID0gJmJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdOworCisgICAgY3VycmVudF9yeCA9IGN1cnJlbnRfZGV2aWNlLT5jdXJyZW50X3J4OworICAgIGN1cnJlbnRfdHUgPSAmY3VycmVudF9kZXZpY2UtPnJ4X3R1X3JpbmdbY3VycmVudF9yeF07CisKKyAgICAvKiBSZWFkIGxvY2FsX2JkIHRvIGxvY2FsIHZhcmlhYmxlICovCisgICAgYmRfaW5mbyA9IEJDTU9TX0VORElBTl9MSVRUTEVfVE9fQ1BVX1UzMigqKHVpbnQzMl90KikoJmN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZFtjdXJyZW50X3J4XSkpOworCisgICAgLyogY2hlY2sgb3duZXIgaW4gbG9jYWxfYmQsIGl0IGlzIHVwZGF0ZWQgYnkgdGhlIHBlZXIgKi8KKyAgICBpZiAoKGJkX2luZm8gJiBCQ01fUENJRURfQkRfT1dORVJTSElQX01BU0spID4+IEJDTV9QQ0lFRF9CRF9PV05FUlNISVBfU0hJRlQgIT0gTE9DQUxfT1dORVIpCisgICAgeworICAgICAgICBiY210cl9wY2llX2RhdGFbZGV2aWNlXS5yeF9wY2llX2VtcHR5X2NvdW50ZXIrKzsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUVVFVUVfRU1QVFk7CisgICAgfQorCisgICAgLyogY2hhbmdlIHRoZSBvd25lciBpbiBsb2NhbF9iZCB0byB0aGUgcmVtb3RlIHNpZGUgKi8KKyAgICAqKHVpbnQzMl90KikoJmN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZFtjdXJyZW50X3J4XSk9CisgICAgICAgIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UzMigodWludDMyX3QpKChSRU1PVEVfT1dORVIgPDwgQkNNX1BDSUVEX0JEX09XTkVSU0hJUF9TSElGVCkgfCBiZF9pbmZvKSk7CisKKyAgICAvKiB0YWtlIHRoZSAgcGFja2V0IGxlbmd0aCBmcm9tIGxvY2FsX2JkICovCisgICAgbGVuZ3RoID0gYmRfaW5mbyAmIEJDTV9QQ0lFRF9CRF9QS1RfTEVOR1RIX01BU0s7CisKKyAgICBpZiAoKGxlbmd0aCA9PSAwKSB8fCAobGVuZ3RoID4gY3VycmVudF9kZXZpY2UtPm1heF9tdHUpKQorICAgIHsKKyAgICAgICAgcGNpZV9wcmludCgiUGFja2V0IGxlbmd0aCBlcnJvciA6ICVkXG4iLCBsZW5ndGgpOworCisgICAgICAgIC8qIHVwZGF0ZSByZW1vdGUgc2lkZSAqLworICAgICAgICBiY21fcGNpX3dyaXRlMzIoJmN1cnJlbnRfZGV2aWNlLT5wZWVyX3R4X293bmVyW2N1cnJlbnRfcnhdLCBMT0NBTF9PV05FUik7CisKKyAgICAgICAgLyogbW92ZSBjdXJyZW50IHJ4ICovCisgICAgICAgIE5FWFRfSU5ERVgoY3VycmVudF9kZXZpY2UtPm1heF9yeF9pbmRleCwgY3VycmVudF9kZXZpY2UtPmN1cnJlbnRfcngpOworCisgICAgICAgIHJldHVybiBCQ01fRVJSX01TR19FUlJPUjsKKyAgICB9CisKKyAgICAvKiB1cGRhdGUgcGFja2V0IGNoYW5uZWwgaWQgKi8KKyAgICAqY2hhbm5lbCA9IChiZF9pbmZvICYgQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfTUFTSykgPj4gQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfU0hJRlQ7CisKKyNpZm5kZWYgSEFSRFdBUkVfVEVTVDEKKyAgICAvKiBhbGxvY2F0ZSBuZXcgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0ICovCisgICAgbmV0X3B0ciA9IGJjbW9zX2J1Zl9hbGxvYyhjdXJyZW50X2RldmljZS0+bWF4X210dSk7CisKKyAgICAvKiBJZiBub3Qgc3VjY2Vzc2VzIGRvIGNsZWFuLXVwICovCisgICAgaWYgKCFuZXRfcHRyKQorICAgIHsKKyAgICAgICAgLyogdXBkYXRlIHJlbW90ZSBzaWRlICovCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigmY3VycmVudF9kZXZpY2UtPnBlZXJfdHhfb3duZXJbY3VycmVudF9yeF0sIExPQ0FMX09XTkVSKTsKKworICAgICAgICAvKiBtb3ZlIGN1cnJlbnQgcnggKi8KKyAgICAgICAgTkVYVF9JTkRFWChjdXJyZW50X2RldmljZS0+bWF4X3J4X2luZGV4LCBjdXJyZW50X2RldmljZS0+Y3VycmVudF9yeCk7CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorI2VuZGlmCisgICAgLyogdGFrZSB0aGUgZGF0YSBwb2ludGVyICovCisgICAgKmJ1ZiA9IGN1cnJlbnRfZGV2aWNlLT5yeF9uYnVmZl9zYXZlW2N1cnJlbnRfcnhdOworCisgICAgLyogaW52YWxpZGF0ZSByZWNlaXZlZCBuZXR3b3JrIGJ1ZmZlciBmb3IgY2FjaGUgKi8KKyAgICBiY21vc19wcmVwYXJlX2Zvcl9kbWFfcmVhZChiY21vc19idWZfZGF0YSgqYnVmKSwgbGVuZ3RoKTsKKworICAgIC8qIGZpbGwgbmV0d29yayBidWZmZXIgKi8KKyAgICBiY21vc19idWZfbGVuZ3RoX3NldCgqYnVmLCBsZW5ndGgpOworCisgICAgLyogdXBkYXRlIHN0YXRpc3RpY3MgKi8KKyAgICBJTkNSRU1FTlRfUkVDRUlWRUQoZGV2aWNlKTsKKworI2lmbmRlZiBIQVJEV0FSRV9URVNUMQorICAgIHBrdF9wdHIgPSBiY21vc19idWZfZGF0YShuZXRfcHRyKTsKKworICAgIC8qIGludmFsaWRhdGUgbmV0d29yayBidWZmZXIgZm9yIGNhY2hlICovCisgICAgYmNtb3NfcHJlcGFyZV9mb3JfZG1hX3JlYWQocGt0X3B0ciwgY3VycmVudF9kZXZpY2UtPm1heF9tdHUpOworCisgICAgLyogdXBkYXRlIHJ4IG5ldHdvcmsgYnVmZmVyIHdpdGggdGhlIG5ldyBwYWNrZXQgKi8KKyAgICBjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZVtjdXJyZW50X3J4XSA9IG5ldF9wdHI7CisKKyAgICAvKiBzZXQgZGF0YV9wZCBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlciovCisgICAgYmNtdHJfc2V0X2Rlc3RfYnVmZmVyX2FkZHJlc3MoKHVpbnQzMl90ICopJmN1cnJlbnRfdHUtPmRhdGFfcGQsIHBrdF9wdHIpOworI2VuZGlmCisgICAgLyogdXBkYXRlIHJlbW90ZSBzaWRlICovCisgICAgYmNtX3BjaV93cml0ZTMyKCZjdXJyZW50X2RldmljZS0+cGVlcl90eF9vd25lcltjdXJyZW50X3J4XSwgTE9DQUxfT1dORVIpOworCisgICAgLyogbW92ZSBjdXJyZW50IHJ4ICovCisgICAgTkVYVF9JTkRFWChjdXJyZW50X2RldmljZS0+bWF4X3J4X2luZGV4LCBjdXJyZW50X2RldmljZS0+Y3VycmVudF9yeCk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyogZW5hYmxlIGxldmVsIDIgUlggaW50ZXJydXB0cyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9yeGludF9lbmFibGUodWludDhfdCBkZXZpY2UpCit7CisjaWZkZWYgQ0hFQ0tfUEFSQU0KKyAgICBCQ01UUl9QQVJBTk9JRF9DSEVDS19FWFQoKTsKKyNlbmRpZgorICAgIGJjbV9wY2lfd3JpdGUzMihQQ0lfUkVHX0FERFJFU1MoRE1BX0lOVFJfTUFTS19DTEVBUiksIERNQV9SWF9FUlJPUl9NQVNLIHwgRE1BX1JYX0RPTkVfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyogZGlzYWJsZSBsZXZlbCAyIFJYIGludGVycnVwdHMgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfcnhpbnRfZGlzYWJsZSh1aW50OF90IGRldmljZSkKK3sKKyNpZmRlZiBDSEVDS19QQVJBTQorICAgIEJDTVRSX1BBUkFOT0lEX0NIRUNLX0VYVCgpOworI2VuZGlmCisgICAgYmNtX3BjaV93cml0ZTMyKFBDSV9SRUdfQUREUkVTUyhETUFfSU5UUl9NQVNLX1NFVCksIERNQV9SWF9FUlJPUl9NQVNLIHwgRE1BX1JYX0RPTkVfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9yeGludF9jbGVhcih1aW50OF90IGRldmljZSkKK3sKKyNpZmRlZiBDSEVDS19QQVJBTQorICAgIEJDTVRSX1BBUkFOT0lEX0NIRUNLX0VYVCgpOworI2VuZGlmCisgICAgYmNtX3BjaV93cml0ZTMyKFBDSV9SRUdfQUREUkVTUyhETUFfSU5UUl9DTEVBUiksIERNQV9SWF9FUlJPUl9NQVNLIHwgRE1BX1JYX0RPTkVfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyogRW5hYmxlIExldmVsIDIgIlRYIGhhbmRsZWQiIGludGVycnVwdCAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV90eGludF9lbmFibGUodWludDhfdCBkZXZpY2UpCit7CisjaWZkZWYgQ0hFQ0tfUEFSQU0KKyAgICBCQ01UUl9QQVJBTk9JRF9DSEVDS19FWFQoKTsKKyNlbmRpZgorICAgIGJjbV9wY2lfd3JpdGUzMihQQ0lfUkVHX0FERFJFU1MoRE1BX0lOVFJfTUFTS19DTEVBUiksIERNQV9UWF9FUlJPUl9NQVNLIHwgRE1BX1RYX0RPTkVfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyogRGlzYWJsZSBsZXZlbCAyICJUWCBoYW5kbGVkIiBpbnRlcnJ1cHQgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfdHhpbnRfZGlzYWJsZSh1aW50OF90IGRldmljZSkKK3sKKyNpZmRlZiBDSEVDS19QQVJBTQorICAgIEJDTVRSX1BBUkFOT0lEX0NIRUNLX0VYVCgpOworI2VuZGlmCisgICAgYmNtX3BjaV93cml0ZTMyKFBDSV9SRUdfQUREUkVTUyhETUFfSU5UUl9NQVNLX1NFVCksIERNQV9UWF9FUlJPUl9NQVNLIHwgRE1BX1RYX0RPTkVfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyogQ2xlYXIgbGV2ZWwgMiAiVFggaGFuZGxlZCIgaW50ZXJydXB0ICovCitiY21vc19lcnJubyBiY210cl9wY2llX3R4aW50X2NsZWFyKHVpbnQ4X3QgZGV2aWNlKQoreworI2lmZGVmIENIRUNLX1BBUkFNCisgICAgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfRVhUKCk7CisjZW5kaWYKKyAgICBiY21fcGNpX3dyaXRlMzIoUENJX1JFR19BRERSRVNTKERNQV9JTlRSX0NMRUFSKSwgRE1BX1RYX0VSUk9SX01BU0sgfCBETUFfVFhfRE9ORV9NQVNLKTsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX2Rpc2Nvbm5lY3QodWludDhfdCBkZXZpY2UpCit7CisgICAgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfRVhUKCk7CisKKyAgICBzdG9wX2RtYShkZXZpY2UpOworCisgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgYmNtdHJfcGNpZV9yeGludF9kaXNhYmxlKGRldmljZSk7CisgICAgYmNtdHJfcGNpZV90eGludF9kaXNhYmxlKGRldmljZSk7CisKKyAgICAvKiBjbGVhciBETUEgaW50ZXJydXB0cyAqLworICAgIGJjbXRyX3BjaWVfcnhpbnRfY2xlYXIoZGV2aWNlKTsKKyAgICBiY210cl9wY2llX3R4aW50X2NsZWFyKGRldmljZSk7CisKKyAgICAvKiBEaXNhYmxlIGluIEwxIGNvbnRyb2xsZXIgKi8KKyAgICBiY21fcGNpX3dyaXRlMzIoUENJX1JFR19BRERSRVNTKERNQV9JTlRSMV9NQVNLX1NFVCksIFBDSUVfTDJfSU5UUl9NQVNLKTsKKworICAgIC8qIGZyZWUgaXJxIC0gb24gaG9zdCAoaWYgaXQgaXMgc2hhcmVkKSBtdXN0IG5vdCBmcmVlIGl0ICovCisgICAgYmNtdHJfcGNpZV9mcmVlX2lycShiY210cl9wY2llX2RhdGFbZGV2aWNlXS5pc3JkYXRhLnJ4X2lycSwgJmJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdLmlzcmRhdGEpOworCisgICAgZnJlZV9idWZmZXJzKGRldmljZSwgIlBDSUUgZGlzY29ubmVjdGVkXG4iKTsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3J4X2lycV9jYmxrX3JlZ2lzdGVyKGZfYmNtdHJfaW50IHJ4X2lzcl9jbGJrKQoreworICAgIGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXIgPSByeF9pc3JfY2xiazsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3J4X2lycV9jYmxrX3VucmVnaXN0ZXIodm9pZCkKK3sKKyAgICBiY210cl9wY2llX3J4X2lycV9oYW5kbGVyID0gTlVMTDsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3R4X2lycV9jYmxrX3JlZ2lzdGVyKGZfYmNtdHJfaW50IHJ4X2lzcl9jbGJrKQoreworICAgIGJjbXRyX3BjaWVfdHhfaXJxX2hhbmRsZXIgPSByeF9pc3JfY2xiazsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3R4X2lycV9jYmxrX3VucmVnaXN0ZXIodm9pZCkKK3sKKyAgICBiY210cl9wY2llX3R4X2lycV9oYW5kbGVyID0gTlVMTDsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3R4X2RvbmVfY2Jsa19yZWdpc3RlcihmX2JjbXRyX2RvbmUgdHhfZG9uZV9jYikKK3sKKyAgICB0eF9kb25lX2hhbmRsZXIgPSB0eF9kb25lX2NiOworCisgICAgcmV0dXJuIEJDTVRSX1NVQ0NFU1M7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfdHhfZG9uZV9jYmxrX3VucmVnaXN0ZXIodm9pZCkKK3sKKyAgICB0eF9kb25lX2hhbmRsZXIgPSBkZWZhdWx0X3R4X2RvbmVfY2FsbGJhY2s7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKwordm9pZCBiY210cl9wY2llX2V4aXQodm9pZCkKK3sKKyAgICB1aW50MzJfdCBpOworCisgICAgaWYgKGJjbXRyX3BjaWVfZGF0YSkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiY210cl9tYXhfZGV2aWNlc19udW1iZXI7IGkgKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRyX3BjaWVfZGlzY29ubmVjdChpKTsKKyAgICAgICAgfQorICAgICAgICBiY21vc19mcmVlKGJjbXRyX3BjaWVfZGF0YSk7CisgICAgfQorICAgIGJjbXRyX3BjaWVfZGF0YSA9IE5VTEw7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfZ2V0X3N0YXRpc3RpY3ModWludDhfdCBkZXZpY2UsIHVpbnQzMl90IGNsZWFyLCBiY21fcGNpZWRfc3RhdCAqc3RhdCkKK3sKKyAgICBiY21fcGNpZWRfY29tbV9kYXRhICpjdXJyZW50X2RldmljZSA9ICZiY210cl9wY2llX2RhdGFbZGV2aWNlXTsKKworICAgIEJDTVRSX1BBUkFOT0lEX0NIRUNLKCk7CisKKyAgIGlmICghc3RhdCkKKyAgICAgICByZXR1cm4gQkNNX0VSUl9OVUxMOworCisgICAgc3RhdC0+cnhfY291bnRlciAgICA9IGN1cnJlbnRfZGV2aWNlLT5yeF9jb3VudGVyOworICAgIHN0YXQtPnR4X2NvdW50ZXIgICAgPSBjdXJyZW50X2RldmljZS0+dHhfY291bnRlcjsKKyAgICBzdGF0LT5yeF9kb25lX2lzcl9jb3VudGVyICAgPSBjdXJyZW50X2RldmljZS0+aXNyZGF0YS5yeF9kb25lX251bTsKKyAgICBzdGF0LT5yeF9lcnJfaXNyX2NvdW50ZXIgICA9IGN1cnJlbnRfZGV2aWNlLT5pc3JkYXRhLnJ4X2Vycl9udW07CisgICAgc3RhdC0+dHhfZG9uZV9pc3JfY291bnRlciAgID0gY3VycmVudF9kZXZpY2UtPmlzcmRhdGEudHhfZG9uZV9udW07CisgICAgc3RhdC0+dHhfZXJyX2lzcl9jb3VudGVyICAgPSBjdXJyZW50X2RldmljZS0+aXNyZGF0YS50eF9lcnJfbnVtOworICAgIHN0YXQtPnJ4X3BjaWVfZW1wdHlfY291bnRlciAgPSBjdXJyZW50X2RldmljZS0+cnhfcGNpZV9lbXB0eV9jb3VudGVyOworICAgIHN0YXQtPnR4X3BjaWVfZnVsbF9jb3VudGVyICA9IGN1cnJlbnRfZGV2aWNlLT50eF9wY2llX2Z1bGxfY291bnRlcjsKKyAgICBpZiAoY2xlYXIpCisgICAgeworICAgICAgICBjdXJyZW50X2RldmljZS0+cnhfY291bnRlciAgICAgICA9IDA7CisgICAgICAgIGN1cnJlbnRfZGV2aWNlLT50eF9jb3VudGVyICAgICAgID0gMDsKKyAgICAgICAgY3VycmVudF9kZXZpY2UtPmlzcmRhdGEucnhfZG9uZV9udW0gPSAwOworICAgICAgICBjdXJyZW50X2RldmljZS0+aXNyZGF0YS5yeF9lcnJfbnVtICA9IDA7CisgICAgICAgIGN1cnJlbnRfZGV2aWNlLT5pc3JkYXRhLnR4X2RvbmVfbnVtID0gMDsKKyAgICAgICAgY3VycmVudF9kZXZpY2UtPmlzcmRhdGEudHhfZXJyX251bSAgPSAwOworICAgICAgICBjdXJyZW50X2RldmljZS0+cnhfcGNpZV9lbXB0eV9jb3VudGVyID0gMDsKKyAgICAgICAgY3VycmVudF9kZXZpY2UtPnR4X3BjaWVfZnVsbF9jb3VudGVyID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiB1c2VkIGJ5IGR1bXAgcHJvY2VkdXJlcyAtIG1heSB3cml0ZSB0byBzdGQgb3V0cHV0IG9yIHVzZXIgYnVmZmVyICovCisjZGVmaW5lIHBjaWVfYnByaW50KGJ1ZmZlciwgZm10LCBhcmdzLi4uKSAgXAorICAgIHtcCisgICAgICBpZiAoIWJ1ZmZlcilcCisgICAgICAgIHBjaWVfcHJpbnQoZm10LCAjI2FyZ3MpO1wKKyAgICAgIGVsc2VcCisgICAgICAgIHNwcmludGYoYnVmZmVyLCBmbXQsICMjYXJncyk7XAorICAgIH0KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfYmQoY2hhciAqb3V0cHV0LCBjaGFyICp0aXRsZSwgdWludDMyX3QgYmQpCit7CisgICAgdWludDMyX3Qgb3duZXIsIGNobiwgbGVuZ3RoOworCisgICAgb3duZXIgPSAoYmQgJiBCQ01fUENJRURfQkRfT1dORVJTSElQX01BU0spID4+IEJDTV9QQ0lFRF9CRF9PV05FUlNISVBfU0hJRlQ7CisgICAgY2huID0gKGJkICYgQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfTUFTSykgPj4gQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfU0hJRlQ7CisgICAgbGVuZ3RoID0gYmQgJiBCQ01fUENJRURfQkRfUEtUX0xFTkdUSF9NQVNLOworCisgICAgcGNpZV9icHJpbnQob3V0cHV0LCAiXHQlczogKDB4JTA4eCkgb3duZXIgPSAlcyBjaGFubmVsID0gMHgleCglZCkgbGVuZ3RoID0gMHgleCglZClcbiIsCisgICAgICAgIHRpdGxlLCAodW5zaWduZWQgaW50KWJkLCBvd25lciA9PSAwID8gImxvY2FsIiA6ICJwZWVyIiwgKHVuc2lnbmVkIGludCljaG4sIGNobiwgKHVuc2lnbmVkIGludClsZW5ndGgsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX293bmVyKGNoYXIgKm91dHB1dCwgY2hhciAqdGl0bGUsIHVpbnQzMl90ICpjdXJyZW50X2VudHJ5KQoreworICAgIHVpbnQzMl90IG93bmVyLCBlbnRyeTsKKworICAgIGVudHJ5ID0gYmNtX3BjaV9yZWFkMzIoY3VycmVudF9lbnRyeSk7CisgICAgb3duZXIgPSAoZW50cnkgJiBCQ01fUENJRURfQkRfT1dORVJTSElQX01BU0spID4+IEJDTV9QQ0lFRF9CRF9PV05FUlNISVBfU0hJRlQ7CisgICAgcGNpZV9icHJpbnQob3V0cHV0LCAiXHQlczogb3duZXIgPSAlc1xuIiwgdGl0bGUsIG93bmVyID09IDAgPyAibG9jYWwiIDogInBlZXIiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcGQoY2hhciAqb3V0cHV0LCBiY21fcGNpZWRfcGQgKmN1cnJlbnRfcGQpCit7CisgICAgdWludDMyX3QgZGRybCxkZHJoLHBrdGwscGt0aCxsZW4sbGFzdCxuZXh0bCxuZXh0aDsKKworICAgIGRkcmwgID0gYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopJmN1cnJlbnRfcGQtPmRkcl9idWZmX2FkZHJlc3NfbG93KTsKKyAgICBwa3RsICA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKSZjdXJyZW50X3BkLT5wY2llX3BrdF9hZGRyZXNzX2xvdyk7CisgICAgcGt0aCAgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikmY3VycmVudF9wZC0+cGNpZV9wa3RfYWRkcmVzc19oaWdoKTsKKyAgICBsZW4gICA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKSZjdXJyZW50X3BkLT5sZW5ndGhfYW5kX2lzcmVuYWJsZSk7CisgICAgbGFzdCAgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikmY3VycmVudF9wZC0+bGFzdF9uZXh0X2luZGljYXRvcik7CisgICAgbmV4dGwgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikmY3VycmVudF9wZC0+bmV4dF9wZF9hZGRyZXNzX2xvdyk7CisgICAgbmV4dGggPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikmY3VycmVudF9wZC0+bmV4dF9wZF9hZGRyZXNzX2hpZ2gpOworICAgIGRkcmggID0gYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopJmN1cnJlbnRfcGQtPmRkcl9idWZmX2FkZHJlc3NfaGlnaCk7CisKKyAgICBwY2llX2JwcmludChvdXRwdXQsCisgICAgICAgICAgICAgICAgIlx0XHQlLTIwcyA9IDB4JTA4eFxuIgorICAgICAgICAgICAgICAgICJcdFx0JS0yMHMgPSAweCUwOHhcbiIKKyAgICAgICAgICAgICAgICAiXHRcdCUtMjBzID0gMHglMDh4XG4iCisgICAgICAgICAgICAgICAgIlx0XHQlLTIwcyA9IDB4JTA4eFxuIgorICAgICAgICAgICAgICAgICJcdFx0JS0yMHMgPSAweCUwOHhcbiIKKyAgICAgICAgICAgICAgICAiXHRcdCUtMjBzID0gMHglMDh4XG4iCisgICAgICAgICAgICAgICAgIlx0XHQlLTIwcyA9IDB4JTA4eFxuIgorICAgICAgICAgICAgICAgICJcdFx0JS0yMHMgPSAweCUwOHhcbiIsCisgICAgICAgICAgICAgICAgImRkcl9sb3ciLCBkZHJsLAorICAgICAgICAgICAgICAgICJwa3RfbG93IiwgcGt0bCwKKyAgICAgICAgICAgICAgICAicGt0X2hpZ2giLCBwa3RoLAorICAgICAgICAgICAgICAgICJsZW5ndGhfYW5kX2lzcmVuYWJsZSIsIGxlbiwKKyAgICAgICAgICAgICAgICAibGFzdF9uZXh0X2luZGljYXRvciIsIGxhc3QsCisgICAgICAgICAgICAgICAgIm5leHRfbG93IiwgbmV4dGwsCisgICAgICAgICAgICAgICAgIm5leHRfaGlnaCIsIG5leHRoLAorICAgICAgICAgICAgICAgICJkZHJfaGlnaCIsIGRkcmgpOworfQorCisKK3N0YXRpYyBpbnQzMl90IGR1bXBfb25lX3R4KGNoYXIgKm91dHB1dCwgdWludDhfdCBkZXZpY2UsIHVpbnQzMl90IGN1cnJlbnRfaW5kZXgpCit7CisgICAgYmNtX3BjaWVkX3R1ICAgICAgICAqY3VycmVudF90dTsKKyAgICBiY21fcGNpZWRfY29tbV9kYXRhICpjdXJyZW50X2RldmljZTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICpidWZmZXIgPSBvdXRwdXQ7CisKKyAgICBjdXJyZW50X2RldmljZSA9ICZiY210cl9wY2llX2RhdGFbZGV2aWNlXTsKKyAgICBjdXJyZW50X3R1ID0gJmN1cnJlbnRfZGV2aWNlLT50eF90dV9yaW5nW2N1cnJlbnRfaW5kZXhdOworICAgIGR1bXBfYmQoYnVmZmVyLCAiU0JEIiwgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKCoodWludDMyX3QqKSZjdXJyZW50X2RldmljZS0+c2hhZG93X3JiZFtjdXJyZW50X2luZGV4XSkpOworICAgIGlmIChidWZmZXIpCisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIGR1bXBfb3duZXIoYnVmZmVyLCAidHhfb3duZXIiLCAmY3VycmVudF9kZXZpY2UtPnR4X293bmVyW2N1cnJlbnRfaW5kZXhdKTsKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBidWZmZXIgKz0gc3RybGVuKGJ1ZmZlcik7CisKKyAgICBwY2llX2JwcmludChidWZmZXIsICJcdFBEIGRhdGEgPSAweCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpJmN1cnJlbnRfdHUtPmRhdGFfcGQpOworICAgIGlmIChidWZmZXIpCisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIGR1bXBfcGQoYnVmZmVyLCAmY3VycmVudF90dS0+ZGF0YV9wZCk7CisgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgYnVmZmVyICs9IHN0cmxlbihidWZmZXIpOworCisgICAgcGNpZV9icHJpbnQoYnVmZmVyLCAiXHRQRCBzaGFkb3dfcmJkID0gMHglbHhcbiIsICh1bnNpZ25lZCBsb25nKSZjdXJyZW50X3R1LT5yZW1vdGVfdG9fbG9jYWxfcGQpOworICAgIGlmIChidWZmZXIpCisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIGR1bXBfcGQoYnVmZmVyLCAmY3VycmVudF90dS0+cmVtb3RlX3RvX2xvY2FsX3BkKTsKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBidWZmZXIgKz0gc3RybGVuKGJ1ZmZlcik7CisKKyAgICBwY2llX2JwcmludChidWZmZXIsICJcdFRYIG5ldGJ1ZmYgPSAweCVseFxuIiwodW5zaWduZWQgbG9uZyljdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtjdXJyZW50X2luZGV4XSk7CisKKyAgICBpZiAob3V0cHV0KQorICAgICAgICByZXR1cm4gc3RybGVuKG91dHB1dCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludDMyX3QgZHVtcF9vbmVfcngoY2hhciAqb3V0cHV0LCB1aW50OF90IGRldmljZSwgdWludDMyX3QgY3VycmVudF9pbmRleCkKK3sKKyAgICBiY21fcGNpZWRfdHUgICAgICAgICpjdXJyZW50X3R1OworICAgIGJjbV9wY2llZF9jb21tX2RhdGEgKmN1cnJlbnRfZGV2aWNlOworICAgIGNoYXIgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG91dHB1dDsKKworICAgIGN1cnJlbnRfZGV2aWNlID0gJmJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdOworICAgIGN1cnJlbnRfdHUgPSAmY3VycmVudF9kZXZpY2UtPnJ4X3R1X3JpbmdbY3VycmVudF9pbmRleF07CisKKyAgICBkdW1wX2JkKGJ1ZmZlciwgIkJEIiwgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKCoodWludDMyX3QqKSZjdXJyZW50X2RldmljZS0+bG9jYWxfYmRbY3VycmVudF9pbmRleF0pKTsKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBidWZmZXIgKz0gc3RybGVuKGJ1ZmZlcik7CisKKyAgICBkdW1wX293bmVyKGJ1ZmZlciwgInBlZXJfdHhfb3duZXIiLCAmY3VycmVudF9kZXZpY2UtPnBlZXJfdHhfb3duZXJbY3VycmVudF9pbmRleF0pOworICAgIGlmIChidWZmZXIpCisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIHBjaWVfYnByaW50KGJ1ZmZlciwgIlx0UEQgZGF0YSA9IDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZykmY3VycmVudF90dS0+ZGF0YV9wZCk7CisgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgYnVmZmVyICs9IHN0cmxlbihidWZmZXIpOworCisgICAgZHVtcF9wZChidWZmZXIsICZjdXJyZW50X3R1LT5kYXRhX3BkKTsKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBidWZmZXIgKz0gc3RybGVuKGJ1ZmZlcik7CisKKyAgICBwY2llX2JwcmludChidWZmZXIsICJcdFBEIHNoYWRvd19yYmQgPSAweCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpJmN1cnJlbnRfdHUtPnJlbW90ZV90b19sb2NhbF9wZCk7CisgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgYnVmZmVyICs9IHN0cmxlbihidWZmZXIpOworCisgICAgZHVtcF9wZChidWZmZXIsICZjdXJyZW50X3R1LT5yZW1vdGVfdG9fbG9jYWxfcGQpOworICAgIGlmIChidWZmZXIpCisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIHBjaWVfYnByaW50KGJ1ZmZlciwgIlx0UlggbmV0YnVmZiA9IDB4JWx4XG4iLCh1bnNpZ25lZCBsb25nKWN1cnJlbnRfZGV2aWNlLT5yeF9uYnVmZl9zYXZlW2N1cnJlbnRfaW5kZXhdKTsKKworICAgIGlmIChvdXRwdXQpCisgICAgICAgIHJldHVybiBzdHJsZW4ob3V0cHV0KTsKKyAgICByZXR1cm4gMDsKK30KKworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV90eF9kdW1wKGNoYXIgKm91dHB1dCwgdWludDhfdCBkZXZpY2UsIGludDMyX3Qgc3RhcnQsIGludDMyX3QgbnVtYmVyX29mX2VudHJpZXMpCit7CisgICAgaW50MzJfdCBpOworICAgIGludDMyX3QgbGVuID0gMDsKKyAgICBjaGFyICpidWZmZXIgPSBvdXRwdXQ7CisgICAgaW50MzJfdCBmcm9tID0gc3RhcnQ7CisgICAgaW50MzJfdCB0bzsKKworICAgIHBjaWVfYnByaW50KGJ1ZmZlciwgIkR1bXAgVHggcmluZ1xuIik7CisgICAgaWYgKCFiY210cl9wY2llX2RhdGEpCisgICAgeworICAgICAgICBwY2llX3ByaW50KCJEcml2ZXIgaXMgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisgICAgfQorCisgICAgaWYgKGRldmljZSA+PSBiY210cl9tYXhfZGV2aWNlc19udW1iZXIpCisgICAgeworICAgICAgICBwY2llX3ByaW50KCJEZXZpY2UgcGFyYW1ldGVyIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIGRldmljZXMoJWQpXG4iLCBiY210cl9tYXhfZGV2aWNlc19udW1iZXIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlICE9IGJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdLmlzcmRhdGEuZGV2aWNlKQorICAgIHsKKyAgICAgICAgcGNpZV9wcmludCgiKioqIERhdGEgQ29ycnVwdGVkICoqKlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIGlmIChzdGFydCA9PSAtMSkgLyogZnJvbSBjdXJyZW50LCBudW1iZXIgb2YgZW50cmllcyAqLworICAgICAgICBmcm9tID0gYmNtdHJfcGNpZV9kYXRhW2RldmljZV0uY3VycmVudF90eDsKKworICAgIHRvID0gZnJvbSArIG51bWJlcl9vZl9lbnRyaWVzOworCisgICAgaWYgKHRvID09IGZyb20pCisgICAgICAgIHRvKys7CisKKyAgICBpZiAodG8gPiBiY210cl9wY2llX2RhdGFbZGV2aWNlXS50eHFfbGVuZ3RoKQorICAgICAgICB0byA9IGJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdLnR4cV9sZW5ndGg7CisKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBsZW4gPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIGZvciAoaSA9IGZyb207IGkgPCB0bzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgICAgIGJ1ZmZlciA9IG91dHB1dCArIGxlbjsgLyogbW92ZSBidWZmZXIgdG8gdGhlIG5leHQgc3BhY2UgKi8KKworICAgICAgICBpZiAoaSA9PSBiY210cl9wY2llX2RhdGFbZGV2aWNlXS5jdXJyZW50X3R4KQorICAgICAgICB7CisgICAgICAgICAgICBwY2llX2JwcmludChidWZmZXIsICJDdXJyZW50ID0gJWRcbiIsIGkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGNpZV9icHJpbnQoYnVmZmVyLCAiSW5kZXggPSAlZFxuIiwgaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhZGQgdG8gbGVuIHRoZSBuZXh0IGxpbmUgLSBidWZmZXIgY29udGFpbnMgb25seSB0aGUgbGFzdCBsaW5lICovCisgICAgICAgICAgICBsZW4gKz0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgICAgICBidWZmZXIgPSBvdXRwdXQgKyBsZW47CisgICAgICAgIH0KKyAgICAgICAgLyogcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBsYXN0IGxpbmVzICovCisgICAgICAgIGxlbiArPSBkdW1wX29uZV90eChidWZmZXIsIGRldmljZSwgaSk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfcnhfZHVtcChjaGFyICpvdXRwdXQsIHVpbnQ4X3QgZGV2aWNlLCBpbnQzMl90IHN0YXJ0LCBpbnQzMl90IG51bWJlcl9vZl9lbnRyaWVzKQoreworICAgIGludDMyX3QgaTsKKyAgICBpbnQzMl90IGxlbiA9IDA7CisgICAgY2hhciAqYnVmZmVyID0gb3V0cHV0OworICAgIGludDMyX3QgZnJvbSA9IHN0YXJ0OworICAgIGludDMyX3QgdG87CisKKyAgICBwY2llX2JwcmludChidWZmZXIsICJEdW1wIFJ4IHJpbmdcbiIpOworICAgIGlmICghYmNtdHJfcGNpZV9kYXRhKQorICAgIHsKKyAgICAgICAgcGNpZV9wcmludCgiRHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworICAgIH0KKworICAgIGlmIChkZXZpY2UgPj0gYmNtdHJfbWF4X2RldmljZXNfbnVtYmVyKQorICAgIHsKKyAgICAgICAgcGNpZV9wcmludCgiRGV2aWNlIHBhcmFtZXRlciBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSBkZXZpY2VzKCVkKVxuIiwgYmNtdHJfbWF4X2RldmljZXNfbnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgaWYgKGRldmljZSAhPSBiY210cl9wY2llX2RhdGFbZGV2aWNlXS5pc3JkYXRhLmRldmljZSkKKyAgICB7CisgICAgICAgIHBjaWVfcHJpbnQoIioqKiBEYXRhIENvcnJ1cHRlZCAqKipcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAoc3RhcnQgPT0gLTEpIC8qIGZyb20gY3VycmVudCBudW1iZXIgb2YgZW50cmllcyAqLworICAgICAgICBmcm9tID0gYmNtdHJfcGNpZV9kYXRhW2RldmljZV0uY3VycmVudF9yeDsKKyAgICB0byA9IGZyb20gKyBudW1iZXJfb2ZfZW50cmllczsKKyAgICBpZiAodG8gPT0gZnJvbSkKKyAgICAgICAgdG8rKzsKKyAgICBpZiAodG8gPiBiY210cl9wY2llX2RhdGFbZGV2aWNlXS5yeHFfbGVuZ3RoKQorICAgICAgICB0byA9IGJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdLnJ4cV9sZW5ndGg7CisKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBsZW4gPSBzdHJsZW4oYnVmZmVyKTsKKyAgICBmb3IgKGkgPSBmcm9tOyBpIDwgdG87IGkrKykKKyAgICB7CisgICAgICAgIGlmIChidWZmZXIpCisgICAgICAgICAgICBidWZmZXIgPSBvdXRwdXQgKyBsZW47CisgICAgICAgIGlmIChpID09IGJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdLmN1cnJlbnRfcngpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBjaWVfYnByaW50KGJ1ZmZlciwgIkN1cnJlbnQgPSAlZFxuIiwgaSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwY2llX2JwcmludChidWZmZXIsICJJbmRleCA9ICVkXG4iLCBpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhZGQgdG8gbGVuIHRoZSBuZXh0IGxpbmUgLSBidWZmZXIgY29udGFpbnMgb25seSB0aGUgbGFzdCBsaW5lICovCisgICAgICAgICAgICBsZW4gKz0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgICAgICBidWZmZXIgPSBvdXRwdXQgKyBsZW47CisgICAgICAgIH0KKyAgICAgICAgLyogcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBsYXN0IGxpbmVzICovCisgICAgICAgIGxlbiArPSBkdW1wX29uZV9yeChidWZmZXIsIGRldmljZSwgaSk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfcmVjZWl2ZSk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfZXhpdCk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfcHJlX2Nvbm5lY3QpOworRVhQT1JUX1NZTUJPTChiY210cl9wY2llX2Nvbm5lY3QpOworRVhQT1JUX1NZTUJPTChiY210cl9wY2llX2Rpc2Nvbm5lY3QpOworRVhQT1JUX1NZTUJPTChiY210cl9wY2llX3J4X2lycV9jYmxrX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJfcGNpZV9yeF9pcnFfY2Jsa191bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJfcGNpZV90eF9pcnFfY2Jsa19yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfdHhfaXJxX2NibGtfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfc2VuZCk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfdHhfZHVtcCk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfcnhfZHVtcCk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfcnhpbnRfZW5hYmxlKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJfcGNpZV9yeGludF9kaXNhYmxlKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJfcGNpZV9yeGludF9jbGVhcik7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXIpOworRVhQT1JUX1NZTUJPTChiY210cl9wY2llX3R4X2lycV9oYW5kbGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJfcGNpZV9nZXRfc3RhdGlzdGljcyk7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtdHJfcGNpZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtdHJfcGNpZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTI3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvcGNpZS9iY210cl9wY2llLmgKQEAgLTAsMCArMSwyNDkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNVFJfUENJRV9IXworI2RlZmluZSBCQ01UUl9QQ0lFX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKworI2RlZmluZSBERFJfUEFDS0VUX0xPV19JTkRFWCAgICAgICAgMAorI2RlZmluZSBERFJfUEFDS0VUX0hJR0hfSU5ERVggICAgICAgNworI2RlZmluZSBQQ0lfUEFDS0VUX0xPV19JTkRFWCAgICAgICAgMQorI2RlZmluZSBQQ0lfUEFDS0VUX0hJR0hfSU5ERVggICAgICAgMgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90ICAgIHJ4X2NvdW50ZXI7CisgICAgdWludDMyX3QgICAgdHhfY291bnRlcjsKKyAgICB1aW50MzJfdCAgICByeF9kb25lX2lzcl9jb3VudGVyOworICAgIHVpbnQzMl90ICAgIHJ4X2Vycl9pc3JfY291bnRlcjsKKyAgICB1aW50MzJfdCAgICB0eF9kb25lX2lzcl9jb3VudGVyOworICAgIHVpbnQzMl90ICAgIHR4X2Vycl9pc3JfY291bnRlcjsKKyAgICB1aW50MzJfdCAgICByeF9wY2llX2VtcHR5X2NvdW50ZXI7CisgICAgdWludDMyX3QgICAgdHhfcGNpZV9mdWxsX2NvdW50ZXI7Cit9IGJjbV9wY2llZF9zdGF0OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgcGNpZV9yZWdfYmFzZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJ4X2lycTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIGRldmljZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJ4X2RvbmVfbnVtOworICAgIHVpbnQzMl90ICAgICAgICAgICAgcnhfZXJyX251bTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHR4X2RvbmVfbnVtOworICAgIHVpbnQzMl90ICAgICAgICAgICAgdHhfZXJyX251bTsKK30gYmNtX3BjaWVkX2lzcl9kYXRhOworCisvKiogSW5pdGlhbGl6ZSBQQ0llIGxvdyBsZXZlbCB0cmFuc3BvcnQgbW9kdWxlCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworI2lmZGVmIElOX0JBTkQgCisgICAgYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9pbml0KHVpbnQ4X3QgZGV2aWNlLCBiY21vc19pcHY0X2FkZHJlc3MgaXBfYWRkcmVzcywgdWludDE2X3QgdWRwX3BvcnQpOworI2Vsc2UKKyAgICBiY21vc19lcnJubyBiY210cl9wY2llX2luaXQodWludDhfdCBtYXhfZGV2aWNlcyk7CisjZW5kaWYKKworLyoqIENsZWFudXAgUENJZSBsb3cgbGV2ZWwgdHJhbnNwb3J0IG1vZHVsZQorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK3ZvaWQgYmNtdHJfcGNpZV9leGl0KHZvaWQpOworCisvKiogUENJZSBwcmUtY29ubmVjdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgdHhxX3NpemU7ICAvKio8IFRyYW5zbWl0IHF1ZXVlIHNpemUgKi8KKyAgICB1aW50MzJfdCByeHFfc2l6ZTsgIC8qKjwgUmVjZWl2ZSBxdWV1ZSBzaXplICovCisgICAgdWludDMyX3QgbWF4X210dTsgICAvKio8IE1heCBNVFUgc2l6ZSAqLworICAgIHVpbnQzMl90IHJ4X2lycTsgICAgLyoqPCBSeCBpbnRlcnJ1cHQgbnVtYmVyICovCisgICAgdW5zaWduZWQgbG9uZyBwY2llX3JlZ19iYXNlOyAgIC8qKjwgTWFwbGUgUENJZSByZWdpc3RlciBibG9jayBhZGRyZXNzIGluIGhvc3QgYWRkcnNzIHNwYWNlICovCisgICAgdW5zaWduZWQgbG9uZyBkZHJfd2luX2Jhc2U7ICAgLyoqPCBNYXBsZSBERFIgYWRkcmVzcyBpbiBob3N0IGFkZHJzcyBzcGFjZSAqLworfSBiY210cl9wY2llX3ByZV9jb25uZWN0X2NmZzsKKworLyoqIFBDSWUgcHJlLWNvbm5lY3QgZGF0YSAtIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IGJjbXRyX3BjaWVfcHJlX2Nvbm5lY3QoKS4KKyAqIERldmljZSBjb250cm9sIGRyaXZlciBzaG91bGQgc3RvcmUgZGF0YSBmcm9tIHRoaXMgc3RydWN0dXJlCisgKiBpbiB0aGUgYm9vdCByZWNvcmQgaW4gTWFwbGUgU1JBTQorICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9wY2llX29wYXF1ZV9kYXRhIGJjbXRyX3BjaWVfb3BhcXVlX2RhdGE7CisKKy8qKiBQcmVwYXJlIHRvIGNvbm5lY3QKKyAqICAgICAgT24gTWFwbGUgcmV0dXJucyBpbnRvIG9wYXF1ZV9kYXRhIHBvaW50ZXJzIG9mIHRoZQorICogIAl0cmFuc21pdCBhbmQgcmVjZWl2ZSBQYWNrZXREZXNjcmlwdG9ycworICogIAlPbiBIb3N0IG9wYXF1ZV9kYXRhIGlzIE5VTEwKKyAqIFxwYXJhbVtpbl0gICAgICBkZXZpY2UgICAgICAgICAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtpbl0gICAgICBjZmcgICAgICAgICAgICAgICBDb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24KKyAqIFxwYXJhbVtvdXRdICAgICBvcGFxdWVfZGF0YSAgICAgICBQb2ludGVyIHRvIG1lbW9yeSBibG9jaworICogIAkgd2hlcmUgcGNpZSBkcml2ZXIgcHV0IG9wYXF1ZSBkYXRhIHRvIGJlIGNvbnZleWVkIHRvIHRoZQorICogIAkgb3RoZXIgc2lkZQorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfcHJlX2Nvbm5lY3QodWludDhfdCBkZXZpY2UsIGNvbnN0IGJjbXRyX3BjaWVfcHJlX2Nvbm5lY3RfY2ZnICpjZmcsCisgICAgYmNtdHJfcGNpZV9vcGFxdWVfZGF0YSAqZGF0YSk7CisKKy8qKiBDb25uZWN0CisgKiAgCU9uIE1hcGxlIG9wYXF1ZV9kYXRhIGlzIE5VTEwKKyAqICAJT24gSG9zdCBvcGFxdWVfZGF0YSBjb250YWlucyB0aGUgcG9pbnRlcnMgdG8gUERzIGluCisgKiAgCU1hcGxlCisgKiBccGFyYW1baW5dICBkZXZpY2UgICAgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dIG9wYXF1ZV9kYXRhICBQb2ludGVyIHRvIG9wYXF1ZSBkYXRhIGJsb2NrCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9jb25uZWN0KHVpbnQ4X3QgZGV2aWNlLCBjb25zdCBiY210cl9wY2llX29wYXF1ZV9kYXRhICpkYXRhKTsKKworLyoqIERpc2Nvbm5lY3QuIEFsbCBidWZmZXJzIGFyZSByZWxlYXNlZAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtpbl0gICBvcGFxdWVfZGF0YSAgUG9pbnRlciB0byBvcGFxdWUgZGF0YSBibG9jaworICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfZGlzY29ubmVjdCh1aW50OF90IGRldmljZSk7CisKKy8qCisgKiBSZWNlaXZlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbi4KKyAqIEF0dGVudGlvbiBQQ0llIGRyaXZlciBpbXBsZW1lbnRlciEhCisgKiBSZWNlaXZlZCBwYWNrZXRzIG11c3Qgc3RheSBpbiB0aGUgcXVldWUgdW50aWwgcmVjZWl2ZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLgorICovCisKKy8qKiBQQ0llIGludGVyZmFjZSBpbnRlcnJ1cHQgcmVjZWl2ZSBjYWxsYmFjayAqLwordHlwZWRlZiB2b2lkICgqZl9iY210cl9pbnQpKHVpbnQ4X3QgZGV2aWNlKTsKKworLyoqIFJlZ2lzdGVyIHJlY2VpdmUgY2FsbGJhY2sKKyAqIFxwYXJhbVtpbl0gICByeF9pc3IgICAgSW50ZXJydXB0IFJlY2VpdmUgY2FsbGJhY2sKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3J4X2lycV9jYmxrX3JlZ2lzdGVyKGZfYmNtdHJfaW50IHVzZXJfcnhfaXNyX2NsYmspOworCisvKiogVW5yZWdpc3RlciByZWNlaXZlIGNhbGxiYWNrLgorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfcnhfaXJxX2NibGtfdW5yZWdpc3Rlcih2b2lkKTsKKworLyoqIFJlZ2lzdGVyIHRyYW5zbWl0IGNvbXBsZXRpb24gaW50ZXJydXB0IGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgdHhfaXNyICAgIFRyYW5zZmVyIGNvbXBsZXRlZCBpbnRlcnJ1cHQgY2FsbGJhY2sKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3R4X2lycV9jYmxrX3JlZ2lzdGVyKGZfYmNtdHJfaW50IHVzZXJfdHhfaXNyX2NsYmspOworCisvKiogVW5yZWdpc3RlciB0cmFuc21pdCBjb21wbGV0ZWQgaW50ZXJydXB0IGNhbGxiYWNrLgorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfdHhfaXJxX2NibGtfdW5yZWdpc3Rlcih2b2lkKTsKKworLyoqIFR4IGRvbmUgY2FsbGJhY2sgKi8KK3R5cGVkZWYgdm9pZCAoKmZfYmNtdHJfZG9uZSkodWludDhfdCBkZXZpY2UsIGJjbW9zX2J1ZiAqYnVmKTsKKworLyoqIFJlZ2lzdGVyIGJ1ZmZlciB0cmFuc21pdCBjb21wbGV0aW9uIGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgdHhfZG9uZSAgIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjaworICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfdHhfZG9uZV9jYmxrX3JlZ2lzdGVyKGZfYmNtdHJfZG9uZSB0eF9kb25lX2NiKTsKKworLyoqIFVucmVnaXN0ZXIgYnVmZmVyIHRyYW5zbWl0IGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3R4X2RvbmVfY2Jsa191bnJlZ2lzdGVyKHZvaWQpOworCisvKiogU2VuZCBidWZmZXIgdG8gdGhlIHBlZXIKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgY2hhbm5lbCAgIENoYW5uZWwgaWQgKG9wYXF1ZSB0byB0aGUgYmNtdHJfcGNpZSBkcml2ZXIpCisgKiBccGFyYW1baW5dICAgYnVmICAgICAgIEJ1ZmZlciB0byBiZSB0cmFuc2ZlcnJlZAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfc2VuZCh1aW50OF90IGRldmljZSwgdWludDhfdCBjaGFubmVsLCBiY21vc19idWYgKmJ1Zik7CisKKy8qKiBSZWNsYWltIGJ1ZmZlcnMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiB0cmFuc21pdHRlZAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxyZXR1cm5zOiBudW1iZXIgb2YgcmVjbGFpbWVkIFRYIGJ1ZmZlcnMgPj0gMCBvciBiY21vc19lcnJubyBlcnJvciBjb2RlIDwwCisgKi8KK2ludCBiY210cl9wY2llX3R4X2NvbGxlY3QodWludDhfdCBkZXZpY2UpOworCisvKiogRmV0Y2ggcmVjZWl2ZWQgYnVmZmVyIGZyb20gaC93IHF1ZXVlCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW291dF0gIGNoYW5uZWwgICAgICAgICBtZXNzYWdlIGNoYW5uZWwgZnJvbSB0aGUgQkQKKyAqIFxwYXJhbVtvdXRdICBidWYgICAgICAgICAgICAgcG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlciBjb250YWluaW5nIHRoZSByZWNlaXZlZCBwYWNrZXQKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3JlY2VpdmUodWludDhfdCBkZXZpY2UsIHVpbnQ4X3QgKmNoYW5uZWwsIGJjbW9zX2J1ZiAqKmJ1Zik7CisKKy8qKiBFbmFibGUgRE1BX1JYIGludGVycnVwdAorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9yeGludF9lbmFibGUodWludDhfdCBkZXZpY2UpOworCisvKiogRGlzYWJsZSBETUFfUlggaW50ZXJydXB0CisgKiBccGFyYW1baW5dICAgZGV2aWNlICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3J4aW50X2Rpc2FibGUodWludDhfdCBkZXZpY2UpOworCisvKiogQ2xlYXIgRE1BX1JYIGludGVycnVwdAorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9yeGludF9jbGVhcih1aW50OF90IGRldmljZSk7CisKKy8qKiBFbmFibGUgIlRYIGhhbmRsZWQiIGludGVycnVwdAorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV90eGludF9lbmFibGUodWludDhfdCBkZXZpY2UpOworCisvKiogRGlzYWJsZSAiVFggaGFuZGxlZCIgaW50ZXJydXB0CisgKiBccGFyYW1baW5dICAgZGV2aWNlICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3R4aW50X2Rpc2FibGUodWludDhfdCBkZXZpY2UpOworCisvKiogQ2xlYXIgIlRYIGhhbmRsZWQiIGludGVycnVwdAorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV90eGludF9jbGVhcih1aW50OF90IGRldmljZSk7CisKKy8qKiBSZXR1cm5zIHN0YXRpc3RpY3MKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNsZWFyICAgaWYgc2V0LCBjbGVhciBzdGF0aXN0aWNzLCBvdGhlcndpc2UKKyAqICAgICAgIGFjY3VtdWxhdGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9nZXRfc3RhdGlzdGljcyh1aW50OF90IGRldmljZSwgdWludDMyX3QgY2xlYXIsIGJjbV9wY2llZF9zdGF0ICpzdGF0KTsKKworLyoqIER1bXAgZGF0YSBiYXNlCisgKiBccGFyYW1baW5dICAgb3V0cHV0ICBOVUxMKHdpbGwgcHJpbnQgdG8gc3Rkb3V0KSBvciBwb2ludGVyIHRvCisgKiAgICAgICBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHN0YXJ0ICAgaW5kZXggb2YgdGhlIHN0YXJ0IGVudHJ5IGluIHJpbmcsIC0xCisgKiAgICAgICBtZWFucyBjdXJyZW50CisgKiBccGFyYW1baW5dICAgbnVtYmVyX29mX2VudHJpZXMgIGhvdyBtYW55IGVudHJpZXMgZnJvbSB0aGUKKyAqICAgICAgIHN0YXJ0CisgKiBccmV0dXJuczogMCBpZiBvdXRwdXQgaXMgTlVMTCBvciBidWZmZXIgbGVuZ3RoCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfdHhfZHVtcChjaGFyICpvdXRwdXQsIHVpbnQ4X3QgZGV2aWNlLCBpbnQzMl90IHN0YXJ0LCBpbnQzMl90IG51bWJlcl9vZl9lbnRyaWVzKTsKK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfcnhfZHVtcChjaGFyICpvdXRwdXQsIHVpbnQ4X3QgZGV2aWNlLCBpbnQzMl90IHN0YXJ0LCBpbnQzMl90IG51bWJlcl9vZl9lbnRyaWVzKTsKKworCisjZW5kaWYgLyogQkNNVFJfUENJRV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3N3X2Vycm9yL2JjbW9sdF9zd19lcnJvci5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3N3X2Vycm9yL2JjbW9sdF9zd19lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTVlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvc3dfZXJyb3IvYmNtb2x0X3N3X2Vycm9yLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX1NXX0VSUk9SX0hfCisjZGVmaW5lIF9CQ01PTFRfU1dfRVJST1JfSF8KKworI2RlZmluZSBCQ01PTFRfU1dfRVJST1JfTUFYX0ZJTEVfTkFNRV9MRU4gNjQKKyNkZWZpbmUgQkNNT0xUX1NXX0VSUk9SX01BWF9UQVNLX05BTUVfTEVOIDY0CisKK3R5cGVkZWYgc3RydWN0IF9fUEFDS0VEX0FUVFJfU1RBUlRfXworeworICAgIHVpbnQ2NF90IGZpcnN0X2Vycm9yX3RpbWU7CisgICAgdWludDY0X3QgbGFzdF9lcnJvcl90aW1lOworICAgIHVpbnQzMl90IGxpbmVfbnVtYmVyOworICAgIHVpbnQzMl90IGVycm9yX2NvdW50ZXI7CisgICAgdWludDMyX3QgaW5zdGFuY2U7CisgICAgY2hhciBmaWxlX25hbWVbQkNNT0xUX1NXX0VSUk9SX01BWF9GSUxFX05BTUVfTEVOXTsKKyAgICBjaGFyIHRhc2tfbmFtZVtCQ01PTFRfU1dfRVJST1JfTUFYX1RBU0tfTkFNRV9MRU5dOworfSBfX1BBQ0tFRF9BVFRSX0VORF9fIGJjbW9zX3N3X2Vycm9yOworCit0eXBlZGVmIHN0cnVjdCBfX1BBQ0tFRF9BVFRSX1NUQVJUX18KK3sKKyAgICB1aW50MzJfdCBjb3VudDsKKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpIC8qKjwgQ2hlY2sgd2hldGhlciBDOTkgaXMgc3VwcG9ydGVkICovCisgICAgYmNtb3Nfc3dfZXJyb3IgZXJyb3JbXTsKKyNlbHNlCisgICAgYmNtb3Nfc3dfZXJyb3IgZXJyb3JbMV07CisjZW5kaWYKK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21vc19zd19lcnJvcl90YWJsZTsKKworI2VuZGlmIC8qIF9CQ01PTFRfU1dfRVJST1JfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9zd192ZXJzaW9uL2JjbW9sdF9ob3N0X3N3X3ZlcnNpb24uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9zd192ZXJzaW9uL2JjbW9sdF9ob3N0X3N3X3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDc1MmZmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3N3X3ZlcnNpb24vYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbi5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX0hPU1RfU1dfVkVSU0lPTl9IXworI2RlZmluZSBCQ01PTFRfSE9TVF9TV19WRVJTSU9OX0hfCisKKyNkZWZpbmUgQkNNT0xUX0hPU1RfTUFKT1JfVkVSICAgIDIKKyNkZWZpbmUgQkNNT0xUX0hPU1RfTUlOT1JfVkVSICAgIDIKKyNkZWZpbmUgQkNNT0xUX0hPU1RfUkVWSVNJT05fVkVSIDIKKworCisjZW5kaWYgLyogQkNNT0xUX0hPU1RfU1dfVkVSU0lPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkN2RkYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIyBUcmFuc3BvcnQKKyMKK01PRF9OQU1FID0gdHJhbnNwb3J0CitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSB1dGlscyBjbGkgbW9kZWwgY29tbW9uX2FwaSB0cl9wbHVnaW4gZGV2X2xvZworCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfREVQUyArPSBhcGlfY2xpCisgICAgVFJfUEVSRl9URVNUID0gbgorZWxzZQorICAgIE1PRF9ERVBTICs9IGFwaV9jbGlfaGVscGVycworZW5kaWYKKworaWZlcSAoIiQoU1VCU1lTVEVNKSIsICJob3N0IikKKyAgICBNT0RfREVQUyArPSBkZXZpY2Vfc2VsZWN0b3IKK2VuZGlmCisKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorZW5kaWYKKworc3JjcyA9IGJjbXRyX3RyYW5zcG9ydC5jIGJjbXRyX2NvbmZpZy5jIGJjbXRyX2RlYnVnLmMKKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisJc3JjcyArPSBiY210cl90cmFuc3BvcnRfY2xpLmMgYmNtdHJfZGVidWdfY2xpLmMKK2Vsc2UKKyAgICBUUl9QRVJGX1RFU1QgPSBuCitlbmRpZgorCitDT05GSUdfVFJBTlNQT1JUX1JBVyA/PSBuCitDT05GSUdfVFJBTlNQT1JUX1VEUCA/PSB5CisKKyMgRXh0cmEgY29uZmlndXJhdGlvbgoraWZlcSAoIiQoQ09ORklHX1RSQU5TUE9SVF9SQVcpIiwgInkiKQorCU1PRF9ERVBTICs9IHRyX3BsdWdpbl9tdXgKKwlDT05GSUdfVFJBTlNQT1JUX1VEUCA9IG4KK2VuZGlmCitpZmVxICgiJChDT05GSUdfVFJBTlNQT1JUX1VEUCkiLCAieSIpCisJTU9EX0RFUFMgKz0gdHJfcGx1Z2luX3VkcAorZW5kaWYKKworVFJfUEVSRl9URVNUID89IHkKK2lmZXEgKCIkKFRSX1BFUkZfVEVTVCkiLCAieSIpCisgICAgRVhUUkFfREVGSU5FUyArPSAtREJDTVRSX1BFUkZURVNUCisgICAgRVhUUkFfSU5DTFVERVMgKz0gLUkkKFNSQ19ESVIpL3Rlc3QKKyAgICBzcmNzICs9IHRlc3QvYmNtdHJfcGVyZnRlc3QuYworZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfY29uZmlnLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYzQ3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2NvbmZpZy5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY210cl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImJjbXRyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImJjbXRyX3BsdWdpbi5oIgorCisKKyNpZmRlZiBCQ01UUl9VRFBfU1VQUE9SVAorCit1aW50MzJfdCBiY210cl9ob3N0X2lwID0gQkNNVFJfVFJfVURQX0hPU1RfSVA7Cit1aW50MTZfdCBiY210cl9ob3N0X3VkcF9wb3J0ID0gQkNNVFJfVFJfVURQX0hPU1RfUE9SVDsKK3VpbnQzMl90IGJjbXRyX29sdF9pcFtCQ01UUl9NQVhfT0xUU107Cit1aW50MTZfdCBiY210cl9vbHRfdWRwX3BvcnRbQkNNVFJfTUFYX09MVFNdOworCisjZW5kaWYKKworLyogRmV0Y2ggY29uZmlndXJhdGlvbgorICogc2V0LXVwIHRyYW5zcG9ydCBkcml2ZXIgcGx1Z2luCisgKiBFdmVudHVhbGx5IHRoaXMgZnVuY3Rpb24gY2FuIHJlYWQgZnJvbSBjb25maWcgZmlsZSBvciBkZXZpY2UgY29udHJvbCBkcml2ZXIuCisgKiBGb3Igbm93IC0gaGFyZGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cl9jZmcgKmNmZywgYmNtdHJfZHJpdmVyICpkcml2ZXIpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisKKyAgICBjZmctPm1heF9yZXRyaWVzID0gQkNNVFJfTUFYX1JFVFJJRVM7CisgICAgY2ZnLT5tc2dfdGltZW91dCA9IEJDTVRSX01TR19USU1FT1VUOworICAgIGNmZy0+bWF4X2ZyYWdtZW50cyA9IEJDTVRSX01BWF9GUkFHTUVOVFM7CisgICAgY2ZnLT5tYXhfcmVxdWVzdHMgPSBCQ01UUl9NQVhfUkVRVUVTVFM7CisgICAgY2ZnLT5tYXhfYXV0b3MgPSBCQ01UUl9NQVhfQVVUT1M7CisgICAgY2ZnLT5tYXhfbXR1ID0gQkNNVFJfTUFYX01UVV9TSVpFOworICAgIGNmZy0+bXNnX3dhaXRfdGltZW91dCA9IEJDTVRSX01TR19XQUlUX01TOworICAgIGNmZy0+bXNnX3JlYWR5X3RpbWVvdXQgPSBCQ01UUl9NU0dfUkVBRFlfTVM7CisgICAgY2ZnLT5wbHVnaW5fY2ZnLnR5cGUgPSBCQ01UUl9UUl9UWVBFOworICAgIGNmZy0+cnhfdGhyZWFkX3ByaW9yaXR5ID0gVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUlg7CisKKyNpZmRlZiBCQ01UUl9VRFBfU1VQUE9SVAorI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorICAgIGNmZy0+cGx1Z2luX2NmZy54LnVkcC5teV9pcCA9IGJjbXRyX2hvc3RfaXA7CisgICAgY2ZnLT5wbHVnaW5fY2ZnLngudWRwLnJlbW90ZV9pcCA9IGJjbXRyX29sdF9pcFtkZXZpY2VdOworICAgIGNmZy0+cGx1Z2luX2NmZy54LnVkcC5teV9wb3J0ID0gYmNtdHJfaG9zdF91ZHBfcG9ydCArIGRldmljZTsKKyAgICBjZmctPnBsdWdpbl9jZmcueC51ZHAucmVtb3RlX3BvcnQgPSBiY210cl9vbHRfdWRwX3BvcnRbZGV2aWNlXTsKKyNlbHNlCisgICAgY2ZnLT5wbHVnaW5fY2ZnLngudWRwLm15X2lwID0gYmNtdHJfb2x0X2lwW2RldmljZV07CisgICAgY2ZnLT5wbHVnaW5fY2ZnLngudWRwLnJlbW90ZV9pcCA9IGJjbXRyX2hvc3RfaXA7CisgICAgY2ZnLT5wbHVnaW5fY2ZnLngudWRwLm15X3BvcnQgPSBiY210cl9vbHRfdWRwX3BvcnRbZGV2aWNlXTsKKyAgICBjZmctPnBsdWdpbl9jZmcueC51ZHAucmVtb3RlX3BvcnQgPSBiY210cl9ob3N0X3VkcF9wb3J0ICsgZGV2aWNlOworI2VuZGlmCisjZW5kaWYKKworICAgIHJjID0gYmNtdHJfcGx1Z2luX2luaXQoJmNmZy0+cGx1Z2luX2NmZywgZHJpdmVyKTsKKworICAgIHJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl9kZWJ1Zy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OTYzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnLmMKQEAgLTAsMCArMSw4NzYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY210cl9kZWJ1Zy5oPgorI2luY2x1ZGUgPGJjbWNsaV9zZXNzaW9uLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tYXRoLmg+CisKKyNpZmRlZiBFTkFCTEVfTE9HCisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0NMSQorI2luY2x1ZGUgPGJjbXRyX2RlYnVnX2NsaS5oPgorI2VuZGlmCisKKy8qIE1lc3NhZ2VzIGFyZSByZWNvcmRlZCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAqIHVpbnQzMl90IC0gZXZlbnQgdHlwZQorICogdWludDMyX3QgLSB0aW1lc3RhbXAKKyAqIHVpbnQzMl90IC0gbWVzc2FnZSBkYXRhIHNpemUKKyAqIDxtZXNzYWdlIGRhdGE+IC0gcGFkZGVkIHRvIHRoZSBuZWFyZXN0IDQgYnl0ZXMKKyAqIHVpbnQzMl90IC0gdG90YWwgc2l6ZSAtIHRvdGFsIGNhcHR1cmUgZW50cnkgc2l6ZSwgaW5jbHVkaW5nIGNvbnRyb2wgaW5mbworICovCisKKy8qIE92ZXJoZWFkIHNpemU6IGVudHJ5IGhlYWRlciArIHVpbnQzMl90IHN1ZmZpeCAqLworI2RlZmluZSBCQ01UUl9DQVBUVVJFX09WRVJIRUFEX1NJWkUgIChzaXplb2YoYmNtdHJfY2FwdHVyZV9lbnRyeSkgKyBzaXplb2YodWludDMyX3QpKQorCisjZGVmaW5lIEJDTVRSX0NBUFRVUkVfRU5UUllfRklFTERTICAoc2l6ZW9mKGJjbXRyX2NhcHR1cmVfZW50cnkpIC8gc2l6ZW9mKHVpbnQzMl90KSkKKworLyogTWF4aW11bSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVycyBmb3IgYSBtZXNzYWdlIGR1bXAgKi8KKyNkZWZpbmUgQkNNVFJfTUFYX01TR19EVU1QX1NUUl9TSVpFIDQwOTYKKworLyogQ2FwdHVyZSBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbXRyX2NhcHR1cmVfcGFybSBwYXJtOyAgICAgICAgICAgIC8qIENhcHR1cmUgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9zX2Jvb2wgYWN0aXZlOworCisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDhfdCAqZW5kOworICAgIHVpbnQ4X3QgKmN1cjsKKyAgICB1aW50MzJfdCBzaXplOyAgICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgc2l6ZSAqLworICAgIHVpbnQzMl90IHVzZWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIEJ5dGVzIHVzZWQgKi8KKyAgICB1aW50MzJfdCB3YTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdGltZXMgYnVmZmVyIHdyYXBwZWQgYXJvdW5kICovCisgICAgdWludDMyX3QgZXZlbnRzOyAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGNhcHR1cmUgZXZlbnRzICovCit9IGJjbXRyX2NhcHR1cmVfYnVmOworCitzdGF0aWMgYmNtdHJfY2FwdHVyZV9idWYgY2FwdHVyZV9idWZbQkNNVFJfTUFYX09MVFNdOworCisvKiBDTEkgc2Vzc2lvbiB3aGVyZSB0byBkdW1wICovCitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gKmJjbXRyX2NsZF9zZXNzaW9uOworCisjaWZkZWYgRU5BQkxFX0xPRworLyogTG9nZ2VyIHVzZWQgZm9yIEJDTVRSX0NMRF9MT0cgKi8KK3N0YXRpYyBkZXZfbG9nX2lkIGJjbXRyX2NsZF9sb2dfaWQ7CisjZW5kaWYKKworLyogR2xvYmFsIHZhcmlhYmxlOiBwZXIgbXNnX2lkIENMRCBsZXZlbCAqLworYmNtdHJfY2xkX3R5cGUgYmNtdHJfY2xkX2FjdGl2ZV9sZXZlbFtCQ01UUl9NQVhfT0xUU11bQkNNT0xUX0dST1VQX0lEX19OVU1fT0ZdOworCisvKiBDcmVhdGUgYSBkdW1teSBDTEkgc2Vzc2lvbiBzbyB3ZSBjYW4gcHJpbnQgdG8gYSBidWZmZXIgaW50ZXJuYWxseSBiZWZvcmUgcHJpbnRpbmcgdG8gdGhlIHJlYWwgQ0xJLgorICogVGhpcyB3YXksIHRoZSBvdXRwdXQgY2FuJ3QgYmUgaW50ZXJydXB0ZWQgYnkgYW5vdGhlciBwcmludC4gKi8KK3N0YXRpYyBjaGFyIGJjbXRyX2NsZF9zY3JhdGNoX2J1ZltCQ01UUl9NQVhfTVNHX0RVTVBfU1RSX1NJWkVdOworc3RhdGljIHVpbnQzMl90IGJjbXRyX2NsZF9zY3JhdGNoX3BvcyA9IDA7CitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gKmJjbXRyX2NsZF9zY3JhdGNoX3Nlc3Npb247CisKKy8qCisgKiBJbnRlcm5hbCBmdW5jdGlvbnMKKyAqLworCisvKiBDTEkgc2Vzc2lvbiBwcmludCBjYWxsYmFjayBmb3IgdGhlIHNjcmF0Y2ggYnVmZmVyICovCitzdGF0aWMgaW50IGJjbXRyX2xvZ19jbGlfcHJpbnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBzaXplID0gTUlOKHNpemUsIEJDTVRSX01BWF9NU0dfRFVNUF9TVFJfU0laRSAtIGJjbXRyX2NsZF9zY3JhdGNoX3Bvcyk7CisgICAgaWYgKHNpemUgPiAwKQorICAgIHsKKyAgICAgICAgbWVtY3B5KCZiY210cl9jbGRfc2NyYXRjaF9idWZbYmNtdHJfY2xkX3NjcmF0Y2hfcG9zXSwgYnVmLCBzaXplKTsKKyAgICB9CisgICAgYmNtdHJfY2xkX3NjcmF0Y2hfcG9zICs9IHNpemU7CisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qIEdldCBtZXNzYWdlIGV2ZW50IG5hbWUgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqYmNtdHJfY2xkX2V2ZW50X25hbWUoYmNtdHJfY2xkX2V2ZW50X3R5cGUgZXYpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmV2X25hbWVbXSA9IHsKKyAgICAgICAgW0JDTVRSX0NMRF9FVl9TRU5EXSAgICAgPSAidHgiLAorICAgICAgICBbQkNNVFJfQ0xEX0VWX1JFU0VORF0gICA9ICJyZS10eCIsCisgICAgICAgIFtCQ01UUl9DTERfRVZfUkVDVl0gICAgID0gInJ4IiwKKyAgICAgICAgW0JDTVRSX0NMRF9FVl9SRUNWX0RJU0NBUkRdID0gInJ4LWRpc2NhcmQiLAorICAgICAgICBbQkNNVFJfQ0xEX0VWX1RJTUVPVVRdID0gInRpbWVvdXQiCisgICAgfTsKKyAgICByZXR1cm4gZXZfbmFtZVtldl07Cit9CisKKy8qIFN0b3JlIGRhdGEgaW4gY2FwdHVyZSBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfYmNtdHJfY2FwdHVyZV9zdG9yZShiY210cl9jYXB0dXJlX2J1ZiAqdGIsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemUpCit7CisgICAgaW50MzJfdCBsZWZ0ID0gKGludDMyX3QpKHRiLT5lbmQgLSB0Yi0+Y3VyKTsKKyAgICBpZiAobGVmdCA+PSAoaW50MzJfdClzaXplKQorICAgIHsKKyAgICAgICAgbWVtY3B5KHRiLT5jdXIsIGRhdGEsIHNpemUpOworICAgICAgICB0Yi0+Y3VyICs9IHNpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1lbWNweSh0Yi0+Y3VyLCBkYXRhLCBsZWZ0KTsKKyAgICAgICAgbWVtY3B5KHRiLT5zdGFydCwgKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbGVmdCwgc2l6ZSAtIGxlZnQpOworICAgICAgICB0Yi0+Y3VyID0gdGItPnN0YXJ0ICsgc2l6ZSAtIGxlZnQ7CisgICAgICAgICsrdGItPndhOworICAgIH0KKyAgICB0Yi0+dXNlZCArPSBzaXplOworICAgIGlmICh0Yi0+dXNlZCA+IHRiLT5zaXplKQorICAgICAgICB0Yi0+dXNlZCA9IHRiLT5zaXplOworfQorCisKKy8qIEdldCBjYXB0dXJlIGVudHJ5IHNpemUgYW5kIHN0YXJ0IHBvaW50ZXIgZ2l2ZW4gcG9pbnRlciByaWdodCBhZnRlciB0aGUgZW50cnkgKi8KK3N0YXRpYyB2b2lkIF9iY210cl9jYXB0dXJlX2dldF9wcmV2KGJjbXRyX2NhcHR1cmVfYnVmICp0YiwgdWludDhfdCAqcHRyLCB1aW50MzJfdCAqcHJldl9zaXplLCB1aW50OF90ICoqcHJldl9wdHIpCit7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50OF90ICpwcmV2OworCisgICAgaWYgKHB0ciA9PSB0Yi0+c3RhcnQpCisgICAgICAgIHB0ciA9IHRiLT5lbmQ7CisgICAgc2l6ZSA9ICooKCh1aW50MzJfdCAqKShsb25nKXB0cikgLSAxKTsKKyAgICBCVUdfT04oIXNpemUgfHwgc2l6ZSA+IDB4ZmZmZiB8fCAoc2l6ZSAmIDB4MykpOworICAgIHByZXYgPSBwdHIgLSBzaXplOworICAgIGlmIChwcmV2IDwgdGItPnN0YXJ0KQorICAgICAgICBwcmV2ID0gdGItPmVuZCAtIChzaXplIC0gKHB0ciAtIHRiLT5zdGFydCkpOworICAgICpwcmV2X3NpemUgPSBzaXplOworICAgICpwcmV2X3B0ciA9IHByZXY7Cit9CisKKy8qIEdldCBudW1iZXIgb2YgY29tcGxldGUgbWVzc2FnZXMgc3RvcmVkIGluIGNhcHR1cmUgYnVmZmVyICovCitzdGF0aWMgdWludDMyX3QgX2JjbXRyX2NhcHR1cmVfbm1zZ3MoYmNtdHJfY2FwdHVyZV9idWYgKnRiKQoreworICAgIHVpbnQzMl90IG4gPSAwOworICAgIHVpbnQzMl90IHByZXZfbGVuZ3RoOworICAgIHVpbnQ4X3QgKnByZXZfc3RhcnQgPSB0Yi0+Y3VyOworCisgICAgaWYgKCF0Yi0+dXNlZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBVbndpbmQgY2FwdHVyZSBidWZmZXIgYmFja3dhcmQgKi8KKyAgICB3aGlsZSAobiA8IHRiLT5ldmVudHMpCisgICAgeworICAgICAgICB1aW50OF90ICpwcmV2ID0gcHJldl9zdGFydDsKKyAgICAgICAgX2JjbXRyX2NhcHR1cmVfZ2V0X3ByZXYodGIsIHByZXYsICZwcmV2X2xlbmd0aCwgJnByZXZfc3RhcnQpOworICAgICAgICBpZiAocHJldl9zdGFydCA+PSBwcmV2KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrbjsKKyAgICB9CisKKyAgICAvKiBJZiBidWZmZXIgaGFzIHdyYXBwZWQgYXJvdW5kIC0gY29udGludWUgdW53aW5kaW5nICovCisgICAgaWYgKHRiLT53YSkKKyAgICB7CisgICAgICAgIHdoaWxlIChwcmV2X3N0YXJ0ID49IHRiLT5jdXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9iY210cl9jYXB0dXJlX2dldF9wcmV2KHRiLCBwcmV2X3N0YXJ0LCAmcHJldl9sZW5ndGgsICZwcmV2X3N0YXJ0KTsKKyAgICAgICAgICAgICsrbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX2JjbXRyX2NhcHR1cmVfd3JhcCh1aW50OF90ICoqY3VyLCBiY210cl9jYXB0dXJlX2J1ZiAqdGIpCit7CisgICAgaWYgKCpjdXIgPiB0Yi0+ZW5kKQorICAgIHsKKyAgICAgICAgKmN1ciA9IHRiLT5zdGFydCArICgqY3VyIC0gdGItPmVuZCk7CisgICAgfQorfQorc3RhdGljIHZvaWQgX2JjbXRyX2NhcHR1cmVfdW53aW5kKGJjbXRyX2NhcHR1cmVfYnVmICp0YiwgdWludDhfdCAqKnN0YXJ0LCB1aW50MzJfdCAqY291bnQpCit7CisgICAgdWludDMyX3QgcHJldl9sZW5ndGg7CisgICAgdWludDhfdCAqcHJldl9zdGFydDsKKyAgICB1aW50MzJfdCBuID0gMDsKKyAgICB1aW50OF90ICpjdXJfaGRyID0gTlVMTDsKKworICAgIHByZXZfc3RhcnQgPSB0Yi0+Y3VyOworICAgIHdoaWxlIChuIDwgdGItPmV2ZW50cykKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgKnByZXYgPSBwcmV2X3N0YXJ0OworICAgICAgICBfYmNtdHJfY2FwdHVyZV9nZXRfcHJldih0YiwgcHJldiwgJnByZXZfbGVuZ3RoLCAmcHJldl9zdGFydCk7CisgICAgICAgIGlmIChwcmV2X3N0YXJ0ID49IHByZXYpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKytuOworICAgICAgICBjdXJfaGRyID0gcHJldl9zdGFydDsKKyAgICB9CisKKyAgICAvKiBJZiBidWZmZXIgaGFzIHdyYXBwZWQgYXJvdW5kIC0gY29udGludWUgdW53aW5kaW5nICovCisgICAgaWYgKHRiLT53YSkKKyAgICB7CisgICAgICAgIHdoaWxlIChwcmV2X3N0YXJ0ID49IHRiLT5jdXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cl9oZHIgPSBwcmV2X3N0YXJ0OworICAgICAgICAgICAgX2JjbXRyX2NhcHR1cmVfZ2V0X3ByZXYodGIsIHByZXZfc3RhcnQsICZwcmV2X2xlbmd0aCwgJnByZXZfc3RhcnQpOworICAgICAgICAgICAgKytuOworICAgICAgICB9CisgICAgfQorCisgICAgKnN0YXJ0ID0gY3VyX2hkcjsKKyAgICAqY291bnQgPSBuOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9iY210cl9jYXB0dXJlX21zZ19zaXplX2dldCh1aW50OF90ICpidWYpCit7CisgICAgLyogV0FSTklORzogZG8gTk9UIGFjY2VzcyBhbnkgbWVtYmVycyBvZiBiY210cl9jYXB0dXJlX2VudHJ5IG90aGVyIHRoYW4gbXNnX3NpemUgKHRoZSBmaXJzdCBtZW1iZXIpIGFzIHRoZXkgbWF5CisgICAgICAgaGF2ZSBiZWVuIHdyYXBwZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiAqLworICAgIHJldHVybiAoKGJjbXRyX2NhcHR1cmVfZW50cnkgKikobG9uZylidWYpLT5tc2dfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgX2JjbXRyX2NhcHR1cmVfY29weSgKKyAgICBiY210cl9jYXB0dXJlX2J1ZiAqdGIsCisgICAgdWludDhfdCAqKmRzdCwKKyAgICB1aW50OF90ICpzcmMsCisgICAgdWludDMyX3QgdG9fY29weSwKKyAgICB1aW50MzJfdCAqcmVtYWluaW5nKQoreworICAgIHVpbnQzMl90IGxlZnQ7CisKKyAgICBsZWZ0ID0gdGItPmVuZCAtIHNyYzsKKyAgICBpZiAobGVmdCA8IHRvX2NvcHkpCisgICAgeworICAgICAgICBtZW1jcHkoKmRzdCwgc3JjLCBsZWZ0KTsKKyAgICAgICAgbWVtY3B5KCgqZHN0KSArIGxlZnQsIHRiLT5zdGFydCwgdG9fY29weSAtIGxlZnQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtZW1jcHkoKmRzdCwgc3JjLCB0b19jb3B5KTsKKyAgICB9CisgICAgKCpkc3QpICs9IHRvX2NvcHk7CisgICAgKCpyZW1haW5pbmcpIC09IHRvX2NvcHk7Cit9CisKK3N0YXRpYyB2b2lkIF9iY210cl9jYXB0dXJlX2NvcHlfYm91bmRlZCgKKyAgICBiY210cl9jYXB0dXJlX2J1ZiAqdGIsCisgICAgdWludDhfdCAqKmRzdCwKKyAgICB1aW50OF90ICpzcmMsCisgICAgdWludDMyX3QgdG9fY29weSwKKyAgICB1aW50MzJfdCAqcmVtYWluaW5nLAorICAgIHVpbnQzMl90IGJvdW5kKQoreworICAgIGlmIChib3VuZCA8IHRvX2NvcHkpCisgICAgeworICAgICAgICBzcmMgKz0gdG9fY29weSAtIGJvdW5kOworICAgICAgICB0b19jb3B5ID0gYm91bmQ7CisgICAgfQorICAgIGlmICgoKnJlbWFpbmluZykgPCB0b19jb3B5KQorICAgIHsKKyAgICAgICAgdG9fY29weSA9ICpyZW1haW5pbmc7CisgICAgfQorICAgIF9iY210cl9jYXB0dXJlX2NvcHkodGIsIGRzdCwgc3JjLCB0b19jb3B5LCByZW1haW5pbmcpOworfQorCisvKiBTZXQgY2FwdHVyZSwgbG9nLCBkZWJ1ZyBmb3Igc2VsZWN0ZWQgbWVzc2FnZXMgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NsZF9sZXZlbF9zZXQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtdHJfY2xkX2ZpbHRlciAqZmlsdGVyLCBiY210cl9jbGRfdHlwZSBjbGRfbGV2ZWwpCit7CisgICAgYmNtb2x0X2dyb3VwX2lkIG1zZ19pZDsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmICgodW5zaWduZWQpZGV2aWNlID49IEJDTVRSX01BWF9PTFRTIHx8ICFmaWx0ZXIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIEhhbmRsZSB3aWxkY2FyZCBvYmplY3QgKi8KKyAgICBpZiAoZmlsdGVyLT5vYmplY3QgPT0gQkNNT0xUX09CSkVDVF9BTlkpCisgICAgeworICAgICAgICBiY210cl9jbGRfZmlsdGVyIGYgPSAqZmlsdGVyOworCisgICAgICAgIGZvciAoZi5vYmplY3QgPSAwOyBmLm9iamVjdCA8PSBCQ01PTFRfT0JKX0lEX19OVU1fT0Y7IGYub2JqZWN0KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRyX2NsZF9sZXZlbF9zZXQoZGV2aWNlLCAmZiwgY2xkX2xldmVsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgd2lsZGNhcmQgZ3JvdXAgKi8KKyAgICBpZiAoZmlsdGVyLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FOWSkKKyAgICB7CisgICAgICAgIGJjbXRyX2NsZF9maWx0ZXIgZiA9ICpmaWx0ZXI7CisKKyAgICAgICAgZi5zdWJncm91cCA9IEJDTU9MVF9TVUJHUk9VUF9BTlk7CisgICAgICAgIGZvciAoZi5ncm91cCA9IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOyBmLmdyb3VwIDw9IEJDTU9MVF9NR1RfR1JPVVBfX05VTV9PRjsgZi5ncm91cCsrKQorICAgICAgICB7CisgICAgICAgICAgICBiY210cl9jbGRfbGV2ZWxfc2V0KGRldmljZSwgJmYsIGNsZF9sZXZlbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgLyogSGFuZGxlIHdpbGRjYXJkIHN1Ymdyb3VwICovCisgICAgaWYgKGZpbHRlci0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BTlkgfHwgZmlsdGVyLT5zdWJncm91cCA9PSBCQ01PTFRfU1VCR1JPVVBfQU5ZKQorICAgIHsKKyAgICAgICAgYmNtdHJfY2xkX2ZpbHRlciBmID0gKmZpbHRlcjsKKworICAgICAgICBmLnN1Ymdyb3VwID0gMDsKKyAgICAgICAgZm9yIChmLnN1Ymdyb3VwID0gMDsKKyAgICAgICAgICAgIGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKGYub2JqZWN0LCBmLmdyb3VwLCBmLnN1Ymdyb3VwLCAmbXNnX2lkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgICAgZi5zdWJncm91cCsrKQorICAgICAgICB7CisgICAgICAgICAgICBiY210cl9jbGRfbGV2ZWxfc2V0KGRldmljZSwgJmYsIGNsZF9sZXZlbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgLyogSWYgd2UgYXJlIGhlcmUgLSBpdCBpcyBub3QgYSB3aWxkY2FyZCAqLworICAgIHJjID0gYmNtb2x0X2dyb3VwX2lkX2NvbWJpbmUoZmlsdGVyLT5vYmplY3QsIGZpbHRlci0+Z3JvdXAsIGZpbHRlci0+c3ViZ3JvdXAsICZtc2dfaWQpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgQlVHX09OKCh1bnNpZ25lZCltc2dfaWQgPj0gQkNNT0xUX0dST1VQX0lEX19OVU1fT0YpOworICAgIGJjbXRyX2NsZF9hY3RpdmVfbGV2ZWxbZGV2aWNlXVttc2dfaWRdID0gY2xkX2xldmVsOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBHZXQgY2FwdHVyZSwgbG9nLCBkZWJ1ZyBmb3Igc2VsZWN0ZWQgbWVzc2FnZSAqLworYmNtb3NfZXJybm8gYmNtdHJfY2xkX2xldmVsX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY210cl9jbGRfZmlsdGVyICpmaWx0ZXIsIGJjbXRyX2NsZF90eXBlICpjbGRfbGV2ZWwpCit7CisgICAgYmNtb2x0X2dyb3VwX2lkIG1zZ19pZDsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBpZiAoKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyB8fCAhZmlsdGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgcmMgPSBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShmaWx0ZXItPm9iamVjdCwgZmlsdGVyLT5ncm91cCwgZmlsdGVyLT5zdWJncm91cCwgJm1zZ19pZCk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisgICAgQlVHX09OKCh1bnNpZ25lZCltc2dfaWQgPj0gQkNNT0xUX0dST1VQX0lEX19OVU1fT0YpOworICAgICpjbGRfbGV2ZWwgPSBiY210cl9jbGRfYWN0aXZlX2xldmVsW2RldmljZV1bbXNnX2lkXTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEluaXRpYWxpemUgY2FwdHVyZSAqLworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9pbml0KGJjbW9sdF9kZXZpZCBvbHQsIGNvbnN0IGJjbXRyX2NhcHR1cmVfcGFybSAqcGFybSkKK3sKKyAgICBiY210cl9jYXB0dXJlX2J1ZiAqdGI7CisKKyAgICBpZiAob2x0ID49IEJDTVRSX01BWF9PTFRTIHx8ICFwYXJtKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGlmIChjYXB0dXJlX2J1ZltvbHRdLnN0YXJ0KQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoYmNtdHJfY2xkX3Nlc3Npb24sICJUUkFDRS8lZDogYWxyZWFkeSBpbml0aWFsaXplZFxuIiwgb2x0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBpZiAocGFybS0+c2l6ZSA8IEJDTVRSX0NBUFRVUkVfTUlOX0JVRl9TSVpFKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoYmNtdHJfY2xkX3Nlc3Npb24sICJUUkFDRS8lZDogY2FwdHVyZSBidWZmZXIgaXMgdG9vIHNtYWxsICgldSA8ICVkKVxuIiwKKyAgICAgICAgICAgIG9sdCwgcGFybS0+c2l6ZSwgQkNNVFJfQ0FQVFVSRV9NSU5fQlVGX1NJWkUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHRiID0gJmNhcHR1cmVfYnVmW29sdF07CisgICAgdGItPnNpemUgPSBwYXJtLT5zaXplICYgfjB4MzsKKyAgICAvKiBVc2VyLXN1cHBsaWVkIG9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBidWZmZXIgPyAqLworICAgIGlmIChwYXJtLT5wdHIpCisgICAgICAgIHRiLT5zdGFydCA9IHBhcm0tPnB0cjsKKyAgICBlbHNlCisgICAgeworICAgICAgICB0Yi0+c3RhcnQgPSBiY21vc19hbGxvYyhwYXJtLT5zaXplKTsKKyAgICAgICAgaWYgKCF0Yi0+c3RhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zZXNzaW9uLCAiVFJBQ0UvJWQ6IGNhbid0IGFsbG9jYXRlIGNhcHR1cmUgYnVmZmVyXG4iLCBvbHQpOworICAgICAgICAgICAgdGItPnNpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKyAgICB9CisgICAgdGItPmVuZCA9ICh2b2lkICopKChsb25nKXRiLT5zdGFydCArIHBhcm0tPnNpemUpOworICAgIHRiLT5jdXIgPSB0Yi0+c3RhcnQ7CisgICAgdGItPnVzZWQgPSB0Yi0+d2EgPSAwOworICAgIHRiLT5hY3RpdmUgPSBwYXJtLT5hY3RpdmF0ZTsKKyAgICB0Yi0+cGFybSA9ICpwYXJtOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBEZXN0cm95IGNhcHR1cmUgYnVmZmVyICovCit2b2lkIGJjbXRyX2NhcHR1cmVfZGVzdHJveShiY21vbHRfZGV2aWQgb2x0KQoreworICAgIGJjbXRyX2NhcHR1cmVfYnVmICp0YjsKKworICAgIGlmIChvbHQgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIHJldHVybjsKKyAgICB0YiA9ICZjYXB0dXJlX2J1ZltvbHRdOworICAgIHRiLT5hY3RpdmUgPSBCQ01PU19GQUxTRTsKKyAgICBpZiAodGItPnN0YXJ0ICYmICF0Yi0+cGFybS5wdHIpCisgICAgICAgIGJjbW9zX2ZyZWUodGItPnN0YXJ0KTsKKyAgICBtZW1zZXQodGIsIDAsIHNpemVvZigqdGIpKTsKK30KKworLyoqIEdldCBjYXB0dXJlIHJlY29yZGluZyBpbmZvICovCitiY21vc19lcnJubyBiY210cl9jYXB0dXJlX2luZm9fZ2V0KGJjbW9sdF9kZXZpZCBvbHQsIGJjbXRyX2NhcHR1cmVfaW5mbyAqaW5mbykKK3sKKyAgICBiY210cl9jYXB0dXJlX2J1ZiAqdGI7CisKKyAgICBpZiAob2x0ID49IEJDTVRSX01BWF9PTFRTIHx8ICFpbmZvKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIHRiID0gJmNhcHR1cmVfYnVmW29sdF07CisgICAgaWYgKHRiLT5hY3RpdmUpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChiY210cl9jbGRfc2Vzc2lvbiwgIlRSQUNFLyVkOiBtdXN0IHN0b3AgZmlyc3RcbiIsIG9sdCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGluZm8tPnNpemUgPSB0Yi0+c2l6ZTsKKyAgICBpbmZvLT51c2VkID0gdGItPnVzZWQ7CisgICAgaW5mby0+d2EgICA9IHRiLT53YTsKKyAgICBpbmZvLT5tc2dzID0gX2JjbXRyX2NhcHR1cmVfbm1zZ3ModGIpOworICAgIGluZm8tPmxvc3QgPSB0Yi0+ZXZlbnRzIC0gaW5mby0+bXNnczsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9zaXplX2dldChiY21vbHRfZGV2aWQgb2x0LCB1aW50MzJfdCAqc2l6ZSkKK3sKKyAgICBiY210cl9jYXB0dXJlX2J1ZiAqdGI7CisgICAgdWludDMyX3QgbiA9IDA7CisgICAgdWludDhfdCAqY3VyX2hkciA9IE5VTEw7CisgICAgdWludDMyX3QgaTsKKworICAgICpzaXplID0gMDsKKyAgICBpZiAob2x0ID49IEJDTVRSX01BWF9PTFRTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgdGIgPSAmY2FwdHVyZV9idWZbb2x0XTsKKyAgICBpZiAoIXRiLT5zdGFydCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zZXNzaW9uLCAiVFJBQ0UvJWQ6IG5vdCBpbml0aWFsaXplZFxuIiwgb2x0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHRiLT5hY3RpdmUpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChiY210cl9jbGRfc2Vzc2lvbiwgIlRSQUNFLyVkOiBtdXN0IHN0b3AgZmlyc3RcbiIsIG9sdCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgaWYgKCF0Yi0+dXNlZCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8qIFVud2luZCBjYXB0dXJlIGJ1ZmZlciBiYWNrd2FyZCB0byBnZXQgdG8gdGhlIDFzdCByZWNvcmRlZCBtZXNzYWdlICovCisgICAgX2JjbXRyX2NhcHR1cmVfdW53aW5kKHRiLCAmY3VyX2hkciwgJm4pOworCisgICAgLyogImZpcnN0IiBwb2ludHMgdG8gdGhlIDFzdCByZWNvcmRlZCBlbnRyeSBhbmQgIm4iIGNvbnRhaW5zIG51bWJlciBvZiBtZXNzYWdlcy4KKyAgICAgKiBOb3cgZ28gZm9yd2FyZCBhbmQgY29weSB0byB0aGUgdXNlciBidWZmZXIKKyAgICAgKi8KKyAgICBCVUdfT04oIWN1cl9oZHIpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgICB1aW50MzJfdCBtc2dfc2l6ZSA9IF9iY210cl9jYXB0dXJlX21zZ19zaXplX2dldChjdXJfaGRyKSArIHNpemVvZihiY210cl9jYXB0dXJlX2VudHJ5KTsKKyAgICAgICAgdWludDMyX3Qgcm91bmRlZF9zaXplID0gQkNNT1NfUk9VTkRfVVAobXNnX3NpemUsIHNpemVvZih1aW50MzJfdCkpOworCisgICAgICAgICgqc2l6ZSkgKz0gbXNnX3NpemU7CisKKyAgICAgICAgLyogTW92ZSB0byB0aGUgbmV4dCBlbnRyeSBpbiBjYXB0dXJlIGJ1ZmZlciAqLworICAgICAgICBjdXJfaGRyICs9IHJvdW5kZWRfc2l6ZSArIHNpemVvZih1aW50MzJfdCk7CisgICAgICAgIF9iY210cl9jYXB0dXJlX3dyYXAoJmN1cl9oZHIsIHRiKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9yZWFkKGJjbW9sdF9kZXZpZCBvbHQsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCAqbGVuZ3RoKQoreworICAgIGJjbXRyX2NhcHR1cmVfYnVmICp0YjsKKyAgICB1aW50MzJfdCBuID0gMDsKKyAgICB1aW50OF90ICpjdXJfaGRyID0gTlVMTDsKKyAgICB1aW50MzJfdCBjdXJfb2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCBpOworCisgICAgaWYgKG9sdCA+PSBCQ01UUl9NQVhfT0xUUyB8fCAhYnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgdGIgPSAmY2FwdHVyZV9idWZbb2x0XTsKKyAgICBpZiAoIXRiLT5zdGFydCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zZXNzaW9uLCAiVFJBQ0UvJWQ6IG5vdCBpbml0aWFsaXplZFxuIiwgb2x0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHRiLT5hY3RpdmUpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChiY210cl9jbGRfc2Vzc2lvbiwgIlRSQUNFLyVkOiBtdXN0IHN0b3AgZmlyc3RcbiIsIG9sdCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgaWYgKCF0Yi0+dXNlZCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8qIFVud2luZCBjYXB0dXJlIGJ1ZmZlciBiYWNrd2FyZCB0byBnZXQgdG8gdGhlIDFzdCByZWNvcmRlZCBtZXNzYWdlICovCisgICAgX2JjbXRyX2NhcHR1cmVfdW53aW5kKHRiLCAmY3VyX2hkciwgJm4pOworCisgICAgLyogImZpcnN0IiBwb2ludHMgdG8gdGhlIDFzdCByZWNvcmRlZCBlbnRyeSBhbmQgIm4iIGNvbnRhaW5zIG51bWJlciBvZiBtZXNzYWdlcy4KKyAgICAgKiBOb3cgZ28gZm9yd2FyZCBhbmQgY29weSB0byB0aGUgdXNlciBidWZmZXIKKyAgICAgKi8KKyAgICBCVUdfT04oIWN1cl9oZHIpOworICAgIGZvciAoaSA9IDA7IChpIDwgbikgJiYgKCgqbGVuZ3RoKSA+IDApOyBpKyspCisgICAgeworICAgICAgICB1aW50MzJfdCBtc2dfc2l6ZSA9IF9iY210cl9jYXB0dXJlX21zZ19zaXplX2dldChjdXJfaGRyKTsKKyAgICAgICAgdWludDMyX3Qgcm91bmRlZF9zaXplID0gQkNNT1NfUk9VTkRfVVAobXNnX3NpemUsIHNpemVvZih1aW50MzJfdCkpOworCisgICAgICAgIGN1cl9vZmZzZXQgKz0gc2l6ZW9mKGJjbXRyX2NhcHR1cmVfZW50cnkpOworICAgICAgICBpZiAoY3VyX29mZnNldCA+IG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdGVtcFtCQ01UUl9DQVBUVVJFX0VOVFJZX0ZJRUxEU107CisgICAgICAgICAgICB1aW50OF90IGo7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBCQ01UUl9DQVBUVVJFX0VOVFJZX0ZJRUxEUzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBbal0gPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgKigodWludDMyX3QqKShsb25nKWN1cl9oZHIpKTsKKyAgICAgICAgICAgICAgICBjdXJfaGRyICs9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICAgICAgICAgX2JjbXRyX2NhcHR1cmVfd3JhcCgmY3VyX2hkciwgdGIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfYmNtdHJfY2FwdHVyZV9jb3B5X2JvdW5kZWQoCisgICAgICAgICAgICAgICAgdGIsCisgICAgICAgICAgICAgICAgJmJ1ZiwKKyAgICAgICAgICAgICAgICAodWludDhfdCopdGVtcCwKKyAgICAgICAgICAgICAgICBzaXplb2YoYmNtdHJfY2FwdHVyZV9lbnRyeSksCisgICAgICAgICAgICAgICAgbGVuZ3RoLAorICAgICAgICAgICAgICAgIGN1cl9vZmZzZXQgLSBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3VyX2hkciArPSBzaXplb2YoYmNtdHJfY2FwdHVyZV9lbnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBjdXJfb2Zmc2V0ICs9IG1zZ19zaXplOworICAgICAgICBpZiAoY3VyX29mZnNldCA+IG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgX2JjbXRyX2NhcHR1cmVfY29weV9ib3VuZGVkKAorICAgICAgICAgICAgICAgIHRiLAorICAgICAgICAgICAgICAgICZidWYsCisgICAgICAgICAgICAgICAgY3VyX2hkciwKKyAgICAgICAgICAgICAgICBtc2dfc2l6ZSwKKyAgICAgICAgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgY3VyX29mZnNldCAtIG9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBNb3ZlIHRvIHRoZSBuZXh0IGVudHJ5IGluIGNhcHR1cmUgYnVmZmVyICovCisgICAgICAgIGN1cl9oZHIgKz0gcm91bmRlZF9zaXplICsgc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgX2JjbXRyX2NhcHR1cmVfd3JhcCgmY3VyX2hkciwgdGIpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19ib29sIGJjbXRyX2NhcHR1cmVfZW50cnlfZ2V0X25leHQoYmNtb2x0X2J1ZiAqYnVmLCBiY210cl9jYXB0dXJlX2VudHJ5ICpoZHIsIHVpbnQ4X3QgKiptc2cpCit7CisgICAgYmNtb3NfYm9vbCB2YWxpZDsKKworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisgICAgQlVHX09OKGhkciA9PSBOVUxMKTsKKworICAgIHZhbGlkID0gYmNtdHJfY2FwdHVyZV9lbnRyeV91bnBhY2soYnVmLCBoZHIpOworICAgIGlmIChtc2cgIT0gTlVMTCkKKyAgICB7CisgICAgICAgICptc2cgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgfQorICAgIHJldHVybiB2YWxpZCAmJiBiY21vbHRfYnVmX3NraXAoYnVmLCBoZHItPm1zZ19zaXplKTsKK30KKworLyoqIERlY29kZSBhbmQgZHVtcCBjYXB0dXJlIHJlY29yZGluZyAqLworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9kdW1wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfZGV2aWQgb2x0LCB1aW50MzJfdCAqbm1zZ3MpCit7CisgICAgYmNtdHJfY2FwdHVyZV9lbnRyeSBoZHI7CisgICAgdWludDhfdCAqbXNnX3N0YXJ0OworICAgIGJjbW9sdF9idWYgYnVmOworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgdWludDMyX3QgbGVuZ3RoOworICAgIHVpbnQzMl90IHJlbWFpbmluZzsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtdHJfY2FwdHVyZV9zaXplX2dldChvbHQsICZsZW5ndGgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IHJjLCByYyk7CisKKyAgICAvKiBBbGxvY2F0ZSB0ZW1wIGJ1ZmZlciBhbmQgcmVhZCBkYXRhIGludG8gaXQgKi8KKyAgICBkYXRhID0gYmNtb3NfY2FsbG9jKGxlbmd0aCk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJUUkFDRS8lZDogbm8gbWVtb3J5XG4iLCBvbHQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICByZW1haW5pbmcgPSBsZW5ndGg7CisgICAgcmMgPSBiY210cl9jYXB0dXJlX3JlYWQob2x0LCBkYXRhLCAwLCAmcmVtYWluaW5nKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoZGF0YSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBEdW1wICovCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIGxlbmd0aCAtIHJlbWFpbmluZywgZGF0YSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIHdoaWxlIChiY210cl9jYXB0dXJlX2VudHJ5X2dldF9uZXh0KCZidWYsICZoZHIsICZtc2dfc3RhcnQpKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1ZiBtc2dfYnVmOworICAgICAgICBiY21vbHRfbXNnICptc2cgPSBOVUxMOworICAgICAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlxuJTA4eCAlczpcbiIsIGhkci50aW1lc3RhbXAsIGJjbXRyX2NsZF9ldmVudF9uYW1lKGhkci5ldmVudCkpOworICAgICAgICBiY21vbHRfYnVmX2luaXQoJm1zZ19idWYsIGhkci5tc2dfc2l6ZSwgbXNnX3N0YXJ0LCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfdW5wYWNrKCZtc2dfYnVmLCAmbXNnKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgPT0gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICAodm9pZClhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgbXNnKTsKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25faGV4ZHVtcChzZXNzaW9uLCBtc2dfc3RhcnQsIDAsIGhkci5tc2dfc2l6ZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vc19mcmVlKGRhdGEpOworCisgICAgKm5tc2dzID0gX2JjbXRyX2NhcHR1cmVfbm1zZ3MoJmNhcHR1cmVfYnVmW29sdF0pOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiAoUmUpc3RhcnQgLyBTdXNwZW5kIGNhcHR1cmUgcmVjb3JkaW5nICovCitiY21vc19lcnJubyBiY210cl9jYXB0dXJlX3N0YXJ0X3N0b3AoYmNtb2x0X2RldmlkIG9sdCwgYmNtb3NfYm9vbCBzdGFydCkKK3sKKyAgICBpZiAob2x0ID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGlmICghY2FwdHVyZV9idWZbb2x0XS5zdGFydCAmJiBzdGFydCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zZXNzaW9uLAorICAgICAgICAgICAgIlRSQUNFLyVkOiBDYW4ndCBzdGFydCByZWNvcmRpbmcgLSBtdXN0IGluaXRpYWxpemUgZmlyc3RcbiIsIG9sdCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGNhcHR1cmVfYnVmW29sdF0uYWN0aXZlID0gc3RhcnQ7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Jvb2wgYmNtdHJfY2FwdHVyZV9pc19hY3RpdmUoYmNtb2x0X2RldmlkIG9sdCkKK3sKKyAgICByZXR1cm4gY2FwdHVyZV9idWZbb2x0XS5hY3RpdmU7Cit9CisKK2JjbW9zX2Jvb2wgYmNtdHJfY2FwdHVyZV9lbnRyeV91bnBhY2soYmNtb2x0X2J1ZiAqYnVmLCBiY210cl9jYXB0dXJlX2VudHJ5ICplbnRyeSkKK3sKKyAgICByZXR1cm4KKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZlbnRyeS0+bXNnX3NpemUpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmZW50cnktPmV2ZW50KSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJmVudHJ5LT50aW1lc3RhbXApOworfQorCisvKiBOb3RpZnkgbWVzc2FnZSB0byBjYXB0dXJlIG1vZHVsZSAtIGNhbGxlZCBmcm9tIHRoZSB0cmFuc3BvcnQgbGF5ZXIgKi8KK3N0YXRpYyB2b2lkIGJjbXRyX2NhcHR1cmVfbm90aWZ5KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbXRyX2hkciAqdHJoZHIsCisgICAgYmNtdHJfY2xkX2V2ZW50X3R5cGUgZXYsIHVpbnQzMl90IHRzLAorICAgIGNvbnN0IHZvaWQgKnBhY2tlZCwgdWludDMyX3QgcGFja2VkX2xlbmd0aCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbXRyX2NhcHR1cmVfYnVmICp0YjsKKyAgICBiY210cl9jYXB0dXJlX2VudHJ5IGhkcjsKKyAgICB1aW50MzJfdCByb3VuZGVkX3NpemU7CisKKyAgICB0YiA9ICZjYXB0dXJlX2J1ZltkZXZpY2VdOworCisgICAgLyogU2FuaXR5ICovCisgICAgaWYgKCFwYWNrZWQpCisgICAgICAgIHJldHVybjsKKyAgICBoZHIubXNnX3NpemUgPSBwYWNrZWRfbGVuZ3RoOworICAgIC8qIEVuYWJsZSAmIG92ZXJmbG93IGNoZWNrcyAqLworICAgIGlmICghdGItPmFjdGl2ZSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICh0Yi0+cGFybS5zdG9wX29uX2Z1bGwgJiYgKHRiLT51c2VkICsgaGRyLm1zZ19zaXplICsgQkNNVFJfQ0FQVFVSRV9PVkVSSEVBRF9TSVpFID4gdGItPnNpemUpKQorICAgICAgICByZXR1cm47CisgICAgaGRyLnRpbWVzdGFtcCA9IHRzOworICAgIGhkci5ldmVudCA9IGV2OworICAgIHJvdW5kZWRfc2l6ZSA9IEJDTU9TX1JPVU5EX1VQKGhkci5tc2dfc2l6ZSwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgX2JjbXRyX2NhcHR1cmVfc3RvcmUodGIsICZoZHIsIHNpemVvZihoZHIpKTsKKyAgICBfYmNtdHJfY2FwdHVyZV9zdG9yZSh0YiwgcGFja2VkLCByb3VuZGVkX3NpemUpOyAvKiBvdmVyZmxvdyBieSB1cCB0byAzIGJ5dGVzOyBpcyB0aGlzIHNhZmU/ICovCisgICAgcm91bmRlZF9zaXplICs9IHNpemVvZihiY210cl9jYXB0dXJlX2VudHJ5KSArIHNpemVvZih1aW50MzJfdCk7CisgICAgX2JjbXRyX2NhcHR1cmVfc3RvcmUodGIsICZyb3VuZGVkX3NpemUsIHNpemVvZihyb3VuZGVkX3NpemUpKTsKKyAgICArK3RiLT5ldmVudHM7Cit9CisKKy8qIE5vdGlmeSBtZXNzYWdlIHRvIGxvZ2dlciAqLworc3RhdGljIHZvaWQgYmNtdHJfbG9nX25vdGlmeShiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY210cl9oZHIgKmhkciwKKyAgICBiY210cl9jbGRfZXZlbnRfdHlwZSBldiwgdWludDMyX3QgdHMsCisgICAgY29uc3Qgdm9pZCAqcGFja2VkLCB1aW50MzJfdCBwYWNrZWRfbGVuZ3RoLCBiY21vbHRfbXNnICptc2cpCit7CisjaWZkZWYgRU5BQkxFX0xPRworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfb2JqX2lkIG9iajsKKyAgICBiY21vbHRfbWd0X2dyb3VwIGdyb3VwOworICAgIHVpbnQxNl90IHN1Ymdyb3VwOworICAgIGNvbnN0IGNoYXIgKm9ial9uYW1lOworICAgIGNvbnN0IGNoYXIgKnN1Ymdyb3VwX25hbWU7CisgICAgY29uc3QgY2hhciAqZHVtbXlfc3RyOworCisgICAgZXJyID0gYmNtb2x0X2dyb3VwX2lkX3NwbGl0KGhkci0+bXNnX2lkLCAmb2JqLCAmZ3JvdXAsICZzdWJncm91cCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKGVyciAhPSBCQ01fRVJSX09LLCBlcnIsKTsKKworICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X25hbWUob2JqLCAmb2JqX25hbWUsICZkdW1teV9zdHIpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihlcnIgIT0gQkNNX0VSUl9PSywgZXJyLCk7CisKKyAgICBlcnIgPSBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKG9iaiwgZ3JvdXAsIHN1Ymdyb3VwLCAmc3ViZ3JvdXBfbmFtZSwgJmR1bW15X3N0cik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKGVyciAhPSBCQ01fRVJSX09LLCBlcnIsKTsKKworICAgIC8qIGxvZyB3aXRoIHRoZSBoZWFkZXIgYnV0IHdpdGhvdXQgZmlsZS9saW5lIG51bWJlciAoZmlsZS9saW5lIG51bWJlciBpc24ndCBoZWxwZnVsIGhlcmUpLiAqLworICAgIGJjbV9kZXZfbG9nX2xvZygKKyAgICAgICAgYmNtdHJfY2xkX2xvZ19pZCwKKyAgICAgICAgREVWX0xPR19MRVZFTF9JTkZPLAorICAgICAgICBCQ01fTE9HX0ZMQUdfTk9ORSwKKyAgICAgICAgIiVzICVzOiBjb3JyX3RhZz0ldSBpbnN0YW5jZT0lZCBvYmo9JXMgZ3JvdXA9JXMgc3ViZ3JwPSVzIG9yZ190cz0ldSBlcnI9JXNcbiIsCisgICAgICAgIGJjbXRyX2NsZF9ldmVudF9uYW1lKGV2KSwKKyAgICAgICAgaGRyLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UgPyAicmVzcG9uc2UiIDogInJlcXVlc3QiLAorICAgICAgICBoZHItPmNvcnJfdGFnLAorICAgICAgICBoZHItPmluc3RhbmNlLAorICAgICAgICBvYmpfbmFtZSwKKyAgICAgICAgYXBpY2xpX21ndF9ncm91cF90b19zdHIoZ3JvdXApLAorICAgICAgICBzdWJncm91cF9uYW1lLAorICAgICAgICB0cywKKyAgICAgICAgbXNnID8gYmNtb3Nfc3RyZXJyb3IobXNnLT5lcnIpIDogIk4vQSIpOworI2VuZGlmCit9CisKKy8qIER1bXAgbWVzc2FnZSBoZWFkZXIgYW5kL29yIGJvZHkgKi8KK3N0YXRpYyB2b2lkIGJjbXRyX2R1bXBfbm90aWZ5KAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgY29uc3QgYmNtdHJfaGRyICpoZHIsCisgICAgYmNtdHJfY2xkX2V2ZW50X3R5cGUgZXYsCisgICAgdWludDMyX3QgdHMsCisgICAgY29uc3Qgdm9pZCAqcGFja2VkLAorICAgIHVpbnQzMl90IHBhY2tlZF9sZW5ndGgsCisgICAgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY210cl9jbGRfdHlwZSB2YWwgPSBiY210cl9jbGRfYWN0aXZlX2xldmVsW2RldmljZV1baGRyLT5tc2dfaWRdOworICAgIGJjbW9sdF9vYmpfaWQgb2JqOworICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXA7CisgICAgdWludDE2X3Qgc3ViZ3JvdXA7CisgICAgY29uc3QgY2hhciAqb2JqX25hbWU7CisgICAgY29uc3QgY2hhciAqc3ViZ3JvdXBfbmFtZTsKKyAgICBjb25zdCBjaGFyICpkdW1teV9zdHI7CisKKyAgICBlcnIgPSBiY21vbHRfZ3JvdXBfaWRfc3BsaXQoaGRyLT5tc2dfaWQsICZvYmosICZncm91cCwgJnN1Ymdyb3VwKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4oZXJyICE9IEJDTV9FUlJfT0ssIGVyciwpOworCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3RfbmFtZShvYmosICZvYmpfbmFtZSwgJmR1bW15X3N0cik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKGVyciAhPSBCQ01fRVJSX09LLCBlcnIsKTsKKworICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X3N1Ymdyb3VwX25hbWUob2JqLCBncm91cCwgc3ViZ3JvdXAsICZzdWJncm91cF9uYW1lLCAmZHVtbXlfc3RyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4oZXJyICE9IEJDTV9FUlJfT0ssIGVyciwpOworCisgICAgLyogYWx3YXlzIGR1bXAgdGhlIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSBzY3JhdGNoIENMSSBzZXNzaW9uICovCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgIGJjbXRyX2NsZF9zY3JhdGNoX3Nlc3Npb24sCisgICAgICAgICJbLS0gQ0xEOiAlcyAlczogY29ycl90YWc9JXUgaW5zdGFuY2U9JWQgbXNnX2lkPSVkIG9iaj0lcyglZCkgZ3JvdXA9JXMoJWQpIHN1YmdycD0lcyglZCkiLAorICAgICAgICBiY210cl9jbGRfZXZlbnRfbmFtZShldiksCisgICAgICAgIGhkci0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFID8gInJlc3BvbnNlIiA6ICJyZXF1ZXN0IiwKKyAgICAgICAgaGRyLT5jb3JyX3RhZywKKyAgICAgICAgaGRyLT5pbnN0YW5jZSwKKyAgICAgICAgaGRyLT5tc2dfaWQsCisgICAgICAgIG9ial9uYW1lLCBvYmosCisgICAgICAgIGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKGdyb3VwKSwgZ3JvdXAsCisgICAgICAgIHN1Ymdyb3VwX25hbWUsIHN1Ymdyb3VwKTsKKworICAgIGlmIChoZHItPm1vcmVfZnJhZ21lbnRzIHx8IChoZHItPmZyYWdfbnVtYmVyICE9IDApKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgICAgICBiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uLAorICAgICAgICAgICAgIiBtb3JlX2ZyYWdtZW50cz0lZCBmcmFnbWVudF9udW1iZXI9JXUiLAorICAgICAgICAgICAgaGRyLT5tb3JlX2ZyYWdtZW50cywKKyAgICAgICAgICAgIGhkci0+ZnJhZ19udW1iZXIpOworICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zY3JhdGNoX3Nlc3Npb24sICIgLS1dXG4iKTsKKworICAgIC8qIGlmIGNvbmZpZ3VyZWQgZm9yIGEgZnVsbCBtZXNzYWdlIGR1bXAsIHdyaXRlIHRoZSBtZXNzYWdlIGRhdGEgdG8gdGhlIHNjcmF0Y2ggc2Vzc2lvbiAqLworICAgIGlmICgodmFsICYgQkNNVFJfQ0xEX0RVTVApID09IEJDTVRSX0NMRF9EVU1QKQorICAgIHsKKyAgICAgICAgaWYgKG1zZyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uLCAiWy0tIENMRCBNZXNzYWdlIER1bXAgU3RhcnQgLS1dXG4iKTsKKyAgICAgICAgICAgIGFwaWNsaV9tc2dfZHVtcChiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uLCBtc2cpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoYmNtdHJfY2xkX3NjcmF0Y2hfc2Vzc2lvbiwgIlstLSBDTEQgTWVzc2FnZSBIZXggRHVtcCBTdGFydCAtLV1cbiIpOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25faGV4ZHVtcChiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uLCBwYWNrZWQsIDAsIHBhY2tlZF9sZW5ndGgsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zY3JhdGNoX3Nlc3Npb24sICJbLS0gQ0xEIE1lc3NhZ2UgRHVtcCBFbmQgLS1dXG4iKTsKKyAgICB9CisKKyAgICAvKiBXcml0ZSB0aGUgc2NyYXRjaCBzZXNzaW9uJ3MgYnVmZmVyIHRvIHRoZSByZWFsIENMSSBhbmQgcmVzZXQgaXQgKi8KKyAgICBiY21jbGlfc2Vzc2lvbl93cml0ZShiY210cl9jbGRfc2Vzc2lvbiwgYmNtdHJfY2xkX3NjcmF0Y2hfYnVmLCBiY210cl9jbGRfc2NyYXRjaF9wb3MpOworICAgIGJjbXRyX2NsZF9zY3JhdGNoX3BvcyA9IDA7Cit9CisKKy8qIE5vdGlmeSBjYXB0dXJlLCBsb2csIGRlYnVnICovCit2b2lkIGJjbXRyX2NsZF9ub3RpZnkoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtdHJfaGRyICpoZHIsCisgICAgYmNtdHJfY2xkX2V2ZW50X3R5cGUgZXYsIHVpbnQzMl90IHRzLCBjb25zdCB1aW50OF90ICpwYWNrZWQsIHVpbnQzMl90IHBhY2tlZF9sZW5ndGgsCisgICAgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbXRyX2NsZF90eXBlIHZhbCA9IGJjbXRyX2NsZF9hY3RpdmVfbGV2ZWxbZGV2aWNlXVtoZHItPm1zZ19pZF07CisKKyAgICBpZiAoKHZhbCAmIEJDTVRSX0NMRF9DQVBUVVJFKSkKKyAgICAgICAgYmNtdHJfY2FwdHVyZV9ub3RpZnkoZGV2aWNlLCBoZHIsIGV2LCB0cywgcGFja2VkLCBwYWNrZWRfbGVuZ3RoLCBtc2cpOworICAgIGlmICgodmFsICYgQkNNVFJfQ0xEX0xPRykpCisgICAgICAgIGJjbXRyX2xvZ19ub3RpZnkoZGV2aWNlLCBoZHIsIGV2LCB0cywgcGFja2VkLCBwYWNrZWRfbGVuZ3RoLCBtc2cpOworICAgIGlmICgodmFsICYgQkNNVFJfQ0xEX0RVTVApKQorICAgICAgICBiY210cl9kdW1wX25vdGlmeShkZXZpY2UsIGhkciwgZXYsIHRzLCBwYWNrZWQsIHBhY2tlZF9sZW5ndGgsIG1zZyk7Cit9CisKKworYmNtb3NfZXJybm8gYmNtdHJfY2xkX2luaXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc2NyYXRjaF9zZXNzaW9uX3Bhcm0gPSB7IC53cml0ZSA9IGJjbXRyX2xvZ19jbGlfcHJpbnQgfTsKKworICAgIGVyciA9IGJjbWNsaV9zZXNzaW9uX29wZW5fdXNlcigmc2NyYXRjaF9zZXNzaW9uX3Bhcm0sICZiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoZXJyICE9IEJDTV9FUlJfT0ssIGVycik7CisKKyAgICBiY210cl9jbGRfc2Vzc2lvbiA9IHNlc3Npb247CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgYmNtdHJfY2xkX2xvZ19pZCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJjbGQiLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0NMSQorICAgIGVyciA9IGJjbXRyX2NsZF9jbGlfaW5pdCgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihlcnIgIT0gQkNNX0VSUl9PSywgZXJyKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBDbGVhbiB1cCB0cmFuc3BvcnQgY2FwdHVyZSwgbG9nLCBkZWJ1ZyBzZXJ2aWNlCisgKi8KK3ZvaWQgYmNtdHJfY2xkX2V4aXQodm9pZCkKK3sKKyNpZmRlZiBFTkFCTEVfQ0xJCisgICAgYmNtdHJfY2xkX2NsaV9leGl0KCk7CisjZW5kaWYKKyAgICBpZiAoYmNtdHJfY2xkX3NjcmF0Y2hfc2Vzc2lvbikKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKGJjbXRyX2NsZF9zY3JhdGNoX3Nlc3Npb24pOworICAgICAgICBiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uID0gTlVMTDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5MDc0OAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfZGVidWcuaApAQCAtMCwwICsxLDI1NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01UUl9ERUJVR19IXworI2RlZmluZSBCQ01UUl9ERUJVR19IXworCisjaW5jbHVkZSA8YmNtX2NvbmZpZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2dfcGFjay5oPgorI2luY2x1ZGUgPGJjbXRyX2hlYWRlci5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKworLyogQ0xEIHN0YW5kcyBmb3IgY2FwdHVyZSxsb2csZGVidWcgKi8KKworLyoqIENhcHR1cmUsIGxvZywgZGVidWcgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNVFJfQ0xEX05PTkUgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPZmYgKi8KKyAgICBCQ01UUl9DTERfQ0FQVFVSRSAgID0gMHgwMSwgICAgICAgICAvKio8IE1lc3NhZ2UgY2FwdHVyZSAqLworICAgIEJDTVRSX0NMRF9MT0cgICAgICAgPSAweDAyLCAgICAgICAgIC8qKjwgTWVzc2FnZSBsb2dnaW5nICovCisgICAgQkNNVFJfQ0xEX0RVTVBfSERSICA9IDB4MDQsICAgICAgICAgLyoqPCBNZXNzYWdlIGhlYWRlciBkdW1wICovCisgICAgQkNNVFJfQ0xEX0RVTVAgICAgICA9IDB4MEMsICAgICAgICAgLyoqPCBNZXNzYWdlIGhlYWRlciBhbmQgYm9keSBkdW1wICovCit9IGJjbXRyX2NsZF90eXBlOworCisvKiogRXZlbnQgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNVFJfQ0xEX0VWX1NFTkQsICAgICAgICAgICAgICAgICAgLyoqPCBTZW5kIG1lc3NhZ2UgKi8KKyAgICBCQ01UUl9DTERfRVZfUkVTRU5ELCAgICAgICAgICAgICAgICAvKio8IFJldHJhbnNtaXQgbWVzc2FnZSAqLworICAgIEJDTVRSX0NMRF9FVl9SRUNWLCAgICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZSBtZXNzYWdlICovCisgICAgQkNNVFJfQ0xEX0VWX1JFQ1ZfRElTQ0FSRCwgICAgICAgICAgLyoqPCBSZWNlaXZlIG1lc3NhZ2UgZGlzY2FyZGVkICovCisgICAgQkNNVFJfQ0xEX0VWX1RJTUVPVVQsICAgICAgICAgICAgICAgLyoqPCBSZXF1ZXN0IHRpbWVkIG91dCB3YWl0aW5nIGZvciByZXNwb25zZSAqLworfSBiY210cl9jbGRfZXZlbnRfdHlwZTsKKworLyoqIENhcHR1cmUsIGxvZywgZGVidWcgZmlsdGVyICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXA7ICAgICAvKio8IE1lc3NhZ2UgZ3JvdXAuIENhbiBiZSBCQ01PTFRfTUdUX0dST1VQX0FOWSAqLworICAgIGJjbW9sdF9vYmpfaWQgb2JqZWN0OyAgICAgICAvKio8IE9iamVjdC4gQ2FuIGJlIEJDTU9MVF9PQkpFQ1RfQU5ZICovCisgICAgdWludDE2X3Qgc3ViZ3JvdXA7ICAgICAgICAgIC8qKjwgTWVzc2FnZSBzdWJncm91cC4gQ2FuIGJlIEJDTU9MVF9TVUJHUk9VUF9BTlkgKi8KK30gYmNtdHJfY2xkX2ZpbHRlcjsKKworLyoqIEluaXRpYWxpemUgdHJhbnNwb3J0IGNhcHR1cmUsbG9nLCBkZWJ1ZyBzZXJ2aWNlCisgKiBccGFyYW1baW5dICAgcGFyZW50ICBQYXJlbnQgQ0xJIGRpcmVjdG9yeS4gQ2FuIGJlIE5VTEwKKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0sgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9jbGRfaW5pdChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbik7CisKKy8qKiBDbGVhbiB1cCB0cmFuc3BvcnQgY2FwdHVyZSwgbG9nLCBkZWJ1ZyBzZXJ2aWNlCisgKi8KK3ZvaWQgYmNtdHJfY2xkX2V4aXQodm9pZCk7CisKKy8qKiBTZXQgY2FwdHVyZSwgbG9nLCBkZWJ1ZyBmb3Igc2VsZWN0ZWQgbWVzc2FnZXMKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgZmlsdGVyICAgICAgICAgIE1lc3NhZ2UgZmlsdGVyCisgKiBccGFyYW1baW5dICAgY2xkX2xldmVsICAgICAgIENhcHR1cmUsIGxvZywgZGVidWcgbGV2ZWwuIENhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEJDTVRSX0NMRF8uLiBjb25zdGFudHMKKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0sgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9jbGRfbGV2ZWxfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbXRyX2NsZF9maWx0ZXIgKmZpbHRlciwgYmNtdHJfY2xkX3R5cGUgY2xkX2xldmVsKTsKKworLyoqIEdldCBjYXB0dXJlLCBsb2csIGRlYnVnIGZvciBzZWxlY3RlZCBtZXNzYWdlCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIGZpbHRlciAgICAgICAgICBNZXNzYWdlIGZpbHRlci4gV2lsZGNhcmRzIGFyZSBub3QgYWxsb3dlZC4KKyAqIFxwYXJhbVtvdXRdICBjbGRfbGV2ZWwgICAgICAgQ2FwdHVyZSwgbG9nLCBkZWJ1ZyBsZXZlbAorICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NsZF9sZXZlbF9nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtdHJfY2xkX2ZpbHRlciAqZmlsdGVyLCBiY210cl9jbGRfdHlwZSAqY2xkX2xldmVsKTsKKworLyoKKyAqIE1lc3NhZ2UgY2FwdHVyZSBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIE1lc3NhZ2UgY2FwdHVyZSBmYWNpbGl0eSBhbGxvd3MgY2FwdHVyaW5nIG1lc3NhZ2VzIGJldHdlZW4gdGhlIGhvc3QKKyAqIGFuZCBPTFQgYXQgcmVhbCB0aW1lLiBUaGUgcmVjb3JkZWQgdHJhY2UgY2FuIGJlIGR1bXBlZCBpbgorICogaHVtYW4gcmVhZGFibGUgZm9ybWF0IG9yICJwbGF5ZWQgYmFjayIgaW4gb3JkZXIgdG8gcmVwcm9kdWNlCisgKiB0aGUgY29uZmlndXJhdGlvbiB1bmRlciB0ZXN0LgorICogQHsKKyAqLworCisvKiogTWluaW1hbCB0cmFjZSBidWZmZXIgc2l6ZSAoYnl0ZXMpICovCisjZGVmaW5lIEJDTVRSX0NBUFRVUkVfTUlOX0JVRl9TSVpFICAgICAgICAgICgxNioxMDI0KQorCisvKiogQ2FwdHVyZSBidWZmZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9jYXB0dXJlX3Bhcm0KK3sKKyAgICB1aW50MzJfdCBzaXplOyAgICAgICAgICAgICAgLyoqPCBDYXB0dXJlIGJ1ZmZlciBzaXplLiBNdXN0IGJlIGF0IGxlYXN0IFxyZWYgQkNNVFJfQ0FQVFVSRV9NSU5fQlVGX1NJWkUgYnl0ZXMgKi8KKyAgICB2b2lkICpwdHI7ICAgICAgICAgICAgICAgICAgLyoqPCBPcHRpb25hbCBjYXB0dXJlIGJ1ZmZlciBwb2ludGVyLiBBbGxvY2F0ZWQgYXV0b21hdGljYWxseSBpZiBOVUxMICovCisgICAgYmNtb3NfYm9vbCBzdG9wX29uX2Z1bGw7ICAgIC8qKjwgVFJVRS1zdG9wIHJlY29yZGluZyB3aGVuIGJ1ZmZlciBpcyBmdWxsLiBGQUxTRT1jaXJjdWxhciBidWZmZXIgKi8KKyAgICBiY21vc19ib29sIGFjdGl2YXRlOyAgICAgICAgLyoqPCBBdXRvLWFjdGl2YXRlIGNhcHR1cmUgaW1tZWRpYXRlbHkgYWZ0ZXIgaW5pdCAqLworfSBiY210cl9jYXB0dXJlX3Bhcm07CisKKy8qKiBDYXB0dXJlIGluZm8gcmVjb3JkICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9jYXB0dXJlX2luZm8KK3sKKyAgICB1aW50MzJfdCBzaXplOyAgICAgICAgICAgICAgLyoqPCBDYXB0dXJlIGJ1ZmZlciBzaXplICovCisgICAgdWludDMyX3QgdXNlZDsgICAgICAgICAgICAgIC8qKjwgVXNlZCBieXRlcyAqLworICAgIHVpbnQzMl90IHdhOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiB0aW1lcyBjYXB0dXJlIGJ1ZmZlciB3cmFwcGVkIGFyb3VuZCAqLworICAgIHVpbnQzMl90IG1zZ3M7ICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjb21wbGV0ZSBtZXNzYWdlcyBzdG9yZWQgaW4gdGhlIGNhcHR1cmUgYnVmZmVyICovCisgICAgdWludDMyX3QgbG9zdDsgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIG1lc3NhZ2VzIGxvc3QgZHVlIHRvIGJ1ZmZlciBvdmVyZmxvdyAqLworfSBiY210cl9jYXB0dXJlX2luZm87CisKKy8qIENhcHR1cmUgZW50cnkgaGVhZGVyCisgKgorICogRm9sbG93ZWQgYnkgbXNnX3NpemUgYnl0ZXMgb2YgbWVzc2FnZSBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgbXNnX3NpemU7ICAgICAgICAgIC8qKjwgTWVzc2FnZSBzaXplIChieXRlcyk7IE1VU1QgYmUgdGhlIGZpcnN0IG1lbWJlciAqLworICAgIHVpbnQzMl90IGV2ZW50OyAgICAgICAgICAgICAvKio8IGJjbXRyX2NsZF9ldmVudF90eXBlIGV2ZW50ICovCisgICAgdWludDMyX3QgdGltZXN0YW1wOyAgICAgICAgIC8qKjwgTWVzc2FnZSB0aW1lc3RhbXAgKHVzKSAqLworICAgIC8qIEZvbGxvd2VkIGJ5IG1lc3NhZ2UgZGF0YSBwYWRkZWQgdG8gdGhlIG5lYXJlc3QgNCBieXRlcyAqLworfSBiY210cl9jYXB0dXJlX2VudHJ5OworCisvKiogSW5pdGlhbGl6ZSBjYXB0dXJlIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgZmlyc3QuCisgKiBccGFyYW1baW5dICAgb2x0ICAgICBPbHQgaW5kZXgKKyAqIFxwYXJhbVtpbl0gICBjZmcgICAgIENhcHR1cmUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiBccmV0dXJuIDA9c3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NhcHR1cmVfaW5pdChiY21vbHRfZGV2aWQgb2x0LCBjb25zdCBiY210cl9jYXB0dXJlX3Bhcm0gKnBhcm0pOworCisvKiogRGVzdHJveSBjYXB0dXJlIGJ1ZmZlcgorICoKKyAqIERlc3Ryb3kgYnVmZmVyIGluaXRpYWxpemVkIGJ5IGJjbXRyX2NhcHR1cmVfSW5pdCgpLgorICogXHBhcmFtW2luXSAgIG9sdCAgICAgT2x0IGluZGV4CisgKiBGb2xsb3dpbmcgdGhpcyBjYWxsIGFsbCByZWNvcmRpbmcgaXMgbG9zdC4KKyAqLwordm9pZCBiY210cl9jYXB0dXJlX2Rlc3Ryb3koYmNtb2x0X2RldmlkIG9sdCk7CisKKy8qKiBHZXQgY2FwdHVyZSByZWNvcmRpbmcgaW5mbworICoKKyAqIFxwYXJhbVtpbl0gICBvbHQgICAgIE9sdCBpbmRleAorICogXHBhcmFtW291dF0gIGluZm8gICAgQ2FwdHVyZSBpbmZvcm1hdGlvbgorICogXHJldHVybiAwPXN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9jYXB0dXJlX2luZm9fZ2V0KGJjbW9sdF9kZXZpZCBvbHQsIGJjbXRyX2NhcHR1cmVfaW5mbyAqaW5mbyk7CisKKy8qKiBHZXQgdGhlIG51bWJlciBvZiByZWFkYWJsZSBieXRlcyBpbiB0aGUgY2FwdHVyZSBidWZmZXIKKyAqCisgKiBccGFyYW1baW5dICAgb2x0ICAgICAgICAgICAgIE9MVCBpbmRleAorICogXHBhcmFtW291dF0gIHNpemUgICAgICAgICAgICBOdW1iZXIgb2YgcmVhZGFibGUgYnl0ZXMKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9zaXplX2dldChiY21vbHRfZGV2aWQgb2x0LCB1aW50MzJfdCAqc2l6ZSk7CisKKy8qKiBSZWFkIHBvcnRpb24gb2YgY2FwdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgcmVjb3JkZWQgZGF0YSBpbnRvIGEgdXNlciBidWZmZXIgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogY2FwdHVyZSB1cCB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4gQXBwbGljYXRpb25zIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiBpbiBvcmRlciB0byBzYXZlIGNhcHR1cmUgaW50byBmaWxlIG9yIGR1bXAgaXQuCisgKgorICogXHBhcmFtW2luXSAgIG9sdCAgICAgICAgICAgICBPTFQgaW5kZXgKKyAqIFxwYXJhbVtvdXRdICBidWYgICAgICAgICAgICAgVXNlciBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICBvZmZzZXQgICAgICAgICAgQnVmZmVyIG9mZnNldCB0byBzdGFydCByZWFkIChieXRlcykKKyAqIFxwYXJhbVtpbi9vdXRdICBsZW5ndGggICAgICAgaW46IE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW50byB0aGUgdXNlciBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiBSZW1haW5pbmcgdW51c2VkIGJ5dGVzIGluIHVzZXIgYnVmZmVyCisgKiBccmV0dXJuIDA9c3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NhcHR1cmVfcmVhZChiY21vbHRfZGV2aWQgb2x0LCB1aW50OF90ICpidWYsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgKmxlbmd0aCk7CisKKy8qKiBBZHZhbmNlIGJ1ZmZlciB0byBuZXh0IGNhcHR1cmUgZW50cnkKKyAqCisgKiBIZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBzY2FuIGJ1ZmZlciByZWFkIGJ5IGJjbXRyX2NhcHR1cmVfcmVhZCgpCisgKgorICogXHBhcmFtW2luL291dF0gICBidWYgICAgICAgICBDYXB0dXJlIGJ1ZmZlcgorICogXHBhcmFtW291dF0gICAgICBoZHIgICAgICAgICBDYXB0dXJlIGVudHJ5IGhlYWRlcgorICogXHBhcmFtW291dF0gICAgICBtc2cgICAgICAgICBQb2ludGVyIHRvIHBhY2tlZCBtZXNzYWdlCisgKi8KK2JjbW9zX2Jvb2wgYmNtdHJfY2FwdHVyZV9lbnRyeV9nZXRfbmV4dChiY21vbHRfYnVmICpidWYsIGJjbXRyX2NhcHR1cmVfZW50cnkgKmhkciwgdWludDhfdCAqKm1zZyk7CisKKy8qKiBEZWNvZGUgYW5kIGR1bXAgY2FwdHVyZSByZWNvcmRpbmcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGludGVycHJldHMgYW5kIGR1bXBzIGNhcHR1cmUgcmVjb3JkaW5nLgorICoKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uIENMSSBzZXNzaW9uCisgKiBccGFyYW1baW5dICAgb2x0ICAgICBPTFQgaW5kZXgKKyAqIFxwYXJhbVtvdXRdICBubXNncyAgIE51bWJlciBvZiBtZXNzYWdlcyBkdW1wZWQKKyAqIFxyZXR1cm4gMD1zdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9kdW1wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfZGV2aWQgb2x0LCB1aW50MzJfdCAqbm1zZ3MpOworCisvKiogKFJlKXN0YXJ0IC8gU3VzcGVuZCBjYXB0dXJlIHJlY29yZGluZworICoKKyAqIFxwYXJhbVtpbl0gICBvbHQgICAgIE9MVCBpbmRleAorICogXHBhcmFtW2luXSAgIHN0YXJ0ICAgVFJVRT1zdGFydCwgRkFMU0U9c3VzcGVuZAorICogXHJldHVybiAwPXN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9jYXB0dXJlX3N0YXJ0X3N0b3AoYmNtb2x0X2RldmlkIG9sdCwgYmNtb3NfYm9vbCBzdGFydCk7CisKKy8qKiBBcmUgd2UgYWN0aXZlbHkgY2FwdHVyaW5nPworICoKKyAqIFxwYXJhbVtpbl0gICBvbHQgICAgIE9MVCBpbmRleAorICogXHJldHVybiBUUlVFPWFjdGl2ZWx5IGNhcHR1cmluZywgRkFMU0U9Tk9UIGNhcHR1cmluZworICovCitiY21vc19ib29sIGJjbXRyX2NhcHR1cmVfaXNfYWN0aXZlKGJjbW9sdF9kZXZpZCBvbHQpOworCisvKiogQ29udmVydCBlbnRyeSB0byBwbGF0Zm9ybSBzcGVjaWZpYyBmb3JtYXQKKyAqCisgKiBccGFyYW1baW4vb3V0XSAgIGJ1ZiAgICAgQ2FwdHVyZSBidWZmZXIKKyAqIFxwYXJhbVtvdXRdICAgICAgZW50cnkgICBDYXB0dXJlIGVudHJ5IGhlYWRlcgorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBzdWNjZXNzLCBGQUxTRSBvdGhlcndpc2UKKyAqLworYmNtb3NfYm9vbCBiY210cl9jYXB0dXJlX2VudHJ5X3VucGFjayhiY21vbHRfYnVmICpidWYsIGJjbXRyX2NhcHR1cmVfZW50cnkgKmVudHJ5KTsKKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9ucyAtIGNhbGxlZCBmcm9tIHRyYW5zcG9ydCBsZXZlbAorICovCisKKy8qIFBlci1PTFQsIHBlci1jb21tYW5kIGNvbWJpbmVkIHRyYWNlLGxvZyxkZWJ1ZyBsZXZlbCAqLworZXh0ZXJuIGJjbXRyX2NsZF90eXBlIGJjbXRyX2NsZF9hY3RpdmVfbGV2ZWxbQkNNVFJfTUFYX09MVFNdW0JDTU9MVF9HUk9VUF9JRF9fTlVNX09GXTsKKworLyogTm90aWZ5IG1lc3NhZ2UuCisgKiBDYWxsZWQgYnkgdHJhbnNwb3J0IGxheWVyCisgKi8KK3ZvaWQgYmNtdHJfY2xkX25vdGlmeShiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY210cl9oZHIgKmhkciwKKyAgICBiY210cl9jbGRfZXZlbnRfdHlwZSBldiwgdWludDMyX3QgdHMsIGNvbnN0IHVpbnQ4X3QgKnBhY2tlZCwgdWludDMyX3QgcGFja2VkX2xlbmd0aCwKKyAgICBiY21vbHRfbXNnICptc2cpOworCisvKiBDaGVjayBpZiBDTEQgaXMgZW5hYmxlZCBmb3IgdGhlIG1lc3NhZ2UgYW5kIHJlY29yZCBpZiB5ZXMKKyAqIENhbGxlZCBieSB0cmFuc3BvcnQgbGF5ZXIKKyAqLworI2RlZmluZSBCQ01UUl9DTERfQ0hFQ0tfTk9USUZZKF9kZXZpY2UsIF9oZHIsIF9ldiwgX3RzLCBfcGFja2VkLCBfcGFja2VkX2xlbmd0aCwgX21zZykgXAorICAgIGRvIHtcCisgICAgICAgIGlmIChiY210cl9jbGRfYWN0aXZlX2xldmVsW19kZXZpY2VdWyhfaGRyKS0+bXNnX2lkXSkgXAorICAgICAgICB7IFwKKyAgICAgICAgICAgIGJjbXRyX2NsZF9ub3RpZnkoX2RldmljZSwgX2hkciwgX2V2LCBfdHMsIF9wYWNrZWQsIF9wYWNrZWRfbGVuZ3RoLCBfbXNnKTsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogQkNNVFJfREVCVUdfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfZGVidWdfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjdkODIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnX2NsaS5jCkBAIC0wLDAgKzEsNDQwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtdHJfZGVidWcuaD4KKyNpbmNsdWRlIDxiY210cl9kZWJ1Z19jbGkuaD4KKyNpbmNsdWRlIDxiY21fYXBpX2NsaV9oZWxwZXJzLmg+CisjaWZkZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisjaW5jbHVkZSA8YmNtb2x0X2Rldl9zZWxlY3Rvci5oPgorI2VuZGlmCisKKyNkZWZpbmUgQkNNVFJfQ0xEX0NBU1RfRElTQ0FSRF9DT05TVChwLCB0eXBlKSAgICAgICAodHlwZSkoKGxvbmcpKHApKQorCitzdGF0aWMgYmNtY2xpX2VudHJ5ICpjbGRfY2xpX2RpcjsKKworc3RhdGljIGJjbW9zX2Vycm5vIF9iY210cl9jbGRfY2xpX2NyZWF0ZSh2b2lkKTsKK3N0YXRpYyB2b2lkIF9iY210cl9jbGRfY2xpX2Rlc3Ryb3kodm9pZCk7CisKKy8qCisgKiBDTEkgaGFuZGxlcnMKKyAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2NsZF9jbGlfc2V0Z2V0X2xldmVsKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtY2xpX251bWJlciBvYmogPSBiY21jbGlfcGFybV9nZXQoc2Vzc2lvbiwgIm9iamVjdCIpLT52YWx1ZS5udW1iZXI7CisgICAgYmNtY2xpX2NtZF9wYXJtICpncnBfcGFybSA9IGJjbWNsaV9wYXJtX2dldChzZXNzaW9uLCAiZ3JvdXAiKTsKKyAgICBiY21jbGlfbnVtYmVyIGdyb3VwID0gZ3JwX3Bhcm0gPyBncnBfcGFybS0+dmFsdWUubnVtYmVyIDogLTE7CisgICAgYmNtY2xpX2NtZF9wYXJtICpzdWJncnBfcGFybSA9IGJjbWNsaV9wYXJtX2dldChzZXNzaW9uLCAic3ViZ3JvdXAiKTsKKyAgICBiY21jbGlfbnVtYmVyIHN1Ymdyb3VwID0gc3ViZ3JwX3Bhcm0gPyBzdWJncnBfcGFybS0+dmFsdWUubnVtYmVyIDogLTE7CisgICAgYmNtdHJfY2xkX3R5cGUgbGV2ZWwgPSBiY21jbGlfcGFybV9nZXQoc2Vzc2lvbiwgImxldmVsIiktPnZhbHVlLm51bWJlcjsKKyAgICBiY210cl9jbGRfZmlsdGVyIGZpbHRlciA9IHt9OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKG9iaiA9PSAtMSB8fCAhYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sIGJjbWNsaV9wYXJtX2dldChzZXNzaW9uLCAib2JqZWN0IikpKQorICAgIHsKKyAgICAgICAgZmlsdGVyLm9iamVjdCA9IEJDTU9MVF9PQkpFQ1RfQU5ZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmaWx0ZXIub2JqZWN0ID0gb2JqOworICAgIH0KKworICAgIGlmIChncm91cCA9PSAtMSB8fCAhZ3JwX3Bhcm0gfHwgIWJjbWNsaV9wYXJtX2lzX3NldChzZXNzaW9uLCBncnBfcGFybSkpCisgICAgeworICAgICAgICBmaWx0ZXIuZ3JvdXAgPSBCQ01PTFRfTUdUX0dST1VQX0FOWTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZmlsdGVyLmdyb3VwID0gZ3JvdXA7CisgICAgfQorCisgICAgaWYgKHN1Ymdyb3VwID09IC0xIHx8ICFzdWJncnBfcGFybSB8fCAhYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sIHN1YmdycF9wYXJtKSkKKyAgICB7CisgICAgICAgIGZpbHRlci5zdWJncm91cCA9IEJDTU9MVF9TVUJHUk9VUF9BTlk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZpbHRlci5zdWJncm91cCA9IHN1Ymdyb3VwOworICAgIH0KKworICAgIC8qIEdldCBvciBzZXQgbGV2ZWwgPyAqLworICAgIGlmIChiY21jbGlfcGFybV9pc19zZXQoc2Vzc2lvbiwgYmNtY2xpX3Bhcm1fZ2V0KHNlc3Npb24sICJsZXZlbCIpKSkKKyAgICB7CisgICAgICAgIHJjID0gYmNtdHJfY2xkX2xldmVsX3NldChjdXJyZW50X2RldmljZSwgJmZpbHRlciwgbGV2ZWwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IGJjbXRyX2NsZF9sZXZlbF9nZXQoY3VycmVudF9kZXZpY2UsICZmaWx0ZXIsICZsZXZlbCk7CisgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiY2FwdHVyZTolcyBsb2c6JXMgZHVtcDolc1xuIiwKKyAgICAgICAgICAgICAgICAobGV2ZWwgJiBCQ01UUl9DTERfQ0FQVFVSRSkgPyAib24iIDogIm9mZiIsCisgICAgICAgICAgICAgICAgKGxldmVsICYgQkNNVFJfQ0xEX0xPRykgPyAib24iIDogIm9mZiIsCisgICAgICAgICAgICAgICAgKChsZXZlbCAmIEJDTVRSX0NMRF9EVU1QKSA9PSBCQ01UUl9DTERfRFVNUCkgPyAiYWxsIiA6CisgICAgICAgICAgICAgICAgICAgIChsZXZlbCAmIEJDTVRSX0NMRF9EVU1QX0hEUikgPyAiaGVhZGVycyIgOiAib2ZmIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2luaXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21jbGlfbnVtYmVyIHNpemUgPSBiY21jbGlfcGFybV9nZXQoc2Vzc2lvbiwgInNpemUiKS0+dmFsdWUubnVtYmVyOworICAgIGJjbW9zX2Jvb2wgc3RvcF9vbl9mdWxsID0gYmNtY2xpX3Bhcm1fZ2V0KHNlc3Npb24sICJzdG9wX29uX2Z1bGwiKS0+dmFsdWUubnVtYmVyOworICAgIGJjbW9zX2Jvb2wgYXV0b3N0YXJ0ID0gYmNtY2xpX3Bhcm1fZ2V0KHNlc3Npb24sICJhdXRvc3RhcnQiKS0+dmFsdWUubnVtYmVyOworICAgIGJjbXRyX2NhcHR1cmVfcGFybSBwID0ge307CisKKyAgICBwLnNpemUgPSBzaXplOworICAgIHAuc3RvcF9vbl9mdWxsID0gc3RvcF9vbl9mdWxsOworICAgIHAuYWN0aXZhdGUgPSBhdXRvc3RhcnQ7CisKKyAgICByZXR1cm4gYmNtdHJfY2FwdHVyZV9pbml0KGN1cnJlbnRfZGV2aWNlLCAmcCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2RlbGV0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbXRyX2NhcHR1cmVfZGVzdHJveShjdXJyZW50X2RldmljZSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX3N0YXJ0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbXRyX2NhcHR1cmVfc3RhcnRfc3RvcChjdXJyZW50X2RldmljZSwgQkNNT1NfVFJVRSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX3N0b3AoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtdHJfY2FwdHVyZV9zdGFydF9zdG9wKGN1cnJlbnRfZGV2aWNlLCBCQ01PU19GQUxTRSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2R1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICB1aW50MzJfdCBubXNnczsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtdHJfY2FwdHVyZV9kdW1wKHNlc3Npb24sIGN1cnJlbnRfZGV2aWNlLCAmbm1zZ3MpOworICAgIGlmICghcmMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRHVtcGVkICV1IG1lc3NhZ2VzXG4iLCBubXNncyk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2luZm8oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY210cl9jYXB0dXJlX2luZm8gaW5mbzsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtdHJfY2FwdHVyZV9pbmZvX2dldChjdXJyZW50X2RldmljZSwgJmluZm8pOworICAgIGlmICghcmMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiQnVmZmVyOiBzaXplPSV1IHVzZWQ9JXUuIEV2ZW50czogcmVjb3JkZWQ9JXUgbG9zdD0lZC4gV3JhcHMgYXJvdW5kOiV1XG4iLAorICAgICAgICAgICAgaW5mby5zaXplLCBpbmZvLnVzZWQsIGluZm8ubXNncywgaW5mby5sb3N0LCBpbmZvLndhKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisjaWZkZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisvKiBDdXJyZW50IGRldmljZSBjaGFuZ2UgaW5kaWNhdGlvbiAqLworc3RhdGljIHZvaWQgX2JjbXRyX2NsZF9kZXZpY2VfY2hhbmdlX2luZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X2RldmlkIGRldikKK3sKKyAgICBiY21jbGlfZW50cnkgKmN1cl9kaXIgPSBiY21jbGlfZGlyX2dldChzZXNzaW9uKTsKKyAgICBiY21vc19ib29sIGlzX2NsZF9jdXJfZGlyID0gKGN1cl9kaXIgJiYgY3VyX2RpciA9PSBjbGRfY2xpX2Rpcik7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBEZXN0cm95IGFuZCByZS1jcmVhdGUgQ0xEIENMSSBkaXJlY3RvcnkgKi8KKyAgICBfYmNtdHJfY2xkX2NsaV9kZXN0cm95KCk7CisgICAgcmMgPSBfYmNtdHJfY2xkX2NsaV9jcmVhdGUoKTsKKworICAgIC8qIFJlc3RvcmUgY3VycmVudCBDTEkgZGlyZWN0b3J5IHRvIENMRCAqLworICAgIGlmICghcmMgJiYgaXNfY2xkX2N1cl9kaXIpCisgICAgICAgIGJjbWNsaV9kaXJfc2V0KHNlc3Npb24sIGNsZF9jbGlfZGlyKTsKK30KKyNlbmRpZgorCisvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGFuZCBjb3B5IHRvIHRvIHBhcm0gKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NvcHlfcGFybV9uYW1lKGJjbWNsaV9jbWRfcGFybSAqcGFybSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGVzY3IpCit7CisgICAgcGFybS0+bmFtZSA9IGJjbW9zX2FsbG9jKHN0cmxlbihuYW1lKSArIDEpOworICAgIHBhcm0tPmRlc2NyaXB0aW9uID0gYmNtb3NfYWxsb2Moc3RybGVuKGRlc2NyKSArIDEpOworICAgIGlmICgocGFybS0+bmFtZSA9PSBOVUxMKSB8fCAocGFybS0+ZGVzY3JpcHRpb24gPT0gTlVMTCkpCisgICAgeworICAgICAgICAvKiBTdWNjZXNzZnVsIGFsbG9jYXRpb24gaWYgYW55IHdpbGwgYmUgcmVsZWFzZWQgYnkgY29tbW9uIGNsZWFudXAKKyAgICAgICAgICogYWxvbmcgd2l0aCB0aGUgcmVzdCBvZiBkeW5hbWljIHBhcmFtZXRlciBmaWVsZHMgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorICAgIHN0cmNweShCQ01UUl9DTERfQ0FTVF9ESVNDQVJEX0NPTlNUKHBhcm0tPm5hbWUsIHZvaWQgKiksIG5hbWUpOworICAgIHN0cmNweShCQ01UUl9DTERfQ0FTVF9ESVNDQVJEX0NPTlNUKHBhcm0tPmRlc2NyaXB0aW9uLCB2b2lkICopLCBkZXNjcik7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEZyZWUgImxldmVsIiBjb21tYW5kIHBhcmFtZXRlcnMuIGJvdGggbmFtZSBhbmQgZGVzY3JpcHRpb24gYXJlIGFsbG9jYXRlZCBkeW5hbWljYWxseSAqLworc3RhdGljIHZvaWQgX2JjbXRyX2NsZF9mcmVlX2xldmVsX3Bhcm1zKGJjbWNsaV9jbWRfcGFybSAqcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwID0gcGFybXM7CisKKyAgICB3aGlsZSAocC0+bmFtZSkKKyAgICB7CisgICAgICAgIGlmIChwLT50eXBlID09IEJDTUNMSV9QQVJNX0VOVU0gJiYgcC0+ZW51bV90YWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChwLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqZSA9IHAtPmVudW1fdGFibGU7CisgICAgICAgICAgICAgICAgd2hpbGUoZS0+bmFtZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLT5wYXJtcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2JjbXRyX2NsZF9mcmVlX2xldmVsX3Bhcm1zKGUtPnBhcm1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYmNtb3NfZnJlZShwLT5lbnVtX3RhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocC0+ZGVzY3JpcHRpb24pCisgICAgICAgICAgICBiY21vc19mcmVlKEJDTVRSX0NMRF9DQVNUX0RJU0NBUkRfQ09OU1QocC0+ZGVzY3JpcHRpb24sIHZvaWQgKikpOworICAgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoQkNNVFJfQ0xEX0NBU1RfRElTQ0FSRF9DT05TVChwLT5uYW1lLCB2b2lkICopKTsKKworICAgICAgICArK3A7CisgICAgfQorICAgIGJjbW9zX2ZyZWUocGFybXMpOworfQorCisvKiBBZGQgImxldmVsIiBjb21tYW5kICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2NsZF9hZGRfbGV2ZWxfY21kKGJjbWNsaV9lbnRyeSAqZGlyKQoreworICAgIC8qIG9iamVjdDogICAgICAgICAgICAqYWxsLCBvYmplY3QgbGlzdAorICAgICAqIGdyb3VwOiAgIHNlbGVjdG9yOiAqYWxsLCBncm91cCBsaXN0CisgICAgICogc3ViZ3JvdXA6ICAgICAgICAgICphbGwsIHN1Ymdyb3VwIGxpc3QKKyAgICAgKiBsZXZlbDogICBiaXRtYXNrCisgICAgICovCisgICAgYmNtY2xpX2NtZF9leHRyYV9wYXJtIGNtZF9leHRyYXMgPSB7IC5mcmVlX3Bhcm1zID0gX2JjbXRyX2NsZF9mcmVlX2xldmVsX3Bhcm1zIH07CisgICAgYmNtY2xpX2VudW1fdmFsICpvYmpfc2VsZWN0b3I7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbWRfcGFybXM7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmFsbF9uYW1lID0gIiphbGwiOworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBjdXJyZW50X3N5c3RlbV9tb2RlOworICAgIGludCBuX29iaiA9IDA7CisgICAgYmNtb2x0X29ial9pZCBvOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9OT01FTTsKKworICAgIC8qIEFsbG9jYXRlIHRvcCBsZXZlbCBwYXJhbWV0ZXJzOiBvYmplY3Qgc2VsZWN0b3IsIGxldmVsLCB0ZXJtaW5hdG9yICovCisgICAgY21kX3Bhcm1zID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfY21kX3Bhcm0pICogMyk7CisgICAgaWYgKCFjbWRfcGFybXMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBvYmplY3QgZW51bSB0YWJsZS4gMiBleHRyYSBlbnRyaWVzIGZvciAqYWxsIGFuZCB0ZXJtaW5hdG9yICovCisgICAgb2JqX3NlbGVjdG9yID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfZW51bV92YWwpICogKEJDTU9MVF9PQkpfSURfX05VTV9PRiArIDIpKTsKKyAgICBpZiAoIW9ial9zZWxlY3RvcikKKyAgICB7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICAvKiBGaWxsIHVwIHBhcmFtZXRlcnMgKi8KKyAgICByYyA9IF9iY210cl9jbGRfY29weV9wYXJtX25hbWUoJmNtZF9wYXJtc1swXSwgIm9iamVjdCIsICJPYmplY3QgTmFtZSIpOworICAgIGNtZF9wYXJtc1swXS50eXBlID0gQkNNQ0xJX1BBUk1fRU5VTTsKKyAgICBjbWRfcGFybXNbMF0uZmxhZ3MgPSBCQ01DTElfUEFSTV9GTEFHX1NFTEVDVE9SOworICAgIGNtZF9wYXJtc1swXS5lbnVtX3RhYmxlID0gb2JqX3NlbGVjdG9yOworCisgICAgcmMgPSByYyA/IHJjIDogX2JjbXRyX2NsZF9jb3B5X3Bhcm1fbmFtZSgmY21kX3Bhcm1zWzFdLCAibGV2ZWwiLCAiTGV2ZWwgYml0bWFzazogMT1jYXB0dXJlLDI9bG9nLDQ9cHJpbnQgaGRyLDg9cHJpbnQgYm9keSIpOworICAgIGNtZF9wYXJtc1sxXS50eXBlID0gQkNNQ0xJX1BBUk1fREVDSU1BTDsKKyAgICBjbWRfcGFybXNbMV0uZmxhZ3MgPSBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMOworCisgICAgLyogb2JqX3NlbGVjdG9yWzBdIGlzIHJlc2VydmVkIGZvciAqYWxsICovCisgICAgb2JqX3NlbGVjdG9yWzBdLm5hbWUgPSBhbGxfbmFtZTsKKyAgICBvYmpfc2VsZWN0b3JbMF0udmFsID0gLTE7CisKKyAgICAvKiBHbyBvdmVyIG9iamVjdHMgKi8KKyAgICBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmY3VycmVudF9zeXN0ZW1fbW9kZSk7CisgICAgZm9yIChvID0gMDsgbyA8IEJDTU9MVF9PQkpfSURfX05VTV9PRjsgbysrKQorICAgIHsKKyAgICAgICAgYmNtY2xpX2VudW1fdmFsICpncnBfc2VsZWN0b3I7CisgICAgICAgIGJjbWNsaV9jbWRfcGFybSAqZ3JwX3Bhcm07CisgICAgICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZzsKKyAgICAgICAgaW50IG5fZ3JwID0gMDsKKworICAgICAgICBpZiAoIWJjbW9sdF9vYmplY3RfaXNfc3VwcG9ydGVkKGN1cnJlbnRfc3lzdGVtX21vZGUsIG8pKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogQWxsb2NhdGUgZ3JvdXAgcGFyYW1ldGVyIGFuZCBzZWxlY3RvciAqLworICAgICAgICArK25fb2JqOworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnZhbCA9IG87CisgICAgICAgIHJjID0gYXBpX2NsaV9vYmplY3RfbmFtZShvLCAmb2JqX3NlbGVjdG9yW25fb2JqXS5uYW1lLCBOVUxMKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICAgICAgb2JqX3NlbGVjdG9yW25fb2JqXS5wYXJtcyA9IGdycF9wYXJtID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfY21kX3Bhcm0pKjIpOworICAgICAgICBpZiAoIWdycF9wYXJtKQorICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICByYyA9IF9iY210cl9jbGRfY29weV9wYXJtX25hbWUoZ3JwX3Bhcm0sICJncm91cCIsICJNZXNzYWdlIGdyb3VwIik7CisgICAgICAgIGdycF9wYXJtLT50eXBlID0gQkNNQ0xJX1BBUk1fRU5VTTsKKyAgICAgICAgZ3JwX3Bhcm0tPmZsYWdzID0gQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUjsKKyAgICAgICAgZ3JwX3Bhcm0tPmVudW1fdGFibGUgPSBncnBfc2VsZWN0b3IgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9lbnVtX3ZhbCkgKiAoQkNNT0xUX01HVF9HUk9VUF9fTlVNX09GICsgMSkpOworICAgICAgICBpZiAoIWdycF9zZWxlY3RvcikKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgICAgICAvKiBTZWxlY3RvciAwIGlzIHJlc2VydmVkIGZvciAqYWxsICovCisgICAgICAgIGdycF9zZWxlY3RvclswXS5uYW1lID0gYWxsX25hbWU7CisgICAgICAgIGdycF9zZWxlY3RvclswXS52YWwgPSAtMTsKKworICAgICAgICAvKiBHbyBvdmVyIGdyb3VwcyAqLworICAgICAgICBmb3IgKGcgPSAxOyBnIDwgQkNNT0xUX01HVF9HUk9VUF9fTlVNX09GOyBnKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHN1Ymdyb3VwX2NvdW50ID0gYXBpX2NsaV9nZXRfc3ViZ3JvdXBfY291bnQobywgZyk7CisgICAgICAgICAgICBiY21jbGlfZW51bV92YWwgKnN1YmdycF90YWJsZTsKKyAgICAgICAgICAgIGJjbWNsaV9jbWRfcGFybSAqc3ViZ3JwX3Bhcm07CisgICAgICAgICAgICB1aW50MTZfdCBzOworICAgICAgICAgICAgaW50IHNnX3RhYmxlX2lkeDsKKworICAgICAgICAgICAgaWYgKHN1Ymdyb3VwX2NvdW50ID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICsrbl9ncnA7CisgICAgICAgICAgICBncnBfc2VsZWN0b3Jbbl9ncnBdLm5hbWUgPSBhcGljbGlfbWd0X2dyb3VwX3RvX3N0cihnKTsKKyAgICAgICAgICAgIGdycF9zZWxlY3RvcltuX2dycF0udmFsID0gZzsKKworICAgICAgICAgICAgLyogU2tpcCBzdWJncm91cCBzZWxlY3RvciBmb3IgZ3JvdXBzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCAqLworICAgICAgICAgICAgaWYgKGcgIT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPICAgICAgJiYKKyAgICAgICAgICAgICAgICBnICE9IEJDTU9MVF9NR1RfR1JPVVBfT1BFUiAgICAgICYmCisgICAgICAgICAgICAgICAgZyAhPSBCQ01PTFRfTUdUX0dST1VQX1BST1hZICAgICAmJgorICAgICAgICAgICAgICAgIGcgIT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3JwX3NlbGVjdG9yW25fZ3JwXS5wYXJtcyA9IHN1YmdycF9wYXJtID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfY21kX3Bhcm0pKjIpOworICAgICAgICAgICAgaWYgKCFzdWJncnBfcGFybSkKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICByYyA9IHJjID8gcmMgOiBfYmNtdHJfY2xkX2NvcHlfcGFybV9uYW1lKHN1YmdycF9wYXJtLCAic3ViZ3JvdXAiLCAiTWVzc2FnZSBzdWItZ3JvdXAiKTsKKyAgICAgICAgICAgIHN1YmdycF9wYXJtLT50eXBlID0gQkNNQ0xJX1BBUk1fRU5VTTsKKyAgICAgICAgICAgIHN1YmdycF9wYXJtLT5lbnVtX3RhYmxlID0gc3ViZ3JwX3RhYmxlID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfZW51bV92YWwpICogKHN1Ymdyb3VwX2NvdW50ICsgMikpOworICAgICAgICAgICAgaWYgKCFzdWJncnBfdGFibGUpCisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgc3ViZ3JwX3RhYmxlWzBdLm5hbWUgPSBhbGxfbmFtZTsKKyAgICAgICAgICAgIHN1YmdycF90YWJsZVswXS52YWwgPSAtMTsKKworICAgICAgICAgICAgc2dfdGFibGVfaWR4ID0gMTsKKyAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCBzdWJncm91cF9jb3VudDsgcysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKG8sIGcsIHMsICZzdWJncnBfdGFibGVbc2dfdGFibGVfaWR4XS5uYW1lLCBOVUxMKSA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ViZ3JwX3RhYmxlW3NnX3RhYmxlX2lkeF0udmFsID0gczsKKyAgICAgICAgICAgICAgICAgICAgKytzZ190YWJsZV9pZHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogRmluYWxseSBhZGQgY29tbWFuZCAqLworICAgIHJjID0gYmNtY2xpX2NtZF9hZGQoZGlyLCAibGV2ZWwiLCBfYmNtdHJfY2xkX2NsaV9zZXRnZXRfbGV2ZWwsICJTZXQvZ2V0IGNsZCBsZXZlbCIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sCisgICAgICAgICZjbWRfZXh0cmFzLCBjbWRfcGFybXMpOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIHJldHVybiBCQ01fRVJSX09LOworCitjbGVhbnVwOgorICAgIF9iY210cl9jbGRfZnJlZV9sZXZlbF9wYXJtcyhjbWRfcGFybXMpOworICAgIHJldHVybiByYzsKK30KKworLyogQ3JlYXRlIENMSSBjb21tYW5kcyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY210cl9jbGRfY2xpX2NyZWF0ZSh2b2lkKQoreworICAgIGJjbWNsaV9lbnRyeSAqZGlyOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGRpciA9IGJjbWNsaV9kaXJfYWRkKE5VTEwsICJjbGQiLCAiVHJhbnNwb3J0IENhcHR1cmUsIExvZywgRGVidWciLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoZGlyID09IE5VTEwsIEJDTV9FUlJfTk9NRU0pOworCisgICAgZXJyID0gX2JjbXRyX2NsZF9hZGRfbGV2ZWxfY21kKGRpcik7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJpbml0IiwgIkluaXRpYWxpemUgY2FwdHVyZSBidWZmZXIiLCBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2luaXQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInNpemUiLCAiQnVmZmVyIHNpemUgKGJ5dGVzKSIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJzdG9wX29uX2Z1bGwiLCAiU3RvcCBjYXB0dXJlIHdoZW4gYnVmZmVyIGlzIGZ1bGwgKHllcykgb3Igd3JhcC1hcm91bmQgKG5vKSIsCisgICAgICAgICAgICBiY21jbGlfZW51bV9ib29sX3RhYmxlLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJhdXRvc3RhcnQiLCAiQXV0b3N0YXJ0IiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgMCkgKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZGVsZXRlIiwgIkRlc3Ryb3kgYnVmZmVyIiwgX2JjbXRyX2NsZF9jbGlfY2FwdHVyZV9kZWxldGUpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJzdGFydCIsICJTdGFydCBjYXB0dXJlIiwgX2JjbXRyX2NsZF9jbGlfY2FwdHVyZV9zdGFydCk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgInN0b3AiLCAiU3RvcCBjYXB0dXJlIiwgX2JjbXRyX2NsZF9jbGlfY2FwdHVyZV9zdG9wKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZHVtcCIsICJEdW1wIGNhcHR1cmUgYnVmZmVyIiwgX2JjbXRyX2NsZF9jbGlfY2FwdHVyZV9kdW1wKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiaW5mbyIsICJDYXB0dXJlIGluZm8iLCBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2luZm8pOworCisgICAgY2xkX2NsaV9kaXIgPSBkaXI7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworfQorCisvKiBEZXN0cm95IENMSSBjb21tYW5kcyAqLworc3RhdGljIHZvaWQgX2JjbXRyX2NsZF9jbGlfZGVzdHJveSh2b2lkKQoreworICAgIGlmIChjbGRfY2xpX2RpcikKKyAgICB7CisgICAgICAgIGJjbWNsaV90b2tlbl9kZXN0cm95KGNsZF9jbGlfZGlyKTsKKyAgICAgICAgY2xkX2NsaV9kaXIgPSBOVUxMOworICAgIH0KK30KKworCisvKiogSW5pdGlhbGl6ZSBDTEQgQ0xJIGNvbW1hbmRzCisgKiBccmV0dXJucyBCQ01fRVJSX09LICgwKSBpZiBzdWNjZXNzZnVsCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NsZF9jbGlfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyNpZmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QKKyAgICAvKiBTdWJzY3JpYmUgZm9yIGRldmljZSBjaGFuZ2UgaW5kaWNhdGlvbiAqLworICAgIGVyciA9IGJjbW9sdF9kZXZfc2VsX2luZF9yZWdpc3RlcihfYmNtdHJfY2xkX2RldmljZV9jaGFuZ2VfaW5kKTsKKyNlbmRpZgorCisgICAgZXJyID0gZXJyID8gZXJyIDogX2JjbXRyX2NsZF9jbGlfY3JlYXRlKCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKiogQ2xlYW4tdXAgQ0xEIENMSSBjb21tYW5kcyAqLwordm9pZCBiY210cl9jbGRfY2xpX2V4aXQodm9pZCkKK3sKKyAgICBfYmNtdHJfY2xkX2NsaV9kZXN0cm95KCk7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnX2NsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl9kZWJ1Z19jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmI3ZTIwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl9kZWJ1Z19jbGkuaApAQCAtMCwwICsxLDQxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTVRSX0RFQlVHX0NMSV9IXworI2RlZmluZSBCQ01UUl9ERUJVR19DTElfSF8KKworLyoqIEluaXRpYWxpemUgQ0xEIENMSSBjb21tYW5kcworICogXHJldHVybnMgQkNNX0VSUl9PSyAoMCkgaWYgc3VjY2Vzc2Z1bAorICovCitiY21vc19lcnJubyBiY210cl9jbGRfY2xpX2luaXQodm9pZCk7CisKKy8qKiBDbGVhbi11cCBDTEQgQ0xJIGNvbW1hbmRzICovCit2b2lkIGJjbXRyX2NsZF9jbGlfZXhpdCh2b2lkKTsKKworI2VuZGlmIC8qIEJDTVRSX0RFQlVHX0NMSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl9oZWFkZXIuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfaGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2MjUzNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfaGVhZGVyLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNVFJfSEVBREVSX0hfCisjZGVmaW5lIEJDTVRSX0hFQURFUl9IXworCisjaW5jbHVkZSA8YmNtb2x0X2J1Zi5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2dfcGFjay5oPgorCisvKiogRW5kaWFuZXNzIG9mIG51bWJlcnMgd3JpdHRlbiB0byB0aGUgdHJhbnNwb3J0IGJ1ZmZlci4KKyAqIEN1cnJlbnRseSBiY21vbHRfYnVmIHNlcnZpY2UgZG9lc24ndCBzdXBwb3J0IHNldHRpbmcKKyAqIGVuZGlhbm5lc3MgZHluYW1pY2FsbHkuIFRyYW5zcG9ydCBidWZmZXIgZGlyZWN0aW9uIG11c3QgYmUgdGhlIHNhbWUKKyAqIGFzIHNlbGVjdGVkIGF0IGNvbXBpbGUgdGltZSBpbiBiY21vbHRfYnVmLmgKKyAqLworI2RlZmluZSBCQ01UUl9CVUZfRU5ESUFOICAgICAgICBCQ01PTFRfQlVGX0VORElBTl9GSVhFRAorCisjZGVmaW5lIEJDTVRSX0VORElBTl9DUFVfVE9fQlVGX1UzMihuKSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbikKKyNkZWZpbmUgQkNNVFJfRU5ESUFOX0JVRl9UT19DUFVfVTMyKG4pIEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCBuKQorCisvKiogVHJhbnNwb3J0IGhlYWRlci4KKyAqIEluc2VydGVkIGluIGVhY2ggcGFja2V0IHRyYW5zbWl0dGVkIG9uIHRoZSBsaW5lCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbXRyX2hkcgoreworICAgIGJjbW9sdF9tc2dfZGlyIGRpcjsgICAgICAgICAvKio8IE1lc3NhZ2UgZGlyZWN0aW9uOiByZXF1ZXN0L3Jlc3BvbnNlICovCisgICAgYmNtb3NfYm9vbCBtb3JlX2ZyYWdtZW50czsgIC8qKjwgVFJVRT1tb3JlIGZyYWdtZW50cyB0byBmb2xsb3cgKi8KKyAgICBiY21vc19ib29sIGF1dG9fcHJveHlfcmVnOyAgLyoqPCBUUlVFPW1lc3NhZ2UgaXMgYXV0byAvIHByb3h5IHJlZ2lzdHJhdGlvbiAqLworICAgIGJjbW9zX2Jvb2wgYXV0b19wcm94eV91bnJlZzsvKio8IFRSVUU9bWVzc2FnZSBpcyBhdXRvIC8gcHJveHkgdW4tcmVnaXN0cmF0aW9uICovCisgICAgdWludDhfdCBpbnN0YW5jZTsgICAgICAgICAgIC8qKjwgTWVzc2FnZSBpbnN0YW5jZSAqLworICAgIGJjbW9sdF9ncm91cF9pZCBtc2dfaWQ7ICAgICAvKio8IE1lc3NhZ2UgaWQ6IG9iamVjdCtncm91cCtzdWJncm91cCAqLworICAgIHVpbnQxNl90IGNvcnJfdGFnOyAgICAgICAgICAvKio8IGNvcnJlbGF0aW9uIHRhZyAqLworICAgIHVpbnQxNl90IGZyYWdfbnVtYmVyOyAgICAgICAvKio8IGZyYWdtZW50IG51bWJlciAqLworfSBiY210cl9oZHI7CisKKyNkZWZpbmUgQkNNVFJfSERSX1NJWkUgIDgKKworLyogU2hpZnRzIGFuZCB3aWR0aHMgb2YgdHJhbnNwb3J0IGhlYWRlciBmaWVsZHMgKi8KKyNkZWZpbmUgQkNNVFJfSERSX0RJUl9TICAgICAgICAgMzEKKyNkZWZpbmUgQkNNVFJfSERSX0RJUl9XICAgICAgICAgMQorI2RlZmluZSBCQ01UUl9IRFJfUkVHX1MgICAgICAgICAyNgorI2RlZmluZSBCQ01UUl9IRFJfUkVHX1cgICAgICAgICAxCisjZGVmaW5lIEJDTVRSX0hEUl9VTlJFR19TICAgICAgIDI1CisjZGVmaW5lIEJDTVRSX0hEUl9VTlJFR19XICAgICAgIDEKKyNkZWZpbmUgQkNNVFJfSERSX01PUkVfRlJBR1NfUyAgMjQKKyNkZWZpbmUgQkNNVFJfSERSX01PUkVfRlJBR1NfVyAgMQorI2RlZmluZSBCQ01UUl9IRFJfSU5TVEFOQ0VfUyAgICAxNgorI2RlZmluZSBCQ01UUl9IRFJfSU5TVEFOQ0VfVyAgICA4CisjZGVmaW5lIEJDTVRSX0hEUl9NU0dfSURfUyAgICAgIDAKKyNkZWZpbmUgQkNNVFJfSERSX01TR19JRF9XICAgICAgMTYKKyNkZWZpbmUgQkNNVFJfSERSX0NPUlJfVEFHX1MgICAgMTYKKyNkZWZpbmUgQkNNVFJfSERSX0NPUlJfVEFHX1cgICAgMTYKKyNkZWZpbmUgQkNNVFJfSERSX0ZSQUdfUyAgICAgICAgMAorI2RlZmluZSBCQ01UUl9IRFJfRlJBR19XICAgICAgICAxNgorCisvKiBQYWNrIHRyYW5zcG9ydCBoZWFkZXIKKyAqCisgKiBccGFyYW1baW5dICAgaGRyICAgICAgICAgICAgIFVucGFja2VkIHRyYW5zcG9ydCBoZWFkZXIKKyAqIFxwYXJhbVtvdXRdICBwYWNrZWRfaGRyICAgICAgUGFja2VkIGhlYWRlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtdHJfaGVhZGVyX3BhY2soY29uc3QgYmNtdHJfaGRyICpoZHIsIHVpbnQ4X3QgKnBhY2tlZF9oZHIpCit7CisgICAgdWludDMyX3Qgd1syXTsKKworICAgIHdbMF0gPSAoaGRyLT5kaXIgPDwgQkNNVFJfSERSX0RJUl9TKSAgICAgICAgICAgICAgICB8CisgICAgICAgIChoZHItPm1vcmVfZnJhZ21lbnRzIDw8IEJDTVRSX0hEUl9NT1JFX0ZSQUdTX1MpIHwKKyAgICAgICAgKGhkci0+aW5zdGFuY2UgPDwgQkNNVFJfSERSX0lOU1RBTkNFX1MpICAgICAgICAgfAorICAgICAgICAoaGRyLT5hdXRvX3Byb3h5X3JlZyA8PCBCQ01UUl9IRFJfUkVHX1MpICAgICAgICB8CisgICAgICAgIChoZHItPmF1dG9fcHJveHlfdW5yZWcgPDwgQkNNVFJfSERSX1VOUkVHX1MpICAgIHwKKyAgICAgICAgaGRyLT5tc2dfaWQ7CisgICAgd1sxXSA9IChoZHItPmNvcnJfdGFnIDw8IEJDTVRSX0hEUl9DT1JSX1RBR19TKSB8IGhkci0+ZnJhZ19udW1iZXI7CisgICAgd1swXSA9IEJDTVRSX0VORElBTl9DUFVfVE9fQlVGX1UzMih3WzBdKTsKKyAgICB3WzFdID0gQkNNVFJfRU5ESUFOX0NQVV9UT19CVUZfVTMyKHdbMV0pOworICAgIG1lbWNweShwYWNrZWRfaGRyLCB3LCBCQ01UUl9IRFJfU0laRSk7Cit9CisKKy8qIFVucGFjayB0cmFuc3BvcnQgaGVhZGVyCisgKgorICogXHBhcmFtW2luXSAgIHBhY2tlZF9oZHIgICAgICBQYWNrZWQgaGVhZGVyCisgKiBccGFyYW1bb3V0XSAgaGRyICAgICAgICAgICAgIFVucGFja2VkIHRyYW5zcG9ydCBoZWFkZXIKKyAqIEJ1ZmZlciBjdXJyZW50IHBvaW50ZXIgaXMgaW5jcmVtZW50ZWQgYnkgdGhlIGhlYWRlciBzaWRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtdHJfaGVhZGVyX3VucGFjayhjb25zdCB1aW50OF90ICpwYWNrZWRfaGRyLCBiY210cl9oZHIgKmhkcikKK3sKKyAgICB1aW50MzJfdCB3WzJdOworICAgIG1lbWNweSh3LCBwYWNrZWRfaGRyLCBCQ01UUl9IRFJfU0laRSk7CisgICAgd1swXSA9IEJDTVRSX0VORElBTl9CVUZfVE9fQ1BVX1UzMih3WzBdKTsKKyAgICB3WzFdID0gQkNNVFJfRU5ESUFOX0JVRl9UT19DUFVfVTMyKHdbMV0pOworICAgIGhkci0+ZGlyID0gQkNNX0ZJRUxEX0dFVCh3WzBdLCBCQ01UUl9IRFJfRElSKTsKKyAgICBoZHItPm1vcmVfZnJhZ21lbnRzID0gQkNNX0ZJRUxEX0dFVCh3WzBdLCBCQ01UUl9IRFJfTU9SRV9GUkFHUyk7CisgICAgaGRyLT5pbnN0YW5jZSA9IEJDTV9GSUVMRF9HRVQod1swXSwgQkNNVFJfSERSX0lOU1RBTkNFKTsKKyAgICBoZHItPm1zZ19pZCA9IEJDTV9GSUVMRF9HRVQod1swXSwgQkNNVFJfSERSX01TR19JRCk7CisgICAgaGRyLT5hdXRvX3Byb3h5X3JlZyA9IEJDTV9GSUVMRF9HRVQod1swXSwgQkNNVFJfSERSX1JFRyk7CisgICAgaGRyLT5hdXRvX3Byb3h5X3VucmVnID0gQkNNX0ZJRUxEX0dFVCh3WzBdLCBCQ01UUl9IRFJfVU5SRUcpOworICAgIGhkci0+Y29ycl90YWcgPSBCQ01fRklFTERfR0VUKHdbMV0sIEJDTVRSX0hEUl9DT1JSX1RBRyk7CisgICAgaGRyLT5mcmFnX251bWJlciA9IEJDTV9GSUVMRF9HRVQod1sxXSwgQkNNVFJfSERSX0ZSQUcpOworfQorCisvKiBGaWxsIHRyYW5zcG9ydCBoZWFkZXIKKyAqLworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY210cl9oZWFkZXJfZmlsbChjb25zdCBiY21vbHRfbXNnICptc2csIGJjbXRyX2hkciAqaGRyKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGhkci0+ZGlyID0gbXNnLT5kaXI7CisgICAgaGRyLT5tb3JlX2ZyYWdtZW50cyA9IEJDTU9TX0ZBTFNFOworICAgIGVyciA9IGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKG1zZy0+b2JqX3R5cGUsIG1zZy0+Z3JvdXAsIG1zZy0+c3ViZ3JvdXAsICZoZHItPm1zZ19pZCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICBoZHItPmluc3RhbmNlID0gYmNtb2x0X21zZ19pbnN0YW5jZShtc2cpOworICAgIGhkci0+Y29ycl90YWcgPSBtc2ctPmNvcnJfdGFnOworICAgIGhkci0+ZnJhZ19udW1iZXIgPSAwOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKyNlbmRpZiAvKiBCQ01UUl9IRUFERVJfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfaW50ZXJmYWNlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmM4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjQxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTVRSX0lOVEVSRkFDRV9IXworI2RlZmluZSBCQ01UUl9JTlRFUkZBQ0VfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBUcmFuc3BvcnQgc3RhdGlzdGljcyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJfc3RhdAoreworICAgIHVpbnQzMl90IG1zZ19zZW50OyAgICAgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZXMgc2VudCAqLworICAgIHVpbnQzMl90IG1zZ19yZXNwX3JlY2VpdmVkOyAgICAgICAgIC8qKjwgVmFsaWQgcmVzcG9uc2VzIHJlY2VpdmVkICovCisgICAgdWludDMyX3QgbXNnX3JlcV9hdXRvX3JlY2VpdmVkOyAgICAgLyoqPCBSZXF1ZXN0IG9yIEF1dG9ub21vdXMgbWVzc2FnZSByZWNlaXZlZCAqLworICAgIHVpbnQzMl90IG1zZ19yZXFfdGltZW91dDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgdGltZWQgb3V0ICovCisgICAgdWludDMyX3QgbXNnX3JlYXNzX3RpbWVvdXQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgbWVzc2FnZXMgZGlzY2FyZGVkIGR1ZSB0byByZWFzc2VtYmxlIHRpbWVvdXQgKi8KKyAgICB1aW50MzJfdCBtc2dfbm9fcmVxOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiByZXNwb25zZXMgZGlzY2FyZGVkIGJlY2F1c2UgdGhlcmUgd2FzIG5vIG1hdGNoaW5nIHJlcXVlc3QgKi8KKyAgICB1aW50MzJfdCBtc2dfbm9fbWVtOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlcyAqLworICAgIHVpbnQzMl90IG1zZ19jb21tX2VycjsgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZXMgZGlzY2FyZGVkIGJlY2F1c2Ugb2YgY29tbXVuaWNhdGlvbiBlcnJvciAqLworICAgIHVpbnQzMl90IG1zZ19yZWFkeV90aW1lb3V0OyAgICAgICAgIC8qKjwgUmVzcG9uc2VzIHRoYXQgaGF2ZSBiZWVuIHJlcG9ydGVkIHRvIGFwcGxpY2F0aW9uIGJ1dCBub3QgcGVha2VkIHVwICovCisgICAgdWludDMyX3QgbXNnX3Rvb19tYW55X3JlcTsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgcmVxdWVzdHMgZGlzY2FyZGVkIGJlY2F1c2UgdGhlcmUgd2VyZSB0b28gbWFueSBvdXRzdGFuZGluZyByZXF1ZXN0cyAqLworICAgIHVpbnQzMl90IG1zZ190b29fbWFueV9hdXRvOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGF1dG9ub21vdXMgbWVzc2FnZXMgZGlzY2FyZGVkIGJlY2F1c2UgdGhlcmUgd2VyZSB0b28gbWFueSBiZWluZyByZWFzc2VtYmxlZCAqLworICAgIHVpbnQzMl90IG5vdF9jb25uZWN0ZWQ7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFRYIG1lc3NhZ2VzIGRpc2NhcmRlZCBiZWNhdXNlIGNvbm5lY3Rpb24gd2FzIGxvc3QgKi8KKyAgICB1aW50MzJfdCBmcmFnX3JlY2VpdmVkOyAgICAgICAgICAgICAvKio8IFZhbGlkIGZyYWdtZW50cyByZWNlaXZlZCAqLworICAgIHVpbnQzMl90IGZyYWdfaW52YWxpZDsgICAgICAgICAgICAgIC8qKjwgRnJhZ21lbnRzIGRpc2NhcmRlZCAqLworICAgIHVpbnQzMl90IHBhY2tfZXJyb3JzOyAgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZSBwYWNrIGVycm9ycyAqLworICAgIHVpbnQzMl90IHVucGFja19lcnJvcnM7ICAgICAgICAgICAgIC8qKjwgTWVzc2FnZSB1bnBhY2sgZXJyb3JzICovCisgICAgdWludDMyX3Qgbm9fcnhfaGFuZGxlcjsgICAgICAgICAgICAgLyoqPCBNZXNzYWdlIGRpc2NhcmRlZCBiZWNhdXNlIHRoZXJlIHdhcyBubyByeCBoYW5kbGVyICovCit9IGJjbXRyX3N0YXQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9tc2cgYmNtdHJfbXNnOworCisvKiogQ2hhbm5lbCBpZCAqLwordHlwZWRlZiB1aW50OF90IGJjbXRyX2NoYW5uZWxfaWQ7CisKKy8qKiBTZW5kIGZsYWdzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01UUl9TRU5EX0ZMQUdTX05PTkUgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOb25lICovCisgICAgQkNNVFJfU0VORF9GTEFHU19DQUxMICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgUmVxdWVzdC9SZXNwb25zZSBzZXF1ZW5jZSAqLworCisgICAgQkNNVFJfU0VORF9GTEFHU19QUklfTk9STUFMICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTm9ybWFsIHByaW9yaXR5ICovCisgICAgQkNNVFJfU0VORF9GTEFHU19QUklfSEkgICAgICAgICAgICAgPSAweDAwMTAsICAgICAgIC8qKjwgSGlnaCBwcmlvcml0eSAqLworCisgICAgQkNNVFJfU0VORF9GTEFHU19MT05HX1dBSVQgICAgICAgICAgPSAweDAxMDAsICAgICAgIC8qKjwgRW5hYmxlIGxvbmcgd2FpdCB1bnRpbCB0aGVyZSBpcyByb29tIGluIHR4IHF1ZXVlICovCisgICAgQkNNVFJfU0VORF9GTEFHU19TSE9SVF9XQUlUICAgICAgICAgPSAweDAyMDAsICAgICAgIC8qKjwgRW5hYmxlIHNob3J0IHdhaXQgdW50aWwgdGhlcmUgaXMgcm9vbSBpbiB0eCBxdWV1ZSAqLworICAgIEJDTVRSX1NFTkRfRkxBR1NfRE9fTk9UX1dBSVQgICAgICAgID0gMHgwNDAwLCAgICAgICAvKio8IERyb3AgcGFja2V0IGlmIFRYIHEgaXMgZnVsbCAqLworCit9IGJjbXRyX3NlbmRfZmxhZ3M7CisKKyNkZWZpbmUgQkNNVFJfU0VORF9GTEFHU19XQUlUX01BU0sgKEJDTVRSX1NFTkRfRkxBR1NfTE9OR19XQUlUIHwgQkNNVFJfU0VORF9GTEFHU19TSE9SVF9XQUlUIHwgQkNNVFJfU0VORF9GTEFHU19ET19OT1RfV0FJVCkKKworLyoqIFRyYW5zcG9ydCBoYW5kbGVyIHJlZ2lzdHJhdGlvbiBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9oYW5kbGVyX3Bhcm0KK3sKKyAgICB1aW50OF90IGluc3RhbmNlOyAgICAgICAgICAgLyoqPCBJbnN0YW5jZSAoaS5lLCBsaW5rKSAqLworICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXA7ICAgICAvKio8IE1lc3NhZ2UgZ3JvdXAgKi8KKyAgICBiY21vbHRfb2JqX2lkIG9iamVjdDsgICAgICAgLyoqPCBPYmplY3QuIENhbiBiZSBCQ01PTFRfT0JKRUNUX0FOWSAqLworICAgIHVpbnQxNl90IHN1Ymdyb3VwOyAgICAgICAgICAvKio8IE1lc3NhZ2Ugc3ViZ3JvdXAuIENhbiBiZSBCQ01PTFRfU1VCR1JPVVBfQU5ZICovCisgICAgZl9iY21vbHRfbXNnX2hhbmRsZXIgYXBwX2NiOy8qKjwgTWVzc2FnZSBoYW5kbGVyICovCisgICAgYmNtb2x0X2F1dG9fZmxhZ3MgZmxhZ3M7ICAgIC8qKjwgRmxhZ3MuIGFwcF9jYiBpcyBjYWxsZWQgaW4gY29udGV4dCBvZiB0cmFuc3BvcnQgdGFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFwcCBtb2R1bGUsIGRlcGVuZGluZyBvbiB0aGUgZmxhZ3MgKi8KKyAgICBiY21vc19tb2R1bGVfaWQgbW9kdWxlOyAgICAgLyoqPCBUYXJnZXQgbW9kdWxlIGlkLiBSZWxldmFudCBvbmx5IGlmIGZsYWdzID09IEJDTU9MVF9BVVRPX0ZMQUdTX0RJU1BBVENILgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9TX01PRFVMRV9JRF9OT05FIGlzIHJlcGxhY2VkIGJ5IHRoZSBtb2R1bGUgY2FsbGluZyByZWdpc3RyYXRpb24gZnVuY3Rpb24gKi8KK30gYmNtdHJfaGFuZGxlcl9wYXJtOworCisvKiogSW5pdGlhbGl6ZSB0cmFuc3BvcnQgbGlicmFyeS4KKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0sgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9pbml0KHZvaWQpOworCisvKiogUmVsZWFzZSByZXNvdXJjZXMgdXNlZCBieSB0cmFuc3BvcnQgbGlicmFyeS4KKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0sgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9leGl0KHZvaWQpOworCisvKiogU2VuZCBtZXNzYWdlLiBEbyBub3Qgd2FpdCBmb3IgcmVzcG9uc2UKKyAqCisgKiBTZXQtdXAgY29ubmVjdGlvbiBpZiBuZWNlc3NhcnksIHBhY2sgbWVzc2FnZSBhbmQgc2VuZCBpdCB0byB0aGUgcmVtb3RlIHNpZGUuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciBwcm94eSBhbmQgYXV0b25vbW91cyBtZXNzYWdlcy4KKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgbXNnICAgICBBcHBsaWNhdGlvbiBtZXNzYWdlIHRvIGJlIHNlbnQKKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgIGZsYWdzIChyZXF1ZXN0L2F1dG8gb3IgcmVwbHkpCisgKgorICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3NlbmQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY210cl9zZW5kX2ZsYWdzIGZsYWdzKTsKKworLyoqIFNlbmQgcmVzcG9uc2UgbWVzc2FnZQorICoKKyAqIFNldC11cCBjb25uZWN0aW9uIGlmIG5lY2Vzc2FyeSwgcGFjayBtZXNzYWdlIGFuZCBzZW5kIGl0IHRvIHRoZSByZW1vdGUgc2lkZS4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHByb3h5IGFuZCBhdXRvbm9tb3VzIG1lc3NhZ2VzLgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIE9MVCBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtpbl0gICBtc2cgICAgIEFwcGxpY2F0aW9uIG1lc3NhZ2UgdG8gYmUgc2VudAorICogXHBhcmFtW2luXSAgIGZsYWdzICAgZmxhZ3MgKHJlcXVlc3QvYXV0byBvciByZXBseSkKKyAqCisgKiBccmV0dXJucyBCQ01fRVJSX09LIG9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY210cl9zZW5kX3Jlc3BvbnNlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBtc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgIHJldHVybiBiY210cl9zZW5kKGRldmljZSwgbXNnLCBCQ01UUl9TRU5EX0ZMQUdTX0NBTEwgfCBCQ01UUl9TRU5EX0ZMQUdTX1NIT1JUX1dBSVQpOworfQorCisvKiogU2VuZCByZXF1ZXN0IGFuZCB3YWl0IGZvciByZXBseQorICoKKyAqIFNldC11cCBjb25uZWN0aW9uIGlmIG5lY2Vzc2FyeSwgcGFjayBtZXNzYWdlIGFuZCBzZW5kIGl0IHRvIHRoZSByZW1vdGUgc2lkZS4KKyAqIFdhaXQgZm9yIHJlcGx5IG9yIHRpbWVvdXQsIHVucGFjayB0aGUgcmVwbHkgYW5kIHJldHVybi4KKyAqCisgKiBccGFyYW1baW5dICAgICAgICBkZXZpY2UgIE9MVCBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtpbiwgb3V0XSAgIG1zZyAgICAgQXBwbGljYXRpb24gbWVzc2FnZQorICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NhbGwoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKTsKKworLyoqIFJlZ2lzdGVyIG1lc3NhZ2UgaGFuZGxlcgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgT0xUIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHBhcm0gICAgICAgICAgICBSZWdpc3RyYXRpb24gcGFyYW1ldGVycworICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX21zZ19oYW5kbGVyX3JlZ2lzdGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbXRyX2hhbmRsZXJfcGFybSAqcGFybSk7CisKKy8qKiBVbnJlZ2lzdGVyIG1lc3NhZ2UgaGFuZGxlcgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgT0xUIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHBhcm0gICAgICAgICAgICBSZWdpc3RyYXRpb24gcGFyYW1ldGVycworICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX21zZ19oYW5kbGVyX3VucmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtdHJfaGFuZGxlcl9wYXJtICpwYXJtKTsKKworLyoqIEdldCByZWdpc3RyYXRpb24gaW5mbworICoKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGRldmljZSAgICAgICAgICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW4sb3V0XSAgICAgICBwYXJtICAgICAgICAgICAgUmVnaXN0cmF0aW9uIHBhcmFtZXRlcnMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIGdyb3VwLCBvYmplY3QsIHN1Ymdyb3VwIG11c3QgYmUgc2V0CisgKiBccmV0dXJucyBCQ01fRVJSX09LIG9yIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfbXNnX2hhbmRsZXJfcmVnaXN0ZXJfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRyX2hhbmRsZXJfcGFybSAqcGFybSk7CisKKy8qKiBHZXQgdHJhbnNwb3J0IHN0YXRpc3RpY3MKKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE9MVCBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtvdXRdICBzdGF0ICAgICAgICAgICAgU3RhdGlzdGljcworICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRyX3N0YXQgKnN0YXQpOworCisvKiBRdWVyeSB3aGV0aGVyIG9yIG5vdCB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2lzX2Nvbm5lY3RlZChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19ib29sICppc19jb25uZWN0ZWQpOworCisvKiBDb25uZWN0IGRldmljZSAqLworYmNtb3NfZXJybm8gYmNtdHJfY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyogRGlzY29ubmVjdCBkZXZpY2UgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2Rpc2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qIExvdy1sZXZlbCBkaXNjb25uZWN0IHRoYXQgYnJlYWtzICJwaHlzaWNhbCIgY29ubmVjdGlvbiwgYnV0IGRvZXNuJ3QgZGVzdHJveSBjb25uZWN0aW9uIHN0cnVjdHVyZSBhbmQgcmVnaXN0cmF0aW9ucyAqLworYmNtb3NfZXJybm8gYmNtdHJfZHJpdmVyX2Rpc2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qIFJlcGFpci9yZWNvbm5lY3QgdGhlIGRyaXZlci1sZXZlbCBjb25uZWN0aW9uIGZvciBhbiBhbHJlYWR5LWNvbm5lY3RlZCBkZXZpY2UgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2RyaXZlcl9yZWNvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qICJkcm9wcGVkIGJlY2F1c2Ugb2YgdHhfcXVldWUgb3ZlcmZsb3ciIGluZGljYXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoKkZfYmNtdHJfdHhfb3ZlcmZsb3cpKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRyX3NlbmRfZmxhZ3Mgc2VuZF9mbGFncyk7CisKKy8qIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gdGhhdCB0cmFuc21pdCBmYWlsZWQgYmVjYXVzZQorICogdHhfcXVldWUgd2FzIGZ1bGwKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgT0xUIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNiICAgICAgICAgICAgICBDYWxsYmFjayB0byBiZSBjYWxsZWQuIE5VTEw9dW5yZWdpc3RlcgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl90eF9vdmVyZmxvd19jYl9yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBGX2JjbXRyX3R4X292ZXJmbG93IGNiKTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VmdWwgZm9yIHByb3h5IGRhZW1vbi4KKyAqIFRoZXkgcHJvdmlkZSBkaXJlY3QgaW50ZXJmYWNlIHRvIHRyYW5zcG9ydCBwbHVnaW4KKyAqLworCisvKiBDb25uZWN0IGRldmljZSBpbiByYXcgbW9kZQorICogUmVjZWl2ZSB0YXNrIGlzIE5PVCBjcmVhdGVkCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE9MVCBkZXZpY2UgaW5kZXgKKyAqIFxwYXJtW291dF0gICBoZWFkcm9vbSAgICAgICAgSGVhZHJvb20gdGhhdCBzaG91bGQgYmUgcmVzZXJ2ZWQgaW4gYnVmZmVyIHdoZW4gdHJhbnNtaXR0aW5nCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3Byb3h5X2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDMyX3QgKmhlYWRyb29tKTsKKworLyogU2VuZCBkYXRhIHRvIGRldmljZQorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgdHhiICAgICAgICAgICAgIFRyYW5zbWl0IGJ1ZmZlcgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wcm94eV9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9idWYgKnR4X2J1Zik7CisKKy8qIFJlY2VpdmUgZGF0YSBmcm9tIGRldmljZQorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcnhiICAgICAgICAgICAgIFJlY2VpdmUgYnVmZmVyCisgKiBccmV0dXJucyAwPU9LLCBCQ01fRVJSX1RJTUVPVVQtdGltZW91dCBhbmQgbm8gbWVzc2FnZSwgb3RoZXIgZXJyb3JzIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3Byb3h5X3JlY2VpdmUoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2J1ZiAqcnhfYnVmKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQkNNVFJfSU5URVJGQUNFX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2ludGVybmFsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwM2UyOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfaW50ZXJuYWwuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01UUl9JTlRFUk5BTF9IXworI2RlZmluZSBCQ01UUl9JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2J1Zi5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2dfcGFjay5oPgorI2luY2x1ZGUgPGJjbXRyX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJjbXRyX3BsdWdpbi5oPgorI2luY2x1ZGUgPGJjbV9jb25maWcuaD4KKworI2luY2x1ZGUgImJjbXRyX2hlYWRlci5oIgorCisvKiogVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY210cl9wbHVnaW5fY2ZnIHBsdWdpbl9jZmc7ICAgICAgICAvKio8IFRyYW5zcG9ydCBwbHVnaW4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisKKyAgICAvKiogTGltaXRzIGFuZCB0aW1lb3V0cy4KKyAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYXBwcm9wcmlhdGUgQkNNX1RSX2RlZmF1bHQgZGVmaW5lZCBpbiBiY21Db25maWcuaCBpcyB1c2VkCisgICAgICovCisgICAgdWludDMyX3QgbWF4X3JldHJpZXM7ICAgICAgIC8qKjwgTWF4IG51bWJlciBvZiByZXF1ZXN0IHJldHJhbnNtaXNzaW9ucyAqLworICAgIHVpbnQzMl90IG1zZ190aW1lb3V0OyAgICAgICAvKio8IE1heCB0aW1lIHRvIHdhaXQgZm9yIHJlc3BvbnNlIG9yIG5leHQgbWVzc2FnZSBwYXJ0IChtcykgKi8KKyAgICB1aW50MzJfdCBtYXhfcmVxdWVzdHM7ICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlcXVlc3RzICovCisgICAgdWludDMyX3QgbWF4X2F1dG9zOyAgICAgICAgIC8qKjwgTWF4IG51bWJlciBvZiBtdWx0aS1wYXJ0IGF1dG9ub21vdXMgbWVzc2FnZXMgKi8KKyAgICB1aW50MzJfdCBtYXhfZnJhZ21lbnRzOyAgICAgLyoqPCBNYXggbnVtYmVyIG9mIG11bHRpLXBhcnQgbWVzc2FnZSBmcmFnbWVudHMgKi8KKyAgICB1aW50MzJfdCBtc2dfd2FpdF90aW1lb3V0OyAgLyoqPCBNZXNzYWdlIHdhaXRpbmcgdGltZW91dCAobXMpICovCisgICAgdWludDMyX3QgbXNnX3JlYWR5X3RpbWVvdXQ7IC8qKjwgVGltZSB0aGF0IHRyYW5zYWN0aW9uIGlzIGtlcHQgYWZ0ZXIgbm90aWZ5aW5nIGFwcGxpY2F0aW9uIHRoYXQgaXQgZmluaXNoZWQgKG1zKSAqLworICAgIHVpbnQzMl90IG1heF9tdHU7ICAgICAgICAgICAvKio8IE1heCBNVFUgc2l6ZSAoYnl0ZXMpICovCisKKyAgICBpbnQgcnhfdGhyZWFkX3ByaW9yaXR5OyAgICAgLyoqPCBSZWNlaXZlIHRocmVhZCBwcmlvcml0eS4gSWYgc2V0IC0xLCBSeCB0aHJlYWQgaXMgTk9UIGNyZWF0ZWQgKi8KK30gYmNtdHJfY2ZnOworCisvKiogVHJhbnNwb3J0IGNvbm5lY3Rpb24gY29udHJvbCBibG9jayAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJfY29ubiBiY210cl9jb25uOworCisvKiogUmVhc3NlbWJsZSBibG9jayAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJfcmVhc3MKK3sKKyAgICBiY21vbHRfYnVmICpmcmFnbWVudHM7ICAgICAgICAgICAgICAvKiogQXJyYXkgb2YgYmNtdHJfY2ZnLm1heF9mcmFnbWVudHMgKi8KKyAgICB1aW50MzJfdCBudW1fZnJhZ21lbnRzOyAgICAgICAgICAgICAvKiogTnVtYmVyIG9mIGZyYWdtZW50cyBmaWxsZWQgaW4gZnJhZ21lbnRzIGFycmF5ICovCisgICAgdWludDMyX3QgbWF4X2ZyYWdtZW50OyAgICAgICAgICAgICAgLyoqIE1heCBmcmFnbWVudCBudW1iZXIuIFNldCB3aGVuIGxhc3QgZnJhZ21lbnQgaXMgcmVjZWl2ZWQgKi8KKyAgICB1aW50MzJfdCB0b3RhbF9zaXplOyAgICAgICAgICAgICAgICAvKiogVG90YWwgc2l6ZSBvZiByZWNlaXZlZCBmcmFnbWVudHMgKi8KK30gYmNtdHJfcmVhc3M7CisKKy8qKiBUcmFuc3BvcnQgaGVhZGVyIGxpc3QgaGVhZCAqLwordHlwZWRlZiBUQUlMUV9IRUFEKGJjbXRyX21zZ19saXN0LCBiY210cl9tc2cpIGJjbXRyX21zZ19saXN0OworCisvKiogVHJhbnNwb3J0IHRyYW5zYWN0aW9uIGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY210cl9tc2cKK3sKKyAgICBiY21vbHRfYnVmIHR4X2J1ZjsgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zbWl0IGJ1ZmZlciBpbmZvIChyZXF1ZXN0IG9ubHkpICovCisgICAgYmNtb2x0X2J1ZiByeF9idWY7ICAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlIGJ1ZmZlciBpbmZvIChyZXNwb25zZSBvciBhdXRvbm9tb3VzKSAqLworICAgIHVpbnQzMl90IHRpbWVzdGFtcDsgICAgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZSB0aW1lc3RhbXAuIFR4IG9yIGxhc3QgUnggKi8KKyAgICB1aW50MTZfdCB0eF9jb3VudDsgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiB0aW1lcyBtZXNzYWdlIHdhcyB0cmFuc21pdHRlZCAqLworICAgIGJjbXRyX2hkciBoZHI7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlciAqLworICAgIFRBSUxRX0VOVFJZKGJjbXRyX21zZykgbDsgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IG1lc3NhZ2UgbGlzdCBlbnRyeSAqLworICAgIGJjbXRyX3JlYXNzICpzZWdtOyAgICAgICAgICAgICAgICAgIC8qKjwgU2VnbWVudGF0aW9uIGJsb2NrICovCisgICAgYmNtdHJfcmVhc3MgKnJlYXNzOyAgICAgICAgICAgICAgICAgLyoqPCBSZWFzc2VtYmxlIGJsb2NrICovCisgICAgYmNtb2x0X21zZyAqbXNnOyAgICAgICAgICAgICAgICAgICAgLyoqPCBNZXNzYWdlIHJlZmVyZW5jZSAqLworICAgIGJjbW9sdF9zdWJjaGFubmVsIHN1YmNoOyAgICAgICAgICAgIC8qKjwgU3ViLWNoYW5uZWwgdmlhIHdoaWNoIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkICovCisgICAgYmNtb3NfZXJybm8gZXJyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgc3RhdHVzICovCisKKyAgICAvKiBUcmFuc3BvcnQgaGVhZGVyIGlzIGNsZWFyZWQgdXAgdG8gdGhpcyBwb2ludCB3aGVuIHJlbGVhc2VkLgorICAgICAqICJlcnIiIGZpZWxkIGlzIHRoZSBsYXN0IGluIHRoZSBzZWN0aW9uIHRoYXQgZ2V0cyBjbGVhcmVkLgorICAgICAqIERvIG5vdCBtb3ZlIGZpZWxkcyBiZWxvdyBhYm92ZSAiZXJyIiEKKyAgICAgKi8KKyNkZWZpbmUgQkNNVFJfSERSX0NMRUFSX1NJWkUgICAob2Zmc2V0b2YoYmNtdHJfbXNnLCBlcnIpICsgc2l6ZW9mKGJjbW9zX2Vycm5vKSkKKyAgICBiY210cl9tc2dfbGlzdCAqZnJlZV9saXN0OyAgICAgICAgICAvKio8IEZyZWUgbGlzdCBoZWFkIHJlZmVyZW5jZSAqLworICAgIGJjbXRyX2Nvbm4gKmNvbm47ICAgICAgICAgICAgICAgICAgIC8qKjwgQ29ubmVjdGlvbiBiYWNrIHJlZmVyZW5jZSAqLworICAgIGJjbW9zX3NlbSBzZW07ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgIndhaXQgZm9yIHJlc3BvbnNlIiBzZW1hcGhvcmUgKi8KKyAgICBiY21vc19tc2cgaXBjX2hkcjsgICAgICAgICAgICAgICAgICAvKio8IElQQyBtZXNzYWdlIGhlYWRlciAqLworfTsKKworLyoqIE1lc3NhZ2UgaGFuZGxlciBjb250ZXh0ICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9oYW5kbGVyCit7CisgICAgZl9iY21vbHRfbXNnX2hhbmRsZXIgYXBwX2NiOyAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbiAqLworICAgIGJjbW9sdF9hdXRvX2ZsYWdzIGZsYWdzOyAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGZsYWc6IGNhbGwgaW4gY29udGV4dCBvZiB0cmFuc3BvcnQgcnggdGhyZWFkIG9yIGFwcCBtb2R1bGUgKi8KKyAgICBiY21vc19tb2R1bGVfaWQgbW9kdWxlOyAgICAgICAgICAgICAvKio8IE9wdGlvbmFsIG1vZHVsZSB0byBkaXNwYXRjaCByZWNlaXZlZCBtZXNzYWdlIHRvICovCit9IGJjbXRyX2hhbmRsZXI7CisKKy8qKiBUcmFuc3BvcnQgY29ubmVjdGlvbiBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtdHJfY29ubgoreworICAgIGNoYXIgbmFtZVsxNl07ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IG5hbWUgKi8KKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlOyAgICAgICAgICAgICAgICAvKio8IERldmljZSBpbmRleCAqLworICAgIGJjbXRyX2NoYW5uZWxfaWQgY2hhbm5lbDsgICAgICAgICAgIC8qKjwgQ2hhbm5lbHMgc2VydmVkIGJ5IHRoaXMgdHJhbnNwb3J0ICovCisgICAgYmNtdHJfY2ZnIGNmZzsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisgICAgYmNtdHJfZHJpdmVyIGRyaXZlcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgZHJpdmVyICovCisgICAgYmNtdHJfcGx1Z2luX2NoYW5uZWwgZHJ2X3ByaXY7ICAgICAgLyoqPCBQbHVnaW4gZHJpdmVyIHByaXZhdGUgZGF0YSAqLworICAgIGJjbW9zX3Rhc2sgcnhfdGhyZWFkOyAgICAgICAgICAgICAgIC8qKjwgUlggdGhyZWFkIGhhbmRsZSAqLworICAgIGJjbW9zX211dGV4IG11dGV4OyAgICAgICAgICAgICAgICAgIC8qKjwgTXV0ZXggcHJvdGVjdGluZyB0aGUgdHJhbnNwb3J0IHN0cnVjdHVyZSAqLworICAgIHVpbnQzMl90IGxhc3RfdGltZW91dF9jaGVjazsgICAgICAgIC8qKjwgTGFzdCB0aW1lb3V0IGNoZWNrIHRpbWVzdGFtcCAqLworICAgIHVpbnQzMl90IHRpbWVvdXRfY2hlY2tfcGVyaW9kOyAgICAgIC8qKjwgVGltZS1vdXQgY2hlY2sgcGVyaW9kICovCisgICAgYmNtdHJfbXNnX2xpc3QgbXNnX2xpc3Q7ICAgICAgICAgICAgLyoqPCBNZXNzYWdlIGxpc3QgaGVhZCAqLworICAgIGJjbXRyX21zZ19saXN0IGZyZWVfcmVxX2xpc3Q7ICAgICAgIC8qKjwgRnJlZSByZXF1ZXN0IGJsb2NrIGxpc3QgKi8KKyAgICBiY210cl9tc2dfbGlzdCBmcmVlX2F1dG9fbGlzdDsgICAgICAvKio8IEZyZWUgYXV0b25vbW91cyBibG9jayBsaXN0ICovCisgICAgYmNtdHJfbXNnICp0bXNnX2FycmF5OyAgICAgICAgICAgICAgLyoqPCBQcmUtYWxsb2NhdGVkIGFycmF5IG9mIHRyYW5zcG9ydCBoZWFkZXJzICovCisgICAgYmNtdHJfc3RhdCBzdGF0OyAgICAgICAgICAgICAgICAgICAgLyoqPCBTdGF0aXN0aWNzICovCisgICAgYmNtb3NfYm9vbCBjb25uZWN0ZWQ7ICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgc3RhdGUgKi8KKyAgICB1aW50MTZfdCBudW1fcmVxdWVzdHM7ICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBvdXRzdGFuZGluZyByZXF1ZXN0cyAqLworICAgIHVpbnQxNl90IG51bV9hdXRvOyAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGF1dG9ub21vdXMgbWVzc2FnZXMgYmVpbmcgcmVhc3NlbWJsZWQgKi8KKyAgICB1aW50MTZfdCBjb3JyX3RhZzsgICAgICAgICAgICAgICAgICAvKio8IExhc3QgdXNlZCBjb3JyZWxhdGlvbiB0YWcgKi8KKyAgICBiY21vc19ib29sIHJ4X3RocmVhZF9jcmVhdGVkOyAgICAgICAvKio8IFRSVUU9UlggdGhyZWFkIHdhcyBjcmVhdGVkICovCisgICAgaW50IGtpbGxfcmVxdWVzdDsgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgdGhyZWFkIGlzIGNvbW1hbmRlZCB0byBkaWUgKi8KKyAgICBpbnQga2lsbF9kb25lOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCB0aHJlYWQgaXMgZGVhZCAqLworfTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2JjbW9zX2Vycm5vIGJjbXRyX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJfY2ZnICpjZmcsIGJjbXRyX2RyaXZlciAqZHJpdmVyKTsKKworYmNtb3NfZXJybm8gX2JjbXRyX2Nvbm5fZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRyX2Nvbm4gKipjb25uKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEJDTVRSX0lOVEVSTkFMX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX3RyYW5zcG9ydC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjkxNThlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDE3MTMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY210cl9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiY210cl9kZWJ1Zy5oPgorCisjaW5jbHVkZSAiYmNtdHJfaGVhZGVyLmgiCisjaW5jbHVkZSAiYmNtdHJfaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY210cl9jb25uICpjb25uOyAvKio8IENvbm5lY3Rpb24gZHluYW1pYyBpbmZvIChhbGxvY2F0ZWQgb24gY29ubmVjdCkgKi8KKyAgICBiY210cl9oYW5kbGVyIG1zZ19oYW5kbGVyW0JDTU9MVF9HUk9VUF9JRF9fTlVNX09GXVtCQ01UUl9NQVhfSU5TVEFOQ0VTXTsKKyAgICBGX2JjbXRyX3R4X292ZXJmbG93IG92ZXJmbG93X2NiOyAgICAvKio8IENhbGxiYWNrIHRvIGJlIGNhbGxlZCBpbiBjYXNlIG9mIHR4IGRyb3AgYmVjYXVzZSBvZiBxdWV1ZSBvdmVyZmxvdyAqLworfSBiY210cl9jb25uX2luZm87CisKK3N0YXRpYyBiY210cl9jb25uX2luZm8gY29ubl9pbmZvW0JDTVRSX01BWF9PTFRTXTsgLyogU3RvcmUgY29ubmVjdGlvbiBpbmZvIHNlcGFyYXRlbHkgcGVyIE9MVCAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJfY29ubiAqKmNvbm4sIGJjbW9zX2Jvb2wgcmF3X21vZGUpOworCitzdGF0aWMgYmNtb3NfbXV0ZXggY29ubl9sb2NrOworCisvKiBHZXQgZXhpc3RpbmcgY29ubmVjdGlvbi4gSWYgbm9uZSAtIHNldHVwIG5ldy4KKyAqIElmIHJhd19tb2RlIGlzIFRSVUUsIHRoZSBjb25uZWN0aW9uIGlzIGludGVuZGVkIGZvciB1c2UgYnkgcmF3IGludGVyZmFjZQorICogYmNtdHJfcHJveHlfeHgoKS4gSW4gdGhpcyBjYXNlIFJYIHRhc2sgaXMgbm90IGNyZWF0ZWQKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY210cl9jb25uX2dldF9hbnkoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJfY29ubiAqKmNvbm4sIGJjbW9zX2Jvb2wgaXNfcmF3KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorICAgICpjb25uID0gY29ubl9pbmZvW2RldmljZV0uY29ubjsKKyAgICBpZiAoKmNvbm4pCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZXJyID0gX2JjbXRyX2Nvbm5lY3QoZGV2aWNlLCAmY29ubl9pbmZvW2RldmljZV0uY29ubiwgaXNfcmF3KTsKKyAgICAqY29ubiA9IGNvbm5faW5mb1tkZXZpY2VdLmNvbm47CisgICAgcmV0dXJuIGVycjsKK30KKworLyogR2V0IGV4aXN0aW5nIGNvbm5lY3Rpb24uIElmIG5vbmUgLSBzZXR1cCBuZXcgKi8KK2JjbW9zX2Vycm5vIF9iY210cl9jb25uX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cl9jb25uICoqY29ubikKK3sKKyAgICByZXR1cm4gX2JjbXRyX2Nvbm5fZ2V0X2FueShkZXZpY2UsIGNvbm4sIEJDTU9TX0ZBTFNFKTsKK30KKworLyogRnJlZSByZWFzc2VtYmxlIGJsb2NrICovCitzdGF0aWMgdm9pZCBfYmNtdHJfcmVhc3NfYmxvY2tfZnJlZShiY210cl9yZWFzcyAqKnByYikKK3sKKyAgICBiY210cl9yZWFzcyAqcmVhc3MgPSAqcHJiOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGk8cmVhc3MtPm51bV9mcmFnbWVudHM7IGkrKykKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfZnJlZSgmcmVhc3MtPmZyYWdtZW50c1tpXSk7CisgICAgfQorICAgIGJjbW9zX2ZyZWUocmVhc3MpOworICAgICpwcmIgPSBOVUxMOworfQorCisvKiBGcmVlIHRyYW5zcG9ydCBoZWFkZXIuIENhbGxlZCB1bmRlciB0cmFuc3BvcnQgbG9jayAqLworc3RhdGljIHZvaWQgX2JjbXRyX3Rtc2dfZnJlZShiY210cl9tc2cgKnRtc2csIGJjbXRyX21zZ19saXN0ICpjdXJfbGlzdCkKK3sKKyAgICAvKiBSZW1vdmUgZnJvbSB0aGUgbGlzdCBpdCBpcyBpbiwgaWYgYW55ICovCisgICAgaWYgKGN1cl9saXN0KQorICAgICAgICBUQUlMUV9SRU1PVkUoY3VyX2xpc3QsIHRtc2csIGwpOworCisgICAgYmNtb2x0X2J1Zl9mcmVlKCZ0bXNnLT50eF9idWYpOworICAgIGJjbW9sdF9idWZfZnJlZSgmdG1zZy0+cnhfYnVmKTsKKyAgICBpZiAodG1zZy0+cmVhc3MpCisgICAgICAgIF9iY210cl9yZWFzc19ibG9ja19mcmVlKCZ0bXNnLT5yZWFzcyk7CisgICAgbWVtc2V0KHRtc2csIDAsIEJDTVRSX0hEUl9DTEVBUl9TSVpFKTsKKworICAgIC8qIFJlcXVlc3QtcmVzcG9uc2Ugb3IgYXV0b25vbW91cyA/ICovCisgICAgVEFJTFFfSU5TRVJUX1RBSUwodG1zZy0+ZnJlZV9saXN0LCB0bXNnLCBsKTsKK30KKworLyogVW5wYWNrIG1lc3NhZ2UuICp1bnBhY2tlZCBpcyBzZXQ9TlVMTCBpbiBjYXNlIG9mIGVycm9yICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIF9iY210cl9tc2dfdW5wYWNrKGJjbXRyX2Nvbm4gKmNvbm4sIGJjbW9sdF9idWYgKmJ1ZiwgYmNtdHJfaGRyICpoZHIsIHVpbnQzMl90IHRzLCBiY21vbHRfbXNnICoqbXNnKQoreworICAgIGludDE2X3QgZXJyOworICAgIHVpbnQ4X3QgKnBhY2tlZCA9IGJ1Zi0+Y3VycjsKKyAgICB1aW50MzJfdCBwYWNrZWRfbGVuZ3RoID0gYmNtb2x0X2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKTsKKworICAgIC8qIFVucGFjayAqLworICAgIEJVR19PTighYnVmLT5zdGFydCk7CisgICAgZXJyID0gYmNtb2x0X21zZ191bnBhY2soYnVmLCBtc2cpOworICAgIGlmIChlcnIgPCAwKQorICAgIHsKKyAgICAgICAgQkNNVFJfQ0xEX0NIRUNLX05PVElGWShjb25uLT5kZXZpY2UsIGhkciwgQkNNVFJfQ0xEX0VWX1JFQ1ZfRElTQ0FSRCwgdHMsIHBhY2tlZCwgcGFja2VkX2xlbmd0aCwgTlVMTCk7CisgICAgICAgICsrY29ubi0+c3RhdC51bnBhY2tfZXJyb3JzOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIEJDTVRSX0NMRF9DSEVDS19OT1RJRlkoY29ubi0+ZGV2aWNlLCBoZHIsIEJDTVRSX0NMRF9FVl9SRUNWLCB0cywgcGFja2VkLCBwYWNrZWRfbGVuZ3RoLCAqbXNnKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBUcmFuc3BvcnQgSVBDIHJlbGVhc2UgY2FsbGJhY2sgKi8KK3N0YXRpYyB2b2lkIF9iY210cl9pcGNfbXNnX3JlbGVhc2UoYmNtb3NfbXNnICptKQoreworICAgIEJDTU9TX1RSQUNFX0VSUigiV2Ugc2hvdWxkbid0IGJlIGhlcmUhXG4iKTsKK30KKworLyogVHJhbnNwb3J0IElQQyBtZXNzYWdlIGhhbmRsZXIuCisgKiBDYWxsZWQgaW4gY29udGV4dCBvZiB0aGUgdGFyZ2V0IG1vZHVsZSBhcyBwYXJ0CisgKiBvZiBkaXNwYXRjaGluZyBtZXNzYWdlIHRvIHRoZSB1c2VyIHRhc2suCisgKiBJdCB1bnBhY2tzIG1lc3NhZ2UsIHJlbGVhc2VzIHRyYW5zcG9ydCBoZWFkZXIgYW5kIGNhbGxzIHVzZXIgY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgX2JjbXRyX2lwY19tc2dfaGFuZGxlcihiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm0pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgYmNtdHJfbXNnICp0bXNnID0gbS0+ZGF0YTsKKyAgICBiY210cl9jb25uICpjb25uID0gdG1zZy0+Y29ubjsKKyAgICBiY21vbHRfbXNnICptc2cgPSBOVUxMOworCisgICAgLyogVW5wYWNrICovCisgICAgZXJyID0gX2JjbXRyX21zZ191bnBhY2soY29ubiwgJnRtc2ctPnJ4X2J1ZiwgJnRtc2ctPmhkciwgdG1zZy0+dGltZXN0YW1wLCAmbXNnKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoCisgICAgICAgICAgICAiVW5wYWNrIGVycm9yIGZvciBtb2R1bGUgJWQuIEVycm9yICVzICglZClcbiIsCisgICAgICAgICAgICBtb2R1bGVfaWQsCisgICAgICAgICAgICBiY21vc19zdHJlcnJvcihlcnIpLAorICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgbXNnID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobXNnICE9IE5VTEwpCisgICAgeworICAgICAgICBiY210cl9oYW5kbGVyICpoID0gJmNvbm5faW5mb1tjb25uLT5kZXZpY2VdLm1zZ19oYW5kbGVyW3Rtc2ctPmhkci5tc2dfaWRdW3Rtc2ctPmhkci5pbnN0YW5jZV07CisgICAgICAgIG1zZy0+c3ViY2ggPSB0bXNnLT5zdWJjaDsKKyAgICAgICAgaWYgKGgtPmFwcF9jYikKKyAgICAgICAgeworICAgICAgICAgICAgbXNnLT5jb3JyX3RhZyA9IHRtc2ctPmhkci5jb3JyX3RhZzsKKyAgICAgICAgICAgIGgtPmFwcF9jYihjb25uLT5kZXZpY2UsIG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKKyAgICAgICAgICAgICsrY29ubi0+c3RhdC5ub19yeF9oYW5kbGVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUmVsZWFzZSB0cmFuc3BvcnQgaGVhZGVyIHVuZGVyIGNvbm4gbG9jayAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmNvbm4tPm11dGV4KTsKKyAgICBfYmNtdHJfdG1zZ19mcmVlKHRtc2csIE5VTEwpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubi0+bXV0ZXgpOworfQorCisvKiBJbml0IElQQyBoZWFkZXIgaW4gdHJhbnNwb3J0IG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIF9iY210cl90bXNnX2lwY19pbml0KGJjbXRyX21zZyAqdG1zZykKK3sKKyAgICB0bXNnLT5pcGNfaGRyLnN0YXJ0ID0gdG1zZy0+aXBjX2hkci5kYXRhID0gdG1zZzsKKyAgICB0bXNnLT5pcGNfaGRyLnR5cGUgPSBCQ01PU19NU0dfSURfSU5URVJOQUxfSVBDOworICAgIHRtc2ctPmlwY19oZHIucmVsZWFzZSA9IF9iY210cl9pcGNfbXNnX3JlbGVhc2U7CisgICAgdG1zZy0+aXBjX2hkci5oYW5kbGVyID0gX2JjbXRyX2lwY19tc2dfaGFuZGxlcjsKK30KKworLyogUHJlLWFsbG9jYXRlIHRyYW5zcG9ydCBoZWFkZXIgYXJyYXksIHB1dCBhbGwgYmxvY2tzIG9uIGZyZWUgbGlzdHMgKi8KK3N0YXRpYyBpbnQgX2JjbXRyX3Rtc2dfbGlzdF9hbGxvYyhiY210cl9jb25uICpjb25uKQoreworICAgIGludCBuX2hkciwgaTsKKyAgICBiY210cl9tc2cgKnRtc2c7CisKKyAgICBuX2hkciA9IGNvbm4tPmNmZy5tYXhfcmVxdWVzdHMgKyBjb25uLT5jZmcubWF4X2F1dG9zOworICAgIGNvbm4tPnRtc2dfYXJyYXkgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbXRyX21zZykgKiBuX2hkcik7CisgICAgaWYgKCFjb25uLT50bXNnX2FycmF5KQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKworICAgIHRtc2cgPSBjb25uLT50bXNnX2FycmF5OworICAgIGZvciAoaT0wOyBpPGNvbm4tPmNmZy5tYXhfcmVxdWVzdHM7IGkrKywgdG1zZysrKQorICAgIHsKKyAgICAgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAgICAgVEFJTFFfSU5TRVJUX1RBSUwoJmNvbm4tPmZyZWVfcmVxX2xpc3QsIHRtc2csIGwpOworICAgICAgICB0bXNnLT5mcmVlX2xpc3QgPSAmY29ubi0+ZnJlZV9yZXFfbGlzdDsKKyAgICAgICAgcmMgPSBiY21vc19zZW1fY3JlYXRlKCZ0bXNnLT5zZW0sIDAsIDAsIE5VTEwpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgX2JjbXRyX3Rtc2dfaXBjX2luaXQodG1zZyk7CisgICAgICAgIHRtc2ctPmNvbm4gPSBjb25uOworICAgIH0KKyAgICBmb3IgKGk9MDsgaTxjb25uLT5jZmcubWF4X2F1dG9zOyBpKyssIHRtc2crKykKKyAgICB7CisgICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZjb25uLT5mcmVlX2F1dG9fbGlzdCwgdG1zZywgbCk7CisgICAgICAgIHRtc2ctPmZyZWVfbGlzdCA9ICZjb25uLT5mcmVlX2F1dG9fbGlzdDsKKyAgICAgICAgX2JjbXRyX3Rtc2dfaXBjX2luaXQodG1zZyk7CisgICAgICAgIHRtc2ctPmNvbm4gPSBjb25uOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQ2xlYW51cCBmdW5jdGlvbiAtIGZyZWUgdHJhbnNwb3J0IGhlYWRlcnMgKi8KK3N0YXRpYyB2b2lkIF9iY210cl90bXNnX2xpc3RfZnJlZShiY210cl9jb25uICpjb25uKQoreworICAgIGJjbXRyX21zZyAqdG1zZywgKnRtcF90bXNnOworCisgICAgaWYgKCFjb25uLT50bXNnX2FycmF5KQorICAgICAgICByZXR1cm47CisKKyAgICBUQUlMUV9GT1JFQUNIX1NBRkUodG1zZywgJmNvbm4tPm1zZ19saXN0LCBsLCB0bXBfdG1zZykKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2cgKm1zZyA9IHRtc2ctPm1zZzsKKyAgICAgICAgLyogUmVsZWFzZSB3YWl0aW5nIHRhc2sgaWYgcmVxdWVzdC1yZXNwb25zZSAqLworICAgICAgICBpZiAobXNnICYmIHRtc2ctPmVyciA9PSBCQ01fRVJSX0lOX1BST0dSRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBtc2ctPmVyciA9IEJDTV9FUlJfQ09NTV9GQUlMOworICAgICAgICAgICAgYmNtb3Nfc2VtX3Bvc3QoJnRtc2ctPnNlbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKHRtc2csICZjb25uLT5mcmVlX3JlcV9saXN0LCBsLCB0bXBfdG1zZykKKyAgICB7CisgICAgICAgIGJjbW9zX3NlbV9kZXN0cm95KCZ0bXNnLT5zZW0pOworICAgIH0KKyAgICBiY21vc19mcmVlKGNvbm4tPnRtc2dfYXJyYXkpOworfQorCisvKiBBbGxvY2F0ZSB0cmFuc3BvcnQgaGVhZGVyIGZyb20gdGhlIGdpdmVuIGZyZWUgbGlzdC4KKyAqIE11c3QgYmUgY2FsbGVkIHVuZGVyIGxvY2sKKyAqLworc3RhdGljIGlubGluZSBiY210cl9tc2cgKl9iY210cl9tc2dfZ2V0X2ZyZWUoYmNtdHJfbXNnX2xpc3QgKmZyZWVfbGlzdCkKK3sKKyAgICBiY210cl9tc2cgKnRtc2cgPSBUQUlMUV9GSVJTVChmcmVlX2xpc3QpOworICAgIGlmICh0bXNnKQorICAgICAgICBUQUlMUV9SRU1PVkUoZnJlZV9saXN0LCB0bXNnLCBsKTsKKyAgICByZXR1cm4gdG1zZzsKK30KKworLyogRmluZCBtZXNzYWdlIGJ5IGNvcnJlbGF0aW9uIHRhZworICogQ2FsbGVkIHVuZGVyIGxvY2sKKyAqLworc3RhdGljIGJjbXRyX21zZyAqX2JjbXRyX21zZ19nZXRfYnlfY29ycl90YWcoY29uc3QgYmNtdHJfY29ubiAqY29ubiwgY29uc3QgYmNtdHJfaGRyICpoZHIpCit7CisgICAgYmNtdHJfbXNnICp0bXNnOworCisgICAgVEFJTFFfRk9SRUFDSCh0bXNnLCAmY29ubi0+bXNnX2xpc3QsIGwpCisgICAgeworICAgICAgICBpZiAodG1zZy0+aGRyLmNvcnJfdGFnPT1oZHItPmNvcnJfdGFnICYmIHRtc2ctPmhkci5tc2dfaWQ9PWhkci0+bXNnX2lkICYmIHRtc2ctPmVyciA9PSBCQ01fRVJSX0lOX1BST0dSRVNTKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0bXNnOworfQorCisvKiBNZXNzYWdlIHJlYXNzZW1ibGVyLiBSZXR1cm5zIFRSVUUgaWYgbWVzc2FnZSByZWFzc2VtYmxpbmcgaXMgY29tcGxldGVkICovCitzdGF0aWMgYmNtb3NfYm9vbCBfYmNtdHJfcmVhc3NlbWJsZShiY210cl9jb25uICpjb25uLCBiY210cl9tc2cgKnRtc2csIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBiY210cl9oZHIgKmhkciA9ICZ0bXNnLT5oZHI7CisgICAgdWludDE2X3QgZnJhZ19udW0gPSBoZHItPmZyYWdfbnVtYmVyOworICAgIGJjbW9zX2Jvb2wgZG9uZSA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgaXNfbGFzdDsKKworICAgIGlzX2xhc3QgPSAhaGRyLT5tb3JlX2ZyYWdtZW50czsKKworICAgIC8qIFNpbmdsZS1idWZmZXIgbWVzc2FnZSA/ICovCisgICAgaWYgKGlzX2xhc3QgJiYgIWZyYWdfbnVtKQorICAgIHsKKyAgICAgICAgdG1zZy0+cnhfYnVmID0gKmJ1ZjsKKyAgICAgICAgdG1zZy0+ZXJyID0gQkNNX0VSUl9PSzsKKyAgICAgICAgYnVmLT5zdGFydCA9IE5VTEw7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIC8qCisgICAgICogTXVsdGktcGFydCBtZXNzYWdlCisgICAgICovCisKKyAgICAvKiBEaXNjYXJkIGlmIGludmFsaWQgZnJhZ21lbnQgbnVtYmVyIG9yIGR1cGxpY2F0ZSAqLworICAgIGlmIChmcmFnX251bSA+PSBjb25uLT5jZmcubWF4X2ZyYWdtZW50cyB8fAorICAgICAgICAodG1zZy0+cmVhc3MgJiYgdG1zZy0+cmVhc3MtPmZyYWdtZW50c1tmcmFnX251bV0uc3RhcnQpICkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfZnJlZShidWYpOworICAgICAgICAvKiBJZiBsYXN0IG91dC1vZiByYW5nZSBmcmFnbWVudCB3YXMgcmVjZWl2ZWQgcmVwb3J0IGl0LgorICAgICAgICAgKiBXZSB3YW50IHRvIGF2b2lkIHJlcXVlc3QgcmV0cmFuc21pc3Npb24gaW4gdGhpcyBjYXNlICovCisgICAgICAgIGlmIChmcmFnX251bSA+PSBjb25uLT5jZmcubWF4X2ZyYWdtZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgdG1zZy0+ZXJyID0gQkNNX0VSUl9UT09fTUFOWV9GUkFHUzsKKyAgICAgICAgICAgIHJldHVybiBpc19sYXN0OworICAgICAgICB9CisgICAgICAgICsrY29ubi0+c3RhdC5mcmFnX2ludmFsaWQ7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSByZWFzc2VtYmx5IGJ1ZmZlciBpZiBub3QgZG9uZSB5ZXQgYW5kIHN0b3JlIGZyYWdtZW50ICovCisgICAgaWYgKCF0bXNnLT5yZWFzcykKKyAgICB7CisgICAgICAgIHRtc2ctPnJlYXNzID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY210cl9yZWFzcykgKyBjb25uLT5jZmcubWF4X2ZyYWdtZW50cyAqIHNpemVvZihiY21vbHRfYnVmKSk7CisgICAgICAgIGlmICghdG1zZy0+cmVhc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtc2ctPmVyciA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICArK2Nvbm4tPnN0YXQubXNnX25vX21lbTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfZnJlZShidWYpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIHRtc2ctPnJlYXNzLT5mcmFnbWVudHMgPSAoYmNtb2x0X2J1ZiAqKSgobG9uZyl0bXNnLT5yZWFzcyArIHNpemVvZihiY210cl9yZWFzcykpOworICAgIH0KKyAgICB0bXNnLT5yZWFzcy0+dG90YWxfc2l6ZSArPSBiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpOworICAgIHRtc2ctPnJlYXNzLT5mcmFnbWVudHNbZnJhZ19udW1dID0gKmJ1ZjsKKyAgICBidWYtPnN0YXJ0ID0gTlVMTDsKKyAgICB0bXNnLT5yZWFzcy0+bnVtX2ZyYWdtZW50cysrOworICAgIGlmIChpc19sYXN0KQorICAgICAgICB0bXNnLT5yZWFzcy0+bWF4X2ZyYWdtZW50ID0gZnJhZ19udW07CisgICAgZG9uZSA9ICh0bXNnLT5yZWFzcy0+bWF4X2ZyYWdtZW50ICYmICh0bXNnLT5yZWFzcy0+bnVtX2ZyYWdtZW50cyA+IHRtc2ctPnJlYXNzLT5tYXhfZnJhZ21lbnQpKTsKKyAgICArK2Nvbm4tPnN0YXQuZnJhZ19yZWNlaXZlZDsKKworICAgIC8qIFJlYXNzZW1ibGUgaWYgZG9uZSAqLworICAgIGlmIChkb25lKQorICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgYmlnIGZsYXQgYnVmZmVyICovCisgICAgICAgIGlmIChiY21vbHRfYnVmX2FsbG9jKCZ0bXNnLT5yeF9idWYsIHRtc2ctPnJlYXNzLT50b3RhbF9zaXplLCBCQ01UUl9CVUZfRU5ESUFOKSA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJvZHkgPSB0bXNnLT5yeF9idWYuc3RhcnQ7CisKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHRtc2ctPnJlYXNzLT5udW1fZnJhZ21lbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhZ19zaXplID0gYmNtb2x0X2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoJnRtc2ctPnJlYXNzLT5mcmFnbWVudHNbaV0pOworICAgICAgICAgICAgICAgIEJVR19PTighdG1zZy0+cmVhc3MtPmZyYWdtZW50c1tpXS5jdXJyKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYm9keSwgdG1zZy0+cmVhc3MtPmZyYWdtZW50c1tpXS5jdXJyLCBmcmFnX3NpemUpOworICAgICAgICAgICAgICAgIGJvZHkgKz0gZnJhZ19zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1zZy0+ZXJyID0gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlYXNzZW1ibHkgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkICovCisgICAgICAgICAgICB0bXNnLT5lcnIgPSBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIE1vcmUgZnJhZ21lbnRzIGV4cGVjdGVkLiBVcGRhdGUgdGltZXN0YW1wIHRvIHByb2xvbmcgdGltaW5nIG91dCAqLworICAgICAgICB0bXNnLT50aW1lc3RhbXAgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZG9uZTsKK30KKworLyogTm90aWZ5IGFwcGxpY2F0aW9uIHRoYXQgbWVzc2FnZSBpcyByZWFkeSAqLworc3RhdGljIGlubGluZSB2b2lkIF9iY210cl9ub3RpZnlfcmVhZHkoYmNtdHJfY29ubiAqY29ubiwgYmNtdHJfbXNnICp0bXNnKQoreworICAgIGJjbW9zX3NlbV9wb3N0KCZ0bXNnLT5zZW0pOworfQorCisvKiBOb3RpZnkgcnggcmVxdWVzdC9yZXNwb25zZSBtZXNzYWdlCisgKiBjYWxsZWQgdW5kZXIgY29ubmVjdGlvbiBsb2NrCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfYmNtdHJfbm90aWZ5X3J4X3Jlc3BvbnNlKGJjbXRyX2Nvbm4gKmNvbm4sIGJjbXRyX21zZyAqdG1zZykKK3sKKyAgICArK2Nvbm4tPnN0YXQubXNnX3Jlc3BfcmVjZWl2ZWQ7CisKKyAgICAvKiBOb3cgdW5sb2NrIGFuZCBub3RpZnkgYXBwbGljYXRpb24uIEF1dG9ub21vdXMgaGFuZGxlciBpcyBvbmx5IGNhbGxlZCBpZiBtZXNzYWdlIGlzIE9LLgorICAgICAgIFRoZSBsb2NrIGhhcyBiZWVuIHRha2VuIGluIF9iY210cl9yeF9wYWNrZXQgKi8KKyAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKworICAgIC8qIFJlbGVhc2Ugd2FpdGluZyBhcHBsaWNhdGlvbi4gSXQgd2lsbCB0YWtlIGNhcmUgb2YgdW5wYWNraW5nICovCisgICAgX2JjbXRyX25vdGlmeV9yZWFkeShjb25uLCB0bXNnKTsKK30KKworLyogTm90aWZ5IHJ4IGF1dG9ub21vdXMgbWVzc2FnZQorICogY2FsbGVkIHVuZGVyIGNvbm5lY3Rpb24gbG9jaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgX2JjbXRyX25vdGlmeV9yeF9yZXFfYXV0byhiY210cl9jb25uICpjb25uLCBiY210cl9tc2cgKnRtc2cpCit7CisgICAgYmNtb2x0X2J1ZiByeF9idWY7CisgICAgYmNtb2x0X21zZyAqbXNnID0gTlVMTDsKKyAgICBiY21vbHRfZ3JvdXBfaWQgbXNnX2lkID0gdG1zZy0+aGRyLm1zZ19pZDsKKyAgICBiY210cl9oYW5kbGVyICpoOworICAgIHVpbnQxNl90IGNvcnJfdGFnOworICAgIGJjbXRyX2hkciBoZHIgPSB0bXNnLT5oZHI7CisgICAgdWludDMyX3QgdHMgPSB0bXNnLT50aW1lc3RhbXA7CisgICAgYmNtb2x0X3N1YmNoYW5uZWwgc3ViY2ggPSB0bXNnLT5zdWJjaDsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBpZiAobXNnX2lkID49IEJDTU9MVF9HUk9VUF9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJVbmV4cGVjdGVkIG1zZyBncm91cCBpZDogJXVcbiIsIHRtc2ctPmhkci5tc2dfaWQpOworICAgICAgICBfYmNtdHJfdG1zZ19mcmVlKHRtc2csIE5VTEwpOworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodG1zZy0+aGRyLmluc3RhbmNlID49IEJDTVRSX01BWF9JTlNUQU5DRVMpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIlVuZXhwZWN0ZWQgaW5zdGFuY2UgaWQ6ICV1XG4iLCB0bXNnLT5oZHIuaW5zdGFuY2UpOworICAgICAgICBfYmNtdHJfdG1zZ19mcmVlKHRtc2csIE5VTEwpOworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBoID0gJmNvbm5faW5mb1tjb25uLT5kZXZpY2VdLm1zZ19oYW5kbGVyW3Rtc2ctPmhkci5tc2dfaWRdW3Rtc2ctPmhkci5pbnN0YW5jZV07CisgICAgQlVHX09OKCFoLT5hcHBfY2IpOworICAgICsrY29ubi0+c3RhdC5tc2dfcmVxX2F1dG9fcmVjZWl2ZWQ7CisKKyAgICAvKiBJZiBkaXNwYXRjaCBpcyByZXF1aXJlZCAtIGRvIGl0LgorICAgICAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgdW5wYWNrZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlY2VpdmVyCisgICAgICovCisgICAgaWYgKChoLT5mbGFncyAmIEJDTU9MVF9BVVRPX0ZMQUdTX0RJU1BBVENIKSkKKyAgICB7CisgICAgICAgIGVyciA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShoLT5tb2R1bGUsICZ0bXNnLT5pcGNfaGRyLCAwKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBkZWxpdmVyIG1lc3NhZ2UgdG8gbW9kdWxlICVkLiBFcnJvciAlcyglZClcbiIsCisgICAgICAgICAgICAgICAgaC0+bW9kdWxlLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIpOworICAgICAgICAgICAgX2JjbXRyX3Rtc2dfZnJlZSh0bXNnLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIE5vIGRpc3BhdGNoLiBVbnBhY2tpbmcgaW4gdGhlIGNvbnRleHQgb2YgcnggdGhyZWFkICovCisgICAgY29ycl90YWcgPSB0bXNnLT5oZHIuY29ycl90YWc7CisgICAgLyogTWFrZSBzdXJlIHRoYXQgcnhfYnVmIGlzIG5vdCByZWxlYXNlZCBieSB0aGUgZm9sbG93aW5nIF9iY210cl9tc2dfZnJlZS4KKyAgICAgKiBJdCBpcyBuZWVkZWQgZm9yIHVucGFjayBhbmQgd2lsbCBiZSByZWxlYXNlZCBzZXBhcmF0ZWx5IGxhdGVyLiAqLworICAgIHJ4X2J1ZiA9IHRtc2ctPnJ4X2J1ZjsKKyAgICB0bXNnLT5yeF9idWYuc3RhcnQgPSBOVUxMOworICAgIF9iY210cl90bXNnX2ZyZWUodG1zZywgTlVMTCk7CisKKyAgICAvKiBSZWxlYXNlIGNvbm5lY3Rpb24gbG9jayB0YWtlbiBpbiBfYmNtdHJfcnhfcGFja2V0ICovCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uLT5tdXRleCk7CisKKyAgICAvKiBVbnBhY2sgYW5kIGRlbGl2ZXIgKi8KKyAgICBfYmNtdHJfbXNnX3VucGFjayhjb25uLCAmcnhfYnVmLCAmaGRyLCB0cywgJm1zZyk7CisKKyAgICBiY21vbHRfYnVmX2ZyZWUoJnJ4X2J1Zik7CisKKyAgICBpZiAobXNnKQorICAgIHsKKyAgICAgICAgbXNnLT5jb3JyX3RhZyA9IGNvcnJfdGFnOworICAgICAgICBtc2ctPnN1YmNoID0gc3ViY2g7CisgICAgICAgIGgtPmFwcF9jYihjb25uLT5kZXZpY2UsIG1zZyk7CisgICAgfQorfQorCisvKiBIYW5kbGUgcnggZGF0YS4gUmV0dXJucyBudW1iZXIgb2YgbWVzc2FnZXMgdGhhdCB3YXMgaWRlbnRpZmllZCBhbmQgcmVhc3NlbWJsZWQuIENhbiBiZSAwIG9yIDEgKi8KK3N0YXRpYyBpbnQgX2JjbXRyX3J4X3BhY2tldChiY210cl9jb25uICpjb25uLCBiY21vbHRfc3ViY2hhbm5lbCBzdWJjaCwgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGJjbXRyX2hkciBoZHI7CisgICAgYmNtdHJfbXNnICp0bXNnOworICAgIGJjbW9zX2Jvb2wgbXNnX2RvbmU7CisgICAgYmNtb3NfYm9vbCBpc19yZXNwb25zZTsKKworICAgIC8qIFRyYW5zcG9ydCBsb2NrLiBUaGlzIGxvY2sgaXMgbmVlZGVkIHRvCisgICAgICogLSBhbGxvY2F0ZS9yZWxlYXNlIHRyYW5zcG9ydCBoZWFkZXIKKyAgICAgKiAtIHVwZGF0ZSBzdGF0aXN0aWNzCisgICAgICovCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmY29ubi0+bXV0ZXgpOworCisgICAgLyogSWYgc29tZSBkYXRhIHdhcyByZWNlaXZlZCAtIGhhbmRsZSBpdCAqLworICAgIGlmIChidWYtPmxlbiA8IEJDTVRSX0hEUl9TSVpFKQorICAgIHsKKyAgICAgICAgLyogTWVzc2FnZSBpcyB0b28gc2hvcnQgKi8KKyAgICAgICAgKytjb25uLT5zdGF0Lm1zZ19jb21tX2VycjsKKyAgICAgICAgZ290byByeF9mcmVlX2J1Zl9hbmRfZXJyb3JfZXhpdDsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBidWYtPmN1cnIpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkludmFsaWQgYnVmZmVyIHJlY2VpdmVkIVxuIik7CisgICAgICAgIGdvdG8gcnhfZG9uZTsKKyAgICB9CisKKyAgICBiY210cl9oZWFkZXJfdW5wYWNrKGJ1Zi0+Y3VyciwgJmhkcik7CisgICAgYmNtb2x0X2J1Zl9za2lwKGJ1ZiwgQkNNVFJfSERSX1NJWkUpOworICAgIGlzX3Jlc3BvbnNlID0gKGhkci5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UpOworCisgICAgLyogRmluZCB0cmFuc3BvcnQgaGVhZGVyLiBJZiBub3QgZm91bmQgLSBhbGxvY2F0ZSBuZXcgZm9yIGF1dG9ub21vdXMgbWVzc2FnZSAqLworICAgIHRtc2cgPSBfYmNtdHJfbXNnX2dldF9ieV9jb3JyX3RhZyhjb25uLCAmaGRyKTsKKyAgICBpZiAoIXRtc2cpCisgICAgeworICAgICAgICBpZiAoIWlzX3Jlc3BvbnNlKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBBbGxvY2F0ZSBuZXcgdHJhbnNwb3J0IGJsb2NrICovCisgICAgICAgICAgICB0bXNnID0gX2JjbXRyX21zZ19nZXRfZnJlZSgmY29ubi0+ZnJlZV9hdXRvX2xpc3QpOworICAgICAgICAgICAgaWYgKCF0bXNnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrY29ubi0+c3RhdC5tc2dfdG9vX21hbnlfYXV0bzsKKyAgICAgICAgICAgICAgICBnb3RvIHJ4X2ZyZWVfYnVmX2FuZF9lcnJvcl9leGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1zZy0+ZXJyID0gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKyAgICAgICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZjb25uLT5tc2dfbGlzdCwgdG1zZywgbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZXNwb25zZSwgYnV0IG5vIHJlcXVlc3QgLSBkaXNjYXJkICovCisgICAgICAgICAgICArK2Nvbm4tPnN0YXQubXNnX25vX3JlcTsKKyAgICAgICAgICAgIEJDTVRSX0NMRF9DSEVDS19OT1RJRlkoY29ubi0+ZGV2aWNlLCAmaGRyLCBCQ01UUl9DTERfRVZfUkVDVl9ESVNDQVJELAorICAgICAgICAgICAgICAgIGJjbW9zX3RpbWVzdGFtcCgpLCBidWYtPmN1cnIsIGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZiksIE5VTEwpOworICAgICAgICAgICAgZ290byByeF9mcmVlX2J1Zl9hbmRfZXJyb3JfZXhpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlYXNzZW1ibGUuICJidWYiIHNob3VsZCBub3QgYmUgdXNlZCBmb2xsb3dpbmcgdGhpcyBjYWxsICovCisgICAgdG1zZy0+aGRyID0gaGRyOworICAgIHRtc2ctPnN1YmNoID0gc3ViY2g7CisgICAgbXNnX2RvbmUgPSBfYmNtdHJfcmVhc3NlbWJsZShjb25uLCB0bXNnLCBidWYpOworCisgICAgLyogSWYgZXhwZWN0cyBtb3JlIHBhcnRzIC0gbm90aGluZyBtb3JlIHRvIGRvIGhlcmUgKi8KKyAgICBpZiAoIW1zZ19kb25lKQorICAgICAgICBnb3RvIHJ4X2RvbmU7CisKKyAgICBpZiAodG1zZy0+ZXJyICYmICFpc19yZXNwb25zZSkKKyAgICB7CisgICAgICAgIF9iY210cl90bXNnX2ZyZWUodG1zZywgJmNvbm4tPm1zZ19saXN0KTsKKyAgICAgICAgZ290byByeF9kb25lOworICAgIH0KKworICAgIC8qIERvbmUgd2l0aCB0aGUgbWVzc2FnZS4gR2V0IGl0IG91dCBvZiBwZW5kaW5nIG1lc3NhZ2UgcXVldWUgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24KKyAgICAgKiB3aGVuIHRpbWVvdXQgaGFwcGVucyB3aGlsZSB0aGUgbWVzc2FnZSBpcyBpbiBmbGlnaHQgdG8gdGhlIGRlc3RpbmF0aW9uIHRhc2suCisgICAgICovCisgICAgVEFJTFFfUkVNT1ZFKCZjb25uLT5tc2dfbGlzdCwgdG1zZywgbCk7CisKKyAgICAvKiBOb3RpZnkgcnguIGNvbm4tPm11dGV4IGlzIHN0aWxsIHRha2VuLiBJdCB3aWxsIGJlIHJlbGVhc2VkCisgICAgICAgaW5zaWRlIF9iY210cl9ub3RpZnlfcnhfcmVzcG9uc2UoKSwgX2JjbXRyX25vdGlmeV9yeF9yZXFfYXV0bygpICovCisgICAgdG1zZy0+dGltZXN0YW1wID0gYmNtb3NfdGltZXN0YW1wKCk7CisgICAgaWYgKGlzX3Jlc3BvbnNlKQorICAgIHsKKyAgICAgICAgX2JjbXRyX25vdGlmeV9yeF9yZXNwb25zZShjb25uLCB0bXNnKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX2JjbXRyX25vdGlmeV9yeF9yZXFfYXV0byhjb25uLCB0bXNnKTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKKworICAgIC8qIEVycm9yIHJldHVybiAqLworcnhfZnJlZV9idWZfYW5kX2Vycm9yX2V4aXQ6CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uLT5tdXRleCk7CisgICAgYmNtb2x0X2J1Zl9mcmVlKGJ1Zik7CisgICAgcmV0dXJuIDA7CisKKyAgICAvKiByZXR1cm4gd2l0aG91dCBhIGJ1ZmZlciAqLworcnhfZG9uZToKKyAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIExvdy1sZXZlbCBmcmFnbWVudCBhbmQgc2VuZCBmdW5jdGlvbi4KKyAqIEl0IGFsbG9jYXRlcyBhIHNlcmllcyBvZiBidWZmZXJzIHVwIHRvIE1BWF9NVFUgc2l6ZSwgY29waWVzIG9yaWdpbmFsIGRhdGEgaW50byB0aGVtIGFuZCBzZW5kcy4KKyAqIFRoZSBvcmlnaW5hbCBidWZmZXIgc3RheXMgaW50YWN0IC0gaW4gY2FzZSBpdCBzaG91bGQgYmUgcmV0cmFuc21pdHRlZAorICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2ZyYWdtZW50X2FuZF9zZW5kKGJjbXRyX2Nvbm4gKmNvbm4sIGJjbXRyX21zZyAqdG1zZywgYmNtdHJfc2VuZF9mbGFncyBmbGFncykKK3sKKyAgICB1aW50MzJfdCBmcmFnX251bWJlciA9IDA7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICB1aW50MzJfdCBkYXRhX29mZnNldCA9IGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tICsgQkNNVFJfSERSX1NJWkU7CisgICAgdWludDMyX3QgZGF0YV9sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZ0bXNnLT50eF9idWYpIC0gZGF0YV9vZmZzZXQ7CisgICAgdWludDhfdCAqZGF0YSA9IHRtc2ctPnR4X2J1Zi5zdGFydCArIGRhdGFfb2Zmc2V0OworCisgICAgZG8KKyAgICB7CisgICAgICAgIHVpbnQzMl90IHNlbmRfbGVuID0gZGF0YV9sZW4gKyBCQ01UUl9IRFJfU0laRTsKKyAgICAgICAgYmNtb2x0X2J1ZiBmcmFnOworCisgICAgICAgIGlmIChzZW5kX2xlbiA+IGNvbm4tPmNmZy5tYXhfbXR1KQorICAgICAgICB7CisgICAgICAgICAgICBzZW5kX2xlbiA9IGNvbm4tPmNmZy5tYXhfbXR1OworICAgICAgICAgICAgdG1zZy0+aGRyLm1vcmVfZnJhZ21lbnRzID0gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtc2ctPmhkci5tb3JlX2ZyYWdtZW50cyA9IEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gYmNtb2x0X2J1Zl9hbGxvYygmZnJhZywgc2VuZF9sZW4gKyBjb25uLT5jZmcucGx1Z2luX2NmZy5oZWFkcm9vbSwgQkNNVFJfQlVGX0VORElBTik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICB0bXNnLT5oZHIuZnJhZ19udW1iZXIgPSBmcmFnX251bWJlcisrOworCisgICAgICAgIC8qIFBhY2sgY29ycmVsYXRpb24gdGFnLCBjb21tYW5kIGFuZCBsZW5ndGggKi8KKyAgICAgICAgYmNtdHJfaGVhZGVyX3BhY2soJnRtc2ctPmhkciwgZnJhZy5zdGFydCArIGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9za2lwKCZmcmFnLCBkYXRhX29mZnNldCk7CisgICAgICAgIGlmIChiY21vbHRfYnVmX3dyaXRlKCZmcmFnLCBkYXRhLCBzZW5kX2xlbiAtIEJDTVRSX0hEUl9TSVpFKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2VuZCB1c2luZyBjdXN0b21lci1wcm92aWRlZCBkcml2ZXIgKi8KKyAgICAgICAgICAgIGVyciA9IGNvbm4tPmRyaXZlci5zZW5kKGNvbm4tPmRydl9wcml2LCB0bXNnLT5tc2ctPnN1YmNoLCAmZnJhZywgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICAgICAgfQorICAgICAgICBiY21vbHRfYnVmX2ZyZWUoJmZyYWcpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGFfbGVuIC09IChzZW5kX2xlbiAtIEJDTVRSX0hEUl9TSVpFKTsKKyAgICAgICAgZGF0YSArPSAoc2VuZF9sZW4gLSBCQ01UUl9IRFJfU0laRSk7CisKKyAgICB9IHdoaWxlIChkYXRhX2xlbik7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKiBDaGVjayBmb3IgdGltZS1vdXRzLiByZXR1cm5zIG51bWJlciBvZiBtZXNzYWdlcyB0aW1lZCBvdXQgKi8KK3N0YXRpYyBpbnQgX2JjbXRyX2NoZWNrX3RpbWVvdXQoYmNtdHJfY29ubiAqY29ubikKK3sKKyAgICBiY210cl9tc2cgKnRtc2csICp0bXA7CisgICAgdWludDMyX3Qgbm93OworICAgIGludCBubXNnID0gMDsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICAvKiBUcmFuc3BvcnQgbG9jayAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmNvbm4tPm11dGV4KTsKKworICAgIG5vdyA9IGJjbW9zX3RpbWVzdGFtcCgpOworICAgIFRBSUxRX0ZPUkVBQ0hfU0FGRSh0bXNnLCAmY29ubi0+bXNnX2xpc3QsIGwsIHRtcCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2cgKm1zZyA9IHRtc2ctPm1zZzsKKworICAgICAgICBpZiAobm93IC0gdG1zZy0+dGltZXN0YW1wIDw9IGNvbm4tPmNmZy5tc2dfdGltZW91dCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIFJldHJhbnNtaXQgPyAqLworICAgICAgICBpZiAobXNnICYmIHRtc2ctPnR4X2NvdW50IDw9IGNvbm4tPmNmZy5tYXhfcmV0cmllcykKKyAgICAgICAgeworICAgICAgICAgICAgdG1zZy0+dGltZXN0YW1wID0gYmNtb3NfdGltZXN0YW1wKCk7CisgICAgICAgICAgICBCQ01UUl9DTERfQ0hFQ0tfTk9USUZZKAorICAgICAgICAgICAgICAgIGNvbm4tPmRldmljZSwKKyAgICAgICAgICAgICAgICAmdG1zZy0+aGRyLAorICAgICAgICAgICAgICAgIEJDTVRSX0NMRF9FVl9SRVNFTkQsCisgICAgICAgICAgICAgICAgdG1zZy0+dGltZXN0YW1wLAorICAgICAgICAgICAgICAgIHRtc2ctPnR4X2J1Zi5zdGFydCArIGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tICsgQkNNVFJfSERSX1NJWkUsCisgICAgICAgICAgICAgICAgdG1zZy0+dHhfYnVmLmxlbiAtIChjb25uLT5jZmcucGx1Z2luX2NmZy5oZWFkcm9vbSArIEJDTVRSX0hEUl9TSVpFKSwKKyAgICAgICAgICAgICAgICBtc2cpOworCisgICAgICAgICAgICAvKiBGcmFnbWVudCBhbmQgc2VuZCBvciBzZW5kIGRpcmVjdGx5LCBkZXBlbmRpbmcgb24gbWVzc2FnZSBsZW5ndGggKi8KKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZ0bXNnLT50eF9idWYpID4gY29ubi0+Y2ZnLm1heF9tdHUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gX2JjbXRyX2ZyYWdtZW50X2FuZF9zZW5kKGNvbm4sIHRtc2csIEJDTVRSX1NFTkRfRkxBR1NfUFJJX05PUk1BTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gY29ubi0+ZHJpdmVyLnNlbmQoY29ubi0+ZHJ2X3ByaXYsIG1zZy0+c3ViY2gsICZ0bXNnLT50eF9idWYsIEJDTVRSX1NFTkRfRkxBR1NfUFJJX05PUk1BTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrY29ubi0+c3RhdC5tc2dfY29tbV9lcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3Rtc2ctPnR4X2NvdW50OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBHaXZpbmcgdXAgKi8KKyAgICAgICAgLyogUmVsZWFzZSB3YWl0aW5nIHRhc2sgaWYgcmVxdWVzdC1yZXNwb25zZSAtIHVubGVzcyBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgKi8KKyAgICAgICAgaWYgKG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRtc2ctPmVyciA9PSBCQ01fRVJSX0lOX1BST0dSRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtc2ctPmVyciA9IEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJDTVRSX0NMRF9DSEVDS19OT1RJRlkoCisgICAgICAgICAgICAgICAgY29ubi0+ZGV2aWNlLAorICAgICAgICAgICAgICAgICZ0bXNnLT5oZHIsCisgICAgICAgICAgICAgICAgQkNNVFJfQ0xEX0VWX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgYmNtb3NfdGltZXN0YW1wKCksCisgICAgICAgICAgICAgICAgdG1zZy0+dHhfYnVmLnN0YXJ0ICsgY29ubi0+Y2ZnLnBsdWdpbl9jZmcuaGVhZHJvb20gKyBCQ01UUl9IRFJfU0laRSwKKyAgICAgICAgICAgICAgICB0bXNnLT50eF9idWYubGVuIC0gKGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tICsgQkNNVFJfSERSX1NJWkUpLAorICAgICAgICAgICAgICAgIG1zZyk7CisgICAgICAgICAgICBUQUlMUV9SRU1PVkUoJmNvbm4tPm1zZ19saXN0LCB0bXNnLCBsKTsKKyAgICAgICAgICAgIF9iY210cl9ub3RpZnlfcmVhZHkoY29ubiwgdG1zZyk7CisgICAgICAgICAgICArK2Nvbm4tPnN0YXQubXNnX3JlcV90aW1lb3V0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX2JjbXRyX3Rtc2dfZnJlZSh0bXNnLCAmY29ubi0+bXNnX2xpc3QpOworICAgICAgICAgICAgKytjb25uLT5zdGF0Lm1zZ19yZWFzc190aW1lb3V0OworICAgICAgICB9CisgICAgICAgICsrbm1zZzsKKyAgICB9CisgICAgY29ubi0+bGFzdF90aW1lb3V0X2NoZWNrID0gYmNtb3NfdGltZXN0YW1wKCk7CisKKyAgICAvKiBSZWxlYXNlIHRyYW5zcG9ydCBsb2NrICovCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uLT5tdXRleCk7CisKKyAgICByZXR1cm4gbm1zZzsKK30KKworLyogQ2hlY2sgZm9yIHJlY2VpdmUgYW5kIHRpbWVvdXRzICovCitzdGF0aWMgaW50IF9iY210cl9yeF9wb2xsKGJjbXRyX2Nvbm4gKmNvbm4sIGludCAqcG5tc2cpCit7CisgICAgYmNtb2x0X2J1ZiBidWY7CisgICAgaW50IG5tc2cgPSAwLCBubXNnX3ByZXY7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9zdWJjaGFubmVsIHN1YmNoOworCisgICAgZG8KKyAgICB7CisgICAgICAgIG5tc2dfcHJldiA9IG5tc2c7CisKKyAgICAgICAgLyogUGx1Z2luIGRyaXZlcidzIHJlY3YgLSBnZXQgcGVuZGluZyByeCBwYWNrZXQgaXMgYW55LgorICAgICAgICAgKiBUaGUgZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQgdG8gYmxvY2sgZm9yIG1vcmUgdGhlbiBCQ01UUl9NU0dfVElNRU9VVCBtcworICAgICAgICAgKi8KKyAgICAgICAgcmMgPSBjb25uLT5kcml2ZXIucmVjdihjb25uLT5kcnZfcHJpdiwgJnN1YmNoLCAmYnVmKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX05PTUVNKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrY29ubi0+c3RhdC5tc2dfbm9fbWVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm1zZyArPSBfYmNtdHJfcnhfcGFja2V0KGNvbm4sIHN1YmNoLCAmYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGZvciB0aW1lb3V0cyBpZiBhbnkgKi8KKyAgICAgICAgaWYgKGJjbW9zX3RpbWVzdGFtcCgpIC0gY29ubi0+bGFzdF90aW1lb3V0X2NoZWNrID4gY29ubi0+dGltZW91dF9jaGVja19wZXJpb2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENoZWNrIHJlcXVlc3RzIHdhaXRpbmcgZm9yIGFja25vd2xlZGdlIGFuZCBtdWx0eS1wYXJ0IG1lc3NhZ2VzIGZvciB0aW1lb3V0LgorICAgICAgICAgICAgICogVGltZWQtb3V0IHJlcXVlc3RzIGFyZSByZXRyYW5zbWl0dGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBubXNnICs9IF9iY210cl9jaGVja190aW1lb3V0KGNvbm4pOworICAgICAgICB9CisgICAgfSB3aGlsZShubXNnX3ByZXYgIT0gbm1zZyk7CisKKyAgICAqcG5tc2cgPSBubXNnOworCisgICAgcmV0dXJuIHJjOworfQorCisvKiBSeCB0aHJlYWQgaGFuZGxlciAqLworc3RhdGljIGludCBfYmNtdHJfcnhfdGhyZWFkX2hhbmRsZXIobG9uZyBhcmcpCit7CisgICAgYmNtdHJfY29ubiAqY29ubiA9IChiY210cl9jb25uICopYXJnOworICAgIGludCBubXNnczsKKyAgICBpbnQgcmM7CisKKyAgICB3aGlsZSghY29ubi0+a2lsbF9yZXF1ZXN0KQorICAgIHsKKyAgICAgICAgcmMgPSBfYmNtdHJfcnhfcG9sbChjb25uLCAmbm1zZ3MpOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9DT01NX0ZBSUwpCisgICAgICAgICAgICBiY21vc191c2xlZXAoMTAwMCk7CisgICAgfQorICAgIGNvbm4tPmtpbGxfZG9uZSA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEludGVybmFsIHRyYW5zcG9ydCBpbnRlcmZhY2UKKyAqLworCisKKy8qKiBEZWZhdWx0IG1lc3NhZ2UgaGFuZGxlciAtIGRpc2NhcmQgKi8KK3N0YXRpYyB2b2lkIF9iY210cl9kZnRfbXNnX2hhbmRsZXIoYmNtb2x0X2RldmlkIG9sdCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm4gPSBjb25uX2luZm9bb2x0XS5jb25uOworCisgICAgLyogVG9EbzogbG9nICovCisKKyAgICBpZiAoY29ubikKKyAgICAgICAgKytjb25uLT5zdGF0Lm5vX3J4X2hhbmRsZXI7CisKKyAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9iY210cl9jcmVhdGVfcnhfdGhyZWFkKGJjbXRyX2Nvbm4gKmNvbm4sIGJjbW9zX2Jvb2wgcmF3X21vZGUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIGlmIChjb25uLT5jZmcucnhfdGhyZWFkX3ByaW9yaXR5ID49IDAgJiYgIXJhd19tb2RlKQorICAgIHsKKyAgICAgICAgYmNtb3NfdGFza19wYXJtIHBhcm0gPSB7CisgICAgICAgICAgICAucHJpb3JpdHkgPSBjb25uLT5jZmcucnhfdGhyZWFkX3ByaW9yaXR5LAorICAgICAgICAgICAgLnN0YWNrX3NpemUgPSBCQ01UUl9SWF9USFJFQURfU1RBQ0ssCisgICAgICAgICAgICAuaGFuZGxlciA9IF9iY210cl9yeF90aHJlYWRfaGFuZGxlciwKKyAgICAgICAgICAgIC5uYW1lID0gY29ubi0+bmFtZSwKKyAgICAgICAgICAgIC5kYXRhID0gKGxvbmcpY29ubgorICAgICAgICB9OworICAgICAgICBjb25uLT5raWxsX3JlcXVlc3QgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgY29ubi0+a2lsbF9kb25lID0gQkNNT1NfRkFMU0U7CisgICAgICAgIGVyciA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZjb25uLT5yeF90aHJlYWQsICZwYXJtKTsKKyAgICAgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgY29ubi0+cnhfdGhyZWFkX2NyZWF0ZWQgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9iY210cl9kZXN0cm95X3J4X3RocmVhZChiY210cl9jb25uICpjb25uKQoreworICAgIC8qIEtpbGwgcnggdGhyZWFkIGlmIGFueSAqLworICAgIGlmIChjb25uLT5yeF90aHJlYWRfY3JlYXRlZCkKKyAgICB7CisgICAgICAgIGNvbm4tPmtpbGxfcmVxdWVzdCA9IDE7CisgICAgICAgIHdoaWxlKCFjb25uLT5raWxsX2RvbmUpCisgICAgICAgICAgICBiY21vc191c2xlZXAoMTAwMCk7CisgICAgICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmY29ubi0+cnhfdGhyZWFkKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cl9jb25uICoqcGNvbm4sIGJjbW9zX2Jvb2wgcmF3X21vZGUpCit7CisgICAgYmNtdHJfY29ubiAqY29ubjsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogSW5pdCBPUyBhYnN0cmFjdGlvbiAtIGp1c3QgaW4gY2FzZSAqLworICAgIGVyciA9IGJjbW9zX2luaXQoKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0sgJiYgZXJyICE9IEJDTV9FUlJfQUxSRUFEWSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmY29ubl9sb2NrKTsKKworICAgIC8qIEFsbG9jYXRlICovCisgICAgY29ubiA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKmNvbm4pKTsKKyAgICBpZiAoIWNvbm4pCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm5fbG9jayk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIC8qIEdldCBjb25maWd1cmF0aW9uICovCisgICAgZXJyID0gYmNtdHJfY2ZnX2dldChkZXZpY2UsICZjb25uLT5jZmcsICZjb25uLT5kcml2ZXIpOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm5fbG9jayk7CisgICAgICAgIGJjbW9zX2ZyZWUoY29ubik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc25wcmludGYoY29ubi0+bmFtZSwgc2l6ZW9mKGNvbm4tPm5hbWUpLCAidHJfcngldSIsIGRldmljZSk7CisgICAgVEFJTFFfSU5JVCgmY29ubi0+ZnJlZV9yZXFfbGlzdCk7CisgICAgVEFJTFFfSU5JVCgmY29ubi0+ZnJlZV9hdXRvX2xpc3QpOworICAgIFRBSUxRX0lOSVQoJmNvbm4tPm1zZ19saXN0KTsKKyAgICBiY21vc19tdXRleF9jcmVhdGUoJmNvbm4tPm11dGV4LCAwLCBOVUxMKTsKKworICAgIC8qIENvbnZlcnQgdGltZW91dHMgdG8gdXMgKi8KKyAgICBjb25uLT5jZmcubXNnX3RpbWVvdXQgKj0gMTAwMDsKKyAgICBjb25uLT5jZmcubXNnX3JlYWR5X3RpbWVvdXQgKj0gMTAwMDsKKyAgICBjb25uLT5jZmcubXNnX3dhaXRfdGltZW91dCAqPSAxMDAwOworCisgICAgLyogU2V0IGRlZmF1bHRzICovCisgICAgY29ubi0+dGltZW91dF9jaGVja19wZXJpb2QgPSBjb25uLT5jZmcubXNnX3dhaXRfdGltZW91dDsKKyAgICBjb25uLT5sYXN0X3RpbWVvdXRfY2hlY2sgPSBiY21vc190aW1lc3RhbXAoKTsKKworICAgIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRyYW5zcG9ydCBibG9ja3MgYW5kIHB1dCBvbnRvIGZyZWUgcmVxdWVzdCBhbmQgYXV0b25vbW91cyBsaXN0cyAqLworICAgIGVyciA9IF9iY210cl90bXNnX2xpc3RfYWxsb2MoY29ubik7CisKKyAgICAvKiBPcGVuL2Nvbm5lY3Qgb24gZHJpdmVyIGxldmVsICovCisgICAgZXJyID0gZXJyID8gZXJyIDogY29ubi0+ZHJpdmVyLm9wZW4oZGV2aWNlLCAmY29ubi0+Y2ZnLnBsdWdpbl9jZmcsICZjb25uLT5kcnZfcHJpdik7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmNvbm4tPm11dGV4KTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIGNvbm4tPmNvbm5lY3RlZCA9IEJDTU9TX1RSVUU7CisKKyAgICAvKiBDcmVhdGUgcnggdGhyZWFkIGlmIG5lY2Vzc2FyeSAqLworICAgIGVyciA9IF9iY210cl9jcmVhdGVfcnhfdGhyZWFkKGNvbm4sIHJhd19tb2RlKTsKKyAgICBpZiAoZXJyKQorICAgIHsKKyAgICAgICAgY29ubi0+ZHJpdmVyLmNsb3NlKGNvbm4tPmRydl9wcml2KTsKKyAgICAgICAgYmNtb3NfbXV0ZXhfZGVzdHJveSgmY29ubi0+bXV0ZXgpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIGNvbm4tPmRldmljZSA9IGRldmljZTsKKworICAgICpwY29ubiA9IGNvbm47CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uX2xvY2spOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKK2NsZWFudXA6CisgICAgX2JjbXRyX3Rtc2dfbGlzdF9mcmVlKGNvbm4pOworICAgIGJjbW9zX2ZyZWUoY29ubik7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uX2xvY2spOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKiBRdWVyeSB3aGV0aGVyIG9yIG5vdCB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2lzX2Nvbm5lY3RlZChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19ib29sICppc19jb25uZWN0ZWQpCit7CisgICAgYmNtdHJfY29ubiAqY29ubjsKKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorICAgIGNvbm4gPSBjb25uX2luZm9bZGV2aWNlXS5jb25uOworICAgICppc19jb25uZWN0ZWQgPSAoY29ubiAhPSBOVUxMICYmIGNvbm4tPmNvbm5lY3RlZCk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBPcGVuIHRyYW5zcG9ydCBjaGFubmVsICovCitiY21vc19lcnJubyBiY210cl9jb25uZWN0KGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtdHJfY29ubiAqY29ubjsKKyAgICByZXR1cm4gX2JjbXRyX2Nvbm5fZ2V0KGRldmljZSwgJmNvbm4pOworfQorCisvKiogQ2xvc2UgdHJhbnNwb3J0IGNoYW5uZWwgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2Rpc2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY210cl9jb25uICpjb25uOworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKyAgICBiY21vc19tdXRleF9sb2NrKCZjb25uX2xvY2spOworICAgIGNvbm4gPSBjb25uX2luZm9bZGV2aWNlXS5jb25uOworICAgIGlmICghY29ubikKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubl9sb2NrKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX0NPTk5FQ1RFRDsKKyAgICB9CisgICAgY29ubl9pbmZvW2RldmljZV0uY29ubiA9IE5VTEw7CisKKyAgICAvKiBLaWxsIHJ4IHRocmVhZCBpZiBhbnkgKi8KKyAgICBfYmNtdHJfZGVzdHJveV9yeF90aHJlYWQoY29ubik7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZjb25uLT5tdXRleCk7CisgICAgLyogQ2xvc2UgY29ubmVjdGlvbiAqLworICAgIGlmIChjb25uLT5kcml2ZXIuY2xvc2UpCisgICAgeworICAgICAgICBjb25uLT5kcml2ZXIuY2xvc2UoY29ubi0+ZHJ2X3ByaXYpOworICAgIH0KKworICAgIC8qIFJlbGVhc2UgYWxsIHBlbmRpbmcgbWVzc2FnZXMgKi8KKyAgICBiY21vc191c2xlZXAoMTAwMDAwKTsKKyAgICBfYmNtdHJfdG1zZ19saXN0X2ZyZWUoY29ubik7CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKyAgICBiY21vc19tdXRleF9kZXN0cm95KCZjb25uLT5tdXRleCk7CisgICAgYmNtb3NfZnJlZShjb25uKTsKKworICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubl9sb2NrKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBMb3ctbGV2ZWwgZGlzY29ubmVjdCB0aGF0IGJyZWFrcyAicGh5c2ljYWwiIGNvbm5lY3Rpb24sIGJ1dCBkb2Vzbid0IGRlc3Ryb3kgY29ubmVjdGlvbiBzdHJ1Y3R1cmUgYW5kIHJlZ2lzdHJhdGlvbnMgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2RyaXZlcl9kaXNjb25uZWN0KGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtdHJfY29ubiAqY29ubjsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIGJjbW9zX211dGV4X2xvY2soJmNvbm5fbG9jayk7CisKKyAgICBjb25uID0gY29ubl9pbmZvW2RldmljZV0uY29ubjsKKyAgICBpZiAoY29ubiA9PSBOVUxMIHx8ICFjb25uLT5jb25uZWN0ZWQpCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm5fbG9jayk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgX2JjbXRyX2Rlc3Ryb3lfcnhfdGhyZWFkKGNvbm4pOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmY29ubi0+bXV0ZXgpOworCisgICAgLyogQ2xvc2UgZHJpdmVyIGNvbm5lY3Rpb24gKi8KKyAgICBpZiAoY29ubi0+ZHJpdmVyLmNsb3NlICE9IE5VTEwpCisgICAgeworICAgICAgICBlcnIgPSBjb25uLT5kcml2ZXIuY2xvc2UoY29ubi0+ZHJ2X3ByaXYpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiRmFpbGVkIHRvIGNsb3NlIHRyYW5zcG9ydCBkcml2ZXI6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKGVyciksIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25uLT5jb25uZWN0ZWQgPSBCQ01PU19GQUxTRTsKKworICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubi0+bXV0ZXgpOworCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uX2xvY2spOworCisgICAgcmV0dXJuIGVycjsKK30KKworLyogUmVwYWlyL3JlY29ubmVjdCB0aGUgZHJpdmVyLWxldmVsIGNvbm5lY3Rpb24gZm9yIGFuIGFscmVhZHktY29ubmVjdGVkIGRldmljZSAqLworYmNtb3NfZXJybm8gYmNtdHJfZHJpdmVyX3JlY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm47CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKyAgICBiY21vc19tdXRleF9sb2NrKCZjb25uX2xvY2spOworICAgIGNvbm4gPSBjb25uX2luZm9bZGV2aWNlXS5jb25uOworICAgIGlmIChjb25uID09IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm5fbG9jayk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgaWYgKGNvbm4tPmNvbm5lY3RlZCkKKyAgICB7CisgICAgICAgIGJjbXRyX2RyaXZlcl9kaXNjb25uZWN0KGRldmljZSk7CisgICAgfQorICAgIGJjbW9zX211dGV4X2xvY2soJmNvbm4tPm11dGV4KTsKKworICAgIC8qIFJlLW9wZW4gZHJpdmVyIGNvbm5lY3Rpb24gKi8KKyAgICBlcnIgPSBjb25uLT5kcml2ZXIub3BlbihkZXZpY2UsICZjb25uLT5jZmcucGx1Z2luX2NmZywgJmNvbm4tPmRydl9wcml2KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkZhaWxlZCB0byByZS1vcGVuIHRyYW5zcG9ydCBkcml2ZXI6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKGVyciksIGVycik7CisgICAgfQorCisgICAgZXJyID0gX2JjbXRyX2NyZWF0ZV9yeF90aHJlYWQoY29ubiwgQkNNT1NfRkFMU0UpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSBSWCB0cmFuc3BvcnQgdGFzazogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSwgZXJyKTsKKyAgICAgICAgY29ubi0+ZHJpdmVyLmNsb3NlKGNvbm4tPmRydl9wcml2KTsKKyAgICB9CisgICAgY29ubi0+Y29ubmVjdGVkID0gQkNNT1NfVFJVRTsKKworICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubi0+bXV0ZXgpOworCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uX2xvY2spOworCisgICAgcmV0dXJuIGVycjsKK30KKworLyogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiB0aGF0IHRyYW5zbWl0IGZhaWxlZCBiZWNhdXNlIHR4X3F1ZXVlIHdhcyBmdWxsICovCitiY21vc19lcnJubyBiY210cl90eF9vdmVyZmxvd19jYl9yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBGX2JjbXRyX3R4X292ZXJmbG93IGNiKQoreworICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBjb25uX2luZm9bZGV2aWNlXS5vdmVyZmxvd19jYiA9IGNiOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBTZW5kIG1lc3NhZ2UuCisgKiBJbnRlcm5hbCBmdW5jdGlvbi4gQ2FsbGVkIHVuZGVyIGNvbm5lY3Rpb24gbG9jaworICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX3NlbmQoYmNtdHJfY29ubiAqY29ubiwgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfYnVmICp0eF9idWYsIGJjbXRyX3NlbmRfZmxhZ3MgZmxhZ3MsIGJjbXRyX21zZyAqKnB0bXNnKQoreworICAgIGJjbXRyX21zZyAqdG1zZzsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBpZiAoIWNvbm4tPmNvbm5lY3RlZCkKKyAgICB7CisgICAgICAgICsrY29ubi0+c3RhdC5ub3RfY29ubmVjdGVkOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfQ09OTkVDVEVEOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIG1lc3NhZ2UgdHJhbnNwb3J0IGhlYWRlciAqLworICAgIHRtc2cgPSBfYmNtdHJfbXNnX2dldF9mcmVlKCZjb25uLT5mcmVlX3JlcV9saXN0KTsKKyAgICBpZiAoIXRtc2cpCisgICAgeworICAgICAgICArK2Nvbm4tPnN0YXQubXNnX25vX21lbTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfVE9PX01BTllfUkVRUzsKKyAgICB9CisgICAgdG1zZy0+bXNnID0gbXNnOworCisgICAgLyogRmlsbCB0cmFuc3BvcnQgaGVhZGVyICovCisgICAgZXJyID0gYmNtdHJfaGVhZGVyX2ZpbGwodG1zZy0+bXNnLCAmdG1zZy0+aGRyKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgdG1zZy0+ZXJyID0gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKyAgICB0bXNnLT50eF9jb3VudCA9IDE7CisKKyAgICAvKiBTYXZlIHRyYW5zbWl0IGJ1ZmZlci4gSXQgd2lsbCBiZSByZWxlYXNlZCB0b2dldGhlciB3aXRoIHRyYW5zcG9ydCBoZWFkZXIgKi8KKyAgICB0bXNnLT50eF9idWYgPSAqdHhfYnVmOworCisgICAgdG1zZy0+dGltZXN0YW1wID0gYmNtb3NfdGltZXN0YW1wKCk7CisKKyAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCh0eF9idWYpID4gY29ubi0+Y2ZnLm1heF9tdHUpCisgICAgeworICAgICAgICBlcnIgPSBfYmNtdHJfZnJhZ21lbnRfYW5kX3NlbmQoY29ubiwgdG1zZywgZmxhZ3MpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBQYWNrIGNvcnJlbGF0aW9uIHRhZywgY29tbWFuZCBhbmQgbGVuZ3RoICovCisgICAgICAgIGJjbXRyX2hlYWRlcl9wYWNrKCZ0bXNnLT5oZHIsIHRtc2ctPnR4X2J1Zi5zdGFydCArIGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tKTsKKworICAgICAgICAvKiBTZW5kIHVzaW5nIGN1c3RvbWVyLXByb3ZpZGVkIGRyaXZlciAqLworICAgICAgICBlcnIgPSBjb25uLT5kcml2ZXIuc2VuZChjb25uLT5kcnZfcHJpdiwgbXNnLT5zdWJjaCwgJnRtc2ctPnR4X2J1ZiwgZmxhZ3MpOworICAgIH0KKyAgICBCQ01UUl9DTERfQ0hFQ0tfTk9USUZZKAorICAgICAgICBjb25uLT5kZXZpY2UsCisgICAgICAgICZ0bXNnLT5oZHIsCisgICAgICAgIEJDTVRSX0NMRF9FVl9TRU5ELAorICAgICAgICB0bXNnLT50aW1lc3RhbXAsCisgICAgICAgIHRtc2ctPnR4X2J1Zi5zdGFydCArIGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tICsgQkNNVFJfSERSX1NJWkUsCisgICAgICAgIHRtc2ctPnR4X2J1Zi5sZW4gLSAoY29ubi0+Y2ZnLnBsdWdpbl9jZmcuaGVhZHJvb20gKyBCQ01UUl9IRFJfU0laRSksCisgICAgICAgIG1zZyk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgKytjb25uLT5zdGF0Lm1zZ19jb21tX2VycjsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIHR4X2J1Zi0+c3RhcnQgPSBOVUxMOyAvKiBPd25lcnNoaXAgcGFzc2VkIHRvIHRtc2cgKi8KKyAgICArK2Nvbm4tPnN0YXQubXNnX3NlbnQ7CisKKyAgICBpZiAocHRtc2cpCisgICAgeworICAgICAgICAqcHRtc2cgPSB0bXNnOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfYmNtdHJfdG1zZ19mcmVlKHRtc2csIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworCisgICAgLyogZXJyb3IgKi8KK2NsZWFudXA6CisgICAgdG1zZy0+dHhfYnVmLnN0YXJ0ID0gTlVMTDsgLyogcHJldmVudCB0eCBidWZmZXIgZGUtYWxsb2NhdGlvbiAqLworICAgIF9iY210cl90bXNnX2ZyZWUodG1zZywgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworCisvKiBBbGxvY2F0ZSB0eCBidWZmZXIgYW5kIHBhY2sgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfcGFjayhjb25zdCBiY210cl9jb25uICpjb25uLCBiY21vbHRfbXNnICptc2csIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpbnQzMl90IGxlbiA9IGJjbW9sdF9tc2dfZ2V0X3BhY2tlZF9sZW5ndGgobXNnKTsKKyAgICB1aW50MzJfdCBoZWFkcm9vbSA9IGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gKGJjbW9zX2Vycm5vKWxlbjsKKworICAgIC8qIFJlYWxsb2NhdGUgaWYgdG9vIGJpZyAqLworICAgIGxlbiArPSBCQ01UUl9IRFJfU0laRSArIGhlYWRyb29tOworICAgIGlmIChidWYtPnN0YXJ0KQorICAgIHsKKyAgICAgICAgaWYgKGJ1Zi0+bGVuIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUb0RvOiByZWFsbG9jYXRlICovCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfaW5pdChidWYsIGxlbiwgYnVmLT5zdGFydCwgQkNNVFJfQlVGX0VORElBTik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyID0gYmNtb2x0X2J1Zl9hbGxvYyhidWYsIGxlbiwgQkNNVFJfQlVGX0VORElBTik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNlcnZlIHJvb20gZm9yIGhlYWRlciAqLworICAgIGJ1Zi0+Y3VyciA9IGJ1Zi0+c3RhcnQgKyBCQ01UUl9IRFJfU0laRSArIGhlYWRyb29tOworCisgICAgLyogUGFjayAqLworICAgIGVyciA9IGJjbW9sdF9tc2dfcGFjayhtc2csIGJ1Zik7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorICogRXh0ZXJuYWwgbWVzc2FnZSBpbnRlcmZhY2UKKyAqLworCisvKiBTZW5kIG1lc3NhZ2UuIERvbid0IGV4cGVjdCByZXNwb25zZS4gKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3NlbmQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY210cl9zZW5kX2ZsYWdzIGZsYWdzKQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm47CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9idWYgdHhfYnVmID0ge307CisKKyAgICBlcnIgPSBfYmNtdHJfY29ubl9nZXQoZGV2aWNlLCAmY29ubik7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIC8qIEFsbG9jYXRlIHRyYW5zcG9ydCBidWZmZXIgYW5kIHBhY2sgKi8KKyAgICBlcnIgPSBfYmNtdHJfcGFjayhjb25uLCBtc2csICZ0eF9idWYpOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21vbHRfYnVmX2ZyZWUoJnR4X2J1Zik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmY29ubi0+bXV0ZXgpOworICAgIGVyciA9IF9iY210cl9zZW5kKGNvbm4sIG1zZywgJnR4X2J1ZiwgZmxhZ3MsIE5VTEwpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubi0+bXV0ZXgpOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21vbHRfYnVmX2ZyZWUoJnR4X2J1Zik7CisgICAgICAgIGlmIChlcnIgPT0gQkNNX0VSUl9RVUVVRV9GVUxMICYmIGNvbm5faW5mb1tkZXZpY2VdLm92ZXJmbG93X2NiKQorICAgICAgICAgICAgY29ubl9pbmZvW2RldmljZV0ub3ZlcmZsb3dfY2IoY29ubi0+ZGV2aWNlLCBmbGFncyk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX2NhbGxfZXJyKGJjbW9sdF9tc2cgKm1zZywgYmNtb3NfZXJybm8gZXJyLCBjb25zdCBjaGFyICplcnJfdGV4dCkKK3sKKyAgICBtc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgIG1zZy0+ZXJyID0gZXJyOworICAgIGlmIChlcnJfdGV4dCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RybmNweShtc2ctPmVycl90ZXh0LCBlcnJfdGV4dCwgQkNNT0xUX01BWF9FUlJfVEVYVF9MRU5HVEgtMSk7CisgICAgICAgIG1zZy0+ZXJyX3RleHRbQkNNT0xUX01BWF9FUlJfVEVYVF9MRU5HVEgtMV0gPSAwOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCisvKiBTZW5kIG1lc3NhZ2UgYW5kIHdhaXQgZm9yIHJlc3BvbnNlICovCitiY21vc19lcnJubyBiY210cl9jYWxsKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBzdGF0aWMgdWludDMyX3QgY29ycl90YWcgPSAwOworICAgIGJjbW9zX3Rhc2sgKnRhc2s7CisgICAgYmNtdHJfbXNnICp0bXNnID0gTlVMTDsKKyAgICBiY210cl9jb25uICpjb25uOworICAgIGJjbW9sdF9idWYgdHhfYnVmID0ge307CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIHVpbnQ4X3QgaW5zdGFuY2U7CisKKyAgICBtc2ctPmVyciA9IEJDTV9FUlJfT0s7CisgICAgbXNnLT5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVFVRVNUOworICAgIG1zZy0+Y29ycl90YWcgPSArK2NvcnJfdGFnOworCisgICAgZXJyID0gX2JjbXRyX2Nvbm5fZ2V0KGRldmljZSwgJmNvbm4pOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICByZXR1cm4gYmNtdHJfY2FsbF9lcnIobXNnLCBlcnIsIE5VTEwpOworICAgIH0KKworICAgIC8qIHByZXZlbnQgc2xlZXBpbmcgaW4gUlggdGhyZWFkICh0aGlzIHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHdha2UgdXApICovCisgICAgdGFzayA9IGJjbW9zX3Rhc2tfY3VycmVudCgpOworICAgIGlmICh0YXNrID09ICZjb25uLT5yeF90aHJlYWQpCisgICAgeworICAgICAgICByZXR1cm4gYmNtdHJfY2FsbF9lcnIobXNnLCBCQ01fRVJSX0NPTU1fRkFJTCwgIkNhbm5vdCBjYWxsIEFQSSBmdW5jdGlvbnMgZnJvbSBQQ0kgUlggdGhyZWFkIik7CisgICAgfQorCisgICAgaW5zdGFuY2UgPSBiY21vbHRfbXNnX2luc3RhbmNlKG1zZyk7CisgICAgaWYgKGluc3RhbmNlID49IEJDTVRSX01BWF9JTlNUQU5DRVMpCisgICAgeworICAgICAgICByZXR1cm4gYmNtdHJfY2FsbF9lcnIobXNnLCBCQ01fRVJSX0tFWV9SQU5HRSwgIkludmFsaWQgUE9OIGluZGV4Iik7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgdHJhbnNwb3J0IGJ1ZmZlciBhbmQgcGFjayAqLworICAgIGVyciA9IF9iY210cl9wYWNrKGNvbm4sIG1zZywgJnR4X2J1Zik7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfZnJlZSgmdHhfYnVmKTsKKyAgICAgICAgcmV0dXJuIGJjbXRyX2NhbGxfZXJyKG1zZywgZXJyLCBOVUxMKTsKKyAgICB9CisKKyAgICAvKiB0cmFuc21pdCByZXF1ZXN0IHVuZGVyIGNvbm5lY3Rpb24gbG9jayAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmNvbm4tPm11dGV4KTsKKyAgICBlcnIgPSBfYmNtdHJfc2VuZChjb25uLCBtc2csICZ0eF9idWYsIEJDTVRSX1NFTkRfRkxBR1NfQ0FMTCwgJnRtc2cpOworICAgIGlmICghdG1zZykKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubi0+bXV0ZXgpOworICAgICAgICBiY21vbHRfYnVmX2ZyZWUoJnR4X2J1Zik7CisgICAgICAgIHJldHVybiBiY210cl9jYWxsX2Vycihtc2csIGVyciwgTlVMTCk7CisgICAgfQorICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZjb25uLT5tc2dfbGlzdCwgdG1zZywgbCk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uLT5tdXRleCk7CisKKyAgICAvKiBXYWl0IGZvciByZXNwb25zZSBvciB0aW1lb3V0LgorICAgICAqIE1lc3NhZ2UgdGltZW91dCBpcyBlbmZvcmNlZCBieSBhdWRpdCByYXRoZXIgdGhhbiBzZW1hcGhvcmUgdGltZW91dCBvcHRpb24KKyAgICAgKi8KKyAgICBiY21vc19zZW1fd2FpdCgmdG1zZy0+c2VtLCBCQ01PU19XQUlUX0ZPUkVWRVIpOworCisgICAgLyogQ29ubmVjdGlvbiBjb3VsZCd2ZSBiZWVuIGtpbGxlZCB3aGlsZSB3ZSBhcmUgd2FpdGluZyBoZXJlLgorICAgICAqIEl0IGlzIGluZGljYXRlZCBieSBDT01NX0ZBSUxVUkUgaW4gbXNnLT5lcnIuCisgICAgICogSW4gdGhpcyBjYXNlIHRyYW5zcG9ydCBoZWFkZXIgKHRtc2cpIGlzIGFscmVhZHkgcmVsZWFzZWQKKyAgICAgKi8KKyAgICBpZiAobXNnLT5lcnIgPT0gQkNNX0VSUl9DT01NX0ZBSUwpCisgICAgeworICAgICAgICByZXR1cm4gYmNtdHJfY2FsbF9lcnIobXNnLCBtc2ctPmVyciwgTlVMTCk7CisgICAgfQorCisgICAgZXJyID0gdG1zZy0+ZXJyOworICAgIGlmICghZXJyKQorICAgIHsKKyAgICAgICAgZXJyID0gX2JjbXRyX21zZ191bnBhY2soY29ubiwgJnRtc2ctPnJ4X2J1ZiwgJnRtc2ctPmhkciwgdG1zZy0+dGltZXN0YW1wLCAmbXNnKTsKKyAgICB9CisKKyAgICAvKiBUYWtlIGNvbm5lY3Rpb24gbG9jayBhZ2FpbiBpbiBvcmRlciB0byByZWxlYXNlIHRyYW5zcG9ydCBoZWFkZXIgc2FmZWx5ICovCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmY29ubi0+bXV0ZXgpOworICAgIF9iY210cl90bXNnX2ZyZWUodG1zZywgTlVMTCk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uLT5tdXRleCk7CisKKyAgICByZXR1cm4gYmNtdHJfY2FsbF9lcnIobXNnLCBlcnIgPyBlcnIgOiBtc2ctPmVyciwgTlVMTCk7Cit9CisKKworI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorLyogU2VuZCAodW4pcmVnaXN0cmF0aW9uIGluZm8gdG8gdGhlIG11eCAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY210cl9zZW5kX3RvX211eChiY210cl9jb25uICpjb25uLCBiY210cl9oZHIgKmhkcikKK3sKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICB1aW50OF90IHBhY2tlZF9oZHJbQkNNVFJfSERSX1NJWkVdOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGVyciA9IGJjbW9sdF9idWZfYWxsb2MoJmJ1ZiwgQkNNVFJfSERSX1NJWkUgKyBjb25uLT5jZmcucGx1Z2luX2NmZy5oZWFkcm9vbSwgQkNNVFJfQlVGX0VORElBTik7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGJjbW9sdF9idWZfc2tpcCgmYnVmLCBjb25uLT5jZmcucGx1Z2luX2NmZy5oZWFkcm9vbSk7CisgICAgYmNtdHJfaGVhZGVyX3BhY2soaGRyLCBwYWNrZWRfaGRyKTsKKyAgICBpZiAoYmNtb2x0X2J1Zl93cml0ZSgmYnVmLCBwYWNrZWRfaGRyLCBCQ01UUl9IRFJfU0laRSkpCisgICAgICAgIGVyciA9IGNvbm4tPmRyaXZlci5zZW5kKGNvbm4tPmRydl9wcml2LCAwLCAmYnVmLCBCQ01UUl9TRU5EX0ZMQUdTX1BSSV9OT1JNQUwpOworICAgIGVsc2UKKyAgICAgICAgZXJyID0gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICBiY21vbHRfYnVmX2ZyZWUoJmJ1Zik7CisgICAgcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisvKiogUmVnaXN0ZXIgbWVzc2FnZSBoYW5kbGVyCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcGFybSAgICAgICAgICAgIFJlZ2lzdHJhdGlvbiBwYXJhbWV0ZXJzCisgKiBccmV0dXJucyBCQ01fRVJSX09LIG9yIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfbXNnX2hhbmRsZXJfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtdHJfaGFuZGxlcl9wYXJtICpwYXJtKQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm47CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZ3JvdXBfaWQgbXNnX2lkOworICAgIGJjbXRyX2hhbmRsZXIgKmg7CisKKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTIHx8ICFwYXJtIHx8ICFwYXJtLT5hcHBfY2IgfHwgcGFybS0+aW5zdGFuY2UgPj0gQkNNVFJfTUFYX0lOU1RBTkNFUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgaWYgKCh1bnNpZ25lZClwYXJtLT5vYmplY3QgPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHAxID0gKnBhcm07CisKKyAgICAgICAgZm9yIChwMS5vYmplY3QgPSAwOyBwMS5vYmplY3QgPCBCQ01PTFRfT0JKX0lEX19OVU1fT0YgJiYgIWVycjsgcDEub2JqZWN0KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IGJjbXRyX21zZ19oYW5kbGVyX3JlZ2lzdGVyKGRldmljZSwgJnAxKTsKKyAgICAgICAgICAgIC8qIElnbm9yZSBSQU5HRSBlcnJvciB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgaXRlcmF0ZWQgZG9lc24ndCBoYXZlIHRoaXMgZ3JvdXAgKi8KKyAgICAgICAgICAgIC8qIElnbm9yZSBBTFJFQURZIGVycm9yIHRoYXQgaW5kaWNhdGVzIHRoYXQgcmVnaXN0cmF0aW9uIGlzIGFscmVhZHkgcHJlc2VudCBmb3Igc3BlY2lmaWMgbWVzc2FnZSBhbmQgd2FzIHNraXBwZWQgKi8KKyAgICAgICAgICAgIGlmICgoZXJyID09IEJDTV9FUlJfUkFOR0UpIHx8IChlcnIgPT0gQkNNX0VSUl9BTFJFQURZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCh1bnNpZ25lZClwYXJtLT5zdWJncm91cCA9PSBCQ01PTFRfU1VCR1JPVVBfQU5ZKQorICAgIHsKKyAgICAgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHAxID0gKnBhcm07CisKKyAgICAgICAgZm9yIChwMS5zdWJncm91cCA9IDA7CisgICAgICAgICAgICBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShwMS5vYmplY3QsIHAxLmdyb3VwLCBwMS5zdWJncm91cCwgJm1zZ19pZCkgPT0gQkNNX0VSUl9PSyAmJgorICAgICAgICAgICAgICAgIChlcnIgPT0gQkNNX0VSUl9PSyB8fCBlcnIgPT0gQkNNX0VSUl9BTFJFQURZKTsKKyAgICAgICAgICAgIHAxLnN1Ymdyb3VwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IGJjbXRyX21zZ19oYW5kbGVyX3JlZ2lzdGVyKGRldmljZSwgJnAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyID09IEJDTV9FUlJfQUxSRUFEWSkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIFNwZWNpZmljIG9iamVjdC9ncm91cC9zdWJncm91cCAqLworICAgIGVyciA9IGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKHBhcm0tPm9iamVjdCwgcGFybS0+Z3JvdXAsIHBhcm0tPnN1Ymdyb3VwLCAmbXNnX2lkKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGggPSAmY29ubl9pbmZvW2RldmljZV0ubXNnX2hhbmRsZXJbbXNnX2lkXVtwYXJtLT5pbnN0YW5jZV07CisKKyAgICAvKiBSZWZ1c2UgbmV3IHJlZ2lzdHJhdGlvbiBpZiBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KKyAgICBpZiAoaC0+YXBwX2NiICE9IF9iY210cl9kZnRfbXNnX2hhbmRsZXIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgIH0KKworICAgIGgtPmFwcF9jYiA9IHBhcm0tPmFwcF9jYjsKKyAgICBoLT5mbGFncyA9IHBhcm0tPmZsYWdzOworICAgIGlmICgocGFybS0+ZmxhZ3MgJiBCQ01PTFRfQVVUT19GTEFHU19ESVNQQVRDSCkpCisgICAgeworICAgICAgICBpZiAocGFybS0+bW9kdWxlICE9IEJDTU9TX01PRFVMRV9JRF9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICBoLT5tb2R1bGUgPSBwYXJtLT5tb2R1bGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBoLT5tb2R1bGUgPSBiY21vc19tb2R1bGVfY3VycmVudCgpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgtPm1vZHVsZSA9IEJDTU9TX01PRFVMRV9JRF9OT05FOworICAgIH0KKworI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorICAgIC8qIE9uIHRoZSBob3N0LCBhdXRvbWF0aWNhbGx5IGNvbm5lY3Qgb24gbWVzc2FnZSBoYW5kbGVyIHJlZ2lzdHJhdGlvbiAqLworICAgIGVyciA9IF9iY210cl9jb25uX2dldChkZXZpY2UsICZjb25uKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgLyogUmVnaXN0cmF0aW9uIHdpdGggdHItbXV4IGlzIHBlciBkZXZpY2UsIHBlci1pbnN0YW5jZSwgcGVyLW9iamVjdCAqLworICAgIGlmICghcGFybS0+c3ViZ3JvdXApCisgICAgeworICAgICAgICAvKiBTZW5kIHJlZ2lzdHJhdGlvbiBpbmZvIHRvIHRoZSBtdXggZHJpdmVyLiBJdCBpcyBqdXN0IGEgaGVhZGVyICovCisgICAgICAgIGJjbXRyX2hkciBoZHI7CisgICAgICAgIG1lbXNldCgmaGRyLCAwLCBzaXplb2YoaGRyKSk7CisgICAgICAgIGhkci5tc2dfaWQgPSBtc2dfaWQ7CisgICAgICAgIGhkci5hdXRvX3Byb3h5X3JlZyA9IDE7CisgICAgICAgIGhkci5pbnN0YW5jZSA9IHBhcm0tPmluc3RhbmNlOworICAgICAgICBlcnIgPSBfYmNtdHJfc2VuZF90b19tdXgoY29ubiwgJmhkcik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRyX21zZ19oYW5kbGVyX3VucmVnaXN0ZXIoZGV2aWNlLCBwYXJtKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgKHZvaWQpY29ubjsKKyNlbmRpZgorCisgICAgcmV0dXJuIGVycjsKK30KKworLyogVW5yZWdpc3RlciBhdXRvbm9tb3VzIG1lc3NhZ2UgaGFuZGxlciAqLworYmNtb3NfZXJybm8gYmNtdHJfbXNnX2hhbmRsZXJfdW5yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY210cl9oYW5kbGVyX3Bhcm0gKnBhcm0pCit7CisgICAgYmNtdHJfY29ubiAqY29ubjsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9ncm91cF9pZCBtc2dfaWQ7CisgICAgYmNtdHJfaGFuZGxlciAqaDsKKworICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMgfHwgIXBhcm0gfHwgcGFybS0+aW5zdGFuY2UgPj0gQkNNVFJfTUFYX0lOU1RBTkNFUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgaWYgKCh1bnNpZ25lZClwYXJtLT5vYmplY3QgPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHAxID0gKnBhcm07CisgICAgICAgIGZvciAocDEub2JqZWN0ID0gMDsgcDEub2JqZWN0IDwgQkNNT0xUX09CSl9JRF9fTlVNX09GICYmICFlcnI7IHAxLm9iamVjdCsrKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBiY210cl9tc2dfaGFuZGxlcl91bnJlZ2lzdGVyKGRldmljZSwgJnAxKTsKKyAgICAgICAgICAgIC8qIElnbm9yZSBSQU5HRSBlcnJvciB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgaXRlcmF0ZWQgZG9lc24ndCBoYXZlIHRoaXMgZ3JvdXAgKi8KKyAgICAgICAgICAgIGlmIChlcnIgPT0gQkNNX0VSUl9SQU5HRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCh1bnNpZ25lZClwYXJtLT5zdWJncm91cCA9PSBCQ01PTFRfU1VCR1JPVVBfQU5ZKQorICAgIHsKKyAgICAgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHAxID0gKnBhcm07CisKKyAgICAgICAgZm9yIChwMS5zdWJncm91cCA9IDA7CisgICAgICAgICAgICBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShwMS5vYmplY3QsIHAxLmdyb3VwLCBwMS5zdWJncm91cCwgJm1zZ19pZCkgPT0gQkNNX0VSUl9PSyAmJiAhZXJyOworICAgICAgICAgICAgcDEuc3ViZ3JvdXArKykKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gYmNtdHJfbXNnX2hhbmRsZXJfdW5yZWdpc3RlcihkZXZpY2UsICZwMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShwYXJtLT5vYmplY3QsIHBhcm0tPmdyb3VwLCBwYXJtLT5zdWJncm91cCwgJm1zZ19pZCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGggPSAmY29ubl9pbmZvW2RldmljZV0ubXNnX2hhbmRsZXJbbXNnX2lkXVtwYXJtLT5pbnN0YW5jZV07CisgICAgaC0+YXBwX2NiID0gX2JjbXRyX2RmdF9tc2dfaGFuZGxlcjsKKyAgICBoLT5mbGFncyA9IEJDTU9MVF9BVVRPX0ZMQUdTX05PTkU7CisgICAgaC0+bW9kdWxlID0gQkNNT1NfTU9EVUxFX0lEX05PTkU7CisKKyNpZmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QKKyAgICAvKiBPbiB0aGUgaG9zdCwgYXV0b21hdGljYWxseSBjb25uZWN0IG9uIG1lc3NhZ2UgaGFuZGxlciAoZGUpcmVnaXN0cmF0aW9uICovCisgICAgZXJyID0gX2JjbXRyX2Nvbm5fZ2V0KGRldmljZSwgJmNvbm4pOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAvKiBSZWdpc3RyYXRpb24gd2l0aCB0ci1tdXggaXMgcGVyIGRldmljZSwgcGVyLWluc3RhbmNlLCBwZXItb2JqZWN0ICovCisgICAgaWYgKCFwYXJtLT5zdWJncm91cCkKKyAgICB7CisgICAgICAgIC8qIFNlbmQgdW4tcmVnaXN0cmF0aW9uIGluZm8gdG8gdGhlIG11eCBkcml2ZXIuIEl0IGlzIGp1c3QgYSBoZWFkZXIgKi8KKyAgICAgICAgYmNtdHJfaGRyIGhkcjsKKyAgICAgICAgbWVtc2V0KCZoZHIsIDAsIHNpemVvZihoZHIpKTsKKyAgICAgICAgaGRyLm1zZ19pZCA9IG1zZ19pZDsKKyAgICAgICAgaGRyLmF1dG9fcHJveHlfdW5yZWcgPSAxOworICAgICAgICBoZHIuaW5zdGFuY2UgPSBwYXJtLT5pbnN0YW5jZTsKKyAgICAgICAgZXJyID0gX2JjbXRyX3NlbmRfdG9fbXV4KGNvbm4sICZoZHIpOworICAgIH0KKyNlbHNlCisgICAgKHZvaWQpY29ubjsKKyNlbmRpZgorCisgICAgcmV0dXJuIGVycjsKK30KKworLyoqIEdldCByZWdpc3RyYXRpb24gaW5mbworICoKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGRldmljZSAgICAgICAgICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW4sb3V0XSAgICAgICBwYXJtICAgICAgICAgICAgUmVnaXN0cmF0aW9uIHBhcmFtZXRlcnMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIGdyb3VwLCBvYmplY3QsIHN1Ymdyb3VwIG11c3QgYmUgc2V0CisgKiBccmV0dXJucyBCQ01fRVJSX09LIG9yIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfbXNnX2hhbmRsZXJfcmVnaXN0ZXJfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRyX2hhbmRsZXJfcGFybSAqcGFybSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dyb3VwX2lkIG1zZ19pZDsKKyAgICBiY210cl9oYW5kbGVyICpoOworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyB8fAorICAgICAgICAhcGFybSB8fAorICAgICAgICBwYXJtLT5pbnN0YW5jZSA+PSBCQ01UUl9NQVhfSU5TVEFOQ0VTIHx8CisgICAgICAgICh1bnNpZ25lZClwYXJtLT5vYmplY3QgPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GIHx8CisgICAgICAgICh1bnNpZ25lZClwYXJtLT5zdWJncm91cCA9PSBCQ01PTFRfU1VCR1JPVVBfQU5ZKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShwYXJtLT5vYmplY3QsIHBhcm0tPmdyb3VwLCBwYXJtLT5zdWJncm91cCwgJm1zZ19pZCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGggPSAmY29ubl9pbmZvW2RldmljZV0ubXNnX2hhbmRsZXJbbXNnX2lkXVtwYXJtLT5pbnN0YW5jZV07CisgICAgcGFybS0+YXBwX2NiID0gKGgtPmFwcF9jYiA9PSBfYmNtdHJfZGZ0X21zZ19oYW5kbGVyKSA/IE5VTEwgOiBoLT5hcHBfY2I7CisgICAgcGFybS0+ZmxhZ3MgPSBoLT5mbGFnczsKKyAgICBwYXJtLT5tb2R1bGUgPSBoLT5tb2R1bGU7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogR2V0IHRyYW5zcG9ydCBzdGF0aXN0aWNzICovCitiY21vc19lcnJubyBiY210cl9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cl9zdGF0ICpzdGF0KQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm47CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKCFzdGF0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgZXJyID0gX2JjbXRyX2Nvbm5fZ2V0KGRldmljZSwgJmNvbm4pOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBiY21vc19tdXRleF9sb2NrKCZjb25uLT5tdXRleCk7CisgICAgKnN0YXQgPSBjb25uLT5zdGF0OworICAgIG1lbXNldCgmY29ubi0+c3RhdCwgMCwgc2l6ZW9mKGNvbm4tPnN0YXQpKTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjaWYgZGVmaW5lZChTSU1VTEFUSU9OX0JVSUxEKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpICYmIGRlZmluZWQoQkNNX1NVQlNZU1RFTV9FTUJFRERFRCkgJiYgZGVmaW5lZChCQ01UUl9VRFBfU1VQUE9SVCkKK3N0YXRpYyBpbnQgX2JjbXRyX2Fzc2lnbl9yYW5kb21fcG9ydCh2b2lkKQoreworICAgIGludCBwb3J0OworCisgICAgc3JhbmQoYmNtb3NfdGltZXN0YW1wKCkpOworICAgIHBvcnQgPSByYW5kKCkgJSA1MDAwMDsKKyAgICBpZiAocG9ydCA8IDIwMDAwKQorICAgIHsKKyAgICAgICAgcG9ydCArPSAyMDAwMDsKKyAgICB9CisKKyAgICByZXR1cm4gcG9ydDsKK30KKyNlbmRpZgorCisvKiBDb25uZWN0IGRldmljZSBpbiByYXcgbW9kZS4gUmVjZWl2ZSB0YXNrIGlzIE5PVCBjcmVhdGVkICovCitiY21vc19lcnJubyBiY210cl9wcm94eV9jb25uZWN0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90ICpoZWFkcm9vbSkKK3sKKyAgICBiY210cl9jb25uICpjb25uOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBfYmNtdHJfY29ubl9nZXRfYW55KGRldmljZSwgJmNvbm4sIEJDTU9TX1RSVUUpOworICAgIGlmICghcmMpCisgICAgeworICAgICAgICAqaGVhZHJvb20gPSBjb25uLT5jZmcucGx1Z2luX2NmZy5oZWFkcm9vbTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiBTZW5kIGRhdGEgdG8gZGV2aWNlIGluIHJhdyBtb2RlICovCitiY21vc19lcnJubyBiY210cl9wcm94eV9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9idWYgKnR4X2J1ZikKK3sKKyAgICBiY210cl9jb25uICpjb25uOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHJjID0gX2JjbXRyX2Nvbm5fZ2V0X2FueShkZXZpY2UsICZjb25uLCBCQ01PU19UUlVFKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybiByYzsKKyAgICByYyA9IGNvbm4tPmRyaXZlci5zZW5kKGNvbm4tPmRydl9wcml2LCAwLCB0eF9idWYsIEJDTVRSX1NFTkRfRkxBR1NfTk9ORSk7CisgICAgcmV0dXJuIHJjOworfQorCisvKiBSZWNlaXZlIGRhdGEgZnJvbSBkZXZpY2UgaW4gcmF3IG1vZGUgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3Byb3h5X3JlY2VpdmUoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2J1ZiAqcnhfYnVmKQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm47CisgICAgYmNtb2x0X3N1YmNoYW5uZWwgc3ViY2g7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgcmMgPSBfYmNtdHJfY29ubl9nZXRfYW55KGRldmljZSwgJmNvbm4sIEJDTU9TX1RSVUUpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworICAgIHJjID0gY29ubi0+ZHJpdmVyLnJlY3YoY29ubi0+ZHJ2X3ByaXYsICZzdWJjaCwgcnhfYnVmKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKiBJbml0aWFsaXplIHRyYW5zcG9ydCBsaWJyYXJ5LgorICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2U7CisKKyAgICBiY21vc19wcmludGYoImJjbXRyX2luaXQ6IGluaXQgdHJhbnNwb3J0IGxpYnJhcnlcbiIpOworCisjaWYgZGVmaW5lZChCQ01UUl9VRFBfU1VQUE9SVCkKKworICAgIC8qIFNldCBkZWZhdWx0cyBhbmQgYWRkIGNvbmZpZ3VyYXRpb24gY29tbWFuZCAqLworICAgIGlmICghYmNtdHJfaG9zdF9pcCkKKyAgICAgICAgYmNtdHJfaG9zdF9pcCA9IEJDTVRSX1RSX1VEUF9IT1NUX0lQOworICAgIGlmICghYmNtdHJfaG9zdF91ZHBfcG9ydCkKKyAgICAgICAgYmNtdHJfaG9zdF91ZHBfcG9ydCA9IEJDTVRSX1RSX1VEUF9IT1NUX1BPUlQ7CisgICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCBCQ01UUl9NQVhfT0xUUzsgZGV2aWNlKyspCisgICAgeworICAgICAgICBpZiAoIWJjbXRyX29sdF9pcFtkZXZpY2VdKQorICAgICAgICAgICAgYmNtdHJfb2x0X2lwW2RldmljZV0gPSBCQ01UUl9UUl9VRFBfT0xUX0lQICsgZGV2aWNlOworICAgICAgICBpZiAoIWJjbXRyX29sdF91ZHBfcG9ydFtkZXZpY2VdKQorICAgICAgICAgICAgYmNtdHJfb2x0X3VkcF9wb3J0W2RldmljZV0gPSBCQ01UUl9UUl9VRFBfT0xUX1BPUlQ7CisgICAgfQorCisgICAgLyogQSBoYWNrIHRvIGFsbG93IG11bHRpcGxlIHNpbXVsYXRpb25zIHJ1biBvbiB0aGUgc2FtZSBQQyAqLworI2lmIGRlZmluZWQoU0lNVUxBVElPTl9CVUlMRCkgJiYgZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKSAmJiBkZWZpbmVkKEJDTV9TVUJTWVNURU1fRU1CRURERUQpCisgICAgeworICAgICAgICBiY210cl9vbHRfdWRwX3BvcnRbMF0gPSBfYmNtdHJfYXNzaWduX3JhbmRvbV9wb3J0KCk7CisgICAgfQorI2VuZGlmCisjZW5kaWYKKworICAgIC8qIEluaXRpYWxpemUgaGFuZGxlcnMgKi8KKyAgICBmb3IgKGRldmljZSA9IDA7IGRldmljZSA8IEJDTVRSX01BWF9PTFRTOyBkZXZpY2UrKykKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncm91cF9pZCBncm91cDsKKyAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgQkNNT0xUX0dST1VQX0lEX19OVU1fT0Y7IGdyb3VwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpbnN0OworICAgICAgICAgICAgZm9yIChpbnN0ID0gMDsgaW5zdCA8IEJDTVRSX01BWF9JTlNUQU5DRVM7IGluc3QrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25uX2luZm9bZGV2aWNlXS5tc2dfaGFuZGxlcltncm91cF1baW5zdF0uYXBwX2NiID0gX2JjbXRyX2RmdF9tc2dfaGFuZGxlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9zX211dGV4X2NyZWF0ZSgmY29ubl9sb2NrLCAwLCBOVUxMKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKiBSZWxlYXNlIHJlc291cmNlcyB1c2VkIGJ5IHRyYW5zcG9ydCBsaWJyYXJ5LgorICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2V4aXQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgICAgICBiY210cl9kaXNjb25uZWN0KGkpOworCisgICAgYmNtb3NfbXV0ZXhfZGVzdHJveSgmY29ubl9sb2NrKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl90cmFuc3BvcnRfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX3RyYW5zcG9ydF9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQwMDdhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl90cmFuc3BvcnRfY2xpLmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY210cl9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiY210cl9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPGJjbXRyX3RyYW5zcG9ydF9jbGkuaD4KKyNpbmNsdWRlIDxiY21fYXBpX2NsaV9oZWxwZXJzLmg+CisjaWZkZWYgQkNNVFJfUEVSRlRFU1QKKyNpbmNsdWRlIDx0ZXN0L2JjbXRyX3BlcmZ0ZXN0Lmg+CisjZW5kaWYKKworI2lmZGVmIEJDTVRSX1BMVUdJTl9UQVNLX0ZPUldBUkRFUgorZXh0ZXJuIHVpbnQzMl90IHJhd190eF9kcm9wX2NvdW50OworI2VuZGlmCisKKy8qCisgKiBDTEkgc3VwcG9ydAorICovCitzdGF0aWMgYmNtY2xpX2VudHJ5ICp0cmNsaV9kaXI7CisKKyNpZmRlZiBCQ01UUl9VRFBfU1VQUE9SVAorCisvKiBEaXNwbGF5L3NldCBob3N0IElQK3BvcnQKKyAgIEJDTUNMSV9NQUtFX1BBUk0oImlwX2FkZHIiLCAiSVAgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX0lQLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoInVkcF9wb3J0IiwgIlVEUCBwb3J0IiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xpX2hvc3RfdWRwKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgaWYgKCFucGFybXMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiSG9zdCBBZGRyZXNzOnBvcnQgPSAlZC4lZC4lZC4lZDolZFxuIiwKKyAgICAgICAgICAgIChiY210cl9ob3N0X2lwID4+IDI0KSAmIDB4ZmYsIChiY210cl9ob3N0X2lwID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAoYmNtdHJfaG9zdF9pcCA+PiA4KSAmIDB4ZmYsIGJjbXRyX2hvc3RfaXAgJiAweGZmLCBiY210cl9ob3N0X3VkcF9wb3J0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGJjbWNsaV9wYXJtX2lzX3NldChzZXNzaW9uLCAmcGFybVswXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRyX2hvc3RfaXAgPSBwYXJtWzBdLnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzFdKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJfaG9zdF91ZHBfcG9ydCA9IHBhcm1bMV0udmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERpc3BsYXkvU2V0IE9MVCBJUCtwb3J0CisgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgIEJDTUNMSV9NQUtFX1BBUk0oImlwX2FkZHIiLCAiSVAgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX0lQLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoInVkcF9wb3J0IiwgIlVEUCBwb3J0IiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xpX29sdF91ZHAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKworICAgIGlmIChucGFybXMgPT0gMSkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJPTFRbJWRdIEFkZHJlc3M6cG9ydCA9ICVkLiVkLiVkLiVkOiVkXG4iLAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgKGJjbXRyX29sdF9pcFtkZXZpY2VdID4+IDI0KSAmIDB4ZmYsIChiY210cl9vbHRfaXBbZGV2aWNlXSA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgKGJjbXRyX29sdF9pcFtkZXZpY2VdID4+IDgpICYgMHhmZiwgYmNtdHJfb2x0X2lwW2RldmljZV0gJiAweGZmLAorICAgICAgICAgICAgYmNtdHJfb2x0X3VkcF9wb3J0W2RldmljZV0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzFdKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJfb2x0X2lwW2RldmljZV0gPSBwYXJtWzFdLnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzJdKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJfb2x0X3VkcF9wb3J0W2RldmljZV0gPSBwYXJtWzJdLnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjZW5kaWYgLyogI2lmZGVmIEJDTVRSX1VEUF9TVVBQT1JUICovCisKKy8qIENvbm5lY3QKKyAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLAorICAgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xpX2Nvbm5lY3QoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKyAgICByZXR1cm4gYmNtdHJfY29ubmVjdChkZXZpY2UpOworfQorCisvKiBEaXNjb25uZWN0CisgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2NsaV9kaXNjb25uZWN0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpcGFybVswXS52YWx1ZS5udW1iZXI7CisgICAgcmV0dXJuIGJjbXRyX2Rpc2Nvbm5lY3QoZGV2aWNlKTsKK30KKworLyogUmVjb25uZWN0CisgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2NsaV9yZWNvbm5lY3QoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKyAgICByZXR1cm4gYmNtdHJfZHJpdmVyX3JlY29ubmVjdChkZXZpY2UpOworfQorCisvKiBTdGF0CisgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2NsaV9zdGF0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpcGFybVswXS52YWx1ZS5udW1iZXI7CisgICAgYmNtdHJfc3RhdCBzdGF0OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyNpZmRlZiBCQ01UUl9QTFVHSU5fVEFTS19GT1JXQVJERVIKKyAgICBzdGF0aWMgdWludDMyX3QgcHJldl9yYXdfdHhfZHJvcF9jb3VudDsKKyAgICB1aW50MzJfdCBuZXdfcmF3X3R4X2Ryb3BfY291bnQgPSByYXdfdHhfZHJvcF9jb3VudDsKKyNlbmRpZgorCisgICAgZXJyID0gYmNtdHJfc3RhdF9nZXQoZGV2aWNlLCAmc3RhdCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTI0cyA6ICVkXG4iLCAibXNnX3NlbnQiLCBzdGF0Lm1zZ19zZW50KTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgIm1zZ19yZXNwX3JlY2VpdmVkIiwgc3RhdC5tc2dfcmVzcF9yZWNlaXZlZCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJtc2dfcmVxX2F1dG9fcmVjZWl2ZWQiLCBzdGF0Lm1zZ19yZXFfYXV0b19yZWNlaXZlZCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJtc2dfcmVxX3RpbWVvdXQiLCBzdGF0Lm1zZ19yZXFfdGltZW91dCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJtc2dfcmVhc3NfdGltZW91dCIsIHN0YXQubXNnX3JlYXNzX3RpbWVvdXQpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTI0cyA6ICVkXG4iLCAibXNnX25vX3JlcSIsIHN0YXQubXNnX25vX3JlcSk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJtc2dfbm9fbWVtIiwgc3RhdC5tc2dfbm9fbWVtKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgIm1zZ19jb21tX2VyciIsIHN0YXQubXNnX2NvbW1fZXJyKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgIm1zZ19yZWFkeV90aW1lb3V0Iiwgc3RhdC5tc2dfcmVhZHlfdGltZW91dCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJtc2dfdG9vX21hbnlfcmVxIiwgc3RhdC5tc2dfdG9vX21hbnlfcmVxKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgIm1zZ190b29fbWFueV9hdXRvIiwgc3RhdC5tc2dfdG9vX21hbnlfYXV0byk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJmcmFnX3JlY2VpdmVkIiwgc3RhdC5mcmFnX3JlY2VpdmVkKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgImZyYWdfaW52YWxpZCIsIHN0YXQuZnJhZ19pbnZhbGlkKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgInVucGFja19lcnJvcnMiLCBzdGF0LnVucGFja19lcnJvcnMpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTI0cyA6ICVkXG4iLCAicGFja19lcnJvcnMiLCBzdGF0LnBhY2tfZXJyb3JzKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgIm5vX3J4X2hhbmRsZXIiLCBzdGF0Lm5vX3J4X2hhbmRsZXIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTI0cyA6ICVkXG4iLCAibm90X2Nvbm5lY3RlZCIsIHN0YXQubm90X2Nvbm5lY3RlZCk7CisjaWZkZWYgQkNNVFJfUExVR0lOX1RBU0tfRk9SV0FSREVSCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJyYXdfdHhfZHJvcCIsIG5ld19yYXdfdHhfZHJvcF9jb3VudCAtIHByZXZfcmF3X3R4X2Ryb3BfY291bnQpOworICAgIHByZXZfcmF3X3R4X2Ryb3BfY291bnQgPSBuZXdfcmF3X3R4X2Ryb3BfY291bnQ7CisjZW5kaWYKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogUmVnaXN0ZXIKKyAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLAorICAgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xpX3JlZ2lzdGVyX2luZm8oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKyAgICBiY210cl9oYW5kbGVyX3Bhcm0gcCA9CisgICAgeworICAgICAgICAuaW5zdGFuY2UgPSAodWludDhfdClwYXJtWzFdLnZhbHVlLm51bWJlciwKKyAgICAgICAgLmdyb3VwID0gKGJjbW9sdF9tZ3RfZ3JvdXApcGFybVsyXS52YWx1ZS5udW1iZXIsCisgICAgfTsKKworICAgIGlmIChwLmluc3RhbmNlID49IEJDTVRSX01BWF9JTlNUQU5DRVMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGZvciAocC5vYmplY3QgPSBCQ01PTFRfT0JKX0lEX0RFVklDRTsgcC5vYmplY3QgPCBCQ01PTFRfT0JKX0lEX19OVU1fT0Y7IHAub2JqZWN0KyspCisgICAgeworICAgICAgICBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWQ7CisgICAgICAgIGNvbnN0IGNoYXIgKm9ial9uYW1lLCAqb2JqX2Rlc2NyOworICAgICAgICBjb25zdCBjaGFyICpzdWJfbmFtZSwgKnN1Yl9kZXNjcjsKKworICAgICAgICBpZiAoYXBpX2NsaV9vYmplY3RfbmFtZShwLm9iamVjdCwgJm9ial9uYW1lLCAmb2JqX2Rlc2NyKSAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZm9yIChwLnN1Ymdyb3VwID0gMDsgYmNtdHJfbXNnX2hhbmRsZXJfcmVnaXN0ZXJfZ2V0KGRldmljZSwgJnApID09IEJDTV9FUlJfT0s7IHAuc3ViZ3JvdXArKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2dyb3VwX2lkX2NvbWJpbmUocC5vYmplY3QsIHAuZ3JvdXAsIHAuc3ViZ3JvdXAsICZncm91cF9pZCk7CisgICAgICAgICAgICBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKHAub2JqZWN0LCBwLmdyb3VwLCBwLnN1Ymdyb3VwLCAmc3ViX25hbWUsICZzdWJfZGVzY3IpOworCisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJXMgLSAlcyA6IG1zZ19pZD0ldSAiLCBvYmpfbmFtZSwgc3ViX25hbWUsIGdyb3VwX2lkKTsKKyAgICAgICAgICAgIGlmIChwLmFwcF9jYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAibW9kdWxlOiVkIGZ1bmM6JXBcbiIsIHAubW9kdWxlLCBwLmFwcF9jYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIk5PTkVcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKK2JjbW9zX2Vycm5vIGJjbXRyX2NsaV9pbml0KHZvaWQpCit7CisgICAgaWYgKCh0cmNsaV9kaXI9YmNtY2xpX2Rpcl9maW5kKE5VTEwsICJ0cmFuc3BvcnQiKSkgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB0cmNsaV9kaXIgPSBiY21jbGlfZGlyX2FkZChOVUxMLCAidHJhbnNwb3J0IiwgIk1hcGxlIFRyYW5zcG9ydCIsIEJDTUNMSV9BQ0NFU1NfR1VFU1QsIE5VTEwpOworICAgIGlmICghdHJjbGlfZGlyKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJDYW4ndCBjcmVhdGUgdHJhbnNwb3J0IGRpcmVjdG9yeVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworI2lmZGVmIEJDTVRSX1VEUF9TVVBQT1JUCisKKyAgICBCQ01DTElfTUFLRV9DTUQodHJjbGlfZGlyLCAiaG9zdF91ZHAiLCAiSG9zdCBJUCBhbmQgVURQIHBvcnQgcGFyYW1ldGVycyIsIF9iY210cl9jbGlfaG9zdF91ZHAsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImlwX2FkZHIiLCAiSVAgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX0lQLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgidWRwX3BvcnQiLCAiVURQIHBvcnQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgIDAsIDB4ZmZmZikpOworICAgIEJDTUNMSV9NQUtFX0NNRCh0cmNsaV9kaXIsICJvbHRfdWRwIiwgIk9MVCBJUCBhbmQgVURQIHBvcnQgcGFyYW1ldGVycyIsIF9iY210cl9jbGlfb2x0X3VkcCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgiZGV2aWNlIiwgIkRldmljZSBpbmRleCIsIEJDTUNMSV9QQVJNX0RFQ0lNQUwsIDAsCisgICAgICAgIDAsIEJDTVRSX01BWF9PTFRTLTEpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpcF9hZGRyIiwgIklQIGFkZHJlc3MiLCBCQ01DTElfUEFSTV9JUCwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoInVkcF9wb3J0IiwgIlVEUCBwb3J0IiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAwLCAweGZmZmYpKTsKKyNlbmRpZgorCisgICAgQkNNQ0xJX01BS0VfQ01EKHRyY2xpX2RpciwgImNvbm5lY3QiLCAiQ29ubmVjdCIsIF9iY210cl9jbGlfY29ubmVjdCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgiZGV2aWNlIiwgIkRldmljZSBpbmRleCIsIEJDTUNMSV9QQVJNX0RFQ0lNQUwsIDAsCisgICAgICAgIDAsIEJDTVRSX01BWF9PTFRTLTEpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRCh0cmNsaV9kaXIsICJkaXNjb25uZWN0IiwgIkRpc2Nvbm5lY3QiLCBfYmNtdHJfY2xpX2Rpc2Nvbm5lY3QsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLAorICAgICAgICAwLCBCQ01UUl9NQVhfT0xUUy0xKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQodHJjbGlfZGlyLCAicmVjb25uZWN0IiwgIlJlY29ubmVjdCIsIF9iY210cl9jbGlfcmVjb25uZWN0LAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgICAgICAgMCwgQkNNVFJfTUFYX09MVFMtMSkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKHRyY2xpX2RpciwgInN0YXQiLCAiVHJhbnNwb3J0IHN0YXRpc3RpY3MiLCBfYmNtdHJfY2xpX3N0YXQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLAorICAgICAgICAwLCBCQ01UUl9NQVhfT0xUUy0xKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZ3JvdXBzW10gPQorICAgICAgICB7CisjaWZkZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisgICAgICAgICAgICB7IC5uYW1lID0gImF1dG8iLCAudmFsID0gQkNNT0xUX01HVF9HUk9VUF9DRkcgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAicHJveHlfcngiLCAudmFsID0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCB9LAorI2Vsc2UKKyAgICAgICAgICAgIHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHIH0sCisgICAgICAgICAgICB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX01HVF9HUk9VUF9TVEFUIH0sCisgICAgICAgICAgICB7IC5uYW1lID0gInN0YXRfY2ZnIiwgLnZhbCA9IEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAib3BlciIsIC52YWwgPSBCQ01PTFRfTUdUX0dST1VQX09QRVIgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAiYXV0b19jZmciLCAudmFsID0gQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRyB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJwcm94eSIsIC52YWwgPSBCQ01PTFRfTUdUX0dST1VQX1BST1hZIH0sCisjZW5kaWYKKyAgICAgICAgICAgIHsgLm5hbWUgPSBOVUxMIH0KKworICAgICAgICB9OworICAgICAgICBCQ01DTElfTUFLRV9DTUQodHJjbGlfZGlyLCAicmVnaXN0cmF0aW9uIiwgIlRyYW5zcG9ydCBSWCByZWdpc3RyYXRpb24gaW5mbyIsIF9iY210cl9jbGlfcmVnaXN0ZXJfaW5mbywKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLAorICAgICAgICAgICAgMCwgQkNNVFJfTUFYX09MVFMtMSksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJwb25fbmkiLCAiUE9OIE5JIiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgICAgICAgICAgIDAsIEJDTVRSX01BWF9JTlNUQU5DRVMtMSksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImdyb3VwIiwgIk1hbmFnZW1lbnQgZ3JvdXAiLCBncm91cHMsIDApICk7CisgICAgfQorCisgICAgLyogUGVyZm9ybWFuY2UgdGVzdGluZyBkaXJlY3RvcnkgKi8KKyNpZmRlZiBCQ01UUl9QRVJGVEVTVAorICAgIGJjbXRyX3Rlc3RfaW5pdCgpOworI2VuZGlmCisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwordm9pZCBiY210cl9jbGlfZXhpdCh2b2lkKQoreworICAgIGlmICh0cmNsaV9kaXIpCisgICAgeworICAgICAgICBiY21jbGlfdG9rZW5fZGVzdHJveSh0cmNsaV9kaXIpOworICAgICAgICB0cmNsaV9kaXIgPSBOVUxMOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfdHJhbnNwb3J0X2NsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl90cmFuc3BvcnRfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViZmZhYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfdHJhbnNwb3J0X2NsaS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNVFJfVFJBTlNQT1JUX0NMSV9IXworI2RlZmluZSBCQ01UUl9UUkFOU1BPUlRfQ0xJX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKworI2lmZGVmIEVOQUJMRV9DTEkKK2JjbW9zX2Vycm5vIGJjbXRyX2NsaV9pbml0KHZvaWQpOwordm9pZCBiY210cl9jbGlfZXhpdCh2b2lkKTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2luYmFuZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWM2YzAwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIyBJbmJhbmQgVHJhbnNwb3J0CisjCisKK01PRF9OQU1FID0gaW5iYW5kX2RyaXZlcgorTU9EX1RZUEUgPSBsaWIKK01PRF9ERUZTID0gLURJTl9CQU5ECisKK1VTRV9MSU5UID0geWVzCisKK3NyY3MgPSBiY210cl9pbmJhbmQuYwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvYmNtdHJfaW5iYW5kLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2luYmFuZC9iY210cl9pbmJhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWI3N2NhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvYmNtdHJfaW5iYW5kLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgKiBiY210cl9pbmJhbmQuYyAtIEluLWJhbmQgdHJhbnNwb3J0IGRyaXZlcgorICovCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtdHJfaW5iYW5kLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCit0eXBlZGVmIHN0cnVjdCBkZXZpY2VfaW5mbworeworICAgIGJjbW9zX2lwdjRfYWRkcmVzcyByZW1vdGVfaXA7CisgICAgdWludDE2X3QgcmVtb3RlX3BvcnQ7CisgICAgdWludDhfdCBjaGFubmVsOworICAgIGludCB0cl91ZHBfc29jazsKK30gZGV2aWNlX2luZm87CisKK3N0YXRpYyBkZXZpY2VfaW5mbyBkZXZfaW5mb1tCQ01UUl9NQVhfT0xUU107CisKKyNkZWZpbmUgREVCVUdfT05MWSAwCisKKy8qKiBJbml0aWFsaXplIGluLWJhbmQgdHJhbnNwb3J0IGRyaXZlcgorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2liX2luaXQodm9pZCkKK3sKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIENsZWFudXAgaW4tYmFuZCB0cmFuc3BvcnQgZHJpdmVyCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLwordm9pZCBiY210cl9pYl9leGl0KHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaTxCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgIHsKKyAgICAgICAgYmNtdHJfaWJfZGlzY29ubmVjdChpKTsKKyAgICB9Cit9CisKKy8qIFJlY2VpdmUgcGFja2V0ICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2liX3J4KHVpbnQzMl90IGRldmljZSwgaW50IHMsIGJjbW9zX2J1ZiAqKmJ1ZiwgdWludDhfdCAqY2gpCit7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhOworI2lmIDAKKyAgICBzdHJ1Y3QgaW92ZWMgaW92ID0gey5pb3ZfbGVuID0gQkNNVFJfTUFYX01UVV9TSVpFfTsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKyAgICAgICAgLm1zZ19pb3YgPSAmaW92LCAubXNnX2lvdmxlbiA9IDEsCisgICAgICAgIC5tc2dfbmFtZSA9ICZzYSwgLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHNhKQorICAgIH07CisjZW5kaWYKKyAgICBiY21vc19idWYgKmI7CisgICAgc3NpemVfdCBsZW47CisKKyAgICBiID0gYmNtb3NfYnVmX2FsbG9jKEJDTVRSX01BWF9NVFVfU0laRSk7CisgICAgaWYgKCFiKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlclxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorI2lmIDAKKyAgICBpb3YuaW92X2Jhc2UgPSBiY21vc19idWZfZGF0YShiKTsKKyNlbmRpZgorICAgIG1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworICAgIGxlbiA9IHJlY3YocywgYmNtb3NfYnVmX2RhdGEoYiksIEJDTVRSX01BWF9NVFVfU0laRSwgMCk7CisgICAgaWYgKGxlbiA8PSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogcmVjdm1zZygpIC0tPiAlZFxuIiwgX19GVU5DVElPTl9fLCBsZW4pOworICAgICAgICBiY21vc19idWZfZnJlZShiKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQ09NTV9GQUlMOworICAgIH0KKworICAgICpjaCA9IGRldl9pbmZvW2RldmljZV0uY2hhbm5lbDsKKyAgICBkZXZfaW5mb1tkZXZpY2VdLmNoYW5uZWwgPSAwOworICAgIGJjbW9zX2J1Zl9sZW5ndGhfc2V0KGIsIChpbnQpbGVuKTsKKyAgICAqYnVmID0gYjsKKworI2lmIERFQlVHX09OTFkKKyAgICBiY21vc19wcmludGYoIlxuUmVjZWl2ZWQgdG8gJWQgYnl0ZXMgZnJvbSBjaGFubmVsICVkLyVkIHBvcnQiLCBsZW4sICpjaCwgc2Euc2luX3BvcnQpOworCisgICAgeworICAgICAgICBpbnQgaWkgPSAwOworICAgICAgICB1bnNpZ25lZCBjaGFyICpjID0gYmNtb3NfYnVmX2RhdGEoYik7CisgICAgICAgIGludCBzaXplID0gKGludClsZW47CisKKyAgICAgICAgZm9yIChpaT0wOyBpaTxzaXplOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoMD09KGlpJTE2KSkgYmNtb3NfcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgaWYgKDA9PShpaSU4KSkgYmNtb3NfcHJpbnRmKCIgICIpOworICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCIgJTAyeCIsICpjKTsKKyAgICAgICAgICAgIGMrKzsKKyAgICAgICAgfQorICAgICAgICBiY21vc19wcmludGYoIlxuIik7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIENvbm5lY3QgdG8gbWFwbGUgZGV2aWNlICovCitiY21vc19lcnJubyBiY210cl9pYl9jb25uZWN0KHVpbnQ4X3QgZGV2aWNlLCBiY21vc19pcHY0X2FkZHJlc3MgaXBfYWRkcmVzcywgdWludDE2X3QgdWRwX3BvcnQpCit7CisgICAgaW50IHIgPSAwOworICAgIGludCBzID0gMDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisKKyAgICAvKkNoZWNrIGZvciB2YWxpZCBkZXZpY2UqLworICAgIEJVR19PTigodW5zaWduZWQpZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKTsKKworICAgIGlmIChkZXZfaW5mb1tkZXZpY2VdLnRyX3VkcF9zb2NrKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworCisgICAgZGV2X2luZm9bZGV2aWNlXS5yZW1vdGVfaXAgPSBpcF9hZGRyZXNzOworICAgIGRldl9pbmZvW2RldmljZV0ucmVtb3RlX3BvcnQgPSB1ZHBfcG9ydDsKKworICAgIC8qY2hlY2sgdGhhdCBpcCBhZGRyZXNzIGFuZCBwb3J0IGhhdmUgYmVlbiBpbml0aWFsaXplZCovCisgICAgaWYoZGV2X2luZm9bZGV2aWNlXS5yZW1vdGVfcG9ydCA9PSAwICB8fCBkZXZfaW5mb1tkZXZpY2VdLnJlbW90ZV9pcC51MzIgPT0gMCkKKyAgICB7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXM6IElQIGFkZHJlc3MgYW5kIHBvcnQgbm90IGluaXRpYWxpemVkLiBFcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHNvY2tldCAqLworICAgIHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgaWYgKCFzKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQuIEVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHMpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgfQorCisgICAgLyogQ29ubmVjdCB0byByZW1vdGUgKi8KKyAgICBtZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKyAgICBzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBzYS5zaW5fcG9ydCA9IChpbl9wb3J0X3QpaHRvbnMoZGV2X2luZm9bZGV2aWNlXS5yZW1vdGVfcG9ydCk7CisgICAgc2Euc2luX2FkZHIuc19hZGRyID0gKGluX2FkZHJfdClodG9ubChkZXZfaW5mb1tkZXZpY2VdLnJlbW90ZV9pcC51MzIpOworICAgIHIgPSBjb25uZWN0KHMsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYSwgc2l6ZW9mKHNhKSk7CisgICAgaWYgKHIpCisgICAgeworICAgICAgICBiY21vc19wcmludGYoIiVzOiBGYWlsZWQgdG8gY29ubmVjdCBzb2NrZXQuIEVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHIpOworICAgICAgICBjbG9zZShzKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQ09NTV9GQUlMOworICAgIH0KKworICAgIHsKKyAgICAgICAgc29ja2xlbl90IHNsZW47CisgICAgICAgIGlmIChnZXRzb2NrbmFtZShzLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCAmc2xlbikgPCAwKQorICAgICAgICB7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXM6IENvbm5lY3RlZCBzb2NrZXQgaW52YWxpZC4gRXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcik7CisgICAgICAgIGNsb3NlKHMpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgICAgIH0KKworICAgICAgICBiY21vc19wcmludGYoIiVzOiBkZXZpY2UgJWQ6IHNvY2tldCAocG9ydCAlZCkgY29ubmVjdGVkIHRvICVkLiVkLiVkLiVkOiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UsIG50b2hzKCh1aW50MTZfdClzYS5zaW5fcG9ydCksCisgICAgICAgICAgICAgICAgICAgICAoaW50KShkZXZfaW5mb1tkZXZpY2VdLnJlbW90ZV9pcC51MzIgPj4gMjQpLCAoaW50KSgoZGV2X2luZm9bZGV2aWNlXS5yZW1vdGVfaXAudTMyID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgICAgICAgKGludCkoKGRldl9pbmZvW2RldmljZV0ucmVtb3RlX2lwLnUzMiA+PiA4KSAmIDB4ZmYpLCAoaW50KShkZXZfaW5mb1tkZXZpY2VdLnJlbW90ZV9pcC51MzIgJiAweGZmKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbnQpZGV2X2luZm9bZGV2aWNlXS5yZW1vdGVfcG9ydCk7CisgICAgfQorCisgICAgZGV2X2luZm9bZGV2aWNlXS50cl91ZHBfc29jayA9IHM7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIERpc2Nvbm5lY3QuIEFsbCBidWZmZXJzIGFyZSByZWxlYXNlZAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9pYl9kaXNjb25uZWN0KHVpbnQ4X3QgZGV2aWNlKQoreworICAgIEJVR19PTigodW5zaWduZWQpZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKTsKKworICAgIGJjbW9zX3ByaW50ZigiJXM6IGRpc2Nvbm5lY3RpbmcgJWQuLiIsIF9fRlVOQ1RJT05fXywgZGV2aWNlKTsKKyAgICBpZiAoZGV2X2luZm9bZGV2aWNlXS50cl91ZHBfc29jaykKKyAgICB7CisgICAgICAgIGludCBzID0gZGV2X2luZm9bZGV2aWNlXS50cl91ZHBfc29jazsKKyAgICAgICAgZGV2X2luZm9bZGV2aWNlXS50cl91ZHBfc29jayA9IDA7CisgICAgICAgIGNsb3NlKHMpOworICAgIH0KKyAgICBiY21vc19wcmludGYoImRvbmVcbiIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogU2VuZCBwYWNrZXQgdG8gZGV2aWNlIHZpYSBpbi1iYW5kIGludGVyZmFjZQorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwb2xlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNoYW5uZWwgTG9naWNhbCBjaGFubmVsCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIgdG8gYmUgdHJhbnNtaXR0ZWQKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9pYl9zZW5kKHVpbnQ4X3QgZGV2aWNlLCB1aW50OF90IGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIGludCBidWZsZW4gPSBiY21vc19idWZfbGVuZ3RoKGJ1Zik7CisgICAgc3RydWN0IGlvdmVjIGlvdiA9IHsgLmlvdl9iYXNlID0gYmNtb3NfYnVmX2RhdGEoYnVmKSwgLmlvdl9sZW4gPSBidWZsZW4gfTsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKyAgICAgICAgLm1zZ19pb3YgPSAmaW92LCAubXNnX2lvdmxlbiA9IDEsIC5tc2dfZmxhZ3M9TVNHX0RPTlRXQUlULAorICAgICAgICAubXNnX25hbWUgPSBOVUxMLCAubXNnX25hbWVsZW4gPSAwCisgICAgfTsKKyAgICBzc2l6ZV90IGxlbjsKKworICAgIGRldl9pbmZvW2RldmljZV0uY2hhbm5lbCA9IGNoYW5uZWw7CisKKyAgICBsZW4gPSBzZW5kbXNnKGRldl9pbmZvW2RldmljZV0udHJfdWRwX3NvY2ssICZtc2csIDApOworICAgIGlmICgoaW50KWxlbiA8IGJ1ZmxlbikKKyAgICB7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXM6IHNlbmRtc2coJXUpIC0tPiAlZFxuIiwgX19GVU5DVElPTl9fLCBidWZsZW4sIGxlbik7CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9DT05ORUNURUQ7CisgICAgfQorCisjaWYgMQorICAgIHsKKyAgICAgICAgaW50IGlpID0gMDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqYyA9IGJjbW9zX2J1Zl9kYXRhKGJ1Zik7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKyAgICAgICAgc29ja2xlbl90IHNsZW47CisKKyAgICAgICAgZm9yIChpaT0wOyBpaTwoaW50KWxlbjsgaWkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKDA9PShpaSUxNikpIGJjbW9zX3ByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIGlmICgwPT0oaWklOCkpIGJjbW9zX3ByaW50ZigiICAiKTsKKyAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiICUwMngiLCAqYyk7CisgICAgICAgICAgICBjKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0c29ja25hbWUoZGV2X2luZm9bZGV2aWNlXS50cl91ZHBfc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgJnNsZW4pIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogQ29ubmVjdGVkIHNvY2tldCBpbnZhbGlkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfQ09NTV9GQUlMOworICAgICAgICB9CisgICAgICAgIGJjbW9zX3ByaW50ZigiXG5TZW50ICVkIGJ5dGVzIHRvIGNoYW5uZWwgJWQgZnJvbSBwb3J0ICVkXHQiLCBsZW4sIGNoYW5uZWwsIHNhLnNpbl9wb3J0KTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBSZWNlaXZlIHBhY2tldCBmcm9tIGRldmljZSAqLworYmNtb3NfZXJybm8gYmNtdHJfaWJfcmVjZWl2ZSh1aW50MzJfdCBkZXZpY2UsIHVpbnQ4X3QgKmNoYW5uZWwsIGJjbW9zX2J1ZiAqKmJ1ZikKK3sKKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTIHx8ICEgIGRldl9pbmZvW2RldmljZV0udHJfdWRwX3NvY2spCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHJldHVybiBfYmNtdHJfaWJfcngoZGV2aWNlLCBkZXZfaW5mb1tkZXZpY2VdLnRyX3VkcF9zb2NrLCBidWYsIGNoYW5uZWwpOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvYmNtdHJfaW5iYW5kLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2luYmFuZC9iY210cl9pbmJhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGYzZDdkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvYmNtdHJfaW5iYW5kLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbXRyX2luYmFuZC5oIC0gSW5iYW5kIGhvc3QtbWFwbGUgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UKKyAqLworCisjaWZuZGVmIF9CQ01UUl9JTkJBTkRfSF8KKyNkZWZpbmUgX0JDTVRSX0lOQkFORF9IXworCisKKy8qKiBJbml0aWFsaXplIGluLWJhbmQgdHJhbnNwb3J0IGRyaXZlcgorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2liX2luaXQodm9pZCk7CisKKworLyoqIENsZWFudXAgaW4tYmFuZCB0cmFuc3BvcnQgZHJpdmVyCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLwordm9pZCBiY210cl9pYl9leGl0KHZvaWQpOworCisvKiogQ29ubmVjdAorICogXHBhcmFtW2luXSAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgaXBfYWRkcmVzcyAgICAgIE1hcGxlIElQIGFkZHJlc3MKKyAqIFxwYXJhbVtpbl0gIHVkcF9wb3J0ICAgICAgICBNYXBsZSBVRFAgcG9ydAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2liX2Nvbm5lY3QodWludDhfdCBkZXZpY2UsIGJjbW9zX2lwdjRfYWRkcmVzcyBpcF9hZGRyZXNzLCB1aW50MTZfdCB1ZHBfcG9ydCk7CisKKy8qKiBEaXNjb25uZWN0LiBBbGwgYnVmZmVycyBhcmUgcmVsZWFzZWQKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfaWJfZGlzY29ubmVjdCh1aW50OF90IGRldmljZSk7CisKKy8qKiBTZW5kIHBhY2tldCB0byBkZXZpY2UgdmlhIGluLWJhbmQgaW50ZXJmYWNlCisgKiBccGFyYW1baW5dICAgZGV2aWNlICBNYXBvbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgY2hhbm5lbCBMb2dpY2FsIGNoYW5uZWwKKyAqIFxwYXJhbVtpbl0gICBidWYgICAgIEJ1ZmZlciB0byBiZSB0cmFuc21pdHRlZAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2liX3NlbmQodWludDhfdCBkZXZpY2UsIHVpbnQ4X3QgY2hhbm5lbCwgYmNtb3NfYnVmICpidWYpOworCisvKiBSZWNlaXZlIHBhY2tldCBmcm9tIGRldmljZSAqLworYmNtb3NfZXJybm8gYmNtdHJfaWJfcmVjZWl2ZSh1aW50MzJfdCBkZXZpY2UsIHVpbnQ4X3QgKmNoYW5uZWwsIGJjbW9zX2J1ZiAqKmJ1Zik7CisKKyNlbmRpZiAvKiBfQkNNVFJfSU5CQU5EX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvbXV4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDVhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9NYWtlZmlsZQpAQCAtMCwwICsxLDM1IEBACisjIFBDSWUgdHJhbnNwb3J0CisjIENvbnNpc3RzIG9mIDIgY29tcG9uZW50cworIyAtIGxvdy1sZXZlbCBQQ0llIGRyaXZlciAoc2VuZC9yeCBmdW5jdGlvbnMpCisjIC0gbXVsdGlwbGV4ZXIKKyMKK01PRF9OQU1FID0gdHJtdXgKK01PRF9ERVBTID0gdHJhbnNwb3J0IG1vZGVsIHBjaWUgcGNpZV9tb2QgbGxfcGNpZSBmbGQgcGNpZV9zd19xdWV1ZQorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfREVQUyArPSBjb21tb25fYXBpCitlbHNlCisgICAgTU9EX0RFUFMgKz0gYXBpCitlbmRpZgorCitpZmVxICgiJChSQVdfVFJBTlNQT1JUX1ZJQV9VRFApIiwgInkiKQorTU9EX0RFUFMgKz0gdHJwY2llCitlbmRpZgorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKK01PRF9UWVBFID0gbGludXhfbGliCitlbHNlCitNT0RfVFlQRSA9IGxpYgorZW5kaWYKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK3NyY3MgPSBiY21vbHRfdHJfbXV4LmMgCisKK1VTRV9MSU5UID0geWVzCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9tdXgvYmNtb2x0X3RyX211eC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9tdXgvYmNtb2x0X3RyX211eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2U2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9iY21vbHRfdHJfbXV4LmMKQEAgLTAsMCArMSwxMDkyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtdHJfbXV4LmMKKyAqCisgKiBUcmFuc3BvcnQgTXVsdGlwbGV4ZXIKKyAqIC0gUENJZS9pbi1iYW5kIGNoYW5uZWwgbXVsdGlwbGV4ZXIKKyAqIC0gbG9jYWxseS9yZW1vdGVseSAtIHRlcm1pbmF0ZWQgbWVzc2FnZSBtdWx0aXBsZXhlcgorICogLSBhdXRvbm9tb3VzIG1lc3NhZ2VzIGRlLW11bHRpcGxleGVyCisgKi8KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaW5jbHVkZSA8YmNtb2x0X2J1Zi5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2dfcGFjay5oPgorI2luY2x1ZGUgPGJjbXRyX2hlYWRlci5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl9tdXguaD4KKyNpZmRlZiBJTl9CQU5ECisjaW5jbHVkZSA8YmNtdHJfaW5iYW5kLmg+CisjZWxzZQorI2luY2x1ZGUgPGJjbXRyX3BjaWUuaD4KKyNpbmNsdWRlIDxiY21vbHRfbGxwY2llLmg+CisjaW5jbHVkZSA8YmNtb2x0X2ZsZC5oPgorI2luY2x1ZGUgPGJjbV9mbGRfY29tbW9uLmg+CisjaW5jbHVkZSA8YmNtdHJfcGNpZV9zd19xdWV1ZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF9pZHMuaD4KKworI2RlZmluZSBCQ01UUk1VWF9NQVhfVFhfREVMQVkgICA1MDAgICAgIC8qIG1heCB0cmFuc21pdCBkZWxheSAodXMpICovCisjZGVmaW5lIEJDTVRSTVVYX01BWF9SWF9ERUxBWSAgIDUwMDAgICAgLyogbWF4IHJlY2VpdmUgZGVsYXkgKHVzKSAqLworCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBCQ01UUk1VWF9MT0cgcHJpbnRrCisjZWxzZQorI2RlZmluZSBCQ01UUk1VWF9MT0cgQkNNT1NfVFJBQ0VfSU5GTworI2VuZGlmCisKKy8qIENoYW5uZWwgcmVnaXN0cmF0aW9uIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgZl9iY210cl9yeF9oYW5kbGVyIHJ4OworICAgIHZvaWQgKmRhdGE7Cit9IGJjbXRybXV4X3J4X2luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgZl9iY210cl9sb2NhbF9yeF9oYW5kbGVyIHJ4OworICAgIHZvaWQgKmRhdGE7Cit9IGJjbXRybXV4X2xvY2FsX3J4X2luZm87CisKKy8qIFJlZ2lzdHJhdGlvbiBhcnJheXMgKi8KK3N0YXRpYyBiY210cm11eF9yeF9pbmZvIGJjbXRybXV4X3J4X2luZm9fYXJyYXlbQkNNVFJfTUFYX09MVFNdW0JDTVRSTVVYX01BWF9DSEFOTkVMU107CitzdGF0aWMgYmNtdHJtdXhfbG9jYWxfcnhfaW5mbyBiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W0JDTVRSX01BWF9PTFRTXTsKK3N0YXRpYyBiY210cm11eF9jaGFubmVsIGJjbXRybXV4X2F1dG9fY2hhbm5lbHNbQkNNVFJfTUFYX09MVFNdW0JDTVRSX01BWF9JTlNUQU5DRVNdW0JDTU9MVF9PQkpfSURfX05VTV9PRl07CitzdGF0aWMgYmNtdHJtdXhfY2hhbm5lbCBiY210cm11eF9wcm94eV9jaGFubmVsc1tCQ01UUl9NQVhfT0xUU11bQkNNVFJfTUFYX0lOU1RBTkNFU11bQkNNT0xUX09CSl9JRF9fTlVNX09GXTsKK3N0YXRpYyBiY21vc19ib29sIGJjbXRyX211eF9jb25uZWN0ZWRbQkNNVFJfTUFYX09MVFNdOworc3RhdGljIGJjbW9zX2Jvb2wgYmNtdHJfbXV4X3Rlcm1pbmF0ZWRbQkNNVFJfTUFYX09MVFNdOworc3RhdGljIGJjbW9zX2Jvb2wgYmNtdHJtdXhfZGV2X2N0cmxfaW50ZXJjZXB0W0JDTVRSX01BWF9PTFRTXVtCQ01PTFRfR1JPVVBfSURfX05VTV9PRl07CisKKyNpZm5kZWYgSU5fQkFORAorCisvKiBOdW1iZXIgb2YgcmVnaXN0ZXJlZCBoaWdoLXByaW9yaXR5IGNoYW5uZWxzICovCitzdGF0aWMgYmNtdHJtdXhfY2hhbm5lbCBudW1fdXJnZW50X2NoYW5uZWxzW0JDTVRSX01BWF9PTFRTXTsKKworLyogUmVjZWl2ZSBzZW1hcGhvcmUgKi8KK3N0YXRpYyBiY21vc19zZW0gYmNtdHJtdXhfcnhfbG9ja1tCQ01UUl9NQVhfT0xUU107CisKKyNlbmRpZgorCisvKiBTdGF0aXN0aWNzICovCitzdGF0aWMgYmNtdHJtdXhfc3RhdCBiY210cm11eF9zdGF0X2FycmF5W0JDTVRSX01BWF9PTFRTXTsKKworLyogUmVjZWl2ZSB0YXNrcyAqLworc3RhdGljIGJjbW9zX3Rhc2sgYmNtdHJtdXhfcnhfdGFza1tCQ01UUl9NQVhfT0xUU107CisKKy8qIFJlZ2lzdHJhdGlvbiBwcm90ZWN0aW9uICovCitzdGF0aWMgYmNtb3NfZmFzdGxvY2sgYmNtdHJtdXhfbG9jazsKKworc3RhdGljIHZvaWQgYmNtdHJtdXhfcnhfYXV0b19wcm94eShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGJjbXRybXV4X3J4X2xvY2FsKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9zX2J1ZiAqYnVmLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIHZvaWQgKmRhdGEpOworCitzdGF0aWMgYmNtdHJtdXhfbXNnX2ZpbHRlcl9jYl90IGJjbXRybXV4X21zZ19maWx0ZXJfY2I7CisKKy8qIGRpc2NhcmQgcGFja2V0IGZvciB3aGljaCB0aGVyZSBpcyBubyByZWdpc3RyYXRpb24gKi8KK3N0YXRpYyB2b2lkIGJjbXRybXV4X3J4X2Rpc2NhcmQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfYnVmICpidWYsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCwgdm9pZCAqZGF0YSkKK3sKKyAgICB1aW50MzJfdCAqY291bnRlciA9ICh1aW50MzJfdCAqKWRhdGE7CisgICAgKysoKmNvdW50ZXIpOworICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7Cit9CisKKy8qIGRpc2NhcmQgdW5wYWNrZWQgbWVzc2FnZSBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gcmVnaXN0cmF0aW9uICovCitzdGF0aWMgdm9pZCBiY210cm11eF9sb2NhbF9yeF9kaXNjYXJkKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgdm9pZCAqZGF0YSkKK3sKKyAgICB1aW50MzJfdCAqY291bnRlciA9ICh1aW50MzJfdCAqKWRhdGE7CisgICAgKysoKmNvdW50ZXIpOworICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworfQorCisvKiBGaW5kIGZyZWUgY2hhbm5lbC4gcmV0dXJucyBjaGFubmVsIGlkID49IDAgb3IgQkNNVFJNVVhfTUFYX0NIQU5ORUxTIGlmIG5vIGZyZWUgY2hhbm5lbHMgKi8KK3N0YXRpYyBpbnQgYmNtdHJtdXhfY2hhbm5lbF9nZXRfZnJlZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGludCBpOworICAgIC8qIFN0YXJ0IGZyb20gQkNNVFJNVVhfQ0hBTk5FTF9GSVJTVF9GUkVFLiBDaGFubmVsIDAgaXMgcmVzZXJ2ZWQgZm9yIGluZGljYXRpb25zL3Byb3h5ICwgQ2hhbm5lbCAxIGlzIGZvciBLZWVwIEFsaXZlKi8KKyAgICBmb3IgKGk9QkNNVFJNVVhfQ0hBTk5FTF9GSVJTVF9GUkVFOyBpPEJDTVRSTVVYX0ZJUlNUX1VSR0VOVF9DSEFOTkVMOyBpKyspCisgICAgeworICAgICAgICBpZiAoYmNtdHJtdXhfcnhfaW5mb19hcnJheVtkZXZpY2VdW2ldLnJ4ID09IGJjbXRybXV4X3J4X2Rpc2NhcmQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKKyNpZm5kZWYgSU5fQkFORAorLyogUENJZSBSZWNlaXZlIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgX2JjbXRybXV4X3BjaWVfcnhfaGFuZGxlcihsb25nIGRldmljZSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICB1aW50MzJfdCBuYnVmW0JDTVRSX1BDSUVfUFJUWV9fTlVNX09GXSA9IHt9OworICAgIHVpbnQ4X3QgY2g7CisKKyAgICBCVUdfT04oZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKTsKKworICAgIEJDTVRSTVVYX0xPRygicnhfdGFzayglbGQpIC0gc3RhcnRlZFxuIiwgZGV2aWNlKTsKKworICAgIC8qIEVuYWJsZSByeCBpbnRlcnJ1cHQgKi8KKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgYmNtdHJfcGNpZV9yeGludF9lbmFibGUoZGV2aWNlKTsKKyAgICAgICAgYmNtb3Nfc2VtX3dhaXQoJmJjbXRybXV4X3J4X2xvY2tbZGV2aWNlXSwgQkNNVFJNVVhfTUFYX1JYX0RFTEFZKTsKKworICAgICAgICBpZiAoIWJjbXRyX211eF9jb25uZWN0ZWRbZGV2aWNlXSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogV2FpdCBmb3IgcmVjZWl2ZSAqLworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICAgICAgcmMgPSBiY210cl9zd3FfcmVjZWl2ZShkZXZpY2UsIEJDTVRSX1BDSUVfUFJUWV9OT1JNQUwsICZjaCwgJmJ1Zik7CisgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSWYgRE1BIGlzIG5vdCBzaGFyZWQgd2l0aCB1cmdlbnQgc2VydmljZSwgcG9sbCBSWFEgaGVyZSwKKyAgICAgICAgICAgICAgICAgKiBkb24ndCB3YWl0IGZvciBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9RVUVVRV9FTVBUWSAmJiAhbnVtX3VyZ2VudF9jaGFubmVsc1tkZXZpY2VdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtdHJfcGNpZV9yeGludF9kaXNhYmxlKGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGJjbXRyX3N3cV9yeF9wb2xsKGRldmljZSwgbmJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGJjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9wb2xsX25vcm1hbCArPSBuYnVmW0JDTVRSX1BDSUVfUFJUWV9OT1JNQUxdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciBpbnRlcnJ1cHQgb3Igc2VtYXBob3JlIHRpbWVvdXQgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJjbXRybXV4X3J4X2Zyb21fbGluZSgoYmNtb2x0X2RldmlkKWRldmljZSwgKGJjbXRybXV4X2NoYW5uZWwpY2gsIGJ1Zik7CisgICAgICAgIH0gd2hpbGUgKGJjbXRyX211eF9jb25uZWN0ZWRbZGV2aWNlXSk7CisgICAgfQorICAgIEJDTVRSTVVYX0xPRygicnhfdGFzayglbGQpIC0gdGVybWluYXRlZFxuIiwgZGV2aWNlKTsKKyAgICBiY210cl9tdXhfdGVybWluYXRlZFtkZXZpY2VdID0gQkNNT1NfVFJVRTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiY210cm11eF9yeF9pcnEoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICB1aW50OF90IGNoOworICAgIHVpbnQzMl90IG5idWZbQkNNVFJfUENJRV9QUlRZX19OVU1fT0ZdID0ge307CisKKyAgICBiY210cl9wY2llX3J4aW50X2Rpc2FibGUoZGV2aWNlKTsKKyAgICBiY210cl9wY2llX3J4aW50X2NsZWFyKGRldmljZSk7CisgICAgYmNtdHJfc3dxX3J4X3BvbGwoZGV2aWNlLCBuYnVmKTsKKworICAgIC8qIEdvdCBzb21lIHBhY2tldHMuIERlbGl2ZXIgaGlnaCBwcmlvcml0eSBmcm9tIGludGVycnVwdCBsZXZlbCAqLworICAgIGlmIChuYnVmW0JDTVRSX1BDSUVfUFJUWV9VUkdFTlRdKQorICAgIHsKKyAgICAgICAgYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnJ4X3BvbGxfdXJnZW50ICs9IG5idWZbQkNNVFJfUENJRV9QUlRZX1VSR0VOVF07CisgICAgICAgIHdoaWxlIChiY210cl9zd3FfcmVjZWl2ZShkZXZpY2UsIEJDTVRSX1BDSUVfUFJUWV9VUkdFTlQsICZjaCwgJmJ1ZikgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJtdXhfcnhfZnJvbV9saW5lKGRldmljZSwgY2gsIGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBub3JtYWwgcHJpb3JpdHkgKi8KKyAgICBpZiAobmJ1ZltCQ01UUl9QQ0lFX1BSVFlfTk9STUFMXSkKKyAgICB7CisgICAgICAgIGJjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9wb2xsX25vcm1hbCArPSBuYnVmW0JDTVRSX1BDSUVfUFJUWV9OT1JNQUxdOworICAgICAgICBiY21vc19zZW1fcG9zdCgmYmNtdHJtdXhfcnhfbG9ja1tkZXZpY2VdKTsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgcnggaW50ZXJydXB0ICovCisgICAgYmNtdHJfcGNpZV9yeGludF9lbmFibGUoZGV2aWNlKTsKKworICAgIHJldHVybjsKK30KKworLyogVHggY29uZmlybWF0aW9uIGludGVycnVwdCBoYW5kbGVyLgorICogVXNlZCBvbmx5IGlmIHRoZXJlIGFyZSB1cmdlbnQgY2hhbm5lbHMKKyAqLworc3RhdGljIHZvaWQgYmNtdHJtdXhfdHhfaXJxKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgLyogRGlzYWJsZSBhbmQgY2xlYXIgdHJhbnNtaXQgY29tcGxldGlvbiBpbnRlcnJ1cHRzICovCisgICAgYmNtdHJfcGNpZV90eGludF9kaXNhYmxlKGRldmljZSk7CisgICAgYmNtdHJfcGNpZV90eGludF9jbGVhcihkZXZpY2UpOworICAgIC8qIFN1Ym1pdCBidWZmZXJzIHBlbmRpbmcgaW4gc3cgcXVldWUgdG8gdGhlIGgvdyBxdWV1ZSAqLworICAgIGJjbXRyX3N3cV90eF9zdWJtaXQoZGV2aWNlKTsKKyAgICAvKiBSZS1lbmFibGUgdHggY29tcGxldGlvbiBpbnRlcnJ1cHQgKi8KKyAgICBiY210cl9wY2llX3R4aW50X2VuYWJsZShkZXZpY2UpOworICAgIHJldHVybjsKK30KKworLyogSW5pdCBQQ0lFIHRyYW5zcG9ydCAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRybXV4X3BjaWVfaW5pdChiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCB0eHFfc2l6ZSwgdWludDMyX3QgcnhxX3NpemUpCit7CisgICAgdWludDMyX3QgcGNpZV9jb29raWVbQkNNT1NfUk9VTkRfVVAoUENJRV9PUEFRVUVfREFUQV9TSVpFLCBzaXplb2YodWludDMyX3QpKS9zaXplb2YodWludDMyX3QpXTsKKyAgICBiY210cl9wY2llX3ByZV9jb25uZWN0X2NmZyBjZmc7CisgICAgYmNtX2xsX2Rldl9pbmZvIGxsX2luZm87CisgICAgaW50IG5pdGVyID0gMDsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb3NfYm9vbCBzdGF0dXM7CisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIGVyciA9IGJjbV9sbF9wY2llX3F1ZXJ5KGRldmljZSwgJmxsX2luZm8pOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oZXJyLCAiYmNtX2xsX3BjaWVfcXVlcnkoKSBmYWlsZWRcbiIpOworICAgIH0KKyNlbmRpZgorCisgICAgQkNNVFJNVVhfTE9HKCJXYWl0aW5nIGZvciBCQ002ODYyMCBhcHBsaWNhdGlvblxuIik7CisgICAgYmNtX2ZsZF9zZXRfcmluZ3Nfc2l6ZShkZXZpY2UsIHR4cV9zaXplLCByeHFfc2l6ZSk7CisgICAgc3RhdHVzID0gYmNtX2ZsZF90ZXN0X2RldmljZV9ib290cmVjb3JkX2ZsYWcoZGV2aWNlKTsKKworICAgIC8qIFdhaXQgZm9yIGVtYmVkZGVkIGhhbmRzaGFrZS4gQkNNVFJfUENJRV9TVEFSVF9USU1FT1VUIGlzIGluIG1zICovCisgICAgZm9yIChuaXRlciA9IDA7CisgICAgICAgICBuaXRlciA8IEJDTVRSX1BDSUVfU1RBUlRfVElNRU9VVCAvIDEwICYmICEoc3RhdHVzID0gYmNtX2ZsZF90ZXN0X2RldmljZV9ib290cmVjb3JkX2ZsYWcoZGV2aWNlKSk7CisgICAgICAgICBuaXRlcisrKQorICAgIHsKKyAgICAgICAgYmNtb3NfdXNsZWVwKDEwMDAwKTsKKyAgICB9CisgICAgaWYgKCFzdGF0dXMpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTywgIkJDTTY4NjIwIGFwcGxpY2F0aW9uIHRpbWVvdXRcbiIpOworICAgIH0KKworICAgIGVyciA9IGJjbV9mbGRfZ2V0X2RldmljZV9ib290cmVjb3JkKGRldmljZSwgcGNpZV9jb29raWUpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihlcnIsICJiY21fZmxkX2dldF9kZXZpY2VfYm9vdHJlY29yZCgpIGZhaWxlZFxuIik7CisgICAgfQorCisgICAgLyogc2V0IGhvc3QgcHJtIGJpdCAtIGluZGljYXRlIGhvc3QgcmVhZHkgdG8gc2VuZC9yZWNlaXZlIERNQSAqLworICAgIGJjbV9mbGRfY2xlYXJfZGV2aWNlX2Jvb3RyZWNvcmRfZmxhZyhkZXZpY2UpOworCisgICAgY2ZnLnR4cV9zaXplID0gdHhxX3NpemU7ICAgICAgICAgICAgIC8qIFRyYW5zbWl0IHF1ZXVlIHNpemUgKi8KKyAgICBjZmcucnhxX3NpemUgPSByeHFfc2l6ZTsgICAgICAgICAgICAgLyogUmVjZWl2ZSBxdWV1ZSBzaXplICovCisgICAgY2ZnLm1heF9tdHUgPSBCQ01UUl9NQVhfTVRVX1NJWkU7ICAgIC8qIE1heCBNVFUgc2l6ZSAqLworICAgIGNmZy5wY2llX3JlZ19iYXNlID0gbGxfaW5mby5zb2NfcmVnc19iYXNlOworICAgIGNmZy5kZHJfd2luX2Jhc2UgPSBsbF9pbmZvLnNvY19kZHJfYmFzZTsKKyAgICBjZmcucnhfaXJxID0gbGxfaW5mby5pcnE7CisKKyAgICBlcnIgPSBiY210cl9wY2llX3ByZV9jb25uZWN0KGRldmljZSwgJmNmZywgKGJjbXRyX3BjaWVfb3BhcXVlX2RhdGEgKilwY2llX2Nvb2tpZSk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihlcnIsICJiY210cl9wY2llX3ByZV9jb25uZWN0KCkgZmFpbGVkXG4iKTsKKyAgICB9CisKKyAgICBlcnIgPSBiY210cl9wY2llX2Nvbm5lY3QoZGV2aWNlLChiY210cl9wY2llX29wYXF1ZV9kYXRhICopcGNpZV9jb29raWUpOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oZXJyLCAiYmNtdHJfcGNpZV9jb25uZWN0KCkgZmFpbGVkXG4iKTsKKyAgICB9CisKKyAgICBiY21fZmxkX3NldF9ob3N0X2Jvb3RyZWNvcmRfZmxhZyhkZXZpY2UpOworCisgICAgLyogV2FpdCBmb3IgZW1iZWRkZWQgaGFuZHNoYWtlLiBCQ01UUl9QQ0lFX0NPTk5FQ1RfVElNRU9VVCBpcyBpbiBtcyAqLworICAgIGZvciAobml0ZXIgPSAwOworICAgICAgICAgbml0ZXIgPCBCQ01UUl9QQ0lFX0NPTk5FQ1RfVElNRU9VVCAvIDEwICYmIChzdGF0dXMgPSBiY21fZmxkX3Rlc3RfaG9zdF9ib290cmVjb3JkX2ZsYWcoZGV2aWNlKSk7CisgICAgICAgICBuaXRlcisrKQorICAgIHsKKyAgICAgICAgYmNtb3NfdXNsZWVwKDEwMDAwKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0lPLCAiQkNNNjg2MjAgY29ubmVjdCB0aW1lb3V0XG4iKTsKKyAgICB9CisKKyAgICBCQ01UUk1VWF9MT0coIlBDSSB0cmFuc3BvcnQ6IGluaXRpYWxpemVkXG4iKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjZWxzZSAvKiAjaWZuZGVmIElOX0JBTkQgKi8KKworLyogSU4tQkFORCByZWNlaXZlIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgX2JjbXRybXV4X2liX3J4X2hhbmRsZXIobG9uZyBkZXZpY2UpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb3NfYnVmICpidWY7CisgICAgdWludDhfdCBjaDsKKworICAgIEJVR19PTihkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpOworCisgICAgQkNNVFJNVVhfTE9HKCJyeF90YXNrKCVsZCkgLSBzdGFydGVkXG4iLCBkZXZpY2UpOworCisgICAgd2hpbGUgKGJjbXRyX211eF9jb25uZWN0ZWRbZGV2aWNlXSkKKyAgICB7CisgICAgICAgIC8qIFdhaXQgZm9yIHJlY2VpdmUgKi8KKyAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgcmMgPSBiY210cl9pYl9yZWNlaXZlKGRldmljZSwgJmNoLCAmYnVmKTsKKyAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRybXV4X3J4X2Zyb21fbGluZSgoYmNtb2x0X2RldmlkKWRldmljZSwgKGJjbXRybXV4X2NoYW5uZWwpY2gsIGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBCQ01UUk1VWF9MT0coInJ4X3Rhc2soJWxkKSAtIHRlcm1pbmF0ZWRcbiIsIGRldmljZSk7CisgICAgYmNtdHJfbXV4X3Rlcm1pbmF0ZWRbZGV2aWNlXSA9IEJDTU9TX1RSVUU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRybXV4X2liX2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSwgIGJjbW9zX2lwdjRfYWRkcmVzcyBpcF9hZGRyZXNzLCB1aW50MTZfdCB1ZHBfcG9ydCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtdHJfaWJfY29ubmVjdCgodWludDhfdClkZXZpY2UsIGlwX2FkZHJlc3MsIHVkcF9wb3J0KTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBCQ01UUk1VWF9MT0coIiVzOiBGYWlsZWQgdG8gY29ubmVjdC4gRXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworI2VuZGlmIC8qICNpZm5kZWYgSU5fQkFORCAqLworCisKKy8qKiBJbml0aWFsaXplIG11eCBzZXJ2aWNlCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfaW5pdChiY210cm11eF9tc2dfZmlsdGVyX2NiX3QgbXNnX2ZpbHRlcl9jYikKK3sKKyAgICBzdGF0aWMgYmNtb3NfYm9vbCBpbml0aWFsaXplZCA9IEJDTU9TX0ZBTFNFOworICAgIGludCBpLCBqOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgYmNtdHJtdXhfbXNnX2ZpbHRlcl9jYiA9IG1zZ19maWx0ZXJfY2I7CisKKyAgICBCQ01UUk1VWF9MT0coIkluaXRpYWxpc2luZyB0cmFuc3BvcnQgTVVYIHN1YnN5c3RlbVxuIik7CisgICAgaWYgKGluaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqPTA7IGo8QkNNVFJNVVhfTUFYX0NIQU5ORUxTOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRybXV4X3J4X2luZm9fYXJyYXlbaV1bal0ucnggPSBiY210cm11eF9yeF9kaXNjYXJkOworICAgICAgICAgICAgYmNtdHJtdXhfcnhfaW5mb19hcnJheVtpXVtqXS5kYXRhID0gJmJjbXRybXV4X3N0YXRfYXJyYXlbaV0ucnhfZGlzY19yZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgYmNtdHJtdXhfcnhfaW5mb19hcnJheVtpXVtCQ01UUk1VWF9DSEFOTkVMX0FVVE9fUFJPWFldLnJ4ID0gYmNtdHJtdXhfcnhfYXV0b19wcm94eTsKKyAgICAgICAgYmNtdHJtdXhfcnhfaW5mb19hcnJheVtpXVtCQ01UUk1VWF9DSEFOTkVMX0FVVE9fUFJPWFldLmRhdGEgPSBOVUxMOworICAgICAgICBiY210cm11eF9yeF9pbmZvX2FycmF5W2ldW0JDTVRSTVVYX0NIQU5ORUxfREVWX0NPTlRST0xdLnJ4ID0gYmNtdHJtdXhfcnhfbG9jYWw7CisgICAgICAgIGJjbXRybXV4X3J4X2luZm9fYXJyYXlbaV1bQkNNVFJNVVhfQ0hBTk5FTF9ERVZfQ09OVFJPTF0uZGF0YSA9IE5VTEw7CisgICAgICAgIGZvciAoaj0wOyBqPEJDTVRSX01BWF9JTlNUQU5DRVM7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X29ial9pZCBrOworICAgICAgICAgICAgZm9yIChrPTA7IGs8QkNNT0xUX09CSl9JRF9fTlVNX09GOyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtdHJtdXhfYXV0b19jaGFubmVsc1tpXVtqXVtrXSA9IEJDTVRSTVVYX01BWF9DSEFOTkVMUzsKKyAgICAgICAgICAgICAgICBiY210cm11eF9wcm94eV9jaGFubmVsc1tpXVtqXVtrXSA9IEJDTVRSTVVYX01BWF9DSEFOTkVMUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2ldLnJ4ID0gYmNtdHJtdXhfbG9jYWxfcnhfZGlzY2FyZDsKKyAgICAgICAgYmNtdHJtdXhfbG9jYWxfcnhfaW5mb19hcnJheVtpXS5kYXRhID0gJmJjbXRybXV4X3N0YXRfYXJyYXlbaV0udHhfZGlzY19sb2NhbDsKKyAgICB9CisKKyAgICBiY21vc19mYXN0bG9ja19pbml0KCZiY210cm11eF9sb2NrLCAwKTsKKworICAgIC8qRG9uJ3QgaW5pdGlhbGl6ZSBhdCB0aGlzIHRpbWUgZm9yIFVzZXIgU3BhY2UgZGV2IGN0cmwsCisgICAgICBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiovCisjaWZuZGVmIElOX0JBTkQKKyAgICByYyA9IGJjbXRyX3BjaWVfaW5pdChCQ01UUl9NQVhfT0xUUyk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKHJjLCAiYmNtdHJfcGNpZV9pbml0KCkgZmFpbGVkXG4iKTsKKyAgICB9CisKKyAgICByYyA9IGJjbXRyX3N3cV9pbml0KCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKHJjLCAiYmNtdHJfc3dxX2luaXQoKSBmYWlsZWRcbiIpOworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIHJ4IGNhbGxiYWNrIGluIFBDSWUgZHJpdmVyICovCisgICAgYmNtdHJfcGNpZV9yeF9pcnFfY2Jsa19yZWdpc3RlcihiY210cm11eF9yeF9pcnEpOworICAgIGJjbXRyX3BjaWVfdHhfaXJxX2NibGtfcmVnaXN0ZXIoYmNtdHJtdXhfdHhfaXJxKTsKKyNlbHNlCisKKyAgICByYyA9IGJjbXRyX2liX2luaXQoKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4ocmMsICJiY210cl9pYl9pbml0KCkgZmFpbGVkXG4iKTsKKyAgICB9CisKKyNlbmRpZiAvKiAjaWZuZGVmIElOX0JBTkQgKi8KKworICAgIEJDTVRSTVVYX0xPRygiVHJhbnNwb3J0IE1VWCBpbml0IGRvbmVcbiIpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKiogTm90aWZ5IG11eCBkcml2ZXIgdGhhdCBsb3ctbGV2ZWwgdHJhbnNwb3J0IGNvbm5lY3Rpb24gaXMgcmVhZHkKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCisjaWZkZWYgSU5fQkFORAorYmNtb3NfZXJybm8gYmNtdHJtdXhfY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlLCAgYmNtb3NfaXB2NF9hZGRyZXNzIGlwX2FkZHJlc3MsIHVpbnQxNl90IHVkcF9wb3J0KQorI2Vsc2UKK2JjbW9zX2Vycm5vIGJjbXRybXV4X2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDMyX3QgdHhxX3NpemUsIHVpbnQzMl90IHJ4cV9zaXplKQorI2VuZGlmCit7CisgICAgc3RhdGljIGNoYXIgdGFza19uYW1lW0JDTVRSX01BWF9PTFRTXVsxNl07CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2twID0ge307CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoYmNtdHJfbXV4X2Nvbm5lY3RlZFtkZXZpY2VdKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICBzbnByaW50Zih0YXNrX25hbWVbZGV2aWNlXSwgc2l6ZW9mKHRhc2tfbmFtZVtkZXZpY2VdKSwgImJjbXRyX3J4JWQiLCBkZXZpY2UpOworICAgIHRhc2twLmRhdGEgPSAobG9uZylkZXZpY2U7CisgICAgdGFza3AubmFtZSA9IHRhc2tfbmFtZVtkZXZpY2VdOworCisjaWZkZWYgSU5fQkFORAorICAgIHJjID0gYmNtdHJtdXhfaWJfY29ubmVjdChkZXZpY2UsIGlwX2FkZHJlc3MsIHVkcF9wb3J0KTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBCQ01UUk1VWF9MT0coIiVzOiBGYWlsZWQgdG8gaW5pdCBpbmJhbmQgZGV2aWNlLiBFcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgdGFza3AuaGFuZGxlciA9IF9iY210cm11eF9pYl9yeF9oYW5kbGVyOworI2Vsc2UKKyAgICByYyA9IGJjbW9zX3NlbV9jcmVhdGUoJmJjbXRybXV4X3J4X2xvY2tbZGV2aWNlXSwgMCwgMCwgTlVMTCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNVFJNVVhfTE9HKCIlczogRmFpbGVkIHRvIGNyZWF0ZSByeCBsb2NrLiBFcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGxvdy1sZXZlbCBQQ0llIHRyYW5zcG9ydCAqLworICAgIHJjID0gYmNtdHJtdXhfcGNpZV9pbml0KGRldmljZSwgdHhxX3NpemUsIHJ4cV9zaXplKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBiY21vc19zZW1fZGVzdHJveSgmYmNtdHJtdXhfcnhfbG9ja1tkZXZpY2VdKTsKKyAgICAgICAgQkNNVFJNVVhfTE9HKCIlczogRmFpbGVkIHRvIGluaXQgbG93LWxldmVsIFBDSWUgdHJhbnNwb3J0LiBFcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgdGFza3AuaGFuZGxlciA9IF9iY210cm11eF9wY2llX3J4X2hhbmRsZXI7CisKKyAgICByYyA9IGJjbXRyX3N3cV9kZXZpY2VfaW5pdChkZXZpY2UpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGJjbW9zX3NlbV9kZXN0cm95KCZiY210cm11eF9yeF9sb2NrW2RldmljZV0pOworICAgICAgICBCQ01UUk1VWF9MT0coIiVzOiBGYWlsZWQgdG8gaW5pdCBwY2llX3N3cS4gRXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisjZW5kaWYKKyAgICBiY210cl9tdXhfY29ubmVjdGVkW2RldmljZV0gPSBCQ01PU19UUlVFOworICAgIGJjbXRyX211eF90ZXJtaW5hdGVkW2RldmljZV0gPSBCQ01PU19GQUxTRTsKKworICAgIHJjID0gYmNtb3NfdGFza19jcmVhdGUoJmJjbXRybXV4X3J4X3Rhc2tbZGV2aWNlXSwgJnRhc2twKTsKKyAgICBpZiAocmMpCisgICAgeworI2lmbmRlZiBJTl9CQU5ECisgICAgICAgIGJjbW9zX3NlbV9kZXN0cm95KCZiY210cm11eF9yeF9sb2NrW2RldmljZV0pOworI2VuZGlmCisgICAgICAgIGJjbXRyX211eF9jb25uZWN0ZWRbZGV2aWNlXSA9IEJDTU9TX0ZBTFNFOworICAgICAgICBCQ01UUk1VWF9MT0coIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHJ4IHRhc2suIEVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogTm90aWZ5IG11eCBkcml2ZXIgdGhhdCBsb3ctbGV2ZWwgdHJhbnNwb3J0IGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfZGlzY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGlmICghYmNtdHJfbXV4X2Nvbm5lY3RlZFtkZXZpY2VdKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisgICAgYmNtdHJfbXV4X2Nvbm5lY3RlZFtkZXZpY2VdID0gQkNNT1NfRkFMU0U7CisjaWZkZWYgSU5fQkFORAorICAgIGJjbXRyX2liX2Rpc2Nvbm5lY3QoKHVpbnQ4X3QpZGV2aWNlKTsKKyNlbHNlCisgICAgYmNtb3Nfc2VtX3Bvc3QoJmJjbXRybXV4X3J4X2xvY2tbZGV2aWNlXSk7CisjZW5kaWYKKyAgICB3aGlsZSAoIWJjbXRyX211eF90ZXJtaW5hdGVkW2RldmljZV0pCisgICAgeworICAgICAgICBiY21vc191c2xlZXAoMTAwMDApOworICAgIH0KKyAgICBiY21vc190YXNrX2Rlc3Ryb3koJmJjbXRybXV4X3J4X3Rhc2tbZGV2aWNlXSk7CisjaWZuZGVmIElOX0JBTkQKKyAgICBiY21vc19zZW1fZGVzdHJveSgmYmNtdHJtdXhfcnhfbG9ja1tkZXZpY2VdKTsKKyAgICBiY210cl9zd3FfZGV2aWNlX2V4aXQoZGV2aWNlKTsKKyAgICBiY210cl9wY2llX2Rpc2Nvbm5lY3QoKHVpbnQ4X3QpZGV2aWNlKTsKKyNlbmRpZgorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogQ2xlYW51cCBhbmQgZXhpdAorICovCit2b2lkIGJjbXRybXV4X2V4aXQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIEJDTVRSTVVYX0xPRygiQ2xlYW5pbmcgdXAgdHJhbnNwb3J0IE1VWCBzdWJzeXN0ZW1cbiIpOworI2lmbmRlZiBJTl9CQU5ECisgICAgYmNtdHJfc3dxX2V4aXQoKTsKKyAgICBiY210cl9wY2llX3J4X2lycV9jYmxrX3VucmVnaXN0ZXIoKTsKKyAgICBiY210cl9wY2llX3R4X2lycV9jYmxrX3VucmVnaXN0ZXIoKTsKKyNlbmRpZgorICAgIC8qIGtpbGwgcmVjZWl2ZSB0YXNrcyAqLworICAgIGZvciAoaT0wOyBpPEJDTVRSX01BWF9PTFRTOyBpKyspCisgICAgeworICAgICAgICBiY210cm11eF9kaXNjb25uZWN0KChiY21vbHRfZGV2aWQpaSk7CisgICAgfQorI2lmZGVmIElOX0JBTkQKKyAgICBiY210cl9pYl9leGl0KCk7CisjZWxzZQorICAgIGJjbXRyX3BjaWVfZXhpdCgpOworI2VuZGlmCisgICAgQkNNVFJNVVhfTE9HKCJUcmFuc3BvcnQgTVVYIGNsZWFudXAgZG9uZVxuIik7Cit9CisKKy8qKiBSZWdpc3RlciBQQ0llIGNoYW5uZWwgb3duZXIgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfY2hhbm5lbCAqY2hhbm5lbCwKKyAgICBmX2JjbXRyX3J4X2hhbmRsZXIgcngsIHZvaWQgKmRhdGEpCit7CisgICAgYmNtdHJtdXhfY2hhbm5lbCBjaDsKKyAgICBsb25nIGZsYWdzOworCisgICAgaWYgKCh1bnNpZ25lZClkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMgfHwgIWNoYW5uZWwgfHwgIXJ4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgY2ggPSAqY2hhbm5lbDsKKworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmYmNtdHJtdXhfbG9jayk7CisKKyAgICBpZiAoY2ggPT0gQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX0FTU0lHTikKKyAgICB7CisgICAgICAgIC8qIEF1dG8tYXNzaWduIGZyZWUgY2hhbm5lbCAqLworICAgICAgICBjaCA9IChiY210cm11eF9jaGFubmVsKWJjbXRybXV4X2NoYW5uZWxfZ2V0X2ZyZWUoZGV2aWNlKTsKKyAgICAgICAgaWYgKGNoID49IEJDTVRSTVVYX01BWF9DSEFOTkVMUykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY210cm11eF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSB0aGF0IGNoYW5uZWwgaXMgdmFsaWQgYW5kIG5vdCBidXN5ICovCisgICAgaWYgKCh1bnNpZ25lZCljaCA+PSBCQ01UUk1VWF9NQVhfQ0hBTk5FTFMpCisgICAgeworICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmJjbXRybXV4X2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKGJjbXRybXV4X3J4X2luZm9fYXJyYXlbZGV2aWNlXVtjaF0ucnggIT0gYmNtdHJtdXhfcnhfZGlzY2FyZCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtdHJtdXhfbG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgIH0KKworICAgIC8qIEFzc2lnbiBjaGFubmVsICovCisgICAgYmNtdHJtdXhfcnhfaW5mb19hcnJheVtkZXZpY2VdW2NoXS5yeCA9IHJ4OworICAgIGJjbXRybXV4X3J4X2luZm9fYXJyYXlbZGV2aWNlXVtjaF0uZGF0YSA9IGRhdGE7CisKKyNpZm5kZWYgSU5fQkFORAorICAgIC8qIFVyZ2VudCBjaGFubmVscyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgSU4tQkFORCBtYW5hZ2VtZW50ICovCisgICAgaWYgKGNoID49IEJDTVRSTVVYX0ZJUlNUX1VSR0VOVF9DSEFOTkVMKQorICAgIHsKKyAgICAgICAgLyogV2UgdXNlIHRyYW5zbWl0IGNvbmZpcm1hdGlvbiBpbnRlcnJ1cHQgdG8ga2ljayB0cmFuc21pc3Npb24KKyAgICAgICAgICogaWYgUENJIGJ1cyBpcyBzaGFyZWQgYmV0d2VlbiBoaWdoIGFuZCBsb3ctcHJpb3JpdHkgY2hhbm5lbHMKKyAgICAgICAgICovCisgICAgICAgIGlmICghbnVtX3VyZ2VudF9jaGFubmVsc1tkZXZpY2VdKQorICAgICAgICAgICAgYmNtdHJfcGNpZV90eGludF9lbmFibGUoZGV2aWNlKTsKKyAgICAgICAgKytudW1fdXJnZW50X2NoYW5uZWxzW2RldmljZV07CisgICAgfQorI2VuZGlmCisKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmJjbXRybXV4X2xvY2ssIGZsYWdzKTsKKworICAgICpjaGFubmVsID0gY2g7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKiogUmVsZWFzZSBQQ0llIGNoYW5uZWwgYWxsb2NhdGVkIGJ5IGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIoKQorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNoYW5uZWwKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cm11eF9jaGFubmVsX3VucmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsKQoreworICAgIGxvbmcgZmxhZ3M7CisKKyAgICBpZiAoKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyB8fCAodW5zaWduZWQpY2hhbm5lbCA+PSBCQ01UUk1VWF9NQVhfQ0hBTk5FTFMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmYmNtdHJtdXhfbG9jayk7CisKKyAgICBpZiAoYmNtdHJtdXhfcnhfaW5mb19hcnJheVtkZXZpY2VdW2NoYW5uZWxdLnJ4ID09IGJjbXRybXV4X3J4X2Rpc2NhcmQpCisgICAgeworICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmJjbXRybXV4X2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorCisgICAgYmNtdHJtdXhfcnhfaW5mb19hcnJheVtkZXZpY2VdW2NoYW5uZWxdLnJ4ID0gYmNtdHJtdXhfcnhfZGlzY2FyZDsKKyAgICBiY210cm11eF9yeF9pbmZvX2FycmF5W2RldmljZV1bY2hhbm5lbF0uZGF0YSA9ICZiY210cm11eF9zdGF0X2FycmF5W2RldmljZV0ucnhfZGlzY19yZW1vdGU7CisKKyNpZm5kZWYgSU5fQkFORAorICAgIC8qIFVyZ2VudCBjaGFubmVscyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgSU4tQkFORCBtYW5hZ2VtZW50ICovCisgICAgaWYgKGNoYW5uZWwgPj0gQkNNVFJNVVhfRklSU1RfVVJHRU5UX0NIQU5ORUwpCisgICAgeworICAgICAgICAtLW51bV91cmdlbnRfY2hhbm5lbHNbZGV2aWNlXTsKKyAgICAgICAgLyogSWYgUENJIGJ1cyBpcyBub3Qgc2hhcmVkIGJldHdlZW4gbm9ybWFsIGFuZCB1cmdlbnQgY2hhbm5lbHMsCisgICAgICAgICAqIHRyYW5zbWl0IGNvbmZpcm1hdGlvbiBtZWNoYW5pc20gaXMgbm90IG5lZWRlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFudW1fdXJnZW50X2NoYW5uZWxzW2RldmljZV0pCisgICAgICAgICAgICBiY210cl9wY2llX3R4aW50X2Rpc2FibGUoZGV2aWNlKTsKKyAgICB9CisjZW5kaWYKKworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtdHJtdXhfbG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qCisgKiBMb2NhbCB0ZXJtaW5hdGlvbiBoYW5kbGVyCisgKi8KKworLyogUmVnaXN0ZXIgbG9jYWwgdGVybWluYXRpb24gaGFuZGxlci4gKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2xvY2FsX2hhbmRsZXJfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgZl9iY210cl9sb2NhbF9yeF9oYW5kbGVyIHJ4LCB2b2lkICpkYXRhKQoreworICAgIGxvbmcgZmxhZ3M7CisKKyAgICBpZiAoKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyB8fCAhcngpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmJjbXRybXV4X2xvY2spOworICAgIGlmIChiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV0ucnggIT0gYmNtdHJtdXhfbG9jYWxfcnhfZGlzY2FyZCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtdHJtdXhfbG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgIH0KKyAgICBiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV0ucnggPSByeDsKKyAgICBiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV0uZGF0YSA9IGRhdGE7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY210cm11eF9sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyogVW5yZWdpc3RlciBsb2NhbCB0ZXJtaW5hdGlvbiBoYW5kbGVyIHJlZ2lzdGVyZWQgYnkgYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl9yZWdpc3RlcigpICovCitiY21vc19lcnJubyBiY210cm11eF9sb2NhbF9oYW5kbGVyX3VucmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBsb25nIGZsYWdzOworCisgICAgaWYgKCh1bnNpZ25lZClkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmJjbXRybXV4X2xvY2spOworICAgIGlmIChiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV0ucnggPT0gYmNtdHJtdXhfbG9jYWxfcnhfZGlzY2FyZCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtdHJtdXhfbG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICB9CisgICAgYmNtdHJtdXhfbG9jYWxfcnhfaW5mb19hcnJheVtkZXZpY2VdLmRhdGEgPSAmYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnR4X2Rpc2NfbG9jYWw7CisgICAgYmNtdHJtdXhfbG9jYWxfcnhfaW5mb19hcnJheVtkZXZpY2VdLnJ4ID0gYmNtdHJtdXhfbG9jYWxfcnhfZGlzY2FyZDsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmJjbXRybXV4X2xvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogRGVsaXZlciBtZXNzYWdlIHRvIGxvY2FsIGRlc3RpbmF0aW9uICovCitzdGF0aWMgYmNtb3NfYm9vbCBiY210cm11eF9kZWxpdmVyX3RvX2xvY2FsKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCwgYmNtb3NfYnVmICpidWYsIGJjbXRyX2hkciAqaGRyKQoreworICAgIGJjbXRybXV4X2xvY2FsX3J4X2luZm8gKnJ4X2luZm87CisgICAgYmNtb2x0X21zZyAqbXNnID0gTlVMTDsKKyAgICBiY21vbHRfYnVmIHVidWY7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgLyogVW5wYWNrICovCisgICAgYmNtb2x0X2J1Zl9pbml0KCZ1YnVmLCBiY21vc19idWZfbGVuZ3RoKGJ1ZiksIGJjbW9zX2J1Zl9kYXRhKGJ1ZiksIEJDTVRSX0JVRl9FTkRJQU4pOworICAgIGJjbW9sdF9idWZfc2tpcCgmdWJ1ZiwgQkNNVFJfSERSX1NJWkUpOworICAgIGVyciA9IGJjbW9sdF9tc2dfdW5wYWNrKCZ1YnVmLCAmbXNnKTsKKyAgICBiY21vc19idWZfZnJlZShidWYpOworICAgIGlmIChlcnIgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJNZXNzYWdlIHVucGFjayBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIpOworICAgICAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS50eF9kaXNjX2xvY2FsOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgbXNnLT5jb3JyX3RhZyA9IGhkci0+Y29ycl90YWc7CisgICAgbXNnLT5zdWJjaCA9IChiY21vbHRfc3ViY2hhbm5lbCljaGFubmVsOworICAgICsrYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnR4X2xvY2FsOworCisgICAgcnhfaW5mbyA9ICZiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV07CisgICAgcnhfaW5mby0+cngoZGV2aWNlLCBtc2csIHJ4X2luZm8tPmRhdGEpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKiBzZW5kIHRvIGxpbmUgd2l0aCByZXBldGl0aXZlIGF0dGVtcHRzIGlmIHBjaWUgYnVmZmVyIGlzIGZ1bGwgKi8KK3N0YXRpYyB2b2lkIGJjbXRybXV4X3NlbmRfdG9fbGluZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisjaWZkZWYgSU5fQkFORAorICAgIHJjID0gYmNtdHJfaWJfc2VuZCgodWludDhfdClkZXZpY2UsICh1aW50OF90KWNoYW5uZWwsIGJ1Zik7CisjZWxzZQorICAgIHJjID0gYmNtdHJfc3dxX3NlbmQoKHVpbnQ4X3QpZGV2aWNlLCBjaGFubmVsLCBidWYpOworI2VuZGlmCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBGYWlsZWQgKi8KKyAgICAgICAgKytiY210cm11eF9zdGF0X2FycmF5W2RldmljZV0udHhfZGlzY19yZW1vdGU7CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgfQorfQorCisvKiBSZWNlaXZlIG1lc3NhZ2UgZnJvbSBob3N0IGFwcGxpY2F0aW9uICovCit2b2lkIGJjbXRybXV4X3J4X2Zyb21faG9zdChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIGJjbXRyX2hkciBoZHI7CisgICAgYmNtb2x0X29ial9pZCBvYmo7CisgICAgYmNtb2x0X21ndF9ncm91cCBncm91cDsKKyAgICB1aW50MTZfdCBzdWJncm91cDsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtZXRlcnMgKi8KKyAgICBCVUdfT04oKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyk7CisgICAgQlVHX09OKCh1bnNpZ25lZCljaGFubmVsID49IEJDTVRSTVVYX01BWF9DSEFOTkVMUyk7CisKKyAgICAvKiBQZWVrIGluIHRyYW5zcG9ydCBoZWFkZXIuIEl0IGNvbnRhaW5zIGVub3VnaCBpbmZvIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIG1lc3NhZ2UgKi8KKyAgICBiY210cl9oZWFkZXJfdW5wYWNrKGJjbW9zX2J1Zl9kYXRhKGJ1ZiksICZoZHIpOworCisgICAgcmMgPSBiY21vbHRfZ3JvdXBfaWRfc3BsaXQoaGRyLm1zZ19pZCwgJm9iaiwgJmdyb3VwLCAmc3ViZ3JvdXApOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgZGVjb2RlIGdyb3VwX2lkICV1LiBFcnJvciAlcyAoJWQpXG4iLCBoZHIubXNnX2lkLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgKytiY210cm11eF9zdGF0X2FycmF5W2RldmljZV0udHhfZGlzY19yZW1vdGU7CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBGaWx0ZXIgYXV0by9wcm94eSAodW4pcmVnaXN0cmF0aW9uLgorICAgICAqIFRoaXMgbWVzc2FnZSBpcyB0ZXJtaW5hdGVkIGhlcmUuCisgICAgICovCisgICAgaWYgKGhkci5hdXRvX3Byb3h5X3JlZyB8fCBoZHIuYXV0b19wcm94eV91bnJlZykKKyAgICB7CisgICAgICAgIGJjbXRybXV4X2NoYW5uZWwgKnBfY2ggPSAoZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPKSA/CisgICAgICAgICAgICAmYmNtdHJtdXhfYXV0b19jaGFubmVsc1tkZXZpY2VdW2hkci5pbnN0YW5jZV1bb2JqXSA6ICZiY210cm11eF9wcm94eV9jaGFubmVsc1tkZXZpY2VdW2hkci5pbnN0YW5jZV1bb2JqXTsKKworICAgICAgICBiY21vc19idWZfZnJlZShidWYpOworCisgICAgICAgIC8qIFNhbml0eSBjaGVjayAqLworICAgICAgICBpZiAoaGRyLmluc3RhbmNlID49IEJDTVRSX01BWF9JTlNUQU5DRVMgfHwgb2JqID49IEJDTU9MVF9PQkpfSURfX05VTV9PRikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJJbnN0YW5jZSAldSBvciBvYmplY3QgJWQgaXMgaW5zYW5lXG4iLCBoZHIuaW5zdGFuY2UsIG9iaik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBEbyBub3Qgb3ZlcnJpZGUgYmNtb2x0X2Rldl9jdHJsIGZpbHRlcnMgKi8KKyAgICAgICAgaWYgKCpwX2NoICE9IEJDTVRSTVVYX0NIQU5ORUxfREVWX0NPTlRST0wpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwX2NoID0gaGRyLmF1dG9fcHJveHlfcmVnID8gY2hhbm5lbCA6IEJDTVRSTVVYX01BWF9DSEFOTkVMUzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBGaWx0ZXIgbWVzc2FnZSB0aGF0IHNob3VsZCBnbyB0byBsb2NhbCBkZXN0aW5hdGlvbiAoZGV2aWNlIGNvbnRyb2wpICovCisgICAgaWYgKGJjbXRybXV4X21zZ19maWx0ZXJfY2IgJiYgYmNtdHJtdXhfbXNnX2ZpbHRlcl9jYihkZXZpY2UsIG9iaiwgZ3JvdXAsIHN1Ymdyb3VwKSA9PSBCQ01UUk1VWF9ERVNUX0xPQ0FMKQorICAgIHsKKyAgICAgICAgaWYgKGJjbXRybXV4X2RlbGl2ZXJfdG9fbG9jYWwoZGV2aWNlLCBjaGFubmVsLCBidWYsICZoZHIpID09IEJDTU9TX1RSVUUpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogSGFuZGxlIFJlbW90ZSBtZXNzYWdlICovCisgICAgKytiY210cm11eF9zdGF0X2FycmF5W2RldmljZV0udHhfcmVtb3RlOworICAgIGJjbXRybXV4X3NlbmRfdG9fbGluZShkZXZpY2UsIGNoYW5uZWwsIGJ1Zik7Cit9CisKKworLyogUmVjZWl2ZSBwYWNrZXQgZnJvbSB0aGUgbGluZSBvciBsb2NhbCBjb250cm9sIHByb2Nlc3MuCisgKiBQYXJhbWV0ZXJzIGFyZSBleHBlY3RlZCB0byBiZSBjaGVja2VkIGJlZm9yZWhhbmQuCisgKiBUaGUgZnVuY3Rpb24gZGUtbXV4ZXMKKyAqIC0gcmVwbGllcyBiYXNlZCBvbiBjaGFubmVsCisgKiAtIGF1dG9ub21vdXMvcHJveHkgbWVzc2FnZXMgYmFzZWQgb24gcmVnaXN0cmF0aW9uIGluZm8KKyAqLworc3RhdGljIHZvaWQgYmNtdHJtdXhfcngoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCBiY21vc19idWYgKmJ1ZikKK3sKKyAgICBiY210cm11eF9yeF9pbmZvICpyeF9pbmZvOworICAgIHJ4X2luZm8gPSAmYmNtdHJtdXhfcnhfaW5mb19hcnJheVtkZXZpY2VdW2NoYW5uZWxdOworICAgIHJ4X2luZm8tPnJ4KGRldmljZSwgYnVmLCBjaGFubmVsLCByeF9pbmZvLT5kYXRhKTsKK30KKworCisvKiBSZWNlaXZlIHBhY2tldCBmcm9tIFBDSWUgaW50ZXJmYWNlICovCit2b2lkIGJjbXRybXV4X3J4X2Zyb21fbGluZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIEJVR19PTigodW5zaWduZWQpZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKTsKKworICAgIGlmICgodW5zaWduZWQpY2hhbm5lbCA+PSBCQ01UUk1VWF9NQVhfQ0hBTk5FTFMpCisgICAgeworICAgICAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9kaXNjX2ludl9jaDsKKyAgICAgICAgYmNtb3NfYnVmX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICsrYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnJ4X3JlbW90ZTsKKworICAgIGJjbXRybXV4X3J4KGRldmljZSwgY2hhbm5lbCwgYnVmKTsKK30KKworLyogSGFuZGxlIG1lc3NhZ2UgcmVjZWl2ZWQgdmlhIEF1dG8vUHJveHkgY2hhbm5lbCAqLworc3RhdGljIHZvaWQgYmNtdHJtdXhfcnhfYXV0b19wcm94eShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKQoreworICAgIGJjbXRyX2hkciBoZHI7CisgICAgYmNtb2x0X29ial9pZCBvYmo7CisgICAgYmNtb2x0X21ndF9ncm91cCBncm91cDsKKyAgICB1aW50MTZfdCBzdWJncm91cDsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIFBlZWsgaW4gdHJhbnNwb3J0IGhlYWRlci4gSXQgY29udGFpbnMgZW5vdWdoIGluZm8gdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgbWVzc2FnZSAqLworICAgIGJjbXRyX2hlYWRlcl91bnBhY2soYmNtb3NfYnVmX2RhdGEoYnVmKSwgJmhkcik7CisKKyAgICByYyA9IGJjbW9sdF9ncm91cF9pZF9zcGxpdChoZHIubXNnX2lkLCAmb2JqLCAmZ3JvdXAsICZzdWJncm91cCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBkZWNvZGUgZ3JvdXBfaWQgJXUuIEVycm9yICVzICglZClcbiIsIGhkci5tc2dfaWQsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9kaXNjX2F1dG87CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBTYW5pdHkgY2hlY2sgKi8KKyAgICBpZiAoaGRyLmluc3RhbmNlID49IEJDTVRSX01BWF9JTlNUQU5DRVMgfHwgb2JqID49IEJDTU9MVF9PQkpfSURfX05VTV9PRikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiSW5zdGFuY2UgJXUgb3Igb2JqZWN0ICVkIGlzIGluc2FuZVxuIiwgaGRyLmluc3RhbmNlLCBvYmopOworICAgICAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9kaXNjX2F1dG87CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBEaXNwYXRjaCBiYXNlZCBvbiBvYmplY3QgaWQgKi8KKyAgICAvKiBIYW5kbGUgZGV2X2N0cmwgaW50ZXJjZXB0ICovCisgICAgaWYgKGJjbXRybXV4X2Rldl9jdHJsX2ludGVyY2VwdFtkZXZpY2VdW2hkci5tc2dfaWRdKQorICAgIHsKKyAgICAgICAgY2hhbm5lbCA9IEJDTVRSTVVYX0NIQU5ORUxfREVWX0NPTlRST0w7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNoYW5uZWwgPSAoZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPKSA/CisgICAgICAgICAgICBiY210cm11eF9hdXRvX2NoYW5uZWxzW2RldmljZV1baGRyLmluc3RhbmNlXVtvYmpdIDogYmNtdHJtdXhfcHJveHlfY2hhbm5lbHNbZGV2aWNlXVtoZHIuaW5zdGFuY2VdW29ial07CisgICAgfQorCisgICAgLyogSWYgbm8gcmVnaXN0cmF0aW9uIC0gZGlzY2FyZCAqLworICAgIGlmIChjaGFubmVsID49IEJDTVRSTVVYX01BWF9DSEFOTkVMUykKKyAgICB7CisgICAgICAgICsrYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnJ4X2Rpc2NfYXV0bzsKKyAgICAgICAgYmNtb3NfYnVmX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBiY210cm11eF9yeChkZXZpY2UsIGNoYW5uZWwsIGJ1Zik7Cit9CisKKy8qIEhhbmRsZSBtZXNzYWdlIHJlY2VpdmVkIHZpYSBERVZfQ09OVFJPTCBjaGFubmVsICovCitzdGF0aWMgdm9pZCBiY210cm11eF9yeF9sb2NhbChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKQoreworICAgIGJjbXRybXV4X2xvY2FsX3J4X2luZm8gKnJ4X2luZm87CisgICAgYmNtdHJfaGRyIGhkcjsKKyAgICBiY21vbHRfYnVmIHVidWY7CisgICAgYmNtb2x0X21zZyAqbXNnID0gTlVMTDsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBiY210cl9oZWFkZXJfdW5wYWNrKGJjbW9zX2J1Zl9kYXRhKGJ1ZiksICZoZHIpOworCisgICAgYmNtb2x0X2J1Zl9pbml0KCZ1YnVmLCBiY21vc19idWZfbGVuZ3RoKGJ1ZiksIGJjbW9zX2J1Zl9kYXRhKGJ1ZiksIEJDTVRSX0JVRl9FTkRJQU4pOworICAgIGJjbW9sdF9idWZfc2tpcCgmdWJ1ZiwgQkNNVFJfSERSX1NJWkUpOworICAgIGVyciA9IGJjbW9sdF9tc2dfdW5wYWNrKCZ1YnVmLCAmbXNnKTsKKyAgICBiY21vc19idWZfZnJlZShidWYpOworICAgIGlmIChlcnIgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJNZXNzYWdlIHVucGFjayBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIpOworICAgICAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9kaXNjX3JlbW90ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1zZy0+Y29ycl90YWcgPSBoZHIuY29ycl90YWc7CisgICAgbXNnLT5zdWJjaCA9IChiY21vbHRfc3ViY2hhbm5lbCljaGFubmVsOworICAgICsrYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnJ4X2xvY2FsOworCisgICAgcnhfaW5mbyA9ICZiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV07CisgICAgcnhfaW5mby0+cngoZGV2aWNlLCBtc2csIHJ4X2luZm8tPmRhdGEpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJtdXhfbXNnX3BhY2soYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19idWYgKipwX2J1ZikKK3sKKyAgICBpbnQzMl90IGxlbiA9IGJjbW9sdF9tc2dfZ2V0X3BhY2tlZF9sZW5ndGgobXNnKTsKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICBiY21vbHRfYnVmIHVidWY7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbXRyX2hkciB0aGRyID0ge307CisKKyAgICBpZiAobGVuIDwgMCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgY2FsY3VsYXRlIHBhY2tldCBsZW5ndGguIEVycm9yICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgbGVuKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgcmMgPSBiY210cl9oZWFkZXJfZmlsbChtc2csICZ0aGRyKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGNyZWF0ZSB0cmFuc3BvcnQgaGVhZGVyLiBFcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBsZW4gKz0gQkNNVFJfSERSX1NJWkU7CisgICAgYnVmID0gYmNtb3NfYnVmX2FsbG9jKGxlbik7CisgICAgaWYgKCFidWYpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGFsbG9jYXRlIHBhY2tldCBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgYmNtb2x0X2J1Zl9pbml0KCZ1YnVmLCBsZW4sIGJjbW9zX2J1Zl9kYXRhKGJ1ZiksIEJDTVRSX0JVRl9FTkRJQU4pOworICAgIGJjbW9sdF9idWZfc2tpcCgmdWJ1ZiwgQkNNVFJfSERSX1NJWkUpOworCisgICAgLyogUGFjayB0cmFuc3BvcnQgaGVhZGVyICovCisgICAgYmNtdHJfaGVhZGVyX3BhY2soJnRoZHIsIHVidWYuc3RhcnQpOworCisgICAgLyogUGFjayBtZXNzYWdlICovCisgICAgcmMgPSBiY21vbHRfbXNnX3BhY2sobXNnLCAmdWJ1Zik7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJNZXNzYWdlIHBhY2sgZmFpbGVkLiBFcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgYmNtb3NfYnVmX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgYmNtb3NfYnVmX2xlbmd0aF9zZXQoYnVmLCBsZW4pOworCisgICAgKnBfYnVmID0gYnVmOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFNlbmQgcGFja2V0IGZyb20gbG9jYWwgY29udHJvbCBwcm9jZXNzIHRvIHRoZSBob3N0IGFwcGxpY2F0aW9uICovCitiY21vc19lcnJubyBiY210cm11eF9jb250cm9sX3RvX2hvc3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCA9IChiY210cm11eF9jaGFubmVsKW1zZy0+c3ViY2g7CisgICAgYmNtb3NfYnVmICpidWY7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBCVUdfT04oKHVuc2lnbmVkKWNoYW5uZWwgPj0gQkNNVFJNVVhfTUFYX0NIQU5ORUxTKTsKKyAgICBCVUdfT04oKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyk7CisKKyAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5jb250cm9sX3RvX2hvc3Q7CisKKyAgICByYyA9IGJjbXRybXV4X21zZ19wYWNrKGRldmljZSwgbXNnLCAmYnVmKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIGJjbXRybXV4X3J4KGRldmljZSwgY2hhbm5lbCwgYnVmKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogU2VuZCBwYWNrZXQgZnJvbSBsb2NhbCBjb250cm9sIHByb2Nlc3MgdG8gdGhlIGVtYmVkZGVkIHN5c3RlbSAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfY29udHJvbF90b19saW5lKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBCVUdfT04oKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyk7CisKKyAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5jb250cm9sX3RvX2xpbmU7CisKKyAgICBlcnIgPSBiY210cm11eF9tc2dfcGFjayhkZXZpY2UsIG1zZywgJmJ1Zik7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtdHJtdXhfc2VuZF90b19saW5lKGRldmljZSwgQkNNVFJNVVhfQ0hBTk5FTF9ERVZfQ09OVFJPTCwgYnVmKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qIFJlZ2lzdGVyIG1lc3NhZ2UgZm9yIGludGVyY2VwdCBieSBiY21vbHRfZGV2X2N0cmwgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2NvbnRyb2xfYXV0b19pbnRlcmNlcHRfZmlsdGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UsICBiY21vbHRfb2JqX2lkIG9iamVjdCwgdWludDE2X3Qgc3ViZ3JvdXApCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncm91cF9pZCBtc2dfaWQ7CisKKyAgICBpZiAoKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGVyciA9IGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKG9iamVjdCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCBzdWJncm91cCwgJm1zZ19pZCk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgaWRlbnRpZnkgb3BlcmF0aW9uICVkIGZvciBvYmplY3QgJWQuIEVycm9yICVzICglZClcbiIsCisgICAgICAgICAgICAoaW50KXN1Ymdyb3VwLCAoaW50KW9iamVjdCwgYmNtb3Nfc3RyZXJyb3IoZXJyKSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgYmNtdHJtdXhfZGV2X2N0cmxfaW50ZXJjZXB0W2RldmljZV1bbXNnX2lkXSA9IEJDTU9TX1RSVUU7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyoqIEdldCB0cmFuc3BvcnQgbXV4IHN0YXRpc3RpY3MuCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1bb3V0XSAgc3RhdCAgICBTdGF0aXN0aWNzCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfc3RhdCAqc3RhdCkKK3sKKyAgICBpZiAoKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyB8fCAhc3RhdCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgICpzdGF0ID0gYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjaWZkZWYgX19LRVJORUxfXworCitFWFBPUlRfU1lNQk9MKGJjbXRybXV4X2luaXQpOworRVhQT1JUX1NZTUJPTChiY210cm11eF9jb25uZWN0KTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfZGlzY29ubmVjdCk7CitFWFBPUlRfU1lNQk9MKGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChiY210cm11eF9jaGFubmVsX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChiY210cm11eF9sb2NhbF9oYW5kbGVyX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfcnhfZnJvbV9ob3N0KTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfcnhfZnJvbV9saW5lKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfY29udHJvbF90b19ob3N0KTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfY29udHJvbF90b19saW5lKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfY29udHJvbF9hdXRvX2ludGVyY2VwdF9maWx0ZXIpOworRVhQT1JUX1NZTUJPTChiY210cm11eF9zdGF0X2dldCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9tdXgvYmNtb2x0X3RyX211eC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9tdXgvYmNtb2x0X3RyX211eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MzczNzUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9iY21vbHRfdHJfbXV4LmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX1RSX01VWF9IXworI2RlZmluZSBCQ01PTFRfVFJfTVVYX0hfCisKKy8qKiBcZGVmZ3JvdXAgdHJfbXV4IFRyYW5zcG9ydCBNdWx0aXBsZXhlcgorICogLSBQQ0llIGNoYW5uZWwgbXVsdGlwbGV4ZXIKKyAqIC0gbG9jYWxseS9yZW1vdGVseSAtIHRlcm1pbmF0ZWQgbWVzc2FnZSBtdWx0aXBsZXhlcgorICogLSBhdXRvbm9tb3VzIG1lc3NhZ2VzIGRlLW11bHRpcGxleGVyCisgKiBAeworICovCisKKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaWZuZGVmIElOX0JBTkQKKyNpbmNsdWRlIDxiY210cl9wY2llX3N3X3F1ZXVlLmg+CisjZW5kaWYKKworCisvKiBNZXNzYWdlIGRlc3RpbmF0aW9uOiBsb2NhbCBvciByZW1vdGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTVRSTVVYX0RFU1RfTE9DQUwsCisgICAgQkNNVFJNVVhfREVTVF9SRU1PVEUsCit9IGJjbXRybXV4X21zZ19kZXN0OworCit0eXBlZGVmIGJjbXRybXV4X21zZ19kZXN0ICgqYmNtdHJtdXhfbXNnX2ZpbHRlcl9jYl90KShiY21vbHRfZGV2aWQsIGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCk7CisKKy8qKiBJbml0aWFsaXplIG11eCBzZXJ2aWNlCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfaW5pdChiY210cm11eF9tc2dfZmlsdGVyX2NiX3QgbXNnX2ZpbHRlcl9jYik7CisKKy8qKiBOb3RpZnkgbXV4IGRyaXZlciB0aGF0IGxvdy1sZXZlbCB0cmFuc3BvcnQgY29ubmVjdGlvbiBpcyByZWFkeQorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KKyNpZmRlZiBJTl9CQU5EIAorYmNtb3NfZXJybm8gYmNtdHJtdXhfY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlLCAgYmNtb3NfaXB2NF9hZGRyZXNzIGlwX2FkZHJlc3MsIHVpbnQxNl90IHVkcF9wb3J0KTsKKyNlbHNlCitiY21vc19lcnJubyBiY210cm11eF9jb25uZWN0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90IHR4cV9zaXplLCB1aW50MzJfdCByeHFfc2l6ZSk7CisjZW5kaWYKKworLyoqIE5vdGlmeSBtdXggZHJpdmVyIHRoYXQgbG93LWxldmVsIHRyYW5zcG9ydCBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2Rpc2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qKiBDbGVhbnVwIGFuZCBleGl0CisgKi8KK3ZvaWQgYmNtdHJtdXhfZXhpdCh2b2lkKTsKKworLyoKKyAqIFBDSWUgY2hhbm5lbCBtdWx0aXBsZXhlcgorICovCisKKy8qKiBMb2dpY2FsIGNoYW5uZWwgaWQgKi8KK3R5cGVkZWYgaW50IGJjbXRybXV4X2NoYW5uZWw7CisKKy8qKiBNdXggc3RhdGlzdGljcyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJtdXhfc3RhdAoreworICAgIHVpbnQzMl90IHR4X3JlbW90ZTsgICAgICAgICAvKio8IEF0dGVtcHRlZCB0cmFuc21pdCB0byBkZXZpY2UgKGluY3VkaW5nIGRpc2NhcmRzKSAqLworICAgIHVpbnQzMl90IHR4X2xvY2FsOyAgICAgICAgICAvKio8IEF0dGVtcHRlZCAidHJhbnNtaXQiIHRvIGRldmljZSBjb250cm9sICovCisgICAgdWludDMyX3QgdHhfZGlzY19yZW1vdGU7ICAgIC8qKjwgRGlzY2FyZGVkIHdoZW4gdHJhbnNtaXR0aW5nIHRvIHJlbW90ZSBkZXZpY2UgKG5vdCByZWFkeSBvciBxdWV1ZSBvdmVyZmxvdykgKi8KKyAgICB1aW50MzJfdCB0eF9kaXNjX2xvY2FsOyAgICAgLyoqPCBDb3VsZG4ndCBkZWxpdmVyIHRvIGRldmljZSBjb250cm9sLiBObyBoYW5kbGVyICovCisgICAgdWludDMyX3QgcnhfcmVtb3RlOyAgICAgICAgIC8qKjwgUmVjZWl2ZWQgZnJvbSBkZXZpY2UgKi8KKyAgICB1aW50MzJfdCByeF9sb2NhbDsgICAgICAgICAgLyoqPCBNZXNzYWdlIGZyb20gdGhlIGxpbmUgaW50ZXJjZXB0ZWQgYnkgZGV2aWNlIGNvbnRyb2wgKi8KKyAgICB1aW50MzJfdCByeF9hdXRvOyAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBhdXRvbm9tb3VzIG1lc3NhZ2VzICovCisgICAgdWludDMyX3QgY29udHJvbF90b19ob3N0OyAgIC8qKjwgU2VudCBieSBkZXZpY2UgY29udHJvbCB0byB0aGUgaG9zdCAqLworICAgIHVpbnQzMl90IGNvbnRyb2xfdG9fbGluZTsgICAvKio8IFNlbnQgYnkgZGV2aWNlIGNvbnRyb2wgdG8gbGluZSAqLworICAgIHVpbnQzMl90IHJ4X2Rpc2NfcmVtb3RlOyAgICAvKio8IERpc2NhcmRlZCBwYWNrZXRzIHJlY2VpdmVkIGZyb20gZGV2aWNlLiBDYW4ndCBkZW11eCBjaGFubmVsICovCisgICAgdWludDMyX3QgcnhfZGlzY19hdXRvOyAgICAgIC8qKjwgRGlzY2FyZGVkIGF1dG9ub21vdXMgbWVzc2FnZXMuIENhbid0IGRlbXV4IGF1dG8gbWVzc2FnZSAqLworICAgIHVpbnQzMl90IHJ4X2Rpc2NfbG9jYWw7ICAgICAvKio8IERpc2NhcmRlZCBwYWNrZXRzIHJlY2VpdmVkIGZyb20gZGV2aWNlIGNvbnRyb2wuIENhbid0IGRlbXV4IGNoYW5uZWwgKi8KKyAgICB1aW50MzJfdCByeF9kaXNjX2ludl9jaDsgICAgLyoqPCBEaXNjYXJkZWQgYmVjYXVzZSBjaGFubmVsIGlzIGludmFsaWQgKi8KKyAgICB1aW50MzJfdCByeF9wb2xsX3VyZ2VudDsgICAgLyoqPCBVcmdlbnQgYnVmZmVycyBjb3VudGVkIGJ5IGJjbXRyX3N3X3F1ZXVlX3J4X3BvbGwoKSAqLworICAgIHVpbnQzMl90IHJ4X3BvbGxfbm9ybWFsOyAgICAvKio8IE5vcm1hbCBidWZmZXJzIGNvdW50ZWQgYnkgYmNtdHJfc3dfcXVldWVfcnhfcG9sbCgpICovCit9IGJjbXRybXV4X3N0YXQ7CisKKworLyoqIE1heCBudW1iZXIgb2YgY2hhbm5lbHMgcGVyIGRldmljZSAqLworI2RlZmluZSBCQ01UUk1VWF9NQVhfQ0hBTk5FTFMgICAzMgorCisvKiogRmlyc3QgdXJnZW50IGNoYW5uZWwgKi8KKyNpZm5kZWYgSU5fQkFORAorI2RlZmluZSBCQ01UUk1VWF9GSVJTVF9VUkdFTlRfQ0hBTk5FTCBCQ01UUl9TV1FfRklSU1RfVVJHRU5UX0NIQU5ORUwKKyNpZiBCQ01UUk1VWF9GSVJTVF9VUkdFTlRfQ0hBTk5FTCA+PSBCQ01UUk1VWF9NQVhfQ0hBTk5FTFMKKyAgICAjZXJyb3IgQkNNVFJNVVhfRklSU1RfVVJHRU5UX0NIQU5ORUwgYW5kIEJDTVRSTVVYX01BWF9DSEFOTkVMUyBzZXR0aW5ncyBhcmUgaW5jb25zaXN0ZW50CisjZW5kaWYKKworI2Vsc2UKKworI2RlZmluZSBCQ01UUk1VWF9GSVJTVF9VUkdFTlRfQ0hBTk5FTCAoQkNNVFJNVVhfTUFYX0NIQU5ORUxTIC0gMSkgICAgICAgIC8qIFVyZ2VudCBjaGFubmVsIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIElOQkFORC4gKi8KKworI2VuZGlmCisKKworLyoqIEF1dG8tYXNzaWduIGNoYW5uZWwgKi8KKyNkZWZpbmUgQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX0FTU0lHTiAgICgtMSkKKworLyoqIENoYW5uZWwgaWQgcmVzZXJ2ZWQgZm9yIGF1dG9ub21vdXMvcHJveHkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX1BST1hZICAgICAwCisKKy8qKiBDaGFubmVsIGlkIHJlc2VydmVkIGZvciBkZXZpY2UgY29udHJvbCAqLworI2RlZmluZSBCQ01UUk1VWF9DSEFOTkVMX0RFVl9DT05UUk9MICAgIDEKKworLyoqIEZpcnN0IGNoYW5uZWwgaWQgdGhhdCBpcyBub3QgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQkNNVFJNVVhfQ0hBTk5FTF9GSVJTVF9GUkVFICAgICAoQkNNVFJNVVhfQ0hBTk5FTF9ERVZfQ09OVFJPTCArIDEpCisKKy8qKiBSZWNlaXZlIG1lc3NhZ2UgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqZl9iY210cl9yeF9oYW5kbGVyKShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKTsKKworLyoqIExvY2FsIHJlY2VpdmUgbWVzc2FnZSBoYW5kbGVyICovCit0eXBlZGVmIHZvaWQgKCpmX2JjbXRyX2xvY2FsX3J4X2hhbmRsZXIpKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgdm9pZCAqZGF0YSk7CisKKy8qKiBSZWdpc3RlciBQQ0llIGNoYW5uZWwgb3duZXIKKyAqCisgKiBccGFyYW1baW5dICAgICAgICAgICBkZXZpY2UgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luLG91dF0gICAgICAgY2hhbm5lbCBMb2dpY2FsIFBDSWUgY2hhbm5lbCBpZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX0FTU0lHTiwgdW51c2VkIGNoYW5uZWwgaXMgYWxsb2NhdGVkIGludGVybmFsbHkuCisgKiBccGFyYW1baW5dICAgICAgICAgICByeCAgICAgIFJlY2VpdmUgY2FsbGJhY2sgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcGFja2V0cyByZWNlaXZlZCBvdmVyIGNoYW5uZWwKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGRhdGEgICAgRGF0YSB0byBiZSBwYXNzZWQgdG8gcmVjZWl2ZSBjYWxsYmFjaworICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfY2hhbm5lbCAqY2hhbm5lbCwKKyAgICBmX2JjbXRyX3J4X2hhbmRsZXIgcngsIHZvaWQgKmRhdGEpOworCisKKy8qKiBSZWxlYXNlIFBDSWUgY2hhbm5lbCBhbGxvY2F0ZWQgYnkgYmNtdHJtdXhfY2hhbm5lbF9yZWdpc3RlcigpCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgY2hhbm5lbAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2NoYW5uZWxfdW5yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwpOworCisKKy8qKiBSZWNlaXZlIG1lc3NhZ2UgZnJvbSBob3N0IGFwcGxpY2F0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lc3NhZ2VzIHRyYW5zbWl0dGVkIGZyb20gdGhlIGhvc3QuCisgKiBNZXNzYWdlIGNhbiBiZSBsb2NhbGx5IG9yIHJlbW90ZWx5IHRlcm1pbmF0ZWQKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNoYW5uZWwgTG9naWNhbCBjaGFubmVsCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIgdG8gYmUgdHJhbnNtaXR0ZWQKKyAqLwordm9pZCBiY210cm11eF9yeF9mcm9tX2hvc3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCBiY21vc19idWYgKmJ1Zik7CisKKy8qKiBSZWNlaXZlIHBhY2tldCBmcm9tIFBDSWUgaW50ZXJmYWNlCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgY2hhbm5lbCBMb2dpY2FsIGNoYW5uZWwKKyAqIFxwYXJhbVtpbl0gICBidWYgICAgIEJ1ZmZlciB0byBiZSBmb3J3YXJkZWQgdG8gYXBwbGljYXRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBkZS1hbGxvY2F0ZWQgYXV0b21hdGljYWxseQorICovCit2b2lkIGJjbXRybXV4X3J4X2Zyb21fbGluZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKTsKKworLyoqIFNlbmQgcGFja2V0IGZyb20gbG9jYWwgY29udHJvbCBwcm9jZXNzIHRvIHRoZSBob3N0IGFwcGxpY2F0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgbXNnICAgICBNZXNzYWdlIHRvIGJlIHNlbnQgdG8gaG9zdCBhcHBsaWNhdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEF0dGVudGlvbiEgSXQgaXMgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byByZWxlYXNlIHRoZSBtZXNzYWdlCisgKiAgICAgICAgICAgICAgICAgICAgICBhZnRlciByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIC0gaWYgbmVjZXNzYXJ5LgorICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IGl0IGlzIGV4cGVjdGVkIHRoYXQgb2Z0ZW4gbXNnIHdpbGwgYmUgYWxsb2NhdGVkIG9uIHN0YWNrLgorICogICAgICAgICAgICAgICAgICAgICAgSXQgaXMgYWxzbyByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIG1ha2Ugc3VyZSB0aGF0IG1zZy0+c3ViY2ggaXMgc2V0IGNvcnJlY3RseQorICogICAgICAgICAgICAgICAgICAgICAgLSBwcmVzZXJ2ZWQgZm9yIHJlcXVlc3QvcmVzcG9uc2UgZXhjaGFuZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gc2V0ID0gQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX1BST1hZIGZvciBhdXRvbm9tb3VzIGluZGljYXRpb25zCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZyk7CisKKy8qKiBTZW5kIHBhY2tldCBmcm9tIGxvY2FsIGNvbnRyb2wgcHJvY2VzcyB0byB0aGUgZW1iZWRkZWQgc3lzdGVtCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgbXNnICAgICBNZXNzYWdlIHRvIGJlIHNlbnQgdG8gdGhlIGVtYmVkZGVkIHN5c3RlbS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEF0dGVudGlvbiEgSXQgaXMgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byByZWxlYXNlIHRoZSBtZXNzYWdlCisgKiAgICAgICAgICAgICAgICAgICAgICBhZnRlciByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIC0gaWYgbmVjZXNzYXJ5LgorICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IGl0IGlzIGV4cGVjdGVkIHRoYXQgb2Z0ZW4gbXNnIHdpbGwgYmUgYWxsb2NhdGVkIG9uIHN0YWNrLgorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2NvbnRyb2xfdG9fbGluZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2cpOworCisvKiogUmVnaXN0ZXIgbWVzc2FnZSBmb3IgaW50ZXJjZXB0IGJ5IGRldl9jdHJsCisgKgorICogTWF0Y2hlZCBtZXNzYWdlIHJlY2VpdmUgZnJvbSB0aGUgbGluZSB3aWxsIGJlIGludGVyY2VwdGVkIGFuZAorICogZGVsaXZlcmVkIHRvIGNhbGxiYWNrIHJlZ2lzdGVyZWQgdXNpbmcgYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl9yZWdpc3RlcigpCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIG9iamVjdCAgIE9iamVjdCBmb3Igd2hpY2ggbWVzc2FnZSBpcyB0byBiZSBpbnRlcmNlcHRlZAorICogXHBhcmFtW2luXSAgIHN1Ymdyb3VwIE1lc3NhZ2Ugc3ViZ3JvdXAKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cm11eF9jb250cm9sX2F1dG9faW50ZXJjZXB0X2ZpbHRlcihiY21vbHRfZGV2aWQgZGV2aWNlLCAgYmNtb2x0X29ial9pZCBvYmplY3QsIHVpbnQxNl90IHN1Ymdyb3VwKTsKKworLyoKKyAqIExvY2FsIHRlcm1pbmF0aW9uIGhhbmRsZXIKKyAqLworCisvKiogUmVnaXN0ZXIgbG9jYWwgdGVybWluYXRpb24gaGFuZGxlci4KKyAqCisgKiBUaGlzIGhhbmRsZXIgaXMgY2FsbGVkIGZvciBtZXNzYWdlcyB0cmFuc21pdHRlZCBieSBob3N0IGFwcGxpY2F0aW9uCisgKiB0aGF0IHNob3VsZCBiZSB0ZXJtaW5hdGVkIGxvY2FsbHkgYnkgZGV2aWNlIGNvbnRyb2wgZHJpdmVyIGFuZAorICogZm9yIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIGxpbmUgdGhhdCBtYXRjaCBiY210cm11eF9jb250cm9sX2F1dG9faW50ZXJjZXB0X2ZpbHRlcigpCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcnggICAgICBSZWNlaXZlIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGxvY2FsbHktdGVybWluYXRlZCBwYWNrZXRzLgorICogICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCByZWxlYXNlIHRoZSBidWZmZXIgd2hlbiBubyBsb25nZXIgbmVlZGVkCisgKiBccGFyYW1baW5dICAgZGF0YSAgICBEYXRhIHRvIGJlIHBhc3NlZCB0byByZWNlaXZlIGNhbGxiYWNrCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl9yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBmX2JjbXRyX2xvY2FsX3J4X2hhbmRsZXIgcngsIHZvaWQgKmRhdGEpOworCisvKiogVW5yZWdpc3RlciBsb2NhbCB0ZXJtaW5hdGlvbiBoYW5kbGVyIHJlZ2lzdGVyZWQgYnkgYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl9yZWdpc3RlcigpCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl91bnJlZ2lzdGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UpOworCisvKiogR2V0IHRyYW5zcG9ydCBtdXggc3RhdGlzdGljcy4KKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtvdXRdICBzdGF0ICAgIFN0YXRpc3RpY3MKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cm11eF9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9zdGF0ICpzdGF0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9kYWVtb24vTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9kYWVtb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmOWZjMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvbXV4L2RhZW1vbi9NYWtlZmlsZQpAQCAtMCwwICsxLDI3IEBACisjIEluIEJhbmQgdHJhbnNwb3J0CisjIENvbnNpc3RzIG9mIDIgY29tcG9uZW50cworIyAtIGxvdy1sZXZlbCBkcml2ZXIgKHNlbmQvcnggZnVuY3Rpb25zKQorIyAtIG11bHRpcGxleGVyCisjCitpZm5lcSAoIiQoU0lNVUxBVElPTl9CVUlMRCkiLCAieSIpCitNT0RfTkFNRSA9IHRybXV4X2RhZW1vbgorCitNT0RfREVQUyA9IHRyYW5zcG9ydCBtb2RlbCB0cm11eCBpbmJhbmRfZHJpdmVyCisKK01PRF9ERUZTICs9IC1ESU5fQkFORAorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfREVQUyArPSBjb21tb25fYXBpCitlbHNlCisgICAgTU9EX0RFUFMgKz0gYXBpCitlbmRpZgorCitNT0RfVFlQRSA9IGxpYgorCitzcmNzID0gLi4vYmNtb2x0X3RyX211eC5jIAorCitVU0VfTElOVCA9IHllcworCitlbmRpZgorCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvcGNpZV9zd19xdWV1ZS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvcGNpZV9zd19xdWV1ZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTM2ZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9wY2llX3N3X3F1ZXVlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjEgQEAKKyMgUENJZSBTb2Z0d2FyZSBRdWV1ZSBkcml2ZXIKKyMgLSBTb2Z0d2FyZSBsYXllciBvbiB0b3Agb2YgbG93IGxldmVsIFBDSWUgZHJpdmVyIHRoYXQgYWRkcyBzdXBwb3J0CisjICAgZm9yIHMvdyBxdWV1ZSBhbmQgcHJpb3JpdHkKKyMKK01PRF9OQU1FID0gcGNpZV9zd19xdWV1ZQorCitNT0RfREVQUyA9IHBjaWUKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCitNT0RfVFlQRSA9IGxpbnV4X2xpYgorZWxzZQorTU9EX1RZUEUgPSBsaWIKK2VuZGlmCisKK2lmbmVxICgiJChSQVdfVFJBTlNQT1JUX1ZJQV9VRFApIiwgInkiKQorICAgIHNyY3MgPSBiY210cl9wY2llX3N3X3F1ZXVlLmMKK2VuZGlmCisKK1VTRV9MSU5UID0geWVzCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9wY2llX3N3X3F1ZXVlL2JjbXRyX3BjaWVfc3dfcXVldWUuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvcGNpZV9zd19xdWV1ZS9iY210cl9wY2llX3N3X3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0MTAxZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvcGNpZV9zd19xdWV1ZS9iY210cl9wY2llX3N3X3F1ZXVlLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisjaW5jbHVkZSA8YmNtdHJfcGNpZS5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl9wY2llX3NwZWNpZmljLmg+CisjaW5jbHVkZSAiYmNtdHJfcGNpZV9zd19xdWV1ZS5oIgorCisvKgorICogYmNtX3BjaWVfc3dfcXVldWUuYworICogU29mdHdhcmUgbGF5ZXIgb24gdG9wIG9mIGxvdyBsZXZlbCBQQ0llIGRyaXZlciB0aGF0IGFkZHMgc3VwcG9ydAorICogZm9yIHMvdyBxdWV1ZSBhbmQgcHJpb3JpdHkKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19idWZfcXVldWUgdHhxOyAgICAgICAgICAgLyogVHJhbnNtaXQgcXVldWUgKi8KKyAgICBiY21vc19idWZfcXVldWUgcnhxOyAgICAgICAgICAgLyogUmVjZWl2ZSBxdWV1ZSAqLworICAgIHVpbnQzMl90IG1heF9od3Ffc2l6ZTsKKyAgICB1aW50MzJfdCBtYXhfc3dxX3NpemU7CisgICAgYmNtdHJfc3dxX3J4X2NiIHJ4X2NiOyAgICAgICAgIC8qIE9wdGlvbmFsIHJ4X2NiIGZvciBjYWxsYmFjay1iYXNlZCBSWCBidWZmZXIgZGVsaXZlcnkgKi8KK30gcGNpZV9zd3E7CisKK3N0YXRpYyBwY2llX3N3cSBzd3FfaW5mb1tCQ01UUl9NQVhfT0xUU11bQkNNVFJfUENJRV9QUlRZX19OVU1fT0ZdOworc3RhdGljIHVpbnQzMl90IGh3cV9vY2N1cGFuY3lbQkNNVFJfTUFYX09MVFNdOyAgLyogTnVtYmVyIG9mIHVuYWNrbm93bGVkZ2VkIGJ1ZmZlcnMgaW4gaHcgdHggcXVldWUgKi8KK3N0YXRpYyBiY21vc19ib29sIHN3cV9pbml0aWFsaXplZFtCQ01UUl9NQVhfT0xUU107CitzdGF0aWMgYmNtb3NfZmFzdGxvY2sgdHhfbG9ja1tCQ01UUl9NQVhfT0xUU107CitzdGF0aWMgYmNtb3NfZmFzdGxvY2sgcnhfbG9ja1tCQ01UUl9NQVhfT0xUU107CisKKyNkZWZpbmUgQkNNVFJfU1dRX0dFVF9SRVRVUk5fSUZfRVJST1IoZGV2aWNlLHBydHksc3dxKSAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3dxID0gJnN3cV9pbmZvW2RldmljZV1bcHJ0eV07ICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGxvbmcgX2JjbXRyX3N3cV90eF9sb2NrKHVpbnQ4X3QgZGV2aWNlKQoreworICAgIHJldHVybiBiY21vc19mYXN0bG9ja19sb2NrKCZ0eF9sb2NrW2RldmljZV0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX2JjbXRyX3N3cV90eF91bmxvY2sodWludDhfdCBkZXZpY2UsIGxvbmcgZmxhZ3MpCit7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZ0eF9sb2NrW2RldmljZV0sIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9iY210cl9zd3FfcnhfbG9jayh1aW50OF90IGRldmljZSkKK3sKKyAgICByZXR1cm4gYmNtb3NfZmFzdGxvY2tfbG9jaygmcnhfbG9ja1tkZXZpY2VdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9iY210cl9zd3FfcnhfdW5sb2NrKHVpbnQ4X3QgZGV2aWNlLCBsb25nIGZsYWdzKQoreworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcnhfbG9ja1tkZXZpY2VdLCBmbGFncyk7Cit9CisKKy8qKiBUeCBkb25lIGNhbGxiYWNrLgorICogTXVzdCBiZSBjYWxsZWQgdW5kZXIgdHhfbG9jaworICovCitzdGF0aWMgdm9pZCBfYmNtdHJfc3dxX3R4X2RvbmVfY2IodWludDhfdCBkZXZpY2UsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIEJVR19PTighaHdxX29jY3VwYW5jeVtkZXZpY2VdKTsKKyAgICAtLWh3cV9vY2N1cGFuY3lbZGV2aWNlXTsKKyAgICBiY21vc19idWZfZnJlZShidWYpOworfQorCisvKiBJbml0aWFsaXplIFBDSSBzb2Z0d2FyZSBxdWV1ZSBtb2R1bGUgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3N3cV9pbml0KHZvaWQpCit7CisgICAgcmV0dXJuIGJjbXRyX3BjaWVfdHhfZG9uZV9jYmxrX3JlZ2lzdGVyKF9iY210cl9zd3FfdHhfZG9uZV9jYik7Cit9CisKKy8qIENsZWFudXAgc29mdHdhcmUgcXVldWUgbW9kdWxlCisgKi8KK3ZvaWQgYmNtdHJfc3dxX2V4aXQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIFVucmVnaXN0ZXIgZnJvbSBiY210cl9wY2llIGRyaXZlciAqLworICAgIGJjbXRyX3BjaWVfdHhfZG9uZV9jYmxrX3VucmVnaXN0ZXIoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgICAgICBiY210cl9zd3FfZGV2aWNlX2V4aXQoaSk7Cit9CisKKy8qIEluaXRpYWxpemUgUENJIHNvZnR3YXJlIHF1ZXVlIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX2RldmljZV9pbml0KHVpbnQ4X3QgZGV2aWNlKQoreworICAgIGJjbXRyX3BjaWVfcHJ0eSBwcnR5OworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmIChzd3FfaW5pdGlhbGl6ZWRbZGV2aWNlXSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKworICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJnR4X2xvY2tbZGV2aWNlXSwgMCk7CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmcnhfbG9ja1tkZXZpY2VdLCAwKTsKKyAgICBmb3IgKHBydHkgPSAwOyBwcnR5IDwgQkNNVFJfUENJRV9QUlRZX19OVU1fT0Y7IHBydHkrKykKKyAgICB7CisgICAgICAgIHBjaWVfc3dxICpzd3EgPSAmc3dxX2luZm9bZGV2aWNlXVtwcnR5XTsKKyAgICAgICAgYmNtb3NfYnVmX3F1ZXVlX2luaXQoJnN3cS0+dHhxKTsKKyAgICAgICAgYmNtb3NfYnVmX3F1ZXVlX2luaXQoJnN3cS0+cnhxKTsKKyAgICAgICAgc3dxLT5yeF9jYiA9IE5VTEw7CisgICAgICAgIHN3cS0+bWF4X2h3cV9zaXplID0gc3dxLT5tYXhfc3dxX3NpemUgPSAwOworICAgIH0KKyAgICBzd3FfaW5pdGlhbGl6ZWRbZGV2aWNlXSA9IEJDTU9TX1RSVUU7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQ2xlYW51cCBzb2Z0d2FyZSBxdWV1ZSBtb2R1bGUgKi8KK3ZvaWQgYmNtdHJfc3dxX2RldmljZV9leGl0KHVpbnQ4X3QgZGV2aWNlKQoreworICAgIGJjbXRyX3BjaWVfcHJ0eSBwcnR5OworCisgICAgaWYgKCFzd3FfaW5pdGlhbGl6ZWRbZGV2aWNlXSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChwcnR5ID0gMDsgcHJ0eSA8IEJDTVRSX1BDSUVfUFJUWV9fTlVNX09GOyBwcnR5KyspCisgICAgeworICAgICAgICBwY2llX3N3cSAqc3dxID0gJnN3cV9pbmZvW2RldmljZV1bcHJ0eV07CisgICAgICAgIGJjbW9zX2J1ZiAqYnVmOworCisgICAgICAgIHdoaWxlICgoYnVmPWJjbW9zX2J1Zl9xdWV1ZV9nZXQoJnN3cS0+dHhxKSkpCisgICAgICAgICAgICBiY21vc19idWZfZnJlZShidWYpOworICAgICAgICB3aGlsZSAoKGJ1Zj1iY21vc19idWZfcXVldWVfZ2V0KCZzd3EtPnJ4cSkpKQorICAgICAgICAgICAgYmNtb3NfYnVmX2ZyZWUoYnVmKTsKKyAgICB9CisgICAgc3dxX2luaXRpYWxpemVkW2RldmljZV0gPSBCQ01PU19GQUxTRTsKKworICAgIHJldHVybjsKK30KKworLyoqIFNlbmQgYnVmZmVyIHRvIHRoZSBwZWVyCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNoYW5uZWwgICBDaGFubmVsIGlkIChvcGFxdWUgdG8gdGhlIGJjbXRyX3BjaWUgZHJpdmVyKQorICogXHBhcmFtW2luXSAgIGJ1ZiAgICAgICBCdWZmZXIgdG8gYmUgdHJhbnNmZXJyZWQKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9zd3Ffc2VuZCh1aW50OF90IGRldmljZSwgdWludDhfdCBjaGFubmVsLCBiY21vc19idWYgKmJ1ZikKK3sKKyAgICBiY210cl9wY2llX3BydHkgcHJ0eSA9IChjaGFubmVsID49IEJDTVRSX1NXUV9GSVJTVF9VUkdFTlRfQ0hBTk5FTCkgPworICAgICAgICBCQ01UUl9QQ0lFX1BSVFlfVVJHRU5UIDogQkNNVFJfUENJRV9QUlRZX05PUk1BTDsKKyAgICBwY2llX3N3cSAqc3dxOworICAgIGJjbW9zX2Jvb2wgd2FzX2VtcHR5OworICAgIGJjbW9zX2Jvb2wgaHdfcXVldWVfZnVsbDsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgbG9uZyBmbGFnczsKKworICAgIEJDTVRSX1NXUV9HRVRfUkVUVVJOX0lGX0VSUk9SKGRldmljZSwgcHJ0eSwgc3dxKTsKKworICAgIC8qIFN0b3JlIGNoYW5uZWwgaW4gdGhlIGJ1ZmZlciAqLworICAgIGJjbW9zX2J1Zl9jaGFubmVsX3NldChidWYsIGNoYW5uZWwpOworCisgICAgLyogUHJldmVudCBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgcXVldWUgKi8KKyAgICBmbGFncyA9IF9iY210cl9zd3FfdHhfbG9jayhkZXZpY2UpOworCisgICAgLyogU3RvcmUgcS13YXMtZW1wdHkgc3RhdHVzICovCisgICAgd2FzX2VtcHR5ID0gYmNtb3NfYnVmX3F1ZXVlX2lzX2VtcHR5KCZzd3EtPnR4cSk7CisKKyAgICAvKiBDaGVjayBpZiBtYXggaC93IHF1ZXVlIG9jY3VwYW5jeSBpc24ndCBleGNlZWRlZC4gSWYgaXQgaXNuJ3QgYW5kIHMvdyBxdWV1ZSBpcyBlbXB0eQorICAgICAqIHN1Ym1pdCBkaXJlY3RseSB0byB0aGUgaC93IHF1ZXVlLgorICAgICAqLworICAgIGh3X3F1ZXVlX2Z1bGwgPSAoc3dxLT5tYXhfaHdxX3NpemUgJiYgaHdxX29jY3VwYW5jeVtkZXZpY2VdID49IHN3cS0+bWF4X2h3cV9zaXplKTsKKyAgICBpZiAod2FzX2VtcHR5ICYmICFod19xdWV1ZV9mdWxsKQorICAgIHsKKyAgICAgICAgKytod3Ffb2NjdXBhbmN5W2RldmljZV07CisgICAgICAgIF9iY210cl9zd3FfdHhfdW5sb2NrKGRldmljZSwgZmxhZ3MpOworICAgICAgICBlcnIgPSBiY210cl9wY2llX3NlbmQoZGV2aWNlLCBjaGFubmVsLCBidWYpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmbGFncyA9IF9iY210cl9zd3FfdHhfbG9jayhkZXZpY2UpOworICAgICAgICAgICAgLS1od3Ffb2NjdXBhbmN5W2RldmljZV07CisgICAgICAgICAgICAvKiBJZiBzdyBxIGlzIGVuYWJsZWQsIGVucXVlIHRoZSBidWZmZXIsIG90aGVyd2lzZSwganVzdCByZXR1cm4gKi8KKyAgICAgICAgICAgIGlmIChzd3EtPm1heF9zd3Ffc2l6ZSB8fCBzd3EtPm1heF9od3Ffc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vc19idWZfcXVldWVfcHV0KCZzd3EtPnR4cSwgYnVmKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2JjbXRyX3N3cV90eF91bmxvY2soZGV2aWNlLCBmbGFncyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb3NfYnVmX3F1ZXVlX3B1dCgmc3dxLT50eHEsIGJ1Zik7CisgICAgICAgIF9iY210cl9zd3FfdHhfdW5sb2NrKGRldmljZSwgZmxhZ3MpOworICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgIH0KKworCisgICAgcmV0dXJuIGVycjsKK30KKworLyoqIFJlY2VpdmUgcGFja2V0IGZyb20gZGV2aWNlCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHBydHkgICAgICAgICAgICBQcmlvcml0eQorICogXHBhcmFtW291dF0gIGNoYW5uZWwgICAgICAgICBtZXNzYWdlIGNoYW5uZWwgZnJvbSB0aGUgQkQKKyAqIFxwYXJhbVtvdXRdICBidWYgIHBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIgY29udGFpbmluZyB0aGUKKyAqICAgICAgIHJlY2VpdmVkIHBhY2tldAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3N3cV9yZWNlaXZlKHVpbnQ4X3QgZGV2aWNlLCBiY210cl9wY2llX3BydHkgcHJ0eSwgdWludDhfdCAqY2hhbm5lbCwgYmNtb3NfYnVmICoqYnVmKQoreworICAgIHBjaWVfc3dxICpzd3E7CisgICAgbG9uZyBmbGFnczsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBCQ01UUl9TV1FfR0VUX1JFVFVSTl9JRl9FUlJPUihkZXZpY2UsIHBydHksIHN3cSk7CisKKyAgICAvKiBQZWV2ZW50IGNvbmN1cmVudCBhY2Nlc3MgdG8gdGhlIHF1ZXVlICovCisgICAgZmxhZ3MgPSBfYmNtdHJfc3dxX3J4X2xvY2soZGV2aWNlKTsKKyAgICAqYnVmID0gYmNtb3NfYnVmX3F1ZXVlX2dldCgmc3dxLT5yeHEpOworICAgIGlmICgqYnVmKQorICAgIHsKKyAgICAgICAgKmNoYW5uZWwgPSBiY21vc19idWZfY2hhbm5lbCgqYnVmKTsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9RVUVVRV9FTVBUWTsKKyAgICB9CisgICAgX2JjbXRyX3N3cV9yeF91bmxvY2soZGV2aWNlLCBmbGFncyk7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKiogQ29uZmlndXJlIFRYIHF1ZXVlLgorICovCitiY21vc19lcnJubyBiY210cl9zd3FfdHhfcXVldWVfY2ZnKHVpbnQ4X3QgZGV2aWNlLCBiY210cl9wY2llX3BydHkgcHJ0eSwgdWludDMyX3QgaGFyZHFfc2l6ZSwgdWludDMyX3Qgc29mdHFfc2l6ZSkKK3sKKyAgICBwY2llX3N3cSAqc3dxOworCisgICAgQkNNVFJfU1dRX0dFVF9SRVRVUk5fSUZfRVJST1IoZGV2aWNlLCBwcnR5LCBzd3EpOworCisgICAgc3dxLT5tYXhfaHdxX3NpemUgPSBoYXJkcV9zaXplOworICAgIHN3cS0+bWF4X3N3cV9zaXplID0gc29mdHFfc2l6ZTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogUmVnaXN0ZXIgZm9yICJkYXRhIHJlY2VpdmVkIGluZGljYXRpb24iCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHBydHkgICAgICAgICAgICBQcmlvcml0eQorICogXHBhcmFtW2luXSAgIGNiICAgICAgICAgICAgICBDYWxsYmFjayBwb2ludGVyCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX3J4X2NiX3JlZ2lzdGVyKHVpbnQ4X3QgZGV2aWNlLCBiY210cl9wY2llX3BydHkgcHJ0eSwgYmNtdHJfc3dxX3J4X2NiIHJ4X2NiKQoreworICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgc3dxX2luZm9bZGV2aWNlXVtwcnR5XS5yeF9jYiA9IHJ4X2NiOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBVbnJlZ2lzdGVyICJkYXRhIHJlY2VpdmVkIGluZGljYXRpb24iIGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHBydHkgICAgICAgICAgICBQcmlvcml0eQorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3N3cV9yeF9jYl91bnJlZ2lzdGVyKHVpbnQ4X3QgZGV2aWNlLCBiY210cl9wY2llX3BydHkgcHJ0eSkKK3sKKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIHN3cV9pbmZvW2RldmljZV1bcHJ0eV0ucnhfY2IgPSBOVUxMOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEZldGNoIGRhdGEgZnJvbSB0aGUgaHcgdG8gdGhlIHN3IHF1ZXVlLiAqLwordm9pZCBiY210cl9zd3FfcnhfcG9sbCh1aW50OF90IGRldmljZSwgdWludDMyX3QgbmJ1ZltdKQoreworICAgIHVpbnQ4X3QgY2hhbm5lbDsKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICBpbnQgbltCQ01UUl9QQ0lFX1BSVFlfX05VTV9PRl0gPSB7fTsKKyAgICBsb25nIGZsYWdzOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGRvCisgICAgeworICAgICAgICBiY210cl9wY2llX3BydHkgcHJ0eTsKKyAgICAgICAgcGNpZV9zd3EgKnN3cTsKKworICAgICAgICBlcnIgPSBiY210cl9wY2llX3JlY2VpdmUoZGV2aWNlLCAmY2hhbm5lbCwgJmJ1Zik7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwcnR5ID0gKGNoYW5uZWwgPj0gQkNNVFJfU1dRX0ZJUlNUX1VSR0VOVF9DSEFOTkVMKSA/CisgICAgICAgICAgICBCQ01UUl9QQ0lFX1BSVFlfVVJHRU5UIDogQkNNVFJfUENJRV9QUlRZX05PUk1BTDsKKyAgICAgICAgLyogSWYgY2FsbGJhY2sgYmFzZWQgZGVsaXZlcnkgLSBkZWxpdmVyIGJ1ZmZlciBub3csIG90aGVyd2lzZSwgcGxhY2Ugb24gcy93IHF1ZXVlICovCisgICAgICAgIHN3cSA9ICZzd3FfaW5mb1tkZXZpY2VdW3BydHldOworICAgICAgICBpZiAoc3dxLT5yeF9jYikKKyAgICAgICAgeworICAgICAgICAgICAgc3dxLT5yeF9jYihkZXZpY2UsIGNoYW5uZWwsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19idWZfY2hhbm5lbF9zZXQoYnVmLCBjaGFubmVsKTsKKyAgICAgICAgICAgIGZsYWdzID0gX2JjbXRyX3N3cV9yeF9sb2NrKGRldmljZSk7CisgICAgICAgICAgICBiY21vc19idWZfcXVldWVfcHV0KCZzd3EtPnJ4cSwgYnVmKTsKKyAgICAgICAgICAgIF9iY210cl9zd3FfcnhfdW5sb2NrKGRldmljZSwgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgICsrbltwcnR5XTsKKyAgICB9IHdoaWxlIChCQ01PU19UUlVFKTsKKworCisgICAgbmJ1ZlswXSA9IG5bMF07CisgICAgbmJ1ZlsxXSA9IG5bMV07Cit9CisKKy8qIFN1Ym1pdCBkYXRhIGZyb20gdGhlIHN3IFRYIHF1ZXVlIHRvIHRoZSBoL3cgKi8KK3N0YXRpYyB2b2lkIF9iY210cl9zd3FfdHhfc3VibWl0X3BydHkodWludDhfdCBkZXZpY2UsIGJjbXRyX3BjaWVfcHJ0eSBwcnR5KQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisgICAgcGNpZV9zd3EgKnN3cTsKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICB1aW50OF90IGNoYW5uZWw7CisgICAgYmNtb3NfYm9vbCBod19xdWV1ZV9mdWxsOworICAgIGxvbmcgZmxhZ3M7CisKKyAgICBzd3EgPSAmc3dxX2luZm9bZGV2aWNlXVtwcnR5XTsKKyAgICBkbworICAgIHsKKyAgICAgICAgZmxhZ3MgPSBfYmNtdHJfc3dxX3R4X2xvY2soZGV2aWNlKTsKKworICAgICAgICAvKiBDaGVjayBpZiBub3Qgb3ZlciBsaW1pdCAqLworICAgICAgICBod19xdWV1ZV9mdWxsID0gKHN3cS0+bWF4X2h3cV9zaXplICYmIGh3cV9vY2N1cGFuY3lbZGV2aWNlXSA+PSBzd3EtPm1heF9od3Ffc2l6ZSk7CisgICAgICAgIGlmIChod19xdWV1ZV9mdWxsKQorICAgICAgICB7CisgICAgICAgICAgICBfYmNtdHJfc3dxX3R4X3VubG9jayhkZXZpY2UsIGZsYWdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IGZyb20gcy93IHF1ZXVlIGFuZCBzdWJtaXQgdG8gdGhlIGgvdyBxdWV1ZSAqLworICAgICAgICBidWYgPSBiY21vc19idWZfcXVldWVfcGVlaygmc3dxLT5yeHEpOworICAgICAgICBfYmNtdHJfc3dxX3R4X3VubG9jayhkZXZpY2UsIGZsYWdzKTsKKyAgICAgICAgaWYgKCFidWYpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjaGFubmVsID0gYmNtb3NfYnVmX2NoYW5uZWwoYnVmKTsKKyAgICAgICAgZXJyID0gYmNtdHJfcGNpZV9zZW5kKGRldmljZSwgY2hhbm5lbCwgYnVmKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZmxhZ3MgPSBfYmNtdHJfc3dxX3R4X2xvY2soZGV2aWNlKTsKKyAgICAgICAgKytod3Ffb2NjdXBhbmN5W2RldmljZV07CisgICAgICAgIGJjbW9zX2J1Zl9xdWV1ZV9nZXQoJnN3cS0+dHhxKTsKKyAgICAgICAgX2JjbXRyX3N3cV90eF91bmxvY2soZGV2aWNlLCBmbGFncyk7CisKKyAgICB9IHdoaWxlIChCQ01PU19UUlVFKTsKK30KKworLyogU3VibWl0IGRhdGEgZnJvbSB0aGUgc3cgVFggcXVldWUgdG8gdGhlIGgvdyAqLwordm9pZCBiY210cl9zd3FfdHhfc3VibWl0KHVpbnQ4X3QgZGV2aWNlKQoreworICAgIGlmIChiY210cl9wY2llX3R4X2NvbGxlY3QoZGV2aWNlKSA+IDApCisgICAgeworICAgICAgICBfYmNtdHJfc3dxX3R4X3N1Ym1pdF9wcnR5KGRldmljZSwgQkNNVFJfUENJRV9QUlRZX1VSR0VOVCk7CisgICAgICAgIF9iY210cl9zd3FfdHhfc3VibWl0X3BydHkoZGV2aWNlLCBCQ01UUl9QQ0lFX1BSVFlfTk9STUFMKTsKKyAgICB9Cit9CisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGJjbXRyX3N3cV90eF9xdWV1ZV9jZmcpOworRVhQT1JUX1NZTUJPTChiY210cl9zd3Ffc2VuZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvcGNpZV9zd19xdWV1ZS9iY210cl9wY2llX3N3X3F1ZXVlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L3BjaWVfc3dfcXVldWUvYmNtdHJfcGNpZV9zd19xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjZjMjMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L3BjaWVfc3dfcXVldWUvYmNtdHJfcGNpZV9zd19xdWV1ZS5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogYmNtX3BjaWVfc3dfcXVldWUuaAorICoKKyAqICBDcmVhdGVkIG9uOiAzMSBKYW4gMjAxNworICogICAgICBBdXRob3I6IGlnb3J0CisgKi8KKworI2lmbmRlZiBfQkNNX1BDSUVfU1dfUVVFVUVfSF8KKyNkZWZpbmUgX0JDTV9QQ0lFX1NXX1FVRVVFX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY210cl9wY2llLmg+CisKKy8qIE1lc3NhZ2UgcHJpb3JpdHkgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTVRSX1BDSUVfUFJUWV9VUkdFTlQgPSAwLAorICAgIEJDTVRSX1BDSUVfUFJUWV9OT1JNQUwgPSAxLAorCisgICAgQkNNVFJfUENJRV9QUlRZX19OVU1fT0YKK30gYmNtdHJfcGNpZV9wcnR5OworCisvKiBGaXJzdCB1cmdlbnQgY2hhbm5lbCBpZCAqLworI2RlZmluZSBCQ01UUl9TV1FfRklSU1RfVVJHRU5UX0NIQU5ORUwgICAgIDMwCisKKy8qKiBJbml0aWFsaXplIFBDSSBzb2Z0d2FyZSBxdWV1ZSBtb2R1bGUKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9zd3FfaW5pdCh2b2lkKTsKKworLyogQ2xlYW51cCBzb2Z0d2FyZSBxdWV1ZSBtb2R1bGUKKyAqLwordm9pZCBiY210cl9zd3FfZXhpdCh2b2lkKTsKKworLyoqIEluaXRpYWxpemUgUENJIHNvZnR3YXJlIHF1ZXVlIG1vZHVsZSBmb3IgYSBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX2RldmljZV9pbml0KHVpbnQ4X3QgZGV2aWNlKTsKKworLyogQ2xlYW51cCBzb2Z0d2FyZSBxdWV1ZSBtb2R1bGUgZm9yIGEgZGV2aWNlCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgIE1hcGxlIGRldmljZSBpbmRleAorICovCit2b2lkIGJjbXRyX3N3cV9kZXZpY2VfZXhpdCh1aW50OF90IGRldmljZSk7CisKKy8qKiBDb25maWd1cmUgVFggcXVldWUuCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcHJ0eSAgICAgICAgUHJpb3JpdHkKKyAqIFxwYXJhbVtpbl0gICBoYXJkcV9zaXplICBNYXggbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBjYW4gYmUgc3VibWl0dGVkIHRvIHRoZSBoL3cgcXVldWUuCisgKiAgICAgICAgICAgICAgMD11bmxpbWl0ZWQuCisgKiBccGFyYW1baW5dICAgc29mdHFfc2l6ZSAgTWF4IG51bWJlciBvZiBidWZmZXJzIHRvIGJlIHF1ZXVlZC4gMD11bmxpbWl0ZWQuCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqIEJDTV9FUlJfT1ZFUkZMT1cgLSBtYXhfc29mdHFfc2l6ZSBidWZmZXIgaXMgd2FpdGluZyB0byBiZSBoYW5kbGluZyBieSB0aGUgcmVjZWl2ZXIKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX3R4X3F1ZXVlX2NmZyh1aW50OF90IGRldmljZSwgYmNtdHJfcGNpZV9wcnR5IHBydHksIHVpbnQzMl90IGhhcmRxX3NpemUsIHVpbnQzMl90IHNvZnRxX3NpemUpOworCisvKiogU2VuZCBidWZmZXIgdG8gdGhlIHBlZXIKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcHJ0eSAgICAgIFByaW9yaXR5CisgKiBccGFyYW1baW5dICAgY2hhbm5lbCAgIENoYW5uZWwgaWQKKyAqIFxwYXJhbVtpbl0gICBidWYgICAgICAgQnVmZmVyIHRvIGJlIHRyYW5zZmVycmVkCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX3NlbmQodWludDhfdCBkZXZpY2UsIHVpbnQ4X3QgY2hhbm5lbCwgYmNtb3NfYnVmICpidWYpOworCisvKiogUmVjZWl2ZSBwYWNrZXQgZnJvbSBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcHJ0eSAgICAgICAgICAgIFByaW9yaXR5CisgKiBccGFyYW1bb3V0XSAgY2hhbm5lbCAgICAgICAgIG1lc3NhZ2UgY2hhbm5lbCBmcm9tIHRoZSBCRAorICogXHBhcmFtW291dF0gIGJ1ZiAgcG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlciBjb250YWluaW5nIHRoZQorICogICAgICAgcmVjZWl2ZWQgcGFja2V0CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX3JlY2VpdmUodWludDhfdCBkZXZpY2UsIGJjbXRyX3BjaWVfcHJ0eSBwcnR5LCB1aW50OF90ICpjaGFubmVsLCBiY21vc19idWYgKipidWYpOworCisvKiogZGF0YV9yZWNlaXZlZCBjYWxsYmFjayBlbmFibGVzIGNhbGxiYWNrLWJhc2VkIHJlY2VpdmUgYnVmZmVyIGRlbGl2ZXJ5CisgKiBpbnN0ZWFkIG9mIC8gaW4gYWRkaXRpb24gdG8gYmNtdHJfc3dxX3JlY2VpdmUoKSBmdW5jdGlvbi4KKyAqIFRoaXMgY2FsbGJhY2sgdGFrZXMgYnVmZmVyIG93bmVyc2hpcAorICovCit0eXBlZGVmIHZvaWQgKCpiY210cl9zd3FfcnhfY2IpKHVpbnQ4X3QgZGV2aWNlLCB1aW50OF90IGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKTsKKworLyoqIFJlZ2lzdGVyIGZvciAiZGF0YSByZWNlaXZlZCIgaW5kaWNhdGlvbiIKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcHJ0eSAgICAgICAgICAgIFByaW9yaXR5CisgKiBccGFyYW1baW5dICAgY2IgICAgICAgICAgICAgIENhbGxiYWNrIHBvaW50ZXIKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9zd3FfcnhfY2JfcmVnaXN0ZXIodWludDhfdCBkZXZpY2UsIGJjbXRyX3BjaWVfcHJ0eSBwcnR5LCBiY210cl9zd3FfcnhfY2IgcnhfY2IpOworCisvKiogVW5yZWdpc3RlciAiZGF0YSByZWNlaXZlZCBpbmRpY2F0aW9uIiBjYWxsYmFjaworICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtpbl0gICBwcnR5ICAgICAgICAgICAgUHJpb3JpdHkKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9zd3FfcnhfY2JfdW5yZWdpc3Rlcih1aW50OF90IGRldmljZSwgYmNtdHJfcGNpZV9wcnR5IHBydHkpOworCisvKiogRmV0Y2ggZGF0YSBmcm9tIHRoZSBodyB0byB0aGUgc3cgcXVldWUuCisgKgorICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgUlggaW50ZXJydXB0CisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtvdXRdICBuYnVmICAgICAgICAgICAgUGVyIHByaW9yaXR5IGFycmF5IHdpdGggbnVtYmVyIG9mIGJ1ZmZlcnMKKyAqLwordm9pZCBiY210cl9zd3FfcnhfcG9sbCh1aW50OF90IGRldmljZSwgdWludDMyX3QgbmJ1ZltdKTsKKworLyoqIFN1Ym1pdCBkYXRhIGZyb20gdGhlIHN3IFRYIHF1ZXVlIHRvIHRoZSBoL3cKKyAqCisgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHRyaWdnZXJlZCBieSBUWAorICogY29tcGxldGlvbiBpbnRlcnJ1cHQKKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICovCit2b2lkIGJjbXRyX3N3cV90eF9zdWJtaXQodWludDhfdCBkZXZpY2UpOworCisjZW5kaWYgLyogX0JDTV9QQ0lFX1NXX1FVRVVFX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5MDVlYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMgQ29tbW9uIHV0aWxpdGllcworIworTU9EX05BTUUgPSB1dGlscworTU9EX1RZUEUgPSBsaWIKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgIE1PRF9ERVBTID0gdXRpbHNfbGludXgKK2VuZGlmCitzcmNzID0gYmNtb2x0X3V0aWxzLmMgYmNtb2x0X2J1Zi5jIGJjbW9sdF9iaXRfdXRpbHMuYyBiY21vbHRfY29udi5jIGJjbW9sdF9zdHJpbmcuYwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9iaXRfdXRpbHMuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYml0X3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwYzA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYml0X3V0aWxzLmMKQEAgLTAsMCArMSwzNzAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJiY21vbHRfYml0X3V0aWxzLmgiCisKKworLyoqIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHNwYWNlIGZvciBhbiBhcnJheSBvZiBgbmJpdHMnIGJpdHMgYW5kIGluaXRhbGl6ZQorICogIHRoZSBiaXRzIHRvIGFsbCBiZSB6ZXJvLgorICoKKyAqIFxwYXJhbVtvdXRdICBidiAgICAgIHBvaW50ZXIgdG8gYSBiaXRfdmVjdG9yIHN0cnVjdC4KKyAqIFxwYXJhbVtpbl0gICBuYml0cyAgIG51bWJlciBvZiBiaXRzIHRvIGFsbG9jYXRlLgorICogXHJldHVybiAgICAgIEZBTFNFIGlmIHNwYWNlIHdhcyBub3QgYXZhaWxhYmxlLCBvdGhlcndpc2UgVFJVRS4KKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYnZfbmV3KGJpdF92ZWN0b3IgKmJ2LCBjb25zdCB1aW50MzJfdCBuYml0cykKK3sKKyAgICB1aW50MzJfdCBud29yZHMgPSBCQ01PU19ESVZJREVfUk9VTkRfVVAobmJpdHMsIChCSVRTX1NaKSk7CisKKyAgICBidi0+bmJpdHMgID0gbmJpdHM7CisgICAgYnYtPnZlY3RvciA9IChidl9iaXRzICopY2FsbG9jKG53b3Jkcywgc2l6ZW9mKGJ2X2JpdHMpKTsKKyAgICByZXR1cm4gKGJ2LT52ZWN0b3IgIT0gTlVMTCk7Cit9CisKKworLyoqIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGBvZmZzZXQndGggYml0IGVsZW1lbnQgb2YgdGhlIGJpdCB2ZWN0b3IuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHBhcmFtW2luXSAgIG9mZnNldCAgb2Zmc2V0IG9mIGJpdCB0byB0ZXN0LgorICogXHJldHVybiAgICAgIEZBTFNFIGlmIHRoZSBiaXQgb2Zmc2V0IGlzIG91dCBvZiByYW5nZSwgb3RoZXJ3aXNlIFRSVUUuCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J2X2dldChjb25zdCBiaXRfdmVjdG9yICpidiwgY29uc3QgdWludDMyX3Qgb2Zmc2V0KQoreworICAgIGJjbW9zX2Jvb2wgICAgcnYgPSBCQ01PU19GQUxTRTsKKworICAgIGlmIChvZmZzZXQgPD0gYnYtPm5iaXRzKQorICAgIHsKKyAgICAgICAgcnYgPSB0ZXN0X2JpdHNfc2V0KGJ2LT52ZWN0b3JbKG9mZnNldCAvIEJJVFNfU1opXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IChvZmZzZXQgJSBCSVRTX1NaKSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIm91dCBvZiByYW5nZSAldVxuIiwgb2Zmc2V0KTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OworfQorCisKKy8qKiBzZXQgb3IgY2xlYXIgdGhlIGJpdCBpbiBwb3NpdGlvbiBgb2Zmc2V0JyBvZiB0aGUgYml0IHZlY3Rvci4KKyAqICBidi0+dmVjdG9yW2JpdF9wb3NdIGlzIHRvIGJlIHNldCAoYXNzaWduZWQgdG8gMSkgaWYgdmFsdWUgaXMgVFJVRSwKKyAqICBvdGhlcndpc2UgaXQgaXMgdG8gYmUgY2xlYXJlZCAoYXNzaWduZWQgdG8gMCkuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHBhcmFtW2luXSAgIG9mZnNldCAgb2Zmc2V0IG9mIGJpdCB0byBzZXQgb3IgY2xlYXIuCisgKiBccGFyYW1baW5dICAgdmFsdWUgICBib29sZWFuIHZhbHVlLiBUUlVFIGZvciBzZXQsIEJDTU9TX0ZBTFNFIGZvciBjbGVhci4KKyAqIFxyZXR1cm4gICAgICBGQUxTRSBpZiB0aGUgYml0IG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UsIG90aGVyd2lzZSBUUlVFLgorICovCit2b2lkIGJjbW9sdF9idl9hc3NpZ24oYml0X3ZlY3RvciAgICAgICAqYnYsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9zX2Jvb2wgIHZhbHVlKQoreworICAgIGlmIChvZmZzZXQgPD0gYnYtPm5iaXRzKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBidi0+dmVjdG9yW29mZnNldCAvIEJJVFNfU1pdIHw9ICgxIDw8IChvZmZzZXQgJSBCSVRTX1NaKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBidi0+dmVjdG9yW29mZnNldCAvIEJJVFNfU1pdICY9IH4oMSA8PCAob2Zmc2V0ICUgQklUU19TWikpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigib3V0IG9mIHJhbmdlICV1XG4iLCBvZmZzZXQpOworICAgIH0KK30KKworCisvKiogdG9nZ2xlIHRoZSBiaXQgaW4gcG9zaXRpb24gYG9mZnNldCcgb2YgdGhlIGJpdCB2ZWN0b3IuCisgKiAgaS5lLiBpZiBpdCB3YXMgMSBpdCBpcyAwOyBpZiBpdCB3YXMgMCBpdCBpcyAxLgorICoKKyAqIFxwYXJhbVtpbl0gICBidiAgICAgIHBvaW50ZXIgdG8gYSBiaXRfdmVjdG9yIHN0cnVjdC4KKyAqIFxwYXJhbVtpbl0gICBvZmZzZXQgIG9mZnNldCBvZiBiaXQgdG8gdG9nZ2xlLgorICogXHJldHVybiAgICAgIEZBTFNFIGlmIHRoZSBiaXQgb2Zmc2V0IGlzIG91dCBvZiByYW5nZSwgb3RoZXJ3aXNlIFRSVUUuCisgKi8KK3ZvaWQgYmNtb2x0X2J2X3RvZ2dsZShiaXRfdmVjdG9yICpidiwgY29uc3QgdWludDMyX3Qgb2Zmc2V0KQoreworICAgIGlmIChvZmZzZXQgPD0gYnYtPm5iaXRzKQorICAgIHsKKyAgICAgICAgYnYtPnZlY3RvcltvZmZzZXQgLyBCSVRTX1NaXSBePSAoMSA8PCAob2Zmc2V0ICUgQklUU19TWikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIm91dCBvZiByYW5nZSAldVxuIiwgb2Zmc2V0KTsKKyAgICB9Cit9CisKKworLyoqIGNvcHkgYml0IHZlY3RvciBmcm9tICdzcmMnIHRvICdkc3QnLgorICoKKyAqIFxwYXJhbVtvdXRdICBkc3QgICAgIHBvaW50ZXIgdG8gYSBiaXRfdmVjdG9yIHN0cnVjdCB0byBjb3B5IHRvLgorICogXHBhcmFtW2luXSAgIHNyYyAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0IHRvIGNvcHkgZnJvbS4KKyAqIFxwYXJhbVtpbl0gICBuYml0cyAgIG51bWJlciBvZiBiaXRzIHRvIGNvcHkuCisgKiBccmV0dXJuICAgICAgbm9uZS4KKyAqLwordm9pZCBiY21vbHRfYnZfY29weShiaXRfdmVjdG9yICAgICAgICAqZHN0LCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYml0X3ZlY3RvciAgKnNyYywgCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgICBuYml0cykKK3sKKyAgICB1aW50MzJfdCAgaTsKKyAgICB1aW50MzJfdCAgbndvcmRzICAgID0gbmJpdHMgLyBCSVRTX1NaOworICAgIGJ2X2JpdHMgICBiaXRfcmVtYWluZGVyID0gbmJpdHMgJSBCSVRTX1NaOworCisgICAgaWYgKChuYml0cyA8PSBkc3QtPm5iaXRzKSAmJiAobmJpdHMgPD0gc3JjLT5uYml0cykpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdC0+dmVjdG9yW2ldID0gc3JjLT52ZWN0b3JbaV07CisgICAgICAgIH0KKworICAgICAgICBpZiAoMCAhPSBiaXRfcmVtYWluZGVyKQorICAgICAgICB7CisgICAgICAgICAgICBkc3QtPnZlY3Rvcltud29yZHNdID0gKGRzdC0+dmVjdG9yW253b3Jkc10gJiB+KCgyXmJpdF9yZW1haW5kZXIpIC0gMSkpIHwKKyAgICAgICAgICAgICAgICAoc3JjLT52ZWN0b3JbbndvcmRzXSAmICgoMl5iaXRfcmVtYWluZGVyKSAtIDEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIm91dCBvZiByYW5nZSAldVxuIiwgbmJpdHMpOworICAgIH0KK30KKworCisvKiogUHJpbnQgYml0IHBhdHRlcm4gb2Ygd29yZCBGT1JNQVRURUQgdG8gc3RyaW5nLgorICoKKyAqIFxwYXJhbVtpbl0gICB2YWx1ZSAgIHZhbHVlIHRvIHRyYW5zZm9ybSB0byBiaXQgc3RyaW5nLgorICogXHBhcmFtW2luXSAgIGJpdGNudCAgY291bnQgb2YgYml0cyB0byBiZSBzaG93bi4KKyAqIFxwYXJhbVtvdXRdICBvdXRzdHIgIHBvaW50ZXIgdG8gYSBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIHRoZSBzdHJpbmcuCisgKiBccmV0dXJuICAgICAgbm9uZQorICogXHdhcm5pbmcgICAgIHRoaXMgZm4gZG9lc24ndCBjaGVjayB0aGUgc2l6ZSBvZiAnb3V0c3RyJy4KKyAqICAgICAgICAgICAgICB0aGUgY2FsbGVyIHNob3VsZCBlbnN1cmUgJ291dHN0cicgaGFzIGVub3VnaCByb29tIGZvciB0aGUKKyAqICAgICAgICAgICAgICBiaXQgc3RyaW5nLCBzcGFjZSBjaGFyYWN0ZXJzIGFuZCBudWxsIHRlcm1pbmF0b3IuCisgKi8KK3ZvaWQgYmNtb2x0X2JpdF9zdHJpbmcoY29uc3QgYnZfYml0cyB2YWx1ZSwgY29uc3QgdWludDMyX3QgYml0Y250LCBjaGFyICpvdXRzdHIpCit7CisgICAgdWludDMyX3QgIG9mZnNldDsKKworICAgIGlmIChiaXRjbnQgPD0gQklUU19TWikKKyAgICB7CisgICAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgYml0Y250OyBvZmZzZXQrKykKKyAgICAgICAgeworICAgICAgICAgICAgKm91dHN0cisrID0gKCh2YWx1ZSA+PiBvZmZzZXQpICYgMSkgKyAnMCc7CisgICAgICAgICAgICBpZiAoKCgob2Zmc2V0ICsgMSkgJSA0KSA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqb3V0c3RyKysgPSAnICc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqb3V0c3RyID0gJ1wwJzsKK30KKworCisvKiogUHJpbnQgYWxsIGJpdHMgaW4gdGhlIGJpdCB2ZWN0b3IuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHJldHVybiAgICAgIG5vbmUuCisgKi8KK3ZvaWQgYmNtb2x0X2J2X2R1bXAoY29uc3QgYml0X3ZlY3RvciAqYnYpCit7CisgICAgdWludDMyX3QgIGlkeDsgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIGlkeCAqLworICAgIGNoYXIgICAgICBvdXRzdHJbQklUU19TWiArIDggKyAxXTsgICAgLyogOCBzcGFjZXMgKyBudWxsICovCisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IChidi0+bmJpdHMgLyBCSVRTX1NaKTsgaWR4KyspCisgICAgeworICAgICAgICBiY21vbHRfYml0X3N0cmluZyhidi0+dmVjdG9yW2lkeF0sIEJJVFNfU1osIG91dHN0cik7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXNcbiIsIG91dHN0cik7CisgICAgfQorCisgICAgaWYgKDAgIT0gKGJ2LT5uYml0cyAlIEJJVFNfU1opKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2JpdF9zdHJpbmcoYnYtPnZlY3RvcltpZHhdLCAoYnYtPm5iaXRzICUgQklUU19TWiksIG91dHN0cik7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXNcbiIsIG91dHN0cik7CisgICAgfQorfQorCisKKy8qKiBDb3VudCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIGEgbG9uZyBpbnRlZ2VyLgorICoKKyAqIFxwYXJhbVtpbl0gICBudW0gICAgIGludGVnZXIgdmFsdWUuCisgKiBccmV0dXJuICAgICAgbnVtYmVyIG9mIGJpdHMgc2V0LgorICovCit1aW50MzJfdCBiY21vbHRfYml0X2NvdW50KHVpbnQzMl90IG51bSkKK3sKKyAgICBudW0gPSAoKG51bSAmIDB4QUFBQUFBQUFMKSA+PiAgMSkgKyAobnVtICYgMHg1NTU1NTU1NUwpOworICAgIG51bSA9ICgobnVtICYgMHhDQ0NDQ0NDQ0wpID4+ICAyKSArIChudW0gJiAweDMzMzMzMzMzTCk7CisgICAgbnVtID0gKChudW0gJiAweEYwRjBGMEYwTCkgPj4gIDQpICsgKG51bSAmIDB4MEYwRjBGMEZMKTsKKyAgICBudW0gPSAoKG51bSAmIDB4RkYwMEZGMDBMKSA+PiAgOCkgKyAobnVtICYgMHgwMEZGMDBGRkwpOworICAgIG51bSA9ICgobnVtICYgMHhGRkZGMDAwMEwpID4+IDE2KSArIChudW0gJiAweDAwMDBGRkZGTCk7CisgICAgcmV0dXJuIG51bTsKK30KKworCisvKiogQ291bnQgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgd2hvbGUgYml0IHZlY3Rvci4KKyAqCisgKiBccGFyYW1baW5dICAgYnYgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgdmVjdG9yIHN0cnVjdC4KKyAqIFxyZXR1cm4gICAgICBudW1iZXIgb2YgYml0cyBzZXQuCisgKi8KK3VpbnQzMl90IGJjbW9sdF9idl9iaXRfY291bnQoY29uc3QgYml0X3ZlY3RvciAqYnYpCit7CisgICAgdWludDMyX3QgIG53b3JkcyA9IEJDTU9TX0RJVklERV9ST1VORF9VUChidi0+bmJpdHMsIChCSVRTX1NaKSk7CisgICAgdWludDMyX3QgIGNudCA9IDA7CisKKyAgICB3aGlsZSAoMCAhPSBud29yZHMtLSkKKyAgICB7CisgICAgICAgIGNudCArPSBiY21vbHRfYml0X2NvdW50KGJ2LT52ZWN0b3JbbndvcmRzXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNudDsKK30KKworCisKKy8qKiBDb3B5IGJpdCByYW5nZSBmcm9tIGEgMzItYml0IHdvcmQgYXJyYXkgdG8gYW4gYXJiaXRyYXJ5IGJpdCBwb3NpdGlvbiBvZgorICogIHRoZSBkZXN0aW5hdGlvbiAzMi1iaXQgd29yZCBhcnJheS4KKyAqCisgKiBccGFyYW1baW5dICAgZHN0ICAgICAgICAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogXHBhcmFtW2luXSAgIGRzdF9ieXRlcyAgICAgICBkZXN0aW5hdGlvbiBidWZmZXIgc2l6ZSBpbiBieXRlcworICogXHBhcmFtW2luXSAgIGRzdF9iaXRfcG9zICAgICBsZWFzdCBiaXQgcG9zaXRpb24gdG8gZGVzdAorICogXHBhcmFtW2luXSAgIHNyYyAgICAgICAgICAgICBzb3VyY2UgYnVmZmVyCisgKiBccGFyYW1baW5dICAgbl9iaXRzICAgICAgICAgIGhvdyBtYW55IGJpdHMgdG8gY29weSBmcm9tIHNvdXJjZQorICogXG5vdGUgICAgICAgIHNyYyBpcyBpbiBsaXR0bGUgZW5kaWFuIGFuZCBkc3QgaXMgaW4gYmlnIGVuZGlhbi4KKyAqLwordm9pZCBiY21vc19iaXRfcmFuZ2Vfc2V0KHVpbnQzMl90ICpkc3QsIHVpbnQzMl90IGRzdF9ieXRlcywgdWludDE2X3QgZHN0X2JpdF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNyYywgdWludDE2X3Qgbl9iaXRzKQoreworICAgIHVpbnQxNl90ICAgIGJwID0gZHN0X2JpdF9wb3M7CisgICAgdWludDE2X3QgICAgbGVuOworICAgIHVpbnQzMl90ICAgIHdwOworICAgIHVpbnQzMl90ICAgIG1hc2s7CisgICAgdWludDMyX3QgICAgc3JjX2lkeDsKKyAgICB1aW50MzJfdCAgICBkc3RfaWR4OworCisgICAgd3AgPSBicCAvIDMyOworICAgIGJwID0gYnAgJiAoMzIgLSAxKTsKKyAgICBzcmNfaWR4ID0gMDsKKworICAgIGZvciAobGVuID0gbl9iaXRzOyBsZW4gPiAwOyBsZW4gLT0gMzIpCisgICAgeworICAgICAgICBpZiAoYnAgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbWFzayA9IChsZW4gPCAzMikgPyAoMSA8PCBsZW4pIC0gMSA6IDB4RkZGRkZGRkY7CisgICAgICAgICAgICBkc3RfaWR4ID0gd3A7CisgICAgICAgICAgICBkc3RbZHN0X2lkeF0gJj0gfihtYXNrIDw8IGJwKTsKKyAgICAgICAgICAgIGRzdFtkc3RfaWR4XSB8PSBzcmNbc3JjX2lkeF0gPDwgYnA7CisgICAgICAgICAgICB3cCsrOworICAgICAgICAgICAgaWYgKGxlbiA+ICgzMiAtIGJwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RfaWR4ID0gd3A7CisgICAgICAgICAgICAgICAgZHN0W2RzdF9pZHhdICY9IH4obWFzayA+PiAoMzIgLSBicCkpOworICAgICAgICAgICAgICAgIGRzdFtkc3RfaWR4XSB8PSBzcmNbc3JjX2lkeF0gPj4gKDMyIC0gYnApICYgKCgxIDw8IGJwKSAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZHN0X2lkeCA9IHdwOworICAgICAgICAgICAgaWYgKGxlbiA8IDMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hc2sgPSAoMSA8PCBsZW4pIC0gMTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0X2lkeF0gJj0gfm1hc2s7CisgICAgICAgICAgICAgICAgZHN0W2RzdF9pZHhdIHw9IHNyY1tzcmNfaWR4XSA8PCBicDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0X2lkeF0gPSBzcmNbc3JjX2lkeF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cCsrOworICAgICAgICB9CisgICAgICAgIHNyY19pZHgrKzsKKyAgICB9Cit9CisKKworLyoqIEdldCBiaXQgcmFuZ2UgYXQgYW4gYXJiaXRyYXJ5IGJpdCBwb3NpdGlvbiBvZiBhIDMyLWJpdCB3b3JkIGFycmF5CisgKiAKKyAqIFxwYXJhbVtpbl0gICBzcmMgICAgICAgICAgICAgc291cmNlIGJ1ZmZlciAoZS5nLiBkYXRhcG9ydCkKKyAqIFxwYXJhbVtpbl0gICBzcmNfYnl0ZXMgICAgICAgc291cmNlIGJ1ZmZlciBzaXplIGluIGJ5dGVzCisgKiBccGFyYW1baW5dICAgc3JjX2JpdF9wb3MgICAgIGxlYXN0IGJpdCBwb3NpdGlvbiBvZiB0aGUgc291cmNlCisgKiBccGFyYW1baW5dICAgZHN0ICAgICAgICAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byBzdG9yZSB0aGUgYml0IHZhbHVlCisgKiBccGFyYW1baW5dICAgbl9iaXRzICAgICAgICAgIGhvdyBtYW55IGJpdHMgdG8gY29weSBmcm9tIHNyb3VjZQorICogXG5vdGUgICAgICAgIHNyYyBpcyBpbiBiaWcgZW5kaWFuIGFuZCBkc3QgaXMgaW4gbGl0dGxlIGVuZGlhbi4KKyAqLwordm9pZCBiY21vc19iaXRfcmFuZ2VfZ2V0KGNvbnN0IHVpbnQzMl90ICpzcmMsIHVpbnQzMl90IHNyY19ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcmNfYml0X3BvcywgdWludDMyX3QgKmRzdCwgdWludDE2X3Qgbl9iaXRzKQoreworICAgIHVpbnQxNl90ICAgIGJwID0gc3JjX2JpdF9wb3M7ICAgLyogZm9yIHJlYWRhYmlsaXR5ICovCisgICAgdWludDE2X3QgICAgbGVuID0gbl9iaXRzOworICAgIHVpbnQzMl90ICAgIHdwOworICAgIHVpbnQzMl90ICAgIHNyY19pZHg7CisgICAgdWludDMyX3QgICAgZHN0X2lkeDsKKworICAgIGlmIChuX2JpdHMgPT0gMSkKKyAgICB7CisgICAgICAgIHdwID0gYnAgLyAzMjsKKyAgICAgICAgYnAgPSBicCAmICgzMiAtIDEpOworICAgICAgICBzcmNfaWR4ID0gQkNNT1NfRElWSURFX1JPVU5EX1VQKHNyY19ieXRlcywgNCkgLSAxIC0gd3A7CisgICAgICAgIGRzdFswXSA9ICgoc3JjW3NyY19pZHhdICYgKDEgPDwgYnApKSAhPSAwKSA/IDE6IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3cCA9IGJwIC8gMzI7CisgICAgYnAgPSBicCAmICgzMiAtIDEpOworICAgIGRzdF9pZHggPSAwOworCisgICAgZm9yICg7IGxlbiA+IDA7IGxlbiAtPSAzMikKKyAgICB7CisgICAgICAgIGlmIChicCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzcmNfaWR4ID0gQkNNT1NfRElWSURFX1JPVU5EX1VQKHNyY19ieXRlcywgNCkgLSAxIC0gd3A7CisgICAgICAgICAgICBkc3RbZHN0X2lkeF0gPSBzcmNbc3JjX2lkeF0gPj4gYnAgJiAoKDEgPDwgKDMyIC0gYnApKSAtIDEpOworICAgICAgICAgICAgd3ArKzsKKyAgICAgICAgICAgIGlmIChsZW4gPiAoMzIgLSBicCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3JjX2lkeCA9IEJDTU9TX0RJVklERV9ST1VORF9VUChzcmNfYnl0ZXMsIDQpIC0gMSAtIHdwOworICAgICAgICAgICAgICAgIGRzdFtkc3RfaWR4XSB8PSBzcmNbc3JjX2lkeF0gPDwgKDMyIC0gYnApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3JjX2lkeCA9IEJDTU9TX0RJVklERV9ST1VORF9VUChzcmNfYnl0ZXMsIDQpIC0gMSAtIHdwOworICAgICAgICAgICAgZHN0W2RzdF9pZHhdID0gc3JjW3NyY19pZHhdOworICAgICAgICAgICAgd3ArKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4gPCAzMikKKyAgICAgICAgeworICAgICAgICAgICAgZHN0W2RzdF9pZHhdICY9ICgoMSA8PCBsZW4pIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0X2lkeCsrOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9iaXRfdXRpbHMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYml0X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3MTI5MgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYml0X3V0aWxzLmgKQEAgLTAsMCArMSwyNDIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qKgorICogYmNtb2x0X2JpdF91dGlscy5oCisgKiAgQ3JlYXRlZCBvbjogMDMvMTAvMjAxNAorICogICAgICBBdXRob3I6IGNwYXJrMQorICoKKyAqIFRoaXMgYml0IHZlY3RvciBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIGZvciB0aGUgRVBPTiBlbmNyeXB0aW9uLgorICogVGhlcmUgaXMgYSBjZXJ0YWluIGhhcmR3YXJlIHJlc3RyaWN0aW9uIHRoYXQgdGhlIGdsb2JhbCBlbmNyeXB0aW9uIG1vZGUKKyAqIGNhbiBub3QgYmUgY2hhbmdlZCB3aGVuIGEgbGluayBlbmNyeXB0aW9uIGlzIGNvbmZpZ3VyZWQgZm9yIGEgZGlmZmVyZW50CisgKiBlbmNyeXB0aW9uIG1vZGUuCisgKiBMaWtld2lzZSwgdGhlIGxpbmsgZW5jcnlwdGlvbiBtb2RlIGNhbiBub3QgYmUgY2hhbmdlZCBpZiB0aGUgZ2xvYmFsCisgKiBlbmNyeXB0aW9uIG1vZGUgaXMgc2V0IHRvIG90aGVyIG1vZGUuCisgKiBUaGVyZWZvcmUsIHdoZW4gdGhlIGhvc3QgdHJpZXMgdG8gY2hhbmdlIGFueSBvZiB0aGVtLCB0aGUgT0xUIG5lZWRzIHRvCisgKiBjaGVjayBlaXRoZXIgdGhlIGdsb2JhbCBlbmNyeXB0aW9uIG1vZGUgb3IgdGhlIGxpbmsgZW5jcnlwdGlvbiBtb2RlCisgKiBiZWZvcmUgYXBwbHlpbmcgdGhlIGNoYW5nZS4KKyAqIEluIHRoZSBvbGQgaW1wbGVtZW50YXRpb24gKGxpa2UgUGlvbmVlciksIHRoZSBmaXJtd2FyZSBpdGVyYXRlcyB0aHJvdWdoCisgKiBldmVyeSBsaW5rIHJlY29yZHMgb2YgZWFjaCBQT04gcG9ydCBhbmQgY2hlY2sgdGhlIGVuY3J5cHRpb24gbW9kZSBvZiBlYWNoLgorICogVGhpcyBpcyB2ZXJ5IGluZWZmaWNpZW50IGFuZCB0aW1lIGNvbnN1bWluZy4KKyAqIFRoZSBob3N0IG1heSB3YW50IHRvIGtub3cgaG93IG1hbnkgbGlua3MgYXJlIGVuYWJsZWQgZm9yIHRoZSBlbmNyeXB0aW9uLAorICogb3Igd2hpY2ggbGluayBpcyBlbmFibGVkLCBldGMuCisgKiBJIHRob3VnaHQgdGhhdCBhIGJpdCB2ZWN0b3IgaW1wbGVtZW50YXRpb24gaXMgYmVzdCBzYXRpc2ZpZXMuCisgKiBBbHNvLCB0aGlzIGltcGxlbWVudGF0aW9uIGV4YWN0bHkgcmVmbGVjdHMgdGhlIElDIGltcGxlbWVudGF0aW9uLCBzbyB3ZQorICogY2FuIHVzZSBpdCB0byBtaXJyb3IgdGhlIGhhcmR3YXJlIHN0YXR1cy4KKyAqCisgKi8KKworI2lmbmRlZiBCQ01PTFRfQklUX1VUSUxTX0gKKyNkZWZpbmUgQkNNT0xUX0JJVF9VVElMU19ICisKKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorCisKKy8qIHRoZSBjdXJyZW50IChkcmFmdCkgZGVzaWduIG9mIHRoZSBBU0lDIHVzZXMgMzItYml0IGJpdG1hcCBkYXRhIHBvcnQgKi8KK3R5cGVkZWYgdWludDMyX3QgICAgYnZfYml0czsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCAgbmJpdHM7CisgICAgYnZfYml0cyAgKnZlY3RvcjsKK30gYml0X3ZlY3RvcjsKKworCisjZGVmaW5lIEJJVFNfU1ogICAgIChzaXplb2YoYnZfYml0cykgKiBDSEFSX0JJVCkKKworI2RlZmluZSBCSVRTX1NFVCh2YWwsIG1hc2spICgoKHZhbCkgJiAobWFzaykpID09IChtYXNrKSkKKworLyoqIFRlc3QgaWYgYWxsIGdpdmVuIGJpdHMgYXJlIHNldCBpbiB0aGUgZ2l2ZW4gZGF0YSB3b3JkCisgKiBccGFyYW1baW5dICAgd29yZCAgICBHaXZlbiBkYXRhIHdvcmQgdG8gdGVzdAorICogXHBhcmFtW2luXSAgIG1hc2sgICAgVGVzdCBtYXNrCisgKiBccmV0dXJuICAgICAgVFJVRSBpZiBhbGwgdGhlIGJpdHMgaW4gdGhlIGJpdE1hc2sgYXJlIHNldAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgdGVzdF9iaXRzX3NldCh1aW50MzJfdCB3b3JkLCB1aW50MzJfdCBtYXNrKQoreworICAgIHJldHVybiAoKHdvcmQgJiBtYXNrKSA9PSBtYXNrKTsKK30KKworLyoqIFRlc3QgaWYgYWxsIGdpdmVuIGJpdHMgYXJlIGNsZWFyIGluIHRoZSBnaXZlbiBkYXRhIHdvcmQKKyAqIFxwYXJhbSAgICAgICB3b3JkICAgIEdpdmVuIHdvcmQgdG8gdGVzdAorICogXHBhcmFtICAgICAgIG1hc2sgVGVzdCBtYXNrCisgKiBccmV0dXJuICAgICAgVFJVRSBpZiBhbGwgdGhlIGJpdHMgZ2l2ZW4gYnkgYml0TWFzayBhcmUgY2xlYXIKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIHRlc3RfYml0c19jbGVhcih1aW50MzJfdCB3b3JkLCB1aW50MzJfdCBtYXNrKQoreworICAgIHJldHVybiAod29yZCAmIG1hc2spID09IDA7Cit9CisKKy8qKiBUZXN0IHdoZXRoZXIgYW55IG9mIHRoZSBnaXZlbiBiaXRzIGFyZSBzZXQgaW4gYSB2YWx1ZQorICogXHBhcmFtW2luXSAgIHZhbCAgICAgVGhlIHZhbHVlIHRvIHRlc3QKKyAqIFxwYXJhbVtpbl0gICBiaXRzICAgIFRoZSBiaXRzIHRvIHRlc3QgZm9yCisgKiBccmV0dXJuICAgICAgVFJVRSBpZiBhbnkgb2YgdGhlIGJpdHMgYXJlIHNldCBpbiB0aGUgdmFsdWUsIEZBTFNFIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgdGVzdF9iaXRzX2FueSh1aW50MzJfdCB2YWwsIHVpbnQzMl90IGJpdHMpCit7CisgICAgcmV0dXJuICh2YWwgJiBiaXRzKSAhPSAwOworfQorCisKKy8qKiByZXR1cm4gdHJ1ZSBpZiBvbmx5IG9uZSBiaXQgaXMgc2V0IGZvciBhIGdpdmVuIGludGVnZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBpc19vbmVfYml0X3NldCh1aW50MzJfdCBudW1iZXIpCit7CisgICAgcmV0dXJuIChudW1iZXIgJiAobnVtYmVyIC0gMSkpID09IDA7Cit9CisKKworCisvKiogZHluYW1pY2FsbHkgYWxsb2NhdGUgc3BhY2UgZm9yIGFuIGFycmF5IG9mIGBuYml0cycgYml0cyBhbmQgaW5pdGFsaXplCisgKiAgdGhlIGJpdHMgdG8gYWxsIGJlIHplcm8uCisgKgorICogXHBhcmFtW291dF0gIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHBhcmFtW2luXSAgIG5iaXRzICAgbnVtYmVyIG9mIGJpdHMgdG8gYWxsb2NhdGUuCisgKiBccmV0dXJuICAgICAgRkFMU0UgaWYgc3BhY2Ugd2FzIG5vdCBhdmFpbGFibGUsIG90aGVyd2lzZSBUUlVFLgorICovCitiY21vc19ib29sIGJjbW9sdF9idl9uZXcoYml0X3ZlY3RvciAqYnYsIGNvbnN0IHVpbnQzMl90IG5iaXRzKTsKKworCisvKiogcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYG9mZnNldCd0aCBiaXQgZWxlbWVudCBvZiB0aGUgYml0IHZlY3Rvci4KKyAqCisgKiBccGFyYW1baW5dICAgYnYgICAgICBwb2ludGVyIHRvIGEgYml0X3ZlY3RvciBzdHJ1Y3QuCisgKiBccGFyYW1baW5dICAgb2Zmc2V0ICBvZmZzZXQgb2YgYml0IHRvIHRlc3QuCisgKiBccmV0dXJuICAgICAgRkFMU0UgaWYgdGhlIGJpdCBvZmZzZXQgaXMgb3V0IG9mIHJhbmdlLCBvdGhlcndpc2UgVFJVRS4KKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYnZfZ2V0KGNvbnN0IGJpdF92ZWN0b3IgKmJ2LCBjb25zdCB1aW50MzJfdCBvZmZzZXQpOworCisKKy8qKiBzZXQgb3IgY2xlYXIgdGhlIGJpdCBpbiBwb3NpdGlvbiBgb2Zmc2V0JyBvZiB0aGUgYml0IHZlY3Rvci4KKyAqICBidi0+dmVjdG9yW2JpdF9wb3NdIGlzIHRvIGJlIHNldCAoYXNzaWduZWQgdG8gMSkgaWYgdmFsdWUgaXMgVFJVRSwKKyAqICBvdGhlcndpc2UgaXQgaXMgdG8gYmUgY2xlYXJlZCAoYXNzaWduZWQgdG8gMCkuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHBhcmFtW2luXSAgIG9mZnNldCAgb2Zmc2V0IG9mIGJpdCB0byBzZXQgb3IgY2xlYXIuCisgKiBccGFyYW1baW5dICAgdmFsdWUgICBib29sZWFuIHZhbHVlLiBUUlVFIGZvciBzZXQsIEZBTFNFIGZvciBjbGVhci4KKyAqIFxyZXR1cm4gICAgICBGQUxTRSBpZiB0aGUgYml0IG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UsIG90aGVyd2lzZSBUUlVFLgorICovCit2b2lkIGJjbW9sdF9idl9hc3NpZ24oYml0X3ZlY3RvciAqYnYsIGNvbnN0IHVpbnQzMl90IG9mZnNldCwgY29uc3QgYmNtb3NfYm9vbCB2YWx1ZSk7CisKKworLyoqIHNldCBvciBjbGVhciAnbmJpdHMnIGJpdHMgb2YgZ2l2ZW4gYml0IHZlY3Rvci4KKyAqCisgKiBccGFyYW1baW5dICAgYnYgICAgICBwb2ludGVyIHRvIGEgYml0X3ZlY3RvciBzdHJ1Y3QuCisgKiBccGFyYW1baW5dICAgbmJpdHMgICBudW1iZXIgb2YgYml0cyB0byBzZXQgb3IgY2xlYXIuCisgKiBccGFyYW1baW5dICAgdmFsdWUgICBib29sZWFuIHZhbHVlLiBUUlVFIGZvciBzZXQsIEZBTFNFIGZvciBjbGVhci4KKyAqIFxyZXR1cm4gICAgICBGQUxTRSBpZiB0aGUgYml0IG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UsIG90aGVyd2lzZSBUUlVFLgorICovCit2b2lkIGJ2X2Fzc2lnbl9uYml0cyhiaXRfdmVjdG9yICpidiwgY29uc3QgdWludDMyX3QgbmJpdHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vc19ib29sIHZhbHVlKTsKKworCisvKiogdG9nZ2xlIHRoZSBiaXQgaW4gcG9zaXRpb24gYG9mZnNldCcgb2YgdGhlIGJpdCB2ZWN0b3IuCisgKiAgaS5lLiBpZiBpdCB3YXMgMSBpdCBpcyAwOyBpZiBpdCB3YXMgMCBpdCBpcyAxLgorICoKKyAqIFxwYXJhbVtpbl0gICBidiAgICAgIHBvaW50ZXIgdG8gYSBiaXRfdmVjdG9yIHN0cnVjdC4KKyAqIFxwYXJhbVtpbl0gICBvZmZzZXQgIG9mZnNldCBvZiBiaXQgdG8gdG9nZ2xlLgorICogXHJldHVybiAgICAgIEZBTFNFIGlmIHRoZSBiaXQgb2Zmc2V0IGlzIG91dCBvZiByYW5nZSwgb3RoZXJ3aXNlIFRSVUUuCisgKi8KK3ZvaWQgYmNtb2x0X2J2X3RvZ2dsZShiaXRfdmVjdG9yICpidiwgY29uc3QgdWludDMyX3Qgb2Zmc2V0KTsKKworCisvKiogY29weSBiaXQgdmVjdG9yIGZyb20gJ3NyYycgdG8gJ2RzdCcuCisgKgorICogXHBhcmFtW291dF0gIGRzdCAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0IHRvIGNvcHkgdG8uCisgKiBccGFyYW1baW5dICAgc3JjICAgICBwb2ludGVyIHRvIGEgYml0X3ZlY3RvciBzdHJ1Y3QgdG8gY29weSBmcm9tLgorICogXHBhcmFtW2luXSAgIG5iaXRzICAgbnVtYmVyIG9mIGJpdHMgdG8gY29weS4KKyAqIFxyZXR1cm4gICAgICBub25lLgorICovCit2b2lkIGJjbW9sdF9idl9jb3B5KGJpdF92ZWN0b3IgKmRzdCwgY29uc3QgYml0X3ZlY3RvciAqc3JjLCBjb25zdCB1aW50MzJfdCBuYml0cyk7CisKKworLyoqIFByaW50IGJpdCBwYXR0ZXJuIG9mIHdvcmQgRk9STUFUVEVEIHRvIHN0cmluZy4KKyAqCisgKiBccGFyYW1baW5dICAgdmFsdWUgICB2YWx1ZSB0byB0cmFuc2Zvcm0gdG8gYml0IHN0cmluZy4KKyAqIFxwYXJhbVtpbl0gICBiaXRjbnQgIGNvdW50IG9mIGJpdHMgdG8gYmUgc2hvd24uCisgKiBccGFyYW1bb3V0XSAgb3V0c3RyICBwb2ludGVyIHRvIGEgb3V0cHV0IGJ1ZmZlciB0byBzdG9yZSB0aGUgc3RyaW5nLgorICogXHJldHVybiAgICAgIG5vbmUKKyAqIFx3YXJuaW5nICAgICB0aGlzIGZuIGRvZXNuJ3QgY2hlY2sgdGhlIHNpemUgb2YgJ291dHN0cicuCisgKiAgICAgICAgICAgICAgdGhlIGNhbGxlciBzaG91bGQgZW5zdXJlICdvdXRzdHInIGhhcyBlbm91Z2ggcm9vbSBmb3IgdGhlCisgKiAgICAgICAgICAgICAgYml0IHN0cmluZywgc3BhY2UgY2hhcmFjdGVycyBhbmQgbnVsbCB0ZXJtaW5hdG9yLgorICovCit2b2lkIGJjbW9sdF9iaXRfc3RyaW5nKGNvbnN0IGJ2X2JpdHMgdmFsdWUsIGNvbnN0IHVpbnQzMl90IGJpdGNudCwgY2hhciAqb3V0c3RyKTsKKworCisvKiogUHJpbnQgYWxsIGJpdHMgaW4gdGhlIGJpdCB2ZWN0b3IuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHJldHVybiAgICAgIG5vbmUuCisgKi8KK3ZvaWQgYmNtb2x0X2J2X2R1bXAoY29uc3QgYml0X3ZlY3RvciAqYnYpOworCisKKy8qKiBDb3VudCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIGEgbG9uZyBpbnRlZ2VyLgorICoKKyAqIFxwYXJhbVtpbl0gICBudW0gICAgIGludGVnZXIgdmFsdWUuCisgKiBccmV0dXJuICAgICAgbnVtYmVyIG9mIGJpdHMgc2V0LgorICovCit1aW50MzJfdCBiY21vbHRfYml0X2NvdW50KHVpbnQzMl90IG51bSk7CisKKworLyoqIENvdW50IHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gdGhlIHdob2xlIGJpdCB2ZWN0b3IuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHZlY3RvciBzdHJ1Y3QuCisgKiBccmV0dXJuICAgICAgbnVtYmVyIG9mIGJpdHMgc2V0LgorICovCit1aW50MzJfdCBiY21vbHRfYnZfYml0X2NvdW50KGNvbnN0IGJpdF92ZWN0b3IgKmJ2KTsKKworCisvKiogQ29weSBiaXQgcmFuZ2UgZnJvbSBhIDMyLWJpdCB3b3JkIGFycmF5IHRvIGFuIGFyYml0cmFyeSBiaXQgcG9zaXRpb24gb2YKKyAqICB0aGUgZGVzdGluYXRpb24gMzItYml0IHdvcmQgYXJyYXkuCisgKgorICogXHBhcmFtW2luXSAgIGRzdCAgICAgICAgICAgICBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICBkc3RfYnl0ZXMgICAgICAgZGVzdGluYXRpb24gYnVmZmVyIHNpemUgaW4gYnl0ZXMKKyAqIFxwYXJhbVtpbl0gICBkc3RfYml0X3BvcyAgICAgbGVhc3QgYml0IHBvc2l0aW9uIHRvIGRlc3QKKyAqIFxwYXJhbVtpbl0gICBzcmMgICAgICAgICAgICAgc291cmNlIGJ1ZmZlcgorICogXHBhcmFtW2luXSAgIHNyY19iaXRzICAgICAgICBtYW55IGJpdHMgdG8gY29weSBmcm9tIHNvdXJjZQorICogXG5vdGUgICAgICAgIHNyYyBpcyBpbiBsaXR0bGUgZW5kaWFuIGFuZCBkc3QgaXMgaW4gYmlnIGVuZGlhbi4KKyAqLwordm9pZCBiY21vc19iaXRfcmFuZ2Vfc2V0KHVpbnQzMl90ICpkc3QsIHVpbnQzMl90IGRzdF9ieXRlcywgdWludDE2X3QgZHN0X2JpdF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNyYywgdWludDE2X3Qgbl9iaXRzKTsKKworLyoqIEdldCBiaXQgcmFuZ2UgYXQgYW4gYXJiaXRyYXJ5IGJpdCBwb3NpdGlvbiBvZiBhIDMyLWJpdCB3b3JkIGFycmF5CisgKgorICogXHBhcmFtW2luXSAgIHNyYyAgICAgICAgICAgICBzb3VyY2UgYnVmZmVyIChlLmcuIGRhdGFwb3J0KQorICogXHBhcmFtW2luXSAgIHNyY19ieXRlcyAgICAgICBzb3VyY2UgYnVmZmVyIHNpemUgaW4gYnl0ZXMKKyAqIFxwYXJhbVtpbl0gICBzcmNfYml0X3BvcyAgICAgbGVhc3QgYml0IHBvc2l0aW9uIG9mIHRoZSBzb3VyY2UKKyAqIFxwYXJhbVtpbl0gICBkc3QgICAgICAgICAgICAgZGVzdGluYXRpb24gYnVmZmVyIHRvIHN0b3JlIHRoZSBiaXQgdmFsdWUKKyAqIFxwYXJhbVtpbl0gICBuX2JpdHMgICAgICAgICAgaG93IG1hbnkgYml0cyB0byBjb3B5IGZyb20gc3JvdWNlCisgKiBcbm90ZSAgICAgICAgc3JjIGlzIGluIGJpZyBlbmRpYW4gYW5kIGRzdCBpcyBpbiBsaXR0bGUgZW5kaWFuLgorICovCit2b2lkIGJjbW9zX2JpdF9yYW5nZV9nZXQoY29uc3QgdWludDMyX3QgKnNyYywgdWludDMyX3Qgc3JjX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNyY19iaXRfcG9zLCB1aW50MzJfdCAqZHN0LCB1aW50MTZfdCBuX2JpdHMpOworCisKKyNlbmRpZiAgLyogQkNNT0xUX0JJVF9VVElMU19IICovCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYnVmLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNTdmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2J1Zi5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSAiYmNtb2x0X2J1Zi5oIgorI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorCisvKiogSW5pdGFsaXplIGEgYmNtb2x0X2J1ZiBzdHJlYW0KKyAqCisgKiBccGFyYW0gYnVmIAorICogXHBhcmFtIHNpemUgCisgKiBccGFyYW0gc3RhcnQKKyAqIFxwYXJhbSBlbmRpYW4gRW5kaWFubmVzcyBvZiBudW1iZXJzIGluIHRoZSByZXN1bHRpbmcgc3RyZWFtCisgKi8KK3ZvaWQgYmNtb2x0X2J1Zl9pbml0KGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3Qgc2l6ZSwgdWludDhfdCAqc3RhcnQsIGJjbW9zX2VuZGlhbiBlbmRpYW4pCit7CisgICAgYnVmLT5sZW4gPSBzaXplOworICAgIGJ1Zi0+Y3VyciA9IHN0YXJ0OworICAgIGJ1Zi0+c3RhcnQgPSBzdGFydDsKKyAgICBidWYtPmZyZWUgPSBOVUxMOworICAgIGJ1Zi0+YmggPSBOVUxMOworICAgIC8qIEN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IHJlYWRpbmcvd3JpdGluZyBudW1iZXJzIGluIGEgc2luZ2xlIGVuZGlhbm5lc3MuICovCisgICAgQlVHX09OKGVuZGlhbiAhPSBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7Cit9CisKKy8qKiBBbGxvY2F0ZSBkYXRhIGJ1ZmZlciBhbmQgaW5pdGlhbGl6ZSBiY21vbHRfYnVmIHN0cmVhbQorICoKKyAqIFxwYXJhbSBidWYKKyAqIFxwYXJhbSBzaXplCisgKiBccGFyYW0gZW5kaWFuIEVuZGlhbm5lc3Mgb2YgbnVtYmVycyBpbiB0aGUgcmVzdWx0aW5nIHN0cmVhbQorICogXHJldHVybiBCQ01fRVJSX09LIG9yIEJDTV9FUlJfTk9NRU0KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2J1Zl9hbGxvYyhiY21vbHRfYnVmICpidWYsIHVpbnQzMl90IHNpemUsIGJjbW9zX2VuZGlhbiBlbmRpYW4pCit7CisgICAgYnVmLT5zdGFydCA9IGJjbW9zX2FsbG9jKHNpemUpOworICAgIGlmIChidWYtPnN0YXJ0ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgYmNtb2x0X2J1Zl9pbml0KGJ1Ziwgc2l6ZSwgYnVmLT5zdGFydCwgZW5kaWFuKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFJlbGVhc2UgZGF0YSBidWZmZXIgcG9pbnRlZCBieSBiY21vbHRfYnVmIHN0cmVhbQorICogXHBhcmFtW2luLG91dF0gYnVmCisgKi8KK3ZvaWQgYmNtb2x0X2J1Zl9mcmVlKGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoYnVmLT5zdGFydCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGJ1Zi0+ZnJlZSkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLT5mcmVlKGJ1Zi0+YmgpOworICAgICAgICAgICAgYnVmLT5mcmVlID0gTlVMTDsKKyAgICAgICAgICAgIGJ1Zi0+YmggPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZnJlZShidWYtPnN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICBidWYtPnN0YXJ0ID0gTlVMTDsKKyAgICB9CisgICAgYnVmLT5sZW4gPSAwOworICAgIGJ1Zi0+Y3VyciA9IE5VTEw7Cit9CisKKy8qKiBSZWFkIGZyb20gdGhlIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgYmNtb2x0X2J1ZiBpbnN0YW5jZQorICogXHBhcmFtIHRvICAgICBXaGVyZSB0byByZWFkIHRvCisgKiBccGFyYW0gbGVuICAgIE51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHN1Y2Nlc3NmdWxseSBjb3BpZWQKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWQoYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICp0bywgc2l6ZV90IGxlbikKK3sKKyAgICBpZiAoKGJ1Zi0+c3RhcnQgKyBidWYtPmxlbikgPj0gKGJ1Zi0+Y3VyciArIGxlbikpCisgICAgeworICAgICAgICBtZW1jcHkodG8sIGJ1Zi0+Y3VyciwgbGVuKTsKKyAgICAgICAgYnVmLT5jdXJyICs9IGxlbjsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCisvKiogVHJhbnNmZXIgYnl0ZXMgZnJvbSBvbmUgYnVmIHRvIGFub3RoZXIKKyAqCisgKiBccGFyYW0gKmZyb20gICAgU291cmNlIGJ1ZmZlcgorICogXHBhcmFtICp0byAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgorICogXHBhcmFtIGJ5dGVzICAgIE51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlcgorICogXHJldHVybiAgICAgICAgIEJDTU9TX1RSVUUgaWYgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl90cmFuc2Zlcl9ieXRlcyhiY21vbHRfYnVmICpmcm9tLCBiY21vbHRfYnVmICp0bywgdWludDMyX3QgYnl0ZXMpCit7CisgICAgdWludDhfdCB0bXBbMjU2XTsKKyAgICB1aW50MzJfdCB0b1JlYWQ7CisgICAgd2hpbGUgKGJ5dGVzICE9IDApCisgICAgeworICAgICAgICB0b1JlYWQgPSBieXRlcyA+IHNpemVvZih0bXApID8gc2l6ZW9mKHRtcCkgOiBieXRlczsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoZnJvbSwgdG1wLCB0b1JlYWQpIHx8ICFiY21vbHRfYnVmX3dyaXRlKHRvLCB0bXAsIHRvUmVhZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVzIC09IHRvUmVhZDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqIFdyaXRlIHRvIHRoZSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmICAgIGJjbW9sdF9idWYgaW5zdGFuY2UKKyAqIFxwYXJhbSBmcm9tICAgU291cmNlLCB0byBjb3B5IGZyb20KKyAqIFxwYXJhbSBsZW4gICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgc3VjY2Vzc2Z1bGx5IGNvcGllZAorICovCitiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGUoYmNtb2x0X2J1ZiAqYnVmLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgbGVuKQoreworICAgIGlmICgoYnVmLT5zdGFydCArIGJ1Zi0+bGVuKSA+PSAoYnVmLT5jdXJyICsgbGVuKSkKKyAgICB7CisgICAgICAgIG1lbWNweShidWYtPmN1cnIsIGZyb20sIGxlbik7CisgICAgICAgIGJ1Zi0+Y3VyciArPSBsZW47CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKiogTW92ZSB0aGUgY3VycmVudCBwb2ludGVyIHRvIGEgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBwb3MgICAgQnl0ZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIHRvIG1vdmUgdGhlIGN1cnJlbnQgcG9pbnRlciB0bworICoKKyAqIFxwYXJhbSAqYnVmICAgSW5wdXQgYnVmZmVyCisgKiBccmV0dXJuICAgICAgIEJDTU9TX0ZBTFNFIGlmIGxlbiB0YWtlcyB1cyBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9zZXRfcG9zKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgcG9zKQoreworICAgIGlmIChwb3MgPD0gYnVmLT5sZW4pCisgICAgeworICAgICAgICBidWYtPmN1cnIgPSBidWYtPnN0YXJ0ICsgcG9zOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKKy8qKiBNb3ZlIHRoZSBjdXJyZW50IHBvaW50ZXIgYWhlYWQgYnkgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzCisgKgorICogXHBhcmFtIGJ1ZiAgICBiY21vbHRfYnVmIGluc3RhbmNlCisgKiBccGFyYW0gbGVuICAgIE51bWJlciBvZiBieXRlcyB0byBza2lwCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19GQUxTRSBpZiBsZW4gdGFrZXMgdXMgcGFzdCB0aGUgZW5kIG9mIGJ1ZmZlcgorICovCitiY21vc19ib29sIGJjbW9sdF9idWZfc2tpcChiY21vbHRfYnVmICpidWYsIHVpbnQzMl90IGxlbikKK3sKKyAgICBpZiAoKGJ1Zi0+c3RhcnQgKyBidWYtPmxlbikgPj0gKGJ1Zi0+Y3VyciArIGxlbikpCisgICAgeworICAgICAgICBidWYtPmN1cnIgKz0gbGVuOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKKy8qKiBNb3ZlIHRoZSBjdXJyZW50IHBvaW50ZXIgYmFjayBieSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKKyAqCisgKiBccGFyYW0gYnVmICAgIGJjbW9sdF9idWYgaW5zdGFuY2UKKyAqIFxwYXJhbSBsZW4gICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGdvIGJhY2sKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX0ZBTFNFIGlmIGxlbiB0YWtlcyB1cyBwYXN0IHRoZSBzdGFydCBvZiBidWZmZXIKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYnVmX3Jld2luZChiY21vbHRfYnVmICpidWYsIHVpbnQzMl90IGxlbikKK3sKKyAgICBpZiAoYnVmLT5jdXJyID49IChidWYtPnN0YXJ0ICsgbGVuKSkKKyAgICB7CisgICAgICAgIGJ1Zi0+Y3VyciAtPSBsZW47CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworLyoqIFJlYWRzIGEgYm9vbGVhbiBmcm9tIGEgYnVmZmVyCisgKgorICogXHBhcmFtICpidWYKKyAqIFxwYXJhbSAqdmFsCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYmNtb2x0X2J1ZiAqYnVmLCBiY21vc19ib29sICp2YWwpCit7CisgICAgLyogdGhpcyBmdW5jdGlvbiBpc24ndCBpbmxpbmVkIGxpa2UgdGhlIHJlc3QgYmVjYXVzZSBpdCdzIHRvbyBjb21wbGV4IHRvIGlubGluZSBjbGVhbmx5ICovCisgICAgdWludDhfdCB0bXA7CisgICAgaWYgKGJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0bXApKQorICAgIHsKKyAgICAgICAgKnZhbCA9ICh0bXAgIT0gMCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGJjbW9sdF9idWZfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9idWZfYWxsb2MpOworRVhQT1JUX1NZTUJPTChiY21vbHRfYnVmX2ZyZWUpOworRVhQT1JUX1NZTUJPTChiY21vbHRfYnVmX3JlYWQpOworRVhQT1JUX1NZTUJPTChiY21vbHRfYnVmX3RyYW5zZmVyX2J5dGVzKTsKK0VYUE9SVF9TWU1CT0woYmNtb2x0X2J1Zl93cml0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9idWZfc2V0X3Bvcyk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9idWZfc2tpcCk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9idWZfcmV3aW5kKTsKK0VYUE9SVF9TWU1CT0woYmNtb2x0X2J1Zl9yZWFkX2Jvb2wpOworCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYnVmLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNjMzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2J1Zi5oCkBAIC0wLDAgKzEsNzMzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTU9MVF9CVUZfSF8KKyNkZWZpbmUgQkNNT0xUX0JVRl9IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisKKy8qKiBHZW5lcmljIG1lbW9yeSBzdHJlYW0gb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYnVmIGJjbW9sdF9idWY7CisKK3N0cnVjdCBiY21vbHRfYnVmCit7CisgICAgdWludDhfdCAqc3RhcnQ7ICAvKio8IFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KKyAgICB1aW50OF90ICpjdXJyOyAgIC8qKjwgUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCisgICAgdWludDMyX3QgbGVuOyAgICAvKio8IFRvdGFsIExlbmd0aCBvZiBidWZmZXIgKi8KKyAgICAvKiBUaGUgZm9sbG93aW5nIDIgZmllbGRzIGVuYWJsZSBmb3JlaWduIGJ1ZmZlciBlbmNhcHN1bGF0aW9uICovCisgICAgdm9pZCAoKmZyZWUpKHZvaWQgKmJoKTsgIC8qKjwgRm9yZWlnbiBidWZmZXIgcmVsZWFzZSBjYWxsYmFjayAqLworICAgIHZvaWQgKmJoOyAgICAgICAgLyoqPCBGb3JlaWduIGJ1ZmZlciBoYW5kbGUgKi8KK307CisKKy8qIFNlcmlhbGl6YXRpb24gYnVmZmVyIGVuZGlhbm5lc3MgKi8KKyNkZWZpbmUgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQgQkNNT1NfRU5ESUFOX0JJRworCisjaWYgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQgPT0gQkNNT1NfRU5ESUFOX0JJRworICAgICNkZWZpbmUgQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShzaXplLCBuKSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV8jI3NpemUobikKKyAgICAjZGVmaW5lIEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoc2l6ZSwgbikgQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfIyNzaXplKG4pCisjZWxzZQorICAgICNkZWZpbmUgQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShzaXplLCBuKSBCQ01PU19FTkRJQU5fTElUVExFX1RPX0NQVV8jI3NpemUobikKKyAgICAjZGVmaW5lIEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoc2l6ZSwgbikgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfIyNzaXplKG4pCisjZW5kaWYKKworLyoqIEluaXRhbGl6ZSBhIGJjbW9sdF9idWYgc3RyZWFtCisgKgorICogXHBhcmFtIGJ1ZgorICogXHBhcmFtIHNpemUKKyAqIFxwYXJhbSBzdGFydAorICogXHBhcmFtIGVuZGlhbiBFbmRpYW5uZXNzIG9mIG51bWJlcnMgaW4gdGhlIHJlc3VsdGluZyBzdHJlYW0uCisgKiAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgZm9yIHNhbml0eSBjaGVjay4gQnVmZmVyIGVuZGlhbm5lc3MgaXMKKyAqICAgICAgICAgICAgICAgc2V0IGF0IGNvbXBpbGUgdGltZS4gQXBwbGljYXRpb24gTVVTVCBOT1QgcmVseSBvbiBkZWZhdWx0IGJ1ZmZlciBlbmRpYW5uZXNzCisgKiAgICAgICAgICAgICAgIGJlaW5nIEJpZyBFbmRpYW4uCisgKiAgICAgICAgICAgICAgIElmIEJpZyBFbmRpYW4gYnVmZmVyIGlzIHJlcXVpcmVkLCBhcHBsaWNhdGlvbiBtdXN0IHVzZQorICogICAgICAgICAgICAgICBhY2Nlc3MgZnVuY3Rpb25zIHdpdGggIl9iZSIgZGVzaWduYXRvciAoYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZSgpLCBldGMuKQorICovCit2b2lkIGJjbW9sdF9idWZfaW5pdChiY21vbHRfYnVmICpidWYsIHVpbnQzMl90IHNpemUsIHVpbnQ4X3QgKnN0YXJ0LCBiY21vc19lbmRpYW4gZW5kaWFuKTsKKworLyoqIEFsbG9jYXRlIGRhdGEgYnVmZmVyIGFuZCBpbml0aWFsaXplIGJjbW9sdF9idWYgc3RyZWFtCisgKgorICogXHBhcmFtIGJ1ZgorICogXHBhcmFtIHNpemUKKyAqIFxwYXJhbSBlbmRpYW4gRW5kaWFubmVzcyBvZiBudW1iZXJzIGluIHRoZSByZXN1bHRpbmcgc3RyZWFtLgorICogICAgICAgICAgICAgICBTZWUgZXhwbGFuYXRpb24gaW4gYmNtb2x0X2J1Zl9hbGxvYygpCisgKiBccmV0dXJuIEJDTV9FUlJfT0sgb3IgQkNNX0VSUl9OT01FTQorICovCitiY21vc19lcnJubyBiY21vbHRfYnVmX2FsbG9jKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3Qgc2l6ZSwgYmNtb3NfZW5kaWFuIGVuZGlhbik7CisKKy8qKiBSZWxlYXNlIGRhdGEgYnVmZmVyIHBvaW50ZWQgYnkgYmNtb2x0X2J1ZiBzdHJlYW0KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZgorICovCit2b2lkIGJjbW9sdF9idWZfZnJlZShiY21vbHRfYnVmICpidWYpOworCisvKiogUmVhZCBmcm9tIHRoZSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmICAgIGJjbW9sdF9idWYgaW5zdGFuY2UKKyAqIFxwYXJhbSB0byAgICAgV2hlcmUgdG8gcmVhZCB0bworICogXHBhcmFtIGxlbiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfVFJVRSBpZiBzdWNjZXNzZnVsbHkgY29waWVkCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkKGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqdG8sIHNpemVfdCBsZW4pOworCisvKiogVHJhbnNmZXIgYnl0ZXMgZnJvbSBvbmUgYnVmIHRvIGFub3RoZXIKKyAqCisgKiBccGFyYW0gKmZyb20gICAgU291cmNlIGJ1ZmZlcgorICogXHBhcmFtICp0byAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgorICogXHBhcmFtIGJ5dGVzICAgIE51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlcgorICogXHJldHVybiAgICAgICAgIEJDTU9TX1RSVUUgaWYgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl90cmFuc2Zlcl9ieXRlcyhiY21vbHRfYnVmICpmcm9tLCBiY21vbHRfYnVmICp0bywgdWludDMyX3QgYnl0ZXMpOworCisvKiogV3JpdGUgdG8gdGhlIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgYmNtb2x0X2J1ZiBpbnN0YW5jZQorICogXHBhcmFtIGZyb20gICBTb3VyY2UsIHRvIGNvcHkgZnJvbQorICogXHBhcmFtIGxlbiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfVFJVRSBpZiBzdWNjZXNzZnVsbHkgY29waWVkCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZShiY21vbHRfYnVmICpidWYsIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBsZW4pOworCisvKiogTW92ZSB0aGUgY3VycmVudCBwb2ludGVyIHRvIGEgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBwb3MgICAgQnl0ZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIHRvIG1vdmUgdGhlIGN1cnJlbnQgcG9pbnRlciB0bworICoKKyAqIFxwYXJhbSAqYnVmICAgSW5wdXQgYnVmZmVyCisgKiBccmV0dXJuICAgICAgIEJDTU9TX0ZBTFNFIGlmIGxlbiB0YWtlcyB1cyBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9zZXRfcG9zKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgcG9zKTsKKworLyoqIE1vdmUgdGhlIGN1cnJlbnQgcG9pbnRlciBhaGVhZCBieSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKKyAqCisgKiBccGFyYW0gYnVmICAgIGJjbW9sdF9idWYgaW5zdGFuY2UKKyAqIFxwYXJhbSBsZW4gICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX0ZBTFNFIGlmIGxlbiB0YWtlcyB1cyBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9za2lwKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgbGVuKTsKKworLyoqIE1vdmUgdGhlIGN1cnJlbnQgcG9pbnRlciBiYWNrIGJ5IGdpdmVuIG51bWJlciBvZiBieXRlcworICoKKyAqIFxwYXJhbSBidWYgICAgYmNtb2x0X2J1ZiBpbnN0YW5jZQorICogXHBhcmFtIGxlbiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gZ28gYmFjaworICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfRkFMU0UgaWYgbGVuIHRha2VzIHVzIHBhc3QgdGhlIHN0YXJ0IG9mIGJ1ZmZlcgorICovCitiY21vc19ib29sIGJjbW9sdF9idWZfcmV3aW5kKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgbGVuKTsKKworLyoqIEdldCB0aGUgY3VycmVudCBidWZmZXIgcG9pbnRlcgorICoKKyAqIFxwYXJhbSBidWYgICBiY21vbHRfYnVmIGluc3RhbmNlCisgKgorICogXHJldHVybiAgICAgIHRoZSBjdXJyZW50IGJ1ZmZlciBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqYmNtb2x0X2J1Zl9zbmFwX2dldChjb25zdCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJ1Zi0+Y3VycjsKK30KKworLyoqIE1vdmUgdGhlIGN1cnJlbnQgcG9pbnRlciB0byBhIHNuYXBwZWQgbG9jYXRpb24KKyAqCisgKiBccGFyYW0gYnVmICAgYmNtb2x0X2J1ZiBpbnN0YW5jZQorICogXHBhcmFtIHNuYXAgIHNuYXBwZWQgbG9jYXRpb24KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJjbW9sdF9idWYgKmJ1ZiwgdWludDhfdCAqc25hcCkKK3sKKyAgICBidWYtPmN1cnIgPSBzbmFwOworfQorCisvKiogR2V0IHRoZSBsZW5ndGggb2YgdW5wcm9jZXNzZWQgYnl0ZXMgaW4gZ2l2ZW4gc3RyZWFtCisgKgorICogXHBhcmFtIGJ1ZiAgICBJbnB1dCBidWZmZXIKKyAqCisgKiBccmV0dXJuICAgICAgIFRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZShjb25zdCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuICh1aW50MzJfdCkoKGJ1Zi0+c3RhcnQgKyBidWYtPmxlbikgLSBidWYtPmN1cnIpOworfQorCisvKiogR2V0IGFtb3VudCBvZiBidWYgdGhhdCBoYXMgYmVlbiByZWFkIG9yIHdyaXR0ZW4gc28gZmFyCisgKgorICogXHBhcmFtIGJ1ZiAgICAgSW5wdXQgYnVmZmVyCisgKiBccmV0dXJuICAgICAgICBBbW91bnQgb2YgYnVmZmVyIHVzZWQKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBiY21vbHRfYnVmX2dldF91c2VkKGNvbnN0IGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKHVpbnQzMl90KShidWYtPmN1cnIgLSBidWYtPnN0YXJ0KTsKK30KKworLyoqIFJlYWRzIGEgdWludDhfdCBmcm9tIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBccGFyYW0gdmFsIHVpbnQ4X3QgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF91OChiY21vbHRfYnVmICpidWYsIHVpbnQ4X3QgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdmFsLCBzaXplb2YoKnZhbCkpOworfQorCisvKiogV3JpdGVzIGEgdWludDhfdCB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIHVpbnQ4X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91OChiY21vbHRfYnVmICpidWYsIHVpbnQ4X3QgdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgJnZhbCwgc2l6ZW9mKHZhbCkpOworfQorCisvKiogUmVhZHMgYSBib29sZWFuIGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gKmJ1ZgorICogXHBhcmFtICp2YWwKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfYm9vbChiY21vbHRfYnVmICpidWYsIGJjbW9zX2Jvb2wgKnZhbCk7CisKKy8qKiBXcml0ZXMgYSBiY21vc19ib29sIHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgdWludDhfdCB0byB3cml0ZQorICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfVFJVRSBpZiB3cml0ZSBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3dyaXRlX2Jvb2woYmNtb2x0X2J1ZiAqYnVmLCBiY21vc19ib29sIHZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHZhbCA/IDEgOiAwKTsKK30KKworLyoqIFJlYWRzIGEgaW50OF90IGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgaW50OF90IHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfczgoYmNtb2x0X2J1ZiAqYnVmLCBpbnQ4X3QgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKil2YWwpOworfQorCisvKiogV3JpdGVzIGEgaW50OF90IHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgaW50OF90IHRvIHdyaXRlCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfczgoYmNtb2x0X2J1ZiAqYnVmLCBpbnQ4X3QgdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpdmFsKTsKK30KKworLyoqIFJlYWRzIGEgdWludDE2X3QgZnJvbSBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgZnJvbQorICogXHBhcmFtIHZhbCB1aW50MTZfdCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3UxNihiY21vbHRfYnVmICpidWYsIHVpbnQxNl90ICp2YWwpCit7CisgICAgYmNtb3NfYm9vbCByZXMgPSBiY21vbHRfYnVmX3JlYWQoYnVmLCB2YWwsIHNpemVvZigqdmFsKSk7CisgICAgKnZhbCA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTE2LCAqdmFsKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKiogUmVhZHMgYSB1aW50MTZfdCBmcm9tIGEgQmlnIEVuZGlhbiBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgdWludDE2X3QgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MTZfdCAqdmFsKQoreworICAgIGJjbW9zX2Jvb2wgcmVzID0gYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdmFsLCBzaXplb2YoKnZhbCkpOworICAgICp2YWwgPSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV9VMTYoKnZhbCk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqIFdyaXRlcyBhIHVpbnQxNl90IHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgdWludDE2X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91MTYoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MTZfdCB2YWwpCit7CisgICAgdmFsID0gQkNNT0xUX0JVRl9FTkRJQU5fQ1BVX1RPX0JVRihVMTYsIHZhbCk7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisKKy8qKiBXcml0ZXMgYSB1aW50MTZfdCB0byBhIEJpZyBFbmRpYW4gYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgdWludDE2X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MTZfdCB2YWwpCit7CisgICAgdmFsID0gQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfVTE2KHZhbCk7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisKKy8qKiBSZWFkcyBhIGludDE2X3QgZnJvbSBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgZnJvbQorICogXHBhcmFtIHZhbCBpbnQxNl90IHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfczE2KGJjbW9sdF9idWYgKmJ1ZiwgaW50MTZfdCAqdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopdmFsKTsKK30KKworLyoqIFJlYWRzIGEgaW50MTZfdCBmcm9tIGEgQmlnIEVuZGlhbiBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgaW50MTZfdCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3MxNl9iZShiY21vbHRfYnVmICpidWYsIGludDE2X3QgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICh1aW50MTZfdCAqKXZhbCk7Cit9CisKKy8qKiBXcml0ZXMgaW50MTZfdCB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIGludDE2X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV9zMTYoYmNtb2x0X2J1ZiAqYnVmLCBpbnQxNl90IHZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpdmFsKTsKK30KKworLyoqIFdyaXRlcyBpbnQxNl90IHRvIGEgQmlnIEVuZGlhbiBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmICAgIEJ1ZmZlciB0byB3cml0ZSB0bworICogXHBhcmFtIHZhbCAgICBpbnQxNl90IHRvIHdyaXRlCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfczE2X2JlKGJjbW9sdF9idWYgKmJ1ZiwgaW50MTZfdCB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKGJ1ZiwgKHVpbnQxNl90KXZhbCk7Cit9CisKKy8qKiBSZWFkcyBhIGJjbW9zX3UyNCBmcm9tIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBccGFyYW0gdmFsIGJjbW9zX3UyNCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3UyNChiY21vbHRfYnVmICpidWYsIHVpbnQyNF90ICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZF91OChidWYsICYodmFsLT5sb3dfaGkuaGkpKSAmJgorICAgICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmKHZhbC0+bG93X2hpLm1pZCkpICYmCisgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICYodmFsLT5sb3dfaGkubG93KSk7Cit9CisKKy8qKiBXcml0ZXMgYSBiY21vc191MjQgdG8gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmICAgIEJ1ZmZlciB0byB3cml0ZSB0bworICogXHBhcmFtIHZhbCAgICBiY21vc191MjQgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91MjQoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MjRfdCB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB2YWwubG93X2hpLmhpKSAmJgorICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdmFsLmxvd19oaS5taWQpICYmCisgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB2YWwubG93X2hpLmxvdyk7Cit9CisKKy8qKiBSZWFkcyBhIHVpbnQzMl90IGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgdWludDMyX3QgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF91MzIoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MzJfdCAqdmFsKQoreworICAgIGJjbW9zX2Jvb2wgcmVzID0gYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdmFsLCBzaXplb2YoKnZhbCkpOworICAgICp2YWwgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgKnZhbCk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqIFJlYWRzIGEgdWludDMyX3QgZnJvbSBhIEJpZyBFbmRpYW4gYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBccGFyYW0gdmFsIHVpbnQzMl90IHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfdTMyX2JlKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgKnZhbCkKK3sKKyAgICBiY21vc19ib29sIHJlcyA9IGJjbW9sdF9idWZfcmVhZChidWYsIHZhbCwgc2l6ZW9mKCp2YWwpKTsKKyAgICAqdmFsID0gQkNNT1NfRU5ESUFOX0JJR19UT19DUFVfVTMyKCp2YWwpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKiBXcml0ZXMgYSB1aW50MzJfdCB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIHVpbnQzMl90IHRvIHdyaXRlCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfdTMyKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgdmFsKQoreworICAgIHZhbCA9IEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoVTMyLCB2YWwpOworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgJnZhbCwgc2l6ZW9mKHZhbCkpOworfQorCisvKiogV3JpdGVzIGEgdWludDMyX3QgdG8gYSBCaWcgRW5kaWFuIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIHVpbnQzMl90IHRvIHdyaXRlCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgdmFsKQoreworICAgIHZhbCA9IEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1UzMih2YWwpOworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgJnZhbCwgc2l6ZW9mKHZhbCkpOworfQorCisvKiogUmVhZHMgYSBpbnQzMl90IGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgaW50MzJfdCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3MzMihiY21vbHRfYnVmICpidWYsIGludDMyX3QgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKXZhbCk7Cit9CisKKy8qKiBSZWFkcyBhIGludDMyX3QgZnJvbSBhIGJpZyBlbmRpYW4gYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBccGFyYW0gdmFsIGludDMyX3QgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF9zMzJfYmUoYmNtb2x0X2J1ZiAqYnVmLCBpbnQzMl90ICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZF91MzJfYmUoYnVmLCAodWludDMyX3QgKil2YWwpOworfQorCisvKiogV3JpdGVzIGEgaW50MzJfdCB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIGludDMyX3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV9zMzIoYmNtb2x0X2J1ZiAqYnVmLCBpbnQzMl90IHZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpdmFsKTsKK30KKworLyoqIFdyaXRlcyBhIGludDMyX3QgdG8gYSBCaWcgRW5kaWFuIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIGludDMyX3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV9zMzJfYmUoYmNtb2x0X2J1ZiAqYnVmLCBpbnQzMl90IHZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUoYnVmLCAodWludDMyX3QpdmFsKTsKK30KKworLyoqIFJlYWRzIGEgdWludDY0X3QgZnJvbSBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgZnJvbQorICogXHBhcmFtIHZhbCB1aW50NjRfdCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3U2NChiY21vbHRfYnVmICpidWYsIHVpbnQ2NF90ICp2YWwpCit7CisgICAgYmNtb3NfYm9vbCByZXMgPSBiY21vbHRfYnVmX3JlYWQoYnVmLCB2YWwsIHNpemVvZigqdmFsKSk7CisgICAgKnZhbCA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTY0LCAqdmFsKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKiogUmVhZHMgYSB1aW50NjRfdCBmcm9tIGEgQmlnIEVuZGlhbiBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgdWludDY0X3QgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF91NjRfYmUoYmNtb2x0X2J1ZiAqYnVmLCB1aW50NjRfdCAqdmFsKQoreworICAgIGJjbW9zX2Jvb2wgcmVzID0gYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdmFsLCBzaXplb2YoKnZhbCkpOworICAgICp2YWwgPSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV9VNjQoKnZhbCk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqIFdyaXRlcyBhIHVpbnQ2NF90IHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgdWludDY0X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91NjQoYmNtb2x0X2J1ZiAqYnVmLCB1aW50NjRfdCB2YWwpCit7CisgICAgdmFsID0gQkNNT0xUX0JVRl9FTkRJQU5fQ1BVX1RPX0JVRihVNjQsIHZhbCk7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisKKy8qKiBXcml0ZXMgYSB1aW50NjRfdCB0byBhIEJpZyBFbmRpYW4gYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgdWludDY0X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91NjRfYmUoYmNtb2x0X2J1ZiAqYnVmLCB1aW50NjRfdCB2YWwpCit7CisgICAgdmFsID0gQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfVTY0KHZhbCk7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisKKy8qKiBSZWFkcyBhIGludDY0X3QgZnJvbSBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgZnJvbQorICogXHBhcmFtIHZhbCBpbnQ2NF90IHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfczY0KGJjbW9sdF9idWYgKmJ1ZiwgaW50NjRfdCAqdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgKHVpbnQ2NF90ICopdmFsKTsKK30KKworLyoqIFJlYWRzIGEgaW50NjRfdCBmcm9tIGEgQmlnIEVuZGlhbiBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgaW50NjRfdCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3M2NF9iZShiY21vbHRfYnVmICpidWYsIGludDY0X3QgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkX3U2NF9iZShidWYsICh1aW50NjRfdCAqKXZhbCk7Cit9CisKKy8qKiBXcml0ZXMgYSBpbnQ2NF90IHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgaW50NjRfdCB0byB3cml0ZQorICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfVFJVRSBpZiB3cml0ZSBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3dyaXRlX3M2NChiY21vbHRfYnVmICpidWYsIGludDY0X3QgdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsICh1aW50NjRfdCl2YWwpOworfQorCisvKiogV3JpdGVzIGEgaW50NjRfdCB0byBhIEJpZyBFbmRpYW4gYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgaW50NjRfdCB0byB3cml0ZQorICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfVFJVRSBpZiB3cml0ZSBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3dyaXRlX3M2NF9iZShiY21vbHRfYnVmICpidWYsIGludDY0X3QgdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U2NF9iZShidWYsICh1aW50NjRfdCl2YWwpOworfQorCisvKiogUmVhZHMgYSBmbG9hdCBmcm9tIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBccGFyYW0gdmFsIGZsb2F0IHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfZmxvYXQoYmNtb2x0X2J1ZiAqYnVmLCBmbG9hdCAqdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopdmFsKTsKK30KKworLyoqIFdyaXRlcyBhIGZsb2F0IHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgZmxvYXQgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV9mbG9hdChiY21vbHRfYnVmICpidWYsIGZsb2F0IHZhbCkKK3sKKyAgICB1aW50MzJfdCAqbnVtID0gKHVpbnQzMl90ICopJnZhbDsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAqbnVtKTsKK30KKworLyoqIFJlYWRzIGEgZG91YmxlIGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgZG91YmxlIHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfZG91YmxlKGJjbW9sdF9idWYgKmJ1ZiwgZG91YmxlICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAodWludDY0X3QgKil2YWwpOworfQorCisvKiogV3JpdGVzIGEgZG91YmxlIHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgZG91YmxlIHRvIHdyaXRlCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfZG91YmxlKGJjbW9sdF9idWYgKmJ1ZiwgZG91YmxlIHZhbCkKK3sKKyAgICB1aW50NjRfdCAqbnVtID0gKHVpbnQ2NF90ICopJnZhbDsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCAqbnVtKTsKK30KKworLyoqIFJlYWRzIGEgYmNtb3Nfdmxhbl90YWcgZnJvbSBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgZnJvbQorICogXHBhcmFtIHZhbCBiY21vc192bGFuX3RhZyB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3ZsYW5fdGFnKGJjbW9sdF9idWYgKmJ1ZiwgYmNtb3Nfdmxhbl90YWcgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKXZhbCk7Cit9CisKKy8qKiBXcml0ZXMgYSBiY21vc192bGFuX3RhZyB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsIGJjbW9zX3ZsYW5fdGFnIHRvIHdyaXRlCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfdmxhbl90YWcoYmNtb2x0X2J1ZiAqYnVmLCBiY21vc192bGFuX3RhZyB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KXZhbCk7Cit9CisKKy8qKiBSZWFkcyBhIGJjbW9zX21hY19hZGRyZXNzIGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgYmNtb3NfbWFjX2FkZHJlc3MgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhiY21vbHRfYnVmICpidWYsIGJjbW9zX21hY19hZGRyZXNzICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZChidWYsIHZhbCwgc2l6ZW9mKGJjbW9zX21hY19hZGRyZXNzKSk7Cit9CisKKy8qKiBXcml0ZXMgYSBiY21vc19tYWNfYWRkcmVzcyB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsIGJjbW9zX21hY19hZGRyZXNzIHRvIHdyaXRlCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYmNtb2x0X2J1ZiAqYnVmLCBiY21vc19tYWNfYWRkcmVzcyB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCAmdmFsLCBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpKTsKK30KKworLyoqIFJlYWRzIGEgYmNtb3NfaXB2NF9hZGRyZXNzIGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgYmNtb3NfaXB2NF9hZGRyZXNzIHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfaXB2NF9hZGRyZXNzKGJjbW9sdF9idWYgKmJ1ZiwgYmNtb3NfaXB2NF9hZGRyZXNzICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZChidWYsIHZhbC0+dTgsIHNpemVvZihiY21vc19pcHY0X2FkZHJlc3MpKTsKK30KKworLyoqIFdyaXRlcyBhIGJjbW9zX2lwdjRfYWRkcmVzcyB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsIGJjbW9zX2lwdjRfYWRkcmVzcyB0byB3cml0ZQorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiB3cml0ZSBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhiY21vbHRfYnVmICpidWYsIGJjbW9zX2lwdjRfYWRkcmVzcyB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCB2YWwudTgsIHNpemVvZihiY21vc19pcHY0X2FkZHJlc3MpKTsKK30KKworLyoqIFJlYWRzIGEgYmNtb3NfaXB2Nl9hZGRyZXNzIGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgYmNtb3NfaXB2Nl9hZGRyZXNzIHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJjbW9sdF9idWYgKmJ1ZiwgYmNtb3NfaXB2Nl9hZGRyZXNzICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZChidWYsICp2YWwsIHNpemVvZihiY21vc19pcHY2X2FkZHJlc3MpKTsKK30KKworLyoqIFdyaXRlcyBhIGJjbW9zX2lwdjZfYWRkcmVzcyB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsIGJjbW9zX2lwdjZfYWRkcmVzcyB0byB3cml0ZQorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiB3cml0ZSBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhiY21vbHRfYnVmICpidWYsIGJjbW9zX2lwdjZfYWRkcmVzcyB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCB2YWwsIHNpemVvZihiY21vc19pcHY2X2FkZHJlc3MpKTsKK30KKworI2VuZGlmIC8qIEJDTU9MVF9CVUZfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfY29udi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9jb252LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3MmMyMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfY29udi5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfdXRpbHMuaD4KKyNpbmNsdWRlICJiY21vbHRfY29udi5oIgorCitjaGFyICpiY21vbHRfc3RyZnRpbWUoY2hhciAqdGltZV9zdHIsIHRpbWVfdCB0LCBjb25zdCBjaGFyICp0aW1lem9uZV9zdHIpCit7CisgICAgc3RydWN0IHRtIHRzOworICAgIGludDMyX3QgdHpfaG91cjsKKyAgICB1aW50MzJfdCB0el9taW47CisgICAgCisgICAgdHMgPSAqbG9jYWx0aW1lKCZ0KTsKKyAgICBpZiAodGltZXpvbmVfc3RyICYmICp0aW1lem9uZV9zdHIpCisgICAgeworICAgICAgICBpZiAoc3NjYW5mKHRpbWV6b25lX3N0ciwgIiUwM2Q6JTAydSIsICZ0el9ob3VyLCAmdHpfbWluKSA8IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR6X2hvdXIgPSAwOworICAgICAgICAgICAgdHpfbWluID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRzLnRtX2hvdXIgKz0gdHpfaG91cjsKKyAgICAgICAgICAgIHRzLnRtX21pbiArPSB0el9taW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdHJmdGltZSh0aW1lX3N0ciwgQkNNT0xUX1RJTUVfU1RSX01BWF9MRU4sICIlYSAlWS0lbS0lZCAlSDolTTolUyIsICZ0cyk7CisKKyAgICByZXR1cm4gdGltZV9zdHI7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfY29udi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9jb252LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBjOGEwYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfY29udi5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfQ09OVl9IXworI2RlZmluZSBfQkNNT0xUX0NPTlZfSF8KKworI2lmbmRlZiBDRkVfQlVJTEQKKyNpbmNsdWRlIDxiY21vbHRfdXRpbHMuaD4KKyNlbmRpZgorCisvKiBNYWNybyBmb3IgZ2VuZXJhdGluZyBhIGdlbmVyaWMgY29udmVyc2lvbiBmcm9tIHR5cGUgQSB0byB0eXBlIEIuCisgKiBFeGFtcGxlOgorICoKKyAqICAgICAgQkNNT0xUX1RZUEUyVFlQRShid3NfZGJhX2NvbnRyb2xfaWQsIGJ3c19kYmFfY29udHJvbF9jYiwgc3RhdGljKQorICoKKyAqIHdpbGwgZXhwYW5kIHRvOgorICoKKyAqICAgICB0eXBlZGVmIHN0cnVjdAorICogICAgIHsKKyAqICAgICAgICAgYndzX2RiYV9jb250cm9sX2lkIGZyb207CisgKiAgICAgICAgIGJ3c19kYmFfY29udHJvbF9jYiB0bzsKKyAqICAgICB9CisgKiAgICAgYndzX2RiYV9jb250cm9sX2lkMmJ3c19kYmFfY29udHJvbF9jYl90OworICogICAgIAorICogICAgIHN0YXRpYyBid3NfZGJhX2NvbnRyb2xfaWQyYndzX2RiYV9jb250cm9sX2NiX3QgYndzX2RiYV9jb250cm9sX2lkMmJ3c19kYmFfY29udHJvbF9jYltdOworICogICAgIAorICogICAgIHN0YXRpYyBpbmxpbmUgYndzX2RiYV9jb250cm9sX2NiIGJ3c19kYmFfY29udHJvbF9pZDJid3NfZGJhX2NvbnRyb2xfY2JfY29udihid3NfZGJhX2NvbnRyb2xfaWQgZnJvbSkKKyAqICAgICB7CisgKiAgICAgICAgIGNvbnN0IGJ3c19kYmFfY29udHJvbF9pZDJid3NfZGJhX2NvbnRyb2xfY2JfdCAqYXJyID0gYndzX2RiYV9jb250cm9sX2lkMmJ3c19kYmFfY29udHJvbF9jYjsKKyAqICAgICAgICAgZm9yICg7IGFyci0+ZnJvbSAhPSAoYndzX2RiYV9jb250cm9sX2lkKS0xICYmIGFyci0+ZnJvbSAhPSBmcm9tOyBhcnIrKyk7CisgKiAgICAgICAgIHJldHVybiBhcnItPnRvOworICogICAgIH0KKyAqLworI2RlZmluZSBCQ01PTFRfVFlQRTJUWVBFKGZyb21fdHlwZSwgdG9fdHlwZSwgc2NvcGUpIFwKKyAgICB0eXBlZGVmIHN0cnVjdCBcCisgICAgeyBcCisgICAgICAgIGZyb21fdHlwZSBmcm9tOyBcCisgICAgICAgIHRvX3R5cGUgdG87IFwKKyAgICB9IFwKKyAgICBmcm9tX3R5cGUjIzIjI3RvX3R5cGUjI190OyBcCisgICAgc2NvcGUgZnJvbV90eXBlIyMyIyN0b190eXBlIyNfdCBmcm9tX3R5cGUjIzIjI3RvX3R5cGVbXTsgXAorICAgIHN0YXRpYyBpbmxpbmUgdG9fdHlwZSBmcm9tX3R5cGUjIzIjI3RvX3R5cGUjI19jb252KGZyb21fdHlwZSBmcm9tKSBcCisgICAgeyBcCisgICAgICAgIGNvbnN0IGZyb21fdHlwZSMjMiMjdG9fdHlwZSMjX3QgKmFyciA9IGZyb21fdHlwZSMjMiMjdG9fdHlwZTsgXAorICAgICAgICBmb3IgKDsgYXJyLT5mcm9tICE9IChmcm9tX3R5cGUpLTEgJiYgYXJyLT5mcm9tICE9IGZyb207IGFycisrKTsgXAorICAgICAgICByZXR1cm4gYXJyLT50bzsgXAorICAgIH0KKworLyogTWFjcm8gZm9yIGdlbmVyYXRpbmcgYSBnZW5lcmljIGNvbnZlcnNpb24gZnJvbSB0eXBlIEEgdG8gYSBjb25zdGFudCBzdHJpbmcuCisgKiBFeGFtcGxlOgorICoKKyAqICAgICAgQkNNT0xUX1RZUEUyU1RSKHBvbl9tb2RlLCBleHRlcm4pCisgKgorICogd2lsbCBleHBhbmQgdG86CisgKgorICogICAgIHR5cGVkZWYgc3RydWN0CisgKiAgICAgeworICogICAgICAgICBwb25fbW9kZSBmcm9tOworICogICAgICAgICBjb25zdCBjaGFyICp0bzsKKyAqICAgICB9CisgKiAgICAgcG9uX21vZGUyc3RyX3Q7CisgKgorICogICAgIGV4dGVybiBwb25fbW9kZTJzdHJfdCBwb25fbW9kZTJzdHJbXTsKKyAqCisgKiAgICAgc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpwb25fbW9kZTJzdHJfY29udihwb25fbW9kZSBmcm9tKQorICogICAgIHsKKyAqICAgICAgICAgY29uc3QgcG9uX21vZGUyc3RyX3QgKmFyciA9IHBvbl9tb2RlMnN0cjsKKyAqICAgICAgICAgZm9yICg7IGFyci0+ZnJvbSAhPSAocG9uX21vZGUpLTEgJiYgYXJyLT5mcm9tICE9IGZyb207IGFycisrKTsKKyAqICAgICAgICAgcmV0dXJuIGFyci0+dG87CisgKiAgICAgfQorICovCisjZGVmaW5lIEJDTU9MVF9UWVBFMlNUUihmcm9tX3R5cGUsIHNjb3BlKSBcCisgICAgdHlwZWRlZiBzdHJ1Y3QgXAorICAgIHsgXAorICAgICAgICBmcm9tX3R5cGUgZnJvbTsgXAorICAgICAgICBjb25zdCBjaGFyICp0bzsgXAorICAgIH0gXAorICAgIGZyb21fdHlwZSMjMnN0cl90OyBcCisgICAgc2NvcGUgZnJvbV90eXBlIyMyc3RyX3QgZnJvbV90eXBlIyMyc3RyW107IFwKKyAgICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmZyb21fdHlwZSMjMnN0cl9jb252KGZyb21fdHlwZSBmcm9tKSBcCisgICAgeyBcCisgICAgICAgIGNvbnN0IGZyb21fdHlwZSMjMnN0cl90ICphcnIgPSBmcm9tX3R5cGUjIzJzdHI7IFwKKyAgICAgICAgZm9yICg7IGFyci0+ZnJvbSAhPSAoZnJvbV90eXBlKS0xICYmIGFyci0+ZnJvbSAhPSBmcm9tOyBhcnIrKyk7IFwKKyAgICAgICAgcmV0dXJuIGFyci0+dG87IFwKKyAgICB9CisKKy8qIE1hY3JvIGZvciBnZW5lcmF0aW5nIGEgZ2VuZXJpYyBjb252ZXJzaW9uIGZyb20gdHlwZSBBIHRvIGFuIGludGVnZXIuCisgKiBFeGFtcGxlOgorICoKKyAqICAgICAgQkNNT0xUX1RZUEUySU5UKHBsb2FtX2RzX2dwb25fbWVzc2FnZV9pZCwgcmVwZXRpdGlvbnMsIGV4dGVybikKKyAqCisgKiB3aWxsIGV4cGFuZCB0bzoKKyAqIAorICogICAgIHR5cGVkZWYgc3RydWN0CisgKiAgICAgeworICogICAgICAgICBwbG9hbV9kc19ncG9uX21lc3NhZ2VfaWQgZnJvbTsKKyAqICAgICAgICAgaW50IHRvOworICogICAgIH0KKyAqICAgICBwbG9hbV9kc19ncG9uX21lc3NhZ2VfaWQycmVwZXRpdGlvbnNfdDsKKyAqCisgKiAgICAgZXh0ZXJuIHBsb2FtX2RzX2dwb25fbWVzc2FnZV9pZDJyZXBldGl0aW9uc190IHBsb2FtX2RzX2dwb25fbWVzc2FnZV9pZDJyZXBldGl0aW9uc1tdOworICoKKyAqICAgICBzdGF0aWMgaW5saW5lIGludCBwbG9hbV9kc19ncG9uX21lc3NhZ2VfaWQycmVwZXRpdGlvbnNfY29udihwbG9hbV9kc19ncG9uX21lc3NhZ2VfaWQgZnJvbSkKKyAqICAgICB7CisgKiAgICAgICAgIGNvbnN0IHBsb2FtX2RzX2dwb25fbWVzc2FnZV9pZDJyZXBldGl0aW9uc190ICphcnIgPSBwbG9hbV9kc19ncG9uX21lc3NhZ2VfaWQycmVwZXRpdGlvbnM7CisgKiAgICAgICAgIGZvciAoOyBhcnItPmZyb20gIT0gKHBsb2FtX2RzX2dwb25fbWVzc2FnZV9pZCktMSAmJiBhcnItPmZyb20gIT0gZnJvbTsgYXJyKyspOworICogICAgICAgICByZXR1cm4gYXJyLT50bzsKKyAqICAgICB9CisgKi8KKyNkZWZpbmUgQkNNT0xUX1RZUEUySU5UKGZyb21fdHlwZSwgdG9fbmFtZSwgc2NvcGUpIFwKKyAgICB0eXBlZGVmIHN0cnVjdCBcCisgICAgeyBcCisgICAgICAgIGZyb21fdHlwZSBmcm9tOyBcCisgICAgICAgIGludCB0bzsgXAorICAgIH0gXAorICAgIGZyb21fdHlwZSMjMiMjdG9fbmFtZSMjX3Q7IFwKKyAgICBzY29wZSBmcm9tX3R5cGUjIzIjI3RvX25hbWUjI190IGZyb21fdHlwZSMjMiMjdG9fbmFtZVtdOyBcCisgICAgc3RhdGljIGlubGluZSBpbnQgZnJvbV90eXBlIyMyIyN0b19uYW1lIyNfY29udihmcm9tX3R5cGUgZnJvbSkgXAorICAgIHsgXAorICAgICAgICBjb25zdCBmcm9tX3R5cGUjIzIjI3RvX25hbWUjI190ICphcnIgPSBmcm9tX3R5cGUjIzIjI3RvX25hbWU7IFwKKyAgICAgICAgZm9yICg7IGFyci0+ZnJvbSAhPSAoZnJvbV90eXBlKS0xICYmIGFyci0+ZnJvbSAhPSBmcm9tOyBhcnIrKyk7IFwKKyAgICAgICAgcmV0dXJuIGFyci0+dG87IFwKKyAgICB9CisKKy8qIEFsdGhvdWdoIHdlIGhhdmUgQkNNT0xUX1RZUEUyU1RSLCBpbnQyc3RyX3QgaXMgc3RpbGwgcmVxdWlyZWQgd2hlbiB0aGUgc2FtZSBnZW5lcmljIHBvaW50ZXIgbmVlZHMgdG8gcG9pbnQgdG8gMiBkaWZmZXJlbnQgdHlwZXMgKGUuZzogb25lIHNwZWNpZmljIGZvciBHUE9OIGFuZAorICogdGhlIG90aGVyIHNwZWNpZmljIGZvciBYR1BPTikuICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBmcm9tOworICAgIGNvbnN0IGNoYXIgKnRvOworfQoraW50MnN0cl90OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmludDJzdHIoY29uc3QgaW50MnN0cl90ICphcnIsIGludCBmcm9tKQoreworICAgIGZvciAoOyBhcnItPmZyb20gIT0gLTEgJiYgYXJyLT5mcm9tICE9IGZyb207IGFycisrKTsKKyAgICByZXR1cm4gYXJyLT50bzsKK30KKworLyogQWx0aG91Z2ggd2UgaGF2ZSBCQ01PTFRfVFlQRTJJTlQsIGludDJpbnRfdCBpcyBzdGlsbCByZXF1aXJlZCB3aGVuIHRoZSBzYW1lIGdlbmVyaWMgcG9pbnRlciBuZWVkcyB0byBwb2ludCB0byAyIGRpZmZlcmVudCB0eXBlcyAoZS5nOiBvbmUgc3BlY2lmaWMgZm9yIEdQT04gYW5kCisgKiB0aGUgb3RoZXIgc3BlY2lmaWMgZm9yIFhHUE9OKS4gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IGZyb207CisgICAgaW50IHRvOworfQoraW50MmludF90OworCitzdGF0aWMgaW5saW5lIGludCBpbnQyaW50KGNvbnN0IGludDJpbnRfdCAqYXJyLCBpbnQgZnJvbSkKK3sKKyAgICBmb3IgKDsgYXJyLT5mcm9tICE9IC0xICYmIGFyci0+ZnJvbSAhPSBmcm9tOyBhcnIrKyk7CisgICAgcmV0dXJuIGFyci0+dG87Cit9CisKKyNpZm5kZWYgQ0ZFX0JVSUxECitjaGFyICpiY21vbHRfc3RyZnRpbWUoY2hhciAqdGltZV9zdHIsIHRpbWVfdCB0LCBjb25zdCBjaGFyICp0aW1lem9uZV9zdHIpOworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2Zpcm13YXJlX2VudmVsb3BlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2Zpcm13YXJlX2VudmVsb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0ZDZkMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfZmlybXdhcmVfZW52ZWxvcGUuaApAQCAtMCwwICsxLDk1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpZm5kZWYgX0JDTU9MVF9GSVJNV0FSRV9FTlZFTE9QRV9IXworI2RlZmluZSBfQkNNT0xUX0ZJUk1XQVJFX0VOVkVMT1BFX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKworI2RlZmluZSBCQ01PTFRfRklSTVdBUkVfRU5WRUxPUEVfREVTQ19NQVhfU0laRSAxMjgKKyNkZWZpbmUgQkNNT0xUX0ZJUk1XQVJFX0VOVkVMT1BFX1RJTUVfWk9ORV9TSVpFIDcKKyNkZWZpbmUgQkNNT0xUX0ZJUk1XQVJFX0VOVkVMT1BFX01ENV9DSEVDS1NVTV9TSVpFIDE2CisKKy8qIE5vcm1hbGl6ZWQgZm9ybSBvZiBhIGZpcm13YXJlIHJldmlzaW9uIGZvciBjb21wYXJpc29uIHB1cnBvc2VzLiAqLworI2RlZmluZSBERVZJQ0VfTUdNVF9SRVZJU0lPTl9SRUxFQVNFX01BSk9SX0lEX1NISUZUIDI0CisjZGVmaW5lIERFVklDRV9NR01UX1JFVklTSU9OX1JFTEVBU0VfTUlOT1JfSURfU0hJRlQgMTYKKyNkZWZpbmUgREVWSUNFX01HTVRfUkVWSVNJT05fUkVMRUFTRV9SRVZJU0lPTl9JRF9TSElGVCA4CisjZGVmaW5lIERFVklDRV9NR01UX1JFVklTSU9OX01PREVMX0lEX1NISUZUIDAKKworI2RlZmluZSBCQ01PTFRfRklSTVdBUkVfRU5WRUxPUEVfTk9STUFMSVpFKHJldl9hKSBcCisgICAgKCgocmV2X2EpLT5yZWxlYXNlX21ham9yX2lkIDw8IERFVklDRV9NR01UX1JFVklTSU9OX1JFTEVBU0VfTUFKT1JfSURfU0hJRlQpIHwgXAorICAgICgocmV2X2EpLT5yZWxlYXNlX21pbm9yX2lkIDw8IERFVklDRV9NR01UX1JFVklTSU9OX1JFTEVBU0VfTUlOT1JfSURfU0hJRlQpIHwgXAorICAgICgocmV2X2EpLT5yZWxlYXNlX3JldmlzaW9uX2lkIDw8IERFVklDRV9NR01UX1JFVklTSU9OX1JFTEVBU0VfUkVWSVNJT05fSURfU0hJRlQpIHwgXAorICAgICgocmV2X2EpLT5tb2RlbF9pZCA8PCBERVZJQ0VfTUdNVF9SRVZJU0lPTl9NT0RFTF9JRF9TSElGVCkpCisKK3R5cGVkZWYgc3RydWN0IF9fUEFDS0VEX0FUVFJfU1RBUlRfXworeworICAgIHVpbnQ4X3QgcmVsZWFzZV9tYWpvcl9pZDsKKyAgICB1aW50OF90IHJlbGVhc2VfbWlub3JfaWQ7CisgICAgdWludDhfdCByZWxlYXNlX3JldmlzaW9uX2lkOworICAgIHVpbnQzMl90IG1vZGVsX2lkOworfSBfX1BBQ0tFRF9BVFRSX0VORF9fIGJjbW9sdF9maXJtd2FyZV9lbnZlbG9wZV9yZXZpc2lvbjsKKwordHlwZWRlZiBzdHJ1Y3QgX19QQUNLRURfQVRUUl9TVEFSVF9fCit7CisgICAgdWludDhfdCBlbnZlbG9wZV9yZXZpc2lvbjsgLyogVGhlIGVudmVsb3BlIGl0c2VsZiBjYW4gYmUgY2hhbmdlZCBvdmVyIHRpbWUsIHNvIHRoaXMgZXhwbGFpbnMgd2h5IHdlIG5lZWQgYW4gZW52ZWxvcGUgcmV2aXNpb24gZmllbGQuICovCisgICAgYmNtb2x0X2Zpcm13YXJlX2VudmVsb3BlX3JldmlzaW9uIHJldmlzaW9uOyAvKiBSZXZpc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIHVpbnQzMl90IGJsb2NrX2lzc3VfZW5mb3JjZTsgLyogRXZlcnkgdGltZSBhIGNoYW5nZSBpbiB0aGUgY29kZSBjYW5ub3QgYmUgc3VwcG9ydGVkIGluIElTU1UgYW5kIHJlcXVpcmVzIGEgcmVndWxhciB1cGdyYWRlIChlLmcuOiBTR0IvU0VSREVTIGZpcm13YXJlIHVwZ3JhZGUpLCB0aGlzIGludGVnZXIgbnVtYmVyIHdpbGwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZSBpbmNyZW1lbnRlZC4gSWYgcmV2aXNpb24gdmFsaWRhdGlvbiBmdW5jdGlvbiBkZXRlY3RzIGEgY2hhbmdlIGluIHRoaXMgaW50ZWdlciBiZXR3ZWVuIHR3byByZXZpc2lvbnMsIHRoZW4gaXQgd2lsbCBibG9jayBJU1NVLiAqLworICAgIHVpbnQzMl90IHA0X2NoYW5nZV9zZXQ7IC8qIFRoaXMgaXMgcHVyZWx5IGluZm9ybWF0aXZlIGZpZWxkIHRoYXQgc2hvdWxkIGhhdmUgbm8gaW1wYWN0IG9uIHZhbGlkYXRpb24uICovCisgICAgdWludDMyX3QgYnVpbGRfdGltZTsgLyogVGhpcyBpcyBwdXJlbHkgaW5mb3JtYXRpdmUgZmllbGQgdGhhdCBzaG91bGQgaGF2ZSBubyBpbXBhY3Qgb24gdmFsaWRhdGlvbi4gSXQgY29udGFpbnMgdGhlIGRhdGUvdGltZSBvZiB0aGUgaW1hZ2UgaXRzZWxmLCBleHByZXNzZWQgYXMgc2Vjb25kcyBzaW5jZSB0aGUgRVBPQ0guICovCisgICAgY2hhciBidWlsZF90aW1lX3pvbmVbQkNNT0xUX0ZJUk1XQVJFX0VOVkVMT1BFX1RJTUVfWk9ORV9TSVpFXTsgLyogVGhpcyBpcyBwdXJlbHkgaW5mb3JtYXRpdmUgZmllbGQgdGhhdCBzaG91bGQgaGF2ZSBubyBpbXBhY3Qgb24gdmFsaWRhdGlvbi4gSXQgZ29lcyBhbG9uZyB3aXRoIGJ1aWxkIHRpbWUgb3B0aW9uIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHByb3ZpZGVzIHRpbWUgem9uZSBpbmZvcm1hdGlvbiwgYXMgdGhlIGVtYmVkZGVkIHNpZGUgZG9lcyBub3Qga25vdyBhbnl0aGluZyBhYm91dCB0aW1lIHpvbmUgKHdpdGhvdXQgdGhhdCwgdGhlIGJ1aWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGltZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgd2lsbCBhbHdheXMgeWllbGQgR01UIHRpbWUsIG5vdCBsb2NhbCB0aW1lKS4gKi8KKyAgICB1aW50OF90IGRlc2NbQkNNT0xUX0ZJUk1XQVJFX0VOVkVMT1BFX0RFU0NfTUFYX1NJWkVdOyAvKiBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGl2ZSBmaWVsZCB0aGF0IHNob3VsZCBoYXZlIG5vIGltcGFjdCBvbiB2YWxpZGF0aW9uLiAqLworICAgIHVpbnQ4X3QgbWQ1X2NoZWNrc3VtW0JDTU9MVF9GSVJNV0FSRV9FTlZFTE9QRV9NRDVfQ0hFQ0tTVU1fU0laRV07IC8qIFRoZSBNRDUgY2hlY2tzdW0gc2hvdWxkIGJlIGFwcGxpZWQgb24gdGhlIGltYWdlIGl0c2VsZiwgbm90IG9uIHRoZSBlbnZlbG9wZS4gVGhpcyBtYXkgYmUgcmVkdW5kYW50IGJlY2F1c2Ugd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IGRvIENSQyBpbmhlcmVudGx5IGFzIHBhcnQgb2YgaW1hZ2UgdHJhbnNmZXIgbWVjaGFuaXNtLiBIb3dldmVyLCB0aGlzIG1heSBoYXZlIHNvbWUgZnV0dXJlIHVzZS4gKi8KKyAgICB1aW50MzJfdCBpbWFnZV9sZW47IC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBpbWFnZSBpdHNlbGYsIG5vdCB3aXRoIHRoZSBlbnZlbG9wZS4gNCBieXRlcyBzaG91bGQgYmUgYmlnIGVub3VnaCB0byBhY2NvbW1vZGF0ZSBpbWFnZSBsZW5ndGggdXAgdG8gNEdCLCB3aGljaCBpcyBmYXIgYmV5b25kIHdoYXQgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlYWxseSBuZWVkLiAqLworfSBfX1BBQ0tFRF9BVFRSX0VORF9fIGJjbW9sdF9maXJtd2FyZV9lbnZlbG9wZTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfbWF0aC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9tYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1MmEwMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfbWF0aC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9NQVRIX0hfCisjZGVmaW5lIF9CQ01PTFRfTUFUSF9IXworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjZGVmaW5lIFJPVU5EX1UzMihzaXplX2luX2J5dGVzKSAoKHVpbnQzMl90KSgoc2l6ZV9pbl9ieXRlcykgKyAwLjUpKQorI2RlZmluZSBDRUlMX1UzMihzaXplX2luX2J5dGVzKSAoKChzaXplX2luX2J5dGVzKS0odWludDMyX3QpKHNpemVfaW5fYnl0ZXMpKSA+IDAgPyAoKHVpbnQzMl90KShzaXplX2luX2J5dGVzKSsxKSA6ICh1aW50MzJfdCkoc2l6ZV9pbl9ieXRlcykpCisjZGVmaW5lIFNRVUFSRSh4KSAoKHgpICogKHgpKQorI2RlZmluZSBQRVJDRU5UKHBlcmNlbnQsIHgpICgoKGZsb2F0KShwZXJjZW50KSAqICh4KSkgLyAxMDApCisKKy8qCisgKiBVbml0IENvbnZlcnNpb24KKyAqLworI2RlZmluZSBCSVRTX1RPX0JZVEVTKGJpdHMpICgoYml0cykgPj4gMykKKyNkZWZpbmUgQllURVNfVE9fQklUUyhieXRlcykgKChieXRlcykgPDwgMykKKworLyogUXVhbnRpemF0aW9uICovCisKKy8qCisgKiBWQUxfVE9fQklOIGNsYXNzaWZpZXMgdGhlIHZhbHVlIG9mIHZhbCB0byB0aGUgcHJvcGVyIGJpbgorICogdmFsIC0gYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgWzAsIG1heHZhbF0KKyAqIGJpbiAtIGEgdmFsdWUgaW4gdGhlIHJhbmdlIFswLCBiaW5zLTFdIChyZXN1bHQgb2YgbWFjcm8pCisgKi8KKyNkZWZpbmUgVkFMX1RPX0JJTih2YWwsIG1heHZhbCwgYmlucykgKCh2YWwpIDwgKG1heHZhbCkgPyAoKHZhbCkgKiAoYmlucykpIC8gKG1heHZhbCkgOiAoYmlucykgLSAxKQorCisvKiBJZiBhIHZhbHVlIGlzIGluIGEgY2VydGFpbiBiaW4sIGl0IGlzIGluIHRoZSByYW5nZSBbbWluX2Jpbl92YWwsIG1heF9iaW5fdmFsXQorICogbWluX2Jpbl92YWwgLSBtaW5pbXVtIHZhbHVlIHRoYXQgYmVsb25ncyB0byBiaW4KKyAqIG1heF9iaW5fdmFsIC0gbWF4aW11bSB2YWx1ZSB0aGF0IGJlbG9uZ3MgdG8gYmluCisgKi8KKyNkZWZpbmUgQklOX1RPX01JTl9CSU5fVkFMKGJpbiwgbWF4dmFsLCBiaW5zKSAoKGJpbikgKiAoKGRvdWJsZSkobWF4dmFsKSAvIChiaW5zKSkpCisjZGVmaW5lIEJJTl9UT19NQVhfQklOX1ZBTChiaW4sIG1heHZhbCwgYmlucykgKCgoYmluKSArIDEpICogKChkb3VibGUpKG1heHZhbCkgLyAoYmlucykpKQorCisjZGVmaW5lIEdFVF9NQVNLKHdpZHRoKSAgICAgICAgICAgICAoKDEgPDwgKHdpZHRoKSkgLSAxKQorCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTUFYMyhhLCBiLCBjKSBNQVgoTUFYKGEsIGIpLCBjKQorI2RlZmluZSBNSU4zKGEsIGIsIGMpIE1JTihNSU4oYSwgYiksIGMpCisKKyNkZWZpbmUgQ0VJTElORyhhLCBiKSAgICgoKGEpICsgKChiKSAtIDEpKSAvIChiKSkKKworI2VuZGlmIC8qIF9CQ01PTFRfTUFUSF9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9tb2R1bGUuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfbW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1MTNlOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfbW9kdWxlLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX01PRFVMRV9IXworI2RlZmluZSBfQkNNT0xUX01PRFVMRV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKworLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgYnkgcHJvYmFibHkgYWxsIG1vZHVsZXMgaW4gb3VyIHN5c3RlbS4gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfdGFzayB0YXNrOworICAgIGJjbW9zX2Jvb2wgaXNfZW5hYmxlZDsKKyAgICBjaGFyIHRhc2tfbmFtZVtNQVhfVEFTS19OQU1FX1NJWkVdOworICAgIGRldl9sb2dfaWQgbG9nX2lkOworICAgIGJjbW9sdF9wb25fbmkgcG9uX2lkOworICAgIGNoYXIgbXNnX3F1ZXVlX25hbWVbTUFYX01TR19RVUVVRV9OQU1FX1NJWkVdOworICAgIGJjbW9zX21zZ19wb29sIG1zZ19wb29sOworICAgIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQ7CisgICAgdm9pZCAqY29udGV4dDsKK30gYmNtb2x0X21vZHVsZV9nZW5fcGFyYW1zOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9zdHJpbmcuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZmEyMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfc3RyaW5nLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vbHRfc3RyaW5nLmgiCisjaW5jbHVkZSAiYmNtb2x0X21hdGguaCIKKworc3RydWN0IGJjbW9sdF9zdHJpbmcKK3sKKyAgICBjaGFyICpzdHI7CisgICAgdWludDMyX3QgbWF4X2xlbjsKKyAgICBjaGFyICpjdXJyOworICAgIGludDMyX3QgcmVtYWluaW5nOworfTsKKworaW50IGJjbW9sdF9zdHJpbmdfY29weShiY21vbHRfc3RyaW5nICpzdHIsIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBpbnQgdG9fY29weSA9IE1JTihzaXplLCBzdHItPnJlbWFpbmluZyk7CisgICAgbWVtY3B5KHN0ci0+Y3VyciwgYnVmLCB0b19jb3B5KTsKKyAgICBzdHItPnJlbWFpbmluZyAtPSB0b19jb3B5OworICAgIHN0ci0+Y3VyciArPSB0b19jb3B5OworICAgIHN0ci0+Y3VyclswXSA9ICdcMCc7CisgICAgcmV0dXJuIHRvX2NvcHk7Cit9CisKK2ludCBiY21vbHRfc3RyaW5nX2FwcGVuZChiY21vbHRfc3RyaW5nICpzdHIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIGludCBuOworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgbiA9IHZzbnByaW50ZihzdHItPmN1cnIsIHN0ci0+cmVtYWluaW5nLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICBpZiAobiA+IDApCisgICAgeworICAgICAgICBpZiAobiA+IHN0ci0+cmVtYWluaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBuID0gc3RyLT5yZW1haW5pbmc7CisgICAgICAgIH0KKyAgICAgICAgc3RyLT5yZW1haW5pbmcgLT0gbjsKKyAgICAgICAgc3RyLT5jdXJyICs9IG47CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKK2NvbnN0IGNoYXIgKmJjbW9sdF9zdHJpbmdfZ2V0KGJjbW9sdF9zdHJpbmcgKnN0cikKK3sKKyAgICByZXR1cm4gc3RyLT5zdHI7Cit9CisKK3ZvaWQgYmNtb2x0X3N0cmluZ19yZXNldChiY21vbHRfc3RyaW5nICpzdHIpCit7CisgICAgc3RyLT5zdHJbMF0gPSAnXDAnOworICAgIHN0ci0+Y3VyciA9IHN0ci0+c3RyOworICAgIHN0ci0+cmVtYWluaW5nID0gc3RyLT5tYXhfbGVuOworfQorCitiY21vc19lcnJubyBiY21vbHRfc3RyaW5nX2NyZWF0ZShiY21vbHRfc3RyaW5nICoqc3RyLCB1aW50MzJfdCBtYXhfbGVuKQoreworICAgICpzdHIgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbW9sdF9zdHJpbmcpICsgbWF4X2xlbiArIDEpOworICAgIGlmICgqc3RyICE9IE5VTEwpCisgICAgeworICAgICAgICAoKnN0ciktPnN0ciA9IChjaGFyKikoKCpzdHIpICsgMSk7CisgICAgICAgICgqc3RyKS0+bWF4X2xlbiA9IG1heF9sZW47CisgICAgICAgIGJjbW9sdF9zdHJpbmdfcmVzZXQoKnN0cik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworfQorCit2b2lkIGJjbW9sdF9zdHJpbmdfZGVzdHJveShiY21vbHRfc3RyaW5nICpzdHIpCit7CisgICAgYmNtb3NfZnJlZShzdHIpOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X3N0cmluZy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWZjYWEyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9zdHJpbmcuaApAQCAtMCwwICsxLDQ5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfU1RSSU5HX0hfCisjZGVmaW5lIF9CQ01PTFRfU1RSSU5HX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3N0cmluZyBiY21vbHRfc3RyaW5nOworCitpbnQgYmNtb2x0X3N0cmluZ19jb3B5KGJjbW9sdF9zdHJpbmcgKnN0ciwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKTsKKworaW50IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGJjbW9sdF9zdHJpbmcgKnN0ciwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCitjb25zdCBjaGFyICpiY21vbHRfc3RyaW5nX2dldChiY21vbHRfc3RyaW5nICpzdHIpOworCit2b2lkIGJjbW9sdF9zdHJpbmdfcmVzZXQoYmNtb2x0X3N0cmluZyAqc3RyKTsKKworYmNtb3NfZXJybm8gYmNtb2x0X3N0cmluZ19jcmVhdGUoYmNtb2x0X3N0cmluZyAqKnN0ciwgdWludDMyX3QgbWF4X2xlbik7CisKK3ZvaWQgYmNtb2x0X3N0cmluZ19kZXN0cm95KGJjbW9sdF9zdHJpbmcgKnN0cik7CisKKyNlbmRpZiAvKiBfQkNNT0xUX1NUUklOR19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF91dGlscy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTg5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X3V0aWxzLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vbHRfdXRpbHMuaCIKKworLyogSGV4UHJpbnQgYSBzaW5nbGUgbGluZSAqLworI2RlZmluZSBCWVRFU19JTl9MSU5FIDE2CisKKyNkZWZpbmUgYjJhKGMpICAoaXNwcmludChjKT9jOicuJykKKworc3RhdGljIHZvaWQgX2hleHByaW50MShiY21vc19tc2dfcHJpbnRfY2IgcHJpbnRfY2IsIHZvaWQgKmNvbnRleHQsIHVpbnQxNl90IG8sIGNvbnN0IHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgY291bnQsIGNvbnN0IGNoYXIgKmluZGVudCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChpbmRlbnQpCisgICAgICAgIHByaW50X2NiKGNvbnRleHQsICIlcyIsIGluZGVudCk7CisKKyAgICBwcmludF9jYihjb250ZXh0LCAiJTA0eDogIiwgbyk7CisgICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHByaW50X2NiKGNvbnRleHQsICIlMDJ4IiwgcF9kYXRhW2ldKTsKKyAgICAgICAgaWYgKCEoKGkrMSklNCkpCisgICAgICAgICAgICBwcmludF9jYihjb250ZXh0LCAiICIpOworICAgIH0KKyAgICBmb3IgKDsgaTxCWVRFU19JTl9MSU5FOyBpKyspCisgICAgeworICAgICAgICBpZiAoISgoaSsxKSU0KSkKKyAgICAgICAgICAgIHByaW50X2NiKGNvbnRleHQsICIgICAiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRfY2IoY29udGV4dCwgIiAgIik7CisgICAgfQorICAgIGZvciAoaT0wOyBpPGNvdW50OyBpKyspCisgICAgICAgIHByaW50X2NiKGNvbnRleHQsICIlYyIsIGIyYShwX2RhdGFbaV0pKTsKKyAgICBwcmludF9jYihjb250ZXh0LCAiXG4iKTsKK30KKwordm9pZCBiY21vc19oZXhkdW1wKGJjbW9zX21zZ19wcmludF9jYiBwcmludF9jYiwgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqYnVmZmVyLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGNvdW50LCBjb25zdCBjaGFyICppbmRlbnQpCit7CisgICAgY29uc3QgdWludDhfdCAqcF9kYXRhID0gYnVmZmVyOworICAgIHVpbnQxNl90IG47CisKKyAgICB3aGlsZSAoY291bnQpCisgICAgeworICAgICAgICBuID0gKGNvdW50ID4gQllURVNfSU5fTElORSkgPyBCWVRFU19JTl9MSU5FIDogY291bnQ7CisgICAgICAgIF9oZXhwcmludDEocHJpbnRfY2IsIGNvbnRleHQsIG9mZnNldCwgcF9kYXRhLCBuLCBpbmRlbnQpOworICAgICAgICBjb3VudCAtPSBuOworICAgICAgICBwX2RhdGEgKz0gbjsKKyAgICAgICAgb2Zmc2V0ICs9IG47CisgICAgfQorfQorCit2b2lkIGJjbW9zX2hleGR1bXBfb25lX2xpbmUoY29uc3QgY2hhciAqZnVuY25hbWUsICAgICAvKiBfX0ZVTkNUSU9OX18gKi8KKyAgICB1aW50MzJfdCBsaW5lbm8sICAgICAgIC8qIF9fTElORV9fICovCisgICAgYmNtb3NfbXNnX3ByaW50X2NiIHByaW50X2NiLAorICAgIHZvaWQgKmNvbnRleHQsCisgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCAvKiBzdGFydCBvZiBtZW1vcnkgcmVnaW9uIHRvIGR1bXAgKi8KKyAgICB1aW50MzJfdCBzdGFydF9vZmZzZXQsIC8qIHN0YXJ0IG9mZnNldCBpbnRvIHRoZSByZWdpb24gKi8KKyAgICB1aW50MzJfdCBieXRlX2NvdW50LCAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gcmVnaW9uIHRvIGR1bXAgKi8KKyAgICBjb25zdCBjaGFyICpwcmVmaXgsIC8qIG9wdGlvbmFsIHByZWZpeCBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICpzdWZmaXgpIC8qIG9wdGlvbmFsIHN1ZmZpeCBzdHJpbmcgKi8KK3sKKyAgICBjb25zdCB1aW50OF90ICpwX2RhdGEgPSBidWZmZXI7CisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQgPSBzdGFydF9vZmZzZXQ7CisgICAgc2l6ZV90IG1heF9idWZfc2l6ZSA9IDgwMDA7IC8qIHJvb20gZW5vdWdoIHRvIGR1bXAgfjI2MDAgYnl0ZXMgd2l0aCBzaG9ydGlzaCBwcmVmaXhlcy9zdWZmaXhlcyAqLworICAgIGNoYXIgKm91dF9idWYgPSBiY21vc19jYWxsb2MobWF4X2J1Zl9zaXplKTsKKyAgICBzaXplX3Qgb3V0X2J1Zl9vZmZzZXQgPSAwOworICAgIHVpbnQzMl90IHRtcF9udW1fY2hhcnMgPSAwOworCisgICAgQlVHX1VOTEVTUyhvdXRfYnVmKTsKKworICAgIG1lbXNldChvdXRfYnVmLCAwLCBtYXhfYnVmX3NpemUpOworCisgICAgaWYgKHByZWZpeCkKKyAgICB7CisgICAgICAgIHRtcF9udW1fY2hhcnMgPSBzbnByaW50ZihvdXRfYnVmICsgb3V0X2J1Zl9vZmZzZXQsIC8qIG91dF9idWYgc3RhcnQgb2Zmc2V0ICovCisgICAgICAgICAgICBtYXhfYnVmX3NpemUgLSBvdXRfYnVmX29mZnNldCwgLyogcmVtYWluaW5nIHNwYWNlIGluIG91dF9idWYgKi8KKyAgICAgICAgICAgICJcbiU0MHM6JS01dSAgJXMiLCBmdW5jbmFtZSwgbGluZW5vLCBwcmVmaXgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXBfbnVtX2NoYXJzID0gc25wcmludGYob3V0X2J1ZiArIG91dF9idWZfb2Zmc2V0LCAvKiBvdXRfYnVmIHN0YXJ0IG9mZnNldCAqLworICAgICAgICAgICAgbWF4X2J1Zl9zaXplIC0gb3V0X2J1Zl9vZmZzZXQsIC8qIHJlbWFpbmluZyBzcGFjZSBpbiBvdXRfYnVmICovCisgICAgICAgICAgICAiXG4iKTsKKyAgICB9CisgICAgb3V0X2J1Zl9vZmZzZXQgKz0gdG1wX251bV9jaGFyczsKKworICAgIHdoaWxlICgoZGF0YV9vZmZzZXQgPCAoc3RhcnRfb2Zmc2V0ICsgYnl0ZV9jb3VudCkpICYmIChvdXRfYnVmX29mZnNldCA8IG1heF9idWZfc2l6ZSkpCisgICAgeworICAgICAgICB0bXBfbnVtX2NoYXJzID0gc25wcmludGYob3V0X2J1ZiArIG91dF9idWZfb2Zmc2V0LCAvKiBvdXRfYnVmIHN0YXJ0IG9mZnNldCAqLworICAgICAgICAgICAgbWF4X2J1Zl9zaXplIC0gb3V0X2J1Zl9vZmZzZXQsIC8qIHJlbWFpbmluZyBzcGFjZSBpbiBvdXRfYnVmICovCisgICAgICAgICAgICAiJTAyeCAiLAorICAgICAgICAgICAgcF9kYXRhW2RhdGFfb2Zmc2V0KytdKTsgLyogYnl0ZSB0byBkdW1wICovCisgICAgICAgIEJVR19VTkxFU1MoMyA9PSB0bXBfbnVtX2NoYXJzKTsKKyAgICAgICAgb3V0X2J1Zl9vZmZzZXQgKz0gdG1wX251bV9jaGFyczsKKyAgICB9CisKKyAgICBpZiAodG1wX251bV9jaGFycyA8IG1heF9idWZfc2l6ZSkKKyAgICB7CisgICAgICAgIGlmIChzdWZmaXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcF9udW1fY2hhcnMgPSBzbnByaW50ZihvdXRfYnVmICsgb3V0X2J1Zl9vZmZzZXQsIC8qIG91dF9idWYgc3RhcnQgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgbWF4X2J1Zl9zaXplIC0gb3V0X2J1Zl9vZmZzZXQsIC8qIHJlbWFpbmluZyBzcGFjZSBpbiBvdXRfYnVmICovCisgICAgICAgICAgICAgICAgIiVzIiwgc3VmZml4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcF9udW1fY2hhcnMgPSBzbnByaW50ZihvdXRfYnVmICsgb3V0X2J1Zl9vZmZzZXQsIC8qIG91dF9idWYgc3RhcnQgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgbWF4X2J1Zl9zaXplIC0gb3V0X2J1Zl9vZmZzZXQsIC8qIHJlbWFpbmluZyBzcGFjZSBpbiBvdXRfYnVmICovCisgICAgICAgICAgICAgICAgIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0X2J1Zl9vZmZzZXQgKz0gdG1wX251bV9jaGFyczsKKyAgICAgICAgQlVHX1VOTEVTUyhvdXRfYnVmX29mZnNldCA8IG1heF9idWZfc2l6ZSk7CisgICAgfQorCisgICAgcHJpbnRfY2IoY29udGV4dCwgIiVzIiwgb3V0X2J1Zik7CisgICAgYmNtb3NfZnJlZShvdXRfYnVmKTsKK30KKworc3RhdGljIHVpbnQzMl90IGV0aF9jcmMzMl90YWJbXSA9Cit7CisgICAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwgMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwKKyAgICAweGU5NjNhNTM1LCAweDllNjQ5NWEzLCAweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAorICAgIDB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsIDB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsCisgICAgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwgMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywKKyAgICAweDEzNmM5ODU2LCAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLCAweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LAorICAgIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsIDB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsCisgICAgMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YiwgMHgzNWI1YThmYSwgMHg0MmIyOTg2YywKKyAgICAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLCAweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAorICAgIDB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsIDB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsCisgICAgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwgMHgyODAyYjg5ZSwgMHg1ZjA1ODgwOCwgMHhjNjBjZDliMiwgMHhiMTBiZTkyNCwKKyAgICAweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLCAweDc2ZGM0MTkwLCAweDAxZGI3MTA2LAorICAgIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsIDB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsCisgICAgMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSwgMHhlMTBlOTgxOCwgMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwKKyAgICAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLCAweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAorICAgIDB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsIDB4NjViMGQ5YzYsIDB4MTJiN2U5NTAsCisgICAgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywgMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMywgMHhmYmQ0NGM2NSwKKyAgICAweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLCAweDRhZGZhNTQxLCAweDNkZDg5NWQ3LAorICAgIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsIDB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsCisgICAgMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSwgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwgMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwKKyAgICAweGJlMGIxMDEwLCAweGM5MGMyMDg2LCAweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAorICAgIDB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsIDB4NTliMzNkMTcsIDB4MmViNDBkODEsCisgICAgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwgMHhlZGI4ODMyMCwgMHg5YWJmYjNiNiwgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwKKyAgICAweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LCAweDczZGMxNjgzLCAweGUzNjMwYjEyLCAweDk0NjQzYjg0LAorICAgIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsIDB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsCisgICAgMHhmMDBmOTM0NCwgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwgMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwKKyAgICAweDE5NmMzNjcxLCAweDZlNmIwNmU3LCAweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAorICAgIDB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsIDB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsCisgICAgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwgMHhkMWJiNjdmMSwgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwKKyAgICAweGQ4MGQyYmRhLCAweGFmMGExYjRjLCAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLCAweGRmNjBlZmMzLCAweGE4NjdkZjU1LAorICAgIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksIDB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsCisgICAgMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwgMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwKKyAgICAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LCAweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAorICAgIDB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsIDB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsCisgICAgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywgMHg5NWJmNGE4MiwgMHhlMmI4N2ExNCwgMHg3YmIxMmJhZSwgMHgwY2I2MWIzOCwKKyAgICAweDkyZDI4ZTliLCAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLCAweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLAorICAgIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsIDB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsCisgICAgMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YywgMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwKKyAgICAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LCAweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAorICAgIDB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsIDB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsCisgICAgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwgMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSwKKyAgICAweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LCAweGJhZDAzNjA1LCAweGNkZDcwNjkzLAorICAgIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsIDB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsCisgICAgMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYiwgMHgyZDAyZWY4ZAorfTsKKwordWludDMyX3QgZXRoX2NhbGNfY3JjMzIodWludDMyX3QgY3JjLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnA7CisKKyAgICBwID0gYnVmOworICAgIGNyYyA9IGNyYyBeIH4wVTsKKworICAgIHdoaWxlIChzaXplLS0pCisgICAgICAgIGNyYyA9IGV0aF9jcmMzMl90YWJbKGNyYyBeICpwKyspICYgMHhGRl0gXiAoY3JjID4+IDgpOworCisgICAgcmV0dXJuIGNyYyBeIH4wVTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF91dGlscy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTVhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X3V0aWxzLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VVElMU19IXworI2RlZmluZSBfQkNNT0xUX1VUSUxTX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKworI2RlZmluZSBCQ01PU19NQUNBRERSX0ZNVF9TVFIgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIgorI2RlZmluZSBCQ01PU19NQUNBRERSX1BBUkFNUyhtYWMpIChtYWMpLT51OFswXSwobWFjKS0+dThbMV0sKG1hYyktPnU4WzJdLChtYWMpLT51OFszXSwobWFjKS0+dThbNF0sKG1hYyktPnU4WzVdCisKKyNkZWZpbmUgTUFDX1NUUl9MRU4gMTgKKworI2RlZmluZSBCWVRFU19JTl9NRUdBQllURShieXRlcykgKChieXRlcykgLyAoMTAyNCAqIDEwMjQpKQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmJjbW9zX21hY18yX3N0cihjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqbWFjLCBjaGFyICpidWYpCit7CisgICAgc25wcmludGYoYnVmLCBNQUNfU1RSX0xFTiwgQkNNT1NfTUFDQUREUl9GTVRfU1RSLCBCQ01PU19NQUNBRERSX1BBUkFNUyhtYWMpKTsKKyAgICByZXR1cm4gYnVmOworfQorCisvKiogU3dhcCBhIGJ5dGUgc3RyaW5nIG9mIGFueSBsZW5ndGguCisgKgorICogXHBhcmFtW2luXSAgIHB0ciAgICAgcG9pbnRlciB0byBhIG1lbW9yeSBzcGFjZS4KKyAqIFxwYXJhbVtpbl0gICBsZW4gICAgIGxlbmd0aAorICogXG5vdGUKKyAqICAgICAgezAsIDEsIDIsIDN9IGJlY29tZXMgezMsIDIsIDEsIDB9CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19zd2FwX2J5dGVzX2luX3BsYWNlKHVpbnQ4X3QgKnB0ciwgdWludDMyX3QgbGVuKQoreworICAgIGludCAgaWk7CisgICAgY2hhciB0bXA7CisKKyAgICBmb3IgKGlpID0gMDsgaWkgPCAobGVuIC8gMik7IGlpKyspCisgICAgeworICAgICAgICB0bXAgPSBwdHJbbGVuIC0gaWkgLSAxXTsKKyAgICAgICAgcHRyW2xlbiAtIGlpIC0gMV0gPSBwdHJbaWldOworICAgICAgICBwdHJbaWldID0gdG1wOworICAgIH0KK30KKworLyoqIFN3YXAgYSBieXRlIHN0cmluZyBvZiBhbnkgbGVuZ3RoLgorICoKKyAqIFxwYXJhbVtvdXRdICAgICAgZHN0ICAgICBwb2ludGVyIHRvIGEgbWVtb3J5IHNwYWNlIGZvciB0aGUgc3dhcHBlZCBieXRlcy4KKyAqIFxwYXJhbVtpbl0gICAgICAgc3JjICAgICBwb2ludGVyIHRvIGEgbWVtb3J5IHNwYWNlIGZvciBieXRlcyB0byBiZSBzd2FwcGVkLgorICogXHBhcmFtW2luXSAgICAgICBsZW4gICAgIGxlbmd0aCBpbiBieXRlcworICogXG5vdGUKKyAqICAgICAgezAsIDEsIDIsIDN9IGJlY29tZXMgezMsIDIsIDEsIDB9CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19zd2FwX2J5dGVzKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50MzJfdCBsZW4pCit7CisgICAgaW50ICBpaTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IGxlbjsgaWkrKykKKyAgICB7CisgICAgICAgIGRzdFtpaV0gPSBzcmNbbGVuIC0gaWkgLSAxXTsKKyAgICB9Cit9CisKKy8qKiBDb3B5IGJpdHMgZnJvbSBhIGdpdmVuIHJhbmdlIG9mIHRoZSBzb3VyY2UgdG8gYSBkaWZmZXJlbnQgcmFuZ2Ugb2YgdGhlCisgKiAgZGVzdGluYXRpb24KKyAqCisgKiBccGFyYW1baW5dICAgZHN0ICAgICAgICAgZGVzdGluYXRpb24gdmFsdWUgdG8gYmUgbWVyZ2VkIHRvCisgKiBccGFyYW1baW5dICAgZHN0X2hpICAgICAgaGlnaCBiaXQgcG9zaXRpb24KKyAqIFxwYXJhbVtpbl0gICBkc3RfbG8gICAgICBsb3cgYml0IHBvc2l0aW9uCisgKiBccGFyYW1baW5dICAgc3JjICAgICAgICAgc291cmNlIHZhbHVlIHRvIGNvcHkgdGhlIGJpdHMgZnJvbQorICogXHBhcmFtW2luXSAgIHNyY19oaSAgICAgIGhpZ2ggYml0IHBvc2l0aW9uCisgKiBccGFyYW1baW5dICAgc3JjX2xvICAgICAgbG93IGJpdCBwb3NpdGlvbgorICoKKyAqIFxyZXR1cm4gICAgICBkZXN0aW5hdGlvbiB2YWx1ZQorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbW9zX2JpdHNfY29weV91MzIodWludDMyX3QgZHN0LCB1aW50OF90IGRzdF9oaSwgdWludDhfdCBkc3RfbG8sCisgICAgdWludDMyX3Qgc3JjLCB1aW50OF90IHNyY19oaSwgdWludDhfdCBzcmNfbG8pCit7CisgICAgZHN0ICY9ICh+KCgoMSA8PCAoKGRzdF9oaSAtIGRzdF9sbykgKyAxKSkgLSAxKSA8PCBkc3RfbG8pKTsKKyAgICBzcmMgJj0gKCgoMSA8PCAoKHNyY19oaSAtIHNyY19sbykgKyAxKSkgLSAxKSA8PCBzcmNfbG8pOworICAgIGRzdCB8PSAoKGRzdF9sbyA+PSBzcmNfbG8pPyAoc3JjIDw8IChkc3RfbG8gLSBzcmNfbG8pKTogKHNyYyA+PiAoc3JjX2xvIC0gZHN0X2xvKSkpOworICAgIHJldHVybiBkc3Q7Cit9CisKKy8qIG5ldHdvcmsgdG8gaG9zdCBvbiB1bmFsaWduZWQgYXJyYXkgb2YgdWludDMyX3QgZWxlbWVudHMuIFRyZWF0IHBvaW50ZXIgcCBhcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdWludDMyX3QgZWxlbWVudHMuIEdldCBlbGVtZW50IGkuICAqLworI2RlZmluZSBOMkgzMihwLCBpKSAoKCgoY29uc3QgdWludDhfdCAqKShwKSlbKGkpICogNF08PDI0KSB8ICgoKGNvbnN0IHVpbnQ4X3QgKikocCkpWyhpKSAqIDQrMV08PDE2KSB8ICgoKGNvbnN0IHVpbnQ4X3QgKikocCkpWyhpKSAqIDQrMl08PDgpIHwgKCgoY29uc3QgdWludDhfdCAqKShwKSlbKGkpICogNCszXSkpCisvKiBuZXR3b3JrIHRvIGhvc3Qgb24gdW5hbGlnbmVkIGFycmF5IG9mIHVpbnQxNl90IGVsZW1lbnRzLiBUcmVhdCBwb2ludGVyIHAgYXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHVpbnQxNl90IGVsZW1lbnRzLiBHZXQgZWxlbWVudCBpLiAqLworI2RlZmluZSBOMkgxNihwLCBpKSAoKCgoY29uc3QgdWludDhfdCAqKShwKSlbKGkpICogMl08PDgpIHwgKCgoY29uc3QgdWludDhfdCAqKShwKSlbKGkpICogMisxXSkpCisvKiBuZXR3b3JrIHRvIGhvc3Qgb24gdW5hbGlnbmVkIGFycmF5IG9mIHVpbnQ4X3QgZWxlbWVudHMuIFRyZWF0IHBvaW50ZXIgcCBhcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdWludDhfdCBlbGVtZW50cy4gR2V0IGVsZW1lbnQgaS4gKi8KKyNkZWZpbmUgTjJIOChwLCBpKSAoKChjb25zdCB1aW50OF90ICopKHApKVsoaSldKQorCisvKiBGb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBmb2xsb3dpbmcgSDJOKiBtYWNyb3MgKi8KKyNkZWZpbmUgSDJOOChwLCB2KSAgICooKHVpbnQ4X3QgKilwKSA9ICh1aW50OF90KSh2KQorLyogaG9zdCB0byBuZXR3b3JrIGNvbnZlcnNpb24gb2YgYSB1aW50MTZfdCB3aXRoIHN1cHBvcnQgZm9yIG5vbiAxNiBiaXQgYWxpZ25lZCBkZXN0aW5hdGlvbiBhZGRyZXNzLiBwIGlzIGEgKHVpbnQ4X3QgKikgZGVzdGluYXRpb24gcG9pbnRlci4gdiBpcyBhIHVpbnQxNl90IHZhbHVlLiB2IGNhbiBiZSB3cml0dGVuIHRvIHAgZXZlbiBpZiBwIGlzIHVuYWxpZ25lZCB0byAxNiBiaXRzLiAqLworI2RlZmluZSBIMk4xNihwLCB2KSAgKEgyTjgoKHApLCAodikgPj4gOCksIEgyTjgoKCh1aW50OF90ICopKHApICsgMSksICh2KSkpCisvKiBob3N0IHRvIG5ldHdvcmsgY29udmVyc2lvbiBvZiBhIHVpbnQzMl90IHdpdGggc3VwcG9ydCBmb3Igbm9uIDMyIGJpdCBhbGlnbmVkIGRlc3RpbmF0aW9uIGFkZHJlc3MuIHAgaXMgYSAodWludDhfdCAqKSBkZXN0aW5hdGlvbiBwb2ludGVyLiB2IGlzIGEgdWludDMyX3QgdmFsdWUuIHYgY2FuIGJlIHdyaXR0ZW4gdG8gcCBldmVuIGlmIHAgaXMgdW5hbGlnbmVkIHRvIDMyIGJpdHMuICovCisjZGVmaW5lIEgyTjMyKHAsIHYpICAoSDJOMTYoKHApLCAodikgPj4gMTYpLCBIMk4xNigoKHVpbnQ4X3QgKikocCkgKyAyKSwgKHYpKSkKKworI2RlZmluZSBOVU1fRUxFTShhcnJheSkgICAgIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKChhcnJheSlbMF0pKQorCit0eXBlZGVmIHZvaWQgKCpiY21vc19tc2dfcHJpbnRfY2IpKHZvaWQgKmNvbnRleHQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKwordm9pZCBiY21vc19oZXhkdW1wKGJjbW9zX21zZ19wcmludF9jYiBwcmludF9jYiwgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqYnVmZmVyLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGNvdW50LCBjb25zdCBjaGFyICppbmRlbnQpOwordm9pZCBiY21vc19oZXhkdW1wX29uZV9saW5lKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCB1aW50MzJfdCBsaW5lbm8sIGJjbW9zX21zZ19wcmludF9jYiBwcmludF9jYiwgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqYnVmZmVyLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGNvdW50LCBjb25zdCBjaGFyICpwcmVmaXgsCisgICAgY29uc3QgY2hhciAqc3VmZml4KTsKKwordWludDMyX3QgZXRoX2NhbGNfY3JjMzIodWludDMyX3QgY3JjLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKTsKKworI2RlZmluZSBCQ01PTFRfVElNRV9TVFJfTUFYX0xFTiA4MAorCisjZW5kaWYgLyogQkNNT0xUX1VUSUxTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTA4NjI4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjIE1hcGxlIEFQSSBDTEkKKyMKK2lmZXEgKCQoRU5BQkxFX0NMSSksIHkpCisgICAgTU9EX05BTUUgPSBhcGlfY2xpCisgICAgTU9EX1RZUEUgPSBsaWIKKyAgICBNT0RfREVQUyA9IGNvbW1vbl9hcGkgbW9kZWwgZGV2aWNlX3NlbGVjdG9yCisgICAgCisgICAgc3JjcyA9IGJjbV9hcGlfY2xpLmMgYmNtX2FwaV9jbGlfZHVtcC5jIGJjbV9hcGlfY2xpX2hhbmRsZXJzLmMgYmNtX2FwaV9jbGlfaGVscGVycy5jIAorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjY2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaS5jCkBAIC0wLDAgKzEsMTIxMSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21vc190eXBlcy5oPgorCisjaW5jbHVkZSAiYmNtX2FwaV9jbGkuaCIKKyNpbmNsdWRlICJiY21fYXBpX2NsaV9oZWxwZXJzLmgiCisjaW5jbHVkZSAiYmNtX2FwaV9jbGlfaGFuZGxlcnMuaCIKKyNpZmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QKKyNpbmNsdWRlIDxiY21vbHRfZGV2X3NlbGVjdG9yLmg+CisjZW5kaWYKKworI2RlZmluZSBBUElDTElfQ0FTVF9ESVNDQVJEX0NPTlNUKHAsIHR5cGUpICAgICAgICh0eXBlKSgobG9uZykocCkpCisKKy8qIGJvb2wgZW51bSB0YWJsZSAqLworc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBib29sX2VudW1bXSA9Cit7CisgICAgeyAubmFtZSA9ICJ5ZXMiLCAudmFsID0gMSB9LAorICAgIHsgLm5hbWUgPSAibm8iLCAudmFsID0gMCB9LAorICAgIEJDTUNMSV9FTlVNX0xBU1QKK307CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBib29sX3R5cGVfZGVzY3IgPSB7CisgICAgLm5hbWUgPSAiYm9vbCIsCisgICAgLmRlc2NyID0gIkJvb2xlYW4iLAorICAgIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sCisgICAgLnNpemUgPSBzaXplb2YoYmNtb3NfYm9vbCksCisgICAgLnggPSB7LmUgPSBib29sX2VudW19Cit9OworCisvKiBwYXJhbWV0ZXIgZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcHJvcDsgICAgICAvKiBwcm9wZXJ0eSAqLworICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmllbGQ7ICAgIC8qIGZpZWxkIG9yIE5VTEwgKi8KKyAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmFycmF5X2ZkOyAvKiBhcnJheSBmaWVsZCBkZXNjcmlwdG9yIG9yIE5VTEwgKi8KKyAgICB1aW50MTZfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9wZXJ0eSAqLworICAgIHVpbnQxNl90IGFycmF5X2ZkX29mZnNldDsgICAgICAgICAgIC8qIG9mZnNldCBvZiBhcnJheV9mZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb3BlcnR5ICovCisgICAgYmNtb2x0X21ndF9ncm91cCBncm91cDsgICAgICAgICAgICAgLyogbWFuYWdlbWVudCBncm91cCAqLworfSBhcGljbGlfcGFybV9kYXRhOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBBUElfQ0xJX0ZMQUdTX05PTkUgPSAwLAorICAgIEFQSV9DTElfRkxBR1NfSUdOT1JFX0ZJRUxEUyA9IDEgPDwgMCwKKyAgICBBUElfQ0xJX0ZMQUdTX01VTFRJID0gMSA8PCAxCit9IGFwaV9jbGlfZmxhZ3M7CisKKy8qIE9wZXJhdGlvbjogc2V0LCBnZXQsIG1vZGlmeSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQVBJX0NMSV9PUEVSX1NFVCwKKyAgICBBUElfQ0xJX09QRVJfR0VULAorICAgIEFQSV9DTElfT1BFUl9NT0RJRlksCit9IGFwaV9jbGlfb3BlcjsKKworLyogQ3VycmVudCBzZXNzaW9uICovCitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gKmN1cnJlbnRfc2Vzc2lvbjsKKworLyogQ3VycmVudCBzeXN0ZW0gbW9kZSAqLworc3RhdGljIGJjbW9sdF9zeXN0ZW1fbW9kZSBjdXJyZW50X3N5c3RlbV9tb2RlOworCisvKiBQYXJlbnQgZGlyZWN0b3J5ICovCitzdGF0aWMgYmNtY2xpX2VudHJ5ICphcGlfcGFyZW50X2RpcjsKKworLyoKKyAqIGhlbHBlcnMKKyAqLworCisvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0eXBlICovCitzdGF0aWMgdWludDMyX3QgX2FwaV9jbGlfZ2V0X251bV9maWVsZHNfaW5fdHlwZShjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQpCit7CisgICAgdWludDE2X3QgZjsKKyAgICB1aW50MzJfdCBuZiA9IDA7CisKKworICAgIHN3aXRjaCAodGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghdGQtPngucy5udW1fZmllbGRzKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgQlVHX09OKCF0ZC0+eC5zLmZpZWxkcyk7CisgICAgICAgICAgICBmb3IgKGYgPSAwOyBmIDwgdGQtPngucy5udW1fZmllbGRzOyBmKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmYgKz0gIF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX3R5cGUodGQtPngucy5maWVsZHNbZl0udHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTjoKKyAgICAgICAgeworICAgICAgICAgICAgLyogVW5pb24uIENvdW50IG9ubHkgY29tbW9uIGZpZWxkcyAqLworICAgICAgICAgICAgbmYgPSB0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVEOgorICAgICAgICB7CisgICAgICAgICAgICBuZiA9IF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX3R5cGUodGQtPnguYXJyX2ZpeGVkLmVsZW1fdHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOOgorICAgICAgICB7CisgICAgICAgICAgICBuZiA9IF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX3R5cGUodGQtPnguYXJyX2R5bi5lbGVtX3R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBuZiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZjsKK30KKworLyogY2FsY3VsYXRlIG51bWJlciBvZiBwcm9wZXJ0eSBmaWVsZHMgZm9yIGdpdmVuIG9iamVjdCtncm91cCtzdWJncm91cCthY2Nlc3MuIHNpbXBsZSBwcm9wZXJ0eT1zaW5nbGUgZmllbGQgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpX2NsaV9nZXRfbnVtX2ZpZWxkc19pbl9ncm91cChiY21vbHRfb2JqX2lkIG8sIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLAorICAgIGJjbW9sdF9wcm9wX2FjY2Vzc19pZCBhY2Nlc3NfbGV2ZWwsIHVpbnQzMl90ICpuZmllbGRzKQoreworICAgIHVpbnQzMl90IG5mID0gMDsKKyAgICBpbnQgaTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBmb3IgKGkgPSAwOyByYyAhPSBCQ01fRVJSX1JBTkdFOyBpKyspCisgICAgeworICAgICAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisgICAgICAgIHJjID0gYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobywgZ3JvdXAsIHN1Ymdyb3VwLCBpLCAmcGQpOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9PSyAmJiAocGQtPmFjY2VzcyAmIGFjY2Vzc19sZXZlbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBudW1iZXIgb2YgZmllbGRzIGlmIHdyaXRlIGFjY2Vzcy4gQ291bnQgb25seSBwcm9wZXJ0aWVzIGZvciByZWFkIGFjY2VzcyAqLworICAgICAgICAgICAgaWYgKChhY2Nlc3NfbGV2ZWwgJiBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfVykgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCVUdfT04oIXBkLT50eXBlKTsKKyAgICAgICAgICAgICAgICBuZiArPSBfYXBpX2NsaV9nZXRfbnVtX2ZpZWxkc19pbl90eXBlKHBkLT50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK25mOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICpuZmllbGRzID0gbmY7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoKKyAqIENvbW1hbmQgaGFuZGxlcnMKKyAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9vYmplY3RzX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBpbnQgcmM7CisgICAgYmNtb2x0X29ial9pZCBvOworICAgIGNvbnN0IGNoYXIgKm5hbWUsICpkZXNjcjsKKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiU3lzdGVtIE9iamVjdCBUeXBlczpcbiIpOworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIklkICAgTmFtZSAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblxuIik7CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIGZvciAobyA9IDA7IG8gPCBCQ01PTFRfT0JKX0lEX19OVU1fT0Y7IG8rKykKKyAgICB7CisKKyAgICAgICAgaWYgKGN1cnJlbnRfc3lzdGVtX21vZGUgPCBCQ01PTFRfU1lTVEVNX01PREVfX05VTV9PRiAmJiAhYmNtb2x0X29iamVjdF9pc19zdXBwb3J0ZWQoY3VycmVudF9zeXN0ZW1fbW9kZSwgbykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICByYyA9IGFwaV9jbGlfb2JqZWN0X25hbWUobywgJm5hbWUsICZkZXNjcik7CisgICAgICAgIGlmICghcmMpCisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUuNGQgJS0yMnMgJXNcbiIsIG8sIG5hbWUsIGRlc2NyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfc2V0X2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIEJDTU9MVF9NU0dfVFlQRV9TRVQsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9nZXRfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfY2xpX2FwaV9jYWxsKGN1cnJlbnRfZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgQkNNT0xUX01TR19UWVBFX0dFVCwgc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2NsZWFyX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIEJDTU9MVF9NU0dfVFlQRV9DTEVBUiwgc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3N0YXRfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfY2xpX2FwaV9jYWxsKGN1cnJlbnRfZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIEJDTU9MVF9NU0dfVFlQRV9HRVQsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9vcGVyX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfTVNHX1RZUEVfU0VULCBzZXNzaW9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfc2VuZF9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9jbGlfYXBpX2NhbGwoY3VycmVudF9kZXZpY2UsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9NU0dfVFlQRV9TRVQsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9zdGF0X2NmZ19zZXRfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfY2xpX2FwaV9jYWxsKGN1cnJlbnRfZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCBCQ01PTFRfTVNHX1RZUEVfU0VULCBzZXNzaW9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfc3RhdF9jZmdfZ2V0X2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgQkNNT0xUX01TR19UWVBFX0dFVCwgc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2F1dG9fY2ZnX3NldF9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9jbGlfYXBpX2NhbGwoY3VycmVudF9kZXZpY2UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIEJDTU9MVF9NU0dfVFlQRV9TRVQsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9hdXRvX2NmZ19nZXRfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfY2xpX2FwaV9jYWxsKGN1cnJlbnRfZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCBCQ01PTFRfTVNHX1RZUEVfR0VULCBzZXNzaW9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfYXV0b19jZmdfZ2V0X211bHRpX2hhbmRsZXIoCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9jbGlfYXBpX2NhbGwoY3VycmVudF9kZXZpY2UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJLCBzZXNzaW9uKTsKK30KKworLyoKKyAqIEluaXQtdGltZSBoZWxwZXJzCisgKi8KKworLyogbWFwIHRvIENMSSB0eXBlICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaV9jbGlfbWFwX3R5cGUoY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLCBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqYXJyYXlfdGQsIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm0pCit7CisgICAgYXBpY2xpX3Bhcm1fZGF0YSAqcGFybV9kYXRhID0gY21kX3Bhcm0tPnVzZXJfZGF0YTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBNYXAgdHlwZSAqLworICAgIHN3aXRjaCh0ZC0+YmFzZV90eXBlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfU05VTToKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9OVU1CRVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX1VOVU1CRVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNX0hFWDoKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9IRVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9CT09MOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0VOVU07CisgICAgICAgIGNtZF9wYXJtLT5lbnVtX3RhYmxlID0gYm9vbF9lbnVtOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRkxPQVQ6CisgICAgICAgIGNtZF9wYXJtLT50eXBlID0gdGQtPnNpemUgPT0gc2l6ZW9mKGRvdWJsZSkgPyBCQ01DTElfUEFSTV9ET1VCTEUgOiBCQ01DTElfUEFSTV9GTE9BVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORzoKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9TVFJJTkc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9JUFY0OgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0lQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfTUFDOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX01BQzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU06CisgICAgICAgIGNtZF9wYXJtLT50eXBlID0gQkNNQ0xJX1BBUk1fRU5VTTsKKyAgICAgICAgY21kX3Bhcm0tPmVudW1fdGFibGUgPSB0ZC0+eC5lOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTV9NQVNLOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0VOVU1fTUFTSzsKKyAgICAgICAgY21kX3Bhcm0tPmVudW1fdGFibGUgPSB0ZC0+eC5lOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBiY21jbGlfcHJpbnQoY3VycmVudF9zZXNzaW9uLCAiKioqIGNhbid0IG1hcCB0eXBlICVzICglZClcbiIsIHRkLT5uYW1lLCAoaW50KXRkLT5iYXNlX3R5cGUpOworICAgICAgICByYyA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogTWFwIHVpbnQ4X3QgYXJyYXkgdG8gYnVmZmVyIGlmIGl0IGlzIGluZGVwZW5kZW50IChub3Qgc3RydWN0dXJlIGZpZWxkKSAqLworICAgIGlmIChhcnJheV90ZCAmJgorICAgICAgICB0ZC0+c2l6ZSA9PSAxICYmCisgICAgICAgICh0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTSB8fCB0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgpICYmCisgICAgICAgIChwYXJtX2RhdGEtPmFycmF5X2ZkID09IHBhcm1fZGF0YS0+ZmllbGQgfHwgIXBhcm1fZGF0YS0+ZmllbGQpKQorICAgIHsKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9CVUZGRVI7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGFuZCBjb3B5IHRvIHRvIHBhcm0gKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpX2NsaV9jb3B5X3Bhcm1fbmFtZShiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRlc2NyKQoreworICAgIHBhcm0tPm5hbWUgPSBiY21vc19hbGxvYyhzdHJsZW4obmFtZSkgKyAxKTsKKyAgICBwYXJtLT5kZXNjcmlwdGlvbiA9IGJjbW9zX2FsbG9jKHN0cmxlbihkZXNjcikgKyAxKTsKKyAgICBpZiAoKHBhcm0tPm5hbWUgPT0gTlVMTCkgfHwgKHBhcm0tPmRlc2NyaXB0aW9uID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgLyogU3VjY2Vzc2Z1bCBhbGxvY2F0aW9uIGlmIGFueSB3aWxsIGJlIHJlbGVhc2VkIGJ5IGNvbW1vbiBjbGVhbnVwCisgICAgICAgICAqIGFsb25nIHdpdGggdGhlIHJlc3Qgb2YgZHluYW1pYyBwYXJhbWV0ZXIgZmllbGRzICovCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBzdHJjcHkoQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChwYXJtLT5uYW1lLCB2b2lkICopLCBuYW1lKTsKKyAgICBzdHJjcHkoQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChwYXJtLT5kZXNjcmlwdGlvbiwgdm9pZCAqKSwgZGVzY3IpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBwb3B1bGF0ZSBzaW5nbGUgcGFyYW1ldGVyICovCitzdGF0aWMgaW50IF9hcGlfY2xpX3BvcHVsYXRlX3Bhcm0xKGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwgY29uc3QgYmNtY2xpX2ZpZWxkX2Rlc2NyICpmZCwgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqYXJyYXlfZmQsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgYXJyYXlfZmRfb2Zmc2V0LAorICAgIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm0sIHVpbnQzMl90IGNtZF9mbGFncywgY2hhciAqbmFtZSwgY2hhciAqaGVscCkKK3sKKyAgICBhcGljbGlfcGFybV9kYXRhICpwYXJtX2RhdGEgPSBjbWRfcGFybS0+dXNlcl9kYXRhOworICAgIGludCByYzsKKworICAgIHBhcm1fZGF0YS0+cHJvcCA9IHBkOworICAgIHBhcm1fZGF0YS0+ZmllbGQgPSBmZDsKKyAgICBwYXJtX2RhdGEtPm9mZnNldCA9IG9mZnNldDsKKyAgICBwYXJtX2RhdGEtPmFycmF5X2ZkID0gYXJyYXlfZmQ7CisgICAgcGFybV9kYXRhLT5hcnJheV9mZF9vZmZzZXQgPSBhcnJheV9mZF9vZmZzZXQ7CisKKyAgICByYyA9IF9hcGlfY2xpX2NvcHlfcGFybV9uYW1lKGNtZF9wYXJtLCBuYW1lLCBoZWxwKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIGNtZF9wYXJtLT5mbGFncyA9IGNtZF9mbGFnczsKKyAgICBpZiAodGQtPm1pbl92YWwgIT0gdGQtPm1heF92YWwgfHwgdGQtPm1pbl92YWwpCisgICAgeworICAgICAgICBjbWRfcGFybS0+ZmxhZ3MgfD0gQkNNQ0xJX1BBUk1fRkxBR19SQU5HRTsKKyAgICAgICAgY21kX3Bhcm0tPmxvd192YWwgPSB0ZC0+bWluX3ZhbDsKKyAgICAgICAgY21kX3Bhcm0tPmhpX3ZhbCA9IHRkLT5tYXhfdmFsOworICAgIH0KKyAgICByYyA9IF9hcGlfY2xpX21hcF90eXBlKHRkLCBhcnJheV9mZCA/IGFycmF5X2ZkLT50eXBlIDogTlVMTCwgY21kX3Bhcm0pOworICAgIGlmIChyYyA8IDApCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogQXJyYXlzIHJlcXVpcmUgbW9yZSB3b3JrLgorICAgICAqIC0gQ2FsY3VsYXRlIHNpemUuIEtub3duIGZvciBmaXhlZCBhcnJheXMsIGhhcmQtY29kZWQgbWF4IGZvciBkeW5hbWljCisgICAgICogLSBBbGxvY2F0ZSBlaXRoZXIgYnVmZmVyIG9yIGFycmF5IG9mIHZhbHVlcyBiYXNlZCBvbiBDTEkgcGFyYW1ldGVyIHR5cGUKKyAgICAgKiAtIENhbGN1bGF0ZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGFycmF5IGVudHJ5CisgICAgICovCisgICAgaWYgKGFycmF5X2ZkKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgYXJyYXlfc2l6ZTsKKworICAgICAgICBpZiAoYXJyYXlfZmQtPnR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCkKKyAgICAgICAgeworICAgICAgICAgICAgYXJyYXlfc2l6ZSA9IGFycmF5X2ZkLT50eXBlLT54LmFycl9maXhlZC5zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXJyYXlfc2l6ZSA9IGFycmF5X2ZkLT50eXBlLT54LmFycl9keW4ubWF4X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhcnJheV9zaXplKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfcHJpbnQoY3VycmVudF9zZXNzaW9uLCAiKioqIEVycm9yIGluICVzIGFycmF5IGRlc2NyaXB0b3IuIFNpemUgaXMgbm90IHNldC5cbiIsIGFycmF5X2ZkLT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICB9CisgICAgICAgIGlmIChjbWRfcGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9CVUZGRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gYmNtb2x0X2J1Zl9hbGxvYygmY21kX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgYXJyYXlfc2l6ZSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNtZF9wYXJtLT52YWx1ZXMgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9wYXJtX3ZhbHVlKSAqIGFycmF5X3NpemUpOworICAgICAgICAgICAgaWYgKCFjbWRfcGFybS0+dmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY21kX3Bhcm0tPm1heF9hcnJheV9zaXplID0gYXJyYXlfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCisKKy8qIHBvcHVsYXRlIG5hbWUgYnVmIGFuZCBoZWxwIGJ1ZiAqLworc3RhdGljIHZvaWQgX2FwaV9jbGlfcG9wdWxhdGVfbmFtZV9oZWxwKGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkLCBjaGFyICpuYW1lX2J1ZjAsIGNoYXIgKmhlbHBfYnVmMCwKKyAgICBjaGFyICpuYW1lX2J1ZiwgY2hhciAqaGVscF9idWYpCit7CisgICAgbmFtZV9idWZbMF0gPSAwOworICAgIGhlbHBfYnVmWzBdID0gMDsKKyAgICBiY21jbGlfc3RybmNweShuYW1lX2J1ZiwgbmFtZV9idWYwLCBBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEgpOworICAgIGlmIChzdHJsZW4obmFtZV9idWYpKQorICAgICAgICBiY21jbGlfc3RybmNhdChuYW1lX2J1ZiwgIi4iLCBBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEgpOworICAgIGJjbWNsaV9zdHJuY2F0KG5hbWVfYnVmLCBmbGQtPmNsaV9uYW1lID8gZmxkLT5jbGlfbmFtZSA6IGZsZC0+bmFtZSwgQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIKTsKKyAgICBiY21jbGlfc3RybmNweShoZWxwX2J1ZiwgaGVscF9idWYwLCBBUElDTElfTUFYX1BBUk1fSEVMUF9MRU5HVEgpOworICAgIGJjbWNsaV9zdHJuY2F0KGhlbHBfYnVmLCAiIC0gIiwgQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIKTsKKyAgICBiY21jbGlfc3RybmNhdChoZWxwX2J1ZiwgZmxkLT5kZXNjciA/IGZsZC0+ZGVzY3IgOiBmbGQtPm5hbWUsIEFQSUNMSV9NQVhfUEFSTV9IRUxQX0xFTkdUSCk7Cit9CisKKy8qIEFsbG9jYXRlIENMSSBwYXJhbWV0ZXIgYXJyYXkuIFNldCB1cCBwYXJtLT5kYXRhICovCitzdGF0aWMgYmNtY2xpX2NtZF9wYXJtICpfYXBpX2NsaV9wYXJtX2FsbG9jKGludCBucGFybXMpCit7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm1zOworICAgIGFwaWNsaV9wYXJtX2RhdGEgKnBhcm1fZGF0YTsKKyAgICBpbnQgaTsKKworICAgIC8qIEFsbG9jYXRlIHBhcmFtZXRlciB0YWJsZSBhbmQgcG9wdWxhdGUgaXQgKi8KKyAgICBzaXplID0gKHNpemVvZihiY21jbGlfY21kX3Bhcm0pICsgc2l6ZW9mKGFwaWNsaV9wYXJtX2RhdGEpKSAqIChucGFybXMgKyAxKTsKKyAgICBwYXJtcyA9IGJjbW9zX2NhbGxvYyhzaXplKTsKKyAgICBpZiAoIXBhcm1zKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIEFzc29jaWF0ZSBwYXJhbWV0ZXJfZGF0YSBzdHJ1Y3RzIHdpdGggcGFyYW1ldGVycyAqLworICAgIHBhcm1fZGF0YSA9IChhcGljbGlfcGFybV9kYXRhICopKHBhcm1zICsgbnBhcm1zICsgMSk7CisgICAgZm9yIChpID0gMDsgaSA8IG5wYXJtczsgaSsrKQorICAgIHsKKyAgICAgICAgcGFybXNbaV0udXNlcl9kYXRhID0gJnBhcm1fZGF0YVtpXTsKKyAgICB9CisgICAgcmV0dXJuIHBhcm1zOworfQorCisvKiBjbG9uZSBlbnVtIHRhYmxlICovCitzdGF0aWMgYmNtY2xpX2VudW1fdmFsICpfYXBpX2NsaV9jbG9uZV9lbnVtX3RhYmxlKGJjbWNsaV9jbWRfcGFybSAqcGFybSkKK3sKKyAgICBiY21jbGlfZW51bV92YWwgKm9yZ190YWJsZSA9IHBhcm0tPmVudW1fdGFibGU7CisgICAgYmNtY2xpX2VudW1fdmFsICp2YWwgPSBvcmdfdGFibGU7CisgICAgYmNtY2xpX2VudW1fdmFsICpjbG9uZV90YWJsZSA9IG9yZ190YWJsZTsKKyAgICBpbnQgaSwgbjsKKworICAgIEJVR19PTihwYXJtLT50eXBlICE9IEJDTUNMSV9QQVJNX0VOVU0pOworICAgIHdoaWxlICh2YWwgJiYgdmFsLT5uYW1lKQorICAgIHsKKyAgICAgICAgKyt2YWw7CisgICAgfQorICAgIG4gPSB2YWwgLSBvcmdfdGFibGU7CisKKyAgICBjbG9uZV90YWJsZSA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYmNtY2xpX2VudW1fdmFsKSAqIChuICsgMSkpOworICAgIGlmICghY2xvbmVfdGFibGUpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICAgIGNsb25lX3RhYmxlW2ldLm5hbWUgPSBvcmdfdGFibGVbaV0ubmFtZTsKKyAgICAgICAgY2xvbmVfdGFibGVbaV0udmFsID0gb3JnX3RhYmxlW2ldLnZhbDsKKyAgICB9CisgICAgcmV0dXJuIGNsb25lX3RhYmxlOworfQorCisKKy8qIHBvcHVsYXRlIENMSSBwYXJhbWV0ZXIocykgZnJvbSBhIHNpbmdsZSBwcm9wZXJ0eS4gQ2FuIGJlIG11bHRpcGxlIHBhcmFtZXRlcnMKKyAqIGlmIHByb3BlcnR5IGNvbnRhaW5zIG11bHRpcGxlIGZpZWxkcy4KKyAqIFJldHVybnMgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcG9wdWxhdGVkID49IDAgb3IgZXJyb3IgPCAwCisgKi8KK3N0YXRpYyBpbnQgX2FwaV9jbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQsIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmQsCisgICAgY29uc3QgYmNtY2xpX2ZpZWxkX2Rlc2NyICphcnJheV9mZCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBhcnJheV9mZF9vZmZzZXQsIGJjbWNsaV9jbWRfcGFybSAqcGFybXMsCisgICAgYmNtb2x0X3Byb3BfYWNjZXNzX2lkIGFjY2Vzc19sZXZlbCwgdWludDMyX3QgY21kX2ZsYWdzLCBjaGFyICpuYW1lX2J1ZjAsIGNoYXIgKmhlbHBfYnVmMCkKK3sKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQgPSBmZCA/IGZkLT50eXBlIDogcGQtPnR5cGU7CisgICAgdWludDMyX3QgbmYgPSAwOworICAgIGNoYXIgbmFtZV9idWZbQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIXTsKKyAgICBjaGFyIGhlbHBfYnVmW0FQSUNMSV9NQVhfUEFSTV9IRUxQX0xFTkdUSF07CisgICAgaW50IHJjID0gMDsKKworICAgIC8qIEF0IHRvcCBsZXZlbCB0YWtlIG5hbWUgZnJvbSBwcm9wZXJ0eSAqLworICAgIGlmICh0ZCA9PSBwZC0+dHlwZSkKKyAgICB7CisgICAgICAgIC8qIEluIGNhc2UgdGhlcmUncyBhIGdsb2JhbCBwcmVmaXggKi8KKyAgICAgICAgY2hhciAqdG9wX25hbWVfYnVmID0gbmFtZV9idWYwOworICAgICAgICB1aW50MzJfdCB0b3BfbmFtZV9idWZfbGVuID0gQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIOworICAgICAgICB1aW50MzJfdCBwcmVmaXhfbGVuID0gc3RybGVuKG5hbWVfYnVmMCk7CisgICAgICAgIGlmIChwcmVmaXhfbGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdG9wX25hbWVfYnVmICs9IHByZWZpeF9sZW47CisgICAgICAgICAgICB0b3BfbmFtZV9idWZfbGVuIC09IHByZWZpeF9sZW47CisgICAgICAgIH0KKworICAgICAgICBiY21jbGlfc3RybmNweSh0b3BfbmFtZV9idWYsIHBkLT5jbGlfbmFtZSA/IHBkLT5jbGlfbmFtZSA6IHBkLT5uYW1lLCB0b3BfbmFtZV9idWZfbGVuKTsKKyAgICAgICAgYmNtY2xpX3N0cm5jcHkoaGVscF9idWYwLCBwZC0+ZGVzY3IgPyBwZC0+ZGVzY3IgOiBwZC0+bmFtZSwgQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIKTsKKyAgICB9CisKKyAgICAvKiBGb3IgcmVhZCBhY2Nlc3Mgd2Ugb25seSBtYXJrIHdoZXRoZXIgcmVhZCBwcm9wZXJ0eSBvciBub3QuIEl0IGlzIG5vdCBmaWVsZC1ieS1maWVsZCBvcGVyYXRpb24gKi8KKyAgICBpZiAoYWNjZXNzX2xldmVsID09IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SKQorICAgIHsKKyAgICAgICAgdGQgPSAmYm9vbF90eXBlX2Rlc2NyOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgYXJyYXlzIHdlIHNob3VsZAorICAgICAqIC0gY2hlY2sgdGhhdCB0aGVyZSBpcyBubyBhcnJheSBpbiBhcnJheS4gSXQgaXMgbm90IHN1cHBvcnRlZAorICAgICAqIC0gc3RvcmUgYXJyYXkgdHlwZSBkZXNjcmlwdG9yIEZGVSBhbmQgcmVwbGFjZSB0aGUgImN1cnJlbnQiIHR5cGUgZGVzY3JpcHRvciB3aXRoIGVsZW1lbnQgdHlwZQorICAgICAqIC0gcmVzZXQgb2Zmc2V0IGJlY2F1c2UgZm9yIGFycmF5IGZpZWxkcyBpdCBzaG91bGQgYmUgY2FsY3VsYXRlZCBmcm9tIGFycmF5IGJhc2UgcmF0aGVyIHRoYW4gcHJvcGVydHkKKyAgICAgKi8KKyAgICBpZiAodGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4gfHwgdGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCkKKyAgICB7CisgICAgICAgIGlmIChhcnJheV9mZCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KGN1cnJlbnRfc2Vzc2lvbiwgIioqKiAlcyBpbiAlczogYXJyYXlzLWluLWFycmF5cyBhcmUgbm90IHN1cHBvcnRlZFxuIiwgcGQtPm5hbWUsIGFycmF5X2ZkLT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgLyogc3RvcmUgYXJyYXkgdHlwZSBhbmQgZmV0Y2ggZWxlbWVudCB0eXBlICovCisgICAgICAgIGFycmF5X2ZkID0gZmQgPyBmZCA6IChjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKilwZDsKKyAgICAgICAgaWYgKHRkLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOKQorICAgICAgICB7CisgICAgICAgICAgICB0ZCA9IHRkLT54LmFycl9keW4uZWxlbV90eXBlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGQgPSB0ZC0+eC5hcnJfZml4ZWQuZWxlbV90eXBlOworICAgICAgICB9CisgICAgICAgIGFycmF5X2ZkX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgICBpZiAodGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGY7CisgICAgICAgIGlmICghdGQtPngucy5udW1fZmllbGRzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEJVR19PTighdGQtPngucy5maWVsZHMpOworICAgICAgICBmb3IgKGYgPSAwOyBmIDwgdGQtPngucy5udW1fZmllbGRzOyBmKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkID0gJnRkLT54LnMuZmllbGRzW2ZdOworICAgICAgICAgICAgX2FwaV9jbGlfcG9wdWxhdGVfbmFtZV9oZWxwKGZsZCwgbmFtZV9idWYwLCBoZWxwX2J1ZjAsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgICAgICByYyA9IF9hcGlfY2xpX3BvcHVsYXRlX3Bhcm1zX2Zyb21fcHJvcGVydHkocGQsIGZsZCwgYXJyYXlfZmQsIG9mZnNldCtmbGQtPm9mZnNldCwKKyAgICAgICAgICAgICAgICBhcnJheV9mZF9vZmZzZXQsICZwYXJtc1tuZl0sIGFjY2Vzc19sZXZlbCwgY21kX2ZsYWdzLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgaWYgKHJjID4gMCkKKyAgICAgICAgICAgICAgICBuZiArPSAgcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OKQorICAgIHsKKyAgICAgICAgLyogVW5pb24gKi8KKyAgICAgICAgdWludDE2X3QgZjsKKyAgICAgICAgY29uc3QgYmNtY2xpX2ZpZWxkX2Rlc2NyICpmbGQ7CisgICAgICAgIGJjbWNsaV9jbWRfcGFybSAqc2VsX3Bhcm07CisgICAgICAgIGFwaWNsaV9wYXJtX2RhdGEgKnNlbF9kYXRhOworICAgICAgICBiY21jbGlfZW51bV92YWwgKmU7CisKKyAgICAgICAgaWYgKCF0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEJVR19PTighdGQtPngudS5jb21tb25fZmllbGRzKTsKKworICAgICAgICAvKiBQb3B1bGF0ZSBwYXJhbWV0ZXJzIHByZWNlZGluZyB0aGUgdW5pb24gc2VsZWN0b3IgKi8KKyAgICAgICAgZm9yIChmID0gMDsgZiA8IHRkLT54LnUuY2xhc3NpZmllcl9pZHg7IGYrKykKKyAgICAgICAgeworICAgICAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgICAgIF9hcGlfY2xpX3BvcHVsYXRlX25hbWVfaGVscChmbGQsIG5hbWVfYnVmMCwgaGVscF9idWYwLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgcmMgPSAgX2FwaV9jbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShwZCwgZmxkLCBhcnJheV9mZCwKKyAgICAgICAgICAgICAgICBvZmZzZXQrZmxkLT5vZmZzZXQsIGFycmF5X2ZkX29mZnNldCwgJnBhcm1zW25mXSwgYWNjZXNzX2xldmVsLCBjbWRfZmxhZ3MsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgICAgICBpZiAocmMgPiAwKQorICAgICAgICAgICAgICAgIG5mICs9IHJjOworICAgICAgICB9CisKKyAgICAgICAgLyogTm93IHBvcHVsYXRlIHBhcmFtZXRlciBmb3Igc2VsZWN0b3IgKi8KKyAgICAgICAgc2VsX3Bhcm0gPSAmcGFybXNbbmZdOworICAgICAgICBmbGQgPSAmdGQtPngudS5jb21tb25fZmllbGRzW2ZdOworICAgICAgICBfYXBpX2NsaV9wb3B1bGF0ZV9uYW1lX2hlbHAoZmxkLCBuYW1lX2J1ZjAsIGhlbHBfYnVmMCwgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgcmMgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtc19mcm9tX3Byb3BlcnR5KHBkLCBmbGQsIGFycmF5X2ZkLAorICAgICAgICAgICAgb2Zmc2V0K2ZsZC0+b2Zmc2V0LCBhcnJheV9mZF9vZmZzZXQsIHNlbF9wYXJtLCBhY2Nlc3NfbGV2ZWwsIGNtZF9mbGFncywgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgaWYgKHJjID4gMCkKKyAgICAgICAgICAgIG5mICs9IHJjOworICAgICAgICAvKiBDbG9uZSBlbnVtIHRhYmxlIGluIG9yZGVyIHRvIGFsbG93IG1vZGlmeWluZyBpdCAqLworICAgICAgICBpZiAocmMgPj0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgc2VsX3Bhcm0tPmVudW1fdGFibGUgPSBfYXBpX2NsaV9jbG9uZV9lbnVtX3RhYmxlKHNlbF9wYXJtKTsKKyAgICAgICAgICAgIGlmICghc2VsX3Bhcm0tPmVudW1fdGFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogTm93IHNldC11cCBzZWxlY3RvciAqLworICAgICAgICBzZWxfcGFybS0+ZmxhZ3MgfD0gQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUjsKKyAgICAgICAgc2VsX2RhdGEgPSBzZWxfcGFybS0+dXNlcl9kYXRhOworICAgICAgICBlID0gc2VsX3Bhcm0tPmVudW1fdGFibGU7CisgICAgICAgIHdoaWxlIChlICYmIGUtPm5hbWUgJiYgcmMgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZmxkID0gJnRkLT54LnUudW5pb25fZmllbGRzW2UgLSBzZWxfcGFybS0+ZW51bV90YWJsZV07CisgICAgICAgICAgICBpZiAoZmxkLT50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBucCA9IF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX3R5cGUoZmxkLT50eXBlKTsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgIGUtPnBhcm1zID0gX2FwaV9jbGlfcGFybV9hbGxvYyhucCk7CisgICAgICAgICAgICAgICAgaWYgKCFlLT5wYXJtcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3Bhcm1fZGF0YSAqZGF0YSA9IGUtPnBhcm1zW2ldLnVzZXJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS0+Z3JvdXAgPSBzZWxfZGF0YS0+Z3JvdXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIENvbGxhcHNlIHN1YnN0cnVjdHVyZSBuYW1lICovCisgICAgICAgICAgICAgICAgaWYgKGZsZC0+dHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNUIHx8CisgICAgICAgICAgICAgICAgICAgIGZsZC0+dHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNweShuYW1lX2J1ZiwgbmFtZV9idWYwLCBzaXplb2YobmFtZV9idWYpKTsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoaGVscF9idWYsIGhlbHBfYnVmMCwgc2l6ZW9mKGhlbHBfYnVmKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9hcGlfY2xpX3BvcHVsYXRlX25hbWVfaGVscChmbGQsIG5hbWVfYnVmMCwgaGVscF9idWYwLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByYyA9IF9hcGlfY2xpX3BvcHVsYXRlX3Bhcm1zX2Zyb21fcHJvcGVydHkocGQsIGZsZCwgYXJyYXlfZmQsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCtmbGQtPm9mZnNldCwgYXJyYXlfZmRfb2Zmc2V0LCBlLT5wYXJtcywgYWNjZXNzX2xldmVsLCBjbWRfZmxhZ3MsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2U7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5hbGx5IHBvcHVsYXRlIHBhcmFtZXRlcnMgZm9sbG93aW5nIHRoZSBzZWxlY3RvciBwYXJhbWV0ZXIgKi8KKyAgICAgICAgZm9yIChmID0gdGQtPngudS5jbGFzc2lmaWVyX2lkeCArIDE7IGYgPCB0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzICYmIHJjID49IDA7IGYrKykKKyAgICAgICAgeworICAgICAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgICAgIF9hcGlfY2xpX3BvcHVsYXRlX25hbWVfaGVscChmbGQsIG5hbWVfYnVmMCwgaGVscF9idWYwLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgcmMgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtc19mcm9tX3Byb3BlcnR5KHBkLCBmbGQsIGFycmF5X2ZkLAorICAgICAgICAgICAgICAgIG9mZnNldCtmbGQtPm9mZnNldCwgYXJyYXlfZmRfb2Zmc2V0LCAmcGFybXNbbmZdLCBhY2Nlc3NfbGV2ZWwsIGNtZF9mbGFncywgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICAgICAgbmYgKz0gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRmluYWxseSEgU2ltcGxlIHR5cGUgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIENMSSBwYXJhbWV0ZXIgKi8KKyAgICAgICAgbmYgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtMShwZCwgZmQsIHRkLCBhcnJheV9mZCwgb2Zmc2V0LCBhcnJheV9mZF9vZmZzZXQsCisgICAgICAgICAgICAmcGFybXNbMF0sIGNtZF9mbGFncywgbmFtZV9idWYwLCBoZWxwX2J1ZjApOworICAgIH0KKyAgICByZXR1cm4gKHJjID49IDApID8gbmYgOiByYzsKK30KKworLyogcG9wdWxhdGUgQ0xJIHBhcmFtZXRlciB0YWJsZSAqLworc3RhdGljIGludCBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtcygKKyAgICBiY21vbHRfb2JqX2lkIG8sCisgICAgYmNtb2x0X21ndF9ncm91cCBncm91cCwKKyAgICB1aW50MTZfdCBzdWJncm91cCwKKyAgICBiY21vbHRfcHJvcF9hY2Nlc3NfaWQgYWNjZXNzX2xldmVsLAorICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybXMsCisgICAgdWludDMyX3QgY21kX2ZsYWdzLAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICBpbnQgbmYgPSAwOworICAgIGludCBpOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGZvciAoaSA9IDA7IHJjICE9IEJDTV9FUlJfUkFOR0U7IGkrKykKKyAgICB7CisgICAgICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKyAgICAgICAgY2hhciBuYW1lX2J1ZltBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEhdID0gIiI7CisgICAgICAgIGNoYXIgaGVscF9idWZbQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIXSA9ICIiOworCisgICAgICAgIHN0cm5jcHkobmFtZV9idWYsIHByZWZpeCwgQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RILTEpOworICAgICAgICBuYW1lX2J1ZltBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEgtMV0gPSAwOworCisgICAgICAgIHJjID0gYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobywgZ3JvdXAsIHN1Ymdyb3VwLCBpLCAmcGQpOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9PSyAmJiAocGQtPmFjY2VzcyAmIGFjY2Vzc19sZXZlbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gX2FwaV9jbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShwZCwgTlVMTCwgTlVMTCwgMCwgMCwgJnBhcm1zW25mXSwKKyAgICAgICAgICAgICAgICBhY2Nlc3NfbGV2ZWwsIGNtZF9mbGFncywgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICAgICAgbmYgKz0gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5mOworfQorCisKKy8qIGNvbXBhY3Qgc2VsZWN0b3IgdGFibGUuIHNxdWVlemUgb3V0IHZhbHVlcyB0aGF0IGRvbid0IGhhdmUgcGFyYW1ldGVyIHRhYmxlIGF0dGFjaGVkICovCitzdGF0aWMgdm9pZCBfYXBpX2NsaV9jb21wYWN0X3NlbGVjdG9yKGJjbWNsaV9lbnVtX3ZhbCAqc2VsZWN0b3IsIGludCBzaXplKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICghc2VsZWN0b3JbaV0ucGFybXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGogPSBpICsgMTsgaiA8IHNpemUgJiYgIXNlbGVjdG9yW2pdLnBhcm1zOyBqICsrKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGlmIChqIDwgc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnNlbGVjdG9yW2ldLCAmc2VsZWN0b3Jbal0sIHNpemVvZihiY21jbGlfZW51bV92YWwpKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnNlbGVjdG9yW2pdLCAwLCBzaXplb2YoYmNtY2xpX2VudW1fdmFsKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZzZWxlY3RvcltpXSwgMCwgc2l6ZW9mKGJjbWNsaV9lbnVtX3ZhbCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKiBGcmVlIENMSSBwYXJhbWV0ZXJzLiBib3RoIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGFyZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgKi8KK3N0YXRpYyB2b2lkIF9hcGlfY2xpX2ZyZWVfcGFybXMoYmNtY2xpX2NtZF9wYXJtICpwYXJtcykKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKnAgPSBwYXJtczsKKworICAgIHdoaWxlIChwLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKChwLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1IpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZW1vdmUgc2VsZWN0b3IgdGFibGUgKi8KKyAgICAgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqc2VsID0gcC0+ZW51bV90YWJsZTsKKyAgICAgICAgICAgIGlmIChzZWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX2VudW1fdmFsICplID0gc2VsOworICAgICAgICAgICAgICAgIHdoaWxlKGUtPm5hbWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZS0+cGFybXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcGlfY2xpX2ZyZWVfcGFybXMoZS0+cGFybXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShzZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwLT5kZXNjcmlwdGlvbikKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChwLT5kZXNjcmlwdGlvbiwgdm9pZCAqKSk7CisgICAgICAgIGlmIChwLT5uYW1lKQorICAgICAgICAgICAgYmNtb3NfZnJlZShBUElDTElfQ0FTVF9ESVNDQVJEX0NPTlNUKHAtPm5hbWUsIHZvaWQgKikpOworICAgICAgICBpZiAocC0+bWF4X2FycmF5X3NpemUgJiYgcC0+dmFsdWVzKQorICAgICAgICAgICAgYmNtb3NfZnJlZShwLT52YWx1ZXMpOworICAgICAgICBpZiAocC0+dmFsdWUuYnVmZmVyLnN0YXJ0KQorICAgICAgICAgICAgYmNtb2x0X2J1Zl9mcmVlKCZwLT52YWx1ZS5idWZmZXIpOworCisgICAgICAgICsrcDsKKyAgICB9CisgICAgYmNtb3NfZnJlZShwYXJtcyk7Cit9CisKK3N0YXRpYyB1aW50OF90IF9hcGljbGlfZ2V0X251bV9jbWRfcGFybXMoYmNtb2x0X21ndF9ncm91cCBncm91cCwgYXBpX2NsaV9mbGFncyBmbGFncykKK3sKKyAgICBpZiAoZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUKQorICAgICAgICByZXR1cm4gMjsgLyogb2JqZWN0ICsgc3RhdCBJRCAqLworICAgIGVsc2UgaWYgKGdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHICYmIChmbGFncyAmIEFQSV9DTElfRkxBR1NfTVVMVEkpICE9IEFQSV9DTElfRkxBR1NfTk9ORSkKKyAgICAgICAgcmV0dXJuIDM7IC8qIG9iamVjdCArIG1heCBtc2dzICsgaW52ZXJ0IGZsYWcgKi8KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAxOyAvKiBvYmplY3QgKi8KK30KKworLyogUmVhZCBnZW5lcmF0ZWQgaW5mbyBhbmQgYWRkIENMSSBjb21tYW5kICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaV9jbGlfYWRkKGJjbWNsaV9lbnRyeSAqZGlyLCBjb25zdCBjaGFyICpjbWRfbmFtZSwgY29uc3QgY2hhciAqY21kX2Rlc2NyLAorICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIGJjbW9sdF9wcm9wX2FjY2Vzc19pZCBhY2Nlc3NfbGV2ZWwsIGJjbWNsaV9jbWRfY2IgY21kX2hhbmRsZXIsIGFwaV9jbGlfZmxhZ3MgZmxhZ3MpCit7CisgICAgYmNtY2xpX2NtZF9leHRyYV9wYXJtIGNtZF9leHRyYXMgPSB7IC5mcmVlX3Bhcm1zID0gX2FwaV9jbGlfZnJlZV9wYXJtcyB9OworICAgIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm1zOworICAgIGJjbWNsaV9lbnVtX3ZhbCAqb2JqX3NlbGVjdG9yOworICAgIGJjbW9sdF9vYmpfaWQgbzsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgY21kX2ZsYWdzID0gMDsKKyAgICB1aW50OF90IG51bV9jbWRfcGFybXMgPSBfYXBpY2xpX2dldF9udW1fY21kX3Bhcm1zKGdyb3VwLCBmbGFncyk7CisgICAgaW50IG5fb2JqOworICAgIGludCBpOworCisgICAgLyogQ29tbWFuZCBmbGFnczogcGFyYW1ldGVycyBpbiB0aGUgZm9sbG93aW5nIGdyb3VwcyBhcmUgb3B0aW9uYWwgKi8KKyAgICBpZiAoZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9DRkcgfHwgZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUIHx8IGdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcpCisgICAgICAgIGNtZF9mbGFncyA9IEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUw7CisKKyAgICAvKiBjb21tYW5kIHBhcmFtZXRlcnMgYXJlOgorICAgICAqIC0gb2JqZWN0X25hbWUgKHNlbGVjdG9yKQorICAgICAqIC0gb2JqZWN0X2tleV9maWVsZHMKKyAgICAgKiAtIG9iamVjdF9wZXJfZ3JvdXBfZmllbGRzIGZpbHRlcmVkIGJ5IGFjY2VzcworICAgICAqIFRoZXJlZm9yZSwgdGhlcmUgaXMgMSB0b3AtbGV2ZWwgZW51bSBwYXJhbWV0ZXIgKG9iamVjdCB0eXBlKSB3aXRoIHBlci12YWx1ZSBwYXJhbWV0ZXIgdGFibGVzCisgICAgICogSW4gdGhlIGNhc2Ugb2Ygb3BlcmF0aW9ucyBvciBwcm94eSBtZXNzYWdlcywgdGhlcmUgaXMgYWxzbyBhIHRvcC1sZXZlbCBlbnVtIHBhcmFtZXRlciBmb3IgdGhlIG9wZXIvcHJveHkgbmFtZQorICAgICAqLworCisgICAgLyogQWxsb2NhdGUgZW51bSB0YWJsZSBiYXNlZCBvbiBtYXggbnVtYmVyIG9mIG9iamVjdHMuIFdpbGwgYmUgY29tcGFjdGVkIGluIHRoZSBlbmQgKi8KKyAgICBjbWRfcGFybXMgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9jbWRfcGFybSkgKiAobnVtX2NtZF9wYXJtcyArIDEpKTsKKyAgICBpZiAoIWNtZF9wYXJtcykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisKKyAgICAvKiBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIGFsbCBvYmplY3QgZW50cmllcyBhcyB3ZWxsIGFzIGEgdGVybWluYXRvciBlbnRyeSAod2hpY2ggaXMgbGVmdCBOVUxMKSAqLworICAgIG9ial9zZWxlY3RvciA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYmNtY2xpX2VudW1fdmFsKSAqIChCQ01PTFRfT0JKX0lEX19OVU1fT0YgKyAxKSk7CisgICAgaWYgKCFvYmpfc2VsZWN0b3IpCisgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKworICAgIC8qIEFsbG9jYXRlIHBhcmFtZXRlciB0YWJsZSAqLworICAgIG5fb2JqID0gMDsKKyAgICBmb3IgKG8gPSAwOyBvIDwgQkNNT0xUX09CSl9JRF9fTlVNX09GOyBvKyspCisgICAgeworICAgICAgICB1aW50MzJfdCBua2V5ZmllbGRzID0gMDsKKyAgICAgICAgdWludDMyX3QgbmZpZWxkcyA9IDA7CisgICAgICAgIHVpbnQzMl90IG5maWx0ZXJmaWVsZHMgPSAwOworICAgICAgICB1aW50MzJfdCBzaXplOworICAgICAgICB1aW50MTZfdCBzOworICAgICAgICB1aW50MTZfdCBzdWJncm91cF9jb3VudCA9IGFwaV9jbGlfZ2V0X3N1Ymdyb3VwX2NvdW50KG8sIGdyb3VwKTsKKyAgICAgICAgYmNtY2xpX2VudW1fdmFsICpzdWJfc2VsZWN0b3I7CisKKyAgICAgICAgaWYgKCFiY21vbHRfb2JqZWN0X2lzX3N1cHBvcnRlZChjdXJyZW50X3N5c3RlbV9tb2RlLCBvKSAmJiBvICE9IEJDTU9MVF9PQkpfSURfREVWSUNFKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHN1Ymdyb3VwX2NvdW50ID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnZhbCA9IG87CisgICAgICAgIHJjID0gYXBpX2NsaV9vYmplY3RfbmFtZShvLCAmb2JqX3NlbGVjdG9yW25fb2JqXS5uYW1lLCBOVUxMKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogR2V0IG51bWJlciBvZiBrZXkgZmllbGRzIGFuZCBzYXZlIGl0ICovCisgICAgICAgIGlmIChncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHKQorICAgICAgICB7CisgICAgICAgICAgICBua2V5ZmllbGRzID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX2dyb3VwKG8sIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfVywgJm5rZXlmaWVsZHMpOworICAgICAgICB9CisKKyAgICAgICAgLyogQWxsb2NhdGUgc3ViZ3JvdXAgZW51bSB0YWJsZSAqLworICAgICAgICBzdWJfc2VsZWN0b3IgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9lbnVtX3ZhbCkgKiAoc3ViZ3JvdXBfY291bnQgKyAxKSk7CisgICAgICAgIGlmICghc3ViX3NlbGVjdG9yKQorICAgICAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworCisgICAgICAgIC8qIEFsbG9jYXRlIHNpbmdsZSBzdWJncm91cCBjb21tYW5kIHBhcmFtZXRlciAqLworICAgICAgICBzaXplID0gc2l6ZW9mKGJjbWNsaV9jbWRfcGFybSkgKiAyOworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zID0gYmNtb3NfY2FsbG9jKHNpemUpOworICAgICAgICBpZiAoIW9ial9zZWxlY3RvcltuX29ial0ucGFybXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoc3ViX3NlbGVjdG9yKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldHVwIHNpbmdsZSBzdWJncm91cCBjb21tYW5kIHBhcmFtZXRlciAqLworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zWzBdLnR5cGUgPSBCQ01DTElfUEFSTV9FTlVNOworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zWzBdLmZsYWdzID0gQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUjsKKyAgICAgICAgb2JqX3NlbGVjdG9yW25fb2JqXS5wYXJtc1swXS5lbnVtX3RhYmxlID0gc3ViX3NlbGVjdG9yOworICAgICAgICByYyA9IF9hcGlfY2xpX2NvcHlfcGFybV9uYW1lKCZvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3ViZ3JvdXAgKHNwZWNpZmljIG9wZXJhdGlvbiAvIHByb3h5IG1zZykiKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworCisgICAgICAgIGZvciAocyA9IDA7IHMgPCBzdWJncm91cF9jb3VudDsgKytzKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzdWJfbmFtZTsKKyAgICAgICAgICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybV9wdHI7CisKKyAgICAgICAgICAgIC8qIEdldCBuYW1lIG9mIHNwZWNpZmljIHN1Ymdyb3VwICovCisgICAgICAgICAgICByYyA9IGFwaV9jbGlfb2JqZWN0X3N1Ymdyb3VwX25hbWUobywgZ3JvdXAsIHMsICZzdWJfbmFtZSwgTlVMTCk7CisgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8qIFNldHVwIGVudHJ5IGluIHN1Ymdyb3VwIGVudW0gdGFibGUgKi8KKyAgICAgICAgICAgIHN1Yl9zZWxlY3RvcltzXS5uYW1lID0gc3ViX25hbWU7CisgICAgICAgICAgICBzdWJfc2VsZWN0b3Jbc10udmFsID0gczsKKworICAgICAgICAgICAgLyogR2V0IG51bWJlciBvZiBncm91cCBmaWVsZHMgKi8KKyAgICAgICAgICAgIHJjID0gX2FwaV9jbGlfZ2V0X251bV9maWVsZHNfaW5fZ3JvdXAobywgZ3JvdXAsIHMsIGFjY2Vzc19sZXZlbCwgJm5maWVsZHMpOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvKiBGb3IgbXVsdGktb2JqZWN0IEdFVCBtZXNzYWdlcywgcG9wdWxhdGUgdGhlIGZpbHRlciBmaWVsZHMganVzdCBsaWtlIGEgU0VUIChleGNlcHQgdGhhdCBhbGwgcmVhZC1vbmx5CisgICAgICAgICAgICAgICBmaWVsZHMgYXJlIGFsc28gc2V0dGFibGUpICovCisgICAgICAgICAgICBpZiAoKGZsYWdzICYgQVBJX0NMSV9GTEFHU19NVUxUSSkgIT0gQVBJX0NMSV9GTEFHU19OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX2FwaV9jbGlfZ2V0X251bV9maWVsZHNfaW5fZ3JvdXAobywgZ3JvdXAsIHMsIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgJm5maWx0ZXJmaWVsZHMpOworICAgICAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKChmbGFncyAmIEFQSV9DTElfRkxBR1NfSUdOT1JFX0ZJRUxEUykgIT0gQVBJX0NMSV9GTEFHU19OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5maWx0ZXJmaWVsZHMgPSAwOworICAgICAgICAgICAgICAgIG5maWVsZHMgPSAwOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qIEFsbG9jYXRlIHBhcmFtZXRlciB0YWJsZSBhbmQgcG9wdWxhdGUgaXQgKi8KKyAgICAgICAgICAgIHN1Yl9zZWxlY3RvcltzXS5wYXJtcyA9IF9hcGlfY2xpX3Bhcm1fYWxsb2MobmZpZWxkcyArIG5rZXlmaWVsZHMgKyBuZmlsdGVyZmllbGRzKTsKKyAgICAgICAgICAgIGlmICghc3ViX3NlbGVjdG9yW3NdLnBhcm1zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmtleWZpZWxkcyArIG5maWVsZHMgKyBuZmlsdGVyZmllbGRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3Bhcm1fZGF0YSAqcGFybV9kYXRhID0gc3ViX3NlbGVjdG9yW3NdLnBhcm1zW2ldLnVzZXJfZGF0YTsKKyAgICAgICAgICAgICAgICBwYXJtX2RhdGEtPmdyb3VwID0gKGkgPCBua2V5ZmllbGRzKSA/IEJDTU9MVF9NR1RfR1JPVVBfS0VZIDogZ3JvdXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhcm1fcHRyID0gc3ViX3NlbGVjdG9yW3NdLnBhcm1zOworICAgICAgICAgICAgaWYgKG5rZXlmaWVsZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtcyhvLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1csIHBhcm1fcHRyLCAwLCAiIik7CisgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworICAgICAgICAgICAgICAgIHBhcm1fcHRyICs9IHJjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5maWx0ZXJmaWVsZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtcyhvLCBncm91cCwgcywgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCBwYXJtX3B0ciwgY21kX2ZsYWdzLCAiZmlsdGVyLiIpOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICAgICAgICAgICAgICBwYXJtX3B0ciArPSByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZmllbGRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX2FwaV9jbGlfcG9wdWxhdGVfcGFybXMobywgZ3JvdXAsIHMsIGFjY2Vzc19sZXZlbCwgcGFybV9wdHIsIGNtZF9mbGFncywgIiIpOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICAgICAgICAgICAgICBwYXJtX3B0ciArPSByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXBhY3Qgc3ViX3NlbGVjdG9yIGVudW0uIFJlbW92ZXMgaG9sZXMgKHZhbHVlcyB3aXRob3V0IHBhcmFtZXRlciB0YWJsZSkgKi8KKyAgICAgICAgX2FwaV9jbGlfY29tcGFjdF9zZWxlY3RvcihzdWJfc2VsZWN0b3IsIHN1Ymdyb3VwX2NvdW50KTsKKworICAgICAgICAvKiBJZiB0aGUgZ3JvdXAgdHlwZSBkb2Vzbid0IHN1cHBvcnQgc3ViZ3JvdXBzLCByZW1vdmUgdGhlIHN1Ymdyb3VwIHBhcmFtIGVudHJ5ICovCisgICAgICAgIGlmIChncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0NGRyB8fCBncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX1NUQVQgfHwgZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRykKKyAgICAgICAgeworICAgICAgICAgICAgLyogRnJlZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgKHNpbmdsZSkgc3ViZ3JvdXAgcGFyYW0gKi8KKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zWzBdLm5hbWUsIHZvaWQgKikpOworICAgICAgICAgICAgYmNtb3NfZnJlZShBUElDTElfQ0FTVF9ESVNDQVJEX0NPTlNUKG9ial9zZWxlY3RvcltuX29ial0ucGFybXNbMF0uZGVzY3JpcHRpb24sIHZvaWQgKikpOworICAgICAgICAgICAgYmNtb3NfZnJlZShvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zKTsKKyAgICAgICAgICAgIC8qIEFzc2lnbiB0aGUgc3ViZ3JvdXAgcGFyYW1zIHRvIHRoZSByb290IG9iamVjdCBwYXJhbXMgKi8KKyAgICAgICAgICAgIG9ial9zZWxlY3RvcltuX29ial0ucGFybXMgPSBzdWJfc2VsZWN0b3JbMF0ucGFybXM7CisgICAgICAgICAgICBiY21vc19mcmVlKHN1Yl9zZWxlY3Rvcik7CisgICAgICAgIH0KKworICAgICAgICArK25fb2JqOyAvKiBudW1iZXIgb2YgY29uZmlndXJlZCBvYmplY3RzICovCisgICAgfQorCisgICAgLyogQ29tcGFjdCBvYmpfc2VsZWN0b3IgZW51bS4gUmVtb3ZlcyBob2xlcyAodmFsdWVzIHdpdGhvdXQgcGFyYW1ldGVyIHRhYmxlKSAqLworICAgIF9hcGlfY2xpX2NvbXBhY3Rfc2VsZWN0b3Iob2JqX3NlbGVjdG9yLCBCQ01PTFRfT0JKX0lEX19OVU1fT0YpOworCisgICAgLyogQWRkIGEgJ2NsZWFyIG9uIHJlYWQnIHRvIHN0YXRzIGdyb3VwICovCisgICAgaWYgKGdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfU1RBVCkKKyAgICB7CisgICAgICAgIGNtZF9wYXJtc1swXS50eXBlID0gQkNNQ0xJX1BBUk1fRU5VTTsKKyAgICAgICAgY21kX3Bhcm1zWzBdLmVudW1fdGFibGUgPSBib29sX2VudW07CisgICAgICAgIHJjID0gX2FwaV9jbGlfY29weV9wYXJtX25hbWUoJmNtZF9wYXJtc1swXSwgImNsZWFyIiwgImNsZWFyIG9uIHJlYWQiKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworICAgIH0KKworICAgIC8qIEFkZCAnbWF4IG51bWJlciBvZiBtZXNzYWdlcyB0byByZWFkJyBhbmQgJ2ludmVydCBmaWx0ZXInIHRvIGNmZyBnZXRfbXVsdGkgbXNncyAqLworICAgIGlmIChncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0NGRyAmJiAoZmxhZ3MgJiBBUElfQ0xJX0ZMQUdTX01VTFRJKSAhPSBBUElfQ0xJX0ZMQUdTX05PTkUpCisgICAgeworICAgICAgICBjbWRfcGFybXNbMF0udHlwZSA9IEJDTUNMSV9QQVJNX1VOVU1CRVI7CisgICAgICAgIHJjID0gX2FwaV9jbGlfY29weV9wYXJtX25hbWUoJmNtZF9wYXJtc1swXSwgIm1heF9tc2dzIiwgIm1heCBudW1iZXIgb2YgQVBJIEdFVCBtZXNzYWdlcyB0byByZWNlaXZlIHBlciBjYWxsIik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKworICAgICAgICBjbWRfcGFybXNbMV0udHlwZSA9IEJDTUNMSV9QQVJNX0VOVU07CisgICAgICAgIGNtZF9wYXJtc1sxXS5lbnVtX3RhYmxlID0gYm9vbF9lbnVtOworICAgICAgICByYyA9IF9hcGlfY2xpX2NvcHlfcGFybV9uYW1lKCZjbWRfcGFybXNbMV0sICJmaWx0ZXJfaW52ZXJ0IiwgImludmVydCBmaWx0ZXIgKHNlbGVjdCBvYmplY3RzIHRoYXQgZG9uJ3QgbWF0Y2gpIik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICB9CisKKyAgICAvKiBXZSBhcmUgcmVhZHkgdG8gYWRkIHRoaXMgY29tbWFuZCAqLworICAgIGNtZF9wYXJtc1tudW1fY21kX3Bhcm1zIC0gMV0udHlwZSA9IEJDTUNMSV9QQVJNX0VOVU07CisgICAgY21kX3Bhcm1zW251bV9jbWRfcGFybXMgLSAxXS5mbGFncyA9IEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1I7CisgICAgY21kX3Bhcm1zW251bV9jbWRfcGFybXMgLSAxXS5lbnVtX3RhYmxlID0gb2JqX3NlbGVjdG9yOworICAgIHJjID0gX2FwaV9jbGlfY29weV9wYXJtX25hbWUoJmNtZF9wYXJtc1tudW1fY21kX3Bhcm1zIC0gMV0sICJvYmplY3QiLCAiT2JqZWN0IFR5cGUiKTsKKyAgICBpZiAocmMpCisgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICByYyA9IGJjbWNsaV9jbWRfYWRkKGRpciwgY21kX25hbWUsIGNtZF9oYW5kbGVyLCBjbWRfZGVzY3IsCisgICAgICAgIChhY2Nlc3NfbGV2ZWwgPT0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1cpID8gQkNNQ0xJX0FDQ0VTU19BRE1JTiA6IEJDTUNMSV9BQ0NFU1NfR1VFU1QsCisgICAgICAgICZjbWRfZXh0cmFzLCBjbWRfcGFybXMpOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworICAgIHJldHVybiAwOworCitub21lbV9jbGVhbnVwOgorICAgIGlmIChvYmpfc2VsZWN0b3IpCisgICAgeworICAgICAgICBmb3IgKG8gPSAwOyBvIDwgQkNNT0xUX09CSl9JRF9fTlVNX09GOyBvKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvYmpfc2VsZWN0b3Jbb10ucGFybXMpCisgICAgICAgICAgICAgICAgX2FwaV9jbGlfZnJlZV9wYXJtcyhvYmpfc2VsZWN0b3Jbb10ucGFybXMpOworICAgICAgICB9CisgICAgICAgIGJjbW9zX2ZyZWUob2JqX3NlbGVjdG9yKTsKKyAgICB9CisgICAgYmNtb3NfZnJlZShjbWRfcGFybXMpOworICAgIHJldHVybiByYzsKK30KKworI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorCisvKiBDdXJyZW50IGRldmljZSBjaGFuZ2UgaW5kaWNhdGlvbiAqLworc3RhdGljIHZvaWQgX2FwaV9jbGlfZGV2aWNlX2NoYW5nZV9pbmQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYXBpX2NsaV9zZXRfY29tbWFuZHMoc2Vzc2lvbik7Cit9CisKKyNpZmRlZiBMSU5VWF9VU0VSX1NQQUNFCisKK3N0YXRpYyBiY21jbGlfc2Vzc2lvbiAqX2FwaWNsaV9sb2c7CitzdGF0aWMgRklMRSAqX2FwaWNsaV9sb2dfZmlsZTsKKworc3RhdGljIGludCBfYXBpY2xpX2xvZ193cml0ZV9jYihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIGlmIChfYXBpY2xpX2xvZ19maWxlID09IE5VTEwgfHwgYnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIGZ3cml0ZShidWYsIDEsIHNpemUsIF9hcGljbGlfbG9nX2ZpbGUpOworICAgIGZmbHVzaChfYXBpY2xpX2xvZ19maWxlKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogRW5hYmxlL2Rpc2FibGUgQVBJIGxvZ2dpbmcKKyAqICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImZpbGUiLCAiTG9nIGZpbGUuIFVzZSBcIi1cIiB0byBkaXNhYmxlIGxvZ2dpbmciLCBCQ01DTElfUEFSTV9TVFJJTkcsIDApKTsKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfbG9nX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBjb25zdCBjaGFyICpmbmFtZSA9IHBhcm1bMF0udmFsdWUuc3RyaW5nOworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc2Vzc2lvbl9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLndyaXRlID0gX2FwaWNsaV9sb2dfd3JpdGVfY2IsCisgICAgICAgIC5uYW1lID0gImFwaV9sb2ciCisgICAgfTsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB0aW1lX3Qgc3RhcnRfdGltZTsKKworICAgIC8qIENsb3NlIGV4aXN0aW5nIGxvZyBzZXNzaW9uIGlmIGFueSAqLworICAgIGlmIChfYXBpY2xpX2xvZykKKyAgICB7CisgICAgICAgIGJjbWNsaV9sb2dfc2V0KEJDTUNMSV9MT0dfTk9ORSwgTlVMTCk7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKF9hcGljbGlfbG9nKTsKKyAgICAgICAgZmNsb3NlKF9hcGljbGlfbG9nX2ZpbGUpOworICAgICAgICBfYXBpY2xpX2xvZyA9IE5VTEw7CisgICAgICAgIF9hcGljbGlfbG9nX2ZpbGUgPSBOVUxMOworICAgIH0KKworICAgIGlmICghc3RyY21wKGZuYW1lLCAiLSIpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworICAgIC8qIFN0YXJ0aW5nIGEgbmV3IGxvZyBzZXNzaW9uICovCisgICAgX2FwaWNsaV9sb2dfZmlsZSA9IGZvcGVuKGZuYW1lLCAiYSIpOworICAgIGlmIChfYXBpY2xpX2xvZ19maWxlID09IE5VTEwpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIkNhbid0IG9wZW4gZmlsZSAlcyBmb3IgbG9nZ2luZ1xuIiwgZm5hbWUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICByYyA9IGJjbWNsaV9zZXNzaW9uX29wZW5fdXNlcigmc2Vzc2lvbl9wYXJhbXMsICZfYXBpY2xpX2xvZyk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgZmNsb3NlKF9hcGljbGlfbG9nX2ZpbGUpOworICAgICAgICBfYXBpY2xpX2xvZ19maWxlID0gTlVMTDsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJDYW4ndCBvcGVuIGxvZyBzZXNzaW9uLiBFcnJvciAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICB0aW1lKCZzdGFydF90aW1lKTsKKyAgICBiY21jbGlfbG9nX3NldChCQ01DTElfTE9HX0NfQ09NTUVOVCwgX2FwaWNsaV9sb2cpOworICAgIGJjbWNsaV9sb2coIi8qIEFQSSBsb2dnaW5nIHNlc3Npb24gc3RhcnRlZC4gJXMgKi9cbiIsIGN0aW1lKCZzdGFydF90aW1lKSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYgLyogI2lmZGVmIExJTlVYX1VTRVJfU1BBQ0UgKi8KKworI2VuZGlmIC8qICNpZmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QgKi8KKworc3RhdGljIHZvaWQgYXBpX2NsaV9maW5kX2RlbF9jbWQoYmNtY2xpX2VudHJ5ICpkaXIsIGNvbnN0IGNoYXIgKmNtZF9uYW1lKQoreworICAgIGJjbWNsaV9lbnRyeSAqY21kOworICAgIGNtZCA9IGJjbWNsaV9jbWRfZmluZChkaXIsIGNtZF9uYW1lKTsKKyAgICBpZiAoY21kKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Rva2VuX2Rlc3Ryb3koY21kKTsKKyAgICB9Cit9CisKKy8qIFVucmVnaXN0ZXJzIGNvbW1hbmRzIGFuZCBkaXJlY3RvcmllcyAqLworc3RhdGljIHZvaWQgYXBpX2NsaV9kZWxfY29tbWFuZHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2VudHJ5ICpkaXI7CisKKyAgICBkaXIgPSBiY21jbGlfZGlyX2ZpbmQoYXBpX3BhcmVudF9kaXIsICJhcGkiKTsKKyAgICBpZiAoIWRpcikKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAic2V0Iik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAiZ2V0Iik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAibXVsdGlnZXQiKTsKKyAgICBhcGlfY2xpX2ZpbmRfZGVsX2NtZChkaXIsICJjbGVhciIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgIm1vZGlmeSIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgInN0YXQiKTsKKyAgICBhcGlfY2xpX2ZpbmRfZGVsX2NtZChkaXIsICJvcGVyIik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAic2VuZCIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgInNhc2V0Iik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAic2FnZXQiKTsKKyAgICBhcGlfY2xpX2ZpbmRfZGVsX2NtZChkaXIsICJhY3NldCIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgImFjZ2V0Iik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAib2JqZWN0cyIpOworI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgImxvZyIpOworI2VuZGlmCit9CisKKy8qIFJlZ2lzdGVycyBjb21tYW5kcyBhbmQgZGlyZWN0b3JpZXMgKi8KK3N0YXRpYyBiY21vc19lcnJubyBhcGlfY2xpX2FkZF9jb21tYW5kcyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfZW50cnkgKmFwaV9kaXI7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoKGFwaV9kaXIgPSBiY21jbGlfZGlyX2ZpbmQoYXBpX3BhcmVudF9kaXIsICJhcGkiKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFwaV9kaXIgPSBiY21jbGlfZGlyX2FkZChhcGlfcGFyZW50X2RpciwgImFwaSIsICJNYXBsZSBBUEkiLCBCQ01DTElfQUNDRVNTX0dVRVNULCBOVUxMKTsKKyAgICAgICAgaWYgKGFwaV9kaXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkNhbid0IGNyZWF0ZSBhcGkgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICB9CisgICAgfQorCisgICAgY3VycmVudF9zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmY3VycmVudF9zeXN0ZW1fbW9kZSk7CisKKyAgICAvKiBOb3cgZ2VuZXJhdGUgYW5kIGFkZCBjb21tYW5kcyAqLworICAgIHJjID0gX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJzZXQiLCAiU2V0IG9iamVjdCBjb25maWd1cmF0aW9uIiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsCisgICAgICAgIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9XLCBfYXBpY2xpX3NldF9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAiZ2V0IiwgIkdldCBvYmplY3QgY29uZmlndXJhdGlvbiIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLAorICAgICAgICBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgX2FwaWNsaV9nZXRfaGFuZGxlciwgQVBJX0NMSV9GTEFHU19OT05FKTsKKyAgICByYyA9IHJjID8gcmMgOiBfYXBpX2NsaV9hZGQoYXBpX2RpciwgImNsZWFyIiwgIkNsZWFyIG9iamVjdCBjb25maWd1cmF0aW9uIiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsCisgICAgICAgIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCBfYXBpY2xpX2NsZWFyX2hhbmRsZXIsIEFQSV9DTElfRkxBR1NfSUdOT1JFX0ZJRUxEUyk7CisgICAgcmMgPSByYyA/IHJjIDogX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJzdGF0IiwgIkdldCBzdGF0aXN0aWNzIiwgQkNNT0xUX01HVF9HUk9VUF9TVEFULCBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwKKyAgICAgICAgX2FwaWNsaV9zdGF0X2hhbmRsZXIsIEFQSV9DTElfRkxBR1NfTk9ORSk7CisgICAgcmMgPSByYyA/IHJjIDogX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJvcGVyIiwgIkluaXRpYXRlIE9wZXJhdGlvbiIsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwKKyAgICAgICAgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1csIF9hcGljbGlfb3Blcl9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAic2VuZCIsICJTZW5kIG1lc3NhZ2UgdG8gT05VIiwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwKKyAgICAgICAgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1csIF9hcGljbGlfc2VuZF9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAic2FzZXQiLCAiU2V0IHN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1csIF9hcGljbGlfc3RhdF9jZmdfc2V0X2hhbmRsZXIsIEFQSV9DTElfRkxBR1NfTk9ORSk7CisgICAgcmMgPSByYyA/IHJjIDogX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJzYWdldCIsICJHZXQgc3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24iLAorICAgICAgICBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgX2FwaWNsaV9zdGF0X2NmZ19nZXRfaGFuZGxlciwgQVBJX0NMSV9GTEFHU19JR05PUkVfRklFTERTKTsKKyAgICByYyA9IHJjID8gcmMgOiBfYXBpX2NsaV9hZGQoYXBpX2RpciwgImFjc2V0IiwgIlNldCBhdXRvbm9tb3VzIG1lc3NhZ2UgY29uZmlndXJhdGlvbiIsCisgICAgICAgIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9XLCBfYXBpY2xpX2F1dG9fY2ZnX3NldF9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAiYWNnZXQiLCAiR2V0IGF1dG9ub21vdXMgbWVzc2FnZSBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIF9hcGljbGlfYXV0b19jZmdfZ2V0X2hhbmRsZXIsIEFQSV9DTElfRkxBR1NfTk9ORSk7CisgICAgcmMgPSByYyA/IHJjIDogX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJtdWx0aWdldCIsICJHZXQgY29uZmlndXJhdGlvbiBmb3IgbXVsdGlwbGUgb2JqZWN0cyIsCisgICAgICAgIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgX2FwaWNsaV9hdXRvX2NmZ19nZXRfbXVsdGlfaGFuZGxlciwgQVBJX0NMSV9GTEFHU19NVUxUSSk7CisKKyAgICAvKiBMaXN0IGFsbCBzeXN0ZW0gb2JqZWN0cyAqLworICAgIHJjID0gcmMgPyByYyA6IGJjbWNsaV9jbWRfYWRkKGFwaV9kaXIsICJvYmplY3RzIiwgX2FwaWNsaV9vYmplY3RzX2hhbmRsZXIsCisgICAgICAgICJPYmplY3QgVHlwZXMiLCBCQ01DTElfQUNDRVNTX0dVRVNULCBOVUxMLCBOVUxMKTsKKworI2lmIGRlZmluZWQoQkNNX1NVQlNZU1RFTV9IT1NUKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisgICAgQkNNQ0xJX01BS0VfQ01EKGFwaV9kaXIsICJsb2ciLCAiTG9nIEFQSSBjYWxscyIsIF9hcGljbGlfbG9nX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImZpbGUiLCAiTG9nIGZpbGUuIFVzZSBcIi1cIiB0byBkaXNhYmxlIGxvZ2dpbmciLCBCQ01DTElfUEFSTV9TVFJJTkcsIDApKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBVcGRhdGUgQVBJIENMSSBjb21tYW5kcyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlICovCitiY21vc19lcnJubyBhcGlfY2xpX3NldF9jb21tYW5kcyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBhcGlfY2xpX2RlbF9jb21tYW5kcyhzZXNzaW9uKTsKKyAgICByYyA9IGFwaV9jbGlfYWRkX2NvbW1hbmRzKHNlc3Npb24pOworICAgIHJldHVybiByYzsKK30KKworLyogSW5pdCBBUEkgQ0xJIGNvbW1hbmRzIGZvciB0aGUgY3VycmVudCBkZXZpY2UgKi8KK2JjbW9zX2Vycm5vIGFwaV9jbGlfaW5pdChiY21jbGlfZW50cnkgKnBhcmVudF9kaXIsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgYXBpX3BhcmVudF9kaXIgPSBwYXJlbnRfZGlyOworCisgICAgcmMgPSBhcGlfY2xpX3NldF9jb21tYW5kcyhzZXNzaW9uKTsKKworI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorICAgIC8qIFN1YnNjcmliZSBmb3IgZGV2aWNlIGNoYW5nZSBpbmRpY2F0aW9uICovCisgICAgcmMgPSByYyA/IHJjIDogYmNtb2x0X2Rldl9zZWxfaW5kX3JlZ2lzdGVyKF9hcGlfY2xpX2RldmljZV9jaGFuZ2VfaW5kKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI5ZGY1NwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBNQVBMRV9DTElfQVBJX0hfCisjZGVmaW5lIE1BUExFX0NMSV9BUElfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorCisvKiBJbml0aWFsaXplIEFQSSBDTEkgKi8KK2JjbW9zX2Vycm5vIGFwaV9jbGlfaW5pdChiY21jbGlfZW50cnkgKnBhcmVudF9kaXIsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworLyogVXBkYXRlIEFQSSBDTEkgY29tbWFuZHMgZm9yIHRoZSBjdXJyZW50IGRldmljZSAqLworYmNtb3NfZXJybm8gYXBpX2NsaV9zZXRfY29tbWFuZHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTUFQTEVfQ0xJX0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfZHVtcC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NmRiMjYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9kdW1wLmMKQEAgLTAsMCArMSw5NTQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKKyNpbmNsdWRlICJiY21fYXBpX2NsaV9oZWxwZXJzLmgiCisKK3R5cGVkZWYgZW51bQoreworICAgIEFQSUNMSV9PVVRQVVRfU1RZTEVfU1RELAorICAgIEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUCit9IGFwaWNsaV9vdXRwdXRfc3R5bGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnR5cGU7CisgICAgdm9pZCAqZGF0YTsKKyAgICB1aW50OF90IGJpdDsKK30gYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbzsKKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9hcnJheSgKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsCisgICAgdm9pZCAqZGF0YSwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgYXBpY2xpX291dHB1dF9zdHlsZSBzdHlsZSwKKyAgICBjb25zdCBhcGljbGlfcHJlc2VuY2VfbWFza19pbmZvICpwcmVzZW5jZV9tYXNrLAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKKyAgICBjb25zdCBjaGFyICpzdWZmaXgpOworCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9yZWFkX3NudW0oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwgdm9pZCAqZGF0YSwgaW50NjRfdCAqbikKK3sKKyAgICBzd2l0Y2ggKHRkLT5zaXplKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgeworICAgICAgICBpbnQ4X3QgbjEgPSAqKGludDhfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDI6CisgICAgeworICAgICAgICBpbnQxNl90IG4yID0gKihpbnQxNl90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDoKKyAgICB7CisgICAgICAgIGludDMyX3QgbjQgPSAqKGludDMyX3QgKilkYXRhOworICAgICAgICAqbiA9IG40OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA4OgorICAgIHsKKyAgICAgICAgbWVtY3B5KG4sIGRhdGEsIHNpemVvZigqbikpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKiogbnVtYmVyIHNpemUgJXUgaXMgbm90IHN1cHBvcnRlZFxuIiwgdGQtPnNpemUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfcmVhZF91bnVtKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsIHZvaWQgKmRhdGEsIHVpbnQ2NF90ICpuKQoreworICAgIHN3aXRjaCAodGQtPnNpemUpCisgICAgeworICAgIGNhc2UgMToKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgbjEgPSAqKHVpbnQ4X3QgKilkYXRhOworICAgICAgICAqbiA9IG4xOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOgorICAgIHsKKyAgICAgICAgdWludDE2X3QgbjIgPSAqKHVpbnQxNl90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDoKKyAgICB7CisgICAgICAgIHVpbnQzMl90IG40ID0gKih1aW50MzJfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDg6CisgICAgeworICAgICAgICBtZW1jcHkobiwgZGF0YSwgc2l6ZW9mKCpuKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKiBudW1iZXIgc2l6ZSAldSBpcyBub3Qgc3VwcG9ydGVkXG4iLCB0ZC0+c2l6ZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfYXBpY2xpX3N0cmNhdF91cHBlcihjaGFyICpkZXN0LCB1aW50MzJfdCBkZXN0X2xlbiwgY29uc3QgY2hhciAqc3JjLCB1aW50MzJfdCBzcmNfbGVuKQoreworICAgIHVpbnQzMl90IHNyY19pZHg7CisgICAgdWludDMyX3QgZGVzdF9pZHg7CisKKyAgICBmb3IgKGRlc3RfaWR4ID0gMDsgZGVzdF9pZHggPCBkZXN0X2xlbiAtIDE7ICsrZGVzdF9pZHgpCisgICAgeworICAgICAgICBpZiAoZGVzdFtkZXN0X2lkeF0gPT0gJ1wwJykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNyY19pZHggPSAwOyBzcmNfaWR4IDwgc3JjX2xlbiAmJiBkZXN0X2lkeCA8IGRlc3RfbGVuIC0gMTsgKytzcmNfaWR4LCArK2Rlc3RfaWR4KQorICAgIHsKKyAgICAgICAgZGVzdFtkZXN0X2lkeF0gPSBzcmNbc3JjX2lkeF07CisgICAgICAgIGlmIChkZXN0W2Rlc3RfaWR4XSA+PSAnYScgJiYgZGVzdFtkZXN0X2lkeF0gPD0gJ3onKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0W2Rlc3RfaWR4XSA9ICdBJyArIChkZXN0W2Rlc3RfaWR4XSAtICdhJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZXN0W2Rlc3RfaWR4XSA9ICdcMCc7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfYXBpY2xpX2dldF9jX2VudW1faWQoY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIHN0YXRpYyBjaGFyIGZ1bGxfbmFtZV9idWZbMjU2XTsKKyAgICBmdWxsX25hbWVfYnVmWzBdID0gJ1wwJzsKKyAgICBfYXBpY2xpX3N0cmNhdF91cHBlcihmdWxsX25hbWVfYnVmLCBzaXplb2YoZnVsbF9uYW1lX2J1ZiksIHRkLT5uYW1lLCBzdHJsZW4odGQtPm5hbWUpKTsKKyAgICBfYXBpY2xpX3N0cmNhdF91cHBlcihmdWxsX25hbWVfYnVmLCBzaXplb2YoZnVsbF9uYW1lX2J1ZiksICJfIiwgMSk7CisgICAgX2FwaWNsaV9zdHJjYXRfdXBwZXIoZnVsbF9uYW1lX2J1Ziwgc2l6ZW9mKGZ1bGxfbmFtZV9idWYpLCBuYW1lLCBzdHJsZW4obmFtZSkpOworICAgIHJldHVybiBmdWxsX25hbWVfYnVmOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9kdW1wX3NpbXBsZV9kYXRhX3R5cGUoCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIHZvaWQgKmRhdGEsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBhcGljbGlfb3V0cHV0X3N0eWxlIHN0eWxlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIHN3aXRjaCAodGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NOVU06ICAgICAgIC8qIHNpZ25lZCBudW1iZXIgKi8KKyAgICB7CisgICAgICAgIGludDY0X3QgbiA9IDA7CisgICAgICAgIHJjID0gX2FwaWNsaV9yZWFkX3NudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlbGxkIiwgKGxvbmcgbG9uZyluKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU06ICAgICAgIC8qIHVuc2lnbmVkIG51bWJlciAqLworICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIHJjID0gX2FwaWNsaV9yZWFkX3VudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyluKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU1fSEVYOiAgIC8qIHVuc2lnbmVkIG51bWJlciBwcmludGVkIGluIGhleCAqLworICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIHJjID0gX2FwaWNsaV9yZWFkX3VudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKW4pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRkxPQVQ6ICAgICAgLyogZmxvYXRpbmctcG9pbnQgbnVtYmVyICovCisgICAgeworICAgICAgICBpZiAodGQtPnNpemUgPT0gc2l6ZW9mKGZsb2F0KSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlZiIsICooZmxvYXQgKilkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZC0+c2l6ZSA9PSBzaXplb2YoZG91YmxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlZiIsICooZG91YmxlICopZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKiBmbG9hdGluZy1wb2ludCBudW1iZXIgb2Ygd2lkdGggJXUgaXMgbm90IHN1cHBvcnRlZFxuIiwgdGQtPnNpemUpOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0JPT0w6CisgICAgeworICAgICAgICBjb25zdCBjaGFyICpub19zdHIgPSBzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCA/ICJCQ01PU19GQUxTRSIgOiAibm8iOworICAgICAgICBjb25zdCBjaGFyICp5ZXNfc3RyID0gc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQgPyAiQkNNT1NfVFJVRSIgOiAieWVzIjsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIHJjID0gX2FwaWNsaV9yZWFkX3VudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlcyIsIG4gPT0gMCA/IG5vX3N0ciA6IHllc19zdHIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSSU5HOiAgICAgLyogc3RyaW5nICovCisgICAgeworICAgICAgICBpZiAodGQtPnNpemUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJcIiVzXCIiLCAoY2hhciAqKWRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyICovCisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlwiJS4qc1wiIiwgdGQtPnNpemUsIChjaGFyICopZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0lQVjQ6ICAgICAgIC8qIElQdjQgYWRkcmVzcyAqLworICAgIHsKKyAgICAgICAgdWludDMyX3QgaXA7CisgICAgICAgIG1lbWNweSgmaXAsIGRhdGEsIHNpemVvZihpcCkpOworICAgICAgICBiY21jbGlfcHJpbnQoCisgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQgPyAieyAlZCwlZCwlZCwlZCB9IiA6ICIlZC4lZC4lZC4lZCIsCisgICAgICAgICAgICAoaXAgPj4gMjQpICYgMHhmZiwgKGlwID4+IDE2KSAmIDB4ZmYsIChpcCA+PiA4KSAmIDB4ZmYsIGlwICYgMHhmZik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9NQUM6ICAgICAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjOworICAgICAgICBtZW1jcHkobWFjLnU4LCBkYXRhLCBzaXplb2YobWFjLnU4KSk7CisgICAgICAgIGJjbWNsaV9wcmludCgKKyAgICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICBzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCA/CisgICAgICAgICAgICAgICAgInt7IDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4IH19IiA6CisgICAgICAgICAgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgIG1hYy51OFswXSwgbWFjLnU4WzFdLCBtYWMudThbMl0sIG1hYy51OFszXSwgbWFjLnU4WzRdLCBtYWMudThbNV0pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTTogICAgICAgLyogZW51bSAqLworICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICAgIHJjID0gX2FwaWNsaV9yZWFkX3VudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgQlVHX09OKHRkLT54LmUgPT0gTlVMTCk7CisgICAgICAgIHMgPSBiY21jbGlfZW51bV9zdHJpbmd2YWwodGQtPnguZSwgKGxvbmcpbik7CisgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgeworICAgICAgICAgICAgcyA9IF9hcGljbGlfZ2V0X2NfZW51bV9pZCh0ZCwgcyk7CisgICAgICAgIH0KKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlcyIsIHMpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTV9NQVNLOgorICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICAgIGNvbnN0IGNoYXIgKm5vbmUgPSBOVUxMOworICAgICAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlID0gdGQtPnguZTsKKyAgICAgICAgYmNtb3NfYm9vbCBmaXJzdCA9IEJDTU9TX1RSVUU7CisgICAgICAgIEJVR19PTih2YWx1ZSA9PSBOVUxMKTsKKyAgICAgICAgcmMgPSBfYXBpY2xpX3JlYWRfdW51bShzZXNzaW9uLCB0ZCwgZGF0YSwgJm4pOworICAgICAgICB3aGlsZSAodmFsdWUtPm5hbWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlLT52YWwgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub25lID0gdmFsdWUtPm5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHZhbHVlLT52YWwgJiBuKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMgPSB2YWx1ZS0+bmFtZTsKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzID0gX2FwaWNsaV9nZXRfY19lbnVtX2lkKHRkLCBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlcyVzIiwgZmlyc3QgPyAiIiA6IChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCA/ICJ8IiA6IEJDTUNMSV9FTlVNX01BU0tfREVMX1NUUiksIHMpOworICAgICAgICAgICAgICAgIGZpcnN0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgbiAtPSB2YWx1ZS0+dmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKyt2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMiLCAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpIHx8IChOVUxMID09IG5vbmUpID8gIjAiIDogbm9uZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKiogdHlwZSAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCAoaW50KXRkLT5iYXNlX3R5cGUpOworICAgICAgICByYyA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworCisvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzICovCitzdGF0aWMgaW50IF9hcGlfY2xpX2dldF9udW1fZW51bV92YWxzKGNvbnN0IGJjbWNsaV9lbnVtX3ZhbCAqdmFscykKK3sKKyAgICBjb25zdCBiY21jbGlfZW51bV92YWwgKnYgPSB2YWxzOworICAgIHdoaWxlICh2ICYmIHYtPm5hbWUpCisgICAgeworICAgICAgICArK3Y7CisgICAgfQorICAgIHJldHVybiAodiAtIHZhbHMpOworfQorCisvKiBoZWxwZXIgZnVuY3Rpb24gdG8gc2tpcCB0aGUgInUuIiBpbiBmcm9udCBvZiB1bmlvbiBmaWVsZCBuYW1lcyAqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpfYXBpY2xpX3NraXBfdW5pb25fcHJlZml4KGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYgKG5hbWVbMF0gPT0gJ3UnICYmIG5hbWVbMV0gPT0gJy4nKQorICAgIHsKKyAgICAgICAgbmFtZSArPSAyOworICAgIH0KKyAgICByZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2FwaWNsaV9pc192YWx1ZV9zZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGFwaWNsaV9wcmVzZW5jZV9tYXNrX2luZm8gKnByZXNlbmNlX21hc2spCit7CisgICAgdWludDY0X3QgcG1fdmFsdWVfbnVtID0gMDsKKyAgICBpZiAoIXByZXNlbmNlX21hc2sgfHwgIXByZXNlbmNlX21hc2stPnR5cGUpCisgICAgeworICAgICAgICAvKiBubyBwcmVzZW5jZSBtYXNrIC0gYWxsIHZhbHVlcyBhcmUgaW1wbGljaXRseSBzZXQgKi8KKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorICAgIF9hcGljbGlfcmVhZF91bnVtKHNlc3Npb24sIHByZXNlbmNlX21hc2stPnR5cGUsIHByZXNlbmNlX21hc2stPmRhdGEsICZwbV92YWx1ZV9udW0pOworICAgIHJldHVybiAoKHBtX3ZhbHVlX251bSA+PiBwcmVzZW5jZV9tYXNrLT5iaXQpICYgMSkgIT0gMDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfYXJyX2R5bl9sZW5fZ2V0KGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwgdm9pZCAqZGF0YSwgdWludDMyX3QgKmFycmF5X3NpemUpCit7CisgICAgc3dpdGNoICh0ZC0+eC5hcnJfZHluLmxlbl9zaXplKQorICAgIHsKKyAgICBjYXNlIDE6ICphcnJheV9zaXplID0gKih1aW50OF90ICopZGF0YTsgYnJlYWs7CisgICAgY2FzZSAyOiAqYXJyYXlfc2l6ZSA9ICoodWludDE2X3QgKilkYXRhOyBicmVhazsKKyAgICBjYXNlIDQ6ICphcnJheV9zaXplID0gKih1aW50MzJfdCAqKWRhdGE7IGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyB2b2lkICpfYXBpY2xpX2Fycl9keW5fZGF0YV9nZXQoY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLCB2b2lkICpkYXRhKQoreworICAgIHJldHVybiAqKHZvaWQqKilCQ01PU19ST1VORF9VUCgobG9uZylkYXRhICsgdGQtPnguYXJyX2R5bi5sZW5fc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworfQorCisvKiBEdW1wIGRhdGEgdHlwZSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIHZvaWQgKmRhdGEsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICB1aW50MzJfdCBudW1fZW50cmllcywKKyAgICB1aW50MzJfdCBlbnRyeV9zaXplLAorICAgIGFwaWNsaV9vdXRwdXRfc3R5bGUgc3R5bGUsCisgICAgY29uc3QgYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbyAqcHJlc2VuY2VfbWFzaywKKyAgICBjb25zdCBjaGFyICpwcmVmaXgsCisgICAgY29uc3QgY2hhciAqc3VmZml4KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIHN3aXRjaCAodGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGY7CisgICAgICAgICAgICBjaGFyIGZ1bGxfbmFtZVtBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEhdOworICAgICAgICAgICAgaWYgKCF0ZC0+eC5zLm51bV9maWVsZHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBCVUdfT04oIXRkLT54LnMuZmllbGRzKTsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGYgPSAwOyBmIDwgdGQtPngucy5udW1fZmllbGRzOyBmKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2ZpZWxkX2Rlc2NyICpmbGQgPSAmdGQtPngucy5maWVsZHNbZl07CisgICAgICAgICAgICAgICAgdm9pZCAqZmRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgZmxkLT5vZmZzZXQpOworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmVzZW5jZV9tYXNrX2luZm8gZmllbGRfcG0gPSB7fTsKKyAgICAgICAgICAgICAgICBpZiAoKCh0ZC0+eC5zLmZpZWxkc1swXS5mbGFncyAmIEJDTUNMSV9GSUVMRF9ERVNDUl9GTEFHU19QUkVTRU5DRV9NQVNLKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICBzdHlsZSAhPSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBzdHJ1Y3QgaGFzIGEgcHJlc2VuY2UgbWFzaywgc2tpcCB0aGUgcHJlc2VuY2UgbWFzayBmaWVsZCBpdHNlbGYsIHRoZW4gcmVjb3JkIHRoZSBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcHJlc2VuY2UgbWFzayBzbyB3ZSBjYW4gY2hlY2sgaXQgbGF0ZXIgZm9yIGVhY2ggZW50cnkuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChmID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfcG0udHlwZSA9IHRkLT54LnMuZmllbGRzWzBdLnR5cGU7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkX3BtLmRhdGEgPSAodWludDhfdCAqKWRhdGEgKyB0ZC0+eC5zLmZpZWxkc1swXS5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkX3BtLmJpdCA9ICh1aW50OF90KShmIC0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCAmJiBmID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoZnVsbF9uYW1lLCBuYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCAiLiIsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2RhdGFfdHlwZShzZXNzaW9uLCBmbGQtPnR5cGUsIGZkYXRhLCBmdWxsX25hbWUsIG51bV9lbnRyaWVzLCBlbnRyeV9zaXplLCBzdHlsZSwgJmZpZWxkX3BtLCBwcmVmaXgsIHN1ZmZpeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIgfSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT046CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFByaW50IGZpZWxkcyB1cCB0byBzZWxlY3RvciwgdGhlbiBzZWxlY3RvciwgdGhlbiBzZWxlY3RlZCBzdWItc3RydWN0dXJlICovCisgICAgICAgICAgICB1aW50MTZfdCBmOworICAgICAgICAgICAgY2hhciBmdWxsX25hbWVbQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIXTsKKyAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkOworICAgICAgICAgICAgdm9pZCAqZmRhdGE7CisgICAgICAgICAgICBpbnQ2NF90IHNlbGVjdG9yX3ZhbCA9IDA7CisgICAgICAgICAgICBpbnQgbnVtX3VuaW9uX3ZhbHM7CisKKyAgICAgICAgICAgIGlmICghdGQtPngudS5udW1fY29tbW9uX2ZpZWxkcykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIEJVR19PTighdGQtPngudS5jb21tb25fZmllbGRzKTsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDb21tb24gZmllbGRzLCBpbmNsdWRpbmcgc2VsZWN0b3IgKi8KKyAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPD0gdGQtPngudS5jbGFzc2lmaWVyX2lkeCAmJiAhcmM7IGYrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbGQgPSAmdGQtPngudS5jb21tb25fZmllbGRzW2ZdOworICAgICAgICAgICAgICAgIGZkYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGZsZC0+b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGZ1bGxfbmFtZSwgbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChmbGQtPm5hbWUgJiYgc3RybGVuKGZsZC0+bmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgZmxkLT50eXBlLCBmZGF0YSwgZnVsbF9uYW1lLCBudW1fZW50cmllcywgZW50cnlfc2l6ZSwgc3R5bGUsIHByZXNlbmNlX21hc2ssIHByZWZpeCwgc3VmZml4KTsKKyAgICAgICAgICAgICAgICBpZiAoZiA9PSB0ZC0+eC51LmNsYXNzaWZpZXJfaWR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSByYyA/IHJjIDogX2FwaWNsaV9yZWFkX3NudW0oc2Vzc2lvbiwgZmxkLT50eXBlLCBmZGF0YSwgJnNlbGVjdG9yX3ZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKippbnRlcm5hbCBlcnJvciB3aGVuIGR1bXBpbmcgZmllbGQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXS5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG51bV91bmlvbl92YWxzID0gX2FwaV9jbGlfZ2V0X251bV9lbnVtX3ZhbHModGQtPngudS5jb21tb25fZmllbGRzW3RkLT54LnUuY2xhc3NpZmllcl9pZHhdLnR5cGUtPnguZSk7CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXNlbGVjdG9yX3ZhbCA+PSBudW1fdW5pb25fdmFscykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKmludmFsaWQgdW5pb24gc2VsZWN0b3IgdmFsdWUgJWxsZFxuIiwgKGxvbmcgbG9uZylzZWxlY3Rvcl92YWwpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb21tb24gZmllbGRzIGZvbGxvd2luZyBzZWxlY3RvciAqLworICAgICAgICAgICAgZm9yICg7IGYgPCB0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzOyBmKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgICAgICAgICBmZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBmbGQtPm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGZ1bGxfbmFtZSwgbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChmbGQtPm5hbWUgJiYgc3RybGVuKGZsZC0+bmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgZmxkLT50eXBlLCBmZGF0YSwgZnVsbF9uYW1lLCBudW1fZW50cmllcywgZW50cnlfc2l6ZSwgc3R5bGUsIHByZXNlbmNlX21hc2ssIHByZWZpeCwgc3VmZml4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2VsZWN0ZWQgZmllbGQgKi8KKyAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LnVuaW9uX2ZpZWxkc1tzZWxlY3Rvcl92YWxdOworICAgICAgICAgICAgaWYgKGZsZC0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInsgLiVzID0gIiwgX2FwaWNsaV9za2lwX3VuaW9uX3ByZWZpeChmbGQtPm5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgZmxkLT5vZmZzZXQpOworCisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoZnVsbF9uYW1lLCBuYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKGZsZC0+bmFtZSAmJiBzdHJsZW4oZmxkLT5uYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgIi4iLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgZmxkLT5uYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2RhdGFfdHlwZShzZXNzaW9uLCBmbGQtPnR5cGUsIGZkYXRhLCBmdWxsX25hbWUsIG51bV9lbnRyaWVzLCBlbnRyeV9zaXplLCBzdHlsZSwgcHJlc2VuY2VfbWFzaywgcHJlZml4LCBzdWZmaXgpOworICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiIH0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIgfSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVEOiAvKiBmaXhlZCBhcnJheSAqLworICAgICAgICB7CisgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9hcnJheShzZXNzaW9uLCB0ZC0+eC5hcnJfZml4ZWQuZWxlbV90eXBlLCBkYXRhLCB0ZC0+eC5hcnJfZml4ZWQuc2l6ZSwgbmFtZSwgc3R5bGUsIHByZXNlbmNlX21hc2ssIHByZWZpeCwgc3VmZml4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU46ICAgLyogZHluYW1pYyBhcnJheSB0aGF0IHNob3VsZCBiZSBwcmludGVkIGFzIGJ1ZmZlciAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBSZWFkIGxlbmd0aCAqLworICAgICAgICAgICAgdWludDMyX3QgYXJyYXlfc2l6ZTsKKworICAgICAgICAgICAgcmMgPSBfYXBpY2xpX2Fycl9keW5fbGVuX2dldCh0ZCwgZGF0YSwgJmFycmF5X3NpemUpOworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiKioqICVzOiBkeW4gYXJyYXkgbGVuX3NpemUgJXUgaXMgbm90IHN1cHBvcnRlZFxuIiwgbmFtZSwgdGQtPnguYXJyX2R5bi5sZW5fc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmllbGRfbmFtZSA9IHN0cnJjaHIobmFtZSwgJy4nKTsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGRfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZSA9IG5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrZmllbGRfbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJ7ICV1LCAlcyB9IiwgYXJyYXlfc2l6ZSwgZmllbGRfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICBkYXRhID0gX2FwaWNsaV9hcnJfZHluX2RhdGFfZ2V0KHRkLCBkYXRhKTsKKyAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2FycmF5KHNlc3Npb24sIHRkLT54LmFycl9keW4uZWxlbV90eXBlLCBkYXRhLCBhcnJheV9zaXplLCBuYW1lLCBzdHlsZSwgcHJlc2VuY2VfbWFzaywgcHJlZml4LCBzdWZmaXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaW5hbGx5ISBTaW1wbGUgdHlwZSB0aGF0IG1hcHMgdG8gYSBzaW5nbGUgQ0xJIHBhcmFtZXRlciAqLworICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICBhcGljbGlfcHJlc2VuY2VfbWFza19pbmZvIGxvY2FsX3BtOworCisgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgc2luZ2xlIHZhbHVlIGFuZCB0aGF0IHZhbHVlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcHJlc2VuY2UgbWFzaywganVzdCBza2lwIGl0IGVudGlyZWx5ICovCisgICAgICAgICAgICBpZiAobnVtX2VudHJpZXMgPT0gMSAmJiAhX2FwaWNsaV9pc192YWx1ZV9zZXQoc2Vzc2lvbiwgcHJlc2VuY2VfbWFzaykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHlsZSAhPSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMlcz0iLCBwcmVmaXgsIG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW51bV9lbnRyaWVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sIEJDTUNMSV9BUlJBWV9FTVBUWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEdW1wIHNpbXBsZSB2YWx1ZSBvciBhcnJheSBvZiBzaW1wbGUgdmFsdWVzICovCisgICAgICAgICAgICBsb2NhbF9wbSA9IHByZXNlbmNlX21hc2sgPyAqcHJlc2VuY2VfbWFzayA6IChhcGljbGlfcHJlc2VuY2VfbWFza19pbmZvKXt9OworICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IG51bV9lbnRyaWVzOyBuKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiwiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgcHJlc2VuY2UgbWFzaywgbWFrZSBzdXJlIHRvIHByaW50IGEgc3BlY2lhbCB0b2tlbiBpZiB0aGUgdmFsdWUgaXMgdW5zZXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoX2FwaWNsaV9pc192YWx1ZV9zZXQoc2Vzc2lvbiwgJmxvY2FsX3BtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX3NpbXBsZV9kYXRhX3R5cGUoc2Vzc2lvbiwgdGQsIGRhdGEsIG5hbWUsIHN0eWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sIEJDTUNMSV9QQVJNX05PX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGVudHJ5X3NpemUpOworICAgICAgICAgICAgICAgIGxvY2FsX3BtLmRhdGEgPSAodm9pZCAqKSgobG9uZylsb2NhbF9wbS5kYXRhICsgZW50cnlfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiVzIiwgc3VmZml4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogRHVtcCBhcnJheSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9hcnJheSgKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsCisgICAgdm9pZCAqZGF0YSwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgYXBpY2xpX291dHB1dF9zdHlsZSBzdHlsZSwKKyAgICBjb25zdCBhcGljbGlfcHJlc2VuY2VfbWFza19pbmZvICpwcmVzZW5jZV9tYXNrLAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKKyAgICBjb25zdCBjaGFyICpzdWZmaXgpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogUHJpbnQgYXMgYnVmZmVyIG9yIGVsZW1lbnQgYnkgZWxlbWVudCA/ICovCisgICAgaWYgKHN0eWxlID09IEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJ7ICIpOworICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgdGQsIGRhdGEsIG5hbWUsIHNpemUsIHRkLT5zaXplLCBzdHlsZSwgcHJlc2VuY2VfbWFzaywgcHJlZml4LCBzdWZmaXgpOworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiB9Iik7CisgICAgfQorICAgIGVsc2UgaWYgKCh0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTSB8fCB0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgpICYmIHRkLT5zaXplID09IDEpCisgICAgeworICAgICAgICBpZiAoX2FwaWNsaV9pc192YWx1ZV9zZXQoc2Vzc2lvbiwgcHJlc2VuY2VfbWFzaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGk7CisKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMlcz0iLCBwcmVmaXgsIG5hbWUpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUwMngiLCAoKHVpbnQ4X3QqKWRhdGEpW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMiLCBzdWZmaXgpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2RhdGFfdHlwZShzZXNzaW9uLCB0ZCwgZGF0YSwgbmFtZSwgc2l6ZSwgdGQtPnNpemUsIHN0eWxlLCBwcmVzZW5jZV9tYXNrLCBwcmVmaXgsIHN1ZmZpeCk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogRHVtcCBwcm9wZXJ0eSAqLworYmNtb3NfZXJybm8gYXBpY2xpX2R1bXBfcHJvcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkLCB2b2lkICpwcm9wX2RhdGEpCit7CisgICAgcmV0dXJuIF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgcGQtPnR5cGUsIHByb3BfZGF0YSwgcGQtPm5hbWUsIDEsIDAsIEFQSUNMSV9PVVRQVVRfU1RZTEVfU1RELCBOVUxMLCAiICAgIiwgIlxuIik7Cit9CisKKy8qIER1bXAgYSBzaW5nbGUgcHJvcGVydHkgdmFsdWUgaW4gQyBpbml0aWFsaXplciBmb3JtYXQgKi8KK2JjbW9zX2Vycm5vIGFwaWNsaV9kdW1wX3Byb3BfaW5pdGlhbGl6ZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwgdm9pZCAqcHJvcF9kYXRhKQoreworICAgIHJldHVybiBfYXBpY2xpX2R1bXBfZGF0YV90eXBlKHNlc3Npb24sIHBkLT50eXBlLCBwcm9wX2RhdGEsIHBkLT5uYW1lLCAxLCAwLCBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCwgTlVMTCwgIiIsICIiKTsKK30KKworYmNtb3NfZXJybm8gYXBpY2xpX2R1bXBfZHluX2FycmF5KAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICB2b2lkICpkYXRhLAorICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgdWludDMyX3QgYXJyYXlfc2l6ZTsKKworICAgIHJjID0gX2FwaWNsaV9hcnJfZHluX2xlbl9nZXQodGQsIGRhdGEsICZhcnJheV9zaXplKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IocmMpOworICAgIHJldHVybiBfYXBpY2xpX2R1bXBfYXJyYXkoCisgICAgICAgIHNlc3Npb24sCisgICAgICAgIHRkLT54LmFycl9keW4uZWxlbV90eXBlLAorICAgICAgICBfYXBpY2xpX2Fycl9keW5fZGF0YV9nZXQodGQsIGRhdGEpLAorICAgICAgICBhcnJheV9zaXplLAorICAgICAgICBuYW1lLAorICAgICAgICBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgIiIsCisgICAgICAgICIiKTsKK30KKworLyogRHVtcCBwcm9wZXJ0eSBhcyBDTEkgcGFyYW1ldGVycyAqLworYmNtb3NfZXJybm8gYXBpY2xpX2R1bXBfcHJvcF9wYXJhbShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkLCB2b2lkICpwcm9wX2RhdGEsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICByZXR1cm4gX2FwaWNsaV9kdW1wX2RhdGFfdHlwZShzZXNzaW9uLCBwZC0+dHlwZSwgcHJvcF9kYXRhLCBwZC0+bmFtZSwgMSwgMCwgQVBJQ0xJX09VVFBVVF9TVFlMRV9TVEQsIE5VTEwsIHByZWZpeCwgIiIpOworfQorCisvKiBDYWxjdWxhdGUgcHJvcGVydHkgcG9pbnRlciBnaXZlbiB0aGUgZ3JvdXAgZGF0YSBwb2ludGVyIGFuZCBwcm9wZXJ0eSBkZXNjcmlwdGlvbiAqLworc3RhdGljIGlubGluZSB2b2lkICpfYXBpY2xpX3Byb3BfZGF0YV9wdHIodm9pZCAqZ3JvdXBfcHRyLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQpCit7CisgICAgcmV0dXJuICh2b2lkICopKChsb25nKWdyb3VwX3B0ciArIHBkLT5vZmZzZXQpOworfQorCisvKiBEdW1wIG9iamVjdCBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9kdW1wX2RhdGEoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9tc2cgKm1zZywgdm9pZCAqZGF0YSwgdWludDMyX3QgZGF0YV9zaXplKQoreworICAgIHVpbnQxNl90IHByb3A7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiZGF0YTpcbiIpOworICAgIGZvciAocHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICB2b2lkICpwcm9wX2RhdGEgPSBfYXBpY2xpX3Byb3BfZGF0YV9wdHIoZGF0YSwgcGQpOworICAgICAgICBpZiAoIShtc2ctPnByZXNlbmNlX21hc2sgJiAoMUxMIDw8IHByb3ApKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIXByb3BfZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQlVHX09OKHBkLT5vZmZzZXQgPiBkYXRhX3NpemUpOworICAgICAgICByYyA9IGFwaWNsaV9kdW1wX3Byb3Aoc2Vzc2lvbiwgcGQsIHByb3BfZGF0YSk7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIER1bXAgb2JqZWN0IGtleSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9rZXkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9tc2cgKm1zZywgdm9pZCAqa2V5LCB1aW50MzJfdCBrZXlfc2l6ZSkKK3sKKyAgICB1aW50MTZfdCBwcm9wOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgImtleTpcbiIpOworICAgIGZvciAocHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgdm9pZCAqcHJvcF9kYXRhID0gX2FwaWNsaV9wcm9wX2RhdGFfcHRyKGtleSwgcGQpOworICAgICAgICBpZiAoIXByb3BfZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQlVHX09OKHBkLT5vZmZzZXQgPiBrZXlfc2l6ZSk7CisgICAgICAgIHJjID0gYXBpY2xpX2R1bXBfcHJvcChzZXNzaW9uLCBwZCwgcHJvcF9kYXRhKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworY29uc3QgY2hhciAqYXBpY2xpX21ndF9ncm91cF90b19zdHIoYmNtb2x0X21ndF9ncm91cCBncm91cCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RyX3RhYmxlW0JDTU9MVF9NR1RfR1JPVVBfX05VTV9PRl0gPQorICAgIHsKKyAgICAgICAgW0JDTU9MVF9NR1RfR1JPVVBfS0VZXSAgICAgID0gImtleSIsCisgICAgICAgIFtCQ01PTFRfTUdUX0dST1VQX0NGR10gICAgICA9ICJjZmciLAorICAgICAgICBbQkNNT0xUX01HVF9HUk9VUF9TVEFUXSAgICAgPSAic3RhdCIsCisgICAgICAgIFtCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHXSA9ICJzdGF0X2NmZyIsCisgICAgICAgIFtCQ01PTFRfTUdUX0dST1VQX0FVVE9dICAgICA9ICJhdXRvIiwKKyAgICAgICAgW0JDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkddID0gImF1dG9fY2ZnIiwKKyAgICAgICAgW0JDTU9MVF9NR1RfR1JPVVBfT1BFUl0gICAgID0gIm9wZXIiLAorICAgICAgICBbQkNNT0xUX01HVF9HUk9VUF9QUk9YWV0gICAgPSAicHJveHkiLAorICAgICAgICBbQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWF0gPSAicHJveHlfcngiCisgICAgfTsKKyAgICByZXR1cm4gKGdyb3VwID49IEJDTU9MVF9NR1RfR1JPVVBfX05VTV9PRikgPyAiPHVua25vd24+IiA6IHN0cl90YWJsZVtncm91cF07Cit9CisKKy8qIER1bXAgbWVzc2FnZSBzZXQgcmV0dXJuZWQgYnkgbXVsdGktb2JqZWN0IEdFVCAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9tc2dzZXQoCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgYmNtb2x0X21zZyAqbXNnLAorICAgIHVpbnQzMl90IGtleV9zaXplLAorICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICB1aW50MzJfdCBkYXRhX29mZnNldCkKK3sKKyAgICB1aW50MTZfdCBpbnN0OworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHZvaWQgKmtleSA9IE5VTEw7CisgICAgdm9pZCAqZGF0YSA9IE5VTEw7CisKKyAgICBpZiAobXNnLT5tc2dfc2V0ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OVUxMOworICAgIH0KKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAibW9yZTogJXNcbiIsIG1zZy0+bXNnX3NldC0+bW9yZSA/ICJ5ZXMiIDogIm5vIik7CisgICAgaWYgKG1zZy0+bXNnX3NldC0+bW9yZSkKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAibmV4dCAiKTsKKyAgICAgICAgX2FwaWNsaV9kdW1wX2tleShzZXNzaW9uLCBtc2csIG1zZy0+bXNnX3NldC0+bmV4dF9rZXksIGtleV9zaXplKTsKKyAgICB9CisKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIm51bWJlciBvZiBvYmplY3RzIHJldHVybmVkOiAlZFxuIiwgbXNnLT5tc2dfc2V0LT5udW1faW5zdGFuY2VzKTsKKyAgICBmb3IgKGluc3QgPSAwOyBpbnN0IDwgbXNnLT5tc2dfc2V0LT5udW1faW5zdGFuY2VzOyBpbnN0KyspCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIm9iamVjdCAlZDpcbiIsIGluc3QpOworCisgICAgICAgIGtleSA9ICh2b2lkICopKChsb25nKW1zZy0+bXNnX3NldC0+bXNnW2luc3RdICsgc2l6ZW9mKGJjbW9sdF9tc2cpKTsKKyAgICAgICAgcmMgPSBfYXBpY2xpX2R1bXBfa2V5KHNlc3Npb24sIG1zZy0+bXNnX3NldC0+bXNnW2luc3RdLCBrZXksIGtleV9zaXplKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEgPSAodm9pZCAqKSgobG9uZyltc2ctPm1zZ19zZXQtPm1zZ1tpbnN0XSArIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgcmMgPSBfYXBpY2xpX2R1bXBfZGF0YShzZXNzaW9uLCBtc2ctPm1zZ19zZXQtPm1zZ1tpbnN0XSwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogRHVtcCBtZXNzYWdlICovCitiY21vc19lcnJubyBhcGljbGlfbXNnX2R1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBjb25zdCBjaGFyICpuYW1lLCAqZGVzY3I7CisgICAgdWludDMyX3Qga2V5X3NpemU7CisgICAgdWludDMyX3Qga2V5X29mZnNldDsKKyAgICB1aW50MzJfdCBkYXRhX3NpemU7CisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQ7CisgICAgdm9pZCAqa2V5ID0gTlVMTDsKKyAgICB2b2lkICpkYXRhID0gTlVMTDsKKworICAgIHJjID0gYXBpX2NsaV9vYmplY3RfbmFtZShtc2ctPm9ial90eXBlLCAmbmFtZSwgJmRlc2NyKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBnb3RvIGR1bXBfZXJyb3I7CisgICAgfQorCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJvYmplY3Q6ICIpOworICAgIGlmIChuYW1lKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlcyIsIG5hbWUpOworICAgIH0KKyAgICBpZiAoZGVzY3IpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiAtICVzIiwgZGVzY3IpOworICAgIH0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlxuIik7CisgICAgcmMgPSBhcGlfY2xpX29iamVjdF9zdHJ1Y3Rfc2l6ZSgKKyAgICAgICAgbXNnLT5vYmpfdHlwZSwKKyAgICAgICAgbXNnLT5ncm91cCwKKyAgICAgICAgbXNnLT5zdWJncm91cCwKKyAgICAgICAgJmtleV9zaXplLAorICAgICAgICAma2V5X29mZnNldCwKKyAgICAgICAgJmRhdGFfc2l6ZSwKKyAgICAgICAgJmRhdGFfb2Zmc2V0KTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBnb3RvIGR1bXBfZXJyb3I7CisgICAgfQorCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sIChtc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfR0VUKSAhPSAwID8gImdldCIgOiAic2V0Iik7CisgICAgaWYgKChtc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfQ0xFQVIpICE9IDApCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIixjbGVhciIpOworICAgIH0KKyAgICBpZiAoKG1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9NVUxUSSkgIT0gMCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiLG11bHRpIik7CisgICAgfQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiICVzICIsIGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKG1zZy0+Z3JvdXApKTsKKworICAgIGlmIChtc2ctPmdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHICYmIG1zZy0+Z3JvdXAgIT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUICYmCisgICAgICAgIG1zZy0+Z3JvdXAgIT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRyAmJiBtc2ctPmdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcpCisgICAgeworICAgICAgICBjb25zdCBjaGFyICpzdWJfbmFtZSwgKnN1Yl9kZXNjcjsKKyAgICAgICAgLyogR2V0IG5hbWUgb2Ygc3BlY2lmaWMgc3ViZ3JvdXAgKi8KKyAgICAgICAgcmMgPSBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKG1zZy0+b2JqX3R5cGUsIG1zZy0+Z3JvdXAsIG1zZy0+c3ViZ3JvdXAsICZzdWJfbmFtZSwgJnN1Yl9kZXNjcik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBkdW1wX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAic3ViZ3JvdXA6ICVzLSVzICIsIHN1Yl9uYW1lID8gc3ViX25hbWUgOiAiPyIsIHN1Yl9kZXNjciA/IHN1Yl9kZXNjciA6ICIiKTsKKyAgICB9CisgICAgaWYgKG1zZy0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFUVVFU1QpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInJlcXVlc3RcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInJlc3BvbnNlOiAlcyAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IobXNnLT5lcnIpLCBtc2ctPmVycl90ZXh0KTsKKyAgICB9CisKKyAgICBpZiAobXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UgJiYgKG1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9NVUxUSSkgIT0gMCkKKyAgICB7CisgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX21zZ3NldChzZXNzaW9uLCBtc2csIGtleV9zaXplLCBkYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGR1bXBfZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChtc2ctPmdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcpICYmIGtleV9zaXplKQorICAgICAgICB7CisgICAgICAgICAgICBrZXkgPSAodm9pZCAqKSgobG9uZyltc2cgKyBrZXlfb2Zmc2V0KTsKKyAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2tleShzZXNzaW9uLCBtc2csIGtleSwga2V5X3NpemUpOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gZHVtcF9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0YV9zaXplICYmCisgICAgICAgICAgICAgKCAgKChtc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVFVRVNUKSAmJiAobXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX1NFVCkpICB8fAorICAgICAgICAgICAgICAgICgobXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UpICYmIChtc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfR0VUKSkgfHwKKyAgICAgICAgICAgICAgICAobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FVVE8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCkKKyAgICAgICAgICAgICApCisgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YSA9ICh2b2lkICopKChsb25nKW1zZyArIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2RhdGEoc2Vzc2lvbiwgbXNnLCBkYXRhLCBkYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gZHVtcF9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworZHVtcF9lcnJvcjoKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKiBPYmplY3QgZHVtcCBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hhbmRsZXJzLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9oYW5kbGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWJmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9oYW5kbGVycy5jCkBAIC0wLDAgKzEsNjc3MzEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2luY2x1ZGUgImJjbV9hcGlfY2xpX2hhbmRsZXJzLmgiCisKK2JjbWNsaV9zZXNzaW9uICphcGljbGlfY2xpX2xvZ19zZXNzaW9uID0gTlVMTDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICpzdGFydDsKKyAgICB1aW50MzJfdCB1c2VkOworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0OyAgICAvKiB1c2VkIGZvciBtdWx0aS1vYmplY3QgZ2V0IG1lc3NhZ2VzICovCit9IGFwaWNsaV9ieXRlX3Bvb2w7CisKKy8qIG9ubHkgc3RvcmUgMSBtZXNzYWdlIHNldCBhdCBhIHRpbWUgc28gaXQncyBlYXN5IHRvIGNsZWFuIHVwIGFmdGVyICovCitzdGF0aWMgYmNtb3NfZXJybm8gYXBpY2xpX2J5dGVfcG9vbF9jcmVhdGUoYXBpY2xpX2J5dGVfcG9vbCAqYnVmKQoreworICAgIGJ1Zi0+dXNlZCA9IDA7CisgICAgYnVmLT5zdGFydCA9IGJjbW9zX2NhbGxvYyhBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBidWYtPm1zZ19zZXQgPSBOVUxMOworICAgIHJldHVybiAoYnVmLT5zdGFydCA9PSBOVUxMKSA/IEJDTV9FUlJfTk9NRU0gOiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBhcGljbGlfYnl0ZV9wb29sX2Rlc3Ryb3koYXBpY2xpX2J5dGVfcG9vbCAqYnVmKQoreworICAgIGlmIChidWYtPm1zZ19zZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2dfc2V0X2ZyZWUoYnVmLT5tc2dfc2V0KTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKGJ1Zi0+c3RhcnQpOworfQorCitzdGF0aWMgdm9pZCAqYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYXBpY2xpX2J5dGVfcG9vbCAqYnVmLCB1aW50MzJfdCBudW1fYnl0ZXMpCit7CisgICAgdm9pZCAqcmV0OworICAgIGlmIChidWYtPnVzZWQgKyBudW1fYnl0ZXMgPiBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gYnVmLT5zdGFydCArIGJ1Zi0+dXNlZDsKKyAgICBidWYtPnVzZWQgKz0gbnVtX2J5dGVzOworICAgIG1lbXNldChyZXQsIDAsIG51bV9ieXRlcyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaWNsaV9tc2dfc2V0X2FsbG9jKGFwaWNsaV9ieXRlX3Bvb2wgKmJ1ZiwgYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQzMl90IG1heF9pbnN0YW5jZXMsIGJjbW9sdF9tc2dfc2V0ICoqbXNnX3NldCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgaWYgKGJ1Zi0+bXNnX3NldCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07ICAgLyogb25seSBvbmUgYXQgYSB0aW1lICovCisgICAgfQorCisgICAgZXJyID0gYmNtb2x0X21zZ19zZXRfYWxsb2Mob2JqLCBncm91cCwgbWF4X2luc3RhbmNlcywgJmJ1Zi0+bXNnX3NldCk7CisgICAgKm1zZ19zZXQgPSBidWYtPm1zZ19zZXQ7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFN0YXJ0L2VuZCBiYW5uZXJzIC0gdGhlc2UgYXJlIHNwZWNpYWxseSBmb3JtYXR0ZWQgc28gbGlzdGVuaW5nIGFwcHMgY2FuIGVhc2lseSB0ZWxsIHdoZXJlIEFQSSBoYW5kbGluZyBzdGFydHMvZW5kcy4KKyAqLworc3RhdGljIHZvaWQgYXBpY2xpX3ByaW50X3N0YXJ0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICphcGlfbmFtZSkKK3sKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlstLSBBUEkgU3RhcnQ6ICVzIC0tXVxuIiwgYXBpX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlstLSBBUEkgTWVzc2FnZSBEYXRhIC0tXVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGFwaWNsaV9wcmludF9jb21wbGV0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb3NfZXJybm8gZXJyLCBjb25zdCBjaGFyICplcnJfdGV4dCkKK3sKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0sgJiYgZXJyX3RleHQgIT0gTlVMTCAmJiBlcnJfdGV4dFswXSAhPSAnXDAnKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJFUlJPUjogJXMiLCBlcnJfdGV4dCk7CisgICAgfQorCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJbLS0gQVBJIENvbXBsZXRlOiAlZCAoJXMpIC0tXVxuIiwgZXJyLCBiY21vc19zdHJlcnJvcihlcnIpKTsKK30KKworc3RhdGljIGludCBhcGljbGlfY2xpX3Nlc3Npb25fd3JpdGVfY2IoYmNtY2xpX3Nlc3Npb24gKmNsaV9zZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpCit7CisgICAgYmNtY2xpX2xvZyhidWYsICIlLipzIiwgc2l6ZSwgYnVmKTsKKyAgICByZXR1cm4gKGludClzaXplOworfQorCisvKiBMb2dzIGEgcHJvcGVydHkgdmFsdWUgdG8gdGhlIENMSSBsb2cgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGlzIGEgdmFsaWQgUkhTIGluIGFuIGluaXRpYWxpemVyLiAgRm9yIGEgcHJpbWl0dmUsIHRoaXMKKyAqIHdpbGwganVzdCBwcmludCB0aGUgdmFsdWUgKGUuZy4gIjQyIikuICBGb3IgYSBzdHJ1Y3QsIGl0IHdpbGwgZW1pdCBhbGwgbWVtYmVycyBpbiBiZXR3ZWVuIGN1cmx5IGJyYWNlcy4gKi8KK3N0YXRpYyB2b2lkIGFwaWNsaV9sb2dfcHJvcF92YWwoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCB1aW50MTZfdCBwcm9wLCB2b2lkICp2YWx1ZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnByb3BfZGVzY3I7CisKKyAgICBpZiAoYXBpY2xpX2NsaV9sb2dfc2Vzc2lvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdGljIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc2Vzc2lvbl9wYXJhbXMgPSB7IC53cml0ZSA9IGFwaWNsaV9jbGlfc2Vzc2lvbl93cml0ZV9jYiB9OworCisgICAgICAgIGVyciA9IGJjbWNsaV9zZXNzaW9uX29wZW4oJnNlc3Npb25fcGFyYW1zLCAmYXBpY2xpX2NsaV9sb2dfc2Vzc2lvbik7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvciBvcGVuaW5nIHNlc3Npb246ICVzIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShvYmosIGdyb3VwLCBzdWJncm91cCwgcHJvcCwgJnByb3BfZGVzY3IpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3IgZ2V0dGluZyBpbmZvIGZvciBwcm9wZXJ0eTogJXMiLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVyciA9IGFwaWNsaV9kdW1wX3Byb3BfaW5pdGlhbGl6ZXIoYXBpY2xpX2NsaV9sb2dfc2Vzc2lvbiwgcHJvcF9kZXNjciwgdmFsdWUpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3IgcHJpbnRpbmcgcHJvcGVydHk6ICVzIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfaXB2NF9hZGRyZXNzIGFwaWNsaV91bnVtYmVyX3RvX2lwdjQodWludDMyX3QgbnVtKQoreworICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBpcDsKKyAgICBpcC51MzIgPSBudW07CisgICAgcmV0dXJuIGlwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfbmlfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfbmlfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZV9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFlX25pID0gKGJjbW9sdF9hZV9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhZV9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWVfbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQUVfTklfS0VZX0lEX0FFX05JLCAma2V5LmFlX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgYWVfbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGFlX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgbWFjX2FkZHJlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgbWFjX2FkZHJlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgYWVfbmlfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgYWVfbmlfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm10dV8xMGciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGFlX25pLCBtdHVfMTBnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIG10dV8xMGcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgcHJic19nZW5lcmF0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIHByYnNfY2hlY2tlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGFlX25pLCBwcmJzX2NoZWNrZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgcHJic19zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgYWVfbmksIG1hY19hZGRyZXNzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBhZV9uaSwgYWVfbmlfZW4pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGFlX25pLCBtdHVfMTBnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBhZV9uaSwgcHJic19nZW5lcmF0b3IpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGFlX25pLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGFlX25pLCBwcmJzX3N0YXR1cykpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGFlX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9uaV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9uaV9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9BRV9OSV9LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBhZV9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgYWVfbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgbWFjX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm10dV8xMGciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIG10dV8xMGcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIG10dV8xMGcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX01UVV8xMEcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2luc2VydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByYnNfY2hlY2tlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5kYXRhX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfbmlfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9uaV9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSwgJmtleS5hZV9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGFlX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBhZV9uaSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX25pX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfbmlfY2ZnIGNmZzsgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfbmlfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSwgJmtleS5hZV9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGFlX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBhZV9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgbWFjX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIG1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBtYWNfYWRkcmVzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFlX25pX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYWVfbmlfZW5fc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2FlX25pX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIGFlX25pX2VuLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBhZV9uaV9lbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZV9uaV9lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBhZV9uaV9lbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBhZV9uaSwgYWVfbmlfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tdHVfMTBnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBtdHVfMTBnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBtdHVfMTBnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1XzEwZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBtdHVfMTBnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBtdHVfMTBnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9pbnNlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBhZV9uaSwgcHJic19nZW5lcmF0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIHByYnNfZ2VuZXJhdG9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIubW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5kYXRhX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgcHJic19jaGVja2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfY2hlY2tlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIHByYnNfY2hlY2tlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmxvY2tfc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NrX3N0YXRlID0gKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9jb3VudHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMuZXJyb3JfY291bnRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfc3RhdHVzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBhZV9uaSwgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBhZV9uaSwgbWFjX2FkZHJlc3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBhZV9uaSwgYWVfbmlfZW4pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBhZV9uaSwgbXR1XzEwZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGFlX25pLCBwcmJzX2dlbmVyYXRvcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGFlX25pLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBhZV9uaSwgcHJic19zdGF0dXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfbmlfb3Blcl9zZXRfYWVfbmlfZW5fc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGUgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSwgJmtleS5hZV9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgYWVfbmksIHNldF9hZV9uaV9lbl9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBhZV9uaSwgc2V0X2FlX25pX2VuX3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5ld19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FlX25pX2VuX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9hZV9uaV9lbl9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgYWVfbmksIHNldF9hZV9uaV9lbl9zdGF0ZSwgbmV3X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgYWVfbmksIHNldF9hZV9uaV9lbl9zdGF0ZSwgbmV3X3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9BRV9OSV9PUEVSX0lEX1NFVF9BRV9OSV9FTl9TVEFURSwgQkNNT0xUX0FFX05JX1NFVF9BRV9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXQgc3RhdDsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF9kc19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBhZV9wYXRoX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGFlX3BhdGhfZHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGJ5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNjQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc182NCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY1XzEyNyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNjVfMTI3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTI4XzI1NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMTI4XzI1NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18yNTZfNTExKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMjU2XzUxMSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzUxMl8xMDIzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzUxMl8xMDIzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTAyNF8xNTE4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18xMDI0XzE1MTgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzE1MTlfMjA0Nyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzE1MTlfMjA0Nyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzIwNDhfNDA5NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMjA0OF80MDk1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNDA5Nl85MjE2Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc180MDk2XzkyMTYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc185MjE3XzE2MzgzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfOTIxN18xNjM4Myk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnJvYWRjYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBicm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBicm9hZGNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYXRhX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGRhdGFfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGRhdGFfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm11bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgbXVsdGljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgbXVsdGljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5pY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIHVuaWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhYm9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgYWJvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBhYm9ydF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzY0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzI1Nl81MTEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzE1MTlfMjA0NykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzkyMTdfMTYzODMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBkYXRhX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIG11bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgYWJvcnRfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfcGF0aF9kc19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX1BBVEhfRFNfS0VZX0lEX0FFX05JLCAma2V5LmFlX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZyBzdGF0X2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX3BhdGhfZHNfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX3BhdGhfZHNfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXQgc3RhdDsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF91c19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF91c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQUVfUEFUSF9VU19LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBhZV9wYXRoX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGFlX3BhdGhfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGJ5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNjQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc182NCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY1XzEyNyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNjVfMTI3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTI4XzI1NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMTI4XzI1NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18yNTZfNTExKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMjU2XzUxMSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzUxMl8xMDIzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzUxMl8xMDIzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTAyNF8xNTE4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18xMDI0XzE1MTgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzE1MTlfMjA0Nyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzE1MTlfMjA0Nyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzIwNDhfNDA5NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMjA0OF80MDk1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNDA5Nl85MjE2Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc180MDk2XzkyMTYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc185MjE3XzE2MzgzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfOTIxN18xNjM4Myk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnJvYWRjYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBicm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBicm9hZGNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYXRhX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGRhdGFfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGRhdGFfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm11bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgbXVsdGljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgbXVsdGljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5pY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIHVuaWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhYm9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgYWJvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBhYm9ydF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZjc19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmY3NfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZjc19lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3ZlcnNpemVfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgb3ZlcnNpemVfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIG92ZXJzaXplX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJydW50X2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIHJ1bnRfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIHJ1bnRfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzY0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzI1Nl81MTEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzE1MTlfMjA0NykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzkyMTdfMTYzODMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBkYXRhX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIG11bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgYWJvcnRfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZjc19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBvdmVyc2l6ZV9lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBydW50X2Vycm9yKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfcGF0aF91c19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF91c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX0FFX05JLCAma2V5LmFlX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZmNzX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmY3NfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBydW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBydW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZyBzdGF0X2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQUVfUEFUSF9VU19LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBhYm9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmY3NfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZjc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgb3ZlcnNpemVfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIHJ1bnRfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIHJ1bnRfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX3BhdGhfdXNfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF91cywgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF91cywgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF91cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX3BhdGhfdXNfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgYWVfcGF0aF91cywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgYWVfcGF0aF91cywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9jaGFubmVsX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2NoYW5uZWxfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2hhbm5lbF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQ0hBTk5FTCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgY2hhbm5lbCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgY2hhbm5lbCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcGVyYXRpb25fY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidG9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCB0b2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCB0b2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5c3RlbV9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGNoYW5uZWwsIHN5c3RlbV9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGNoYW5uZWwsIGNoYW5uZWxfcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGNoYW5uZWwsIGNoYW5uZWxfcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgY2hhbm5lbCwgdG9sKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgY2hhbm5lbCwgY2hhbm5lbF9wcm9maWxlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgY2hhbm5lbCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGNoYW5uZWwsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9jaGFubmVsX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2NoYW5uZWxfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2hhbm5lbF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQ0hBTk5FTCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgY2hhbm5lbCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgY2hhbm5lbCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib3BlcmF0aW9uX2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLnJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvcGVyYXRpb25fY29udHJvbC5yZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLm9kbl9jbGFzcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9kbl9jbGFzcyA9IChiY21vbHRfb2RuX2NsYXNzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib3BlcmF0aW9uX2NvbnRyb2wub2RuX2NsYXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3BlcmF0aW9uX2NvbnRyb2wuZHNfZmVjX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kc19mZWNfbW9kZSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9wZXJhdGlvbl9jb250cm9sLmRzX2ZlY19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3BlcmF0aW9uX2NvbnRyb2wucHJvdG9jb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcm90b2NvbCA9IChiY21vbHRfdGNfcHJvdG9jb2wpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvcGVyYXRpb25fY29udHJvbC5wcm90b2NvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLmRzX2xpbmtfdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRzX2xpbmtfdHlwZSA9IChiY21vbHRfbGlua190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib3BlcmF0aW9uX2NvbnRyb2wuZHNfbGlua190eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLnBvbl9pZC4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9wZXJhdGlvbl9jb250cm9sLnBvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLnBvbl9pZC5kd2xjaF9pZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnBvbl9pZC5kd2xjaF9pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvcGVyYXRpb25fY29udHJvbC5wb25faWQuZHdsY2hfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvcGVyYXRpb25fY29udHJvbC5wb25faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcGVyYXRpb25fY29udHJvbC5jIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9wZXJhdGlvbl9jb250cm9sLmMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyYXRpb25fY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCB0b2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgdG9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfVE9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInN5c3RlbV9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N5c3RlbV9wcm9maWxlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS5uZ18yX3N5c19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5nXzJfc3lzX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3lzdGVtX3Byb2ZpbGUubmdfMl9zeXNfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS52ZXJzaW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmVyc2lvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN5c3RlbV9wcm9maWxlLnZlcnNpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS5jaGFubmVsX3NwYWNpbmciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jaGFubmVsX3NwYWNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzeXN0ZW1fcHJvZmlsZS5jaGFubmVsX3NwYWNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzID0gKGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN5c3RlbV9wcm9maWxlLnVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Byb2ZpbGUudXNfbXNlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXNfbXNlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3lzdGVtX3Byb2ZpbGUudXNfbXNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Byb2ZpbGUubG9vc2VfY2FsaWJyYXRpb25fYm91bmQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb29zZV9jYWxpYnJhdGlvbl9ib3VuZCA9IChiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3lzdGVtX3Byb2ZpbGUubG9vc2VfY2FsaWJyYXRpb25fYm91bmQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS5mc3IiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mc3IgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzeXN0ZW1fcHJvZmlsZS5mc3IgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS50d2RtX2NoYW5uZWxfY291bnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50d2RtX2NoYW5uZWxfY291bnQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzeXN0ZW1fcHJvZmlsZS50d2RtX2NoYW5uZWxfY291bnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zeXN0ZW1fcHJvZmlsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgY2hhbm5lbF9wcm9maWxlLmFyciBtdXN0IGhhdmUgOCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnZlcnNpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIudmVyc2lvbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS52ZXJzaW9uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX2luZGV4Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjaGFubmVsX3Byb2ZpbGUuYXJyLmNoYW5uZWxfaW5kZXggaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uY2hhbm5lbF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIuZHNfZnJlcXVlbmN5X29mZnNldC5zaWduIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjaGFubmVsX3Byb2ZpbGUuYXJyLmRzX2ZyZXF1ZW5jeV9vZmZzZXQuc2lnbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kc19mcmVxdWVuY3lfb2Zmc2V0LnNpZ24gPSAoYmNtb2x0X3NpZ24pIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuYXJyLmRzX2ZyZXF1ZW5jeV9vZmZzZXQudmFsdWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIuZHNfZnJlcXVlbmN5X29mZnNldC52YWx1ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kc19mcmVxdWVuY3lfb2Zmc2V0LnZhbHVlID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX3BhcnRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX3BhcnRpdGlvbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5jaGFubmVsX3BhcnRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIudXdsY2hfaWQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIudXdsY2hfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0udXdsY2hfaWQgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnVzX2ZyZXF1ZW5jeSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyci51c19mcmVxdWVuY3kgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0udXNfZnJlcXVlbmN5ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci51c19yYXRlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnVzX3JhdGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0udXNfcmF0ZSA9IChiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcykgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIuZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIuZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnJlc3BvbnNlX3RocmVzaG9sZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyci5yZXNwb25zZV90aHJlc2hvbGQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucmVzcG9uc2VfdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci51c19saW5rX3R5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIudXNfbGlua190eXBlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnVzX2xpbmtfdHlwZSA9IChiY21vbHRfbGlua190eXBlKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci5pc192YWxpZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyci5pc192YWxpZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5pc192YWxpZCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGNoYW5uZWwsIGNoYW5uZWxfcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGNoYW5uZWwsIGNoYW5uZWxfcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9jaGFubmVsX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfY2hhbm5lbF9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfY2hhbm5lbF9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jaGFubmVsX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2hhbm5lbF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGNoYW5uZWwsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGNoYW5uZWwsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9jaGFubmVsX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfY2hhbm5lbF9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfY2hhbm5lbF9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jaGFubmVsX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2hhbm5lbF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBjaGFubmVsLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBjaGFubmVsLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5yZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLnJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLm9kbl9jbGFzcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9kbl9jbGFzcyA9IChiY21vbHRfb2RuX2NsYXNzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLm9kbl9jbGFzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5kc19mZWNfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRzX2ZlY19tb2RlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLmRzX2ZlY19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLnByb3RvY29sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHJvdG9jb2wgPSAoYmNtb2x0X3RjX3Byb3RvY29sKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLnByb3RvY29sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLmRzX2xpbmtfdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRzX2xpbmtfdHlwZSA9IChiY21vbHRfbGlua190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLmRzX2xpbmtfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5wb25faWQuYWRtaW5pc3RyYXRpdmVfbGFiZWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmR3bGNoX2lkIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucG9uX2lkLmR3bGNoX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5wb25faWQuZHdsY2hfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLmMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLmMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyYXRpb25fY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50b2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgdG9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGNoYW5uZWwsIHRvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1RPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGNoYW5uZWwsIHRvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBjaGFubmVsLCB0b2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3lzdGVtX3Byb2ZpbGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS5uZ18yX3N5c19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5nXzJfc3lzX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLm5nXzJfc3lzX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLnZlcnNpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC52ZXJzaW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLnZlcnNpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUuY2hhbm5lbF9zcGFjaW5nIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2hhbm5lbF9zcGFjaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLmNoYW5uZWxfc3BhY2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzID0gKGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS51c19tc2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c19tc2UgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUudXNfbXNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLmxvb3NlX2NhbGlicmF0aW9uX2JvdW5kIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9vc2VfY2FsaWJyYXRpb25fYm91bmQgPSAoYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS5sb29zZV9jYWxpYnJhdGlvbl9ib3VuZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS5mc3IiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mc3IgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUuZnNyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLnR3ZG1fY2hhbm5lbF9jb3VudCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR3ZG1fY2hhbm5lbF9jb3VudCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS50d2RtX2NoYW5uZWxfY291bnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zeXN0ZW1fcHJvZmlsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5c3RlbV9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgc3lzdGVtX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgc3lzdGVtX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyciBtdXN0IGhhdmUgOCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci52ZXJzaW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci52ZXJzaW9uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnZlcnNpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX2luZGV4Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX2luZGV4IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmNoYW5uZWxfaW5kZXggPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5kc19mcmVxdWVuY3lfb2Zmc2V0LnNpZ24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLmRzX2ZyZXF1ZW5jeV9vZmZzZXQuc2lnbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kc19mcmVxdWVuY3lfb2Zmc2V0LnNpZ24gPSAoYmNtb2x0X3NpZ24pIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5kc19mcmVxdWVuY3lfb2Zmc2V0LnZhbHVlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5kc19mcmVxdWVuY3lfb2Zmc2V0LnZhbHVlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmRzX2ZyZXF1ZW5jeV9vZmZzZXQudmFsdWUgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX3BhcnRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuY2hhbm5lbF9wYXJ0aXRpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uY2hhbm5lbF9wYXJ0aXRpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51d2xjaF9pZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIudXdsY2hfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0udXdsY2hfaWQgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51c19mcmVxdWVuY3kiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLnVzX2ZyZXF1ZW5jeSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS51c19mcmVxdWVuY3kgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51c19yYXRlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51c19yYXRlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnVzX3JhdGUgPSAoYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5kZWZhdWx0X29udV9hdHRlbnVhdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5yZXNwb25zZV90aHJlc2hvbGQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLnJlc3BvbnNlX3RocmVzaG9sZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5yZXNwb25zZV90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51c19saW5rX3R5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLnVzX2xpbmtfdHlwZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS51c19saW5rX3R5cGUgPSAoYmNtb2x0X2xpbmtfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLmlzX3ZhbGlkIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5pc192YWxpZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5pc192YWxpZCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBjaGFubmVsX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQ0hBTk5FTCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9DSEFOTkVMX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBjaGFubmVsX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBjaGFubmVsLCBjaGFubmVsX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgY2hhbm5lbF9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGNoYW5uZWwsIHRvbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGNoYW5uZWwsIHN5c3RlbV9wcm9maWxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgY2hhbm5lbCwgY2hhbm5lbF9wcm9maWxlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGNoYW5uZWwsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZWJ1Z19vcGVyX2NsaV9pbnB1dF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfY2xpX2lucHV0IG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19jbGlfaW5wdXQgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIGNsaV9pbnB1dCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZWJ1ZywgY2xpX2lucHV0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRhdGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91OF9saXN0X3UzMiB2YWwgPSB7IH07CisgICAgICAgIHZhbC5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmxlbik7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmFsLCB2YWwubGVuKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRlYnVnLCBjbGlfaW5wdXQsIGRhdGEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdThfbGlzdF91MzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVCVUdfT1BFUl9JRF9DTElfSU5QVVQsIEJDTU9MVF9ERUJVR19DTElfSU5QVVRfSURfREFUQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGVidWcsIGNsaV9pbnB1dCwgZGF0YSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgdWludDhfdCAqbGlzdF9tZW07ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbnNvbGVfcmVkaXJlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGNvbnNvbGVfcmVkaXJlY3Rpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluZGljYXRpb25zX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBpbmRpY2F0aW9uc19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGluZGljYXRpb25zX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfdXNlZF9wZXJjZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgZmlsZV91c2VkX3BlcmNlbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgZmlsZV91c2VkX3BlcmNlbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2NmZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2NmZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9jZmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfc3RhdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfc3RhdHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGVidWcsIGNvbnNvbGVfcmVkaXJlY3Rpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRlYnVnLCBpbmRpY2F0aW9uc19kcm9wcGVkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZWJ1ZywgZmlsZV91c2VkX3BlcmNlbnQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9jZmcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9zdGF0cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogc2V0IG1lbW9yeSB0byB1c2UgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgbGlzdF9tZW0gPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGlmIChsaXN0X21lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJsaXN0X21lbSA9IGJjbW9zX2NhbGxvYyhBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworICAgIEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGRlYnVnLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZGVidWcsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbnNvbGVfcmVkaXJlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGNvbnNvbGVfcmVkaXJlY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGNvbnNvbGVfcmVkaXJlY3Rpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYXBpX2NhcHR1cmVfY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSAoYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYnVmZmVyX3NpemVfYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcGlfY2FwdHVyZV9jZmcuYnVmZmVyX3NpemVfYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcGlfY2FwdHVyZV9jZmcuYnVmZmVyX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idWZmZXJfbW9kZSA9IChiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcGlfY2FwdHVyZV9jZmcuYnVmZmVyX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLm9mZnNldCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9mZnNldCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLm9mZnNldCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLnNpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQuc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RlYnVnX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGVidWdfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZWJ1Z19jZmcgY2ZnOyAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jb25zb2xlX3JlZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFQlVHX0NGR19JRF9DT05TT0xFX1JFRElSRUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uc29sZV9yZWRpcmVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaW5kaWNhdGlvbnNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERUJVR19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluZGljYXRpb25zX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZpbGVfdXNlZF9wZXJjZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGZpbGVfdXNlZF9wZXJjZW50LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBmaWxlX3VzZWRfcGVyY2VudCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERUJVR19DRkdfSURfRklMRV9VU0VEX1BFUkNFTlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX3VzZWRfcGVyY2VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBmaWxlX3VzZWRfcGVyY2VudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgZmlsZV91c2VkX3BlcmNlbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYXBpX2NhcHR1cmVfY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2NmZy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gKGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9jZmcubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYnVmZmVyX3NpemVfYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2NmZy5idWZmZXJfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1ZmZlcl9tb2RlID0gKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9jZmcuYnVmZmVyX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBpX2NhcHR1cmVfY2ZnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX2NmZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX3N0YXRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXBpX2NhcHR1cmVfc3RhdHMuYnVmZmVyX3VzZWRfYnl0ZXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idWZmZXJfdXNlZF9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5idWZmZXJfdXNlZF9ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5idWZmZXJfd3JhcF9jb3VudCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1ZmZlcl93cmFwX2NvdW50ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwaV9jYXB0dXJlX3N0YXRzLmJ1ZmZlcl93cmFwX2NvdW50IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX3N0YXRzLmV2ZW50c19yZWNvcmRlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmV2ZW50c19yZWNvcmRlZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfcmVjb3JkZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXBpX2NhcHR1cmVfc3RhdHMuZXZlbnRzX2Ryb3BwZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ldmVudHNfZHJvcHBlZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfZHJvcHBlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5yZWFkYWJsZV9ieXRlcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlYWRhYmxlX2J5dGVzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwaV9jYXB0dXJlX3N0YXRzLnJlYWRhYmxlX2J5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX3N0YXRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX1NUQVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX3N0YXRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBpX2NhcHR1cmVfc3RhdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfc3RhdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX3N0YXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5vZmZzZXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vZmZzZXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQub2Zmc2V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLnNpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLnNpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2J1ZmZlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTMyIHZhbCA9IHsgfTsKKyAgICAgICAgdmFsLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwubGVuKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52YWwsIHZhbC5sZW4pOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdThfbGlzdF91MzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGVidWcsIGNvbnNvbGVfcmVkaXJlY3Rpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRlYnVnLCBmaWxlX3VzZWRfcGVyY2VudCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRlYnVnLCBhcGlfY2FwdHVyZV9jZmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfc3RhdHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX29wZXJfc3RhcnRfYXBpX2NhcHR1cmVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmUgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIHN0YXJ0X2FwaV9jYXB0dXJlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRlYnVnLCBzdGFydF9hcGlfY2FwdHVyZSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZWJ1Z19vcGVyX3N0b3BfYXBpX2NhcHR1cmVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZSBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIHN0b3BfYXBpX2NhcHR1cmUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIHN0b3BfYXBpX2NhcHR1cmUsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGVidWdfb3Blcl9yZXNldF9hcGlfY2FwdHVyZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZSBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZWJ1ZywgcmVzZXRfYXBpX2NhcHR1cmUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIHJlc2V0X2FwaV9jYXB0dXJlLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBkZWJ1Zywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGlfb3V0cHV0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGVidWcsIGNsaV9vdXRwdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGVidWcsIGNsaV9vdXRwdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfYWxtb3N0X2Z1bGwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgZmlsZV9hbG1vc3RfZnVsbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgZmlsZV9hbG1vc3RfZnVsbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGVidWcsIGNsaV9vdXRwdXQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgZmlsZV9hbG1vc3RfZnVsbCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBkZWJ1Zywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGlfb3V0cHV0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGVidWcsIGNsaV9vdXRwdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRlYnVnLCBjbGlfb3V0cHV0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfQ0xJX09VVFBVVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfYWxtb3N0X2Z1bGwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgZmlsZV9hbG1vc3RfZnVsbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGVidWcsIGZpbGVfYWxtb3N0X2Z1bGwsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9GSUxFX0FMTU9TVF9GVUxMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2VfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1lbW9yeSBidWZmZXIgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDhfdCogbGlzdF9tZW07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGV2aWNlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5c3RlbV9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBzeXN0ZW1fbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2VlcGFsaXZlX2ludGVydmFsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZWVwYWxpdmVfdG9sZXJhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpcm13YXJlX3N3X3ZlcnNpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaG9zdF9zd192ZXJzaW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGhvc3Rfc3dfdmVyc2lvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgaG9zdF9zd192ZXJzaW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGlwX3JldmlzaW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfcmV2aXNpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfcmV2aXNpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIHN0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBzdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZGVidWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGRlYnVnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJubmlfc3BlZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgbm5pX3NwZWVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBubmlfc3BlZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uX3NoYXBpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBpbmRpY2F0aW9uX3NoYXBpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoaXBfdGVtcGVyYXR1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgY2hpcF90ZW1wZXJhdHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgY2hpcF90ZW1wZXJhdHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncG9uX3hncG9uX3RvZF9ncGlvX3BpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9ncGlvX3Bpbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX3NoYXBlcl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVtYmVkZGVkX2ltYWdlX2xpc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hpcF92b2x0YWdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfdm9sdGFnZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgY2hpcF92b2x0YWdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX3RvZF9zdHJpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBlcG9uX3RvZF9zdHJpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInhncG9uX251bV9vZl9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCB4Z3Bvbl9udW1fb2Zfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlX2lwX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX2lwX2FkZHJlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfdWRwX3BvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX3VkcF9wb3J0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBkZXZpY2VfdWRwX3BvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvZF91YXJ0X2JhdWRyYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgc3lzdGVtX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgY2hpcF9yZXZpc2lvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBzdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBkZWJ1ZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBubmlfc3BlZWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfdGVtcGVyYXR1cmUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBjaGlwX3ZvbHRhZ2UpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZGV2aWNlLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZGV2aWNlLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2VfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGV2aWNlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZXZpY2UsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfc3lzdGVtX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgc3lzdGVtX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1lTVEVNX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZWVwYWxpdmVfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX0lOVEVSVkFMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2VlcGFsaXZlX3RvbGVyYW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfdG9sZXJhbmNlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9UT0xFUkFOQ0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcuaG9zdF9kbWFfcnhfcXVldWVfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcuaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy5ob3N0X2RtYV90eF9xdWV1ZV9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcuYXZzX2NvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hdnNfY29udHJvbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWcuYXZzX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Zy51c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXNlX3ByZXZfcG9uX3NlcmRlc19maXJtd2FyZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWcudXNlX3ByZXZfcG9uX3NlcmRlc19maXJtd2FyZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnLnVzZV9wcmV2X25uaV9zZXJkZXNfZmlybXdhcmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c2VfcHJldl9ubmlfc2VyZGVzX2Zpcm13YXJlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy51c2VfcHJldl9ubmlfc2VyZGVzX2Zpcm13YXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBkZWJ1ZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRlYnVnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5uaV9zcGVlZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJubmlfc3BlZWQuZmlyc3RfaGFsZiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZpcnN0X2hhbGYgPSAoYmNtb2x0X25uaV9zcGVlZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5uaV9zcGVlZC5maXJzdF9oYWxmIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm5pX3NwZWVkLnNlY29uZF9oYWxmIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2Vjb25kX2hhbGYgPSAoYmNtb2x0X25uaV9zcGVlZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5uaV9zcGVlZC5zZWNvbmRfaGFsZiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgbm5pX3NwZWVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9OTklfU1BFRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIG5uaV9zcGVlZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9leHRfaXJxIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9leHRfaXJxKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19FWFRfSVJRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX1NBTVBMRV9ERUxBWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJpbmRpY2F0aW9uX3NoYXBpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uX3NoYXBpbmcuZW5hYmxlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVuYWJsZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImluZGljYXRpb25fc2hhcGluZy5lbmFibGVkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5kaWNhdGlvbl9zaGFwaW5nLm1heF9yYXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X3JhdGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbmRpY2F0aW9uX3NoYXBpbmcubWF4X3JhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uX3NoYXBpbmcubWF4X2J1cnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2J1cnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5kaWNhdGlvbl9zaGFwaW5nLm1heF9idXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0VOQUJMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX2dwaW9fcGluIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bpb19waW4gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9ncGlvX3BpbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9DT05ORUNURURfSU5URVJOQUxMWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdHJfMjU2IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdC5zdHIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHZhbC5zdHIsIDI1NiwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdHJfMjU2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl84MDIxX0FTX1RPRF9GT1JNQVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9zaGFwZXJfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NoYXBlcl9tb2RlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zaGFwZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9zaGFwZXJfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9TSEFQRVJfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uX3RvZF9zdHJpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RyXzI1NiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl90b2Rfc3RyaW5nLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLnN0ciwgMjU2LCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX3RvZF9zdHJpbmcuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uX3RvZF9zdHJpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RyXzI1NiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAieGdwb25fbnVtX29mX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fbnVtX29mX29udXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfaXBfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gYXBpY2xpX3VudW1iZXJfdG9faXB2NChjbGlfcGFybS0+dmFsdWUudW51bWJlcik7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBkZXZpY2VfaXBfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9JUF9BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlX3VkcF9wb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX3VkcF9wb3J0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX3VkcF9wb3J0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9VRFBfUE9SVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvZF91YXJ0X2JhdWRyYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdWFydF9iYXVkcmF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdWFydF9iYXVkcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgdG9kX3VhcnRfYmF1ZHJhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGV2aWNlLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2VfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3lzdGVtX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfc3lzdGVtX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgc3lzdGVtX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1lTVEVNX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgc3lzdGVtX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBzeXN0ZW1fbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtlZXBhbGl2ZV9pbnRlcnZhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZWVwYWxpdmVfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtlZXBhbGl2ZV90b2xlcmFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfdG9sZXJhbmNlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX3RvbGVyYW5jZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfVE9MRVJBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2VlcGFsaXZlX3RvbGVyYW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwga2VlcGFsaXZlX3RvbGVyYW5jZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi5tYWpvciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1ham9yID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ubWFqb3IgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi5taW5vciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pbm9yID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ubWlub3IgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi5yZXZpc2lvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJldmlzaW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ucmV2aXNpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi5tb2RlbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGVsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ubW9kZWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi5idWlsZF90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwuYnVpbGRfdGltZSwgMzIsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5maXJtd2FyZV9zd192ZXJzaW9uLmJ1aWxkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaXJtd2FyZV9zd192ZXJzaW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBmaXJtd2FyZV9zd192ZXJzaW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5ob3N0X3N3X3ZlcnNpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfaG9zdF9zd192ZXJzaW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLm1ham9yIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFqb3IgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLm1ham9yIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmhvc3Rfc3dfdmVyc2lvbi5taW5vciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pbm9yID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmhvc3Rfc3dfdmVyc2lvbi5taW5vciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ob3N0X3N3X3ZlcnNpb24ucmV2aXNpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXZpc2lvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ob3N0X3N3X3ZlcnNpb24ucmV2aXNpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLm1vZGVsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubW9kZWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLm1vZGVsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmhvc3Rfc3dfdmVyc2lvbi5idWlsZF90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwuYnVpbGRfdGltZSwgMzIsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ob3N0X3N3X3ZlcnNpb24uYnVpbGRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgaG9zdF9zd192ZXJzaW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgaG9zdF9zd192ZXJzaW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaG9zdF9zd192ZXJzaW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jaGlwX3JldmlzaW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBjaGlwX3JldmlzaW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgY2hpcF9yZXZpc2lvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hpcF9yZXZpc2lvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF9yZXZpc2lvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGNoaXBfcmV2aXNpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RldmljZV9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZGV2aWNlX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBzdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHN0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIHN0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnLmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcuaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWcuaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Zy5hdnNfY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF2c19jb250cm9sID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWcuYXZzX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcudXNlX3ByZXZfcG9uX3NlcmRlc19maXJtd2FyZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmUgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy51c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLnVzZV9wcmV2X25uaV9zZXJkZXNfZmlybXdhcmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c2VfcHJldl9ubmlfc2VyZGVzX2Zpcm13YXJlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWcudXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfZGV2aWNlX2NmZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBkZWJ1ZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBkZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGRlYnVnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm5uaV9zcGVlZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX3NwZWVkLmZpcnN0X2hhbGYiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5maXJzdF9oYWxmID0gKGJjbW9sdF9ubmlfc3BlZWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubm5pX3NwZWVkLmZpcnN0X2hhbGYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX3NwZWVkLnNlY29uZF9oYWxmIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2Vjb25kX2hhbGYgPSAoYmNtb2x0X25uaV9zcGVlZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ubmlfc3BlZWQuc2Vjb25kX2hhbGYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIG5uaV9zcGVlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfTk5JX1NQRUVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBubmlfc3BlZWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJubmlfc3BlZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIG5uaV9zcGVlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIG5uaV9zcGVlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9leHRfaXJxIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9leHRfaXJxKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19FWFRfSVJRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuaW5kaWNhdGlvbl9zaGFwaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmluZGljYXRpb25fc2hhcGluZy5lbmFibGVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZW5hYmxlZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmluZGljYXRpb25fc2hhcGluZy5lbmFibGVkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmluZGljYXRpb25fc2hhcGluZy5tYXhfcmF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9yYXRlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmluZGljYXRpb25fc2hhcGluZy5tYXhfcmF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5pbmRpY2F0aW9uX3NoYXBpbmcubWF4X2J1cnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2J1cnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmluZGljYXRpb25fc2hhcGluZy5tYXhfYnVyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluZGljYXRpb25fc2hhcGluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hpcF90ZW1wZXJhdHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfdGVtcGVyYXR1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBjaGlwX3RlbXBlcmF0dXJlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGlwX3RlbXBlcmF0dXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBjaGlwX3RlbXBlcmF0dXJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF90ZW1wZXJhdHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmdwb25feGdwb25fdG9kX2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncG9uX3hncG9uX3RvZF9lbmFibGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmdwb25feGdwb25fdG9kX2dwaW9fcGluIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bpb19waW4gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9ncGlvX3BpbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0NPTk5FQ1RFRF9JTlRFUk5BTExZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RyXzI1NiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fODAyMV9hc190b2RfZm9ybWF0LnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLnN0ciwgMjU2LCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdHJfMjU2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl84MDIxX0FTX1RPRF9GT1JNQVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX3NoYXBlcl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc2hhcGVyX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3NoYXBlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uX3NoYXBlcl9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9zaGFwZXJfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9zaGFwZXJfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl9zaGFwZXJfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZW1iZWRkZWRfaW1hZ2VfbGlzdC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVtYmVkZGVkX2ltYWdlX2xpc3QuaW1hZ2VfdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LmltYWdlX3R5cGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLmltYWdlX3R5cGUgPSAoYmNtb2x0X2RldmljZV9pbWFnZV90eXBlKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVtYmVkZGVkX2ltYWdlX2xpc3QuaW1hZ2Vfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LmltYWdlX3NpemUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLmltYWdlX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW1iZWRkZWRfaW1hZ2VfbGlzdC5jcmMzMiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LmNyYzMyIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5jcmMzMiA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LnN0YXR1cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LnN0YXR1cyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0uc3RhdHVzID0gKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW1iZWRkZWRfaW1hZ2VfbGlzdC5pbWFnZV9uYW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVtYmVkZGVkX2ltYWdlX2xpc3QuaW1hZ2VfbmFtZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc25wcmludGYodmFsLnZhbFtpMF0uaW1hZ2VfbmFtZSwgNjQsICIlcyIsIGNsaV9wYXJtLT52YWx1ZXNbaTBdLnN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRU1CRURERURfSU1BR0VfTElTVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVtYmVkZGVkX2ltYWdlX2xpc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGVtYmVkZGVkX2ltYWdlX2xpc3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBlbWJlZGRlZF9pbWFnZV9saXN0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hpcF92b2x0YWdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgY2hpcF92b2x0YWdlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgY2hpcF92b2x0YWdlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVk9MVEFHRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoaXBfdm9sdGFnZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF92b2x0YWdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF92b2x0YWdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVwb25fdG9kX3N0cmluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdHJfMjU2IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl90b2Rfc3RyaW5nLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLnN0ciwgMjU2LCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl90b2Rfc3RyaW5nLnN0ciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0cl8yNTYgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1RPRF9TVFJJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fdG9kX3N0cmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIueGdwb25fbnVtX29mX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fbnVtX29mX29udXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ4Z3Bvbl9udW1fb2Zfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCB4Z3Bvbl9udW1fb2Zfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRldmljZV9pcF9hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBhcGljbGlfdW51bWJlcl90b19pcHY0KGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyKTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX2lwX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX0lQX0FERFJFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfaXBfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZGV2aWNlX2lwX2FkZHJlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBkZXZpY2VfaXBfYWRkcmVzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRldmljZV91ZHBfcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfdWRwX3BvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnRvZF91YXJ0X2JhdWRyYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdWFydF9iYXVkcmF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdWFydF9iYXVkcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgdG9kX3VhcnRfYmF1ZHJhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvZF91YXJ0X2JhdWRyYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIHN5c3RlbV9tb2RlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGhvc3Rfc3dfdmVyc2lvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF9yZXZpc2lvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGRlYnVnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBubmlfc3BlZWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBjaGlwX3RlbXBlcmF0dXJlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9lbmFibGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGVtYmVkZGVkX2ltYWdlX2xpc3QpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGNoaXBfdm9sdGFnZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCB4Z3Bvbl9udW1fb2Zfb251cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgZGV2aWNlX2lwX2FkZHJlc3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgdG9kX3VhcnRfYmF1ZHJhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9jb25uZWN0X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9jb25uZWN0IG9wZXI7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2Nvbm5lY3Qgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgY29ubmVjdCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGNvbm5lY3QsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfZGlzY29ubmVjdF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdCBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9kaXNjb25uZWN0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGRpc2Nvbm5lY3QsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBkaXNjb25uZWN0LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RldmljZV9vcGVyX3Jlc2V0X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX3Jlc2V0IG9wZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2VfcmVzZXQgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgcmVzZXQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCByZXNldCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGV2aWNlX3Jlc2V0X21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RldmljZV9yZXNldF9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIHJlc2V0LCBtb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCByZXNldCwgbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JFU0VULCBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9ob3N0X2tlZXBfYWxpdmVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBob3N0X2tlZXBfYWxpdmUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBob3N0X2tlZXBfYWxpdmUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VxdWVuY2VfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBob3N0X2tlZXBfYWxpdmUsIHNlcXVlbmNlX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaG9zdF9rZWVwX2FsaXZlLCBzZXF1ZW5jZV9udW1iZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkUsIEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpbWVfc3RhbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGhvc3Rfa2VlcF9hbGl2ZSwgdGltZV9zdGFtcCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaG9zdF9rZWVwX2FsaXZlLCB0aW1lX3N0YW1wLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfSE9TVF9LRUVQX0FMSVZFLCBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfc3dfdXBncmFkZV9hY3RpdmF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZSBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBzd191cGdyYWRlX2FjdGl2YXRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgc3dfdXBncmFkZV9hY3RpdmF0ZSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9pbWFnZV90cmFuc2Zlcl9zdGFydF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW1hZ2VfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgaW1hZ2VfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGltYWdlX3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9TVEFSVCwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW1hZ2Vfc2l6ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGltYWdlX3NpemUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBpbWFnZV9zaXplLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQsIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfU0laRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNyYzMyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgY3JjMzIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBjcmMzMiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX1NUQVJULCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0NSQzMyLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImltYWdlX25hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RyXzY0IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbWFnZV9uYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLnN0ciwgNjQsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImltYWdlX25hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBpbWFnZV9uYW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0cl82NCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQsIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfTkFNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgaW1hZ2VfbmFtZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RldmljZV9vcGVyX2ltYWdlX3RyYW5zZmVyX2RhdGFfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2RhdGEsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJsb2NrX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwgYmxvY2tfbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBibG9ja19udW1iZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBLCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfQkxPQ0tfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibW9yZV9kYXRhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwgbW9yZV9kYXRhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBtb3JlX2RhdGEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBLCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfTU9SRV9EQVRBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCB2YWwgPSB7IH07CisgICAgICAgIHZhbC5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmxlbik7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmFsLCB2YWwubGVuKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwgZGF0YSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91OF9saXN0X3UxNl9oZXggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX0RBVEEsIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2RhdGEsIGRhdGEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9ydW5fZGRyX3Rlc3Rfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0IG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBydW5fZGRyX3Rlc3QsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBydW5fZGRyX3Rlc3QsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY3B1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgcnVuX2Rkcl90ZXN0LCBjcHUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIHJ1bl9kZHJfdGVzdCwgY3B1LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfUlVOX0REUl9URVNULCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9DUFUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYXNfMCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIHJ1bl9kZHJfdGVzdCwgcmFzXzAsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIHJ1bl9kZHJfdGVzdCwgcmFzXzAsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SVU5fRERSX1RFU1QsIEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18wLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFzXzEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBydW5fZGRyX3Rlc3QsIHJhc18xLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBydW5fZGRyX3Rlc3QsIHJhc18xLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfUlVOX0REUl9URVNULCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RldmljZV9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2VfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29ubmVjdGlvbl9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgY29ubmVjdGlvbl9jb21wbGV0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fY29tcGxldGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbm5lY3Rpb25fZXN0YWJsaXNoZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZXN0YWJsaXNoZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2VzdGFibGlzaGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25uZWN0aW9uX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGRyX3Rlc3RfY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRkcl90ZXN0X2NvbXBsZXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgZGRyX3Rlc3RfY29tcGxldGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZV9rZWVwX2FsaXZlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2Vfa2VlcF9hbGl2ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRldmljZV9rZWVwX2FsaXZlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfcmVhZHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRldmljZV9yZWFkeSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRldmljZV9yZWFkeSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzY29ubmVjdGlvbl9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgZGlzY29ubmVjdGlvbl9jb21wbGV0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2NvbXBsZXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uc19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbmRpY2F0aW9uc19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgaW5kaWNhdGlvbnNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3dfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIHN3X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN3X2V4Y2VwdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXhjZXB0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fY29tcGxldGUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZXN0YWJsaXNoZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGRldmljZSwgZGRyX3Rlc3RfY29tcGxldGUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRldmljZV9rZWVwX2FsaXZlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2VfcmVhZHkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2NvbXBsZXRlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbmRpY2F0aW9uc19kcm9wcGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBzd19lcnJvcikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXhjZXB0aW9uKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2VfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfYXV0b19jZmcgYXV0b19jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGV2aWNlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGV2aWNlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbm5lY3Rpb25fY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fY29tcGxldGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgY29ubmVjdGlvbl9jb21wbGV0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9DT01QTEVURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbm5lY3Rpb25fZXN0YWJsaXNoZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZXN0YWJsaXNoZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgY29ubmVjdGlvbl9lc3RhYmxpc2hlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbm5lY3Rpb25fZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgY29ubmVjdGlvbl9mYWlsdXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZmFpbHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9GQUlMVVJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGRyX3Rlc3RfY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRkcl90ZXN0X2NvbXBsZXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRkcl90ZXN0X2NvbXBsZXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERFJfVEVTVF9DT01QTEVURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZV9rZWVwX2FsaXZlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2Vfa2VlcF9hbGl2ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2Vfa2VlcF9hbGl2ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX0tFRVBfQUxJVkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfcmVhZHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRldmljZV9yZWFkeSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2VfcmVhZHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9SRUFEWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc2Nvbm5lY3Rpb25fY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgZGlzY29ubmVjdGlvbl9jb21wbGV0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRElTQ09OTkVDVElPTl9DT01QTEVURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uc19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbmRpY2F0aW9uc19kcm9wcGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGluZGljYXRpb25zX2Ryb3BwZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzd19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXJyb3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXJyb3IsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3dfZXhjZXB0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBzd19leGNlcHRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXhjZXB0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FWENFUFRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywgYWxhcm1fc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGFybV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGFybV9zdGF0ZSkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9kZW5pZWRfbGlua19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2RlbmllZF9saW5rX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUudW5rbm93bl9saW5rX3Zpb2xhdGlvbi4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnVua25vd25fbGlua192aW9sYXRpb24ubGlua19yYXRlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudW5rbm93bl9saW5rX3Zpb2xhdGlvbi5saW5rX3JhdGUgPSAoYmNtb2x0X2Vwb25fbGlua19yYXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS51bmtub3duX2xpbmtfdmlvbGF0aW9uLmxpbmtfcmF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS51bmtub3duX2xpbmtfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnVua25vd25fbGlua192aW9sYXRpb24uYWxhcm1fc3RhdHVzID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnVua25vd25fbGlua192aW9sYXRpb24uYWxhcm1fc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnVua25vd25fbGlua192aW9sYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUub3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm1heF9saW5rX3Zpb2xhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9saW5rX3Zpb2xhdGlvbiA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm1heF9saW5rX3Zpb2xhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmxhc2VyX29uX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmxhc2VyX29uX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24ubGFzZXJfb25fdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmxhc2VyX29mZl90aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubGFzZXJfb25fb2ZmX3Zpb2xhdGlvbi5sYXNlcl9vZmZfdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubGFzZXJfb25fb2ZmX3Zpb2xhdGlvbi5sYXNlcl9vZmZfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmxhc2VyX29uX29mZl92aW9sYXRpb24uYWxhcm1fc3RhdHVzID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24uYWxhcm1fc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24gPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yYW5nZV92aW9sYXRpb24uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yYW5nZV92aW9sYXRpb24ucmFuZ2UiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5nZV92aW9sYXRpb24ucmFuZ2UgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJhbmdlX3Zpb2xhdGlvbi5yYW5nZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yYW5nZV92aW9sYXRpb24uYWxhcm1fc3RhdHVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2VfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5yYW5nZV92aW9sYXRpb24uYWxhcm1fc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJhbmdlX3Zpb2xhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS50ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGRtX2NoYW5uZWxzX2V4aGF1c3RlZCA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnRkbV9jaGFubmVsc19leGhhdXN0ZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJvZ3VlX3Zpb2xhdGlvbi4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJvZ3VlX3Zpb2xhdGlvbi5kZW5pZWRfbGxpZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJvZ3VlX3Zpb2xhdGlvbi5kZW5pZWRfbGxpZCA9IChiY21vbHRfZXBvbl9sbGlkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJvZ3VlX3Zpb2xhdGlvbi5kZW5pZWRfbGxpZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24uZGVuaWVkX3JhbmdlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucm9ndWVfdmlvbGF0aW9uLmRlbmllZF9yYW5nZSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUucm9ndWVfdmlvbGF0aW9uLmRlbmllZF9yYW5nZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24uYWxhcm1fc3RhdHVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucm9ndWVfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24uYWxhcm1fc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJvZ3VlX3Zpb2xhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS51cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGFybV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGFsYXJtX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2RlbmllZF9saW5rLCBhbGFybV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2RlbmllZF9saW5rLCBhbGFybV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9kZW5pZWRfbGluaywgYWxhcm1fc3RhdGUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9kZW5pZWRfbGluaywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2RlbmllZF9saW5rLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxhc2VyX29uX29mZl92aW9sYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X2xpbmtfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbWF4X2xpbmtfdmlvbGF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIG1heF9saW5rX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2VfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgcmFuZ2VfdmlvbGF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJhbmdlX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgcm9ndWVfdmlvbGF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJvZ3VlX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGRtX2NoYW5uZWxzX2V4aGF1c3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHRkbV9jaGFubmVsc19leGhhdXN0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5rbm93bl9saW5rX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVua25vd25fbGlua192aW9sYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdW5rbm93bl9saW5rX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBtYXhfbGlua192aW9sYXRpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJhbmdlX3Zpb2xhdGlvbikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJvZ3VlX3Zpb2xhdGlvbikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdW5rbm93bl9saW5rX3Zpb2xhdGlvbikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24pKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9saW5rX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIG1heF9saW5rX3Zpb2xhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbWF4X2xpbmtfdmlvbGF0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX01BWF9MSU5LX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIG92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2VfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgcmFuZ2VfdmlvbGF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCByYW5nZV92aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVklPTEFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgcm9ndWVfdmlvbGF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCByb2d1ZV92aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUk9HVUVfVklPTEFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRkbV9jaGFubmVsc19leGhhdXN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1bmtub3duX2xpbmtfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdW5rbm93bl9saW5rX3Zpb2xhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdW5rbm93bl9saW5rX3Zpb2xhdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlua19yYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGxpbmtfcmF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGlua19yYXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZV9mbGFncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBzdGF0ZV9mbGFncyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgc3RhdGVfZmxhZ3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxsaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGxpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGxpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFzZXJfb25fdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vbl90aW1lX3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vbl90aW1lX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYXNlcl9vZmZfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vZmZfdGltZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGFzZXJfb2ZmX3RpbWVfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdlX3ZhbHVlX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCByYW5nZV92YWx1ZV90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgZGlzdGFuY2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGRpc3RhbmNlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBhbGFybV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1bm5lbF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHR1bm5lbF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIG9udV9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fbGFzZXJfb3ZlcmhlYWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBtaW5fbGFzZXJfb3ZlcmhlYWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb25maWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfZW5hYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGZlY19lbmFibGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGZlY19lbmFibGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIG9hbV9oZWFydGJlYXRfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBvYW1faGVhcnRiZWF0X2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1YmRfaW5mbyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCB1YmRfaW5mbyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgdWJkX2luZm8pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsb2NrX3RyYW5zcG9ydF9lbmFibGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGVuZGluZ19ncmFudHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgcGVuZGluZ19ncmFudHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHBlbmRpbmdfZ3JhbnRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGlua190eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBsaW5rX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBsaW5rX3JhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgc3RhdGVfZmxhZ3MpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgbGxpZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vbl90aW1lX3RxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxhc2VyX29mZl90aW1lX3RxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX3RxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGRpc3RhbmNlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGFsYXJtX3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHR1bm5lbF9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBvbnVfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGZlY19lbmFibGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHViZF9pbmZvKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgcGVuZGluZ19ncmFudHMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgbGlua190eXBlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZXBvbl9saW5rLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZXBvbl9saW5rLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1bm5lbF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fdHVubmVsX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX3R1bm5lbF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVFVOTkVMX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibWluX2xhc2VyX292ZXJoZWFkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29uX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXNlcl9vbl90aW1lID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29uX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fbGFzZXJfb3ZlcmhlYWQubGFzZXJfb2ZmX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXNlcl9vZmZfdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1pbl9sYXNlcl9vdmVyaGVhZC5sYXNlcl9vZmZfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb25maWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY29uZmlnLm9hbV90eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub2FtX3R5cGUgPSAoYmNtb2x0X2Vwb25fb2FtX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJrZXlfZXhjaGFuZ2VfY29uZmlnLm9hbV90eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2NvbmZpZy5wZXJpb2QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wZXJpb2QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJrZXlfZXhjaGFuZ2VfY29uZmlnLnBlcmlvZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb25maWcuZGlyZWN0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGlyZWN0aW9uID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAia2V5X2V4Y2hhbmdlX2NvbmZpZy5kaXJlY3Rpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd25zdHJlYW1fbW9kZSA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fa2V5X2Nob2ljZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd25zdHJlYW1fa2V5X2Nob2ljZSA9IChiY21vbHRfZXBvbl9rZXlfY2hvaWNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fa2V5X2Nob2ljZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY2ZiLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kgbXVzdCBoYXZlIDggYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jdHIuc2NpLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnNjaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbV9tb2RlID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2tleV9jaG9pY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbV9rZXlfY2hvaWNlID0gKGJjbW9sdF9lcG9uX2tleV9jaG9pY2UpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fa2V5X2Nob2ljZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jZmIua2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnNjaSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kgbXVzdCBoYXZlIDggYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLnNjaSwgOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uc2NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBlcG9uX2VuY3J5cHRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZlY19lbmFibGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2VuYWJsZS51cHN0cmVhbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVwc3RyZWFtID0gKGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmVjX2VuYWJsZS51cHN0cmVhbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19lbmFibGUuZG93bnN0cmVhbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd25zdHJlYW0gPSAoYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmZWNfZW5hYmxlLmRvd25zdHJlYW0gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGZlY19lbmFibGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2ZlY19lbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0ZFQ19FTkFCTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGZlY19lbmFibGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib2FtX2hlYXJ0YmVhdF9jb25maWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnLnNlbmRfcGVyaW9kIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2VuZF9wZXJpb2QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5zZW5kX3BlcmlvZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnLnRyYW5zbWl0X2ZyYW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJhbnNtaXRfZnJhbWUubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgICAgICB2YWwudHJhbnNtaXRfZnJhbWUudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwudHJhbnNtaXRfZnJhbWUubGVuKTsKKyAgICAgICAgICAgIGlmICh2YWwudHJhbnNtaXRfZnJhbWUudmFsID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudHJhbnNtaXRfZnJhbWUudmFsLCB2YWwudHJhbnNtaXRfZnJhbWUubGVuKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYW1faGVhcnRiZWF0X2NvbmZpZy50cmFuc21pdF9mcmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMubGVuKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMudmFsID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy52YWwsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLmxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy52YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMudmFsLCB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLmxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnLnJlY2VpdmVfdGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlY2VpdmVfdGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9hbV9oZWFydGJlYXRfY29uZmlnLnJlY2VpdmVfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnLm1heGltdW1fcmVjZWl2ZV9zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4aW11bV9yZWNlaXZlX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5tYXhpbXVtX3JlY2VpdmVfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9sbGluZ19pbnRlcnZhbF91cyA9IChiY21vbHRfcG9sbGluZ19pbnRlcnZhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLmdyYW50X3RocmVzaG9sZF90cSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdyYW50X3RocmVzaG9sZF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC5ncmFudF90aHJlc2hvbGRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyA9IChiY21vbHRfYmFuZHdpZHRoX0ticHMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfc2l6ZV90cSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRkbV9ncmFudF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9pbnRlcnZhbF91cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRkbV9ncmFudF9pbnRlcnZhbF91cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB1cHN0cmVhbV9iYW5kd2lkdGgsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbG9ja190cmFuc3BvcnRfZW5hYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBjbG9ja190cmFuc3BvcnRfZW5hYmxlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9FTkFCTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxpbmtfcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19yYXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGlua19yYXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGlua19yYXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGlua19yYXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGlua19yYXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3RhdGVfZmxhZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgc3RhdGVfZmxhZ3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBzdGF0ZV9mbGFncywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9TVEFURV9GTEFHUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlX2ZsYWdzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBzdGF0ZV9mbGFncyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIHN0YXRlX2ZsYWdzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGxpZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9sbGlkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxsaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBsbGlkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xMSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsbGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGxpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhc2VyX29uX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGFzZXJfb25fdGltZV90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxhc2VyX29uX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhc2VyX29uX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGxhc2VyX29uX3RpbWVfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsYXNlcl9vbl90aW1lX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFzZXJfb2ZmX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGFzZXJfb2ZmX3RpbWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vZmZfdGltZV90cSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MQVNFUl9PRkZfVElNRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhc2VyX29mZl90aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsYXNlcl9vZmZfdGltZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGxhc2VyX29mZl90aW1lX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2VfdmFsdWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgcmFuZ2VfdmFsdWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCByYW5nZV92YWx1ZV90cSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9SQU5HRV9WQUxVRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdlX3ZhbHVlX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCByYW5nZV92YWx1ZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGlzdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tZXRlcnMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X21ldGVycykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBkaXN0YW5jZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGRpc3RhbmNlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0RJU1RBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGRpc3RhbmNlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgZGlzdGFuY2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUua2V5X2V4Y2hhbmdlX2ZhaWx1cmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5rZXlfZXhjaGFuZ2VfZmFpbHVyZSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmtleV9leGNoYW5nZV9mYWlsdXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmludmFsaWRfbXBjcF9yZXBvcnRfcmVjZWl2ZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuaW52YWxpZF9tcGNwX3JlcG9ydF9yZWNlaXZlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5tcGNwX3JlcG9ydF90aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubXBjcF9yZXBvcnRfdGltZW91dCA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm1wY3BfcmVwb3J0X3RpbWVvdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUub2FtX2tlZXBhbGl2ZV90aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub2FtX2tlZXBhbGl2ZV90aW1lb3V0ID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUub2FtX2tlZXBhbGl2ZV90aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBhbGFybV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgYWxhcm1fc3RhdGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgYWxhcm1fc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBhbGFybV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR1bm5lbF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fdHVubmVsX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX3R1bm5lbF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVFVOTkVMX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVubmVsX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCB0dW5uZWxfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCB0dW5uZWxfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09OVV9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgb251X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm1pbl9sYXNlcl9vdmVyaGVhZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5taW5fbGFzZXJfb3ZlcmhlYWQubGFzZXJfb25fdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc2VyX29uX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29uX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29mZl90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzZXJfb2ZmX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29mZl90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBtaW5fbGFzZXJfb3ZlcmhlYWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTUlOX0xBU0VSX09WRVJIRUFELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBtaW5fbGFzZXJfb3ZlcmhlYWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fbGFzZXJfb3ZlcmhlYWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIG1pbl9sYXNlcl9vdmVyaGVhZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIG1pbl9sYXNlcl9vdmVyaGVhZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2VfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZV9jb25maWcub2FtX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vYW1fdHlwZSA9IChiY21vbHRfZXBvbl9vYW1fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2VfY29uZmlnLm9hbV90eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZV9jb25maWcucGVyaW9kIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucGVyaW9kID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZV9jb25maWcucGVyaW9kIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZV9jb25maWcuZGlyZWN0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGlyZWN0aW9uID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZV9jb25maWcuZGlyZWN0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kb3duc3RyZWFtX21vZGUgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fa2V5X2Nob2ljZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd25zdHJlYW1fa2V5X2Nob2ljZSA9IChiY21vbHRfZXBvbl9rZXlfY2hvaWNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2tleV9jaG9pY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY2ZiLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFI6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnNjaSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kgbXVzdCBoYXZlIDggYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jdHIuc2NpLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbV9tb2RlID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fa2V5X2Nob2ljZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVwc3RyZWFtX2tleV9jaG9pY2UgPSAoYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fa2V5X2Nob2ljZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jdHIua2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnNjaSBtdXN0IGhhdmUgOCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jdHIuc2NpLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uc2NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9FUE9OX0VOQ1JZUFRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmZlY19lbmFibGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZlY19lbmFibGUudXBzdHJlYW0iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbSA9IChiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5mZWNfZW5hYmxlLnVwc3RyZWFtIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZlY19lbmFibGUuZG93bnN0cmVhbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd25zdHJlYW0gPSAoYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZmVjX2VuYWJsZS5kb3duc3RyZWFtIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBmZWNfZW5hYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9GRUNfRU5BQkxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBmZWNfZW5hYmxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgZmVjX2VuYWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGZlY19lbmFibGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub2FtX2hlYXJ0YmVhdF9jb25maWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5zZW5kX3BlcmlvZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNlbmRfcGVyaW9kID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLnNlbmRfcGVyaW9kIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLnRyYW5zbWl0X2ZyYW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJhbnNtaXRfZnJhbWUubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgICAgICB2YWwudHJhbnNtaXRfZnJhbWUudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwudHJhbnNtaXRfZnJhbWUubGVuKTsKKyAgICAgICAgICAgIGlmICh2YWwudHJhbnNtaXRfZnJhbWUudmFsID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudHJhbnNtaXRfZnJhbWUudmFsLCB2YWwudHJhbnNtaXRfZnJhbWUubGVuKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub2FtX2hlYXJ0YmVhdF9jb25maWcudHJhbnNtaXRfZnJhbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMubGVuKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMudmFsID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy52YWwsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLmxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy5sZW4pOworICAgICAgICAgICAgICAgIGlmICh2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy52YWwsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub2FtX2hlYXJ0YmVhdF9jb25maWcucmVjZWl2ZV90aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVjZWl2ZV90aW1lb3V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLnJlY2VpdmVfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5tYXhpbXVtX3JlY2VpdmVfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heGltdW1fcmVjZWl2ZV9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLm1heGltdW1fcmVjZWl2ZV9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBvYW1faGVhcnRiZWF0X2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09BTV9IRUFSVEJFQVRfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBvYW1faGVhcnRiZWF0X2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBvYW1faGVhcnRiZWF0X2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIG9hbV9oZWFydGJlYXRfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLnBvbGxpbmdfaW50ZXJ2YWxfdXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2xsaW5nX2ludGVydmFsX3VzID0gKGJjbW9sdF9wb2xsaW5nX2ludGVydmFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5ncmFudF90aHJlc2hvbGRfdHEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ncmFudF90aHJlc2hvbGRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLmdyYW50X3RocmVzaG9sZF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyA9IChiY21vbHRfYmFuZHdpZHRoX0ticHMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGRtX2dyYW50X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9pbnRlcnZhbF91cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnViZF9pbmZvLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ViZF9pbmZvIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudWJkX2luZm8uYWN0dWFsX3BvbGxpbmdfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY3R1YWxfcG9sbGluZ19pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfcG9sbGluZ19pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfZ3JhbnRfdGhyZXNob2xkX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWN0dWFsX2dyYW50X3RocmVzaG9sZF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfZ3JhbnRfdGhyZXNob2xkX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9taW5fc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF9tYnNfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9taW5fc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF93ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9taW5fc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9tYXhfc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF9tYnNfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9tYXhfc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF93ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9tYXhfc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB1YmRfaW5mbywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91YmRfaW5mbyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VCRF9JTkZPLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB1YmRfaW5mbywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInViZF9pbmZvIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCB1YmRfaW5mbyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIHViZF9pbmZvKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBjbG9ja190cmFuc3BvcnRfZW5hYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfRU5BQkxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wZW5kaW5nX2dyYW50cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgcGVuZGluZ19ncmFudHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBwZW5kaW5nX2dyYW50cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9QRU5ESU5HX0dSQU5UUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlbmRpbmdfZ3JhbnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBwZW5kaW5nX2dyYW50cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIHBlbmRpbmdfZ3JhbnRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGlua190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fbGlua190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBsaW5rX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBsaW5rX3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlua190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsaW5rX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsaW5rX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGlua19yYXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBzdGF0ZV9mbGFncykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGxpZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGFzZXJfb25fdGltZV90cSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGFzZXJfb2ZmX3RpbWVfdHEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX3RxKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBkaXN0YW5jZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgYWxhcm1fc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIHR1bm5lbF9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgb251X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBtaW5fbGFzZXJfb3ZlcmhlYWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgZmVjX2VuYWJsZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgdWJkX2luZm8pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIHBlbmRpbmdfZ3JhbnRzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBsaW5rX3R5cGUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0IHN0YXQ7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBlcG9uX2xpbmssIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RhdGFfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9kYXRhX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2RhdGFfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RhdGFfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZGF0YV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZGF0YV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29hbV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X29hbV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9vYW1fYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29hbV9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9vYW1fZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X29hbV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X21wY3BfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfbXBjcF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfbXBjcF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2Jyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9icm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3VuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X211bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9tdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X211bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3JlcG9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9yZXBvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3JlcG9ydF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2Zjc19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2Zjc19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mY3NfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X292ZXJzaXplX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfb3ZlcnNpemVfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfb3ZlcnNpemVfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3J1bnRfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9ydW50X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3J1bnRfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2xpbmVfY29kZV9lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2xpbmVfY29kZV9lcnJvcl9tYXgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3JfbWF4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvcl9tYXgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2RhdGFfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9kYXRhX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2RhdGFfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2RhdGFfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZGF0YV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZGF0YV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X29hbV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X29hbV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9vYW1fYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X29hbV9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9vYW1fZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X29hbV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X21wY3BfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfbXBjcF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfbXBjcF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Jyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9icm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2Jyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3VuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X211bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9tdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X211bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2dhdGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZ2F0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZ2F0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2RhdGFfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9kYXRhX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMTI4XzI1NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yNTZfNTExKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzEwMjRfMTUxOCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xNTE5XzIwNDcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzQwOTZfOTIxNikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc185MjE3XzE2MzgzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfb2FtX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfb2FtX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X21wY3BfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3VuaWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfbXVsdGljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3JlcG9ydF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mY3NfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9vdmVyc2l6ZV9lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3J1bnRfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3JfbWF4KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZGF0YV9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2RhdGFfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzY0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzY1XzEyNykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMjhfMjU1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzI1Nl81MTEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNTEyXzEwMjMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTAyNF8xNTE4KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzE1MTlfMjA0NykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yMDQ4XzQwOTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNDA5Nl85MjE2KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzkyMTdfMTYzODMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9vYW1fYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9vYW1fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfbXBjcF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9icm9hZGNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9tdWx0aWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZ2F0ZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfZm9yY2VfcmVkaXNjb3Zlcnlfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3Zlcnkgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywgZm9yY2VfcmVkaXNjb3ZlcnksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBmb3JjZV9yZWRpc2NvdmVyeSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfb3Blcl9kZWxldGVfbGlua19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGluayBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmsgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIGRlbGV0ZV9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywgZGVsZXRlX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0IG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZW5kX3BlcmlvZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwgc2VuZF9wZXJpb2QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQsIHNlbmRfcGVyaW9kLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVCwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX1NFTkRfUEVSSU9ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3Agb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfb3Blcl9rZXlfZXhjaGFuZ2Vfc3RhcnRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0IG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnQgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdGFydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdGFydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZXJpb2QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdGFydCwgcGVyaW9kLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RhcnQsIHBlcmlvZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0tFWV9FWENIQU5HRV9TVEFSVCwgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfUEVSSU9ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfa2V5X2V4Y2hhbmdlX3N0b3Bfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3Agb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0b3AsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RvcCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfb3Blcl9zdGF0aWNfcmVnaXN0cmF0aW9uX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb24gb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFzZXJvbl90aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgbGFzZXJvbl90aW1lX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uLCBsYXNlcm9uX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9TVEFUSUNfUkVHSVNUUkFUSU9OLCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPTl9USU1FX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFzZXJvZmZfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIGxhc2Vyb2ZmX3RpbWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIGxhc2Vyb2ZmX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9TVEFUSUNfUkVHSVNUUkFUSU9OLCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPRkZfVElNRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdlX3ZhbHVlX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgcmFuZ2VfdmFsdWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIHJhbmdlX3ZhbHVlX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfU1RBVElDX1JFR0lTVFJBVElPTiwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1JBTkdFX1ZBTFVFX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGVuZGluZ19ncmFudHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgcGVuZGluZ19ncmFudHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIHBlbmRpbmdfZ3JhbnRzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfU1RBVElDX1JFR0lTVFJBVElPTiwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX3Byb3h5X2luamVjdF9mcmFtZV9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWUgcHJveHk7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWUgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfcHJveHlfc2VuZCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGVwb25fbGluaywgaW5qZWN0X2ZyYW1lLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZyYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZS5mcmFtZV9vY3RldHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mcmFtZV9vY3RldHMubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgICAgICB2YWwuZnJhbWVfb2N0ZXRzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmZyYW1lX29jdGV0cy5sZW4pOworICAgICAgICAgICAgaWYgKHZhbC5mcmFtZV9vY3RldHMudmFsID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZnJhbWVfb2N0ZXRzLnZhbCwgdmFsLmZyYW1lX29jdGV0cy5sZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZyYW1lLmZyYW1lX29jdGV0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBlcG9uX2xpbmssIGluamVjdF9mcmFtZSwgZnJhbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfSURfSU5KRUNUX0ZSQU1FLCBCQ01PTFRfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRV9JRF9GUkFNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBlcG9uX2xpbmssIGluamVjdF9mcmFtZSwgZnJhbWUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnIHN0YXRfY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCBzdGF0X2lkOyAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9kYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZGF0YV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZGF0YV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vYW1fYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vYW1fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X29hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9tcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9tcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfcmVwb3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9yZXBvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2Zjc19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mY3NfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vdmVyc2l6ZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vdmVyc2l6ZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfcnVudF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9ydW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvcl9tYXgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yX21heCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9kYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZGF0YV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZGF0YV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9vYW1fYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9vYW1fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X29hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9tcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9tcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2dhdGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2dhdGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmcgc3RhdF9jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkIHN0YXRfaWQ7ICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9kYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2RhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9kYXRhX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9kYXRhX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X29hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X29hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X21wY3BfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X21wY3BfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF91bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF91bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfUkVQT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9yZXBvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X3JlcG9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZmNzX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2Zjc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X292ZXJzaXplX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X292ZXJzaXplX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfUlVOVF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9ydW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X3J1bnRfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0xJTkVfQ09ERV9FUlJPUl9NQVg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yX21heCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3JfbWF4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9kYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2RhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9kYXRhX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9kYXRhX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X29hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9vYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X29hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X21wY3BfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X21wY3BfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF91bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF91bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZ2F0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZ2F0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fbGluaywgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnIGF1dG9fY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5jcnlwdGlvbl9lbmFibGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBlbmNyeXB0aW9uX2VuYWJsZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBlbmNyeXB0aW9uX2VuYWJsZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9mYWlsdXJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfc3RhcnRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RhcnRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX3N0b3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdG9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0b3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfZGVsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19kZWxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19kZWxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX3NwZWVkX21pc21hdGNoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBsaW5rX3NwZWVkX21pc21hdGNoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19zcGVlZF9taXNtYXRjaCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kZXJlZ2lzdGVyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGVyZWdpc3RlcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9kZXJlZ2lzdGVyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGlzY292ZXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9kaXNjb3ZlcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9kaXNjb3ZlcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX3JlZ19hY2tfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9yZWdfYWNrX3RpbWVvdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX3JlZ19hY2tfdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9yZXBvcnRfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9yZXBvcnRfdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVwb3J0X3RpbWVvdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9rZWVwYWxpdmVfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lb3V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lb3V0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2VfdmFsdWVfY2hhbmdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcmFuZ2VfdmFsdWVfY2hhbmdlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX2NoYW5nZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcmFuZ2VfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcmVyYW5nZV9mYWlsdXJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcmVyYW5nZV9mYWlsdXJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBlbmNyeXB0aW9uX2VuYWJsZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9mYWlsdXJlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RhcnRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0b3BwZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGxpbmtfZGVsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19zcGVlZF9taXNtYXRjaCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9kZXJlZ2lzdGVyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGlzY292ZXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9yZWdfYWNrX3RpbWVvdXQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVwb3J0X3RpbWVvdXQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZW91dCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX2NoYW5nZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJlcmFuZ2VfZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBzdGF0X2FsYXJtX3JhaXNlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmNyeXB0aW9uX2VuYWJsZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGVuY3J5cHRpb25fZW5hYmxlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBlbmNyeXB0aW9uX2VuYWJsZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0VOQ1JZUFRJT05fRU5BQkxFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0ZBSUxVUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfc3RhcnRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX3N0b3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdG9wcGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdG9wcGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfZGVsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19kZWxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGxpbmtfZGVsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19ERUxFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlua19zcGVlZF9taXNtYXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19zcGVlZF9taXNtYXRjaCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBsaW5rX3NwZWVkX21pc21hdGNoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX1NQRUVEX01JU01BVENILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kZXJlZ2lzdGVyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGVyZWdpc3RlcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGVyZWdpc3RlcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RFUkVHSVNURVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGlzY292ZXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9kaXNjb3ZlcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGlzY292ZXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ESVNDT1ZFUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9yZWdfYWNrX3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVnX2Fja190aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVnX2Fja190aW1lb3V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFR19BQ0tfVElNRU9VVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfcmVwb3J0X3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVwb3J0X3RpbWVvdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9yZXBvcnRfdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9rZWVwYWxpdmVfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdlX3ZhbHVlX2NoYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX2NoYW5nZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcmFuZ2VfdmFsdWVfY2hhbmdlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVkFMVUVfQ0hBTkdFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcmFuZ2VfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcmVyYW5nZV9mYWlsdXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJlcmFuZ2VfZmFpbHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1lbW9yeSBidWZmZXIgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaV9lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9uaV9lbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGVwb25fbmlfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9iZWhhdmlvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdHVfMWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG10dV8xZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG10dV8xZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1XzEwZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbXR1XzEwZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG10dV8xMGcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbmltdW1fZmliZXJfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhpbXVtX2ZpYmVyX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtYXhpbXVtX2ZpYmVyX2xlbmd0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3JhbnRfc3BhY2luZ190cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZ3JhbnRfc3BhY2luZ190cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGVwb25fbG9naWNhbF9saW5rX29wdGlvbnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYWxsX2xpbmtzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYWxsX2xpbmtzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmNyeXB0aW9uX2NmZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBlbmNyeXB0aW9uX2NmZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsb2NrX3RyYW5zcG9ydF9jZmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGNsb2NrX3RyYW5zcG9ydF9jZmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBjbG9ja190cmFuc3BvcnRfY2ZnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcm9wZG93bl93ZWlnaHRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZHJvcGRvd25fd2VpZ2h0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwcHJveGltYXRlX3RkbV91c2FnZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJub19yZXBvcnRzX3NvYWtfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBub19yZXBvcnRzX3NvYWtfdGltZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9uaV9lbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIG10dV8xMGcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBtYXhpbXVtX2ZpYmVyX2xlbmd0aCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgZ3JhbnRfc3BhY2luZ190cSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgbXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBhbGFybV9zdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgYWxsX2xpbmtzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBlbmNyeXB0aW9uX2NmZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBjbG9ja190cmFuc3BvcnRfY2ZnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIGFwcHJveGltYXRlX3RkbV91c2FnZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZXBvbl9uaSwgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGVwb25fbmksIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9iZWhhdmlvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIHJlZ2lzdHJhdGlvbl9iZWhhdmlvciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm10dV8xZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbXR1XzFnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzFHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1XzEwZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMTBnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG10dV8xMGcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMTBHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluaW11bV9maWJlcl9sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tZXRlcnMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X21ldGVycykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWluaW11bV9maWJlcl9sZW5ndGgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWluaW11bV9maWJlcl9sZW5ndGgsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NSU5JTVVNX0ZJQkVSX0xFTkdUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heGltdW1fZmliZXJfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWV0ZXJzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9tZXRlcnMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1heGltdW1fZmliZXJfbGVuZ3RoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1heGltdW1fZmliZXJfbGVuZ3RoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFYSU1VTV9GSUJFUl9MRU5HVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncmFudF9zcGFjaW5nX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBncmFudF9zcGFjaW5nX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9HUkFOVF9TUEFDSU5HX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUgPSAoYmNtb2x0X21wY3BfZ2F0ZV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUucmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NUENQX0dBVEVfTU9ERV9URUtOT1ZVUzoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUucmVnX2Fja190aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LnRla25vdnVzLnJlZ19hY2tfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdfYWNrX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLnZhbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy5mbGFncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZmxhZ3MgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW47IGkwKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWxbaTBdLmZsYWdzID0gKGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLmRlbGF5X2JlZm9yZV9tcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZGVsYXlfYmVmb3JlX21zIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuOyBpMCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMudmFsW2kwXS5kZWxheV9iZWZvcmVfbXMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZ2F0ZV9zaXplX3RxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy5nYXRlX3NpemVfdHEgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW47IGkwKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWxbaTBdLmdhdGVfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlcG9ydGluZ19tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVwb3J0aW5nX21vZGUgPSAoYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZXBvcnRpbmdfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMubWF4X2xpbmtzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2xpbmtzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5tYXhfbGlua3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZW5jcnlwdGlvbl9jZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5jcnlwdGlvbl9jZmcuZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmNyeXB0aW9uX2NmZy5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuY3J5cHRpb25fY2ZnLnVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmNyeXB0aW9uX2NmZy51cHN0cmVhbV9lbmNyeXB0aW9uX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlbmNyeXB0aW9uX2NmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGVuY3J5cHRpb25fY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcm90ZWN0aW9uX3R5cGUgPSAoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgPSAoYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9vcHRpb25zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVyYW5nZV9vcHRpb25zID0gKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2Vfb3B0aW9ucyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5yZXJhbmdlX2F0dGVtcHRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVyYW5nZV9hdHRlbXB0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5yZXJhbmdlX2F0dGVtcHRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2VfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXJhbmdlX2ludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2VfaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuc3luY19nYXRlX2R1cmF0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3luY19nYXRlX2R1cmF0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnN5bmNfZ2F0ZV9kdXJhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19pbnB1dCA9IChiY21vbHRfZ3Bpb19waW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19pbnB1dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19pbnB1dF9wb2xhcml0eSA9IChiY21vbHRfZ3Bpb19wb2xhcml0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0X3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19vdXRwdXQgPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19vdXRwdXRfcG9sYXJpdHkgPSAoYmNtb2x0X2dwaW9fcG9sYXJpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19vdXRwdXRfcG9sYXJpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2xvY2tfdHJhbnNwb3J0X2NmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbG9ja190cmFuc3BvcnRfY2ZnLmVwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlID0gKGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xvY2tfdHJhbnNwb3J0X2NmZy5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgY2xvY2tfdHJhbnNwb3J0X2NmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgY2xvY2tfdHJhbnNwb3J0X2NmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkcm9wZG93bl93ZWlnaHRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfNyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJvcGRvd25fd2VpZ2h0cy5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZHJvcGRvd25fd2VpZ2h0cy5hcnIgbXVzdCBoYXZlIDcgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDc7IGkxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMV0gPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRyb3Bkb3duX3dlaWdodHMuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZHJvcGRvd25fd2VpZ2h0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm9fcmVwb3J0c19zb2FrX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwb25fYWdncmVnYXRlX3NoYXBlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIuYmFuZHdpZHRoX2ticHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iYW5kd2lkdGhfa2JwcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9hZ2dyZWdhdGVfc2hhcGVyLmJhbmR3aWR0aF9rYnBzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIubWJzX2tCIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWJzX2tCID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIubWJzX2tCIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMub2FtX2V4dGVuc2lvbl90eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub2FtX2V4dGVuc2lvbl90eXBlID0gKGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5vYW1fZXh0ZW5zaW9uX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh2YWwub2FtX2V4dGVuc2lvbl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9SRVNFUlZFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0JST0FEQ09NOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmJyb2FkY29tLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0NUQzoKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5jdGMucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfREFTQU46CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUuZGFzYW4ucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfS1Q6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUua3QucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfRFBPRToKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5kcG9lLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLmJsb2NrX3NpemUiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmRwb2UuYmxvY2tfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLmJsb2NrX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMuZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmRwb2UuZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5maW5hbF9hY2tfcmVzcG9uc2VfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfVEhSRVNIT0xELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtYWNfYWRkcmVzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtYWNfYWRkcmVzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fbmlfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9uaV9lbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlcG9uX25pX2VuLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmlfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBlcG9uX25pX2VuKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGVwb25fbmlfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25fYmVoYXZpb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3IgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIHJlZ2lzdHJhdGlvbl9iZWhhdmlvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCByZWdpc3RyYXRpb25fYmVoYXZpb3IsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9SRUdJU1RSQVRJT05fQkVIQVZJT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25fYmVoYXZpb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCByZWdpc3RyYXRpb25fYmVoYXZpb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXR1XzFnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG10dV8xZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMWcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdHVfMWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtdHVfMWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbXR1XzFnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXR1XzEwZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMTBnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG10dV8xMGcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMTBHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1XzEwZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG10dV8xMGcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbXR1XzEwZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1pbmltdW1fZmliZXJfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWV0ZXJzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9tZXRlcnMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUlOSU1VTV9GSUJFUl9MRU5HVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5pbXVtX2ZpYmVyX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWF4aW11bV9maWJlcl9sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tZXRlcnMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X21ldGVycykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQVhJTVVNX0ZJQkVSX0xFTkdUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heGltdW1fZmliZXJfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ncmFudF9zcGFjaW5nX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBncmFudF9zcGFjaW5nX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9HUkFOVF9TUEFDSU5HX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3JhbnRfc3BhY2luZ190cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZ3JhbnRfc3BhY2luZ190cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUgPSAoYmNtb2x0X21wY3BfZ2F0ZV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUucmVnaXN0cmF0aW9uX2dhdGVfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVBDUF9HQVRFX01PREVfVEVLTk9WVVM6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdfYWNrX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUudGVrbm92dXMucmVnX2Fja190aW1lb3V0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdfYWNrX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLmZsYWdzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZmxhZ3MgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW47IGkwKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWxbaTBdLmZsYWdzID0gKGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy5kZWxheV9iZWZvcmVfbXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy5kZWxheV9iZWZvcmVfbXMgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW47IGkwKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWxbaTBdLmRlbGF5X2JlZm9yZV9tcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZ2F0ZV9zaXplX3RxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZ2F0ZV9zaXplX3RxIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuOyBpMCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMudmFsW2kwXS5nYXRlX3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZXBvcnRpbmdfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcG9ydGluZ19tb2RlID0gKGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlcG9ydGluZ19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMubWF4X2xpbmtzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2xpbmtzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMubWF4X2xpbmtzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX0xPR0lDQUxfTElOS19PUFRJT05TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGVwb25fbG9naWNhbF9saW5rX29wdGlvbnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01QQ1BfRElTQ09WRVJZX1BFUklPRF9NUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm5vX3JlcG9ydHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ub19yZXBvcnRzID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubm9fcmVwb3J0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGFsYXJtX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYWxhcm1fc3RhdGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGFsYXJtX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX2xpbmtzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwubGVuOyBpMSsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmFsW2kxXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLm1hYzsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYWxsX2xpbmtzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMTF9MSU5LUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGFsbF9saW5rcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGFsbF9saW5rcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhbGxfbGlua3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZW5jcnlwdGlvbl9jZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuY3J5cHRpb25fY2ZnLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuY3J5cHRpb25fY2ZnLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuY3J5cHRpb25fY2ZnLnVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5jcnlwdGlvbl9jZmcudXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRU5DUllQVElPTl9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlbmNyeXB0aW9uX2NmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuY3J5cHRpb25fY2ZnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcm90ZWN0aW9uX3R5cGUgPSAoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucHJvdGVjdGlvbl90eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyA9IChiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2Vfb3B0aW9ucyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcmFuZ2Vfb3B0aW9ucyA9IChiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9ucykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9vcHRpb25zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5yZXJhbmdlX2F0dGVtcHRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVyYW5nZV9hdHRlbXB0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9hdHRlbXB0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcmFuZ2VfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2VfaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnN5bmNfZ2F0ZV9kdXJhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN5bmNfZ2F0ZV9kdXJhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuc3luY19nYXRlX2R1cmF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19pbnB1dCA9IChiY21vbHRfZ3Bpb19waW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9faW5wdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9faW5wdXRfcG9sYXJpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ncGlvX2lucHV0X3BvbGFyaXR5ID0gKGJjbW9sdF9ncGlvX3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0X3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX291dHB1dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9fb3V0cHV0ID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19vdXRwdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19vdXRwdXRfcG9sYXJpdHkgPSAoYmNtb2x0X2dwaW9fcG9sYXJpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0X3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jbG9ja190cmFuc3BvcnRfY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jbG9ja190cmFuc3BvcnRfY2ZnLmVwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlID0gKGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNsb2NrX3RyYW5zcG9ydF9jZmcuZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGNsb2NrX3RyYW5zcG9ydF9jZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGNsb2NrX3RyYW5zcG9ydF9jZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbG9ja190cmFuc3BvcnRfY2ZnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgY2xvY2tfdHJhbnNwb3J0X2NmZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBjbG9ja190cmFuc3BvcnRfY2ZnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRyb3Bkb3duX3dlaWdodHMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3UxNl83IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHJvcGRvd25fd2VpZ2h0cy5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTI7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmRyb3Bkb3duX3dlaWdodHMuYXJyIG11c3QgaGF2ZSA3IGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCA3OyBpMisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTJdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMl0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHJvcGRvd25fd2VpZ2h0cy5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfNyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRFJPUERPV05fV0VJR0hUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGRyb3Bkb3duX3dlaWdodHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcm9wZG93bl93ZWlnaHRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZHJvcGRvd25fd2VpZ2h0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfYm91bmRzXzggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlLmFyci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTM7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIgbXVzdCBoYXZlIDggZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIuYmVzdF9jYXNlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlLmFyci5iZXN0X2Nhc2UgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCA4OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpM10uYmVzdF9jYXNlID0gY2xpX3Bhcm0tPnZhbHVlc1tpM10udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIud29yc3RfY2FzZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIud29yc3RfY2FzZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IDg7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kzXS53b3JzdF9jYXNlID0gY2xpX3Bhcm0tPnZhbHVlc1tpM10udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX2JvdW5kc184IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9TT0xJQ0lURURfVVNBR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXBwcm94aW1hdGVfdGRtX3VzYWdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGFwcHJveGltYXRlX3RkbV91c2FnZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2UsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcHByb3hpbWF0ZV90ZG1fdXNhZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm9fcmVwb3J0c19zb2FrX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5vX3JlcG9ydHNfc29ha190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG9uX2FnZ3JlZ2F0ZV9zaGFwZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fYWdncmVnYXRlX3NoYXBlci5iYW5kd2lkdGhfa2JwcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJhbmR3aWR0aF9rYnBzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvbl9hZ2dyZWdhdGVfc2hhcGVyLmJhbmR3aWR0aF9rYnBzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvbl9hZ2dyZWdhdGVfc2hhcGVyLm1ic19rQiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1ic19rQiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb25fYWdncmVnYXRlX3NoYXBlci5tYnNfa0IgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBwb25fYWdncmVnYXRlX3NoYXBlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUE9OX0FHR1JFR0FURV9TSEFQRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBwb25fYWdncmVnYXRlX3NoYXBlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9hZ2dyZWdhdGVfc2hhcGVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl9ib3VuZHNfOCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEuYXJyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpNDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyciBtdXN0IGhhdmUgOCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyci5iZXN0X2Nhc2UiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEuYXJyLmJlc3RfY2FzZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IDg7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2k0XS5iZXN0X2Nhc2UgPSBjbGlfcGFybS0+dmFsdWVzW2k0XS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyci53b3JzdF9jYXNlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyci53b3JzdF9jYXNlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgODsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTRdLndvcnN0X2Nhc2UgPSBjbGlfcGFybS0+dmFsdWVzW2k0XS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfYm91bmRzXzggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm9hbV9leHRlbnNpb25fdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9hbV9leHRlbnNpb25fdHlwZSA9IChiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm9hbV9leHRlbnNpb25fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHZhbC5vYW1fZXh0ZW5zaW9uX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX1JFU0VSVkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmJyb2FkY29tLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9DVEM6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmN0Yy5yZXNwb25zZV90aW1lb3V0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfREFTQU46CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmRhc2FuLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9LVDoKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUua3QucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RQT0U6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmRwb2UucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5ibG9ja19zaXplIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5kcG9lLmJsb2NrX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuYmxvY2tfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmRwb2UuZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzEwR19FTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIG1hY19hZGRyZXNzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgZXBvbl9uaV9lbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIHJlZ2lzdHJhdGlvbl9iZWhhdmlvcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIG10dV8xZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIG10dV8xMGcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIG1heGltdW1fZmliZXJfbGVuZ3RoKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgZ3JhbnRfc3BhY2luZ190cSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGVwb25fbG9naWNhbF9saW5rX29wdGlvbnMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBhbGFybV9zdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGFsbF9saW5rcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGVuY3J5cHRpb25fY2ZnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgY2xvY2tfdHJhbnNwb3J0X2NmZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGRyb3Bkb3duX3dlaWdodHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBub19yZXBvcnRzX3NvYWtfdGltZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfc2V0X2Vwb25fbmlfZW5fc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlIG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBzZXRfZXBvbl9uaV9lbl9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBzZXRfZXBvbl9uaV9lbl9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuZXdfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBzZXRfZXBvbl9uaV9lbl9zdGF0ZSwgbmV3X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgc2V0X2Vwb25fbmlfZW5fc3RhdGUsIG5ld19zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU0VUX0VQT05fTklfRU5fU1RBVEUsIEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9pc3N1ZV9yc3NpX2dyYW50X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50IG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdyYW50ZWRfbGluayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwgZ3JhbnRlZF9saW5rLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwgZ3JhbnRlZF9saW5rLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9JU1NVRV9SU1NJX0dSQU5ULCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyaWdnZXJfd2lkdGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50LCB0cmlnZ2VyX3dpZHRoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwgdHJpZ2dlcl93aWR0aCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVCwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX1dJRFRILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJpZ2dlcl9kZWxheSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsIHRyaWdnZXJfZGVsYXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50LCB0cmlnZ2VyX2RlbGF5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9JU1NVRV9SU1NJX0dSQU5ULCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzYW1wbGVfcGVyaW9kIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwgc2FtcGxlX3BlcmlvZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsIHNhbXBsZV9wZXJpb2QsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0lTU1VFX1JTU0lfR1JBTlQsIEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfU0FNUExFX1BFUklPRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9hZGRfbGlua19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmsgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9hZGRfbGluayBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIGFkZF9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIGFkZF9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfbGluaywgbWFjX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfbGluaywgbWFjX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9MSU5LLCBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9saW5rX3JhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGFkZF9saW5rLCByYXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX2xpbmssIHJhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9MSU5LLCBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9SQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX2FkZF9tdWx0aWNhc3RfbGlua19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgYWRkX211bHRpY2FzdF9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIGFkZF9tdWx0aWNhc3RfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX211bHRpY2FzdF9saW5rLCBtYWNfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGFkZF9tdWx0aWNhc3RfbGluaywgbWFjX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9NVUxUSUNBU1RfTElOSywgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19yYXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX211bHRpY2FzdF9saW5rLCByYXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX211bHRpY2FzdF9saW5rLCByYXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTVVMVElDQVNUX0xJTkssIEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9SQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluayBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmsgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIG1hY19hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOSywgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfTUFDX0FERFJFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX2luZm8gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmdfbGlua19pbmZvLmxpbmtfc3RhdHVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGlua19zdGF0dXMgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ3b3JraW5nX2xpbmtfaW5mby5saW5rX3N0YXR1cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmdfbGlua19pbmZvLnJhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yYXRlID0gKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIndvcmtpbmdfbGlua19pbmZvLnJhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ3b3JraW5nX2xpbmtfaW5mby5sbGlkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGxpZCA9IChiY21vbHRfZXBvbl9sbGlkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ3b3JraW5nX2xpbmtfaW5mby5sbGlkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8ubXBjcF9kaXNjb3ZlcnlfaW5mbyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1wY3BfZGlzY292ZXJ5X2luZm8gPSAoYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ3b3JraW5nX2xpbmtfaW5mby5tcGNwX2Rpc2NvdmVyeV9pbmZvIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8ub251X2xhc2VyX29uX3RpbWVfdHEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbnVfbGFzZXJfb25fdGltZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIndvcmtpbmdfbGlua19pbmZvLm9udV9sYXNlcl9vbl90aW1lX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8ub251X2xhc2VyX29mZl90aW1lX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub251X2xhc2VyX29mZl90aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAid29ya2luZ19saW5rX2luZm8ub251X2xhc2VyX29mZl90aW1lX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8ucGVuZGluZ19ncmFudHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wZW5kaW5nX2dyYW50cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIndvcmtpbmdfbGlua19pbmZvLnBlbmRpbmdfZ3JhbnRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8ucmFuZ2VfdmFsdWVfdHEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yYW5nZV92YWx1ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIndvcmtpbmdfbGlua19pbmZvLnJhbmdlX3ZhbHVlX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8udHVubmVsX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHVubmVsX2lkID0gKGJjbW9sdF9lcG9uX3R1bm5lbF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAid29ya2luZ19saW5rX2luZm8udHVubmVsX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywgd29ya2luZ19saW5rX2luZm8sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2luZm8gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTkssIEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX1dPUktJTkdfTElOS19JTkZPLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywgd29ya2luZ19saW5rX2luZm8sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVyYW5nZV9kZWx0YSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEsIHJlcmFuZ2VfZGVsdGEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhLCByZXJhbmdlX2RlbHRhLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBLCBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX1JFUkFOR0VfREVMVEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfcm9ndWVfbGxpZF9zY2FuX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW4gb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW4gb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCByb2d1ZV9sbGlkX3NjYW4sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuLCBtb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuLCBtb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9ST0dVRV9MTElEX1NDQU4sIEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGxpZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9sbGlkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHJvZ3VlX2xsaWRfc2NhbiwgbGxpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHJvZ3VlX2xsaWRfc2NhbiwgbGxpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUk9HVUVfTExJRF9TQ0FOLCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTExJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9zdGFydF9vbnVfdXBncmFkZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpc3Rfb2Zfb251X2lkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkwOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZhbFtpMF0gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS5tYWM7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgc3RhcnRfb251X3VwZ3JhZGUsIGxpc3Rfb2Zfb251X2lkcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFLCBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBsaXN0X29mX29udV9pZHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGxpZF9xdWFyYW50aW5lZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIGxsaWRfcXVhcmFudGluZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbGxpZF9xdWFyYW50aW5lZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF90aW1lc3RhbXBfY2hhbmdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIG1wY3BfdGltZXN0YW1wX2NoYW5nZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbXBjcF90aW1lc3RhbXBfY2hhbmdlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm9fcmVwb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIG5vX3JlcG9ydHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbm9fcmVwb3J0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVyYW5nZV9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcmVyYW5nZV9mYWlsdXJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIHJlcmFuZ2VfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfc2Nhbl9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIHJvZ3VlX3NjYW5fY29tcGxldGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcm9ndWVfc2Nhbl9jb21wbGV0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBsbGlkX3F1YXJhbnRpbmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbXBjcF90aW1lc3RhbXBfY2hhbmdlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIG5vX3JlcG9ydHMpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHJlcmFuZ2VfZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHJvZ3VlX3NjYW5fY29tcGxldGUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9uaV9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGxpZF9xdWFyYW50aW5lZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGxsaWRfcXVhcmFudGluZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGxsaWRfcXVhcmFudGluZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTExJRF9RVUFSQU5USU5FRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfdGltZXN0YW1wX2NoYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX01QQ1BfVElNRVNUQU1QX0NIQU5HRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJub19yZXBvcnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbm9fcmVwb3J0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbm9fcmVwb3J0cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgb251X3VwZ3JhZGVfY29tcGxldGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZXJhbmdlX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByZXJhbmdlX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHJlcmFuZ2VfZmFpbHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9zY2FuX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcm9ndWVfc2Nhbl9jb21wbGV0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcm9ndWVfc2Nhbl9jb21wbGV0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0IHN0YXQ7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fb251XzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29kZV93b3Jkc190b3RhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX3RvdGFsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX3RvdGFsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfemVyb2VzX2NvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfb25lc19jb3JyZWN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfb25lc19jb3JyZWN0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzEwZ191cywgZmVjX29uZXNfY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfY29kZV93b3Jkc190b3RhbCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzEwZ191cywgZmVjX29uZXNfY29ycmVjdGVkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzEwZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fb251XzEwZ191cywgYWxsX2xpbmtzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBhbGxfbGlua3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBhbGxfbGlua3MpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIHNldCBtZW1vcnkgdG8gdXNlIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGxpc3RfbWVtID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAobGlzdF9tZW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibGlzdF9tZW0gPSBiY21vc19jYWxsb2MoQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKyAgICBCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZXBvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkwOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZhbFtpMF0gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS5tYWM7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fb251XzEwZ191cywgYWxsX2xpbmtzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9BTExfTElOS1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGFsbF9saW5rcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fb251XzEwZ191cywgYWxsX2xpbmtzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fb251XzEwZ191cywgYWxsX2xpbmtzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX29udV8xMGdfdXMsIGFsbF9saW5rcykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX29udV8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9vbnVfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUw6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfdG90YWwsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfdG90YWwsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19aRVJPRVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19vbmVzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfb25lc19jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUw6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfdG90YWwsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfdG90YWwsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19aRVJPRVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19vbmVzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfb25lc19jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywgc3RhdF9hbGFybV9yYWlzZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXQgc3RhdDsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ29vZF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGdvb2RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZ29vZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdvb2RfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGdvb2RfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBnb29kX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvdmVyc3pfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBvdmVyc3pfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgb3ZlcnN6X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm9uX2ZlY19nb29kX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5vbl9mZWNfZ29vZF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfZ29vZF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2dvb2RfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19mcmFtZXNfZXhjX2VycnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19mcmFtZXNfZXhjX2VycnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfZnJhbWVzX2V4Y19lcnJzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfYmxrc19ub19lcnJzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19ub19lcnJzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3Nfbm9fZXJycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2Jsa3NfY29ycl9lcnJzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19jb3JyX2VycnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19jb3JyX2VycnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19ibGtzX3VuY29ycl9lcnJzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc191bmNvcnJfZXJycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX3VuY29ycl9lcnJzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29ycl9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2NvcnJfemVyb2VzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl96ZXJvZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl96ZXJvZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb3JyX29uZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX29uZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9vbmVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1bmRlcnN6X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgdW5kZXJzel9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCB1bmRlcnN6X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXJyb3Jzel9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGVycm9yc3pfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZXJyb3Jzel9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZ29vZF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGdvb2RfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG92ZXJzel9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2ZyYW1lc19leGNfZXJycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3Nfbm9fZXJycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfY29ycl9lcnJzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc191bmNvcnJfZXJycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX3plcm9lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfb25lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgdW5kZXJzel9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGVycm9yc3pfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDhfdCogbGlzdF9tZW07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZXBvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX2xpbmtzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX29udV8xZ191cywgYWxsX2xpbmtzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9saW5rcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX29udV8xZ191cywgYWxsX2xpbmtzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX29udV8xZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogc2V0IG1lbW9yeSB0byB1c2UgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgbGlzdF9tZW0gPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGlmIChsaXN0X21lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJsaXN0X21lbSA9IGJjbW9zX2NhbGxvYyhBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworICAgIEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGVwb25fb251XzFnX3VzLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzFnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC52YWxbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0ubWFjOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX29udV8xZ191cywgYWxsX2xpbmtzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19DRkdfSURfQUxMX0xJTktTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9saW5rcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fb251XzFnX3VzLCBhbGxfbGlua3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9vbnVfMWdfdXMsIGFsbF9saW5rcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9vbnVfMWdfdXMsIGFsbF9saW5rcykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX29udV8xZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX29udV8xZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZXBvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZ29vZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBnb29kX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGdvb2RfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBnb29kX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgb3ZlcnN6X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG92ZXJzel9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBub25fZmVjX2dvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfTk9OX0ZFQ19HT09EX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0ZSQU1FU19FWENfRVJSUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19mcmFtZXNfZXhjX2VycnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZnJhbWVzX2V4Y19lcnJzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19OT19FUlJTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3Nfbm9fZXJycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX25vX2VycnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX0NPUlJfRVJSUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX2NvcnJfZXJycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX2NvcnJfZXJycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc191bmNvcnJfZXJycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX3VuY29ycl9lcnJzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX3plcm9lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX3plcm9lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfT05FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX29uZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9vbmVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9VTkRFUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIHVuZGVyc3pfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgdW5kZXJzel9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZXJyb3Jzel9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBlcnJvcnN6X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGdvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBnb29kX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZ29vZF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfT1ZFUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG92ZXJzel9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBvdmVyc3pfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZnJhbWVzX2V4Y19lcnJzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2ZyYW1lc19leGNfZXJycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfTk9fRVJSUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX25vX2VycnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19ub19lcnJzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19DT1JSX0VSUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19jb3JyX2VycnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19jb3JyX2VycnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX1VOQ09SUl9FUlJTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfdW5jb3JyX2VycnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc191bmNvcnJfZXJycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl96ZXJvZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl96ZXJvZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9vbmVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfb25lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfVU5ERVJTWl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCB1bmRlcnN6X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIHVuZGVyc3pfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGVycm9yc3pfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZXJyb3Jzel9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZlY19zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBwcmJzX2dlbmVyYXRvcikpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmZWNfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9pbnNlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmZWNfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfZHMsIGZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfaW5zZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX2RzLCBwcmJzX2dlbmVyYXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX2RzLCBwcmJzX2dlbmVyYXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ19kcywgcHJic19nZW5lcmF0b3IpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ19kcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdCBzdGF0OyAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGJ5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNjQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY1XzEyNyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY1XzEyNyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEyOF8yNTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMjhfMjU1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMjU2XzUxMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjU2XzUxMSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNTEyXzEwMjMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc181MTJfMTAyMyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEwMjRfMTUxOCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTAyNF8xNTE4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTUxOV8yMDQ3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xNTE5XzIwNDcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzIwNDhfNDA5NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzIwNDhfNDA5NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzQwOTZfOTIxNiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNDA5Nl85MjE2KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfOTIxN18xNjM4MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfOTIxN18xNjM4Myk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYnJvYWRjYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYnJvYWRjYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBkYXRhX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBkYXRhX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdWx0aWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG11bHRpY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG11bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIHVuaWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCB1bmljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdhdGVfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGdhdGVfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBnYXRlX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgbXBjcF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG1wY3BfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhYm9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYWJvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBhYm9ydF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzI1Nl81MTEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzE1MTlfMjA0NykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzkyMTdfMTYzODMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBkYXRhX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG11bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZ2F0ZV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgbXBjcF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYWJvcnRfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCBzdGF0X2lkOyAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBvYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGdhdGVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXBjcF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGFib3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCBzdGF0X2lkOyAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBvYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGdhdGVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXBjcF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGFib3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZyBhdXRvX2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgZmVjX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgZmVjX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeW5jX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgc3luY190aW1lX3RxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmZWNfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9GRUNfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeW5jX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzeW5jX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgcHJic19jaGVja2VyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmZWNfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgZmVjX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5bmNfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgc3luY190aW1lX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5bmNfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX3VzLCBzeW5jX3RpbWVfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5kYXRhX2ludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRhdGFfaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9QUkJTX0NIRUNLRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgcHJic19jaGVja2VyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfc3RhdHVzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2tfc3RhdGUgPSAoYmNtb2x0X3ByYnNfbG9ja19zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX3N0YXR1cy5sb2NrX3N0YXRlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmVycm9yX2NvdW50cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2NvdW50cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX3N0YXR1cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX3N0YXR1cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgcHJic19zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfY2hlY2tlcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXQgc3RhdDsgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNjVfMTI3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NV8xMjcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMjhfMjU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTI4XzI1NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzI1Nl81MTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yNTZfNTExKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNTEyXzEwMjMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzUxMl8xMDIzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzE1MTlfMjA0NyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMjA0OF80MDk1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzkyMTdfMTYzODMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc185MjE3XzE2MzgzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJicm9hZGNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGJyb2FkY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGJyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRhdGFfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZGF0YV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZGF0YV9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBtdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBtdWx0aWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1bmljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCB1bmljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG1wY3BfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBtcGNwX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb2FtX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcG9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgcmVwb3J0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgcmVwb3J0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWJvcnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGFib3J0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgYWJvcnRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmY3NfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZmNzX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmY3NfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNyY184X2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGNyY184X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBjcmNfOF9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3V0X29mX3Nsb3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb3V0X29mX3Nsb3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG91dF9vZl9zbG90KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvdmVyc2l6ZV9lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBvdmVyc2l6ZV9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb3ZlcnNpemVfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ1bnRfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGJ5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNjQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY1XzEyNykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTI4XzI1NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMjU2XzUxMSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNTEyXzEwMjMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfOTIxN18xNjM4MykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBicm9hZGNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGRhdGFfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgbXVsdGljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCB1bmljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBtcGNwX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBvYW1fYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb2FtX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCByZXBvcnRfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGFib3J0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmY3NfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgY3JjXzhfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb3V0X29mX3Nsb3QpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb3ZlcnNpemVfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvcikpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgbXBjcF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG1wY3BfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCByZXBvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCByZXBvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBhYm9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRkNTX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmY3NfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZjc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgY3JjXzhfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGNyY184X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvdXRfb2Zfc2xvdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb3V0X29mX3Nsb3QsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBydW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBydW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG1wY3BfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBtcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcmVwb3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcmVwb3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZmNzX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmY3NfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGNyY184X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBjcmNfOF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb3V0X29mX3Nsb3QsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG91dF9vZl9zbG90LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb3ZlcnNpemVfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZyBhdXRvX2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF9mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRlZmF1bHRfZmVjX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW1hbl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1cmJvXzJnX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcHJic19nZW5lcmF0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcmFtYW5fbW9kZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCB0dXJib18yZ19tb2RlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBkZWZhdWx0X2ZlY19zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRlZmF1bHRfZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFtYW5fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCByYW1hbl9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcmFtYW5fbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVyYm9fMmdfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl8xZ190dXJib19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCB0dXJib18yZ19tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9pbnNlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBwcmJzX2dlbmVyYXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcHJic19nZW5lcmF0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF9mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRlZmF1bHRfZmVjX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2ZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX2RzLCBkZWZhdWx0X2ZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbWFuX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcmFtYW5fbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUkFNQU5fTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbWFuX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX2RzLCByYW1hbl9tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHVyYm9fMmdfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl8xZ190dXJib19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCB0dXJib18yZ19tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVyYm9fMmdfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHR1cmJvXzJnX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2luc2VydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHR1cmJvXzJnX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdCBzdGF0OyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGJ5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGJ5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNjQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNjVfMTI3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY1XzEyNyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjVfMTI3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTI4XzI1NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMjhfMjU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMjhfMjU1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMjU2XzUxMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNTEyXzEwMjMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNTEyXzEwMjMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzUxMl8xMDIzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTAyNF8xNTE4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEwMjRfMTUxOCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTAyNF8xNTE4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTUxOV8yMDQ3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzE1MTlfMjA0Nyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTUxOV8yMDQ3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMjA0OF80MDk1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzIwNDhfNDA5NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjA0OF80MDk1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNDA5Nl85MjE2Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzQwOTZfOTIxNik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNDA5Nl85MjE2KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfOTIxN18xNjM4MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJicm9hZGNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgYnJvYWRjYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBicm9hZGNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYXRhX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZGF0YV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBkYXRhX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdWx0aWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgbXVsdGljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBtdWx0aWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1bmljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIHVuaWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIHVuaWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBvYW1fYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgb2FtX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgb2FtX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBvYW1fZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnYXRlX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGdhdGVfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGdhdGVfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIG1wY3BfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIG1wY3BfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhYm9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBhYm9ydF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgYWJvcnRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEwMjRfMTUxOCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xNTE5XzIwNDcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzQwOTZfOTIxNikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGRhdGFfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBtdWx0aWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBvYW1fYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBvYW1fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZ2F0ZV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGFib3J0X2ZyYW1lcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIG9hbV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBvYW1fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfR0FURV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIG9hbV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBvYW1fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfR0FURV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2ZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBkZWZhdWx0X2ZlY19zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5bmNfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN5bmNfdGltZV90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgcHJic19zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBkZWZhdWx0X2ZlY19zdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBkZWZhdWx0X2ZlY19zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGRlZmF1bHRfZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3luY190aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN5bmNfdGltZV90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN5bmNfdGltZV90cSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF9mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGRlZmF1bHRfZmVjX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2ZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBkZWZhdWx0X2ZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5bmNfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfU1lOQ19USU1FX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3luY190aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5kYXRhX2ludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRhdGFfaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9QUkJTX0NIRUNLRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfc3RhdHVzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2tfc3RhdGUgPSAoYmNtb2x0X3ByYnNfbG9ja19zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX3N0YXR1cy5sb2NrX3N0YXRlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmVycm9yX2NvdW50cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2NvdW50cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfc3RhdHVzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgcHJic19zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIHN5bmNfdGltZV90cSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX3N0YXR1cykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXQgc3RhdDsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY1XzEyNyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NV8xMjcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY1XzEyNyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEyOF8yNTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTI4XzI1NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTI4XzI1NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzI1Nl81MTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjU2XzUxMSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjU2XzUxMSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzUxMl8xMDIzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzUxMl8xMDIzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc181MTJfMTAyMyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEwMjRfMTUxOCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMDI0XzE1MTgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEwMjRfMTUxOCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzE1MTlfMjA0NyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xNTE5XzIwNDcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzE1MTlfMjA0Nyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzIwNDhfNDA5NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18yMDQ4XzQwOTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzIwNDhfNDA5NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzQwOTZfOTIxNiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc180MDk2XzkyMTYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzQwOTZfOTIxNik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzkyMTdfMTYzODMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfOTIxN18xNjM4Myk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfOTIxN18xNjM4Myk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnJvYWRjYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGJyb2FkY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgYnJvYWRjYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGRhdGFfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZGF0YV9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG11bHRpY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgbXVsdGljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5pY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCB1bmljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCB1bmljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBtcGNwX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBtcGNwX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb2FtX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb2FtX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVwb3J0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIHJlcG9ydF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgcmVwb3J0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWJvcnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgYWJvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGFib3J0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmNzX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZmNzX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZjc19lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY3JjXzhfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBjcmNfOF9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBjcmNfOF9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3V0X29mX3Nsb3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvdXRfb2Zfc2xvdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvdXRfb2Zfc2xvdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3ZlcnNpemVfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnVudF9lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIHJ1bnRfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgcnVudF9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjVfMTI3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjU2XzUxMSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc181MTJfMTAyMykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzIwNDhfNDA5NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfOTIxN18xNjM4MykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGJyb2FkY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBkYXRhX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgbXVsdGljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIHVuaWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgbXBjcF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvYW1fYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvYW1fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgcmVwb3J0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGFib3J0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZjc19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGNyY184X2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb3V0X29mX3Nsb3QpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIHJ1bnRfZXJyb3IpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgc3RhdF9pZDsgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgbXBjcF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgbXBjcF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvYW1fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCByZXBvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHJlcG9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGFib3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmY3NfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZmNzX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgY3JjXzhfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgY3JjXzhfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvdXRfb2Zfc2xvdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvdXRfb2Zfc2xvdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUlVOVF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBydW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHJ1bnRfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG1wY3BfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG1wY3BfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgcmVwb3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCByZXBvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBhYm9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GQ1NfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZmNzX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZjc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0NSQ184X0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGNyY184X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGNyY184X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1VUX09GX1NMT1Q6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb3V0X29mX3Nsb3QsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb3V0X29mX3Nsb3QsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgcnVudF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBydW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcnBfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9ycF9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9ycF9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3JwX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9ycF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmxpbmtfcmF0ZSA9IChiY21vbHRfZXBvbl9saW5rX3JhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxpbmtfcmF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubGlua19yYXRlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFLCAma2V5LmxpbmtfcmF0ZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcnAsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcnAsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmFzZV9sbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBiYXNlX2xsaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBiYXNlX2xsaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGlzY19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2VuKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NfZ250X2xlbl90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2dudF9sZW5fdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZ250X2xlbl90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9yZXBvcnRfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9yZXBvcnRfdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3cpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1heF9saW5rcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1heF9saW5rcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhdGVfb2ZfcmVmcmFjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcnAsIGJhc2VfbGxpZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2VuKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZ250X2xlbl90cSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9yZXBvcnRfdGltZW91dCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgbWF4X2xpbmtzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3JwLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3JwX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcnBfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcnBfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9ycF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcnBfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5saW5rX3JhdGUgPSAoYmNtb2x0X2Vwb25fbGlua19yYXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsaW5rX3JhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxpbmtfcmF0ZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSwgJmtleS5saW5rX3JhdGUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJhc2VfbGxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGxpZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9sbGlkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBiYXNlX2xsaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgYmFzZV9sbGlkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfQkFTRV9MTElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kaXNjX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2VuLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0VOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kaXNjX2dudF9sZW5fdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0dOVF9MRU5fVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX3JlcG9ydF90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9yZXBvcnRfdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3csIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1csICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbWF4X2xpbmtzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9saW5rcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9sbGluZ19pbnRlcnZhbF91cyA9IChiY21vbHRfcG9sbGluZ19pbnRlcnZhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnBvbGxpbmdfaW50ZXJ2YWxfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5ncmFudF90aHJlc2hvbGRfdHEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ncmFudF90aHJlc2hvbGRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5ncmFudF90aHJlc2hvbGRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfc2l6ZV90cSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRkbV9ncmFudF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmF0ZV9vZl9yZWZyYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBkb3VibGUgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUuZDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCByYXRlX29mX3JlZnJhY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcnBfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3JwX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3JwX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcnBfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3JwX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5saW5rX3JhdGUgPSAoYmNtb2x0X2Vwb25fbGlua19yYXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsaW5rX3JhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxpbmtfcmF0ZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSwgJmtleS5saW5rX3JhdGUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9ycF9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcnBfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcnBfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9ycF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcnBfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmxpbmtfcmF0ZSA9IChiY21vbHRfZXBvbl9saW5rX3JhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxpbmtfcmF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubGlua19yYXRlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFLCAma2V5LmxpbmtfcmF0ZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iYXNlX2xsaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xsaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fbGxpZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgYmFzZV9sbGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIGJhc2VfbGxpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJhc2VfbGxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIGJhc2VfbGxpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBiYXNlX2xsaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tcGNwX2Rpc2NfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19lbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfRU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBtcGNwX2Rpc2NfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgbXBjcF9kaXNjX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXBjcF9kaXNjX2dudF9sZW5fdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0dOVF9MRU5fVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NfZ250X2xlbl90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXBjcF9yZXBvcnRfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX3JlcG9ydF90aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9yZXBvcnRfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgbXBjcF9yZXBvcnRfdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX01QQ1BfUkVHX1BFUl9ESVNDX1dJTkRPVywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3cpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYXhfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbWF4X2xpbmtzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9saW5rcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1heF9saW5rcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBtYXhfbGlua3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGguIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnBvbGxpbmdfaW50ZXJ2YWxfdXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2xsaW5nX2ludGVydmFsX3VzID0gKGJjbW9sdF9wb2xsaW5nX2ludGVydmFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnBvbGxpbmdfaW50ZXJ2YWxfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGguZ3JhbnRfdGhyZXNob2xkX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3JhbnRfdGhyZXNob2xkX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLmdyYW50X3RocmVzaG9sZF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gKGJjbW9sdF9iYW5kd2lkdGhfS2JwcykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyA9IChiY21vbHRfYmFuZHdpZHRoX0ticHMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGRtX2dyYW50X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X2ludGVydmFsX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGRtX2dyYW50X2ludGVydmFsX3VzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9pbnRlcnZhbF91cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0RFRkFVTFRfVVBTVFJFQU1fQkFORFdJRFRILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmF0ZV9vZl9yZWZyYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBkb3VibGUgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUuZDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCByYXRlX29mX3JlZnJhY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmF0ZV9vZl9yZWZyYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIHJhdGVfb2ZfcmVmcmFjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9ycCwgYmFzZV9sbGlkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9ycCwgbXBjcF9kaXNjX2VuKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9ycCwgbXBjcF9kaXNjX2dudF9sZW5fdHEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3JwLCBtcGNwX3JlcG9ydF90aW1lb3V0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9ycCwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcnAsIG1heF9saW5rcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncGlvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwaW9fY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bpb19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwaW9fY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncGlvX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwaW9faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5ncGlvX2lkID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ3Bpb19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ3Bpb19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQsICZrZXkuZ3Bpb19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwaW8sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwaW8sIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncGlvLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncGlvLCBkaXJlY3Rpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncGlvLCB2YWx1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwaW8sIHZhbHVlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwaW8sIGRpcmVjdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3BpbywgdmFsdWUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncGlvLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3BpbywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwaW9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bpb19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncGlvX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bpb19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwaW9fa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bpb19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdwaW9faWQgPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJncGlvX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5ncGlvX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQSU8sIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BJT19LRVlfSURfR1BJT19JRCwgJmtleS5ncGlvX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bpbywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bpbywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXJlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncGlvX3Bpbl9kaXIgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwaW9fcGluX2RpcikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwaW8sIGRpcmVjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncGlvLCBkaXJlY3Rpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2YWx1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwaW9fdmFsdWUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwaW9fdmFsdWUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncGlvLCB2YWx1ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncGlvLCB2YWx1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQSU9fQ0ZHX0lEX1ZBTFVFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwaW9fY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncGlvX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwaW9fa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncGlvX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bpb19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwaW9faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5ncGlvX2lkID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ3Bpb19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ3Bpb19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQsICZrZXkuZ3Bpb19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwaW8sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwaW8sIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncGlvX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bpb19jZmcgY2ZnOyAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bpb19rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncGlvX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bpb19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwaW9faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5ncGlvX2lkID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ3Bpb19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ3Bpb19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQsICZrZXkuZ3Bpb19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQSU8sIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncGlvLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncGlvLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kaXJlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncGlvX3Bpbl9kaXIgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwaW9fcGluX2RpcikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwaW8sIGRpcmVjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncGlvLCBkaXJlY3Rpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXJlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncGlvLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3BpbywgZGlyZWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudmFsdWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncGlvX3ZhbHVlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncGlvX3ZhbHVlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3BpbywgdmFsdWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3BpbywgdmFsdWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3BpbywgdmFsdWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3BpbywgdmFsdWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwaW8sIGRpcmVjdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwaW8sIHZhbHVlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwaW8sIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3BpbywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fYWxsb2NfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBzdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fYWxsb2MsIHN0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fYWxsb2MsIHNsYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fYWxsb2MsIHNsYSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbGxlY3Rfc3RhdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHN0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBzbGEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fYWxsb2MsIG9udV9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cykpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic2xhLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9hbGxvY19zbGEgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5jYnJfcnRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuY2JyX3J0X2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmNicl9ucnRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfbnJ0X2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmNicl9ucnRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuZ3VhcmFudGVlZF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmd1YXJhbnRlZWRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuZ3VhcmFudGVlZF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5tYXhpbXVtX2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4aW11bV9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5tYXhpbXVtX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ID0gKGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuY2JyX3J0X2NvbXBlbnNhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9jb21wZW5zYXRpb24gPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5jYnJfcnRfY29tcGVuc2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmNicl9ydF9hcF9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9hcF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5jYnJfcnRfYXBfaW5kZXggaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuY2JyX25ydF9hcF9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ucnRfYXBfaW5kZXggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuY2JyX25ydF9hcF9pbmRleCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5hbGxvY190eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWxsb2NfdHlwZSA9IChiY21vbHRfYWxsb2NfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5hbGxvY190eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLndlaWdodCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndlaWdodCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS53ZWlnaHQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEucHJpb3JpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHNsYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fYWxsb2Nfc2xhIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TTEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBzbGEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb2xsZWN0X3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fYWxsb2NfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fYWxsb2NfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FsbG9jX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9hbGxvY19zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHN0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHN0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIHN0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIHN0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnNsYS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fYWxsb2Nfc2xhIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmNicl9ydF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX3J0X2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5jYnJfbnJ0X2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX25ydF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX25ydF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuZ3VhcmFudGVlZF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmd1YXJhbnRlZWRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmd1YXJhbnRlZWRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLm1heGltdW1fYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhpbXVtX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5tYXhpbXVtX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSA9IChiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuY2JyX3J0X2NvbXBlbnNhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9jb21wZW5zYXRpb24gPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX3J0X2NvbXBlbnNhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuY2JyX3J0X2FwX2luZGV4Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX3J0X2FwX2luZGV4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5jYnJfcnRfYXBfaW5kZXggaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmNicl9ucnRfYXBfaW5kZXgiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfbnJ0X2FwX2luZGV4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5jYnJfbnJ0X2FwX2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5hbGxvY190eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWxsb2NfdHlwZSA9IChiY21vbHRfYWxsb2NfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuYWxsb2NfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEud2VpZ2h0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2VpZ2h0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS53ZWlnaHQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLnByaW9yaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHJpb3JpdHkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9hbGxvYywgc2xhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9hbGxvY19zbGEgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHNsYSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIHNsYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBzbGEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY29sbGVjdF9zdGF0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbGxlY3Rfc3RhdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIHN0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgc2xhKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgb251X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0IHN0YXQ7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fYWxsb2MsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZ3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2FsbG9jLCByeF9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9hbGxvYywgcnhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2FsbG9jLCByeF9ieXRlcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fYWxsb2Nfb3Blcl9zZXRfc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZSBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fYWxsb2MsIHNldF9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2FsbG9jLCBzZXRfc3RhdGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hbGxvY19vcGVyYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2FsbG9jX29wZXJhdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9hbGxvYywgc2V0X3N0YXRlLCBzdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fYWxsb2MsIHNldF9zdGF0ZSwgc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURSwgQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19vcGVyX2dldF9zdGF0c19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzIG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0cyBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9hbGxvYywgZ2V0X3N0YXRzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fYWxsb2MsIGdldF9zdGF0cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1fb2ZfY3ljbGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9hbGxvYywgZ2V0X3N0YXRzLCBudW1fb2ZfY3ljbGVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9hbGxvYywgZ2V0X3N0YXRzLCBudW1fb2ZfY3ljbGVzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFMsIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2FsbG9jLCByeF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9hbGxvYywgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fYWxsb2Nfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIHN0YXRfaWQ7ICAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9hbGxvYywgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fYWxsb2MsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBncG9uX2FsbG9jLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9hbGxvYywgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgb251X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBnZW1fcG9ydF9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWdfZmxvd19jb25maWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZGVidWdfZmxvd19jb25maWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9lbnRyeV9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG9udV9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZGVidWdfZmxvd19jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG1hY190YWJsZV9lbnRyeV9saW1pdCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbi5kaXJlY3Rpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kaXJlY3Rpb24gPSAoYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNvbmZpZ3VyYXRpb24uZGlyZWN0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbi50eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZSA9IChiY21vbHRfZ2VtX3BvcnRfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNvbmZpZ3VyYXRpb24udHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RPV05TVFJFQU1fRU5DUllQVElPTl9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX2Zsb3ciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51bnRhZ2dlZF9mbG93ID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWdfZmxvd19jb25maWcudW50YWdnZWRfZmxvdyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX3ZpZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVudGFnZ2VkX3ZpZCA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWdfZmxvd19jb25maWcudW50YWdnZWRfdmlkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZGVidWdfZmxvd19jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfREVCVUdfRkxPV19DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkZWJ1Z19mbG93X2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9lbnRyeV9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBtYWNfdGFibGVfZW50cnlfbGltaXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jb25maWd1cmF0aW9uLmRpcmVjdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRpcmVjdGlvbiA9IChiY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNvbmZpZ3VyYXRpb24uZGlyZWN0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNvbmZpZ3VyYXRpb24udHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGUgPSAoYmNtb2x0X2dlbV9wb3J0X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY29uZmlndXJhdGlvbi50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZ2VtX3BvcnRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RPV05TVFJFQU1fRU5DUllQVElPTl9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBjb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZy51bnRhZ2dlZF9mbG93Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudW50YWdnZWRfZmxvdyA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZy51bnRhZ2dlZF9mbG93IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX3ZpZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVudGFnZ2VkX3ZpZCA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX3ZpZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZGVidWdfZmxvd19jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Z19mbG93X2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2VudHJ5X2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG1hY190YWJsZV9lbnRyeV9saW1pdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBtYWNfdGFibGVfZW50cnlfbGltaXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9NQUNfVEFCTEVfRU5UUllfTElNSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfdGFibGVfZW50cnlfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBtYWNfdGFibGVfZW50cnlfbGltaXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgb251X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXQgc3RhdDsgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZ3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCByeF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCB0eF9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X29wZXJfc2V0X3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGUgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9nZW1fcG9ydCwgc2V0X3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fZ2VtX3BvcnQsIHNldF9zdGF0ZSwgc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIHN0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fR0VNX1BPUlRfT1BFUl9JRF9TRVRfU1RBVEUsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIHN0YXRfY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIHN0YXRfaWQ7ICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCB0eF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgc3RhdF9pZDsgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCByeF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyBhdXRvX2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGF1dG9fY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaXdmX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBpd2ZfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBpd2ZfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfdHBpZF9wZXJfZmxvdyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX3RwaWRfcGVyX2Zsb3cpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfb3RhZ19kaXJlY3RfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfb3RhZ19kaXJlY3RfcGJpdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfcGJpdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIGRzX3RwaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgZHNfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWdfZmxvd19jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgZGVidWdfZmxvd19jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvdW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvdW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb3VudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3ZiwgaXdmX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmLCB1c190cGlkX3Blcl9mbG93KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmLCBkc190cGlkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY291bnQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2YsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIml3Zl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfaXdmX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2l3Zl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGl3Zl9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBpd2ZfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidXNfdHBpZF9wZXJfZmxvdy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzJfaGV4IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c190cGlkX3Blcl9mbG93LmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSB1c190cGlkX3Blcl9mbG93LmFyciBtdXN0IGhhdmUgMiBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXNfdHBpZF9wZXJfZmxvdy5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzJfaGV4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX1RQSURfUEVSX0ZMT1csICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19vdGFnX2RpcmVjdF9wYml0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZHNfdHBpZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzVfaGV4IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc190cGlkLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBkc190cGlkLmFyciBtdXN0IGhhdmUgNSBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNTsgaTErKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZHNfdHBpZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZHNfdHBpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzVfaGV4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZHNfdHBpZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJtYWNfdGFibGVfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubWlzc19mYWxsYmFjayIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pc3NfZmFsbGJhY2sgPSAoYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubWlzc19mYWxsYmFjayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmRlZmF1bHRfZmxvd19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRlZmF1bHRfZmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uZGVmYXVsdF9mbG93X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYWdpbmdfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFnaW5nX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hZ2luZ190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubGVhcm5pbmdfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxlYXJuaW5nX21vZGUgPSAoYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubGVhcm5pbmdfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbGVhcm5pbmciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19sZWFybmluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfYWdpbmciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hdXRvbWF0aWNfbWFjX2FnaW5nID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19hZ2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbW92ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF1dG9tYXRpY19tYWNfbW92ZSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbW92ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19zdGF0aWNfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF1dG9tYXRpY19zdGF0aWNfbW9kZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX3N0YXRpY19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWdfZmxvd19jb25maWd1cmF0aW9uLmxlYXJuX3VudGFnZ2VkX2Zsb3dfdmlkcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxlYXJuX3VudGFnZ2VkX2Zsb3dfdmlkcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWdfZmxvd19jb25maWd1cmF0aW9uLmxlYXJuX3VudGFnZ2VkX2Zsb3dfdmlkcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWdfZmxvd19jb25maWd1cmF0aW9uLnVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJR1VSQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZGVidWdfZmxvd19jb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Ziwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaXdmX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9pd2ZfbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfaXdmX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgaXdmX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGl3Zl9tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9JV0ZfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIml3Zl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIGl3Zl9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBpd2ZfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci51c190cGlkX3Blcl9mbG93LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfMl9oZXggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51c190cGlkX3Blcl9mbG93LmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIudXNfdHBpZF9wZXJfZmxvdy5hcnIgbXVzdCBoYXZlIDIgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDI7IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMF0gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51c190cGlkX3Blcl9mbG93LmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCB1c190cGlkX3Blcl9mbG93LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfMl9oZXggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCB1c190cGlkX3Blcl9mbG93LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfdHBpZF9wZXJfZmxvdyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCB1c190cGlkX3Blcl9mbG93KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCB1c190cGlkX3Blcl9mbG93KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXNfb3RhZ19kaXJlY3RfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVzX290YWdfZGlyZWN0X3BiaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfcGJpdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfcGJpdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfUEJJVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3BiaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfcGJpdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfcGJpdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kc190cGlkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfNV9oZXggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kc190cGlkLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIuZHNfdHBpZC5hcnIgbXVzdCBoYXZlIDUgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDU7IGkxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMV0gPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kc190cGlkLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBkc190cGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfNV9oZXggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRFNfVFBJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBkc190cGlkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBkc190cGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBkc190cGlkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubWlzc19mYWxsYmFjayIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pc3NfZmFsbGJhY2sgPSAoYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLm1pc3NfZmFsbGJhY2sgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uZGVmYXVsdF9mbG93X2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGVmYXVsdF9mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uZGVmYXVsdF9mbG93X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmFnaW5nX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZ2luZ190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmFnaW5nX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubGVhcm5pbmdfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxlYXJuaW5nX21vZGUgPSAoYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmxlYXJuaW5nX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19sZWFybmluZyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF1dG9tYXRpY19tYWNfbGVhcm5pbmcgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19sZWFybmluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX2FnaW5nIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYXV0b21hdGljX21hY19hZ2luZyA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX2FnaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbW92ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF1dG9tYXRpY19tYWNfbW92ZSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX21vdmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX3N0YXRpY19tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYXV0b21hdGljX3N0YXRpY19tb2RlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX3N0YXRpY19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi5sZWFybl91bnRhZ2dlZF9mbG93X3ZpZHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sZWFybl91bnRhZ2dlZF9mbG93X3ZpZHMgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24ubGVhcm5fdW50YWdnZWRfZmxvd192aWRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfREVCVUdfRkxPV19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb3VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvdW50LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY291bnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb3VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBtYWNfdGFibGVfY291bnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb3VudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0ZPUkJJRERFTl9WTEFOX0ZMT1dfR0VNX1JBTkdFX1NUQVJULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIGZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3ZiwgaXdmX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3ZiwgZHNfdHBpZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvdW50KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2YsIGZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9zdGF0IHN0YXQ7ICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBncG9uX2l3Ziwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19oaXRfZXZlbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2hpdF9ldmVudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2hpdF9ldmVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfbWlzc19ldmVudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgZHNfbWlzc19ldmVudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX21pc3NfZXZlbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfZHJvcF90b19kaXNhYmxlZF9nZW0iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgZHNfZHJvcF90b19kaXNhYmxlZF9nZW0pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5ld19tYWNfZGlzY292ZXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgbmV3X21hY19kaXNjb3ZlcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgbmV3X21hY19kaXNjb3ZlcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtb3ZlX2V2ZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBtb3ZlX2V2ZW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgbW92ZV9ldmVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgbmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2l3ZiwgZHNfaGl0X2V2ZW50KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25faXdmLCBkc19taXNzX2V2ZW50KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25faXdmLCBuZXdfbWFjX2Rpc2NvdmVyZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9pd2YsIG1vdmVfZXZlbnQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9pd2YsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9vcGVyX2ZsdXNoX21hY190YWJsZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZSBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9pd2YsIGZsdXNoX21hY190YWJsZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9pd2YsIGZsdXNoX21hY190YWJsZSwgY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIGNvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFLCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2aWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF92bGFuX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF92bGFuX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIHZpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIHZpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9GTFVTSF9NQUNfVEFCTEUsIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfVklELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Zsb3dfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9pd2YsIGZsdXNoX21hY190YWJsZSwgZmxvd19pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIGZsb3dfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFLCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0ZMT1dfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9vcGVyX3NjYW5fbWFjX3RhYmxlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGUgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9pd2YsIHNjYW5fbWFjX3RhYmxlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGUsIG1hY19hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9pd2YsIHNjYW5fbWFjX3RhYmxlLCBtYWNfYWRkcmVzcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9TQ0FOX01BQ19UQUJMRSwgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0lEX01BQ19BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2Zfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfSElUX0VWRU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfaGl0X2V2ZW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfaGl0X2V2ZW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19NSVNTX0VWRU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfbWlzc19ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX21pc3NfZXZlbnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX01JU1NfRVZFTlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF90b19kaXNhYmxlZF9nZW0sIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRElTQ09WRVJFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG5ld19tYWNfZGlzY292ZXJlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG5ld19tYWNfZGlzY292ZXJlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTU9WRV9FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG1vdmVfZXZlbnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBtb3ZlX2V2ZW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgbmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmcgc3RhdF9jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkIHN0YXRfaWQ7ICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2dwb25faXdmX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2hpdF9ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2hpdF9ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX21pc3NfZXZlbnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19taXNzX2V2ZW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19NSVNTX0VWRU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX0hJVF9FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU06CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBuZXdfbWFjX2Rpc2NvdmVyZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBuZXdfbWFjX2Rpc2NvdmVyZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBtb3ZlX2V2ZW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgbW92ZV9ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEw6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZyBhdXRvX2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25faXdmLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzY2FuX21hY190YWJsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzY2FuX21hY190YWJsZV9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzY2FuX21hY190YWJsZV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZyBhdXRvX2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25faXdmLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX0ZMVVNIX01BQ19UQUJMRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzY2FuX21hY190YWJsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZsb3dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZsb3dfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX0ZMT1dfSUQsICZrZXkuZmxvd19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYml0X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBwYml0X2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgcGJpdF9jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBnZW1fcG9ydCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmxvd19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmxvd19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCwgJmtleS5mbG93X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9nZW1faWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBiaXRfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgcGJpdF9jb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9QQklUX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmbG93X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmbG93X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5mbG93X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9GTE9XX0lELCAma2V5LmZsb3dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmxvd19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmxvd19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCwgJmtleS5mbG93X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5nZW1fcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZ2VtX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBnZW1fcG9ydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfR0VNX1BPUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBnZW1fcG9ydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wYml0X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBwYml0X2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfUEJJVF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGJpdF9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgcGJpdF9jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgcGJpdF9jb250cm9sKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS52bGFuX2lkID0gKGJjbW9sdF92bGFuX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInZsYW5faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnZsYW5faWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCwgJmtleS52bGFuX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFwcGluZ19tZXRob2QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ19tZXRob2QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXBwaW5nX3RhZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ190YWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnZsYW5faWQgPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkudmxhbl9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9WTEFOX0lELCAma2V5LnZsYW5faWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXBwaW5nX21ldGhvZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfTUVUSE9ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFwcGluZ190YWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ190YWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX1RBRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZHNfdmxhbl9hY3Rpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RzX3ZsYW5fYWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkudmxhbl9pZCA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ2bGFuX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS52bGFuX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQsICZrZXkudmxhbl9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnZsYW5faWQgPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkudmxhbl9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9WTEFOX0lELCAma2V5LnZsYW5faWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYXBwaW5nX21ldGhvZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfTUVUSE9ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFwcGluZ19tZXRob2QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ19tZXRob2QpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYXBwaW5nX3RhZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfVEFHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFwcGluZ190YWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ190YWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci52bGFuX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RzX3ZsYW5fYWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kc192bGFuX2FjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgdmxhbl9hY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgdmxhbl9hY3Rpb24pKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS52bGFuID0gKGJjbW9sdF92bGFuX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInZsYW4gaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnZsYW4gPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfVkxBTiwgJmtleS52bGFuKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIHN0YXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIHN0YXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGdlbV9wb3J0X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBnZW1fcG9ydF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG9udV9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGdlbV9wb3J0X2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG9udV9pZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkudmxhbiA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ2bGFuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS52bGFuID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1ZMQU4sICZrZXkudmxhbik7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9mbG93X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0ZMT1dfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIHN0YXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX1NUQVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkudmxhbiA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ2bGFuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS52bGFuID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1ZMQU4sICZrZXkudmxhbik7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnZsYW4gPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkudmxhbiA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOLCAma2V5LnZsYW4pOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mbG93X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZmxvd19pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZmxvd19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9GTE9XX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zdGF0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIHN0YXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX1NUQVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9nZW1faWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGdlbV9wb3J0X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZ2VtX3BvcnRfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfR0VNX1BPUlRfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgZ2VtX3BvcnRfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBnZW1fcG9ydF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBvbnVfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgZ2VtX3BvcnRfaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIG9udV9pZCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FnZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19hZ2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX2FnZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19kcm9wcGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfbW92ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX21vdmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfbW92ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibmV3X21hYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbmV3X21hYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG5ld19tYWMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX2FnZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19kcm9wcGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfbW92ZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbmV3X21hYykpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX2FnZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX2FnZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19BR0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19kcm9wcGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19kcm9wcGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19tb3ZlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfbW92ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfbW92ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX01PVkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuZXdfbWFjIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBuZXdfbWFjLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG5ld19tYWMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX05FV19NQUMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX3VzX2Zsb3dfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgZmxvd19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl9hY3Rpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl90YWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl90YWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRwaWRfaW5kZXgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHRwaWRfaW5kZXgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB0cGlkX2luZGV4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIG1hY19sZWFybmluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl9hY3Rpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB0cGlkX2luZGV4KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl91c19mbG93X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9mbG93X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2xlYXJuaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBtYWNfbGVhcm5pbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfTUFDX0xFQVJOSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl9hY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91c192bGFuX2FjdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdXNfdmxhbl9hY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInZsYW5fdGFnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ZsYW5fdGFnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX3RhZy52bGFuX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmxhbl9pZCA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbl90YWcudmxhbl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fdGFnLnBiaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wYml0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbl90YWcucGJpdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ZsYW5fdGFnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHBpZF9pbmRleCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHRwaWRfaW5kZXgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1RQSURfSU5ERVgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl91c19mbG93X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9mbG93X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgZmxvd19pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIG1hY19sZWFybmluZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX01BQ19MRUFSTklORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIG1hY19sZWFybmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCBtYWNfbGVhcm5pbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci52bGFuX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3VzX3ZsYW5fYWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF91c192bGFuX2FjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnZsYW5fdGFnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ZsYW5fdGFnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudmxhbl90YWcudmxhbl9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZsYW5faWQgPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci52bGFuX3RhZy52bGFuX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnZsYW5fdGFnLnBiaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wYml0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnZsYW5fdGFnLnBiaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX3RhZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF92bGFuX3RhZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9UQUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX3RhZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fdGFnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl90YWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl90YWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cGlkX2luZGV4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB0cGlkX2luZGV4LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRwaWRfaW5kZXgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCB0cGlkX2luZGV4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIHRwaWRfaW5kZXgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCBtYWNfbGVhcm5pbmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgdWludDhfdCAqbGlzdF9tZW07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHBvbl9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb25fc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdmFpbGFibGVfYmFuZHdpZHRoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibnVtYmVyX29mX2FjdGl2ZV9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwcmJzX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2Rpc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb25fZGlzdGFuY2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb25fZGlzdGFuY2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfd2luZG93X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXFkX2N5Y2xlc19udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2xldmVsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9sZXZlbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHBvd2VyX2xldmVsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19mZWNfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZHNfZmVjX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBkc19mZWNfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJpZnRfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb3NfYWxhcm1fdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2luaXRpYWxfdmFsdWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYmVyX21vbml0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBiZXJfbW9uaXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1fYWNrX3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHBsb2FtX2Fja190aW1lb3V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcGxvYW1fYWNrX3RpbWVvdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIG9udV9hY3RpdmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBrZXlfZXhjaGFuZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBrZXlfZXhjaGFuZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRiYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZGJhKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZGJhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByYnNfY2hlY2tlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByYnNfY2hlY2tlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbl9kYXRhX2FsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfYmFuZHdpZHRoX2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhbGxfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGFsbF9vbnVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfbWNhc3RfZ2VtX3BvcnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGRlYnVnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZGVidWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX3N0YXR1cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19zdGF0dXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHBvbl9kaXN0YW5jZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbGV2ZWwpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGRzX2ZlY19tb2RlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBkcmlmdF9jb250cm9sKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBiZXJfbW9uaXRvcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcGxvYW1fYWNrX3RpbWVvdXQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIG9udV9hY3RpdmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwga2V5X2V4Y2hhbmdlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGRiYSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfZ2VuZXJhdG9yKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgYWxsX29udXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGRlYnVnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGJpcDMyX2luZGljYXRpb25fY29udHJvbCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZ3Bvbl9uaSwgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGdwb25fbmksIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwb25fZGlzdGFuY2UuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2Rpc3RhbmNlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9sb2dfZGlzdGFuY2UgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9kaXN0YW5jZS5tYXhfZGlmZl9yZWFjaCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9kaWZmX3JlYWNoID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX2Rpc3RhbmNlLm1heF9kaWZmX3JlYWNoIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kaXN0YW5jZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcWRfY3ljbGVzX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInBvd2VyX2xldmVsLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWwucGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbGV2ZWwucGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWwubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9sZXZlbC5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbGV2ZWwsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX3Bvd2VyX2xldmVsIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBvd2VyX2xldmVsLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfZmVjX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfZmVjX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfZmVjX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkcmlmdF9jb250cm9sLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcmlmdF9jb250cm9sLmRyaWZ0X2ludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHJpZnRfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkcmlmdF9jb250cm9sLmRyaWZ0X2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJpZnRfY29udHJvbC5kcmlmdF9saW1pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRyaWZ0X2xpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZHJpZnRfY29udHJvbC5kcmlmdF9saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRyaWZ0X2NvbnRyb2wudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkcmlmdF9jb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iZXJfaW50ZXJ2YWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Jlcl9pbnRlcnZhbCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2luaXRpYWxfdmFsdWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0dXMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvc2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9maSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2ZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzLmxvYW1pIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9hbWkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9hbWkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiZXJfbW9uaXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9tb25pdG9yLnVzX2Jlcl9pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVzX2Jlcl9pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJlcl9tb25pdG9yLnVzX2Jlcl9pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9tb25pdG9yLnNmX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJlcl9tb25pdG9yLnNmX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNkX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGJlcl9tb25pdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBiZXJfbW9uaXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb2FtX2Fja190aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBsb2FtX2Fja190aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBsb2FtX2Fja190aW1lb3V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib251X2FjdGl2YXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24ua2V5X2V4Y2hhbmdlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwua2V5X2V4Y2hhbmdlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2FjdGl2YXRpb24ua2V5X2V4Y2hhbmdlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24ucGFzc3dvcmRfYXV0aGVudGljYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9hY3RpdmF0aW9uLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24uZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZhaWxfZHVlX3RvX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWN0aXZhdGlvbi5mYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic25fYWNxdWlzaXRpb24uaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNuX2FjcXVpc2l0aW9uLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gKGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJrZXlfZXhjaGFuZ2UuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZS5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAia2V5X2V4Y2hhbmdlLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAia2V5X2V4Y2hhbmdlLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2UubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAia2V5X2V4Y2hhbmdlLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lbmNyeXB0ZWRfcG9ydHNfb25seSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImtleV9leGNoYW5nZS5lbmNyeXB0ZWRfcG9ydHNfb25seSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGtleV9leGNoYW5nZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwga2V5X2V4Y2hhbmdlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmcudGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmcuZ3Bpb19waW4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ncGlvX3BpbiA9IChiY21vbHRfZ3Bpb19waW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZy5ncGlvX3BpbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nLm9wdGlvbnMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vcHRpb25zID0gKGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nLm9wdGlvbnMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV83ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV83IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfMyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1hXzEgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfMiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciBtdXN0IGhhdmUgMiBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl8yIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRiYS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fZGJhIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYmEuc3JfcmVwb3J0aW5nX2Jsb2NrX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRiYS5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRiYS5kYmFfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRiYV9tb2RlID0gKGJjbW9sdF9kYmFfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRiYS5kYmFfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRiYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZGJhIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EQkEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkYmEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Lmlsb3dwb3dlciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmlsb3dwb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX21hbmFnZW1lbnQuaWxvd3Bvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5pYXdhcmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pYXdhcmUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9tYW5hZ2VtZW50Lmlhd2FyZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuaXRyYW5zaW5pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLml0cmFuc2luaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Lml0eGluaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pdHhpbml0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pdHhpbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5pcnhvZmYiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pcnhvZmYgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9tYW5hZ2VtZW50LmlyeG9mZiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQubG93X3Bvd2VyX2Nsb2JpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG93X3Bvd2VyX2Nsb2JpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0ubWVhc3VyZW1lbnRfdHlwZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSA9IChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLm1lYXN1cmVtZW50X3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5pbnRlcnZhbCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnNlY29uZF9yYW5naW5nX3dpbmRvdyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uc2Vjb25kX3Jhbmdpbmdfd2luZG93ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5zZWNvbmRfcmFuZ2luZ193aW5kb3cgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGxvY190eXBlX3RvX3NjYW4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmFsbG9jX3R5cGVfdG9fc2NhbiA9IChiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxsb2NfdHlwZV90b19zY2FuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfU1BFQ0lBTF9NQVA6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMucGxvX3NpemUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5wbG9fc2l6ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLnBsb19zaXplID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hbGxvY19pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLmFsbG9jX2lkID0gKGJjbW9sdF9wb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLm9udV9pZCA9IChiY21vbHRfcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWNjZXNzX3NpemUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hY2Nlc3Nfc2l6ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLmFjY2Vzc19zaXplID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwcmJzX2NoZWNrZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubW9kZSA9IChiY21vbHRfcHJic19jaGVja2VyX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIubW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5kYXRhX2ludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRhdGFfaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2luc2VydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fYWxsb2NfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ub251X2FsYXJtcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9udV9hbGFybXMgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGl3aSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24udGl3aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWNrX3RpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uc2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2ZpID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5zZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9raSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfYmFuZHdpZHRoX2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWcubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkZWJ1ZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLm1heF9yZXRyeV9jb3VudCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9yZXRyeV9jb3VudCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5tYXhfcmV0cnlfY291bnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMub21jaV9mb3JtYXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbWNpX2Zvcm1hdCA9IChiY21vbHRfb21jaV9kZXZpY2VfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMub21jaV9mb3JtYXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMud2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy53aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5hY3RpdmF0ZV9jb21taXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY3RpdmF0ZV9jb21taXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5hY3RpdmF0ZV9jb21taXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRlbGF5X2Zvcl9jb21taXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGJpcDMyX2luZGljYXRpb25fY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JJUDMyX0lORElDQVRJT05fQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wb25fc3RhdHVzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9zdGF0dXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fc3RhdHVzLnN0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhdGUgPSAoYmNtb2x0X3Bvbl9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb25fc3RhdHVzLnN0YXRlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvbl9zdGF0dXMubG9zX3N0YXR1cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvc19zdGF0dXMgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb25fc3RhdHVzLmxvc19zdGF0dXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb25fc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9zdGF0dXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb25fc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvbl9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcG9uX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hdmFpbGFibGVfYmFuZHdpZHRoLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5jYnJfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5jYnJfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC50b3RhbF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRvdGFsX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgudG90YWxfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5uZXh0X29udV90b3RhbF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5leHRfb251X3RvdGFsX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgubmV4dF9vbnVfdG90YWxfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF2YWlsYWJsZV9iYW5kd2lkdGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5udW1iZXJfb2ZfYWN0aXZlX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfT05VUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9hY3RpdmVfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5udW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfU1RBTkRCWV9PTlVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmxvY2tfc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NrX3N0YXRlID0gKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9jb3VudHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMuZXJyb3JfY291bnRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19zdGF0dXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19zdGF0dXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19zdGF0dXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHByYnNfc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBvbl9kaXN0YW5jZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fZGlzdGFuY2UgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9sb2dfZGlzdGFuY2UgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLm1heF9sb2dfZGlzdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLm1heF9kaWZmX3JlYWNoIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2RpZmZfcmVhY2ggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLm1heF9kaWZmX3JlYWNoIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kaXN0YW5jZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2Rpc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvbl9kaXN0YW5jZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfd2luZG93X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfd2luZG93X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSRUFTU0lHTkVEX0VRVUFMSVpBVElPTl9ERUxBWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcWRfY3ljbGVzX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXFkX2N5Y2xlc19udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wb3dlcl9sZXZlbC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb3dlcl9sZXZlbC5wbHNfbWF4aW11bV9hbGxvY2F0aW9uX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wbHNfbWF4aW11bV9hbGxvY2F0aW9uX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbGV2ZWwucGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX2xldmVsLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvd2VyX2xldmVsLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9sZXZlbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX0xFVkVMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbGV2ZWwsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9sZXZlbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvd2VyX2xldmVsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvd2VyX2xldmVsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHNfZmVjX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfZmVjX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfZmVjX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2ZlY19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZHNfZmVjX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZHNfZmVjX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZHJpZnRfY29udHJvbC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wuZHJpZnRfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kcmlmdF9pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kcmlmdF9jb250cm9sLmRyaWZ0X2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wuZHJpZnRfbGltaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kcmlmdF9saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kcmlmdF9jb250cm9sLmRyaWZ0X2xpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kcmlmdF9jb250cm9sLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZHJpZnRfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFJJRlRfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRyaWZ0X2NvbnRyb2wsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcmlmdF9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBkcmlmdF9jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Jlcl9pbnRlcnZhbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYmVyX2ludGVydmFsKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2FsYXJtX3RocmVzaG9sZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdHVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2luaXRpYWxfdmFsdWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvc2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvc2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2ZpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2ZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2FtaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYW1pID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2FtaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5iZXJfbW9uaXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c19iZXJfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmVyX21vbml0b3IudXNfYmVyX2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJlcl9tb25pdG9yLnNmX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iZXJfbW9uaXRvci5zZl90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmVyX21vbml0b3Iuc2RfdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2RfdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGJlcl9tb25pdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBiZXJfbW9uaXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9tb25pdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYmVyX21vbml0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYmVyX21vbml0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wbG9hbV9hY2tfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BMT0FNX0FDS19USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1fYWNrX3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FjdGl2YXRpb24ua2V5X2V4Y2hhbmdlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwua2V5X2V4Y2hhbmdlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLmtleV9leGNoYW5nZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLmZhaWxfZHVlX3RvX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLmZhaWxfZHVlX3RvX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG9udV9hY3RpdmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub251X3Bvc3RfZGlzY292ZXJ5X21vZGUgPSAoYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNuX2FjcXVpc2l0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLmludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZS5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2UuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2UubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZS5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZS5lbmNyeXB0ZWRfcG9ydHNfb25seSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVuY3J5cHRlZF9wb3J0c19vbmx5ID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZS5lbmNyeXB0ZWRfcG9ydHNfb25seSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGtleV9leGNoYW5nZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwga2V5X2V4Y2hhbmdlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwga2V5X2V4Y2hhbmdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGtleV9leGNoYW5nZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19waW4gPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLm9wdGlvbnMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vcHRpb25zID0gKGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy5vcHRpb25zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV83ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfNyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV8zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV8xID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfMiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIuY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIG11c3QgaGF2ZSAyIGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCAyOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl8yIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kYmEuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2RiYSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRiYS5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNyX3JlcG9ydGluZ19ibG9ja19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRiYS5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kYmEuZGJhX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYmFfbW9kZSA9IChiY21vbHRfZGJhX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGJhLmRiYV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZGJhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kYmEgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RCQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRiYSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRiYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGRiYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBkYmEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbG93cG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pYXdhcmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pYXdhcmUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pYXdhcmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHJhbnNpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXRyYW5zaW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHhpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXR4aW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb3dlcl9tYW5hZ2VtZW50Lml0eGluaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pcnhvZmYiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pcnhvZmYgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pcnhvZmYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3dfcG93ZXJfY2xvYmkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSA9IChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLm1lYXN1cmVtZW50X3R5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0ubWVhc3VyZW1lbnRfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5pbnRlcnZhbCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uc2Vjb25kX3Jhbmdpbmdfd2luZG93Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5zZWNvbmRfcmFuZ2luZ193aW5kb3cgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxsb2NfdHlwZV90b19zY2FuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4gPSAoYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGxvY190eXBlX3RvX3NjYW4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLnBsb19zaXplIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLnBsb19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0ucGxvX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbjsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsW2kxXS5hbGxvY19pZCA9IChiY21vbHRfcG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMub251X2lkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLm9udV9pZCA9IChiY21vbHRfcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFjY2Vzc19zaXplIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFjY2Vzc19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0uYWNjZXNzX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWRkaXRpb25hbF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubW9kZSA9IChiY21vbHRfcHJic19jaGVja2VyX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLmRhdGFfaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19jaGVja2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfY2hlY2tlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHByYnNfY2hlY2tlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcmJzX2NoZWNrZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2luc2VydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5taW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fYWxsb2NfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbnVfYWxhcm1zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ub251X2FsYXJtcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGl3aSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnRpd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uYWNrX3RpbWVvdXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY2tfdGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnNmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmaSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnNmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxva2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51c19iYW5kd2lkdGhfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX2JhbmR3aWR0aF9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX29udXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMjsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9vbnVzLm9udV9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfb251cy5vbnVfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB2YWwubGVuOyBpMisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTJdLm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTJdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfb251cy5zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfb251cy5zdGF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHZhbC5sZW47IGkyKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMl0uc3RhdGUgPSAoYmNtb2x0X29udV9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMl0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGFsbF9vbnVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhbGxfb251cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYWxsX29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYWxsX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTM7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfbWNhc3RfZ2VtX3BvcnRzLmdlbV9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfbWNhc3RfZ2VtX3BvcnRzLmdlbV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHZhbC5sZW47IGkzKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpM10uZ2VtX2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpM10udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9tY2FzdF9nZW1fcG9ydHMuc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy5zdGF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHZhbC5sZW47IGkzKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpM10uc3RhdGUgPSAoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZXNbaTNdLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9tY2FzdF9nZW1fcG9ydHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkZWJ1ZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2RlYnVnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9ERUJVRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRlYnVnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBkZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBkZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm1heF9yZXRyeV9jb3VudCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9yZXRyeV9jb3VudCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X3JldHJ5X2NvdW50IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5vbWNpX2Zvcm1hdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9tY2lfZm9ybWF0ID0gKGJjbW9sdF9vbWNpX2RldmljZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMub21jaV9mb3JtYXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5hY3RpdmF0ZV9jb21taXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY3RpdmF0ZV9jb21taXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5kZWxheV9mb3JfY29tbWl0X21zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGVsYXlfZm9yX2NvbW1pdF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGJpcDMyX2luZGljYXRpb25fY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwb25fc3RhdHVzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJic19zdGF0dXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwb25fZGlzdGFuY2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwb3dlcl9sZXZlbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGRzX2ZlY19tb2RlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBiZXJfbW9uaXRvcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHBsb2FtX2Fja190aW1lb3V0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgb251X2FjdGl2YXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGtleV9leGNoYW5nZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgZGJhKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwcmJzX2dlbmVyYXRvcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBhbGxfb251cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBkZWJ1ZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfc3RhdCBzdGF0OyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZ3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXA4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIGJpcDhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIGJpcDhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJpcDhfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIGJpcDhfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBiaXA4X2Vycm9ycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZ2VtX3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX3BhY2tldHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9nZW1fZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1fZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2dlbV9pZGxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9pZGxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1faWRsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZ2VtX2NvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1fY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1fY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9nZW1faWxsZWdhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1faWxsZWdhbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX2lsbGVnYWwpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2FsbG9jYXRpb25zX3ZhbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2FtcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X3Bsb2Ftcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGxvYW1zX25vbl9pZGxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2Ftc19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfY3B1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2NwdSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfY3B1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vbWNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X29tY2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X29tY2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZHJvcHBlZF90b29fc2hvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kcm9wcGVkX3Rvb19sb25nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NyY19lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfY3JjX2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfY3JjX2Vycm9ycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfa2V5X2Vycm9ycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9rZXlfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9rZXlfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFnbWVudHNfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2ZyYWdtZW50c19lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2ZyYWdtZW50c19lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhY2tldHNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wYWNrZXRzX2Ryb3BwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfZ2VtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2dlbSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZ2VtKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wbG9hbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfcGxvYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9wbG9hbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2dlbV9mcmFnbWVudHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZ2VtX2ZyYWdtZW50cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZ2VtX2ZyYWdtZW50cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfY3B1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2NwdSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfY3B1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9vbWNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X29tY2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X29tY2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9kcm9wcGVkX3RwaWRfbWlzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Ryb3BwZWRfdmlkX21pc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIGZlY19jb2Rld29yZHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCBiaXA4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIGJpcDhfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9wYWNrZXRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9kcm9wcGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9pZGxlKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9jb3JyZWN0ZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX2lsbGVnYWwpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9jcHUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfb21jaSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfY3JjX2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9rZXlfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2ZyYWdtZW50c19lcnJvcnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHR4X2dlbSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCB0eF9wbG9hbXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZ2VtX2ZyYWdtZW50cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCB0eF9jcHUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfb21jaSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3NldF9wb25fc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9vcGVyYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3Bvbl9vcGVyYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURSwgQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfcmVzZXRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX3Jlc2V0IG9wZXI7ICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfcmVzZXQgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCByZXNldCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCByZXNldCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIGRpc2FibGVfc2VyaWFsX251bWJlciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBjb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVIsIEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlci52ZW5kb3JfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgc2VyaWFsX251bWJlci52ZW5kb3JfaWQgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3JfaWQsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3Jfc3BlY2lmaWMsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVIsIEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIHNpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc2V0X29udV9zdGF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZSBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIHNldF9vbnVfc3RhdGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X29wZXJhdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfb251X29wZXJhdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfT05VX1NUQVRFLCBCQ01PTFRfR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfcHJveHlfY3B1X3BhY2tldHNfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzIHByb3h5OyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0cyBwcm94eTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfcHJveHlfc2VuZCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYWNrZXRfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BhY2tldF90eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9wYWNrZXRfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYWxjX2NyYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2xpc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmFsW2kwXSA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgZ2VtX3BvcnRfbGlzdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBnZW1fcG9ydF9saXN0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVmZmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggdmFsID0geyB9OworICAgICAgICB2YWwubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5sZW4pOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZhbCwgdmFsLmxlbik7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBidWZmZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBidWZmZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9wcm94eV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3NlbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCBwcm94eTsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3Byb3h5X3NlbmQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fbmksIGJyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCBncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwbG9hbS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdThfMTIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb2FtLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcGxvYW0uYXJyIG11c3QgaGF2ZSAxMiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgMTIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBwbG9hbSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdThfMTIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VULCBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGJyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIHBsb2FtLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgcHJveHkuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfb3Blcl9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid2luZG93X3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCB3aW5kb3dfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIHdpbmRvd190eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XLCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2FsbG9jX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIGFsbG9jX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgYWxsb2NfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1csIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XLCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlY29uZF9yYW5naW5nX3dpbmRvdyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBzZWNvbmRfcmFuZ2luZ193aW5kb3csIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBzZWNvbmRfcmFuZ2luZ193aW5kb3csICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1csIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3RvZF9yZXF1ZXN0X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdCBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3Qgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCB0b2RfcmVxdWVzdCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCB0b2RfcmVxdWVzdCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSwgb251X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEUsIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9saXN0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmFsW2kwXSA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsIG9udV9saXN0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEUsIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9MSVNULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSwgb251X2xpc3QsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc3RhcnRfb251X3VwZ3JhZGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaXN0X29mX29udV9pZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyIHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC52YWxbaTBdID0gKGJjbW9sdF9wb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBsaXN0X29mX29udV9pZHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERSwgQkNNT0xUX0dQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwgbGlzdF9vZl9vbnVfaWRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2dwb25fbmlfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBmZWNfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBmZWNfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgYmlwOF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgYmlwOF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgYmlwOF9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGJpcDhfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1fcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1fZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9pZGxlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lMTEVHQUw6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9pbGxlZ2FsLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1faWxsZWdhbCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NQVToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfY3B1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9jcHUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9jcmNfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9jcmNfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2tleV9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2tleV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZnJhZ21lbnRzX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZnJhZ21lbnRzX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZ2VtLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9nZW0sIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfUExPQU1TOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9wbG9hbXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X3Bsb2Ftcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU1fRlJBR01FTlRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9nZW1fZnJhZ21lbnRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9nZW1fZnJhZ21lbnRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfY3B1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9jcHUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1M6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfdHBpZF9taXNzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX25pX3N0YXRfaWQgc3RhdF9pZDsgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGZlY19jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGZlY19jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBiaXA4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBiaXA4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBiaXA4X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgYmlwOF9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1fcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JRExFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSUxMRUdBTDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2lsbGVnYWwsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9pbGxlZ2FsLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1BVOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9jcHUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2NwdSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9vbWNpLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2NyY19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2NyY19lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfa2V5X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfa2V5X2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVFNfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9mcmFnbWVudHNfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9mcmFnbWVudHNfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9nZW0sIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2dlbSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X3Bsb2Ftcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfcGxvYW1zLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2dlbV9mcmFnbWVudHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2dlbV9mcmFnbWVudHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9jcHUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2NwdSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9vbWNpLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfdHBpZF9taXNzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1M6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGdwb25fbmksIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBncG9uX25pLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjcHVfcGFja2V0c19mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgY3B1X3BhY2tldHNfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBjcHVfcGFja2V0c19mYWlsdXJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBlbmFibGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBsb3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgbG9zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGlzY292ZXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV9kaXNjb3ZlcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV9kaXNjb3ZlcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgdG9kX3JlcXVlc3RfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBjcHVfcGFja2V0c19mYWlsdXJlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBsb3MpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfZGlzY292ZXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY3B1X3BhY2tldHNfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGNwdV9wYWNrZXRzX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGNwdV9wYWNrZXRzX2ZhaWx1cmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgbG9zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBsb3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfTE9TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2Rpc2NvdmVyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfZGlzY292ZXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgb251X2Rpc2NvdmVyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBvbnVfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgb251X3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgc2VyaWFsX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYXNzd29yZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19mZWMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCB1c19mZWMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgdXNfZmVjKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbWNpX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZXNfZW5jcnlwdGlvbl9rZXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhZXNfZW5jcnlwdGlvbl9rZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCByYW5naW5nX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWFjdGl2YXRpb25fcmVhc29uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfZ2VtX3BvcnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWxsX2dlbV9wb3J0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhbGxfZ2VtX3BvcnRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfYWxsb2NzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWxsX2FsbG9jcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhbGxfYWxsb2NzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfcHNfdHlwZV9jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgb251X3BzX3R5cGVfYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBvbnVfcHNfdHlwZV9jKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJleHRlbmRlZF9ndWFyZF90aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBvbnVfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgcGFzc3dvcmQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgdXNfZmVjKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIGFlc19lbmNyeXB0aW9uX2tleSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBhbGxfYWxsb2NzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3BzX3R5cGVfYykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZ3Bvbl9vbnUsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBncG9uX29udSwgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlci52ZW5kb3JfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgc2VyaWFsX251bWJlci52ZW5kb3JfaWQgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3JfaWQsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3Jfc3BlY2lmaWMsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicGFzc3dvcmQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3U4XzEwIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYXNzd29yZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHBhc3N3b3JkLmFyciBtdXN0IGhhdmUgMTAgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwYXNzd29yZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcGFzc3dvcmQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzEwIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1BBU1NXT1JELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19wYXNzd29yZF9sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGF1dG9fcGFzc3dvcmRfbGVhcm5pbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGF1dG9fcGFzc3dvcmRfbGVhcm5pbmcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FVVE9fUEFTU1dPUkRfTEVBUk5JTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19mZWMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCB1c19mZWMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHVzX2ZlYywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib21jaV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9nZW1faWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iZXJfaW50ZXJ2YWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Jlcl9pbnRlcnZhbCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYWVzX2VuY3J5cHRpb25fa2V5LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Flc19rZXkgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlc19lbmNyeXB0aW9uX2tleS5ieXRlcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgYWVzX2VuY3J5cHRpb25fa2V5LmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmJ5dGVzLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVzX2VuY3J5cHRpb25fa2V5LmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFlc19lbmNyeXB0aW9uX2tleSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZXNfa2V5IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FFU19FTkNSWVBUSU9OX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhZXNfZW5jcnlwdGlvbl9rZXksIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYWxhcm1fc3RhdGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmxvc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3NpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5sb3NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUubG9maSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvZmkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmxvZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5sb2FtaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYW1pID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5sb2FtaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmRnaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRnaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuZGdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUudGl3aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpd2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLnRpd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5kb3dpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZG93aSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuZG93aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLnN1ZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdWZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5zdWZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUuc2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2ZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5zZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5zZGkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZGkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLnNkaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmRmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuZGZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUubG9haSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYWkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmxvYWkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUubG9raSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCByYW5naW5nX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9wc190eXBlX2MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBvbnVfcHNfdHlwZV9jLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBvbnVfcHNfdHlwZV9jLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfUFNfVFlQRV9DLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJleHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJleHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBvbnVfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBvbnVfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIG9udV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5zZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuc2VyaWFsX251bWJlci52ZW5kb3JfaWQgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3JfaWQsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3Jfc3BlY2lmaWMsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBhc3N3b3JkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF8xMCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBhc3N3b3JkLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLnBhc3N3b3JkLmFyciBtdXN0IGhhdmUgMTAgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucGFzc3dvcmQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91OF8xMCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBwYXNzd29yZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhc3N3b3JkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBwYXNzd29yZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9fcGFzc3dvcmRfbGVhcm5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19wYXNzd29yZF9sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXNfZmVjIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgdXNfZmVjLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCB1c19mZWMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1VTX0ZFQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX2ZlYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCB1c19mZWMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIHVzX2ZlYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9tY2lfcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZ2VtX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTUNJX1BPUlRfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbWNpX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgb21jaV9wb3J0X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBvbWNpX3BvcnRfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYmVyX2ludGVydmFsIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9iZXJfaW50ZXJ2YWwpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFlc19lbmNyeXB0aW9uX2tleS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hZXNfa2V5IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWVzX2VuY3J5cHRpb25fa2V5LmJ5dGVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuYWVzX2VuY3J5cHRpb25fa2V5LmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmJ5dGVzLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFlc19lbmNyeXB0aW9uX2tleS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhZXNfZW5jcnlwdGlvbl9rZXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVzX2tleSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVzX2VuY3J5cHRpb25fa2V5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFlc19lbmNyeXB0aW9uX2tleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9zaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvc2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5sb3NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2ZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9maSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb2FtaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYW1pID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9hbWkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGdpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnRpd2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50aXdpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUudGl3aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5kb3dpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZG93aSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmRvd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc3VmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN1ZmkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5zdWZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnNmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnNmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5zZGkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZGkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5zZGkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvYWkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2FpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9haSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxva2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGFybV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9SQU5HSU5HX1RJTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgcmFuZ2luZ190aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCByYW5naW5nX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0dXMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVhY3RpdmF0aW9uX3JlYXNvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfREVBQ1RJVkFUSU9OX1JFQVNPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYWN0aXZhdGlvbl9yZWFzb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9nZW1fcG9ydHMuZ2VtX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9nZW1fcG9ydHMuZ2VtX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5nZW1faWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX2dlbV9wb3J0cy5zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLnN0YXRlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5zdGF0ZSA9IChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGxfZ2VtX3BvcnRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxsX2dlbV9wb3J0cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9nZW1fcG9ydHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYWxsX2dlbV9wb3J0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYWxsX2dlbV9wb3J0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGxfYWxsb2NzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkxOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX2FsbG9jcy5hbGxvY19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfYWxsb2NzLmFsbG9jX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmxlbjsgaTErKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kxXS5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9hbGxvY3Muc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX2FsbG9jcy5zdGF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5sZW47IGkxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMV0uc3RhdGUgPSAoYmNtb2x0X2FsbG9jX3N0YXRlKSBjbGlfcGFybS0+dmFsdWVzW2kxXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsbF9hbGxvY3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfQUxMT0NTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsbF9hbGxvY3MsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfYWxsb2NzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFsbF9hbGxvY3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFsbF9hbGxvY3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfcHNfdHlwZV9jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3BzX3R5cGVfYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3BzX3R5cGVfYywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1BTX1RZUEVfQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9wc190eXBlX2MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgb251X3BzX3R5cGVfYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgb251X3BzX3R5cGVfYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgb251X3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgcGFzc3dvcmQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCB1c19mZWMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgb21jaV9wb3J0X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGxfZ2VtX3BvcnRzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFsbF9hbGxvY3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgb251X3BzX3R5cGVfYykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0IHN0YXQ7ICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBmZWNfY29kZXdvcmRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfYnl0ZXNfY29ycmVjdGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBmZWNfYnl0ZXNfY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2J5dGVzX2NvcnJlY3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXA4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBiaXA4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYmlwOF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmlwOF9lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGJpcDhfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYmlwOF9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2Ftc19jcmNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19jcmNfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByeF9wbG9hbXNfY3JjX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXNfbm9uX2lkbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9zaXRpdmVfZHJpZnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcG9zaXRpdmVfZHJpZnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5lZ2F0aXZlX2RyaWZ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBuZWdhdGl2ZV9kcmlmdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vbWNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByeF9vbWNpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcnhfb21jaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9yZXBvcnRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYmVyX3JlcG9ydGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYmVyX3JlcG9ydGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1bnJlY2VpdmVkX2J1cnN0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCB1bnJlY2VpdmVkX2J1cnN0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgdW5yZWNlaXZlZF9idXJzdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGNkZ19lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGxjZGdfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgbGNkZ19lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJkaV9lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJkaV9lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByZGlfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByeF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcnhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCB0eF9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHR4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCB0eF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgdHhfcGFja2V0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCBmZWNfY29kZXdvcmRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCBmZWNfYnl0ZXNfY29ycmVjdGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgYmlwOF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgYmlwOF9lcnJvcnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19jcmNfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgcG9zaXRpdmVfZHJpZnQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCByeF9vbWNpKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCBiZXJfcmVwb3J0ZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIHVucmVjZWl2ZWRfYnVyc3QpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIGxjZGdfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCByZGlfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCByeF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgcnhfcGFja2V0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgdHhfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIHR4X3BhY2tldHMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X29wZXJfc2V0X29udV9zdGF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfb3BlcmF0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfb3BlcmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9TRVRfT05VX1NUQVRFLCBCQ01PTFRfR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9vcGVyX3Jzc2lfbWVhc3VyZW1lbnRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50IG9wZXI7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9vcGVyX2NoYW5nZV9wb3dlcl9sZXZlbF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbCBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgY2hhbmdlX3Bvd2VyX2xldmVsLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWwsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWxfYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3Bvd2VyX2xldmVsIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWwsIHBvd2VyX2xldmVsX2FjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWwsIHBvd2VyX2xldmVsX2FjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUwsIEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfcHJveHlfY3B1X3BhY2tldHNfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cyBwcm94eTsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHMgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9wcm94eV9zZW5kIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhY2tldF90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcGFja2V0X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3BhY2tldF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2FsY19jcmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3NpemUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3NpemUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVmZmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggdmFsID0geyB9OworICAgICAgICB2YWwubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5sZW4pOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZhbCwgdmFsLmxlbik7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgYnVmZmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHByb3h5Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9wcm94eV9wbG9hbV9wYWNrZXRfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0IHByb3h5OyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldCBwcm94eTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3Byb3h5X3NlbmQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCBncG9uX29udSwgcGxvYW1fcGFja2V0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicGxvYW0uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3U4XzEyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbS5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHBsb2FtLmFyciBtdXN0IGhhdmUgMTIgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDEyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwbG9hbS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwgcGxvYW0sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzEyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQsIEJDTU9MVF9HUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwgcGxvYW0sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2dwb25fb251X3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9ncG9uX29udV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfYnl0ZXNfY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2J5dGVzX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiaXA4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmlwOF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiaXA4X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGJpcDhfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfcGxvYW1zX2NyY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgbmVnYXRpdmVfZHJpZnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CRVJfUkVQT1JURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiZXJfcmVwb3J0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiZXJfcmVwb3J0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1Q6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCB1bnJlY2VpdmVkX2J1cnN0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdW5yZWNlaXZlZF9idXJzdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBsY2RnX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGxjZGdfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SRElfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcmRpX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJkaV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdHhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2dwb25fb251X3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9ncG9uX29udV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfYnl0ZXNfY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2J5dGVzX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiaXA4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmlwOF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiaXA4X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGJpcDhfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfcGxvYW1zX2NyY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgbmVnYXRpdmVfZHJpZnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CRVJfUkVQT1JURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiZXJfcmVwb3J0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiZXJfcmVwb3J0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1Q6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCB1bnJlY2VpdmVkX2J1cnN0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdW5yZWNlaXZlZF9idXJzdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBsY2RnX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGxjZGdfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SRElfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcmRpX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJkaV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdHhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGdwb25fb251LCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRmaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGZpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZ2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGdpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBkZ2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRvd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZG93aSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZG93aSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXJyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGVycik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZXJyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnZhbGlkX2RicnVfcmVwb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvYWkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9haSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9haSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9raSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBsb2tpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBsb2tpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtZW1pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG1lbWkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG1lbWkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWxhcm0pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hbGFybSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2Rpc2FibGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9lbmFibGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9lbmFibGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3B0aWNhbF9yZWZsZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9wdGljYWxfcmVmbGVjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBwZWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBlZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9zc2libGVfZHJpZnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcG9zc2libGVfZHJpZnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBvc3NpYmxlX2RyaWZ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBzdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBwc3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBzdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmVpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCByZWkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2RpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHNkaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2RpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2ZpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBzZmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN1ZmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN1ZmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgdGl3aSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgdGl3aSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBkZmkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGdpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRvd2kpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZXJyKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGxvYWkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9raSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBtZW1pKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FsYXJtKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9kaXNhYmxlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvcHRpY2FsX3JlZmxlY3Rpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBlZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3NzaWJsZV9kcmlmdCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwc3QpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmVpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHNkaSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzZmkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN1ZmkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgdGl3aSkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGZpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGZpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREZJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGdpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRnaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRnaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRvd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZG93aSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRvd2ksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ET1dJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXJyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGVyciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGVyciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0VSUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImludmFsaWRfZGJydV9yZXBvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgaW52YWxpZF9kYnJ1X3JlcG9ydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvYWkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9haSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGxvYWksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0FJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9raSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBsb2tpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9raSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPS0ksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtZW1pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG1lbWksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBtZW1pLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTUVNSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hbGFybSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hbGFybSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9lbmFibGVfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcHRpY2FsX3JlZmxlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwZWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwZWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QRUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3NzaWJsZV9kcmlmdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3NzaWJsZV9kcmlmdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBvc3NpYmxlX2RyaWZ0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcHN0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcHN0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUFNULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCByYW5naW5nX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJlaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJlaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNkaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzZGksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzZGksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TREksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2ZpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2ZpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1ZmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc3VmaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN1ZmksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGl3aSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCB0aXdpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgdGl3aSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1RJV0ksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fdHJ4X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fdHJ4X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX3RyeF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX3RyeCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl90cngsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgbGFfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmVzeW5jX3BvbGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmVzeW5jX3BvbGFyaXR5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yZXN5bmNfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcnhfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGVuZXJneV9kZXRlY3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgZW5lcmd5X2RldGVjdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwcmVhbWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwcmVhbWJsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVsaW1pdGVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgZGVsaW1pdGVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGRlbGltaXRlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3VhcmRfYml0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGd1YXJkX2JpdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgZ3VhcmRfYml0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvX3JhbmdpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fcmFuZ2luZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fcmFuZ2luZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvX2RhdGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fZGF0YSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fZGF0YSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmVzeW5jX3BvbGFyaXR5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHkpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgcnhfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIGVuZXJneV9kZXRlY3QpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHByZWFtYmxlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgZGVsaW1pdGVyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgZ3VhcmRfYml0cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHNlcmRlc19jb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgcGxvX3JhbmdpbmcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fZGF0YSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX3RyeF9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX3RyeF9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl90cnhfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fVFJYX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl90cngsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fdHJ4LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90cnhfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdHJ4X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX0NPTkZJR1VSQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiY2RyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImJjZHIucmVzeW5jX2NvbnRyb2wuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkci5yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkci5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyLnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkci5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmVzeW5jX2NvbnRyb2wubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJlc3luY19jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmVzeW5jX3BvbGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9sYXJpdHkgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmVzeW5jX3BvbGFyaXR5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3Jlc3luY19wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BvbGFyaXR5IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9wb2xhcml0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkVTWU5DX1BPTEFSSVRZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfaW5pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX2luaXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9pbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfbm9fZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZGVsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfbm9fZGVsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZGVsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9yYW5naW5nX2FjY2VzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWVkX3ZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2luaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9pbml0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2luaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfbm9fZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2RlbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19kZWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLm1lZF92YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tZWRfdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicnhfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfY29uZmlndXJhdGlvbi53YWl0X3dpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2FpdF93aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJ4X2NvbmZpZ3VyYXRpb24ud2FpdF93aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJ4X2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcnhfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9zdGF0ZV8xX3dpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2FpdF9zdGF0ZV8xX3dpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi53YWl0X3N0YXRlXzJfd2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53YWl0X3N0YXRlXzJfd2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9zdGF0ZV8yX3dpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfYWZ0ZXJfcmVzeW5jXzQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53YWl0X2FmdGVyX3Jlc3luY180ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9hZnRlcl9yZXN5bmNfNCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0LnJhbmdpbmdfZWRfc291cmNlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmFuZ2luZ19lZF9zb3VyY2UgPSAoYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5lcmd5X2RldGVjdC5yYW5naW5nX2VkX3NvdXJjZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZXJneV9kZXRlY3QuZGVsaW1pdGVyX2VkX3NvdXJjZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRlbGltaXRlcl9lZF9zb3VyY2UgPSAoYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5lcmd5X2RldGVjdC5kZWxpbWl0ZXJfZWRfc291cmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdC5taW5pbXVtX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pbmltdW1fdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5lcmd5X2RldGVjdC5taW5pbXVtX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZXJneV9kZXRlY3QubWF4aW11bV90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhpbXVtX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZXJneV9kZXRlY3QubWF4aW11bV90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0LmVkX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lZF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5lcmd5X2RldGVjdC5lZF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdC5lZF9wYXR0ZXJuX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lZF9wYXR0ZXJuX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmVyZ3lfZGV0ZWN0LmVkX3BhdHRlcm5fc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZXJneV9kZXRlY3Qud2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZXJneV9kZXRlY3Qud2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0LmludmVyc2lvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVyc2lvbiA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5lcmd5X2RldGVjdC5pbnZlcnNpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0Lm5vX2VkX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5vX2VkX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZXJneV9kZXRlY3Qubm9fZWRfdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZXJneV9kZXRlY3QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4uc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4uc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByZWFtYmxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9wcmVhbWJsZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUudHlwZV8xX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzFfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByZWFtYmxlLnR5cGVfMV9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUudHlwZV8yX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzJfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByZWFtYmxlLnR5cGVfMl9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUudHlwZV8zX3ByZV9yYW5naW5nX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzNfcHJlX3Jhbmdpbmdfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByZWFtYmxlLnR5cGVfM19wcmVfcmFuZ2luZ19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUudHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJlYW1ibGUudHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUudHlwZV8zX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzNfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByZWFtYmxlLnR5cGVfM19wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHByZWFtYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9wcmVhbWJsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QUkVBTUJMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBwcmVhbWJsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkZWxpbWl0ZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X2RlbGltaXRlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVsaW1pdGVyLnBhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZGVsaW1pdGVyLnBhdHRlcm4gbXVzdCBoYXZlIDMgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5wYXR0ZXJuLCAzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWxpbWl0ZXIucGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlbGltaXRlci5zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlbGltaXRlci5zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVsaW1pdGVyLndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWxpbWl0ZXIud2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZGVsaW1pdGVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9kZWxpbWl0ZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGRlbGltaXRlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImd1YXJkX2JpdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGd1YXJkX2JpdHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGd1YXJkX2JpdHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0dVQVJEX0JJVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJhbmdpbmdfbW9kZSA9IChiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLm11bHRpX2VkX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tdWx0aV9lZF9tb2RlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1cnN0X2VuYWJsZV9zdGFydF9vZmZzZXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJkZXNfY29uZmlndXJhdGlvbi5idXJzdF9lbmFibGVfc3RhcnRfb2Zmc2V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX2VuZF9vZmZzZXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idXJzdF9lbmFibGVfZW5kX29mZnNldCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmRlc19jb25maWd1cmF0aW9uLmJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uZWRfaW52ZXJ0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZWRfaW52ZXJ0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJkZXNfY29uZmlndXJhdGlvbi5lZF9pbnZlcnRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbl9zaWduID0gKGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX25vcm1hbF9jb25maWcubG9jYXRpb25fc2lnbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfbm9ybWFsX2NvbmZpZy5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX25vcm1hbF9jb25maWcubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX25vcm1hbF9jb25maWcubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcmVwZXJ0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXJ0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX25vcm1hbF9jb25maWcubWlkZGxlX3JlcGVydGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taW5pbXVtX2J1cnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9ub19lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfbm9fZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX3Jlc2V0XzMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9yZXNldF8zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfcmVzZXRfMyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fdHJ4X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX3RyeF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fdHJ4LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX3RyeCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fdHJ4X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl90cnhfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX3RyeF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fdHJ4X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fVFJYX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl90cngsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fdHJ4LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RyeF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYmNkci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYmNkci5yZXN5bmNfY29udHJvbC4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkci5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkci5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyLnJlc3luY19jb250cm9sLmxvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkci5yZXN5bmNfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yZXN5bmNfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb2xhcml0eSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcG9sYXJpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmVzeW5jX3BvbGFyaXR5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yZXN5bmNfcG9sYXJpdHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JFU1lOQ19QT0xBUklUWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3Jlc3luY19wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9yZXN5bmNfcG9sYXJpdHkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHJfcmVzeW5jX3BvbGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9sYXJpdHkgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmVzeW5jX3BvbGFyaXR5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3Jlc3luY19wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfaW5pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX2luaXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfaW5pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9ub19lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZGVsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfbm9fZGVsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9yYW5naW5nX2FjY2VzcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9yYW5naW5nX2FjY2VzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMubWVkX3ZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1lZF92YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLm1lZF92YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2luaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9pbml0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9pbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9ub19lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2RlbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZGVsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9yYW5naW5nX2FjY2VzcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWVkX3ZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLm1lZF92YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yeF9jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfY29uZmlndXJhdGlvbi53YWl0X3dpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2FpdF93aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yeF9jb25maWd1cmF0aW9uLndhaXRfd2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfY29uZmlndXJhdGlvbi5yYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJhbmdpbmdfYWNjZXNzX3dpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJ4X2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcnhfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9zdGF0ZV8xX3dpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi53YWl0X3N0YXRlXzJfd2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53YWl0X3N0YXRlXzJfd2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfc3RhdGVfMl93aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9hZnRlcl9yZXN5bmNfNCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndhaXRfYWZ0ZXJfcmVzeW5jXzQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9hZnRlcl9yZXN5bmNfNCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5yYW5naW5nX2VkX3NvdXJjZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJhbmdpbmdfZWRfc291cmNlID0gKGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LnJhbmdpbmdfZWRfc291cmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuZXJneV9kZXRlY3QuZGVsaW1pdGVyX2VkX3NvdXJjZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRlbGltaXRlcl9lZF9zb3VyY2UgPSAoYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZXJneV9kZXRlY3QuZGVsaW1pdGVyX2VkX3NvdXJjZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0Lm1pbmltdW1fdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWluaW11bV90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5taW5pbXVtX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0Lm1heGltdW1fdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4aW11bV90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5tYXhpbXVtX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmVkX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lZF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZXJneV9kZXRlY3QuZWRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmVkX3BhdHRlcm5fc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVkX3BhdHRlcm5fc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmVkX3BhdHRlcm5fc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC53aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmludmVyc2lvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVyc2lvbiA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZXJneV9kZXRlY3QuaW52ZXJzaW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuZXJneV9kZXRlY3Qubm9fZWRfdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubm9fZWRfdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZXJneV9kZXRlY3Qubm9fZWRfdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZXJneV9kZXRlY3QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4uc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9EQVRBX1BBVFRFUk4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkFOR0lOR19QQVRURVJOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJlYW1ibGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X3ByZWFtYmxlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJlYW1ibGUudHlwZV8xX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzFfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmVhbWJsZS50eXBlXzFfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmVhbWJsZS50eXBlXzJfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGVfMl9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByZWFtYmxlLnR5cGVfMl9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByZWFtYmxlLnR5cGVfM19wcmVfcmFuZ2luZ19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZV8zX3ByZV9yYW5naW5nX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJlYW1ibGUudHlwZV8zX3ByZV9yYW5naW5nX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJlYW1ibGUudHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByZWFtYmxlLnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmVhbWJsZS50eXBlXzNfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGVfM19wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByZWFtYmxlLnR5cGVfM19wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHByZWFtYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9wcmVhbWJsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QUkVBTUJMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBwcmVhbWJsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZWFtYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHByZWFtYmxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwcmVhbWJsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kZWxpbWl0ZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X2RlbGltaXRlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlbGltaXRlci5wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5kZWxpbWl0ZXIucGF0dGVybiBtdXN0IGhhdmUgMyBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnBhdHRlcm4sIDMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWxpbWl0ZXIucGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWxpbWl0ZXIuc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVsaW1pdGVyLnNpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVsaW1pdGVyLndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVsaW1pdGVyLndpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGRlbGltaXRlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfZGVsaW1pdGVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0RFTElNSVRFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBkZWxpbWl0ZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWxpbWl0ZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgZGVsaW1pdGVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBkZWxpbWl0ZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ndWFyZF9iaXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBndWFyZF9iaXRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBndWFyZF9iaXRzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9HVUFSRF9CSVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3VhcmRfYml0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBndWFyZF9iaXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBndWFyZF9iaXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmFuZ2luZ19tb2RlID0gKGJjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubXVsdGlfZWRfbW9kZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLm11bHRpX2VkX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1cnN0X2VuYWJsZV9zdGFydF9vZmZzZXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5idXJzdF9lbmFibGVfZW5kX29mZnNldCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLmJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLmVkX2ludmVydGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVkX2ludmVydGlvbiA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLmVkX2ludmVydGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHNlcmRlc19jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBsb19yYW5naW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fcmFuZ2luZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcGxvX3JhbmdpbmcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19SQU5HSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvX3JhbmdpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgcGxvX3JhbmdpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHBsb19yYW5naW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGxvX2RhdGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHBsb19kYXRhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fZGF0YSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX0RBVEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9fZGF0YSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwbG9fZGF0YSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgcGxvX2RhdGEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbl9zaWduID0gKGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLm1pZGRsZV9yZXBlcnRpdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9yZXBlcnRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubWlkZGxlX3JlcGVydGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5taW5pbXVtX2J1cnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWluaW11bV9idXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubWluaW11bV9idXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9ub19lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX25vX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9yZXNldF8zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfcmVzZXRfMyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9yZXNldF8zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SQU5HSU5HX1JTU0lfUkVTWU5DX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9jb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByeF9jb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwcmVhbWJsZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBkZWxpbWl0ZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgZ3VhcmRfYml0cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwbG9fcmFuZ2luZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwbG9fZGF0YSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ19lbnRyeV9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5sb2dfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxvZ19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubG9nX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCwgJmtleS5sb2dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihrZXkubmFtZS5zdHIsIDEwMCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5uYW1lID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUsICZrZXkubmFtZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfbG9nX2xldmVsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX2xldmVsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ19sZXZlbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF9sb2dfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ190eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ190eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfbGV2ZWxfcHJpbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19sZXZlbF9zYXZlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ190eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfc3R5bGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX3N0eWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfc3R5bGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19uYW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19uYW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbmFtZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX2xldmVsKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX3R5cGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ190eXBlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19zdHlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbmFtZSkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ19lbnRyeV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5sb2dfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxvZ19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubG9nX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCwgJmtleS5sb2dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihrZXkubmFtZS5zdHIsIDEwMCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5uYW1lID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUsICZrZXkubmFtZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19sZXZlbF9wcmludCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ19sZXZlbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX2xldmVsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1BSSU5ULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2xldmVsX3NhdmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sb2dfbGV2ZWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2xvZ19sZXZlbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbG9nX3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2xvZ190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ190eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX3N0eWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbG9nX3N0eWxlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9sb2dfc3R5bGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19zdHlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19zdHlsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nX2VudHJ5X2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5sb2dfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxvZ19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubG9nX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCwgJmtleS5sb2dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihrZXkubmFtZS5zdHIsIDEwMCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5uYW1lID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUsICZrZXkubmFtZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nX2VudHJ5X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5sb2dfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxvZ19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubG9nX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCwgJmtleS5sb2dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihrZXkubmFtZS5zdHIsIDEwMCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5uYW1lID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUsICZrZXkubmFtZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dfZW50cnksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfbG9nX2xldmVsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbG9nX2xldmVsIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9sb2dfbGV2ZWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX2xldmVsLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfbGV2ZWwsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfTEVWRUwsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2xvZ19sZXZlbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfbGV2ZWwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ19sZXZlbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfbG9nX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sb2dfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ190eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2xvZ190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ190eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfdHlwZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvZ19sZXZlbF9wcmludCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ19sZXZlbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX2xldmVsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1BSSU5ULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2xldmVsX3ByaW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sb2dfbGV2ZWxfc2F2ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ19sZXZlbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX2xldmVsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9TQVZFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2xldmVsX3NhdmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sb2dfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ190eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9sb2dfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ190eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubG9nX3N0eWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbG9nX3N0eWxlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9sb2dfc3R5bGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19zdHlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19zdHlsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfc3R5bGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19zdHlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19zdHlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5sb2dfbmFtZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdHJfMTAwIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubG9nX25hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwuc3RyLCAxMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sb2dfbmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19uYW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0cl8xMDAgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX25hbWUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfbmFtZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX25hbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfbmFtZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ19sZXZlbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfdHlwZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX3R5cGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19zdHlsZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX25hbWUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dfZW50cnlfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0IHN0YXQ7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubG9nX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsb2dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxvZ19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQsICZrZXkubG9nX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJuYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYoa2V5Lm5hbWUuc3RyLCAxMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubmFtZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FLCAma2V5Lm5hbWUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBsb2dfZW50cnksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1zZ19jb3VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBsb2dfZW50cnksIG1zZ19jb3VudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbG9nX2VudHJ5LCBtc2dfY291bnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc3RfbXNnX2NvdW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ19lbnRyeSwgbG9zdF9tc2dfY291bnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ19lbnRyeSwgbG9zdF9tc2dfY291bnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBsb2dfZW50cnksIG1zZ19jb3VudCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBsb2dfZW50cnksIGxvc3RfbXNnX2NvdW50KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBsb2dfZW50cnksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ19lbnRyeV9zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZyBzdGF0X2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgc3RhdF9pZDsgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5sb2dfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxvZ19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubG9nX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCwgJmtleS5sb2dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihrZXkubmFtZS5zdHIsIDEwMCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5uYW1lID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUsICZrZXkubmFtZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9NU0dfQ09VTlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGxvZ19lbnRyeSwgbXNnX2NvdW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dfZW50cnksIG1zZ19jb3VudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX0xPU1RfTVNHX0NPVU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dfZW50cnksIGxvc3RfbXNnX2NvdW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dfZW50cnksIGxvc3RfbXNnX2NvdW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dfZW50cnlfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcgc3RhdF9jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIHN0YXRfaWQ7ICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubG9nX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsb2dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxvZ19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQsICZrZXkubG9nX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJuYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYoa2V5Lm5hbWUuc3RyLCAxMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubmFtZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FLCAma2V5Lm5hbWUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dfZW50cnksIG1zZ19jb3VudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBtc2dfY291bnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9MT1NUX01TR19DT1VOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBsb3N0X21zZ19jb3VudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBsb3N0X21zZ19jb3VudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGxvZ19lbnRyeSwgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dfZW50cnlfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dfZW50cnlfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5maWxlX2lkID0gKGJjbW9sdF9sb2dfZmlsZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsZV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmlsZV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lELCAma2V5LmZpbGVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidWZmZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ2dlciwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBidWZmZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndyYXBfYXJvdW5kIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dnZXIsIHdyYXBfYXJvdW5kKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCB3cmFwX2Fyb3VuZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXJfYWZ0ZXJfcmVhZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmFibGVfbG9nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dnZXIsIGVuYWJsZV9sb2cpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dnZXIsIGVuYWJsZV9sb2cpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19uYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBsb2dfbmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dnZXIsIGxvZ19uYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dnZXIsIGJ1ZmZlcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nZ2VyLCB3cmFwX2Fyb3VuZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dnZXIsIGVuYWJsZV9sb2cpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGxvZ2dlciwgbG9nX25hbWVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5maWxlX2lkID0gKGJjbW9sdF9sb2dfZmlsZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsZV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmlsZV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lELCAma2V5LmZpbGVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ3cmFwX2Fyb3VuZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCB3cmFwX2Fyb3VuZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIHdyYXBfYXJvdW5kLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX1dSQVBfQVJPVU5ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXJfYWZ0ZXJfcmVhZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5hYmxlX2xvZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBlbmFibGVfbG9nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgZW5hYmxlX2xvZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0NGR19JRF9FTkFCTEVfTE9HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ2dlcl9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZpbGVfaWQgPSAoYmNtb2x0X2xvZ19maWxlX2lkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWxlX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5maWxlX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQsICZrZXkuZmlsZV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ2dlciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nZ2VyLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmlsZV9pZCA9IChiY21vbHRfbG9nX2ZpbGVfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbGVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZpbGVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwgJmtleS5maWxlX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmJ1ZmZlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sb2dfYnVmZmVyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVmZmVyLmJ1ZmYiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHZhbC5idWZmLCAyMDQ4LCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVmZmVyLmJ1ZmYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVmZmVyLm1zZ190b19yZWFkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubXNnX3RvX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVmZmVyLm1zZ190b19yZWFkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBidWZmZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2J1ZmZlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0JVRkZFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgYnVmZmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVmZmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBidWZmZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBidWZmZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci53cmFwX2Fyb3VuZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCB3cmFwX2Fyb3VuZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIHdyYXBfYXJvdW5kLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX1dSQVBfQVJPVU5ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid3JhcF9hcm91bmQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dnZXIsIHdyYXBfYXJvdW5kKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgd3JhcF9hcm91bmQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jbGVhcl9hZnRlcl9yZWFkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIGNsZWFyX2FmdGVyX3JlYWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0NMRUFSX0FGVEVSX1JFQUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhcl9hZnRlcl9yZWFkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuYWJsZV9sb2ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgZW5hYmxlX2xvZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIGVuYWJsZV9sb2csICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR0dFUl9DRkdfSURfRU5BQkxFX0xPRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuYWJsZV9sb2ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dnZXIsIGVuYWJsZV9sb2cpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBlbmFibGVfbG9nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmxvZ19uYW1lcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdHJfMTAwMCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvZ19uYW1lcy5zdHIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHZhbC5zdHIsIDEwMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sb2dfbmFtZXMuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBsb2dfbmFtZXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RyXzEwMDAgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIGxvZ19uYW1lcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19uYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgbG9nX25hbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgbG9nX25hbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dnZXIsIGJ1ZmZlcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ2dlciwgd3JhcF9hcm91bmQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dnZXIsIGNsZWFyX2FmdGVyX3JlYWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dnZXIsIGVuYWJsZV9sb2cpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dnZXIsIGxvZ19uYW1lcykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dnZXIsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ2dlcl9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX3N0YXQgc3RhdDsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmlsZV9pZCA9IChiY21vbHRfbG9nX2ZpbGVfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbGVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZpbGVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwgJmtleS5maWxlX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgbG9nZ2VyLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5lc19pbl9sb2ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbG9nZ2VyLCBsaW5lc19pbl9sb2cpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ2dlciwgbGluZXNfaW5fbG9nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbG9nZ2VyLCBsaW5lc19pbl9sb2cpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ2dlciwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX29wZXJfY2xlYXJfbG9nX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZyBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmlsZV9pZCA9IChiY21vbHRfbG9nX2ZpbGVfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbGVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZpbGVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwgJmtleS5maWxlX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBsb2dnZXIsIGNsZWFyX2xvZywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBsb2dnZXIsIGNsZWFyX2xvZywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dnZXJfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIHN0YXRfaWQ7ICAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZpbGVfaWQgPSAoYmNtb2x0X2xvZ19maWxlX2lkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWxlX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5maWxlX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQsICZrZXkuZmlsZV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfbG9nZ2VyX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfU1RBVF9JRF9MSU5FU19JTl9MT0c6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGxvZ2dlciwgbGluZXNfaW5fbG9nLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dnZXIsIGxpbmVzX2luX2xvZywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9sb2dnZXJfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5maWxlX2lkID0gKGJjbW9sdF9sb2dfZmlsZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsZV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmlsZV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lELCAma2V5LmZpbGVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2xvZ2dlcl9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dnZXIsIGxpbmVzX2luX2xvZywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nZ2VyLCBsaW5lc19pbl9sb2csIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGxvZ2dlciwgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBsb2dnZXIsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ2dlciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ2dlciwgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGxvZ2dlciwgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ2dlciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlbW90ZV9sb29wYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCByZW1vdGVfbG9vcGJhY2spOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIHJlbW90ZV9sb29wYmFjayk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGluZV9sb29wYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBsaW5lX2xvb3BiYWNrKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBsaW5lX2xvb3BiYWNrKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBtYWNfYWRkcmVzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbWFjX2FkZHJlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm5pX2JhY2t1cF9zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbm5pX2JhY2t1cF9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIG5uaV9iYWNrdXBfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3RpdmVfbm5pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIGFjdGl2ZV9ubmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIGFjdGl2ZV9ubmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b3N3aXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBhdXRvc3dpdGNoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBhdXRvc3dpdGNoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmbG93X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgZmxvd19jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBmbG93X2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pLCByZW1vdGVfbG9vcGJhY2spICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaSwgbGluZV9sb29wYmFjaykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pLCBtYWNfYWRkcmVzcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pLCBubmlfc3RhdHVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmksIG5uaV9iYWNrdXBfc3RhdHVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmksIGFjdGl2ZV9ubmkpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmksIGF1dG9zd2l0Y2gpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaSwgZmxvd19jb250cm9sKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X25uaV9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVtb3RlX2xvb3BiYWNrIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgcmVtb3RlX2xvb3BiYWNrLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgcmVtb3RlX2xvb3BiYWNrLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmVfbG9vcGJhY2siKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBsaW5lX2xvb3BiYWNrLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbGluZV9sb29wYmFjaywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG1hY19hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbWFjX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfTUFDX0FERFJFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3RpdmVfbm5pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbm5pX2Nvbm5lY3Rpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X25uaV9jb25uZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBhY3RpdmVfbm5pLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgYWN0aXZlX25uaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9BQ1RJVkVfTk5JLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9zd2l0Y2giKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgYXV0b3N3aXRjaCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGF1dG9zd2l0Y2gsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGZsb3dfY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGZsb3dfY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9GTE9XX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ubmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX2NmZyBjZmc7ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmVtb3RlX2xvb3BiYWNrIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgcmVtb3RlX2xvb3BiYWNrLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgcmVtb3RlX2xvb3BiYWNrLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlbW90ZV9sb29wYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgcmVtb3RlX2xvb3BiYWNrKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgcmVtb3RlX2xvb3BiYWNrKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGluZV9sb29wYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGxpbmVfbG9vcGJhY2ssIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBsaW5lX2xvb3BiYWNrLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX0xJTkVfTE9PUEJBQ0ssICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5lX2xvb3BiYWNrIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBsaW5lX2xvb3BiYWNrKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbGluZV9sb29wYmFjayk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBtYWNfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIG1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbWFjX2FkZHJlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubm5pX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ubmlfbGlua19zdGF0dXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ubmlfc3RhdHVzLmxpbmtfc3RhdHVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGlua19zdGF0dXMgPSAoYmNtb2x0X3RyaXZhbGVudCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ubmlfc3RhdHVzLmxpbmtfc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm5uaV9zdGF0dXMuc2lnbmFsX2RldGVjdGVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2lnbmFsX2RldGVjdGVkID0gKGJjbW9sdF90cml2YWxlbnQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubm5pX3N0YXR1cy5zaWduYWxfZGV0ZWN0ZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX3N0YXR1cy5wbWRfbG9ja2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG1kX2xvY2tlZCA9IChiY21vbHRfdHJpdmFsZW50KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm5uaV9zdGF0dXMucG1kX2xvY2tlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfbGlua19zdGF0dXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBubmlfc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm5pX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbm5pX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIG5uaV9zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubm5pX2JhY2t1cF9zdGF0dXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbm5pX2xpbmtfc3RhdHVzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX2JhY2t1cF9zdGF0dXMubGlua19zdGF0dXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5saW5rX3N0YXR1cyA9IChiY21vbHRfdHJpdmFsZW50KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm5uaV9iYWNrdXBfc3RhdHVzLmxpbmtfc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm5uaV9iYWNrdXBfc3RhdHVzLnNpZ25hbF9kZXRlY3RlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNpZ25hbF9kZXRlY3RlZCA9IChiY21vbHRfdHJpdmFsZW50KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm5uaV9iYWNrdXBfc3RhdHVzLnNpZ25hbF9kZXRlY3RlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ubmlfYmFja3VwX3N0YXR1cy5wbWRfbG9ja2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG1kX2xvY2tlZCA9IChiY21vbHRfdHJpdmFsZW50KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm5uaV9iYWNrdXBfc3RhdHVzLnBtZF9sb2NrZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG5uaV9iYWNrdXBfc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9saW5rX3N0YXR1cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBubmlfYmFja3VwX3N0YXR1cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9iYWNrdXBfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBubmlfYmFja3VwX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIG5uaV9iYWNrdXBfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWN0aXZlX25uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X25uaV9jb25uZWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ubmlfY29ubmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgYWN0aXZlX25uaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGFjdGl2ZV9ubmksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfQUNUSVZFX05OSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFjdGl2ZV9ubmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIGFjdGl2ZV9ubmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBhY3RpdmVfbm5pKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b3N3aXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBhdXRvc3dpdGNoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgYXV0b3N3aXRjaCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9BVVRPU1dJVENILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b3N3aXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgYXV0b3N3aXRjaCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIGF1dG9zd2l0Y2gpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mbG93X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBmbG93X2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBmbG93X2NvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBmbG93X2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBmbG93X2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgcmVtb3RlX2xvb3BiYWNrKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pLCBsaW5lX2xvb3BiYWNrKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pLCBtYWNfYWRkcmVzcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgbm5pX3N0YXR1cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgbm5pX2JhY2t1cF9zdGF0dXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmksIGFjdGl2ZV9ubmkpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmksIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgYXV0b3N3aXRjaCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgZmxvd19jb250cm9sKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfc3RhdCBzdGF0OyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBubmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgbm5pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2dvb2RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZ29vZF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZ29vZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3VuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X211bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9tdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X211bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2Jyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9icm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2Zjc19lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mY3NfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2Zjc19lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NvbnRyb2xfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfY29udHJvbF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfY29udHJvbF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhdXNlX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3BhdXNlX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9wYXVzZV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BmY19mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9wZmNfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3BmY19mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Vuc3VwcG9ydGVkX29wY29kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3Vuc3VwcG9ydGVkX29wY29kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF91bnN1cHBvcnRlZF9vcGNvZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Vuc3VwcG9ydGVkX2RhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2FsaWdubWVudF9lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9hbGlnbm1lbnRfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2FsaWdubWVudF9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NvZGVfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfY29kZV9lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfY29kZV9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X292ZXJzaXplZF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9vdmVyc2l6ZWRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X292ZXJzaXplZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2phYmJlcl9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9qYWJiZXJfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2phYmJlcl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X210dV9jaGVja19lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9tdHVfY2hlY2tfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X210dV9jaGVja19lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Byb21pc2N1b3VzX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3Byb21pc2N1b3VzX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9wcm9taXNjdW91c19mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3ZsYW5fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdmxhbl9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdmxhbl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RvdWJsZV92bGFuX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2RvdWJsZV92bGFuX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9kb3VibGVfdmxhbl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3RydW5jYXRlZF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF90cnVuY2F0ZWRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3RydW5jYXRlZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3VuZGVyc2l6ZV9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF91bmRlcnNpemVfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3VuZGVyc2l6ZV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYWdtZW50ZWRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3J1bnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfcnVudF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfcnVudF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2dvb2RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZ29vZF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZ29vZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3VuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X211bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9tdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X211bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Jyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9icm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2Jyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3BhdXNlX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3BhdXNlX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9wYXVzZV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3BmY19mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9wZmNfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3BmY19mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2phYmJlcl9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9qYWJiZXJfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2phYmJlcl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Zjc19lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mY3NfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2Zjc19lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2NvbnRyb2xfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfY29udHJvbF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfY29udHJvbF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X292ZXJzaXplX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X292ZXJzaXplX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9vdmVyc2l6ZV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYWdtZW50ZWRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhZ21lbnRlZF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhZ21lbnRlZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Vycm9yX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2Vycm9yX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9lcnJvcl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3ZsYW5fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfdmxhbl9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfdmxhbl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2RvdWJsZV92bGFuX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2RvdWJsZV92bGFuX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9kb3VibGVfdmxhbl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3J1bnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfcnVudF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfcnVudF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3VuZGVycnVuX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3VuZGVycnVuX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF91bmRlcnJ1bl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc182NCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMTI4XzI1NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18yNTZfNTExKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzEwMjRfMTUxOCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18xNTE5XzIwNDcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzQwOTZfOTIxNikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc185MjE3XzE2MzgzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9nb29kX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X3VuaWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfbXVsdGljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mY3NfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfY29udHJvbF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9wYXVzZV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9wZmNfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfb3Bjb2RlKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9hbGlnbm1lbnRfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfbGVuZ3RoX291dF9vZl9yYW5nZSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2NvZGVfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfb3ZlcnNpemVkX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2phYmJlcl9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9tdHVfY2hlY2tfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfcHJvbWlzY3VvdXNfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfdmxhbl9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9kb3VibGVfdmxhbl9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF90cnVuY2F0ZWRfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfdW5kZXJzaXplX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYWdtZW50ZWRfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfcnVudF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNjQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNjVfMTI3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMjU2XzUxMSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc181MTJfMTAyMykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzIwNDhfNDA5NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfOTIxN18xNjM4MykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZ29vZF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF91bmljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X211bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9icm9hZGNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfcGF1c2VfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfcGZjX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2phYmJlcl9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mY3NfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfY29udHJvbF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9vdmVyc2l6ZV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFnbWVudGVkX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2Vycm9yX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X3ZsYW5fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZG91YmxlX3ZsYW5fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfcnVudF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF91bmRlcnJ1bl9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbm5pX3N0YXRfaWQgc3RhdF9pZDsgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X25uaV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfR09PRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZ29vZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GQ1NfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2Zjc19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZmNzX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2NvbnRyb2xfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2NvbnRyb2xfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEFVU0VfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3BhdXNlX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9wYXVzZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QRkNfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3BmY19mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcGZjX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX09QQ09ERToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bnN1cHBvcnRlZF9vcGNvZGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfb3Bjb2RlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfREE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9BTElHTk1FTlRfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2FsaWdubWVudF9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYWxpZ25tZW50X2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0xFTkdUSF9PVVRfT0ZfUkFOR0U6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfbGVuZ3RoX291dF9vZl9yYW5nZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfY29kZV9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfY29kZV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9PVkVSU0laRURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X292ZXJzaXplZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfb3ZlcnNpemVkX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfamFiYmVyX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9qYWJiZXJfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVRVX0NIRUNLX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9tdHVfY2hlY2tfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X210dV9jaGVja19lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QUk9NSVNDVU9VU19GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcHJvbWlzY3VvdXNfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3Byb21pc2N1b3VzX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3ZsYW5fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3ZsYW5fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRE9VQkxFX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2RvdWJsZV92bGFuX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9kb3VibGVfdmxhbl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9UUlVOQ0FURURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3RydW5jYXRlZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdHJ1bmNhdGVkX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOREVSU0laRV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5kZXJzaXplX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bmRlcnNpemVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9ydW50X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9ydW50X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2dvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2dvb2RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEFVU0VfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3BhdXNlX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9wYXVzZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QRkNfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3BmY19mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfcGZjX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfamFiYmVyX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9qYWJiZXJfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRkNTX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mY3NfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Zjc19lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9DT05UUk9MX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9jb250cm9sX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9jb250cm9sX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX09WRVJTSVpFX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9vdmVyc2l6ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfb3ZlcnNpemVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBR01FTlRFRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZXJyb3JfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Vycm9yX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3ZsYW5fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3ZsYW5fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRE9VQkxFX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2RvdWJsZV92bGFuX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9kb3VibGVfdmxhbl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ydW50X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ydW50X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF91bmRlcnJ1bl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdW5kZXJydW5fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ubmlfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ubmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ubmlfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfbm5pX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9nb29kX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9nb29kX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3VuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3VuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZmNzX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mY3NfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09OVFJPTF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfY29udHJvbF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfY29udHJvbF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QQVVTRV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcGF1c2VfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3BhdXNlX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcGZjX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9wZmNfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfT1BDT0RFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3Vuc3VwcG9ydGVkX29wY29kZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bnN1cHBvcnRlZF9vcGNvZGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bnN1cHBvcnRlZF9kYSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bnN1cHBvcnRlZF9kYSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0FMSUdOTUVOVF9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYWxpZ25tZW50X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9hbGlnbm1lbnRfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT0RFX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9jb2RlX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9jb2RlX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX09WRVJTSVpFRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfb3ZlcnNpemVkX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9vdmVyc2l6ZWRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfSkFCQkVSX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9qYWJiZXJfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2phYmJlcl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVFVfQ0hFQ0tfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X210dV9jaGVja19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfbXR1X2NoZWNrX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BST01JU0NVT1VTX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9wcm9taXNjdW91c19mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcHJvbWlzY3VvdXNfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdmxhbl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdmxhbl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZG91YmxlX3ZsYW5fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2RvdWJsZV92bGFuX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1RSVU5DQVRFRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdHJ1bmNhdGVkX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF90cnVuY2F0ZWRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bmRlcnNpemVfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3VuZGVyc2l6ZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFHTUVOVEVEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFnbWVudGVkX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFnbWVudGVkX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1JVTlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3J1bnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3J1bnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZ29vZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF91bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF91bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QQVVTRV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfcGF1c2VfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3BhdXNlX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BGQ19GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfcGZjX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9wZmNfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfSkFCQkVSX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9qYWJiZXJfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2phYmJlcl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GQ1NfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Zjc19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZmNzX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0NPTlRST0xfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2NvbnRyb2xfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2NvbnRyb2xfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfT1ZFUlNJWkVfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X292ZXJzaXplX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9vdmVyc2l6ZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFnbWVudGVkX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFnbWVudGVkX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0VSUk9SX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9lcnJvcl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZXJyb3JfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdmxhbl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdmxhbl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9ET1VCTEVfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZG91YmxlX3ZsYW5fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2RvdWJsZV92bGFuX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1JVTlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3J1bnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3J1bnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5ERVJSVU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3VuZGVycnVuX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF91bmRlcnJ1bl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIG5uaSwgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBubmksIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBubmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBubmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBubmksIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0dXNfY2hhbmdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIG5uaSwgc3RhdHVzX2NoYW5nZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0dXNfY2hhbmdlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBubmksIHN0YXRfYWxhcm1fcmFpc2VkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0dXNfY2hhbmdlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBubmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBubmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBubmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIG5uaSwgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIG5uaSwgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIG5uaSwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdHVzX2NoYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBubmksIHN0YXR1c19jaGFuZ2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBubmksIHN0YXR1c19jaGFuZ2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUVVNfQ0hBTkdFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX3NlcmRlc19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfc2VyZGVzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX3NlcmRlc19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3NlcmRlc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zZXJkZXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW5zdGFuY2UgPSAoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5zdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmluc3RhbmNlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UsICZrZXkuaW5zdGFuY2UpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmlfc2VyZGVzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmlfc2VyZGVzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3ZnYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfdmdhKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfdmdhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfcGYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9wZik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfbGZwZik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2xmcGYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlNSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcHJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wcmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wcmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X21haW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X21haW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9tYWluKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0Myk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X2FtcCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X2FtcCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF92Z2EpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3BmKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9sZnBmKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU1KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wcmUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X21haW4pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X2FtcCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX3NlcmRlc19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfc2VyZGVzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX3NlcmRlc19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3NlcmRlc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zZXJkZXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW5zdGFuY2UgPSAoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5zdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmluc3RhbmNlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UsICZrZXkuaW5zdGFuY2UpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmlfc2VyZGVzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmlfc2VyZGVzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3ZnYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3ZnYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF92Z2EsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9WR0EsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3BmLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3BmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9sZnBmIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfbGZwZiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9sZnBmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfTEZQRiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUxLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUyLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUzLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU0LCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU1LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU1LCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcHJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcHJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3ByZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X21haW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9tYWluLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X21haW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9NQUlOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QxLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9hbXAsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfYW1wLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9zZXJkZXNfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfc2VyZGVzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX3NlcmRlc19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3NlcmRlc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zZXJkZXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5zdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pbnN0YW5jZSA9IChiY21vbHRfc2VyZGVzX2luc3RhbmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaW5zdGFuY2UgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9JTlNUQU5DRSwgJmtleS5pbnN0YW5jZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaV9zZXJkZXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaV9zZXJkZXMsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ubmlfc2VyZGVzX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX3NlcmRlc19jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9zZXJkZXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zZXJkZXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfc2VyZGVzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW5zdGFuY2UgPSAoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5zdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmluc3RhbmNlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UsICZrZXkuaW5zdGFuY2UpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pX3NlcmRlcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pX3NlcmRlcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfdmdhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfdmdhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3ZnYSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3ZnYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X3ZnYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF92Z2EpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3BmLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3BmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X3BmKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X3BmKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2xmcGYsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfbGZwZiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9sZnBmIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfbGZwZik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9sZnBmKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlMSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmUxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUyLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlMik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmUzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yeF9kZmU0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlNCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmU0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlNCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmU0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlNSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU1LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU1LCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlNSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3ByZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3ByZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wcmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wcmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wcmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcHJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfbWFpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X21haW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfbWFpbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX01BSU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9tYWluIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfbWFpbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9tYWluKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfcG9zdDEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QxLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wb3N0MSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wb3N0MSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3Bvc3QyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfcG9zdDMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcG9zdDMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcG9zdDMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9hbXAsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfYW1wLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfYW1wIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfYW1wKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X2FtcCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfdmdhKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfcGYpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9sZnBmKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlMSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmUzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlNCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wcmUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9tYWluKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcG9zdDEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wb3N0MikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfYW1wKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9zb2Z0d2FyZV9lcnJvcl9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImlkeCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmlkeCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaWR4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pZHggPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1IsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX0lEWCwgJmtleS5pZHgpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW50cnkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwgZW50cnkpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfc29mdHdhcmVfZXJyb3JfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpZHgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pZHggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImlkeCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaWR4ID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgsICZrZXkuaWR4KTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3NvZnR3YXJlX2Vycm9yX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImlkeCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmlkeCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaWR4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pZHggPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1IsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX0lEWCwgJmtleS5pZHgpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9zb2Z0d2FyZV9lcnJvcl9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpZHgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pZHggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImlkeCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaWR4ID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgsICZrZXkuaWR4KTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1IsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZW50cnkuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3dfZXJyb3IgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbnRyeS5maXJzdF9lcnJvcl90aW1lX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZmlyc3RfZXJyb3JfdGltZV91cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVudHJ5LmZpcnN0X2Vycm9yX3RpbWVfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW50cnkubGFzdF9lcnJvcl90aW1lX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9lcnJvcl90aW1lX3VzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW50cnkubGFzdF9lcnJvcl90aW1lX3VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVudHJ5LmxpbmVfbnVtYmVyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGluZV9udW1iZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW50cnkubGluZV9udW1iZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW50cnkuZXJyb3JfY291bnRlciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2NvdW50ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW50cnkuZXJyb3JfY291bnRlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbnRyeS5pbnN0YW5jZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmluc3RhbmNlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVudHJ5Lmluc3RhbmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVudHJ5LmZpbGVuYW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwuZmlsZW5hbWUsIDY0LCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW50cnkuZmlsZW5hbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW50cnkudGFza19uYW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwudGFza19uYW1lLCA2NCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVudHJ5LnRhc2tfbmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zd19lcnJvciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9FTlRSWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVudHJ5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgc29mdHdhcmVfZXJyb3IsIGVudHJ5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgc29mdHdhcmVfZXJyb3IsIGVudHJ5KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHNvZnR3YXJlX2Vycm9yLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHNvZnR3YXJlX2Vycm9yLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9vcGVyX3N0YXJ0X2NhcHR1cmVfd2luZG93X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93IG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBwb25fbmksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBwb25fbmksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVywgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmlnZ2VyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXIgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCB0cmlnZ2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgdHJpZ2dlciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdHJvYmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgc3Ryb2JlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgc3Ryb2JlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid2luZG93X21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgd2luZG93X21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCB3aW5kb3dfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1dJTkRPV19NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJpZ2dlcl9wb3NpdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgdHJpZ2dlcl9wb3NpdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIHRyaWdnZXJfcG9zaXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVywgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgc3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBzdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUT1BfRFVFX1RPX0NPUlJVUFRfU1RST0JFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhcnRfb2Zmc2V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgc3RhcnRfb2Zmc2V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgc3RhcnRfb2Zmc2V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RBUlRfT0ZGU0VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mZnNldCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIGVuZF9vZmZzZXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBlbmRfb2Zmc2V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfRU5EX09GRlNFVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9jeWNsZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIG51bWJlcl9vZl9jeWNsZXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBudW1iZXJfb2ZfY3ljbGVzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfTlVNQkVSX09GX0NZQ0xFUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9vcGVyX3N0b3BfY2FwdHVyZV93aW5kb3dfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdyBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdyBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdG9wX2NhcHR1cmVfd2luZG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RvcF9jYXB0dXJlX3dpbmRvdywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RvcF9jYXB0dXJlX3dpbmRvdywgcG9uX25pLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdG9wX2NhcHR1cmVfd2luZG93LCBwb25fbmksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVE9QX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1dfSURfUE9OX05JLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB0cnhfY2FsaWJyYXRpb24sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB0cnhfY2FsaWJyYXRpb24sIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB0cnhfY2FsaWJyYXRpb24sIGNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHRyeF9jYWxpYnJhdGlvbiwgY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHRyeF9jYWxpYnJhdGlvbiwgY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHRyeF9jYWxpYnJhdGlvbiwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19DRkdfSURfQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fYWxsb2MsIHN0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fYWxsb2MsIHN0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzbGEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgc2xhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2FsbG9jLCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb2xsZWN0X3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fYWxsb2MsIHNsYSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fYWxsb2MsIG9udV9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fYWxsb2NfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fYWxsb2MsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzbGEuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2FsbG9jX3NsYSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmNicl9ydF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5jYnJfcnRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuY2JyX25ydF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ucnRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuY2JyX25ydF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5ndWFyYW50ZWVkX2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3VhcmFudGVlZF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5ndWFyYW50ZWVkX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLm1heGltdW1fYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhpbXVtX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLm1heGltdW1fYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgPSAoYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5jYnJfcnRfY29tcGVuc2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX3J0X2NvbXBlbnNhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmNicl9ydF9jb21wZW5zYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuY2JyX3J0X2FwX2luZGV4Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX3J0X2FwX2luZGV4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmNicl9ydF9hcF9pbmRleCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5jYnJfbnJ0X2FwX2luZGV4Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX25ydF9hcF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5jYnJfbnJ0X2FwX2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmFsbG9jX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hbGxvY190eXBlID0gKGJjbW9sdF9hbGxvY190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmFsbG9jX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEud2VpZ2h0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2VpZ2h0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLndlaWdodCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5wcmlvcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnByaW9yaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIHNsYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fYWxsb2Nfc2xhIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NMQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzbGEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb2xsZWN0X3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fYWxsb2MsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2NfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hbGxvY19zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYWxsb2Nfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIHN0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIHN0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBzdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5zbGEuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2FsbG9jX3NsYSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5jYnJfcnRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmNicl9ydF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuY2JyX25ydF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ucnRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmNicl9ucnRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmd1YXJhbnRlZWRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ndWFyYW50ZWVkX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5ndWFyYW50ZWVkX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5tYXhpbXVtX2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4aW11bV9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEubWF4aW11bV9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgPSAoYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmNicl9ydF9jb21wZW5zYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfY29tcGVuc2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmNicl9ydF9jb21wZW5zYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmNicl9ydF9hcF9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9hcF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX3J0X2FwX2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5jYnJfbnJ0X2FwX2luZGV4Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX25ydF9hcF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX25ydF9hcF9pbmRleCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuYWxsb2NfdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFsbG9jX3R5cGUgPSAoYmNtb2x0X2FsbG9jX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmFsbG9jX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLndlaWdodCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndlaWdodCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEud2VpZ2h0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5wcmlvcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnByaW9yaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzbGEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2FsbG9jX3NsYSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TTEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgc2xhLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIHNsYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9hbGxvYywgc2xhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIG9udV9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9hbGxvYywgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY29sbGVjdF9zdGF0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb2xsZWN0X3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBzdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBzbGEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9hbGxvYywgb251X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2Nfb3Blcl9nZXRfc3RhdHNfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHMgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fYWxsb2MsIGdldF9zdGF0cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9hbGxvYywgZ2V0X3N0YXRzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bV9vZl9jeWNsZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9hbGxvYywgZ2V0X3N0YXRzLCBudW1fb2ZfY3ljbGVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fYWxsb2MsIGdldF9zdGF0cywgbnVtX29mX2N5Y2xlcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFMsIEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2FsbG9jX29wZXJfc2V0X3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlIG9wZXI7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX2FsbG9jLCBzZXRfc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fYWxsb2MsIHNldF9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FsbG9jX29wZXJhdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYWxsb2Nfb3BlcmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9hbGxvYywgc2V0X3N0YXRlLCBzdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX2FsbG9jLCBzZXRfc3RhdGUsIHN0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURSwgQkNNT0xUX1hHUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2FsbG9jX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0IHN0YXQ7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2Nfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9hbGxvYywgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2FsbG9jLCByeF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX2FsbG9jLCByeF9ieXRlcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2FsbG9jLCByeF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fYWxsb2MsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fYWxsb2MsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9hbGxvYywgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIHhncG9uX2FsbG9jLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCB4Z3Bvbl9hbGxvYywgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmNyeXB0aW9uX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBlbmNyeXB0aW9uX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBlbmNyeXB0aW9uX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24uZGlyZWN0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGlyZWN0aW9uID0gKGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjb25maWd1cmF0aW9uLmRpcmVjdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24udHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGUgPSAoYmNtb2x0X2dlbV9wb3J0X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjb25maWd1cmF0aW9uLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTkZJR1VSQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuY3J5cHRpb25fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBlbmNyeXB0aW9uX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0VOQ1JZUFRJT05fTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY29uZmlndXJhdGlvbi5kaXJlY3Rpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kaXJlY3Rpb24gPSAoYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jb25maWd1cmF0aW9uLmRpcmVjdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jb25maWd1cmF0aW9uLnR5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlID0gKGJjbW9sdF9nZW1fcG9ydF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNvbmZpZ3VyYXRpb24udHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIG9udV9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZ2VtX3BvcnRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBnZW1fcG9ydF9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuY3J5cHRpb25fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBlbmNyeXB0aW9uX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0VOQ1JZUFRJT05fTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuY3J5cHRpb25fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBlbmNyeXB0aW9uX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGVuY3J5cHRpb25fbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBvbnVfaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXQgc3RhdDsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCB0eF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCByeF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCB0eF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9yYWlzZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25faXdmX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25faXdmX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRzX3RwaWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3UxNl81X2hleCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfdHBpZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZHNfdHBpZC5hcnIgbXVzdCBoYXZlIDUgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDU7IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMF0gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRzX3RwaWQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfNV9oZXggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9EU19UUElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2l3Zl9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25faXdmLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9pd2ZfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2l3Zl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25faXdmLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfb3RhZ19kaXJlY3RfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZHNfdHBpZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzVfaGV4IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHNfdHBpZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmRzX3RwaWQuYXJyIG11c3QgaGF2ZSA1IGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA1OyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHNfdHBpZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9pd2YsIGRzX3RwaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl81X2hleCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9pd2YsIGRzX3RwaWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc190cGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25faXdmLCBkc190cGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2l3ZiwgZHNfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25faXdmLCBkc190cGlkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2l3ZiwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9pd2YsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1lbW9yeSBidWZmZXIgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaHdfcG9uX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgaHdfcG9uX2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXZhaWxhYmxlX2JhbmR3aWR0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibnVtYmVyX29mX2FjdGl2ZV9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBvbl9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG9uX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2Rpc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG9uX2Rpc3RhbmNlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBvbl9kaXN0YW5jZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ193aW5kb3dfc2l6ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXFkX2N5Y2xlc19udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJpZnRfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2FsYXJtX3RocmVzaG9sZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2luaXRpYWxfdmFsdWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmVyX21vbml0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBiZXJfbW9uaXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBiZXJfbW9uaXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic25fYWNxdWlzaXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGtleV9leGNoYW5nZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGJhX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkYmFfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkYmFfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1faGFuZGxpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwbG9hbV9oYW5kbGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwbG9hbV9oYW5kbGluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2tleSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG11bHRpY2FzdF9rZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbXVsdGljYXN0X2tleSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19jaGVja2VyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHByYnNfY2hlY2tlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfYmFuZHdpZHRoX2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhbGxfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhbGxfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX21jYXN0X2dlbV9wb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfZmVjX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkc19mZWNfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkc19mZWNfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGJhX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkYmFfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkYmFfdHlwZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3R1bmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG9udV90dW5pbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3R1bmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgaHdfcG9uX2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIHBvbl9zdGF0dXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwb25fZGlzdGFuY2UpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBkcmlmdF9jb250cm9sKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWN0aXZhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIHNuX2FjcXVpc2l0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwbG9hbV9oYW5kbGluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19jaGVja2VyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX3N0YXR1cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX29udXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGVidWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBkc19mZWNfbW9kZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGRiYV90eXBlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3R1bmluZykpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIHNldCBtZW1vcnkgdG8gdXNlIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGxpc3RfbWVtID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAobGlzdF9tZW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibGlzdF9tZW0gPSBiY21vc19jYWxsb2MoQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKyAgICBCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIHhncG9uX25pLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJod19wb25faWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfaHdfcG9uX2lkIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJod19wb25faWQucG9uX2lkXzEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb25faWRfMSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImh3X3Bvbl9pZC5wb25faWRfMSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImh3X3Bvbl9pZC5wb25faWRfMiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbl9pZF8yID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaHdfcG9uX2lkLnBvbl9pZF8yIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9od19wb25faWQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfSFdfUE9OX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwb25fZGlzdGFuY2UuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2Rpc3RhbmNlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9sb2dfZGlzdGFuY2UgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9kaXN0YW5jZS5tYXhfZGlmZl9yZWFjaCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9kaWZmX3JlYWNoID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX2Rpc3RhbmNlLm1heF9kaWZmX3JlYWNoIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvbl9kaXN0YW5jZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZGlzdGFuY2UgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvbl9kaXN0YW5jZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVxZF9jeWNsZXNfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wuZHJpZnRfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kcmlmdF9pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRyaWZ0X2NvbnRyb2wuZHJpZnRfaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcmlmdF9jb250cm9sLmRyaWZ0X2xpbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHJpZnRfbGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkcmlmdF9jb250cm9sLmRyaWZ0X2xpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJpZnRfY29udHJvbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZHJpZnRfY29udHJvbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkcmlmdF9jb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdHVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvc2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2JpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9iaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2JpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzLmxvb2NpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9vY2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9vY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9wY2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3BjaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb3BjaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYmVyX21vbml0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c19iZXJfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvci5zZl90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZl90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiZXJfbW9uaXRvci5zZl90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvci5zZF90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZF90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiZXJfbW9uaXRvci5zZF90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGJlcl9tb25pdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbi5rZXlfZXhjaGFuZ2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5rZXlfZXhjaGFuZ2UgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWN0aXZhdGlvbi5rZXlfZXhjaGFuZ2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbi5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWN0aXZhdGlvbi5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic25fYWNxdWlzaXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNuX2FjcXVpc2l0aW9uLmludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNuX2FjcXVpc2l0aW9uLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic25fYWNxdWlzaXRpb24uY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub251X3Bvc3RfZGlzY292ZXJ5X21vZGUgPSAoYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic25fYWNxdWlzaXRpb24ub251X3Bvc3RfZGlzY292ZXJ5X21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi5idXJzdF9wcm9maWxlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYnVyc3RfcHJvZmlsZSA9IChiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic25fYWNxdWlzaXRpb24uYnVyc3RfcHJvZmlsZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJrZXlfZXhjaGFuZ2UuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2UuaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImtleV9leGNoYW5nZS5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZS5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImtleV9leGNoYW5nZS5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlLmVuY3J5cHRlZF9wb3J0c19vbmx5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZW5jcnlwdGVkX3BvcnRzX29ubHkgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJrZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nLnRpbWVvdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZy5ncGlvX3BpbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9fcGluID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmcuZmFzdF9yYW5naW5nIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZmFzdF9yYW5naW5nID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZy5mYXN0X3JhbmdpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLmRhdGFfbWFwX2RlbGF5X21zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9tYXBfZGVsYXlfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5kYXRhX21hcF9kZWxheV9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcucmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZV9kZWxheSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWVfZGVsYXkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0RFQlVHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV83Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfNyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfNyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1hXzMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV8xID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8xIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3UxNl8yIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIG11c3QgaGF2ZSAyIGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCAyOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl8yIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbG93cG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9tYW5hZ2VtZW50Lmlsb3dwb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuaWF3YXJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaWF3YXJlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pYXdhcmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pdHJhbnNpbml0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pdHJhbnNpbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5pdHhpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXR4aW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX21hbmFnZW1lbnQuaXR4aW5pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXJ4b2ZmID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pcnhvZmYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Lmxvd19wb3dlcl9jbG9iaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvd19wb3dlcl9jbG9iaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX21hbmFnZW1lbnQubG93X3Bvd2VyX2Nsb2JpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5ULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSA9IChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VBUkxZX1JPR1VFX0RFVEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5tZWFzdXJlbWVudF90eXBlIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5tZWFzdXJlbWVudF90eXBlID0gKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0ubWVhc3VyZW1lbnRfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmludGVydmFsIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uc2Vjb25kX3Jhbmdpbmdfd2luZG93Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnNlY29uZF9yYW5naW5nX3dpbmRvdyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsbG9jX3R5cGVfdG9fc2NhbiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uYWxsb2NfdHlwZV90b19zY2FuID0gKGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGxvY190eXBlX3RvX3NjYW4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGkxOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5wbG9fc2l6ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLnBsb19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0ucGxvX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hbGxvY19pZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFsbG9jX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0uYWxsb2NfaWQgPSAoYmNtb2x0X3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMub251X2lkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMub251X2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0ub251X2lkID0gKGJjbW9sdF9wb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hY2Nlc3Nfc2l6ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFjY2Vzc19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0uYWNjZXNzX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3NlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VYVEVOREVEX0dVQVJEX1RJTUU6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWRkaXRpb25hbF9ndWFyZF90aW1lIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWRkaXRpb25hbF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYmFfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RiYV9tb2RlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kYmFfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkYmFfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInBsb2FtX2hhbmRsaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZy5hY2tfdGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFja190aW1lb3V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGxvYW1faGFuZGxpbmcuYWNrX3RpbWVvdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JhbmdpbmdfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJldHJhbnNfcmFuZ2luZ190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGxvYW1faGFuZGxpbmcucmV0cmFuc19yYW5naW5nX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZy5yZXRyYW5zX2Fzc2lnbl9hbGxvY19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJldHJhbnNfYXNzaWduX2FsbG9jX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGxvYW1faGFuZGxpbmcucmV0cmFuc19hc3NpZ25fYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZy5yZXRyYW5zX2tleV9jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmV0cmFuc19rZXlfY29udHJvbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtX2hhbmRsaW5nLnJldHJhbnNfa2V5X2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmV0cmFuc19yZXF1ZXN0X3JlZ2lzdHJhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUExPQU1fSEFORExJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9nZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2dlbV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2dlbV9wb3J0X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJtdWx0aWNhc3Rfa2V5LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJtdWx0aWNhc3Rfa2V5LmtleS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2tleS5rZXkuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgbXVsdGljYXN0X2tleS5rZXkuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmtleS5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtdWx0aWNhc3Rfa2V5LmtleS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm11bHRpY2FzdF9rZXkua2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2tleS5rZXlfY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmtleV9jb250cm9sID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtdWx0aWNhc3Rfa2V5LmtleV9jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG11bHRpY2FzdF9rZXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NVUxUSUNBU1RfS0VZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG11bHRpY2FzdF9rZXksIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19jaGVja2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfY2hlY2tlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfaW5zZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ub251X2FsYXJtcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9udV9hbGFybXMgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGl3aSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24udGl3aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWNrX3RpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uc2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2ZpID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5zZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9raSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX2JhbmR3aWR0aF9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkZWJ1Zy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcuaW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmluY3JlYXNlX2F2YWlsYWJsZV9jYnJfYncgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnLmluY3JlYXNlX2F2YWlsYWJsZV9jYnJfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Zy5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Zy5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfZGVidWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGVidWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5tYXhfcmV0cnlfY291bnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfcmV0cnlfY291bnQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMubWF4X3JldHJ5X2NvdW50IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLm9tY2lfZm9ybWF0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub21jaV9mb3JtYXQgPSAoYmNtb2x0X29tY2lfZGV2aWNlX2lkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLm9tY2lfZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMud2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWN0aXZhdGVfY29tbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLmRlbGF5X2Zvcl9jb21taXRfbXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kZWxheV9mb3JfY29tbWl0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLmRlbGF5X2Zvcl9jb21taXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2ZlY19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkc19mZWNfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHNfZmVjX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGJhX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kYmFfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZGJhX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRiYV90eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJvbnVfdHVuaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3R1bmluZy50c291cmNlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHNvdXJjZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV90dW5pbmcudHNvdXJjZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV90dW5pbmcudHRhcmdldCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR0YXJnZXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdHVuaW5nLnR0YXJnZXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdHVuaW5nLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVxdWVzdF9yZWdpc3RyYXRpb25fcmVxdWlyZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV90dW5pbmcucmVxdWVzdF9yZWdpc3RyYXRpb25fcmVxdWlyZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3R1bmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1RVTklORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdHVuaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmh3X3Bvbl9pZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9od19wb25faWQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5od19wb25faWQucG9uX2lkXzEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb25faWRfMSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5od19wb25faWQucG9uX2lkXzEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaHdfcG9uX2lkLnBvbl9pZF8yIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9uX2lkXzIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuaHdfcG9uX2lkLnBvbl9pZF8yIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9od19wb25faWQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfSFdfUE9OX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImh3X3Bvbl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBod19wb25faWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGh3X3Bvbl9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hdmFpbGFibGVfYmFuZHdpZHRoLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5jYnJfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5jYnJfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC50b3RhbF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRvdGFsX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgudG90YWxfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5uZXh0X29udV90b3RhbF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5leHRfb251X3RvdGFsX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgubmV4dF9vbnVfdG90YWxfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdmFpbGFibGVfYmFuZHdpZHRoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5udW1iZXJfb2ZfYWN0aXZlX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1iZXJfb2ZfYWN0aXZlX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG9uX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fc3RhdHVzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG9uX3N0YXR1cy5zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXRlID0gKGJjbW9sdF9wb25fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX3N0YXR1cy5zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fc3RhdHVzLmxvc19zdGF0dXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3Nfc3RhdHVzID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX3N0YXR1cy5sb3Nfc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvbl9zdGF0dXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX3N0YXR1cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvbl9zdGF0dXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBvbl9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBvbl9zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9kaXN0YW5jZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvbl9kaXN0YW5jZS5tYXhfbG9nX2Rpc3RhbmNlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2xvZ19kaXN0YW5jZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fZGlzdGFuY2UubWF4X2RpZmZfcmVhY2giKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfZGlmZl9yZWFjaCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb25fZGlzdGFuY2UubWF4X2RpZmZfcmVhY2ggaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kaXN0YW5jZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2Rpc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBvbl9kaXN0YW5jZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcG9uX2Rpc3RhbmNlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ193aW5kb3dfc2l6ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfd2luZG93X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVxZF9jeWNsZXNfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXFkX2N5Y2xlc19udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kcmlmdF9jb250cm9sLmRyaWZ0X2ludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHJpZnRfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHJpZnRfY29udHJvbC5kcmlmdF9pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kcmlmdF9jb250cm9sLmRyaWZ0X2xpbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHJpZnRfbGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHJpZnRfY29udHJvbC5kcmlmdF9saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kcmlmdF9jb250cm9sLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHJpZnRfY29udHJvbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkcmlmdF9jb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdHVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3NpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb3NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2JpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9iaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9iaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9vY2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb29jaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9vY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvcGNpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9wY2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvcGNpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5iZXJfbW9uaXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c19iZXJfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmVyX21vbml0b3IudXNfYmVyX2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJlcl9tb25pdG9yLnNmX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iZXJfbW9uaXRvci5zZl90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmVyX21vbml0b3Iuc2RfdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2RfdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBiZXJfbW9uaXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBiZXJfbW9uaXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub251X2FjdGl2YXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi5rZXlfZXhjaGFuZ2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5rZXlfZXhjaGFuZ2UgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X2FjdGl2YXRpb24ua2V5X2V4Y2hhbmdlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLmZhaWxfZHVlX3RvX3JlZ2lzX2F1dG9fZmFpbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZhaWxfZHVlX3RvX3JlZ2lzX2F1dG9fZmFpbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24ub251X3Bvc3RfZGlzY292ZXJ5X21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSA9IChiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24ub251X3Bvc3RfZGlzY292ZXJ5X21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uYnVyc3RfcHJvZmlsZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1cnN0X3Byb2ZpbGUgPSAoYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXgpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5idXJzdF9wcm9maWxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHNuX2FjcXVpc2l0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHNuX2FjcXVpc2l0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic25fYWNxdWlzaXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHNuX2FjcXVpc2l0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2UuaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2UuaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZS5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZS5lbmNyeXB0ZWRfcG9ydHNfb25seSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVuY3J5cHRlZF9wb3J0c19vbmx5ID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZS5lbmNyeXB0ZWRfcG9ydHNfb25seSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBrZXlfZXhjaGFuZ2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBrZXlfZXhjaGFuZ2UsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBrZXlfZXhjaGFuZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19waW4gPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmZhc3RfcmFuZ2luZyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZhc3RfcmFuZ2luZyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmZhc3RfcmFuZ2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLmRhdGFfbWFwX2RlbGF5X21zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9tYXBfZGVsYXlfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcuZGF0YV9tYXBfZGVsYXlfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcucmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWVfZGVsYXkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWVfZGVsYXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV83Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfNyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfMyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8xIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfMSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciBtdXN0IGhhdmUgMiBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbG93cG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pYXdhcmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pYXdhcmUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pYXdhcmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHJhbnNpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXRyYW5zaW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHhpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXR4aW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb3dlcl9tYW5hZ2VtZW50Lml0eGluaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pcnhvZmYiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pcnhvZmYgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pcnhvZmYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3dfcG93ZXJfY2xvYmkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSA9IChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLm1lYXN1cmVtZW50X3R5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0ubWVhc3VyZW1lbnRfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5pbnRlcnZhbCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uc2Vjb25kX3Jhbmdpbmdfd2luZG93Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5zZWNvbmRfcmFuZ2luZ193aW5kb3cgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxsb2NfdHlwZV90b19zY2FuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4gPSAoYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGxvY190eXBlX3RvX3NjYW4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLnBsb19zaXplIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLnBsb19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0ucGxvX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbjsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsW2kxXS5hbGxvY19pZCA9IChiY21vbHRfcG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMub251X2lkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLm9udV9pZCA9IChiY21vbHRfcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFjY2Vzc19zaXplIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFjY2Vzc19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0uYWNjZXNzX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWRkaXRpb25hbF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRiYV9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGJhX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RiYV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRiYV9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkYmFfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYmFfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBkYmFfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZGJhX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucGxvYW1faGFuZGxpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5hY2tfdGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFja190aW1lb3V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBsb2FtX2hhbmRsaW5nLmFja190aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmFuZ2luZ190aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmV0cmFuc19yYW5naW5nX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucGxvYW1faGFuZGxpbmcucmV0cmFuc19yYW5naW5nX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGxvYW1faGFuZGxpbmcucmV0cmFuc19hc3NpZ25fYWxsb2NfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXRyYW5zX2Fzc2lnbl9hbGxvY19pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5yZXRyYW5zX2Fzc2lnbl9hbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5yZXRyYW5zX2tleV9jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmV0cmFuc19rZXlfY29udHJvbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5yZXRyYW5zX2tleV9jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUExPQU1fSEFORExJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwbG9hbV9oYW5kbGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5taW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbWluX2RhdGFfYWxsb2NfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5taW5fZGF0YV9nZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2dlbV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2dlbV9wb3J0X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbl9kYXRhX2dlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIG1pbl9kYXRhX2dlbV9wb3J0X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5tdWx0aWNhc3Rfa2V5LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubXVsdGljYXN0X2tleS5rZXkuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tdWx0aWNhc3Rfa2V5LmtleS5ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIubXVsdGljYXN0X2tleS5rZXkuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmtleS5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubXVsdGljYXN0X2tleS5rZXkuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubXVsdGljYXN0X2tleS5rZXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXVsdGljYXN0X2tleS5rZXlfY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmtleV9jb250cm9sID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubXVsdGljYXN0X2tleS5rZXlfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTVVMVElDQVNUX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2tleSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIubW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5kYXRhX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19jaGVja2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfY2hlY2tlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHByYnNfY2hlY2tlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfaW5zZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmxvY2tfc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NrX3N0YXRlID0gKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9jb3VudHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMuZXJyb3JfY291bnRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfc3RhdHVzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbnVfYWxhcm1zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ub251X2FsYXJtcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGl3aSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnRpd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uYWNrX3RpbWVvdXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY2tfdGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnNmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmaSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnNmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxva2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51c19iYW5kd2lkdGhfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19iYW5kd2lkdGhfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX29udXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTI7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfb251cy5vbnVfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX29udXMub251X2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdmFsLmxlbjsgaTIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kyXS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMl0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9vbnVzLnN0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9vbnVzLnN0YXRlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdmFsLmxlbjsgaTIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kyXS5zdGF0ZSA9IChiY21vbHRfb251X3N0YXRlKSBjbGlfcGFybS0+dmFsdWVzW2kyXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGFsbF9vbnVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX29udXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBhbGxfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkzOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy5nZW1faWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy5nZW1faWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB2YWwubGVuOyBpMysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTNdLmdlbV9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kzXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy5zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfbWNhc3RfZ2VtX3BvcnRzLnN0YXRlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdmFsLmxlbjsgaTMrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kzXS5zdGF0ZSA9IChiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZXNbaTNdLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX21jYXN0X2dlbV9wb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX25pX2RlYnVnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcuaW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmluY3JlYXNlX2F2YWlsYWJsZV9jYnJfYncgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy5pbmNyZWFzZV9hdmFpbGFibGVfY2JyX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLmludGVyX2J1cnN0X2dhcF9pbl9ieXRlcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVyX2J1cnN0X2dhcF9pbl9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkZWJ1ZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9ERUJVRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkZWJ1ZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGRlYnVnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBkZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm1heF9yZXRyeV9jb3VudCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9yZXRyeV9jb3VudCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X3JldHJ5X2NvdW50IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5vbWNpX2Zvcm1hdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9tY2lfZm9ybWF0ID0gKGJjbW9sdF9vbWNpX2RldmljZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMub21jaV9mb3JtYXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5hY3RpdmF0ZV9jb21taXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY3RpdmF0ZV9jb21taXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5kZWxheV9mb3JfY29tbWl0X21zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGVsYXlfZm9yX2NvbW1pdF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kc19mZWNfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHNfZmVjX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRzX2ZlY19tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2ZlY19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGRzX2ZlY19tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBkc19mZWNfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRiYV90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGJhX3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RiYV90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRiYV90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkYmFfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYmFfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBkYmFfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZGJhX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub251X3R1bmluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdHVuaW5nLnRzb3VyY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50c291cmNlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV90dW5pbmcudHNvdXJjZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdHVuaW5nLnR0YXJnZXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50dGFyZ2V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV90dW5pbmcudHRhcmdldCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdHVuaW5nLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVxdWVzdF9yZWdpc3RyYXRpb25fcmVxdWlyZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdHVuaW5nLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV90dW5pbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9UVU5JTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3R1bmluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV90dW5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X3R1bmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X3R1bmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGh3X3Bvbl9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwb25fc3RhdHVzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIHBvbl9kaXN0YW5jZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBkYmFfbW9kZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwbG9hbV9oYW5kbGluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIHByYnNfY2hlY2tlcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX3N0YXR1cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX29udXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBkZWJ1ZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZHNfZmVjX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZGJhX3R5cGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X3R1bmluZykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfc3RhdCBzdGF0OyAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIHhncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIHhncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIGZlY19jb2Rld29yZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBmZWNfY29kZXdvcmRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXAzMl9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgYmlwMzJfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBiaXAzMl9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmlwMzJfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBiaXAzMl9lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBiaXAzMl9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3hndGNfaGVhZGVycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGd0Y19oZWFkZXJzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGd0Y19oZWFkZXJzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF94Z3RjX2NvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGd0Y19jb3JyZWN0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z3RjX2NvcnJlY3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfeGd0Y191bmNvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGd0Y191bmNvcnJlY3RlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hndGNfdW5jb3JyZWN0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3hnZW0iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hnZW0pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF94Z2VtX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hnZW1fZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hnZW1fZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfeGdlbV9pZGxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2lkbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2lkbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3hnZW1fY29ycmVjdGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2NvcnJlY3RlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hnZW1fY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9jcmNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2NyY19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2NyY19lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZnJhZ21lbnRfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2ZyYWdtZW50X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfZnJhZ21lbnRfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhY2tldHNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kcm9wcGVkX3Rvb19zaG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZHJvcHBlZF90b29fbG9uZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2tleV9lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfa2V5X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfa2V5X2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wbG9hbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X3Bsb2Ftcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X3Bsb2Ftcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGxvYW1zX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2FsbG9jYXRpb25zX3ZhbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9hbGxvY2F0aW9uc19pbnZhbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2FtcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXNfbm9uX2lkbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGxvYW1zX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXNfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NwdSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfY3B1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfY3B1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vbWNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9vbWNpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfb21jaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X3BhY2tldHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF94Z2VtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF94Z2VtKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfeGdlbSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfY3B1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9jcHUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9jcHUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X29tY2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X29tY2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9vbWNpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Ryb3BwZWRfdHBpZF9taXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X2Ryb3BwZWRfdHBpZF9taXNzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9kcm9wcGVkX3ZpZF9taXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCBmZWNfY29kZXdvcmRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCBiaXAzMl9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgYmlwMzJfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z3RjX2hlYWRlcnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hndGNfY29ycmVjdGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z3RjX3VuY29ycmVjdGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2Ryb3BwZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hnZW1faWRsZSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGdlbV9jb3JyZWN0ZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2NyY19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfZnJhZ21lbnRfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2tleV9lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfcGxvYW1zKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9jcHUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X29tY2kpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHR4X3BhY2tldHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHR4X3hnZW0pICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHR4X2NwdSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfb21jaSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9zZXRfcG9uX3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX29wZXJhdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcG9uX29wZXJhdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURSwgQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9yZXNldF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3Jlc2V0IG9wZXI7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfcmVzZXQgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHJlc2V0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCByZXNldCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX2Rpc2FibGVfc2VyaWFsX251bWJlcl9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIGRpc2FibGVfc2VyaWFsX251bWJlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIGRpc2FibGVfc2VyaWFsX251bWJlciwgY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVIsIEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX2lkIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX2lkLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX3NwZWNpZmljLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIGRpc2FibGVfc2VyaWFsX251bWJlciwgc2VyaWFsX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zZXJpYWxfbnVtYmVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSLCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3Jpbmdfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfc2V0X29udV9zdGF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGUgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzZXRfb251X3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV9vcGVyYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X29udV9vcGVyYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUsIEJDTU9MVF9YR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfcnVuX3NwZWNpYWxfYndfbWFwX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXAgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHJ1bl9zcGVjaWFsX2J3X21hcCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgcnVuX3NwZWNpYWxfYndfbWFwLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9jeWNsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJ1bl9zcGVjaWFsX2J3X21hcCwgbnVtYmVyX29mX2N5Y2xlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJ1bl9zcGVjaWFsX2J3X21hcCwgbnVtYmVyX29mX2N5Y2xlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JVTl9TUEVDSUFMX0JXX01BUCwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9OVU1CRVJfT0ZfQ1lDTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY2F0aW9uX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJ1bl9zcGVjaWFsX2J3X21hcCwgYWxsb2NhdGlvbl9udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcnVuX3NwZWNpYWxfYndfbWFwLCBhbGxvY2F0aW9uX251bWJlciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9SVU5fU1BFQ0lBTF9CV19NQVAsIEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQUxMT0NBVElPTl9OVU1CRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJid19tYXBfYXJyYXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBydW5fc3BlY2lhbF9id19tYXAsIGJ3X21hcF9hcnJheSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBydW5fc3BlY2lhbF9id19tYXAsIGJ3X21hcF9hcnJheSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9SVU5fU1BFQ0lBTF9CV19NQVAsIEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQldfTUFQX0FSUkFZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid2luZG93X3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgd2luZG93X3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgd2luZG93X3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVywgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgYWxsb2NfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgYWxsb2NfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVywgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XLCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZWNvbmRfcmFuZ2luZ193aW5kb3ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIHNlY29uZF9yYW5naW5nX3dpbmRvdywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBzZWNvbmRfcmFuZ2luZ193aW5kb3csICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVywgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfcHJveHlfY3B1X3BhY2tldHNfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0cyBwcm94eTsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHMgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9wcm94eV9zZW5kIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wYWNrZXRfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcGFja2V0X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYWxjX2NyYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgY2FsY19jcmMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgY2FsY19jcmMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfbGlzdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmFsW2kwXSA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBnZW1fcG9ydF9saXN0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgZ2VtX3BvcnRfbGlzdCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1ZmZlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9IHsgfTsKKyAgICAgICAgdmFsLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwubGVuKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52YWwsIHZhbC5sZW4pOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBidWZmZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfcHJveHlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0IHByb3h5OyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCBwcm94eTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3Byb3h5X3NlbmQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIHhncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgeGdwb25fbmksIGJyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInBsb2FtLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF80MCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW0uYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBwbG9hbS5hcnIgbXVzdCBoYXZlIDQwIGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuYXJyLCA0MCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGxvYW0uYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBwbG9hbSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdThfNDAgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVQsIEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBwbG9hbSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHByb3h5Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3RvZF9yZXF1ZXN0X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3Qgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCB0b2RfcmVxdWVzdCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgdG9kX3JlcXVlc3QsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9zdGFydF9vbnVfdXBncmFkZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaXN0X29mX29udV9pZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyIHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC52YWxbaTBdID0gKGJjbW9sdF9wb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwgbGlzdF9vZl9vbnVfaWRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERSwgQkNNT0xUX1hHUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBsaXN0X29mX29udV9pZHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX2FkanVzdF90eF93YXZlbGVuZ3RoX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGggb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIGFkanVzdF90eF93YXZlbGVuZ3RoLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX2lkIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX2lkLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX3NwZWNpZmljLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIGFkanVzdF90eF93YXZlbGVuZ3RoLCBzZXJpYWxfbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSCwgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX1NFUklBTF9OVU1CRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBhZGp1c3RfdHhfd2F2ZWxlbmd0aCwgc2VyaWFsX251bWJlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBhZGp1c3RfdHhfd2F2ZWxlbmd0aCwgZnJlcWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RILCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEgsIEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X3hncG9uX25pX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBmZWNfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgZmVjX2NvZGV3b3Jkcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBiaXAzMl9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGJpcDMyX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBiaXAzMl9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBiaXAzMl9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfSEVBREVSUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfaGVhZGVycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfaGVhZGVycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z3RjX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y191bmNvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfdW5jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU06CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0lETEU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfY3JjX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2ZyYWdtZW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZnJhZ21lbnRfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2tleV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2tleV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUExPQU1TOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfcGxvYW1zLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfcGxvYW1zLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NQVToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2NwdSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2NwdSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X29tY2ksIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9vbWNpLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X3hnZW0sIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF94Z2VtLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9jcHUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9jcHUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0k6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfc3RhdF9pZCBzdGF0X2lkOyAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfeGdwb25fbmlfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGZlY19jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBmZWNfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGJpcDMyX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgYmlwMzJfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGJpcDMyX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGJpcDMyX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19IRUFERVJTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y19oZWFkZXJzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y19oZWFkZXJzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y19jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfVU5DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z3RjX3VuY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y191bmNvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW0sIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW1faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW1faWRsZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW1fY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZnJhZ21lbnRfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9mcmFnbWVudF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfa2V5X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfa2V5X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9wbG9hbXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9wbG9hbXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19JTlZBTElEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1BVOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfY3B1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfY3B1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X29tY2ksIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9YR0VNOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfeGdlbSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X3hnZW0sIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2NwdSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2NwdSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X29tY2ksIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9vbWNpLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1M6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfdHBpZF9taXNzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIHhncG9uX25pLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNwdV9wYWNrZXRzX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHNfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHNfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGxvcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgbG9zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGlzY292ZXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBvbnVfZGlzY292ZXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgb251X2Rpc2NvdmVyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgdG9kX3JlcXVlc3RfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHNfZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBlbmFibGVfYWxsX29udXNfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGxvcykgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBvbnVfZGlzY292ZXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjcHVfcGFja2V0c19mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGNwdV9wYWNrZXRzX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBjcHVfcGFja2V0c19mYWlsdXJlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGxvcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGxvcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9kaXNjb3ZlcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIG9udV9kaXNjb3ZlcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgb251X2Rpc2NvdmVyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfY29tcGxldGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidG9kX3JlcXVlc3RfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgb251X3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfb2xkX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9vbGRfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9vbGRfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBhbGFybV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjdXJyZW50X2VuY3J5cHRpb25fa2V5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGN1cnJlbnRfZW5jcnlwdGlvbl9rZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGN1cnJlbnRfZW5jcnlwdGlvbl9rZXkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgc2VyaWFsX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgc2VyaWFsX251bWJlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfYnVyc3RfcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX2J1cnN0X3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9idXJzdF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRhdGFfYnVyc3RfcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgZGF0YV9idXJzdF9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVhY3RpdmF0aW9uX3JlYXNvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfZ2VtX3BvcnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9hbGxvY3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2FsbG9jcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2FsbG9jcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19saW5lX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgdXNfbGluZV9yYXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCB1c19saW5lX3JhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNhbGlicmF0aW9uX3JlY29yZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGNhbGlicmF0aW9uX3JlY29yZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVuaW5nX2dyYW51bGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19ncmFudWxhcml0eSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgdHVuaW5nX2dyYW51bGFyaXR5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGVwX3R1bmluZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHN0ZXBfdHVuaW5nX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHN0ZXBfdHVuaW5nX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgb251X3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9vbGRfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2FsbG9jcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHVzX2xpbmVfcmF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgdHVuaW5nX2dyYW51bGFyaXR5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHN0ZXBfdHVuaW5nX3RpbWUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIHNldCBtZW1vcnkgdG8gdXNlIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGxpc3RfbWVtID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAobGlzdF9tZW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibGlzdF9tZW0gPSBiY21vc19jYWxsb2MoQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKyAgICBCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYWxhcm1fc3RhdGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5sb3NpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9zaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUubG9zaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmxvYmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2JpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5sb2JpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUubG9wY2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3BjaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUubG9wY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5sb3BjaV9taWNfZXJyb3IiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3BjaV9taWNfZXJyb3IgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmxvcGNpX21pY19lcnJvciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmxvb2NpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9vY2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmxvb2NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUudGl3aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpd2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLnRpd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5kb3dpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZG93aSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuZG93aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLnN1ZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdWZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5zdWZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUuc2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2ZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5zZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5zZGkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZGkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLnNkaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmRmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuZGZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUuZGdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGdpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5kZ2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5wcXNpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHFzaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUucHFzaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9pay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9pay5ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5wbG9hbV9pay5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9payBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9pay5ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLm9tY2lfaWsuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2sxLmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwub21jaV9rMS5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazIuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5vbWNpX2syLmJ5dGVzLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5rZWsuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5rZWsuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmtlay5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlay5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY3VycmVudF9lbmNyeXB0aW9uX2tleS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuZW5jcnlwdGlvbl9rZXkuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuZW5jcnlwdGlvbl9rZXkuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgY3VycmVudF9lbmNyeXB0aW9uX2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZW5jcnlwdGlvbl9rZXkuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY3VycmVudF9lbmNyeXB0aW9uX2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuZW5jcnlwdGlvbl9rZXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjdXJyZW50X2VuY3J5cHRpb25fa2V5LmtleV9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmtleV9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkua2V5X2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX2lkIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX2lkLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX3NwZWNpZmljLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc2VyaWFsX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zZXJpYWxfbnVtYmVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc2VyaWFsX251bWJlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyZWdpc3RyYXRpb25faWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3U4XzM2IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25faWQuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMzYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciByZWdpc3RyYXRpb25faWQuYXJyIG11c3QgaGF2ZSAzNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgMzYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9pZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdThfMzYgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lEX0FVVE9fTEVBUk5JTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX2J1cnN0X3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYXRhX2J1cnN0X3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRhdGFfYnVyc3RfcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRhdGFfYnVyc3RfcHJvZmlsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9EQVRBX0JVUlNUX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJleHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJleHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19saW5lX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB1c19saW5lX3JhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB1c19saW5lX3JhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNhbGlicmF0aW9uX3JlY29yZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNhbGlicmF0aW9uX3JlY29yZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgY2FsaWJyYXRpb25fcmVjb3JkLmFyciBtdXN0IGhhdmUgOCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXSA9IChiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjYWxpYnJhdGlvbl9yZWNvcmQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0dW5pbmdfZ3JhbnVsYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19ncmFudWxhcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19ncmFudWxhcml0eSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGVwX3R1bmluZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBzdGVwX3R1bmluZ190aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc3RlcF90dW5pbmdfdGltZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TVEVQX1RVTklOR19USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9vbGRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X29udV9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgb251X29sZF9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9vbGRfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9vbGRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIG9udV9vbGRfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBvbnVfb2xkX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3NpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9zaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb2JpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9iaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvYmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9wY2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3BjaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvcGNpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvcGNpX21pY19lcnJvciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvcGNpX21pY19lcnJvciA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvcGNpX21pY19lcnJvciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb29jaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvb2NpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9vY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUudGl3aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpd2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS50aXdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmRvd2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kb3dpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZG93aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5zdWZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3VmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnN1ZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2ZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc2ZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnNkaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNkaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnNkaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5kZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kZmkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5kZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGdpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnBxc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcXNpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUucHFzaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9pay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnBsb2FtX2lrLmJ5dGVzLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9pay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9pay5ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5vbWNpX2lrLmJ5dGVzLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwub21jaV9rMS5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2sxLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazIuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLm9tY2lfazIuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5rZWsuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5rZWsuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jdXJyZW50X2VuY3J5cHRpb25fa2V5LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuZW5jcnlwdGlvbl9rZXkuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5LmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5LmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5lbmNyeXB0aW9uX2tleS5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY3VycmVudF9lbmNyeXB0aW9uX2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmN1cnJlbnRfZW5jcnlwdGlvbl9rZXkua2V5X2luZGV4Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwua2V5X2luZGV4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmN1cnJlbnRfZW5jcnlwdGlvbl9rZXkua2V5X2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGN1cnJlbnRfZW5jcnlwdGlvbl9rZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnNlcmlhbF9udW1iZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNlcmlhbF9udW1iZXIudmVuZG9yX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZlbmRvcl9pZCwgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmlhbF9udW1iZXIudmVuZG9yX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZlbmRvcl9zcGVjaWZpYywgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgc2VyaWFsX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2lkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF8zNiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9pZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAzNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5yZWdpc3RyYXRpb25faWQuYXJyIG11c3QgaGF2ZSAzNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgMzYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25faWQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzM2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lEX0FVVE9fTEVBUk5JTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfYnVyc3RfcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXggdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXgpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfQlVSU1RfUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfYnVyc3RfcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGF0YV9idXJzdF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9idXJzdF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByYW5naW5nX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByYW5naW5nX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0dXMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVhY3RpdmF0aW9uX3JlYXNvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRlYWN0aXZhdGlvbl9yZWFzb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWFjdGl2YXRpb25fcmVhc29uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLmdlbV9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLmdlbV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0uZ2VtX2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLnN0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9nZW1fcG9ydHMuc3RhdGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLnN0YXRlID0gKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2dlbV9wb3J0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGxfZ2VtX3BvcnRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX2dlbV9wb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgYWxsX2dlbV9wb3J0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX2FsbG9jcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfYWxsb2NzLmFsbG9jX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9hbGxvY3MuYWxsb2NfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwubGVuOyBpMSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTFdLmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9hbGxvY3Muc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX2FsbG9jcy5zdGF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5sZW47IGkxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMV0uc3RhdGUgPSAoYmNtb2x0X2FsbG9jX3N0YXRlKSBjbGlfcGFybS0+dmFsdWVzW2kxXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGxfYWxsb2NzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2FsbG9jcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9hbGxvY3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGFsbF9hbGxvY3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBhbGxfYWxsb2NzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmV4dGVuZGVkX2d1YXJkX3RpbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51c19saW5lX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB1c19saW5lX3JhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB1c19saW5lX3JhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfbGluZV9yYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCB1c19saW5lX3JhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCB1c19saW5lX3JhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY2FsaWJyYXRpb25fcmVjb3JkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNhbGlicmF0aW9uX3JlY29yZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTI7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmNhbGlicmF0aW9uX3JlY29yZC5hcnIgbXVzdCBoYXZlIDggZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IDg7IGkyKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMl0gPSAoYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMl0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNhbGlicmF0aW9uX3JlY29yZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGNhbGlicmF0aW9uX3JlY29yZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DQUxJQlJBVElPTl9SRUNPUkQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGNhbGlicmF0aW9uX3JlY29yZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNhbGlicmF0aW9uX3JlY29yZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgY2FsaWJyYXRpb25fcmVjb3JkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgY2FsaWJyYXRpb25fcmVjb3JkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHVuaW5nX2dyYW51bGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB0dW5pbmdfZ3JhbnVsYXJpdHksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB0dW5pbmdfZ3JhbnVsYXJpdHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVFVOSU5HX0dSQU5VTEFSSVRZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVuaW5nX2dyYW51bGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCB0dW5pbmdfZ3JhbnVsYXJpdHkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCB0dW5pbmdfZ3JhbnVsYXJpdHkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zdGVwX3R1bmluZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBzdGVwX3R1bmluZ190aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc3RlcF90dW5pbmdfdGltZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TVEVQX1RVTklOR19USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RlcF90dW5pbmdfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgc3RlcF90dW5pbmdfdGltZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHN0ZXBfdHVuaW5nX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cy5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXRlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cy5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMuc21hX2ZsYWciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zbWFfZmxhZyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cy5zbWFfZmxhZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgb251X3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBvbnVfb2xkX3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBhbGFybV9zdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgc2VyaWFsX251bWJlcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCByZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJhbmdpbmdfdGltZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBhbGxfZ2VtX3BvcnRzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBhbGxfYWxsb2NzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCB1c19saW5lX3JhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGNhbGlicmF0aW9uX3JlY29yZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgdHVuaW5nX2dyYW51bGFyaXR5KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBzdGVwX3R1bmluZ190aW1lKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9zdGF0IHN0YXQ7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgeGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvc2l0aXZlX2RyaWZ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcG9zaXRpdmVfZHJpZnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcG9zaXRpdmVfZHJpZnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5lZ2F0aXZlX2RyaWZ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgbmVnYXRpdmVfZHJpZnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgbmVnYXRpdmVfZHJpZnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlbGltaXRlcl9taXNzX2RldGVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGRlbGltaXRlcl9taXNzX2RldGVjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJpcDMyX2Vycm9ycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGJpcDMyX2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBiaXAzMl9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3dvcmRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfd29yZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfd29yZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb3JyZWN0ZWRfc3ltYm9scyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfc3ltYm9scyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX3N5bWJvbHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb3JyZWN0ZWRfY29kZXdvcmRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3Jkcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29kZXdvcmRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb2Rld29yZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb3JyZWN0ZWRfYml0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfYml0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2JpdHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInhnZW1fa2V5X2Vycm9ycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHhnZW1fa2V5X2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCB4Z2VtX2tleV9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInhnZW1fbG9zcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHhnZW1fbG9zcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCB4Z2VtX2xvc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2Ftc19taWNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9wbG9hbXNfbWljX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19taWNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2Ftc19ub25faWRsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29tY2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9vbWNpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X29tY2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgdHhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgdHhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCB0eF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHR4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgbmVnYXRpdmVfZHJpZnQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24pICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCBiaXAzMl9lcnJvcnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCByeF93b3JkcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfc3ltYm9scykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfY29kZXdvcmRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX2NvZGV3b3JkcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfYml0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHhnZW1fa2V5X2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHhnZW1fbG9zcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19taWNfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCByeF9vbWNpKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgcnhfcGFja2V0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHR4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgdHhfcGFja2V0cykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9zZXRfb251X3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV9vcGVyYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X29udV9vcGVyYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRVRfT05VX1NUQVRFLCBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfcnNzaV9tZWFzdXJlbWVudF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50IG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCByc3NpX21lYXN1cmVtZW50LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfcHJveHlfcGxvYW1fcGFja2V0X3NlbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXQgcHJveHk7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXQgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfcHJveHlfc2VuZCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIHhncG9uX29udSwgcGxvYW1fcGFja2V0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgeGdwb25fb251LCBwbG9hbV9wYWNrZXQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF9rZXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwgZGVmYXVsdF9rZXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgcGxvYW1fcGFja2V0LCBkZWZhdWx0X2tleSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfUExPQU1fUEFDS0VULCBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9ERUZBVUxUX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwbG9hbS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdThfNDAgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb2FtLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcGxvYW0uYXJyIG11c3QgaGF2ZSA0MCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgNDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwgcGxvYW0sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzQwIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVCwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBwbG9hbV9wYWNrZXQsIHBsb2FtLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgcHJveHkuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9wcm94eV9jcHVfcGFja2V0c19zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0cyBwcm94eTsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHMgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfcHJveHlfc2VuZCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhY2tldF90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcGFja2V0X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3BhY2tldF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYWxjX2NyYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1iZXJfb2ZfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBudW1iZXJfb2ZfcGFja2V0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF9zaXplLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfc2l6ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidWZmZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSB7IH07CisgICAgICAgIHZhbC5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmxlbik7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmFsLCB2YWwubGVuKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgYnVmZmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBidWZmZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb24gb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbiBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb24sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbiwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbWFfZmxhZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHJlcXVlc3RfcmVnaXN0cmF0aW9uLCBzbWFfZmxhZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb24sIHNtYV9mbGFnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfUkVRVUVTVF9SRUdJU1RSQVRJT04sIEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfU01BX0ZMQUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmcgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgY2hhbmdlX3Bvd2VyX2xldmVsbGluZywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIGNoYW5nZV9wb3dlcl9sZXZlbGxpbmcsIGNvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIGNoYW5nZV9wb3dlcl9sZXZlbGxpbmcsIGNvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HLCBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF0dGVudWF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIGNoYW5nZV9wb3dlcl9sZXZlbGxpbmcsIGF0dGVudWF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nLCBhdHRlbnVhdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTExJTkcsIEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9BVFRFTlVBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX2dldF9wb3dlcl9sZXZlbF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWwgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWwgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIGdldF9wb3dlcl9sZXZlbCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIGdldF9wb3dlcl9sZXZlbCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9nZXRfcG93ZXJfY29uc3VtcHRpb25fc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbiBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX2FkanVzdF90eF93YXZlbGVuZ3RoX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGggb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIGFkanVzdF90eF93YXZlbGVuZ3RoLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RILCBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIGFkanVzdF90eF93YXZlbGVuZ3RoLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEgsIEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibWFzdGVyX2tleS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hZXNfa2V5IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXN0ZXJfa2V5LmJ5dGVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBtYXN0ZXJfa2V5LmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmJ5dGVzLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFzdGVyX2tleS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLCBtYXN0ZXJfa2V5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Flc19rZXkgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT04sIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NQVNURVJfS0VZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24sIG1hc3Rlcl9rZXksIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidWZmZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSB7IH07CisgICAgICAgIHZhbC5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmxlbik7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmFsLCB2YWwubGVuKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwgYnVmZmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OLCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfQlVGRkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24sIGJ1ZmZlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwgbWljLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLCBtaWMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OLCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfb251X3R1bmluZ19pbl9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX2luLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19pbiwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9vbnVfdHVuaW5nX291dF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dCBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidGFyZ2V0X2RzX3Bvbl9pZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25faWQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRhcmdldF9kc19wb25faWQuYWRtaW5pc3RyYXRpdmVfbGFiZWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRhcmdldF9kc19wb25faWQuYWRtaW5pc3RyYXRpdmVfbGFiZWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0YXJnZXRfZHNfcG9uX2lkLmR3bGNoX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHdsY2hfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0YXJnZXRfZHNfcG9uX2lkLmR3bGNoX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0YXJnZXRfZHNfcG9uX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9pZCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQsIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX0RTX1BPTl9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgdGFyZ2V0X2RzX3Bvbl9pZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJ0YXJnZXRfdXNfcG9uX2lkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9pZCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGFyZ2V0X3VzX3Bvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkbWluaXN0cmF0aXZlX2xhYmVsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidGFyZ2V0X3VzX3Bvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRhcmdldF91c19wb25faWQuZHdsY2hfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kd2xjaF9pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRhcmdldF91c19wb25faWQuZHdsY2hfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRhcmdldF91c19wb25faWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2lkIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX09VVCwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfVVNfUE9OX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0YXJnZXRfdXNfcG9uX2lkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGltZV90b19zd2l0Y2giKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0aW1lX3RvX3N3aXRjaCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRpbWVfdG9fc3dpdGNoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQsIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0gsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2xsYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCByb2xsYmFjaywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHJvbGxiYWNrLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQsIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfUk9MTEJBQ0ssICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0dXMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgc3RhdHVzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQsIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnIHN0YXRfY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCBzdGF0X2lkOyAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgbmVnYXRpdmVfZHJpZnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgbmVnYXRpdmVfZHJpZnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT046CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGRlbGltaXRlcl9taXNzX2RldGVjdGlvbiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0JJUDMyX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBiaXAzMl9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgYmlwMzJfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfV09SRFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfd29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfd29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX1NZTUJPTFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9zeW1ib2xzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfc3ltYm9scywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvZGV3b3Jkcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQklUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2JpdHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9iaXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9LRVlfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHhnZW1fa2V5X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB4Z2VtX2tleV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0xPU1M6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgeGdlbV9sb3NzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHhnZW1fbG9zcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19NSUNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGxvYW1zX21pY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wbG9hbXNfbWljX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X29tY2ksIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHR4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHR4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fb251X3N0YXRfaWQgc3RhdF9pZDsgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfeGdwb25fb251X3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGRlbGltaXRlcl9taXNzX2RldGVjdGlvbiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24sIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgYmlwMzJfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGJpcDMyX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1dPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3dvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3dvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9TWU1CT0xTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfc3ltYm9scywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX3N5bWJvbHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2NvZGV3b3Jkcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9iaXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfYml0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB4Z2VtX2tleV9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgeGdlbV9rZXlfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9MT1NTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHhnZW1fbG9zcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB4Z2VtX2xvc3MsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19taWNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGxvYW1zX21pY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X29tY2ksIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB0eF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB0eF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgdHhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB0eF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgeGdwb25fb251LCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZyBhdXRvX2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRnaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZGdpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZGdpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkb3dpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkb3dpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZG93aSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW52YWxpZF9kYnJ1X3JlcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgaW52YWxpZF9kYnJ1X3JlcG9ydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb29jaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgbG9vY2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBsb29jaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FsYXJtKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FsYXJtKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2Rpc2FibGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9lbmFibGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9lbmFibGVfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X3R1bmluZ19pbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3R1bmluZ19vdXRfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wdGljYWxfcmVmbGVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3NzaWJsZV9kcmlmdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG9zc2libGVfZHJpZnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3NzaWJsZV9kcmlmdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2xldmVsX3JlcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxfcmVwb3J0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxfcmVwb3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHFzaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcHFzaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBxc2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByYW5naW5nX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNkaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2RpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2RpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2ZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3VmaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3VmaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN1ZmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHRpd2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0aXdpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0dW5pbmdfcmVzcG9uc2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19yZXNwb25zZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19yZXNwb25zZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZmkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRnaSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZG93aSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgaW52YWxpZF9kYnJ1X3JlcG9ydCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBsb29jaSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfYWxhcm0pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9lbmFibGVfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X3R1bmluZ19vdXRfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvcHRpY2FsX3JlZmxlY3Rpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvc3NpYmxlX2RyaWZ0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsX3JlcG9ydCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBxc2kpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZGkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2ZpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdWZpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0aXdpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0dW5pbmdfcmVzcG9uc2UpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZyBhdXRvX2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZmksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZGZpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ERkksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZ2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRnaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZ2ksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRvd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRvd2ksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZG93aSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImludmFsaWRfZGJydV9yZXBvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgaW52YWxpZF9kYnJ1X3JlcG9ydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9vY2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGxvb2NpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGxvb2NpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9MT09DSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfYWxhcm0sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FsYXJtLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUxBUk0sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2Rpc2FibGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2Rpc2FibGVfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2VuYWJsZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2VuYWJsZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3R1bmluZ19pbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfaW5fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfaW5fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X3R1bmluZ19vdXRfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3B0aWNhbF9yZWZsZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvcHRpY2FsX3JlZmxlY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3NzaWJsZV9kcmlmdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG9zc2libGVfZHJpZnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG9zc2libGVfZHJpZnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9sZXZlbF9yZXBvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsX3JlcG9ydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9sZXZlbF9yZXBvcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0xFVkVMX1JFUE9SVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcXNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwcXNpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBxc2ksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0ksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SRUdJU1RSQVRJT05fSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2RpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZGksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2RpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TREksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNmaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2ZpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNmaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3VmaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3VmaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdWZpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGl3aSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgdGl3aSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0aXdpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9USVdJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVuaW5nX3Jlc3BvbnNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0dW5pbmdfcmVzcG9uc2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgdHVuaW5nX3Jlc3BvbnNlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9UVU5JTkdfUkVTUE9OU0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX3RyeF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl90cnhfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl90cnhfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl90cngsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX3RyeCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1ZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBkZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgZGVidWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9yYW5naW5nX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX3JhbmdpbmdfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX3JhbmdpbmdfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJkZXNfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlc2V0X29uX2RlbF9taXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIHJlc2V0X29uX2RlbF9taXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByZXNldF9vbl9kZWxfbWlzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZWRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgZWRfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGVkX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnZlcnRfZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBpbnZlcnRfZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yZXNldCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJ4X3JzdF9wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCBkZWJ1ZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgcnNzaV9yYW5naW5nX2NvbmZpZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgZWRfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fdHJ4X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX3RyeF9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX3RyeF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fdHJ4X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fdHJ4X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX1RSWF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX3RyeCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fdHJ4LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJidXJzdF9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgYnVyc3RfcHJvZmlsZS5hcnIgbXVzdCBoYXZlIDQgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIucHJvZmlsZV92ZXJzaW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5wcm9maWxlX3ZlcnNpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucHJvZmlsZV92ZXJzaW9uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIuaXNfZmVjX29uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5pc19mZWNfb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uaXNfZmVjX29uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0ubnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfcGF0dGVybl9sb3ciKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kZWxpbWl0ZXJfcGF0dGVybl9sb3cgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9yZXBlYXRzX2NvdW50Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9yZXBlYXRzX2NvdW50IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnByZWFtYmxlX3JlcGVhdHNfY291bnQgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2giKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX3BhdHRlcm5faGlnaCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2ggPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9wYXR0ZXJuX2xvdyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcGF0dGVybl9sb3cgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucHJlYW1ibGVfcGF0dGVybl9sb3cgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5wb25fdGFnIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5wb25fdGFnIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnBvbl90YWcgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1cnN0X3Byb2ZpbGUuYXJyLm51bV9vZl9ndWFyZF9ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIubnVtX29mX2d1YXJkX2J5dGVzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLm51bV9vZl9ndWFyZF9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1cnN0X3Byb2ZpbGUuYXJyLmlzX3Byb2ZpbGVfdmFsaWQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLmlzX3Byb2ZpbGVfdmFsaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uaXNfcHJvZmlsZV92YWxpZCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIuYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIuYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5idXJzdF9vdmVyaGVhZF9zaXplX2luX3dvcmRzID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgdHJhbnNjZWl2ZXJfY29uZmlnLmFyciBtdXN0IGhhdmUgNCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9sYXN0IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0udHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X2xvY2F0aW9uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wb2xhcml0eSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfcG9sYXJpdHkgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS5udW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9sb2NhdGlvbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcG9sYXJpdHkgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9wb2xhcml0eSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fdHJ4X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX3RyeF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRlYnVnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcucnhfcmV2ZXJzZWRfcG9sYXJpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yeF9yZXZlcnNlZF9wb2xhcml0eSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnLnJ4X3JldmVyc2VkX3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcubmVnX291dF9iaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5uZWdfb3V0X2JpdCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnLm5lZ19vdXRfYml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBkZWJ1ZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl90cnhfZGVidWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9ERUJVRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZGVidWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLnBvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9sYXJpdHkgPSAoYmNtb2x0X3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLnBvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX25vcm1hbF9jb25maWcubG9jYXRpb25fc2lnbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uX3NpZ24gPSAoYmNtb2x0X3NpZ24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX25vcm1hbF9jb25maWcubG9jYXRpb25fc2lnbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5wdWxzZV93aWR0aCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnB1bHNlX3dpZHRoID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLnB1bHNlX3dpZHRoIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taW5pbXVtX2J1cnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyc3NpX3JhbmdpbmdfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfcmFuZ2luZ19jb25maWcuc3RhcnRfb25fZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9vbl9lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9yYW5naW5nX2NvbmZpZy5zdGFydF9vbl9lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mcmFtZV9kZWxheSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX3JhbmdpbmdfY29uZmlnLndvcmRfZGVsYXkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53b3JkX2RlbGF5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9yYW5naW5nX2NvbmZpZy5mcmFtZV9kZWxheV9hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZyYW1lX2RlbGF5X2FmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9yYW5naW5nX2NvbmZpZy5mcmFtZV9kZWxheV9hZnRlcl9lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfcmFuZ2luZ19jb25maWcud29yZF9kZWxheV9hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndvcmRfZGVsYXlfYWZ0ZXJfZWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX3JhbmdpbmdfY29uZmlnLndvcmRfZGVsYXlfYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfcmFuZ2luZ19jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfUkFOR0lOR19DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfcmFuZ2luZ19jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLm11bHRpX2VkX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tdWx0aV9lZF9tb2RlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmFuZ2luZ19tb2RlID0gKGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF80IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLmFyciBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFX0RFTElNSVRFUl9NQVhfRVJST1JTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfbG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X2xvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcG9sYXJpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfQVRfSU5JVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfbG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X2xvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcG9sYXJpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfRURfRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVzZXRfb25fZGVsX21pc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByZXNldF9vbl9kZWxfbWlzcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SRVNFVF9PTl9ERUxfTUlTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlZF9zdGF0ZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZWRfc3RhdGUucmVzZXRfb25fZWRfZmFpbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlc2V0X29uX2VkX2ZhaWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVkX3N0YXRlLnJlc2V0X29uX2VkX2ZhaWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlZF9zdGF0ZS5yZXNldF9vbl9lZF9zdWNjZXNzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVzZXRfb25fZWRfc3VjY2VzcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZWRfc3RhdGUucmVzZXRfb25fZWRfc3VjY2VzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZWRfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZWRfc3RhdGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZWRfc3RhdGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnZlcnRfZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0lOVkVSVF9FRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yZXNldCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JFU0VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJ4X3JzdF9wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJ4X3JzdF9wb2xhcml0eSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUlhfUlNUX1BPTEFSSVRZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX3RyeF9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX3RyeF9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX3RyeF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fdHJ4X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fdHJ4X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fdHJ4LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl90cngsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl90cnhfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl90cnhfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl90cnhfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX1RSWF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fdHJ4LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl90cngsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGZpbHRlci5idXJzdF9wcm9maWxlLmFyciBtdXN0IGhhdmUgNCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJvZmlsZV92ZXJzaW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJvZmlsZV92ZXJzaW9uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnByb2ZpbGVfdmVyc2lvbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5pc19mZWNfb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5pc19mZWNfb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uaXNfZmVjX29uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0ubnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3BhdHRlcm5faGlnaCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kZWxpbWl0ZXJfcGF0dGVybl9sb3cgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9yZXBlYXRzX2NvdW50Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcmVwZWF0c19jb3VudCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9yZXBlYXRzX2NvdW50ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX3BhdHRlcm5faGlnaCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX3BhdHRlcm5faGlnaCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2ggPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcGF0dGVybl9sb3ciKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9wYXR0ZXJuX2xvdyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9wYXR0ZXJuX2xvdyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5wb25fdGFnIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucG9uX3RhZyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wb25fdGFnID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIubnVtX29mX2d1YXJkX2J5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIubnVtX29mX2d1YXJkX2J5dGVzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLm51bV9vZl9ndWFyZF9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5pc19wcm9maWxlX3ZhbGlkIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuaXNfcHJvZmlsZV92YWxpZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5pc19wcm9maWxlX3ZhbGlkID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0ubnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1cnN0X3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyciBtdXN0IGhhdmUgNCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0udHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9sYXN0Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9sYXN0IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9sb2NhdGlvbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcG9sYXJpdHkiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wb2xhcml0eSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfcG9sYXJpdHkgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS5udW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbG9jYXRpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcG9sYXJpdHkiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcG9sYXJpdHkgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9wb2xhcml0eSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfY29uZmlnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fdHJ4X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX3RyeF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fdHJ4X2RlYnVnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcucnhfcmV2ZXJzZWRfcG9sYXJpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yeF9yZXZlcnNlZF9wb2xhcml0eSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy5yeF9yZXZlcnNlZF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Zy5uZWdfb3V0X2JpdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5lZ19vdXRfYml0ID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnLm5lZ19vdXRfYml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBkZWJ1ZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl90cnhfZGVidWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9ERUJVRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZGVidWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1ZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgZGVidWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBkZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLnBvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9sYXJpdHkgPSAoYmNtb2x0X3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbl9zaWduID0gKGJjbW9sdF9zaWduKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbl9zaWduIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5wdWxzZV93aWR0aCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnB1bHNlX3dpZHRoID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5wdWxzZV93aWR0aCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubWluaW11bV9idXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pbmltdW1fYnVyc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuc3RhcnRfb25fZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9vbl9lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuc3RhcnRfb25fZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9yYW5naW5nX2NvbmZpZy5mcmFtZV9kZWxheSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZyYW1lX2RlbGF5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud29yZF9kZWxheSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX3JhbmdpbmdfY29uZmlnLndvcmRfZGVsYXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9yYW5naW5nX2NvbmZpZy5mcmFtZV9kZWxheV9hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZyYW1lX2RlbGF5X2FmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXlfYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5X2FmdGVyX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud29yZF9kZWxheV9hZnRlcl9lZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX3JhbmdpbmdfY29uZmlnLndvcmRfZGVsYXlfYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfcmFuZ2luZ19jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfUkFOR0lOR19DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfcmFuZ2luZ19jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX3JhbmdpbmdfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCByc3NpX3JhbmdpbmdfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcnNzaV9yYW5naW5nX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLm11bHRpX2VkX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tdWx0aV9lZF9tb2RlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24ubXVsdGlfZWRfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5yYW5naW5nX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yYW5naW5nX21vZGUgPSAoYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHNlcmRlc19jb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3U4XzQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnIgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdThfNCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X2xvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wb2xhcml0eSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X2xvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wb2xhcml0eSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlc2V0X29uX2RlbF9taXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJlc2V0X29uX2RlbF9taXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZXNldF9vbl9kZWxfbWlzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCByZXNldF9vbl9kZWxfbWlzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lZF9zdGF0ZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVkX3N0YXRlLnJlc2V0X29uX2VkX2ZhaWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXNldF9vbl9lZF9mYWlsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZWRfc3RhdGUucmVzZXRfb25fZWRfZmFpbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lZF9zdGF0ZS5yZXNldF9vbl9lZF9zdWNjZXNzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVzZXRfb25fZWRfc3VjY2VzcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVkX3N0YXRlLnJlc2V0X29uX2VkX3N1Y2Nlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVkX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2VkX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRURfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVkX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZWRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGVkX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgZWRfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5pbnZlcnRfZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0lOVkVSVF9FRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImludmVydF9lZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgaW52ZXJ0X2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgaW52ZXJ0X2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3Jlc2V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkVTRVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmVzZXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnRyeF9yc3RfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJ4X3JzdF9wb2xhcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyeF9yc3RfcG9sYXJpdHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyeF9yc3RfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHRyeF9yc3RfcG9sYXJpdHkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX2NvbmZpZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgZGVidWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcnNzaV9yYW5naW5nX2NvbmZpZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fdHJ4LCByZXNldF9vbl9kZWxfbWlzcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgZWRfc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGludmVydF9lZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgZW5kX29mX2J1cnN0X3Jlc2V0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeHBvbl9zZXJkZXNfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hwb25fc2VyZGVzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hwb25fc2VyZGVzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeHBvbl9zZXJkZXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5zdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pbnN0YW5jZSA9IChiY21vbHRfc2VyZGVzX2luc3RhbmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaW5zdGFuY2UgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAma2V5Lmluc3RhbmNlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeHBvbl9zZXJkZXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhwb25fc2VyZGVzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3ZnYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3ZnYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF92Z2EpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BmIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfcGYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfcGYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2xmcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9sZnBmKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2xmcGYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3ByZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3ByZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wcmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X21haW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9tYWluKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X21haW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2FtcCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X2FtcCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9hbXApO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3ZnYSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3BmKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfbGZwZikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU1KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcHJlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfbWFpbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X2FtcCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94cG9uX3NlcmRlc19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94cG9uX3NlcmRlc19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeHBvbl9zZXJkZXNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeHBvbl9zZXJkZXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94cG9uX3NlcmRlc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnN0YW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lmluc3RhbmNlID0gKGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImluc3RhbmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pbnN0YW5jZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UsICZrZXkuaW5zdGFuY2UpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4cG9uX3NlcmRlcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeHBvbl9zZXJkZXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfdmdhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3ZnYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfdmdhLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0EsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9wZiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfcGYsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1BGLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9sZnBmLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9sZnBmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmU0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0LCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3ByZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wcmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3ByZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfbWFpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9tYWluLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9tYWluLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfYW1wLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9hbXAsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX0FNUCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94cG9uX3NlcmRlc19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hwb25fc2VyZGVzX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94cG9uX3NlcmRlc19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94cG9uX3NlcmRlc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hwb25fc2VyZGVzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5zdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pbnN0YW5jZSA9IChiY21vbHRfc2VyZGVzX2luc3RhbmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaW5zdGFuY2UgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAma2V5Lmluc3RhbmNlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeHBvbl9zZXJkZXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhwb25fc2VyZGVzLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeHBvbl9zZXJkZXNfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94cG9uX3NlcmRlc19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeHBvbl9zZXJkZXNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeHBvbl9zZXJkZXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94cG9uX3NlcmRlc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW5zdGFuY2UgPSAoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5zdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmluc3RhbmNlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSwgJmtleS5pbnN0YW5jZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhwb25fc2VyZGVzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4cG9uX3NlcmRlcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfdmdhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3ZnYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfdmdhLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0EsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF92Z2EiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfdmdhKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF92Z2EpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9wZiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfcGYsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1BGLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfcGYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X3BmKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9sZnBmLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9sZnBmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9sZnBmKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9sZnBmKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmUxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmUxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlMik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlMik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yeF9kZmU0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0LCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmU0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmU0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlNSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlNSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlNSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3ByZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wcmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3ByZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcHJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X3ByZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcHJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfbWFpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9tYWluLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9tYWluLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfbWFpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9tYWluKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9tYWluKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfcG9zdDEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0MSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3Bvc3QyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcG9zdDIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X3Bvc3QyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfcG9zdDMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0Myk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcG9zdDMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfYW1wLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9hbXAsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX0FNUCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2FtcCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9hbXApOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X2FtcCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X3ZnYSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9wZikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9sZnBmKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlMikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmUzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlNSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wcmUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfbWFpbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0MSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0MikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0MykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9hbXApKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYXBpX3Jvb3QoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21ndF9ncm91cCBncm91cF90eXBlLCBiY21vbHRfbXNnX3R5cGUgbXNnX3R5cGUsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vbHRfb2JqX2lkIG9ial9pZDsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9iamVjdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgb2JqX2lkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9iamVjdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9ial9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfbmlfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX25pX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX25pX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX25pX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9hZV9uaV9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2FlX25pX29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9OSV9PUEVSX0lEX1NFVF9BRV9OSV9FTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfbmlfb3Blcl9zZXRfYWVfbmlfZW5fc3RhdGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfcGF0aF9kc19zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfcGF0aF9kc19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX3BhdGhfdXNfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX3BhdGhfdXNfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX3BhdGhfdXNfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQ0hBTk5FTDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfY2hhbm5lbF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfY2hhbm5lbF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9jaGFubmVsX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2NoYW5uZWxfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVCVUc6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RlYnVnX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RlYnVnX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGVidWdfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGVidWdfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZWJ1Z19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZWJ1Z19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZGVidWdfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9kZWJ1Z19vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9DTElfSU5QVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RlYnVnX29wZXJfY2xpX2lucHV0X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9TVEFSVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGVidWdfb3Blcl9zdGFydF9hcGlfY2FwdHVyZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RlYnVnX29wZXJfc3RvcF9hcGlfY2FwdHVyZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1JFU0VUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZWJ1Z19vcGVyX3Jlc2V0X2FwaV9jYXB0dXJlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVWSUNFOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2VfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RldmljZV9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RldmljZV9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2VfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2RldmljZV9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2RldmljZV9vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfY29ubmVjdF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9kaXNjb25uZWN0X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9yZXNldF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RldmljZV9vcGVyX2hvc3Rfa2VlcF9hbGl2ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9TV19VUEdSQURFX0FDVElWQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9zd191cGdyYWRlX2FjdGl2YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9pbWFnZV90cmFuc2Zlcl9zdGFydF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9pbWFnZV90cmFuc2Zlcl9kYXRhX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfUlVOX0REUl9URVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9ydW5fZGRyX3Rlc3Rfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2RlbmllZF9saW5rX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2RlbmllZF9saW5rX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9kZW5pZWRfbGlua19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX0xJTks6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0ZPUkNFX1JFRElTQ09WRVJZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfb3Blcl9mb3JjZV9yZWRpc2NvdmVyeV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9ERUxFVEVfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfZGVsZXRlX2xpbmtfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX2tleV9leGNoYW5nZV9zdGFydF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfa2V5X2V4Y2hhbmdlX3N0b3Bfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfU1RBVElDX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfc3RhdGljX3JlZ2lzdHJhdGlvbl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9saW5rX3Byb3h5X2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2Vwb25fbGlua19wcm94eV9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19QUk9YWV9JRF9JTkpFQ1RfRlJBTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19wcm94eV9pbmplY3RfZnJhbWVfc2VuZChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmlfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9lcG9uX25pX29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU0VUX0VQT05fTklfRU5fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX2lzc3VlX3Jzc2lfZ3JhbnRfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfYWRkX2xpbmtfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9NVUxUSUNBU1RfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX2FkZF9tdWx0aWNhc3RfbGlua19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1JPR1VFX0xMSURfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX3JvZ3VlX2xsaWRfc2Nhbl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9zdGFydF9vbnVfdXBncmFkZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX2RzX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9SUDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9ycF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9ycF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3JwX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcnBfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BJTzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bpb19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bpb19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncGlvX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwaW9fY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2NfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2Nfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2NfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9hbGxvY19vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2dwb25fYWxsb2Nfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9TRVRfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2Nfb3Blcl9zZXRfc3RhdGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX0dFVF9TVEFUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19vcGVyX2dldF9zdGF0c19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQ6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9ncG9uX2dlbV9wb3J0X29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X29wZXJfc2V0X3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0Y6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25faXdmX29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfZ3Bvbl9pd2Zfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9vcGVyX2ZsdXNoX21hY190YWJsZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX1NDQU5fTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9vcGVyX3NjYW5fbWFjX3RhYmxlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl91c19mbG93X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl91c19mbG93X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX3VzX2Zsb3dfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9uaV9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2dwb25fbmlfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc2V0X3Bvbl9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfb3Blcl9yZXNldF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3NldF9vbnVfc3RhdGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfb3Blcl9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9UT0RfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3RvZF9yZXF1ZXN0X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc3RhcnRfb251X3VwZ3JhZGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9uaV9wcm94eV9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9ncG9uX25pX3Byb3h5X2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9wcm94eV9jcHVfcGFja2V0c19zZW5kKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1BST1hZX0lEX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfcHJveHlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9zZW5kKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX09OVToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fb251X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fb251X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fb251X29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfZ3Bvbl9vbnVfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfb3Blcl9zZXRfb251X3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfUlNTSV9NRUFTVVJFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfb3Blcl9yc3NpX21lYXN1cmVtZW50X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9vcGVyX2NoYW5nZV9wb3dlcl9sZXZlbF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfcHJveHlfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfZ3Bvbl9vbnVfcHJveHlfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfcHJveHlfY3B1X3BhY2tldHNfc2VuZChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9wcm94eV9wbG9hbV9wYWNrZXRfc2VuZChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9UUlg6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fdHJ4X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ19lbnRyeV9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nX2VudHJ5X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ19lbnRyeV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dfZW50cnlfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nX2VudHJ5X3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nX2VudHJ5X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ19lbnRyeV9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ19lbnRyeV9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dfZW50cnlfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTE9HR0VSOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dnZXJfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ2dlcl9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dnZXJfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nZ2VyX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ2dlcl9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ2dlcl9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dnZXJfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dnZXJfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nZ2VyX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9sb2dnZXJfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9sb2dnZXJfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX0NMRUFSX0xPRzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nZ2VyX29wZXJfY2xlYXJfbG9nX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTk5JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbm5pX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbm5pX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX05OSV9TRVJERVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9zZXJkZXNfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9zZXJkZXNfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbm5pX3NlcmRlc19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfc2VyZGVzX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9zb2Z0d2FyZV9lcnJvcl9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfc29mdHdhcmVfZXJyb3JfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfc29mdHdhcmVfZXJyb3JfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfc29mdHdhcmVfZXJyb3JfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9vcGVyX3N0YXJ0X2NhcHR1cmVfd2luZG93X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUT1BfQ0FQVFVSRV9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9vcGVyX3N0b3BfY2FwdHVyZV93aW5kb3dfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fYWxsb2Nfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfeGdwb25fYWxsb2Nfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX29wZXJfZ2V0X3N0YXRzX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19vcGVyX3NldF9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25faXdmX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9pd2ZfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25faXdmX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2l3Zl9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3hncG9uX25pX29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfeGdwb25fbmlfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9zZXRfcG9uX3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfcmVzZXRfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9zZXRfb251X3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUlVOX1NQRUNJQUxfQldfTUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3J1bl9zcGVjaWFsX2J3X21hcF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1RPRF9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3RvZF9yZXF1ZXN0X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfc3RhcnRfb251X3VwZ3JhZGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX2FkanVzdF90eF93YXZlbGVuZ3RoX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF94Z3Bvbl9uaV9wcm94eV9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF94Z3Bvbl9uaV9wcm94eV9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9wcm94eV9jcHVfcGFja2V0c19zZW5kKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9wcm94eV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3NlbmQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3hncG9uX29udV9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X3hncG9uX29udV9vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfc2V0X29udV9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9yc3NpX21lYXN1cmVtZW50X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9MRVZFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfZ2V0X3Bvd2VyX2xldmVsX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9DT05TVU1QVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19JTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfb251X3R1bmluZ19pbl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX09VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfb251X3R1bmluZ19vdXRfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3hncG9uX29udV9wcm94eV9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF94Z3Bvbl9vbnVfcHJveHlfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfcHJveHlfcGxvYW1fcGFja2V0X3NlbmQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9wcm94eV9jcHVfcGFja2V0c19zZW5kKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fdHJ4X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl90cnhfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fdHJ4X2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX3RyeF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeHBvbl9zZXJkZXNfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hwb25fc2VyZGVzX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hwb25fc2VyZGVzX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hwb25fc2VyZGVzX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KK30KKworLyogUGVyZm9ybSBhbiBBUEkgY2FsbCBiYXNlZCBvbiBDTEkgaW5wdXQgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYXBpX2NhbGwoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21ndF9ncm91cCBncm91cF90eXBlLCBiY21vbHRfbXNnX3R5cGUgbXNnX3R5cGUsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBhcGljbGlfYnl0ZV9wb29sIGJ5dGVfcG9vbDsKKyAgICAodm9pZClhcGljbGlfdW51bWJlcl90b19pcHY0OworCisgICAgLyogc2V0dXAgbWVtb3J5IHBvb2wgZm9yIGR5bmFtaWNhbGx5LXNpemVkIGxpc3QgbWVtb3J5IGFsbG9jYXRpb24gKi8KKyAgICBlcnIgPSBhcGljbGlfYnl0ZV9wb29sX2NyZWF0ZSgmYnl0ZV9wb29sKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIGNhbGwgdGhlIHJvb3QgQVBJIGhhbmRsZXIgKi8KKyAgICBlcnIgPSBiY21vbHRfY2xpX2FwaV9yb290KGRldmljZV9pZCwgZ3JvdXBfdHlwZSwgbXNnX3R5cGUsIHNlc3Npb24sICZieXRlX3Bvb2wpOworCisgICAgLyogZnJlZSBhbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGFwaWNsaV9ieXRlX3Bvb2xfZGVzdHJveSgmYnl0ZV9wb29sKTsKKworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9oYW5kbGVycy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfaGFuZGxlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE1ZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfaGFuZGxlcnMuaApAQCAtMCwwICsxLDQ4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpZm5kZWYgTUFQTEVfQ0xJX0hBTkRMRVJTX0hfCisjZGVmaW5lIE1BUExFX0NMSV9IQU5ETEVSU19IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCisvKiB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgY291bGQgcG9zc2libHkgYnkgdXNlZCBieSBhbGwgdmFyaWFibGUtc2l6ZWQgbGlzdHMgd2l0aGluIGEgR0VUIHJlcXVlc3QgKi8KKyNkZWZpbmUgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSAoMzIgKiAxMDI0KQorCisvKiBQZXJmb3JtIGFuIEFQSSBjYWxsIGJhc2VkIG9uIENMSSBpbnB1dCAqLworYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hcGlfY2FsbCgKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXBfdHlwZSwKKyAgICBiY21vbHRfbXNnX3R5cGUgbXNnX3R5cGUsCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hlbHBlcnMuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hlbHBlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjc3YWVjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfaGVscGVycy5jCkBAIC0wLDAgKzEsMjQ3MzQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCisjaW5jbHVkZSAiYmNtX2FwaV9jbGlfaGVscGVycy5oIgorCisvKiBhbGxvdyBwb3NzaWJseSB1bnVzZWQgZGVzY3JpcHRvcnMgdG8gbWFrZSB0aGUgY29kZSBlYXNpZXIgdG8gZ2VuZXJhdGUgKi8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBCQ01fREVTQ1IgICBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UKKyNkZWZpbmUgQkNNX0RFU0NSCisjZW5kaWYKKworLyogVW5sZXNzIHNwZWNpZmllZCBpbiB0aGUgWE1MIG1vZGVsLCBkeW5hbWljIGFycmF5cyB3aWxsIGhhdmUgdGhpcyBtYXggc2l6ZSAoaW4gYnl0ZXMsIHdpbGwgZGl2aWRlIGJ5IGVsZW1lbnQgc2l6ZSkgKi8KKyNkZWZpbmUgREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFICAgIDIwNDgKKworLyogPT09PSBCYXNlIFR5cGUgRGVzY3JpcHRvcnMgPT09PSAqLworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3QgPSB7IC5uYW1lID0gInVpbnQ4X3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNLCAuc2l6ZSA9IHNpemVvZih1aW50OF90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDE2X3QgPSB7IC5uYW1lID0gInVpbnQxNl90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTSwgLnNpemUgPSBzaXplb2YodWludDE2X3QpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MzJfdCA9IHsgLm5hbWUgPSAidWludDMyX3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNLCAuc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ2NF90ID0geyAubmFtZSA9ICJ1aW50NjRfdCIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU0sIC5zaXplID0gc2l6ZW9mKHVpbnQ2NF90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDhfdF9oZXggPSB7IC5uYW1lID0gInVpbnQ4X3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNX0hFWCwgLnNpemUgPSBzaXplb2YodWludDhfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCA9IHsgLm5hbWUgPSAidWludDE2X3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNX0hFWCwgLnNpemUgPSBzaXplb2YodWludDE2X3QpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MzJfdF9oZXggPSB7IC5uYW1lID0gInVpbnQzMl90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgsIC5zaXplID0gc2l6ZW9mKHVpbnQzMl90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDY0X3RfaGV4ID0geyAubmFtZSA9ICJ1aW50NjRfdCIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU1fSEVYLCAuc2l6ZSA9IHNpemVvZih1aW50NjRfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2ludDhfdCA9IHsgLm5hbWUgPSAiaW50OF90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU05VTSwgLnNpemUgPSBzaXplb2YoaW50OF90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfaW50MTZfdCA9IHsgLm5hbWUgPSAiaW50MTZfdCIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NOVU0sIC5zaXplID0gc2l6ZW9mKGludDE2X3QpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9pbnQzMl90ID0geyAubmFtZSA9ICJpbnQzMl90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU05VTSwgLnNpemUgPSBzaXplb2YoaW50MzJfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2ludDY0X3QgPSB7IC5uYW1lID0gImludDY0X3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TTlVNLCAuc2l6ZSA9IHNpemVvZihpbnQ2NF90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfZmxvYXQgPSB7IC5uYW1lID0gImZsb2F0IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRkxPQVQsIC5zaXplID0gc2l6ZW9mKGZsb2F0KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfZG91YmxlID0geyAubmFtZSA9ICJkb3VibGUiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9GTE9BVCwgLnNpemUgPSBzaXplb2YoZG91YmxlKSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgPSB7IC5uYW1lID0gImJjbW9zX21hY19hZGRyZXNzIiwgLmRlc2NyID0gIk1BQyBhZGRyZXNzIiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfTUFDLCAuc2l6ZSA9IHNpemVvZihiY21vc19tYWNfYWRkcmVzcykgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9zX2lwdjRfYWRkcmVzcyA9IHsgLm5hbWUgPSAiYmNtb3NfaXB2NF9hZGRyZXNzIiwgLmRlc2NyID0gIklQdjQgYWRkcmVzcyIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0lQVjQsIC5zaXplID0gc2l6ZW9mKGJjbW9zX2lwdjRfYWRkcmVzcykgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgPSB7IC5uYW1lID0gImJjbW9zX2Jvb2wiLCAuZGVzY3IgPSAiQm9vbGVhbiIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0JPT0wsIC5zaXplID0gc2l6ZW9mKGJjbW9zX2Jvb2wpIH07CisKKy8qID09PT0gT2JqZWN0IFR5cGUgSW5mb3JtYXRpb24gPT09PSAqLworc3RhdGljIGNoYXIgKm9iamVjdF9uYW1lW10gPSB7ICJhZV9uaSIsICJhZV9wYXRoX2RzIiwgImFlX3BhdGhfdXMiLCAiY2hhbm5lbCIsICJkZWJ1ZyIsICJkZXZpY2UiLCAiZXBvbl9kZW5pZWRfbGluayIsICJlcG9uX2xpbmsiLCAiZXBvbl9uaSIsICJlcG9uX29udV8xMGdfdXMiLCAiZXBvbl9vbnVfMWdfdXMiLCAiZXBvbl9wYXRoXzEwZ19kcyIsICJlcG9uX3BhdGhfMTBnX3VzIiwgImVwb25fcGF0aF8xZ19kcyIsICJlcG9uX3BhdGhfMWdfdXMiLCAiZXBvbl9ycCIsICJncGlvIiwgImdwb25fYWxsb2MiLCAiZ3Bvbl9nZW1fcG9ydCIsICJncG9uX2l3ZiIsICJncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdyIsICJncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3ciLCAiZ3Bvbl9pd2ZfbWFjX3RhYmxlIiwgImdwb25faXdmX3VzX2Zsb3ciLCAiZ3Bvbl9uaSIsICJncG9uX29udSIsICJncG9uX3RyeCIsICJsb2dfZW50cnkiLCAibG9nZ2VyIiwgIm5uaSIsICJubmlfc2VyZGVzIiwgInNvZnR3YXJlX2Vycm9yIiwgInRyeF9jYWxpYnJhdGlvbiIsICJ4Z3Bvbl9hbGxvYyIsICJ4Z3Bvbl9nZW1fcG9ydCIsICJ4Z3Bvbl9pd2YiLCAieGdwb25fbmkiLCAieGdwb25fb251IiwgInhncG9uX3RyeCIsICJ4cG9uX3NlcmRlcyIgfTsKK3N0YXRpYyBjaGFyICpvYmplY3RfZGVzY3JbXSA9IHsgIkFFIE5ldHdvcmsgSW50ZXJmYWNlLiIsICJBRSBkb3duc3RyZWFtIGRhdGEgcGF0aC4iLCAiQUUgdXBzdHJlYW0gZGF0YSBwYXRoLiIsICJDaGFubmVsIiwgIkRlYnVnIEZlYXR1cmVzIiwgIlNpbmdsZXRvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZXZpY2UgYXMgYSB3aG9sZS4iLCAiVW5pY2FzdCBFUE9OIGxpbmsgdGhhdCBoYXMgYmVlbiBkZW5pZWQgcmVnaXN0cmF0aW9uIGZvciBzb21lIHJlYXNvbi4gVG8gYmUgYW4gb2JqZWN0IG9mIHRoaXMgdHlwZSB5b3UgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhY3RpdmUgYWxhcm0gcG9zdGVkIGFnYWluc3QgeW91LiIsICJVbmljYXN0IEVQT04gbGluayIsICJFUE9OIE5ldHdvcmsgSW50ZXJmYWNlLiIsICJFUE9OIE9OVSAxMEcgVVMiLCAiRVBPTiBPTlUgaW50ZXJmYWNlIG9mIG9uZSBvciBtb3JlIEVQT04gbGlua3MuIiwgIkVQT04gMTBHIGRvd25zdHJlYW0gZGF0YSBwYXRoLiIsICJFUE9OIDEwRyB1cHN0cmVhbSBkYXRhIHBhdGguIiwgIkVQT04gMUcgZG93bnN0cmVhbSBkYXRhIHBhdGguIiwgIkVQT04gMUcgdXBzdHJlYW0gZGF0YSBwYXRoLiIsICIxMC8xMCwgMTAvMSBvciAxLzEgRFMvVVMgcGFpciBvZiBFUE9OIFBhdGhzIiwgIkdQSU8gY29udHJvbCIsICJHUE9OIEFsbG9jIiwgIkdQT04gR0VNIFBvcnQiLCAiR1BPTiBJV0YiLCAiR1BPTiBJV0YgRFMgZWdyZXNzIGZsb3ciLCAiR1BPTiBJV0YgRFMgaW5ncmVzcyBmbG93IiwgIkdQT04gSVdGIE1BQyB0YWJsZSIsICJHUE9OIElXRiBVUyBmbG93IiwgIkdQT04gbmV0d29yayBpbnRlcmZhY2UiLCAiR1BPTiBPTlUiLCAiR1BPTiBUUlgiLCAibG9nIGVudHJ5IiwgImxvZ2dlciIsICJVc2UgZm9yIGxvb3BiYWNrcyIsICJOTkkgU0VSREVTIHBhcmFtZXRlcnMuIiwgIlNvZnR3YXJlIEVycm9yIiwgIlRSWCBDYWxpYnJhdGlvbiIsICJYR1BPTiBBbGxvYyIsICJYR1BPTiBHRU0gcG9ydCIsICJYR1BPTiBJV0YiLCAiWEdQT04gbmV0d29yayBpbnRlcmZhY2UiLCAiWEdQT04gT05VIiwgIlhHUE9OIFRSWCIsICJQT04gU0VSREVTIHBhcmFtZXRlcnMuIiB9OworCisvKiA9PT09IFN1cHBvcnRpbmcgVHlwZXMgPT09PSAqLworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fTk9ORSB9LCB7IC5uYW1lID0gInJhbmdpbmciLCAudmFsID0gQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fUkFOR0lORyB9LCB7IC5uYW1lID0gInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uIiwgLnZhbCA9IEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OIH0sIHsgLm5hbWUgPSAibG9zIiwgLnZhbCA9IEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX0xPUyB9LCB7IC5uYW1lID0gIm9udV9hbGFybSIsIC52YWwgPSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9PTlVfQUxBUk0gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJhY3RpdmF0aW9uIGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhY3R1YWxfbWJzX3RxIiwgLmRlc2NyID0gIkFjdHVhbCBNQlMgKFRRKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciwgYWN0dWFsX21ic190cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhY3R1YWxfd2VpZ2h0X3RxIiwgLmRlc2NyID0gIkFjdHVhbCBXZWlnaHQgKFRRKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciwgYWN0dWFsX3dlaWdodF90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyID0geyAubmFtZSA9ICJiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciIsIC5kZXNjciA9ICJBY3R1YWwgU2NoZWR1bGVyL1NoYXBlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHlfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfQURESVRJT05BTF9CV19FTElHSUJJTElUWV9OT05FIH0sIHsgLm5hbWUgPSAibm9uX2Fzc3VyZWQiLCAudmFsID0gQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfTk9OX0FTU1VSRUQgfSwgeyAubmFtZSA9ICJiZXN0X2VmZm9ydCIsIC52YWwgPSBCQ01PTFRfQURESVRJT05BTF9CV19FTElHSUJJTElUWV9CRVNUX0VGRk9SVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgPSB7IC5uYW1lID0gImJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5IiwgLmRlc2NyID0gIkFkZGl0aW9uYWwgQlcgZWxpZ2liaWxpdHkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5X3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAiYWVfbmlfZW4iLCAudmFsID0gQkNNT0xUX0FFX05JX0NGR19JRF9BRV9OSV9FTiB9LCB7IC5uYW1lID0gIm10dV8xMGciLCAudmFsID0gQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHIH0sIHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAudmFsID0gQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC52YWwgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiB9LCB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9uaV9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfbmlfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfbmlfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX2VuX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRpc2FibGVkIiwgLnZhbCA9IEJDTU9MVF9BRV9OSV9FTl9TVEFURV9ESVNBQkxFRCB9LCB7IC5uYW1lID0gImVuYWJsZWQiLCAudmFsID0gQkNNT0xUX0FFX05JX0VOX1NUQVRFX0VOQUJMRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9lbl9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX25pX2VuX3N0YXRlIiwgLmRlc2NyID0gIkVuYWJsZSBzdGF0ZSBvZiB0aGUgQUUgTkkuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX25pX2VuX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX25pX2VuX3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhZV9uaSIsIC52YWwgPSBCQ01PTFRfQUVfTklfS0VZX0lEX0FFX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfbmlfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX25pX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX25pX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX25pX3NldF9hZV9uaV9lbl9zdGF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfZHNfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhZV9uaSIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfZHNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0RBVEFfQllURVMgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFlX25pIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9BRV9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX3VzX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVMgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjQiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjQgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTggfSwgeyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NyB9LCB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYgfSwgeyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzIH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfREFUQV9CWVRFUyB9LCB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZjc19lcnJvciIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZDU19FUlJPUiB9LCB7IC5uYW1lID0gIm92ZXJzaXplX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IgfSwgeyAubmFtZSA9ICJydW50X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfUlVOVF9FUlJPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX3VzX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl8xNiA9IHsgLm5hbWUgPSAidWludDhfdFsxNl0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgMTYgZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFsxNl0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLnNpemUgPSAxNiB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiQnl0ZXMgdGhhdCBjb21wcmlzZSB0aGUga2V5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVzX2tleSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzE2IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Flc19rZXkiLCAuZGVzY3IgPSAiMTI4LWJpdCBBRVMga2V5IHVzZWQgZm9yIE9OVSBhdXRoZW50aWNhdGlvbi4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVzX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXlfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY19vcGVyYXRpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWN0aXZhdGUiLCAudmFsID0gQkNNT0xUX0FMTE9DX09QRVJBVElPTl9BQ1RJVkFURSB9LCB7IC5uYW1lID0gImRlYWN0aXZhdGUiLCAudmFsID0gQkNNT0xUX0FMTE9DX09QRVJBVElPTl9ERUFDVElWQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfb3BlcmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfYWxsb2Nfb3BlcmF0aW9uIiwgLmRlc2NyID0gIkFsbG9jIG9wZXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hbGxvY19vcGVyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FsbG9jX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vdF9jb25maWd1cmVkIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRCB9LCB7IC5uYW1lID0gImluYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRSB9LCB7IC5uYW1lID0gInByb2Nlc3NpbmciLCAudmFsID0gQkNNT0xUX0FMTE9DX1NUQVRFX1BST0NFU1NJTkcgfSwgeyAubmFtZSA9ICJhY3RpdmUiLCAudmFsID0gQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfYWxsb2Nfc3RhdGUiLCAuZGVzY3IgPSAiQWxsb2MgU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWxsb2Nfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWxsb2Nfc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWxsb2NfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19UWVBFX05PTkUgfSwgeyAubmFtZSA9ICJuc3IiLCAudmFsID0gQkNNT0xUX0FMTE9DX1RZUEVfTlNSIH0sIHsgLm5hbWUgPSAic3IiLCAudmFsID0gQkNNT0xUX0FMTE9DX1RZUEVfU1IgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY190eXBlID0geyAubmFtZSA9ICJiY21vbHRfYWxsb2NfdHlwZSIsIC5kZXNjciA9ICJBbGxvYyBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FsbG9jX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWxsb2NfdHlwZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW5fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidW51c2VkIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fVU5VU0VEIH0sIHsgLm5hbWUgPSAicHJldmlvdXNseV91c2VkIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fUFJFVklPVVNMWV9VU0VEIH0sIHsgLm5hbWUgPSAiYWxsIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fQUxMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWxsb2NfdHlwZV90b19zY2FuID0geyAubmFtZSA9ICJiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuIiwgLmRlc2NyID0gIkFsbG9jIFR5cGUgdG8gc2NhbiBkdXJpbmcgdGhlIHJvZ3VlIG9udSBkZXRlY3Rpb24gcHJvY2Vzcy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2Nhbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvdmVyZmxvdyIsIC52YWwgPSBCQ01PTFRfQVBJX0NBUFRVUkVfQlVGRkVSX01PREVfT1ZFUkZMT1cgfSwgeyAubmFtZSA9ICJ3cmFwIiwgLnZhbCA9IEJDTU9MVF9BUElfQ0FQVFVSRV9CVUZGRVJfTU9ERV9XUkFQIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZSIsIC5kZXNjciA9ICJXaGF0IHRvIGRvIHdoZW4gdGhlIGNhcHR1cmUgYnVmZmVyIGlzIGZ1bGwuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9mZnNldCIsIC5kZXNjciA9ICJUaGUgYnl0ZXMgb2Zmc2V0IHRvIHJlYWQgZnJvbS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIsIG9mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzaXplIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIsIHNpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlciA9IHsgLm5hbWUgPSAiYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIiLCAuZGVzY3IgPSAiV2hhdCBwb3J0aW9uIG9mIHRoZSBjYXB0dXJlIGJ1ZmZlciB0byByZWFkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlcl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRldmljZSIsIC52YWwgPSBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fREVWSUNFIH0sIHsgLm5hbWUgPSAiaG9zdCIsIC52YWwgPSBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fSE9TVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uID0geyAubmFtZSA9ICJiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24iLCAuZGVzY3IgPSAiV2hlcmUgdG8gcGVyZm9ybSB0aGUgQVBJIGNhcHR1cmUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9jYXRpb24iLCAuZGVzY3IgPSAiV2hlcmUgdG8gcGVyZm9ybSB0aGUgQVBJIGNhcHR1cmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcsIGxvY2F0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gfSwgeyAubmFtZSA9ICJidWZmZXJfc2l6ZV9ieXRlcyIsIC5kZXNjciA9ICJNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjYXB0dXJlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnLCBidWZmZXJfc2l6ZV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJidWZmZXJfbW9kZSIsIC5kZXNjciA9ICJXaGF0IHRvIGRvIHdoZW4gdGhlIGNhcHR1cmUgYnVmZmVyIGlzIGZ1bGwuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcsIGJ1ZmZlcl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWciLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBmb3IgQVBJIGNhcHR1cmUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ1ZmZlcl91c2VkX2J5dGVzIiwgLmRlc2NyID0gIlVzZWQgc3BhY2UgaW4gdGhlIGNhcHR1cmUgYnVmZmVyIChpbiBieXRlcykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cywgYnVmZmVyX3VzZWRfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYnVmZmVyX3dyYXBfY291bnQiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIHRpbWVzIHRoZSBjYXB0dXJlIGJ1ZmZlciBoYXMgd3JhcHBlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzLCBidWZmZXJfd3JhcF9jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJldmVudHNfcmVjb3JkZWQiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGV2ZW50cyByZWNvcmRlZCBpbiB0aGUgY2FwdHVyZSBidWZmZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cywgZXZlbnRzX3JlY29yZGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImV2ZW50c19kcm9wcGVkIiwgLmRlc2NyID0gIk51bWJlciBvZiBldmVudHMgZHJvcHBlZCBkdWUgdG8gb3ZlcmZsb3cuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cywgZXZlbnRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicmVhZGFibGVfYnl0ZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byByZXRyaWV2ZSBjYXB0dXJlIGJ1ZmZlci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzLCByZWFkYWJsZV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyA9IHsgLm5hbWUgPSAiYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzIiwgLmRlc2NyID0gIlN0YXRpc3RpY3Mgb24gdGhlIG1vc3QgcmVjZW50IEFQSSBjYXB0dXJlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9zdGF0c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9zdGF0c19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ib3VuZHNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYmVzdF9jYXNlIiwgLmRlc2NyID0gIkJlc3QgQ2FzZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYm91bmRzLCBiZXN0X2Nhc2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAid29yc3RfY2FzZSIsIC5kZXNjciA9ICJXb3JzdCBDYXNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ib3VuZHMsIHdvcnN0X2Nhc2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYm91bmRzID0geyAubmFtZSA9ICJiY21vbHRfYm91bmRzIiwgLmRlc2NyID0gIkJvdW5kcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ib3VuZHMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYm91bmRzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2JvdW5kc19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2JvdW5kc19hcnJfOCA9IHsgLm5hbWUgPSAiYmNtb2x0X2JvdW5kc1s4XSIsIC5kZXNjciA9ICJBcnJheSBvZiA4IGVsZW1lbnRzIG9mIHR5cGUgYmNtb2x0X2JvdW5kcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ib3VuZHNbOF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2JvdW5kcywgLnNpemUgPSA4IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX2JvdW5kc184X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX2JvdW5kc184LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ib3VuZHNfYXJyXzggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfYm91bmRzXzggPSB7IC5uYW1lID0gImJjbW9sdF9hcnJfYm91bmRzXzgiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDh4IGJvdW5kcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfYm91bmRzXzgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXJyX2JvdW5kc184X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9ib3VuZHNfOF9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ1bnNwZWNpZmllZCIsIC52YWwgPSBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX1VOU1BFQ0lGSUVEIH0sIHsgLm5hbWUgPSAidW5jYWxpYnJhdGVkIiwgLnZhbCA9IEJDTU9MVF9DQUxJQlJBVElPTl9SRUNPUkRfVU5DQUxJQlJBVEVEIH0sIHsgLm5hbWUgPSAibG9vc2UiLCAudmFsID0gQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9MT09TRSB9LCB7IC5uYW1lID0gInN1ZmZpY2llbnQiLCAudmFsID0gQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9TVUZGSUNJRU5UIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkID0geyAubmFtZSA9ICJiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkIiwgLmRlc2NyID0gIkNhbGlicmF0aW9uIFJlY29yZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF9hcnJfOCA9IHsgLm5hbWUgPSAiYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZFs4XSIsIC5kZXNjciA9ICJBcnJheSBvZiA4IGVsZW1lbnRzIG9mIHR5cGUgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmRbOF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCwgLnNpemUgPSA4IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmRfYXJyXzggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggPSB7IC5uYW1lID0gImJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzgiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDh4IGNhbGlicmF0aW9uX3JlY29yZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3NpZ25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9zaXRpdmUiLCAudmFsID0gQkNNT0xUX1NJR05fUE9TSVRJVkUgfSwgeyAubmFtZSA9ICJuZWdhdGl2ZSIsIC52YWwgPSBCQ01PTFRfU0lHTl9ORUdBVElWRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NpZ24gPSB7IC5uYW1lID0gImJjbW9sdF9zaWduIiwgLmRlc2NyID0gInNpZ24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc2lnbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zaWduX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNpZ24iLCAuZGVzY3IgPSAic2lnbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCwgc2lnbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NpZ24gfSwgeyAubmFtZSA9ICJ2YWx1ZSIsIC5kZXNjciA9ICJ2YWx1ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCwgdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0ID0geyAubmFtZSA9ICJiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCIsIC5kZXNjciA9ICJEUyBmcmVxdWVuY3kgb2Zmc2V0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyYXRlXzJfcF81X2ciLCAudmFsID0gQkNNT0xUX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVNfUkFURV8yX1BfNV9HIH0sIHsgLm5hbWUgPSAicmF0ZV8xMF9nIiwgLnZhbCA9IEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMTBfRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgPSB7IC5uYW1lID0gImJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIiwgLmRlc2NyID0gIlhHUE9OIG5pIHVwc3RyZWFtIGxpbmUgcmF0ZSBjYXBhYmlsaXRpZXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xpbmtfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ1bnNwZWNpZmllZCIsIC52YWwgPSBCQ01PTFRfTElOS19UWVBFX1VOU1BFQ0lGSUVEIH0sIHsgLm5hbWUgPSAiYiIsIC52YWwgPSBCQ01PTFRfTElOS19UWVBFX0IgfSwgeyAubmFtZSA9ICJhIiwgLnZhbCA9IEJDTU9MVF9MSU5LX1RZUEVfQSB9LCB7IC5uYW1lID0gImFfYW5kX2IiLCAudmFsID0gQkNNT0xUX0xJTktfVFlQRV9BX0FORF9CIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGlua190eXBlID0geyAubmFtZSA9ICJiY21vbHRfbGlua190eXBlIiwgLmRlc2NyID0gIkxpbmsgdHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9saW5rX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbGlua190eXBlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX3Byb2ZpbGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidmVyc2lvbiIsIC5kZXNjciA9ICJDaGFubmVsIHByb2ZpbGUgdmVyc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlLCB2ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiY2hhbm5lbF9pbmRleCIsIC5kZXNjciA9ICJDaGFubmVsIHByb2ZpbGUgaW5kZXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgY2hhbm5lbF9pbmRleCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImRzX2ZyZXF1ZW5jeV9vZmZzZXQiLCAuZGVzY3IgPSAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWN0dWFsIE9MVCBDVCBUeCBmcmVxdWVuY3kgYW5kIHRoZSBub21pbmFsIGNlbnRyYWwgZnJlcXVlbmN5IGZvciB0aGUgZ2l2ZW4gRFdMQ0ggSUQsIGV4cHJlc3NlZCBpbiB1bml0cyBvZiAwLjFHSHoiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgZHNfZnJlcXVlbmN5X29mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQgfSwgeyAubmFtZSA9ICJjaGFubmVsX3BhcnRpdGlvbiIsIC5kZXNjciA9ICJDaGFubmVsIHBhcnRpdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlLCBjaGFubmVsX3BhcnRpdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInV3bGNoX2lkIiwgLmRlc2NyID0gIlRoZSBhc3NpZ25lZCB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgdXdsY2hfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ1c19mcmVxdWVuY3kiLCAuZGVzY3IgPSAiVGhlIG5vbWluYWwgY2VudHJhbCBmcmVxdWVuY3kgb2YgdGhlIHVwc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCBvciBhIHJvb3QgZnJlcXVlbmN5IG9mIHRoZSBjeWNsaWMgc2V0IG9mIGNlbnRyYWwgZnJlcXVlbmNpZXMgZm9ybWluZyBhbiB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwsIGluZGljYXRlcyB0aGUgdmFsdWUgaW4gdW5pdHMgb2YgMC4xIEdIei4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgdXNfZnJlcXVlbmN5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInVzX3JhdGUiLCAuZGVzY3IgPSAiVVMgcmF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlLCB1c19yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyB9LCB7IC5uYW1lID0gImRlZmF1bHRfb251X2F0dGVudWF0aW9uIiwgLmRlc2NyID0gIlRoZSBkZWZhdWx0IE9OVSBhdHRlbnVhdGlvbiBsZXZlbCBpbiBzdGVwcyBvZiAzZEIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyZXNwb25zZV90aHJlc2hvbGQiLCAuZGVzY3IgPSAiVGhyZXNob2xkIHJlcHJlc2VudCB0aGUgbWF4aW11bSBudW1iZXIgb2YgUGxvYW1zIHRoZSBPTlUgY2FuIHRyYW5zbWl0IGF0IG5vbi16ZXJvIGF0dGVudWF0aW9uIGxldmVsIHdoaWxlIGF0dGVtcHRpbmcgdG8gZXN0YWJsaXNoIGNvbW11bmljYXRpb24gd2l0aCBPTFQgQ1QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgcmVzcG9uc2VfdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidXNfbGlua190eXBlIiwgLmRlc2NyID0gIlVTIGxpbmsgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlLCB1c19saW5rX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9saW5rX3R5cGUgfSwgeyAubmFtZSA9ICJpc192YWxpZCIsIC5kZXNjciA9ICJpcyB2YWxpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlLCBpc192YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSIsIC5kZXNjciA9ICJDaGFubmVsIFByb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfcHJvZmlsZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX3Byb2ZpbGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX3Byb2ZpbGVfYXJyXzggPSB7IC5uYW1lID0gImJjbW9sdF9jaGFubmVsX3Byb2ZpbGVbOF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgOCBlbGVtZW50cyBvZiB0eXBlIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlWzhdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX3Byb2ZpbGUsIC5zaXplID0gOCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9wcm9maWxlX2Fycl84IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA4eCBjaGFubmVsX3Byb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZHNfd2F2ZWxlbmd0aF9jaGFubmVsX2lkIiwgLmRlc2NyID0gIkRvd25zdHJlYW0gd2F2ZWxlbmd0aCBjaGFubmVsIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCwgZHNfd2F2ZWxlbmd0aF9jaGFubmVsX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidXNfd2F2ZWxlbmd0aF9jaGFubmVsX2lkIiwgLmRlc2NyID0gIlVwc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQsIHVzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInBvd2VyX2NvbnN1bXB0aW9uIiwgLmRlc2NyID0gIlBvd2VyIGNvbnN1bXB0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCwgcG93ZXJfY29uc3VtcHRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQgPSB7IC5uYW1lID0gImJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCIsIC5kZXNjciA9ICJQb3dlciBjb25zdW1wdGlvbiByZXBvcnQgcGVyIGNoYW5uZWwiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF9hcnJfOCA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0WzhdIiwgLmRlc2NyID0gIkFycmF5IG9mIDggZWxlbWVudHMgb2YgdHlwZSBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRbOF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0LCAuc2l6ZSA9IDggfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF9hcnJfOCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzgiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDh4IHBvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MTZfdF9hcnJfMiA9IHsgLm5hbWUgPSAidWludDE2X3RbMl0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgMiBlbGVtZW50cyBvZiB0eXBlIHVpbnQxNl90IiwgLnNpemUgPSBzaXplb2YodWludDE2X3RbMl0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QsIC5zaXplID0gMiB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91MTZfMiwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9hcnJfMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMiA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91MTZfMiIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogMnggVTE2IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91MTZfMiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MTZfdF9hcnJfMl9oZXggPSB7IC5uYW1lID0gInVpbnQxNl90WzJdIiwgLmRlc2NyID0gIkFycmF5IG9mIDIgZWxlbWVudHMgb2YgdHlwZSB1aW50MTZfdCIsIC5zaXplID0gc2l6ZW9mKHVpbnQxNl90WzJdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCwgLnNpemUgPSAyIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yX2hleF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91MTZfMl9oZXgsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfYXJyXzJfaGV4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yX2hleCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91MTZfMl9oZXgiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDJ4IFUxNiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfdTE2XzJfaGV4KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMl9oZXhfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yX2hleF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDE2X3RfYXJyXzVfaGV4ID0geyAubmFtZSA9ICJ1aW50MTZfdFs1XSIsIC5kZXNjciA9ICJBcnJheSBvZiA1IGVsZW1lbnRzIG9mIHR5cGUgdWludDE2X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50MTZfdFs1XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXgsIC5zaXplID0gNSB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNV9oZXhfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYXJyIiwgLmRlc2NyID0gIkFycmF5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcnJfdTE2XzVfaGV4LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2Fycl81X2hleCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNV9oZXggPSB7IC5uYW1lID0gImJjbW9sdF9hcnJfdTE2XzVfaGV4IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA1eCBVMTYiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3UxNl81X2hleCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzVfaGV4X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNV9oZXhfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQxNl90X2Fycl83ID0geyAubmFtZSA9ICJ1aW50MTZfdFs3XSIsIC5kZXNjciA9ICJBcnJheSBvZiA3IGVsZW1lbnRzIG9mIHR5cGUgdWludDE2X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50MTZfdFs3XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCwgLnNpemUgPSA3IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl83X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3UxNl83LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2Fycl83IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl83ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3UxNl83IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA3eCBVMTYiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3UxNl83KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfN19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQzMl90X2Fycl82ID0geyAubmFtZSA9ICJ1aW50MzJfdFs2XSIsIC5kZXNjciA9ICJBcnJheSBvZiA2IGVsZW1lbnRzIG9mIHR5cGUgdWludDMyX3QiLCAuc2l6ZSA9IHNpemVvZih1aW50MzJfdFs2XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCwgLnNpemUgPSA2IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UzMl82X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3UzMl82LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2Fycl82IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UzMl82ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3UzMl82IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA2eCBVMzIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3UzMl82KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MzJfNl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTMyXzZfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEwID0geyAubmFtZSA9ICJ1aW50OF90WzEwXSIsIC5kZXNjciA9ICJBcnJheSBvZiAxMCBlbGVtZW50cyBvZiB0eXBlIHVpbnQ4X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50OF90WzEwXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDEwIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEwX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3U4XzEwLCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEwID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3U4XzEwIiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiAxMHggVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3U4XzEwKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTBfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEyID0geyAubmFtZSA9ICJ1aW50OF90WzEyXSIsIC5kZXNjciA9ICJBcnJheSBvZiAxMiBlbGVtZW50cyBvZiB0eXBlIHVpbnQ4X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50OF90WzEyXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDEyIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3U4XzEyLCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEyID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3U4XzEyIiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiAxMnggVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3U4XzEyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTJfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEzID0geyAubmFtZSA9ICJ1aW50OF90WzEzXSIsIC5kZXNjciA9ICJBcnJheSBvZiAxMyBlbGVtZW50cyBvZiB0eXBlIHVpbnQ4X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50OF90WzEzXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDEzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3U4XzEzLCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEzID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3U4XzEzIiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiAxM3ggVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3U4XzEzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xM19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzM2ID0geyAubmFtZSA9ICJ1aW50OF90WzM2XSIsIC5kZXNjciA9ICJBcnJheSBvZiAzNiBlbGVtZW50cyBvZiB0eXBlIHVpbnQ4X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50OF90WzM2XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDM2IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3U4XzM2LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzM2IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3U4XzM2IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiAzNnggVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3U4XzM2KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8zNl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMzZfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzQgPSB7IC5uYW1lID0gInVpbnQ4X3RbNF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgNCBlbGVtZW50cyBvZiB0eXBlIHVpbnQ4X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50OF90WzRdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QsIC5zaXplID0gNCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3U4XzQsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfNCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3U4XzQiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDR4IFU4IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91OF80KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl80MCA9IHsgLm5hbWUgPSAidWludDhfdFs0MF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgNDAgZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFs0MF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLnNpemUgPSA0MCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80MF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91OF80MCwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl80MCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80MCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91OF80MCIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogNDB4IFU4IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91OF80MCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNDBfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzQwX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicHJvZmlsZV92ZXJzaW9uIiwgLmRlc2NyID0gInByb2ZpbGUgdmVyc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgcHJvZmlsZV92ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2hleCB9LCB7IC5uYW1lID0gImlzX2ZlY19vbiIsIC5kZXNjciA9ICJpcyBmZWMgb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIGlzX2ZlY19vbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRlbGltaXRlcl9zaXplX2luX2J5dGVzIiwgLmRlc2NyID0gImRlbGltaXRlciBzaXplIGluIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBkZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImRlbGltaXRlcl9wYXR0ZXJuX2hpZ2giLCAuZGVzY3IgPSAiZGVsaW1pdGVyIHBhdHRlcm4gaGlnaCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgZGVsaW1pdGVyX3BhdHRlcm5faGlnaCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiZGVsaW1pdGVyX3BhdHRlcm5fbG93IiwgLmRlc2NyID0gImRlbGltaXRlciBwYXR0ZXJuIGxvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgZGVsaW1pdGVyX3BhdHRlcm5fbG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJwcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMiLCAuZGVzY3IgPSAicHJlYW1ibGUgbGVuZ3RoIGluIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBwcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwcmVhbWJsZV9yZXBlYXRzX2NvdW50IiwgLmRlc2NyID0gInByZWFtYmxlIHJlcGVhdHMgY291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIHByZWFtYmxlX3JlcGVhdHNfY291bnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwcmVhbWJsZV9wYXR0ZXJuX2hpZ2giLCAuZGVzY3IgPSAicHJlYW1ibGUgcGF0dGVybiBoaWdoIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBwcmVhbWJsZV9wYXR0ZXJuX2hpZ2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gInByZWFtYmxlX3BhdHRlcm5fbG93IiwgLmRlc2NyID0gInByZWFtYmxlIHBhdHRlcm4gbG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBwcmVhbWJsZV9wYXR0ZXJuX2xvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAicG9uX3RhZyIsIC5kZXNjciA9ICJQT04gdGFnIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBwb25fdGFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm51bV9vZl9ndWFyZF9ieXRlcyIsIC5kZXNjciA9ICJudW1iZXIgb2YgZ3VhcmQgYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIG51bV9vZl9ndWFyZF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJpc19wcm9maWxlX3ZhbGlkIiwgLmRlc2NyID0gImlzIHByb2ZpbGUgdmFsaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIGlzX3Byb2ZpbGVfdmFsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJidXJzdF9vdmVyaGVhZF9zaXplX2luX3dvcmRzIiwgLmRlc2NyID0gIkJ1cnN0IG92ZXJoZWFkIHNpemUgaW4gNC1ieXRlIHdvcmRzICh3b3JkIHNpemUgaXMgNCBieXRlcyByZWdhcmRsZXNzIG9mIHVwc3RyZWFtIGRhdGEgcmF0ZSkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBidXJzdF9vdmVyaGVhZF9zaXplX2luX3dvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlIiwgLmRlc2NyID0gIlhHUE9OIGJ1cnN0IHByb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX2Fycl80ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZVs0XSIsIC5kZXNjciA9ICJBcnJheSBvZiA0IGVsZW1lbnRzIG9mIHR5cGUgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZVs0XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgLnNpemUgPSA0IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfYXJyXzQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogNHggeGdwb25fYnVyc3RfcHJvZmlsZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0cnhfcmVzZXRfcGF0dGVybl9maXJzdCIsIC5kZXNjciA9ICJ0cnggcmVzZXQgcGF0dGVybiBmaXJzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIHRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJ0cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiLCAuZGVzY3IgPSAidHJ4IHJlc2V0IHBhdHRlcm4gbWlkZGxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgdHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJ0cnhfcmVzZXRfcGF0dGVybl9sYXN0IiwgLmRlc2NyID0gInRyeCByZXNldCBwYXR0ZXJuIGxhc3QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uLCB0cnhfcmVzZXRfcGF0dGVybl9sYXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJ0cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQiLCAuZGVzY3IgPSAidHJ4IHJlc2V0IG1pZGRsZSByZXBlYXRzIGNvdW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgdHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHJ4X3Jlc2V0X2xvY2F0aW9uIiwgLmRlc2NyID0gInRyeCByZXNldCBsb2NhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIHRyeF9yZXNldF9sb2NhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJ0cnhfcmVzZXRfcG9sYXJpdHkiLCAuZGVzY3IgPSAidHJ4IHJlc2V0IHBvbGFyaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgdHJ4X3Jlc2V0X3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0IiwgLmRlc2NyID0gImJjZHIgcmVzZXQgcGF0dGVybiBmaXJzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIGJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IHBhdHRlcm4gbWlkZGxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QiLCAuZGVzY3IgPSAiYmNkciByZXNldCBwYXR0ZXJuIGxhc3QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uLCBiY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IG1pZGRsZSByZXBlYXRzIGNvdW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfbG9jYXRpb24iLCAuZGVzY3IgPSAiYmNkciByZXNldCBsb2NhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIGJjZHJfcmVzZXRfbG9jYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJiY2RyX3Jlc2V0X3BvbGFyaXR5IiwgLmRlc2NyID0gImJjZHIgcmVzZXQgcG9sYXJpdHkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uLCBiY2RyX3Jlc2V0X3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJYR1BPTiBUUlggY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uX2Fycl80ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25bNF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgNCBlbGVtZW50cyBvZiB0eXBlIGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbls0XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIC5zaXplID0gNCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uX2Fycl80IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgPSB7IC5uYW1lID0gImJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogNHggeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9zIiwgLmRlc2NyID0gIkF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIExPUyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIGxvcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9hbGFybXMiLCAuZGVzY3IgPSAiQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gT05VIGFsYXJtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIG9udV9hbGFybXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLmRlc2NyID0gIkF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIFRJV2kgYWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCB0aXdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYWNrX3RpbWVvdXQiLCAuZGVzY3IgPSAiQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gQWNrIHRpbWVvdXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCBhY2tfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNmaSIsIC5kZXNjciA9ICJBdXRvIGRlYWN0aXZhdGUgT05VIGR1ZSB0byBTRmkgYWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCBzZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsb2tpIiwgLmRlc2NyID0gIkF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIExva2kgYWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCBsb2tpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIsIC5kZXNjciA9ICJBdXRvbWF0aWMgT05VIGRlYWN0aXZhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGFydF9wYXR0ZXJuIiwgLmRlc2NyID0gInN0YXJ0IHBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Jlc3luY19jb250cm9sLCBzdGFydF9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWlkZGxlX3BhdHRlcm4iLCAuZGVzY3IgPSAibWlkZGxlIHBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Jlc3luY19jb250cm9sLCBtaWRkbGVfcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImxhc3RfcGF0dGVybiIsIC5kZXNjciA9ICJsYXN0IHBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Jlc3luY19jb250cm9sLCBsYXN0X3BhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJtaWRkbGVfcmVwZXRpdGlvbiIsIC5kZXNjciA9ICJtaWRkbGUgcmVwZXRpdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmVzeW5jX2NvbnRyb2wsIG1pZGRsZV9yZXBldGl0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9jYXRpb24iLCAuZGVzY3IgPSAibG9jYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Jlc3luY19jb250cm9sLCBsb2NhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sID0geyAubmFtZSA9ICJiY21vbHRfcmVzeW5jX2NvbnRyb2wiLCAuZGVzY3IgPSAiVFJYIFJlc3luYyBwYXR0ZXJuIGNvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmVzeW5jX2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2xfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2xfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3luY19jb250cm9sIiwgLmRlc2NyID0gInJlc3luYyBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24sIHJlc3luY19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJyYW5naW5nX3Jlc3luY19jb250cm9sIiwgLmRlc2NyID0gInJhbmdpbmcgcmVzeW5jIGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiwgcmFuZ2luZ19yZXN5bmNfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIkJDRFIgcmVzeW5jIHBhdHRlcm4gY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidXNfYmVyX2ludGVydmFsIiwgLmRlc2NyID0gIkludGVydmFsIGluIG1pbGxpc2Vjb25kcyBmb3IgdXBzdHJlYW0gQkVSIG1vbml0b3JpbmcgKDAgPSBkaXNhYmxlZCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMsIHVzX2Jlcl9pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzZl90aHJlc2hvbGQiLCAuZGVzY3IgPSAiU2lnbmFsIGZhaWwgYWxhcm0gaXMgcmFpc2VkIHdoZW4gQkVSIHJhaXNlcyB0byAxMF4teCwgd2hlcmUgeCBpcyB0aGlzIG51bWJlci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcywgc2ZfdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAic2RfdGhyZXNob2xkIiwgLmRlc2NyID0gIlNpZ25hbCBkZWdyYWRlIGFsYXJtIGlzIHJhaXNlZCB3aGVuIEJFUiByYWlzZXMgdG8gMTBeLXgsIHdoZXJlIHggaXMgdGhpcyBudW1iZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMsIHNkX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyIsIC5kZXNjciA9ICJCRVIgbW9uaXRvcmluZyBwYXJhbWV0ZXJzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdwb25fYmNkcl9yZXNldCIsIC52YWwgPSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX0dQT05fQkNEUl9SRVNFVCB9LCB7IC5uYW1lID0gImdwb25fdHJ4X2VkIiwgLnZhbCA9IEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfR1BPTl9UUlhfRUQgfSwgeyAubmFtZSA9ICJncG9uX3Jzc2kiLCAudmFsID0gQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9HUE9OX1JTU0kgfSwgeyAubmFtZSA9ICJncG9uX2VvYiIsIC52YWwgPSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX0dQT05fRU9CIH0sIHsgLm5hbWUgPSAic2VyZGVzX2J1cnN0X2VuIiwgLnZhbCA9IEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfU0VSREVTX0JVUlNUX0VOIH0sIHsgLm5hbWUgPSAic2VyZGVzX3J4X2xvY2siLCAudmFsID0gQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9TRVJERVNfUlhfTE9DSyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCA9IHsgLm5hbWUgPSAiYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCIsIC5kZXNjciA9ICJjYXB0dXJlIHN0cm9iZSBzaWduYWwiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYV83IiwgLmRlc2NyID0gIkNCQSBtYXhpbXVtIGFsbG9jYXRpb24gc2l6ZSBmb3IgZnJhbWUgZ2FwIDciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIG1hXzcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWFfMyIsIC5kZXNjciA9ICJDQkEgbWF4aW11bSBhbGxvY2F0aW9uIHNpemUgZm9yIGZyYW1lIGdhcCAzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCBtYV8zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1hXzEiLCAuZGVzY3IgPSAiQ0JBIG1heGltdW0gYWxsb2NhdGlvbiBzaXplIGZvciBmcmFtZSBnYXAgMSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgbWFfMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlID0geyAubmFtZSA9ICJiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC5kZXNjciA9ICJDQlIgUlQgQWxsb2NhdGlvbiBwcm9maWxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY2hhbm5lbF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib3BlcmF0aW9uX2NvbnRyb2wiLCAudmFsID0gQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MIH0sIHsgLm5hbWUgPSAidG9sIiwgLnZhbCA9IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0wgfSwgeyAubmFtZSA9ICJzeXN0ZW1fcHJvZmlsZSIsIC52YWwgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUgfSwgeyAubmFtZSA9ICJjaGFubmVsX3Byb2ZpbGUiLCAudmFsID0gQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfY2hhbm5lbF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgY2hhbm5lbF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2NoYW5uZWxfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9jaGFubmVsX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBjaGFubmVsX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfY2hhbm5lbF9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX05PTkUgfSwgeyAubmFtZSA9ICJyZWRpcmVjdCIsIC52YWwgPSBCQ01PTFRfQ09OU09MRV9SRURJUkVDVElPTl9SRURJUkVDVCB9LCB7IC5uYW1lID0gImNsb25lIiwgLnZhbCA9IEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX0NMT05FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb24iLCAuZGVzY3IgPSAiQ29uc29sZSBSZWRpcmVjdGlvbiBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9jb250cm9sX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRpc2FibGUiLCAudmFsID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRSB9LCB7IC5uYW1lID0gImVuYWJsZSIsIC52YWwgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfY29udHJvbF9zdGF0ZSIsIC5kZXNjciA9ICJjb250cm9sIHN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NvbnRyb2xfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfY29udHJvbF9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kYmFfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub3JtYWwiLCAudmFsID0gQkNNT0xUX0RCQV9NT0RFX05PUk1BTCB9LCB7IC5uYW1lID0gImV4dGVuZGVkIiwgLnZhbCA9IEJDTU9MVF9EQkFfTU9ERV9FWFRFTkRFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RiYV9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfZGJhX21vZGUiLCAuZGVzY3IgPSAiZGJhIG1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGJhX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGJhX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGJhX3JhbV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV8wIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzAgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV8xIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzEgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV8yIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzIgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV8zIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzMgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV80IiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzQgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV81IiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzUgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV82IiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzYgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV83IiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzcgfSwgeyAubmFtZSA9ICJncmFudHNfb3V0X3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVFNfT1VUX1JBTSB9LCB7IC5uYW1lID0gImdyYW50c19pbl9yYW0iLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fR1JBTlRTX0lOX1JBTSB9LCB7IC5uYW1lID0gImdyYW50c19yZXRpcmVkX3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVFNfUkVUSVJFRF9SQU0gfSwgeyAubmFtZSA9ICJyZXBvcnRfcmFtIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1JFUE9SVF9SQU0gfSwgeyAubmFtZSA9ICJncmFudF9jZmdfcmFtIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0NGR19SQU0gfSwgeyAubmFtZSA9ICJkZWZhdWx0X3Rva2Vuc19yYW0iLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fREVGQVVMVF9UT0tFTlNfUkFNIH0sIHsgLm5hbWUgPSAicG9sbF9yZWNvcmRzX3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9QT0xMX1JFQ09SRFNfUkFNIH0sIHsgLm5hbWUgPSAiaGVpcl9wb2xsX3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9IRUlSX1BPTExfUkFNIH0sIHsgLm5hbWUgPSAibGFzdF9wb2xsX3RpbWVfcmFtIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0xBU1RfUE9MTF9USU1FX1JBTSB9LCB7IC5uYW1lID0gInBvbGxfb3JkZXJfcmFtIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1BPTExfT1JERVJfUkFNIH0sIHsgLm5hbWUgPSAidGRtX3JhbV8wIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMCB9LCB7IC5uYW1lID0gInRkbV9yYW1fMSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzEgfSwgeyAubmFtZSA9ICJ0ZG1fcmFtXzIiLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fVERNX1JBTV8yIH0sIHsgLm5hbWUgPSAidGRtX3JhbV8zIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMyB9LCB7IC5uYW1lID0gInRkbV9yYW1fNCIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzQgfSwgeyAubmFtZSA9ICJ0ZG1fcmFtXzUiLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fVERNX1JBTV81IH0sIHsgLm5hbWUgPSAidGRtX3JhbV82IiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNiB9LCB7IC5uYW1lID0gInRkbV9yYW1fNyIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kYmFfcmFtID0geyAubmFtZSA9ICJiY21vbHRfZGJhX3JhbSIsIC5kZXNjciA9ICJEQkEgUkFNIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RiYV9yYW0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGJhX3JhbV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kYmFfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbnRlcm5hbCIsIC52YWwgPSBCQ01PTFRfREJBX1RZUEVfSU5URVJOQUwgfSwgeyAubmFtZSA9ICJwYXJ0aWFsX2V4dGVybmFsIiwgLnZhbCA9IEJDTU9MVF9EQkFfVFlQRV9QQVJUSUFMX0VYVEVSTkFMIH0sIHsgLm5hbWUgPSAiZXh0ZXJuYWwiLCAudmFsID0gQkNNT0xUX0RCQV9UWVBFX0VYVEVSTkFMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGJhX3R5cGUgPSB7IC5uYW1lID0gImJjbW9sdF9kYmFfdHlwZSIsIC5kZXNjciA9ICJEQkEgdHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kYmFfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kYmFfdHlwZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZHJfdGVzdF9zdGF0dXNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiY29ubmVjdGlvbl9mYWlsZWQiLCAudmFsID0gQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT05ORUNUSU9OX0ZBSUxFRCB9LCB7IC5uYW1lID0gInRpbWVvdXQiLCAudmFsID0gQkNNT0xUX0REUl9URVNUX1NUQVRVU19USU1FT1VUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3Rfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzIiwgLmRlc2NyID0gIkREUiBUZXN0IFN0YXR1cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZHJfdGVzdF9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdWNjZXNzIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU1VDQ0VTUyB9LCB7IC5uYW1lID0gInBoeV9pbml0X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfUEhZX0lOSVRfRVJST1IgfSwgeyAubmFtZSA9ICJkcmFtX2luaXRfZXJyb3IiLCAudmFsID0gQkNNT0xUX0REUl9URVNUX1JFU1VMVF9EUkFNX0lOSVRfRVJST1IgfSwgeyAubmFtZSA9ICJzaG1vb19lcnJvciIsIC52YWwgPSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1NITU9PX0VSUk9SIH0sIHsgLm5hbWUgPSAiZWRpc190ZXN0X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfRURJU19URVNUX0VSUk9SIH0sIHsgLm5hbWUgPSAibWVtX3Rlc3RfZXJyb3IiLCAudmFsID0gQkNNT0xUX0REUl9URVNUX1JFU1VMVF9NRU1fVEVTVF9FUlJPUiB9LCB7IC5uYW1lID0gIm5vdF90ZXN0ZWQiLCAudmFsID0gQkNNT0xUX0REUl9URVNUX1JFU1VMVF9OT1RfVEVTVEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfcmVzdWx0ID0geyAubmFtZSA9ICJiY21vbHRfZGRyX3Rlc3RfcmVzdWx0IiwgLmRlc2NyID0gIkREUiBUZXN0IFJlc3VsdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZHJfdGVzdF9yZXN1bHQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGRyX3Rlc3RfcmVzdWx0X3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVElNRU9VVCB9LCB7IC5uYW1lID0gImtlZXBhbGl2ZSIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0tFRVBBTElWRSB9LCB7IC5uYW1lID0gInVzZXJfY2FsbGJhY2tfZXJyb3IiLCAudmFsID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9VU0VSX0NBTExCQUNLX0VSUk9SIH0sIHsgLm5hbWUgPSAic29mdHdhcmVfdmVyc2lvbl9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NPRlRXQVJFX1ZFUlNJT05fTUlTTUFUQ0ggfSwgeyAubmFtZSA9ICJzeXN0ZW1fbW9kZV9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NZU1RFTV9NT0RFX01JU01BVENIIH0sIHsgLm5hbWUgPSAibm5pX3NwZWVkX21pc21hdGNoIiwgLnZhbCA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fTk5JX1NQRUVEX01JU01BVENIIH0sIHsgLm5hbWUgPSAicmVjb25uZWN0X3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9SRUNPTk5FQ1RfVElNRU9VVCB9LCB7IC5uYW1lID0gImludGVybmFsX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fSU5URVJOQUxfRVJST1IgfSwgeyAubmFtZSA9ICJzeXN0ZW1fbW9kZV9ub3Rfc3VwcG9ydGVkIiwgLnZhbCA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU1lTVEVNX01PREVfTk9UX1NVUFBPUlRFRCB9LCB7IC5uYW1lID0gInBhcmFtZXRlciIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1BBUkFNRVRFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJSZWFzb25zIHdoeSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFuZCB0aGUgZGV2aWNlIGZhaWxlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIk91dGNvbWUgb2YgdGhlIEREUiB0ZXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29tcGxldGVkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNwdV9yZXN1bHQiLCAuZGVzY3IgPSAiQ1BVIFJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbXBsZXRlZC5jcHVfcmVzdWx0KSAtIG9mZnNldG9mKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQsIHUuY29tcGxldGVkLmNwdV9yZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJyYXNfMF9yZXN1bHQiLCAuZGVzY3IgPSAiUkFTIDAgUmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQsIHUuY29tcGxldGVkLnJhc18wX3Jlc3VsdCkgLSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbXBsZXRlZC5jcHVfcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfcmVzdWx0IH0sIHsgLm5hbWUgPSAicmFzXzFfcmVzdWx0IiwgLmRlc2NyID0gIlJBUyAxIFJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbXBsZXRlZC5yYXNfMV9yZXN1bHQpIC0gb2Zmc2V0b2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCwgdS5jb21wbGV0ZWQuY3B1X3Jlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb21wbGV0ZWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29tcGxldGVkIiwgLmRlc2NyID0gIkREUiBUZXN0IENvbXBsZXRlZCBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKikwKS0+dS5jb21wbGV0ZWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2NvbXBsZXRlZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29tcGxldGVkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb25uZWN0aW9uX2ZhaWxlZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZWFzb24iLCAuZGVzY3IgPSAiQ29ubmVjdGlvbiBmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbm5lY3Rpb25fZmFpbGVkLnJlYXNvbikgLSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbm5lY3Rpb25fZmFpbGVkLnJlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb25uZWN0aW9uX2ZhaWxlZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb25uZWN0aW9uX2ZhaWxlZCIsIC5kZXNjciA9ICJERFIgVGVzdCBDb21wbGV0ZWQgQ29ubmVjdGlvbiBGYWlsZWQiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKikwKS0+dS5jb25uZWN0aW9uX2ZhaWxlZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29ubmVjdGlvbl9mYWlsZWRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2Nvbm5lY3Rpb25fZmFpbGVkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF91bmlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1LmNvbXBsZXRlZCIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCwgdS5jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29tcGxldGVkIH0sIHsgLm5hbWUgPSAidS5jb25uZWN0aW9uX2ZhaWxlZCIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCwgdS5jb25uZWN0aW9uX2ZhaWxlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb25uZWN0aW9uX2ZhaWxlZCB9LCB7IH0sIHsgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiUmVzdWx0cyBvZiB0aGUgRERSIHRlc3QiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04sIC54ID0geyAudSA9IHsgLm51bV9jb21tb25fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5jb21tb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2ZpZWxkcywgLmNsYXNzaWZpZXJfaWR4ID0gMCwgLnVuaW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF91bmlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0RFQUNUSVZBVElPTiB9LCB7IC5uYW1lID0gImFja190aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0FDS19USU1FT1VUIH0sIHsgLm5hbWUgPSAic2ZpIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1NGSSB9LCB7IC5uYW1lID0gInRpd2kiLCAudmFsID0gQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fVElXSSB9LCB7IC5uYW1lID0gInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OIH0sIHsgLm5hbWUgPSAib251X2FsYXJtIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX09OVV9BTEFSTSB9LCB7IC5uYW1lID0gImxvcyIsIC52YWwgPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9MT1MgfSwgeyAubmFtZSA9ICJsb2tpIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0xPS0kgfSwgeyAubmFtZSA9ICJyZXJhbmdlX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fUkVSQU5HRV9GQUlMVVJFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24iLCAuZGVzY3IgPSAiZGVhY3RpdmF0aW9uIHJlYXNvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2xpX291dHB1dCIsIC52YWwgPSBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfQ0xJX09VVFBVVCB9LCB7IC5uYW1lID0gImZpbGVfYWxtb3N0X2Z1bGwiLCAudmFsID0gQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0ZJTEVfQUxNT1NUX0ZVTEwgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uc29sZV9yZWRpcmVjdGlvbiIsIC52YWwgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT04gfSwgeyAubmFtZSA9ICJpbmRpY2F0aW9uc19kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9ERUJVR19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCB9LCB7IC5uYW1lID0gImZpbGVfdXNlZF9wZXJjZW50IiwgLnZhbCA9IEJDTU9MVF9ERUJVR19DRkdfSURfRklMRV9VU0VEX1BFUkNFTlQgfSwgeyAubmFtZSA9ICJhcGlfY2FwdHVyZV9jZmciLCAudmFsID0gQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcgfSwgeyAubmFtZSA9ICJhcGlfY2FwdHVyZV9zdGF0cyIsIC52YWwgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX1NUQVRTIH0sIHsgLm5hbWUgPSAiYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQiLCAudmFsID0gQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCB9LCB7IC5uYW1lID0gImFwaV9jYXB0dXJlX2J1ZmZlciIsIC52YWwgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZWJ1Z19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRhdGEiLCAudmFsID0gQkNNT0xUX0RFQlVHX0NMSV9JTlBVVF9JRF9EQVRBIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX2lucHV0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfY2xpX2lucHV0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2NsaV9pbnB1dCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfY2xpX2lucHV0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRhdGEiLCAudmFsID0gQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfREFUQSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2NsaV9vdXRwdXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfZGV2aWNlX2NmZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJob3N0X2RtYV9yeF9xdWV1ZV9zaXplIiwgLmRlc2NyID0gIlJYIFF1ZXVlIHNpemUgb2YgdGhlIGhvc3QgRE1BICAgICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfZGV2aWNlX2NmZywgaG9zdF9kbWFfcnhfcXVldWVfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJob3N0X2RtYV90eF9xdWV1ZV9zaXplIiwgLmRlc2NyID0gIlRYIFF1ZXVlIHNpemUgb2YgdGhlIGhvc3QgRE1BICAgICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfZGV2aWNlX2NmZywgaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJhdnNfY29udHJvbCIsIC5kZXNjciA9ICJBVlMgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfZGV2aWNlX2NmZywgYXZzX2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ1c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlIiwgLmRlc2NyID0gIlRoaXMgaXMgYSBmYWxsYmFjayBvcHRpb24gaWYgdGhlcmUgYXJlIGlzc3VlcyB3aXRoIHRoZSBuZXcgZmlybXdhcmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2RldmljZV9jZmcsIHVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ1c2VfcHJldl9ubmlfc2VyZGVzX2Zpcm13YXJlIiwgLmRlc2NyID0gIlRoaXMgaXMgYSBmYWxsYmFjayBvcHRpb24gaWYgdGhlcmUgYXJlIGlzc3VlcyB3aXRoIHRoZSBuZXcgZmlybXdhcmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2RldmljZV9jZmcsIHVzZV9wcmV2X25uaV9zZXJkZXNfZmlybXdhcmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfZGV2aWNlX2NmZyIsIC5kZXNjciA9ICJEZWJ1ZyBwYXJhbWV0ZXJzIGZvciBkZXZpY2UgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfZGV2aWNlX2NmZ19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfZmlsZV9hbG1vc3RfZnVsbCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC52YWwgPSBCQ01PTFRfREVCVUdfS0VZX0lEX1JFU0VSVkVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RlYnVnX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX3N0b3BfYXBpX2NhcHR1cmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29ubmVjdGlvbl9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fQ09NUExFVEUgfSwgeyAubmFtZSA9ICJjb25uZWN0aW9uX2VzdGFibGlzaGVkIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCB9LCB7IC5uYW1lID0gImNvbm5lY3Rpb25fZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRkFJTFVSRSB9LCB7IC5uYW1lID0gImRkcl90ZXN0X2NvbXBsZXRlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRERSX1RFU1RfQ09NUExFVEUgfSwgeyAubmFtZSA9ICJkZXZpY2Vfa2VlcF9hbGl2ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFIH0sIHsgLm5hbWUgPSAiZGV2aWNlX3JlYWR5IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX1JFQURZIH0sIHsgLm5hbWUgPSAiZGlzY29ubmVjdGlvbl9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUgfSwgeyAubmFtZSA9ICJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFIH0sIHsgLm5hbWUgPSAiaW5kaWNhdGlvbnNfZHJvcHBlZCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQgfSwgeyAubmFtZSA9ICJzd19lcnJvciIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SIH0sIHsgLm5hbWUgPSAic3dfZXhjZXB0aW9uIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVhDRVBUSU9OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN5c3RlbV9tb2RlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFIH0sIHsgLm5hbWUgPSAia2VlcGFsaXZlX2ludGVydmFsIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9JTlRFUlZBTCB9LCB7IC5uYW1lID0gImtlZXBhbGl2ZV90b2xlcmFuY2UiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX1RPTEVSQU5DRSB9LCB7IC5uYW1lID0gImZpcm13YXJlX3N3X3ZlcnNpb24iLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTiB9LCB7IC5uYW1lID0gImhvc3Rfc3dfdmVyc2lvbiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9IT1NUX1NXX1ZFUlNJT04gfSwgeyAubmFtZSA9ICJjaGlwX3JldmlzaW9uIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfUkVWSVNJT04gfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9TVEFURSB9LCB7IC5uYW1lID0gImRlYnVnIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHIH0sIHsgLm5hbWUgPSAibm5pX3NwZWVkIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfRVhUX0lSUSB9LCB7IC5uYW1lID0gImVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9TQU1QTEVfREVMQVkgfSwgeyAubmFtZSA9ICJpbmRpY2F0aW9uX3NoYXBpbmciLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfSU5ESUNBVElPTl9TSEFQSU5HIH0sIHsgLm5hbWUgPSAiY2hpcF90ZW1wZXJhdHVyZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1RFTVBFUkFUVVJFIH0sIHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0VOQUJMRSB9LCB7IC5uYW1lID0gImdwb25feGdwb25fdG9kX2dwaW9fcGluIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOIH0sIHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfQ09OTkVDVEVEX0lOVEVSTkFMTFkgfSwgeyAubmFtZSA9ICJlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCB9LCB7IC5uYW1lID0gImVwb25fc2hhcGVyX21vZGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9TSEFQRVJfTU9ERSB9LCB7IC5uYW1lID0gImVtYmVkZGVkX2ltYWdlX2xpc3QiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRU1CRURERURfSU1BR0VfTElTVCB9LCB7IC5uYW1lID0gImNoaXBfdm9sdGFnZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1ZPTFRBR0UgfSwgeyAubmFtZSA9ICJlcG9uX3RvZF9zdHJpbmciLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9UT0RfU1RSSU5HIH0sIHsgLm5hbWUgPSAieGdwb25fbnVtX29mX29udXMiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMgfSwgeyAubmFtZSA9ICJkZXZpY2VfaXBfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfSVBfQUREUkVTUyB9LCB7IC5uYW1lID0gImRldmljZV91ZHBfcG9ydCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQgfSwgeyAubmFtZSA9ICJ0b2RfdWFydF9iYXVkcmF0ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURSB9LCB7IC5uYW1lID0gImdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhMCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NISVBfUkVWSVNJT05fQTAgfSwgeyAubmFtZSA9ICJiMCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NISVBfUkVWSVNJT05fQjAgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uIiwgLmRlc2NyID0gIlJldmlzaW9uIG9mIHRoZSBCQ002ODYyMCBkZXZpY2UuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9jb25uZWN0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jb25uZWN0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2Nvbm5lY3RfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2Nvbm5lY3QgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jb25uZWN0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9jb25uZWN0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YW5kYWxvbmUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlYXNvbiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRV9JRF9SRUFTT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRkcl90ZXN0IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfRERSX1RFU1RfQ09NUExFVEVfSURfRERSX1RFU1QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzZXF1ZW5jZV9udW1iZXIiLCAudmFsID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIgfSwgeyAubmFtZSA9ICJ0aW1lX3N0YW1wIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmaXJtd2FyZV9zd192ZXJzaW9uIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04gfSwgeyAubmFtZSA9ICJzeXN0ZW1fbW9kZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9TWVNURU1fTU9ERSB9LCB7IC5uYW1lID0gIm5uaV9zcGVlZCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9OTklfU1BFRUQgfSwgeyAubmFtZSA9ICJjaGlwX3JldmlzaW9uIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0NISVBfUkVWSVNJT04gfSwgeyAubmFtZSA9ICJ0b2RfZW5hYmxlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1RPRF9FTkFCTEUgfSwgeyAubmFtZSA9ICJ0b2RfZ3Bpb19waW4iLCAudmFsID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0dQSU9fUElOIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2RldmljZV9yZWFkeSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2Rpc2Nvbm5lY3QgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VxdWVuY2VfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUiB9LCB7IC5uYW1lID0gInRpbWVfc3RhbXAiLCAudmFsID0gQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9ob3N0X2tlZXBfYWxpdmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaW1hZ2VfdHlwZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX0lNQUdFX1RZUEUgfSwgeyAubmFtZSA9ICJibG9ja19udW1iZXIiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9CTE9DS19OVU1CRVIgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJsb2NrX251bWJlciIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfQkxPQ0tfTlVNQkVSIH0sIHsgLm5hbWUgPSAibW9yZV9kYXRhIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEgfSwgeyAubmFtZSA9ICJkYXRhIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImltYWdlX3R5cGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9UWVBFIH0sIHsgLm5hbWUgPSAiaW1hZ2Vfc2l6ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1NJWkUgfSwgeyAubmFtZSA9ICJjcmMzMiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0NSQzMyIH0sIHsgLm5hbWUgPSAiaW1hZ2VfbmFtZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX05BTUUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJvb3Rsb2FkZXIiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVIgfSwgeyAubmFtZSA9ICJhcHBsaWNhdGlvbiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04gfSwgeyAubmFtZSA9ICJpdHVfcG9uX29udV9maXJtd2FyZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfSVRVX1BPTl9PTlVfRklSTVdBUkUgfSwgeyAubmFtZSA9ICJlcG9uX29udV9maXJtd2FyZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfRVBPTl9PTlVfRklSTVdBUkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIiwgLmRlc2NyID0gIkRldmljZSBJbWFnZSBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRvdGFsX2NvdW50IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRF9JRF9UT1RBTF9DT1VOVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAudmFsID0gQkNNT0xUX0RFVklDRV9LRVlfSURfUkVTRVJWRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Vfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3NwZWVkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdicHNfMSIsIC52YWwgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMSB9LCB7IC5uYW1lID0gImdicHNfMnA1IiwgLnZhbCA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18yUDUgfSwgeyAubmFtZSA9ICJnYnBzXzEwIiwgLnZhbCA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18xMCB9LCB7IC5uYW1lID0gImdicHNfMTJwNSIsIC52YWwgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTJQNSB9LCB7IC5uYW1lID0gImdicHNfMTBfZ19tdXgiLCAudmFsID0gQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEwX0dfTVVYIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NwZWVkID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3NwZWVkIiwgLmRlc2NyID0gIk5ldHdvcmsgaW50ZXJmYWNlIHNwZWVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zcGVlZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ubmlfc3BlZWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmlyc3RfaGFsZiIsIC5kZXNjciA9ICJJbnRlcmZhY2Ugc3BlZWQgZm9yIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBOTkkgcG9ydHMgb24gdGhlIHN5c3RlbS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ubmlfc3BlZWQsIGZpcnN0X2hhbGYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3BlZWQgfSwgeyAubmFtZSA9ICJzZWNvbmRfaGFsZiIsIC5kZXNjciA9ICJJbnRlcmZhY2Ugc3BlZWQgZm9yIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgTk5JIHBvcnRzIG9uIHRoZSBzeXN0ZW0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkLCBzZWNvbmRfaGFsZiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9zcGVlZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIiwgLmRlc2NyID0gIkRldmljZSBOTkkgU3BlZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX25uaV9zcGVlZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfcmVzZXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibW9kZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX01PREUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcmVzZXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfcmVzZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3Jlc2V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX3Jlc2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9yZXNldF9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRldmljZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JFU0VUX01PREVfREVWSUNFIH0sIHsgLm5hbWUgPSAiaG9zdCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JFU0VUX01PREVfSE9TVCB9LCB7IC5uYW1lID0gImFsbCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JFU0VUX01PREVfQUxMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3Jlc2V0X21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSIsIC5kZXNjciA9ICJPcHRpb25zIGZvciB0aGUgcmVzZXQgb3BlcmF0aW9uLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNwdSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9DUFUgfSwgeyAubmFtZSA9ICJyYXNfMCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCB9LCB7IC5uYW1lID0gInJhc18xIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18xIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3J1bl9kZHJfdGVzdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNjb25uZWN0ZWQiLCAudmFsID0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQgfSwgeyAubmFtZSA9ICJjb25uZWN0aW5nIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfQ09OTkVDVElORyB9LCB7IC5uYW1lID0gInJlYWR5IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfUkVBRFkgfSwgeyAubmFtZSA9ICJ3YWl0aW5nX2Zvcl9kZXZpY2UiLCAudmFsID0gQkNNT0xUX0RFVklDRV9TVEFURV9XQUlUSU5HX0ZPUl9ERVZJQ0UgfSwgeyAubmFtZSA9ICJ0ZXN0aW5nX2RkciIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1NUQVRFX1RFU1RJTkdfRERSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBvdmVyYWxsIHN0YXRlIG9mIHRoZSBob3N0J3MgY29ubmVjdGlvbiB0byB0aGUgZGV2aWNlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0YXNrX25hbWUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUgfSwgeyAubmFtZSA9ICJmaWxlX25hbWUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9GSUxFX05BTUUgfSwgeyAubmFtZSA9ICJsaW5lX251bWJlciIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0xJTkVfTlVNQkVSIH0sIHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9zd19lcnJvciBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNwdV9pZCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9DUFVfSUQgfSwgeyAubmFtZSA9ICJ0ZXh0IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX1RFWFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Vfc3dfZXhjZXB0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2xfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidW5pY2FzdF9kaXNhYmxlIiwgLnZhbCA9IEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9VTklDQVNUX0RJU0FCTEUgfSwgeyAubmFtZSA9ICJ1bmljYXN0X2VuYWJsZSIsIC52YWwgPSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfVU5JQ0FTVF9FTkFCTEUgfSwgeyAubmFtZSA9ICJicm9hZGNhc3RfZW5hYmxlIiwgLnZhbCA9IEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9CUk9BRENBU1RfRU5BQkxFIH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2Rpc2FibGUiLCAudmFsID0gQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX0JST0FEQ0FTVF9ESVNBQkxFIH0sIHsgLm5hbWUgPSAiZGlzYWJsZV9kaXNjb3ZlcnkiLCAudmFsID0gQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX0RJU0FCTEVfRElTQ09WRVJZIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgPSB7IC5uYW1lID0gImJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCIsIC5kZXNjciA9ICJEaXNhYmxlIFNlcmlhbCBOdW1iZXIgQ29udHJvbCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kcnZfaWNmX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImlkeDAiLCAudmFsID0gQkNNT0xUX0RSVl9JQ0ZfSURfSURYMCB9LCB7IC5uYW1lID0gImlkeDEiLCAudmFsID0gQkNNT0xUX0RSVl9JQ0ZfSURfSURYMSB9LCB7IC5uYW1lID0gImlkeDIiLCAudmFsID0gQkNNT0xUX0RSVl9JQ0ZfSURfSURYMiB9LCB7IC5uYW1lID0gImlkeDMiLCAudmFsID0gQkNNT0xUX0RSVl9JQ0ZfSURfSURYMyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rydl9pY2ZfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kcnZfaWNmX2lkIiwgLmRlc2NyID0gImRydl9pY2ZfaWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZHJ2X2ljZl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kcnZfaWNmX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rydl9zZ2JfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaWR4MCIsIC52YWwgPSBCQ01PTFRfRFJWX1NHQl9JRF9JRFgwIH0sIHsgLm5hbWUgPSAiaWR4MSIsIC52YWwgPSBCQ01PTFRfRFJWX1NHQl9JRF9JRFgxIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZHJ2X3NnYl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Rydl9zZ2JfaWQiLCAuZGVzY3IgPSAiZHJ2X3NnYl9pZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kcnZfc2diX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Rydl9zZ2JfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZHNfdmxhbl9hY3Rpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVtb3ZlIiwgLnZhbCA9IEJDTU9MVF9EU19WTEFOX0FDVElPTl9SRU1PVkUgfSwgeyAubmFtZSA9ICJ0cmFuc3BhcmVudCIsIC52YWwgPSBCQ01PTFRfRFNfVkxBTl9BQ1RJT05fVFJBTlNQQVJFTlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kc192bGFuX2FjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2RzX3ZsYW5fYWN0aW9uIiwgLmRlc2NyID0gIkRTIFZMQU4gYWN0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RzX3ZsYW5fYWN0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RzX3ZsYW5fYWN0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRyb3AiLCAudmFsID0gQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0RST1AgfSwgeyAubmFtZSA9ICJmb3J3YXJkX25uaSIsIC52YWwgPSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfRk9SV0FSRF9OTkkgfSwgeyAubmFtZSA9ICJmb3J3YXJkX2NwdSIsIC52YWwgPSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfRk9SV0FSRF9DUFUgfSwgeyAubmFtZSA9ICJzbm9vcCIsIC52YWwgPSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfU05PT1AgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90ZmJfdHJhcF9iZWhhdmlvciA9IHsgLm5hbWUgPSAiYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIiwgLmRlc2NyID0gIlRGQiBUcmFwIEJlaGF2aW9yIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RmYl9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdwb24iLCAudmFsID0gQkNNT0xUX1RGQl9NT0RFX0dQT04gfSwgeyAubmFtZSA9ICJ4Z3BvbiIsIC52YWwgPSBCQ01PTFRfVEZCX01PREVfWEdQT04gfSwgeyAubmFtZSA9ICJlcG9uIiwgLnZhbCA9IEJDTU9MVF9URkJfTU9ERV9FUE9OIH0sIHsgLm5hbWUgPSAieGVwb24iLCAudmFsID0gQkNNT0xUX1RGQl9NT0RFX1hFUE9OIH0sIHsgLm5hbWUgPSAiY29leCIsIC52YWwgPSBCQ01PTFRfVEZCX01PREVfQ09FWCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RmYl9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfdGZiX21vZGUiLCAuZGVzY3IgPSAiVEZCIE1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdGZiX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdGZiX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbGltX3NlY19tb2RlX3VwX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRlayIsIC52YWwgPSBCQ01PTFRfTElNX1NFQ19NT0RFX1VQX1RFSyB9LCB7IC5uYW1lID0gInBlcl9sbGlkIiwgLnZhbCA9IEJDTU9MVF9MSU1fU0VDX01PREVfVVBfUEVSX0xMSUQgfSwgeyAubmFtZSA9ICJudHQiLCAudmFsID0gQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9OVFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9saW1fc2VjX21vZGVfdXAgPSB7IC5uYW1lID0gImJjbW9sdF9saW1fc2VjX21vZGVfdXAiLCAuZGVzY3IgPSAiTElNIFNFQyBNb2RlIFVwIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xpbV9zZWNfbW9kZV91cCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9saW1fc2VjX21vZGVfdXBfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbGltX3NlY19tb2RlX2RuX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRlayIsIC52YWwgPSBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX1RFSyB9LCB7IC5uYW1lID0gInBlcl9sbGlkIiwgLnZhbCA9IEJDTU9MVF9MSU1fU0VDX01PREVfRE5fUEVSX0xMSUQgfSwgeyAubmFtZSA9ICJudHQiLCAudmFsID0gQkNNT0xUX0xJTV9TRUNfTU9ERV9ETl9OVFQgfSwgeyAubmFtZSA9ICJjZXBvbiIsIC52YWwgPSBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX0NFUE9OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGltX3NlY19tb2RlX2RuID0geyAubmFtZSA9ICJiY21vbHRfbGltX3NlY19tb2RlX2RuIiwgLmRlc2NyID0gIkxJTSBTRUMgTW9kZSBEbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9saW1fc2VjX21vZGVfZG4pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbGltX3NlY19tb2RlX2RuX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hpbV9zZWNfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZF8wIiwgLnZhbCA9IEJDTU9MVF9YSU1fU0VDX01PREVfUkVTRVJWRURfMCB9LCB7IC5uYW1lID0gInBlcl9sbGlkIiwgLnZhbCA9IEJDTU9MVF9YSU1fU0VDX01PREVfUEVSX0xMSUQgfSwgeyAubmFtZSA9ICJyZXNlcnZlZF8yIiwgLnZhbCA9IEJDTU9MVF9YSU1fU0VDX01PREVfUkVTRVJWRURfMiB9LCB7IC5uYW1lID0gImNlcG9uIiwgLnZhbCA9IEJDTU9MVF9YSU1fU0VDX01PREVfQ0VQT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94aW1fc2VjX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF94aW1fc2VjX21vZGUiLCAuZGVzY3IgPSAiWElNIFNFQyBNb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hpbV9zZWNfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94aW1fc2VjX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfaHNjX3JhbV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsbGNfdDEiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fTExDX1QxIH0sIHsgLm5hbWUgPSAibGxjX3QyIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0xMQ19UMiB9LCB7IC5uYW1lID0gImxsY190MyIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9MTENfVDMgfSwgeyAubmFtZSA9ICJncnBfdDIiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fR1JQX1QyIH0sIHsgLm5hbWUgPSAiZ3JwX3QzIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0dSUF9UMyB9LCB7IC5uYW1lID0gInNocF90MSIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9TSFBfVDEgfSwgeyAubmFtZSA9ICJzaHBfdDIiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fU0hQX1QyIH0sIHsgLm5hbWUgPSAic2hwX3QzIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX1NIUF9UMyB9LCB7IC5uYW1lID0gInByZl90MSIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9QUkZfVDEgfSwgeyAubmFtZSA9ICJwcmZfdDIiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fUFJGX1QyIH0sIHsgLm5hbWUgPSAicHJmX3QzIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX1BSRl9UMyB9LCB7IC5uYW1lID0gImNyZV90MSIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9DUkVfVDEgfSwgeyAubmFtZSA9ICJjcmVfdDIiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fQ1JFX1QyIH0sIHsgLm5hbWUgPSAiY3JlX3QzIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0NSRV9UMyB9LCB7IC5uYW1lID0gImVsdSIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9FTFUgfSwgeyAubmFtZSA9ICJwdHJfdDEiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fUFRSX1QxIH0sIHsgLm5hbWUgPSAicHRyX3QyIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX1BUUl9UMiB9LCB7IC5uYW1lID0gImFncl9zaHBfdDEiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fQUdSX1NIUF9UMSB9LCB7IC5uYW1lID0gImFlbSIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9BRU0gfSwgeyAubmFtZSA9ICJhbGxfbGxjIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0FMTF9MTEMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9oc2NfcmFtID0geyAubmFtZSA9ICJiY21vbHRfaHNjX3JhbSIsIC5kZXNjciA9ICJIU0MgUkFNIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2hzY19yYW0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfaHNjX3JhbV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9saW1fcmFtX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxsaWRfdXAiLCAudmFsID0gQkNNT0xUX0xJTV9SQU1fTExJRF9VUCB9LCB7IC5uYW1lID0gInBlcl9vbnVfc3RhdCIsIC52YWwgPSBCQ01PTFRfTElNX1JBTV9QRVJfT05VX1NUQVQgfSwgeyAubmFtZSA9ICJmZWNfdXBfZnVsbF9zIiwgLnZhbCA9IEJDTU9MVF9MSU1fUkFNX0ZFQ19VUF9GVUxMX1MgfSwgeyAubmFtZSA9ICJmZWNfdXBfZGF0YSIsIC52YWwgPSBCQ01PTFRfTElNX1JBTV9GRUNfVVBfREFUQSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xpbV9yYW0gPSB7IC5uYW1lID0gImJjbW9sdF9saW1fcmFtIiwgLmRlc2NyID0gIkxJTSBSQU0iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbGltX3JhbSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9saW1fcmFtX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xreV9yYW1fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidHhfa2V5X3JhbSIsIC52YWwgPSBCQ01PTFRfTEtZX1JBTV9UWF9LRVlfUkFNIH0sIHsgLm5hbWUgPSAidHhfa2V5X2J1ZmZlciIsIC52YWwgPSBCQ01PTFRfTEtZX1JBTV9UWF9LRVlfQlVGRkVSIH0sIHsgLm5hbWUgPSAicnhfa2V5X3JhbSIsIC52YWwgPSBCQ01PTFRfTEtZX1JBTV9SWF9LRVlfUkFNIH0sIHsgLm5hbWUgPSAicnhfa2V5X2J1ZmZlciIsIC52YWwgPSBCQ01PTFRfTEtZX1JBTV9SWF9LRVlfQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGt5X3JhbSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xreV9yYW0iLCAuZGVzY3IgPSAiTEtZIFJBTSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sa3lfcmFtKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xreV9yYW1fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbWljX3JhbV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyYW5nZSIsIC52YWwgPSBCQ01PTFRfTUlDX1JBTV9SQU5HRSB9LCB7IC5uYW1lID0gImxsaWQiLCAudmFsID0gQkNNT0xUX01JQ19SQU1fTExJRCB9LCB7IC5uYW1lID0gImluZGV4IiwgLnZhbCA9IEJDTU9MVF9NSUNfUkFNX0lEWCB9LCB7IC5uYW1lID0gImdyYW50X21pc3MiLCAudmFsID0gQkNNT0xUX01JQ19SQU1fR1JBTlRfTUlTUyB9LCB7IC5uYW1lID0gImdyYW50X2lkIiwgLnZhbCA9IEJDTU9MVF9NSUNfUkFNX0dSQU5UX0lEIH0sIHsgLm5hbWUgPSAidHhfaXYiLCAudmFsID0gQkNNT0xUX01JQ19SQU1fVFhfSVYgfSwgeyAubmFtZSA9ICJyeF9pdiIsIC52YWwgPSBCQ01PTFRfTUlDX1JBTV9SWF9JViB9LCB7IC5uYW1lID0gInR4X3BvcnRfc3RhdCIsIC52YWwgPSBCQ01PTFRfTUlDX1JBTV9UWF9QT1JUX1NUQVQgfSwgeyAubmFtZSA9ICJyeF9wb3J0X3N0YXQiLCAudmFsID0gQkNNT0xUX01JQ19SQU1fUlhfUE9SVF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbWljX3JhbSA9IHsgLm5hbWUgPSAiYmNtb2x0X21pY19yYW0iLCAuZGVzY3IgPSAiTUlDIFJBTSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9taWNfcmFtKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X21pY19yYW1fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeHBjc3JtX3JhbV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjYXB0dXJlX2ZpZm8iLCAudmFsID0gQkNNT0xUX1hQQ1NSTV9SQU1fQ0FQVFVSRV9GSUZPIH0sIHsgLm5hbWUgPSAiZmVjX2RlY29kZSIsIC52YWwgPSBCQ01PTFRfWFBDU1JNX1JBTV9GRUNfREVDT0RFIH0sIHsgLm5hbWUgPSAiZmVjX3N0YXRzIiwgLnZhbCA9IEJDTU9MVF9YUENTUk1fUkFNX0ZFQ19TVEFUUyB9LCB7IC5uYW1lID0gImZlY19lbnF1ZXVlIiwgLnZhbCA9IEJDTU9MVF9YUENTUk1fUkFNX0ZFQ19FTlFVRVVFIH0sIHsgLm5hbWUgPSAiaWRsZV9pbnNlcnQiLCAudmFsID0gQkNNT0xUX1hQQ1NSTV9SQU1fSURMRV9JTlNFUlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94cGNzcm1fcmFtID0geyAubmFtZSA9ICJiY21vbHRfeHBjc3JtX3JhbSIsIC5kZXNjciA9ICJYUENTUk0gUkFNIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hwY3NybV9yYW0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeHBjc3JtX3JhbV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZCIsIC5kZXNjciA9ICJhZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgYWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJldCIsIC5kZXNjciA9ICJldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJlbGciLCAuZGVzY3IgPSAiZWxnIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBlbGcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJkYmFfcG9ydCIsIC5kZXNjciA9ICJkYmEgcG9ydCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgZGJhX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJzZ2IiLCAuZGVzY3IgPSAic2diIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBzZ2IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kcnZfc2diX2lkIH0sIHsgLm5hbWUgPSAiaWNmIiwgLmRlc2NyID0gImljZiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgaWNmKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZHJ2X2ljZl9pZCB9LCB7IC5uYW1lID0gInRmYl90cmFwX2JlaGF2aW9yIiwgLmRlc2NyID0gInRmYiB0cmFwIGJlaGF2aW9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCB0ZmJfdHJhcF9iZWhhdmlvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIH0sIHsgLm5hbWUgPSAidGZiX21vZGUiLCAuZGVzY3IgPSAidGZiIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIHRmYl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdGZiX21vZGUgfSwgeyAubmFtZSA9ICJsaW1fc2VjX21vZGVfdXAiLCAuZGVzY3IgPSAibGltIHNlYyBtb2RlIHVwIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBsaW1fc2VjX21vZGVfdXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9saW1fc2VjX21vZGVfdXAgfSwgeyAubmFtZSA9ICJsaW1fc2VjX21vZGVfZG4iLCAuZGVzY3IgPSAibGltIHNlYyBtb2RlIGRuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBsaW1fc2VjX21vZGVfZG4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9saW1fc2VjX21vZGVfZG4gfSwgeyAubmFtZSA9ICJ4aW1fc2VjX21vZGUiLCAuZGVzY3IgPSAieGltIHNlYyBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCB4aW1fc2VjX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94aW1fc2VjX21vZGUgfSwgeyAubmFtZSA9ICJkYmFfcmFtIiwgLmRlc2NyID0gImRiYSByYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIGRiYV9yYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kYmFfcmFtIH0sIHsgLm5hbWUgPSAiaHNjX3JhbSIsIC5kZXNjciA9ICJoc2MgcmFtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBoc2NfcmFtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaHNjX3JhbSB9LCB7IC5uYW1lID0gImxpbV9yYW0iLCAuZGVzY3IgPSAibGltIHJhbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgbGltX3JhbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xpbV9yYW0gfSwgeyAubmFtZSA9ICJsa3lfcmFtIiwgLmRlc2NyID0gImxreSByYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIGxreV9yYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sa3lfcmFtIH0sIHsgLm5hbWUgPSAibWljX3JhbSIsIC5kZXNjciA9ICJtaWMgcmFtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBtaWNfcmFtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWljX3JhbSB9LCB7IC5uYW1lID0gInhwY3NfcmFtIiwgLmRlc2NyID0gInhwY3MgcmFtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCB4cGNzX3JhbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hwY3NybV9yYW0gfSwgeyAubmFtZSA9ICJ4ZzJnX2lkIiwgLmRlc2NyID0gInhnMmcgaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIHhnMmdfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzID0geyAubmFtZSA9ICJiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyIsIC5kZXNjciA9ICJEdW1teSBTdHJ1Y3QgRm9yIEVtYmVkZGVkIFR5cGVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19OT05FIH0sIHsgLm5hbWUgPSAiaW5fcHJvZ3Jlc3MiLCAudmFsID0gQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19JTl9QUk9HUkVTUyB9LCB7IC5uYW1lID0gInN1Y2Nlc3MiLCAudmFsID0gQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19TVUNDRVNTIH0sIHsgLm5hbWUgPSAiZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfRU1CRURERURfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0ZBSUxVUkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMiLCAuZGVzY3IgPSAiZW1iZWRkZWQgaW1hZ2UgdHJhbnNmZXIgc3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1Igc3RyaW5nXzY0ID0geyAubmFtZSA9ICJzdHJpbmdbNjRdIiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggNjQiLCAuc2l6ZSA9IHNpemVvZihjaGFyWzY0XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW1hZ2VfdHlwZSIsIC5kZXNjciA9ICJUeXBlIG9mIHRoZSBlbWJlZGRlZCBmaWxlIGltYWdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnksIGltYWdlX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSB9LCB7IC5uYW1lID0gImltYWdlX3NpemUiLCAuZGVzY3IgPSAiU2l6ZSBvZiB0aGUgZW1iZWRkZWQgZmlsZSBpbWFnZS4gIFVuaXQgaXMgYnl0ZXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSwgaW1hZ2Vfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJjcmMzMiIsIC5kZXNjciA9ICJDUkMgMzIgY2hlY2tzdW0gb2YgZW50aXJlIGZpbGUgaW1hZ2UgZGF0YS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5LCBjcmMzMiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIkltYWdlIHRyYW5zZmVyIHN0YXR1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5LCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgfSwgeyAubmFtZSA9ICJpbWFnZV9uYW1lIiwgLmRlc2NyID0gIk5hbWUgb2YgdGhlIGZpbGUgaW1hZ2UuICBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIERQb0UgT05VIG9ubHkuICBEUG9FIHJlcXVpcmVzIHRoZSB3cml0ZSByZXF1ZXN0IE9BTSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5LCBpbWFnZV9uYW1lKSwgLnR5cGUgPSAmc3RyaW5nXzY0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkgPSB7IC5uYW1lID0gImJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSIsIC5kZXNjciA9ICJFbWJlZGRlZCBpbWFnZSBlbnRyeSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggPSB7IC5uYW1lID0gImJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGVtYmVkZGVkX2ltYWdlX2VudHJ5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnksIC5sZW5fc2l6ZSA9IDEsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZihiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkpIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0X3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmYiIsIC52YWwgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkIgfSwgeyAubmFtZSA9ICJjdHIiLCAudmFsID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQiLCAuZGVzY3IgPSAiRVBPTiBFbmNyeXB0aW9uIGluZm9ybWF0aW9uIGZvcm1hdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZvcm1hdCIsIC5kZXNjciA9ICJGb3JtYXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyLCBmb3JtYXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2NmYl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJrZXkiLCAuZGVzY3IgPSAiS2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgdS5jZmIua2V5KSAtIG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgdS5jZmIua2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl8xNiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2NmYiA9IHsgLm5hbWUgPSAiYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2NmYiIsIC5kZXNjciA9ICJFbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciBDRkIiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciAqKTApLT51LmNmYiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jZmJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfY2ZiX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl84ID0geyAubmFtZSA9ICJ1aW50OF90WzhdIiwgLmRlc2NyID0gIkFycmF5IG9mIDggZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFs4XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDggfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jdHJfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAia2V5IiwgLmRlc2NyID0gIktleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIsIHUuY3RyLmtleSkgLSBvZmZzZXRvZihiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIsIHUuY3RyLmtleSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfMTYgfSwgeyAubmFtZSA9ICJzY2kiLCAuZGVzY3IgPSAiU0NJIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgdS5jdHIuc2NpKSAtIG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgdS5jdHIua2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl84IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfY3RyID0geyAubmFtZSA9ICJiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfY3RyIiwgLmRlc2NyID0gIkVuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIENUUiIsIC5zaXplID0gc2l6ZW9mKCgoYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICopMCktPnUuY3RyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2N0cl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jdHJfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfdW5pb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidS5jZmIiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgdS5jZmIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jZmIgfSwgeyAubmFtZSA9ICJ1LmN0ciIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyLCB1LmN0ciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2N0ciB9LCB7IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgPSB7IC5uYW1lID0gImJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciIsIC5kZXNjciA9ICJFbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OLCAueCA9IHsgLnUgPSB7IC5udW1fY29tbW9uX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5jb21tb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfZmllbGRzLCAuY2xhc3NpZmllcl9pZHggPSAwLCAudW5pb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfdW5pb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbnRlcm5hbCIsIC52YWwgPSBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfSU5URVJOQUwgfSwgeyAubmFtZSA9ICJ0cngiLCAudmFsID0gQkNNT0xUX0VORVJHWV9ERVRFQ1RfU09VUkNFX1RSWCB9LCB7IC5uYW1lID0gImJjZHIiLCAudmFsID0gQkNNT0xUX0VORVJHWV9ERVRFQ1RfU09VUkNFX0JDRFIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIiwgLmRlc2NyID0gImVuZXJneSBkZXRlY3Qgc291cmNlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl8xR19UVVJCT19NT0RFX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAiZW5hYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl8xR19UVVJCT19NT0RFX0VOQUJMRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUiLCAuZGVzY3IgPSAiRVBPTiB0dXJibyBtb2RlLiAgRW5hYmxlcyBkb3VibGUgZG93bnN0cmVhbSBzcGVlZCAoMkcpIG9uIDFHIEVQT04gTklzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJob3N0X2RyaXZlbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9DTE9DS19UUkFOU1BPUlRfTU9ERV9IT1NUX0RSSVZFTiB9LCB7IC5uYW1lID0gImVtYmVkZGVkX2RyaXZlbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9DTE9DS19UUkFOU1BPUlRfTU9ERV9FTUJFRERFRF9EUklWRU4gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSIsIC5kZXNjciA9ICJFUE9OIENsb2NrIFRyYW5zcG9ydCBNb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlIiwgLmRlc2NyID0gIkNsb2NrIFRyYW5zcG9ydCBtb2RlIG9uIHRoaXMgT0xUIFBPTiBQb3J0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiwgZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJFUE9OIGNsb2NrIHRyYW5zcG9ydCBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2llcG9uX2EiLCAudmFsID0gQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9BIH0sIHsgLm5hbWUgPSAic2llcG9uX2IiLCAudmFsID0gQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9CIH0sIHsgLm5hbWUgPSAic2llcG9uX2MiLCAudmFsID0gQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9DIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZSIsIC5kZXNjciA9ICJDb250cm9sIGZvciBob3cgdGhlIERCQSBoYW5kbGVzIHJlY2VpdmVkIE1QQ1AgcmVwb3J0IGZyYW1lcy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3JhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidGVuX3RlbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTiB9LCB7IC5uYW1lID0gInRlbl9vbmUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9PTkUgfSwgeyAubmFtZSA9ICJvbmVfb25lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfUkFURV9PTkVfT05FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfcmF0ZSIsIC5kZXNjciA9ICJFUE9OIGxpbmsgcmF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfcmF0ZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zdGF0dXNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib2ZmIiwgLnZhbCA9IEJDTU9MVF9TVEFUVVNfT0ZGIH0sIHsgLm5hbWUgPSAib24iLCAudmFsID0gQkNNT0xUX1NUQVRVU19PTiB9LCB7IC5uYW1lID0gIm5vX2NoYW5nZSIsIC52YWwgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0YXR1cyIsIC5kZXNjciA9ICJTdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3N0YXR1c19zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiVGhlIHJhdGUgb2YgdGhlIHVua25vd24gbGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cywgbGlua19yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiV2hldGhlciB0aGUgdW5rbm93biBsaW5rIGFsYXJtIGlzIHJhaXNlZCBvciBjbGVhcmVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cywgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMiLCAuZGVzY3IgPSAiRGF0YSBvZiB1bmtub3duIGxpbmssIGluY2x1ZGluZyByYXRlIGFuZCBhbGFybSBzdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsYXNlcl9vbl90aW1lIiwgLmRlc2NyID0gIlRoZSBsYXNlciBvbiB0aW1lIG9mIHRoZSBPTlUgdGhhdCBpcyB2aW9sYXRpbmcuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzLCBsYXNlcl9vbl90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImxhc2VyX29mZl90aW1lIiwgLmRlc2NyID0gIlRoZSBsYXNlciBvZmYgdGltZSBvZiB0aGUgT05VIHRoYXQgaXMgdmlvbGF0aW5nLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cywgbGFzZXJfb2ZmX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIldoZXRoZXIgdGhlIGxhc2VyIG9uL29mZiB2aW9sYXRpb24gYWxhcm0gaXMgcmFpc2VkIG9yIGNsZWFyZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyIsIC5kZXNjciA9ICJEYXRhIG9mIGxhc2VyIG9uL29mZiB2aW9sYXRpbmcgbGluaywgaW5jbHVkaW5nIGF0dGVtcHRlZCBsYXNlciBvbiB0aW1lLCBhdHRlbXB0ZWQgbGFzZXIgb2ZmIHRpbWUsIGFuZCBhbGFybSBzdGF0dXMuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdlX3N0YXR1c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyYW5nZSIsIC5kZXNjciA9ICJUaGUgcmFuZ2UgdGhhdCB0aGUgdmlvbGF0aW5nIGxpbmsgYXR0ZW1wdGVkIHRvIHJlZ2lzdGVyIGF0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2Vfc3RhdHVzLCByYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiV2hldGhlciB0aGUgcmFuZ2UgdmlvbGF0aW9uIGFsYXJtIGlzIHJhaXNlZCBvciBjbGVhcmVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2Vfc3RhdHVzLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5nZV9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9yYW5nZV9zdGF0dXMiLCAuZGVzY3IgPSAiRGF0YSBvZiByYW5nZSB2aW9sYXRpbmcgbGluaywgaW5jbHVkaW5nIHRoZSByYW5nZSBpdCBhdHRlbXB0ZWQgdG8gdXNlLCBhbmQgYWxhcm0gc3RhdHVzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yYW5nZV9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcmFuZ2Vfc3RhdHVzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdlX3N0YXR1c19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zdGF0dXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGVuaWVkX2xsaWQiLCAuZGVzY3IgPSAiTExJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfc3RhdHVzLCBkZW5pZWRfbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJkZW5pZWRfcmFuZ2UiLCAuZGVzY3IgPSAiT05VIFJhbmdlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9zdGF0dXMsIGRlbmllZF9yYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX3N0YXR1cywgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfc3RhdHVzIiwgLmRlc2NyID0gIkRldGFpbHMgb2YgU3VzcGVjdGVkIFJvZ3VlIE9OVSBwcm92aWRlZCBpbiBEZW5pZWQgTGluayBBbGFybSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yb2d1ZV9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfc3RhdHVzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX3N0YXR1c19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInVua25vd25fbGlua192aW9sYXRpb24iLCAuZGVzY3IgPSAiVW5rbm93biBMaW5rIFZpb2xhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSwgdW5rbm93bl9saW5rX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgfSwgeyAubmFtZSA9ICJvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJPdmVyaGVhZCBQcm9maWxlIFZpb2xhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSwgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJtYXhfbGlua192aW9sYXRpb24iLCAuZGVzY3IgPSAiTWF4IExpbmsgVmlvbGF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlLCBtYXhfbGlua192aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIiwgLmRlc2NyID0gIkxMSUQgUG9vbCBFbXB0eSBWaW9sYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUsIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIiwgLmRlc2NyID0gIkxhc2VyIE9uL09mZiBWaW9sYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUsIGxhc2VyX29uX29mZl92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzIH0sIHsgLm5hbWUgPSAic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJTeXN0ZW0gUmVzb3VyY2UgVmlvbGF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlLCBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmlvbGF0aW9uIiwgLmRlc2NyID0gIlJhbmdlIFZpb2xhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSwgcmFuZ2VfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2Vfc3RhdHVzIH0sIHsgLm5hbWUgPSAidGRtX2NoYW5uZWxzX2V4aGF1c3RlZCIsIC5kZXNjciA9ICJURE0gQ2hhbm5lbHMgRXhoYXVzdGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlLCB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAicm9ndWVfdmlvbGF0aW9uIiwgLmRlc2NyID0gIlJvZ3VlIE9OVSBWaW9sYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUsIHJvZ3VlX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX3N0YXR1cyB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iLCAuZGVzY3IgPSAiVXBzdHJlYW0gQmFuZHdpZHRoIFZpb2xhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSwgdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSBvZiBhbGwgYWxhcm1zIG9uIGFuIEVQT04gRGVuaWVkIExpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT04gfSwgeyAubmFtZSA9ICJsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT04gfSwgeyAubmFtZSA9ICJtYXhfbGlua192aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTUFYX0xJTktfVklPTEFUSU9OIH0sIHsgLm5hbWUgPSAib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT04gfSwgeyAubmFtZSA9ICJyYW5nZV92aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVklPTEFUSU9OIH0sIHsgLm5hbWUgPSAicm9ndWVfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTiB9LCB7IC5uYW1lID0gInN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTiB9LCB7IC5uYW1lID0gInRkbV9jaGFubmVsc19leGhhdXN0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVERNX0NIQU5ORUxTX0VYSEFVU1RFRCB9LCB7IC5uYW1lID0gInVua25vd25fbGlua192aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTiB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfQUxBUk1fU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9FUE9OX05JIH0sIHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vX2VuY3J5cHRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT04gfSwgeyAubmFtZSA9ICJlcG9uX3RyaXBsZV9jaHVybmluZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9UUklQTEVfQ0hVUk5JTkcgfSwgeyAubmFtZSA9ICJlcG9uX3plcm9fb3ZlcmhlYWRfYWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSIsIC5kZXNjciA9ICJFUE9OIGVuY3J5cHRpb24gbW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2tleV9jaG9pY2Vfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAia2V5XzAiLCAudmFsID0gQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9LRVlfMCB9LCB7IC5uYW1lID0gImtleV8xIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzEgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2tleV9jaG9pY2UgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2tleV9jaG9pY2UiLCAuZGVzY3IgPSAiRXBvbiBLZXkgQ2hvaWNlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2tleV9jaG9pY2Vfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZG93bnN0cmVhbV9tb2RlIiwgLmRlc2NyID0gIkRvd25zdHJlYW0gTW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZywgZG93bnN0cmVhbV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgfSwgeyAubmFtZSA9ICJkb3duc3RyZWFtX2tleV9jaG9pY2UiLCAuZGVzY3IgPSAiRG93bnN0cmVhbSBLZXkgQ2hvaWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnLCBkb3duc3RyZWFtX2tleV9jaG9pY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2tleV9jaG9pY2UgfSwgeyAubmFtZSA9ICJkb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24iLCAuZGVzY3IgPSAiRG93bnN0cmVhbSBFbmNyeXB0aW9uIEluZm9ybWF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnLCBkb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciB9LCB7IC5uYW1lID0gInVwc3RyZWFtX21vZGUiLCAuZGVzY3IgPSAiVXBzdHJlYW0gTW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZywgdXBzdHJlYW1fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fa2V5X2Nob2ljZSIsIC5kZXNjciA9ICJVcHN0cmVhbSBLZXkgQ2hvaWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnLCB1cHN0cmVhbV9rZXlfY2hvaWNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9rZXlfY2hvaWNlIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiIsIC5kZXNjciA9ICJVcHN0cmVhbSBFbmNyeXB0aW9uIEluZm9ybWF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnLCB1cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyIsIC5kZXNjciA9ICJLZXlzIGFuZCBtb2RlIGZvciBlbmNyeXB0aW5nIHRoZSBFUE9OIGxvZ2ljYWwgbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRvd25zdHJlYW1fb25seSIsIC52YWwgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0RJUkVDVElPTl9ET1dOU1RSRUFNX09OTFkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbiIsIC5kZXNjciA9ICJFUE9OIEVuY3J5cHRpb24gRGlyZWN0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQgfSwgeyAubmFtZSA9ICJlbmFibGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9FTkFCTEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSIsIC5kZXNjciA9ICJFUE9OIEZFQyBlbmFibGUgc3RhdGUuICBTZWUgZmxhZyBkZXNjcmlwdGlvbnMgZm9yIHJlc3RyaWN0aW9ucy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vYW1fdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJicm9hZGNvbSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9CUk9BRENPTSB9LCB7IC5uYW1lID0gImN0YyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9DVEMgfSwgeyAubmFtZSA9ICJkcG9lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09BTV9UWVBFX0RQT0UgfSwgeyAubmFtZSA9ICJzaWVwb25hIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09BTV9UWVBFX1NJRVBPTkEgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29hbV90eXBlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vYW1fdHlwZSIsIC5kZXNjciA9ICJUaGUgdHlwZXMgb2YgT0FNIHRvIGNob29zZSBmcm9tLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb2FtX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvYW1fdHlwZSIsIC5kZXNjciA9ICJUaGUgdHlwZSBvZiBPQU0gdGhhdCBpcyBzZW50IHRvIHN0YXJ0IHRoZSBrZXkgZXhjaGFuZ2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcsIG9hbV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vYW1fdHlwZSB9LCB7IC5uYW1lID0gInBlcmlvZCIsIC5kZXNjciA9ICJwZXJpb2QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZywgcGVyaW9kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImRpcmVjdGlvbiIsIC5kZXNjciA9ICJFbmNyeXB0aW9uIGRpcmVjdGlvbjogRG93bnN0cmVhbSBvbmx5IG9yIEJpLWRpcmVjdGlvbmFsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnLCBkaXJlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIiwgLmRlc2NyID0gIktleSBleGNoYW5nZSBjb25maWd1cmF0aW9uIHRoYXQgYXBwbGllcyB0byB0aGUgRVBPTiBsaW5rLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGFzZXJfb25fdGltZSIsIC5kZXNjciA9ICJOdW1iZXIgb2YgdGltZSBxdWFudGEgdG8gYWxsb3cgZm9yIE9OVXMnIGxhc2VyLW9uIHRyYW5zaXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMsIGxhc2VyX29uX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibGFzZXJfb2ZmX3RpbWUiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIHRpbWUgcXVhbnRhIHRvIGFsbG93IGZvciBPTlVzJyBsYXNlci1vZmYgdHJhbnNpdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycywgbGFzZXJfb2ZmX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzIiwgLmRlc2NyID0gIkVQT04gbGFzZXIgb3ZlcmhlYWQgcGFyYW1ldGVycy4gKExhc2VyIE9uIGFuZCBMYXNlciBPZmYgdGltZXMpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfZmFpbHVyZSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgRmFpbHVyZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImludmFsaWRfbXBjcF9yZXBvcnRfcmVjZWl2ZWQiLCAuZGVzY3IgPSAiSW52YWxpZCBNUENQIFJlcG9ydCBSZWNlaXZlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlLCBpbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibXBjcF9yZXBvcnRfdGltZW91dCIsIC5kZXNjciA9ICJNUENQIFJlcG9ydCBUaW1lb3V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUsIG1wY3BfcmVwb3J0X3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVvdXQiLCAuZGVzY3IgPSAiT0FNIEtlZXBhbGl2ZSBUaW1lb3V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUsIG9hbV9rZWVwYWxpdmVfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgYWxsIGFsYXJtcyBvbiBhbiBFUE9OIExpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QgfSwgeyAubmFtZSA9ICJlbmNyeXB0aW9uX2VuYWJsZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9FTkNSWVBUSU9OX0VOQUJMRUQgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX3N0YXJ0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9zdG9wcGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1NUT1BQRUQgfSwgeyAubmFtZSA9ICJsaW5rX2RlbGV0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX0RFTEVURUQgfSwgeyAubmFtZSA9ICJsaW5rX3NwZWVkX21pc21hdGNoIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19TUEVFRF9NSVNNQVRDSCB9LCB7IC5uYW1lID0gIm1wY3BfZGVyZWdpc3RlcmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ERVJFR0lTVEVSRUQgfSwgeyAubmFtZSA9ICJtcGNwX2Rpc2NvdmVyZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RJU0NPVkVSRUQgfSwgeyAubmFtZSA9ICJtcGNwX3JlZ19hY2tfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfUkVHX0FDS19USU1FT1VUIH0sIHsgLm5hbWUgPSAibXBjcF9yZXBvcnRfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQgfSwgeyAubmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQgfSwgeyAubmFtZSA9ICJwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfY2hhbmdlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1JBTkdFX1ZBTFVFX0NIQU5HRUQgfSwgeyAubmFtZSA9ICJyZXJhbmdlX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIHsgLm5hbWUgPSAic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxpbmtfcmF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1JBVEUgfSwgeyAubmFtZSA9ICJzdGF0ZV9mbGFncyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9TVEFURV9GTEFHUyB9LCB7IC5uYW1lID0gImxsaWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCB9LCB7IC5uYW1lID0gImxhc2VyX29uX3RpbWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSB9LCB7IC5uYW1lID0gImxhc2VyX29mZl90aW1lX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09GRl9USU1FX1RRIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfUkFOR0VfVkFMVUVfVFEgfSwgeyAubmFtZSA9ICJkaXN0YW5jZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSB9LCB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFIH0sIHsgLm5hbWUgPSAidHVubmVsX2lkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJtaW5fbGFzZXJfb3ZlcmhlYWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTUlOX0xBU0VSX09WRVJIRUFEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbmZpZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09ORklHIH0sIHsgLm5hbWUgPSAiZXBvbl9lbmNyeXB0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTiB9LCB7IC5uYW1lID0gImZlY19lbmFibGUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSB9LCB7IC5uYW1lID0gIm9hbV9oZWFydGJlYXRfY29uZmlnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09BTV9IRUFSVEJFQVRfQ09ORklHIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fYmFuZHdpZHRoIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSCB9LCB7IC5uYW1lID0gInViZF9pbmZvIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VCRF9JTkZPIH0sIHsgLm5hbWUgPSAiY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfRU5BQkxFIH0sIHsgLm5hbWUgPSAicGVuZGluZ19ncmFudHMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfUEVORElOR19HUkFOVFMgfSwgeyAubmFtZSA9ICJsaW5rX3R5cGUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19UWVBFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGlua19pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2RlbGV0ZV9saW5rIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbml0aWFsX3JhbmdlX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfSU5JVElBTF9SQU5HRV9UUSB9LCB7IC5uYW1lID0gImN1cnJlbnRfcmFuZ2VfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9DVVJSRU5UX1JBTkdFX1RRIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRpc2FibGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAiZW5hYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0ZFQ19TVEFURV9FTkFCTEVEIH0sIHsgLm5hbWUgPSAidXNlX2RlZmF1bHQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfVVNFX0RFRkFVTFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSIsIC5kZXNjciA9ICJlcG9uIGxpbmsgZmVjIHN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZlY19lbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1cHN0cmVhbSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2ZlY19lbiwgdXBzdHJlYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlIH0sIHsgLm5hbWUgPSAiZG93bnN0cmVhbSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuLCBkb3duc3RyZWFtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuIiwgLmRlc2NyID0gIkRvd25zdHJlYW0gYW5kIHVwc3RyZWFtIEZFQyBlbmFibGUgc3RhdGUgZm9yIGFuIEVQT04gbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2ZlY19lbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZmVjX2VuX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZnJhbWUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19GUkFNRV9DQVBUVVJFRF9JRF9GUkFNRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXR1c19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVFVTX05PTkUgfSwgeyAubmFtZSA9ICJkaXNjb3ZlcmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVFVTX0RJU0NPVkVSRUQgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fcHJldmVudGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVFVTX1JFR0lTVFJBVElPTl9QUkVWRU5URUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXR1cyIsIC5kZXNjciA9ICJUaGUgY3VycmVudCByZWdpc3RyYXRpb24gc3RhdHVzIG9mIGEgbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0dXNfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mb19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9NUENQX0RJU0NPVkVSWV9JTkZPX05PTkUgfSwgeyAubmFtZSA9ICJvbmVfZ19jYXBhYmxlIiwgLnZhbCA9IEJDTU9MVF9NUENQX0RJU0NPVkVSWV9JTkZPX09ORV9HX0NBUEFCTEUgfSwgeyAubmFtZSA9ICJ0ZW5fZ19jYXBhYmxlIiwgLnZhbCA9IEJDTU9MVF9NUENQX0RJU0NPVkVSWV9JTkZPX1RFTl9HX0NBUEFCTEUgfSwgeyAubmFtZSA9ICJvbmVfZ193aW5kb3ciLCAudmFsID0gQkNNT0xUX01QQ1BfRElTQ09WRVJZX0lORk9fT05FX0dfV0lORE9XIH0sIHsgLm5hbWUgPSAidGVuX2dfd2luZG93IiwgLnZhbCA9IEJDTU9MVF9NUENQX0RJU0NPVkVSWV9JTkZPX1RFTl9HX1dJTkRPVyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8gPSB7IC5uYW1lID0gImJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvIiwgLmRlc2NyID0gIk1QQ1AgZGlzY292ZXJ5IGluZm8iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm9fc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxpbmtfc3RhdHVzIiwgLmRlc2NyID0gIkxpbmsgc3RhdHVzIGZsYWdzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luZm8sIGxpbmtfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXR1cyB9LCB7IC5uYW1lID0gInJhdGUiLCAuZGVzY3IgPSAiVGhlIHJhdGUgYXQgd2hpY2ggdGhlIGxpbmsgb3BlcmF0ZXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5mbywgcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH0sIHsgLm5hbWUgPSAibGxpZCIsIC5kZXNjciA9ICJUaGUgTExJRCBvZiB0aGUgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmZvLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfSwgeyAubmFtZSA9ICJtcGNwX2Rpc2NvdmVyeV9pbmZvIiwgLmRlc2NyID0gIkZsYWdzIGZyb20gTVBDUCBkaXNjb3ZlcnkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5mbywgbXBjcF9kaXNjb3ZlcnlfaW5mbyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8gfSwgeyAubmFtZSA9ICJvbnVfbGFzZXJfb25fdGltZV90cSIsIC5kZXNjciA9ICJMYXNlciBvbiB0aW1lIHJlcG9ydGVkIGJ5IE9OVS4gIFRoaXMgaXMgc2V0IHRvIDAgZm9yIDFHLzFHIGxpbmtzIGFzIDFHIE1QQ1AgZG9lcyBub3QgaW5jbHVkZSB0aGlzIGZpZWxkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luZm8sIG9udV9sYXNlcl9vbl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm9udV9sYXNlcl9vZmZfdGltZV90cSIsIC5kZXNjciA9ICJMYXNlciBvZmYgdGltZSByZXBvcnRlZCBieSBPTlUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5mbywgb251X2xhc2VyX29mZl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInBlbmRpbmdfZ3JhbnRzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcGVuZGluZyBncmFudHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5mbywgcGVuZGluZ19ncmFudHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJUaGUgbGluaydzIHJhbmdlIHZhbHVlIGluIFRRLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luZm8sIHJhbmdlX3ZhbHVlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInR1bm5lbF9pZCIsIC5kZXNjciA9ICJUaGUgdHVubmVsIElEIHRvIHVzZSB3aGVuIHNlbmRpbmcgdHJhZmZpYyB0byB0aGUgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmZvLCB0dW5uZWxfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2luZm8iLCAuZGVzY3IgPSAiRVBPTiBsb2dpY2FsIGxpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19pbmZvKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmcmFtZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRV9JRF9GUkFNRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19pbmplY3RfZnJhbWUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBlcmlvZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9QRVJJT0QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3AgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkkgfSwgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19saW5rX2RlbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwcmV2aW91c19yYXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFIH0sIHsgLm5hbWUgPSAiY3VycmVudF9yYXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9DVVJSRU5UX1JBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxpbmtfaW5mbyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfRElTQ09WRVJFRF9JRF9MSU5LX0lORk8gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VuZF9wZXJpb2QiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX1NFTkRfUEVSSU9EIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsaW5rX2luZm8iLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURURfSURfTElOS19JTkZPIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9SQU5HRV9WQUxVRV9UUSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19SQU5HRV9WQUxVRV9DSEFOR0VEX0lEX1JBTkdFX1ZBTFVFX1RRIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyeF9kYXRhX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTIH0sIHsgLm5hbWUgPSAicnhfZGF0YV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzY0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjQgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfNjVfMTI3IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzEyOF8yNTUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzI1Nl81MTEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExIH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzUxMl8xMDIzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjMgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMTAyNF8xNTE4IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzE1MTlfMjA0NyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NyB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18yMDQ4XzQwOTUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfNDA5Nl85MjE2IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzkyMTdfMTYzODMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzIH0sIHsgLm5hbWUgPSAicnhfb2FtX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fQllURVMgfSwgeyAubmFtZSA9ICJyeF9vYW1fZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfbXBjcF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01QQ1BfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfYnJvYWRjYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X3VuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X211bHRpY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9yZXBvcnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfZmNzX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9vdmVyc2l6ZV9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9ydW50X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfbGluZV9jb2RlX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3JfbWF4IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYIH0sIHsgLm5hbWUgPSAidHhfZGF0YV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUyB9LCB7IC5uYW1lID0gInR4X2RhdGFfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gInR4X29hbV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTIH0sIHsgLm5hbWUgPSAidHhfb2FtX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X21wY3BfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NUENQX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2Jyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF91bmljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9tdWx0aWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfZ2F0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFURV9GTEFHU19OT05FIH0sIHsgLm5hbWUgPSAibXBjcF9yZWdpc3RyYXRpb25fY29tcGxldGUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFURV9GTEFHU19NUENQX1JFR0lTVFJBVElPTl9DT01QTEVURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncyIsIC5kZXNjciA9ICJFUE9OIGxpbmsgc3RhdGUgZmxhZ3MgcmVmbGVjdCB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGxpbmsuICIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3Nfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibGFzZXJvbl90aW1lX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9OX1RJTUVfVFEgfSwgeyAubmFtZSA9ICJsYXNlcm9mZl90aW1lX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9GRl9USU1FX1RRIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1JBTkdFX1ZBTFVFX1RRIH0sIHsgLm5hbWUgPSAicGVuZGluZ19ncmFudHMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3lzdGVtIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfVFlQRV9TWVNURU0gfSwgeyAubmFtZSA9ICJkb3duc3RyZWFtX29ubHkiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19UWVBFX0RPV05TVFJFQU1fT05MWSB9LCB7IC5uYW1lID0gImJpZGlyZWN0aW9uYWwiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19UWVBFX0JJRElSRUNUSU9OQUwgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua190eXBlIiwgLmRlc2NyID0gIkVQT04gTGluayBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua190eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua190eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X21wY3BfZ2F0ZV9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRla25vdnVzIiwgLnZhbCA9IEJDTU9MVF9NUENQX0dBVEVfTU9ERV9URUtOT1ZVUyB9LCB7IC5uYW1lID0gImN1c3RvbSIsIC52YWwgPSBCQ01PTFRfTVBDUF9HQVRFX01PREVfQ1VTVE9NIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbXBjcF9nYXRlX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9tcGNwX2dhdGVfbW9kZSIsIC5kZXNjciA9ICJNUENQIGdhdGUgbW9kZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbXBjcF9nYXRlX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbXBjcF9nYXRlX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFnc19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9NUENQX1JFR0lTVFJBVElPTl9HQVRFX0ZMQUdTX05PTkUgfSwgeyAubmFtZSA9ICJmb3JjZV9yZXBvcnQiLCAudmFsID0gQkNNT0xUX01QQ1BfUkVHSVNUUkFUSU9OX0dBVEVfRkxBR1NfRk9SQ0VfUkVQT1JUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFncyA9IHsgLm5hbWUgPSAiYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MiLCAuZGVzY3IgPSAiTVBDUCByZWdpc3RyYXRpb24gZ2F0ZSBmbGFncy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFncyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3Nfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmbGFncyIsIC5kZXNjciA9ICJGbGFncyB0byBzZXQgZm9yIHRoaXMgZ2F0ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dhdGVfcGFyYW1ldGVycywgZmxhZ3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzIH0sIHsgLm5hbWUgPSAiZGVsYXlfYmVmb3JlX21zIiwgLmRlc2NyID0gIkRlbGF5IGJlZm9yZSBzZW5kaW5nIHRoaXMgZ2F0ZSBpbiBtaWxsaXNlY29uZHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMsIGRlbGF5X2JlZm9yZV9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJnYXRlX3NpemVfdHEiLCAuZGVzY3IgPSAiU2l6ZSBvZiB0aGlzIGdhdGUgaW4gdGltZSBxdWFudGEuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMsIGdhdGVfc2l6ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9nYXRlX3BhcmFtZXRlcnMgPSB7IC5uYW1lID0gImJjbW9sdF9nYXRlX3BhcmFtZXRlcnMiLCAuZGVzY3IgPSAiR2F0ZSBwYXJhbWV0ZXJzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBnYXRlX3BhcmFtZXRlcnMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dhdGVfcGFyYW1ldGVycywgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMpIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9nYXRlX21vZGUiLCAuZGVzY3IgPSAiTVBDUCByZWdpc3RyYXRpb24gZ2F0ZSBtb2RlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCByZWdpc3RyYXRpb25fZ2F0ZV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbXBjcF9nYXRlX21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3Rla25vdnVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlZ19hY2tfdGltZW91dF9tcyIsIC5kZXNjciA9ICJBbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBhIGxpbmsgdG8gcmVzcG9uZCB3aXRoIGEgcmVnaXN0ZXIgYWNrIGFmdGVyIGEgcmVnaXN0ZXIgaXMgc2VudC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSwgdS50ZWtub3Z1cy5yZWdfYWNrX3RpbWVvdXRfbXMpIC0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSwgdS50ZWtub3Z1cy5yZWdfYWNrX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3Rla25vdnVzID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3Rla25vdnVzIiwgLmRlc2NyID0gIkVQT04gcmVnaXN0cmF0aW9uIGdhdGUgbW9kZSBUZWtub3Z1cyIsIC5zaXplID0gc2l6ZW9mKCgoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSAqKTApLT51LnRla25vdnVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV90ZWtub3Z1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfdGVrbm92dXNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2N1c3RvbV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJnYXRlcyIsIC5kZXNjciA9ICJHYXRlcyB0byBzZW5kIGZvciBSRUcgQUNLLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCB1LmN1c3RvbS5nYXRlcykgLSBvZmZzZXRvZihiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCB1LmN1c3RvbS5nYXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9jdXN0b20gPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfY3VzdG9tIiwgLmRlc2NyID0gIkVQT04gcmVnaXN0cmF0aW9uIGdhdGUgbW9kZSBDdXN0b20iLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgKikwKS0+dS5jdXN0b20pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2N1c3RvbV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfY3VzdG9tX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV91bmlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1LnRla25vdnVzIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCB1LnRla25vdnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3Rla25vdnVzIH0sIHsgLm5hbWUgPSAidS5jdXN0b20iLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUsIHUuY3VzdG9tKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2N1c3RvbSB9LCB7IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIiwgLmRlc2NyID0gIlNwZWNpZmljYXRpb24gb2YgdGhlIEVQT04gZ2F0ZSBtb2RlIGFuZCBhc3NvY2lhdGVkIHBhcmFtZXRlcnMuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OLCAueCA9IHsgLnUgPSB7IC5udW1fY29tbW9uX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuY29tbW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9maWVsZHMsIC5jbGFzc2lmaWVyX2lkeCA9IDAsIC51bmlvbl9maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfdW5pb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIiwgLmRlc2NyID0gIkVQT04gcmVnaXN0cmF0aW9uIGdhdGUgbW9kZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMsIHJlZ2lzdHJhdGlvbl9nYXRlX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgfSwgeyAubmFtZSA9ICJyZXBvcnRpbmdfbW9kZSIsIC5kZXNjciA9ICJDb250cm9sIGZvciBob3cgdGhlIERCQSBoYW5kbGVzIHJlY2VpdmVkIE1QQ1AgcmVwb3J0IGZyYW1lcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMsIHJlcG9ydGluZ19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUgfSwgeyAubmFtZSA9ICJtYXhfbGlua3MiLCAuZGVzY3IgPSAiTWF4aW11bSBudW1iZXIgb2YgbGlua3MgdG8gcmVnaXN0ZXIgb24gdGhlIEVQT04gTkkuICBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIG5vIGZpeGVkIGxpbWl0LiBUaGlzIGlzIGFuIGFnZ3JlZ2F0ZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIG5vbi1zeXN0ZW0gbGlua3Mgb24gYSBQT04uIFRoaXMgbGltaXQgYXBwbGllcyB0byBib3RoIHJlZ2lzdGVyZWQgYW5kIG5vbi1yZWdpc3RlcmVkIGxpbmtzLiBUaGlzIHZhbHVlIGNhbm5vdCBiZSByZWR1Y2VkIGJlbG93IHRoZSBjb3VudCBvZiBsaW5rcyBjdXJyZW50bHkgYWxsb2NhdGVkLCBub3IgaXMgaXQgdmFsaWQgdG8gaW5jcmVhc2UgaXQgYWJvdmUgdGhlIHN1bSBvZiB0aGUgcGVyIFJQIG1hY19saW5rcyBsaW1pdHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLCBtYXhfbGlua3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMiLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiByZWxhdGVkIHRvIEVQT04gbG9naWNhbCBsaW5rIHJlZ2lzdHJhdGlvbiBhbmQgcmVwb3J0aW5nLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MgfSwgeyAubmFtZSA9ICJyYXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX1JBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2FkZF9saW5rIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAicmF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BRERfTVVMVElDQVNUX0xJTktfSURfUkFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmsgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfTUFDX0FERFJFU1MgfSwgeyAubmFtZSA9ICJ3b3JraW5nX2xpbmtfaW5mbyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9XT1JLSU5HX0xJTktfSU5GTyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmsgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJub19yZXBvcnRzIiwgLmRlc2NyID0gIk5vIFJlcG9ydHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUsIG5vX3JlcG9ydHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgbGlzdCBvZiBhbGFybXMgZGVmaW5lZCBmb3IgYW4gRVBPTiBOSSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZV9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRSB9LCB7IC5uYW1lID0gImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFIH0sIHsgLm5hbWUgPSAibGxpZF9xdWFyYW50aW5lZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9MTElEX1FVQVJBTlRJTkVEIH0sIHsgLm5hbWUgPSAibXBjcF90aW1lc3RhbXBfY2hhbmdlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VEIH0sIHsgLm5hbWUgPSAibm9fcmVwb3J0cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfY29tcGxldGUiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUgfSwgeyAubmFtZSA9ICJyZXJhbmdlX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFIH0sIHsgLm5hbWUgPSAicm9ndWVfc2Nhbl9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFIH0sIHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAiZXBvbl9uaV9lbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTiB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9iZWhhdmlvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SIH0sIHsgLm5hbWUgPSAibXR1XzFnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcgfSwgeyAubmFtZSA9ICJtdHVfMTBnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMTBHIH0sIHsgLm5hbWUgPSAibWluaW11bV9maWJlcl9sZW5ndGgiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01JTklNVU1fRklCRVJfTEVOR1RIIH0sIHsgLm5hbWUgPSAibWF4aW11bV9maWJlcl9sZW5ndGgiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BWElNVU1fRklCRVJfTEVOR1RIIH0sIHsgLm5hbWUgPSAiZ3JhbnRfc3BhY2luZ190cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSB9LCB7IC5uYW1lID0gImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMgfSwgeyAubmFtZSA9ICJtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01QQ1BfRElTQ09WRVJZX1BFUklPRF9NUyB9LCB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURSB9LCB7IC5uYW1lID0gImFsbF9saW5rcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxMX0xJTktTIH0sIHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9jZmciLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VOQ1JZUFRJT05fQ0ZHIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcgfSwgeyAubmFtZSA9ICJjbG9ja190cmFuc3BvcnRfY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfQ0ZHIH0sIHsgLm5hbWUgPSAiZHJvcGRvd25fd2VpZ2h0cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRFJPUERPV05fV0VJR0hUUyB9LCB7IC5uYW1lID0gImFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVBQUk9YSU1BVEVfU09MSUNJVEVEX1VTQUdFIH0sIHsgLm5hbWUgPSAiYXBwcm94aW1hdGVfdGRtX3VzYWdlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UgfSwgeyAubmFtZSA9ICJub19yZXBvcnRzX3NvYWtfdGltZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUgfSwgeyAubmFtZSA9ICJwb25fYWdncmVnYXRlX3NoYXBlciIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUE9OX0FHR1JFR0FURV9TSEFQRVIgfSwgeyAubmFtZSA9ICJlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUSB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX3BhcmFtcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TIH0sIHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4gfSwgeyAubmFtZSA9ICJhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMUdfRU4gfSwgeyAubmFtZSA9ICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfVEhSRVNIT0xEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9ESVNBQkxFRCB9LCB7IC5uYW1lID0gImVuYWJsZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRU5BQkxFRCB9LCB7IC5uYW1lID0gInByb3RlY3RlZF93b3JraW5nIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HIH0sIHsgLm5hbWUgPSAicHJvdGVjdGVkX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPVEVDVEVEX1NUQU5EQlkgfSwgeyAubmFtZSA9ICJwcm9jZXNzaW5nIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST0NFU1NJTkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSIsIC5kZXNjciA9ICJFbmFibGUgc3RhdGUgb2YgdGhlIEVQT04gTkkuICBJbml0aWFsbHkgdGhlIG9ubHkgZW5hYmxlIHN0YXRlcyBkZWZpbmVkIGFyZSBgZGlzYWJsZWQnIGFuZCBgZW5hYmxlZCcsIGJ1dCB0aGlzIG1heSBsYXRlciBiZSBleHRlbmRlZCB0byBpbmNsdWRlIGRpZmZlcmVudCBkZWdyZWVzIG9mIGVuYWJsZW1lbnQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIsIC5kZXNjciA9ICJEb3duc3RyZWFtIGVuY3J5cHRpb24gbW9kZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9lbmNyeXB0aW9uX21vZGUiLCAuZGVzY3IgPSAiVXBzdHJlYW0gZW5jcnlwdGlvbiBtb2RlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZywgdXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyIsIC5kZXNjciA9ICJFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gdGhhdCBhcHBsaWVzIHRvIHRoZSBFUE9OIE5JIGFzIGEgd2hvbGUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdyYW50ZWRfbGluayIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSyB9LCB7IC5uYW1lID0gInRyaWdnZXJfd2lkdGgiLCAudmFsID0gQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX1dJRFRIIH0sIHsgLm5hbWUgPSAidHJpZ2dlcl9kZWxheSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVkgfSwgeyAubmFtZSA9ICJzYW1wbGVfcGVyaW9kIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfU0FNUExFX1BFUklPRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsbGlkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTExJRCB9LCB7IC5uYW1lID0gImxpbmtfcmF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfUkFURSB9LCB7IC5uYW1lID0gImxpbmtfbWFjIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMgfSwgeyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX1JBTkdFX1ZBTFVFX1RRIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfbGxpZF9xdWFyYW50aW5lZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibXBjcF90aW1lc3RhbXAiLCAudmFsID0gQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9NUENQX1RJTUVTVEFNUCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX25vX3JlcG9ydHMgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlcmFuZ2VfZGVsdGEiLCAudmFsID0gQkNNT0xUX0VQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQV9JRF9SRVJBTkdFX0RFTFRBIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcmVyYW5nZV9mYWlsdXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtb2RlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFIH0sIHsgLm5hbWUgPSAibGxpZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTExJRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW4gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXR1cm5faW5kX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFX0lEX1JFVFVSTl9JTkRfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJsbGlkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQgfSwgeyAubmFtZSA9ICJsaW5rX21hYyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MSU5LX01BQyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsaXN0X29mX29udV9pZHMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9SRVNFUlZFRCB9LCB7IC5uYW1lID0gImJyb2FkY29tIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9CUk9BRENPTSB9LCB7IC5uYW1lID0gImN0YyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQ1RDIH0sIHsgLm5hbWUgPSAiZGFzYW4iLCAudmFsID0gQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RBU0FOIH0sIHsgLm5hbWUgPSAia3QiLCAudmFsID0gQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0tUIH0sIHsgLm5hbWUgPSAiZHBvZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfRFBPRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUiLCAuZGVzY3IgPSAiRVBPTiBPQU0gRXh0ZW5zaW9uIFR5cGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxsX2xpbmtzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX0FMTF9MSU5LUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xMGdfdXNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmZWNfY29kZV93b3Jkc190b3RhbCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUwgfSwgeyAubmFtZSA9ICJmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX0RFQ09ERV9GQUlMUyB9LCB7IC5uYW1lID0gImZlY196ZXJvZXNfY29ycmVjdGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfWkVST0VTX0NPUlJFQ1RFRCB9LCB7IC5uYW1lID0gImZlY19vbmVzX2NvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xMGdfdXNfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzFnX3VzX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxsX2xpbmtzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19DRkdfSURfQUxMX0xJTktTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzFnX3VzX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkkgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xZ191c19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJnb29kX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUyB9LCB7IC5uYW1lID0gImdvb2RfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9CWVRFUyB9LCB7IC5uYW1lID0gIm92ZXJzel9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfT1ZFUlNaX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm5vbl9mZWNfZ29vZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfTk9OX0ZFQ19HT09EX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm5vbl9mZWNfZ29vZF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfQllURVMgfSwgeyAubmFtZSA9ICJmZWNfZ29vZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZmVjX2dvb2RfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMgfSwgeyAubmFtZSA9ICJmZWNfZnJhbWVzX2V4Y19lcnJzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlMgfSwgeyAubmFtZSA9ICJmZWNfYmxrc19ub19lcnJzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX05PX0VSUlMgfSwgeyAubmFtZSA9ICJmZWNfYmxrc19jb3JyX2VycnMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfQ09SUl9FUlJTIH0sIHsgLm5hbWUgPSAiZmVjX2Jsa3NfdW5jb3JyX2VycnMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlMgfSwgeyAubmFtZSA9ICJmZWNfY29ycl9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9CWVRFUyB9LCB7IC5uYW1lID0gImZlY19jb3JyX3plcm9lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVMgfSwgeyAubmFtZSA9ICJmZWNfY29ycl9vbmVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVMgfSwgeyAubmFtZSA9ICJ1bmRlcnN6X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9VTkRFUlNaX0ZSQU1FUyB9LCB7IC5uYW1lID0gImVycm9yc3pfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib2siLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfT0sgfSwgeyAubmFtZSA9ICJ1bmRlZmluZWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfVU5ERUZJTkVEIH0sIHsgLm5hbWUgPSAibm90X2ZvdW5kIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX05PVF9GT1VORCB9LCB7IC5uYW1lID0gIm5vX2FjY2VzcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9OT19BQ0NFU1MgfSwgeyAubmFtZSA9ICJmdWxsIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0ZVTEwgfSwgeyAubmFtZSA9ICJpbGxlZ2FsX29wZXJhdGlvbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9JTExFR0FMX09QRVJBVElPTiB9LCB7IC5uYW1lID0gInVua25vd25faWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfVU5LTk9XTl9JRCB9LCB7IC5uYW1lID0gImJhZF9ibG9jayIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9CQURfQkxPQ0sgfSwgeyAubmFtZSA9ICJ0aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJidXN5IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0JVU1kgfSwgeyAubmFtZSA9ICJpbmNvbXBhdGlibGVfZmlsZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9JTkNPTVBBVElCTEVfRklMRSB9LCB7IC5uYW1lID0gImNvcnJ1cHRlZF9maWxlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0NPUlJVUFRFRF9GSUxFIH0sIHsgLm5hbWUgPSAiZXJyb3Jfbm90X2RlZmluZWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRVJST1JfTk9UX0RFRklORUQgfSwgeyAubmFtZSA9ICJlcnJvcl9hbGxvY19leGNlZWRlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FUlJPUl9BTExPQ19FWENFRURFRCB9LCB7IC5uYW1lID0gImVycm9yX2lsbGVnYWxfb3AiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRVJST1JfSUxMRUdBTF9PUCB9LCB7IC5uYW1lID0gImVycm9yX2ZpbGVfZXhpc3RzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VSUk9SX0ZJTEVfRVhJU1RTIH0sIHsgLm5hbWUgPSAiZW5kX3dyaXRpbmdfbnZzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VORF9XUklUSU5HX05WUyB9LCB7IC5uYW1lID0gImVuZF9jcmNfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX0NSQ19FUlJPUiB9LCB7IC5uYW1lID0gImVuZF9wYXJhbV9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FTkRfUEFSQU1fRVJST1IgfSwgeyAubmFtZSA9ICJlbmRfY21kX3Vuc3VwcG9ydGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VORF9DTURfVU5TVVBQT1JURUQgfSwgeyAubmFtZSA9ICJsYXN0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0xBU1QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZSIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIE9OVSBSZXNwb25zZSBDb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib2FtX2V4dGVuc2lvbl90eXBlIiwgLmRlc2NyID0gIk9BTSBFeHRlbnNpb24gVHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIG9hbV9leHRlbnNpb25fdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Jyb2FkY29tX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3BvbnNlX3RpbWVvdXRfbXMiLCAuZGVzY3IgPSAiVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmJyb2FkY29tLnJlc3BvbnNlX3RpbWVvdXRfbXMpIC0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmJyb2FkY29tLnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfYnJvYWRjb20gPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19icm9hZGNvbSIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIFBhcmFtZXRlcnMgQnJvYWRjb20iLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqKTApLT51LmJyb2FkY29tKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Jyb2FkY29tX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Jyb2FkY29tX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2N0Y19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNwb25zZV90aW1lb3V0X21zIiwgLmRlc2NyID0gIlRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBPTFQgd2lsbCB3YWl0IGZvciB0aGUgT05VIHRvIHJlc3BvbmQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5jdGMucmVzcG9uc2VfdGltZW91dF9tcykgLSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuY3RjLnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfY3RjID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfY3RjIiwgLmRlc2NyID0gIkVQT04gT05VIFVwZ3JhZGUgUGFyYW1ldGVycyBDVEMiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqKTApLT51LmN0YyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19jdGNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfY3RjX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rhc2FuX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3BvbnNlX3RpbWVvdXRfbXMiLCAuZGVzY3IgPSAiVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmRhc2FuLnJlc3BvbnNlX3RpbWVvdXRfbXMpIC0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmRhc2FuLnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZGFzYW4gPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19kYXNhbiIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIFBhcmFtZXRlcnMgRGFzYW4iLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqKTApLT51LmRhc2FuKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rhc2FuX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rhc2FuX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2t0X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3BvbnNlX3RpbWVvdXRfbXMiLCAuZGVzY3IgPSAiVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1Lmt0LnJlc3BvbnNlX3RpbWVvdXRfbXMpIC0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1Lmt0LnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfa3QgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19rdCIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIFBhcmFtZXRlcnMgS1QiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqKTApLT51Lmt0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2t0X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2t0X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rwb2VfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzcG9uc2VfdGltZW91dF9tcyIsIC5kZXNjciA9ICJUaGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCB0aGUgT0xUIHdpbGwgd2FpdCBmb3IgdGhlIE9OVSB0byByZXNwb25kLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuZHBvZS5yZXNwb25zZV90aW1lb3V0X21zKSAtIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kcG9lLnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYmxvY2tfc2l6ZSIsIC5kZXNjciA9ICJOdW1iZXIgb2YgYnl0ZSBwZXIgZGF0YSBibG9jay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmRwb2UuYmxvY2tfc2l6ZSkgLSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuZHBvZS5yZXNwb25zZV90aW1lb3V0X21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0IiwgLmRlc2NyID0gIlRpbWVvdXQgZm9yIHRoZSBmaW5hbCBBQ0sgcmVzcG9uc2UuICBUaGUgRFBvRSBzdGFuZGFyZCAxLjAgc3BlY2lmaWVzIHRoaXMgc2hvdWxkIGJlIGF0IGxlYXN0IDE1IHNlY29uZHMuICBVbml0IGlzIHNlY29uZHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kcG9lLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0KSAtIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kcG9lLnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZHBvZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rwb2UiLCAuZGVzY3IgPSAiRVBPTiBPTlUgVXBncmFkZSBQYXJhbWV0ZXJzIERQb0UiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqKTApLT51LmRwb2UpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZHBvZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19kcG9lX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX3VuaW9uX2ZpZWxkc1tdID0geyB7IH0sIHsgLm5hbWUgPSAidS5icm9hZGNvbSIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmJyb2FkY29tKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfYnJvYWRjb20gfSwgeyAubmFtZSA9ICJ1LmN0YyIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmN0YyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2N0YyB9LCB7IC5uYW1lID0gInUuZGFzYW4iLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kYXNhbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rhc2FuIH0sIHsgLm5hbWUgPSAidS5rdCIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1Lmt0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfa3QgfSwgeyAubmFtZSA9ICJ1LmRwb2UiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kcG9lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZHBvZSB9LCB7IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIFBhcmFtZXRlcnMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTiwgLnggPSB7IC51ID0geyAubnVtX2NvbW1vbl9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuY29tbW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2ZpZWxkcywgLmNsYXNzaWZpZXJfaWR4ID0gMCwgLnVuaW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX3VuaW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdWNjZXNzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1NVQ0NFU1MgfSwgeyAubmFtZSA9ICJvbnVfcmVzcG9uc2VfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9PTlVfUkVTUE9OU0VfVElNRU9VVCB9LCB7IC5uYW1lID0gIm9udV9lcnJvcl9yZXNwb25zZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9PTlVfRVJST1JfUkVTUE9OU0UgfSwgeyAubmFtZSA9ICJzeW5jX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1NZTkNfRVJST1IgfSwgeyAubmFtZSA9ICJjb21taXRfZmFpbGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX0NPTU1JVF9GQUlMRUQgfSwgeyAubmFtZSA9ICJpbnRlcm5hbCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9JTlRFUk5BTCB9LCB7IC5uYW1lID0gInBhcnNlX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1BBUlNFX0VSUk9SIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUiLCAuZGVzY3IgPSAiRVBPTiBPTlUgVXBncmFkZSBSZXR1cm4gQ29kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAiZXJyb3JfY29kZSIsIC5kZXNjciA9ICJVcGdyYWRlIHN0YXR1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzLCBlcnJvcl9jb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSB9LCB7IC5uYW1lID0gIm9udV9yZXR1cm5fY29kZSIsIC5kZXNjciA9ICJSZXNwb25zZSBjb2RlIGZyb20gdGhlIE9OVS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzLCBvbnVfcmV0dXJuX2NvZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIFN0YXR1cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMpIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmZWNfc3RhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX0ZFQ19TVEFURSB9LCB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ19kc19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfZHNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JZVEVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJvYW1fYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVMgfSwgeyAubmFtZSA9ICJvYW1fZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUyB9LCB7IC5uYW1lID0gImdhdGVfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMgfSwgeyAubmFtZSA9ICJtcGNwX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTIH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfZHNfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmZWNfc3RhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX0ZFQ19TVEFURSB9LCB7IC5uYW1lID0gInN5bmNfdGltZV90cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfU1lOQ19USU1FX1RRIH0sIHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9QUkJTX0NIRUNLRVIgfSwgeyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfdXNfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX3VzX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUyB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NCB9LCB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEgfSwgeyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMgfSwgeyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTIH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9CWVRFUyB9LCB7IC5uYW1lID0gIm9hbV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTIH0sIHsgLm5hbWUgPSAicmVwb3J0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJmY3NfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GQ1NfRVJST1IgfSwgeyAubmFtZSA9ICJjcmNfOF9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0NSQ184X0VSUk9SIH0sIHsgLm5hbWUgPSAib3V0X29mX3Nsb3QiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVCB9LCB7IC5uYW1lID0gIm92ZXJzaXplX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IgfSwgeyAubmFtZSA9ICJydW50X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX3VzX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGVmYXVsdF9mZWNfc3RhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUgfSwgeyAubmFtZSA9ICJyYW1hbl9tb2RlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1JBTUFOX01PREUgfSwgeyAubmFtZSA9ICJ0dXJib18yZ19tb2RlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1RVUkJPXzJHX01PREUgfSwgeyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUyB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjQgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NyB9LCB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzIH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0RBVEFfQllURVMgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVMgfSwgeyAubmFtZSA9ICJvYW1fZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTIH0sIHsgLm5hbWUgPSAiZ2F0ZV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTIH0sIHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTIH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkZWZhdWx0X2ZlY19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSB9LCB7IC5uYW1lID0gInN5bmNfdGltZV90cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEgfSwgeyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19DSEVDS0VSIH0sIHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ191c19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQllURVMgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTIH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm1wY3BfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0JZVEVTIH0sIHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJlcG9ydF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZjc19lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SIH0sIHsgLm5hbWUgPSAiY3JjXzhfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0NSQ184X0VSUk9SIH0sIHsgLm5hbWUgPSAib3V0X29mX3Nsb3QiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09VVF9PRl9TTE9UIH0sIHsgLm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SIH0sIHsgLm5hbWUgPSAicnVudF9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUlVOVF9FUlJPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ1bnByb3RlY3RlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX1VOUFJPVEVDVEVEIH0sIHsgLm5hbWUgPSAicHJvdGVjdGVkX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TVEFURV9QUk9URUNURURfU1RBTkRCWSB9LCB7IC5uYW1lID0gInByb3RlY3RlZF93b3JraW5nIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1RBVEVfUFJPVEVDVEVEX1dPUktJTkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUiLCAuZGVzY3IgPSAiSW5kaWNhdGVzIHdoZXRoZXIgbGlua3MgYXJlIHVucHJvdGVjdGVkLCBwcm90ZWN0ZWQgc3RhbmRieSwgb3IgcHJvdGVjdGVkIHdvcmtpbmcuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vX3Byb3RlY3Rpb25fc3d0aWNoaW5nIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfTk9fUFJPVEVDVElPTl9TV1RJQ0hJTkcgfSwgeyAubmFtZSA9ICJsaW5lX2NhcmRfcHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAudmFsID0gQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9MSU5FX0NBUkRfUFJPVEVDVElPTl9TV0lUQ0hJTkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUiLCAuZGVzY3IgPSAiRVBPTiBQcm90ZWN0aW9uIFN3aXRjaGluZyBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVURUNUSU9OX09QVElPTlNfTk9ORSB9LCB7IC5uYW1lID0gInN0YW5kYnlfbG9zX2RldGVjdGlvbiIsIC52YWwgPSBCQ01PTFRfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVURUNUSU9OX09QVElPTlNfU1RBTkRCWV9MT1NfREVURUNUSU9OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMgPSB7IC5uYW1lID0gImJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIFN3aXRjaGluZyBEZXRlY3Rpb24gT3B0aW9ucyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVyYW5nZV9ub25lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1JFUkFOR0lOR19PUFRJT05TX1JFUkFOR0VfTk9ORSB9LCB7IC5uYW1lID0gInJlcmFuZ2Vfc2luZ2xlX2xvZ2ljYWxfbGluayIsIC52YWwgPSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NXSVRDSElOR19SRVJBTkdJTkdfT1BUSU9OU19SRVJBTkdFX1NJTkdMRV9MT0dJQ0FMX0xJTksgfSwgeyAubmFtZSA9ICJyZXJhbmdlX2FsbF9sb2dpY2FsX2xpbmtzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1JFUkFOR0lOR19PUFRJT05TX1JFUkFOR0VfQUxMX0xPR0lDQUxfTElOS1MgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9ucyIsIC5kZXNjciA9ICJDcml0ZXJpYSBmb3IgbG9naWNhbCBsaW5rIHNlbGVjdGlvbiBkdXJpbmcgcmUtcmFuZ2luZyBwcm9jZXNzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9uc19zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncGlvX3Bpbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwaW4wIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4wIH0sIHsgLm5hbWUgPSAicGluMSIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOMSB9LCB7IC5uYW1lID0gInBpbjIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjIgfSwgeyAubmFtZSA9ICJwaW4zIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zIH0sIHsgLm5hbWUgPSAicGluNCIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElONCB9LCB7IC5uYW1lID0gInBpbjUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjUgfSwgeyAubmFtZSA9ICJwaW42IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42IH0sIHsgLm5hbWUgPSAicGluNyIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElONyB9LCB7IC5uYW1lID0gInBpbjgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjggfSwgeyAubmFtZSA9ICJwaW45IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45IH0sIHsgLm5hbWUgPSAicGluMTAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEwIH0sIHsgLm5hbWUgPSAicGluMTEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjExIH0sIHsgLm5hbWUgPSAicGluMTIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEyIH0sIHsgLm5hbWUgPSAicGluMTMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEzIH0sIHsgLm5hbWUgPSAicGluMTQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE0IH0sIHsgLm5hbWUgPSAicGluMTUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE1IH0sIHsgLm5hbWUgPSAicGluMTYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE2IH0sIHsgLm5hbWUgPSAicGluMTciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE3IH0sIHsgLm5hbWUgPSAicGluMTgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE4IH0sIHsgLm5hbWUgPSAicGluMTkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE5IH0sIHsgLm5hbWUgPSAicGluMjAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjIwIH0sIHsgLm5hbWUgPSAicGluMjEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjIxIH0sIHsgLm5hbWUgPSAicGluMjIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjIyIH0sIHsgLm5hbWUgPSAicGluMjMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjIzIH0sIHsgLm5hbWUgPSAicGluMjQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI0IH0sIHsgLm5hbWUgPSAicGluMjUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI1IH0sIHsgLm5hbWUgPSAicGluMjYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI2IH0sIHsgLm5hbWUgPSAicGluMjciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI3IH0sIHsgLm5hbWUgPSAicGluMjgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI4IH0sIHsgLm5hbWUgPSAicGluMjkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI5IH0sIHsgLm5hbWUgPSAicGluMzAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjMwIH0sIHsgLm5hbWUgPSAicGluMzEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjMxIH0sIHsgLm5hbWUgPSAicGluMzIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjMyIH0sIHsgLm5hbWUgPSAicGluMzMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjMzIH0sIHsgLm5hbWUgPSAicGluMzQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM0IH0sIHsgLm5hbWUgPSAicGluMzUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM1IH0sIHsgLm5hbWUgPSAicGluMzYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM2IH0sIHsgLm5hbWUgPSAicGluMzciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM3IH0sIHsgLm5hbWUgPSAicGluMzgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM4IH0sIHsgLm5hbWUgPSAicGluMzkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM5IH0sIHsgLm5hbWUgPSAicGluNDAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQwIH0sIHsgLm5hbWUgPSAicGluNDEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQxIH0sIHsgLm5hbWUgPSAicGluNDIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQyIH0sIHsgLm5hbWUgPSAicGluNDMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQzIH0sIHsgLm5hbWUgPSAicGluNDQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ0IH0sIHsgLm5hbWUgPSAicGluNDUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ1IH0sIHsgLm5hbWUgPSAicGluNDYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ2IH0sIHsgLm5hbWUgPSAicGluNDciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ3IH0sIHsgLm5hbWUgPSAicGluNDgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ4IH0sIHsgLm5hbWUgPSAicGluNDkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ5IH0sIHsgLm5hbWUgPSAicGluNTAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjUwIH0sIHsgLm5hbWUgPSAicGluNTEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjUxIH0sIHsgLm5hbWUgPSAicGluNTIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjUyIH0sIHsgLm5hbWUgPSAicGluNTMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjUzIH0sIHsgLm5hbWUgPSAicGluNTQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU0IH0sIHsgLm5hbWUgPSAicGluNTUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU1IH0sIHsgLm5hbWUgPSAicGluNTYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU2IH0sIHsgLm5hbWUgPSAicGluNTciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU3IH0sIHsgLm5hbWUgPSAicGluNTgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU4IH0sIHsgLm5hbWUgPSAicGluNTkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU5IH0sIHsgLm5hbWUgPSAicGluNjAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjYwIH0sIHsgLm5hbWUgPSAicGluNjEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjYxIH0sIHsgLm5hbWUgPSAicGluNjIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjYyIH0sIHsgLm5hbWUgPSAicGluNjMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjYzIH0sIHsgLm5hbWUgPSAicGluNjQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY0IH0sIHsgLm5hbWUgPSAicGluNjUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY1IH0sIHsgLm5hbWUgPSAicGluNjYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY2IH0sIHsgLm5hbWUgPSAicGluNjciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY3IH0sIHsgLm5hbWUgPSAicGluNjgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY4IH0sIHsgLm5hbWUgPSAicGluNjkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY5IH0sIHsgLm5hbWUgPSAicGluNzAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjcwIH0sIHsgLm5hbWUgPSAicGluNzEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjcxIH0sIHsgLm5hbWUgPSAicGluNzIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjcyIH0sIHsgLm5hbWUgPSAicGluNzMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjczIH0sIHsgLm5hbWUgPSAicGluNzQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc0IH0sIHsgLm5hbWUgPSAicGluNzUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc1IH0sIHsgLm5hbWUgPSAicGluNzYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc2IH0sIHsgLm5hbWUgPSAicGluNzciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc3IH0sIHsgLm5hbWUgPSAicGluNzgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc4IH0sIHsgLm5hbWUgPSAicGluNzkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc5IH0sIHsgLm5hbWUgPSAicGluODAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjgwIH0sIHsgLm5hbWUgPSAicGluODEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjgxIH0sIHsgLm5hbWUgPSAicGluODIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjgyIH0sIHsgLm5hbWUgPSAicGluODMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjgzIH0sIHsgLm5hbWUgPSAicGluODQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg0IH0sIHsgLm5hbWUgPSAicGluODUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg1IH0sIHsgLm5hbWUgPSAicGluODYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg2IH0sIHsgLm5hbWUgPSAicGluODciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg3IH0sIHsgLm5hbWUgPSAicGluODgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg4IH0sIHsgLm5hbWUgPSAicGluODkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg5IH0sIHsgLm5hbWUgPSAicGluOTAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjkwIH0sIHsgLm5hbWUgPSAicGluOTEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjkxIH0sIHsgLm5hbWUgPSAicGluOTIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjkyIH0sIHsgLm5hbWUgPSAicGluOTMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjkzIH0sIHsgLm5hbWUgPSAicGluOTQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk0IH0sIHsgLm5hbWUgPSAicGluOTUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk1IH0sIHsgLm5hbWUgPSAicGluOTYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk2IH0sIHsgLm5hbWUgPSAicGluOTciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk3IH0sIHsgLm5hbWUgPSAicGluOTgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk4IH0sIHsgLm5hbWUgPSAicGluOTkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk5IH0sIHsgLm5hbWUgPSAicGluMTAwIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMDAgfSwgeyAubmFtZSA9ICJwaW4xMDEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEwMSB9LCB7IC5uYW1lID0gInBpbjEwMiIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOMTAyIH0sIHsgLm5hbWUgPSAicGluMTAzIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMDMgfSwgeyAubmFtZSA9ICJwaW4xMDQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEwNCB9LCB7IC5uYW1lID0gInBpbjEwNSIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOMTA1IH0sIHsgLm5hbWUgPSAicGluMTA2IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMDYgfSwgeyAubmFtZSA9ICJ1bmNvbmZpZ3VyZWQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluID0geyAubmFtZSA9ICJiY21vbHRfZ3Bpb19waW4iLCAuZGVzY3IgPSAiR1BJTyBwaW4gbnVtYmVyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fcGluKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwaW9fcGluX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fcG9sYXJpdHlfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWN0aXZlX2xvdyIsIC52YWwgPSBCQ01PTFRfR1BJT19QT0xBUklUWV9BQ1RJVkVfTE9XIH0sIHsgLm5hbWUgPSAiYWN0aXZlX2hpZ2giLCAudmFsID0gQkNNT0xUX0dQSU9fUE9MQVJJVFlfQUNUSVZFX0hJR0ggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BvbGFyaXR5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bpb19wb2xhcml0eSIsIC5kZXNjciA9ICJHUElPIFBvbGFyaXR5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fcG9sYXJpdHkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bpb19wb2xhcml0eV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInByb3RlY3Rpb25fdHlwZSIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHNjaGVtZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiwgcHJvdGVjdGlvbl90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHN3aXRjaGluZyBvcHRpb25zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24sIHByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyB9LCB7IC5uYW1lID0gInJlcmFuZ2Vfb3B0aW9ucyIsIC5kZXNjciA9ICJSZS1yYW5naW5nIGFsZ29yaXRobSBzZWxlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiwgcmVyYW5nZV9vcHRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9ucyB9LCB7IC5uYW1lID0gInJlcmFuZ2VfYXR0ZW1wdHMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIHRpbWVzIHRvIHJlIHJhbmdlIGR1cmluZyBhIHN3aXRjaCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uLCByZXJhbmdlX2F0dGVtcHRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicmVyYW5nZV9pbnRlcnZhbCIsIC5kZXNjciA9ICJJbnRlcnZhbCBiZXR3ZWVuIHJlLXJhbmdlIGF0dGVtcHRzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uLCByZXJhbmdlX2ludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN5bmNfZ2F0ZV9kdXJhdGlvbiIsIC5kZXNjciA9ICJEdXJhdGlvbiBvZiBzeW5jIGdhdGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24sIHN5bmNfZ2F0ZV9kdXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJncGlvX2lucHV0IiwgLmRlc2NyID0gIkNvbmZpZ3VyZXMgc3RhdGUgb24gUE9OICh3b3JraW5nL3N0YW5kYnkpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24sIGdwaW9faW5wdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiB9LCB7IC5uYW1lID0gImdwaW9faW5wdXRfcG9sYXJpdHkiLCAuZGVzY3IgPSAiR1BJTyBJbnB1dCBQb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uLCBncGlvX2lucHV0X3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19wb2xhcml0eSB9LCB7IC5uYW1lID0gImdwaW9fb3V0cHV0IiwgLmRlc2NyID0gIkluZGljYXRlcyBzdGF0ZSBvbiBQT04gKHdvcmtpbmcvc3RhbmRieSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiwgZ3Bpb19vdXRwdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiB9LCB7IC5uYW1lID0gImdwaW9fb3V0cHV0X3BvbGFyaXR5IiwgLmRlc2NyID0gIkdQSU8gT3V0cHV0IFBvbGFyaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24sIGdwaW9fb3V0cHV0X3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19wb2xhcml0eSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJFUE9OIHByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJiYXNlX2xsaWQiLCAudmFsID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRCB9LCB7IC5uYW1lID0gIm1wY3BfZGlzY19lbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0VOIH0sIHsgLm5hbWUgPSAibXBjcF9kaXNjX2dudF9sZW5fdHEiLCAudmFsID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RRIH0sIHsgLm5hbWUgPSAibXBjcF9yZXBvcnRfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCB9LCB7IC5uYW1lID0gIm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3ciLCAudmFsID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1cgfSwgeyAubmFtZSA9ICJtYXhfbGlua3MiLCAudmFsID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUyB9LCB7IC5uYW1lID0gImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCB9LCB7IC5uYW1lID0gInJhdGVfb2ZfcmVmcmFjdGlvbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9ycF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3JwX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3JwX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9ycF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9ycF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9ycF9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC52YWwgPSBCQ01PTFRfRVBPTl9SUF9LRVlfSURfRVBPTl9OSSB9LCB7IC5uYW1lID0gImxpbmtfcmF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9ycF9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3JwX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3JwX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9ycF9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9ycF9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MTYgPSB7IC5uYW1lID0gImJjbW9sdF91OF9saXN0X3UxNiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBVOCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91OF9saXN0X3UxNiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZih1aW50OF90KSB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmcmFtZV9vY3RldHMiLCAuZGVzY3IgPSAiRnJhbWUgb2N0ZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQsIGZyYW1lX29jdGV0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTE2IH0sIHsgLm5hbWUgPSAibWFza19vY3RldHMiLCAuZGVzY3IgPSAiTWFzayBvY3RldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCwgbWFza19vY3RldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCIsIC5kZXNjciA9ICJFdGhlcm5ldCBmcmFtZSwgbWFza2VkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZyYW1lX29jdGV0cyIsIC5kZXNjciA9ICJGcmFtZSBvY3RldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkLCBmcmFtZV9vY3RldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkID0geyAubmFtZSA9ICJiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQiLCAuZGVzY3IgPSAiRXRoZXJuZXQgZnJhbWUsIHVubWFza2VkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXh0X2lycV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJleHRfaXJxMCIsIC52YWwgPSBCQ01PTFRfRVhUX0lSUV9FWFRfSVJRMCB9LCB7IC5uYW1lID0gImV4dF9pcnExIiwgLnZhbCA9IEJDTU9MVF9FWFRfSVJRX0VYVF9JUlExIH0sIHsgLm5hbWUgPSAiZXh0X2lycTIiLCAudmFsID0gQkNNT0xUX0VYVF9JUlFfRVhUX0lSUTIgfSwgeyAubmFtZSA9ICJleHRfaXJxMyIsIC52YWwgPSBCQ01PTFRfRVhUX0lSUV9FWFRfSVJRMyB9LCB7IC5uYW1lID0gImV4dF9pcnE0IiwgLnZhbCA9IEJDTU9MVF9FWFRfSVJRX0VYVF9JUlE0IH0sIHsgLm5hbWUgPSAiZXh0X2lycTUiLCAudmFsID0gQkNNT0xUX0VYVF9JUlFfRVhUX0lSUTUgfSwgeyAubmFtZSA9ICJ1bmNvbmZpZ3VyZWQiLCAudmFsID0gQkNNT0xUX0VYVF9JUlFfVU5DT05GSUdVUkVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXh0X2lycSA9IHsgLm5hbWUgPSAiYmNtb2x0X2V4dF9pcnEiLCAuZGVzY3IgPSAiRXh0ZXJuYWwgSVJRIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2V4dF9pcnEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXh0X2lycV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUiLCAuZGVzY3IgPSAiQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgYmVmb3JlIGFsbCBidXJzdHMgZm9yIHRoaXMgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSwgYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUiLCAuZGVzY3IgPSAiQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgYWZ0ZXIgYWxsIGJ1cnN0cyBmb3IgdGhpcyBPTlUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lLCBhZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgPSB7IC5uYW1lID0gImJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIiwgLmRlc2NyID0gIkV4dGVuZGVkIEd1YXJkIFRpbWUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiBzdHJpbmdfMzIgPSB7IC5uYW1lID0gInN0cmluZ1szMl0iLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAzMiIsIC5zaXplID0gc2l6ZW9mKGNoYXJbMzJdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSSU5HIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1ham9yIiwgLmRlc2NyID0gIk1ham9yICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiwgbWFqb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJtaW5vciIsIC5kZXNjciA9ICJNaW5vciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiwgbWlub3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyZXZpc2lvbiIsIC5kZXNjciA9ICJSZXZpc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiwgcmV2aXNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfaGV4IH0sIHsgLm5hbWUgPSAibW9kZWwiLCAuZGVzY3IgPSAiTW9kZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24sIG1vZGVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImJ1aWxkX3RpbWUiLCAuZGVzY3IgPSAiRmlybXdhcmUgU1cgYnVpbGQgdGltZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiwgYnVpbGRfdGltZSksIC50eXBlID0gJnN0cmluZ18zMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gPSB7IC5uYW1lID0gImJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIiwgLmRlc2NyID0gIkZpcm13YXJlIFNXIFZlcnNpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsbCIsIC52YWwgPSBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9BTEwgfSwgeyAubmFtZSA9ICJwZXJfdmlkIiwgLnZhbCA9IEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX1BFUl9WSUQgfSwgeyAubmFtZSA9ICJwZXJfZmxvdyIsIC52YWwgPSBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9QRVJfRkxPVyB9LCB7IC5uYW1lID0gInZpZF9wbHVzX2Zsb3ciLCAudmFsID0gQkNNT0xUX0ZMVVNIX01BQ19UQUJMRV9PUFRJT05fVklEX1BMVVNfRkxPVyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uIiwgLmRlc2NyID0gIkZsdXNoIE1BQyB0YWJsZSBvcHRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsb3dlciIsIC52YWwgPSBCQ01PTFRfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OX0xPV0VSIH0sIHsgLm5hbWUgPSAiaGlnaGVyIiwgLnZhbCA9IEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fSElHSEVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIiwgLmRlc2NyID0gIkZyZXF1ZW5jeSBhZGp1c3RtZW50IGRpcmVjdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkb3duc3RyZWFtIiwgLnZhbCA9IEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fRE9XTlNUUkVBTSB9LCB7IC5uYW1lID0gInVwc3RyZWFtIiwgLnZhbCA9IEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fVVBTVFJFQU0gfSwgeyAubmFtZSA9ICJiaWRpcmVjdGlvbmFsIiwgLnZhbCA9IEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fQklESVJFQ1RJT05BTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbiIsIC5kZXNjciA9ICJHRU0gcG9ydCBJRCBkaXJlY3Rpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9nZW1fcG9ydF90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInVuaWNhc3QiLCAudmFsID0gQkNNT0xUX0dFTV9QT1JUX1RZUEVfVU5JQ0FTVCB9LCB7IC5uYW1lID0gIm11bHRpY2FzdCIsIC52YWwgPSBCQ01PTFRfR0VNX1BPUlRfVFlQRV9NVUxUSUNBU1QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF90eXBlID0geyAubmFtZSA9ICJiY21vbHRfZ2VtX3BvcnRfdHlwZSIsIC5kZXNjciA9ICJHRU0gcG9ydCB0eXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dlbV9wb3J0X3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ2VtX3BvcnRfdHlwZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkaXJlY3Rpb24iLCAuZGVzY3IgPSAiR0VNIHBvcnQgZGlyZWN0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uLCBkaXJlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24gfSwgeyAubmFtZSA9ICJ0eXBlIiwgLmRlc2NyID0gIkdFTSBwb3J0IHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24sIHR5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF90eXBlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiR0VNIHBvcnQgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhY3RpdmF0ZSIsIC52YWwgPSBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0FDVElWQVRFIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0ZSIsIC52YWwgPSBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0RFQUNUSVZBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24iLCAuZGVzY3IgPSAiR0VNIHBvcnQgb3BlcmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGlyZWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04gfSwgeyAubmFtZSA9ICJ2YWx1ZSIsIC52YWwgPSBCQ01PTFRfR1BJT19DRkdfSURfVkFMVUUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwaW9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwaW9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncGlvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncGlvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncGlvX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC52YWwgPSBCQ01PTFRfR1BJT19LRVlfSURfUkVTRVJWRUQgfSwgeyAubmFtZSA9ICJncGlvX2lkIiwgLnZhbCA9IEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncGlvX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncGlvX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bpb19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bpb19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb19waW5fZGlyX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImlucHV0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9ESVJfSU5QVVQgfSwgeyAubmFtZSA9ICJvdXRwdXQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX0RJUl9PVVRQVVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3Bpbl9kaXIgPSB7IC5uYW1lID0gImJjbW9sdF9ncGlvX3Bpbl9kaXIiLCAuZGVzY3IgPSAiR1BJTyBQSU4gRGlyZWN0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fcGluX2RpciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncGlvX3Bpbl9kaXJfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb192YWx1ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjbGVhciIsIC52YWwgPSBCQ01PTFRfR1BJT19WQUxVRV9DTEVBUiB9LCB7IC5uYW1lID0gInNldCIsIC52YWwgPSBCQ01PTFRfR1BJT19WQUxVRV9TRVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3ZhbHVlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bpb192YWx1ZSIsIC5kZXNjciA9ICJHUElPIFZhbHVlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fdmFsdWUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bpb192YWx1ZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9hbGxvY19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TVEFURSB9LCB7IC5uYW1lID0gInNsYSIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU0xBIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJjb2xsZWN0X3N0YXRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfdXNlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX1VTRUQgfSwgeyAubmFtZSA9ICJhdmVyYWdlX25zcl9hbGxvY2F0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQgfSwgeyAubmFtZSA9ICJhdmVyYWdlX3NyX3JlcG9ydCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJudW1fb2ZfY3ljbGVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX2dldF9zdGF0cyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2Nfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2Nfc2V0X3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9hbGxvY19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2Nfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIlN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUiLCAuZGVzY3IgPSAiR1BPTiBBbGxvYyBXaXRoIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9hbGxvY193aXRoX3N0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlLCAubGVuX3NpemUgPSAyLCAubWF4X3NpemUgPSAzMiB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidW50YWdnZWRfZmxvdyIsIC5kZXNjciA9ICJJZiBlbmFibGVkLCB0aGlzIEdFTSBwb3J0IHdpbGwgZXhwZWN0IHVwc3RyZWFtIHRyYWZmaWMgdG8gYmUgdW50YWdnZWQgYW5kIGRvd25zdHJlYW0gdHJhZmZpYyB0byB1c2UgYSBjdXN0b20gVkxBTiB0YWcuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnLCB1bnRhZ2dlZF9mbG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gInVudGFnZ2VkX3ZpZCIsIC5kZXNjciA9ICJUaGUgVkxBTiBJRCB0byB1c2Ugd2hlbiBhZGRpbmcgTUFDIHRhYmxlIGVudHJpZXMgZm9yIHVudGFnZ2VkIHRyYWZmaWMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnLCB1bnRhZ2dlZF92aWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWciLCAuZGVzY3IgPSAiR1BPTiBEZWJ1ZyBGbG93IENvbmZpZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9nZW1faWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCwgLmxlbl9zaXplID0gMSwgLm1heF9zaXplID0gMTYgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEIH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFIH0sIHsgLm5hbWUgPSAiZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RPV05TVFJFQU1fRU5DUllQVElPTl9NT0RFIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFIH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCB9LCB7IC5uYW1lID0gImRlYnVnX2Zsb3dfY29uZmlnIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRyB9LCB7IC5uYW1lID0gIm1hY190YWJsZV9lbnRyeV9saW1pdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9nZW1fcG9ydF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUyB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub3RfY29uZmlndXJlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRCB9LCB7IC5uYW1lID0gImluYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0lOQUNUSVZFIH0sIHsgLm5hbWUgPSAicHJvY2Vzc2luZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9QUk9DRVNTSU5HIH0sIHsgLm5hbWUgPSAiYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0FDVElWRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIiwgLmRlc2NyID0gIkdQT04gR0VNIFBvcnQgU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZ2VtX2lkIiwgLmRlc2NyID0gIkdFTSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLCBnZW1faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIiwgLmRlc2NyID0gIkdQT04gR0VNIFBvcnQgV2l0aCBTdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gMTI4IH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IDI1NiB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaXdmX21vZGUiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9JV0ZfTU9ERSB9LCB7IC5uYW1lID0gInVzX3RwaWRfcGVyX2Zsb3ciLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19UUElEX1BFUl9GTE9XIH0sIHsgLm5hbWUgPSAidXNfb3RhZ19kaXJlY3RfdHBpZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQgfSwgeyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF9wYml0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfUEJJVCB9LCB7IC5uYW1lID0gImRzX3RwaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEIH0sIHsgLm5hbWUgPSAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09ORklHVVJBVElPTiB9LCB7IC5uYW1lID0gImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTiB9LCB7IC5uYW1lID0gIm1hY190YWJsZV9jb3VudCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCB9LCB7IC5uYW1lID0gImZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsZWFybl91bnRhZ2dlZF9mbG93X3ZpZHMiLCAuZGVzY3IgPSAiV2hlbiBhIE1BQy9WSUQgaXMgbGVhcm5lZCBvbiBhbiB1bnRhZ2dlZCBmbG93LCBsZWFybiB0aGUgcmVjZWl2ZWQgTUFDIGFkZHJlc3Mgd2l0aCBib3RoIHRoZSB1bnRhZ2dlZCBWSUQgYW5kIHRoZSByZWNlaXZlZCBWSUQgKGV2ZW4gdGhvdWdoIGl0IHdpbGwgYmUgaW52YWxpZCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZywgbGVhcm5fdW50YWdnZWRfZmxvd192aWRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidW50YWdnZWRfZmxvd19zaGFwaW5nX21zX3Blcl9zZWMiLCAuZGVzY3IgPSAiSWYgdGhpcyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCwgbGVhcm5pbmcgZXZlbnRzIG9uIHVudGFnZ2VkIGZsb3dzIHdpbGwgb25seSBiZSBlbmFibGVkIGZvciBOIG1pbGxpc2Vjb25kcyBldmVyeSBzZWNvbmQuICBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAxMCB3b3VsZCBtZWFuIGxlYXJuaW5nIGlzIG9ubHkgZW5hYmxlZCBmb3IgMSUgb2YgdGhlIHRvdGFsIHRpbWUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZywgdW50YWdnZWRfZmxvd19zaGFwaW5nX21zX3Blcl9zZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyIsIC5kZXNjciA9ICJPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgXCJ1bnRhZ2dlZCBmbG93XCIgZmVhdHVyZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZ2VtX3BvcnQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCB9LCB7IC5uYW1lID0gInBiaXRfY29udHJvbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX1BCSVRfQ09OVFJPTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gImZsb3dfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9GTE9XX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1hcHBpbmdfbWV0aG9kIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfTUVUSE9EIH0sIHsgLm5hbWUgPSAibWFwcGluZ190YWciLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcgfSwgeyAubmFtZSA9ICJ2bGFuX2FjdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJ2bGFuX2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9DT05UUk9MIH0sIHsgLm5hbWUgPSAidmlkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfVklEIH0sIHsgLm5hbWUgPSAiZmxvd19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0ZMT1dfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWdlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19BR0VEIH0sIHsgLm5hbWUgPSAibWFjX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRCB9LCB7IC5uYW1lID0gIm1hY19tb3ZlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX01PVkUgfSwgeyAubmFtZSA9ICJuZXdfbWFjIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTkVXX01BQyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmbG93X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0ZMT1dfSUQgfSwgeyAubmFtZSA9ICJzdGF0aWMiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfU1RBVCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0dFTV9QT1JUX0lEIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9NQUNfQUREUkVTUyB9LCB7IC5uYW1lID0gInZsYW4iLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfVkxBTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9tYWNfYWdlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmxvd19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX0ZMT1dfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbGRfZmxvd19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEIH0sIHsgLm5hbWUgPSAibmV3X2Zsb3dfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9ORVdfRkxPV19JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmxvd19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWMgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAiZW50cmllcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX0VOVFJJRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9NQUNfQUREUkVTUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkc19oaXRfZXZlbnQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfSElUX0VWRU5UIH0sIHsgLm5hbWUgPSAiZHNfbWlzc19ldmVudCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19NSVNTX0VWRU5UIH0sIHsgLm5hbWUgPSAiZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19NSVNTX0VWRU5UIH0sIHsgLm5hbWUgPSAiZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX0hJVF9FVkVOVCB9LCB7IC5uYW1lID0gImRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfVE9fRElTQUJMRURfR0VNIH0sIHsgLm5hbWUgPSAibmV3X21hY19kaXNjb3ZlcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRElTQ09WRVJFRCB9LCB7IC5uYW1lID0gIm1vdmVfZXZlbnQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTU9WRV9FVkVOVCB9LCB7IC5uYW1lID0gIm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRFJPUF9EVUVfVE9fRklGT19GVUxMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX0ZMT1dfSUQgfSwgeyAubmFtZSA9ICJtYWNfbGVhcm5pbmciLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX01BQ19MRUFSTklORyB9LCB7IC5uYW1lID0gInZsYW5fYWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTiB9LCB7IC5uYW1lID0gInZsYW5fdGFnIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRyB9LCB7IC5uYW1lID0gInRwaWRfaW5kZXgiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1RQSURfSU5ERVggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX3VzX2Zsb3dfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9HRU1fUE9SVF9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vcm1hbCIsIC52YWwgPSBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfTk9STUFMIH0sIHsgLm5hbWUgPSAiZW5oYW5jZWQiLCAudmFsID0gQkNNT0xUX0tFWV9FWENIQU5HRV9NT0RFX0VOSEFOQ0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfa2V5X2V4Y2hhbmdlX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSIsIC5kZXNjciA9ICJLZXkgZXhjaGFuZ2UgbW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2VfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW50ZXJ2YWwiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIHByb2Nlc3MgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSwgaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGVcXGRpc2FibGUgcGVyaW9kaWMgcHJvY2VzcyBvZiBLZXkgRXhjaGFuZ2UgZm9yIGFjdGl2ZSBPTlVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJtb2RlIiwgLmRlc2NyID0gIktleSBleGNoYW5nZSBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSwgbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlIH0sIHsgLm5hbWUgPSAiZW5jcnlwdGVkX3BvcnRzX29ubHkiLCAuZGVzY3IgPSAiUGVyZm9ybSBrZXkgZXhjaGFuZ2Ugb25seSB0byBPTlVzIHdpdGggR0VNIHBvcnRzIHRoYXQgaGF2ZSBkb3duc3RyZWFtIGVuY3J5cHRpb24gZW5hYmxlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UsIGVuY3J5cHRlZF9wb3J0c19vbmx5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UiLCAuZGVzY3IgPSAiR1BPTiBLZXkgRXhjaGFuZ2UgIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInZsYW4iLCAuZGVzY3IgPSAiVGhlIFZMQU4gSUQgb2YgdGhlIGVudHJ5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQsIHZsYW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBhc3NpZ25lZCB0byB0cmFmZmljIHRoYXQgbWF0Y2hlcyB0aGlzIE1BQyB0YWJsZSBlbnRyeS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0LCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdGhlIE1BQyBlbnRyeSBpcyBzdGF0aWMuICBTdGF0aWMgZW50cmllcyBkb24ndCBhZ2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBHRU0gcG9ydCBJRCBvZiB0aGUgdHJhZmZpYyB0aGF0IGNyZWF0ZWQgdGhpcyB0YWJsZSBlbnRyeS4gIFRoaXMgb25seSBhcHBsaWVzIHRvIGF1dG9tYXRpY2FsbHktbGVhcm5lZCBlbnRyaWVzLiAgTWFudWFsbHktYWRkZWQgZW50cmllcyB3aWxsIGhhdmUgdGhlIHZhbHVlIEJDTU9MVF9QT05fR0VNX1BPUlRfSURfSU5WQUxJRC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0LCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiVGhlIE9OVSBJRCBmb3IgdGhlIHRyYWZmaWMgdGhhdCBjcmVhdGVkIHRoaXMgdGFibGUgZW50cnkuICBUaGlzIG9ubHkgdmFsaWQgaWYgZ2VtX3BvcnRfaWQgaXMgdmFsaWQuICBPdGhlcndpc2UgdGhpcyB3aWxsIGJlIHNldCB0byBCQ01PTFRfR1BPTl9PTlVfSURfSU5WQUxJRC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCIsIC5kZXNjciA9ICJHUE9OIE1BQyB0YWJsZSBzY2FuIHJlc3VsdCBmb3IgYSBzaW5nbGUgTUFDIHRhYmxlIGVudHJ5LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZihiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQpIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgfSwgeyAubmFtZSA9ICJjcHVfcGFja2V0c19mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUgfSwgeyAubmFtZSA9ICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAibG9zIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUyB9LCB7IC5uYW1lID0gIm9udV9kaXNjb3ZlcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVEIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfY29tcGxldGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUgfSwgeyAubmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUIH0sIHsgLm5hbWUgPSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgeyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwbG9hbSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT05fU1RBVFVTIH0sIHsgLm5hbWUgPSAiYXZhaWxhYmxlX2JhbmR3aWR0aCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9hY3RpdmVfb251cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTIH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfU1RBTkRCWV9PTlVTIH0sIHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTIH0sIHsgLm5hbWUgPSAicG9uX2Rpc3RhbmNlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UgfSwgeyAubmFtZSA9ICJyYW5naW5nX3dpbmRvd19zaXplIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9SQU5HSU5HX1dJTkRPV19TSVpFIH0sIHsgLm5hbWUgPSAicHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkgfSwgeyAubmFtZSA9ICJlcWRfY3ljbGVzX251bWJlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9XRVJfTEVWRUwgfSwgeyAubmFtZSA9ICJkc19mZWNfbW9kZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUgfSwgeyAubmFtZSA9ICJkcmlmdF9jb250cm9sIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MIH0sIHsgLm5hbWUgPSAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCB9LCB7IC5uYW1lID0gImxvc19hbGFybV90aHJlc2hvbGQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQgfSwgeyAubmFtZSA9ICJsb3NfaW5pdGlhbF92YWx1ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm1zX3RocmVzaG9sZHMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUyB9LCB7IC5uYW1lID0gImJlcl9tb25pdG9yIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUiB9LCB7IC5uYW1lID0gInBsb2FtX2Fja190aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QTE9BTV9BQ0tfVElNRU9VVCB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTiB9LCB7IC5uYW1lID0gInNuX2FjcXVpc2l0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTiB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HIH0sIHsgLm5hbWUgPSAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSB9LCB7IC5uYW1lID0gImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSB9LCB7IC5uYW1lID0gImRiYSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREJBIH0sIHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCB9LCB7IC5uYW1lID0gInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTIH0sIHsgLm5hbWUgPSAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORyB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSIH0sIHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SIH0sIHsgLm5hbWUgPSAibWluX2RhdGFfYWxsb2NfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEIH0sIHsgLm5hbWUgPSAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OIH0sIHsgLm5hbWUgPSAidXNfYmFuZHdpZHRoX2xpbWl0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQgfSwgeyAubmFtZSA9ICJhbGxfb251cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMgfSwgeyAubmFtZSA9ICJhbGxfbWNhc3RfZ2VtX3BvcnRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTIH0sIHsgLm5hbWUgPSAiZGVidWciLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfcGFyYW1zIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMgfSwgeyAubmFtZSA9ICJwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QU19DX1dBSVRfQkVGT1JFX0RFQUNUSVZBVElPTl9USU1FT1VUIH0sIHsgLm5hbWUgPSAiYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXJyb3IiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUiB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicGFja2V0X3R5cGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUgfSwgeyAubmFtZSA9ICJjYWxjX2NyYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2xpc3QiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2NwdV9wYWNrZXRzIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGVidWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251IiwgLmRlc2NyID0gIk51bWJlciBvZiBHZW0gcG9ydHMgcGVyIE9OVSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9kZWJ1ZywgbnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGVidWcgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2RlYnVnIiwgLmRlc2NyID0gIkdQT04gTkkgRGVidWcgcGFyYW1ldGVycyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2RlYnVnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGVidWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kZWJ1Z19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAudmFsID0gQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2xvc19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfTE9TX0lEX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfbG9zX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9sb3NfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9sb3MgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfbG9zX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfbG9zX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSIH0sIHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX29udV9kaXNjb3ZlcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfU1RBVEUgfSwgeyAubmFtZSA9ICJvbnVfbGlzdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcmVzZXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfcmVzZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcmVzZXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSB9LCB7IC5uYW1lID0gIm1lYXN1cmVtZW50X3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUyB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJpc19kZWxpbmVhdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OIH0sIHsgLm5hbWUgPSAiaXNfZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19FRCB9LCB7IC5uYW1lID0gInJ4X2RhdGEiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBIH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfb251X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEIH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfY3JjX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfQ1JDX0VSUk9SIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJzZWNvbmRfcmFuZ2luZ193aW5kb3ciLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9TRUNPTkRfUkFOR0lOR19XSU5ET1cgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVfc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zZXRfb251X3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSIH0sIHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdF9zaWduYWwiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsaXN0X29mX29udV9pZHMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZlY19jb2Rld29yZHMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTIH0sIHsgLm5hbWUgPSAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQgfSwgeyAubmFtZSA9ICJiaXA4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9CWVRFUyB9LCB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMgfSwgeyAubmFtZSA9ICJyeF9nZW1fcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9QQUNLRVRTIH0sIHsgLm5hbWUgPSAicnhfZ2VtX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fRFJPUFBFRCB9LCB7IC5uYW1lID0gInJ4X2dlbV9pZGxlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lETEUgfSwgeyAubmFtZSA9ICJyeF9nZW1fY29ycmVjdGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRCB9LCB7IC5uYW1lID0gInJ4X2dlbV9pbGxlZ2FsIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lMTEVHQUwgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc192YWxpZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEIH0sIHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCB9LCB7IC5uYW1lID0gInJ4X2NwdSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NQVSB9LCB7IC5uYW1lID0gInJ4X29tY2kiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJIH0sIHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19zaG9ydCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUIH0sIHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fbG9uZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcgfSwgeyAubmFtZSA9ICJyeF9jcmNfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X2tleV9lcnJvcnMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfZnJhZ21lbnRzX2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UU19FUlJPUlMgfSwgeyAubmFtZSA9ICJyeF9wYWNrZXRzX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQgfSwgeyAubmFtZSA9ICJ0eF9nZW0iLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU0gfSwgeyAubmFtZSA9ICJ0eF9wbG9hbXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMgfSwgeyAubmFtZSA9ICJ0eF9nZW1fZnJhZ21lbnRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNX0ZSQUdNRU5UUyB9LCB7IC5uYW1lID0gInR4X2NwdSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVSB9LCB7IC5uYW1lID0gInR4X29tY2kiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJIH0sIHsgLm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEIH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEggfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX3RwaWRfbWlzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTIH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF92aWRfbWlzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQgfSwgeyAubmFtZSA9ICJwcmV2aW91c19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HIH0sIHsgLm5hbWUgPSAic2ZjIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMgfSwgeyAubmFtZSA9ICJydGNfb2Zmc2V0X3NlYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMgfSwgeyAubmFtZSA9ICJydGNfb2Zmc2V0X25zZWMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQyB9LCB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3RvZF9yZXF1ZXN0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlIiwgLmRlc2NyID0gIlBlcmZvcm0gc2luZ2xlIGtleSBleGNoYW5nZSBkdXJpbmcgYWN0aXZhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24sIGtleV9leGNoYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbiIsIC5kZXNjciA9ICJQZXJmb3JtIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGR1cmluZyBhY3RpdmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uLCBwYXNzd29yZF9hdXRoZW50aWNhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJmYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIiwgLmRlc2NyID0gIkRlYWN0aXZhdGUgT05VIGR1ZSB0byBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBmYWlsdXJlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uLCBmYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uIiwgLmRlc2NyID0gIkdQT04gT05VIGFjdGl2YXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9zaSIsIC5kZXNjciA9ICJMb3NzIG9mIHNpZ25hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGxvc2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb2ZpIiwgLmRlc2NyID0gIkxvc3Mgb2YgZnJhbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBsb2ZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9hbWkiLCAuZGVzY3IgPSAiTG9zcyBvZiBQTE9BTSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGxvYW1pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZGdpIiwgLmRlc2NyID0gIkR5aW5nIEdhc3AiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBkZ2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLmRlc2NyID0gIlRyYW5zbWlzc2lvbiBpbnRlcmZlcmVuY2UgQWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCB0aXdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZG93aSIsIC5kZXNjciA9ICJEcmlmdCBvZiBXaW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBkb3dpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAic3VmaSIsIC5kZXNjciA9ICJTdGFydCBVUCBGYWlsdXJlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSwgc3VmaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gInNmaSIsIC5kZXNjciA9ICJTaWduYWwgRmFpbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUsIHNmaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gInNkaSIsIC5kZXNjciA9ICJTaWduYWwgRGVncmFkZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBzZGkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJkZmkiLCAuZGVzY3IgPSAiRGVhY3RpdmF0aW9uIEZhaWx1cmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBkZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb2FpIiwgLmRlc2NyID0gIkxvc3Mgb2YgYWNrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSwgbG9haSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImxva2kiLCAuZGVzY3IgPSAibG9zcyBvZiBrZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBsb2tpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJHUE9OIE9OVSBhbGFybSBzdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxvc2kiLCAuZGVzY3IgPSAiTE9TaSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zLCBsb3NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9maSIsIC5kZXNjciA9ICJMT0ZpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybXMsIGxvZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb2FtaSIsIC5kZXNjciA9ICJMT0FNaSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zLCBsb2FtaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtcyA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2FsYXJtcyIsIC5kZXNjciA9ICJHUE9OIE9OVSBhbGFybXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9zaSIsIC5kZXNjciA9ICJUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT1NpIGFsYXJtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcywgbG9zaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImxvZmkiLCAuZGVzY3IgPSAiVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9GaSBhbGFybSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb2FtaSIsIC5kZXNjciA9ICJUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT0FNaSBhbGFybSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvYW1pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyIsIC5kZXNjciA9ICJHUE9OIE9OVSBhbGFybXMgdGhyZXNob2xkcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiZGZpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ERkkgfSwgeyAubmFtZSA9ICJkZ2kiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSB9LCB7IC5uYW1lID0gImRvd2kiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kgfSwgeyAubmFtZSA9ICJlcnIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0VSUiB9LCB7IC5uYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0lOVkFMSURfREJSVV9SRVBPUlQgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCB9LCB7IC5uYW1lID0gImxvYWkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUkgfSwgeyAubmFtZSA9ICJsb2tpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0tJIH0sIHsgLm5hbWUgPSAibWVtaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTUVNSSB9LCB7IC5uYW1lID0gIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSB9LCB7IC5uYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib251X2VuYWJsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib3B0aWNhbF9yZWZsZWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04gfSwgeyAubmFtZSA9ICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInBlZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUEVFIH0sIHsgLm5hbWUgPSAicG9zc2libGVfZHJpZnQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZUIH0sIHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFIH0sIHsgLm5hbWUgPSAicHN0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QgfSwgeyAubmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUkFOR0lOR19DT01QTEVURUQgfSwgeyAubmFtZSA9ICJyZWkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSSB9LCB7IC5uYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInNkaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJIH0sIHsgLm5hbWUgPSAic2ZpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TRkkgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCB7IC5uYW1lID0gInN1ZmkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkkgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9USVdJIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJlcl9pbnRlcnZhbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0JFUl9JTlRFUlZBTCB9LCB7IC5uYW1lID0gInJlc3VsdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1JFU1VMVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSIH0sIHsgLm5hbWUgPSAicGFzc3dvcmQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRCB9LCB7IC5uYW1lID0gImF1dG9fcGFzc3dvcmRfbGVhcm5pbmciLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HIH0sIHsgLm5hbWUgPSAidXNfZmVjIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDIH0sIHsgLm5hbWUgPSAib21jaV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT01DSV9QT1JUX0lEIH0sIHsgLm5hbWUgPSAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwgfSwgeyAubmFtZSA9ICJhZXNfZW5jcnlwdGlvbl9rZXkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFIH0sIHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FIH0sIHsgLm5hbWUgPSAiZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0aW9uX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04gfSwgeyAubmFtZSA9ICJhbGxfZ2VtX3BvcnRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUyB9LCB7IC5uYW1lID0gImFsbF9hbGxvY3MiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfQUxMT0NTIH0sIHsgLm5hbWUgPSAib251X3BzX3R5cGVfYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MgfSwgeyAubmFtZSA9ICJleHRlbmRlZF9ndWFyZF90aW1lIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvd2VyX2xldmVsX2FjdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMX0lEX1BPV0VSX0xFVkVMX0FDVElPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWwgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BPUlRfSUQgfSwgeyAubmFtZSA9ICJjcmNfb2siLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQ1JDX09LIH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfUEFDS0VUX1NJWkUgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfY3B1X3BhY2tldCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSB9LCB7IC5uYW1lID0gImNhbGNfY3JjIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wYWNrZXRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUyB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9jcHVfcGFja2V0cyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RmaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2RmaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9kZmkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2RmaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9kZmlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RnaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2RnaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9kZ2kgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2RnaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9kZ2lfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTIH0sIHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUgfSwgeyAubmFtZSA9ICJuZXdfZXFkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX05FV19FUUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kb3dpX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9kb3dpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9kb3dpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2VxZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcWQsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJlcWQiLCAuZGVzY3IgPSAiRVFEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcWQsIGVxZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9lcWQiLCAuZGVzY3IgPSAiR1BPTiBPTlUgRVFEIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2VxZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcWRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXFkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fb251X2VxZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXFkLCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtb2x0X2dwb25fb251X2VxZCkgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2Vycl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX0JJUDhfRVJST1JTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXJyX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2VyciBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2Vycl9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX29udV9pZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IDI1NiB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5ld19rZXkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJuZXdfa2V5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9ORVdfS0VZIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJleHBlY3RlZF9rZXkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZIH0sIHsgLm5hbWUgPSAicmVjZWl2ZWRfa2V5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX1JFQ0VJVkVEX0tFWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJleHBlY3RlZF9pbmRleCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfRVhQRUNURURfSU5ERVggfSwgeyAubmFtZSA9ICJhY3R1YWxfaW5kZXgiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX0FDVFVBTF9JTkRFWCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXggZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2xvYWlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9MT0FJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2xvYWlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9sb2FpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2xvYWkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2xvYWlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9sb2tpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2tpX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9sb2tpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9sb2tpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2xva2lfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwbG9hbV9idWZmZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX01FTUlfSURfUExPQU1fQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X21lbWlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfbWVtaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9tZW1pX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvcnRfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BPUlRfSUQgfSwgeyAubmFtZSA9ICJjcmNfb2siLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSyB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vbWNpX3BhY2tldCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdlbV9wb3J0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfR0VNX1BPUlQgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJvcGVyYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9PUEVSQVRJT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEX0lEX1JFU1VMVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb251X2FsYXJtIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04gfSwgeyAubmFtZSA9ICJwYXNzd29yZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1BBU1NXT1JEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wZWVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QRUVfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGVlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3BlZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3BlZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicGxvYW0iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9wbG9hbV9wYWNrZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJlc3RpbWF0ZWRfZHJpZnQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9sZF9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUgfSwgeyAubmFtZSA9ICJyZWFzb24iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3BzdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsaW5rX251bWJlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0xJTktfTlVNQkVSIH0sIHsgLm5hbWUgPSAiazEiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMSB9LCB7IC5uYW1lID0gImsyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wc3RfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wc3RfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcHN0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wc3RfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX3Bsb2FtcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUyB9LCB7IC5uYW1lID0gImVxZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFEIH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWwiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9SRUlfSURfQklQOF9FUlJPUlMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yZWlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9yZWlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcmVpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yZWlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9yc3NpX21lYXN1cmVtZW50IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUyB9LCB7IC5uYW1lID0gImJlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0JFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NkaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3NkaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zZGkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3NkaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9zZGlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVfc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3NmaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJiZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NGSV9JRF9CRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZmlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zZmlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc2ZpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZmlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMgfSwgeyAubmFtZSA9ICJmZWNfYnl0ZXNfY29ycmVjdGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQgfSwgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX0NPUlJFQ1RFRCB9LCB7IC5uYW1lID0gImZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCB9LCB7IC5uYW1lID0gImJpcDhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9CWVRFUyB9LCB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2NyY19lcnJvciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSB9LCB7IC5uYW1lID0gInBvc2l0aXZlX2RyaWZ0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUIH0sIHsgLm5hbWUgPSAibmVnYXRpdmVfZHJpZnQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQgfSwgeyAubmFtZSA9ICJyeF9vbWNpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kgfSwgeyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IgfSwgeyAubmFtZSA9ICJiZXJfcmVwb3J0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQkVSX1JFUE9SVEVEIH0sIHsgLm5hbWUgPSAidW5yZWNlaXZlZF9idXJzdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9VTlJFQ0VJVkVEX0JVUlNUIH0sIHsgLm5hbWUgPSAibGNkZ19lcnJvcnMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlMgfSwgeyAubmFtZSA9ICJyZGlfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JESV9FUlJPUlMgfSwgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUyB9LCB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUyB9LCB7IC5uYW1lID0gInR4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTIH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9QQUNLRVRTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N1ZmlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N1ZmlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zdWZpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3N1ZmkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N1ZmlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV90aXdpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Rpd2lfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV90aXdpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3Rpd2kgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Rpd2lfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbWNpX2RldmljZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJiYXNlbGluZSIsIC52YWwgPSBCQ01PTFRfT01DSV9ERVZJQ0VfSURfQkFTRUxJTkUgfSwgeyAubmFtZSA9ICJleHRlbmRlZCIsIC52YWwgPSBCQ01PTFRfT01DSV9ERVZJQ0VfSURfRVhURU5ERUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbWNpX2RldmljZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X29tY2lfZGV2aWNlX2lkIiwgLmRlc2NyID0gIk9NQ0kgRGV2aWNlIElEIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X29tY2lfZGV2aWNlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X29tY2lfZGV2aWNlX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNwb25zZV90aW1lb3V0X21zIiwgLmRlc2NyID0gIlRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBPTFQgd2lsbCB3YWl0IGZvciB0aGUgT05VIHRvIHJlc3BvbmQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcywgcmVzcG9uc2VfdGltZW91dF9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJtYXhfcmV0cnlfY291bnQiLCAuZGVzY3IgPSAiTWF4aW11bSByZXRyeSBjb3VudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMsIG1heF9yZXRyeV9jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm9tY2lfZm9ybWF0IiwgLmRlc2NyID0gIk9NQ0kgZm9ybWF0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcywgb21jaV9mb3JtYXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbWNpX2RldmljZV9pZCB9LCB7IC5uYW1lID0gIndpbmRvd19zaXplIiwgLmRlc2NyID0gIldpbmRvdyBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcywgd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYWN0aXZhdGVfY29tbWl0IiwgLmRlc2NyID0gIkF1dG9tYXRpY2FsbHkgYWN0aXZhdGUgdGhlIG5ldyBpbWFnZSBhbmQgY29tbWl0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMsIGFjdGl2YXRlX2NvbW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRlbGF5X2Zvcl9jb21taXRfbXMiLCAuZGVzY3IgPSAiRGVsYXkgdGltZSBiZWZvcmUgQ09NTUlUIGNvbW1hbmQuICBVbml0IGlzIG1pbGxpc2Vjb25kcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zLCBkZWxheV9mb3JfY29tbWl0X21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzIiwgLmRlc2NyID0gIk1heGltdW0gbnVtYmVyIG9mIHJlLWF0dGVtcHRzIHRvIGFjdGl2YXRlIHRoZSBPTlUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcywgbWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIiwgLmRlc2NyID0gIkdQT04gT05VIHVwZ3JhZGUgcGFyYW1zIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdWNjZXNzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1NVQ0NFU1MgfSwgeyAubmFtZSA9ICJvbnVfcmVzcG9uc2VfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9PTlVfUkVTUE9OU0VfVElNRU9VVCB9LCB7IC5uYW1lID0gIm9udV9lcnJvcl9yZXNwb25zZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9PTlVfRVJST1JfUkVTUE9OU0UgfSwgeyAubmFtZSA9ICJ0Y2lfbWlzbWF0Y2giLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfVENJX01JU01BVENIIH0sIHsgLm5hbWUgPSAiZ2V0X2ltYWdlX2ZhaWxlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9HRVRfSU1BR0VfRkFJTEVEIH0sIHsgLm5hbWUgPSAiYWN0aXZhdGlvbl9mYWlsZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfQUNUSVZBVElPTl9GQUlMRUQgfSwgeyAubmFtZSA9ICJpbnRlcm5hbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9JTlRFUk5BTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlIiwgLmRlc2NyID0gIkdQT04gT05VIFVwZ3JhZGUgUmV0dXJuIENvZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X29tY2lfcmVzdWx0X2NvZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9fZXJyb3IiLCAudmFsID0gQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfTk9fRVJST1IgfSwgeyAubmFtZSA9ICJwcm9jZXNzaW5nX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1BST0NFU1NJTkdfRVJST1IgfSwgeyAubmFtZSA9ICJub3Rfc3VwcG9ydGVkIiwgLnZhbCA9IEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX05PVF9TVVBQT1JURUQgfSwgeyAubmFtZSA9ICJwYXJhbWV0ZXJfZXJyb3IiLCAudmFsID0gQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfUEFSQU1FVEVSX0VSUk9SIH0sIHsgLm5hbWUgPSAidW5rbm93bl9lbnRpdHkiLCAudmFsID0gQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfVU5LTk9XTl9FTlRJVFkgfSwgeyAubmFtZSA9ICJ1bmtub3duX2luc3RhbmNlIiwgLnZhbCA9IEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1VOS05PV05fSU5TVEFOQ0UgfSwgeyAubmFtZSA9ICJkZXZpY2VfYnVzeSIsIC52YWwgPSBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9ERVZJQ0VfQlVTWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29tY2lfcmVzdWx0X2NvZGUgPSB7IC5uYW1lID0gImJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlIiwgLmRlc2NyID0gIkcuOTg4IE9NQ0kgUmVzdWx0IENvZGUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X29tY2lfcmVzdWx0X2NvZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfb21jaV9yZXN1bHRfY29kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJlcnJvcl9jb2RlIiwgLmRlc2NyID0gIkVycm9yIENvZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzLCBlcnJvcl9jb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gIkZhaWx1cmUgcmVhc29uIHNwZWNpZmljIHRvIHRoZSBFcnJvciBDb2RlIGFib3ZlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb21jaV9yZXN1bHRfY29kZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMiLCAuZGVzY3IgPSAiR1BPTiBPTlUgVXBncmFkZSBTdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fb251X3VwZ3JhZGVfc3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzLCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzKSB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb251X3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vdF9jb25maWd1cmVkIiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQgfSwgeyAubmFtZSA9ICJpbmFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfT05VX1NUQVRFX0lOQUNUSVZFIH0sIHsgLm5hbWUgPSAiYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFIH0sIHsgLm5hbWUgPSAiYWN0aXZlX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX09OVV9TVEFURV9BQ1RJVkVfU1RBTkRCWSB9LCB7IC5uYW1lID0gImRpc2FibGVkIiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfRElTQUJMRUQgfSwgeyAubmFtZSA9ICJhd2FrZV9mcmVlIiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRSB9LCB7IC5uYW1lID0gInByb2Nlc3NpbmciLCAudmFsID0gQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HIH0sIHsgLm5hbWUgPSAibG93X3Bvd2VyX2RvemUiLCAudmFsID0gQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfRE9aRSB9LCB7IC5uYW1lID0gImxvd19wb3dlcl9zbGVlcCIsIC52YWwgPSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUCB9LCB7IC5uYW1lID0gImxvd19wb3dlcl93YXRjaCIsIC52YWwgPSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9XQVRDSCB9LCB7IC5uYW1lID0gInVuYXdhcmUiLCAudmFsID0gQkNNT0xUX09OVV9TVEFURV9VTkFXQVJFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfb251X3N0YXRlIiwgLmRlc2NyID0gIk9OVSBzdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vbnVfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfb251X3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSIsIC5kZXNjciA9ICJHUE9OIE9OVSBXaXRoIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fb251X3dpdGhfc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IDEyOCB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJlZm9yZSIsIC52YWwgPSBCQ01PTFRfUlNTSV9MT0NBVElPTl9TSUdOX0JFRk9SRSB9LCB7IC5uYW1lID0gImFmdGVyIiwgLnZhbCA9IEJDTU9MVF9SU1NJX0xPQ0FUSU9OX1NJR05fQUZURVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24gPSB7IC5uYW1lID0gImJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24iLCAuZGVzY3IgPSAicnNzaSBsb2NhdGlvbiBzaWduIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Jzc2lfbG9jYXRpb25fc2lnbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ25fc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9jYXRpb24iLCAuZGVzY3IgPSAidGhlIHBhdHRlcm4gYWN0aXZhdGlvbiBsb2NhdGlvbiBpbiBjbG9jayBjeWNsZXMgcmVsYXRpdmUgKGJlZm9yZSkgdG8gc3RhcnQgb2YgYnVyc3QuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uLCBsb2NhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImxvY2F0aW9uX3NpZ24iLCAuZGVzY3IgPSAidGhpcyBiaXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBsb2NhdGlvbiBvZiB0aGUgUlNTSSBpbiBkYXRhIG1vZGUgKGNvbmZpZ3VyZWQgYXMgUlNTSSBwYXR0ZXJuIDEpIHdpbGwgYmUgYmVmb3JlIG9yIGFmdGVyIHRoZSBidXJzdCBzdGFydC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24sIGxvY2F0aW9uX3NpZ24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24gfSwgeyAubmFtZSA9ICJzdGFydF9wYXR0ZXJuIiwgLmRlc2NyID0gInRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgY3ljbGUgb2YgdGhlIHBhdHRlcm4gKHdpbGwgYmUgdHJhbnNtaXR0ZWQgb25jZSkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uLCBzdGFydF9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWlkZGxlX3BhdHRlcm4iLCAuZGVzY3IgPSAidGhlIHZhbHVlIG9mIHRoZSBwYXR0ZXJuIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCBtaWRkbGVfcmVwZXRpdGlvbiB0aW1lcyBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24sIG1pZGRsZV9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibGFzdF9wYXR0ZXJuIiwgLmRlc2NyID0gInRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBjeWNsZSBvZiB0aGUgcGF0dGVybi4gd2lsbCBiZSB0cmFuc21pdHRlZCBvbmNlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiwgbGFzdF9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWlkZGxlX3JlcGVydGl0aW9uIiwgLmRlc2NyID0gInRoZSBudW1iZXIgb2YgdGltZXMgdGhlIG1pZGRsZSBwYXR0ZXJuIHdpbGwgYmUgcmVwZWF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uLCBtaWRkbGVfcmVwZXJ0aXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJtaW5pbXVtX2J1cnN0IiwgLmRlc2NyID0gInRoZSBtaW5pbXVtIGJ1cnN0IHNpemUgbmVlZGVkIG1lYXN1cmVtZW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uLCBtaW5pbXVtX2J1cnN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gImdwb24gUlNTSSBnZW5lcmFsIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9OT05FIH0sIHsgLm5hbWUgPSAiYWN0aXZhdGUiLCAudmFsID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0FDVElWQVRFIH0sIHsgLm5hbWUgPSAiZGlzYWJsZSIsIC52YWwgPSBCQ01PTFRfT05VX1BPU1RfRElTQ09WRVJZX01PREVfRElTQUJMRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUiLCAuZGVzY3IgPSAiT05VIHBvc3QgZGlzY292ZXJ5IG1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW50ZXJ2YWwiLCAuZGVzY3IgPSAiU04gcHJvY2VzcyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24sIGludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiU04gcHJvY2VzcyBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gIm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIiwgLmRlc2NyID0gIkF1dG9tYXRpYyBvcGVyYXRpb24gZm9sbG93aW5nIE9OVSBkaXNjb3ZlcnkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24sIG9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiIsIC5kZXNjciA9ICJHUE9OIFNOIEFjcXVpc2l0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRyYW5zY2VpdmVyX3R5cGUiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFIH0sIHsgLm5hbWUgPSAibGFfY29uZmlndXJhdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX0NPTkZJR1VSQVRJT04gfSwgeyAubmFtZSA9ICJiY2RyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUiB9LCB7IC5uYW1lID0gImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMgfSwgeyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQyB9LCB7IC5uYW1lID0gImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMgfSwgeyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQyB9LCB7IC5uYW1lID0gImxhX3Jlc3luY19wb2xhcml0eSIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JFU1lOQ19QT0xBUklUWSB9LCB7IC5uYW1lID0gImJjZHJfcmVzeW5jX3BvbGFyaXR5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFkgfSwgeyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMgfSwgeyAubmFtZSA9ICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUyB9LCB7IC5uYW1lID0gInJ4X2NvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OIH0sIHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORVJHWV9ERVRFQ1QgfSwgeyAubmFtZSA9ICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTiB9LCB7IC5uYW1lID0gImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4iLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkFOR0lOR19QQVRURVJOIH0sIHsgLm5hbWUgPSAicHJlYW1ibGUiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QUkVBTUJMRSB9LCB7IC5uYW1lID0gImRlbGltaXRlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0RFTElNSVRFUiB9LCB7IC5uYW1lID0gImd1YXJkX2JpdHMiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9HVUFSRF9CSVRTIH0sIHsgLm5hbWUgPSAic2VyZGVzX2NvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTiB9LCB7IC5uYW1lID0gInBsb19yYW5naW5nIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX1JBTkdJTkcgfSwgeyAubmFtZSA9ICJwbG9fZGF0YSIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19EQVRBIH0sIHsgLm5hbWUgPSAicnNzaV9ub3JtYWxfY29uZmlnIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fdHJ4X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl90cnhfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fdHJ4X2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl90cnhfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fdHJ4X2tleV9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfaG9zdF9zd192ZXJzaW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1ham9yIiwgLmRlc2NyID0gIk1ham9yICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfaG9zdF9zd192ZXJzaW9uLCBtYWpvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm1pbm9yIiwgLmRlc2NyID0gIk1pbm9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24sIG1pbm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicmV2aXNpb24iLCAuZGVzY3IgPSAiUmV2aXNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiwgcmV2aXNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfaGV4IH0sIHsgLm5hbWUgPSAibW9kZWwiLCAuZGVzY3IgPSAiTW9kZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiwgbW9kZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYnVpbGRfdGltZSIsIC5kZXNjciA9ICJGaXJtd2FyZSBTVyBidWlsZCB0aW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24sIGJ1aWxkX3RpbWUpLCAudHlwZSA9ICZzdHJpbmdfMzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ob3N0X3N3X3ZlcnNpb24gPSB7IC5uYW1lID0gImJjbW9sdF9ob3N0X3N3X3ZlcnNpb24iLCAuZGVzY3IgPSAiSG9zdCBTVyBWZXJzaW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ob3N0X3N3X3ZlcnNpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfaG9zdF9zd192ZXJzaW9uX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2h3X3Bvbl9pZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25faWRfMSIsIC5kZXNjciA9ICJMU0IgMzIgYml0cyBvZiBQT04gSUQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9od19wb25faWQsIHBvbl9pZF8xKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInBvbl9pZF8yIiwgLmRlc2NyID0gIk1TQiAxOSBiaXRzIG9mIFBPTiBJRC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2h3X3Bvbl9pZCwgcG9uX2lkXzIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfaHdfcG9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfaHdfcG9uX2lkIiwgLmRlc2NyID0gIkhXIFBPTiBJRCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9od19wb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfaHdfcG9uX2lkX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2h3X3Bvbl9pZF9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1c19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdWNjZXNzIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUyB9LCB7IC5uYW1lID0gIm1lbW9yeV9hbGxvY2F0aW9uX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19NRU1PUllfQUxMT0NBVElPTl9GQUlMVVJFIH0sIHsgLm5hbWUgPSAidW5zdXBwb3J0ZWRfZmlsZV90eXBlIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfVU5TVVBQT1JURURfRklMRV9UWVBFIH0sIHsgLm5hbWUgPSAiY3JjX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQ1JDX0VSUk9SIH0sIHsgLm5hbWUgPSAiYmxvY2tfb3V0X29mX3N5bmMiLCAudmFsID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19CTE9DS19PVVRfT0ZfU1lOQyB9LCB7IC5uYW1lID0gImludGVybmFsX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5URVJOQUxfRVJST1IgfSwgeyAubmFtZSA9ICJpbnZhbGlkX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5WQUxJRF9TVEFURSB9LCB7IC5uYW1lID0gInByZW1hdHVyZV90ZXJtaW5hdGlvbiIsIC52YWwgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1BSRU1BVFVSRV9URVJNSU5BVElPTiB9LCB7IC5uYW1lID0gImFja190aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQUNLX1RJTUVPVVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMiLCAuZGVzY3IgPSAiSW1hZ2UgdHJhbnNmZXIgc3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlbmFibGVkIiwgLmRlc2NyID0gIldoZXRoZXIgb3Igbm90IHRoZSBkZXZpY2Ugd2lsbCBsaW1pdCB0aGUgcmF0ZSBvZiBpbmRpY2F0aW9ucyBzZW50IHRvIHRoZSBob3N0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nLCBlbmFibGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibWF4X3JhdGUiLCAuZGVzY3IgPSAiTWF4aW11bSBudW1iZXIgb2YgaW5kaWNhdGlvbnMgcGVyIHNlY29uZCB0byBiZSBnZW5lcmF0ZWQgYnkgdGhlIGRldmljZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2luZGljYXRpb25fc2hhcGluZywgbWF4X3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibWF4X2J1cnN0IiwgLmRlc2NyID0gIk1heGltdW0gbnVtYmVyIG9mIGluZGljYXRpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgc2VudCBiYWNrLXRvLWJhY2suIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcsIG1heF9idXJzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgPSB7IC5uYW1lID0gImJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmciLCAuZGVzY3IgPSAiUmF0ZSBsaW1pdGluZyAvIHNoYXBpbmcgZm9yIHRoZSBpbmRpY2F0aW9uIGNoYW5uZWwuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfaXdmX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGlyZWN0X21hcHBpbmdfbW9kZSIsIC52YWwgPSBCQ01PTFRfSVdGX01PREVfRElSRUNUX01BUFBJTkdfTU9ERSB9LCB7IC5uYW1lID0gInBlcl9mbG93X21vZGUiLCAudmFsID0gQkNNT0xUX0lXRl9NT0RFX1BFUl9GTE9XX01PREUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9pd2ZfbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2l3Zl9tb2RlIiwgLmRlc2NyID0gIml3ZiBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2l3Zl9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2l3Zl9tb2RlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3luY19jb250cm9sIiwgLmRlc2NyID0gInVzZWQgaW4gbm9ybWFsIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24sIHJlc3luY19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJyYW5naW5nX3Jlc3luY19jb250cm9sIiwgLmRlc2NyID0gInVzZWQgaW4gcmFuZ2luZyBtb2RlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCByYW5naW5nIGN5Y2xlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uLCByYW5naW5nX3Jlc3luY19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJMQSByZXN5bmMgcGF0dGVybiBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1Igc3RyaW5nXzIwNDggPSB7IC5uYW1lID0gInN0cmluZ1syMDQ4XSIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDIwNDgiLCAuc2l6ZSA9IHNpemVvZihjaGFyWzIwNDhdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSSU5HIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfYnVmZmVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ1ZmYiLCAuZGVzY3IgPSAiYnVmZiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2J1ZmZlciwgYnVmZiksIC50eXBlID0gJnN0cmluZ18yMDQ4IH0sIHsgLm5hbWUgPSAibXNnX3RvX3JlYWQiLCAuZGVzY3IgPSAibXNnX3RvX3JlYWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19idWZmZXIsIG1zZ190b19yZWFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19idWZmZXIgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfYnVmZmVyIiwgLmRlc2NyID0gImxvZyBidWZmZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2J1ZmZlciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfYnVmZmVyX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19idWZmZXJfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dfZW50cnlfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkZWZhdWx0X2xvZ19sZXZlbCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19MRVZFTCB9LCB7IC5uYW1lID0gImRlZmF1bHRfbG9nX3R5cGUiLCAudmFsID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfVFlQRSB9LCB7IC5uYW1lID0gImxvZ19sZXZlbF9wcmludCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfUFJJTlQgfSwgeyAubmFtZSA9ICJsb2dfbGV2ZWxfc2F2ZSIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRSB9LCB7IC5uYW1lID0gImxvZ190eXBlIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFIH0sIHsgLm5hbWUgPSAibG9nX3N0eWxlIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19TVFlMRSB9LCB7IC5uYW1lID0gImxvZ19uYW1lIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19OQU1FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nX2VudHJ5X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibG9nX2lkIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCB9LCB7IC5uYW1lID0gInJlc2VydmVkIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVEIH0sIHsgLm5hbWUgPSAibmFtZSIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nX2VudHJ5X2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dfZW50cnlfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibXNnX2NvdW50IiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9NU0dfQ09VTlQgfSwgeyAubmFtZSA9ICJsb3N0X21zZ19jb3VudCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTE9TVF9NU0dfQ09VTlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZmlsZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzcmFtIiwgLnZhbCA9IEJDTU9MVF9MT0dfRklMRV9JRF9TUkFNIH0sIHsgLm5hbWUgPSAiZGRyIiwgLnZhbCA9IEJDTU9MVF9MT0dfRklMRV9JRF9ERFIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZmlsZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19maWxlX2lkIiwgLmRlc2NyID0gImxvZyBmaWxlIGlkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19maWxlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ19maWxlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19sZXZlbF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub19sb2ciLCAudmFsID0gQkNNT0xUX0xPR19MRVZFTF9OT19MT0cgfSwgeyAubmFtZSA9ICJmYXRhbCIsIC52YWwgPSBCQ01PTFRfTE9HX0xFVkVMX0ZBVEFMIH0sIHsgLm5hbWUgPSAiZXJyb3IiLCAudmFsID0gQkNNT0xUX0xPR19MRVZFTF9FUlJPUiB9LCB7IC5uYW1lID0gIndhcm5pbmciLCAudmFsID0gQkNNT0xUX0xPR19MRVZFTF9XQVJOSU5HIH0sIHsgLm5hbWUgPSAiaW5mbyIsIC52YWwgPSBCQ01PTFRfTE9HX0xFVkVMX0lORk8gfSwgeyAubmFtZSA9ICJkZWJ1ZyIsIC52YWwgPSBCQ01PTFRfTE9HX0xFVkVMX0RFQlVHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2xldmVsIiwgLmRlc2NyID0gImxvZyBsZXZlbCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfbGV2ZWwpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nX2xldmVsX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19zdHlsZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub3JtYWwiLCAudmFsID0gQkNNT0xUX0xPR19TVFlMRV9OT1JNQUwgfSwgeyAubmFtZSA9ICJib2xkIiwgLnZhbCA9IEJDTU9MVF9MT0dfU1RZTEVfQk9MRCB9LCB7IC5uYW1lID0gInVuZGVybGluZSIsIC52YWwgPSBCQ01PTFRfTE9HX1NUWUxFX1VOREVSTElORSB9LCB7IC5uYW1lID0gImJsaW5rIiwgLnZhbCA9IEJDTU9MVF9MT0dfU1RZTEVfQkxJTksgfSwgeyAubmFtZSA9ICJyZXZlcnNlX3ZpZGVvIiwgLnZhbCA9IEJDTU9MVF9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19zdHlsZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19zdHlsZSIsIC5kZXNjciA9ICJsb2cgc3R5bGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX3N0eWxlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ19zdHlsZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9MT0dfVFlQRV9OT05FIH0sIHsgLm5hbWUgPSAicHJpbnQiLCAudmFsID0gQkNNT0xUX0xPR19UWVBFX1BSSU5UIH0sIHsgLm5hbWUgPSAic2F2ZSIsIC52YWwgPSBCQ01PTFRfTE9HX1RZUEVfU0FWRSB9LCB7IC5uYW1lID0gImJvdGgiLCAudmFsID0gQkNNT0xUX0xPR19UWVBFX0JPVEggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ190eXBlIiwgLmRlc2NyID0gImxvZyB0eXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ190eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ190eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJ1ZmZlciIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIgfSwgeyAubmFtZSA9ICJ3cmFwX2Fyb3VuZCIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX0NGR19JRF9XUkFQX0FST1VORCB9LCB7IC5uYW1lID0gImNsZWFyX2FmdGVyX3JlYWQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfQ0xFQVJfQUZURVJfUkVBRCB9LCB7IC5uYW1lID0gImVuYWJsZV9sb2ciLCAudmFsID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfRU5BQkxFX0xPRyB9LCB7IC5uYW1lID0gImxvZ19uYW1lcyIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ2dlcl9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfY2xlYXJfbG9nIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRCB9LCB7IC5uYW1lID0gImZpbGVfaWQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nZ2VyX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0xPR0dFUl9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nZ2VyX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxpbmVzX2luX2xvZyIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nZ2VyX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2tfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZHJvcCIsIC52YWwgPSBCQ01PTFRfTUFDX1RBQkxFX01JU1NfRkFMTEJBQ0tfRFJPUCB9LCB7IC5uYW1lID0gImRlZmF1bHRfZmxvdyIsIC52YWwgPSBCQ01PTFRfTUFDX1RBQkxFX01JU1NfRkFMTEJBQ0tfREVGQVVMVF9GTE9XIH0sIHsgLm5hbWUgPSAidmlkIiwgLnZhbCA9IEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19WSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjayA9IHsgLm5hbWUgPSAiYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrIiwgLmRlc2NyID0gIk1BQyB0YWJsZSBtaXNzIGZhbGxiYWNrIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vcm1hbCIsIC52YWwgPSBCQ01PTFRfTUFDX1RBQkxFX0xFQVJOSU5HX01PREVfTk9STUFMIH0sIHsgLm5hbWUgPSAibW92ZSIsIC52YWwgPSBCQ01PTFRfTUFDX1RBQkxFX0xFQVJOSU5HX01PREVfTU9WRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlID0geyAubmFtZSA9ICJiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGUiLCAuZGVzY3IgPSAiTUFDIHRhYmxlIExlYXJuaW5nIG1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1pc3NfZmFsbGJhY2siLCAuZGVzY3IgPSAiQmVoYXZpb3IgZm9yIGRvd25zdHJlYW0gdHJhZmZpYyB3aGVuIE1BQyB0YWJsZSBsb29rdXAgZmFpbHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgbWlzc19mYWxsYmFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrIH0sIHsgLm5hbWUgPSAiZGVmYXVsdF9mbG93X2lkIiwgLmRlc2NyID0gIkZsb3cgSUQgYXNzaWduZWQgdG8gdXBzdHJlYW0gdHJhZmZpYyBvbiBhIE1BQyB0YWJsZSBtaXNzIGlmIG1pc3NfZmFsbGJhY2sgaXMgc2V0IHRvIGRlZmF1bHRfZmxvdy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uLCBkZWZhdWx0X2Zsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYWdpbmdfdGltZSIsIC5kZXNjciA9ICJBZ2luZyB0aW1lIGluIHNlY29uZHMuICBJZiBubyB0cmFmZmljIGlzIHNlZW4gZm9yIGEgZ2l2ZW4gTUFDIGFkZHJlc3MgLyBWSUQgZm9yIHRoaXMgbGVuZ3RoIG9mIHRpbWUsIHRoZSBlbnRyeSB3aWxsIGFnZSBhbmQgdGhlIGhvc3Qgd2lsbCBiZSBub3RpZmllZCB2aWEgaW5kaWNhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uLCBhZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImxlYXJuaW5nX21vZGUiLCAuZGVzY3IgPSAiTGVhcm5pbmcgdGFibGUgbW9kZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uLCBsZWFybmluZ19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGUgfSwgeyAubmFtZSA9ICJhdXRvbWF0aWNfbWFjX2xlYXJuaW5nIiwgLmRlc2NyID0gIklmIGVuYWJsZWQsIG5ldyBNQUMgdGFibGUgZW50cmllcyBhcmUgYWRkZWQgYXV0b21hdGljYWxseSB0aGUgZmlyc3QgdGltZSBhIG5ldyBNQUMgYWRkcmVzcy9WSUQgY29tYmluYXRpb24gaXMgc2Vlbi4gIElmIGRpc2FibGVkLCBubyBhY3Rpb25zIGFyZSB0YWtlbiBhdXRvbWF0aWNhbGx5IGV4Y2VwdCBub3RpZnlpbmcgdGhlIGhvc3QgdmlhIGluZGljYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgYXV0b21hdGljX21hY19sZWFybmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJhdXRvbWF0aWNfbWFjX2FnaW5nIiwgLmRlc2NyID0gIklmIGVuYWJsZWQsIE1BQyB0YWJsZSBlbnRyaWVzIGFyZSBkZWxldGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGV5IGFnZS4gIElmIGRpc2FibGVkLCBubyBhY3Rpb25zIGFyZSB0YWtlbiBhdXRvbWF0aWNhbGx5IGV4Y2VwdCBub3RpZnlpbmcgdGhlIGhvc3QgdmlhIGluZGljYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgYXV0b21hdGljX21hY19hZ2luZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJhdXRvbWF0aWNfbWFjX21vdmUiLCAuZGVzY3IgPSAiT25seSBhcHBsaWNhYmxlIGlmIGxlYXJuaW5nX21vZGUgaXMgbW92ZS4gIElmIGVuYWJsZWQsIE1BQyB0YWJsZSBlbnRyaWVzIGFyZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2hlbiBhIE1BQyBtb3ZlIGNvbmRpdGlvbiBpcyBlbmNvdW50ZXJlZC4gIElmIGRpc2FibGVkLCBubyBhY3Rpb25zIGFyZSB0YWtlbiBhdXRvbWF0aWNhbGx5IGV4Y2VwdCBub3RpZnlpbmcgdGhlIGhvc3QgdmlhIGluZGljYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgYXV0b21hdGljX21hY19tb3ZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gImF1dG9tYXRpY19zdGF0aWNfbW9kZSIsIC5kZXNjciA9ICJJZiBlbmFibGVkLCBhbGwgTUFDIGVudHJpZXMgdGhhdCBhcmUgYWRkZWQgYXV0b21hdGljYWxseSB2aWEgYXV0b21hdGljX21hY19sZWFybmluZyBhbmQgYXV0b21hdGljX21hY19tb3ZlIHdpbGwgYmUgdHJlYXRlZCBhcyBzdGF0aWMgKG5vdCBhZ2luZykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgYXV0b21hdGljX3N0YXRpY19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJNQUMgdGFibGUgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgPSB7IC5uYW1lID0gImJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIE1hY0FkZHJlc3MiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzLCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4ID0geyAubmFtZSA9ICJiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBNYWNBZGRyZXNzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcywgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gMjA0OCB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm91dGVyX3ZpZCIsIC52YWwgPSBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX09VVEVSX1ZJRCB9LCB7IC5uYW1lID0gImlubmVyX3ZpZCIsIC52YWwgPSBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX0lOTkVSX1ZJRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCA9IHsgLm5hbWUgPSAiYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCIsIC5kZXNjciA9ICJNYXBwaW5nIHRhZyBtZXRob2QiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCB7IC5uYW1lID0gInN0YXR1c19jaGFuZ2VkIiwgLnZhbCA9IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVFVTX0NIQU5HRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVtb3RlX2xvb3BiYWNrIiwgLnZhbCA9IEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSyB9LCB7IC5uYW1lID0gImxpbmVfbG9vcGJhY2siLCAudmFsID0gQkNNT0xUX05OSV9DRkdfSURfTElORV9MT09QQkFDSyB9LCB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLnZhbCA9IEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAibm5pX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTIH0sIHsgLm5hbWUgPSAibm5pX2JhY2t1cF9zdGF0dXMiLCAudmFsID0gQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMgfSwgeyAubmFtZSA9ICJhY3RpdmVfbm5pIiwgLnZhbCA9IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkgfSwgeyAubmFtZSA9ICJubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMiLCAudmFsID0gQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVU19QT0xMSU5HX0lOVEVSVkFMX01TIH0sIHsgLm5hbWUgPSAiYXV0b3N3aXRjaCIsIC52YWwgPSBCQ01PTFRfTk5JX0NGR19JRF9BVVRPU1dJVENIIH0sIHsgLm5hbWUgPSAiZmxvd19jb250cm9sIiwgLnZhbCA9IEJDTU9MVF9OTklfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfY29ubmVjdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwcmltYXJ5IiwgLnZhbCA9IEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZIH0sIHsgLm5hbWUgPSAiYmFja3VwIiwgLnZhbCA9IEJDTU9MVF9OTklfQ09OTkVDVElPTl9CQUNLVVAgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfY29ubmVjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9jb25uZWN0aW9uIiwgLmRlc2NyID0gIk5OSSBDb25uZWN0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9jb25uZWN0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X25uaV9jb25uZWN0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cml2YWxlbnRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmFsc2UiLCAudmFsID0gQkNNT0xUX1RSSVZBTEVOVF9GQUxTRSB9LCB7IC5uYW1lID0gInRydWUiLCAudmFsID0gQkNNT0xUX1RSSVZBTEVOVF9UUlVFIH0sIHsgLm5hbWUgPSAibm90X2FwcGxpY2FibGUiLCAudmFsID0gQkNNT0xUX1RSSVZBTEVOVF9OT1RfQVBQTElDQUJMRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyaXZhbGVudCA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyaXZhbGVudCIsIC5kZXNjciA9ICJUcml2YWxlbnQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJpdmFsZW50KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyaXZhbGVudF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX2xpbmtfc3RhdHVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxpbmtfc3RhdHVzIiwgLmRlc2NyID0gIlRoZSBsb2NhbCBhbmQgcmVtb3RlIHBhcnRuZXJzIGFyZSBhYmxlZCBhbmQgcmVhZHkgdG8gdHJhbnNtaXQvcmVjZWl2ZSB0cmFmZmljLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2xpbmtfc3RhdHVzLCBsaW5rX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyaXZhbGVudCB9LCB7IC5uYW1lID0gInNpZ25hbF9kZXRlY3RlZCIsIC5kZXNjciA9ICJTZXJkZXMgY29udHJvbGxlciBoYXMgZGV0ZWN0ZWQgZW5lcmd5IG9uIHRoZSBsaW5lLiAgZGVidWdnaW5nIHB1cnBvc2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfbGlua19zdGF0dXMsIHNpZ25hbF9kZXRlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyaXZhbGVudCB9LCB7IC5uYW1lID0gInBtZF9sb2NrZWQiLCAuZGVzY3IgPSAiSW5kaWNhdGVzIFBNRCBsb2NrZWQuICBkZWJ1Z2dpbmcgcHVycG9zZS4gIElmIHRoaXMgaXMgdHJ1ZSwgYnV0IHRoZSBsaW5rcyBzdGF0dXMgaXMgbm90LCB0aGF0IG1lYW5zIHRoZSB0cmFuc2NlaXZlciBpcyBub3QgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9saW5rX3N0YXR1cywgcG1kX2xvY2tlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyaXZhbGVudCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9saW5rX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9saW5rX3N0YXR1cyIsIC5kZXNjciA9ICJOTkkgTGluayBTdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2xpbmtfc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9saW5rX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfbGlua19zdGF0dXNfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyeF92Z2EiLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSB9LCB7IC5uYW1lID0gInJ4X3BmIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9QRiB9LCB7IC5uYW1lID0gInJ4X2xmcGYiLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYgfSwgeyAubmFtZSA9ICJyeF9kZmUxIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUxIH0sIHsgLm5hbWUgPSAicnhfZGZlMiIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMiB9LCB7IC5uYW1lID0gInJ4X2RmZTMiLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMgfSwgeyAubmFtZSA9ICJyeF9kZmU0IiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU0IH0sIHsgLm5hbWUgPSAicnhfZGZlNSIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNSB9LCB7IC5uYW1lID0gInR4X3ByZSIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUFJFIH0sIHsgLm5hbWUgPSAidHhfbWFpbiIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTiB9LCB7IC5uYW1lID0gInR4X3Bvc3QxIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMSB9LCB7IC5uYW1lID0gInR4X3Bvc3QyIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMiB9LCB7IC5uYW1lID0gInR4X3Bvc3QzIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMyB9LCB7IC5uYW1lID0gInR4X2FtcCIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfc2VyZGVzX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJpbnN0YW5jZSIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc2VyZGVzX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zZXJkZXNfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zZXJkZXNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJ4X2ZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTIH0sIHsgLm5hbWUgPSAicnhfZ29vZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0dPT0RfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfbXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X2Jyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9mY3NfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GQ1NfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfY29udHJvbF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfcGF1c2VfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QQVVTRV9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9wZmNfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QRkNfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfdW5zdXBwb3J0ZWRfb3Bjb2RlIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9PUENPREUgfSwgeyAubmFtZSA9ICJyeF91bnN1cHBvcnRlZF9kYSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfREEgfSwgeyAubmFtZSA9ICJyeF9hbGlnbm1lbnRfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9BTElHTk1FTlRfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfbGVuZ3RoX291dF9vZl9yYW5nZSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRSB9LCB7IC5uYW1lID0gInJ4X2NvZGVfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT0RFX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X292ZXJzaXplZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX09WRVJTSVpFRF9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9qYWJiZXJfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9KQUJCRVJfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfbXR1X2NoZWNrX2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVRVX0NIRUNLX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X3Byb21pc2N1b3VzX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfdmxhbl9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1ZMQU5fRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfZG91YmxlX3ZsYW5fZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF90cnVuY2F0ZWRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9UUlVOQ0FURURfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfdW5kZXJzaXplX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X2ZyYWdtZW50ZWRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFHTUVOVEVEX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X3J1bnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JZVEVTIH0sIHsgLm5hbWUgPSAidHhfZ29vZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0dPT0RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfdW5pY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2Jyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9wYXVzZV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BBVVNFX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X3BmY19mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BGQ19GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9qYWJiZXJfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9KQUJCRVJfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfZmNzX2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRkNTX0VSUk9SUyB9LCB7IC5uYW1lID0gInR4X2NvbnRyb2xfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9DT05UUk9MX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X292ZXJzaXplX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfT1ZFUlNJWkVfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfZnJhZ21lbnRlZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQUdNRU5URURfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfZXJyb3JfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF92bGFuX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVkxBTl9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9kb3VibGVfdmxhbl9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0RPVUJMRV9WTEFOX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X3J1bnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X3VuZGVycnVuX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5ERVJSVU5fRlJBTUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5ld19zdGF0dXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfU1RBVFVTIH0sIHsgLm5hbWUgPSAibGluayIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX0xJTksgfSwgeyAubmFtZSA9ICJwcmV2aW91c19hY3RpdmUiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9QUkVWSU9VU19BQ1RJVkUgfSwgeyAubmFtZSA9ICJuZXdfYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX0FDVElWRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfc3RhdHVzX2NoYW5nZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlbmRfcGVyaW9kIiwgLmRlc2NyID0gIlRoZSBwZXJpb2QgYXQgd2hpY2ggdG8gc2VuZCBPQU0gaW5mbyBmcmFtZXMsIGFuZCBleHBlY3QgaW5mbyByZXNwb25zZXMgb24gdGhpcyBsaW5rIChpbiBzZWNvbmRzKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnLCBzZW5kX3BlcmlvZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJ0cmFuc21pdF9mcmFtZSIsIC5kZXNjciA9ICJUcmFuc21pdCBmcmFtZSBvY3RldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnLCB0cmFuc21pdF9mcmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTE2IH0sIHsgLm5hbWUgPSAiaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlIiwgLmRlc2NyID0gIklnbm9yZWQgcmVjZWl2ZSBmcmFtZSB0ZW1wbGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcsIGlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCB9LCB7IC5uYW1lID0gInJlY2VpdmVfdGltZW91dCIsIC5kZXNjciA9ICJUaGUgdGltZSAoaW4gc2Vjb25kcykgdG8gcmVwb3J0IE9BTSB0aW1lb3V0IGFmdGVyIHRoZSBsYXN0IHJlY2VpdmVkIE9BTSBmcmFtZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnLCByZWNlaXZlX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWF4aW11bV9yZWNlaXZlX3NpemUiLCAuZGVzY3IgPSAiTWF4aW11bSBzaXplIG9mIHJlY2VpdmVkIGZyYW1lcy4gIFNldHRpbmcgdGhpcyB2YWx1ZSB0byB6ZXJvIHdpbGwgY2F1c2UgYWxsIE9BTSBmcmFtZXMgdG8gYmUgZHJvcHBlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnLCBtYXhpbXVtX3JlY2VpdmVfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyA9IHsgLm5hbWUgPSAiYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIiwgLmRlc2NyID0gIk9BTSBoZWFydGJlYXQgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X29kbl9jbGFzc19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJuMSIsIC52YWwgPSBCQ01PTFRfT0ROX0NMQVNTX04xIH0sIHsgLm5hbWUgPSAibjIiLCAudmFsID0gQkNNT0xUX09ETl9DTEFTU19OMiB9LCB7IC5uYW1lID0gImUxIiwgLnZhbCA9IEJDTU9MVF9PRE5fQ0xBU1NfRTEgfSwgeyAubmFtZSA9ICJlMiIsIC52YWwgPSBCQ01PTFRfT0ROX0NMQVNTX0UyIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb2RuX2NsYXNzID0geyAubmFtZSA9ICJiY21vbHRfb2RuX2NsYXNzIiwgLmRlc2NyID0gIk9ETiBDbGFzcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vZG5fY2xhc3MpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfb2RuX2NsYXNzX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJlIiwgLnZhbCA9IEJDTU9MVF9PTUNJX1BPUlRfSURfT1BFUkFUSU9OX0NPTkZJR1VSRSB9LCB7IC5uYW1lID0gInJlbW92ZSIsIC52YWwgPSBCQ01PTFRfT01DSV9QT1JUX0lEX09QRVJBVElPTl9SRU1PVkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbiIsIC5kZXNjciA9ICJPTUNJIFBvcnQgSUQgb3BlcmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfb3BlcmF0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImluYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9PTlVfT1BFUkFUSU9OX0lOQUNUSVZFIH0sIHsgLm5hbWUgPSAiYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRSB9LCB7IC5uYW1lID0gImRpc2FibGUiLCAudmFsID0gQkNNT0xUX09OVV9PUEVSQVRJT05fRElTQUJMRSB9LCB7IC5uYW1lID0gImVuYWJsZSIsIC52YWwgPSBCQ01PTFRfT05VX09QRVJBVElPTl9FTkFCTEUgfSwgeyAubmFtZSA9ICJhY3RpdmVfc3RhbmRieSIsIC52YWwgPSBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWSB9LCB7IC5uYW1lID0gImF3YWtlX2ZyZWUiLCAudmFsID0gQkNNT0xUX09OVV9PUEVSQVRJT05fQVdBS0VfRlJFRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29udV9vcGVyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9vbnVfb3BlcmF0aW9uIiwgLmRlc2NyID0gIk9OVSBvcGVyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb251X29wZXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9vbnVfb3BlcmF0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X29udV9wb3dlcl9sZXZlbF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbmNyZWFzZSIsIC52YWwgPSBCQ01PTFRfT05VX1BPV0VSX0xFVkVMX0lOQ1JFQVNFIH0sIHsgLm5hbWUgPSAiZGVjcmVhc2UiLCAudmFsID0gQkNNT0xUX09OVV9QT1dFUl9MRVZFTF9ERUNSRUFTRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9sZXZlbCA9IHsgLm5hbWUgPSAiYmNtb2x0X29udV9wb3dlcl9sZXZlbCIsIC5kZXNjciA9ICJPTlUgUG93ZXIgbGV2ZWwiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb251X3Bvd2VyX2xldmVsKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X29udV9wb3dlcl9sZXZlbF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbG93cG93ZXIiLCAuZGVzY3IgPSAiVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgYW55IE9OVSBvbiB0aGlzIE5JIG1heSBzcGVuZCBpbiBhIGxvdyBwb3dlciBzdGF0ZSBpbiB1bml0cyBvZiAxMjV1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24sIGlsb3dwb3dlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJpYXdhcmUiLCAuZGVzY3IgPSAiVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgZXZlcnkgT05VIG9uIGhpcyBOSSBtdXN0IHNwZW5kIGluIGFuIGF3YXJlIHN0YXRlIGluIHVuaXRzIG9mIDEyNXVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiwgaWF3YXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIml0cmFuc2luaXQiLCAuZGVzY3IgPSAiVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgYnkgYW55IE9OVSBvbiB0aGlzIE5JIHRvIHBvd2VyIHVwIGl0cyB0cmFuc21pdHRlciBvbmx5IGZyb20gYSBsb3cgcG93ZXIgc3RhdGUgaW4gdW5pdHMgb2YgMTI1dXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uLCBpdHJhbnNpbml0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIml0eGluaXQiLCAuZGVzY3IgPSAiVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgYnkgYW55IE9OVSBvbiB0aGlzIE5JIHRvIHBvd2VyIHVwIGl0cyB0cmFuc2NlaXZlciAodHJhbnNtaXR0ZXIgKyByZWNlaXZlcikgZnJvbSBhIGxvdyBwb3dlciBzdGF0ZSBpbiB1bml0cyBvZiAxMjV1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24sIGl0eGluaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiaXJ4b2ZmIiwgLmRlc2NyID0gIlRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIGFueSBPTlUgb24gdGhpcyBOSSBtYXkgc3BlbmQgd2l0aCBpdHMgcmVjZWl2ZXIgZGlzYWJsZWQgaW4gdW5pdHMgb2YgMTI1dXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uLCBpcnhvZmYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibG93X3Bvd2VyX2Nsb2JpIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgbm9uLWNvbnRpZ3VvdXMgbWlzc2luZyBhbGxvY2F0aW9ucyB0byBhbGxvdyBiZWZvcmUgcmFpc2luZyB0aGUgTE9TaS9MT0ZpL0xPQmkgYWxhcm1zIG9uIGFueSBPTlUgb24gdGhpcyBOSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24sIGxvd19wb3dlcl9jbG9iaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBPTlUgcG93ZXIgbWFuYWdlbWVudCBmZWF0dXJlLiBUaGVzZSBzaG91bGQgbWF0Y2ggdGhlIHBhcmFtZXRlcnMgc2VudCB0byB0aGUgT05VIHZpYSBPTUNJLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidHNvdXJjZSIsIC5kZXNjciA9ICJUc291cmNlIHRpbWVyIGluIG1zZWMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiwgdHNvdXJjZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ0dGFyZ2V0IiwgLmRlc2NyID0gIlR0YXJnZXQgdGltZXIgaW4gbXNlYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uLCB0dGFyZ2V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkIiwgLmRlc2NyID0gImlzIHJlcXVlc3QgcmVnaXN0cmF0aW9uIHBhcnQgb2YgdGhlIHR1bmluZyBpbiBwcm9jZXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24sIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIm9udSB0dW5pbmcgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RjX3Byb3RvY29sX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRjX2xheWVyX3Byb3RvY29sX2dfOTg3X3BfMyIsIC52YWwgPSBCQ01PTFRfVENfUFJPVE9DT0xfVENfTEFZRVJfUFJPVE9DT0xfR185ODdfUF8zIH0sIHsgLm5hbWUgPSAidGNfbGF5ZXJfcHJvdG9jb2xfZ185ODlfcF8zIiwgLnZhbCA9IEJDTU9MVF9UQ19QUk9UT0NPTF9UQ19MQVlFUl9QUk9UT0NPTF9HXzk4OV9QXzMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90Y19wcm90b2NvbCA9IHsgLm5hbWUgPSAiYmNtb2x0X3RjX3Byb3RvY29sIiwgLmRlc2NyID0gIlRDIGxheWVyIHByb3RvY29sIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RjX3Byb3RvY29sKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RjX3Byb3RvY29sX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25faWRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWRtaW5pc3RyYXRpdmVfbGFiZWwiLCAuZGVzY3IgPSAiTVNCIDI4IGJpdCBvZiB0aGUgUE9OIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25faWQsIGFkbWluaXN0cmF0aXZlX2xhYmVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImR3bGNoX2lkIiwgLmRlc2NyID0gIkxTQiA0IGJpdHMgb2YgdGhlIFBPTiBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2lkLCBkd2xjaF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVzIHRoZSBUV0RNIGNoYW5uZWwgdGVybWluYXRpb24gd2l0aGluIGEgY2VydGFpbiBkb21haW4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9pZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25faWRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmUiLCAuZGVzY3IgPSAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIFRyYW5zbWl0IE9wdGljYWwgTGV2ZWwgKFRPTCkgY29udGFpbnMgdGhlIGxhdW5jaCBwb3dlciBvZiB0aGUgT1RMIChSRT0wKSBvciBvZiBhIHJlYWNoIGV4dGVuZGVyIChSRT0xKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wsIHJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAib2RuX2NsYXNzIiwgLmRlc2NyID0gIklkZW50aWZpZXMgdGhlIG5vbWluYWwgb3B0aWNhbCBwYXJhbWV0ZXJzIG9mIHRoZSB0cmFuc2NlaXZlciBhY2NvcmRpbmcgdG8gdGhlIE9ETiBPcHRpY2FsIFBhdGggTG9zcyAoT1BMKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wsIG9kbl9jbGFzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29kbl9jbGFzcyB9LCB7IC5uYW1lID0gImRzX2ZlY19tb2RlIiwgLmRlc2NyID0gIkVuYWJsZS9EaXNhYmxlIHRoZSBkb3duc3RyZWFtIEZFQy4gRGVmYXVsdCBpcyBFbmFibGUuIEF0dHJpYnV0ZSBjYW4gYmUgc2V0IG9ubHkgd2hlbiBQT04gTkkgc3RhdGUgaXMgSW5hY3RpdmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vcGVyYXRpb25fY29udHJvbCwgZHNfZmVjX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAicHJvdG9jb2wiLCAuZGVzY3IgPSAiV2hlbiBzeXN0ZW0gbW9kZSBpcyBOR1BPTjIsIHRoaXMgcGFyYW1ldGVyIEluZGljYXRlIHRoZSBUQyBsYXllciBwcm90b2NvbDogSVRVLVQgRy45ODkuMyBvciBJVFUtVCBHLjk4Ny4zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vcGVyYXRpb25fY29udHJvbCwgcHJvdG9jb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90Y19wcm90b2NvbCB9LCB7IC5uYW1lID0gImRzX2xpbmtfdHlwZSIsIC5kZXNjciA9ICJPcHRpY2FsIGxpbmsgdHlwZSAoVW5zcGVjaWZpZWQsIEEsIEIsIEJvdGgpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vcGVyYXRpb25fY29udHJvbCwgZHNfbGlua190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGlua190eXBlIH0sIHsgLm5hbWUgPSAicG9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXMgdGhlIFRXRE0gY2hhbm5lbCB0ZXJtaW5hdGlvbiB3aXRoaW4gYSBjZXJ0YWluIGRvbWFpbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wsIHBvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9pZCB9LCB7IC5uYW1lID0gImMiLCAuZGVzY3IgPSAiVHJhbnNtaXQgb3B0aWNhbCBsZXZlbCAoVE9MKSByZWZlcmVuY2UgcG9pbnQgaW5kaWNhdG9yOiBTL1ItQ0cgb3IgUy9SLUNQIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vcGVyYXRpb25fY29udHJvbCwgYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29wZXJhdGlvbl9jb250cm9sID0geyAubmFtZSA9ICJiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wiLCAuZGVzY3IgPSAiT3BlcmF0aW9uIENvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdlbV9wb3J0X25vdF9hY3RpdmUiLCAudmFsID0gQkNNT0xUX1BBQ0tFVF9JTkpFQ1RJT05fRVJST1JfR0VNX1BPUlRfTk9UX0FDVElWRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IgPSB7IC5uYW1lID0gImJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIiwgLmRlc2NyID0gIlBhY2tldCBJbmplY3Rpb24gRXJyb3IiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3BhY2tldF90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNwdSIsIC52YWwgPSBCQ01PTFRfUEFDS0VUX1RZUEVfQ1BVIH0sIHsgLm5hbWUgPSAib21jaSIsIC52YWwgPSBCQ01PTFRfUEFDS0VUX1RZUEVfT01DSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF90eXBlID0geyAubmFtZSA9ICJiY21vbHRfcGFja2V0X3R5cGUiLCAuZGVzY3IgPSAicGFja2V0IHR5cGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcGFja2V0X3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcGFja2V0X3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fTk9ORSB9LCB7IC5uYW1lID0gInBhc3N3b3JkX2luY29uc2lzdGVuY3kiLCAudmFsID0gQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX1BBU1NXT1JEX0lOQ09OU0lTVEVOQ1kgfSwgeyAubmFtZSA9ICJwYXNzd29yZF9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fUEFTU1dPUkRfTUlTTUFUQ0ggfSwgeyAubmFtZSA9ICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbl90aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9USU1FT1VUIH0sIHsgLm5hbWUgPSAib251X2FsYXJtIiwgLnZhbCA9IEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9PTlVfQUxBUk0gfSwgeyAubmFtZSA9ICJsb3NfZXZlbnQiLCAudmFsID0gQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX0xPU19FVkVOVCB9LCB7IC5uYW1lID0gImRpc2FibGVfZXZlbnQiLCAudmFsID0gQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX0RJU0FCTEVfRVZFTlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIiwgLmRlc2NyID0gIlBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImludGVydmFsIiwgLmRlc2NyID0gImludGVydmFsIGluIG1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCBpbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciLCAuZGVzY3IgPSAiUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3BvbGFyaXR5X3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxvdyIsIC52YWwgPSBCQ01PTFRfUE9MQVJJVFlfTE9XIH0sIHsgLm5hbWUgPSAiaGlnaCIsIC52YWwgPSBCQ01PTFRfUE9MQVJJVFlfSElHSCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3BvbGFyaXR5ID0geyAubmFtZSA9ICJiY21vbHRfcG9sYXJpdHkiLCAuZGVzY3IgPSAiUG9sYXJpdHkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9sYXJpdHkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcG9sYXJpdHlfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9sbGluZ19pbnRlcnZhbF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb2xsaW5nX2Rpc2FibGVkIiwgLnZhbCA9IEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX1BPTExJTkdfRElTQUJMRUQgfSwgeyAubmFtZSA9ICJ1c181MDAiLCAudmFsID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfVVNfNTAwIH0sIHsgLm5hbWUgPSAibXNfMSIsIC52YWwgPSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU18xIH0sIHsgLm5hbWUgPSAibXNfMiIsIC52YWwgPSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU18yIH0sIHsgLm5hbWUgPSAibXNfNCIsIC52YWwgPSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU180IH0sIHsgLm5hbWUgPSAibXNfOCIsIC52YWwgPSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU184IH0sIHsgLm5hbWUgPSAibXNfMTYiLCAudmFsID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfMTYgfSwgeyAubmFtZSA9ICJhdXRvbWF0aWMiLCAudmFsID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfQVVUT01BVElDIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9sbGluZ19pbnRlcnZhbCA9IHsgLm5hbWUgPSAiYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWwiLCAuZGVzY3IgPSAiUG9sbGluZyBJbnRlcnZhbCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb2xsaW5nX2ludGVydmFsKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWxfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJhbmR3aWR0aF9rYnBzIiwgLmRlc2NyID0gIlJhdGUgaW4ga2JwcywgMCBpcyBkaXNhYmxlZCwgSWYgcmF0ZSBpcyA+MUcgdGhlbiB1c2UgMjU2a2JwcyBpbmNyZW1lbnRzLCBpZiByYXRlIGlzIDwgMUcgdGhlbiB1c2UgNjRrYnBzIGluY3JlbWVudHMuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIsIGJhbmR3aWR0aF9rYnBzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1ic19rQiIsIC5kZXNjciA9ICJNYXhpbXVtIEJ1cnN0IFNpemUgaW4gS0IgOiByYW5nZSBpcyAyS0IgdG8gNE1CIGluIDFLQiBpbmNyZW1lbnRzLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyLCBtYnNfa0IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciIsIC5kZXNjciA9ICJQb3J0IExldmVsIFNoYXBlciBDb25maWd1cmF0aW9uOiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNicl9ydF9idyIsIC5kZXNjciA9ICJDQlIgUmVhbCBUaW1lIEJhbmR3aWR0aCB3aGljaCByZXF1aXJlIHNoYXBpbmcgb2YgdGhlIGJhbmR3aWR0aCBhbGxvY2F0aW9ucyBpbiBhIGZpbmUgZ3JhbnVsYXJpdHkuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgY2JyX3J0X2J3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImNicl9ucnRfYnciLCAuZGVzY3IgPSAiRml4ZWQgQmFuZHdpZHRoIHdpdGggbm8gY3JpdGljYWwgcmVxdWlyZW1lbnQgb2Ygc2hhcGluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgY2JyX25ydF9idyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJndWFyYW50ZWVkX2J3IiwgLmRlc2NyID0gIkR5bmFtaWMgYmFuZHdpZHRoIHdoaWNoIHRoZSBPTFQgaXMgY29tbWl0dGVkIHRvIGFsbG9jYXRlIHVwb24gZGVtYW5kIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWxsb2Nfc2xhLCBndWFyYW50ZWVkX2J3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1heGltdW1fYnciLCAuZGVzY3IgPSAiTWF4aW11bSBhbGxvY2F0ZWQgYmFuZHdpZHRoIGFsbG93ZWQgZm9yIHRoaXMgYWxsb2MgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hbGxvY19zbGEsIG1heGltdW1fYncpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSIsIC5kZXNjciA9ICJBbGxvYyBJRCBhZGRpdGlvbmFsIEJXIGVsaWdpYmlsaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWxsb2Nfc2xhLCBhZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSB9LCB7IC5uYW1lID0gImNicl9ydF9jb21wZW5zYXRpb24iLCAuZGVzY3IgPSAiU2V0IHRvIFRydWUgZm9yIEFsbG9jSUQgd2l0aCBDQlIgUlQgQmFuZHdpZHRoIHRoYXQgcmVxdWlyZXMgY29tcGVuc2F0aW9uIGZvciBza2lwcGVkIGFsbG9jYXRpb25zIGR1cmluZyBxdWlldCB3aW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hbGxvY19zbGEsIGNicl9ydF9jb21wZW5zYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjYnJfcnRfYXBfaW5kZXgiLCAuZGVzY3IgPSAiQWxsb2NhdGlvbiBQcm9maWxlIGluZGV4IGZvciBDQlIgUlQgQmFuZHdpZHRoIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWxsb2Nfc2xhLCBjYnJfcnRfYXBfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJjYnJfbnJ0X2FwX2luZGV4IiwgLmRlc2NyID0gIkFsbG9jYXRpb24gUHJvZmlsZSBpbmRleCBmb3IgQ0JSIG5vbi1SVCBCYW5kd2lkdGgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hbGxvY19zbGEsIGNicl9ucnRfYXBfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJhbGxvY190eXBlIiwgLmRlc2NyID0gIlR5cGUgb2YgdGhlIGFsbG9jIElEICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgYWxsb2NfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3R5cGUgfSwgeyAubmFtZSA9ICJ3ZWlnaHQiLCAuZGVzY3IgPSAiQWxsb2MgSUQgV2VpZ2h0IHVzZWQgaW4gY2FzZSBvZiBFeHRlbmRlZCBEQkEgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgd2VpZ2h0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicHJpb3JpdHkiLCAuZGVzY3IgPSAiQWxsb2MgSUQgUHJpb3JpdHkgdXNlZCBpbiBjYXNlIG9mIEV4dGVuZGVkIERCQSBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWxsb2Nfc2xhLCBwcmlvcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hbGxvY19zbGEgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fYWxsb2Nfc2xhIiwgLmRlc2NyID0gIlBPTiBBbGxvYyBTTEEiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX2FsbG9jX3NsYSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hbGxvY19zbGFfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2JyX2J3IiwgLmRlc2NyID0gIlRvdGFsIEJXIGF2YWlsYWJsZSBmb3IgQ0JSIHJlYWwtdGltZSB0cmFmZmljIChieXRlcy9zZWMpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGgsIGNicl9idyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ0b3RhbF9idyIsIC5kZXNjciA9ICJUb3RhbCBCVyBhdmFpbGFibGUgZm9yIGd1YXJhbnRlZWQgdHJhZmZpYyAoYnl0ZXMvc2VjKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGgsIHRvdGFsX2J3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm5leHRfb251X3RvdGFsX2J3IiwgLmRlc2NyID0gIlRvdGFsIEJXIGF2YWlsYWJsZSBmb3IgZ3VhcmFudGVlZCB0cmFmZmljIGFmdGVyIG5ldyBPTlUgaXMgYWRkZWQgKGJ5dGVzL3NlYykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCwgbmV4dF9vbnVfdG90YWxfYncpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggPSB7IC5uYW1lID0gImJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCIsIC5kZXNjciA9ICJQT04gYXZhaWxhYmxlIGJhbmR3aWR0aCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGJhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNyX3JlcG9ydGluZ19ibG9ja19zaXplIiwgLmRlc2NyID0gIk9OVSBzdGF0dXMgcmVwb3J0IGJsb2NrIHNpemUgaW4gYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9kYmEsIHNyX3JlcG9ydGluZ19ibG9ja19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZGJhX21vZGUiLCAuZGVzY3IgPSAiREJBIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9kYmEsIGRiYV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGJhX21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGJhID0geyAubmFtZSA9ICJiY21vbHRfcG9uX2RiYSIsIC5kZXNjciA9ICJQT04gREJBIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9kYmEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG9uX2RiYV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGJhX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kaXN0YW5jZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYXhfbG9nX2Rpc3RhbmNlIiwgLmRlc2NyID0gIk1heCBsb2dpY2FsIGRpc3RhbmNlIG9mIGFuIE9OVSBvbiB0aGUgUE9OIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fZGlzdGFuY2UsIG1heF9sb2dfZGlzdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibWF4X2RpZmZfcmVhY2giLCAuZGVzY3IgPSAiTWF4IGRpc3RhbmNlIGJldHdlZW4gdGhlIGNsb3Nlc3QgYW5kIGZhcnRoZXN0IE9OVSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2Rpc3RhbmNlLCBtYXhfZGlmZl9yZWFjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGlzdGFuY2UgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fZGlzdGFuY2UiLCAuZGVzY3IgPSAiUE9OIERpc3RhbmNlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9kaXN0YW5jZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGlzdGFuY2VfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG9uX2Rpc3RhbmNlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRyaWZ0X2ludGVydmFsIiwgLmRlc2NyID0gIkludGVydmFsIGluIG1pbGxpc2Vjb25kcyBmb3IgT05VIHRyYW5zbWlzc2lvbiBkcmlmdCBtb25pdG9yaW5nICgwID0gZGlzYWJsZWQpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wsIGRyaWZ0X2ludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImRyaWZ0X2xpbWl0IiwgLmRlc2NyID0gIkRPV2kgdGhyZXNob2xkIGluIGJpdHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sLCBkcmlmdF9saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0IiwgLmRlc2NyID0gIlRJV2kgdGhyZXNob2xkIGluIGJpdHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sLCB0cmFuc21pc3Npb25fY29udHJvbF9saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sID0geyAubmFtZSA9ICJiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wiLCAuZGVzY3IgPSAiUE9OIERyaWZ0IENvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyID0geyAubmFtZSA9ICJiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBwb25fb251X2lkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCwgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKGJjbW9sdF9wb25fb251X2lkKSB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9uX29wZXJhdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbmFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfUE9OX09QRVJBVElPTl9JTkFDVElWRSB9LCB7IC5uYW1lID0gImFjdGl2ZV93b3JraW5nIiwgLnZhbCA9IEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9XT1JLSU5HIH0sIHsgLm5hbWUgPSAiYWN0aXZlX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fb3BlcmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfcG9uX29wZXJhdGlvbiIsIC5kZXNjciA9ICJQT04gT3BlcmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9vcGVyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcG9uX29wZXJhdGlvbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Bvd2VyX2xldmVsX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSIsIC5kZXNjciA9ICJNYXggYWxsb2NhdGlvbiBzaXplIGZvciBQTFMgdHJhbnNtaXNzaW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwsIHBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJtb2RlIiwgLmRlc2NyID0gIk9OVSBkZWZhdWx0IHBvd2VyIGxldmVsIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCwgbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCIsIC5kZXNjciA9ICJQT04gUG93ZXIgTGV2ZWwiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX3Bvd2VyX2xldmVsKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcG93ZXJfbGV2ZWxfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9uc19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9QT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfT1BUSU9OU19OT05FIH0sIHsgLm5hbWUgPSAic3dpZnRfcG9wdXAiLCAudmFsID0gQkNNT0xUX1BPTl9QUk9URUNUSU9OX1NXSVRDSElOR19PUFRJT05TX1NXSUZUX1BPUFVQIH0sIHsgLm5hbWUgPSAiZGVidWdfZmFzdF9yYW5naW5nIiwgLnZhbCA9IEJDTU9MVF9QT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfT1BUSU9OU19ERUJVR19GQVNUX1JBTkdJTkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zIiwgLmRlc2NyID0gIlBPTiBQcm90ZWN0aW9uIFN3aXRjaGluZyBPcHRpb25zIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTV9NQVNLLCAueCA9IHsgLmUgPSBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnNfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0aW1lb3V0IiwgLmRlc2NyID0gIkxPUyBzd2l0Y2ggb3ZlciB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nLCB0aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImdwaW9fcGluIiwgLmRlc2NyID0gIkdQSU8gcGluIGZvciBpbnB1dC9vdXRwdXQgc2lnbmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIGdwaW9fcGluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW4gfSwgeyAubmFtZSA9ICJvcHRpb25zIiwgLmRlc2NyID0gIk9wdGlvbnMgdG8gY29udHJvbCB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgcHJvY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nLCBvcHRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAuZGVzY3IgPSAiR1BPTiBwcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9uX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImluYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkUgfSwgeyAubmFtZSA9ICJwcm9jZXNzaW5nIiwgLnZhbCA9IEJDTU9MVF9QT05fU1RBVEVfUFJPQ0VTU0lORyB9LCB7IC5uYW1lID0gImFjdGl2ZV93b3JraW5nIiwgLnZhbCA9IEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkcgfSwgeyAubmFtZSA9ICJhY3RpdmVfc3RhbmRieSIsIC52YWwgPSBCQ01PTFRfUE9OX1NUQVRFX0FDVElWRV9TVEFOREJZIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfcG9uX3N0YXRlIiwgLmRlc2NyID0gIlBPTiBzdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcG9uX3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdHVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gInN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fc3RhdHVzLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0ZSB9LCB7IC5uYW1lID0gImxvc19zdGF0dXMiLCAuZGVzY3IgPSAiTE9TIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX3N0YXR1cywgbG9zX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fc3RhdHVzIiwgLmRlc2NyID0gIlBPTiBTdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdHVzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0dXNfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXJlY3QiLCAudmFsID0gQkNNT0xUX1BPV0VSX0xFVkVMTElOR19DT05UUk9MX0RJUkVDVCB9LCB7IC5uYW1lID0gImRlY3JlYXNlIiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9MRVZFTExJTkdfQ09OVFJPTF9ERUNSRUFTRSB9LCB7IC5uYW1lID0gImluY3JlYXNlIiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9MRVZFTExJTkdfQ09OVFJPTF9JTkNSRUFTRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sID0geyAubmFtZSA9ICJiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wiLCAuZGVzY3IgPSAicG93ZXIgbGV2ZWxsaW5nIGNvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2xfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50X2VuYWJsZWQiLCAudmFsID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fUE9XRVJfTUFOQUdFTUVOVF9FTkFCTEVEIH0sIHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudF9kaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9QT1dFUl9NQU5BR0VNRU5UX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAic2xlZXBfcmVxdWVzdF9hd2FrZSIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9TTEVFUF9SRVFVRVNUX0FXQUtFIH0sIHsgLm5hbWUgPSAic2xlZXBfcmVxdWVzdF9kb3plIiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfRE9aRSB9LCB7IC5uYW1lID0gInNsZWVwX3JlcXVlc3Rfc2xlZXAiLCAudmFsID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9TTEVFUCB9LCB7IC5uYW1lID0gInNsZWVwX3JlcXVlc3Rfd2F0Y2giLCAudmFsID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9XQVRDSCB9LCB7IC5uYW1lID0gInRlcmlfZXhwaXJlZCIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9URVJJX0VYUElSRUQgfSwgeyAubmFtZSA9ICJ0YWxlcnRlZF9leHBpcmVkIiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1RBTEVSVEVEX0VYUElSRUQgfSwgeyAubmFtZSA9ICJhbGFybSIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9BTEFSTSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uIiwgLmRlc2NyID0gIlRoZSByZWFzb24gdGhhdCBhIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgY2hhbmdlIG9jY3VycmVkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJic19wb2x5bm9taWFsX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInByYnNfNyIsIC52YWwgPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNyB9LCB7IC5uYW1lID0gInByYnNfOSIsIC52YWwgPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfOSB9LCB7IC5uYW1lID0gInByYnNfMTEiLCAudmFsID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzExIH0sIHsgLm5hbWUgPSAicHJic18xNSIsIC52YWwgPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfMTUgfSwgeyAubmFtZSA9ICJwcmJzXzIzIiwgLnZhbCA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18yMyB9LCB7IC5uYW1lID0gInByYnNfMzEiLCAudmFsID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzMxIH0sIHsgLm5hbWUgPSAicHJic181OCIsIC52YWwgPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNTggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3BvbHlub21pYWwgPSB7IC5uYW1lID0gImJjbW9sdF9wcmJzX3BvbHlub21pYWwiLCAuZGVzY3IgPSAiUFJCUyBQb2x5bm9taWFsIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9wcmJzX3BvbHlub21pYWxfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJic19jaGVja2VyX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VsZl9zeW5jIiwgLnZhbCA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9TRUxGX1NZTkMgfSwgeyAubmFtZSA9ICJpbml0aWFsX3NlZWRfbW9kZSIsIC52YWwgPSBCQ01PTFRfUFJCU19DSEVDS0VSX01PREVfSU5JVElBTF9TRUVEX01PREUgfSwgeyAubmFtZSA9ICJpbml0aWFsX3NlZWRfbW9kZV8yIiwgLnZhbCA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9JTklUSUFMX1NFRURfTU9ERV8yIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSIsIC5kZXNjciA9ICJQUkJTIGNoZWNrZXIgbW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb2x5bm9tIiwgLmRlc2NyID0gIlBSQlMgcG9seW5vbSB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnLCBwb2x5bm9tKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19wb2x5bm9taWFsIH0sIHsgLm5hbWUgPSAibW9kZSIsIC5kZXNjciA9ICJQUkJTIExPQ0sgc3RhdGUgbWFjaGluZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcsIG1vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSB9LCB7IC5uYW1lID0gImRhdGFfaW52ZXJ0IiwgLmRlc2NyID0gIkludmVydCBvciBubyBpbnZlcnQgZm9yIHJlY2VpdmVkIFBSQlMgZGF0YSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZywgZGF0YV9pbnZlcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSB0aGUgVVMgUFJCUyBjaGVja2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIiwgLmRlc2NyID0gIlBSQlMgY2hlY2tlciBjb25maWciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbHlub20iLCAuZGVzY3IgPSAiUFJCUyBwb2x5bm9tIHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZywgcG9seW5vbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfcG9seW5vbWlhbCB9LCB7IC5uYW1lID0gImVycm9yX2luc2VydCIsIC5kZXNjciA9ICIwIHRvIDEgdHJhbnNpdGlvbiBvbiB0aGlzIHNpZ25hbCB3aWxsIGluc2VydCBzaW5nbGUgYml0IGVycm9yIGluIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIGJ1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZywgZXJyb3JfaW5zZXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiaW52ZXJ0IiwgLmRlc2NyID0gIkludmVydCBvciBubyBpbnZlcnQgZm9yIHRyYW5zbWl0dGVkIFBSQlMgZGF0YSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnLCBpbnZlcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSB0aGUgRFMgUFJCUyBnZW5lcmF0b3IiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZywgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWciLCAuZGVzY3IgPSAiUFJCUyBHZW5lcmF0b3IgY29uZmlnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJic19sb2NrX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInVubG9ja2VkIiwgLnZhbCA9IEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfVU5MT0NLRUQgfSwgeyAubmFtZSA9ICJsb2NrZWQiLCAudmFsID0gQkNNT0xUX1BSQlNfTE9DS19TVEFURV9MT0NLRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2xvY2tfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9wcmJzX2xvY2tfc3RhdGUiLCAuZGVzY3IgPSAiUFJCUyBMb2NrIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ByYnNfbG9ja19zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9wcmJzX2xvY2tfc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfc3RhdHVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxvY2tfc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIG9mIHRoZSBQUkJTIGxvY2siLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfc3RhdHVzLCBsb2NrX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19sb2NrX3N0YXRlIH0sIHsgLm5hbWUgPSAiZXJyb3JfY291bnRzIiwgLmRlc2NyID0gIlRoZSBiaXQgZXJyb3JzIG9ic2VydmVkIGR1cmluZyB0aGUgUFJCUyB0ZXN0LiAgVGhpcyBmaWVsZCBpcyBjbGVhciBvbiByZWFkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcHJic19zdGF0dXMsIGVycm9yX2NvdW50cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X3ByYnNfc3RhdHVzIiwgLmRlc2NyID0gIlRoYXQgc3RhdGUgb2YgdGhlIFBSQlMgdGVzdCwgbG9jayBzdGF0ZSwgYW5kIGVycm9yIGNvdW50ZXJzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wcmJzX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1c19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfUkFNQU5fTUlUSUdBVElPTl9NT0RFX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAicmFuZG9tIiwgLnZhbCA9IEJDTU9MVF9SQU1BTl9NSVRJR0FUSU9OX01PREVfUkFORE9NIH0sIHsgLm5hbWUgPSAiZml4ZWQiLCAudmFsID0gQkNNT0xUX1JBTUFOX01JVElHQVRJT05fTU9ERV9GSVhFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSIsIC5kZXNjciA9ICJSYW1hbiBtaXRpZ2F0aW9uIG1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAid2FpdF9zdGF0ZV8xX3dpbmRvd19zaXplIiwgLmRlc2NyID0gIndhaXQgc3RhdGUgMSB3aW5kb3cgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24sIHdhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIndhaXRfc3RhdGVfMl93aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJ3YWl0IHN0YXRlIDIgd2luZG93IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uLCB3YWl0X3N0YXRlXzJfd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ3YWl0X2FmdGVyX3Jlc3luY180IiwgLmRlc2NyID0gIndhaXQgYWZ0ZXIgcmVzeW5jIDQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uLCB3YWl0X2FmdGVyX3Jlc3luY180KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJyYW5naW5nIGNvbnRyb2wgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19hY2tfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9SQU5HSU5HX0FDS19USU1FT1VUIH0sIHsgLm5hbWUgPSAicGxvYW1fZGF0YV9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9EQVRBX01JU01BVENIIH0sIHsgLm5hbWUgPSAicGxvYW1fdHlwZV9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9UWVBFX01JU01BVENIIH0sIHsgLm5hbWUgPSAicGxvYW1fb251X2lkX21pc21hdGNoIiwgLnZhbCA9IEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1BMT0FNX09OVV9JRF9NSVNNQVRDSCB9LCB7IC5uYW1lID0gImRyaWZ0X2V4Y2VlZGVkIiwgLnZhbCA9IEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0RSSUZUX0VYQ0VFREVEIH0sIHsgLm5hbWUgPSAibm9fcGxvYW1fcmVjZWl2ZWQiLCAudmFsID0gQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fTk9fUExPQU1fUkVDRUlWRUQgfSwgeyAubmFtZSA9ICJsb3MiLCAudmFsID0gQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fTE9TIH0sIHsgLm5hbWUgPSAiYWxhcm1zIiwgLnZhbCA9IEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0FMQVJNUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uIiwgLmRlc2NyID0gIlJhbmdpbmcgZmFpbCByZWFzb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFmdGVyX2luaXQiLCAuZGVzY3IgPSAiYWZ0ZXIgaW5pdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgYWZ0ZXJfaW5pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImFmdGVyX25vX2VkIiwgLmRlc2NyID0gImFmdGVyIG5vIGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCBhZnRlcl9ub19lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImFmdGVyX2VkIiwgLmRlc2NyID0gImFmdGVyIGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCBhZnRlcl9lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImFmdGVyX25vX2RlbCIsIC5kZXNjciA9ICJhZnRlciBubyBkZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIGFmdGVyX25vX2RlbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImFmdGVyX3JhbmdpbmdfYWNjZXNzIiwgLmRlc2NyID0gImFmdGVyIHJhbmdpbmcgYWNjZXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCBhZnRlcl9yYW5naW5nX2FjY2VzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1lZF92YWwiLCAuZGVzY3IgPSAibWVkIHZhbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgbWVkX3ZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zID0geyAubmFtZSA9ICJiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyIsIC5kZXNjciA9ICJyYW5naW5nIHJlc3luYyBjb25kaXRpb25zIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFmdGVyX25vX2VkIiwgLmRlc2NyID0gImFmdGVyIG5vIGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCwgYWZ0ZXJfbm9fZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJhZnRlcl9lZCIsIC5kZXNjciA9ICJhZnRlciBlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wsIGFmdGVyX2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYWZ0ZXJfcmVzZXRfMyIsIC5kZXNjciA9ICJhZnRlciByZXNldCAzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCwgYWZ0ZXJfcmVzZXRfMyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sID0geyAubmFtZSA9ICJiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wiLCAuZGVzY3IgPSAicmFuZ2luZyByc3NpIGNvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2xfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2xfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3Jfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYXV0b21hdGljIiwgLnZhbCA9IEJDTU9MVF9SRUdJU1RSQVRJT05fQkVIQVZJT1JfQVVUT01BVElDIH0sIHsgLm5hbWUgPSAibm90aWZ5X3Vua25vd24iLCAudmFsID0gQkNNT0xUX1JFR0lTVFJBVElPTl9CRUhBVklPUl9OT1RJRllfVU5LTk9XTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciA9IHsgLm5hbWUgPSAiYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciIsIC5kZXNjciA9ICJSZWdpc3RyYXRpb24gQmVoYXZpb3IiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX3Bsb2FtX3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX1JFR0lTVFJBVElPTl9QTE9BTV9USU1FT1VUIH0sIHsgLm5hbWUgPSAib251X2FsYXJtIiwgLnZhbCA9IEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9PTlVfQUxBUk0gfSwgeyAubmFtZSA9ICJkZWFjdGl2YXRpb24iLCAudmFsID0gQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX0RFQUNUSVZBVElPTiB9LCB7IC5uYW1lID0gImRpc2FibGUiLCAudmFsID0gQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX0RJU0FCTEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uIiwgLmRlc2NyID0gInJlcXVlc3QgcmVnaXN0cmF0aW9uIGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdGUiLCAuZGVzY3IgPSAicmVxdWVzdCByZWdpc3RyYXRpb24gc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cywgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAic21hX2ZsYWciLCAuZGVzY3IgPSAiaXMgcmVxdWVzdCByZWdpc3RyYXRpb24gaXMgcGFydCBvZiBzbWEgcHJvY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLCBzbWFfZmxhZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyIsIC5kZXNjciA9ICJyZXF1ZXN0IHJlZ2lzdHJhdGlvbiBzdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yZXN1bHRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3VjY2VzcyIsIC52YWwgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MgfSwgeyAubmFtZSA9ICJmYWlsIiwgLnZhbCA9IEJDTU9MVF9SRVNVTFRfRkFJTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCA9IHsgLm5hbWUgPSAiYmNtb2x0X3Jlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmVzdWx0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3Jlc3VsdF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZWFybHlfcm9ndWVfZGV0ZWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRUFSTFlfUk9HVUVfREVURUNUSU9OIH0sIHsgLm5hbWUgPSAic3BlY2lhbF9tYXAiLCAudmFsID0gQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUCB9LCB7IC5uYW1lID0gImV4dGVuZGVkX2d1YXJkX3RpbWUiLCAudmFsID0gQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlIiwgLmRlc2NyID0gIlR5cGUgb2YgdGhlIHJvZ3VlIGRldGVjdGlvbiBhbGdvcml0aG0uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzaWxlbnRfd2luZG93IiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1cgfSwgeyAubmFtZSA9ICJjdXRfb2ZmX3dpbmRvdyIsIC52YWwgPSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19DVVRfT0ZGX1dJTkRPVyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgPSB7IC5uYW1lID0gImJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IiwgLmRlc2NyID0gIlJvZ3VlIE9OVSBkZXRlY3Rpb24gbWVhc3VyZW1lbnQgdHlwZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicGxvX3NpemUiLCAuZGVzY3IgPSAiUExPIHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCwgcGxvX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYWNjZXNzX3NpemUiLCAuZGVzY3IgPSAiQWNjZXNzIHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCwgYWNjZXNzX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgPSB7IC5uYW1lID0gImJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAiLCAuZGVzY3IgPSAiUm9ndWUgRGV0ZWN0aW9uIFNwZWNpYWwgTWFwIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84ID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHJvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwLCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSA4IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGdvcml0aG1fdHlwZSIsIC5kZXNjciA9ICJUeXBlIG9mIHRoZSByb2d1ZSBkZXRlY3Rpb24gYWxnb3JpdGhtLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgYWxnb3JpdGhtX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9lYXJseV9yb2d1ZV9kZXRlY3Rpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWVhc3VyZW1lbnRfdHlwZSIsIC5kZXNjciA9ICJTaWxlbnQgV2luZG93IG9yIEN1dCBvZmYgV2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5tZWFzdXJlbWVudF90eXBlKSAtIG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5tZWFzdXJlbWVudF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB9LCB7IC5uYW1lID0gImludGVydmFsIiwgLmRlc2NyID0gIlBlcmlvZGljIHByb2Nlc3MgdGltZXIgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5pbnRlcnZhbCkgLSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzZWNvbmRfcmFuZ2luZ193aW5kb3ciLCAuZGVzY3IgPSAiRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzZWNvbmQgcmFuZ2luZyB3aW5kb3cgc2hvdWxkIGJlIGludm9rZWQgb3Igbm90LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uc2Vjb25kX3Jhbmdpbmdfd2luZG93KSAtIG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5tZWFzdXJlbWVudF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYWxsb2NfdHlwZV90b19zY2FuIiwgLmRlc2NyID0gIkFsbG9jIHR5cGUgdG8gc2NhbiBkdXJpbmcgcm9ndWUgZGV0ZWN0aW9uLiAgVW51c2VkLCBwcmV2aW91c2x5IHVzZWQsIG9yIGFsbCBBbGxvYy1JRHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4pIC0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0sIHUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2Vhcmx5X3JvZ3VlX2RldGVjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZWFybHlfcm9ndWVfZGV0ZWN0aW9uIiwgLmRlc2NyID0gIlJvZ3VlIERldGVjdGlvbiBBbGdvcml0aG0gRWFybHkgUm9ndWUgRGV0ZWN0aW9uIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSAqKTApLT51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2Vhcmx5X3JvZ3VlX2RldGVjdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2Vhcmx5X3JvZ3VlX2RldGVjdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NwZWNpYWxfbWFwX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFjY2Vzc2VzIiwgLmRlc2NyID0gIkFjY2Vzc2VzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LnNwZWNpYWxfbWFwLmFjY2Vzc2VzKSAtIG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LnNwZWNpYWxfbWFwLmFjY2Vzc2VzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9zcGVjaWFsX21hcCA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fc3BlY2lhbF9tYXAiLCAuZGVzY3IgPSAiUm9ndWUgRGV0ZWN0aW9uIEFsZ29yaXRobSBTcGVjaWFsIE1hcCIsIC5zaXplID0gc2l6ZW9mKCgoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0gKikwKS0+dS5zcGVjaWFsX21hcCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NwZWNpYWxfbWFwX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fc3BlY2lhbF9tYXBfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9leHRlbmRlZF9ndWFyZF90aW1lX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFkZGl0aW9uYWxfZ3VhcmRfdGltZSIsIC5kZXNjciA9ICJBZGRpdGlvbmFsIGd1YXJkIHRpbWUgKGluIGJ5dGVzKSBmb3IgYWxsIE9OVXMgb24gdGhpcyBQT04uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9ndWFyZF90aW1lKSAtIG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9ndWFyZF90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZXh0ZW5kZWRfZ3VhcmRfdGltZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZXh0ZW5kZWRfZ3VhcmRfdGltZSIsIC5kZXNjciA9ICJSb2d1ZSBEZXRlY3Rpb24gQWxnb3JpdGhtIEV4dGVuZGVkIEd1YXJkIFRpbWUiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtICopMCktPnUuZXh0ZW5kZWRfZ3VhcmRfdGltZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2V4dGVuZGVkX2d1YXJkX3RpbWVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9leHRlbmRlZF9ndWFyZF90aW1lX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdW5pb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24iLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZWFybHlfcm9ndWVfZGV0ZWN0aW9uIH0sIHsgLm5hbWUgPSAidS5zcGVjaWFsX21hcCIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0sIHUuc3BlY2lhbF9tYXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NwZWNpYWxfbWFwIH0sIHsgLm5hbWUgPSAidS5leHRlbmRlZF9ndWFyZF90aW1lIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5leHRlbmRlZF9ndWFyZF90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9leHRlbmRlZF9ndWFyZF90aW1lIH0sIHsgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSIsIC5kZXNjciA9ICJUeXBlIGFuZCBhdHRyaWJ1dGVzIG9mIHRoZSByb2d1ZSBkZXRlY3Rpb24gYWxnb3JpdGhtLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04sIC54ID0geyAudSA9IHsgLm51bV9jb21tb25fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuY29tbW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZmllbGRzLCAuY2xhc3NpZmllcl9pZHggPSAwLCAudW5pb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV91bmlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyc3NpX2NvbXBsZXRlIiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9DT01QTEVURSB9LCB7IC5uYW1lID0gIm5vdF9wZXJmb3JtZWQiLCAudmFsID0gQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9OT1RfUEVSRk9STUVEIH0sIHsgLm5hbWUgPSAicm9ndWVfY3ljbGVfc3RvcCIsIC52YWwgPSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JPR1VFX0NZQ0xFX1NUT1AgfSwgeyAubmFtZSA9ICJyc3NpX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9FUlJPUiB9LCB7IC5uYW1lID0gInJzc2lfbm90X2NvbXBsZXRlIiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9OT1RfQ09NUExFVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgPSB7IC5uYW1lID0gImJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uIHJlc3VsdC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiRW5hYmxlL0Rpc2FibGUgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24gcHJvY2Vzcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJkZXRlY3Rpb25fYWxnb3JpdGhtIiwgLmRlc2NyID0gIlR5cGUgYW5kIGF0dHJpYnV0ZXMgb2YgdGhlIHJvZ3VlIGRldGVjdGlvbiBhbGdvcml0aG0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIGRldGVjdGlvbl9hbGdvcml0aG0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIiwgLmRlc2NyID0gIkNvbmZpZ3VyZXMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24gcGVyaW9kaWMgcHJvY2Vzcy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1c19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfQ09NUExFVEUgfSwgeyAubmFtZSA9ICJsbGlkX3N0YXRlX2lzX2JhZCIsIC52YWwgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfTExJRF9TVEFURV9JU19CQUQgfSwgeyAubmFtZSA9ICJsbGlkX2lzX29vciIsIC52YWwgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfTExJRF9JU19PT1IgfSwgeyAubmFtZSA9ICJzY2FuX2Vycl9ub3JlcyIsIC52YWwgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfTk9SRVMgfSwgeyAubmFtZSA9ICJzY2FuX2Vycl9pbnRlcm5hbCIsIC52YWwgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfSU5URVJOQUwgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzIiwgLmRlc2NyID0gIlJvZ3VlIFNjYW4gSW5kaWNhdGlvbiBTdGF0dXMgIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAibm9fZGVsaW1pdGVyIiwgLnZhbCA9IEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX05PX0RFTElNSVRFUiB9LCB7IC5uYW1lID0gIm5vX2FjY2VzcyIsIC52YWwgPSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT19BQ0NFU1MgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJSU1NJIG1lYXN1cmVtZW50IGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRpbWVvdXQiLCAudmFsID0gQkNNT0xUX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fVElNRU9VVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIiwgLmRlc2NyID0gInNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbCByZWFzb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZWRfbW9kZSIsIC52YWwgPSBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9FRF9NT0RFIH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9tb2RlIiwgLnZhbCA9IEJDTU9MVF9TRVJERVNfUkFOR0lOR19NT0RFX0JDRFJfUkVTRVRfTU9ERSB9LCB7IC5uYW1lID0gImZhc3RfbW9kZSIsIC52YWwgPSBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9GQVNUX01PREUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlID0geyAubmFtZSA9ICJiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZSIsIC5kZXNjciA9ICJzZXJkZXMgcmFuZ2luZyBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmFuZ2luZ19tb2RlIiwgLmRlc2NyID0gInJhbmdpbmcgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHJhbmdpbmdfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUgfSwgeyAubmFtZSA9ICJtdWx0aV9lZF9tb2RlIiwgLmRlc2NyID0gIm11bHRpIGVkIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uLCBtdWx0aV9lZF9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCIsIC5kZXNjciA9ICJidXJzdCBlbmFibGUgc3RhcnQgb2Zmc2V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiwgYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJidXJzdF9lbmFibGVfZW5kX29mZnNldCIsIC5kZXNjciA9ICJidXJzdCBlbmFibGUgZW5kIG9mZnNldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24sIGJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImVkX2ludmVydGlvbiIsIC5kZXNjciA9ICJlZCBpbnZlcnRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uLCBlZF9pbnZlcnRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gInNlcmRlcyBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc2VyZGVzX2luc3RhbmNlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImluc3RhbmNlXzAiLCAudmFsID0gQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9JTlNUQU5DRV8wIH0sIHsgLm5hbWUgPSAiaW5zdGFuY2VfMSIsIC52YWwgPSBCQ01PTFRfU0VSREVTX0lOU1RBTkNFX0lOU1RBTkNFXzEgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfaW5zdGFuY2UgPSB7IC5uYW1lID0gImJjbW9sdF9zZXJkZXNfaW5zdGFuY2UiLCAuZGVzY3IgPSAiU2VyRGVzIEluc3RhbmNlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zZXJkZXNfaW5zdGFuY2Vfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXJfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidmVuZG9yX2lkIiwgLmRlc2NyID0gInZlbmRvciBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc2VyaWFsX251bWJlciwgdmVuZG9yX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl80IH0sIHsgLm5hbWUgPSAidmVuZG9yX3NwZWNpZmljIiwgLmRlc2NyID0gInZlbmRvciBzcGVjaWZpYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc2VyaWFsX251bWJlciwgdmVuZG9yX3NwZWNpZmljKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl80IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAiYmNtb2x0X3NlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zZXJpYWxfbnVtYmVyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlcl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3NoYXBlcl9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxheWVyXzEiLCAudmFsID0gQkNNT0xUX1NIQVBFUl9NT0RFX0xBWUVSXzEgfSwgeyAubmFtZSA9ICJsYXllcl8yIiwgLnZhbCA9IEJDTU9MVF9TSEFQRVJfTU9ERV9MQVlFUl8yIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc2hhcGVyX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9zaGFwZXJfbW9kZSIsIC5kZXNjciA9ICJTaGFwZXIgTW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zaGFwZXJfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zaGFwZXJfbW9kZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZW50cnkiLCAudmFsID0gQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9FTlRSWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBzb2Z0d2FyZV9lcnJvcl9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLnZhbCA9IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9LRVlfSURfUkVTRVJWRUQgfSwgeyAubmFtZSA9ICJpbmRleCIsIC52YWwgPSBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX0lEWCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBzb2Z0d2FyZV9lcnJvcl9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYmFuZHdpZHRoX0ticHMiLCAuZGVzY3IgPSAiQmFuZHdpZHRoIChLYnBzKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciwgYmFuZHdpZHRoX0ticHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibWF4X2J1cnN0X3NpemVfdHEiLCAuZGVzY3IgPSAiTWF4IEJ1cnN0IFNpemUgKFRRKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciwgbWF4X2J1cnN0X3NpemVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicHJpb3JpdHkiLCAuZGVzY3IgPSAiUHJpb3JpdHkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIsIHByaW9yaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAid2VpZ2h0X3RxIiwgLmRlc2NyID0gIldlaWdodCAoVFEpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyLCB3ZWlnaHRfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciA9IHsgLm5hbWUgPSAiYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIiLCAuZGVzY3IgPSAiU29saWNpdGVkIFNjaGVkdWxlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc29saWNpdGVkX3NjaGVkdWxlcl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FIH0sIHsgLm5hbWUgPSAicmF0ZV90aHJlc2hvbGQiLCAudmFsID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQgfSwgeyAubmFtZSA9ICJyYXRlX3JhbmdlIiwgLnZhbCA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0UgfSwgeyAubmFtZSA9ICJ2YWx1ZV90aHJlc2hvbGQiLCAudmFsID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUiLCAuZGVzY3IgPSAiQWxsIHBvc3NpYmxlIHN0YXRpc3RpYyBhbGFybSB0cmlnZ2VyIGNvbmRpdGlvbnMuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0eXBlIiwgLmRlc2NyID0gIlR5cGUgb2YgY29uZGl0aW9uIHRvIHRyaWdnZXIgdGhlIGFsYXJtLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZywgdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3RocmVzaG9sZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyaXNpbmciLCAuZGVzY3IgPSAiUmlzaW5nIFRocmVzaG9sZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZywgdS5yYXRlX3RocmVzaG9sZC5yaXNpbmcpIC0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV90aHJlc2hvbGQucmlzaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZhbGxpbmciLCAuZGVzY3IgPSAiVGhlIGFsYXJtIGlzIGNsZWFyZWQgaWYgdGhlIHN0YXRzIGRlbHRhIHZhbHVlIHBlciBzZWNvbmQgYmVjb21lcyBsZXNzIHRoYW4gdGhpcyB0aHJlc2hvbGQgbGV2ZWwuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcpIC0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV90aHJlc2hvbGQucmlzaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfcmF0ZV90aHJlc2hvbGQgPSB7IC5uYW1lID0gImJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfdGhyZXNob2xkIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBBbGFybSBUcmlnZ2VyIENvbmZpZ3VyYXRpb24gUmF0ZSB0aHJlc2hvbGQiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICopMCktPnUucmF0ZV90aHJlc2hvbGQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3RocmVzaG9sZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfdGhyZXNob2xkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfcmF0ZV9yYW5nZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1cHBlciIsIC5kZXNjciA9ICJUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBkZWx0YSB2YWx1ZSBwZXIgc2Vjb25kIGJlY29tZXMgZ3JlYXRlciB0aGFuIHRoaXMgdXBwZXIgbGV2ZWwuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnJhdGVfcmFuZ2UudXBwZXIpIC0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV9yYW5nZS51cHBlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJsb3dlciIsIC5kZXNjciA9ICJUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBkZWx0YSB2YWx1ZSBwZXIgc2Vjb25kIGJlY29tZXMgbGVzcyB0aGFuIHRoaXMgbG93ZXIgbGV2ZWwuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnJhdGVfcmFuZ2UubG93ZXIpIC0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV9yYW5nZS51cHBlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfcmFuZ2UgPSB7IC5uYW1lID0gImJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfcmFuZ2UiLCAuZGVzY3IgPSAiU3RhdGlzdGljIEFsYXJtIFRyaWdnZXIgQ29uZmlndXJhdGlvbiBSYXRlIHJhbmdlIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyAqKTApLT51LnJhdGVfcmFuZ2UpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3JhbmdlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfcmF0ZV9yYW5nZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3ZhbHVlX3RocmVzaG9sZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW1pdCIsIC5kZXNjciA9ICJUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBzYW1wbGUgdmFsdWUgYmVjb21lcyBncmVhdGVyIHRoYW4gdGhpcyBsZXZlbC4gIFRoZSBhbGFybSBpcyBjbGVhcmVkIHdoZW4gdGhlIGhvc3QgY2xlYXJzIHRoZSBzdGF0cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUudmFsdWVfdGhyZXNob2xkLmxpbWl0KSAtIG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnZhbHVlX3RocmVzaG9sZC5saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3ZhbHVlX3RocmVzaG9sZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfdmFsdWVfdGhyZXNob2xkIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBBbGFybSBUcmlnZ2VyIENvbmZpZ3VyYXRpb24gVmFsdWUgdGhyZXNob2xkIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyAqKTApLT51LnZhbHVlX3RocmVzaG9sZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3ZhbHVlX3RocmVzaG9sZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3ZhbHVlX3RocmVzaG9sZF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3VuaW9uX2ZpZWxkc1tdID0geyB7IH0sIHsgLm5hbWUgPSAidS5yYXRlX3RocmVzaG9sZCIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV90aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfdGhyZXNob2xkIH0sIHsgLm5hbWUgPSAidS5yYXRlX3JhbmdlIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZywgdS5yYXRlX3JhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3JhbmdlIH0sIHsgLm5hbWUgPSAidS52YWx1ZV90aHJlc2hvbGQiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnZhbHVlX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfdmFsdWVfdGhyZXNob2xkIH0sIHsgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gdHJpZ2dlciBjb25maWd1cmF0aW9uLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04sIC54ID0geyAudSA9IHsgLm51bV9jb21tb25fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuY29tbW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfZmllbGRzLCAuY2xhc3NpZmllcl9pZHggPSAwLCAudW5pb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ191bmlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFjdGl2ZV9zb2FrX3RpbWUiLCAuZGVzY3IgPSAiQWN0aXZlIFNvYWsgVGltZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZywgYWN0aXZlX3NvYWtfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJjbGVhcl9zb2FrX3RpbWUiLCAuZGVzY3IgPSAiQ2xlYXIgU29hayBUaW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnLCBjbGVhcl9zb2FrX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWciLCAuZGVzY3IgPSAiU3RhdGlzdGljcyBhbGFybSBzb2FraW5nIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidHJpZ2dlciIsIC5kZXNjciA9ICJTdGF0aXN0aWNzIGFsYXJtIHRyaWdnZXIgY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnLCB0cmlnZ2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyB9LCB7IC5uYW1lID0gInNvYWsiLCAuZGVzY3IgPSAiU3RhdGlzdGljcyBhbGFybSBzb2FraW5nIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnLCBzb2FrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfc3RhdF9hbGFybV9jb25maWciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1Igc3RyaW5nXzEwMCA9IHsgLm5hbWUgPSAic3RyaW5nWzEwMF0iLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAxMDAiLCAuc2l6ZSA9IHNpemVvZihjaGFyWzEwMF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJJTkcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDBfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RyIiwgLmRlc2NyID0gIlN0cmluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RyXzEwMCwgc3RyKSwgLnR5cGUgPSAmc3RyaW5nXzEwMCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDAgPSB7IC5uYW1lID0gImJjbW9sdF9zdHJfMTAwIiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggMTAwIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N0cl8xMDApLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1Igc3RyaW5nXzEwMDAgPSB7IC5uYW1lID0gInN0cmluZ1sxMDAwXSIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDEwMDAiLCAuc2l6ZSA9IHNpemVvZihjaGFyWzEwMDBdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSSU5HIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwMF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdHIiLCAuZGVzY3IgPSAiU3RyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdHJfMTAwMCwgc3RyKSwgLnR5cGUgPSAmc3RyaW5nXzEwMDAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwMCA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0cl8xMDAwIiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggMTAwMCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zdHJfMTAwMCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwMF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwMF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHN0cmluZ18yMDAwID0geyAubmFtZSA9ICJzdHJpbmdbMjAwMF0iLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAyMDAwIiwgLnNpemUgPSBzaXplb2YoY2hhclsyMDAwXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzIwMDBfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RyIiwgLmRlc2NyID0gIlN0cmluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RyXzIwMDAsIHN0ciksIC50eXBlID0gJnN0cmluZ18yMDAwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzIwMDAgPSB7IC5uYW1lID0gImJjbW9sdF9zdHJfMjAwMCIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDIwMDAiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RyXzIwMDApLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RyXzIwMDBfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc3RyXzIwMDBfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiBzdHJpbmdfMjU2ID0geyAubmFtZSA9ICJzdHJpbmdbMjU2XSIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDI1NiIsIC5zaXplID0gc2l6ZW9mKGNoYXJbMjU2XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzI1Nl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdHIiLCAuZGVzY3IgPSAiU3RyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdHJfMjU2LCBzdHIpLCAudHlwZSA9ICZzdHJpbmdfMjU2IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzI1NiA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0cl8yNTYiLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAyNTYiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RyXzI1NiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMjU2X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yNTZfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0ciIsIC5kZXNjciA9ICJTdHJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0cl82NCwgc3RyKSwgLnR5cGUgPSAmc3RyaW5nXzY0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0ID0geyAubmFtZSA9ICJiY21vbHRfc3RyXzY0IiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggNjQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RyXzY0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N0cl82NF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfNjRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3dfZXJyb3JfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmlyc3RfZXJyb3JfdGltZV91cyIsIC5kZXNjciA9ICJUaW1lc3RhbXAgKGluIHVzKSB3aGVuIGhpcyBlcnJvciBmaXJzdCBvY2N1cnJlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3dfZXJyb3IsIGZpcnN0X2Vycm9yX3RpbWVfdXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibGFzdF9lcnJvcl90aW1lX3VzIiwgLmRlc2NyID0gIlRpbWVzdGFtcCAoaW4gdXMpIHdoZW4gaGlzIGVycm9yIGxhc3Qgb2NjdXJyZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N3X2Vycm9yLCBsYXN0X2Vycm9yX3RpbWVfdXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibGluZV9udW1iZXIiLCAuZGVzY3IgPSAiTGluZSBOdW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N3X2Vycm9yLCBsaW5lX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJlcnJvcl9jb3VudGVyIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBlcnJvciBoYXMgb2NjdXJyZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N3X2Vycm9yLCBlcnJvcl9jb3VudGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImluc3RhbmNlIiwgLmRlc2NyID0gIkluc3RhbmNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zd19lcnJvciwgaW5zdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZmlsZW5hbWUiLCAuZGVzY3IgPSAiRmlsZW5hbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N3X2Vycm9yLCBmaWxlbmFtZSksIC50eXBlID0gJnN0cmluZ182NCB9LCB7IC5uYW1lID0gInRhc2tfbmFtZSIsIC5kZXNjciA9ICJUYXNrIE5hbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N3X2Vycm9yLCB0YXNrX25hbWUpLCAudHlwZSA9ICZzdHJpbmdfNjQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zd19lcnJvciA9IHsgLm5hbWUgPSAiYmNtb2x0X3N3X2Vycm9yIiwgLmRlc2NyID0gIlNXIEVycm9yIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N3X2Vycm9yKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N3X2Vycm9yX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N3X2Vycm9yX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhY3RpdmUiLCAudmFsID0gQkNNT0xUX1NXSVRDSF9PVkVSX1RZUEVfQ19PTlVfU1RBVEVfQUNUSVZFIH0sIHsgLm5hbWUgPSAiYWN0aXZlX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX1NXSVRDSF9PVkVSX1RZUEVfQ19PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZSIsIC5kZXNjciA9ICJTd2l0Y2ggb3ZlciB0eXBlIGMgb251IHN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zeXN0ZW1fbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJncG9uX18xNl94IiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YIH0sIHsgLm5hbWUgPSAiZ3Bvbl9fOF94IiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1ggfSwgeyAubmFtZSA9ICJncG9uX180X3giLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzRfWCB9LCB7IC5uYW1lID0gImVwb25fXzE2X3giLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1ggfSwgeyAubmFtZSA9ICJ4Z3Bvbl8xX184X3giLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWCB9LCB7IC5uYW1lID0gImVwb25fXzhfeF9jb2V4aXN0ZW5jZV90ZG1hIiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQSB9LCB7IC5uYW1lID0gImFlXzhfeCIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfQUVfOF9YIH0sIHsgLm5hbWUgPSAiZXBvbl9fOF94XzEwX2ciLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HIH0sIHsgLm5hbWUgPSAiZ3Bvbl84X3hncG9uXzRfeF9jb2V4aXN0ZW5jZSIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl84X1hHUE9OXzRfWF9DT0VYSVNURU5DRSB9LCB7IC5uYW1lID0gImVwb25fXzhfeCIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YIH0sIHsgLm5hbWUgPSAiZXBvbl9fNF94IiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1ggfSwgeyAubmFtZSA9ICJlcG9uX180X3hfY29leGlzdGVuY2VfdGRtYSIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUEgfSwgeyAubmFtZSA9ICJlcG9uX180X3hfMTBfZyIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YXzEwX0cgfSwgeyAubmFtZSA9ICJ4Z3NfXzJfeF8xMF9nIiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HIH0sIHsgLm5hbWUgPSAibmdwb24yX18yX3hfMTBfZyIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX18yX1hfMTBfRyB9LCB7IC5uYW1lID0gIm5ncG9uMl9fOF94XzJfcF81X2ciLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fOF9YXzJfUF81X0cgfSwgeyAubmFtZSA9ICJ4Z3Bvbl8xX180X3giLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzRfWCB9LCB7IC5uYW1lID0gImVwb25fXzJfeF8xMF9nIiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18yX1hfMTBfRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfc3lzdGVtX21vZGUiLCAuZGVzY3IgPSAiU3lzdGVtIHdvcmtpbmcgbW9kZSAoR1BPTi9FUE9OIGV0Yy4pIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N5c3RlbV9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3N5c3RlbV9tb2RlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImV4cGFuZGVkX3NwZWN0cnVtX3dpZGVfYmFuZCIsIC52YWwgPSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfRVhQQU5ERURfU1BFQ1RSVU1fV0lERV9CQU5EIH0sIHsgLm5hbWUgPSAiZXhwYW5kZWRfc3BlY3RydW1fcmVkdWNlZF9iYW5kIiwgLnZhbCA9IEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19FWFBBTkRFRF9TUEVDVFJVTV9SRURVQ0VEX0JBTkQgfSwgeyAubmFtZSA9ICJleHBhbmRlZF9zcGVjdHJ1bV9uYXJyb3dfYmFuZCIsIC52YWwgPSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfRVhQQU5ERURfU1BFQ1RSVU1fTkFSUk9XX0JBTkQgfSwgeyAubmFtZSA9ICJzaGFyZWRfc3BlY3RydW1fd2lkZV9iYW5kIiwgLnZhbCA9IEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19TSEFSRURfU1BFQ1RSVU1fV0lERV9CQU5EIH0sIHsgLm5hbWUgPSAic2hhcmVkX3NwZWN0cnVtX3JlZHVjZWRfYmFuZCIsIC52YWwgPSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfU0hBUkVEX1NQRUNUUlVNX1JFRFVDRURfQkFORCB9LCB7IC5uYW1lID0gInNoYXJlZF9zcGVjdHJ1bV9uYXJyb3dfYmFuZCIsIC52YWwgPSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfU0hBUkVEX1NQRUNUUlVNX05BUlJPV19CQU5EIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMgPSB7IC5uYW1lID0gImJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyIsIC5kZXNjciA9ICJVUyBvcGVyYXRpbmcgd2F2ZWxlbmd0aCBiYW5kcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kc19zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX3Byb2ZpbGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmdfMl9zeXNfaWQiLCAuZGVzY3IgPSAiMjAtYml0IGlkZW50aWZpZXIgb2YgdGhlIE5HUE9OMiBzeXN0ZW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N5c3RlbV9wcm9maWxlLCBuZ18yX3N5c19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ2ZXJzaW9uIiwgLmRlc2NyID0gIlN5c3RlbSBwcm9maWxlIHZlcnNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N5c3RlbV9wcm9maWxlLCB2ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiY2hhbm5lbF9zcGFjaW5nIiwgLmRlc2NyID0gIkFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgY2hhbm5lbCBzcGFjaW5nIGluIHVuaXRzIG9mIDFHSHoiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N5c3RlbV9wcm9maWxlLCBjaGFubmVsX3NwYWNpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ1c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyIsIC5kZXNjciA9ICJVcHN0cmVhbSBvcGVyYXRpbmcgd2F2ZWxlbmd0aCBiYW5kcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3lzdGVtX3Byb2ZpbGUsIHVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMgfSwgeyAubmFtZSA9ICJ1c19tc2UiLCAuZGVzY3IgPSAiVXBzdHJlYW0gTWF4aW11bSBTcGVjdHJhbCBFeGN1cnNpb24gKE1TRSkgcmVwcmVzZW50ZWQgYXMgYW4gdW5zaWduZWQgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSB2YWx1ZSBpbiB1bml0cyBvZiAxR0h6IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSwgdXNfbXNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9vc2VfY2FsaWJyYXRpb25fYm91bmQiLCAuZGVzY3IgPSAiU3BlY3RyYWwgZXhjdXJzaW9uIGJvdW5kIGJlbG93IHdoaWNoIGEgVFdETSBPTlUgY2FuIGJlIGNvbnNpZGVyZWQgYXMgbG9vc2VseSBjYWxpYnJhdGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSwgbG9vc2VfY2FsaWJyYXRpb25fYm91bmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQgfSwgeyAubmFtZSA9ICJmc3IiLCAuZGVzY3IgPSAiSWYgYSBjeWNsaWMgV00gaXMgdXNlZCBpbiB0aGUgdXBzdHJlYW0sIEZyZWUgU3BlY3RyYWwgUmFuZ2UgaW5kaWNhdGVzIHRoZSB2YWx1ZSBpbiB1bml0cyBvZiAwLjEgR0h6IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSwgZnNyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInR3ZG1fY2hhbm5lbF9jb3VudCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIENoYW5uZWxfUHJvZmlsZSBQTE9BTSBtZXNzYWdlcyB3aXRoIGRpc3RpbmN0IENoYW5uZWwgUHJvZmlsZSBpbmRpY2VzIHRoYXQgYW4gT05VIGNhbiBleHBlY3QgdG8gcmVjZWl2ZSB3aGlsZSBsaXN0ZW5pbmcgdG8gdGhpcyBkb3duc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3lzdGVtX3Byb2ZpbGUsIHR3ZG1fY2hhbm5lbF9jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9wcm9maWxlID0geyAubmFtZSA9ICJiY21vbHRfc3lzdGVtX3Byb2ZpbGUiLCAuZGVzY3IgPSAiU3lzdGVtIHByb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3lzdGVtX3Byb2ZpbGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX3Byb2ZpbGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX3Byb2ZpbGVfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3VjY2VzcyIsIC52YWwgPSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVQ0NFU1MgfSwgeyAubmFtZSA9ICJmYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfRkFJTFVSRSB9LCB7IC5uYW1lID0gInN1c3BlY3RlZF9sb3MiLCAudmFsID0gQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVVNQRUNURURfTE9TIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0ID0geyAubmFtZSA9ICJiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IiwgLmRlc2NyID0gIlRyYWZmaWMgcmVzdW1lIHJlc3VsdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGF0YV93aW5kb3ciLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9EQVRBX1dJTkRPVyB9LCB7IC5uYW1lID0gInN0cm9iZV93aW5kb3ciLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9TVFJPQkVfV0lORE9XIH0sIHsgLm5hbWUgPSAiZWRnZV9yaXNlX21pbl9taW4iLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUlOX01JTiB9LCB7IC5uYW1lID0gImVkZ2VfcmlzZV9taW5fbWF4IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NQVggfSwgeyAubmFtZSA9ICJlZGdlX3Jpc2VfbWF4X21pbiIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUlOIH0sIHsgLm5hbWUgPSAiZWRnZV9yaXNlX21heF9tYXgiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUFYX01BWCB9LCB7IC5uYW1lID0gImVkZ2VfZmFsbF9taW5fbWluIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NSU4gfSwgeyAubmFtZSA9ICJlZGdlX2ZhbGxfbWluX21heCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYIH0sIHsgLm5hbWUgPSAiZWRnZV9mYWxsX21heF9taW4iLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUFYX01JTiB9LCB7IC5uYW1lID0gImVkZ2VfZmFsbF9tYXhfbWF4IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NQVggfSwgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9SRVNVTFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9LRVlfSURfUkVTRVJWRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB0cnhfY2FsaWJyYXRpb25fa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gInRyaWdnZXIiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSIH0sIHsgLm5hbWUgPSAic3Ryb2JlIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFIH0sIHsgLm5hbWUgPSAid2luZG93X21vZGUiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX09OVV9JRCB9LCB7IC5uYW1lID0gInRyaWdnZXJfcG9zaXRpb24iLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OIH0sIHsgLm5hbWUgPSAic3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVE9QX0RVRV9UT19DT1JSVVBUX1NUUk9CRSB9LCB7IC5uYW1lID0gInN0YXJ0X29mZnNldCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUQVJUX09GRlNFVCB9LCB7IC5uYW1lID0gImVuZF9vZmZzZXQiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9FTkRfT0ZGU0VUIH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX2N5Y2xlcyIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX05VTUJFUl9PRl9DWUNMRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWQgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1dfSURfUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB0cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9zdGF0IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9FUE9OX1NUQVQgfSwgeyAubmFtZSA9ICJncG9uX2JjZHJfcmVzZXQiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fQkNEUl9SRVNFVCB9LCB7IC5uYW1lID0gImdwb25fdHJ4X3Jlc2V0IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1RSWF9SRVNFVCB9LCB7IC5uYW1lID0gImdwb25fdHJ4X2VkIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1RSWF9FRCB9LCB7IC5uYW1lID0gImdwb25fcnNzaSIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfR1BPTl9SU1NJIH0sIHsgLm5hbWUgPSAiZ3Bvbl9lb2IiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fRU9CIH0sIHsgLm5hbWUgPSAiZ3Bvbl9yYW5naW5nIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1JBTkdJTkcgfSwgeyAubmFtZSA9ICJzZXJkZXNfYnVyc3RfZW4iLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX1NFUkRFU19CVVJTVF9FTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXIiLCAuZGVzY3IgPSAidHJ4IGNhbGlicmF0aW9uIHRyaWdnZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmlzaW5nIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9QT1NJVElPTl9SSVNJTkcgfSwgeyAubmFtZSA9ICJmYWxsaW5nIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9QT1NJVElPTl9GQUxMSU5HIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbiIsIC5kZXNjciA9ICJ0cnggY2FsaWJyYXRpb24gdHJpZ2dlciBwb3NpdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmFuZ2luZyIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX1JBTkdJTkcgfSwgeyAubmFtZSA9ICJub25fcmFuZ2luZyIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX05PTl9SQU5HSU5HIH0sIHsgLm5hbWUgPSAiYm90aCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX0JPVEggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUiLCAuZGVzY3IgPSAidHJ4IGNhbGlicmF0aW9uIHdpbmRvdyBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl8zID0geyAubmFtZSA9ICJ1aW50OF90WzNdIiwgLmRlc2NyID0gIkFycmF5IG9mIDMgZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFszXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfZGVsaW1pdGVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBhdHRlcm4iLCAuZGVzY3IgPSAicGF0dGVybiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2RlbGltaXRlciwgcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfMyB9LCB7IC5uYW1lID0gInNpemUiLCAuZGVzY3IgPSAiU2l6ZSBpbiBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2RlbGltaXRlciwgc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIndpbmRvd19zaXplIiwgLmRlc2NyID0gIldpbmRvdyBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZGVsaW1pdGVyLCB3aW5kb3dfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9kZWxpbWl0ZXIgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfZGVsaW1pdGVyIiwgLmRlc2NyID0gIlRSWCBEZWxpbWl0ZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2RlbGltaXRlciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfZGVsaW1pdGVyX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9kZWxpbWl0ZXJfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2VuZXJneV9kZXRlY3RfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmFuZ2luZ19lZF9zb3VyY2UiLCAuZGVzY3IgPSAiUmFuZ2luZyBFRCBzb3VyY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0LCByYW5naW5nX2VkX3NvdXJjZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIH0sIHsgLm5hbWUgPSAiZGVsaW1pdGVyX2VkX3NvdXJjZSIsIC5kZXNjciA9ICJEZWxpbWl0ZXIgRUQgc291cmNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCwgZGVsaW1pdGVyX2VkX3NvdXJjZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIH0sIHsgLm5hbWUgPSAibWluaW11bV90aHJlc2hvbGQiLCAuZGVzY3IgPSAiTWluaW11bSB0aHJlc2hvbGQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0LCBtaW5pbXVtX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm1heGltdW1fdGhyZXNob2xkIiwgLmRlc2NyID0gIk1heGltdW0gdGhyZXNob2xkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCwgbWF4aW11bV90aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJlZF9wYXR0ZXJuIiwgLmRlc2NyID0gIkVEIHBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0LCBlZF9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZWRfcGF0dGVybl9zaXplIiwgLmRlc2NyID0gIkVEIHBhdHRlcm4gc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QsIGVkX3BhdHRlcm5fc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIndpbmRvd19zaXplIiwgLmRlc2NyID0gIldpbmRvdyBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCwgd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJpbnZlcnNpb24iLCAuZGVzY3IgPSAiSW52ZXJzaW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCwgaW52ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibm9fZWRfdGhyZXNob2xkIiwgLmRlc2NyID0gIm5vIGVkIHRocmVzaG9sZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QsIG5vX2VkX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0ID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QiLCAuZGVzY3IgPSAiVFJYIEVuZXJneSBkZXRlY3QiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdHJ4X2VuZXJneV9kZXRlY3RfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2VuZXJneV9kZXRlY3RfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3ByZWFtYmxlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInR5cGVfMV9zaXplIiwgLmRlc2NyID0gIlR5cGUgMSBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfcHJlYW1ibGUsIHR5cGVfMV9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHlwZV8yX3NpemUiLCAuZGVzY3IgPSAiVHlwZSAyIHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9wcmVhbWJsZSwgdHlwZV8yX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eXBlXzNfcHJlX3Jhbmdpbmdfc2l6ZSIsIC5kZXNjciA9ICJUeXBlIDMgcHJlIHJhbmdpbmcgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X3ByZWFtYmxlLCB0eXBlXzNfcHJlX3Jhbmdpbmdfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSIsIC5kZXNjciA9ICJUeXBlIDMgcG9zdCByYW5naW5nIHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9wcmVhbWJsZSwgdHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHlwZV8zX3BhdHRlcm4iLCAuZGVzY3IgPSAiVHlwZSAzIHBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9wcmVhbWJsZSwgdHlwZV8zX3BhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcHJlYW1ibGUgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfcHJlYW1ibGUiLCAuZGVzY3IgPSAiVFJYIFByZWFtYmxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9wcmVhbWJsZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcHJlYW1ibGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3ByZWFtYmxlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIndhaXRfd2luZG93X3NpemUiLCAuZGVzY3IgPSAiV2FpdCBXaW5kb3cgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24sIHdhaXRfd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJSYW5naW5nIGFjY2VzcyB3aW5kb3cgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24sIHJhbmdpbmdfYWNjZXNzX3dpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJUUlggUlggY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNwc180M180OF9oX2hwX2NkZV9zZF8yMDEzIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9TUFNfNDNfNDhfSF9IUF9DREVfU0RfMjAxMyB9LCB7IC5uYW1lID0gInNvZ180MzIxX3BzZ2IiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX1NPR180MzIxX1BTR0IgfSwgeyAubmFtZSA9ICJsdGVfMzY4MF9tIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9MVEVfMzY4MF9NIH0sIHsgLm5hbWUgPSAic291cmNlX3Bob3RvbmljcyIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfU09VUkNFX1BIT1RPTklDUyB9LCB7IC5uYW1lID0gImx0ZV8zNjgwX3BfdHlwZV9jX3BsdXMiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfVFlQRV9DX1BMVVMgfSwgeyAubmFtZSA9ICJhbnkiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX0FOWSB9LCB7IC5uYW1lID0gImFueV9yZXNldF9ndWFyZCIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfQU5ZX1JFU0VUX0dVQVJEIH0sIHsgLm5hbWUgPSAiYW55X3Jlc2V0X3ByZWFtYmxlIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9BTllfUkVTRVRfUFJFQU1CTEUgfSwgeyAubmFtZSA9ICJ3dGRfcnR4bV8xNjdfNTI2X2NwbHVzIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9XVERfUlRYTV8xNjdfNTI2X0NQTFVTIH0sIHsgLm5hbWUgPSAid3RkX3J0eG1fMTY3XzUyMl9icGx1cyIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfV1REX1JUWE1fMTY3XzUyMl9CUExVUyB9LCB7IC5uYW1lID0gImx0ZV8zNjgwX3BfYmMiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfQkMgfSwgeyAubmFtZSA9ICJzb2dxXzQzMjFfcHNnYl9jX3BsdXMiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX1NPR1FfNDMyMV9QU0dCX0NfUExVUyB9LCB7IC5uYW1lID0gInd0ZF9ydHhtMTY3XzUyMSIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfV1REX1JUWE0xNjdfNTIxIH0sIHsgLm5hbWUgPSAibHRlMzY3OCIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfTFRFMzY3OCB9LCB7IC5uYW1lID0gInNvZ3BfNDMyMV9wc2dhIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9TT0dQXzQzMjFfUFNHQSB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF8xIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMSB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF8yIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMiB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF8zIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMyB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF80IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNCB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF81IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNSB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF82IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNiB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF83IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNyB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF84IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfOCB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF85IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfOSB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF8xMCIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzEwIH0sIHsgLm5hbWUgPSAiZ3Bvbl9nZW5lcmFsXzExIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMTEgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyeF90eXBlIiwgLmRlc2NyID0gIlRSWCB0eXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF90eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyeF90eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfVFVORV9JTl9GQUlMX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAibm9fdHVuaW5nX3Jlc3BvbnNlX3Bsb2FtX3JlY2VpdmVkIiwgLnZhbCA9IEJDTU9MVF9UVU5FX0lOX0ZBSUxfUkVBU09OX05PX1RVTklOR19SRVNQT05TRV9QTE9BTV9SRUNFSVZFRCB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX2ZhaWxlZCIsIC52YWwgPSBCQ01PTFRfVFVORV9JTl9GQUlMX1JFQVNPTl9PTlVfQUNUSVZBVElPTl9GQUlMRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90dW5lX2luX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJUdW5lIGluIGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAibmFja19wbG9hbV9yZWNlaXZlZCIsIC52YWwgPSBCQ01PTFRfVFVORV9PVVRfRkFJTF9SRUFTT05fTkFDS19QTE9BTV9SRUNFSVZFRCB9LCB7IC5uYW1lID0gIm5vX3R1bmluZ19yZXNwb25zZV9wbG9hbV9yZWNlaXZlZCIsIC52YWwgPSBCQ01PTFRfVFVORV9PVVRfRkFJTF9SRUFTT05fTk9fVFVOSU5HX1JFU1BPTlNFX1BMT0FNX1JFQ0VJVkVEIH0sIHsgLm5hbWUgPSAidHNvdXJjZV90aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9UU09VUkNFX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJyb2xsYmFja19yZXF1ZXN0IiwgLnZhbCA9IEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9ST0xMQkFDS19SRVFVRVNUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJUdW5lIG91dCBmYWlsIHJlYXNvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggPSB7IC5uYW1lID0gImJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTMyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCwgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gNTAwIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNl9oZXggPSB7IC5uYW1lID0gImJjbW9sdF91OF9saXN0X3UxNl9oZXgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdThfbGlzdF91MTZfaGV4KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9oZXgsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZih1aW50OF90KSB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgPSB7IC5uYW1lID0gImJjbW9sdF91OF9saXN0X3UzMiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBVOCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91OF9saXN0X3UzMiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZih1aW50OF90KSB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggPSB7IC5uYW1lID0gImJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBVOCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IDIwNDggfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3VhcnRfYmF1ZHJhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidWFydF9yYXRlXzQ4MDAiLCAudmFsID0gQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzQ4MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfOTYwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfOTYwMCB9LCB7IC5uYW1lID0gInVhcnRfcmF0ZV8xNDQwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMTQ0MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfMTkyMDAiLCAudmFsID0gQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzE5MjAwIH0sIHsgLm5hbWUgPSAidWFydF9yYXRlXzM4NDAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8zODQwMCB9LCB7IC5uYW1lID0gInVhcnRfcmF0ZV81NzYwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfNTc2MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfMTE1MjAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8xMTUyMDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfMjMwNDAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8yMzA0MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfMzgwNDAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8zODA0MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfNDYwODAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV80NjA4MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfOTIxNjAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV85MjE2MDAgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91YXJ0X2JhdWRyYXRlID0geyAubmFtZSA9ICJiY21vbHRfdWFydF9iYXVkcmF0ZSIsIC5kZXNjciA9ICJVQVJUIGJhdWQgcmF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91YXJ0X2JhdWRyYXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3VhcnRfYmF1ZHJhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ViZF9pbmZvX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFjdHVhbF9wb2xsaW5nX2ludGVydmFsIiwgLmRlc2NyID0gIlVuaXRzOiA2NS41MzZ1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdWJkX2luZm8sIGFjdHVhbF9wb2xsaW5nX2ludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImFjdHVhbF9ncmFudF90aHJlc2hvbGRfdHEiLCAuZGVzY3IgPSAiQWN0dWFsIEdyYW50IFRocmVzaG9sZCAoVFEpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF91YmRfaW5mbywgYWN0dWFsX2dyYW50X3RocmVzaG9sZF90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlciIsIC5kZXNjciA9ICJBY3R1YWwgTWluIFNjaGVkdWxlci9TaGFwZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ViZF9pbmZvLCBhY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgfSwgeyAubmFtZSA9ICJhY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlciIsIC5kZXNjciA9ICJBY3R1YWwgTWF4IFNjaGVkdWxlci9TaGFwZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ViZF9pbmZvLCBhY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91YmRfaW5mbyA9IHsgLm5hbWUgPSAiYmNtb2x0X3ViZF9pbmZvIiwgLmRlc2NyID0gIlVCRCBJbmZvIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ViZF9pbmZvKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3ViZF9pbmZvX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3ViZF9pbmZvX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9sbGluZ19pbnRlcnZhbF91cyIsIC5kZXNjciA9ICJQb2xsaW5nIEludGVydmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uLCBwb2xsaW5nX2ludGVydmFsX3VzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9sbGluZ19pbnRlcnZhbCB9LCB7IC5uYW1lID0gImdyYW50X3RocmVzaG9sZF90cSIsIC5kZXNjciA9ICJHcmFudCBUaHJlc2hvbGQgKFRRKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiwgZ3JhbnRfdGhyZXNob2xkX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1pbl9zY2hlZHVsZXJzaGFwZXIiLCAuZGVzY3IgPSAiTWluIFNjaGVkdWxlci9TaGFwZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24sIG1pbl9zY2hlZHVsZXJzaGFwZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyIH0sIHsgLm5hbWUgPSAibWF4X3NjaGVkdWxlcnNoYXBlciIsIC5kZXNjciA9ICJNYXggU2NoZWR1bGVyL1NoYXBlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiwgbWF4X3NjaGVkdWxlcnNoYXBlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgfSwgeyAubmFtZSA9ICJ0ZG1fZ3JhbnRfc2l6ZV90cSIsIC5kZXNjciA9ICJURE0gR3JhbnQgU2l6ZSAoVFEpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uLCB0ZG1fZ3JhbnRfc2l6ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ0ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMiLCAuZGVzY3IgPSAiSW50ZXJ2YWwgYmV0d2VlbiBURE0gZ3JhbnRzIChpbiB1cykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uLCB0ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24iLCAuZGVzY3IgPSAiVGhlIHVwc3RyZWFtIGJhbmR3aWR0aCBkaXN0cmlidXRpb24gZm9yIHRoaXMgTExJRC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkYXRhIiwgLnZhbCA9IEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9EQVRBIH0sIHsgLm5hbWUgPSAiY3B1IiwgLnZhbCA9IEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9DUFUgfSwgeyAubmFtZSA9ICJvbWNpIiwgLnZhbCA9IEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9PTUNJIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiIsIC5kZXNjciA9ICJ1c19nZW1fcG9ydF9kZXN0aW5hdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91c192bGFuX2FjdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhZGQiLCAudmFsID0gQkNNT0xUX1VTX1ZMQU5fQUNUSU9OX0FERCB9LCB7IC5uYW1lID0gInRyYW5zcGFyZW50IiwgLnZhbCA9IEJDTU9MVF9VU19WTEFOX0FDVElPTl9UUkFOU1BBUkVOVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3VzX3ZsYW5fYWN0aW9uID0geyAubmFtZSA9ICJiY21vbHRfdXNfdmxhbl9hY3Rpb24iLCAuZGVzY3IgPSAiVVMgVkxBTiBhY3Rpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdXNfdmxhbl9hY3Rpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdXNfdmxhbl9hY3Rpb25fc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ZsYW5fdGFnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInZsYW5faWQiLCAuZGVzY3IgPSAiVkxBTiBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdmxhbl90YWcsIHZsYW5faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAicGJpdCIsIC5kZXNjciA9ICJQYml0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF92bGFuX3RhZywgcGJpdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ZsYW5fdGFnID0geyAubmFtZSA9ICJiY21vbHRfdmxhbl90YWciLCAuZGVzY3IgPSAiVkxBTiB0YWciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdmxhbl90YWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdmxhbl90YWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdmxhbl90YWdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2Rfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidmlkIiwgLnZhbCA9IEJDTU9MVF9WTEFOX1RPX0ZMT1dfTUFQUElOR19NRVRIT0RfVklEIH0sIHsgLm5hbWUgPSAibWFjcGx1c3ZpZCIsIC52YWwgPSBCQ01PTFRfVkxBTl9UT19GTE9XX01BUFBJTkdfTUVUSE9EX01BQ1BMVVNWSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QgPSB7IC5uYW1lID0gImJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QiLCAuZGVzY3IgPSAiVkxBTiB0byBmbG93IG1hcHBpbmcgbWV0aG9kIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2Rfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU1RBVEUgfSwgeyAubmFtZSA9ICJzbGEiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TTEEgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJjb2xsZWN0X3N0YXRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX3VzZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRCB9LCB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQgfSwgeyAubmFtZSA9ICJhdmVyYWdlX3NyX3JlcG9ydCIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibnVtX29mX2N5Y2xlcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fYWxsb2NfZ2V0X3N0YXRzIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19zZXRfc3RhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fYWxsb2Nfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlIiwgLmRlc2NyID0gIlhHUE9OIEFsbG9jIFdpdGggU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHhncG9uX2FsbG9jX3dpdGhfc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gMzIgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9lZF9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNldF9vbl9lZF9mYWlsIiwgLmRlc2NyID0gInJlc2V0IG9uIEVEIGZhaWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2VkX3N0YXRlLCByZXNldF9vbl9lZF9mYWlsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmVzZXRfb25fZWRfc3VjY2VzcyIsIC5kZXNjciA9ICJyZXNldCBvbiBFRCBzdWNjZXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSwgcmVzZXRfb25fZWRfc3VjY2VzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2VkX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZWRfc3RhdGUiLCAuZGVzY3IgPSAieGdwb24gZWQgc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZWRfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZWRfc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZWRfc3RhdGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgeGdwb25fZ2VtX2lkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90LCAubGVuX3NpemUgPSAxLCAubWF4X3NpemUgPSAxNiB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTkZJR1VSQVRJT04gfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFIH0sIHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9tb2RlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfRU5DUllQVElPTl9NT0RFIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSB9LCB7IC5uYW1lID0gImNvbnRyb2wiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JIH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInR4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTIH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm90X2NvbmZpZ3VyZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRFX05PVF9DT05GSUdVUkVEIH0sIHsgLm5hbWUgPSAiaW5hY3RpdmUiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRFX0lOQUNUSVZFIH0sIHsgLm5hbWUgPSAiYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlIiwgLmRlc2NyID0gIlhHUE9OIEdFTSBQb3J0IFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImdlbV9pZCIsIC5kZXNjciA9ICJHRU0gSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUsIGdlbV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIiwgLmRlc2NyID0gIlhHUE9OIEdFTSBQb3J0IFdpdGggU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gMTI4IH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gMjU2IH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInVzX290YWdfZGlyZWN0X3RwaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCB9LCB7IC5uYW1lID0gImRzX3RwaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfRFNfVFBJRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2l3Zl9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25faXdmX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25faXdmX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9pd2Zfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbnRlcnZhbCIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgcHJvY2VzcyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSwgaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGVcXGRpc2FibGUgcGVyaW9kaWMgcHJvY2VzcyBvZiBLZXkgRXhjaGFuZ2UgZm9yIGFjdGl2ZSBPTlVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAiZW5jcnlwdGVkX3BvcnRzX29ubHkiLCAuZGVzY3IgPSAiUGVyZm9ybSBrZXkgZXhjaGFuZ2Ugb25seSB0byBPTlVzIHdpdGggR0VNIHBvcnRzIHRoYXQgaGF2ZSBkb3duc3RyZWFtIGVuY3J5cHRpb24gZW5hYmxlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlLCBlbmNyeXB0ZWRfcG9ydHNfb25seSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UiLCAuZGVzY3IgPSAiWEdQT04gS2V5IEV4Y2hhbmdlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2VfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAia2V5IiwgLmRlc2NyID0gIkFFUyBlbmNyeXB0aW9uIGtleSBmb3IgbXVsdGljc2F0IFhHRU0gcG9ydCBJRHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXksIGtleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJrZXlfY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGVcXERpc2FibGUgZW5jcnlwdGlvbiBvbiBtdWx0aWNhc3QgWEdFTSBwb3J0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSwga2V5X2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSIsIC5kZXNjciA9ICJYR1BPTiBNdWx0aWNhc3Qga2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfU0VSSUFMX05VTUJFUiB9LCB7IC5uYW1lID0gImZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTiB9LCB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImNwdV9wYWNrZXRzX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUgfSwgeyAubmFtZSA9ICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgfSwgeyAubmFtZSA9ICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQgfSwgeyAubmFtZSA9ICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAibG9zIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MgfSwgeyAubmFtZSA9ICJvbnVfZGlzY292ZXJlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQgfSwgeyAubmFtZSA9ICJvbnVfdXBncmFkZV9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUgfSwgeyAubmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUIH0sIHsgLm5hbWUgPSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgeyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAidG9kX3JlcXVlc3RfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBsb2FtIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJod19wb25faWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9IV19QT05fSUQgfSwgeyAubmFtZSA9ICJhdmFpbGFibGVfYmFuZHdpZHRoIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9hY3RpdmVfb251cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfT05VUyB9LCB7IC5uYW1lID0gInBvbl9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fU1RBVFVTIH0sIHsgLm5hbWUgPSAicG9uX2Rpc3RhbmNlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFIH0sIHsgLm5hbWUgPSAicmFuZ2luZ193aW5kb3dfc2l6ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUgfSwgeyAubmFtZSA9ICJlcWRfY3ljbGVzX251bWJlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSIH0sIHsgLm5hbWUgPSAiZHJpZnRfY29udHJvbCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wgfSwgeyAubmFtZSA9ICJsb3NfYWxhcm1fdGhyZXNob2xkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCB9LCB7IC5uYW1lID0gImxvc19pbml0aWFsX3ZhbHVlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm1zX3RocmVzaG9sZHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMgfSwgeyAubmFtZSA9ICJiZXJfbW9uaXRvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SIH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTiB9LCB7IC5uYW1lID0gInNuX2FjcXVpc2l0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04gfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2UiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWciLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19ERUJVRyB9LCB7IC5uYW1lID0gImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFIH0sIHsgLm5hbWUgPSAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSB9LCB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UIH0sIHsgLm5hbWUgPSAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTIH0sIHsgLm5hbWUgPSAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcgfSwgeyAubmFtZSA9ICJkYmFfbW9kZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9NT0RFIH0sIHsgLm5hbWUgPSAicGxvYW1faGFuZGxpbmciLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QTE9BTV9IQU5ETElORyB9LCB7IC5uYW1lID0gIm1pbl9kYXRhX2FsbG9jX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQgfSwgeyAubmFtZSA9ICJtaW5fZGF0YV9nZW1fcG9ydF9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lEIH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2tleSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVkgfSwgeyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIgfSwgeyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SIH0sIHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUyB9LCB7IC5uYW1lID0gImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04gfSwgeyAubmFtZSA9ICJ1c19iYW5kd2lkdGhfbGltaXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQgfSwgeyAubmFtZSA9ICJhbGxfb251cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FMTF9PTlVTIH0sIHsgLm5hbWUgPSAiYWxsX21jYXN0X2dlbV9wb3J0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FMTF9NQ0FTVF9HRU1fUE9SVFMgfSwgeyAubmFtZSA9ICJkZWJ1ZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfcGFyYW1zIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TIH0sIHsgLm5hbWUgPSAiZHNfZmVjX21vZGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSB9LCB7IC5uYW1lID0gImRiYV90eXBlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX1RZUEUgfSwgeyAubmFtZSA9ICJvbnVfdHVuaW5nIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1RVTklORyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcnJvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUiB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSB9LCB7IC5uYW1lID0gImNhbGNfY3JjIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2xpc3QiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfY3B1X3BhY2tldHMgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kZWJ1Z19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbmNyZWFzZV9hdmFpbGFibGVfY2JyX2J3IiwgLmRlc2NyID0gIlVzZSBpbmNyZWFzZSBhdmFpbGFibGUgQ0JSIGJhbmR3aWR0aCBmb3IgYmV0dGVyIEJXIHV0aWxpemF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZywgaW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImludGVyX2J1cnN0X2dhcF9pbl9ieXRlcyIsIC5kZXNjciA9ICJHYXAgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgYnVyc3RzIGZvciB0aGUgc2FtZSBPTlUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2RlYnVnLCBpbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251IiwgLmRlc2NyID0gIk51bWJlciBvZiBnZW0gcG9ydHMgcGVyIG9udSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGVidWcsIG51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2RlYnVnIiwgLmRlc2NyID0gIlhHUE9OIE5JIERlYnVnIHBhcmFtZXRlcnMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfZGVidWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfZGVidWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfZGVidWdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29udHJvbCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfbG9zX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfTE9TX0lEX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2xvc19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2xvc19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9sb3MgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2xvc19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUiB9LCB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTIH0sIHsgLm5hbWUgPSAiY3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9ET1dOU1RSRUFNX1BPTl9JRCB9LCB7IC5uYW1lID0gImN1cnJlbnRfdXBzdHJlYW1fcG9uX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DVVJSRU5UX1VQU1RSRUFNX1BPTl9JRCB9LCB7IC5uYW1lID0gImNhbGlicmF0aW9uX3JlY29yZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ0FMSUJSQVRJT05fUkVDT1JEIH0sIHsgLm5hbWUgPSAidHVuaW5nX2dyYW51bGFyaXR5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9UVU5JTkdfR1JBTlVMQVJJVFkgfSwgeyAubmFtZSA9ICJzdGVwX3R1bmluZ190aW1lIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TVEVQX1RVTklOR19USU1FIH0sIHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0FUVEVOVUFUSU9OIH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfb251X2Rpc2NvdmVyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib251cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3Jlc2V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFIH0sIHsgLm5hbWUgPSAibWVhc3VyZW1lbnRfc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUyB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCB9LCB7IC5uYW1lID0gImlzX2RlbGluZWF0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OIH0sIHsgLm5hbWUgPSAiaXNfZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQgfSwgeyAubmFtZSA9ICJyeF9kYXRhIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEgfSwgeyAubmFtZSA9ICJwbG9hbV9yZWNlaXZlZF9vbnVfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEIH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfbWljX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX01JQ19FUlJPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFIH0sIHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEIH0sIHsgLm5hbWUgPSAic2Vjb25kX3Jhbmdpbmdfd2luZG93IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibnVtYmVyX29mX2N5Y2xlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfTlVNQkVSX09GX0NZQ0xFIH0sIHsgLm5hbWUgPSAiYWxsb2NhdGlvbl9udW1iZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9BTExPQ0FUSU9OX05VTUJFUiB9LCB7IC5uYW1lID0gImJ3X21hcF9hcnJheSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0JXX01BUF9BUlJBWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXAgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc2V0X29udV9zdGF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3NldF9wb25fc3RhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJudW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSIH0sIHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdF9zaWduYWwiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3N0YXJ0X29udV91cGdyYWRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3JkcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTIH0sIHsgLm5hbWUgPSAiYmlwMzJfYnl0ZXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfQllURVMgfSwgeyAubmFtZSA9ICJiaXAzMl9lcnJvcnMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfeGd0Y19oZWFkZXJzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfSEVBREVSUyB9LCB7IC5uYW1lID0gInJ4X3hndGNfY29ycmVjdGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVEIH0sIHsgLm5hbWUgPSAicnhfeGd0Y191bmNvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVEIH0sIHsgLm5hbWUgPSAicnhfeGdlbSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNIH0sIHsgLm5hbWUgPSAicnhfeGdlbV9kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRCB9LCB7IC5uYW1lID0gInJ4X3hnZW1faWRsZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0lETEUgfSwgeyAubmFtZSA9ICJyeF94Z2VtX2NvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0NPUlJFQ1RFRCB9LCB7IC5uYW1lID0gInJ4X2NyY19lcnJvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9mcmFnbWVudF9lcnJvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUiB9LCB7IC5uYW1lID0gInJ4X3BhY2tldHNfZHJvcHBlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQgfSwgeyAubmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19zaG9ydCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCB9LCB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX2xvbmciLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORyB9LCB7IC5uYW1lID0gInJ4X2tleV9lcnJvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1IgfSwgeyAubmFtZSA9ICJ0eF9wbG9hbXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUExPQU1TIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc192YWxpZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRCB9LCB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2ludmFsaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCB9LCB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUyB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfZXJyb3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfY3B1IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NQVSB9LCB7IC5uYW1lID0gInJ4X29tY2kiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSSB9LCB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUyB9LCB7IC5uYW1lID0gInR4X3hnZW0iLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTSB9LCB7IC5uYW1lID0gInR4X2NwdSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFUgfSwgeyAubmFtZSA9ICJ0eF9vbWNpIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0kgfSwgeyAubmFtZSA9ICJ0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEIH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIIH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF90cGlkX21pc3MiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MgfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX3ZpZF9taXNzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUIH0sIHsgLm5hbWUgPSAicHJldmlvdXNfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUgfSwgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORyB9LCB7IC5uYW1lID0gInNmYyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQyB9LCB7IC5uYW1lID0gInJ0Y19vZmZzZXRfc2VjIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMgfSwgeyAubmFtZSA9ICJydGNfb2Zmc2V0X25zZWMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX05TRUMgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfdG9kX3JlcXVlc3QgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX251bV9vZl9vbnVzX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInhncG9uX3N1cHBvcnRfMjU2X29udXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05VTV9PRl9PTlVTX1hHUE9OX1NVUFBPUlRfMjU2X09OVVMgfSwgeyAubmFtZSA9ICJ4Z3Bvbl9zdXBwb3J0XzUxMF9vbnVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OVU1fT0ZfT05VU19YR1BPTl9TVVBQT1JUXzUxMF9PTlVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbnVtX29mX29udXMgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyIsIC5kZXNjciA9ICJ4Z3BvbiBudW0gb2Ygb251cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251c19zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlIiwgLmRlc2NyID0gIlBlcmZvcm0gc2luZ2xlIGtleSBleGNoYW5nZSBkdXJpbmcgYWN0aXZhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uLCBrZXlfZXhjaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAiZmFpbF9kdWVfdG9fcmVnaXNfYXV0b19mYWlsIiwgLmRlc2NyID0gIkRlYWN0aXZhdGUgT05VIGR1ZSB0byByZWdpc3RyYXRpb24gYXV0aGVudGljYXRpb24gZmFpbHVyZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24sIGZhaWxfZHVlX3RvX3JlZ2lzX2F1dG9fZmFpbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIiwgLmRlc2NyID0gIlhHUE9OIE9OVSBBY3RpdmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTiB9LCB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9rZXkiLCAuZGVzY3IgPSAiZW5jcnlwdGlvbiBrZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hZXNfa2V5LCBlbmNyeXB0aW9uX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJrZXlfaW5kZXgiLCAuZGVzY3IgPSAia2V5IGluZGV4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSwga2V5X2luZGV4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSIsIC5kZXNjciA9ICJYR1BPTiBPTlUgQUVTIEtFWSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9zaSIsIC5kZXNjciA9ICJMb3NzIG9mIHNpZ25hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBsb3NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9iaSIsIC5kZXNjciA9ICJMb3NzIG9mIGJ1cnN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGxvYmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb3BjaSIsIC5kZXNjciA9ICJMb3NzIG9mIFBMT0FNIGNoYW5uZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgbG9wY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb3BjaV9taWNfZXJyb3IiLCAuZGVzY3IgPSAiTWljIGVycm9yIG9uIHBsb2FtIGNoYW5uZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgbG9wY2lfbWljX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9vY2kiLCAuZGVzY3IgPSAiTG9zcyBvZiBPTUNJIGNoYW5uZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgbG9vY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLmRlc2NyID0gIlRyYW5zbWlzc2lvbiBpbnRlcmZlcmVuY2UgQWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgdGl3aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRvd2kiLCAuZGVzY3IgPSAiRHJpZnQgb2YgV2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGRvd2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJzdWZpIiwgLmRlc2NyID0gIlN0YXJ0IFVQIEZhaWx1cmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgc3VmaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gInNmaSIsIC5kZXNjciA9ICJTaWduYWwgRmFpbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBzZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJzZGkiLCAuZGVzY3IgPSAiU2lnbmFsIERlZ3JhZGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUsIHNkaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRmaSIsIC5kZXNjciA9ICJEZWFjdGl2YXRpb24gRmFpbHVyZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBkZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJkZ2kiLCAuZGVzY3IgPSAiRHlpbmcgZ2FzcCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBkZ2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJwcXNpIiwgLmRlc2NyID0gIlBsb2FtIHF1ZXVlIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBwcXNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlhHUE9OIE9OVSBhbGFybSBzdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsb3NpIiwgLmRlc2NyID0gIkxPU2kiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybXMsIGxvc2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb2JpIiwgLmRlc2NyID0gIkxPQmkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybXMsIGxvYmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb3BjaV9taXNzIiwgLmRlc2NyID0gIkxPUENpIG1pc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybXMsIGxvcGNpX21pc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb3BjaV9taWNfZXJyb3IiLCAuZGVzY3IgPSAiTE9QQ2kgbWljIGVycm9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zLCBsb3BjaV9taWNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2FsYXJtcyIsIC5kZXNjciA9ICJYR1BPTiBPTlUgYWxhcm1zIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hbGFybXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsb3NpIiwgLmRlc2NyID0gIlRocmVzaG9sZCBmb3IgYXNzZXJ0aW5nIExPU2kgYWxhcm0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvc2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb2JpIiwgLmRlc2NyID0gIlRocmVzaG9sZCBmb3IgYXNzZXJ0aW5nIExPQmkgYWxhcm0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvYmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb29jaSIsIC5kZXNjciA9ICJUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT09DaSBhbGFybS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkcywgbG9vY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb3BjaSIsIC5kZXNjciA9ICJUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT1BDaSBhbGFybS4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvcGNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIiwgLmRlc2NyID0gIlhHUE9OIE9OVSBhbGFybXMgdGhyZXNob2xkcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkZmkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ERkkgfSwgeyAubmFtZSA9ICJkZ2kiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ER0kgfSwgeyAubmFtZSA9ICJkb3dpIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSB9LCB7IC5uYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0ggfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUIH0sIHsgLm5hbWUgPSAibG9vY2kiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9MT09DSSB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9udV9hbGFybSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSB9LCB7IC5uYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib251X3R1bmluZ19pbl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9wdGljYWxfcmVmbGVjdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTiB9LCB7IC5uYW1lID0gInBvc3NpYmxlX2RyaWZ0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQgfSwgeyAubmFtZSA9ICJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbF9yZXBvcnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9MRVZFTF9SRVBPUlQgfSwgeyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFIH0sIHsgLm5hbWUgPSAicHFzaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kgfSwgeyAubmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkVHSVNUUkFUSU9OX0lEIH0sIHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInNkaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NESSB9LCB7IC5uYW1lID0gInNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSB9LCB7IC5uYW1lID0gInNmaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NGSSB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgeyAubmFtZSA9ICJzdWZpIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSB9LCB7IC5uYW1lID0gInRpd2kiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9USVdJIH0sIHsgLm5hbWUgPSAidHVuaW5nX3Jlc3BvbnNlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVFVOSU5HX1JFU1BPTlNFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUgfSwgeyAubmFtZSA9ICJvbnVfb2xkX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9PTERfU1RBVEUgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUyB9LCB7IC5uYW1lID0gImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSURfQVVUT19MRUFSTklORyB9LCB7IC5uYW1lID0gInJhbmdpbmdfYnVyc3RfcHJvZmlsZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEUgfSwgeyAubmFtZSA9ICJkYXRhX2J1cnN0X3Byb2ZpbGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFIH0sIHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSB9LCB7IC5uYW1lID0gImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkgfSwgeyAubmFtZSA9ICJkZWFjdGl2YXRpb25fcmVhc29uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04gfSwgeyAubmFtZSA9ICJhbGxfZ2VtX3BvcnRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMgfSwgeyAubmFtZSA9ICJhbGxfYWxsb2NzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MgfSwgeyAubmFtZSA9ICJleHRlbmRlZF9ndWFyZF90aW1lIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUgfSwgeyAubmFtZSA9ICJ1c19saW5lX3JhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFIH0sIHsgLm5hbWUgPSAiY2FsaWJyYXRpb25fcmVjb3JkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NBTElCUkFUSU9OX1JFQ09SRCB9LCB7IC5uYW1lID0gInR1bmluZ19ncmFudWxhcml0eSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFkgfSwgeyAubmFtZSA9ICJzdGVwX3R1bmluZ190aW1lIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NURVBfVFVOSU5HX1RJTUUgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMgfSwgeyAubmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0NPTlRST0wgfSwgeyAubmFtZSA9ICJhdHRlbnVhdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQVRURU5VQVRJT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lEIH0sIHsgLm5hbWUgPSAiY3JjX29rIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0sgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUEFDS0VUX1NJWkUgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2NwdV9wYWNrZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFIH0sIHsgLm5hbWUgPSAiY2FsY19jcmMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wYWNrZXRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFIH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9jcHVfcGFja2V0cyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2RmaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfZGZpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9kZmlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2RnaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RnaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9kZ2lfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2RnaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2RnaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTIH0sIHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFIH0sIHsgLm5hbWUgPSAibmV3X2VxZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfTkVXX0VRRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kb3dpX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2Rvd2lfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2Rvd2kgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9kb3dpX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZXFkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9lcWQsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJlcWQiLCAuZGVzY3IgPSAiRVFEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZXFkLCBlcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2VxZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9lcWQiLCAuZGVzY3IgPSAiWEdQT04gT05VIEVRRCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZXFkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9lcWRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2VxZF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHhncG9uX29udV9lcWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZXFkLCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtb2x0X3hncG9uX29udV9lcWQpIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9nZXRfcG93ZXJfbGV2ZWwgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfQUxMT0NfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJuZXdfa2V5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXhwZWN0ZWRfa2V5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkgfSwgeyAubmFtZSA9ICJyZWNlaXZlZF9rZXkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX1JFQ0VJVkVEX0tFWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9sb29jaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9sb29jaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfbG9vY2kgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9sb29jaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvcnRfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lEIH0sIHsgLm5hbWUgPSAiY3JjX29rIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LIH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb21jaV9wYWNrZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04gfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0lEIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib251X2FsYXJtIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfYWxhcm0gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9SRVNVTFQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfdHVuaW5nX2luIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9SRVNVTFQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidGFyZ2V0X2RzX3Bvbl9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQgfSwgeyAubmFtZSA9ICJ0YXJnZXRfdXNfcG9uX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRCB9LCB7IC5uYW1lID0gInRpbWVfdG9fc3dpdGNoIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0ggfSwgeyAubmFtZSA9ICJyb2xsYmFjayIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1JPTExCQUNLIH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfdHVuaW5nX291dCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRlZmF1bHRfa2V5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX0RFRkFVTFRfS0VZIH0sIHsgLm5hbWUgPSAicGxvYW0iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcGxvYW1fcGFja2V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUyB9LCB7IC5uYW1lID0gImVzdGltYXRlZF9kcmlmdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlRfSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfQVRURU5VQVRJT04gfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0eSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib2xkX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFIH0sIHsgLm5hbWUgPSAicmVhc29uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9QUVNJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wcXNpX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Bxc2lfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3Bxc2kgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wcXNpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9wcXNpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIHsgLm5hbWUgPSAiZXFkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFEIH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX3Bsb2FtcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRUdJU1RSQVRJT05fSUQgfSwgeyAubmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTIH0sIHsgLm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwbG9hbV9payIsIC5kZXNjciA9ICJwbG9hbSBpayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzLCBwbG9hbV9payksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJvbWNpX2lrIiwgLmRlc2NyID0gIm9tY2kgaWsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cywgb21jaV9payksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJvbWNpX2sxIiwgLmRlc2NyID0gIm9tY2kgazEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cywgb21jaV9rMSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJvbWNpX2syIiwgLmRlc2NyID0gIm9tY2kgazIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cywgb21jaV9rMiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJrZWsiLCAuZGVzY3IgPSAia2VrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMsIGtlayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMiLCAuZGVzY3IgPSAiWEdQT04gT05VIHJlZ2lzdHJhdGlvbiBrZXlzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNtYV9mbGFnIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfU01BX0ZMQUcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9yc3NpX21lYXN1cmVtZW50IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJiZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NkaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZGlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3NkaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NkaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX0ZBSUxfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1hc3Rlcl9rZXkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX01BU1RFUl9LRVkgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX0JVRkZFUiB9LCB7IC5uYW1lID0gIm1pYyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9zZXRfb251X3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJiZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NmaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZmlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3NmaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NmaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9zaXRpdmVfZHJpZnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUIH0sIHsgLm5hbWUgPSAibmVnYXRpdmVfZHJpZnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUIH0sIHsgLm5hbWUgPSAiZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT04gfSwgeyAubmFtZSA9ICJiaXAzMl9lcnJvcnMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0JJUDMyX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X3dvcmRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUyB9LCB7IC5uYW1lID0gImZlY19jb3JyZWN0ZWRfc3ltYm9scyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9TWU1CT0xTIH0sIHsgLm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTIH0sIHsgLm5hbWUgPSAiZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfVU5DT1JSRUNUQUJMRV9DT0RFV09SRFMgfSwgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTIH0sIHsgLm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9iaXRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFMgfSwgeyAubmFtZSA9ICJ4Z2VtX2tleV9lcnJvcnMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUyB9LCB7IC5uYW1lID0gInhnZW1fbG9zcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9MT1NTIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX21pY19lcnJvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX01JQ19FUlJPUiB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFIH0sIHsgLm5hbWUgPSAicnhfb21jaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSSB9LCB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfQllURVMgfSwgeyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTIH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N1ZmlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3VmaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N1ZmlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3N1ZmlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Rpd2lfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV90aXdpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV90aXdpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFjayIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9BQ0sgfSwgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfUkVTVUxUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3R1bmluZ19yZXNwb25zZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIlN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlIiwgLmRlc2NyID0gIlhHUE9OIE9OVSBXaXRoIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgeGdwb25fb251X3dpdGhfc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gNTEwIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWNrX3RpbWVvdXQiLCAuZGVzY3IgPSAiVGltZW91dCBmb3IgcmVjZWl2aW5nIEFDSyBwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcsIGFja190aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJldHJhbnNfcmFuZ2luZ190aW1lIiwgLmRlc2NyID0gIk51bWJlciBvZiBSYW5naW5nIFRpbWUgcGxvYW0gcmV0cmFuc21pc3Npb25zIGluIGNhc2Ugb2YgQUNLIHRpbWVvdXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nLCByZXRyYW5zX3JhbmdpbmdfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJldHJhbnNfYXNzaWduX2FsbG9jX2lkIiwgLmRlc2NyID0gIk51bWJlciBvZiBBc3NpZ24gQWxsb2MgSUQgcGxvYW0gcmV0cmFuc21pc3Npb25zIGluIGNhc2Ugb2YgQUNLIHRpbWVvdXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nLCByZXRyYW5zX2Fzc2lnbl9hbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJldHJhbnNfa2V5X2NvbnRyb2wiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIEtleSBDb250cm9sIHBsb2FtIHJldHJhbnNtaXNzaW9ucyBpbiBjYXNlIG9mIEFDSyB0aW1lb3V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZywgcmV0cmFuc19rZXlfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24iLCAuZGVzY3IgPSAiTnVtYmVyIG9mIFJlcXVlc3QgUmVnaXN0cmF0aW9uIHBsb2FtIHJldHJhbnNtaXNzaW9ucyBpbiBjYXNlIG9mIEFDSyB0aW1lb3V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZywgcmV0cmFuc19yZXF1ZXN0X3JlZ2lzdHJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmciLCAuZGVzY3IgPSAiWEdQT04gUExPQU0gaGFuZGxpbmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidGltZW91dCIsIC5kZXNjciA9ICJMT1Mgc3dpdGNoIG92ZXIgdGltZW91dCBpbiBtaWxsaXNlY29uZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nLCB0aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImdwaW9fcGluIiwgLmRlc2NyID0gIkdQSU8gcGluIGZvciBpbnB1dC9vdXRwdXQgc2lnbmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZywgZ3Bpb19waW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiB9LCB7IC5uYW1lID0gImZhc3RfcmFuZ2luZyIsIC5kZXNjciA9ICJmYXN0IHJhbmdpbmcgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZywgZmFzdF9yYW5naW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyIsIC5kZXNjciA9ICJYR1BPTiBwcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRhdGFfbWFwX2RlbGF5X21zIiwgLmRlc2NyID0gImRlbGF5IHRvIHdhaXQgYWZ0ZXIgc2VuZGluZyByYW5naW5nIHRpbWUgZGVsdGEgYmVmb3JlIHJ1bm5pbmcgdGhlIGRhdGEgbWFwICAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLCBkYXRhX21hcF9kZWxheV9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJyZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lIiwgLmRlc2NyID0gIlNob3VsZCB0aGUgU00gc2VuZCB0aGUgY3VycmVudCByYW5naW5nIHRpbWUgYmVmb3JlIGRvaW5nIHRoZSByZS1yYW5naW5nICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcsIHJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5IiwgLmRlc2NyID0gInRoZSBkZWxheSBiZXR3ZWVuIHNlbmRpbmcgdGhlIHJhbmdpbmcgdGltZSBhbmQgc3RhcnRpbmcgdGhlIHJlcmFuZ2UgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZywgcmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZV9kZWxheSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIiwgLmRlc2NyID0gInhncG9uIHByb3RlY3Rpb24gc3dpdGNoaW5nIGRlYnVnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb2xhcml0eSIsIC5kZXNjciA9ICJSU1NJIHNpZ25hbCBwb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnLCBwb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BvbGFyaXR5IH0sIHsgLm5hbWUgPSAibG9jYXRpb24iLCAuZGVzY3IgPSAiUlNTSSBzaWduYWwgbG9jYXRpb24gaW4gd29yZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZywgbG9jYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb2NhdGlvbl9zaWduIiwgLmRlc2NyID0gIlJTU0kgc2lnbmFsIGxvY2F0aW9uIHNpZ24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZywgbG9jYXRpb25fc2lnbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NpZ24gfSwgeyAubmFtZSA9ICJwdWxzZV93aWR0aCIsIC5kZXNjciA9ICJSU1NJIHB1bHNlIHdpZHRoIGluIHdvcmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcsIHB1bHNlX3dpZHRoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1pbmltdW1fYnVyc3QiLCAuZGVzY3IgPSAiRGF0YSBtaW5pbXVtIGJ1cnN0IHNpemUgaW4gd29yZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZywgbWluaW11bV9idXJzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWciLCAuZGVzY3IgPSAiWEdQT04gUlNTSSBub3JtYWwgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZ19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXJ0X29uX2VkIiwgLmRlc2NyID0gInN0YXJ0IG9uIEVEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnLCBzdGFydF9vbl9lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImZyYW1lX2RlbGF5IiwgLmRlc2NyID0gImZyYW1lIGRlbGF5IGZyb20gRUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcsIGZyYW1lX2RlbGF5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAid29yZF9kZWxheSIsIC5kZXNjciA9ICJ3b3JkIGRlbGF5IGZyb20gRUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcsIHdvcmRfZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZnJhbWVfZGVsYXlfYWZ0ZXJfZWQiLCAuZGVzY3IgPSAiZnJhbWUgZGVsYXkgZnJvbSBzdGFydCAgb2YgcmFuZ2luZyB3aW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcsIGZyYW1lX2RlbGF5X2FmdGVyX2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAid29yZF9kZWxheV9hZnRlcl9lZCIsIC5kZXNjciA9ICJ3b3JkIGRlbGF5IGZyb20gc3RhcnQgIG9mIHJhbmdpbmcgd2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnLCB3b3JkX2RlbGF5X2FmdGVyX2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnIiwgLmRlc2NyID0gInhncG9uIHJzc2kgcmFuZ2luZyBjb25maWciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IiwgLmRlc2NyID0gInRyeCByZXNldCBwYXR0ZXJuIGZpcnN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIHRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJ0cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiLCAuZGVzY3IgPSAidHJ4IHJlc2V0IHBhdHRlcm4gbWlkZGxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIHRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAidHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIsIC5kZXNjciA9ICJ0cnggcmVzZXQgcGF0dGVybiBsYXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIHRyeF9yZXNldF9wYXR0ZXJuX2xhc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gInRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyIsIC5kZXNjciA9ICJ0cnggcmVzZXQgbWlkZGxlIHJlcGVhdHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiwgdHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHJ4X3Jlc2V0X2xvY2F0aW9uIiwgLmRlc2NyID0gInRyeCByZXNldCBsb2NhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuLCB0cnhfcmVzZXRfbG9jYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJiY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QiLCAuZGVzY3IgPSAiYmNkciByZXNldCBwYXR0ZXJuIGZpcnN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIGJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IHBhdHRlcm4gbWlkZGxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIGJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfcGF0dGVybl9sYXN0IiwgLmRlc2NyID0gImJjZHIgcmVzZXQgcGF0dGVybiBsYXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIGJjZHJfcmVzZXRfcGF0dGVybl9sYXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJiY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzIiwgLmRlc2NyID0gImJjZHIgcmVzZXQgbWlkZGxlIHJlcGVhdHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiwgYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfbG9jYXRpb24iLCAuZGVzY3IgPSAiYmNkciByZXNldCBsb2NhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuLCBiY2RyX3Jlc2V0X2xvY2F0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wb2xhcml0eSIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IHBvbGFyaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIGJjZHJfcmVzZXRfcG9sYXJpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4iLCAuZGVzY3IgPSAieGdwb24gcnggcmFuZ2luZyBTTSBwYXR0ZXJucyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX1NFUkRFU19SQU5HSU5HX01PREVfRUQgfSwgeyAubmFtZSA9ICJiY2RyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0JDRFIgfSwgeyAubmFtZSA9ICJmYXN0X3JhbmdpbmcxIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0ZBU1RfUkFOR0lORzEgfSwgeyAubmFtZSA9ICJmYXN0X3JhbmdpbmcyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0ZBU1RfUkFOR0lORzIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZSIsIC5kZXNjciA9ICJ4Z3BvbiBzZXJkZXMgcmFuZ2luZyBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibXVsdGlfZWRfbW9kZSIsIC5kZXNjciA9ICJtdWx0aSBlZCBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiwgbXVsdGlfZWRfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJhbmdpbmdfbW9kZSIsIC5kZXNjciA9ICJyYW5naW5nIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uLCByYW5naW5nX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJ4Z3BvbiBzZXJkZXMgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbnRlcnZhbCIsIC5kZXNjciA9ICJTTiBwcm9jZXNzIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24sIGludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiU04gcHJvY2VzcyBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJvbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSIsIC5kZXNjciA9ICJBdXRvbWF0aWMgb3BlcmF0aW9uIGZvbGxvd2luZyBPTlUgZGlzY292ZXJ5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiwgb251X3Bvc3RfZGlzY292ZXJ5X21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSB9LCB7IC5uYW1lID0gImJ1cnN0X3Byb2ZpbGUiLCAuZGVzY3IgPSAiQnVyc3QgcHJvZmlsZSBpbmRleCB0byB1c2UgZHVyaW5nIFNOIGFjcXVpc2l0aW9uIHdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24sIGJ1cnN0X3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIiwgLmRlc2NyID0gIlhHUE9OIFNOIEFjcXVpc2l0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJidXJzdF9wcm9maWxlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEUgfSwgeyAubmFtZSA9ICJ0cmFuc2NlaXZlcl9jb25maWciLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHIH0sIHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfdHlwZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFIH0sIHsgLm5hbWUgPSAiZGVidWciLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfREVCVUcgfSwgeyAubmFtZSA9ICJyc3NpX25vcm1hbF9jb25maWciLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHIH0sIHsgLm5hbWUgPSAicnNzaV9yYW5naW5nX2NvbmZpZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHIH0sIHsgLm5hbWUgPSAic2VyZGVzX2NvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04gfSwgeyAubmFtZSA9ICJidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMgfSwgeyAubmFtZSA9ICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfRURfRkFJTFVSRSB9LCB7IC5uYW1lID0gInJlc2V0X29uX2RlbF9taXNzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JFU0VUX09OX0RFTF9NSVNTIH0sIHsgLm5hbWUgPSAiZWRfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRURfU1RBVEUgfSwgeyAubmFtZSA9ICJpbnZlcnRfZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfSU5WRVJUX0VEIH0sIHsgLm5hbWUgPSAiZW5kX29mX2J1cnN0X3Jlc2V0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVCB9LCB7IC5uYW1lID0gInRyeF9yc3RfcG9sYXJpdHkiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX3RyeF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2RlYnVnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJ4X3JldmVyc2VkX3BvbGFyaXR5IiwgLmRlc2NyID0gInRyYW5zY2VpdmVyIHJldmVyc2VkIHBvbGFyaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfZGVidWcsIHJ4X3JldmVyc2VkX3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gIm5lZ19vdXRfYml0IiwgLmRlc2NyID0gInR1cm4gYWxsIDEgdG8gMCBhbmQgYWxsIDAgdG8gMSBhdCB0aGUgb3V0cHV0LiBkZWZhdWx0IGlzIG5vdCB0byBtYWtlIG5lZ2F0aXZlIGJpdHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZywgbmVnX291dF9iaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2RlYnVnID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X2RlYnVnIiwgLmRlc2NyID0gInhncG9uX3RyeF9kZWJ1ZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfZGVidWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2RlYnVnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9kZWJ1Z19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX3RyeF9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX3RyeF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fdHJ4X2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl90cnhfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsdGhfNzIyMl9wYyIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRIXzcyMjJfUEMgfSwgeyAubmFtZSA9ICJ1c2VyX2RlZmluZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1VTRVJfREVGSU5FRCB9LCB7IC5uYW1lID0gInd0ZF9ydHhtMjY2XzcwMiIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfV1REX1JUWE0yNjZfNzAyIH0sIHsgLm5hbWUgPSAibHRoXzcyMjJfYmNfcGx1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRIXzcyMjJfQkNfUExVUyB9LCB7IC5uYW1lID0gImx0aF83MjI2X3BjIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVEhfNzIyNl9QQyB9LCB7IC5uYW1lID0gImx0aF81MzAyX3BjIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVEhfNTMwMl9QQyB9LCB7IC5uYW1lID0gInhncG9uX2dlbmVyYWxfMSIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfWEdQT05fR0VORVJBTF8xIH0sIHsgLm5hbWUgPSAieGdwb25fZ2VuZXJhbF8yIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9YR1BPTl9HRU5FUkFMXzIgfSwgeyAubmFtZSA9ICJsdHdfNjI3X3hfcGMiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUV182MjdfWF9QQyB9LCB7IC5uYW1lID0gInhwcF94ZV9yXzNfY2RmYiIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfWFBQX1hFX1JfM19DREZCIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X3R5cGUgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl90cnhfdHlwZSIsIC5kZXNjciA9ICJYR1BPTiBUUlggdHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl90cnhfdHlwZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicnhfdmdhIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfVkdBIH0sIHsgLm5hbWUgPSAicnhfcGYiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRiB9LCB7IC5uYW1lID0gInJ4X2xmcGYiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGIH0sIHsgLm5hbWUgPSAicnhfZGZlMSIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEgfSwgeyAubmFtZSA9ICJyeF9kZmUyIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMiB9LCB7IC5uYW1lID0gInJ4X2RmZTMiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzIH0sIHsgLm5hbWUgPSAicnhfZGZlNCIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQgfSwgeyAubmFtZSA9ICJyeF9kZmU1IiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNSB9LCB7IC5uYW1lID0gInR4X3ByZSIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BSRSB9LCB7IC5uYW1lID0gInR4X21haW4iLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOIH0sIHsgLm5hbWUgPSAidHhfcG9zdDEiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSB9LCB7IC5uYW1lID0gInR4X3Bvc3QyIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDIgfSwgeyAubmFtZSA9ICJ0eF9wb3N0MyIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzIH0sIHsgLm5hbWUgPSAidHhfYW1wIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhwb25fc2VyZGVzX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfUE9OX05JIH0sIHsgLm5hbWUgPSAiaW5zdGFuY2UiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4cG9uX3NlcmRlc19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKKworLyogPT09PSBPYmplY3Q6IGFlX25pID09PT0gKi8KKworLyogR3JvdXA6IGFlX25pIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfbmlfa2V5X2FlX25pID0geyAubmFtZSA9ICJhZV9uaSIsIC5kZXNjciA9ICJUaGUgaW5kZXggb2YgYSBzcGVjaWZpYyBBRSBOSSBpbnN0YW5jZSBhcyBzZWVuIGJ5IHRoZSBob3N0LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9OSV9LRVlfSURfQUVfTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfa2V5LCBhZV9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9uaV9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9uaV9rZXlfYWVfbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZV9uaSIsIC5kZXNjciA9ICJUaGUgaW5kZXggb2YgYSBzcGVjaWZpYyBBRSBOSSBpbnN0YW5jZSBhcyBzZWVuIGJ5IHRoZSBob3N0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfa2V5LCBhZV9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9uaV9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX25pX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX25pIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfbmlfY2ZnX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgdXNlZCBmb3IgYWxsIGZyYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIE9MVCBvbiB0aGUgbmV0d29yay4gIFRoaXMgdmFsdWUgbXVzdCBiZSBzZXQgYmVmb3JlIEFFX05JIGlzIGZpcnN0IGVuYWJsZWQsIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgQUVfTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9uaV9jZmdfYWVfbmlfZW4gPSB7IC5uYW1lID0gImFlX25pX2VuIiwgLmRlc2NyID0gIkluZGljYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBBRSBOSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIGFlX25pX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfZW5fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9uaV9jZmdfbXR1XzEwZyA9IHsgLm5hbWUgPSAibXR1XzEwZyIsIC5kZXNjciA9ICJNYXhpbXVtIGZyYW1lIHNpemUgKGluY2x1ZGluZyBGQ1MpIG9uIHRoZSAxMEcgcGF0aC4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBBRV9OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX01UVV8xMEcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIG10dV8xMGcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfbmlfY2ZnX3ByYnNfZ2VuZXJhdG9yID0geyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgcHJic19nZW5lcmF0b3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9uaV9jZmdfcHJic19jaGVja2VyID0geyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAuZGVzY3IgPSAiVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgcHJic19jaGVja2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX25pX2NmZ19wcmJzX3N0YXR1cyA9IHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAuZGVzY3IgPSAiUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgcHJic19zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX25pX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX25pX2NmZ19tYWNfYWRkcmVzcywgJnByb3BfZGVzY3JfYWVfbmlfY2ZnX2FlX25pX2VuLCAmcHJvcF9kZXNjcl9hZV9uaV9jZmdfbXR1XzEwZywgJnByb3BfZGVzY3JfYWVfbmlfY2ZnX3ByYnNfZ2VuZXJhdG9yLCAmcHJvcF9kZXNjcl9hZV9uaV9jZmdfcHJic19jaGVja2VyLCAmcHJvcF9kZXNjcl9hZV9uaV9jZmdfcHJic19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBNQUMgYWRkcmVzcyB1c2VkIGZvciBhbGwgZnJhbWVzIGdlbmVyYXRlZCBieSB0aGUgT0xUIG9uIHRoZSBuZXR3b3JrLiAgVGhpcyB2YWx1ZSBtdXN0IGJlIHNldCBiZWZvcmUgQUVfTkkgaXMgZmlyc3QgZW5hYmxlZCwgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBBRV9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gImFlX25pX2VuIiwgLmRlc2NyID0gIkluZGljYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBBRSBOSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBhZV9uaV9lbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2VuX3N0YXRlIH0sIHsgLm5hbWUgPSAibXR1XzEwZyIsIC5kZXNjciA9ICJNYXhpbXVtIGZyYW1lIHNpemUgKGluY2x1ZGluZyBGQ1MpIG9uIHRoZSAxMEcgcGF0aC4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBBRV9OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBtdHVfMTBnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLmRlc2NyID0gIkRTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBwcmJzX2dlbmVyYXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC5kZXNjciA9ICJVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfSwgeyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgcHJic19zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfbmlfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX25pIC0gc2V0X2FlX25pX2VuX3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfZW5fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAiTmV3IEVQT04gTkkgZW5hYmxlIHN0YXRlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2VuX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgdGhlIEFFIE5JIGVuYWJsZSBzdGF0ZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogYWVfcGF0aF9kcyA9PT09ICovCisKKy8qIEdyb3VwOiBhZV9wYXRoX2RzIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19rZXlfYWVfbmkgPSB7IC5uYW1lID0gImFlX25pIiwgLmRlc2NyID0gIkFFIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDEwRyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfS0VZX0lEX0FFX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5LCBhZV9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX2RzX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfa2V5X2FlX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZV9uaSIsIC5kZXNjciA9ICJBRSBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19rZXksIGFlX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF9kc19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfZHMgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2J5dGVzID0geyAubmFtZSA9ICJieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzID0geyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc182NCA9IHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc182NV8xMjcgPSB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzEyOF8yNTUgPSB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18yNTZfNTExID0geyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfNTEyXzEwMjMgPSB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4ID0geyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18xNTE5XzIwNDcgPSB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSA9IHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2ID0geyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc185MjE3XzE2MzgzID0geyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9icm9hZGNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBicm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9kYXRhX2J5dGVzID0geyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9EQVRBX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBkYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9tdWx0aWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBtdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF91bmljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2Fib3J0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfcGF0aF9kc19zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2J5dGVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzY0LCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzY1XzEyNywgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzI1Nl81MTEsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfNTEyXzEwMjMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NywgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9icm9hZGNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZGF0YV9ieXRlcywgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X211bHRpY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF91bmljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2Fib3J0X2ZyYW1lcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCB1bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFib3J0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX2RzIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfcGF0aF9kc19zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX2RzIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX2RzIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfZHMgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX2RzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGFlX3BhdGhfdXMgPT09PSAqLworCisvKiBHcm91cDogYWVfcGF0aF91cyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfa2V5X2FlX25pID0geyAubmFtZSA9ICJhZV9uaSIsIC5kZXNjciA9ICJBRSBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19LRVlfSURfQUVfTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19rZXksIGFlX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX3BhdGhfdXNfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF91c19rZXlfYWVfbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFlX25pIiwgLmRlc2NyID0gIkFFIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDEwRyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19rZXksIGFlX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfdXMgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2J5dGVzID0geyAubmFtZSA9ICJieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzY0ID0geyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc182NV8xMjcgPSB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzI1Nl81MTEgPSB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfNTEyXzEwMjMgPSB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NyA9IHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSA9IHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMgPSB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9icm9hZGNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZGF0YV9ieXRlcyA9IHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0RBVEFfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGRhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X211bHRpY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBtdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF91bmljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9hYm9ydF9mcmFtZXMgPSB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2Zjc19lcnJvciA9IHsgLm5hbWUgPSAiZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZDU19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZmNzX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9vdmVyc2l6ZV9lcnJvciA9IHsgLm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBvdmVyc2l6ZV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfcnVudF9lcnJvciA9IHsgLm5hbWUgPSAicnVudF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBydW50X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX3BhdGhfdXNfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9ieXRlcywgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lcywgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc182NCwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfMTI4XzI1NSwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc18yNTZfNTExLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc18xNTE5XzIwNDcsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc185MjE3XzE2MzgzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2RhdGFfYnl0ZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9tdWx0aWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfdW5pY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9hYm9ydF9mcmFtZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mY3NfZXJyb3IsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9vdmVyc2l6ZV9lcnJvciwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X3J1bnRfZXJyb3IgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBicm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGFib3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmY3NfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZjc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJvdmVyc2l6ZV9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIG92ZXJzaXplX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ1bnRfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIHJ1bnRfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfdXMgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfdXMgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfdXMgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogYWVfcGF0aF91cyAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX3BhdGhfdXNfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogY2hhbm5lbCA9PT09ICovCisKKy8qIEdyb3VwOiBjaGFubmVsIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfY2hhbm5lbF9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0NIQU5ORUxfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgY2hhbm5lbF9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9jaGFubmVsX2tleV9wb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2NoYW5uZWxfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9jaGFubmVsX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBjaGFubmVsIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfY2hhbm5lbF9jZmdfb3BlcmF0aW9uX2NvbnRyb2wgPSB7IC5uYW1lID0gIm9wZXJhdGlvbl9jb250cm9sIiwgLmRlc2NyID0gIk9wZXJhdGlvbiBjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEsIG9wZXJhdGlvbl9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9jaGFubmVsX2NmZ190b2wgPSB7IC5uYW1lID0gInRvbCIsIC5kZXNjciA9ICJUcmFuc21pdCBPcHRpY2FsIExldmVsLiBBbiBpbmRpY2F0aW9uIG9mIHRoZSBjdXJyZW50IE9MVCBDVCB0cmFuc2NlaXZlciBjaGFubmVsIGxhdW5jaCBwb3dlciBpbnRvIHRoZSBPRE4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfVE9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEsIHRvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9jaGFubmVsX2NmZ19zeXN0ZW1fcHJvZmlsZSA9IHsgLm5hbWUgPSAic3lzdGVtX3Byb2ZpbGUiLCAuZGVzY3IgPSAiU3lzdGVtIHByb2ZpbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSwgc3lzdGVtX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zeXN0ZW1fcHJvZmlsZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2NoYW5uZWxfY2ZnX2NoYW5uZWxfcHJvZmlsZSA9IHsgLm5hbWUgPSAiY2hhbm5lbF9wcm9maWxlIiwgLmRlc2NyID0gIkNoYW5uZWwgcHJvZmlsZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9DSEFOTkVMX1BST0ZJTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSwgY2hhbm5lbF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgY2hhbm5lbF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9jaGFubmVsX2NmZ19vcGVyYXRpb25fY29udHJvbCwgJnByb3BfZGVzY3JfY2hhbm5lbF9jZmdfdG9sLCAmcHJvcF9kZXNjcl9jaGFubmVsX2NmZ19zeXN0ZW1fcHJvZmlsZSwgJnByb3BfZGVzY3JfY2hhbm5lbF9jZmdfY2hhbm5lbF9wcm9maWxlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9wZXJhdGlvbl9jb250cm9sIiwgLmRlc2NyID0gIk9wZXJhdGlvbiBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhLCBvcGVyYXRpb25fY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIH0sIHsgLm5hbWUgPSAidG9sIiwgLmRlc2NyID0gIlRyYW5zbWl0IE9wdGljYWwgTGV2ZWwuIEFuIGluZGljYXRpb24gb2YgdGhlIGN1cnJlbnQgT0xUIENUIHRyYW5zY2VpdmVyIGNoYW5uZWwgbGF1bmNoIHBvd2VyIGludG8gdGhlIE9ETiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSwgdG9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN5c3RlbV9wcm9maWxlIiwgLmRlc2NyID0gIlN5c3RlbSBwcm9maWxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhLCBzeXN0ZW1fcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9wcm9maWxlIH0sIHsgLm5hbWUgPSAiY2hhbm5lbF9wcm9maWxlIiwgLmRlc2NyID0gIkNoYW5uZWwgcHJvZmlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSwgY2hhbm5lbF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGRlYnVnID09PT0gKi8KKworLyogR3JvdXA6IGRlYnVnIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfa2V5X3Jlc2VydmVkID0geyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJSZXNlcnZlZCAoc2V0IHRvIDApIiwgLmFjY2VzcyA9IDAsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERUJVR19LRVlfSURfUkVTRVJWRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZWJ1Z19rZXlfcmVzZXJ2ZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJSZXNlcnZlZCAoc2V0IHRvIDApIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGVidWcgLSBjbGlfaW5wdXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19jbGlfaW5wdXRfZGF0YSA9IHsgLm5hbWUgPSAiZGF0YSIsIC5kZXNjciA9ICJJbnB1dCBTdHJpbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEsIGRhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRlYnVnX2NsaV9pbnB1dF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RlYnVnX2NsaV9pbnB1dF9kYXRhIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkYXRhIiwgLmRlc2NyID0gIklucHV0IFN0cmluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEsIGRhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEiLCAuZGVzY3IgPSAiQ0xJIElucHV0IFN0cmluZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZWJ1ZyAtIGNsaV9vdXRwdXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgPSB7IC5uYW1lID0gImRhdGEiLCAuZGVzY3IgPSAib3V0cHV0IGRhdGEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0xJX09VVFBVVF9JRF9EQVRBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSwgZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGVidWdfY2xpX291dHB1dF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RlYnVnX2NsaV9vdXRwdXRfZGF0YSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRhdGEiLCAuZGVzY3IgPSAib3V0cHV0IGRhdGEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSwgZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIiwgLmRlc2NyID0gIkNMSSBPdXRwdXQgU3RyaW5nIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRlYnVnIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfY2ZnX2NvbnNvbGVfcmVkaXJlY3Rpb24gPSB7IC5uYW1lID0gImNvbnNvbGVfcmVkaXJlY3Rpb24iLCAuZGVzY3IgPSAiTG9nIG91dHB1dCByZWRpcmVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERUJVR19DRkdfSURfQ09OU09MRV9SRURJUkVDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgY29uc29sZV9yZWRpcmVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19jZmdfaW5kaWNhdGlvbnNfZHJvcHBlZCA9IHsgLm5hbWUgPSAiaW5kaWNhdGlvbnNfZHJvcHBlZCIsIC5kZXNjciA9ICJOdW1iZXIgb2YgaW5kaWNhdGlvbnMgZHJvcHBlZCBkdWUgdG8gY29uZ2VzdGlvbiAvIHNoYXBpbmcuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGluZGljYXRpb25zX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfY2ZnX2ZpbGVfdXNlZF9wZXJjZW50ID0geyAubmFtZSA9ICJmaWxlX3VzZWRfcGVyY2VudCIsIC5kZXNjciA9ICJERFIgbG9nIGZpbGUgdXNlZCBwZXJjZW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0ZJTEVfVVNFRF9QRVJDRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NmZ19kYXRhLCBmaWxlX3VzZWRfcGVyY2VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RlYnVnX2NmZ19hcGlfY2FwdHVyZV9jZmcgPSB7IC5uYW1lID0gImFwaV9jYXB0dXJlX2NmZyIsIC5kZXNjciA9ICJDb25maWd1cmF0aW9uIGZvciBBUEkgY2FwdHVyZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfY2ZnX2FwaV9jYXB0dXJlX3N0YXRzID0geyAubmFtZSA9ICJhcGlfY2FwdHVyZV9zdGF0cyIsIC5kZXNjciA9ICJTdGF0aXN0aWNzIG9uIHRoZSBtb3N0IHJlY2VudCBBUEkgY2FwdHVyZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGFwaV9jYXB0dXJlX3N0YXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19jZmdfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQgPSB7IC5uYW1lID0gImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkIiwgLmRlc2NyID0gIkNvbnRyb2xzIHdoYXQgcG9ydGlvbiBvZiB0aGUgY2FwdHVyZSBidWZmZXIgaXMgcmV0dXJuZWQgd2hlbiBwZXJmb3JtaW5nIGEgY2ZnX2dldC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NmZ19kYXRhLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19jZmdfYXBpX2NhcHR1cmVfYnVmZmVyID0geyAubmFtZSA9ICJhcGlfY2FwdHVyZV9idWZmZXIiLCAuZGVzY3IgPSAiVGhlIHBvcnRpb24gb2YgdGhlIGNhcHR1cmUgYnVmZmVyIGN1cnJlbnRseSBzcGVjaWZpZWQgYnkgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZWJ1Z19jZmdfY29uc29sZV9yZWRpcmVjdGlvbiwgJnByb3BfZGVzY3JfZGVidWdfY2ZnX2luZGljYXRpb25zX2Ryb3BwZWQsICZwcm9wX2Rlc2NyX2RlYnVnX2NmZ19maWxlX3VzZWRfcGVyY2VudCwgJnByb3BfZGVzY3JfZGVidWdfY2ZnX2FwaV9jYXB0dXJlX2NmZywgJnByb3BfZGVzY3JfZGVidWdfY2ZnX2FwaV9jYXB0dXJlX3N0YXRzLCAmcHJvcF9kZXNjcl9kZWJ1Z19jZmdfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQsICZwcm9wX2Rlc2NyX2RlYnVnX2NmZ19hcGlfY2FwdHVyZV9idWZmZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbnNvbGVfcmVkaXJlY3Rpb24iLCAuZGVzY3IgPSAiTG9nIG91dHB1dCByZWRpcmVjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGNvbnNvbGVfcmVkaXJlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uIH0sIHsgLm5hbWUgPSAiaW5kaWNhdGlvbnNfZHJvcHBlZCIsIC5kZXNjciA9ICJOdW1iZXIgb2YgaW5kaWNhdGlvbnMgZHJvcHBlZCBkdWUgdG8gY29uZ2VzdGlvbiAvIHNoYXBpbmcuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgaW5kaWNhdGlvbnNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJmaWxlX3VzZWRfcGVyY2VudCIsIC5kZXNjciA9ICJERFIgbG9nIGZpbGUgdXNlZCBwZXJjZW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgZmlsZV91c2VkX3BlcmNlbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJhcGlfY2FwdHVyZV9jZmciLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBmb3IgQVBJIGNhcHR1cmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnIH0sIHsgLm5hbWUgPSAiYXBpX2NhcHR1cmVfc3RhdHMiLCAuZGVzY3IgPSAiU3RhdGlzdGljcyBvbiB0aGUgbW9zdCByZWNlbnQgQVBJIGNhcHR1cmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfc3RhdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyB9LCB7IC5uYW1lID0gImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkIiwgLmRlc2NyID0gIkNvbnRyb2xzIHdoYXQgcG9ydGlvbiBvZiB0aGUgY2FwdHVyZSBidWZmZXIgaXMgcmV0dXJuZWQgd2hlbiBwZXJmb3JtaW5nIGEgY2ZnX2dldC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NmZ19kYXRhLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgfSwgeyAubmFtZSA9ICJhcGlfY2FwdHVyZV9idWZmZXIiLCAuZGVzY3IgPSAiVGhlIHBvcnRpb24gb2YgdGhlIGNhcHR1cmUgYnVmZmVyIGN1cnJlbnRseSBzcGVjaWZpZWQgYnkgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZWJ1ZyAtIGZpbGVfYWxtb3N0X2Z1bGwgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19maWxlX2FsbW9zdF9mdWxsX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRlYnVnIC0gc3RhcnRfYXBpX2NhcHR1cmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBkZWJ1ZyAtIHN0b3BfYXBpX2NhcHR1cmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRlYnVnIC0gcmVzZXRfYXBpX2NhcHR1cmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBkZWJ1ZyAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfYXV0b19jZmdfY2xpX291dHB1dCA9IHsgLm5hbWUgPSAiY2xpX291dHB1dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY2xpX291dHB1dFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9DTElfT1VUUFVULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEsIGNsaV9vdXRwdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19hdXRvX2NmZ19maWxlX2FsbW9zdF9mdWxsID0geyAubmFtZSA9ICJmaWxlX2FsbW9zdF9mdWxsIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJmaWxlX2FsbW9zdF9mdWxsXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0ZJTEVfQUxNT1NUX0ZVTEwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSwgZmlsZV9hbG1vc3RfZnVsbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRlYnVnX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGVidWdfYXV0b19jZmdfY2xpX291dHB1dCwgJnByb3BfZGVzY3JfZGVidWdfYXV0b19jZmdfZmlsZV9hbG1vc3RfZnVsbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjbGlfb3V0cHV0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjbGlfb3V0cHV0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhLCBjbGlfb3V0cHV0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZmlsZV9hbG1vc3RfZnVsbCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZmlsZV9hbG1vc3RfZnVsbFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSwgZmlsZV9hbG1vc3RfZnVsbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBkZXZpY2UgPT09PSAqLworCisvKiBHcm91cDogZGV2aWNlIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19zeXN0ZW1fbW9kZSA9IHsgLm5hbWUgPSAic3lzdGVtX21vZGUiLCAuZGVzY3IgPSAiU3lzdGVtIG1vZGUgLSB0aGlzIG11c3QgYmUgc2V0IGJ5IHRoZSBob3N0IHdoZW4gaW5pdGlhbGx5IHByb3Zpc2lvbmluZyB0aGUgc3lzdGVtLiAgU2V0dGluZyB0aGlzIGFsc28gc2V0cyB0aGUgXCJubmlfc3BlZWRcIiBwcm9wZXJ0eSwgdW5sZXNzIGl0IGlzIG92ZXJyaWRkZW4uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfU1lTVEVNX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBzeXN0ZW1fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19rZWVwYWxpdmVfaW50ZXJ2YWwgPSB7IC5uYW1lID0gImtlZXBhbGl2ZV9pbnRlcnZhbCIsIC5kZXNjciA9ICJLZWVwYWxpdmUgSW50ZXJ2YWwgaW4gU2Vjb25kcyAgKDAgPSBEaXNhYmxlKSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9JTlRFUlZBTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGtlZXBhbGl2ZV9pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2tlZXBhbGl2ZV90b2xlcmFuY2UgPSB7IC5uYW1lID0gImtlZXBhbGl2ZV90b2xlcmFuY2UiLCAuZGVzY3IgPSAiSG93IG1hbnkga2VlcGFsaXZlIG1lc3NhZ2VzIGNhbiBiZSBsb3N0IGJlZm9yZSB0cmlnZ2VyaW5nIGEgZGlzY29ubmVjdCBzZXF1ZW5jZSAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfVE9MRVJBTkNFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwga2VlcGFsaXZlX3RvbGVyYW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2Zpcm13YXJlX3N3X3ZlcnNpb24gPSB7IC5uYW1lID0gImZpcm13YXJlX3N3X3ZlcnNpb24iLCAuZGVzY3IgPSAiRmlybXdhcmUgU1cgVmVyc2lvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGZpcm13YXJlX3N3X3ZlcnNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19ob3N0X3N3X3ZlcnNpb24gPSB7IC5uYW1lID0gImhvc3Rfc3dfdmVyc2lvbiIsIC5kZXNjciA9ICJIb3N0IFNXIFZlcnNpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGhvc3Rfc3dfdmVyc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfY2hpcF9yZXZpc2lvbiA9IHsgLm5hbWUgPSAiY2hpcF9yZXZpc2lvbiIsIC5kZXNjciA9ICJSZXZpc2lvbiBvZiB0aGUgQkNNNjg2MjAgZGV2aWNlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9SRVZJU0lPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGNoaXBfcmV2aXNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfc3RhdGUgPSB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIkRldmljZSBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZGVidWcgPSB7IC5uYW1lID0gImRlYnVnIiwgLmRlc2NyID0gIkRldmljZSBjb25maWd1cmF0aW9uIGRlYnVnIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9ERUJVRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGRlYnVnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfZGV2aWNlX2NmZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfbm5pX3NwZWVkID0geyAubmFtZSA9ICJubmlfc3BlZWQiLCAuZGVzY3IgPSAiU3BlZWQgb2YgdGhlIE5OSSBpbnRlcmZhY2UuICBUaGlzIGlzIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBcInN5c3RlbV9tb2RlXCIgcHJvcGVydHkgaXMgc2V0LCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGhvc3QuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfTk5JX1NQRUVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgbm5pX3NwZWVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX25uaV9zcGVlZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSIsIC5kZXNjciA9ICJUaGUgc2VsZWN0ZWQgZXh0ZXJuYWwgSVJRIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0VYVF9JUlEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXh0X2lycSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5ID0geyAubmFtZSA9ICJlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkiLCAuZGVzY3IgPSAiVGhlIHRpbWUgKGluIFRRKSB0aGF0IGl0IHRha2VzIGZyb20gd2hlbiBhIHB1bHNlIGlzIGdlbmVyYXRlZCBhdCB0aGUgZXh0ZXJuYWwgc291cmNlIHRvIHdoZW4gd2Ugc2FtcGxlIGl0LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX1NBTVBMRV9ERUxBWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2luZGljYXRpb25fc2hhcGluZyA9IHsgLm5hbWUgPSAiaW5kaWNhdGlvbl9zaGFwaW5nIiwgLmRlc2NyID0gIlNoYXBpbmcgLyByYXRlIGxpbWl0aW5nIGZvciB0aGUgaW5kaWNhdGlvbiBjaGFubmVsLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGluZGljYXRpb25fc2hhcGluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfY2hpcF90ZW1wZXJhdHVyZSA9IHsgLm5hbWUgPSAiY2hpcF90ZW1wZXJhdHVyZSIsIC5kZXNjciA9ICJDdXJyZW50IGRpZSB0ZW1wZXJhdHVyZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBjaGlwX3RlbXBlcmF0dXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlID0geyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9lbmFibGUiLCAuZGVzY3IgPSAiR1BPTi9YR1BPTiBUb0QgY29udHJvbCBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0VOQUJMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2dwb25feGdwb25fdG9kX2dwaW9fcGluID0geyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9ncGlvX3BpbiIsIC5kZXNjciA9ICJHUE9OL1hHUE9OIFRvRCBHSU8gcGluIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBncG9uX3hncG9uX3RvZF9ncGlvX3BpbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSA9IHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkiLCAuZGVzY3IgPSAiR1BPTi9YR1BPTiBpcyBUb0QgaW50ZXJuYWxseSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0NPTk5FQ1RFRF9JTlRFUk5BTExZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2Vwb25fODAyMV9hc190b2RfZm9ybWF0ID0geyAubmFtZSA9ICJlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCIsIC5kZXNjciA9ICJFUE9OIDgwMi4xQVMgVG9EIEZvcm1hdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fODAyMV9BU19UT0RfRk9STUFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMjU2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19lcG9uX3NoYXBlcl9tb2RlID0geyAubmFtZSA9ICJlcG9uX3NoYXBlcl9tb2RlIiwgLmRlc2NyID0gIkNvbnRyb2xzIEVQT04gc2hhcGVyIGJlaGF2aW9yLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fU0hBUEVSX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBlcG9uX3NoYXBlcl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2hhcGVyX21vZGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2VtYmVkZGVkX2ltYWdlX2xpc3QgPSB7IC5uYW1lID0gImVtYmVkZGVkX2ltYWdlX2xpc3QiLCAuZGVzY3IgPSAiTGlzdCBvZiBhbGwgZmlsZSBpbWFnZXMgc3RvcmVkIGluIHRoZSBPTFQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FTUJFRERFRF9JTUFHRV9MSVNULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2NoaXBfdm9sdGFnZSA9IHsgLm5hbWUgPSAiY2hpcF92b2x0YWdlIiwgLmRlc2NyID0gIkNoaXAgdm9sdGFnZSBpbiBtViIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9WT0xUQUdFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgY2hpcF92b2x0YWdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZXBvbl90b2Rfc3RyaW5nID0geyAubmFtZSA9ICJlcG9uX3RvZF9zdHJpbmciLCAuZGVzY3IgPSAiRVBPTiBUb0QgU3RyaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9UT0RfU1RSSU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZXBvbl90b2Rfc3RyaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzI1NiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfeGdwb25fbnVtX29mX29udXMgPSB7IC5uYW1lID0gInhncG9uX251bV9vZl9vbnVzIiwgLmRlc2NyID0gInhncG9uIG51bSBvZiBvbnVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCB4Z3Bvbl9udW1fb2Zfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX251bV9vZl9vbnVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19kZXZpY2VfaXBfYWRkcmVzcyA9IHsgLm5hbWUgPSAiZGV2aWNlX2lwX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIElQIEFkZHJlc3Mgb2YgdGhlIGRldmljZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9JUF9BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZGV2aWNlX2lwX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2lwdjRfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZGV2aWNlX3VkcF9wb3J0ID0geyAubmFtZSA9ICJkZXZpY2VfdWRwX3BvcnQiLCAuZGVzY3IgPSAiVGhlIFVEUCBwb3J0IG9mIHRoZSBEZXZpY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBkZXZpY2VfdWRwX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ190b2RfdWFydF9iYXVkcmF0ZSA9IHsgLm5hbWUgPSAidG9kX3VhcnRfYmF1ZHJhdGUiLCAuZGVzY3IgPSAiVUFSVCBiYXVkIHJhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIHRvZF91YXJ0X2JhdWRyYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdWFydF9iYXVkcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCA9IHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCIsIC5kZXNjciA9ICJHUE9OL1hHUE9OIFRvRCBzdHJpbmcgbGVuZ3RoIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19zeXN0ZW1fbW9kZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19rZWVwYWxpdmVfaW50ZXJ2YWwsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfa2VlcGFsaXZlX3RvbGVyYW5jZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19maXJtd2FyZV9zd192ZXJzaW9uLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2hvc3Rfc3dfdmVyc2lvbiwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19jaGlwX3JldmlzaW9uLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX3N0YXRlLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2RlYnVnLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX25uaV9zcGVlZCwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2Vwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19pbmRpY2F0aW9uX3NoYXBpbmcsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfY2hpcF90ZW1wZXJhdHVyZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19ncG9uX3hncG9uX3RvZF9lbmFibGUsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4sICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHksICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZXBvbl9zaGFwZXJfbW9kZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19lbWJlZGRlZF9pbWFnZV9saXN0LCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2NoaXBfdm9sdGFnZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19lcG9uX3RvZF9zdHJpbmcsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfeGdwb25fbnVtX29mX29udXMsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZGV2aWNlX2lwX2FkZHJlc3MsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZGV2aWNlX3VkcF9wb3J0LCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX3RvZF91YXJ0X2JhdWRyYXRlLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2dwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGggfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzeXN0ZW1fbW9kZSIsIC5kZXNjciA9ICJTeXN0ZW0gbW9kZSAtIHRoaXMgbXVzdCBiZSBzZXQgYnkgdGhlIGhvc3Qgd2hlbiBpbml0aWFsbHkgcHJvdmlzaW9uaW5nIHRoZSBzeXN0ZW0uICBTZXR0aW5nIHRoaXMgYWxzbyBzZXRzIHRoZSBcIm5uaV9zcGVlZFwiIHByb3BlcnR5LCB1bmxlc3MgaXQgaXMgb3ZlcnJpZGRlbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgc3lzdGVtX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zeXN0ZW1fbW9kZSB9LCB7IC5uYW1lID0gImtlZXBhbGl2ZV9pbnRlcnZhbCIsIC5kZXNjciA9ICJLZWVwYWxpdmUgSW50ZXJ2YWwgaW4gU2Vjb25kcyAgKDAgPSBEaXNhYmxlKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBrZWVwYWxpdmVfaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAia2VlcGFsaXZlX3RvbGVyYW5jZSIsIC5kZXNjciA9ICJIb3cgbWFueSBrZWVwYWxpdmUgbWVzc2FnZXMgY2FuIGJlIGxvc3QgYmVmb3JlIHRyaWdnZXJpbmcgYSBkaXNjb25uZWN0IHNlcXVlbmNlICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBrZWVwYWxpdmVfdG9sZXJhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImZpcm13YXJlX3N3X3ZlcnNpb24iLCAuZGVzY3IgPSAiRmlybXdhcmUgU1cgVmVyc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBmaXJtd2FyZV9zd192ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiB9LCB7IC5uYW1lID0gImhvc3Rfc3dfdmVyc2lvbiIsIC5kZXNjciA9ICJIb3N0IFNXIFZlcnNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgaG9zdF9zd192ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaG9zdF9zd192ZXJzaW9uIH0sIHsgLm5hbWUgPSAiY2hpcF9yZXZpc2lvbiIsIC5kZXNjciA9ICJSZXZpc2lvbiBvZiB0aGUgQkNNNjg2MjAgZGV2aWNlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBjaGlwX3JldmlzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJEZXZpY2Ugc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3RhdGUgfSwgeyAubmFtZSA9ICJkZWJ1ZyIsIC5kZXNjciA9ICJEZXZpY2UgY29uZmlndXJhdGlvbiBkZWJ1ZyBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGRlYnVnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfZGV2aWNlX2NmZyB9LCB7IC5uYW1lID0gIm5uaV9zcGVlZCIsIC5kZXNjciA9ICJTcGVlZCBvZiB0aGUgTk5JIGludGVyZmFjZS4gIFRoaXMgaXMgY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIFwic3lzdGVtX21vZGVcIiBwcm9wZXJ0eSBpcyBzZXQsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgaG9zdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgbm5pX3NwZWVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX25uaV9zcGVlZCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiLCAuZGVzY3IgPSAiVGhlIHNlbGVjdGVkIGV4dGVybmFsIElSUSBmb3IgcHJvdGVjdGlvbiBzd2l0Y2hpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2V4dF9pcnEgfSwgeyAubmFtZSA9ICJlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkiLCAuZGVzY3IgPSAiVGhlIHRpbWUgKGluIFRRKSB0aGF0IGl0IHRha2VzIGZyb20gd2hlbiBhIHB1bHNlIGlzIGdlbmVyYXRlZCBhdCB0aGUgZXh0ZXJuYWwgc291cmNlIHRvIHdoZW4gd2Ugc2FtcGxlIGl0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiaW5kaWNhdGlvbl9zaGFwaW5nIiwgLmRlc2NyID0gIlNoYXBpbmcgLyByYXRlIGxpbWl0aW5nIGZvciB0aGUgaW5kaWNhdGlvbiBjaGFubmVsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBpbmRpY2F0aW9uX3NoYXBpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgfSwgeyAubmFtZSA9ICJjaGlwX3RlbXBlcmF0dXJlIiwgLmRlc2NyID0gIkN1cnJlbnQgZGllIHRlbXBlcmF0dXJlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBjaGlwX3RlbXBlcmF0dXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImdwb25feGdwb25fdG9kX2VuYWJsZSIsIC5kZXNjciA9ICJHUE9OL1hHUE9OIFRvRCBjb250cm9sIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9ncGlvX3BpbiIsIC5kZXNjciA9ICJHUE9OL1hHUE9OIFRvRCBHSU8gcGluIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW4gfSwgeyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSIsIC5kZXNjciA9ICJHUE9OL1hHUE9OIGlzIFRvRCBpbnRlcm5hbGx5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQiLCAuZGVzY3IgPSAiRVBPTiA4MDIuMUFTIFRvRCBGb3JtYXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMjU2IH0sIHsgLm5hbWUgPSAiZXBvbl9zaGFwZXJfbW9kZSIsIC5kZXNjciA9ICJDb250cm9scyBFUE9OIHNoYXBlciBiZWhhdmlvci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZXBvbl9zaGFwZXJfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NoYXBlcl9tb2RlIH0sIHsgLm5hbWUgPSAiZW1iZWRkZWRfaW1hZ2VfbGlzdCIsIC5kZXNjciA9ICJMaXN0IG9mIGFsbCBmaWxlIGltYWdlcyBzdG9yZWQgaW4gdGhlIE9MVC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggfSwgeyAubmFtZSA9ICJjaGlwX3ZvbHRhZ2UiLCAuZGVzY3IgPSAiQ2hpcCB2b2x0YWdlIGluIG1WIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGNoaXBfdm9sdGFnZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJlcG9uX3RvZF9zdHJpbmciLCAuZGVzY3IgPSAiRVBPTiBUb0QgU3RyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGVwb25fdG9kX3N0cmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yNTYgfSwgeyAubmFtZSA9ICJ4Z3Bvbl9udW1fb2Zfb251cyIsIC5kZXNjciA9ICJ4Z3BvbiBudW0gb2Ygb251cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCB4Z3Bvbl9udW1fb2Zfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX251bV9vZl9vbnVzIH0sIHsgLm5hbWUgPSAiZGV2aWNlX2lwX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIElQIEFkZHJlc3Mgb2YgdGhlIGRldmljZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBkZXZpY2VfaXBfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfaXB2NF9hZGRyZXNzIH0sIHsgLm5hbWUgPSAiZGV2aWNlX3VkcF9wb3J0IiwgLmRlc2NyID0gIlRoZSBVRFAgcG9ydCBvZiB0aGUgRGV2aWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGRldmljZV91ZHBfcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJ0b2RfdWFydF9iYXVkcmF0ZSIsIC5kZXNjciA9ICJVQVJUIGJhdWQgcmF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCB0b2RfdWFydF9iYXVkcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VhcnRfYmF1ZHJhdGUgfSwgeyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoIiwgLmRlc2NyID0gIkdQT04vWEdQT04gVG9EIHN0cmluZyBsZW5ndGgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2tleV9yZXNlcnZlZCA9IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAiUmVzZXJ2ZWQgKHNldCB0byAwKS4iLCAuYWNjZXNzID0gMCwgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9LRVlfSURfUkVTRVJWRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2tleSwgcmVzZXJ2ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9rZXlfcmVzZXJ2ZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAiUmVzZXJ2ZWQgKHNldCB0byAwKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2Vfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBjb25uZWN0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2Nvbm5lY3RfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZGV2aWNlIC0gZGlzY29ubmVjdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9kaXNjb25uZWN0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRldmljZSAtIHJlc2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3Jlc2V0X21vZGUgPSB7IC5uYW1lID0gIm1vZGUiLCAuZGVzY3IgPSAiT3B0aW9ucyB0byBjb250cm9sIHdoYXQgc2hvdWxkIGJlIHJlc2V0LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YSwgbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9yZXNldF9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX3Jlc2V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX3Jlc2V0X21vZGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1vZGUiLCAuZGVzY3IgPSAiT3B0aW9ucyB0byBjb250cm9sIHdoYXQgc2hvdWxkIGJlIHJlc2V0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEsIG1vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9yZXNldF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEiLCAuZGVzY3IgPSAiUmVzZXRzIHRoZSBob3N0L2RldmljZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gaG9zdF9rZWVwX2FsaXZlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9zZXF1ZW5jZV9udW1iZXIgPSB7IC5uYW1lID0gInNlcXVlbmNlX251bWJlciIsIC5kZXNjciA9ICJzZXF1ZW5jZSBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhLCBzZXF1ZW5jZV9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV90aW1lX3N0YW1wID0geyAubmFtZSA9ICJ0aW1lX3N0YW1wIiwgLmRlc2NyID0gInRpbWUgc3RhbXAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSwgdGltZV9zdGFtcCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfaG9zdF9rZWVwX2FsaXZlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9zZXF1ZW5jZV9udW1iZXIsICZwcm9wX2Rlc2NyX2RldmljZV9ob3N0X2tlZXBfYWxpdmVfdGltZV9zdGFtcCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcXVlbmNlX251bWJlciIsIC5kZXNjciA9ICJzZXF1ZW5jZSBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSwgc2VxdWVuY2VfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInRpbWVfc3RhbXAiLCAuZGVzY3IgPSAidGltZSBzdGFtcCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhLCB0aW1lX3N0YW1wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSIsIC5kZXNjciA9ICJLZWVwIGFsaXZlIG1lc3NhZ2UgZnJvbSB0aGUgaG9zdCB0byB0aGUgZGV2aWNlIC0gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAoc2hvdWxkIG5vdCBiZSBzZW50IGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uKS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gc3dfdXBncmFkZV9hY3RpdmF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRldmljZSAtIGRldmljZV9yZWFkeSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2VfcmVhZHlfZmlybXdhcmVfc3dfdmVyc2lvbiA9IHsgLm5hbWUgPSAiZmlybXdhcmVfc3dfdmVyc2lvbiIsIC5kZXNjciA9ICJTb2Z0d2FyZSBWZXJzaW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfRklSTVdBUkVfU1dfVkVSU0lPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIGZpcm13YXJlX3N3X3ZlcnNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV9zeXN0ZW1fbW9kZSA9IHsgLm5hbWUgPSAic3lzdGVtX21vZGUiLCAuZGVzY3IgPSAiU3lzdGVtIE1vZGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9TWVNURU1fTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIHN5c3RlbV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX21vZGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X25uaV9zcGVlZCA9IHsgLm5hbWUgPSAibm5pX3NwZWVkIiwgLmRlc2NyID0gIk5OSSBTcGVlZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX05OSV9TUEVFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIG5uaV9zcGVlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X2NoaXBfcmV2aXNpb24gPSB7IC5uYW1lID0gImNoaXBfcmV2aXNpb24iLCAuZGVzY3IgPSAiQ2hpcCBSZXZpc2lvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0NISVBfUkVWSVNJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCBjaGlwX3JldmlzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X3RvZF9lbmFibGUgPSB7IC5uYW1lID0gInRvZF9lbmFibGUiLCAuZGVzY3IgPSAiVG9EIGNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfRU5BQkxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSwgdG9kX2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X3RvZF9ncGlvX3BpbiA9IHsgLm5hbWUgPSAidG9kX2dwaW9fcGluIiwgLmRlc2NyID0gIkdQSU8gcGluIGlzIHVzZWQgd2hlbiBUb0QgVUFSVCBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSBlbWJlZGRlZCwgYW5kIFRPRCB2YWx1ZSBpcyBvYnRhaW5lZCBieSB0aGUgaG9zdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1RPRF9HUElPX1BJTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIHRvZF9ncGlvX3BpbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2RldmljZV9yZWFkeV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2VfcmVhZHlfZmlybXdhcmVfc3dfdmVyc2lvbiwgJnByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV9zeXN0ZW1fbW9kZSwgJnByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV9ubmlfc3BlZWQsICZwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2VfcmVhZHlfY2hpcF9yZXZpc2lvbiwgJnByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV90b2RfZW5hYmxlLCAmcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X3RvZF9ncGlvX3BpbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZpcm13YXJlX3N3X3ZlcnNpb24iLCAuZGVzY3IgPSAiU29mdHdhcmUgVmVyc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCBmaXJtd2FyZV9zd192ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiB9LCB7IC5uYW1lID0gInN5c3RlbV9tb2RlIiwgLmRlc2NyID0gIlN5c3RlbSBNb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIHN5c3RlbV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX21vZGUgfSwgeyAubmFtZSA9ICJubmlfc3BlZWQiLCAuZGVzY3IgPSAiTk5JIFNwZWVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIG5uaV9zcGVlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgfSwgeyAubmFtZSA9ICJjaGlwX3JldmlzaW9uIiwgLmRlc2NyID0gIkNoaXAgUmV2aXNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSwgY2hpcF9yZXZpc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uIH0sIHsgLm5hbWUgPSAidG9kX2VuYWJsZSIsIC5kZXNjciA9ICJUb0QgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCB0b2RfZW5hYmxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gInRvZF9ncGlvX3BpbiIsIC5kZXNjciA9ICJHUElPIHBpbiBpcyB1c2VkIHdoZW4gVG9EIFVBUlQgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUgZW1iZWRkZWQsIGFuZCBUT0QgdmFsdWUgaXMgb2J0YWluZWQgYnkgdGhlIGhvc3QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSwgdG9kX2dwaW9fcGluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW4gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEiLCAuZGVzY3IgPSAiRGV2aWNlIHJlYWR5IGluZGljYXRpb24gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAobm90IHNlbnQgdG8gdGhlIGhvc3QgYXBwbGljYXRpb24pLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBjb25uZWN0aW9uX2VzdGFibGlzaGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZGV2aWNlIC0gZGV2aWNlX2tlZXBfYWxpdmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfc2VxdWVuY2VfbnVtYmVyID0geyAubmFtZSA9ICJzZXF1ZW5jZV9udW1iZXIiLCAuZGVzY3IgPSAic2VxdWVuY2UgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEsIHNlcXVlbmNlX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfdGltZV9zdGFtcCA9IHsgLm5hbWUgPSAidGltZV9zdGFtcCIsIC5kZXNjciA9ICJ0aW1lIHN0YW1wIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhLCB0aW1lX3N0YW1wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9zZXF1ZW5jZV9udW1iZXIsICZwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV90aW1lX3N0YW1wIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzZXF1ZW5jZV9udW1iZXIiLCAuZGVzY3IgPSAic2VxdWVuY2UgbnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSwgc2VxdWVuY2VfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInRpbWVfc3RhbXAiLCAuZGVzY3IgPSAidGltZSBzdGFtcCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEsIHRpbWVfc3RhbXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSIsIC5kZXNjciA9ICJLZWVwIGFsaXZlIG1lc3NhZ2UgZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBob3N0IC0gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAobm90IHNlbnQgdG8gdGhlIGhvc3QgYXBwbGljYXRpb24pLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBjb25uZWN0aW9uX2ZhaWx1cmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX3JlYXNvbiA9IHsgLm5hbWUgPSAicmVhc29uIiwgLmRlc2NyID0gIkNvbm5lY3Rpb24gZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRV9JRF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhLCByZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZWFzb24iLCAuZGVzY3IgPSAiQ29ubmVjdGlvbiBmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhLCByZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEiLCAuZGVzY3IgPSAiVGhlIGhvc3QgZmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIGRldmljZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gY29ubmVjdGlvbl9jb21wbGV0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX3N0YW5kYWxvbmUgPSB7IC5uYW1lID0gInN0YW5kYWxvbmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgdGhlIGRldmljZSB3YXMgcHJldmlvdXNseSBydW5uaW5nIGluIHN0YW5kYWxvbmUgbW9kZSBiZWZvcmUgdGhpcyBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZC4gIElmIGZhbHNlLCB0aGUgZGV2aWNlIHdhcyBib290ZWQgZnJvbSByZXNldCB3aXRoIG5ldyBmaXJtd2FyZSwgZXRjLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9DT01QTEVURV9JRF9TVEFOREFMT05FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEsIHN0YW5kYWxvbmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX3N0YW5kYWxvbmUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhbmRhbG9uZSIsIC5kZXNjciA9ICJJZiB0cnVlLCB0aGUgZGV2aWNlIHdhcyBwcmV2aW91c2x5IHJ1bm5pbmcgaW4gc3RhbmRhbG9uZSBtb2RlIGJlZm9yZSB0aGlzIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkLiAgSWYgZmFsc2UsIHRoZSBkZXZpY2Ugd2FzIGJvb3RlZCBmcm9tIHJlc2V0IHdpdGggbmV3IGZpcm13YXJlLCBldGMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhLCBzdGFuZGFsb25lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEiLCAuZGVzY3IgPSAiVGhlIGhvc3Qgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB0aGUgZGV2aWNlLiAgVGhlIGRldmljZSBoYXMgZWl0aGVyIGJlZW4gcmVwcm9ncmFtbWVkIHdpdGggbmV3IGZpcm13YXJlLCBvciBhIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkIHdpdGggYW4gZXhpc3RpbmcgZGV2aWNlIChzZWUgdGhlIFwic3RhbmRhbG9uZVwiIGZpZWxkKS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gZGlzY29ubmVjdGlvbl9jb21wbGV0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRldmljZSAtIHN3X2Vycm9yICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX3Rhc2tfbmFtZSA9IHsgLm5hbWUgPSAidGFza19uYW1lIiwgLmRlc2NyID0gInRhc2sgbmFtZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfVEFTS19OQU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhLCB0YXNrX25hbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX2ZpbGVfbmFtZSA9IHsgLm5hbWUgPSAiZmlsZV9uYW1lIiwgLmRlc2NyID0gImZpbGUgbmFtZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhLCBmaWxlX25hbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX2xpbmVfbnVtYmVyID0geyAubmFtZSA9ICJsaW5lX251bWJlciIsIC5kZXNjciA9ICJsaW5lIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfTElORV9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEsIGxpbmVfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9zd19lcnJvcl9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJwb25fbmkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX3N3X2Vycm9yX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX3Rhc2tfbmFtZSwgJnByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX2ZpbGVfbmFtZSwgJnByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX2xpbmVfbnVtYmVyLCAmcHJvcF9kZXNjcl9kZXZpY2Vfc3dfZXJyb3JfcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0YXNrX25hbWUiLCAuZGVzY3IgPSAidGFzayBuYW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSwgdGFza19uYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMCB9LCB7IC5uYW1lID0gImZpbGVfbmFtZSIsIC5kZXNjciA9ICJmaWxlIG5hbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhLCBmaWxlX25hbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwIH0sIHsgLm5hbWUgPSAibGluZV9udW1iZXIiLCAuZGVzY3IgPSAibGluZSBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhLCBsaW5lX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAicG9uX25pIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSIsIC5kZXNjciA9ICJzdyBlcnJvciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBzd19leGNlcHRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2Vfc3dfZXhjZXB0aW9uX2NwdV9pZCA9IHsgLm5hbWUgPSAiY3B1X2lkIiwgLmRlc2NyID0gIkNQVSBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX0NQVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEsIGNwdV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9zd19leGNlcHRpb25fdGV4dCA9IHsgLm5hbWUgPSAidGV4dCIsIC5kZXNjciA9ICJ0ZXh0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEsIHRleHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMjAwMCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9zd19leGNlcHRpb25fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZXZpY2Vfc3dfZXhjZXB0aW9uX2NwdV9pZCwgJnByb3BfZGVzY3JfZGV2aWNlX3N3X2V4Y2VwdGlvbl90ZXh0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY3B1X2lkIiwgLmRlc2NyID0gIkNQVSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhLCBjcHVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0ZXh0IiwgLmRlc2NyID0gInRleHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSwgdGV4dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yMDAwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIiwgLmRlc2NyID0gInN3IGV4Y2VwdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBpbmRpY2F0aW9uc19kcm9wcGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfdG90YWxfY291bnQgPSB7IC5uYW1lID0gInRvdGFsX2NvdW50IiwgLmRlc2NyID0gIlRvdGFsIG51bWJlciBvZiBpbmRpY2F0aW9ucyBkcm9wcGVkIHNpbmNlIHRoZSBzeXN0ZW0gd2FzIHN0YXJ0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9JTkRJQ0FUSU9OU19EUk9QUEVEX0lEX1RPVEFMX0NPVU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEsIHRvdGFsX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfdG90YWxfY291bnQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidG90YWxfY291bnQiLCAuZGVzY3IgPSAiVG90YWwgbnVtYmVyIG9mIGluZGljYXRpb25zIGRyb3BwZWQgc2luY2UgdGhlIHN5c3RlbSB3YXMgc3RhcnRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEsIHRvdGFsX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBpbmRpY2F0aW9ucyBhcmUgZHJvcHBlZCBkdWUgdG8gY29uZ2VzdGlvbiAvIHNoYXBpbmcuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIGltYWdlX3RyYW5zZmVyX3N0YXJ0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2ltYWdlX3R5cGUgPSB7IC5uYW1lID0gImltYWdlX3R5cGUiLCAuZGVzY3IgPSAiRmlsZSB0eXBlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSwgaW1hZ2VfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2ltYWdlX3NpemUgPSB7IC5uYW1lID0gImltYWdlX3NpemUiLCAuZGVzY3IgPSAiU2l6ZSBvZiB0aGUgZmlsZSBpbWFnZS4gIElnbm9yZWQgZm9yIFJSUSBvcGVyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhLCBpbWFnZV9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9jcmMzMiA9IHsgLm5hbWUgPSAiY3JjMzIiLCAuZGVzY3IgPSAiQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIGVudGlyZSBmaWxlIGltYWdlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfQ1JDMzIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEsIGNyYzMyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaW1hZ2VfbmFtZSA9IHsgLm5hbWUgPSAiaW1hZ2VfbmFtZSIsIC5kZXNjciA9ICJOYW1lIG9mIHRoZSBmaWxlIGltYWdlLiAgTnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBEUG9FIE9OVSBvbmx5LiAgRFBvRSByZXF1aXJlcyB0aGUgd3JpdGUgcmVxdWVzdCBPQU0gY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9OQU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhLCBpbWFnZV9uYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2ltYWdlX3R5cGUsICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pbWFnZV9zaXplLCAmcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfY3JjMzIsICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pbWFnZV9uYW1lIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbWFnZV90eXBlIiwgLmRlc2NyID0gIkZpbGUgdHlwZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhLCBpbWFnZV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgfSwgeyAubmFtZSA9ICJpbWFnZV9zaXplIiwgLmRlc2NyID0gIlNpemUgb2YgdGhlIGZpbGUgaW1hZ2UuICBJZ25vcmVkIGZvciBSUlEgb3BlcmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEsIGltYWdlX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiY3JjMzIiLCAuZGVzY3IgPSAiQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIGVudGlyZSBmaWxlIGltYWdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEsIGNyYzMyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJpbWFnZV9uYW1lIiwgLmRlc2NyID0gIk5hbWUgb2YgdGhlIGZpbGUgaW1hZ2UuICBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIERQb0UgT05VIG9ubHkuICBEUG9FIHJlcXVpcmVzIHRoZSB3cml0ZSByZXF1ZXN0IE9BTSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhLCBpbWFnZV9uYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSIsIC5kZXNjciA9ICJUaGlzIEFQSSBtZXNzYWdlIGluZm9ybXMgdGhlIE9MVCBvZiB0aGUgc3RhcnQgb2YgaW1hZ2UgdHJhbnNmZXIsIGFuZCBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGZpbGUgaW1hZ2UuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIGltYWdlX3RyYW5zZmVyX2RhdGEgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9ibG9ja19udW1iZXIgPSB7IC5uYW1lID0gImJsb2NrX251bWJlciIsIC5kZXNjciA9ICJCbG9jayBudW1iZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhLCBibG9ja19udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfbW9yZV9kYXRhID0geyAubmFtZSA9ICJtb3JlX2RhdGEiLCAuZGVzY3IgPSAiU3BlY2lmaWVzIHRoYXQgdGhlcmUgYXJlIG1vcmUgZGF0YSB0byBjb21lLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSwgbW9yZV9kYXRhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSA9IHsgLm5hbWUgPSAiZGF0YSIsIC5kZXNjciA9ICJEYXRhLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEsIGRhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNl9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2Jsb2NrX251bWJlciwgJnByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfbW9yZV9kYXRhLCAmcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJsb2NrX251bWJlciIsIC5kZXNjciA9ICJCbG9jayBudW1iZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhLCBibG9ja19udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibW9yZV9kYXRhIiwgLmRlc2NyID0gIlNwZWNpZmllcyB0aGF0IHRoZXJlIGFyZSBtb3JlIGRhdGEgdG8gY29tZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEsIG1vcmVfZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRhdGEiLCAuZGVzY3IgPSAiRGF0YS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEsIGRhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNl9oZXggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSIsIC5kZXNjciA9ICJ1c2VkIGZvciB0cmFuc2ZlcnJpbmcgdGhlIGFjdHVhbCBkYXRhIGZyb20vdG8gdGhlIE9MVC4gICBub3QgdG8gYmUgZGlyZWN0bHkgY2FsbGVkIGJ5IHRoZSB1c2VyLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pbWFnZV90eXBlID0geyAubmFtZSA9ICJpbWFnZV90eXBlIiwgLmRlc2NyID0gIkltYWdlIHR5cGUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhLCBpbWFnZV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfYmxvY2tfbnVtYmVyID0geyAubmFtZSA9ICJibG9ja19udW1iZXIiLCAuZGVzY3IgPSAiQmxvY2sgbnVtYmVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhLCBibG9ja19udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIkltYWdlIHRyYW5zZmVyIHN0YXR1cy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2ltYWdlX3R5cGUsICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9ibG9ja19udW1iZXIsICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImltYWdlX3R5cGUiLCAuZGVzY3IgPSAiSW1hZ2UgdHlwZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhLCBpbWFnZV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgfSwgeyAubmFtZSA9ICJibG9ja19udW1iZXIiLCAuZGVzY3IgPSAiQmxvY2sgbnVtYmVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEsIGJsb2NrX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiSW1hZ2UgdHJhbnNmZXIgc3RhdHVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEiLCAuZGVzY3IgPSAiSW1hZ2UgVHJhbnNmZXIgQ29tcGxldGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gcnVuX2Rkcl90ZXN0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3J1bl9kZHJfdGVzdF9jcHUgPSB7IC5uYW1lID0gImNwdSIsIC5kZXNjciA9ICJXaGV0aGVyIG9yIG5vdCB0byB0ZXN0IHRoZSBDUFUgRERSIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfQ1BVLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSwgY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3J1bl9kZHJfdGVzdF9yYXNfMCA9IHsgLm5hbWUgPSAicmFzXzAiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdG8gdGVzdCBSQVMgMCBERFIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEsIHJhc18wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3J1bl9kZHJfdGVzdF9yYXNfMSA9IHsgLm5hbWUgPSAicmFzXzEiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdG8gdGVzdCBSQVMgMSBERFIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEsIHJhc18xKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX3J1bl9kZHJfdGVzdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9ydW5fZGRyX3Rlc3RfY3B1LCAmcHJvcF9kZXNjcl9kZXZpY2VfcnVuX2Rkcl90ZXN0X3Jhc18wLCAmcHJvcF9kZXNjcl9kZXZpY2VfcnVuX2Rkcl90ZXN0X3Jhc18xIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY3B1IiwgLmRlc2NyID0gIldoZXRoZXIgb3Igbm90IHRvIHRlc3QgdGhlIENQVSBERFIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSwgY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmFzXzAiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdG8gdGVzdCBSQVMgMCBERFIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSwgcmFzXzApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyYXNfMSIsIC5kZXNjciA9ICJXaGV0aGVyIG9yIG5vdCB0byB0ZXN0IFJBUyAxIEREUiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhLCByYXNfMSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSIsIC5kZXNjciA9ICJSdW4gYSB0ZXN0IG9uIG9uZSBvciBtb3JlIG9mIHRoZSBERFIgY29tcG9uZW50cy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gZGRyX3Rlc3RfY29tcGxldGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGRyX3Rlc3QgPSB7IC5uYW1lID0gImRkcl90ZXN0IiwgLmRlc2NyID0gIlJlc3VsdHMgb2YgdGhlIEREUiBUZXN0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSwgZGRyX3Rlc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGRyX3Rlc3QgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRkcl90ZXN0IiwgLmRlc2NyID0gIlJlc3VsdHMgb2YgdGhlIEREUiBUZXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSwgZGRyX3Rlc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIiwgLmRlc2NyID0gIlRoZSBERFIgVGVzdCBoYXMgY29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2Nvbm5lY3Rpb25fY29tcGxldGUgPSB7IC5uYW1lID0gImNvbm5lY3Rpb25fY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNvbm5lY3Rpb25fY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fQ09NUExFVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGNvbm5lY3Rpb25fY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfY29ubmVjdGlvbl9lc3RhYmxpc2hlZCA9IHsgLm5hbWUgPSAiY29ubmVjdGlvbl9lc3RhYmxpc2hlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29ubmVjdGlvbl9lc3RhYmxpc2hlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgY29ubmVjdGlvbl9lc3RhYmxpc2hlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19jb25uZWN0aW9uX2ZhaWx1cmUgPSB7IC5uYW1lID0gImNvbm5lY3Rpb25fZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29ubmVjdGlvbl9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGNvbm5lY3Rpb25fZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19kZHJfdGVzdF9jb21wbGV0ZSA9IHsgLm5hbWUgPSAiZGRyX3Rlc3RfY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRkcl90ZXN0X2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERFJfVEVTVF9DT01QTEVURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgZGRyX3Rlc3RfY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfZGV2aWNlX2tlZXBfYWxpdmUgPSB7IC5uYW1lID0gImRldmljZV9rZWVwX2FsaXZlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZXZpY2Vfa2VlcF9hbGl2ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX0tFRVBfQUxJVkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGRldmljZV9rZWVwX2FsaXZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2RldmljZV9yZWFkeSA9IHsgLm5hbWUgPSAiZGV2aWNlX3JlYWR5IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZXZpY2VfcmVhZHlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9SRUFEWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgZGV2aWNlX3JlYWR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUgPSB7IC5uYW1lID0gImRpc2Nvbm5lY3Rpb25fY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRpc2Nvbm5lY3Rpb25fY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUgPSB7IC5uYW1lID0gImltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGltYWdlX3RyYW5zZmVyX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2luZGljYXRpb25zX2Ryb3BwZWQgPSB7IC5uYW1lID0gImluZGljYXRpb25zX2Ryb3BwZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImluZGljYXRpb25zX2Ryb3BwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGluZGljYXRpb25zX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfc3dfZXJyb3IgPSB7IC5uYW1lID0gInN3X2Vycm9yIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzd19lcnJvclwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIHN3X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX3N3X2V4Y2VwdGlvbiA9IHsgLm5hbWUgPSAic3dfZXhjZXB0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzd19leGNlcHRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VYQ0VQVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgc3dfZXhjZXB0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2Nvbm5lY3Rpb25fY29tcGxldGUsICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19jb25uZWN0aW9uX2VzdGFibGlzaGVkLCAmcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfY29ubmVjdGlvbl9mYWlsdXJlLCAmcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfZGRyX3Rlc3RfY29tcGxldGUsICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19kZXZpY2Vfa2VlcF9hbGl2ZSwgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2RldmljZV9yZWFkeSwgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUsICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSwgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2luZGljYXRpb25zX2Ryb3BwZWQsICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19zd19lcnJvciwgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX3N3X2V4Y2VwdGlvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY29ubmVjdGlvbl9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29ubmVjdGlvbl9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGNvbm5lY3Rpb25fY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjb25uZWN0aW9uX2VzdGFibGlzaGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjb25uZWN0aW9uX2VzdGFibGlzaGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgY29ubmVjdGlvbl9lc3RhYmxpc2hlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImNvbm5lY3Rpb25fZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29ubmVjdGlvbl9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgY29ubmVjdGlvbl9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZGRyX3Rlc3RfY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRkcl90ZXN0X2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgZGRyX3Rlc3RfY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkZXZpY2Vfa2VlcF9hbGl2ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGV2aWNlX2tlZXBfYWxpdmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBkZXZpY2Vfa2VlcF9hbGl2ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRldmljZV9yZWFkeSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGV2aWNlX3JlYWR5XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgZGV2aWNlX3JlYWR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZGlzY29ubmVjdGlvbl9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGlzY29ubmVjdGlvbl9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImluZGljYXRpb25zX2Ryb3BwZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImluZGljYXRpb25zX2Ryb3BwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBpbmRpY2F0aW9uc19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3dfZXJyb3IiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN3X2Vycm9yXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgc3dfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzd19leGNlcHRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN3X2V4Y2VwdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIHN3X2V4Y2VwdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fZGVuaWVkX2xpbmsgPT09PSAqLworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRVBPTiBOSSBjb250YWluaW5nIHRoZSBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9FUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfa2V5X21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5LCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfa2V5X2Vwb25fbmksICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfa2V5X21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIlVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEVQT04gTkkgY29udGFpbmluZyB0aGUgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBNQUMgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5LCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19jZmdfYWxhcm1fc3RhdGUgPSB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSBvZiB0aGUgYWxhcm1zIG9uIHRoaXMgbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhLCBhbGFybV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2FsYXJtX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSBvZiB0aGUgYWxhcm1zIG9uIHRoaXMgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEsIGFsYXJtX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gdW5rbm93bl9saW5rX3Zpb2xhdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VTktOT1dOX0xJTktfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSIsIC5kZXNjciA9ICJBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgd2hpbGUgdGhlIFBPTiB3YXMgc2V0IHRvIFwibm90aWZ5IHVua25vd25cIiByZWdpc3RyYXRpb24gYmVoYXZpb3IgYW5kIHRoaXMgbGluayB3YXMgbm90IHByZS1wcm92aXNpb25lZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIG92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSIsIC5kZXNjciA9ICJUaGlzIGlzIHdoZW4gbGluayB0cmllcyB0byByZWdpc3RlciBhbmQgdGhlcmUgYXJlIGFscmVhZHkgdG9vIG1hbnkgZXhpc3RpbmcgbGFzZXIgb24vb2ZmIGNvbWJpbmF0aW9ucy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIGxhc2VyX29uX29mZl92aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEiLCAuZGVzY3IgPSAiVGhpcyBpcyB3aGVuIGEgbGluayB0cmllcyB0byByZWlnc3RlciB3aXRoIGFuIGltcG9zc2libGUgbGFzZXIgb24gb3Igb2ZmIHRpbWUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSBtYXhfbGlua192aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIiwgLmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgaXQgd291bGQgaGF2ZSBwdXQgdXMgb3ZlciB0aGUgcHJvdmlzaW9uZWQgbWF4IGxpbmtzIGZvciB0aGUgY29ycmVzcG9uZGluZyBFUE9OIE5JLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEiLCAuZGVzY3IgPSAiQSBsaW5rIHRyaWVkIHRvIHJlZ2lzdGVyIGFuZCBpdCB0aGVyZSBhcmUgbm8gTExJRHMgYXZhaWxhYmxlLiBJZiB0aGlzIG9jY3VycywgaXQgaXMgcG9zc2libGUgdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCB5b3VyICdtYXggbGlua3MnIGFuZC9vciAnQmFzZSBMTElEJyBmaWVsZHMgb24geW91ciBSUC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhIiwgLmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgd2Ugd2VyZSB1bmFibGUgdG8gYWxsb2NhdGUgc3lzdGVtIHJlc291cmNlcyBmb3IgaXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSByYW5nZV92aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdlX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdlX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIiwgLmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciB3aXRoIGEgcmFuZ2UgdmFsdWUgdGhhdCB3YXMgb3V0c2lkZSBvZiB0aGUgbWluL21heCBmaWJlciBsZW5ndGguIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1RETV9DSEFOTkVMU19FWEhBVVNURURfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSIsIC5kZXNjciA9ICJURE0gQ2hhbm5lbHMgRXhoYXVzdGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSByb2d1ZV92aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19ST0dVRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhIiwgLmRlc2NyID0gIkEgUm9ndWUgT05VIHdhcyBkZXRlY3RlZCBvbiB0aGlzIGxpbmsvTExJRC4gIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSIsIC5kZXNjciA9ICJUaGlzIGxpbmsgZmFpbGVkIHRvIHJlZ2lzdGVyIGJlY2F1c2UgdGhlcmUgd2FzIGluc3VmZmljaWVudCB1cHN0cmVhbSBiYW5kd2lkdGggYXZhaWxhYmxlIHRvIHByb3ZpZGUgdGhlIGRlZmF1bHQgVUJELiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2xhc2VyX29uX29mZl92aW9sYXRpb24gPSB7IC5uYW1lID0gImxhc2VyX29uX29mZl92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxhc2VyX29uX29mZl92aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiA9IHsgLm5hbWUgPSAibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCBsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19tYXhfbGlua192aW9sYXRpb24gPSB7IC5uYW1lID0gIm1heF9saW5rX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibWF4X2xpbmtfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTUFYX0xJTktfVklPTEFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgbWF4X2xpbmtfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiA9IHsgLm5hbWUgPSAib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfcmFuZ2VfdmlvbGF0aW9uID0geyAubmFtZSA9ICJyYW5nZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJhbmdlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JBTkdFX1ZJT0xBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHJhbmdlX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfcm9ndWVfdmlvbGF0aW9uID0geyAubmFtZSA9ICJyb2d1ZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiA9IHsgLm5hbWUgPSAic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkID0geyAubmFtZSA9ICJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVERNX0NIQU5ORUxTX0VYSEFVU1RFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHRkbV9jaGFubmVsc19leGhhdXN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3Vua25vd25fbGlua192aW9sYXRpb24gPSB7IC5uYW1lID0gInVua25vd25fbGlua192aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInVua25vd25fbGlua192aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgdW5rbm93bl9saW5rX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiA9IHsgLm5hbWUgPSAidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uLCAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX21heF9saW5rX3Zpb2xhdGlvbiwgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiwgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19yYW5nZV92aW9sYXRpb24sICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfcm9ndWVfdmlvbGF0aW9uLCAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24sICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCwgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ191bmtub3duX2xpbmtfdmlvbGF0aW9uLCAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIGxhc2VyX29uX29mZl92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJtYXhfbGlua192aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1heF9saW5rX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCBtYXhfbGlua192aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyYW5nZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJhbmdlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCByYW5nZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyb2d1ZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCByb2d1ZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHRkbV9jaGFubmVsc19leGhhdXN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ1bmtub3duX2xpbmtfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ1bmtub3duX2xpbmtfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHVua25vd25fbGlua192aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fbGluayA9PT09ICovCisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRVBPTiBOSSBjb250YWluaW5nIHRoZSBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfa2V5X21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19rZXlfZXBvbl9uaSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2tleV9tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIlVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEVQT04gTkkgY29udGFpbmluZyB0aGUgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbGlua19yYXRlID0geyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiVGhpcyBsaW5rJ3MgZG93bnN0cmVhbSBhbmQgdXBzdHJlYW0gcmF0ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxpbmtfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19zdGF0ZV9mbGFncyA9IHsgLm5hbWUgPSAic3RhdGVfZmxhZ3MiLCAuZGVzY3IgPSAiRVBPTiBsaW5rIHN0YXRlIGZsYWdzIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBsaW5rLiAgIFJlZ2lzdGVyZWQgc3RhdGUgZmxhZyBpcyBjb250cm9sZWQgYnkgdGhlIHN0YXRpYyByZWdpc3RyYXRpb24gb3BlcmF0aW9uIGZvciBsaW5rcyBvbiBhIHByb3RlY3RlZC1zdGFuZGJ5IFBPTi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgc3RhdGVfZmxhZ3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2xsaWQgPSB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiTExJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbGFzZXJfb25fdGltZV90cSA9IHsgLm5hbWUgPSAibGFzZXJfb25fdGltZV90cSIsIC5kZXNjciA9ICJMYXNlci1vbiB0aW1lIGluIHRpbWUgcXVhbnRhLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxhc2VyX29uX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19sYXNlcl9vZmZfdGltZV90cSA9IHsgLm5hbWUgPSAibGFzZXJfb2ZmX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXItb2ZmIHRpbWUgaW4gdGltZSBxdWFudGEuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MQVNFUl9PRkZfVElNRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxhc2VyX29mZl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfcmFuZ2VfdmFsdWVfdHEgPSB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLmRlc2NyID0gIlJhbmdlIHZhbHVlIHVzZWQgZm9yIHRoaXMgbGluayAtIGluIHRpbWUgcXVhbnRhLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfUkFOR0VfVkFMVUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2Rpc3RhbmNlID0geyAubmFtZSA9ICJkaXN0YW5jZSIsIC5kZXNjciA9ICJEaXN0YW5jZSB0byB0aGUgT05VIChEaWZmZXJzIGZyb20gcmFuZ2UgdmFsdWUgaW4gdGhhdCB0aGlzIGlnbm9yZXMgaW50ZXJuYWwgZGVsYXlzKSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfRElTVEFOQ0UsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBkaXN0YW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGFsYXJtX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ190dW5uZWxfaWQgPSB7IC5uYW1lID0gInR1bm5lbF9pZCIsIC5kZXNjciA9ICJUdW5uZWwgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9UVU5ORUxfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCB0dW5uZWxfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVQT04gbGluay4gIEEgdmFsdWUgb2YgMHhGRiBpbmRpY2F0ZXMgdGhhdCB0aGUgbGluayBoYXMgbm90IGJlZW4gYXNzb2NpYXRlZCB3aXRoIGFuIE9OVS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX21pbl9sYXNlcl9vdmVyaGVhZCA9IHsgLm5hbWUgPSAibWluX2xhc2VyX292ZXJoZWFkIiwgLmRlc2NyID0gIk1pbiBMYXNlciBPdmVyaGVhZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIG1pbl9sYXNlcl9vdmVyaGVhZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfa2V5X2V4Y2hhbmdlX2NvbmZpZyA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbmZpZyIsIC5kZXNjciA9ICJFbmNyeXB0aW9uIGtleSBleGNoYW5nZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2Vwb25fZW5jcnlwdGlvbiA9IHsgLm5hbWUgPSAiZXBvbl9lbmNyeXB0aW9uIiwgLmRlc2NyID0gIkVQT04gRW5jcnlwdGlvbiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9FUE9OX0VOQ1JZUFRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBlcG9uX2VuY3J5cHRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19mZWNfZW5hYmxlID0geyAubmFtZSA9ICJmZWNfZW5hYmxlIiwgLmRlc2NyID0gIkZFQyBlbmFibGUgc3RhdGUgZm9yIHRoaXMgbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9GRUNfRU5BQkxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgZmVjX2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX29hbV9oZWFydGJlYXRfY29uZmlnID0geyAubmFtZSA9ICJvYW1faGVhcnRiZWF0X2NvbmZpZyIsIC5kZXNjciA9ICJPQU0gaGVhcnRiZWF0IGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIG9hbV9oZWFydGJlYXRfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX3Vwc3RyZWFtX2JhbmR3aWR0aCA9IHsgLm5hbWUgPSAidXBzdHJlYW1fYmFuZHdpZHRoIiwgLmRlc2NyID0gIlVwc3RyZWFtIEJhbmR3aWR0aCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIHVwc3RyZWFtX2JhbmR3aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX3ViZF9pbmZvID0geyAubmFtZSA9ICJ1YmRfaW5mbyIsIC5kZXNjciA9ICJSZXR1cm5zIHRoZSBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIFVCRC4gVXNlZnVsIGlmIHlvdSB3YW50IHRvIHNlZSB3aGF0IHZhbHVlIHRoZSBmaXJtd2FyZSBjaG9zZSBmb3IgYSBmaWVsZCBzZXQgdG8gJ2F1dG9tYXRpYycuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIHViZF9pbmZvKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdWJkX2luZm8gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2Nsb2NrX3RyYW5zcG9ydF9lbmFibGUgPSB7IC5uYW1lID0gImNsb2NrX3RyYW5zcG9ydF9lbmFibGUiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdG8gZW5hYmxlIGNsb2NrIHRyYW5zcG9ydCBvbiB0aGlzIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0VOQUJMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX3BlbmRpbmdfZ3JhbnRzID0geyAubmFtZSA9ICJwZW5kaW5nX2dyYW50cyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHBlbmRpbmcgZ3JhbnRzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfUEVORElOR19HUkFOVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBwZW5kaW5nX2dyYW50cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbGlua190eXBlID0geyAubmFtZSA9ICJsaW5rX3R5cGUiLCAuZGVzY3IgPSAiTGluayBUeXBlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsaW5rX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2xpbmtfcmF0ZSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19zdGF0ZV9mbGFncywgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19sbGlkLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2xhc2VyX29uX3RpbWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbGFzZXJfb2ZmX3RpbWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfcmFuZ2VfdmFsdWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfZGlzdGFuY2UsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfYWxhcm1fc3RhdGUsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfdHVubmVsX2lkLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX29udV9pZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19taW5fbGFzZXJfb3ZlcmhlYWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfa2V5X2V4Y2hhbmdlX2NvbmZpZywgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19lcG9uX2VuY3J5cHRpb24sICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfZmVjX2VuYWJsZSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19vYW1faGVhcnRiZWF0X2NvbmZpZywgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ191cHN0cmVhbV9iYW5kd2lkdGgsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfdWJkX2luZm8sICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19wZW5kaW5nX2dyYW50cywgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19saW5rX3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiVGhpcyBsaW5rJ3MgZG93bnN0cmVhbSBhbmQgdXBzdHJlYW0gcmF0ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgbGlua19yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSwgeyAubmFtZSA9ICJzdGF0ZV9mbGFncyIsIC5kZXNjciA9ICJFUE9OIGxpbmsgc3RhdGUgZmxhZ3MgcmVmbGVjdCB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGxpbmsuICAgUmVnaXN0ZXJlZCBzdGF0ZSBmbGFnIGlzIGNvbnRyb2xlZCBieSB0aGUgc3RhdGljIHJlZ2lzdHJhdGlvbiBvcGVyYXRpb24gZm9yIGxpbmtzIG9uIGEgcHJvdGVjdGVkLXN0YW5kYnkgUE9OLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBzdGF0ZV9mbGFncyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncyB9LCB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiTExJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfSwgeyAubmFtZSA9ICJsYXNlcl9vbl90aW1lX3RxIiwgLmRlc2NyID0gIkxhc2VyLW9uIHRpbWUgaW4gdGltZSBxdWFudGEuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxhc2VyX29uX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibGFzZXJfb2ZmX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXItb2ZmIHRpbWUgaW4gdGltZSBxdWFudGEuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxhc2VyX29mZl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLmRlc2NyID0gIlJhbmdlIHZhbHVlIHVzZWQgZm9yIHRoaXMgbGluayAtIGluIHRpbWUgcXVhbnRhLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJkaXN0YW5jZSIsIC5kZXNjciA9ICJEaXN0YW5jZSB0byB0aGUgT05VIChEaWZmZXJzIGZyb20gcmFuZ2UgdmFsdWUgaW4gdGhhdCB0aGlzIGlnbm9yZXMgaW50ZXJuYWwgZGVsYXlzKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBkaXN0YW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGFsYXJtX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlIH0sIHsgLm5hbWUgPSAidHVubmVsX2lkIiwgLmRlc2NyID0gIlR1bm5lbCBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCB0dW5uZWxfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRVBPTiBsaW5rLiAgQSB2YWx1ZSBvZiAweEZGIGluZGljYXRlcyB0aGF0IHRoZSBsaW5rIGhhcyBub3QgYmVlbiBhc3NvY2lhdGVkIHdpdGggYW4gT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJtaW5fbGFzZXJfb3ZlcmhlYWQiLCAuZGVzY3IgPSAiTWluIExhc2VyIE92ZXJoZWFkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIG1pbl9sYXNlcl9vdmVyaGVhZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9jb25maWciLCAuZGVzY3IgPSAiRW5jcnlwdGlvbiBrZXkgZXhjaGFuZ2UgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIH0sIHsgLm5hbWUgPSAiZXBvbl9lbmNyeXB0aW9uIiwgLmRlc2NyID0gIkVQT04gRW5jcnlwdGlvbiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgZXBvbl9lbmNyeXB0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyB9LCB7IC5uYW1lID0gImZlY19lbmFibGUiLCAuZGVzY3IgPSAiRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdGhpcyBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBmZWNfZW5hYmxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZlY19lbiB9LCB7IC5uYW1lID0gIm9hbV9oZWFydGJlYXRfY29uZmlnIiwgLmRlc2NyID0gIk9BTSBoZWFydGJlYXQgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBvYW1faGVhcnRiZWF0X2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fYmFuZHdpZHRoIiwgLmRlc2NyID0gIlVwc3RyZWFtIEJhbmR3aWR0aCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCB1cHN0cmVhbV9iYW5kd2lkdGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIH0sIHsgLm5hbWUgPSAidWJkX2luZm8iLCAuZGVzY3IgPSAiUmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBVQkQuIFVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzZWUgd2hhdCB2YWx1ZSB0aGUgZmlybXdhcmUgY2hvc2UgZm9yIGEgZmllbGQgc2V0IHRvICdhdXRvbWF0aWMnLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCB1YmRfaW5mbyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ViZF9pbmZvIH0sIHsgLm5hbWUgPSAiY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSIsIC5kZXNjciA9ICJXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgY2xvY2sgdHJhbnNwb3J0IG9uIHRoaXMgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBlbmRpbmdfZ3JhbnRzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcGVuZGluZyBncmFudHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIHBlbmRpbmdfZ3JhbnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibGlua190eXBlIiwgLmRlc2NyID0gIkxpbmsgVHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsaW5rX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfdHlwZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2RhdGFfYnl0ZXMgPSB7IC5uYW1lID0gInJ4X2RhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2RhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZGF0YV9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2RhdGFfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2RhdGFfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc182NCA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJyeF9mcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfMTI4XzI1NSA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18yNTZfNTExID0geyAubmFtZSA9ICJyeF9mcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJyeF9mcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18xMDI0XzE1MTggPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18xNTE5XzIwNDcgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc180MDk2XzkyMTYgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc185MjE3XzE2MzgzID0geyAubmFtZSA9ICJyeF9mcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfb2FtX2J5dGVzID0geyAubmFtZSA9ICJyeF9vYW1fYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9vYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfb2FtX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfb2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9tcGNwX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfbXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVBDUF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF91bmljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfbXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9yZXBvcnRfZnJhbWVzID0geyAubmFtZSA9ICJyeF9yZXBvcnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfUkVQT1JUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9yZXBvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2Zjc19lcnJvciA9IHsgLm5hbWUgPSAicnhfZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2Zjc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9vdmVyc2l6ZV9lcnJvciA9IHsgLm5hbWUgPSAicnhfb3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfb3ZlcnNpemVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfcnVudF9lcnJvciA9IHsgLm5hbWUgPSAicnhfcnVudF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfcnVudF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9saW5lX2NvZGVfZXJyb3IgPSB7IC5uYW1lID0gInJ4X2xpbmVfY29kZV9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGxpbmUgY29kZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2xpbmVfY29kZV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9saW5lX2NvZGVfZXJyb3JfbWF4ID0geyAubmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3JfbWF4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbGluZSBjb2RlIGVycm9ycyBtYXggcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9saW5lX2NvZGVfZXJyb3JfbWF4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2RhdGFfYnl0ZXMgPSB7IC5uYW1lID0gInR4X2RhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2RhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZGF0YV9mcmFtZXMgPSB7IC5uYW1lID0gInR4X2RhdGFfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2RhdGFfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc182NCA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMTI4XzI1NSA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc18yNTZfNTExID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc18xMDI0XzE1MTggPSB7IC5uYW1lID0gInR4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc18xNTE5XzIwNDcgPSB7IC5uYW1lID0gInR4X2ZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gInR4X2ZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc180MDk2XzkyMTYgPSB7IC5uYW1lID0gInR4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc185MjE3XzE2MzgzID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfb2FtX2J5dGVzID0geyAubmFtZSA9ICJ0eF9vYW1fYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9vYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfb2FtX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfb2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9tcGNwX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfbXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVBDUF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF91bmljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9nYXRlcyA9IHsgLm5hbWUgPSAidHhfZ2F0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBnYXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZ2F0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9kYXRhX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9kYXRhX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzY0LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfNjVfMTI3LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfMTI4XzI1NSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzI1Nl81MTEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc181MTJfMTAyMywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzEwMjRfMTUxOCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzE1MTlfMjA0NywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzIwNDhfNDA5NSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzQwOTZfOTIxNiwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzkyMTdfMTYzODMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X29hbV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfb2FtX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfbXBjcF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9tdWx0aWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9yZXBvcnRfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mY3NfZXJyb3IsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X292ZXJzaXplX2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9ydW50X2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9saW5lX2NvZGVfZXJyb3IsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2xpbmVfY29kZV9lcnJvcl9tYXgsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2RhdGFfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2RhdGFfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfb2FtX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9vYW1fZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9tcGNwX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfYnJvYWRjYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfdW5pY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X211bHRpY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2dhdGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJ4X2RhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9kYXRhX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZGF0YV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9vYW1fYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9vYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9vYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X21wY3BfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9tcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9icm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X3VuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X211bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9yZXBvcnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X3JlcG9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2Zjc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9vdmVyc2l6ZV9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfb3ZlcnNpemVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcnVudF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9ydW50X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2xpbmVfY29kZV9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGxpbmUgY29kZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2xpbmVfY29kZV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3JfbWF4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbGluZSBjb2RlIGVycm9ycyBtYXggcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2xpbmVfY29kZV9lcnJvcl9tYXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9kYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2RhdGFfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9kYXRhX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X29hbV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X29hbV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9vYW1fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X29hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfbXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X21wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2Jyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF91bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9tdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2dhdGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZ2F0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9nYXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGZvcmNlX3JlZGlzY292ZXJ5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGRlbGV0ZV9saW5rICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2RlbGV0ZV9saW5rX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGtleV9leGNoYW5nZV9mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSIsIC5kZXNjciA9ICJUaGUgT0xUIGZhaWxlZCB0byByZWNlaXZlIGFuIHVwZGF0ZWQgZW5jcnlwdGlvbiBrZXkgd2l0aGluIHRoZSBleHBlY3RlZCB0aW1lIHBlcmlvZCBhZnRlciBlbmNyeXB0aW9uIGtleSBleGNoYW5nZSBoYXMgYmVlbiBpbml0aWF0ZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGVuY3J5cHRpb25fZW5hYmxlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gbXBjcF9yZWdfYWNrX3RpbWVvdXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gcmFuZ2VfdmFsdWVfY2hhbmdlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX3JhbmdlX3ZhbHVlX3RxID0geyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJOZXcgcmFuZ2UgdmFsdWUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19SQU5HRV9WQUxVRV9DSEFOR0VEX0lEX1JBTkdFX1ZBTFVFX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEsIHJhbmdlX3ZhbHVlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfcmFuZ2VfdmFsdWVfdHEgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAuZGVzY3IgPSAiTmV3IHJhbmdlIHZhbHVlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSwgcmFuZ2VfdmFsdWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBzZW50IHdoZW4gYSByYW5nZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9wcm90ZWN0aW9uX3N0YXR1cyA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zdGF0dXMiLCAuZGVzY3IgPSAiVGhlIGxpbmsncyBwb3N0LXN3aXRjaCByb2xlICh3b3JraW5nIG9yIHN0YW5kYnkpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUFJPVEVDVElPTl9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEsIHByb3RlY3Rpb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX3JhbmdlX3ZhbHVlX3RxID0geyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJDdXJyZW50IHJhbmdlIHZhbHVlIGluIHRpbWUgcXVhbnRhLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUkFOR0VfVkFMVUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEsIHJhbmdlX3ZhbHVlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9wcm90ZWN0aW9uX3N0YXR1cywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX3JhbmdlX3ZhbHVlX3RxIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N0YXR1cyIsIC5kZXNjciA9ICJUaGUgbGluaydzIHBvc3Qtc3dpdGNoIHJvbGUgKHdvcmtpbmcgb3Igc3RhbmRieSkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YSwgcHJvdGVjdGlvbl9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUgfSwgeyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJDdXJyZW50IHJhbmdlIHZhbHVlIGluIHRpbWUgcXVhbnRhLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEsIHJhbmdlX3ZhbHVlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEiLCAuZGVzY3IgPSAiVGhlIGxpbmsgaGFzIHVuZGVyZ29uZSBhIHByb3RlY3Rpb24gc3dpdGNoIGV2ZW50LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pbml0aWFsX3JhbmdlX3RxID0geyAubmFtZSA9ICJpbml0aWFsX3JhbmdlX3RxIiwgLmRlc2NyID0gIlJhbmdlIGFzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZmlyc3QgZnJhbWUgcmVjZWl2ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9JTklUSUFMX1JBTkdFX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhLCBpbml0aWFsX3JhbmdlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9jdXJyZW50X3JhbmdlX3RxID0geyAubmFtZSA9ICJjdXJyZW50X3JhbmdlX3RxIiwgLmRlc2NyID0gIlJhbmdlIGFzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY3VycmVudCBmcmFtZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0NVUlJFTlRfUkFOR0VfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEsIGN1cnJlbnRfcmFuZ2VfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2luaXRpYWxfcmFuZ2VfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9jdXJyZW50X3JhbmdlX3RxIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbml0aWFsX3JhbmdlX3RxIiwgLmRlc2NyID0gIlJhbmdlIGFzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZmlyc3QgZnJhbWUgcmVjZWl2ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSwgaW5pdGlhbF9yYW5nZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJjdXJyZW50X3JhbmdlX3RxIiwgLmRlc2NyID0gIlJhbmdlIGFzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY3VycmVudCBmcmFtZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhLCBjdXJyZW50X3JhbmdlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEiLCAuZGVzY3IgPSAiQSByZWdpc3RlciByZXF1ZXN0ZWQgd2FzIHJlY2VpdmVkIGZvciBhIGxpbmsgd2l0aCB0aGUgc2FtZSBNQUMgYWRkcmVzcyBhcyBhIGxpbmsgdGhhdCBoYXMgYWxyZWFkeSByZWdpc3RlcmVkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBsaW5rX3NwZWVkX21pc21hdGNoICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfcHJldmlvdXNfcmF0ZSA9IHsgLm5hbWUgPSAicHJldmlvdXNfcmF0ZSIsIC5kZXNjciA9ICJQT04gcmF0ZSBsaW5rIGluaXRpYWxseSByZWdpc3RlcmVkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX1BSRVZJT1VTX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSwgcHJldmlvdXNfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfY3VycmVudF9yYXRlID0geyAubmFtZSA9ICJjdXJyZW50X3JhdGUiLCAuZGVzY3IgPSAiUE9OIHJhdGUgbGluayBpcyBjdXJyZW50bHkgYXR0ZW1wdGluZyB0byByZWdpc3RlciBhdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9DVVJSRU5UX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSwgY3VycmVudF9yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX3ByZXZpb3VzX3JhdGUsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2N1cnJlbnRfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwcmV2aW91c19yYXRlIiwgLmRlc2NyID0gIlBPTiByYXRlIGxpbmsgaW5pdGlhbGx5IHJlZ2lzdGVyZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEsIHByZXZpb3VzX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9LCB7IC5uYW1lID0gImN1cnJlbnRfcmF0ZSIsIC5kZXNjciA9ICJQT04gcmF0ZSBsaW5rIGlzIGN1cnJlbnRseSBhdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGF0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhLCBjdXJyZW50X3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhIiwgLmRlc2NyID0gIkhvc3Qgd2lsbCByZWNlaXZlIHRoaXMgaW5kaWNhdGlvbiBpZiBhIGxpbmsgcmVnaXN0ZXJzIHRoZW4gYXR0ZW1wdHMgdG8gcmVnaXN0ZXIgbGF0ZXIgYXQgYSBkaWZmZXJlbnQgc3BlZWQsIG9yIGlmIHRoZSBsaW5rIHJlZ2lzdGVycyBhdCBhIGRpZmZlcmVudCBzcGVlZCB0aGFuIHRoZSBzcGVlZCB3aXRoIHdoaWNoIGl0IHdhcyBwcmUtcHJvdmlzaW9uZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIG1wY3BfcmVwb3J0X3RpbWVvdXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfUkVQT1JUX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhIiwgLmRlc2NyID0gIlRoZSBwcm92aXNpb25lZCBsaW1pdCBiZXR3ZWVuIHJlcG9ydHMgZm9yIHRoZSBzcGVjaWZpZWQgbGluayBoYXMgYmVlbiBleGNlZWRlZC4gIFRoaXMgbGluayB3aWxsIGJlIGRlLXJlZ2lzdGVyZWQsIGFuZCB0aGUgYWxhcm1fc3RhdHVzIHNldCB3aGVuIHRoaXMgb2NjdXJzLiAgVGhlIGFsYXJtX3N0YXR1cyB3aWxsIGJlIGNsZWFyZWQgd2hlbiB0aGUgbGluayBhdHRlbXB0cyB0byByZWdpc3RlciBhZ2Fpbi4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gb2FtX2tlZXBhbGl2ZV90aW1lb3V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSIsIC5kZXNjciA9ICJUaGUgcHJvdmlzaW9uZWQgdGltZSBsaW1pdCBiZXR3ZWVuIHJlY2VpdmluZyB1cHN0cmVhbSBpbmZvIGZyYW1lcyBoYXMgYmVlbiBleGNlZWRlZC4gIE5vcm1hbGx5IGFuIE9OVSB3aWxsIHJlc2V0IGl0cyBPQU0gc3RhdGUgbWFjaGluZSB3aGVuIHRoaXMgb2NjdXJycyBhbmQgdGhlIGhvc3QgbXVzdCByZS1uZWdvdGlhdGUgT0FNIGFuZCByZXByb3Zpc2lvbiB0aGUgbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gbXBjcF9kaXNjb3ZlcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9saW5rX2luZm8gPSB7IC5uYW1lID0gImxpbmtfaW5mbyIsIC5kZXNjciA9ICJJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2NvdmVyZWQgbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfRElTQ09WRVJFRF9JRF9MSU5LX0lORk8sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhLCBsaW5rX2luZm8pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5mbyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2xpbmtfaW5mbyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxpbmtfaW5mbyIsIC5kZXNjciA9ICJJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2NvdmVyZWQgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSwgbGlua19pbmZvKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2luZm8gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEiLCAuZGVzY3IgPSAiQSBsaW5rIGhhcyBjb21wbGV0ZWQgTVBDUCBsaW5rIHJlZ2lzdHJhdGlvbi4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gbXBjcF9kZXJlZ2lzdGVyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9saW5rX2luZm8gPSB7IC5uYW1lID0gImxpbmtfaW5mbyIsIC5kZXNjciA9ICJJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURURfSURfTElOS19JTkZPLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSwgbGlua19pbmZvKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2luZm8gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9saW5rX2luZm8gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5rX2luZm8iLCAuZGVzY3IgPSAiSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhLCBsaW5rX2luZm8pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5mbyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSIsIC5kZXNjciA9ICJSYWlzZWQgYWZ0ZXIgYW4gJ2FkZF9saW5rJyBvcGVyYXRpb24gb24gYW4gRVBPTiBOSSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9zZW5kX3BlcmlvZCA9IHsgLm5hbWUgPSAic2VuZF9wZXJpb2QiLCAuZGVzY3IgPSAiVGhlIHBlcmlvZCBhdCB3aGljaCB0byBzZW5kIE9BTSBpbmZvIGZyYW1lcyAoaW4gc2Vjb25kcykuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX1NFTkRfUEVSSU9ELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEsIHNlbmRfcGVyaW9kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfc2VuZF9wZXJpb2QgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic2VuZF9wZXJpb2QiLCAuZGVzY3IgPSAiVGhlIHBlcmlvZCBhdCB3aGljaCB0byBzZW5kIE9BTSBpbmZvIGZyYW1lcyAoaW4gc2Vjb25kcykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhLCBzZW5kX3BlcmlvZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSIsIC5kZXNjciA9ICJTdGFydCB0aGUgT0FNIGtlZXBhbGl2ZSB0aW1lciBhZ2FpbnN0IHRoaXMgbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBrZXlfZXhjaGFuZ2Vfc3RhcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X3BlcmlvZCA9IHsgLm5hbWUgPSAicGVyaW9kIiwgLmRlc2NyID0gIktleSBleGNoYW5nZSBwZXJpb2QgaW4gc2Vjb25kcy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9QRVJJT0QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhLCBwZXJpb2QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfcGVyaW9kIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicGVyaW9kIiwgLmRlc2NyID0gIktleSBleGNoYW5nZSBwZXJpb2QgaW4gc2Vjb25kcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSwgcGVyaW9kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSIsIC5kZXNjciA9ICJBcHBseSB0aGUgY29ycmVzcG9uZGluZyBwcm92aXNpb25pbmcgZm9yICdlcG9uX2xpbmsua2V5X2V4Y2hhbmdlX2NvbmZpZycgYWdhaW5zdCB0aGlzIGxpbmsgYW5kIHRoZW4gc3RhcnQga2V5IGV4Y2hhbmdlIHRpbWVyIHdpdGggdGhlIGdpdmVuIHBlcmlvZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0ga2V5X2V4Y2hhbmdlX3N0b3AgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGtleV9leGNoYW5nZV9zdGFydGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGtleV9leGNoYW5nZV9zdG9wcGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIHN0YXRpY19yZWdpc3RyYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9sYXNlcm9uX3RpbWVfdHEgPSB7IC5uYW1lID0gImxhc2Vyb25fdGltZV90cSIsIC5kZXNjciA9ICJMYXNlci1vbiB0aW1lIGluIHRpbWUgcXVhbnRhLlxcIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST05fVElNRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhLCBsYXNlcm9uX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fbGFzZXJvZmZfdGltZV90cSA9IHsgLm5hbWUgPSAibGFzZXJvZmZfdGltZV90cSIsIC5kZXNjciA9ICJMYXNlci1vZmYgdGltZSBpbiB0aW1lIHF1YW50YS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPRkZfVElNRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhLCBsYXNlcm9mZl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX3JhbmdlX3ZhbHVlX3RxID0geyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJSYW5nZSB2YWx1ZSB1c2VkIGZvciB0aGlzIGxpbmsgLSBpbiB0aW1lIHF1YW50YS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUkFOR0VfVkFMVUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSwgcmFuZ2VfdmFsdWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fcGVuZGluZ19ncmFudHMgPSB7IC5uYW1lID0gInBlbmRpbmdfZ3JhbnRzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcGVuZGluZyBncmFudHMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEsIHBlbmRpbmdfZ3JhbnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9sYXNlcm9uX3RpbWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2xhc2Vyb2ZmX3RpbWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX3JhbmdlX3ZhbHVlX3RxLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9wZW5kaW5nX2dyYW50cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsYXNlcm9uX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXItb24gdGltZSBpbiB0aW1lIHF1YW50YS5cXCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSwgbGFzZXJvbl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImxhc2Vyb2ZmX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXItb2ZmIHRpbWUgaW4gdGltZSBxdWFudGEuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhLCBsYXNlcm9mZl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLmRlc2NyID0gIlJhbmdlIHZhbHVlIHVzZWQgZm9yIHRoaXMgbGluayAtIGluIHRpbWUgcXVhbnRhLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSwgcmFuZ2VfdmFsdWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicGVuZGluZ19ncmFudHMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBwZW5kaW5nIGdyYW50cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEsIHBlbmRpbmdfZ3JhbnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGljYWxseSByZWdpc3RlcnMgdGhlIGxvZ2ljYWwgbGluayIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBzdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIHJlcmFuZ2VfZmFpbHVyZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gaW5qZWN0X2ZyYW1lICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2luamVjdF9mcmFtZV9mcmFtZSA9IHsgLm5hbWUgPSAiZnJhbWUiLCAuZGVzY3IgPSAiQ29tcGxldGUgY29udGVudHMgb2YgdGhlIGZyYW1lIGJlZ2lubmluZyB3aXRoIHRoZSBEQSB1cCB0aHJvdWdoIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBDUkMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhLCBmcmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2luamVjdF9mcmFtZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19pbmplY3RfZnJhbWVfZnJhbWUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmcmFtZSIsIC5kZXNjciA9ICJDb21wbGV0ZSBjb250ZW50cyBvZiB0aGUgZnJhbWUgYmVnaW5uaW5nIHdpdGggdGhlIERBIHVwIHRocm91Z2ggYnV0IG5vdCBpbmNsdWRpbmcgdGhlIENSQy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSwgZnJhbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSIsIC5kZXNjciA9ICJTZW5kIGFuIGFyYml0cmFyeSBmcmFtZSBhY3Jvc3MgdGhlIHNwZWNpZmllZCBsaW5rLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBmcmFtZV9jYXB0dXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9mcmFtZSA9IHsgLm5hbWUgPSAiZnJhbWUiLCAuZGVzY3IgPSAiQ29udGVudHMgb2YgdGhlIGZyYW1lLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfRlJBTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEsIGZyYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZnJhbWUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZyYW1lIiwgLmRlc2NyID0gIkNvbnRlbnRzIG9mIHRoZSBmcmFtZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhLCBmcmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSIsIC5kZXNjciA9ICJBIGZyYW1lIG1hdGNoaW5nIGhvc3Qtc3BlY2lmaWVkIGNyaXRlcmlhIHdhcyByZWNlaXZlZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gbGlua19kZWxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QgPSB7IC5uYW1lID0gImR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2VuY3J5cHRpb25fZW5hYmxlZCA9IHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9lbmFibGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJlbmNyeXB0aW9uX2VuYWJsZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0VOQ1JZUFRJT05fRU5BQkxFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgZW5jcnlwdGlvbl9lbmFibGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2tleV9leGNoYW5nZV9mYWlsdXJlID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfc3RhcnRlZCA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX3N0YXJ0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9zdGFydGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX3N0b3BwZWQgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9zdG9wcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfc3RvcHBlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1NUT1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9zdG9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2xpbmtfZGVsZXRlZCA9IHsgLm5hbWUgPSAibGlua19kZWxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsaW5rX2RlbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfREVMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbGlua19kZWxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2xpbmtfc3BlZWRfbWlzbWF0Y2ggPSB7IC5uYW1lID0gImxpbmtfc3BlZWRfbWlzbWF0Y2giLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxpbmtfc3BlZWRfbWlzbWF0Y2hcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfU1BFRURfTUlTTUFUQ0gsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGxpbmtfc3BlZWRfbWlzbWF0Y2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfbXBjcF9kZXJlZ2lzdGVyZWQgPSB7IC5uYW1lID0gIm1wY3BfZGVyZWdpc3RlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX2RlcmVnaXN0ZXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ERVJFR0lTVEVSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIG1wY3BfZGVyZWdpc3RlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX21wY3BfZGlzY292ZXJlZCA9IHsgLm5hbWUgPSAibXBjcF9kaXNjb3ZlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX2Rpc2NvdmVyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfRElTQ09WRVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbXBjcF9kaXNjb3ZlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX21wY3BfcmVnX2Fja190aW1lb3V0ID0geyAubmFtZSA9ICJtcGNwX3JlZ19hY2tfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF9yZWdfYWNrX3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfUkVHX0FDS19USU1FT1VULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX3JlZ19hY2tfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19tcGNwX3JlcG9ydF90aW1lb3V0ID0geyAubmFtZSA9ICJtcGNwX3JlcG9ydF90aW1lb3V0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX3JlcG9ydF90aW1lb3V0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX3JlcG9ydF90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZW91dCA9IHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lb3V0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvYW1fa2VlcGFsaXZlX3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRU9VVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgb2FtX2tlZXBhbGl2ZV90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCA9IHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCA9IHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCA9IHsgLm5hbWUgPSAicHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19yYW5nZV92YWx1ZV9jaGFuZ2VkID0geyAubmFtZSA9ICJyYW5nZV92YWx1ZV9jaGFuZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyYW5nZV92YWx1ZV9jaGFuZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SQU5HRV9WQUxVRV9DSEFOR0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCByYW5nZV92YWx1ZV9jaGFuZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3JlcmFuZ2VfZmFpbHVyZSA9IHsgLm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyZXJhbmdlX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1JFUkFOR0VfRkFJTFVSRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgcmVyYW5nZV9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUgPSB7IC5uYW1lID0gInN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIHN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2VuY3J5cHRpb25fZW5hYmxlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2tleV9leGNoYW5nZV9mYWlsdXJlLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfc3RvcHBlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2xpbmtfZGVsZXRlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2xpbmtfc3BlZWRfbWlzbWF0Y2gsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19tcGNwX2RlcmVnaXN0ZXJlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX21wY3BfZGlzY292ZXJlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX21wY3BfcmVnX2Fja190aW1lb3V0LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfbXBjcF9yZXBvcnRfdGltZW91dCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZW91dCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfcmFuZ2VfdmFsdWVfY2hhbmdlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3JlcmFuZ2VfZmFpbHVyZSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImVuY3J5cHRpb25fZW5hYmxlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZW5jcnlwdGlvbl9lbmFibGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgZW5jcnlwdGlvbl9lbmFibGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfc3RhcnRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX3N0YXJ0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfc3RhcnRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9zdG9wcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfc3RvcHBlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9zdG9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibGlua19kZWxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsaW5rX2RlbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBsaW5rX2RlbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsaW5rX3NwZWVkX21pc21hdGNoIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsaW5rX3NwZWVkX21pc21hdGNoXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbGlua19zcGVlZF9taXNtYXRjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1wY3BfZGVyZWdpc3RlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX2RlcmVnaXN0ZXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIG1wY3BfZGVyZWdpc3RlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibXBjcF9kaXNjb3ZlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX2Rpc2NvdmVyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX2Rpc2NvdmVyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJtcGNwX3JlZ19hY2tfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF9yZWdfYWNrX3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX3JlZ19hY2tfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1wY3BfcmVwb3J0X3RpbWVvdXQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1wY3BfcmVwb3J0X3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX3JlcG9ydF90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lb3V0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvYW1fa2VlcGFsaXZlX3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBvYW1fa2VlcGFsaXZlX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX2NoYW5nZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJhbmdlX3ZhbHVlX2NoYW5nZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCByYW5nZV92YWx1ZV9jaGFuZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyZXJhbmdlX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCByZXJhbmdlX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBzdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBlcG9uX25pID09PT0gKi8KKworLyogR3JvdXA6IGVwb25fbmkgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2tleV9lcG9uX25pID0geyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIlRoZSBpbmRleCBvZiBhIHNwZWNpZmljIEVQT04gTkkgaW5zdGFuY2UgYXMgc2VlbiBieSB0aGUgaG9zdC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfa2V5X2Vwb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiVGhlIGluZGV4IG9mIGEgc3BlY2lmaWMgRVBPTiBOSSBpbnN0YW5jZSBhcyBzZWVuIGJ5IHRoZSBob3N0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgdXNlZCBmb3IgYWxsIGZyYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIE9MVCBvbiB0aGUgUE9OLiAgVGhpcyB2YWx1ZSBtdXN0IGJlIHNldCBiZWZvcmUgRVBPTl9OSSBpcyBmaXJzdCBlbmFibGVkLCBhbmQgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFDX0FERFJFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZXBvbl9uaV9lbiA9IHsgLm5hbWUgPSAiZXBvbl9uaV9lbiIsIC5kZXNjciA9ICJJbmRpY2F0ZXMgdGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGUgRVBPTiBOSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX05JX0VOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGVwb25fbmlfZW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfcmVnaXN0cmF0aW9uX2JlaGF2aW9yID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25fYmVoYXZpb3IiLCAuZGVzY3IgPSAiRGV0ZXJtaW5lcyBob3cgcmVnaXN0cmF0aW9uIHJlcXVlc3RzIGZyb20gdW5rbm93biBsaW5rcyBhcmUgaGFuZGxlZC4gIFNldCB0byAnTm90aWZ5IFVua25vd24nIHRvIGZvcmNlIGFsbCBsaW5rcyB0byBiZSBwcmUtcHJvdmlzaW9uZWQuICBJZiBpbiAnTm90aWZ5IFVua25vd24nIG1vZGUsIE1QQ1AgUmVnaXN0cmF0aW9uIG9mIGFuIHVua25vd24gbGluayB3aWxsIGJlIGRlbmllZCwgYW5kIGEgJ1doaXRlIExpc3QgVmlvbGF0aW9uXCIgd2lsbCBiZSBzZW50IHRvIHRoZSBob3N0LiBJZiBzZXQgdG8gJ0F1dG9tYXRpYycsIHRoZSBsaW5rIHJlZ2lzdGVycyBmdWxseSB3aXRob3V0IGhvc3QgaW50ZXJhY3Rpb24uICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9SRUdJU1RSQVRJT05fQkVIQVZJT1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbXR1XzFnID0geyAubmFtZSA9ICJtdHVfMWciLCAuZGVzY3IgPSAiTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMUcgcGF0aC4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgYW4gb2RkIHZhbHVlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbXR1XzFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX210dV8xMGcgPSB7IC5uYW1lID0gIm10dV8xMGciLCAuZGVzY3IgPSAiTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMTBHIHBhdGguIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGFuIG9kZCB2YWx1ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzEwRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBtdHVfMTBnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX21pbmltdW1fZmliZXJfbGVuZ3RoID0geyAubmFtZSA9ICJtaW5pbXVtX2ZpYmVyX2xlbmd0aCIsIC5kZXNjciA9ICJUaGUgbWluaW11bSBmaWJlciBsZW5ndGgsIGluIG1ldGVycywgYXQgd2hpY2ggd2UgZXhwZWN0IHRvIGZpbmQgYW4gT05VLiBOb3RlczogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBmaWJlciBsZW5ndGggY2Fubm90IGV4Y2VlZCAxMDAga20uIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gU29tZSBPTlVzIGNhbiByZWdpc3RlciBhdCBkaXN0YW5jZXMgdGhhdCBhcmUgbGVzcyB0aGFuIHRoZSBwcm92aXNpb25lZCBtaW5pbXVtLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NSU5JTVVNX0ZJQkVSX0xFTkdUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tYXhpbXVtX2ZpYmVyX2xlbmd0aCA9IHsgLm5hbWUgPSAibWF4aW11bV9maWJlcl9sZW5ndGgiLCAuZGVzY3IgPSAiVGhlIG1heGltdW0gZmliZXIgbGVuZ3RoLCBpbiBtZXRlcnMsIGF0IHdoaWNoIHdlIGV4cGVjdCB0byBmaW5kIGFuIE9OVS4gTm90ZXM6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZmliZXIgbGVuZ3RoIGNhbm5vdCBleGNlZWQgMTAwIGttLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIFNvbWUgT05VcyBjYW4gcmVnaXN0ZXIgYXQgZGlzdGFuY2VzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiB0aGUgcHJvdmlzaW9uZWQgbWF4aW11bS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFYSU1VTV9GSUJFUl9MRU5HVEgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbWF4aW11bV9maWJlcl9sZW5ndGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZ3JhbnRfc3BhY2luZ190cSA9IHsgLm5hbWUgPSAiZ3JhbnRfc3BhY2luZ190cSIsIC5kZXNjciA9ICJUaGUgZGVhZCB0aW1lIG9uIHRoZSBQT04gYmV0d2VlbiB1cHN0cmVhbSBidXJzdHMuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0dSQU5UX1NQQUNJTkdfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgZ3JhbnRfc3BhY2luZ190cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zID0geyAubmFtZSA9ICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIiwgLmRlc2NyID0gIkNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBFUE9OIGxpbmtzIHJlZ2lzdHJhdGlvbiBhbmQgcmVwb3J0aW5nLiBUaGlzIHZhbHVlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9MT0dJQ0FMX0xJTktfT1BUSU9OUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX21wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyA9IHsgLm5hbWUgPSAibXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zIiwgLmRlc2NyID0gIlBlcmlvZCBvZiBNUENQIGRpc2NvdmVyeSB3aW5kb3dzLiAgSW4gdGhpcyB0aW1lIHBlcmlvZCwgb25lIGRpc2NvdmVyeSBnYXRlIHdpbGwgYmUgc2VudCBmb3IgZXZlcnkgZW5hYmxlZCBSUC4gIFRoZSBkaXNjb3ZlcnkgZ2F0ZXMgd2lsbCBiZSBzcGFjZWQgZXF1YWxseSBhY3Jvc3MgdGhlIHRpbWUgcGVyaW9kLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIEVQT04gTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxBUk1fU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYWxhcm1fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYWxsX2xpbmtzID0geyAubmFtZSA9ICJhbGxfbGlua3MiLCAuZGVzY3IgPSAiTGlzdCBvZiBhbGwgbGlua3Mgb24gdGhlIEVQT04gTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxMX0xJTktTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGFsbF9saW5rcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19lbmNyeXB0aW9uX2NmZyA9IHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9jZmciLCAuZGVzY3IgPSAiRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIHRoYXQgYXBwbGllcyB0byB0aGUgRVBPTiBOSSBhcyBhIHdob2xlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBlbmNyeXB0aW9uX2NmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZyIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfY2xvY2tfdHJhbnNwb3J0X2NmZyA9IHsgLm5hbWUgPSAiY2xvY2tfdHJhbnNwb3J0X2NmZyIsIC5kZXNjciA9ICJDbG9jayB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBjbG9ja190cmFuc3BvcnRfY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2Ryb3Bkb3duX3dlaWdodHMgPSB7IC5uYW1lID0gImRyb3Bkb3duX3dlaWdodHMiLCAuZGVzY3IgPSAiRHJvcC1kb3duIFdlaWdodHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRFJPUERPV05fV0VJR0hUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBkcm9wZG93bl93ZWlnaHRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl83IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlID0geyAubmFtZSA9ICJhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UiLCAuZGVzY3IgPSAiQXBwcm94aW1hdGUgU29saWNpdGVkIFVzYWdlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVBQUk9YSU1BVEVfU09MSUNJVEVEX1VTQUdFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9ib3VuZHNfOCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2FwcHJveGltYXRlX3RkbV91c2FnZSA9IHsgLm5hbWUgPSAiYXBwcm94aW1hdGVfdGRtX3VzYWdlIiwgLmRlc2NyID0gIkFwcHJveGltYXRlIFRETSBVc2FnZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1RETV9VU0FHRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbm9fcmVwb3J0c19zb2FrX3RpbWUgPSB7IC5uYW1lID0gIm5vX3JlcG9ydHNfc29ha190aW1lIiwgLmRlc2NyID0gIlBlcmlvZCBvZiB0aW1lIGFmdGVyIGxhc3QgcmVwb3J0IHJlY2VpdmVkIHRvIHNlbmQgbm8gcmVwb3J0cyBhbGFybSAoaW4gbXMpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBub19yZXBvcnRzX3NvYWtfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19wb25fYWdncmVnYXRlX3NoYXBlciA9IHsgLm5hbWUgPSAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIiLCAuZGVzY3IgPSAiUE9OIEFnZ3JlZ2F0ZSBTaGFwZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUE9OX0FHR1JFR0FURV9TSEFQRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2VzdGltYXRlZF9wb25fbGF0ZW5jeV90cSA9IHsgLm5hbWUgPSAiZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxIiwgLmRlc2NyID0gIkVzdGltYXRlZCBQT04gTGF0ZW5jeSAoVFEpIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVNUSU1BVEVEX1BPTl9MQVRFTkNZX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9ib3VuZHNfOCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX29udV91cGdyYWRlX3BhcmFtcyA9IHsgLm5hbWUgPSAib251X3VwZ3JhZGVfcGFyYW1zIiwgLmRlc2NyID0gIk9OVSB1cGdyYWRlIHBhcmFtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgb251X3VwZ3JhZGVfcGFyYW1zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4gPSB7IC5uYW1lID0gImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiIsIC5kZXNjciA9ICJFbmFibGUgMTBHIEF1dG9ub21vdXMgUm9ndWUgRGVjdGlvbiBkdXJpbmcgZGlzY292ZXJ5IHdpbmRvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4gPSB7IC5uYW1lID0gImF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuIiwgLmRlc2NyID0gIkVuYWJsZSAxRyBBdXRvbm9tb3VzIFJvZ3VlIERlY3Rpb24gZHVyaW5nIGRpc2NvdmVyeSB3aW5kb3ciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMUdfRU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkID0geyAubmFtZSA9ICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkIiwgLmRlc2NyID0gIlNldCB0aHJlc2hvbGQgZm9yIG51bWJlciBvZiBTeW5jUGF0dGVybnMgcmVjZWl2ZWQgd2l0aG91dCBhIEJ1cnN0IERlbGltaXRlciB0byB0cmlnZ2VyIHRoZSBmYXVsdC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tYWNfYWRkcmVzcywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZXBvbl9uaV9lbiwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfcmVnaXN0cmF0aW9uX2JlaGF2aW9yLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tdHVfMWcsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX210dV8xMGcsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX21pbmltdW1fZmliZXJfbGVuZ3RoLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tYXhpbXVtX2ZpYmVyX2xlbmd0aCwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZ3JhbnRfc3BhY2luZ190cSwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hbGFybV9zdGF0ZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYWxsX2xpbmtzLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19lbmNyeXB0aW9uX2NmZywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19jbG9ja190cmFuc3BvcnRfY2ZnLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19kcm9wZG93bl93ZWlnaHRzLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2FwcHJveGltYXRlX3RkbV91c2FnZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbm9fcmVwb3J0c19zb2FrX3RpbWUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX3Bvbl9hZ2dyZWdhdGVfc2hhcGVyLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19lc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX29udV91cGdyYWRlX3BhcmFtcywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgdXNlZCBmb3IgYWxsIGZyYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIE9MVCBvbiB0aGUgUE9OLiAgVGhpcyB2YWx1ZSBtdXN0IGJlIHNldCBiZWZvcmUgRVBPTl9OSSBpcyBmaXJzdCBlbmFibGVkLCBhbmQgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gImVwb25fbmlfZW4iLCAuZGVzY3IgPSAiSW5kaWNhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIEVQT04gTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBlcG9uX25pX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9iZWhhdmlvciIsIC5kZXNjciA9ICJEZXRlcm1pbmVzIGhvdyByZWdpc3RyYXRpb24gcmVxdWVzdHMgZnJvbSB1bmtub3duIGxpbmtzIGFyZSBoYW5kbGVkLiAgU2V0IHRvICdOb3RpZnkgVW5rbm93bicgdG8gZm9yY2UgYWxsIGxpbmtzIHRvIGJlIHByZS1wcm92aXNpb25lZC4gIElmIGluICdOb3RpZnkgVW5rbm93bicgbW9kZSwgTVBDUCBSZWdpc3RyYXRpb24gb2YgYW4gdW5rbm93biBsaW5rIHdpbGwgYmUgZGVuaWVkLCBhbmQgYSAnV2hpdGUgTGlzdCBWaW9sYXRpb25cIiB3aWxsIGJlIHNlbnQgdG8gdGhlIGhvc3QuIElmIHNldCB0byAnQXV0b21hdGljJywgdGhlIGxpbmsgcmVnaXN0ZXJzIGZ1bGx5IHdpdGhvdXQgaG9zdCBpbnRlcmFjdGlvbi4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCByZWdpc3RyYXRpb25fYmVoYXZpb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3IgfSwgeyAubmFtZSA9ICJtdHVfMWciLCAuZGVzY3IgPSAiTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMUcgcGF0aC4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgYW4gb2RkIHZhbHVlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbXR1XzFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm10dV8xMGciLCAuZGVzY3IgPSAiTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMTBHIHBhdGguIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGFuIG9kZCB2YWx1ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG10dV8xMGcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWluaW11bV9maWJlcl9sZW5ndGgiLCAuZGVzY3IgPSAiVGhlIG1pbmltdW0gZmliZXIgbGVuZ3RoLCBpbiBtZXRlcnMsIGF0IHdoaWNoIHdlIGV4cGVjdCB0byBmaW5kIGFuIE9OVS4gTm90ZXM6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZmliZXIgbGVuZ3RoIGNhbm5vdCBleGNlZWQgMTAwIGttLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIFNvbWUgT05VcyBjYW4gcmVnaXN0ZXIgYXQgZGlzdGFuY2VzIHRoYXQgYXJlIGxlc3MgdGhhbiB0aGUgcHJvdmlzaW9uZWQgbWluaW11bS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG1pbmltdW1fZmliZXJfbGVuZ3RoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1heGltdW1fZmliZXJfbGVuZ3RoIiwgLmRlc2NyID0gIlRoZSBtYXhpbXVtIGZpYmVyIGxlbmd0aCwgaW4gbWV0ZXJzLCBhdCB3aGljaCB3ZSBleHBlY3QgdG8gZmluZCBhbiBPTlUuIE5vdGVzOiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGZpYmVyIGxlbmd0aCBjYW5ub3QgZXhjZWVkIDEwMCBrbS4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiBTb21lIE9OVXMgY2FuIHJlZ2lzdGVyIGF0IGRpc3RhbmNlcyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gdGhlIHByb3Zpc2lvbmVkIG1heGltdW0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBtYXhpbXVtX2ZpYmVyX2xlbmd0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJncmFudF9zcGFjaW5nX3RxIiwgLmRlc2NyID0gIlRoZSBkZWFkIHRpbWUgb24gdGhlIFBPTiBiZXR3ZWVuIHVwc3RyZWFtIGJ1cnN0cy4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGdyYW50X3NwYWNpbmdfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyIsIC5kZXNjciA9ICJDb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gRVBPTiBsaW5rcyByZWdpc3RyYXRpb24gYW5kIHJlcG9ydGluZy4gVGhpcyB2YWx1ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyB9LCB7IC5uYW1lID0gIm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyIsIC5kZXNjciA9ICJQZXJpb2Qgb2YgTVBDUCBkaXNjb3Zlcnkgd2luZG93cy4gIEluIHRoaXMgdGltZSBwZXJpb2QsIG9uZSBkaXNjb3ZlcnkgZ2F0ZSB3aWxsIGJlIHNlbnQgZm9yIGV2ZXJ5IGVuYWJsZWQgUlAuICBUaGUgZGlzY292ZXJ5IGdhdGVzIHdpbGwgYmUgc3BhY2VkIGVxdWFsbHkgYWNyb3NzIHRoZSB0aW1lIHBlcmlvZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIEVQT04gTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhbGFybV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgfSwgeyAubmFtZSA9ICJhbGxfbGlua3MiLCAuZGVzY3IgPSAiTGlzdCBvZiBhbGwgbGlua3Mgb24gdGhlIEVQT04gTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhbGxfbGlua3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4IH0sIHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9jZmciLCAuZGVzY3IgPSAiRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIHRoYXQgYXBwbGllcyB0byB0aGUgRVBPTiBOSSBhcyBhIHdob2xlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgZW5jcnlwdGlvbl9jZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnIiwgLmRlc2NyID0gIlByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJjbG9ja190cmFuc3BvcnRfY2ZnIiwgLmRlc2NyID0gIkNsb2NrIHRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgY2xvY2tfdHJhbnNwb3J0X2NmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJkcm9wZG93bl93ZWlnaHRzIiwgLmRlc2NyID0gIkRyb3AtZG93biBXZWlnaHRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBkcm9wZG93bl93ZWlnaHRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl83IH0sIHsgLm5hbWUgPSAiYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlIiwgLmRlc2NyID0gIkFwcHJveGltYXRlIFNvbGljaXRlZCBVc2FnZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX2JvdW5kc184IH0sIHsgLm5hbWUgPSAiYXBwcm94aW1hdGVfdGRtX3VzYWdlIiwgLmRlc2NyID0gIkFwcHJveGltYXRlIFRETSBVc2FnZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm5vX3JlcG9ydHNfc29ha190aW1lIiwgLmRlc2NyID0gIlBlcmlvZCBvZiB0aW1lIGFmdGVyIGxhc3QgcmVwb3J0IHJlY2VpdmVkIHRvIHNlbmQgbm8gcmVwb3J0cyBhbGFybSAoaW4gbXMpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIiLCAuZGVzY3IgPSAiUE9OIEFnZ3JlZ2F0ZSBTaGFwZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgfSwgeyAubmFtZSA9ICJlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEiLCAuZGVzY3IgPSAiRXN0aW1hdGVkIFBPTiBMYXRlbmN5IChUUSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9ib3VuZHNfOCB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX3BhcmFtcyIsIC5kZXNjciA9ICJPTlUgdXBncmFkZSBwYXJhbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG9udV91cGdyYWRlX3BhcmFtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIH0sIHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuIiwgLmRlc2NyID0gIkVuYWJsZSAxMEcgQXV0b25vbW91cyBSb2d1ZSBEZWN0aW9uIGR1cmluZyBkaXNjb3Zlcnkgd2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiIsIC5kZXNjciA9ICJFbmFibGUgMUcgQXV0b25vbW91cyBSb2d1ZSBEZWN0aW9uIGR1cmluZyBkaXNjb3Zlcnkgd2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQiLCAuZGVzY3IgPSAiU2V0IHRocmVzaG9sZCBmb3IgbnVtYmVyIG9mIFN5bmNQYXR0ZXJucyByZWNlaXZlZCB3aXRob3V0IGEgQnVyc3QgRGVsaW1pdGVyIHRvIHRyaWdnZXIgdGhlIGZhdWx0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gc2V0X2Vwb25fbmlfZW5fc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgdGhlIEVQT04gTkkgZW5hYmxlIHN0YXRlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gaXNzdWVfcnNzaV9ncmFudCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9ncmFudGVkX2xpbmsgPSB7IC5uYW1lID0gImdyYW50ZWRfbGluayIsIC5kZXNjciA9ICJMb2dpY2FsIGxpbmsgdG8gZ3JhbnQsIHdoaWNoIHNob3VsZCBlaXRoZXIgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciB1bmljYXN0IGxpbmsgb2YgaW50ZXJlc3Qgb24gdGhlIFBPTiBvciwgMCBmb3IgaWRsZSBwb3dlciBtZWFzdXJlbWVudC4gMCB3aWxsIHVzZSBhIGxpbmsgdGhhdCB3aWxsIG5vdCByZXN1bHQgaW4gdXBzdHJlYW0gdHJhbnNtaXNzaW9uIGJ5IGFueSBkZXZpY2Ugb24gdGhlIFBPTi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSwgZ3JhbnRlZF9saW5rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF90cmlnZ2VyX3dpZHRoID0geyAubmFtZSA9ICJ0cmlnZ2VyX3dpZHRoIiwgLmRlc2NyID0gIlJzc2kgVHJpZ2dlciBXaWR0aCBpbiBucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9XSURUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSwgdHJpZ2dlcl93aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfdHJpZ2dlcl9kZWxheSA9IHsgLm5hbWUgPSAidHJpZ2dlcl9kZWxheSIsIC5kZXNjciA9ICJSc3NpIFRyaWdnZXIgRGVsYXkgaW4gbnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEsIHRyaWdnZXJfZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X3NhbXBsZV9wZXJpb2QgPSB7IC5uYW1lID0gInNhbXBsZV9wZXJpb2QiLCAuZGVzY3IgPSAiUnNzaSBTYW1wZSBQZXJpb2QgaW4gdXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEsIHNhbXBsZV9wZXJpb2QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2dyYW50ZWRfbGluaywgJnByb3BfZGVzY3JfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X3RyaWdnZXJfd2lkdGgsICZwcm9wX2Rlc2NyX2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF90cmlnZ2VyX2RlbGF5LCAmcHJvcF9kZXNjcl9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfc2FtcGxlX3BlcmlvZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZ3JhbnRlZF9saW5rIiwgLmRlc2NyID0gIkxvZ2ljYWwgbGluayB0byBncmFudCwgd2hpY2ggc2hvdWxkIGVpdGhlciBiZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHVuaWNhc3QgbGluayBvZiBpbnRlcmVzdCBvbiB0aGUgUE9OIG9yLCAwIGZvciBpZGxlIHBvd2VyIG1lYXN1cmVtZW50LiAwIHdpbGwgdXNlIGEgbGluayB0aGF0IHdpbGwgbm90IHJlc3VsdCBpbiB1cHN0cmVhbSB0cmFuc21pc3Npb24gYnkgYW55IGRldmljZSBvbiB0aGUgUE9OLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEsIGdyYW50ZWRfbGluayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJ0cmlnZ2VyX3dpZHRoIiwgLmRlc2NyID0gIlJzc2kgVHJpZ2dlciBXaWR0aCBpbiBucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEsIHRyaWdnZXJfd2lkdGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAidHJpZ2dlcl9kZWxheSIsIC5kZXNjciA9ICJSc3NpIFRyaWdnZXIgRGVsYXkgaW4gbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhLCB0cmlnZ2VyX2RlbGF5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInNhbXBsZV9wZXJpb2QiLCAuZGVzY3IgPSAiUnNzaSBTYW1wZSBQZXJpb2QgaW4gdXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhLCBzYW1wbGVfcGVyaW9kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEiLCAuZGVzY3IgPSAiSXNzdWVzIGFuIFJTU0kgZ3JhbnQgdG8gcmVhZCBSWCBQb3dlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gYWRkX2xpbmsgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9saW5rX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3Mgb2YgdGhlIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9NQUNfQUREUkVTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX2xpbmtfcmF0ZSA9IHsgLm5hbWUgPSAicmF0ZSIsIC5kZXNjciA9ICJSYXRlIG9mIGxpbmsgdG8gcHJlLXByb3Zpc2lvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9SQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSwgcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9hZGRfbGlua19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX2xpbmtfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX2xpbmtfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJyYXRlIiwgLmRlc2NyID0gIlJhdGUgb2YgbGluayB0byBwcmUtcHJvdmlzaW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhLCByYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEiLCAuZGVzY3IgPSAiUHJlLXByb3Zpc2lvbiBhbiBFUE9OIGxpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbmkgLSBhZGRfbXVsdGljYXN0X2xpbmsgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19tYWNfYWRkcmVzcyA9IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX3JhdGUgPSB7IC5uYW1lID0gInJhdGUiLCAuZGVzY3IgPSAiUmF0ZSBvZiBsaW5rIHRvIHByZS1wcm92aXNpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSwgcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19tYWNfYWRkcmVzcywgJnByb3BfZGVzY3JfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3Mgb2YgdGhlIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gInJhdGUiLCAuZGVzY3IgPSAiUmF0ZSBvZiBsaW5rIHRvIHByZS1wcm92aXNpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhLCByYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSIsIC5kZXNjciA9ICJQcmUtcHJvdmlzaW9uIGFuIEVQT04gbXVsdGljYXN0IGxpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbmkgLSBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluayAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfbWFjX2FkZHJlc3MgPSB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua193b3JraW5nX2xpbmtfaW5mbyA9IHsgLm5hbWUgPSAid29ya2luZ19saW5rX2luZm8iLCAuZGVzY3IgPSAiTGluayBpbmZvIGZvciB0aGUgYXNzb2NpYXRlZCB3b3JraW5nIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfV09SS0lOR19MSU5LX0lORk8sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhLCB3b3JraW5nX2xpbmtfaW5mbyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfd29ya2luZ19saW5rX2luZm8gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3Mgb2YgdGhlIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAid29ya2luZ19saW5rX2luZm8iLCAuZGVzY3IgPSAiTGluayBpbmZvIGZvciB0aGUgYXNzb2NpYXRlZCB3b3JraW5nIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEsIHdvcmtpbmdfbGlua19pbmZvKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2luZm8gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEiLCAuZGVzY3IgPSAiQWRkcyBhIHByb3RlY3RlZCBzdGFuZGJ5IGxpbmsuICBPbmNlIGl0IGhhcyBiZWVuIGNyZWF0ZWQsIHRoZSBsaW5rIGlzIGNvbnNpZGVyZWQgXCJzdGFuZGJ5XCIgZm9yIHRoZSBwdXBvc2VzIG9mIHByb3RlY3Rpb24gc3dpdGNoaW5nLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gbm9fcmVwb3J0cyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfbm9fcmVwb3J0c19hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9ub19yZXBvcnRzX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9ub19yZXBvcnRzX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEiLCAuZGVzY3IgPSAiTG9zcyBvZiBhbGwgcmVwb3J0cyBvbiBhbGwgbGlua3Mgb24gdGhlIEVQT04gTkkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIGxsaWRfcXVhcmFudGluZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfbGxpZCA9IHsgLm5hbWUgPSAibGxpZCIsIC5kZXNjciA9ICJMTElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MTElELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfbGlua19yYXRlID0geyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiTGluayBSYXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MSU5LX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEsIGxpbmtfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2xpbmtfbWFjID0geyAubmFtZSA9ICJsaW5rX21hYyIsIC5kZXNjciA9ICJMaW5rIE1BQyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEsIGxpbmtfbWFjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9yYW5nZV92YWx1ZV90cSA9IHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAuZGVzY3IgPSAiUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX1JBTkdFX1ZBTFVFX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX2xsaWRfcXVhcmFudGluZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfbGxpZCwgJnByb3BfZGVzY3JfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2xpbmtfcmF0ZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2xpbmtfbWFjLCAmcHJvcF9kZXNjcl9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfcmFuZ2VfdmFsdWVfdHEgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiTExJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEsIGxsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9LCB7IC5uYW1lID0gImxpbmtfcmF0ZSIsIC5kZXNjciA9ICJMaW5rIFJhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhLCBsaW5rX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9LCB7IC5uYW1lID0gImxpbmtfbWFjIiwgLmRlc2NyID0gIkxpbmsgTUFDIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSwgbGlua19tYWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAuZGVzY3IgPSAiUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhIiwgLmRlc2NyID0gIkxMSUQgUXVhcmFudGluZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfbmV3X3N0YXRlID0geyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAiTmV3IEVQT04gTkkgZW5hYmxlIHN0YXRlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX25ld19zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IGFmdGVyIGEgJ3NldF9lcG9uX25pX2VuX3N0YXRlJyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIHByb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfcmVyYW5nZV9kZWx0YSA9IHsgLm5hbWUgPSAicmVyYW5nZV9kZWx0YSIsIC5kZXNjciA9ICJSZS1yYW5nZSBkZWx0YSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEFfSURfUkVSQU5HRV9ERUxUQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSwgcmVyYW5nZV9kZWx0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfcmVyYW5nZV9kZWx0YSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVyYW5nZV9kZWx0YSIsIC5kZXNjciA9ICJSZS1yYW5nZSBkZWx0YSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEsIHJlcmFuZ2VfZGVsdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBseSByZS1yYW5nZSBkZWx0YSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gcmVyYW5nZV9mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2xsaWQgPSB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiTExJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2xpbmtfbWFjID0geyAubmFtZSA9ICJsaW5rX21hYyIsIC5kZXNjciA9ICJMaW5rIE1BQyAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MSU5LX01BQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIGxpbmtfbWFjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9sbGlkLCAmcHJvcF9kZXNjcl9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2xpbmtfbWFjIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJsbGlkIiwgLmRlc2NyID0gIkxMSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSwgbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH0sIHsgLm5hbWUgPSAibGlua19tYWMiLCAuZGVzY3IgPSAiTGluayBNQUMgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIGxpbmtfbWFjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gcm9ndWVfbGxpZF9zY2FuICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fbW9kZSA9IHsgLm5hbWUgPSAibW9kZSIsIC5kZXNjciA9ICJUcnVlID0gU2NhbiBhbGwgTExJRFMgb24gdGhlIFBPTiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEsIG1vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9sbGlkID0geyAubmFtZSA9ICJsbGlkIiwgLmRlc2NyID0gIlNwZWNpZmljIExMSUQgdG8gc2NhbiBvciAwIHRvIHNjYW4gYWxsIHdoZW4gbW9kZSBpcyBBTEwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTExJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX21vZGUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2xsaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibW9kZSIsIC5kZXNjciA9ICJUcnVlID0gU2NhbiBhbGwgTExJRFMgb24gdGhlIFBPTiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSwgbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiU3BlY2lmaWMgTExJRCB0byBzY2FuIG9yIDAgdG8gc2NhbiBhbGwgd2hlbiBtb2RlIGlzIEFMTCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSwgbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEiLCAuZGVzY3IgPSAiSXNzdWUgYSByZXF1ZXN0IHRvIHNjYW4gYWxsIExMSURzIG9yIGEgc3BlY2lmaWMgTExJRCBvbiBhIFBPTiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gc3RhcnRfb251X3VwZ3JhZGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2xpc3Rfb2Zfb251X2lkcyA9IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhLCBsaXN0X29mX29udV9pZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfbGlzdF9vZl9vbnVfaWRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSwgbGlzdF9vZl9vbnVfaWRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSIsIC5kZXNjciA9ICJTdGFydCBPTlUgRmlybXdhcmUgVXBncmFkZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gb251X3VwZ3JhZGVfY29tcGxldGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEFnYWluc3QgZW50aXJlIHVwZ3JhZGUgcHJvY2Vzcy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2xpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzID0geyAubmFtZSA9ICJsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVS1JRHMgdGhlIHVwZ3JhZGUgZmFpbGVkIGZvci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEsIGxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9zdGF0dXMsICZwcm9wX2Rlc2NyX2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiU3VjY2VzcyBvciBmYWlsdXJlLiAgQWdhaW5zdCBlbnRpcmUgdXBncmFkZSBwcm9jZXNzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVS1JRHMgdGhlIHVwZ3JhZGUgZmFpbGVkIGZvci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSwgbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSIsIC5kZXNjciA9ICJPTlUgVXBncmFkZSBDb21wbGV0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gcm9ndWVfc2Nhbl9jb21wbGV0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9yZXR1cm5faW5kX3N0YXR1cyA9IHsgLm5hbWUgPSAicmV0dXJuX2luZF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIGNvbXBsZXRlZCBzY2FuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfUk9HVUVfU0NBTl9DT01QTEVURV9JRF9SRVRVUk5fSU5EX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSwgcmV0dXJuX2luZF9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9yZXR1cm5faW5kX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmV0dXJuX2luZF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIGNvbXBsZXRlZCBzY2FuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSwgcmV0dXJuX2luZF9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGEiLCAuZGVzY3IgPSAiSW5kY2lhdGlvbiB0aGF0IGEgc2NhbiBpcyBjb21wbGV0ZSwgYW55IGVycm9yIGlzIGFsc28gcmV0dXJuZWQuICIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gbXBjcF90aW1lc3RhbXBfY2hhbmdlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9tcGNwX3RpbWVzdGFtcCA9IHsgLm5hbWUgPSAibXBjcF90aW1lc3RhbXAiLCAuZGVzY3IgPSAiVGhlIE1QQ1AgdGltZSBhdCB3aGljaCB0aGUgcHVsc2Ugd2FzIHJlY2VpdmVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX01QQ1BfVElNRVNUQU1QX0NIQU5HRURfSURfTVBDUF9USU1FU1RBTVAsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEsIG1wY3BfdGltZXN0YW1wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9tcGNwX3RpbWVzdGFtcCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibXBjcF90aW1lc3RhbXAiLCAuZGVzY3IgPSAiVGhlIE1QQ1AgdGltZSBhdCB3aGljaCB0aGUgcHVsc2Ugd2FzIHJlY2VpdmVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEsIG1wY3BfdGltZXN0YW1wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEiLCAuZGVzY3IgPSAiQSBjbG9jayB0cmFuc3BvcnQgcHVsc2Ugd2FzIHJlY2VpdmVkIGF0IHRoZSBnaXZlbiBNUENQIHRpbWVzdGFtcC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIGF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUgPSB7IC5uYW1lID0gImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzEwR19GQUlMVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSA9IHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfbGxpZF9xdWFyYW50aW5lZCA9IHsgLm5hbWUgPSAibGxpZF9xdWFyYW50aW5lZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibGxpZF9xdWFyYW50aW5lZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0xMSURfUVVBUkFOVElORUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBsbGlkX3F1YXJhbnRpbmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkID0geyAubmFtZSA9ICJtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIG1wY3BfdGltZXN0YW1wX2NoYW5nZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX25vX3JlcG9ydHMgPSB7IC5uYW1lID0gIm5vX3JlcG9ydHMiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm5vX3JlcG9ydHNcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgbm9fcmVwb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfb251X3VwZ3JhZGVfY29tcGxldGUgPSB7IC5uYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdXBncmFkZV9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgb251X3VwZ3JhZGVfY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX3JlcmFuZ2VfZmFpbHVyZSA9IHsgLm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyZXJhbmdlX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCByZXJhbmdlX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX3JvZ3VlX3NjYW5fY29tcGxldGUgPSB7IC5uYW1lID0gInJvZ3VlX3NjYW5fY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX3NjYW5fY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgcm9ndWVfc2Nhbl9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRlX2NoYW5nZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19sbGlkX3F1YXJhbnRpbmVkLCAmcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX21wY3BfdGltZXN0YW1wX2NoYW5nZWQsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfbm9fcmVwb3J0cywgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19vbnVfdXBncmFkZV9jb21wbGV0ZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19yZXJhbmdlX2ZhaWx1cmUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfcm9ndWVfc2Nhbl9jb21wbGV0ZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19zdGF0ZV9jaGFuZ2VfY29tcGxldGVkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJhdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIGF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibGxpZF9xdWFyYW50aW5lZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibGxpZF9xdWFyYW50aW5lZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBsbGlkX3F1YXJhbnRpbmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibXBjcF90aW1lc3RhbXBfY2hhbmdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF90aW1lc3RhbXBfY2hhbmdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibm9fcmVwb3J0cyIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibm9fcmVwb3J0c1wiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBub19yZXBvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV91cGdyYWRlX2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIG9udV91cGdyYWRlX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyZXJhbmdlX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgcmVyYW5nZV9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicm9ndWVfc2Nhbl9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicm9ndWVfc2Nhbl9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCByb2d1ZV9zY2FuX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdGVfY2hhbmdlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBlcG9uX29udV8xMGdfdXMgPT09PSAqLworCisvKiBHcm91cDogZXBvbl9vbnVfMTBnX3VzIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX2tleV9lcG9uX25pID0geyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIkVQT04gTkkgd2l0aCB3aGljaCB0aGlzIE9OVSBpbnRlcmZhY2UgaXMgYXNzb2NpYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX2tleV9vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgT05VIGludGVyZmFjZSB3aXRoaW4gaXRzIEVQT04gTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXksIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzEwZ191c19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfa2V5X2Vwb25fbmksICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19rZXlfb251X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSB3aXRoIHdoaWNoIHRoaXMgT05VIGludGVyZmFjZSBpcyBhc3NvY2lhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE9OVSBpbnRlcmZhY2Ugd2l0aGluIGl0cyBFUE9OIE5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fb251XzEwZ191cyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9mZWNfY29kZV93b3Jkc190b3RhbCA9IHsgLm5hbWUgPSAiZmVjX2NvZGVfd29yZHNfdG90YWwiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIGNvZGUgd29yZHMgdG90YWwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSwgZmVjX2NvZGVfd29yZHNfdG90YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzID0geyAubmFtZSA9ICJmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIGNvZGUgd29yZHMgZGVjb2RlIGZhaWxzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX0RFQ09ERV9GQUlMUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhLCBmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZmVjX3plcm9lc19jb3JyZWN0ZWQgPSB7IC5uYW1lID0gImZlY196ZXJvZXNfY29ycmVjdGVkIiwgLmRlc2NyID0gIkZFQyBzdGF0cyB6ZXJvcyBjb3JyZWN0ZWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX1pFUk9FU19DT1JSRUNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSwgZmVjX3plcm9lc19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZmVjX29uZXNfY29ycmVjdGVkID0geyAubmFtZSA9ICJmZWNfb25lc19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIG9uZXMgY29yZWN0ZWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEsIGZlY19vbmVzX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xMGdfdXNfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19zdGF0X2ZlY19jb2RlX3dvcmRzX3RvdGFsLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9mZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19zdGF0X2ZlY196ZXJvZXNfY29ycmVjdGVkLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9mZWNfb25lc19jb3JyZWN0ZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmVjX2NvZGVfd29yZHNfdG90YWwiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIGNvZGUgd29yZHMgdG90YWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEsIGZlY19jb2RlX3dvcmRzX3RvdGFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscyIsIC5kZXNjciA9ICJGRUMgc3RhdHMgY29kZSB3b3JkcyBkZWNvZGUgZmFpbHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEsIGZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfemVyb2VzX2NvcnJlY3RlZCIsIC5kZXNjciA9ICJGRUMgc3RhdHMgemVyb3MgY29ycmVjdGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhLCBmZWNfemVyb2VzX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfb25lc19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIG9uZXMgY29yZWN0ZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEsIGZlY19vbmVzX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fb251XzEwZ191cyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19jZmdfYWxsX2xpbmtzID0geyAubmFtZSA9ICJhbGxfbGlua3MiLCAuZGVzY3IgPSAiTGlzdCBvZiBNQUMgQWRkcmVzc2VzIGZvciBhbGwgbGlua3Mgb24gdGhlIE9OVSBJZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX0FMTF9MSU5LUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEsIGFsbF9saW5rcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xMGdfdXNfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX2NmZ19hbGxfbGlua3MgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGxfbGlua3MiLCAuZGVzY3IgPSAiTGlzdCBvZiBNQUMgQWRkcmVzc2VzIGZvciBhbGwgbGlua3Mgb24gdGhlIE9OVSBJZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YSwgYWxsX2xpbmtzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9vbnVfMTBnX3VzIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xMGdfdXMgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xMGdfdXMgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fb251XzEwZ191cyAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzEwZ191c19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fb251XzFnX3VzID09PT0gKi8KKworLyogR3JvdXA6IGVwb25fb251XzFnX3VzIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSB3aXRoIHdoaWNoIHRoaXMgT05VIGludGVyZmFjZSBpcyBhc3NvY2lhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfa2V5X29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBPTlUgaW50ZXJmYWNlIHdpdGhpbiBpdHMgRVBPTiBOSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXksIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzFnX3VzX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX2tleV9lcG9uX25pLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19rZXlfb251X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIHdpdGggd2hpY2ggdGhpcyBPTlUgaW50ZXJmYWNlIGlzIGFzc29jaWF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBPTlUgaW50ZXJmYWNlIHdpdGhpbiBpdHMgRVBPTiBOSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xZ191cyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2dvb2RfZnJhbWVzID0geyAubmFtZSA9ICJnb29kX2ZyYW1lcyIsIC5kZXNjciA9ICJHb29kIEZyYW1lIENvdW50LCBpbmNsdWRpbmcgbm9uRkVDIGFuZCBGRUMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGdvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZ29vZF9ieXRlcyA9IHsgLm5hbWUgPSAiZ29vZF9ieXRlcyIsIC5kZXNjciA9ICJHb29kIEJ5dGUgQ291bnQsIGluY2x1ZGluZyBub25GRUMgYW5kIEZFQyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBnb29kX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfb3ZlcnN6X2ZyYW1lcyA9IHsgLm5hbWUgPSAib3ZlcnN6X2ZyYW1lcyIsIC5kZXNjciA9ICJPdmVyc2l6ZWQgZnJhbWUgY291bnQgKGZyYW1lcyBsYXJnZXIgdGhhbiAyMDAwIGJ5dGVzKSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX09WRVJTWl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBvdmVyc3pfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfbm9uX2ZlY19nb29kX2ZyYW1lcyA9IHsgLm5hbWUgPSAibm9uX2ZlY19nb29kX2ZyYW1lcyIsIC5kZXNjciA9ICJOb24gRkVDIEdvb2QgRnJhbWUgQ291bnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgbm9uX2ZlY19nb29kX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X25vbl9mZWNfZ29vZF9ieXRlcyA9IHsgLm5hbWUgPSAibm9uX2ZlY19nb29kX2J5dGVzIiwgLmRlc2NyID0gIk5vbiBGRUMgR29vZCBCeXRlIENvdW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfTk9OX0ZFQ19HT09EX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgbm9uX2ZlY19nb29kX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2dvb2RfZnJhbWVzID0geyAubmFtZSA9ICJmZWNfZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiRkVDIEdvb2QgRnJhbWUgQ291bnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfZ29vZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfZ29vZF9ieXRlcyA9IHsgLm5hbWUgPSAiZmVjX2dvb2RfYnl0ZXMiLCAuZGVzY3IgPSAiRkVDIEdvb2QgQnl0ZSBDb3VudCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2dvb2RfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfZnJhbWVzX2V4Y19lcnJzID0geyAubmFtZSA9ICJmZWNfZnJhbWVzX2V4Y19lcnJzIiwgLmRlc2NyID0gIkZFQyBGcmFtZXMgd2hpY2ggZXhjZWVkZWQgOCBzeW1ib2wgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0ZSQU1FU19FWENfRVJSUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19mcmFtZXNfZXhjX2VycnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfYmxrc19ub19lcnJzID0geyAubmFtZSA9ICJmZWNfYmxrc19ub19lcnJzIiwgLmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCBubyBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19OT19FUlJTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2Jsa3Nfbm9fZXJycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19ibGtzX2NvcnJfZXJycyA9IHsgLm5hbWUgPSAiZmVjX2Jsa3NfY29ycl9lcnJzIiwgLmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCBjb3JyZWN0YWJsZSBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19DT1JSX0VSUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfYmxrc19jb3JyX2VycnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfYmxrc191bmNvcnJfZXJycyA9IHsgLm5hbWUgPSAiZmVjX2Jsa3NfdW5jb3JyX2VycnMiLCAuZGVzY3IgPSAiRkVDIEJsb2NrcyB3aXRoIHVuY29ycmVjdGFibGUgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfYmxrc191bmNvcnJfZXJycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19jb3JyX2J5dGVzID0geyAubmFtZSA9ICJmZWNfY29ycl9ieXRlcyIsIC5kZXNjciA9ICJGRUMgQ29ycmVjdGVkIEJ5dGVzL1N5bWJvbHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19jb3JyX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2NvcnJfemVyb2VzID0geyAubmFtZSA9ICJmZWNfY29ycl96ZXJvZXMiLCAuZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBaZXJvZXMsIDhiIGRvbWFpbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19jb3JyX3plcm9lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19jb3JyX29uZXMgPSB7IC5uYW1lID0gImZlY19jb3JyX29uZXMiLCAuZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBPbmVzLCA4YiBkb21haW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9PTkVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2NvcnJfb25lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X3VuZGVyc3pfZnJhbWVzID0geyAubmFtZSA9ICJ1bmRlcnN6X2ZyYW1lcyIsIC5kZXNjciA9ICJVbmRlcnNpemUgZnJhbWUgY291bnQgKGZyYW1lcyBsZXNzIHRoYW4gNjQgYnl0ZXMpIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfVU5ERVJTWl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCB1bmRlcnN6X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2Vycm9yc3pfZnJhbWVzID0geyAubmFtZSA9ICJlcnJvcnN6X2ZyYW1lcyIsIC5kZXNjciA9ICJFcnJvcmVkIGZyYW1lICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZXJyb3Jzel9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9vbnVfMWdfdXNfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZ29vZF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZ29vZF9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9vdmVyc3pfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X25vbl9mZWNfZ29vZF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfbm9uX2ZlY19nb29kX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19nb29kX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfZ29vZF9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfZnJhbWVzX2V4Y19lcnJzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19ibGtzX25vX2VycnMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2Jsa3NfY29ycl9lcnJzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19ibGtzX3VuY29ycl9lcnJzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19jb3JyX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19jb3JyX3plcm9lcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfY29ycl9vbmVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X3VuZGVyc3pfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2Vycm9yc3pfZnJhbWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiR29vZCBGcmFtZSBDb3VudCwgaW5jbHVkaW5nIG5vbkZFQyBhbmQgRkVDIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGdvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImdvb2RfYnl0ZXMiLCAuZGVzY3IgPSAiR29vZCBCeXRlIENvdW50LCBpbmNsdWRpbmcgbm9uRkVDIGFuZCBGRUMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZ29vZF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJvdmVyc3pfZnJhbWVzIiwgLmRlc2NyID0gIk92ZXJzaXplZCBmcmFtZSBjb3VudCAoZnJhbWVzIGxhcmdlciB0aGFuIDIwMDAgYnl0ZXMpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIG92ZXJzel9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibm9uX2ZlY19nb29kX2ZyYW1lcyIsIC5kZXNjciA9ICJOb24gRkVDIEdvb2QgRnJhbWUgQ291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgbm9uX2ZlY19nb29kX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJub25fZmVjX2dvb2RfYnl0ZXMiLCAuZGVzY3IgPSAiTm9uIEZFQyBHb29kIEJ5dGUgQ291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgbm9uX2ZlY19nb29kX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19nb29kX2ZyYW1lcyIsIC5kZXNjciA9ICJGRUMgR29vZCBGcmFtZSBDb3VudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfZ29vZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2dvb2RfYnl0ZXMiLCAuZGVzY3IgPSAiRkVDIEdvb2QgQnl0ZSBDb3VudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfZ29vZF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfZnJhbWVzX2V4Y19lcnJzIiwgLmRlc2NyID0gIkZFQyBGcmFtZXMgd2hpY2ggZXhjZWVkZWQgOCBzeW1ib2wgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19mcmFtZXNfZXhjX2VycnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2Jsa3Nfbm9fZXJycyIsIC5kZXNjciA9ICJGRUMgQmxvY2tzIHdpdGggbm8gZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19ibGtzX25vX2VycnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2Jsa3NfY29ycl9lcnJzIiwgLmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCBjb3JyZWN0YWJsZSBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2Jsa3NfY29ycl9lcnJzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19ibGtzX3VuY29ycl9lcnJzIiwgLmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCB1bmNvcnJlY3RhYmxlIGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfYmxrc191bmNvcnJfZXJycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfY29ycl9ieXRlcyIsIC5kZXNjciA9ICJGRUMgQ29ycmVjdGVkIEJ5dGVzL1N5bWJvbHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2NvcnJfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2NvcnJfemVyb2VzIiwgLmRlc2NyID0gIkZFQyBDb3JyZWN0ZWQgWmVyb2VzLCA4YiBkb21haW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2NvcnJfemVyb2VzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb3JyX29uZXMiLCAuZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBPbmVzLCA4YiBkb21haW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2NvcnJfb25lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ1bmRlcnN6X2ZyYW1lcyIsIC5kZXNjciA9ICJVbmRlcnNpemUgZnJhbWUgY291bnQgKGZyYW1lcyBsZXNzIHRoYW4gNjQgYnl0ZXMpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIHVuZGVyc3pfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImVycm9yc3pfZnJhbWVzIiwgLmRlc2NyID0gIkVycm9yZWQgZnJhbWUgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGVycm9yc3pfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fb251XzFnX3VzIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfY2ZnX2FsbF9saW5rcyA9IHsgLm5hbWUgPSAiYWxsX2xpbmtzIiwgLmRlc2NyID0gIkxpc3Qgb2YgTUFDIEFkZHJlc3NlcyBmb3IgYWxsIGxpbmtzIG9uIHRoZSBPTlUgSWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX0FMTF9MSU5LUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSwgYWxsX2xpbmtzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzFnX3VzX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX2NmZ19hbGxfbGlua3MgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsbF9saW5rcyIsIC5kZXNjciA9ICJMaXN0IG9mIE1BQyBBZGRyZXNzZXMgZm9yIGFsbCBsaW5rcyBvbiB0aGUgT05VIElkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEsIGFsbF9saW5rcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xZ191cyAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzFnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9vbnVfMWdfdXMgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9vbnVfMWdfdXMgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xZ191cyAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzFnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBlcG9uX3BhdGhfMTBnX2RzID09PT0gKi8KKworLyogR3JvdXA6IGVwb25fcGF0aF8xMGdfZHMgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX2tleV9lcG9uX25pID0geyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIkVQT04gTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX2RzX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfa2V5X2Vwb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ19kcyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2ZlY19zdGF0ZSA9IHsgLm5hbWUgPSAiZmVjX3N0YXRlIiwgLmRlc2NyID0gIkZFQyBlbmFibGUgc3RhdGUgZm9yIHRoZSAxMEcgZG93bnN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX0ZFQ19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhLCBmZWNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX3ByYnNfZ2VuZXJhdG9yID0geyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGEsIHByYnNfZ2VuZXJhdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ19kc19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX2NmZ19mZWNfc3RhdGUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX3ByYnNfZ2VuZXJhdG9yIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZlY19zdGF0ZSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMTBHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSwgZmVjX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgfSwgeyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhLCBwcmJzX2dlbmVyYXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX2RzIC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9ieXRlcyA9IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfNjQgPSB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfMjU2XzUxMSA9IHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3ID0geyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MyA9IHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9ieXRlcyA9IHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfREFUQV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9vYW1fYnl0ZXMgPSB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgT0FNIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgb2FtX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9vYW1fZnJhbWVzID0geyAubmFtZSA9ICJvYW1fZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBPQU0gZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIG9hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2dhdGVfZnJhbWVzID0geyAubmFtZSA9ICJnYXRlX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgZ2F0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGdhdGVfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9tcGNwX2ZyYW1lcyA9IHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBtcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWJvcnRfZnJhbWVzID0geyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFib3J0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGFib3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfNjVfMTI3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzEyOF8yNTUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc181MTJfMTAyMywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc18xMDI0XzE1MTgsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc180MDk2XzkyMTYsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfb2FtX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfb2FtX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2dhdGVfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfbXBjcF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hYm9ydF9mcmFtZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGJyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGRhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIG9hbV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJvYW1fZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBPQU0gZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBvYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImdhdGVfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBnYXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZ2F0ZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBtcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFib3J0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX2RzIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX2RzIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX2RzIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xMGdfZHMgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fcGF0aF8xMGdfdXMgPT09PSAqLworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ191cyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX3VzX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfa2V5X2Vwb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xMGdfdXMgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2NmZ19mZWNfc3RhdGUgPSB7IC5uYW1lID0gImZlY19zdGF0ZSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMTBHIHVwc3RyZWFtIHBhdGggb24gdGhpcyBFUE9OIE5JLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfRkVDX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIGZlY19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19jZmdfc3luY190aW1lX3RxID0geyAubmFtZSA9ICJzeW5jX3RpbWVfdHEiLCAuZGVzY3IgPSAiVGltZSBxdWFudGEgb2Ygc3luYyBhdCBzdGFydCBvZiBVUyBidXJzdC4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhLCBzeW5jX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19jZmdfcHJic19jaGVja2VyID0geyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAuZGVzY3IgPSAiVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2NmZ19wcmJzX3N0YXR1cyA9IHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAuZGVzY3IgPSAiUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX3VzX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2ZlY19zdGF0ZSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19jZmdfc3luY190aW1lX3RxLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2NmZ19wcmJzX2NoZWNrZXIsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX3ByYnNfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZlY19zdGF0ZSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMTBHIHVwc3RyZWFtIHBhdGggb24gdGhpcyBFUE9OIE5JLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIGZlY19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIH0sIHsgLm5hbWUgPSAic3luY190aW1lX3RxIiwgLmRlc2NyID0gIlRpbWUgcXVhbnRhIG9mIHN5bmMgYXQgc3RhcnQgb2YgVVMgYnVyc3QuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSwgc3luY190aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC5kZXNjciA9ICJVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSwgcHJic19jaGVja2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB9LCB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLmRlc2NyID0gIlJlc3VsdCBvZiBVUyBQUkJTIGNoZWNrZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ191cyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYnl0ZXMgPSB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzID0geyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfNjQgPSB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzY1XzEyNyA9IHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzEyOF8yNTUgPSB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMjU2XzUxMSA9IHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc181MTJfMTAyMyA9IHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4ID0geyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3ID0geyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMjA0OF80MDk1ID0geyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2ID0geyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MyA9IHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBicm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2J5dGVzID0geyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfREFUQV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X3VuaWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X21wY3BfZnJhbWVzID0geyAubmFtZSA9ICJtcGNwX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X29hbV9ieXRlcyA9IHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIG9hbV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfb2FtX2ZyYW1lcyA9IHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIG9hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X3JlcG9ydF9mcmFtZXMgPSB7IC5uYW1lID0gInJlcG9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZXBvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCByZXBvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hYm9ydF9mcmFtZXMgPSB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2Zjc19lcnJvciA9IHsgLm5hbWUgPSAiZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZmNzX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jcmNfOF9lcnJvciA9IHsgLm5hbWUgPSAiY3JjXzhfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBDUkM4IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGNyY184X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9vdXRfb2Zfc2xvdCA9IHsgLm5hbWUgPSAib3V0X29mX3Nsb3QiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdXQgb2Ygc2xvdCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBvdXRfb2Zfc2xvdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfb3ZlcnNpemVfZXJyb3IgPSB7IC5uYW1lID0gIm92ZXJzaXplX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgb3ZlcnNpemVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X3J1bnRfZXJyb3IgPSB7IC5uYW1lID0gInJ1bnRfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgcnVudF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX3VzX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfNjVfMTI3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzEyOF8yNTUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc181MTJfMTAyMywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc18xMDI0XzE1MTgsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc180MDk2XzkyMTYsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfbXBjcF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9vYW1fYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9vYW1fZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfcmVwb3J0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2Fib3J0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2Zjc19lcnJvciwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NyY184X2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfb3V0X29mX3Nsb3QsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9vdmVyc2l6ZV9lcnJvciwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X3J1bnRfZXJyb3IgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBicm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm1wY3BfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBtcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJvYW1fYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBvYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBvYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJlcG9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZXBvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgcmVwb3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmY3NfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiY3JjXzhfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBDUkM4IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGNyY184X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm91dF9vZl9zbG90IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgb3V0X29mX3Nsb3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBvdmVyc2l6ZV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJydW50X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcnVudCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBydW50X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX3VzIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX3VzIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX3VzIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xMGdfdXMgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fcGF0aF8xZ19kcyA9PT09ICovCisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfZHMgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxRyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xZ19kc19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfa2V5X2Vwb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDFHIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ19kcyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfZGVmYXVsdF9mZWNfc3RhdGUgPSB7IC5uYW1lID0gImRlZmF1bHRfZmVjX3N0YXRlIiwgLmRlc2NyID0gIkRlZmF1bHQgRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSwgZGVmYXVsdF9mZWNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfcmFtYW5fbW9kZSA9IHsgLm5hbWUgPSAicmFtYW5fbW9kZSIsIC5kZXNjciA9ICJSYW1hbiBtaXRpZ2F0aW9uIG1vZGUgZm9yIHRoZSAxRyBkb3duc3RyZWFtIHBhdGggb24gdGhpcyBFUE9OIE5JLiAgUmFtYW4gbWl0aWdhdGlvbiBjYW5ub3QgY29leGlzdCB3aXRoIHR1cmJvIG1vZGUuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1JBTUFOX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhLCByYW1hbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2NmZ190dXJib18yZ19tb2RlID0geyAubmFtZSA9ICJ0dXJib18yZ19tb2RlIiwgLmRlc2NyID0gIk9wZXJhdGUgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBhdCB0aGUgdHVyYm8gMkcgZGF0YSByYXRlIG9uIHRoaXMgRVBPTiBOSS4gIFJhbWFuIG1pdGlnYXRpb24gY2Fubm90IGNvZXhpc3Qgd2l0aCB0dXJibyBtb2RlLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSwgdHVyYm9fMmdfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfcHJic19nZW5lcmF0b3IgPSB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLmRlc2NyID0gIkRTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEsIHByYnNfZ2VuZXJhdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX2RzX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfZGVmYXVsdF9mZWNfc3RhdGUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfcmFtYW5fbW9kZSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2NmZ190dXJib18yZ19tb2RlLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfY2ZnX3ByYnNfZ2VuZXJhdG9yIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGVmYXVsdF9mZWNfc3RhdGUiLCAuZGVzY3IgPSAiRGVmYXVsdCBGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMUcgZG93bnN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEsIGRlZmF1bHRfZmVjX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgfSwgeyAubmFtZSA9ICJyYW1hbl9tb2RlIiwgLmRlc2NyID0gIlJhbWFuIG1pdGlnYXRpb24gbW9kZSBmb3IgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBSYW1hbiBtaXRpZ2F0aW9uIGNhbm5vdCBjb2V4aXN0IHdpdGggdHVyYm8gbW9kZS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEsIHJhbWFuX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgfSwgeyAubmFtZSA9ICJ0dXJib18yZ19tb2RlIiwgLmRlc2NyID0gIk9wZXJhdGUgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBhdCB0aGUgdHVyYm8gMkcgZGF0YSByYXRlIG9uIHRoaXMgRVBPTiBOSS4gIFJhbWFuIG1pdGlnYXRpb24gY2Fubm90IGNvZXhpc3Qgd2l0aCB0dXJibyBtb2RlLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSwgdHVyYm9fMmdfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSB9LCB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLmRlc2NyID0gIkRTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSwgcHJic19nZW5lcmF0b3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ19kcyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9ieXRlcyA9IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzID0geyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzY0ID0geyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzEyOF8yNTUgPSB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzI1Nl81MTEgPSB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4ID0geyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NyA9IHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2ID0geyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMgPSB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhX2J5dGVzID0geyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfREFUQV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBkYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X211bHRpY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X29hbV9ieXRlcyA9IHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBvYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfb2FtX2ZyYW1lcyA9IHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBvYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2dhdGVfZnJhbWVzID0geyAubmFtZSA9ICJnYXRlX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgZ2F0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGdhdGVfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X21wY3BfZnJhbWVzID0geyAubmFtZSA9ICJtcGNwX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgTVBDUCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIG1wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2Fib3J0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX2RzX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfdW5pY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X29hbV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfb2FtX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZ2F0ZV9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X21wY3BfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hYm9ydF9mcmFtZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGJyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBkYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBvYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIG9hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZ2F0ZV9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGdhdGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZ2F0ZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfZHMgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ19kcyAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ19kcyAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzFnX2RzIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZXBvbl9wYXRoXzFnX3VzID09PT0gKi8KKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ191cyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19rZXlfZXBvbl9uaSA9IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDFHIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xZ191c19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfa2V5X2Vwb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDFHIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfdXMgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RlZmF1bHRfZmVjX3N0YXRlID0geyAubmFtZSA9ICJkZWZhdWx0X2ZlY19zdGF0ZSIsIC5kZXNjciA9ICJEZWZhdWx0IEZFQyBlbmFibGUgc3RhdGUgZm9yIHRoZSAxRyB1cHN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBkZWZhdWx0X2ZlY19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2NmZ19zeW5jX3RpbWVfdHEgPSB7IC5uYW1lID0gInN5bmNfdGltZV90cSIsIC5kZXNjciA9ICJUaW1lIHF1YW50YSBvZiBzeW5jIGF0IHN0YXJ0IG9mIFVTIGJ1cnN0LiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBzeW5jX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2NmZ19wcmJzX2NoZWNrZXIgPSB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC5kZXNjciA9ICJVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfY2ZnX3ByYnNfc3RhdHVzID0geyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9QUkJTX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfdXNfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2NmZ19kZWZhdWx0X2ZlY19zdGF0ZSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2NmZ19zeW5jX3RpbWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19jZmdfcHJic19jaGVja2VyLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfY2ZnX3ByYnNfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGVmYXVsdF9mZWNfc3RhdGUiLCAuZGVzY3IgPSAiRGVmYXVsdCBGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMUcgdXBzdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBkZWZhdWx0X2ZlY19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIH0sIHsgLm5hbWUgPSAic3luY190aW1lX3RxIiwgLmRlc2NyID0gIlRpbWUgcXVhbnRhIG9mIHN5bmMgYXQgc3RhcnQgb2YgVVMgYnVyc3QuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBzeW5jX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLmRlc2NyID0gIlVTIFBSQlMgY2hlY2tlciBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfSwgeyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ191cyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9ieXRlcyA9IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfNjQgPSB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMjU2XzUxMSA9IHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3ID0geyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MyA9IHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGJyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV9ieXRlcyA9IHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGRhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCB1bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9tcGNwX2ZyYW1lcyA9IHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG1wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X29hbV9ieXRlcyA9IHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG9hbV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9vYW1fZnJhbWVzID0geyAubmFtZSA9ICJvYW1fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9yZXBvcnRfZnJhbWVzID0geyAubmFtZSA9ICJyZXBvcnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgcmVwb3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hYm9ydF9mcmFtZXMgPSB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZmNzX2Vycm9yID0geyAubmFtZSA9ICJmY3NfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZDU19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmY3NfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY3JjXzhfZXJyb3IgPSB7IC5uYW1lID0gImNyY184X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgQ1JDOCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBjcmNfOF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9vdXRfb2Zfc2xvdCA9IHsgLm5hbWUgPSAib3V0X29mX3Nsb3QiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdXQgb2Ygc2xvdCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBvdXRfb2Zfc2xvdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9vdmVyc2l6ZV9lcnJvciA9IHsgLm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBvdmVyc2l6ZV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9ydW50X2Vycm9yID0geyAubmFtZSA9ICJydW50X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcnVudCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIHJ1bnRfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX3VzX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfdW5pY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X21wY3BfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9vYW1fYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X29hbV9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X3JlcG9ydF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2Fib3J0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZmNzX2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jcmNfOF9lcnJvciwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfb3V0X29mX3Nsb3QsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X292ZXJzaXplX2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9ydW50X2Vycm9yIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBkYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCB1bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtcGNwX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG1wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBvYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyZXBvcnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCByZXBvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZmNzX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImNyY184X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgQ1JDOCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgY3JjXzhfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib3V0X29mX3Nsb3QiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdXQgb2Ygc2xvdCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgb3V0X29mX3Nsb3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgb3ZlcnNpemVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnVudF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIHJ1bnRfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfdXMgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ191cyAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ191cyAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzFnX3VzIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZXBvbl9ycCA9PT09ICovCisKKy8qIEdyb3VwOiBlcG9uX3JwIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9rZXlfZXBvbl9uaSA9IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIGNvbnRhaW5pbmcgdGhpcyBSUC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3JwX2tleV9saW5rX3JhdGUgPSB7IC5uYW1lID0gImxpbmtfcmF0ZSIsIC5kZXNjciA9ICJMaW5rIHJhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUlAuICBNdXN0IGJlIG9uZSBvZiAxMC8xMCwgMTAvMSwgb3IgMS8xLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9MSU5LX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9rZXksIGxpbmtfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9ycF9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3JwX2tleV9lcG9uX25pLCAmcHJvcF9kZXNjcl9lcG9uX3JwX2tleV9saW5rX3JhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBjb250YWluaW5nIHRoaXMgUlAuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiTGluayByYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJQLiAgTXVzdCBiZSBvbmUgb2YgMTAvMTAsIDEwLzEsIG9yIDEvMS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfa2V5LCBsaW5rX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9ycF9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcnBfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcnAgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19iYXNlX2xsaWQgPSB7IC5uYW1lID0gImJhc2VfbGxpZCIsIC5kZXNjciA9ICJCYXNlIChsb3dlc3QpIGxvZ2ljYWwgbGluayBpZGVudGlmaWVyIGZvciB0aGlzIFJQLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZCwgbm9yIHdoaWxlIGFueSBub24tc3lzdGVtIGxpbmtzIGV4aXN0LiAgVGhlIHN1bSBvZiB0aGlzIHZhbHVlIGFuZCBtYXhfbGlua3MgZm9yIHRoaXMgUlAgbXVzdCBiZSAweDdlZmYgb3Igc21hbGxlci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfQkFTRV9MTElELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIGJhc2VfbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9jZmdfbXBjcF9kaXNjX2VuID0geyAubmFtZSA9ICJtcGNwX2Rpc2NfZW4iLCAuZGVzY3IgPSAiR292ZXJucyB3aGV0aGVyIGRpc2NvdmVyeSBnYXRlcyBmb3IgdGhpcyBSUCBhcmUgaXNzdWVkICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfRU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgbXBjcF9kaXNjX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9jZmdfbXBjcF9kaXNjX2dudF9sZW5fdHEgPSB7IC5uYW1lID0gIm1wY3BfZGlzY19nbnRfbGVuX3RxIiwgLmRlc2NyID0gIkxlbmd0aCBvZiBkaXNjb3ZlcnkgZ3JhbnRzIGluIHRpbWUgcXVhbnRhIGZvciB0aGlzIFJQLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfR05UX0xFTl9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtcGNwX2Rpc2NfZ250X2xlbl90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19tcGNwX3JlcG9ydF90aW1lb3V0ID0geyAubmFtZSA9ICJtcGNwX3JlcG9ydF90aW1lb3V0IiwgLmRlc2NyID0gIk51bWJlciBvZiBtcyBiZWZvcmUgbGlua3MgYXJlIGRlcmVnaXN0ZXJlZCBkdWUgdG8gbm8gcmVwb3J0IHJlY2VpdmVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIG1wY3BfcmVwb3J0X3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9jZmdfbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdyA9IHsgLm5hbWUgPSAibWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdyIsIC5kZXNjciA9ICJNYXhpbXVtIG51bWJlciBvZiBNUENQIHJlZ2lzdHJhdGlvbnMgcGVyIGRpc2NvdmVyeSB3aW5kb3cgb24gdGhpcyBSUCAoMCBpbmRpY2F0ZXMgdW5saW1pdGVkKS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX01QQ1BfUkVHX1BFUl9ESVNDX1dJTkRPVywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21heF9saW5rcyA9IHsgLm5hbWUgPSAibWF4X2xpbmtzIiwgLmRlc2NyID0gIk1heGltdW0gbnVtYmVyIG9mIGxpbmtzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtYXhfbGlua3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9jZmdfZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGggPSB7IC5uYW1lID0gImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoIiwgLmRlc2NyID0gIkRlZmF1bHQgdXBzdHJlYW0gYmFuZHdpZHRoIGZvciBuZXdseSBjcmVhdGVkIGxpbmtzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19yYXRlX29mX3JlZnJhY3Rpb24gPSB7IC5uYW1lID0gInJhdGVfb2ZfcmVmcmFjdGlvbiIsIC5kZXNjciA9ICJSYXRlIG9mIFJlZnJhY3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIHJhdGVfb2ZfcmVmcmFjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfZG91YmxlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9ycF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19iYXNlX2xsaWQsICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21wY3BfZGlzY19lbiwgJnByb3BfZGVzY3JfZXBvbl9ycF9jZmdfbXBjcF9kaXNjX2dudF9sZW5fdHEsICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21wY3BfcmVwb3J0X3RpbWVvdXQsICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3csICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21heF9saW5rcywgJnByb3BfZGVzY3JfZXBvbl9ycF9jZmdfZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgsICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX3JhdGVfb2ZfcmVmcmFjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJiYXNlX2xsaWQiLCAuZGVzY3IgPSAiQmFzZSAobG93ZXN0KSBsb2dpY2FsIGxpbmsgaWRlbnRpZmllciBmb3IgdGhpcyBSUC4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQsIG5vciB3aGlsZSBhbnkgbm9uLXN5c3RlbSBsaW5rcyBleGlzdC4gIFRoZSBzdW0gb2YgdGhpcyB2YWx1ZSBhbmQgbWF4X2xpbmtzIGZvciB0aGlzIFJQIG11c3QgYmUgMHg3ZWZmIG9yIHNtYWxsZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBiYXNlX2xsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9LCB7IC5uYW1lID0gIm1wY3BfZGlzY19lbiIsIC5kZXNjciA9ICJHb3Zlcm5zIHdoZXRoZXIgZGlzY292ZXJ5IGdhdGVzIGZvciB0aGlzIFJQIGFyZSBpc3N1ZWQgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtcGNwX2Rpc2NfZW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJtcGNwX2Rpc2NfZ250X2xlbl90cSIsIC5kZXNjciA9ICJMZW5ndGggb2YgZGlzY292ZXJ5IGdyYW50cyBpbiB0aW1lIHF1YW50YSBmb3IgdGhpcyBSUC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIG1wY3BfZGlzY19nbnRfbGVuX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1wY3BfcmVwb3J0X3RpbWVvdXQiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIG1zIGJlZm9yZSBsaW5rcyBhcmUgZGVyZWdpc3RlcmVkIGR1ZSB0byBubyByZXBvcnQgcmVjZWl2ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtcGNwX3JlcG9ydF90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3ciLCAuZGVzY3IgPSAiTWF4aW11bSBudW1iZXIgb2YgTVBDUCByZWdpc3RyYXRpb25zIHBlciBkaXNjb3Zlcnkgd2luZG93IG9uIHRoaXMgUlAgKDAgaW5kaWNhdGVzIHVubGltaXRlZCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1heF9saW5rcyIsIC5kZXNjciA9ICJNYXhpbXVtIG51bWJlciBvZiBsaW5rcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgbWF4X2xpbmtzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoIiwgLmRlc2NyID0gIkRlZmF1bHQgdXBzdHJlYW0gYmFuZHdpZHRoIGZvciBuZXdseSBjcmVhdGVkIGxpbmtzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIH0sIHsgLm5hbWUgPSAicmF0ZV9vZl9yZWZyYWN0aW9uIiwgLmRlc2NyID0gIlJhdGUgb2YgUmVmcmFjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgcmF0ZV9vZl9yZWZyYWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9kb3VibGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JwX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JwX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZ3BpbyA9PT09ICovCisKKy8qIEdyb3VwOiBncGlvIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bpb19rZXlfcmVzZXJ2ZWQgPSB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIChzZXQgdG8gMCkuIiwgLmFjY2VzcyA9IDAsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUElPX0tFWV9JRF9SRVNFUlZFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2tleSwgcmVzZXJ2ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bpb19rZXlfZ3Bpb19pZCA9IHsgLm5hbWUgPSAiZ3Bpb19pZCIsIC5kZXNjciA9ICJHUElPIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19rZXksIGdwaW9faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwaW9fa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bpb19rZXlfcmVzZXJ2ZWQsICZwcm9wX2Rlc2NyX2dwaW9fa2V5X2dwaW9faWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIChzZXQgdG8gMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2tleSwgcmVzZXJ2ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZ3Bpb19pZCIsIC5kZXNjciA9ICJHUElPIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2tleSwgZ3Bpb19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9ncGlvX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bpb19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3BpbyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwaW9fY2ZnX2RpcmVjdGlvbiA9IHsgLm5hbWUgPSAiZGlyZWN0aW9uIiwgLmRlc2NyID0gIkdQSU8gUElOIGRpcmVjdGlvbiAoaW5wdXQgb3Igb3V0cHV0KSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19jZmdfZGF0YSwgZGlyZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW5fZGlyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bpb19jZmdfdmFsdWUgPSB7IC5uYW1lID0gInZhbHVlIiwgLmRlc2NyID0gIlZhbHVlIHRvIHdyaXRlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2NmZ19kYXRhLCB2YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fdmFsdWUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncGlvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwaW9fY2ZnX2RpcmVjdGlvbiwgJnByb3BfZGVzY3JfZ3Bpb19jZmdfdmFsdWUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGlyZWN0aW9uIiwgLmRlc2NyID0gIkdQSU8gUElOIGRpcmVjdGlvbiAoaW5wdXQgb3Igb3V0cHV0KSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19jZmdfZGF0YSwgZGlyZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW5fZGlyIH0sIHsgLm5hbWUgPSAidmFsdWUiLCAuZGVzY3IgPSAiVmFsdWUgdG8gd3JpdGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2NmZ19kYXRhLCB2YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fdmFsdWUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bpb19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bpb19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZ3Bvbl9hbGxvYyA9PT09ICovCisKKy8qIEdyb3VwOiBncG9uX2FsbG9jIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19rZXlfYWxsb2NfaWQgPSB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5LCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2FsbG9jX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19rZXlfYWxsb2NfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXksIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fYWxsb2MgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NmZ19zdGF0ZSA9IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBBbGxvYyBJRCBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NmZ19zbGEgPSB7IC5uYW1lID0gInNsYSIsIC5kZXNjciA9ICJBbGxvYyBJRCBTTEEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU0xBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEsIHNsYSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hbGxvY19zbGEgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NmZ19vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgdGhlIGFsbG9jIElEIGlzIGFzc2lnbmVkIHRvIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jZmdfY29sbGVjdF9zdGF0cyA9IHsgLm5hbWUgPSAiY29sbGVjdF9zdGF0cyIsIC5kZXNjciA9ICJFbmFibGUgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciB0aGlzIGFsbG9jIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSwgY29sbGVjdF9zdGF0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fYWxsb2NfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jZmdfc3RhdGUsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfY2ZnX3NsYSwgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jZmdfb251X2lkLCAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NmZ19jb2xsZWN0X3N0YXRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgQWxsb2MgSUQgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfSwgeyAubmFtZSA9ICJzbGEiLCAuZGVzY3IgPSAiQWxsb2MgSUQgU0xBIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhLCBzbGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0aGUgYWxsb2MgSUQgaXMgYXNzaWduZWQgdG8iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJjb2xsZWN0X3N0YXRzIiwgLmRlc2NyID0gIkVuYWJsZSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gZm9yIHRoaXMgYWxsb2MgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEsIGNvbGxlY3Rfc3RhdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX3N0YXRfcnhfYnl0ZXMgPSB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIEJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19zdGF0X3J4X2J5dGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBCeXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2FsbG9jIC0gY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfbmV3X3N0YXRlID0geyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAibmV3IHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAibmV3IHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIkNvbmZpZ3VyYXRpb24gQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fYWxsb2MgLSBzZXRfc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX3NldF9zdGF0ZV9zdGF0ZSA9IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19vcGVyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2FsbG9jX3NldF9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfc2V0X3N0YXRlX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIlN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhIiwgLmRlc2NyID0gIlNldHMgdGhlIGFsbG9jJ3MgYWN0aXZhdGlvbiBzdGF0ZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyBvbiBhbiBhY3RpdmUtc3RhbmRieSBQT04uICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGlzIGlzbid0IG5lY2Vzc2FyeSBzaW5jZSBhbGxvY3MgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggdGhlIE9OVS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIGdldF9zdGF0cyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2NfZ2V0X3N0YXRzX251bV9vZl9jeWNsZXMgPSB7IC5uYW1lID0gIm51bV9vZl9jeWNsZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBjeWNsZXMgdG8gcnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEsIG51bV9vZl9jeWNsZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19nZXRfc3RhdHNfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2dldF9zdGF0c19udW1fb2ZfY3ljbGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm51bV9vZl9jeWNsZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBjeWNsZXMgdG8gcnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSwgbnVtX29mX2N5Y2xlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSIsIC5kZXNjciA9ICJSdW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fYWxsb2MgLSBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9uc3JfdXNlZCA9IHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfdXNlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiB1c2VkIGJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBhdmVyYWdlX25zcl91c2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX25zcl9hbGxvY2F0ZWQgPSB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiBhbGxvY2F0ZWQgYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX0FMTE9DQVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9uc3JfYWxsb2NhdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX3NyX3JlcG9ydCA9IHsgLm5hbWUgPSAiYXZlcmFnZV9zcl9yZXBvcnQiLCAuZGVzY3IgPSAiQXZlcmFnZSBTUiByZXBvcnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBhdmVyYWdlX3NyX3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9uc3JfdXNlZCwgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2F2ZXJhZ2VfbnNyX2FsbG9jYXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2F2ZXJhZ2Vfc3JfcmVwb3J0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfdXNlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiB1c2VkIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9uc3JfdXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhdmVyYWdlX25zcl9hbGxvY2F0ZWQiLCAuZGVzY3IgPSAiQXZlcmFnZSBOU1IgYWxsb2NhdGVkIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9uc3JfYWxsb2NhdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImF2ZXJhZ2Vfc3JfcmVwb3J0IiwgLmRlc2NyID0gIkF2ZXJhZ2UgU1IgcmVwb3J0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9zcl9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJDb2xsZWN0ZWQgYWxsb2MgSUQgc3RhdGlzdGljcyBmcm9tIGdldF9zdGF0cyBvcGVyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fYWxsb2Nfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2FsbG9jIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2F1dG9fY2ZnX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29uZmlndXJhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19hdXRvX2NmZ19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkID0geyAubmFtZSA9ICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfYXV0b19jZmdfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfYXV0b19jZmdfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29uZmlndXJhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25fZ2VtX3BvcnQgPT09PSAqLworCisvKiBHcm91cDogZ3Bvbl9nZW1fcG9ydCAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfa2V5X2dlbV9wb3J0X2lkID0geyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJHRU0gUG9ydCBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSwgZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2tleV9wb25fbmksICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfa2V5X2dlbV9wb3J0X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiR0VNIFBvcnQgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5LCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2dlbV9wb3J0IC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJHRU0gcG9ydCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBjb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0aGlzIEdFTSBwb3J0IGlzIGFzc2lnbmVkIHRvIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfZ2VtX3BvcnRfc3RhdGUgPSB7IC5uYW1lID0gImdlbV9wb3J0X3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgR0VNIHBvcnQgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBnZW1fcG9ydF9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ19kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IHsgLm5hbWUgPSAiZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiLCAuZGVzY3IgPSAiRW5hYmxlL0Rpc2FibGUgdGhlIGRvd25zdHJlYW0gZW5jcnlwdGlvbiBtb2RlIG9mIHRoZSBHRU0gUG9ydCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ET1dOU1RSRUFNX0VOQ1JZUFRJT05fTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ191cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSA9IHsgLm5hbWUgPSAidXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUiLCAuZGVzY3IgPSAiVGhlIGRlc3RpbmF0aW9uIHF1ZXVlIG9mIHRoZSBwYWNrZXRzIGFycml2aW5nIG9uIHRoaXMgR0VNIFBvcnQgb24gdGhlIHVwc3RyZWFtIGRpcmVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfY29udHJvbCA9IHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGUvRGlzYWJsZSB0aGUgR0VNIFBvcnQgSUQgaW4gdGhlIE9MVCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfZGVidWdfZmxvd19jb25maWcgPSB7IC5uYW1lID0gImRlYnVnX2Zsb3dfY29uZmlnIiwgLmRlc2NyID0gIlRyYWZmaWMgZmxvdyBkZWJ1ZyBvcHRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGRlYnVnX2Zsb3dfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX21hY190YWJsZV9lbnRyeV9saW1pdCA9IHsgLm5hbWUgPSAibWFjX3RhYmxlX2VudHJ5X2xpbWl0IiwgLmRlc2NyID0gIlRoZSBtYXhpbXVtIG51bWJlciBvZiBNQUMgdGFibGUgZW50cmllcyBhbGxvd2VkIGZvciB0aGlzIEdFTSBwb3J0ICgwID0gbm8gbGltaXQpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9NQUNfVEFCTEVfRU5UUllfTElNSVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fZ2VtX3BvcnRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfY29uZmlndXJhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfb251X2lkLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ19nZW1fcG9ydF9zdGF0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX3Vwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ19jb250cm9sLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ19kZWJ1Z19mbG93X2NvbmZpZywgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfbWFjX3RhYmxlX2VudHJ5X2xpbWl0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiR0VNIHBvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBjb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgdGhpcyBHRU0gcG9ydCBpcyBhc3NpZ25lZCB0byIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgR0VNIHBvcnQgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGdlbV9wb3J0X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSB9LCB7IC5uYW1lID0gImRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlIiwgLmRlc2NyID0gIkVuYWJsZS9EaXNhYmxlIHRoZSBkb3duc3RyZWFtIGVuY3J5cHRpb24gbW9kZSBvZiB0aGUgR0VNIFBvcnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIiwgLmRlc2NyID0gIlRoZSBkZXN0aW5hdGlvbiBxdWV1ZSBvZiB0aGUgcGFja2V0cyBhcnJpdmluZyBvbiB0aGlzIEdFTSBQb3J0IG9uIHRoZSB1cHN0cmVhbSBkaXJlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gfSwgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gIkVuYWJsZS9EaXNhYmxlIHRoZSBHRU0gUG9ydCBJRCBpbiB0aGUgT0xUIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gImRlYnVnX2Zsb3dfY29uZmlnIiwgLmRlc2NyID0gIlRyYWZmaWMgZmxvdyBkZWJ1ZyBvcHRpb25zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBkZWJ1Z19mbG93X2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgfSwgeyAubmFtZSA9ICJtYWNfdGFibGVfZW50cnlfbGltaXQiLCAuZGVzY3IgPSAiVGhlIG1heGltdW0gbnVtYmVyIG9mIE1BQyB0YWJsZSBlbnRyaWVzIGFsbG93ZWQgZm9yIHRoaXMgR0VNIHBvcnQgKDAgPSBubyBsaW1pdCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBtYWNfdGFibGVfZW50cnlfbGltaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fZ2VtX3BvcnQgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X3J4X3BhY2tldHMgPSB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgR0VNIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfcnhfYnl0ZXMgPSB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X3R4X3BhY2tldHMgPSB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgR0VNIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgdHhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfdHhfYnl0ZXMgPSB7IC5uYW1lID0gInR4X2J5dGVzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIGJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X3J4X3BhY2tldHMsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF9yeF9ieXRlcywgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X3R4X3BhY2tldHMsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF90eF9ieXRlcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC5kZXNjciA9ICJSZWNlaXZlZCBHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgR0VNIGZyYW1lcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhLCB0eF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9nZW1fcG9ydCAtIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIm5ldyBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAibmV3IHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9nZW1fcG9ydCAtIHNldF9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX3N0YXRlID0geyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAiU2V0cyB0aGUgR0VNIHBvcnQncyBhY3RpdmF0aW9uIHN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHByb3RlY3Rpb24gc3dpdGNoaW5nIG9uIGFuIGFjdGl2ZS1zdGFuZGJ5IFBPTi4gIEluIG5vcm1hbCBvcGVyYXRpb24sIHRoaXMgaXNuJ3QgbmVjZXNzYXJ5IHNpbmNlIEdFTSBwb3J0cyBhcmUgYWN0aXZhdGVkL2RlYWN0aXZhdGVkIGF1dG9tYXRpY2FsbHkgYWxvbmcgd2l0aCB0aGUgT05VLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2dlbV9wb3J0IC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2dlbV9wb3J0IC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2dlbV9wb3J0IC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fZ2VtX3BvcnQgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjb25maWd1cmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSwgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNvbmZpZ3VyYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBncG9uX2l3ZiA9PT09ICovCisKKy8qIEdyb3VwOiBncG9uX2l3ZiAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX2tleV9wb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9jZmdfaXdmX21vZGUgPSB7IC5uYW1lID0gIml3Zl9tb2RlIiwgLmRlc2NyID0gIklXRiBtYXBwaW5nIG1vZGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0lXRl9NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBpd2ZfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2l3Zl9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX3VzX3RwaWRfcGVyX2Zsb3cgPSB7IC5uYW1lID0gInVzX3RwaWRfcGVyX2Zsb3ciLCAuZGVzY3IgPSAiVFBJRCB2YWx1ZSBvZiB0aGUgVkxBTiB0YWcgYWRkZWQgdG8gdXBzdHJlYW0gcGFja2V0IHdoZW4gSVdGIG1vZGUgaXMgc2V0IHRvIHBlciBmbG93IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19UUElEX1BFUl9GTE9XLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCB1c190cGlkX3Blcl9mbG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yX2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ191c19vdGFnX2RpcmVjdF90cGlkID0geyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF90cGlkIiwgLmRlc2NyID0gIlRQSUQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBkaXJlY3QgbW9kZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgdXNfb3RhZ19kaXJlY3RfdHBpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX3VzX290YWdfZGlyZWN0X3BiaXQgPSB7IC5uYW1lID0gInVzX290YWdfZGlyZWN0X3BiaXQiLCAuZGVzY3IgPSAiUC1iaXQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBkaXJlY3QgbW9kZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfUEJJVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgdXNfb3RhZ19kaXJlY3RfcGJpdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19kc190cGlkID0geyAubmFtZSA9ICJkc190cGlkIiwgLmRlc2NyID0gIlBhY2tldHMgbWFya2VkIHdpdGggb25lIG9mIHRoZSBmaXZlIGNvbmZpZ3VyZWQgRFMgVFBJRCBvcHRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLCBhbGwgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBkc190cGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl81X2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19tYWNfdGFibGVfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiTUFDIHRhYmxlIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX2RlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiZGVidWdfZmxvd19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIk1BQyB0YWJsZSBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJR1VSQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX21hY190YWJsZV9jb3VudCA9IHsgLm5hbWUgPSAibWFjX3RhYmxlX2NvdW50IiwgLmRlc2NyID0gIk51bWJlciBvZiBNQUMgdGFibGUgZW50cmllcyBjb25maWd1cmVkIGluIHRoZSBNQUMgdGFibGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPVU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBtYWNfdGFibGVfY291bnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX2ZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0ID0geyAubmFtZSA9ICJmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCIsIC5kZXNjciA9ICJGb3JiaWRkZW4gcmFuZ2UgZm9yIFZsYW5zLCBGbG93cyBhbmQgR2VtcyBzdGFydCB2YWx1ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIGZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19pd2ZfbW9kZSwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX3VzX3RwaWRfcGVyX2Zsb3csICZwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ191c19vdGFnX2RpcmVjdF90cGlkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9jZmdfdXNfb3RhZ19kaXJlY3RfcGJpdCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX2RzX3RwaWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX2RlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX21hY190YWJsZV9jb3VudCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX2ZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpd2ZfbW9kZSIsIC5kZXNjciA9ICJJV0YgbWFwcGluZyBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgaXdmX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9pd2ZfbW9kZSB9LCB7IC5uYW1lID0gInVzX3RwaWRfcGVyX2Zsb3ciLCAuZGVzY3IgPSAiVFBJRCB2YWx1ZSBvZiB0aGUgVkxBTiB0YWcgYWRkZWQgdG8gdXBzdHJlYW0gcGFja2V0IHdoZW4gSVdGIG1vZGUgaXMgc2V0IHRvIHBlciBmbG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgdXNfdHBpZF9wZXJfZmxvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMl9oZXggfSwgeyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF90cGlkIiwgLmRlc2NyID0gIlRQSUQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBkaXJlY3QgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIHVzX290YWdfZGlyZWN0X3RwaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9LCB7IC5uYW1lID0gInVzX290YWdfZGlyZWN0X3BiaXQiLCAuZGVzY3IgPSAiUC1iaXQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBkaXJlY3QgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIHVzX290YWdfZGlyZWN0X3BiaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJkc190cGlkIiwgLmRlc2NyID0gIlBhY2tldHMgbWFya2VkIHdpdGggb25lIG9mIHRoZSBmaXZlIGNvbmZpZ3VyZWQgRFMgVFBJRCBvcHRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLCBhbGwgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgZHNfdHBpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNV9oZXggfSwgeyAubmFtZSA9ICJtYWNfdGFibGVfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJNQUMgdGFibGUgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIG1hY190YWJsZV9jb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiTUFDIHRhYmxlIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyB9LCB7IC5uYW1lID0gIm1hY190YWJsZV9jb3VudCIsIC5kZXNjciA9ICJOdW1iZXIgb2YgTUFDIHRhYmxlIGVudHJpZXMgY29uZmlndXJlZCBpbiB0aGUgTUFDIHRhYmxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgbWFjX3RhYmxlX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0IiwgLmRlc2NyID0gIkZvcmJpZGRlbiByYW5nZSBmb3IgVmxhbnMsIEZsb3dzIGFuZCBHZW1zIHN0YXJ0IHZhbHVlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19oaXRfZXZlbnQgPSB7IC5uYW1lID0gImRzX2hpdF9ldmVudCIsIC5kZXNjciA9ICJEUyBoaXQgZXZlbnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19ISVRfRVZFTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBkc19oaXRfZXZlbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19taXNzX2V2ZW50ID0geyAubmFtZSA9ICJkc19taXNzX2V2ZW50IiwgLmRlc2NyID0gIkRTIG1pc3MgZXZlbnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19NSVNTX0VWRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfbWlzc19ldmVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2RzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQgPSB7IC5uYW1lID0gImRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQiLCAuZGVzY3IgPSAiRFMgZHJvcCBkdWUgdG8gbWlzcyBldmVudCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX01JU1NfRVZFTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50ID0geyAubmFtZSA9ICJkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQiLCAuZGVzY3IgPSAiRFMgZHJvcCBkdWUgdG8gaGl0IGV2ZW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfZHNfZHJvcF90b19kaXNhYmxlZF9nZW0gPSB7IC5uYW1lID0gImRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtIiwgLmRlc2NyID0gIkRTIGRyb3AgdG8gZGlzYWJsZWQgR0VNIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X25ld19tYWNfZGlzY292ZXJlZCA9IHsgLm5hbWUgPSAibmV3X21hY19kaXNjb3ZlcmVkIiwgLmRlc2NyID0gIk5ldyBNQUMgZGlzY292ZXJlZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRElTQ09WRVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEsIG5ld19tYWNfZGlzY292ZXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X21vdmVfZXZlbnQgPSB7IC5uYW1lID0gIm1vdmVfZXZlbnQiLCAuZGVzY3IgPSAiTW92ZSBldmVudCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBtb3ZlX2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfbmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwgPSB7IC5uYW1lID0gIm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsIiwgLmRlc2NyID0gIk5ldyBNQUMgZHJvcCBkdWUgdG8gZmlmbyBmdWxsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19oaXRfZXZlbnQsICZwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfZHNfbWlzc19ldmVudCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19kcm9wX2R1ZV90b19taXNzX2V2ZW50LCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2RzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19kcm9wX3RvX2Rpc2FibGVkX2dlbSwgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9uZXdfbWFjX2Rpc2NvdmVyZWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfbW92ZV9ldmVudCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9uZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRzX2hpdF9ldmVudCIsIC5kZXNjciA9ICJEUyBoaXQgZXZlbnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfaGl0X2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRzX21pc3NfZXZlbnQiLCAuZGVzY3IgPSAiRFMgbWlzcyBldmVudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBkc19taXNzX2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQiLCAuZGVzY3IgPSAiRFMgZHJvcCBkdWUgdG8gbWlzcyBldmVudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCIsIC5kZXNjciA9ICJEUyBkcm9wIGR1ZSB0byBoaXQgZXZlbnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtIiwgLmRlc2NyID0gIkRTIGRyb3AgdG8gZGlzYWJsZWQgR0VNIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm5ld19tYWNfZGlzY292ZXJlZCIsIC5kZXNjciA9ICJOZXcgTUFDIGRpc2NvdmVyZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgbmV3X21hY19kaXNjb3ZlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm1vdmVfZXZlbnQiLCAuZGVzY3IgPSAiTW92ZSBldmVudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBtb3ZlX2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsIiwgLmRlc2NyID0gIk5ldyBNQUMgZHJvcCBkdWUgdG8gZmlmbyBmdWxsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmIC0gZmx1c2hfbWFjX3RhYmxlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbnRyb2wgPSB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiY29udHJvbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfdmlkID0geyAubmFtZSA9ICJ2aWQiLCAuZGVzY3IgPSAiVklEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9WSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEsIHZpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZmxvd19pZCA9IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJGTE9XIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2ZsdXNoX21hY190YWJsZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb250cm9sLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfdmlkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZmxvd19pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24gfSwgeyAubmFtZSA9ICJ2aWQiLCAuZGVzY3IgPSAiVklEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSwgdmlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiRkxPVyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEsIGZsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSIsIC5kZXNjciA9ICJGbHVzaCBNQUMgVGFibGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBzY2FuX21hY190YWJsZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJFbnRyeSBNQUMgYWRkcmVzcy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfSURfTUFDX0FERFJFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJFbnRyeSBNQUMgYWRkcmVzcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhIiwgLmRlc2NyID0gIlNjYW5zIE1BQyB0YWJsZSBmb3IgYSBnaXZlbiBNQUMgYWRkcmVzcyB0aGVuIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX2l3ZiAtIHNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9tYWNfYWRkcmVzcyA9IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiRW50cnkgTUFDIGFkZHJlc3MuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9NQUNfQUREUkVTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2VudHJpZXMgPSB7IC5uYW1lID0gImVudHJpZXMiLCAuZGVzY3IgPSAiU2NhbiByZXN1bHRzIGZvciB0aGlzIGVudHJ5LiAgSWYgdGhpcyBsaXN0IGlzIGVtcHR5LCB0aGUgTUFDIGFkZHJlc3Mgd2FzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9FTlRSSUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhLCBlbnRyaWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9lbnRyaWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJFbnRyeSBNQUMgYWRkcmVzcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJlbnRyaWVzIiwgLmRlc2NyID0gIlNjYW4gcmVzdWx0cyBmb3IgdGhpcyBlbnRyeS4gIElmIHRoaXMgbGlzdCBpcyBlbXB0eSwgdGhlIE1BQyBhZGRyZXNzIHdhcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGEsIGVudHJpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiQSBNQUMgdGFibGUgc2NhbiBpbml0aWF0ZWQgdXNpbmcgdGhlIFwic2Nhbl9tYWNfdGFibGVcIiBvcGVyYXRpb24gaXMgY29tcGxldGUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2Zfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3ZiAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3ZiAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9hdXRvX2NmZ19mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkID0geyAubmFtZSA9ICJmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX0ZMVVNIX01BQ19UQUJMRV9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSwgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2F1dG9fY2ZnX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzY2FuX21hY190YWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEsIHNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX2F1dG9fY2ZnX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX2F1dG9fY2ZnX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhLCBmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzY2FuX21hY190YWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEsIHNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25faXdmX2RzX2VncmVzc19mbG93ID09PT0gKi8KKworLyogR3JvdXA6IGdwb25faXdmX2RzX2VncmVzc19mbG93IC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2Zsb3dfaWQgPSB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiRmxvdyBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXksIGZsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2Zsb3dfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiRmxvdyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5LCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3cgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZ2VtX3BvcnQgPSB7IC5uYW1lID0gImdlbV9wb3J0IiwgLmRlc2NyID0gIkdFTSBwb3J0IElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSwgZ2VtX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX3BiaXRfY29udHJvbCA9IHsgLm5hbWUgPSAicGJpdF9jb250cm9sIiwgLmRlc2NyID0gIklmIGVuYWJsZWQsIHRoZSBQYml0cyB2YWx1ZSBpcyB0YWtlbiBmcm9tIHRoZSBtYXBwaW5nIFZMQU4gdGFnIChJbm5lci9PdXRlcikgVkxBTiBQYml0cyBsb2NhdGlvbiBhbmQgYWRkZWQgdG8gdGhlIGNvbmZpZ3VyZWQgR0VNIHBvcnQgSUQgdmFsdWUgdG8gY3JlYXRlIHRoZSBGaW5hbCBHRU0gSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX1BCSVRfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSwgcGJpdF9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2dlbV9wb3J0LCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfcGJpdF9jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJnZW1fcG9ydCIsIC5kZXNjciA9ICJHRU0gcG9ydCBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEsIGdlbV9wb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInBiaXRfY29udHJvbCIsIC5kZXNjciA9ICJJZiBlbmFibGVkLCB0aGUgUGJpdHMgdmFsdWUgaXMgdGFrZW4gZnJvbSB0aGUgbWFwcGluZyBWTEFOIHRhZyAoSW5uZXIvT3V0ZXIpIFZMQU4gUGJpdHMgbG9jYXRpb24gYW5kIGFkZGVkIHRvIHRoZSBjb25maWd1cmVkIEdFTSBwb3J0IElEIHZhbHVlIHRvIGNyZWF0ZSB0aGUgRmluYWwgR0VNIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSwgcGJpdF9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93ID09PT0gKi8KKworLyogR3JvdXA6IGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfdmxhbl9pZCA9IHsgLm5hbWUgPSAidmxhbl9pZCIsIC5kZXNjciA9ICJ2bGFuIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5LCB2bGFuX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV92bGFuX2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInZsYW5faWQiLCAuZGVzY3IgPSAidmxhbiBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSwgdmxhbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93IC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19tYXBwaW5nX21ldGhvZCA9IHsgLm5hbWUgPSAibWFwcGluZ19tZXRob2QiLCAuZGVzY3IgPSAiVGhlIE1hcHBpbmcgbWV0aG9kIGRlZmluZXMgaG93IHRoZSBmbG93IElEIHdpbGwgYmUgZGV0ZXJtaW5lZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfTUVUSE9ELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSwgbWFwcGluZ19tZXRob2QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX21hcHBpbmdfdGFnID0geyAubmFtZSA9ICJtYXBwaW5nX3RhZyIsIC5kZXNjciA9ICJEZWZpbmUgaWYgdGhlIG91dGVyIG9yIHRoZSBpbm5lciBWTEFOIHRhZyBvZiB0aGUgcGFja2V0IHdpbGwgZGV0ZXJtaW5lIHRoZSBmbG93IElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhLCBtYXBwaW5nX3RhZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfdmxhbl9hY3Rpb24gPSB7IC5uYW1lID0gInZsYW5fYWN0aW9uIiwgLmRlc2NyID0gIkRlZmluZSB0aGUgb3V0ZXIgVkxBTiB0YWcgbWFuaXB1bGF0aW9uIG9uIHRoZSBwYWNrZXQ6IHRyYW5zcGFyZW50IG9yIHJlbW92ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSwgdmxhbl9hY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kc192bGFuX2FjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX21hcHBpbmdfbWV0aG9kLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX21hcHBpbmdfdGFnLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX3ZsYW5fYWN0aW9uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWFwcGluZ19tZXRob2QiLCAuZGVzY3IgPSAiVGhlIE1hcHBpbmcgbWV0aG9kIGRlZmluZXMgaG93IHRoZSBmbG93IElEIHdpbGwgYmUgZGV0ZXJtaW5lZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhLCBtYXBwaW5nX21ldGhvZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB9LCB7IC5uYW1lID0gIm1hcHBpbmdfdGFnIiwgLmRlc2NyID0gIkRlZmluZSBpZiB0aGUgb3V0ZXIgb3IgdGhlIGlubmVyIFZMQU4gdGFnIG9mIHRoZSBwYWNrZXQgd2lsbCBkZXRlcm1pbmUgdGhlIGZsb3cgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSwgbWFwcGluZ190YWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QgfSwgeyAubmFtZSA9ICJ2bGFuX2FjdGlvbiIsIC5kZXNjciA9ICJEZWZpbmUgdGhlIG91dGVyIFZMQU4gdGFnIG1hbmlwdWxhdGlvbiBvbiB0aGUgcGFja2V0OiB0cmFuc3BhcmVudCBvciByZW1vdmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSwgdmxhbl9hY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kc192bGFuX2FjdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZ3Bvbl9pd2ZfbWFjX3RhYmxlID09PT0gKi8KKworLyogR3JvdXA6IGdwb25faXdmX21hY190YWJsZSAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9rZXlfbWFjX2FkZHJlc3MgPSB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIk1BQyBhZGRyZXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV92bGFuID0geyAubmFtZSA9ICJ2bGFuIiwgLmRlc2NyID0gIlZMQU4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXksIHZsYW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X21hY19hZGRyZXNzLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3ZsYW4gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiTUFDIGFkZHJlc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXksIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gInZsYW4iLCAuZGVzY3IgPSAiVkxBTiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSwgdmxhbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2ZfbWFjX3RhYmxlIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19mbG93X2lkID0geyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIlRoZSBmbG93IElEIGFzc2lnbmVkIHRvIHRyYWZmaWMgdGhhdCBtYXRjaGVzIHRoaXMgTUFDIHRhYmxlIGVudHJ5LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0ZMT1dfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9jZmdfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJXaGV0aGVyIG9yIG5vdCB0aGUgTUFDIGVudHJ5IGlzIHN0YXRpYy4gIFN0YXRpYyBlbnRyaWVzIGRvbid0IGFnZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9jZmdfZ2VtX3BvcnRfaWQgPSB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBHRU0gcG9ydCBJRCBvZiB0aGUgdHJhZmZpYyB0aGF0IGNyZWF0ZWQgdGhpcyB0YWJsZSBlbnRyeS4gIFRoaXMgb25seSBhcHBsaWVzIHRvIGF1dG9tYXRpY2FsbHktbGVhcm5lZCBlbnRyaWVzLiAgTWFudWFsbHktYWRkZWQgZW50cmllcyB3aWxsIGhhdmUgdGhlIHZhbHVlIEJDTU9MVF9QT05fR0VNX1BPUlRfSURfSU5WQUxJRC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0dFTV9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSwgZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJUaGUgT05VIElEIGZvciB0aGUgdHJhZmZpYyB0aGF0IGNyZWF0ZWQgdGhpcyB0YWJsZSBlbnRyeS4gIFRoaXMgb25seSB2YWxpZCBpZiBnZW1fcG9ydF9pZCBpcyB2YWxpZC4gIE90aGVyd2lzZSB0aGlzIHdpbGwgYmUgc2V0IHRvIEJDTU9MVF9HUE9OX09OVV9JRF9JTlZBTElELiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX21hY190YWJsZV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2Zsb3dfaWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9jZmdfc3RhdCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19nZW1fcG9ydF9pZCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19vbnVfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIlRoZSBmbG93IElEIGFzc2lnbmVkIHRvIHRyYWZmaWMgdGhhdCBtYXRjaGVzIHRoaXMgTUFDIHRhYmxlIGVudHJ5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdGhlIE1BQyBlbnRyeSBpcyBzdGF0aWMuICBTdGF0aWMgZW50cmllcyBkb24ndCBhZ2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJUaGUgR0VNIHBvcnQgSUQgb2YgdGhlIHRyYWZmaWMgdGhhdCBjcmVhdGVkIHRoaXMgdGFibGUgZW50cnkuICBUaGlzIG9ubHkgYXBwbGllcyB0byBhdXRvbWF0aWNhbGx5LWxlYXJuZWQgZW50cmllcy4gIE1hbnVhbGx5LWFkZGVkIGVudHJpZXMgd2lsbCBoYXZlIHRoZSB2YWx1ZSBCQ01PTFRfUE9OX0dFTV9QT1JUX0lEX0lOVkFMSUQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEsIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJUaGUgT05VIElEIGZvciB0aGUgdHJhZmZpYyB0aGF0IGNyZWF0ZWQgdGhpcyB0YWJsZSBlbnRyeS4gIFRoaXMgb25seSB2YWxpZCBpZiBnZW1fcG9ydF9pZCBpcyB2YWxpZC4gIE90aGVyd2lzZSB0aGlzIHdpbGwgYmUgc2V0IHRvIEJDTU9MVF9HUE9OX09OVV9JRF9JTlZBTElELiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3Zl9tYWNfdGFibGUgLSBuZXdfbWFjICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZmxvd19pZCA9IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBlbnRyeS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX21hY190YWJsZV9uZXdfbWFjX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZmxvd19pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIlRoZSBmbG93IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IGVudHJ5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBuZXcgTUFDIGFkZHJlc3MgLyBWSUQgY29tYmluYXRpb24gaXMgc2VlbiBpbiB0aGUgdXBzdHJlYW0gdHJhZmZpYyBzdHJlYW0uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmX21hY190YWJsZSAtIG1hY19hZ2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25faXdmX21hY190YWJsZSAtIG1hY19tb3ZlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX29sZF9mbG93X2lkID0geyAubmFtZSA9ICJvbGRfZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBpbiB0aGUgY3VycmVudCBNQUMgdGFibGUgZW50cnkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9PTERfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSwgb2xkX2Zsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX25ld19mbG93X2lkID0geyAubmFtZSA9ICJuZXdfZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBzZWVuIGluIHRoZSB0cmFmZmljIHN0cmVhbS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhLCBuZXdfZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfb2xkX2Zsb3dfaWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9uZXdfZmxvd19pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib2xkX2Zsb3dfaWQiLCAuZGVzY3IgPSAiVGhlIGZsb3cgSUQgaW4gdGhlIGN1cnJlbnQgTUFDIHRhYmxlIGVudHJ5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEsIG9sZF9mbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm5ld19mbG93X2lkIiwgLmRlc2NyID0gIlRoZSBmbG93IElEIHNlZW4gaW4gdGhlIHRyYWZmaWMgc3RyZWFtLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEsIG5ld19mbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIHRoZSBNQUMgdGFibGUgaXMgaW4gbW92ZSBtb2RlIGFuZCBhIHBhY2tldCBpcyBzZWVuIHRoYXQgbWF0Y2hlcyBvbiBNQUMgYWRkcmVzcyAvIFZJRCBidXQgZG9lc24ndCBtYXRjaCBvbiBmbG93IElELiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3Zl9tYWNfdGFibGUgLSBtYWNfZHJvcHBlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9mbG93X2lkID0geyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIlRoZSBmbG93IElEIG9mIHRoZSBlbnRyeSB0aGF0IHdhcyBkcm9wcGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRURfSURfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZmxvd19pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBvZiB0aGUgZW50cnkgdGhhdCB3YXMgZHJvcHBlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGFuIGVudHJ5IGNhbm5vdCBiZSBsZWFybmVkIHNpbmNlIHRoZSBNQUMgdGFibGUgaXMgZnVsbC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2ZfbWFjX3RhYmxlIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfbWFjX2FnZWQgPSB7IC5uYW1lID0gIm1hY19hZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtYWNfYWdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0FHRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEsIG1hY19hZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX21hY19kcm9wcGVkID0geyAubmFtZSA9ICJtYWNfZHJvcHBlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibWFjX2Ryb3BwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhLCBtYWNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19tYWNfbW92ZSA9IHsgLm5hbWUgPSAibWFjX21vdmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1hY19tb3ZlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfTU9WRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSwgbWFjX21vdmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfbmV3X21hYyA9IHsgLm5hbWUgPSAibmV3X21hYyIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibmV3X21hY1wiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTkVXX01BQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSwgbmV3X21hYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19tYWNfYWdlZCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX21hY19kcm9wcGVkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfbWFjX21vdmUsICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19uZXdfbWFjIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibWFjX2FnZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhLCBtYWNfYWdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1hY19kcm9wcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtYWNfZHJvcHBlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEsIG1hY19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibWFjX21vdmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1hY19tb3ZlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSwgbWFjX21vdmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJuZXdfbWFjIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJuZXdfbWFjXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSwgbmV3X21hYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25faXdmX3VzX2Zsb3cgPT09PSAqLworCisvKiBHcm91cDogZ3Bvbl9pd2ZfdXNfZmxvdyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfa2V5X2dlbV9wb3J0X2lkID0geyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJHRU0gUG9ydCAgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXksIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX3VzX2Zsb3dfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2tleV9nZW1fcG9ydF9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIkdFTSBQb3J0ICBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXksIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmX3VzX2Zsb3cgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2NmZ19mbG93X2lkID0geyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIkZsb3cgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX21hY19sZWFybmluZyA9IHsgLm5hbWUgPSAibWFjX2xlYXJuaW5nIiwgLmRlc2NyID0gIk1BQyBsZWFybmluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9NQUNfTEVBUk5JTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgbWFjX2xlYXJuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfdmxhbl9hY3Rpb24gPSB7IC5uYW1lID0gInZsYW5fYWN0aW9uIiwgLmRlc2NyID0gIlZMQU4gYWN0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEsIHZsYW5fYWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXNfdmxhbl9hY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2NmZ192bGFuX3RhZyA9IHsgLm5hbWUgPSAidmxhbl90YWciLCAuZGVzY3IgPSAiVmxhbiB0YWciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9UQUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgdmxhbl90YWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF92bGFuX3RhZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX3RwaWRfaW5kZXggPSB7IC5uYW1lID0gInRwaWRfaW5kZXgiLCAuZGVzY3IgPSAiVFBJRCBpbmRleCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9UUElEX0lOREVYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEsIHRwaWRfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl91c19mbG93X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX2Zsb3dfaWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX21hY19sZWFybmluZywgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfdmxhbl9hY3Rpb24sICZwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX3ZsYW5fdGFnLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2NmZ190cGlkX2luZGV4IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiRmxvdyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtYWNfbGVhcm5pbmciLCAuZGVzY3IgPSAiTUFDIGxlYXJuaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhLCBtYWNfbGVhcm5pbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ2bGFuX2FjdGlvbiIsIC5kZXNjciA9ICJWTEFOIGFjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgdmxhbl9hY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91c192bGFuX2FjdGlvbiB9LCB7IC5uYW1lID0gInZsYW5fdGFnIiwgLmRlc2NyID0gIlZsYW4gdGFnIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhLCB2bGFuX3RhZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ZsYW5fdGFnIH0sIHsgLm5hbWUgPSAidHBpZF9pbmRleCIsIC5kZXNjciA9ICJUUElEIGluZGV4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhLCB0cGlkX2luZGV4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25fbmkgPT09PSAqLworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9rZXlfcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Bvbl9zdGF0dXMgPSB7IC5uYW1lID0gInBvbl9zdGF0dXMiLCAuZGVzY3IgPSAiUE9OIHN0YXR1cyBwYXJhbWV0ZXJzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2F2YWlsYWJsZV9iYW5kd2lkdGggPSB7IC5uYW1lID0gImF2YWlsYWJsZV9iYW5kd2lkdGgiLCAuZGVzY3IgPSAiUE9OIGF2YWlsYWJsZSBiYW5kd2lkdGggcGFyYW1ldGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYXZhaWxhYmxlX2JhbmR3aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfbnVtYmVyX29mX2FjdGl2ZV9vbnVzID0geyAubmFtZSA9ICJudW1iZXJfb2ZfYWN0aXZlX29udXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFjdGl2ZSBPTlVzIG9uIHRoZSBQT04iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX251bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzID0geyAubmFtZSA9ICJudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyIsIC5kZXNjciA9ICJudW1iZXIgb2YgYWN0aXZlIHN0YW5kYnkgb251cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfU1RBTkRCWV9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3ByYnNfc3RhdHVzID0geyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHJic19zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Bvbl9kaXN0YW5jZSA9IHsgLm5hbWUgPSAicG9uX2Rpc3RhbmNlIiwgLmRlc2NyID0gIlBPTiBkaXN0YW5jZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcG9uX2Rpc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2Rpc3RhbmNlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcmFuZ2luZ193aW5kb3dfc2l6ZSA9IHsgLm5hbWUgPSAicmFuZ2luZ193aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJSYW5naW5nIHdpbmRvdyBzaXplIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCByYW5naW5nX3dpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3ByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSA9IHsgLm5hbWUgPSAicHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5IiwgLmRlc2NyID0gIk9OVSBwcmUtYXNzaWduZWQgZXF1YWxpemF0aW9uIGRlbGF5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSRUFTU0lHTkVEX0VRVUFMSVpBVElPTl9ERUxBWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZXFkX2N5Y2xlc19udW1iZXIgPSB7IC5uYW1lID0gImVxZF9jeWNsZXNfbnVtYmVyIiwgLmRlc2NyID0gIkhvdyBtYW55IHJhbmdpbmcgd2luZG93cyBhcmUgb3BlbmVkIGR1cmluZyBhIHNpbmdsZSBPTlUgYWN0aXZhdGlvbiBwcm9jZXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGVxZF9jeWNsZXNfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Bvd2VyX2xldmVsID0geyAubmFtZSA9ICJwb3dlcl9sZXZlbCIsIC5kZXNjciA9ICJPTlUgcG93ZXIgbGV2ZWwgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwb3dlcl9sZXZlbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RzX2ZlY19tb2RlID0geyAubmFtZSA9ICJkc19mZWNfbW9kZSIsIC5kZXNjciA9ICJEUyBGRUMgbW9kZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBkc19mZWNfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19kcmlmdF9jb250cm9sID0geyAubmFtZSA9ICJkcmlmdF9jb250cm9sIiwgLmRlc2NyID0gIkRyaWZ0IGNvbnRyb2wgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgZHJpZnRfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCA9IHsgLm5hbWUgPSAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIsIC5kZXNjciA9ICJEUyBCRVIgcmVwb3J0aW5nIGludGVydmFsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19sb3NfYWxhcm1fdGhyZXNob2xkID0geyAubmFtZSA9ICJsb3NfYWxhcm1fdGhyZXNob2xkIiwgLmRlc2NyID0gIkxPUyBhbGFybSB0aHJlc2hvbGQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBsb3NfYWxhcm1fdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfbG9zX2luaXRpYWxfdmFsdWUgPSB7IC5uYW1lID0gImxvc19pbml0aWFsX3ZhbHVlIiwgLmRlc2NyID0gIkxPUyBpbml0aWFsIHZhbHVlIGZvbGxvd2luZyBQT04gYWN0aXZhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBsb3NfaW5pdGlhbF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX29udV9hbGFybXNfdGhyZXNob2xkcyA9IHsgLm5hbWUgPSAib251X2FsYXJtc190aHJlc2hvbGRzIiwgLmRlc2NyID0gIk9OVSBhbGFybXMgdGhyZXNob2xkcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2Jlcl9tb25pdG9yID0geyAubmFtZSA9ICJiZXJfbW9uaXRvciIsIC5kZXNjciA9ICJCRVIgbW9uaXRvciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYmVyX21vbml0b3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wbG9hbV9hY2tfdGltZW91dCA9IHsgLm5hbWUgPSAicGxvYW1fYWNrX3RpbWVvdXQiLCAuZGVzY3IgPSAiVGltZW91dCBmb3IgcmVjZWl2aW5nIEFDSyBwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QTE9BTV9BQ0tfVElNRU9VVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwbG9hbV9hY2tfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19vbnVfYWN0aXZhdGlvbiA9IHsgLm5hbWUgPSAib251X2FjdGl2YXRpb24iLCAuZGVzY3IgPSAiT05VIGFjdGl2YXRpb24gY29udHJvbCBwYXJhbWV0ZXJzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG9udV9hY3RpdmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3NuX2FjcXVpc2l0aW9uID0geyAubmFtZSA9ICJzbl9hY3F1aXNpdGlvbiIsIC5kZXNjciA9ICJTZXJpYWwgTnVtYmVyIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBzbl9hY3F1aXNpdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19rZXlfZXhjaGFuZ2UgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2tleV9leGNoYW5nZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZyIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHN3aXRjaGluZyBjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSA9IHsgLm5hbWUgPSAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC5kZXNjciA9ICJDQlIgUmVhbCBUaW1lIGFsbG9jYXRpb24gcHJvZmlsZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgPSB7IC5uYW1lID0gImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLmRlc2NyID0gIkNCUiBub24gUmVhbCBUaW1lIGFsbG9jYXRpb24gcHJvZmlsZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RiYSA9IHsgLm5hbWUgPSAiZGJhIiwgLmRlc2NyID0gIkRCQSBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RCQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBkYmEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGJhIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcG93ZXJfbWFuYWdlbWVudCA9IHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudCIsIC5kZXNjciA9ICJPTlUgcG93ZXIgbWFuYWdlbWVudCBjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcG93ZXJfbWFuYWdlbWVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgPSB7IC5uYW1lID0gInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIsIC5kZXNjciA9ICJSb2d1ZSBPTlUgZGV0ZWN0aW9uIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9ST0dVRV9PTlVfREVURUNUSU9OX1BST0NFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyA9IHsgLm5hbWUgPSAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIsIC5kZXNjciA9ICJQZXJpb2RpYyBTdGFuZGJ5IFBPTiBtb25pdG9yaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcmJzX2NoZWNrZXIgPSB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC5kZXNjciA9ICJVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHJic19jaGVja2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3ByYnNfZ2VuZXJhdG9yID0geyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHByYnNfZ2VuZXJhdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfbWluX2RhdGFfYWxsb2NfaWQgPSB7IC5uYW1lID0gIm1pbl9kYXRhX2FsbG9jX2lkIiwgLmRlc2NyID0gIk1pbiBkYXRhIEFsbG9jIElEIHZhbHVlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG1pbl9kYXRhX2FsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uID0geyAubmFtZSA9ICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIsIC5kZXNjciA9ICJPcHRpb24gdG8gZGlzYWJsZSB0aGUgYXV0b21hdGljIGRlYWN0aXZhdGlvbiBvZiBPTlVzIGR1ZSB0byBhbGFybXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3VzX2JhbmR3aWR0aF9saW1pdCA9IHsgLm5hbWUgPSAidXNfYmFuZHdpZHRoX2xpbWl0IiwgLmRlc2NyID0gIlRvdGFsIFBPTiB1cHN0cmVhbSBiYW5kd2lkdGggbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHVzX2JhbmR3aWR0aF9saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19hbGxfb251cyA9IHsgLm5hbWUgPSAiYWxsX29udXMiLCAuZGVzY3IgPSAiQWxsIE9OVXMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGFsbF9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfYWxsX21jYXN0X2dlbV9wb3J0cyA9IHsgLm5hbWUgPSAiYWxsX21jYXN0X2dlbV9wb3J0cyIsIC5kZXNjciA9ICJBbGwgbXVsdGljYXN0IEdFTSBwb3J0cyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBQT04uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19kZWJ1ZyA9IHsgLm5hbWUgPSAiZGVidWciLCAuZGVzY3IgPSAiUE9OIE5JIGRlYnVnIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREVCVUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgZGVidWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2RlYnVnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfb251X3VwZ3JhZGVfcGFyYW1zID0geyAubmFtZSA9ICJvbnVfdXBncmFkZV9wYXJhbXMiLCAuZGVzY3IgPSAiT05VIHVwZ3JhZGUgcGFyYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9wYXJhbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3BzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQgPSB7IC5uYW1lID0gInBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQiLCAuZGVzY3IgPSAiUFMgdHlwZSBDIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19iaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wgPSB7IC5uYW1lID0gImJpcDMyX2luZGljYXRpb25fY29udHJvbCIsIC5kZXNjciA9ICJPcHRpb24gdG8gZGlzYWJsZSB0aGUgYmlwMzIgaW5kaWNhdGlvbiB3aGVuIHRoZSB2YWx1ZSBpcyB6ZXJvIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JJUDMyX0lORElDQVRJT05fQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wb25fc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19hdmFpbGFibGVfYmFuZHdpZHRoLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19udW1iZXJfb2ZfYWN0aXZlX29udXMsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX251bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcmJzX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcG9uX2Rpc3RhbmNlLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19yYW5naW5nX3dpbmRvd19zaXplLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXksICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2VxZF9jeWNsZXNfbnVtYmVyLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wb3dlcl9sZXZlbCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZHNfZmVjX21vZGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RyaWZ0X2NvbnRyb2wsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2xvc19hbGFybV90aHJlc2hvbGQsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2xvc19pbml0aWFsX3ZhbHVlLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19vbnVfYWxhcm1zX3RocmVzaG9sZHMsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2Jlcl9tb25pdG9yLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wbG9hbV9hY2tfdGltZW91dCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfb251X2FjdGl2YXRpb24sICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3NuX2FjcXVpc2l0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19rZXlfZXhjaGFuZ2UsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZGJhLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wb3dlcl9tYW5hZ2VtZW50LCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3ByYnNfY2hlY2tlciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcHJic19nZW5lcmF0b3IsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX21pbl9kYXRhX2FsbG9jX2lkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfdXNfYmFuZHdpZHRoX2xpbWl0LCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19hbGxfb251cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfYWxsX21jYXN0X2dlbV9wb3J0cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZGVidWcsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX29udV91cGdyYWRlX3BhcmFtcywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9zdGF0dXMiLCAuZGVzY3IgPSAiUE9OIHN0YXR1cyBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXR1cyB9LCB7IC5uYW1lID0gImF2YWlsYWJsZV9iYW5kd2lkdGgiLCAuZGVzY3IgPSAiUE9OIGF2YWlsYWJsZSBiYW5kd2lkdGggcGFyYW1ldGVycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYXZhaWxhYmxlX2JhbmR3aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX2FjdGl2ZV9vbnVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhY3RpdmUgT05VcyBvbiB0aGUgUE9OIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGFjdGl2ZSBzdGFuZGJ5IG9udXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLmRlc2NyID0gIlJlc3VsdCBvZiBVUyBQUkJTIGNoZWNrZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfSwgeyAubmFtZSA9ICJwb25fZGlzdGFuY2UiLCAuZGVzY3IgPSAiUE9OIGRpc3RhbmNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwb25fZGlzdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGlzdGFuY2UgfSwgeyAubmFtZSA9ICJyYW5naW5nX3dpbmRvd19zaXplIiwgLmRlc2NyID0gIlJhbmdpbmcgd2luZG93IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHJhbmdpbmdfd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5IiwgLmRlc2NyID0gIk9OVSBwcmUtYXNzaWduZWQgZXF1YWxpemF0aW9uIGRlbGF5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZXFkX2N5Y2xlc19udW1iZXIiLCAuZGVzY3IgPSAiSG93IG1hbnkgcmFuZ2luZyB3aW5kb3dzIGFyZSBvcGVuZWQgZHVyaW5nIGEgc2luZ2xlIE9OVSBhY3RpdmF0aW9uIHByb2Nlc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGVxZF9jeWNsZXNfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInBvd2VyX2xldmVsIiwgLmRlc2NyID0gIk9OVSBwb3dlciBsZXZlbCBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwb3dlcl9sZXZlbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCB9LCB7IC5uYW1lID0gImRzX2ZlY19tb2RlIiwgLmRlc2NyID0gIkRTIEZFQyBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBkc19mZWNfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJkcmlmdF9jb250cm9sIiwgLmRlc2NyID0gIkRyaWZ0IGNvbnRyb2wgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBkcmlmdF9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgfSwgeyAubmFtZSA9ICJkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsIiwgLmRlc2NyID0gIkRTIEJFUiByZXBvcnRpbmcgaW50ZXJ2YWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibG9zX2FsYXJtX3RocmVzaG9sZCIsIC5kZXNjciA9ICJMT1MgYWxhcm0gdGhyZXNob2xkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBsb3NfYWxhcm1fdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9zX2luaXRpYWxfdmFsdWUiLCAuZGVzY3IgPSAiTE9TIGluaXRpYWwgdmFsdWUgZm9sbG93aW5nIFBPTiBhY3RpdmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBsb3NfaW5pdGlhbF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gIm9udV9hbGFybXNfdGhyZXNob2xkcyIsIC5kZXNjciA9ICJPTlUgYWxhcm1zIHRocmVzaG9sZHMgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgb251X2FsYXJtc190aHJlc2hvbGRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgfSwgeyAubmFtZSA9ICJiZXJfbW9uaXRvciIsIC5kZXNjciA9ICJCRVIgbW9uaXRvciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGJlcl9tb25pdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIH0sIHsgLm5hbWUgPSAicGxvYW1fYWNrX3RpbWVvdXQiLCAuZGVzY3IgPSAiVGltZW91dCBmb3IgcmVjZWl2aW5nIEFDSyBwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcGxvYW1fYWNrX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb24iLCAuZGVzY3IgPSAiT05VIGFjdGl2YXRpb24gY29udHJvbCBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gfSwgeyAubmFtZSA9ICJzbl9hY3F1aXNpdGlvbiIsIC5kZXNjciA9ICJTZXJpYWwgTnVtYmVyIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgc25fYWNxdWlzaXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlIiwgLmRlc2NyID0gIktleSBFeGNoYW5nZSBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGtleV9leGNoYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgfSwgeyAubmFtZSA9ICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLmRlc2NyID0gIkNCUiBSZWFsIFRpbWUgYWxsb2NhdGlvbiBwcm9maWxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB9LCB7IC5uYW1lID0gImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLmRlc2NyID0gIkNCUiBub24gUmVhbCBUaW1lIGFsbG9jYXRpb24gcHJvZmlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzIgfSwgeyAubmFtZSA9ICJkYmEiLCAuZGVzY3IgPSAiREJBIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGRiYSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kYmEgfSwgeyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50IiwgLmRlc2NyID0gIk9OVSBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHBvd2VyX21hbmFnZW1lbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIiwgLmRlc2NyID0gIlJvZ3VlIE9OVSBkZXRlY3Rpb24gcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgfSwgeyAubmFtZSA9ICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIiwgLmRlc2NyID0gIlBlcmlvZGljIFN0YW5kYnkgUE9OIG1vbml0b3JpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIH0sIHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLmRlc2NyID0gIlVTIFBSQlMgY2hlY2tlciBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwcmJzX2NoZWNrZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIH0sIHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAuZGVzY3IgPSAiRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHJic19nZW5lcmF0b3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgfSwgeyAubmFtZSA9ICJtaW5fZGF0YV9hbGxvY19pZCIsIC5kZXNjciA9ICJNaW4gZGF0YSBBbGxvYyBJRCB2YWx1ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgbWluX2RhdGFfYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iLCAuZGVzY3IgPSAiT3B0aW9uIHRvIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBkZWFjdGl2YXRpb24gb2YgT05VcyBkdWUgdG8gYWxhcm1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIH0sIHsgLm5hbWUgPSAidXNfYmFuZHdpZHRoX2xpbWl0IiwgLmRlc2NyID0gIlRvdGFsIFBPTiB1cHN0cmVhbSBiYW5kd2lkdGggbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHVzX2JhbmR3aWR0aF9saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhbGxfb251cyIsIC5kZXNjciA9ICJBbGwgT05VcyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBQT04uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBhbGxfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB9LCB7IC5uYW1lID0gImFsbF9tY2FzdF9nZW1fcG9ydHMiLCAuZGVzY3IgPSAiQWxsIG11bHRpY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYWxsX21jYXN0X2dlbV9wb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IH0sIHsgLm5hbWUgPSAiZGVidWciLCAuZGVzY3IgPSAiUE9OIE5JIGRlYnVnIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGRlYnVnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX3BhcmFtcyIsIC5kZXNjciA9ICJPTlUgdXBncmFkZSBwYXJhbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG9udV91cGdyYWRlX3BhcmFtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIH0sIHsgLm5hbWUgPSAicHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCIsIC5kZXNjciA9ICJQUyB0eXBlIEMgdGltZW91dCBpbiBtaWxsaXNlY29uZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIiwgLmRlc2NyID0gIk9wdGlvbiB0byBkaXNhYmxlIHRoZSBiaXAzMiBpbmRpY2F0aW9uIHdoZW4gdGhlIHZhbHVlIGlzIHplcm8iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGJpcDMyX2luZGljYXRpb25fY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfZmVjX2NvZGV3b3JkcyA9IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBGRUMgY29kZXdvcmRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9mZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkID0geyAubmFtZSA9ICJmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIHVuY29ycmVjdGVkIEZFQyBjb2Rld29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2JpcDhfYnl0ZXMgPSB7IC5uYW1lID0gImJpcDhfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMgcHJvdGVjdGVkIGJ5IGJpcDgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGJpcDhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2JpcDhfZXJyb3JzID0geyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBiaXA4IGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGJpcDhfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1fcGFja2V0cyA9IHsgLm5hbWUgPSAicnhfZ2VtX3BhY2tldHMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgR0VNIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1fZHJvcHBlZCA9IHsgLm5hbWUgPSAicnhfZ2VtX2Ryb3BwZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBHRU0gSUQgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1faWRsZSA9IHsgLm5hbWUgPSAicnhfZ2VtX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgaWRsZSBHRU0gZnJhbWVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZ2VtX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2dlbV9jb3JyZWN0ZWQgPSB7IC5uYW1lID0gInJ4X2dlbV9jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgY29ycmVjdGVkIEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2dlbV9pbGxlZ2FsID0geyAubmFtZSA9ICJyeF9nZW1faWxsZWdhbCIsIC5kZXNjciA9ICJSZWNlaXZlZCBpbGxlZ2FsIEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9nZW1faWxsZWdhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfdmFsaWQgPSB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX3ZhbGlkIiwgLmRlc2NyID0gIlJlY2VpdmVkIHZhbGlkIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX2ludmFsaWQgPSB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2ludmFsaWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgaW52YWxpZCBhbGxvY2F0aW9ucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQgPSB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGRpc2FibGVkIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2FtcyA9IHsgLm5hbWUgPSAicnhfcGxvYW1zIiwgLmRlc2NyID0gIlJlY2VpdmVkIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLmRlc2NyID0gIlJlY2VpdmVkIG5vbiBpZGxlIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfbm9uX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19lcnJvciA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIGVycm9yIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19kcm9wcGVkID0geyAubmFtZSA9ICJyeF9wbG9hbXNfZHJvcHBlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkcm9wcGVkIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9jcHUgPSB7IC5uYW1lID0gInJ4X2NwdSIsIC5kZXNjciA9ICJSZWNlaXZlZCBDUFUgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1BVLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9jcHUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X29tY2kgPSB7IC5uYW1lID0gInJ4X29tY2kiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9vbWNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yID0geyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2Ryb3BwZWRfdG9vX3Nob3J0ID0geyAubmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19zaG9ydCIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gc2hvcnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9kcm9wcGVkX3Rvb19zaG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZHJvcHBlZF90b29fbG9uZyA9IHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fbG9uZyIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9kcm9wcGVkX3Rvb19sb25nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9jcmNfZXJyb3JzID0geyAubmFtZSA9ICJyeF9jcmNfZXJyb3JzIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBjcmMgZXJyb3IiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2NyY19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2tleV9lcnJvcnMgPSB7IC5uYW1lID0gInJ4X2tleV9lcnJvcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGtleSBlcnJvciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfa2V5X2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZnJhZ21lbnRzX2Vycm9ycyA9IHsgLm5hbWUgPSAicnhfZnJhZ21lbnRzX2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gZnJhZ21lbnRhdGlvbiBlcnJvciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZnJhZ21lbnRzX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfcGFja2V0c19kcm9wcGVkID0geyAubmFtZSA9ICJyeF9wYWNrZXRzX2Ryb3BwZWQiLCAuZGVzY3IgPSAiR2xvYmFsIGRyb3BwZWQgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2dlbSA9IHsgLm5hbWUgPSAidHhfZ2VtIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfZ2VtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9wbG9hbXMgPSB7IC5uYW1lID0gInR4X3Bsb2FtcyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBQbG9hbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX1BMT0FNUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfcGxvYW1zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9nZW1fZnJhZ21lbnRzID0geyAubmFtZSA9ICJ0eF9nZW1fZnJhZ21lbnRzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFnbWVudHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2dlbV9mcmFnbWVudHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2NwdSA9IHsgLm5hbWUgPSAidHhfY3B1IiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIENQVSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2NwdSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfb21jaSA9IHsgLm5hbWUgPSAidHhfb21jaSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCA9IHsgLm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGggPSB7IC5uYW1lID0gInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9kcm9wcGVkX3RwaWRfbWlzcyA9IHsgLm5hbWUgPSAidHhfZHJvcHBlZF90cGlkX21pc3MiLCAuZGVzY3IgPSAiRHJvcHBlZCBiZWNhdXNlIG9mIFRQSUQgbWlzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2Ryb3BwZWRfdHBpZF9taXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9kcm9wcGVkX3ZpZF9taXNzID0geyAubmFtZSA9ICJ0eF9kcm9wcGVkX3ZpZF9taXNzIiwgLmRlc2NyID0gIkRyb3BwZWQgYmVjYXVzZSBvZiBWSUQgbWlzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfZHJvcHBlZF92aWRfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfZmVjX2NvZGV3b3JkcywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2ZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9iaXA4X2J5dGVzLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfYmlwOF9lcnJvcnMsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1fcGFja2V0cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2dlbV9kcm9wcGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZ2VtX2lkbGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1fY29ycmVjdGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZ2VtX2lsbGVnYWwsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc192YWxpZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX2ludmFsaWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc19kaXNhYmxlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2FtcywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19lcnJvciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19kcm9wcGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfY3B1LCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfb21jaSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9kcm9wcGVkX3Rvb19zaG9ydCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2Ryb3BwZWRfdG9vX2xvbmcsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9jcmNfZXJyb3JzLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfa2V5X2Vycm9ycywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2ZyYWdtZW50c19lcnJvcnMsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9wYWNrZXRzX2Ryb3BwZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9nZW0sICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9wbG9hbXMsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9nZW1fZnJhZ21lbnRzLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfY3B1LCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfb21jaSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9kcm9wcGVkX3RwaWRfbWlzcywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfdmlkX21pc3MgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZlY19jb2Rld29yZHMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgRkVDIGNvZGV3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCB1bmNvcnJlY3RlZCBGRUMgY29kZXdvcmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJiaXA4X2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXA4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgYmlwOF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBiaXA4IGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGJpcDhfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2dlbV9wYWNrZXRzIiwgLmRlc2NyID0gIlJlY2VpdmVkIEdFTSBmcmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9nZW1fcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9nZW1fZHJvcHBlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkcm9wcGVkIEdFTSBJRCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZ2VtX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZ2VtX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgaWRsZSBHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZ2VtX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZ2VtX2NvcnJlY3RlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBjb3JyZWN0ZWQgR0VNIGZyYW1lcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZ2VtX2lsbGVnYWwiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgaWxsZWdhbCBHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZ2VtX2lsbGVnYWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfdmFsaWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9hbGxvY2F0aW9uc192YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19pbnZhbGlkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGludmFsaWQgYWxsb2NhdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGRpc2FibGVkIGFsbG9jYXRpb25zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zIiwgLmRlc2NyID0gIlJlY2VpdmVkIFBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgbm9uIGlkbGUgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX25vbl9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBlcnJvciBQbG9hbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBQbG9hbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9jcHUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgQ1BVIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9jcHUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb21jaSIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9vbWNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fc2hvcnQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIHNob3J0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZHJvcHBlZF90b29fc2hvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fbG9uZyIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZHJvcHBlZF90b29fbG9uZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9jcmNfZXJyb3JzIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBjcmMgZXJyb3IiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9jcmNfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2tleV9lcnJvcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGtleSBlcnJvciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2tleV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhZ21lbnRzX2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gZnJhZ21lbnRhdGlvbiBlcnJvciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2ZyYWdtZW50c19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIkdsb2JhbCBkcm9wcGVkIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZ2VtIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9nZW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGxvYW1zIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIFBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9nZW1fZnJhZ21lbnRzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFnbWVudHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9nZW1fZnJhZ21lbnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2NwdSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBDUFUgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2NwdSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9vbWNpIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIE9NQ0kgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBpbGxlZ2FsIGxlbmd0aCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF90cGlkX21pc3MiLCAuZGVzY3IgPSAiRHJvcHBlZCBiZWNhdXNlIG9mIFRQSUQgbWlzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2Ryb3BwZWRfdHBpZF9taXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2Ryb3BwZWRfdmlkX21pc3MiLCAuZGVzY3IgPSAiRHJvcHBlZCBiZWNhdXNlIG9mIFZJRCBtaXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfZHJvcHBlZF92aWRfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHNldF9wb25fc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3NldF9wb25fc3RhdGVfcG9uX3N0YXRlID0geyAubmFtZSA9ICJwb25fc3RhdGUiLCAuZGVzY3IgPSAiUE9OIHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEsIHBvbl9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9vcGVyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3NldF9wb25fc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3NldF9wb25fc3RhdGVfcG9uX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fc3RhdGUiLCAuZGVzY3IgPSAiUE9OIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSwgcG9uX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAiU2V0IFBPTiBTdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gcmVzZXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3Jlc2V0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBkaXNhYmxlX3NlcmlhbF9udW1iZXIgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sID0geyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSIsIC5kZXNjciA9ICJEaXNhYmxlIFNlcmlhbCBOdW1iZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHNpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHNldF9vbnVfc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3NldF9vbnVfc3RhdGVfb251X3N0YXRlID0geyAubmFtZSA9ICJvbnVfc3RhdGUiLCAuZGVzY3IgPSAiTmV3IG9wZXJhdGlvbiBzdGF0ZSBvZiBhbGwgT05Vcy4gIFRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtYXkgYmUgY29uZmlndXJlZCBieSB0aGUgR1BPTiBOSSBjb25maWd1cmF0aW9uIG9iamVjdCA6IGdwb25fbmkuY2ZnLnNuX2FjcXVpc2l0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBvcGVyYXRpb24gc3RhdGUgb2YgYWxsIE9OVXMuICBUaGUgZGVmYXVsdCBvcGVyYXRpb24gbWF5IGJlIGNvbmZpZ3VyZWQgYnkgdGhlIEdQT04gTkkgY29uZmlndXJhdGlvbiBvYmplY3QgOiBncG9uX25pLmNmZy5zbl9hY3F1aXNpdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgdGhlIG9wZXJhdGlvbiBzdGF0ZSBvZiBhbGwgT05Vcy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcmV2aW91c19zdGF0ZSA9IHsgLm5hbWUgPSAicHJldmlvdXNfc3RhdGUiLCAuZGVzY3IgPSAiUHJldmlvdXMgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBwcmV2aW91c19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9uZXdfc3RhdGUgPSB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJOZXcgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Jlc3VsdCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3ByZXZpb3VzX3N0YXRlLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAicHJldmlvdXNfc3RhdGUiLCAuZGVzY3IgPSAiUHJldmlvdXMgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBwcmV2aW91c19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0ZSB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJOZXcgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlN0YXRlIENoYW5nZSBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGxvcyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfbG9zX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9sb3NfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX2xvc19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfbG9zX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEiLCAuZGVzY3IgPSAiTE9TIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2xvc19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEiLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBTd2l0Y2hpbmcgVHJhZmZpYyBSZXN1bWUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9vbnVzID0geyAubmFtZSA9ICJvbnVzIiwgLmRlc2NyID0gIk9OVXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSwgb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX29udXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVzIiwgLmRlc2NyID0gIk9OVXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSwgb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSIsIC5kZXNjciA9ICJBZnRlciBhIHN3aXRjaG92ZXIgaXMgY29tcGxldGUgYW5kIGFsbCBPTlUgcmFuZ2luZyB0aW1lcyBoYXZlIHN0YWJpbGl6ZWQsIHRoaXMgaW5kaWNhdGlvbiBpcyBzZW50IHRvIGluZm9ybSB0aGUgaG9zdCBvZiBhbGwgbmV3IE9OVSBFUURzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX3Jlc3VsdCA9IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlByb3RlY3Rpb24gU3dpdGNoaW5nIFN3aXRjaG92ZXIgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciA9IHsgLm5hbWUgPSAibnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciIsIC5kZXNjciA9ICJudW1iZXIgb2YgZGV0ZWN0ZWQgZGVsaW1pdGVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEsIG51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9lbmVyZ3lfZGV0ZWN0X3NpZ25hbCA9IHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdF9zaWduYWwiLCAuZGVzY3IgPSAiZW5lcmd5IGRldGVjdCBzaWduYWwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEsIGVuZXJneV9kZXRlY3Rfc2lnbmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9lbmVyZ3lfZGV0ZWN0X3NpZ25hbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGRldGVjdGVkIGRlbGltaXRlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhLCBudW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImVuZXJneV9kZXRlY3Rfc2lnbmFsIiwgLmRlc2NyID0gImVuZXJneSBkZXRlY3Qgc2lnbmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEsIGVuZXJneV9kZXRlY3Rfc2lnbmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlN0YW5kYnkgUE9OIE1vbml0b3JpbmcgQ3ljbGUgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBvbnVfZGlzY292ZXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfb251X2Rpc2NvdmVyZWRfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9yYW5naW5nX3RpbWUgPSB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJyYW5naW5nIHRpbWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9SQU5HSU5HX1RJTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCByYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJvbnVfaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfb251X2Rpc2NvdmVyZWRfc2VyaWFsX251bWJlciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9yYW5naW5nX3RpbWUsICZwcm9wX2Rlc2NyX2dwb25fbmlfb251X2Rpc2NvdmVyZWRfb251X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0sIHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLmRlc2NyID0gInJhbmdpbmcgdGltZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCByYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIm9udV9pZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhIiwgLmRlc2NyID0gIk9OVSBEaXNjb3ZlcmVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBjcHVfcGFja2V0c19mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2Vycm9yID0geyAubmFtZSA9ICJlcnJvciIsIC5kZXNjciA9ICJUaGUgZXJyb3IgdGhhdCB3YXMgZW5jb3VudGVyZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSwgZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2dlbV9wb3J0X2lkID0geyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJUaGUgR0VNIHBvcnQgdGhhdCBjYXVzZWQgdGhlIGVycm9yLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEsIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9lcnJvciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2dlbV9wb3J0X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcnJvciIsIC5kZXNjciA9ICJUaGUgZXJyb3IgdGhhdCB3YXMgZW5jb3VudGVyZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSwgZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIEdFTSBwb3J0IHRoYXQgY2F1c2VkIHRoZSBlcnJvci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhLCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhIiwgLmRlc2NyID0gIkEgZmFpbHVyZSB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSBcImNwdV9wYWNrZXRzXCIgcHJveHkgb3BlcmF0aW9uLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gY3B1X3BhY2tldHMgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NwdV9wYWNrZXRzX3BhY2tldF90eXBlID0geyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC5kZXNjciA9ICJwYWNrZXQgdHlwZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfY2FsY19jcmMgPSB7IC5uYW1lID0gImNhbGNfY3JjIiwgLmRlc2NyID0gImNhbGMgY3JjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfZ2VtX3BvcnRfbGlzdCA9IHsgLm5hbWUgPSAiZ2VtX3BvcnRfbGlzdCIsIC5kZXNjciA9ICJnZW0gcG9ydCBsaXN0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGdlbV9wb3J0X2xpc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfYnVmZmVyID0geyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2NwdV9wYWNrZXRzX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19wYWNrZXRfdHlwZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19jYWxjX2NyYywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19nZW1fcG9ydF9saXN0LCAmcHJvcF9kZXNjcl9ncG9uX25pX2NwdV9wYWNrZXRzX2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLmRlc2NyID0gInBhY2tldCB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIHBhY2tldF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFja2V0X3R5cGUgfSwgeyAubmFtZSA9ICJjYWxjX2NyYyIsIC5kZXNjciA9ICJjYWxjIGNyYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2xpc3QiLCAuZGVzY3IgPSAiZ2VtIHBvcnQgbGlzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBnZW1fcG9ydF9saXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhIiwgLmRlc2NyID0gIkdQT04gQ1BVIFBhY2tldHMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGJyb2FkY2FzdF9wbG9hbV9wYWNrZXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcGxvYW0gPSB7IC5uYW1lID0gInBsb2FtIiwgLmRlc2NyID0gInBsb2FtIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSwgcGxvYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcGxvYW0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBsb2FtIiwgLmRlc2NyID0gInBsb2FtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSwgcGxvYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhIiwgLmRlc2NyID0gIkJyb2FkY2FzdCBQTE9BTSBQYWNrZXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHJvZ3VlX2RldGVjdGlvbl93aW5kb3cgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfd2luZG93X3R5cGUgPSB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLmRlc2NyID0gIlR5cGUgb2Ygc2lsZW50IG1lYXN1cmVtZW50IHRvIGV4ZWN1dGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCB3aW5kb3dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfYWxsb2NfaWQgPSB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFMTE9DIElEIHRvIHNjYW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHRvIHNjYW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSB7IC5uYW1lID0gInNlY29uZF9yYW5naW5nX3dpbmRvdyIsIC5kZXNjciA9ICJOb3QgY3VycmVudGx5IHN1cHBvcnRlZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBzZWNvbmRfcmFuZ2luZ193aW5kb3cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfd2luZG93X3R5cGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19hbGxvY19pZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X29udV9pZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3NlY29uZF9yYW5naW5nX3dpbmRvdyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAuZGVzY3IgPSAiVHlwZSBvZiBzaWxlbnQgbWVhc3VyZW1lbnQgdG8gZXhlY3V0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIHdpbmRvd190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFMTE9DIElEIHRvIHNjYW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHRvIHNjYW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAic2Vjb25kX3Jhbmdpbmdfd2luZG93IiwgLmRlc2NyID0gIk5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgc2Vjb25kX3Jhbmdpbmdfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSIsIC5kZXNjciA9ICJSb2d1ZSBEZXRlY3Rpb24gV2luZG93IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3dpbmRvd190eXBlID0geyAubmFtZSA9ICJ3aW5kb3dfdHlwZSIsIC5kZXNjciA9ICJTaWxlbnQgV2luZG93IG9yIEN1dCBvZmYgV2luZG93IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgd2luZG93X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX21lYXN1cmVtZW50X3N0YXR1cyA9IHsgLm5hbWUgPSAibWVhc3VyZW1lbnRfc3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyBvZiB0aGUgcm9ndWUgT05VIGRldGVjdGlvbiByZXN1bHQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9NRUFTVVJFTUVOVF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIG1lYXN1cmVtZW50X3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9hbGxvY19pZCA9IHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MtSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VLUlEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZGVsaW5lYXRpb24gPSB7IC5uYW1lID0gImlzX2RlbGluZWF0aW9uIiwgLmRlc2NyID0gIkJ1cnN0IERlbGluZWF0aW9uIGRldGVjdGVkIGR1cmluZyB0aGUgcm9ndWUgT05VIGRldGVjdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19kZWxpbmVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pc19lZCA9IHsgLm5hbWUgPSAiaXNfZWQiLCAuZGVzY3IgPSAiSXMgRUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9yeF9kYXRhID0geyAubmFtZSA9ICJyeF9kYXRhIiwgLmRlc2NyID0gIkNhcHR1cmVkIFBMT0FNdSBtZXNzYWdlIGlmIHRoZSBidXJzdCBkZWxpbmllYXRpb24gd2FzIGRldGVjdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcnhfZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3Bsb2FtX3JlY2VpdmVkX29udV9pZCA9IHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfb251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCByZWNlaXZlZCBpbiB0aGUgcGxvYW0iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGxvYW1fcmVjZWl2ZWRfb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3IgPSB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX2NyY19lcnJvciIsIC5kZXNjciA9ICJDcmMgZXJyb3IgaW4gdGhlIHJlY2VpdmVkIHBsb2FtIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9DUkNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHBsb2FtX3JlY2VpdmVkX2NyY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF93aW5kb3dfdHlwZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX21lYXN1cmVtZW50X3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2FsbG9jX2lkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfb251X2lkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZGVsaW5lYXRpb24sICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pc19lZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3J4X2RhdGEsICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wbG9hbV9yZWNlaXZlZF9vbnVfaWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3IgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLmRlc2NyID0gIlNpbGVudCBXaW5kb3cgb3IgQ3V0IG9mZiBXaW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCB3aW5kb3dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgfSwgeyAubmFtZSA9ICJtZWFzdXJlbWVudF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uIHJlc3VsdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBtZWFzdXJlbWVudF9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYy1JRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUtSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiaXNfZGVsaW5lYXRpb24iLCAuZGVzY3IgPSAiQnVyc3QgRGVsaW5lYXRpb24gZGV0ZWN0ZWQgZHVyaW5nIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIGlzX2RlbGluZWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiaXNfZWQiLCAuZGVzY3IgPSAiSXMgRUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJ4X2RhdGEiLCAuZGVzY3IgPSAiQ2FwdHVyZWQgUExPQU11IG1lc3NhZ2UgaWYgdGhlIGJ1cnN0IGRlbGluaWVhdGlvbiB3YXMgZGV0ZWN0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcnhfZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfb251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCByZWNlaXZlZCBpbiB0aGUgcGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBwbG9hbV9yZWNlaXZlZF9vbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfY3JjX2Vycm9yIiwgLmRlc2NyID0gIkNyYyBlcnJvciBpbiB0aGUgcmVjZWl2ZWQgcGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBwbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gdG9kX3JlcXVlc3QgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3RvZF9yZXF1ZXN0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSB0b2RfcmVxdWVzdF9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF90b2Rfc3RyaW5nID0geyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLmRlc2NyID0gInRvZF9zdHJpbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCB0b2Rfc3RyaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfc2ZjID0geyAubmFtZSA9ICJzZmMiLCAuZGVzY3IgPSAic2ZjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBzZmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcnRjX29mZnNldF9zZWMgPSB7IC5uYW1lID0gInJ0Y19vZmZzZXRfc2VjIiwgLmRlc2NyID0gInJ0Y19vZmZzZXRfc2VjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfU0VDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHJ0Y19vZmZzZXRfc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3J0Y19vZmZzZXRfbnNlYyA9IHsgLm5hbWUgPSAicnRjX29mZnNldF9uc2VjIiwgLmRlc2NyID0gInJ0Y19vZmZzZXRfbnNlYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX05TRUMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgcnRjX29mZnNldF9uc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF90b2Rfc3RyaW5nLCAmcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9zZmMsICZwcm9wX2Rlc2NyX2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3J0Y19vZmZzZXRfc2VjLCAmcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9ydGNfb2Zmc2V0X25zZWMsICZwcm9wX2Rlc2NyX2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLmRlc2NyID0gInRvZF9zdHJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHRvZF9zdHJpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfNjQgfSwgeyAubmFtZSA9ICJzZmMiLCAuZGVzY3IgPSAic2ZjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBzZmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicnRjX29mZnNldF9zZWMiLCAuZGVzY3IgPSAicnRjX29mZnNldF9zZWMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHJ0Y19vZmZzZXRfc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ0Y19vZmZzZXRfbnNlYyIsIC5kZXNjciA9ICJydGNfb2Zmc2V0X25zZWMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHJ0Y19vZmZzZXRfbnNlYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJUT0QgcmVxdWVzdCBjb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHByb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9vbnVfc3RhdGUgPSB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJvbnUgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9vbnVfbGlzdCA9IHsgLm5hbWUgPSAib251X2xpc3QiLCAuZGVzY3IgPSAib251IGxpc3QiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEsIG9udV9saXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX29udV9zdGF0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9vbnVfbGlzdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJvbnUgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZSB9LCB7IC5uYW1lID0gIm9udV9saXN0IiwgLmRlc2NyID0gIm9udSBsaXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEsIG9udV9saXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJwcm90ZWN0aW9uIHN3aXRjaGluZyB0eXBlIGMgc2V0IG11bHRpcGxlIG9udSBzdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gc3RhcnRfb251X3VwZ3JhZGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2xpc3Rfb2Zfb251X2lkcyA9IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VIElEcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhLCBsaXN0X29mX29udV9pZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfbGlzdF9vZl9vbnVfaWRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VIElEcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSwgbGlzdF9vZl9vbnVfaWRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSIsIC5kZXNjciA9ICJPTFQgdG8gT05VIGZpcm13YXJlIHRyYW5zZmVyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBvbnVfdXBncmFkZV9jb21wbGV0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiU3VjY2VzcyBvciBmYWlsdXJlLiAgQWdhaW5zdCBlbnRpcmUgdXBncmFkZSBwcm9jZXNzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMgPSB7IC5uYW1lID0gImxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VLUlEcyB0aGUgdXBncmFkZSBmYWlsZWQgZm9yLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSwgbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9saXN0X29mX2ZhaWxlZF9lbnRpdGllcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJTdWNjZXNzIG9yIGZhaWx1cmUuICBBZ2FpbnN0IGVudGlyZSB1cGdyYWRlIHByb2Nlc3MuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VLUlEcyB0aGUgdXBncmFkZSBmYWlsZWQgZm9yLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIiwgLmRlc2NyID0gIk9OVSBVcGdyYWRlIENvbXBsZXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0geyAubmFtZSA9ICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfY3B1X3BhY2tldHNfZmFpbHVyZSA9IHsgLm5hbWUgPSAiY3B1X3BhY2tldHNfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY3B1X3BhY2tldHNfZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBjcHVfcGFja2V0c19mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQgPSB7IC5uYW1lID0gImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQgPSB7IC5uYW1lID0gImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfbG9zID0geyAubmFtZSA9ICJsb3MiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxvc1wiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGxvcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfb251X2Rpc2NvdmVyZWQgPSB7IC5uYW1lID0gIm9udV9kaXNjb3ZlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGlzY292ZXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgb251X2Rpc2NvdmVyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX29udV91cGdyYWRlX2NvbXBsZXRlID0geyAubmFtZSA9ICJvbnVfdXBncmFkZV9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X3VwZ3JhZGVfY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIG9udV91cGdyYWRlX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCA9IHsgLm5hbWUgPSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zdGF0ZV9jaGFuZ2VfY29tcGxldGVkID0geyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAidG9kX3JlcXVlc3RfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0b2RfcmVxdWVzdF9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfY3B1X3BhY2tldHNfZmFpbHVyZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19lbmFibGVfYWxsX29udXNfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX2xvcywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19vbnVfZGlzY292ZXJlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19vbnVfdXBncmFkZV9jb21wbGV0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0LCAmcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImNwdV9wYWNrZXRzX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNwdV9wYWNrZXRzX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgY3B1X3BhY2tldHNfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxvcyIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibG9zXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGxvcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9kaXNjb3ZlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGlzY292ZXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfZGlzY292ZXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdXBncmFkZV9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRlX2NoYW5nZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidG9kX3JlcXVlc3RfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZ3Bvbl9vbnUgPT09PSAqLworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X29udV9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19vbnVfc3RhdGUgPSB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IE9OVSBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIG9udV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gIk9OVSBzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19wYXNzd29yZCA9IHsgLm5hbWUgPSAicGFzc3dvcmQiLCAuZGVzY3IgPSAiT05VIHBhc3N3b3JkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgcGFzc3dvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTAgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfYXV0b19wYXNzd29yZF9sZWFybmluZyA9IHsgLm5hbWUgPSAiYXV0b19wYXNzd29yZF9sZWFybmluZyIsIC5kZXNjciA9ICJFbmFibGVcXERpc2FibGUgYXV0b21hdGljIHBhc3N3b3JkIGxlYXJuaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX3VzX2ZlYyA9IHsgLm5hbWUgPSAidXNfZmVjIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSBVUyBGRUMgZm9yIE9OVSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCB1c19mZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfb21jaV9wb3J0X2lkID0geyAubmFtZSA9ICJvbWNpX3BvcnRfaWQiLCAuZGVzY3IgPSAiT01DSSBwb3J0IElEICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT01DSV9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBvbWNpX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2RzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwgPSB7IC5uYW1lID0gImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiLCAuZGVzY3IgPSAiRFMgQkVSIHJlcG9ydGluZyBpbnRlcnZhbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfYWVzX2VuY3J5cHRpb25fa2V5ID0geyAubmFtZSA9ICJhZXNfZW5jcnlwdGlvbl9rZXkiLCAuZGVzY3IgPSAiQUVTIGVuY3J5cHRpb24ga2V5LiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FFU19FTkNSWVBUSU9OX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYWVzX2VuY3J5cHRpb25fa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19hbGFybV9zdGF0ZSA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUgb2YgYWxsIE9OVSBhbGFybXMuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBhbGFybV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX3JhbmdpbmdfdGltZSA9IHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLmRlc2NyID0gIk9OVSByYW5naW5nIHRpbWUuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgcmFuZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkgPSB7IC5uYW1lID0gImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIsIC5kZXNjciA9ICJUaGlzIE9OVSB3YXMgZGlzYWJsZWQgYWZ0ZXIgU04gZGlzY292ZXJ5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2RlYWN0aXZhdGlvbl9yZWFzb24gPSB7IC5uYW1lID0gImRlYWN0aXZhdGlvbl9yZWFzb24iLCAuZGVzY3IgPSAiUmVhc29uIGZvciB0aGUgbGFzdCBPTlUgZGVhY3RpdmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGRlYWN0aXZhdGlvbl9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2FsbF9nZW1fcG9ydHMgPSB7IC5uYW1lID0gImFsbF9nZW1fcG9ydHMiLCAuZGVzY3IgPSAiQWxsIHVuaWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYWxsX2dlbV9wb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2FsbF9hbGxvY3MgPSB7IC5uYW1lID0gImFsbF9hbGxvY3MiLCAuZGVzY3IgPSAiQWxsIGFsbG9jIElEcyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBPTlUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGFsbF9hbGxvY3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX29udV9wc190eXBlX2MgPSB7IC5uYW1lID0gIm9udV9wc190eXBlX2MiLCAuZGVzY3IgPSAib251IHByb3RlY3Rpb24gc3dpdGNoaW5nIHR5cGUgYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1BTX1RZUEVfQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgb251X3BzX3R5cGVfYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19leHRlbmRlZF9ndWFyZF90aW1lID0geyAubmFtZSA9ICJleHRlbmRlZF9ndWFyZF90aW1lIiwgLmRlc2NyID0gIkFkZGl0aW9uYWwgZ3VhcmQgdGltZSAoaW4gYnl0ZXMpIGZvciB0aGlzIE9OVS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGV4dGVuZGVkX2d1YXJkX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX29udV9zdGF0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX3NlcmlhbF9udW1iZXIsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19wYXNzd29yZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2F1dG9fcGFzc3dvcmRfbGVhcm5pbmcsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ191c19mZWMsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19vbWNpX3BvcnRfaWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfYWVzX2VuY3J5cHRpb25fa2V5LCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfYWxhcm1fc3RhdGUsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19yYW5naW5nX3RpbWUsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnksICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19kZWFjdGl2YXRpb25fcmVhc29uLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfYWxsX2dlbV9wb3J0cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2FsbF9hbGxvY3MsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19vbnVfcHNfdHlwZV9jLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfZXh0ZW5kZWRfZ3VhcmRfdGltZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgT05VIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJPTlUgc2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0sIHsgLm5hbWUgPSAicGFzc3dvcmQiLCAuZGVzY3IgPSAiT05VIHBhc3N3b3JkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgcGFzc3dvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTAgfSwgeyAubmFtZSA9ICJhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSBhdXRvbWF0aWMgcGFzc3dvcmQgbGVhcm5pbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidXNfZmVjIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSBVUyBGRUMgZm9yIE9OVSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIHVzX2ZlYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9tY2lfcG9ydF9pZCIsIC5kZXNjciA9ICJPTUNJIHBvcnQgSUQgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgb21jaV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiLCAuZGVzY3IgPSAiRFMgQkVSIHJlcG9ydGluZyBpbnRlcnZhbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWVzX2VuY3J5cHRpb25fa2V5IiwgLmRlc2NyID0gIkFFUyBlbmNyeXB0aW9uIGtleS4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYWVzX2VuY3J5cHRpb25fa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSB9LCB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlN0YXRlIG9mIGFsbCBPTlUgYWxhcm1zLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYWxhcm1fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSB9LCB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJPTlUgcmFuZ2luZyB0aW1lLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgcmFuZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIsIC5kZXNjciA9ICJUaGlzIE9OVSB3YXMgZGlzYWJsZWQgYWZ0ZXIgU04gZGlzY292ZXJ5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0aW9uX3JlYXNvbiIsIC5kZXNjciA9ICJSZWFzb24gZm9yIHRoZSBsYXN0IE9OVSBkZWFjdGl2YXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBkZWFjdGl2YXRpb25fcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiB9LCB7IC5uYW1lID0gImFsbF9nZW1fcG9ydHMiLCAuZGVzY3IgPSAiQWxsIHVuaWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBhbGxfZ2VtX3BvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgfSwgeyAubmFtZSA9ICJhbGxfYWxsb2NzIiwgLmRlc2NyID0gIkFsbCBhbGxvYyBJRHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGFsbF9hbGxvY3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIH0sIHsgLm5hbWUgPSAib251X3BzX3R5cGVfYyIsIC5kZXNjciA9ICJvbnUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgdHlwZSBjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgb251X3BzX3R5cGVfYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImV4dGVuZGVkX2d1YXJkX3RpbWUiLCAuZGVzY3IgPSAiQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgZm9yIHRoaXMgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGV4dGVuZGVkX2d1YXJkX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9mZWNfY29kZXdvcmRzID0geyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLmRlc2NyID0gIlRvdGFsIHJlY2VpdmVkIEZFQyBjb2Rld29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2ZlY19ieXRlc19jb3JyZWN0ZWQgPSB7IC5uYW1lID0gImZlY19ieXRlc19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIGNvZGV3b3JkcyBjb3JyZWN0ZWQgYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQllURVNfQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgZmVjX2J5dGVzX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2ZlY19jb2Rld29yZHNfY29ycmVjdGVkID0geyAubmFtZSA9ICJmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCIsIC5kZXNjciA9ICJGRUMgY29ycmVjdGVkIGNvZGV3b3JkcyBlcnJvciAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX0NPUlJFQ1RFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHNfY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCA9IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCIsIC5kZXNjciA9ICJGRUMgbm90IGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2JpcDhfYnl0ZXMgPSB7IC5uYW1lID0gImJpcDhfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMgZm9yIEJJUDgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgYmlwOF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2JpcDhfZXJyb3JzID0geyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC5kZXNjciA9ICJCaXQgZXJyb3IgYWNjb3JkaW5nIHRvIEJJUDgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGJpcDhfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcnhfcGxvYW1zX2NyY19lcnJvciA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBQTE9BTXMgd2l0aCBDUkMgZXJyb3IiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcnhfcGxvYW1zX2NyY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLmRlc2NyID0gIlJlY2VpdmVkIG5vbiBpZGxlIFBMT0FNcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19ub25faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3Bvc2l0aXZlX2RyaWZ0ID0geyAubmFtZSA9ICJwb3NpdGl2ZV9kcmlmdCIsIC5kZXNjciA9ICJQb3NpdGl2ZSBkcmlmdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcG9zaXRpdmVfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9uZWdhdGl2ZV9kcmlmdCA9IHsgLm5hbWUgPSAibmVnYXRpdmVfZHJpZnQiLCAuZGVzY3IgPSAiTmVnYXRpdmUgZHJpZnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIG5lZ2F0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcnhfb21jaSA9IHsgLm5hbWUgPSAicnhfb21jaSIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcnhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3J4X29tY2lfcGFja2V0c19jcmNfZXJyb3IgPSB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfYmVyX3JlcG9ydGVkID0geyAubmFtZSA9ICJiZXJfcmVwb3J0ZWQiLCAuZGVzY3IgPSAiQkVSIHJlcG9ydGVkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQkVSX1JFUE9SVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgYmVyX3JlcG9ydGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfdW5yZWNlaXZlZF9idXJzdCA9IHsgLm5hbWUgPSAidW5yZWNlaXZlZF9idXJzdCIsIC5kZXNjciA9ICJVbnJlY2VpdmVkIGJ1cnN0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVU5SRUNFSVZFRF9CVVJTVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHVucmVjZWl2ZWRfYnVyc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9sY2RnX2Vycm9ycyA9IHsgLm5hbWUgPSAibGNkZ19lcnJvcnMiLCAuZGVzY3IgPSAiTENERyBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9MQ0RHX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGxjZGdfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcmRpX2Vycm9ycyA9IHsgLm5hbWUgPSAicmRpX2Vycm9ycyIsIC5kZXNjciA9ICJSREkgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUkRJX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJkaV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9ieXRlcyA9IHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAicnggYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcnhfcGFja2V0cyA9IHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC5kZXNjciA9ICJyeCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF90eF9ieXRlcyA9IHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAidHggYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHR4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfdHhfcGFja2V0cyA9IHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJ0eCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfZmVjX2NvZGV3b3JkcywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9mZWNfYnl0ZXNfY29ycmVjdGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2ZlY19jb2Rld29yZHNfY29ycmVjdGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2ZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfYmlwOF9ieXRlcywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9iaXA4X2Vycm9ycywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9wbG9hbXNfY3JjX2Vycm9yLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9wb3NpdGl2ZV9kcmlmdCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9uZWdhdGl2ZV9kcmlmdCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9vbWNpLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3J4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfYmVyX3JlcG9ydGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3VucmVjZWl2ZWRfYnVyc3QsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfbGNkZ19lcnJvcnMsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcmRpX2Vycm9ycywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9ieXRlcywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9wYWNrZXRzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3R4X2J5dGVzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3R4X3BhY2tldHMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLmRlc2NyID0gIlRvdGFsIHJlY2VpdmVkIEZFQyBjb2Rld29yZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfYnl0ZXNfY29ycmVjdGVkIiwgLmRlc2NyID0gIkZFQyBjb2Rld29yZHMgY29ycmVjdGVkIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19ieXRlc19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHNfY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIG5vdCBjb3JyZWN0ZWQgY29kZXdvcmRzIGVycm9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYmlwOF9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBieXRlcyBmb3IgQklQOCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBiaXA4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLmRlc2NyID0gIkJpdCBlcnJvciBhY2NvcmRpbmcgdG8gQklQOCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBiaXA4X2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIFBMT0FNcyB3aXRoIENSQyBlcnJvciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9wbG9hbXNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC5kZXNjciA9ICJSZWNlaXZlZCBub24gaWRsZSBQTE9BTXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcnhfcGxvYW1zX25vbl9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInBvc2l0aXZlX2RyaWZ0IiwgLmRlc2NyID0gIlBvc2l0aXZlIGRyaWZ0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHBvc2l0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IiwgLmRlc2NyID0gIk5lZ2F0aXZlIGRyaWZ0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIG5lZ2F0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X29tY2kiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYmVyX3JlcG9ydGVkIiwgLmRlc2NyID0gIkJFUiByZXBvcnRlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBiZXJfcmVwb3J0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5yZWNlaXZlZF9idXJzdCIsIC5kZXNjciA9ICJVbnJlY2VpdmVkIGJ1cnN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHVucmVjZWl2ZWRfYnVyc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibGNkZ19lcnJvcnMiLCAuZGVzY3IgPSAiTENERyBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgbGNkZ19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicmRpX2Vycm9ycyIsIC5kZXNjciA9ICJSREkgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJkaV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAicnggYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC5kZXNjciA9ICJyeCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAidHggYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJ0eCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBzZXRfb251X3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9vbnVfc3RhdGUgPSB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJPTlUgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3NldF9vbnVfc3RhdGVfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIk9OVSBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhIiwgLmRlc2NyID0gIlNldCBPTlUgU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSByc3NpX21lYXN1cmVtZW50ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGNoYW5nZV9wb3dlcl9sZXZlbCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9wb3dlcl9sZXZlbF9hY3Rpb24gPSB7IC5uYW1lID0gInBvd2VyX2xldmVsX2FjdGlvbiIsIC5kZXNjciA9ICJwb3dlciBsZXZlbCBhY3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMX0lEX1BPV0VSX0xFVkVMX0FDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSwgcG93ZXJfbGV2ZWxfYWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvd2VyX2xldmVsIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX3Bvd2VyX2xldmVsX2FjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxfYWN0aW9uIiwgLmRlc2NyID0gInBvd2VyIGxldmVsIGFjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEsIHBvd2VyX2xldmVsX2FjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9sZXZlbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEiLCAuZGVzY3IgPSAiQ2hhbmdlIFBvd2VyIExldmVsIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gb251X2FsYXJtICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfb251X2FsYXJtX29udV9hbGFybSA9IHsgLm5hbWUgPSAib251X2FsYXJtIiwgLmRlc2NyID0gIm9udSBhbGFybSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhLCBvbnVfYWxhcm0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9vbnVfYWxhcm1fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfYWxhcm1fb251X2FsYXJtIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAib251IGFsYXJtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSwgb251X2FsYXJtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSIsIC5kZXNjciA9ICJPTlUgQWxhcm0iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBkb3dpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfZG93aV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9kb3dpX2RyaWZ0X3ZhbHVlID0geyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC5kZXNjciA9ICJDYWxjdWxhdGVkIGFtb3VudCBvZiBkcmlmdCAocG9zaXRpdmUgKyBuZWdhdGl2ZSBhcyBhIHNpZ25lZCB2YWx1ZSkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhLCBkcmlmdF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2Rvd2lfbmV3X2VxZCA9IHsgLm5hbWUgPSAibmV3X2VxZCIsIC5kZXNjciA9ICJOZXcgRVFEIGFmdGVyIGRyaWZ0IGlzIGNvcnJlY3RlZCAob25seSB2YWxpZCBpZiBzdGF0dXMgaXMgJ29uJykuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0RPV0lfSURfTkVXX0VRRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEsIG5ld19lcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfZG93aV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2Rvd2lfYWxhcm1fc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9kb3dpX2RyaWZ0X3ZhbHVlLCAmcHJvcF9kZXNjcl9ncG9uX29udV9kb3dpX25ld19lcWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRyaWZ0X3ZhbHVlIiwgLmRlc2NyID0gIkNhbGN1bGF0ZWQgYW1vdW50IG9mIGRyaWZ0IChwb3NpdGl2ZSArIG5lZ2F0aXZlIGFzIGEgc2lnbmVkIHZhbHVlKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSwgZHJpZnRfdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfSwgeyAubmFtZSA9ICJuZXdfZXFkIiwgLmRlc2NyID0gIk5ldyBFUUQgYWZ0ZXIgZHJpZnQgaXMgY29ycmVjdGVkIChvbmx5IHZhbGlkIGlmIHN0YXR1cyBpcyAnb24nKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSwgbmV3X2VxZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEiLCAuZGVzY3IgPSAiRHJpZnQgb2YgV2luZG93IG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBzZmkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zZmlfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3NmaV9iZXIgPSB7IC5uYW1lID0gImJlciIsIC5kZXNjciA9ICJJbnZlcnNlIGJpdCBlcnJvciByYXRlIChlLmcuIGlmIHRoaXMgbnVtYmVyIGlzIDEwMDAsIHRoZSBCRVIgaXMgMS8xMDAwKS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0JFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSwgYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3NmaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3NmaV9hbGFybV9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3NmaV9iZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJiZXIiLCAuZGVzY3IgPSAiSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSwgYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NmaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEiLCAuZGVzY3IgPSAiU2lnbmFsIEZhaWwgb2YgT05VaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHNkaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3NkaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc2RpX2JlciA9IHsgLm5hbWUgPSAiYmVyIiwgLmRlc2NyID0gIkludmVyc2UgYml0IGVycm9yIHJhdGUgKGUuZy4gaWYgdGhpcyBudW1iZXIgaXMgMTAwMCwgdGhlIEJFUiBpcyAxLzEwMDApLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TRElfSURfQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NkaV9kYXRhLCBiZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfc2RpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc2RpX2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc2RpX2JlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImJlciIsIC5kZXNjciA9ICJJbnZlcnNlIGJpdCBlcnJvciByYXRlIChlLmcuIGlmIHRoaXMgbnVtYmVyIGlzIDEwMDAsIHRoZSBCRVIgaXMgMS8xMDAwKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NkaV9kYXRhLCBiZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSIsIC5kZXNjciA9ICJTaWduYWwgRGVncmFkZWQgb2YgT05VaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGRmaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2RmaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfZGZpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfZGZpX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RmaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEiLCAuZGVzY3IgPSAiUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBzdWZpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3VmaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9zdWZpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3VmaV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSIsIC5kZXNjciA9ICJTVUZpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gbG9haSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2xvYWlfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0xPQUlfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfbG9haV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2xvYWlfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEiLCAuZGVzY3IgPSAiTE9BaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGRnaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2RnaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfZGdpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfZGdpX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RnaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEiLCAuZGVzY3IgPSAiUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBwZWUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wZWVfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BFRV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3BlZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3BlZV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3BlZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3BlZV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wZWVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3BlZV9kYXRhIiwgLmRlc2NyID0gIlBFRSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHBzdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3BzdF9saW5rX251bWJlciA9IHsgLm5hbWUgPSAibGlua19udW1iZXIiLCAuZGVzY3IgPSAibGluayBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0xJTktfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3BzdF9kYXRhLCBsaW5rX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wc3RfazEgPSB7IC5uYW1lID0gImsxIiwgLmRlc2NyID0gIksxIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSwgazEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wc3RfazIgPSB7IC5uYW1lID0gImsyIiwgLmRlc2NyID0gIksyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSwgazIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9wc3RfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9wc3RfbGlua19udW1iZXIsICZwcm9wX2Rlc2NyX2dwb25fb251X3BzdF9rMSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcHN0X2syIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wc3RfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5rX251bWJlciIsIC5kZXNjciA9ICJsaW5rIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEsIGxpbmtfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImsxIiwgLmRlc2NyID0gIksxIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSwgazEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJrMiIsIC5kZXNjciA9ICJLMiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEsIGsyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSIsIC5kZXNjciA9ICJQU1QiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSB0aXdpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfdGl3aV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV90aXdpX2RyaWZ0X3ZhbHVlID0geyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC5kZXNjciA9ICJDYWxjdWxhdGVkIGFtb3VudCBvZiBkcmlmdCAocG9zaXRpdmUgKyBuZWdhdGl2ZSBhcyBhIHNpZ25lZCB2YWx1ZSkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhLCBkcmlmdF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3Rpd2lfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV90aXdpX2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfdGl3aV9kcmlmdF92YWx1ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAuZGVzY3IgPSAiQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhLCBkcmlmdF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSIsIC5kZXNjciA9ICJUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBsb2tpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfbG9raV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9sb2tpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfbG9raV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2xva2lfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSIsIC5kZXNjciA9ICJMT2tpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gbWVtaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X21lbWlfcGxvYW1fYnVmZmVyID0geyAubmFtZSA9ICJwbG9hbV9idWZmZXIiLCAuZGVzY3IgPSAiUExPQU0gYnVmZmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX01FTUlfSURfUExPQU1fQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSwgcGxvYW1fYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfbWVtaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X21lbWlfcGxvYW1fYnVmZmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicGxvYW1fYnVmZmVyIiwgLmRlc2NyID0gIlBMT0FNIGJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhLCBwbG9hbV9idWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEiLCAuZGVzY3IgPSAiTUVNaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIG9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9nZW1fcG9ydCA9IHsgLm5hbWUgPSAiZ2VtX3BvcnQiLCAuZGVzY3IgPSAiR0VNIFBvcnQgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0dFTV9QT1JULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBnZW1fcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9vcGVyYXRpb24gPSB7IC5uYW1lID0gIm9wZXJhdGlvbiIsIC5kZXNjciA9ICJPcGVyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX09QRVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgb3BlcmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9nZW1fcG9ydCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZ2VtX3BvcnQiLCAuZGVzY3IgPSAiR0VNIFBvcnQgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBnZW1fcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAib3BlcmF0aW9uIiwgLmRlc2NyID0gIk9wZXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG9wZXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIk9NQ0kgUE9SVCBJRCBDb25maWd1cmF0aW9uIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9iZXJfaW50ZXJ2YWwgPSB7IC5uYW1lID0gImJlcl9pbnRlcnZhbCIsIC5kZXNjciA9ICJCRVIgaW50ZXJ2YWwgaW4gbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0JFUl9JTlRFUlZBTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgYmVyX2ludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9yZXN1bHQgPSB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1JFU1VMVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2Jlcl9pbnRlcnZhbCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYmVyX2ludGVydmFsIiwgLmRlc2NyID0gIkJFUiBpbnRlcnZhbCBpbiBtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIGJlcl9pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJCRVIgSW50ZXJ2YWwgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBlcnIgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9lcnJfYmlwOF9lcnJvcnMgPSB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLmRlc2NyID0gIkJJUDggZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0VSUl9JRF9CSVA4X0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSwgYmlwOF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9lcnJfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9lcnJfYmlwOF9lcnJvcnMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Vycl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLmRlc2NyID0gIkJJUDggZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSwgYmlwOF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcnJfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2Vycl9kYXRhIiwgLmRlc2NyID0gIkVSUiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHJlaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3JlaV9iaXA4X2Vycm9ycyA9IHsgLm5hbWUgPSAiYmlwOF9lcnJvcnMiLCAuZGVzY3IgPSAiQklQOCBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUkVJX0lEX0JJUDhfRVJST1JTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JlaV9kYXRhLCBiaXA4X2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9yZWlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9yZWlfYmlwOF9lcnJvcnMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3JlaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLmRlc2NyID0gIkJJUDggZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YSwgYmlwOF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9yZWlfZGF0YSIsIC5kZXNjciA9ICJSRUkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSByYW5naW5nX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX251bWJlcl9vZl9wbG9hbXMgPSB7IC5uYW1lID0gIm51bWJlcl9vZl9wbG9hbXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIFBMT0FNcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfUExPQU1TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIG51bWJlcl9vZl9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9lcWQgPSB7IC5uYW1lID0gImVxZCIsIC5kZXNjciA9ICJFUUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGVxZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9wb3dlcl9sZXZlbCA9IHsgLm5hbWUgPSAicG93ZXJfbGV2ZWwiLCAuZGVzY3IgPSAiUG93ZXIgTGV2ZWwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfUE9XRVJfTEVWRUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgcG93ZXJfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZmFpbF9yZWFzb24sICZwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX251bWJlcl9vZl9wbG9hbXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2VxZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcG93ZXJfbGV2ZWwgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wbG9hbXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIFBMT0FNcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgbnVtYmVyX29mX3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImVxZCIsIC5kZXNjciA9ICJFUUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGVxZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbCIsIC5kZXNjciA9ICJQb3dlciBMZXZlbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgcG93ZXJfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJSYW5naW5nIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfcGFzc3dvcmQgPSB7IC5uYW1lID0gInBhc3N3b3JkIiwgLmRlc2NyID0gInBhc3N3b3JkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9QQVNTV09SRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGFzc3dvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTAgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZmFpbF9yZWFzb24sICZwcm9wX2Rlc2NyX2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9wYXNzd29yZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiB9LCB7IC5uYW1lID0gInBhc3N3b3JkIiwgLmRlc2NyID0gInBhc3N3b3JkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGFzc3dvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgQWN0aXZhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiT05VIERlYWN0aXZhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBvbnVfZW5hYmxlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX3NlcmlhbF9udW1iZXIgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgRW5hYmxlIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIG9udV9kaXNhYmxlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX3NlcmlhbF9udW1iZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgRGlzYWJsZSBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBpbnZhbGlkX2RicnVfcmVwb3J0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9hbGxvY19pZCA9IHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MtSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2FsbG9jX2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MtSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIiwgLmRlc2NyID0gIkludmFsaWQgREJSdSBSZXBvcnQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2VfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9uZXdfa2V5ID0geyAubmFtZSA9ICJuZXdfa2V5IiwgLmRlc2NyID0gIm5ldyBrZXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSwgbmV3X2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9uZXdfa2V5IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X2tleSIsIC5kZXNjciA9ICJuZXcga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEsIG5ld19rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIktleSBFeGNoYW5nZSBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fb251IC0ga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2V4cGVjdGVkX2tleSA9IHsgLm5hbWUgPSAiZXhwZWN0ZWRfa2V5IiwgLmRlc2NyID0gImV4cGVjdGVkIGtleSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEsIGV4cGVjdGVkX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX3JlY2VpdmVkX2tleSA9IHsgLm5hbWUgPSAicmVjZWl2ZWRfa2V5IiwgLmRlc2NyID0gInJlY2VpdmVkIGtleSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX1JFQ0VJVkVEX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEsIHJlY2VpdmVkX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9leHBlY3RlZF9rZXksICZwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfcmVjZWl2ZWRfa2V5IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXhwZWN0ZWRfa2V5IiwgLmRlc2NyID0gImV4cGVjdGVkIGtleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhLCBleHBlY3RlZF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0sIHsgLm5hbWUgPSAicmVjZWl2ZWRfa2V5IiwgLmRlc2NyID0gInJlY2VpdmVkIGtleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhLCByZWNlaXZlZF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhIiwgLmRlc2NyID0gIktleSBFeGNoYW5nZSBLZXkgTWlzbWF0Y2giLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2V4cGVjdGVkX2luZGV4ID0geyAubmFtZSA9ICJleHBlY3RlZF9pbmRleCIsIC5kZXNjciA9ICJleHBlY3RlZCBpbmRleCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9FWFBFQ1RFRF9JTkRFWCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhLCBleHBlY3RlZF9pbmRleCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9hY3R1YWxfaW5kZXggPSB7IC5uYW1lID0gImFjdHVhbF9pbmRleCIsIC5kZXNjciA9ICJhY3R1YWwgaW5kZXgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfQUNUVUFMX0lOREVYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEsIGFjdHVhbF9pbmRleCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2V4cGVjdGVkX2luZGV4LCAmcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9hY3R1YWxfaW5kZXggfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXhwZWN0ZWRfaW5kZXgiLCAuZGVzY3IgPSAiZXhwZWN0ZWQgaW5kZXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEsIGV4cGVjdGVkX2luZGV4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImFjdHVhbF9pbmRleCIsIC5kZXNjciA9ICJhY3R1YWwgaW5kZXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEsIGFjdHVhbF9pbmRleCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgVW5jb25zZWN1dGl2ZSBJbmRleCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfbmV3X2tleSA9IHsgLm5hbWUgPSAibmV3X2tleSIsIC5kZXNjciA9ICJuZXcga2V5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEX0lEX05FV19LRVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSwgbmV3X2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX25ld19rZXkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X2tleSIsIC5kZXNjciA9ICJuZXcga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhLCBuZXdfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhIiwgLmRlc2NyID0gIktleSBFeGNoYW5nZSBEZWNyeXB0IFJlcXVpcmVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gb3B0aWNhbF9yZWZsZWN0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gY3B1X3BhY2tldHMgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0c19wYWNrZXRfdHlwZSA9IHsgLm5hbWUgPSAicGFja2V0X3R5cGUiLCAuZGVzY3IgPSAicGFja2V0IHR5cGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX2NhbGNfY3JjID0geyAubmFtZSA9ICJjYWxjX2NyYyIsIC5kZXNjciA9ICJjYWxjIGNyYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX251bWJlcl9vZl9wYWNrZXRzID0geyAubmFtZSA9ICJudW1iZXJfb2ZfcGFja2V0cyIsIC5kZXNjciA9ICJudW1iZXIgb2YgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBudW1iZXJfb2ZfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX3BhY2tldF9zaXplID0geyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJTaW5nbGUgcGFja2V0IHNpemUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfYnVmZmVyID0geyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2NwdV9wYWNrZXRzX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfcGFja2V0X3R5cGUsICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX2NhbGNfY3JjLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0c19udW1iZXJfb2ZfcGFja2V0cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfcGFja2V0X3NpemUsICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC5kZXNjciA9ICJwYWNrZXQgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSB9LCB7IC5uYW1lID0gImNhbGNfY3JjIiwgLmRlc2NyID0gImNhbGMgY3JjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wYWNrZXRzIiwgLmRlc2NyID0gIm51bWJlciBvZiBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBudW1iZXJfb2ZfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gIlNpbmdsZSBwYWNrZXQgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSIsIC5kZXNjciA9ICJHUE9OIENQVSBQYWNrZXRzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gcGxvYW1fcGFja2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Bsb2FtID0geyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEsIHBsb2FtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Bsb2FtIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEsIHBsb2FtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSIsIC5kZXNjciA9ICJQTE9BTSBQYWNrZXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBjcHVfcGFja2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldF9wb3J0X2lkID0geyAubmFtZSA9ICJwb3J0X2lkIiwgLmRlc2NyID0gInBvcnRfaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0X2NyY19vayA9IHsgLm5hbWUgPSAiY3JjX29rIiwgLmRlc2NyID0gImNyY19vayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIGNyY19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRfcGFja2V0X3NpemUgPSB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gInBhY2tldF9zaXplIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfUEFDS0VUX1NJWkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0X2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX0JVRkZFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfY3B1X3BhY2tldF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRfcG9ydF9pZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldF9jcmNfb2ssICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRfcGFja2V0X3NpemUsICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRfYnVmZmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9ydF9pZCIsIC5kZXNjciA9ICJwb3J0X2lkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIHBvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiY3JjX29rIiwgLmRlc2NyID0gImNyY19vayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBjcmNfb2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJwYWNrZXRfc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIiwgLmRlc2NyID0gIkluZGljYXRlcyBDUFUgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIG9tY2lfcGFja2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfcG9ydF9pZCA9IHsgLm5hbWUgPSAicG9ydF9pZCIsIC5kZXNjciA9ICJwb3J0X2lkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9jcmNfb2sgPSB7IC5uYW1lID0gImNyY19vayIsIC5kZXNjciA9ICJjcmNfb2siLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGNyY19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcGFja2V0X3BhY2tldF9zaXplID0geyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJwYWNrZXRfc2l6ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9idWZmZXIgPSB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJidWZmZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb21jaV9wYWNrZXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9wb3J0X2lkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9jcmNfb2ssICZwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcGFja2V0X3BhY2tldF9zaXplLCAmcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9idWZmZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9ydF9pZCIsIC5kZXNjciA9ICJwb3J0X2lkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBwb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImNyY19vayIsIC5kZXNjciA9ICJjcmNfb2siLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGNyY19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gInBhY2tldF9zaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIiwgLmRlc2NyID0gIkluZGljYXRlcyBPTUNJIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24gdGhlIFVTIGZyb20gdGhpcyBPTlUgaWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX3Jlc3VsdCA9IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gInJlc3VsdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gInJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAib251IGFjdGl2YXRpb24gc3RhbmRieSBjb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX29sZF9zdGF0ZSA9IHsgLm5hbWUgPSAib2xkX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIHdhcyBwcmV2aW91c2x5IGluLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgb2xkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfbmV3X3N0YXRlID0geyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIHRoZSBPTlUgaXMgY3VycmVudGx5IGluLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcmVhc29uID0geyAubmFtZSA9ICJyZWFzb24iLCAuZGVzY3IgPSAiVGhlIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIHJlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX29sZF9zdGF0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfbmV3X3N0YXRlLCAmcHJvcF9kZXNjcl9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib2xkX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIHdhcyBwcmV2aW91c2x5IGluLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgb2xkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIGlzIGN1cnJlbnRseSBpbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9LCB7IC5uYW1lID0gInJlYXNvbiIsIC5kZXNjciA9ICJUaGUgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIiwgLmRlc2NyID0gIk5vdGlmaWNhdGlvbiB0aGF0IGFuIE9OVXMgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZSBoYXMgY2hhbmdlZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBwb3NzaWJsZV9kcmlmdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZXN0aW1hdGVkX2RyaWZ0ID0geyAubmFtZSA9ICJlc3RpbWF0ZWRfZHJpZnQiLCAuZGVzY3IgPSAiSWYgc3RhdHVzIGlzIG9uLCB0aGUgZXN0aW1hdGVkIGRyaWZ0IHZhbHVlLCBvdGhlcndpc2UgemVybyAoMCkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhLCBlc3RpbWF0ZWRfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9wb3NzaWJsZV9kcmlmdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZXN0aW1hdGVkX2RyaWZ0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImVzdGltYXRlZF9kcmlmdCIsIC5kZXNjciA9ICJJZiBzdGF0dXMgaXMgb24sIHRoZSBlc3RpbWF0ZWQgZHJpZnQgdmFsdWUsIG90aGVyd2lzZSB6ZXJvICgwKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEsIGVzdGltYXRlZF9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhIiwgLmRlc2NyID0gIkFuIE9OVSBpbiBhIGxvdyBwb3dlciBzdGF0ZSBtYXkgYmUgZXhwZXJpZW5jaW5nIGRyaWZ0IGJleW9uZCB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQuIFRoZSBlc3RpbWF0ZSBtYXkgYmUgaW5hY2N1cmF0ZSBkZXBlbmRpbmcgb24gT05VIGJlaGF2aW9yLiBBY3R1YWwgZHJpZnQgbWF5IGJlIGxlc3MgdGhhbiBlc3RpbWF0ZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19kZmkgPSB7IC5uYW1lID0gImRmaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGZpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19kZ2kgPSB7IC5uYW1lID0gImRnaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGdpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkZ2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19kb3dpID0geyAubmFtZSA9ICJkb3dpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkb3dpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZG93aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2VyciA9IHsgLm5hbWUgPSAiZXJyIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJlcnJcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfRVJSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGVyciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2ludmFsaWRfZGJydV9yZXBvcnQgPSB7IC5uYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImludmFsaWRfZGJydV9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBpbnZhbGlkX2RicnVfcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4ID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19sb2FpID0geyAubmFtZSA9ICJsb2FpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsb2FpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgbG9haSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2xva2kgPSB7IC5uYW1lID0gImxva2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxva2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTE9LSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBsb2tpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfbWVtaSA9IHsgLm5hbWUgPSAibWVtaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibWVtaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9NRU1JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG1lbWkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2FjdGl2YXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2FsYXJtID0geyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hbGFybVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUxBUk0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2FsYXJtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29udV9kaXNhYmxlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X2Rpc2FibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGlzYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9kaXNhYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29udV9lbmFibGVfY29tcGxldGVkID0geyAubmFtZSA9ICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2VuYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2VuYWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vcHRpY2FsX3JlZmxlY3Rpb24gPSB7IC5uYW1lID0gIm9wdGljYWxfcmVmbGVjdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib3B0aWNhbF9yZWZsZWN0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvcHRpY2FsX3JlZmxlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wZWUgPSB7IC5uYW1lID0gInBlZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicGVlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BFRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwZWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wb3NzaWJsZV9kcmlmdCA9IHsgLm5hbWUgPSAicG9zc2libGVfZHJpZnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBvc3NpYmxlX2RyaWZ0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvc3NpYmxlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UgPSB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3BzdCA9IHsgLm5hbWUgPSAicHN0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwc3RcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUFNULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3JhbmdpbmdfY29tcGxldGVkID0geyAubmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmFuZ2luZ19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUkFOR0lOR19DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcmFuZ2luZ19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19yZWkgPSB7IC5uYW1lID0gInJlaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCByZWkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc2RpID0geyAubmFtZSA9ICJzZGkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNkaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TREksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc2RpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc2ZpID0geyAubmFtZSA9ICJzZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNmaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TRkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc2ZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3N1ZmkgPSB7IC5uYW1lID0gInN1ZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN1ZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdWZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfdGl3aSA9IHsgLm5hbWUgPSAidGl3aSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidGl3aVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9USVdJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHRpd2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfZGZpLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19kZ2ksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2Rvd2ksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2VyciwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfaW52YWxpZF9kYnJ1X3JlcG9ydCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2xvYWksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2xva2ksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX21lbWksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2FsYXJtLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2Rpc2FibGVfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfZW5hYmxlX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb3B0aWNhbF9yZWZsZWN0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3BlZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcG9zc2libGVfZHJpZnQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wc3QsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3JhbmdpbmdfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19yZWksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19zZGksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3NmaSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc3VmaSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfdGl3aSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZGZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGRmaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRnaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGdpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkZ2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkb3dpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkb3dpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkb3dpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZXJyIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJlcnJcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGVyciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImludmFsaWRfZGJydV9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGludmFsaWRfZGJydV9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsb2FpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsb2FpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBsb2FpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibG9raSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibG9raVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgbG9raSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1lbWkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1lbWlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG1lbWkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hbGFybVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2FsYXJtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2Rpc2FibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2VuYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9lbmFibGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib3B0aWNhbF9yZWZsZWN0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvcHRpY2FsX3JlZmxlY3Rpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9wdGljYWxfcmVmbGVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwZWUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBlZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcGVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicG9zc2libGVfZHJpZnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBvc3NpYmxlX2RyaWZ0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3NzaWJsZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwc3QiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBzdFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcHN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJhbmdpbmdfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCByYW5naW5nX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJlaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCByZWkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic2RpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZGlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHNkaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNmaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2ZpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN1ZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN1ZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN1ZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0aXdpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCB0aXdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25fdHJ4ID09PT0gKi8KKworLyogR3JvdXA6IGdwb25fdHJ4IC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl90cnhfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl90cnhfa2V5X3Bvbl9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl90cnhfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fdHJ4X2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX3RyeCAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ190cmFuc2NlaXZlcl90eXBlID0geyAubmFtZSA9ICJ0cmFuc2NlaXZlcl90eXBlIiwgLmRlc2NyID0gInRyYW5zY2VpdmVyIHR5cGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHRyYW5zY2VpdmVyX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19sYV9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJsYV9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIkxBIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX0NPTkZJR1VSQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHIgPSB7IC5uYW1lID0gImJjZHIiLCAuZGVzY3IgPSAiQkNEUiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgYmNkciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyA9IHsgLm5hbWUgPSAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMiLCAuZGVzY3IgPSAiTEEgcmFuZ2luZyBhZnRlciBubyBlZCByZXN5bmMgIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jID0geyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jIiwgLmRlc2NyID0gInVzZWQgaW4gcmFuZ2luZyBtb2RlIGFmdGVyIG5vIGVkIGZvdW5kIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMgPSB7IC5uYW1lID0gImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIiwgLmRlc2NyID0gIkxBIHJhbmdpbmcgYWZ0ZXIgZWQgcmVzeW5jICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyA9IHsgLm5hbWUgPSAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyIsIC5kZXNjciA9ICJCQ0RSIHJhbmdpbmcgYWZ0ZXIgZWQgcmVzeW5jIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfcmVzeW5jX3BvbGFyaXR5ID0geyAubmFtZSA9ICJsYV9yZXN5bmNfcG9sYXJpdHkiLCAuZGVzY3IgPSAibGEgcmVzeW5jIHBvbGFyaXR5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX3Jlc3luY19wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BvbGFyaXR5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHJfcmVzeW5jX3BvbGFyaXR5ID0geyAubmFtZSA9ICJiY2RyX3Jlc3luY19wb2xhcml0eSIsIC5kZXNjciA9ICJCQ0RSIHJlc3luYyBwb2xhcml0eSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHJfcmVzeW5jX3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9sYXJpdHkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zID0geyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiLCAuZGVzY3IgPSAiYmNkciByYW5naW5nIHJlc3luYyBjb25kaXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyA9IHsgLm5hbWUgPSAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyIsIC5kZXNjciA9ICJsYSByYW5naW5nIHJlc3luYyBjb25kaXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19yeF9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJyeF9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIlJYIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JYX0NPTkZJR1VSQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHJ4X2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJyYW5naW5nIGNvbnRyb2wgc3RhZ2VzIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfQ09OVFJPTF9TVEFHRVNfQ09ORklHVVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfZW5lcmd5X2RldGVjdCA9IHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdCIsIC5kZXNjciA9ICJFbmVyZ3kgRGV0ZWN0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkVSR1lfREVURUNULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBlbmVyZ3lfZGV0ZWN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiA9IHsgLm5hbWUgPSAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiIsIC5kZXNjciA9ICJlbmQgb2YgYnVyc3QgZGF0YSBwYXR0ZXJuICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2VuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4gPSB7IC5uYW1lID0gImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4iLCAuZGVzY3IgPSAiZW5kIG9mIGJ1cnN0IHJhbmdpbmcgcGF0dGVybiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3ByZWFtYmxlID0geyAubmFtZSA9ICJwcmVhbWJsZSIsIC5kZXNjciA9ICJQcmVhbWJsZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHByZWFtYmxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3ByZWFtYmxlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2RlbGltaXRlciA9IHsgLm5hbWUgPSAiZGVsaW1pdGVyIiwgLmRlc2NyID0gIkRlbGltaXRlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBkZWxpbWl0ZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfZGVsaW1pdGVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2d1YXJkX2JpdHMgPSB7IC5uYW1lID0gImd1YXJkX2JpdHMiLCAuZGVzY3IgPSAiR3VhcmQgYml0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfR1VBUkRfQklUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZ3VhcmRfYml0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfc2VyZGVzX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gInNlcmRlc19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gInNlcmRlcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19wbG9fcmFuZ2luZyA9IHsgLm5hbWUgPSAicGxvX3JhbmdpbmciLCAuZGVzY3IgPSAiUExPIGZvciByYW5naW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19SQU5HSU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBwbG9fcmFuZ2luZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcGxvX2RhdGEgPSB7IC5uYW1lID0gInBsb19kYXRhIiwgLmRlc2NyID0gIlBMTyBmb3IgZGF0YSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fREFUQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcGxvX2RhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3Jzc2lfbm9ybWFsX2NvbmZpZyA9IHsgLm5hbWUgPSAicnNzaV9ub3JtYWxfY29uZmlnIiwgLmRlc2NyID0gInJzc2kgbm9ybWFsIGNvbmZpZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCByc3NpX25vcm1hbF9jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3JhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCA9IHsgLm5hbWUgPSAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sIiwgLmRlc2NyID0gInJhbmdpbmcgcnNzaSByZXN5bmMgY29udHJvbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCByYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fdHJ4X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ190cmFuc2NlaXZlcl90eXBlLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfY29uZmlndXJhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHIsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19sYV9yZXN5bmNfcG9sYXJpdHksICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19iY2RyX3Jlc3luY19wb2xhcml0eSwgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2xhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19yeF9jb25maWd1cmF0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfZW5lcmd5X2RldGVjdCwgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2VuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4sICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcHJlYW1ibGUsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19kZWxpbWl0ZXIsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19ndWFyZF9iaXRzLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfc2VyZGVzX2NvbmZpZ3VyYXRpb24sICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19wbG9fcmFuZ2luZywgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3Bsb19kYXRhLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcnNzaV9ub3JtYWxfY29uZmlnLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0cmFuc2NlaXZlcl90eXBlIiwgLmRlc2NyID0gInRyYW5zY2VpdmVyIHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCB0cmFuc2NlaXZlcl90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3R5cGUgfSwgeyAubmFtZSA9ICJsYV9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIkxBIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBsYV9jb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gImJjZHIiLCAuZGVzY3IgPSAiQkNEUiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyIsIC5kZXNjciA9ICJMQSByYW5naW5nIGFmdGVyIG5vIGVkIHJlc3luYyAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH0sIHsgLm5hbWUgPSAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyIsIC5kZXNjciA9ICJ1c2VkIGluIHJhbmdpbmcgbW9kZSBhZnRlciBubyBlZCBmb3VuZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9LCB7IC5uYW1lID0gImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIiwgLmRlc2NyID0gIkxBIHJhbmdpbmcgYWZ0ZXIgZWQgcmVzeW5jICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIiwgLmRlc2NyID0gIkJDRFIgcmFuZ2luZyBhZnRlciBlZCByZXN5bmMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJsYV9yZXN5bmNfcG9sYXJpdHkiLCAuZGVzY3IgPSAibGEgcmVzeW5jIHBvbGFyaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgbGFfcmVzeW5jX3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9sYXJpdHkgfSwgeyAubmFtZSA9ICJiY2RyX3Jlc3luY19wb2xhcml0eSIsIC5kZXNjciA9ICJCQ0RSIHJlc3luYyBwb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHJfcmVzeW5jX3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9sYXJpdHkgfSwgeyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiLCAuZGVzY3IgPSAiYmNkciByYW5naW5nIHJlc3luYyBjb25kaXRpb25zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB9LCB7IC5uYW1lID0gImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiLCAuZGVzY3IgPSAibGEgcmFuZ2luZyByZXN5bmMgY29uZGl0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIH0sIHsgLm5hbWUgPSAicnhfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJSWCBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcnhfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gInJhbmdpbmcgY29udHJvbCBzdGFnZXMgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdCIsIC5kZXNjciA9ICJFbmVyZ3kgRGV0ZWN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZW5lcmd5X2RldGVjdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IH0sIHsgLm5hbWUgPSAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiIsIC5kZXNjciA9ICJlbmQgb2YgYnVyc3QgZGF0YSBwYXR0ZXJuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9LCB7IC5uYW1lID0gImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4iLCAuZGVzY3IgPSAiZW5kIG9mIGJ1cnN0IHJhbmdpbmcgcGF0dGVybiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9LCB7IC5uYW1lID0gInByZWFtYmxlIiwgLmRlc2NyID0gIlByZWFtYmxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcHJlYW1ibGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcHJlYW1ibGUgfSwgeyAubmFtZSA9ICJkZWxpbWl0ZXIiLCAuZGVzY3IgPSAiRGVsaW1pdGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZGVsaW1pdGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2RlbGltaXRlciB9LCB7IC5uYW1lID0gImd1YXJkX2JpdHMiLCAuZGVzY3IgPSAiR3VhcmQgYml0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGd1YXJkX2JpdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic2VyZGVzX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAic2VyZGVzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBzZXJkZXNfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAicGxvX3JhbmdpbmciLCAuZGVzY3IgPSAiUExPIGZvciByYW5naW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcGxvX3JhbmdpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicGxvX2RhdGEiLCAuZGVzY3IgPSAiUExPIGZvciBkYXRhIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcGxvX2RhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicnNzaV9ub3JtYWxfY29uZmlnIiwgLmRlc2NyID0gInJzc2kgbm9ybWFsIGNvbmZpZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHJzc2lfbm9ybWFsX2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJyYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wiLCAuZGVzY3IgPSAicmFuZ2luZyByc3NpIHJlc3luYyBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBsb2dfZW50cnkgPT09PSAqLworCisvKiBHcm91cDogbG9nX2VudHJ5IC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2tleV9sb2dfaWQgPSB7IC5uYW1lID0gImxvZ19pZCIsIC5kZXNjciA9ICJsb2cgaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2tleSwgbG9nX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9rZXlfcmVzZXJ2ZWQgPSB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gInJlc2VydmVkIiwgLmFjY2VzcyA9IDAsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2tleV9uYW1lID0geyAubmFtZSA9ICJuYW1lIiwgLmRlc2NyID0gIm5hbWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9rZXksIG5hbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgbG9nX2VudHJ5X2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9rZXlfbG9nX2lkLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfa2V5X3Jlc2VydmVkLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfa2V5X25hbWUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9nX2lkIiwgLmRlc2NyID0gImxvZyBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2tleSwgbG9nX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gInJlc2VydmVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm5hbWUiLCAuZGVzY3IgPSAibmFtZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2tleSwgbmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2VudHJ5X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nX2VudHJ5IC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19kZWZhdWx0X2xvZ19sZXZlbCA9IHsgLm5hbWUgPSAiZGVmYXVsdF9sb2dfbGV2ZWwiLCAuZGVzY3IgPSAiZGVmYXVsdCBsb2cgbGV2ZWwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX0xFVkVMLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSwgZGVmYXVsdF9sb2dfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfbGV2ZWwgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2RlZmF1bHRfbG9nX3R5cGUgPSB7IC5uYW1lID0gImRlZmF1bHRfbG9nX3R5cGUiLCAuZGVzY3IgPSAiZGVmYXVsdCBsb2cgdHlwZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGRlZmF1bHRfbG9nX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9jZmdfbG9nX2xldmVsX3ByaW50ID0geyAubmFtZSA9ICJsb2dfbGV2ZWxfcHJpbnQiLCAuZGVzY3IgPSAibG9nIGxldmVsIHByaW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1BSSU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSwgbG9nX2xldmVsX3ByaW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19sb2dfbGV2ZWxfc2F2ZSA9IHsgLm5hbWUgPSAibG9nX2xldmVsX3NhdmUiLCAuZGVzY3IgPSAibG9nIGxldmVsIHNhdmUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGxvZ19sZXZlbF9zYXZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19sb2dfdHlwZSA9IHsgLm5hbWUgPSAibG9nX3R5cGUiLCAuZGVzY3IgPSAibG9nIHR5cGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGxvZ190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2xvZ19zdHlsZSA9IHsgLm5hbWUgPSAibG9nX3N0eWxlIiwgLmRlc2NyID0gImxvZ19zdHlsZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19TVFlMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGxvZ19zdHlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19zdHlsZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9jZmdfbG9nX25hbWUgPSB7IC5uYW1lID0gImxvZ19uYW1lIiwgLmRlc2NyID0gImxvZyBuYW1lIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGxvZ19uYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ19lbnRyeV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2RlZmF1bHRfbG9nX2xldmVsLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2RlZmF1bHRfbG9nX3R5cGUsICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9jZmdfbG9nX2xldmVsX3ByaW50LCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2xvZ19sZXZlbF9zYXZlLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2xvZ190eXBlLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2xvZ19zdHlsZSwgJnByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19sb2dfbmFtZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRlZmF1bHRfbG9nX2xldmVsIiwgLmRlc2NyID0gImRlZmF1bHQgbG9nIGxldmVsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGRlZmF1bHRfbG9nX2xldmVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsIH0sIHsgLm5hbWUgPSAiZGVmYXVsdF9sb2dfdHlwZSIsIC5kZXNjciA9ICJkZWZhdWx0IGxvZyB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGRlZmF1bHRfbG9nX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfdHlwZSB9LCB7IC5uYW1lID0gImxvZ19sZXZlbF9wcmludCIsIC5kZXNjciA9ICJsb2cgbGV2ZWwgcHJpbnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSwgbG9nX2xldmVsX3ByaW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsIH0sIHsgLm5hbWUgPSAibG9nX2xldmVsX3NhdmUiLCAuZGVzY3IgPSAibG9nIGxldmVsIHNhdmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSwgbG9nX2xldmVsX3NhdmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfbGV2ZWwgfSwgeyAubmFtZSA9ICJsb2dfdHlwZSIsIC5kZXNjciA9ICJsb2cgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBsb2dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ190eXBlIH0sIHsgLm5hbWUgPSAibG9nX3N0eWxlIiwgLmRlc2NyID0gImxvZ19zdHlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBsb2dfc3R5bGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfc3R5bGUgfSwgeyAubmFtZSA9ICJsb2dfbmFtZSIsIC5kZXNjciA9ICJsb2cgbmFtZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBsb2dfbmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGxvZ19lbnRyeSAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfc3RhdF9tc2dfY291bnQgPSB7IC5uYW1lID0gIm1zZ19jb3VudCIsIC5kZXNjciA9ICJtc2cgY291bnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEsIG1zZ19jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MzJfNiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9zdGF0X2xvc3RfbXNnX2NvdW50ID0geyAubmFtZSA9ICJsb3N0X21zZ19jb3VudCIsIC5kZXNjciA9ICJsb3N0IG1zZyBjb3VudCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9MT1NUX01TR19DT1VOVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhLCBsb3N0X21zZ19jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dfZW50cnlfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9zdGF0X21zZ19jb3VudCwgJnByb3BfZGVzY3JfbG9nX2VudHJ5X3N0YXRfbG9zdF9tc2dfY291bnQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibXNnX2NvdW50IiwgLmRlc2NyID0gIm1zZyBjb3VudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSwgbXNnX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UzMl82IH0sIHsgLm5hbWUgPSAibG9zdF9tc2dfY291bnQiLCAuZGVzY3IgPSAibG9zdCBtc2cgY291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEsIGxvc3RfbXNnX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nX2VudHJ5IC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgbG9nX2VudHJ5X3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfbG9nX2VudHJ5X3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dfZW50cnkgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dfZW50cnkgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGxvZ19lbnRyeSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ19lbnRyeV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGxvZ2dlciA9PT09ICovCisKKy8qIEdyb3VwOiBsb2dnZXIgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfa2V5X3Jlc2VydmVkID0geyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJyZXNlcnZlZCIsIC5hY2Nlc3MgPSAwLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfa2V5X2ZpbGVfaWQgPSB7IC5uYW1lID0gImZpbGVfaWQiLCAuZGVzY3IgPSAic2hvdWxkIGJlIDAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9rZXksIGZpbGVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZmlsZV9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ2dlcl9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dnZXJfa2V5X3Jlc2VydmVkLCAmcHJvcF9kZXNjcl9sb2dnZXJfa2V5X2ZpbGVfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAicmVzZXJ2ZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImZpbGVfaWQiLCAuZGVzY3IgPSAic2hvdWxkIGJlIDAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9rZXksIGZpbGVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZmlsZV9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dnZXIgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfY2ZnX2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gIkNvbnRhaW5zIFwibmV4dFwiIGxvZyByZWNvcmRzIHJlYWQgYnkgXCJiY21vbHRfY2ZnX2dldCgpIEFQSSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9jZmdfd3JhcF9hcm91bmQgPSB7IC5uYW1lID0gIndyYXBfYXJvdW5kIiwgLmRlc2NyID0gIkxvZyBmaWxlIHdyYXAtYXJvdW5kIG9wdGlvbi4gVFJVRT13cmFwIGFyb3VuZCB3aGVuIGZ1bGwuIEZBTFNFPXN0b3Agd2hlbiBmdWxsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfV1JBUF9BUk9VTkQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2NmZ19kYXRhLCB3cmFwX2Fyb3VuZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9jZmdfY2xlYXJfYWZ0ZXJfcmVhZCA9IHsgLm5hbWUgPSAiY2xlYXJfYWZ0ZXJfcmVhZCIsIC5kZXNjciA9ICJDbGVhciBsb2cgYWZ0ZXIgbGFzdCByZWNvcmQgaGFzIGJlZW4gcmVhZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0NMRUFSX0FGVEVSX1JFQUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2NmZ19kYXRhLCBjbGVhcl9hZnRlcl9yZWFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nZ2VyX2NmZ19lbmFibGVfbG9nID0geyAubmFtZSA9ICJlbmFibGVfbG9nIiwgLmRlc2NyID0gIkVuYWJsZSBsb2dnZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX0NGR19JRF9FTkFCTEVfTE9HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgZW5hYmxlX2xvZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9jZmdfbG9nX25hbWVzID0geyAubmFtZSA9ICJsb2dfbmFtZXMiLCAuZGVzY3IgPSAibG9nX25hbWVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2NmZ19kYXRhLCBsb2dfbmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwMCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ2dlcl9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dnZXJfY2ZnX2J1ZmZlciwgJnByb3BfZGVzY3JfbG9nZ2VyX2NmZ193cmFwX2Fyb3VuZCwgJnByb3BfZGVzY3JfbG9nZ2VyX2NmZ19jbGVhcl9hZnRlcl9yZWFkLCAmcHJvcF9kZXNjcl9sb2dnZXJfY2ZnX2VuYWJsZV9sb2csICZwcm9wX2Rlc2NyX2xvZ2dlcl9jZmdfbG9nX25hbWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gIkNvbnRhaW5zIFwibmV4dFwiIGxvZyByZWNvcmRzIHJlYWQgYnkgXCJiY21vbHRfY2ZnX2dldCgpIEFQSSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2NmZ19kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfYnVmZmVyIH0sIHsgLm5hbWUgPSAid3JhcF9hcm91bmQiLCAuZGVzY3IgPSAiTG9nIGZpbGUgd3JhcC1hcm91bmQgb3B0aW9uLiBUUlVFPXdyYXAgYXJvdW5kIHdoZW4gZnVsbC4gRkFMU0U9c3RvcCB3aGVuIGZ1bGwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgd3JhcF9hcm91bmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjbGVhcl9hZnRlcl9yZWFkIiwgLmRlc2NyID0gIkNsZWFyIGxvZyBhZnRlciBsYXN0IHJlY29yZCBoYXMgYmVlbiByZWFkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEsIGNsZWFyX2FmdGVyX3JlYWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJlbmFibGVfbG9nIiwgLmRlc2NyID0gIkVuYWJsZSBsb2dnZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgZW5hYmxlX2xvZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxvZ19uYW1lcyIsIC5kZXNjciA9ICJsb2dfbmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgbG9nX25hbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMDAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGxvZ2dlciAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfc3RhdF9saW5lc19pbl9sb2cgPSB7IC5uYW1lID0gImxpbmVzX2luX2xvZyIsIC5kZXNjciA9ICJsaW5lcyBpbiBsb2ciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEsIGxpbmVzX2luX2xvZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ2dlcl9zdGF0X2xpbmVzX2luX2xvZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5lc19pbl9sb2ciLCAuZGVzY3IgPSAibGluZXMgaW4gbG9nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhLCBsaW5lc19pbl9sb2cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dnZXIgLSBjbGVhcl9sb2cgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfY2xlYXJfbG9nX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGxvZ2dlciAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nZ2VyX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dHRVJfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ2dlcl9zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ2dlcl9zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nZ2VyIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nZ2VyIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dnZXIgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dnZXJfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9sb2dnZXJfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBubmkgPT09PSAqLworCisvKiBHcm91cDogbm5pIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gTkkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX25uaV9rZXlfcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gTkkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbm5pX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBubmkgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfY2ZnX3JlbW90ZV9sb29wYmFjayA9IHsgLm5hbWUgPSAicmVtb3RlX2xvb3BiYWNrIiwgLmRlc2NyID0gIkluY29taW5nIHBhY2tldHMgY29taW5nIGZyb20gdGhlIFBPTiAodXBzdHJlYW0pIGFuZCBnb2luZyBiYWNrIHRvIHRoZSBQT04gKERvd25zdHJlYW0pICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIHJlbW90ZV9sb29wYmFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfY2ZnX2xpbmVfbG9vcGJhY2sgPSB7IC5uYW1lID0gImxpbmVfbG9vcGJhY2siLCAuZGVzY3IgPSAiSW5jb21pbmcgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgTk5JIGludGVyZmFjZSB0byB0aGUgUE0gYW5kIGdvaW5nIGJhY2sgdG93YXJkcyB0aGUgTk5JIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQ0ZHX0lEX0xJTkVfTE9PUEJBQ0ssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBsaW5lX2xvb3BiYWNrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9jZmdfbWFjX2FkZHJlc3MgPSB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIk1hYyBhZGRyZXNzIHRvIGJlIHVzZWQgZm9yIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2NmZ19ubmlfc3RhdHVzID0geyAubmFtZSA9ICJubmlfc3RhdHVzIiwgLmRlc2NyID0gIk5OSSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBubmlfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2xpbmtfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2NmZ19ubmlfYmFja3VwX3N0YXR1cyA9IHsgLm5hbWUgPSAibm5pX2JhY2t1cF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIHRoZSBiYWNrdXAgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBubmlfYmFja3VwX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9saW5rX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9jZmdfYWN0aXZlX25uaSA9IHsgLm5hbWUgPSAiYWN0aXZlX25uaSIsIC5kZXNjciA9ICJXaGljaCBOTkkgaXMgY3VycmVudGx5IGFjdGl2ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0NGR19JRF9BQ1RJVkVfTk5JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgYWN0aXZlX25uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9jb25uZWN0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2NmZ19ubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMgPSB7IC5uYW1lID0gIm5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyIsIC5kZXNjciA9ICJIb3cgb2Z0ZW4gdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgcHJpbWFyeSBhbmQgYmFja3VwIE5OSXMgKHVuaXRzOiBtcykuIFplcm8gKDApIGRpc2FibGVzIHN0YXR1cyBwb2xsaW5nLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfY2ZnX2F1dG9zd2l0Y2ggPSB7IC5uYW1lID0gImF1dG9zd2l0Y2giLCAuZGVzY3IgPSAiU2hvdWxkIGZpcm13YXJlIGF1dG9tYXRpY2FsbHkgc3dpdGNoIGJldHdlZW4gcHJpbWFyeS9iYWNrdXAgTk5JcyB3aGVuIExvc3Mgb2YgTGluayBpcyBkZXRlY3RlZD8iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0NGR19JRF9BVVRPU1dJVENILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgYXV0b3N3aXRjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9jZmdfZmxvd19jb250cm9sID0geyAubmFtZSA9ICJmbG93X2NvbnRyb2wiLCAuZGVzY3IgPSAiTk5JIEZsb3cgY29udHJvbC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0NGR19JRF9GTE9XX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBmbG93X2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX25uaV9jZmdfcmVtb3RlX2xvb3BiYWNrLCAmcHJvcF9kZXNjcl9ubmlfY2ZnX2xpbmVfbG9vcGJhY2ssICZwcm9wX2Rlc2NyX25uaV9jZmdfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX25uaV9jZmdfbm5pX3N0YXR1cywgJnByb3BfZGVzY3Jfbm5pX2NmZ19ubmlfYmFja3VwX3N0YXR1cywgJnByb3BfZGVzY3Jfbm5pX2NmZ19hY3RpdmVfbm5pLCAmcHJvcF9kZXNjcl9ubmlfY2ZnX25uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcywgJnByb3BfZGVzY3Jfbm5pX2NmZ19hdXRvc3dpdGNoLCAmcHJvcF9kZXNjcl9ubmlfY2ZnX2Zsb3dfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlbW90ZV9sb29wYmFjayIsIC5kZXNjciA9ICJJbmNvbWluZyBwYWNrZXRzIGNvbWluZyBmcm9tIHRoZSBQT04gKHVwc3RyZWFtKSBhbmQgZ29pbmcgYmFjayB0byB0aGUgUE9OIChEb3duc3RyZWFtKSAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgcmVtb3RlX2xvb3BiYWNrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gImxpbmVfbG9vcGJhY2siLCAuZGVzY3IgPSAiSW5jb21pbmcgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgTk5JIGludGVyZmFjZSB0byB0aGUgUE0gYW5kIGdvaW5nIGJhY2sgdG93YXJkcyB0aGUgTk5JIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBsaW5lX2xvb3BiYWNrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIk1hYyBhZGRyZXNzIHRvIGJlIHVzZWQgZm9yIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJubmlfc3RhdHVzIiwgLmRlc2NyID0gIk5OSSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbm5pX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9saW5rX3N0YXR1cyB9LCB7IC5uYW1lID0gIm5uaV9iYWNrdXBfc3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyBvZiB0aGUgYmFja3VwIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbm5pX2JhY2t1cF9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfbGlua19zdGF0dXMgfSwgeyAubmFtZSA9ICJhY3RpdmVfbm5pIiwgLmRlc2NyID0gIldoaWNoIE5OSSBpcyBjdXJyZW50bHkgYWN0aXZlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBhY3RpdmVfbm5pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2Nvbm5lY3Rpb24gfSwgeyAubmFtZSA9ICJubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMiLCAuZGVzY3IgPSAiSG93IG9mdGVuIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHByaW1hcnkgYW5kIGJhY2t1cCBOTklzICh1bml0czogbXMpLiBaZXJvICgwKSBkaXNhYmxlcyBzdGF0dXMgcG9sbGluZy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImF1dG9zd2l0Y2giLCAuZGVzY3IgPSAiU2hvdWxkIGZpcm13YXJlIGF1dG9tYXRpY2FsbHkgc3dpdGNoIGJldHdlZW4gcHJpbWFyeS9iYWNrdXAgTk5JcyB3aGVuIExvc3Mgb2YgTGluayBpcyBkZXRlY3RlZD8iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgYXV0b3N3aXRjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImZsb3dfY29udHJvbCIsIC5kZXNjciA9ICJOTkkgRmxvdyBjb250cm9sLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBmbG93X2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbm5pX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbm5pX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X25uaV9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBubmkgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzY0ID0geyAubmFtZSA9ICJyeF9mcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDY0IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc182NV8xMjcgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDY1IHRvIDEyNyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJyeF9mcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTI4IHRvIDI1NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzI1Nl81MTEgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfNTEyXzEwMjMgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzE1MTlfMjA0NyA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzIwNDhfNDA5NSA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzkyMTdfMTYzODMgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9ieXRlcyA9IHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZ29vZF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2dvb2RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZ29vZCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0dPT0RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2dvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3VuaWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJyeF91bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHVuaWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF91bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9tdWx0aWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJyeF9tdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgbXVsdGljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9tdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2Jyb2FkY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2Jyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBicm9hZGNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZmNzX2Vycm9ycyA9IHsgLm5hbWUgPSAicnhfZmNzX2Vycm9ycyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIEZDUyBlcnJvcnMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZmNzX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9jb250cm9sX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfY29udHJvbF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb250cm9sIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09OVFJPTF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfY29udHJvbF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfcGF1c2VfZnJhbWVzID0geyAubmFtZSA9ICJyeF9wYXVzZV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBwYXVzZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BBVVNFX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9wYXVzZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfcGZjX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfcGZjX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIFBGQyBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfcGZjX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF91bnN1cHBvcnRlZF9vcGNvZGUgPSB7IC5uYW1lID0gInJ4X3Vuc3VwcG9ydGVkX29wY29kZSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIFVuc3VwcG9ydGVkIE9wY29kZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX09QQ09ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF91bnN1cHBvcnRlZF9vcGNvZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdW5zdXBwb3J0ZWRfZGEgPSB7IC5uYW1lID0gInJ4X3Vuc3VwcG9ydGVkX2RhIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgdW5zdXBwb3J0ZWQgREEgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF91bnN1cHBvcnRlZF9kYSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9hbGlnbm1lbnRfZXJyb3JzID0geyAubmFtZSA9ICJyeF9hbGlnbm1lbnRfZXJyb3JzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYWxpZ25tZW50IGVycm9ycyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQUxJR05NRU5UX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9hbGlnbm1lbnRfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UgPSB7IC5uYW1lID0gInJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBsZW5ndGggb3V0IG9mIHJhbmdlIGVycm9ycyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2NvZGVfZXJyb3JzID0geyAubmFtZSA9ICJyeF9jb2RlX2Vycm9ycyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGNvZGUgZXJyb3JzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT0RFX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9jb2RlX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9vdmVyc2l6ZWRfZnJhbWVzID0geyAubmFtZSA9ICJyeF9vdmVyc2l6ZWRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgb3ZlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfT1ZFUlNJWkVEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9vdmVyc2l6ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2phYmJlcl9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2phYmJlcl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBqYWJiZXIgZnJhbWVzIG9uIHRoaXMgTk5JLiB0aGVzZSBhcmUgb3ZlcnNpemVkIGZyYW1lcyB0aGF0IGFsc28gY29udGFpbiBhbiBpbnZhbGlkIENSQywgY29kZSBlcnJvciwgb3IgSUVFRSBsZW5ndGggY2hlY2sgZXJyb3IuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfamFiYmVyX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9tdHVfY2hlY2tfZXJyb3JzID0geyAubmFtZSA9ICJyeF9tdHVfY2hlY2tfZXJyb3JzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgTVRVIENoZWNrIEVycm9ycyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVRVX0NIRUNLX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9tdHVfY2hlY2tfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3Byb21pc2N1b3VzX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfcHJvbWlzY3VvdXNfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZnJhbWVzIG9uIHRoaXMgTk5JIHRoYXQgYXJlIG5vdCBjb250cm9sIHBhY2tldHMgYW5kIGhhdmUgYSBEQSB0aGF0IGlzIG5vdCBtYXRjaGluZyB3aXRoIHRoZSBSWCBTQS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3Byb21pc2N1b3VzX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF92bGFuX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gVGhpcyBjb3VudHMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB0YWdnZWQgZnJhbWVzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9WTEFOX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF92bGFuX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9kb3VibGVfdmxhbl9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2RvdWJsZV92bGFuX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGRvdWJsZSBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0RPVUJMRV9WTEFOX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9kb3VibGVfdmxhbl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdHJ1bmNhdGVkX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfdHJ1bmNhdGVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHRydW5jYXRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBSWCBGSUZPIEZ1bGwuICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9UUlVOQ0FURURfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3RydW5jYXRlZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdW5kZXJzaXplX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfdW5kZXJzaXplX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHVuZGVyc2l6ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTkRFUlNJWkVfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3VuZGVyc2l6ZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhZ21lbnRlZF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2ZyYWdtZW50ZWRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZnJhZ21lbnRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQUdNRU5URURfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYWdtZW50ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3J1bnRfZnJhbWVzID0geyAubmFtZSA9ICJyeF9ydW50X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHJ1bnQgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9ydW50X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfNjQgPSB7IC5uYW1lID0gInR4X2ZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggNjQgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzY1XzEyNyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzEyOF8yNTUgPSB7IC5uYW1lID0gInR4X2ZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMjU2XzUxMSA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc181MTJfMTAyMyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMTAyNF8xNTE4ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMTUxOV8yMDQ3ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMjA0OF80MDk1ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfNDA5Nl85MjE2ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfOTIxN18xNjM4MyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2J5dGVzID0geyAubmFtZSA9ICJ0eF9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJ5dGVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9nb29kX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBnb29kIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZ29vZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X3VuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgdW5pY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3VuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X211bHRpY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X211bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBtdWx0aWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X211bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJyb2FkY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9wYXVzZV9mcmFtZXMgPSB7IC5uYW1lID0gInR4X3BhdXNlX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHBhdXNlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEFVU0VfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3BhdXNlX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9wZmNfZnJhbWVzID0geyAubmFtZSA9ICJ0eF9wZmNfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgUEZDIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEZDX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9wZmNfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2phYmJlcl9mcmFtZXMgPSB7IC5uYW1lID0gInR4X2phYmJlcl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBqYWJiZXIgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGVzZSBhcmUgb3ZlcnNpemVkIGZyYW1lcyB0aGF0IGFsc28gY29udGFpbiBhbiBpbnZhbGlkIEZDUy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfSkFCQkVSX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9qYWJiZXJfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2Zjc19lcnJvcnMgPSB7IC5uYW1lID0gInR4X2Zjc19lcnJvcnMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBGQ1MgZXJyb3JzIG9uIHRoaXMgTk5JLiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRkNTX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mY3NfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2NvbnRyb2xfZnJhbWVzID0geyAubmFtZSA9ICJ0eF9jb250cm9sX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGNvbnRyb2wgZnJhbWVzIG9uIHRoaXMgTk5JLiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfY29udHJvbF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfb3ZlcnNpemVfZnJhbWVzID0geyAubmFtZSA9ICJ0eF9vdmVyc2l6ZV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBvdmVyc2l6ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfT1ZFUlNJWkVfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X292ZXJzaXplX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFnbWVudGVkX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfZnJhZ21lbnRlZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBmcmFnbWVudGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQUdNRU5URURfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYWdtZW50ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2Vycm9yX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfZXJyb3JfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZXJyb3JlZCBmcmFtZXMgb24gdGhpcyBOTkkuICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZXJyb3JfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3ZsYW5fZnJhbWVzID0geyAubmFtZSA9ICJ0eF92bGFuX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiBUaGlzIGNvdW50cyBib3RoIHNpbmdsZSBhbmQgZG91YmxlIHRhZ2dlZCBmcmFtZXMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3ZsYW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2RvdWJsZV92bGFuX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfZG91YmxlX3ZsYW5fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZG91YmxlIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRE9VQkxFX1ZMQU5fRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2RvdWJsZV92bGFuX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9ydW50X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfcnVudF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBydW50IGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1JVTlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3J1bnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3VuZGVycnVuX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfdW5kZXJydW5fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgdW5kZXJydW4gZnJhbWVzIG9uIHRoaXMgTk5JLiBUaHVzIGhhcHBlbnMgd2hlbiBhIGZyYW1lIGVuY291bnRlcnMgYSBNQUMgdW5kZXJydW4gKFR4IFN5bmMgRklGTyBydW5zIG91dCBvZiBkYXRhIGJlZm9yZSB0aGUgZW5kIG9mIHBhY2tldCkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF91bmRlcnJ1bl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9ieXRlcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZ29vZF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9tdWx0aWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9icm9hZGNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mY3NfZXJyb3JzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9jb250cm9sX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfcGF1c2VfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9wZmNfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF91bnN1cHBvcnRlZF9vcGNvZGUsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3Vuc3VwcG9ydGVkX2RhLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9hbGlnbm1lbnRfZXJyb3JzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9sZW5ndGhfb3V0X29mX3JhbmdlLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9jb2RlX2Vycm9ycywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfb3ZlcnNpemVkX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfamFiYmVyX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfbXR1X2NoZWNrX2Vycm9ycywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfcHJvbWlzY3VvdXNfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF92bGFuX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZG91YmxlX3ZsYW5fZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF90cnVuY2F0ZWRfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF91bmRlcnNpemVfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFnbWVudGVkX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfcnVudF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc182NCwgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzY1XzEyNywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzEyOF8yNTUsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc18yNTZfNTExLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfNTEyXzEwMjMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc18xMDI0XzE1MTgsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc18xNTE5XzIwNDcsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc18yMDQ4XzQwOTUsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc180MDk2XzkyMTYsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc185MjE3XzE2MzgzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2J5dGVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9nb29kX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfdW5pY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X211bHRpY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3BhdXNlX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfcGZjX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfamFiYmVyX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZmNzX2Vycm9ycywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfY29udHJvbF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X292ZXJzaXplX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhZ21lbnRlZF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2Vycm9yX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfdmxhbl9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2RvdWJsZV92bGFuX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfcnVudF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3VuZGVycnVuX2ZyYW1lcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfZGF0YV9maWVsZHNbXSA9Cit7CisgICAgeyAubmFtZSA9ICJyeF9mcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDY0IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9mcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMjU2IHRvIDUxMSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9mcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9mcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBnb29kIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2dvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB1bmljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3VuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfbXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIG11bHRpY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9tdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGJyb2FkY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9icm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZmNzX2Vycm9ycyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIEZDUyBlcnJvcnMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mY3NfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfY29udHJvbF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb250cm9sIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2NvbnRyb2xfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfcGF1c2VfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGF1c2UgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfcGF1c2VfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfcGZjX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIFBGQyBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9wZmNfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfdW5zdXBwb3J0ZWRfb3Bjb2RlIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgVW5zdXBwb3J0ZWQgT3Bjb2RlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3Vuc3VwcG9ydGVkX29wY29kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X3Vuc3VwcG9ydGVkX2RhIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgdW5zdXBwb3J0ZWQgREEgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfdW5zdXBwb3J0ZWRfZGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9hbGlnbm1lbnRfZXJyb3JzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYWxpZ25tZW50IGVycm9ycyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2FsaWdubWVudF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9sZW5ndGhfb3V0X29mX3JhbmdlIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgbGVuZ3RoIG91dCBvZiByYW5nZSBlcnJvcnMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfY29kZV9lcnJvcnMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb2RlIGVycm9ycyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2NvZGVfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfb3ZlcnNpemVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIG92ZXJzaXplZCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9vdmVyc2l6ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfamFiYmVyX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGphYmJlciBmcmFtZXMgb24gdGhpcyBOTkkuIHRoZXNlIGFyZSBvdmVyc2l6ZWQgZnJhbWVzIHRoYXQgYWxzbyBjb250YWluIGFuIGludmFsaWQgQ1JDLCBjb2RlIGVycm9yLCBvciBJRUVFIGxlbmd0aCBjaGVjayBlcnJvci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2phYmJlcl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9tdHVfY2hlY2tfZXJyb3JzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgTVRVIENoZWNrIEVycm9ycyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X210dV9jaGVja19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9wcm9taXNjdW91c19mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFtZXMgb24gdGhpcyBOTkkgdGhhdCBhcmUgbm90IGNvbnRyb2wgcGFja2V0cyBhbmQgaGF2ZSBhIERBIHRoYXQgaXMgbm90IG1hdGNoaW5nIHdpdGggdGhlIFJYIFNBLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfcHJvbWlzY3VvdXNfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gVGhpcyBjb3VudHMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB0YWdnZWQgZnJhbWVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfdmxhbl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9kb3VibGVfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBkb3VibGUgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZG91YmxlX3ZsYW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfdHJ1bmNhdGVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHRydW5jYXRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBSWCBGSUZPIEZ1bGwuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfdHJ1bmNhdGVkX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X3VuZGVyc2l6ZV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB1bmRlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3VuZGVyc2l6ZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9mcmFnbWVudGVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYWdtZW50ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9ydW50X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHJ1bnQgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfcnVudF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDY0IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2ZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggMjU2IHRvIDUxMSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBieXRlcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBnb29kIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2dvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCB1bmljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3VuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIG11bHRpY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9tdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJyb2FkY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9icm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfcGF1c2VfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcGF1c2UgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfcGF1c2VfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfcGZjX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIFBGQyBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9wZmNfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfamFiYmVyX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGphYmJlciBmcmFtZXMgb24gdGhpcyBOTkkuIFRoZXNlIGFyZSBvdmVyc2l6ZWQgZnJhbWVzIHRoYXQgYWxzbyBjb250YWluIGFuIGludmFsaWQgRkNTLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfamFiYmVyX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2Zjc19lcnJvcnMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBGQ1MgZXJyb3JzIG9uIHRoaXMgTk5JLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2Zjc19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9jb250cm9sX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGNvbnRyb2wgZnJhbWVzIG9uIHRoaXMgTk5JLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2NvbnRyb2xfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfb3ZlcnNpemVfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgb3ZlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9vdmVyc2l6ZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFnbWVudGVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGZyYWdtZW50ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYWdtZW50ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZXJyb3JfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZXJyb3JlZCBmcmFtZXMgb24gdGhpcyBOTkkuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZXJyb3JfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gVGhpcyBjb3VudHMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB0YWdnZWQgZnJhbWVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfdmxhbl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9kb3VibGVfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBkb3VibGUgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZG91YmxlX3ZsYW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfcnVudF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBydW50IGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9ydW50X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X3VuZGVycnVuX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHVuZGVycnVuIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGh1cyBoYXBwZW5zIHdoZW4gYSBmcmFtZSBlbmNvdW50ZXJzIGEgTUFDIHVuZGVycnVuIChUeCBTeW5jIEZJRk8gcnVucyBvdXQgb2YgZGF0YSBiZWZvcmUgdGhlIGVuZCBvZiBwYWNrZXQpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfdW5kZXJydW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Cit9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IG5uaSAtIHN0YXR1c19jaGFuZ2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXR1c19jaGFuZ2VkX25ld19zdGF0dXMgPSB7IC5uYW1lID0gIm5ld19zdGF0dXMiLCAuZGVzY3IgPSAiTmV3IE5OSSBMaW5rIFN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSwgbmV3X3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0dXNfY2hhbmdlZF9saW5rID0geyAubmFtZSA9ICJsaW5rIiwgLmRlc2NyID0gIldoaWNoIE5OSSB0aGlzIGluZGljYXRpb24gcGVydGFpbnMgdG8uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9MSU5LLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhLCBsaW5rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2Nvbm5lY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdHVzX2NoYW5nZWRfcHJldmlvdXNfYWN0aXZlID0geyAubmFtZSA9ICJwcmV2aW91c19hY3RpdmUiLCAuZGVzY3IgPSAiV2hpY2ggTk5JIHdhcyBhY3RpdmUgYmVmb3JlIHRoaXMgc3RhdHVzIGNoYW5nZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX1BSRVZJT1VTX0FDVElWRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSwgcHJldmlvdXNfYWN0aXZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2Nvbm5lY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdHVzX2NoYW5nZWRfbmV3X2FjdGl2ZSA9IHsgLm5hbWUgPSAibmV3X2FjdGl2ZSIsIC5kZXNjciA9ICJXaGljaCBOTkkgaXMgbm93IGFjdGl2ZSBhZnRlciB0aGlzIHN0YXR1cyBjaGFuZ2UuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfQUNUSVZFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhLCBuZXdfYWN0aXZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2Nvbm5lY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBubmlfc3RhdHVzX2NoYW5nZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfc3RhdHVzX2NoYW5nZWRfbmV3X3N0YXR1cywgJnByb3BfZGVzY3Jfbm5pX3N0YXR1c19jaGFuZ2VkX2xpbmssICZwcm9wX2Rlc2NyX25uaV9zdGF0dXNfY2hhbmdlZF9wcmV2aW91c19hY3RpdmUsICZwcm9wX2Rlc2NyX25uaV9zdGF0dXNfY2hhbmdlZF9uZXdfYWN0aXZlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJuZXdfc3RhdHVzIiwgLmRlc2NyID0gIk5ldyBOTkkgTGluayBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhLCBuZXdfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibGluayIsIC5kZXNjciA9ICJXaGljaCBOTkkgdGhpcyBpbmRpY2F0aW9uIHBlcnRhaW5zIHRvLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEsIGxpbmspLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfY29ubmVjdGlvbiB9LCB7IC5uYW1lID0gInByZXZpb3VzX2FjdGl2ZSIsIC5kZXNjciA9ICJXaGljaCBOTkkgd2FzIGFjdGl2ZSBiZWZvcmUgdGhpcyBzdGF0dXMgY2hhbmdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEsIHByZXZpb3VzX2FjdGl2ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9jb25uZWN0aW9uIH0sIHsgLm5hbWUgPSAibmV3X2FjdGl2ZSIsIC5kZXNjciA9ICJXaGljaCBOTkkgaXMgbm93IGFjdGl2ZSBhZnRlciB0aGlzIHN0YXR1cyBjaGFuZ2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSwgbmV3X2FjdGl2ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9jb25uZWN0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSIsIC5kZXNjciA9ICJOTkkgTGluayBzdGF0dXMgY2hhbmdlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBubmkgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBubmlfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IG5uaSAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBubmlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IG5uaSAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbm5pIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2F1dG9fY2ZnX3N0YXR1c19jaGFuZ2VkID0geyAubmFtZSA9ICJzdGF0dXNfY2hhbmdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdHVzX2NoYW5nZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRVU19DSEFOR0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhLCBzdGF0dXNfY2hhbmdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIG5uaV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX25uaV9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX25uaV9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCwgJnByb3BfZGVzY3Jfbm5pX2F1dG9fY2ZnX3N0YXR1c19jaGFuZ2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdHVzX2NoYW5nZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXR1c19jaGFuZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSwgc3RhdHVzX2NoYW5nZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBubmlfc2VyZGVzID09PT0gKi8KKworLyogR3JvdXA6IG5uaV9zZXJkZXMgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gTkkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2tleV9pbnN0YW5jZSA9IHsgLm5hbWUgPSAiaW5zdGFuY2UiLCAuZGVzY3IgPSAiU2VyRGVzIGluc3RhbmNlLjogMCA9IFByaW1hcnksIDEgPSBTZWNvbmRhcnkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5LCBpbnN0YW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19pbnN0YW5jZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIG5uaV9zZXJkZXNfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2tleV9pbnN0YW5jZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBOSSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImluc3RhbmNlIiwgLmRlc2NyID0gIlNlckRlcyBpbnN0YW5jZS46IDAgPSBQcmltYXJ5LCAxID0gU2Vjb25kYXJ5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19rZXksIGluc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyZGVzX2luc3RhbmNlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc2VyZGVzX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbm5pX3NlcmRlcyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X3ZnYSA9IHsgLm5hbWUgPSAicnhfdmdhIiwgLmRlc2NyID0gIlJ4IFZnYSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9WR0EsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfdmdhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfcnhfcGYgPSB7IC5uYW1lID0gInJ4X3BmIiwgLmRlc2NyID0gIlBlYWtpbmcgRmlsdGVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1BGLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X3BmKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfcnhfbGZwZiA9IHsgLm5hbWUgPSAicnhfbGZwZiIsIC5kZXNjciA9ICJMb3cgRnJlcXVlbmN5IFBlYWtpbmcgRmlsdGVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfbGZwZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTEgPSB7IC5uYW1lID0gInJ4X2RmZTEiLCAuZGVzY3IgPSAiUnggREZFMSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUxLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmUyID0geyAubmFtZSA9ICJyeF9kZmUyIiwgLmRlc2NyID0gIlJ4IERGRTIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmUzID0geyAubmFtZSA9ICJyeF9kZmUzIiwgLmRlc2NyID0gIlJ4IERGRTMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmU0ID0geyAubmFtZSA9ICJyeF9kZmU0IiwgLmRlc2NyID0gIlJ4IERGRTQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmU0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmU1ID0geyAubmFtZSA9ICJyeF9kZmU1IiwgLmRlc2NyID0gIlJ4IERGRTUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9wcmUgPSB7IC5uYW1lID0gInR4X3ByZSIsIC5kZXNjciA9ICJUeCBQcmUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUFJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X3ByZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X21haW4gPSB7IC5uYW1lID0gInR4X21haW4iLCAuZGVzY3IgPSAiVHggTWFpbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9NQUlOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X21haW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9wb3N0MSA9IHsgLm5hbWUgPSAidHhfcG9zdDEiLCAuZGVzY3IgPSAiVHggUG9zdDEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9wb3N0MiA9IHsgLm5hbWUgPSAidHhfcG9zdDIiLCAuZGVzY3IgPSAiVHggUG9zdDIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X3Bvc3QzID0geyAubmFtZSA9ICJ0eF9wb3N0MyIsIC5kZXNjciA9ICJUeCBQb3N0MyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCB0eF9wb3N0MyksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfYW1wID0geyAubmFtZSA9ICJ0eF9hbXAiLCAuZGVzY3IgPSAiVHggQW1wIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX0FNUCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCB0eF9hbXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBubmlfc2VyZGVzX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X3ZnYSwgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfcnhfcGYsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2xmcGYsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTEsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTIsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTMsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTQsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTUsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X3ByZSwgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfbWFpbiwgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfcG9zdDEsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X3Bvc3QyLCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9wb3N0MywgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfYW1wIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJ4X3ZnYSIsIC5kZXNjciA9ICJSeCBWZ2EiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X3ZnYSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X3BmIiwgLmRlc2NyID0gIlBlYWtpbmcgRmlsdGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9wZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X2xmcGYiLCAuZGVzY3IgPSAiTG93IEZyZXF1ZW5jeSBQZWFraW5nIEZpbHRlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfbGZwZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X2RmZTEiLCAuZGVzY3IgPSAiUnggREZFMSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X2RmZTIiLCAuZGVzY3IgPSAiUnggREZFMiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMiksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlMyIsIC5kZXNjciA9ICJSeCBERkUzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfSwgeyAubmFtZSA9ICJyeF9kZmU0IiwgLmRlc2NyID0gIlJ4IERGRTQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInJ4X2RmZTUiLCAuZGVzY3IgPSAiUnggREZFNSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlNSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAidHhfcHJlIiwgLmRlc2NyID0gIlR4IFByZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgdHhfcHJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHhfbWFpbiIsIC5kZXNjciA9ICJUeCBNYWluIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCB0eF9tYWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHhfcG9zdDEiLCAuZGVzY3IgPSAiVHggUG9zdDEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X3Bvc3QxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHhfcG9zdDIiLCAuZGVzY3IgPSAiVHggUG9zdDIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X3Bvc3QyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eF9wb3N0MyIsIC5kZXNjciA9ICJUeCBQb3N0MyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInR4X2FtcCIsIC5kZXNjciA9ICJUeCBBbXAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X2FtcCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBzb2Z0d2FyZV9lcnJvciA9PT09ICovCisKKy8qIEdyb3VwOiBzb2Z0d2FyZV9lcnJvciAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3NvZnR3YXJlX2Vycm9yX2tleV9yZXNlcnZlZCA9IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAiUmVzZXJ2ZWQgKHNldCB0byAwKS4iLCAuYWNjZXNzID0gMCwgLnByb3BlcnR5ID0gQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9SRVNFUlZFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3NvZnR3YXJlX2Vycm9yX2tleV9pZHggPSB7IC5uYW1lID0gImlkeCIsIC5kZXNjciA9ICJJbmRleCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9LRVlfSURfSURYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSwgaWR4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHNvZnR3YXJlX2Vycm9yX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3NvZnR3YXJlX2Vycm9yX2tleV9yZXNlcnZlZCwgJnByb3BfZGVzY3Jfc29mdHdhcmVfZXJyb3Jfa2V5X2lkeCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIChzZXQgdG8gMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImlkeCIsIC5kZXNjciA9ICJJbmRleCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5LCBpZHgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBzb2Z0d2FyZV9lcnJvciAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3NvZnR3YXJlX2Vycm9yX2NmZ19lbnRyeSA9IHsgLm5hbWUgPSAiZW50cnkiLCAuZGVzY3IgPSAiRW50cnkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGEsIGVudHJ5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3dfZXJyb3IgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBzb2Z0d2FyZV9lcnJvcl9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9zb2Z0d2FyZV9lcnJvcl9jZmdfZW50cnkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVudHJ5IiwgLmRlc2NyID0gIkVudHJ5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSwgZW50cnkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zd19lcnJvciB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IHRyeF9jYWxpYnJhdGlvbiA9PT09ICovCisKKy8qIEdyb3VwOiB0cnhfY2FsaWJyYXRpb24gLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fa2V5X3Jlc2VydmVkID0geyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJSZXNlcnZlZCAoc2V0IHRvIDApIiwgLmFjY2VzcyA9IDAsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fS0VZX0lEX1JFU0VSVkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHRyeF9jYWxpYnJhdGlvbl9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fa2V5X3Jlc2VydmVkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIChzZXQgdG8gMCkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB0cnhfY2FsaWJyYXRpb24gLSBzdGFydF9jYXB0dXJlX3dpbmRvdyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJwb25fbmkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3RyaWdnZXIgPSB7IC5uYW1lID0gInRyaWdnZXIiLCAuZGVzY3IgPSAidHJpZ2dlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgdHJpZ2dlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3N0cm9iZSA9IHsgLm5hbWUgPSAic3Ryb2JlIiwgLmRlc2NyID0gInN0cm9iZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBzdHJvYmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfd2luZG93X21vZGUgPSB7IC5uYW1lID0gIndpbmRvd19tb2RlIiwgLmRlc2NyID0gIndpbmRvdyBtb2RlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgd2luZG93X21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAib251IGlkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfdHJpZ2dlcl9wb3NpdGlvbiA9IHsgLm5hbWUgPSAidHJpZ2dlcl9wb3NpdGlvbiIsIC5kZXNjciA9ICJ0cmlnZ2VyIHBvc2l0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCB0cmlnZ2VyX3Bvc2l0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfc3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUgPSB7IC5uYW1lID0gInN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlIiwgLmRlc2NyID0gImVuYWJsZS9kaXNhYmxlIGNvcnJ1cHQgc3Ryb2JlIGZyb20gTUFDIHRvIHRlcm1pbmF0ZSBzdGF0IHdpbmRvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RPUF9EVUVfVE9fQ09SUlVQVF9TVFJPQkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3N0YXJ0X29mZnNldCA9IHsgLm5hbWUgPSAic3RhcnRfb2Zmc2V0IiwgLmRlc2NyID0gInN0YXJ0IG9mZnNldCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RBUlRfT0ZGU0VULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBzdGFydF9vZmZzZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2VuZF9vZmZzZXQgPSB7IC5uYW1lID0gImVuZF9vZmZzZXQiLCAuZGVzY3IgPSAiZW5kIG9mZnNldCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfRU5EX09GRlNFVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgZW5kX29mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfbnVtYmVyX29mX2N5Y2xlcyA9IHsgLm5hbWUgPSAibnVtYmVyX29mX2N5Y2xlcyIsIC5kZXNjciA9ICJudW1iZXIgb2YgY3ljbGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9OVU1CRVJfT0ZfQ1lDTEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBudW1iZXJfb2ZfY3ljbGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3Bvbl9uaSwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3RyaWdnZXIsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19zdHJvYmUsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd193aW5kb3dfbW9kZSwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X29udV9pZCwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3RyaWdnZXJfcG9zaXRpb24sICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19zdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZSwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3N0YXJ0X29mZnNldCwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2VuZF9vZmZzZXQsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19udW1iZXJfb2ZfY3ljbGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAicG9uX25pIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHJpZ2dlciIsIC5kZXNjciA9ICJ0cmlnZ2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgdHJpZ2dlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIH0sIHsgLm5hbWUgPSAic3Ryb2JlIiwgLmRlc2NyID0gInN0cm9iZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHN0cm9iZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCB9LCB7IC5uYW1lID0gIndpbmRvd19tb2RlIiwgLmRlc2NyID0gIndpbmRvdyBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgd2luZG93X21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAib251IGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInRyaWdnZXJfcG9zaXRpb24iLCAuZGVzY3IgPSAidHJpZ2dlciBwb3NpdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHRyaWdnZXJfcG9zaXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbiB9LCB7IC5uYW1lID0gInN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlIiwgLmRlc2NyID0gImVuYWJsZS9kaXNhYmxlIGNvcnJ1cHQgc3Ryb2JlIGZyb20gTUFDIHRvIHRlcm1pbmF0ZSBzdGF0IHdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhcnRfb2Zmc2V0IiwgLmRlc2NyID0gInN0YXJ0IG9mZnNldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHN0YXJ0X29mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJlbmRfb2Zmc2V0IiwgLmRlc2NyID0gImVuZCBvZmZzZXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBlbmRfb2Zmc2V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9jeWNsZXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGN5Y2xlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIG51bWJlcl9vZl9jeWNsZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhIiwgLmRlc2NyID0gInN0YXJ0IGNhcHR1cmUgd2luZG93IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHRyeF9jYWxpYnJhdGlvbiAtIGNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfd2luZG93ID0geyAubmFtZSA9ICJkYXRhX3dpbmRvdyIsIC5kZXNjciA9ICJkYXRhIHdpbmRvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfREFUQV9XSU5ET1csIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGRhdGFfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX3N0cm9iZV93aW5kb3cgPSB7IC5uYW1lID0gInN0cm9iZV93aW5kb3ciLCAuZGVzY3IgPSAic3Ryb2JlIHdpbmRvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgc3Ryb2JlX3dpbmRvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX3Jpc2VfbWluX21pbiA9IHsgLm5hbWUgPSAiZWRnZV9yaXNlX21pbl9taW4iLCAuZGVzY3IgPSAiZWRnZSByaXNlIG1pbiBtaW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUlOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX3Jpc2VfbWluX21pbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9yaXNlX21pbl9tYXggPSB7IC5uYW1lID0gImVkZ2VfcmlzZV9taW5fbWF4IiwgLmRlc2NyID0gImVkZ2UgcmlzZSBtaW4gbWF4IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUlOX01BWCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9yaXNlX21pbl9tYXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfcmlzZV9tYXhfbWluID0geyAubmFtZSA9ICJlZGdlX3Jpc2VfbWF4X21pbiIsIC5kZXNjciA9ICJlZGdlIHJpc2UgbWF4IG1pbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01BWF9NSU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfcmlzZV9tYXhfbWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX3Jpc2VfbWF4X21heCA9IHsgLm5hbWUgPSAiZWRnZV9yaXNlX21heF9tYXgiLCAuZGVzY3IgPSAiZWRnZSByaXNlIG1heCBtYXgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUFYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX3Jpc2VfbWF4X21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9mYWxsX21pbl9taW4gPSB7IC5uYW1lID0gImVkZ2VfZmFsbF9taW5fbWluIiwgLmRlc2NyID0gImVkZ2UgZmFsbCBtaW4gbWluICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NSU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfZmFsbF9taW5fbWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX2ZhbGxfbWluX21heCA9IHsgLm5hbWUgPSAiZWRnZV9mYWxsX21pbl9tYXgiLCAuZGVzY3IgPSAiZWRnZSBmYWxsIG1pbiBtYXgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX2ZhbGxfbWluX21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9mYWxsX21heF9taW4gPSB7IC5uYW1lID0gImVkZ2VfZmFsbF9tYXhfbWluIiwgLmRlc2NyID0gImVkZ2UgZmFsbCBtYXggbWluIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUFYX01JTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9mYWxsX21heF9taW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfZmFsbF9tYXhfbWF4ID0geyAubmFtZSA9ICJlZGdlX2ZhbGxfbWF4X21heCIsIC5kZXNjciA9ICJlZGdlIGZhbGwgbWF4IG1heCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NQVgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfZmFsbF9tYXhfbWF4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9yZXN1bHQgPSB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJyZXN1bHQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1JFU1VMVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfd2luZG93LCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfc3Ryb2JlX3dpbmRvdywgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfcmlzZV9taW5fbWluLCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9yaXNlX21pbl9tYXgsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX3Jpc2VfbWF4X21pbiwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfcmlzZV9tYXhfbWF4LCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9mYWxsX21pbl9taW4sICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX2ZhbGxfbWluX21heCwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfZmFsbF9tYXhfbWluLCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9mYWxsX21heF9tYXgsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRhdGFfd2luZG93IiwgLmRlc2NyID0gImRhdGEgd2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZGF0YV93aW5kb3cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggfSwgeyAubmFtZSA9ICJzdHJvYmVfd2luZG93IiwgLmRlc2NyID0gInN0cm9iZSB3aW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBzdHJvYmVfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IH0sIHsgLm5hbWUgPSAiZWRnZV9yaXNlX21pbl9taW4iLCAuZGVzY3IgPSAiZWRnZSByaXNlIG1pbiBtaW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX3Jpc2VfbWluX21pbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJlZGdlX3Jpc2VfbWluX21heCIsIC5kZXNjciA9ICJlZGdlIHJpc2UgbWluIG1heCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfcmlzZV9taW5fbWF4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImVkZ2VfcmlzZV9tYXhfbWluIiwgLmRlc2NyID0gImVkZ2UgcmlzZSBtYXggbWluIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9yaXNlX21heF9taW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZWRnZV9yaXNlX21heF9tYXgiLCAuZGVzY3IgPSAiZWRnZSByaXNlIG1heCBtYXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX3Jpc2VfbWF4X21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJlZGdlX2ZhbGxfbWluX21pbiIsIC5kZXNjciA9ICJlZGdlIGZhbGwgbWluIG1pbiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX2ZhbGxfbWluX21pbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJlZGdlX2ZhbGxfbWluX21heCIsIC5kZXNjciA9ICJlZGdlIGZhbGwgbWluIG1heCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfZmFsbF9taW5fbWF4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImVkZ2VfZmFsbF9tYXhfbWluIiwgLmRlc2NyID0gImVkZ2UgZmFsbCBtYXggbWluIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9mYWxsX21heF9taW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZWRnZV9mYWxsX21heF9tYXgiLCAuZGVzY3IgPSAiZWRnZSBmYWxsIG1heCBtYXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX2ZhbGxfbWF4X21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJDYXB0dXJlIHdpbmRvdyBhbmQgc3RhdGlzdGljIGNvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB0cnhfY2FsaWJyYXRpb24gLSBzdG9wX2NhcHR1cmVfd2luZG93ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAicG9uX25pIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhLCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB0cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X3Bvbl9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAicG9uX25pIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhLCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSIsIC5kZXNjciA9ICJzdG9wIGNhcHR1cmUgd2luZG93IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHRyeF9jYWxpYnJhdGlvbiAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkID0geyAubmFtZSA9ICJjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhLCBjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHRyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSwgY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiB4Z3Bvbl9hbGxvYyA9PT09ICovCisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2tleV9hbGxvY19pZCA9IHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fYWxsb2Nfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fYWxsb2Nfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfeGdwb25fYWxsb2Nfa2V5X2FsbG9jX2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5LCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2FsbG9jIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfY2ZnX3N0YXRlID0geyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IEFsbG9jIElEIHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfY2ZnX3NsYSA9IHsgLm5hbWUgPSAic2xhIiwgLmRlc2NyID0gIkFsbG9jIElEIFNMQSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU0xBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhLCBzbGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfY2ZnX29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0aGUgYWxsb2MgSUQgaXMgYXNzaWduZWQgdG8iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NmZ19jb2xsZWN0X3N0YXRzID0geyAubmFtZSA9ICJjb2xsZWN0X3N0YXRzIiwgLmRlc2NyID0gIkVuYWJsZSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gZm9yIHRoaXMgYWxsb2MgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEsIGNvbGxlY3Rfc3RhdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19jZmdfc3RhdGUsICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NmZ19zbGEsICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NmZ19vbnVfaWQsICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NmZ19jb2xsZWN0X3N0YXRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IEFsbG9jIElEIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19zdGF0ZSB9LCB7IC5uYW1lID0gInNsYSIsIC5kZXNjciA9ICJBbGxvYyBJRCBTTEEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhLCBzbGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0aGUgYWxsb2MgSUQgaXMgYXNzaWduZWQgdG8iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiY29sbGVjdF9zdGF0cyIsIC5kZXNjciA9ICJFbmFibGUgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciB0aGlzIGFsbG9jIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSwgY29sbGVjdF9zdGF0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2FsbG9jIC0gY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIm5ldyBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJuZXcgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fYWxsb2MgLSBnZXRfc3RhdHMgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfbnVtX29mX2N5Y2xlcyA9IHsgLm5hbWUgPSAibnVtX29mX2N5Y2xlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGN5Y2xlcyB0byBydW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhLCBudW1fb2ZfY3ljbGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2FsbG9jX2dldF9zdGF0c19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2dldF9zdGF0c19udW1fb2ZfY3ljbGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJudW1fb2ZfY3ljbGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgY3ljbGVzIHRvIHJ1biBzdGF0aXN0aWNzIGNvbGxlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhLCBudW1fb2ZfY3ljbGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEiLCAuZGVzY3IgPSAiUnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgYSBnaXZlbiBwZXJpb2Qgb2YgdGltZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9uc3JfdXNlZCA9IHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfdXNlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiB1c2VkIHdvcmRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIGF2ZXJhZ2VfbnNyX3VzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX25zcl9hbGxvY2F0ZWQgPSB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiBhbGxvY2F0ZWQgd29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBhdmVyYWdlX25zcl9hbGxvY2F0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX3NyX3JlcG9ydCA9IHsgLm5hbWUgPSAiYXZlcmFnZV9zcl9yZXBvcnQiLCAuZGVzY3IgPSAiQXZlcmFnZSBTUiByZXBvcnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIGF2ZXJhZ2Vfc3JfcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX25zcl91c2VkLCAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2F2ZXJhZ2VfbnNyX2FsbG9jYXRlZCwgJnByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX3NyX3JlcG9ydCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfdXNlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiB1c2VkIHdvcmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIGF2ZXJhZ2VfbnNyX3VzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfYWxsb2NhdGVkIiwgLmRlc2NyID0gIkF2ZXJhZ2UgTlNSIGFsbG9jYXRlZCB3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBhdmVyYWdlX25zcl9hbGxvY2F0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9zcl9yZXBvcnQiLCAuZGVzY3IgPSAiQXZlcmFnZSBTUiByZXBvcnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9zcl9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIkNvbGxlY3RlZCBhbGxvYyBJRCBzdGF0aXN0aWNzIGZyb20gZ2V0X3N0YXRzIG9wZXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIHNldF9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3NldF9zdGF0ZV9zdGF0ZSA9IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2FsbG9jX3NldF9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3NldF9zdGF0ZV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAiU2V0cyB0aGUgYWxsb2MncyBhY3RpdmF0aW9uIHN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHByb3RlY3Rpb24gc3dpdGNoaW5nIG9uIGFuIGFjdGl2ZS1zdGFuZGJ5IFBPTi4gIEluIG5vcm1hbCBvcGVyYXRpb24sIHRoaXMgaXNuJ3QgbmVjZXNzYXJ5IHNpbmNlIGFsbG9jcyBhcmUgYWN0aXZhdGVkL2RlYWN0aXZhdGVkIGF1dG9tYXRpY2FsbHkgYWxvbmcgd2l0aCB0aGUgT05VLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19zdGF0X3J4X2J5dGVzID0geyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgYWxsb2MgSUQgcmVjZWl2ZWQgYnl0ZXMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhLCByeF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fYWxsb2Nfc3RhdF9yeF9ieXRlcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhbGxvYyBJRCByZWNlaXZlZCBieXRlcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fYWxsb2MgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2FsbG9jIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2FsbG9jIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fYWxsb2MgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2F1dG9fY2ZnX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29uZmlndXJhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19hdXRvX2NmZ19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkID0geyAubmFtZSA9ICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2F1dG9fY2ZnX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19hdXRvX2NmZ19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjb25maWd1cmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogeGdwb25fZ2VtX3BvcnQgPT09PSAqLworCisvKiBHcm91cDogeGdwb25fZ2VtX3BvcnQgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9rZXlfZ2VtX3BvcnRfaWQgPSB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIkdFTSBQT1JUIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXksIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2dlbV9wb3J0X2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2tleV9wb25fbmksICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2tleV9nZW1fcG9ydF9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiR0VNIFBPUlQgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSwgZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9nZW1fcG9ydCAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJjb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIkdFTSBwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9jZmdfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHRoaXMgR0VNIHBvcnQgaXMgYXNzaWduZWQgdG8iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19nZW1fcG9ydF9zdGF0ZSA9IHsgLm5hbWUgPSAiZ2VtX3BvcnRfc3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBHRU0gcG9ydCBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgZ2VtX3BvcnRfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19lbmNyeXB0aW9uX21vZGUgPSB7IC5uYW1lID0gImVuY3J5cHRpb25fbW9kZSIsIC5kZXNjciA9ICJFbmFibGUvRGlzYWJsZSB0aGUgZG93bnN0cmVhbSBlbmNyeXB0aW9uIG1vZGUgb2YgdGhlIEdFTSBQb3J0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGVuY3J5cHRpb25fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9jZmdfdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUgPSB7IC5uYW1lID0gInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIiwgLmRlc2NyID0gIlRoZSBkZXN0aW5hdGlvbiBxdWV1ZSBvZiB0aGUgcGFja2V0cyBhcnJpdmluZyBvbiB0aGlzIEdFTSBQb3J0IG9uIHRoZSB1cHN0cmVhbSBkaXJlY3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfY2ZnX2NvbnRyb2wgPSB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiRW5hYmxlL0Rpc2FibGUgdGhlIEdFTSBQb3J0IElEIGluIHRoZSBPTFQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fZ2VtX3BvcnRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfY2ZnX2NvbmZpZ3VyYXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19vbnVfaWQsICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19nZW1fcG9ydF9zdGF0ZSwgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfY2ZnX2VuY3J5cHRpb25fbW9kZSwgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfY2ZnX3Vwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9jZmdfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJHRU0gcG9ydCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBjb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgdGhpcyBHRU0gcG9ydCBpcyBhc3NpZ25lZCB0byIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9zdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IEdFTSBwb3J0IHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgZ2VtX3BvcnRfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSB9LCB7IC5uYW1lID0gImVuY3J5cHRpb25fbW9kZSIsIC5kZXNjciA9ICJFbmFibGUvRGlzYWJsZSB0aGUgZG93bnN0cmVhbSBlbmNyeXB0aW9uIG1vZGUgb2YgdGhlIEdFTSBQb3J0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgZW5jcnlwdGlvbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIiwgLmRlc2NyID0gIlRoZSBkZXN0aW5hdGlvbiBxdWV1ZSBvZiB0aGUgcGFja2V0cyBhcnJpdmluZyBvbiB0aGlzIEdFTSBQb3J0IG9uIHRoZSB1cHN0cmVhbSBkaXJlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGUvRGlzYWJsZSB0aGUgR0VNIFBvcnQgSUQgaW4gdGhlIE9MVCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fZ2VtX3BvcnQgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF90eF9ieXRlcyA9IHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAiVFggYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHR4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfdHhfcGFja2V0cyA9IHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJUWCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF9yeF9wYWNrZXRzID0geyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLmRlc2NyID0gIlJYIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X3J4X2J5dGVzID0geyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJSWCBieXRlcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fZ2VtX3BvcnRfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfdHhfYnl0ZXMsICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfdHhfcGFja2V0cywgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF9yeF9wYWNrZXRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X3J4X2J5dGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAiVFggYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJUWCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC5kZXNjciA9ICJSWCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiUlggYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fZ2VtX3BvcnQgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2dlbV9wb3J0IC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2dlbV9wb3J0IC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fZ2VtX3BvcnQgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogeGdwb25faXdmID09PT0gKi8KKworLyogR3JvdXA6IHhncG9uX2l3ZiAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2l3Zl9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2l3Zl9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2l3Zl9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9pd2Zfa2V5X3Bvbl9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25faXdmX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9pd2Zfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25faXdmX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25faXdmX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9pd2Zfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2l3Zl9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25faXdmIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25faXdmX2NmZ191c19vdGFnX2RpcmVjdF90cGlkID0geyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF90cGlkIiwgLmRlc2NyID0gIlRQSUQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhLCB1c19vdGFnX2RpcmVjdF90cGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9pd2ZfY2ZnX2RzX3RwaWQgPSB7IC5uYW1lID0gImRzX3RwaWQiLCAuZGVzY3IgPSAiUGFja2V0cyBtYXJrZWQgd2l0aCBvbmUgb2YgdGhlIGZpdmUgY29uZmlndXJlZCBEUyBUUElEIG9wdGlvbnMgd2lsbCBiZSBmb3J3YXJkZWQsIGFsbCB0aGUgcmVzdCB3aWxsIGJlIGRyb3BwZWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9EU19UUElELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSwgZHNfdHBpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNV9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9pd2ZfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25faXdmX2NmZ191c19vdGFnX2RpcmVjdF90cGlkLCAmcHJvcF9kZXNjcl94Z3Bvbl9pd2ZfY2ZnX2RzX3RwaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF90cGlkIiwgLmRlc2NyID0gIlRQSUQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhLCB1c19vdGFnX2RpcmVjdF90cGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfSwgeyAubmFtZSA9ICJkc190cGlkIiwgLmRlc2NyID0gIlBhY2tldHMgbWFya2VkIHdpdGggb25lIG9mIHRoZSBmaXZlIGNvbmZpZ3VyZWQgRFMgVFBJRCBvcHRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLCBhbGwgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEsIGRzX3RwaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzVfaGV4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25faXdmX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25faXdmX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiB4Z3Bvbl9uaSA9PT09ICovCisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2tleV9wb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfaHdfcG9uX2lkID0geyAubmFtZSA9ICJod19wb25faWQiLCAuZGVzY3IgPSAiNTEgYml0IFBPTiBpZGVudGlmaWVyLiBUaGlzIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mIHRoZSBkb3duc3RyZWFtIHBoeXNpY2FsIHN5bmNocm9uaXphdGlvbiBibG9jayAoUFNCZCkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgaHdfcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaHdfcG9uX2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2F2YWlsYWJsZV9iYW5kd2lkdGggPSB7IC5uYW1lID0gImF2YWlsYWJsZV9iYW5kd2lkdGgiLCAuZGVzY3IgPSAiUE9OIGF2YWlsYWJsZSBiYW5kd2lkdGggcGFyYW1ldGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhdmFpbGFibGVfYmFuZHdpZHRoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbnVtYmVyX29mX2FjdGl2ZV9vbnVzID0geyAubmFtZSA9ICJudW1iZXJfb2ZfYWN0aXZlX29udXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFjdGl2ZSBPTlVzIG9uIHRoZSBQT04iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bvbl9zdGF0dXMgPSB7IC5uYW1lID0gInBvbl9zdGF0dXMiLCAuZGVzY3IgPSAiUE9OIHN0YXR1cyBwYXJhbWV0ZXJzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHBvbl9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bvbl9kaXN0YW5jZSA9IHsgLm5hbWUgPSAicG9uX2Rpc3RhbmNlIiwgLmRlc2NyID0gIlBPTiBkaXN0YW5jZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwb25fZGlzdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGlzdGFuY2UgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcmFuZ2luZ193aW5kb3dfc2l6ZSA9IHsgLm5hbWUgPSAicmFuZ2luZ193aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJSYW5naW5nIHdpbmRvdyBzaXplIGluIEJXIHVuaXRzICg0LWJ5dGUgd29yZHMgZm9yIDIuNUcgdXBzdHJlYW0sIDE2LWJ5dGUgYmxvY2tzIGZvciAxMEcgdXBzdHJlYW0pIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHJhbmdpbmdfd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2VxZF9jeWNsZXNfbnVtYmVyID0geyAubmFtZSA9ICJlcWRfY3ljbGVzX251bWJlciIsIC5kZXNjciA9ICJIb3cgbWFueSByYW5naW5nIHdpbmRvd3MgYXJlIG9wZW5lZCBkdXJpbmcgYSBzaW5nbGUgT05VIGFjdGl2YXRpb24gcHJvY2VzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGVxZF9jeWNsZXNfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kcmlmdF9jb250cm9sID0geyAubmFtZSA9ICJkcmlmdF9jb250cm9sIiwgLmRlc2NyID0gIkRyaWZ0IGNvbnRyb2wgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkcmlmdF9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbG9zX2FsYXJtX3RocmVzaG9sZCA9IHsgLm5hbWUgPSAibG9zX2FsYXJtX3RocmVzaG9sZCIsIC5kZXNjciA9ICJMT1MgYWxhcm0gdGhyZXNob2xkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBsb3NfYWxhcm1fdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2xvc19pbml0aWFsX3ZhbHVlID0geyAubmFtZSA9ICJsb3NfaW5pdGlhbF92YWx1ZSIsIC5kZXNjciA9ICJMT1MgaW5pdGlhbCB2YWx1ZSBmb2xsb3dpbmcgUE9OIGFjdGl2YXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBsb3NfaW5pdGlhbF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19vbnVfYWxhcm1zX3RocmVzaG9sZHMgPSB7IC5uYW1lID0gIm9udV9hbGFybXNfdGhyZXNob2xkcyIsIC5kZXNjciA9ICJPTlUgYWxhcm1zIHRocmVzaG9sZHMgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfYmVyX21vbml0b3IgPSB7IC5uYW1lID0gImJlcl9tb25pdG9yIiwgLmRlc2NyID0gIkJFUiBtb25pdG9yIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGJlcl9tb25pdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX29udV9hY3RpdmF0aW9uID0geyAubmFtZSA9ICJvbnVfYWN0aXZhdGlvbiIsIC5kZXNjciA9ICJPTlUgYWN0aXZhdGlvbiBjb250cm9sIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3NuX2FjcXVpc2l0aW9uID0geyAubmFtZSA9ICJzbl9hY3F1aXNpdGlvbiIsIC5kZXNjciA9ICJTZXJpYWwgTnVtYmVyIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHNuX2FjcXVpc2l0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfa2V5X2V4Y2hhbmdlID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2UiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmcgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nIiwgLmRlc2NyID0gIlByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyIsIC5kZXNjciA9ICJwcm90ZWN0aW9uIHN3aXRjaGluZyBkZWJ1ZyAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0RFQlVHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgPSB7IC5uYW1lID0gImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAuZGVzY3IgPSAiQ0JSIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2Nicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlID0geyAubmFtZSA9ICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC5kZXNjciA9ICJDQlIgbm9uIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wb3dlcl9tYW5hZ2VtZW50ID0geyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50IiwgLmRlc2NyID0gIk9OVSBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHBvd2VyX21hbmFnZW1lbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyA9IHsgLm5hbWUgPSAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIiwgLmRlc2NyID0gIlRCRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyA9IHsgLm5hbWUgPSAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIsIC5kZXNjciA9ICJQZXJpb2RpYyBTdGFuZGJ5IFBPTiBtb25pdG9yaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kYmFfbW9kZSA9IHsgLm5hbWUgPSAiZGJhX21vZGUiLCAuZGVzY3IgPSAiREJBIG1vZGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkYmFfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RiYV9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bsb2FtX2hhbmRsaW5nID0geyAubmFtZSA9ICJwbG9hbV9oYW5kbGluZyIsIC5kZXNjciA9ICJQbG9hbSBoYW5kbGluZyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QTE9BTV9IQU5ETElORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcGxvYW1faGFuZGxpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19taW5fZGF0YV9hbGxvY19pZCA9IHsgLm5hbWUgPSAibWluX2RhdGFfYWxsb2NfaWQiLCAuZGVzY3IgPSAiTWluIGRhdGEgQWxsb2MgSUQgdmFsdWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBtaW5fZGF0YV9hbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbWluX2RhdGFfZ2VtX3BvcnRfaWQgPSB7IC5uYW1lID0gIm1pbl9kYXRhX2dlbV9wb3J0X2lkIiwgLmRlc2NyID0gIk1pbiBkYXRhIFhHRU0gcG9ydCBJRCB2YWx1ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfR0VNX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG1pbl9kYXRhX2dlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19tdWx0aWNhc3Rfa2V5ID0geyAubmFtZSA9ICJtdWx0aWNhc3Rfa2V5IiwgLmRlc2NyID0gIk11bHRpY2FzdCBYR0VNIHBvcnRzIGVuY3J5cHRpb24gY29udHJvbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTVVMVElDQVNUX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgbXVsdGljYXN0X2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcHJic19jaGVja2VyID0geyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAuZGVzY3IgPSAiVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcHJic19jaGVja2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcmJzX2dlbmVyYXRvciA9IHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAuZGVzY3IgPSAiRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHByYnNfZ2VuZXJhdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3ByYnNfc3RhdHVzID0geyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcmJzX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uID0geyAubmFtZSA9ICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIsIC5kZXNjciA9ICJPcHRpb24gdG8gZGlzYWJsZSB0aGUgYXV0b21hdGljIGRlYWN0aXZhdGlvbiBvZiBPTlVzIGR1ZSB0byBhbGFybXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3VzX2JhbmR3aWR0aF9saW1pdCA9IHsgLm5hbWUgPSAidXNfYmFuZHdpZHRoX2xpbWl0IiwgLmRlc2NyID0gIlRvdGFsIFBPTiB1cHN0cmVhbSBiYW5kd2lkdGggbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgdXNfYmFuZHdpZHRoX2xpbWl0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19hbGxfb251cyA9IHsgLm5hbWUgPSAiYWxsX29udXMiLCAuZGVzY3IgPSAiQWxsIE9OVXMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfT05VUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgYWxsX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2FsbF9tY2FzdF9nZW1fcG9ydHMgPSB7IC5uYW1lID0gImFsbF9tY2FzdF9nZW1fcG9ydHMiLCAuZGVzY3IgPSAiQWxsIG11bHRpY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2RlYnVnID0geyAubmFtZSA9ICJkZWJ1ZyIsIC5kZXNjciA9ICJQT04gTkkgZGVidWcgcGFyYW1ldGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREVCVUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGRlYnVnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfZGVidWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfb251X3VwZ3JhZGVfcGFyYW1zID0geyAubmFtZSA9ICJvbnVfdXBncmFkZV9wYXJhbXMiLCAuZGVzY3IgPSAiT05VIHVwZ3JhZGUgcGFyYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG9udV91cGdyYWRlX3BhcmFtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2RzX2ZlY19tb2RlID0geyAubmFtZSA9ICJkc19mZWNfbW9kZSIsIC5kZXNjciA9ICJEUyBGRUMgbW9kZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGRzX2ZlY19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kYmFfdHlwZSA9IHsgLm5hbWUgPSAiZGJhX3R5cGUiLCAuZGVzY3IgPSAiREJBIGltcGxlbWVudGF0aW9uIHR5cGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkYmFfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RiYV90eXBlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX29udV90dW5pbmcgPSB7IC5uYW1lID0gIm9udV90dW5pbmciLCAuZGVzY3IgPSAib251IHR1bmluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1RVTklORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgb251X3R1bmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19od19wb25faWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19hdmFpbGFibGVfYmFuZHdpZHRoLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbnVtYmVyX29mX2FjdGl2ZV9vbnVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcG9uX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bvbl9kaXN0YW5jZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Jhbmdpbmdfd2luZG93X3NpemUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19lcWRfY3ljbGVzX251bWJlciwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2RyaWZ0X2NvbnRyb2wsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19sb3NfYWxhcm1fdGhyZXNob2xkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbG9zX2luaXRpYWxfdmFsdWUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19vbnVfYWxhcm1zX3RocmVzaG9sZHMsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19iZXJfbW9uaXRvciwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX29udV9hY3RpdmF0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfc25fYWNxdWlzaXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19rZXlfZXhjaGFuZ2UsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2Nicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcG93ZXJfbWFuYWdlbWVudCwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kYmFfbW9kZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bsb2FtX2hhbmRsaW5nLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbWluX2RhdGFfYWxsb2NfaWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19taW5fZGF0YV9nZW1fcG9ydF9pZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX211bHRpY2FzdF9rZXksICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcmJzX2NoZWNrZXIsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcmJzX2dlbmVyYXRvciwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3ByYnNfc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ191c19iYW5kd2lkdGhfbGltaXQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19hbGxfb251cywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2FsbF9tY2FzdF9nZW1fcG9ydHMsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kZWJ1ZywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX29udV91cGdyYWRlX3BhcmFtcywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2RzX2ZlY19tb2RlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfZGJhX3R5cGUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19vbnVfdHVuaW5nIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJod19wb25faWQiLCAuZGVzY3IgPSAiNTEgYml0IFBPTiBpZGVudGlmaWVyLiBUaGlzIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mIHRoZSBkb3duc3RyZWFtIHBoeXNpY2FsIHN5bmNocm9uaXphdGlvbiBibG9jayAoUFNCZCkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBod19wb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9od19wb25faWQgfSwgeyAubmFtZSA9ICJhdmFpbGFibGVfYmFuZHdpZHRoIiwgLmRlc2NyID0gIlBPTiBhdmFpbGFibGUgYmFuZHdpZHRoIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhdmFpbGFibGVfYmFuZHdpZHRoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggfSwgeyAubmFtZSA9ICJudW1iZXJfb2ZfYWN0aXZlX29udXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFjdGl2ZSBPTlVzIG9uIHRoZSBQT04iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAicG9uX3N0YXR1cyIsIC5kZXNjciA9ICJQT04gc3RhdHVzIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXR1cyB9LCB7IC5uYW1lID0gInBvbl9kaXN0YW5jZSIsIC5kZXNjciA9ICJQT04gZGlzdGFuY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwb25fZGlzdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGlzdGFuY2UgfSwgeyAubmFtZSA9ICJyYW5naW5nX3dpbmRvd19zaXplIiwgLmRlc2NyID0gIlJhbmdpbmcgd2luZG93IHNpemUgaW4gQlcgdW5pdHMgKDQtYnl0ZSB3b3JkcyBmb3IgMi41RyB1cHN0cmVhbSwgMTYtYnl0ZSBibG9ja3MgZm9yIDEwRyB1cHN0cmVhbSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCByYW5naW5nX3dpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImVxZF9jeWNsZXNfbnVtYmVyIiwgLmRlc2NyID0gIkhvdyBtYW55IHJhbmdpbmcgd2luZG93cyBhcmUgb3BlbmVkIGR1cmluZyBhIHNpbmdsZSBPTlUgYWN0aXZhdGlvbiBwcm9jZXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgZXFkX2N5Y2xlc19udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZHJpZnRfY29udHJvbCIsIC5kZXNjciA9ICJEcmlmdCBjb250cm9sIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGRyaWZ0X2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZHJpZnRfY29udHJvbCB9LCB7IC5uYW1lID0gImxvc19hbGFybV90aHJlc2hvbGQiLCAuZGVzY3IgPSAiTE9TIGFsYXJtIHRocmVzaG9sZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGxvc19hbGFybV90aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb3NfaW5pdGlhbF92YWx1ZSIsIC5kZXNjciA9ICJMT1MgaW5pdGlhbCB2YWx1ZSBmb2xsb3dpbmcgUE9OIGFjdGl2YXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBsb3NfaW5pdGlhbF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gIm9udV9hbGFybXNfdGhyZXNob2xkcyIsIC5kZXNjciA9ICJPTlUgYWxhcm1zIHRocmVzaG9sZHMgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG9udV9hbGFybXNfdGhyZXNob2xkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyB9LCB7IC5uYW1lID0gImJlcl9tb25pdG9yIiwgLmRlc2NyID0gIkJFUiBtb25pdG9yIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGJlcl9tb25pdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb24iLCAuZGVzY3IgPSAiT05VIGFjdGl2YXRpb24gY29udHJvbCBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgb251X2FjdGl2YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiB9LCB7IC5uYW1lID0gInNuX2FjcXVpc2l0aW9uIiwgLmRlc2NyID0gIlNlcmlhbCBOdW1iZXIgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgc25fYWNxdWlzaXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwga2V5X2V4Y2hhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyIsIC5kZXNjciA9ICJwcm90ZWN0aW9uIHN3aXRjaGluZyBkZWJ1ZyAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIH0sIHsgLm5hbWUgPSAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC5kZXNjciA9ICJDQlIgUmVhbCBUaW1lIGFsbG9jYXRpb24gcHJvZmlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIH0sIHsgLm5hbWUgPSAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAuZGVzY3IgPSAiQ0JSIG5vbiBSZWFsIFRpbWUgYWxsb2NhdGlvbiBwcm9maWxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzIgfSwgeyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50IiwgLmRlc2NyID0gIk9OVSBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwb3dlcl9tYW5hZ2VtZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIsIC5kZXNjciA9ICJUQkQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgfSwgeyAubmFtZSA9ICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIiwgLmRlc2NyID0gIlBlcmlvZGljIFN0YW5kYnkgUE9OIG1vbml0b3JpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB9LCB7IC5uYW1lID0gImRiYV9tb2RlIiwgLmRlc2NyID0gIkRCQSBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgZGJhX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kYmFfbW9kZSB9LCB7IC5uYW1lID0gInBsb2FtX2hhbmRsaW5nIiwgLmRlc2NyID0gIlBsb2FtIGhhbmRsaW5nIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwbG9hbV9oYW5kbGluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIH0sIHsgLm5hbWUgPSAibWluX2RhdGFfYWxsb2NfaWQiLCAuZGVzY3IgPSAiTWluIGRhdGEgQWxsb2MgSUQgdmFsdWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBtaW5fZGF0YV9hbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtaW5fZGF0YV9nZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJNaW4gZGF0YSBYR0VNIHBvcnQgSUQgdmFsdWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3Rfa2V5IiwgLmRlc2NyID0gIk11bHRpY2FzdCBYR0VNIHBvcnRzIGVuY3J5cHRpb24gY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG11bHRpY2FzdF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IH0sIHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLmRlc2NyID0gIlVTIFBSQlMgY2hlY2tlciBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcHJic19jaGVja2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB9LCB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLmRlc2NyID0gIkRTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcmJzX2dlbmVyYXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB9LCB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLmRlc2NyID0gIlJlc3VsdCBvZiBVUyBQUkJTIGNoZWNrZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcmJzX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfc3RhdHVzIH0sIHsgLm5hbWUgPSAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iLCAuZGVzY3IgPSAiT3B0aW9uIHRvIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBkZWFjdGl2YXRpb24gb2YgT05VcyBkdWUgdG8gYWxhcm1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB9LCB7IC5uYW1lID0gInVzX2JhbmR3aWR0aF9saW1pdCIsIC5kZXNjciA9ICJUb3RhbCBQT04gdXBzdHJlYW0gYmFuZHdpZHRoIGxpbWl0IGluIGJ5dGVzIHBlciBzZWNvbmQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgdXNfYmFuZHdpZHRoX2xpbWl0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImFsbF9vbnVzIiwgLmRlc2NyID0gIkFsbCBPTlVzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhbGxfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgfSwgeyAubmFtZSA9ICJhbGxfbWNhc3RfZ2VtX3BvcnRzIiwgLmRlc2NyID0gIkFsbCBtdWx0aWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IH0sIHsgLm5hbWUgPSAiZGVidWciLCAuZGVzY3IgPSAiUE9OIE5JIGRlYnVnIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2RlYnVnIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfcGFyYW1zIiwgLmRlc2NyID0gIk9OVSB1cGdyYWRlIHBhcmFtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG9udV91cGdyYWRlX3BhcmFtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIH0sIHsgLm5hbWUgPSAiZHNfZmVjX21vZGUiLCAuZGVzY3IgPSAiRFMgRkVDIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkc19mZWNfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJkYmFfdHlwZSIsIC5kZXNjciA9ICJEQkEgaW1wbGVtZW50YXRpb24gdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGRiYV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGJhX3R5cGUgfSwgeyAubmFtZSA9ICJvbnVfdHVuaW5nIiwgLmRlc2NyID0gIm9udSB0dW5pbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBvbnVfdHVuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9mZWNfY29kZXdvcmRzID0geyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLmRlc2NyID0gIlJlY2VpdmUgRkVDIGNvZGV3b3JkcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfYmlwMzJfYnl0ZXMgPSB7IC5uYW1lID0gImJpcDMyX2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXAzMiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgYmlwMzJfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9iaXAzMl9lcnJvcnMgPSB7IC5uYW1lID0gImJpcDMyX2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBiaXAzMiBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCBiaXAzMl9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z3RjX2hlYWRlcnMgPSB7IC5uYW1lID0gInJ4X3hndGNfaGVhZGVycyIsIC5kZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBYR1RDIGhlYWRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z3RjX2hlYWRlcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z3RjX2NvcnJlY3RlZCA9IHsgLm5hbWUgPSAicnhfeGd0Y19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgY29ycmVjdGVkIFhHVEMgaGVhZGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGd0Y19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z3RjX3VuY29ycmVjdGVkID0geyAubmFtZSA9ICJyeF94Z3RjX3VuY29ycmVjdGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIHVuY29ycmVjdGVkIFhHVEMgaGVhZGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfVU5DT1JSRUNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z3RjX3VuY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGdlbSA9IHsgLm5hbWUgPSAicnhfeGdlbSIsIC5kZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBYR0VNIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z2VtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGdlbV9kcm9wcGVkID0geyAubmFtZSA9ICJyeF94Z2VtX2Ryb3BwZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBYR0VNIElEIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hnZW1fZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hnZW1faWRsZSA9IHsgLm5hbWUgPSAicnhfeGdlbV9pZGxlIiwgLmRlc2NyID0gIlJlY2VpdmVkIGlkbGUgWEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0lETEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z2VtX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z2VtX2NvcnJlY3RlZCA9IHsgLm5hbWUgPSAicnhfeGdlbV9jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgY29ycmVjdGVkIFhHRU0gZnJhbWVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z2VtX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2NyY19lcnJvciA9IHsgLm5hbWUgPSAicnhfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldHMgd2l0aCBDUkMgZXJyb3IiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9mcmFnbWVudF9lcnJvciA9IHsgLm5hbWUgPSAicnhfZnJhZ21lbnRfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZnJhZ21lbnQgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9mcmFnbWVudF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3BhY2tldHNfZHJvcHBlZCA9IHsgLm5hbWUgPSAicnhfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIkdsb2JhbCBkcm9wcGVkIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9kcm9wcGVkX3Rvb19zaG9ydCA9IHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fc2hvcnQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIHNob3J0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9kcm9wcGVkX3Rvb19zaG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2Ryb3BwZWRfdG9vX2xvbmcgPSB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX2xvbmciLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gbG9uZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9kcm9wcGVkX3Rvb19sb25nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfa2V5X2Vycm9yID0geyAubmFtZSA9ICJyeF9rZXlfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQga2V5IGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2tleV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X3Bsb2FtcyA9IHsgLm5hbWUgPSAidHhfcGxvYW1zIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BMT0FNUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19kcm9wcGVkID0geyAubmFtZSA9ICJyeF9wbG9hbXNfZHJvcHBlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkcm9wcGVkIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc192YWxpZCA9IHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfdmFsaWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2FsbG9jYXRpb25zX3ZhbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfaW52YWxpZCA9IHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc19kaXNhYmxlZCA9IHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfcGxvYW1zID0geyAubmFtZSA9ICJyeF9wbG9hbXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgUGxvYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfcGxvYW1zX25vbl9pZGxlID0geyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgbm9uIGlkbGUgUGxvYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX25vbl9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfcGxvYW1zX2Vycm9yID0geyAubmFtZSA9ICJyeF9wbG9hbXNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZXJyb3IgUGxvYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfY3B1ID0geyAubmFtZSA9ICJyeF9jcHUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgQ1BVIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9jcHUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9vbWNpID0geyAubmFtZSA9ICJyeF9vbWNpIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9vbWNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciA9IHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF9wYWNrZXRzID0geyAubmFtZSA9ICJ0eF9wYWNrZXRzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QQUNLRVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X3hnZW0gPSB7IC5uYW1lID0gInR4X3hnZW0iLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgWEdFTSBmcmFnbWVudHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9YR0VNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfeGdlbSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2NwdSA9IHsgLm5hbWUgPSAidHhfY3B1IiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIENQVSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfb21jaSA9IHsgLm5hbWUgPSAidHhfb21jaSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCA9IHsgLm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGggPSB7IC5uYW1lID0gInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiLCAuZGVzY3IgPSAiVHJhbnNtaXQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBpbGxlZ2FsIGxlbmd0aCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfZHJvcHBlZF90cGlkX21pc3MgPSB7IC5uYW1lID0gInR4X2Ryb3BwZWRfdHBpZF9taXNzIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gVFBJRCBtaXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX3RwaWRfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfdmlkX21pc3MgPSB7IC5uYW1lID0gInR4X2Ryb3BwZWRfdmlkX21pc3MiLCAuZGVzY3IgPSAiVHJhbnNtaXQgcGFja2V0cyBkcm9wZWQgZHVlIHRvIFZJRCBtaXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2Ryb3BwZWRfdmlkX21pc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfZmVjX2NvZGV3b3JkcywgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9iaXAzMl9ieXRlcywgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9iaXAzMl9lcnJvcnMsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGd0Y19oZWFkZXJzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hndGNfY29ycmVjdGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hndGNfdW5jb3JyZWN0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGdlbSwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z2VtX2Ryb3BwZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGdlbV9pZGxlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hnZW1fY29ycmVjdGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2NyY19lcnJvciwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9mcmFnbWVudF9lcnJvciwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9wYWNrZXRzX2Ryb3BwZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfZHJvcHBlZF90b29fc2hvcnQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfZHJvcHBlZF90b29fbG9uZywgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9rZXlfZXJyb3IsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfcGxvYW1zLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19kcm9wcGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX3ZhbGlkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX2ludmFsaWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfcGxvYW1zLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9wbG9hbXNfZXJyb3IsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfY3B1LCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X29tY2ksICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF9wYWNrZXRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X3hnZW0sICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfY3B1LCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X29tY2ksICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfZHJvcHBlZF90cGlkX21pc3MsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfZHJvcHBlZF92aWRfbWlzcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZlY19jb2Rld29yZHMiLCAuZGVzY3IgPSAiUmVjZWl2ZSBGRUMgY29kZXdvcmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYmlwMzJfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMgcHJvdGVjdGVkIGJ5IGJpcDMyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIGJpcDMyX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJpcDMyX2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBiaXAzMiBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgYmlwMzJfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3hndGNfaGVhZGVycyIsIC5kZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBYR1RDIGhlYWRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGd0Y19oZWFkZXJzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3hndGNfY29ycmVjdGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGNvcnJlY3RlZCBYR1RDIGhlYWRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGd0Y19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfeGd0Y191bmNvcnJlY3RlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCB1bmNvcnJlY3RlZCBYR1RDIGhlYWRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGd0Y191bmNvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF94Z2VtIiwgLmRlc2NyID0gIlJlY2VpdmVkIHZhbGlkIFhHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hnZW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfeGdlbV9kcm9wcGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGRyb3BwZWQgWEdFTSBJRCBmcmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGdlbV9kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3hnZW1faWRsZSIsIC5kZXNjciA9ICJSZWNlaXZlZCBpZGxlIFhHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hnZW1faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF94Z2VtX2NvcnJlY3RlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBjb3JyZWN0ZWQgWEdFTSBmcmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGdlbV9jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldHMgd2l0aCBDUkMgZXJyb3IiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYWdtZW50X2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIGZyYWdtZW50IGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9mcmFnbWVudF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wYWNrZXRzX2Ryb3BwZWQiLCAuZGVzY3IgPSAiR2xvYmFsIGRyb3BwZWQgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fc2hvcnQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIHNob3J0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX2xvbmciLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gbG9uZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9kcm9wcGVkX3Rvb19sb25nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2tleV9lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBrZXkgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2tleV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9wbG9hbXMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfZHJvcHBlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkcm9wcGVkIFBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc192YWxpZCIsIC5kZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBhbGxvY2F0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9hbGxvY2F0aW9uc192YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19pbnZhbGlkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGludmFsaWQgYWxsb2NhdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkaXNhYmxlZCBhbGxvY2F0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgbm9uIGlkbGUgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19ub25faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZXJyb3IgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9jcHUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgQ1BVIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X29tY2kiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfeGdlbSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBYR0VNIGZyYWdtZW50cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF94Z2VtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2NwdSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBDUFUgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9jcHUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfb21jaSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQiLCAuZGVzY3IgPSAiVHJhbnNtaXQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBpbGxlZ2FsIGxlbmd0aCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX3RwaWRfbWlzcyIsIC5kZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIFRQSUQgbWlzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX3RwaWRfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX3ZpZF9taXNzIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcGVkIGR1ZSB0byBWSUQgbWlzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX3ZpZF9taXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gc2V0X3Bvbl9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3NldF9wb25fc3RhdGVfcG9uX3N0YXRlID0geyAubmFtZSA9ICJwb25fc3RhdGUiLCAuZGVzY3IgPSAiUE9OIHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSwgcG9uX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3NldF9wb25fc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX3Bvbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9zdGF0ZSIsIC5kZXNjciA9ICJQT04gc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSwgcG9uX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgUE9OIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gcmVzZXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9yZXNldF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGRpc2FibGVfc2VyaWFsX251bWJlciAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sID0geyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wsICZwcm9wX2Rlc2NyX3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEiLCAuZGVzY3IgPSAiRGlzYWJsZSBTZXJpYWwgTnVtYmVyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBzZXRfb251X3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9vbnVfc3RhdGUgPSB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJOZXcgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiAgVGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1heSBiZSBjb25maWd1cmVkIGJ5IHRoZSBYR1BPTiBOSSBjb25maWd1cmF0aW9uIG9iamVjdCA6IHhncG9uX25pLmNmZy5zbl9hY3F1aXNpdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfc2V0X29udV9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX3NldF9vbnVfc3RhdGVfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBvcGVyYXRpb24gc3RhdGUgb2YgYWxsIE9OVXMuICBUaGUgZGVmYXVsdCBvcGVyYXRpb24gbWF5IGJlIGNvbmZpZ3VyZWQgYnkgdGhlIFhHUE9OIE5JIGNvbmZpZ3VyYXRpb24gb2JqZWN0IDogeGdwb25fbmkuY2ZnLnNuX2FjcXVpc2l0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhIiwgLmRlc2NyID0gIlNldCB0aGUgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHJ1bl9zcGVjaWFsX2J3X21hcCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9udW1iZXJfb2ZfY3ljbGUgPSB7IC5uYW1lID0gIm51bWJlcl9vZl9jeWNsZSIsIC5kZXNjciA9ICJudW1iZXIgb2YgY3ljbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX05VTUJFUl9PRl9DWUNMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSwgbnVtYmVyX29mX2N5Y2xlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2FsbG9jYXRpb25fbnVtYmVyID0geyAubmFtZSA9ICJhbGxvY2F0aW9uX251bWJlciIsIC5kZXNjciA9ICJhbGxvY2F0aW9uIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQUxMT0NBVElPTl9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEsIGFsbG9jYXRpb25fbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2J3X21hcF9hcnJheSA9IHsgLm5hbWUgPSAiYndfbWFwX2FycmF5IiwgLmRlc2NyID0gImJ3IG1hcCBhcnJheSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQldfTUFQX0FSUkFZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhLCBid19tYXBfYXJyYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfbnVtYmVyX29mX2N5Y2xlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfYWxsb2NhdGlvbl9udW1iZXIsICZwcm9wX2Rlc2NyX3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9id19tYXBfYXJyYXkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm51bWJlcl9vZl9jeWNsZSIsIC5kZXNjciA9ICJudW1iZXIgb2YgY3ljbGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhLCBudW1iZXJfb2ZfY3ljbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJhbGxvY2F0aW9uX251bWJlciIsIC5kZXNjciA9ICJhbGxvY2F0aW9uIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEsIGFsbG9jYXRpb25fbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYndfbWFwX2FycmF5IiwgLmRlc2NyID0gImJ3IG1hcCBhcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEsIGJ3X21hcF9hcnJheSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEiLCAuZGVzY3IgPSAiUnVuIFNwZWNpYWwgQlcgTWFwIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfd2luZG93X3R5cGUgPSB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLmRlc2NyID0gIlR5cGUgb2Ygc2lsZW50IG1lYXN1cmVtZW50IHRvIGV4ZWN1dGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIHdpbmRvd190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfYWxsb2NfaWQgPSB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFMTE9DIElEIHRvIHNjYW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHRvIHNjYW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSB7IC5uYW1lID0gInNlY29uZF9yYW5naW5nX3dpbmRvdyIsIC5kZXNjciA9ICJOb3QgY3VycmVudGx5IHN1cHBvcnRlZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIHNlY29uZF9yYW5naW5nX3dpbmRvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3dpbmRvd190eXBlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2FsbG9jX2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X29udV9pZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zZWNvbmRfcmFuZ2luZ193aW5kb3cgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ3aW5kb3dfdHlwZSIsIC5kZXNjciA9ICJUeXBlIG9mIHNpbGVudCBtZWFzdXJlbWVudCB0byBleGVjdXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIHdpbmRvd190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFMTE9DIElEIHRvIHNjYW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0byBzY2FuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzZWNvbmRfcmFuZ2luZ193aW5kb3ciLCAuZGVzY3IgPSAiTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgc2Vjb25kX3Jhbmdpbmdfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIiwgLmRlc2NyID0gIlJvZ3VlIERldGVjdGlvbiBXaW5kb3ciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9yZXN1bHQgPSB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3ByZXZpb3VzX3N0YXRlID0geyAubmFtZSA9ICJwcmV2aW91c19zdGF0ZSIsIC5kZXNjciA9ICJQcmV2aW91cyBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgcHJldmlvdXNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIm5ldyBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Jlc3VsdCwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcmV2aW91c19zdGF0ZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9uZXdfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gInByZXZpb3VzX3N0YXRlIiwgLmRlc2NyID0gIlByZXZpb3VzIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEsIHByZXZpb3VzX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXRlIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIm5ldyBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGUgQ2hhbmdlIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGxvcyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2xvc19zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfTE9TX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfbG9zX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfbG9zX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2xvc19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEiLCAuZGVzY3IgPSAiTE9TIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2xvc19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2xvc19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2xvc19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCA9IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEiLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBTd2l0Y2hpbmcgVHJhZmZpYyBSZXN1bWUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX29udXMgPSB7IC5uYW1lID0gIm9udXMiLCAuZGVzY3IgPSAiT05VcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEsIG9udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9vbnVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udXMiLCAuZGVzY3IgPSAiT05VcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSwgb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSIsIC5kZXNjciA9ICJBZnRlciBhIHN3aXRjaG92ZXIgaXMgY29tcGxldGUgYW5kIGFsbCBPTlUgcmFuZ2luZyB0aW1lcyBoYXZlIHN0YWJpbGl6ZWQsIHRoaXMgaW5kaWNhdGlvbiBpcyBzZW50IHRvIGluZm9ybSB0aGUgaG9zdCBvZiBhbGwgbmV3IE9OVSBFUURzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIFN3aXRjaGluZyBTd2l0Y2hvdmVyIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciA9IHsgLm5hbWUgPSAibnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciIsIC5kZXNjciA9ICJudW1iZXIgb2YgZGV0ZWN0ZWQgZGVsaW1pdGVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9ERVRFQ1RFRF9ERUxJTUlURVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSwgbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9lbmVyZ3lfZGV0ZWN0X3NpZ25hbCA9IHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdF9zaWduYWwiLCAuZGVzY3IgPSAiZW5lcmd5IGRldGVjdCBzaWduYWwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSwgZW5lcmd5X2RldGVjdF9zaWduYWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX251bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2VuZXJneV9kZXRlY3Rfc2lnbmFsIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGRldGVjdGVkIGRlbGltaXRlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSwgbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJlbmVyZ3lfZGV0ZWN0X3NpZ25hbCIsIC5kZXNjciA9ICJlbmVyZ3kgZGV0ZWN0IHNpZ25hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSwgZW5lcmd5X2RldGVjdF9zaWduYWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJTdGFuZGJ5IFBPTiBNb25pdG9yaW5nIEN5Y2xlIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIG9udV9kaXNjb3ZlcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9yYW5naW5nX3RpbWUgPSB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJyYW5naW5nIHRpbWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHJhbmdpbmdfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJvbnVfaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzID0geyAubmFtZSA9ICJ1cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIiwgLmRlc2NyID0gIlVwc3RyZWFtIGxpbmUgcmF0ZSBjYXBhYmlsaXRpZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCB1cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2N1cnJlbnRfZG93bnN0cmVhbV9wb25faWQgPSB7IC5uYW1lID0gImN1cnJlbnRfZG93bnN0cmVhbV9wb25faWQiLCAuZGVzY3IgPSAiVGhlIFBPTi1JRCByZWNlaXZlZCBieSB0aGUgT05VIGluIGl0cyBjdXJyZW50IGRvd25zdHJlYW0gd2F2ZWxlbmd0aCBjaGFubmVsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfRE9XTlNUUkVBTV9QT05fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgY3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2N1cnJlbnRfdXBzdHJlYW1fcG9uX2lkID0geyAubmFtZSA9ICJjdXJyZW50X3Vwc3RyZWFtX3Bvbl9pZCIsIC5kZXNjciA9ICJUaGUgUE9OLUlEIG9mIHRoZSBDaGFubmVsIFByb2ZpbGUgY29udGFpbmluZyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgdXBzdHJlYW0gd2F2ZWxlbmd0aCBjaGFubmVsIGluIHdoaWNoIHRoZSBPTlUgaXMgdHJhbnNtaXR0aW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfVVBTVFJFQU1fUE9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIGN1cnJlbnRfdXBzdHJlYW1fcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfY2FsaWJyYXRpb25fcmVjb3JkID0geyAubmFtZSA9ICJjYWxpYnJhdGlvbl9yZWNvcmQiLCAuZGVzY3IgPSAiQ2FsaWJyYXRpb24gcmVjb3JkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NBTElCUkFUSU9OX1JFQ09SRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBjYWxpYnJhdGlvbl9yZWNvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF90dW5pbmdfZ3JhbnVsYXJpdHkgPSB7IC5uYW1lID0gInR1bmluZ19ncmFudWxhcml0eSIsIC5kZXNjciA9ICJUaGUgdHVuaW5nIGdyYW51bGFyaXR5IG9mIHRoZSBPTlUgdHJhbnNtaXR0ZWQgZXhwcmVzc2VkIGluIHVuaXRzIG9mIDFHaHouIFZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIE9OVSBkb2VzIG5vdCBzdXBwb3J0IGZpbmUgdHVuaW5nIC8gZGl0aGVyaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1RVTklOR19HUkFOVUxBUklUWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCB0dW5pbmdfZ3JhbnVsYXJpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9zdGVwX3R1bmluZ190aW1lID0geyAubmFtZSA9ICJzdGVwX3R1bmluZ190aW1lIiwgLmRlc2NyID0gIlRoZSB2YWx1ZSBvZiB0aGUgdHVuaW5nIHRpbWUgZm9yIGEgc2luZ2xlIGdyYW51bGFyaXR5IHN0ZXAsIGV4cHJlc3NlZCBpbiB1bml0IG9mIFBIWSBmcmFtZXMuIFRoZSB2YWx1ZSAwIGluZGljYXRlcyB0aGF0IHRoZSBPTlUgZG9lcyBub3Qgc3VwcG9ydCBmaW5lIHR1bmluZyAvIGRpdGhlcmluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TVEVQX1RVTklOR19USU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHN0ZXBfdHVuaW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9hdHRlbnVhdGlvbiA9IHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAuZGVzY3IgPSAiVGhlIE9OVSBhdHRlbnVhdGlvbiBpbiBzdGVwcyBvZiAzZEIgYXQgdGhlIHRpbWUgb2YgdGhlIG1lc3NhZ2UgdHJhbnNtaXNzaW9uIGFzIHBhcnQgb2YgdGhlIHBvd2VyIGxldmVsbGluZyByZXBvcnQuIFZhbHVlIG9mIDAgcmVwcmVzZW50cyB1bi1hdHRlbnVhdGVkIHRyYW5zbWlzc2lvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9BVFRFTlVBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBhdHRlbnVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX3Bvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMgPSB7IC5uYW1lID0gInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMiLCAuZGVzY3IgPSAiVGhlIE9OVSBzdXBwb3J0cyBhdHRlbnVhdGlvbiBsZXZlbCBpbiBzdGVwIG9mIDNkQiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX3NlcmlhbF9udW1iZXIsICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX3JhbmdpbmdfdGltZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfb251X2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9jdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9jdXJyZW50X3Vwc3RyZWFtX3Bvbl9pZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfY2FsaWJyYXRpb25fcmVjb3JkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF90dW5pbmdfZ3JhbnVsYXJpdHksICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX3N0ZXBfdHVuaW5nX3RpbWUsICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2F0dGVudWF0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSwgeyAubmFtZSA9ICJyYW5naW5nX3RpbWUiLCAuZGVzY3IgPSAicmFuZ2luZyB0aW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCByYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIm9udV9pZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMiLCAuZGVzY3IgPSAiVXBzdHJlYW0gbGluZSByYXRlIGNhcGFiaWxpdGllcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgfSwgeyAubmFtZSA9ICJjdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkIiwgLmRlc2NyID0gIlRoZSBQT04tSUQgcmVjZWl2ZWQgYnkgdGhlIE9OVSBpbiBpdHMgY3VycmVudCBkb3duc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgY3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImN1cnJlbnRfdXBzdHJlYW1fcG9uX2lkIiwgLmRlc2NyID0gIlRoZSBQT04tSUQgb2YgdGhlIENoYW5uZWwgUHJvZmlsZSBjb250YWluaW5nIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgaW4gd2hpY2ggdGhlIE9OVSBpcyB0cmFuc21pdHRpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIGN1cnJlbnRfdXBzdHJlYW1fcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiY2FsaWJyYXRpb25fcmVjb3JkIiwgLmRlc2NyID0gIkNhbGlicmF0aW9uIHJlY29yZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgY2FsaWJyYXRpb25fcmVjb3JkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IH0sIHsgLm5hbWUgPSAidHVuaW5nX2dyYW51bGFyaXR5IiwgLmRlc2NyID0gIlRoZSB0dW5pbmcgZ3JhbnVsYXJpdHkgb2YgdGhlIE9OVSB0cmFuc21pdHRlZCBleHByZXNzZWQgaW4gdW5pdHMgb2YgMUdoei4gVmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgT05VIGRvZXMgbm90IHN1cHBvcnQgZmluZSB0dW5pbmcgLyBkaXRoZXJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHR1bmluZ19ncmFudWxhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInN0ZXBfdHVuaW5nX3RpbWUiLCAuZGVzY3IgPSAiVGhlIHZhbHVlIG9mIHRoZSB0dW5pbmcgdGltZSBmb3IgYSBzaW5nbGUgZ3JhbnVsYXJpdHkgc3RlcCwgZXhwcmVzc2VkIGluIHVuaXQgb2YgUEhZIGZyYW1lcy4gVGhlIHZhbHVlIDAgaW5kaWNhdGVzIHRoYXQgdGhlIE9OVSBkb2VzIG5vdCBzdXBwb3J0IGZpbmUgdHVuaW5nIC8gZGl0aGVyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBzdGVwX3R1bmluZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAuZGVzY3IgPSAiVGhlIE9OVSBhdHRlbnVhdGlvbiBpbiBzdGVwcyBvZiAzZEIgYXQgdGhlIHRpbWUgb2YgdGhlIG1lc3NhZ2UgdHJhbnNtaXNzaW9uIGFzIHBhcnQgb2YgdGhlIHBvd2VyIGxldmVsbGluZyByZXBvcnQuIFZhbHVlIG9mIDAgcmVwcmVzZW50cyB1bi1hdHRlbnVhdGVkIHRyYW5zbWlzc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgYXR0ZW51YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIiwgLmRlc2NyID0gIlRoZSBPTlUgc3VwcG9ydHMgYXR0ZW51YXRpb24gbGV2ZWwgaW4gc3RlcCBvZiAzZEIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgRGlzY292ZXJlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGNwdV9wYWNrZXRzX2ZhaWx1cmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2Vycm9yID0geyAubmFtZSA9ICJlcnJvciIsIC5kZXNjciA9ICJUaGUgZXJyb3IgdGhhdCB3YXMgZW5jb3VudGVyZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhLCBlcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2dlbV9wb3J0X2lkID0geyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJUaGUgR0VNIHBvcnQgdGhhdCBjYXVzZWQgdGhlIGVycm9yLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSwgZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZXJyb3IsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZ2VtX3BvcnRfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcnJvciIsIC5kZXNjciA9ICJUaGUgZXJyb3IgdGhhdCB3YXMgZW5jb3VudGVyZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEsIGVycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvciB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBHRU0gcG9ydCB0aGF0IGNhdXNlZCB0aGUgZXJyb3IuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEsIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSIsIC5kZXNjciA9ICJBIGZhaWx1cmUgd2FzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgXCJjcHVfcGFja2V0c1wiIHByb3h5IG9wZXJhdGlvbi4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBjcHVfcGFja2V0cyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX3BhY2tldF90eXBlID0geyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC5kZXNjciA9ICJwYWNrZXQgdHlwZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBwYWNrZXRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF90eXBlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY3B1X3BhY2tldHNfY2FsY19jcmMgPSB7IC5uYW1lID0gImNhbGNfY3JjIiwgLmRlc2NyID0gImNhbGMgY3JjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGNhbGNfY3JjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY3B1X3BhY2tldHNfZ2VtX3BvcnRfbGlzdCA9IHsgLm5hbWUgPSAiZ2VtX3BvcnRfbGlzdCIsIC5kZXNjciA9ICJnZW0gcG9ydCBsaXN0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgZ2VtX3BvcnRfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9jcHVfcGFja2V0c19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX3BhY2tldF90eXBlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jcHVfcGFja2V0c19jYWxjX2NyYywgJnByb3BfZGVzY3JfeGdwb25fbmlfY3B1X3BhY2tldHNfZ2VtX3BvcnRfbGlzdCwgJnByb3BfZGVzY3JfeGdwb25fbmlfY3B1X3BhY2tldHNfYnVmZmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLmRlc2NyID0gInBhY2tldCB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBwYWNrZXRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF90eXBlIH0sIHsgLm5hbWUgPSAiY2FsY19jcmMiLCAuZGVzY3IgPSAiY2FsYyBjcmMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGNhbGNfY3JjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfbGlzdCIsIC5kZXNjciA9ICJnZW0gcG9ydCBsaXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBnZW1fcG9ydF9saXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSIsIC5kZXNjciA9ICJYR1BPTiBDUFUgcGFja2V0cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGJyb2FkY2FzdF9wbG9hbV9wYWNrZXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3Bsb2FtID0geyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSwgcGxvYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNDAgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9wbG9hbSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBsb2FtIiwgLmRlc2NyID0gInBsb2FtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEsIHBsb2FtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzQwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhIiwgLmRlc2NyID0gIkJyb2FkY2FzdCBQTE9BTSBQYWNrZXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF93aW5kb3dfdHlwZSA9IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAuZGVzY3IgPSAiU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgd2luZG93X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9tZWFzdXJlbWVudF9zdGF0dXMgPSB7IC5uYW1lID0gIm1lYXN1cmVtZW50X3N0YXR1cyIsIC5kZXNjciA9ICJTdGF0dXMgb2YgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24gcmVzdWx0LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIG1lYXN1cmVtZW50X3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfYWxsb2NfaWQgPSB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jLUlEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVS1JRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lzX2RlbGluZWF0aW9uID0geyAubmFtZSA9ICJpc19kZWxpbmVhdGlvbiIsIC5kZXNjciA9ICJCdXJzdCBEZWxpbmVhdGlvbiBkZXRlY3RlZCBkdXJpbmcgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfREVMSU5FQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19kZWxpbmVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZWQgPSB7IC5uYW1lID0gImlzX2VkIiwgLmRlc2NyID0gIklzIEVEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcnhfZGF0YSA9IHsgLm5hbWUgPSAicnhfZGF0YSIsIC5kZXNjciA9ICJDYXB0dXJlZCBQTE9BTXUgbWVzc2FnZSBpZiB0aGUgYnVyc3QgZGVsaW5pZWF0aW9uIHdhcyBkZXRlY3RlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcnhfZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wbG9hbV9yZWNlaXZlZF9vbnVfaWQgPSB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX29udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgcmVjZWl2ZWQgaW4gdGhlIHBsb2FtIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGxvYW1fcmVjZWl2ZWRfb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcGxvYW1fcmVjZWl2ZWRfbWljX2Vycm9yID0geyAubmFtZSA9ICJwbG9hbV9yZWNlaXZlZF9taWNfZXJyb3IiLCAuZGVzY3IgPSAiTWljIGVycm9yIGluIHRoZSByZWNlaXZlZCBwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX01JQ19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHBsb2FtX3JlY2VpdmVkX21pY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3dpbmRvd190eXBlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX21lYXN1cmVtZW50X3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9hbGxvY19pZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9vbnVfaWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZGVsaW5lYXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcnhfZGF0YSwgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wbG9hbV9yZWNlaXZlZF9vbnVfaWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcGxvYW1fcmVjZWl2ZWRfbWljX2Vycm9yIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAuZGVzY3IgPSAiU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCB3aW5kb3dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgfSwgeyAubmFtZSA9ICJtZWFzdXJlbWVudF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uIHJlc3VsdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgbWVhc3VyZW1lbnRfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MtSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVS1JRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiaXNfZGVsaW5lYXRpb24iLCAuZGVzY3IgPSAiQnVyc3QgRGVsaW5lYXRpb24gZGV0ZWN0ZWQgZHVyaW5nIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19kZWxpbmVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImlzX2VkIiwgLmRlc2NyID0gIklzIEVEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIGlzX2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicnhfZGF0YSIsIC5kZXNjciA9ICJDYXB0dXJlZCBQTE9BTXUgbWVzc2FnZSBpZiB0aGUgYnVyc3QgZGVsaW5pZWF0aW9uIHdhcyBkZXRlY3RlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcnhfZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfb251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCByZWNlaXZlZCBpbiB0aGUgcGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGxvYW1fcmVjZWl2ZWRfb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX21pY19lcnJvciIsIC5kZXNjciA9ICJNaWMgZXJyb3IgaW4gdGhlIHJlY2VpdmVkIHBsb2FtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHBsb2FtX3JlY2VpdmVkX21pY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJSb2d1ZSBkZXRlY3Rpb24gY29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBlbmFibGVfYWxsX29udXNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF90b2Rfc3RyaW5nID0geyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLmRlc2NyID0gInRvZF9zdHJpbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHRvZF9zdHJpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfNjQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfc2ZjID0geyAubmFtZSA9ICJzZmMiLCAuZGVzY3IgPSAic2ZjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHNmYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcnRjX29mZnNldF9zZWMgPSB7IC5uYW1lID0gInJ0Y19vZmZzZXRfc2VjIiwgLmRlc2NyID0gInJ0Y19vZmZzZXRfc2VjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgcnRjX29mZnNldF9zZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3J0Y19vZmZzZXRfbnNlYyA9IHsgLm5hbWUgPSAicnRjX29mZnNldF9uc2VjIiwgLmRlc2NyID0gInJ0Y19vZmZzZXRfbnNlYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBydGNfb2Zmc2V0X25zZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfdG9kX3N0cmluZywgJnByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3NmYywgJnByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3J0Y19vZmZzZXRfc2VjLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcnRjX29mZnNldF9uc2VjLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLmRlc2NyID0gInRvZF9zdHJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCB0b2Rfc3RyaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0IH0sIHsgLm5hbWUgPSAic2ZjIiwgLmRlc2NyID0gInNmYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHNmYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJydGNfb2Zmc2V0X3NlYyIsIC5kZXNjciA9ICJydGNfb2Zmc2V0X3NlYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHJ0Y19vZmZzZXRfc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ0Y19vZmZzZXRfbnNlYyIsIC5kZXNjciA9ICJydGNfb2Zmc2V0X25zZWMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBydGNfb2Zmc2V0X25zZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiVE9EIHJlcXVlc3QgY29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gdG9kX3JlcXVlc3QgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV90b2RfcmVxdWVzdF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHN0YXJ0X29udV91cGdyYWRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfbGlzdF9vZl9vbnVfaWRzID0geyAubmFtZSA9ICJsaXN0X29mX29udV9pZHMiLCAuZGVzY3IgPSAiTGlzdCBvZiBPTlUgSURzIHRvIHVwZ3JhZGUgdGhlIGZpcm13YXJlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSwgbGlzdF9vZl9vbnVfaWRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfbGlzdF9vZl9vbnVfaWRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxpc3Rfb2Zfb251X2lkcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVSBJRHMgdG8gdXBncmFkZSB0aGUgZmlybXdhcmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhLCBsaXN0X29mX29udV9pZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEiLCAuZGVzY3IgPSAiT0xUIHRvIE9OVSBmaXJtd2FyZSB0cmFuc2ZlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIG9udV91cGdyYWRlX2NvbXBsZXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiU3VjY2VzcyBvciBmYWlsdXJlLiAgQWdhaW5zdCBlbnRpcmUgdXBncmFkZSBwcm9jZXNzLiAgVGhpcyBpcyBhZGRlZCBwZXIgQW5hdCdzIHJlcXVlc3QuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9saXN0X29mX2ZhaWxlZF9lbnRpdGllcyA9IHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAuZGVzY3IgPSAiTGlzdCBvZiBPTlUtSURzIHRoZSB1cGdyYWRlIGZhaWxlZCBmb3IuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEsIGxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEFnYWluc3QgZW50aXJlIHVwZ3JhZGUgcHJvY2Vzcy4gIFRoaXMgaXMgYWRkZWQgcGVyIEFuYXQncyByZXF1ZXN0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAuZGVzY3IgPSAiTGlzdCBvZiBPTlUtSURzIHRoZSB1cGdyYWRlIGZhaWxlZCBmb3IuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEiLCAuZGVzY3IgPSAiT05VIFVwZ3JhZGUgQ29tcGxldGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBhZGp1c3RfdHhfd2F2ZWxlbmd0aCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX3NlcmlhbF9udW1iZXIgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAiU2VyaWFsIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9TRVJJQUxfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZnJlcWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gPSB7IC5uYW1lID0gImZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIiwgLmRlc2NyID0gIkZyZXF1ZW5jeSBhZGp1c3RtZW50IGRpcmVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhLCBmcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2ZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUgPSB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUiLCAuZGVzY3IgPSAiVGhlIHNpemUgb2YgdGhlIGZyZXF1bmN5IGFkanVzdG1lbnQgaW4gdW5pdHMgb2YgMC4xIEdoeiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX3NlcmlhbF9udW1iZXIsICZwcm9wX2Rlc2NyX3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2ZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAiU2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSwgeyAubmFtZSA9ICJmcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiIsIC5kZXNjciA9ICJGcmVxdWVuY3kgYWRqdXN0bWVudCBkaXJlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIH0sIHsgLm5hbWUgPSAiZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSIsIC5kZXNjciA9ICJUaGUgc2l6ZSBvZiB0aGUgZnJlcXVuY3kgYWRqdXN0bWVudCBpbiB1bml0cyBvZiAwLjEgR2h6IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEiLCAuZGVzY3IgPSAiSW5zdHJ1Y3QgYW4gdW5hc3NpZ25lZCBPTlUgdG8gYWRqdXN0IGl0cyB1cHN0cmVhbSB0cmFuc21pdHRlciB3YXZlbGVuZ3RoIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgPSB7IC5uYW1lID0gImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19jcHVfcGFja2V0c19mYWlsdXJlID0geyAubmFtZSA9ICJjcHVfcGFja2V0c19mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjcHVfcGFja2V0c19mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgY3B1X3BhY2tldHNfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0geyAubmFtZSA9ICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19sb3MgPSB7IC5uYW1lID0gImxvcyIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibG9zXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBsb3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19vbnVfZGlzY292ZXJlZCA9IHsgLm5hbWUgPSAib251X2Rpc2NvdmVyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9kaXNjb3ZlcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIG9udV9kaXNjb3ZlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfb251X3VwZ3JhZGVfY29tcGxldGUgPSB7IC5uYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdXBncmFkZV9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ID0geyAubmFtZSA9ICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRlX2NoYW5nZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfdG9kX3JlcXVlc3RfY29tcGxldGVkID0geyAubmFtZSA9ICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInRvZF9yZXF1ZXN0X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgdG9kX3JlcXVlc3RfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX2NwdV9wYWNrZXRzX2ZhaWx1cmUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfbG9zLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19vbnVfZGlzY292ZXJlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfb251X3VwZ3JhZGVfY29tcGxldGUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiY3B1X3BhY2tldHNfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY3B1X3BhY2tldHNfZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgY3B1X3BhY2tldHNfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxvcyIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibG9zXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBsb3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfZGlzY292ZXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2Rpc2NvdmVyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIG9udV9kaXNjb3ZlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV91cGdyYWRlX2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRlX2NoYW5nZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInRvZF9yZXF1ZXN0X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgdG9kX3JlcXVlc3RfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IHhncG9uX29udSA9PT09ICovCisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIm9udSBpZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X29udV9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAib251IGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfb251X3N0YXRlID0geyAubmFtZSA9ICJvbnVfc3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBPTlUgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX29udV9vbGRfc3RhdGUgPSB7IC5uYW1lID0gIm9udV9vbGRfc3RhdGUiLCAuZGVzY3IgPSAib251IG9sZCBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIG9udV9vbGRfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSBvZiBhbGwgT05VIGFsYXJtcy4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgYWxhcm1fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3JlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMgPSB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMiLCAuZGVzY3IgPSAiQUVTIGVuY3J5cHRpb24ga2V5cyBsZWFybmVkIGR1cmluZyBPTlUgcmVnaXN0cmF0aW9uLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2N1cnJlbnRfZW5jcnlwdGlvbl9rZXkgPSB7IC5uYW1lID0gImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkiLCAuZGVzY3IgPSAiQ3VycmVudCBBRVMgZW5jcnlwdGlvbiBrZXkuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DVVJSRU5UX0VOQ1JZUFRJT05fS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gIk9OVSBzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yZWdpc3RyYXRpb25faWQgPSB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC5kZXNjciA9ICJPTlUgcmVnaXN0cmF0aW9uIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyA9IHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmciLCAuZGVzY3IgPSAiRW5hYmxlXFxEaXNhYmxlIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gbGVhcm5pbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSURfQVVUT19MRUFSTklORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yYW5naW5nX2J1cnN0X3Byb2ZpbGUgPSB7IC5uYW1lID0gInJhbmdpbmdfYnVyc3RfcHJvZmlsZSIsIC5kZXNjciA9ICJCdXJzdCBwcm9maWxlIGluZGV4IGZvciByYW5naW5nIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19CVVJTVF9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmFuZ2luZ19idXJzdF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19kYXRhX2J1cnN0X3Byb2ZpbGUgPSB7IC5uYW1lID0gImRhdGFfYnVyc3RfcHJvZmlsZSIsIC5kZXNjciA9ICJCdXJzdCBwcm9maWxlIGluZGV4IGZvciBkYXRhIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgZGF0YV9idXJzdF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yYW5naW5nX3RpbWUgPSB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJPTlUgcmFuZ2luZyB0aW1lLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmFuZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5ID0geyAubmFtZSA9ICJkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiLCAuZGVzY3IgPSAiVGhpcyBPTlUgd2FzIGRpc2FibGVkIGFmdGVyIFNOIGRpc2NvdmVyeSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19kZWFjdGl2YXRpb25fcmVhc29uID0geyAubmFtZSA9ICJkZWFjdGl2YXRpb25fcmVhc29uIiwgLmRlc2NyID0gImRlYWN0aXZhdGlvbiByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBkZWFjdGl2YXRpb25fcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfYWxsX2dlbV9wb3J0cyA9IHsgLm5hbWUgPSAiYWxsX2dlbV9wb3J0cyIsIC5kZXNjciA9ICJBbGwgdW5pY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgT05VLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGFsbF9nZW1fcG9ydHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2FsbF9hbGxvY3MgPSB7IC5uYW1lID0gImFsbF9hbGxvY3MiLCAuZGVzY3IgPSAiQWxsIGFsbG9jIElEcyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBPTlUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgYWxsX2FsbG9jcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19leHRlbmRlZF9ndWFyZF90aW1lID0geyAubmFtZSA9ICJleHRlbmRlZF9ndWFyZF90aW1lIiwgLmRlc2NyID0gIkFkZGl0aW9uYWwgZ3VhcmQgdGltZSAoaW4gYnl0ZXMpIGZvciB0aGlzIE9OVS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3VzX2xpbmVfcmF0ZSA9IHsgLm5hbWUgPSAidXNfbGluZV9yYXRlIiwgLmRlc2NyID0gIlVTIGxpbmUgcmF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHVzX2xpbmVfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2NhbGlicmF0aW9uX3JlY29yZCA9IHsgLm5hbWUgPSAiY2FsaWJyYXRpb25fcmVjb3JkIiwgLmRlc2NyID0gIkNhbGlicmF0aW9uIHJlY29yZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NBTElCUkFUSU9OX1JFQ09SRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGNhbGlicmF0aW9uX3JlY29yZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfdHVuaW5nX2dyYW51bGFyaXR5ID0geyAubmFtZSA9ICJ0dW5pbmdfZ3JhbnVsYXJpdHkiLCAuZGVzY3IgPSAiVGhlIHR1bmluZyBncmFudWxhcml0eSBvZiB0aGUgT05VIHRyYW5zbWl0dGVkIGV4cHJlc3NlZCBpbiB1bml0cyBvZiAxR0h6LiBWYWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSBPTlUgZG9lcyBub3Qgc3VwcG9ydCBmaW5lIHR1bmluZy9kaXRoZXJpbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCB0dW5pbmdfZ3JhbnVsYXJpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3N0ZXBfdHVuaW5nX3RpbWUgPSB7IC5uYW1lID0gInN0ZXBfdHVuaW5nX3RpbWUiLCAuZGVzY3IgPSAiVGhlIHZhbHVlIG9mIHRoZSB0dW5pbmcgdGltZSBmb3IgYSBzaW5nbGUgZ3JhbnVsYXJpdHkgc3RlcCwgZXhwcmVzc2VkIGluIHVuaXRzIG9mIFBIWSBmcmFtZXMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU1RFUF9UVU5JTkdfVElNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHN0ZXBfdHVuaW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3Bvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMgPSB7IC5uYW1lID0gInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMiLCAuZGVzY3IgPSAiUG93ZXIgbGV2ZWxsaW5nIGNhcGFiaWxpdGllcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgPSB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyIsIC5kZXNjciA9ICJUaGlzIHZhbHVlIGluZGljYXRlIHRoYXQgdGhlIG9udSBpcyBpbiB0aGUgbWlkZGxlIG9mIHJlcXVlc3QgcmVnaXN0cmF0aW9uIHByb2Nlc3MiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX29udV9zdGF0ZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19vbnVfb2xkX3N0YXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2FsYXJtX3N0YXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3JlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfY3VycmVudF9lbmNyeXB0aW9uX2tleSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19zZXJpYWxfbnVtYmVyLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3JlZ2lzdHJhdGlvbl9pZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZywgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yYW5naW5nX2J1cnN0X3Byb2ZpbGUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZGF0YV9idXJzdF9wcm9maWxlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3JhbmdpbmdfdGltZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnksICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZGVhY3RpdmF0aW9uX3JlYXNvbiwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19hbGxfZ2VtX3BvcnRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2FsbF9hbGxvY3MsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZXh0ZW5kZWRfZ3VhcmRfdGltZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ191c19saW5lX3JhdGUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfY2FsaWJyYXRpb25fcmVjb3JkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3R1bmluZ19ncmFudWxhcml0eSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19zdGVwX3R1bmluZ190aW1lLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3Bvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgT05VIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIG9udV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9LCB7IC5uYW1lID0gIm9udV9vbGRfc3RhdGUiLCAuZGVzY3IgPSAib251IG9sZCBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBvbnVfb2xkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH0sIHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUgb2YgYWxsIE9OVSBhbGFybXMuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgYWxhcm1fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzIiwgLmRlc2NyID0gIkFFUyBlbmNyeXB0aW9uIGtleXMgbGVhcm5lZCBkdXJpbmcgT05VIHJlZ2lzdHJhdGlvbi4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIH0sIHsgLm5hbWUgPSAiY3VycmVudF9lbmNyeXB0aW9uX2tleSIsIC5kZXNjciA9ICJDdXJyZW50IEFFUyBlbmNyeXB0aW9uIGtleS4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBjdXJyZW50X2VuY3J5cHRpb25fa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXkgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gIk9OVSBzZXJpYWwgbnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLmRlc2NyID0gIk9OVSByZWdpc3RyYXRpb24gSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2IH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmciLCAuZGVzY3IgPSAiRW5hYmxlXFxEaXNhYmxlIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gbGVhcm5pbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyYW5naW5nX2J1cnN0X3Byb2ZpbGUiLCAuZGVzY3IgPSAiQnVyc3QgcHJvZmlsZSBpbmRleCBmb3IgcmFuZ2luZyBhbGxvY2F0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCByYW5naW5nX2J1cnN0X3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJkYXRhX2J1cnN0X3Byb2ZpbGUiLCAuZGVzY3IgPSAiQnVyc3QgcHJvZmlsZSBpbmRleCBmb3IgZGF0YSBhbGxvY2F0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBkYXRhX2J1cnN0X3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyYW5naW5nX3RpbWUiLCAuZGVzY3IgPSAiT05VIHJhbmdpbmcgdGltZS4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCByYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5IiwgLmRlc2NyID0gIlRoaXMgT05VIHdhcyBkaXNhYmxlZCBhZnRlciBTTiBkaXNjb3ZlcnkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0aW9uX3JlYXNvbiIsIC5kZXNjciA9ICJkZWFjdGl2YXRpb24gcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGRlYWN0aXZhdGlvbl9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uIH0sIHsgLm5hbWUgPSAiYWxsX2dlbV9wb3J0cyIsIC5kZXNjciA9ICJBbGwgdW5pY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBhbGxfZ2VtX3BvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IH0sIHsgLm5hbWUgPSAiYWxsX2FsbG9jcyIsIC5kZXNjciA9ICJBbGwgYWxsb2MgSURzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgYWxsX2FsbG9jcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIH0sIHsgLm5hbWUgPSAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIsIC5kZXNjciA9ICJBZGRpdGlvbmFsIGd1YXJkIHRpbWUgKGluIGJ5dGVzKSBmb3IgdGhpcyBPTlUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGV4dGVuZGVkX2d1YXJkX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIH0sIHsgLm5hbWUgPSAidXNfbGluZV9yYXRlIiwgLmRlc2NyID0gIlVTIGxpbmUgcmF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCB1c19saW5lX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIH0sIHsgLm5hbWUgPSAiY2FsaWJyYXRpb25fcmVjb3JkIiwgLmRlc2NyID0gIkNhbGlicmF0aW9uIHJlY29yZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBjYWxpYnJhdGlvbl9yZWNvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggfSwgeyAubmFtZSA9ICJ0dW5pbmdfZ3JhbnVsYXJpdHkiLCAuZGVzY3IgPSAiVGhlIHR1bmluZyBncmFudWxhcml0eSBvZiB0aGUgT05VIHRyYW5zbWl0dGVkIGV4cHJlc3NlZCBpbiB1bml0cyBvZiAxR0h6LiBWYWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSBPTlUgZG9lcyBub3Qgc3VwcG9ydCBmaW5lIHR1bmluZy9kaXRoZXJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgdHVuaW5nX2dyYW51bGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAic3RlcF90dW5pbmdfdGltZSIsIC5kZXNjciA9ICJUaGUgdmFsdWUgb2YgdGhlIHR1bmluZyB0aW1lIGZvciBhIHNpbmdsZSBncmFudWxhcml0eSBzdGVwLCBleHByZXNzZWQgaW4gdW5pdHMgb2YgUEhZIGZyYW1lcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgc3RlcF90dW5pbmdfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMiLCAuZGVzY3IgPSAiUG93ZXIgbGV2ZWxsaW5nIGNhcGFiaWxpdGllcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzIiwgLmRlc2NyID0gIlRoaXMgdmFsdWUgaW5kaWNhdGUgdGhhdCB0aGUgb251IGlzIGluIHRoZSBtaWRkbGUgb2YgcmVxdWVzdCByZWdpc3RyYXRpb24gcHJvY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9wb3NpdGl2ZV9kcmlmdCA9IHsgLm5hbWUgPSAicG9zaXRpdmVfZHJpZnQiLCAuZGVzY3IgPSAicG9zaXRpdmUgZHJpZnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcG9zaXRpdmVfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfbmVnYXRpdmVfZHJpZnQgPSB7IC5uYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IiwgLmRlc2NyID0gIm5lZ2F0aXZlIGRyaWZ0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIG5lZ2F0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2RlbGltaXRlcl9taXNzX2RldGVjdGlvbiA9IHsgLm5hbWUgPSAiZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uIiwgLmRlc2NyID0gImRlbGltaXRlciBtaXNzIGRldGVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2JpcDMyX2Vycm9ycyA9IHsgLm5hbWUgPSAiYmlwMzJfZXJyb3JzIiwgLmRlc2NyID0gImJpcDMyIGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgYmlwMzJfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X3dvcmRzID0geyAubmFtZSA9ICJyeF93b3JkcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIHJlY2VpdmVkICh3b3JkIHNpemUgaXMgNCBieXRlcyByZWdhcmRsZXNzIG9mIHVwc3RyZWFtIGRhdGEgcmF0ZSkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1dPUkRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X3dvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY19jb3JyZWN0ZWRfc3ltYm9scyA9IHsgLm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9zeW1ib2xzIiwgLmRlc2NyID0gImZlYyBjb3JyZWN0ZWQgc3ltYm9scyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX1NZTUJPTFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvcnJlY3RlZF9zeW1ib2xzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY19jb3JyZWN0ZWRfY29kZXdvcmRzID0geyAubmFtZSA9ICJmZWNfY29ycmVjdGVkX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJmZWMgY29ycmVjdGVkIGNvZGV3b3JkcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfY29ycmVjdGVkX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9mZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMgPSB7IC5uYW1lID0gImZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJmZWMgdW5jb3JyZWN0YWJsZSBjb2Rld29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9mZWNfY29kZXdvcmRzID0geyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLmRlc2NyID0gImZlYyB0b3RhbCBjb2Rld29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY19jb3JyZWN0ZWRfYml0cyA9IHsgLm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9iaXRzIiwgLmRlc2NyID0gImZlYyBjb3JyZWN0ZWQgYml0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvcnJlY3RlZF9iaXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3hnZW1fa2V5X2Vycm9ycyA9IHsgLm5hbWUgPSAieGdlbV9rZXlfZXJyb3JzIiwgLmRlc2NyID0gInhnZW0ga2V5IGVycm9yIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCB4Z2VtX2tleV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfeGdlbV9sb3NzID0geyAubmFtZSA9ICJ4Z2VtX2xvc3MiLCAuZGVzY3IgPSAieGdlbSBsb3NzICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0xPU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgeGdlbV9sb3NzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X3Bsb2Ftc19taWNfZXJyb3IgPSB7IC5uYW1lID0gInJ4X3Bsb2Ftc19taWNfZXJyb3IiLCAuZGVzY3IgPSAibWljIGVycm9yIHBsb2FtIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19NSUNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfcGxvYW1zX21pY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9wbG9hbXNfbm9uX2lkbGUgPSB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC5kZXNjciA9ICJub24gaWRsZSBwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfcGxvYW1zX25vbl9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X29tY2kgPSB7IC5uYW1lID0gInJ4X29tY2kiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yID0geyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X2J5dGVzID0geyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJyeCBieXRlcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9wYWNrZXRzID0geyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLmRlc2NyID0gInJ4IHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3R4X2J5dGVzID0geyAubmFtZSA9ICJ0eF9ieXRlcyIsIC5kZXNjciA9ICJ0eCBieXRlcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCB0eF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF90eF9wYWNrZXRzID0geyAubmFtZSA9ICJ0eF9wYWNrZXRzIiwgLmRlc2NyID0gInR4IHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcG9zaXRpdmVfZHJpZnQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X25lZ2F0aXZlX2RyaWZ0LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9kZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24sICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2JpcDMyX2Vycm9ycywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfd29yZHMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY19jb3JyZWN0ZWRfc3ltYm9scywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfZmVjX2NvZGV3b3JkcywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfZmVjX2NvcnJlY3RlZF9iaXRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF94Z2VtX2tleV9lcnJvcnMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3hnZW1fbG9zcywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfcGxvYW1zX21pY19lcnJvciwgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfcGxvYW1zX25vbl9pZGxlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9vbWNpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9ieXRlcywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfcGFja2V0cywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfdHhfYnl0ZXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3R4X3BhY2tldHMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9zaXRpdmVfZHJpZnQiLCAuZGVzY3IgPSAicG9zaXRpdmUgZHJpZnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHBvc2l0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IiwgLmRlc2NyID0gIm5lZ2F0aXZlIGRyaWZ0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBuZWdhdGl2ZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24iLCAuZGVzY3IgPSAiZGVsaW1pdGVyIG1pc3MgZGV0ZWN0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYmlwMzJfZXJyb3JzIiwgLmRlc2NyID0gImJpcDMyIGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgYmlwMzJfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3dvcmRzIiwgLmRlc2NyID0gIk51bWJlciBvZiA0LWJ5dGUgd29yZHMgcmVjZWl2ZWQgKHdvcmQgc2l6ZSBpcyA0IGJ5dGVzIHJlZ2FyZGxlc3Mgb2YgdXBzdHJlYW0gZGF0YSByYXRlKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X3dvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb3JyZWN0ZWRfc3ltYm9scyIsIC5kZXNjciA9ICJmZWMgY29ycmVjdGVkIHN5bWJvbHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb3JyZWN0ZWRfc3ltYm9scyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfY29ycmVjdGVkX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJmZWMgY29ycmVjdGVkIGNvZGV3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzIiwgLmRlc2NyID0gImZlYyB1bmNvcnJlY3RhYmxlIGNvZGV3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb2Rld29yZHMiLCAuZGVzY3IgPSAiZmVjIHRvdGFsIGNvZGV3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfY29ycmVjdGVkX2JpdHMiLCAuZGVzY3IgPSAiZmVjIGNvcnJlY3RlZCBiaXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfY29ycmVjdGVkX2JpdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAieGdlbV9rZXlfZXJyb3JzIiwgLmRlc2NyID0gInhnZW0ga2V5IGVycm9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCB4Z2VtX2tleV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAieGdlbV9sb3NzIiwgLmRlc2NyID0gInhnZW0gbG9zcyAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHhnZW1fbG9zcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfbWljX2Vycm9yIiwgLmRlc2NyID0gIm1pYyBlcnJvciBwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfcGxvYW1zX21pY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAuZGVzY3IgPSAibm9uIGlkbGUgcGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19ub25faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9vbWNpIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAicnggYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAuZGVzY3IgPSAicnggcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9ieXRlcyIsIC5kZXNjciA9ICJ0eCBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJ0eCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc2V0X29udV9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zZXRfb251X3N0YXRlX29udV9zdGF0ZSA9IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIk9OVSBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3NldF9vbnVfc3RhdGVfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJPTlUgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEsIG9udV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9vcGVyYXRpb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgT05VIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHJzc2lfbWVhc3VyZW1lbnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBvbnVfYWxhcm0gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2FsYXJtX29udV9hbGFybSA9IHsgLm5hbWUgPSAib251X2FsYXJtIiwgLmRlc2NyID0gIm9udSBhbGFybSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEsIG9udV9hbGFybSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X2FsYXJtX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X29udV9hbGFybV9vbnVfYWxhcm0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAib251IGFsYXJtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEsIG9udV9hbGFybSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEiLCAuZGVzY3IgPSAiT05VIEFsYXJtIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGRvd2kgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfZG93aV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9kb3dpX2RyaWZ0X3ZhbHVlID0geyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC5kZXNjciA9ICJDYWxjdWxhdGVkIGFtb3VudCBvZiBkcmlmdCAocG9zaXRpdmUgKyBuZWdhdGl2ZSBhcyBhIHNpZ25lZCB2YWx1ZSkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEsIGRyaWZ0X3ZhbHVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2Rvd2lfbmV3X2VxZCA9IHsgLm5hbWUgPSAibmV3X2VxZCIsIC5kZXNjciA9ICJOZXcgRVFEIGFmdGVyIGRyaWZ0IGlzIGNvcnJlY3RlZCAob25seSB2YWxpZCBpZiBzdGF0dXMgaXMgJ29uJykuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX05FV19FUUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSwgbmV3X2VxZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfZG93aV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9kb3dpX2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fb251X2Rvd2lfZHJpZnRfdmFsdWUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9kb3dpX25ld19lcWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAuZGVzY3IgPSAiQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSwgZHJpZnRfdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfSwgeyAubmFtZSA9ICJuZXdfZXFkIiwgLmRlc2NyID0gIk5ldyBFUUQgYWZ0ZXIgZHJpZnQgaXMgY29ycmVjdGVkIChvbmx5IHZhbGlkIGlmIHN0YXR1cyBpcyAnb24nKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEsIG5ld19lcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEiLCAuZGVzY3IgPSAiRHJpZnQgb2YgV2luZG93IG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc2ZpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3NmaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2ZpX2JlciA9IHsgLm5hbWUgPSAiYmVyIiwgLmRlc2NyID0gIkludmVyc2UgYml0IGVycm9yIHJhdGUgKGUuZy4gaWYgdGhpcyBudW1iZXIgaXMgMTAwMCwgdGhlIEJFUiBpcyAxLzEwMDApLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEsIGJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc2ZpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3NmaV9hbGFybV9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZmlfYmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJiZXIiLCAuZGVzY3IgPSAiSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEsIGJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEiLCAuZGVzY3IgPSAiU2lnbmFsIEZhaWwgb2YgT05VaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NmaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBzZGkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2RpX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zZGlfYmVyID0geyAubmFtZSA9ICJiZXIiLCAuZGVzY3IgPSAiSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSwgYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9zZGlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2RpX2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fb251X3NkaV9iZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImJlciIsIC5kZXNjciA9ICJJbnZlcnNlIGJpdCBlcnJvciByYXRlIChlLmcuIGlmIHRoaXMgbnVtYmVyIGlzIDEwMDAsIHRoZSBCRVIgaXMgMS8xMDAwKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSwgYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSIsIC5kZXNjciA9ICJTaWduYWwgRGVncmFkZWQgb2YgT05VaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NkaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBkZmkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfZGZpX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9kZmlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfZGZpX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RmaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RmaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2RmaV9kYXRhIiwgLmRlc2NyID0gIlJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RmaV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHBxc2kgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcHFzaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BRU0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9wcXNpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3Bxc2lfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhIiwgLmRlc2NyID0gInBsb2FtIHF1ZXVlIHN0YXR1cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBzdWZpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N1ZmlfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc3VmaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdWZpX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YSIsIC5kZXNjciA9ICJTVUZpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHRpd2kgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfdGl3aV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV90aXdpX2RyaWZ0X3ZhbHVlID0geyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC5kZXNjciA9ICJDYWxjdWxhdGVkIGFtb3VudCBvZiBkcmlmdCAocG9zaXRpdmUgKyBuZWdhdGl2ZSBhcyBhIHNpZ25lZCB2YWx1ZSkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9USVdJX0lEX0RSSUZUX1ZBTFVFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEsIGRyaWZ0X3ZhbHVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3Rpd2lfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfdGl3aV9hbGFybV9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV90aXdpX2RyaWZ0X3ZhbHVlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRyaWZ0X3ZhbHVlIiwgLmRlc2NyID0gIkNhbGN1bGF0ZWQgYW1vdW50IG9mIGRyaWZ0IChwb3NpdGl2ZSArIG5lZ2F0aXZlIGFzIGEgc2lnbmVkIHZhbHVlKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEsIGRyaWZ0X3ZhbHVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEiLCAuZGVzY3IgPSAiVHJhbnNtaXNzaW9uIEludGVyZmVyZW5jZSBXYXJuaW5nIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGxvb2NpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2xvb2NpX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfTE9PQ0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfbG9vY2lfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfbG9vY2lfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSIsIC5kZXNjciA9ICJMT09DaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSByYW5naW5nX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9lcWQgPSB7IC5uYW1lID0gImVxZCIsIC5kZXNjciA9ICJFUUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgZXFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9udW1iZXJfb2ZfcGxvYW1zID0geyAubmFtZSA9ICJudW1iZXJfb2ZfcGxvYW1zIiwgLmRlc2NyID0gIm51bWJlciBvZiBwbG9hbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIG51bWJlcl9vZl9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcG93ZXJfbGV2ZWwgPSB7IC5uYW1lID0gInBvd2VyX2xldmVsIiwgLmRlc2NyID0gInBvd2VyIGxldmVsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgcG93ZXJfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZmFpbF9yZWFzb24sICZwcm9wX2Rlc2NyX3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9lcWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9udW1iZXJfb2ZfcGxvYW1zLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcG93ZXJfbGV2ZWwgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB9LCB7IC5uYW1lID0gImVxZCIsIC5kZXNjciA9ICJFUUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBlcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX3Bsb2FtcyIsIC5kZXNjciA9ICJudW1iZXIgb2YgcGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgbnVtYmVyX29mX3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInBvd2VyX2xldmVsIiwgLmRlc2NyID0gInBvd2VyIGxldmVsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgcG93ZXJfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlJhbmdpbmcgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcmVnaXN0cmF0aW9uX2lkID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAicmVnaXN0cmF0aW9uIGlkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcmVnaXN0cmF0aW9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzIiwgLmRlc2NyID0gInJlZ2lzdHJhdGlvbiBlbmNyeXB0aW9uIGtleXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9mYWlsX3JlYXNvbiwgJnByb3BfZGVzY3JfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9yZWdpc3RyYXRpb25faWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLmRlc2NyID0gInJlZ2lzdHJhdGlvbiBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhLCByZWdpc3RyYXRpb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMzYgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzIiwgLmRlc2NyID0gInJlZ2lzdHJhdGlvbiBlbmNyeXB0aW9uIGtleXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgQWN0aXZhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIk9OVSBEZWFjdGl2YXRpb24gQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9udV9lbmFibGVfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX3NlcmlhbF9udW1iZXIgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIk9OVSBFbmFibGUgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9udV9kaXNhYmxlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgRGlzYWJsZSBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gaW52YWxpZF9kYnJ1X3JlcG9ydCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2FsbG9jX2lkID0geyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYy1JRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2FsbG9jX2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jLUlEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSIsIC5kZXNjciA9ICJJbnZhbGlkIERCUnUgUmVwb3J0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGtleV9leGNoYW5nZV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9uZXdfa2V5ID0geyAubmFtZSA9ICJuZXdfa2V5IiwgLmRlc2NyID0gIm5ldyBrZXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX25ld19rZXkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X2tleSIsIC5kZXNjciA9ICJuZXcga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXkgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9leHBlY3RlZF9rZXkgPSB7IC5uYW1lID0gImV4cGVjdGVkX2tleSIsIC5kZXNjciA9ICJleHBlY3RlZCBrZXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEsIGV4cGVjdGVkX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9yZWNlaXZlZF9rZXkgPSB7IC5uYW1lID0gInJlY2VpdmVkX2tleSIsIC5kZXNjciA9ICJyZWNlaXZlZCBrZXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEsIHJlY2VpdmVkX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2V4cGVjdGVkX2tleSwgJnByb3BfZGVzY3JfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfcmVjZWl2ZWRfa2V5IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImV4cGVjdGVkX2tleSIsIC5kZXNjciA9ICJleHBlY3RlZCBrZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEsIGV4cGVjdGVkX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJyZWNlaXZlZF9rZXkiLCAuZGVzY3IgPSAicmVjZWl2ZWQga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhLCByZWNlaXZlZF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIEtleSBNaXNtYXRjaCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBvcHRpY2FsX3JlZmxlY3Rpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHBsb2FtX3BhY2tldCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGVmYXVsdF9rZXkgPSB7IC5uYW1lID0gImRlZmF1bHRfa2V5IiwgLmRlc2NyID0gImRlZmF1bHQga2V5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfREVGQVVMVF9LRVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhLCBkZWZhdWx0X2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wbG9hbV9wYWNrZXRfcGxvYW0gPSB7IC5uYW1lID0gInBsb2FtIiwgLmRlc2NyID0gInBsb2FtIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhLCBwbG9hbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80MCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RlZmF1bHRfa2V5LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Bsb2FtIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGVmYXVsdF9rZXkiLCAuZGVzY3IgPSAiZGVmYXVsdCBrZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSwgZGVmYXVsdF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhLCBwbG9hbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80MCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSIsIC5kZXNjciA9ICJQTE9BTSBQYWNrZXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gY3B1X3BhY2tldHMgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfcGFja2V0X3R5cGUgPSB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLmRlc2NyID0gInBhY2tldCB0eXBlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19jYWxjX2NyYyA9IHsgLm5hbWUgPSAiY2FsY19jcmMiLCAuZGVzY3IgPSAiY2FsYyBjcmMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19udW1iZXJfb2ZfcGFja2V0cyA9IHsgLm5hbWUgPSAibnVtYmVyX29mX3BhY2tldHMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBudW1iZXJfb2ZfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19wYWNrZXRfc2l6ZSA9IHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAiU2luZ2xlIHBhY2tldCBzaXplIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRzX2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9jcHVfcGFja2V0c19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19wYWNrZXRfdHlwZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRzX2NhbGNfY3JjLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfbnVtYmVyX29mX3BhY2tldHMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19wYWNrZXRfc2l6ZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRzX2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicGFja2V0X3R5cGUiLCAuZGVzY3IgPSAicGFja2V0IHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBwYWNrZXRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF90eXBlIH0sIHsgLm5hbWUgPSAiY2FsY19jcmMiLCAuZGVzY3IgPSAiY2FsYyBjcmMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wYWNrZXRzIiwgLmRlc2NyID0gIm51bWJlciBvZiBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgbnVtYmVyX29mX3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJTaW5nbGUgcGFja2V0IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhIiwgLmRlc2NyID0gIlhHUE9OIENQVSBwYWNrZXRzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGNwdV9wYWNrZXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldF9wb3J0X2lkID0geyAubmFtZSA9ICJwb3J0X2lkIiwgLmRlc2NyID0gInBvcnQgaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBwb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X2NyY19vayA9IHsgLm5hbWUgPSAiY3JjX29rIiwgLmRlc2NyID0gImNyYyBvayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0ssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgY3JjX29rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRfcGFja2V0X3NpemUgPSB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gInBhY2tldCBzaXplIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIHBhY2tldF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfY3B1X3BhY2tldF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X3BvcnRfaWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X2NyY19vaywgJnByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRfcGFja2V0X3NpemUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb3J0X2lkIiwgLmRlc2NyID0gInBvcnQgaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIHBvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiY3JjX29rIiwgLmRlc2NyID0gImNyYyBvayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgY3JjX29rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAicGFja2V0IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIHBhY2tldF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJidWZmZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGVzIENQVSBwYWNrZXQgd2FzIHJlY2VpdmVkIG9uIHRoZSBVUyBmcm9tIHRoaXMgT05VIGlkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9tY2lfcGFja2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29tY2lfcGFja2V0X3BvcnRfaWQgPSB7IC5uYW1lID0gInBvcnRfaWQiLCAuZGVzY3IgPSAicG9ydCBpZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfY3JjX29rID0geyAubmFtZSA9ICJjcmNfb2siLCAuZGVzY3IgPSAiY3JjIG9rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9DUkNfT0ssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGNyY19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbWNpX3BhY2tldF9wYWNrZXRfc2l6ZSA9IHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAicGFja2V0IHNpemUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfYnVmZmVyID0geyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X29tY2lfcGFja2V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X29tY2lfcGFja2V0X3BvcnRfaWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbWNpX3BhY2tldF9jcmNfb2ssICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbWNpX3BhY2tldF9wYWNrZXRfc2l6ZSwgJnByb3BfZGVzY3JfeGdwb25fb251X29tY2lfcGFja2V0X2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9ydF9pZCIsIC5kZXNjciA9ICJwb3J0IGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJjcmNfb2siLCAuZGVzY3IgPSAiY3JjIG9rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgY3JjX29rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAicGFja2V0IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIiwgLmRlc2NyID0gIkluZGljYXRlcyBPTUNJIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24gdGhlIFVTIGZyb20gdGhpcyBPTlUgaWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gZGdpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2RnaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0RHSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2RnaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfZGdpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X2RnaV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSIsIC5kZXNjciA9ICJSZWNlaXZlIER5aW5nLUdhc3Agb2YgT05VaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RnaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9vbGRfc3RhdGUgPSB7IC5uYW1lID0gIm9sZF9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgdGhlIE9OVSB3YXMgcHJldmlvdXNseSBpbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgb2xkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIGlzIGN1cnJlbnRseSBpbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX3JlYXNvbiA9IHsgLm5hbWUgPSAicmVhc29uIiwgLmRlc2NyID0gIlRoZSByZWFzb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2UuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIHJlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2Vfb2xkX3N0YXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfbmV3X3N0YXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbGRfc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIHRoZSBPTlUgd2FzIHByZXZpb3VzbHkgaW4uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgb2xkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIGlzIGN1cnJlbnRseSBpbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfSwgeyAubmFtZSA9ICJyZWFzb24iLCAuZGVzY3IgPSAiVGhlIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhLCByZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSIsIC5kZXNjciA9ICJOb3RpZmljYXRpb24gdGhhdCBhbiBPTlVzIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgaGFzIGNoYW5nZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHBvc3NpYmxlX2RyaWZ0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIk9uOiBlc3RpbWF0ZWQgZHJpZnQgaGFzIGV4Y2VlZGVkIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2VzdGltYXRlZF9kcmlmdCA9IHsgLm5hbWUgPSAiZXN0aW1hdGVkX2RyaWZ0IiwgLmRlc2NyID0gIklmIHN0YXR1cyBpcyBvbiwgdGhlIGVzdGltYXRlZCBkcmlmdCB2YWx1ZSwgb3RoZXJ3aXNlIHplcm8gKDApLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhLCBlc3RpbWF0ZWRfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfYWxhcm1fc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZXN0aW1hdGVkX2RyaWZ0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiT246IGVzdGltYXRlZCBkcmlmdCBoYXMgZXhjZWVkZWQgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImVzdGltYXRlZF9kcmlmdCIsIC5kZXNjciA9ICJJZiBzdGF0dXMgaXMgb24sIHRoZSBlc3RpbWF0ZWQgZHJpZnQgdmFsdWUsIG90aGVyd2lzZSB6ZXJvICgwKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhLCBlc3RpbWF0ZWRfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhIiwgLmRlc2NyID0gIkFuIE9OVSBpbiBhIGxvdyBwb3dlciBzdGF0ZSBtYXkgYmUgZXhwZXJpZW5jaW5nIGRyaWZ0IGJleW9uZCB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQuIFRoZSBlc3RpbWF0ZSBtYXkgYmUgaW5hY2N1cmF0ZSBkZXBlbmRpbmcgb24gT05VIGJlaGF2aW9yLiBBY3R1YWwgZHJpZnQgbWF5IGJlIGxlc3MgdGhhbiBlc3RpbWF0ZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHJlcXVlc3RfcmVnaXN0cmF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3NtYV9mbGFnID0geyAubmFtZSA9ICJzbWFfZmxhZyIsIC5kZXNjciA9ICJJcyB0aGUgcmVxdWVzdCByZWdpc3RyYXRpb24gcHJvY2VzcyBpcyBwYXJ0IG9mIHRoZSBTTUEgcHJvY2VzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfU01BX0ZMQUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEsIHNtYV9mbGFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3NtYV9mbGFnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzbWFfZmxhZyIsIC5kZXNjciA9ICJJcyB0aGUgcmVxdWVzdCByZWdpc3RyYXRpb24gcHJvY2VzcyBpcyBwYXJ0IG9mIHRoZSBTTUEgcHJvY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEsIHNtYV9mbGFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSIsIC5kZXNjciA9ICJSZXF1ZXN0IHRoZSBPTlUgdG8gc2VuZCBpdHMgUmVnaXN0cmF0aW9uIElEIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGNoYW5nZV9wb3dlcl9sZXZlbGxpbmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19jb250cm9sID0geyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19hdHRlbnVhdGlvbiA9IHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAuZGVzY3IgPSAiVGhlIHJlcXVlc3RlZCBhdHRlbnVhdGlvbiBpbiBzdGVwcyBvZiAzZEIgYXMgcGFydCBvZiBwb3dlciBsZXZlbGxpbmcgaW5zdHJ1Y3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQVRURU5VQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSwgYXR0ZW51YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2F0dGVudWF0aW9uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sIH0sIHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAuZGVzY3IgPSAiVGhlIHJlcXVlc3RlZCBhdHRlbnVhdGlvbiBpbiBzdGVwcyBvZiAzZEIgYXMgcGFydCBvZiBwb3dlciBsZXZlbGxpbmcgaW5zdHJ1Y3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEsIGF0dGVudWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEiLCAuZGVzY3IgPSAiQ2hhbmdlIHBvd2VyIGxldmVsbGluZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBnZXRfcG93ZXJfbGV2ZWwgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGdldF9wb3dlcl9jb25zdW1wdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25fcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gYWRqdXN0X3R4X3dhdmVsZW5ndGggKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uID0geyAubmFtZSA9ICJmcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24iLCAuZGVzY3IgPSAiRnJlcXVlbmN5IGFkanVzdG1lbnQgZGlyZWN0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplID0geyAubmFtZSA9ICJmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplIiwgLmRlc2NyID0gIlRoZSBzaXplIG9mIHRoZSBmcmVxdWVuY3kgYWRqdXN0bWVudCBpbiB1bml0cyBvZiAwLjFHSHoiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIiwgLmRlc2NyID0gIkZyZXF1ZW5jeSBhZGp1c3RtZW50IGRpcmVjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiB9LCB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUiLCAuZGVzY3IgPSAiVGhlIHNpemUgb2YgdGhlIGZyZXF1ZW5jeSBhZGp1c3RtZW50IGluIHVuaXRzIG9mIDAuMUdIeiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIiwgLmRlc2NyID0gIkluc3RydWN0IHRoZSBPTlUgdG8gYWRqdXN0IGl0cyB1cHN0cmVhbSB0cmFuc21pdHRlciB3YXZlbGVuZ3RoIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHJlZ2lzdHJhdGlvbl9pZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfcmVnaXN0cmF0aW9uX2lkID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiUmVnaXN0cmF0aW9uIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVHSVNUUkFUSU9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSwgcmVnaXN0cmF0aW9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgPSB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyIsIC5kZXNjciA9ICJyZXF1ZXN0IHJlZ2lzdHJhdGlvbiBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhLCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJyZXF1ZXN0IHJlZ2lzdHJhdGlvbiBmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9yZWdpc3RyYXRpb25faWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX3JlZ2lzdHJhdGlvbl9pZCwgJnByb3BfZGVzY3JfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiUmVnaXN0cmF0aW9uIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8zNiB9LCB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyIsIC5kZXNjciA9ICJyZXF1ZXN0IHJlZ2lzdHJhdGlvbiBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAicmVxdWVzdCByZWdpc3RyYXRpb24gZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSIsIC5kZXNjciA9ICJSZWdpc3RyYXRpb24gSUQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gcG93ZXJfbGV2ZWxfcmVwb3J0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9hdHRlbnVhdGlvbiA9IHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAuZGVzY3IgPSAiQXR0ZW51YXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9BVFRFTlVBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEsIGF0dGVudWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0eSA9IHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdHkiLCAuZGVzY3IgPSAiUG93ZXIgbGV2ZWxsaW5nIGNhcGFiaWxpdHkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfYXR0ZW51YXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdHkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhdHRlbnVhdGlvbiIsIC5kZXNjciA9ICJBdHRlbnVhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhLCBhdHRlbnVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXR5IiwgLmRlc2NyID0gIlBvd2VyIGxldmVsbGluZyBjYXBhYmlsaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhIiwgLmRlc2NyID0gIlBvd2VyIGxldmVsIHJlcG9ydCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCA9IHsgLm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiwgLmRlc2NyID0gInBvd2VyIGNvbnN1bXB0aW9uIHJlcG9ydCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEsIHBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiwgLmRlc2NyID0gInBvd2VyIGNvbnN1bXB0aW9uIHJlcG9ydCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhLCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSIsIC5kZXNjciA9ICJQb3dlciBjb25zdW1wdGlvbiByZXBvcnQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX21hc3Rlcl9rZXkgPSB7IC5uYW1lID0gIm1hc3Rlcl9rZXkiLCAuZGVzY3IgPSAibWFzdGVyIGtleSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NQVNURVJfS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEsIG1hc3Rlcl9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fYnVmZmVyID0geyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiT01DSSBkYXRhIGJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9taWMgPSB7IC5uYW1lID0gIm1pYyIsIC5kZXNjciA9ICJtaWMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEsIG1pYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX21hc3Rlcl9rZXksICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2J1ZmZlciwgJnByb3BfZGVzY3JfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fbWljIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1hc3Rlcl9rZXkiLCAuZGVzY3IgPSAibWFzdGVyIGtleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSwgbWFzdGVyX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiT01DSSBkYXRhIGJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfSwgeyAubmFtZSA9ICJtaWMiLCAuZGVzY3IgPSAibWljIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhLCBtaWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEiLCAuZGVzY3IgPSAiT01DSSBiYXNlIHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJzZWN1cmUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIGZhaWwgcmVhc29uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfRkFJTF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gInNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhIiwgLmRlc2NyID0gIkZhaWx1cmUgb2Ygc2VjdXJlIG11dHVhbCBhdXRoZW50aWNhdGlvbiBkdWUgdG8gTUlDIGVycm9yIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9udV90dW5pbmdfaW4gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBvbnVfdHVuaW5nX291dCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF90YXJnZXRfZHNfcG9uX2lkID0geyAubmFtZSA9ICJ0YXJnZXRfZHNfcG9uX2lkIiwgLmRlc2NyID0gInRhcmdldCBkcyBwb24gaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEsIHRhcmdldF9kc19wb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25faWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfdGFyZ2V0X3VzX3Bvbl9pZCA9IHsgLm5hbWUgPSAidGFyZ2V0X3VzX3Bvbl9pZCIsIC5kZXNjciA9ICJ0YXJnZXQgdXMgcG9uIGlkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfVVNfUE9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCB0YXJnZXRfdXNfcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X3RpbWVfdG9fc3dpdGNoID0geyAubmFtZSA9ICJ0aW1lX3RvX3N3aXRjaCIsIC5kZXNjciA9ICJUaW1lIHRvIHN3aXRjaCBpbiBtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0gsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEsIHRpbWVfdG9fc3dpdGNoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF9yb2xsYmFjayA9IHsgLm5hbWUgPSAicm9sbGJhY2siLCAuZGVzY3IgPSAicm9sbGJhY2siLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1JPTExCQUNLLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCByb2xsYmFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJvbi0gdG8gc3RhcnQgdHVuaW5nIG91dCBvZmYtIHRvIHN0b3AgdHVuaW5nIG91dCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfdGFyZ2V0X2RzX3Bvbl9pZCwgJnByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X3RhcmdldF91c19wb25faWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF90aW1lX3RvX3N3aXRjaCwgJnByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X3JvbGxiYWNrLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0YXJnZXRfZHNfcG9uX2lkIiwgLmRlc2NyID0gInRhcmdldCBkcyBwb24gaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCB0YXJnZXRfZHNfcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2lkIH0sIHsgLm5hbWUgPSAidGFyZ2V0X3VzX3Bvbl9pZCIsIC5kZXNjciA9ICJ0YXJnZXQgdXMgcG9uIGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSwgdGFyZ2V0X3VzX3Bvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9pZCB9LCB7IC5uYW1lID0gInRpbWVfdG9fc3dpdGNoIiwgLmRlc2NyID0gIlRpbWUgdG8gc3dpdGNoIGluIG1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSwgdGltZV90b19zd2l0Y2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicm9sbGJhY2siLCAuZGVzY3IgPSAicm9sbGJhY2siLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCByb2xsYmFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJvbi0gdG8gc3RhcnQgdHVuaW5nIG91dCBvZmYtIHRvIHN0b3AgdHVuaW5nIG91dCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEiLCAuZGVzY3IgPSAiT05VIFR1bmluZyBvdXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gb251X3R1bmluZ19vdXRfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9yZXN1bHQgPSB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJyZXN1bHQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX3Jlc3VsdCwgJnByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJyZXN1bHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgVHVuaW5nIG91dCBjb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gb251X3R1bmluZ19pbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfcmVzdWx0LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJyZXN1bHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiT05VIFR1bmluZyBpbiBjb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gdHVuaW5nX3Jlc3BvbnNlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9hY2sgPSB7IC5uYW1lID0gImFjayIsIC5kZXNjciA9ICJpcyB0dW5pbmcgcmVzcG9uc2UgcmVjZWl2ZWQgd2l0aCBhY2sgb3IgbmFjayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX0FDSywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEsIGFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfUkVTVUxULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfYWNrLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFjayIsIC5kZXNjciA9ICJpcyB0dW5pbmcgcmVzcG9uc2UgcmVjZWl2ZWQgd2l0aCBhY2sgb3IgbmFjayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhLCBhY2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSIsIC5kZXNjciA9ICJUdW5pbmcgcmVzcG9uc2UiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2RmaSA9IHsgLm5hbWUgPSAiZGZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZGZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2RnaSA9IHsgLm5hbWUgPSAiZGdpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZ2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZGdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2Rvd2kgPSB7IC5uYW1lID0gImRvd2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRvd2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGRvd2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfaW52YWxpZF9kYnJ1X3JlcG9ydCA9IHsgLm5hbWUgPSAiaW52YWxpZF9kYnJ1X3JlcG9ydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiaW52YWxpZF9kYnJ1X3JlcG9ydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgaW52YWxpZF9kYnJ1X3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfY29tcGxldGVkID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19sb29jaSA9IHsgLm5hbWUgPSAibG9vY2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxvb2NpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9MT09DSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgbG9vY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2FjdGl2YXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2FsYXJtID0geyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hbGFybVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfYWxhcm0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV9kaXNhYmxlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X2Rpc2FibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGlzYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2Rpc2FibGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV9lbmFibGVfY29tcGxldGVkID0geyAubmFtZSA9ICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2VuYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZW5hYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X3R1bmluZ19pbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV90dW5pbmdfaW5fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X3R1bmluZ19pbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X3R1bmluZ19vdXRfY29tcGxldGVkID0geyAubmFtZSA9ICJvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV90dW5pbmdfb3V0X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb3B0aWNhbF9yZWZsZWN0aW9uID0geyAubmFtZSA9ICJvcHRpY2FsX3JlZmxlY3Rpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9wdGljYWxfcmVmbGVjdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvcHRpY2FsX3JlZmxlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfcG9zc2libGVfZHJpZnQgPSB7IC5uYW1lID0gInBvc3NpYmxlX2RyaWZ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3NzaWJsZV9kcmlmdFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvc3NpYmxlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCA9IHsgLm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Bvd2VyX2xldmVsX3JlcG9ydCA9IHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxfcmVwb3J0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9sZXZlbF9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0xFVkVMX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcG93ZXJfbGV2ZWxfcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlID0geyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wcXNpID0geyAubmFtZSA9ICJwcXNpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcXNpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QUVNJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwcXNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3JhbmdpbmdfY29tcGxldGVkID0geyAubmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmFuZ2luZ19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCByYW5naW5nX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19yZWdpc3RyYXRpb25faWQgPSB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVnaXN0cmF0aW9uX2lkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SRUdJU1RSQVRJT05fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2RpID0geyAubmFtZSA9ICJzZGkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNkaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZGkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlID0geyAubmFtZSA9ICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2ZpID0geyAubmFtZSA9ICJzZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNmaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3N1ZmkgPSB7IC5uYW1lID0gInN1ZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN1ZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN1ZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfdGl3aSA9IHsgLm5hbWUgPSAidGl3aSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidGl3aVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgdGl3aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ190dW5pbmdfcmVzcG9uc2UgPSB7IC5uYW1lID0gInR1bmluZ19yZXNwb25zZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidHVuaW5nX3Jlc3BvbnNlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9UVU5JTkdfUkVTUE9OU0UsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHR1bmluZ19yZXNwb25zZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19kZmksICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19kZ2ksICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19kb3dpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfaW52YWxpZF9kYnJ1X3JlcG9ydCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2xvb2NpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2FsYXJtLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19vbnVfZGlzYWJsZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19vbnVfZW5hYmxlX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV90dW5pbmdfaW5fY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X3R1bmluZ19vdXRfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb3B0aWNhbF9yZWZsZWN0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfcG9zc2libGVfZHJpZnQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wb3dlcl9sZXZlbF9yZXBvcnQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Bxc2ksICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19yYW5naW5nX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3JlZ2lzdHJhdGlvbl9pZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2RpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2ZpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19zdWZpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfdGl3aSwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3R1bmluZ19yZXNwb25zZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkZ2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRnaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGRnaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRvd2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRvd2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkb3dpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiaW52YWxpZF9kYnJ1X3JlcG9ydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiaW52YWxpZF9kYnJ1X3JlcG9ydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGludmFsaWRfZGJydV9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxvb2NpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsb29jaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGxvb2NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hbGFybVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9hbGFybSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2Rpc2FibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGlzYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2VuYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZW5hYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV90dW5pbmdfaW5fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdHVuaW5nX2luX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV90dW5pbmdfaW5fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X3R1bmluZ19vdXRfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdHVuaW5nX291dF9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvcHRpY2FsX3JlZmxlY3Rpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9wdGljYWxfcmVmbGVjdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9wdGljYWxfcmVmbGVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBvc3NpYmxlX2RyaWZ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3NzaWJsZV9kcmlmdFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvc3NpYmxlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbF9yZXBvcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBvd2VyX2xldmVsX3JlcG9ydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvd2VyX2xldmVsX3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicHFzaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHFzaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBxc2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmFuZ2luZ19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCByYW5naW5nX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVnaXN0cmF0aW9uX2lkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzZGkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNkaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHNkaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic2ZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3VmaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3VmaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN1ZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0aXdpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgdGl3aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInR1bmluZ19yZXNwb25zZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidHVuaW5nX3Jlc3BvbnNlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgdHVuaW5nX3Jlc3BvbnNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogeGdwb25fdHJ4ID09PT0gKi8KKworLyogR3JvdXA6IHhncG9uX3RyeCAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX3RyeF9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfa2V5X3Bvbl9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fdHJ4IC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19idXJzdF9wcm9maWxlID0geyAubmFtZSA9ICJidXJzdF9wcm9maWxlIiwgLmRlc2NyID0gImJ1cnN0IHByb2ZpbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgYnVyc3RfcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3RyYW5zY2VpdmVyX2NvbmZpZyA9IHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfY29uZmlnIiwgLmRlc2NyID0gInRyYW5zY2VpdmVyIGNvbmZpZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHRyYW5zY2VpdmVyX2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ190cmFuc2NlaXZlcl90eXBlID0geyAubmFtZSA9ICJ0cmFuc2NlaXZlcl90eXBlIiwgLmRlc2NyID0gInRyeCB0eXBlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHRyYW5zY2VpdmVyX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfZGVidWcgPSB7IC5uYW1lID0gImRlYnVnIiwgLmRlc2NyID0gImRlYnVnIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfREVCVUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBkZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcnNzaV9ub3JtYWxfY29uZmlnID0geyAubmFtZSA9ICJyc3NpX25vcm1hbF9jb25maWciLCAuZGVzY3IgPSAicnNzaSBub3JtYWwgY29uZmlnIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgcnNzaV9ub3JtYWxfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19yc3NpX3JhbmdpbmdfY29uZmlnID0geyAubmFtZSA9ICJyc3NpX3JhbmdpbmdfY29uZmlnIiwgLmRlc2NyID0gInJzc2kgcmFuZ2luZyBjb25maWciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgcnNzaV9yYW5naW5nX2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3NlcmRlc19jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJzZXJkZXNfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJzZXJkZXMgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyA9IHsgLm5hbWUgPSAiYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyIsIC5kZXNjciA9ICJidXJzdCBwcm9maWxlIGRlbGltaXRlciBtYXggZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRV9ERUxJTUlURVJfTUFYX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0ID0geyAubmFtZSA9ICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQiLCAuZGVzY3IgPSAiUmVzZXQgcGF0dGVybnMgdXNlZCBhdCBJbml0IG9mIFJhbmdpbmctV2luZG93IGFuZCBhZnRlciBBY2Nlc3MiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0FUX0lOSVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3Jhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSA9IHsgLm5hbWUgPSAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlIiwgLmRlc2NyID0gInJhbmdpbmcgc20gcGF0dGVybnMgRUQgZmFpbHVyZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfRURfRkFJTFVSRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcmVzZXRfb25fZGVsX21pc3MgPSB7IC5uYW1lID0gInJlc2V0X29uX2RlbF9taXNzIiwgLmRlc2NyID0gInJlc2V0IG9uIGRlbCBtaXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCByZXNldF9vbl9kZWxfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfZWRfc3RhdGUgPSB7IC5uYW1lID0gImVkX3N0YXRlIiwgLmRlc2NyID0gImVkIHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRURfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBlZF9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2VkX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19pbnZlcnRfZWQgPSB7IC5uYW1lID0gImludmVydF9lZCIsIC5kZXNjciA9ICJpbnZlcnQgRUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9JTlZFUlRfRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBpbnZlcnRfZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2VuZF9vZl9idXJzdF9yZXNldCA9IHsgLm5hbWUgPSAiZW5kX29mX2J1cnN0X3Jlc2V0IiwgLmRlc2NyID0gImVuZCBvZiBidXJzdCByZXNldCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIGVuZF9vZl9idXJzdF9yZXNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfdHJ4X3JzdF9wb2xhcml0eSA9IHsgLm5hbWUgPSAidHJ4X3JzdF9wb2xhcml0eSIsIC5kZXNjciA9ICJUUlggcmVzZXQgcG9sYXJpdHkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUlhfUlNUX1BPTEFSSVRZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgdHJ4X3JzdF9wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX3RyeF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2J1cnN0X3Byb2ZpbGUsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfdHJhbnNjZWl2ZXJfY29uZmlnLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3RyYW5zY2VpdmVyX3R5cGUsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfZGVidWcsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcnNzaV9ub3JtYWxfY29uZmlnLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3Jzc2lfcmFuZ2luZ19jb25maWcsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfc2VyZGVzX2NvbmZpZ3VyYXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycywgJnByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3Jlc2V0X29uX2RlbF9taXNzLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2VkX3N0YXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2ludmVydF9lZCwgJnByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19lbmRfb2ZfYnVyc3RfcmVzZXQsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfdHJ4X3JzdF9wb2xhcml0eSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ1cnN0X3Byb2ZpbGUiLCAuZGVzY3IgPSAiYnVyc3QgcHJvZmlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBidXJzdF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCB9LCB7IC5uYW1lID0gInRyYW5zY2VpdmVyX2NvbmZpZyIsIC5kZXNjciA9ICJ0cmFuc2NlaXZlciBjb25maWciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgdHJhbnNjZWl2ZXJfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgfSwgeyAubmFtZSA9ICJ0cmFuc2NlaXZlcl90eXBlIiwgLmRlc2NyID0gInRyeCB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHRyYW5zY2VpdmVyX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfdHlwZSB9LCB7IC5uYW1lID0gImRlYnVnIiwgLmRlc2NyID0gImRlYnVnIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIGRlYnVnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2RlYnVnIH0sIHsgLm5hbWUgPSAicnNzaV9ub3JtYWxfY29uZmlnIiwgLmRlc2NyID0gInJzc2kgbm9ybWFsIGNvbmZpZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCByc3NpX25vcm1hbF9jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgfSwgeyAubmFtZSA9ICJyc3NpX3JhbmdpbmdfY29uZmlnIiwgLmRlc2NyID0gInJzc2kgcmFuZ2luZyBjb25maWciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgcnNzaV9yYW5naW5nX2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgfSwgeyAubmFtZSA9ICJzZXJkZXNfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJzZXJkZXMgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBzZXJkZXNfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAiYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyIsIC5kZXNjciA9ICJidXJzdCBwcm9maWxlIGRlbGltaXRlciBtYXggZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNCB9LCB7IC5uYW1lID0gInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCIsIC5kZXNjciA9ICJSZXNldCBwYXR0ZXJucyB1c2VkIGF0IEluaXQgb2YgUmFuZ2luZy1XaW5kb3cgYW5kIGFmdGVyIEFjY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gfSwgeyAubmFtZSA9ICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUiLCAuZGVzY3IgPSAicmFuZ2luZyBzbSBwYXR0ZXJucyBFRCBmYWlsdXJlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB9LCB7IC5uYW1lID0gInJlc2V0X29uX2RlbF9taXNzIiwgLmRlc2NyID0gInJlc2V0IG9uIGRlbCBtaXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHJlc2V0X29uX2RlbF9taXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZWRfc3RhdGUiLCAuZGVzY3IgPSAiZWQgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgZWRfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9lZF9zdGF0ZSB9LCB7IC5uYW1lID0gImludmVydF9lZCIsIC5kZXNjciA9ICJpbnZlcnQgRUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgaW52ZXJ0X2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZW5kX29mX2J1cnN0X3Jlc2V0IiwgLmRlc2NyID0gImVuZCBvZiBidXJzdCByZXNldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBlbmRfb2ZfYnVyc3RfcmVzZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0cnhfcnN0X3BvbGFyaXR5IiwgLmRlc2NyID0gIlRSWCByZXNldCBwb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCB0cnhfcnN0X3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiB4cG9uX3NlcmRlcyA9PT09ICovCisKKy8qIEdyb3VwOiB4cG9uX3NlcmRlcyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gTkkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2tleV9pbnN0YW5jZSA9IHsgLm5hbWUgPSAiaW5zdGFuY2UiLCAuZGVzY3IgPSAiSW5zdGFuY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2tleSwgaW5zdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfaW5zdGFuY2UgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4cG9uX3NlcmRlc19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19rZXlfaW5zdGFuY2UgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIE5JIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImluc3RhbmNlIiwgLmRlc2NyID0gIkluc3RhbmNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXksIGluc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyZGVzX2luc3RhbmNlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeHBvbl9zZXJkZXNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeHBvbl9zZXJkZXNfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeHBvbl9zZXJkZXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4cG9uX3NlcmRlcyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF92Z2EgPSB7IC5uYW1lID0gInJ4X3ZnYSIsIC5kZXNjciA9ICJSeCBWZ2EiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfdmdhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X3BmID0geyAubmFtZSA9ICJyeF9wZiIsIC5kZXNjciA9ICJQZWFraW5nIEZpbHRlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfUEYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X3BmKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2xmcGYgPSB7IC5uYW1lID0gInJ4X2xmcGYiLCAuZGVzY3IgPSAiTG93IEZyZXF1ZW5jeSBQZWFraW5nIEZpbHRlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfTEZQRiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfbGZwZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF9kZmUxID0geyAubmFtZSA9ICJyeF9kZmUxIiwgLmRlc2NyID0gIlJ4IERGRTEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlMiA9IHsgLm5hbWUgPSAicnhfZGZlMiIsIC5kZXNjciA9ICJSeCBERkUyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUyLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlMyA9IHsgLm5hbWUgPSAicnhfZGZlMyIsIC5kZXNjciA9ICJSeCBERkUzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlNCA9IHsgLm5hbWUgPSAicnhfZGZlNCIsIC5kZXNjciA9ICJSeCBERkU0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9kZmU0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlNSA9IHsgLm5hbWUgPSAicnhfZGZlNSIsIC5kZXNjciA9ICJSeCBERkU1IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9kZmU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfcHJlID0geyAubmFtZSA9ICJ0eF9wcmUiLCAuZGVzY3IgPSAiVHggUHJlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X3ByZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9tYWluID0geyAubmFtZSA9ICJ0eF9tYWluIiwgLmRlc2NyID0gIlR4IE1haW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX01BSU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X21haW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfcG9zdDEgPSB7IC5uYW1lID0gInR4X3Bvc3QxIiwgLmRlc2NyID0gIlR4IFBvc3QxIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfcG9zdDIgPSB7IC5uYW1lID0gInR4X3Bvc3QyIiwgLmRlc2NyID0gIlR4IFBvc3QyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9wb3N0MyA9IHsgLm5hbWUgPSAidHhfcG9zdDMiLCAuZGVzY3IgPSAiVHggUG9zdDMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9wb3N0MyksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3R4X2FtcCA9IHsgLm5hbWUgPSAidHhfYW1wIiwgLmRlc2NyID0gIlR4IEFtcCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9hbXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4cG9uX3NlcmRlc19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfdmdhLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfcGYsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF9sZnBmLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlMSwgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2RmZTIsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF9kZmUzLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlNCwgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2RmZTUsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9wcmUsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9tYWluLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfcG9zdDEsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9wb3N0MiwgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3R4X3Bvc3QzLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfYW1wIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyeF92Z2EiLCAuZGVzY3IgPSAiUnggVmdhIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfdmdhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicnhfcGYiLCAuZGVzY3IgPSAiUGVha2luZyBGaWx0ZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9wZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X2xmcGYiLCAuZGVzY3IgPSAiTG93IEZyZXF1ZW5jeSBQZWFraW5nIEZpbHRlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2xmcGYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyeF9kZmUxIiwgLmRlc2NyID0gIlJ4IERGRTEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlMiIsIC5kZXNjciA9ICJSeCBERkUyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMiksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlMyIsIC5kZXNjciA9ICJSeCBERkUzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMyksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlNCIsIC5kZXNjciA9ICJSeCBERkU0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlNCksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlNSIsIC5kZXNjciA9ICJSeCBERkU1IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlNSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAidHhfcHJlIiwgLmRlc2NyID0gIlR4IFByZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X3ByZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInR4X21haW4iLCAuZGVzY3IgPSAiVHggTWFpbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X21haW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eF9wb3N0MSIsIC5kZXNjciA9ICJUeCBQb3N0MSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X3Bvc3QxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHhfcG9zdDIiLCAuZGVzY3IgPSAiVHggUG9zdDIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9wb3N0MiksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAidHhfcG9zdDMiLCAuZGVzY3IgPSAiVHggUG9zdDMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9wb3N0MyksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAidHhfYW1wIiwgLmRlc2NyID0gIlR4IEFtcCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X2FtcCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBBUEkgSGVscGVyIEZ1bmN0aW9uIEltcGxlbWVudGF0aW9ucyA9PT09ICovCitiY21vc19lcnJubyBhcGlfY2xpX29iamVjdF9zdHJ1Y3Rfc2l6ZShiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X21ndF9ncm91cCBncm91cCwgdWludDE2X3Qgc3ViZ3JvdXAsIHVpbnQzMl90ICprZXlfc2l6ZSwgdWludDMyX3QgKmtleV9vZmZzZXQsIHVpbnQzMl90ICpkYXRhX3NpemUsIHVpbnQzMl90ICpkYXRhX29mZnNldCkKK3sKKyAgICBpZiAoKChrZXlfc2l6ZSA9PSBOVUxMKSB8fCAoa2V5X29mZnNldCA9PSBOVUxMKSkgfHwgKChkYXRhX3NpemUgPT0gTlVMTCkgfHwgKGRhdGFfb2Zmc2V0ID09IE5VTEwpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIHN3aXRjaCAob2JqKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfTklfT1BFUl9JRF9TRVRfQUVfTklfRU5fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9EUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0NIQU5ORUw6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2NoYW5uZWxfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9jaGFubmVsX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9ERUJVRzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX0FVVE9fSURfQ0xJX09VVFBVVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2xpX291dHB1dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX0FVVE9fSURfRklMRV9BTE1PU1RfRlVMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9DTElfSU5QVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9pbnB1dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9pbnB1dCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUQVJUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9TVE9QX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1JFU0VUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0RFVklDRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RFVklDRV9SRUFEWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0VTVEFCTElTSEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RFVklDRV9LRUVQX0FMSVZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RJU0NPTk5FQ1RJT05fQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3IsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3IsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVhDRVBUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0lORElDQVRJT05TX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfRERSX1RFU1RfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kaXNjb25uZWN0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SRVNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9yZXNldCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9yZXNldCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfU1dfVVBHUkFERV9BQ1RJVkFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGEsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JVTl9ERFJfVEVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3QsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTUFYX0xJTktfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9SQU5HRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9URE1fQ0hBTk5FTFNfRVhIQVVTVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfUk9HVUVfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX0xJTks6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0VOQ1JZUFRJT05fRU5BQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVHX0FDS19USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9SQU5HRV9WQUxVRV9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0xJTktfU1BFRURfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2gsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9SRVBPUlRfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9ESVNDT1ZFUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfREVSRUdJU1RFUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9SRVJBTkdFX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX0RFTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0ZPUkNFX1JFRElTQ09WRVJZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9ERUxFVEVfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGluaywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3AsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX1NUQVRJQ19SRUdJU1RSQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb24sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfSURfSU5KRUNUX0ZSQU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX1JYX0lEX0ZSQU1FX0NBUFRVUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX05PX1JFUE9SVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9MTElEX1FVQVJBTlRJTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JFUkFOR0VfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NFVF9FUE9OX05JX0VOX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmssIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfbGluaywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX01VTFRJQ0FTVF9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGluaywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUk9HVUVfTExJRF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2NhbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUlA6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcnBfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9ycF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3JwX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUElPOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncGlvX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bpb19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwaW9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX0dFVF9TVEFUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0cywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHMsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQ6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9TQ0FOX01BQ19UQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX05FV19NQUM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hYywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWMsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTUFDX0FHRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19NT1ZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19EUk9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0xPUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2xvcywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2xvc19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9sb3MsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NFVF9QT05fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9SRVNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Jlc2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3csIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3csIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1RPRF9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3QsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fT05VOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FMQVJNOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm0sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm0sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ET1dJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kb3dpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2Rvd2ksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NmaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NmaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NESToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2RpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3NkaV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2RpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZmksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZmksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TVUZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdWZpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N1ZmksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0FJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9sb2FpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2xvYWksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ER0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2RnaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2RnaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BFRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGVlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3BlZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGVlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wc3QsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wc3QsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV90aXdpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Rpd2ksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0tJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9sb2tpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2xva2ksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9NRU1JOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9tZW1pLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X21lbWksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRVJSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcnIsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcnIsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SRUk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JlaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JlaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1JBTkdJTkdfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT1BUSUNBTF9SRUZMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1NTSUJMRV9EUklGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfUlNTSV9NRUFTVVJFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHMsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfT01DSV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9UUlg6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fdHJ4X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fdHJ4X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fdHJ4X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTE9HR0VSOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX0NMRUFSX0xPRzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2csIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9OTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDYxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVFVTX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9OTklfU0VSREVTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc2VyZGVzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1I6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT046CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVE9QX0NBUFRVUkVfV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3csIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX0dFVF9TVEFUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fSVdGOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2l3Zl9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25faXdmX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2xvcywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2xvcywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX09OVV9ESVNDT1ZFUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9DUFVfUEFDS0VUU19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9PTlVfVVBHUkFERV9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Jlc2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0RJU0FCTEVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9SVU5fU1BFQ0lBTF9CV19NQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3csIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1RPRF9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHMsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUxBUk06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm0sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kb3dpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZG93aSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZmksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0RJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NkaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0RGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kZmksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2RmaV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2RmaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QUVNJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bxc2ksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wcXNpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NVRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N1ZmksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVElXSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90aXdpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9MT09DSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9sb29jaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9sb29jaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT1BUSUNBTF9SRUZMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2RnaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZGdpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPU1NJQkxFX0RSSUZUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JFR0lTVFJBVElPTl9JRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9MRVZFTF9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVFVOSU5HX1JFU1BPTlNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTExJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0xFVkVMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0NPTlNVTVBUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW4sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHMsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfUlhfSURfQ1BVX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfUlhfSURfT01DSV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7ICAgIC8qKjwgIHNob3VsZCBuZXZlciBoYXBwZW4uICovCit9CisKK2JjbW9zX2Vycm5vIGFwaV9jbGlfb2JqZWN0X3N1Ymdyb3VwX25hbWUoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmRlc2NyKQoreworICAgIHN3aXRjaCAob2JqKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX05JX09QRVJfSURfU0VUX0FFX05JX0VOX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfYWVfbmlfZW5fc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldCB0aGUgQUUgTkkgZW5hYmxlIHN0YXRlLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9EUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGF0YV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhYm9ydF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkYXRhX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVuaWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFib3J0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmNzX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm92ZXJzaXplX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJydW50X2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQ0hBTk5FTDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9ERUJVRzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19BVVRPX0lEX0NMSV9PVVRQVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNsaV9vdXRwdXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNMSSBPdXRwdXQgU3RyaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX0FVVE9fSURfRklMRV9BTE1PU1RfRlVMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmlsZV9hbG1vc3RfZnVsbCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhpcyBpbmRpY2F0aW9uIGlzIHNlbnQgd2hlbiBERFIgbG9nIGZpbGUgaXMgNzUlIGZ1bGwiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfQ0xJX0lOUFVUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjbGlfaW5wdXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNMSSBJbnB1dCBTdHJpbmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9TVEFSVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhcnRfYXBpX2NhcHR1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0YXJ0IEFQSSBDYXB0dXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfU1RPUF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RvcF9hcGlfY2FwdHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RvcCBBUEkgQ2FwdHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1JFU0VUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZXNldF9hcGlfY2FwdHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVzZXQgQVBJIENhcHR1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0RFVklDRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfUkVBRFk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRldmljZV9yZWFkeSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRGV2aWNlIHJlYWR5IGluZGljYXRpb24gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAobm90IHNlbnQgdG8gdGhlIGhvc3QgYXBwbGljYXRpb24pLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0VTVEFCTElTSEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjb25uZWN0aW9uX2VzdGFibGlzaGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDb25uZWN0aW9uIGVzdGFibGlzaGVkIGluZGljYXRpb24gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAobm90IHNlbnQgdG8gdGhlIGhvc3QgYXBwbGljYXRpb24pLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfS0VFUF9BTElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGV2aWNlX2tlZXBfYWxpdmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktlZXAgYWxpdmUgbWVzc2FnZSBmcm9tIHRoZSBkZXZpY2UgdG8gdGhlIGhvc3QgLSB1c2VkIGJ5IHRoZSBkZXZpY2UgY29udHJvbCBsaWJyYXJ5IChub3Qgc2VudCB0byB0aGUgaG9zdCBhcHBsaWNhdGlvbikuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY29ubmVjdGlvbl9mYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgaG9zdCBmYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgZGV2aWNlLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjb25uZWN0aW9uX2NvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgaG9zdCBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIHRoZSBkZXZpY2UuICBUaGUgZGV2aWNlIGhhcyBlaXRoZXIgYmVlbiByZXByb2dyYW1tZWQgd2l0aCBuZXcgZmlybXdhcmUsIG9yIGEgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQgd2l0aCBhbiBleGlzdGluZyBkZXZpY2UgKHNlZSB0aGUgXCJzdGFuZGFsb25lXCIgZmllbGQpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkaXNjb25uZWN0aW9uX2NvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgaG9zdCBzdWNjZXNzZnVsbHkgZGlzY29ubmVjdGVkIGZyb20gdGhlIGRldmljZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN3X2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdyBlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9TV19FWENFUFRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN3X2V4Y2VwdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3cgZXhjZXB0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0lORElDQVRJT05TX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImluZGljYXRpb25zX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBpbmRpY2F0aW9ucyBhcmUgZHJvcHBlZCBkdWUgdG8gY29uZ2VzdGlvbiAvIHNoYXBpbmcuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW1hZ2UgVHJhbnNmZXIgQ29tcGxldGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfRERSX1RFU1RfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRkcl90ZXN0X2NvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgRERSIFRlc3QgaGFzIGNvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY29ubmVjdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RhcnQgY29ubmVjdGlvbiBwcm9jZXNzIGJldHdlZW4gdGhlIGhvc3QgcHJvY2Vzc29yIGFuZCB0aGUgZGV2aWNlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRpc2Nvbm5lY3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkRpc2Nvbm5lY3QgdGhlIGhvc3QgZnJvbSB0aGUgZGV2aWNlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZXNldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVzZXRzIHRoZSBob3N0L2RldmljZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSE9TVF9LRUVQX0FMSVZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJob3N0X2tlZXBfYWxpdmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktlZXAgYWxpdmUgbWVzc2FnZSBmcm9tIHRoZSBob3N0IHRvIHRoZSBkZXZpY2UgLSB1c2VkIGJ5IHRoZSBkZXZpY2UgY29udHJvbCBsaWJyYXJ5IChzaG91bGQgbm90IGJlIHNlbnQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24pLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9TV19VUEdSQURFX0FDVElWQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzd191cGdyYWRlX2FjdGl2YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTVyBpbWFnZSBhY3RpdmF0aW9uIGZvciBJbi1TZXJ2aWNlIFNXIHVwZ3JhZGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImltYWdlX3RyYW5zZmVyX3N0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGlzIEFQSSBtZXNzYWdlIGluZm9ybXMgdGhlIE9MVCBvZiB0aGUgc3RhcnQgb2YgaW1hZ2UgdHJhbnNmZXIsIGFuZCBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGZpbGUgaW1hZ2UuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX0RBVEE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImltYWdlX3RyYW5zZmVyX2RhdGEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInVzZWQgZm9yIHRyYW5zZmVycmluZyB0aGUgYWN0dWFsIGRhdGEgZnJvbS90byB0aGUgT0xULiAgIG5vdCB0byBiZSBkaXJlY3RseSBjYWxsZWQgYnkgdGhlIHVzZXIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JVTl9ERFJfVEVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnVuX2Rkcl90ZXN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSdW4gYSB0ZXN0IG9uIG9uZSBvciBtb3JlIG9mIHRoZSBERFIgY29tcG9uZW50cy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTks6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1VOS05PV05fTElOS19WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVua25vd25fbGlua192aW9sYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciB3aGlsZSB0aGUgUE9OIHdhcyBzZXQgdG8gXCJub3RpZnkgdW5rbm93blwiIHJlZ2lzdHJhdGlvbiBiZWhhdmlvciBhbmQgdGhpcyBsaW5rIHdhcyBub3QgcHJlLXByb3Zpc2lvbmVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGlzIGlzIHdoZW4gbGluayB0cmllcyB0byByZWdpc3RlciBhbmQgdGhlcmUgYXJlIGFscmVhZHkgdG9vIG1hbnkgZXhpc3RpbmcgbGFzZXIgb24vb2ZmIGNvbWJpbmF0aW9ucy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxhc2VyX29uX29mZl92aW9sYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoaXMgaXMgd2hlbiBhIGxpbmsgdHJpZXMgdG8gcmVpZ3N0ZXIgd2l0aCBhbiBpbXBvc3NpYmxlIGxhc2VyIG9uIG9yIG9mZiB0aW1lLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTUFYX0xJTktfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtYXhfbGlua192aW9sYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgaXQgd291bGQgaGF2ZSBwdXQgdXMgb3ZlciB0aGUgcHJvdmlzaW9uZWQgbWF4IGxpbmtzIGZvciB0aGUgY29ycmVzcG9uZGluZyBFUE9OIE5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBsaW5rIHRyaWVkIHRvIHJlZ2lzdGVyIGFuZCBpdCB0aGVyZSBhcmUgbm8gTExJRHMgYXZhaWxhYmxlLiBJZiB0aGlzIG9jY3VycywgaXQgaXMgcG9zc2libGUgdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCB5b3VyICdtYXggbGlua3MnIGFuZC9vciAnQmFzZSBMTElEJyBmaWVsZHMgb24geW91ciBSUC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgd2Ugd2VyZSB1bmFibGUgdG8gYWxsb2NhdGUgc3lzdGVtIHJlc291cmNlcyBmb3IgaXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9SQU5HRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJhbmdlX3Zpb2xhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBsaW5rIHRyaWVkIHRvIHJlZ2lzdGVyIHdpdGggYSByYW5nZSB2YWx1ZSB0aGF0IHdhcyBvdXRzaWRlIG9mIHRoZSBtaW4vbWF4IGZpYmVyIGxlbmd0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInRkbV9jaGFubmVsc19leGhhdXN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRETSBDaGFubmVscyBFeGhhdXN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1JPR1VFX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicm9ndWVfdmlvbGF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIFJvZ3VlIE9OVSB3YXMgZGV0ZWN0ZWQgb24gdGhpcyBsaW5rL0xMSUQuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhpcyBsaW5rIGZhaWxlZCB0byByZWdpc3RlciBiZWNhdXNlIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgdXBzdHJlYW0gYmFuZHdpZHRoIGF2YWlsYWJsZSB0byBwcm92aWRlIHRoZSBkZWZhdWx0IFVCRC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fTElOSzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2RhdGFfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9kYXRhX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfNjQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMjU2XzUxMSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzEwMjRfMTUxOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMTUxOV8yMDQ3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc180MDk2XzkyMTYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc185MjE3XzE2MzgzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb2FtX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb2FtX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9tcGNwX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF91bmljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfbXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9yZXBvcnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlcG9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2Zjc19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9vdmVyc2l6ZV9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcnVudF9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbGluZSBjb2RlIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3JfbWF4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGxpbmUgY29kZSBlcnJvcnMgbWF4IHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2RhdGFfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZGF0YV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc180MDk2XzkyMTYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc185MjE3XzE2MzgzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfb2FtX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfb2FtX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9tcGNwX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF91bmljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9nYXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBnYXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2VfZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIE9MVCBmYWlsZWQgdG8gcmVjZWl2ZSBhbiB1cGRhdGVkIGVuY3J5cHRpb24ga2V5IHdpdGhpbiB0aGUgZXhwZWN0ZWQgdGltZSBwZXJpb2QgYWZ0ZXIgZW5jcnlwdGlvbiBrZXkgZXhjaGFuZ2UgaGFzIGJlZW4gaW5pdGlhdGVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9FTkNSWVBUSU9OX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImVuY3J5cHRpb25fZW5hYmxlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRW5jcnlwdGlvbiBoYXMgYmVlbiBzdGFydGVkIG9uIHRoZSBNYXBsZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1wY3BfcmVnX2Fja190aW1lb3V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBbiBNUENQIHJlZ2lzdGVyIGFja25vd2xlZGdlbWVudCB3YXMgbm90IHJlY2VpdmVkIGluIHRoZSBleHBlY3RlZCB0aW1lIGludGVydmFsIGZvciBhIGxpbmsgdGhhdCB0cmllZCB0byByZWdpc3RlciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9SQU5HRV9WQUxVRV9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyYW5nZV92YWx1ZV9jaGFuZ2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIHNlbnQgd2hlbiBhIHJhbmdlIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGxpbmsgaGFzIHVuZGVyZ29uZSBhIHByb3RlY3Rpb24gc3dpdGNoIGV2ZW50LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgcmVnaXN0ZXIgcmVxdWVzdGVkIHdhcyByZWNlaXZlZCBmb3IgYSBsaW5rIHdpdGggdGhlIHNhbWUgTUFDIGFkZHJlc3MgYXMgYSBsaW5rIHRoYXQgaGFzIGFscmVhZHkgcmVnaXN0ZXJlZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTElOS19TUEVFRF9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibGlua19zcGVlZF9taXNtYXRjaCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSG9zdCB3aWxsIHJlY2VpdmUgdGhpcyBpbmRpY2F0aW9uIGlmIGEgbGluayByZWdpc3RlcnMgdGhlbiBhdHRlbXB0cyB0byByZWdpc3RlciBsYXRlciBhdCBhIGRpZmZlcmVudCBzcGVlZCwgb3IgaWYgdGhlIGxpbmsgcmVnaXN0ZXJzIGF0IGEgZGlmZmVyZW50IHNwZWVkIHRoYW4gdGhlIHNwZWVkIHdpdGggd2hpY2ggaXQgd2FzIHByZS1wcm92aXNpb25lZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9SRVBPUlRfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXBjcF9yZXBvcnRfdGltZW91dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIHByb3Zpc2lvbmVkIGxpbWl0IGJldHdlZW4gcmVwb3J0cyBmb3IgdGhlIHNwZWNpZmllZCBsaW5rIGhhcyBiZWVuIGV4Y2VlZGVkLiAgVGhpcyBsaW5rIHdpbGwgYmUgZGUtcmVnaXN0ZXJlZCwgYW5kIHRoZSBhbGFybV9zdGF0dXMgc2V0IHdoZW4gdGhpcyBvY2N1cnMuICBUaGUgYWxhcm1fc3RhdHVzIHdpbGwgYmUgY2xlYXJlZCB3aGVuIHRoZSBsaW5rIGF0dGVtcHRzIHRvIHJlZ2lzdGVyIGFnYWluLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZW91dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIHByb3Zpc2lvbmVkIHRpbWUgbGltaXQgYmV0d2VlbiByZWNlaXZpbmcgdXBzdHJlYW0gaW5mbyBmcmFtZXMgaGFzIGJlZW4gZXhjZWVkZWQuICBOb3JtYWxseSBhbiBPTlUgd2lsbCByZXNldCBpdHMgT0FNIHN0YXRlIG1hY2hpbmUgd2hlbiB0aGlzIG9jY3VycnMgYW5kIHRoZSBob3N0IG11c3QgcmUtbmVnb3RpYXRlIE9BTSBhbmQgcmVwcm92aXNpb24gdGhlIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXBjcF9kaXNjb3ZlcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIGxpbmsgaGFzIGNvbXBsZXRlZCBNUENQIGxpbmsgcmVnaXN0cmF0aW9uLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX0RFUkVHSVNURVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXBjcF9kZXJlZ2lzdGVyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgcHJldmlvdXNseSByZWdpc3RlcmVkIGxpbmsgaGFzIGNvbXBsZXRlZCBNUENQIGRlLXJlZ2lzdHJhdGlvbi4gIFRoaXMgY291bGQgYmUgYWNjb21wYW5pZWQgYnkgYW4gbXBjcF9yZXBvcnRfdGltZW91dCBhbGFybSBpZiB0aGUgbGluayBqdXN0IGRpc2FwcGVhcmVkLCBvciBub3QgaWYgdGhpcyBpbmRpY2F0aW9uIGlzIGEgcmVzdWx0IG9mIGFuIE9MVCBzZW5kaW5nIGEgTVBDUCBkZXJlZ2lzdGVyIHRvIHRoZSBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmFpc2VkIGFmdGVyIGFuICdhZGRfbGluaycgb3BlcmF0aW9uIG9uIGFuIEVQT04gTkkgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT0FNIGtlZXBhbGl2ZSB0aW1lciBpcyBzdGFydGVkIGZvciB0aGlzIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPQU0ga2VlcGFsaXZlIHRpbWVyIGlzIHN0b3BwZWQgZm9yIHRoaXMgbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9zdGFydGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXlfZXhjaGFuZ2Vfc3RhcnRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5X2V4Y2hhbmdlX3N0b3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleV9leGNoYW5nZV9zdG9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGF0aWMgcmVnaXN0cmF0aW9uIGRvbmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUkVSQU5HRV9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZXJhbmdlX2ZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlLXJhbmdlIGZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTElOS19ERUxFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsaW5rX2RlbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkxpbmsgRGVsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0ZPUkNFX1JFRElTQ09WRVJZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmb3JjZV9yZWRpc2NvdmVyeSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRGVyZWdpc3RlciB0aGUgc3BlY2lmaWVkIEVQT04gbGluayBhbmQgZm9yY2UgaXQgdG8gcmUtcmVnaXN0ZXIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0RFTEVURV9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkZWxldGVfbGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVtb3ZlIGEgbG9naWNhbCBsaW5rIGZyb20gdGhlIHN5c3RlbSBlbnRpcmVseS4gSWYgdGhlIGxpbmsgaXMgbm90IHJlZ2lzdGVyZWQsIGl0IHdpbGwgYmUgcmVtb3ZlZC4gIElmIHRoZSBsaW5rIGlzIGN1cnJlbnRseSByZWdpc3RlcmVkLCBpdCB3aWxsICBkZXJlZ2lzdGVyZWQgYW5kIHJlbW92ZWQuICBJdCBtYXkgaW1tZWRpYXRlbHkgcmUtcmVnaXN0ZXIgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgaWYgdGhlIEVQT05fTkkgaXMgY29uZmlndXJlZCB0byBhbGxvdyBhbGwgbGlua3MgdG8gcmVnaXN0ZXIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0YXJ0IHRoZSBPQU0ga2VlcGFsaXZlIHRpbWVyIGFnYWluc3QgdGhpcyBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RvcCB0aGUgT0FNIGtlZXBhbGl2ZSB0aW1lciBmb3IgdGhpcyBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9zdGFydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQXBwbHkgdGhlIGNvcnJlc3BvbmRpbmcgcHJvdmlzaW9uaW5nIGZvciAnZXBvbl9saW5rLmtleV9leGNoYW5nZV9jb25maWcnIGFnYWluc3QgdGhpcyBsaW5rIGFuZCB0aGVuIHN0YXJ0IGtleSBleGNoYW5nZSB0aW1lciB3aXRoIHRoZSBnaXZlbiBwZXJpb2QuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0tFWV9FWENIQU5HRV9TVE9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2Vfc3RvcCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RvcHMgdGhlIGtleSBleGNoYW5nZSB0aW1lciBmb3IgdGhpcyBsaW5rLiBUaGlzIG9wZXJhdGlvbiBzaG91bGQgZ2VuZXJhbGx5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBrZXlfZXhjaGFuZ2Vfc3RhcnQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX1NUQVRJQ19SRUdJU1RSQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRpY19yZWdpc3RyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0YXRpY2FsbHkgcmVnaXN0ZXJzIHRoZSBsb2dpY2FsIGxpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfSURfSU5KRUNUX0ZSQU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbmplY3RfZnJhbWUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbmQgYW4gYXJiaXRyYXJ5IGZyYW1lIGFjcm9zcyB0aGUgc3BlY2lmaWVkIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX1JYX0lEX0ZSQU1FX0NBUFRVUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZV9jYXB0dXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBmcmFtZSBtYXRjaGluZyBob3N0LXNwZWNpZmllZCBjcml0ZXJpYSB3YXMgcmVjZWl2ZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9OT19SRVBPUlRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJub19yZXBvcnRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJMb3NzIG9mIGFsbCByZXBvcnRzIG9uIGFsbCBsaW5rcyBvbiB0aGUgRVBPTiBOSSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTExJRF9RVUFSQU5USU5FRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibGxpZF9xdWFyYW50aW5lZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTExJRCBRdWFyYW50aW5lZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCBhZnRlciBhICdzZXRfZXBvbl9uaV9lbl9zdGF0ZScgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9SRVJBTkdFX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJlcmFuZ2VfZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGVzIHRoZSByZS1yYW5naW5nIHByb2Nlc3MgaGFzIGZhaWxlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgVXBncmFkZSBDb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUk9HVUVfU0NBTl9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicm9ndWVfc2Nhbl9jb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kY2lhdGlvbiB0aGF0IGEgc2NhbiBpcyBjb21wbGV0ZSwgYW55IGVycm9yIGlzIGFsc28gcmV0dXJuZWQuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXBjcF90aW1lc3RhbXBfY2hhbmdlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBjbG9jayB0cmFuc3BvcnQgcHVsc2Ugd2FzIHJlY2VpdmVkIGF0IHRoZSBnaXZlbiBNUENQIHRpbWVzdGFtcC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGF1dG8gcm9ndWUgc2NhbiBmb3VuZCBwb3NzaWJsZSByb2d1ZSBvbnVzIG9uIHRoZSAxRyBzdHJlYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGF1dG8gcm9ndWUgc2NhbiBmb3VuZCBwb3NzaWJsZSByb2d1ZSBvbnVzIG9uIHRoZSAxRyBzdHJlYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU0VUX0VQT05fTklfRU5fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNldF9lcG9uX25pX2VuX3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXQgdGhlIEVQT04gTkkgZW5hYmxlIHN0YXRlLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiaXNzdWVfcnNzaV9ncmFudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSXNzdWVzIGFuIFJTU0kgZ3JhbnQgdG8gcmVhZCBSWCBQb3dlciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFkZF9saW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQcmUtcHJvdmlzaW9uIGFuIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9NVUxUSUNBU1RfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWRkX211bHRpY2FzdF9saW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQcmUtcHJvdmlzaW9uIGFuIEVQT04gbXVsdGljYXN0IGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFkZHMgYSBwcm90ZWN0ZWQgc3RhbmRieSBsaW5rLiAgT25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkLCB0aGUgbGluayBpcyBjb25zaWRlcmVkIFwic3RhbmRieVwiIGZvciB0aGUgcHVwb3NlcyBvZiBwcm90ZWN0aW9uIHN3aXRjaGluZy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGx5IHJlLXJhbmdlIGRlbHRhIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9ST0dVRV9MTElEX1NDQU46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX2xsaWRfc2NhbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSXNzdWUgYSByZXF1ZXN0IHRvIHNjYW4gYWxsIExMSURzIG9yIGEgc3BlY2lmaWMgTExJRCBvbiBhIFBPTiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXJ0X29udV91cGdyYWRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGFydCBPTlUgRmlybXdhcmUgVXBncmFkZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvZGVfd29yZHNfdG90YWwiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBzdGF0cyBjb2RlIHdvcmRzIHRvdGFsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgc3RhdHMgY29kZSB3b3JkcyBkZWNvZGUgZmFpbHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfemVyb2VzX2NvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIHN0YXRzIHplcm9zIGNvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19vbmVzX2NvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIHN0YXRzIG9uZXMgY29yZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJnb29kX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiR29vZCBGcmFtZSBDb3VudCwgaW5jbHVkaW5nIG5vbkZFQyBhbmQgRkVDIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZ29vZF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiR29vZCBCeXRlIENvdW50LCBpbmNsdWRpbmcgbm9uRkVDIGFuZCBGRUMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvdmVyc3pfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPdmVyc2l6ZWQgZnJhbWUgY291bnQgKGZyYW1lcyBsYXJnZXIgdGhhbiAyMDAwIGJ5dGVzKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm5vbl9mZWNfZ29vZF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk5vbiBGRUMgR29vZCBGcmFtZSBDb3VudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm5vbl9mZWNfZ29vZF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTm9uIEZFQyBHb29kIEJ5dGUgQ291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfZ29vZF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBHb29kIEZyYW1lIENvdW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2dvb2RfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBHb29kIEJ5dGUgQ291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfZnJhbWVzX2V4Y19lcnJzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgRnJhbWVzIHdoaWNoIGV4Y2VlZGVkIDggc3ltYm9sIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19ibGtzX25vX2VycnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCBubyBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfYmxrc19jb3JyX2VycnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCBjb3JyZWN0YWJsZSBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2Jsa3NfdW5jb3JyX2VycnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCB1bmNvcnJlY3RhYmxlIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29ycl9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBCeXRlcy9TeW1ib2xzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb3JyX3plcm9lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBaZXJvZXMsIDhiIGRvbWFpbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29ycl9vbmVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgQ29ycmVjdGVkIE9uZXMsIDhiIGRvbWFpbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ1bmRlcnN6X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVW5kZXJzaXplIGZyYW1lIGNvdW50IChmcmFtZXMgbGVzcyB0aGFuIDY0IGJ5dGVzKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJlcnJvcnN6X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRXJyb3JlZCBmcmFtZSAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGF0YV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdhdGVfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgZ2F0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtcGNwX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWJvcnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkYXRhX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVuaWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1wY3BfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib2FtX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJlcG9ydF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhYm9ydF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYWJvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZjc19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcmNfOF9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBDUkM4IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvdXRfb2Zfc2xvdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdXQgb2Ygc2xvdCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ1bnRfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcnVudCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkYXRhX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIE9BTSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib2FtX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdhdGVfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgZ2F0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1wY3BfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgTVBDUCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFib3J0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIGFib3J0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xMjhfMjU1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc180MDk2XzkyMTYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRhdGFfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVuaWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXBjcF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib2FtX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmVwb3J0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZXBvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWJvcnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZjc19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNyY184X2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIENSQzggZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib3V0X29mX3Nsb3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnVudF9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUlA6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BJTzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIEJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDb25maWd1cmF0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQ29sbGVjdGVkIGFsbG9jIElEIHN0YXRpc3RpY3MgZnJvbSBnZXRfc3RhdHMgb3BlcmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldHMgdGhlIGFsbG9jJ3MgYWN0aXZhdGlvbiBzdGF0ZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyBvbiBhbiBhY3RpdmUtc3RhbmRieSBQT04uICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGlzIGlzbid0IG5lY2Vzc2FyeSBzaW5jZSBhbGxvY3MgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggdGhlIE9OVS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX0dFVF9TVEFUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZ2V0X3N0YXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSdW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgR0VNIGZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNvbmZpZ3VyYXRpb24gQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldHMgdGhlIEdFTSBwb3J0J3MgYWN0aXZhdGlvbiBzdGF0ZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyBvbiBhbiBhY3RpdmUtc3RhbmRieSBQT04uICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGlzIGlzbid0IG5lY2Vzc2FyeSBzaW5jZSBHRU0gcG9ydHMgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggdGhlIE9OVS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZHNfaGl0X2V2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEUyBoaXQgZXZlbnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkc19taXNzX2V2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEUyBtaXNzIGV2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRFMgZHJvcCBkdWUgdG8gbWlzcyBldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRFMgZHJvcCBkdWUgdG8gaGl0IGV2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZHNfZHJvcF90b19kaXNhYmxlZF9nZW0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkRTIGRyb3AgdG8gZGlzYWJsZWQgR0VNIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibmV3X21hY19kaXNjb3ZlcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOZXcgTUFDIGRpc2NvdmVyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtb3ZlX2V2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJNb3ZlIGV2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk5ldyBNQUMgZHJvcCBkdWUgdG8gZmlmbyBmdWxsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX0ZMVVNIX01BQ19UQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZsdXNoIE1BQyBUYWJsZSBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TQ0FOX01BQ19UQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBNQUMgdGFibGUgc2NhbiBpbml0aWF0ZWQgdXNpbmcgdGhlIFwic2Nhbl9tYWNfdGFibGVcIiBvcGVyYXRpb24gaXMgY29tcGxldGUuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmbHVzaF9tYWNfdGFibGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZsdXNoIE1BQyBUYWJsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX1NDQU5fTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzY2FuX21hY190YWJsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2NhbnMgTUFDIHRhYmxlIGZvciBhIGdpdmVuIE1BQyBhZGRyZXNzIHRoZW4gcmV0dXJucyB0aGUgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9ORVdfTUFDOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJuZXdfbWFjIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBuZXcgTUFDIGFkZHJlc3MgLyBWSUQgY29tYmluYXRpb24gaXMgc2VlbiBpbiB0aGUgdXBzdHJlYW0gdHJhZmZpYyBzdHJlYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19BR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtYWNfYWdlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgTUFDIHRhYmxlIGVudHJ5IGFnZXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19NT1ZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtYWNfbW92ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIHRoZSBNQUMgdGFibGUgaXMgaW4gbW92ZSBtb2RlIGFuZCBhIHBhY2tldCBpcyBzZWVuIHRoYXQgbWF0Y2hlcyBvbiBNQUMgYWRkcmVzcyAvIFZJRCBidXQgZG9lc24ndCBtYXRjaCBvbiBmbG93IElELiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibWFjX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhbiBlbnRyeSBjYW5ub3QgYmUgbGVhcm5lZCBzaW5jZSB0aGUgTUFDIHRhYmxlIGlzIGZ1bGwuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBGRUMgY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgdW5jb3JyZWN0ZWQgRkVDIGNvZGV3b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJpcDhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXA4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYmlwOF9lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGJpcDggZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZ2VtX3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9nZW1fZHJvcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBHRU0gSUQgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2dlbV9pZGxlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBpZGxlIEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9nZW1fY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBjb3JyZWN0ZWQgR0VNIGZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2dlbV9pbGxlZ2FsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBpbGxlZ2FsIEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9hbGxvY2F0aW9uc192YWxpZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgaW52YWxpZCBhbGxvY2F0aW9ucyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBQbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBub24gaWRsZSBQbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBlcnJvciBQbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGRyb3BwZWQgUGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2NwdSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgQ1BVIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb21jaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZHJvcHBlZF90b29fc2hvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBzaG9ydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19sb25nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2NyY19lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBjcmMgZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfa2V5X2Vycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGtleSBlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFnbWVudHNfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gZnJhZ21lbnRhdGlvbiBlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wYWNrZXRzX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkdsb2JhbCBkcm9wcGVkIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZ2VtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBHRU0gZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3Bsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgUGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2dlbV9mcmFnbWVudHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFnbWVudHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfY3B1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBDUFUgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9vbWNpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0dGVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBpbGxlZ2FsIGxlbmd0aCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9kcm9wcGVkX3RwaWRfbWlzcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRHJvcHBlZCBiZWNhdXNlIG9mIFRQSUQgbWlzcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9kcm9wcGVkX3ZpZF9taXNzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEcm9wcGVkIGJlY2F1c2Ugb2YgVklEIG1pc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGF0ZSBDaGFuZ2UgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxvcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTE9TIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXJpYWwgTnVtYmVyIEFjcXVpc2l0aW9uIEN5Y2xlIFN0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFmdGVyIGEgc3dpdGNob3ZlciBpcyBjb21wbGV0ZSBhbmQgYWxsIE9OVSByYW5naW5nIHRpbWVzIGhhdmUgc3RhYmlsaXplZCwgdGhpcyBpbmRpY2F0aW9uIGlzIHNlbnQgdG8gaW5mb3JtIHRoZSBob3N0IG9mIGFsbCBuZXcgT05VIEVRRHMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlByb3RlY3Rpb24gU3dpdGNoaW5nIFN3aXRjaG92ZXIgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0YW5kYnkgUE9OIE1vbml0b3JpbmcgQ3ljbGUgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2Rpc2NvdmVyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBEaXNjb3ZlcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9DUFVfUEFDS0VUU19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcHVfcGFja2V0c19mYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIGZhaWx1cmUgd2FzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgXCJjcHVfcGFja2V0c1wiIHByb3h5IG9wZXJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiZGVhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiZGlzYWJsZSBhbGwgb251cyBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImVuYWJsZSBhbGwgb251cyBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidG9kX3JlcXVlc3RfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUT0QgcmVxdWVzdCBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfdXBncmFkZV9jb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIFVwZ3JhZGUgQ29tcGxldGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSb2d1ZSBPTlUgc3BlY2lhbCBtYXAgY3ljbGUgc3RhcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfcG9uX3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXQgUE9OIFN0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9SRVNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmVzZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlc2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRpc2FibGVfc2VyaWFsX251bWJlciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRGlzYWJsZSBTZXJpYWwgTnVtYmVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTaW5nbGUgcmVxdWVzdCBmb3IgUE9OIG1vbml0b3JpbmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNldF9vbnVfc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldCB0aGUgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUm9ndWUgRGV0ZWN0aW9uIFdpbmRvdyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInRvZF9yZXF1ZXN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUT0QgcmVxdWVzdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJwcm90ZWN0aW9uIHN3aXRjaGluZyB0eXBlIGMgc2V0IG11bHRpcGxlIG9udSBzdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXJ0X29udV91cGdyYWRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTFQgdG8gT05VIGZpcm13YXJlIHRyYW5zZmVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY3B1X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkdQT04gQ1BVIFBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJicm9hZGNhc3RfcGxvYW1fcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJCcm9hZGNhc3QgUExPQU0gUGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX09OVToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRvdGFsIHJlY2VpdmVkIEZFQyBjb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfYnl0ZXNfY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgY29kZXdvcmRzIGNvcnJlY3RlZCBieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb2Rld29yZHNfY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgY29ycmVjdGVkIGNvZGV3b3JkcyBlcnJvciAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgbm90IGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJiaXA4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBieXRlcyBmb3IgQklQOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJpcDhfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJCaXQgZXJyb3IgYWNjb3JkaW5nIHRvIEJJUDgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wbG9hbXNfY3JjX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBQTE9BTXMgd2l0aCBDUkMgZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIG5vbiBpZGxlIFBMT0FNcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBvc2l0aXZlX2RyaWZ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQb3NpdGl2ZSBkcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOZWdhdGl2ZSBkcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9vbWNpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJiZXJfcmVwb3J0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkJFUiByZXBvcnRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ1bnJlY2VpdmVkX2J1cnN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJVbnJlY2VpdmVkIGJ1cnN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxjZGdfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJMQ0RHIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZGlfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSREkgZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJyeCBieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJyeCBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJ0eCBieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJ0eCBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2FsYXJtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgQWxhcm0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ET1dJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkb3dpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEcmlmdCBvZiBXaW5kb3cgb2YgT05VaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2ZpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTaWduYWwgRmFpbCBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0RJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZGkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNpZ25hbCBEZWdyYWRlZCBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkZmkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1VGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3VmaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU1VGaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0xPQUk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxvYWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkxPQWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ER0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRnaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QRUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBlZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUEVFIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwc3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlBTVCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1RJV0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInRpd2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWlzc2lvbiBJbnRlcmZlcmVuY2UgV2FybmluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0xPS0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxva2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkxPa2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9NRU1JOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtZW1pIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJNRU1pIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9NQ0kgUE9SVCBJRCBDb25maWd1cmF0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJCRVIgSW50ZXJ2YWwgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9FUlI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImVyciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRVJSIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUkVJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJFSSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1JBTkdJTkdfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmFuZ2luZyBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUGFzc3dvcmQgQXV0aGVudGljYXRpb24gQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBBY3RpdmF0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIERlYWN0aXZhdGlvbiBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2VuYWJsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBFbmFibGUgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBEaXNhYmxlIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkludmFsaWQgREJSdSBSZXBvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgS2V5IFJlcXVlc3QgVGltZW91dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIEN5Y2xlIFNraXBwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgS2V5IE1pc21hdGNoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgVW5jb25zZWN1dGl2ZSBJbmRleCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktleSBFeGNoYW5nZSBEZWNyeXB0IFJlcXVpcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT1BUSUNBTF9SRUZMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvcHRpY2FsX3JlZmxlY3Rpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFuIG9wdGljYWwgcmVmbGVjdGlvbiBjb25kaXRpb24gd2FzIGRldGVjdGVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAib251IGFjdGl2YXRpb24gc3RhbmRieSBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk5vdGlmaWNhdGlvbiB0aGF0IGFuIE9OVXMgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZSBoYXMgY2hhbmdlZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1NTSUJMRV9EUklGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicG9zc2libGVfZHJpZnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFuIE9OVSBpbiBhIGxvdyBwb3dlciBzdGF0ZSBtYXkgYmUgZXhwZXJpZW5jaW5nIGRyaWZ0IGJleW9uZCB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQuIFRoZSBlc3RpbWF0ZSBtYXkgYmUgaW5hY2N1cmF0ZSBkZXBlbmRpbmcgb24gT05VIGJlaGF2aW9yLiBBY3R1YWwgZHJpZnQgbWF5IGJlIGxlc3MgdGhhbiBlc3RpbWF0ZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X29udV9zdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2V0IE9OVSBTdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1JTU0lfTUVBU1VSRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJzc2lfbWVhc3VyZW1lbnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJTU0kgTWVhc3VyZW1lbnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNoYW5nZV9wb3dlcl9sZXZlbCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQ2hhbmdlIFBvd2VyIExldmVsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNwdV9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJHUE9OIENQVSBQYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicGxvYW1fcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQTE9BTSBQYWNrZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcHVfcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0ZXMgQ1BVIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24gdGhlIFVTIGZyb20gdGhpcyBPTlUgaWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfT01DSV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9tY2lfcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0ZXMgT01DSSBwYWNrZXQgd2FzIHJlY2VpdmVkIG9uIHRoZSBVUyBmcm9tIHRoaXMgT05VIGlkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX1RSWDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtc2dfY291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIm1zZyBjb3VudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxvc3RfbXNnX2NvdW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJsb3N0IG1zZyBjb3VudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRU5UUllfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9MT0dHRVI6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsaW5lc19pbl9sb2ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImxpbmVzIGluIGxvZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfT1BFUl9JRF9DTEVBUl9MT0c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNsZWFyX2xvZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2xlYXIgbG9nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9OTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfNjQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA2NCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgUlggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTI4IHRvIDI1NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMjU2XzUxMSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgUlggNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzEwMjRfMTUxOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMTUxOV8yMDQ3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzQwOTZfOTIxNiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaW5jbHVkZXMgYWxsIGVycm9yZWQgZnJhbWVzIGFzIHdlbGwuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9nb29kX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBnb29kIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgdW5pY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X211bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgbXVsdGljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBicm9hZGNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mY3NfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIEZDUyBlcnJvcnMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2NvbnRyb2xfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGNvbnRyb2wgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wYXVzZV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGF1c2UgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wZmNfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIFBGQyBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3Vuc3VwcG9ydGVkX29wY29kZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBVbnN1cHBvcnRlZCBPcGNvZGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF91bnN1cHBvcnRlZF9kYSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB1bnN1cHBvcnRlZCBEQSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2FsaWdubWVudF9lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYWxpZ25tZW50IGVycm9ycyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfbGVuZ3RoX291dF9vZl9yYW5nZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBsZW5ndGggb3V0IG9mIHJhbmdlIGVycm9ycyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfY29kZV9lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgY29kZSBlcnJvcnMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X292ZXJzaXplZF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgb3ZlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfamFiYmVyX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBqYWJiZXIgZnJhbWVzIG9uIHRoaXMgTk5JLiB0aGVzZSBhcmUgb3ZlcnNpemVkIGZyYW1lcyB0aGF0IGFsc28gY29udGFpbiBhbiBpbnZhbGlkIENSQywgY29kZSBlcnJvciwgb3IgSUVFRSBsZW5ndGggY2hlY2sgZXJyb3IuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X210dV9jaGVja19lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgTVRVIENoZWNrIEVycm9ycyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcHJvbWlzY3VvdXNfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYW1lcyBvbiB0aGlzIE5OSSB0aGF0IGFyZSBub3QgY29udHJvbCBwYWNrZXRzIGFuZCBoYXZlIGEgREEgdGhhdCBpcyBub3QgbWF0Y2hpbmcgd2l0aCB0aGUgUlggU0EuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3ZsYW5fZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiBUaGlzIGNvdW50cyBib3RoIHNpbmdsZSBhbmQgZG91YmxlIHRhZ2dlZCBmcmFtZXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2RvdWJsZV92bGFuX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBkb3VibGUgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF90cnVuY2F0ZWRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHRydW5jYXRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBSWCBGSUZPIEZ1bGwuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF91bmRlcnNpemVfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHVuZGVyc2l6ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFnbWVudGVkX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFnbWVudGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcnVudF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcnVudCBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDY0IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggMjU2IHRvIDUxMSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc180MDk2XzkyMTYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc185MjE3XzE2MzgzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgYnl0ZXMgb24gdGhpcyBOTkkuIFRoaXMgaW5jbHVkZXMgYWxsIGVycm9yZWQgZnJhbWVzIGFzIHdlbGwuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2dvb2RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGdvb2QgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF91bmljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCB1bmljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBtdWx0aWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9icm9hZGNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJyb2FkY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3BhdXNlX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBwYXVzZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3BmY19mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgUEZDIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfamFiYmVyX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBqYWJiZXIgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGVzZSBhcmUgb3ZlcnNpemVkIGZyYW1lcyB0aGF0IGFsc28gY29udGFpbiBhbiBpbnZhbGlkIEZDUy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZmNzX2Vycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBGQ1MgZXJyb3JzIG9uIHRoaXMgTk5JLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfY29udHJvbF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgY29udHJvbCBmcmFtZXMgb24gdGhpcyBOTkkuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9vdmVyc2l6ZV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgb3ZlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYWdtZW50ZWRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGZyYWdtZW50ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZXJyb3JfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGVycm9yZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfdmxhbl9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuIFRoaXMgY291bnRzIGJvdGggc2luZ2xlIGFuZCBkb3VibGUgdGFnZ2VkIGZyYW1lcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZG91YmxlX3ZsYW5fZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGRvdWJsZSBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3J1bnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHJ1bnQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfdW5kZXJydW5fZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHVuZGVycnVuIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGh1cyBoYXBwZW5zIHdoZW4gYSBmcmFtZSBlbmNvdW50ZXJzIGEgTUFDIHVuZGVycnVuIChUeCBTeW5jIEZJRk8gcnVucyBvdXQgb2YgZGF0YSBiZWZvcmUgdGhlIGVuZCBvZiBwYWNrZXQpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVFVTX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXR1c19jaGFuZ2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOTkkgTGluayBzdGF0dXMgY2hhbmdlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX05OSV9TRVJERVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1I6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19JRF9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNhcHR1cmUgd2luZG93IGFuZCBzdGF0aXN0aWMgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhcnRfY2FwdHVyZV93aW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXJ0IGNhcHR1cmUgd2luZG93IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUT1BfQ0FQVFVSRV9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0b3BfY2FwdHVyZV93aW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0b3AgY2FwdHVyZSB3aW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk51bWJlciBvZiBhbGxvYyBJRCByZWNlaXZlZCBieXRlcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDb25maWd1cmF0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNvbGxlY3RlZCBhbGxvYyBJRCBzdGF0aXN0aWNzIGZyb20gZ2V0X3N0YXRzIG9wZXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX0dFVF9TVEFUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZ2V0X3N0YXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSdW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldHMgdGhlIGFsbG9jJ3MgYWN0aXZhdGlvbiBzdGF0ZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyBvbiBhbiBhY3RpdmUtc3RhbmRieSBQT04uICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGlzIGlzbid0IG5lY2Vzc2FyeSBzaW5jZSBhbGxvY3MgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggdGhlIE9OVS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRYIGJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVFggcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJYIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUlggYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmUgRkVDIGNvZGV3b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJpcDMyX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBieXRlcyBwcm90ZWN0ZWQgYnkgYmlwMzIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJiaXAzMl9lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGJpcDMyIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3hndGNfaGVhZGVycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgWEdUQyBoZWFkZXJzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfeGd0Y19jb3JyZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGNvcnJlY3RlZCBYR1RDIGhlYWRlcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF94Z3RjX3VuY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCB1bmNvcnJlY3RlZCBYR1RDIGhlYWRlcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF94Z2VtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBYR0VNIGZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3hnZW1fZHJvcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBYR0VNIElEIGZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3hnZW1faWRsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgaWRsZSBYR0VNIGZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3hnZW1fY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBjb3JyZWN0ZWQgWEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfY3JjX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBwYWNrZXRzIHdpdGggQ1JDIGVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYWdtZW50X2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBmcmFnbWVudCBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGFja2V0c19kcm9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJHbG9iYWwgZHJvcHBlZCBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2Ryb3BwZWRfdG9vX3Nob3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gc2hvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZHJvcHBlZF90b29fbG9uZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gbG9uZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9rZXlfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGtleSBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfcGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBQbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGRyb3BwZWQgUGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2FsbG9jYXRpb25zX3ZhbGlkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBhbGxvY2F0aW9ucyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9hbGxvY2F0aW9uc19pbnZhbGlkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBkaXNhYmxlZCBhbGxvY2F0aW9ucyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIFBsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIG5vbiBpZGxlIFBsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wbG9hbXNfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGVycm9yIFBsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9jcHUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIENQVSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X29tY2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0dGVkIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfeGdlbSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgWEdFTSBmcmFnbWVudHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfY3B1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBDUFUgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9vbWNpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZHJvcHBlZF90cGlkX21pc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gVFBJRCBtaXNzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2Ryb3BwZWRfdmlkX21pc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcGVkIGR1ZSB0byBWSUQgbWlzcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGF0ZSBDaGFuZ2UgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfTE9TOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsb3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkxPUyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlcmlhbCBOdW1iZXIgQWNxdWlzaXRpb24gQ3ljbGUgU3RhcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBZnRlciBhIHN3aXRjaG92ZXIgaXMgY29tcGxldGUgYW5kIGFsbCBPTlUgcmFuZ2luZyB0aW1lcyBoYXZlIHN0YWJpbGl6ZWQsIHRoaXMgaW5kaWNhdGlvbiBpcyBzZW50IHRvIGluZm9ybSB0aGUgaG9zdCBvZiBhbGwgbmV3IE9OVSBFUURzLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUHJvdGVjdGlvbiBTd2l0Y2hpbmcgU3dpdGNob3ZlciBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0YW5kYnkgUE9OIE1vbml0b3JpbmcgQ3ljbGUgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfT05VX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV9kaXNjb3ZlcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgRGlzY292ZXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNwdV9wYWNrZXRzX2ZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgZmFpbHVyZSB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSBcImNwdV9wYWNrZXRzXCIgcHJveHkgb3BlcmF0aW9uLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRlIHRoZSBkZWFjdGl2YXRpb24gb2YgYWxsIE9OVXMgYXJlIGNvbXBsZXRlZCwgaW4gcmVzcG9uc2UgdG8gJ3NldF9vbnVfc3RhdGUnIG9wZXJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRlIHRoZSBkaXNhYmxpbmcgYWxsIE9OVXMgYXJlIGNvbXBsZXRlZCwgaW4gcmVzcG9uc2UgdG8gJ3NldF9vbnVfc3RhdGUnIG9wZXJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGUgdGhlIGFjdGl2YXRpb24gb2YgYWxsIE9OVXMgYXJlIGNvbXBsZXRlZCwgaW4gcmVzcG9uc2UgdG8gJ3NldF9vbnVfc3RhdGUnIG9wZXJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0ZSB0aGUgZW5hYmxpbmcgYWxsIE9OVXMgYXJlIGNvbXBsZXRlZCwgaW4gcmVzcG9uc2UgdG8gJ3NldF9vbnVfc3RhdGUnIG9wZXJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVE9EIHJlcXVlc3QgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgVXBncmFkZSBDb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSb2d1ZSBPTlUgc3BlY2lhbCBtYXAgY3ljbGUgc3RhcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfcG9uX3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXQgUE9OIFN0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJlc2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZXNldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0RJU0FCTEVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGlzYWJsZV9zZXJpYWxfbnVtYmVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEaXNhYmxlIFNlcmlhbCBOdW1iZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTaW5nbGUgcmVxdWVzdCBzdGFuZGJ5IFBPTiBNb25pdG9yaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X29udV9zdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2V0IHRoZSBvcGVyYXRpb24gc3RhdGUgb2YgYWxsIE9OVXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUlVOX1NQRUNJQUxfQldfTUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJydW5fc3BlY2lhbF9id19tYXAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJ1biBTcGVjaWFsIEJXIE1hcCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX2RldGVjdGlvbl93aW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJvZ3VlIERldGVjdGlvbiBXaW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9UT0RfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidG9kX3JlcXVlc3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRPRCByZXF1ZXN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXJ0X29udV91cGdyYWRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTFQgdG8gT05VIGZpcm13YXJlIHRyYW5zZmVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFkanVzdF90eF93YXZlbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbnN0cnVjdCBhbiB1bmFzc2lnbmVkIE9OVSB0byBhZGp1c3QgaXRzIHVwc3RyZWFtIHRyYW5zbWl0dGVyIHdhdmVsZW5ndGgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY3B1X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlhHUE9OIENQVSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJyb2FkY2FzdF9wbG9hbV9wYWNrZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkJyb2FkY2FzdCBQTE9BTSBQYWNrZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBvc2l0aXZlX2RyaWZ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJwb3NpdGl2ZSBkcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJuZWdhdGl2ZSBkcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRlbGltaXRlcl9taXNzX2RldGVjdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiZGVsaW1pdGVyIG1pc3MgZGV0ZWN0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYmlwMzJfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJiaXAzMiBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF93b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyByZWNlaXZlZCAod29yZCBzaXplIGlzIDQgYnl0ZXMgcmVnYXJkbGVzcyBvZiB1cHN0cmVhbSBkYXRhIHJhdGUpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb3JyZWN0ZWRfc3ltYm9scyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiZmVjIGNvcnJlY3RlZCBzeW1ib2xzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImZlYyBjb3JyZWN0ZWQgY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJmZWMgdW5jb3JyZWN0YWJsZSBjb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJmZWMgdG90YWwgY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9iaXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJmZWMgY29ycmVjdGVkIGJpdHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAieGdlbV9rZXlfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJ4Z2VtIGtleSBlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ4Z2VtX2xvc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInhnZW0gbG9zcyAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX21pY19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAibWljIGVycm9yIHBsb2FtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAibm9uIGlkbGUgcGxvYW0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb21jaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInJ4IGJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInJ4IHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInR4IGJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInR4IHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2FsYXJtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgQWxhcm0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZG93aSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRHJpZnQgb2YgV2luZG93IG9mIE9OVWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0ZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZmkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNpZ25hbCBGYWlsIG9mIE9OVWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0RJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZGkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNpZ25hbCBEZWdyYWRlZCBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0RGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGZpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlIER5aW5nLUdhc3Agb2YgT05VaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QUVNJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwcXNpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJwbG9hbSBxdWV1ZSBzdGF0dXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU1VGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3VmaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU1VGaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0aXdpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfTE9PQ0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxvb2NpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJMT09DaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmFuZ2luZ19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJhbmdpbmcgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgQWN0aXZhdGlvbiBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgRGVhY3RpdmF0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2VuYWJsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBFbmFibGUgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2Rpc2FibGVfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgRGlzYWJsZSBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9JTlZBTElEX0RCUlVfUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbnZhbGlkX2RicnVfcmVwb3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbnZhbGlkIERCUnUgUmVwb3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktleSBFeGNoYW5nZSBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgS2V5IFJlcXVlc3QgVGltZW91dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktleSBFeGNoYW5nZSBDeWNsZSBTa2lwcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktleSBFeGNoYW5nZSBLZXkgTWlzbWF0Y2giOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT1BUSUNBTF9SRUZMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvcHRpY2FsX3JlZmxlY3Rpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFuIG9wdGljYWwgcmVmbGVjdGlvbiBjb25kaXRpb24gd2FzIGRldGVjdGVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ER0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRnaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOb3RpZmljYXRpb24gdGhhdCBhbiBPTlVzIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgaGFzIGNoYW5nZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPU1NJQkxFX0RSSUZUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwb3NzaWJsZV9kcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQW4gT05VIGluIGEgbG93IHBvd2VyIHN0YXRlIG1heSBiZSBleHBlcmllbmNpbmcgZHJpZnQgYmV5b25kIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZC4gVGhlIGVzdGltYXRlIG1heSBiZSBpbmFjY3VyYXRlIGRlcGVuZGluZyBvbiBPTlUgYmVoYXZpb3IuIEFjdHVhbCBkcmlmdCBtYXkgYmUgbGVzcyB0aGFuIGVzdGltYXRlZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUkVHSVNUUkFUSU9OX0lEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZWdpc3RyYXRpb25faWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlZ2lzdHJhdGlvbiBJRCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9MRVZFTF9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBvd2VyX2xldmVsX3JlcG9ydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUG93ZXIgbGV2ZWwgcmVwb3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQb3dlciBjb25zdW1wdGlvbiByZXBvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZhaWx1cmUgb2Ygc2VjdXJlIG11dHVhbCBhdXRoZW50aWNhdGlvbiBkdWUgdG8gTUlDIGVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X3R1bmluZ19vdXRfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgVHVuaW5nIG91dCBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV90dW5pbmdfaW5fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgVHVuaW5nIGluIGNvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9UVU5JTkdfUkVTUE9OU0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR1bmluZ19yZXNwb25zZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHVuaW5nIHJlc3BvbnNlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X29udV9zdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2V0IE9OVSBTdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyc3NpX21lYXN1cmVtZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSU1NJIE1lYXN1cmVtZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVxdWVzdCB0aGUgT05VIHRvIHNlbmQgaXRzIFJlZ2lzdHJhdGlvbiBJRCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDaGFuZ2UgcG93ZXIgbGV2ZWxsaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9MRVZFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZ2V0X3Bvd2VyX2xldmVsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgc2hvdWxkIHJlcG9ydCBpdHMgbGF1bmNoIG9wdGljYWwgcG93ZXIgbGV2ZWwgYXMgcGFydCBvZiB0aGUgQWNrbm93bGVkZ21lbnQgUGxvYW0gbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9HRVRfUE9XRVJfQ09OU1VNUFRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdldF9wb3dlcl9jb25zdW1wdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIHNob3VsZCByZXBvcnQgaXRzIHBvd2VyIGNvbnN1bXB0aW9uIGluZm9ybWF0aW9uIHZpYSB0aGUgUG93ZXIgQ29uc3VtcHRpb24gUmVwb3J0IFBsb2FtIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFkanVzdF90eF93YXZlbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbnN0cnVjdCB0aGUgT05VIHRvIGFkanVzdCBpdHMgdXBzdHJlYW0gdHJhbnNtaXR0ZXIgd2F2ZWxlbmd0aCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTUNJIGJhc2Ugc2VjdXJlIG11dHVhbCBhdXRoZW50aWNhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfdHVuaW5nX2luIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgVHVuaW5nIGluIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfdHVuaW5nX291dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIFR1bmluZyBvdXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwbG9hbV9wYWNrZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlBMT0FNIFBhY2tldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNwdV9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJYR1BPTiBDUFUgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlg6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcHVfcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0ZXMgQ1BVIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24gdGhlIFVTIGZyb20gdGhpcyBPTlUgaWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX1JYX0lEX09NQ0lfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbWNpX3BhY2tldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGVzIE9NQ0kgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fVFJYOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOyAgICAvKio8ICBzaG91bGQgbmV2ZXIgaGFwcGVuLiAqLworfQorCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKipvYmpfZ2V0X3Byb3BfYXJyYXkoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCB1aW50MzJfdCAqc2l6ZSkKK3sKKyAgICBzd2l0Y2ggKG9iaikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX25pX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfbmlfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfbmlfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9uaV9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9OSV9PUEVSX0lEX1NFVF9BRV9OSV9FTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX2RzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfcGF0aF9kc19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfcGF0aF9kc19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX2RzX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX2RzX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX2RzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX2RzX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX2RzX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX3BhdGhfdXNfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX3VzX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX3VzX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfdXNfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX3BhdGhfdXNfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfdXNfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX3BhdGhfdXNfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfdXNfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9DSEFOTkVMOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoY2hhbm5lbF9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoY2hhbm5lbF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVCVUc6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlYnVnX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRlYnVnX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfQVVUT19JRF9DTElfT1VUUFVUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRlYnVnX2NsaV9vdXRwdXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlYnVnX2NsaV9vdXRwdXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX0FVVE9fSURfRklMRV9BTE1PU1RfRlVMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19maWxlX2FsbW9zdF9mdWxsX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z19maWxlX2FsbW9zdF9mdWxsX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX0NMSV9JTlBVVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19jbGlfaW5wdXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlYnVnX2NsaV9pbnB1dF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9TVEFSVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfU1RPUF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1JFU0VUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0RFVklDRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX1JFQURZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9kZXZpY2VfcmVhZHlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9kZXZpY2VfcmVhZHlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfS0VFUF9BTElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX3N3X2Vycm9yX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2Vfc3dfZXJyb3JfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX1NXX0VYQ0VQVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2Vfc3dfZXhjZXB0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2Vfc3dfZXhjZXB0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0REUl9URVNUX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2Nvbm5lY3RfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9jb25uZWN0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9kaXNjb25uZWN0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfZGlzY29ubmVjdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX3Jlc2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfcmVzZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0hPU1RfS0VFUF9BTElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfaG9zdF9rZWVwX2FsaXZlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfaG9zdF9rZWVwX2FsaXZlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9TV19VUEdSQURFX0FDVElWQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX0RBVEE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SVU5fRERSX1RFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX3J1bl9kZHJfdGVzdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX3J1bl9kZHJfdGVzdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTks6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTUFYX0xJTktfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfUkFOR0VfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9ST0dVRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fTElOSzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfRU5DUllQVElPTl9FTkFCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVHX0FDS19USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9SQU5HRV9WQUxVRV9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX1NQRUVEX01JU01BVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9SRVBPUlRfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX09BTV9LRUVQQUxJVkVfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9ERVJFR0lTVEVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1JFUkFOR0VfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX0RFTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0ZPUkNFX1JFRElTQ09WRVJZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9ERUxFVEVfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfZGVsZXRlX2xpbmtfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19kZWxldGVfbGlua19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX1NUQVRJQ19SRUdJU1RSQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19QUk9YWV9JRF9JTkpFQ1RfRlJBTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2luamVjdF9mcmFtZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2luamVjdF9mcmFtZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfRlJBTUVfQ0FQVFVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX05PX1JFUE9SVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9ub19yZXBvcnRzX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX25vX3JlcG9ydHNfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9MTElEX1FVQVJBTlRJTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JFUkFOR0VfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JPR1VFX1NDQU5fQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU0VUX0VQT05fTklfRU5fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0lTU1VFX1JTU0lfR1JBTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX2FkZF9saW5rX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX2FkZF9saW5rX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX01VTFRJQ0FTVF9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUk9HVUVfTExJRF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfcm9ndWVfbGxpZF9zY2FuX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xMGdfdXNfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xMGdfdXNfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMTBnX3VzX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMTBnX3VzX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xMGdfdXNfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMTBnX3VzX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fb251XzEwZ191c19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xMGdfdXNfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fb251XzEwZ191c19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMWdfdXNfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xZ191c19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xZ191c19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fb251XzFnX3VzX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xZ191c19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xZ191c19zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xZ191c19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fb251XzFnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xZ191c19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX2RzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ19kc19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX2RzX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ19kc19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ19kc19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX3VzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ191c19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX3VzX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ191c19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ191c19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX3VzX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX2RzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX2RzX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ19kc19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ19kc19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX2RzX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ19kc19zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ191c19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ191c19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfdXNfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfdXNfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ191c19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfdXNfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ191c19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ191c19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUlA6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3JwX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9ycF9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3JwX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9ycF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUElPOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bpb19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwaW9fa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bpb19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwaW9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fYWxsb2Nfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fYWxsb2NfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2Nfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9hbGxvY19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9hbGxvY19zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX3NldF9zdGF0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9hbGxvY19zZXRfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9hbGxvY19nZXRfc3RhdHNfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2NfZ2V0X3N0YXRzX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fZ2VtX3BvcnRfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2dlbV9wb3J0X2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fZ2VtX3BvcnRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2dlbV9wb3J0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2dlbV9wb3J0X3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fZ2VtX3BvcnRfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2Zfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2Zfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX0ZMVVNIX01BQ19UQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TQ0FOX01BQ19UQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9GTFVTSF9NQUNfVEFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfU0NBTl9NQUNfVEFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX3NjYW5fbWFjX3RhYmxlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX05FV19NQUM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX21hY190YWJsZV9uZXdfbWFjX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfQUdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTUFDX01PVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19EUk9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl91c19mbG93X2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl91c19mbG93X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9sb3NfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfbG9zX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX29udV9kaXNjb3ZlcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX29udV9kaXNjb3ZlcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3NldF9wb25fc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfcmVzZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfcmVzZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3NldF9vbnVfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV90b2RfcmVxdWVzdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV90b2RfcmVxdWVzdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9jcHVfcGFja2V0c19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9jcHVfcGFja2V0c19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9PTlU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9vbnVfYWxhcm1fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X29udV9hbGFybV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ET1dJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2Rvd2lfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2Rvd2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0ZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3NmaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfc2ZpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NESToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9zZGlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3NkaV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ERkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfZGZpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9kZmlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1VGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9zdWZpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9zdWZpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0xPQUk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfbG9haV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfbG9haV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ER0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfZGdpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9kZ2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUEVFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3BlZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfcGVlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9wc3RfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3BzdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3Rpd2lfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3Rpd2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTE9LSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9sb2tpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9sb2tpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX01FTUk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfbWVtaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfbWVtaV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0VSUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9lcnJfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2Vycl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SRUk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfcmVpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9yZWlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUkFOR0lOR19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfSU5WQUxJRF9EQlJVX1JFUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PUFRJQ0FMX1JFRkxFQ1RJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1NTSUJMRV9EUklGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9wb3NzaWJsZV9kcmlmdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9TRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3NldF9vbnVfc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3NldF9vbnVfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfUlNTSV9NRUFTVVJFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9yc3NpX21lYXN1cmVtZW50X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9yc3NpX21lYXN1cmVtZW50X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9jcHVfcGFja2V0c19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfY3B1X3BhY2tldHNfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3Bsb2FtX3BhY2tldF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2NwdV9wYWNrZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2NwdV9wYWNrZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX1JYX0lEX09NQ0lfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X29tY2lfcGFja2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbWNpX3BhY2tldF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fVFJYOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl90cnhfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX3RyeF9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX3RyeF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fdHJ4X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0xPR19FTlRSWToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ19lbnRyeV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ19lbnRyeV9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dfZW50cnlfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dfZW50cnlfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ19lbnRyeV9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dfZW50cnlfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nX2VudHJ5X3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dfZW50cnlfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRU5UUllfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ19lbnRyeV9hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nX2VudHJ5X2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTE9HR0VSOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nZ2VyX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ2dlcl9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcl9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nZ2VyX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcl9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dnZXJfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcl9zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nZ2VyX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXJfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfT1BFUl9JRF9DTEVBUl9MT0c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nZ2VyX2NsZWFyX2xvZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyX2NsZWFyX2xvZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX05OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5uaV9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDYxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5uaV9zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRVU19DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9zdGF0dXNfY2hhbmdlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm5pX3N0YXR1c19jaGFuZ2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5uaV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm5pX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9zZXJkZXNfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfc2VyZGVzX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9zZXJkZXNfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfc2VyZGVzX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2Yoc29mdHdhcmVfZXJyb3Jfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2Z0d2FyZV9lcnJvcl9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihzb2Z0d2FyZV9lcnJvcl9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvZnR3YXJlX2Vycm9yX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHRyeF9jYWxpYnJhdGlvbl9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeF9jYWxpYnJhdGlvbl9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19JRF9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih0cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YodHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih0cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RPUF9DQVBUVVJFX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih0cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2Nfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fYWxsb2NfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fYWxsb2Nfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2Nfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fYWxsb2Nfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2FsbG9jX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX2dldF9zdGF0c19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2NfZ2V0X3N0YXRzX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9hbGxvY19zZXRfc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2FsbG9jX3NldF9zdGF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fZ2VtX3BvcnRfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9nZW1fcG9ydF9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9nZW1fcG9ydF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2dlbV9wb3J0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9nZW1fcG9ydF9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9nZW1fcG9ydF9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2l3Zl9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2l3Zl9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9pd2ZfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9pd2ZfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfbG9zX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9sb3NfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfb251X2Rpc2NvdmVyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3NldF9wb25fc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3NldF9wb25fc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfcmVzZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3Jlc2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0RJU0FCTEVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JVTl9TUEVDSUFMX0JXX01BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfdG9kX3JlcXVlc3RfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3RvZF9yZXF1ZXN0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfY3B1X3BhY2tldHNfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2NwdV9wYWNrZXRzX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfb251X2FsYXJtX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb251X2FsYXJtX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ET1dJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9kb3dpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfZG93aV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0ZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9zZmlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zZmlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NESToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc2RpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfc2RpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ERkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2RmaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2RmaV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUFFTSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcHFzaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3Bxc2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NVRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3N1ZmlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zdWZpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV90aXdpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfdGl3aV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfTE9PQ0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2xvb2NpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfbG9vY2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JBTkdJTkdfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT1BUSUNBTF9SRUZMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0RHSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfZGdpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfZGdpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9TU0lCTEVfRFJJRlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JFR0lTVFJBVElPTl9JRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9MRVZFTF9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RVTklOR19SRVNQT05TRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3NldF9vbnVfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1JTU0lfTUVBU1VSRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9yc3NpX21lYXN1cmVtZW50X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9MRVZFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9HRVRfUE9XRVJfQ09OU1VNUFRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vbnVfdHVuaW5nX2luX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV90dW5pbmdfb3V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2NwdV9wYWNrZXRzX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfY3B1X3BhY2tldHNfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX1JYX0lEX0NQVV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2NwdV9wYWNrZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9jcHVfcGFja2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfUlhfSURfT01DSV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29tY2lfcGFja2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb21jaV9wYWNrZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9UUlg6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl90cnhfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl90cnhfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fdHJ4X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fdHJ4X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeHBvbl9zZXJkZXNfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4cG9uX3NlcmRlc19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4cG9uX3NlcmRlc19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhwb25fc2VyZGVzX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitiY21vc19lcnJubyBhcGlfY2xpX29iamVjdF9uYW1lKGJjbW9sdF9vYmpfaWQgb2JqLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmRlc2NyKQoreworICAgIGlmIChvYmogPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgaWYgKG9iamVjdF9uYW1lW29ial0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKworICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgICAqbmFtZSA9IG9iamVjdF9uYW1lW29ial07CisgICAgfQorCisgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgeworICAgICAgICAqZGVzY3IgPSBvYmplY3RfZGVzY3Jbb2JqXTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYXBpX2NsaV9vYmplY3RfcHJvcGVydHkoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCB1aW50MTZfdCBwcm9wLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqKmRlc2NyKQoreworICAgIGJjbWNsaV9wcm9wX2Rlc2NyICoqcHJvcF9hcnJheSA9IE5VTEw7CisgICAgdWludDMyX3QgcHJvcF9hcnJheV9zaXplID0gMDsKKyAgICBpZiAoZGVzY3IgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgcHJvcF9hcnJheSA9IG9ial9nZXRfcHJvcF9hcnJheShvYmosIGdyb3VwLCBzdWJncm91cCwgJnByb3BfYXJyYXlfc2l6ZSk7CisgICAgaWYgKChwcm9wX2FycmF5ID09IE5VTEwpIHx8IChwcm9wID49IHByb3BfYXJyYXlfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAocHJvcF9hcnJheVtwcm9wXSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorCisgICAgKmRlc2NyID0gcHJvcF9hcnJheVtwcm9wXTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hlbHBlcnMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U3MjM3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfaGVscGVycy5oCkBAIC0wLDAgKzEsNzY4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworI2lmbmRlZiBNQVBMRV9DTElfSEVMUEVSU19IXworI2RlZmluZSBNQVBMRV9DTElfSEVMUEVSU19IXworCisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworLyogTWFjIG5hbWUgbGVuZ3RoICovCisjZGVmaW5lIEFQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSCBCQ01DTElfTUFYX1NFQVJDSF9TVUJTVFJfTEVOR1RICisKKy8qIE1heCBoZWxwIHN0cmluZyBsZW5ndGggKi8KKyNkZWZpbmUgQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIIDEyOAorCit0eXBlZGVmIGVudW0gYmNtY2xpX2ZpZWxkX2Rlc2NyX2ZsYWdzCit7CisgICAgQkNNQ0xJX0ZJRUxEX0RFU0NSX0ZMQUdTX05PTkUgICAgICAgICAgID0gMCwKKyAgICBCQ01DTElfRklFTERfREVTQ1JfRkxBR1NfUFJFU0VOQ0VfTUFTSyAgPSAoMSA8PCAwKSAgLyogZmllbGQgaXMgYSAncHJlc2VuY2UgbWFzaycgZm9yIGEgc3RydWN0dXJlICovCit9IGJjbWNsaV9maWVsZF9kZXNjcl9mbGFnczsKKwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX3R5cGVfZGVzY3IgYmNtY2xpX3R5cGVfZGVzY3I7CisKKy8qIFN0cnVjdHVyZSBmaWVsZCBkZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCBiY21jbGlfZmllbGRfZGVzY3IKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgLyogRmllbGQgbmFtZSAqLworICAgIGNvbnN0IGNoYXIgKmRlc2NyOyAgICAgICAgICAvKiBGaWVsZCBkZXNjcmlwdGlvbiAqLworICAgIGNvbnN0IGNoYXIgKmNsaV9uYW1lOyAgICAgICAvKiBTaG9ydCBDTEkgbmFtZS4gY2FuIGJlIG1pc3NpbmcgKi8KKyAgICBiY21jbGlfdHlwZV9kZXNjciAqdHlwZTsgICAgLyogRmllbGQgdHlwZSAqLworICAgIHVpbnQxNl90IG9mZnNldDsgICAgICAgICAgICAvKiBPZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0eXBlIHN0cnVjdHVyZSAqLworICAgIGJjbWNsaV9maWVsZF9kZXNjcl9mbGFncyBmbGFnczsKK30gYmNtY2xpX2ZpZWxkX2Rlc2NyOworCisvKiBEYXRhIHR5cGUgZGVzY3JpcHRvciAqLworc3RydWN0IGJjbWNsaV90eXBlX2Rlc2NyCit7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIG5hbWUgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVzY3JpcHRpb24uIGNhbiBiZSBtaXNzaW5nICovCisgICAgY29uc3QgY2hhciAqY2xpX25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBDTEkgbmFtZS4gY2FuIGJlIG1pc3NpbmcgKi8KKyAgICBiY21vbHRfYmFzZV90eXBlX2lkIGJhc2VfdHlwZTsgICAgICAgICAgICAgIC8qIEJhc2UgdHlwZTogc251bSwgdW51bSwgc3RyaW5nLCBpcCwgZW51bSwgZXRjLiAqLworICAgIHVpbnQzMl90IG1pbl92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWluIHZhbHVlIGZvciByYW5nZSBjaGVjayAqLworICAgIHVpbnQzMl90IG1heF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4IHZhbHVlIGZvciByYW5nZSBjaGVjayAqLworICAgIHVpbnQxNl90IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2l6ZSAqLworCisgICAgLyogVGhlIGZvbGxvd2luZyB1bmlvbiBpcyBxdWFsaWZpZWQgYnkgdGhlIGJhc2VfdHlwZSBhbmQgY29udGFpbnMgYWRkaXRpb25hbAorICAgICAqIGluZm8gZm9yIGFycmF5LCBlbnVtLCBzdHJ1Y3QsIHVuaW9uICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqZTsgICAgICAgICAgICAgICAgICAgICAvKiBlbnVtIHZhbHVlIGFycmF5IENvbnRhaW5zIG51bV9lbGVtZW50cysxIHZhbHVlcy4gVGhlIGxhc3QgdmFsdWUgaGFzIG5hbWU9TlVMTCAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbnVtX2ZpZWxkczsgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlICovCisgICAgICAgICAgICBiY21jbGlfZmllbGRfZGVzY3IgKmZpZWxkczsgICAgICAgICAvKiBTdHJ1Y3R1cmUgZmllbGQgYXJyYXkuIENvbnRhaW5zIG51bV9lbGVtZW50cyB2YWx1ZXMgKi8KKyAgICAgICAgfSBzOworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbnVtX2NvbW1vbl9maWVsZHM7ICAgICAgICAgLyogbnVtYmVyIG9mIG5vbi11bmlvbiBmaWVsZHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJ1Y3QgKi8KKyAgICAgICAgICAgIGJjbWNsaV9maWVsZF9kZXNjciAqY29tbW9uX2ZpZWxkczsgIC8qIGNvbW1vbiBmaWVsZCBhcnJheS4gQ29udGFpbnMgbnVtX2VsZW1lbnRzIHZhbHVlcyAqLworICAgICAgICAgICAgdWludDE2X3QgY2xhc3NpZmllcl9pZHg7ICAgICAgICAgICAgLyogaW5kZXggb2YgdGhlIGNsYXNzaWZpZXIgZmllbGQgd2l0aGluIGNvbW1vbl9maWVsZHMgKi8KKyAgICAgICAgICAgIGJjbWNsaV9maWVsZF9kZXNjciAqdW5pb25fZmllbGRzOyAgIC8qIHN1Yi1zdHJ1Y3QgZmllbGRzIHVuZGVyIHRoZSB1bmlvbiAobmFtZSA9PSBOVUxMIGlmIG5vIGZpZWxkcyBwcmVzZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uZSBwZXIgZW51bSBlbnRyeSBpbiB0aGUgY2xhc3NpZmllciB0eXBlLCBwbHVzIG9uZSBmb3IgZGVmYXVsdCkgKi8KKyAgICAgICAgfSB1OworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3R5cGVfZGVzY3IgKmVsZW1fdHlwZTsgICAgICAgLyogQXJyYXkgZWxlbWVudCB0eXBlICovCisgICAgICAgICAgICB1aW50OF90IGxlbl9zaXplOyAgICAgICAgICAgICAgICAgICAvKiBCeXRlIHdpZHRoIG9mIGFycmF5IGxlbmd0aCBmaWVsZCAoYXQgc3RhcnQgb2Ygc3RydWN0KSAqLworICAgICAgICAgICAgdWludDE2X3QgbWF4X3NpemU7ICAgICAgICAgICAgICAgICAgLyogTWF4IGFycmF5IHNpemUgKi8KKyAgICAgICAgfSBhcnJfZHluOworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3R5cGVfZGVzY3IgKmVsZW1fdHlwZTsgICAgICAgLyogQXJyYXkgZWxlbWVudCB0eXBlICovCisgICAgICAgICAgICB1aW50MTZfdCBzaXplOyAgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBhcnJheSBzaXplICovCisgICAgICAgIH0gYXJyX2ZpeGVkOworICAgIH0geDsKK307CisKKy8qIFByb3BlcnR5IGRlc2NyaXB0b3IuCisgKiBUaGUgMXN0IDUgZmllbGRzIGFyZSBleGFjdGx5IHRoZSBzYW1lIGFzIGluIGJjbWNsaV9maWVsZF9kZXNjcgorICogVG9EbzogcmVwbGFjZSB3aXRoIGJjbWNsaV9maWVsZF9kZXNjciBzdWJzdHJ1Y3R1cmUuCisgKiBSZXF1aXJlcyBjaGFuZ2VzIGluIGNvZGUgZ2VuZXJhdG9yCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAvKiBDIG5hbWUgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcjsgICAgICAgICAgICAgIC8qIFByb3BlcnR5IGRlc2NyaXB0aW9uICovCisgICAgY29uc3QgY2hhciAqY2xpX25hbWU7ICAgICAgICAgICAvKiBDTEkgbmFtZSAqLworICAgIGJjbWNsaV90eXBlX2Rlc2NyICp0eXBlOyAgICAgICAgLyogVHlwZSByZWZlcmVuY2UgKi8KKyAgICB1aW50MTZfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIE9mZnNldCBpbiBnZW5lcmF0ZWQgcGVyLWdyb3VwIHN0cnVjdHVyZSAqLworICAgIHVpbnQxNl90IHByb3BlcnR5OyAgICAgICAgICAgICAgLyogUHJvcGVydHkgaWQgaW4gcGVyLW9iamVjdCBtYW5hZ2VtZW50IGdyb3VwICovCisgICAgYmNtb2x0X3Byb3BfYWNjZXNzX2lkIGFjY2VzczsgICAvKiBBY2Nlc3MgKi8KK30gYmNtY2xpX3Byb3BfZGVzY3I7CisKKy8qIEFsbCBBUElzIHJldHVybgorICogQkNNX0VSUl9PSyAtIG9rCisgKiBCQ01fRVJSX05PRU5UIC0gaWYgaWQgaXMgaW4gcmFuZ2UsIGJ1dCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYW55IHZhbHVlIChhIGhvbGUpCisgKiBCQ01fRVJSX1JBTkdFIC0gaWQgaXMgb3V0IG9mIHJhbmdlCisgKi8KKworLyogR2V0IG9iamVjdCBuYW1lIGJ5IGlkICovCitiY21vc19lcnJubyBhcGlfY2xpX29iamVjdF9uYW1lKGJjbW9sdF9vYmpfaWQgb2JqLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmRlc2NyKTsKKworLyogR2V0IG9iamVjdCBzdHJ1Y3R1cmUgc2l6ZSAqLworYmNtb3NfZXJybm8gYXBpX2NsaV9vYmplY3Rfc3RydWN0X3NpemUoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCB1aW50MzJfdCAqa2V5X3NpemUsIHVpbnQzMl90ICprZXlfb2Zmc2V0LCB1aW50MzJfdCAqZGF0YV9zaXplLCB1aW50MzJfdCAqZGF0YV9vZmZzZXQpOworCisvKiBHZXQgb2JqZWN0IHN1Ymdyb3VwIChzcGVjaWZpYyBvcGVyYXRpb24gb3IgcHJveHkpIG5hbWUgYW5kIGRlc2NyaXB0aW9uICovCitiY21vc19lcnJubyBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgY29uc3QgY2hhciAqKm5hbWUsIGNvbnN0IGNoYXIgKipkZXNjcik7CisKKy8qIEdldCBwcm9wZXJ0eSBieSBvYmplY3QsIG1ndF9ncm91cCwgc3ViZ3JvdXAgKHNwZWNpZmljIG9wZXJhdGlvbiBvciBwcm94eSksIHByb3BlcnR5X2lkICovCitiY21vc19lcnJubyBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X21ndF9ncm91cCBncm91cCwgdWludDE2X3Qgc3ViZ3JvdXAsIHVpbnQxNl90IHByb3AsIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICoqZGVzY3IpOworCisvKiBHZXQgdGhlIG51bWJlciBvZiBzdWJncm91cHMgcHJlc2VudCBmb3IgYSBnaXZlbiBncm91cCAqLworc3RhdGljIGlubGluZSB1aW50MTZfdCBhcGlfY2xpX2dldF9zdWJncm91cF9jb3VudChiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X21ndF9ncm91cCBncm91cCkKK3sKKyAgICB1aW50MTZfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXk7CisgICAgd2hpbGUgKGFwaV9jbGlfb2JqZWN0X3N0cnVjdF9zaXplKG9iaiwgZ3JvdXAsIGNvdW50LCAmZHVtbXksICZkdW1teSwgJmR1bW15LCAmZHVtbXkpICE9IEJDTV9FUlJfUkFOR0UpCisgICAgeworICAgICAgICArK2NvdW50OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyogRHVtcCBhIHNpbmdsZSBwcm9wZXJ0eSAqLworYmNtb3NfZXJybm8gYXBpY2xpX2R1bXBfcHJvcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkLCB2b2lkICpwcm9wX2RhdGEpOworCisvKiBEdW1wIGEgc2luZ2xlIHByb3BlcnR5IHZhbHVlIGluIEMgaW5pdGlhbGl6ZXIgZm9ybWF0ICovCitiY21vc19lcnJubyBhcGljbGlfZHVtcF9wcm9wX2luaXRpYWxpemVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQsIHZvaWQgKnByb3BfZGF0YSk7CisKKy8qIER1bXAgYSBkeW5hbWljIGFycmF5IGluIEMgaW5pdGlhbGl6ZXIgZm9ybWF0ICovCitiY21vc19lcnJubyBhcGljbGlfZHVtcF9keW5fYXJyYXkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwgdm9pZCAqZGF0YSwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIER1bXAgcHJvcGVydHkgYXMgQ0xJIHBhcmFtZXRlcnMgKi8KK2JjbW9zX2Vycm5vIGFwaWNsaV9kdW1wX3Byb3BfcGFyYW0oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwgdm9pZCAqcHJvcF9kYXRhLCBjb25zdCBjaGFyICpwcmVmaXgpOworCisvKiBEdW1wIG1lc3NhZ2UgKi8KK2JjbW9zX2Vycm5vIGFwaWNsaV9tc2dfZHVtcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X21zZyAqbXNnKTsKKworLyogTWVzc2FnZSBncm91cCBuYW1lICovCitjb25zdCBjaGFyICphcGljbGlfbWd0X2dyb3VwX3RvX3N0cihiY21vbHRfbWd0X2dyb3VwIGdyb3VwKTsKKworLyogQ29udmVydCBhbiBlbnVtIHZhbHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZyAqLworI2RlZmluZSBCQ01PTFRfRU5VTV9TVFJJTkdfVkFMKGVudW1fbmFtZSwgdmFsdWUpICAgIGJjbWNsaV9lbnVtX3N0cmluZ3ZhbChlbnVtX25hbWUgIyMgX3N0cmluZ190YWJsZSwgKHZhbHVlKSkKKworLyogRW51bSBzdHJpbmcgdGFibGVzICovCitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX2VuX3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfbmlfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY19vcGVyYXRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY19zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FsbG9jX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW5fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc2lnbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXNfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9saW5rX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWxfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9jaGFubmVsX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2NoYW5uZWxfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2NvbnRyb2xfc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kYmFfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RiYV9yYW1fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kYmFfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rkcl90ZXN0X3N0YXR1c19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zcGVlZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9yZXNldF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9yZXNldF9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZHJ2X2ljZl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rydl9zZ2JfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kc192bGFuX2FjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdGZiX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9saW1fc2VjX21vZGVfdXBfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9saW1fc2VjX21vZGVfZG5fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94aW1fc2VjX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9oc2NfcmFtX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbGltX3JhbV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xreV9yYW1fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9taWNfcmFtX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeHBjc3JtX3JhbV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1c19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19yYXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc3RhdHVzX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2tleV9jaG9pY2Vfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29hbV90eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGlua19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXR1c19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm9fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9tcGNwX2dhdGVfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3Nfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9uc19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fcGluX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb19wb2xhcml0eV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9ycF9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9leHRfaXJxX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dlbV9wb3J0X3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncGlvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb19waW5fZGlyX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb192YWx1ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfa2V5X2V4Y2hhbmdlX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2xvc19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcmVzZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2Vycl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2xva2lfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9tZW1pX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wZWVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9yZWlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zZGlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zdWZpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X29tY2lfZGV2aWNlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X29tY2lfcmVzdWx0X2NvZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fdHJ4X2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1c19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2l3Zl9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZmlsZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19sZXZlbF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19zdHlsZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ190eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2tfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfY29ubmVjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cml2YWxlbnRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zZXJkZXNfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb2RuX2NsYXNzX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X29udV9vcGVyYXRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWxfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90Y19wcm90b2NvbF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3Jfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wYWNrZXRfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9sYXJpdHlfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9uX29wZXJhdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9uX3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2xfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJic19wb2x5bm9taWFsX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJic19jaGVja2VyX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wcmJzX2xvY2tfc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yZXN1bHRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0X3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXNfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zZXJkZXNfaW5zdGFuY2Vfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zaGFwZXJfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc3lzdGVtX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kc19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3VhcnRfYmF1ZHJhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3VzX3ZsYW5fYWN0aW9uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2xvc19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX251bV9vZl9vbnVzX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2RnaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9wcXNpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3NkaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3NmaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Rpd2lfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fdHJ4X3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWRfc3RyaW5nX3RhYmxlW107CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogTUFQTEVfQ0xJX0hFTFBFUlNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX3R5cGVzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZWQ0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV90eXBlcy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNX0FQSV9EQVRBX1RZUEVTX0hfCisjZGVmaW5lIEJDTV9BUElfREFUQV9UWVBFU19IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisKKy8qIFByb3BlcnR5IGFjY2VzcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IgPSAweDEsICAgLyogUmVhZCBhY2Nlc3MgKi8KKyAgICBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfVyA9IDB4MiwgICAvKiBXcml0ZSBhY2Nlc3MgKi8KKyAgICBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcgPSAweDMsICAvKiBSZWFkLXdyaXRlICovCit9IGJjbW9sdF9wcm9wX2FjY2Vzc19pZDsKKworLyogQmFzZSBkYXRhIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX1NOVU0sICAgICAgIC8qIHNpZ25lZCBudW1iZXIgKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU0sICAgICAgIC8qIHVuc2lnbmVkIG51bWJlciAqLworICAgIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgsICAgLyogdW5zaWduZWQgbnVtYmVyIHByaW50ZWQgaW4gaGV4ICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9GTE9BVCwgICAgICAvKiBmbG9hdGluZy1wb2ludCBudW1iZXIgKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX0JPT0wsICAgICAgIC8qIGJvb2xlYW4gKHplcm89bm8sIG5vbnplcm89eWVzKSAqLworICAgIEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSSU5HLCAgICAgLyogc3RyaW5nICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9JUFY0LCAgICAgICAvKiBJUHY0IGFkZHJlc3MgKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX01BQywgICAgICAgIC8qIE1BQyBhZGRyZXNzICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAgICAgICAvKiBlbnVtICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssICAvKiBiaXRtYXNrIGVudW0gKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgICAgIC8qIHN0cnVjdCAqLworICAgIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04sICAgICAgLyogdW5pb24gKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sICAgIC8qIGR5bmFtaWNhbGx5LXNpemVkIGFycmF5ICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsICAvKiBmaXhlZC1zaXplIGFycmF5ICovCit9IGJjbW9sdF9iYXNlX3R5cGVfaWQ7CisKKyNlbmRpZiAvKiBCQ01fQVBJX0RBVEFfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQyZTlhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9kZXZfbG9nL01ha2VmaWxlCkBAIC0wLDAgKzEsMjIgQEAKKyMgCisjIEFQSS9sb2dnZXIgaW50ZWdyYXRpb24KKyMKK01PRF9OQU1FID0gYXBpX2Rldl9sb2cKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGRldl9sb2cgCisKK2lmZXEgKCIkKEVOQUJMRV9MT0cpIiwgInkiKQorICAgIGlmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorCWlmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorCSAgICBNT0RfREVQUyArPSBhcGlfY2xpCisJZWxzZQorCSAgICBNT0RfREVQUyArPSBhcGlfY2xpX2hlbHBlcnMKKwllbmRpZgorCisJaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisJICAgTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorCWVuZGlmCisKKwlzcmNzID0gYmNtX2FwaV9kZXZfbG9nLmMKKyAgICBlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9iY21fYXBpX2Rldl9sb2cuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9iY21fYXBpX2Rldl9sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWI4NjM4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9kZXZfbG9nL2JjbV9hcGlfZGV2X2xvZy5jCkBAIC0wLDAgKzEsNzc4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2luY2x1ZGUgImJjbV9hcGlfZGV2X2xvZy5oIgorCisvKiBtYXhpbXVtIG51bWJlciBvZiB0YXNrcyB0aGF0IGNhbiB1c2UgdGhlIEFQSS9sb2dnZXIgaW50ZWdyYXRpb24gc2ltdWx0YW5lb3VzbHkgKi8KKyNkZWZpbmUgQVBJX0xPR19OVU1fQkxLUyAxNgorCisvKiBzdHJpbmcgdGhhdCBkZW5vdGVzIHRoYXQgdGhpcyBlbnRyeSBpcyBub3QgY29tcGxldGUgLSB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gY29tZSAqLworI2RlZmluZSBBUElfTE9HX0NPTlRfU1RSICIuLi4iCisKKy8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlc2VydmVkIGF0IHRoZSBlbmQgb2YgZWFjaCBsb2cgZW50cnkgKGNvbnRpbnVhdGlvbiBzdHJpbmcgKyBuZXdsaW5lKSAqLworI2RlZmluZSBBUElfTE9HX0VOVFJZX09WRVJIRUFEIHNpemVvZihBUElfTE9HX0NPTlRfU1RSKQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGRldl9sb2dfaWQgbG9nX2lkOworICAgIGNvbnN0IGJjbW9sdF9tc2cgKm1zZzsKKyAgICBjaGFyICpidWY7CisgICAgdWludDMyX3QgdXNlZDsKK30gYXBpX2xvZ19yZWM7CisKK3N0YXRpYyBiY21vc19ibGtfcG9vbCBhcGlfbG9nX2Jsa19wb29sOworCitzdGF0aWMgYmNtb3NfZXJybm8gYXBpX2xvZ19kdW1wX2RhdGFfdHlwZSgKKyAgICBhcGlfbG9nX3JlYyAqcmVjLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICBjb25zdCB2b2lkICpkYXRhLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgdWludDMyX3QgbnVtX2VudHJpZXMsCisgICAgdWludDMyX3QgZW50cnlfc2l6ZSk7CisKK3N0YXRpYyBiY21vc19ib29sIGFwaV9sb2dfaXNfc2luZ2xldG9uKGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXApCit7CisgICAgc3dpdGNoIChncm91cCkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGFwaV9sb2dfYnVmX3JlbWFpbmluZyhjb25zdCBhcGlfbG9nX3JlYyAqcmVjKQoreworICAgIHJldHVybiAoTUFYX0RFVl9MT0dfU1RSSU5HX05FVF9TSVpFIC0gQVBJX0xPR19FTlRSWV9PVkVSSEVBRCkgLSByZWMtPnVzZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGFwaV9sb2dfZmx1c2goYXBpX2xvZ19yZWMgKnJlYywgY29uc3QgY2hhciAqZW5kX29mX2xpbmUpCit7CisgICAgaWYgKHJlYy0+dXNlZCAhPSAwKQorICAgIHsKKyAgICAgICAgc3RybmNhdChyZWMtPmJ1ZiwgZW5kX29mX2xpbmUsIE1BWF9ERVZfTE9HX1NUUklOR19ORVRfU0laRSAtIHJlYy0+dXNlZCk7CisgICAgICAgIGJjbV9kZXZfbG9nX2xvZyhyZWMtPmxvZ19pZCwgREVWX0xPR19MRVZFTF9JTkZPLCBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCwgIiVzIiwgcmVjLT5idWYpOworICAgICAgICByZWMtPnVzZWQgPSAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYXBpX2xvZ19wcmludChhcGlfbG9nX3JlYyAqcmVjLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgaW50IHJldDsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgcmV0ID0gdnNucHJpbnRmKHJlYy0+YnVmICsgcmVjLT51c2VkLCBhcGlfbG9nX2J1Zl9yZW1haW5pbmcocmVjKSwgZm9ybWF0LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisKKyAgICBpZiAocmV0IDwgMCB8fCByZXQgPiBhcGlfbG9nX2J1Zl9yZW1haW5pbmcocmVjKSkKKyAgICB7CisgICAgICAgIC8qIHRoaXMgcHJpbnQgZG9lc24ndCBmaXQgaW4gdGhlIGJ1ZmZlciAtIHNlbmQgdGhlIGN1cnJlbnQgYnVmZmVyIGFuZCBjcmVhdGUgYSBuZXcgY29udGludWF0aW9uIGxvZyBlbnRyeSAqLworICAgICAgICByZWMtPmJ1ZltyZWMtPnVzZWRdID0gJ1wwJzsKKyAgICAgICAgYXBpX2xvZ19mbHVzaChyZWMsIEFQSV9MT0dfQ09OVF9TVFIgIlxuIik7CisKKyAgICAgICAgLyogdGhlIGNvbnRpbnVhdGlvbiBlbnRyeSBjYW4gc2tpcCB0aGUgaGVhZGVyICovCisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCBBUElfTE9HX0NPTlRfU1RSKTsKKworICAgICAgICAvKiB0cnkgYWdhaW4sIHRoaXMgdGltZSBhZ2FpbnN0IHRoZSBjb250aW51YXRpb24gZW50cnkgKi8KKyAgICAgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICAgICAgcmV0ID0gdnNucHJpbnRmKHJlYy0+YnVmICsgcmVjLT51c2VkLCBhcGlfbG9nX2J1Zl9yZW1haW5pbmcocmVjKSwgZm9ybWF0LCBhcmdzKTsKKyAgICAgICAgdmFfZW5kKGFyZ3MpOworCisgICAgICAgIGlmIChyZXQgPCAwIHx8IHJldCA+IGFwaV9sb2dfYnVmX3JlbWFpbmluZyhyZWMpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCByZWMtPmxvZ19pZCwgIkFQSSBtZXNzYWdlIGxvZyBvdmVyZmxvdyBvbiBtc2cgIyV1XG4iLCByZWMtPm1zZy0+Y29ycl90YWcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVjLT51c2VkICs9IHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZWMtPnVzZWQgKz0gcmV0OworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfcmVhZF9zbnVtKGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwgY29uc3Qgdm9pZCAqZGF0YSwgaW50NjRfdCAqbikKK3sKKyAgICBzd2l0Y2ggKHRkLT5zaXplKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgeworICAgICAgICBpbnQ4X3QgbjEgPSAqKGNvbnN0IGludDhfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDI6CisgICAgeworICAgICAgICBpbnQxNl90IG4yID0gKihjb25zdCBpbnQxNl90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDoKKyAgICB7CisgICAgICAgIGludDMyX3QgbjQgPSAqKGNvbnN0IGludDMyX3QgKilkYXRhOworICAgICAgICAqbiA9IG40OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA4OgorICAgIHsKKyAgICAgICAgbWVtY3B5KG4sIGRhdGEsIHNpemVvZigqbikpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBhcGlfbG9nX3JlYWRfdW51bShjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQ2NF90ICpuKQoreworICAgIHN3aXRjaCAodGQtPnNpemUpCisgICAgeworICAgIGNhc2UgMToKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgbjEgPSAqKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworICAgICAgICAqbiA9IG4xOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOgorICAgIHsKKyAgICAgICAgdWludDE2X3QgbjIgPSAqKGNvbnN0IHVpbnQxNl90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDoKKyAgICB7CisgICAgICAgIHVpbnQzMl90IG40ID0gKihjb25zdCB1aW50MzJfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDg6CisgICAgeworICAgICAgICBtZW1jcHkobiwgZGF0YSwgc2l6ZW9mKCpuKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogYnJlYWsgYSBzdHJpbmcgdXAgaW50byBzbWFsbGVyIGNodW5rcyAocHJlZmVyYWJseSBhdCBcbiBib3VuZGFyaWVzKSBzbyB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgc2l6ZSBvZiBhIGxvZyBlbnRyeSAqLworc3RhdGljIHZvaWQgYXBpX2xvZ19wcmludF9sb25nX2xpbmUoYXBpX2xvZ19yZWMgKnJlYywgY29uc3QgY2hhciAqbGluZSwgdWludDMyX3QgbGVuKQoreworICAgIHVpbnQzMl90IGk7CisgICAgdWludDMyX3QgaGFuZGxlZCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGxpbmVbaV0gPT0gJ1xuJykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPiBoYW5kbGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJS4qcyIsIGkgLSBoYW5kbGVkLCAmbGluZVtoYW5kbGVkXSk7CisgICAgICAgICAgICAgICAgYXBpX2xvZ19mbHVzaChyZWMsIEFQSV9MT0dfQ09OVF9TVFIgIlxuIik7CisgICAgICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsIEFQSV9MT0dfQ09OVF9TVFIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlZCA9IGkgKyAxOworICAgICAgICB9CisgICAgICAgIGlmIChpID4gaGFuZGxlZCAmJiBpIC0gaGFuZGxlZCA9PSAzMikKKyAgICAgICAgeworICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlLipzIiwgMzIsICZsaW5lW2hhbmRsZWRdKTsKKyAgICAgICAgICAgIGhhbmRsZWQgPSBpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChoYW5kbGVkIDwgbGVuKQorICAgIHsKKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlLipzIiwgbGVuIC0gaGFuZGxlZCwgJmxpbmVbaGFuZGxlZF0pOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfZHVtcF9zaW1wbGVfZGF0YV90eXBlKAorICAgIGFwaV9sb2dfcmVjICpyZWMsCisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgc3dpdGNoICh0ZC0+YmFzZV90eXBlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfU05VTTogICAgICAgLyogc2lnbmVkIG51bWJlciAqLworICAgIHsKKyAgICAgICAgaW50NjRfdCBuID0gMDsKKyAgICAgICAgZXJyID0gYXBpX2xvZ19yZWFkX3NudW0odGQsIGRhdGEsICZuKTsKKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlbGxkIiwgKGxvbmcgbG9uZyluKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU06ICAgICAgIC8qIHVuc2lnbmVkIG51bWJlciAqLworICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIGVyciA9IGFwaV9sb2dfcmVhZF91bnVtKHRkLCBkYXRhLCAmbik7CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNX0hFWDogICAvKiB1bnNpZ25lZCBudW1iZXIgcHJpbnRlZCBpbiBoZXggKi8KKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICBlcnIgPSBhcGlfbG9nX3JlYWRfdW51bSh0ZCwgZGF0YSwgJm4pOworICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIjB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9GTE9BVDogICAgICAvKiBmbG9hdGluZy1wb2ludCBudW1iZXIgKi8KKyAgICB7CisgICAgICAgIGlmICh0ZC0+c2l6ZSA9PSBzaXplb2YoZmxvYXQpKQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVmIiwgKihjb25zdCBmbG9hdCAqKWRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRkLT5zaXplID09IHNpemVvZihkb3VibGUpKQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVmIiwgKihjb25zdCBkb3VibGUgKilkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfQk9PTDoKKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICBlcnIgPSBhcGlfbG9nX3JlYWRfdW51bSh0ZCwgZGF0YSwgJm4pOworICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVzIiwgbiA9PSAwID8gIm5vIiA6ICJ5ZXMiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORzogICAgIC8qIHN0cmluZyAqLworICAgIHsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHRkLT5zaXplOworICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplID0gc3RybGVuKChjb25zdCBjaGFyICopZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgYXBpX2xvZ19wcmludF9sb25nX2xpbmUocmVjLCAoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfSVBWNDogICAgICAgLyogSVB2NCBhZGRyZXNzICovCisgICAgeworICAgICAgICB1aW50MzJfdCBpcDsKKyAgICAgICAgbWVtY3B5KCZpcCwgZGF0YSwgc2l6ZW9mKGlwKSk7CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJWQuJWQuJWQuJWQiLCAoaXA+PjI0KSYweGZmLCAoaXA+PjE2KSYweGZmLCAoaXA+PjgpJjB4ZmYsIGlwICYgMHhmZik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9NQUM6ICAgICAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjOworICAgICAgICBtZW1jcHkobWFjLnU4LCBkYXRhLCBzaXplb2YobWFjLnU4KSk7CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgICAgbWFjLnU4WzBdLCBtYWMudThbMV0sIG1hYy51OFsyXSwgbWFjLnU4WzNdLCBtYWMudThbNF0sIG1hYy51OFs1XSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNOiAgICAgICAvKiBlbnVtICovCisgICAgeworICAgICAgICB1aW50NjRfdCBuID0gMDsKKyAgICAgICAgZXJyID0gYXBpX2xvZ19yZWFkX3VudW0odGQsIGRhdGEsICZuKTsKKyAgICAgICAgQlVHX09OKHRkLT54LmUgPT0gTlVMTCk7CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJXMiLCBiY21jbGlfZW51bV9zdHJpbmd2YWwodGQtPnguZSwgbikpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTV9NQVNLOgorICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqdmFsdWUgPSB0ZC0+eC5lOworICAgICAgICBiY21vc19ib29sIGZpcnN0ID0gQkNNT1NfVFJVRTsKKyAgICAgICAgQlVHX09OKHZhbHVlID09IE5VTEwpOworICAgICAgICBlcnIgPSBhcGlfbG9nX3JlYWRfdW51bSh0ZCwgZGF0YSwgJm4pOworICAgICAgICB3aGlsZSAodmFsdWUtPm5hbWUgIT0gTlVMTCAmJiBuICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgodmFsdWUtPnZhbCAmIG4pICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlcyVzIiwgZmlyc3QgPyAiIiA6ICIrIiwgdmFsdWUtPm5hbWUpOworICAgICAgICAgICAgICAgIGZpcnN0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuIC09IHZhbHVlLT52YWw7CisgICAgICAgICAgICArK3ZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICItIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHVpbnQxNl90IGFwaV9sb2dfZ2V0X251bV9lbnVtX3ZhbHMoY29uc3QgYmNtY2xpX2VudW1fdmFsICp2YWxzKQoreworICAgIGNvbnN0IGJjbWNsaV9lbnVtX3ZhbCAqdiA9IHZhbHM7CisgICAgd2hpbGUgKHYgIT0gTlVMTCAmJiB2LT5uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgICArK3Y7CisgICAgfQorICAgIHJldHVybiAodWludDE2X3QpKHYgLSB2YWxzKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfZHVtcF9hcnJheSgKKyAgICBhcGlfbG9nX3JlYyAqcmVjLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICBjb25zdCB2b2lkICpkYXRhLAorICAgIHVpbnQzMl90IHNpemUsCisgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogUHJpbnQgYXMgYnVmZmVyIG9yIGVsZW1lbnQgYnkgZWxlbWVudCA/ICovCisgICAgaWYgKCh0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTSB8fCB0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgpICYmIHRkLT5zaXplID09IDEpCisgICAgeworICAgICAgICB1aW50MzJfdCBpOworICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVzPSIsIG5hbWUpOworICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIi0iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlMDJYIiwgKChjb25zdCB1aW50OF90ICopZGF0YSlbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiICIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlcnIgPSBhcGlfbG9nX2R1bXBfZGF0YV90eXBlKHJlYywgdGQsIGRhdGEsIG5hbWUsIHNpemUsIHRkLT5zaXplKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfZHVtcF9kYXRhX3R5cGUoCisgICAgYXBpX2xvZ19yZWMgKnJlYywKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsCisgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIHVpbnQzMl90IG51bV9lbnRyaWVzLAorICAgIHVpbnQzMl90IGVudHJ5X3NpemUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIHN3aXRjaCAodGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGY7CisgICAgICAgICAgICBjaGFyIGZ1bGxfbmFtZVtBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEhdOworICAgICAgICAgICAgaWYgKHRkLT54LnMubnVtX2ZpZWxkcyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQlVHX09OKHRkLT54LnMuZmllbGRzID09IE5VTEwpOworICAgICAgICAgICAgZm9yIChmID0gMDsgZiA8IHRkLT54LnMubnVtX2ZpZWxkczsgZisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkID0gJnRkLT54LnMuZmllbGRzW2ZdOworICAgICAgICAgICAgICAgIHZvaWQgKmZkYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGZsZC0+b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNweShmdWxsX25hbWUsIG5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgZmxkLT5uYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgZXJyID0gYXBpX2xvZ19kdW1wX2RhdGFfdHlwZShyZWMsIGZsZC0+dHlwZSwgZmRhdGEsIGZ1bGxfbmFtZSwgbnVtX2VudHJpZXMsIGVudHJ5X3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT046CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFByaW50IGZpZWxkcyB1cCB0byBzZWxlY3RvciwgdGhlbiBzZWxlY3RvciwgdGhlbiBzZWxlY3RlZCBzdWItc3RydWN0dXJlICovCisgICAgICAgICAgICB1aW50MTZfdCBmOworICAgICAgICAgICAgY2hhciBmdWxsX25hbWVbQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIXTsKKyAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkOworICAgICAgICAgICAgdm9pZCAqZmRhdGE7CisgICAgICAgICAgICBpbnQ2NF90IHNlbGVjdG9yX3ZhbCA9IDA7CisgICAgICAgICAgICB1aW50MTZfdCBudW1fdW5pb25fdmFsczsKKworICAgICAgICAgICAgaWYgKHRkLT54LnUubnVtX2NvbW1vbl9maWVsZHMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJVR19PTih0ZC0+eC51LmNvbW1vbl9maWVsZHMgPT0gTlVMTCk7CisgICAgICAgICAgICAvKiBDb21tb24gZmllbGRzLCBpbmNsdWRpbmcgc2VsZWN0b3IgKi8KKyAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPD0gdGQtPngudS5jbGFzc2lmaWVyX2lkeCAmJiBlcnIgPT0gQkNNX0VSUl9PSzsgZisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LmNvbW1vbl9maWVsZHNbZl07CisgICAgICAgICAgICAgICAgZmRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgZmxkLT5vZmZzZXQpOworCisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoZnVsbF9uYW1lLCBuYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKGZsZC0+bmFtZSAhPSBOVUxMICYmIHN0cmxlbihmbGQtPm5hbWUpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSBhcGlfbG9nX2R1bXBfZGF0YV90eXBlKHJlYywgZmxkLT50eXBlLCBmZGF0YSwgZnVsbF9uYW1lLCBudW1fZW50cmllcywgZW50cnlfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LICYmIGYgPT0gdGQtPngudS5jbGFzc2lmaWVyX2lkeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfcmVhZF9zbnVtKGZsZC0+dHlwZSwgZmRhdGEsICZzZWxlY3Rvcl92YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW1fdW5pb25fdmFscyA9IGFwaV9sb2dfZ2V0X251bV9lbnVtX3ZhbHModGQtPngudS5jb21tb25fZmllbGRzW3RkLT54LnUuY2xhc3NpZmllcl9pZHhdLnR5cGUtPnguZSk7CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXNlbGVjdG9yX3ZhbCA+PSBudW1fdW5pb25fdmFscykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2VsZWN0ZWQgZmllbGQgKi8KKyAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LnVuaW9uX2ZpZWxkc1tzZWxlY3Rvcl92YWxdOworICAgICAgICAgICAgaWYgKGZsZC0+dHlwZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgZmxkLT5vZmZzZXQpOworCisgICAgICAgICAgICBiY21jbGlfc3RybmNweShmdWxsX25hbWUsIG5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgIGlmIChmbGQtPm5hbWUgIT0gTlVMTCAmJiBzdHJsZW4oZmxkLT5uYW1lKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgIi4iLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCBmbGQtPm5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9kYXRhX3R5cGUocmVjLCBmbGQtPnR5cGUsIGZkYXRhLCBmdWxsX25hbWUsIG51bV9lbnRyaWVzLCBlbnRyeV9zaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb21tb24gZmllbGRzIGZvbGxvd2luZyBzZWxlY3RvciAqLworICAgICAgICAgICAgZm9yICg7IGYgPCB0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzOyBmKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgICAgICAgICBmZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBmbGQtPm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNweShmdWxsX25hbWUsIG5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxkLT5uYW1lICE9IE5VTEwgJiYgc3RybGVuKGZsZC0+bmFtZSkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgIi4iLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgZmxkLT5uYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9kYXRhX3R5cGUocmVjLCBmbGQtPnR5cGUsIGZkYXRhLCBmdWxsX25hbWUsIG51bV9lbnRyaWVzLCBlbnRyeV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRDoKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gYXBpX2xvZ19kdW1wX2FycmF5KHJlYywgdGQtPnguYXJyX2ZpeGVkLmVsZW1fdHlwZSwgZGF0YSwgdGQtPnguYXJyX2ZpeGVkLnNpemUsIG5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTjoKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVhZCBsZW5ndGggKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGFycmF5X3NpemU7CisgICAgICAgICAgICBsb25nIGJhc2VfcHRyOworCisgICAgICAgICAgICBzd2l0Y2ggKHRkLT54LmFycl9keW4ubGVuX3NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiBhcnJheV9zaXplID0gKihjb25zdCB1aW50OF90ICopZGF0YTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBhcnJheV9zaXplID0gKihjb25zdCB1aW50MTZfdCAqKWRhdGE7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogYXJyYXlfc2l6ZSA9ICooY29uc3QgdWludDMyX3QgKilkYXRhOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmFzZV9wdHIgPSBCQ01PU19ST1VORF9VUCgobG9uZylkYXRhICsgdGQtPnguYXJyX2R5bi5sZW5fc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworICAgICAgICAgICAgQlVHX09OKGJhc2VfcHRyID09IDApOworICAgICAgICAgICAgZGF0YSA9ICoodm9pZCAqKiliYXNlX3B0cjsKKyAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9hcnJheShyZWMsIHRkLT54LmFycl9keW4uZWxlbV90eXBlLCBkYXRhLCBhcnJheV9zaXplLCBuYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAvKiBGaW5hbGx5ISBTaW1wbGUgdHlwZSB0aGF0IG1hcHMgdG8gYSBzaW5nbGUgbmFtZT12YWx1ZSBwYWlyICovCisgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJXM9IiwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBEdW1wIHNpbXBsZSB2YWx1ZSBvciBhcnJheSBvZiBzaW1wbGUgdmFsdWVzICovCisgICAgICAgICAgICBpZiAobnVtX2VudHJpZXMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIi0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBudW1fZW50cmllczsgbisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChuICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gYXBpX2xvZ19kdW1wX3NpbXBsZV9kYXRhX3R5cGUocmVjLCB0ZCwgZGF0YSwgbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGF0YSA9IChjb25zdCB2b2lkICopKChsb25nKWRhdGEgKyBlbnRyeV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfZHVtcF9wcm9wKGFwaV9sb2dfcmVjICpyZWMsIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwgY29uc3Qgdm9pZCAqcHJvcF9kYXRhKQoreworICAgIHJldHVybiBhcGlfbG9nX2R1bXBfZGF0YV90eXBlKHJlYywgcGQtPnR5cGUsIHByb3BfZGF0YSwgcGQtPm5hbWUsIDEsIDApOworfQorCisvKiBDYWxjdWxhdGUgcHJvcGVydHkgcG9pbnRlciBnaXZlbiB0aGUgZ3JvdXAgZGF0YSBwb2ludGVyIGFuZCBwcm9wZXJ0eSBkZXNjcmlwdGlvbiAqLworc3RhdGljIGlubGluZSBjb25zdCB2b2lkICphcGlfbG9nX3Byb3BfZGF0YV9wdHIoY29uc3Qgdm9pZCAqZ3JvdXBfcHRyLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQpCit7CisgICAgcmV0dXJuIChjb25zdCB2b2lkICopKChsb25nKWdyb3VwX3B0ciArIHBkLT5vZmZzZXQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYXBpX2xvZ19hcHBlbmRfa2V5KGFwaV9sb2dfcmVjICpyZWMsIGNvbnN0IHZvaWQgKmtleSwgdWludDMyX3Qga2V5X3NpemUpCit7CisgICAgdWludDE2X3QgcHJvcDsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKworICAgIGZvciAocHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShyZWMtPm1zZy0+b2JqX3R5cGUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBjb25zdCB2b2lkICpwcm9wX2RhdGEgPSBhcGlfbG9nX3Byb3BfZGF0YV9wdHIoa2V5LCBwZCk7CisgICAgICAgIGlmIChwcm9wX2RhdGEgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQlVHX09OKHBkLT5vZmZzZXQgPiBrZXlfc2l6ZSk7CisgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9wcm9wKHJlYywgcGQsIHByb3BfZGF0YSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfYXBwZW5kX2RhdGEoYXBpX2xvZ19yZWMgKnJlYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgZGF0YV9zaXplKQoreworICAgIHVpbnQxNl90IHByb3A7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisKKyAgICBmb3IgKHByb3AgPSAwOworICAgICAgICAgYXBpX2NsaV9vYmplY3RfcHJvcGVydHkocmVjLT5tc2ctPm9ial90eXBlLCByZWMtPm1zZy0+Z3JvdXAsIHJlYy0+bXNnLT5zdWJncm91cCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgY29uc3Qgdm9pZCAqcHJvcF9kYXRhID0gYXBpX2xvZ19wcm9wX2RhdGFfcHRyKGRhdGEsIHBkKTsKKyAgICAgICAgaWYgKCgocmVjLT5tc2ctPnByZXNlbmNlX21hc2sgJiAoMUxMIDw8IHByb3ApKSA9PSAwKSB8fCAocHJvcF9kYXRhID09IE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBCVUdfT04ocGQtPm9mZnNldCA+IGRhdGFfc2l6ZSk7CisgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9wcm9wKHJlYywgcGQsIHByb3BfZGF0YSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfYXBwZW5kX2hkcihhcGlfbG9nX3JlYyAqcmVjKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKmRlc2NyOworCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3RfbmFtZShyZWMtPm1zZy0+b2JqX3R5cGUsICZuYW1lLCAmZGVzY3IpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYXBpX2xvZ19wcmludChyZWMsIGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKHJlYy0+bXNnLT5ncm91cCkpOworICAgIGlmIChhcGlfbG9nX2lzX3NpbmdsZXRvbihyZWMtPm1zZy0+Z3JvdXApKQorICAgIHsKKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsIChyZWMtPm1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9TRVQpICE9IDAgPyAiX3NldCIgOiAiX2dldCIpOworICAgICAgICBpZiAoKHJlYy0+bXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX01VTFRJKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIl9tdWx0aSIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlYy0+bXNnLT5ncm91cCAhPSBCQ01PTFRfTUdUX0dST1VQX0FVVE8gJiYgcmVjLT5tc2ctPmdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgpCisgICAgeworICAgICAgICBpZiAocmVjLT5tc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVFVRVNUKQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiByZXF1ZXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiByZXNwb25zZVslZF0iLCByZWMtPm1zZy0+ZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiPiAlcyIsIG5hbWUpOworICAgIGlmICghYXBpX2xvZ19pc19zaW5nbGV0b24ocmVjLT5tc2ctPmdyb3VwKSkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKnN1Yl9uYW1lOworICAgICAgICBjb25zdCBjaGFyICpzdWJfZDsKKyAgICAgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShyZWMtPm1zZy0+b2JqX3R5cGUsIHJlYy0+bXNnLT5ncm91cCwgcmVjLT5tc2ctPnN1Ymdyb3VwLCAmc3ViX25hbWUsICZzdWJfZCk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIi4lcyIsIHN1Yl9uYW1lKTsKKyAgICB9CisKKyAgICBhcGlfbG9nX3ByaW50KHJlYywgIjogIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfYXBwZW5kX2JvZHkoYXBpX2xvZ19yZWMgKnJlYykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgdWludDMyX3Qga2V5X3NpemU7CisgICAgdWludDMyX3Qga2V5X29mZnNldDsKKyAgICB1aW50MzJfdCBkYXRhX3NpemU7CisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQ7CisKKyAgICBlcnIgPSBhcGlfY2xpX29iamVjdF9zdHJ1Y3Rfc2l6ZSgKKyAgICAgICAgcmVjLT5tc2ctPm9ial90eXBlLAorICAgICAgICByZWMtPm1zZy0+Z3JvdXAsCisgICAgICAgIHJlYy0+bXNnLT5zdWJncm91cCwKKyAgICAgICAgJmtleV9zaXplLAorICAgICAgICAma2V5X29mZnNldCwKKyAgICAgICAgJmRhdGFfc2l6ZSwKKyAgICAgICAgJmRhdGFfb2Zmc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgocmVjLT5tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfTVVMVEkpICE9IDApCisgICAgeworICAgICAgICAvKiBtZXNzYWdlIHNldCBwcmludGluZyBmb3IgbXVsdGktb2JqZWN0IGNmZyBub3QgaW1wbGVtZW50ZWQgKi8KKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIoZGF0YSBvbWl0dGVkKSIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoKHJlYy0+bXNnLT5ncm91cCAhPSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHKSAmJiAoa2V5X3NpemUgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSA9IChjb25zdCB2b2lkICopKChsb25nKXJlYy0+bXNnICsga2V5X29mZnNldCk7CisgICAgICAgICAgICBlcnIgPSBhcGlfbG9nX2FwcGVuZF9rZXkocmVjLCBrZXksIGtleV9zaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChkYXRhX3NpemUgIT0gMCkgJiYKKyAgICAgICAgICAgICgoKHJlYy0+bXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVRVUVTVCkgJiYgKHJlYy0+bXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX1NFVCkpICB8fAorICAgICAgICAgICAgICgocmVjLT5tc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRSkgJiYgKHJlYy0+bXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0dFVCkpIHx8CisgICAgICAgICAgICAgKHJlYy0+bXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FVVE8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAocmVjLT5tc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IChjb25zdCB2b2lkICopKChsb25nKXJlYy0+bXNnICsgZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgZXJyID0gYXBpX2xvZ19hcHBlbmRfZGF0YShyZWMsIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21vbHRfbXNnX2xvZyhkZXZfbG9nX2lkIGxvZ19pZCwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisgICAgYXBpX2xvZ19yZWMgcmVjID0geyAubG9nX2lkID0gbG9nX2lkLCAubXNnID0gbXNnLCAudXNlZCA9IDAgfTsKKworICAgIHJlYy5idWYgPSBiY21vc19ibGtfcG9vbF9hbGxvYygmYXBpX2xvZ19ibGtfcG9vbCk7CisgICAgaWYgKHJlYy5idWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGVyciA9IEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgZXJyID0gKGVyciAhPSBCQ01fRVJSX09LKSA/IGVyciA6IGFwaV9sb2dfYXBwZW5kX2hkcigmcmVjKTsKKyAgICBlcnIgPSAoZXJyICE9IEJDTV9FUlJfT0spID8gZXJyIDogYXBpX2xvZ19hcHBlbmRfYm9keSgmcmVjKTsKKyAgICBhcGlfbG9nX2ZsdXNoKCZyZWMsICJcbiIpOworCisgICAgaWYgKHJlYy5idWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jsa19wb29sX2ZyZWUocmVjLmJ1Zik7CisgICAgfQorICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZCwgIkFQSSBtZXNzYWdlIGxvZyBlcnJvcjogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSwgZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBiY21vbHRfbXNnX2xvZ19pbml0KHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9zX2Jsa19wb29sX3Bhcm0gYmxrX3Bvb2xfcGFybSA9CisgICAgeworICAgICAgICAubmFtZSA9ICJhcGlfZGV2X2xvZyIsCisgICAgICAgIC5ibGtfc2l6ZSA9IE1BWF9ERVZfTE9HX1NUUklOR19ORVRfU0laRSwKKyAgICAgICAgLm51bV9ibGtzID0gQVBJX0xPR19OVU1fQkxLUywKKyAgICB9OworCisgICAgZXJyID0gYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKCZhcGlfbG9nX2Jsa19wb29sLCAmYmxrX3Bvb2xfcGFybSk7CisgICAgQlVHX09OKGVyciAhPSBCQ01fRVJSX09LKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9kZXZfbG9nL2JjbV9hcGlfZGV2X2xvZy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9kZXZfbG9nL2JjbV9hcGlfZGV2X2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NzViNWYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2Rldl9sb2cvYmNtX2FwaV9kZXZfbG9nLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01fQVBJX0RFVl9MT0dfSF8KKyNkZWZpbmUgQkNNX0FQSV9ERVZfTE9HX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKworLyogUHJpbnQgbWVzc2FnZSBoZWFkZXIvYm9keSB0byBhIGxvZ2dlciBJRCAqLworYmNtb3NfZXJybm8gYmNtb2x0X21zZ19sb2coZGV2X2xvZ19pZCBsb2dfaWQsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZyk7CisKKy8qIEluaXRpYWxpemUgQVBJL2RldmxvZyBpbnRlZ3JhdGlvbiAqLwordm9pZCBiY21vbHRfbXNnX2xvZ19pbml0KHZvaWQpOworCisjZW5kaWYgLyogQkNNX0FQSV9ERVZfTE9HX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX3Byb3h5L01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9wcm94eS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDBiODM5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9wcm94eS9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACitpZmVxICgiJChPUykiLCAicG9zaXgiKQorICAgIE1PRF9OQU1FID0gYmNtX2FwaV9wcm94eQorICAgIE1PRF9UWVBFID0gbGliCisgICAgTU9EX0RFUFMgPSB0cmFuc3BvcnQgY2xpCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfREVQUyArPSBjb21tb25fYXBpCitlbHNlCisgICAgTU9EX0RFUFMgKz0gYXBpCitlbmRpZgorCisgICAgc3JjcyA9IGJjbW9sdF9hcGlfcHJveHkuYworZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvYmNtb2x0X2FwaV9wcm94eS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9wcm94eS9iY21vbHRfYXBpX3Byb3h5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3MTYzMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvYmNtb2x0X2FwaV9wcm94eS5jCkBAIC0wLDAgKzEsNTAxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtdHJfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmNtdHJfaGVhZGVyLmg+CisjaW5jbHVkZSA8YmNtdHJfdHJhbnNwb3J0X2NsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY210cl9kZWJ1Zy5oPgorI2lmZGVmIEVOQUJMRV9DTEkKKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNlbmRpZgorI2luY2x1ZGUgImJjbW9sdF9hcGlfcHJveHkuaCIKKyNpZmRlZiBFTkFCTEVfTE9HCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNlbmRpZgorCisvKiBTdGF0aXN0aWNzICovCit0eXBlZGVmIHN0cnVjdCBwcm94eV9zdGF0cworeworICAgIHVuc2lnbmVkIGxvbmcgcnhfcGFja2V0czsKKyAgICB1bnNpZ25lZCBsb25nIHJ4X2J5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgdHhfcGFja2V0czsKKyAgICB1bnNpZ25lZCBsb25nIHR4X2J5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgcnhfZXJyb3JzOworICAgIHVuc2lnbmVkIGxvbmcgdHhfZXJyb3JzOworICAgIHVuc2lnbmVkIGxvbmcgdW5wYWNrX2Vycm9yczsKKyAgICB1bnNpZ25lZCBsb25nIHBhY2tfZXJyb3JzOworICAgIHVuc2lnbmVkIGxvbmcgbXNnX2Vycm9yczsKK30gcHJveHlfc3RhdHM7CisKK3R5cGVkZWYgc3RydWN0IHByb3h5X2NvbnRyb2xfYmxvY2sKK3sKKyAgICBiY21vc190YXNrIHByb3h5X3J4X3Rhc2s7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGNsaWVudDsKKyAgICB1aW50MzJfdCBwcm94eV9wb3J0OworICAgIGludCBkZXZpY2VfaWQ7CisgICAgaW50IGNsaWVudF9zb2NrZXQ7CisgICAgYmNtb3NfYm9vbCBpc19ydW5uaW5nOworICAgIGNoYXIgKm9uX3JlYWR5X2NtZDsKKworICAgIC8qIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBjb3VsZCBwb3NzaWJseSBieSB1c2VkIGJ5IGFsbCB2YXJpYWJsZS1zaXplZCBsaXN0cyB3aXRoaW4gYSBHRVQgcmVxdWVzdCAqLworI2RlZmluZSBEWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUgKDMyICogMTAyNCkKKyAgICB1aW50OF90IGR5bmFtaWNfbGlzdF9idWZmZXJbRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFXTsKKworICAgIGRldl9sb2dfaWQgcHJveHlfbG9nOworCisgICAgcHJveHlfc3RhdHMgc3RhdHM7Cit9IHByb3h5X2NvbnRyb2xfYmxvY2s7CisKKy8qIFBlciBkZXZpY2UgcHJveHkgY29udHJvbCBibG9jayAqLworc3RhdGljIHByb3h5X2NvbnRyb2xfYmxvY2sgcHJveHlfZGF0YVtCQ01UUl9NQVhfT0xUU107CitzdGF0aWMgYmNtb3NfYm9vbCBpc19maXJzdF9wcm94eSA9IEJDTU9TX1RSVUU7CisKKyNpZmRlZiBFTkFCTEVfQ0xJCisvKi9wcm94eS9zdGF0cyBjb21tYW5kIGhhbmRsZXIKKyovCitzdGF0aWMgYmNtb3NfZXJybm8gX3Byb3h5X3N0YXRzX2NtZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGludCBkZXZpY2UgPSAoaW50KXBhcm1bMF0udmFsdWUubnVtYmVyOworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJyeF9wYWNrZXRzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnJ4X3BhY2tldHMpOworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInJ4X2J5dGVzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnJ4X2J5dGVzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ0eF9wYWNrZXRzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X3BhY2tldHMpOworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInR4X2J5dGVzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X2J5dGVzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJyeF9lcnJvcnMiLCBwcm94eV9kYXRhW2RldmljZV0uc3RhdHMucnhfZXJyb3JzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ0eF9lcnJvcnMiLCBwcm94eV9kYXRhW2RldmljZV0uc3RhdHMudHhfZXJyb3JzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ1bnBhY2tfZXJyb3JzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnVucGFja19lcnJvcnMpOworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInBhY2tfZXJyb3JzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnBhY2tfZXJyb3JzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJtc2dfZXJyb3JzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLm1zZ19lcnJvcnMpOworICAgIG1lbXNldCgmcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLCAwLCBzaXplb2YocHJveHlfc3RhdHMpKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmIC8qICNpZmRlZiBFTkFCTEVfQ0xJICovCisKK3N0YXRpYyBiY21vc19lcnJubyBfcHJveHlfbXNnX2Vycm9yKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKnByb3h5X21zZykKK3sKKyAgICBwcm94eV9jb250cm9sX2Jsb2NrICpwcm94eSA9ICZwcm94eV9kYXRhW2RldmljZV07CisgICAgKytwcm94eS0+c3RhdHMubXNnX2Vycm9yczsKKyAgICBiY21vbHRfbXNnX2Vycihwcm94eV9tc2csIHByb3h5LT5wcm94eV9sb2csIEJDTV9FUlJfUEFSTSwgQkNNT0xUX0VSUl9GSUVMRF9OT05FLCAiTWVzc2FnZSBpcyBpbnNhbmUiKTsKKyAgICBwcm94eV9tc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgIHJldHVybiBCQ01fRVJSX1BBUk07Cit9CisKK3N0YXRpYyB2b2lkIF9wcm94eV9pbnZva2UoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqcHJveHlfbXNnKQoreworICAgIHByb3h5X2NvbnRyb2xfYmxvY2sgKnByb3h5ID0gJnByb3h5X2RhdGFbZGV2aWNlXTsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIHRhcmdldHMgYW4gb2JqZWN0IHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIG91ciBzeXN0ZW0gbW9kZSAqLworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoZGV2aWNlLCAmc3lzdGVtX21vZGUpOworICAgIGlmIChzeXN0ZW1fbW9kZSAhPSBCQ01PTFRfU1lTVEVNX01PREVfX05VTV9PRiAmJiAhYmNtb2x0X29iamVjdF9pc19zdXBwb3J0ZWQoc3lzdGVtX21vZGUsIHByb3h5X21zZy0+b2JqX3R5cGUpKQorICAgIHsKKyAgICAgICAgKytwcm94eS0+c3RhdHMubXNnX2Vycm9yczsKKyAgICAgICAgcHJveHlfbXNnLT5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRTsKKyAgICAgICAgYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBwcm94eV9tc2csCisgICAgICAgICAgICBwcm94eS0+cHJveHlfbG9nLAorICAgICAgICAgICAgQkNNX0VSUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIk9iamVjdCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBzeXN0ZW0gbW9kZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogSW52b2tlIEFQSSAqLworICAgIHN3aXRjaCAocHJveHlfbXNnLT5ncm91cCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICBpZiAoKHByb3h5X21zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9DTEVBUikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlLCAoYmNtb2x0X2NmZyAqKXByb3h5X21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgocHJveHlfbXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0dFVCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHByb3h5X21zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9NVUxUSSkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm94eV9tc2ctPm1zZ19zZXQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBfcHJveHlfbXNnX2Vycm9yKGRldmljZSwgcHJveHlfbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiY21vbHRfY2ZnICopcHJveHlfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X21zZy0+bXNnX3NldC0+ZmlsdGVyX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X21zZy0+bXNnX3NldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBiY21vbHRfY2ZnX2dldChkZXZpY2UsIChiY21vbHRfY2ZnICopcHJveHlfbXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgocHJveHlfbXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX1NFVCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IGJjbW9sdF9jZmdfc2V0KGRldmljZSwgKGJjbW9sdF9jZmcgKilwcm94eV9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX3Byb3h5X21zZ19lcnJvcihkZXZpY2UsIHByb3h5X21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfc3RhdF9mbGFncyBmbGFnczsKKworICAgICAgICAgICAgICAgIGZsYWdzID0gKChwcm94eV9tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfQ0xFQVIpICE9IDApID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9TVEFUX0ZMQUdTX0NMRUFSX09OX1JFQUQgOiAwOworCisgICAgICAgICAgICAgICAgcmMgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlLCAoYmNtb2x0X3N0YXQgKilwcm94eV9tc2csIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlLCAoYmNtb2x0X29wZXIgKilwcm94eV9tc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgcmMgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2UsIChiY21vbHRfcHJveHkgKilwcm94eV9tc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgaWYgKChwcm94eV9tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfR0VUKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2UsIChiY21vbHRfc3RhdF9jZmcgKilwcm94eV9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHByb3h5X21zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9TRVQpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZSwgKGJjbW9sdF9zdGF0X2NmZyAqKXByb3h5X21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBfcHJveHlfbXNnX2Vycm9yKGRldmljZSwgcHJveHlfbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgIGlmICgocHJveHlfbXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0dFVCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlLCAoYmNtb2x0X2F1dG9fY2ZnICopcHJveHlfbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChwcm94eV9tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfU0VUKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2UsIChiY21vbHRfYXV0b19jZmcgKilwcm94eV9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX3Byb3h5X21zZ19lcnJvcihkZXZpY2UsIHByb3h5X21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmMgPSBfcHJveHlfbXNnX2Vycm9yKGRldmljZSwgcHJveHlfbXNnKTsKKyAgICB9CisKKyAgICBwcm94eV9tc2ctPmVyciA9IHJjOworfQorCisvKiBQYWNrIGFuZCBzZW5kIG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIF9wcm94eV9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY210cl9oZHIgaGRyID0ge307CisgICAgaW50MzJfdCBwYWNrZWRfbGVuZ3RoOworICAgIGJjbW9sdF9idWYgdHhiID0ge307CisgICAgaW50IGxlbjsKKworICAgIC8qIEFsbG9jYXRlIGJ1ZmZlciBhbmQgcGFjayAqLworICAgIHBhY2tlZF9sZW5ndGggPSBiY21vbHRfbXNnX2dldF9wYWNrZWRfbGVuZ3RoKG1zZyk7CisgICAgaWYgKHBhY2tlZF9sZW5ndGggPD0gMCkKKyAgICB7CisgICAgICAgICsrcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnBhY2tfZXJyb3JzOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHBhY2tlZF9sZW5ndGggKz0gQkNNVFJfSERSX1NJWkU7CisgICAgaWYgKGJjbW9sdF9idWZfYWxsb2MoJnR4YiwgcGFja2VkX2xlbmd0aCwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICArK3Byb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy5wYWNrX2Vycm9yczsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBiY210cl9oZWFkZXJfZmlsbChtc2csICZoZHIpOworICAgIGJjbXRyX2hlYWRlcl9wYWNrKCZoZHIsIHR4Yi5zdGFydCk7CisgICAgYmNtb2x0X2J1Zl9za2lwKCZ0eGIsIEJDTVRSX0hEUl9TSVpFKTsKKyAgICBpZiAoYmNtb2x0X21zZ19wYWNrKG1zZywgJnR4YikgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgICsrcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnBhY2tfZXJyb3JzOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgLyogU2VuZCB0byBjbGllbnQgKi8KKyAgICBsZW4gPSBzZW5kdG8ocHJveHlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQsIHR4Yi5zdGFydCwgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmdHhiKSwgMCwKKyAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZwcm94eV9kYXRhW2RldmljZV0uY2xpZW50LCBzaXplb2YocHJveHlfZGF0YVtkZXZpY2VdLmNsaWVudCkpOworICAgIGlmIChsZW4gPD0gMCkKKyAgICB7CisgICAgICAgICsrcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X2Vycm9yczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKytwcm94eV9kYXRhW2RldmljZV0uc3RhdHMudHhfcGFja2V0czsKKyAgICAgICAgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKyAgICB9CisKK2RvbmU6CisgICAgYmNtb2x0X2J1Zl9mcmVlKCZ0eGIpOworICAgIHJldHVybjsKK30KKworLyogVGFzayB0aGF0IHdhaXRzIGZvciBtZXNzYWdlcyBmcm9tIE1hcGxlLgorICogT25jZSBtZXNzYWdlIGlzIHJlY2VpdmVkLCBpdCBpcyBmb3J3YXJkZWQgdG8gcmVtb3RlIGFwcGxpY2F0aW9uCisgKiB2aWEgVURQIHNvY2tldC4KKyAqLworc3RhdGljIGludCBfcHJveHlfcnhfaGFuZGxlcihsb25nIGRhdGEpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpZGF0YTsKKyAgICBiY21vc190YXNrICpzZWxmID0gYmNtb3NfdGFza19jdXJyZW50KCk7CisgICAgcHJveHlfY29udHJvbF9ibG9jayAqcHJveHkgPSAmcHJveHlfZGF0YVtkZXZpY2VdOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZW5kZXI7CisgICAgc29ja2xlbl90IHNlbmRzaXplID0gc2l6ZW9mKHNlbmRlcik7CisgICAgdWludDhfdCBjbGllbnRfYnVmZmVyW0JDTVRSX01BWF9NVFVfU0laRSArIDEyOF07CisgICAgYmNtb2x0X21zZyAqcHJveHlfbXNnOworICAgIGJjbXRyX2hkciB0cl9oZHI7CisgICAgYmNtb2x0X2J1ZiByeGI7CisgICAgaW50IGxlbjsKKyAgICB1aW50MTZfdCBjb3JyX3RhZzsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHdoaWxlICghc2VsZi0+ZGVzdHJveWVkKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCZzZW5kZXIsIDAsIHNpemVvZihzZW5kZXIpKTsKKyAgICAgICAgbGVuID0gcmVjdmZyb20ocHJveHktPmNsaWVudF9zb2NrZXQsIGNsaWVudF9idWZmZXIsIHNpemVvZihjbGllbnRfYnVmZmVyKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzZW5kZXIsICZzZW5kc2l6ZSk7CisgICAgICAgIGlmIChsZW4gPCBCQ01UUl9IRFJfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgKytwcm94eS0+c3RhdHMucnhfZXJyb3JzOworICAgICAgICAgICAgYmNtb3NfdXNsZWVwKDEwMDAwMDApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKytwcm94eS0+c3RhdHMucnhfcGFja2V0czsKKyAgICAgICAgcHJveHktPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworICAgICAgICBpZiAocHJveHktPmNsaWVudC5zaW5fYWRkci5zX2FkZHIgIT0gc2VuZGVyLnNpbl9hZGRyLnNfYWRkciB8fAorICAgICAgICAgICAgcHJveHktPmNsaWVudC5zaW5fcG9ydCAhPSBzZW5kZXIuc2luX3BvcnQpCisgICAgICAgIHsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgICAgICBpbnQgY2xpZW50X2lwID0gbnRvaGwoc2VuZGVyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgICAgICBpbnQgY2xpZW50X3BvcnQgPSBudG9ocyhzZW5kZXIuc2luX3BvcnQpOworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBwcm94eS0+cHJveHlfbG9nLCAiYmNtX2FwaV9wcm94eTogZGV2aWNlICVpIGNvbm5lY3RlZCB0byAlZC4lZC4lZC4lZDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKGludClkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIChjbGllbnRfaXAgPj4gMjQpICYgMHhmZiwgKGNsaWVudF9pcCA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAoY2xpZW50X2lwID4+IDgpICYgMHhmZiwgY2xpZW50X2lwICYgMHhmZiwgY2xpZW50X3BvcnQpOworI2VuZGlmCisgICAgICAgICAgICBwcm94eS0+Y2xpZW50ID0gc2VuZGVyOworICAgICAgICB9CisKKyAgICAgICAgLyogVW5wYWNrIHJlY2VpdmVkIG1lc3NhZ2UgKi8KKyAgICAgICAgYmNtb2x0X2J1Zl9pbml0KCZyeGIsIGxlbiwgY2xpZW50X2J1ZmZlciwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgICAgICBiY210cl9oZWFkZXJfdW5wYWNrKGNsaWVudF9idWZmZXIsICZ0cl9oZHIpOworCisgICAgICAgIC8qIFNraXAgcmVnaXN0cmF0aW9uIG1lc3NhZ2VzIGZvciBub3cuIFRoZSBwcm94eSBoYXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBldmVyeXRoaW5nICovCisgICAgICAgIGlmICh0cl9oZHIuYXV0b19wcm94eV9yZWcgfHwgdHJfaGRyLmF1dG9fcHJveHlfdW5yZWcpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBiY21vbHRfYnVmX3NraXAoJnJ4YiwgQkNNVFJfSERSX1NJWkUpOworICAgICAgICBwcm94eV9tc2cgPSBOVUxMOworICAgICAgICByYyA9IGJjbW9sdF9tc2dfdW5wYWNrKCZyeGIsICZwcm94eV9tc2cpOworICAgICAgICBpZiAocmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVucGFjayBlcnJvci4gTm90aGluZyBtdWNoIHdlIGNhbiBkbyAqLworICAgICAgICAgICAgKytwcm94eS0+c3RhdHMudW5wYWNrX2Vycm9yczsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogU3RvcmUgY29ycmVsYXRpb24gdGFnIGZvciBsYXRlciAqLworICAgICAgICBwcm94eV9tc2ctPmNvcnJfdGFnID0gdHJfaGRyLmNvcnJfdGFnOworICAgICAgICBjb3JyX3RhZyA9IHByb3h5X21zZy0+Y29ycl90YWc7CisKKyAgICAgICAgLyogUG9pbnQgdGhlIG1lc3NhZ2UgdW5wYWNrZXIgdG8gbG9jYWwgc3RvcmFnZSBmb3IgZHluYW1pY2FsbHktc2l6ZWQgbGlzdHMgKi8KKyAgICAgICAgcHJveHlfbXNnLT5saXN0X2J1ZiA9IHByb3h5LT5keW5hbWljX2xpc3RfYnVmZmVyOworICAgICAgICBwcm94eV9tc2ctPmxpc3RfYnVmX3NpemUgPSBEWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkU7CisKKyAgICAgICAgLyogSW52b2tlIEFQSSAqLworICAgICAgICBfcHJveHlfaW52b2tlKGRldmljZSwgcHJveHlfbXNnKTsKKworICAgICAgICAvKiBQYWNrIGFuZCBzZW5kIGJhY2sgdG8gdGhlIGNsaWVudCAqLworICAgICAgICBwcm94eV9tc2ctPmNvcnJfdGFnID0gY29ycl90YWc7CisgICAgICAgIF9wcm94eV9zZW5kKGRldmljZSwgcHJveHlfbXNnKTsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKHByb3h5X21zZyk7CisgICAgfQorCisgICAgc2VsZi0+ZGVzdHJveWVkID0gQkNNT1NfVFJVRTsKKyAgICByZXR1cm4gMDsKK30KKworLyogQXV0byAvIHByb3h5IG1lc3NhZ2UgaGFuZGxlciAqLwordm9pZCBiY21vbHRfYXBpX3Byb3h5X2F1dG9fcnhfY2IoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwcm94eV9kYXRhW2RldmljZV0uaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIGlmIChwcm94eV9kYXRhW2RldmljZV0ub25fcmVhZHlfY21kICYmCisgICAgICAgICAgICBtc2ctPm9ial90eXBlID09IEJDTU9MVF9PQkpfSURfREVWSUNFICYmCisgICAgICAgICAgICBtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQVVUTyAmJgorICAgICAgICAgICAgbXNnLT5zdWJncm91cCA9PSBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9DT01QTEVURSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBvbl9yZWFkeV9jbWRbNTEyXTsKKyAgICAgICAgICAgIGludCByYzsKKyAgICAgICAgICAgIHNucHJpbnRmKG9uX3JlYWR5X2NtZCwgc2l6ZW9mKG9uX3JlYWR5X2NtZCkgLSAxLCAiJXMgJWQiLCBwcm94eV9kYXRhW2RldmljZV0ub25fcmVhZHlfY21kLCAoaW50KWRldmljZSk7CisgICAgICAgICAgICByYyA9IHN5c3RlbShvbl9yZWFkeV9jbWQpOworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X2xvZywgIkV4ZWN1dGVkIGNvbW1hbmQgJXMuIHJjPSVkXG4iLCBvbl9yZWFkeV9jbWQsIHJjKTsKKyNlbHNlCisgICAgICAgICAgICAodm9pZClyYzsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIF9wcm94eV9zZW5kKGRldmljZSwgbXNnKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfcHJveHlfc3RhcnQoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDMyX3QgdWRwX3BvcnQsIGNoYXIgKm9uX3JlYWR5KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9zX3Rhc2tfcGFybSBwcm94eV9yeF9wYXJtID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gInByb3h5X3J4IiwKKyAgICAgICAgLmhhbmRsZXIgPSBfcHJveHlfcnhfaGFuZGxlciwKKyAgICAgICAgLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUFJPWFksCisgICAgICAgIC5kYXRhID0gZGV2aWNlCisgICAgfTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2EgPSB7fTsKKworICAgIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9wb3J0ID0gdWRwX3BvcnQ7CisgICAgcHJveHlfZGF0YVtkZXZpY2VdLmRldmljZV9pZCA9IGRldmljZTsKKyAgICBwcm94eV9kYXRhW2RldmljZV0ub25fcmVhZHlfY21kID0gb25fcmVhZHk7CisKKyAgICAvKiBTdGFydCBsaXN0ZW5pbmcgb24gcHJveHkgcG9ydCAqLworICAgIHByb3h5X2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIGlmIChwcm94eV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCA8IDApCisgICAgeworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X2xvZywgIkNhbid0IGNyZWF0ZSBVRFAgc29ja2V0XG4iKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICAvKiBCaW5kIGxvY2FsICovCisgICAgc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgc2Euc2luX3BvcnQgPSBodG9ucyhwcm94eV9kYXRhW2RldmljZV0ucHJveHlfcG9ydCk7CisgICAgc2Euc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgICBpZiAoYmluZChwcm94eV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCwgKHN0cnVjdCBzb2NrYWRkciopJnNhLCBzaXplb2Yoc2EpICkgPT0gLTEpCisgICAgeworICAgICAgICBwZXJyb3IoImJpbmQiKTsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgIEJDTV9MT0coRVJST1IsIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9sb2csICJDYW4ndCBiaW5kIFVEUCBzb2NrZXQgdG8gcG9ydCAldVxuIiwgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X3BvcnQpOworI2VuZGlmCisgICAgICAgIGNsb3NlKHByb3h5X2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRocmVhZCBsaXN0ZW5pbmcgZm9yIGluY29taW5nIEFQSXMgKi8KKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZwcm94eV9kYXRhW2RldmljZV0ucHJveHlfcnhfdGFzaywgJnByb3h5X3J4X3Bhcm0pOworICAgIEJVR19PTihCQ01fRVJSX09LICE9IHJjKTsKKworICAgIHByb3h5X2RhdGFbZGV2aWNlXS5pc19ydW5uaW5nID0gQkNNT1NfVFJVRTsKKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBCQ01fTE9HKElORk8sIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9sb2csICJCQ002ODYyMCBBUEkgcHJveHkgZm9yIGRldmljZSAlZCBpcyBsaXN0ZW5pbmcgZm9yIHJlcXVlc3RzIG9uIFVEUCBwb3J0ICV1XG4iLAorICAgICAgICAoaW50KWRldmljZSwgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X3BvcnQpOworI2VuZGlmCisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X2FwaV9wcm94eV9pbml0KGJjbWNsaV9lbnRyeSAqcm9vdCwgYmNtb2x0X2RldmlkIGRldmljZSwgdWludDMyX3QgdWRwX3BvcnQsIGNoYXIgKm9uX3JlYWR5KQoreworI2lmZGVmIEVOQUJMRV9DTEkKKyAgICBiY21jbGlfZW50cnkgKmRpcjsKKyNlbmRpZgorCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmIChwcm94eV9kYXRhW2RldmljZV0uaXNfcnVubmluZykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICB7CisgICAgICAgIGNoYXIgbG9nX2lkWzMyXTsKKyAgICAgICAgc25wcmludGYobG9nX2lkLCBzaXplb2YobG9nX2lkKSAtIDEsICJwcm94eV8lZCIsIChpbnQpZGV2aWNlKTsKKyAgICAgICAgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X2xvZyA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGxvZ19pZCwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgfQorI2Vsc2UKKyAgICBwcm94eV9kYXRhW2RldmljZV0ucHJveHlfbG9nID0gREVWX0xPR19JTlZBTElEX0lEOworI2VuZGlmCisKKyAgICBpZiAoaXNfZmlyc3RfcHJveHkpCisgICAgeworI2lmZGVmIEVOQUJMRV9DTEkKKyAgICAgICAgZGlyID0gYmNtY2xpX2Rpcl9hZGQocm9vdCwgInByb3h5IiwgIkFQSSBwcm94eSIsIEJDTUNMSV9BQ0NFU1NfR1VFU1QsIE5VTEwpOworICAgICAgICBpZiAoIWRpcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X2xvZywgIkNhbid0IGNyZWF0ZSBwcm94eSBkaXJlY3RvcnlcbiIpOworICAgICAgICAgICAgQlVHKCk7CisgICAgICAgIH0KKworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAic3RhdCIsICJQcm94eSBzdGF0aXN0aWNzIiwgX3Byb3h5X3N0YXRzX2NtZCwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgMCwgQkNNVFJfTUFYX09MVFMtMSkpOworCisjZW5kaWYKKyAgICAgICAgaXNfZmlyc3RfcHJveHkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIF9wcm94eV9zdGFydChkZXZpY2UsIHVkcF9wb3J0LCBvbl9yZWFkeSk7Cit9CisKK3ZvaWQgYmNtb2x0X2FwaV9wcm94eV9zdG9wKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkNNVFJfTUFYX09MVFM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwcm94eV9kYXRhW2ldLmlzX3J1bm5pbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmcHJveHlfZGF0YVtpXS5wcm94eV9yeF90YXNrKTsKKyAgICAgICAgICAgIGNsb3NlKHByb3h5X2RhdGFbaV0uY2xpZW50X3NvY2tldCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvYmNtb2x0X2FwaV9wcm94eS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9wcm94eS9iY21vbHRfYXBpX3Byb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2YzI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvYmNtb2x0X2FwaV9wcm94eS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9BUElfUFJPWFlfSF8KKyNkZWZpbmUgX0JDTU9MVF9BUElfUFJPWFlfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKwordm9pZCBiY21vbHRfYXBpX3Byb3h5X2F1dG9fcnhfY2IoYmNtb2x0X2RldmlkIG9sdCwgYmNtb2x0X21zZyAqbXNnKTsKKworYmNtb3NfZXJybm8gYmNtb2x0X2FwaV9wcm94eV9pbml0KGJjbWNsaV9lbnRyeSAqcm9vdCwgYmNtb2x0X2RldmlkIGRldmljZSwgdWludDMyX3QgdWRwX3BvcnQsIGNoYXIgKm9uX3JlYWR5X2NtZCk7CisKK3ZvaWQgYmNtb2x0X2FwaV9wcm94eV9zdG9wKHZvaWQpOworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjk3NGMxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9NYWtlZmlsZQpAQCAtMCwwICsxLDI2IEBACisjIENMSSBlbmdpbmUKKyMKK01PRF9OQU1FID0gY2xpCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSB1dGlscworCitzcmNzID0gYmNtY2xpX3Nlc3Npb24uYworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgc3JjcyArPSBiY21jbGkuYworICAgIE1PRF9ERUZTID0gLURFTkFCTEVfQ0xJCisKKyAgICAjIEVuYWJsZSBsaW5lIGVkaXRpbmcgYnkgZGVmYXVsdC4gQ2FuIGJlIG92ZXJ3cml0dGVuIGluIG1ha2UgY29tbWFuZCBsaW5lCisgICAgQ09ORklHX0xJQkVESVQJPz0gbgorICAgIENPTkZJR19MSU5FTk9JU0UgPz0geQorICAgIAorICAgICMgRXh0cmEgY29uZmlndXJhdGlvbgorICAgIGlmZXEgKCIkKENPTkZJR19MSUJFRElUKSIsICJ5IikKKyAgICAJTU9EX0RFRlMgKz0gLURDT05GSUdfTElCRURJVCAtRENPTkZJR19FRElUTElORQorICAgIAlNT0RfTElCUyArPSAtbGVkaXQgLWx0ZXJtY2FwCisgICAgCUNPTkZJR19MSU5FTk9JU0UgPSBuCisgICAgZW5kaWYKKyAgICBpZmVxICgiJChDT05GSUdfTElORU5PSVNFKSIsICJ5IikKKyAgICAJTU9EX0RFUFMgKz0gbGluZW5vaXNlCisgICAgZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTBlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaS5jCkBAIC0wLDAgKzEsMjgzNSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYmNtY2xpLmMKKyAqCisgKiBDTEkgZW5naW5lCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjZGVmaW5lIEJDTUNMSV9JTlRFUk5BTAorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9zX3R5cGVzLmg+CisKKyNkZWZpbmUgQkNNQ0xJX0lOQlVGX0xFTiAgICAgICAgICAyMDQ4CisjZGVmaW5lIEJDTUNMSV9NQVhfUVVBTF9OQU1FX0xFTkdUSCAyNTYKKyNkZWZpbmUgQkNNQ0xJX01BWF9QQVJNUyAgICAgICAgICAxMjgKKyNkZWZpbmUgQkNNQ0xJX1VQX1NUUiAgICAgICAgICAgICAiLi4iCisjZGVmaW5lIEJDTUNMSV9ST09UX1NUUiAgICAgICAgICAgIi8iCisjZGVmaW5lIEJDTUNMSV9DT01NRU5UX0NIQVIgICAgICAgJyMnCisjZGVmaW5lIEJDTUNMSV9IRUxQX0NIQVIgICAgICAgICAgJz8nCisjZGVmaW5lIEJDTUNMSV9BUlJBWV9ERUxJTV9DSEFSICAgJywnCisjZGVmaW5lIEJDTUNMSV9ST09UX0hFTFAgICAgICAgICAgInJvb3QgZGlyZWN0b3J5IgorI2RlZmluZSBCQ01DTElfTUFYX1BBUk1fVkFMX0xFTiAgIDI1NgorI2RlZmluZSBCQ01DTElfRU5VTV9NQVNLX0RFTF9DSEFSICcrJworI2RlZmluZSBCQ01DTElfSEVMUF9CVUZGRVJfU0laRSAgIDE2Mzg0CisKKyNkZWZpbmUgQkNNQ0xJX0VRVUFMX0NIQVIgICAgICAgICAnPScKKworCit0eXBlZGVmIGVudW0geyBCQ01DTElfRU5UUllfRElSLCBCQ01DTElfRU5UUllfQ01EIH0gYmNtY2xpX2VudHJ5X3NlbGVjdG9yOworCisvKiBFeHRlcm5hbCB0YWJsZSAtIGJvb2xlYW4gdmFsdWVzICovCitiY21jbGlfZW51bV92YWwgYmNtY2xpX2VudW1fYm9vbF90YWJsZVtdID0geworICAgIHsgLm5hbWU9InRydWUiLCAudmFsID0gMSB9LAorICAgIHsgLm5hbWU9InllcyIsIC52YWwgPSAxIH0sCisgICAgeyAubmFtZT0ib24iLCAudmFsID0gMSB9LAorICAgIHsgLm5hbWU9ImZhbHNlIiwgLnZhbCA9IDAgfSwKKyAgICB7IC5uYW1lPSJubyIsIC52YWwgPSAwIH0sCisgICAgeyAubmFtZT0ib2ZmIiwgLnZhbCA9IDAgfSwKKyAgICBCQ01DTElfRU5VTV9MQVNUCit9OworCisvKiBNb25pdG9yIHRva2VuIHN0cnVjdHVyZSAqLworc3RydWN0IGJjbWNsaV9lbnRyeQoreworICAgIHN0cnVjdCBiY21jbGlfZW50cnkgICpuZXh0OworICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQvZGlyZWN0b3J5IG5hbWUgKi8KKyAgICBjaGFyICpoZWxwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kL2RpcmVjdG9yeSBoZWxwICovCisgICAgYmNtY2xpX2VudHJ5X3NlbGVjdG9yIHNlbDsgICAgICAgICAgICAgICAgICAgLyogRW50cnkgc2VsZWN0b3IgKi8KKyAgICBjaGFyICphbGlhczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGlhcyAqLworICAgIHVpbnQxNl90IGFsaWFzX2xlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsaWFzIGxlbmd0aCAqLworICAgIHN0cnVjdCBiY21jbGlfZW50cnkgKnBhcmVudDsgICAgICAgICAgICAgICAgIC8qIFBhcmVudCBkaXJlY3RvcnkgKi8KKyAgICBiY21jbGlfYWNjZXNzX3JpZ2h0IGFjY2Vzc19yaWdodDsKKworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBiY21jbGlfZW50cnkgKmZpcnN0OyAgICAgICAgICAvKiBGaXJzdCBlbnRyeSBpbiBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgIGJjbWNsaV9kaXJfZXh0cmFfcGFybSBleHRyYXM7ICAgICAgICAvKiBPcHRpb25hbCBleHRyYXMgKi8KKyAgICAgICAgfSBkaXI7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfY21kX2NiIGNtZF9jYjsgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBjYWxsYmFjayAqLworICAgICAgICAgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtczsgICAgICAgICAgICAgIC8qIENvbW1hbmQgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgYmNtY2xpX2NtZF9leHRyYV9wYXJtIGV4dHJhczsgICAgICAgIC8qIE9wdGlvbmFsIGV4dHJhcyAqLworICAgICAgICAgICAgdWludDE2X3QgbnVtX3Bhcm1zOworICAgICAgICB9IGNtZDsKKyAgICB9IHU7Cit9OworCisKKy8qIFRva2VuIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01DTElfVE9LRU5fRU1QVFksCisgICAgQkNNQ0xJX1RPS0VOX1VQLAorICAgIEJDTUNMSV9UT0tFTl9ST09ULAorICAgIEJDTUNMSV9UT0tFTl9CUkVBSywKKyAgICBCQ01DTElfVE9LRU5fSEVMUCwKKyAgICBCQ01DTElfVE9LRU5fTkFNRSwKKyAgICBCQ01DTElfVE9LRU5fVkFMVUUsCit9IGJjbWNsaV90b2tlbl90eXBlOworCisvKiBQYXJhbWV0ZXIgdmFsdWUgc2V0IGRlc2NyaXB0b3IgKi8KK3R5cGVkZWYgdW5pb24gYmNtY2xpX3Bhcm1fdmFsdWVfc3RhdHVzCit7CisgICAgYmNtb3NfYm9vbCAgdmFsdWVfc2V0OworICAgIGJjbW9zX2Jvb2wgKnZhbHVlc19zZXQ7Cit9IGJjbWNsaV9wYXJtX3ZhbHVlX3N0YXR1czsKKworLyogQ0xJIHNlc3Npb24gZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX3Nlc3Npb25fZGF0YQoreworICAgIGJjbWNsaV9lbnRyeSAqY3VyZGlyOworICAgIGJjbWNsaV9lbnRyeSAqY3VyY21kOworICAgIGJjbWNsaV9jbWRfcGFybSBjbWRfcGFybXNbQkNNQ0xJX01BWF9QQVJNU107CisgICAgYmNtY2xpX3Bhcm1fdmFsdWVfc3RhdHVzIHZhbHVlX3N0YXR1c1tCQ01DTElfTUFYX1BBUk1TXTsKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbjsKKyAgICB1aW50MTZfdCBudW1fcGFybXM7CisgICAgY2hhciAqcF9pbmJ1ZjsKKyAgICBpbnQgc3RvcF9tb25pdG9yOworICAgIGNoYXIgaW5idWZbQkNNQ0xJX0lOQlVGX0xFTl07Cit9IGJjbWNsaV9zZXNzaW9uX2V4dHJhczsKKworLyogTmFtZSwgdmFsdWUgcGFpcnMgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9uYW1lX3ZhbHVlCit7CisgICAgYmNtY2xpX3Rva2VuX3R5cGUgdHlwZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKnZhbHVlOworfSBiY21jbGlfbmFtZV92YWx1ZTsKKworc3RhdGljIGJjbWNsaV9lbnRyeSAgICAgICAgICAgKl9iY21jbGlfcm9vdF9kaXI7CitzdGF0aWMgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICAqX2JjbWNsaV9yb290X3Nlc3Npb247CitzdGF0aWMgYmNtY2xpX2xvZ19tb2RlICAgICAgICAgX2JjbWNsaV9sb2dfbW9kZTsKK3N0YXRpYyBiY21jbGlfc2Vzc2lvbiAgICAgICAgICpfYmNtY2xpX2xvZ19zZXNzaW9uOworCisjZGVmaW5lIEJDTUNMSV9NSU5fTkFNRV9MRU5HVEhfRk9SX0FMSUFTICAgMworI2RlZmluZSBCQ01DTElfUk9PVF9OQU1FICAgICAgICIvIgorCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2FsbG9jX3Jvb3QoY29uc3QgYmNtY2xpX3Nlc3Npb25fcGFybSAqcGFybSk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9kaXNwbGF5X2RpcihiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfZW50cnkgKnBfZGlyICk7CitzdGF0aWMgYmNtY2xpX3Rva2VuX3R5cGUgX2JjbWNsaV9nZXRfd29yZChiY21jbGlfc2Vzc2lvbl9leHRyYXMgKnNlc3Npb24sIGNoYXIgKippbmJ1ZiwgY2hhciAqKnBfd29yZCk7CitzdGF0aWMgYmNtY2xpX3Rva2VuX3R5cGUgX2JjbWNsaV9hbmFseXplX3Rva2VuKCBjb25zdCBjaGFyICpuYW1lICk7CitzdGF0aWMgaW50ICAgICAgICAgX2JjbWNsaV9wYXJzZV9wYXJtcyggYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpwX3Rva2VuLAorICAgIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlycywgaW50IG5wYWlycyk7CitzdGF0aWMgaW50IF9iY21jbGlfZXh0ZW5kX3Bhcm1zKCBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfbmFtZV92YWx1ZSAqcGFpcnMsCisgICAgaW50IG5wYWlycywgYmNtb3NfYm9vbCBsYXN0X2lzX3NwYWNlLCBjaGFyICppbnNlcnRfc3RyLCB1aW50MzJfdCBpbnNlcnRfc2l6ZSk7CitzdGF0aWMgYmNtY2xpX2VudHJ5ICpfYmNtY2xpX3NlYXJjaF90b2tlbiggYmNtY2xpX2VudHJ5ICpwX2RpciwgY29uc3QgY2hhciAqbmFtZSApOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfaGVscF9kaXIoIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF9kaXIgKTsKK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2hlbHBfZW50cnkoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpwX3Rva2VuLAorICAgIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlycywgaW50IG5wYWlycywgYmNtb3NfYm9vbCBzdXBwcmVzc19lcnJfcHJpbnQpOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfaGVscF9wb3B1bGF0ZWRfY21kKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF90b2tlbiwKKyAgICBjb25zdCBjaGFyICpwYXJ0aWFsX21hdGNoLCBiY21vc19ib29sIHN1cHByZXNzX2Fzc2lnbmVkKTsKK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2Nob29zZV9hbGlhcyggYmNtY2xpX2VudHJ5ICpwX2RpciwgYmNtY2xpX2VudHJ5ICpwX25ld190b2tlbiApOworc3RhdGljIGJjbWNsaV9jbWRfcGFybSAqX2JjbWNsaV9maW5kX25hbWVkX3Bhcm0oYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgY2hhciAgICAgICAqX2JjbWNsaV9zdHJsd3IoIGNoYXIgKnMgKTsKK3N0YXRpYyBpbnQgICAgICAgICBfYmNtY2xpX3N0cmljbXAoIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgaW50IGxlbiApOworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfZGZ0X3NjYW5fY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKnN0cmluZ192YWwpOworc3RhdGljIGNvbnN0IGNoYXIgKl9iY21jbGlfZ2V0X3R5cGVfbmFtZShjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0pOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfZGZ0X2Zvcm1hdF9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlIHZhbHVlLCBjaGFyICpidWZmZXIsIGludCBzaXplKTsKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX2VudW1fc2Nhbl9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlICp2YWx1ZSwgY29uc3QgY2hhciAqc3RyaW5nX3ZhbCk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9lbnVtX2Zvcm1hdF9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlIHZhbHVlLCBjaGFyICpidWZmZXIsIGludCBzaXplKTsKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX2VudW1fbWFza19zY2FuX2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgKnZhbHVlLCBjb25zdCBjaGFyICpzdHJpbmdfdmFsKTsKK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2VudW1fbWFza19mb3JtYXRfY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSB2YWx1ZSwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSk7CitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9idWZmZXJfc2Nhbl9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlICp2YWx1ZSwgY29uc3QgY2hhciAqc3RyaW5nX3ZhbCk7CitzdGF0aWMgY29uc3QgY2hhciAqX2JjbWNsaV9xdWFsaWZpZWRfbmFtZSggYmNtY2xpX2VudHJ5ICp0b2tlbiwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSk7CitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9zcGxpdChiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfbmFtZV92YWx1ZSAqKnBhaXJzLCBpbnQgKm5wYWlycyk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9hc3NpZ25fY2FsbGJhY2tzKGJjbWNsaV9jbWRfcGFybSAqcGFybSk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9sb2dfY21kKGNvbnN0IGNoYXIgKmNtZCk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9sb2dfcmMoYmNtb3NfZXJybm8gcmMpOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfZnJlZV9zZXNzaW9uX3ZhbHVlX3N0YXR1cyhiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uKTsKKworc3RhdGljIGlubGluZSBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKl9iY21jbGlfc2Vzc2lvbl9kYXRhKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIF9iY21jbGlfcm9vdF9zZXNzaW9uOworICAgIHJldHVybiBiY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworfQorCisvKiogQWRkIHN1YmRpcmVjdG9yeSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeQorICoKKyAqIFxwYXJhbVtpbl0gICBwYXJlbnQgICAgICAgICAgUGFyZW50IGRpcmVjdG9yeSBoYW5kbGUuIE5VTEw9cm9vdAorICogXHBhcmFtW2luXSAgIG5hbWUgICAgICAgICAgICBEaXJlY3RvcnkgbmFtZQorICogXHBhcmFtW2luXSAgIGhlbHAgICAgICAgICAgICBIZWxwIHN0cmluZworICogXHBhcmFtW2luXSAgIGFjY2Vzc19yaWdodCAgICBBY2Nlc3MgcmlnaHRzCisgKiBccGFyYW1baW5dICAgZXh0cmFzICAgICAgICAgIE9wdGlvbmFsIGRpcmVjdG9yeSBkZXNjcmlwdG9yLiBNdXN0bid0IGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgKiBccmV0dXJuICAgICAgbmV3IGRpcmVjdG9yeSBoYW5kbGUgb3IgTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworYmNtY2xpX2VudHJ5ICpiY21jbGlfZGlyX2FkZChiY21jbGlfZW50cnkgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGVscCwgYmNtY2xpX2FjY2Vzc19yaWdodCBhY2Nlc3NfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9kaXJfZXh0cmFfcGFybSAqZXh0cmFzKQoreworICAgIGJjbWNsaV9lbnRyeSAqcF9kaXI7CisgICAgYmNtY2xpX2VudHJ5ICoqcF9lOworCisgICAgYXNzZXJ0KG5hbWUpOworICAgIGFzc2VydChoZWxwKTsKKyAgICBpZiAoIW5hbWUgfHwgIWhlbHApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFfYmNtY2xpX3Jvb3RfZGlyKQorICAgIHsKKyAgICAgICAgX2JjbWNsaV9hbGxvY19yb290KE5VTEwpOworICAgICAgICBpZiAoIV9iY21jbGlfcm9vdF9kaXIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIXBhcmVudCkKKyAgICAgICAgcGFyZW50ID0gX2JjbWNsaV9yb290X2RpcjsKKworICAgIHBfZGlyPShiY21jbGlfZW50cnkgKiliY21vc19jYWxsb2MoIHNpemVvZihiY21jbGlfZW50cnkpICsgc3RybGVuKG5hbWUpICsgc3RybGVuKGhlbHApICsgMiApOworICAgIGlmICggIXBfZGlyICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBwX2Rpci0+bmFtZSA9IChjaGFyICopKHBfZGlyICsgMSk7CisgICAgc3RyY3B5KCBwX2Rpci0+bmFtZSwgbmFtZSk7CisgICAgcF9kaXItPmhlbHAgPSBwX2Rpci0+bmFtZSArIHN0cmxlbihuYW1lKSArIDE7CisgICAgc3RyY3B5KHBfZGlyLT5oZWxwLCBoZWxwKTsKKyAgICBwX2Rpci0+c2VsID0gQkNNQ0xJX0VOVFJZX0RJUjsKKyAgICBfYmNtY2xpX2Nob29zZV9hbGlhcyggcGFyZW50LCBwX2RpciApOworICAgIHBfZGlyLT5hY2Nlc3NfcmlnaHQgPSBhY2Nlc3NfcmlnaHQ7CisgICAgaWYgKGV4dHJhcykKKyAgICAgICAgcF9kaXItPnUuZGlyLmV4dHJhcyA9ICpleHRyYXM7CisKKyAgICAvKiBBZGQgbmV3IGRpcmVjdG9yeSB0byB0aGUgcGFyZW50J3MgbGlzdCAqLworICAgIHBfZGlyLT5wYXJlbnQgPSBwYXJlbnQ7CisgICAgcF9lID0gJihwYXJlbnQtPnUuZGlyLmZpcnN0KTsKKyAgICB3aGlsZSAoKnBfZSkKKyAgICAgICAgcF9lID0gJigoKnBfZSktPm5leHQpOworICAgICpwX2UgPSBwX2RpcjsKKworICAgIHJldHVybiBwX2RpcjsKK30KKworc3RhdGljIGJjbWNsaV9lbnRyeSAqIGZpbmRfZW50cnlfaW5fZGlyKCBiY21jbGlfZW50cnkgKmRpciwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYmNtY2xpX2VudHJ5X3NlbGVjdG9yIHR5cGUsIHVpbnQxNl90IHJlY3Vyc2l2ZV9zZWFyY2gpCit7CisgICAgYmNtY2xpX2VudHJ5ICpwMSwgKnA7CisKKyAgICBpZiAoICFkaXIgKQorICAgIHsKKyAgICAgICAgZGlyID0gX2JjbWNsaV9yb290X2RpcjsKKyAgICAgICAgaWYgKCFkaXIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcCA9IGRpci0+dS5kaXIuZmlyc3Q7CisgICAgd2hpbGUgKHApCisgICAgeworICAgICAgICBpZiAoICFfYmNtY2xpX3N0cmljbXAocC0+bmFtZSwgbmFtZSwgLTEpICYmIHR5cGUgPT0gcC0+c2VsICkKKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICBpZiAoIHJlY3Vyc2l2ZV9zZWFyY2ggJiYgcC0+c2VsID09IEJDTUNMSV9FTlRSWV9ESVIgKQorICAgICAgICB7CisgICAgICAgICAgICBwMSA9IGZpbmRfZW50cnlfaW5fZGlyKHAsIG5hbWUgLCB0eXBlLCAxICk7CisgICAgICAgICAgICBpZiAoIHAxICkKKyAgICAgICAgICAgICAgICByZXR1cm4gcDE7CisgICAgICAgIH0KKyAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisKKy8qIFNjYW4gZGlyZWN0b3J5IHRyZWUgYW5kIGxvb2sgZm9yIGRpcmVjdG9yeSB3aXRoIG5hbWUgc3RhcnRzIGZyb20KKyAqIHJvb3QgZGlyZWN0b3J5IHdpdGggbmFtZSByb290X25hbWUKKyAqLworYmNtY2xpX2VudHJ5ICpiY21jbGlfZGlyX2ZpbmQoYmNtY2xpX2VudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgICpuYW1lKQoreworICAgIGlmICggIXBhcmVudCApCisgICAgICAgIHBhcmVudCA9IF9iY21jbGlfcm9vdF9kaXI7CisgICAgcmV0dXJuIGZpbmRfZW50cnlfaW5fZGlyKHBhcmVudCwgbmFtZSwgQkNNQ0xJX0VOVFJZX0RJUiwgMCApOworfQorCisKKy8qIFNjYW4gZGlyZWN0b3J5IHRyZWUgYW5kIGxvb2sgZm9yIGNvbW1hbmQgbmFtZWQgIm5hbWUiLiAqLworYmNtY2xpX2VudHJ5ICpiY21jbGlfY21kX2ZpbmQoYmNtY2xpX2VudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUgKQoreworICAgIGlmICggIXBhcmVudCApCisgICAgICAgIHBhcmVudCA9IF9iY21jbGlfcm9vdF9kaXI7CisgICAgcmV0dXJuIGZpbmRfZW50cnlfaW5fZGlyKHBhcmVudCwgbmFtZSwgQkNNQ0xJX0VOVFJZX0NNRCwgMCApOworfQorCisKKy8qKiBBZGQgQ0xJIGNvbW1hbmQKKyAqCisgKiBccGFyYW1baW5dICAgZGlyICAgICAgICAgICAgIEhhbmRsZSBvZiBkaXJlY3RvcnkgdG8gYWRkIGNvbW1hbmQgdG8uIE5VTEw9cm9vdAorICogXHBhcmFtW2luXSAgIG5hbWUgICAgICAgICAgICBDb21tYW5kIG5hbWUKKyAqIFxwYXJhbVtpbl0gICBjbWRfY2IgICAgICAgICAgQ29tbWFuZCBoYW5kbGVyCisgKiBccGFyYW1baW5dICAgaGVscCAgICAgICAgICAgIEhlbHAgc3RyaW5nCisgKiBccGFyYW1baW5dICAgYWNjZXNzX3JpZ2h0ICAgIEFjY2VzcyByaWdodHMKKyAqIFxwYXJhbVtpbl0gICBleHRyYXMgICAgICAgICAgT3B0aW9uYWwgZXh0cmFzCisgKiBccGFyYW1baW5dICAgcGFybXMgICAgICAgICAgIE9wdGlvbmFsIHBhcmFtZXRlcnMgYXJyYXkuIE11c3Qgbm90IGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2shCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHBhcm1zIT1OVUxMLCB0aGUgbGFzdCBwYXJhbWV0ZXIgaW4gdGhlIGFycmF5IG11c3QgaGF2ZSBuYW1lPT1OVUxMLgorICogXHJldHVybgorICogICAgICAwICAgPU9LXG4KKyAqICAgICAgPDAgID1lcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9jbWRfYWRkKGJjbWNsaV9lbnRyeSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBiY21jbGlfY21kX2NiIGNtZF9jYiwKKyAgICBjb25zdCBjaGFyICpoZWxwLCBiY21jbGlfYWNjZXNzX3JpZ2h0IGFjY2Vzc19yaWdodCwKKyAgICBjb25zdCBiY21jbGlfY21kX2V4dHJhX3Bhcm0gKmV4dHJhcywgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10pCit7CisgICAgYmNtY2xpX2VudHJ5ICpwX3Rva2VuOworICAgIGJjbWNsaV9lbnRyeSAqKnBfZTsKKyAgICB1aW50MTZfdCAgICAgICBpOworICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybSA9IHBhcm1zOworCisgICAgYXNzZXJ0KG5hbWUpOworICAgIGFzc2VydChoZWxwKTsKKyAgICBhc3NlcnQoY21kX2NiKTsKKyAgICBpZiAoIW5hbWUgfHwgIWNtZF9jYiB8fCAhaGVscCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghX2JjbWNsaV9yb290X2RpcikKKyAgICB7CisgICAgICAgIF9iY21jbGlfYWxsb2Nfcm9vdChOVUxMKTsKKyAgICAgICAgaWYgKCFfYmNtY2xpX3Jvb3RfZGlyKQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgaWYgKCFkaXIpCisgICAgICAgIGRpciA9IF9iY21jbGlfcm9vdF9kaXI7CisKKyAgICBwX3Rva2VuPShiY21jbGlfZW50cnkgKiliY21vc19jYWxsb2MoIHNpemVvZihiY21jbGlfZW50cnkpICsgc3RybGVuKG5hbWUpICsgc3RybGVuKGhlbHApICsgMiApOworICAgIGlmICggIXBfdG9rZW4gKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKworICAgIC8qIENvcHkgbmFtZSAqLworICAgIHBfdG9rZW4tPm5hbWUgPSAoY2hhciAqKShwX3Rva2VuICsgMSk7CisgICAgc3RyY3B5KCBwX3Rva2VuLT5uYW1lLCBuYW1lICk7CisgICAgcF90b2tlbi0+aGVscCA9IHBfdG9rZW4tPm5hbWUgKyBzdHJsZW4obmFtZSkgKyAxOworICAgIHN0cmNweShwX3Rva2VuLT5oZWxwLCBoZWxwKTsKKyAgICBwX3Rva2VuLT5zZWwgPSBCQ01DTElfRU5UUllfQ01EOworICAgIHBfdG9rZW4tPnUuY21kLmNtZF9jYiA9IGNtZF9jYjsKKyAgICBwX3Rva2VuLT51LmNtZC5wYXJtcyA9IHBhcm1zOworICAgIGlmIChleHRyYXMpCisgICAgICAgIHBfdG9rZW4tPnUuY21kLmV4dHJhcyA9ICpleHRyYXM7CisgICAgcF90b2tlbi0+YWNjZXNzX3JpZ2h0ID0gYWNjZXNzX3JpZ2h0OworCisgICAgLyogQ29udmVydCBuYW1lIHRvIGxvd2VyIGNhc2UgYW5kIGNob29zZSBhbGlhcyAqLworICAgIF9iY21jbGlfY2hvb3NlX2FsaWFzKGRpciwgcF90b2tlbiApOworCisKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgZm9yIChpID0gMDsgaSA8IEJDTUNMSV9NQVhfUEFSTVMgJiYgcGFybXMgJiYgcGFybXNbaV0ubmFtZTsgaSsrKQorICAgIHsKKyAgICAgICAgcGFybSA9ICZwYXJtc1tpXTsKKyAgICAgICAgLyogVXNlci1kZWZpbmVkIHBhcmFtZXRlciBtdXN0IGhhdmUgYSBzY2FuX2NiIGNhbGxiYWNrIGZvciB0ZXh0LT52YWx1ZSBjb252ZXJzaW9uICovCisgICAgICAgIGlmICgocGFybS0+dHlwZT09QkNNQ0xJX1BBUk1fVVNFUkRFRikgJiYgIXBhcm0tPnNjYW5fY2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiTU9OOiAlcz4gc2Nhbl9jYiBjYWxsYmFjayBtdXN0IGJlIHNldCBmb3IgdXNlci1kZWZpbmVkIHBhcmFtZXRlciAlc1xuIiwgbmFtZSwgcGFybS0+bmFtZSk7CisgICAgICAgICAgICBnb3RvIGNtZF9hZGRfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcm0tPnR5cGU9PUJDTUNMSV9QQVJNX0VOVU0gfHwgcGFybS0+dHlwZT09QkNNQ0xJX1BBUk1fRU5VTV9NQVNLKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXBhcm0tPmVudW1fdGFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJNT046ICVzPiB2YWx1ZSB0YWJsZSBtdXN0IGJlIHNldCBpbiBsb3dfdmFsIGZvciBlbnVtIHBhcmFtZXRlciAlc1xuIiwgbmFtZSwgcGFybS0+bmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBjbWRfYWRkX2Vycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDaGVjayBkZWZhdWx0IHZhbHVlIGlmIGFueSAqLworICAgICAgICAgICAgaWYgKChwYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2JjbWNsaV9lbnVtX21hc2tfc2Nhbl9jYihwYXJtLCAmcGFybS0+dmFsdWUsIHBhcm0tPnZhbHVlLnN0cmluZykgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJNT046ICVzPiBkZWZhdWx0IHZhbHVlICVzIGRvZXNuJ3QgbWF0Y2ggYW55IHZhbHVlIG9mIGVudW0gcGFyYW1ldGVyICVzXG4iLCBuYW1lLCBwYXJtLT52YWx1ZS5zdHJpbmcsIHBhcm0tPm5hbWUpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGNtZF9hZGRfZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHBhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogT3B0aW9uYWwgZW51bSBwYXJhbWV0ZXJzIGFyZSBpbml0aWFsaXplZCBieSB0aGVpciAxc3QgdmFsdWUgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgKiBBbGwgb3RoZXIgcGFyYW1ldGVycyBhcmUgaW5pdGlhbGl6ZWQgdG8gMC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlcz1wYXJtLT5lbnVtX3RhYmxlOworICAgICAgICAgICAgICAgIHBhcm0tPnZhbHVlLmVudW1fdmFsID0gdmFsdWVzWzBdLnZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQWxsIHZhbHVlcyBvZiBlbnVtIG1hc2sgcGFyYW1ldGVycyBtYXN0IGJlIGNvbXBsZW1lbnRhcnkgYml0cyAqLworICAgICAgICAgICAgaWYgKHBhcm0tPnR5cGU9PUJDTUNMSV9QQVJNX0VOVU1fTUFTSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGFsbF9tYXNrID0gMDsKKyAgICAgICAgICAgICAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlczsKKyAgICAgICAgICAgICAgICBmb3IgKHZhbHVlcz1wYXJtLT5lbnVtX3RhYmxlOyB2YWx1ZXMtPm5hbWU7ICsrdmFsdWVzKQorICAgICAgICAgICAgICAgICAgICBhbGxfbWFzayB8PSB2YWx1ZXMtPnZhbDsKKworICAgICAgICAgICAgICAgIGZvciAodmFsdWVzPXBhcm0tPmVudW1fdGFibGU7IHZhbHVlcy0+bmFtZTsgKyt2YWx1ZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGFsbF9tYXNrICYgdmFsdWVzLT52YWwpICE9IHZhbHVlcy0+dmFsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19wcmludGYoIk1PTjogJXM+IGVudW1fdGFibGUgdmFsdWVzIG9mIGVudW1fbWFzayBwYXJhbWV0ZXJzIG11c3QgYmUgY29tcGxlbWVudGFyeSBiaXRzXG4iLCBuYW1lLCBwYXJtLT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY21kX2FkZF9lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhbGxfbWFzayAmPSB+dmFsdWVzLT52YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBhcm0tPnR5cGU9PUJDTUNMSV9QQVJNX0JVRkZFUikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwYXJtLT52YWx1ZS5idWZmZXIuc3RhcnQgfHwgIXBhcm0tPnZhbHVlLmJ1ZmZlci5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJNT046ICVzPiB2YWx1ZS5idWZmZXIuc3RhcnQgaXMgbm90IHNldCBmb3IgQlVGRkVSIHBhcmFtZXRlciAlc1xuIiwgbmFtZSwgcGFybS0+bmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBjbWRfYWRkX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcm0tPm1heF9hcnJheV9zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiTU9OOiAlcz4gQlVGRkVSIGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCAlc1xuIiwgbmFtZSwgcGFybS0+bmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBjbWRfYWRkX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwYXJtLT5tYXhfYXJyYXlfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwYXJtLT52YWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJNT046ICVzPiBwYXJtLT52YWx1ZXMgbXVzdCBiZSBzZXQgZm9yIHBhcmFtZXRlci1hcnJheSAlc1xuIiwgbmFtZSwgcGFybS0+bmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBjbWRfYWRkX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9iY21jbGlfYXNzaWduX2NhbGxiYWNrcyhwYXJtKTsKKyAgICB9CisgICAgaWYgKChpID09IEJDTUNMSV9NQVhfUEFSTVMpICYmIHBhcm1zW2ldLm5hbWVbMF0pCisgICAgeworICAgICAgICBiY21vc19wcmludGYoIk1PTjogJXM+IHRvbyBtYW55IHBhcmFtZXRlcnNcbiIsIG5hbWUpOworICAgICAgICBnb3RvIGNtZF9hZGRfZXJyb3I7CisgICAgfQorICAgIHBfdG9rZW4tPnUuY21kLm51bV9wYXJtcyA9IGk7CisKKyAgICAvKiBBZGQgdG9rZW4gdG8gdGhlIGRpcmVjdG9yeSAqLworICAgIHBfdG9rZW4tPnBhcmVudCA9IGRpcjsKKyAgICBwX2UgPSAmKGRpci0+dS5kaXIuZmlyc3QpOworICAgIHdoaWxlICgqcF9lKQorICAgICAgICBwX2UgPSAmKCgqcF9lKS0+bmV4dCk7CisgICAgKnBfZSA9IHBfdG9rZW47CisKKyAgICByZXR1cm4gMDsKKworY21kX2FkZF9lcnJvcjoKKyAgICBiY21vc19mcmVlKCBwX3Rva2VuICk7CisgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKK30KKworCisvKiogRGVzdHJveSB0b2tlbiAoY29tbWFuZCBvciBkaXJlY3RvcnkpCisgKiBccGFyYW1baW5dICAgdG9rZW4gICAgICAgICAgIERpcmVjdG9yeSBvciBjb21tYW5kIHRva2VuLiBOVUxMPXJvb3QKKyAqLwordm9pZCBiY21jbGlfdG9rZW5fZGVzdHJveShiY21jbGlfZW50cnkgKnRva2VuKQoreworICAgIGlmICghdG9rZW4pCisgICAgeworICAgICAgICBpZiAoIV9iY21jbGlfcm9vdF9kaXIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRva2VuID0gX2JjbWNsaV9yb290X2RpcjsKKyAgICB9CisgICAgLyogUmVtb3ZlIGZyb20gcGFyZW50J3MgbGlzdCAqLworICAgIGlmICh0b2tlbi0+cGFyZW50KQorICAgIHsKKyAgICAgICAgYmNtY2xpX2VudHJ5ICoqcF9lOworICAgICAgICBwX2UgPSAmKHRva2VuLT5wYXJlbnQtPnUuZGlyLmZpcnN0KTsKKyAgICAgICAgd2hpbGUgKCpwX2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqcF9lID09IHRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwX2UgPSB0b2tlbi0+bmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfZSA9ICYoKCpwX2UpLT5uZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlbW92ZSBhbGwgZGlyZWN0b3J5IGVudHJpZXMgKi8KKyAgICBpZiAodG9rZW4tPnNlbCA9PSBCQ01DTElfRU5UUllfRElSKQorICAgIHsKKyAgICAgICAgYmNtY2xpX2VudHJ5ICplID0gdG9rZW4tPnUuZGlyLmZpcnN0OworICAgICAgICB3aGlsZSAoKGUgPSB0b2tlbi0+dS5kaXIuZmlyc3QpKQorICAgICAgICAgICAgYmNtY2xpX3Rva2VuX2Rlc3Ryb3koZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHRva2VuLT51LmNtZC5leHRyYXMuZnJlZV9wYXJtcykKKyAgICAgICAgICAgIHRva2VuLT51LmNtZC5leHRyYXMuZnJlZV9wYXJtcyh0b2tlbi0+dS5jbWQucGFybXMpOworCisgICAgLyogUmVsZWFzZSB0aGUgdG9rZW4gKi8KKyAgICBiY21vc19mcmVlKHRva2VuKTsKKworICAgIGlmICh0b2tlbiA9PSBfYmNtY2xpX3Jvb3RfZGlyKQorICAgIHsKKyAgICAgICAgX2JjbWNsaV9yb290X2RpciA9IE5VTEw7CisgICAgICAgIGlmIChfYmNtY2xpX3Jvb3Rfc2Vzc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2UoX2JjbWNsaV9yb290X3Nlc3Npb24tPnNlc3Npb24pOworICAgICAgICAgICAgX2JjbWNsaV9yb290X3Nlc3Npb24gPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCisvKiogT3BlbiBtb25pdG9yIHNlc3Npb24KKyAqCisgKiBNb25pdG9yIHN1cHBvcnRzIG11bHRpcGxlIHNpbXVsdGFuZW91cyBzZXNzaW9ucyB3aXRoIGRpZmZlcmVudAorICogYWNjZXNzIHJpZ2h0cy4KKyAqIE5vdGUgdGhhdCB0aGVyZSBhbHJlYWR5IGlzIGEgZGVmYXVsdCBzZXNzaW9uIHdpdGggZnVsbCBhZG1pbmlzdHJhdGl2ZSByaWdodHMsCisgKiB0aGF0IHRha2VzIGlucHV0IGZyb20gc3RkaW4gYW5kIG91dHB1dHMgdG8gc3Rkb3V0LgorICogXHBhcmFtW2luXSAgIHBhcm0gICAgICAgIFNlc3Npb24gcGFyYW1ldGVycy4gTXVzdCBub3QgYmUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4KKyAqIFxwYXJhbVtvdXRdICBwX3Nlc3Npb24gICBTZXNzaW9uIGhhbmRsZQorICogXHJldHVybgorICogICAgICAwICAgPU9LXG4KKyAqICAgICAgPDAgID1lcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9zZXNzaW9uX29wZW4oY29uc3QgYmNtY2xpX3Nlc3Npb25fcGFybSAqcGFybSwgYmNtY2xpX3Nlc3Npb24gKipwX3Nlc3Npb24pCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbjsKKyAgICBiY21jbGlfc2Vzc2lvbl9wYXJtIHNlc3Npb25fcGFybXM7CisgICAgaW50IHJjOworCisgICAgYXNzZXJ0KHBfc2Vzc2lvbik7CisgICAgaWYgKCFwX3Nlc3Npb24pCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoIV9iY21jbGlfcm9vdF9kaXIpCisgICAgeworICAgICAgICBfYmNtY2xpX2FsbG9jX3Jvb3QocGFybSk7CisgICAgICAgIGlmICghX2JjbWNsaV9yb290X2RpcikKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBpZiAocGFybSkKKyAgICAgICAgc2Vzc2lvbl9wYXJtcyA9ICpwYXJtOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1lbXNldCgmc2Vzc2lvbl9wYXJtcywgMCwgc2l6ZW9mKHNlc3Npb25fcGFybXMpKTsKKyAgICAgICAgc2Vzc2lvbl9wYXJtcy5uYW1lID0gInVubmFtZWQiOworICAgIH0KKworICAgIC8qIE9wZW4gY29tbSBzZXNzaW9uICovCisgICAgc2Vzc2lvbl9wYXJtcy5leHRyYV9zaXplID0gc2l6ZW9mKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyk7CisgICAgcmMgPSBiY21jbGlfc2Vzc2lvbl9vcGVuX3VzZXIoJnNlc3Npb25fcGFybXMsICZzZXNzaW9uKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybiByYzsKKyAgICBtb25fc2Vzc2lvbiA9IF9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIG1vbl9zZXNzaW9uLT5jdXJkaXIgPSBfYmNtY2xpX3Jvb3RfZGlyOworICAgIG1vbl9zZXNzaW9uLT5zZXNzaW9uID0gc2Vzc2lvbjsKKworICAgICpwX3Nlc3Npb24gPSBzZXNzaW9uOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQkNNQ0xJX1BBUlNFX1JFVFVSTihyZXQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgcmMgPSByZXQ7ICAgXAorICAgICAgICBnb3RvIGJjbWNsaV9wYXJzZV9vdXQ7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBQYXJzZSBhIHNpbmdsZSBjb21tYW5kLiBTdG9wIG9uICc7JyBvciBFT0wgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21jbGlfcGFyc2VfY29tbWFuZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIGJjbWNsaV9lbnRyeSAgKnBfdG9rZW47CisgICAgYmNtY2xpX25hbWVfdmFsdWUgKnBhaXJzID0gTlVMTDsKKyAgICBpbnQgc3RvcF9wYXJzaW5nID0gMDsKKyAgICBpbnQgbnBhaXJzOworICAgIGludCBpOworICAgIGNoYXIgKmNtZF9saW5lOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIHNlc3Npb24gPSBtb25fc2Vzc2lvbi0+c2Vzc2lvbjsKKworICAgIC8qIE1ha2UgYSBjb3B5IG9mIGNvbW1hbmQgbGluZSAtIGZvciBsb2dnaW5nICovCisgICAgY21kX2xpbmUgPSBiY21vc19hbGxvYyhzdHJsZW4obW9uX3Nlc3Npb24tPnBfaW5idWYpICsgMSk7CisgICAgaWYgKCFjbWRfbGluZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgc3RyY3B5KGNtZF9saW5lLCBtb25fc2Vzc2lvbi0+cF9pbmJ1Zik7CisKKyAgICAvKiBTcGxpdCBzdHJpbmcgdG8gbmFtZS92YWx1ZSBwYWlycyAqLworICAgIHJjID0gX2JjbWNsaV9zcGxpdChtb25fc2Vzc2lvbiwgJnBhaXJzLCAmbnBhaXJzKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9OT0VOVCkKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PSzsKKyAgICAgICAgQkNNQ0xJX1BBUlNFX1JFVFVSTihyYyk7CisgICAgfQorCisgICAgLyogSW50ZXJwcmV0IGVtcHR5IHN0cmluZyBhcyAiZGlzcGxheSBkaXJlY3RvcnkiICovCisgICAgaWYgKCAhbnBhaXJzICkKKyAgICB7CisgICAgICAgIF9iY21jbGlfZGlzcGxheV9kaXIobW9uX3Nlc3Npb24sIG1vbl9zZXNzaW9uLT5jdXJkaXIgKTsKKyAgICAgICAgQkNNQ0xJX1BBUlNFX1JFVFVSTihCQ01fRVJSX09LKTsKKyAgICB9CisKKyAgICAvKiBJZGVudGlmeSBwYXJhbWV0ZXJzICovCisgICAgZm9yIChpPTA7IGk8bnBhaXJzICYmICFyYyAmJiAhc3RvcF9wYXJzaW5nOyBpKyspCisgICAgeworICAgICAgICBzd2l0Y2ggKHBhaXJzW2ldLnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01DTElfVE9LRU5fTkFNRToKKyAgICAgICAgY2FzZSBCQ01DTElfVE9LRU5fVkFMVUU6CisgICAgICAgICAgICAvKiBJZGVudGlmeSBjb21tYW5kLiBUaGUgMXN0IHBhaXIgY2FuJ3QgY29udGFpbiBuYW1lLCBvbmx5IHZhbHVlICovCisgICAgICAgICAgICBpZiAocGFpcnNbaV0ubmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiKipFUlI6ICVzIGlzIHVuZXhwZWN0ZWRcbiIsIHBhaXJzW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJTRV9SRVRVUk4oQkNNX0VSUl9QQVJNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfdG9rZW4gPSBfYmNtY2xpX3NlYXJjaF90b2tlbihtb25fc2Vzc2lvbi0+Y3VyZGlyLCBwYWlyc1tpXS52YWx1ZSk7CisgICAgICAgICAgICBpZiAocF90b2tlbiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIqKkVSUjogJXMgaXMgdW5leHBlY3RlZFxuIiwgcGFpcnNbaV0udmFsdWUpOworICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJTRV9SRVRVUk4oQkNNX0VSUl9QQVJNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIERpcmVjdG9yeSBvciBjb21tYW5kID8gKi8KKyAgICAgICAgICAgIGlmIChwX3Rva2VuLT5zZWwgPT0gQkNNQ0xJX0VOVFJZX0RJUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyZGlyID0gcF90b2tlbjsKKyAgICAgICAgICAgICAgICBfYmNtY2xpX2Rpc3BsYXlfZGlyKG1vbl9zZXNzaW9uLCBtb25fc2Vzc2lvbi0+Y3VyZGlyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gdG9rZW4gKi8KKyAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyY21kID0gcF90b2tlbjsKKyAgICAgICAgICAgICAgICBpZiAoX2JjbWNsaV9wYXJzZV9wYXJtcyhtb25fc2Vzc2lvbiwgcF90b2tlbiwgJnBhaXJzW2krMV0sIG5wYWlycy1pLTEpIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9iY21jbGlfaGVscF9lbnRyeShtb25fc2Vzc2lvbiwgcF90b2tlbiwgJnBhaXJzW2krMV0sIG5wYWlycy1pLTEsIEJDTU9TX1RSVUUpOworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2JjbWNsaV9sb2dfY21kKGNtZF9saW5lKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBwX3Rva2VuLT51LmNtZC5jbWRfY2Ioc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmNtZF9wYXJtcywgbnBhaXJzLWktMSApOworICAgICAgICAgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyW0JDTUNMSV9NQVhfUVVBTF9OQU1FX0xFTkdUSF07CisgICAgICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiTU9OOiAlcz4gZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlcyglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JjbWNsaV9xdWFsaWZpZWRfbmFtZShwX3Rva2VuLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX2JjbWNsaV9sb2dfcmMocmMpOworICAgICAgICAgICAgICAgICAgICBfYmNtY2xpX2ZyZWVfc2Vzc2lvbl92YWx1ZV9zdGF0dXMobW9uX3Nlc3Npb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9wX3BhcnNpbmcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01DTElfVE9LRU5fVVA6IC8qIEdvIHRvIHVwcGVyIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgaWYgKG1vbl9zZXNzaW9uLT5jdXJkaXItPnBhcmVudCkKKyAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyZGlyID0gbW9uX3Nlc3Npb24tPmN1cmRpci0+cGFyZW50OworICAgICAgICAgICAgX2JjbWNsaV9kaXNwbGF5X2Rpcihtb25fc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmN1cmRpciApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01DTElfVE9LRU5fUk9PVDogLyogR28gdG8gdGhlIHJvb3QgZGlyZWN0b3J5ICovCisgICAgICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyZGlyID0gX2JjbWNsaV9yb290X2RpcjsKKyAgICAgICAgICAgIF9iY21jbGlfZGlzcGxheV9kaXIobW9uX3Nlc3Npb24sIG1vbl9zZXNzaW9uLT5jdXJkaXIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX0hFTFA6IC8qIERpc3BsYXkgaGVscCAqLworICAgICAgICAgICAgaWYgKGkgPCBucGFpcnMtMSAmJgorICAgICAgICAgICAgICAgICgocF90b2tlbiA9IF9iY21jbGlfc2VhcmNoX3Rva2VuKCBtb25fc2Vzc2lvbi0+Y3VyZGlyLCBwYWlyc1tpKzFdLnZhbHVlKSkgIT0gTlVMTCApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9iY21jbGlfaGVscF9lbnRyeShtb25fc2Vzc2lvbiwgcF90b2tlbiwgJnBhaXJzW2krMl0sIG5wYWlycy1pLTIsIEJDTU9TX0ZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYmNtY2xpX2hlbHBfZGlyKG1vbl9zZXNzaW9uLCBtb25fc2Vzc2lvbi0+Y3VyZGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0b3BfcGFyc2luZyA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RvcF9wYXJzaW5nID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCitiY21jbGlfcGFyc2Vfb3V0OgorICAgIGlmIChwYWlycykKKyAgICAgICAgYmNtb3NfZnJlZShwYWlycyk7CisgICAgaWYgKGNtZF9saW5lKQorICAgICAgICBiY21vc19mcmVlKGNtZF9saW5lKTsKKyAgICByZXR1cm4gcmM7CisKK30KKworLyoqIENvbnRleHQgZXh0ZW5zaW9uICovCitiY21vc19lcnJubyBiY21jbGlfZXh0ZW5kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjaGFyICppbnB1dF9zdHIsIGNoYXIgKmluc2VydF9zdHIsIHVpbnQzMl90IGluc2VydF9zaXplKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgYmNtY2xpX2VudHJ5ICAqcF90b2tlbjsKKyAgICBiY21jbGlfbmFtZV92YWx1ZSAqcGFpcnM7CisgICAgYmNtb3NfYm9vbCBsYXN0X2lzX3NwYWNlOworICAgIGludCBucGFpcnM7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgaWYgKCFtb25fc2Vzc2lvbiB8fCAhbW9uX3Nlc3Npb24tPmN1cmRpciB8fCAhaW5wdXRfc3RyKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgaW5zZXJ0X3N0clswXSA9IDA7CisgICAgbW9uX3Nlc3Npb24tPnBfaW5idWYgPSBpbnB1dF9zdHI7CisKKyAgICBsYXN0X2lzX3NwYWNlID0gc3RybGVuKGlucHV0X3N0cikgJiYgKGlucHV0X3N0cltzdHJsZW4oaW5wdXRfc3RyKSAtIDFdID09ICcgJyk7CisKKyAgICAvKiBTcGxpdCBzdHJpbmcgdG8gbmFtZS92YWx1ZSBwYWlycyAqLworICAgIHJjID0gX2JjbWNsaV9zcGxpdChtb25fc2Vzc2lvbiwgJnBhaXJzLCAmbnBhaXJzKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybiByYzsKKworICAgIC8qIGVtcHR5IGxpc3QgLSBkaXNwbGF5IGxpc3Qgb2YgY29tbWFuZHMgKi8KKyAgICBpZiAoICFucGFpcnMgKQorICAgIHsKKyAgICAgICAgX2JjbWNsaV9kaXNwbGF5X2Rpcihtb25fc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmN1cmRpciApOworICAgICAgICBCQ01DTElfUEFSU0VfUkVUVVJOKDApOworICAgIH0KKworICAgIC8qIElkZW50aWZ5IHBhcmFtZXRlcnMgKi8KKyAgICBzd2l0Y2ggKHBhaXJzWzBdLnR5cGUpCisgICAgeworICAgIGNhc2UgQkNNQ0xJX1RPS0VOX05BTUU6CisgICAgY2FzZSBCQ01DTElfVE9LRU5fVkFMVUU6CisgICAgICAgIC8qIElkZW50aWZ5IGNvbW1hbmQuIFRoZSAxc3QgcGFpciBjYW4ndCBjb250YWluIG5hbWUsIG9ubHkgdmFsdWUgKi8KKyAgICAgICAgaWYgKHBhaXJzWzBdLm5hbWUgfHwKKyAgICAgICAgICAgICEocF90b2tlbiA9IF9iY21jbGlfc2VhcmNoX3Rva2VuKG1vbl9zZXNzaW9uLT5jdXJkaXIsIHBhaXJzWzBdLnZhbHVlKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9iY21jbGlfZGlzcGxheV9kaXIobW9uX3Nlc3Npb24sIG1vbl9zZXNzaW9uLT5jdXJkaXIgKTsKKyAgICAgICAgICAgIEJDTUNMSV9QQVJTRV9SRVRVUk4oQkNNX0VSUl9QQVJNKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERpcmVjdG9yeSBvciBjb21tYW5kID8gKi8KKyAgICAgICAgaWYgKHBfdG9rZW4tPnNlbCAhPSBCQ01DTElfRU5UUllfQ01EKQorICAgICAgICAgICAgQkNNQ0xJX1BBUlNFX1JFVFVSTihCQ01fRVJSX09LKTsKKworICAgICAgICAvKiBGdW5jdGlvbiB0b2tlbiAqLworICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyY21kID0gcF90b2tlbjsKKyAgICAgICAgcmMgPSBfYmNtY2xpX2V4dGVuZF9wYXJtcyhtb25fc2Vzc2lvbiwgJnBhaXJzWzFdLCBucGFpcnMtMSwgbGFzdF9pc19zcGFjZSwgaW5zZXJ0X3N0ciwgaW5zZXJ0X3NpemUpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworYmNtY2xpX3BhcnNlX291dDoKKyAgICBiY21vc19mcmVlKHBhaXJzKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKiBQYXJzZSBhbmQgZXhlY3V0ZSBpbnB1dCBzdHJpbmcuCisgKiBpbnB1dF9zdHJpbmcgY2FuIGNvbnRhaW4gbXVsdGlwbGUgY29tbWFuZHMgZGVsaW1pdGVkIGJ5ICc7JworICoKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBpbnB1dF9zdHJpbmcgICAgU3RyaW5nIHRvIGJlIHBhcnNlZC4gTWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgJzsnLWRlbGltaXRlZCBjb21tYW5kcworICogXHJldHVybgorICogICAgICA9MCAgLSBPSyBcbgorICogICAgICBCQ01fRVJSX1BBUk0gLSBwYXJzaW5nIGVycm9yXG4KKyAqICAgICAgb3RoZXIgLSByZXR1cm4gY29kZSAtIGFzIHJldHVybmVkIGZyb20gY29tbWFuZCBoYW5kbGVyLgorICogICAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0byByZXR1cm4gLUVJTlRSIHRvIGludGVycnVwdCBtb25pdG9yIGxvb3AuCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9wYXJzZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciogaW5wdXRfc3RyaW5nKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgdWludDMyX3QgaW5wdXRfbGVuOworICAgIGludCByYyA9IDA7CisKKyAgICBpZiAoIW1vbl9zZXNzaW9uIHx8ICFtb25fc2Vzc2lvbi0+Y3VyZGlyIHx8ICFpbnB1dF9zdHJpbmcpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgaW5wdXRfbGVuID0gc3RybGVuKGlucHV0X3N0cmluZyk7CisgICAgaWYgKCFpbnB1dF9sZW4pCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogY3V0IENSLCBMRiBpZiBhbnkgKi8KKyAgICB3aGlsZSAoaW5wdXRfbGVuICYmIChpbnB1dF9zdHJpbmdbaW5wdXRfbGVuLTFdPT0nXG4nIHx8IGlucHV0X3N0cmluZ1tpbnB1dF9sZW4tMV09PSdccicpKQorICAgICAgICBpbnB1dF9zdHJpbmdbLS1pbnB1dF9sZW5dPTA7CisKKyAgICBtb25fc2Vzc2lvbi0+cF9pbmJ1ZiA9IGlucHV0X3N0cmluZzsKKyAgICBtb25fc2Vzc2lvbi0+c3RvcF9tb25pdG9yID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgcmMgPSBiY21jbGlfcGFyc2VfY29tbWFuZChzZXNzaW9uKTsKKyAgICB9IHdoaWxlIChtb25fc2Vzc2lvbi0+cF9pbmJ1ZiAmJiBtb25fc2Vzc2lvbi0+cF9pbmJ1ZlswXSAmJiAhbW9uX3Nlc3Npb24tPnN0b3BfbW9uaXRvciAmJiAhcmMpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKiogUmVhZCBpbnB1dCBhbmQgcGFyc2UgaXRlcmF0aXZlbHkgdW50aWwgRU9GIG9yIGJjbWNsaV9pc19zdG9wcGVkKCkKKyAqCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccmV0dXJuCisgKiAgICAgID0wICAtIE9LIFxuCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9kcml2ZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKworICAgIHNlc3Npb24gPSBtb25fc2Vzc2lvbi0+c2Vzc2lvbjsKKyAgICBtb25fc2Vzc2lvbi0+c3RvcF9tb25pdG9yID0gMDsKKyAgICB3aGlsZSAoIWJjbWNsaV9pc19zdG9wcGVkKHNlc3Npb24pICYmCisgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fZ2V0cyhzZXNzaW9uLCBtb25fc2Vzc2lvbi0+aW5idWYsIHNpemVvZihtb25fc2Vzc2lvbi0+aW5idWYpLTEpKQorICAgIHsKKyAgICAgICAgLyogU2Vzc2lvbiBjb3VsZCd2ZSBiZWVuIHN0b3BwZWQgd2hpbGUgaW4gImdldHMiLiBDaGVjayBhZ2FpbiBhbmQgcHJvY2VlZCBpZiBhY3RpdmUgKi8KKyAgICAgICAgaWYgKCFiY21jbGlfaXNfc3RvcHBlZChzZXNzaW9uKSkKKyAgICAgICAgICAgIGJjbWNsaV9wYXJzZShzZXNzaW9uLCBtb25fc2Vzc2lvbi0+aW5idWYpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qIFN0b3AgbW9uaXRvciBkcml2ZXIgKi8KK3ZvaWQgYmNtY2xpX3N0b3AoIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uICkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIGFzc2VydChtb25fc2Vzc2lvbik7CisgICAgbW9uX3Nlc3Npb24tPnN0b3BfbW9uaXRvciA9IDE7Cit9CisKKy8qKiBSZXR1cm5zIDEgaWYgbW9uaXRvciBzZXNzaW9uIGlzIHN0b3BwZWQKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxyZXR1cm5zIDEgaWYgbW9uaXRvciBzZXNzaW9uIHN0b3BwZWQgYnkgYmNtY2xpX3N0b3AoKVxuCisgKiAwIG90aGVyd2lzZQorICovCitiY21vc19ib29sIGJjbWNsaV9pc19zdG9wcGVkKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgcmV0dXJuIG1vbl9zZXNzaW9uLT5zdG9wX21vbml0b3I7Cit9CisKKworLyoqIEdldCBwYXJhbWV0ZXIgbnVtYmVyIGdpdmVuIGl0cyBuYW1lLgorICogVGhlIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB1c2UgYnkgY29tbWFuZCBoYW5kbGVycworICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbixvdXRdICAgcGFybV9uYW1lICAgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccmV0dXJuCisgKiAgPj0wIC0gcGFyYW1ldGVyIG51bWJlclxuCisgKiAgPDAgIC0gcGFyYW1ldGVyIHdpdGggdGhpcyBuYW1lIGRvZXNuJ3QgZXhpc3QKKyAqLworaW50IGJjbWNsaV9wYXJtX251bWJlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqcGFybV9uYW1lKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgaW50IGk7CisgICAgaWYgKCFwYXJtX25hbWUgfHwgIW1vbl9zZXNzaW9uIHx8ICFtb25fc2Vzc2lvbi0+Y3VyY21kKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGZvcihpPTA7CisgICAgICAgIG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0ubmFtZSAmJgorICAgICAgICAgICAgX2JjbWNsaV9zdHJpY21wKCBwYXJtX25hbWUsIG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0ubmFtZSwgLTEpOworICAgICAgICBpKyspCisgICAgICAgIDsKKyAgICBpZiAoIW1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0ubmFtZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICByZXR1cm4gaTsKK30KKworCisvKiogR2V0IHBhcmFtZXRlciBieSBuYW1lCisgKiBUaGUgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBjb21tYW5kIGhhbmRsZXJzCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtX25hbWUgICAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxyZXR1cm4KKyAqIHBhcmFtZXRlciBwb2ludGVyIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK2JjbWNsaV9jbWRfcGFybSAqYmNtY2xpX3Bhcm1fZ2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwYXJtX25hbWUpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKyAgICBpbnQgbnBhcm0gPSBiY21jbGlfcGFybV9udW1iZXIoc2Vzc2lvbiwgcGFybV9uYW1lKTsKKyAgICBpZiAobnBhcm0gPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAmbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1tucGFybV07Cit9CisKKworLyoqIENoZWNrIGlmIHBhcmFtZXRlciBpcyBzZXQKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIHBhcm1fbnVtYmVyICAgICBQYXJhbWV0ZXIgbnVtYmVyCisgKiBccmV0dXJuCisgKiAgMSBpZiBwYXJhbWV0ZXIgaXMgc2V0XG4KKyAqICAwIGlmIHBhcmFtZXRlciBpcyBub3Qgc2V0IG9yIHBhcm1fbnVtYmVyIGlzIGludmFsaWQKKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX3Bhcm1fY2hlY2soYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGludCBwYXJtX251bWJlcikKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworCisgICAgaWYgKHBhcm1fbnVtYmVyIDwgMCB8fCAhbW9uX3Nlc3Npb24gfHwgIW1vbl9zZXNzaW9uLT5jdXJjbWQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgaWYgKHBhcm1fbnVtYmVyID49IG1vbl9zZXNzaW9uLT5udW1fcGFybXMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgaWYgKCEobW9uX3Nlc3Npb24tPmNtZF9wYXJtc1twYXJtX251bWJlcl0uZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyoqIEdldCBlbnVtJ3Mgc3RyaW5nIHZhbHVlIGdpdmVuIGl0cyBpbnRlcm5hbCB2YWx1ZQorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICAgICAgcGFybV9udW1iZXIgICAgIFBhcmFtZXRlciBudW1iZXIKKyAqIFxwYXJhbVtpbl0gICAgICAgdmFsdWUgICAgICAgICAgIEludGVybmFsIHZhbHVlCisgKiBccmV0dXJuCisgKiAgICAgIGVudW0gc3RyaW5nIHZhbHVlIG9yIE5VTEwgaWYgcGFyYW1ldGVyIGlzIG5vdCBlbnVtIG9yCisgKiAgICAgIGludGVybmFsIHZhbHVlIGlzIGludmFsaWQKKyAqLworY29uc3QgY2hhciAqYmNtY2xpX2VudW1fcGFybV9zdHJpbmd2YWwoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGludCBwYXJtX251bWJlciwgbG9uZyB2YWx1ZSkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIGludCBpOworICAgIGJjbWNsaV9lbnVtX3ZhbCAqdmFsdWVzOworICAgIGlmIChwYXJtX251bWJlciA8IDAgfHwgIW1vbl9zZXNzaW9uIHx8ICFtb25fc2Vzc2lvbi0+Y3VyY21kKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IoaT0wOyBpPHBhcm1fbnVtYmVyICYmIG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0ubmFtZTsgaSsrKQorICAgICAgICA7CisgICAgaWYgKGkgPCBwYXJtX251bWJlcikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbcGFybV9udW1iZXJdLnR5cGUgIT0gQkNNQ0xJX1BBUk1fRU5VTSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdmFsdWVzID0gbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1twYXJtX251bWJlcl0uZW51bV90YWJsZTsKKyAgICByZXR1cm4gYmNtY2xpX2VudW1fc3RyaW5ndmFsKHZhbHVlcywgdmFsdWUpOworfQorCisKKy8qIEdldCBjdXJyZW50IGRpcmVjdG9yeSBoYW5kbGUgKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpX2Rpcl9nZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKyAgICBpZiAoIW1vbl9zZXNzaW9uKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbW9uX3Nlc3Npb24tPmN1cmRpcjsKK30KKworLyogU2V0IGN1cnJlbnQgZGlyZWN0b3J5ICovCitiY21vc19lcnJubyBiY21jbGlfZGlyX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpkaXIpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKyAgICBhc3NlcnQobW9uX3Nlc3Npb24pOworICAgIGlmICghbW9uX3Nlc3Npb24pCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgLyogQ2hlY2sgYWNjZXNzIHJpZ2h0cyAqLworICAgIGlmICghZGlyKQorICAgICAgICBkaXIgPSBfYmNtY2xpX3Jvb3RfZGlyOworICAgIGlmIChkaXItPmFjY2Vzc19yaWdodCA+IGJjbWNsaV9zZXNzaW9uX2FjY2Vzc19yaWdodChtb25fc2Vzc2lvbi0+c2Vzc2lvbikpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BFUk07CisgICAgbW9uX3Nlc3Npb24tPmN1cmRpciA9IGRpcjsKKyAgICByZXR1cm4gMDsKK30KKworLyoqIEdldCB0b2tlbiBuYW1lCisgKiBccGFyYW1baW5dICAgdG9rZW4gICAgICAgICAgIERpcmVjdG9yeSBvciBjb21tYW5kIHRva2VuCisgKiBccmV0dXJuICAgICAgZGlyZWN0b3J5IHRva2VuIG5hbWUKKyAqLworY29uc3QgY2hhciAqYmNtY2xpX3Rva2VuX25hbWUoYmNtY2xpX2VudHJ5ICp0b2tlbikKK3sKKyAgICBpZiAoIXRva2VuKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gdG9rZW4tPm5hbWU7Cit9CisKK2JjbWNsaV9jbWRfcGFybSAqYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKiBjbWRfcGFybTsKKworICAgIGlmICggIXNlc3Npb24gfHwgIW5hbWUgfHwgKm5hbWU9PSdcMCcpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY21kX3Bhcm0gPSBfYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShfYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKSwgbmFtZSk7CisgICAgaWYoY21kX3Bhcm0gJiYgKGNtZF9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNtZF9wYXJtOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvKiBSZXR1cm4gVFJVRSBpZiBwYXJhbWV0ZXIgdmFsdWUgaXMgc2V0ICovCitiY21vc19ib29sIGJjbWNsaV9wYXJtX3ZhbHVlX2lzX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCB1aW50MzJfdCB2YWx1ZV9pbmRleCkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIHVpbnQzMl90IHBhcm1faW5kZXggPSBwYXJtIC0gbW9uX3Nlc3Npb24tPmNtZF9wYXJtczsKKworICAgIGlmICghbW9uX3Nlc3Npb24pCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoTlVMTCwgIk1PTj4gU2Vzc2lvbiAlcCBpcyBpbnZhbGlkXG4iLCBzZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHBhcm1faW5kZXggPSBwYXJtIC0gbW9uX3Nlc3Npb24tPmNtZF9wYXJtczsKKyAgICBpZiAocGFybV9pbmRleCA+PSBCQ01DTElfTUFYX1BBUk1TKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJNT04+IFBhcmFtZXRlciAlcCBpcyBpbnZhbGlkXG4iLCBwYXJtKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghcGFybS0+YXJyYXlfc2l6ZSkKKyAgICAgICAgcmV0dXJuIG1vbl9zZXNzaW9uLT52YWx1ZV9zdGF0dXNbcGFybV9pbmRleF0udmFsdWVfc2V0OworCisgICAgaWYgKHZhbHVlX2luZGV4ID49IHBhcm0tPmFycmF5X3NpemUpCisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKworICAgIHJldHVybiBtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW3Bhcm1faW5kZXhdLnZhbHVlc19zZXRbdmFsdWVfaW5kZXhdOworfQorCitiY21jbGlfY21kX3Bhcm0gKmJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbWRfcGFybTsKKworICAgIGlmIChzZXNzaW9uID09IE5VTEwgfHwgcHJlZml4ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjbWRfcGFybSA9IF9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pLT5jbWRfcGFybXM7CisgICAgd2hpbGUgKGNtZF9wYXJtLT5uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoKF9iY21jbGlfc3RyaWNtcChwcmVmaXgsIGNtZF9wYXJtLT5uYW1lLCBzdHJsZW4ocHJlZml4KSkgPT0gMCkgJiYKKyAgICAgICAgICAgICgoY21kX3Bhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjbWRfcGFybTsKKyAgICAgICAgfQorICAgICAgICArK2NtZF9wYXJtOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvKiogUHJpbnQgQ0xJIHBhcmFtZXRlcgorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICAgICAgcGFybSAgICAgICAgICAgIFBhcmFtZXRlcgorICovCit2b2lkIGJjbWNsaV9wYXJtX3ByaW50KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0pCit7CisgICAgY2hhciBidWZbQkNNQ0xJX01BWF9QQVJNX1ZBTF9MRU5dID0gIiI7CisgICAgaWYgKHBhcm0tPnR5cGUgIT0gQkNNQ0xJX1BBUk1fQlVGRkVSKQorICAgIHsKKyAgICAgICAgcGFybS0+Zm9ybWF0X2NiKHBhcm0sIHBhcm0tPnZhbHVlLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlc1xuIiwgYnVmKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHBhcm0tPnZhbHVlLmJ1ZmZlci5sZW4gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICItXG4iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiXG4iKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX2hleGR1bXAoc2Vzc2lvbiwgcGFybS0+dmFsdWUuYnVmZmVyLnN0YXJ0LCAwLAorICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfZ2V0X3VzZWQoJnBhcm0tPnZhbHVlLmJ1ZmZlciksIE5VTEwpOworICAgICAgICB9CisgICAgfQorfQorCisvKiogRW5hYmxlIC8gZGlzYWJsZSBDTEkgY29tbWFuZCBsb2dnaW5nCisgKiBccGFyYW1baW5dICAgbW9kZSAgICBMb2dnaW5nIGZsYWdzCisgKiBccGFyYW1baW5dICAgbG9nICAgICBMb2cgc2Vzc2lvbi4gTXVzdCBiZSBzZXQgaWYgbW9kZSAhPSBCQ01DTElfQ01EX0xPR19OT05FCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX2xvZ19zZXQoYmNtY2xpX2xvZ19tb2RlIG1vZGUsIGJjbWNsaV9zZXNzaW9uICpsb2cpCit7CisgICAgaWYgKG1vZGUgIT0gQkNNQ0xJX0xPR19OT05FICYmIGxvZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJsb2cgc2Vzc2lvbiBtdXN0IGJlIHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGlmIChtb2RlID09IEJDTUNMSV9MT0dfTk9ORSkKKyAgICB7CisgICAgICAgIF9iY21jbGlfbG9nX3Nlc3Npb24gPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfYmNtY2xpX2xvZ19zZXNzaW9uID0gbG9nOworICAgIH0KKyAgICBfYmNtY2xpX2xvZ19tb2RlID0gbW9kZTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFdyaXRlIHN0cmluZyB0byBDTEkgbG9nLgorICogVGhlIGZ1bmN0aW9uIGlzIGlnbm9yZWQgaWYgQ0xJIGxvZ2dpbmcgaXMgbm90IGVuYWJsZWQgdXNpbmcgYmNtY2xpX2xvZ19zZXQoKQorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgcHJpbnRmLWxpa2UgZm9ybWF0IGZvbGxvd2VkIGJ5IGFyZ3VtZW50cworICovCit2b2lkIGJjbWNsaV9sb2coY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICBpZiAoIV9iY21jbGlfbG9nX3Nlc3Npb24pCisgICAgICAgIHJldHVybjsKKyAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgICBiY21jbGlfc2Vzc2lvbl92cHJpbnQoX2JjbWNsaV9sb2dfc2Vzc2lvbiwgZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVybmFsIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBfYmNtY2xpX2xvZ19jbWQoY29uc3QgY2hhciAqY21kKQoreworICAgIHN3aXRjaCAoX2JjbWNsaV9sb2dfbW9kZSkKKyAgICB7CisgICAgY2FzZSBCQ01DTElfTE9HX0NMSToKKyAgICAgICAgYmNtY2xpX2xvZygiJXNcbiIsIGNtZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNQ0xJX0xPR19DX0NPTU1FTlQ6CisgICAgICAgIGJjbWNsaV9sb2coIi8qICVzICovXG4iLCBjbWQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9iY21jbGlfbG9nX3JjKGJjbW9zX2Vycm5vIHJjKQoreworICAgIHN3aXRjaCAoX2JjbWNsaV9sb2dfbW9kZSkKKyAgICB7CisgICAgY2FzZSBCQ01DTElfTE9HX0NMSToKKyAgICAgICAgYmNtY2xpX2xvZygiIyBDTEkgY29tbWFuZCBjb21wbGV0ZWQ6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTUNMSV9MT0dfQ19DT01NRU5UOgorICAgICAgICBiY21jbGlfbG9nKCIvKiBDTEkgY29tbWFuZCBjb21wbGV0ZWQ6ICVzICglZCkgKi9cbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKK30KKworc3RhdGljIGJjbWNsaV9zZXNzaW9uICpfYmNtY2xpX2hlbHBfc2Vzc2lvbl9vcGVuKGJjbWNsaV9zZXNzaW9uICptYWluX3Nlc3Npb24pCit7CisgICAgYmNtb2x0X3N0cmluZyAqaGVscF9zY3JhdGNoOworICAgIGJjbWNsaV9zZXNzaW9uICpoZWxwX3Nlc3Npb247CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgYmNtb2x0X3N0cmluZ19jcmVhdGUoJmhlbHBfc2NyYXRjaCwgQkNNQ0xJX0hFTFBfQlVGRkVSX1NJWkUpOworICAgIGVyciA9IGJjbWNsaV9zZXNzaW9uX29wZW5fc3RyaW5nKCZoZWxwX3Nlc3Npb24sIGhlbHBfc2NyYXRjaCk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1haW5fc2Vzc2lvbiwgIkNMSTogY2FuJ3QgY3JlYXRlIGhlbHAgc2Vzc2lvbi4gRXJyb3IgJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gaGVscF9zZXNzaW9uOworfQorCitzdGF0aWMgdm9pZCBfYmNtY2xpX2hlbHBfc2Vzc2lvbl9wcmludF9hbmRfY2xvc2UoYmNtY2xpX3Nlc3Npb24gKm1haW5fc2Vzc2lvbiwgYmNtY2xpX3Nlc3Npb24gKmhlbHBfc2Vzc2lvbikKK3sKKyAgICBiY21vbHRfc3RyaW5nICpzdHIgPSBiY21jbGlfc2Vzc2lvbl91c2VyX3ByaXYoaGVscF9zZXNzaW9uKTsKKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1haW5fc2Vzc2lvbiwgIiVzIiwgYmNtb2x0X3N0cmluZ19nZXQoc3RyKSk7CisgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2UoaGVscF9zZXNzaW9uKTsKKyAgICBiY21vbHRfc3RyaW5nX2Rlc3Ryb3koc3RyKTsKK30KKworI2lmZGVmIENPTkZJR19MSU5FTk9JU0UKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX2xpbmVfZWRpdF9jbWQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgaWYgKG5fcGFybXMgPiAwKQorICAgIHsKKyAgICAgICAgaWYgKChwYXJtWzBdLmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkpCisgICAgICAgICAgICBsaW5lbm9pc2VTZXREdW1iVGVybWluYWwoc2Vzc2lvbi0+bG5fc2Vzc2lvbiwgISBwYXJtWzBdLnZhbHVlLm51bWJlcik7CisgICAgICAgIGlmICgocGFybVsxXS5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQpKQorICAgICAgICAgICAgbGluZW5vaXNlU2V0TXVsdGlMaW5lKHNlc3Npb24tPmxuX3Nlc3Npb24sIHBhcm1bMV0udmFsdWUubnVtYmVyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGR1bWIgPSBsaW5lbm9pc2VHZXREdW1iVGVybWluYWwoc2Vzc2lvbi0+bG5fc2Vzc2lvbik7CisgICAgICAgIGludCBtdWx0aWxpbmUgPSBsaW5lbm9pc2VHZXRNdWx0aUxpbmUoc2Vzc2lvbi0+bG5fc2Vzc2lvbik7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJMaW5lIGVkaXRpbmc6ICVzICBNdWx0aWxpbmU6ICVzXG4iLAorICAgICAgICAgICAgZHVtYiA/ICJvZmYiIDogIm9uIiwgbXVsdGlsaW5lID8gIm9uIiA6ICJvZmYiKTsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKworLyogQWxsb2NhdGUgcm9vdCBkaXJlY3RvcnkgYW5kIGRlZmF1bHQgc2Vzc2lvbiAqLworc3RhdGljIHZvaWQgX2JjbWNsaV9hbGxvY19yb290KGNvbnN0IGJjbWNsaV9zZXNzaW9uX3Bhcm0gKmZpcnN0X3Nlc3Npb25fcGFybSkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9wYXJtIHNlc3Npb25fcGFybXM7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgaW50IHJjOworCisgICAgLyogVGhlIHZlcnkgZmlyc3QgY2FsbC4gQWxsb2NhdGUgcm9vdCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoKF9iY21jbGlfcm9vdF9kaXI9KGJjbWNsaV9lbnRyeSAqKWJjbW9zX2NhbGxvYyhzaXplb2YoYmNtY2xpX2VudHJ5KSArIHN0cmxlbihCQ01DTElfUk9PVF9IRUxQKSArIDIgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIF9iY21jbGlfcm9vdF9kaXItPm5hbWUgPSAoY2hhciAqKShfYmNtY2xpX3Jvb3RfZGlyICsgMSk7CisgICAgX2JjbWNsaV9yb290X2Rpci0+aGVscCA9IChjaGFyICopKF9iY21jbGlfcm9vdF9kaXItPm5hbWUgKyAxKTsKKyAgICBzdHJjcHkoX2JjbWNsaV9yb290X2Rpci0+aGVscCwgQkNNQ0xJX1JPT1RfSEVMUCk7CisgICAgX2JjbWNsaV9yb290X2Rpci0+c2VsID0gQkNNQ0xJX0VOVFJZX0RJUjsKKyAgICBfYmNtY2xpX3Jvb3RfZGlyLT5hY2Nlc3NfcmlnaHQgPSBCQ01DTElfQUNDRVNTX0dVRVNUOworCisgICAgbWVtc2V0KCZzZXNzaW9uX3Bhcm1zLCAwLCBzaXplb2Yoc2Vzc2lvbl9wYXJtcykpOworICAgIHNlc3Npb25fcGFybXMuYWNjZXNzX3JpZ2h0ID0gQkNNQ0xJX0FDQ0VTU19BRE1JTjsKKyAgICBzZXNzaW9uX3Bhcm1zLmV4dHJhX3NpemUgPSBzaXplb2YoYmNtY2xpX3Nlc3Npb25fZXh0cmFzKTsKKyAgICBzZXNzaW9uX3Bhcm1zLm5hbWUgPSAibW9ucm9vdCI7CisgICAgaWYgKGZpcnN0X3Nlc3Npb25fcGFybSkKKyAgICB7CisgICAgICAgIHNlc3Npb25fcGFybXMubGluZV9lZGl0X21vZGUgPSBmaXJzdF9zZXNzaW9uX3Bhcm0tPmxpbmVfZWRpdF9tb2RlOworICAgIH0KKyAgICByYyA9IGJjbWNsaV9zZXNzaW9uX29wZW4oJnNlc3Npb25fcGFybXMsICZzZXNzaW9uKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBiY21vc19mcmVlKF9iY21jbGlfcm9vdF9kaXIpOworICAgICAgICBfYmNtY2xpX3Jvb3RfZGlyID0gTlVMTDsKKyAgICAgICAgX2JjbWNsaV9yb290X3Nlc3Npb24gPSBOVUxMOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9iY21jbGlfcm9vdF9zZXNzaW9uID0gX2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgX2JjbWNsaV9yb290X3Nlc3Npb24tPnNlc3Npb24gPSBzZXNzaW9uOworICAgIF9iY21jbGlfcm9vdF9zZXNzaW9uLT5jdXJkaXIgPSBfYmNtY2xpX3Jvb3RfZGlyOworCisgICAgLyogQWRkIGNvbW1hbmQgdG8gZGlzYWJsZS9lbmFibGUgbGluZSBlZGl0aW5nICovCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorICAgIGlmIChzZXNzaW9uX3Bhcm1zLmxpbmVfZWRpdF9tb2RlICE9IEJDTUNMSV9MSU5FX0VESVRfRElTQUJMRSkKKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChOVUxMLCAifiIsICJFbmFibGUvZGlzYWJsZS9xdWVyeSBsaW5lIGVkaXRpbmciLCBfYmNtY2xpX2xpbmVfZWRpdF9jbWQsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImVuYWJsZSIsICJFbmFibGUgbGluZSBlZGl0aW5nIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oIm11bHRpbGluZSIsICJFbmFibGUgbXVsdGlsaW5lIG1vZGUiLCBiY21jbGlfZW51bV9ib29sX3RhYmxlLAorICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKyAgICB9CisjZW5kaWYKK30KKworLyogRGlzcGxheSBkaXJlY3RvcnkgKi8KK3N0YXRpYyB2b2lkIF9iY21jbGlfZGlzcGxheV9kaXIoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpwX2RpcikKK3sKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiA9IG1vbl9zZXNzaW9uLT5zZXNzaW9uOworICAgIGJjbWNsaV9lbnRyeSAqcF90b2tlbjsKKyAgICBiY21jbGlfZW50cnkgKnByZXY9TlVMTDsKKyAgICBiY21jbGlfc2Vzc2lvbiAqaGVscF9zZXNzaW9uID0gX2JjbWNsaV9oZWxwX3Nlc3Npb25fb3BlbihzZXNzaW9uKTsKKworICAgIGlmICghaGVscF9zZXNzaW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChoZWxwX3Nlc3Npb24sICIlcyVzPiAiLCAocF9kaXI9PV9iY21jbGlfcm9vdF9kaXIpPyIiOiIuLi4vIiwgcF9kaXItPm5hbWUgKTsKKyAgICBwX3Rva2VuID0gcF9kaXItPnUuZGlyLmZpcnN0OworICAgIHdoaWxlICggcF90b2tlbiApCisgICAgeworICAgICAgICBpZiAocF90b2tlbi0+YWNjZXNzX3JpZ2h0IDw9IGJjbWNsaV9zZXNzaW9uX2FjY2Vzc19yaWdodChzZXNzaW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHByZXYpCisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoaGVscF9zZXNzaW9uLCAiLCAiKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGhlbHBfc2Vzc2lvbiwgIiVzIiwgcF90b2tlbi0+bmFtZSApOworICAgICAgICAgICAgaWYgKHBfdG9rZW4tPnNlbCA9PSBCQ01DTElfRU5UUllfRElSICkKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChoZWxwX3Nlc3Npb24sICIvIik7CisgICAgICAgICAgICBwcmV2ID0gcF90b2tlbjsKKyAgICAgICAgfQorICAgICAgICBwX3Rva2VuID0gcF90b2tlbi0+bmV4dDsKKyAgICB9CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoaGVscF9zZXNzaW9uLCAiXG4iKTsKKyAgICBfYmNtY2xpX2hlbHBfc2Vzc2lvbl9wcmludF9hbmRfY2xvc2Uoc2Vzc2lvbiwgaGVscF9zZXNzaW9uKTsKK30KKworCisvKiBJcyBjaGFyYWN0ZXIgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbmdsZSB0b2tlbiA/ICovCitzdGF0aWMgaW5saW5lIGludCBfYmNtY2xpX2lzX3NwZWNpYWxfY2hhcihjaGFyIGMpCit7CisgICAgaWYgKCFjKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gKGMgPT0gQkNNQ0xJX0hFTFBfQ0hBUiB8fCBjID09IEJDTUNMSV9DT01NRU5UX0NIQVIgfHwgYyA9PSBCQ01DTElfRVFVQUxfQ0hBUik7Cit9CisKKy8qIE1ha2UgYSBwcmVsaW1pbmFyeSBhbmFsaXppcyBvZiA8bmFtZT4gdG9rZW4uCisgKiAgIFJldHVybnMgYSB0b2tlbiB0eXBlIChFbXB0eSwgVXAsIFJvb3QsIEJyZWFrLCBOYW1lKQorICovCitzdGF0aWMgYmNtY2xpX3Rva2VuX3R5cGUgX2JjbWNsaV9hbmFseXplX3Rva2VuKCBjb25zdCBjaGFyICpuYW1lICkKK3sKKyAgICBpZiAoIW5hbWVbMF0gfHwgbmFtZVswXT09JzsnKQorICAgICAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX0VNUFRZOworCisgICAgaWYgKCpuYW1lID09IEJDTUNMSV9DT01NRU5UX0NIQVIpCisgICAgICAgIHJldHVybiBCQ01DTElfVE9LRU5fQlJFQUs7CisKKyAgICBpZiAoIXN0cmNtcChuYW1lLCBCQ01DTElfVVBfU1RSKSkKKyAgICAgICAgcmV0dXJuIEJDTUNMSV9UT0tFTl9VUDsKKworICAgIGlmICghc3RyY21wKG5hbWUsIEJDTUNMSV9ST09UX1NUUikpCisgICAgICAgIHJldHVybiBCQ01DTElfVE9LRU5fUk9PVDsKKworICAgIGlmICgqbmFtZSA9PSBCQ01DTElfSEVMUF9DSEFSKQorICAgICAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX0hFTFA7CisKKyAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX1ZBTFVFOworCit9CisKKworLyogaXNzcGFjZSB3cmFwcGVyICovCitzdGF0aWMgaW5saW5lIGludCBfYmNtY2xpX2lzc3BhY2UoY2hhciBjKQoreworICAgIHJldHVybiBpc3NwYWNlKChpbnQpYyk7Cit9CisKKy8qIEN1dCB0aGUgZmlyc3Qgd29yZCBmcm9tIDxwX2luYnVmPi4KKyAqIC0gUmV0dXJuIHBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIHdvcmQgaW4gcF93b3JkCisgKiAtIDAgdGVybWluYXRvciBpcyBpbnNlcnRlZCBpbiB0aGUgZW5kIG9mIHRoZSB3b3JkCisgKiAtIHNlc3Npb24tPnBfaW5idWYgaXMgdXBkYXRlZCB0byBwb2ludCBhZnRlciB0aGUgd29yZAorICogUmV0dXJucyB0b2tlbiB0eXBlCisgKi8KK3N0YXRpYyBiY21jbGlfdG9rZW5fdHlwZSBfYmNtY2xpX2dldF93b3JkKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGNoYXIgKipidWYsIGNoYXIgKipwX3dvcmQpCit7CisgICAgYmNtY2xpX3Rva2VuX3R5cGUgdG9rZW5fdHlwZTsKKyAgICBjaGFyICpwX2luYnVmID0gKmJ1ZjsKKyAgICBjaGFyIG5leHRfY2hhciA9IDA7CisgICAgYmNtb3NfYm9vbCBxdW90ZWRfc3RyaW5nID0gQkNNT1NfRkFMU0U7CisKKyAgICAvKiBTa2lwIGxlYWRpbmcgYmxhbmtzICovCisgICAgd2hpbGUgKCpwX2luYnVmICYmIChfYmNtY2xpX2lzc3BhY2UoKnBfaW5idWYpIHx8ICgqcF9pbmJ1Zj09JywnKSkpCisgICAgICAgICsrcF9pbmJ1ZjsKKworICAgICpidWYgPSBwX2luYnVmOworICAgIGlmICghICpwX2luYnVmKQorICAgICAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX0VNUFRZOworICAgIGlmICgqcF9pbmJ1ZiA9PSAnOycpCisgICAgeworICAgICAgICAqcF9pbmJ1ZiA9IDA7CisgICAgICAgICpidWYgPSArK3BfaW5idWY7CisgICAgICAgIHJldHVybiBCQ01DTElfVE9LRU5fRU1QVFk7CisgICAgfQorCisgICAgLyogUXVvdGVkIHN0cmluZyA/ICovCisgICAgaWYgKCpwX2luYnVmID09ICciJykKKyAgICB7CisgICAgICAgIHF1b3RlZF9zdHJpbmcgPSBCQ01PU19UUlVFOworICAgICAgICAqcF93b3JkID0gKytwX2luYnVmOworICAgICAgICB3aGlsZSAoICpwX2luYnVmICYmICpwX2luYnVmIT0nIicgKQorICAgICAgICAgICAgKytwX2luYnVmOworICAgICAgICBpZiAoKnBfaW5idWYgIT0gJyInKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogdW50ZXJtaW5hdGVkIHN0cmluZyAlc1xuIiwgKnBfd29yZCk7CisgICAgICAgICAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX0VNUFRZOworICAgICAgICB9CisgICAgICAgIGlmICgqcF9pbmJ1ZikKKyAgICAgICAgICAgICoocF9pbmJ1ZisrKSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwX3dvcmQgPSBwX2luYnVmOworICAgICAgICBpZiAoIV9iY21jbGlfaXNfc3BlY2lhbF9jaGFyKCpwX2luYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgZG8gKytwX2luYnVmOworICAgICAgICAgICAgd2hpbGUgKCpwX2luYnVmICYmICFfYmNtY2xpX2lzc3BhY2UoKnBfaW5idWYpICYmICpwX2luYnVmIT0nOycgJiYgIV9iY21jbGlfaXNfc3BlY2lhbF9jaGFyKCpwX2luYnVmKSk7CisgICAgICAgICAgICAvKiBTa2lwIHRyYWlsaW5nIHNwYWNlcyAqLworICAgICAgICAgICAgd2hpbGUgKCpwX2luYnVmICYmIF9iY21jbGlfaXNzcGFjZSgqcF9pbmJ1ZikpCisgICAgICAgICAgICAgICAgKihwX2luYnVmKyspID0gMDsKKyAgICAgICAgICAgIG5leHRfY2hhciA9ICpwX2luYnVmOworICAgICAgICAgICAgaWYgKG5leHRfY2hhciA9PSBCQ01DTElfRVFVQUxfQ0hBUikKKyAgICAgICAgICAgICAgICAqKHBfaW5idWYrKykgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKytwX2luYnVmOworICAgICAgICB9CisgICAgfQorICAgICpidWYgPSBwX2luYnVmOworICAgIHRva2VuX3R5cGUgICA9IF9iY21jbGlfYW5hbHl6ZV90b2tlbiggKnBfd29yZCApOworICAgIGlmICh0b2tlbl90eXBlID09IEJDTUNMSV9UT0tFTl9WQUxVRSAmJiBuZXh0X2NoYXIgPT0gQkNNQ0xJX0VRVUFMX0NIQVIpCisgICAgICAgIHRva2VuX3R5cGUgPSBCQ01DTElfVE9LRU5fTkFNRTsKKyAgICBpZiAoKHRva2VuX3R5cGUgPT0gQkNNQ0xJX1RPS0VOX0VNUFRZKSAmJiBxdW90ZWRfc3RyaW5nKQorICAgICAgICB0b2tlbl90eXBlID0gQkNNQ0xJX1RPS0VOX1ZBTFVFOworICAgIHJldHVybiB0b2tlbl90eXBlOworfQorCisvKiBTcGxpdCBzdHJpbmcgdG8gW25hbWU9XXZhbHVlIHBhaXJzICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9zcGxpdChiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfbmFtZV92YWx1ZSAqKnBfcGFpcnMsIGludCAqcF9ucGFpcnMpCit7CisgICAgYmNtY2xpX25hbWVfdmFsdWUgKnBhaXJzOworICAgIGNoYXIgKnRtcF9idWYsICp0bXBfYnVmX29yZzsKKyAgICBjaGFyICp3b3JkOworICAgIGJjbWNsaV90b2tlbl90eXBlIHRva2VuX3R5cGUsIHByZXZfdHlwZT1CQ01DTElfVE9LRU5fRU1QVFk7CisgICAgaW50IG4gPSAwOworCisgICAgLyogTWFrZSBhIGNvcHkgb2YgaW5wdXQgYnVmZmVyICovCisgICAgdG1wX2J1Zl9vcmcgPSB0bXBfYnVmID0gYmNtb3NfYWxsb2Moc3RybGVuKG1vbl9zZXNzaW9uLT5wX2luYnVmKSArIDEpOworICAgIGlmICghdG1wX2J1ZikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgc3RyY3B5KHRtcF9idWYsIG1vbl9zZXNzaW9uLT5wX2luYnVmKTsKKworICAgIC8qIENhbGN1bGF0ZSBudW1iZXIgb2YgcGFpcnMgZmlyc3QgKi8KKyAgICB0b2tlbl90eXBlID0gX2JjbWNsaV9nZXRfd29yZChtb25fc2Vzc2lvbiwgJnRtcF9idWYsICZ3b3JkKTsKKyAgICB3aGlsZSAodG9rZW5fdHlwZSAhPSBCQ01DTElfVE9LRU5fRU1QVFkgJiYgdG9rZW5fdHlwZSAhPSBCQ01DTElfVE9LRU5fQlJFQUspCisgICAgeworICAgICAgICAvKiBTa2lwID12YWx1ZSAqLworICAgICAgICBpZiAoIShwcmV2X3R5cGUgPT0gQkNNQ0xJX1RPS0VOX05BTUUgJiYgdG9rZW5fdHlwZSA9PSBCQ01DTElfVE9LRU5fVkFMVUUpKQorICAgICAgICAgICAgKytuOworICAgICAgICBwcmV2X3R5cGUgPSB0b2tlbl90eXBlOworICAgICAgICB0b2tlbl90eXBlID0gX2JjbWNsaV9nZXRfd29yZChtb25fc2Vzc2lvbiwgJnRtcF9idWYsICZ3b3JkKTsKKyAgICB9CisgICAgYmNtb3NfZnJlZSh0bXBfYnVmX29yZyk7CisgICAgKnBfbnBhaXJzID0gbjsKKyAgICBpZiAoIW4pCisgICAgeworICAgICAgICAqcF9wYWlycyA9IE5VTEw7CisgICAgICAgIC8qIEN1dCBpbnB1dCBzdHJpbmcgaW4gb3JkZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wIGluIHRoZSBwYXJzZXIgaWYgdGhlIHN0cmluZworICAgICAgICAgKiBpcyBub3QgZW1wdHkgKGUuZy4sIGNvbnRhaW5zIHNwYWNlcykgKi8KKyAgICAgICAgKm1vbl9zZXNzaW9uLT5wX2luYnVmID0gMDsKKyAgICAgICAgaWYgKHRva2VuX3R5cGUgPT0gQkNNQ0xJX1RPS0VOX0JSRUFLKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqcF9wYWlycyA9IHBhaXJzID0gYmNtb3NfY2FsbG9jKG4gKiBzaXplb2YoYmNtY2xpX25hbWVfdmFsdWUpKTsKKyAgICBpZiAoISBwYWlycykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisKKyAgICAvKiBOb3cgc2NhbiB0aGUgb3JpZ2luYWwgc3RyaW5nIGFuZCBzZXQgbmFtZXMgYW5kIHZhbHVlcyAqLworICAgIHRva2VuX3R5cGUgPSBfYmNtY2xpX2dldF93b3JkKG1vbl9zZXNzaW9uLCAmbW9uX3Nlc3Npb24tPnBfaW5idWYsICZ3b3JkKTsKKyAgICBwcmV2X3R5cGU9QkNNQ0xJX1RPS0VOX0VNUFRZOworICAgIC0tcGFpcnM7IC8qIGl0IGlzIGdvaW5nIHRvIGJlIHByZS1pbmNyZW1lbnRlZCAqLworICAgIHdoaWxlICh0b2tlbl90eXBlICE9IEJDTUNMSV9UT0tFTl9FTVBUWSAmJiB0b2tlbl90eXBlICE9IEJDTUNMSV9UT0tFTl9CUkVBSykKKyAgICB7CisgICAgICAgIGlmICghKHByZXZfdHlwZSA9PSBCQ01DTElfVE9LRU5fTkFNRSAmJiB0b2tlbl90eXBlID09IEJDTUNMSV9UT0tFTl9WQUxVRSkpCisgICAgICAgICAgICArK3BhaXJzOworICAgICAgICBwYWlycy0+dHlwZSA9IHRva2VuX3R5cGU7CisgICAgICAgIGlmICh0b2tlbl90eXBlID09IEJDTUNMSV9UT0tFTl9OQU1FKQorICAgICAgICB7CisgICAgICAgICAgICBwYWlycy0+bmFtZSA9IHdvcmQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwYWlycy0+dmFsdWUgPSB3b3JkOworICAgICAgICB9CisgICAgICAgIHByZXZfdHlwZSA9IHRva2VuX3R5cGU7CisgICAgICAgIHRva2VuX3R5cGUgPSBfYmNtY2xpX2dldF93b3JkKG1vbl9zZXNzaW9uLCAmbW9uX3Nlc3Npb24tPnBfaW5idWYsICZ3b3JkKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEZpbmQgcGFyYW1ldGVyIGJ5IG5hbWUgKi8KK3N0YXRpYyBiY21jbGlfY21kX3Bhcm0gKl9iY21jbGlfZmluZF9uYW1lZF9wYXJtKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbWRfcGFybSA9IG1vbl9zZXNzaW9uLT5jbWRfcGFybXM7CisKKyAgICB3aGlsZSAoY21kX3Bhcm0tPm5hbWUpCisgICAgeworICAgICAgICBpZiAoIV9iY21jbGlfc3RyaWNtcChuYW1lLCBjbWRfcGFybS0+bmFtZSwgLTEpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrY21kX3Bhcm07CisgICAgfQorCisgICAgaWYgKCFjbWRfcGFybS0+bmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gY21kX3Bhcm07Cit9CisKKy8qIEV4dGVuZCBzZXNzaW9uIHBhcmFtZXRlciB0YWJsZSBiYXNlZCBvbiBzZWxlY3RvciB2YWx1ZSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfZXh0ZW5kX3Bhcm1fdGFibGUoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwKKyAgICBiY21jbGlfY21kX3Bhcm0gKnNlbGVjdG9yLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlcz1zZWxlY3Rvci0+ZW51bV90YWJsZTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm1zOworICAgIGJjbWNsaV9jbWRfcGFybSAqc2Vzc2lvbl9wYXJtOworICAgIGludCBuc2VsID0gc2VsZWN0b3IgLSBtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zOworICAgIGJjbWNsaV9wYXJtX3ZhbHVlX3N0YXR1cyAqdmFsX3N0YXR1czsKKyAgICBpbnQgbnBhcm1zOworCisgICAgd2hpbGUgKHZhbHVlcy0+bmFtZSkKKyAgICB7CisgICAgICAgIGlmICghX2JjbWNsaV9zdHJpY21wKHZhbHVlcy0+bmFtZSwgdmFsdWUsIC0xKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICArK3ZhbHVlczsKKyAgICB9CisgICAgaWYgKCF2YWx1ZXMtPm5hbWUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworCisgICAgLyogQ2FsY3VsYXRlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIHNlbGVjdGVkIHRhYmxlICovCisgICAgcGFybXMgPSB2YWx1ZXMtPnBhcm1zOworICAgIHdoaWxlIChwYXJtcyAmJiBwYXJtcy0+bmFtZSkKKyAgICB7CisgICAgICAgICsrcGFybXM7CisgICAgfQorICAgIG5wYXJtcyA9IHBhcm1zIC0gdmFsdWVzLT5wYXJtczsKKworICAgIGlmIChtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zICsgbnBhcm1zID49IEJDTUNMSV9NQVhfUEFSTVMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IENhbidzIHByb2Nlc3Mgc2VsZWN0b3IgJXMuIFRvbyBtYW55IHBhcmFtZXRlcnNcbiIsCisgICAgICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyY21kLT5uYW1lLCBzZWxlY3Rvci0+bmFtZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKworICAgIC8qIFNoaWZ0IHNlc3Npb24gcGFyYW1ldGVycyBtYWtpbmcgcm9vbSBmb3IgdGhlIG5ldyB0YWJsZSAqLworICAgIGlmIChzZWxlY3RvciAhPSAmbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1ttb25fc2Vzc2lvbi0+bnVtX3Bhcm1zLTFdKQorICAgIHsKKyAgICAgICAgbWVtbW92ZShzZWxlY3RvciArIG5wYXJtcyArIDEsIHNlbGVjdG9yICsgMSwKKyAgICAgICAgICAgICgmbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1ttb25fc2Vzc2lvbi0+bnVtX3Bhcm1zLTFdIC0gc2VsZWN0b3IpICogc2l6ZW9mKGJjbWNsaV9jbWRfcGFybSkpOworICAgICAgICBtZW1tb3ZlKCZtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW25zZWwgKyBucGFybXMgKyAxXSwgJm1vbl9zZXNzaW9uLT52YWx1ZV9zdGF0dXNbbnNlbCArIDFdLAorICAgICAgICAgICAgKG1vbl9zZXNzaW9uLT5udW1fcGFybXMgLSBuc2VsKSAqIHNpemVvZihiY21jbGlfcGFybV92YWx1ZV9zdGF0dXMpKTsKKyAgICB9CisKKyAgICAvKiBGaW5hbGx5IGluc2VydCBzZWxlY3RvcidzIHRhYmxlICovCisgICAgcGFybXMgPSB2YWx1ZXMtPnBhcm1zOworICAgIHNlc3Npb25fcGFybSA9IHNlbGVjdG9yKzE7CisgICAgdmFsX3N0YXR1cyA9ICZtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW25zZWwgKyAxXTsKKyAgICB3aGlsZSAocGFybXMgJiYgcGFybXMtPm5hbWUpCisgICAgeworICAgICAgICAqc2Vzc2lvbl9wYXJtID0gKnBhcm1zOworICAgICAgICBfYmNtY2xpX2Fzc2lnbl9jYWxsYmFja3Moc2Vzc2lvbl9wYXJtKTsKKworICAgICAgICBpZiAocGFybXMtPm1heF9hcnJheV9zaXplKQorICAgICAgICB7CisgICAgICAgICAgICB2YWxfc3RhdHVzLT52YWx1ZXNfc2V0ID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21vc19ib29sKSAqIHBhcm1zLT5tYXhfYXJyYXlfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIXZhbF9zdGF0dXMtPnZhbHVlc19zZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ID4gQ291bGRuJ3QgYWxsb2NhdGUgdmFsdWUgc3RhdHVzIGFycmF5IGZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgcGFybXMtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmFsX3N0YXR1cy0+dmFsdWVfc2V0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworCisgICAgICAgICsrcGFybXM7CisgICAgICAgICsrc2Vzc2lvbl9wYXJtOworICAgICAgICArK3ZhbF9zdGF0dXM7CisgICAgfQorICAgIG1vbl9zZXNzaW9uLT5udW1fcGFybXMgKz0gbnBhcm1zOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFBhcnNlIGEgc2luZ2xlIHBhcmFtZXRlciB2YWx1ZSAoc2NhbGFyIHZhbHVlIG9yIGFycmF5IGVsZW1lbnQpICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9wYXJzZV8xdmFsdWUoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpjbWQsCisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKnN0cmluZ192YWx1ZSwKKyAgICBpbnQgdmFsX2xlbiwgYmNtb3NfYm9vbCBzdXBwcmVzc19lcnJfcHJpbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAodmFsX2xlbiA+PSAwKQorICAgIHsKKyAgICAgICAgLyogV2UgYXJlIGRlYWxpbmcgd2l0aCBhcnJheSBlbGVtZW50LiBzdHJpbmdfdmFsdWUgaXMgY29tbWEgcmF0aGVyIHRoYW4KKyAgICAgICAgICogMC10ZXJtaW5hdGVkLiBDb3B5IGl0IGFzaWRlLgorICAgICAgICAgKi8KKyAgICAgICAgY2hhciB2YWxfY29weVt2YWxfbGVuICsgMV07CisgICAgICAgIHN0cm5jcHkodmFsX2NvcHksIHN0cmluZ192YWx1ZSwgdmFsX2xlbik7CisgICAgICAgIHZhbF9jb3B5W3ZhbF9sZW5dID0gMDsKKyAgICAgICAgcmMgPSBwYXJtLT5zY2FuX2NiKHBhcm0sIHZhbHVlLCB2YWxfY29weSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gcGFybS0+c2Nhbl9jYihwYXJtLCB2YWx1ZSwgc3RyaW5nX3ZhbHVlKTsKKyAgICB9CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgaWYgKCFzdXBwcmVzc19lcnJfcHJpbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiAlcz4gPCVzPjogdmFsdWUgJXMgaXMgaW52YWxpZFxuIiwKKyAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIHBhcm0tPm5hbWUsIHN0cmluZ192YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisKKy8qIFBhcnNlIHBhcmFtZXRlciB2YWx1ZSwgaW5jbHVkaW5nIGFycmF5IHZhbHVlIChjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBlbGVtZW50IHZhbHVlcykgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX3BhcnNlX3ZhbHVlKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqY21kLAorICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybSwgY29uc3QgY2hhciAqc3RyaW5nX3ZhbHVlLCBiY21vc19ib29sIHN1cHByZXNzX2Vycl9wcmludCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgcGFybV9pbmRleCA9IHBhcm0gLSBtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zOworCisgICAgQlVHX09OKHBhcm1faW5kZXggPj0gQkNNQ0xJX01BWF9QQVJNUyk7CisKKyAgICBpZiAocGFybS0+bWF4X2FycmF5X3NpemUpCisgICAgeworICAgICAgICB1aW50MzJfdCBpID0gMDsKKworICAgICAgICAvKiBFbXB0eSBhcnJheT8gKi8KKyAgICAgICAgaWYgKF9iY21jbGlfc3RyaWNtcChzdHJpbmdfdmFsdWUsIEJDTUNMSV9BUlJBWV9FTVBUWSwgLTEpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhcnJheSBlbGVtZW50IHZhbHVlcyBhcmUgY29tbWEtZGVsaW1pdGVkICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFybS0+bWF4X2FycmF5X3NpemUgJiYgc3RyaW5nX3ZhbHVlICYmICpzdHJpbmdfdmFsdWUgJiYgIXJjOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGNvbW1hOworICAgICAgICAgICAgICAgIGludCB2YWxfbGVuOworCisgICAgICAgICAgICAgICAgcGNvbW1hID0gc3RyY2hyKHN0cmluZ192YWx1ZSwgQkNNQ0xJX0FSUkFZX0RFTElNX0NIQVIpOworICAgICAgICAgICAgICAgIGlmIChwY29tbWEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWxfbGVuID0gcGNvbW1hIC0gc3RyaW5nX3ZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWxfbGVuID0gLTE7IC8qIHRvIHRoZSBlbmQgb2Ygc3RyaW5nICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIE5vIHZhbHVlID8gKi8KKyAgICAgICAgICAgICAgICBpZiAoX2JjbWNsaV9zdHJpY21wKHN0cmluZ192YWx1ZSwgQkNNQ0xJX1BBUk1fTk9fVkFMVUUsIHZhbF9sZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBfYmNtY2xpX3BhcnNlXzF2YWx1ZShtb25fc2Vzc2lvbiwgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFybSwgJnBhcm0tPnZhbHVlc1tpXSwgc3RyaW5nX3ZhbHVlLCB2YWxfbGVuLCBzdXBwcmVzc19lcnJfcHJpbnQpOworICAgICAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW3Bhcm1faW5kZXhdLnZhbHVlc19zZXRbaV0gPSAocmMgPT0gQkNNX0VSUl9PSyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZSA9IHBjb21tYSA/IHBjb21tYSArIDEgOiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgYWxsIHBhcnNlZCB2YWx1ZXMgd2VyZSBvaywgYnV0IHdlIGhhdmUgbW9yZSB2YWx1ZXMgdGhhbiBhcnJheSBzaXplIC0gaXQgaXMgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgIGlmIChzdHJpbmdfdmFsdWUgJiYgKnN0cmluZ192YWx1ZSAmJiAhcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1RPT19NQU5ZOworICAgICAgICAgICAgICAgIGlmICghc3VwcHJlc3NfZXJyX3ByaW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiA8JXM+OiB0b28gbWFueSB2YWx1ZXMuICVzIGlzIGludmFsaWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIHBhcm0tPm5hbWUsIHN0cmluZ192YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGFybS0+YXJyYXlfc2l6ZSA9IGk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChfYmNtY2xpX3N0cmljbXAoc3RyaW5nX3ZhbHVlLCBCQ01DTElfUEFSTV9OT19WQUxVRSwgc3RybGVuKHN0cmluZ192YWx1ZSkpKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IF9iY21jbGlfcGFyc2VfMXZhbHVlKG1vbl9zZXNzaW9uLCBjbWQsCisgICAgICAgICAgICAgICAgcGFybSwgJnBhcm0tPnZhbHVlLCBzdHJpbmdfdmFsdWUsIC0xLCBzdXBwcmVzc19lcnJfcHJpbnQpOworICAgICAgICAgICAgbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1twYXJtX2luZGV4XS52YWx1ZV9zZXQgPSAocmMgPT0gQkNNX0VSUl9PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFJlbGVhc2UgdmFsdWUgc3RhdHVzIGFycmF5cyAqLworc3RhdGljIHZvaWQgX2JjbWNsaV9mcmVlX3Nlc3Npb25fdmFsdWVfc3RhdHVzKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtcz1tb25fc2Vzc2lvbi0+Y21kX3Bhcm1zOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEJDTUNMSV9NQVhfUEFSTVM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwYXJtc1tpXS5tYXhfYXJyYXlfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1vbl9zZXNzaW9uLT52YWx1ZV9zdGF0dXNbaV0udmFsdWVzX3NldCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX2ZyZWUobW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1tpXS52YWx1ZXNfc2V0KTsKKyAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW2ldLnZhbHVlc19zZXQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1tpXS52YWx1ZV9zZXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogUG9wdWxhdGUgc2Vzc2lvbiBwYXJhbWV0ZXJzLiBBcHBseSBzZWxlY3RvcnMgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX3BvcHVsYXRlX3Bhcm1zKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqY21kLAorICAgIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlycywgaW50IG5wYWlycywgYmNtb3NfYm9vbCBzdXBwcmVzc19lcnJfcHJpbnQsIGludCAqbGFzdCkKK3sKKyAgICBjb25zdCBjaGFyICpwYXJtX3ZhbHVlOworICAgIGludCBwb3NpdGlvbmFsPTE7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtcz1tb25fc2Vzc2lvbi0+Y21kX3Bhcm1zOworICAgIGJjbWNsaV9jbWRfcGFybSAqY3VyX3Bhcm07CisgICAgaW50IHJjOworICAgIGludCBpOworCisgICAgLyogTWFyayBhbGwgcGFyYW1ldGVycyBhcyBkb24ndCBoYXZpbmcgYW4gZXhwbGljaXQgdmFsdWUgKi8KKyAgICBtZW1zZXQoJnBhcm1zWzBdLCAwLCBzaXplb2YobW9uX3Nlc3Npb24tPmNtZF9wYXJtcykpOworICAgIG1lbWNweSgmcGFybXNbMF0sIGNtZC0+dS5jbWQucGFybXMsIHNpemVvZihiY21jbGlfY21kX3Bhcm0pKmNtZC0+dS5jbWQubnVtX3Bhcm1zKTsKKyAgICAvKiBDbGVhciBhcnJheSBidWZmZXJzICovCisgICAgZm9yIChpID0gMDsgaSA8IGNtZC0+dS5jbWQubnVtX3Bhcm1zOyBpKyspCisgICAgeworICAgICAgICBpZiAocGFybXNbaV0ubWF4X2FycmF5X3NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJVR19PTighcGFybXNbaV0udmFsdWVzKTsKKyAgICAgICAgICAgIG1lbXNldChwYXJtc1tpXS52YWx1ZXMsIDAsIHNpemVvZihiY21jbGlfcGFybV92YWx1ZSkgKiBwYXJtc1tpXS5tYXhfYXJyYXlfc2l6ZSk7CisgICAgICAgICAgICBtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW2ldLnZhbHVlc19zZXQgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbW9zX2Jvb2wpICogcGFybXNbaV0ubWF4X2FycmF5X3NpemUpOworICAgICAgICAgICAgaWYgKCFtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW2ldLnZhbHVlc19zZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiBDb3VsZG4ndCBhbGxvY2F0ZSB2YWx1ZSBzdGF0dXMgYXJyYXkgZm9yICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIHBhaXJzW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1tpXS52YWx1ZV9zZXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtb25fc2Vzc2lvbi0+Y3VyY21kID0gY21kOworICAgIG1vbl9zZXNzaW9uLT5udW1fcGFybXMgPSBjbWQtPnUuY21kLm51bV9wYXJtczsKKyAgICBpZiAobGFzdCkKKyAgICAgICAgKmxhc3QgPSAwOworICAgIC8qIEJ1aWxkIGEgZm9ybWF0IHN0cmluZyAqLworICAgIGZvciAoaT0wOyBpPG5wYWlycyAmJiBwYWlyc1tpXS50eXBlICE9IEJDTUNMSV9UT0tFTl9CUkVBSzsgaSsrKQorICAgIHsKKyAgICAgICAgcGFybV92YWx1ZSA9IHBhaXJzW2ldLnZhbHVlOworICAgICAgICBpZiAobGFzdCkKKyAgICAgICAgICAgICpsYXN0ID0gaTsKKyAgICAgICAgY3VyX3Bhcm0gPSBOVUxMOworICAgICAgICAvKiBOYW1lZCBwYXJhbWV0ZXIgPyAqLworICAgICAgICBpZiAocGFpcnNbaV0ubmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoY21kLT51LmNtZC5leHRyYXMuZmxhZ3MgJiBCQ01DTElfQ01EX0ZMQUdfTk9fTkFNRV9QQVJNUykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc3VwcHJlc3NfZXJyX3ByaW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiBEb2Vzbid0IHN1cHBvcnQgbmFtZWQgcGFyYW1ldGVycy4gJXMgaXMgdW5leHBlY3RlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+bmFtZSwgcGFpcnNbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3NpdGlvbmFsID0gMDsgLyogTm8gbW9yZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIC8qIENoZWNrIG5hbWUgKi8KKyAgICAgICAgICAgIGN1cl9wYXJtID0gX2JjbWNsaV9maW5kX25hbWVkX3Bhcm0obW9uX3Nlc3Npb24sIHBhaXJzW2ldLm5hbWUpOworICAgICAgICAgICAgaWYgKCFjdXJfcGFybSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN1cHByZXNzX2Vycl9wcmludCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiAlcz4gcGFyYW1ldGVyIDwlcz4gZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+bmFtZSwgcGFpcnNbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXBhcm1fdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzdXBwcmVzc19lcnJfcHJpbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IDwlcz46IHZhbHVlIGlzIG1pc3NpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIGN1cl9wYXJtLT5uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGl0IGNhbiBzdGlsbCBiZSBuYW1lZCBFTlVNIHBhcmFtZXRlciAod2l0aG91dCA9dmFsdWUpLiBJbiB0aGlzIGNhc2UgdGhlIDFzdAorICAgICAgICAgICAgICogZW51bSB2YWx1ZSBpcyBhc3N1bWVkLiBDaGVjayBpdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocGFybV92YWx1ZSAmJiAoY3VyX3Bhcm0gPSBfYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShtb25fc2Vzc2lvbiwgcGFybV92YWx1ZSkpICYmCisgICAgICAgICAgICAgICAgKGN1cl9wYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX0VOVU0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhaXJzW2ldLm5hbWUgPSBwYXJtX3ZhbHVlOworICAgICAgICAgICAgICAgIHBhaXJzW2ldLnZhbHVlID0gcGFybV92YWx1ZSA9IGN1cl9wYXJtLT5lbnVtX3RhYmxlLT5uYW1lOworICAgICAgICAgICAgICAgIHBvc2l0aW9uYWwgPSAwOyAvKiBObyBtb3JlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghcG9zaXRpb25hbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3VwcHJlc3NfZXJyX3ByaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiBFeHBlY3RlZCBuYW1lZCBwYXJhbWV0ZXIuIEdvdCAlc1xuIiwgY21kLT5uYW1lLCBwYXJtX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VyX3Bhcm0gPSAmcGFybXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWN1cl9wYXJtLT5uYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc3VwcHJlc3NfZXJyX3ByaW50KQorICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IFRvbyBtYW55IHBhcmFtZXRlcnMuICVzIGlzIHVuZXhwZWN0ZWRcbiIsIGNtZC0+bmFtZSwgcGFybV92YWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN1cHByZXNzX2Vycl9wcmludCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IEF0dGVtcHQgdG8gYXNzaWduIHBhcmFtZXRlciAlcyBtb3JlIHRoYW4gb25jZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgY21kLT5uYW1lLCBjdXJfcGFybS0+bmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcm1fdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJfcGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9TVFJJTkcpCisgICAgICAgICAgICAgICAgY3VyX3Bhcm0tPnZhbHVlLnN0cmluZyA9IHBhcm1fdmFsdWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBfYmNtY2xpX3BhcnNlX3ZhbHVlKG1vbl9zZXNzaW9uLCBjbWQsIGN1cl9wYXJtLCBwYXJtX3ZhbHVlLCBzdXBwcmVzc19lcnJfcHJpbnQpOworICAgICAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworCisgICAgICAgICAgICAgICAgLyogRm9yIHBhcmFtZXRlci1zZWxlY3RvciBleHRlbmQgbGlzdCBvZiBwYXJhbWV0ZXJzIGFjY29yZGluZ2x5ICovCisgICAgICAgICAgICAgICAgaWYgKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1IpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IF9iY21jbGlfZXh0ZW5kX3Bhcm1fdGFibGUobW9uX3Nlc3Npb24sIGN1cl9wYXJtLCBwYXJtX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cl9wYXJtLT5mbGFncyB8PSBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBQYXJzZSBwX2luYnVmIHN0cmluZyBiYXNlZCBvbiBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zIGluIDxwX3Rva2VuPi4KKyAqICAgRmlsbCBwYXJhbWV0ZXIgdmFsdWVzIGluIDxwX3Rva2VuPi4KKyAqICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZmlsbGVkIG9yIEJDTV9FUlJfUEFSTQorICogICBUbyBEbzogYWRkIGEgb3B0aW9uIG9mIG9uZS1ieS1vbmUgdXNlciBpbnB1dCBvZiBtaXNzaW5nIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyBpbnQgX2JjbWNsaV9wYXJzZV9wYXJtcyggYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpjbWQsIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlycywgaW50IG5wYWlycykKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm1zPW1vbl9zZXNzaW9uLT5jbWRfcGFybXM7CisgICAgaW50IHJjOworICAgIGludCBpOworCisgICAgLyogUG9wdWxhdGUgcGFyYW1ldGVyIHRhYmxlICovCisgICAgcmMgPSBfYmNtY2xpX3BvcHVsYXRlX3Bhcm1zKG1vbl9zZXNzaW9uLCBjbWQsIHBhaXJzLCBucGFpcnMsIEJDTU9TX0ZBTFNFLCBOVUxMKTsKKyAgICBpZiAocmMpCisgICAgICAgIGdvdG8gZXJyX3JldHVybjsKKworCisgICAgcmMgPSBCQ01fRVJSX1BBUk07CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCBwYXJhbWV0ZXJzIGFyZSBPSy4gQ2hlY2sgcmFuZ2UsIHByb2Nlc3MgZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBmb3IgKGk9MDsgaTxtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zOyBpKyspCisgICAgeworICAgICAgICBiY21jbGlfY21kX3Bhcm0gKmN1cl9wYXJtID0gJnBhcm1zW2ldOworCisgICAgICAgIGlmICghKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJfcGFybS0+ZmxhZ3MgfD0gQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCEoY3VyX3Bhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE1hbmRhdG9yeSBwYXJhbWV0ZXIgbWlzc2luZyAqLworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiAlcz4gTWFuZGF0b3J5IHBhcmFtZXRlciA8JXM+IGlzIG1pc3NpbmdcbiIsIGNtZC0+bmFtZSwgcGFybXNbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJfcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgdmFsdWUgKi8KKyAgICAgICAgaWYgKChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX1JBTkdFKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyX3Bhcm0tPmFycmF5X3NpemUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBqOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdXJfcGFybS0+YXJyYXlfc2l6ZTsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChjdXJfcGFybS0+dmFsdWVzW2pdLm51bWJlciA8IGN1cl9wYXJtLT5sb3dfdmFsKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJfcGFybS0+dmFsdWVzW2pdLm51bWJlciA+IGN1cl9wYXJtLT5oaV92YWwpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IDwlcz46ICVsZCBvdXQgb2YgcmFuZ2UgKCVsZCwgJWxkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5uYW1lLCBjdXJfcGFybS0+bmFtZSwgY3VyX3Bhcm0tPnZhbHVlc1tqXS5udW1iZXIsIGN1cl9wYXJtLT5sb3dfdmFsLCBjdXJfcGFybS0+aGlfdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycl9yZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKChjdXJfcGFybS0+dmFsdWUubnVtYmVyIDwgY3VyX3Bhcm0tPmxvd192YWwpIHx8CisgICAgICAgICAgICAgICAgICAgIChjdXJfcGFybS0+dmFsdWUubnVtYmVyID4gY3VyX3Bhcm0tPmhpX3ZhbCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiA8JXM+OiAlbGQgb3V0IG9mIHJhbmdlICglbGQsICVsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIGN1cl9wYXJtLT5uYW1lLCBjdXJfcGFybS0+dmFsdWUubnVtYmVyLCBjdXJfcGFybS0+bG93X3ZhbCwgY3VyX3Bhcm0tPmhpX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyX3JldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworZXJyX3JldHVybjoKKyAgICBfYmNtY2xpX2ZyZWVfc2Vzc2lvbl92YWx1ZV9zdGF0dXMobW9uX3Nlc3Npb24pOworICAgIHJldHVybiByYzsKK30KKworLyogaW5zZXJ0IHZhbHVlIHNraXBwaW5nIHBhcnRpYWwgbWF0Y2ggdHJoYXQgaXMgYWxyZWFkeSBwcmVzZW50ICovCitzdGF0aWMgdm9pZCBfYmNtY2xpX2luc2VydChjb25zdCBjaGFyICpwYXJ0aWFsX21hdGNoLCBjb25zdCBjaGFyICppbnNlcnRfdmFsMSwKKyAgICBjb25zdCBjaGFyICppbnNlcnRfdmFsMiwgY2hhciAqaW5zZXJ0X3N0ciwgdWludDMyX3QgaW5zZXJ0X3NpemUpCit7CisgICAgaWYgKHBhcnRpYWxfbWF0Y2gpCisgICAgICAgIGluc2VydF92YWwxICs9IHN0cmxlbihwYXJ0aWFsX21hdGNoKTsKKyAgICBiY21jbGlfc3RybmNweShpbnNlcnRfc3RyLCBpbnNlcnRfdmFsMSwgaW5zZXJ0X3NpemUpOworICAgIGlmIChpbnNlcnRfdmFsMikKKyAgICAgICAgYmNtY2xpX3N0cm5jYXQoaW5zZXJ0X3N0ciwgaW5zZXJ0X3ZhbDIsIGluc2VydF9zaXplKTsKK30KKworc3RhdGljIHZvaWQgX2JjbWNsaV91cGRhdGVfbG9uZ2VzdF9tYXRjaChjaGFyICpsb25nZXN0X21hdGNoLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIHVpbnQzMl90IG5sZW4gPSBzdHJsZW4obmFtZSk7CisgICAgdWludDMyX3QgbG1sZW4gPSBzdHJsZW4obG9uZ2VzdF9tYXRjaCk7CisKKyAgICBpZiAobmxlbiA8IGxtbGVuKQorICAgIHsKKyAgICAgICAgbG1sZW4gPSBubGVuOworICAgIH0KKyAgICB3aGlsZSAobG1sZW4gJiYgbWVtY21wKGxvbmdlc3RfbWF0Y2gsIG5hbWUsIGxtbGVuKSkKKyAgICB7CisgICAgICAgIC0tbG1sZW47CisgICAgfQorICAgIGxvbmdlc3RfbWF0Y2hbbG1sZW5dID0gMDsKK30KKworCisvKiBleHRlbmQgdmFsdWUuCisgKiBJZiAhZW51bSAtIGRvIG5vdGhpbmcKKyAqIElmIG1vcmUgdGhhbiAxIG1hdGNoaW5nIHZhbHVlIC0gZGlzcGxheSB0aGVtCisgKiBJZiBubyBtYXRjaGluZyB2YWx1ZSAtIGRvIG5vdGhpbmcKKyAqIElmIDEgbWF0Y2hpbmcgdmFsdWUgLSBpbnNlcnQKKyAqLworc3RhdGljIHZvaWQgX2JjbWNsaV9leHRlbmRfdmFsdWUoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2NtZF9wYXJtICpwYXJtLAorICAgIGNvbnN0IGNoYXIgKnBhcnRpYWxfdmFsdWUsIGNoYXIgKmluc2VydF9zdHIsIHVpbnQzMl90IGluc2VydF9zaXplKQoreworICAgIGludCBubWF0Y2ggPSAwOworICAgIGJjbWNsaV9lbnVtX3ZhbCAqdmFscyA9IHBhcm0tPmVudW1fdGFibGU7CisgICAgY2hhciBsb25nZXN0X21hdGNoW0JDTUNMSV9NQVhfU0VBUkNIX1NVQlNUUl9MRU5HVEhdPSIiOworCisgICAgaWYgKChwYXJtLT50eXBlICE9IEJDTUNMSV9QQVJNX0VOVU0gJiYgcGFybS0+dHlwZSAhPSBCQ01DTElfUEFSTV9FTlVNX01BU0spIHx8ICF2YWxzKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBJZiBlbnVtIG1hc2ssIHBhcnRpYWwgdmFsdWUgY2FuIGJlIGEgc3VtIG9mIHZhbHVlcy4gU2tpcCBwYXN0IHRoZSBsYXN0ICcrJyBzaWduICovCisgICAgaWYgKHBhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fRU5VTV9NQVNLICYmIHBhcnRpYWxfdmFsdWUpCisgICAgeworICAgICAgICBjaGFyICpwZGVsID0gc3RycmNocihwYXJ0aWFsX3ZhbHVlLCBCQ01DTElfRU5VTV9NQVNLX0RFTF9DSEFSKTsKKyAgICAgICAgaWYgKHBkZWwpCisgICAgICAgICAgICBwYXJ0aWFsX3ZhbHVlID0gcGRlbCArIDE7CisgICAgfQorCisgICAgd2hpbGUgKHZhbHMtPm5hbWUpCisgICAgeworICAgICAgICBpZiAoIXBhcnRpYWxfdmFsdWUgfHwgIXN0cm5jbXAodmFscy0+bmFtZSwgcGFydGlhbF92YWx1ZSwgc3RybGVuKHBhcnRpYWxfdmFsdWUpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFubWF0Y2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkobG9uZ2VzdF9tYXRjaCwgdmFscy0+bmFtZSwgc2l6ZW9mKGxvbmdlc3RfbWF0Y2gpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYmNtY2xpX3VwZGF0ZV9sb25nZXN0X21hdGNoKGxvbmdlc3RfbWF0Y2gsIHZhbHMtPm5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytubWF0Y2g7CisgICAgICAgIH0KKyAgICAgICAgKyt2YWxzOworICAgIH0KKyAgICBpZiAoIW5tYXRjaCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChubWF0Y2ggPT0gMSkKKyAgICB7CisgICAgICAgIF9iY21jbGlfaW5zZXJ0KHBhcnRpYWxfdmFsdWUsIGxvbmdlc3RfbWF0Y2gsICIgIiwgaW5zZXJ0X3N0ciwgaW5zZXJ0X3NpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIGRpc3BsYXkgYWxsIG1hdGNoaW5nIHZhbHVlcyAqLworICAgIF9iY21jbGlfaW5zZXJ0KHBhcnRpYWxfdmFsdWUsIGxvbmdlc3RfbWF0Y2gsICIiLCBpbnNlcnRfc3RyLCBpbnNlcnRfc2l6ZSk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJcbiIpOworICAgIHZhbHMgPSBwYXJtLT5lbnVtX3RhYmxlOworICAgIHdoaWxlICh2YWxzLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKCFwYXJ0aWFsX3ZhbHVlIHx8ICFzdHJuY21wKHZhbHMtPm5hbWUsIHBhcnRpYWxfdmFsdWUsIHN0cmxlbihwYXJ0aWFsX3ZhbHVlKSkpCisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiAlcyIsIHZhbHMtPm5hbWUpOworICAgICAgICArK3ZhbHM7CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiXG4iKTsKK30KKworLyogY2FsY3VsYXRlIG51bWJlciBvZiBtYXRjaGluZyBwYXJhbWV0ZXIgbmFtZXMgKi8KK3N0YXRpYyBpbnQgX2JjbWNsaV9udW1fbWF0Y2hpbmdfbmFtZXMoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgY29uc3QgY2hhciAqcGFydGlhbF92YWx1ZSwgaW50ICpmaXJzdF9tYXRjaCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbm1hdGNoID0gMDsKKworICAgICpmaXJzdF9tYXRjaCA9IC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zOyBpKyspCisgICAgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0uZmxhZ3M7CisgICAgICAgIGlmICgoZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocGFydGlhbF92YWx1ZSAmJiBzdHJuY21wKG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0ubmFtZSwgcGFydGlhbF92YWx1ZSwgc3RybGVuKHBhcnRpYWxfdmFsdWUpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoKmZpcnN0X21hdGNoID09IC0xKQorICAgICAgICAgICAgKmZpcnN0X21hdGNoID0gaTsKKyAgICAgICAgKytubWF0Y2g7CisgICAgfQorICAgIHJldHVybiBubWF0Y2g7Cit9CisKKy8qIGNhbGN1bGF0ZSBsb25nZXN0IG1hdGNoaW5nIHN0cmluZy4KKyAqIHJldHVybnMgbnVtYmVyIG9mIG1hdGNoaW5nIHBhcmFtZXRlcnMKKyAqLworc3RhdGljIGludCBfYmNtY2xpX2xvbmdlc3RfbWF0Y2goYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgY29uc3QgY2hhciAqcGFydGlhbF92YWx1ZSwKKyAgICBjaGFyICpsb25nZXN0X21hdGNoLCB1aW50MzJfdCBsb25nZXN0X21hdGNoX3NpemUsIGludCAqZmlyc3RfbWF0Y2gpCit7CisgICAgaW50IG5tYXRjaDAgPSBfYmNtY2xpX251bV9tYXRjaGluZ19uYW1lcyhtb25fc2Vzc2lvbiwgcGFydGlhbF92YWx1ZSwgZmlyc3RfbWF0Y2gpOworICAgIGludCBubWF0Y2g7CisgICAgY29uc3QgY2hhciAqbWF0Y2hfbmFtZTsKKworICAgIGlmICghbm1hdGNoMCkKKyAgICAgICAgcmV0dXJuIG5tYXRjaDA7CisgICAgbWF0Y2hfbmFtZSA9IG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbKmZpcnN0X21hdGNoXS5uYW1lOworICAgIGlmIChubWF0Y2gwID09IDEpCisgICAgeworICAgICAgICBiY21jbGlfc3RybmNweShsb25nZXN0X21hdGNoLCBtYXRjaF9uYW1lLCBsb25nZXN0X21hdGNoX3NpemUpOworICAgICAgICByZXR1cm4gbm1hdGNoMDsKKyAgICB9CisgICAgYmNtY2xpX3N0cm5jcHkobG9uZ2VzdF9tYXRjaCwgbWF0Y2hfbmFtZSwgbG9uZ2VzdF9tYXRjaF9zaXplKTsKKyAgICBubWF0Y2ggPSBfYmNtY2xpX251bV9tYXRjaGluZ19uYW1lcyhtb25fc2Vzc2lvbiwgbG9uZ2VzdF9tYXRjaCwgZmlyc3RfbWF0Y2gpOworICAgIHdoaWxlIChubWF0Y2ggIT0gbm1hdGNoMCkKKyAgICB7CisgICAgICAgIGxvbmdlc3RfbWF0Y2hbc3RybGVuKGxvbmdlc3RfbWF0Y2gpLTFdID0gMDsKKyAgICAgICAgbm1hdGNoID0gX2JjbWNsaV9udW1fbWF0Y2hpbmdfbmFtZXMobW9uX3Nlc3Npb24sIGxvbmdlc3RfbWF0Y2gsIGZpcnN0X21hdGNoKTsKKyAgICB9CisgICAgcmV0dXJuIG5tYXRjaDA7Cit9CisKKy8qIGRpc3BsYXkvaW5zZXJ0IHVuc2V0IG1hdGNoaW5nIG5hbWVzCisgKiBJZiBtb3JlIHRoYW4gMSBtYXRjaGluZyB2YWx1ZSAtIGRpc3BsYXkgdGhlbQorICogSWYgbm8gbWF0Y2hpbmcgdmFsdWUgLSBkbyBub3RoaW5nCisgKiBJZiAxIG1hdGNoaW5nIHZhbHVlIC0gaW5zZXJ0CisgKi8KK3N0YXRpYyB2b2lkIF9iY21jbGlfZXh0ZW5kX25hbWUoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgY29uc3QgY2hhciAqcGFydGlhbF92YWx1ZSwKKyAgICBjaGFyICppbnNlcnRfc3RyLCB1aW50MzJfdCBpbnNlcnRfc2l6ZSkKK3sKKyAgICBjaGFyIGxvbmdlc3RfbWF0Y2hbQkNNQ0xJX01BWF9TRUFSQ0hfU1VCU1RSX0xFTkdUSF09IiI7CisgICAgaW50IGZpcnN0X21hdGNoOworICAgIGludCBubWF0Y2ggPSBfYmNtY2xpX2xvbmdlc3RfbWF0Y2gobW9uX3Nlc3Npb24sIHBhcnRpYWxfdmFsdWUsIGxvbmdlc3RfbWF0Y2gsCisgICAgICAgIHNpemVvZihsb25nZXN0X21hdGNoKSwgJmZpcnN0X21hdGNoKTsKKworICAgIGlmICghbm1hdGNoKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFwYXJ0aWFsX3ZhbHVlIHx8IHN0cmNtcChwYXJ0aWFsX3ZhbHVlLCBsb25nZXN0X21hdGNoKSkKKyAgICAgICAgX2JjbWNsaV9pbnNlcnQocGFydGlhbF92YWx1ZSwgbG9uZ2VzdF9tYXRjaCwgKG5tYXRjaCA9PSAxKSA/ICI9IiA6ICIiLCBpbnNlcnRfc3RyLCBpbnNlcnRfc2l6ZSk7CisgICAgZWxzZQorICAgICAgICBfYmNtY2xpX2hlbHBfcG9wdWxhdGVkX2NtZChtb25fc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmN1cmNtZCwgcGFydGlhbF92YWx1ZSwgQkNNT1NfVFJVRSk7Cit9CisKK3N0YXRpYyBpbnQgX2JjbWNsaV9leHRlbmRfcGFybXMoIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlycywKKyAgICBpbnQgbnBhaXJzLCBiY21vc19ib29sIGxhc3RfaXNfc3BhY2UsIGNoYXIgKmluc2VydF9zdHIsIHVpbnQzMl90IGluc2VydF9zaXplKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGludCBsYXN0ID0gMDsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmhlbHBfcGFybSA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICByYyA9IF9iY21jbGlfcG9wdWxhdGVfcGFybXMobW9uX3Nlc3Npb24sIG1vbl9zZXNzaW9uLT5jdXJjbWQsIHBhaXJzLCBucGFpcnMsIEJDTU9TX1RSVUUsICZsYXN0KTsKKyAgICBpZiAoIXJjKQorICAgIHsKKyAgICAgICAgLyogU28gZmFyIHNvIGdvb2QgKi8KKyAgICAgICAgLyogSWYgdGhlcmUgaXMgdW5zZXQgbWFuZGF0b3J5IHBhcmFtZXRlciAtIGluc2VydCBpdHMgbmFtZS4KKyAgICAgICAgICogT3RoZXJ3aXNlLCBkaXNwbGF5IGxpc3Qgb2YgdW5zZXQgcGFyYW1ldGVycworICAgICAgICAgKi8KKyAgICAgICAgLyogRmluZCBtYW5kYXRvcnkgcGFyYW1ldGVyIHRoYXQgaXMgc3RpbGwgdW5hc3NpZ25lZCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbW9uX3Nlc3Npb24tPm51bV9wYXJtczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0uZmxhZ3M7CisgICAgICAgICAgICBpZiAoIShmbGFncyAmIChCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMIHwgQkNNQ0xJX1BBUk1fRkxBR19ERUZWQUwgfCBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVscF9wYXJtID0gJm1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlbHBfcGFybSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFsYXN0X2lzX3NwYWNlKQorICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGluc2VydF9zdHIsICIgIiwgaW5zZXJ0X3NpemUpOworICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoaW5zZXJ0X3N0ciwgaGVscF9wYXJtLT5uYW1lLCBpbnNlcnRfc2l6ZSk7CisgICAgICAgICAgICBiY21jbGlfc3RybmNhdChpbnNlcnRfc3RyLCAiPSIsIGluc2VydF9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsYXN0IDwgbW9uX3Nlc3Npb24tPm51bV9wYXJtcykKKyAgICAgICAgICAgIF9iY21jbGlfaGVscF9wb3B1bGF0ZWRfY21kKG1vbl9zZXNzaW9uLCBtb25fc2Vzc2lvbi0+Y3VyY21kLCBOVUxMLCBCQ01PU19UUlVFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUGFyc2luZyBmYWlsZWQuIFNlZSB3aGF0IHN0b3BwZWQgYXQgKi8KKyAgICAgICAgaWYgKGxhc3QgPCBtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfbmFtZV92YWx1ZSAqbGFzdF9wYWlyOworCisgICAgICAgICAgICBsYXN0X3BhaXIgPSAmcGFpcnNbbGFzdF07CisgICAgICAgICAgICBpZiAobGFzdF9wYWlyLT5uYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFRyeSB0byBpZGVudGlmeSBieSBuYW1lICovCisgICAgICAgICAgICAgICAgaGVscF9wYXJtID0gX2JjbWNsaV9maW5kX25hbWVkX3Bhcm0obW9uX3Nlc3Npb24sIGxhc3RfcGFpci0+bmFtZSA/IGxhc3RfcGFpci0+bmFtZSA6IGxhc3RfcGFpci0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhlbHBfcGFybSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBMb29raW5nIGZvciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICBfYmNtY2xpX2V4dGVuZF92YWx1ZShtb25fc2Vzc2lvbiwgaGVscF9wYXJtLCBsYXN0X3BhaXItPnZhbHVlLCBpbnNlcnRfc3RyLCBpbnNlcnRfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTG9va2luZyBmb3IgcGFydGlhbCBuYW1lICovCisgICAgICAgICAgICAgICAgX2JjbWNsaV9leHRlbmRfbmFtZShtb25fc2Vzc2lvbiwgbGFzdF9wYWlyLT5uYW1lID8gbGFzdF9wYWlyLT5uYW1lIDogbGFzdF9wYWlyLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0X3N0ciwgaW5zZXJ0X3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9iY21jbGlfZnJlZV9zZXNzaW9uX3ZhbHVlX3N0YXR1cyhtb25fc2Vzc2lvbik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogSWRlbnRpZnkgdG9rZW4gaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSAqLworc3RhdGljIGJjbWNsaV9lbnRyeSAqX2JjbWNsaV9zZWFyY2hfdG9rZW4xKCBiY21jbGlfZW50cnkgKnBfZGlyLCBjb25zdCBjaGFyICoqcF9uYW1lLCBpbnQgbmFtZV9sZW4gKQoreworICAgIGJjbWNsaV9lbnRyeSAqcF90b2tlbiA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqbmFtZSA9ICpwX25hbWU7CisgICAgYmNtY2xpX3Rva2VuX3R5cGUgdHlwZT1fYmNtY2xpX2FuYWx5emVfdG9rZW4obmFtZSk7CisKKyAgICAvKiBOYW1lIGNhbiBiZSBxdWFsaWZpZWQgKi8KKyAgICBpZiAodHlwZSA9PSBCQ01DTElfVE9LRU5fVkFMVUUgJiYgIXN0cm5jbXAobmFtZSwgQkNNQ0xJX1VQX1NUUiwgbmFtZV9sZW4pKQorICAgICAgICB0eXBlID0gQkNNQ0xJX1RPS0VOX1VQOworCisgICAgc3dpdGNoKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTUNMSV9UT0tFTl9ST09UOgorICAgICAgICAgICAgcF90b2tlbiA9IF9iY21jbGlfcm9vdF9kaXI7CisgICAgICAgICAgICAqcF9uYW1lID0gbmFtZSArIHN0cmxlbihCQ01DTElfUk9PVF9TVFIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX1VQOgorICAgICAgICAgICAgaWYgKHBfZGlyLT5wYXJlbnQpCisgICAgICAgICAgICAgICAgcF90b2tlbiA9IHBfZGlyLT5wYXJlbnQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcF90b2tlbiA9IHBfZGlyOworICAgICAgICAgICAgKnBfbmFtZSA9IG5hbWUgKyBzdHJsZW4oQkNNQ0xJX1VQX1NUUikgKyAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX05BTUU6CisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX1ZBTFVFOgorICAgICAgICAgICAgLyogQ2hlY2sgYWxpYXMgKi8KKyAgICAgICAgICAgIHBfdG9rZW4gPSBwX2Rpci0+dS5kaXIuZmlyc3Q7CisgICAgICAgICAgICB3aGlsZSAoIHBfdG9rZW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwX3Rva2VuLT5hbGlhcyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVfbGVuID09IHBfdG9rZW4tPmFsaWFzX2xlbikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFfYmNtY2xpX3N0cmljbXAocF90b2tlbi0+YWxpYXMsIG5hbWUsIHBfdG9rZW4tPmFsaWFzX2xlbikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHBfdG9rZW4gPSBwX3Rva2VuLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwX3Rva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9lbnRyeSAqcGFydGlhbF9tYXRjaCA9IE5VTEw7CisgICAgICAgICAgICAgICAgLyogQ2hlY2sgbmFtZSAqLworICAgICAgICAgICAgICAgIHBfdG9rZW4gPSBwX2Rpci0+dS5kaXIuZmlyc3Q7CisgICAgICAgICAgICAgICAgd2hpbGUoIHBfdG9rZW4gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfYmNtY2xpX3N0cmljbXAocF90b2tlbi0+bmFtZSwgbmFtZSwgbmFtZV9sZW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZV9sZW4gPT0gc3RybGVuKHBfdG9rZW4tPm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJ0aWFsX21hdGNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxfbWF0Y2ggPSBwX3Rva2VuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBfdG9rZW4gPSBwX3Rva2VuLT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXBfdG9rZW4pCisgICAgICAgICAgICAgICAgICAgIHBfdG9rZW4gPSBwYXJ0aWFsX21hdGNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBfbmFtZSA9IG5hbWUgKyBuYW1lX2xlbiArIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBwX3Rva2VuOworfQorCisKKy8qIFNlYXJjaCBhIHRva2VuIGJ5IG5hbWUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICogVGhlIG5hbWUgY2FuIGJlIHF1YWxpZmllZCAoY29udGFpbiBwYXRoKQorICovCitzdGF0aWMgYmNtY2xpX2VudHJ5ICpfYmNtY2xpX3NlYXJjaF90b2tlbiggYmNtY2xpX2VudHJ5ICpwX2RpciwgY29uc3QgY2hhciAqbmFtZSApCit7CisgICAgYmNtY2xpX2VudHJ5ICpwX3Rva2VuOworICAgIGNvbnN0IGNoYXIgKm5hbWUwID0gbmFtZTsKKyAgICBjb25zdCBjaGFyICpwX3NsYXNoOworCisgICAgaWYgKCFuYW1lWzBdKQorICAgICAgICByZXR1cm4gcF9kaXI7CisKKyAgICAvKiBDaGVjayBpZiBuYW1lIGlzIHF1YWxpZmllZCAqLworICAgIGRvCisgICAgeworICAgICAgICBwX3NsYXNoID0gc3RyY2hyKG5hbWUsICcvJyk7CisgICAgICAgIGlmIChwX3NsYXNoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocF9zbGFzaCA9PSBuYW1lMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX2RpciA9IHBfdG9rZW4gPSBfYmNtY2xpX3Jvb3RfZGlyOworICAgICAgICAgICAgICAgIG5hbWUgPSBwX3NsYXNoICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX3Rva2VuID0gX2JjbWNsaV9zZWFyY2hfdG9rZW4xKHBfZGlyLCAmbmFtZSwgcF9zbGFzaCAtIG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChwX3Rva2VuICYmIChwX3Rva2VuLT5zZWwgPT0gQkNNQ0xJX0VOVFJZX0RJUikpCisgICAgICAgICAgICAgICAgICAgIHBfZGlyID0gcF90b2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfdG9rZW4gPSBfYmNtY2xpX3NlYXJjaF90b2tlbjEocF9kaXIsICZuYW1lLCBzdHJsZW4obmFtZSkpOworICAgICAgICB9CisgICAgfSB3aGlsZSAocF9zbGFzaCAmJiBwX3Rva2VuICYmICpuYW1lKTsKKworICAgIHJldHVybiBwX3Rva2VuOworfQorCisKKworLyogRGlzcGxheSBoZWxwIGZvciBlYWNoIGVudHJ5IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLworc3RhdGljIHZvaWQgIF9iY21jbGlfaGVscF9kaXIoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpwX2RpcikKK3sKKyAgICBiY21jbGlfc2Vzc2lvbiAqaGVscF9zZXNzaW9uID0gX2JjbWNsaV9oZWxwX3Nlc3Npb25fb3Blbihtb25fc2Vzc2lvbi0+c2Vzc2lvbik7CisgICAgYmNtY2xpX2VudHJ5ICpwX3Rva2VuOworICAgIGNoYXIgYnVmZmVyW0JDTUNMSV9NQVhfUVVBTF9OQU1FX0xFTkdUSF07CisKKyAgICBfYmNtY2xpX3F1YWxpZmllZF9uYW1lKHBfZGlyLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChoZWxwX3Nlc3Npb24sICJEaXJlY3RvcnkgJXMvIC0gJXNcbiIsIGJ1ZmZlciwgcF9kaXItPmhlbHApOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGhlbHBfc2Vzc2lvbiwgIkNvbW1hbmRzOlxuIik7CisKKyAgICBwX3Rva2VuID0gcF9kaXItPnUuZGlyLmZpcnN0OworICAgIHdoaWxlICggcF90b2tlbiApCisgICAgeworICAgICAgICBpZiAoYmNtY2xpX3Nlc3Npb25fYWNjZXNzX3JpZ2h0KGhlbHBfc2Vzc2lvbikgPj0gcF90b2tlbi0+YWNjZXNzX3JpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocF90b2tlbi0+c2VsID09IEJDTUNMSV9FTlRSWV9ESVIpCisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoaGVscF9zZXNzaW9uLCAiXHQlcy86ICAlcyBkaXJlY3RvcnlcbiIsIHBfdG9rZW4tPm5hbWUsIHBfdG9rZW4tPmhlbHAgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyICpwZW9sID0gc3RyY2hyKHBfdG9rZW4tPmhlbHAsICdcbicpOworICAgICAgICAgICAgICAgIGludCBoZWxwX2xlbiA9IHBlb2wgPyBwZW9sIC0gcF90b2tlbi0+aGVscCA6IChpbnQpc3RybGVuKHBfdG9rZW4tPmhlbHApOworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGhlbHBfc2Vzc2lvbiwgIlx0JXMoJWQgcGFybXMpOiAlLipzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdG9rZW4tPm5hbWUsIHBfdG9rZW4tPnUuY21kLm51bV9wYXJtcywgaGVscF9sZW4sIHBfdG9rZW4tPmhlbHAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwX3Rva2VuID0gcF90b2tlbi0+bmV4dDsKKyAgICB9CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoaGVscF9zZXNzaW9uLCAiVHlwZSA/IDxuYW1lPiBmb3IgY29tbWFuZCBoZWxwLCBcIi9cIi1yb290LCBcIi4uXCItdXBwZXJcbiIgKTsKKyAgICBfYmNtY2xpX2hlbHBfc2Vzc2lvbl9wcmludF9hbmRfY2xvc2UobW9uX3Nlc3Npb24tPnNlc3Npb24sIGhlbHBfc2Vzc2lvbik7Cit9CisKKworLyogRGlzcGxheSBoZWxwIGEgdG9rZW4gKi8KK3N0YXRpYyB2b2lkIF9iY21jbGlfaGVscF9wb3B1bGF0ZWRfY21kKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF90b2tlbiwKKyAgICBjb25zdCBjaGFyICpwYXJ0aWFsX21hdGNoLCBiY21vc19ib29sIHN1cHByZXNzX2Fzc2lnbmVkKQoreworICAgIGNoYXIgdG1wWzgwXTsKKyAgICBjaGFyIGJyYSwga2V0OworICAgIHVpbnQxNl90IGk7CisKKyAgICBpZiAoc3VwcHJlc3NfYXNzaWduZWQpCisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiXG4iKTsKKyAgICBmb3IgKCBpPTA7IGk8bW9uX3Nlc3Npb24tPm51bV9wYXJtczsgaSsrICkKKyAgICB7CisgICAgICAgIGJjbWNsaV9jbWRfcGFybSAqY3VyX3Bhcm0gPSAmbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1tpXTsKKyAgICAgICAgaWYgKHN1cHByZXNzX2Fzc2lnbmVkICYmIChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocGFydGlhbF9tYXRjaCAmJiBtZW1jbXAocGFydGlhbF9tYXRjaCwgY3VyX3Bhcm0tPm5hbWUsIHN0cmxlbihwYXJ0aWFsX21hdGNoKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKQorICAgICAgICB7CisgICAgICAgICAgICBicmEgPSAnWyc7CisgICAgICAgICAgICBrZXQ9J10nOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnJhID0gJzwnOworICAgICAgICAgICAga2V0PSc+JzsKKyAgICAgICAgfQorICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIlx0JWMlcyglcykiLCBicmEsIGN1cl9wYXJtLT5uYW1lLCBfYmNtY2xpX2dldF90eXBlX25hbWUoY3VyX3Bhcm0pICk7CisgICAgICAgIGlmIChjdXJfcGFybS0+bWF4X2FycmF5X3NpemUgfHwgY3VyX3Bhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fQlVGRkVSKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBudW1fZW50cmllcyA9IChjdXJfcGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9CVUZGRVIpID8gY3VyX3Bhcm0tPnZhbHVlLmJ1ZmZlci5sZW4gOiBjdXJfcGFybS0+bWF4X2FycmF5X3NpemU7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIlsldV0iLCBudW1fZW50cmllcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cl9wYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX0VOVU0gfHwgY3VyX3Bhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fRU5VTV9NQVNLKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlcz1jdXJfcGFybS0+ZW51bV90YWJsZTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiIHsiKTsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMtPm5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyE9Y3VyX3Bhcm0tPmVudW1fdGFibGUpCisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiLCAiKTsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiVzIiwgdmFsdWVzLT5uYW1lKTsKKyAgICAgICAgICAgICAgICArK3ZhbHVlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAifSIpOworICAgICAgICB9CisgICAgICAgIGlmICgoY3VyX3Bhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19ERUZWQUwpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIj0iKTsKKyAgICAgICAgICAgIGN1cl9wYXJtLT5mb3JtYXRfY2IoY3VyX3Bhcm0sIGN1cl9wYXJtLT52YWx1ZSwgdG1wLCBzaXplb2YodG1wKSk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiVzIiwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfUkFOR0UpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfcGFybV92YWx1ZSBsb3dfdmFsID0geyAubnVtYmVyID0gY3VyX3Bhcm0tPmxvd192YWwgfTsKKyAgICAgICAgICAgIGJjbWNsaV9wYXJtX3ZhbHVlIGhpX3ZhbCA9IHsgLm51bWJlciA9IGN1cl9wYXJtLT5oaV92YWwgfTsKKworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICIgKCIpOworICAgICAgICAgICAgY3VyX3Bhcm0tPmZvcm1hdF9jYihjdXJfcGFybSwgbG93X3ZhbCwgdG1wLCBzaXplb2YodG1wKSk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiVzLi4iLCB0bXApOworICAgICAgICAgICAgY3VyX3Bhcm0tPmZvcm1hdF9jYihjdXJfcGFybSwgaGlfdmFsLCB0bXAsIHNpemVvZih0bXApKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiJXMpIiwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiVjICIsIGtldCk7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiLSAlc1xuIiwgY3VyX3Bhcm0tPmRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICAvKiBQcmludCBleHRyYSBoZWxwIGlmIGNvbW1hbmQgaGFzIHVucmVzb2x2ZWQgc2VsZWN0b3IgKi8KKyAgICBpZiAobW9uX3Nlc3Npb24tPm51bV9wYXJtcyAmJgorICAgICAgICAobW9uX3Nlc3Npb24tPmNtZF9wYXJtc1ttb25fc2Vzc2lvbi0+bnVtX3Bhcm1zLTFdLmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUikgJiYKKyAgICAgICAgIShtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zW21vbl9zZXNzaW9uLT5udW1fcGFybXMtMV0uZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKnNlbF9uYW1lID0gbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1ttb25fc2Vzc2lvbi0+bnVtX3Bhcm1zLTFdLm5hbWU7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiQWRkICVzPSVzX3ZhbHVlIHRvIHNlZSAlcy1zcGVjaWZpYyBwYXJhbWV0ZXJzXG4iLAorICAgICAgICAgICAgc2VsX25hbWUsIHNlbF9uYW1lLCBzZWxfbmFtZSk7CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiXG4iKTsKK30KKworCisvKiBEaXNwbGF5IGhlbHAgYSB0b2tlbiAqLworc3RhdGljIHZvaWQgX2JjbWNsaV9oZWxwX2VudHJ5KGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF90b2tlbiwKKyAgICBiY21jbGlfbmFtZV92YWx1ZSAqcGFpcnMsIGludCBucGFpcnMsIGJjbW9zX2Jvb2wgc3VwcHJlc3NfZXJyX3ByaW50KQoreworICAgIGNoYXIgYnVmZmVyW0JDTUNMSV9NQVhfUVVBTF9OQU1FX0xFTkdUSF07CisKKyAgICBpZiAocF90b2tlbi0+c2VsID09IEJDTUNMSV9FTlRSWV9ESVIpCisgICAgeworICAgICAgICBfYmNtY2xpX2hlbHBfZGlyKG1vbl9zZXNzaW9uLCBwX3Rva2VuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFBvcHVsYXRlIHBhcmFtZXRlciB0YWJsZSAqLworICAgIF9iY21jbGlfcG9wdWxhdGVfcGFybXMobW9uX3Nlc3Npb24sIHBfdG9rZW4sIHBhaXJzLCBucGFpcnMsIHN1cHByZXNzX2Vycl9wcmludCwgTlVMTCk7CisKKyAgICBfYmNtY2xpX3F1YWxpZmllZF9uYW1lKHBfdG9rZW4sIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiJXM6IFx0JXNcbiIsIGJ1ZmZlciwgcF90b2tlbi0+aGVscCApOworICAgIGlmIChwX3Rva2VuLT51LmNtZC5udW1fcGFybXMpCisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiUGFyYW1ldGVyczpcbiIpOworICAgIF9iY21jbGlfaGVscF9wb3B1bGF0ZWRfY21kKG1vbl9zZXNzaW9uLCBwX3Rva2VuLCBOVUxMLCBCQ01PU19GQUxTRSk7CisgICAgX2JjbWNsaV9mcmVlX3Nlc3Npb25fdmFsdWVfc3RhdHVzKG1vbl9zZXNzaW9uKTsKK30KKworCisvKiBDaG9vc2UgdW5pcXVlIGFsaWFzIGZvciA8bmFtZT4gaW4gPHBfZGlyPiAqLworLyogQ3VycmVudGx5IG9ubHkgc2luZ2xlLWNoYXJhY3RlciBhbGlhc2VzIGFyZSBzdXBwb3J0ZWQgKi8KK3N0YXRpYyB2b2lkIF9fYmNtY2xpX2Nob29zZUFsaWFzKGJjbWNsaV9lbnRyeSAqcF9kaXIsIGJjbWNsaV9lbnRyeSAqcF9uZXdfdG9rZW4sIGludCBmcm9tKQoreworICAgIGJjbWNsaV9lbnRyeSAqcF90b2tlbjsKKyAgICBpbnQgICAgICAgICBpOworICAgIGNoYXIgICAgICAgIGM7CisKKyAgICBfYmNtY2xpX3N0cmx3ciggcF9uZXdfdG9rZW4tPm5hbWUgKTsKKyAgICBpID0gZnJvbTsKKyAgICB3aGlsZSAoIHBfbmV3X3Rva2VuLT5uYW1lW2ldICkKKyAgICB7CisgICAgICAgIGMgPSBwX25ld190b2tlbi0+bmFtZVtpXTsKKyAgICAgICAgcF90b2tlbiA9IHBfZGlyLT51LmRpci5maXJzdDsKKworICAgICAgICB3aGlsZSAoIHBfdG9rZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocF90b2tlbi0+YWxpYXMgJiYKKyAgICAgICAgICAgICAgICAgICAgKHRvbG93ZXIoICpwX3Rva2VuLT5hbGlhcyApID09IGMpICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChzdHJsZW4ocF90b2tlbi0+bmFtZSk8PTIgJiYgdG9sb3dlcihwX3Rva2VuLT5uYW1lWzBdKT09YykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHBfdG9rZW4gPSBwX3Rva2VuLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChwX3Rva2VuKQorICAgICAgICAgICAgKytpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfbmV3X3Rva2VuLT5uYW1lW2ldID0gdG91cHBlciggYyApOworICAgICAgICAgICAgcF9uZXdfdG9rZW4tPmFsaWFzICAgPSAmcF9uZXdfdG9rZW4tPm5hbWVbaV07CisgICAgICAgICAgICBwX25ld190b2tlbi0+YWxpYXNfbGVuID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvKiBpc3VwcGVyIHdyYXBwZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9iY21jbGlfaXN1cHBlcihjaGFyIGMpCit7CisgICAgcmV0dXJuIGlzdXBwZXIoKGludCljKTsKK30KKworc3RhdGljIHZvaWQgX2JjbWNsaV9jaG9vc2VfYWxpYXMoYmNtY2xpX2VudHJ5ICpwX2RpciwgYmNtY2xpX2VudHJ5ICpwX25ld190b2tlbikKK3sKKyAgICBpbnQgaT0wOworICAgIHBfbmV3X3Rva2VuLT5hbGlhc19sZW4gPSAwOworICAgIHBfbmV3X3Rva2VuLT5hbGlhcyA9IE5VTEw7CisgICAgLyogRG9uJ3QgdHJ5IHRvIGFsaWFzIHNvbWV0aGluZyBzaG9ydCAqLworICAgIGlmIChzdHJsZW4ocF9uZXdfdG9rZW4tPm5hbWUpIDwgQkNNQ0xJX01JTl9OQU1FX0xFTkdUSF9GT1JfQUxJQVMpCisgICAgICAgIHJldHVybjsKKyAgICAvKiBUcnkgcHJlLXNldCBhbGlhcyAxc3QgKi8KKyAgICB3aGlsZSAoIHBfbmV3X3Rva2VuLT5uYW1lW2ldICkKKyAgICB7CisgICAgICAgIGlmIChfYmNtY2xpX2lzdXBwZXIocF9uZXdfdG9rZW4tPm5hbWVbaV0pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgaWYgKHBfbmV3X3Rva2VuLT5uYW1lW2ldKQorICAgICAgICBfX2JjbWNsaV9jaG9vc2VBbGlhcyhwX2RpciwgcF9uZXdfdG9rZW4sIGkpOworICAgIGlmIChwX25ld190b2tlbi0+YWxpYXMgIT0gJnBfbmV3X3Rva2VuLT5uYW1lW2ldKQorICAgICAgICBfX2JjbWNsaV9jaG9vc2VBbGlhcyhwX2RpciwgcF9uZXdfdG9rZW4sIDApOworfQorCisKKy8qIENvbnZlcnQgc3RyaW5nIHMgdG8gbG93ZXIgY2FzZS4gUmV0dXJuIHBvaW50ZXIgdG8gcyAqLworc3RhdGljIGNoYXIgICogX2JjbWNsaV9zdHJsd3IoIGNoYXIgKnMgKQoreworICAgIGNoYXIgICpzMD1zOworCisgICAgd2hpbGUgKCAqcyApCisgICAgeworICAgICAgICAqcyA9IHRvbG93ZXIoICpzICk7CisgICAgICAgICsrczsKKyAgICB9CisKKyAgICByZXR1cm4gczA7Cit9CisKKworLyogQ29tcGFyZSBzdHJpbmdzIGNhc2UgaW5jZW5zaXRpdmUgKi8KK3N0YXRpYyBpbnQgX2JjbWNsaV9zdHJpY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgaW50IGxlbikKK3sKKyAgICBpbnQgIGk7CisKKyAgICBmb3IgKCBpPTA7IChpPGxlbiB8fCBsZW48MCk7IGkrKyApCisgICAgeworICAgICAgICBpZiAodG9sb3dlciggczFbaV0pICAhPSB0b2xvd2VyKCBzMltpXSApKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGlmICghczFbaV0pCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9iY21jbGlfZ2V0X3R5cGVfbmFtZShjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0pCit7CisgICAgYmNtY2xpX3Bhcm1fdHlwZSB0eXBlID0gcGFybS0+dHlwZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZV9uYW1lW10gPSB7CisgICAgICAgIFtCQ01DTElfUEFSTV9ERUNJTUFMXSAgICA9ICJkZWNpbWFsIiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX0RFQ0lNQUw2NF0gID0gImRlY2ltYWw2NCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9VREVDSU1BTF0gICA9ICJ1ZGVjaW1hbCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9VREVDSU1BTDY0XSA9ICJ1ZGVjaW1hbDY0IiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX0hFWF0gICAgICAgID0gImhleCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9IRVg2NF0gICAgICA9ICJoZXg2NCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9OVU1CRVJdICAgICA9ICJudW1iZXIiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fTlVNQkVSNjRdICAgPSAibnVtYmVyNjQiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fVU5VTUJFUl0gICAgPSAidW51bWJlciIsCisgICAgICAgIFtCQ01DTElfUEFSTV9VTlVNQkVSNjRdICA9ICJ1bnVtYmVyNjQiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fRkxPQVRdICAgICAgPSAiZmxvYXQiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fRE9VQkxFXSAgICAgPSAiZG91YmxlIiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX0VOVU1dICAgICAgID0gImVudW0iLAorICAgICAgICBbQkNNQ0xJX1BBUk1fRU5VTV9NQVNLXSAgPSAiZW51bV9tYXNrIiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX1NUUklOR10gICAgID0gInN0cmluZyIsCisgICAgICAgIFtCQ01DTElfUEFSTV9JUF0gICAgICAgICA9ICJJUCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9JUFY2XSAgICAgICA9ICJJUHY2IiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX01BQ10gICAgICAgID0gIk1BQyIsCisgICAgICAgIFtCQ01DTElfUEFSTV9CVUZGRVJdICAgICA9ICJidWZmZXIiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fVVNFUkRFRl0gICAgPSAidXNlcmRlZiIsCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdW5kZWZpbmVkID0gInVuZGVmaW5lZCI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnNlbGVjdG9yID0gInNlbGVjdG9yIjsKKyAgICBpZiAodHlwZSA+IEJDTUNMSV9QQVJNX1VTRVJERUYgfHwgIXR5cGVfbmFtZVt0eXBlXSkKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICBpZiAodHlwZSA9PSBCQ01DTElfUEFSTV9FTlVNICYmIChwYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1IpKQorICAgICAgICByZXR1cm4gc2VsZWN0b3I7CisgICAgcmV0dXJuIHR5cGVfbmFtZVt0eXBlXTsKK30KKworLyogQXNzaWduIGRlZmF1bHQgY2FsbGJhY2tzICovCitzdGF0aWMgdm9pZCBfYmNtY2xpX2Fzc2lnbl9jYWxsYmFja3MoYmNtY2xpX2NtZF9wYXJtICpwYXJtKQoreworICAgIGlmIChwYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX0VOVU0pCisgICAgeworICAgICAgICBwYXJtLT5zY2FuX2NiID0gX2JjbWNsaV9lbnVtX3NjYW5fY2I7CisgICAgICAgIHBhcm0tPmZvcm1hdF9jYiA9IF9iY21jbGlfZW51bV9mb3JtYXRfY2I7CisgICAgfQorICAgIGVsc2UgaWYgKHBhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fRU5VTV9NQVNLKQorICAgIHsKKyAgICAgICAgcGFybS0+c2Nhbl9jYiA9IF9iY21jbGlfZW51bV9tYXNrX3NjYW5fY2I7CisgICAgICAgIHBhcm0tPmZvcm1hdF9jYiA9IF9iY21jbGlfZW51bV9tYXNrX2Zvcm1hdF9jYjsKKyAgICB9CisgICAgZWxzZSBpZiAocGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9CVUZGRVIpCisgICAgeworICAgICAgICBpZiAoIXBhcm0tPnNjYW5fY2IpCisgICAgICAgICAgICBwYXJtLT5zY2FuX2NiID0gX2JjbWNsaV9idWZmZXJfc2Nhbl9jYjsKKyAgICAgICAgaWYgKCFwYXJtLT5mb3JtYXRfY2IpCisgICAgICAgICAgICBwYXJtLT5mb3JtYXRfY2IgPSBfYmNtY2xpX2RmdF9mb3JtYXRfY2I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICghcGFybS0+c2Nhbl9jYikKKyAgICAgICAgICAgIHBhcm0tPnNjYW5fY2IgPSBfYmNtY2xpX2RmdF9zY2FuX2NiOworICAgICAgICBpZiAoIXBhcm0tPmZvcm1hdF9jYikKKyAgICAgICAgICAgIHBhcm0tPmZvcm1hdF9jYiA9IF9iY21jbGlfZGZ0X2Zvcm1hdF9jYjsKKyAgICB9Cit9CisKKworLyogQ29udmVydCBoZXgtc3RyaW5nIHRvIGJpbmFyeSBkYXRhLgorICogUmV0dXJuczogY29udmVydGVkIGxlbmd0aCA+PTAgb3IgZXJyb3IgPCAwCisgKi8KK3N0YXRpYyBpbnQgX2JjbWNsaV9zdHJoZXgoY29uc3QgY2hhciAqc3JjLCB1aW50OF90ICpkc3QsIHVpbnQxNl90IGRzdF9sZW4pCit7CisgICAgdWludDE2X3Qgc3JjX2xlbiA9ICh1aW50MTZfdClzdHJsZW4oIHNyYyApOworICAgIHVpbnQxNl90IGkgPSBzcmNfbGVuLCBqLCBzaGlmdCA9IDA7CisKKyAgICBpZiAoICFkc3QgfHwgIWRzdF9sZW4gfHwgKHNyY19sZW4gPiAyKmRzdF9sZW4pIHx8IChzcmNfbGVuJTIpICkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIGhleCBidWZmZXIgbGVuZ3RoIGFuZCBmaWxsIGl0IHVwIGZyb20gcmlnaHQtdG8tbGVmdAorICAgICAqIGluIG9yZGVyIHRvIHN0YXJ0IHRoZSBwcm9jZXNzIGZyb20gTFMgbmliYmxlCisgICAgICovCisgICAgZHN0X2xlbiA9IHNyY19sZW4gLyAyOworICAgIG1lbXNldChkc3QsIDAsIGRzdF9sZW4pOworICAgIGogPSBkc3RfbGVuLTE7CisgICAgZG8KKyAgICB7CisgICAgICAgIGludCBjID0gc3JjWy0taV07CisKKyAgICAgICAgaWYgKCAoYz49JzAnKSAmJiAoYzw9JzknKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGMgPSBjIC0gJzAnOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAoYz49J2EnKSAmJiAoYzw9J2YnKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGMgPSAweEEgKyBjIC0gJ2EnOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAoYz49J0EnKSAmJiAoYzw9J0YnKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGMgPSAweEEgKyBjIC0gJ0EnOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGRzdFtqXSB8PSAodWludDhfdCkoYzw8c2hpZnQpOyAvKiBzaGlmdCBjYW4gaGF2ZSAxIG9mIDIgdmFsdWVzOiAwIGFuZCA0ICovCisKKyAgICAgICAgaiAgICAgLT0gc2hpZnQ+PjI7ICAgICAgICAgICAgICAvKiBtb3ZlIHRvIHRoZSBuZXh0IGJ5dGUgaWYgd2UndmUganVzdCBmaWxsZWQgdGhlIG1zIG5pYmJsZSAqLworICAgICAgICBzaGlmdCBePSA0OyAgICAgICAgICAgICAgICAgICAgIC8qIGFsdGVybmF0ZSBuaWJibGVzICovCisKKyAgICB9IHdoaWxlICggaSApOworCisgICAgcmV0dXJuIGRzdF9sZW47Cit9CisKKy8qIERlZmF1bHQgZnVuY3Rpb24gZm9yIHN0cmluZy0+dmFsdWUgY29udmVyc2lvbi4KKyAqIFJldHVybnMgMCBpZiBPSworICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9kZnRfc2Nhbl9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlICp2YWx1ZSwgY29uc3QgY2hhciAqc3RyaW5nX3ZhbCkKK3sKKyAgICBjaGFyICpwX2VuZCA9IE5VTEw7CisgICAgaW50IG47CisKKyAgICBpZiAocGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9VREVDSU1BTCB8fAorICAgICAgICBwYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX1VERUNJTUFMNjQgfHwKKyAgICAgICAgcGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9VTlVNQkVSIHx8CisgICAgICAgIHBhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fVU5VTUJFUjY0KQorICAgIHsKKyAgICAgICAgLyogc3RydG91bCByZXR1cm5zIE9LIGV2ZW4gd2hlbiBwYXJzaW5nIGEgbmVnYXRpdmUgbnVtYmVyICovCisgICAgICAgIGlmIChzdHJpbmdfdmFsWzBdID09ICctJykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaChwYXJtLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9ERUNJTUFMOgorICAgICAgICAgICAgdmFsdWUtPm51bWJlciA9IHN0cnRvbChzdHJpbmdfdmFsLCAmcF9lbmQsIDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VERUNJTUFMOgorICAgICAgICAgICAgdmFsdWUtPnVudW1iZXIgPSBzdHJ0b3VsKHN0cmluZ192YWwsICZwX2VuZCwgMTApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fREVDSU1BTDY0OgorICAgICAgICAgICAgdmFsdWUtPm51bWJlcjY0ID0gc3RydG9sbChzdHJpbmdfdmFsLCAmcF9lbmQsIDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VERUNJTUFMNjQ6CisgICAgICAgICAgICB2YWx1ZS0+dW51bWJlcjY0ID0gc3RydG91bGwoc3RyaW5nX3ZhbCwgJnBfZW5kLCAxMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9IRVg6CisgICAgICAgICAgICB2YWx1ZS0+dW51bWJlciA9IHN0cnRvdWwoc3RyaW5nX3ZhbCwgJnBfZW5kLCAxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9IRVg2NDoKKyAgICAgICAgICAgIHZhbHVlLT51bnVtYmVyNjQgPSBzdHJ0b3VsbChzdHJpbmdfdmFsLCAmcF9lbmQsIDE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX05VTUJFUjoKKyAgICAgICAgICAgIHZhbHVlLT5udW1iZXIgPSBzdHJ0b2woc3RyaW5nX3ZhbCwgJnBfZW5kLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VOVU1CRVI6CisgICAgICAgICAgICB2YWx1ZS0+dW51bWJlciA9IHN0cnRvdWwoc3RyaW5nX3ZhbCwgJnBfZW5kLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX05VTUJFUjY0OgorICAgICAgICAgICAgdmFsdWUtPm51bWJlcjY0ID0gc3RydG9sbChzdHJpbmdfdmFsLCAmcF9lbmQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fVU5VTUJFUjY0OgorICAgICAgICAgICAgdmFsdWUtPnVudW1iZXI2NCA9IHN0cnRvdWxsKHN0cmluZ192YWwsICZwX2VuZCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9GTE9BVDoKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9ET1VCTEU6CisgICAgICAgICAgICB2YWx1ZS0+ZCA9IHN0cnRvZChzdHJpbmdfdmFsLCAmcF9lbmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fTUFDOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBtMCwgbTEsIG0yLCBtMywgbTQsIG01OworICAgICAgICAgICAgbiA9IHNzY2FuZihzdHJpbmdfdmFsLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgICAgICAgICZtMCwgJm0xLCAmbTIsICZtMywgJm00LCAmbTUpOworICAgICAgICAgICAgaWYgKG4gIT0gNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuID0gc3NjYW5mKHN0cmluZ192YWwsICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgICAgICAgICAmbTAsICZtMSwgJm0yLCAmbTMsICZtNCwgJm01KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuICE9IDYpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIGlmIChtMCA+IDI1NSB8fCBtMSA+IDI1NSB8fCBtMiA+IDI1NSB8fCBtMyA+IDI1NSB8fCBtNCA+IDI1NSB8fCBtNSA+IDI1NSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFswXSA9IG0wOworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFsxXSA9IG0xOworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFsyXSA9IG0yOworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFszXSA9IG0zOworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFs0XSA9IG00OworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFs1XSA9IG01OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9JUDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4xLCBuMiwgbjMsIG40OworICAgICAgICAgICAgbiA9IHNzY2FuZihzdHJpbmdfdmFsLCAiJWQuJWQuJWQuJWQiLCAmbjEsICZuMiwgJm4zLCAmbjQpOworICAgICAgICAgICAgaWYgKG4gIT0gNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCluMSA+IDI1NSB8fCAodW5zaWduZWQpbjIgPiAyNTUgfHwgKHVuc2lnbmVkKW4zID4gMjU1IHx8ICh1bnNpZ25lZCluNCA+IDI1NSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgdmFsdWUtPnVudW1iZXIgPSAobjEgPDwgMjQpIHwgKG4yIDw8IDE2KSB8IChuMyA8PCA4KSB8IG40OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHBfZW5kICYmICpwX2VuZCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIHZvaWQgX2JjbWNsaV9kZnRfZm9ybWF0X2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgdmFsdWUsIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpCit7CisgICAgc3dpdGNoKHBhcm0tPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX0RFQ0lNQUw6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlbGQiLCB2YWx1ZS5udW1iZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fVURFQ0lNQUw6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlbHUiLCB2YWx1ZS51bnVtYmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX0RFQ0lNQUw2NDoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVsbGQiLCB2YWx1ZS5udW1iZXI2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9VREVDSU1BTDY0OgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWxsdSIsIHZhbHVlLnVudW1iZXI2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9IRVg6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIweCVseCIsIHZhbHVlLnVudW1iZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fSEVYNjQ6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIweCVsbHgiLCB2YWx1ZS51bnVtYmVyNjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fTlVNQkVSOgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWxkIiwgdmFsdWUubnVtYmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX05VTUJFUjY0OgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWxsZCIsIHZhbHVlLm51bWJlcjY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VOVU1CRVI6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlbHUiLCB2YWx1ZS51bnVtYmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VOVU1CRVI2NDoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVsbHUiLCB2YWx1ZS51bnVtYmVyNjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fRkxPQVQ6CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fRE9VQkxFOgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWYiLCB2YWx1ZS5kKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1NUUklORzoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVzIiwgdmFsdWUuc3RyaW5nKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX01BQzoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgICAgICBwYXJtLT52YWx1ZS5tYWMudThbMF0sIHBhcm0tPnZhbHVlLm1hYy51OFsxXSwgcGFybS0+dmFsdWUubWFjLnU4WzJdLAorICAgICAgICAgICAgICAgIHBhcm0tPnZhbHVlLm1hYy51OFszXSwgcGFybS0+dmFsdWUubWFjLnU4WzRdLCBwYXJtLT52YWx1ZS5tYWMudThbNV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fSVA6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlZC4lZC4lZC4lZCIsCisgICAgICAgICAgICAgICAgKGludCkoKHBhcm0tPnZhbHVlLnVudW1iZXIgPj4gMjQpICYgMHhmZiksIChpbnQpKChwYXJtLT52YWx1ZS51bnVtYmVyID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgIChpbnQpKChwYXJtLT52YWx1ZS51bnVtYmVyID4+IDgpICYgMHhmZiksIChpbnQpKHBhcm0tPnZhbHVlLnVudW1iZXIgJiAweGZmKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoYnVmZmVyLCAiKnVua25vd24qIiwgc2l6ZSk7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9lbnVtX3NjYW5fY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKnN0cmluZ192YWwpCit7CisgICAgYmNtY2xpX2VudW1fdmFsICp2YWx1ZXM9cGFybS0+ZW51bV90YWJsZTsKKyAgICB3aGlsZSAodmFsdWVzLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKCFfYmNtY2xpX3N0cmljbXAodmFsdWVzLT5uYW1lLCBzdHJpbmdfdmFsLCAtMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlLT5lbnVtX3ZhbCA9IHZhbHVlcy0+dmFsOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKyAgICAgICAgKyt2YWx1ZXM7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX1BBUk07Cit9CisKK3N0YXRpYyB2b2lkIF9iY21jbGlfZW51bV9mb3JtYXRfY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSB2YWx1ZSwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKyAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlcz1wYXJtLT5lbnVtX3RhYmxlOworICAgIHdoaWxlICh2YWx1ZXMtPm5hbWUpCisgICAgeworICAgICAgICBpZiAodmFsdWVzLT52YWwgPT0gdmFsdWUuZW51bV92YWwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKyt2YWx1ZXM7CisgICAgfQorICAgIGlmICh2YWx1ZXMtPm5hbWUpCisgICAgICAgIHN0cm5jcHkoYnVmZmVyLCB2YWx1ZXMtPm5hbWUsIHNpemUpOworICAgIGVsc2UKKyAgICAgICAgc3RybmNweShidWZmZXIsICIqaW52YWxpZCoiLCBzaXplKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfZW51bV9tYXNrX3NjYW5fY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKnN0cmluZ192YWwpCit7CisgICAgYmNtY2xpX3Bhcm1fdmFsdWUgdmFsMTsKKyAgICBjaGFyICpkZWw7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgdmFsdWUtPm51bWJlciA9IDA7CisKKyAgICAvKiBzdHJpbmdfdmFsIGlzIGEgY29tYmluYXRpb24gb2YgZW51bSB2YWx1ZXMgc2VwYXJhdGVkIGJ5IEJDTUNMSV9FTlVNX01BU0tfREVMX1NUUiAqLworICAgIGRlbCA9IHN0cmNocihzdHJpbmdfdmFsLCBCQ01DTElfRU5VTV9NQVNLX0RFTF9DSEFSKTsKKyAgICB3aGlsZSAoZGVsKQorICAgIHsKKyAgICAgICAgY2hhciBzaW5nbGVfdmFsWzY0XTsKKyAgICAgICAgaWYgKGRlbCAtIHN0cmluZ192YWwgPj0gc2l6ZW9mKHNpbmdsZV92YWwpKQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgICAgIG1lbWNweShzaW5nbGVfdmFsLCBzdHJpbmdfdmFsLCBkZWwgLSBzdHJpbmdfdmFsKTsKKyAgICAgICAgc2luZ2xlX3ZhbFtkZWwgLSBzdHJpbmdfdmFsXSA9IDA7CisgICAgICAgIGVyciA9IF9iY21jbGlfZW51bV9zY2FuX2NiKHBhcm0sICZ2YWwxLCBzaW5nbGVfdmFsKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHZhbHVlLT5lbnVtX3ZhbCB8PSB2YWwxLmVudW1fdmFsOworICAgICAgICBzdHJpbmdfdmFsID0gZGVsKzE7CisgICAgICAgIGRlbCA9IHN0cmNocihzdHJpbmdfdmFsLCBCQ01DTElfRU5VTV9NQVNLX0RFTF9DSEFSKTsKKyAgICB9CisgICAgZXJyID0gX2JjbWNsaV9lbnVtX3NjYW5fY2IocGFybSwgJnZhbDEsIHN0cmluZ192YWwpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgdmFsdWUtPm51bWJlciB8PSB2YWwxLmVudW1fdmFsOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfYmNtY2xpX2VudW1fbWFza19mb3JtYXRfY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSB2YWx1ZSwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKyAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlcz1wYXJtLT5lbnVtX3RhYmxlOworICAgIGNvbnN0IGNoYXIgKm5vbmUgPSBOVUxMOworICAgICpidWZmZXIgPSAwOworICAgIHdoaWxlICh2YWx1ZXMtPm5hbWUpCisgICAgeworICAgICAgICBpZiAodmFsdWVzLT52YWwgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbm9uZSA9IHZhbHVlcy0+bmFtZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHZhbHVlcy0+dmFsICYgdmFsdWUuZW51bV92YWwpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqYnVmZmVyKQorICAgICAgICAgICAgICAgIHN0cm5jYXQoYnVmZmVyLCBCQ01DTElfRU5VTV9NQVNLX0RFTF9TVFIsIHNpemUgLSBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgICAgICBzdHJuY2F0KGJ1ZmZlciwgdmFsdWVzLT5uYW1lLCBzaXplIC0gc3RybGVuKGJ1ZmZlcikpOworICAgICAgICB9CisgICAgICAgICsrdmFsdWVzOworICAgIH0KKyAgICBpZiAoISAqYnVmZmVyKQorICAgICAgICBzdHJuY3B5KGJ1ZmZlciwgTlVMTCAhPSBub25lID8gbm9uZSA6ICIwIiwgc2l6ZSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX2J1ZmZlcl9zY2FuX2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgKnZhbHVlLCBjb25zdCBjaGFyICpzdHJpbmdfdmFsKQoreworICAgIGludCBuOworCisgICAgaWYgKCF2YWx1ZS0+YnVmZmVyLnN0YXJ0KQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIHZhbHVlLT5idWZmZXIuY3VyciA9IHZhbHVlLT5idWZmZXIuc3RhcnQ7CisgICAgaWYgKHN0cmNtcChzdHJpbmdfdmFsLCAiLSIpID09IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgbiA9IF9iY21jbGlfc3RyaGV4KHN0cmluZ192YWwsIHZhbHVlLT5idWZmZXIuc3RhcnQsIHZhbHVlLT5idWZmZXIubGVuKTsKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiBuOworICAgIGJjbW9sdF9idWZfc2tpcCgmdmFsdWUtPmJ1ZmZlciwgbik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9iY21jbGlfcXVhbGlmaWVkX25hbWUoYmNtY2xpX2VudHJ5ICp0b2tlbiwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSApCit7CisgICAgYmNtY2xpX2VudHJ5ICpwYXJlbnQgPSB0b2tlbi0+cGFyZW50OworICAgIGNoYXIgcXVhbF9uYW1lW0JDTUNMSV9NQVhfUVVBTF9OQU1FX0xFTkdUSF07CisgICAgKmJ1ZmZlcj0wOworICAgIHdoaWxlIChwYXJlbnQpCisgICAgeworICAgICAgICBiY21jbGlfc3RybmNweShxdWFsX25hbWUsIHBhcmVudC0+bmFtZSwgc2l6ZW9mKHF1YWxfbmFtZSkpOworICAgICAgICBpZiAocGFyZW50LT5wYXJlbnQpCisgICAgICAgICAgICBiY21jbGlfc3RybmNhdChxdWFsX25hbWUsICIvIiwgc2l6ZW9mKHF1YWxfbmFtZSkpOworICAgICAgICBiY21jbGlfc3RybmNhdChxdWFsX25hbWUsIGJ1ZmZlciwgc2l6ZW9mKHF1YWxfbmFtZSkpOworICAgICAgICBiY21jbGlfc3RybmNweShidWZmZXIsIHF1YWxfbmFtZSwgc2l6ZSk7CisgICAgICAgIHBhcmVudCA9IHBhcmVudC0+cGFyZW50OworICAgIH0KKyAgICBzaXplIC09IHN0cmxlbihidWZmZXIpOworICAgIGJjbWNsaV9zdHJuY2F0KGJ1ZmZlciwgdG9rZW4tPm5hbWUsIHNpemUpOworICAgIHJldHVybiBidWZmZXI7Cit9CisKKy8qCisgKiBFeHBvcnRzCisgKi8KK0VYUE9SVF9TWU1CT0woYmNtY2xpX2Rpcl9hZGQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfZGlyX2ZpbmQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfdG9rZW5fbmFtZSk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9jbWRfYWRkKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Nlc3Npb25fb3Blbik7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX2Nsb3NlKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3BhcnNlKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3N0b3ApOworRVhQT1JUX1NZTUJPTChiY21jbGlfaXNfc3RvcHBlZCk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9kaXJfZ2V0KTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX2Rpcl9zZXQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfcGFybV9udW1iZXIpOworRVhQT1JUX1NZTUJPTChiY21jbGlfcGFybV9pc19zZXQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfZW51bV9wYXJtX3N0cmluZ3ZhbCk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV90b2tlbl9kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX2VudW1fYm9vbF90YWJsZSk7CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzRlMjdjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGkuaApAQCAtMCwwICsxLDY3NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYmNtY2xpLmgKKyAqCisgKiBDTEkgZW5naW5lCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQkNNQ0xJX0gKKworI2RlZmluZSBCQ01DTElfSAorCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpX3Nlc3Npb24uaD4KKyNpbmNsdWRlIDxiY21vbHRfYnVmLmg+CisKKy8qKiBcZGVmZ3JvdXAgYmNtX2NsaSBCcm9hZGNvbSBDTEkgRW5naW5lCisgKiBCcm9hZGNvbSBDTEkgZW5naW5lIGlzIHVzZWQgZm9yIGFsbCBjb25maWd1cmF0aW9uIGFuZCBzdGF0dXMgbW9uaXRvcmluZy5cbgorICogSXQgZG9lc24ndCBoYXZlIGJ1aWx0LWluIHNjcmlwdGluZyBjYXBhYmlsaXRpZXMgKGxvZ2ljYWwgZXhwcmVzc2lvbnMsIGxvb3BzKSwKKyAqIGJ1dCBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGFueSBhdmFpbGFibGUgc2NyaXB0aW5nIGxhbmd1YWdlLlxuCisgKiBCcm9hZGNvbSBDTEkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczpcbgorICogLSBwYXJhbWV0ZXIgbnVtYmVyIGFuZCB0eXBlIHZhbGlkYXRpb24gKHNpbXBsaWZpZXMgY29tbWFuZCBoYW5kbGVycyBkZXZlbG9wbWVudCkKKyAqIC0gcGFyYW1ldGVyIHZhbHVlIHJhbmdlIGNoZWNraW5nCisgKiAtIG1hbmRhdG9yeSBhbmQgb3B0aW9uYWwgcGFyYW1ldGVycworICogLSBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwYXJhbWV0ZXJzCisgKiAtIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcworICogLSBlbnVtIHBhcmFtZXRlcnMgY2FuIGhhdmUgYXJiaXRyYXJ5IHZhbHVlcworICogLSBhdXRvbWF0aWMgY29tbWFuZCBoZWxwIGdlbmVyYXRpb24KKyAqIC0gYXV0b21hdGljIG9yIHVzZXItZGVmaW5lZCBjb21tYW5kIHNob3J0Y3V0cworICogLSBjb21tYW5kIGhhbmRsZXJzIHJldHVybiBjb21wbGV0aW9uIHN0YXR1cyB0byBlbmFibGUgc2NyaXB0aW5nCisgKiAtIG11bHRpcGxlIHNlc3Npb25zCisgKiAtIHNlc3Npb24gYWNjZXNzIHJpZ2h0cworICogLSBleHRlbmRpYmxlLiBTdXBwb3J0cyB1c2VyLWRlZmluZWQgcGFyYW1ldGVyIHR5cGVzCisgKiAtIHJlbGF0aXZlbHkgbG93IHN0YWNrIHVzYWdlCisgKiBAeworICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2RlZmluZSBCQ01DTElfTUFYX1NFQVJDSF9TVUJTVFJfTEVOR1RIIDgwCisKKyNkZWZpbmUgQkNNQ0xJX0FSUkFZX0VNUFRZICAgICAgICAiLSIKKyNkZWZpbmUgQkNNQ0xJX1BBUk1fTk9fVkFMVUUgICAgICAiXyIKKyNkZWZpbmUgQkNNQ0xJX0VOVU1fTUFTS19ERUxfU1RSICAiKyIKKworLyoqIE1vbml0b3IgZW50cnkgaGFuZGxlCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9lbnRyeSBiY21jbGlfZW50cnk7CisKKy8qIGlmIEJDTUNMSV9QQVJNX1VTRVJJTyBmbGFnIGlzIHNldDoKKyAgIGxvd192YWw6IHRfdXNlcnNjYW5mX2YgZnVuY3Rpb24KKyAgIGhpZ2hfdmFsOiB0X3VzZXJwcmludGZfZiBmdW5jdGlvbgorKi8KKworLyoqIEZ1bmN0aW9uIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9jbWRfcGFybSBiY21jbGlfY21kX3Bhcm07CisKKy8qKiBQYXJhbWV0ZXIgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNQ0xJX1BBUk1fTk9ORSwKKyAgICBCQ01DTElfUEFSTV9ERUNJTUFMLCAgICAgICAgIC8qKjwgRGVjaW1hbCBudW1iZXIgKi8KKyAgICBCQ01DTElfUEFSTV9ERUNJTUFMNjQsICAgICAgIC8qKjwgU2lnbmVkIDY0LWJpdCBkZWNpbWFsICovCisgICAgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsICAgICAgICAvKio8IFVuc2lnbmVkIGRlY2ltYWwgbnVtYmVyICovCisgICAgQkNNQ0xJX1BBUk1fVURFQ0lNQUw2NCwgICAgICAvKio8IFVuc2lnbmVkIDY0LWJpdCBkZWNpbWFsIG51bWJlciAqLworICAgIEJDTUNMSV9QQVJNX0hFWCwgICAgICAgICAgICAgLyoqPCBIZXhhZGVjaW1hbCBudW1iZXIgKi8KKyAgICBCQ01DTElfUEFSTV9IRVg2NCwgICAgICAgICAgIC8qKjwgNjQtYml0IGhleGFkZWNpbWFsIG51bWJlciAqLworICAgIEJDTUNMSV9QQVJNX05VTUJFUiwgICAgICAgICAgLyoqPCBEZWNpbWFsIG51bWJlciBvciBoZXggbnVtYmVyIHByZWZpeGVkIGJ5IDB4ICovCisgICAgQkNNQ0xJX1BBUk1fTlVNQkVSNjQsICAgICAgICAvKio8IDY0Yml0IGRlY2ltYWwgbnVtYmVyIG9yIGhleCBudW1iZXIgcHJlZml4ZWQgYnkgMHggKi8KKyAgICBCQ01DTElfUEFSTV9VTlVNQkVSLCAgICAgICAgIC8qKjwgVW5zaWduZWQgZGVjaW1hbCBudW1iZXIgb3IgaGV4IG51bWJlciBwcmVmaXhlZCBieSAweCAqLworICAgIEJDTUNMSV9QQVJNX1VOVU1CRVI2NCwgICAgICAgLyoqPCBVbnNpZ25lZCA2NGJpdCBkZWNpbWFsIG51bWJlciBvciBoZXggbnVtYmVyIHByZWZpeGVkIGJ5IDB4ICovCisgICAgQkNNQ0xJX1BBUk1fRkxPQVQsICAgICAgICAgICAvKio8IElFRUUgMzItYml0IGZsb2F0aW5nLXBvaW50IG51bWJlciAqLworICAgIEJDTUNMSV9QQVJNX0RPVUJMRSwgICAgICAgICAgLyoqPCBJRUVFIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIgKi8KKyAgICBCQ01DTElfUEFSTV9TVFJJTkcsICAgICAgICAgIC8qKjwgU3RyaW5nICovCisgICAgQkNNQ0xJX1BBUk1fRU5VTSwgICAgICAgICAgICAvKio8IEVudW1lcmF0aW9uICovCisgICAgQkNNQ0xJX1BBUk1fRU5VTV9NQVNLLCAgICAgICAvKio8IEJpdG1hc2sgY3JlYXRlZCBmcm9tIGVudW1lcmF0aW9uIHZhbHVlcyAqLworICAgIEJDTUNMSV9QQVJNX0lQLCAgICAgICAgICAgICAgLyoqPCBJUCBhZGRyZXNzIG4ubi5uLm4gKi8KKyAgICBCQ01DTElfUEFSTV9JUFY2LCAgICAgICAgICAgIC8qKjwgSVB2NiBhZGRyZXNzICovCisgICAgQkNNQ0xJX1BBUk1fTUFDLCAgICAgICAgICAgICAvKio8IE1BQyBhZGRyZXNzIHh4Onh4Onh4Onh4Onh4Onh4ICovCisgICAgQkNNQ0xJX1BBUk1fQlVGRkVSLCAgICAgICAgICAvKio8IEJ5dGUgYXJyYXkgKi8KKworICAgIEJDTUNMSV9QQVJNX1VTRVJERUYgICAgICAgICAgLyoqPCBVc2VyLWRlZmluZWQgcGFyYW1ldGVyLiBVc2VyIG11c3QgcHJvdmlkZSBzY2FuX2NiICovCit9IGJjbWNsaV9wYXJtX3R5cGU7CisKKy8qKiBOdW1lcmljIHR5cGUgdXNlZCBmb3Igc3RvcmluZyBlbnVtIHZhbHVlcy4gKi8KK3R5cGVkZWYgbG9uZyBiY21jbGlfZW51bV9udW1iZXI7CisKKy8qKiBFbnVtIGF0dHJpYnV0ZSB2YWx1ZS4KKyAqCisgKiAgRW51bSB2YWx1ZXMgaXMgYW4gYXJyYXkgb2YgYmNtY2xpX2VudW1fdmFsIHRlcm1pbmF0ZWQgYnkgZWxlbWVudCB3aXRoIG5hbWU9PU5VTEwKKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9lbnVtX3ZhbAoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAvKio8IEVudW0gc3ltYm9saWMgbmFtZSAqLworICAgIGJjbWNsaV9lbnVtX251bWJlciB2YWw7ICAgICAvKio8IEVudW0gaW50ZXJuYWwgdmFsdWUgKi8KKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm1zOyAgICAgLyoqPCBFeHRlbnNpb24gcGFyYW1ldGVyIHRhYmxlIGZvciBlbnVtLXNlbGVjdG9yICovCit9IGJjbWNsaV9lbnVtX3ZhbDsKKyNkZWZpbmUgQkNNQ0xJX01BWF9FTlVNX1ZBTFVFUyAgIDEyOCAgICAgLyoqPCBNYXggbnVtYmVyIG9mIGVudW0gdmFsdWVzICovCisjZGVmaW5lIEJDTUNMSV9FTlVNX0xBU1QgICAgIHsgTlVMTCwgMH0gIC8qKjwgTGFzdCBlbnRyeSBpbiBlbnVtIHRhYmxlICovCisKKy8qKiBCb29sZWFuIHZhbHVlcyAodHJ1ZS9mYWxzZSwgeWVzL25vLCBvbi9vZmYpCisgKgorICovCitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWNsaV9lbnVtX2Jvb2xfdGFibGVbXTsKKworLyogTW9uaXRvciBkYXRhIHR5cGVzICovCit0eXBlZGVmIGxvbmcgYmNtY2xpX251bWJlcjsgICAgICAvKio8IFR5cGUgdW5kZXJseWluZyBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0RFQ0lNQUwgKi8KK3R5cGVkZWYgbG9uZyBiY21jbGlfdW51bWJlcjsgICAgIC8qKjwgVHlwZSB1bmRlcmx5aW5nIEJDTUNMSV9QQVJNX0hFWCwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwgKi8KK3R5cGVkZWYgbG9uZyBiY21jbGlfbnVtYmVyNjQ7ICAgIC8qKjwgVHlwZSB1bmRlcmx5aW5nIEJDTUNMSV9QQVJNX05VTUJFUjY0LCBCQ01DTElfUEFSTV9ERUNJTUFMNjQgKi8KK3R5cGVkZWYgbG9uZyBiY21jbGlfdW51bWJlcjY0OyAgIC8qKjwgVHlwZSB1bmRlcmx5aW5nIEJDTUNMSV9QQVJNX0hFWDY0LCBCQ01DTElfUEFSTV9VREVDSU1BTDY0ICovCisKKy8qKiBQYXJhbWV0ZXIgdmFsdWUgKi8KK3R5cGVkZWYgdW5pb24gYmNtY2xpX3Bhcm1fdmFsdWUKK3sKKyAgICBsb25nIG51bWJlcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2lnbmVkIG51bWJlciAqLworICAgIHVuc2lnbmVkIGxvbmcgdW51bWJlcjsgICAgICAgICAgLyoqPCBVbnNpZ25lZCBudW1iZXIgKi8KKyAgICBsb25nIGxvbmcgbnVtYmVyNjQ7ICAgICAgICAgICAgIC8qKjwgU2lnbmVkIDY0LWJpdCBudW1iZXIgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdW51bWJlcjY0OyAgIC8qKjwgVW5zaWduZWQgNjQtYml0IG51bWJlciAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZzsgICAgICAgICAgICAgLyoqPCAwLXRlcm1pbmF0ZWQgc3RyaW5nICovCisgICAgZG91YmxlIGQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IERvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjOyAgICAgICAgICAvKio8IE1BQyBhZGRyZXNzICovCisgICAgYmNtb2x0X2J1ZiBidWZmZXI7ICAgICAgICAgICAgICAvKio8IEJ1ZmZlcjogdXNlZCBmb3IgQkNNQ0xJX1BBUk1fQlVGRkVSICovCisgICAgYmNtY2xpX2VudW1fbnVtYmVyIGVudW1fdmFsOyAgICAvKio8IEVudW0gdmFsdWUgKG51bWJlcikgKi8KK30gIGJjbWNsaV9wYXJtX3ZhbHVlOworCisvKiogVXNlci1kZWZpbmVkIHNjYW4gZnVuY3Rpb24uCisgKiBUaGUgZnVuY3Rpb24gaXMgdXNlZCBmb3IgcGFyc2luZyB1c2VyLWRlZmluZWQgcGFyYW1ldGVyIHR5cGVzCisgKiBSZXR1cm5zOiAwLW9rLCA8PWVycm9yCisgKgorICovCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtY2xpX3NjYW5fY2IpKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgKnZhbHVlLAorICAgIGNvbnN0IGNoYXIgKnN0cmluZ192YWwpOworCisvKiogVXNlci1kZWZpbmVkIHByaW50IGZ1bmN0aW9uLgorICogVGhlIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHByaW50aW5nIHVzZXItZGVmaW5lZCBwYXJhbWV0ZXIgdHlwZXMKKyAqCisgKi8KK3R5cGVkZWYgdm9pZCAoKmJjbWNsaV9mb3JtYXRfY2IpKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgdmFsdWUsCisgICAgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSk7CisKKworLyoqIEZ1bmN0aW9uIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBiY21jbGlfY21kX3Bhcm0KK3sKKyAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgLyoqPCBQYXJhbWV0ZXIgbmFtZS4gU2hvdWxkbid0IGJlIGFsbG9jYXRlZCBvbiBzdGFjayEgKi8KKyAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOyAgICAgLyoqPCBQYXJhbWV0ZXIgZGVzY3JpcHRpb24uIFNob3VsZG4ndCBiZSBhbGxvY2F0ZWQgb24gc3RhY2shICovCisgICBiY21jbGlfcGFybV90eXBlIHR5cGU7ICAgICAgIC8qKjwgUGFyYW1ldGVyIHR5cGUgKi8KKyAgIHVpbnQ4X3QgZmxhZ3M7ICAgICAgICAgICAgICAgLyoqPCBDb21iaW5hdGlvbiBvZiBCQ01DTElfUEFSTV94eCBmbGFncyAqLworI2RlZmluZSBCQ01DTElfUEFSTV9GTEFHX05PTkUgICAgICAgMHgwMCAvKio8IEZvciB1c2UgaW5zdGVhZCBvZiBtYWdpYyBudW1iZXIgMCB3aGVuIG5vIGZsYWdzIGFwcGx5ICovCisjZGVmaW5lIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwgICAweDAxIC8qKjwgUGFyYW1ldGVyIGlzIG9wdGlvbmFsICovCisjZGVmaW5lIEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMICAgICAweDAyIC8qKjwgRGVmYXVsdCB2YWx1ZSBpcyBzZXQgKi8KKyNkZWZpbmUgQkNNQ0xJX1BBUk1fRkxBR19SQU5HRSAgICAgIDB4MDQgLyoqPCBSYW5nZSBpcyBzZXQgKi8KKyNkZWZpbmUgQkNNQ0xJX1BBUk1fRkxBR19FT0wgICAgICAgIDB4MjAgLyoqPCBTdHJpbmcgZnJvbSB0aGUgY3VycmVudCBwYXJzZXIgcG9zaXRpb24gdGlsbCBFT0wgKi8KKyNkZWZpbmUgQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUiAgIDB4NDAgLyoqPCBQYXJhbWV0ZXIgc2VsZWN0cyBvdGhlciBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQgICAweDgwIC8qKjwgSW50ZXJuYWwgZmxhZzogcGFyYW1ldGVyIGlzIGFzc2lnbmVkICovCisKKyAgIGJjbWNsaV9udW1iZXIgbG93X3ZhbDsgICAgICAgLyoqPCBMb3cgdmFsIGZvciByYW5nZSBjaGVja2luZyAqLworICAgYmNtY2xpX251bWJlciBoaV92YWw7ICAgICAgICAvKio8IEhpIHZhbCBmb3IgcmFuZ2UgY2hlY2tpbmcgKi8KKyAgIGJjbWNsaV9wYXJtX3ZhbHVlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZSAqLworICAgYmNtY2xpX2VudW1fdmFsICplbnVtX3RhYmxlOyAvKio8IFRhYmxlIGNvbnRhaW5pbmcgeyBlbnVtX25hbWUsIGVudW1fdmFsdWUgfSBwYWlycyAqLworICAgYmNtY2xpX3NjYW5fY2Igc2Nhbl9jYjsgICAgICAvKio8IFVzZXItZGVmaW5lZCBzY2FuIGZ1bmN0aW9uIGZvciBCQ01DTElfUEFSTV9VU0VSREVGIHBhcmFtZXRlciB0eXBlICovCisgICBiY21jbGlfZm9ybWF0X2NiIGZvcm1hdF9jYjsgIC8qKjwgVXNlci1kZWZpbmVkIGZvcm1hdCBmdW5jdGlvbiBmb3IgQkNNQ0xJX1BBUk1fVVNFUkRFRiBwYXJhbWV0ZXIgdHlwZSAqLworICAgdWludDMyX3QgbWF4X2FycmF5X3NpemU7ICAgICAvKio8IE1heCBhcnJheSBzaXplIGZvciBhcnJheS1wYXJhbWV0ZXIgKi8KKyAgIHVpbnQzMl90IGFycmF5X3NpemU7ICAgICAgICAgLyoqPCBBY3R1YWwgYXJyYXkgc2l6ZSBmb3IgYXJyYXktcGFyYW1ldGVyICovCisgICBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWVzOyAgIC8qKjwgQXJyYXkgdmFsdWVzICovCisgICB2b2lkICp1c2VyX2RhdGE7ICAgICAgICAgICAgIC8qKjwgVXNlciBkYXRhIC0gcGFzc2VkIHRyYW5zcGFyZW50bHkgdG8gY29tbWFuZCBoYW5kbGVyICovCit9OworCisvKiogQ29tbWFuZCBwYXJhbWV0ZXIgbGlzdCB0ZXJtaW5hdG9yICovCisjZGVmaW5lIEJDTUNMSV9QQVJNX0xJU1RfVEVSTUlOQVRPUiAgeyAubmFtZT1OVUxMLCAudHlwZT1CQ01DTElfUEFSTV9OT05FIH0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSBzaW1wbGUgcGFyYW1ldGVyCisgKiBccGFyYW1baW5dIF9uYW1lICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uCisgKiBccGFyYW1baW5dIF90eXBlICAgICBQYXJhbWV0ZXIgdHlwZQorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgUGFyYW1ldGVyIGZsYWdzCisgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfUEFSTShfbmFtZSwgX2Rlc2NyLCBfdHlwZSwgX2ZsYWdzKSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPShfdHlwZSksIC5mbGFncz0oX2ZsYWdzKSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2Ugc2ltcGxlIHBhcmFtZXRlcgorICogXHBhcmFtW2luXSBfbmFtZSAgICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3R5cGUgICAgICAgUGFyYW1ldGVyIHR5cGUKKyAqIFxwYXJhbVtpbl0gX2ZsYWdzICAgICAgUGFyYW1ldGVyIGZsYWdzCisgKiBccGFyYW1baW5dIF9zaXplICAgICAgIE1heCBhcnJheSBzaXplCisgKiBccGFyYW1baW5dIF92YWx1ZXMgICAgIEFycmF5IHZhbHVlcyBidWZmZXIKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0FSUkFZKF9uYW1lLCBfZGVzY3IsIF90eXBlLCBfZmxhZ3MsIF9zaXplLCBfdmFsdWVzKSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPShfdHlwZSksIC5mbGFncz0oX2ZsYWdzKSxcCisgICAgICAgIC5tYXhfYXJyYXlfc2l6ZT0oX3NpemUpLCAudmFsdWVzPShfdmFsdWVzKSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2Ugc2ltcGxlIHBhcmFtZXRlciBmb3IgYXJyYXlzIG9mIGVudW1zCisgKiBccGFyYW1baW5dIF9uYW1lICAgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdHlwZSAgICAgICBQYXJhbWV0ZXIgdHlwZQorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gX3NpemUgICAgICAgTWF4IGFycmF5IHNpemUKKyAqIFxwYXJhbVtpbl0gX3ZhbHVlcyAgICAgQXJyYXkgdmFsdWVzIGJ1ZmZlcgorICogXHBhcmFtW2luXSBfZW51bV90YWJsZSBBbiBhcnJheSBvZiBlbnVtcyB0aGF0IG1heSBiZSBpbiB0aGUgYXJyYXkKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0VOVU1fQVJSQVkoX25hbWUsIF9kZXNjciwgX3R5cGUsIF9mbGFncywgX3NpemUsIF92YWx1ZXMsIF9lbnVtX3RhYmxlKSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPShfdHlwZSksIC5mbGFncz0oX2ZsYWdzKSxcCisgICAgICAgIC5tYXhfYXJyYXlfc2l6ZT0oX3NpemUpLCAudmFsdWVzPShfdmFsdWVzKSwgLmVudW1fdGFibGU9KF9lbnVtX3RhYmxlKSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2UgcmFuZ2UgcGFyYW1ldGVyCisgKiBccGFyYW1baW5dIF9uYW1lICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uCisgKiBccGFyYW1baW5dIF90eXBlICAgICBQYXJhbWV0ZXIgdHlwZQorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgUGFyYW1ldGVyIGZsYWdzCisgKiBccGFyYW1baW5dIF9taW4gICAgICBNaW4gdmFsdWUKKyAqIFxwYXJhbVtpbl0gX21heCAgICAgIE1heCB2YWx1ZQorICovCisjZGVmaW5lIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoX25hbWUsIF9kZXNjciwgX3R5cGUsIF9mbGFncywgX21pbiwgX21heCkgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT0oX3R5cGUpLCAuZmxhZ3M9KF9mbGFncykgfCBCQ01DTElfUEFSTV9GTEFHX1JBTkdFLCBcCisgICAgICAgIC5sb3dfdmFsPShfbWluKSwgLmhpX3ZhbD0oX21heCkgfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIHJhbmdlIHBhcmFtZXRlciBmb3IgYXJyYXlzIHdpdGggcmFuZ2UKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3R5cGUgICAgIFBhcmFtZXRlciB0eXBlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gX3NpemUgICAgIE1heCBhcnJheSBzaXplCisgKiBccGFyYW1baW5dIF92YWx1ZXMgICBBcnJheSB2YWx1ZXMgYnVmZmVyCisgKiBccGFyYW1baW5dIF9taW4gICAgICBNaW4gdmFsdWUKKyAqIFxwYXJhbVtpbl0gX21heCAgICAgIE1heCB2YWx1ZQorICovCisjZGVmaW5lIEJDTUNMSV9NQUtFX1BBUk1fQVJSQVlfUkFOR0UoX25hbWUsIF9kZXNjciwgX3R5cGUsIF9mbGFncywgX3NpemUsIF92YWx1ZXMsIF9taW4sIF9tYXgpIFwKKyAgICB7IC5uYW1lPShfbmFtZSksIC5kZXNjcmlwdGlvbj0oX2Rlc2NyKSwgLnR5cGU9KF90eXBlKSwgLmZsYWdzPShfZmxhZ3MpIHwgQkNNQ0xJX1BBUk1fRkxBR19SQU5HRSxcCisgICAgICAgICAubWF4X2FycmF5X3NpemU9KF9zaXplKSwgLnZhbHVlcz0oX3ZhbHVlcyksIC5sb3dfdmFsPShfbWluKSwgLmhpX3ZhbD0oX21heCkgfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIHBhcmFtZXRlciB3aXRoIGRlZmF1bHQgdmFsdWUKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3R5cGUgICAgIFBhcmFtZXRlciB0eXBlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gX2RmdCAgICAgIERlZmF1bHQgdmFsdWUKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTChfbmFtZSwgX2Rlc2NyLCBfdHlwZSwgX2ZsYWdzLCBfZGZ0KSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPShfdHlwZSksIC5mbGFncz0oX2ZsYWdzKSB8IEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMLCBcCisgICAgICAgIC52YWx1ZSA9IHtfZGZ0fSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2UgcmFuZ2UgcGFyYW1ldGVyIHdpdGggZGVmYXVsdCB2YWx1ZQorICogXHBhcmFtW2luXSBfbmFtZSAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdHlwZSAgICAgUGFyYW1ldGVyIHR5cGUKKyAqIFxwYXJhbVtpbl0gX2ZsYWdzICAgIFBhcmFtZXRlciBmbGFncworICogXHBhcmFtW2luXSBfbWluICAgICAgTWluIHZhbHVlCisgKiBccGFyYW1baW5dIF9tYXggICAgICBNYXggdmFsdWUKKyAqIFxwYXJhbVtpbl0gX2RmdCAgICAgIERlZmF1bHQgdmFsdWUKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX1JBTkdFX0RFRlZBTChfbmFtZSwgX2Rlc2NyLCBfdHlwZSwgX2ZsYWdzLCBfbWluLCBfbWF4LCBfZGZ0KSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPShfdHlwZSksIFwKKyAgICAgICAgLmZsYWdzPShfZmxhZ3MpIHwgQkNNQ0xJX1BBUk1fRkxBR19SQU5HRSB8IEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMLCBcCisgICAgICAgIC5sb3dfdmFsPShfbWluKSwgLmhpX3ZhbD0oX21heCksIC52YWx1ZSA9IHtfZGZ0fSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2UgZW51bSBwYXJhbWV0ZXIKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3ZhbHVlcyAgIEVudW0gdmFsdWVzIHRhYmxlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0VOVU0oX25hbWUsIF9kZXNjciwgX3ZhbHVlcywgX2ZsYWdzKSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPUJDTUNMSV9QQVJNX0VOVU0sIC5mbGFncz0oX2ZsYWdzKSwgLmVudW1fdGFibGU9KF92YWx1ZXMpfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIGVudW0gcGFyYW1ldGVyIHdpdGggZGVmYXVsdCB2YWx1ZQorICogXHBhcmFtW2luXSBfbmFtZSAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdmFsdWVzICAgRW51bSB2YWx1ZXMgdGFibGUKKyAqIFxwYXJhbVtpbl0gX2ZsYWdzICAgIFBhcmFtZXRlciBmbGFncworICogXHBhcmFtW2luXSBfZGZ0ICAgICAgRGVmYXVsdCB2YWx1ZQorICovCisjZGVmaW5lIEJDTUNMSV9NQUtFX1BBUk1fRU5VTV9ERUZWQUwoX25hbWUsIF9kZXNjciwgX3ZhbHVlcywgX2ZsYWdzLCBfZGZ0KSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPUJDTUNMSV9QQVJNX0VOVU0sIC5mbGFncz0oX2ZsYWdzKSB8IEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMLFwKKyAgICAgICAgLmVudW1fdGFibGU9KF92YWx1ZXMpLCAudmFsdWU9ey5zdHJpbmc9X2RmdH0gfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIGVudW0gbWFzayBwYXJhbWV0ZXIKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3ZhbHVlcyAgIEVudW0gdmFsdWVzIHRhYmxlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0VOVU1fTUFTSyhfbmFtZSwgX2Rlc2NyLCBfdmFsdWVzLCBfZmxhZ3MpIFwKKyAgICB7IC5uYW1lPShfbmFtZSksIC5kZXNjcmlwdGlvbj0oX2Rlc2NyKSwgLnR5cGU9QkNNQ0xJX1BBUk1fRU5VTV9NQVNLLCAuZmxhZ3M9KF9mbGFncyksIC5lbnVtX3RhYmxlPShfdmFsdWVzKX0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSBlbnVtX21hc2sgcGFyYW1ldGVyIHdpdGggZGVmYXVsdCB2YWx1ZQorICogXHBhcmFtW2luXSBfbmFtZSAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdmFsdWVzICAgRW51bSB2YWx1ZXMgdGFibGUKKyAqIFxwYXJhbVtpbl0gX2ZsYWdzICAgIFBhcmFtZXRlciBmbGFncworICogXHBhcmFtW2luXSBfZGZ0ICAgICAgRGVmYXVsdCB2YWx1ZQorICovCisjZGVmaW5lIEJDTUNMSV9NQUtFX1BBUk1fRU5VTV9NQVNLX0RFRlZBTChfbmFtZSwgX2Rlc2NyLCBfdmFsdWVzLCBfZmxhZ3MsIF9kZnQpIFwKKyAgICB7IC5uYW1lPShfbmFtZSksIC5kZXNjcmlwdGlvbj0oX2Rlc2NyKSwgLnR5cGU9QkNNQ0xJX1BBUk1fRU5VTV9NQVNLLCAuZmxhZ3M9KF9mbGFncykgfCBCQ01DTElfUEFSTV9GTEFHX0RFRlZBTCxcCisgICAgICAgIC5lbnVtX3RhYmxlPShfdmFsdWVzKSwgLnZhbHVlPXsuc3RyaW5nPV9kZnR9IH0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSBlbnVtLXNlbGVjdG9yIHBhcmFtZXRlcgorICogXHBhcmFtW2luXSBfbmFtZSAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdmFsdWVzICAgU2VsZWN0b3IgdmFsdWVzIHRhYmxlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX1NFTEVDVE9SKF9uYW1lLCBfZGVzY3IsIF92YWx1ZXMsIF9mbGFncykgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT1CQ01DTElfUEFSTV9FTlVNLCAuZmxhZ3M9KF9mbGFncykgfCBCQ01DTElfUEFSTV9GTEFHX1NFTEVDVE9SLFwKKyAgICAgICAgLmVudW1fdGFibGU9KF92YWx1ZXMpIH0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSBidWZmZXIgcGFyYW1ldGVyCisgKiBccGFyYW1baW5dIF9uYW1lICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gX2J1ZiAgICAgIE1lbW9yeSBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIKKyAqIFxwYXJhbVtpbl0gX3NpemUgICAgIEJ1ZmZlciBzaXplCisgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfUEFSTV9CVUZGRVIoX25hbWUsIF9kZXNjciwgX2ZsYWdzLCBfYnVmLCBfc2l6ZSkgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT1CQ01DTElfUEFSTV9CVUZGRVIsIFwKKyAgICAgICAgLmZsYWdzPShfZmxhZ3MpLCAudmFsdWUuYnVmZmVyID0gey5zdGFydCA9IF9idWYsIC5jdXJyID0gX2J1ZiwgLmxlbiA9IF9zaXplfSB9CisKKy8qKiBSZWdpc3RlciBjb21tYW5kIHdpdGhvdXQgcGFyYW1ldGVycyBoZWxwZXIgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsIGNtZCwgaGVscCwgY2IpIFwKK3tcCisgICAgYmNtb3NfZXJybm8gYmNtY2xpX2NtZF9hZGRfZXJyID0gYmNtY2xpX2NtZF9hZGQoZGlyLCBjbWQsIGNiLCBoZWxwLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMLCBOVUxMKTtcCisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gYmNtY2xpX2NtZF9hZGRfZXJyKTtcCit9CisKKy8qKiBSZWdpc3RlciBjb21tYW5kIGhlbHBlciAqLworI2RlZmluZSBCQ01DTElfTUFLRV9DTUQoZGlyLCBjbWQsIGhlbHAsIGNiLCBwYXJtcy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgYmNtY2xpX2NtZF9wYXJtIGNtZF9wYXJtc1tdPXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwYXJtcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJDTUNMSV9QQVJNX0xJU1RfVEVSTUlOQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJjbW9zX2Vycm5vIGJjbWNsaV9jbWRfYWRkX2VyciA9IGJjbWNsaV9jbWRfYWRkKGRpciwgY21kLCBjYiwgaGVscCwgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCwgY21kX3Bhcm1zKTsgICBcCisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gYmNtY2xpX2NtZF9hZGRfZXJyKTtcCit9CisKKy8qKiBPcHRpb25hbCBjdXN0b20gZGlyZWN0b3J5IGhhbmRsZXJzICovCit0eXBlZGVmIHZvaWQgKCpiY21jbGlfZGlyX2VudGVyX2xlYXZlX2NiKShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpkaXIsIGludCBpc19lbnRlcik7CisKKy8qKiBPcHRpb25hbCBjb21tYW5kIG9yIGRpcmVjdG9yeSBoZWxwIGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBoICAgICAgICAgICBDb21tYW5kIG9yIGRpcmVjdG9yeSBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBwYXJtcyAgICAgICBQYXJhbWV0ZXIocykgLSB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBzdHJpbmcuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIHVzZWQgZm9yIGV4YW1wbGUgdG8gZ2V0IGhlbHAgb24gaW5kaXZpZHVhbCBwYXJhbWV0ZXJzCisgKi8KK3R5cGVkZWYgdm9pZCAoKmJjbWNsaV9oZWxwX2NiKShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpoLCBjb25zdCBjaGFyICpwYXJtcyk7CisKKworLyoqIEV4dHJhIHBhcmFtZXRlcnMgb2YgbW9uaXRvciBkaXJlY3RvcnkuCisgKiBTZWUgXHJlZiBiY21jbGlfZGlyX2FkZAorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX2Rpcl9leHRyYV9wYXJtCit7CisgICAgdm9pZCAqdXNlcl9wcml2OyAgICAgICAgICAgIC8qKjwgcHJpdmF0ZSBkYXRhIHBhc3NlZCB0byBlbnRlcl9sZWF2ZV9jYiAqLworICAgIGJjbWNsaV9kaXJfZW50ZXJfbGVhdmVfY2IgZW50ZXJfbGVhdmVfY2I7IC8qKjwgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gc2Vzc2lvbiBlbnRlcnMvbGVhdnMgdGhlIGRpcmVjdG9yeSAqLworICAgIGJjbWNsaV9oZWxwX2NiIGhlbHBfY2I7ICAgICAvKio8IEhlbHAgZnVuY3Rpb24gY2FsbGVkIHRvIHByaW50IGRpcmVjdG9yeSBoZWxwIGluc3RlYWQgb2YgdGhlIGF1dG9tYXRpYyBoZWxwICovCit9IGJjbWNsaV9kaXJfZXh0cmFfcGFybTsKKworCisvKiogRXh0cmEgcGFyYW1ldGVycyBvZiBtb25pdG9yIGNvbW1hbmQuCisgKiBTZWUgXHJlZiBiY21jbGlfY21kX2FkZAorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX2NtZF9leHRyYV9wYXJtCit7CisgICAgYmNtY2xpX2hlbHBfY2IgaGVscF9jYjsgICAgIC8qKjwgT3B0aW9uYWwgaGVscCBjYWxsYmFjay4gQ2FuIGJlIHVzZWQgZm9yIG1vcmUgc29waGlzdGljYXRlZCBoZWxwLCBlLmcuLCBoZWxwIGZvciBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgIC8qKjwgQ29tbWFuZCBmbGFncyAqLworI2RlZmluZSBCQ01DTElfQ01EX0ZMQUdfTk9fTkFNRV9QQVJNUyAgIDB4MDAwMDAwMDEgLyoqPCBObyBuYW1lZCBwYXJtcy4gUG9zaXRpb25hbCBvbmx5LiBDYW4gYmUgdXNlZnVsIGlmIHBhcmFtZXRlciB2YWx1ZSBjYW4gY29udGFpbiAnLCcgKi8KKyAgICB2b2lkICgqZnJlZV9wYXJtcykoYmNtY2xpX2NtZF9wYXJtICpwYXJtcyk7ICAgIC8qIE9wdGlvbmFsIHVzZXItZGVmaW5lZCBmcmVlICovCit9IGJjbWNsaV9jbWRfZXh0cmFfcGFybTsKKworCisvKiogTW9uaXRvciBjb21tYW5kIGhhbmRsZXIgcHJvdG90eXBlICovCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtY2xpX2NtZF9jYikoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpOworCisvKiogQ0xJIGNvbW1hbmQgbG9nZ2luZyBtb2RlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01DTElfTE9HX05PTkUsICAgICAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBsb2dnaW5nICovCisgICAgQkNNQ0xJX0xPR19DTEksICAgICAgICAgICAgICAgICAvKio8IExvZyBjb21tYW5kcyBhcyBpcyBhbmQgcmMgYXMgQ0xJIGNvbW1lbnQqLworICAgIEJDTUNMSV9MT0dfQ19DT01NRU5UICAgICAgICAgICAgLyoqPCBMb2cgYXMgQyBjb21tZW50cyAqLworfSBiY21jbGlfbG9nX21vZGU7CisKKy8qKiBBZGQgc3ViZGlyZWN0b3J5IHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5CisgKgorICogXHBhcmFtW2luXSAgIHBhcmVudCAgICAgICAgICBQYXJlbnQgZGlyZWN0b3J5IGhhbmRsZS4gTlVMTD1yb290CisgKiBccGFyYW1baW5dICAgbmFtZSAgICAgICAgICAgIERpcmVjdG9yeSBuYW1lCisgKiBccGFyYW1baW5dICAgaGVscCAgICAgICAgICAgIEhlbHAgc3RyaW5nCisgKiBccGFyYW1baW5dICAgYWNjZXNzX3JpZ2h0ICAgIEFjY2VzcyByaWdodHMKKyAqIFxwYXJhbVtpbl0gICBleHRyYXMgICAgICAgICAgT3B0aW9uYWwgZGlyZWN0b3J5IGRlc2NyaXB0b3IuIE11c3RuJ3QgYmUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4KKyAqIFxyZXR1cm4gICAgICBuZXcgZGlyZWN0b3J5IGhhbmRsZSBvciBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitiY21jbGlfZW50cnkgKmJjbWNsaV9kaXJfYWRkKGJjbWNsaV9lbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoZWxwLCBiY21jbGlfYWNjZXNzX3JpZ2h0IGFjY2Vzc19yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2Rpcl9leHRyYV9wYXJtICpleHRyYXMpOworCisKKy8qKiBTY2FuIGRpcmVjdG9yeSB0cmVlIGFuZCBsb29rIGZvciBkaXJlY3RvcnkgbmFtZWQgIm5hbWUiLgorICoKKyAqIFxwYXJhbVtpbl0gICBwYXJlbnQgICAgICAgICAgRGlyZWN0b3J5IHN1Yi10cmVlIHJvb3QuIE5VTEw9cm9vdAorICogXHBhcmFtW2luXSAgIG5hbWUgICAgICAgICAgICBOYW1lIG9mIGRpcmVjdG9yeSB0byBiZSBmb3VuZAorICogXHJldHVybiAgICAgIGRpcmVjdG9yeSBoYW5kbGUgaWYgZm91bmQgb3IgTlVMTCBpZiBub3QgZm91bmQKKyAqLworYmNtY2xpX2VudHJ5ICpiY21jbGlfZGlyX2ZpbmQoYmNtY2xpX2VudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUgKTsKKworCisvKiogU2NhbiBkaXJlY3RvcnkgdHJlZSBhbmQgbG9vayBmb3IgY29tbWFuZCBuYW1lZCAibmFtZSIuCisgKgorICogXHBhcmFtW2luXSAgIHBhcmVudCAgICAgICAgICBEaXJlY3Rvcnkgc3ViLXRyZWUgcm9vdC4gTlVMTD1yb290CisgKiBccGFyYW1baW5dICAgbmFtZSAgICAgICAgICAgIE5hbWUgb2YgY29tbWFuZCB0byBiZSBmb3VuZAorICogXHJldHVybiAgICAgIGNvbW1hbmQgaGFuZGxlIGlmIGZvdW5kIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpX2NtZF9maW5kKGJjbWNsaV9lbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lICk7CisKKworLyoqIEdldCB0b2tlbiBuYW1lCisgKiBccGFyYW1baW5dICAgdG9rZW4gICAgICAgICAgIERpcmVjdG9yeSBvciBjb21tYW5kIHRva2VuCisgKiBccmV0dXJuICAgICAgZGlyZWN0b3J5IHRva2VuIG5hbWUKKyAqLworY29uc3QgY2hhciAqYmNtY2xpX3Rva2VuX25hbWUoYmNtY2xpX2VudHJ5ICp0b2tlbik7CisKKy8qKiBGaW5kIHRoZSBDTEkgcGFyYW1ldGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIChjYXNlIGluc2Vuc2l0aXZlKS4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICBDTEkgc2Vzc2lvbgorICogXHBhcmFtW2luXSAgIG5hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccmV0dXJuICAgICAgVGhlIENMSSBwYXJhbWV0ZXIgdGhhdCB3YXMgZm91bmQsIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK2JjbWNsaV9jbWRfcGFybSAqYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKiBGaW5kIHRoZSBmaXJzdCBDTEkgcGFyYW1ldGVyIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcgKGNhc2UgaW5zZW5zaXRpdmUpLgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gIENMSSBzZXNzaW9uCisgKiBccGFyYW1baW5dICAgcHJlZml4ICAgUGFyYW1ldGVyIG5hbWUgcHJlZml4CisgKiBccmV0dXJuICAgICAgVGhlIENMSSBwYXJhbWV0ZXIgdGhhdCB3YXMgZm91bmQsIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK2JjbWNsaV9jbWRfcGFybSAqYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKKy8qKiBRdWVyeSBwYXJhbWV0ZXIgdmFsdWUgc3RhdHVzLgorICogVGhlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBzY2FsYXIgYW5kIGFycmF5IHBhcmFtZXRlcnMKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgQ0xJIHNlc3Npb24KKyAqIFxwYXJhbVtpbl0gICBwYXJtICAgICAgICAgICAgUGFyYW1ldGVyIGZyb20gdGhlIGFycmF5IHBhc3NlZCB0byB0aGUgQ0xJIGNvbW1hbmQgaGFuZGxlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciByZXR1cm5lZCBieSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKCkKKyAqIFxwYXJhbVtpbl0gICB2YWx1ZV9pbmRleCAgICAgdmFsdWVfaW5kZXggLSBmb3IgYXJyYXkgcGFyYW1ldGVycworICogXHJldHVybiAgICAgIEJDTU9TX1RSVUUgaWYgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBzZXQsIEJDTU9TX0ZBTFNFIG90aGVyd2lzZQorICovCitiY21vc19ib29sIGJjbWNsaV9wYXJtX3ZhbHVlX2lzX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCB1aW50MzJfdCB2YWx1ZV9pbmRleCk7CisKKy8qKiBBZGQgQ0xJIGNvbW1hbmQKKyAqCisgKiBccGFyYW1baW5dICAgZGlyICAgICAgICAgICAgIEhhbmRsZSBvZiBkaXJlY3RvcnkgdG8gYWRkIGNvbW1hbmQgdG8uIE5VTEw9cm9vdAorICogXHBhcmFtW2luXSAgIG5hbWUgICAgICAgICAgICBDb21tYW5kIG5hbWUKKyAqIFxwYXJhbVtpbl0gICBjbWRfY2IgICAgICAgICAgQ29tbWFuZCBoYW5kbGVyCisgKiBccGFyYW1baW5dICAgaGVscCAgICAgICAgICAgIEhlbHAgc3RyaW5nCisgKiBccGFyYW1baW5dICAgYWNjZXNzX3JpZ2h0ICAgIEFjY2VzcyByaWdodHMKKyAqIFxwYXJhbVtpbl0gICBleHRyYXMgICAgICAgICAgT3B0aW9uYWwgZXh0cmFzCisgKiBccGFyYW1baW5dICAgcGFybXMgICAgICAgICAgIE9wdGlvbmFsIHBhcmFtZXRlcnMgYXJyYXkuIE11c3Qgbm90IGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2shCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHBhcm1zIT1OVUxMLCB0aGUgbGFzdCBwYXJhbWV0ZXIgaW4gdGhlIGFycmF5IG11c3QgaGF2ZSBuYW1lPT1OVUxMLgorICogXHJldHVybgorICogICAgICAwICAgPU9LXG4KKyAqICAgICAgPDAgID1lcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9jbWRfYWRkKGJjbWNsaV9lbnRyeSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBiY21jbGlfY21kX2NiIGNtZF9jYiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhlbHAsIGJjbWNsaV9hY2Nlc3NfcmlnaHQgYWNjZXNzX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9leHRyYV9wYXJtICpleHRyYXMsIGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdKTsKKworCisvKiogRGVzdHJveSB0b2tlbiAoY29tbWFuZCBvciBkaXJlY3RvcnkpCisgKiBccGFyYW1baW5dICAgdG9rZW4gICAgICAgICAgIERpcmVjdG9yeSBvciBjb21tYW5kIHRva2VuLiBOVUxMPXJvb3QKKyAqLwordm9pZCBiY21jbGlfdG9rZW5fZGVzdHJveShiY21jbGlfZW50cnkgKnRva2VuKTsKKworLyoqIFBhcnNlIGFuZCBleGVjdXRlIGlucHV0IHN0cmluZy4KKyAqIGlucHV0X3N0cmluZyBjYW4gY29udGFpbiBtdWx0aXBsZSBjb21tYW5kcyBkZWxpbWl0ZWQgYnkgJzsnCisgKgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgIGlucHV0X3N0cmluZyAgICBTdHJpbmcgdG8gYmUgcGFyc2VkCisgKiBccmV0dXJuCisgKiAgICAgID0wICAtIE9LIFxuCisgKiAgICAgIC1FSU5WQUwgLSBwYXJzaW5nIGVycm9yXG4KKyAqICAgICAgb3RoZXIgLSByZXR1cm4gY29kZSAtIGFzIHJldHVybmVkIGZyb20gY29tbWFuZCBoYW5kbGVyLgorICogICAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0byByZXR1cm4gLUVJTlRSIHRvIGludGVycnVwdCBtb25pdG9yIGxvb3AuCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9wYXJzZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqaW5wdXRfc3RyaW5nKTsKKworLyoqIFJlYWQgaW5wdXQgYW5kIHBhcnNlIGl0ZXJhdGl2ZWx5IHVudGlsIEVPRiBvciBiY21jbGlfaXNfc3RvcHBlZCgpCisgKgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHJldHVybgorICogICAgICA9MCAgLSBPSyBcbgorICovCitiY21vc19lcnJubyBiY21jbGlfZHJpdmVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworLyoqIFN0b3AgbW9uaXRvciBkcml2ZXIuCisgKiBUaGUgZnVuY3Rpb24gc3RvcHMgXHJlZiBiY21jbGlfZHJpdmVyCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKi8KK3ZvaWQgYmNtY2xpX3N0b3AoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pOworCisvKiogUmV0dXJucyAxIGlmIG1vbml0b3Igc2Vzc2lvbiBpcyBzdG9wcGVkCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccmV0dXJucyAxIGlmIG1vbml0b3Igc2Vzc2lvbiBzdG9wcGVkIGJ5IGJjbWNsaV9zdG9wKClcbgorICogMCBvdGhlcndpc2UKKyAqLworYmNtb3NfYm9vbCBiY21jbGlfaXNfc3RvcHBlZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbik7CisKKy8qKiBHZXQgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBzZXNzaW9uLAorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHJldHVybiAgICAgIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBoYW5kbGUKKyAqLworYmNtY2xpX2VudHJ5ICpiY21jbGlfZGlyX2dldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiApOworCisvKiogU2V0IGN1cnJlbnQgZGlyZWN0b3J5IGZvciB0aGUgc2Vzc2lvbi4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBkaXIgICAgICAgICAgICAgRGlyZWN0b3J5IHRoYXQgc2hvdWxkIGJlY29tZSBjdXJyZW50CisgKiBccmV0dXJuCisgKiAgICAgID0wICAtIE9LCisgKiAgICAgIDwwICAtIGVycm9yCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9kaXJfc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21jbGlfZW50cnkgKmRpcik7CisKKy8qKiBHZXQgcGFyYW1ldGVyIG51bWJlciBnaXZlbiBpdHMgbmFtZS4KKyAqIFRoZSBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGNvbW1hbmQgaGFuZGxlcnMKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIHBhcm1fbmFtZSAgICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHJldHVybgorICogID49MCAtIHBhcmFtZXRlciBudW1iZXJcbgorICogIDwwICAtIHBhcmFtZXRlciB3aXRoIHRoaXMgbmFtZSBkb2Vzbid0IGV4aXN0CisgKi8KK2ludCBiY21jbGlfcGFybV9udW1iZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKnBhcm1fbmFtZSk7CisKKy8qKiBHZXQgcGFyYW1ldGVyIGJ5IG5hbWUKKyAqIFRoZSBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGNvbW1hbmQgaGFuZGxlcnMKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIHBhcm1fbmFtZSAgICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHJldHVybgorICogcGFyYW1ldGVyIHBvaW50ZXIgb3IgTlVMTCBpZiBub3QgZm91bmQKKyAqLworYmNtY2xpX2NtZF9wYXJtICpiY21jbGlfcGFybV9nZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKnBhcm1fbmFtZSk7CisKKy8qKiBDaGVjayBpZiBwYXJhbWV0ZXIgaXMgc2V0CisgKiBUaGUgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBjb21tYW5kIGhhbmRsZXJzCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtICAgICAgICAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxyZXR1cm4KKyAqIFRSVUUgaWYgcGFyYW1ldGVyIGlzIHNldCwgRkFMU0Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21jbGlfcGFybV9pc19zZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSkKK3sKKyAgICByZXR1cm4gKHBhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkgPyBCQ01PU19UUlVFIDogQkNNT1NfRkFMU0U7Cit9CisKKy8qKiBDaGVjayBpZiBwYXJhbWV0ZXIgaXMgc2V0CisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtX251bWJlciAgICAgUGFyYW1ldGVyIG51bWJlcgorICogXHJldHVybgorICogIDAgaWYgcGFyYW1ldGVyIGlzIHNldFxuCisgKiAgQkNNX0VSUl9OT0VOVCBpZiBwYXJhbWV0ZXIgaXMgbm90IHNldAorICogIEJDTV9FUlJfUEFSTSBpZiBwYXJtX251bWJlciBpcyBpbnZhbGlkCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9wYXJtX2NoZWNrKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBpbnQgcGFybV9udW1iZXIpOworCisKKy8qKiBHZXQgZW51bSdzIHN0cmluZyB2YWx1ZSBnaXZlbiBpdHMgaW50ZXJuYWwgdmFsdWUKKyAqIFxwYXJhbVtpbl0gICAgICAgdGFibGUgICAgICAgICAgIEVudW0gdGFibGUKKyAqIFxwYXJhbVtpbl0gICAgICAgdmFsdWUgICAgICAgICAgIEludGVybmFsIHZhbHVlCisgKiBccmV0dXJuCisgKiAgICAgIGVudW0gc3RyaW5nIHZhbHVlIG9yIE5VTEwgaWYgaW50ZXJuYWwgdmFsdWUgaXMgaW52YWxpZAorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmJjbWNsaV9lbnVtX3N0cmluZ3ZhbChjb25zdCBiY21jbGlfZW51bV92YWwgdGFibGVbXSwgbG9uZyB2YWx1ZSkKK3sKKyAgICB3aGlsZSh0YWJsZS0+bmFtZSkKKyAgICB7CisgICAgICAgIGlmICh0YWJsZS0+dmFsPT12YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiB0YWJsZS0+bmFtZTsKKyAgICAgICAgKyt0YWJsZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqIEdldCBlbnVtJ3MgcGFyYW1ldGVyIHN0cmluZyB2YWx1ZSBnaXZlbiBpdHMgaW50ZXJuYWwgdmFsdWUKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIHBhcm1fbnVtYmVyICAgICBQYXJhbWV0ZXIgbnVtYmVyCisgKiBccGFyYW1baW5dICAgICAgIHZhbHVlICAgICAgICAgICBJbnRlcm5hbCB2YWx1ZQorICogXHJldHVybgorICogICAgICBlbnVtIHN0cmluZyB2YWx1ZSBvciBOVUxMIGlmIHBhcmFtZXRlciBpcyBub3QgZW51bSBvcgorICogICAgICBpbnRlcm5hbCB2YWx1ZSBpcyBpbnZhbGlkCisgKi8KK2NvbnN0IGNoYXIgKmJjbWNsaV9lbnVtX3Bhcm1fc3RyaW5ndmFsKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBpbnQgcGFybV9udW1iZXIsIGxvbmcgdmFsdWUpOworCisKKy8qKiBQcmludCBDTEkgcGFyYW1ldGVyIHZhbHVlCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtICAgICAgICAgICAgUGFyYW1ldGVyCisgKi8KK3ZvaWQgYmNtY2xpX3Bhcm1fcHJpbnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSk7CisKKworLyoqIHN0cm5jcHkgZmxhdm91ciB0aGF0IGFsd2F5cyBhZGQgMCB0ZXJtaW5hdG9yCisgKiBccGFyYW1baW5dICAgICAgIGRzdCAgICAgICAgICAgICBEZXN0aW5hdGlvbiBzdHJpbmcKKyAqIFxwYXJhbVtpbl0gICAgICAgc3JjICAgICAgICAgICAgIFNvdXJjZSBzdHJpbmcKKyAqIFxwYXJhbVtpbl0gICAgICAgZHN0X3NpemUgICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlciBzaXplCisgKiBccmV0dXJuIGRzdAorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKmJjbWNsaV9zdHJuY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCB1aW50MzJfdCBkc3Rfc2l6ZSkKK3sKKyAgICBzdHJuY3B5KGRzdCwgc3JjLCBkc3Rfc2l6ZS0xKTsKKyAgICBkc3RbZHN0X3NpemUtMV0gPSAwOworICAgIHJldHVybiBkc3Q7Cit9CisKKworLyoqIHN0cm5jYXQgZmxhdm91ciB0aGF0IGxpbWl0cyBzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogXHBhcmFtW2luXSAgICAgICBkc3QgICAgICAgICAgICAgRGVzdGluYXRpb24gc3RyaW5nCisgKiBccGFyYW1baW5dICAgICAgIHNyYyAgICAgICAgICAgICBTb3VyY2Ugc3RyaW5nCisgKiBccGFyYW1baW5dICAgICAgIGRzdF9zaXplICAgICAgICBEZXN0aW5hdGlvbiBidWZmZXIgc2l6ZQorICogXHJldHVybiBkc3QKKyAqLworc3RhdGljIGlubGluZSBjaGFyICpiY21jbGlfc3RybmNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgdWludDMyX3QgZHN0X3NpemUpCit7CisgICAgdWludDMyX3QgZHN0X2xlbiA9IHN0cmxlbihkc3QpOworICAgIHJldHVybiBzdHJuY2F0KGRzdCwgc3JjLCBkc3Rfc2l6ZS1kc3RfbGVuLTEpOworfQorCisvKiBSZWRlZmluZSBiY21jbGlfc2Vzc2lvbl9wcmludCAtLT4gYmNtY2xpX3ByaW50ICovCisjZGVmaW5lIGJjbWNsaV9wcmludCBiY21jbGlfc2Vzc2lvbl9wcmludAorCisvKiogRW5hYmxlIC8gZGlzYWJsZSBDTEkgY29tbWFuZCBsb2dnaW5nCisgKiBccGFyYW1baW5dICAgbW9kZSAgICBMb2dnaW5nIGZsYWdzCisgKiBccGFyYW1baW5dICAgbG9nICAgICBMb2cgc2Vzc2lvbi4gTXVzdCBiZSBzZXQgaWYgbW9kZSAhPSBCQ01DTElfQ01EX0xPR19OT05FCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX2xvZ19zZXQoYmNtY2xpX2xvZ19tb2RlIG1vZGUsIGJjbWNsaV9zZXNzaW9uICpsb2cpOworCisvKiogV3JpdGUgc3RyaW5nIHRvIENMSSBsb2cuCisgKiBUaGUgZnVuY3Rpb24gaXMgaWdub3JlZCBpZiBDTEkgbG9nZ2luZyBpcyBub3QgZW5hYmxlZCB1c2luZyBiY21jbGlfbG9nX3NldCgpCisgKiBccGFyYW1baW5dICAgZm9ybWF0ICBwcmludGYtbGlrZSBmb3JtYXQgZm9sbG93ZWQgYnkgYXJndW1lbnRzCisgKi8KK3ZvaWQgYmNtY2xpX2xvZyhjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8qKiBAfSBlbmQgYmNtX2NsaSBncm91cCAqLworCisjZW5kaWYgLyogI2lmbmRlZiBCQ01fQ0xJX0ggKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3NlcnZlci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwZDk4ZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3NlcnZlci5jCkBAIC0wLDAgKzEsNTQ2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBiY21jbGlfc2VydmVyLmMKKyAqCisgKiBDTEkgZW5naW5lIC0gcmVtb3RlIHNoZWxsIHN1cHBvcnQKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBhIGJhY2stZW5kIG9mIHJlbW90ZSBzaGVsbCBzdXBwb3J0LgorICogLSBtdWx0aXBsZSBzZXJ2ZXJzCisgKiAtIGRvbWFpbiBhbmQgVENQLWJhc2VkIGNvbm5lY3Rpb25zCisgKiAtIHNlc3Npb24gYWNjZXNzIGxldmVsIC0gcGVyIHNlcnZlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxiY21jbGlfc2VydmVyLmg+CisKK3R5cGVkZWYgc3RydWN0IGJjbWNsaXNfc2VydmVyIGJjbWNsaXNfc2VydmVyX3Q7CisKKy8qIFNlcnZlciBjb25uZWN0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaXNfY29ubgoreworICAgIHN0cnVjdCBiY21jbGlzX2Nvbm4gKm5leHQ7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqc2VydmVyOworICAgIGNvbnN0IGNoYXIgKmFkZHJlc3M7IC8qIGNsaWVudCBhZGRyZXNzICovCisgICAgaW50IHNvY2s7ICAgICAgICAgICAgIC8qIHRyYW5zcG9ydCBzb2NrZXQgKi8KKyAgICBiZG1mX3Rhc2sgcnhfdGhyZWFkOworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uOworICAgIHVpbnQzMl90IGJ5dGVzX3NlbnQ7CisgICAgdWludDMyX3QgYnl0ZXNfcmVjZWl2ZWQ7CisgICAgYmRtZl90YXNrIGNvbm5fdGhyZWFkOworfSBiY21jbGlzX2Nvbm5fdDsKKworLyogU2VydmVyIGNvbnRyb2wgYmRtZm9jaworICovCitzdHJ1Y3QgYmNtY2xpc19zZXJ2ZXIKK3sKKyAgICBiY21jbGlzX3NlcnZlcl90ICpuZXh0OworICAgIGJjbWNsaXNfY29ubl90ICpjb25uX2xpc3Q7CisgICAgaW50IHNvY2s7ICAgICAgICAgICAgIC8qIGxpc3RlbmluZyBzb2NrZXQgKi8KKyAgICBiY21jbGlzX3Bhcm1fdCBwYXJtczsKKyAgICBpbnQgaWQ7CisgICAgaW50IG5jb25uczsKKyAgICBiY21vc19mYXN0bG9jayBsb2NrOworICAgIGJkbWZfdGFzayBsaXN0ZW5fdGhyZWFkOworfTsKKworLyogc29jYWRkciB2YXJpYW50cyAqLwordHlwZWRlZiB1bmlvbgoreworICAgIHN0cnVjdCBzb2NrYWRkciBzYTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gZG9tYWluX3NhOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiB0Y3Bfc2E7Cit9IHNvY2thZGRyX2FueTsKKworc3RhdGljIGJjbWNsaXNfc2VydmVyX3QgKmJjbWNsaXNfc2VydmVyczsKK3N0YXRpYyBpbnQgYmNtY2xpc19zZXJ2ZXJfaWQ7CisKK3N0YXRpYyBiY21jbGlzX3NlcnZlcl90ICpiY21jbGlzX2lkX3RvX3NlcnZlcihpbnQgaHMsIGJjbWNsaXNfc2VydmVyX3QgKipwcmV2KQoreworICAgIGJjbWNsaXNfc2VydmVyX3QgKnM9YmNtY2xpc19zZXJ2ZXJzOworICAgIGlmIChwcmV2KQorICAgICAgICAqcHJldiA9IE5VTEw7CisgICAgd2hpbGUocykKKyAgICB7CisgICAgICAgIGlmIChzLT5pZCA9PSBocykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAocHJldikKKyAgICAgICAgICAgICpwcmV2ID0gczsKKyAgICAgICAgcyA9IHMtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBzOworfQorCisvKiBQYXJzZSBhZGRyZXNzIGhlbHBlciAqLworc3RhdGljIGludCBiY21jbGlzX3BhcnNlX2FkZHJlc3MoY29uc3QgYmNtY2xpc19wYXJtX3QgKnBhcm1zLCBpbnQgKnByb3RvY29sLCBzb2NrYWRkcl9hbnkgKnNhLCBpbnQgKmxlbikKK3sKKyAgICBzd2l0Y2gocGFybXMtPnRyYW5zcG9ydCkKKyAgICB7CisgICAgY2FzZSBCQ01DTElfVFJBTlNQT1JUX0RPTUFJTl9TT0NLRVQ6CisgICAgeworICAgICAgICAqcHJvdG9jb2wgPSBBRl9VTklYOworICAgICAgICBzYS0+ZG9tYWluX3NhLnN1bl9mYW1pbHkgPSBBRl9VTklYOyAgLyogbG9jYWwgaXMgZGVjbGFyZWQgYmVmb3JlIHNvY2tldCgpIF4gKi8KKyAgICAgICAgc3RyY3B5KHNhLT5kb21haW5fc2Euc3VuX3BhdGgsIHBhcm1zLT5hZGRyZXNzKTsKKyAgICAgICAgKmxlbiA9IHN0cmxlbihzYS0+ZG9tYWluX3NhLnN1bl9wYXRoKSArIHNpemVvZihzYS0+ZG9tYWluX3NhLnN1bl9mYW1pbHkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCQ01DTElfVFJBTlNQT1JUX1RDUF9TT0NLRVQ6CisgICAgeworICAgICAgICAqcHJvdG9jb2wgPSBBRl9JTkVUOworICAgICAgICBzYS0+dGNwX3NhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBzYS0+dGNwX3NhLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShwYXJtcy0+YWRkcmVzcykpOworICAgICAgICBzYS0+dGNwX3NhLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisgICAgICAgICpsZW4gPSBzaXplb2Yoc2EtPnRjcF9zYSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKiBkaXNjb25uZWN0IGNsaWVudCBhbmQgY2xlYXIgcmVzb3VyY2VzICovCitzdGF0aWMgdm9pZCBiY21jbGlzX2Rpc2Nvbm5lY3QoYmNtY2xpc19jb25uX3QgKmNvbm4pCit7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqcz1jb25uLT5zZXJ2ZXI7CisgICAgYmNtY2xpc19jb25uX3QgKmM9cy0+Y29ubl9saXN0LCAqcHJldj1OVUxMOworCisgICAgYmNtb3NfZmFzdGxvY2tfbG9jaygmcy0+bG9jayk7CisgICAgd2hpbGUoYyAmJiBjIT1jb25uKQorICAgIHsKKyAgICAgICAgcHJldiA9IGM7CisgICAgICAgIGMgPSBjLT5uZXh0OworICAgIH0KKyAgICBCVUdfT04oIWMpOworICAgIGlmIChwcmV2KQorICAgICAgICBwcmV2LT5uZXh0ID0gYy0+bmV4dDsKKyAgICBlbHNlCisgICAgICAgIHMtPmNvbm5fbGlzdCA9IGMtPm5leHQ7CisgICAgLS1zLT5uY29ubnM7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZzLT5sb2NrKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9jbG9zZShjLT5zZXNzaW9uKTsKKyAgICBjbG9zZShjLT5zb2NrKTsKKyAgICBiZG1mX3Rhc2tfZGVzdHJveShjLT5yeF90aHJlYWQpOworICAgIGJjbW9zX2ZyZWUoYyk7Cit9CisKKy8qCisgKiBTZXNzaW9uIGNhbGxiYWNrcworICovCisKKy8qKiBTZXNzaW9uJ3Mgb3V0cHV0IGZ1bmN0aW9uLgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3IgPDAgaWYgZXJyb3IKKyAqLworc3RhdGljIGludCBiY21jbGlzX2NiX3Nlc3Nfd3JpdGUodm9pZCAqdXNlcl9wcml2LCBjb25zdCB2b2lkICpidWYsIHVpbnQzMl90IHNpemUpCit7CisgICAgYmNtY2xpc19jb25uX3QgKmM9dXNlcl9wcml2OworICAgIGludCByYzsKKworICAgIHJjID0gc2VuZChjLT5zb2NrLCBidWYsIHNpemUsIDApOworICAgIC8qIGRpc2Nvbm5lY3QgaWYgSU8gZXJyb3IgKi8KKyAgICBpZiAocmMgPCBzaXplKQorICAgICAgICBiY21jbGlzX2Rpc2Nvbm5lY3QoYyk7CisgICAgZWxzZQorICAgICAgICBjLT5ieXRlc19zZW50ICs9IHJjOworICAgIHJldHVybiByYzsKK30KKworI2RlZmluZSBDSEFSX0VPVCAweDA0CisKKy8qKiBTZXNzaW9uJ3MgaW5wdXQgZnVuY3Rpb24uCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciA8MCBpZiBlcnJvcgorICovCitzdGF0aWMgY2hhciAqYmNtY2xpc19yZWFkX2xpbmUoYmNtY2xpc19jb25uX3QgKmMsIGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmM7CisgICAgaW50IGxlbj0wOworCisgICAgZm9yKGk9MDsgaTxzaXplLTE7IGkrKykKKyAgICB7CisgICAgICAgIGNoYXIgY2g7CisgICAgICAgIHJjID0gcmVjdihjLT5zb2NrLCAmY2gsIDEsIE1TR19XQUlUQUxMKTsKKyAgICAgICAgaWYgKHJjIDw9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGNoID09ICdccicpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGNoID09IENIQVJfRU9UKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJ1ZltsZW4rK10gPSBjaDsKKyAgICAgICAgaWYgKGNoID09ICdcbicpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgYy0+Ynl0ZXNfcmVjZWl2ZWQgKz0gaTsKKyAgICBidWZbbGVuXSA9IDA7CisgICAgcmV0dXJuIChsZW4gPyBidWYgOiBOVUxMKTsKK30KKworLyogUmVjZWl2ZSBoYW5kbGVyICovCitzdGF0aWMgaW50IGJjbWNsaXNfcnhfdGhyZWFkX2hhbmRsZXIodm9pZCAqYXJnKQoreworICAgIGNoYXIgYnVmWzUxMl07CisgICAgYmNtY2xpc19jb25uX3QgKmM9YXJnOworCisgICAgd2hpbGUoIWJjbWNsaV9pc19zdG9wcGVkKGMtPnNlc3Npb24pICYmCisgICAgICAgICAgYmNtY2xpc19yZWFkX2xpbmUoYywgYnVmLCBzaXplb2YoYnVmKSkpCisgICAgeworICAgICAgICBiY21jbGlfcGFyc2UoYy0+c2Vzc2lvbiwgYnVmKTsKKyAgICB9CisgICAgYmNtY2xpc19kaXNjb25uZWN0KGMpOworICAgIHJldHVybiAwOworfQorCisvKiBOZXcgY2xpZW50IGNvbm5lY3Rpb24gaW5kaWNhdGlvbiAqLworc3RhdGljIHZvaWQgYmNtY2xpc19jb25uZWN0KGJjbWNsaXNfc2VydmVyX3QgKnMsIGNoYXIgKmFkZHIsIGludCBzb2NrKQoreworICAgIGJjbWNsaXNfY29ubl90ICpjOworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc2Vzc19wYXJtOworICAgIGludCByYzsKKworICAgIGlmIChzLT5wYXJtcy5tYXhfY2xpZW50cyAmJiBzLT5uY29ubnMgPj0gcy0+cGFybXMubWF4X2NsaWVudHMpCisgICAgeworICAgICAgICBiY21vc19wcmludGYoImJkbWZtb25zOiBzZXJ2ZXIgJXM6IHJlZnVzZWQgY29ubmVjdGlvbiBiZWNhdXNlIG1heCBudW1iZXIgaGFzIGJlZW4gcmVhY2hlZFxuIiwgcy0+cGFybXMuYWRkcmVzcyk7CisgICAgICAgIGNsb3NlKHNvY2spOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKmMpICsgc3RybGVuKGFkZHIpICsgMSk7CisgICAgaWYgKCFjKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgYy0+YWRkcmVzcyA9IChjaGFyICopYyArIHNpemVvZigqYyk7CisgICAgc3RyY3B5KChjaGFyICopYy0+YWRkcmVzcywgYWRkcik7CisgICAgYy0+c2VydmVyID0gczsKKyAgICBjLT5zb2NrID0gc29jazsKKworICAgIC8qIGNyZWF0ZSBuZXcgbWFuYWdlbWVudCBzZXNzaW9uICovCisgICAgbWVtc2V0KCZzZXNzX3Bhcm0sIDAsIHNpemVvZihzZXNzX3Bhcm0pKTsKKyAgICBzZXNzX3Bhcm0uYWNjZXNzX3JpZ2h0ID0gcy0+cGFybXMuYWNjZXNzOworICAgIHNlc3NfcGFybS53cml0ZSA9IGJjbWNsaXNfY2Jfc2Vzc193cml0ZTsKKyAgICBzZXNzX3Bhcm0udXNlcl9wcml2ID0gYzsKKyAgICByYyA9IGJjbWNsaV9zZXNzaW9uX29wZW4oJnNlc3NfcGFybSwgJmMtPnNlc3Npb24pOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgLyogd2FpdCBmb3IgcmVjZWl2ZSBpbiBhIHNlcGFyYXRlIHRocmVhZCAqLworICAgIHJjID0gYmRtZl90YXNrX2NyZWF0ZSgiYmNtY2xpc19yeCIsCisgICAgICAgICAgICAgICAgICAgIEJETUZTWVNfREVGQVVMVF9UQVNLX1BSSU9SSVRZLAorICAgICAgICAgICAgICAgICAgICBCRE1GU1lTX0RFRkFVTFRfVEFTS19TVEFDSywKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpc19yeF90aHJlYWRfaGFuZGxlciwgYywKKyAgICAgICAgICAgICAgICAgICAgJmMtPnJ4X3RocmVhZCk7CisgICAgaWYgKHJjKQorICAgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICBiY21vc19mYXN0bG9ja19sb2NrKCZzLT5sb2NrKTsKKyAgICBjLT5uZXh0ID0gcy0+Y29ubl9saXN0OworICAgIHMtPmNvbm5fbGlzdCA9IGM7CisgICAgKytzLT5uY29ubnM7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZzLT5sb2NrKTsKKworICAgIHJldHVybjsKKworY2xlYW51cDoKKyAgICBjbG9zZShzb2NrKTsKKyAgICBpZiAoYy0+c2Vzc2lvbikKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2UoYy0+c2Vzc2lvbik7CisgICAgaWYgKGMpCisgICAgICAgIGJjbW9zX2ZyZWUoYyk7Cit9CisKKy8qIFJlY2VpdmUgaGFuZGxlciAqLworc3RhdGljIGludCBiY21jbGlzX2xpc3Rlbl90aHJlYWRfaGFuZGxlcih2b2lkICphcmcpCit7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqcz1hcmc7CisgICAgc29ja2FkZHJfYW55IGFkZHI7CisgICAgc29ja2xlbl90IGxlbjsKKyAgICBpbnQgc29jazsKKworICAgIHdoaWxlKDEpCisgICAgeworICAgICAgICBjaGFyIGNhZGRyWzY0XTsKKyAgICAgICAgbGVuID0gc2l6ZW9mKGFkZHIpOworICAgICAgICBzb2NrID0gYWNjZXB0KHMtPnNvY2ssICZhZGRyLnNhLCAmbGVuKTsKKyAgICAgICAgaWYgKHNvY2sgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBwZXJyb3IoImFjY2VwdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnBhcm1zLnRyYW5zcG9ydD09QkNNQ0xJX1RSQU5TUE9SVF9ET01BSU5fU09DS0VUKQorICAgICAgICAgICAgc3RybmNweShjYWRkciwgcy0+cGFybXMuYWRkcmVzcywgc2l6ZW9mKGNhZGRyKS0xKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihjYWRkciwgc2l6ZW9mKGNhZGRyKS0xLCAiJXM6JWQiLAorICAgICAgICAgICAgICAgIGluZXRfbnRvYShhZGRyLnRjcF9zYS5zaW5fYWRkciksIG50b2hzKGFkZHIudGNwX3NhLnNpbl9wb3J0KSk7CisgICAgICAgIH0KKyAgICAgICAgYmNtY2xpc19jb25uZWN0KHMsIGNhZGRyLCBzb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFeHRlcm5hbCBBUEkKKyAqLworCisvKiogQ3JlYXRlIHNoZWxsIHNlcnZlci4KKyAqIEltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW9uIHNlcnZlciBpcyByZWFkeSB0byBhY2NlcHQgY2xpZW50IGNvbm5lY3Rpb25zCisgKiBccGFyYW1baW5dICAgcGFybXMgICBTZXJ2ZXIgcGFyYW1ldGVycworICogXHBhcmFtW291dF0gIGhzICAgICAgU2VydmVyIGhhbmRsZQorICogXHJldHVybiAgMCAtIE9LXG4KKyAqICAgICAgICAgPDAgLSBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaXNfc2VydmVyX2NyZWF0ZShjb25zdCBiY21jbGlzX3Bhcm1fdCAqcGFybXMsIGludCAqaHMpCit7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqczsKKyAgICBpbnQgcHJvdG9jb2w7CisgICAgc29ja2FkZHJfYW55IHNhOworICAgIGludCBsZW47CisgICAgaW50IHJjOworCisgICAgaWYgKCFwYXJtcyB8fCAhaHMgfHwgIXBhcm1zLT5hZGRyZXNzKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgLyogcGFyc2UgYWRkcmVzcyAqLworICAgIGlmIChiY21jbGlzX3BhcnNlX2FkZHJlc3MocGFybXMsICZwcm90b2NvbCwgJnNhLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIC8qIGFsbG9jYXRlIHNlcnZlciBzdHJ1Y3R1cmUgKi8KKyAgICBzID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlzX3NlcnZlcl90KStzdHJsZW4ocGFybXMtPmFkZHJlc3MpKzEpOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgcy0+cGFybXMgPSAqcGFybXM7CisgICAgcy0+cGFybXMuYWRkcmVzcyA9IChjaGFyICopcyArIHNpemVvZigqcyk7CisgICAgc3RyY3B5KHMtPnBhcm1zLmFkZHJlc3MsIHBhcm1zLT5hZGRyZXNzKTsKKyAgICBzLT5pZCA9ICsrYmNtY2xpc19zZXJ2ZXJfaWQ7CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmcy0+bG9jayk7CisKKyAgICAvKiBjcmVhdGUgc29ja2V0IGFuZCBzdGFydCBsaXN0ZW5pbmcgKi8KKyAgICBzLT5zb2NrID0gc29ja2V0KHByb3RvY29sLCBTT0NLX1NUUkVBTSwgMCk7CisgICAgaWYgKChzLT5zb2NrIDwgMCkgfHwKKyAgICAgICAgKGJpbmQocy0+c29jaywgJnNhLnNhLCBsZW4pIDwgMCkgfHwKKyAgICAgICAgKGxpc3RlbihzLT5zb2NrLCAxKSA8IDApKQorICAgIHsKKyAgICAgICAgcGVycm9yKCJzb2NrZXQvYmluZC9saXN0ZW4iKTsKKyAgICAgICAgY2xvc2Uocy0+c29jayk7CisgICAgICAgIGJjbW9zX2ZyZWUocyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogd2FpdCBmb3IgY29ubmVjdGlvbihzKSBpbiBhIHNlcGFyYXRlIHRocmVhZCAqLworICAgIHJjID0gYmRtZl90YXNrX2NyZWF0ZSgiYmNtY2xpc19saXN0ZW4iLAorICAgICAgICAgICAgICAgICAgICBCRE1GU1lTX0RFRkFVTFRfVEFTS19QUklPUklUWSwKKyAgICAgICAgICAgICAgICAgICAgQkRNRlNZU19ERUZBVUxUX1RBU0tfU1RBQ0ssCisgICAgICAgICAgICAgICAgICAgIGJjbWNsaXNfbGlzdGVuX3RocmVhZF9oYW5kbGVyLCBzLAorICAgICAgICAgICAgICAgICAgICAmcy0+bGlzdGVuX3RocmVhZCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgY2xvc2Uocy0+c29jayk7CisgICAgICAgIGJjbW9zX2ZyZWUocyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBhbGwgZ29vZCAqLworICAgIHMtPm5leHQgPSBiY21jbGlzX3NlcnZlcnM7CisgICAgYmNtY2xpc19zZXJ2ZXJzID0gczsKKyAgICAqaHMgPSBzLT5pZDsKKworICAgIHJldHVybiAwOworfQorCisvKiogRGVzdHJveSBzaGVsbCBzZXJ2ZXIuCisgKiBBbGwgY2xpZW50IGNvbm5lY3Rpb25zIGlmIGFueSBhcmUgY2xvc2VkCisgKiBccGFyYW1baW5dICAgaHMgICAgICBTZXJ2ZXIgaGFuZGxlCisgKiBccmV0dXJuICAwIC0gT0tcbgorICogICAgICAgICA8MCAtIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtY2xpc19zZXJ2ZXJfZGVzdHJveShpbnQgaHMpCit7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqcHJldjsKKyAgICBiY21jbGlzX3NlcnZlcl90ICpzID0gYmNtY2xpc19pZF90b19zZXJ2ZXIoaHMsICZwcmV2KTsKKyAgICBiY21jbGlzX2Nvbm5fdCAqYzsKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgYmRtZl90YXNrX2Rlc3Ryb3kocy0+bGlzdGVuX3RocmVhZCk7CisgICAgY2xvc2Uocy0+c29jayk7CisKKyAgICAvKiBkaXNjb25uZWN0IGFsbCBjbGllbnRzICovCisgICAgd2hpbGUoKGMgPSBzLT5jb25uX2xpc3QpKQorICAgICAgICBiY21jbGlzX2Rpc2Nvbm5lY3QoYyk7CisKKyAgICAvKiBkZXN0cm95IHNlcnZlciAqLworICAgIGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnMtPmxvY2spOworICAgIGlmIChwcmV2KQorICAgICAgICBwcmV2LT5uZXh0ID0gcy0+bmV4dDsKKyAgICBlbHNlCisgICAgICAgIGJjbWNsaXNfc2VydmVycyA9IHMtPm5leHQ7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZzLT5sb2NrKTsKKworICAgIGJjbW9zX2ZyZWUocyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTaGVsbCBjb21tYW5kIGhhbmRsZXJzCisgKi8KKworc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCB0cmFuc3BvcnRfdHlwZV9lbnVtX3RhYmRtZmVbXSA9IHsKKyAgICB7IC5uYW1lPSJkb21haW5fc29ja2V0IiwgLnZhbD1CQ01DTElfVFJBTlNQT1JUX0RPTUFJTl9TT0NLRVR9LAorICAgIHsgLm5hbWU9InRjcF9zb2NrZXQiLCAudmFsPUJDTUNMSV9UUkFOU1BPUlRfVENQX1NPQ0tFVH0sCisgICAgQkNNQ0xJX0VOVU1fTEFTVAorfTsKKworc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBhY2Nlc3NfdHlwZV9lbnVtX3RhYmRtZmVbXSA9IHsKKyAgICB7IC5uYW1lPSJndWVzdCIsIC52YWw9QkNNQ0xJX0FDQ0VTU19HVUVTVH0sCisgICAgeyAubmFtZT0iYWRtaW4iLCAudmFsPUJDTUNMSV9BQ0NFU1NfQURNSU59LAorICAgIHsgLm5hbWU9ImRlYnVnIiwgLnZhbD1CQ01DTElfQUNDRVNTX0RFQlVHfSwKKyAgICBCQ01DTElfRU5VTV9MQVNUCit9OworCisvKiBDcmVhdGUgcmVtb3RlIHNoZWxsIHNlcnZlcgorICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgidHJhbnNwb3J0IiwgIlRyYW5zcG9ydCB0eXBlIiwgdHJhbnNwb3J0X3R5cGVfZW51bV90YWJkbWZlLCAwKSwKKyAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyZXNzIiwgIkJpbmQgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX1NUUklORywgMCksCisgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJhY2Nlc3MiLCAiQWNjZXNzIGxldmVsIiwgYWNjZXNzX3R5cGVfZW51bV90YWJkbWZlLCAwKSwKKyAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgibWF4X2NsaWVudHMiLCAiTWF4IGNsaWVudHMuIDA9ZGVmYXVsdCIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCwgMCksCisqLworc3RhdGljIGludCBiY21jbGlzX21vbl9jcmVhdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWNsaXNfdHJhbnNwb3J0X3R5cGVfdCB0cmFuc3BvcnQgPSAoYmNtY2xpc190cmFuc3BvcnRfdHlwZV90KXBhcm1bMF0udmFsdWUubnVtYmVyOworICAgIGNoYXIgKmFkZHJlc3MgPSAoY2hhciAqKXBhcm1bMV0udmFsdWUubnVtYmVyOworICAgIGJjbWNsaV9hY2Nlc3NfcmlnaHQgYWNjZXNzID0gKGJjbWNsaV9hY2Nlc3NfcmlnaHQpcGFybVsyXS52YWx1ZS5udW1iZXI7CisgICAgaW50IG1heF9jbGllbnRzID0gKGludClwYXJtWzNdLnZhbHVlLm51bWJlcjsKKyAgICBiY21jbGlzX3Bhcm1fdCBwYXJtczsKKyAgICBpbnQgaHM7CisgICAgaW50IHJjOworCisgICAgbWVtc2V0KCZwYXJtcywgMCwgc2l6ZW9mKHBhcm1zKSk7CisgICAgcGFybXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIHBhcm1zLmFjY2VzcyA9IGFjY2VzczsKKyAgICBwYXJtcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICBwYXJtcy5tYXhfY2xpZW50cyA9IG1heF9jbGllbnRzOworICAgIHJjID0gYmNtY2xpc19zZXJ2ZXJfY3JlYXRlKCZwYXJtcywgJmhzKTsKKyAgICBpZiAocmMpCisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJiY21jbGlzX3NlcnZlcl9jcmVhdGUoKSBmYWlsZWQgd2l0aCByYz0lZCAtICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgZWxzZQorICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVtb3RlIHNoZWxsIHNlcnZlciBjcmVhdGVkLiBTZXJ2ZXIgaWQgJWRcbiIsIGhzKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIERlc3Ryb3kgcmVtb3RlIHNoZWxsIHNlcnZlcgorICAgIEJDTUNMSV9NQUtFX1BBUk0oInNlcnZlcl9pZCIsICJTZXJ2ZXIgaWQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorKi8KK3N0YXRpYyBpbnQgYmNtY2xpc19tb25fZGVzdHJveShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgaW50IGhzID0gKGludClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKyAgICBpbnQgcmM7CisgICAgcmMgPSBiY21jbGlzX3NlcnZlcl9kZXN0cm95KGhzKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVtb3RlIHNoZWxsIHNlcnZlciAlZCBkZXN0cm95ZWQuIHJjPSVkIC0gJXNcbiIsCisgICAgICAgIGhzLCByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFNob3cgcmVtb3RlIHNoZWxsIHNlcnZlcnMKKyovCitzdGF0aWMgaW50IGJjbWNsaXNfbW9uX3Nob3coYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWNsaXNfc2VydmVyX3QgKnM9YmNtY2xpc19zZXJ2ZXJzOworICAgIGJjbWNsaXNfY29ubl90ICpjOworICAgIHdoaWxlKHMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVtb3RlIHNlcnZlciAlZCBhdCAlc1xuIiwgcy0+aWQsIHMtPnBhcm1zLmFkZHJlc3MpOworICAgICAgICBjID0gcy0+Y29ubl9saXN0OworICAgICAgICB3aGlsZShjKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXHQgLSAlcy4gYnl0ZXMgc2VudDolZCByZWNlaXZlZDolZFxuIiwKKyAgICAgICAgICAgICAgICBjLT5hZGRyZXNzLCBjLT5ieXRlc19zZW50LCBjLT5ieXRlc19yZWNlaXZlZCk7CisgICAgICAgICAgICBjID0gYy0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBzID0gcy0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBzaGVsbF9zZXJ2ZXIgZGlyZWN0b3J5IGluIHJvb3RfZGlyCisgICBSZXR1cm5zIHRoZSAic2hlbGxfc2VydmVyIiBkaXJlY3RvcnkgaGFuZGxlCisqLworYmNtY2xpX2VudHJ5ICpiY21jbGlzX3NlcnZlcl9tb25faW5pdChiY21jbGlfZW50cnkgKnJvb3RfZGlyKQoreworICAgIGJjbWNsaV9lbnRyeSAqc2hlbGxfZGlyOworCisgICAgaWYgKChzaGVsbF9kaXI9YmNtY2xpX2Rpcl9maW5kKE5VTEwsICJzaGVsbF9zZXJ2ZXIiKSkhPU5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc2hlbGxfZGlyID0gYmNtY2xpX2Rpcl9hZGQocm9vdF9kaXIsICJzaGVsbF9zZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVtb3RlIFNoZWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX0FDQ0VTU19HVUVTVCwgTlVMTCk7CisKKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfY21kX3Bhcm0gcGFybXNbXT17CisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oInRyYW5zcG9ydCIsICJUcmFuc3BvcnQgdHlwZSIsIHRyYW5zcG9ydF90eXBlX2VudW1fdGFiZG1mZSwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyZXNzIiwgIkJpbmQgYWRkcmVzczogZG9tYWluX3NvY2tldCBhZGRyZXNzIG9yIFRDUCBwb3J0IiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiYWNjZXNzIiwgIkFjY2VzcyBsZXZlbCIsIGFjY2Vzc190eXBlX2VudW1fdGFiZG1mZSwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgibWF4X2NsaWVudHMiLCAiTWF4IGNsaWVudHMuIDA9ZGVmYXVsdCIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCwgMCksCisgICAgICAgICAgICBCQ01DTElfUEFSTV9MSVNUX1RFUk1JTkFUT1IKKyAgICAgICAgfTsKKyAgICAgICAgYmNtY2xpX2NtZF9hZGQoc2hlbGxfZGlyLCAiY3JlYXRlIiwgYmNtY2xpc19tb25fY3JlYXRlLAorICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGUgcmVtb3RlIHNoZWxsIHNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCwgcGFybXMpOworICAgIH0KKworICAgIHsKKyAgICAgICAgc3RhdGljIGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdPXsKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInNlcnZlcl9pZCIsICJTZXJ2ZXIgaWQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fTElTVF9URVJNSU5BVE9SCisgICAgICAgIH07CisgICAgICAgIGJjbWNsaV9jbWRfYWRkKHNoZWxsX2RpciwgImRlc3Ryb3kiLCBiY21jbGlzX21vbl9kZXN0cm95LAorICAgICAgICAgICAgICAgICAgICAgICJEZXN0cm95IHJlbW90ZSBzaGVsbCBzZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwsIHBhcm1zKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGJjbWNsaV9jbWRfYWRkKHNoZWxsX2RpciwgInNob3ciLCBiY21jbGlzX21vbl9zaG93LAorICAgICAgICAgICAgICAgICAgICAgICJTaG93IHJlbW90ZSBzaGVsbCBzZXJ2ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfQUNDRVNTX0dVRVNULCBOVUxMLCBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2hlbGxfZGlyOworfQorCisvKiBEZXN0cm95IHNoZWxsX3NlcnZlciBkaXJlY3RvcnkKKyovCit2b2lkIGJjbWNsaXNfc2VydmVyX21vbl9kZXN0cm95KHZvaWQpCit7CisgICAgYmNtY2xpX2VudHJ5ICpzaGVsbF9kaXI7CisgICAgc2hlbGxfZGlyPWJjbWNsaV9kaXJfZmluZChOVUxMLCAic2hlbGxfc2VydmVyIik7CisgICAgaWYgKHNoZWxsX2RpcikKKyAgICAgICAgYmNtY2xpX3Rva2VuX2Rlc3Ryb3koc2hlbGxfZGlyKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2VydmVyLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaV9zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmU3NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2VydmVyLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogLW1vbl9zZXJ2ZXIuaAorICoKKyAqIEJMIGZyYW1ld29yayAtIHJlbW90ZSBzaGVsbCBzdXBwb3J0CisgKgorICogVGhpcyBtb2R1bGUgaXMgYSBiYWNrLWVuZCBvZiByZW1vdGUgc2hlbGwgc3VwcG9ydC4KKyAqIC0gbXVsdGlwbGUgc2VydmVycworICogLSBkb21haW4gYW5kIFRDUC1iYXNlZCBjb25uZWN0aW9ucworICogLSBzZXNzaW9uIGFjY2VzcyBsZXZlbCAtIHBlciBzZXJ2ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJDTUNMSV9TRVJWRVJfSF8KKyNkZWZpbmUgQkNNQ0xJX1NFUlZFUl9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpX3Nlc3Npb24uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKworLyoqIFNoZWxsIHNlcnZlciB0cmFuc3BvcnQgdHlwZQorICovCit0eXBlZGVmIGVudW0geworICAgIEJDTUNMSV9UUkFOU1BPUlRfRE9NQUlOX1NPQ0tFVCwKKyAgICBCQ01DTElfVFJBTlNQT1JUX1RDUF9TT0NLRVQsCisKKyAgICBCQ01DTElfVFJBTlNQT1JUX19OVU1CRVJfT0YKK30gYmNtY2xpc190cmFuc3BvcnRfdHlwZV90OworCisvKiogU2hlbGwgc2VydmVyIHBhcmFtZXRlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpc19wYXJtCit7CisgICAgYmNtY2xpX2FjY2Vzc19yaWdodCBhY2Nlc3M7ICAgICAgICAgLyoqPCBBY2Nlc3MgcmlnaHRzICovCisgICAgYmNtY2xpc190cmFuc3BvcnRfdHlwZV90IHRyYW5zcG9ydDsgLyoqPCBUcmFuc3BvcnQgdHlwZSAqLworICAgIGNoYXIgKmFkZHJlc3M7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWRkcmVzcyBpbiBzdHJpbmcgZm9ybTogZG9tYWluIHNvY2tldCBmaWxlIGluIGxvY2FsIEZTOyBwb3J0IGZvciBUQ1Agc29ja2V0ICovCisgICAgaW50IG1heF9jbGllbnRzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIGNsaWVudHMgKi8KK30gYmNtY2xpc19wYXJtX3Q7CisKKworLyoqIENyZWF0ZSBzaGVsbCBzZXJ2ZXIuCisgKiBJbW1lZGlhdGVseSBhZnRlciBjcmVhdGlvbiBzZXJ2ZXIgaXMgcmVhZHkgdG8gYWNjZXB0IGNsaWVudCBjb25uZWN0aW9ucworICogXHBhcmFtW2luXSAgIHBhcm1zICAgU2VydmVyIHBhcmFtZXRlcnMKKyAqIFxwYXJhbVtvdXRdICBocyAgICAgIFNlcnZlciBoYW5kbGUKKyAqIFxyZXR1cm4gIDAgLSBPS1xuCisgKiAgICAgICAgIDwwIC0gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21jbGlzX3NlcnZlcl9jcmVhdGUoY29uc3QgYmNtY2xpc19wYXJtX3QgKnBhcm1zLCBpbnQgKmhzKTsKKworLyoqIERlc3Ryb3kgc2hlbGwgc2VydmVyLgorICogQWxsIGNsaWVudCBjb25uZWN0aW9ucyBpZiBhbnkgYXJlIGNsb3NlZAorICogXHBhcmFtW2luXSAgIGhzICAgICAgU2VydmVyIGhhbmRsZQorICogXHJldHVybiAgMCAtIE9LXG4KKyAqICAgICAgICAgPDAgLSBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaXNfc2VydmVyX2Rlc3Ryb3koaW50IGhzKTsKKworCisvKiBDcmVhdGUgc2hlbGxfc2VydmVyIGRpcmVjdG9yeSBpbiByb290X2RpcgorICAgUmV0dXJucyB0aGUgInNoZWxsX3NlcnZlciIgZGlyZWN0b3J5IGhhbmRsZQorKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpc19zZXJ2ZXJfbW9uX2luaXQoYmNtY2xpX2VudHJ5ICpyb290X2Rpcik7CisKKworLyogRGVzdHJveSBzaGVsbF9zZXJ2ZXIgZGlyZWN0b3J5CisqLwordm9pZCBiY21jbGlzX3NlcnZlcl9tb25fZGVzdHJveSh2b2lkKTsKKworI2VuZGlmIC8qIEJDTUNMSV9TRVJWRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3Nlc3Npb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3Nlc3Npb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTllYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2Vzc2lvbi5jCkBAIC0wLDAgKzEsNTg3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBiY21jbGlfc2Vzc2lvbi5jCisgKgorICogQ0xJIGVuZ2luZSAtIHNlc3Npb24gbWFuYWdlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X3V0aWxzLmg+CisKKyNkZWZpbmUgQkNNQ0xJX0lOVEVSTkFMCisjaW5jbHVkZSA8YmNtY2xpX3Nlc3Npb24uaD4KKworc3RhdGljIGJjbW9zX2Zhc3Rsb2NrIHNlc3Npb25fbG9jazsKK3N0YXRpYyBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbl9saXN0Oworc3RhdGljIGludCBzZXNzaW9uX21vZHVsZV9pbml0aWFsaXplZDsKKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIF9iY21jbGlfc2Vzc2lvbl91cGRhdGVfcHJvbXB0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHNlc3Npb24tPnBhcm1zLmdldF9wcm9tcHQpCisgICAgeworICAgICAgICBzZXNzaW9uLT5wYXJtcy5nZXRfcHJvbXB0KHNlc3Npb24sIHNlc3Npb24tPnByb21wdF9idWYsIEJDTUNMSV9NQVhfUFJPTVBUX0xFTik7CisgICAgICAgIHNlc3Npb24tPnByb21wdF9idWZbQkNNQ0xJX01BWF9QUk9NUFRfTEVOIC0gMV0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzZXNzaW9uLT5wcm9tcHRfYnVmWzBdID0gJ1wwJzsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICpfYmNtY2xpX3Nlc3Npb25fZ2V0cyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQoreworICAgIGNvbnN0IGNoYXIgKmxpbmUgPSBOVUxMOworICAgIF9iY21jbGlfc2Vzc2lvbl91cGRhdGVfcHJvbXB0KHNlc3Npb24pOworI2lmZGVmIENPTkZJR19MSUJFRElUCisgICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi0+ZWwgJiYgc2Vzc2lvbi0+aGlzdG9yeSkKKyAgICB7CisgICAgICAgIGludCBsaW5lX2xlbjsKKyAgICAgICAgbGluZSA9IChlbF9nZXRzKHNlc3Npb24tPmVsLCAmbGluZV9sZW4pKTsKKyAgICAgICAgaWYgKCFsaW5lKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChsaW5lX2xlbiA+IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiJXM6IGJ1ZmZlciBpcyB0b28gc2hvcnQgJXUgLSBnb3QgJWQuIFRydW5jYXRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2l6ZSwgbGluZV9sZW4pOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkoYnVmZmVyLCBsaW5lLCBzaXplKTsKKyAgICAgICAgaWYgKCpsaW5lICYmICpsaW5lICE9ICdcbicgJiYgKmxpbmUgIT0gJyMnKQorICAgICAgICAgICAgaGlzdG9yeShzZXNzaW9uLT5oaXN0b3J5LCAmc2Vzc2lvbi0+aGlzdGV2ZW50LCBIX0VOVEVSLCBsaW5lKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorICAgIGlmIChzZXNzaW9uICYmIHNlc3Npb24tPmxuX3Nlc3Npb24pCisgICAgeworICAgICAgICBjaGFyICpsbl9saW5lID0gbGluZW5vaXNlKHNlc3Npb24tPmxuX3Nlc3Npb24sIHNlc3Npb24tPnByb21wdF9idWYsIGJ1ZmZlciwgc2l6ZSk7CisgICAgICAgIGlmIChsbl9saW5lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RybGVuKGxuX2xpbmUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbmVub2lzZUhpc3RvcnlBZGQoc2Vzc2lvbi0+bG5fc2Vzc2lvbiwgbG5fbGluZSk7IC8qIEFkZCB0byB0aGUgaGlzdG9yeS4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJuY3B5KGJ1ZmZlciwgIlxuIiwgc2l6ZS0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlcltzaXplLTFdID0gMDsKKyAgICAgICAgICAgIGxpbmUgPSBidWZmZXI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJXMiLCBzZXNzaW9uLT5wcm9tcHRfYnVmKTsKKyAgICAgICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi0+cGFybXMuZ2V0cykKKyAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLT5wYXJtcy5nZXRzKHNlc3Npb24sIGJ1ZmZlciwgc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxpbmUgPSBmZ2V0cyhidWZmZXIsIHNpemUsIHN0ZGluKTsKKyAgICB9CisgICAgcmV0dXJuIGxpbmUgPyBidWZmZXIgOiBOVUxMOworfQorCisjaWZkZWYgQ09ORklHX0xJQkVESVQKKworc3RhdGljIGNoYXIgKl9iY21jbGlfZWRpdGxpbmVfcHJvbXB0KEVkaXRMaW5lICplKQoreworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKKyAgICBlbF9nZXQoZSwgRUxfQ0xJRU5UREFUQSwgJnNlc3Npb24pOworICAgIEJVR19PTihzZXNzaW9uID09IE5VTEwgfHwgc2Vzc2lvbi0+bWFnaWMgIT0gQkNNQ0xJX1NFU1NJT05fTUFHSUMpOworICAgIF9iY21jbGlfc2Vzc2lvbl91cGRhdGVfcHJvbXB0KHNlc3Npb24pOworICAgIHJldHVybiBzZXNzaW9uLT5wcm9tcHRfYnVmOworfQorCitzdGF0aWMgaW50IF9iY21jbGlfZWRpdGxpbmVfY2ZuKEVkaXRMaW5lICplbCwgY2hhciAqYykKK3sKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisgICAgY2hhciBpbnNlcnRfYnVmWzgwXTsKKyAgICBpbnQgYzE7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBlbF9nZXQoZWwsIEVMX0NMSUVOVERBVEEsICZzZXNzaW9uKTsKKyAgICBCVUdfT04oc2Vzc2lvbiA9PSBOVUxMIHx8IHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICBjMSA9IHNlc3Npb24tPnBhcm1zLmdldF9jaGFyKHNlc3Npb24pOworCisgICAgLyogVG9EbzogaGFuZGxlIFx0IHBhcmFtZXRlciBleHRlbnNpb24gKi8KKyAgICB3aGlsZSAoYzEgPiAwICYmIGMxID09ICdcdCcpCisgICAgeworCisgICAgICAgIGNvbnN0IExpbmVJbmZvICpsaSA9IGVsX2xpbmUoZWwpOworICAgICAgICBjaGFyICpsaW5lID0gYmNtb3NfYWxsb2MobGktPmN1cnNvciAtIGxpLT5idWZmZXIgKyAxKTsKKyAgICAgICAgaWYgKCFsaW5lKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIG1lbWNweShsaW5lLCBsaS0+YnVmZmVyLCBsaS0+Y3Vyc29yIC0gbGktPmJ1ZmZlcik7CisgICAgICAgIGxpbmVbbGktPmN1cnNvciAtIGxpLT5idWZmZXJdID0gMDsKKyAgICAgICAgcmMgPSBiY21jbGlfZXh0ZW5kKHNlc3Npb24sIGxpbmUsIGluc2VydF9idWYsIHNpemVvZihpbnNlcnRfYnVmKSk7CisgICAgICAgIGJjbW9zX2ZyZWUobGluZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgYzEgPSBzZXNzaW9uLT5wYXJtcy5nZXRfY2hhcihzZXNzaW9uKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVsX2luc2VydHN0cihlbCwgaW5zZXJ0X2J1Zik7CisgICAgICAgIHByaW50ZigiXHIiKTsKKyAgICAgICAgZWxfc2V0KGVsLCBFTF9SRUZSRVNILCBOVUxMKTsKKyAgICAgICAgYzEgPSBzZXNzaW9uLT5wYXJtcy5nZXRfY2hhcihzZXNzaW9uKTsKKyAgICB9CisgICAgaWYgKGMxIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpjID0gYzE7CisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyogbGluZW5vaXNlIGxpbmUgZWRpdGluZyBsaWJyYXJ5OiBjb21wbGV0aW9uIHN1cHBvcnQgKi8KKyNpZmRlZiBDT05GSUdfTElORU5PSVNFCisKK3N0YXRpYyBpbnQgX2JjbWNsaV9saW5lbm9pc2VfcmVhZF9jaGFyKGxvbmcgZmRfaW4sIGNoYXIgKmMpCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24gPSAoYmNtY2xpX3Nlc3Npb24gKilmZF9pbjsKKyAgICBpbnQgYzE7CisgICAgYzEgPSBzZXNzaW9uLT5wYXJtcy5nZXRfY2hhcihzZXNzaW9uKTsKKyAgICBpZiAoYzEgPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqYyA9IGMxOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9iY21jbGlfbGluZW5vaXNlX3dyaXRlKGxvbmcgZmRfb3V0LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24gPSAoYmNtY2xpX3Nlc3Npb24gKilmZF9vdXQ7CisgICAgLyogVXNlIGEgc2hvcnRjdXQgZm9yIGxlbj09MSAtIHdoaWNoIGlzIGNoYXItYnktY2hhciBpbnB1dC4KKyAgICAgICBiY21vc19wcmludGYoIiUqcyIsIGJ1ZiwgMSkgbWlzYmVoYXZlcyBvbiB2eHcgcGxhdGZvcm0sCisgICAgICAgcG9zc2libHkgYmVjYXVzZSBpdCBpcyB0b28gc2xvdy4KKyAgICAqLworICAgIGlmIChsZW4gPT0gMSAmJiAhc2Vzc2lvbi0+cGFybXMud3JpdGUpCisgICAgeworICAgICAgICBiY21vc19wdXRjaGFyKGJ1ZlswXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gYmNtY2xpX3Nlc3Npb25fd3JpdGUoc2Vzc2lvbiwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW50IF9iY21jbGlfbGluZW5vaXNlX3RhYihsaW5lbm9pc2VTZXNzaW9uICpsbl9zZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIGludCBwb3MpCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24gPSBOVUxMOworICAgIGNoYXIgKmxpbmU7CisgICAgY2hhciBpbnNlcnRfYnVmWzgwXT0iIjsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBpbnQgbGVuOworCisgICAgc2Vzc2lvbiA9IGxpbmVub2lzZVNlc3Npb25EYXRhKGxuX3Nlc3Npb24pOworICAgIEJVR19PTihzZXNzaW9uID09IE5VTEwgfHwgc2Vzc2lvbi0+bWFnaWMgIT0gQkNNQ0xJX1NFU1NJT05fTUFHSUMpOworICAgIGxpbmUgPSBiY21vc19hbGxvYyhzdHJsZW4oYnVmKSsxKTsKKyAgICBpZiAoIWxpbmUpCisgICAgICAgIHJldHVybiAwOworICAgIHN0cmNweShsaW5lLCBidWYpOworICAgIHJjID0gYmNtY2xpX2V4dGVuZChzZXNzaW9uLCBsaW5lLCBpbnNlcnRfYnVmLCBzaXplb2YoaW5zZXJ0X2J1ZikpOworICAgIGJjbW9zX2ZyZWUobGluZSk7CisgICAgaWYgKHJjIHx8ICFzdHJsZW4oaW5zZXJ0X2J1ZikpCisgICAgICAgIHJldHVybiAwOworCisgICAgbGVuID0gc3RybGVuKGJ1Zik7CisgICAgbGluZSA9IGJjbW9zX2FsbG9jKHN0cmxlbihidWYpK3N0cmxlbihpbnNlcnRfYnVmKSsxKTsKKyAgICBpZiAoIWxpbmUpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwb3MgPj0wICYmIHBvcyA8IGxlbikKKyAgICB7CisgICAgICAgIHN0cm5jcHkobGluZSwgYnVmLCBwb3MpOworICAgICAgICBsaW5lW3Bvc10gPSAwOworICAgICAgICBzdHJjYXQobGluZSwgaW5zZXJ0X2J1Zik7CisgICAgICAgIHN0cmNhdChsaW5lLCAmYnVmW3Bvc10pOworICAgICAgICBwb3MgKz0gc3RybGVuKGluc2VydF9idWYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdHJjcHkobGluZSwgYnVmKTsKKyAgICAgICAgc3RyY2F0KGxpbmUsIGluc2VydF9idWYpOworICAgICAgICBwb3MgPSBzdHJsZW4obGluZSk7CisgICAgfQorICAgIGxpbmVub2lzZVNldEJ1ZmZlcihsbl9zZXNzaW9uLCBsaW5lLCBwb3MpOworICAgIGJjbW9zX2ZyZWUobGluZSk7CisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisvKiBEZWZhdWx0IGdldGMgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgX2JjbWNsaV9zZXNzaW9uX2dldF9jaGFyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIHJldHVybiBiY21vc19nZXRjaGFyKCk7Cit9CisKKy8qKiBJbml0aWFsaXplIHNlc3Npb24gbWFuYWdlbWVudCBtb2R1bGUKKyAqIFxyZXR1cm4KKyAqICAgICAgMCAgID1PS1xuCisgKiAgICAgIDwwICA9ZXJyb3IgY29kZQorICovCitzdGF0aWMgdm9pZCBiY21jbGlfc2Vzc2lvbl9tb2R1bGVfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJnNlc3Npb25fbG9jaywgMCk7CisgICAgc2Vzc2lvbl9tb2R1bGVfaW5pdGlhbGl6ZWQgPSAxOworfQorCisvKiogT3BlbiBtYW5hZ2VtZW50IHNlc3Npb24gKi8KK2ludCBiY21jbGlfc2Vzc2lvbl9vcGVuX3VzZXIoY29uc3QgYmNtY2xpX3Nlc3Npb25fcGFybSAqcGFybSwgYmNtY2xpX3Nlc3Npb24gKipwX3Nlc3Npb24pCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgYmNtY2xpX3Nlc3Npb24gKipwX2xhc3RfbmV4dDsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNoYXIgKm5hbWVfY2xvbmU7CisgICAgbG9uZyBmbGFnczsKKyAgICBpbnQgc2l6ZTsKKworICAgIGlmICghcF9zZXNzaW9uIHx8ICFwYXJtKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworI2lmbmRlZiBDT05GSUdfRURJVExJTkUKKyAgICBpZiAocGFybS0+bGluZV9lZGl0X21vZGUgPT0gQkNNQ0xJX0xJTkVfRURJVF9FTkFCTEUpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkxpbmUgZWRpdGluZyBmZWF0dXJlIGlzIG5vdCBjb21waWxlZCBpbi4gZGVmaW5lIENPTkZJR19FRElUTElORVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorI2VuZGlmCisgICAgaWYgKCFzZXNzaW9uX21vZHVsZV9pbml0aWFsaXplZCkKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fbW9kdWxlX2luaXQoKTsKKyAgICBuYW1lID0gcGFybS0+bmFtZTsKKyAgICBpZiAoIW5hbWUpCisgICAgICAgIG5hbWUgPSAiKnVubmFtZWQqIjsKKyAgICBzaXplID0gc2l6ZW9mKGJjbWNsaV9zZXNzaW9uKSArIHN0cmxlbihuYW1lKSArIDEgKyBwYXJtLT5leHRyYV9zaXplOworICAgIHNlc3Npb249YmNtb3NfY2FsbG9jKHNpemUpOworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgc2Vzc2lvbi0+cGFybXMgPSAqcGFybTsKKyAgICBuYW1lX2Nsb25lID0gKGNoYXIgKilzZXNzaW9uICsgc2l6ZW9mKGJjbWNsaV9zZXNzaW9uKSArIHBhcm0tPmV4dHJhX3NpemU7CisgICAgc3RyY3B5KG5hbWVfY2xvbmUsIG5hbWUpOworICAgIHNlc3Npb24tPnBhcm1zLm5hbWUgPSBuYW1lX2Nsb25lOworICAgIGlmICghc2Vzc2lvbi0+cGFybXMuZ2V0X2NoYXIpCisgICAgICAgIHNlc3Npb24tPnBhcm1zLmdldF9jaGFyID0gX2JjbWNsaV9zZXNzaW9uX2dldF9jaGFyOworCisjaWZkZWYgQ09ORklHX0xJQkVESVQKKyAgICBpZiAoIXBhcm0tPmdldHMgJiYgKHBhcm0tPmxpbmVfZWRpdF9tb2RlID09IEJDTUNMSV9MSU5FX0VESVRfRU5BQkxFIHx8CisgICAgICAgIHBhcm0tPmxpbmVfZWRpdF9tb2RlID09IEJDTUNMSV9MSU5FX0VESVRfREVGQVVMVCkpCisgICAgeworICAgICAgICAvKiBJbml0aWFsaXplIGVkaXRsaW5lIGxpYnJhcnkgKi8KKyAgICAgICAgc2Vzc2lvbi0+ZWwgPSBlbF9pbml0KHNlc3Npb24tPnBhcm1zLm5hbWUsIHN0ZGluLCBzdGRvdXQsIHN0ZGVycik7CisgICAgICAgIHNlc3Npb24tPmhpc3RvcnkgPSBoaXN0b3J5X2luaXQoKTsKKyAgICAgICAgaWYgKHNlc3Npb24tPmVsICYmIHNlc3Npb24tPmhpc3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVsX3NldChzZXNzaW9uLT5lbCwgRUxfRURJVE9SLCAiZW1hY3MiKTsKKyAgICAgICAgICAgIGVsX3NldChzZXNzaW9uLT5lbCwgRUxfUFJPTVBULCAmX2JjbWNsaV9lZGl0bGluZV9wcm9tcHQpOworICAgICAgICAgICAgZWxfc2V0KHNlc3Npb24tPmVsLCBFTF9URVJNSU5BTCwgInh0ZXJtIik7CisgICAgICAgICAgICBlbF9zZXQoc2Vzc2lvbi0+ZWwsIEVMX0dFVENGTiwgX2JjbWNsaV9lZGl0bGluZV9jZm4pOworICAgICAgICAgICAgZWxfc2V0KHNlc3Npb24tPmVsLCBFTF9DTElFTlREQVRBLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIGhpc3Rvcnkoc2Vzc2lvbi0+aGlzdG9yeSwgJnNlc3Npb24tPmhpc3RldmVudCwgSF9TRVRTSVpFLCA4MDApOworICAgICAgICAgICAgZWxfc2V0KHNlc3Npb24tPmVsLCBFTF9ISVNULCBoaXN0b3J5LCBzZXNzaW9uLT5oaXN0b3J5KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQ2FuJ3QgaW5pdGlhbGl6ZSBlZGl0bGluZSBsaWJyYXJ5XG4iKTsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorICAgIC8qIFNldCB0aGUgY29tcGxldGlvbiBjYWxsYmFjay4gVGhpcyB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lIHRoZQorICAgICAqIHVzZXIgdXNlcyB0aGUgPHRhYj4ga2V5LiAqLworICAgIGlmICghcGFybS0+Z2V0cyAmJiAocGFybS0+bGluZV9lZGl0X21vZGUgPT0gQkNNQ0xJX0xJTkVfRURJVF9FTkFCTEUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcm0tPmxpbmVfZWRpdF9tb2RlID09IEJDTUNMSV9MSU5FX0VESVRfREVGQVVMVCkpCisgICAgeworICAgICAgICBsaW5lbm9pc2VTZXNzaW9uSU8gaW89ey5mZF9pbj0obG9uZylzZXNzaW9uLCAuZmRfb3V0PShsb25nKXNlc3Npb24sCisgICAgICAgICAgICAucmVhZF9jaGFyPV9iY21jbGlfbGluZW5vaXNlX3JlYWRfY2hhciwKKyAgICAgICAgICAgIC53cml0ZT1fYmNtY2xpX2xpbmVub2lzZV93cml0ZQorICAgICAgICB9OworICAgICAgICBpZiAobGluZW5vaXNlU2Vzc2lvbk9wZW4oJmlvLCBzZXNzaW9uLCAmc2Vzc2lvbi0+bG5fc2Vzc2lvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQ2FuJ3QgY3JlYXRlIGxpbmVub2lzZSBzZXNzaW9uXG4iKTsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgfQorICAgICAgICBsaW5lbm9pc2VTZXRDb21wbGV0aW9uQ2FsbGJhY2soc2Vzc2lvbi0+bG5fc2Vzc2lvbiwgX2JjbWNsaV9saW5lbm9pc2VfdGFiKTsKKyAgICB9CisjZW5kaWYKKworICAgIHNlc3Npb24tPm1hZ2ljID0gQkNNQ0xJX1NFU1NJT05fTUFHSUM7CisKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnNlc3Npb25fbG9jayk7CisgICAgcF9sYXN0X25leHQgPSAmc2Vzc2lvbl9saXN0OworICAgIHdoaWxlKCpwX2xhc3RfbmV4dCkKKyAgICAgICAgcF9sYXN0X25leHQgPSAmKCgqcF9sYXN0X25leHQpLT5uZXh0KTsKKyAgICAqcF9sYXN0X25leHQgPSBzZXNzaW9uOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmc2Vzc2lvbl9sb2NrLCBmbGFncyk7CisKKyAgICAqcF9zZXNzaW9uID0gc2Vzc2lvbjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbWNsaV9zZXNzaW9uX3N0cmluZ193cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIGJjbW9sdF9zdHJpbmcgKnN0ciA9IGJjbWNsaV9zZXNzaW9uX3VzZXJfcHJpdihzZXNzaW9uKTsKKyAgICByZXR1cm4gYmNtb2x0X3N0cmluZ19jb3B5KHN0ciwgYnVmLCBzaXplKTsKK30KKworYmNtb3NfZXJybm8gYmNtY2xpX3Nlc3Npb25fb3Blbl9zdHJpbmcoYmNtY2xpX3Nlc3Npb24gKipzZXNzaW9uLCBiY21vbHRfc3RyaW5nICpzdHIpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcGFybSBzcCA9IHsgLnVzZXJfcHJpdiA9IHN0ciwgLndyaXRlID0gYmNtY2xpX3Nlc3Npb25fc3RyaW5nX3dyaXRlIH07CisKKyAgICByZXR1cm4gYmNtY2xpX3Nlc3Npb25fb3Blbl91c2VyKCZzcCwgc2Vzc2lvbik7Cit9CisKKy8qKiBDbG9zZSBtYW5hZ2VtZW50IHNlc3Npb24uCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKi8KK3ZvaWQgYmNtY2xpX3Nlc3Npb25fY2xvc2UoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgbG9uZyBmbGFnczsKKworICAgIEJVR19PTihzZXNzaW9uLT5tYWdpYyAhPSBCQ01DTElfU0VTU0lPTl9NQUdJQyk7CisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZzZXNzaW9uX2xvY2spOworICAgIGlmIChzZXNzaW9uPT1zZXNzaW9uX2xpc3QpCisgICAgICAgIHNlc3Npb25fbGlzdCA9IHNlc3Npb24tPm5leHQ7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb24gKnByZXYgPSBzZXNzaW9uX2xpc3Q7CisgICAgICAgIHdoaWxlIChwcmV2ICYmIHByZXYtPm5leHQgIT0gc2Vzc2lvbikKKyAgICAgICAgICAgIHByZXYgPSBwcmV2LT5uZXh0OworICAgICAgICBpZiAoIXByZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmc2Vzc2lvbl9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBjYW4ndCBmaW5kIHNlc3Npb25cbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcHJldi0+bmV4dCA9IHNlc3Npb24tPm5leHQ7CisgICAgfQorICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmc2Vzc2lvbl9sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBDT05GSUdfTElCRURJVAorICAgIGlmIChzZXNzaW9uLT5oaXN0b3J5KQorICAgICAgICBoaXN0b3J5X2VuZChzZXNzaW9uLT5oaXN0b3J5KTsKKyAgICBpZiAoc2Vzc2lvbi0+ZWwpCisgICAgICAgIGVsX2VuZChzZXNzaW9uLT5lbCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTElORU5PSVNFCisgICAgaWYgKHNlc3Npb24tPmxuX3Nlc3Npb24pCisgICAgICAgIGxpbmVub2lzZVNlc3Npb25DbG9zZShzZXNzaW9uLT5sbl9zZXNzaW9uKTsKKyNlbmRpZgorICAgIHNlc3Npb24tPm1hZ2ljID0gQkNNQ0xJX1NFU1NJT05fTUFHSUNfREVMOworICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbik7CisKK30KKworLyoqIENvbmZpZ3VyZSBSQVcgaW5wdXQgbW9kZQorICoKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIGlzX3JhdyAgICAgICAgICBUUlVFPWVuYWJsZSByYXcgbW9kZSwgRkFMU0U9ZGlzYWJsZSByYXcgbW9kZQorICogXHJldHVybgorICogICAgICA9MCAgLSBPSyBcbgorICogICAgICBCQ01fRVJSX05PVF9TVVBQT1JURUQgLSByYXcgbW9kZSBpcyBub3Qgc3VwcG9ydGVkXG4KKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX3Nlc3Npb25fcmF3X21vZGVfc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vc19ib29sIGlzX3JhdykKK3sKKyNpZmRlZiBDT05GSUdfTElORU5PSVNFCisgICAgaW50IHJjOworICAgIGlmIChzZXNzaW9uLT5wYXJtcy5nZXRzKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIHJjID0gbGluZW5vaXNlU2V0UmF3KHNlc3Npb24tPmxuX3Nlc3Npb24sIGlzX3Jhdyk7CisgICAgcmV0dXJuIChyYyA9PSAwKSA/IEJDTV9FUlJfT0sgOiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisjZWxzZQorICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisjZW5kaWYKK30KKworLyoqIERlZmF1bHQgd3JpdGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIHdyaXRlIHRvIHN0ZG91dAorICovCitzdGF0aWMgaW50IF9iY21jbGlfc2Vzc2lvbl93cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIHJldHVybiBiY21vc19wcmludGYoIiUuKnMiLCBzaXplLCBidWYpOworfQorCisKKy8qKiBXcml0ZSBmdW5jdGlvbi4KKyAqIFdyaXRlIGJ1ZmZlciB0byB0aGUgY3VycmVudCBzZXNzaW9uLgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD11c2Ugc3Rkb3V0CisgKiBccGFyYW1baW5dICAgYnVmZmVyICAgICAgICAgIG91dHB1dCBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KKyAqIFxyZXR1cm4KKyAqICA+PTAgLSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlblxuCisgKiAgPDAgIC0gb3V0cHV0IGVycm9yCisgKi8KK2ludCBiY21jbGlfc2Vzc2lvbl93cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIGludCAoKndyaXRlX2NiKShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKTsKKyAgICBpZiAoc2Vzc2lvbiAmJiBzZXNzaW9uLT5wYXJtcy53cml0ZSkKKyAgICB7CisgICAgICAgIEJVR19PTihzZXNzaW9uLT5tYWdpYyAhPSBCQ01DTElfU0VTU0lPTl9NQUdJQyk7CisgICAgICAgIHdyaXRlX2NiID0gc2Vzc2lvbi0+cGFybXMud3JpdGU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgd3JpdGVfY2IgPSBfYmNtY2xpX3Nlc3Npb25fd3JpdGU7CisgICAgcmV0dXJuIHdyaXRlX2NiKHNlc3Npb24sIGJ1Ziwgc2l6ZSk7Cit9CisKKworLyoqIFJlYWQgbGluZQorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIGRlZmF1bHQKKyAqIFxwYXJhbVtpbixvdXRdICAgYnVmICAgICAgICAgICAgIGlucHV0IGJ1ZmZlcgorICogXHBhcmFtW2luXSAgICAgICBzaXplICAgICAgICAgICAgYnVmIHNpemUKKyAqIFxyZXR1cm4KKyAqICAgICAgYnVmIGlmIHN1Y2Nlc3NmdWwKKyAqICAgICAgTlVMTCBpZiBFT0Ygb3IgZXJyb3IKKyAqLworY2hhciAqYmNtY2xpX3Nlc3Npb25fZ2V0cyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIHJldHVybiBfYmNtY2xpX3Nlc3Npb25fZ2V0cyhzZXNzaW9uLCBidWYsIHNpemUpOworfQorCisKKy8qKiBQcmludCBmdW5jdGlvbi4KKyAqIFByaW50cyBpbiB0aGUgY29udGV4dCBvZiBjdXJyZW50IHNlc3Npb24uCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPXVzZSBzdGRvdXQKKyAqIFxwYXJhbVtpbl0gICBmb3JtYXQgICAgICAgICAgcHJpbnQgZm9ybWF0IC0gYXMgaW4gcHJpbnRmCisgKiBccGFyYW1baW5dICAgYXAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgbGlzdC4gVW5kZWZpbmVkIGFmdGVyIHRoZSBjYWxsCisgKi8KK3ZvaWQgYmNtY2xpX3Nlc3Npb25fdnByaW50KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisgICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi0+cGFybXMud3JpdGUpCisgICAgeworICAgICAgICBCVUdfT04oc2Vzc2lvbi0+bWFnaWMgIT0gQkNNQ0xJX1NFU1NJT05fTUFHSUMpOworICAgICAgICB2c25wcmludGYoc2Vzc2lvbi0+b3V0YnVmLCBzaXplb2Yoc2Vzc2lvbi0+b3V0YnVmKSwgZm9ybWF0LCBhcCk7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3dyaXRlKHNlc3Npb24sIHNlc3Npb24tPm91dGJ1Ziwgc3RybGVuKHNlc3Npb24tPm91dGJ1ZikpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGJjbW9zX3ZwcmludGYoZm9ybWF0LCBhcCk7Cit9CisKKworLyoqIFByaW50IGZ1bmN0aW9uLgorICogUHJpbnRzIGluIHRoZSBjb250ZXh0IG9mIGN1cnJlbnQgc2Vzc2lvbi4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZG91dAorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgICAgICAgICBwcmludCBmb3JtYXQgLSBhcyBpbiBwcmludGYKKyAqLwordm9pZCBiY21jbGlfc2Vzc2lvbl9wcmludChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgICBiY21jbGlfc2Vzc2lvbl92cHJpbnQoc2Vzc2lvbiwgZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKK30KKworLyoqIEdldCB1c2VyX3ByaXYgcHJvdm9kZWQgaW4gc2Vzc2lvbiBwYXJ0YW1ldGVycyB3aGVuIGl0IHdhcyByZWdpc3RlcmVkCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD11c2Ugc3RkaW4KKyAqIFxyZXR1cm4gdXNyX3ByaXYgdmFsdWUKKyAqLwordm9pZCAqYmNtY2xpX3Nlc3Npb25fdXNlcl9wcml2KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQlVHX09OKHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+cGFybXMudXNlcl9wcml2OworfQorCisKKy8qKiBHZXQgZXh0cmEgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24KKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPWRlZmF1bHQgc2Vzc2lvbgorICogXHJldHVybiBleHRyYV9kYXRhIHBvaW50ZXIgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBleHRyYSBkYXRhCisgKi8KK3ZvaWQgKmJjbWNsaV9zZXNzaW9uX2RhdGEoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgaWYgKCFzZXNzaW9uKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBCVUdfT04oc2Vzc2lvbi0+bWFnaWMgIT0gQkNNQ0xJX1NFU1NJT05fTUFHSUMpOworICAgIGlmIChzZXNzaW9uLT5wYXJtcy5leHRyYV9zaXplIDw9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoY2hhciAqKXNlc3Npb24gKyBzaXplb2YoKnNlc3Npb24pOworfQorCisKKy8qKiBHZXQgc2Vzc2lvbiBuYW1lZGF0YQorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9ZGVmYXVsdCBzZXNzaW9uCisgKiBccmV0dXJuIHNlc3Npb24gbmFtZQorICovCitjb25zdCBjaGFyICpiY21jbGlfc2Vzc2lvbl9uYW1lKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQlVHX09OKHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+cGFybXMubmFtZTsKK30KKworCisvKiogR2V0IHNlc3Npb24gYWNjZXNzIHJpZ2h0ZQorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9ZGVmYXVsdCBkZWJ1ZyBzZXNzaW9uCisgKiBccmV0dXJuIHNlc3Npb24gYWNjZXNzIHJpZ2h0CisgKi8KK2JjbWNsaV9hY2Nlc3NfcmlnaHQgYmNtY2xpX3Nlc3Npb25fYWNjZXNzX3JpZ2h0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIEJDTUNMSV9BQ0NFU1NfREVCVUc7CisgICAgQlVHX09OKHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+cGFybXMuYWNjZXNzX3JpZ2h0OworfQorCisvKiogUHJpbnQgYnVmZmVyIGluIGhleGFkZWNpbWFsIGZvcm1hdAorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD11c2Ugc3Rkb3V0CisgKiBccGFyYW1baW5dICAgYnVmZmVyICAgICAgICAgIEJ1ZmZlciBhZGRyZXNzCisgKiBccGFyYW1baW5dICAgb2Zmc2V0ICAgICAgICAgIFN0YXJ0IG9mZnNldCBpbiB0aGUgYnVmZmVyCisgKiBccGFyYW1baW5dICAgY291bnQgICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0byBkdW1wCisgKiBccGFyYW1baW5dICAgaW5kZW50ICAgICAgICAgIE9wdGlvbmFsIGluZGVudGF0aW9uIHN0cmluZworICovCit2b2lkIGJjbWNsaV9zZXNzaW9uX2hleGR1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IHZvaWQgKmJ1ZmZlciwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBjb3VudCwgY29uc3QgY2hhciAqaW5kZW50KQoreworICAgIGJjbW9zX2hleGR1bXAoKGJjbW9zX21zZ19wcmludF9jYiliY21jbGlfc2Vzc2lvbl9wcmludCwgc2Vzc2lvbiwgYnVmZmVyLCBvZmZzZXQsIGNvdW50LCBpbmRlbnQpOworfQorCisvKgorICogRXhwb3J0cworICovCitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX29wZW4pOworRVhQT1JUX1NZTUJPTChiY21jbGlfc2Vzc2lvbl9jbG9zZSk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Nlc3Npb25fdnByaW50KTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Nlc3Npb25fcHJpbnQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfc2Vzc2lvbl9hY2Nlc3NfcmlnaHQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfc2Vzc2lvbl9kYXRhKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Nlc3Npb25fbmFtZSk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX2hleGR1bXApOwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2Vzc2lvbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2Vzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDg3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaV9zZXNzaW9uLmgKQEAgLTAsMCArMSwzMDkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGJjbWNsaV9zZXNzaW9uLmgKKyAqCisgKiBCQ00gQ0xJIGVuZ2luZSAtIHNlc3Npb24gbWFuYWdlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJDTUNMSV9TRVNTSU9OX0gKKworI2RlZmluZSBCQ01DTElfU0VTU0lPTl9ICisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJiY21vbHRfc3RyaW5nLmgiCisKKy8qKiBcZGVmZ3JvdXAgYmNtY2xpX3Nlc3Npb24gTWFuYWdlbWVudCBTZXNzaW9uIENvbnRyb2wKKyAqCisgKiBBUElzIGluIHRoaXMgaGVhZGVyIGZpbGUgYWxsb3cgdG8gY3JlYXRlL2Rlc3Ryb3kgbWFuYWdlbWVudCBzZXNzaW9ucy4KKyAqIE1hbmFnZW1lbnQgc2Vzc2lvbiBpcyBjaGFyYWN0ZXJpemVkIGJ5IGl0cyBhY2Nlc3MgbGV2ZWwgYW5kIGFsc28KKyAqIGlucHV0L291dHB1dCBmdW5jdGlvbnMuCisgKiBNYW5hZ2VtZW50IHNlc3Npb25zIGFsbG93IG1hbmFnZWQgZW50aXRpZXMgaW4gdGhlIHN5c3RlbSB0byBjb21tdW5pY2F0ZQorICogd2l0aCBsb2NhbCBvciByZW1vdGUgbWFuYWdlcnMgKGUuZy4sIGxvY2FsIG9yIHJlbW90ZSBzaGVsbCBvciBOTVMpCisgKiBAeworICovCisKKy8qKiBBY2Nlc3MgcmlnaHRzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01DTElfQUNDRVNTX0dVRVNULCAgICAgLyoqPCBHdWVzdC4gRG9lc24ndCBoYXZlIGFjY2VzcyB0byBjb21tYW5kcyBhbmQgZGlyZWN0b3JpZXMgcmVnaXN0ZXJlZCB3aXRoIEFETUlOIHJpZ2h0cyAqLworICAgIEJDTUNMSV9BQ0NFU1NfQURNSU4sICAgICAvKio8IEFkbWluaXN0cmF0b3I6IGZ1bGwgYWNjZXNzICovCisgICAgQkNNQ0xJX0FDQ0VTU19ERUJVRywgICAgIC8qKjwgQWRtaW5pc3RyYXRvcjogZnVsbCBhY2Nlc3MgKyBleHRlbmRlZCBkZWJ1ZyBmZWF0dXJlcyAqLworfSBiY21jbGlfYWNjZXNzX3JpZ2h0OworCisvKiogTGluZSBlZGl0IG1vZGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTUNMSV9MSU5FX0VESVRfREVGQVVMVCwvKio8IEVuYWJsZSBsaW5lIGVkaXRpbmcgYW5kIGhpc3RvcnkgaWYgQ09ORklHX0VESVRMSU5FIGlzIGRlZmluZWQsIGRpc2FibGUgb3RoZXJ3aXNlICovCisgICAgQkNNQ0xJX0xJTkVfRURJVF9FTkFCTEUsIC8qKjwgRW5hYmxlIGxpbmUgZWRpdGluZy4gUmVxdWlyZXMgQ09ORklHX0VESVRMSU5FIGRlZmluZSBhbmQgbGliZWRpdC1kZXYgbGlicmFyeSAqLworICAgIEJDTUNMSV9MSU5FX0VESVRfRElTQUJMRSwvKio8IERpc2FibGUgbGluZSBlZGl0aW5nIGFuZCBoaXN0b3J5ICovCit9IGJjbWNsaV9saW5lX2VkaXRfbW9kZTsKKworCisvKiogTWFuYWdlbWVudCBzZXNzaW9uIGhhbmRsZQorICovCit0eXBlZGVmIHN0cnVjdCBiY21jbGlfc2Vzc2lvbiBiY21jbGlfc2Vzc2lvbjsKKworCisvKiogU2Vzc2lvbiBwYXJhbWV0ZXJzIHN0cnVjdHVyZS4KKyAqIFNlZSBccmVmIGJjbWNsaV9zZXNzaW9uX29wZW4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX3Nlc3Npb25fcGFybQoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgIC8qKjwgU2Vzc2lvbiBuYW1lICovCisgICAgdm9pZCAqdXNlcl9wcml2OyAgICAgICAgLyoqPCBQcml2YXRlIHVzZXIncyBkYXRhICovCisKKyAgICAvKiogU2Vzc2lvbidzIG91dHB1dCBmdW5jdGlvbi4gTlVMTD11c2Ugd3JpdGUoc3Rkb3V0KQorICAgICAqIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIDwwIGlmIGVycm9yCisgICAgICovCisgICAgaW50ICgqd3JpdGUpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpOworCisgICAgLyoqIFNlc3Npb24gbGluZSBpbnB1dCBmdW5jdGlvbi4gTlVMTD11c2UgZGVmYXVsdChzdGRpblsrbGluZSBlZGl0KSAqLworICAgIGNoYXIgKigqZ2V0cykoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSk7CisKKyAgICAvKiogU2Vzc2lvbiBjaGFyIGlucHV0IGZ1bmN0aW9uLiBOVUxMPXVzZSBiY21vc19nZXRjaGFyKCkgKi8KKyAgICBpbnQgKCpnZXRfY2hhcikoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pOworCisgICAgLyoqIEZpbGwgdGhlIHNwZWNpZmllZCBidWZmZXIgd2l0aCB0aGUgcHJvbXB0IGZvciB0aGlzIHNlc3Npb24gKE5VTEwtdGVybWluYXRlZCkuIE5VTEwgPSBubyBwcm9tcHQuICovCisgICAgdm9pZCAoKmdldF9wcm9tcHQpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjaGFyICpidWYsIHVpbnQzMl90IG1heF9sZW4pOworCisgICAgLyoqIEFjY2VzcyByaWdodHMgKi8KKyAgICBiY21jbGlfYWNjZXNzX3JpZ2h0IGFjY2Vzc19yaWdodDsKKworICAgIC8qKiBMaW5lIGVkaXRpbmcgbW9kZSAqLworICAgIGJjbWNsaV9saW5lX2VkaXRfbW9kZSBsaW5lX2VkaXRfbW9kZTsKKworICAgIC8qKiBFeHRyYSBkYXRhIHNpemUgdG8gYmUgYWxsb2NhdGVkIGFsb25nIHdpdGggc2Vzc2lvbiBjb250cm9sIGJsb2NrLgorICAgICAqIFRoZSBleHRyYSBkYXRhIGlzIGFjY2Vzc2libGUgdXNpbmcgYmNtY2xpX3Nlc3Npb25fZGF0YSgpLgorICAgICAqIFBsZWFzZSBub3RlIHRoYXQgaWYgc2Vzc2lvbiBpcyBjcmVhdGVkIHVzaW5nIGJjbWNsaV9zZXNzaW9uX29wZW4oKSwKKyAgICAgKiBleHRyYV9zaXplIGlzIHJlc2VydmVkLgorICAgICAqIEl0IGNhbiBvbmx5IGJlIHVzZWQgZm9yIHVzZXIgY29udGV4dCBhbGxvY2F0aW9uIGlmIHNlc3Npb24gaXMgY3JlYXRlZAorICAgICAqIHVzaW5nIGJjbWNsaV9zZXNzaW9uX29wZW5fdXNlcigpCisgICAgICovCisgICAgdWludDMyX3QgZXh0cmFfc2l6ZTsKK30gYmNtY2xpX3Nlc3Npb25fcGFybTsKKworCisvKiogT3BlbiBtb25pdG9yIHNlc3Npb24KKyAqCisgKiBNb25pdG9yIHN1cHBvcnRzIG11bHRpcGxlIHNpbXVsdGFuZW91cyBzZXNzaW9ucyB3aXRoIGRpZmZlcmVudAorICogYWNjZXNzIHJpZ2h0cy4KKyAqIE5vdGUgdGhhdCB0aGVyZSBhbHJlYWR5IGlzIGEgZGVmYXVsdCBzZXNzaW9uIHdpdGggZnVsbCBhZG1pbmlzdHJhdGl2ZSByaWdodHMsCisgKiB0aGF0IHRha2VzIGlucHV0IGZyb20gc3RkaW4gYW5kIG91dHB1dHMgdG8gc3Rkb3V0LgorICoKKyAqIFBsZWFzZSBkb24ndCB1c2UgcGFybS5leHRyYV9zaXplLiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkLgorICoKKyAqIFxwYXJhbVtpbl0gICBwYXJtICAgICAgICBTZXNzaW9uIHBhcmFtZXRlcnMuIE11c3Qgbm90IGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgKiBccGFyYW1bb3V0XSAgcF9zZXNzaW9uICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxyZXR1cm4KKyAqICAgICAgMCAgID1PS1xuCisgKiAgICAgIDwwICA9ZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21jbGlfc2Vzc2lvbl9vcGVuKGNvbnN0IGJjbWNsaV9zZXNzaW9uX3Bhcm0gKnBhcm0sIGJjbWNsaV9zZXNzaW9uICoqcF9zZXNzaW9uKTsKKworCisvKiogQ2xvc2UgbW9uaXRvciBzZXNzaW9uLgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICovCit2b2lkIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uICk7CisKKworLyoqIFdyaXRlIGZ1bmN0aW9uLgorICogV3JpdGUgYnVmZmVyIHRvIHRoZSBjdXJyZW50IHNlc3Npb24uCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPXVzZSBzdGRvdXQKKyAqIFxwYXJhbVtpbl0gICBidWYgICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlcgorICogXHBhcmFtW2luXSAgIHNpemUgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbgorICogXHJldHVybgorICogID49MCAtIG51bWJlciBvZiBieXRlcyB3cml0dGVuXG4KKyAqICA8MCAgLSBvdXRwdXQgZXJyb3IKKyAqLworaW50IGJjbWNsaV9zZXNzaW9uX3dyaXRlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpOworCisKKy8qKiBSZWFkIGxpbmUKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPXVzZSBkZWZhdWx0CisgKiBccGFyYW1baW4sb3V0XSAgIGJ1ZiAgICAgICAgICAgICBpbnB1dCBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICAgICAgc2l6ZSAgICAgICAgICAgIGJ1ZiBzaXplCisgKiBccmV0dXJuCisgKiAgICAgIGJ1ZiBpZiBzdWNjZXNzZnVsCisgKiAgICAgIE5VTEwgaWYgRU9GIG9yIGVycm9yCisgKi8KK2NoYXIgKmJjbWNsaV9zZXNzaW9uX2dldHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSk7CisKKworLyoqIFByaW50IGZ1bmN0aW9uLgorICogUHJpbnRzIGluIHRoZSBjb250ZXh0IG9mIGN1cnJlbnQgc2Vzc2lvbi4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZG91dAorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgICAgICAgICBwcmludCBmb3JtYXQgLSBhcyBpbiBwcmludGYKKyAqLwordm9pZCBiY21jbGlfc2Vzc2lvbl9wcmludChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisjaWZuZGVmIEJDTUNMSV9TRVNTSU9OX0RJU0FCTEVfRk9STUFUX0NIRUNLCitfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpCisjZW5kaWYKKzsKKworCisvKiogUHJpbnQgZnVuY3Rpb24uCisgKiBQcmludHMgaW4gdGhlIGNvbnRleHQgb2YgY3VycmVudCBzZXNzaW9uLgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD11c2Ugc3Rkb3V0CisgKiBccGFyYW1baW5dICAgZm9ybWF0ICAgICAgICAgIHByaW50IGZvcm1hdCAtIGFzIGluIHByaW50ZgorICogXHBhcmFtW2luXSAgIGFwICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGxpc3QuIFVuZGVmaW5lZCBhZnRlciB0aGUgY2FsbAorICovCit2b2lkIGJjbWNsaV9zZXNzaW9uX3ZwcmludChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKTsKKworLyoqIFByaW50IGJ1ZmZlciBpbiBoZXhhZGVjaW1hbCBmb3JtYXQKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZG91dAorICogXHBhcmFtW2luXSAgIGJ1ZmZlciAgICAgICAgICBCdWZmZXIgYWRkcmVzcworICogXHBhcmFtW2luXSAgIG9mZnNldCAgICAgICAgICBTdGFydCBvZmZzZXQgaW4gdGhlIGJ1ZmZlcgorICogXHBhcmFtW2luXSAgIGNvdW50ICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gZHVtcAorICogXHBhcmFtW2luXSAgIGluZGVudCAgICAgICAgICBPcHRpb25hbCBpbmRlbnRhdGlvbiBzdHJpbmcKKyAqLwordm9pZCBiY21jbGlfc2Vzc2lvbl9oZXhkdW1wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCB2b2lkICpidWZmZXIsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgY291bnQsIGNvbnN0IGNoYXIgKmluZGVudCk7CisKKy8qKiBHZXQgZXh0cmEgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24KKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPWRlZmF1bHQgc2Vzc2lvbgorICogXHJldHVybiBleHRyYV9kYXRhIHBvaW50ZXIgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBleHRyYSBkYXRhCisgKi8KK3ZvaWQgKmJjbWNsaV9zZXNzaW9uX2RhdGEoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pOworCisKKy8qKiBHZXQgdXNlcl9wcml2IHByb3ZpZGVkIGluIHNlc3Npb24gcGFyYW1ldGVycyB3aGVuIGl0IHdhcyByZWdpc3RlcmVkCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD1kZWZhdWx0IHNlc3Npb24KKyAqIFxyZXR1cm4gdXNyX3ByaXYgdmFsdWUKKyAqLwordm9pZCAqYmNtY2xpX3Nlc3Npb25fdXNlcl9wcml2KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworCisvKiogR2V0IHNlc3Npb24gbmFtZQorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZGluCisgKiBccmV0dXJuIHNlc3Npb24gbmFtZQorICovCitjb25zdCBjaGFyICpiY21jbGlfc2Vzc2lvbl9uYW1lKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworCisvKiogR2V0IHNlc3Npb24gYWNjZXNzIHJpZ2h0cworICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9ZGVmYXVsdCBkZWJ1ZyBzZXNzaW9uCisgKiBccmV0dXJuIHNlc3Npb24gYWNjZXNzIHJpZ2h0CisgKi8KK2JjbWNsaV9hY2Nlc3NfcmlnaHQgYmNtY2xpX3Nlc3Npb25fYWNjZXNzX3JpZ2h0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworLyoqIEB9IGVuZCBvZiBiY21jbGlfc2Vzc2lvbiBncm91cCAqLworCisvKiogTG93LWxldmVsIGludGVyZmFjZSBmb3Igd2hlbiBzZXNzaW9uIGlzIHVzZWQgb3V0c2lkZSBDTEkKKyAqCisgKiBccGFyYW1baW5dICAgcGFybSAgICAgICAgU2Vzc2lvbiBwYXJhbWV0ZXJzLiBNdXN0IG5vdCBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLgorICogXHBhcmFtW291dF0gIHBfc2Vzc2lvbiAgIFNlc3Npb24gaGFuZGxlCisgKiBccmV0dXJuCisgKiAgICAgIDAgICA9T0tcbgorICogICAgICA8MCAgPWVycm9yIGNvZGUKKyAqLworaW50IGJjbWNsaV9zZXNzaW9uX29wZW5fdXNlcihjb25zdCBiY21jbGlfc2Vzc2lvbl9wYXJtICpwYXJtLCBiY21jbGlfc2Vzc2lvbiAqKnBfc2Vzc2lvbik7CisKKy8qKiBPcGVuIGEgc2Vzc2lvbiB0aGF0IHByaW50cyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZworICovCitiY21vc19lcnJubyBiY21jbGlfc2Vzc2lvbl9vcGVuX3N0cmluZyhiY21jbGlfc2Vzc2lvbiAqKnNlc3Npb24sIGJjbW9sdF9zdHJpbmcgKnN0cik7CisKKy8qKiBDb25maWd1cmUgUkFXIGlucHV0IG1vZGUKKyAqCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBpc19yYXcgICAgICAgICAgVFJVRT1lbmFibGUgcmF3IG1vZGUsIEZBTFNFPWRpc2FibGUgcmF3IG1vZGUKKyAqIFxyZXR1cm4KKyAqICAgICAgPTAgIC0gT0sgXG4KKyAqICAgICAgQkNNX0VSUl9OT1RfU1VQUE9SVEVEIC0gcmF3IG1vZGUgaXMgbm90IHN1cHBvcnRlZFxuCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9zZXNzaW9uX3Jhd19tb2RlX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb3NfYm9vbCBpc19yYXcpOworCisvKiogQ29udGV4dCBleHRlbnNpb24KKyAqCisgKiAtIGlmIG5vIGNvbW1hbmQgLSBkaXNwbGF5IGxpc3Qgb2YgY29tbWFuZCBvciBleHRlbmQgY29tbWFuZAorICogLSBpZiBwcmV2IGNoYXIgaXMgIiAiCisgKiAgICAgIC0gaWYgcG9zaXRpb25hbCBhbmQgbmV4dCBwYXJtIGlzIGVudW0gLSBzaG93L2V4dGVuZHMgbGlzdCBvZiBtYXRjaGluZyB2YWx1ZXMKKyAqICAgICAgLSBlbHNlIC0gc2hvdy9leHRlbmQgbGlzdCBvZiB1bnVzZWQgcGFyYW1ldGVycworICogICBlbHNlCisgKiAgICAgIC0gaWYgZW50ZXJpbmcgdmFsdWUgYW5kIGVudW0gLSBzaG93L2V4dGVuZHMgbGlzdCBvZiBtYXRjaGluZyB2YWx1ZXMKKyAqICAgICAgLSBlbHNlIC0gc2hvdy9leHRlbmQgbGlzdCBvZiBtYXRjaGluZyB1bnVzZWQgcGFyYW1ldGVycworICoKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIGlucHV0X3N0cmluZyAgICBTdHJpbmcgdG8gYmUgcGFyc2VkCisgKiBccGFyYW1bb3V0XSAgICAgIGluc2VydF9zdHIgICAgICBTdHJpbmcgdG8gaW5zZXJ0IGF0IGN1cnNvciBwb3NpdGlvbgorICogXHBhcmFtW2luXSAgICAgICBpbnNlcnRfc2l6ZSAgICAgSW5zZXJ0IGJ1ZmZlciBzaXplCisgKiBccmV0dXJuCisgKiAgICAgID0wICAtIE9LIFxuCisgKiAgICAgIEJDTV9FUlJfUEFSTSAtIHBhcnNpbmcgZXJyb3JcbgorICovCitiY21vc19lcnJubyBiY21jbGlfZXh0ZW5kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjaGFyICppbnB1dF9zdHJpbmcsCisgICAgY2hhciAqaW5zZXJ0X3N0ciwgdWludDMyX3QgaW5zZXJ0X3NpemUpOworCisKKyNpZmRlZiBCQ01DTElfSU5URVJOQUwKKworI2RlZmluZSBCQ01DTElfU0VTU0lPTl9PVVRCVUZfTEVOIDIwNDgKKyNkZWZpbmUgQkNNQ0xJX01BWF9QUk9NUFRfTEVOIDgKKworLyogZWRpdGxpbmUgZnVuY3Rpb25hbGl0eSAqLworLyogSWYgbGliZWRpdCBpcyBpbmNsdWRlZCAtIGl0IHRha2VzIHByZWNlZGVuY2UgKi8KKyNpZmRlZiBDT05GSUdfTElCRURJVAorI2luY2x1ZGUgPGhpc3RlZGl0Lmg+CisjdW5kZWYgQ09ORklHX0xJTkVOT0lTRQorI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTElCRURJVCAqLworCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorI2luY2x1ZGUgPGxpbmVub2lzZS5oPgorI2VuZGlmCisKKy8qIE1hbmFnZW1lbnQgc2Vzc2lvbiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBiY21jbGlfc2Vzc2lvbgoreworICAgIGJjbWNsaV9zZXNzaW9uICpuZXh0OworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gcGFybXM7CisgICAgdWludDMyX3QgbWFnaWM7CisjZGVmaW5lIEJDTUNMSV9TRVNTSU9OX01BR0lDICAgICAgICAgICAgKCgncyc8PDI0KXwoJ2UnPDwxNil8KCdzJzw8OCl8J3MnKQorI2RlZmluZSBCQ01DTElfU0VTU0lPTl9NQUdJQ19ERUwgICAgICAgICgoJ3MnPDwyNCl8KCdlJzw8MTYpfCgncyc8PDgpfCd+JykKKworICAgIC8qIExpbmUgZWRpdGluZyBhbmQgaGlzdG9yeSBzdXBwb3J0ICovCisjaWZkZWYgQ09ORklHX0xJQkVESVQKKyAgICBFZGl0TGluZSAqZWw7CisgICAgSGlzdG9yeSAqaGlzdG9yeTsKKyAgICBIaXN0RXZlbnQgaGlzdGV2ZW50OworI2VuZGlmCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorICAgIGxpbmVub2lzZVNlc3Npb24gKmxuX3Nlc3Npb247CisjZW5kaWYKKyAgICBjaGFyIG91dGJ1ZltCQ01DTElfU0VTU0lPTl9PVVRCVUZfTEVOXTsKKyAgICBjaGFyIHByb21wdF9idWZbQkNNQ0xJX01BWF9QUk9NUFRfTEVOXTsKKworICAgIC8qIEZvbGxvd2VkIGJ5IHNlc3Npb24gZGF0YSAqLworfTsKKyNlbmRpZgorCisjZW5kaWYgLyogI2lmbmRlZiBCQ01DTElfU0VTU0lPTl9IICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY29tbW9uX2Vwb25fb2FtL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDYxNDhlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMgQ29tbW9uIEFQSQorIworTU9EX05BTUUgPSBjb21tb25fZXBvbl9vYW0KK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IHV0aWxzIGRldl9sb2cKKworc3JjcyA9IGJjbW9sdF9lcG9uX29hbV90eXBlcy5jCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY29tbW9uX2Vwb25fb2FtL2JjbW9sdF9lcG9uX29hbV90eXBlcy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9iY21vbHRfZXBvbl9vYW1fdHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWFkMjJlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9iY21vbHRfZXBvbl9vYW1fdHlwZXMuYwpAQCAtMCwwICsxLDgyNjM1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpbmNsdWRlICJiY21vbHRfZXBvbl9vYW1fdHlwZXMuaCIKKworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoYnVmLCBzaXplLCBzdGFydCkgIGJjbW9sdF9idWZfaW5pdChidWYsIHNpemUsIHN0YXJ0LCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCkKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NraXAKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZCAgICAgICAgICAgICAgICBiY21vbHRfYnVmX2dldF91c2VkCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplICAgICAgYmNtb2x0X2J1Zl9nZXRfcmVtYWluaW5nX3NpemUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZSAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTggICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTggICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNiAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTE2CisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UxNgorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNCAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTI0CisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UyNAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMiAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTMyCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UzMgorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3MzMiAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfczMyCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9zMzIgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3MzMgorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NCAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTY0CisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3U2NAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2wgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfYm9vbAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF9ib29sCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MgICAgICAgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MgICAgICAgIGJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyAgICAgIGJjbW9sdF9idWZfd3JpdGVfaXB2NF9hZGRyZXNzCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MgICAgICAgYmNtb2x0X2J1Zl9yZWFkX2lwdjRfYWRkcmVzcworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyAgICAgIGJjbW9sdF9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY2X2FkZHJlc3MgICAgICAgYmNtb2x0X2J1Zl9yZWFkX2lwdjZfYWRkcmVzcworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdmxhbl90YWcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3ZsYW5fdGFnICAgICAgICAgICBiY21vbHRfYnVmX3JlYWRfdmxhbl90YWcKKworc3RhdGljIHVpbnQyNF90IHVpbnQzMl90X3RvX3VpbnQyNF90KHVpbnQzMl90IHUzMikKK3sKKyAgICB1aW50MjRfdCB1MjQ7CisKKyAgICB1MjQudThbMF0gPSAodTMyID4+IDE2KSAmIDB4ZmY7CisgICAgdTI0LnU4WzFdID0gKHUzMiA+PiA4KSAmIDB4ZmY7CisgICAgdTI0LnU4WzJdID0gKHUzMiA+PiAwKSAmIDB4ZmY7CisKKyAgICByZXR1cm4gdTI0OworfQorCitzdGF0aWMgdWludDMyX3QgdWludDI0X3RfdG9fdWludDMyX3QodWludDI0X3QgdTI0KQoreworICAgIHVpbnQzMl90IHUzMiA9IDA7CisKKyAgICB1MzIgfD0gdTI0LnU4WzBdIDw8IDE2OworICAgIHUzMiB8PSB1MjQudThbMV0gPDwgODsKKyAgICB1MzIgfD0gdTI0LnU4WzJdIDw8IDA7CisKKyAgICByZXR1cm4gdTMyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWdfcGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b19yZW1vdGVfc2lnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4X3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3dlcl9hbGFybV9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG9uX2lmX3N3aXRjaF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdXBwb3J0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2tfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2sgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2tfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2FjayAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWdfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZWFybHlfd2FrZV91cF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2VuYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX2ZsYWdfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19lYXV0aF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wcm90ZWN0aW9uX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGhfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2lwbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BwcG9lX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfZmF4X21vZGVtX2NvbnRyb2xfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3NlcnZpY2Vfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfcmVzZXRfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXRjaF9tYWNfYWRkcmVzc19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfbGlnaHRfY29udHJvbF9hY3Rpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X2V4Y2xfYWJpbGl0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2Vhcmx5X3dha2VfY2FwYWJpbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYXV0aF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3BhY2soYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB1aW50MzJfdF90b191aW50MjRfdCgodWludDMyX3QpIHRoaXMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjayhiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MjRfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IHVpbnQyNF90X3RvX3VpbnQzMl90KG51bV92YWwpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9vcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Fja19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2tfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fZXZlbnQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2RvbWFpbl9vcHRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXBfcGFjayhiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXAgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXBfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2Vycm9yX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfZXJyb3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXVfbWVkaWFfYXZhaWxhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9mZWNfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleF9wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXhfcGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXhfcGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2Rlc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlcyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19jb25maWcgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2ggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kX3BhY2soYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfZmllbGRfc2VsZWN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfcHNzdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWF0Y2hfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9ucyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3RfcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19ob2xkb3Zlcl9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWRpX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWRpX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWRpX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tZGlfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXIgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9ucyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3BfcGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19lcnJvcl9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWRfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21kaV9jcm9zc292ZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3ZlciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tZGlfY3Jvc3NvdmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3ZlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3NkbV9zdGF0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG0gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+Y3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmN2aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5zd2l0Y2hpbmdfZG9tYWluKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxpbmtfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c3dpdGNoaW5nX2RvbWFpbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5saW5rX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wcm9ncmFtbWFibGVfZmllbGQwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cHJvZ3JhbW1hYmxlX2ZpZWxkMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5wcm9ncmFtbWFibGVfZmllbGQwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cHJvZ3JhbW1hYmxlX2ZpZWxkMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXAgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+c3dpdGNoaW5nX2RvbWFpbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnNzbV9zb3VyY2VfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT5pcGFkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXAgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c3dpdGNoaW5nX2RvbWFpbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnNzbV9zb3VyY2VfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT5pcGFkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW5fcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+c3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmN2aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW5fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5zdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+Y3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fcGFjayh0aGlzLT5vcHRpb25fY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fdW5wYWNrKCZ0aGlzLT5vcHRpb25fY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3BhY2sodGhpcy0+cmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3VucGFjaygmdGhpcy0+cmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c3ZjX2Zsb3dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jbGFzc2lmaWVyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kaXJlY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnN0YXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cHJpb3JpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlwdG9zX2xvdykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aXB0b3NfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aXB0b3NfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlwcHJvdG8pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlwYWRkcl90eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCA+IDApICYmICh0aGlzLT5pcHNyY19hZGRyID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwc3JjX2FkZHJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5pcHNyY19hZGRyLCB0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aXBzcmNfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aXBzcmNfbWFza19sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBzcmNfbWFzayA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpcHNyY19tYXNrXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+aXBzcmNfbWFzaywgdGhpcy0+aXBzcmNfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmlwZHN0X2FkZHIgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaXBkc3RfYWRkclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPmlwZHN0X2FkZHIsIHRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCA+IDApICYmICh0aGlzLT5pcGRzdF9tYXNrID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwZHN0X21hc2tcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5pcGRzdF9tYXNrLCB0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNyY19wb3J0X3N0YXJ0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c3JjX3BvcnRfZW5kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZHN0X3BvcnRfc3RhcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5kc3RfcG9ydF9lbmQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmRzdF9tYWNfYWRkcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+ZHN0X21hY19tYXNrKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5zcmNfbWFjX2FkZHIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmwycHJvdG9fdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmwycHJvdG9fdmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51c2VyX3ByaW9yaXR5X2xvdykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnVzZXJfcHJpb3JpdHlfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnZsYW5faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT5iaXRtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5mbG93X2xhYmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y21pbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnBrdF9tYXRjaGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhICp0aGlzKQoreworICAgIHJldHVybiA5NiArIHRoaXMtPmlwc3JjX2FkZHJfbGVuZ3RoICsgdGhpcy0+aXBzcmNfbWFza19sZW5ndGggKyB0aGlzLT5pcGRzdF9hZGRyX2xlbmd0aCArIHRoaXMtPmlwZHN0X21hc2tfbGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c3ZjX2Zsb3dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jbGFzc2lmaWVyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kaXJlY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnN0YXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cHJpb3JpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlwdG9zX2xvdykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aXB0b3NfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aXB0b3NfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlwcHJvdG8pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlwYWRkcl90eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCA+IDApICYmICh0aGlzLT5pcHNyY19hZGRyID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaXBzcmNfYWRkclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmlwc3JjX2FkZHIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+aXBzcmNfYWRkcl9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5pcHNyY19hZGRyLCB0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aXBzcmNfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aXBzcmNfbWFza19sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBzcmNfbWFzayA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwc3JjX21hc2tcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5pcHNyY19tYXNrID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmlwc3JjX21hc2tfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aXBzcmNfbWFzaywgdGhpcy0+aXBzcmNfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmlwZHN0X2FkZHIgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpcGRzdF9hZGRyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+aXBkc3RfYWRkciA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5pcGRzdF9hZGRyX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmlwZHN0X2FkZHIsIHRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCA+IDApICYmICh0aGlzLT5pcGRzdF9tYXNrID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaXBkc3RfbWFza1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmlwZHN0X21hc2sgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+aXBkc3RfbWFza19sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5pcGRzdF9tYXNrLCB0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNyY19wb3J0X3N0YXJ0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c3JjX3BvcnRfZW5kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZHN0X3BvcnRfc3RhcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5kc3RfcG9ydF9lbmQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmRzdF9tYWNfYWRkcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+ZHN0X21hY19tYXNrKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5zcmNfbWFjX2FkZHIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmwycHJvdG9fdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmwycHJvdG9fdmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51c2VyX3ByaW9yaXR5X2xvdykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnVzZXJfcHJpb3JpdHlfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnZsYW5faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZ0aGlzLT5iaXRtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5mbG93X2xhYmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Y21pbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnBrdF9tYXRjaGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpcHNyY19hZGRyX2xlbmd0aDsKKyAgICB1aW50OF90IGlwc3JjX21hc2tfbGVuZ3RoOworICAgIHVpbnQ4X3QgaXBkc3RfYWRkcl9sZW5ndGg7CisgICAgdWludDhfdCBpcGRzdF9tYXNrX2xlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmlwc3JjX2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaXBzcmNfYWRkcl9sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaXBzcmNfYWRkcl9sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpcHNyY19tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGlwc3JjX21hc2tfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGlwc3JjX21hc2tfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmaXBkc3RfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBpcGRzdF9hZGRyX2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBpcGRzdF9hZGRyX2xlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmlwZHN0X21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaXBkc3RfbWFza19sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaXBkc3RfbWFza19sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+aW50Zl9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW50Zl9kZXNjcmlwdGlvbl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aW50Zl9kZXNjcmlwdGlvbl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aW50Zl9kZXNjcmlwdGlvbiA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbnRmX2Rlc2NyaXB0aW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPmludGZfZGVzY3JpcHRpb24sIHRoaXMtPmludGZfZGVzY3JpcHRpb25fbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGVfcGFjayh0aGlzLT5pbnRmX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW50Zl9waHlfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aW50Zl9waHlfYWRkcl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aW50Zl9waHlfYWRkciA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbnRmX3BoeV9hZGRyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPmludGZfcGh5X2FkZHIsIHRoaXMtPmludGZfcGh5X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pbnRmX2FsaWFzX25hbWVfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmludGZfYWxpYXNfbmFtZV9sZW5ndGggPiAwKSAmJiAodGhpcy0+aW50Zl9hbGlhc19uYW1lID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGZfYWxpYXNfbmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5pbnRmX2FsaWFzX25hbWUsIHRoaXMtPmludGZfYWxpYXNfbmFtZV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSAqdGhpcykKK3sKKyAgICByZXR1cm4gNiArIHRoaXMtPmludGZfZGVzY3JpcHRpb25fbGVuZ3RoICsgdGhpcy0+aW50Zl9waHlfYWRkcl9sZW5ndGggKyB0aGlzLT5pbnRmX2FsaWFzX25hbWVfbGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5pbnRmX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uX2xlbmd0aCA+IDApICYmICh0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW50Zl9kZXNjcmlwdGlvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmludGZfZGVzY3JpcHRpb25fbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aW50Zl9kZXNjcmlwdGlvbiwgdGhpcy0+aW50Zl9kZXNjcmlwdGlvbl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZV91bnBhY2soJnRoaXMtPmludGZfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbnRmX3BoeV9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pbnRmX3BoeV9hZGRyX2xlbmd0aCA+IDApICYmICh0aGlzLT5pbnRmX3BoeV9hZGRyID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW50Zl9waHlfYWRkclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5pbnRmX3BoeV9hZGRyID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmludGZfcGh5X2FkZHJfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aW50Zl9waHlfYWRkciwgdGhpcy0+aW50Zl9waHlfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmludGZfYWxpYXNfbmFtZV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aW50Zl9hbGlhc19uYW1lX2xlbmd0aCA+IDApICYmICh0aGlzLT5pbnRmX2FsaWFzX25hbWUgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbnRmX2FsaWFzX25hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+aW50Zl9hbGlhc19uYW1lID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmludGZfYWxpYXNfbmFtZV9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5pbnRmX2FsaWFzX25hbWUsIHRoaXMtPmludGZfYWxpYXNfbmFtZV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpbnRmX2Rlc2NyaXB0aW9uX2xlbmd0aDsKKyAgICB1aW50OF90IGludGZfcGh5X2FkZHJfbGVuZ3RoOworICAgIHVpbnQ4X3QgaW50Zl9hbGlhc19uYW1lX2xlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmludGZfZGVzY3JpcHRpb25fbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaW50Zl9kZXNjcmlwdGlvbl9sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaW50Zl9kZXNjcmlwdGlvbl9sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmludGZfcGh5X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaW50Zl9waHlfYWRkcl9sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaW50Zl9waHlfYWRkcl9sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpbnRmX2FsaWFzX25hbWVfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaW50Zl9hbGlhc19uYW1lX2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBpbnRmX2FsaWFzX25hbWVfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmlmX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+aWZfbXR1KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aWZfc3BlZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXNfcGFjayh0aGlzLT5pZl9hZG1pbl9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1c19wYWNrKHRoaXMtPmlmX29wZXJfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pZl9sYXN0X2NoYW5nZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmlmX2hjaW5fb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+aWZfaGNpbl91Y2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+aWZfaGNpbl9tdWx0aWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmlmX2hjaW5fYnJvYWRjYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pZl9pbl9kaXNjYXJkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlmX2luX2Vycm9ycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlmX2luX3Vua25vd25fcHJvdG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+aWZfaGNvdXRfb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+aWZfaGNvdXRfdWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmlmX2hjb3V0X211bHRpY2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+aWZfaGNvdXRfYnJvYWRjYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pZl9vdXRfZGlzY2FyZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pZl9vdXRfZXJyb3JzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pZl9saW5rX3VwX2Rvd25fdHJhcF9lbmFibGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlmX3Byb21pc2N1b3VzX21vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlmX2Nvbm5lY3Rvcl9wcmVzZW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aWZfY291bnRlcl9kaXNjb250aW51aXR5X3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmlmX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aWZfbXR1KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aWZfc3BlZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5pZl9hZG1pbl9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1c191bnBhY2soJnRoaXMtPmlmX29wZXJfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pZl9sYXN0X2NoYW5nZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmlmX2hjaW5fb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+aWZfaGNpbl91Y2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+aWZfaGNpbl9tdWx0aWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmlmX2hjaW5fYnJvYWRjYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pZl9pbl9kaXNjYXJkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlmX2luX2Vycm9ycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlmX2luX3Vua25vd25fcHJvdG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+aWZfaGNvdXRfb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+aWZfaGNvdXRfdWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmlmX2hjb3V0X211bHRpY2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+aWZfaGNvdXRfYnJvYWRjYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pZl9vdXRfZGlzY2FyZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pZl9vdXRfZXJyb3JzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pZl9saW5rX3VwX2Rvd25fdHJhcF9lbmFibGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlmX3Byb21pc2N1b3VzX21vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlmX2Nvbm5lY3Rvcl9wcmVzZW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aWZfY291bnRlcl9kaXNjb250aW51aXR5X3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnN2Y19mbG93X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+c2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kaXJlY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmZsb3dfdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cW9zX3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jaGFubmVsX3NldF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPmRzaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1heF9yZXF1ZXN0c19wZXJfc2lkX2NsdXN0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhfYnl0ZXNfcGVyX3NpZF9jbHVzdGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dG90YWxfYnl0ZXNfcGVyX3NpZF9jbHVzdGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4X3RpbWVfcGVyX3NpZF9jbHVzdGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zZXJ2aWNlX2NsYXNzX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5zZXJ2aWNlX2NsYXNzX2xlbmd0aCA+IDApICYmICh0aGlzLT5zZXJ2aWNlX2NsYXNzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlcnZpY2VfY2xhc3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+c2VydmljZV9jbGFzcywgdGhpcy0+c2VydmljZV9jbGFzc19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnByaW9yaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXNlcV9kc2lkX3N1cHBvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhfcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1heF9idXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1pbl9yYXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWluX3BrdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+YWN0aXZlX3RpbWVvdXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5hZG1pdHRlZF90aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4X2NvbmNhdF9idXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c2NoZWR1bGluZ190eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bm9tX3BvbGxfaW50dmwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50b2xfcG9sbF9qaXR0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51bnNvbF9ncmFudF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bm9tX2dyYW50X2ludHZsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dG9sX2dyYW50X2ppdHRlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dG9zX2FuZF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT50b3NfYW5kX21hc2tfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnRvc19hbmRfbWFzayA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0b3NfYW5kX21hc2tcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dG9zX2FuZF9tYXNrLCB0aGlzLT50b3NfYW5kX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50b3Nfb3JfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dG9zX29yX21hc2tfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnRvc19vcl9tYXNrID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRvc19vcl9tYXNrXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnRvc19vcl9tYXNrLCB0aGlzLT50b3Nfb3JfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhfbGF0ZW5jeSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmVxX3RyYW5zX3BvbGljeV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cmVxX3RyYW5zX3BvbGljeV9sZW5ndGggPiAwKSAmJiAodGhpcy0+cmVxX3RyYW5zX3BvbGljeSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyZXFfdHJhbnNfcG9saWN5XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnJlcV90cmFuc19wb2xpY3ksIHRoaXMtPnJlcV90cmFuc19wb2xpY3lfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Yml0bWFwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmVxZF9hdHRyaWJfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmZvcmJpZF9hdHRyaWJfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmF0dHJpYl9hZ2dyX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmF0dHJpYl9tYXNrX3N1Y2Nlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmFwcGxpY2F0aW9uX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmFwcGxpY2F0aW9uX2lkbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmFwcGxpY2F0aW9uX2lkID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImFwcGxpY2F0aW9uX2lkXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPmFwcGxpY2F0aW9uX2lkLCB0aGlzLT5hcHBsaWNhdGlvbl9pZGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y29udF9yZXFfd2luZG93X211bHRpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5id19yZXFfbXVsdGkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wZWFrX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jcmVhdGVfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhICp0aGlzKQoreworICAgIHJldHVybiAxMDQgKyB0aGlzLT5zZXJ2aWNlX2NsYXNzX2xlbmd0aCArIHRoaXMtPnRvc19hbmRfbWFza19sZW5ndGggKyB0aGlzLT50b3Nfb3JfbWFza19sZW5ndGggKyB0aGlzLT5yZXFfdHJhbnNfcG9saWN5X2xlbmd0aCArIHRoaXMtPmFwcGxpY2F0aW9uX2lkbGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zdmNfZmxvd19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnNpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZGlyZWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5mbG93X3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnFvc190eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Y2hhbm5lbF9zZXRfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZ0aGlzLT5kc2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5tYXhfcmVxdWVzdHNfcGVyX3NpZF9jbHVzdGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X2J5dGVzX3Blcl9zaWRfY2x1c3RlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRvdGFsX2J5dGVzX3Blcl9zaWRfY2x1c3RlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1heF90aW1lX3Blcl9zaWRfY2x1c3RlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c2VydmljZV9jbGFzc19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+c2VydmljZV9jbGFzc19sZW5ndGggPiAwKSAmJiAodGhpcy0+c2VydmljZV9jbGFzcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlcnZpY2VfY2xhc3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+c2VydmljZV9jbGFzcyA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5zZXJ2aWNlX2NsYXNzX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnNlcnZpY2VfY2xhc3MsIHRoaXMtPnNlcnZpY2VfY2xhc3NfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wcmlvcml0eSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmVzZXFfZHNpZF9zdXBwb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tYXhfYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5taW5fcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1pbl9wa3Rfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmFjdGl2ZV90aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+YWRtaXR0ZWRfdGltZW91dCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1heF9jb25jYXRfYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnNjaGVkdWxpbmdfdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm5vbV9wb2xsX2ludHZsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dG9sX3BvbGxfaml0dGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dW5zb2xfZ3JhbnRfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm5vbV9ncmFudF9pbnR2bCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRvbF9ncmFudF9qaXR0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnRvc19hbmRfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dG9zX2FuZF9tYXNrX2xlbmd0aCA+IDApICYmICh0aGlzLT50b3NfYW5kX21hc2sgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0b3NfYW5kX21hc2tcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dG9zX2FuZF9tYXNrID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnRvc19hbmRfbWFza19sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT50b3NfYW5kX21hc2ssIHRoaXMtPnRvc19hbmRfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnRvc19vcl9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT50b3Nfb3JfbWFza19sZW5ndGggPiAwKSAmJiAodGhpcy0+dG9zX29yX21hc2sgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0b3Nfb3JfbWFza1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT50b3Nfb3JfbWFzayA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT50b3Nfb3JfbWFza19sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT50b3Nfb3JfbWFzaywgdGhpcy0+dG9zX29yX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X2xhdGVuY3kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlcV90cmFuc19wb2xpY3lfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnJlcV90cmFuc19wb2xpY3lfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnJlcV90cmFuc19wb2xpY3kgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyZXFfdHJhbnNfcG9saWN5XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnJlcV90cmFuc19wb2xpY3kgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+cmVxX3RyYW5zX3BvbGljeV9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5yZXFfdHJhbnNfcG9saWN5LCB0aGlzLT5yZXFfdHJhbnNfcG9saWN5X2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnJlcWRfYXR0cmliX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5mb3JiaWRfYXR0cmliX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hdHRyaWJfYWdncl9tYXNrKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hdHRyaWJfbWFza19zdWNjZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hcHBsaWNhdGlvbl9pZGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5hcHBsaWNhdGlvbl9pZGxlbmd0aCA+IDApICYmICh0aGlzLT5hcHBsaWNhdGlvbl9pZCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImFwcGxpY2F0aW9uX2lkXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmFwcGxpY2F0aW9uX2lkID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmFwcGxpY2F0aW9uX2lkbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+YXBwbGljYXRpb25faWQsIHRoaXMtPmFwcGxpY2F0aW9uX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jb250X3JlcV93aW5kb3dfbXVsdGkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmJ3X3JlcV9tdWx0aSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBlYWtfcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNyZWF0ZV90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3Qgc2VydmljZV9jbGFzc19sZW5ndGg7CisgICAgdWludDhfdCB0b3NfYW5kX21hc2tfbGVuZ3RoOworICAgIHVpbnQ4X3QgdG9zX29yX21hc2tfbGVuZ3RoOworICAgIHVpbnQ4X3QgcmVxX3RyYW5zX3BvbGljeV9sZW5ndGg7CisgICAgdWludDhfdCBhcHBsaWNhdGlvbl9pZGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmc2VydmljZV9jbGFzc19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBzZXJ2aWNlX2NsYXNzX2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzZXJ2aWNlX2NsYXNzX2xlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnRvc19hbmRfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiB0b3NfYW5kX21hc2tfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHRvc19hbmRfbWFza19sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ0b3Nfb3JfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiB0b3Nfb3JfbWFza19sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdG9zX29yX21hc2tfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZyZXFfdHJhbnNfcG9saWN5X2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHJlcV90cmFuc19wb2xpY3lfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHJlcV90cmFuc19wb2xpY3lfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmFwcGxpY2F0aW9uX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogYXBwbGljYXRpb25faWRsZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgYXBwbGljYXRpb25faWRsZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnN2Y19mbG93X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dG90YWxfcGt0X2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dG90YWxfYnl0ZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmFjdGl2ZV90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW52YWxpZF9waHNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wa3RzX2Ryb3BwZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wa3RzX2RlbGF5ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c3ZjX2Zsb3dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50b3RhbF9wa3RfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50b3RhbF9ieXRlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YWN0aXZlX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pbnZhbGlkX3Boc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBrdHNfZHJvcHBlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBrdHNfZGVsYXllZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMzYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5jbnVfbWFjX2FkZHJlc3Nfc3RhcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmNudV9tYWNfYWRkcmVzc19lbmQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmNudV9tYWNfYWRkcmVzc19zdGFydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+Y251X21hY19hZGRyZXNzX2VuZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jaGFubmVsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cG93ZXJfbGV2ZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5oaWdoX3Jlc190aW1pbmdfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5lcXVhbGl6YXRpb25fZGF0YV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+ZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVxdWFsaXphdGlvbl9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5lcXVhbGl6YXRpb25fZGF0YSwgdGhpcy0+ZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dW5lcnJvcmVkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmNvcnJlY3RlZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51bmNvcnJlY3RhYmxlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNucikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWljcm9fcmVmbGVjdGlvbnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhICp0aGlzKQoreworICAgIHJldHVybiAzNyArIHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3dlcl9sZXZlbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmhpZ2hfcmVzX3RpbWluZ19vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5lcXVhbGl6YXRpb25fZGF0YV9sZW5ndGggPiAwKSAmJiAodGhpcy0+ZXF1YWxpemF0aW9uX2RhdGEgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlcXVhbGl6YXRpb25fZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+ZXF1YWxpemF0aW9uX2RhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+ZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+ZXF1YWxpemF0aW9uX2RhdGEsIHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVuZXJyb3JlZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5jb3JyZWN0ZWRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dW5jb3JyZWN0YWJsZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zbnIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pY3JvX3JlZmxlY3Rpb25zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZlcXVhbGl6YXRpb25fZGF0YV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBlcXVhbGl6YXRpb25fZGF0YV9sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIHVpbnQ4X3QgaTE7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlkeCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnVzY2hhbl9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT51c2NoYW5fY291bnQgPiAwKSAmJiAodGhpcy0+dXNjaGFuX2RhdGEgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXNjaGFuX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dXNjaGFuX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhX3BhY2soJnRoaXMtPnVzY2hhbl9kYXRhW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlX3BhY2sodGhpcy0+Y29ubmVjdGl2aXR5X3N0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uX3BhY2sodGhpcy0+ZG9jc2lzX3ZlcnNpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGVfcGFjayh0aGlzLT5pcGFkZHJfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pcGFkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmlwYWRkcl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBhZGRyX3ZhbHVlID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwYWRkcl92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5pcGFkZHJfdmFsdWUsIHRoaXMtPmlwYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50aW1lc3RhbXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnNmbG93X2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnNmbG93X2NvdW50ID4gMCkgJiYgKHRoaXMtPnNmbG93X2lkID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNmbG93X2lkXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnNmbG93X2NvdW50OyBpMSsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNmbG93X2lkW2kxXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxpbmtfbG9jYWxfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCA+IDApICYmICh0aGlzLT5saW5rX2xvY2FsX2FkZHIgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua19sb2NhbF9hZGRyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPmxpbmtfbG9jYWxfYWRkciwgdGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1hY19kb21haW5faW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zZXJ2aWNlX2dyb3VwX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yY3BfaWRsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cmNwX2lkbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnJjcF9pZCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyY3BfaWRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+cmNwX2lkLCB0aGlzLT5yY3BfaWRsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yY2NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yY3NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50Y3NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sYXN0X3JlZ2lzdGVyX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hZGRyX3Jlc29sdmVfcmVxdWVzdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9ICg0OCArIHRoaXMtPmlwYWRkcl9sZW5ndGgpICsgKDQgKiB0aGlzLT5zZmxvd19jb3VudCkgKyB0aGlzLT5saW5rX2xvY2FsX2FkZHJfbGVuZ3RoICsgdGhpcy0+cmNwX2lkbGVuZ3RoOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+dXNjaGFuX2NvdW50ID4gMCkgJiYgKHRoaXMtPnVzY2hhbl9kYXRhID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVzY2hhbl9jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnVzY2hhbl9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnVzY2hhbl9kYXRhW2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgdWludDhfdCBpMTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aWR4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dXNjaGFuX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnVzY2hhbl9jb3VudCA+IDApICYmICh0aGlzLT51c2NoYW5fZGF0YSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVzY2hhbl9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnVzY2hhbl9kYXRhID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnVzY2hhbl9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51c2NoYW5fY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFfdW5wYWNrKCZ0aGlzLT51c2NoYW5fZGF0YVtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlX3VucGFjaygmdGhpcy0+Y29ubmVjdGl2aXR5X3N0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uX3VucGFjaygmdGhpcy0+ZG9jc2lzX3ZlcnNpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGVfdW5wYWNrKCZ0aGlzLT5pcGFkZHJfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pcGFkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmlwYWRkcl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBhZGRyX3ZhbHVlID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaXBhZGRyX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmlwYWRkcl92YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5pcGFkZHJfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aXBhZGRyX3ZhbHVlLCB0aGlzLT5pcGFkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dGltZXN0YW1wKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5zZmxvd19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5zZmxvd19jb3VudCA+IDApICYmICh0aGlzLT5zZmxvd19pZCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNmbG93X2lkXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnNmbG93X2lkID0gKHVpbnQzMl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5zZmxvd19jb3VudCAqIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+c2Zsb3dfY291bnQ7IGkxKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c2Zsb3dfaWRbaTFdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5saW5rX2xvY2FsX2FkZHJfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmxpbmtfbG9jYWxfYWRkciA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxpbmtfbG9jYWxfYWRkclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5saW5rX2xvY2FsX2FkZHIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmxpbmtfbG9jYWxfYWRkciwgdGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1hY19kb21haW5faW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zZXJ2aWNlX2dyb3VwX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yY3BfaWRsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cmNwX2lkbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnJjcF9pZCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJjcF9pZFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5yY3BfaWQgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+cmNwX2lkbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+cmNwX2lkLCB0aGlzLT5yY3BfaWRsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yY2NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yY3NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50Y3NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sYXN0X3JlZ2lzdGVyX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hZGRyX3Jlc29sdmVfcmVxdWVzdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCB1c2NoYW5fY291bnQ7CisgICAgdWludDhfdCBpMDsKKyAgICB1aW50OF90IGlwYWRkcl9sZW5ndGg7CisgICAgdWludDhfdCBzZmxvd19jb3VudDsKKyAgICB1aW50OF90IGxpbmtfbG9jYWxfYWRkcl9sZW5ndGg7CisgICAgdWludDhfdCByY3BfaWRsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVzY2hhbl9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhKSAqIHVzY2hhbl9jb3VudCk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgdXNjaGFuX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpcGFkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaXBhZGRyX2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBpcGFkZHJfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZzZmxvd19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MzJfdCkgKiBzZmxvd19jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzZmxvd19jb3VudCAqIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxpbmtfbG9jYWxfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsaW5rX2xvY2FsX2FkZHJfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxpbmtfbG9jYWxfYWRkcl9sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcmNwX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcmNwX2lkbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHJjcF9pZGxlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNlbnRlcl9mcmVxdWVuY3kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb25fcGFjayh0aGlzLT5tb2R1bGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4X3BhY2sodGhpcy0+YW5uZXgsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXJfcGFjayh0aGlzLT5pbnRlcmxlYXZlciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cG93ZXJfbGV2ZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5pbnRlcmZhY2VfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jaGFubmVsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmlzX2VuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jZW50ZXJfZnJlcXVlbmN5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uX3VucGFjaygmdGhpcy0+bW9kdWxhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leF91bnBhY2soJnRoaXMtPmFubmV4LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyX3VucGFjaygmdGhpcy0+aW50ZXJsZWF2ZXIsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvd2VyX2xldmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aW50ZXJmYWNlX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc19wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNlbnRlcl9mcmVxdWVuY3kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jaGFubmVsX3dpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGVfcGFjayh0aGlzLT5jaGFubmVsX3Byb2ZpbGVfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmlzX3NhYzJzaW5jMmVuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5taW5pc2xvdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dHJhbnNtaXRfdGltaW5nX29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW5pdGlhbF9yYW5naW5nX2JhY2tvZmYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmZpbmFsX3JhbmdpbmdfYmFja29mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW5pdGlhbF9kYXRhX2JhY2tvZmYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmZpbmFsX2RhdGFfYmFja29mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YWN0aXZlX3NjZG1hX2NvZGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jb2Rlc19wZXJfc2xvdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c2NkbWFfZnJhbWVfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmhvcHBpbmdfc2VlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlX3BhY2sodGhpcy0+bW9kdWxhdGlvbl90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnByZV9lcXVhbGl6YXRpb25fc2V0dGluZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmludGVyZmFjZV9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pc19lbmFibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Y2VudGVyX2ZyZXF1ZW5jeSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNoYW5uZWxfd2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZV91bnBhY2soJnRoaXMtPmNoYW5uZWxfcHJvZmlsZV90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfc2FjMnNpbmMyZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1pbmlzbG90X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50cmFuc21pdF90aW1pbmdfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbml0aWFsX3JhbmdpbmdfYmFja29mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZmluYWxfcmFuZ2luZ19iYWNrb2ZmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbml0aWFsX2RhdGFfYmFja29mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZmluYWxfZGF0YV9iYWNrb2ZmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hY3RpdmVfc2NkbWFfY29kZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNvZGVzX3Blcl9zbG90KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5zY2RtYV9mcmFtZV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aG9wcGluZ19zZWVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGVfdW5wYWNrKCZ0aGlzLT5tb2R1bGF0aW9uX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cHJlX2VxdWFsaXphdGlvbl9zZXR0aW5nKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aW50ZXJmYWNlX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMzMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmludGVyZmFjZV9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y29udGVudGlvbl9pbnRlcnZhbHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51bmVycm9yZWRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Y29ycmVjdGVkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVuY29ycmVjdGFibGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c25yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5taWNyb19yZWZsZWN0aW9ucykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5pbnRlcmZhY2VfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNvbnRlbnRpb25faW50ZXJ2YWxzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dW5lcnJvcmVkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmNvcnJlY3RlZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmNvcnJlY3RhYmxlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNucikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWljcm9fcmVmbGVjdGlvbnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jaGFubmVsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+aW5wdXRfcG93ZXJfbGV2ZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmlucHV0X3Bvd2VyX2xldmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT52ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cGFja2V0X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlX3BhY2sodGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc19wYWNrKCZ0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb3duc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9wYWNrKCZ0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfcGFjaygmdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3BhY2soJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzW2kzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9wYWNrKCZ0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNbaTRdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzLCB0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfcGFjaygmdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzW2k1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0NSRUFURV9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2NyZWF0ZV9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kX3BhY2sodGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QubWV0aG9kLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uX3BhY2sodGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVxdWVzdF9vcHRpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0NSRUFURV9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9jcmVhdGVfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3BhY2sodGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfRE9XTlNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb3duc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk2ID0gMDsgaTYgPCB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbl9wYWNrKCZ0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzW2k2XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9ET1dOU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk3OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTcgPSAwOyBpNyA8IHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9wYWNrKCZ0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc1tpN10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfVVBTVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpODsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpOCA9IDA7IGk4IDwgdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpOCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbl9wYWNrKCZ0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNbaThdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX1VQU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk5OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTkgPSAwOyBpOSA8IHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7IGk5KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0X3BhY2soJnRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNbaTldLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3QudXBzdHJlYW1faW50ZXJmYWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9pbnRlcmZhY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEwID0gMDsgaTEwIDwgdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50OyBpMTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNbaTEwXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TSUdOQUxfUVVBTElUWV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlLnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9pbnRlcmZhY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxMSA9IDA7IGkxMSA8IHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlLnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQ7IGkxMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV9wYWNrKCZ0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzW2kxMV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTEyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9jbnVfc3RhdHVzX3JlcXVlc3QuY251X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9tYWNfYWRkcmVzcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbnVfbWFjX2FkZHJlc3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NudV9zdGF0dXNfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxMiA9IDA7IGkxMiA8IHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfY291bnQ7IGkxMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9tYWNfYWRkcmVzc1tpMTJdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NOVV9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTEzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9zdGF0dXNfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbnVfc3RhdHVzX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTMgPSAwOyBpMTMgPCB0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9jb3VudDsgaTEzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YV9wYWNrKCZ0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9zdGF0dXNfZGF0YVtpMTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdmNfZmxvd19pZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE0ID0gMDsgaTE0IDwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudDsgaTE0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzW2kxNF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19pZGNvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN2Y19mbG93X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxNSA9IDA7IGkxNSA8IHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19pZGNvdW50OyBpMTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGFfcGFjaygmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3Jlc3BvbnNlLnN2Y19mbG93X2RhdGFbaTE1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTE2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5pbnRmX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UudGltZXN0YW1wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmludGZfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuY21jX2ludGVyZmFjZV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNtY19pbnRlcmZhY2VfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTYgPSAwOyBpMTYgPCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5pbnRmX2NvdW50OyBpMTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3BhY2soJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmNtY19pbnRlcmZhY2VfZGF0YVtpMTZdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlX2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludmFsaWRfcm5nX3JlcXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2Uucm5nX2Fib3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5pbnZhbGlkX3JlZ19yZXFzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLmZhaWxlZF9yZWdfcmVxcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5pbnZhbGlkX2RhdGFfcmVxcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS50NXRpbWVvdXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE3OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2luZGV4ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGZfaW5kZXhcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxNyA9IDA7IGkxNyA8IHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2NvdW50OyBpMTcrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9pbmRleFtpMTddKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1NUQVRJU1RJQ1NfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5pbnRlcmZhY2VzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlLm5ldHdvcmtfaW50ZXJmYWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJuZXR3b3JrX2ludGVyZmFjZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTggPSAwOyBpMTggPCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludGVyZmFjZXNfY291bnQ7IGkxOCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhX3BhY2soJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UubmV0d29ya19pbnRlcmZhY2VzW2kxOF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE5OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfaWRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE5ID0gMDsgaTE5IDwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50OyBpMTkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkc1tpMTldKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTIwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjAgPSAwOyBpMjAgPCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudDsgaTIwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV9wYWNrKCZ0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19kYXRhW2kyMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfUEFDS0VUX0NMQVNTSUZJRVJfQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdmNfZmxvd19pZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyMSA9IDA7IGkyMSA8IHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50OyBpMjErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzW2kyMV0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXNzaWZpZXJfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyMiA9IDA7IGkyMiA8IHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9jb3VudDsgaTIyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX3BhY2soJnRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9kYXRhW2kyMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjMgPSAwOyBpMjMgPCB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTIzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfcGFjaygmdGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNbaTIzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjQgPSAwOyBpMjQgPCB0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMjQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl9wYWNrKCZ0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzW2kyNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5jaGFubmVsX29uZV9wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLmNoYW5uZWxfdHdvX3Bvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UuY2hhbm5lbF90aHJlZV9wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLmNoYW5uZWxfZm91cl9wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9DTlVTX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fcGFjayh0aGlzLT51LnNldF9hZGRfY251c190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlcXVlc3Rfb3B0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlX3BhY2soJnRoaXMtPnUuc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuY251X21hY19yYW5nZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3BhY2sodGhpcy0+dS5zZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fcGFjayh0aGlzLT51LnNldF9leGNsdWRlX2NudXNfZnJvbV9sb2FkX2JhbGFuY2luZ19yZXF1ZXN0LnJlcXVlc3Rfb3B0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3JlcXVlc3QuY251X21hY19hZGRyZXNzX3N0YXJ0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LnNldF9leGNsdWRlX2NudXNfZnJvbV9sb2FkX2JhbGFuY2luZ19yZXF1ZXN0LmNudV9tYWNfYWRkcmVzc19lbmQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9FWENMVURFX0NOVVNfRlJPTV9MT0FEX0JBTEFOQ0lOR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKHRoaXMtPnUuc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3Jlc3BvbnNlLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kX3BhY2sodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lm1ldGhvZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb3duc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscywgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9ucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyZXN0cmljdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyNSA9IDA7IGkyNSA8IHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnNfY291bnQ7IGkyNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2VfcGFjaygmdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9uc1tpMjVdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfQ01DX1NZU1RFTV9FVkVOVF9NRVNTQUdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVfQ09ORklHVVJBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQ05VU19DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfVVBTVFJFQU1TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX1VQU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9SRUdfUlNQX0VWRU5UX01FU1NBR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgxMyAqIHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgyICogdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMTMgKiB0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDMzICogdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIgKiB0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgzMyAqIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQ1JFQVRFX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9DUkVBVEVfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfRE9XTlNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDIgKiB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfRE9XTlNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICgyICogdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9VUFNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDIgKiB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9VUFNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICgyICogdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIgKiB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NJR05BTF9RVUFMSVRZX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMzIgKiB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICg2ICogdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ05VX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfc3RhdHVzX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY251X2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2UuY251X3N0YXR1c19kYXRhW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMiAqIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDM2ICogdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3Jlc3BvbnNlLnN2Y19mbG93X2lkY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmludGZfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuY21jX2ludGVyZmFjZV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGZfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5pbnRmX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5jbWNfaW50ZXJmYWNlX2RhdGFbaTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1NUQVRJU1RJQ1NfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIgKiB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDEwNSAqIHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIgKiB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN2Y19mbG93X2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2RhdGFbaTJdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMiAqIHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfUEFDS0VUX0NMQVNTSUZJRVJfQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhc3NpZmllcl9jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfZGF0YVtpM10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMyAqIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMyAqIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfQ05VU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRVhDTFVERV9DTlVTX0ZST01fTE9BRF9CQUxBTkNJTkdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gKDUgKyB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCArIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkgKyAoMTIgKiB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9DTUNfU1lTVEVNX0VWRU5UX01FU1NBR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQUNUSVZFX0NOVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQUNUSVZFX0NOVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVTX0NPTkZJR1VSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9BQ1RJVkVfQ05VU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9BQ1RJVkVfQ05VU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQ05VX0NPTkZJR1VSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQ05VX0NPTkZJR1VSQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0RPV05TVFJFQU1TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0RPV05TVFJFQU1TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9VUFNUUkVBTVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfVVBTVFJFQU1TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUFNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0VSVklDRVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0VSVklDRVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1JFR19SU1BfRVZFTlRfTUVTU0FHRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dmVyc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBhY2tldF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfdW5wYWNrKCZ0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscywgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3VucGFjaygmdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfdW5wYWNrKCZ0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc1tpM10sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF91bnBhY2soJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc1tpNF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3VucGFjaygmdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzW2k1XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQ1JFQVRFX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2RfdW5wYWNrKCZ0aGlzLT51LnNldF9jcmVhdGVfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5tZXRob2QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fdW5wYWNrKCZ0aGlzLT51LnNldF9jcmVhdGVfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXF1ZXN0X29wdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQ1JFQVRFX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2NyZWF0ZV9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGVfdW5wYWNrKCZ0aGlzLT51LnNldF9jcmVhdGVfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9ET1dOU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbiAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fdW5wYWNrKCZ0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzW2k2XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0RPV05TVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTc7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTcgPSAwOyBpNyA8IHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF91bnBhY2soJnRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzW2k3XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX1VQU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTggPSAwOyBpOCA8IHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fdW5wYWNrKCZ0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNbaThdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfVVBTVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk5ID0gMDsgaTkgPCB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpOSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF91bnBhY2soJnRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNbaTldLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TSUdOQUxfUVVBTElUWV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTEwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3QudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1faW50ZXJmYWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXMgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3QudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTAgPSAwOyBpMTAgPCB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQ7IGkxMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3QudXBzdHJlYW1faW50ZXJmYWNlc1tpMTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NJR05BTF9RVUFMSVRZX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTExOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlLnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1faW50ZXJmYWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlcyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTEgPSAwOyBpMTEgPCB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50OyBpMTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHlfdW5wYWNrKCZ0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzW2kxMV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NOVV9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9jbnVfc3RhdHVzX3JlcXVlc3QuY251X21hY19hZGRyZXNzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY251X21hY19hZGRyZXNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9jbnVfc3RhdHVzX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9tYWNfYWRkcmVzcyA9IChiY21vc19tYWNfYWRkcmVzcyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9jb3VudCAqIHNpemVvZihiY21vc19tYWNfYWRkcmVzcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTIgPSAwOyBpMTIgPCB0aGlzLT51LmdldF9jbnVfc3RhdHVzX3JlcXVlc3QuY251X2NvdW50OyBpMTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfbWFjX2FkZHJlc3NbaTEyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkxMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfc3RhdHVzX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbnVfc3RhdHVzX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfc3RhdHVzX2RhdGEgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEzID0gMDsgaTEzIDwgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQ7IGkxMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfdW5wYWNrKCZ0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9zdGF0dXNfZGF0YVtpMTNdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX1NUQVRJU1RJQ1NfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfaWRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdC5zdmNfZmxvd19pZHMgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE0ID0gMDsgaTE0IDwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudDsgaTE0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzW2kxNF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19pZGNvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19kYXRhID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfaWRjb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTUgPSAwOyBpMTUgPCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfaWRjb3VudDsgaTE1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhX3VucGFjaygmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3Jlc3BvbnNlLnN2Y19mbG93X2RhdGFbaTE1XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMTY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmludGZfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS50aW1lc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuaW50Zl9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5jbWNfaW50ZXJmYWNlX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbWNfaW50ZXJmYWNlX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmNtY19pbnRlcmZhY2VfZGF0YSA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmludGZfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxNiA9IDA7IGkxNiA8IHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmludGZfY291bnQ7IGkxNisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfdW5wYWNrKCZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5jbWNfaW50ZXJmYWNlX2RhdGFbaTE2XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlX2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludmFsaWRfcm5nX3JlcXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2Uucm5nX2Fib3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5pbnZhbGlkX3JlZ19yZXFzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLmZhaWxlZF9yZWdfcmVxcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5pbnZhbGlkX2RhdGFfcmVxcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS50NXRpbWVvdXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE3OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2luZGV4ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW50Zl9pbmRleFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2luZGV4ID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTcgPSAwOyBpMTcgPCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9jb3VudDsgaTE3KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXF1ZXN0LmludGZfaW5kZXhbaTE3XSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE4OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5uZXR3b3JrX2ludGVyZmFjZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJuZXR3b3JrX2ludGVyZmFjZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5uZXR3b3JrX2ludGVyZmFjZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5pbnRlcmZhY2VzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE4ID0gMDsgaTE4IDwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5pbnRlcmZhY2VzX2NvdW50OyBpMTgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YV91bnBhY2soJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UubmV0d29ya19pbnRlcmZhY2VzW2kxOF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN2Y19mbG93X2lkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkcyA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxOSA9IDA7IGkxOSA8IHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudDsgaTE5KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZHNbaTE5XSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfZGF0YSA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjAgPSAwOyBpMjAgPCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudDsgaTIwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV91bnBhY2soJnRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2RhdGFbaTIwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTIxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdmNfZmxvd19pZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjEgPSAwOyBpMjEgPCB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudDsgaTIxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkc1tpMjFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19QQUNLRVRfQ0xBU1NJRklFUl9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXNzaWZpZXJfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfZGF0YSA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyMiA9IDA7IGkyMiA8IHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9jb3VudDsgaTIyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX3VucGFjaygmdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2RhdGFbaTIyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyMyA9IDA7IGkyMyA8IHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMjMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl91bnBhY2soJnRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzW2kyM10sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjQgPSAwOyBpMjQgPCB0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMjQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl91bnBhY2soJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNbaTI0XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGVfdW5wYWNrKCZ0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UuY2hhbm5lbF9vbmVfcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5jaGFubmVsX3R3b19wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLmNoYW5uZWxfdGhyZWVfcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5jaGFubmVsX2ZvdXJfcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfQ05VU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uX3VucGFjaygmdGhpcy0+dS5zZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXF1ZXN0X29wdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZV91bnBhY2soJnRoaXMtPnUuc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuY251X21hY19yYW5nZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfQ05VU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9hZGRfY251c190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGVfdW5wYWNrKCZ0aGlzLT51LnNldF9hZGRfY251c190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRVhDTFVERV9DTlVTX0ZST01fTE9BRF9CQUxBTkNJTkdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbl91bnBhY2soJnRoaXMtPnUuc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3JlcXVlc3QucmVxdWVzdF9vcHRpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5zZXRfZXhjbHVkZV9jbnVzX2Zyb21fbG9hZF9iYWxhbmNpbmdfcmVxdWVzdC5jbnVfbWFjX2FkZHJlc3Nfc3RhcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3JlcXVlc3QuY251X21hY19hZGRyZXNzX2VuZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3VucGFjaygmdGhpcy0+dS5zZXRfZXhjbHVkZV9jbnVzX2Zyb21fbG9hZF9iYWxhbmNpbmdfcmVzcG9uc2UucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2RfdW5wYWNrKCZ0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QubWV0aG9kLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscywgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9ucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJlc3RyaWN0aW9uc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjUgPSAwOyBpMjUgPCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50OyBpMjUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlX3VucGFjaygmdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9uc1tpMjVdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3VucGFjaygmdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9DTUNfU1lTVEVNX0VWRU5UX01FU1NBR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQUNUSVZFX0NOVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQUNUSVZFX0NOVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVTX0NPTkZJR1VSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9BQ1RJVkVfQ05VU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9BQ1RJVkVfQ05VU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQ05VX0NPTkZJR1VSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQ05VX0NPTkZJR1VSQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0RPV05TVFJFQU1TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0RPV05TVFJFQU1TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9VUFNUUkVBTVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfVVBTVFJFQU1TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUFNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0VSVklDRVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0VSVklDRVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1JFR19SU1BfRVZFTlRfTUVTU0FHRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlIG9wY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV91bnBhY2soJm9wY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMpICogZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCkgKiBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcykgKiBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiAxMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzKSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMzMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ1cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCkgKiB1cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzKSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMzMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9DUkVBVEVfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQ1JFQVRFX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0RPV05TVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbikgKiBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0RPV05TVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQpICogZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9VUFNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24pICogdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX1VQU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQpICogdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiB1cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHkpICogdXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50ICogMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgY251X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZjbnVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpICogY251X2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGNudV9jb3VudCAqIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGNudV9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmY251X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSkgKiBjbnVfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IGNudV9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19pZGNvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnN2Y19mbG93X2lkY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDE2X3QpICogc3ZjX2Zsb3dfaWRjb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzdmNfZmxvd19pZGNvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHN2Y19mbG93X2lkY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YSkgKiBzdmNfZmxvd19pZGNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHN2Y19mbG93X2lkY291bnQgKiAzNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaW50Zl9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmaW50Zl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSkgKiBpbnRmX2NvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCBpbnRmX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfTUFDX1NUQVRJU1RJQ1NfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfTUFDX1NUQVRJU1RJQ1NfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW50Zl9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpbnRmX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQxNl90KSAqIGludGZfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaW50Zl9jb3VudCAqIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW50ZXJmYWNlc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpbnRlcmZhY2VzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGEpICogaW50ZXJmYWNlc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBpbnRlcmZhY2VzX2NvdW50ICogMTA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHN2Y19mbG93X2lkY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiBzdmNfZmxvd19pZGNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHN2Y19mbG93X2lkY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnN2Y19mbG93X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSkgKiBzdmNfZmxvd19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgc3ZjX2Zsb3dfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19QQUNLRVRfQ0xBU1NJRklFUl9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHN2Y19mbG93X2lkY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiBzdmNfZmxvd19pZGNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHN2Y19mbG93X2lkY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGNsYXNzaWZpZXJfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZjbGFzc2lmaWVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhKSAqIGNsYXNzaWZpZXJfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IGNsYXNzaWZpZXJfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ1cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyKSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ1cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyKSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9DTlVTX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRVhDTFVERV9DTlVTX0ZST01fTE9BRF9CQUxBTkNJTkdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRVhDTFVERV9DTlVTX0ZST01fTE9BRF9CQUxBTkNJTkdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVzdHJpY3Rpb25zX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiB1cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnJlc3RyaWN0aW9uc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UpICogcmVzdHJpY3Rpb25zX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHJlc3RyaWN0aW9uc19jb3VudCAqIDEyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfQ01DX1NZU1RFTV9FVkVOVF9NRVNTQUdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVfQ09ORklHVVJBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQ05VU19DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfVVBTVFJFQU1TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX1VQU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9SRUdfUlNQX0VWRU5UX01FU1NBR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT5zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHVpbnQyNF90X3RvX3VpbnQzMl90KHRoaXMtPnNpemUpID4gMCkgJiYgKHRoaXMtPmNlcnRpZmljYXRlX2RhdGEgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2VydGlmaWNhdGVfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5jZXJ0aWZpY2F0ZV9kYXRhLCB1aW50MjRfdF90b191aW50MzJfdCh0aGlzLT5zaXplKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlICp0aGlzKQoreworICAgIHJldHVybiAzICsgdWludDI0X3RfdG9fdWludDMyX3QodGhpcy0+c2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KGJ1ZiwgJnRoaXMtPnNpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodWludDI0X3RfdG9fdWludDMyX3QodGhpcy0+c2l6ZSkgPiAwKSAmJiAodGhpcy0+Y2VydGlmaWNhdGVfZGF0YSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Y2VydGlmaWNhdGVfZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh1aW50MjRfdF90b191aW50MzJfdCh0aGlzLT5zaXplKSAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmNlcnRpZmljYXRlX2RhdGEsIHVpbnQyNF90X3RvX3VpbnQzMl90KHRoaXMtPnNpemUpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQyNF90IHNpemU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KHBhY2tlZCwgJnNpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiB1aW50MjRfdF90b191aW50MzJfdChzaXplKSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1aW50MjRfdF90b191aW50MzJfdChzaXplKSAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9BVVRPX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmF1dG9fYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hdXRvX2FkbWluX2NvbnRyb2wud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV9wYWNrKHRoaXMtPnUuYXV0b19hZG1pbl9jb250cm9sLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfQUREX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfREVMX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQVVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BPUlRfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfUkVTRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19SRU5FR09USUFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19BRERfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19ERUxfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUE9SVF9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX0lOX1NFUlZJQ0VfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucGh5X2FkbWluX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucGh5X2FkbWluX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjaygmdGhpcy0+dS5waHlfYWRtaW5fY29udHJvbC5zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUucGh5X2FkbWluX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fUkVORUdPVElBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hdXRvX2FkbWluX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmF1dG9fYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmF1dG9fYWRtaW5fY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYXV0b19hZG1pbl9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjaygmdGhpcy0+dS5hdXRvX2FkbWluX2NvbnRyb2wuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmF1dG9fYWRtaW5fY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYXV0b19hZG1pbl9jb250cm9sLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19BRERfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19ERUxfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUE9SVF9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX0lOX1NFUlZJQ0VfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9BVVRPX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfQUREX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfREVMX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQVVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BPUlRfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfUkVTRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF9wYWNrKHRoaXMtPm9iamVjdF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5vYmplY3RfaW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfcGFjayh0aGlzLT5hbGFybV9pZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUE9XRVJfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X3Bvd2VyX2FsYXJtLnRpbWVfc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvd2VyX2FsYXJtLnN0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZV9wYWNrKHRoaXMtPnUub251X3Bvd2VyX2FsYXJtLmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPTl9JRl9TV0lUQ0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X3Bvbl9pZl9zd2l0Y2gudGltZV9zdGFtcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX2lmX3N3aXRjaC5zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZV9wYWNrKHRoaXMtPnUub251X3Bvbl9pZl9zd2l0Y2guYWxhcm1fY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0NBUkRfU0VMRl9URVNUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFMT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFQT1JUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFUSU1JTkdfVU5MT0NLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0FVVE9fTkVHX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfQ09OR0VTVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPT1BCQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX01JU1NJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfVk9MVF9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0VRVUlQTUVOVF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfSUFEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUEhZU0lDQUxfSU5TVFJVQ1RJT05fQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1NFTEZfVEVTVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TTEVFUF9TVEFUVVNfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1RFTVBfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVSTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9FUlJPU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0ZSQUdNRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1NUQVRVU19DSEFOR0VfVElNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9UU19QT1JUX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLnRpbWVfc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZGVmLnN0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDg7CisgICAgc3dpdGNoICh0aGlzLT5hbGFybV9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPV0VSX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUE9OX0lGX1NXSVRDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfQ0FSRF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX1NFTEZfVEVTVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxUE9SVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxVElNSU5HX1VOTE9DSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9BVVRPX05FR19GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0NPTkdFU1RJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9NSVNTSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX1ZPTFRfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9FUVVJUE1FTlRfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0lBRF9DT05ORUNUSU9OX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BIWVNJQ0FMX0lOU1RSVUNUSU9OX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TRUxGX1RFU1RfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfU0xFRVBfU1RBVFVTX1VQREFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfVEVNUF9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFUk5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0VSUk9TX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfU1RBVFVTX0NIQU5HRV9USU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0VSUk9SU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPVFNfUE9SVF9GQUlMVVJFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF91bnBhY2soJnRoaXMtPm9iamVjdF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5vYmplY3RfaW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfdW5wYWNrKCZ0aGlzLT5hbGFybV9pZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUE9XRVJfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X3Bvd2VyX2FsYXJtLnRpbWVfc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3Bvd2VyX2FsYXJtLnN0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZV91bnBhY2soJnRoaXMtPnUub251X3Bvd2VyX2FsYXJtLmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPTl9JRl9TV0lUQ0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X3Bvbl9pZl9zd2l0Y2gudGltZV9zdGFtcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9uX2lmX3N3aXRjaC5zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZV91bnBhY2soJnRoaXMtPnUub251X3Bvbl9pZl9zd2l0Y2guYWxhcm1fY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0NBUkRfU0VMRl9URVNUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFMT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFQT1JUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFUSU1JTkdfVU5MT0NLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0FVVE9fTkVHX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfQ09OR0VTVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPT1BCQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX01JU1NJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfVk9MVF9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0VRVUlQTUVOVF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfSUFEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUEhZU0lDQUxfSU5TVFJVQ1RJT05fQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1NFTEZfVEVTVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TTEVFUF9TVEFUVVNfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1RFTVBfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVSTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9FUlJPU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0ZSQUdNRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1NUQVRVU19DSEFOR0VfVElNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9UU19QT1JUX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLnRpbWVfc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZGVmLnN0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCBhbGFybV9pZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF91bnBhY2soJmFsYXJtX2lkLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYWxhcm1faWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9QT1dFUl9BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUE9OX0lGX1NXSVRDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0NBUkRfU0VMRl9URVNUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFMT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFQT1JUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFUSU1JTkdfVU5MT0NLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0FVVE9fTkVHX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfQ09OR0VTVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPT1BCQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX01JU1NJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfVk9MVF9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0VRVUlQTUVOVF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfSUFEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUEhZU0lDQUxfSU5TVFJVQ1RJT05fQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1NFTEZfVEVTVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TTEVFUF9TVEFUVVNfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1RFTVBfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVSTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9FUlJPU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0ZSQUdNRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1NUQVRVU19DSEFOR0VfVElNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9UU19QT1JUX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+d2lkdGgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3BhY2sodGhpcy0+dS5waHlfYWRtaW5fc3RhdGUuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV9wYWNrKHRoaXMtPnUuYXV0b19uZWdfYWRtaW5fc3RhdGUuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRlY2hub2xvZ2llc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNbaTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRFZFUlRJU0VEX1RFQ0hfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGVjaG5vbG9naWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc1tpMV0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydF9wYWNrKHRoaXMtPnUuZmVjX2FiaWxpdHkuc3VwcG9ydCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfcGFjayh0aGlzLT51LmZlY19tb2RlLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX0FETUlOX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9PUEVSX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BR0dfT1JfSU5ESVZJRFVBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19DT0xMRUNUT1JfTUFYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RBVEFfUkFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19ERVNDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTElOS19VUF9ET1dOX05PVElGWV9FTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19OQU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX09QRVJfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9PUEVSX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19QUkk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUE9SVF9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRVJSX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVElNRV9PRl9MQVNUX09QRVJfQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRVJSX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVU5LX1BST1RPQ09MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfVFhfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfRlJFUToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfRkFMU0VfQ0FSUklFUlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSURMRV9FUlJPUl9DT1VOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9KQUJCRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTE9TRV9NRURJQV9DVFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0RVUF9FVkVOVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0JBRF9MTElEX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX1NQRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRlJBTUVTX0xPU1RfT0FNX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPT1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfUERVX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9ERVZJQ0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9PVUk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOSVFVRV9FVkVOVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTlNVUFBPUlRFRF9PUENPREVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9NSUlfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NRRV9URVNUX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQlVSU1RTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSVNPTEFURVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NIT1JUX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU09VUkNFX0FERFJfQ0hBTkdFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9WRVJZX0xPTkdfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFhfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMtPndpZHRoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNCArICg0ICogdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURWRVJUSVNFRF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgKDQgKiB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19BQklMSVRZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9PUEVSX0tFWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUdHX09SX0lORElWSURVQUw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQ09MTEVDVE9SX01BWF9ERUxBWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19ERVNDOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0xJTktfVVBfRE9XTl9OT1RJRllfRU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX09QRVJfU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfT1BFUl9LRVk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19QUkk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BPUlRfTElTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRVJSX0ZSQU1FUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfT0NURVRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0RJU0NBUkQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0VSUl9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVU5LX1BST1RPQ09MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9DQVBBQ0lUWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZDU19FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfRlJFUToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9UWVBFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lETEVfRVJST1JfQ09VTlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTE9TRV9NRURJQV9DVFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX01FRElBX0FWQUlMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9HQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9HQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9EVVBfRVZFTlRfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQkFEX0xMSURfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfU1BEX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0ZSQU1FU19MT1NUX09BTV9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9FVkVOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9XSU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0ZMQUdTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9NT0RFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRkxBR1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9NQUNfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9ERVZJQ0U6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX1ZFUlNJT046CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOSVFVRV9FVkVOVF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1FFX1RFU1RfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FMSUdOX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVF9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0JVUlNUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0NPTExJU0lPTlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZDU19FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GUkFNRVNfVE9PX0xPTkc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lTT0xBVEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFTVF9TT1VSQ0VfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfRlJBTUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfT0NURVRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TSE9SVF9FVkVOVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TT1VSQ0VfQUREUl9DSEFOR0VTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfVkVSWV9MT05HX0VWRU5UUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfQ0FQQUNJVFk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX0RBVEE6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWF9DT0xMSVNJT05TOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjaygmdGhpcy0+dS5waHlfYWRtaW5fc3RhdGUuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19hZG1pbl9zdGF0ZS5zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGVjaG5vbG9naWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzID0gKHVpbnQzMl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc1tpMF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEVkVSVElTRURfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGVjaG5vbG9naWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llcyA9ICh1aW50MzJfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNbaTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnRfdW5wYWNrKCZ0aGlzLT51LmZlY19hYmlsaXR5LnN1cHBvcnQsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfdW5wYWNrKCZ0aGlzLT51LmZlY19tb2RlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0NPTExFQ1RPUl9NQVhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RFU0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19MSU5LX1VQX0RPV05fTk9USUZZX0VOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfT1BFUl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QT1JUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19VTktfUFJPVE9DT0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9DQVBBQ0lUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUlJJRVJfU0VOU0VfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVROgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRExFX0VSUk9SX0NPVU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9MT1NFX01FRElBX0NUUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRFVQX0VWRU5UX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQkFEX0xMSURfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfU1BEX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FVkVOVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9GUkFNRVNfTE9TVF9PQU1fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9QRFVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX0RFVklDRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX09VSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5JUVVFX0VWRU5UX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOU1VQUE9SVEVEX09QQ09ERVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX01JSV9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1FFX1RFU1RfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVF9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUSVRJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9CVVJTVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0RBVEFfUkFURV9NSVNNQVRDSEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GUkFNRVNfVE9PX0xPTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JU09MQVRFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFTVF9TT1VSQ0VfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFURV9FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SVU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU0hPUlRfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TT1VSQ0VfQUREUl9DSEFOR0VTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TWU1fRVJSX0RVUklOR19QS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1ZFUllfTE9OR19FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfVEVYVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RZUEU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1RFQ0hfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0ZWNobm9sb2dpZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGVjaG5vbG9naWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQzMl90KSAqIHRlY2hub2xvZ2llc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHRlY2hub2xvZ2llc19jb3VudCAqIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURWRVJUSVNFRF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdGVjaG5vbG9naWVzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRlY2hub2xvZ2llc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MzJfdCkgKiB0ZWNobm9sb2dpZXNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCB0ZWNobm9sb2dpZXNfY291bnQgKiA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9BRE1JTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfT1BFUl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19QUkk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUdHX09SX0lORElWSURVQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQ09MTEVDVE9SX01BWF9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19EQVRBX1JBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREVTQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0xJTktfVVBfRE9XTl9OT1RJRllfRU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTkFNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19PUEVSX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfT1BFUl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BPUlRfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0VSUl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RJTUVfT0ZfTEFTVF9PUEVSX0NIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0VSUl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1VOS19QUk9UT0NPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZDU19FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX0ZSRVE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0ZBTFNFX0NBUlJJRVJTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lETEVfRVJST1JfQ09VTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSkFCQkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0xPU0VfTUVESUFfQ1RSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX01FRElBX0FWQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9EVVBfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9CQURfTExJRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9TUERfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VWRU5UX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0ZSQU1FU19MT1NUX09BTV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfREVWSUNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTklRVUVfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TUUVfVEVTVF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRJVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0JVUlNUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfREFUQV9SQVRFX01JU01BVENIRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZDU19FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZSQU1FU19UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lTT0xBVEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVNUX1NPVVJDRV9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVRFX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JVTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TSE9SVF9FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NPVVJDRV9BRERSX0NIQU5HRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NZTV9FUlJfRFVSSU5HX1BLVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfVkVSWV9MT05HX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9DQVBBQ0lUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9URVhUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RYX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFlQRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZV9wYWNrKHRoaXMtPmNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NIVVJOSU5HX09QX0NPREVfTkVXX0tFWV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubmV3X2tleV9yZXF1ZXN0LmluX3VzZV9rZXlfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ0hVUk5JTkdfT1BfQ09ERV9ORVdfQ0hVUk5JTkdfS0VZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubmV3X2NodXJuaW5nX2tleS5uZXdfa2V5X2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm5ld19jaHVybmluZ19rZXkuY2h1cm5pbmdfa2V5MCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5uZXdfY2h1cm5pbmdfa2V5LmNodXJuaW5nX2tleTEsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubmV3X2NodXJuaW5nX2tleS5jaHVybmluZ19rZXkyLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DSFVSTklOR19PUF9DT0RFX05FV19LRVlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DSFVSTklOR19PUF9DT0RFX05FV19DSFVSTklOR19LRVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGVfdW5wYWNrKCZ0aGlzLT5jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DSFVSTklOR19PUF9DT0RFX05FV19LRVlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm5ld19rZXlfcmVxdWVzdC5pbl91c2Vfa2V5X2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NIVVJOSU5HX09QX0NPREVfTkVXX0NIVVJOSU5HX0tFWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm5ld19jaHVybmluZ19rZXkubmV3X2tleV9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm5ld19jaHVybmluZ19rZXkuY2h1cm5pbmdfa2V5MCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm5ld19jaHVybmluZ19rZXkuY2h1cm5pbmdfa2V5MSwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm5ld19jaHVybmluZ19rZXkuY2h1cm5pbmdfa2V5MiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlIGNvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGVfdW5wYWNrKCZjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DSFVSTklOR19PUF9DT0RFX05FV19LRVlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ0hVUk5JTkdfT1BfQ09ERV9ORVdfQ0hVUk5JTkdfS0VZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZV9wYWNrKHRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfT1BDT0RFX0NPTU1JVF9JTUFHRV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZ19wYWNrKHRoaXMtPnUuY29tbWl0X2ltYWdlX3JlcXVlc3QuZmxhZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrX3BhY2sodGhpcy0+dS5jb21taXRfaW1hZ2VfcmVzcG9uc2UuYWNrLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX09QQ09ERV9DT01NSVRfSU1BR0VfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX09QQ09ERV9DT01NSVRfSU1BR0VfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWdfdW5wYWNrKCZ0aGlzLT51LmNvbW1pdF9pbWFnZV9yZXF1ZXN0LmZsYWcsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfT1BDT0RFX0NPTU1JVF9JTUFHRV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Fja191bnBhY2soJnRoaXMtPnUuY29tbWl0X2ltYWdlX3Jlc3BvbnNlLmFjaywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZSBvcGNvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX09QQ09ERV9DT01NSVRfSU1BR0VfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX09QQ09ERV9DT01NSVRfSU1BR0VfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXBvcnRfYml0bWFwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cXVldWUwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDAyKSA9PSAweDAwMDIpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMDgpID09IDB4MDAwOCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cXVldWUzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDEwKSA9PSAweDAwMTApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAyMCkgPT0gMHgwMDIwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwNDApID09IDB4MDA0MCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cXVldWU2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDgwKSA9PSAweDAwODApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlcG9ydF9iaXRtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAwMSkgPT0gMHgwMDAxKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5xdWV1ZTApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMDIpID09IDB4MDAwMikpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWUxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnF1ZXVlMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAwOCkgPT0gMHgwMDA4KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5xdWV1ZTMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMTApID09IDB4MDAxMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWU0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDIwKSA9PSAweDAwMjApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnF1ZXVlNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDA0MCkgPT0gMHgwMDQwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5xdWV1ZTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwODApID09IDB4MDA4MCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWU3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlX3BhY2sodGhpcy0+ZGJhX2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5kYmFfY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9nZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3BhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9zZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF9wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2Vfc2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF9wYWNrKCZ0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzW2kyXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+ZGJhX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXRzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXRzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZV91bnBhY2soJnRoaXMtPmRiYV9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGJhX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9nZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0cyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfdW5wYWNrKCZ0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3NldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0cyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3VucGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9zZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0cyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzW2kyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZSBkYmFfY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGVfdW5wYWNrKCZkYmFfY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGRiYV9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBxdWV1ZV9zZXRzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcXVldWVfc2V0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQpICogcXVldWVfc2V0c19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgcXVldWVfc2V0c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcXVldWVfc2V0c19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnF1ZXVlX3NldHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0KSAqIHF1ZXVlX3NldHNfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHF1ZXVlX3NldHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBxdWV1ZV9zZXRzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcXVldWVfc2V0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQpICogcXVldWVfc2V0c19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgcXVldWVfc2V0c19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3RfcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbmd0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX09MRF9NQU5BR0VNRU5UX09CSkVDVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucG9ydC5wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+bGVuZ3RoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfT0xEX01BTkFHRU1FTlRfT0JKRUNUX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0X3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+bGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+bGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX09MRF9NQU5BR0VNRU5UX09CSkVDVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0LnBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+bGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0IGxlYWY7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdF91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9PTERfTUFOQUdFTUVOVF9PQkpFQ1RfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3RfcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbmd0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZV9wYWNrKHRoaXMtPnUucG9ydC5wb3J0X3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wb3J0LmNhc2NhZGVfc2xvdF9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBvcnQucG9ydF9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9DQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmNhcmQuY2FyZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX0xMSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUubGxpZC5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfUE9OX0lGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnBvbl9pZi5wb25faWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9PTlU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT5sZW5ndGg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9DQVJEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9MTElEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT05fSUY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX09OVToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0X3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+bGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+bGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZV91bnBhY2soJnRoaXMtPnUucG9ydC5wb3J0X3R5cGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9ydC5jYXNjYWRlX3Nsb3RfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnQucG9ydF9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9DQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2FyZC5jYXJkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfTExJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmxsaWQubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX1BPTl9JRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvbl9pZi5wb25faWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9PTlU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0IGxlYWY7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0X3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfUE9OX0lGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfT05VOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3BhY2sodGhpcy0+dS5hdHRyaWJ1dGUuZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfcGFjayh0aGlzLT51LmFjdGlvbi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3BhY2soJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9wYWNrKCZ0aGlzLT51Lm1hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmV4dF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV9wYWNrKHRoaXMtPnUuZXh0X2F0dHJpYnV0ZS5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fcGFjayh0aGlzLT51LmV4dF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV9wYWNrKHRoaXMtPnUuZXh0X2FjdGlvbi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5rdGF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3BhY2sodGhpcy0+dS5rdGF0dHJpYnV0ZS5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5rdGFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3BhY2sodGhpcy0+dS5rdGFjdGlvbi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfcGFjayh0aGlzLT51LmRlZi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubWFuYWdlbWVudF9vYmplY3Qub2JqZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmVycm9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3VucGFjaygmdGhpcy0+dS5hY3Rpb24uZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3VucGFjaygmdGhpcy0+dS5tYW5hZ2VtZW50X29iamVjdC5vYmplY3QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmV4dF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soJnRoaXMtPnUuZXh0X2F0dHJpYnV0ZS5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmV4dF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soJnRoaXMtPnUuZXh0X2FjdGlvbi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5rdGF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3VucGFjaygmdGhpcy0+dS5rdGF0dHJpYnV0ZS5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5rdGFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3VucGFjaygmdGhpcy0+dS5rdGFjdGlvbi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmRlZi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2ggYnJhbmNoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfdW5wYWNrKCZicmFuY2gsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChicmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGVfcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VUSF9QT1JUX1BPTElDSU5HX0VOQUJMRV9ESVNBQkxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVRIX1BPUlRfUE9MSUNJTkdfRU5BQkxFX0VOQUJMRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUuZW5hYmxlZC5jaXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51LmVuYWJsZWQuYnVja2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5lbmFibGVkLmV4dHJhX2J1cnN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5kZWYudW5rbm93biwgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVRIX1BPUlRfUE9MSUNJTkdfRU5BQkxFX0RJU0FCTEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVEhfUE9SVF9QT0xJQ0lOR19FTkFCTEVfRU5BQkxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VUSF9QT1JUX1BPTElDSU5HX0VOQUJMRV9ESVNBQkxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVRIX1BPUlRfUE9MSUNJTkdfRU5BQkxFX0VOQUJMRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KGJ1ZiwgJnRoaXMtPnUuZW5hYmxlZC5jaXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZ0aGlzLT51LmVuYWJsZWQuYnVja2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoYnVmLCAmdGhpcy0+dS5lbmFibGVkLmV4dHJhX2J1cnN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9kZWZfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlIHN0YXRlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGVfdW5wYWNrKCZzdGF0ZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VUSF9QT1JUX1BPTElDSU5HX0VOQUJMRV9ESVNBQkxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVRIX1BPUlRfUE9MSUNJTkdfRU5BQkxFX0VOQUJMRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0X3BhY2sodGhpcy0+b2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm9iamVjdF9pbnN0YW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF9wYWNrKHRoaXMtPmFsYXJtX2lkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3RfdW5wYWNrKCZ0aGlzLT5vYmplY3RfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+b2JqZWN0X2luc3RhbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkX3VucGFjaygmdGhpcy0+YWxhcm1faWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV9wYWNrKCZ0aGlzLT5ldmVudF9lbnRyeSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX3BhY2sodGhpcy0+ZXZlbnRfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnlfdW5wYWNrKCZ0aGlzLT5ldmVudF9lbnRyeSwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5ldmVudF9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3BhY2soJnRoaXMtPmV2ZW50X2VudHJ5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zZXRfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y2xlYXJfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3VucGFjaygmdGhpcy0+ZXZlbnRfZW50cnksIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c2V0X3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNsZWFyX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfcGFjayh0aGlzLT5zdWJfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1Yl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3RhdHVzX3JlcXVlc3QuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Vfc3RhdHVzX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyeV9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV9wYWNrKCZ0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJpZXNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN0YXR1c19zZXQuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfc2V0LmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9zdGF0dXNfc2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyeV9jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfcGFjaygmdGhpcy0+dS5zdGF0dXNfc2V0LmVudHJpZXNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3N0YXR1c19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnN0YXR1c19yZXNwb25zZS5lbnRyeV9jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfcGFjaygmdGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cmllc1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudGhyZXNob2xkX3JlcXVlc3QuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyeV9jb3VudCA+IDApICYmICh0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV90aHJlc2hvbGRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJ5X2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3BhY2soJnRoaXMtPnUudGhyZXNob2xkX3JlcXVlc3QuZW50cmllc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyeV9jb3VudCA+IDApICYmICh0aGlzLT51LnRocmVzaG9sZF9zZXQuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3RocmVzaG9sZF9zZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJ5X2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeV9wYWNrKCZ0aGlzLT51LnRocmVzaG9sZF9zZXQuZW50cmllc1tpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyeV9jb3VudCA+IDApICYmICh0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfdGhyZXNob2xkX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUudGhyZXNob2xkX3Jlc3BvbnNlLmVudHJ5X2NvdW50OyBpNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeV9wYWNrKCZ0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyaWVzW2k1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+c3ViX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICg4ICogdGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyeV9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICgxMiAqIHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyeV9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDEyICogdGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9USFJFU0hPTERfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDggKiB0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDE2ICogdGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoMTYgKiB0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyeV9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfdW5wYWNrKCZ0aGlzLT5zdWJfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1Yl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3RhdHVzX3JlcXVlc3QuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9zdGF0dXNfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyeV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJ5X2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3VucGFjaygmdGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyaWVzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc3RhdHVzX3NldC5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN0YXR1c19zZXQuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfc2V0LmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3N0YXR1c19zZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zdGF0dXNfc2V0LmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyeV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zdGF0dXNfc2V0LmVudHJ5X2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeV91bnBhY2soJnRoaXMtPnUuc3RhdHVzX3NldC5lbnRyaWVzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Vfc3RhdHVzX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJ5X2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnN0YXR1c19yZXNwb25zZS5lbnRyeV9jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfdW5wYWNrKCZ0aGlzLT51LnN0YXR1c19yZXNwb25zZS5lbnRyaWVzW2kyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudGhyZXNob2xkX3JlcXVlc3QuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV90aHJlc2hvbGRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyeV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJ5X2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3VucGFjaygmdGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyaWVzW2kzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRocmVzaG9sZF9zZXQuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3RocmVzaG9sZF9zZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyeV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJ5X2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeV91bnBhY2soJnRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyaWVzW2k0XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfdGhyZXNob2xkX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudGhyZXNob2xkX3Jlc3BvbnNlLmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudGhyZXNob2xkX3Jlc3BvbnNlLmVudHJ5X2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyeV9jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfdW5wYWNrKCZ0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyaWVzW2k1XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZSBzdWJfdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfdW5wYWNrKCZzdWJfdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN1Yl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZlbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5KSAqIGVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGVudHJ5X2NvdW50ICogOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZlbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSkgKiBlbnRyeV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBlbnRyeV9jb3VudCAqIDEyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkpICogZW50cnlfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZW50cnlfY291bnQgKiAxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9USFJFU0hPTERfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSkgKiBlbnRyeV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBlbnRyeV9jb3VudCAqIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkpICogZW50cnlfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZW50cnlfY291bnQgKiAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9USFJFU0hPTERfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgZW50cnlfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5KSAqIGVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGVudHJ5X2NvdW50ICogMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX0ZBU1RfTEVBVkVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fY29udHJvbC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uX3BhY2sodGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX2NvbnRyb2wuYWN0aXZhdGVfZmFzdF9sZWF2ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX01VTFRJX0xMSURfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGlfbGxpZF9hZG1pbl9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC5udW1fbGxpZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fUkVTRVRfQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1NMRUVQX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNsZWVwX2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2xlZXBfY29udHJvbC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnNsZWVwX2NvbnRyb2wuc2xlZXBfZHVyYXRpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnNsZWVwX2NvbnRyb2wud2FrZV9kdXJhdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnX3BhY2sodGhpcy0+dS5zbGVlcF9jb250cm9sLnNsZWVwX2ZsYWcsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlX3BhY2sodGhpcy0+dS5zbGVlcF9jb250cm9sLnNsZWVwX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRlZi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9GQVNUX0xFQVZFX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX01VTFRJX0xMSURfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fUkVTRVRfQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1NMRUVQX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX0ZBU1RfTEVBVkVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uX3VucGFjaygmdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX2NvbnRyb2wuYWN0aXZhdGVfZmFzdF9sZWF2ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9jb250cm9sLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX01VTFRJX0xMSURfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5tdWx0aV9sbGlkX2FkbWluX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGlfbGxpZF9hZG1pbl9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubXVsdGlfbGxpZF9hZG1pbl9jb250cm9sLm51bV9sbGlkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tdWx0aV9sbGlkX2FkbWluX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fUkVTRVRfQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1NMRUVQX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2xlZXBfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuc2xlZXBfY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnNsZWVwX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnNsZWVwX2NvbnRyb2wud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zbGVlcF9jb250cm9sLnNsZWVwX2R1cmF0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNsZWVwX2NvbnRyb2wud2FrZV9kdXJhdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnX3VucGFjaygmdGhpcy0+dS5zbGVlcF9jb250cm9sLnNsZWVwX2ZsYWcsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfdW5wYWNrKCZ0aGlzLT51LnNsZWVwX2NvbnRyb2wuc2xlZXBfbW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuc2xlZXBfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2xlZXBfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5kZWYud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gbGVhZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX0ZBU1RfTEVBVkVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9NVUxUSV9MTElEX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fUkVTRVRfQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1NMRUVQX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnF1ZXVlX251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmZpeGVkX3BhY2tldF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+Zml4ZWRfYmFuZHdpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+Z3VhcmFudGVlZF9iYW5kd2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5iZXN0X2VmZm9ydF9iYW5kd2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndycl93ZWlnaHQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5xdWV1ZV9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5maXhlZF9wYWNrZXRfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmZpeGVkX2JhbmR3aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmd1YXJhbnRlZWRfYmFuZHdpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+YmVzdF9lZmZvcnRfYmFuZHdpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53cnJfd2VpZ2h0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbl9wYWNrKHRoaXMtPm9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fREVBQ1RJVkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU0VSVklDRV9TTEFfT1BFUkFUSU9OX0FDVElWQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWVfcGFjayh0aGlzLT51LmFjdGl2YXRlLnNjaGVtZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFjdGl2YXRlLnByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5hY3RpdmF0ZS5jeWNsZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYWN0aXZhdGUuc2VydmljZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlcnZpY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9hY3RpdmF0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZV9wYWNrKCZ0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi5zZXJ2aWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi5zZXJ2aWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZXJ2aWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLnNlcnZpY2VzLCB0aGlzLT51LmRlZi5zZXJ2aWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+b3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NFUlZJQ0VfU0xBX09QRVJBVElPTl9ERUFDVElWQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fQUNUSVZBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNyArICgxMCAqIHRoaXMtPnUuYWN0aXZhdGUuc2VydmljZXNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5kZWYuc2VydmljZXNfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+b3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NFUlZJQ0VfU0xBX09QRVJBVElPTl9ERUFDVElWQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fQUNUSVZBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2RiYV9zY2hlZHVsaW5nX3NjaGVtZV91bnBhY2soJnRoaXMtPnUuYWN0aXZhdGUuc2NoZW1lLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYWN0aXZhdGUucHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmFjdGl2YXRlLmN5Y2xlX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWN0aXZhdGUuc2VydmljZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZXJ2aWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfYWN0aXZhdGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlcyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGVfdW5wYWNrKCZ0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi5zZXJ2aWNlc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfZGVmX2NvdW50X3NlcnZpY2VzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi5zZXJ2aWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi5zZXJ2aWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlcnZpY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYuc2VydmljZXMgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kZWYuc2VydmljZXNfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmRlZi5zZXJ2aWNlcywgdGhpcy0+dS5kZWYuc2VydmljZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uIG9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uX3VucGFjaygmb3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NFUlZJQ0VfU0xBX09QRVJBVElPTl9ERUFDVElWQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fQUNUSVZBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBzZXJ2aWNlc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZzZXJ2aWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSkgKiBzZXJ2aWNlc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzZXJ2aWNlc19jb3VudCAqIDEwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXJ2aWNlc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzZXJ2aWNlc19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9kZWZfY291bnRfc2VydmljZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bnVtX3BvcnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bnVtX3BvcnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aF9wYWNrKHRoaXMtPndpZHRoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+d2lkdGgpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX0dMT0JBTF9QQVJBTVNfV0lEVEhfSVBWNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5pcHY0Lm9udV9pcGFkZHJlc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LmlwdjQub251X25ldHdvcmtfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuaXB2NC5vbnVfZGVmYXVsdF9ndykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaXB2NC5kYXRhX2N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pcHY0LmRhdGFfc3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaXB2NC5kYXRhX3ByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhidWYsIHRoaXMtPnUuaXB2Ni5vbnVfaXBhZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5pcHY2LmlwdjZwcmVmaXhfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5pcHY2Lm9udV9kZWZhdWx0X2d3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pcHY2LmRhdGFfY3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmlwdjYuZGF0YV9zdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pcHY2LmRhdGFfcHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPndpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGhfdW5wYWNrKCZ0aGlzLT53aWR0aCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPndpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuaXB2NC5vbnVfaXBhZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5pcHY0Lm9udV9uZXR3b3JrX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT51LmlwdjQub251X2RlZmF1bHRfZ3cpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmlwdjQuZGF0YV9jdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaXB2NC5kYXRhX3N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmlwdjQuZGF0YV9wcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfR0xPQkFMX1BBUkFNU19XSURUSF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT51LmlwdjYub251X2lwYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuaXB2Ni5pcHY2cHJlZml4X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuaXB2Ni5vbnVfZGVmYXVsdF9ndykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaXB2Ni5kYXRhX2N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pcHY2LmRhdGFfc3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaXB2Ni5kYXRhX3ByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aCB3aWR0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGhfdW5wYWNrKCZ3aWR0aCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHdpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfR0xPQkFMX1BBUkFNU19XSURUSF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoX3BhY2sodGhpcy0+d2lkdGgsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT53aWR0aCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfU05NUF9QQVJBTVNfV0lEVEhfSVBWNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmlwdjQuc25tcF92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5pcHY0LnRyYXBfaG9zdF9pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaXB2NC50cmFwX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmlwdjQuc25tcF9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlwdjQuc2VjdXJpdHlfbmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaXB2NC5jb21tdW5pdHlfZm9yX3JlYWQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlwdjQuY29tbXVuaXR5X2Zvcl93cml0ZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pcHY2LnNubXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhidWYsIHRoaXMtPnUuaXB2Ni50cmFwX2hvc3RfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmlwdjYudHJhcF9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pcHY2LnNubXBfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcHY2LnNlY3VyaXR5X25hbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlwdjYuY29tbXVuaXR5X2Zvcl9yZWFkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcHY2LmNvbW11bml0eV9mb3Jfd3JpdGUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPndpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9TTk1QX1BBUkFNU19XSURUSF9JUFY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTE3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoX3VucGFjaygmdGhpcy0+d2lkdGgsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT53aWR0aCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfU05NUF9QQVJBTVNfV0lEVEhfSVBWNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmlwdjQuc25tcF92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5pcHY0LnRyYXBfaG9zdF9pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaXB2NC50cmFwX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmlwdjQuc25tcF9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaXB2NC5zZWN1cml0eV9uYW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmlwdjQuY29tbXVuaXR5X2Zvcl9yZWFkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmlwdjQuY29tbXVuaXR5X2Zvcl93cml0ZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pcHY2LnNubXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuaXB2Ni50cmFwX2hvc3RfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmlwdjYudHJhcF9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pcHY2LnNubXBfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmlwdjYuc2VjdXJpdHlfbmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcHY2LmNvbW11bml0eV9mb3JfcmVhZCwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcHY2LmNvbW11bml0eV9mb3Jfd3JpdGUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoIHdpZHRoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGhfdW5wYWNrKCZ3aWR0aCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHdpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9TTk1QX1BBUkFNU19XSURUSF9JUFY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfU05NUF9QQVJBTVNfV0lEVEhfSVBWNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmV0aGVyX3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV92bGFuX3RhZyhidWYsIHRoaXMtPnZsYW5fdGFnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmV0aGVyX3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3ZsYW5fdGFnKGJ1ZiwgJnRoaXMtPnZsYW5fdGFnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKCZ0aGlzLT5vbGRfdmxhbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPm5ld192bGFuLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT5vbGRfdmxhbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT5uZXdfdmxhbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb25fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dmxhbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+c3ZsYW4sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT52bGFuc19jb3VudCA+IDApICYmICh0aGlzLT52bGFucyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dmxhbnNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPnZsYW5zW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgKnRoaXMpCit7CisgICAgcmV0dXJuIDYgKyAoNCAqIHRoaXMtPnZsYW5zX2NvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT52bGFuc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF91bnBhY2soJnRoaXMtPnN2bGFuLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT52bGFuc19jb3VudCA+IDApICYmICh0aGlzLT52bGFucyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52bGFucyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dmxhbnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZsYW5zX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF91bnBhY2soJnRoaXMtPnZsYW5zW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCB2bGFuc19jb3VudDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmdmxhbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCkgKiB2bGFuc19jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB2bGFuc19jb3VudCAqIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGVfcGFjayh0aGlzLT5tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJBTlNQQVJFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKCZ0aGlzLT51LnRhZy52bGFuLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TTEFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+dS50cmFuc2xhdGlvbi5kZWZhdWx0X3ZsYW4sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9uc19jb3VudCA+IDApICYmICh0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9ucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0cmFuc2xhdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RyYW5zbGF0aW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb25fcGFjaygmdGhpcy0+dS50cmFuc2xhdGlvbi50cmFuc2xhdGlvbnNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPnUudHJ1bmsuZGVmYXVsdF92bGFuLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicGVybWl0dGVkX3ZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cnVua1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFuc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9BR0dSRUdBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKCZ0aGlzLT51LmFnZ3JlZ2F0ZS5kZWZhdWx0X3ZsYW4sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRhYmxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfYWdncmVnYXRlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9wYWNrKCZ0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOS19NRFU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRydW5rX21kdS5wZXJtaXR0ZWRfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBlcm1pdHRlZF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtfbWR1XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFuc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zW2kzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfSFlCUklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+dS5oeWJyaWQuZGVmYXVsdF92bGFuLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5oeWJyaWQucGVybWl0dGVkX3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwZXJtaXR0ZWRfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2h5YnJpZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51Lmh5YnJpZC5wZXJtaXR0ZWRfdmxhbnNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFuc1tpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1NQRUNJQUxfVFJBTlNQQVJFTlQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUkFOU1BBUkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJBTlNMQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArICg4ICogdGhpcy0+dS50cmFuc2xhdGlvbi50cmFuc2xhdGlvbnNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArICg0ICogdGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfQUdHUkVHQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRhYmxlc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOS19NRFU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gKDQgKiB0aGlzLT51LnRydW5rX21kdS5wZXJtaXR0ZWRfdmxhbnNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfSFlCUklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyAoNCAqIHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFuc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9TUEVDSUFMX1RSQU5TUEFSRU5UOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZV91bnBhY2soJnRoaXMtPm1vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUkFOU1BBUkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+dS50YWcudmxhbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TTEFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT51LnRyYW5zbGF0aW9uLmRlZmF1bHRfdmxhbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cmFuc2xhdGlvbl9jb3VudF90cmFuc2xhdGlvbnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidHJhbnNsYXRpb25zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cmFuc2xhdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9ucyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb24gKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS50cmFuc2xhdGlvbi50cmFuc2xhdGlvbnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbl91bnBhY2soJnRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+dS50cnVuay5kZWZhdWx0X3ZsYW4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFuc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtfY291bnRfcGVybWl0dGVkX3ZsYW5zKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBlcm1pdHRlZF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudHJ1bmsucGVybWl0dGVkX3ZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFuc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFuc1tpMV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfQUdHUkVHQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT51LmFnZ3JlZ2F0ZS5kZWZhdWx0X3ZsYW4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc19jb3VudCA+IDApICYmICh0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0YWJsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2FnZ3JlZ2F0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV91bnBhY2soJnRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTktfTURVOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIHRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFuc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtfbWR1X2NvdW50X3Blcm1pdHRlZF92bGFucyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBlcm1pdHRlZF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtfbWR1XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFucyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnRydW5rX21kdS5wZXJtaXR0ZWRfdmxhbnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zW2kzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9IWUJSSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF91bnBhY2soJnRoaXMtPnUuaHlicmlkLmRlZmF1bHRfdmxhbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFuc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfaHlicmlkX2NvdW50X3Blcm1pdHRlZF92bGFucyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5oeWJyaWQucGVybWl0dGVkX3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBlcm1pdHRlZF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfaHlicmlkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFucyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5oeWJyaWQucGVybWl0dGVkX3ZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51Lmh5YnJpZC5wZXJtaXR0ZWRfdmxhbnNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+dS5oeWJyaWQucGVybWl0dGVkX3ZsYW5zW2k0XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9TUEVDSUFMX1RSQU5TUEFSRU5UOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGUgbW9kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlX3VucGFjaygmbW9kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TUEFSRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVEFHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJBTlNMQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhbnNsYXRpb25zX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHRyYW5zbGF0aW9uc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcGVybWl0dGVkX3ZsYW5zX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBlcm1pdHRlZF92bGFuc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBlcm1pdHRlZF92bGFuc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9BR0dSRUdBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgdGFibGVzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJnRhYmxlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlKSAqIHRhYmxlc19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGFibGVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOS19NRFU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcGVybWl0dGVkX3ZsYW5zX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwZXJtaXR0ZWRfdmxhbnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwZXJtaXR0ZWRfdmxhbnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfSFlCUklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBlcm1pdHRlZF92bGFuc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwZXJtaXR0ZWRfdmxhbnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwZXJtaXR0ZWRfdmxhbnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfU1BFQ0lBTF9UUkFOU1BBUkVOVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cmFuc2xhdGlvbl9jb3VudF90cmFuc2xhdGlvbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cnVua19jb3VudF9wZXJtaXR0ZWRfdmxhbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cnVua19tZHVfY291bnRfcGVybWl0dGVkX3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfaHlicmlkX2NvdW50X3Blcm1pdHRlZF92bGFucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkX3BhY2sodGhpcy0+ZmllbGQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5maWVsZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LmRhLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5kYS5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuc2EudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LnNhLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfVkxBTl9QUkk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS52bGFuX3ByaS5yZXNlcnZlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS52bGFuX3ByaS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUudmxhbl9wcmkub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudmxhbl9pZC5yZXNlcnZlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudmxhbl9pZC52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUudmxhbl9pZC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0VUSF9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZXRoX3R5cGUucmVzZXJ2ZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmV0aF90eXBlLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5ldGhfdHlwZS5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfSVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5kZXN0X2lwLnJlc2VydmVkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5kZXN0X2lwLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5kZXN0X2lwLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc291cmNlX2lwLnJlc2VydmVkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zb3VyY2VfaXAudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LnNvdXJjZV9pcC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcF90eXBlLnJlc2VydmVkLCA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmlwX3R5cGUudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LmlwX3R5cGUub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9UT1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcF90b3MucmVzZXJ2ZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaXBfdG9zLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5pcF90b3Mub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9QUkVDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaXBfcHJlYy5yZXNlcnZlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pcF9wcmVjLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5pcF9wcmVjLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5zb3VyY2VfcG9ydC5yZXNlcnZlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc291cmNlX3BvcnQudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LnNvdXJjZV9wb3J0Lm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREVTVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVzdF9wb3J0LnJlc2VydmVkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZXN0X3BvcnQudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LmRlc3RfcG9ydC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlwX3Zlci5yZXNlcnZlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaXBfdmVyLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5pcF92ZXIub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9GTE9XX0xBQkVMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaXBfZmxvd19sYWJlbC5yZXNlcnZlZCwgMTIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmlwX2Zsb3dfbGFiZWwudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LmlwX2Zsb3dfbGFiZWwub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EU1RfSVBWNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5kc3RfaXB2Ni52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuZHN0X2lwdjYub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TUkNfSVBWNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zcmNfaXB2Ni52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuc3JjX2lwdjYub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EU1RfSVBWNlBSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5kc3RfaXB2NnByZS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuZHN0X2lwdjZwcmUub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TUkNfSVBWNlBSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zcmNfaXB2NnByZS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuc3JjX2lwdjZwcmUub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9OWFRfSERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubnh0X2hkci5yZXNlcnZlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubnh0X2hkci52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUubnh0X2hkci5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRlZi52YWwsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LmRlZi5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5maWVsZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX1BSSToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0VUSF9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfSVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVE9TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1BSRUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREVTVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfRkxPV19MQUJFTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NSQ19JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EU1RfSVBWNlBSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX05YVF9IRFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZF91bnBhY2soJnRoaXMtPmZpZWxkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmllbGQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5kYS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuZGEub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT51LnNhLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5zYS5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1ZMQU5fUFJJOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS52bGFuX3ByaS5yZXNlcnZlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS52bGFuX3ByaS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUudmxhbl9wcmkub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS52bGFuX2lkLnJlc2VydmVkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS52bGFuX2lkLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS52bGFuX2lkLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRVRIX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmV0aF90eXBlLnJlc2VydmVkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5ldGhfdHlwZS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuZXRoX3R5cGUub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9ERVNUX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5kZXN0X2lwLnJlc2VydmVkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5kZXN0X2lwLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5kZXN0X2lwLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5zb3VyY2VfaXAucmVzZXJ2ZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT51LnNvdXJjZV9pcC52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuc291cmNlX2lwLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaXBfdHlwZS5yZXNlcnZlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pcF90eXBlLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5pcF90eXBlLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVE9TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcF90b3MucmVzZXJ2ZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaXBfdG9zLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5pcF90b3Mub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9QUkVDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcF9wcmVjLnJlc2VydmVkLCA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmlwX3ByZWMudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmlwX3ByZWMub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TT1VSQ0VfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuc291cmNlX3BvcnQucmVzZXJ2ZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnNvdXJjZV9wb3J0LnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5zb3VyY2VfcG9ydC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZGVzdF9wb3J0LnJlc2VydmVkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZXN0X3BvcnQudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmRlc3RfcG9ydC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaXBfdmVyLnJlc2VydmVkLCAxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pcF92ZXIudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmlwX3Zlci5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX0ZMT1dfTEFCRUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmlwX2Zsb3dfbGFiZWwucmVzZXJ2ZWQsIDEyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5pcF9mbG93X2xhYmVsLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5pcF9mbG93X2xhYmVsLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuZHN0X2lwdjYudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmRzdF9pcHY2Lm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuc3JjX2lwdjYudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LnNyY19pcHY2Lm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuZHN0X2lwdjZwcmUudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmRzdF9pcHY2cHJlLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuc3JjX2lwdjZwcmUudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LnNyY19pcHY2cHJlLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfTlhUX0hEUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUubnh0X2hkci5yZXNlcnZlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubnh0X2hkci52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUubnh0X2hkci5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZGVmLnZhbCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuZGVmLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQgZmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkX3VucGFjaygmZmllbGQsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX1BSSToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1ZMQU5fSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9FVEhfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfSVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TT1VSQ0VfSVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVE9TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfUFJFQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NPVVJDRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREVTVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX0ZMT1dfTEFCRUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NSQ19JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EU1RfSVBWNlBSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX05YVF9IRFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnByZWNlZGVuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnF1ZXVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wcmlfbWFya2luZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y2xhdXNlc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5jbGF1c2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPmNsYXVzZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jbGF1c2VzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlX3BhY2soJnRoaXMtPmNsYXVzZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA1OworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+Y2xhdXNlc19jb3VudCA+IDApICYmICh0aGlzLT5jbGF1c2VzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXVzZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jbGF1c2VzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y2xhdXNlc1tpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cHJlY2VkZW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnF1ZXVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnByaV9tYXJraW5nKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPmNsYXVzZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+Y2xhdXNlc19jb3VudCA+IDApICYmICh0aGlzLT5jbGF1c2VzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5jbGF1c2VzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmNsYXVzZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+Y2xhdXNlc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZV91bnBhY2soJnRoaXMtPmNsYXVzZXNbaTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgY2xhdXNlc19jb3VudDsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmY2xhdXNlc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlKSAqIGNsYXVzZXNfY291bnQpOworICAgIGZvciAoaTAgPSAwOyBpMCA8IGNsYXVzZXNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3YgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uX3BhY2sodGhpcy0+b3BlcmF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3BlcmF0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9ERUxFVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlbGV0ZS5tdWx0aWNhc3RfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9kZWxldGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnKGJ1ZiwgdGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zW2kwXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0FERDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWRkLm11bHRpY2FzdF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibXVsdGljYXN0X3ZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2FkZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnNbaTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9MSVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5saXN0Lm11bHRpY2FzdF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zW2kyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9ICgyICogdGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0FERDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUuYWRkLm11bHRpY2FzdF92bGFuc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0xJU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT5vcGVyYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGVyYXRpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlbGV0ZS5tdWx0aWNhc3RfdmxhbnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfZGVsZXRlX2NvdW50X211bHRpY2FzdF92bGFucyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9kZWxldGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zID0gKGJjbW9zX3ZsYW5fdGFnICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmRlbGV0ZS5tdWx0aWNhc3RfdmxhbnNfY291bnQgKiBzaXplb2YoYmNtb3Nfdmxhbl90YWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFuc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3ZsYW5fdGFnKGJ1ZiwgJnRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFuc1tpMF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9BREQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5hZGQubXVsdGljYXN0X3ZsYW5zX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2FkZF9jb3VudF9tdWx0aWNhc3RfdmxhbnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWRkLm11bHRpY2FzdF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtdWx0aWNhc3RfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfYWRkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYWRkLm11bHRpY2FzdF92bGFucyA9IChiY21vc192bGFuX3RhZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hZGQubXVsdGljYXN0X3ZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9zX3ZsYW5fdGFnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnNbaTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9MSVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfbGlzdF9jb3VudF9tdWx0aWNhc3RfdmxhbnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5saXN0Lm11bHRpY2FzdF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnMgPSAoYmNtb3Nfdmxhbl90YWcgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnNfY291bnQgKiBzaXplb2YoYmNtb3Nfdmxhbl90YWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zW2kyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbiBvcGVyYXRpb247CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbl91bnBhY2soJm9wZXJhdGlvbiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wZXJhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IG11bHRpY2FzdF92bGFuc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbXVsdGljYXN0X3ZsYW5zX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobXVsdGljYXN0X3ZsYW5zX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb3Nfdmxhbl90YWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0FERDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtdWx0aWNhc3RfdmxhbnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG11bHRpY2FzdF92bGFuc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKG11bHRpY2FzdF92bGFuc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9zX3ZsYW5fdGFnKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0xJU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbXVsdGljYXN0X3ZsYW5zX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3RfdmxhbnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChtdWx0aWNhc3RfdmxhbnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vc192bGFuX3RhZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9kZWxldGVfY291bnRfbXVsdGljYXN0X3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9hZGRfY291bnRfbXVsdGljYXN0X3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9saXN0X2NvdW50X211bHRpY2FzdF92bGFucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT5tdWx0aWNhc3RfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnKGJ1ZiwgdGhpcy0+aXB0dl91c2VyX3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT5tdWx0aWNhc3RfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdmxhbl90YWcoYnVmLCAmdGhpcy0+aXB0dl91c2VyX3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlX3BhY2sodGhpcy0+dGFnX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50YWdfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfRE9fTk9UX1NUUklQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfU1RSSVBfREFUQV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX1NUUklQX0RBVEFfUVVFUllfSVBUVjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc3RyaXBfZGF0YV9xdWVyeV9pcHR2Lm11bHRpY2FzdF92bGFuc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9zdHJpcF9kYXRhX3F1ZXJ5X2lwdHZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV9wYWNrKCZ0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT50YWdfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfRE9fTk9UX1NUUklQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfU1RSSVBfREFUQV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX1NUUklQX0RBVEFfUVVFUllfSVBUVjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDQgKiB0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZV91bnBhY2soJnRoaXMtPnRhZ19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dGFnX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX0RPX05PVF9TVFJJUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX1NUUklQX0RBVEFfUVVFUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9UQUdfTU9ERV9TVFJJUF9EQVRBX1FVRVJZX0lQVFY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc3RyaXBfZGF0YV9xdWVyeV9pcHR2Lm11bHRpY2FzdF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9zdHJpcF9kYXRhX3F1ZXJ5X2lwdHZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuc3RyaXBfZGF0YV9xdWVyeV9pcHR2Lm11bHRpY2FzdF92bGFuc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnlfdW5wYWNrKCZ0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZSB0YWdfbW9kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlX3VucGFjaygmdGFnX21vZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0YWdfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfRE9fTk9UX1NUUklQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfU1RSSVBfREFUQV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX1NUUklQX0RBVEFfUVVFUllfSVBUVjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IG11bHRpY2FzdF92bGFuc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZtdWx0aWNhc3RfdmxhbnNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkpICogbXVsdGljYXN0X3ZsYW5zX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIG11bHRpY2FzdF92bGFuc19jb3VudCAqIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5ncm91cF9tYWNfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51c2VyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmdyb3VwX21hY19hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tdWx0aWNhc3RfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tdWx0aWNhc3RfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2FfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT5pcHNvdXJjZV9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT5pcHNvdXJjZV9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tdWx0aWNhc3RfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+aXBtdWx0aWNhc3RfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51c2VyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXVsdGljYXN0X3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKGJ1ZiwgJnRoaXMtPmlwbXVsdGljYXN0X2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm11bHRpY2FzdF92bGFuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+aXB2Nm11bHRpY2FzdF9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51c2VyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXVsdGljYXN0X3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT5pcHY2bXVsdGljYXN0X2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2FfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY2X2FkZHJlc3MoYnVmLCB0aGlzLT5pcHNvdXJjZV9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT5pcHNvdXJjZV9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfT05MWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdkYV9tYWNfb25seS50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX29ubHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHlfcGFjaygmdGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLnRvdGFsX2VudHJpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfdmxhbl9pZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLmVudHJpZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWRfcGFjaygmdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19JUFY0U0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLnRvdGFsX2VudHJpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjRzYVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhX3BhY2soJnRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjRzYS5lbnRyaWVzW2kyXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFBMVVNfTUNBU1RfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfcGFjaygmdGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBWNlBMVVNfTUNBU1RfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLnRvdGFsX2VudHJpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWRfcGFjaygmdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzW2k0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19JUFY2U0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLnRvdGFsX2VudHJpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjZzYVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhX3BhY2soJnRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjZzYS5lbnRyaWVzW2k1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19PTkxZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMTAgKiB0aGlzLT51LmdkYV9tYWNfb25seS5lbnRyaWVzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDEwICogdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNFNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMTIgKiB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX0lQUExVU19NQ0FTVF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMTAgKiB0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBWNlBMVVNfTUNBU1RfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIwICogdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNlNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMjQgKiB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfT05MWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdkYV9tYWNfb25seS50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdkYV9tYWNfb25seS5lbnRyaWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX29ubHlfY291bnRfZW50cmllcyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllc19jb3VudCA+IDApICYmICh0aGlzLT51LmdkYV9tYWNfb25seS5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19vbmx5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5X3VucGFjaygmdGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQudG90YWxfZW50cmllc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfdmxhbl9pZF9jb3VudF9lbnRyaWVzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX3ZsYW5faWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQuZW50cmllc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLmVudHJpZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWRfdW5wYWNrKCZ0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLmVudHJpZXNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNFNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjRzYS50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjRzYV9jb3VudF9lbnRyaWVzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc19jb3VudCA+IDApICYmICh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c19pcHY0c2FcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjRzYS5lbnRyaWVzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2FfdW5wYWNrKCZ0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFBMVVNfTUNBU1RfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfY291bnRfZW50cmllcyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc19jb3VudCA+IDApICYmICh0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkX3VucGFjaygmdGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc1tpM10sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFY2UExVU19NQ0FTVF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQudG90YWxfZW50cmllc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF9jb3VudF9lbnRyaWVzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWRfdW5wYWNrKCZ0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNbaTRdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNlNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjZzYS50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjZzYV9jb3VudF9lbnRyaWVzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc19jb3VudCA+IDApICYmICh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c19pcHY2c2FcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjZzYS5lbnRyaWVzX2NvdW50OyBpNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2FfdW5wYWNrKCZ0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc1tpNV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGUgdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlX3VucGFjaygmdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX09OTFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGVudHJpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGVudHJpZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVudHJpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChlbnRyaWVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19JUFY0U0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGVudHJpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBQTFVTX01DQVNUX1ZMQU5fSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGVudHJpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFY2UExVU19NQ0FTVF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGVudHJpZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVudHJpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChlbnRyaWVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19JUFY2U0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyNCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGVudHJpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfb25seV9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c192bGFuX2lkX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjRzYV9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDIwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjZzYV9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+d3JyX3dlaWdodCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT53cnJfd2VpZ2h0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV92bGFuX3RhZyhidWYsIHRoaXMtPnZsYW5faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPm1hY19maWx0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdmxhbl90YWcoYnVmLCAmdGhpcy0+dmxhbl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2ZpbHRlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUFBQT19FVEVTVF9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXNfcGFjayh0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LnN0YXR1cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uX3BhY2sodGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC5yZWFzb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QUFBPX0VURVNUX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb25fcGFjayh0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi5zdGFydF9vcl9zdG9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLnVzZXJfbmFtZSwgNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLnBhc3N3b3JkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHBwb19lYXV0aF9tb2RlX3BhY2sodGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ubW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24udmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmVuZC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5lbmQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci52ZW5kb3JfaWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLm9udV9tb2RlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci5vbnVfbWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLmh3dmVyc2lvbiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci5zd3ZlcnNpb24sIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLmV4dF9vbnVfbW9kZWwsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmlybXdhcmVfdmVyc2lvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2Zpcm13YXJlX3ZlcnNpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb24sIHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NISVBTRVRfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmNoaXBzZXRfaWQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY2hpcHNldF9pZC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmNoaXBzZXRfaWQudmVuZG9yX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5jaGlwc2V0X2lkLmNoaXBfbW9kZWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY2hpcHNldF9pZC5yZXZpc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5jaGlwc2V0X2lkLmRlc2lnbl9kYXRlLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXNfcGFjayh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLnNlcnZpY2VzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX2dlcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLmdlYml0bWFwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm51bV9mZXBvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5mZWJpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fcG90c19wb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fZTFwb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fdXBzdHJlYW1fcXVldWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm1heF9xdWV1ZXNfcGVyX3BvcnRfdXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX2Rvd25zdHJlYW1fcXVldWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm1heF9xdWV1ZXNfcGVyX3BvcnRfZG93bikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5iYXR0ZXJ5X2JhY2t1cCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PUFRJQ0FMX1RSQU5TQ0VJVkVSX0RJQUdOT1NJUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3Npcy50cmFuc2NlaXZlcl90ZW1wZXJhdHVyZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMuc3VwcGx5X3ZjYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMudHhfYmlhc19jdXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLnR4X3Bvd2VyX291dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMucnhfcG93ZXJfaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0VSVklDRV9TTEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNlcnZpY2Vfc2xhLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNlcnZpY2Vfc2xhLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX3BhY2soJnRoaXMtPnUuc2VydmljZV9zbGEuc2VydmljZV9zbGEsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZV9wYWNrKHRoaXMtPnUub251X2NhcGFiaWxpdGllczIub251X3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5udW1fbGlua3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlX3BhY2sodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5wcm90ZWN0aW9uX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5udW1fcG9uX2lmcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5udW1fc2xvdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGVyZmFjZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfY2FwYWJpbGl0aWVzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV9wYWNrKCZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuYmF0dGVyeV9iYWNrdXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSE9MRE9WRVJfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ob2xkb3Zlcl9jb25maWcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LmhvbGRvdmVyX2NvbmZpZy5ob2xkb3Zlcl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5ob2xkb3Zlcl9jb25maWcuaG9sZG92ZXJfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NWFVfTUFOQUdFX0dMT0JBTF9QQVJBTUVURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2VfcGFjaygmdGhpcy0+dS5teHVfbWFuYWdlX2dsb2JhbF9wYXJhbWV0ZXIucGFyYW1zLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfU05NUF9QQVJBTUVURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlX3BhY2soJnRoaXMtPnUubXh1X21hbmFnZV9zbm1wX3BhcmFtZXRlci5wYXJhbXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUNUSVZFX1BPTl9JRkFETUlOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYWN0aXZlX3Bvbl9pZmFkbWluLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ucG9uX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczMuaXNfaXB2NmF3YXJlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGVfcGFjayh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLnBvd2VyX2NvbnRyb2xfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLnNlcnZpY2Vfc2xhKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9MSU5LX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfbGlua19zdGF0ZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5ldGhfbGlua19zdGF0ZS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5ldGhfbGlua19zdGF0ZS5saW5rX3N0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5ldGhfcG9ydF9wYXVzZS5lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BPTElDSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfcG9ydF9wb2xpY2luZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5ldGhfcG9ydF9wb2xpY2luZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9wYWNrKCZ0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLmNvbmZpZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudm9pcF9wb3J0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZvaXBfcG9ydC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS52b2lwX3BvcnQucG9ydF9zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FMVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmUxcG9ydC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5lMXBvcnQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuZTFwb3J0LnBvcnRfc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfRE9XTl9SQVRFX0xJTUlUSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy5yYXRlX2xpbWl0aW5nX2VuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy5jaXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy5waXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wb3J0X2xvb3BfZGV0ZWN0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LnBvcnRfbG9vcF9kZXRlY3Quc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52bGFuLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZsYW4ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfcGFjaygmdGhpcy0+dS52bGFuLnZsYW5faW5mbywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NMQVNTSUZJQ0FUSU9OX0FORF9NQVJLSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbl9wYWNrKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfcGFjaygmdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlc1tpMV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm11bHRpY2FzdF92bGFuLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm11bHRpY2FzdF92bGFuLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfcGFjaygmdGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi52bGFuX2luZm8sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVEFHX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X3RhZ19vcGVyYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubXVsdGljYXN0X3RhZ19vcGVyYXRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9wYWNrKCZ0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLnRhZ19vcGVyYXRpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfU1dJVENIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5tdWx0aWNhc3Rfc3dpdGNoLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm11bHRpY2FzdF9zd2l0Y2gud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlX3BhY2sodGhpcy0+dS5tdWx0aWNhc3Rfc3dpdGNoLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfcGFjaygmdGhpcy0+dS5tdWx0aWNhc3RfY29udHJvbC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0dST1VQX01BWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZ3JvdXBfbWF4LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmdyb3VwX21heC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ3JvdXBfbWF4Lm1heF9ncm91cHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2Rlc19jb3VudCA+IDApICYmICh0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZhc3RfbGVhdmVfbW9kZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9mYXN0X2xlYXZlX2FiaWxpdHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2Rlc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzW2kyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9zdGF0ZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX3N0YXRlLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9MTElEX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcubGxpZF9xdWV1ZV90YWJsZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxsaWRfcXVldWVfdGFibGVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9sbGlkX3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWVfcGFjaygmdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlW2kzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9JQURfSU5GT1JNQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi5pYWRfbWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbF9wYWNrKHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLnByb3RvY29sX3N1cHBvcnQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24uaWFkX3NvZnR3YXJlX3ZlciwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLmlhZF9zb2Z0d2FyZV90aW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24udm9pcF91c2VyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfR0xPQkFMX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGVfcGFjayh0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMudm9pY2VfaXBtb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMuaWFkX2lwYWRkcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy5pYWRfbmV0X21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMuaWFkX2RlZmF1bHRfZ3cpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3BhY2sodGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnBwcG9lX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnBwcG9lX3VzZXJuYW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnBwcG9lX3Bhc3N3b3JkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZV9wYWNrKHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy50YWdnaW5nX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy52b2ljZV9jdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy52b2ljZV9zdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnZvaWNlX3ByaSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5tZ3BvcnRfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5tZ2NfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLm1nY19jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuYmFja3VwX21nY19pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuYmFja3VwX21nY19jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLnVzZV9hY3RpdmVfbWdjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlX3BhY2sodGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5yZWdfbW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLm1pZCwgNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGVfcGFjayh0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLmhlYXJ0YmVhdF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLmhlYXJ0YmVhdF9jeWNsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5oZWFydGJlYXRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFVTRVJfVElEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5oMjQ4dXNlcl90aWRfaW5mb3JtYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5oMjQ4dXNlcl90aWRfaW5mb3JtYXRpb24ubmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFJUUF9USURfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLm51bV9ydHBfdGlkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLnByZWZpeCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24uZGlnaXRfYmVnaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGVfcGFjayh0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ucnRwX3RpZF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi5ydHBfdGlkX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UlRQX1RJRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLm51bV9ydHBfdGlkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5oMjQ4cnRwX3RpZF9pbmZvcm1hdGlvbi5maXJzdF9ydHBfdGlkX25hbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5zaXBfcGFyYW1ldGVycy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLm1ncG9ydF9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmJhY2t1cF9zaXBfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmJhY2t1cF9zaXBfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfcHJveHlfc2VydmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5hY3RpdmVfc2lwX3JlZ2lzdHJhdGlvbl9zZXJ2ZXJfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfcmVnaXN0cmF0aW9uX3NlcnZlcl9jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYmFja3VwX3NpcF9yZWdfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmJhY2t1cF9zaXBfcmVnX2NvbV9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5vdXRib3VuZF9zZXJ2ZXJfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLm91dGJvdW5kX3NlcnZlcl9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5zaXBfcmVnaXN0cmF0aW9uX2ludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuZGlzYWJsZV9oZWFydGJlYXRfc3dpdGNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5oZWFydGJlYXRfY3ljbGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmhlYXJ0YmVhdF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfVVNFUl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMuYWNjb3VudCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc2lwX3VzZXJfcGFyYW1ldGVycy5uYW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLnBhc3N3b3JkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVhfTU9ERU1fQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZV9wYWNrKHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24udm9pY2VfdDM4ZW5hYmxlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlX3BhY2sodGhpcy0+dS5mYXhfbW9kZW1fY29uZmlndXJhdGlvbi52b2ljZV9mYXhfbW9kZW1fY29udHJvbCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhJQURfT1BFUkFUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OGlhZF9vcGVyYXRpb25fc3RhdHVzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1c19wYWNrKHRoaXMtPnUuaDI0OGlhZF9vcGVyYXRpb25fc3RhdHVzLmlhZF9vcGVyYXRpb25fc3RhdHVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9UU19TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1c19wYWNrKHRoaXMtPnUucG90c19zdGF0dXMuaWFkX3BvcnRfc3RhdHVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlX3BhY2sodGhpcy0+dS5wb3RzX3N0YXR1cy5pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlX3BhY2sodGhpcy0+dS5wb3RzX3N0YXR1cy5pYWRfcG9ydF9jb2RlY19tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaWFkX29wZXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pYWRfb3BlcmF0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fcGFjayh0aGlzLT51LmlhZF9vcGVyYXRpb24uaWFkX29wZXJhdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9ESUdJVF9NQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNpcF9kaWdpdF9tYXAud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2lwX2RpZ2l0X21hcC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXBfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zaXBfZGlnaXRfbWFwLnNpcF9kaWdpdGFsX21hcCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzaXBfZGlnaXRhbF9tYXBcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zaXBfZGlnaXRfbWFwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXAsIHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXBfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF9wYWNrKHRoaXMtPnUuYWxhcm1fYWRtaW5fc3RhdGUuaWQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLmNvbmZpZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFsYXJtX3RocmVzaG9sZC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfcGFjayh0aGlzLT51LmFsYXJtX3RocmVzaG9sZC5pZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5hbGFybV90aHJlc2hvbGQudGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5hbGFybV90aHJlc2hvbGQuY2xlYXJpbmdfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZFUlNJT05fU0VSVkVSX1BBUkE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEuaXBhZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLmlwbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS5nYXRld2F5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmxhbl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnVzZXJfbmFtZSwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnBhc3N3b3JkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEuYWN0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmVyc2lvbl9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS52ZXIxbmFtZSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS52ZXIybmFtZSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS52ZXIzbmFtZSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X21hY19saW1pdC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfbWFjX2xpbWl0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X21hY19saW1pdC5tYWNfbGltaXRfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUdJTkdfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X21hY19hZ2luZ190aW1lLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS5tYWNfYWdpbmdfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uX3BhY2sodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5udW1iZXJfb2ZfZW50cmllcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIubnVtYmVyX29mX2VudHJpZXMgPiAwKSAmJiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLmNsYXVzZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbGF1c2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcG9ydF9tYWNfZmlsdGVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5udW1iZXJfb2ZfZW50cmllczsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY19wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIuY2xhdXNlW2k0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uX3BhY2sodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLm51bWJlcl9vZl9lbnRyaWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcubnVtYmVyX29mX2VudHJpZXMgPiAwKSAmJiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5jbGF1c2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X3BvcnRfbWFjX2JpbmRpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5udW1iZXJfb2ZfZW50cmllczsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY19wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLmNsYXVzZVtpNV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX1NUQVRJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNjsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl9wYWNrKHRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMubnVtYmVyX29mX2VudHJpZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLm51bWJlcl9vZl9lbnRyaWVzID4gMCkgJiYgKHRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5jbGF1c2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X3BvcnRfbWFjX3N0YXRpY1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk2ID0gMDsgaTYgPCB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMubnVtYmVyX29mX2VudHJpZXM7IGk2KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfcGFjaygmdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLmNsYXVzZVtpNl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BFUkZPUk1BTkNFX1NUQVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbm9jdGV0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbnVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbm51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LmlmaW5kaXNjYXJkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbmVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZvdXRvY3RldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0Lmlmb3V0dWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dG51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0Lmlmb3V0ZGlzY2FyZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0Lmlmb3V0ZXJyb3JzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5yZXNlcnZlZDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LnJlc2VydmVkMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQucmVzZXJ2ZWQzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5yZXNlcnZlZDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfSVNPTEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2lzb2xhdGUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGVfcGFjayh0aGlzLT51Lm9udV9wb3J0X2lzb2xhdGUucG9ydF9pc29sYXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUREUkVTU19UQUJMRV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X21hY19hZGRyZXNzX3RhYmxlX3F1ZXJ5LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9tYWNfYWRkcmVzc190YWJsZV9xdWVyeS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfRE9XTlNUUkVBTV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy5wb25tYWNkc3JhdGVsaW1pdGluZ2VuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLmNpcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLmNicykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19VU0RTQlVGRkVSX0NBUEFCSUxJVFlfUVVFUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlX3BhY2sodGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkuYnVmZmVyX21hbmFnZW1lbnRfY2FwYWJpbGl0eSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkuZHNidWZmZXJfc2l6ZV9taW5pbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkuZHNidWZmZXJfc2l6ZV9tYXhpbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkudXNidWZmZXJfc2l6ZV9taW5pbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkudXNidWZmZXJfc2l6ZV9tYXhpbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLmJ1ZmZlcl9tYW5hZ2VtZW50X2luZGljYXRpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb25fcGFjayh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIuZGlyZWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIuYnVmZmVyX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfU1RBVElTVElDU19DT0xMRUNUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGVfcGFjayh0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLnN0YXRpc3RpY3NfYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLnN0YXRpc3RpY3NfaW50ZXJ2YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLnN0YXRpc3RpY3NfZHVyYXRpb25fdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPVU5URVJfUkVTRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlX3BhY2sodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQuc3RhdGlzdGljc19yZXNldCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0ZMVVhfU1RBVElTVElDU19DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGVfcGFjayh0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLnVuaWZsb3dzdGF0aXN0aWNzY29sbGVjdGNvbnRyb2xpbmRpY2F0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW5vY3RldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW5udWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZmluZGlzY2FyZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW5lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmb3V0b2N0ZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZm91dHVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXRudWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZm91dGRpc2NhcmRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZm91dGVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTElHSFRfRVhDRVBUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ucG9ucG9ydG51bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlX3BhY2sodGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLm1haW5fbGlnaHRfaW5kaWNhdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGVfcGFjayh0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ucmVzZXJ2ZV9saWdodF9pbmRpY2F0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9saWdodF9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9saWdodF9jb250cm9sLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZV9wYWNrKHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wubWF0Y2hfbWFjX2FkZHJlc3MsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC5wb25fbWFjX2FkZHJlc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9saWdodF9jb250cm9sX2FjdGlvbl9tb2RlX3BhY2sodGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wuZHVyYXRpb25fdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX1BPUlRfU1RBVElTVElDU19HRVQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLmZyYW1lc190cmFuc21pdHRlZG9rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLm9jdGV0c190cmFuc21pdHRlZG9rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLm11bHRpY2FzdF9mcmFtZXN4bWl0dGVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLmJyb2FkY2FzdF9mcmFtZXN4bWl0dGVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLmZyYW1lc19yZWNlaXZlZF9vaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5vY3RldHNfcmVjZWl2ZWRfb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEubXVsdGljYXN0X2ZyYW1lc19yZWNlaXZlZF9vaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5icm9hZGNhc3RfZnJhbWVzX3JlY2VpdmVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fUE9SVF9TVEFUSVNUSUNTX0dFVDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIuY3JjOGVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5mZWNfY29ycmVjdGVkX2Jsb2NrcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5mZWNfdW5jb3JyZWN0YWJsZV9ibG9ja3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF9tYWNfY3RybF9mcmFtZXNfdHJhbnNtaXR0ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF9tYWNfY3RybF9mcmFtZXNfcmVjZWl2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF90eF9yZWdpc3RlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5tcGNwX3R4X3JlZ3JlcXVlc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF90eF9yZXBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF9yeF9nYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfcnhfcmVnaXN0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFsYXJtX2NvbmZpZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hbGFybV9jb25maWcud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZV9wYWNrKHRoaXMtPnUuYWxhcm1fY29uZmlnLmFsYXJtX2NvbmZpZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1JPVUdVRV9PTlVfRVhDTF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5yb3VndWVfb251X2V4Y2xfYWJpbGl0eS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5yb3VndWVfb251X2V4Y2xfYWJpbGl0eS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHlfcGFjayh0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LmFiaWxpdHksIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9XRVJfU0FWSU5HX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfcGFjayh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLnNsZWVwX21vZGVfY2FwYWJpbGl0eSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2Vhcmx5X3dha2VfY2FwYWJpbGl0eV9wYWNrKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMuZWFybHlfd2FrZV91cF9jYXBhYmlsaXR5LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPV0VSX1NBVklOR19DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZV9wYWNrKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcuZWFybHlfd2FrZV91cCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLnNsZWVwX2R1cmF0aW9uX21heCwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUFJPVEVDVElPTl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcHJvdGVjdGlvbl9wYXJhbWV0ZXJzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfcHJvdGVjdGlvbl9wYXJhbWV0ZXJzLm9wdGljYWxfbG9zX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMubWFjX2xvc190aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPUlRfRElTQUJMRV9PTl9MT09QX0RFVEVDVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZV9wYWNrKHRoaXMtPnUucG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NQUNfQUdJTkdfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubWFjX2FnaW5nX3RpbWUud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubWFjX2FnaW5nX3RpbWUud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5tYWNfYWdpbmdfdGltZS5hZ2luZ190aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1c19wYWNrKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMubW9uaXRvcmluZ19zdGF0dXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMubW9uaXRvcmluZ19wZXJpb2QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19DVVJSRU5UX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkOSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QRVJGT1JNQU5DRV9NT05JVE9SSU5HX0hJU1RPUllfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDExKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDE0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9UWF9QT1dFUl9TVVBQTFlfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X3R4X3Bvd2VyX3N1cHBseV9jb250cm9sLmFjdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5vbnVfdHhfcG93ZXJfc3VwcGx5X2NvbnRyb2wub251X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5vbnVfdHhfcG93ZXJfc3VwcGx5X2NvbnRyb2wub3B0X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRlZi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5kZWYudW5rbm93biwgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BQUE9fRVRFU1RfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QUFBPX0VURVNUX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LmVuZC51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24uZmlybXdhcmVfdmVyc2lvbl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NISVBTRVRfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT1BUSUNBTF9UUkFOU0NFSVZFUl9ESUFHTk9TSVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TRVJWSUNFX1NMQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXJ2aWNlX3NsYS5zZXJ2aWNlX3NsYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMSArICg2ICogdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0hPTERPVkVSX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVhVX01BTkFHRV9HTE9CQUxfUEFSQU1FVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5teHVfbWFuYWdlX2dsb2JhbF9wYXJhbWV0ZXIucGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfU05NUF9QQVJBTUVURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5teHVfbWFuYWdlX3NubXBfcGFyYW1ldGVyLnBhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BQ1RJVkVfUE9OX0lGQURNSU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfTElOS19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfUEFVU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BPTElDSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLmNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WT0lQX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0UxUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfRE9XTl9SQVRFX0xJTUlUSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QT1JUX0xPT1BfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnZsYW4udmxhbl9pbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NMQVNTSUZJQ0FUSU9OX0FORF9NQVJLSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm11bHRpY2FzdF92bGFuLnZsYW5faW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVEFHX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLnRhZ19vcGVyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1NXSVRDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfR1JPVVBfTUFYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVNUX0xFQVZFX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNSArICg0ICogdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2Rlc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVNUX0xFQVZFX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9MTElEX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDQgKiB0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDczOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVk9JUF9HTE9CQUxfUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhQQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFVTRVJfVElEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFJUUF9USURfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhSVFBfVElEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0lQX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfVVNFUl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDY1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFYX01PREVNX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhJQURfT1BFUkFUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9UU19TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9JQURfT1BFUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfRElHSVRfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZFUlNJT05fU0VSVkVSX1BBUkE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0FHSU5HX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMyArICg4ICogdGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm51bWJlcl9vZl9lbnRyaWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyAoOCAqIHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcubnVtYmVyX29mX2VudHJpZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX1NUQVRJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgKDggKiB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMubnVtYmVyX29mX2VudHJpZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BFUkZPUk1BTkNFX1NUQVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfSVNPTEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19BRERSRVNTX1RBQkxFX1FVRVJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19ET1dOU1RSRUFNX1NIQVBJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVJfQ0FQQUJJTElUWV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX1NUQVRJU1RJQ1NfQ09MTEVDVF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPVU5URVJfUkVTRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0ZMVVhfU1RBVElTVElDU19DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDgyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX1BPUlRfU1RBVElTVElDU19HRVQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDY1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUk9VR1VFX09OVV9FWENMX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1dFUl9TQVZJTkdfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9XRVJfU0FWSU5HX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BST1RFQ1RJT05fUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9ESVNBQkxFX09OX0xPT1BfREVURUNURUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01BQ19BR0lOR19USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QRVJGT1JNQU5DRV9NT05JVE9SSU5HX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19DVVJSRU5UX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTI5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19ISVNUT1JZX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTI5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1RYX1BPV0VSX1NVUFBMWV9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUFBQT19FVEVTVF9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucHBwb19ldGVzdF9yZXN1bHQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucHBwb19ldGVzdF9yZXN1bHQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzX3VucGFjaygmdGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC5zdGF0dXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC5yZWFzb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUFBQT19FVEVTVF9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uX3VucGFjaygmdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24uc3RhcnRfb3Jfc3RvcCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi51c2VyX25hbWUsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ucGFzc3dvcmQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGVfdW5wYWNrKCZ0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi5tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24udmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmVuZC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZW5kLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZW5kLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5lbmQud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2VuZF9jb3VudF91bmtub3duKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmVuZC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZW5kLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIudmVuZG9yX2lkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLm9udV9tb2RlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLm9udV9tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLmh3dmVyc2lvbiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIuc3d2ZXJzaW9uLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIuZXh0X29udV9tb2RlbCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfdmVyc2lvbl9jb3VudF9maXJtd2FyZV92ZXJzaW9uKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmlybXdhcmVfdmVyc2lvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2Zpcm13YXJlX3ZlcnNpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uLCB0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24uZmlybXdhcmVfdmVyc2lvbl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9DSElQU0VUX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmNoaXBzZXRfaWQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmNoaXBzZXRfaWQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5jaGlwc2V0X2lkLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5jaGlwc2V0X2lkLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2hpcHNldF9pZC52ZW5kb3JfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2hpcHNldF9pZC5jaGlwX21vZGVsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2hpcHNldF9pZC5yZXZpc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuY2hpcHNldF9pZC5kZXNpZ25fZGF0ZSwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5jaGlwc2V0X2lkLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5jaGlwc2V0X2lkLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X2NhcGFiaWxpdGllczEud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlc191bnBhY2soJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEuc2VydmljZXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX2dlcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEuZ2ViaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fZmVwb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5mZWJpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm51bV9wb3RzX3BvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX2UxcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fdXBzdHJlYW1fcXVldWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEubWF4X3F1ZXVlc19wZXJfcG9ydF91cCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm51bV9kb3duc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm1heF9xdWV1ZXNfcGVyX3BvcnRfZG93bikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLmJhdHRlcnlfYmFja3VwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT1BUSUNBTF9UUkFOU0NFSVZFUl9ESUFHTk9TSVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMudHJhbnNjZWl2ZXJfdGVtcGVyYXR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMuc3VwcGx5X3ZjYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3Npcy50eF9iaWFzX2N1cikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3Npcy50eF9wb3dlcl9vdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMucnhfcG93ZXJfaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TRVJWSUNFX1NMQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXJ2aWNlX3NsYS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuc2VydmljZV9zbGEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5zZXJ2aWNlX3NsYS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2VydmljZV9zbGEud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX3VucGFjaygmdGhpcy0+dS5zZXJ2aWNlX3NsYS5zZXJ2aWNlX3NsYSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5zZXJ2aWNlX3NsYS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2VydmljZV9zbGEud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZV91bnBhY2soJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIub251X3R5cGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIubnVtX2xpbmtzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZV91bnBhY2soJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIucHJvdGVjdGlvbl90eXBlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLm51bV9wb25faWZzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIubnVtX3Nsb3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW50ZXJmYWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29udV9jYXBhYmlsaXRpZXMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlcyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3VucGFjaygmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzW2kwXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmJhdHRlcnlfYmFja3VwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSE9MRE9WRVJfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmhvbGRvdmVyX2NvbmZpZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ob2xkb3Zlcl9jb25maWcud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfdW5wYWNrKCZ0aGlzLT51LmhvbGRvdmVyX2NvbmZpZy5ob2xkb3Zlcl9zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLmhvbGRvdmVyX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ob2xkb3Zlcl9jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfR0xPQkFMX1BBUkFNRVRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV91bnBhY2soJnRoaXMtPnUubXh1X21hbmFnZV9nbG9iYWxfcGFyYW1ldGVyLnBhcmFtcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfU05NUF9QQVJBTUVURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlX3VucGFjaygmdGhpcy0+dS5teHVfbWFuYWdlX3NubXBfcGFyYW1ldGVyLnBhcmFtcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FDVElWRV9QT05fSUZBRE1JTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFjdGl2ZV9wb25faWZhZG1pbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmFjdGl2ZV9wb25faWZhZG1pbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYWN0aXZlX3Bvbl9pZmFkbWluLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ucG9uX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFjdGl2ZV9wb25faWZhZG1pbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLmlzX2lwdjZhd2FyZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlX3VucGFjaygmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMy5wb3dlcl9jb250cm9sX3R5cGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczMuc2VydmljZV9zbGEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfTElOS19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5ldGhfbGlua19zdGF0ZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZXRoX2xpbmtfc3RhdGUud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5ldGhfbGlua19zdGF0ZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZXRoX2xpbmtfc3RhdGUud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoX2xpbmtfc3RhdGUubGlua19zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5ldGhfbGlua19zdGF0ZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZXRoX2xpbmtfc3RhdGUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmV0aF9wb3J0X3BhdXNlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmV0aF9wb3J0X3BhdXNlLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhfcG9ydF9wYXVzZS5lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmV0aF9wb3J0X3BhdXNlLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfUE9MSUNJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZXRoX3BvcnRfcG9saWNpbmcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZXRoX3BvcnRfcG9saWNpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV91bnBhY2soJnRoaXMtPnUuZXRoX3BvcnRfcG9saWNpbmcuY29uZmlnLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ldGhfcG9ydF9wb2xpY2luZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVk9JUF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnZvaXBfcG9ydC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudm9pcF9wb3J0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUudm9pcF9wb3J0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS52b2lwX3BvcnQud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudm9pcF9wb3J0LnBvcnRfc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUudm9pcF9wb3J0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS52b2lwX3BvcnQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0UxUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5lMXBvcnQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmUxcG9ydC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmUxcG9ydC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZTFwb3J0LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmUxcG9ydC5wb3J0X3N0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmUxcG9ydC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZTFwb3J0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfUE9SVF9ET1dOX1JBVEVfTElNSVRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcucmF0ZV9saW1pdGluZ19lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy5jaXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nLnBpcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5wb3J0X2xvb3BfZGV0ZWN0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wb3J0X2xvb3BfZGV0ZWN0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV91bnBhY2soJnRoaXMtPnUucG9ydF9sb29wX2RldGVjdC5zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS52bGFuLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52bGFuLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUudmxhbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudmxhbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnZsYW4udmxhbl9pbmZvLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnZsYW4ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnZsYW4ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NMQVNTSUZJQ0FUSU9OX0FORF9NQVJLSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLm9wLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlcyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfdW5wYWNrKCZ0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzW2kxXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X3ZsYW4ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X3ZsYW4ud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfdW5wYWNrKCZ0aGlzLT51Lm11bHRpY2FzdF92bGFuLnZsYW5faW5mbywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X3ZsYW4ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9UQUdfT1BFUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5tdWx0aWNhc3RfdGFnX29wZXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5tdWx0aWNhc3RfdGFnX29wZXJhdGlvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV91bnBhY2soJnRoaXMtPnUubXVsdGljYXN0X3RhZ19vcGVyYXRpb24udGFnX29wZXJhdGlvbiwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tdWx0aWNhc3RfdGFnX29wZXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X3RhZ19vcGVyYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9TV0lUQ0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubXVsdGljYXN0X3N3aXRjaC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X3N3aXRjaC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm11bHRpY2FzdF9zd2l0Y2gud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm11bHRpY2FzdF9zd2l0Y2gud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZV91bnBhY2soJnRoaXMtPnUubXVsdGljYXN0X3N3aXRjaC5tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tdWx0aWNhc3Rfc3dpdGNoLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5tdWx0aWNhc3Rfc3dpdGNoLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5tdWx0aWNhc3RfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5tdWx0aWNhc3RfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3VucGFjaygmdGhpcy0+dS5tdWx0aWNhc3RfY29udHJvbC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tdWx0aWNhc3RfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0dST1VQX01BWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5ncm91cF9tYXgud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lmdyb3VwX21heC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lmdyb3VwX21heC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZ3JvdXBfbWF4LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ncm91cF9tYXgubWF4X2dyb3VwcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5ncm91cF9tYXgud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lmdyb3VwX21heC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2Rlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmYXN0X2xlYXZlX21vZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmFzdF9sZWF2ZV9hYmlsaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXMgPSAodWludDMyX3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXNfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzW2kyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZBU1RfTEVBVkVfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9zdGF0ZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9zdGF0ZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfdW5wYWNrKCZ0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0xMSURfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcubGxpZF9xdWV1ZV90YWJsZV9jb3VudCA+IDApICYmICh0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsbGlkX3F1ZXVlX3RhYmxlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbGxpZF9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcubGxpZF9xdWV1ZV90YWJsZV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWVfdW5wYWNrKCZ0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVbaTNdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0lBRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24uaWFkX21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2xfdW5wYWNrKCZ0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi5wcm90b2NvbF9zdXBwb3J0LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLmlhZF9zb2Z0d2FyZV92ZXIsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24uaWFkX3NvZnR3YXJlX3RpbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLnZvaXBfdXNlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5pYWRfaW5mb3JtYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVk9JUF9HTE9CQUxfUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlX3VucGFjaygmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnZvaWNlX2lwbW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy5pYWRfaXBhZGRyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMuaWFkX25ldF9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMuaWFkX2RlZmF1bHRfZ3cpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3VucGFjaygmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnBwcG9lX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnBwcG9lX3VzZXJuYW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy5wcHBvZV9wYXNzd29yZCwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGVfdW5wYWNrKCZ0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMudGFnZ2luZ19tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnZvaWNlX2N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMudm9pY2Vfc3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnZvaWNlX3ByaSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5oMjQ4cGFyYW1ldGVycy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5tZ3BvcnRfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLm1nY19pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5tZ2NfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuYmFja3VwX21nY19pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5iYWNrdXBfbWdjX2NvbV9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy51c2VfYWN0aXZlX21nYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZV91bnBhY2soJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMucmVnX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5taWQsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlX3VucGFjaygmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5oZWFydGJlYXRfbW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuaGVhcnRiZWF0X2N5Y2xlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuaGVhcnRiZWF0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFVTRVJfVElEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmgyNDh1c2VyX3RpZF9pbmZvcm1hdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5oMjQ4dXNlcl90aWRfaW5mb3JtYXRpb24ud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLm5hbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmgyNDh1c2VyX3RpZF9pbmZvcm1hdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UlRQX1RJRF9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLm51bV9ydHBfdGlkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi5wcmVmaXgsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24uZGlnaXRfYmVnaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGVfdW5wYWNrKCZ0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ucnRwX3RpZF9tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ucnRwX3RpZF9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFJUUF9USURfSU5GT1JNQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cnRwX3RpZF9pbmZvcm1hdGlvbi5udW1fcnRwX3RpZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLmZpcnN0X3J0cF90aWRfbmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5zaXBfcGFyYW1ldGVycy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5tZ3BvcnRfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYWN0aXZlX3NpcF9jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5iYWNrdXBfc2lwX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmJhY2t1cF9zaXBfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYWN0aXZlX3NpcF9wcm94eV9zZXJ2ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYWN0aXZlX3NpcF9yZWdpc3RyYXRpb25fc2VydmVyX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfcmVnaXN0cmF0aW9uX3NlcnZlcl9jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5iYWNrdXBfc2lwX3JlZ19pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5iYWNrdXBfc2lwX3JlZ19jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5vdXRib3VuZF9zZXJ2ZXJfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMub3V0Ym91bmRfc2VydmVyX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuc2lwX3JlZ2lzdHJhdGlvbl9pbnRlcnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuZGlzYWJsZV9oZWFydGJlYXRfc3dpdGNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmhlYXJ0YmVhdF9jeWNsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5oZWFydGJlYXRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfVVNFUl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMuYWNjb3VudCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMubmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMucGFzc3dvcmQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZBWF9NT0RFTV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmZheF9tb2RlbV9jb25maWd1cmF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5mYXhfbW9kZW1fY29uZmlndXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmZheF9tb2RlbV9jb25maWd1cmF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5mYXhfbW9kZW1fY29uZmlndXJhdGlvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZV91bnBhY2soJnRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24udm9pY2VfdDM4ZW5hYmxlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGVfdW5wYWNrKCZ0aGlzLT51LmZheF9tb2RlbV9jb25maWd1cmF0aW9uLnZvaWNlX2ZheF9tb2RlbV9jb250cm9sLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5mYXhfbW9kZW1fY29uZmlndXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhJQURfT1BFUkFUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5oMjQ4aWFkX29wZXJhdGlvbl9zdGF0dXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaDI0OGlhZF9vcGVyYXRpb25fc3RhdHVzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1c191bnBhY2soJnRoaXMtPnUuaDI0OGlhZF9vcGVyYXRpb25fc3RhdHVzLmlhZF9vcGVyYXRpb25fc3RhdHVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5oMjQ4aWFkX29wZXJhdGlvbl9zdGF0dXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9UU19TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucG90c19zdGF0dXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucG90c19zdGF0dXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT51LnBvdHNfc3RhdHVzLmlhZF9wb3J0X3N0YXR1cywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlX3VucGFjaygmdGhpcy0+dS5wb3RzX3N0YXR1cy5pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGVfdW5wYWNrKCZ0aGlzLT51LnBvdHNfc3RhdHVzLmlhZF9wb3J0X2NvZGVjX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wb3RzX3N0YXR1cy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pYWRfb3BlcmF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5pYWRfb3BlcmF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuaWFkX29wZXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaWFkX29wZXJhdGlvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl91bnBhY2soJnRoaXMtPnUuaWFkX29wZXJhdGlvbi5pYWRfb3BlcmF0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5pYWRfb3BlcmF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5pYWRfb3BlcmF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfRElHSVRfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNpcF9kaWdpdF9tYXAud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNpcF9kaWdpdF9tYXAud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5zaXBfZGlnaXRfbWFwLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5zaXBfZGlnaXRfbWFwLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXBfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zaXBfZGlnaXRfbWFwLnNpcF9kaWdpdGFsX21hcF9jb3VudCA+IDApICYmICh0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2lwX2RpZ2l0YWxfbWFwXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2lwX2RpZ2l0X21hcFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXBfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXAsIHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXBfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuc2lwX2RpZ2l0X21hcC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2lwX2RpZ2l0X21hcC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYWxhcm1fYWRtaW5fc3RhdGUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuYWxhcm1fYWRtaW5fc3RhdGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfdW5wYWNrKCZ0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLmlkLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfdW5wYWNrKCZ0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLmNvbmZpZywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuYWxhcm1fYWRtaW5fc3RhdGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hbGFybV90aHJlc2hvbGQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5hbGFybV90aHJlc2hvbGQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFsYXJtX3RocmVzaG9sZC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkX3VucGFjaygmdGhpcy0+dS5hbGFybV90aHJlc2hvbGQuaWQsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFsYXJtX3RocmVzaG9sZC50aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLmNsZWFyaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5hbGFybV90aHJlc2hvbGQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFsYXJtX3RocmVzaG9sZC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkVSU0lPTl9TRVJWRVJfUEFSQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEuaXBhZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEuaXBtYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEuZ2F0ZXdheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdmxhbl90YWcoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmxhbl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS51c2VyX25hbWUsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEucGFzc3dvcmQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLmFjdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmVyc2lvbl9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmVyMW5hbWUsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnZlcjJuYW1lLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS52ZXIzbmFtZSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfbWFjX2xpbWl0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfbWFjX2xpbWl0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X21hY19saW1pdC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X21hY19saW1pdC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9tYWNfbGltaXQubWFjX2xpbWl0X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfbWFjX2xpbWl0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbWFjX2xpbWl0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0FHSU5HX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X21hY19hZ2luZ190aW1lLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfbWFjX2FnaW5nX3RpbWUud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfbWFjX2FnaW5nX3RpbWUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS5tYWNfYWdpbmdfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfbWFjX2FnaW5nX3RpbWUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm9wLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIubnVtYmVyX29mX2VudHJpZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm51bWJlcl9vZl9lbnRyaWVzID4gMCkgJiYgKHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5jbGF1c2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbGF1c2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcG9ydF9tYWNfZmlsdGVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5jbGF1c2UgPSAoYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm51bWJlcl9vZl9lbnRyaWVzICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5udW1iZXJfb2ZfZW50cmllczsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY191bnBhY2soJnRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5jbGF1c2VbaTRdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl91bnBhY2soJnRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcub3AsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcubnVtYmVyX29mX2VudHJpZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5udW1iZXJfb2ZfZW50cmllcyA+IDApICYmICh0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLmNsYXVzZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXVzZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29udV9wb3J0X21hY19iaW5kaW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcuY2xhdXNlID0gKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcubnVtYmVyX29mX2VudHJpZXMgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5udW1iZXJfb2ZfZW50cmllczsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY191bnBhY2soJnRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcuY2xhdXNlW2k1XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfU1RBVElDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMub3AsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5udW1iZXJfb2ZfZW50cmllcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMubnVtYmVyX29mX2VudHJpZXMgPiAwKSAmJiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLmNsYXVzZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXVzZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29udV9wb3J0X21hY19zdGF0aWNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLmNsYXVzZSA9IChiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMubnVtYmVyX29mX2VudHJpZXMgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLm51bWJlcl9vZl9lbnRyaWVzOyBpNisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjX3VucGFjaygmdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLmNsYXVzZVtpNl0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QRVJGT1JNQU5DRV9TVEFUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LmlmaW5vY3RldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbnVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZmlubnVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZmluZGlzY2FyZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbmVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dG9jdGV0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dHVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dG51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZvdXRkaXNjYXJkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dGVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5yZXNlcnZlZDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQucmVzZXJ2ZWQyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LnJlc2VydmVkMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5yZXNlcnZlZDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9JU09MQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3BvcnRfaXNvbGF0ZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZV91bnBhY2soJnRoaXMtPnUub251X3BvcnRfaXNvbGF0ZS5wb3J0X2lzb2xhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19BRERSRVNTX1RBQkxFX1FVRVJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9tYWNfYWRkcmVzc190YWJsZV9xdWVyeS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X21hY19hZGRyZXNzX3RhYmxlX3F1ZXJ5LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X21hY19hZGRyZXNzX3RhYmxlX3F1ZXJ5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbWFjX2FkZHJlc3NfdGFibGVfcXVlcnkud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfbWFjX2FkZHJlc3NfdGFibGVfcXVlcnkud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9tYWNfYWRkcmVzc190YWJsZV9xdWVyeS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfRE9XTlNUUkVBTV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmcud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLnBvbm1hY2RzcmF0ZWxpbWl0aW5nZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy5jaXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLmNicykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfVVNEU0JVRkZFUl9DQVBBQklMSVRZX1FVRVJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZV91bnBhY2soJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LmJ1ZmZlcl9tYW5hZ2VtZW50X2NhcGFiaWxpdHksICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS5kc2J1ZmZlcl9zaXplX21pbmltdW1fdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LmRzYnVmZmVyX3NpemVfbWF4aW11bV92YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkudXNidWZmZXJfc2l6ZV9taW5pbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS51c2J1ZmZlcl9zaXplX21heGltdW1fdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci5idWZmZXJfbWFuYWdlbWVudF9pbmRpY2F0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLmRpcmVjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci5idWZmZXJfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPTExFQ1RfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2wud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLnN0YXRpc3RpY3NfYWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC5zdGF0aXN0aWNzX2ludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLnN0YXRpc3RpY3NfZHVyYXRpb25fdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX1NUQVRJU1RJQ1NfQ09VTlRFUl9SRVNFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb3VudGVyX3Jlc2V0LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldC5zdGF0aXN0aWNzX3Jlc2V0LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfRkxVWF9TVEFUSVNUSUNTX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLnVuaWZsb3dzdGF0aXN0aWNzY29sbGVjdGNvbnRyb2xpbmRpY2F0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZmlub2N0ZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZpbm51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZpbmRpc2NhcmRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW5lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXRvY3RldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXR1Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXRudWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmb3V0ZGlzY2FyZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXRlcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTElHSFRfRVhDRVBUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLnBvbnBvcnRudW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZV91bnBhY2soJnRoaXMtPnUub251X2xpZ2h0X2V4Y2VwdGlvbi5tYWluX2xpZ2h0X2luZGljYXRpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ucmVzZXJ2ZV9saWdodF9pbmRpY2F0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTElHSFRfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZV91bnBhY2soJnRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wubWF0Y2hfbWFjX2FkZHJlc3MsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wucG9uX21hY19hZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfbGlnaHRfY29udHJvbF9hY3Rpb25fbW9kZV91bnBhY2soJnRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wuYWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC5kdXJhdGlvbl90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9saWdodF9jb250cm9sLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEuZnJhbWVzX3RyYW5zbWl0dGVkb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5vY3RldHNfdHJhbnNtaXR0ZWRvaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLm11bHRpY2FzdF9mcmFtZXN4bWl0dGVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEuYnJvYWRjYXN0X2ZyYW1lc3htaXR0ZWRfb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5mcmFtZXNfcmVjZWl2ZWRfb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5vY3RldHNfcmVjZWl2ZWRfb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5tdWx0aWNhc3RfZnJhbWVzX3JlY2VpdmVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEuYnJvYWRjYXN0X2ZyYW1lc19yZWNlaXZlZF9vaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX1BPUlRfU1RBVElTVElDU19HRVQyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5jcmM4ZXJyb3JzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIuZmVjX2NvcnJlY3RlZF9ibG9ja3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5mZWNfdW5jb3JyZWN0YWJsZV9ibG9ja3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5tcGNwX21hY19jdHJsX2ZyYW1lc190cmFuc21pdHRlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfbWFjX2N0cmxfZnJhbWVzX3JlY2VpdmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF90eF9yZWdpc3RlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfdHhfcmVncmVxdWVzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfdHhfcmVwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF9yeF9nYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF9yeF9yZWdpc3RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hbGFybV9jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFsYXJtX2NvbmZpZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmFsYXJtX2NvbmZpZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYWxhcm1fY29uZmlnLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlX3VucGFjaygmdGhpcy0+dS5hbGFybV9jb25maWcuYWxhcm1fY29uZmlnLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5hbGFybV9jb25maWcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFsYXJtX2NvbmZpZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUk9VR1VFX09OVV9FWENMX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucm91Z3VlX29udV9leGNsX2FiaWxpdHkud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucm91Z3VlX29udV9leGNsX2FiaWxpdHkud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHlfdW5wYWNrKCZ0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LmFiaWxpdHksICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5yb3VndWVfb251X2V4Y2xfYWJpbGl0eS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPV0VSX1NBVklOR19DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZV91bnBhY2soJnRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMuc2xlZXBfbW9kZV9jYXBhYmlsaXR5LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHlfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLmVhcmx5X3dha2VfdXBfY2FwYWJpbGl0eSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9XRVJfU0FWSU5HX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NvbmZpZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NvbmZpZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZV91bnBhY2soJnRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcuZWFybHlfd2FrZV91cCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLnNsZWVwX2R1cmF0aW9uX21heCwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NvbmZpZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QUk9URUNUSU9OX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcHJvdGVjdGlvbl9wYXJhbWV0ZXJzLm9wdGljYWxfbG9zX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy5tYWNfbG9zX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9ESVNBQkxFX09OX0xPT1BfREVURUNURUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZV91bnBhY2soJnRoaXMtPnUucG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTUFDX0FHSU5HX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubWFjX2FnaW5nX3RpbWUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm1hY19hZ2luZ190aW1lLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUubWFjX2FnaW5nX3RpbWUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm1hY19hZ2luZ190aW1lLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWFjX2FnaW5nX3RpbWUuYWdpbmdfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tYWNfYWdpbmdfdGltZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubWFjX2FnaW5nX3RpbWUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3Jpbmdfc3RhdHVzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3Jpbmdfc3RhdHVzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXNfdW5wYWNrKCZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3Jpbmdfc3RhdHVzLm1vbml0b3Jpbmdfc3RhdHVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy5tb25pdG9yaW5nX3BlcmlvZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfQ1VSUkVOVF9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDEyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QRVJGT1JNQU5DRV9NT05JVE9SSU5HX0hJU1RPUllfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkOSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMTEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMTQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1RYX1BPV0VSX1NVUFBMWV9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGggPSAwOworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ3aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB3aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV90eF9wb3dlcl9zdXBwbHlfY29udHJvbC5hY3Rpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfdHhfcG93ZXJfc3VwcGx5X2NvbnRyb2wub251X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV90eF9wb3dlcl9zdXBwbHlfY29udHJvbC5vcHRfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1Ziwgd2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmRlZi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2RlZl9jb3VudF91bmtub3duKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUgbGVhZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BQUE9fRVRFU1RfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QUFBPX0VURVNUX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZmlybXdhcmVfdmVyc2lvbl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpcm13YXJlX3ZlcnNpb25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChmaXJtd2FyZV92ZXJzaW9uX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQ0hJUFNFVF9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09QVElDQUxfVFJBTlNDRUlWRVJfRElBR05PU0lTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TRVJWSUNFX1NMQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGludGVyZmFjZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmaW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UpICogaW50ZXJmYWNlc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIGludGVyZmFjZXNfY291bnQgKiA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IT0xET1ZFUl9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfR0xPQkFMX1BBUkFNRVRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NWFVfTUFOQUdFX1NOTVBfUEFSQU1FVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BQ1RJVkVfUE9OX0lGQURNSU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfTElOS19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfUE9SVF9QQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfUE9SVF9QT0xJQ0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FMVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfRE9XTl9SQVRFX0xJTUlUSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQ0xBU1NJRklDQVRJT05fQU5EX01BUktJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnVsZXNfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnJ1bGVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZSkgKiBydWxlc19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgcnVsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVEFHX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1NXSVRDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0dST1VQX01BWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVNUX0xFQVZFX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZhc3RfbGVhdmVfbW9kZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZmYXN0X2xlYXZlX21vZGVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQzMl90KSAqIGZhc3RfbGVhdmVfbW9kZXNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBmYXN0X2xlYXZlX21vZGVzX2NvdW50ICogNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVNUX0xFQVZFX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0xMSURfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxsaWRfcXVldWVfdGFibGVfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmxsaWRfcXVldWVfdGFibGVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZSkgKiBsbGlkX3F1ZXVlX3RhYmxlX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgbGxpZF9xdWV1ZV90YWJsZV9jb3VudCAqIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfR0xPQkFMX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFBBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4VVNFUl9USURfSU5GT1JNQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhSVFBfVElEX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UlRQX1RJRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9VU0VSX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVhfTU9ERU1fQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OElBRF9PUEVSQVRJT05fU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPVFNfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfRElHSVRfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBzaXBfZGlnaXRhbF9tYXBfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZzaXBfZGlnaXRhbF9tYXBfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBzaXBfZGlnaXRhbF9tYXBfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBzaXBfZGlnaXRhbF9tYXBfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WRVJTSU9OX1NFUlZFUl9QQVJBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUdJTkdfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50OF90IG51bWJlcl9vZl9lbnRyaWVzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbnVtYmVyX29mX2VudHJpZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYykgKiBudW1iZXJfb2ZfZW50cmllcyk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIG51bWJlcl9vZl9lbnRyaWVzICogOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfZW50cmllczsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm51bWJlcl9vZl9lbnRyaWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMpICogbnVtYmVyX29mX2VudHJpZXMpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBudW1iZXJfb2ZfZW50cmllcyAqIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX1NUQVRJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfZW50cmllczsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm51bWJlcl9vZl9lbnRyaWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMpICogbnVtYmVyX29mX2VudHJpZXMpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBudW1iZXJfb2ZfZW50cmllcyAqIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BFUkZPUk1BTkNFX1NUQVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0lTT0xBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUREUkVTU19UQUJMRV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX0RPV05TVFJFQU1fU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVJfQ0FQQUJJTElUWV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfVVNEU0JVRkZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX1NUQVRJU1RJQ1NfQ09MTEVDVF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfU1RBVElTVElDU19DT1VOVEVSX1JFU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0ZMVVhfU1RBVElTVElDU19DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTElHSFRfRVhDRVBUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUk9VR1VFX09OVV9FWENMX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPV0VSX1NBVklOR19DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1dFUl9TQVZJTkdfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUFJPVEVDVElPTl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QT1JUX0RJU0FCTEVfT05fTE9PUF9ERVRFQ1RFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NQUNfQUdJTkdfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QRVJGT1JNQU5DRV9NT05JVE9SSU5HX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19DVVJSRU5UX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19ISVNUT1JZX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1RYX1BPV0VSX1NVUFBMWV9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9maXJtd2FyZV92ZXJzaW9uX2NvdW50X2Zpcm13YXJlX3ZlcnNpb24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlX3BhY2sodGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZJTEVfQ0hFQ0tfT1BDT0RFX0VORF9ET1dOTE9BRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmVuZF9kb3dubG9hZF9yZXF1ZXN0LmZpbGVfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19GSUxFX0NIRUNLX09QQ09ERV9FTkRfRE9XTkxPQURfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlX3BhY2sodGhpcy0+dS5lbmRfZG93bmxvYWRfcmVzcG9uc2UucnBzX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19GSUxFX0NIRUNLX09QQ09ERV9FTkRfRE9XTkxPQURfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19GSUxFX0NIRUNLX09QQ09ERV9FTkRfRE9XTkxPQURfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRklMRV9DSEVDS19PUENPREVfRU5EX0RPV05MT0FEX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZW5kX2Rvd25sb2FkX3JlcXVlc3QuZmlsZV9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZJTEVfQ0hFQ0tfT1BDT0RFX0VORF9ET1dOTE9BRF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmVuZF9kb3dubG9hZF9yZXNwb25zZS5ycHNfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlIG9wY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRklMRV9DSEVDS19PUENPREVfRU5EX0RPV05MT0FEX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZJTEVfQ0hFQ0tfT1BDT0RFX0VORF9ET1dOTE9BRF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3BhY2sodGhpcy0+b3VpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmdGhpcy0+b3VpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2Ryb3BfZXZlbnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZHJvcF9ldmVudHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fbXVsdGljYXN0X2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX211bHRpY2FzdF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2NyY19lcnJvcmVkX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2NyY19lcnJvcmVkX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fdW5kZXJzaXplX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX3VuZGVyc2l6ZV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX292ZXJzaXplX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX292ZXJzaXplX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fZnJhZ21lbnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZnJhZ21lbnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9qYWJiZXJzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1famFiYmVycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fZnJhbWVzNjRvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczY1dG8xMjdvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczEyOHRvMjU1b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXMyNTZ0bzUxMW9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fZnJhbWVzNTEydG8xMDIzb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXMxMDI0dG8xNTE4b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZnJhbWVzNjRvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV9mcmFtZXM2NXRvMTI3b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZnJhbWVzMTI4dG8yNTVvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV9mcmFtZXMyNTZ0bzUxMW9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2ZyYW1lczUxMnRvMTAyM29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2ZyYW1lczEwMjR0bzE1MThvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2Rpc2NhcmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZGlzY2FyZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2Vycm9ycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2Vycm9ycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnN0YXR1c19jaGFuZ2VfdGltZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9kcm9wX2V2ZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2Ryb3BfZXZlbnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9vY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9vY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX211bHRpY2FzdF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9jcmNfZXJyb3JlZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9jcmNfZXJyb3JlZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX3VuZGVyc2l6ZV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV91bmRlcnNpemVfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9vdmVyc2l6ZV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9vdmVyc2l6ZV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2ZyYWdtZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2ZyYWdtZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1famFiYmVycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2phYmJlcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczY0b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXM2NXRvMTI3b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXMxMjh0bzI1NW9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fZnJhbWVzMjU2dG81MTFvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczUxMnRvMTAyM29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fZnJhbWVzMTAyNHRvMTUxOG9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2ZyYW1lczY0b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fZnJhbWVzNjV0bzEyN29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2ZyYW1lczEyOHRvMjU1b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fZnJhbWVzMjU2dG81MTFvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9mcmFtZXM1MTJ0bzEwMjNvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9mcmFtZXMxMDI0dG8xNTE4b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9kaXNjYXJkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2Rpc2NhcmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9lcnJvcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9lcnJvcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5zdGF0dXNfY2hhbmdlX3RpbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyOTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV9wYWNrKHRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5maWxlbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmlsZW5hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5maWxlbmFtZSwgdGhpcy0+dS53cml0ZV9yZXF1ZXN0LmZpbGVuYW1lX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1vZGVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlLCB0aGlzLT51LndyaXRlX3JlcXVlc3QubW9kZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kYXRhLmJsb2NrX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRhdGEuZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51LmRhdGEuZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRhdGEuZGF0YSwgdGhpcy0+dS5kYXRhLmRhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hY2suYmxvY2tfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9FUlJPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5lcnJvci5jb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZXJyb3IubWVzc2FnZV9jb3VudCA+IDApICYmICh0aGlzLT51LmVycm9yLm1lc3NhZ2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWVzc2FnZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX2Vycm9yXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZXJyb3IubWVzc2FnZSwgdGhpcy0+dS5lcnJvci5tZXNzYWdlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9XUklURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9ICh0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWVfY291bnQgKyAxKSArICh0aGlzLT51LndyaXRlX3JlcXVlc3QubW9kZV9jb3VudCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgdGhpcy0+dS5kYXRhLmRhdGFfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0VSUk9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAodGhpcy0+dS5lcnJvci5tZXNzYWdlX2NvdW50ICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0X2NvdW50X2ZpbGVuYW1lKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS53cml0ZV9yZXF1ZXN0LmZpbGVuYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmlsZW5hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5maWxlbmFtZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWUsIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5maWxlbmFtZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS53cml0ZV9yZXF1ZXN0Lm1vZGVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0X2NvdW50X21vZGUoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibW9kZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3dyaXRlX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS53cml0ZV9yZXF1ZXN0Lm1vZGUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS53cml0ZV9yZXF1ZXN0Lm1vZGVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LndyaXRlX3JlcXVlc3QubW9kZSwgdGhpcy0+dS53cml0ZV9yZXF1ZXN0Lm1vZGVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGF0YS5ibG9ja19udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZGF0YV9jb3VudF9kYXRhKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRhdGEuZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51LmRhdGEuZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGF0YS5kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5kYXRhLmRhdGEsIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuYWNrLmJsb2NrX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfRVJST1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZXJyb3IuY29kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5lcnJvci5tZXNzYWdlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZXJyb3JfY291bnRfbWVzc2FnZShidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lcnJvci5tZXNzYWdlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZXJyb3IubWVzc2FnZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1lc3NhZ2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9lcnJvclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVycm9yLm1lc3NhZ2UgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lcnJvci5tZXNzYWdlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lcnJvci5tZXNzYWdlLCB0aGlzLT51LmVycm9yLm1lc3NhZ2VfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9vcF9jb2RlIG9wY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9vcF9jb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9XUklURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGVuYW1lX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vZGVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGR1bW15OworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZkdW1teSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR1bW15ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChmaWxlbmFtZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZHVtbXk7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmR1bW15KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZHVtbXkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtb2RlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobW9kZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkYXRhX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZGF0YV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0VSUk9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lc3NhZ2VfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZHVtbXk7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmR1bW15KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZHVtbXkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobWVzc2FnZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0X2NvdW50X2ZpbGVuYW1lKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDhfdCBkdW1teTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHVtbXkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3dyaXRlX3JlcXVlc3RfY291bnRfbW9kZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQ4X3QgZHVtbXk7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGR1bW15ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9kYXRhX2NvdW50X2RhdGEoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZXJyb3JfY291bnRfbWVzc2FnZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQ4X3QgZHVtbXk7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGR1bW15ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfT1BDT0RFX0FDVElWQVRFX0lNQUdFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWdfcGFjayh0aGlzLT51LmFjdGl2YXRlX2ltYWdlX3JlcXVlc3QuZmxhZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrX3BhY2sodGhpcy0+dS5hY3RpdmF0ZV9pbWFnZV9yZXNwb25zZS5hY2ssIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TV01JUlJPUl9PUENPREVfQUNUSVZBVEVfSU1BR0VfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZ191bnBhY2soJnRoaXMtPnUuYWN0aXZhdGVfaW1hZ2VfcmVxdWVzdC5mbGFnLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfT1BDT0RFX0FDVElWQVRFX0lNQUdFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2tfdW5wYWNrKCZ0aGlzLT51LmFjdGl2YXRlX2ltYWdlX3Jlc3BvbnNlLmFjaywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUgb3Bjb2RlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfT1BDT0RFX0FDVElWQVRFX0lNQUdFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlX3BhY2sodGhpcy0+ZGF0YV90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGF0YV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9URlRQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS50ZnRwLnRpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9wYWNrKCZ0aGlzLT51LnRmdHAudGZ0cCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TT0ZUV0FSRV9ET1dOTE9BRF9EQVRBX1RZUEVfREFUQV9DSEVDS0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGF0YV9jaGVja2luZy50aWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2VfcGFjaygmdGhpcy0+dS5kYXRhX2NoZWNraW5nLmZpbGVfY2hlY2ssIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1NXTUlSUk9SSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zd21pcnJvcmluZy50aWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlX3BhY2soJnRoaXMtPnUuc3dtaXJyb3Jpbmcuc3dtaXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0NPTU1JVF9JTUFHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuY29tbWl0X2ltYWdlLnRpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3BhY2soJnRoaXMtPnUuY29tbWl0X2ltYWdlLmNvbW1pdF9pbWFnZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmRhdGFfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TT0ZUV0FSRV9ET1dOTE9BRF9EQVRBX1RZUEVfVEZUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudGZ0cC50ZnRwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0RBVEFfQ0hFQ0tJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRhdGFfY2hlY2tpbmcuZmlsZV9jaGVjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9TV01JUlJPUklORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnN3bWlycm9yaW5nLnN3bWlycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0NPTU1JVF9JTUFHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jb21taXRfaW1hZ2UuY29tbWl0X2ltYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlX3VucGFjaygmdGhpcy0+ZGF0YV90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGF0YV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9URlRQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoIC0gMywgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnRmdHAudGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3VucGFjaygmdGhpcy0+dS50ZnRwLnRmdHAsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoIC0gMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TT0ZUV0FSRV9ET1dOTE9BRF9EQVRBX1RZUEVfREFUQV9DSEVDS0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDMsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kYXRhX2NoZWNraW5nLnRpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV91bnBhY2soJnRoaXMtPnUuZGF0YV9jaGVja2luZy5maWxlX2NoZWNrLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1NXTUlSUk9SSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoIC0gMywgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN3bWlycm9yaW5nLnRpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnN3bWlycm9yaW5nLnN3bWlycm9yLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0NPTU1JVF9JTUFHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDMsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jb21taXRfaW1hZ2UudGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmNvbW1pdF9pbWFnZS5jb21taXRfaW1hZ2UsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoIC0gMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGUgZGF0YV90eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGVfdW5wYWNrKCZkYXRhX3R5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChkYXRhX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1RGVFA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDMsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0RBVEFfQ0hFQ0tJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDMsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1NXTUlSUk9SSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAzLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoIC0gMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TT0ZUV0FSRV9ET1dOTE9BRF9EQVRBX1RZUEVfQ09NTUlUX0lNQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAzLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50eGJ5dGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZHJvcHBlZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50eGJ5dGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZHJvcHBlZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndpZHRoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9QT1JUX0RPV05TVFJFQU1fUkFURV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5wb3J0X2Rvd25zdHJlYW1fcmF0ZV9zaGFwaW5nLmlzX2FjdGl2YXRlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUucG9ydF9kb3duc3RyZWFtX3JhdGVfc2hhcGluZy5yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5vbnVfbWFjX2xpbWl0LmlzX2FjdGl2YXRlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfbWFjX2xpbWl0LmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9CTE9DS19VTkJMT0NLX09OVV9UUkFGRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5ibG9ja191bmJsb2NrX29udV90cmFmZmljLmJsb2NrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfRElBR05PU1RJQ1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X2RpYWdub3N0aWNzLm9wdGljc19tb2R1bGVfdGVtcGVyYXR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9kaWFnbm9zdGljcy50eG9wdGljc19wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X2RpYWdub3N0aWNzLnJ4b3B0aWNzX3Bvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfUVVFVUVfRFJPUF9DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9xdWV1ZV9kcm9wX2NvdW50ZXIudXBzdHJlYW1fcXVldWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fcXVldWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X3F1ZXVlX2Ryb3BfY291bnRlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51Lm9udV9xdWV1ZV9kcm9wX2NvdW50ZXIudXBzdHJlYW1fcXVldWVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXJfcGFjaygmdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIuY291bnRlcl9iaXRfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4ZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIudHhieXRlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4bXVsdGljYXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIudHhicm9hZGNhc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci50eGRyb3BwZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeGZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnJ4Ynl0ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeG11bHRpY2FzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnJ4YnJvYWRjYXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhvdmVyc2l6ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeHVuZGVyc2l6ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeGNyY19lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfUlNUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9yc3RwLmVuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0xPT1BfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5sb29wX2RldGVjdC5lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmxvb3BfZGV0ZWN0LmludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmxvb3BfZGV0ZWN0LmJsb2NrX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9NUENQX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X21wY3BfY291bnRlci5jb3VudGVyX2JpdF9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnJ4aGVjX2Vycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X21wY3BfY291bnRlci5yeHJlZ2lzdGVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnR4cmVnaXN0ZXJfYWNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnJ4Z2F0ZV9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9tcGNwX2NvdW50ZXIudHhyZXBvcnRfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PUFRJQ0FMX1BPV0VSX0FMQVJNX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMuZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1c19wYWNrKHRoaXMtPnUub3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMuYWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnN0YXRpY19tYWMubWFjc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN0YXRpY19tYWMubWFjc19jb3VudCA+IDApICYmICh0aGlzLT51LnN0YXRpY19tYWMubWFjcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYWNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc3RhdGljX21hY1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnN0YXRpY19tYWMubWFjc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuc3RhdGljX21hYy5tYWNzW2kxXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzKQoreworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+d2lkdGg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX1BPUlRfRE9XTlNUUkVBTV9SQVRFX1NIQVBJTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9CTE9DS19VTkJMT0NLX09OVV9UUkFGRklDOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9ESUFHTk9TVElDUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfUVVFVUVfRFJPUF9DT1VOVEVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICg4ICogdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9FVEhFUk5FVF9QT1JUX0NPVU5URVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA5ODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfUlNUUDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfTVBDUF9DT1VOVEVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PUFRJQ0FMX1BPV0VSX0FMQVJNX1NUQVRVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICg2ICogdGhpcy0+dS5zdGF0aWNfbWFjLm1hY3NfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9QT1JUX0RPV05TVFJFQU1fUkFURV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnRfZG93bnN0cmVhbV9yYXRlX3NoYXBpbmcuaXNfYWN0aXZhdGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnRfZG93bnN0cmVhbV9yYXRlX3NoYXBpbmcucmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbWFjX2xpbWl0LmlzX2FjdGl2YXRlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9tYWNfbGltaXQubGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0JMT0NLX1VOQkxPQ0tfT05VX1RSQUZGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYmxvY2tfdW5ibG9ja19vbnVfdHJhZmZpYy5ibG9jaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX0RJQUdOT1NUSUNTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2RpYWdub3N0aWNzLm9wdGljc19tb2R1bGVfdGVtcGVyYXR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2RpYWdub3N0aWNzLnR4b3B0aWNzX3Bvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9kaWFnbm9zdGljcy5yeG9wdGljc19wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX1FVRVVFX0RST1BfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9xdWV1ZV9kcm9wX2NvdW50ZXIudXBzdHJlYW1fcXVldWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9xdWV1ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcXVldWVfZHJvcF9jb3VudGVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9udV9xdWV1ZV9kcm9wX2NvdW50ZXIudXBzdHJlYW1fcXVldWVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyX3VucGFjaygmdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9FVEhFUk5FVF9QT1JUX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIuY291bnRlcl9iaXRfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIudHhmcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4Ynl0ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4bXVsdGljYXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci50eGJyb2FkY2FzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIudHhkcm9wcGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeGZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhieXRlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhtdWx0aWNhc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnJ4YnJvYWRjYXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeG92ZXJzaXplZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnh1bmRlcnNpemVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeGNyY19lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfUlNUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X3JzdHAuZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubG9vcF9kZXRlY3QuZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxvb3BfZGV0ZWN0LmludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubG9vcF9kZXRlY3QuYmxvY2tfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX01QQ1BfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9tcGNwX2NvdW50ZXIuY291bnRlcl9iaXRfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnJ4aGVjX2Vycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnJ4cmVnaXN0ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X21wY3BfY291bnRlci50eHJlZ2lzdGVyX2FjaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnJ4Z2F0ZV9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X21wY3BfY291bnRlci50eHJlcG9ydF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09QVElDQUxfUE9XRVJfQUxBUk1fU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzLmVuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXNfdW5wYWNrKCZ0aGlzLT51Lm9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzLmFsYXJtX3N0YXR1cywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RhdGljX21hYy5tYWNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3RhdGljX21hYy5tYWNzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc3RhdGljX21hYy5tYWNzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWFjc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3N0YXRpY19tYWNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zdGF0aWNfbWFjLm1hY3MgPSAoYmNtb3NfbWFjX2FkZHJlc3MgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc3RhdGljX21hYy5tYWNzX2NvdW50ICogc2l6ZW9mKGJjbW9zX21hY19hZGRyZXNzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnN0YXRpY19tYWMubWFjc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGF0aWNfbWFjLm1hY3NbaTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgbGVhZjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX1BPUlRfRE9XTlNUUkVBTV9SQVRFX1NIQVBJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfQkxPQ0tfVU5CTE9DS19PTlVfVFJBRkZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX0RJQUdOT1NUSUNTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9RVUVVRV9EUk9QX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9xdWV1ZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ1cHN0cmVhbV9xdWV1ZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyKSAqIHVwc3RyZWFtX3F1ZXVlc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHVwc3RyZWFtX3F1ZXVlc19jb3VudCAqIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfRVRIRVJORVRfUE9SVF9SU1RQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfTVBDUF9DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09QVElDQUxfUE9XRVJfQUxBUk1fU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IG1hY3NfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZtYWNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9zX21hY19hZGRyZXNzKSAqIG1hY3NfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBtYWNzX2NvdW50ICogNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbl9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9PTlVfQ09VTlRFUl9DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX1JFU1RPUkVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfcmVzdG9yZV9vbnVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duLCB0aGlzLT51LnJlc3RvcmVfb251LnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX1RYUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS50eHBvd2VyX29mZi5sZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudHhwb3dlcl9vZmYubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LnR4cG93ZXJfb2ZmLmlzX3Bvd2VyX29mZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS50eHBvd2VyX29mZi5kdXJhdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9FTkQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX09OVV9DT1VOVEVSX0NMRUFSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fUkVTVE9SRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fVFhQT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX0VORDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9PTlVfQ09VTlRFUl9DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX1JFU1RPUkVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3Jlc3RvcmVfb251X2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LnJlc3RvcmVfb251LnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfcmVzdG9yZV9vbnVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93biwgdGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9UWFBPV0VSX09GRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS50eHBvd2VyX29mZi5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnR4cG93ZXJfb2ZmLmxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnR4cG93ZXJfb2ZmLmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudHhwb3dlcl9vZmYubGVuZ3RoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4cG93ZXJfb2ZmLmlzX3Bvd2VyX29mZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4cG93ZXJfb2ZmLmR1cmF0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnR4cG93ZXJfb2ZmLmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudHhwb3dlcl9vZmYubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9FTkQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gbGVhZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX09OVV9DT1VOVEVSX0NMRUFSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fUkVTVE9SRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9UWFBPV0VSX09GRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fRU5EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZV9yZXN0b3JlX29udV9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX3BhY2soJnRoaXMtPnUuYWN0aW9uLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3BhY2soJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9wYWNrKCZ0aGlzLT51Lm1hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5leHRfYXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5leHRfYWN0aW9uLmF0dHJpYnV0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soJnRoaXMtPnUua3RhdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5rdGFjdGlvbi5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYubGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRlZi5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmF0dHJpYnV0ZS5hdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmFjdGlvbi5hY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubWFuYWdlbWVudF9vYmplY3Qub2JqZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXh0X2F0dHJpYnV0ZS5hdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5leHRfYWN0aW9uLmF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5rdGF0dHJpYnV0ZS5hdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUua3RhY3Rpb24uYXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfdW5wYWNrKCZ0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX3VucGFjaygmdGhpcy0+dS5hY3Rpb24uYWN0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3VucGFjaygmdGhpcy0+dS5tYW5hZ2VtZW50X29iamVjdC5vYmplY3QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmV4dF9hdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjaygmdGhpcy0+dS5leHRfYWN0aW9uLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lmt0YXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lmt0YWN0aW9uLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5kZWYubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYubGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZGVmLmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLmxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmRlZi5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3BhY2sodGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfcGFjaygmdGhpcy0+dS5vbGRfbWFuYWdlbWVudF9vYmplY3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfcGFjaygmdGhpcy0+dS5tYW5hZ2VtZW50X29iamVjdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmV4dF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fcGFjayh0aGlzLT51LmV4dF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5rdGF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fcGFjayh0aGlzLT51Lmt0YWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5tYW5hZ2VtZW50X29iamVjdC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfZW5kX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3VucGFjaygmdGhpcy0+dS5vbGRfbWFuYWdlbWVudF9vYmplY3QudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soJnRoaXMtPnUubWFuYWdlbWVudF9vYmplY3QudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmV4dF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmV4dF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5rdGF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51Lmt0YWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIGJyYW5jaDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3VucGFjaygmYnJhbmNoLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX0xPT1BfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnRfcGFjayh0aGlzLT51Lmxvb3BfZGV0ZWN0LmV2ZW50LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX09QVElDQUxfUE9XRVJfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50X3BhY2sodGhpcy0+dS5vcHRpY2FsX3Bvd2VyX2FsYXJtLmV2ZW50LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX0VORDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX0xPT1BfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9PUFRJQ0FMX1BPV0VSX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9FTkQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDIsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50X3VucGFjaygmdGhpcy0+dS5sb29wX2RldGVjdC5ldmVudCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX09QVElDQUxfUE9XRVJfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50X3VucGFjaygmdGhpcy0+dS5vcHRpY2FsX3Bvd2VyX2FsYXJtLmV2ZW50LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfRU5EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGggLSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGUgdHlwZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDIsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfT1BUSUNBTF9QT1dFUl9BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfRU5EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggLSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlX3BhY2sodGhpcy0+b3AsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TT0ZUV0FSRV9ET1dOTE9BRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtZXNzYWdlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc29mdHdhcmVfZG93bmxvYWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2VfcGFjaygmdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc1tpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX09OVV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZV9wYWNrKHRoaXMtPnUub251X2F1dGhlbnRpY2F0aW9uLmNvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X2F1dGhlbnRpY2F0aW9uLmF1dGhlbnRpY2F0aW9uX2RhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImF1dGhlbnRpY2F0aW9uX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX29udV9hdXRoZW50aWNhdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhLCB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX3BhY2soJnRoaXMtPnUuY2h1cm5pbmcudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfREJBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3BhY2soJnRoaXMtPnUuZGJhLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0tUT05VX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk1OworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZXZlbnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9rdG9udV9ldmVudFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51Lmt0b251X2V2ZW50LmV2ZW50c19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2VfcGFjaygmdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNbaTVdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9wYWNrKCZ0aGlzLT51LmV2ZW50LmV2ZW50cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzW2kyXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXNwb25zZS52YXJzW2kzXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU09GVFdBUkVfRE9XTkxPQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWVzc2FnZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzW2k0XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfT05VX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfQ0hVUk5JTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY2h1cm5pbmcudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfREJBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kYmEudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfS1RPTlVfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lmt0b251X2V2ZW50LmV2ZW50c19jb3VudCA+IDApICYmICh0aGlzLT51Lmt0b251X2V2ZW50LmV2ZW50cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJldmVudHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQ7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNbaTVdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXZlbnQuZXZlbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZV91bnBhY2soJnRoaXMtPm9wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3JlcXVlc3RfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3VucGFjaygmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3JlcXVlc3RfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3JlcXVlc3QudmFycyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzW2kyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaTNdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NPRlRXQVJFX0RPV05MT0FEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgIHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NvZnR3YXJlX2Rvd25sb2FkX2NvdW50X21lc3NhZ2VzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtZXNzYWdlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc29mdHdhcmVfZG93bmxvYWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlcyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzW2k0XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9PTlVfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X2F1dGhlbnRpY2F0aW9uLmF1dGhlbnRpY2F0aW9uX2RhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImF1dGhlbnRpY2F0aW9uX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX29udV9hdXRoZW50aWNhdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub251X2F1dGhlbnRpY2F0aW9uLmF1dGhlbnRpY2F0aW9uX2RhdGFfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhLCB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX3VucGFjaygmdGhpcy0+dS5jaHVybmluZy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0RCQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV91bnBhY2soJnRoaXMtPnUuZGJhLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfS1RPTlVfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTU7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2t0b251X2V2ZW50X2NvdW50X2V2ZW50cyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJldmVudHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2t0b251X2V2ZW50XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzID0gKGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lmt0b251X2V2ZW50LmV2ZW50c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQ7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX3VucGFjaygmdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNbaTVdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3VucGFjaygmdGhpcy0+dS5ldmVudC5ldmVudHMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlIG9wOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfdW5wYWNrKCZvcCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TT0ZUV0FSRV9ET1dOTE9BRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChtZXNzYWdlc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9PTlVfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgYXV0aGVudGljYXRpb25fZGF0YV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZhdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogYXV0aGVudGljYXRpb25fZGF0YV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBhdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfQ0hVUk5JTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9EQkE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfS1RPTlVfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZXZlbnRzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBldmVudHNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChldmVudHNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zb2Z0d2FyZV9kb3dubG9hZF9jb3VudF9tZXNzYWdlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2t0b251X2V2ZW50X2NvdW50X2V2ZW50cyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kX3BhY2sodGhpcy0+Y29tbWFuZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb25fcGFjayh0aGlzLT5kaXJlY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX0FERF9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3BhY2sodGhpcy0+dS5hZGRfZmlsdGVyLmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmFkZF9maWx0ZXIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb25fcGFjayh0aGlzLT51LmFkZF9maWx0ZXIuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUkVNT1ZFX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGRfcGFjayh0aGlzLT51LnJlbW92ZV9maWx0ZXIuZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucmVtb3ZlX2ZpbHRlci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbl9wYWNrKHRoaXMtPnUucmVtb3ZlX2ZpbHRlci5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9RVUVVRV9NQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGVfcGFjayh0aGlzLT51LnF1ZXVlX21hcC5wcmlfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX21hcC5pbl9wcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9tYXAub3V0X3ByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX0FERF9QUklPUklUWV9GT1JfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGRfcGFjayh0aGlzLT51LmFkZF9wcmlvcml0eV9mb3Jfdmxhbi5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hZGRfcHJpb3JpdHlfZm9yX3ZsYW4udmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYWRkX3ByaW9yaXR5X2Zvcl92bGFuLnByaV92bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFkZF9wcmlvcml0eV9mb3Jfdmxhbi5wcmlfcXVldWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA2OworICAgIHN3aXRjaCAodGhpcy0+Y29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9SRU1PVkVfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9RVUVVRV9NQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfQUREX1BSSU9SSVRZX0ZPUl9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZF91bnBhY2soJnRoaXMtPmNvbW1hbmQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+ZGlyZWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZF91bnBhY2soJnRoaXMtPnUuYWRkX2ZpbHRlci5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5hZGRfZmlsdGVyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5hZGRfZmlsdGVyLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX1JFTU9WRV9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3VucGFjaygmdGhpcy0+dS5yZW1vdmVfZmlsdGVyLmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnJlbW92ZV9maWx0ZXIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LnJlbW92ZV9maWx0ZXIuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUVVFVUVfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlX3VucGFjaygmdGhpcy0+dS5xdWV1ZV9tYXAucHJpX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5xdWV1ZV9tYXAuaW5fcHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucXVldWVfbWFwLm91dF9wcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfUFJJT1JJVFlfRk9SX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3VucGFjaygmdGhpcy0+dS5hZGRfcHJpb3JpdHlfZm9yX3ZsYW4uZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuYWRkX3ByaW9yaXR5X2Zvcl92bGFuLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmFkZF9wcmlvcml0eV9mb3Jfdmxhbi5wcmlfdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hZGRfcHJpb3JpdHlfZm9yX3ZsYW4ucHJpX3F1ZXVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmQgY29tbWFuZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmRfdW5wYWNrKCZjb21tYW5kLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX0FERF9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9SRU1PVkVfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUVVFVUVfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfQUREX1BSSU9SSVRZX0ZPUl9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wb3J0X251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5lbmFibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmF1dG9fbmVnb3RpYXRpb25fZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnNwZWVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pc19mdWxsX2R1cGxleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlYXJuaW5nX3RhYmxlX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cG9ydF9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdXRvX25lZ290aWF0aW9uX2VuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5zcGVlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfZnVsbF9kdXBsZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZWFybmluZ190YWJsZV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pc190YWdnZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT52bGFuX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfdGFnZ2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dmxhbl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBvcnRfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dmxhbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dmxhbnMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZsYW5zX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wYWNrKCZ0aGlzLT52bGFuc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCAqdGhpcykKK3sKKyAgICByZXR1cm4gNiArICg0ICogdGhpcy0+dmxhbnNfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvcnRfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dmxhbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dmxhbnMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmxhbnMgPSAoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT52bGFuc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fdW5wYWNrKCZ0aGlzLT52bGFuc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnB2aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IHZsYW5zX2NvdW50OworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJnZsYW5zX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuKSAqIHZsYW5zX2NvdW50KTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHZsYW5zX2NvdW50ICogNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cG9ydF9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfbGlua2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zcGVlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pc19mdWxsX2R1cGxleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cG9ydF9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfbGlua2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5zcGVlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pc19mdWxsX2R1cGxleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmluX2dvb2Rfb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW5fZ29vZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pbl9icm9hZGNhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pbl9tdWx0aWNhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5vdXRfZ29vZF9vY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5vdXRfZ29vZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5vdXRfYnJvYWRjYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+b3V0X211bHRpY2FzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5pbl9nb29kX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmluX2dvb2RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW5fYnJvYWRjYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW5fbXVsdGljYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b3V0X2dvb2Rfb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+b3V0X2dvb2RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+b3V0X2Jyb2FkY2FzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm91dF9tdWx0aWNhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHNfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51bmRlcnNpemVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+b3ZlcnNpemVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+amFiYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW5fbWFjX3JlY2VpdmVfZXJyb3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pbl9mY3NfZXJyb3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dW5kZXJzaXplZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm92ZXJzaXplZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmphYmJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmluX21hY19yZWNlaXZlX2Vycm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW5fZmNzX2Vycm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9QT1JUMEFORDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19wYWNrKCZ0aGlzLT51LnBvcnQwYW5kMS5wb3J0MCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3BhY2soJnRoaXMtPnUucG9ydDBhbmQxLnBvcnQxLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9QT1JUMkFORDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19wYWNrKCZ0aGlzLT51LnBvcnQyYW5kMy5wb3J0MiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3BhY2soJnRoaXMtPnUucG9ydDJhbmQzLnBvcnQzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9FUlJPUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c19wYWNrKCZ0aGlzLT51LmVycm9ycy5wb3J0MCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3BhY2soJnRoaXMtPnUuZXJyb3JzLnBvcnQxLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHNfcGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDIsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c19wYWNrKCZ0aGlzLT51LmVycm9ycy5wb3J0MywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDBBTkQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDgwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX1BPUlQyQU5EMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9FUlJPUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDBBTkQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfdW5wYWNrKCZ0aGlzLT51LnBvcnQwYW5kMS5wb3J0MCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfdW5wYWNrKCZ0aGlzLT51LnBvcnQwYW5kMS5wb3J0MSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9QT1JUMkFORDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c191bnBhY2soJnRoaXMtPnUucG9ydDJhbmQzLnBvcnQyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c191bnBhY2soJnRoaXMtPnUucG9ydDJhbmQzLnBvcnQzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX0VSUk9SUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3VucGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDAsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3VucGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDEsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3VucGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3VucGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlIHR5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX1BPUlQwQU5EMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDJBTkQzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9FUlJPUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWRfcGFjayh0aGlzLT5pZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkX3VucGFjaygmdGhpcy0+aWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlX3BhY2sodGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1BPUlRfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucG9ydF9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9wb3J0X2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9wYWNrKCZ0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF92bGFuLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3ZsYW4ucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfc2V0X3ZsYW5cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF9wYWNrKCZ0aGlzLT51LnNldF92bGFuLnBvcnRzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9HRVRfT05VX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9vbnVfY29uZmlnLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmdldF9vbnVfY29uZmlnLm9wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfb251X2NvbmZpZy5wcm9maWxlX29wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfb251X2NvbmZpZy52YWx1ZV9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9nZXRfb251X2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWdfcGFjaygmdGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0c1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1NUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9zdHAucmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5zZXRfc3RwLmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2V0X3N0cC5tYXhfYWdlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zZXRfc3RwLmZvcndhcmRfZGVsYXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNldF9zdHAuaGVsbG9fdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVFhQT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2V0X3R4cG93ZXJfb2ZmLmVuYWJsZV90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QubGxpZF9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QuZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9sb29wX2RldGVjdC5ibG9ja19jYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LnNlbmRfY2FwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9sb29wX2RldGVjdC5vbHRfbWFjX2NhcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LnNlbmRfcGVyaW9kKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QuYmxvY2tfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3Qub2x0X21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1RfVU5CTE9DSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3RfdW5ibG9jay5sbGlkX2JpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9DTEFTU0lGSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV9wYWNrKCZ0aGlzLT51LmNsYXNzaWZpZXIuY2xhc3NpZmllciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV92ZXJzaW9uLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm9udV92ZXJzaW9uLm9wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3ZlcnNpb24uaW5mb19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV92ZXJzaW9uLmluZm8gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW5mb1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9vbnVfdmVyc2lvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9udV92ZXJzaW9uLmluZm8sIHRoaXMtPnUub251X3ZlcnNpb24uaW5mb19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfRkxBU0hfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfZmxhc2hfZmlybXdhcmVfdmVyc2lvbi5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9mbGFzaF9maXJtd2FyZV92ZXJzaW9uLmJvb3RfbW9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfZmxhc2hfZmlybXdhcmVfdmVyc2lvbi5hY3RpdmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24uaW1hZ2Uxc3RyaW5nLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfZmxhc2hfZmlybXdhcmVfdmVyc2lvbi5pbWFnZTJzdHJpbmcsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9BQ1RJVkVfSU1BR0VfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfYWN0aXZlX2ltYWdlX3RpbWUubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfYWN0aXZlX2ltYWdlX3RpbWUuYWN0aXZlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfYWN0aXZlX2ltYWdlX3RpbWUuYnVpbGRfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU1RBVElTVElDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9zdGF0aXN0aWMubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3N0YXRpc3RpYy5vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2VxdWVuY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX29udV9zdGF0aXN0aWNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5vbnVfc3RhdGlzdGljLnNlcXVlbmNlc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX3BhY2soJnRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfR0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQubGxpZF9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3NfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN0YXRpc3RpY3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfb251X3N0YXRpc3RpY19nZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZV9wYWNrKCZ0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3NbaTRdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9JR01QX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X2lnbXBfc2V0LmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfaWdtcF9zZXQubWF4X2dyb3VwcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfUE9SVF9JR01QX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X3BvcnRfaWdtcF9maWx0ZXIuZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3NoYXBpbmcucmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5vbnVfc2hhcGluZy5lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm9udV9zaGFwaW5nLnJhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9QT1JUX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDEwICogdGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0c19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF92bGFuLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3ZsYW4ucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnNldF92bGFuLnBvcnRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfdmxhbi5wb3J0c1tpMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfR0VUX09OVV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTUgKyAoNCAqIHRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfU1RQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9UWFBPV0VSX09GRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9MT09QX0RFVEVDVF9VTkJMT0NLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX0NMQVNTSUZJRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jbGFzc2lmaWVyLmNsYXNzaWZpZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4ICsgdGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfRkxBU0hfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0FDVElWRV9JTUFHRV9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDExOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU1RBVElTVElDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfc3RhdGlzdGljLnNlcXVlbmNlc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlcXVlbmNlc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNbaTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfR0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyAoNiAqIHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9JR01QX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfUE9SVF9JR01QX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlX3VucGFjaygmdGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1BPUlRfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucG9ydF9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX3BvcnRfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucG9ydF9jb25maWcucG9ydHMgPSAoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucG9ydF9jb25maWcucG9ydHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUucG9ydF9jb25maWcucG9ydHNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3VucGFjaygmdGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0c1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF92bGFuLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3ZsYW4ucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9zZXRfdmxhblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF92bGFuLnBvcnRzID0gKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3ZsYW4ucG9ydHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF91bnBhY2soJnRoaXMtPnUuc2V0X3ZsYW4ucG9ydHNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfR0VUX09OVV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfb251X2NvbmZpZy5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dS5nZXRfb251X2NvbmZpZy5vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X29udV9jb25maWcucHJvZmlsZV9vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X29udV9jb25maWcudmFsdWVfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9nZXRfb251X2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzID0gKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZ191bnBhY2soJnRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHNbaTJdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1NUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9zdHAucmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dS5zZXRfc3RwLmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc2V0X3N0cC5tYXhfYWdlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zZXRfc3RwLmZvcndhcmRfZGVsYXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnNldF9zdHAuaGVsbG9fdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVFhQT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc2V0X3R4cG93ZXJfb2ZmLmVuYWJsZV90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QubGxpZF9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QuZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9sb29wX2RldGVjdC5ibG9ja19jYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LnNlbmRfY2FwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9sb29wX2RldGVjdC5vbHRfbWFjX2NhcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LnNlbmRfcGVyaW9kKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QuYmxvY2tfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3Qub2x0X21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1RfVU5CTE9DSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3RfdW5ibG9jay5sbGlkX2JpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9DTEFTU0lGSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuY2xhc3NpZmllci5jbGFzc2lmaWVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5vbnVfdmVyc2lvbi5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5vbnVfdmVyc2lvbi5vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X3ZlcnNpb24uaW5mb19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV92ZXJzaW9uLmluZm9fY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW5mb1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9vbnVfdmVyc2lvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV92ZXJzaW9uLmluZm8gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvLCB0aGlzLT51Lm9udV92ZXJzaW9uLmluZm9fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0ZMQVNIX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24ubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfZmxhc2hfZmlybXdhcmVfdmVyc2lvbi5ib290X21vZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24uYWN0aXZlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24uaW1hZ2Uxc3RyaW5nLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm9udV9mbGFzaF9maXJtd2FyZV92ZXJzaW9uLmltYWdlMnN0cmluZywgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0FDVElWRV9JTUFHRV9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm9udV9hY3RpdmVfaW1hZ2VfdGltZS5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9hY3RpdmVfaW1hZ2VfdGltZS5hY3RpdmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51Lm9udV9hY3RpdmVfaW1hZ2VfdGltZS5idWlsZF90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X3N0YXRpc3RpYy5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dS5vbnVfc3RhdGlzdGljLm9wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX29udV9zdGF0aXN0aWNfY291bnRfc2VxdWVuY2VzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZXF1ZW5jZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfb251X3N0YXRpc3RpY1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzID0gKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfc3RhdGlzdGljLnNlcXVlbmNlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV91bnBhY2soJnRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNbaTNdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQ19DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQ19HRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5sbGlkX2JpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdGF0aXN0aWNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX29udV9zdGF0aXN0aWNfZ2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljcyA9IChiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3NfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlX3VucGFjaygmdGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzW2k0XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9JR01QX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnUub251X2lnbXBfc2V0LmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfaWdtcF9zZXQubWF4X2dyb3VwcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfUE9SVF9JR01QX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnUub251X3BvcnRfaWdtcF9maWx0ZXIuZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3NoYXBpbmcucmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dS5vbnVfc2hhcGluZy5lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51Lm9udV9zaGFwaW5nLnJhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlIG9wY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfUE9SVF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgcG9ydHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0KSAqIHBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHBvcnRzX2NvdW50ICogMTApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgcG9ydHNfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQpICogcG9ydHNfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHBvcnRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX0dFVF9PTlVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcG9ydHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZwb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWcpICogcG9ydHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgcG9ydHNfY291bnQgKiA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9TVFA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1RYUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX0xPT1BfREVURUNUX1VOQkxPQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX0NMQVNTSUZJRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaW5mb19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmluZm9fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBpbmZvX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGluZm9fY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9GTEFTSF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0FDVElWRV9JTUFHRV9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXF1ZW5jZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2VxdWVuY2VzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfR0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdGlzdGljc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnN0YXRpc3RpY3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUpICogc3RhdGlzdGljc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzdGF0aXN0aWNzX2NvdW50ICogNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfSUdNUF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1BPUlRfSUdNUF9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfb251X3N0YXRpc3RpY19jb3VudF9zZXF1ZW5jZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuZ3RoID4gMCkgJiYgKHRoaXMtPm5hbWUgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+bmFtZSwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArIHRoaXMtPmxlbmd0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW5ndGggPiAwKSAmJiAodGhpcy0+bmFtZSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm5hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPm5hbWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+bmFtZSwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm5hbWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPm5hbWVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm5hbWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5uYW1lc19jb3VudCA+IDY1NTM1TCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5uYW1lc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9wYWNrKCZ0aGlzLT5uYW1lc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT5uYW1lc19jb3VudCA+IDApICYmICh0aGlzLT5uYW1lcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJuYW1lc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm5hbWVzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+bmFtZXNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgdGhpcy0+bmFtZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfY291bnRfbmFtZXMoJnBvc3RMZW5CdWYpOworICAgIGlmICgodGhpcy0+bmFtZXNfY291bnQgPiAwKSAmJiAodGhpcy0+bmFtZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJuYW1lc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5uYW1lcyA9IChiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5uYW1lc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bmFtZXNfY291bnQgPiA2NTUzNUwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bmFtZXNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfdW5wYWNrKCZ0aGlzLT5uYW1lc1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIHVpbnQzMl90IG5hbWVzX2VsZW1fY291bnQgPSAwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbmFtZXNfZWxlbV9jb3VudCArPSAxOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChuYW1lc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfY291bnRfbmFtZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+bWFjX2FkZHJlc3NfY291bnQgPiAwKSAmJiAodGhpcy0+bWFjX2FkZHJlc3MgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWFjX2FkZHJlc3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bWFjX2FkZHJlc3NfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzc1tpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgKnRoaXMpCit7CisgICAgcmV0dXJuICg2ICogdGhpcy0+bWFjX2FkZHJlc3NfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIHRoaXMtPm1hY19hZGRyZXNzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX2NvdW50X21hY19hZGRyZXNzKGJ1Zik7CisgICAgaWYgKCh0aGlzLT5tYWNfYWRkcmVzc19jb3VudCA+IDApICYmICh0aGlzLT5tYWNfYWRkcmVzcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hY19hZGRyZXNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPm1hY19hZGRyZXNzID0gKGJjbW9zX21hY19hZGRyZXNzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5tYWNfYWRkcmVzc19jb3VudCAqIHNpemVvZihiY21vc19tYWNfYWRkcmVzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bWFjX2FkZHJlc3NfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzc1tpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IG1hY19hZGRyZXNzX2VsZW1fY291bnQgPSAwOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtYWNfYWRkcmVzc19lbGVtX2NvdW50ICs9IDE7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKG1hY19hZGRyZXNzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9jb3VudF9tYWNfYWRkcmVzcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aWR0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0RZTl9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9wYWNrKCZ0aGlzLT51LmFkZF9keW5fbWFjX2FkZHIubWFjX2FkZGVzcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfRFlOX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3BhY2soJnRoaXMtPnUuZGVsX2R5bl9tYWNfYWRkci5tYWNfYWRkcmVzcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfU1RBVElDX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3BhY2soJnRoaXMtPnUuYWRkX3N0YXRpY19tYWNfYWRkci5tYWNfYWRkcmVzcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfU1RBVElDX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3BhY2soJnRoaXMtPnUuZGVsX3N0YXRpY19tYWNfYWRkci5tYWNfYWRkcmVzcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbl9wYWNrKHRoaXMtPnUubG9vcGJhY2tfZW5hYmxlLmxvY2F0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbl9wYWNrKHRoaXMtPnUubG9vcGJhY2tfZGlzYWJsZS5sb2NhdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubGFzZXJfdHhfcG93ZXJfb2ZmLmRpc2FibGVfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfSU5HUkVTU19SVUxFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUSUNfTEVBUk5fVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NPTkZJR1VSRV9NQ0FTVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb25fcGFjayh0aGlzLT51LmNvbmZpZ3VyZV9tY2FzdF9sbGlkLmxsaWRfYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmNvbmZpZ3VyZV9tY2FzdF9sbGlkLmxsaWRfdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFVFJJRVZFX0NVUlJFTlRfQUxBUk1fU1VNTUFSWToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMtPndpZHRoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0RZTl9NQUNfQUREUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hZGRfZHluX21hY19hZGRyLm1hY19hZGRlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0RZTl9NQUNfQUREUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kZWxfZHluX21hY19hZGRyLm1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfTUFDX0FERFI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuYWRkX3N0YXRpY19tYWNfYWRkci5tYWNfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfU1RBVElDX01BQ19BRERSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRlbF9zdGF0aWNfbWFjX2FkZHIubWFjX2FkZHJlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRU5BQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fRU5BQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEFCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVElDX0xFQVJOX1RBQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NPTkZJR1VSRV9NQ0FTVF9MTElEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFVFJJRVZFX0NVUlJFTlRfQUxBUk1fU1VNTUFSWToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfRFlOX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3VucGFjaygmdGhpcy0+dS5hZGRfZHluX21hY19hZGRyLm1hY19hZGRlc3MsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9EWU5fTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfdW5wYWNrKCZ0aGlzLT51LmRlbF9keW5fbWFjX2FkZHIubWFjX2FkZHJlc3MsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfdW5wYWNrKCZ0aGlzLT51LmFkZF9zdGF0aWNfbWFjX2FkZHIubWFjX2FkZHJlc3MsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfdW5wYWNrKCZ0aGlzLT51LmRlbF9zdGF0aWNfbWFjX2FkZHIubWFjX2FkZHJlc3MsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uX3VucGFjaygmdGhpcy0+dS5sb29wYmFja19lbmFibGUubG9jYXRpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb25fdW5wYWNrKCZ0aGlzLT51Lmxvb3BiYWNrX2Rpc2FibGUubG9jYXRpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sYXNlcl90eF9wb3dlcl9vZmYuZGlzYWJsZV90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfSU5HUkVTU19SVUxFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRJQ19MRUFSTl9UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ09ORklHVVJFX01DQVNUX0xMSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuY29uZmlndXJlX21jYXN0X2xsaWQubGxpZF9hY3Rpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNvbmZpZ3VyZV9tY2FzdF9sbGlkLmxsaWRfdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFVFJJRVZFX0NVUlJFTlRfQUxBUk1fU1VNTUFSWToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbiBsZWFmOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0RZTl9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9EWU5fTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfU1RBVElDX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfSU5HUkVTU19SVUxFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRJQ19MRUFSTl9UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ09ORklHVVJFX01DQVNUX0xMSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9SRVRSSUVWRV9DVVJSRU5UX0FMQVJNX1NVTU1BUlk6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5xdWV1ZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5xdWV1ZV9jb3VudCA+IDApICYmICh0aGlzLT5xdWV1ZV9zaXplcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zaXplc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5xdWV1ZV9zaXplcywgdGhpcy0+cXVldWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArIHRoaXMtPnF1ZXVlX2NvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnF1ZXVlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnF1ZXVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnF1ZXVlX3NpemVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2l6ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+cXVldWVfc2l6ZXMgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+cXVldWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5xdWV1ZV9zaXplcywgdGhpcy0+cXVldWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBxdWV1ZV9jb3VudDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZxdWV1ZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHF1ZXVlX2NvdW50KTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHF1ZXVlX2NvdW50ICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pbnN0YW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cXVldWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbnN0YW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cXVldWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3BhY2sodGhpcy0+b2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vYmplY3RfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251Lmluc3RhbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV0d29ya19wb24ucG9uX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV0d29ya19wb24ucG9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfbmV0d29ya19wb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb24sIHRoaXMtPnUubmV0d29ya19wb24ucG9uX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5saW5rLmxpbmtfY291bnQgPiAwKSAmJiAodGhpcy0+dS5saW5rLmxpbmsgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfbGlua1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmxpbmsubGluaywgdGhpcy0+dS5saW5rLmxpbmtfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1VTRVJfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS51c2VyX3BvcnQucG9ydCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV91c2VyX3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS51c2VyX3BvcnQucG9ydCwgdGhpcy0+dS51c2VyX3BvcnQucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9wYWNrKCZ0aGlzLT51LnF1ZXVlLnF1ZXVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01DQVNUX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubWNhc3RfbGluay5tY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmJyaWRnZS5icmlkZ2VfY291bnQgPiAwKSAmJiAodGhpcy0+dS5icmlkZ2UuYnJpZGdlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImJyaWRnZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfYnJpZGdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuYnJpZGdlLmJyaWRnZSwgdGhpcy0+dS5icmlkZ2UuYnJpZGdlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0VfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfYnJpZGdlX3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0LCB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01FUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+bGVuZ3RoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b2JqZWN0X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfT05VOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9MSU5LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5saW5rLmxpbmtfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9VU0VSX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LnVzZXJfcG9ydC5wb3J0X2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfUVVFVUU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTUNBU1RfTElOSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0U6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmJyaWRnZS5icmlkZ2VfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0VfUE9SVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01FUDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV91bnBhY2soJnRoaXMtPm9iamVjdF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT5sZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5vYmplY3RfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnUuaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUubmV0d29ya19wb24ucG9uX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9uZXR3b3JrX3Bvbl9jb3VudF9wb24oJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXR3b3JrX3Bvbi5wb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX25ldHdvcmtfcG9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubmV0d29ya19wb24ucG9uID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubmV0d29ya19wb24ucG9uX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbiwgdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5saW5rLmxpbmtfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2xpbmtfY291bnRfbGluaygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmxpbmsubGlua19jb3VudCA+IDApICYmICh0aGlzLT51LmxpbmsubGluayA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxpbmtcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2xpbmtcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5saW5rLmxpbmsgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5saW5rLmxpbmtfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubGluay5saW5rLCB0aGlzLT51LmxpbmsubGlua19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfVVNFUl9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3VzZXJfcG9ydF9jb3VudF9wb3J0KCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS51c2VyX3BvcnQucG9ydCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3VzZXJfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnVzZXJfcG9ydC5wb3J0ID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudXNlcl9wb3J0LnBvcnQsIHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1FVRVVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfdW5wYWNrKCZ0aGlzLT51LnF1ZXVlLnF1ZXVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9NQ0FTVF9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWNhc3RfbGluay5tY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5icmlkZ2UuYnJpZGdlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VfY291bnRfYnJpZGdlKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZS5icmlkZ2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJicmlkZ2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2JyaWRnZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmJyaWRnZS5icmlkZ2UgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5icmlkZ2UuYnJpZGdlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmJyaWRnZS5icmlkZ2UsIHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VfcG9ydF9jb3VudF9wb3J0KCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnQgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnQsIHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTUVQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+bGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV91bnBhY2soJm9iamVjdF90eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChvYmplY3RfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwb25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcG9uX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9uX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW5rX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxpbmtfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChsaW5rX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfVVNFUl9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcG9ydF9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBvcnRfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTUNBU1RfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJyaWRnZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBicmlkZ2VfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChicmlkZ2VfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0VfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3J0X2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBvcnRfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwb3J0X2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTUVQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfbmV0d29ya19wb25fY291bnRfcG9uKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfbGlua19jb3VudF9saW5rKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfdXNlcl9wb3J0X2NvdW50X3BvcnQoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VfY291bnRfYnJpZGdlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfYnJpZGdlX3BvcnRfY291bnRfcG9ydChiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3JfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5zdGFuZGFyZF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuc3RhbmRhcmRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfcGFjaygmdGhpcy0+dS5vYmplY3Qub2JqZWN0X2NvbnRleHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5leHRlbmRlZF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmV4dGVuZGVkX2FjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vYmplY3Qub2JqZWN0X2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1BST0dSQU1NQUJMRV9DT1VOVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuc3RhbmRhcmRfYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LnN0YW5kYXJkX2FjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3VucGFjaygmdGhpcy0+dS5vYmplY3Qub2JqZWN0X2NvbnRleHQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmV4dGVuZGVkX2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZXh0ZW5kZWRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1BST0dSQU1NQUJMRV9DT1VOVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3Jfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIGJyYW5jaDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfUFJPR1JBTU1BQkxFX0NPVU5URVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3BhY2soJnRoaXMtPnN0YXRpc3RpYywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmlzaW5nX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmZhbGxpbmdfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCAqdGhpcykKK3sKKyAgICByZXR1cm4gOCArIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5zdGF0aXN0aWMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl91bnBhY2soJnRoaXMtPnN0YXRpc3RpYywgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yaXNpbmdfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZmFsbGluZ190aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3Jfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlX3BhY2sodGhpcy0+Y29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pbnN0YW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV91bnBhY2soJnRoaXMtPmNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9wYWNrKCZ0aGlzLT5maWVsZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tc2JfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bHNiX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX3VucGFjaygmdGhpcy0+ZmllbGQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5tc2JfbWFzaykpCisgICAgeworICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bHNiX21hc2spKQorICAgIHsKKyAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9wYWNrKCZ0aGlzLT5maWVsZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF91bnBhY2soJnRoaXMtPmZpZWxkLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX05PUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBkYXRhIHRvIHBhY2sgZm9yIGVtcHR5ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBkYXRhIHRvIHBhY2sgZm9yIGVtcHR5ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRk9SV0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBkYXRhIHRvIHBhY2sgZm9yIGVtcHR5ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9wYWNrKCZ0aGlzLT51LnF1ZXVlLnF1ZXVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml9wYWNrKCZ0aGlzLT51LnNldC5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0LnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0LnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfc2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc2V0LnZhbHVlLCB0aGlzLT51LnNldC52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NPUFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml9wYWNrKCZ0aGlzLT51LmNvcHkuZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3BhY2soJnRoaXMtPnUuZGVsZXRlLmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9JTlNFUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF9wYWNrKCZ0aGlzLT51Lmluc2VydC5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUkVQTEFDRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3BhY2soJnRoaXMtPnUucmVwbGFjZS5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ0xFQVJfREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfcGFjaygmdGhpcy0+dS5jbGVhcl9kZWxldGUuZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NMRUFSX0lOU0VSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3BhY2soJnRoaXMtPnUuY2xlYXJfaW5zZXJ0LmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5yZXN1bHQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9OT1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9GT1JXQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX1FVRVVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LnNldC52YWx1ZV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DT1BZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfSU5TRVJUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUkVQTEFDRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NMRUFSX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NMRUFSX0lOU0VSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0X3VucGFjaygmdGhpcy0+cmVzdWx0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cmVzdWx0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfTk9QOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG5vIGRhdGEgdG8gdW5wYWNrICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBkYXRhIHRvIHVucGFjayAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0ZPUldBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbm8gZGF0YSB0byB1bnBhY2sgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3VucGFjaygmdGhpcy0+dS5xdWV1ZS5xdWV1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml91bnBhY2soJnRoaXMtPnUuc2V0LmZpZWxkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXQudmFsdWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9zZXRfY291bnRfdmFsdWUoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0LnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0LnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9zZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXQudmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXQudmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LnNldC52YWx1ZSwgdGhpcy0+dS5zZXQudmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DT1BZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfdW5wYWNrKCZ0aGlzLT51LmNvcHkuZmllbGQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdW5wYWNrKCZ0aGlzLT51LmRlbGV0ZS5maWVsZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9JTlNFUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF91bnBhY2soJnRoaXMtPnUuaW5zZXJ0LmZpZWxkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX1JFUExBQ0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF91bnBhY2soJnRoaXMtPnUucmVwbGFjZS5maWVsZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DTEVBUl9ERUxFVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF91bnBhY2soJnRoaXMtPnUuY2xlYXJfZGVsZXRlLmZpZWxkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NMRUFSX0lOU0VSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3VucGFjaygmdGhpcy0+dS5jbGVhcl9pbnNlcnQuZmllbGQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQgcmVzdWx0OworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0X3VucGFjaygmcmVzdWx0LCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAocmVzdWx0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfTk9QOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0RJU0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRk9SV0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YWx1ZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DT1BZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9JTlNFUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUkVQTEFDRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DTEVBUl9ERUxFVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ0xFQVJfSU5TRVJUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X3NldF9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3BhY2sodGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaGVhZGVyLnByZWNlZGVuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfQ0xBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfcGFjaygmdGhpcy0+dS5jbGF1c2UuZmllbGRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNsYXVzZS5tc2JfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jbGF1c2UubHNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3JfcGFjayh0aGlzLT51LmNsYXVzZS5vcGVyYXRvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hdGNoX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9jbGF1c2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9wYWNrKCZ0aGlzLT51LnJlc3VsdC5yZXN1bHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9FTlRSWToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA2ICsgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfbGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVzdWx0LnJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0VOVFJZOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3VucGFjaygmdGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaGVhZGVyLnByZWNlZGVuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfQ0xBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfdW5wYWNrKCZ0aGlzLT51LmNsYXVzZS5maWVsZF9jb2RlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5jbGF1c2UubXNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuY2xhdXNlLmxzYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5jbGF1c2Uub3BlcmF0b3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2xlbmd0aCA+IDApICYmICh0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hdGNoX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9jbGF1c2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF91bnBhY2soJnRoaXMtPnUucmVzdWx0LnJlc3VsdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfRU5UUlk6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlIHN1YnR5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3VucGFjaygmc3VidHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9DTEFVU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBtYXRjaF92YWx1ZV9sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZtYXRjaF92YWx1ZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBtYXRjaF92YWx1ZV9sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbWF0Y2hfdmFsdWVfbGVuZ3RoICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0VOVFJZOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnF1ZXVlX2JpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1heGltdW1fcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmJ1cnN0X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnF1ZXVlX2JpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1heGltdW1fcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmJ1cnN0X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcF9wYWNrKHRoaXMtPnRyYWZmaWNfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWF4aW11bV9yYXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwX3VucGFjaygmdGhpcy0+dHJhZmZpY190eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tYXhpbXVtX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZXZlbnRfY29kZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZW5hYmxlZF9kaXNhYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5ldmVudF9jb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5lbmFibGVkX2Rpc2FibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9uc19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThfcGFjayhiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICgyICogdGhpcy0+bGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBsZW47CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQxNl90KSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW4gKiAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndpZHRoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2VxdWVuY2VfbnVtYmVyLnNlcXVuY2VfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5vbnVfaWQuaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZmlybXdhcmVfaW5mby5ib290X3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmZpcm13YXJlX2luZm8uYm9vdF9jcmMzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZmlybXdhcmVfaW5mby5hcHBsaWNhdGlvbl92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5maXJtd2FyZV9pbmZvLmFwcGxpY2F0aW9uX2NyYzMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DSElQX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuY2hpcF9pbmZvLmplZGVjX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5jaGlwX2luZm8uY2hpcF9tb2RlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuY2hpcF9pbmZvLmNoaXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFURV9PRl9NQU5VRkFDVFVSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kYXRlX29mX21hbnVmYWN0dXJlLnllYXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZGF0ZV9vZl9tYW51ZmFjdHVyZS5tb250aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kYXRlX29mX21hbnVmYWN0dXJlLmRheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFOVUZBQ1RVUkVSX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZl9jb3VudCA+IDApICYmICh0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkZWZcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tYW51ZmFjdHVyZXJfaW5mb1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZiwgdGhpcy0+dS5tYW51ZmFjdHVyZXJfaW5mby5kZWZfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9MT0dJQ0FMX0xJTktTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm1heF9sb2dpY2FsX2xpbmtzLmJpZGlyZWN0aW9uYWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm1heF9sb2dpY2FsX2xpbmtzLmRvd25zdHJlYW1fb25seSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX0VQT05fUE9SVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubnVtX2Vwb25fcG9ydHMucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX1VOSV9QT1JUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5udW1fdW5pX3BvcnRzLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BBQ0tFVF9CVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wYWNrZXRfYnVmZmVyLnVwc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wYWNrZXRfYnVmZmVyLnVwX3F1ZXVlc19tYXhfcGVyX2xpbmspKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci51cF9xdWV1ZV9pbmNyZW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci5kb3duc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wYWNrZXRfYnVmZmVyLmRuX3F1ZXVlc19tYXhfcGVyX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci5kbl9xdWV1ZV9pbmNyZW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBhY2tldF9idWZmZXIudG90YWxfcGFja2V0X2J1ZmZlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci51cHN0cmVhbV9wYWNrZXRfYnVmZmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wYWNrZXRfYnVmZmVyLmRvd25zcmVhbV9wYWNrZXRfYnVmZmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMubnVtYmVyX29mX3F1ZXVlX3NldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXQwXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcmVwb3J0X3RocmVzaG9sZHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQwW2kwXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KSB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLm51bWJlcl9vZl9xdWV1ZV9zZXRzID4gMHgwMDAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgPiAwKSAmJiAodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQxID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0MVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3JlcG9ydF90aHJlc2hvbGRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0OyBpMSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQxW2kxXSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMubnVtYmVyX29mX3F1ZXVlX3NldHMgPiAweDAwMDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCA+IDApICYmICh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXQyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcmVwb3J0X3RocmVzaG9sZHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7IGkyKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDJbaTJdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKCh1aW50NjRfdCkgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5udW1iZXJfb2ZfcXVldWVfc2V0cyA+IDB4MDAwMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldDNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9yZXBvcnRfdGhyZXNob2xkc1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldDsgaTMrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0M1tpM10pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlX3BhY2sodGhpcy0+dS5saW5rX3N0YXRlLmxpbmtfc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT0FNX1JBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vYW1fcmF0ZS5tYXhpbXVtX29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9hbV9yYXRlLm1pbmltdW1fb2FtX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQUJMRV9TSVpFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmR5bl9sZWFybl90YWJsZV9zaXplLm1heF9tYWNfYWxsb3dlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5keW5fbGVhcm5fYWdlX2xpbWl0LmR5bmFtaWNfYWRkcmVzc19hZ2VfbGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9NQUNfVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfcGFjaygmdGhpcy0+dS5keW5fbWFjX3RhYmxlLm1hY19hZGRyZXNzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfcGFjaygmdGhpcy0+dS5zdGF0aWNfbWFjX3RhYmxlLm1hY19hZGRyZXNzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHlfcGFjayh0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5tYXhpbXVtX2NhcGFiaWxpdGllcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHlfcGFjayh0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5jdXJyZW50X2NhcGFiaWxpdGllcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGVfcGFjayh0aGlzLT51LmR5bl9sZWFybl9tb2RlLmxlYXJuaW5nX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5taW5fbWFjX2xpbWl0Lm1pbmltdW1fZ3VhcmFudGVlZF9saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFYX01BQ19BTExPV0VEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm1heF9tYWNfYWxsb3dlZC5tYXhfYWxsb3dlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hZ2dfbWFjX2xpbWl0LmFnZ3JlZ2F0ZV9tYWNfbGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUubGVuX2Vycl9kaXNjYXJkLmxlbl9lcnJvcl9kaXNjYXJkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5mbG9vZF91bmtub3duLmZsb29kX3Vua25vd24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUubG9jYWxfc3dpdGNoaW5nLmxvY2FsX3N3aXRjaGluZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfbGlua3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzID4gMCkgJiYgKHRoaXMtPnUucXVldWVfY29uZmlnLmxpbmtfY29uZmlndXJhdGlvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rX2NvbmZpZ3VyYXRpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzOyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfcGFjaygmdGhpcy0+dS5xdWV1ZV9jb25maWcubGlua19jb25maWd1cmF0aW9uW2k0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX3BvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9wb3J0cyA+IDApICYmICh0aGlzLT51LnF1ZXVlX2NvbmZpZy5wb3J0X2NvbmZpZ3VyYXRpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydF9jb25maWd1cmF0aW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcXVldWVfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9wb3J0czsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3BhY2soJnRoaXMtPnUucXVldWVfY29uZmlnLnBvcnRfY29uZmlndXJhdGlvbltpNV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0ZJTEVOQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZpcm13YXJlX2ZpbGVuYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfZmlsZW5hbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZSwgdGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfcGFjaygmdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNoLnN0YXRfdGhyZXNob2xkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3BhY2soJnRoaXMtPnUubGlua19zdGF0X3RocmVzaC5zdGF0X3RocmVzaG9sZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUua2V5X2V4cGlyeV90aW1lLnRpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV9wYWNrKHRoaXMtPnUuZW5jcnlwdF9tb2RlLmVuY3J5cHRpb25fbWV0aG9kLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9wYWNrKCZ0aGlzLT51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV9wYWNrKHRoaXMtPnUubHVlX2ZpZWxkLmZpZWxkX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3RfcGFjayh0aGlzLT51Lmx1ZV9maWVsZC5sYXllcl9zZWxlY3QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5sdWVfZmllbGQuYml0X3dvcmRfb2Zmc2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmx1ZV9maWVsZC5iaXRfb2Zmc2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmx1ZV9maWVsZC5iaXRfd2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubHVlX2ZpZWxkLnJlZmVyZW5jZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUxUX0NWTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hbHRfY3ZsYW5fZXRoZXJ0eXBlLnRwaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5hbHRfY3ZsYW5fZXRoZXJ0eXBlLmluc2VydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUxUX1NWTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hbHRfc3ZsYW5fZXRoZXJ0eXBlLnRwaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5hbHRfc3ZsYW5fZXRoZXJ0eXBlLmluc2VydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQkNfUkFURV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5iY19yYXRlX2xpbWl0LmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwX3BhY2sodGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy50cmFmZmljX3R5cGVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHNfcGFjayh0aGlzLT51LmVncmVzc19zaGFwaW5nLnJhdGVfdW5pdHMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5udW1iZXJfb2Zfc2hhcGVycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVncmVzc19zaGFwaW5nLm51bWJlcl9vZl9zaGFwZXJzID4gMCkgJiYgKHRoaXMtPnUuZWdyZXNzX3NoYXBpbmcuc2hhcGVycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzaGFwZXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZWdyZXNzX3NoYXBpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5udW1iZXJfb2Zfc2hhcGVyczsgaTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyX3BhY2soJnRoaXMtPnUuZWdyZXNzX3NoYXBpbmcuc2hhcGVyc1tpNl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzX3BhY2sodGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLnJhdGVfdW5pdHMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLm51bWJlcl9vZl9yYXRlX2xldmVscykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmluZ3Jlc3NfcG9saWNpbmcubnVtYmVyX29mX3JhdGVfbGV2ZWxzID4gMCkgJiYgKHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5yYXRlX2xldmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX2xldmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2luZ3Jlc3NfcG9saWNpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNyA9IDA7IGk3IDwgdGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLm51bWJlcl9vZl9yYXRlX2xldmVsczsgaTcrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF9wYWNrKCZ0aGlzLT51LmluZ3Jlc3NfcG9saWNpbmcucmF0ZV9sZXZlbHNbaTddLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlX3BhY2sodGhpcy0+dS5mZWNfbW9kZS5yeF9kb3duLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGVfcGFjayh0aGlzLT51LmZlY19tb2RlLnR4X3VwLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01GUl9OQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hbl9uYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbWZyX25hbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZSwgdGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRldBUkVfTUZHX1RJTUVfVkFSX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5md2FyZV9tZmdfdGltZV92YXJfY3RybC5jb2RlX2FjY2Vzc19zdGFydCwgMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZndhcmVfbWZnX3RpbWVfdmFyX2N0cmwuY3ZjX2FjY2Vzc19zdGFydCwgMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1ZFTkRPUl9OQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZlbmRvcl9uYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdmVuZG9yX25hbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWVfY291bnQgPiAzMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lLCB0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NT0RFTF9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1vZGVsX251bWJlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21vZGVsX251bWJlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyX2NvdW50ID4gMzEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyLCB0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0hXX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbl9jb3VudCA+IDApICYmICh0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJod192ZXJzaW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfaHdfdmVyc2lvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb25fY291bnQgPiAzMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbiwgdGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTg7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3RlbXBlcmF0dXJlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90ZW1wZXJhdHVyZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTggPSAwOyBpOCA8IHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlX2NvdW50OyBpOCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlW2k4XSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVkNDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk5OworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY19jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImN1cnJlbnRfdmNjXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl92Y2NcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub3B0X21vbl92Y2MuY3VycmVudF92Y2NfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTkgPSAwOyBpOSA8IHRoaXMtPnUub3B0X21vbl92Y2MuY3VycmVudF92Y2NfY291bnQ7IGk5KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY1tpOV0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RYX0JJQVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTEwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3R4X2JpYXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3R4X2JpYXNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhc19jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTAgPSAwOyBpMTAgPCB0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNfY291bnQ7IGkxMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhc1tpMTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9UWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlcl9jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3R4X3Bvd2VyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9wb3dlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTExID0gMDsgaTExIDwgdGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQ7IGkxMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0X21vbl90eF9wb3dlci5jdXJyZW50X3R4X3Bvd2VyW2kxMV0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1JYX1BPV0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub3B0X21vbl9yeF9wb3dlci5jdXJyZW50X3J4X3Bvd2VyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub3B0X21vbl9yeF9wb3dlci5jdXJyZW50X3J4X3Bvd2VyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImN1cnJlbnRfcnhfcG93ZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3J4X3Bvd2VyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcl9jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTIgPSAwOyBpMTIgPCB0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcl9jb3VudDsgaTEyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJbaTEyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X3VuaWNhc3RfZnJhbWVzLnJ4X3VuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF91bmljYXN0X2ZyYW1lcy50eF91bmljYXN0X2ZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lX3Rvb19zaG9ydC5yeF9mcmFtZXNfdG9vX3Nob3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lNjQucnhfZnJhbWVzNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjUxMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWU2NTEyNy5yeF9mcmFtZXM2NTEyNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWUxMjgyNTUucnhfZnJhbWVzMTI4MjU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NjUxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZTI1NjUxMS5yeF9mcmFtZXMyNTY1MTEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZTUxMjEwMjMucnhfZnJhbWVzNTEyMTAyMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0MTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZTEwMjQxNTE4LnJ4X2ZyYW1lczEwMjQxNTE4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lMTUxOXBsdXMucnhfZnJhbWVzMTUxOXBsdXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWU2NC50eF9mcmFtZXM2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NTEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTY1MTI3LnR4X2ZyYW1lczY1MTI3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyODI1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTEyODI1NS50eF9mcmFtZXMxMjgyNTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2NTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lMjU2NTExLnR4X2ZyYW1lczI1NjUxMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTIxMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lNTEyMTAyMy50eF9mcmFtZXM1MTIxMDIzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjQxNTE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lMTAyNDE1MTgudHhfZnJhbWVzMTAyNDE1MTgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWUxNTE5cGx1cy50eF9mcmFtZXMxNTE5cGx1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVlfVEhSRVNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfZGVsYXlfdGhyZXNoLnF1ZXVlX2RlbGF5X3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucXVldWVfZGVsYXkucXVldWVfZGVsYXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmZyYW1lc19kcm9wcGVkLmZyYW1lc19kcm9wcGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmJ5dGVzX2Ryb3BwZWQuYnl0ZXNfZHJvcHBlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQllURVNfREVMQVlFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ieXRlc19kZWxheWVkLmJ5dGVzX2RlbGF5ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9ieXRlc191bnVzZWQudHhfYnl0ZXNfdW51c2VkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9ET05VX1BPUlRfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZV9jb3VudCA+IDApICYmICh0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X3R5cGVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kb251X3BvcnRfdHlwZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxMyA9IDA7IGkxMyA8IHRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlX2NvdW50OyBpMTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlX3BhY2sodGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGVbaTEzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1VTUEVORF9SRVNVTUVfQUxBUk1fUkVQT1JUSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxNDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nLmRlZl9jb3VudCA+IDApICYmICh0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWYgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGVmXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE0ID0gMDsgaTE0IDwgdGhpcy0+dS5zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmcuZGVmX2NvdW50OyBpMTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9uc19wYWNrKCZ0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZbaTE0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVBNQ19GT1JXQVJESU5HX1JVTEVfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFnc19wYWNrKHRoaXMtPnUuaXBtY19mb3J3YXJkaW5nX3J1bGVfY29uZmlndXJhdGlvbi5maWVsZF9iaXRtYXAsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVRQSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaXRwaWQuYWx0ZXJuYXRlX2l0cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuaXRwaWQuaW5zZXJ0X3RoaXNfdHBpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQlRQSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYnRwaWQuYWx0ZXJuYXRlX2J0cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuYnRwaWQuaW5zZXJ0X3RoaXNfdHBpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ0lSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnF1ZXVlX2Npci5jb21taXRlZF9idXJzdF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jaXIuY29tbWl0ZWRfaW5mb3JtYXRpb25fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfRUlSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnF1ZXVlX2Vpci5leGNlc3NfYnVyc3Rfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucXVldWVfZWlyLnF1ZXVlX2VpcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09MT1JfTUFSS0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5lbmFibGVfY29sb3JfbWFya2luZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLmZpZWxkX2NvZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5maWVsZF9pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLm1zYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcubHNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5ncmVlbl92YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLnllbGxvd192YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfUkFURV9MSU1JVEVSX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLm51bWJlcl9vZl9yYXRlX2xpbWl0ZXJzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNic19taW5faW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNpcl9taW5faW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmVic19taW5faW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmVpcl9taW5faW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY29sb3JfYXdhcmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5jb3VwbGluZ19jb25maWd1cmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5jb3VwbGluZ19iZWhhdmlyb19kZWZhdWx0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY29sb3JfbWFya2luZ19zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuc21hcnRfY29sb3JfZHJvcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ09VUExJTkdfRkxBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNvdXBsaW5nX2ZsYWcuY291cGxpbmdfZmxhZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ0xPQ0tfVFJBTlNQT1JUX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuY2xvY2tfdHJhbnNwb3J0X2NhcGFiaWxpdGllcy5wcHNfcHVsc2Vfc3VwcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmNsb2NrX3RyYW5zcG9ydF9jYXBhYmlsaXRpZXMudG9kX3N0cmluZ19zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuY2xvY2tfdHJhbnNwb3J0X2NhcGFiaWxpdGllcy52MmZyYW1lX3N1cHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQUJMRV9DTE9DS19UUkFOU1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmVuYWJsZV9jbG9ja190cmFuc3BvcnQucHBzX3B1bHNlX291dHB1dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmVuYWJsZV9jbG9ja190cmFuc3BvcnQudG9kX3N0cmluZ19vdXRwdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5lbmFibGVfY2xvY2tfdHJhbnNwb3J0LnYyZnJhbWVfb3V0cHV0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9USU1FX1RSQU5TRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnRpbWVfdHJhbnNmZXIubXBjcF9yZWZlcmVuY2VfcG9pbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmdfY291bnQgPiAwKSAmJiAodGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmcgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidG9kX3N0cmluZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3RpbWVfdHJhbnNmZXJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmcsIHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QUk9QQUdBVElPTl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnByb3BhZ2F0aW9uX3BhcmFtZXRlcnMubmRvd24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnByb3BhZ2F0aW9uX3BhcmFtZXRlcnMubnVwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SVFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucnR0LnJ0dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZGFjX2NvbmZpZ3VyYXRpb24uc3RhZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZGFjX2NvbmZpZ3VyYXRpb24uY3RhZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT05fRU5BQkxFX0RJU0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmRhY19jb25maWd1cmF0aW9uX2VuYWJsZV9kaXNhYmxlLmxsZHBfaW5zdGFuY2Vfc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9CUk9BRENBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWVfYnJvYWRjYXN0LnJ4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19CUk9BRENBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWVzX2Jyb2FkY2FzdC50eF9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfTVVMVElDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lc19tdWx0aWNhc3QudHhfbXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX01VTFRJQ0FTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZXNfbXVsdGljYXN0LnJ4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0dSRUVOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2J5dGVzX2dyZWVuLnR4X2J5dGVzX2dyZWVuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19HUkVFTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9ieXRlc19ncmVlbi5yeF9ieXRlc19ncmVlbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX01DQVNUX0xMSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThfcGFjaygmdGhpcy0+dS5vbnVfbWNhc3RfbGxpZC5sbGlkX3ZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQUNfTEVBUk5FRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LnVuaV9tYWNfbGVhcm5lZC5tYWNfYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS51bmlfbWFjX2xlYXJuZWQudW5pX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQUNfVEFCTEVfRlVMTF9CRUhBVklPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUudW5pX21hY190YWJsZV9mdWxsX2JlaGF2aW9yLm92ZXJfd3JpdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9QV1JfU0FWSU5HX0NBUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlX3BhY2sodGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAucHdyX3NhdmluZ19tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAuZWFybHlfd2FrZV91cF9zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC52ZW5fc3BlY19maWVsZF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkX3NpemUgPiAwKSAmJiAodGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVuX3NwZWNfZmllbGRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcHdyX3NhdmluZ19jYXBcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGQsIHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19QQVNTV09SRF9DSEFMTEVOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5FUkdZX0VGRklDSUVOVF9FVEhFUk5FVF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9GUkFNRVNfRElTQ0FSREVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX0RJU0NBUkRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5FX1JBVEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NRURJQV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTUJFUl9PRl9QUk9HUkFNTUFCTEVfQ09VTlRFUlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX01BWF9GUkFNRV9TSVpFX0NBUEFCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFdSX09WRVJfRVRIRVJORVRfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfVU5JQ0FTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfWUVMTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0wyRVJST1JTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfVU5JQ0FTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfWUVMTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0wyRVJST1JTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQVhfRlJBTUVfU0laRV9MSU1JVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMtPndpZHRoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX0lEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0lORk86CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NISVBfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFURV9PRl9NQU5VRkFDVFVSRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQU5VRkFDVFVSRVJfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUubWFudWZhY3R1cmVyX2luZm8uZGVmX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFYX0xPR0lDQUxfTElOS1M6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX0VQT05fUE9SVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX1VOSV9QT1JUUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QQUNLRVRfQlVGRkVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9ICgoKDIgKyAoMiAqIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KSkgKyAoMiAqIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KSkgKyAoMiAqIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KSkgKyAoMiAqIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT0FNX1JBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RBQkxFX1NJWkU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmR5bl9tYWNfdGFibGUubWFjX2FkZHJlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zdGF0aWNfbWFjX3RhYmxlLm1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fTU9ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9NQUNfQUxMT1dFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BR0dfTUFDX0xJTUlUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJfRElTQ0FSRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzID4gMCkgJiYgKHRoaXMtPnUucXVldWVfY29uZmlnLmxpbmtfY29uZmlndXJhdGlvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm51bWJlcl9vZl9saW5rc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzOyBpMCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucXVldWVfY29uZmlnLmxpbmtfY29uZmlndXJhdGlvbltpMF0pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHMgPiAwKSAmJiAodGhpcy0+dS5xdWV1ZV9jb25maWcucG9ydF9jb25maWd1cmF0aW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibnVtYmVyX29mX3BvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHM7IGkxKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5xdWV1ZV9jb25maWcucG9ydF9jb25maWd1cmF0aW9uW2kxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0ZJTEVOQU1FOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWVfY291bnQgKyAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0g6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnBvcnRfc3RhdF90aHJlc2guc3RhdF90aHJlc2hvbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubGlua19zdGF0X3RocmVzaC5zdGF0X3RocmVzaG9sZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9NT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BTFRfQ1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FMVF9TVkxBTl9FVEhFUlRZUEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQkNfUkFURV9MSU1JVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyAoNyAqIHRoaXMtPnUuZWdyZXNzX3NoYXBpbmcubnVtYmVyX29mX3NoYXBlcnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoNSAqIHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5udW1iZXJfb2ZfcmF0ZV9sZXZlbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUZSX05BTUU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRldBUkVfTUZHX1RJTUVfVkFSX0NUUkw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1ZFTkRPUl9OQU1FOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZV9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01PREVMX05VTUJFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlcl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0hXX1ZFUlNJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVkNDOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVFhfQklBUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9ICgyICogdGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVFhfUE9XRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUub3B0X21vbl90eF9wb3dlci5jdXJyZW50X3R4X3Bvd2VyX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fUlhfUE9XRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUub3B0X21vbl9yeF9wb3dlci5jdXJyZW50X3J4X3Bvd2VyX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjUxMjc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUyNTY1MTE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTIxMDIzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNDE1MTg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjUxMjc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUyNTY1MTE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTIxMDIzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNDE1MTg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9ERUxBWV9USFJFU0g6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQllURVNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9ET05VX1BPUlRfVFlQRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1VTUEVORF9SRVNVTUVfQUxBUk1fUkVQT1JUSU5HOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVBNQ19GT1JXQVJESU5HX1JVTEVfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JVFBJRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CVFBJRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DSVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfRUlSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTE9SX01BUktJTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfUkFURV9MSU1JVEVSX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ09VUExJTkdfRkxBRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DTE9DS19UUkFOU1BPUlRfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQUJMRV9DTE9DS19UUkFOU1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVElNRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LnRpbWVfdHJhbnNmZXIudG9kX3N0cmluZ19jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BST1BBR0FUSU9OX1BBUkFNRVRFUlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlRUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OX0VOQUJMRV9ESVNBQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX0JST0FEQ0FTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfQlJPQURDQVNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19NVUxUSUNBU1Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX01VTFRJQ0FTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19HUkVFTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19HUkVFTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfTUNBU1RfTExJRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vbnVfbWNhc3RfbGxpZC5sbGlkX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQUNfTEVBUk5FRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFDX1RBQkxFX0ZVTExfQkVIQVZJT1I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX1BXUl9TQVZJTkdfQ0FQOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMyArIHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkX3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9GTEFHUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX1BBU1NXT1JEX0NIQUxMRU5HRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5FUkdZX0VGRklDSUVOVF9FVEhFUk5FVF9TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX0RJU0NBUkRFRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9GUkFNRVNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19ESVNDQVJERUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElORV9SQVRFX01PREU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01FRElBX1RZUEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTUJFUl9PRl9QUk9HUkFNTUFCTEVfQ09VTlRFUlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQVhfRlJBTUVfU0laRV9DQVBBQklMSVRZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QV1JfT1ZFUl9FVEhFUk5FVF9TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX1lFTExPVzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1VOSUNBU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19ZRUxMT1c6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0wyRVJST1JTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ZRUxMT1c6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19VTklDQVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfWUVMTE9XOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9MMkVSUk9SUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BWF9GUkFNRV9TSVpFX0xJTUlUOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZGVmLnVua25vd25fY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNlcXVlbmNlX251bWJlci5zZXF1bmNlX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfaWQuaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5maXJtd2FyZV9pbmZvLmJvb3RfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5maXJtd2FyZV9pbmZvLmJvb3RfY3JjMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZmlybXdhcmVfaW5mby5hcHBsaWNhdGlvbl92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmZpcm13YXJlX2luZm8uYXBwbGljYXRpb25fY3JjMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NISVBfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNoaXBfaW5mby5qZWRlY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jaGlwX2luZm8uY2hpcF9tb2RlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jaGlwX2luZm8uY2hpcF92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQVRFX09GX01BTlVGQUNUVVJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGF0ZV9vZl9tYW51ZmFjdHVyZS55ZWFyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGF0ZV9vZl9tYW51ZmFjdHVyZS5tb250aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRhdGVfb2ZfbWFudWZhY3R1cmUuZGF5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQU5VRkFDVFVSRVJfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21hbnVmYWN0dXJlcl9pbmZvX2NvdW50X2RlZigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZl9jb3VudCA+IDApICYmICh0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRlZlwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21hbnVmYWN0dXJlcl9pbmZvXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubWFudWZhY3R1cmVyX2luZm8uZGVmID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubWFudWZhY3R1cmVyX2luZm8uZGVmX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZiwgdGhpcy0+dS5tYW51ZmFjdHVyZXJfaW5mby5kZWZfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9MT0dJQ0FMX0xJTktTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWF4X2xvZ2ljYWxfbGlua3MuYmlkaXJlY3Rpb25hbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5tYXhfbG9naWNhbF9saW5rcy5kb3duc3RyZWFtX29ubHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTV9FUE9OX1BPUlRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubnVtX2Vwb25fcG9ydHMucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX1VOSV9QT1JUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm51bV91bmlfcG9ydHMucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUEFDS0VUX0JVRkZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGFja2V0X2J1ZmZlci51cHN0cmVhbV9xdWV1ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLnVwX3F1ZXVlc19tYXhfcGVyX2xpbmspKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLnVwX3F1ZXVlX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBhY2tldF9idWZmZXIuZG93bnN0cmVhbV9xdWV1ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLmRuX3F1ZXVlc19tYXhfcGVyX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLmRuX3F1ZXVlX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLnRvdGFsX3BhY2tldF9idWZmZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGFja2V0X2J1ZmZlci51cHN0cmVhbV9wYWNrZXRfYnVmZmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBhY2tldF9idWZmZXIuZG93bnNyZWFtX3BhY2tldF9idWZmZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLm51bWJlcl9vZl9xdWV1ZV9zZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldDBcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9yZXBvcnRfdGhyZXNob2xkc1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDAgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MFtpMF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKCh1aW50NjRfdCkgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5udW1iZXJfb2ZfcXVldWVfc2V0cyA+IDB4MDAwMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXQxXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcmVwb3J0X3RocmVzaG9sZHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDEgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7IGkxKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MVtpMV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KSB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLm51bWJlcl9vZl9xdWV1ZV9zZXRzID4gMHgwMDAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgPiAwKSAmJiAodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQyID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldDJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9yZXBvcnRfdGhyZXNob2xkc1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MiA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldDsgaTIrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQyW2kyXSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMubnVtYmVyX29mX3F1ZXVlX3NldHMgPiAweDAwMDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCA+IDApICYmICh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0M1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3JlcG9ydF90aHJlc2hvbGRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQzID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTM7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0OyBpMysrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDNbaTNdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZV91bnBhY2soJnRoaXMtPnUubGlua19zdGF0ZS5saW5rX3N0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT0FNX1JBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9hbV9yYXRlLm1heGltdW1fb2FtX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vYW1fcmF0ZS5taW5pbXVtX29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEFCTEVfU0laRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmR5bl9sZWFybl90YWJsZV9zaXplLm1heF9tYWNfYWxsb3dlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmR5bl9sZWFybl9hZ2VfbGltaXQuZHluYW1pY19hZGRyZXNzX2FnZV9saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV91bnBhY2soJnRoaXMtPnUuZHluX21hY190YWJsZS5tYWNfYWRkcmVzcywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV91bnBhY2soJnRoaXMtPnUuc3RhdGljX21hY190YWJsZS5tYWNfYWRkcmVzcywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eV91bnBhY2soJnRoaXMtPnUucG9ydF9jYXBhYmlsaXR5Lm1heGltdW1fY2FwYWJpbGl0aWVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5X3VucGFjaygmdGhpcy0+dS5wb3J0X2NhcGFiaWxpdHkuY3VycmVudF9jYXBhYmlsaXRpZXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGVfdW5wYWNrKCZ0aGlzLT51LmR5bl9sZWFybl9tb2RlLmxlYXJuaW5nX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWluX21hY19saW1pdC5taW5pbXVtX2d1YXJhbnRlZWRfbGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9NQUNfQUxMT1dFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1heF9tYWNfYWxsb3dlZC5tYXhfYWxsb3dlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFnZ19tYWNfbGltaXQuYWdncmVnYXRlX21hY19saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTEVOX0VSUl9ESVNDQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxlbl9lcnJfZGlzY2FyZC5sZW5fZXJyb3JfZGlzY2FyZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mbG9vZF91bmtub3duLmZsb29kX3Vua25vd24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sb2NhbF9zd2l0Y2hpbmcubG9jYWxfc3dpdGNoaW5nKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9saW5rcyA+IDApICYmICh0aGlzLT51LnF1ZXVlX2NvbmZpZy5saW5rX2NvbmZpZ3VyYXRpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rX2NvbmZpZ3VyYXRpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5xdWV1ZV9jb25maWcubGlua19jb25maWd1cmF0aW9uID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzOyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfdW5wYWNrKCZ0aGlzLT51LnF1ZXVlX2NvbmZpZy5saW5rX2NvbmZpZ3VyYXRpb25baTRdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX3BvcnRzID4gMCkgJiYgKHRoaXMtPnUucXVldWVfY29uZmlnLnBvcnRfY29uZmlndXJhdGlvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRfY29uZmlndXJhdGlvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnF1ZXVlX2NvbmZpZy5wb3J0X2NvbmZpZ3VyYXRpb24gPSAoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHMgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHM7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldF91bnBhY2soJnRoaXMtPnUucXVldWVfY29uZmlnLnBvcnRfY29uZmlndXJhdGlvbltpNV0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9GSUxFTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfZmlsZW5hbWVfY291bnRfZmlybXdhcmVfZmlsZW5hbWUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmlybXdhcmVfZmlsZW5hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9maXJtd2FyZV9maWxlbmFtZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWUsIHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3VucGFjaygmdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNoLnN0YXRfdGhyZXNob2xkLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF91bnBhY2soJnRoaXMtPnUubGlua19zdGF0X3RocmVzaC5zdGF0X3RocmVzaG9sZCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfS0VZX0VYUElSWV9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUua2V5X2V4cGlyeV90aW1lLnRpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV91bnBhY2soJnRoaXMtPnUuZW5jcnlwdF9tb2RlLmVuY3J5cHRpb25fbWV0aG9kLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3VucGFjaygmdGhpcy0+dS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MVUVfRklFTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlX3VucGFjaygmdGhpcy0+dS5sdWVfZmllbGQuZmllbGRfY29kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0X3VucGFjaygmdGhpcy0+dS5sdWVfZmllbGQubGF5ZXJfc2VsZWN0LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmx1ZV9maWVsZC5iaXRfd29yZF9vZmZzZXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sdWVfZmllbGQuYml0X29mZnNldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmx1ZV9maWVsZC5iaXRfd2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sdWVfZmllbGQucmVmZXJlbmNlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BTFRfQ1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWx0X2N2bGFuX2V0aGVydHlwZS50cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hbHRfY3ZsYW5fZXRoZXJ0eXBlLmluc2VydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUxUX1NWTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFsdF9zdmxhbl9ldGhlcnR5cGUudHBpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWx0X3N2bGFuX2V0aGVydHlwZS5pbnNlcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JDX1JBVEVfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5iY19yYXRlX2xpbWl0LmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwX3VucGFjaygmdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy50cmFmZmljX3R5cGVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0c191bnBhY2soJnRoaXMtPnUuZWdyZXNzX3NoYXBpbmcucmF0ZV91bml0cywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5udW1iZXJfb2Zfc2hhcGVycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVncmVzc19zaGFwaW5nLm51bWJlcl9vZl9zaGFwZXJzID4gMCkgJiYgKHRoaXMtPnUuZWdyZXNzX3NoYXBpbmcuc2hhcGVycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNoYXBlcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9lZ3Jlc3Nfc2hhcGluZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVncmVzc19zaGFwaW5nLnNoYXBlcnMgPSAoYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVncmVzc19zaGFwaW5nLm51bWJlcl9vZl9zaGFwZXJzICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5udW1iZXJfb2Zfc2hhcGVyczsgaTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyX3VucGFjaygmdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5zaGFwZXJzW2k2XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzX3VucGFjaygmdGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLnJhdGVfdW5pdHMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5udW1iZXJfb2ZfcmF0ZV9sZXZlbHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLm51bWJlcl9vZl9yYXRlX2xldmVscyA+IDApICYmICh0aGlzLT51LmluZ3Jlc3NfcG9saWNpbmcucmF0ZV9sZXZlbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX2xldmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2luZ3Jlc3NfcG9saWNpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLnJhdGVfbGV2ZWxzID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5udW1iZXJfb2ZfcmF0ZV9sZXZlbHMgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNyA9IDA7IGk3IDwgdGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLm51bWJlcl9vZl9yYXRlX2xldmVsczsgaTcrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF91bnBhY2soJnRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5yYXRlX2xldmVsc1tpN10sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlX3VucGFjaygmdGhpcy0+dS5mZWNfbW9kZS5yeF9kb3duLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZV91bnBhY2soJnRoaXMtPnUuZmVjX21vZGUudHhfdXAsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NRlJfTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbWZyX25hbWVfY291bnRfbWFuX25hbWUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWFuX25hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tZnJfbmFtZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubWZyX25hbWUubWFuX25hbWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubWZyX25hbWUubWFuX25hbWUsIHRoaXMtPnUubWZyX25hbWUubWFuX25hbWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZXQVJFX01GR19USU1FX1ZBUl9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmZ3YXJlX21mZ190aW1lX3Zhcl9jdHJsLmNvZGVfYWNjZXNzX3N0YXJ0LCAxMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZndhcmVfbWZnX3RpbWVfdmFyX2N0cmwuY3ZjX2FjY2Vzc19zdGFydCwgMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1ZFTkRPUl9OQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV92ZW5kb3JfbmFtZV9jb3VudF92ZW5kb3JfbmFtZSgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2ZW5kb3JfbmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3ZlbmRvcl9uYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZV9jb3VudCA+IDMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lLCB0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NT0RFTF9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbW9kZWxfbnVtYmVyX2NvdW50X21vZGVsX251bWJlcigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibW9kZWxfbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbW9kZWxfbnVtYmVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlciA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXJfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlcl9jb3VudCA+IDMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXIsIHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSFdfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2h3X3ZlcnNpb25fY291bnRfaHdfdmVyc2lvbigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbl9jb3VudCA+IDApICYmICh0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImh3X3ZlcnNpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9od192ZXJzaW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuaHdfdmVyc2lvbi5od192ZXJzaW9uID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuaHdfdmVyc2lvbi5od192ZXJzaW9uX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbl9jb3VudCA+IDMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbiwgdGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTg7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3RlbXBlcmF0dXJlX2NvdW50X2N1cnJlbnRfdGVtcGVyYXR1cmUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3RlbXBlcmF0dXJlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90ZW1wZXJhdHVyZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZSA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZV9jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpOCA9IDA7IGk4IDwgdGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQ7IGk4KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZVtpOF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1ZDQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpOTsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl92Y2NfY291bnRfY3VycmVudF92Y2MoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY19jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY3VycmVudF92Y2NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3ZjY1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY19jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpOSA9IDA7IGk5IDwgdGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY19jb3VudDsgaTkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0X21vbl92Y2MuY3VycmVudF92Y2NbaTldKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9UWF9CSUFTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxMDsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3R4X2JpYXNfY291bnRfY3VycmVudF90eF9iaWFzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3R4X2JpYXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3R4X2JpYXNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEwID0gMDsgaTEwIDwgdGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzX2NvdW50OyBpMTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhc1tpMTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9UWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTE7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3R4X3Bvd2VyX2NvdW50X2N1cnJlbnRfdHhfcG93ZXIoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3R4X3Bvd2VyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9wb3dlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlciA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlcl9jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTEgPSAwOyBpMTEgPCB0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlcl9jb3VudDsgaTExKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlcltpMTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9SWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTI7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3J4X3Bvd2VyX2NvdW50X2N1cnJlbnRfcnhfcG93ZXIoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3J4X3Bvd2VyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl9yeF9wb3dlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlciA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcl9jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTIgPSAwOyBpMTIgPCB0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcl9jb3VudDsgaTEyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcltpMTJdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF91bmljYXN0X2ZyYW1lcy5yeF91bmljYXN0X2ZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF91bmljYXN0X2ZyYW1lcy50eF91bmljYXN0X2ZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWVfdG9vX3Nob3J0LnJ4X2ZyYW1lc190b29fc2hvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTY0LnJ4X2ZyYW1lczY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1MTI3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWU2NTEyNy5yeF9mcmFtZXM2NTEyNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTEyODI1NS5yeF9mcmFtZXMxMjgyNTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2NTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWUyNTY1MTEucnhfZnJhbWVzMjU2NTExKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMjEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTUxMjEwMjMucnhfZnJhbWVzNTEyMTAyMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0MTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lMTAyNDE1MTgucnhfZnJhbWVzMTAyNDE1MTgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTE1MTlwbHVzLnJ4X2ZyYW1lczE1MTlwbHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWU2NC50eF9mcmFtZXM2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NTEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lNjUxMjcudHhfZnJhbWVzNjUxMjcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4MjU1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWUxMjgyNTUudHhfZnJhbWVzMTI4MjU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NjUxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lMjU2NTExLnR4X2ZyYW1lczI1NjUxMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTIxMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWU1MTIxMDIzLnR4X2ZyYW1lczUxMjEwMjMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNDE1MTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZTEwMjQxNTE4LnR4X2ZyYW1lczEwMjQxNTE4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWUxNTE5cGx1cy50eF9mcmFtZXMxNTE5cGx1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVlfVEhSRVNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9kZWxheV90aHJlc2gucXVldWVfZGVsYXlfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2RlbGF5LnF1ZXVlX2RlbGF5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmZyYW1lc19kcm9wcGVkLmZyYW1lc19kcm9wcGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYnl0ZXNfZHJvcHBlZC5ieXRlc19kcm9wcGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYnl0ZXNfZGVsYXllZC5ieXRlc19kZWxheWVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9ieXRlc191bnVzZWQudHhfYnl0ZXNfdW51c2VkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9ET05VX1BPUlRfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTM7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kb251X3BvcnRfdHlwZV9jb3VudF9wb3J0X3R5cGUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X3R5cGVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kb251X3BvcnRfdHlwZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZSA9IChiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTMgPSAwOyBpMTMgPCB0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZV9jb3VudDsgaTEzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZV91bnBhY2soJnRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlW2kxM10sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1VTUEVORF9SRVNVTUVfQUxBUk1fUkVQT1JUSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxNDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmdfY291bnRfZGVmKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nLmRlZl9jb3VudCA+IDApICYmICh0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWYgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkZWZcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmcuZGVmID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nLmRlZl9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxNCA9IDA7IGkxNCA8IHRoaXMtPnUuc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nLmRlZl9jb3VudDsgaTE0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfdW5wYWNrKCZ0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZbaTE0XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lQTUNfRk9SV0FSRElOR19SVUxFX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3NfdW5wYWNrKCZ0aGlzLT51LmlwbWNfZm9yd2FyZGluZ19ydWxlX2NvbmZpZ3VyYXRpb24uZmllbGRfYml0bWFwLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVRQSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5pdHBpZC5hbHRlcm5hdGVfaXRwaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lml0cGlkLmluc2VydF90aGlzX3RwaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JUUElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYnRwaWQuYWx0ZXJuYXRlX2J0cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5idHBpZC5pbnNlcnRfdGhpc190cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DSVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jaXIuY29tbWl0ZWRfYnVyc3Rfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jaXIuY29tbWl0ZWRfaW5mb3JtYXRpb25fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfRUlSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfZWlyLmV4Y2Vzc19idXJzdF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2Vpci5xdWV1ZV9laXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTE9SX01BUktJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5lbmFibGVfY29sb3JfbWFya2luZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcuZmllbGRfY29kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcuZmllbGRfaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLm1zYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5sc2JfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcuZ3JlZW5fdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLnllbGxvd192YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfUkFURV9MSU1JVEVSX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMubnVtYmVyX29mX3JhdGVfbGltaXRlcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5jYnNfbWluX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNpcl9taW5faW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuZWJzX21pbl9pbmNyZW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5laXJfbWluX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY29sb3JfYXdhcmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNvdXBsaW5nX2NvbmZpZ3VyYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY291cGxpbmdfYmVoYXZpcm9fZGVmYXVsdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY29sb3JfbWFya2luZ19zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5zbWFydF9jb2xvcl9kcm9wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DT1VQTElOR19GTEFHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jb3VwbGluZ19mbGFnLmNvdXBsaW5nX2ZsYWcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NMT0NLX1RSQU5TUE9SVF9DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2xvY2tfdHJhbnNwb3J0X2NhcGFiaWxpdGllcy5wcHNfcHVsc2Vfc3VwcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2xvY2tfdHJhbnNwb3J0X2NhcGFiaWxpdGllcy50b2Rfc3RyaW5nX3N1cHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNsb2NrX3RyYW5zcG9ydF9jYXBhYmlsaXRpZXMudjJmcmFtZV9zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkFCTEVfQ0xPQ0tfVFJBTlNQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmVuYWJsZV9jbG9ja190cmFuc3BvcnQucHBzX3B1bHNlX291dHB1dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5hYmxlX2Nsb2NrX3RyYW5zcG9ydC50b2Rfc3RyaW5nX291dHB1dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5hYmxlX2Nsb2NrX3RyYW5zcG9ydC52MmZyYW1lX291dHB1dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVElNRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnRpbWVfdHJhbnNmZXIubXBjcF9yZWZlcmVuY2VfcG9pbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdGltZV90cmFuc2Zlcl9jb3VudF90b2Rfc3RyaW5nKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidG9kX3N0cmluZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3RpbWVfdHJhbnNmZXJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmcgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmdfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nLCB0aGlzLT51LnRpbWVfdHJhbnNmZXIudG9kX3N0cmluZ19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFJPUEFHQVRJT05fUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnByb3BhZ2F0aW9uX3BhcmFtZXRlcnMubmRvd24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucHJvcGFnYXRpb25fcGFyYW1ldGVycy5udXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JUVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ0dC5ydHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGFjX2NvbmZpZ3VyYXRpb24uc3RhZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kYWNfY29uZmlndXJhdGlvbi5jdGFnKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9FTkFCTEVfRElTQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kYWNfY29uZmlndXJhdGlvbl9lbmFibGVfZGlzYWJsZS5sbGRwX2luc3RhbmNlX3N0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfQlJPQURDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWVfYnJvYWRjYXN0LnJ4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19CUk9BRENBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZXNfYnJvYWRjYXN0LnR4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19NVUxUSUNBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZXNfbXVsdGljYXN0LnR4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19NVUxUSUNBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZXNfbXVsdGljYXN0LnJ4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0dSRUVOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfYnl0ZXNfZ3JlZW4udHhfYnl0ZXNfZ3JlZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0dSRUVOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfYnl0ZXNfZ3JlZW4ucnhfYnl0ZXNfZ3JlZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQ0FTVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X3VucGFjaygmdGhpcy0+dS5vbnVfbWNhc3RfbGxpZC5sbGlkX3ZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFDX0xFQVJORUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnVuaV9tYWNfbGVhcm5lZC5tYWNfYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnVuaV9tYWNfbGVhcm5lZC51bmlfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BQ19UQUJMRV9GVUxMX0JFSEFWSU9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnVuaV9tYWNfdGFibGVfZnVsbF9iZWhhdmlvci5vdmVyX3dyaXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfUFdSX1NBVklOR19DQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZV91bnBhY2soJnRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnB3cl9zYXZpbmdfbW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC5lYXJseV93YWtlX3VwX3N1cHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGRfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC52ZW5fc3BlY19maWVsZF9zaXplID4gMCkgJiYgKHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVuX3NwZWNfZmllbGRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcHdyX3NhdmluZ19jYXBcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGQgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGRfc2l6ZSAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGQsIHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19QQVNTV09SRF9DSEFMTEVOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5FUkdZX0VGRklDSUVOVF9FVEhFUk5FVF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9GUkFNRVNfRElTQ0FSREVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX0RJU0NBUkRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5FX1JBVEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NRURJQV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTUJFUl9PRl9QUk9HUkFNTUFCTEVfQ09VTlRFUlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX01BWF9GUkFNRV9TSVpFX0NBUEFCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFdSX09WRVJfRVRIRVJORVRfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfVU5JQ0FTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfWUVMTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0wyRVJST1JTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfVU5JQ0FTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfWUVMTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0wyRVJST1JTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQVhfRlJBTUVfU0laRV9MSU1JVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZSBsZWFmOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NISVBfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQVRFX09GX01BTlVGQUNUVVJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BTlVGQUNUVVJFUl9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlZmF1bHRfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGRlZmF1bHRfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTE9HSUNBTF9MSU5LUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTV9FUE9OX1BPUlRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1fVU5JX1BPUlRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QQUNLRVRfQlVGRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQxNl90KSAqIHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCAqIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDE2X3QpICogcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PQU1fUkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQUJMRV9TSVpFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RBQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTUFDX0FMTE9XRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTE9DQUxfU1dJVENISU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfbGlua3M7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICB1aW50OF90IG51bWJlcl9vZl9wb3J0czsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbnVtYmVyX29mX2xpbmtzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCkgKiBudW1iZXJfb2ZfbGlua3MpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IG51bWJlcl9vZl9saW5rczsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbnVtYmVyX29mX3BvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCkgKiBudW1iZXJfb2ZfcG9ydHMpOworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IG51bWJlcl9vZl9wb3J0czsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0ZJTEVOQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcm13YXJlX2ZpbGVuYW1lX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkdW1teTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZkdW1teSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR1bW15ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmlybXdhcmVfZmlsZW5hbWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChmaXJtd2FyZV9maWxlbmFtZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FMVF9DVkxBTl9FVEhFUlRZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BTFRfU1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQkNfUkFURV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2Zfc2hhcGVyczsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbnVtYmVyX29mX3NoYXBlcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyKSAqIG51bWJlcl9vZl9zaGFwZXJzKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgbnVtYmVyX29mX3NoYXBlcnMgKiA3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JTkdSRVNTX1BPTElDSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX3JhdGVfbGV2ZWxzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm51bWJlcl9vZl9yYXRlX2xldmVscykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsKSAqIG51bWJlcl9vZl9yYXRlX2xldmVscyk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIG51bWJlcl9vZl9yYXRlX2xldmVscyAqIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUZSX05BTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbWFuX25hbWVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWFuX25hbWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChtYW5fbmFtZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZXQVJFX01GR19USU1FX1ZBUl9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9WRU5ET1JfTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2ZW5kb3JfbmFtZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2ZW5kb3JfbmFtZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZlbmRvcl9uYW1lX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTU9ERUxfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vZGVsX251bWJlcl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtb2RlbF9udW1iZXJfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChtb2RlbF9udW1iZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9IV19WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGh3X3ZlcnNpb25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaHdfdmVyc2lvbl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGh3X3ZlcnNpb25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RFTVBFUkFUVVJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfdGVtcGVyYXR1cmVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wZXJhdHVyZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGN1cnJlbnRfdGVtcGVyYXR1cmVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9WQ0M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudF92Y2NfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF92Y2NfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjdXJyZW50X3ZjY19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RYX0JJQVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudF90eF9iaWFzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHhfYmlhc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGN1cnJlbnRfdHhfYmlhc19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RYX1BPV0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfdHhfcG93ZXJfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF90eF9wb3dlcl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGN1cnJlbnRfdHhfcG93ZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9SWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50X3J4X3Bvd2VyX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcnhfcG93ZXJfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjdXJyZW50X3J4X3Bvd2VyX2VsZW1fY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1MTI3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyODI1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUyNTY1MTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0MTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NTEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2NTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMjEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNDE1MTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0RFTEFZX1RIUkVTSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RPTlVfUE9SVF9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfdHlwZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwb3J0X3R5cGVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwb3J0X3R5cGVfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NVU1BFTkRfUkVTVU1FX0FMQVJNX1JFUE9SVElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWZhdWx0X2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChkZWZhdWx0X2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVBNQ19GT1JXQVJESU5HX1JVTEVfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVRQSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CVFBJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NJUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0VJUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTE9SX01BUktJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX1JBVEVfTElNSVRFUl9DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NPVVBMSU5HX0ZMQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NMT0NLX1RSQU5TUE9SVF9DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5BQkxFX0NMT0NLX1RSQU5TUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9USU1FX1RSQU5TRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRvZF9zdHJpbmdfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRvZF9zdHJpbmdfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh0b2Rfc3RyaW5nX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFJPUEFHQVRJT05fUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JUVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9FTkFCTEVfRElTQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfQlJPQURDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfQlJPQURDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfTVVMVElDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfTVVMVElDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19HUkVFTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfR1JFRU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQ0FTVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BQ19MRUFSTkVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BQ19UQUJMRV9GVUxMX0JFSEFWSU9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfUFdSX1NBVklOR19DQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB2ZW5fc3BlY19maWVsZF9zaXplOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ2ZW5fc3BlY19maWVsZF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogdmVuX3NwZWNfZmllbGRfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHZlbl9zcGVjX2ZpZWxkX3NpemUgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfUEFTU1dPUkRfQ0hBTExFTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VORVJHWV9FRkZJQ0lFTlRfRVRIRVJORVRfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX0RJU0NBUkRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19ESVNDQVJERUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElORV9SQVRFX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUVESUFfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1CRVJfT0ZfUFJPR1JBTU1BQkxFX0NPVU5URVJTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQVhfRlJBTUVfU0laRV9DQVBBQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BXUl9PVkVSX0VUSEVSTkVUX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ZRUxMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1VOSUNBU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9MMkVSUk9SUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ZRUxMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1VOSUNBU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9MMkVSUk9SUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFYX0ZSQU1FX1NJWkVfTElNSVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tYW51ZmFjdHVyZXJfaW5mb19jb3VudF9kZWYoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfZmlsZW5hbWVfY291bnRfZmlybXdhcmVfZmlsZW5hbWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50OF90IGR1bW15OworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkdW1teSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbWZyX25hbWVfY291bnRfbWFuX25hbWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdmVuZG9yX25hbWVfY291bnRfdmVuZG9yX25hbWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbW9kZWxfbnVtYmVyX2NvdW50X21vZGVsX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9od192ZXJzaW9uX2NvdW50X2h3X3ZlcnNpb24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90ZW1wZXJhdHVyZV9jb3VudF9jdXJyZW50X3RlbXBlcmF0dXJlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdmNjX2NvdW50X2N1cnJlbnRfdmNjKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdHhfYmlhc19jb3VudF9jdXJyZW50X3R4X2JpYXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9wb3dlcl9jb3VudF9jdXJyZW50X3R4X3Bvd2VyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fcnhfcG93ZXJfY291bnRfY3VycmVudF9yeF9wb3dlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kb251X3BvcnRfdHlwZV9jb3VudF9wb3J0X3R5cGUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nX2NvdW50X2RlZihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV90aW1lX3RyYW5zZmVyX2NvdW50X3RvZF9zdHJpbmcoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+bWFjX2FkZHJlc3NfY291bnQgPiAwKSAmJiAodGhpcy0+bWFjX2FkZHJlc3MgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWFjX2FkZHJlc3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm1hY19hZGRyZXNzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3NbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGUgKnRoaXMpCit7CisgICAgcmV0dXJuICg2ICogdGhpcy0+bWFjX2FkZHJlc3NfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgdGhpcy0+bWFjX2FkZHJlc3NfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX2NvdW50X21hY19hZGRyZXNzKGJ1Zik7CisgICAgaWYgKCh0aGlzLT5tYWNfYWRkcmVzc19jb3VudCA+IDApICYmICh0aGlzLT5tYWNfYWRkcmVzcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hY19hZGRyZXNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5tYWNfYWRkcmVzcyA9IChiY21vc19tYWNfYWRkcmVzcyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bWFjX2FkZHJlc3NfY291bnQgKiBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm1hY19hZGRyZXNzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3NbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbWFjX2FkZHJlc3NfZWxlbV9jb3VudCA9IDA7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1hY19hZGRyZXNzX2VsZW1fY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobWFjX2FkZHJlc3NfZWxlbV9jb3VudCAqIHNpemVvZihiY21vc19tYWNfYWRkcmVzcykpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV9jb3VudF9tYWNfYWRkcmVzcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlX3BhY2sodGhpcy0+ZXZlbnRfY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmV2ZW50X2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfU1RBVElTVElDU19BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuc3RhdGlzdGljc19hbGFybS5yYWlzZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGVfcGFjayh0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0ub2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc3RhdGlzdGljc19hbGFybS5vYmplY3RfaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc3RhdGlzdGljc19hbGFybS5zdGF0X2JyYW5jaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc3RhdGlzdGljc19hbGFybS5zdGF0X2xlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfS0VZRVhDSEFOR0VfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX01BQ19UQUJMRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX09OVV9CVVNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1BPV0VSX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmRlZi5yYWlzZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGVfcGFjayh0aGlzLT51LmRlZi5vYmplY3RfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYub2JqZWN0X2luc3RhbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5ldmVudF9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1NUQVRJU1RJQ1NfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfS0VZRVhDSEFOR0VfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX01BQ19UQUJMRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX09OVV9CVVNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1BPV0VSX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZV91bnBhY2soJnRoaXMtPmV2ZW50X2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5ldmVudF9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1NUQVRJU1RJQ1NfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0ucmFpc2VkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3VucGFjaygmdGhpcy0+dS5zdGF0aXN0aWNzX2FsYXJtLm9iamVjdF90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0ub2JqZWN0X2luc3RhbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0uc3RhdF9icmFuY2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0uc3RhdF9sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0tFWUVYQ0hBTkdFX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9NQUNfVEFCTEVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9PTlVfQlVTWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1BPUlRfRElTQUJMRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9QT1dFUl9GQUlMVVJFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dS5kZWYucmFpc2VkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3VucGFjaygmdGhpcy0+dS5kZWYub2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLm9iamVjdF9pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSBldmVudF9jb2RlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZV91bnBhY2soJmV2ZW50X2NvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChldmVudF9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1NUQVRJU1RJQ1NfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfS0VZRVhDSEFOR0VfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX01BQ19UQUJMRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX09OVV9CVVNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1BPV0VSX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfUkVBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZV9wYWNrKHRoaXMtPnUuZmlsZV9yZWFkLmZpbGVfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1dSSVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmaWxlbmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9maWxlX3dyaXRlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWVfY291bnQgPiAxMjgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lLCB0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5maWxlX2RhdGEuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9maWxlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5maWxlX2RhdGEuZGF0YSwgdGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5maWxlX2Fjay5ibG9jaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yX3BhY2sodGhpcy0+dS5maWxlX2Fjay5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfUkVBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9XUklURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWVfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArIHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlX3VucGFjaygmdGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1JFQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGVfdW5wYWNrKCZ0aGlzLT51LmZpbGVfcmVhZC5maWxlX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9XUklURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfZmlsZV93cml0ZV9jb3VudF9maWxlbmFtZShidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZpbGVuYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX2ZpbGVfd3JpdGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50ID4gMTI4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lLCB0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5maWxlX2RhdGEuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX2ZpbGVfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmZpbGVfZGF0YS5kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEsIHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZmlsZV9hY2suYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvcl91bnBhY2soJnRoaXMtPnUuZmlsZV9hY2suZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlIG9wY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1JFQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1dSSVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGVuYW1lX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGZpbGVuYW1lX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsZW5ndGgpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfZmlsZV93cml0ZV9jb3VudF9maWxlbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfSU5GT19UTFZfVFlQRV9EUE9FX09BTV9TVVBQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZHBvZV9vYW1fc3VwcG9ydC5kcG9lX29hbV92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfSU5GT19UTFZfVFlQRV9EUE9FX09BTV9TVVBQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0lORk9fVExWX1RZUEVfRFBPRV9PQU1fU1VQUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmRwb2Vfb2FtX3N1cHBvcnQuZHBvZV9vYW1fdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZSB0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9JTkZPX1RMVl9UWVBFX0RQT0VfT0FNX1NVUFBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV91OHZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT52YWx1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT52YWx1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndpZHRoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2lkLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZXNfdHhfb2sudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX3NpbmdsZV9jb2xsX2ZyYW1lcy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19tdWx0aXBsZV9jb2xsX2ZyYW1lcy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX3J4X29rLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZDU19FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfZmNzX2Vyci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BTElHTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfYWxpZ25fZXJyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19vY3RldHNfdHhfb2sudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX2RlZmVycmVkLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19sYXRlX2NvbGxpc2lvbnMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfZXhjZXNzaXZlX2NvbGxpc2lvbnMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZXNfbG9zdF9tYWNfdHhfZXJyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUlJJRVJfU0VOU0VfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfY2Fycmllcl9zZW5zZV9lcnIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX29jdGV0c19yeF9vay52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2ZyYW1lc19sb3N0X21hY19yeF9lcnIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX21jYXN0X2ZyYW1lc190eF9vay52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfYmNhc3RfZnJhbWVzX3R4X29rLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2ZyX2V4Y2Vzc2l2ZV9kZWZlcnJhbC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfbWNhc3RfZnJhbWVzX3J4X29rLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19iY2FzdF9mcmFtZXNfcnhfb2sudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19pbl9yYW5nZV9sZW5fZXJyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX291dF9vZl9yYW5nZV9sZW5fZXJyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2ZyYW1lX3Rvb19sb25nLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lm1hY19lbmFibGVfc3RhdHVzLnN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51Lm1hY19hZGRyLm1hY19hZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV9wYWNrKHRoaXMtPnUucGh5X3R5cGUudHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUucGh5X3N5bWJvbF9lcnJfZHVyaW5nX2NhcnJpZXIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlX3BhY2sodGhpcy0+dS5waHlfYWRtaW5fc3RhdGUuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV9wYWNrKHRoaXMtPnUubWF1X21lZGlhX2F2YWlsLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV9wYWNrKCZ0aGlzLT51LmF1dG9fbmVnX2lkLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZV9wYWNrKHRoaXMtPnUuYXV0b19uZWdfYWRtaW5fc3RhdGUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZ19wYWNrKHRoaXMtPnUuYXV0b19uZWdfcmVtb3RlX3NpZy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWdfcGFjayh0aGlzLT51LmF1dG9fbmVnX2F1dG9fY2ZnLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjYXBhYmlsaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eV9wYWNrKHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURWRVJUSVNFRF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCA+IDApICYmICh0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjYXBhYmlsaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHlfcGFjayh0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc1tpMV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdXRvX25lZ19yeF90ZWNoLmNhcGFiaWxpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjYXBhYmlsaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19yeF90ZWNoXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3BhY2sodGhpcy0+dS5hdXRvX25lZ19yeF90ZWNoLmNhcGFiaWxpdGllc1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl9wYWNrKHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfc2VsZWN0X2FibGUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yX3BhY2sodGhpcy0+dS5hdXRvX25lZ19hZF9zZWxlY3RfYWJsZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3JfcGFjayh0aGlzLT51LmF1dG9fbmVnX3J4X3NlbGVjdF9hYmxlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXNfcGFjayh0aGlzLT51Lm1hY19kdXBsZXhfc3RhdHVzLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWQuZnVuY3Rpb25zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9ucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmdW5jdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWQuZnVuY3Rpb25zX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9uc1tpM10pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX2ZyYW1lc190eC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX2ZyYW1lc19yeC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2N0cmxfdW5zdXBwb3J0ZWRfb3BfcngudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX3BhdXNlX2RlbGF5LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfY3RybF9wYXVzZV90eC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2N0cmxfcGF1c2VfcngudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5vYW1fbG9jYWxfZXJyX2ZyYW1lX3NlY3NfZXZlbnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm9hbV9sb2NhbF9lcnJfZnJhbWVfcGVyaW9kX2V2ZW50LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUub2FtX2xvY2FsX2Vycl9mcl9zZWNfc3VtX2V2ZW50LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm9hbV9lbXVsX2NyYzhlcnIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1wY3BfbWFjX2N0cmxfZnJhbWVzX3R4LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX21hY19jdHJsX2ZyYW1lc19yeC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1wY3BfZGlzY292ZXJ5X3dpbmRvd190eC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX2Rpc2NvdmVyeV90aW1lb3V0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZmVjX2NvcnJlY3RlZF9ibG9ja3MudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmZlY191bmNvcnJlY3RhYmxlX2Jsb2Nrcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydF9wYWNrKHRoaXMtPnUuZmVjX2FiaWxpdHkudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGVfcGFjayh0aGlzLT51LmZlY19tb2RlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9HQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF90eF9nYXRlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF90eF9yZWdfYWNrLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfcmVnaXN0ZXIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF90eF9yZWdfcmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF90eF9yZXBvcnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX3J4X2dhdGUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX3J4X3JlZ19hY2sudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF9yeF9yZWdpc3Rlci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX3J4X3JlZ19yZXF1ZXN0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX3J4X3JlcG9ydC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm1hY19jb2xsaXNpb25fZnJhbWVzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9BRE1JTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfT1BFUl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19QUkk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUdHX09SX0lORElWSURVQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQ09MTEVDVE9SX01BWF9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19EQVRBX1JBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREVTQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0xJTktfVVBfRE9XTl9OT1RJRllfRU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTkFNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19PUEVSX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfT1BFUl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BPUlRfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0VSUl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RJTUVfT0ZfTEFTVF9PUEVSX0NIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0VSUl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1VOS19QUk9UT0NPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9DQVBBQ0lUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX0ZSRVE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0ZBTFNFX0NBUlJJRVJTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lETEVfRVJST1JfQ09VTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSkFCQkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0xPU0VfTUVESUFfQ1RSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0RVUF9FVkVOVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0JBRF9MTElEX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfU1BEX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FVkVOVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9GUkFNRVNfTE9TVF9PQU1fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPT1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfUERVX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9ERVZJQ0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9PVUk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOSVFVRV9FVkVOVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTlNVUFBPUlRFRF9PUENPREVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9NSUlfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NRRV9URVNUX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVF9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUSVRJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9CVVJTVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0RBVEFfUkFURV9NSVNNQVRDSEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GUkFNRVNfVE9PX0xPTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JU09MQVRFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFTVF9TT1VSQ0VfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFURV9FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SVU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU0hPUlRfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TT1VSQ0VfQUREUl9DSEFOR0VTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TWU1fRVJSX0RVUklOR19QS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1ZFUllfTE9OR19FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfVEVYVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RZUEU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRkNTX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BTElHTl9FUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BRERSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0lEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEVkVSVElTRURfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9ICgyICogdGhpcy0+dS5tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWQuZnVuY3Rpb25zX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9FVkVOVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0FCSUxJVFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfR0FURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9PUEVSX0tFWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUdHX09SX0lORElWSURVQUw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQ09MTEVDVE9SX01BWF9ERUxBWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19ERVNDOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0xJTktfVVBfRE9XTl9OT1RJRllfRU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX09QRVJfU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfT1BFUl9LRVk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19QUkk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BPUlRfTElTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRVJSX0ZSQU1FUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfT0NURVRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0RJU0NBUkQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0VSUl9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVU5LX1BST1RPQ09MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9NQVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfVFhfRU5BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVROgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX1RZUEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0ZBTFNFX0NBUlJJRVJTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSURMRV9FUlJPUl9DT1VOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSkFCQkVSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9MT1NFX01FRElBX0NUUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRV9MSVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRFVQX0VWRU5UX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0JBRF9MTElEX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9TUERfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FVkVOVF9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRlJBTUVTX0xPU1RfT0FNX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0ZMQUdTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9NT0RFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRkxBR1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9NQUNfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9ERVZJQ0U6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX1ZFUlNJT046CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOSVFVRV9FVkVOVF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1FFX1RFU1RfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FMSUdOX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVF9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0JVUlNUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0NPTExJU0lPTlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZDU19FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GUkFNRVNfVE9PX0xPTkc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lTT0xBVEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFTVF9TT1VSQ0VfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfRlJBTUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfT0NURVRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TSE9SVF9FVkVOVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TT1VSQ0VfQUREUl9DSEFOR0VTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfVkVSWV9MT05HX0VWRU5UUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfQ0FQQUNJVFk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX0RBVEE6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWF9DT0xMSVNJT05TOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2lkLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZXNfdHhfb2sudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX3NpbmdsZV9jb2xsX2ZyYW1lcy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19tdWx0aXBsZV9jb2xsX2ZyYW1lcy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX3J4X29rLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GQ1NfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfZmNzX2Vyci52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfYWxpZ25fZXJyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19vY3RldHNfdHhfb2sudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX2RlZmVycmVkLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19sYXRlX2NvbGxpc2lvbnMudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfZXhjZXNzaXZlX2NvbGxpc2lvbnMudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZXNfbG9zdF9tYWNfdHhfZXJyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfY2Fycmllcl9zZW5zZV9lcnIudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX29jdGV0c19yeF9vay52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2ZyYW1lc19sb3N0X21hY19yeF9lcnIudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX21jYXN0X2ZyYW1lc190eF9vay52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfYmNhc3RfZnJhbWVzX3R4X29rLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2ZyX2V4Y2Vzc2l2ZV9kZWZlcnJhbC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfbWNhc3RfZnJhbWVzX3J4X29rLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19iY2FzdF9mcmFtZXNfcnhfb2sudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19pbl9yYW5nZV9sZW5fZXJyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX291dF9vZl9yYW5nZV9sZW5fZXJyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2ZyYW1lX3Rvb19sb25nLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1hY19lbmFibGVfc3RhdHVzLnN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWFjX2FkZHIubWFjX2FkZHJlc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlX3VucGFjaygmdGhpcy0+dS5waHlfdHlwZS50eXBlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUucGh5X3N5bWJvbF9lcnJfZHVyaW5nX2NhcnJpZXIudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZV91bnBhY2soJnRoaXMtPnUucGh5X2FkbWluX3N0YXRlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV91bnBhY2soJnRoaXMtPnUubWF1X21lZGlhX2F2YWlsLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19pZC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlX3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19hZG1pbl9zdGF0ZS52YWx1ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWdfdW5wYWNrKCZ0aGlzLT51LmF1dG9fbmVnX3JlbW90ZV9zaWcudmFsdWUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWdfdW5wYWNrKCZ0aGlzLT51LmF1dG9fbmVnX2F1dG9fY2ZnLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5X2NvdW50X2NhcGFiaWxpdGllcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2FwYWJpbGl0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllcyA9IChiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzW2kwXSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEVkVSVElTRURfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHlfY291bnRfY2FwYWJpbGl0aWVzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2FwYWJpbGl0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHlfdW5wYWNrKCZ0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc1tpMV0sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9URUNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19yeF90ZWNoX2NvdW50X2NhcGFiaWxpdGllcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX3J4X3RlY2guY2FwYWJpbGl0aWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjYXBhYmlsaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19yeF90ZWNoXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19yeF90ZWNoLmNhcGFiaWxpdGllc1tpMl0sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yX3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19sb2NhbF9zZWxlY3RfYWJsZS52YWx1ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl91bnBhY2soJnRoaXMtPnUuYXV0b19uZWdfYWRfc2VsZWN0X2FibGUudmFsdWUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3JfdW5wYWNrKCZ0aGlzLT51LmF1dG9fbmVnX3J4X3NlbGVjdF9hYmxlLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1c191bnBhY2soJnRoaXMtPnUubWFjX2R1cGxleF9zdGF0dXMudmFsdWUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZC5mdW5jdGlvbnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWRfY291bnRfZnVuY3Rpb25zKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9uc19jb3VudCA+IDApICYmICh0aGlzLT51Lm1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZC5mdW5jdGlvbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmdW5jdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWQuZnVuY3Rpb25zID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZC5mdW5jdGlvbnNfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9uc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9uc1tpM10pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2N0cmxfZnJhbWVzX3R4LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2N0cmxfZnJhbWVzX3J4LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfY3RybF91bnN1cHBvcnRlZF9vcF9yeC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2N0cmxfcGF1c2VfZGVsYXkudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX3BhdXNlX3R4LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfY3RybF9wYXVzZV9yeC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm9hbV9sb2NhbF9lcnJfZnJhbWVfc2Vjc19ldmVudC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUub2FtX2xvY2FsX2Vycl9mcmFtZV9wZXJpb2RfZXZlbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5vYW1fbG9jYWxfZXJyX2ZyX3NlY19zdW1fZXZlbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUub2FtX2VtdWxfY3JjOGVyci52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9tYWNfY3RybF9mcmFtZXNfdHgudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfbWFjX2N0cmxfZnJhbWVzX3J4LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9kaXNjb3Zlcnlfd2luZG93X3R4LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfZGlzY292ZXJ5X3RpbWVvdXQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mZWNfY29ycmVjdGVkX2Jsb2Nrcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mZWNfdW5jb3JyZWN0YWJsZV9ibG9ja3MudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnRfdW5wYWNrKCZ0aGlzLT51LmZlY19hYmlsaXR5LnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGVfdW5wYWNrKCZ0aGlzLT51LmZlY19tb2RlLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfZ2F0ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfcmVnX2Fjay52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tcGNwX3R4X3JlZ2lzdGVyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfcmVnX3JlcXVlc3QudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfcmVwb3J0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfR0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9yeF9nYXRlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9yeF9yZWdfYWNrLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfcnhfcmVnaXN0ZXIudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9yeF9yZWdfcmVxdWVzdC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9yeF9yZXBvcnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5tYWNfY29sbGlzaW9uX2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0NPTExFQ1RPUl9NQVhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RFU0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19MSU5LX1VQX0RPV05fTk9USUZZX0VOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfT1BFUl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QT1JUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19VTktfUFJPVE9DT0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVROgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRExFX0VSUk9SX0NPVU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9MT1NFX01FRElBX0NUUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9EVVBfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9CQURfTExJRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX1NQRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRlJBTUVTX0xPU1RfT0FNX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfREVWSUNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTklRVUVfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TUUVfVEVTVF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQlVSU1RTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSVNPTEFURVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NIT1JUX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU09VUkNFX0FERFJfQ0hBTkdFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9WRVJZX0xPTkdfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFhfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGUgbGVhZjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GQ1NfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BTElHTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY2FwYWJpbGl0aWVzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGNhcGFiaWxpdGllc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEVkVSVElTRURfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhcGFiaWxpdGllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9URUNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhcGFiaWxpdGllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZnVuY3Rpb25zX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGZ1bmN0aW9uc19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0NPTExFQ1RPUl9NQVhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RFU0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19MSU5LX1VQX0RPV05fTk9USUZZX0VOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfT1BFUl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QT1JUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19VTktfUFJPVE9DT0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVROgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRExFX0VSUk9SX0NPVU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9MT1NFX01FRElBX0NUUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9EVVBfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9CQURfTExJRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX1NQRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRlJBTUVTX0xPU1RfT0FNX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfREVWSUNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTklRVUVfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TUUVfVEVTVF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQlVSU1RTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSVNPTEFURVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NIT1JUX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU09VUkNFX0FERFJfQ0hBTkdFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9WRVJZX0xPTkdfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFhfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eV9jb3VudF9jYXBhYmlsaXRpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHlfY291bnRfY2FwYWJpbGl0aWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX3J4X3RlY2hfY291bnRfY2FwYWJpbGl0aWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX21hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZF9jb3VudF9mdW5jdGlvbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+d2lkdGgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19BRERfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19ERUxfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9QT1JUX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX1JFU0VUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19BRERfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19ERUxfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9QT1JUX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX1JFU0VUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3BhY2soJnRoaXMtPnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9wYWNrKCZ0aGlzLT51LnN0YW5kYXJkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5zdGFuZGFyZF9hY3Rpb24uYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9wYWNrKCZ0aGlzLT51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soJnRoaXMtPnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kZWYud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vYmplY3Qub2JqZWN0X2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zdGFuZGFyZF9hdHRyaWJ1dGUuYXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmVuZC51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1BST0dSQU1NQUJMRV9DT1VOVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2hfdW5wYWNrKCZ0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3VucGFjaygmdGhpcy0+dS5vYmplY3Qub2JqZWN0X2NvbnRleHQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfdW5wYWNrKCZ0aGlzLT51LnN0YW5kYXJkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuc3RhbmRhcmRfYWN0aW9uLmFjdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1BST0dSQU1NQUJMRV9DT1VOVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIGJyYW5jaDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfUFJPR1JBTU1BQkxFX0NPVU5URVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlX3BhY2sodGhpcy0+b3AsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGVfcGFjayh0aGlzLT51Lm1jYXN0X3JlZy5hY3Rpb25fY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5tY2FzdF9yZWcubXVsdGljYXN0X2xsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUdfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlX3BhY2sodGhpcy0+dS5tY2FzdF9yZWdfcmVzcC5zdGF0dXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubWNhc3RfcmVnX3Jlc3AubXVsdGljYXN0X2xsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImtleV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfa2V5X2V4Y2hhbmdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhLCB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9wYWNrKCZ0aGlzLT51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2ZlciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbl9wYWNrKHRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmwuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmwuaXBzYSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmwuaXBkYSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmwuY2xpZW50X21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZV9wYWNrKHRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmxfcmVzcC5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uX3BhY2sodGhpcy0+dS5zdGF0aWNfaXBtY2FzdF9jdHJsLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zdGF0aWNfaXBtY2FzdF9jdHJsLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5pcHNhLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5zdGF0aWNfaXBtY2FzdF9jdHJsLmlwZGEsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnN0YXRpY19pcG1jYXN0X2N0cmwucG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlX3BhY2sodGhpcy0+dS5zdGF0aWNfaXBtY2FzdF9jdHJsX3Jlc3AucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9yZXNwb25zZS52YXJzW2kxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc1tpMl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc1tpM10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUdfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9GSUxFX1RSQU5TRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV91bnBhY2soJnRoaXMtPm9wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVxdWVzdF9jb3VudF92YXJzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9IChiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3VucGFjaygmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVzcG9uc2VfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdF9jb3VudF92YXJzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3JlcXVlc3QudmFycyA9IChiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzW2kyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVzcG9uc2VfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaTNdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZV91bnBhY2soJnRoaXMtPnUubWNhc3RfcmVnLmFjdGlvbl9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm1jYXN0X3JlZy5tdWx0aWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfdW5wYWNrKCZ0aGlzLT51Lm1jYXN0X3JlZ19yZXNwLnN0YXR1cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5tY2FzdF9yZWdfcmVzcC5tdWx0aWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9sZW5ndGggPiAwKSAmJiAodGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJrZXlfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2tleV9leGNoYW5nZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2RhdGEsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9GSUxFX1RSQU5TRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX3VucGFjaygmdGhpcy0+dS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmwuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5keW5hbWljX2lwbWNhc3RfY3RybC5pcHNhLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmlwZGEsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmNsaWVudF9tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsX3Jlc3AucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5pcHNhLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LnN0YXRpY19pcG1jYXN0X2N0cmwuaXBkYSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfdW5wYWNrKCZ0aGlzLT51LnN0YXRpY19pcG1jYXN0X2N0cmxfcmVzcC5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfUkVTRVJWRUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlIG9wOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlX3VucGFjaygmb3AsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X2xlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBrZXlfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGtleV9sZW5ndGggKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVzcG9uc2VfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tYWpvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWlub3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1ham9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5taW5vcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnVuaXhfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+cmFuZG9tLCAyOCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51bml4X3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+cmFuZG9tLCAyOCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMzIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuZ3RoID4gMCkgJiYgKHRoaXMtPnNlc3Npb25faWQgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2Vzc2lvbl9pZFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuZ3RoID4gMzIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+c2Vzc2lvbl9pZCwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyB0aGlzLT5sZW5ndGg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5zZXNzaW9uX2lkID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2Vzc2lvbl9pZFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5zZXNzaW9uX2lkID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuZ3RoID4gMzIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5zZXNzaW9uX2lkLCB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5jaXBoZXJzdWl0ZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2lwaGVyc3VpdGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbmd0aDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9wYWNrKHRoaXMtPmNpcGhlcnN1aXRlc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMiArICgyICogdGhpcy0+bGVuZ3RoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5jaXBoZXJzdWl0ZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjaXBoZXJzdWl0ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Y2lwaGVyc3VpdGVzID0gKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbmd0aCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW5ndGg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfdW5wYWNrKCZ0aGlzLT5jaXBoZXJzdWl0ZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUpICogbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW5ndGggPiAwKSAmJiAodGhpcy0+bWV0aG9kcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtZXRob2RzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbmd0aDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2RfcGFjayh0aGlzLT5tZXRob2RzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0ICp0aGlzKQoreworICAgIHJldHVybiAxICsgdGhpcy0+bGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5tZXRob2RzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWV0aG9kc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5tZXRob2RzID0gKGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW5ndGggKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbmd0aDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2RfdW5wYWNrKCZ0aGlzLT5tZXRob2RzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QpICogbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgdWludDMyX3QgaTA7CisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0X2NvdW50ID4gMCkgJiYgKHRoaXMtPmNlcnRpZmljYXRlX2xpc3QgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2VydGlmaWNhdGVfbGlzdFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0X2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfcGFjaygmdGhpcy0+Y2VydGlmaWNhdGVfbGlzdFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MjRfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB1aW50MzJfdF90b191aW50MjRfdChieXRlc0FmdGVyTGVuRmllbGQpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MjRfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+Y2VydGlmaWNhdGVfbGlzdF9jb3VudCA+IDApICYmICh0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0ID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX2xpc3RfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0X2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0W2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQyNF90IGNlcnRpZmljYXRlX2xpc3Rfc2l6ZSA9IHVpbnQzMl90X3RvX3VpbnQyNF90KDApOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoYnVmLCAmY2VydGlmaWNhdGVfbGlzdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIHVpbnQyNF90X3RvX3VpbnQzMl90KGNlcnRpZmljYXRlX2xpc3Rfc2l6ZSksIGJ1Zi0+Y3Vycik7CisgICAgdGhpcy0+Y2VydGlmaWNhdGVfbGlzdF9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9jb3VudF9jZXJ0aWZpY2F0ZV9saXN0KCZwb3N0TGVuQnVmKTsKKyAgICBpZiAoKHRoaXMtPmNlcnRpZmljYXRlX2xpc3RfY291bnQgPiAwKSAmJiAodGhpcy0+Y2VydGlmaWNhdGVfbGlzdCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX2xpc3RcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Y2VydGlmaWNhdGVfbGlzdCA9IChiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmNlcnRpZmljYXRlX2xpc3RfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0X2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfdW5wYWNrKCZ0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0W2kwXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgdWludDI0X3RfdG9fdWludDMyX3QoY2VydGlmaWNhdGVfbGlzdF9zaXplKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDI0X3QgbGVuZ3RoOworICAgIHVpbnQzMl90IGNlcnRpZmljYXRlX2xpc3RfZWxlbV9jb3VudCA9IDA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB1aW50MjRfdF90b191aW50MzJfdChsZW5ndGgpLCBwYWNrZWQtPmN1cnIpOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjZXJ0aWZpY2F0ZV9saXN0X2VsZW1fY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoY2VydGlmaWNhdGVfbGlzdF9lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdWludDI0X3RfdG9fdWludDMyX3QobGVuZ3RoKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfY291bnRfY2VydGlmaWNhdGVfbGlzdChiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuZ3RoID4gMCkgJiYgKHRoaXMtPmNlcnRpZmljYXRlX3R5cGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX3R5cGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuZ3RoOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfcGFjayh0aGlzLT5jZXJ0aWZpY2F0ZV90eXBlc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyB0aGlzLT5sZW5ndGg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5jZXJ0aWZpY2F0ZV90eXBlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX3R5cGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Y2VydGlmaWNhdGVfdHlwZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW5ndGggKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW5ndGg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV91bnBhY2soJnRoaXMtPmNlcnRpZmljYXRlX3R5cGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGUpICogbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZV9wYWNrKHRoaXMtPmlkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+aWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0hFTExPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uX3BhY2soJnRoaXMtPnUuY2xpZW50X2hlbGxvLnZlcnNpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV9wYWNrKCZ0aGlzLT51LmNsaWVudF9oZWxsby5yYW5kb20sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfcGFjaygmdGhpcy0+dS5jbGllbnRfaGVsbG8uc2Vzc2lvbl9pZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdF9wYWNrKCZ0aGlzLT51LmNsaWVudF9oZWxsby5jaXBoZXJfc3VpdGVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0X3BhY2soJnRoaXMtPnUuY2xpZW50X2hlbGxvLmNvbXByZXNzaW9uX21ldGhvZHMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfSEVMTE86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fcGFjaygmdGhpcy0+dS5zZXJ2ZXJfaGVsbG8udmVyc2lvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tX3BhY2soJnRoaXMtPnUuc2VydmVyX2hlbGxvLnJhbmRvbSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9wYWNrKCZ0aGlzLT51LnNlcnZlcl9oZWxsby5zZXNzaW9uX2lkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9wYWNrKHRoaXMtPnUuc2VydmVyX2hlbGxvLmNpcGhlcnN1aXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2RfcGFjayh0aGlzLT51LnNlcnZlcl9oZWxsby5jb21wcmVzc2lvbl9tZXRob2QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9wYWNrKCZ0aGlzLT51LmNlcnRpZmljYXRlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3BhY2soJnRoaXMtPnUuY2VydGlmaWNhdGVfcmVxdWVzdC5jZXJ0aWZpY2F0ZV90eXBlcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9wYWNrKCZ0aGlzLT51LmNlcnRpZmljYXRlX3JlcXVlc3QuY2VydGlmaWNhdGVfYXV0aG9yaXRpZXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfSEVMTE9fRE9ORToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfVkVSSUZZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5oYXNoX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuaGFzaF9zaXplID4gMCkgJiYgKHRoaXMtPnUuY2VydGlmaWNhdGVfdmVyaWZ5LmVuY3J5cHRlZF9oYXNoID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVuY3J5cHRlZF9oYXNoXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfY2VydGlmaWNhdGVfdmVyaWZ5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuY2VydGlmaWNhdGVfdmVyaWZ5LmVuY3J5cHRlZF9oYXNoLCB0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5oYXNoX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLnNpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLnNpemUgPiAwKSAmJiAodGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLmVuY3J5cHRlZF9wcmVfbWFzdGVyX3NlY3JldCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbmNyeXB0ZWRfcHJlX21hc3Rlcl9zZWNyZXRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9jbGllbnRfa2V5X2V4Y2hhbmdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuY2xpZW50X2tleV9leGNoYW5nZS5lbmNyeXB0ZWRfcHJlX21hc3Rlcl9zZWNyZXQsIHRoaXMtPnUuY2xpZW50X2tleV9leGNoYW5nZS5zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0ZJTklTSEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51LmZpbmlzaGVkLnZlcmlmeV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZlcmlmeV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfZmluaXNoZWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YSwgdGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9IRUxMT19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0tFWV9FWENIQU5HRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MjRfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB1aW50MzJfdF90b191aW50MjRfdChieXRlc0FmdGVyTGVuRmllbGQpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MjRfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNDsKKyAgICBzd2l0Y2ggKHRoaXMtPmlkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NMSUVOVF9IRUxMTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzNCArIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jbGllbnRfaGVsbG8uc2Vzc2lvbl9pZCkgKyBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY2xpZW50X2hlbGxvLmNpcGhlcl9zdWl0ZXMpICsgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNsaWVudF9oZWxsby5jb21wcmVzc2lvbl9tZXRob2RzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0hFTExPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM3ICsgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNlcnZlcl9oZWxsby5zZXNzaW9uX2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNlcnRpZmljYXRlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jZXJ0aWZpY2F0ZV9yZXF1ZXN0LmNlcnRpZmljYXRlX3R5cGVzKSArIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jZXJ0aWZpY2F0ZV9yZXF1ZXN0LmNlcnRpZmljYXRlX2F1dGhvcml0aWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0hFTExPX0RPTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFX1ZFUklGWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgdGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuaGFzaF9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DTElFTlRfS0VZX0VYQ0hBTkdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyB0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2Uuc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfRklOSVNIRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfSEVMTE9fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9LRVlfRVhDSEFOR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQyNF90IGxlbmd0aCA9IHVpbnQzMl90X3RvX3VpbnQyNF90KDApOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGVfdW5wYWNrKCZ0aGlzLT5pZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIHVpbnQyNF90X3RvX3VpbnQzMl90KGxlbmd0aCksIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DTElFTlRfSEVMTE86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT51LmNsaWVudF9oZWxsby52ZXJzaW9uLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tX3VucGFjaygmdGhpcy0+dS5jbGllbnRfaGVsbG8ucmFuZG9tLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF91bnBhY2soJnRoaXMtPnUuY2xpZW50X2hlbGxvLnNlc3Npb25faWQsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X3VucGFjaygmdGhpcy0+dS5jbGllbnRfaGVsbG8uY2lwaGVyX3N1aXRlcywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RfdW5wYWNrKCZ0aGlzLT51LmNsaWVudF9oZWxsby5jb21wcmVzc2lvbl9tZXRob2RzLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9IRUxMTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl91bnBhY2soJnRoaXMtPnUuc2VydmVyX2hlbGxvLnZlcnNpb24sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb21fdW5wYWNrKCZ0aGlzLT51LnNlcnZlcl9oZWxsby5yYW5kb20sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3VucGFjaygmdGhpcy0+dS5zZXJ2ZXJfaGVsbG8uc2Vzc2lvbl9pZCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX3VucGFjaygmdGhpcy0+dS5zZXJ2ZXJfaGVsbG8uY2lwaGVyc3VpdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3VucGFjaygmdGhpcy0+dS5zZXJ2ZXJfaGVsbG8uY29tcHJlc3Npb25fbWV0aG9kLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF91bnBhY2soJnRoaXMtPnUuY2VydGlmaWNhdGUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3VucGFjaygmdGhpcy0+dS5jZXJ0aWZpY2F0ZV9yZXF1ZXN0LmNlcnRpZmljYXRlX3R5cGVzLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF91bnBhY2soJnRoaXMtPnUuY2VydGlmaWNhdGVfcmVxdWVzdC5jZXJ0aWZpY2F0ZV9hdXRob3JpdGllcywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfSEVMTE9fRE9ORToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfVkVSSUZZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2VydGlmaWNhdGVfdmVyaWZ5Lmhhc2hfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5oYXNoX3NpemUgPiAwKSAmJiAodGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuZW5jcnlwdGVkX2hhc2ggPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbmNyeXB0ZWRfaGFzaFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX2NlcnRpZmljYXRlX3ZlcmlmeVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5lbmNyeXB0ZWRfaGFzaCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5oYXNoX3NpemUgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuY2VydGlmaWNhdGVfdmVyaWZ5LmVuY3J5cHRlZF9oYXNoLCB0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5oYXNoX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2Uuc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2Uuc2l6ZSA+IDApICYmICh0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfY2xpZW50X2tleV9leGNoYW5nZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0ID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuY2xpZW50X2tleV9leGNoYW5nZS5zaXplICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0LCB0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2Uuc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9GSU5JU0hFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmZpbmlzaGVkLnZlcmlmeV9kYXRhX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfZmluaXNoZWRfY291bnRfdmVyaWZ5X2RhdGEoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51LmZpbmlzaGVkLnZlcmlmeV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVyaWZ5X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9maW5pc2hlZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmZpbmlzaGVkLnZlcmlmeV9kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmluaXNoZWQudmVyaWZ5X2RhdGFfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZmluaXNoZWQudmVyaWZ5X2RhdGEsIHRoaXMtPnUuZmluaXNoZWQudmVyaWZ5X2RhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfSEVMTE9fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9LRVlfRVhDSEFOR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIHVpbnQyNF90X3RvX3VpbnQzMl90KGxlbmd0aCkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlIGlkOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MjRfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlX3VucGFjaygmaWQsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB1aW50MjRfdF90b191aW50MzJfdChsZW5ndGgpLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0hFTExPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0hFTExPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0hFTExPX0RPTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFX1ZFUklGWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBoYXNoX3NpemU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmaGFzaF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaGFzaF9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgaGFzaF9zaXplICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DTElFTlRfS0VZX0VYQ0hBTkdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IHNpemU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHNpemUpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBzaXplICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9GSU5JU0hFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2ZXJpZnlfZGF0YV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2ZXJpZnlfZGF0YV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZlcmlmeV9kYXRhX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9IRUxMT19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0tFWV9FWENIQU5HRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdWludDI0X3RfdG9fdWludDMyX3QobGVuZ3RoKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9maW5pc2hlZF9jb3VudF92ZXJpZnlfZGF0YShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV9wYWNrKHRoaXMtPmNvbnRlbnRfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl9wYWNrKCZ0aGlzLT52ZXJzaW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29udGVudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc19jb3VudCA+IDApICYmICh0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3JkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJoYW5kc2hha2VfcmVjb3Jkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2hhbmRzaGFrZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfcGFjaygmdGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA1OworICAgIHN3aXRjaCAodGhpcy0+Y29udGVudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc19jb3VudCA+IDApICYmICh0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3JkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJoYW5kc2hha2VfcmVjb3Jkc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV91bnBhY2soJnRoaXMtPmNvbnRlbnRfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl91bnBhY2soJnRoaXMtPnZlcnNpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRlbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfSEFORFNIQUtFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIHRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfaGFuZHNoYWtlX2NvdW50X2hhbmRzaGFrZV9yZWNvcmRzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaGFuZHNoYWtlX3JlY29yZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9oYW5kc2hha2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdW5wYWNrKCZ0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgY29udGVudF90eXBlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV91bnBhY2soJmNvbnRlbnRfdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoY29udGVudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaGFuZHNoYWtlX3JlY29yZHNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlX3JlY29yZHNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChoYW5kc2hha2VfcmVjb3Jkc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2hhbmRzaGFrZV9jb3VudF9oYW5kc2hha2VfcmVjb3JkcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzX3BhY2sodGhpcy0+ZmxhZ3MsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5mbGFncyAmIDB4MDA4MCkgPT0gMHgwMDgwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sZW5ndGgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgoKHVpbnQ2NF90KSB0aGlzLT5mbGFncyAmIDB4MDA4MCkgPT0gMHgwMDgwKSAmJiAoKCh1aW50NjRfdCkgdGhpcy0+ZmxhZ3MgJiAweDAwNDApID09IDApKSkKKyAgICB7CisgICAgICAgIGlmICgodGhpcy0+dGxzX3JlY29yZHNfY291bnQgPiAwKSAmJiAodGhpcy0+dGxzX3JlY29yZHMgPT0gTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHNfcmVjb3Jkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnRsc19yZWNvcmRzX2NvdW50OyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3BhY2soJnRoaXMtPnRsc19yZWNvcmRzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDU7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT50bHNfcmVjb3Jkc19jb3VudCA+IDApICYmICh0aGlzLT50bHNfcmVjb3JkcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHNfcmVjb3Jkc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT50bHNfcmVjb3Jkc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT50bHNfcmVjb3Jkc1tpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFnc191bnBhY2soJnRoaXMtPmZsYWdzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+ZmxhZ3MgJiAweDAwODApID09IDB4MDA4MCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKCh1aW50NjRfdCkgdGhpcy0+ZmxhZ3MgJiAweDAwODApID09IDB4MDA4MCkgJiYgKCgodWludDY0X3QpIHRoaXMtPmZsYWdzICYgMHgwMDQwKSA9PSAwKSkpCisgICAgeworICAgICAgICB0aGlzLT50bHNfcmVjb3Jkc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfY291bnRfdGxzX3JlY29yZHMoYnVmKTsKKyAgICAgICAgaWYgKCh0aGlzLT50bHNfcmVjb3Jkc19jb3VudCA+IDApICYmICh0aGlzLT50bHNfcmVjb3JkcyA9PSBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHNfcmVjb3Jkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT50bHNfcmVjb3JkcyA9IChiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnRsc19yZWNvcmRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dGxzX3JlY29yZHNfY291bnQ7IGkwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfdW5wYWNrKCZ0aGlzLT50bHNfcmVjb3Jkc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCB0bHNfcmVjb3Jkc19lbGVtX2NvdW50ID0gMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRsc19yZWNvcmRzX2VsZW1fY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodGxzX3JlY29yZHNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCkpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV9jb3VudF90bHNfcmVjb3JkcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zdWJ0eXBlX3BhY2sodGhpcy0+c3ViX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdWJfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19TVUJUWVBFX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV9wYWNrKCZ0aGlzLT51LmF1dGhlbnRpY2F0aW9uLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnN1Yl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX1NVQlRZUEVfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hdXRoZW50aWNhdGlvbi52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZV91bnBhY2soJnRoaXMtPnN1Yl90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3ViX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfU1VCVFlQRV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfdW5wYWNrKCZ0aGlzLT51LmF1dGhlbnRpY2F0aW9uLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSBzdWJfdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZV91bnBhY2soJnN1Yl90eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoc3ViX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfU1VCVFlQRV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGVfcGFjayh0aGlzLT5jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3BhY2soJnRoaXMtPnUucmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfcGFjaygmdGhpcy0+dS5yZXNwb25zZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfU1VDQ0VTUzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDQ7CisgICAgc3dpdGNoICh0aGlzLT5jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVxdWVzdC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlc3BvbnNlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9TVUNDRVNTOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGVfdW5wYWNrKCZ0aGlzLT5jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDQsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl91bnBhY2soJnRoaXMtPnUucmVxdWVzdC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3VucGFjaygmdGhpcy0+dS5yZXNwb25zZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1NVQ0NFU1M6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCAtIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9lYXBfY29kZSBjb2RlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGVfdW5wYWNrKCZjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSA0LCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfU1VDQ0VTUzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoIC0gNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfUEFDS0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9wYWNrKCZ0aGlzLT51LnBhY2tldC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9BU0ZfQUxFUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0xPR09GRjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9NS0E6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfU1RBUlQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9QQUNLRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5wYWNrZXQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfQVNGX0FMRVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9MT0dPRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTUtBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX1NUQVJUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9QQUNLRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX3VucGFjaygmdGhpcy0+dS5wYWNrZXQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0FTRl9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTE9HT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX01LQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9TVEFSVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZSB0eXBlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9QQUNLRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfQVNGX0FMRVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9MT0dPRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTUtBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX1NUQVJUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uX3BhY2sodGhpcy0+dmVyc2lvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnZlcnNpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9WRVJTSU9OX1ZFUlNJT04yOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdV9wYWNrKCZ0aGlzLT51LmRlZi52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dmVyc2lvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1ZFUlNJT05fVkVSU0lPTjI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kZWYudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT52ZXJzaW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dmVyc2lvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1ZFUlNJT05fVkVSU0lPTjI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1X3VucGFjaygmdGhpcy0+dS5kZWYudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uIHZlcnNpb247CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbl91bnBhY2soJnZlcnNpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVkVSU0lPTl9WRVJTSU9OMjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCByZXQgPSAwOworICAgIHJldCB8PSAoKHRoaXMtPnBjcCAmIDB4MDAwNykgPDwgMTMpOworICAgIHJldCB8PSAoKHRoaXMtPmNmaSAmIDB4MDAwMSkgPDwgMTIpOworICAgIHJldCB8PSAodGhpcy0+dmlkICYgMHgwRkZGKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgcmV0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHRoaXMtPnBjcCA9ICgodmFsID4+IDEzKSAmIDB4MDAwNyk7CisgICAgdGhpcy0+Y2ZpID0gKCh2YWwgPj4gMTIpICYgMHgwMDAxKTsKKyAgICB0aGlzLT52aWQgPSAodmFsICYgMHgwRkZGKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHJldCA9IDA7CisgICAgcmV0IHw9ICgodGhpcy0+cGNwICYgMHgwMDA3KSA8PCAyOSk7CisgICAgcmV0IHw9ICgodGhpcy0+ZGVpICYgMHgwMDAxKSA8PCAyOCk7CisgICAgcmV0IHw9ICgodGhpcy0+dWNhICYgMHgwMDAxKSA8PCAyNyk7CisgICAgcmV0IHw9ICgodGhpcy0+cmVzICYgMHgwMDA3KSA8PCAyNCk7CisgICAgcmV0IHw9ICh0aGlzLT5pc2lkICYgMHgwMEZGRkZGRlVMKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgcmV0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHRoaXMtPnBjcCA9ICgodmFsID4+IDI5KSAmIDB4MDAwNyk7CisgICAgdGhpcy0+ZGVpID0gKCh2YWwgPj4gMjgpICYgMHgwMDAxKTsKKyAgICB0aGlzLT51Y2EgPSAoKHZhbCA+PiAyNykgJiAweDAwMDEpOworICAgIHRoaXMtPnJlcyA9ICgodmFsID4+IDI0KSAmIDB4MDAwNyk7CisgICAgdGhpcy0+aXNpZCA9ICh2YWwgJiAweDAwRkZGRkZGVUwpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9BTEFSTV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0VYVEVOU0lPTl9TVVBQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQudmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc19wYWNrKHRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQucmVwb3J0X21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc19wYWNrKHRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQucHJlZmVycmVkX3JlcG9ydF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0xJTks6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfQUxBUk1fUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9FWFRFTlNJT05fU1VQUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfTElOSzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9BTEFSTV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0VYVEVOU0lPTl9TVVBQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQudmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc191bnBhY2soJnRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQucmVwb3J0X21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc191bnBhY2soJnRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQucHJlZmVycmVkX3JlcG9ydF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0xJTks6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGUgdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfQUxBUk1fUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9FWFRFTlNJT05fU1VQUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9MSU5LOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfcGFjaygmdGhpcy0+dS50ZWsudGx2cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY3RjLmV4dGVuc2lvbl9zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmN0Yy52ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY3RjLnN1cHBfdmVyc2lvbl9jb3VudCA+IDApICYmICh0aGlzLT51LmN0Yy5zdXBwX3ZlcnNpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3VwcF92ZXJzaW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX2N0Y1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmN0Yy5zdXBwX3ZlcnNpb25fY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpcl9wYWNrKCZ0aGlzLT51LmN0Yy5zdXBwX3ZlcnNpb25baTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3BhY2soJnRoaXMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNDsKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnRlay50bHZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICg0ICogdGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRwb2UuZHBvZV9pbmZvX3Rsdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDIsIGJ1Zi0+Y3Vycik7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZ0aGlzLT5vdWksICZwb3N0TGVuQnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdW5wYWNrKCZ0aGlzLT51LnRlay50bHZzLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jdGMuZXh0ZW5zaW9uX3N1cHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jdGMudmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX2N0Y19jb3VudF9zdXBwX3ZlcnNpb24oJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY3RjLnN1cHBfdmVyc2lvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN1cHBfdmVyc2lvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19jdGNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfdW5wYWNrKCZ0aGlzLT51LmN0Yy5zdXBwX3ZlcnNpb25baTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl91bnBhY2soJnRoaXMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGggLSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAyLCBwYWNrZWQtPmN1cnIpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmb3VpLCAmcG9zdExlbkJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdXBwX3ZlcnNpb25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzdXBwX3ZlcnNpb25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzdXBwX3ZlcnNpb25fZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggLSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19jdGNfY291bnRfc3VwcF92ZXJzaW9uKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm9hbV92ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cmV2aXNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3N0YXRlX3BhY2sodGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnX3BhY2sodGhpcy0+b2FtX2NvbmZpZywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4X3BkdV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT52ZW5kb3Jfc3BlY2lmaWNfaW5mb3JtYXRpb24sIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAyLCBidWYtPmN1cnIpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+b2FtX3ZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnJldmlzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZV91bnBhY2soJnRoaXMtPnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnX3VucGFjaygmdGhpcy0+b2FtX2NvbmZpZywgJnBvc3RMZW5CdWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPm1heF9wZHVfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZ0aGlzLT5vdWksICZwb3N0TGVuQnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCAtIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19wYWNrKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9SRU1PVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fcGFjaygmdGhpcy0+dS5yZW1vdGUuaW5mbywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19wYWNrKCZ0aGlzLT51LmxvY2FsLmluZm8sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9SRU1PVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX3VucGFjaygmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX1JFTU9URToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb191bnBhY2soJnRoaXMtPnUucmVtb3RlLmluZm8sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb191bnBhY2soJnRoaXMtPnUubG9jYWwuaW5mbywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlIHR5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfUkVNT1RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX0xPQ0FMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZV9wYWNrKHRoaXMtPnUudGVrLmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LnRlay5yYWlzZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnRlay5wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS50ZWsubGluaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudGVrLnF1ZXVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dF9wYWNrKHRoaXMtPnUudGVrLmFsYXJtX2NvbnRleHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX3BhY2soJnRoaXMtPnUuZHBvZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV9wYWNrKCZ0aGlzLT51LmN0Yy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA0OworICAgIHN3aXRjaCAodGhpcy0+b3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRwb2UudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmN0Yy52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAyLCBidWYtPmN1cnIpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmdGhpcy0+b3VpLCAmcG9zdExlbkJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfdW5wYWNrKCZ0aGlzLT51LnRlay5hbGFybV9jb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudGVrLnJhaXNlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50ZWsucG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50ZWsubGluaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50ZWsucXVldWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0X3VucGFjaygmdGhpcy0+dS50ZWsuYWxhcm1fY29udGV4dCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZV91bnBhY2soJnRoaXMtPnUuZHBvZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfdW5wYWNrKCZ0aGlzLT51LmN0Yy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoIC0gMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAyLCBwYWNrZWQtPmN1cnIpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmb3VpLCAmcG9zdExlbkJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggLSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2VfcGFjaygmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRV9QRVJJT0Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FX1NFQ09ORFNfU1VNTUFSWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfU1lNQk9MX1BFUklPRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FX1BFUklPRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUVfU0VDT05EU19TVU1NQVJZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9TWU1CT0xfUEVSSU9EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUVfUEVSSU9EOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRV9TRUNPTkRTX1NVTU1BUlk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX1NZTUJPTF9QRVJJT0Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZSB0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRV9QRVJJT0Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FX1NFQ09ORFNfU1VNTUFSWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfU1lNQk9MX1BFUklPRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdF9wYWNrKHRoaXMtPnUub2JqZWN0LmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlX3BhY2sodGhpcy0+dS5wYWNrYWdlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZ19wYWNrKHRoaXMtPnUubmFtZV9iaW5kaW5nLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0X3VucGFjaygmdGhpcy0+dS5vYmplY3QubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2VfdW5wYWNrKCZ0aGlzLT51LnBhY2thZ2UubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nX3VucGFjaygmdGhpcy0+dS5uYW1lX2JpbmRpbmcubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoIGJyYW5jaDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoX3VucGFjaygmYnJhbmNoLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoX3BhY2sodGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0X3BhY2sodGhpcy0+dS5vYmplY3QubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vYmplY3Qud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub2JqZWN0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9iamVjdC52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm9iamVjdC52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2Vfb2JqZWN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUub2JqZWN0LnZhbHVlLCB0aGlzLT51Lm9iamVjdC52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlX3BhY2sodGhpcy0+dS5wYWNrYWdlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucGFja2FnZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wYWNrYWdlLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnBhY2thZ2UudmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5wYWNrYWdlLnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrYWdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUucGFja2FnZS52YWx1ZSwgdGhpcy0+dS5wYWNrYWdlLnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nX3BhY2sodGhpcy0+dS5uYW1lX2JpbmRpbmcubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5uYW1lX2JpbmRpbmcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubmFtZV9iaW5kaW5nLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfbmFtZV9iaW5kaW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubmFtZV9iaW5kaW5nLnZhbHVlLCB0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuYXR0cmlidXRlLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmF0dHJpYnV0ZS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hdHRyaWJ1dGUudmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdHRyaWJ1dGUudmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2F0dHJpYnV0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZSwgdGhpcy0+dS5hdHRyaWJ1dGUudmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFjdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hY3Rpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWN0aW9uLnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWN0aW9uLnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hY3Rpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5hY3Rpb24udmFsdWUsIHRoaXMtPnUuYWN0aW9uLnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRlZi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgdGhpcy0+dS5vYmplY3QudmFsdWVfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51LnBhY2thZ2UudmFsdWVfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMyArIHRoaXMtPnUubmFtZV9iaW5kaW5nLnZhbHVlX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgdGhpcy0+dS5hY3Rpb24udmFsdWVfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3RfdW5wYWNrKCZ0aGlzLT51Lm9iamVjdC5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub2JqZWN0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vYmplY3Qud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vYmplY3Qud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9iamVjdC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm9iamVjdC52YWx1ZV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2Vfb2JqZWN0X2NvdW50X3ZhbHVlKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub2JqZWN0LnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub2JqZWN0LnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX29iamVjdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9iamVjdC52YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9iamVjdC52YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5vYmplY3QudmFsdWUsIHRoaXMtPnUub2JqZWN0LnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9iamVjdC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub2JqZWN0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlX3VucGFjaygmdGhpcy0+dS5wYWNrYWdlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5wYWNrYWdlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wYWNrYWdlLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucGFja2FnZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucGFja2FnZS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnBhY2thZ2UudmFsdWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2thZ2VfY291bnRfdmFsdWUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5wYWNrYWdlLnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucGFja2FnZS52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrYWdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucGFja2FnZS52YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnBhY2thZ2UudmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUucGFja2FnZS52YWx1ZSwgdGhpcy0+dS5wYWNrYWdlLnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBhY2thZ2Uud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBhY2thZ2Uud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nX3VucGFjaygmdGhpcy0+dS5uYW1lX2JpbmRpbmcubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm5hbWVfYmluZGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubmFtZV9iaW5kaW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUubmFtZV9iaW5kaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5uYW1lX2JpbmRpbmcud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX25hbWVfYmluZGluZ19jb3VudF92YWx1ZSgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9uYW1lX2JpbmRpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubmFtZV9iaW5kaW5nLnZhbHVlLCB0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5uYW1lX2JpbmRpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm5hbWVfYmluZGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYXR0cmlidXRlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hdHRyaWJ1dGUud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5hdHRyaWJ1dGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmF0dHJpYnV0ZS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfYXR0cmlidXRlX2NvdW50X3ZhbHVlKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYXR0cmlidXRlLnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXR0cmlidXRlLnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2F0dHJpYnV0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5hdHRyaWJ1dGUudmFsdWUsIHRoaXMtPnUuYXR0cmlidXRlLnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmF0dHJpYnV0ZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYXR0cmlidXRlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hY3Rpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFjdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmFjdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYWN0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIHRoaXMtPnUuYWN0aW9uLnZhbHVlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hY3Rpb25fY291bnRfdmFsdWUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hY3Rpb24udmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hY3Rpb24udmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfYWN0aW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYWN0aW9uLnZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYWN0aW9uLnZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmFjdGlvbi52YWx1ZSwgdGhpcy0+dS5hY3Rpb24udmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuYWN0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5hY3Rpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoIGJyYW5jaDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoX3VucGFjaygmYnJhbmNoLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhbHVlX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFsdWVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhbHVlX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YWx1ZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFsdWVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2Vfb2JqZWN0X2NvdW50X3ZhbHVlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfcGFja2FnZV9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX25hbWVfYmluZGluZ19jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2F0dHJpYnV0ZV9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2FjdGlvbl9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBvcnRfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGlua19udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZV9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvcnRfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGlua19udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5xdWV1ZV9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZV9wYWNrKHRoaXMtPm9iamVjdF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbmd0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b2JqZWN0X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTE9HSUNBTF9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua19udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2xvZ2ljYWxfbGlua1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlciwgdGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUVVFVUVfTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWVfcGFjaygmdGhpcy0+dS5xdWV1ZV9uYW1lLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucG9ydC5wb3J0X251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LnBvcnQucG9ydF9udW1iZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydF9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyLCB0aGlzLT51LnBvcnQucG9ydF9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQUxMX1FVRVVFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWVfcGFjaygmdGhpcy0+dS5hbGxfcXVldWVzLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTkVUV09SS19QT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvbl9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X25ldHdvcmtfcG9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlciwgdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1VTRVJfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb25fbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF91c2VyX3BvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXIsIHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9GTE9XX0RJUkVDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbl9wYWNrKHRoaXMtPnUuZmxvd19kaXJlY3Rpb24uZGlyZWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5icmlkZ2UuYnJpZGdlX251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImJyaWRnZV9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyLCB0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0JSSURHRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRfbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9icmlkZ2VfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfbnVtYmVyLCB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+bGVuZ3RoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b2JqZWN0X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9MT0dJQ0FMX0xJTks6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlcl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUVVFVUVfTkFNRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LnBvcnQucG9ydF9udW1iZXJfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0FMTF9RVUVVRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlcl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfVVNFUl9QT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXJfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0ZMT1dfRElSRUNUSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5icmlkZ2UuYnJpZGdlX251bWJlcl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfbnVtYmVyX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlX3VucGFjaygmdGhpcy0+b2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPmxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9iamVjdF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0xPR0lDQUxfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlcl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfbG9naWNhbF9saW5rX2NvdW50X2xpbmtfbnVtYmVyKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubG9naWNhbF9saW5rLmxpbmtfbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubG9naWNhbF9saW5rLmxpbmtfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua19udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2xvZ2ljYWxfbGlua1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlciA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlcl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXIsIHRoaXMtPnUubG9naWNhbF9saW5rLmxpbmtfbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1FVRVVFX05BTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lX3VucGFjaygmdGhpcy0+dS5xdWV1ZV9uYW1lLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9wb3J0X2NvdW50X3BvcnRfbnVtYmVyKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucG9ydC5wb3J0X251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LnBvcnQucG9ydF9udW1iZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X251bWJlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnBvcnQucG9ydF9udW1iZXIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnBvcnQucG9ydF9udW1iZXIsIHRoaXMtPnUucG9ydC5wb3J0X251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9BTExfUVVFVUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZV91bnBhY2soJnRoaXMtPnUuYWxsX3F1ZXVlcy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9udW1iZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X25ldHdvcmtfcG9uX2NvdW50X3Bvbl9udW1iZXIoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvbl9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X25ldHdvcmtfcG9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlciA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9udW1iZXJfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlciwgdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1VTRVJfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlcl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdXNlcl9wb25fY291bnRfcG9uX251bWJlcigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9uX251bWJlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdXNlcl9wb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlcl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyLCB0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfRkxPV19ESVJFQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmZsb3dfZGlyZWN0aW9uLmRpcmVjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZV9jb3VudF9icmlkZ2VfbnVtYmVyKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5icmlkZ2UuYnJpZGdlX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImJyaWRnZV9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXJfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXIsIHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfYnJpZGdlX3BvcnRfY291bnRfcG9ydF9udW1iZXIoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydF9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZV9wb3J0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9udW1iZXIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlciwgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZV91bnBhY2soJm9iamVjdF90eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChvYmplY3RfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9MT0dJQ0FMX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbGlua19udW1iZXJfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbGlua19udW1iZXJfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChsaW5rX251bWJlcl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUVVFVUVfTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfbnVtYmVyX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBvcnRfbnVtYmVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9ydF9udW1iZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0FMTF9RVUVVRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTkVUV09SS19QT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcG9uX251bWJlcl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwb25fbnVtYmVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9uX251bWJlcl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfVVNFUl9QT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcG9uX251bWJlcl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwb25fbnVtYmVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9uX251bWJlcl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfRkxPV19ESVJFQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJyaWRnZV9udW1iZXJfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJpZGdlX251bWJlcl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGJyaWRnZV9udW1iZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0JSSURHRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfbnVtYmVyX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBvcnRfbnVtYmVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9ydF9udW1iZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2xvZ2ljYWxfbGlua19jb3VudF9saW5rX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3BvcnRfY291bnRfcG9ydF9udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9uZXR3b3JrX3Bvbl9jb3VudF9wb25fbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdXNlcl9wb25fY291bnRfcG9uX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZV9jb3VudF9icmlkZ2VfbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfYnJpZGdlX3BvcnRfY291bnRfcG9ydF9udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9wYWNrKCZ0aGlzLT51Lm5hbWVfYmluZGluZy5vYmplY3RfY29udGV4dCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpIHRoaXMtPnUuYXR0cmlidXRlLmxlYWYgPT0gMHg3RkU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3BhY2sodGhpcy0+dS5hdHRyaWJ1dGUuYWxhcm1fY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5uYW1lX2JpbmRpbmcub2JqZWN0X2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfZW5kX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3VucGFjaygmdGhpcy0+dS5uYW1lX2JpbmRpbmcub2JqZWN0X2NvbnRleHQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB3aWR0aCA9IDA7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpIHRoaXMtPnUuYXR0cmlidXRlLmxlYWYgPT0gMHg3RkU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJndpZHRoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB3aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoKCh1aW50NjRfdCkgdGhpcy0+dS5hdHRyaWJ1dGUubGVhZiA9PSAweDdGRTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5hbGFybV9jb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1Ziwgd2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxheWVyX3NlbGVjdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZHdvcmRfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5maWVsZF9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmJpdF9vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sYXllcl9zZWxlY3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmR3b3JkX29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZmllbGRfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5iaXRfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfZmllbGRfc2VsZWN0X3BhY2sodGhpcy0+ZmllbGRfc2VsZWN0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5sb29rdXBfdmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvcl9wYWNrKHRoaXMtPm9wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdF91bnBhY2soJnRoaXMtPmZpZWxkX3NlbGVjdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bG9va3VwX3ZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT5vcCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kaXJlY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFnc19wYWNrKHRoaXMtPmZsYWdzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBvcnRfbGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cXVldWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT52aWRfY29zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cHJlY2VkZW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jbGF1c2VzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmNsYXVzZXNfY291bnQgPiAwKSAmJiAodGhpcy0+Y2xhdXNlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbGF1c2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jbGF1c2VzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZV9wYWNrKCZ0aGlzLT5jbGF1c2VzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKnRoaXMpCit7CisgICAgcmV0dXJuIDEwICsgKDEwICogdGhpcy0+Y2xhdXNlc19jb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmRpcmVjdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzX3VucGFjaygmdGhpcy0+ZmxhZ3MsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cG9ydF9saW5rKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5xdWV1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnZpZF9jb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wcmVjZWRlbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNsYXVzZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+Y2xhdXNlc19jb3VudCA+IDApICYmICh0aGlzLT5jbGF1c2VzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Y2xhdXNlcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+Y2xhdXNlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+Y2xhdXNlc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2VfdW5wYWNrKCZ0aGlzLT5jbGF1c2VzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGNsYXVzZXNfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmNsYXVzZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UpICogY2xhdXNlc19jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBjbGF1c2VzX2NvdW50ICogMTApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW5fcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT5lcG9uX3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV92bGFuX3RhZyhidWYsIHRoaXMtPnVzZXJfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWF4X2FsbG93ZWRfZ3JvdXBzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT5lcG9uX3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3ZsYW5fdGFnKGJ1ZiwgJnRoaXMtPnVzZXJfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWF4X2FsbG93ZWRfZ3JvdXBzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT52bGFuX3RhZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGlua19pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cXVldWVfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT52bGFuX3RhZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGlua19pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cXVldWVfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnllYXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1vbnRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kYXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmhvdXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1pbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c2VjKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXBfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnllYXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1vbnRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kYXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmhvdXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c2VjKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXBfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZWFybmluZ19kb21haW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnN0YXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJpZ2h0X21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZV9wYWNrKHRoaXMtPmJpbnNlbGVjdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJpbnNlbGVjdCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjX3BhY2soJnRoaXMtPnUuc2EudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjX3BhY2soJnRoaXMtPnUuZGEudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TU01fUExVU19JUERBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXBfcGFjaygmdGhpcy0+dS5zc21fcGx1c19pcGRhLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfUFJPR19GSUVMRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlX3BhY2soJnRoaXMtPnUucHJvZ19maWVsZC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX0NWTEFOX1ZJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZF9wYWNrKCZ0aGlzLT51LmN2bGFuX3ZpZC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NWTEFOX1ZJRF9DVkxBTl9WSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW5fcGFjaygmdGhpcy0+dS5zdmxhbl92aWRfY3ZsYW5fdmlkLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDU7CisgICAgc3dpdGNoICh0aGlzLT5iaW5zZWxlY3QpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU1NNX1BMVVNfSVBEQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9QUk9HX0ZJRUxEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX0NWTEFOX1ZJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TVkxBTl9WSURfQ1ZMQU5fVklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlYXJuaW5nX2RvbWFpbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c3RhdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmlnaHRfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlX3VucGFjaygmdGhpcy0+Ymluc2VsZWN0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Ymluc2VsZWN0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfdW5wYWNrKCZ0aGlzLT51LnNhLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjX3VucGFjaygmdGhpcy0+dS5kYS52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU1NNX1BMVVNfSVBEQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwX3VucGFjaygmdGhpcy0+dS5zc21fcGx1c19pcGRhLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9QUk9HX0ZJRUxEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGVfdW5wYWNrKCZ0aGlzLT51LnByb2dfZmllbGQudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX0NWTEFOX1ZJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZF91bnBhY2soJnRoaXMtPnUuY3ZsYW5fdmlkLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TVkxBTl9WSURfQ1ZMQU5fVklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuX3VucGFjaygmdGhpcy0+dS5zdmxhbl92aWRfY3ZsYW5fdmlkLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZSBiaW5zZWxlY3Q7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlX3VucGFjaygmYmluc2VsZWN0LCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYmluc2VsZWN0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU1NNX1BMVVNfSVBEQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfUFJPR19GSUVMRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfQ1ZMQU5fVklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TVkxBTl9WSURfQ1ZMQU5fVklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGVfcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9URVJNSU5BVE9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5oZWFkZXIucHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfQ0xBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0X3BhY2sodGhpcy0+dS5jbGF1c2UuZmllbGRfc2VsZWN0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY2xhdXNlLmZpZWxkX2luc3RhbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNsYXVzZS5tc2JfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jbGF1c2UubHNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3JfcGFjayh0aGlzLT51LmNsYXVzZS5vcGVyYXRvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hdGNoX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9jbGF1c2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbl9wYWNrKHRoaXMtPnUucmVzdWx0LnJlc3VsdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVzdWx0LnBhcmFtZXRlcl9jb3VudCA+IDApICYmICh0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicGFyYW1ldGVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9yZXN1bHRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyLCB0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV9wYWNrKCZ0aGlzLT51LmVudHJ5LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9URVJNSU5BVE9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfQ0xBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDUgKyB0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXJfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmVudHJ5LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaGVhZGVyLnByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdF91bnBhY2soJnRoaXMtPnUuY2xhdXNlLmZpZWxkX3NlbGVjdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmNsYXVzZS5maWVsZF9pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5jbGF1c2UubXNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuY2xhdXNlLmxzYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5jbGF1c2Uub3BlcmF0b3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX2NsYXVzZV9jb3VudF9tYXRjaF92YWx1ZShidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYXRjaF92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfY2xhdXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbl91bnBhY2soJnRoaXMtPnUucmVzdWx0LnJlc3VsdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3Jlc3VsdF9jb3VudF9wYXJhbWV0ZXIoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVzdWx0LnBhcmFtZXRlcl9jb3VudCA+IDApICYmICh0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwYXJhbWV0ZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3Jlc3VsdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyLCB0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV91bnBhY2soJnRoaXMtPnUuZW50cnkudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGUgbGVhZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGVfdW5wYWNrKCZsZWFmLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9URVJNSU5BVE9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXRjaF92YWx1ZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1hdGNoX3ZhbHVlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobWF0Y2hfdmFsdWVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXJhbWV0ZXJfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocGFyYW1ldGVyX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9FTlRSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX2NsYXVzZV9jb3VudF9tYXRjaF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3Jlc3VsdF9jb3VudF9wYXJhbWV0ZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnF1ZXVlX2JpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNoYXBlX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5idXJzdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnF1ZXVlX2JpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNoYXBlX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5idXJzdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1ham9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5taW5vcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBhdGNoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX3ZlcnNpb25fbnVtYmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5tYWpvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWlub3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wYXRjaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5X3BhY2sodGhpcy0+bWF0dXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXJfcGFjaygmdGhpcy0+dmVyc2lvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWxfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5X3VucGFjaygmdGhpcy0+bWF0dXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXJfdW5wYWNrKCZ0aGlzLT52ZXJzaW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfcGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlZ2FjeV92ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsX3BhY2soJnRoaXMtPm5ld192ZXJzaW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zdHJlYW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yZXZpc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNyYykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcF9wYWNrKCZ0aGlzLT50aW1lc3RhbXAsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVnYWN5X3ZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWxfdW5wYWNrKCZ0aGlzLT5uZXdfdmVyc2lvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zdHJlYW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZXZpc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNyYykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcF91bnBhY2soJnRoaXMtPnRpbWVzdGFtcCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGVfcGFjayh0aGlzLT5maWxlX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5maWxlX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQk9PVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfcGFjaygmdGhpcy0+dS5ib290LmluZm8sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0ZJTEVfVFlQRV9BUFBfTUFJTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfcGFjaygmdGhpcy0+dS5hcHBfbWFpbi5pbmZvLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQVBQX0JBQ0tVUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfcGFjaygmdGhpcy0+dS5hcHBfYmFja3VwLmluZm8sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+ZmlsZV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0JPT1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9NQUlOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0ZJTEVfVFlQRV9BUFBfQkFDS1VQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlX3VucGFjaygmdGhpcy0+ZmlsZV90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmlsZV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0JPT1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3VucGFjaygmdGhpcy0+dS5ib290LmluZm8sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9NQUlOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZV91bnBhY2soJnRoaXMtPnUuYXBwX21haW4uaW5mbywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQVBQX0JBQ0tVUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfdW5wYWNrKCZ0aGlzLT51LmFwcF9iYWNrdXAuaW5mbywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlIGZpbGVfdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGVfdW5wYWNrKCZmaWxlX3R5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChmaWxlX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQk9PVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDI2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9NQUlOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQVBQX0JBQ0tVUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDI2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pZHgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pZHgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDMyOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRfcGFjaygmdGhpcy0+bG9hZFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDMyOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRfdW5wYWNrKCZ0aGlzLT5sb2FkW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmlkeCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT52YWx1ZSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnZhbHVlLCB0aGlzLT52YWx1ZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMiArIHRoaXMtPnZhbHVlX2NvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aWR4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICB0aGlzLT52YWx1ZV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X2NvdW50X3ZhbHVlKGJ1Zik7CisgICAgaWYgKCh0aGlzLT52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT52YWx1ZSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT52YWx1ZSwgdGhpcy0+dmFsdWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCB2YWx1ZV9lbGVtX2NvdW50ID0gMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZV9lbGVtX2NvdW50ICs9IDE7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhbHVlX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGV2ZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndlaWdodCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cXVldWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cXVldWVfY291bnQgPiAwKSAmJiAodGhpcy0+cXVldWVfc2l6ZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2l6ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnF1ZXVlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlX3NpemVzW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICp0aGlzKQoreworICAgIHJldHVybiAzICsgKDIgKiB0aGlzLT5xdWV1ZV9jb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxldmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53ZWlnaHQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnF1ZXVlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnF1ZXVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnF1ZXVlX3NpemVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2l6ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnF1ZXVlX3NpemVzID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5xdWV1ZV9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+cXVldWVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWVfc2l6ZXNbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBxdWV1ZV9jb3VudDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcXVldWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDE2X3QpICogcXVldWVfY291bnQpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgcXVldWVfY291bnQgKiAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGVfcGFjayh0aGlzLT5zdWJ0eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3VidHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX0hFQURFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVfcGFjayh0aGlzLT51LmhlYWRlci5yZXBvcnRfY29uZmlnLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5saW5rLnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubGluay5wcmlvcml0eV9jb3VudCA+IDApICYmICh0aGlzLT51LmxpbmsucHJpb3JpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwcmlvcml0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX2xpbmtcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5saW5rLnByaW9yaXR5X2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3BhY2soJnRoaXMtPnUubGluay5wcmlvcml0aWVzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBvcnQucHJpb3JpdHlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5wb3J0LnByaW9yaXR5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucG9ydC5wcmlvcml0aWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnBvcnQucHJpb3JpdHlfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfcGFjaygmdGhpcy0+dS5wb3J0LnByaW9yaXRpZXNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmxpbmsucHJpb3JpdHlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5saW5rLnByaW9yaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicHJpb3JpdHlfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmxpbmsucHJpb3JpdHlfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmxpbmsucHJpb3JpdGllc1tpMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnBvcnQucHJpb3JpdHlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5wb3J0LnByaW9yaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicHJpb3JpdHlfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnBvcnQucHJpb3JpdHlfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnBvcnQucHJpb3JpdGllc1tpMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9URVJNSU5BVE9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGVfdW5wYWNrKCZ0aGlzLT5zdWJ0eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3VidHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX0hFQURFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVfdW5wYWNrKCZ0aGlzLT51LmhlYWRlci5yZXBvcnRfY29uZmlnLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5saW5rLnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubGluay5wcmlvcml0eV9jb3VudCA+IDApICYmICh0aGlzLT51LmxpbmsucHJpb3JpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfbGlua1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmxpbmsucHJpb3JpdGllcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmxpbmsucHJpb3JpdHlfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5saW5rLnByaW9yaXR5X2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3VucGFjaygmdGhpcy0+dS5saW5rLnByaW9yaXRpZXNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5wb3J0LnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucG9ydC5wcmlvcml0eV9jb3VudCA+IDApICYmICh0aGlzLT51LnBvcnQucHJpb3JpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnBvcnQucHJpb3JpdGllcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnBvcnQucHJpb3JpdHlfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5wb3J0LnByaW9yaXR5X2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3VucGFjaygmdGhpcy0+dS5wb3J0LnByaW9yaXRpZXNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9URVJNSU5BVE9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZSBzdWJ0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlX3VucGFjaygmc3VidHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHByaW9yaXR5X2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcHJpb3JpdHlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSkgKiBwcmlvcml0eV9jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgcHJpb3JpdHlfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcHJpb3JpdHlfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZwcmlvcml0eV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5KSAqIHByaW9yaXR5X2NvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCBwcmlvcml0eV9jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX1RFUk1JTkFUT1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgcmV0ID0gMDsKKyAgICByZXQgfD0gKCh0aGlzLT5lbmRfb2Zfc2VxdWVuY2UgJiAweDAwMDEpIDw8IDE1KTsKKyAgICByZXQgfD0gKHRoaXMtPnNlcXVlbmNlX251bWJlciAmIDB4N0ZGRik7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHJldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IHZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICB0aGlzLT5lbmRfb2Zfc2VxdWVuY2UgPSAoKHZhbCA+PiAxNSkgJiAweDAwMDEpOworICAgIHRoaXMtPnNlcXVlbmNlX251bWJlciA9ICh2YWwgJiAweDdGRkYpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWdfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5X3BhY2sodGhpcy0+a2V5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmVfaW5pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT50b2RfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9uZV9wcHNfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfczMyKGJ1ZiwgdGhpcy0+b25lX3Bwc19vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yb3VuZF90cmlwX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5vbmVfcHBzX2hhbGZfcGVyaW9kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5X3VucGFjaygmdGhpcy0+a2V5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cmVfaW5pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT50b2RfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9uZV9wcHNfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9zMzIoYnVmLCAmdGhpcy0+b25lX3Bwc19vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yb3VuZF90cmlwX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5vbmVfcHBzX2hhbGZfcGVyaW9kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm9fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5ncm91cF9saW1pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZmNfbGltaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmFjdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVwX2Vwb25fdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dXBfdW5pX3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dXBfbGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZG5xKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51cHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmdyb3VwX2xpbWl0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5mY19saW1pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+YWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dXBfZXBvbl92aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51cF91bmlfdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51cF9saW5rKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kbnEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnVwcSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDExKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kbl9saW5rKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uX3BhY2sodGhpcy0+b3B0aW9ucywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9mb3J3YXJkX3F1YWxpZmllcl9wYWNrKHRoaXMtPmZ3ZF9xdWFsLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5hY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5kbl9lcG9uX3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmRuX3VuaV92aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm51bV9wb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm51bV9wb3J0ID4gMCkgJiYgKHRoaXMtPnBvcnRfaW5mbyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X2luZm9cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm51bV9wb3J0OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm9fcGFjaygmdGhpcy0+cG9ydF9pbmZvW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gKnRoaXMpCit7CisgICAgcmV0dXJuIDEyICsgKDExICogdGhpcy0+bnVtX3BvcnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZG5fbGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbl91bnBhY2soJnRoaXMtPm9wdGlvbnMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXJfdW5wYWNrKCZ0aGlzLT5md2RfcXVhbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+YWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+ZG5fZXBvbl92aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5kbl91bmlfdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5udW1fcG9ydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5udW1fcG9ydCA+IDApICYmICh0aGlzLT5wb3J0X2luZm8gPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X2luZm9cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnBvcnRfaW5mbyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm8gKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPm51bV9wb3J0ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbykpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bnVtX3BvcnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mb191bnBhY2soJnRoaXMtPnBvcnRfaW5mb1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBudW1fcG9ydDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbnVtX3BvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvKSAqIG51bV9wb3J0KTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIG51bV9wb3J0ICogMTEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm51bV9kb21haW5zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm51bV9kb21haW5zID4gMCkgJiYgKHRoaXMtPmRvbWFpbiA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb21haW5cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bnVtX2RvbWFpbnM7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fcGFjaygmdGhpcy0+ZG9tYWluW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPm51bV9kb21haW5zID4gMCkgJiYgKHRoaXMtPmRvbWFpbiA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJudW1fZG9tYWluc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm51bV9kb21haW5zOyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZG9tYWluW2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtX2RvbWFpbnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bnVtX2RvbWFpbnMgPiAwKSAmJiAodGhpcy0+ZG9tYWluID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG9tYWluXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmRvbWFpbiA9IChiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5udW1fZG9tYWlucyAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5udW1fZG9tYWluczsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb191bnBhY2soJnRoaXMtPmRvbWFpbltpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IG51bV9kb21haW5zOworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbnVtX2RvbWFpbnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbykgKiBudW1fZG9tYWlucyk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgbnVtX2RvbWFpbnM7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aWR0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubHVlX2ZpZWxkX3NlbGVjdC5pZHgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnlfcGFjaygmdGhpcy0+dS5sdWVfZmllbGRfc2VsZWN0LmRlZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfZnJhbWVzX3R4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfc2luZ2xlX2NvbGxfZnJhbWVzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19tdWx0aXBsZV9jb2xsX2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2ZyYW1lc19yeF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZDU19FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19mY3NfZXJyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfYWxpZ25fZXJyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfb2N0ZXRzX3R4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfbGF0ZV9jb2xsaXNpb25zLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19leGNlc3NpdmVfY29sbGlzaW9ucy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX29jdGV0c19yeF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX21jYXN0X2ZyYW1lc190eF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2JjYXN0X2ZyYW1lc190eF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX21jYXN0X2ZyYW1lc19yeF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2JjYXN0X2ZyYW1lc19yeF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19pbl9yYW5nZV9sZW5fZXJyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19mcmFtZV90b29fbG9uZy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2VuYWJsZV9zdGF0dXMuZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX3BoeV9zeW1ib2xfZXJyX2R1cmluZ19jYXJyaWVyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2N0cmxfcGF1c2VfdHgudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfY3RybF9wYXVzZV9yeC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9vYW1fbG9jYWxfZXJyX2ZyYW1lX3NlY3NfZXZlbnQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX29hbV9lbXVsX2NyYzhlcnIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tcGNwX21hY19jdHJsX2ZyYW1lc190eC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21wY3BfbWFjX2N0cmxfZnJhbWVzX3J4LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21wY3BfdHhfcmVnX2Fjay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbXBjcF90eF9yZWdfcmVxdWVzdC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21wY3BfdHhfcmVwb3J0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21wY3BfcnhfZ2F0ZS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbXBjcF9yeF9yZWdpc3Rlci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEJMX1NJWkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZHluX2xlYXJuX3RibF9zaXplLnRhYmxlX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5keW5fbGVhcm5fYWdlX2xpbWl0LmFnZV9saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF91bmljYXN0X2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF91bmljYXN0X2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWVfdG9vX3Nob3J0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWU2NC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1VE8xMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWU2NXRvMTI3LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWUxMjh0bzI1NS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lMjU2dG81MTEudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWU1MTJ0bzEwMjMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lMTAyNHRvMTUxOC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lMTUxOXBsdXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTY0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTY1dG8xMjcudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTEyOHRvMjU1LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWUyNTZ0bzUxMS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTUxMnRvMTAyMy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWUxMDI0dG8xNTE4LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWUxNTE5cGx1cy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS50eF9kZWxheV90aHJlc2hvbGQuZGVsYXlfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2RlbGF5LmRlbGF5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfYnl0ZXNfZHJvcHBlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2J5dGVzX2RlbGF5ZWQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2J5dGVzX3VudXNlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5yeF9kZWxheV90aHJlc2hvbGQuZGVsYXlfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2RlbGF5LmRlbGF5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfYnl0ZXNfZHJvcHBlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2J5dGVzX2RlbGF5ZWQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNob2xkLnN0YXRpc3RpY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucG9ydF9zdGF0X3RocmVzaG9sZC5yaXNpbmdfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNob2xkLmZhbGxpbmdfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubGlua19zdGF0X3RocmVzaG9sZC5zdGF0aXN0aWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2hvbGQucmlzaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUubGlua19zdGF0X3RocmVzaG9sZC5mYWxsaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUX0tFWV9FWFBJUllfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5lbmNyeXB0X2tleV9leHBpcnlfdGltZS50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJPUl9ESVNDQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubGVuX2Vycm9yX2Rpc2NhcmQubGVuX2Vycm9yX2Rpc2NhcmQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMudGhyZXNob2xkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0aHJlc2hvbGRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcmVwb3J0X3RocmVzaG9sZHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMudGhyZXNob2xkc1tpMF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnZsYW5fZXRoZXJ0eXBlLnZsYW5fZXRoZXJfdHlwZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LnZsYW5fZXRoZXJ0eXBlLnVzZV9mb3JfdXBzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS52bGFuX2V0aGVydHlwZS51c2VfZm9yX2Rvd25zdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5jdXJyZW50X2NhcHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5waHlzaWNhbF9jYXBzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19ETl9GSUxURVJfVEJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV3X2RuX2ZpbHRlcl90YmxcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9wYWNrKCZ0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld191cF9maWx0ZXJfdGJsXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfcGFjaygmdGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlc1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQVJQX1JFUExJQ0FURV9ERVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmFycF9yZXBsaWNhdGVfZGVzdC5kZXN0aW5hdGlvbl9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEFDUF9ERVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmxhY3BfZGVzdC5kZXN0aW5hdGlvbl9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0lHTVBfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2lnbXBfdmxhbi5hY3Rpb25fZm9yX3VubWFuX2dycCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfaWdtcF92bGFuLnZsYW5zX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9vbnVfaWdtcF92bGFuXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3BhY2soJnRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOSU5HX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5keW5fbGVhcm5pbmdfbW9kZS5sZWFybmluZ19tb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubWluX21hY19saW1pdC5saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfQUdHUkVHQVRFX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2FnZ3JlZ2F0ZV9saW1pdC5saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU0NSQVRDSFBBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51Lm52c19zY3JhdGNocGFkLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX252c19zY3JhdGNocGFkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YSwgdGhpcy0+dS5udnNfc2NyYXRjaHBhZC5kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5mbG9vZF91bmtub3duLmZsb29kX3Vua25vd25fb3B0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmxvY2FsX3N3aXRjaGluZy5sb2NhbF9zd2l0Y2hfb3B0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RPV05fQlVSU1RfVE9MTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRvd25fYnVyc3RfdG9sbC5kb3duX2J1cnN0X3RvbGxfb3B0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmVjX21vZGUuZG93bnN0cmVhbV9mZWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmVjX21vZGUudXBzdHJlYW1fZmVjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9URU1QRVJBVFVSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wb3dlcl9tb25fdGVtcGVyYXR1cmUudGVtcGVyYXR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wb3dlcl9tb25fdmNjLnZjYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfQklBUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wb3dlcl9tb25fdHhfYmlhcy5iaWFzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wb3dlcl9tb25fdHhfcG93ZXIucG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1JYX1BPV0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBvd2VyX21vbl9yeF9wb3dlci5wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVRXT1JLX1BPTl9NQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5uZXR3b3JrX3Bvbl9tYXAubmV0d29ya19lcG9uX3BvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmV0d29ya19lcG9uX3BvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV0d29ya19wb25fbWFwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0cywgdGhpcy0+dS5uZXR3b3JrX3Bvbl9tYXAubmV0d29ya19lcG9uX3BvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BTU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGVfcGFjayh0aGlzLT51LnBzc3RhdGUuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TTEVfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNsZV9tb2RlLmZpZWxkX3NlbGVjdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9UQUJMRV9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlX3BhY2sodGhpcy0+dS5sZWFybl90YWJsZV9tb2RlLmxlYXJuX3RhYmxlX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9TSUdOQUxfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS50cmFuc2NlaXZlcl9zaWduYWxfZGV0ZWN0LnNpZ25hbF9kZXRlY3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1JPU1NCQVJfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY3Jvc3NiYXJfY29uZmlnLnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudCA+IDApICYmICh0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9jcm9zc2Jhcl9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydCwgdGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9CVVJTVF9BQ1RJVklUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUudHJhbnNjZWl2ZXJfYnVyc3RfYWN0aXZpdHkuYnVyc3RfYWN0aXZpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09OVFJPTF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY29udHJvbF9wb3J0Lm5ldHdvcmtfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0RFU1RJTkFUSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGVfcGFjayh0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hdGNoX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fZmxhZ3NfcGFjayh0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMuZGVmYXVsdF9saW5rX2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLmRlZmF1bHRfcXVldWVfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5nc19jb3VudCA+IDApICYmICh0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hcHBpbmdzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfdmxhbl9kZXN0aW5hdGlvbnNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQgPiAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZ19wYWNrKCZ0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzW2k0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZV9wYWNrKHRoaXMtPnUuZW5jcnlwdGlvbl9tb2RlLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9uc19wYWNrKHRoaXMtPnUuZW5jcnlwdGlvbl9tb2RlLm9wdGlvbnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTlRFUk5BTF9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmludGVybmFsX3ZlcnNpb24uc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5pbnRlcm5hbF92ZXJzaW9uLnJldmlzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1RJTUVTVEFNUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wX3BhY2soJnRoaXMtPnUuZmlybXdhcmVfdGltZXN0YW1wLnRpbWVzdGFtcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9wYWNrKCZ0aGlzLT51Lm9udV9ydWxlLnJ1bGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT0xJQ0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uX3BhY2sodGhpcy0+dS5wb2xpY2VyLmRpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBvbGljZXIucG9saWNlcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucG9saWNlci5idXJzdF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5wb2xpY2VyLnRyYWZmaWNfcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VTklfU0hBUEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS51bmlfc2hhcGVyLm51bWJlcl9vZl9zaGFwZXJzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudW5pX3NoYXBlci5udW1iZXJfb2Zfc2hhcGVycyA+IDApICYmICh0aGlzLT51LnVuaV9zaGFwZXIudW5pX3NoYXBlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmlfc2hhcGVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfdW5pX3NoYXBlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnVuaV9zaGFwZXIubnVtYmVyX29mX3NoYXBlcnM7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyX3BhY2soJnRoaXMtPnUudW5pX3NoYXBlci51bmlfc2hhcGVyW2k1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsX3BhY2soJnRoaXMtPnUuZXh0X2Zpcm13YXJlX3ZlcnNpb24udmVyc2lvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fS0VZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbl9wYWNrKHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkuZGlyZWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwia2V5X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9lbmNyeXB0aW9uX2tleVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9kYXRhLCB0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklMRV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlX3BhY2soJnRoaXMtPnUuZmlsZV9pbmZvLmZpbGVfaW5mbywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NZU1RFTV9SVUxFX09QVElPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zeXN0ZW1fcnVsZV9vcHRpb25zLnN5c3RlbV9ydWxlX29wdGlvbnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVRVOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm10dS5tdHUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZV9wYWNrKHRoaXMtPnUubnZzX3N0YXRlLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVQUklNQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZXByaW1hcC5wcmlvcml0eV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfbWFwID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXR5X21hcFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3F1ZXVlcHJpbWFwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfbWFwLCB0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZ19wYWNrKCZ0aGlzLT51LmVwb2NfZG93bl9iaXRfbG9hZGluZy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVVBfQklUX0xPQURJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfcGFjaygmdGhpcy0+dS5lcG9jX3VwX2JpdF9sb2FkaW5nLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUEhBU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9wYWNrKCZ0aGlzLT51LmVwb2Nfc2RtX3BoYXNlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fQU1QTElUVURFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjaygmdGhpcy0+dS5lcG9jX3NkbV9hbXBsaXR1ZGUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9RVUFOVElaRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9wYWNrKCZ0aGlzLT51LmVwb2Nfc2RtX3F1YW50aXplci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3BhY2soJnRoaXMtPnUuZXBvY191bnVzZWQwLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjaygmdGhpcy0+dS5lcG9jX3VudXNlZDEudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9wYWNrKCZ0aGlzLT51LmVwb2NfdW51c2VkMi52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3BhY2soJnRoaXMtPnUuZXBvY191bnVzZWQzLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQ0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjaygmdGhpcy0+dS5lcG9jX3VudXNlZDQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfcGFjaygmdGhpcy0+dS5xdWV1ZV9jb25maWdfdjIucXVldWVfY29uZmlnLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVBVFVSRV9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0X3BhY2sodGhpcy0+dS5mZWF0dXJlX3NldC5mZWF0dXJlX3NldCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGVfcGFjayh0aGlzLT51LnN0ZF9waHlfdHlwZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyX3BhY2soJnRoaXMtPnUuc2VxdWVuY2VfbnVtYmVyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5tcGNwX2Nsb2NrLnB1bHNlX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DS19DT01QRU5TQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnX3BhY2soJnRoaXMtPnUubXBjcF9jbG9ja19jb21wZW5zYXRlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR0xPQkFMX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcucm9idXN0bmVzc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5tY2FzdF9nbG9iYWxfY29uZmlnLmxtcV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcuZmFzdF9sZWF2ZV9lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGVfcGFjayh0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcubW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zX3BhY2sodGhpcy0+dS5tY2FzdF9nbG9iYWxfY29uZmlnLm9wdGlvbnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkX3BhY2soJnRoaXMtPnUubWNhc3RfZG9tYWluX2NvbmZpZy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9IT0xET1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9ob2xkb3Zlci50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3NfcGFjayh0aGlzLT51Lm9udV9ob2xkb3Zlci5mbGFncywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZV9wYWNrKHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLnJhaXNlX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLmNsZWFyX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GQUlMU0FGRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmZhaWxzYWZlLmNvdW50X29mX2ZhaWxzYWZlX21lY2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5mYWlsc2FmZS5mYWlsc2FmZV9zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wb3J0X3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbC5zdGF0aXN0aWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBvcnRfc3RhdHNfdGhyZXNob2xkX2ludGVydmFsLmludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lmxpbmtfc3RhdHNfdGhyZXNob2xkX2ludGVydmFsLnN0YXRpc3RpY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubGlua19zdGF0c190aHJlc2hvbGRfaW50ZXJ2YWwuaW50ZXJ2YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzX3BhY2sodGhpcy0+dS5zdGRfbWFjX2R1cGxleF9zdGF0dXMuc3RhdHVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGVfcGFjayh0aGlzLT51LnN0ZF9hdXRvX25lZ19hZG1pbl9zdGF0ZS5zdGF0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV9wYWNrKHRoaXMtPnUuc3RkX21hdV9tZWRpYV9hdmFpbC5zdGF0dXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NRElfQ1JPU1NPVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlX3BhY2sodGhpcy0+dS5tZGlfY3Jvc3NvdmVyLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2FkZHIuYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CQ0FTVF9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQllQQVNTX1NPRlRfTEVBUk46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09TX1RSQU5TTEFUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRFTkRFRF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lHTVBfRlJBTUVfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSkVERUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9NT0RFX1JVTEVfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1RfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9NRU1CRVJTSElQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRUFSQ0hfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRkNTX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQkxfU0laRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9BR0VfTElNSVQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfS0VZX0VYUElSWV9USU1FOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVOX0VSUk9SX0RJU0NBUkQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RCTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnRocmVzaG9sZHNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19ETl9GSUxURVJfVEJMOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNbaTBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzW2kxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQVJQX1JFUExJQ0FURV9ERVNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEFDUF9ERVNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0lHTVBfVkxBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoNSAqIHRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTklOR19NT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9BR0dSRUdBVEVfTElNSVQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU0NSQVRDSFBBRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YV9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RPV05fQlVSU1RfVE9MTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RFTVBFUkFUVVJFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9CSUFTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX1BPV0VSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1JYX1BPV0VSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVUV09SS19QT05fTUFQOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0c19jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFNTVEFURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NMRV9NT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX1NJR05BTF9ERVRFQ1Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfQlVSU1RfQUNUSVZJVFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT05UUk9MX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0RFU1RJTkFUSU9OUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDUgKyAoNCAqIHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTlRFUk5BTF9WRVJTSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVElNRVNUQU1QOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9udV9ydWxlLnJ1bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT0xJQ0VSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VOSV9TSEFQRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDEwICogdGhpcy0+dS51bmlfc2hhcGVyLm51bWJlcl9vZl9zaGFwZXJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhUX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJTEVfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5maWxlX2luZm8uZmlsZV9pbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1lTVEVNX1JVTEVfT1BUSU9OUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01UVToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFUFJJTUFQOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VQX0JJVF9MT0FESU5HOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1BIQVNFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXBvY19zZG1fcGhhc2UudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9BTVBMSVRVREU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3NkbV9hbXBsaXR1ZGUudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9RVUFOVElaRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3NkbV9xdWFudGl6ZXIudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3VudXNlZDAudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3VudXNlZDEudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3VudXNlZDIudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3VudXNlZDMudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3VudXNlZDQudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucXVldWVfY29uZmlnX3YyLnF1ZXVlX2NvbmZpZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQVRVUkVfU0VUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0tfQ09NUEVOU0FURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HTE9CQUxfQ09ORklHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5tY2FzdF9kb21haW5fY29uZmlnLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0hPTERPVkVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gOTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkFJTFNBRkU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01ESV9DUk9TU09WRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FERFI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CQ0FTVF9SQVRFX0xJTUlUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JZUEFTU19TT0ZUX0xFQVJOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPU19UUkFOU0xBVElPTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DVExfVkxBTl9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVEVOREVEX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JR01QX0ZSQU1FX1JBVEVfTElNSVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0pFREVDX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX01PREVfUlVMRV9VUERBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fTUVNQkVSU0hJUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fUE9MSUNZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VBUkNIX0NPTkZJRzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDX1RCTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1RFQ0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1RFQ0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9URUNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19NT0RFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19UWF9FTkFCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9HQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubHVlX2ZpZWxkX3NlbGVjdC5pZHgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnlfdW5wYWNrKCZ0aGlzLT51Lmx1ZV9maWVsZF9zZWxlY3QuZGVmLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19mcmFtZXNfdHhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX3NpbmdsZV9jb2xsX2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19tdWx0aXBsZV9jb2xsX2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfZnJhbWVzX3J4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRkNTX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfZmNzX2Vyci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfYWxpZ25fZXJyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19vY3RldHNfdHhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2xhdGVfY29sbGlzaW9ucy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19leGNlc3NpdmVfY29sbGlzaW9ucy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfb2N0ZXRzX3J4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19tY2FzdF9mcmFtZXNfdHhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2JjYXN0X2ZyYW1lc190eF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfbWNhc3RfZnJhbWVzX3J4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19iY2FzdF9mcmFtZXNfcnhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19pbl9yYW5nZV9sZW5fZXJyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2ZyYW1lX3Rvb19sb25nLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19lbmFibGVfc3RhdHVzLmVuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX3BoeV9zeW1ib2xfZXJyX2R1cmluZ19jYXJyaWVyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfY3RybF9wYXVzZV90eC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2N0cmxfcGF1c2VfcngudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9vYW1fbG9jYWxfZXJyX2ZyYW1lX3NlY3NfZXZlbnQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfb2FtX2VtdWxfY3JjOGVyci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbXBjcF9tYWNfY3RybF9mcmFtZXNfdHgudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21wY3BfbWFjX2N0cmxfZnJhbWVzX3J4LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbXBjcF90eF9yZWdfYWNrLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21wY3BfdHhfcmVnX3JlcXVlc3QudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21wY3BfdHhfcmVwb3J0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbXBjcF9yeF9nYXRlLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21wY3BfcnhfcmVnaXN0ZXIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RCTF9TSVpFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZHluX2xlYXJuX3RibF9zaXplLnRhYmxlX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmR5bl9sZWFybl9hZ2VfbGltaXQuYWdlX2xpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfdW5pY2FzdF9mcmFtZXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF91bmljYXN0X2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZV90b29fc2hvcnQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lNjQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NVRPMTI3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWU2NXRvMTI3LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTEyOHRvMjU1LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTI1NnRvNTExLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWU1MTJ0bzEwMjMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWUxMDI0dG8xNTE4LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTE1MTlwbHVzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZTY0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lNjV0bzEyNy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWUxMjh0bzI1NS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWUyNTZ0bzUxMS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lNTEydG8xMDIzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lMTAyNHRvMTUxOC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWUxNTE5cGx1cy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2RlbGF5X3RocmVzaG9sZC5kZWxheV90aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9kZWxheS5kZWxheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9ieXRlc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9ieXRlc19kZWxheWVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2J5dGVzX3VudXNlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2RlbGF5X3RocmVzaG9sZC5kZWxheV90aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9kZWxheS5kZWxheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9ieXRlc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9ieXRlc19kZWxheWVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNob2xkLnN0YXRpc3RpY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNob2xkLnJpc2luZ190aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9ydF9zdGF0X3RocmVzaG9sZC5mYWxsaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubGlua19zdGF0X3RocmVzaG9sZC5zdGF0aXN0aWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubGlua19zdGF0X3RocmVzaG9sZC5yaXNpbmdfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2hvbGQuZmFsbGluZ190aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5lbmNyeXB0X2tleV9leHBpcnlfdGltZS50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJPUl9ESVNDQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sZW5fZXJyb3JfZGlzY2FyZC5sZW5fZXJyb3JfZGlzY2FyZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RCTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcmVwb3J0X3RocmVzaG9sZHNfY291bnRfdGhyZXNob2xkcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnRocmVzaG9sZHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGhyZXNob2xkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3JlcG9ydF90aHJlc2hvbGRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMudGhyZXNob2xkcyA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnRocmVzaG9sZHNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnRocmVzaG9sZHNbaTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZsYW5fZXRoZXJ0eXBlLnZsYW5fZXRoZXJfdHlwZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudmxhbl9ldGhlcnR5cGUudXNlX2Zvcl91cHN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudmxhbl9ldGhlcnR5cGUudXNlX2Zvcl9kb3duc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5jdXJyZW50X2NhcHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9ydF9jYXBhYmlsaXR5LnBoeXNpY2FsX2NhcHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld19kbl9maWx0ZXJfdGJsX2NvdW50X3J1bGVzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV3X2RuX2ZpbHRlcl90YmxcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfdW5wYWNrKCZ0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzW2kxXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld191cF9maWx0ZXJfdGJsX2NvdW50X3J1bGVzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV3X3VwX2ZpbHRlcl90YmxcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfdW5wYWNrKCZ0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzW2kyXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQVJQX1JFUExJQ0FURV9ERVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYXJwX3JlcGxpY2F0ZV9kZXN0LmRlc3RpbmF0aW9uX2JpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MQUNQX0RFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sYWNwX2Rlc3QuZGVzdGluYXRpb25fYml0bWFwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9JR01QX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2lnbXBfdmxhbi5hY3Rpb25fZm9yX3VubWFuX2dycCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfaWdtcF92bGFuLnZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X2lnbXBfdmxhbi52bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfb251X2lnbXBfdmxhblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbl91bnBhY2soJnRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc1tpM10sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTklOR19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5keW5fbGVhcm5pbmdfbW9kZS5sZWFybmluZ19tb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5taW5fbWFjX2xpbWl0LmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9BR0dSRUdBVEVfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9hZ2dyZWdhdGVfbGltaXQubGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NDUkFUQ0hQQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5udnNfc2NyYXRjaHBhZC5kYXRhX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbnZzX3NjcmF0Y2hwYWRfY291bnRfZGF0YSgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm52c19zY3JhdGNocGFkLmRhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5udnNfc2NyYXRjaHBhZC5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX252c19zY3JhdGNocGFkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm52c19zY3JhdGNocGFkLmRhdGFfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YSwgdGhpcy0+dS5udnNfc2NyYXRjaHBhZC5kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmZsb29kX3Vua25vd24uZmxvb2RfdW5rbm93bl9vcHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTE9DQUxfU1dJVENISU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sb2NhbF9zd2l0Y2hpbmcubG9jYWxfc3dpdGNoX29wdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ET1dOX0JVUlNUX1RPTEw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRvd25fYnVyc3RfdG9sbC5kb3duX2J1cnN0X3RvbGxfb3B0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mZWNfbW9kZS5kb3duc3RyZWFtX2ZlYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmZlY19tb2RlLnVwc3RyZWFtX2ZlYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3dlcl9tb25fdGVtcGVyYXR1cmUudGVtcGVyYXR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvd2VyX21vbl92Y2MudmNjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9CSUFTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG93ZXJfbW9uX3R4X2JpYXMuYmlhcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfUE9XRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3dlcl9tb25fdHhfcG93ZXIucG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1JYX1BPV0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG93ZXJfbW9uX3J4X3Bvd2VyLnBvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FVFdPUktfUE9OX01BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXR3b3JrX3Bvbl9tYXAubmV0d29ya19lcG9uX3BvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmV0d29ya19lcG9uX3BvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV0d29ya19wb25fbWFwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0cyA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHNfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0cywgdGhpcy0+dS5uZXR3b3JrX3Bvbl9tYXAubmV0d29ya19lcG9uX3BvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BTU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGVfdW5wYWNrKCZ0aGlzLT51LnBzc3RhdGUuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NMRV9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zbGVfbW9kZS5maWVsZF9zZWxlY3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZV91bnBhY2soJnRoaXMtPnUubGVhcm5fdGFibGVfbW9kZS5sZWFybl90YWJsZV9tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9TSUdOQUxfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnRyYW5zY2VpdmVyX3NpZ25hbF9kZXRlY3Quc2lnbmFsX2RldGVjdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY3Jvc3NiYXJfY29uZmlnLnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9jcm9zc2Jhcl9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0LCB0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX0JVUlNUX0FDVElWSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnRyYW5zY2VpdmVyX2J1cnN0X2FjdGl2aXR5LmJ1cnN0X2FjdGl2aXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPTlRST0xfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY29udHJvbF9wb3J0Lm5ldHdvcmtfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0RFU1RJTkFUSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGVfdW5wYWNrKCZ0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hdGNoX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFnc191bnBhY2soJnRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMuZmxhZ3MsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMuZGVmYXVsdF9saW5rX2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMuZGVmYXVsdF9xdWV1ZV9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQgPiAwKSAmJiAodGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5ncyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hcHBpbmdzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfdmxhbl9kZXN0aW5hdGlvbnNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5ncyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5nc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQgPiAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZ191bnBhY2soJnRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NbaTRdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZV91bnBhY2soJnRoaXMtPnUuZW5jcnlwdGlvbl9tb2RlLm1vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zX3VucGFjaygmdGhpcy0+dS5lbmNyeXB0aW9uX21vZGUub3B0aW9ucywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5URVJOQUxfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmludGVybmFsX3ZlcnNpb24uc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmludGVybmFsX3ZlcnNpb24ucmV2aXNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVElNRVNUQU1QOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXBfdW5wYWNrKCZ0aGlzLT51LmZpcm13YXJlX3RpbWVzdGFtcC50aW1lc3RhbXAsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3VucGFjaygmdGhpcy0+dS5vbnVfcnVsZS5ydWxlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fdW5wYWNrKCZ0aGlzLT51LnBvbGljZXIuZGlyZWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvbGljZXIucG9saWNlcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb2xpY2VyLmJ1cnN0X3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9saWNlci50cmFmZmljX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVU5JX1NIQVBFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS51bmlfc2hhcGVyLm51bWJlcl9vZl9zaGFwZXJzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudW5pX3NoYXBlci5udW1iZXJfb2Zfc2hhcGVycyA+IDApICYmICh0aGlzLT51LnVuaV9zaGFwZXIudW5pX3NoYXBlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVuaV9zaGFwZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV91bmlfc2hhcGVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudW5pX3NoYXBlci51bmlfc2hhcGVyID0gKGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnVuaV9zaGFwZXIubnVtYmVyX29mX3NoYXBlcnMgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUudW5pX3NoYXBlci5udW1iZXJfb2Zfc2hhcGVyczsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfdW5wYWNrKCZ0aGlzLT51LnVuaV9zaGFwZXIudW5pX3NoYXBlcltpNV0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWxfdW5wYWNrKCZ0aGlzLT51LmV4dF9maXJtd2FyZV92ZXJzaW9uLnZlcnNpb24sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9LRVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+dS5lbmNyeXB0aW9uX2tleS5kaXJlY3Rpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGggPiAwKSAmJiAodGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImtleV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfZW5jcnlwdGlvbl9rZXlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2RhdGEsIHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSUxFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmZpbGVfaW5mby5maWxlX2luZm8sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1lTVEVNX1JVTEVfT1BUSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3lzdGVtX3J1bGVfb3B0aW9ucy5zeXN0ZW1fcnVsZV9vcHRpb25zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01UVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm10dS5tdHUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZV91bnBhY2soJnRoaXMtPnUubnZzX3N0YXRlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRVBSSU1BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5xdWV1ZXByaW1hcC5wcmlvcml0eV9jb3VudCA+IDApICYmICh0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X21hcCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXR5X21hcFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3F1ZXVlcHJpbWFwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfbWFwID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfbWFwLCB0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZ191bnBhY2soJnRoaXMtPnUuZXBvY19kb3duX2JpdF9sb2FkaW5nLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVVBfQklUX0xPQURJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfdW5wYWNrKCZ0aGlzLT51LmVwb2NfdXBfYml0X2xvYWRpbmcudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUEhBU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soJnRoaXMtPnUuZXBvY19zZG1fcGhhc2UudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fQU1QTElUVURFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfdW5wYWNrKCZ0aGlzLT51LmVwb2Nfc2RtX2FtcGxpdHVkZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9RVUFOVElaRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soJnRoaXMtPnUuZXBvY19zZG1fcXVhbnRpemVyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3VucGFjaygmdGhpcy0+dS5lcG9jX3VudXNlZDAudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfdW5wYWNrKCZ0aGlzLT51LmVwb2NfdW51c2VkMS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soJnRoaXMtPnUuZXBvY191bnVzZWQyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3VucGFjaygmdGhpcy0+dS5lcG9jX3VudXNlZDMudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQ0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfdW5wYWNrKCZ0aGlzLT51LmVwb2NfdW51c2VkNC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfdW5wYWNrKCZ0aGlzLT51LnF1ZXVlX2NvbmZpZ192Mi5xdWV1ZV9jb25maWcsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVBVFVSRV9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0X3VucGFjaygmdGhpcy0+dS5mZWF0dXJlX3NldC5mZWF0dXJlX3NldCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV91bnBhY2soJnRoaXMtPnUuc3RkX3BoeV90eXBlLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcl91bnBhY2soJnRoaXMtPnUuc2VxdWVuY2VfbnVtYmVyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5tcGNwX2Nsb2NrLnB1bHNlX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DS19DT01QRU5TQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnX3VucGFjaygmdGhpcy0+dS5tcGNwX2Nsb2NrX2NvbXBlbnNhdGUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR0xPQkFMX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWNhc3RfZ2xvYmFsX2NvbmZpZy5yb2J1c3RuZXNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWNhc3RfZ2xvYmFsX2NvbmZpZy5sbXFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcuZmFzdF9sZWF2ZV9lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcubW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnNfdW5wYWNrKCZ0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcub3B0aW9ucywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZF91bnBhY2soJnRoaXMtPnUubWNhc3RfZG9tYWluX2NvbmZpZy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSE9MRE9WRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9ob2xkb3Zlci50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3NfdW5wYWNrKCZ0aGlzLT51Lm9udV9ob2xkb3Zlci5mbGFncywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3VucGFjaygmdGhpcy0+dS5hbGFybV90aHJlc2hvbGQuYWxhcm1fY29kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLnJhaXNlX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hbGFybV90aHJlc2hvbGQuY2xlYXJfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZBSUxTQUZFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mYWlsc2FmZS5jb3VudF9vZl9mYWlsc2FmZV9tZWNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mYWlsc2FmZS5mYWlsc2FmZV9zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnRfc3RhdHNfdGhyZXNob2xkX2ludGVydmFsLnN0YXRpc3RpY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0X3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbC5pbnRlcnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxpbmtfc3RhdHNfdGhyZXNob2xkX2ludGVydmFsLnN0YXRpc3RpY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5saW5rX3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbC5pbnRlcnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT51LnN0ZF9tYWNfZHVwbGV4X3N0YXR1cy5zdGF0dXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlX3VucGFjaygmdGhpcy0+dS5zdGRfYXV0b19uZWdfYWRtaW5fc3RhdGUuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV91bnBhY2soJnRoaXMtPnUuc3RkX21hdV9tZWRpYV9hdmFpbC5zdGF0dXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01ESV9DUk9TU09WRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWRpX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm1kaV9jcm9zc292ZXIubW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2FkZHIuYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CQ0FTVF9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQllQQVNTX1NPRlRfTEVBUk46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09TX1RSQU5TTEFUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRFTkRFRF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lHTVBfRlJBTUVfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSkVERUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9NT0RFX1JVTEVfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1RfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9NRU1CRVJTSElQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRUFSQ0hfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSBsZWFmOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZsZWFmLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChsZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GQ1NfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9HQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQkxfU0laRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1VE8xMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUX0tFWV9FWFBJUllfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRU5fRVJST1JfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RCTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdGhyZXNob2xkc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGRzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodGhyZXNob2xkc19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBydWxlc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJ1bGVzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocnVsZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19VUF9GSUxURVJfVEJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcnVsZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChydWxlc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQVJQX1JFUExJQ0FURV9ERVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xBQ1BfREVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSUdNUF9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmxhbnNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdmxhbnNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuKSAqIHZsYW5zX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgdmxhbnNfY291bnQgKiA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTklOR19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0FHR1JFR0FURV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU0NSQVRDSFBBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRhdGFfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChkYXRhX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ET1dOX0JVUlNUX1RPTEw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9URU1QRVJBVFVSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVkNDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9CSUFTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fUlhfUE9XRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVUV09SS19QT05fTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbmV0d29ya19lcG9uX3BvcnRzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbmV0d29ya19lcG9uX3BvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbmV0d29ya19lcG9uX3BvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgbmV0d29ya19lcG9uX3BvcnRzX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QU1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NMRV9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX1RBQkxFX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfU0lHTkFMX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCB1c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9CVVJTVF9BQ1RJVklUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT05UUk9MX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9ERVNUSU5BVElPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBtYXBwaW5nc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZtYXBwaW5nc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZykgKiBtYXBwaW5nc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIG1hcHBpbmdzX2NvdW50ICogNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOVEVSTkFMX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1RJTUVTVEFNUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVU5JX1NIQVBFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IG51bWJlcl9vZl9zaGFwZXJzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbnVtYmVyX29mX3NoYXBlcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXIpICogbnVtYmVyX29mX3NoYXBlcnMpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBudW1iZXJfb2Zfc2hhcGVycyAqIDEwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fS0VZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X2xlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAma2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGtleV9sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBrZXlfbGVuZ3RoICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSUxFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NZU1RFTV9SVUxFX09QVElPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVRVOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRVBSSU1BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHByaW9yaXR5X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcHJpb3JpdHlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBwcmlvcml0eV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHByaW9yaXR5X2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX0RPV05fQklUX0xPQURJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVVBfQklUX0xPQURJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1BIQVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX0FNUExJVFVERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9RVUFOVElaRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VENDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQVRVUkVfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLX0NPTVBFTlNBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dMT0JBTF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9IT0xET1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkFJTFNBRkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFVX01FRElBX0FWQUlMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01ESV9DUk9TU09WRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JDQVNUX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CWVBBU1NfU09GVF9MRUFSTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT1NfVFJBTlNMQVRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DVExfVkxBTl9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVEVOREVEX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSUdNUF9GUkFNRV9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lQTUNfVU5LTk9XTl9MRUFWRV9GV0Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9KRURFQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX01PREVfUlVMRV9VUERBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVF9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR1JPVVBfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfRFlOQU1JQ19FTlRSSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX01FTUJFUlNISVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fUE9MSUNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFJJX0VOUVVFVUlORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFQVJDSF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19BQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfVFhfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9yZXBvcnRfdGhyZXNob2xkc19jb3VudF90aHJlc2hvbGRzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld19kbl9maWx0ZXJfdGJsX2NvdW50X3J1bGVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV3X3VwX2ZpbHRlcl90YmxfY291bnRfcnVsZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9udnNfc2NyYXRjaHBhZF9jb3VudF9kYXRhKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cXVldWVfc2l6ZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cXVldWVfc2l6ZXNfY291bnQgPiAwKSAmJiAodGhpcy0+cXVldWVfc2l6ZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2l6ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+cXVldWVfc2l6ZXMsIHRoaXMtPnF1ZXVlX3NpemVzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyB0aGlzLT5xdWV1ZV9zaXplc19jb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5xdWV1ZV9zaXplc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5xdWV1ZV9zaXplc19jb3VudCA+IDApICYmICh0aGlzLT5xdWV1ZV9zaXplcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NpemVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnF1ZXVlX3NpemVzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnF1ZXVlX3NpemVzX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+cXVldWVfc2l6ZXMsIHRoaXMtPnF1ZXVlX3NpemVzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgcXVldWVfc2l6ZXNfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcXVldWVfc2l6ZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBxdWV1ZV9zaXplc19jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBxdWV1ZV9zaXplc19jb3VudCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5udW1iZXJfb2ZfaWdtcF9ncm91cHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJlbGF0aXZlX3F1ZXVlX2Zvcl9jbGFzc2lmaWNhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2lnbXBfZ3JvdXBzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZWxhdGl2ZV9xdWV1ZV9mb3JfY2xhc3NpZmljYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT5ncm91cCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cG9ydHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+Z3JvdXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvcnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndpZHRoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5hZGRfc3RhdGljX2VudHJ5Lm1hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfU1RBVElDX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuZGVsX3N0YXRpY19lbnRyeS5tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFkZF9ydWxlLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWRkX3J1bGUucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2FkZF9ydWxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuYWRkX3J1bGUucnVsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfcGFjaygmdGhpcy0+dS5hZGRfcnVsZS5ydWxlc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0FERF9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9wYWNrKCZ0aGlzLT51Lm5ld19hZGRfcnVsZS5ydWxlcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19ERUxfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9uZXdfZGVsX3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfcGFjaygmdGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9kZWxldGVfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3BhY2soJnRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnNldF9ncGlvX2NvbmZpZy5ncGlvX2NvbmZpZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTM7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNbaTRdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubXVsdGljYXN0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVJBU0VfTlZTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5yb2J1c3RuZXNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5sYXN0X21lbWJlcl9xdWVyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NldF9pZ21wX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnX3BhY2soJnRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzW2k1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcl9wYWNrKHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLmdycF9mb3J3YXJkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnNfcGFjayh0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5vcHRpb25zLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9HUk9VUF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImdyb3Vwc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfYWRkX2lnbXBfZ3JvdXBcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5hZGRfaWdtcF9ncm91cC5ncm91cHNfY291bnQ7IGk2KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkX3BhY2soJnRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzW2k2XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfT0FNX1JBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9PQU1fUkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9vYW1fcmF0ZS5tYXhfb2FtX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X29hbV9yYXRlLm1pbl9vYW1fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYmNfbGFzZXJfcG93ZXJfb2ZmLm9mZl90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NMRUVQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNsZWVwLnRpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnNfcGFjayh0aGlzLT51LnNsZWVwLm9wdGlvbnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfTFVFX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9MVUVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRU5BQkxFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fcGFjayh0aGlzLT51LmVuYWJsZV9wb2xpY2VyLmRpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmVuYWJsZV9wb2xpY2VyLnBvbGljZXJfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmVuYWJsZV9wb2xpY2VyLmJ1cnN0X3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmVuYWJsZV9wb2xpY2VyLnRyYWZmaWNfcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fcGFjayh0aGlzLT51LmRpc2FibGVfcG9saWNlci5kaXJlY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kaXNhYmxlX3BvbGljZXIucG9saWNlcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2Rlc19wYWNrKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMubW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NOVV9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMubW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfcGVyX3BvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NldF9kbl9iY2FzdF9xdWV1ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5xdWV1ZV9wZXJfcG9ydCwgdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfSUdNUF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRklORF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0RFTF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BPUlRfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfU1RBVElDX0VOVFJZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19FTlRSWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9SVUxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hZGRfcnVsZS5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51LmFkZF9ydWxlLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5hZGRfcnVsZS5ydWxlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hZGRfcnVsZS5ydWxlc1tpMF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19BRERfUlVMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubmV3X2FkZF9ydWxlLnJ1bGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0RFTF9SVUxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51Lm5ld19kZWxfcnVsZS5ydWxlc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNbaTFdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXNbaTJdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTQ7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5tdWx0aWNhc3QpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzW2kzXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzW2k0XSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDYgKyAoMiAqIHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9JR01QX0dST1VQOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICg1ICogdGhpcy0+dS5hZGRfaWdtcF9ncm91cC5ncm91cHNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfT0FNX1JBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfT0FNX1JBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQkNfTEFTRVJfUE9XRVJfT0ZGOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0xFRVA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfTFVFX1JVTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfTFVFX1JVTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTUNfU1RBVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTlVfU1RBVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfTFVFX1JVTEVfVEFCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9VU0VSX1JVTEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9ETl9DTEFTUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0lHTVBfR1JPVVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDE6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRklORF9MVUVfUlVMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19WQUxVRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTFVFX0ZJRUxEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QSFlfQUREUl9NRElPOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fVkFMVUU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0xVRV9GSUVMRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19BRE1JTl9DVFJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19ERUxfR1JPVVBfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0lOSVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9BRE1JTl9DVFJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfUkVTRVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QT1JUX0FETUlOX0NUUkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFkZF9zdGF0aWNfZW50cnkubWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRlbF9zdGF0aWNfZW50cnkubWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIHRoaXMtPnUuYWRkX3J1bGUucnVsZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2FkZF9ydWxlX2NvdW50X3J1bGVzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWRkX3J1bGUucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hZGRfcnVsZS5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9hZGRfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmFkZF9ydWxlLnJ1bGVzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYWRkX3J1bGUucnVsZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5hZGRfcnVsZS5ydWxlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV91bnBhY2soJnRoaXMtPnUuYWRkX3J1bGUucnVsZXNbaTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfQUREX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3VucGFjaygmdGhpcy0+dS5uZXdfYWRkX3J1bGUucnVsZXMsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0RFTF9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9uZXdfZGVsX3J1bGVfY291bnRfcnVsZXMoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfbmV3X2RlbF9ydWxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3VucGFjaygmdGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNbaTFdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9kZWxldGVfcnVsZV9jb3VudF9ydWxlcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfZGVsZXRlX3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfdW5wYWNrKCZ0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzW2kyXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfZ3Bpb19jb25maWcuZ3Bpb19jb25maWcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxpbmtzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9zZXRfcXVldWVfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3VucGFjaygmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzW2kzXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ191bnBhY2soJnRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5wb3J0c1tpNF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ191bnBhY2soJnRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5tdWx0aWNhc3QsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVJBU0VfTlZTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnJvYnVzdG5lc3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfaWdtcF9jb25maWcubGFzdF9tZW1iZXJfcXVlcnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2V0X2lnbXBfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnX3VucGFjaygmdGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNbaTVdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcl91bnBhY2soJnRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLmdycF9mb3J3YXJkLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9uc191bnBhY2soJnRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLm9wdGlvbnMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0lHTVBfR1JPVVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZ3JvdXBzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9hZGRfaWdtcF9ncm91cFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmFkZF9pZ21wX2dyb3VwLmdyb3VwcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hZGRfaWdtcF9ncm91cC5ncm91cHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTYgPSAwOyBpNiA8IHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50OyBpNisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZF91bnBhY2soJnRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzW2k2XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfT0FNX1JBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNldF9vYW1fcmF0ZS5tYXhfb2FtX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfb2FtX3JhdGUubWluX29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MT0FEX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0JDX0xBU0VSX1BPV0VSX09GRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmJjX2xhc2VyX3Bvd2VyX29mZi5vZmZfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TTEVFUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNsZWVwLnRpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnNfdW5wYWNrKCZ0aGlzLT51LnNsZWVwLm9wdGlvbnMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9MVUVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0xVRV9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbl91bnBhY2soJnRoaXMtPnUuZW5hYmxlX3BvbGljZXIuZGlyZWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmVuYWJsZV9wb2xpY2VyLnBvbGljZXJfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5hYmxlX3BvbGljZXIuYnVyc3Rfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5lbmFibGVfcG9saWNlci50cmFmZmljX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRElTQUJMRV9QT0xJQ0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+dS5kaXNhYmxlX3BvbGljZXIuZGlyZWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRpc2FibGVfcG9saWNlci5wb2xpY2VyX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX1NETV9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3VucGFjaygmdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMubW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleF91bnBhY2soJnRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnN0YXRfaW5kZXgsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3VucGFjaygmdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMubW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXhfdW5wYWNrKCZ0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5zdGF0X2luZGV4LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTlVfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2Rlc191bnBhY2soJnRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLm1vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4X3VucGFjaygmdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuc3RhdF9pbmRleCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2RuX2JjYXN0X3F1ZXVlLnF1ZXVlX3Blcl9wb3J0ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfcGVyX3BvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NldF9kbl9iY2FzdF9xdWV1ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5xdWV1ZV9wZXJfcG9ydCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5xdWV1ZV9wZXJfcG9ydCwgdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfSUdNUF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRklORF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0RFTF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BPUlRfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gbGVhZjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfU1RBVElDX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcnVsZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBydWxlc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHJ1bGVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfQUREX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfREVMX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcnVsZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBydWxlc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHJ1bGVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBydWxlc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJ1bGVzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocnVsZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBsaW5rc19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcG9ydHNfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmxpbmtzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZykgKiBsaW5rc19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgbGlua3NfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZykgKiBwb3J0c19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgcG9ydHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVJBU0VfTlZTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnKSAqIHBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcG9ydHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9HUk9VUF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGdyb3Vwc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmdyb3Vwc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCkgKiBncm91cHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBncm91cHNfY291bnQgKiA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9PQU1fUkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0xFRVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9MVUVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0xVRV9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX1NETV9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ01DX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTlVfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHBvcnRfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZwb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcG9ydF9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHBvcnRfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfTFVFX1JVTEVfVEFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfVVNFUl9SVUxFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9ETl9DTEFTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9VUF9DTEFTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9JR01QX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfTUNBU1RfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9GSU5EX0xVRV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fVkFMVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTFVFX0ZJRUxEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0RJU0FCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9QUk9URUNUSU9OX1NXSVRDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19BRERfR1JPVVBfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfREVMX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0lOSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfUkVTRVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUE9SVF9BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX1JFU0VUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfYWRkX3J1bGVfY291bnRfcnVsZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX25ld19kZWxfcnVsZV9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfZGVsZXRlX3J1bGVfY291bnRfcnVsZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3BhY2soJnRoaXMtPnUubmFtZV9iaW5kaW5nLm9iamVjdF9jb250ZXh0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3BhY2soJnRoaXMtPnUuYXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soJnRoaXMtPnUuYWN0aW9uLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kZWYud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmVuZC51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubmFtZV9iaW5kaW5nLm9iamVjdF9jb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hdHRyaWJ1dGUuYXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmFjdGlvbi5hY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF91bnBhY2soJnRoaXMtPnUubmFtZV9iaW5kaW5nLm9iamVjdF9jb250ZXh0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfdW5wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjaygmdGhpcy0+dS5hY3Rpb24uYWN0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmRlZi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5kZWYud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aWR0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubXVsdGljYXN0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfaWdtcF9jb25maWcucm9idXN0bmVzc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfaWdtcF9jb25maWcubGFzdF9tZW1iZXJfcXVlcnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfaWdtcF9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5nZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZ19wYWNrKCZ0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXJfcGFjayh0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5ncnBfZm9yd2FyZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zX3BhY2sodGhpcy0+dS5nZXRfaWdtcF9jb25maWcub3B0aW9ucywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0dST1VQX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9pZ21wX2dyb3VwX2luZm8uZ3JvdXBzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3VwcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJncm91cHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9pZ21wX2dyb3VwX2luZm9cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfcGFjaygmdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X29hbV9yYXRlLm1heF9vYW1fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfb2FtX3JhdGUubWluX29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MT0FEX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZ2V0X2xvYWRfaW5mby5ib290X3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8uYm9vdF9jcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8ucGVyc29uYWxpdHlfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2xvYWRfaW5mby5wZXJzb25hbGl0eV9jcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8uYXBwMHZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8uYXBwMGNyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZ2V0X2xvYWRfaW5mby5hcHAxdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2xvYWRfaW5mby5hcHAxY3JjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfbG9hZF9pbmZvLmRpYWdub3N0aWNfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2xvYWRfaW5mby5kaWFnbm9zdGljX2NyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjb3VudGVyX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19zZG1fc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2Nfc2RtX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfaW50ZXJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX3NkbV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjb3VudGVyX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbWNfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY21jX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfaW50ZXJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NtY19zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NOVV9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjb3VudGVyX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbnVfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY251X3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfaW50ZXJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NudV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfcGVyX3BvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9kbl9iY2FzdF9xdWV1ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9kbl9iY2FzdF9xdWV1ZS5xdWV1ZV9wZXJfcG9ydCwgdGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1NUQVRJQ19FTlRSWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0JDX0xBU0VSX1BPV0VSX09GRjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfVVNFUl9SVUxFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9ETl9DTEFTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9VUF9DTEFTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9JR01QX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0xVRV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19FTlRSWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0ZJTkRfTFVFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfQUREX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfREVMX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRU5BQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1BST1RFQ1RJT05fU1dJVENIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fVkFMVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTFVFX0ZJRUxEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfT0FNX1JBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0xFRVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fUkVORUdPVElBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0FERF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19ERUxfR1JPVVBfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfU0VMRl9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QSFlfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QT1JUX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX0lOX1NFUlZJQ0VfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfUkVTRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVmLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubXVsdGljYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua3NfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rc1tpMF0pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0c1tpMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDYgKyAoMiAqIHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoNSAqIHRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfT0FNX1JBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX1NETV9TVEFUUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ICsgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZV9jb3VudCArIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ICsgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCArIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NOVV9TVEFUUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ICsgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCArIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LmdldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfTFVFX1JVTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1JVTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1NUQVRJQ19FTlRSWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkY6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfTFVFX1JVTEVfVEFCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9VU0VSX1JVTEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9ETl9DTEFTUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0lHTVBfR1JPVVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0xVRV9SVUxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9SVUxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RJU0FCTEVfUE9MSUNFUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQxOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9GSU5EX0xVRV9SVUxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19WQUxVRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTFVFX0ZJRUxEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QSFlfQUREUl9NRElPOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfQUREX1JVTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0RFTF9SVUxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRU5BQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9QUk9URUNUSU9OX1NXSVRDSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19WQUxVRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0xVRV9GSUVMRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfT0FNX1JBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BIWV9BRERSX01ESU86CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TTEVFUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19BRE1JTl9DVFJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19ERUxfR1JPVVBfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0lOSVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9BRE1JTl9DVFJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfUkVTRVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QT1JUX0FETUlOX0NUUkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmRlZi51bmtub3duX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3MgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ191bnBhY2soJnRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rc1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfdW5wYWNrKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNbaTFdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfdW5wYWNrKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubXVsdGljYXN0LCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfaWdtcF9jb25maWcucm9idXN0bmVzc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5sYXN0X21lbWJlcl9xdWVyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfaWdtcF9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfaWdtcF9jb25maWcucG9ydHMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfdW5wYWNrKCZ0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c1tpMl0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyX3VucGFjaygmdGhpcy0+dS5nZXRfaWdtcF9jb25maWcuZ3JwX2ZvcndhcmQsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zX3VucGFjaygmdGhpcy0+dS5nZXRfaWdtcF9jb25maWcub3B0aW9ucywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9pZ21wX2dyb3VwX2luZm8uZ3JvdXBzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJncm91cHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9pZ21wX2dyb3VwX2luZm9cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3VwcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfdW5wYWNrKCZ0aGlzLT51LmdldF9pZ21wX2dyb3VwX2luZm8uZ3JvdXBzW2kzXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfb2FtX3JhdGUubWF4X29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X29hbV9yYXRlLm1pbl9vYW1fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5ib290X3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5ib290X2NyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfbG9hZF9pbmZvLnBlcnNvbmFsaXR5X3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5wZXJzb25hbGl0eV9jcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5hcHAwdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfbG9hZF9pbmZvLmFwcDBjcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5hcHAxdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfbG9hZF9pbmZvLmFwcDFjcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5kaWFnbm9zdGljX3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5kaWFnbm9zdGljX2NyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4X3VucGFjaygmdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuc3RhdF9pbmRleCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLmNvdW50ZXJfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjb3VudGVyX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19zZG1fc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2Nfc2RtX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV9pbnRlcnZhbCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfaW50ZXJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX3NkbV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWwsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ01DX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXhfdW5wYWNrKCZ0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5zdGF0X2luZGV4LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNvdW50ZXJfdmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NtY19zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbWNfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV9pbnRlcnZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY21jX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWwgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbCwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTlVfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleF91bnBhY2soJnRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnN0YXRfaW5kZXgsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5jb3VudGVyX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY291bnRlcl92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY251X3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfdmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NudV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfaW50ZXJ2YWwgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX2ludGVydmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbnVfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9kbl9iY2FzdF9xdWV1ZS5xdWV1ZV9wZXJfcG9ydCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3Blcl9wb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZG5fYmNhc3RfcXVldWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQsIHRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0lHTVBfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfTFVFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfRU5UUlk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fVVNFUl9SVUxFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9MVUVfUlVMRV9UQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfSUdNUF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfRU5UUlk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRElTQUJMRV9QT0xJQ0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRU5BQkxFX1BPTElDRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUkFTRV9OVlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9GSU5EX0xVRV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fVkFMVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTFVFX0ZJRUxEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0FERF9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0RFTF9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0RJU0FCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9QUk9URUNUSU9OX1NXSVRDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0lHTVBfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX09BTV9SQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NMRUVQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19BRERfR1JPVVBfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfREVMX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0lOSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfUkVTRVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUE9SVF9BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX1JFU0VUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2RlZl9jb3VudF91bmtub3duKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gbGVhZjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGlua3NfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHBvcnRzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZsaW5rc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcpICogbGlua3NfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IGxpbmtzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZwb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcpICogcG9ydHNfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHBvcnRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHBvcnRzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZwb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcpICogcG9ydHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBwb3J0c19jb3VudCAqIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9HUk9VUF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmZ3JvdXBzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkKSAqIGdyb3Vwc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIGdyb3Vwc19jb3VudCAqIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX1NETV9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGNvdW50ZXJfdmFsdWVfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCByYXRlX3ZhbHVlX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV9pbnRlcnZhbF9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZjb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogY291bnRlcl92YWx1ZV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIGNvdW50ZXJfdmFsdWVfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiByYXRlX3ZhbHVlX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcmF0ZV92YWx1ZV9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHJhdGVfaW50ZXJ2YWxfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCByYXRlX2ludGVydmFsX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTUNfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBjb3VudGVyX3ZhbHVlX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV92YWx1ZV9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHJhdGVfaW50ZXJ2YWxfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGNvdW50ZXJfdmFsdWVfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBjb3VudGVyX3ZhbHVlX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZyYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcmF0ZV92YWx1ZV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHJhdGVfdmFsdWVfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiByYXRlX2ludGVydmFsX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcmF0ZV9pbnRlcnZhbF9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ05VX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgY291bnRlcl92YWx1ZV9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHJhdGVfdmFsdWVfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCByYXRlX2ludGVydmFsX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBjb3VudGVyX3ZhbHVlX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgY291bnRlcl92YWx1ZV9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHJhdGVfdmFsdWVfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCByYXRlX3ZhbHVlX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZyYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcmF0ZV9pbnRlcnZhbF9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHJhdGVfaW50ZXJ2YWxfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHBvcnRfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZwb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcG9ydF9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHBvcnRfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9JR01QX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0xVRV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfU1RBVElDX0VOVFJZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQkNfTEFTRVJfUE9XRVJfT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfTFVFX1JVTEVfVEFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX0ROX0NMQVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX1VQX0NMQVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0lHTVBfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfTFVFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfU1RBVElDX0VOVFJZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfTUNBU1RfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RJU0FCTEVfUE9MSUNFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VOQUJMRV9QT0xJQ0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVJBU0VfTlZTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRklORF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19BRERfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19ERUxfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9PQU1fUkFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TTEVFUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0RFTF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BPUlRfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9wYWNrKCZ0aGlzLT51Lm5hbWVfYmluZGluZy5vYmplY3RfY29udGV4dCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKCZ0aGlzLT51LmFjdGlvbi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZGVmLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5uYW1lX2JpbmRpbmcub2JqZWN0X2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmF0dHJpYnV0ZS5hdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuYWN0aW9uLmFjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdW5wYWNrKCZ0aGlzLT51Lm5hbWVfYmluZGluZy5vYmplY3RfY29udGV4dCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmFjdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfcGFjayh0aGlzLT5vcCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmluZm8uZmlybXdhcmVfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pbmZvLm91aSwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaW5mby5wcm9kdWN0X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pbmZvLnZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaW5mby5leHRlbmRlZF9pZCwgNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuaW5mby5iYXNlX21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLm1heF9saW5rcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLm51bV9wb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLm51bV9hc3NpZ25hYmxlX3Vwc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLm1heF9xdWV1ZXNfcGVyX2xpbmtfdXBzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaW5mby5xdWV1ZV9pbmNyZW1lbnRfdXBzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaW5mby5udW1fYXNzaWduYWJsZV9kb3duc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLm1heF9xdWV1ZXNfcGVyX2xpbmtfZG93bnN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLnF1ZXVlX2luY3JlbWVudF9kb3duc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pbmZvLnVwc3RyZWFtX2J1ZmZlcl9hdmFpbGFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmluZm8uZG93bnN0cmVhbV9idWZmZXJfYXZhaWxhYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pbmZvLmplZGVjX21hbnVmYWN0dXJlcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaW5mby5jaGlwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5pbmZvLmNoaXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfcGFjaygmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3BhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3BhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFnc19wYWNrKHRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm11bHRpY2FzdF9yZWdpc3Rlci5tdWx0aWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyLnVuaWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzX3BhY2sodGhpcy0+dS5tdWx0aWNhc3RfcmVnaXN0ZXJfcmVzcG9uc2UuZmxhZ3MsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyX3Jlc3BvbnNlLm11bHRpY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5tdWx0aWNhc3RfcmVnaXN0ZXJfcmVzcG9uc2UudW5pY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImtleV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfa2V5X2V4Y2hhbmdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhLCB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5maWxlX2Fjay5ibG9jaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3JfcGFjayh0aGlzLT51LmZpbGVfYWNrLmVycm9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5maWxlX2RhdGEuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2ZpbGVfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmZpbGVfZGF0YS5kYXRhLCB0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfUkVBRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGVfcGFjayh0aGlzLT51LmZpbGVfcmVhZF9yZXF1ZXN0LmZpbGVfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZV9wYWNrKHRoaXMtPnUuZmlsZV93cml0ZV9yZXF1ZXN0LmZpbGVfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9VTkFDS0VEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc19jb3VudCA+IDApICYmICh0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyaWFibGVfY29udGFpbmVyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3VuYWNrZWRfYWN0aW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3BhY2soJnRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc1tpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9MT09QX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gOTk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNbaTJdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXNwb25zZS52YXJzW2kzXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArIHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfUkVBRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1VOQUNLRURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS51bmFja2VkX2FjdGlvbi52YXJpYWJsZV9jb250YWluZXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJpYWJsZV9jb250YWluZXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc1tpNF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9MT09QX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZV91bnBhY2soJnRoaXMtPm9wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaW5mby5maXJtd2FyZV92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaW5mby5vdWksIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmluZm8ucHJvZHVjdF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaW5mby52ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaW5mby5leHRlbmRlZF9pZCwgNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuaW5mby5iYXNlX21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLm1heF9saW5rcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLm51bV9wb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLm51bV9hc3NpZ25hYmxlX3Vwc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLm1heF9xdWV1ZXNfcGVyX2xpbmtfdXBzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaW5mby5xdWV1ZV9pbmNyZW1lbnRfdXBzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaW5mby5udW1fYXNzaWduYWJsZV9kb3duc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLm1heF9xdWV1ZXNfcGVyX2xpbmtfZG93bnN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLnF1ZXVlX2luY3JlbWVudF9kb3duc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pbmZvLnVwc3RyZWFtX2J1ZmZlcl9hdmFpbGFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmluZm8uZG93bnN0cmVhbV9idWZmZXJfYXZhaWxhYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pbmZvLmplZGVjX21hbnVmYWN0dXJlcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaW5mby5jaGlwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5pbmZvLmNoaXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3JlcXVlc3RfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl91bnBhY2soJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVzcG9uc2VfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2dldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl91bnBhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNbaTJdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9zZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXNwb25zZS52YXJzW2kzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFnc191bnBhY2soJnRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm11bHRpY2FzdF9yZWdpc3Rlci5tdWx0aWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyLnVuaWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzX3VucGFjaygmdGhpcy0+dS5tdWx0aWNhc3RfcmVnaXN0ZXJfcmVzcG9uc2UuZmxhZ3MsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyX3Jlc3BvbnNlLm11bHRpY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5tdWx0aWNhc3RfcmVnaXN0ZXJfcmVzcG9uc2UudW5pY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwia2V5X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9rZXlfZXhjaGFuZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2RhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhLCB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5maWxlX2Fjay5ibG9jaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3JfdW5wYWNrKCZ0aGlzLT51LmZpbGVfYWNrLmVycm9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5maWxlX2RhdGEuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZmlsZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5maWxlX2RhdGEuZGF0YSwgdGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1JFQURfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlX3VucGFjaygmdGhpcy0+dS5maWxlX3JlYWRfcmVxdWVzdC5maWxlX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGVfdW5wYWNrKCZ0aGlzLT51LmZpbGVfd3JpdGVfcmVxdWVzdC5maWxlX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTQ7CisgICAgICAgICAgICAgICAgdGhpcy0+dS51bmFja2VkX2FjdGlvbi52YXJpYWJsZV9jb250YWluZXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfdW5hY2tlZF9hY3Rpb25fY291bnRfdmFyaWFibGVfY29udGFpbmVycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS51bmFja2VkX2FjdGlvbi52YXJpYWJsZV9jb250YWluZXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcmlhYmxlX2NvbnRhaW5lcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF91bmFja2VkX2FjdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl91bnBhY2soJnRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc1tpNF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0xPT1BfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRVFVRVNUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIG9wOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfdW5wYWNrKCZvcCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3Jfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhcnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhcnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZrZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICoga2V5X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBrZXlfbGVuZ3RoICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfUkVBRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyaWFibGVfY29udGFpbmVyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX2NvbnRhaW5lcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJpYWJsZV9jb250YWluZXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFUVVFU1Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2dldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3Jfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVzcG9uc2VfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfdW5hY2tlZF9hY3Rpb25fY291bnRfdmFyaWFibGVfY29udGFpbmVycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3BfcGFjayh0aGlzLT5maWxlX29wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmlsZV9vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0hFQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuaGVhZC5maWxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5oZWFkLm5vdF9maWxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5oZWFkLmNyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRhdGEuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kYXRhLmRhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5kYXRhLmRhdGEsIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0lEWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pZHguaWR4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wX3BhY2sodGhpcy0+dS5hY2suZnJhbWVfdHlwZV9hY2ssIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGVfcGFjayh0aGlzLT51LmFjay5lcnJvcl9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmFjay5ibG9ja19yeCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPmZpbGVfb3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9IRUFEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9JRFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcF91bnBhY2soJnRoaXMtPmZpbGVfb3AsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5maWxlX29wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfSEVBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5oZWFkLmZpbGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmhlYWQubm90X2ZpbGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmhlYWQuY3JjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGF0YS5ibG9jaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5kYXRhLmRhdGFfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9kYXRhX2NvdW50X2RhdGEoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGF0YS5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kYXRhLmRhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kYXRhLmRhdGFfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmRhdGEuZGF0YSwgdGhpcy0+dS5kYXRhLmRhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfSURYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmlkeC5pZHgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3BfdW5wYWNrKCZ0aGlzLT51LmFjay5mcmFtZV90eXBlX2FjaywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZV91bnBhY2soJnRoaXMtPnUuYWNrLmVycm9yX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuYWNrLmJsb2NrX3J4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgZmlsZV9vcDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcF91bnBhY2soJmZpbGVfb3AsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChmaWxlX29wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfSEVBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGF0YV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGRhdGFfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0lEWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2RhdGFfY291bnRfZGF0YShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGVfcGFjayh0aGlzLT5vcCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRklSTVdBUkVfVVBEQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2VfcGFjaygmdGhpcy0+dS5maXJtd2FyZV91cGRhdGUuZmlsZV9pbmZvLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9BQ0tOT1dMRURHRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfQVVUSEVOVElDQVRFX09OVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRU5DUllQVElPTl9FTkFCTEVfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRU5DUllQVElPTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0dFVF9PTlVfVkVSU0lPTlNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfSUdNUF9TTk9PUElOR19QQUNLRVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9NQUdJQ19OVU1CRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BIWV9MT09QX0JBQ0tfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUElOR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSU5HX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9SRV9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUkVNT1RFX0FDQ0VTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfU0VUX0FMQVJNX1RIUkVTSE9MRFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1RIUkVTSE9MRF9SRVBPUlRfVkFMVUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9UVVJOX09OVV9JTl9UT19PRkZfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfQ09ORklHVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9GSVJNV0FSRV9VUERBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZmlybXdhcmVfdXBkYXRlLmZpbGVfaW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfQUNLTk9XTEVER0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0FVVEhFTlRJQ0FURV9PTlU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0VOQ1JZUFRJT05fRU5BQkxFX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0VOQ1JZUFRJT05fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9HRVRfT05VX1ZFUlNJT05TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0dFVF9PTlVfVkVSU0lPTlNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0lHTVBfU05PT1BJTkdfUEFDS0VUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfTUFHSUNfTlVNQkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSFlfTE9PUF9CQUNLX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BJTkdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUElOR19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUkVfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1JFTU9URV9BQ0NFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1NFVF9BTEFSTV9USFJFU0hPTERTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9USFJFU0hPTERfUkVQT1JUX1ZBTFVFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVFVSTl9PTlVfSU5fVE9fT0ZGX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX0NPTkZJR1VSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlX3VucGFjaygmdGhpcy0+b3AsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0ZJUk1XQVJFX1VQREFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX3VucGFjaygmdGhpcy0+dS5maXJtd2FyZV91cGRhdGUuZmlsZV9pbmZvLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0FDS05PV0xFREdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9BVVRIRU5USUNBVEVfT05VOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0VOQUJMRV9ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9HRVRfT05VX1ZFUlNJT05TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9JR01QX1NOT09QSU5HX1BBQ0tFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX01BR0lDX05VTUJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUEhZX0xPT1BfQkFDS19DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSU5HX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BJTkdfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1JFX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9SRU1PVEVfQUNDRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9TRVRfQUxBUk1fVEhSRVNIT0xEUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVEhSRVNIT0xEX1JFUE9SVF9WQUxVRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1RVUk5fT05VX0lOX1RPX09GRl9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9DT05GSUdVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGUgb3A7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGVfdW5wYWNrKCZvcCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRklSTVdBUkVfVVBEQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0FDS05PV0xFREdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9BVVRIRU5USUNBVEVfT05VOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0VOQUJMRV9ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9HRVRfT05VX1ZFUlNJT05TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9JR01QX1NOT09QSU5HX1BBQ0tFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX01BR0lDX05VTUJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUEhZX0xPT1BfQkFDS19DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSU5HX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BJTkdfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1JFX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9SRU1PVEVfQUNDRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9TRVRfQUxBUk1fVEhSRVNIT0xEUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVEhSRVNIT0xEX1JFUE9SVF9WQUxVRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1RVUk5fT05VX0lOX1RPX09GRl9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9DT05GSUdVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjaygmdGhpcy0+dS5jdGMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3BhY2soJnRoaXMtPnUudGVrLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3BhY2soJnRoaXMtPnUucG1jLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjaygmdGhpcy0+dS5kcG9lLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjaygmdGhpcy0+dS5rdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfcGFjaygmdGhpcy0+dS5kYXNhbi5jb25maWcsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYnJjbS52ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5icmNtLnNlcXVlbmNlX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYnJjbS5udW1fdG90YWxfZXhwZWN0ZWRfcGFja2V0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfcGFjaygmdGhpcy0+dS5icmNtLnBkdSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9wYWNrKCZ0aGlzLT51LnNpZXBvbl9hLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jdGMudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS50ZWsudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnBtYy52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kcG9lLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lmt0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZGFzYW4uY29uZmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDYgKyBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuYnJjbS5wZHUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNpZXBvbl9hLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZGVmLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJnRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmN0Yy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF91bnBhY2soJnRoaXMtPnUudGVrLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnBtYy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmRwb2UudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjaygmdGhpcy0+dS5rdC52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV91bnBhY2soJnRoaXMtPnUuZGFzYW4uY29uZmlnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmJyY20udmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuYnJjbS5zZXF1ZW5jZV9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmJyY20ubnVtX3RvdGFsX2V4cGVjdGVkX3BhY2tldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmJyY20ucGR1LCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnNpZXBvbl9hLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmb3VpLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZV9wYWNrKHRoaXMtPmNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5pbmZvLnRsdnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5pbmZvLnRsdnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGx2c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfaW5mb1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmluZm8udGx2c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfcGFjaygmdGhpcy0+dS5pbmZvLnRsdnNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9FVkVOVF9OT1RJRklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnNlcXVlbmNlX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGx2c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfZXZlbnRfbm90aWZpY2F0aW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX3BhY2soJnRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudmFyX3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdmFyX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS52YXJfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9wYWNrKCZ0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdmFyX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfcGFjaygmdGhpcy0+dS52YXJfcmVzcG9uc2UudmFyc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0xPT1BCQUNLX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmRfcGFjayh0aGlzLT51Lmxvb3BiYWNrX2NvbnRyb2wuY29tbWFuZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX3BhY2soJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuaW5mby50bHZzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuaW5mby50bHZzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRsdnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5pbmZvLnRsdnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5pbmZvLnRsdnNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9FVkVOVF9OT1RJRklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHZzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c1tpMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS52YXJfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudmFyX3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUudmFyX3JlcXVlc3QudmFyc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnNbaTJdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS52YXJfcmVzcG9uc2UudmFyc1tpM10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0xPT1BCQUNLX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfdW5wYWNrKCZ0aGlzLT5jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmluZm8udGx2c19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfaW5mb19jb3VudF90bHZzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmluZm8udGx2c19jb3VudCA+IDApICYmICh0aGlzLT51LmluZm8udGx2cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRsdnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2luZm9cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5pbmZvLnRsdnMgPSAoYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuaW5mby50bHZzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmluZm8udGx2c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmluZm8udGx2c1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi5zZXF1ZW5jZV9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2V2ZW50X25vdGlmaWNhdGlvbl9jb3VudF90bHZzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHZzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9ldmVudF9ub3RpZmljYXRpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2cyA9IChiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3Zhcl9yZXF1ZXN0X2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudmFyX3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF92YXJfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnMgPSAoYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudmFyX3JlcXVlc3QudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS52YXJfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV91bnBhY2soJnRoaXMtPnUudmFyX3JlcXVlc3QudmFyc1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3Zhcl9yZXNwb25zZV9jb3VudF92YXJzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF92YXJfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS52YXJfcmVzcG9uc2UudmFycyA9IChiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzW2kzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kX3VucGFjaygmdGhpcy0+dS5sb29wYmFja19jb250cm9sLmNvbW1hbmQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV91bnBhY2soJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSBjb2RlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfdW5wYWNrKCZjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0bHZzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0bHZzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodGx2c19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9FVkVOVF9OT1RJRklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdGx2c19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0bHZzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodGx2c19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0xPT1BCQUNLX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2luZm9fY291bnRfdGx2cyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2V2ZW50X25vdGlmaWNhdGlvbl9jb3VudF90bHZzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdmFyX3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3Zhcl9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxpbmspKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9wYWNrKCZ0aGlzLT5vYW1fY29udGVudCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50ICp0aGlzKQoreworICAgIHJldHVybiAyICsgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+b2FtX2NvbnRlbnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3VucGFjaygmdGhpcy0+b2FtX2NvbnRlbnQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT5vdWkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZ0aGlzLT5vdWkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWdfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY29udC52ZW5kb3Jfb3VpX3JlZyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2ZW5kb3Jfb3VpX3JlZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfcGFjaygmdGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDYgKiB0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWdfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWdfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY29udC52ZW5kb3Jfb3VpX3JlZyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZlbmRvcl9vdWlfcmVnXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWcgPSAoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWdfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWdfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aV91bnBhY2soJnRoaXMtPnUuY29udC52ZW5kb3Jfb3VpX3JlZ1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmVuZG9yX291aV9yZWdfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ2ZW5kb3Jfb3VpX3JlZ19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWkpICogdmVuZG9yX291aV9yZWdfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCB2ZW5kb3Jfb3VpX3JlZ19jb3VudCAqIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdfSU5GT19UWVBFX1ZFTkRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX3BhY2soJnRoaXMtPnUudmVuZG9yLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+dS5kZWYuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdfSU5GT19UWVBFX1ZFTkRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS52ZW5kb3IudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdfSU5GT19UWVBFX1ZFTkRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX3VucGFjaygmdGhpcy0+dS52ZW5kb3IudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+dS5kZWYuYWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kZWYubGVuZ3RoX3Jlc2VydmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSB0eXBlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdfSU5GT19UWVBFX1ZFTkRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW5mb19yZWdfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aW5mb19yZWdfY291bnQgPiAwKSAmJiAodGhpcy0+aW5mb19yZWcgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW5mb19yZWdcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+aW5mb19yZWdfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3BhY2soJnRoaXMtPmluZm9fcmVnW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPmluZm9fcmVnX2NvdW50ID4gMCkgJiYgKHRoaXMtPmluZm9fcmVnID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImluZm9fcmVnX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+aW5mb19yZWdfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3Rsdl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+aW5mb19yZWdbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbmZvX3JlZ19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pbmZvX3JlZ19jb3VudCA+IDApICYmICh0aGlzLT5pbmZvX3JlZyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImluZm9fcmVnXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmluZm9fcmVnID0gKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5pbmZvX3JlZ19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdikpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+aW5mb19yZWdfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3VucGFjaygmdGhpcy0+aW5mb19yZWdbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpbmZvX3JlZ19jb3VudDsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmluZm9fcmVnX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2KSAqIGluZm9fcmVnX2NvdW50KTsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCBpbmZvX3JlZ19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfcGFjaygmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3BhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jb250LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3VucGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3VucGFjaygmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJmFjdGlvbiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuZXh0X2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbl9wYWNrKHRoaXMtPnUuZXh0X2FjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51Lmt0YXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUua3RhY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmV4dF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmV4dF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5rdGF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51Lmt0YWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY19wYWNrKCZ0aGlzLT5kZXNjcmlwdG9yLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjX3VucGFjaygmdGhpcy0+ZGVzY3JpcHRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dmFyaWFibGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmFyaWFibGVfY291bnQgPiAwKSAmJiAodGhpcy0+dmFyaWFibGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcmlhYmxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZhcmlhYmxlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfcGFjaygmdGhpcy0+dmFyaWFibGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICg2ICogdGhpcy0+dmFyaWFibGVfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnZhcmlhYmxlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZhcmlhYmxlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZhcmlhYmxlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcmlhYmxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhcmlhYmxlcyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZhcmlhYmxlX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dmFyaWFibGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV91bnBhY2soJnRoaXMtPnZhcmlhYmxlc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgdmFyaWFibGVfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdmFyaWFibGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlKSAqIHZhcmlhYmxlX2NvdW50KTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHZhcmlhYmxlX2NvdW50ICogNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX3BhY2soJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfcGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9EQkE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0tUT05VX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX09OVV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU09GVFdBUkVfRE9XTkxPQUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT51LmRlZi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0NIVVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0RCQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfS1RPTlVfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfT05VX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TT0ZUV0FSRV9ET1dOTE9BRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfdW5wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV91bnBhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0NIVVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0RCQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfS1RPTlVfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfT05VX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TT0ZUV0FSRV9ET1dOTE9BRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZGVmLmFjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlIG9wY29kZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9EQkE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0tUT05VX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX09OVV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU09GVFdBUkVfRE9XTkxPQUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm9wY29kZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5vcGNvZGVfY291bnQgPiAwKSAmJiAodGhpcy0+b3Bjb2RlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3BhY2soJnRoaXMtPm9wY29kZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPm9wY29kZV9jb3VudCA+IDApICYmICh0aGlzLT5vcGNvZGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm9wY29kZV9jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+b3Bjb2Rlc1tpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5vcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+b3Bjb2RlcyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5vcGNvZGVfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3VucGFjaygmdGhpcy0+b3Bjb2Rlc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3Qgb3Bjb2RlX2NvdW50OworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmb3Bjb2RlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUpICogb3Bjb2RlX2NvdW50KTsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCBvcGNvZGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGVfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29udC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmYWN0aW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY19wYWNrKCZ0aGlzLT5kZXNjcmlwdG9yLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjX3VucGFjaygmdGhpcy0+ZGVzY3JpcHRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dmFyaWFibGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmFyaWFibGVfY291bnQgPiAwKSAmJiAodGhpcy0+dmFyaWFibGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcmlhYmxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZhcmlhYmxlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfcGFjaygmdGhpcy0+dmFyaWFibGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICg2ICogdGhpcy0+dmFyaWFibGVfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnZhcmlhYmxlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZhcmlhYmxlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZhcmlhYmxlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcmlhYmxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhcmlhYmxlcyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZhcmlhYmxlX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dmFyaWFibGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV91bnBhY2soJnRoaXMtPnZhcmlhYmxlc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgdmFyaWFibGVfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdmFyaWFibGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlKSAqIHZhcmlhYmxlX2NvdW50KTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHZhcmlhYmxlX2NvdW50ICogNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX3BhY2soJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfcGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9SRUFEX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT51LmRlZi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9MT09QX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9VTkFDS0VEX0FDVElPTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfdW5wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV91bnBhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9MT09QX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9VTkFDS0VEX0FDVElPTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZGVmLmFjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIG9wY29kZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9SRUFEX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm9wY29kZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5vcGNvZGVfY291bnQgPiAwKSAmJiAodGhpcy0+b3Bjb2RlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3BhY2soJnRoaXMtPm9wY29kZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPm9wY29kZV9jb3VudCA+IDApICYmICh0aGlzLT5vcGNvZGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm9wY29kZV9jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+b3Bjb2Rlc1tpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5vcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+b3Bjb2RlcyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5vcGNvZGVfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3VucGFjaygmdGhpcy0+b3Bjb2Rlc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3Qgb3Bjb2RlX2NvdW50OworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmb3Bjb2RlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUpICogb3Bjb2RlX2NvdW50KTsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCBvcGNvZGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGVfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWsgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29udC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmYWN0aW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzY19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LnN0YW5kYXJkX2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2sodGhpcy0+dS5zdGFuZGFyZF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmV4dGVuZGVkX2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuZXh0ZW5kZWRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LnN0YW5kYXJkX2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5zdGFuZGFyZF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmV4dGVuZGVkX2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZXh0ZW5kZWRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2Nfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2NfcGFjaygmdGhpcy0+ZGVzY3JpcHRvciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuZ3RoX3Jlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzY191bnBhY2soJnRoaXMtPmRlc2NyaXB0b3IsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuZ3RoX3Jlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZhcmlhYmxlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZhcmlhYmxlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZhcmlhYmxlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJpYWJsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dmFyaWFibGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfcGFjaygmdGhpcy0+dmFyaWFibGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0ICp0aGlzKQoreworICAgIHJldHVybiAxICsgKDYgKiB0aGlzLT52YXJpYWJsZV9jb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT52YXJpYWJsZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT52YXJpYWJsZV9jb3VudCA+IDApICYmICh0aGlzLT52YXJpYWJsZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJpYWJsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFyaWFibGVzID0gKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZhcmlhYmxlX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZhcmlhYmxlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX3VucGFjaygmdGhpcy0+dmFyaWFibGVzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgdmFyaWFibGVfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdmFyaWFibGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZSkgKiB2YXJpYWJsZV9jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB2YXJpYWJsZV9jb3VudCAqIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfcGFjaygmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJmFjdGlvbiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV9wYWNrKHRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfcGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT51LmRlZi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHX1JFU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV91bnBhY2soJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmRlZi5hY3Rpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRlZi5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlIG9wY29kZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHX1JFU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5vcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwib3Bjb2Rlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5vcGNvZGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlX3BhY2soJnRoaXMtPm9wY29kZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwib3Bjb2RlX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPm9wY29kZXNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5vcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPm9wY29kZXMgPSAoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPm9wY29kZV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZXNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBvcGNvZGVfY291bnQ7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZvcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUpICogb3Bjb2RlX2NvdW50KTsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCBvcGNvZGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3BhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3BhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29udC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS51bnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF91bnBhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfdW5wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3BhY2sodGhpcy0+b3VpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3BhY2soJnRoaXMtPnUuY3RjLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfcGFjaygmdGhpcy0+dS50ZWsudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3BhY2soJnRoaXMtPnUuZHBvZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+dS5kZWYuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY3RjLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnRlay52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRwb2UudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZ0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdW5wYWNrKCZ0aGlzLT51LmN0Yy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdW5wYWNrKCZ0aGlzLT51LnRlay52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV91bnBhY2soJnRoaXMtPnUuZHBvZS52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmRlZi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJm91aSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dmVuZG9yX291aV9yZWdfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmVuZG9yX291aV9yZWdfY291bnQgPiAwKSAmJiAodGhpcy0+dmVuZG9yX291aV9yZWcgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVuZG9yX291aV9yZWdcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT52ZW5kb3Jfb3VpX3JlZ19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV9wYWNrKCZ0aGlzLT52ZW5kb3Jfb3VpX3JlZ1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+dmVuZG9yX291aV9yZWdfY291bnQgPiAwKSAmJiAodGhpcy0+dmVuZG9yX291aV9yZWcgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVuZG9yX291aV9yZWdfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZlbmRvcl9vdWlfcmVnX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dmVuZG9yX291aV9yZWdbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dmVuZG9yX291aV9yZWdfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmVuZG9yX291aV9yZWdfY291bnQgPiAwKSAmJiAodGhpcy0+dmVuZG9yX291aV9yZWcgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2ZW5kb3Jfb3VpX3JlZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZlbmRvcl9vdWlfcmVnID0gKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZlbmRvcl9vdWlfcmVnX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZlbmRvcl9vdWlfcmVnX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX3VucGFjaygmdGhpcy0+dmVuZG9yX291aV9yZWdbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IHZlbmRvcl9vdWlfcmVnX2NvdW50OworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdmVuZG9yX291aV9yZWdfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSkgKiB2ZW5kb3Jfb3VpX3JlZ19jb3VudCk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgdmVuZG9yX291aV9yZWdfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF9wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29udC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmYWN0aW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3BhY2soJnRoaXMtPnUuaW5mby52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfcGFjaygmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0xPT1BCQUNLX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+dS5kZWYuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5pbmZvLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0VWRU5UX05PVElGSUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3VucGFjaygmdGhpcy0+dS5pbmZvLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfdW5wYWNrKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0xPT1BCQUNLX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+dS5kZWYuYWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kZWYubGVuZ3RoX3Jlc2VydmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSBvcGNvZGU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0VWRU5UX05PVElGSUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tYXN0ZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbl9jb3VudCA+IDApICYmICh0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJlZ2lzdHJhdGlvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbl9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX3BhY2soJnRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25baTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDQ7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY29udC5yZWdpc3RyYXRpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmVnaXN0cmF0aW9uX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWFzdGVyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbl9jb3VudCA+IDApICYmICh0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmVnaXN0cmF0aW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uID0gKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbl9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25fY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV91bnBhY2soJnRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25baTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVnaXN0cmF0aW9uX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZyZWdpc3RyYXRpb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlKSAqIHJlZ2lzdHJhdGlvbl9jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgcmVnaXN0cmF0aW9uX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJlZ2lzdHJhdGlvbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cmVnaXN0cmF0aW9uc19jb3VudCA+IDApICYmICh0aGlzLT5yZWdpc3RyYXRpb25zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJlZ2lzdHJhdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnJlZ2lzdHJhdGlvbnNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3BhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbnNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT5yZWdpc3RyYXRpb25zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnJlZ2lzdHJhdGlvbnMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmVnaXN0cmF0aW9uc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5yZWdpc3RyYXRpb25zX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnJlZ2lzdHJhdGlvbnNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlZ2lzdHJhdGlvbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cmVnaXN0cmF0aW9uc19jb3VudCA+IDApICYmICh0aGlzLT5yZWdpc3RyYXRpb25zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmVnaXN0cmF0aW9uc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+cmVnaXN0cmF0aW9ucyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+cmVnaXN0cmF0aW9uc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbikpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+cmVnaXN0cmF0aW9uc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fdW5wYWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25zW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IHJlZ2lzdHJhdGlvbnNfY291bnQ7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZyZWdpc3RyYXRpb25zX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uKSAqIHJlZ2lzdHJhdGlvbnNfY291bnQpOworICAgIGZvciAoaTAgPSAwOyBpMCA8IHJlZ2lzdHJhdGlvbnNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubmV0d29ya19wb24ucG9ydF9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmxpbmsubGlua19pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfVVNFUl9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfTkVUV09SS19QT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX1VTRVJfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubmV0d29ya19wb24ucG9ydF9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmxpbmsubGlua19pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfVVNFUl9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUudXNlcl9wb3J0LnBvcnRfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUgdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlX3VucGFjaygmdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX1VTRVJfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9wYWNrKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm5lZ290aWF0ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbl9wYWNrKHRoaXMtPnUuY3RjLnZlcnNpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uX3BhY2sodGhpcy0+dS5kcG9lLnZlcnNpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDU7CisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IHZlcnNpb25fbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZ0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5uZWdvdGlhdGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ2ZXJzaW9uX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB2ZXJzaW9uX2xlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT51LmN0Yy52ZXJzaW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uX3VucGFjaygmdGhpcy0+dS5kcG9lLnZlcnNpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCB2ZXJzaW9uX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJm91aSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChvdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+Y291bnQgPiAwKSAmJiAodGhpcy0+bmVnb3RpYXRlZF9vYW1zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm5lZ290aWF0ZWRfb2Ftc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmNvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fcGFjaygmdGhpcy0+bmVnb3RpYXRlZF9vYW1zW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT5jb3VudCA+IDApICYmICh0aGlzLT5uZWdvdGlhdGVkX29hbXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmNvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5uZWdvdGlhdGVkX29hbXNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+Y291bnQgPiAwKSAmJiAodGhpcy0+bmVnb3RpYXRlZF9vYW1zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmVnb3RpYXRlZF9vYW1zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+bmVnb3RpYXRlZF9vYW1zID0gKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+Y291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX3VucGFjaygmdGhpcy0+bmVnb3RpYXRlZF9vYW1zW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBjb3VudDsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmNvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSkgKiBjb3VudCk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZF9wYWNrKHRoaXMtPmNvbW1hbmQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0VOQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0RJU0FCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X3BhY2soJnRoaXMtPnUuc2V0X29hbV9yZWdpc3RyYXRpb24ub2FtX3JlZ2lzdHJhdGlvbnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3BhY2soJnRoaXMtPnUuZ2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfcGFjaygmdGhpcy0+dS5zZXRfbmVnb3RpYXRlZF9vYW0ubGlua19jb250ZXh0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfcGFjaygmdGhpcy0+dS5zZXRfbmVnb3RpYXRlZF9vYW0ubmVnb3RpYXRlZF9vYW0sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA0OworICAgIHN3aXRjaCAodGhpcy0+Y29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9FTkFCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9ESVNBQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09OVV9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X29hbV9yZWdpc3RyYXRpb24ub2FtX3JlZ2lzdHJhdGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfbmVnb3RpYXRlZF9vYW0ubGlua19jb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCkgKyBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfbmVnb3RpYXRlZF9vYW0ubmVnb3RpYXRlZF9vYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkX3VucGFjaygmdGhpcy0+Y29tbWFuZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRU5BQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRElTQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfdW5wYWNrKCZ0aGlzLT51LnNldF9vYW1fcmVnaXN0cmF0aW9uLm9hbV9yZWdpc3RyYXRpb25zLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfdW5wYWNrKCZ0aGlzLT51LmdldF9uZWdvdGlhdGVkX29hbS5saW5rX2NvbnRleHQsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl91bnBhY2soJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF91bnBhY2soJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLm5lZ290aWF0ZWRfb2FtLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1RFUk1JTkFUT1I6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZCBjb21tYW5kOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkX3VucGFjaygmY29tbWFuZCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRU5BQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRElTQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZF9wYWNrKHRoaXMtPmNvbW1hbmQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlX3BhY2sodGhpcy0+cmVzcG9uc2VfY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRU5BQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRElTQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlX3BhY2sodGhpcy0+dS5nZXRfb251X3N0YXRlLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X3BhY2soJnRoaXMtPnUuZ2V0X29hbV9yZWdpc3RyYXRpb24ub2FtX3JlZ2lzdHJhdGlvbnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl9wYWNrKCZ0aGlzLT51LmdldF9uZWdvdGlhdGVkX29hbS5saW5rX2NvbnRleHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9wYWNrKCZ0aGlzLT51LmdldF9uZWdvdGlhdGVkX29hbS5uZWdvdGlhdGVkX29hbSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfcGFjaygmdGhpcy0+dS5zZXRfbmVnb3RpYXRlZF9vYW0ubGlua19jb250ZXh0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfVEVSTUlOQVRPUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA1OworICAgIHN3aXRjaCAodGhpcy0+Y29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9FTkFCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9ESVNBQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09OVV9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9vYW1fcmVnaXN0cmF0aW9uLm9hbV9yZWdpc3RyYXRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9uZWdvdGlhdGVkX29hbS5saW5rX2NvbnRleHQpICsgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X25lZ290aWF0ZWRfb2FtLm5lZ290aWF0ZWRfb2FtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1RFUk1JTkFUT1I6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZF91bnBhY2soJnRoaXMtPmNvbW1hbmQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlX3VucGFjaygmdGhpcy0+cmVzcG9uc2VfY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRU5BQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRElTQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlX3VucGFjaygmdGhpcy0+dS5nZXRfb251X3N0YXRlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfdW5wYWNrKCZ0aGlzLT51LmdldF9vYW1fcmVnaXN0cmF0aW9uLm9hbV9yZWdpc3RyYXRpb25zLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3VucGFjaygmdGhpcy0+dS5nZXRfbmVnb3RpYXRlZF9vYW0ubGlua19jb250ZXh0LCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3VucGFjaygmdGhpcy0+dS5nZXRfbmVnb3RpYXRlZF9vYW0ubmVnb3RpYXRlZF9vYW0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl91bnBhY2soJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIGNvbW1hbmQ7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWRfdW5wYWNrKCZjb21tYW5kLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0VOQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0RJU0FCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1VTklDQVRJT05fVFlQRV9DT01NQU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9wYWNrKCZ0aGlzLT51LmNvbW1hbmQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTVVOSUNBVElPTl9UWVBFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfcGFjaygmdGhpcy0+dS5yZXNwb25zZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1VTklDQVRJT05fVFlQRV9DT01NQU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29tbWFuZC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVzcG9uc2UudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfQ09NTUFORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfdW5wYWNrKCZ0aGlzLT51LmNvbW1hbmQudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV91bnBhY2soJnRoaXMtPnUucmVzcG9uc2UudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZSB0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlX3VucGFjaygmdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1VTklDQVRJT05fVFlQRV9DT01NQU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbF9wYWNrKHRoaXMtPnByb3RvY29sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5jb3JyZWxhdGlvbl90YWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cHJvdG9jb2wpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX1BJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzX3BhY2sodGhpcy0+dS5waW5nLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX0VOQ0FQU1VMQVRFRF9GUkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3BhY2soJnRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmRtZXAsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF9wYWNrKCZ0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5zbWVwLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5mcmFtZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZnJhbWVfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbl9lbmNhcHN1bGF0ZWRfZnJhbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfZGF0YSwgdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9PQU1fQ09OVEVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3BhY2soJnRoaXMtPnUub2FtX2NvbnRlbnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfUkVHSVNURVJFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF9wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyZWRfb2FtLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX01BU1RFUl9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9wYWNrKCZ0aGlzLT51Lm1hc3Rlcl9jb21tdW5pY2F0aW9uLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX0JST0FEQ09NX1NESzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9NQVNURVJfUFJPVE9DT0xfVEVLX1VOS05PV046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA2OworICAgIHN3aXRjaCAodGhpcy0+cHJvdG9jb2wpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX1BJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX0VOQ0FQU1VMQVRFRF9GUkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA2ICsgdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfbGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfT0FNX0NPTlRFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub2FtX2NvbnRlbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfUkVHSVNURVJFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVnaXN0ZXJlZF9vYW0udmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5tYXN0ZXJfY29tbXVuaWNhdGlvbi52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9CUk9BRENPTV9TREs6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX1BST1RPQ09MX1RFS19VTktOT1dOOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2xfdW5wYWNrKCZ0aGlzLT5wcm90b2NvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+Y29ycmVsYXRpb25fdGFnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPnByb3RvY29sKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9QSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFnc191bnBhY2soJnRoaXMtPnUucGluZy5mbGFncywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX0VOQ0FQU1VMQVRFRF9GUkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3VucGFjaygmdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZG1lcCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF91bnBhY2soJnRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLnNtZXAsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5mcmFtZV9sZW5ndGggPiAwKSAmJiAodGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZyYW1lX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fZW5jYXBzdWxhdGVkX2ZyYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2RhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5mcmFtZV9kYXRhLCB0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5mcmFtZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX09BTV9DT05URU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfdW5wYWNrKCZ0aGlzLT51Lm9hbV9jb250ZW50LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9SRUdJU1RFUkVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3VucGFjaygmdGhpcy0+dS5yZWdpc3RlcmVkX29hbS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3VucGFjaygmdGhpcy0+dS5tYXN0ZXJfY29tbXVuaWNhdGlvbi52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfQlJPQURDT01fU0RLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX01BU1RFUl9QUk9UT0NPTF9URUtfVU5LTk9XTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbF91bnBhY2soJnByb3RvY29sLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChwcm90b2NvbCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfRU5DQVBTVUxBVEVEX0ZSQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGZyYW1lX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJmZyYW1lX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIGZyYW1lX2xlbmd0aCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX09BTV9DT05URU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9SRUdJU1RFUkVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfQlJPQURDT01fU0RLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX01BU1RFUl9QUk9UT0NPTF9URUtfVU5LTk9XTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX3BhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfcGFjayh0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fcGFjaygmdGhpcy0+dS50ZWsudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudGVrLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJnRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbl91bnBhY2soJnRoaXMtPnUudGVrLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmb3VpLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlX3BhY2sodGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFnc19wYWNrKHRoaXMtPnUub2FtLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9wYWNrKCZ0aGlzLT51Lm9hbS5jb250ZW50LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX3BhY2soJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFDUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBTVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9hbS5jb250ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQUNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFNUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlX3VucGFjaygmdGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFnc191bnBhY2soJnRoaXMtPnUub2FtLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF91bnBhY2soJnRoaXMtPnUub2FtLmNvbnRlbnQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF91bnBhY2soJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQUNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFNUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlIHN1YnR5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlX3VucGFjaygmc3VidHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFDUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBTVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV9wYWNrKHRoaXMtPmV0aGVydHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmV0aGVydHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfWkVSTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuemVyby5wYWRkaW5nX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuemVyby5wYWRkaW5nID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBhZGRpbmdcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfemVyb1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lnplcm8ucGFkZGluZywgdGhpcy0+dS56ZXJvLnBhZGRpbmdfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0NWTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWVfcGFjaygmdGhpcy0+dS5jdmxhbi52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3BhY2soJnRoaXMtPnUuc3ZsYW4udmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVRBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlX3BhY2soJnRoaXMtPnUuaXRhZy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfcGFjaygmdGhpcy0+dS5zbG93X3Byb3RvY29sLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0VBUE9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sX3BhY2soJnRoaXMtPnUuZWFwb2wudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQVJQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVBWNjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9NUENQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5ldGhlcnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1pFUk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS56ZXJvLnBhZGRpbmdfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9DVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfU1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lUQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NMT1dfUFJPVE9DT0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2xvd19wcm90b2NvbC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9FQVBPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZWFwb2wudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQVJQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVBWNjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9NUENQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZGVmLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV91bnBhY2soJnRoaXMtPmV0aGVydHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmV0aGVydHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfWkVSTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lnplcm8ucGFkZGluZ19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF96ZXJvX2NvdW50X3BhZGRpbmcoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuemVyby5wYWRkaW5nX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuemVyby5wYWRkaW5nID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicGFkZGluZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF96ZXJvXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuemVyby5wYWRkaW5nID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuemVyby5wYWRkaW5nX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS56ZXJvLnBhZGRpbmcsIHRoaXMtPnUuemVyby5wYWRkaW5nX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9DVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3VucGFjaygmdGhpcy0+dS5jdmxhbi52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NWTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWVfdW5wYWNrKCZ0aGlzLT51LnN2bGFuLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVRBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlX3VucGFjaygmdGhpcy0+dS5pdGFnLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfU0xPV19QUk9UT0NPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3VucGFjaygmdGhpcy0+dS5zbG93X3Byb3RvY29sLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfRUFQT0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfdW5wYWNrKCZ0aGlzLT51LmVhcG9sLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQVJQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVBWNjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9NUENQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfZGVmX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgZXRoZXJ0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGVfdW5wYWNrKCZldGhlcnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChldGhlcnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1pFUk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcGFkZGluZ19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZ19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBhZGRpbmdfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9DVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NWTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVRBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NMT1dfUFJPVE9DT0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9FQVBPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9BUlA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVBWNDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9JUFY2OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0xPT1BCQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX01QQ1A6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfemVyb19jb3VudF9wYWRkaW5nKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX3BhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+ZGEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnNhKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnByb3RvY29sc19jb3VudCA+IDApICYmICh0aGlzLT5wcm90b2NvbHMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicHJvdG9jb2xzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnByb3RvY29sc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3BhY2soJnRoaXMtPnByb3RvY29sc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDEyOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+cHJvdG9jb2xzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnByb3RvY29scyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwcm90b2NvbHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5wcm90b2NvbHNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnByb3RvY29sc1tpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5kYSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+c2EpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHRoaXMtPnByb3RvY29sc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV9jb3VudF9wcm90b2NvbHMoYnVmKTsKKyAgICBpZiAoKHRoaXMtPnByb3RvY29sc19jb3VudCA+IDApICYmICh0aGlzLT5wcm90b2NvbHMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwcm90b2NvbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+cHJvdG9jb2xzID0gKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+cHJvdG9jb2xzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+cHJvdG9jb2xzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfdW5wYWNrKCZ0aGlzLT5wcm90b2NvbHNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgcHJvdG9jb2xzX2VsZW1fY291bnQgPSAwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RvY29sc19lbGVtX2NvdW50ICs9IDE7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHByb3RvY29sc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCkpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX2NvdW50X3Byb3RvY29scyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmRhKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5zYSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV9wYWNrKHRoaXMtPnByb3RvY29sX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlX3BhY2sodGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3NfcGFjayh0aGlzLT5mbGFncywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfcGFjaygmdGhpcy0+Y29udGVudCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSAqdGhpcykKK3sKKyAgICByZXR1cm4gMTcgKyBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jb250ZW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmRhKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5zYSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV91bnBhY2soJnRoaXMtPnByb3RvY29sX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlX3VucGFjaygmdGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3NfdW5wYWNrKCZ0aGlzLT5mbGFncywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdW5wYWNrKCZ0aGlzLT5jb250ZW50LCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5ncGlvX3N0YXRlMWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ncGlvX3N0YXRlMTBnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmdwaW9fc3RhdGUxZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmdwaW9fc3RhdGUxMGcpKQorICAgIHsKKyAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfcGFjayh0aGlzLT5hbGFybV9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmFpc2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cG9ydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxpbmspKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHRfcGFjayh0aGlzLT5hbGFybV9jb250ZXh0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NUQVRfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5zdGF0X2FsYXJtLnN0YXRfaWQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fTElOS19GQVVMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fcGFjaygmdGhpcy0+dS5ncGlvX2xpbmtfZmF1bHQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fRFlJTkdfR0FTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fcGFjaygmdGhpcy0+dS5ncGlvX2R5aW5nX2dhc3AudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fQ1JJVElDQUxfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3BhY2soJnRoaXMtPnUuZ3Bpb19jcml0aWNhbF9ldmVudC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19PVEhFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fcGFjaygmdGhpcy0+dS5ncGlvX290aGVyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9BVVRIX1VOQVZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0FVVE9fTkVHX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0JPT1RfSU5WQUxJRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1JJVElDQUxfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NUQ19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1RDX0RJU0NPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9ESUFHX0xPQUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0RZSU5HX0dBU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZBTl9GQVVMVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkxBU0hfQlVTWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkxPV19DT05UUk9MX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dBVEVfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfSVBOX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MQVNFUl9BTFdBWVNfT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xFQVJOX1RBQkxFX09WRVJGTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX0ZBVUxUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX09BTV9ESVNDX0NPTVBMRVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19GQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19TVEFSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfU1VDQ0VTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTE9PUEJBQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xPU1NfT0ZfU0lHTkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PQU1fVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT05VX1BPTl9ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PTlVfUkVBRFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPUlRfRElTQUJMRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fUlhfUE9XRVJfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1JYX1BPV0VSX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RFTVBfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RFTVBfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfQklBU19ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfQklBU19MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9QT1dFUl9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfUE9XRVJfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVkNDX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9WQ0NfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QUk9UX1NXSVRDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUVVFVUVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUkVQT1JUX0ZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NUQU5EQllfTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TWVNURU06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RFTVBFUkFUVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9UUkFOU01JVF9ERUdSQURFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9UWF9GQUlMOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDk7CisgICAgc3dpdGNoICh0aGlzLT5hbGFybV9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1RBVF9BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fTElOS19GQVVMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0RZSU5HX0dBU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19DUklUSUNBTF9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX09USEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0FVVEhfVU5BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQVVUT19ORUdfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQk9PVF9JTlZBTElEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DUklUSUNBTF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1RDX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DVENfRElTQ09WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0RJQUdfTE9BRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRFlJTkdfR0FTUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkFOX0ZBVUxUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTEFTSF9CVVNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTE9XX0NPTlRST0xfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR0FURV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9JUE5fTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xBU0VSX0FMV0FZU19PTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTEVBUk5fVEFCTEVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfRkFVTFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfT0FNX0RJU0NfQ09NUExFVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX0ZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX1NUQVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19TVUNDRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTE9TU19PRl9TSUdOQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09BTV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PTlVfUE9OX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09OVV9SRUFEWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9SWF9QT1dFUl9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fUlhfUE9XRVJfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX1BPV0VSX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9QT1dFUl9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9WQ0NfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1ZDQ19MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BST1RfU1dJVENIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9RVUVVRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9SRVBPUlRfRkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1RBTkRCWV9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NZU1RFTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVEVNUEVSQVRVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RSQU5TTUlUX0RFR1JBREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RYX0ZBSUw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3VucGFjaygmdGhpcy0+YWxhcm1fY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJhaXNlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5saW5rKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0X3VucGFjaygmdGhpcy0+YWxhcm1fY29udGV4dCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TVEFUX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuc3RhdF9hbGFybS5zdGF0X2lkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0xJTktfRkFVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3VucGFjaygmdGhpcy0+dS5ncGlvX2xpbmtfZmF1bHQudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19EWUlOR19HQVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb191bnBhY2soJnRoaXMtPnUuZ3Bpb19keWluZ19nYXNwLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fQ1JJVElDQUxfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3VucGFjaygmdGhpcy0+dS5ncGlvX2NyaXRpY2FsX2V2ZW50LnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fT1RIRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3VucGFjaygmdGhpcy0+dS5ncGlvX290aGVyLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0FVVEhfVU5BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQVVUT19ORUdfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQk9PVF9JTlZBTElEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DUklUSUNBTF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1RDX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DVENfRElTQ09WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0RJQUdfTE9BRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRFlJTkdfR0FTUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkFOX0ZBVUxUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTEFTSF9CVVNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTE9XX0NPTlRST0xfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR0FURV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9JUE5fTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xBU0VSX0FMV0FZU19PTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTEVBUk5fVEFCTEVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfRkFVTFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfT0FNX0RJU0NfQ09NUExFVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX0ZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX1NUQVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19TVUNDRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTE9TU19PRl9TSUdOQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09BTV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PTlVfUE9OX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09OVV9SRUFEWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9SWF9QT1dFUl9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fUlhfUE9XRVJfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX1BPV0VSX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9QT1dFUl9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9WQ0NfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1ZDQ19MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BST1RfU1dJVENIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9RVUVVRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9SRVBPUlRfRkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1RBTkRCWV9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NZU1RFTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVEVNUEVSQVRVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RSQU5TTUlUX0RFR1JBREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RYX0ZBSUw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlIGFsYXJtX2NvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfdW5wYWNrKCZhbGFybV9jb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGFsYXJtX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TVEFUX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fTElOS19GQVVMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fRFlJTkdfR0FTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fQ1JJVElDQUxfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX09USEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQVVUSF9VTkFWQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9BVVRPX05FR19GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9CT09UX0lOVkFMSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NSSVRJQ0FMX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DVENfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NUQ19ESVNDT1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRElBR19MT0FEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9EWUlOR19HQVNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GQU5fRkFVTFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZMQVNIX0JVU1k6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZMT1dfQ09OVFJPTF9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HQVRFX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0lQTl9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTEFTRVJfQUxXQVlTX09OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MRUFSTl9UQUJMRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19GQVVMVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19PQU1fRElTQ19DT01QTEVURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfRkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfU1RBUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX1NVQ0NFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xPT1BCQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT1NTX09GX1NJR05BTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT0FNX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09OVV9QT05fRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT05VX1JFQURZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1JUX0RJU0FCTEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1JYX1BPV0VSX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9SWF9QT1dFUl9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9URU1QX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9URU1QX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX0JJQVNfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX0JJQVNfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfUE9XRVJfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX1BPV0VSX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1ZDQ19ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVkNDX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUFJPVF9TV0lUQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1FVRVVFX09WRVJGTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1JFUE9SVF9GQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TVEFOREJZX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1lTVEVNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9URU1QRVJBVFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVFJBTlNNSVRfREVHUkFERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVFhfRkFJTDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmFkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+YWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfbWFjX2FkZHJlc3Nfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPmF0dHJpYnV0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmF0dHJpYnV0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUucG9ydF9zdGF0X3RocmVzaG9sZC5zdGF0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2hvbGQuc3RhdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FSUF9SRVBMSUNBVEVfREVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JDQVNUX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CWVBBU1NfU09GVF9MRUFSTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT05UUk9MX1BPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT1NfVFJBTlNMQVRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DVExfVkxBTl9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ET1dOX0JVUlNUX1RPTEw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RCTF9TSVpFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOSU5HX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX0FNUExJVFVERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1BIQVNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUVVBTlRJWkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQyOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQzOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQ0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VUF9CSVRfTE9BRElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhURU5ERURfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GQUlMU0FGRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQVRVUkVfU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSUxFX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9USU1FU1RBTVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSUdNUF9GUkFNRV9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOVEVSTkFMX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSkVERUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MQUNQX0RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9NT0RFX1JVTEVfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJPUl9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTE9DQUxfU1dJVENISU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1RfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HTE9CQUxfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR1JPVVBfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01ESV9DUk9TU09WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0tfQ09NUEVOU0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01UVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FVFdPUktfUE9OX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU0NSQVRDSFBBRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9BR0dSRUdBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSE9MRE9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSUdNUF9WTEFOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT0xJQ0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9EWU5BTUlDX0VOVFJJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9NRU1CRVJTSElQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9SWF9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9URU1QRVJBVFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9CSUFTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QU1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHX1YyOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVQUklNQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1VE8xMjc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VBUkNIX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NMRV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFVX01FRElBX0FWQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1lTVEVNX1JVTEVfT1BUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX0JVUlNUX0FDVElWSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfU0lHTkFMX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1VE8xMjc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVU5JX1NIQVBFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0RFU1RJTkFUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5hdHRyaWJ1dGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FSUF9SRVBMSUNBVEVfREVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JDQVNUX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CWVBBU1NfU09GVF9MRUFSTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT05UUk9MX1BPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT1NfVFJBTlNMQVRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DVExfVkxBTl9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ET1dOX0JVUlNUX1RPTEw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RCTF9TSVpFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOSU5HX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX0FNUExJVFVERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1BIQVNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUVVBTlRJWkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQyOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQzOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQ0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VUF9CSVRfTE9BRElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhURU5ERURfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GQUlMU0FGRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQVRVUkVfU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSUxFX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9USU1FU1RBTVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSUdNUF9GUkFNRV9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOVEVSTkFMX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSkVERUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MQUNQX0RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9NT0RFX1JVTEVfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJPUl9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTE9DQUxfU1dJVENISU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1RfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HTE9CQUxfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR1JPVVBfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01ESV9DUk9TU09WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0tfQ09NUEVOU0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01UVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FVFdPUktfUE9OX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU0NSQVRDSFBBRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9BR0dSRUdBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSE9MRE9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSUdNUF9WTEFOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT0xJQ0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9EWU5BTUlDX0VOVFJJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9NRU1CRVJTSElQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9SWF9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9URU1QRVJBVFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9CSUFTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QU1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHX1YyOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVQUklNQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1VE8xMjc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VBUkNIX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NMRV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFVX01FRElBX0FWQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1lTVEVNX1JVTEVfT1BUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX0JVUlNUX0FDVElWSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfU0lHTkFMX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1VE8xMjc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVU5JX1NIQVBFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0RFU1RJTkFUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hdHRyaWJ1dGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LnBvcnRfc3RhdF90aHJlc2hvbGQuc3RhdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5saW5rX3N0YXRfdGhyZXNob2xkLnN0YXQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9BUlBfUkVQTElDQVRFX0RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CQ0FTVF9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQllQQVNTX1NPRlRfTEVBUk46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09OVFJPTF9QT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09TX1RSQU5TTEFUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1JPU1NCQVJfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE9XTl9CVVJTVF9UT0xMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQkxfU0laRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTklOR19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfS0VZX0VYUElSWV9USU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX0RPV05fQklUX0xPQURJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9BTVBMSVRVREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9QSEFTRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1FVQU5USVpFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VENDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVVBfQklUX0xPQURJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVEVOREVEX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkFJTFNBRkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUFUVVJFX1NFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklMRV9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVElNRVNUQU1QOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lHTVBfRlJBTUVfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTlRFUk5BTF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSVBNQ19VTktOT1dOX0xFQVZFX0ZXRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0pFREVDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEFDUF9ERVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fTU9ERV9SVUxFX1VQREFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX1RBQkxFX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRU5fRVJST1JfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR0xPQkFMX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NRElfQ1JPU1NPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLX0NPTVBFTlNBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NVFU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVRXT1JLX1BPTl9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NDUkFUQ0hQQUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfQUdHUkVHQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0hPTERPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0lHTVBfVkxBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9MSUNFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfRFlOQU1JQ19FTlRSSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fTUVNQkVSU0hJUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9QT0xJQ1k6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fUlhfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfQklBUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9WQ0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QUklfRU5RVUVVSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFNTVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTkZJR19WMjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFUFJJTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ERUxBWUVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NlRPNTExOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NVRPMTI3OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFQVJDSF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TTEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0FCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUlJJRVJfU0VOU0VfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfVFhfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NZU1RFTV9SVUxFX09QVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9CVVJTVF9BQ1RJVklUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX1NJR05BTF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ERUxBWUVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NVRPMTI3OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VOSV9TSEFQRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9ERVNUSU5BVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0VUSEVSVFlQRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIGF0dHJpYnV0ZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZhdHRyaWJ1dGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChhdHRyaWJ1dGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQVJQX1JFUExJQ0FURV9ERVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQkNBU1RfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JZUEFTU19TT0ZUX0xFQVJOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPTlRST0xfUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPU19UUkFOU0xBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NST1NTQkFSX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NUTF9WTEFOX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RPV05fQlVSU1RfVE9MTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9BR0VfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEJMX1NJWkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5JTkdfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9NQUNfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUX0tFWV9FWFBJUllfVElNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19ET1dOX0JJVF9MT0FESU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fQU1QTElUVURFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUEhBU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9RVUFOVElaRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VQX0JJVF9MT0FESU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhUX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRFTkRFRF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZBSUxTQUZFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVBVFVSRV9TRVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJTEVfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1RJTUVTVEFNUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JR01QX0ZSQU1FX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTkdSRVNTX1BPTElDSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5URVJOQUxfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lQTUNfVU5LTk9XTl9MRUFWRV9GV0Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9KRURFQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xBQ1BfREVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX01PREVfUlVMRV9VUERBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9UQUJMRV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVOX0VSUk9SX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MT0NBTF9TV0lUQ0hJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVF9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dMT0JBTF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HUk9VUF9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTURJX0NST1NTT1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DS19DT01QRU5TQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVRVOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVUV09SS19QT05fTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TQ1JBVENIUEFEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0FHR1JFR0FURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9IT0xET1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9JR01QX1ZMQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPTElDRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0NBUEFCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX01FTUJFUlNISVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fUE9MSUNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1JYX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RFTVBFUkFUVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX0JJQVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVkNDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFJJX0VOUVVFVUlORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BTU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRVBSSU1BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfREVMQVlFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUyNTZUTzUxMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRUFSQ0hfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0xFX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19BQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZDU19FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TWVNURU1fUlVMRV9PUFRJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfQlVSU1RfQUNUSVZJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9TSUdOQUxfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfREVMQVlFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUyNTZUTzUxMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VTklfU0hBUEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fREVTVElOQVRJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9FVEhFUlRZUEU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGVfcGFjayh0aGlzLT5jb250ZW50X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fcGFjaygmdGhpcy0+dmVyc2lvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRlbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQUxFUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQVBQTElDQVRJT05fREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9DSEFOR0VfQ0lQSEVSX1NQRUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfSEFORFNIQUtFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYuZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLmRhdGEsIHRoaXMtPnUuZGVmLmRhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDU7CisgICAgc3dpdGNoICh0aGlzLT5jb250ZW50X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FMRVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQ0hBTkdFX0NJUEhFUl9TUEVDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0hBTkRTSEFLRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmRlZi5kYXRhX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGVfdW5wYWNrKCZ0aGlzLT5jb250ZW50X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT52ZXJzaW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5jb250ZW50X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FMRVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQ0hBTkdFX0NJUEhFUl9TUEVDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0hBTkRTSEFLRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi5kYXRhX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX2RlZl9jb3VudF9kYXRhKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLmRhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYuZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLmRhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kZWYuZGF0YV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5kZWYuZGF0YSwgdGhpcy0+dS5kZWYuZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgY29udGVudF90eXBlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV91bnBhY2soJmNvbnRlbnRfdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoY29udGVudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkYXRhX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZGF0YV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZF9kZWZfY291bnRfZGF0YShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobV9wYWNrKHRoaXMtPmhhc2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG1fcGFjayh0aGlzLT5zaWduYXR1cmUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtX3VucGFjaygmdGhpcy0+aGFzaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobV91bnBhY2soJnRoaXMtPnNpZ25hdHVyZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgdWludDMyX3QgaTA7CisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNfY291bnQgPiAwKSAmJiAodGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNfY291bnQgPiA2NTUzNEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fcGFjaygmdGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMiArICgyICogdGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgdGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3RfY291bnRfc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zKCZwb3N0TGVuQnVmKTsKKyAgICBpZiAoKHRoaXMtPnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc19jb3VudCA+IDApICYmICh0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50ID4gNjU1MzRMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX3VucGFjaygmdGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zW2kwXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICB1aW50MzJfdCBzdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNfZWxlbV9jb3VudCA9IDA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2VsZW1fY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtKSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3RfY291bnRfc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jb21tb25fZXBvbl9vYW0vYmNtb2x0X2Vwb25fb2FtX3R5cGVzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY29tbW9uX2Vwb25fb2FtL2JjbW9sdF9lcG9uX29hbV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Mjk0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY29tbW9uX2Vwb25fb2FtL2JjbW9sdF9lcG9uX29hbV90eXBlcy5oCkBAIC0wLDAgKzEsMjM5MDYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2lmbmRlZiBCQ01PTFRfRVBPTl9PQU1fVFlQRVNfSF8KKyNkZWZpbmUgQkNNT0xUX0VQT05fT0FNX1RZUEVTX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vc19jb21tb24uaCIKKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImJjbW9sdF9idWYuaCIKKwordHlwZWRlZiBiY21vbHRfYnVmIGJjbW9sdF9lcG9uX29hbV9idWY7CisKKy8qKiBcYWRkdG9ncm91cCBlcG9uX29hbQorICogQHsKKyAqLworCisvKiogQWxhcm0gQ29uZmlnIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0FMQVJNX0NPTkZJR19NT0RFX0NMT1NFID0gMCwgICAgLyoqPCBDbG9zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQUxBUk1fQ09ORklHX01PREVfT1BFTiAgPSAxICAgICAvKio8IE9wZW4uICovCit9IGJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZTsKKworLyoqIEF1dG9uZWdvdGlhdGUgQWRtaW4gU3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT05FR09USUFURV9BRE1JTl9TVEFURV9PQU1fQVVUT19BRE1JTl9ESVNBQkxFRCAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPQU0gQXV0byBBZG1pbiBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT05FR09USUFURV9BRE1JTl9TVEFURV9PQU1fQVVUT19BRE1JTl9FTkFCTEVEICAgID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPQU0gQXV0byBBZG1pbiBFbmFibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZTsKKworLyoqIEF1dG8gTmVnb3RpYXRpb24gQXV0byBDb25maWcuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWcKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9BVVRPX0NPTkZJR19PVEhFUiAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPdGhlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9BVVRPX0NPTkZJR19DT05GSUdVUklORyAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb25maWd1cmluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9BVVRPX0NPTkZJR19DT01QTEVURSAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9BVVRPX0NPTkZJR19ESVNBQkxFRCAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9BVVRPX0NPTkZJR19QQVJBTExFTF9GQUlMICAgICAgICAgID0gNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQYXJhbGxlbCBGYWlsLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZzsKKworLyoqIEF1dG8tTmVnb3RpYXRpb24gQ2FwYWJpbGl0eS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9OT05FICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9IQUxGX0RVUExFWCAgICAgICAgICAgICA9IDB4MDAwMSwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSGFsZiBEdXBsZXguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9GVUxMX0RVUExFWCAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRnVsbCBEdXBsZXguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9URU5fTUJQUyAgICAgICAgICAgICAgICA9IDB4MDAwNCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMTAgTWJwcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9DQVBBQklMSVRZX0hVTkRSRURfTUJQUyAgICAgICAgICAgID0gMHgwMDA4LCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAxMDAgTWJwcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9DQVBBQklMSVRZX1RIT1VTQU5EX01CUFMgICAgICAgICAgID0gMHgwMDEwLCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAxMDAwIE1icHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9URU5fR0JQUyAgICAgICAgICAgICAgICA9IDB4MDAyMCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMTAgR2Jwcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9DQVBBQklMSVRZX0ZMT1dfQ09OVFJPTCAgICAgICAgICAgID0gMHgwMDQwLCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGbG93IENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9BVVRPX01ESV9NRElfWCAgICAgICAgICA9IDB4MDA4MCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXV0byBNREkvTURJLVguICovCit9IGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHk7CisKKy8qKiBBdXRvIFJlbW90ZSBTaWcuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZworeworICAgIEJDTU9MVF9FUE9OX09BTV9BVVRPX1JFTU9URV9TSUdfREVURUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERldGVjdGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9BVVRPX1JFTU9URV9TSUdfTk9UX0RFVEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE5vdCBEZXRlY3RlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZzsKKworLyoqIEF1dG8gU2VsZWN0b3IuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19TRUxFQ1RPUl9PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPdGhlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19TRUxFQ1RPUl9FVEhFUk5FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFdGhlcm5ldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19TRUxFQ1RPUl9JU09fRVRIRVJORVQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJU08gRXRoZXJuZXQuICovCit9IGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yOworCisvKiogQmluYXJ5IEZpZWxkIFNlbGVjdCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX0RBICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NBICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NTTV9QTFVTX0lQREEgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTU00gKyBJUCBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1BST0dfRklFTEQgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQcm9nIEZpZWxkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfQ1ZMQU5fVklEICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENWTEFOIFZJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NWTEFOX1ZJRF9DVkxBTl9WSUQgICAgICAgID0gNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTVkxBTiBWSUQgJiBDVkxBTiBWSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGU7CisKKy8qKiBDTUMgT0FNIFJlcXVlc3QgT3B0aW9uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX1JFUVVFU1RfT1BUSU9OX0FERCAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWRkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19SRVFVRVNUX09QVElPTl9SRU1PVkUgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlbW92ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uOworCisvKiogQ01DIE9BTSByZXN1bHQgY29kZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfUkVTVUxUX0NPREVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdWNjZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19SRVNVTFRfQ09ERV9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX1JFU1VMVF9DT0RFX0lOVkFMSURfUEFSQU1FVEVSUyAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW52YWxpZCBQYXJhbWV0ZXJzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGU7CisKKy8qKiBDTUMgT0FNIGFubmV4IG1vZGVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0FOTkVYX0FOTkVYX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQW5uZXggQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfQU5ORVhfQU5ORVhfQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBbm5leCBCLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXg7CisKKy8qKiBUeXBlIG9mIENNQyBJbnRlcmZhY2UgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEZfVFlQRV9FVEhFUk5FVF9DU01BQ0QgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXRoZXJuZXQgQ3NtYWNkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRGX1RZUEVfU09GVFdBUkVfTE9PUEJBQ0sgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNvZnR3YXJlIExvb3BiYWNrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRGX1RZUEVfRE9DU19DQUJMRV9NQUNfTEFZRVIgICAgICAgICAgICAgPSAxMjcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERvY3MgQ2FibGUgTWFjIExheWVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRGX1RZUEVfRE9DU19DQUJMRV9ET1dOU1RSRUFNICAgICAgICAgICAgPSAxMjgsICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERvY3MgQ2FibGUgRG93bnN0cmVhbS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URl9UWVBFX0RPQ1NfQ0FCTEVfVVBTVFJFQU0gICAgICAgICAgICAgID0gMTI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEb2NzIENhYmxlIFVwc3RyZWFtLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlOworCisvKiogSW50ZXJmYWNlIHN0YXR1cywgdXNlZCBmb3IgaWZBZG1pblN0YXR1cyBhbmQgaWZPcGVyU3RhdHVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJGQUNFX1NUQVRVU19VUCAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB1cC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJGQUNFX1NUQVRVU19ET1dOICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkb3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkZBQ0VfU1RBVFVTX1RFU1RJTkcgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHRlc3RpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSRkFDRV9TVEFUVVNfVU5LTk9XTiAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgdW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJGQUNFX1NUQVRVU19ET1JNQU5UICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkb3JtYW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkZBQ0VfU1RBVFVTX05PVF9QUkVTRU5UICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IG5vdCBwcmVzZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkZBQ0VfU1RBVFVTX0xPV0VSX0xBWUVSX0RPV04gICAgICAgICAgPSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGxvd2VyIGxheWVyIGRvd24uICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzOworCisvKiogQ01DIE9BTSBpbnRlcmxlYXZlciBtb2RlcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkxFQVZFUl9JMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHsxMjgsMX0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCwyfS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7NjQsMn0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCwzfS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7MzIsNH0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0k1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCw0fS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7MTYsOH0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0k3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCw1fS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7OCwxNn0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0k5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCw2fS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTEwICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7NCwzMn0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCw3fS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7Miw2NH0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCw4fS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7MSwxMjh9LiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXI7CisKKy8qKiBDTUMgT0FNIExvYWQgQmFsYW5jaW5nIE1ldGhvZHMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZAoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19MT0FEX0JBTEFOQ0VfTUVUSE9EX1NUQVQgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJhc2VkIG9uIHN1bXMgb2YgTWluIEd1YXJhbnRlZWQgUmF0ZXMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfTE9BRF9CQUxBTkNFX01FVEhPRF9EWU5BTUlDICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCYXNlZCBvbiBjaGFubmVsIHV0aWxpemF0aW9uICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kOworCisvKiogQ01DIE9BTSBtb2R1bGF0aW9uIG1vZGVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfTU9EVUxBVElPTl9RQU02NCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBRQU02NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfTU9EVUxBVElPTl9RQU0yNTYgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBRQU0yNTYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX01PRFVMQVRJT05fUUFNMTAyNCAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUUFNMTAyNC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb247CisKKy8qKiBDTUMgT0FNIFVTIG1vZHVsYXRpb24gdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX1VTX01PRFVMQVRJT05fVFlQRV9VTktOT1dOICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfVVNfTU9EVUxBVElPTl9UWVBFX1RETUEgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBURE1BLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19VU19NT0RVTEFUSU9OX1RZUEVfQVRETUEgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFURE1BLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19VU19NT0RVTEFUSU9OX1RZUEVfU0NETUEgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNDRE1BLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19VU19NT0RVTEFUSU9OX1RZUEVfVERNQV9BVERNQSAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRETUEtQVRETUEuICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGU7CisKKy8qKiBDTUMgT0FNIFVTIHByb2ZpbGUgdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX1VTX1BST0ZJTEVfVFlQRV9GQUlSICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmFpci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfVVNfUFJPRklMRV9UWVBFX0dPT0QgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBHb29kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19VU19QUk9GSUxFX1RZUEVfQkVTVCAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJlc3QuICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGU7CisKKy8qKiBDTlUgQ29ubmVjdGl2aXR5IFN0YXRlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfT1RIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAvKio8IE90aGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfSU5JVElBTF9SQU5HSU5HICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAvKio8IEluaXRpYWwgUmFuZ2luZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1JBTkdJTkdfQVVUT19BREpfQ09NUExFVEUgICAgICAgPSA0LCAgICAgICAgICAgICAgICAgICAgLyoqPCBSYW5naW5nIEF1dG8gQWRqIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfREhDUF9WNENPTVBMRVRFICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgICAgICAgICAvKio8IERoY3AgVjQgQ29tcGxldGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9SRUdJU1RSQVRJT05fQ09NUExFVEUgICAgICAgICAgID0gNiwgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfT1BFUkFUSU9OQUwgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgICAgICAgICAvKio8IE9wZXJhdGlvbmFsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfQlBJX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgICAgICAgICAvKio8IEJwaSBJbml0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfU1RBUlRfRUFFICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgICAgICAgICAvKio8IFN0YXJ0IEVBRS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1NUQVJUX0RIQ1BfVjQgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgICAgICAgICAgLyoqPCBTdGFydCBEaGNwIFY0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfU1RBUlRfREhDUF9WNiAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgICAgICAgICAvKio8IFN0YXJ0IERoY3AgVjYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9ESENQX1Y2Q09NUExFVEUgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAgICAgICAgIC8qKjwgRGhjcCBWNiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1NUQVJUX0NPTkZJR19GSUxFX0RPV05MT0FEICAgICAgPSAxNCwgICAgICAgICAgICAgICAgICAgLyoqPCBTdGFydCBDb25maWcgRmlsZSBEb3dubG9hZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX0NPTkZJR19GSUxFX0RPV05MT0FEX0NPTVBMRVRFICAgPSAxNSwgICAgICAgICAgICAgICAgICAgLyoqPCBDb25maWcgRmlsZSBEb3dubG9hZCBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1NUQVJUX1JFR0lTVFJBVElPTiAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgICAgICAgICAgLyoqPCBTdGFydCBSZWdpc3RyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9GT1JXQVJESU5HX0RJU0FCTEVEICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAgICAgICAgIC8qKjwgRm9yd2FyZGluZyBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1JGX01VVEVfQUxMICAgICAgICAgICAgICAgICAgICAgPSAxOCAgICAgICAgICAgICAgICAgICAgLyoqPCBSZiBNdXRlIEFsbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZTsKKworLyoqIFZlcnNpb24gb2YgRE9DU0lTIHRoYXQgQ05VIGlzIG9wZXJhdGluZyBpbiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9ET0NTSVNfVkVSU0lPTl9ET0NTSVMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAvKio8IERvY3NpczEwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9ET0NTSVNfVkVSU0lPTl9ET0NTSVMxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAvKio8IERvY3NpczExLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9ET0NTSVNfVkVSU0lPTl9ET0NTSVMyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgICAgICAgICAvKio8IERvY3NpczIwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9ET0NTSVNfVkVSU0lPTl9ET0NTSVMzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICAgICAgICAvKio8IERvY3NpczMwLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb247CisKKy8qKiBDTlUgSVAgQWRkcmVzcyBUeXBlcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9JUEFERFJfVFlQRV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0lQQUREUl9UWVBFX0lQVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgIC8qKjwgSVB2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfSVBBRERSX1RZUEVfSVBWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAgICAgLyoqPCBJUHY2LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9JUEFERFJfVFlQRV9JUFY0WiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgICAgICAgICAvKio8IElQdjR6LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9JUEFERFJfVFlQRV9JUFY2WiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgICAgICAgICAvKio8IElQdjZ6LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9JUEFERFJfVFlQRV9ETlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2ICAgICAgICAgICAgICAgICAgICAvKio8IEROUy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlOworCisvKiogQ01DIE9BTSBQRFUgb3Bjb2RlcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgUmVxdWVzdCB0byBjb25maWd1cmUgZG93bnN0cmVhbSBjaGFubmVsKHMpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gY29uZmlndXJlIGRvd25zdHJlYW0gY2hhbm5lbChzKSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgY3VycmVudCBkb3duc3RyZWFtIGNoYW5uZWwocykgY29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIGN1cnJlbnQgZG93bnN0cmVhbSBjaGFubmVsKHMpIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfVVBTVFJFQU1fQ09ORklHX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGNvbmZpZ3VyZSB1cHN0cmVhbSBjaGFubmVsKHMpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gY29uZmlndXJlIHVwc3RyZWFtIGNoYW5uZWwocykgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQ09ORklHX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIGN1cnJlbnQgdXBzdHJlYW0gY2hhbm5lbChzKSBjb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgY3VycmVudCB1cHN0cmVhbSBjaGFubmVsKHMpIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGNvbmZpZ3VyZSBDTlUgd2l0aCBhIHBhcnRpY3VsYXIgcHJpbWFyeSBkb3duc3RyZWFtIGNoYW5uZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgLyoqPCBSZXNwb25zZSB0byBjb25maWd1cmUgQ05VIHdpdGggYSBwYXJ0aWN1bGFyIHByaW1hcnkgZG93bnN0cmVhbSBjaGFubmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBDTlXigJlzIGN1cnJlbnQgcHJpbWFyeSBkb3duc3RyZWFtIGNoYW5uZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBDTlXigJlzIGN1cnJlbnQgcHJpbWFyeSBkb3duc3RyZWFtIGNoYW5uZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGNvbmZpZ3VyZSBDTlUgd2l0aCBhIHBhcnRpY3VsYXIgcHJpbWFyeSB1cHN0cmVhbSBjaGFubmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gY29uZmlndXJlIENOVSB3aXRoIGEgcGFydGljdWxhciBwcmltYXJ5IHVwc3RyZWFtIGNoYW5uZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIENOVeKAmXMgY3VycmVudCBwcmltYXJ5IHVwc3RyZWFtIGNoYW5uZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBDTlXigJlzIGN1cnJlbnQgcHJpbWFyeSB1cHN0cmVhbSBjaGFubmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1QgICAgICAgICAgICAgID0gMTcsICAgICAgIC8qKjwgUmVxdWVzdCB0byBzZXQgbWF4aW11bSBSRiBhdHRlbnVhdGlvbiBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVNQT05TRSAgICAgICAgICAgICA9IDE4LCAgICAgICAvKio8IFJlc3BvbnNlIHRvIHNldCBtYXhpbXVtIFJGIGF0dGVudWF0aW9uIGxldmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1QgICAgICAgICAgICAgID0gMTksICAgICAgIC8qKjwgUmVxdWVzdCB0byBnZXQgbWF4aW11bSBSRiBhdHRlbnVhdGlvbiBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVNQT05TRSAgICAgICAgICAgICA9IDIwLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGdldCBtYXhpbXVtIFJGIGF0dGVudWF0aW9uIGxldmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0NSRUFURV9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUICAgICAgICAgICAgID0gMjEsICAgICAgIC8qKjwgUmVxdWVzdCBmb3IgY3JlYXRpbmcgYSBsb2FkIGJhbGFuY2luZyBncm91cCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9DUkVBVEVfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0UgICAgICAgICAgICA9IDIyLCAgICAgICAvKio8IFJlc3BvbnNlIGZvciBjcmVhdGluZyBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGdldCBhIGxpc3Qgb2YgbG9hZCBiYWxhbmNpbmcgZ3JvdXBzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQU19SRVNQT05TRSAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gZ2V0IGxvYWQgYmFsYW5jaW5nIGdyb3VwcyByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9ET1dOU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUID0gMjUsICAgICAgIC8qKjwgUmVxdWVzdCB0byBhZGQgZG93bnN0cmVhbXMgdG8gYSBsb2FkIGJhbGFuY2luZyBncm91cCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfRE9XTlNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U9IDI2LCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGFkZCBkb3duc3RyZWFtcyB0byBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfRE9XTlNUUkVBTVNfUkVRVUVTVCAgICAgICAgPSAyNywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGdldCBsaXN0IG9mIGRvd25zdHJlYW1zIGluIGEgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfRE9XTlNUUkVBTVNfUkVTUE9OU0UgICAgICAgPSAyOCwgICAgICAgLyoqPCBSZXNwb25zZSB0byBnZXQgbGlzdCBvZiBkb3duc3RyZWFtcyBpbiBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX1VQU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUICAgPSAyOSwgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGFkZCB1cHN0cmVhbXMgdG8gYSBsb2FkIGJhbGFuY2luZyBncm91cCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfVVBTVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFICA9IDMwLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGFkZCB1cHN0cmVhbXMgdG8gYSBsb2FkIGJhbGFuY2luZyBncm91cCByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX1VQU1RSRUFNU19SRVFVRVNUICAgICAgICAgID0gMzEsICAgICAgIC8qKjwgUmVxdWVzdCB0byBnZXQgbGlzdCBvZiB1cHN0cmVhbXMgaW4gYSBsb2FkIGJhbGFuY2luZyBncm91cCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9VUFNUUkVBTVNfUkVTUE9OU0UgICAgICAgICA9IDMyLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGdldCBsaXN0IG9mIHVwc3RyZWFtcyBpbiBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVCAgICAgICAgPSAzMywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGFkZCBDTlVzIHRvIGEgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0UgICAgICAgPSAzNCwgICAgICAgLyoqPCBSZXNwb25zZSB0byBhZGQgQ05VcyB0byBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQ05VX0NPTkZJR1VSQVRJT05fUkVRVUVTVCAgPSAzNSwgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGdldCBsb2FkIGJhbGFuY2luZyBncm91cCBDTlUgY29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9DTlVfQ09ORklHVVJBVElPTl9SRVNQT05TRSA9IDM2LCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGdldCBsb2FkIGJhbGFuY2luZyBncm91cCBDTlUgY29uZmlndXJhdGlvbiByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0FDVElWRV9DTlVTX1JFUVVFU1QgICAgICAgID0gMzcsICAgICAgIC8qKjwgUmVxdWVzdCB0byBnZXQgdGhlIGFjdGl2ZSBsaXN0IG9mIENOVXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVTUE9OU0UgICAgICAgPSAzOCwgICAgICAgLyoqPCBSZXNwb25zZSB0byB0aGUgZ2V0IGFjdGl2ZSBsaXN0IG9mIENOVXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRVhDTFVERV9DTlVTX0ZST01fTE9BRF9CQUxBTkNJTkdfUkVRVUVTVCAgICAgICAgPSAzOSwgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGV4Y2x1ZGUgQ05VcyBmcm9tIGxvYWQgYmFsYW5jaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFU1BPTlNFICAgICAgID0gNDAsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gZXhjbHVkZSBDTlVzIGZyb20gbG9hZCBiYWxhbmNpbmcgcmVxdWVzdCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVTX0NPTkZJR1VSQVRJT05fUkVRVUVTVCAgICAgICAgICAgICA9IDQxLCAgICAgICAvKio8IFJlcXVlc3QgdG8gZ2V0IGV4Y2x1ZGVkIENOVXMgZnJvbSBsb2FkIGJhbGFuY2luZyBjb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFICAgICAgICAgICAgID0gNDIsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gZ2V0IGV4Y2x1ZGVkIENOVXMgZnJvbSBsb2FkIGJhbGFuY2luZyBjb25maWd1cmF0aW9uIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQUNUSVZFX0NOVVNfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgPSA0MywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGdldCB0aGUgYWN0aXZlIGV4Y2x1ZGVkIENOVXMgZnJvbSBsb2FkIGJhbGFuY2luZyBsaXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgID0gNDQsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gZ2V0IGFjdGl2ZSBleGNsdWRlZCBDTlVzIGZyb20gbG9hZCBiYWxhbmNpbmcgcmVxdWVzdCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1QgICAgICAgICAgICAgICA9IDQ1LCAgICAgICAvKio8IFJlcXVlc3QgdG8gY29uZmlndXJlIHRoZSBzcGVjaWZpZWQgTG9hZCBCYWxhbmNpbmcgZ3JvdXBzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0UgICAgICAgICAgICAgID0gNDYsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gY29uZmlndXJhdGlvbiByZXF1ZXN0IGZvciBMb2FkIEJhbGFuY2luZyBncm91cHMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUICAgICAgICAgICAgICAgPSA0NywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIGRldGFpbGVkIGFjdGl2ZSBMb2FkIEJhbGFuY2luZyBHcm91cHMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRSAgICAgICAgICAgICAgPSA0OCwgICAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBkZXRhaWxlZCBhY3RpdmUgTG9hZCBCYWxhbmNpbmcgR3JvdXBzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgID0gNDksICAgICAgIC8qKjwgUmVxdWVzdCB0byBjb25maWd1cmUgdXBzdHJlYW0gY2hhbm5lbCBpbnB1dCBwb3dlciBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRSAgICAgICAgICAgICAgICAgICA9IDUwLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGNvbmZpZ3VyZSB1cHN0cmVhbSBjaGFubmVsIGlucHV0IHBvd2VyIGxldmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgID0gNTEsICAgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSB1cHN0cmVhbSBpbnB1dCBwb3dlciBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRSAgICAgICAgICAgICAgICAgICA9IDUyLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIHVwc3RyZWFtIGlucHV0IHBvd2VyIGxldmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NOVV9TVEFUVVNfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5MywgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBDTlUgc3RhdHVzIGluZm9ybWF0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NOVV9TVEFUVVNfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NCwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgQ05VIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OTUsICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgQ01DIGludGVyZmFjZSBhdHRyaWJ1dGVzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NiwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgQ01DIGludGVyZmFjZSBhdHRyaWJ1dGVzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19NQUNfU1RBVElTVElDU19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgID0gMTc5NywgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBDTUMgTUFDIHN0YXRpc3RpY3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgPSAxNzk4LCAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBDTUMgTUFDIHN0YXRpc3RpY3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0VSVklDRVNfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzk5LCAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIFVwc3RyZWFtIHNlcnZpY2UgYXR0cmlidXRlcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TRVJWSUNFU19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4MDAsICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIFVwc3RyZWFtIHNlcnZpY2UgYXR0cmlidXRlcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TSUdOQUxfUVVBTElUWV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4MDEsICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgVXBzdHJlYW0gUEhZIFNpZ25hbCBRdWFsaXR5IGRhdGEgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODAyLCAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBVcHN0cmVhbSBQSFkgU2lnbmFsIFF1YWxpdHkgZGF0YSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19TVEFUSVNUSUNTX1JFUVVFU1QgICAgICAgICAgICAgICA9IDE4MDMsICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgQ01DIGludGVyZmFjZSBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1NUQVRJU1RJQ1NfUkVTUE9OU0UgICAgICAgICAgICAgID0gMTgwNCwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgQ01DIGludGVyZmFjZSBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVRVUVTVCAgICAgICAgID0gMTgwNSwgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBEb3duc3RyZWFtIEJvbmRpbmcgR3JvdXAgc3RhdHVzIGluZm9ybWF0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0UgICAgICAgID0gMTgwNiwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgRG93bnN0cmVhbSBCb25kaW5nIEdyb3VwIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVFVRVNUICAgICAgICAgICA9IDE4MDcsICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgVXBzdHJlYW0gQm9uZGluZyBHcm91cCBzdGF0dXMgaW5mb3JtYXRpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0UgICAgICAgICAgPSAxODA4LCAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBVcHN0cmVhbSBCb25kaW5nIEdyb3VwIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX0NPTkZJR19SRVFVRVNUICAgICAgICAgICAgICAgICA9IDE4MDksICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgZGF0YSBmb3IgY29uZmlndXJlZCBRb1Mgc2VydmljZSBmbG93cyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX0NPTkZJR19SRVNQT05TRSAgICAgICAgICAgICAgICA9IDE4MTAsICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIGRhdGEgZm9yIGNvbmZpZ3VyZWQgUW9TIHNlcnZpY2UgZmxvd3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19TVEFUSVNUSUNTX1JFUVVFU1QgICAgICAgICAgICAgPSAxODExLCAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIHNlcnZpY2UgZmxvdyBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVNQT05TRSAgICAgICAgICAgID0gMTgxMiwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgc2VydmljZSBmbG93IHN0YXRpc3RpY3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVFVRVNUICAgICAgICAgICAgPSAxODEzLCAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIGRhdGEgZm9yIHBhY2tldCBjbGFzc2lmaWNhdGlvbiBydWxlcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfUEFDS0VUX0NMQVNTSUZJRVJfQ09ORklHX1JFU1BPTlNFICAgICAgICAgICA9IDE4MTQsICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIGRhdGEgZm9yIHBhY2tldCBjbGFzc2lmaWNhdGlvbiBydWxlcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1JFR19SU1BfRVZFTlRfTUVTU0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQwOTYsICAgICAvKio8IEF1dG9ub21vdXMgZXZlbnQgdG8gcmVwb3J0IGEgUkVHLVJTUCBhc3NvY2lhdGVkIHdpdGggYSBDTlUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9DTUNfU1lTVEVNX0VWRU5UX01FU1NBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDk3ICAgICAgLyoqPCBBdXRvbm9tb3VzIGV2ZW50IHRvIHJlcG9ydCBhIENNQyBTeXN0ZW0gbWVzc2FnZSAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZTsKKworLyoqIENsb2NrIFRyYW5zcG9ydCBLZXkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ0xPQ0tfVFJBTlNQT1JUX0tFWV9BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBBbGwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NMT0NLX1RSQU5TUE9SVF9LRVlfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgSW5pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ0xPQ0tfVFJBTlNQT1JUX0tFWV9UT0RfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBUT0QgRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DTE9DS19UUkFOU1BPUlRfS0VZX1BQU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IDFQUFMgRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DTE9DS19UUkFOU1BPUlRfS0VZX0FESlVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IEFkanVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ0xPQ0tfVFJBTlNQT1JUX0tFWV9QT05fUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCBQT04gUmFuZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NMT0NLX1RSQU5TUE9SVF9LRVlfRkFLRV9NUENQX0pVTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgIC8qKjwgRmFrZSBNUENQIEp1bXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NMT0NLX1RSQU5TUE9SVF9LRVlfSEFMRl9QRVJJT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNyAgICAgICAgIC8qKjwgSGFsZiBQZXJpb2QuICovCit9IGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5OworCisvKiogVmFyIExlYWYgQWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBNQUMgSW5pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19BRERfR1JPVVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBNQUMgQWRkIEdyb3VwIEFkZHJlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfREVMX0dST1VQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgIC8qKjwgTUFDIERlbCBHcm91cCBBZGRyZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX1NFTEZfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IE1BQyBTZWxmIFRlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9QSFlfQURNSU5fQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgIC8qKjwgUEhZIEFkbWluIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgIC8qKjwgUmVwb3J0IFJlc2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX0lOX1NFUlZJQ0VfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAvKio8IFJlcG9ydCBJbiBTZXJ2aWNlIFRlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9QT1JUX0FETUlOX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgIC8qKjwgUG9ydCBBZG1pbiBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAvKio8IE1BVSBSZXNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9BRE1JTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgLyoqPCBNQVUgQWRtaW4gQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fUkVORUdPVElBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgLyoqPCBBdXRvIFJlbmVnb3RpYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19BRE1JTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyICAgICAgICAvKio8IEF1dG8gQWRtaW4gQ29udHJvbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbjsKKworLyoqIENUQyBFbmFibGVkIFN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRU5BQkxFRF9TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IERpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRU5BQkxFRF9TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAvKio8IEVuYWJsZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZTsKKworLyoqIENUQyBBY3RpdmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQUNUSVZBVElPTl9ERUFDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IERlYWN0aXZhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19BQ1RJVkFUSU9OX0FDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgIC8qKjwgQWN0aXZhdGUuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbjsKKworLyoqIENUQyBMZWFmIE1hbmFnZW1lbnQgT2JqZWN0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgQ2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBMTElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT05fSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IFBPTiBJL0YuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU1MzVVICAgIC8qKjwgT05VLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3Q7CisKKy8qKiBDVEMgT05VIEFsYXJtIElEIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfRVFVSVBNRU5UX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBPTlUgRXF1aXBtZW50IEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPV0VSX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgT05VIFBvd2VyIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfTUlTU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgIC8qKjwgT05VIEJhdHRlcnkgTWlzc2luZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IE9OVSBCYXR0ZXJ5IEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9WT0xUX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCBPTlUgQmF0dGVyeSBWb2x0IExvdyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9QSFlTSUNBTF9JTlNUUlVDVElPTl9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAvKio8IE9udSBQaHlzaWNhbCBJbnN0cnVjdGlvbiBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TRUxGX1RFU1RfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAvKio8IE9udSBTZWxmIFRlc3QgRmFpbHVyZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0hJR0hfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAvKio8IE9udSBUZW1wIEhpZ2ggQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfVEVNUF9MT1dfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgLyoqPCBPbnUgVGVtcCBMb3cgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfSUFEX0NPTk5FQ1RJT05fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgLyoqPCBPbnUgSWFkIENvbm5lY3Rpb24gRmFpbHVyZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9QT05fSUZfU1dJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAvKio8IE9udSBQb24gSWYgU3dpdGNoICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1NMRUVQX1NUQVRVU19VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgIC8qKjwgT251IFNsZWVwIFN0YXR1cyBVcGRhdGUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfSElHSF9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTcsICAgICAgLyoqPCBQb24gSWYgUnggUG93ZXIgSGlnaCBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9MT1dfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1OCwgICAgICAvKio8IFBvbiBJZiBSeCBQb3dlciBMb3cgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTksICAgICAgLyoqPCBQb24gSWYgVHggUG93ZXIgSGlnaCBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9MT1dfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MCwgICAgICAvKio8IFBvbiBJZiBUeCBQb3dlciBMb3cgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19ISUdIX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjEsICAgICAgLyoqPCBQb24gSWYgVHggQmlhcyBIaWdoIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfTE9XX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYyLCAgICAgIC8qKjwgUG9uIElmIFR4IEJpYXMgTG93IEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19ISUdIX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYzLCAgICAgIC8qKjwgUG9uIElmIFZjYyBIaWdoIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19MT1dfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY0LCAgICAgIC8qKjwgUG9uIElmIFZjYyBMb3cgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjUsICAgICAgLyoqPCBQb24gSWYgVGVtcCBIaWdoIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY2LCAgICAgIC8qKjwgUG9uIElmIFRlbXAgTG93IEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY3LCAgICAgIC8qKjwgUG9uIElmIFJ4IFBvd2VyIEhpZ2ggV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9MT1dfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2OCwgICAgICAvKio8IFBvbiBJZiBSeCBQb3dlciBMb3cgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2OSwgICAgICAvKio8IFBvbiBJZiBUeCBQb3dlciBIaWdoIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfTE9XX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzAsICAgICAgLyoqPCBQb24gSWYgVHggUG93ZXIgTG93IFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19ISUdIX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzEsICAgICAgLyoqPCBQb24gSWYgVHggQmlhcyBIaWdoIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19MT1dfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzIsICAgICAgLyoqPCBQb24gSWYgVHggQmlhcyBMb3cgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3MywgICAgICAvKio8IFBvbiBJZiBWY2MgSGlnaCBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19MT1dfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjc0LCAgICAgIC8qKjwgUG9uIElmIFZjYyBMb3cgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0hJR0hfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3NSwgICAgICAvKio8IFBvbiBJZiBUZW1wIEhpZ2ggV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0xPV19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3NiwgICAgICAvKio8IFBvbiBJZiBUZW1wIExvdyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk0gICAgICAgICAgICAgICAgICAgID0gMjc3LCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gRHJvcCBFdmVudHMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgPSAyNzgsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gRHJvcCBFdmVudHMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgPSAyNzksICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBDUkMgRXJyb3IgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk0gICAgICAgICAgICAgICAgID0gMjgwLCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIENSQyBFcnJvciBGcmFtZXMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgPSAyODEsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBVbmRlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk0gICAgICAgICAgICAgICAgID0gMjgyLCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIFVuZGVyc2l6ZSBGcmFtZXMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk0gICAgICAgICAgICAgICAgPSAyODMsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBPdmVyc2l6ZSBGcmFtZXMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgICAgPSAyODQsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gT3ZlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRlJBR01FTlRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgID0gMjg1LCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gRnJhZ21lbnRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0ZSQUdNRU5UU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgID0gMjg2LCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIEZyYWdtZW50cyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0pBQkJFUlNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICA9IDI4NywgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIEphYmJlcnMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODgsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gSmFiYmVycyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICA9IDI4OSwgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIERpc2NhcmRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgID0gMjkwLCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIERpc2NhcmRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgID0gMjkxLCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gRXJyb3JzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0VSUk9TX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjkyLCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIEVycm9zIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVSTlRTX1dBUk5JTkcgICAgICAgICAgICAgICAgID0gMjkzLCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gRHJvcCBFdmVybnRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgPSAyOTQsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gRHJvcCBFdmVudHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORyAgICAgICAgICAgICA9IDI5NSwgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIENSQyBFcnJvciBGcmFtZXMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgICA9IDI5NiwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBDUkMgRXJyb3IgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgPSAyOTcsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBVbmRlcnNpemUgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgPSAyOTgsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gVW5kZXJzaXplIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgID0gMjk5LCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gT3ZlcnNpemUgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgICAgPSAzMDAsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gT3ZlcnNpemUgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgPSAzMDEsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBGcmFnbWVudHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICA9IDMwMiwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBGcmFnbWVudHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0pBQkJFUlNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICA9IDMwMywgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIEphYmJlcnMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9KQUJCRVJTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICA9IDMwNCwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBKYWJiZXJzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgPSAzMDUsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBEaXNjYXJkcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgID0gMzA2LCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIERpc2NhcmRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgPSAzMDcsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBFcnJvcnMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9FUlJPU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwOCwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBFcnJvcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfQ0FSRF9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTEzLCAgICAgIC8qKjwgQ2FyZCBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0NBUkRfU0VMRl9URVNUX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxNCwgICAgICAvKio8IENhcmQgU2VsZiBUZXN0IEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9BVVRPX05FR19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjksICAgICAgLyoqPCBFdGggUG9ydCBBdXRvIE5lZyBGYWlsdXJlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzcwLCAgICAgIC8qKjwgRXRoIFBvcnQgTG9zICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzcxLCAgICAgIC8qKjwgRXRoIFBvcnQgRmFpbHVyZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3MiwgICAgICAvKio8IEV0aCBQb3J0IExvb3BiYWNrICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfQ09OR0VTVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzczLCAgICAgIC8qKjwgRXRoIFBvcnQgQ29uZ2VzdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICA9IDc3NCwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBEcm9wIEV2ZW50cyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICA9IDc3NSwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gRHJvcCBFdmVudHMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgICAgPSA3NzYsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gQ1JDIEVycm9yIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgICAgICA9IDc3NywgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gQ1JDIEVycm9yIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgICA9IDc3OCwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBVbmRlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgICAgID0gNzc5LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBVbmRlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgICAgID0gNzgwLCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIE92ZXJzaXplIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgICAgICA9IDc4MSwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gT3ZlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0ZSQUdNRU5UU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgID0gNzgyLCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIEZyYWdtZW50cyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4MywgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gRnJhZ21lbnRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0pBQkJFUlNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgID0gNzg0LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIEphYmJlcnMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODUsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIEphYmJlcnMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRElTQ0FSRFNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODYsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gRGlzY2FyZHMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODcsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIERpc2NhcmRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0VSUk9SU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzg4LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIEVycm9ycyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4OSwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gRXJyb3JzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgID0gNzkwLCAgICAgIC8qKjwgUG9ydCBTdGF0dXMgQ2hhbmdlIFRpbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgID0gNzkxLCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIERyb3AgRXZlbnRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RST1BfRVZFTlRTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgPSA3OTIsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIERyb3AgRXZlbnRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgPSA3OTMsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gQ1JDIEVycm9yIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgICAgID0gNzk0LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBDUkMgRXJyb3IgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgPSA3OTUsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gVW5kZXJzaXplIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgICAgID0gNzk2LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBVbmRlcnNpemUgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgICAgPSA3OTcsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gT3ZlcnNpemUgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgICAgPSA3OTgsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIE92ZXJzaXplIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0ZSQUdNRU5UU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgID0gNzk5LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIEZyYWdtZW50cyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgID0gODAwLCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBGcmFnbWVudHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICA9IDgwMSwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBKYWJiZXJzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0pBQkJFUlNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MDIsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIEphYmJlcnMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICA9IDgwMywgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBEaXNjYXJkcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgID0gODA0LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBEaXNjYXJkcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgID0gODA1LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIEVycm9ycyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9FUlJPUlNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODA2LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBFcnJvcnMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfU1RBVFVTX0NIQU5HRV9USU1FU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICA9IDgwNywgICAgICAvKio8IFBvcnQgU3RhdHVzIENoYW5nZSBUaW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9UU19QT1JUX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAyNSwgICAgIC8qKjwgUCBPIFQgUyBQb3J0IEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FMVBPUlRfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgxLCAgICAgLyoqPCBFMSBQb3J0IEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FMVRJTUlOR19VTkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgyLCAgICAgLyoqPCBFMSBUaW1pbmcgVW5sb2NrICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFMT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MyAgICAgIC8qKjwgRTEgTG9zICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkOworCisvKiogQ1RDIE9OVSBQb3dlciBBbGFybSBDb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3dlcl9hbGFybV9jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1dFUl9BTEFSTV9DT0RFX05FVkVSX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgTmV2ZXIgbWF0Y2ggKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1BPV0VSX0FMQVJNX0NPREVfUE9XRVJfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBQb3dlciBkb3duICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1dFUl9BTEFSTV9DT0RFX1BPV0VSX1ZPTFRfT1ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgUG93ZXIgVm9sdGFnZSBPdmVyICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1dFUl9BTEFSTV9DT0RFX1BPV0VSX1ZPTFRfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgIC8qKjwgUG93ZXIgVm9sdGFnZSBMZXNzICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZTsKKworLyoqIENUQyBQT04gSUYgU3dpdGNoIENvZGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9OX0lGX1NXSVRDSF9DT0RFX05FVkVSX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IE5ldmVyIG1hdGNoICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT05fSUZfU1dJVENIX0NPREVfU0lHTkFMX0xPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgU2lnbmFsIExvcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9OX0lGX1NXSVRDSF9DT0RFX1NJR05BTF9ERUdSQURFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFNpZ25hbCBEZWdyYWRlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT05fSUZfU1dJVENIX0NPREVfSEFSRFdBUkVfRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgIC8qKjwgSGFyZHdhcmUgRmF1bHQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGU7CisKKy8qKiBWYXIgTGVhZiBBdHRyaWJ1dGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IE1BQyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfVFhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBNQUMgRnJhbWVzIFR4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IE1BQyBTaW5nbGUgQ29sbCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgIC8qKjwgTUFDIE11bHRpcGxlIENvbGwgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19SWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAvKio8IE1BQyBGcmFtZXMgUnggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRkNTX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgIC8qKjwgTUFDIEZDUyBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgIC8qKjwgTUFDIEFsaWduIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfVFhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgLyoqPCBNQUMgT2N0ZXRzIFR4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAvKio8IE1BQyBGcmFtZXMgRGVmZXJyZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTEFURV9DT0xMSVNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgIC8qKjwgTUFDIExhdGUgQ29sbGlzaW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgLyoqPCBNQUMgRXhjZXNzaXZlIENvbGxpc2lvbnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgIC8qKjwgTUFDIEZyYW1lcyBMb3N0IE1BQyBUeCBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FSUklFUl9TRU5TRV9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgIC8qKjwgTUFDIENhcnJpZXIgU2Vuc2UgRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19SWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAvKio8IE1BQyBPY3RldHMgUnggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgIC8qKjwgTUFDIEZyYW1lcyBMb3N0IE1BQyBSeCBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgIC8qKjwgTUFDIFByb21pc2N1b3VzIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9BRERSX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgLyoqPCBNQUMgTWNhc3QgQWRkciBMaXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19UWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAvKio8IE1BQyBNY2FzdCBGcmFtZXMgVHggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1RYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgIC8qKjwgTUFDIEJjYXN0IEZyYW1lcyBUeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgLyoqPCBNQUMgRnIgRXhjZXNzaXZlIERlZmVycmFsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19SWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAvKio8IE1BQyBNY2FzdCBGcmFtZXMgUnggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1JYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgIC8qKjwgTUFDIEJjYXN0IEZyYW1lcyBSeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JTl9SQU5HRV9MRU5fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgLyoqPCBNQUMgSW4gUmFuZ2UgTGVuIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgLyoqPCBNQUMgT3V0IE9mIFJhbmdlIExlbiBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVfVE9PX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgIC8qKjwgTUFDIEZyYW1lIFRvbyBMb25nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VOQUJMRV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAvKio8IE1BQyBFbmFibGUgU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1RYX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAvKio8IE1BQyBUeCBFbmFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfUlhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgICAgIC8qKjwgTUFDIE1jYXN0IFJ4IFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgLyoqPCBNQUMgQWRkci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DT0xMSVNJT05fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAgICAgLyoqPCBNQUMgQ29sbGlzaW9uIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAgICAgLyoqPCBQSFkgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgIC8qKjwgUEhZIFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgICAgIC8qKjwgUEhZIFR5cGUgTGlzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TUUVfVEVTVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNCwgICAgICAgLyoqPCBQSFkgU1FFIFRlc3QgRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVIgICAgICAgICAgICAgICAgICAgICAgICA9IDM1LCAgICAgICAvKio8IFBIWSBTeW1ib2wgRXJyIER1cmluZyBDYXJyaWVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX01JSV9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAvKio8IFBIWSBNSUkgRGV0ZWN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3LCAgICAgICAvKio8IFBIWSBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAgICAgLyoqPCBSZXBvcnQgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzksICAgICAgIC8qKjwgUmVwb3J0IFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfQ0FQQUNJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAsICAgICAgIC8qKjwgUmVwb3J0IEdyb3VwIENhcGFjaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxLCAgICAgICAvKio8IFJlcG9ydCBHcm91cCBNYXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDIsICAgICAgIC8qKjwgUmVwb3J0IEhlYWx0aCBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MywgICAgICAgLyoqPCBSZXBvcnQgSGVhbHRoIFRleHQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDQsICAgICAgIC8qKjwgUmVwb3J0IEhlYWx0aCBEYXRhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RYX0NPTExJU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1LCAgICAgICAvKio8IFJlcG9ydCBUeCBDb2xsaXNpb25zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2LCAgICAgICAvKio8IEdyb3VwIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9DQVBBQ0lUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3LCAgICAgICAvKio8IEdyb3VwIFBvcnQgQ2FwYWNpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDgsICAgICAgIC8qKjwgR3JvdXAgUG9ydCBNYXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDksICAgICAgIC8qKjwgUG9ydCBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQURNSU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MCwgICAgICAgLyoqPCBQb3J0IEFkbWluIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxLCAgICAgICAvKio8IFBvcnQgQXV0byBQYXJ0IFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyLCAgICAgICAvKio8IFBvcnQgUmVhZGFibGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9PQ1RFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzLCAgICAgICAvKio8IFBvcnQgUmVhZGFibGUgT2N0ZXRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GQ1NfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0LCAgICAgICAvKio8IFBvcnQgRkNTIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQUxJR05fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NSwgICAgICAgLyoqPCBQb3J0IEFsaWduIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NiwgICAgICAgLyoqPCBQb3J0IEZyYW1lcyBUb28gTG9uZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU0hPUlRfRVZFTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NywgICAgICAgLyoqPCBQb3J0IFNob3J0IEV2ZW50cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OCwgICAgICAgLyoqPCBQb3J0IFJ1bnRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5LCAgICAgICAvKio8IFBvcnQgQ29sbGlzaW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFURV9FVkVOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MCwgICAgICAgLyoqPCBQb3J0IExhdGUgRXZlbnRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9WRVJZX0xPTkdfRVZFTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYxLCAgICAgICAvKio8IFBvcnQgVmVyeSBMb25nIEV2ZW50cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfREFUQV9SQVRFX01JU01BVENIRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MiwgICAgICAgLyoqPCBQb3J0IERhdGEgUmF0ZSBNaXNtYXRjaGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRJVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYzLCAgICAgICAvKio8IFBvcnQgQXV0byBQYXJ0aXRpb25zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JU09MQVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY0LCAgICAgICAvKio8IFBvcnQgSXNvbGF0ZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NZTV9FUlJfRFVSSU5HX1BLVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjUsICAgICAgIC8qKjwgUG9ydCBTeW0gRXJyIER1cmluZyBQa3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYsICAgICAgIC8qKjwgUG9ydCBMYXN0IFNvdXJjZSBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TT1VSQ0VfQUREUl9DSEFOR0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY3LCAgICAgICAvKio8IFBvcnQgU291cmNlIEFkZHIgQ2hhbmdlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQlVSU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDAsICAgICAgLyoqPCBQb3J0IEJ1cnN0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OCwgICAgICAgLyoqPCBNQVUgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjksICAgICAgIC8qKjwgTUFVIFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRV9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAsICAgICAgIC8qKjwgTUFVIFR5cGUgTGlzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9NRURJQV9BVkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MSwgICAgICAgLyoqPCBNQVUgTWVkaWEgQXZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTE9TRV9NRURJQV9DVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzIsICAgICAgIC8qKjwgTUFVIExvc2UgTWVkaWEgQ3RyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczLCAgICAgICAvKio8IE1BVSBKYWJiZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQsICAgICAgIC8qKjwgTUFVIEFkbWluIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc1LCAgICAgICAvKio8IE1BVSBCYW5kIFNwbGl0IFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzYsICAgICAgIC8qKjwgTUFVIEJhbmQgU3BsaXQgRnJlcS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NywgICAgICAgLyoqPCBNQVUgRmFsc2UgQ2FycmllcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzgsICAgICAgIC8qKjwgQXV0byBOZWcgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRE1JTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzksICAgICAgIC8qKjwgQXV0byBOZWcgQWRtaW4gU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SRU1PVEVfU0lHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODAsICAgICAgIC8qKjwgQXV0byBOZWcgUmVtb3RlIFNpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MSwgICAgICAgLyoqPCBBdXRvIE5lZyBBdXRvIENmZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1RFQ0hfQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MiwgICAgICAgLyoqPCBBdXRvIE5lZyBMb2NhbCBUZWNoIEFiaWxpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRFZFUlRJU0VEX1RFQ0hfQUJJTElUWSAgICAgICAgICAgICAgICAgICAgID0gODMsICAgICAgIC8qKjwgQXV0byBOZWcgQWR2ZXJ0aXNlZCBUZWNoIEFiaWxpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9URUNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODQsICAgICAgIC8qKjwgQXV0byBOZWcgUnggVGVjaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NSwgICAgICAgLyoqPCBBdXRvIE5lZyBMb2NhbCBTZWxlY3QgQWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NiwgICAgICAgLyoqPCBBdXRvIE5lZyBBZCBTZWxlY3QgQWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NywgICAgICAgLyoqPCBBdXRvIE5lZyBSeCBTZWxlY3QgQWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVBBQklMSVRJRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4OSwgICAgICAgLyoqPCBNQUMgQ2FwYWJpbGl0aWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0RVUExFWF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkwLCAgICAgICAvKio8IE1BQyBEdXBsZXggU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lETEVfRVJST1JfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkxLCAgICAgICAvKio8IE1BVSBJZGxlIEVycm9yIENvdW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkyLCAgICAgICAvKio8IE1BQyBDdHJsIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkzLCAgICAgICAvKio8IE1BQyBDdHJsIEZ1bmNzIFN1cHBvcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NCwgICAgICAgLyoqPCBNQUMgQ3RybCBGcmFtZXMgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTUsICAgICAgIC8qKjwgTUFDIEN0cmwgRnJhbWVzIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlggICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk2LCAgICAgICAvKio8IE1BQyBDdHJsIFVuc3VwcG9ydGVkIE9wIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfREVMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk3LCAgICAgICAvKio8IE1BQyBDdHJsIFBhdXNlIERlbGF5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk4LCAgICAgICAvKio8IE1BQyBDdHJsIFBhdXNlIFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk5LCAgICAgICAvKio8IE1BQyBDdHJsIFBhdXNlIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMSwgICAgICAvKio8IEFnZyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19ERVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDIsICAgICAgLyoqPCBBZ2cgRGVzYy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDMsICAgICAgLyoqPCBBZ2cgTmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDQsICAgICAgLyoqPCBBZ2cgQWN0b3IgU3lzIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19QUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNSwgICAgICAvKio8IEFnZyBBY3RvciBTeXMgUHJpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNiwgICAgICAvKio8IEFnZyBBZ2cgT3IgSW5kaXZpZHVhbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9BRE1JTl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDcsICAgICAgLyoqPCBBZ2cgQWN0b3IgQWRtaW4gS2V5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX09QRVJfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwOCwgICAgICAvKio8IEFnZyBBY3RvciBPcGVyIEtleS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDksICAgICAgLyoqPCBBZ2cgTUFDIEFkZHIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEwLCAgICAgIC8qKjwgQWdnIFBhcnRuZXIgU3lzIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX1BSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMSwgICAgICAvKio8IEFnZyBQYXJ0bmVyIFN5cyBQcmkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9PUEVSX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEyLCAgICAgIC8qKjwgQWdnIFBhcnRuZXIgT3BlciBLZXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQURNSU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEzLCAgICAgIC8qKjwgQWdnIEFkbWluIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX09QRVJfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNCwgICAgICAvKio8IEFnZyBPcGVyIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RJTUVfT0ZfTEFTVF9PUEVSX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNSwgICAgICAvKio8IEFnZyBUaW1lIE9mIExhc3QgT3BlciBDaGFuZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE2LCAgICAgIC8qKjwgQWdnIERhdGEgUmF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9PQ1RFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTcsICAgICAgLyoqPCBBZ2cgVHggT2N0ZXRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExOCwgICAgICAvKio8IEFnZyBSeCBPY3RldHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE5LCAgICAgIC8qKjwgQWdnIEZyYW1lcyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjAsICAgICAgLyoqPCBBZ2cgRnJhbWVzIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyMSwgICAgICAvKio8IEFnZyBNY2FzdCBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjIsICAgICAgLyoqPCBBZ2cgTWNhc3QgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIzLCAgICAgIC8qKjwgQWdnIEJjYXN0IFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyNCwgICAgICAvKio8IEFnZyBCY2FzdCBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjUsICAgICAgLyoqPCBBZ2cgVHggRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjYsICAgICAgLyoqPCBBZ2cgUnggRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjcsICAgICAgLyoqPCBBZ2cgVHggRXJyIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9FUlJfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgsICAgICAgLyoqPCBBZ2cgUnggRXJyIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19VTktfUFJPVE9DT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAgICAgLyoqPCBBZ2cgVW5rIFByb3RvY29sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0xJTktfVVBfRE9XTl9OT1RJRllfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAvKio8IEFnZyBMaW5rIFVwIERvd24gTm90aWZ5IEVuLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BPUlRfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgICAgICAvKio8IEFnZyBQb3J0IExpc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQ09MTEVDVE9SX01BWF9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMyLCAgICAgIC8qKjwgQWdnIENvbGxlY3RvciBNYXggRGVsYXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAwLCAgICAgIC8qKjwgT0FNIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwMSwgICAgICAvKio8IE9BTSBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDIsICAgICAgLyoqPCBPQU0gTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDMsICAgICAgLyoqPCBPQU0gUmVtb3RlIE1BQyBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNCwgICAgICAvKio8IE9BTSBSZW1vdGUgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9QRFVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNSwgICAgICAvKio8IE9BTSBSZW1vdGUgUERVIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9GTEFHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDYsICAgICAgLyoqPCBPQU0gTG9jYWwgRmxhZ3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0ZMQUdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA3LCAgICAgIC8qKjwgT0FNIFJlbW90ZSBGbGFncy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDgsICAgICAgLyoqPCBPQU0gUmVtb3RlIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwOSwgICAgICAvKio8IE9BTSBSZW1vdGUgVmVuZG9yIE9VSS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTAsICAgICAgLyoqPCBPQU0gUmVtb3RlIFZlbmRvciBEZXZpY2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjExLCAgICAgIC8qKjwgT0FNIFJlbW90ZSBWZW5kb3IgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTIsICAgICAgLyoqPCBPQU0gUERVIFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxMywgICAgICAvKio8IE9BTSBQRFUgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE0LCAgICAgIC8qKjwgT0FNIFVuc3VwcG9ydGVkIE9wY29kZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE1LCAgICAgIC8qKjwgT0FNIEluZm8gVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE2LCAgICAgIC8qKjwgT0FNIEluZm8gUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE3LCAgICAgIC8qKjwgT0FNIEV2ZW50IFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOSVFVRV9FVkVOVF9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxOCwgICAgICAvKio8IE9BTSBVbmlxdWUgRXZlbnQgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRFVQX0VWRU5UX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE5LCAgICAgIC8qKjwgT0FNIER1cCBFdmVudCBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjAsICAgICAgLyoqPCBPQU0gTG9vcCBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjEsICAgICAgLyoqPCBPQU0gTG9vcCBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjIsICAgICAgLyoqPCBPQU0gVmFyIFJlcSBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjMsICAgICAgLyoqPCBPQU0gVmFyIFJlcSBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjQsICAgICAgLyoqPCBPQU0gVmFyIFJlc3AgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI1LCAgICAgIC8qKjwgT0FNIFZhciBSZXNwIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyNiwgICAgICAvKio8IE9BTSBPcmcgU3BlY2lmaWMgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI3LCAgICAgIC8qKjwgT0FNIE9yZyBTcGVjaWZpYyBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU4gICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjgsICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIFN5bSBQZXJpb2QgV2luLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSCAgICAgICAgICAgICAgICAgICAgICA9IDIyOSwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgU3ltIFBlcmlvZCBUaHJlc2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgID0gMjMwLCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBTeW0gUGVyaW9kIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1dJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMSwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgRnJhbWUgU2VjcyBXaW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIICAgICAgICAgICAgICAgICAgICAgID0gMjMyLCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBGcmFtZSBTZWNzIFRocmVzaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgPSAyMzMsICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIEZyYW1lIFNlY3MgRXZlbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9XSU4gICAgICAgICAgICAgICAgICAgICAgID0gMjM0LCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBGcmFtZSBQZXJpb2QgV2luLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIICAgICAgICAgICAgICAgICAgICA9IDIzNSwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgRnJhbWUgUGVyaW9kIFRocmVzaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UICAgICAgICAgICAgICAgICAgICAgPSAyMzYsICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIEZyYW1lIFBlcmlvZCBFdmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9XSU4gICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzcsICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIEZyIFNlYyBTdW0gV2luLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1RIUkVTSCAgICAgICAgICAgICAgICAgICAgICA9IDIzOCwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgRnIgU2VjIFN1bSBUaHJlc2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fRVZFTlQgICAgICAgICAgICAgICAgICAgICAgID0gMjM5LCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBGciBTZWMgU3VtIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19XSU4gICAgICAgICAgICAgICAgICAgICAgICA9IDI0MCwgICAgICAvKio8IE9BTSBSZW1vdGUgRXJyIEZyYW1lIFNlY3MgV2luLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19USFJFU0ggICAgICAgICAgICAgICAgICAgICA9IDI0MSwgICAgICAvKio8IE9BTSBSZW1vdGUgRXJyIEZyYW1lIFNlY3MgVGhyZXNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICA9IDI0MiwgICAgICAvKio8IE9BTSBSZW1vdGUgRXJyIEZyYW1lIFNlY3MgRXZlbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfV0lOICAgICAgICAgICAgICAgICAgICAgID0gMjQzLCAgICAgIC8qKjwgT0FNIFJlbW90ZSBFcnIgRnJhbWUgUGVyaW9kIFdpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0ggICAgICAgICAgICAgICAgICAgPSAyNDQsICAgICAgLyoqPCBPQU0gUmVtb3RlIEVyciBGcmFtZSBQZXJpb2QgVGhyZXNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UICAgICAgICAgICAgICAgICAgICA9IDI0NSwgICAgICAvKio8IE9BTSBSZW1vdGUgRXJyIEZyYW1lIFBlcmlvZCBFdmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9GUkFNRVNfTE9TVF9PQU1fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDYsICAgICAgLyoqPCBPQU0gRnJhbWVzIExvc3QgT0FNIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDcsICAgICAgLyoqPCBPQU0gRW11bCBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX1NQRF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDgsICAgICAgLyoqPCBPQU0gRW11bCBTcGQgRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQ1JDOEVSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0OSwgICAgICAvKio8IE9BTSBFbXVsIENSQzggRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQkFEX0xMSURfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1MCwgICAgICAvKio8IE9BTSBFbXVsIEJhZCBMTElEIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODAsICAgICAgLyoqPCBNUENQIE1BQyBDdHJsIEZyYW1lcyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODEsICAgICAgLyoqPCBNUENQIE1BQyBDdHJsIEZyYW1lcyBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODgsICAgICAgLyoqPCBNUENQIERpc2NvdmVyeSBXaW5kb3cgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjkwLCAgICAgIC8qKjwgTVBDUCBEaXNjb3ZlcnkgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19DT1JSRUNURURfQkxPQ0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOTIsICAgICAgLyoqPCBGRUMgQ29ycmVjdGVkIEJsb2Nrcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOTMsICAgICAgLyoqPCBGRUMgVW5jb3JyZWN0YWJsZSBCbG9ja3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEzLCAgICAgIC8qKjwgRkVDIEFiaWxpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE0LCAgICAgIC8qKjwgRkVDIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX0dBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE1LCAgICAgIC8qKjwgTVBDUCBUeCBHYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxNiwgICAgICAvKio8IE1QQ1AgVHggUmVnIEFjay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTcsICAgICAgLyoqPCBNUENQIFR4IFJlZ2lzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxOCwgICAgICAvKio8IE1QQ1AgVHggUmVnIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE5LCAgICAgIC8qKjwgTVBDUCBUeCBSZXBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIwLCAgICAgIC8qKjwgTVBDUCBSeCBHYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMSwgICAgICAvKio8IE1QQ1AgUnggUmVnIEFjay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjIsICAgICAgLyoqPCBNUENQIFJ4IFJlZ2lzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMywgICAgICAvKio8IE1QQ1AgUnggUmVnIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI0ICAgICAgIC8qKjwgTVBDUCBSeCBSZXBvcnQuICovCit9IGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGU7CisKKy8qKiBDVEMgRkVDIFN1cHBvcnQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRkVDX1NVUFBPUlRfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19GRUNfU1VQUE9SVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgU3VwcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRkVDX1NVUFBPUlRfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAvKio8IE5vdCBTdXBwb3J0ZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQ7CisKKy8qKiBDVEMgRkVDIFN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19GRUNfU1RBVEVfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZFQ19TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBFbmFibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRkVDX1NUQVRFX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAvKio8IERpc2FibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZTsKKworLyoqIENUQyBDaHVybmluZyBPcCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ0hVUk5JTkdfT1BfQ09ERV9ORVdfS0VZX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IE5ldyBLZXkgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NIVVJOSU5HX09QX0NPREVfTkVXX0NIVVJOSU5HX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgLyoqPCBOZXcgQ2h1cm5pbmcgS2V5LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGU7CisKKy8qKiBDVEMgQ2xhc3NpZmljYXRpb24gT3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DTEFTU0lGSUNBVElPTl9PUEVSQVRJT05fREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgRGVsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ0xBU1NJRklDQVRJT05fT1BFUkFUSU9OX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IEFkZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NMQVNTSUZJQ0FUSU9OX09QRVJBVElPTl9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBDbGVhci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NMQVNTSUZJQ0FUSU9OX09QRVJBVElPTl9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgLyoqPCBMaXN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbjsKKworLyoqIENUQyBDb21taXQgSW1hZ2UgQWNrLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2FjaworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX0FDS19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IFN1Y2Nlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfQUNLX1BBUkFNRVRFUl9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgUGFyYW1ldGVyIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX0FDS19OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IE5vdCBTdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfQUNLX0xPQURJTkdfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgIC8qKjwgTG9hZGluZyBGYWlsdXJlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2s7CisKKy8qKiBDVEMgQ29tbWl0IEltYWdlIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgLyoqPCBDb21taXQgSW1hZ2UgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSAgICAgICAgLyoqPCBDb21taXQgSW1hZ2UgUmVzcG9uc2UuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZTsKKworLyoqIENUQyBDb21taXQgSW1hZ2UgRmxhZy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfRkxBR19TV0FQX0FDVElWRV9CQUNLVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgIC8qKjwgU3dhcCBBY3RpdmUvQmFja3VwLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnOworCisvKiogQ1RDIERCQSBPcCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBHZXQgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBHZXQgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgU2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgIC8qKjwgU2V0IFJlc3BvbnNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlOworCisvKiogQ1RDIEVhcmx5IFdha2UgVXAgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRUFSTFlfV0FLRV9VUF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IEVuYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VBUkxZX1dBS0VfVVBfTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRUFSTFlfV0FLRV9VUF9NT0RFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAvKio8IE5vdCBTdXBwb3J0ZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZWFybHlfd2FrZV91cF9tb2RlOworCisvKiogQ1RDIEJyYW5jaC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgIC8qKjwgQWN0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0LCAgICAgICAvKio8IE9sZCBNYW5hZ2VtZW50IE9iamVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NSwgICAgICAgLyoqPCBNYW5hZ2VtZW50IE9iamVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTksICAgICAgLyoqPCBFeHQgQXR0cmlidXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwMSwgICAgICAvKio8IEV4dCBBY3Rpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY3LCAgICAgIC8qKjwgS1QgQXR0cmlidXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2OSAgICAgICAvKio8IEtUIEFjdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2g7CisKKy8qKiBPQU0gRXJyb3IgQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgsICAgICAgLyoqPCBObyBFcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfVU5ERVRFUk1JTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAgICAgLyoqPCBVbmRldGVybWluZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1VOU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMwLCAgICAgIC8qKjwgVW5zdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMxLCAgICAgIC8qKjwgT3ZlcmZsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1RPT19MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMyLCAgICAgIC8qKjwgVG9vIExvbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1RPX0JFX0NPTlRJTlVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMzLCAgICAgIC8qKjwgVG8gQmUgQ29udGludWVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9CQURfUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNCwgICAgICAvKio8IEJhZCBQYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9OT19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNSwgICAgICAvKio8IE5vIFJlc291cmNlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1lTVEVNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzYsICAgICAgLyoqPCBTeXN0ZW0gQnVzeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1REX09BTV9BVFRSX1VOREVURVJNSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjAsICAgICAgLyoqPCBTVEQgT2FtIEF0dHIgVW5kZXRlcm1pbmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9TVERfT0FNX0FUVFJfTUFZX0JFX0NPUlJVUFRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MSwgICAgICAvKio8IFNURCBPYW0gQXR0ciBNYXkgQmUgQ29ycnVwdGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9TVERfT0FNX0FUVFJfVU5TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MiwgICAgICAvKio8IFNURCBPYW0gQXR0ciBVbnN1cHBvcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1REX09BTV9BVFRSX0hXX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjMsICAgICAgLyoqPCBTVEQgT2FtIEF0dHIgSHcgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1REX09BTV9BVFRSX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjQsICAgICAgLyoqPCBTVEQgT2FtIEF0dHIgT3ZlcmZsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1NURF9PQU1fT0JKX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTkyLCAgICAgIC8qKjwgU1REIE9hbSBPYmplY3QgRW5kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9TVERfT0FNX09CSl9VTkRFUlRFUk1JTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MywgICAgICAvKio8IFNURCBPYW0gT2JqZWN0IFVuZGVydGVybWluZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1NURF9PQU1fT0JKX1VOU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk0LCAgICAgIC8qKjwgU1REIE9hbSBPYmplY3QgVW5zdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1NURF9PQU1fT0JKX01BWV9CRV9DT1JSVVBURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk1LCAgICAgIC8qKjwgU1REIE9hbSBPYmplY3QgTWF5IEJlIENvcnJ1cHRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1REX09BTV9PQkpfSFdfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTYgICAgICAgLyoqPCBTVEQgT2FtIE9iamVjdCBIdyBGYWlsdXJlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGU7CisKKy8qKiBDVEMgTGVhZiBPbGQgTWFuYWdlbWVudCBPYmplY3QuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9PTERfTUFOQUdFTUVOVF9PQkpFQ1RfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAvKio8IFBvcnQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3Q7CisKKy8qKiBDVEMgUG9ydCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1JUX1RZUEVfRVRIRVJORVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgRXRoZXJuZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1JUX1RZUEVfVk9JUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgVm9JUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1BPUlRfVFlQRV9BRFNMMlBMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBBRFNMMisuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1JUX1RZUEVfVkRTTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgIC8qKjwgVkRTTDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1JUX1RZUEVfRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgIC8qKjwgRTEuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlOworCisvKiogQ1RDIExlYWYgRXh0IEF0dHJpYnV0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBPTlUgU2VyaWFsIE51bWJlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GSVJNV0FSRV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBGaXJtd2FyZSBWZXJzaW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NISVBTRVRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IENoaXBzZXQgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgIC8qKjwgT05VIENhcGFiaWxpdGllcy0xLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09QVElDQUxfVFJBTlNDRUlWRVJfRElBR05PU0lTICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAvKio8IE9wdGljYWwgVHJhbnNjZWl2ZXIgRGlhZ25vc2lzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NFUlZJQ0VfU0xBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAvKio8IFNlcnZpY2UgU0xBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAvKio8IE9OVSBDYXBhYmlsaXRpZXMtMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IT0xET1ZFUl9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgLyoqPCBIb2xkb3ZlciBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVhVX01BTkFHRV9HTE9CQUxfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgIC8qKjwgTXhVIE1hbmFnZSBHbG9iYWwgUGFyYW1ldGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfU05NUF9QQVJBTUVURVIgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAvKio8IE14VSBNYW5hZ2UgU05NUCBQYXJhbWV0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUNUSVZFX1BPTl9JRkFETUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgIC8qKjwgQWN0aXZlIFBPTiBJL0YgQWRtaW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgIC8qKjwgT05VIENhcGFiaWxpdGllcy0zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1dFUl9TQVZJTkdfQ0FQQUJJTElUSUVTICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAvKio8IE9OVSBQb3dlciBTYXZpbmcgQ2FwYWJpbGl0aWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1dFUl9TQVZJTkdfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAvKio8IE9OVSBQb3dlciBTYXZpbmcgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QUk9URUNUSU9OX1BBUkFNRVRFUlMgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAvKio8IE9OVSBQcm90ZWN0aW9uIFBhcmFtZXRlcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX0xJTktfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgIC8qKjwgRXRoIExpbmsgU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgIC8qKjwgRXRoIFBvcnQgUGF1c2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfUE9MSUNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgIC8qKjwgRXRoIFBvcnQgUG9saWNpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVk9JUF9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgIC8qKjwgVm9JUCBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0UxUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAvKio8IEUxIFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfRE9XTl9SQVRFX0xJTUlUSU5HICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgIC8qKjwgRXRoIFBvcnQgRG93biBSYXRlIExpbWl0aW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPUlRfTE9PUF9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgICAgICAvKio8IFBvcnQgTG9vcCBEZXRlY3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9ESVNBQkxFX09OX0xPT1BfREVURUNURUQgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgIC8qKjwgUG9ydCBEaXNhYmxlIE9uIExvb3AgRGV0ZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgICAgIC8qKjwgVkxBTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9DTEFTU0lGSUNBVElPTl9BTkRfTUFSS0lORyAgICAgICAgICAgICAgICAgICAgICAgPSA0OSwgICAgICAgLyoqPCBDbGFzc2lmaWNhdGlvbiBBbmQgTWFya2luZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NSwgICAgICAgLyoqPCBNdWx0aWNhc3QgVkxBTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVEFHX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NiwgICAgICAgLyoqPCBNdWx0aWNhc3QgVGFnIE9wZXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfU1dJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NywgICAgICAgLyoqPCBNdWx0aWNhc3QgU3dpdGNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY4LCAgICAgICAvKio8IE11bHRpY2FzdCBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0dST1VQX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY5LCAgICAgICAvKio8IEdyb3VwIE1heC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVNUX0xFQVZFX0FCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MCwgICAgICAgLyoqPCBGYXN0IExlYXZlIEFiaWxpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BRE1JTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzEsICAgICAgIC8qKjwgRmFzdCBMZWF2ZSBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9MTElEX1FVRVVFX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MSwgICAgICAgLyoqPCBMTElEL1F1ZXVlIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9JQURfSU5GT1JNQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NywgICAgICAgLyoqPCBJQUQgSW5mb3JtYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVk9JUF9HTE9CQUxfUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTgsICAgICAgIC8qKjwgVm9JUCBHbG9iYWwgUGFyYW1ldGVycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OSwgICAgICAgLyoqPCBILjI0OCBQYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhVU0VSX1RJRF9JTkZPUk1BVElPTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMCwgICAgICAvKio8IEguMjQ4IFVzZXIgVElEIEluZm9ybWF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhSVFBfVElEX0NPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICA9IDEwMSwgICAgICAvKio8IEguMjQ4IFJUUCBUSUQgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UlRQX1RJRF9JTkZPUk1BVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDIsICAgICAgLyoqPCBILjI0OCBSVFAgVElEIEluZm9ybWF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9QQVJBTUVURVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMywgICAgICAvKio8IFNJUCBQYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9VU0VSX1BBUkFNRVRFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNCwgICAgICAvKio8IFNJUCBVc2VyIFBhcmFtZXRlcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFYX01PREVNX0NPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA1LCAgICAgIC8qKjwgRmF4L01vZGVtIENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OElBRF9PUEVSQVRJT05fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA2LCAgICAgIC8qKjwgSC4yNDggSUFEIE9wZXJhdGlvbiBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9UU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA3LCAgICAgIC8qKjwgUE9UUyBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA4LCAgICAgIC8qKjwgSUFEIE9wZXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfRElHSVRfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDksICAgICAgLyoqPCBTSVAgRGlnaXQgTWFwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOSwgICAgICAvKio8IEFsYXJtIEFkbWluIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAvKio8IEFsYXJtIFRocmVzaG9sZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfVFhfUE9XRVJfU1VQUExZX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgPSAxNjEsICAgICAgLyoqPCBPbnUgVHggUG93ZXIgU3VwcGx5IENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTUFDX0FHSU5HX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY0LCAgICAgIC8qKjwgTUFDIEFnaW5nIFRpbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19TVEFUVVMgICAgICAgICAgICAgICAgICAgID0gMTc3LCAgICAgIC8qKjwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19DVVJSRU5UX0RBVEEgICAgICAgICAgICAgID0gMTc4LCAgICAgIC8qKjwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBDdXJyZW50IERhdGEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19ISVNUT1JZX0RBVEEgICAgICAgICAgICAgID0gMTc5LCAgICAgIC8qKjwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBIaXN0b3J5IERhdGEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkVSU0lPTl9TRVJWRVJfUEFSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NzBVLCAgIC8qKjwgVmVyc2lvbiBTZXJ2ZXIgUGFyYS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc3MVUsICAgLyoqPCBPTlUgTUFDIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUdJTkdfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzcyVSwgICAvKio8IE9OVSBNQUMgQWdpbmcgVGltZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc3M1UsICAgLyoqPCBPTlUgUG9ydCBNQUMgRmlsdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19CSU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzc0VSwgICAvKio8IE9OVSBQb3J0IE1BQyBCaW5kaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19TVEFUSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzc1VSwgICAvKio8IE9OVSBQb3J0IE1BQyBTdGF0aWMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BFUkZPUk1BTkNFX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3ODRVLCAgIC8qKjwgT05VIFBlcmZvcm1hbmNlIFN0YXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfSVNPTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NzZVLCAgIC8qKjwgT05VIFBvcnQgSXNvbGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0FERFJFU1NfVEFCTEVfUVVFUlkgICAgICAgICAgICAgICAgICAgICAgPSAzMjc4NlUsICAgLyoqPCBPTlUgTUFDIEFkZHJlc3MgVGFibGUgUXVlcnkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfRE9XTlNUUkVBTV9TSEFQSU5HICAgICAgICAgICAgICAgICAgID0gMzI3ODdVLCAgIC8qKjwgT05VIFBPTiBNQUMgRG93bnN0cmVhbSBTaGFwaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzg4VSwgICAvKio8IE9OVSBQT04gTUFDIFVTL0RTIEJ1ZmZlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19VU0RTQlVGRkVSX0NBUEFCSUxJVFlfUVVFUlkgICAgICAgICAgPSAzMjc4OVUsICAgLyoqPCBPTlUgUE9OIE1BQyBVUy9EUyBCdWZmZXIgQ2FwYWJpbGl0eSBRdWVyeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPTExFQ1RfQ09OVFJPTCAgICAgICAgICAgICAgPSAzMjc5MFUsICAgLyoqPCBPTlUgUG9ydCBTdGF0aXN0aWNzIENvbGxlY3QgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPVU5URVJfUkVTRVQgICAgICAgICAgICAgICAgPSAzMjc5MVUsICAgLyoqPCBPTlUgUG9ydCBTdGF0aXN0aWNzIENvdW50ZXIgUmVzZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfRkxVWF9TVEFUSVNUSUNTX0NPVU5URVIgICAgICAgICAgICAgICAgID0gMzI3OTJVLCAgIC8qKjwgT05VIFBvcnQgRmx1eCBTdGF0aXN0aWNzIENvdW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0VYQ0VQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3OTNVLCAgIC8qKjwgT05VIExpZ2h0IEV4Y2VwdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTElHSFRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc5NFUsICAgLyoqPCBPTlUgTGlnaHQgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX1BPUlRfU1RBVElTVElDU19HRVQxICAgICAgICAgICAgICAgICAgICAgPSAzMjc5NVUsICAgLyoqPCBPTlUgUE9OIFBvcnQgU3RhdGlzdGljcyBHZXQxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fUE9SVF9TVEFUSVNUSUNTX0dFVDIgICAgICAgICAgICAgICAgICAgICA9IDMyNzk2VSwgICAvKio8IE9OVSBQT04gUG9ydCBTdGF0aXN0aWNzIEdldDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjlVLCAgIC8qKjwgQWxhcm0gQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1JPVUdVRV9PTlVfRVhDTF9BQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzk3VSwgICAvKio8IFJvdWd1ZU9udUV4Y2xBYmlsaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BQUE9fRVRFU1RfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyOTMxVSwgICAvKio8IFBQUG9FVGVzdENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUFBQT19FVEVTVF9SRVNVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI5MzJVICAgIC8qKjwgUFBQb0VUZXN0UmVzdWx0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZTsKKworLyoqIENUQyBMZWFmIEV4dCBBY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9SRVNFVF9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBSZXNldCBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fU0xFRVBfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgU2xlZXAgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9GQVNUX0xFQVZFX0FETUlOX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MiwgICAgICAgLyoqPCBGYXN0IExlYXZlIEFkbWluIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fTVVMVElfTExJRF9BRE1JTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE0LCAgICAgIC8qKjwgTXVsdGktTExJRCBBZG1pbiBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMjUgICAgICAvKio8IFJlc2V0IENhcmQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uOworCisvKiogS1QgTGVhZiBBdHRyaWJ1dGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9QT1JUX0RPV05TVFJFQU1fUkFURV9TSEFQSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gUmF0ZSBTaGFwaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9NQUNfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IE9OVSBNQUMgTGltaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfQkxPQ0tfVU5CTE9DS19PTlVfVFJBRkZJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgIC8qKjwgQmxvY2svVW5ibG9jayBPTlUgVHJhZmZpYy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfRElBR05PU1RJQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgLyoqPCBPTlUgRGlhZ25vc3RpY3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX1FVRVVFX0RST1BfQ09VTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgIC8qKjwgT05VIFF1ZXVlIERyb3AgQ291bnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9FVEhFUk5FVF9QT1JUX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgLyoqPCBFdGhlcm5ldCBQb3J0IENvdW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfRVRIRVJORVRfUE9SVF9SU1RQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgIC8qKjwgRXRoZXJuZXQgUG9ydCBSU1RQLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0xPT1BfREVURUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAvKio8IExvb3AgRGV0ZWN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9NUENQX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAvKio8IE9OVSBNUENQIENvdW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgIC8qKjwgU3RhdGljIE1BQy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PUFRJQ0FMX1BPV0VSX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiAgICAgICAgLyoqPCBPcHRpY2FsIFBvd2VyIEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGU7CisKKy8qKiBDVEMgRXRoIFBvcnQgUG9saWNpbmcgRW5hYmxlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19FVEhfUE9SVF9QT0xJQ0lOR19FTkFCTEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19FVEhfUE9SVF9QT0xJQ0lOR19FTkFCTEVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgIC8qKjwgRW5hYmxlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGU7CisKKy8qKiBDVEMgRXZlbnQgU3ViIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfU1RBVFVTX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFN0YXR1cyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfU1RBVFVTX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFN0YXR1cyBTZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgIC8qKjwgU3RhdHVzIFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IFRocmVzaG9sZCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAvKio8IFRocmVzaG9sZCBTZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9USFJFU0hPTERfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiAgICAgICAgIC8qKjwgVGhyZXNob2xkIFJlc3BvbnNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlOworCisvKiogQ1RDIEV2ZW50IFN0YXR1cy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1cworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1RBVFVTX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IERpc2FibGVkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVEFUVVNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgRW5hYmxlZCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1RBVFVTX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyOTQ5NjcyOTVVTCAgLyoqPCBOb3QgRm91bmQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXM7CisKKy8qKiBDVEMgT05VIFNsZWVwIEZsYWcuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1NMRUVQX0ZMQUdfTEVBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPTlUgbGVhdmVzIGZyb20gcG93ZXIgc2F2aW5nIHN0YXRlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfU0xFRVBfRkxBR19FTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9OVSBlbnRlcnMgcG93ZXIgc2F2aW5nIHN0YXRlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfU0xFRVBfRkxBR19DSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IENoYW5nZSBPTlUgcG93ZXIgc2F2aW5nIG1vZGUsIHNsZWVwIHRpbWUgYW5kIHdha2UgdGltZSAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnOworCisvKiogQ3RjIE9udSBTbGVlcCBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9TTEVFUF9NT0RFX05PVF9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRG9uJ3Qgc3VwcG9ydCBzbGVlcCBtb2RlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfU0xFRVBfTU9ERV9UWF9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEluIHRoaXMgY2FzZSwgb25seSBzdXBwb3J0IFR4IHNsZWVwIG1vZGUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9TTEVFUF9NT0RFX1RSWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgSW4gdGhpcyBjYXNlLCBUeCBhbmQgUnggY2FuIG9ubHkgc2xlZXAgYXQgdGhlIHNhbWUgdGltZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1NMRUVQX01PREVfVFhfQU5EX1RSWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIGJvdGggc3VwcG9ydCBUeCBzbGVlcCBhbmQgVHggUnggYm90aCBzbGVlcCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlOworCisvKiogUFAgUG8gRSBUZXN0IFN0YXR1cy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9TVEFUVVNfVU5fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVW5TdGFydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9TVEFUVVNfVEVTVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVGVzdGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9TVEFUVVNfVEVTVF9PVkVSX0FORF9QQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVGVzdE92ZXJBbmRQYXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX1NUQVRVU19URVNUX09WRVJfQU5EX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBUZXN0T3ZlckFuZEZhaWwuICovCit9IGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1czsKKworLyoqIFBQIFBvIEUgVGVzdCBGYWlsIFJlYXNvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX0ZBSUxfUkVBU09OX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOdWxsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX0ZBSUxfUkVBU09OX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX0ZBSUxfUkVBU09OX0hBUkRXQVJFX05PVF9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBIYXJkd2FyZU5vdFN1cHBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRVRFU1RfRkFJTF9SRUFTT05fVkxBTl9OT1RfQ09ORklHVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFZsYW5Ob3RDb25maWd1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRVRFU1RfRkFJTF9SRUFTT05fVElNRU9VVF9GT1JfUEFESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFRpbWVvdXRGb3JQQURJLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX0ZBSUxfUkVBU09OX1RJTUVPVVRfRk9SX1BBRFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBUaW1lb3V0Rm9yUEFEUi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9GQUlMX1JFQVNPTl9MQ1BORUdfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgTENQTmVnRmFpbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9GQUlMX1JFQVNPTl9BVVRIX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgQXV0aEZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRVRFU1RfRkFJTF9SRUFTT05fSVBORUdfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCAgICAgICAgICAgICAvKio8IElQTmVnRmFpbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb247CisKKy8qKiBTdGFydCBPciBTdG9wIEluZGljYXRpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9TVEFSVF9PUl9TVE9QX0lORElDQVRJT05fU1RPUF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBTdG9wVGVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1RBUlRfT1JfU1RPUF9JTkRJQ0FUSU9OX1NUQVJUX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgU3RhcnRUZXN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uOworCisvKiogUFAgUG8gRSBBdXRoIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VBVVRIX01PREVfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBBdXRvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VBVVRIX01PREVfUEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBQYXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRUFVVEhfTU9ERV9DSEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IENoYXAuICovCit9IGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGU7CisKKy8qKiBDVEMgU3VwcG9ydGVkIFNlcnZpY2VzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19TVVBQT1JURURfU0VSVklDRVNfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NVUFBPUlRFRF9TRVJWSUNFU19HRVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgR0UgUG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NVUFBPUlRFRF9TRVJWSUNFU19GRVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgICAgIC8qKjwgRkUgUG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NVUFBPUlRFRF9TRVJWSUNFU19WT0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQsICAgICAgIC8qKjwgVm9JUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NVUFBPUlRFRF9TRVJWSUNFU19URE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDggICAgICAgIC8qKjwgVERNLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlczsKKworLyoqIENUQyBTZXJ2aWNlIFNMQSBPcGVyYXRpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NFUlZJQ0VfU0xBX09QRVJBVElPTl9ERUFDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRGVhY3RpdmF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NFUlZJQ0VfU0xBX09QRVJBVElPTl9BQ1RJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgQWN0aXZhdGUuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uOworCisvKiogQ1RDIDIuMSBPTlUgREJBIFNjaGVkdWxpbmcgU2NoZW1lIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfREJBX1NDSEVEVUxJTkdfU0NIRU1FX1NUUklDVF9QUklPUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFN0cmljdCBQcmlvcml0eSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0RCQV9TQ0hFRFVMSU5HX1NDSEVNRV9XRUlHSFRFRF9ST1VORF9ST0JJTiAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBXZWlnaHRlZCBSb3VuZC1Sb2JpbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0RCQV9TQ0hFRFVMSU5HX1NDSEVNRV9TUFBMVVNfV1JSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBTUCtXUlIgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lOworCisvKiogQ1RDIE9OVSBUeXBlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfU0ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBTRlUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9UWVBFX0hHVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgSEdVICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfVFlQRV9TQlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFNCVSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfQk9YX01EVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBCb3ggTURVIChFdGhlcm5ldCBQb3J0KSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfU01BTExfTENNRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBTbWFsbCBMQyBNRFUgKEV0aGVybmV0IFBvcnQpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfVFlQRV9CT1hfTENNRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEJveCBMQyBNRFUgKERTTCBQb3J0KSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfQ0hBU1NJU19MQ01EVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBDaGFzc2lzIExDIE1EVSAoRFNMIFBvcnQpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfVFlQRV9MQ01EVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEwvQyBNRFUgKHN1cHBvcnQgbWl4aW5nIGluc2VydGlvbiBvZiBFdGhlcm5ldCBwb3J0IEwvQyBhbmQgRFNMIFBvcnQgTC9DKSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfQ01DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkgICAgICAgICAgICAgLyoqPCBDTUMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZTsKKworLyoqIENUQyBPTlUgUHJvdGVjdGlvbiBUeXBlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfUFJPVEVDVElPTl9UWVBFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5vdCBTdXBwb3J0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfUFJPVEVDVElPTl9UWVBFX1RZUEVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFR5cGUgQyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1BST1RFQ1RJT05fVFlQRV9UWVBFX0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBUeXBlIEQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlOworCisvKiogQ1RDIDIuMSBPTlUgSW50ZXJmYWNlIFR5cGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0lOVEVSRkFDRV9UWVBFX0dFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBHYWdhYml0IEV0aGVybmV0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfSU5URVJGQUNFX1RZUEVfRkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEZhc3QgRXRoZXJuZXQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9JTlRFUkZBQ0VfVFlQRV9WT0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVm9JUCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0lOVEVSRkFDRV9UWVBFX1RETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBURE0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9JTlRFUkZBQ0VfVFlQRV9BRFNMMlBMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgQURTTDIrICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfSU5URVJGQUNFX1RZUEVfVkRTTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IFZEU0wyICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfSU5URVJGQUNFX1RZUEVfV0xBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFdMQU4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9JTlRFUkZBQ0VfVFlQRV9VU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgVVNCICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfSU5URVJGQUNFX1RZUEVfQ0FUVl9SRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCAgICAgICAgICAgICAvKio8IENBVFYgUkYgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3R5cGU7CisKKy8qKiBDVEMgTXhVIEdsb2JhbCBQYXJhbXMgV2lkdGguIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX0dMT0JBTF9QQVJBTVNfV0lEVEhfSVBWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBJUHY0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX0dMT0JBTF9QQVJBTVNfV0lEVEhfSVBWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxICAgICAgICAgICAgLyoqPCBJUHY2LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoOworCisvKiogQ1RDIE14VSBTTk1QIFBhcmFtcyBXaWR0aC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNSwgICAgICAgICAgLyoqPCBJUHY0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNyAgICAgICAgICAgLyoqPCBJUHY2LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aDsKKworLyoqIENUQyBPTlUgUG93ZXIgU3VwcGx5IENvbnRyb2wgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfUE9XRVJfU1VQUExZX0NPTlRST0xfVFlQRV9OT1RfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERvbid0IFN1cHBvcnQgT05VIFBvd2VyIFN1cHBseSBDb250cm9sICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfUE9XRVJfU1VQUExZX0NPTlRST0xfVFlQRV9UWF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEluIHRoaXMgY2FzZSwgVHggYW5kIFJ4IHBvd2VyIHN1cHBseSBjYW4gb25seSBiZSBjb250cm9sbGVkIHRvZ2V0aGVyIHdoZXJlYnkgcG93ZXIgZm9yIFJ4IGlzIGFsc28gc2h1dGRvd24gd2hlbiB0aGUgcG93ZXIgdG8gVHggaXMgc2h1dGRvd24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9QT1dFUl9TVVBQTFlfQ09OVFJPTF9UWVBFX1RYX1JYX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgSW4gdGhpcyBjYXNlLCB0eCBhbmQgcnggY2FuIGJlIGNvbnRyb2xsZWQgc2VwYXJhdGVseSB3aGVyZWJ5IHBvd2VyIHRvIFJ4IGlzIHN0aWxsIG9uIHdoaWxlIHRoZSBwb3dlciB0byBUeCBpcyBzaHV0ZG93biAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlOworCisvKiogQ1RDIFZsYW4gTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TUEFSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBUcmFuc3BhcmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVGFnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBUcmFuc2xhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9BR0dSRUdBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgQWdncmVnYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSVU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBUcnVuay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9TUEVDSUFMX1RSQU5TUEFSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTUsICAgICAgICAgIC8qKjwgU3BlY2lhbCBUcmFuc3BhcmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOS19NRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgVHJ1bmsgTURVLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX0hZQlJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwICAgICAgICAgICAgLyoqPCBIeWJyaWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlOworCisvKiogQ1RDIGNsYXNzaWZpY2F0aW9uIGZpZWxkIHNlbGVjdG9ycyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTUFDIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTUFDIHNvdXJjZSBhZGRyZXNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX1BSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFZMQU4gcHJpb3JpdHkgKENvUykgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1ZMQU5fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgVkxBTiBJRCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRVRIX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBFdGhlclR5cGUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgSVAgZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBJUCBzb3VyY2UgYWRkcmVzcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBJUCBwcm90b2NvbCB0eXBlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9UT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IElQIFRvUyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfUFJFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBJUCBwcmVjZWRlbmNlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TT1VSQ0VfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IFVEUCBzb3VyY2UgcG9ydCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREVTVF9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBVRFAgZGVzaW50YXRpb24gcG9ydCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCBJUCBWZXJzaW9uICh2NCBvciB2NikgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX0ZMT1dfTEFCRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgSVAgRmxvdyBMYWJlbCAoSVB2NikgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RTVF9JUFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgRGVzdGluYXRpb24gSVB2NiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAgLyoqPCBTb3VyY2UgSXB2NiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjZQUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBEZXN0aW5hdGlvbiBJUHY2IFByZWZpeCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjZQUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBTb3VyY2UgSVB2NiBQcmVmaXggKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX05YVF9IRFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCAgICAgICAgICAgIC8qKjwgTmV4dCBIZWFkZXIgKElQdjYpKHN1Y2ggYXMgVENQL0lQL0lDTVB2NC9JR01QLGV0YykgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZDsKKworLyoqIENUQyBjbGFzc2lmaWNhdGlvbiBvcGVyYXRvcnMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9PUEVSQVRPUl9ORVZFUl9NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5ldmVyIG1hdGNoICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9PUEVSQVRPUl9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IExIUyA9PSBSSFMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX09QRVJBVE9SX05PVF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTEhTICE9IFJIUyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfT1BFUkFUT1JfTFRFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBMSFMgPD0gUkhTICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9PUEVSQVRPUl9HVEVRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IExIUyA+PSBSSFMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX09QRVJBVE9SX0VYSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgTWF0Y2ggaWYgdGhlIGZpZWxkIGV4aXN0cyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfT1BFUkFUT1JfTk9UX0VYSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBNYXRjaCBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX09QRVJBVE9SX0FMV0FZU19NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ICAgICAgICAgICAgIC8qKjwgQWx3YXlzIG1hdGNoICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3I7CisKKy8qKiBDVEMgTXVsdGljYXN0IFZMQU4gT3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERlbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQWRkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBDbGVhci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgTGlzdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb247CisKKy8qKiBDVEMgTXVsdGljYXN0IFRhZyBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfRE9fTk9UX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERvIE5vdCBTdHJpcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9UQUdfTU9ERV9TVFJJUF9EQVRBX1FVRVJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgU3RyaXAgRGF0YS9RdWVyeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9UQUdfTU9ERV9TVFJJUF9EQVRBX1FVRVJZX0lQVFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgU3RyaXAgRGF0YS9RdWVyeS9JUFRWLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZTsKKworLyoqIENUQyBNdWx0aWNhc3QgU3dpdGNoIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9TV0lUQ0hfTU9ERV9JR01QX01MRF9TTk9PUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSUdNUC9NTEQgU25vb3BpbmcgZHVhbCBzdGFjayBtb2RlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfU1dJVENIX01PREVfQ1RDX0NPTlRST0xMQUJMRV9JR01QX01MRCAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IENUQyBjb250cm9sbGFibGUgSUdNUC9NTEQgbW9kZSwgc25vb3BpbmcgZGlzYWJsZWQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9TV0lUQ0hfTU9ERV9JR01QX1NOT09QSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgSUdNUCBzbm9vcGluZyBtb2RlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfU1dJVENIX01PREVfQ1RDX0NPTlRST0xMQUJMRV9JR01QICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IENUQyBjb250cm9sbGFibGUgSUdNUCBtb2RlLCBzbm9vcGluZyBkaXNhYmxlZCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1NXSVRDSF9NT0RFX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyNyAgICAgICAgICAgLyoqPCBVbmRlZmluZWQgbW9kZSwgaGFzIG5vdCBiZWVuIHNldCB5ZXQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGU7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgQWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9BQ1RJT05fREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERlbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX0FDVElPTl9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQWRkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfQUNUSU9OX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBDbGVhci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX0FDVElPTl9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgTGlzdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb247CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgR0RBIE1BQyBPbmx5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfVkxBTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBHREEgTUFDICsgVkxBTiBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19QTFVTX0lQVjRTQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgR0RBIE1BQyArIElQdjQgU0EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFBMVVNfTUNBU1RfVkxBTl9JRCAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEdEQSBJUCArIE1jYXN0IFZMQU4gSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFY2UExVU19NQ0FTVF9WTEFOX0lEICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEdEQSBJUHY2ICsgTWNhc3QgVkxBTiBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19QTFVTX0lQVjZTQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ICAgICAgICAgICAgIC8qKjwgR0RBIE1BQyArIElQdjYgU0EuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZTsKKworLyoqIENUQyAyLjEgcG9zc2libGUgVm9JUCBwcm90b2NvbHMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2wKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSVBfUFJPVE9DT0xfSDI0OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSDI0OCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVk9JUF9QUk9UT0NPTF9TSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBTSVAgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sOworCisvKiogQ1RDIDIuMSBWb2ljZSBJUCBNb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX0lQTU9ERV9TVEFUSUNfSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU3RhdGljIElQIGFkZHJlc3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX0lQTU9ERV9ESENQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgREhDUCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVk9JQ0VfSVBNT0RFX1BQUE9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBQUFBvRS9QUFBvRSsgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGU7CisKKy8qKiBDVEMgUFBQb0UgTW9kZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUFBQT0VfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBBdXRvICAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUFBQT0VfTU9ERV9DSEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBDaGFsbGVuZ2UgSGFuZHNoYWtlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QUFBPRV9NT0RFX1BBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZTsKKworLyoqIENUQyAyLjEgVm9pY2UgVGFnZ2luZyBNb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX1RBR0dJTkdfTU9ERV9QQVNTX1RIUk9VR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUGFzcyBUaHJvdWdoICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WT0lDRV9UQUdHSU5HX01PREVfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFRhZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVk9JQ0VfVEFHR0lOR19NT0RFX1ZMQU5fU1RBQ0tJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBWTEFOIFN0YWNraW5nICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlOworCisvKiogQ1RDIDIuMSBIMjQ4IFJlZ2lzdHJhdGlvbiBNb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0gyNDhSRUdfTU9ERV9JUEFERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSVAgYWRkcmVzcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSDI0OFJFR19NT0RFX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEb21haW4gbmFtZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSDI0OFJFR19NT0RFX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBEZXZpY2UgbmFtZSAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZTsKKworLyoqIENUQyAyLjEgSDI0OCBIZWFydGJlYXQgTW9kZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19IMjQ4SEVBUlRCRUFUX01PREVfQ0xPU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IENsb3NlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19IMjQ4SEVBUlRCRUFUX01PREVfSDI0OENUQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IEguMjQ4LUNUQyBzdGFuZGFyZCBOb3RpZnkgY29tbWFuZCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZTsKKworLyoqIFBvc3NpYmxlIENUQyAyLjEgUlRQIFRJRCBjb25maWd1cmF0aW9uIG1vZGVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JUUF9USURfTU9ERV9BTElHTk1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQWxpZ25tZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUlRQX1RJRF9NT0RFX05PTl9BTElHTk1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBOb24tQWxpZ25tZW50LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZTsKKworLyoqIENUQyAyLjEgVm9pY2UgVDM4IE1vZGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX1QzOE1PREVfUEFTU1RIUk9VR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVm9pY2UgcGFzc3Rocm91Z2ggbW9kZSAoVDMwKSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVk9JQ0VfVDM4TU9ERV9UMzhNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBUMzggTW9kZSAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGU7CisKKy8qKiBDVEMgMi4xIFZvaWNlL0ZheCBNb2RlbSBDb250cm9sIE1vZGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX0ZBWF9NT0RFTV9DT05UUk9MX01PREVfTkVHT1RJQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTmVnb3RpYXRpb24gTW9kZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVk9JQ0VfRkFYX01PREVNX0NPTlRST0xfTU9ERV9BVVRPX0JWRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBBdXRvIEJWRCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGU7CisKKy8qKiBDVEMgMi4xIElBRCBPcGVyYXRpb24gU3RhdHVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1cworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX09QRVJBVElPTl9TVEFUVVNfUkVHSVNURVJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBSZWdpc3RlcmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX09QRVJBVElPTl9TVEFUVVNfUkVHX1NVQ0NFU1NGVUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gU3VjY2Vzc2Z1bCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX09QRVJBVElPTl9TVEFUVVNfSUFEX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBJQUQgRmF1bHQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9PUEVSQVRJT05fU1RBVFVTX0xPR09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgTG9nb3V0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfT1BFUkFUSU9OX1NUQVRVU19JQURfUkVTVEFSVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAvKio8IElBRCBSZXN0YXJ0aW5nICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXM7CisKKy8qKiBDVEMgMi4xIElBRCBQb3J0IFN0YXR1cyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfUkVHSVNUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFBvcnQgaXMgcmVnaXN0cmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU1RBVFVTX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBQb3J0IGlzIGlkbGUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NUQVRVU19QSUNLVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgUGljayB1cCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU1RBVFVTX0RJQUxJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBEaWFsaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfUklOR0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFJpbmdpbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NUQVRVU19SSU5HQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgUmluZ2luZyBiYWNrICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfQ09OTkVDVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IENvbm5lY3RpbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NUQVRVU19DT05ORUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgQ29ubmVjdGVkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfUkVMRUFTSU5HX0NPTk5FQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFJlbGVhc2luZyBDb25uZWN0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfUkVHSVNUUkFUSU9OX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFBvcnQgUmVnaXN0cmF0aW9uIEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NUQVRVU19OT1RfQUNUSVZBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgIC8qKjwgUG9ydCBpcyBub3QgYWN0aXZhdGVkICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzOworCisvKiogQ1RDIDIuMSBJQUQgUG9ydCBTZXJ2aWNlIFN0YXRlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TRVJWSUNFX1NUQVRFX0VORF9MT0NBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IExvY2FsIGVuZCB0ZXJtaW5hdGVzIHNlcnZpY2UsIGNhdXNlZCBieSAndXNlciBkaXNhYmxlIHBvcnQnICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TRVJWSUNFX1NUQVRFX0VORF9SRU1PVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFJlbW90ZSBhbmQgdGVybWluYXRlcyBzZXJ2aWNlLCBjYXVzZWQgYnkgJ01HQyBzZW5kcyBkb3duIGNvbW1hbmQnICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TRVJWSUNFX1NUQVRFX0VORF9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHNlcnZpY2UsIGNhdXNlZCBieSBNR0MgZmF1bHQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NFUlZJQ0VfU1RBVEVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgTm9ybWFsIHNlcnZpY2Ugbm9ybWFsICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZTsKKworLyoqIENUQyAyLjEgSUFEIFBvcnQgQ29kZWMgTW9kZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfQ09ERUNfTU9ERV9HNzExQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBHLjcxMSBBICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9DT0RFQ19NT0RFX0c3MjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEcuNzI5ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9DT0RFQ19NT0RFX0c3MTFVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEcuNzExIFUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX0NPREVDX01PREVfRzcyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgRy43MjMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX0NPREVDX01PREVfRzcyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgRy43MjYgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX0NPREVDX01PREVfVDM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ICAgICAgICAgICAgIC8qKjwgVC4zOCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGU7CisKKy8qKiBDVEMgMi4xIElBRCBPcGVyYXRpb24gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9PUEVSQVRJT05fUkVfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUmUtUmVnaXN0ZXIgZm9yIHNvZnRzd2l0Y2ggcGxhdGZvcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9PUEVSQVRJT05fTE9HT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTG9nb3V0IGZyb20gc29mdHN3aXRjaCBwbGF0Zm9ybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX09QRVJBVElPTl9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBSZXNldCwgb25seSBmb3Igdm9pY2UgbW9kdWxlICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbjsKKworLyoqIFp0ZSBPbnUgUG9ydCBNYWMgT3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfT05VX1BPUlRfTUFDX09QRVJBVElPTl9ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEZWxldGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9PTlVfUE9SVF9NQUNfT1BFUkFUSU9OX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFkZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX09OVV9QT1JUX01BQ19PUEVSQVRJT05fQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ2xlYXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9PTlVfUE9SVF9NQUNfT1BFUkFUSU9OX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IExpc3QuICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbjsKKworLyoqIFp0ZSBJc29sYXRlIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX0lTT0xBVEVfTU9ERV9OT1RfSVNPTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRXRoZXJuZXQgcG9ydCBkbyBub3QgaXNvbGF0ZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfSVNPTEFURV9NT0RFX0lTT0xBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBFdGhlcm5ldCBwb3J0IGlzb2xhdGUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGU7CisKKy8qKiBadGUgQnVmZmVyIE1hbmFnZSBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9CVUZGRVJfTUFOQUdFX01PREVfTk9UU1VQUE9SVEJVRkZFUk1BTkFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5vdFN1cHBvcnRCdWZmZXJNYW5hZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9CVUZGRVJfTUFOQUdFX01PREVfU1VQUE9SVEJVRkZFUk1BTkFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IFN1cHBvcnRCdWZmZXJNYW5hZ2UuICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlOworCisvKiogWnRlIERTIEJ1ZiBEaXJlY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX0RTQlVGX0RJUkVDVElPTl9VUFNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9EU0JVRl9ESVJFQ1RJT05fRE9XTlNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IERvd25zdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9EU0JVRl9ESVJFQ1RJT05fQk9USF9VUFNUUkVBTV9BTkRfRE9XTlNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IEJvdGggVXBzdHJlYW0gQW5kIERvd25zdHJlYW0uICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uOworCisvKiogWnRlIFN0YXRpc3RpY3MgQWN0aW9uIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9TVEFUSVNUSUNTX0FDVElPTl9NT0RFX09OVV9VTklfU1RPUF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE9udVVOSVN0b3BTdGF0aXN0aWNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfU1RBVElTVElDU19BQ1RJT05fTU9ERV9PTlVfVU5JX1NUQVJUX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBPbnVVTklTdGFydFN0YXRpc3RpY3MuICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19hY3Rpb25fbW9kZTsKKworLyoqIFp0ZSBTdGF0aXN0aWNzIFJlc2V0IE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX1NUQVRJU1RJQ1NfUkVTRVRfTU9ERV9PTlVfUkVTRVRfU1RBVElTVElDU19DT1VOVEVSICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT251IFJlc2V0IFN0YXRpc3RpY3MgQ291bnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX1NUQVRJU1RJQ1NfUkVTRVRfTU9ERV9LRUVQX1NUQVRJU1RJQ1NfQ09VTlRFUiAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgS2VlcCBTdGF0aXN0aWNzIENvdW50ZXIuICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlOworCisvKiogVW5pIEZsb3cgU3RhdGlzdGljcyBDb2xsZWN0IENvbnRyb2wgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9VTklfRkxPV19TVEFUSVNUSUNTX0NPTExFQ1RfQ09OVFJPTF9NT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9VTklfRkxPV19TVEFUSVNUSUNTX0NPTExFQ1RfQ09OVFJPTF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBFbmFibGUuICovCit9IGJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlOworCisvKiogTGlnaHQgSW5kaWNhdGlvbiBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTElHSFRfSU5ESUNBVElPTl9NT0RFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTm9ybWFsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MSUdIVF9JTkRJQ0FUSU9OX01PREVfRVhDRVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBFeGNlcHRpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGU7CisKKy8qKiBNYXRjaCBNYWMgQWRkcmVzcy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9NQVRDSF9NQUNfQUREUkVTU19NT0RFX0lHTk9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJZ25vcmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVENIX01BQ19BRERSRVNTX01PREVfRVhDVVRFX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IEV4Y3V0ZSBNYXRjaC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGU7CisKKy8qKiBadGUgTGlnaHQgQ29udHJvbCBBY3Rpb24gTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX0xJR0hUX0NPTlRST0xfQUNUSU9OX01PREVfT1BFTl9UUkFOU0ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT3BlbiBUcmFuc2Zlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX0xJR0hUX0NPTlRST0xfQUNUSU9OX01PREVfQ0xPU0VfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQ2xvc2UgVHJhbnNmZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9MSUdIVF9DT05UUk9MX0FDVElPTl9NT0RFX0NMT1NFX09QVElDQUxfTU9ERUwgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IENsb3NlIE9wdGljYWwgTW9kZWwuICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfbGlnaHRfY29udHJvbF9hY3Rpb25fbW9kZTsKKworLyoqIE9OVSBFeGNsIEFiaWxpdHkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHkKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX0VYQ0xfQUJJTElUWV9OT1RTVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTm90U3VwcG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX0VYQ0xfQUJJTElUWV9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgU3VwcG9ydC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHk7CisKKy8qKiBDVEMgT05VIEVhcmx5IFdha2UgQ2FwYWJpbGl0eS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHkKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9FQVJMWV9XQUtFX0NBUEFCSUxJVFlfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU3VwcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0VBUkxZX1dBS0VfQ0FQQUJJTElUWV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBOb3QgU3VwcG9ydGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHk7CisKKy8qKiBDVEMgUG9ydCBEaXNhYmxlIE9uIExvb3AgRGV0ZWN0ZWQgU3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9SVF9ESVNBQkxFX09OX0xPT1BfREVURUNURURfU1RBVEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBXaGVuIHBvcnQgbG9vcGJhY2sgaXMgZGV0ZWN0ZWQsIGRvIG5vdCBkaXNhYmxlIHRoaXMgcG9ydCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9SVF9ESVNBQkxFX09OX0xPT1BfREVURUNURURfU1RBVEVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBXaGVuIHBvcnQgbG9vcGJhY2sgaXMgZGV0ZWN0ZWQsIGRpc2FibGUgdGhpcyBwb3J0IGF1dG9tYXRpY2FsbHkgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZTsKKworLyoqIENUQyBNb25pdG9yaW5nIFN0YXR1cy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NT05JVE9SSU5HX1NUQVRVU19ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IERpc2FibGUgT05VIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01PTklUT1JJTkdfU1RBVFVTX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgRW5hYmxlIE9OVSBwZXJmb3JtYW5jZSBtb25pdG9yaW5nICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXM7CisKKy8qKiBDVEMgRmlsZSBDaGVjayBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRklMRV9DSEVDS19PUENPREVfRU5EX0RPV05MT0FEX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBFbmQgRG93bmxvYWQgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZJTEVfQ0hFQ0tfT1BDT0RFX0VORF9ET1dOTE9BRF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ICAgICAgICAgICAgIC8qKjwgRW5kIERvd25sb2FkIFJlc3BvbnNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlOworCisvKiogQ1RDIFJQUyBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JQU19DT0RFX0NIRUNLX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQ2hlY2sgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JQU19DT0RFX1dSSVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgV3JpdGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JQU19DT0RFX0NIRUNLX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ2hlY2sgRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SUFNfQ09ERV9QQVJBTUVURVJfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFBhcmFtZXRlciBFcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JQU19DT0RFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgIC8qKjwgTm90IFN1cHBvcnRlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZTsKKworLyoqIENUQyBPTlUgQXV0aCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FVVEhfQ09ERV9BVVRIX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBBdXRoIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQVVUSF9DT0RFX0FVVEhfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEF1dGggUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQVVUSF9DT0RFX0FVVEhfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEF1dGggU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BVVRIX0NPREVfQVVUSF9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgIC8qKjwgQXV0aCBGYWlsdXJlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGU7CisKKy8qKiBXZWxsLWtub3duIGNvbXBhbnkgT1VJcy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDk2LCAgICAgICAgIC8qKjwgRFBvRSBPVUkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTE4NDgxVUwsICAgIC8qKjwgQ1RDJ3MgT1VJICovCisgICAgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUxMCwgICAgICAgICAvKio8IFRlaydzIE9VSSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMTg0ODEwVUwsICAgLyoqPCBLVCdzIE9VSSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzNDUxVUwsICAgICAgLyoqPCBEYXNhbidzIE9VSSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyODUsICAgICAgICAgLyoqPCBQTUMncyBPVUkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTIwLCAgICAgICAgIC8qKjwgQnJvYWRjb20ncyBPVUkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ODIwNTU5VUwgICAgIC8qKjwgU0lFUE9OIE9VSV9BICovCit9IGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aTsKKworLyoqIENUQyBjbGFzc2lmaWNhdGlvbiBvcGVyYXRvcnMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3IKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JVTEVfT1BFUkFUT1JfTkVWRVJfTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTmV2ZXIgbWF0Y2ggKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JVTEVfT1BFUkFUT1JfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTEhTID09IFJIUyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUlVMRV9PUEVSQVRPUl9OT1RfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBMSFMgIT0gUkhTICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SVUxFX09QRVJBVE9SX0xURVEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IExIUyA8PSBSSFMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JVTEVfT1BFUkFUT1JfR1RFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgTEhTID49IFJIUyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUlVMRV9PUEVSQVRPUl9FWElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBNYXRjaCBpZiB0aGUgZmllbGQgZXhpc3RzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SVUxFX09QRVJBVE9SX05PVF9FWElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IE1hdGNoIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUlVMRV9PUEVSQVRPUl9BTFdBWVNfTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcgICAgICAgICAgICAgLyoqPCBBbHdheXMgbWF0Y2ggKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX29wZXJhdG9yOworCisvKiogQ1RDIFNvZnR3YXJlIERvd25sb2FkIERhdGEgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1RGVFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBURlRQLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0RBVEFfQ0hFQ0tJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBEYXRhIENoZWNraW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1NXTUlSUk9SSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTL1cgTWlycm9yaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0NPTU1JVF9JTUFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgLyoqPCBDb21taXQgSW1hZ2UuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlOworCisvKiogQ1RDIFRGVFAgT3AgQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX1dSSVRFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBXcml0ZSBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBEYXRhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBBY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAvKio8IEVycm9yLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZTsKKworLyoqIENUQyBTL1cgTWlycm9yIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfT1BDT0RFX0FDVElWQVRFX0lNQUdFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBBY3RpdmF0ZSBJbWFnZSBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfT1BDT0RFX0FDVElWQVRFX0lNQUdFX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkgICAgICAgICAgICAgLyoqPCBBY3RpdmF0ZSBJbWFnZSBSZXNwb25zZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGU7CisKKy8qKiBDVEMgUy9XIE1pcnJvciBBY3RpdmF0ZSBJbWFnZSBGbGFnLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfQUNUSVZBVEVfSU1BR0VfRkxBR19SVU5fQkFDS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgLyoqPCBSdW4gQmFja3VwLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWc7CisKKy8qKiBDVEMgUy9XIE1pcnJvciBBY2suIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2sKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX0FDS19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX0FDS19QQVJBTUVURVJfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUGFyYW1ldGVyIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfQUNLX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBOb3QgU3VwcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfQUNLX0xPQURJTkdfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBMb2FkaW5nIEZhaWx1cmUuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrOworCisvKiogS1QgT3B0aWNhbCBQb3dlciBBbGFybSBTdGF0dXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RPUFRJQ0FMX1BPV0VSX0FMQVJNX1NUQVRVU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQWxhcm0gaXMgYWN0aXZlIChsaW5lIExFRCBpcyBvcmFuZ2UpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUT1BUSUNBTF9QT1dFUl9BTEFSTV9TVEFUVVNfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IEFsYXJtIGlzIGNsZWFyIChsaW5lIExFRCBpcyBncmVlbikgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXM7CisKKy8qKiBLVCBMZWFmIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fT05VX0NPVU5URVJfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9OVSBDb3VudGVyIENsZWFyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX1JFU1RPUkVfT05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBSZXN0b3JlIE9OVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9UWFBPV0VSX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgVFggUG93ZXIgT2ZmLiAqLworfSBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbjsKKworLyoqIENUQyBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgR2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEdldCBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgU2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFNldCBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9PTlVfQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgT05VIEF1dGhlbnRpY2F0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NPRlRXQVJFX0RPV05MT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBTb2Z0d2FyZSBEb3dubG9hZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgQ2h1cm5pbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfREJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IERCQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9LVE9OVV9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgS1QgT05VIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAgICAgLyoqPCBFdmVudC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGU7CisKKy8qKiBLVCBPTlUgRXZlbnQgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfTE9PUF9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IExvb3AgRGV0ZWN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX09QVElDQUxfUE9XRVJfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBPcHRpY2FsIFBvd2VyIEFsYXJtLiAqLworfSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZTsKKworLyoqIEtUIExvb3AgRGV0ZWN0IEV2ZW50LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0tUTE9PUF9ERVRFQ1RfRVZFTlRfREVURUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IExvb3AgZGV0ZWN0IGRldGVjdGVkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTE9PUF9ERVRFQ1RfRVZFTlRfUkVQQUlSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IExvb3AgZGV0ZWN0IHJlcGFpcmVkICovCit9IGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50OworCisvKiogS1QgT3B0aWNhbCBQb3dlciBBbGFybSBFdmVudC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0tUT1BUSUNBTF9QT1dFUl9BTEFSTV9FVkVOVF9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9wdGljYWwgcG93ZXIgYWxhcm0gcmFpc2VkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUT1BUSUNBTF9QT1dFUl9BTEFSTV9FVkVOVF9SRUxFQVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IE9wdGljYWwgcG93ZXIgYWxhcm0gcmVsZWFzZWQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudDsKKworLyoqIERhc2FuIENsYXNzaWZpZXIgQ29tbWFuZC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1MiwgICAgICAgICAvKio8IEFkZCBGaWx0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9SRU1PVkVfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1MywgICAgICAgICAvKio8IFJlbW92ZSBGaWx0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9RVUVVRV9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1NCwgICAgICAgICAvKio8IFF1ZXVlIE1hcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX0FERF9QUklPUklUWV9GT1JfVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDU1ICAgICAgICAgIC8qKjwgQWRkIFByaW9yaXR5IGZvciBWTEFOLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kOworCisvKiogRGFzYW4gRGlyZWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fRElSRUNUSU9OX1VQU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0RJUkVDVElPTl9ET1dOU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0uICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb247CisKKy8qKiBEYXNhbiBGaWx0ZXIgRmllbGQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZAoreworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9GSUxURVJfRklFTERfRVRIRVJfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFdGhlclR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0ZJTFRFUl9GSUVMRF9WTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFZMQU4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0ZJTFRFUl9GSUVMRF9JUFBST1RPQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IElQIFByb3RvY29sLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkOworCisvKiogRGFzYW4gRmlsdGVyIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9GSUxURVJfQUNUSU9OX0RPX05PVF9QQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEbyBOb3QgUGFzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fRklMVEVSX0FDVElPTl9QQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgUGFzcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb247CisKKy8qKiBEYXNhbiBQcmkgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fUFJJX1RZUEVfQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQ29TLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9QUklfVFlQRV9UT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBUb1MuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZTsKKworLyoqIERhc2FuIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9QT1JUX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFBvcnQgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBTZXQgVkxBTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX0dFVF9PTlVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTMsICAgICAgICAgIC8qKjwgR2V0IE9OVSBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfU1RQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFNldCBTVFAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVFhQT1dFUl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IFNldCBUWCBQb3dlciBPZmYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IFNldCBMb29wIERldGVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9MT09QX0RFVEVDVF9VTkJMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgU2V0IExvb3AgRGV0ZWN0IFVuYmxvY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9DTEFTU0lGSUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0OCwgICAgICAgICAvKio8IENsYXNzaWZpZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMwNCwgICAgICAgICAvKio8IE9OVSBWZXJzaW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0ZMQVNIX0ZJUk1XQVJFX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMTEsICAgICAgICAgLyoqPCBPTlUgRmxhc2ggRmlybXdhcmUgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9BQ1RJVkVfSU1BR0VfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzE0LCAgICAgICAgIC8qKjwgT05VIEFjdGl2ZSBJbWFnZSBUaW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMDUsICAgICAgICAgLyoqPCBPTlUgU3RhdGlzdGljLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQ19DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMDYsICAgICAgICAgLyoqPCBPTlUgU3RhdGlzdGljIENsZWFyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQ19HRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMTksICAgICAgICAgLyoqPCBPTlUgU3RhdGlzdGljIEdldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9JR01QX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzA3LCAgICAgICAgIC8qKjwgT05VIElHTVAgU2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1BPUlRfSUdNUF9GSUxURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMDgsICAgICAgICAgLyoqPCBPTlUgUG9ydCBJZ21wIEZpbHRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TSEFQSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzE3ICAgICAgICAgIC8qKjwgT05VIFNoYXBpbmcuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGU7CisKKy8qKiBEYXNhbiBTdGF0cyBTZXEgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDBBTkQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUG9ydCAwIGFuZCAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9QT1JUMkFORDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBQb3J0IDIgYW5kIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IEVycm9ycy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlOworCisvKiogRGFzYW4gU3RhdCBJRC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZAoreworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVNfVFhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgRnJhbWVzIFRYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVNfVFhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBCcm9hZGNhc3QgRnJhbWVzIFRYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVNfUlhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgRnJhbWVzIFJYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVNfUlhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBCcm9hZGNhc3QgRnJhbWVzIFJYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1NZU1RFTV9GUkFNRVNfUlhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBTeXN0ZW0gRnJhbWVzIFJYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1NZU1RFTV9GUkFNRVNfUlhFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBTeXN0ZW0gRnJhbWVzIFJYIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1NZU1RFTV9PQ1RFVFNfUlhFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBTeXN0ZW0gT2N0ZXRzIFJYIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1NZU1RFTV9PQ1RFVFNfUlhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBTeXN0ZW0gT2N0ZXRzIFJYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1NZU1RFTV9GUkFNRV9UT09fTE9OR19FUlJPUlNfUlggICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBTeXN0ZW0gRnJhbWUgVG9vIExvbmcgRXJyb3JzIFJYLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1BPTl9GQ1NfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBQT04gRkNTIEVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9QT05fRVJST1JfT0NURVRTX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgIC8qKjwgUE9OIEVycm9yIE9jdGV0cyBSWC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWQ7CisKKy8qKiBTdGFuZGFyZCBkaXJlY3Rpb24gZW51bSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRElSRUNUSU9OX1VQU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RJUkVDVElPTl9ET1dOU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0uICovCit9IGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb247CisKKy8qKiBEb21haW4gT3B0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RPTUFJTl9PUFRJT05fREVGQVVMVF9TTk9PUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERlZmF1bHQgU25vb3BpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RPTUFJTl9PUFRJT05fRElTQUJMRV9ETl9BVVRPX1NOT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IERpc2FibGUgRG4gQXV0byBTbm9vcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRE9NQUlOX09QVElPTl9ESVNBQkxFX1VQX0FVVE9fU05PT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBVcCBBdXRvIFNub29wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9ET01BSU5fT1BUSU9OX1VOQkxPQ0tfTUxEX0lGX0xJTUlUX0VYQ0VFREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBVbmJsb2NrIE1sZCBJZiBMaW1pdCBFeGNlZWRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRE9NQUlOX09QVElPTl9QUk9YWV9KT0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgUHJveHkgSm9pbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRE9NQUlOX09QVElPTl9QUk9YWV9MRUFWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiAgICAgICAgICAgIC8qKjwgUHJveHkgTGVhdmUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uOworCisvKiogRFBvRSBMZWFmIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFU0VUX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBUaGlzIGF0dHJpYnV0ZSByZXNldHMgdGhlIE9OVSwgYXMgaWYgZnJvbSBwb3dlciBvbi4gICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU3LCAgICAgICAgICAvKio8IENsZWFyIER5biBMZWFybiBUYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfRFlOX01BQ19BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTgsICAgICAgICAgIC8qKjwgQWRkIER5biBNQUMgQWRkci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfRFlOX01BQ19BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTksICAgICAgICAgIC8qKjwgRGVsIER5biBNQUMgQWRkci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUSUNfTEVBUk5fVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjAsICAgICAgICAgIC8qKjwgQ2xlYXIgU3RhdGljIExlYXJuIFRhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MSwgICAgICAgICAgLyoqPCBBZGQgU3RhdGljIE1BQyBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MiwgICAgICAgICAgLyoqPCBEZWwgU3RhdGljIE1BQyBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NPTkZJR1VSRV9NQ0FTVF9MTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MywgICAgICAgICAgLyoqPCBDb25maWd1cmUgTWNhc3QgTExJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTMsICAgICAgICAgIC8qKjwgQ2xlYXIgU3RhdHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fUkVUUklFVkVfQ1VSUkVOVF9BTEFSTV9TVU1NQVJZICAgICAgICAgICAgICAgICAgICAgICAgID0gNzY5LCAgICAgICAgICAvKio8IFJldHJpZXZlIEN1cnJlbnQgQWxhcm0gU3VtbWFyeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9JTkdSRVNTX1JVTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgxLCAgICAgICAgIC8qKjwgQ2xlYXIgSW5ncmVzcyBSdWxlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfSU5HUkVTU19SVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgyLCAgICAgICAgIC8qKjwgQWRkIEluZ3Jlc3MgUnVsZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0lOR1JFU1NfUlVMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MywgICAgICAgICAvKio8IERlbCBJbmdyZXNzIFJ1bGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0VOQUJMRV9VU0VSX1RSQUZGSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MzcsICAgICAgICAgLyoqPCBFbmFibGUgVXNlciBUcmFmZmljLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RJU0FCTEVfVVNFUl9UUkFGRklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MzgsICAgICAgICAgLyoqPCBEaXNhYmxlIFVzZXIgVHJhZmZpYy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTM5LCAgICAgICAgIC8qKjwgTG9vcGJhY2sgRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NDAsICAgICAgICAgLyoqPCBMb29wYmFjayBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NDEgICAgICAgICAgLyoqPCBMYXNlciBUeCBQb3dlciBPZmYuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uOworCisvKiogRFBvRSBMb29wYmFjayBMb2NhdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xPT1BCQUNLX0xPQ0FUSU9OX1BIWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBQSFkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTE9PUEJBQ0tfTE9DQVRJT05fTUFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE1BQy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MT09QQkFDS19MT0NBVElPTl9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgTGluay4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb247CisKKy8qKiBEUG9FIExsaWQgQWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTExJRF9BQ1RJT05fQUREX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEFkZCBMbGlkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xMSURfQUNUSU9OX0RFTEVURV9MTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEZWxldGUgTGxpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MTElEX0FDVElPTl9ERUxFVEVfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgRGVsZXRlIEFsbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb247CisKKy8qKiBEUG9FIEFsYXJtIENvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBMT1MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9LRVlFWENIQU5HRV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IEtleUV4Y2hhbmdlIEZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9QT1JUX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgICAgICAgICAvKio8IFBvcnQgRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9QT1dFUl9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjUsICAgICAgICAgICAvKio8IFBvd2VyIEZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9TVEFUSVNUSUNTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgICAgICAvKio8IFN0YXRpc3RpY3MgQWxhcm0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9PTlVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMwLCAgICAgICAgICAvKio8IE9OVSBCdXN5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfTUFDX1RBQkxFX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSAgICAgICAgICAgLyoqPCBNYWMgVGFibGUgT3ZlcmZsb3cuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGU7CisKKy8qKiBEUG9FIExlYWYgQXR0cmlidXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFNlcXVlbmNlIE51bWJlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBGaXJtd2FyZSBJbmZvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NISVBfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBDaGlwIEluZm8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFURV9PRl9NQU5VRkFDVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IERhdGUgT2YgTWFudWZhY3R1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFOVUZBQ1RVUkVSX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IE1hbnVmYWN0dXJlciBJbmZvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9MT0dJQ0FMX0xJTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBNYXggTG9naWNhbCBMaW5rcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1fRVBPTl9QT1JUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgTnVtIEVQT04gUG9ydHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX1VOSV9QT1JUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IE51bSBVTkkgUG9ydHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUEFDS0VUX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IFBhY2tldCBCdWZmZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IFJlcG9ydCBUaHJlc2hvbGRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCBMaW5rIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09BTV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBPQU0gUmF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NRlJfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgTWZyIE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRldBUkVfTUZHX1RJTUVfVkFSX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IEZ3YXJlIE1mZyBUaW1lIFZhciBDdHJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RPTlVfUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBELU9OVSBQb3J0IFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVkVORE9SX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFZlbmRvciBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01PREVMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBNb2RlbCBOdW1iZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSFdfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IEh3IFZlcnNpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElORV9SQVRFX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IExpbmUgUmF0ZSBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQUJMRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NywgICAgICAgICAgLyoqPCBEeW4gTGVhcm4gVGFibGUgU2l6ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTgsICAgICAgICAgIC8qKjwgRHluIExlYXJuIEFnZSBMaW1pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTksICAgICAgICAgIC8qKjwgVGhpcyBhdHRyaWJ1dGUgcmVwcmVzZW50cyB0aGUgZHluYW1pY2FsbHkgbGVhcm5lZCBNQUMgYWRkcmVzcyBydWxlcyBvZiBvbmUgRXRoZXJuZXQgcG9ydC4gTUFDIGFkZHJlc3MgYXJlIHJlcGVhdGVkIHdpdGhpbiBhIHNpbmdsZSBhdHRyaWJ1dGUgdW50aWwgdGhhdCBhdHRyaWJ1dGUgaXMgZnVsbCAoMjEgYWRkcmVzc2VzID0gMTI2IGJ5dGVzKS4gSWYgbmVjZXNzYXJ5LCBzdWNoIGF0dHJpYnV0ZXMgYXJlIHJlcGVhdGVkIGFzIGFuIGF0dHJpYnV0ZSBsaXN0IHVudGlsIHRoZSBlbnRpcmUgdGFibGUgaGFzIGJlZW4gcmVwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYwLCAgICAgICAgICAvKio8IFRoaXMgYXR0cmlidXRlIHJlcHJlc2VudHMgdGhlIHN0YXRpY2FsbHkgcHJvdmlzaW9uZWQgTUFDIGFkZHJlc3MgdGFibGUuIFRoZSBkYXRhIHN0cnVjdHVyZSBpcyB0aGUgc2FtZSBhcyB0aGUgR2V0IER5bmFtaWMgTUFDIFRhYmxlIGF0dHJpYnV0ZSBhYm92ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0NBUEFCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjEsICAgICAgICAgIC8qKjwgUG9ydCBDYXBhYmlsaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MiwgICAgICAgICAgLyoqPCBEeW4gTGVhcm4gTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjMsICAgICAgICAgIC8qKjwgTWluIE1BQyBMaW1pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTUFDX0FMTE9XRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjQsICAgICAgICAgIC8qKjwgTWF4IE1BQyBBbGxvd2VkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NSwgICAgICAgICAgLyoqPCBBZ2cgTUFDIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NiwgICAgICAgICAgLyoqPCBMZW4gRXJyIERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY3LCAgICAgICAgICAvKio8IEZsb29kIFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTE9DQUxfU1dJVENISU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY4LCAgICAgICAgICAvKio8IExvY2FsIFN3aXRjaGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjksICAgICAgICAgIC8qKjwgUXVldWUgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0ZJTEVOQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3MCwgICAgICAgICAgLyoqPCBGaXJtd2FyZSBGaWxlbmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFDX1RBQkxFX0ZVTExfQkVIQVZJT1IgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzEsICAgICAgICAgIC8qKjwgVW5pIE1hYyBUYWJsZSBGdWxsIEJlaGF2aW9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQ0FTVF9MTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3MiwgICAgICAgICAgLyoqPCBPbnUgTWNhc3QgTExJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFDX0xFQVJORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzMsICAgICAgICAgIC8qKjwgVW5pIE1hYyBMZWFybmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQVhfRlJBTUVfU0laRV9DQVBBQklMSVRZICAgICAgICAgICAgICAgICAgICAgICA9IDI3NCwgICAgICAgICAgLyoqPCBPbnUgTWF4IEZyYW1lIFNpemUgQ2FwYWJpbGl0eS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFYX0ZSQU1FX1NJWkVfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzUsICAgICAgICAgIC8qKjwgVW5pIE1heCBGcmFtZSBTaXplIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxMywgICAgICAgICAgLyoqPCBSeCBVbmljYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTQsICAgICAgICAgIC8qKjwgVHggVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE1LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIFRvbyBTaG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTYsICAgICAgICAgIC8qKjwgUnggRnJhbWUgNjQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NTEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE3LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDY1XzEyNy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyODI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTgsICAgICAgICAgIC8qKjwgUnggRnJhbWUgMTI4XzI1NS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NjUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTksICAgICAgICAgIC8qKjwgUnggRnJhbWUgMjU2XzUxMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMjEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjAsICAgICAgICAgIC8qKjwgUnggRnJhbWUgNTEyXzEwMjMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0MTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTIxLCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDEwMjRfMTUxOC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjIsICAgICAgICAgIC8qKjwgUnggRnJhbWUgMTUxOSBQbHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyMywgICAgICAgICAgLyoqPCBUeCBGcmFtZSA2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1MTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjQsICAgICAgICAgIC8qKjwgVHggRnJhbWUgNjVfMTI3LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4MjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNSwgICAgICAgICAgLyoqPCBUeCBGcmFtZSAxMjhfMjU1LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2NTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNiwgICAgICAgICAgLyoqPCBUeCBGcmFtZSAyNTZfNTExLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNywgICAgICAgICAgLyoqPCBUeCBGcmFtZSA1MTJfMTAyMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjQxNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjgsICAgICAgICAgIC8qKjwgVHggRnJhbWUgMTAyNF8xNTE4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyOSwgICAgICAgICAgLyoqPCBUeCBGcmFtZSAxNTE5IFBsdXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVlfVEhSRVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTMwLCAgICAgICAgICAvKio8IFF1ZXVlIERlbGF5IFRocmVzaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzEsICAgICAgICAgIC8qKjwgUXVldWUgRGVsYXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTMyLCAgICAgICAgICAvKio8IEZyYW1lcyBEcm9wcGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JZVEVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzMywgICAgICAgICAgLyoqPCBCeXRlcyBEcm9wcGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JZVEVTX0RFTEFZRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzNCwgICAgICAgICAgLyoqPCBCeXRlcyBEZWxheWVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzNSwgICAgICAgICAgLyoqPCBUeCBCeXRlcyBVbnVzZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQxLCAgICAgICAgICAvKio8IE9wdCBNb24gVGVtcGVyYXR1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9WQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQyLCAgICAgICAgICAvKio8IE9wdCBNb24gVmNjLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVFhfQklBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0MywgICAgICAgICAgLyoqPCBPcHQgTW9uIFR4IEJpYXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9UWF9QT1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ0LCAgICAgICAgICAvKio8IE9wdCBNb24gVHggUG93ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9SWF9QT1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ1LCAgICAgICAgICAvKio8IE9wdCBNb24gUnggUG93ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1lFTExPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ2LCAgICAgICAgICAvKio8IFJ4IEZyYW1lcyBZZWxsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1lFTExPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ3LCAgICAgICAgICAvKio8IFR4IEZyYW1lcyBZZWxsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfR1JFRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ4LCAgICAgICAgICAvKio8IFR4IEJ5dGVzIEdyZWVuLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX1lFTExPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0OSwgICAgICAgICAgLyoqPCBSeCBCeXRlcyBZZWxsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfR1JFRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUwLCAgICAgICAgICAvKio8IFJ4IEJ5dGVzIEdyZWVuLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1lFTExPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1MSwgICAgICAgICAgLyoqPCBUeCBCeXRlcyBZZWxsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1VOSUNBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUyLCAgICAgICAgICAvKio8IFR4IEZyYW1lcyBVbmljYXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19NVUxUSUNBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1MywgICAgICAgICAgLyoqPCBUeCBGcmFtZXMgTXVsdGljYXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19CUk9BRENBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1NCwgICAgICAgICAgLyoqPCBUeCBGcmFtZXMgQnJvYWRjYXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19VTklDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1NSwgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgVW5pY2FzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfTVVMVElDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NTYsICAgICAgICAgIC8qKjwgUnggRnJhbWVzIE11bHRpY2FzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9CUk9BRENBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NTcsICAgICAgICAgIC8qKjwgUnggRnJhbWUgQnJvYWRjYXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTUJFUl9PRl9QUk9HUkFNTUFCTEVfQ09VTlRFUlMgICAgICAgICAgICAgICAgICAgICA9IDU1OCwgICAgICAgICAgLyoqPCBOdW1iZXIgT2YgUHJvZ3JhbW1hYmxlIENvdW50ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1OSwgICAgICAgICAgLyoqPCBMMkNQIEZyYW1lcyBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjAsICAgICAgICAgIC8qKjwgTDJDUCBPY3RldHMgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9GUkFNRVNfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTYxLCAgICAgICAgICAvKio8IEwyQ1AgRnJhbWVzIFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2MiwgICAgICAgICAgLyoqPCBMMkNQIE9jdGV0cyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19ESVNDQVJERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjMsICAgICAgICAgIC8qKjwgTDJDUCBGcmFtZXMgRGlzY2FyZGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX0RJU0NBUkRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2NCwgICAgICAgICAgLyoqPCBMMkNQIE9jdGV0cyBEaXNjYXJkZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfTDJFUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTY1LCAgICAgICAgICAvKio8IFR4IEwyIEVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9MMkVSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjYsICAgICAgICAgIC8qKjwgUnggTDIgRXJyb3JzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2OSwgICAgICAgICAgLyoqPCBQb3J0IFN0YXQgVGhyZXNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3MCwgICAgICAgICAgLyoqPCBMaW5rIFN0YXQgVGhyZXNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NVU1BFTkRfUkVTVU1FX0FMQVJNX1JFUE9SVElORyAgICAgICAgICAgICAgICAgICAgICA9IDc3MSwgICAgICAgICAgLyoqPCBTdXNwZW5kIC8gUmVzdW1lIEFsYXJtIFJlcG9ydGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9LRVlfRVhQSVJZX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDI1LCAgICAgICAgIC8qKjwgS2V5IEV4cGlyeSBUaW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMjYsICAgICAgICAgLyoqPCBFbmNyeXB0IE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MSwgICAgICAgICAvKio8IFBvcnQgSW5ncmVzcyBSdWxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyODIsICAgICAgICAgLyoqPCBMVUUgRmllbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUxUX0NWTEFOX0VUSEVSVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MywgICAgICAgICAvKio8IEFsdCBDIFZMQU4gRXRoZXJ0eXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FMVF9TVkxBTl9FVEhFUlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyODQsICAgICAgICAgLyoqPCBBbHQgUyBWTEFOIEV0aGVydHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JUE1DX0ZPUldBUkRJTkdfUlVMRV9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgPSAxMjg1LCAgICAgICAgIC8qKjwgSVBNQyBGb3J3YXJkaW5nIFJ1bGUgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjg2LCAgICAgICAgIC8qKjwgSS1UUElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JUUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyODcsICAgICAgICAgLyoqPCBCLVRQSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQkNfUkFURV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUzNywgICAgICAgICAvKio8IEJjIFJhdGUgTGltaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUzOCwgICAgICAgICAvKio8IEVncmVzcyBTaGFwaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MzksICAgICAgICAgLyoqPCBJbmdyZXNzIFBvbGljaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NDAsICAgICAgICAgLyoqPCBRdWV1ZSBDSVIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkVDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU0MSwgICAgICAgICAvKio8IEZFQyBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0VJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NDIsICAgICAgICAgLyoqPCBRdWV1ZSBFSVIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09MT1JfTUFSS0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU0MywgICAgICAgICAvKio8IFF1ZXVlIENvbG9yIE1hcmtpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfUkFURV9MSU1JVEVSX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICAgID0gMTU0NCwgICAgICAgICAvKio8IFF1ZXVlIFJhdGUgTGltaXRlciBDYXBhYmlsaXRpZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ09VUExJTkdfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU0NSwgICAgICAgICAvKio8IENvdXBsaW5nIEZsYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ0xPQ0tfVFJBTlNQT1JUX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5MywgICAgICAgICAvKio8IENsb2NrIFRyYW5zcG9ydCBDYXBhYmlsaXRpZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5BQkxFX0NMT0NLX1RSQU5TUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NCwgICAgICAgICAvKio8IEVuYWJsZSBDbG9jayBUcmFuc3BvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVElNRV9UUkFOU0ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NSwgICAgICAgICAvKio8IFRpbWUgVHJhbnNmZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFJPUEFHQVRJT05fUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NiwgICAgICAgICAvKio8IFByb3BhZ2F0aW9uIFBhcmFtZXRlcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlRUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NywgICAgICAgICAvKio8IFJUVC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDQ4LCAgICAgICAgIC8qKjwgREFDIENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT05fRkxBR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0OSwgICAgICAgICAvKio8IERBQyBDb25maWd1cmF0aW9uIEZsYWdzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19QQVNTV09SRF9DSEFMTEVOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNTAsICAgICAgICAgLyoqPCBEQUMgUGFzc3dvcmQgQ2hhbGxlbmdlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OX0VOQUJMRV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICA9IDIwNTEsICAgICAgICAgLyoqPCBEQUMgQ29uZmlndXJhdGlvbiBFbmFibGUgLyBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VORVJHWV9FRkZJQ0lFTlRfRVRIRVJORVRfU1RBVFVTICAgICAgICAgICAgICAgICAgICA9IDIwODAsICAgICAgICAgLyoqPCBFbmVyZ3kgRWZmaWNpZW50IEV0aGVybmV0IFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QV1JfT1ZFUl9FVEhFUk5FVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDgxLCAgICAgICAgIC8qKjwgUG93ZXIgT3ZlciBFdGhlcm5ldCBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUVESUFfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA4MiwgICAgICAgICAvKio8IE1lZGlhIFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX1BXUl9TQVZJTkdfQ0FQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU1MzVVICAgICAgICAvKio8IE9udSBQb3dlciBTYXZpbmcgQ2FwYWJpbGl0aWVzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZTsKKworLyoqIERQb0UgTGluayBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTElOS19TVEFURV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERpc2FibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTElOS19TVEFURV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IEVuYWJsZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZTsKKworLyoqIERQb0UgTGVhcm5pbmcgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBUk5JTkdfTU9ERV9ETU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IDgwMi4xZCBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQVJOSU5HX01PREVfTUFDX0FDQ0VTU19DT05UUk9MX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBNQUMgQWNjZXNzIENvbnRyb2wgTW9kZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZTsKKworLyoqIERQb0UgQnJhbmNoLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaAoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFN0YW5kYXJkIEF0dHJpYnV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgU3RhbmRhcmQgQWN0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNCwgICAgICAgICAgLyoqPCBPYmplY3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE1LCAgICAgICAgICAvKio8IEV4dGVuZGVkIEF0dHJpYnV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfUFJPR1JBTU1BQkxFX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTYsICAgICAgICAgIC8qKjwgUHJvZ3JhbW1hYmxlIENvdW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE3ICAgICAgICAgICAvKio8IEV4dGVuZGVkIEFjdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoOworCisvKiogRFBvRSBPYmplY3QgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTkVUV09SS19QT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE5ldHdvcmsgUE9OLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1VTRVJfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBVc2VyIFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFF1ZXVlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01FUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBNRVAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTUNBU1RfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IE11bHRpY2FzdCBMb2dpY2FsIExpbmsuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMwLCAgICAgICAgICAvKio8IEJyaWRnZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0VfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzEgICAgICAgICAgIC8qKjwgQnJpZGdlIFBvcnQuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlOworCisvKiogRFBvRSBFbmNyeXB0aW9uIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX09ORV9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IDFEb3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCAxMERvd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX1RFTl9CSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IDEwQmkuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZTsKKworLyoqIFJ1bGUgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9URVJNSU5BVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFRlcm1pbmF0b3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEhlYWRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ2xhdXNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBSZXN1bHQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAvKio8IEVudHJ5LiAqLworfSBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlOworCisvKiogRFBvRSBPQU0gZmllbGQgY29kZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9MT0dJQ0FMX0xJTktfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IExvZ2ljYWwgTGluayBJbmRleC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0wyREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTDIgREEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9MMlNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEwyIFNBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfTDJUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBMMiBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQkRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBCLURBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQlNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBCLVNBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfSVRBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBJLVRhZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX1NWTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgUy1WTEFOLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBDLVZMQU4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9NUExTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IE1QTFMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9JUFY0VE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IElQdjQgVE9TLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfSVBWNFRUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBJUHY0IFRUTC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQX1BST1RPQ09MX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgSVAgUHJvdG9jb2wgVHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQVjRTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgSVB2NCBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQVjZTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgSVB2NiBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQVjREQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgSVB2NCBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQVjZEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgSVB2NiBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQVjZORVhUX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgSVB2IDYgTmV4dCBIZWFkZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9JUFY2RkxPV19MQUJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IElQdiA2IEZsb3cgTGFiZWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9UQ1BfVURQX1NPVVJDRV9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IFRDUC9VRFAgU291cmNlIFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9UQ1BfVURQX0RFU1RfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IFRDUC9VRFAgRGVzdCBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQlRBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCBCLSBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9DVVNUT00wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgICAgICAvKio8IEN1c3RvbSAwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1VTVE9NMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgICAgICAgICAgLyoqPCBDdXN0b20gMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NVU1RPTTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAgICAgICAgIC8qKjwgQ3VzdG9tIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9DVVNUT00zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IEN1c3RvbSAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1VTVE9NNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgICAgICAgICAgLyoqPCBDdXN0b20gNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NVU1RPTTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgQ3VzdG9tIDUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9DVVNUT002ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgICAgICAgICAvKio8IEN1c3RvbSA2LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1VTVE9NNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgICAgICAgICAgLyoqPCBDdXN0b20gNy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9MTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMgICAgICAgICAgICAvKio8IExMSUQgVmFsdWUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGU7CisKKy8qKiBSdWxlIE9wZXJhdG9yLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfT1BFUkFUT1JfTkVWRVJfTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5ldmVyIE1hdGNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX0VRVUFMX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBFcXVhbCBUby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9PUEVSQVRPUl9OT1RfRVFVQUxfVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTm90IEVxdWFsIFRvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX0xFU1NfVEhBTl9PUl9FUVVBTF9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBMZXNzIFRoYW4gT3IgRXF1YWwgVG8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfT1BFUkFUT1JfR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEdyZWF0ZXIgVGhhbiBPciBFcXVhbCBUby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9PUEVSQVRPUl9FWElTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgRXhpc3RzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX05PVF9FWElTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBOb3QgRXhpc3RzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX0FMV0FZU19NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcgICAgICAgICAgICAgLyoqPCBBbHdheXMgTWF0Y2guICovCit9IGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yOworCisvKiogRFBvRSBPQU0gcnVsZSByZXN1bHQgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfTk9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTk9QLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBGb3J3YXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgU2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBDb3B5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBEZWxldGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0lOU0VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEluc2VydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgUmVwbGFjZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ0xFQVJfREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgQ2xlYXIgRGVsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DTEVBUl9JTlNFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgLyoqPCBDbGVhciBJbnNlcnQuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdDsKKworLyoqIERQb0UgTGF5ZXIgU2VsZWN0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdAoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xBWUVSX1NFTEVDVF9QUkVBTUJMRV9MMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBQcmVhbWJsZS9MMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfUFJFQU1CTEU4MDIxQUggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUHJlYW1ibGUvODAyLjFhaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfRVRIRVJUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRXRoZXJUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xBWUVSX1NFTEVDVF9TVkxBTl9UQUdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTLVZMQU4gVGFncy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfQ1ZMQU5fVEFHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgQy1WTEFOIFRhZ3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEFZRVJfU0VMRUNUX01QTFNfVEFHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IE1QTFMgVGFncy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfSVBWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgSVB2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfSVBWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgSVB2Ni4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfR0VORVJJQ19MMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgR2VuZXJpYyBMMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfVENQX1VEUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgVENQL1VEUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfR0VORVJJQ19MNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgIC8qKjwgR2VuZXJpYyBMNC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0OworCisvKiogVHJhZmZpYyBCaXRtYXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RSQUZGSUNfQklUTUFQX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fVFJBRkZJQ19CSVRNQVBfQlJPQURDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgQnJvYWRjYXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UUkFGRklDX0JJVE1BUF9NVUxUSUNBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBNdWx0aWNhc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RSQUZGSUNfQklUTUFQX0RSRVNFUlZFRF9HUk9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgICAgICAvKio8IDgwMi4xZCBSZXNlcnZlZCBHcm91cC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVFJBRkZJQ19CSVRNQVBfVU5JQ0FTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDgsICAgICAgIC8qKjwgVW5pY2FzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVFJBRkZJQ19CSVRNQVBfRkxPT0RFRF9VTklDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMTAgICAgICAgIC8qKjwgRmxvb2RlZCBVbmljYXN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXA7CisKKy8qKiBSYXRlIFVuaXRzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1JBVEVfVU5JVFNfS0JQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEticHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JBVEVfVU5JVFNfRlJBTUVTX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IEZyYW1lcy9zZWNvbmQuICovCit9IGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzOworCisvKiogRFBvRSBGRUMgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZFQ19NT0RFX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBObyBGRUMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GRUNfTU9ERV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRkVDIGlzIE9OIGZvciBhbGwgbGlua3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GRUNfTU9ERV9QRVJfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgRkVDIGlzIHNldHRhYmxlIHBlciBsaW5rICh3aXRoIHRoZSBQZXIgTGluayBtZXNzYWdlKSAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZTsKKworLyoqIERQb0UgUG9ydCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1BPUlRfVFlQRV9VTlNQRUNJRklFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBVbnNwZWNpZmllZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9QT1JUX1RZUEVfRU1UQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRU1UQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9QT1JUX1RZUEVfRVNUQl9JUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRVNUQi1JUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9QT1JUX1RZUEVfRVNUQl9EU0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgRVNUQi1EU0cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9SVF9UWVBFX0VURUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEVURUEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9SVF9UWVBFX0VTRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEVTRy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9QT1JUX1RZUEVfRVJPVVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgRSBSb3V0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9SVF9UWVBFX0VEVkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNyAgICAgICAgICAgICAvKio8IEVEVkEuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZTsKKworLyoqIERwb2UgSXBtYyBGb3J3YXJkaW5nIEZsYWdzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0lQTUNfRk9SV0FSRElOR19GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfSVBNQ19GT1JXQVJESU5HX0ZMQUdTX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IExMSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfSVBNQ19GT1JXQVJESU5HX0ZMQUdTX0wyREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgICAgICAvKio8IEwyIERBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0lQTUNfRk9SV0FSRElOR19GTEFHU19MMlNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNCwgICAgICAgLyoqPCBMMiBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9JUE1DX0ZPUldBUkRJTkdfRkxBR1NfSVBEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDgsICAgICAgIC8qKjwgSVAgREEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfSVBNQ19GT1JXQVJESU5HX0ZMQUdTX0lQU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDEwICAgICAgICAvKio8IElQIFNBLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3M7CisKKy8qKiBEUG9FIFBvd2VyIFNhdmluZyBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9XRVJfU0FWSU5HX01PREVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9XRVJfU0FWSU5HX01PREVfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1BPV0VSX1NBVklOR19NT0RFX1RSWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBUcnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9XRVJfU0FWSU5HX01PREVfVFhfVFJYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IFR4X1RyeC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGU7CisKKy8qKiBEUG9FIEVycm9yIENvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VSUk9SX0NPREVfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgICAgICAgICAgLyoqPCBObyBFcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX1RPT19MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAgICAgICAgIC8qKjwgVG9vIExvbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9CQURfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM0LCAgICAgICAgICAvKio8IEJhZCBQYXJhbXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9OT19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM1LCAgICAgICAgICAvKio8IE5vIFJlc291cmNlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX1NZU1RFTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzYsICAgICAgICAgIC8qKjwgU3lzdGVtIEJ1c3kuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9VTkRFVEVSTUlORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgICAgICAgICAvKio8IFVuZGV0ZXJtaW5lZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX1VOU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjEsICAgICAgICAgIC8qKjwgVW5zdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9DT1JSVVBURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYyLCAgICAgICAgICAvKio8IENvcnJ1cHRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX0hXX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjMsICAgICAgICAgIC8qKjwgSHcgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjQgICAgICAgICAgIC8qKjwgT3ZlcmZsb3cuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2Vycm9yX2NvZGU7CisKKy8qKiBEUG9FIEZpbGUgVHJhbnNmZXIgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEZpbGUgUmVhZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRmlsZSBXcml0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRmlsZSBEYXRhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBGaWxlIEFjay4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGU7CisKKy8qKiBEUG9FIEZpbGUgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RZUEVfQk9PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQm9vdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RZUEVfQVBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQXBwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFlQRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UWVBFX0RJQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IERpYWcuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZTsKKworLyoqIERQb0UgRmlsZSBUcmFuc2ZlciBFcnJvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBVbmRlZmluZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IE5vdCBGb3VuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX05PX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgTm8gQWNjZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBGdWxsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfSUxMRUdBTF9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBJbGxlZ2FsIE9wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfVU5LTk9XTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBVbmtub3duIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfQkFEX0JMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBCYWQgQmxvY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IEJ1c3kuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9JTkNPTVBBVElCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IEluY29tcGF0aWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX0NPUlJVUFRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSAgICAgICAgICAgIC8qKjwgQ29ycnVwdGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yOworCisvKiogRFBvRSBJbmZvIFRMViBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9JTkZPX1RMVl9UWVBFX0RQT0VfT0FNX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgIC8qKjwgRFBvRSBPQU0gU3VwcG9ydC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZTsKKworLyoqIERQb0UgTWNhc3QgQ3RybCBBY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9NQ0FTVF9DVFJMX0FDVElPTl9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQWRkIG9uZSBlbnRyeSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX01DQVNUX0NUUkxfQUNUSU9OX1JFTU9WRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEZWxldGUgb25lIGVudHJ5ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTUNBU1RfQ1RSTF9BQ1RJT05fQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IFJlbW92ZSBhbGwgZW50cmllcyAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbjsKKworLyoqIERwb2UgTWNhc3QgQ3RybCBSZXNwIENvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9NQ0FTVF9DVFJMX1JFU1BfQ09ERV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9NQ0FTVF9DVFJMX1JFU1BfQ09ERV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgU3VjY2Vzcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGU7CisKKy8qKiBEUG9FIE1jYXN0IFJlZyBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTUNBU1RfUkVHX0NPREVfREVSRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IERlcmVnaXN0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTUNBU1RfUkVHX0NPREVfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IFJlZ2lzdGVyLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZTsKKworLyoqIFBoeSB0eXBlIC0tIGNvcnJlc3BvbmRzIHRvIE9hbVBoeVR5cGUgaW4gT2FtLmggCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9QSFlfVFlQRV9PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE90aGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBOb25lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfVEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCAxMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX09ORV9IVU5EUkVEX1Q0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgMTAwIFQ0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfT05FX0hVTkRSRURfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCAxMDAgWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX09ORV9IVU5EUkVEX1QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgIC8qKjwgMTAwIFQyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfT05FX1RIT1VTQU5EX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAgICAgLyoqPCAxMDAwIFguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9QSFlfVFlQRV9PTkVfVEhPVVNBTkRfVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAsICAgICAgICAgICAvKio8IDEwMDAgVC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX1RFTl9HWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OCwgICAgICAgICAgIC8qKjwgMTBHIFguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9QSFlfVFlQRV9URU5fR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDksICAgICAgICAgICAvKio8IDEwRyBSLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfVEVOX1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwLCAgICAgICAgICAgLyoqPCAxMCBXLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfVEVOX0dUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1ICAgICAgICAgICAgLyoqPCAxMEcgVC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZTsKKworLyoqIE9BTSBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IERpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fU1RBVEVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBFbmFibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlOworCisvKiogTWF1IE1lZGlhIEF2YWlsYWJsZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBPdGhlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFVX01FRElBX0FWQUlMQUJMRV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFVX01FRElBX0FWQUlMQUJMRV9BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgQXZhaWxhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX05PVF9BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBOb3QgQXZhaWxhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX1JFTU9URV9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBSZW1vdGUgRmF1bHQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVV9NRURJQV9BVkFJTEFCTEVfSU5WX1NJR05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IEludiBTaWduYWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVV9NRURJQV9BVkFJTEFCTEVfUkVNT1RFX0pBQkJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFJlbW90ZSBKYWJiZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVV9NRURJQV9BVkFJTEFCTEVfUkVNT1RFX0xJTktfTE9TUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFJlbW90ZSBMaW5rIExvc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVV9NRURJQV9BVkFJTEFCTEVfUkVNT1RFX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFJlbW90ZSBUZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX09GRkxJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBPZmZsaW5lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX0FVVE9fTkVHX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExICAgICAgICAgICAgLyoqPCBBdXRvIE5lZyBFcnJvci4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGU7CisKKy8qKiBTdGQgQXV0byBOZWdvaXRhdGlvbiBDYXBhYmlsaXR5LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfR0xPQkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEdsb2JhbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgT3RoZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IDEwIFQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX1RGRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQyLCAgICAgICAgICAvKio8IDEwIFRGRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9PTkVfSFVORFJFRF9UNCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgMTAwIFQ0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX09ORV9IVU5EUkVEX1RYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgICAgICAgICAgLyoqPCAxMDAgVFguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfT05FX0hVTkRSRURfVFhGRCAgICAgICAgICAgICAgICAgICAgICAgID0gMjUyLCAgICAgICAgICAvKio8IDEwMCBUWEZELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX0ZEWF9QQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxMiwgICAgICAgICAgLyoqPCBGZHggUGF1c2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfRkRYX0FQQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEzLCAgICAgICAgICAvKio8IEZkeCBBIFBhdXNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX0ZEWF9TUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxNCwgICAgICAgICAgLyoqPCBGZHggUyBQYXVzZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9GRFhfQlBBVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTUsICAgICAgICAgIC8qKjwgRmR4IEIgUGF1c2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfT05FX0hVTkRSRURfVDIgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IDEwMCBUMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9PTkVfSFVORFJFRF9UMkZEICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjIsICAgICAgICAgIC8qKjwgMTAwIFQyIEZELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX09ORV9USE9VU0FORF9YICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAgICAgLyoqPCAxMDAwIFguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfT05FX1RIT1VTQU5EX1hGRCAgICAgICAgICAgICAgICAgICAgICAgID0gMzYyLCAgICAgICAgICAvKio8IDEwMDAgWEZELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX09ORV9USE9VU0FORF9UICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQwLCAgICAgICAgICAgLyoqPCAxMDAwIFQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfT05FX1RIT1VTQU5EX1RGRCAgICAgICAgICAgICAgICAgICAgICAgID0gNDAyLCAgICAgICAgICAvKio8IDEwMDAgVEZELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1JFTV9GQVVMVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3LCAgICAgICAgICAgLyoqPCBSZW0gRmF1bHQgMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9SRU1fRkFVTFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzIsICAgICAgICAgIC8qKjwgUmVtIEZhdWx0IDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCQVNFX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDgsICAgICAgICAgICAvKio8IDEwIEcgQmFzZSBYLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9HQkFTRV9MWDQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ4MSwgICAgICAgICAgLyoqPCAxMCBHIEJhc2UgTCBYNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9URU5fR0JBU0VfUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OSwgICAgICAgICAgIC8qKjwgMTAgRyBCYXNlIFIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCQVNFX0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDkxLCAgICAgICAgICAvKio8IDEwIEcgQmFzZSBFUi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9URU5fR0JBU0VfTFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OTIsICAgICAgICAgIC8qKjwgMTAgRyBCYXNlIExSLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9HQkFTRV9TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ5MywgICAgICAgICAgLyoqPCAxMCBHIEJhc2UgU1IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCQVNFX1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTAsICAgICAgICAgICAvKio8IDEwIEcgQmFzZSBXLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9HQkFTRV9FVyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwMSwgICAgICAgICAgLyoqPCAxMCBHIEJhc2UgRVcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCQVNFX0xXICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTAyLCAgICAgICAgICAvKio8IDEwIEcgQmFzZSBMVy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9URU5fR0JBU0VfU1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDMsICAgICAgICAgIC8qKjwgMTAgRyBCYXNlIFNXLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX0lTT19FVEhFUk5FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwMjkgICAgICAgICAgLyoqPCBJc28gRXRoZXJuZXQuICovCit9IGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5OworCisvKiogTUFDIER1cGxleCBTdGF0dXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX01BQ19EVVBMRVhfU1RBVFVTX09BTV9NQUNfRFVQTEVYX0hBTEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9BTSBNQUMgRHVwbGV4IEhhbGYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BQ19EVVBMRVhfU1RBVFVTX09BTV9NQUNfRFVQTEVYX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IE9BTSBNQUMgRHVwbGV4IEZ1bGwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BQ19EVVBMRVhfU1RBVFVTX09BTV9NQUNfRFVQTEVYX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IE9BTSBNQUMgRHVwbGV4IFVua25vd24uICovCit9IGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1czsKKworLyoqIEZFQyBTdXBwb3J0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydAoreworICAgIEJDTU9MVF9FUE9OX09BTV9GRUNfU1VQUE9SVF9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9GRUNfU1VQUE9SVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBTdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZFQ19TVVBQT1JUX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IE5vdCBTdXBwb3J0ZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydDsKKworLyoqIFN0ZCBGRUMgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9GRUNfTU9ERV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9GRUNfTU9ERV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEVuYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9GRUNfTU9ERV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IERpc2FibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlOworCisvKiogRFBvRSBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFJlc2VydmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBHZXQgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgR2V0IFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTZXQgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgU2V0IFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBEeW5hbWljIElQIE11bHRpY2FzdCBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBNY2FzdCBSZWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IE1jYXN0IFJlZyBSZXNwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBLZXkgRXhjaGFuZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IEZpbGUgVHJhbnNmZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IER5bmFtaWMgSVAgTXVsdGljYXN0IENvbnRyb2wgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IFN0YXRpYyBJUCBNdWx0aWNhc3QgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTF9SRVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiAgICAgICAgICAgIC8qKjwgU3RhdGljIElQIE11bHRpY2FzdCBDb250cm9sIFJlc3BvbnNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGU7CisKKy8qKiBEUG9FIFZlcnNpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1ZFUlNJT05fRFBPRTEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEUG9FIDEuMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9WRVJTSU9OX1BSRV9EUE9FX1dJVEhPVVRfQ0VSVElGSUNBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgUHJlLURQb0UgV2l0aG91dCBDZXJ0aWZpY2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9WRVJTSU9OX1BSRV9EUE9FX1dJVEhfQ0VSVElGSUNBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgUHJlLURQb0UgV2l0aCBDZXJ0aWZpY2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9WRVJTSU9OX0RQT0UxMEkwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgRFBvRSAxLjAgSTA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1ZFUlNJT05fRFBPRTEwSTA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBEUG9FIDEuMCBJMDUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfVkVSU0lPTl9EUE9FMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIgICAgICAgICAgICAvKio8IERQb0UgMi4wLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uOworCisvKiogRUFQIENvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTdWNjZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgLyoqPCBGYWlsdXJlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGU7CisKKy8qKiBUTFMgU3VidHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX1NVQlRZUEVfQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMyAgICAgICAgICAgIC8qKjwgQXV0aGVudGljYXRpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZTsKKworLyoqIFRMUyBGbGFncy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0ZMQUdTX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMjAsICAgICAgIC8qKjwgU3RhcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19GTEFHU19NT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDQwLCAgICAgICAvKio8IE1vcmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19GTEFHU19MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDgwICAgICAgICAvKio8IExlbmd0aC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFnczsKKworLyoqIFRMUyBDb250ZW50IFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9DSEFOR0VfQ0lQSEVSX1NQRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgQ2hhbmdlIENpcGhlciBTcGVjLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FMRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCBBbGVydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgSGFuZHNoYWtlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzICAgICAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBEYXRhLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZTsKKworLyoqIFRMUyBIYW5kc2hha2UgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9IRUxMT19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEhlbGxvIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DTElFTlRfSEVMTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IENsaWVudCBIZWxsby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9IRUxMTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU2VydmVyIEhlbGxvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBDZXJ0aWZpY2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9LRVlfRVhDSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgU2VydmVyIEtleSBFeGNoYW5nZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgQ2VydGlmaWNhdGUgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9IRUxMT19ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgU2VydmVyIEhlbGxvIERvbmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURV9WRVJJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IENlcnRpZmljYXRlIFZlcmlmeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NMSUVOVF9LRVlfRVhDSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgQ2xpZW50IEtleSBFeGNoYW5nZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0ZJTklTSEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCAgICAgICAgICAgIC8qKjwgRmluaXNoZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGU7CisKKy8qKiBUTFMgQ2lwaGVyc3VpdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0lQSEVSU1VJVEVfVExTX05VTExfV0lUSF9OVUxMX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBUTFMgTnVsbCBXaXRoIE51bGwgTnVsbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NJUEhFUlNVSVRFX1RMU19SU0FfV0lUSF9OVUxMX01ENSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVExTIFJTQSBXaXRoIE51bGwgTUQ1LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0lQSEVSU1VJVEVfVExTX1JTQV9XSVRIX05VTExfU0hBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBUTFMgUlNBIFdpdGggTnVsbCBTSEEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DSVBIRVJTVUlURV9UTFNfUlNBX1dJVEhfUkM0MTI4TUQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFRMUyBSU0EgV2l0aCBSQzQgMTI4IE1ENS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NJUEhFUlNVSVRFX1RMU19SU0FfV0lUSF9SQzQxMjhTSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgVExTIFJTQSBXaXRoIFJDNCAxMjggU0hBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0lQSEVSU1VJVEVfVExTX1JTQV9XSVRIX0lERUFfQ0JDX1NIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBUTFMgUlNBIFdpdGggSURFQSBDQkMgU0hBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0lQSEVSU1VJVEVfVExTX1JTQV9XSVRIX0RFU19DQkNfU0hBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBUTFMgUlNBIFdpdGggREVTIENCQyBTSEEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DSVBIRVJTVUlURV9UTFNfUlNBX1dJVEgzREVTX0VERV9DQkNfU0hBICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAvKio8IFRMUyBSU0EgV2l0aCAzREVTIEVERSBDQkMgU0hBLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlOworCisvKiogVExTIENvbXByZXNzaW9uIE1ldGhvZC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZAoreworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09NUFJFU1NJT05fTUVUSE9EX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgLyoqPCBOdWxsLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZDsKKworLyoqIFRMUyBDZXJ0aWZpY2F0ZSBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0VSVElGSUNBVEVfVFlQRV9SU0FfU0lHTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBSU0EgU2lnbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NFUlRJRklDQVRFX1RZUEVfRFNTX1NJR04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRFNTIFNpZ24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DRVJUSUZJQ0FURV9UWVBFX1JTQV9GSVhFRF9ESCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFJTQSBGaXhlZCBESC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NFUlRJRklDQVRFX1RZUEVfRFNTX0ZJWEVEX0RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgRFNTIEZpeGVkIERILiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0VSVElGSUNBVEVfVFlQRV9SU0FfRVBIRU1FUkFMX0RIUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBSU0EgRXBoZW1lcmFsIERIIChSRVNFUlZFRCkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DRVJUSUZJQ0FURV9UWVBFX0RTU19FUEVIRU1FUkFMX0RIUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IERTUyBFcGVoZW1lcmFsIERIIChSRVNFUlZFRCkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DRVJUSUZJQ0FURV9UWVBFX0ZPUlRFWlpBX0RNU19SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAgICAgICAgICAgICAvKio8IEZvcnRlenphIERNUyAoUkVTRVJWRUQpLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGU7CisKKy8qKiBFQVBPTCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9lYXBvbF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFBhY2tldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgU3RhcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTE9HT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IExvZ29mZi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgS2V5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0FTRl9BTEVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBBU0YgQWxlcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTUtBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAvKio8IE1LQS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGU7CisKKy8qKiBFQVBPTCBWZXJzaW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1ZFUlNJT05fVkVSU0lPTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IFZlcnNpb24gMi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb247CisKKy8qKiBFUE9DIENNQyBTdGF0IEluZGV4LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfVEJNX1VQX09LX1NETV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFRyYW5zbWl0IHBhY2tldCBmcm9tIFNETSB1cHN0cmVhbSB3aXRoIGdvb2QgdGltZXN0YW1wPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1RCTV9VUF9PS19DTUlfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBUcmFuc21pdCBwYWNrZXQgZnJvbSBDTUkgdXBzdHJlYW0gd2l0aCBnb29kIHRpbWVzdGFtcDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9UQk1fVVBfRFJPUFBFRF9TRE1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU3RhdGlzdGljIGZvciBkcm9wcGluZyBmcmFtZSBkdWUgdG8gdGltZXN0YW1wIGVycm9yICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfVEJNX1VQX0RST1BQRURfQ01JX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFN0YXRpc3RpYyBmb3IgZHJvcHBpbmcgZnJhbWUgZHVlIHRvIHRpbWVzdGFtcCBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1RCTV9ET1dOX09LX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBTdGF0aXN0aWMgcmVjaWV2aW5nIGZyYW1lIGRvd25zdHJlYW0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9UQk1fRE9XTl9EUk9QUEVEX0NSQzhGUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgRHJvcCBmcmFtZSBiZWNhdXNlIG9mIENSQyA4IGVycm9yICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfVEJNX0RPV05fRFJPUFBFRF9MSU5FQ09ERV9GUkFNRVMgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IERyb3AgZnJhbWUgYmVjYXVzZSBvZiBsaW5lIGNvZGluZyBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1RCTV9ET1dOX0RST1BQRURfTUFYU0laRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBEcm9wIGZyYW1lIGZvciBiZWluZyB0b28gbG9uZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0dGSV9ET1dOX1RJTUVfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBWYWxpZCBUaW1lc3RhbXAgVXBkYXRlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfR0ZJX0RPV05fR1JBTlRfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFZhbGlkIEdyYW50IFJlY2VpdmVkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfR0ZJX0RPV05fRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9HRklfR0FURV9ESUZfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfR0ZJX0dSVF9QSFlfRElTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9HRklfR1JUX0RJU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0dGSV9HUlRfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfR0ZJX0dSVF9UVU5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IFN0YXRpc3RpYyB0aGF0IGNvdW50cyBkaXNjb3ZlcnkgZ2F0ZXMgY29udmVydGVkIHRvIHR1bmluZyBncmFudHMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9TRElfUlhfUEFDS0VUX09WRVJfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgVGhpcyBpbmRpY2F0ZXMgYW4gZG93biBidXJzdCBoZWFkZXIgd2l0aCBhIGdvb2QgQ1JDIDMyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1NESV9ET1dOX0NSQzMyRFJPUFBFRF9IRUFERVJTICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBUaGlzIGluZGljYXRlcyBhbiBkb3duIGJ1cnN0IGhlYWRlciB3aXRoIGEgZ29vZCBDUkMgMzIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfU0RJX0RPV05fT0tfSEVBREVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IENvdW50IGdvb2QgYnVyc3QgaGVhZGVycyA8U3RhdEluZm8gIElzTWlycm9yPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9GRUNfVVBfQkFEX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJUcnVlIiBJc1JhdGU9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0ZFQ19VUF9DT1JSRUNURURfQkxPQ0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IlRydWUiIElzUmF0ZT0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfRkVDX1VQX09LX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iVHJ1ZSIgSXNSYXRlPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9GRUNfVVBfRVJSX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJUcnVlIiBJc1JhdGU9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0ZFQ19VUF9FUlJfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IlRydWUiIElzUmF0ZT0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREVGX1VQX0NSQzMyRlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgICAgICAvKio8IFdlIGNoZWNrIHRoZSBDUkMgMzIgb24gdXBzdHJlYW0gZnJhbWVzLiBUaGlzIGluZGljYXRlcyBhIGZyYW1lIGRpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREVGX1VQX09LX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgICAgICAvKio8IE51bWJlciBvZiBnb29kIHBhY2tldHMgaW4gdGhlIHVwc3RyZWFtIHJ4ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREVGX1VQX0NSQzhGUkFNRVNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgICAgICAgICAvKio8IE51bWJlciBvZiBjcmMtOCBlcnJvcnMgaW4gdGhlIHVwc3RyZWFtIHJ4ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfQ01JX1VQX0RST1BQRURfTUFYU0laRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IERyb3AgZnJhbWUgZm9yIGJlaW5nIHRvbyBsb25nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfQ01JX1VQX09LX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgICAgICAgICAvKio8IFN0YXRpc3RpYyByZWNpZXZpbmcgZnJhbWUgdXBzdHJlYW0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9DTUlfVVBfRFJPUFBFRF9DUkM4RlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgRHJvcCBmcmFtZSBiZWNhdXNlIG9mIENSQyA4IGVycm9yICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfQ01JX1VQX0RST1BQRURfTElORUNPREVfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgICAgICAgICAvKio8IERyb3AgZnJhbWUgYmVjYXVzZSBvZiBsaW5lIGNvZGluZyBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0RGSV9ET1dOX09LX01QQ1BfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgICAgICAgICAgLyoqPCBFbnF1ZXVlZCBNUENQIGZyYW1lICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREZJX0RPV05fT0tfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IEVucXVldWVkIE9hbSBGcmFtZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0RGSV9ET1dOX09LX0RBVEFfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAgICAgLyoqPCBFbnF1ZXVlZCBEYXRhIGZyYW1lICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREZJX0RPV05fRFJPUFBFRF9NUENQX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgICAgICAgICAvKio8IE92ZXJydW4gTVBDUCBmaWZvICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREZJX0RPV05fRFJPUFBFRF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgICAvKio8IE92ZXJydW4gT2FtIGZpZm8gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9ERklfRE9XTl9EUk9QUEVEX0RBVEFfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAgICAgICAgIC8qKjwgT3ZlcnJ1biBkYXRhIGZpZm8gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9TRE1fRE9XTl9TWU1CT0xfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAgICAgICAgIC8qKjwgSG93IG1hbnkgc3ltYm9scyBoYXZlIGdvbmUgYnkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9TRVNfRE9XTl9TWU1CT0xfQ09MTEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAgICAgICAgIC8qKjwgSG93IG1hbnkgc3ltYm9scyBoYXZlIHdlIGNvbGxlY3RlZCBzdGF0cyBvbiA/ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfU0VTX0RPV05fU1lNQk9MX0JJVF9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzksICAgICAgICAgICAvKio8IENvdW50IG9mIGJpdCBlcnJvcnMgaW4gY29sbGVjdGVkIHN5bWJvbHMuIFVzZWQgdG8gdmVyaWZ5IGNvbGxlY3RvciB3b3JraW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfRlJBX0dSQU5UX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iRmFsc2UiIElzUmF0ZT0iRmFsc2UiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0ZSQV9QS1RfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxICAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IkZhbHNlIiBJc1JhdGU9IkZhbHNlIj4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXg7CisKKy8qKiBFUE9DIENOVSBTdGF0IEluZGV4LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRU1JX1VQX0RST1BQRURfTElORUNPREVfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERyb3AgZnJhbWUgYmVjYXVzZSBvZiBsaW5lIGNvZGluZyBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0VNSV9VUF9EUk9QUEVEX0NSQzhGUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEcm9wIGZyYW1lIGJlY2F1c2Ugb2YgQ1JDIDggZXJyb3IgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9FTUlfVVBfT0tfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0gZ29vZCBwYWNrZXQgY291bnQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9FTUlfVVBfRFJPUFBFRF9NQVhTSVpFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgTWF4IEZyYW1lIFNpemUgUGFja2V0IERyb3AgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9HUFJfRE9XTl9PQU1fVElNRV9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgR3ByIE9hbSBUaW1lIFBlYWsgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9HUFJfRE9XTl9NUENQX1RJTUVfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgR3ByIE1wY3AgVGltZSBQZWFrICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfR1BSX0RPV05fREFUQV9USU1FX1BFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IEdwciBEYXRhIFRpbWUgUGVhayAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0dQUl9HUlRfUEhZX0RJU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfR1BSX0dSVF9UVU5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9HUFJfR1JUX0RJU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0dQUl9HUlRfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfR1BSX01QQ1BfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IERpZmZlcmVuY2UgYmV0d2VlbiBsb2NhbCBNUENQIHRpbWUgcmVmZXJlbmNlIGFuZCB1cGRhdGUgdG8gdGhlIE9OVSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0dQUl9HQVRFX0RJRkZfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCBEaWZmZXJlbmNlIGJldHdlZW4gbG9jYWwgTVBDUCB0aW1lIHJlZmVyZW5jZSBhbmQgdXBkYXRlIHRvIHRoZSBPTlUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9TRElfUlhfTk9fVkxEX0NOVF9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgU2RpUnhOb1ZsZENudFBlYWsuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfU0RJX1JYX1BBQ0tFVF9PVkVSX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9TRElfRE9XTl9DUkMzMkRST1BQRURfSEVBREVSUyAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgVGhpcyBpbmRpY2F0ZXMgYW4gZG93biBidXJzdCBoZWFkZXIgd2l0aCBhIGdvb2QgQ1JDIDMyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX1NESV9ET1dOX09LX0hFQURFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBDb3VudCBnb29kIGJ1cnN0IGhlYWRlcnMgPFN0YXRJbmZvICBJc01pcnJvcj0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRkVDX0RPV05fQkFEX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iVHJ1ZSIgSXNSYXRlPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9GRUNfRE9XTl9DT1JSRUNURURfQkxPQ0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJUcnVlIiBJc1JhdGU9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0ZFQ19ET1dOX09LX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IlRydWUiIElzUmF0ZT0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRkVDX0RPV05fRVJSX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iVHJ1ZSIgSXNSYXRlPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9GRUNfRE9XTl9FUlJfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJUcnVlIiBJc1JhdGU9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RFRl9ET1dOX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZ29vZCBwYWNrZXRzIGluIHRoZSB1cHN0cmVhbSByeCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RFRl9ET1dOX0NSQzhGUkFNRVNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY3JjLTggZXJyb3JzIGluIHRoZSB1cHN0cmVhbSByeCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RFRl9ET1dOX0NSQzMyRlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCBDUkMgMzIgRXJyb3IgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9SUFJfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgIC8qKjwgUnByRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX1NETV9ET1dOX1NZTUJPTF9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBIb3cgbWFueSBzeW1ib2xzIGhhdmUgZ29uZSBieSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX1NFU19ET1dOX1NZTUJPTF9DT0xMRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAgICAgLyoqPCBIb3cgbWFueSBzeW1ib2xzIGhhdmUgd2UgY29sbGVjdGVkIHN0YXRzIG9uID8gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9TRVNfRE9XTl9TWU1CT0xfQklUX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAgICAgICAgIC8qKjwgQ291bnQgb2YgYml0IGVycm9ycyBpbiBjb2xsZWN0ZWQgc3ltYm9scy4gVXNlZCB0byB2ZXJpZnkgY29sbGVjdG9yIHdvcmtpbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9ERk9fRE9XTl9PS19NUENQX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgRW5xdWV1ZWQgTVBDUCBmcmFtZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RGT19ET1dOX09LX09BTV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAgICAgLyoqPCBFbnF1ZXVlZCBPYW0gZnJhbWUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9ERk9fRE9XTl9PS19EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAgICAgICAgIC8qKjwgRW5xdWV1ZWQgZGF0YSBmcmFtZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RGT19ET1dOX0RST1BQRURfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgICAgICAgICAgLyoqPCBPdmVycnVuIE1QQ1AgZmlmbyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RGT19ET1dOX0RST1BQRURfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAgICAgLyoqPCBPdmVycnVuIE9hbSBmaWZvICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfREZPX0RPV05fRFJPUFBFRF9EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgICAgICAgICAvKio8IE92ZXJydW4gZGF0YSBmaWZvICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRlJBX0dSQU5UX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iRmFsc2UiIElzUmF0ZT0iRmFsc2UiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0ZSQV9QS1RfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IkZhbHNlIiBJc1JhdGU9IkZhbHNlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9VRk9fVVBfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJGYWxzZSIgSXNSYXRlPSJGYWxzZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfVUZPX1VQX0ZSQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzggICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iRmFsc2UiIElzUmF0ZT0iRmFsc2UiPiAqLworfSBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleDsKKworLyoqIEVQT0MgU0RNIDI1MCBTdGF0IEluZGV4LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXgKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX1NMSURFX0RJRkZfQ05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU2xpZGVEaWZmQ250LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfREFDX0NMSVBfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEYWNDbGlwSS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX0RBQ19DTElQX1EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRGFjQ2xpcFEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9EMkFfQ0xLX0VSUl9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEQyYUNsa0VyckEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9EMkFfQ0xLX0VSUl9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEQyYUNsa0VyckIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9SWF9ERU1fU1lOQ19ERVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEluY3JlbWVudHMgd2hlbiB0aGUgU0RNIHNlZXMgYSBzeW5jIHB1bHNlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9SWF9ERU1fTk9UNFNZTkNfREVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IEluY3JlbWVudHMgd2hlbiB0aGUgU0RNIHNlZXMgYSBzeW5jLCBidXQgaXQgaXMgbm90IGZvbGxvd2VkIGJ5IDQgb3RoZXIgc3luY3Mgd2l0aGluIDMyIHVzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9KQ1BMTF9VTkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFRoZSBKQyBQTEwgbG9jayBzaWduYWwgdHJhbnNpdGlvbmVkIGZyb20gaGlnaCB0byBsb3cgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX1JGUExMX1VOTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgVGhlIFJGIFBMTCBsb2NrIHNpZ25hbCB0cmFuc2l0aW9uZWQgZnJvbSBoaWdoIHRvIGxvdyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfU0RNX1JYX0JVUlNUX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBUaGUgUkYgUExMIGxvY2sgc2lnbmFsIHRyYW5zaXRpb25lZCBmcm9tIGhpZ2ggdG8gbG93ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9TRE1fVFhfQlVSU1RfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IFRoZSBSRiBQTEwgbG9jayBzaWduYWwgdHJhbnNpdGlvbmVkIGZyb20gaGlnaCB0byBsb3cgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX0EyRF9NSU5fUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfQTJEX01BWF9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9EMkFfSU1BWF9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX0QyQV9JTUlOX1BFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfRDJBX1FNQVhfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9EMkFfUU1JTl9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX1FFU19ET1dOX1NZTUJPTF9DT0xMRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgSG93IG1hbnkgc3ltYm9scyBoYXZlIHdlIGNvbGxlY3RlZCBzdGF0cyBvbiA/ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9NSUZfVFhfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX01JRl9SWF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfTUlGX0JVUlNUX1RZUEVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9NSUZfQlVSU1RfVFlQRV9ESVNDT1ZFUlkgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX01JRl9CVVJTVF9UWVBFX1RVTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfTUlGX0JVUlNUX1RZUEVfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9NSUZfQlVSU1RfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX1NMSURFX0xPU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgIC8qKjwgU2xpZGUgd2FzIGdvb2QsIGJ1dCB0aGVuIHByZWFtYmxlIGJhZCBoYXBwZW5lZCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfU0xJREVfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBXaGlsZSB3YWl0aW5nIGZvciBzeW5jcyBvbiB0aGUgbmV4dCBTRiwgZGlkbid0IHNlZSB0aGVtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9TTElERV9TVEVBRFlfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IHdhc24ndCBhYmxlIHRvIGdldCByeCBzbGlkZSBnb29kIGluIHJ4IHNsaWRlIHdhaXQgdGltZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfU0xJREVfU1lOQ19XQUlUX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4ICAgICAgICAgICAgLyoqPCBXaGVuIHdhaXRpbmcgZm9yIHRoZSBuZXh0IHN5bmMgcHVsc2UgKHdpdGhpbiBhIGZldyBzeW1ib2xzKSB3ZSBkaWRuJ3Qgc2VlIGl0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4OworCisvKiogRVBPQyBTdGF0IEdhdGhlciBNb2Rlcy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2RlcworeworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NUQVRfR0FUSEVSX01PREVTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU1RBVF9HQVRIRVJfTU9ERVNfR0VUX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IEdldCBDb3VudGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NUQVRfR0FUSEVSX01PREVTX0NMRUFSX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBDbGVhciBDb3VudGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NUQVRfR0FUSEVSX01PREVTX0dFVF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNCAgICAgICAgLyoqPCBHZXQgUmF0ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXM7CisKKy8qKiBQcm90b2NvbCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFplcm8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVBWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0OCwgICAgICAgICAvKio8IElQdjQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQVJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1NCwgICAgICAgICAvKio8IEFSUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9DVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMzAyNFUsICAgICAgIC8qKjwgQy1WTEFOLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0NTI1VSwgICAgICAgLyoqPCBJUHY2LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX01QQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0ODI0VSwgICAgICAgLyoqPCBNUENQLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NMT1dfUFJPVE9DT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0ODI1VSwgICAgICAgLyoqPCBTbG93IFByb3RvY29sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NWTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0OTg0VSwgICAgICAgLyoqPCBTLVZMQU4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfRUFQT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQ5NThVLCAgICAgICAvKio8IEVBUE9MLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lUQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1MDQ3VSwgICAgICAgLyoqPCBJLVRhZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9MT09QQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjg2NFUgICAgICAgIC8qKjwgTG9vcGJhY2suICovCit9IGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlOworCisvKiogU2xvdyBQcm90b2NvbCBTdWJ0eXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTEFDUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTEFNUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgT0FNLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgLyoqPCBPcmdhbml6YXRpb24gU3BlY2lmaWMuICovCit9IGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGU7CisKKy8qKiBPQU0gRmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MSU5LX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IExpbmsgRmF1bHQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19EWUlOR19HQVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgICAgICAvKio8IER5aW5nIEdhc3AuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19DUklUSUNBTF9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgICAgICAvKio8IENyaXRpY2FsIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfRVZBTFVBVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwOCwgICAgICAgLyoqPCBMb2NhbCBFdmFsdWF0aW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfU1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAxMCwgICAgICAgLyoqPCBMb2NhbCBTdGFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfRVZBTFVBVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDIwLCAgICAgICAvKio8IFJlbW90ZSBFdmFsdWF0aW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX1NUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDA0MCAgICAgICAgLyoqPCBSZW1vdGUgU3RhYmxlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzOworCisvKiogT0FNIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJbmZvcm1hdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9FVkVOVF9OT1RJRklDQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRXZlbnQgTm90aWZpY2F0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBWYXJpYWJsZSBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBWYXJpYWJsZSBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgTG9vcGJhY2sgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTQgICAgICAgICAgIC8qKjwgT3JnYW5pemF0aW9uIFNwZWNpZmljLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZTsKKworLyoqIEluZm9ybWF0aW9uIFRMViBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTG9jYWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfUkVNT1RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFJlbW90ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTQgICAgICAgICAgIC8qKjwgT3JnYW5pemF0aW9uIFNwZWNpZmljLiAqLworfSBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZTsKKworLyoqIFRlayBJbmZvIFRMViBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBLZXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0FMQVJNX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEFsYXJtIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0VYVEVOU0lPTl9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IEV4dGVuc2lvbiBTdXBwb3J0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGU7CisKKy8qKiBUZWsgUmVwb3J0IE1vZGVzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1JFUE9SVF9NT0RFU19TSU1QTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAsICAgICAgIC8qKjwgVXAgdG8gNCBxdWV1ZSBzZXRzLCAxIHByaW9yaXR5IHZhbHVlICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfVEVLTk9WVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IFVwIHRvIDQgcXVldWUgc2V0cywgMSBwcmlvcml0eSB2YWx1ZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUkVQT1JUX01PREVTX0NUQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCAxIHF1ZXVlIHNldCwgOCBwcmlvcml0eSB2YWx1ZXMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1JFUE9SVF9NT0RFU19OVFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQsICAgICAgIC8qKjwgTlRUICgyIHF1ZXVlIHNldHMsIHJldmVyc2VkLCBzdWJ0cmFjdCBncmFudGVkIGRhdGEpICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfTUFOVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA4LCAgICAgICAvKio8IEFzIHNwZWNpZmllZCBpbiBPTlUgcGVyc29uYWxpdHkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1JFUE9SVF9NT0RFU19URE1fTk9fRk9SQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMTAgICAgICAgIC8qKjwgVERNIE5vIEZvcmNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlczsKKworLyoqIExvY2FsL1JlbW90ZSBJbmZvIFN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9MT0NBTF9SRU1PVEVfSU5GT19TVEFURV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX1NUQVRFX1BBUlNFUl9BQ1RJT04wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IFBhcnNlciBBY3Rpb24gMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fU1RBVEVfUEFSU0VSX0FDVElPTjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgICAgIC8qKjwgUGFyc2VyIEFjdGlvbiAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MT0NBTF9SRU1PVEVfSU5GT19TVEFURV9NVUxUSVBMRVhFUl9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNCAgICAgICAgLyoqPCBNdWx0aXBsZXhlciBBY3Rpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZTsKKworLyoqIExvY2FsL1JlbW90ZSBJbmZvIENvbmZpZy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fQ09ORklHX09BTV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgT0FNIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19VTklESVJFQ1RJT05BTF9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgICAgICAvKio8IFVuaWRpcmVjdGlvbmFsIFN1cHBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19PQU1fUkVNT1RFX0xPT1BCQUNLX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgICAgICAvKio8IE9BTSBSZW1vdGUgTG9vcGJhY2sgU3VwcG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fQ09ORklHX0xJTktfRVZFTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDgsICAgICAgIC8qKjwgTGluayBFdmVudHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19WQVJJQUJMRV9SRVRSSUVWQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDEwICAgICAgICAvKio8IFZhcmlhYmxlIFJldHJpZXZhbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZzsKKworLyoqIExpbmsgRXZlbnQgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfU1lNQk9MX1BFUklPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRXJyb3JlZCBTeW1ib2wgUGVyaW9kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBFcnJvcmVkIEZyYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRV9QRVJJT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBFcnJvcmVkIEZyYW1lIFBlcmlvZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUVfU0VDT05EU19TVU1NQVJZICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgRXJyb3JlZCBGcmFtZSBTZWNvbmRzIFN1bW1hcnkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU0ICAgICAgICAgICAvKio8IE9yZ2FuaXphdGlvbiBTcGVjaWZpYy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZTsKKworLyoqIFRlayBBbGFybSBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBMaW5rIEZhdWx0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT1NTX09GX1NJR05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBMb3NzIG9mIFNpZ25hbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVFhfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAgICAgICAgIC8qKjwgVHggRmFpbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVFJBTlNNSVRfREVHUkFERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgVHJhbnNtaXQgRGVncmFkZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUVVFVUVfT1ZFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgUXVldWUgT3ZlcmZsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xFQVJOX1RBQkxFX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IExlYXJuIFRhYmxlIE92ZXJmbG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTE9XX0NPTlRST0xfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAgICAgLyoqPCBGbG93IENvbnRyb2wgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUkVQT1JUX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgUmVwb3J0IEZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dBVEVfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgICAgICAvKio8IEdhdGUgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT0FNX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgIC8qKjwgT0FNIFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0tFWV9FWENIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgICAgICAgICAvKio8IEtleSBFeGNoYW5nZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQVVUT19ORUdfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAgICAgICAgIC8qKjwgQXV0byBOZWcgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19MSU5LX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAgICAgICAgIC8qKjwgR3BpbyBMaW5rIEZhdWx0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT09QQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgICAgICAgICAgLyoqPCBMb29wYmFjay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAgICAgICAgIC8qKjwgUG9ydCBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRFlJTkdfR0FTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NCwgICAgICAgICAgIC8qKjwgRHlpbmcgR2FzcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NSwgICAgICAgICAgIC8qKjwgUG93ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fRFlJTkdfR0FTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYsICAgICAgICAgICAvKio8IEdwaW8gRHlpbmcgR2FzcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1JJVElDQUxfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NiwgICAgICAgICAgIC8qKjwgQ3JpdGljYWwgRXZlbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTcsICAgICAgICAgICAvKio8IFJlZ2lzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0NSSVRJQ0FMX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk4LCAgICAgICAgICAgLyoqPCBHcGlvIENyaXRpY2FsIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TWVNURU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgICAgICAgICAgLyoqPCBTeXN0ZW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgICAgICAvKio8IFRlbXBlcmF0dXJlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAgICAgLyoqPCBHcGlvIE90aGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9BVVRIX1VOQVZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgICAgICAgICAgLyoqPCBBdXRoIFVuYXZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NUQVRfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM0LCAgICAgICAgICAvKio8IFN0YXQgQWxhcm0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZMQVNIX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM1LCAgICAgICAgICAvKio8IEZsYXNoIEJ1c3kuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NUQU5EQllfTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM2LCAgICAgICAgICAvKio8IFN0YW5kYnkgTG9zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QUk9UX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNywgICAgICAgICAgLyoqPCBQcm90IFN3aXRjaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1RDX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDQsICAgICAgICAgIC8qKjwgQ3RjIEFsYXJtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX09BTV9ESVNDX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NSwgICAgICAgICAgLyoqPCBMaW5rIE9BTSBEaXNjIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9JUE5fTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NiwgICAgICAgICAgLyoqPCBJcG4gTG9zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9ESUFHX0xPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NywgICAgICAgICAgLyoqPCBEaWFnIExvYWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0JPT1RfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgICAgICAgICAvKio8IEJvb3QgSW52YWxpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT05VX1JFQURZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzYsICAgICAgICAgIC8qKjwgT05VIFJlYWR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PTlVfUE9OX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NywgICAgICAgICAgLyoqPCBPTlUgUG9uIERpc2FibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NUQ19ESVNDT1ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc4LCAgICAgICAgICAvKio8IEN0YyBEaXNjb3Zlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTEFTRVJfQUxXQVlTX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzksICAgICAgICAgIC8qKjwgTGFzZXIgQWx3YXlzIE9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NCwgICAgICAgICAgLyoqPCBMaW5rIFJlZyBTdGFydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODUsICAgICAgICAgIC8qKjwgTGluayBSZWcgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODYsICAgICAgICAgIC8qKjwgTGluayBSZWcgRmFpbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkFOX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODksICAgICAgICAgIC8qKjwgRmFuIEZhdWx0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MCwgICAgICAgICAgLyoqPCBQb3dlciBNb24gVGVtcGVyYXR1cmUgSGlnaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RFTVBfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTEsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFRlbXBlcmF0dXJlIExvdy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1ZDQ19ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTIsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFZjYyBIaWdoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVkNDX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MywgICAgICAgICAgLyoqPCBQb3dlciBNb24gVmNjIExvdy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX0JJQVNfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTQsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFR4IEJpYXMgSGlnaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX0JJQVNfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTUsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFR4IEJpYXMgTG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfUE9XRVJfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5NiwgICAgICAgICAgLyoqPCBQb3dlciBNb24gVHggUG93ZXIgSGlnaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX1BPV0VSX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTcsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFR4IFBvd2VyIExvdy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1JYX1BPV0VSX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTgsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFJ4IFBvd2VyIEhpZ2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9SWF9QT1dFUl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk5ICAgICAgICAgICAvKio8IFBvd2VyIE1vbiBSeCBQb3dlciBMb3cuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZTsKKworLyoqIFRlayBBbGFybSBDb250ZXh0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dAoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09OVEVYVF9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT05URVhUX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT05URVhUX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IExpbmsuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT05URVhUX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IFF1ZXVlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHQ7CisKKy8qKiBWYXIgQnJhbmNoLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgT2JqZWN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX1BBQ0tBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBQYWNrYWdlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX05BTUVfQklORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBOYW1lIEJpbmRpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEF0dHJpYnV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5ICAgICAgICAgICAgIC8qKjwgQWN0aW9uLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaDsKKworLyoqIFZhciBMZWFmIE9iamVjdC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX09CSkVDVF9NQUNfRU5USVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE1BQyBFbnRpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX09CSkVDVF9QSFlfRU5USVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFBIWSBFbnRpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX09CSkVDVF9NQUNfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCAgICAgICAgICAgICAvKio8IE1BQyBDdHJsLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0OworCisvKiogVmFyIExlYWYgUGFja2FnZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX0lMTEVHQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJbGxlZ2FsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX01BQ19NQU5EQVRPUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBNQUMgTWFuZGF0b3J5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX01BQ19SRUNPTU1FTkRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBNQUMgUmVjb21tZW5kZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfTUFDX09QVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IE1BQyBPcHRpb25hbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfUEFDS0FHRV9NQUNfQVJSQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgTUFDIEFycmF5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX01BQ19FWENFU1NJVkVfREVGRVJSQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBNQUMgRXhjZXNzaXZlIERlZmVycmFsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX1BIWV9SRUNPTU1FTkRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBQSFkgUmVjb21tZW5kZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfUEhZX01VTFRJUExFX1BIWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFBIWSBNdWx0aXBsZSBQSFkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfUEhZMTAwTVBCU19NT05JVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFBIWSAxMDAgTXBicyBNb25pdG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX1JFUEVBVEVSX1BFUkZfTU9OSVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBSZXBlYXRlciBQZXJmIE1vbml0b3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfUE9SVF9QRVJGX01PTklUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IFBvcnQgUGVyZiBNb25pdG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX1BPUlRfQUREUl9UUkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBQb3J0IEFkZHIgVHJhY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfTUFVX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IE1BVSBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX01FRElBX0xPV19UUkFDS0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCBNZWRpYSBMb3cgVHJhY2tpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfQlJPQURCQU5EX01BVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IEJyb2FkYmFuZCBNQVUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfTUFDX0NPTlRST0xfUkVDT01NRU5ERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcgICAgICAgICAgICAvKio8IE1BQyBDb250cm9sIFJlY29tbWVuZGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZTsKKworLyoqIFZhciBMZWFmIE5hbWUgQmluZGluZy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19NQUNfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE1BQyBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfTUFDX01PTklUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBNQUMgTW9uaXRvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfTkFNRV9CSU5ESU5HX1BIWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgUEhZIE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19QSFlfTU9OSVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFBIWSBNb25pdG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfTUFDX0NUUkxfU1lTVEVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBNQUMgQ3RybCBTeXN0ZW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19NQUNfQ1RSTF9NT05JVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IE1BQyBDdHJsIE1vbml0b3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19SRVBFQVRFUl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IFJlcGVhdGVyIE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19SRVBFQVRFUl9NT05JVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFJlcGVhdGVyIE1vbml0b3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19HUk9VUF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEdyb3VwIE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19QT1JUX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFBvcnQgTmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfTkFNRV9CSU5ESU5HX01BVV9SUFRfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgTUFVIFJlcG9ydCBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfTUFVX0RURV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBNQVUgRFRFIE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19SU1JDX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IFJTUkMgTUFDLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfUlNSQ19SRVBFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBSU1JDIFJlcGVhdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfUlNSQ19NQVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0ICAgICAgICAgICAgLyoqPCBSU1JDIE1BVS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZzsKKworLyoqIFJlbW90ZSBMb29wYmFjayBDb21tYW5kLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZAoreworICAgIEJDTU9MVF9FUE9OX09BTV9SRU1PVEVfTE9PUEJBQ0tfQ09NTUFORF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBFbmFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JFTU9URV9MT09QQkFDS19DT01NQU5EX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IERpc2FibGUuICovCit9IGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZDsKKworLyoqIFRlayBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSW5mby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgR2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEdldCBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgU2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFNldCBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IE11bHRpY2FzdCBSZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVJfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IFJlZ2lzdGVyIFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0tFWV9FWENIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBLZXkgRXhjaGFuZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9SRUFEX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IEZpbGUgUmVhZCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfV1JJVEVfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBGaWxlIFdyaXRlIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IEZpbGUgRGF0YS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgRmlsZSBBY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IEnCskMgKEJTQykgUmVhZCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCBJwrJDIChCU0MpIFJlYWQgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IEnCskMgKEJTQykgV3JpdGUgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgScKyQyAoQlNDKSBXcml0ZSBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9VTkFDS0VEX0FDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgVW5BY2tlZCBBY3Rpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTggICAgICAgICAgICAvKio8IExvb3AgRGV0ZWN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZTsKKworLyoqIFRlayBCcmFuY2guIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2gKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRW5kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBPYmplY3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFBhY2thZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IE5hbWUgQmluZGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgQXR0cmlidXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkgICAgICAgICAgICAgLyoqPCBBY3Rpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoOworCisvKiogVGVrIE9iamVjdCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0xPR0lDQUxfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTG9naWNhbCBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUVVFVUVfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBRdWV1ZSBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQUxMX1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBBbGwgUXVldWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTkVUV09SS19QT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBOZXR3b3JrIFBPTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1VTRVJfUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgVXNlciBQT04uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9GTE9XX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEZsb3cgRGlyZWN0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAgICAgLyoqPCBCcmlkZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9CUklER0VfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMxICAgICAgICAgICAvKio8IEJyaWRnZSBQb3J0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlOworCisvKiogRmxvdyBEaXJlY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0ZMT1dfRElSRUNUSU9OX0lOR1JFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEluZ3Jlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZMT1dfRElSRUNUSU9OX0VHUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEVncmVzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRkxPV19ESVJFQ1RJT05fVVBTVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZMT1dfRElSRUNUSU9OX0RPV05TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IERvd25zdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZMT1dfRElSRUNUSU9OX0VHUkVTU19MT0NBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAvKio8IEVncmVzcyBMb2NhbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uOworCisvKiogVGVrIExlYWYgQXR0cmlidXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc0NiwgICAgICAgIC8qKjwgTFVFIEZpZWxkIFNlbGVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGcmFtZXMgVHggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFN0ZCBNQUMgU2luZ2xlIENvbGwgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIE11bHRpcGxlIENvbGwgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfUlhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIEZyYW1lcyBSeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRkNTX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGQ1MgRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BTElHTl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIEFsaWduIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBPY3RldHMgVHggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19ERUZFUlJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFN0ZCBNQUMgRnJhbWVzIERlZmVycmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19MQVRFX0NPTExJU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIExhdGUgQ29sbGlzaW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBFeGNlc3NpdmUgQ29sbGlzaW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUiAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGcmFtZXMgTG9zdCBNQUMgVHggRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVJSSUVSX1NFTlNFX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIENhcnJpZXIgU2Vuc2UgRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIE9jdGV0cyBSeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUiAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGcmFtZXMgTG9zdCBNQUMgUnggRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIFByb21pc2N1b3VzIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgU3RkIE1BQyBNY2FzdCBBZGRyIExpc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19UWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IFN0ZCBNQUMgTWNhc3QgRnJhbWVzIFR4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEJjYXN0IEZyYW1lcyBUeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGciBFeGNlc3NpdmUgRGVmZXJyYWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IFN0ZCBNQUMgTWNhc3QgRnJhbWVzIFJ4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEJjYXN0IEZyYW1lcyBSeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSU5fUkFOR0VfTEVOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgU3RkIE1BQyBJbiBSYW5nZSBMZW4gRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIE91dCBPZiBSYW5nZSBMZW4gRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRV9UT09fTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEZyYW1lIFRvbyBMb25nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FTkFCTEVfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEVuYWJsZSBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1RYX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IFN0ZCBNQUMgVHggRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIE1jYXN0IFJ4IFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DT0xMSVNJT05fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIENvbGxpc2lvbiBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IFN0ZCBQSFkgVHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRV9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAgICAgICAgIC8qKjwgU3RkIFBIWSBUeXBlIExpc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVIgICAgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgICAvKio8IFN0ZCBQSFkgU3ltYm9sIEVyciBEdXJpbmcgQ2Fycmllci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAgICAgICAgIC8qKjwgU3RkIFBIWSBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQVVfTUVESUFfQVZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MSwgICAgICAgICAgIC8qKjwgU3RkIE1BVSBNZWRpYSBBdmFpbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OCwgICAgICAgICAgIC8qKjwgU3RkIEF1dG8gTmVnIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc5LCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBOZWcgQWRtaW4gU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUkVNT1RFX1NJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODAsICAgICAgICAgICAvKio8IFN0ZCBBdXRvIE5lZyBSZW1vdGUgU2lnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgxLCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBOZWcgQXV0byBDZmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfVEVDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODIsICAgICAgICAgICAvKio8IFN0ZCBBdXRvIE5lZyBMb2NhbCBUZWNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1RFQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgzLCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBOZWcgQWQgVGVjaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9URUNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NCwgICAgICAgICAgIC8qKjwgU3RkIEF1dG8gTmVnIFJ4IFRlY2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEUgICAgICAgICAgICAgICAgICAgICAgID0gODUsICAgICAgICAgICAvKio8IFN0ZCBBdXRvIE5lZyBMb2NhbCBTZWxlY3QgQWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NiwgICAgICAgICAgIC8qKjwgU3RkIEF1dG8gTmVnIEFkIFNlbGVjdCBBYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg3LCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBOZWcgUnggU2VsZWN0IEFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODksICAgICAgICAgICAvKio8IFN0ZCBNQUMgQ2FwYWJpbGl0aWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkwLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIER1cGxleCBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTIsICAgICAgICAgICAvKio8IFN0ZCBNQUMgQ3RybCBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MywgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDdHJsIEZ1bmNzIFN1cHBvcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NCwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDdHJsIEZyYW1lcyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDdHJsIEZyYW1lcyBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWCAgICAgICAgICAgICAgICAgICAgICAgPSA5NiwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDdHJsIFVuc3VwcG9ydGVkIE9wIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX0RFTEFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk3LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEN0cmwgUGF1c2UgRGVsYXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTgsICAgICAgICAgICAvKio8IFN0ZCBNQUMgQ3RybCBQYXVzZSBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDdHJsIFBhdXNlIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVCAgICAgICAgICAgICAgICAgICA9IDIzMywgICAgICAgICAgLyoqPCBTdGQgT0FNIExvY2FsIEVyciBGcmFtZSBTZWNzIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0OSwgICAgICAgICAgLyoqPCBTdGQgT0FNIEVtdWwgQ3JjOCBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFggICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgwLCAgICAgICAgICAvKio8IFN0ZCBNUENQIE1BQyBDdHJsIEZyYW1lcyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19SWCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODEsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgTUFDIEN0cmwgRnJhbWVzIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWCAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4OCwgICAgICAgICAgLyoqPCBTdGQgTVBDUCBEaXNjb3ZlcnkgV2luZG93IFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MCwgICAgICAgICAgLyoqPCBTdGQgTVBDUCBEaXNjb3ZlcnkgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOTIsICAgICAgICAgIC8qKjwgU3RkIEZFQyBDb3JyZWN0ZWQgQmxvY2tzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MywgICAgICAgICAgLyoqPCBTdGQgRkVDIFVuY29ycmVjdGFibGUgQmxvY2tzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19BQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxMywgICAgICAgICAgLyoqPCBTdGQgRkVDIEFiaWxpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE0LCAgICAgICAgICAvKio8IFN0ZCBGRUMgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX0dBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTUsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgVHggR2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTYsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgVHggUmVnIEFjay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTcsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgVHggUmVnaXN0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE4LCAgICAgICAgICAvKio8IFN0ZCBNUENQIFR4IFJlZyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxOSwgICAgICAgICAgLyoqPCBTdGQgTVBDUCBUeCBSZXBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9HQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIwLCAgICAgICAgICAvKio8IFN0ZCBNUENQIFJ4IEdhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIxLCAgICAgICAgICAvKio8IFN0ZCBNUENQIFJ4IFJlZyBBY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIyLCAgICAgICAgICAvKio8IFN0ZCBNUENQIFJ4IFJlZ2lzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMywgICAgICAgICAgLyoqPCBTdGQgTVBDUCBSeCBSZWcgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjQsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgUnggUmVwb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgICAgICAgICAgLyoqPCBGaXJtd2FyZSBWZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRFTkRFRF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgICAgICAvKio8IEV4dGVuZGVkIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RCTF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAgICAgLyoqPCBEeW4gTGVhcm4gVGJsIFNpemUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMxLCAgICAgICAgICAvKio8IER5biBMZWFybiBBZ2UgTGltaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMyLCAgICAgICAgICAvKio8IFJ4IFVuaWNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMywgICAgICAgICAgLyoqPCBUeCBVbmljYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzQsICAgICAgICAgIC8qKjwgUnggRnJhbWUgVG9vIFNob3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNSwgICAgICAgICAgLyoqPCBSeCBGcmFtZSA2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjVUTzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzYsICAgICAgICAgIC8qKjwgUnggRnJhbWUgNjXigJMxMjcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM3LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDEyOOKAkzI1NS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2VE81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzgsICAgICAgICAgIC8qKjwgUnggRnJhbWUgMjU24oCTNTExLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzOSwgICAgICAgICAgLyoqPCBSeCBGcmFtZSA1MTLigJMxMDIzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MCwgICAgICAgICAgLyoqPCBSeCBGcmFtZSAxMDI04oCTMTUxOC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDEsICAgICAgICAgIC8qKjwgUnggRnJhbWUgMTUxOSBQbHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MiwgICAgICAgICAgLyoqPCBUeCBGcmFtZSA2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjVUTzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDMsICAgICAgICAgIC8qKjwgVHggRnJhbWUgNjXigJMxMjcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyOFRPMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ0LCAgICAgICAgICAvKio8IFR4IEZyYW1lIDEyOOKAkzI1NS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2VE81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDUsICAgICAgICAgIC8qKjwgVHggRnJhbWUgMjU24oCTNTExLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTJUTzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NiwgICAgICAgICAgLyoqPCBUeCBGcmFtZSA1MTLigJMxMDIzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMDI0VE8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NywgICAgICAgICAgLyoqPCBUeCBGcmFtZSAxMDI04oCTMTUxOC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDgsICAgICAgICAgIC8qKjwgVHggRnJhbWUgMTUxOSBQbHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVlfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0OSwgICAgICAgICAgLyoqPCBUeCBEZWxheSBUaHJlc2hvbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUwLCAgICAgICAgICAvKio8IFR4IERlbGF5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MSwgICAgICAgICAgLyoqPCBUeCBGcmFtZXMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTIsICAgICAgICAgIC8qKjwgVHggQnl0ZXMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RFTEFZRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTMsICAgICAgICAgIC8qKjwgVHggQnl0ZXMgRGVsYXllZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTQsICAgICAgICAgIC8qKjwgVHggQnl0ZXMgVW51c2VkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVlfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NSwgICAgICAgICAgLyoqPCBSeCBEZWxheSBUaHJlc2hvbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU2LCAgICAgICAgICAvKio8IFJ4IERlbGF5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NywgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTgsICAgICAgICAgIC8qKjwgUnggQnl0ZXMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RFTEFZRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTksICAgICAgICAgIC8qKjwgUnggQnl0ZXMgRGVsYXllZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjAsICAgICAgICAgIC8qKjwgUG9ydCBTdGF0IFRocmVzaG9sZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjEsICAgICAgICAgIC8qKjwgTGluayBTdGF0IFRocmVzaG9sZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfS0VZX0VYUElSWV9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjIsICAgICAgICAgIC8qKjwgRW5jcnlwdCBLZXkgRXhwaXJ5IFRpbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRU5fRVJST1JfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYzLCAgICAgICAgICAvKio8IExlbiBFcnJvciBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2NCwgICAgICAgICAgLyoqPCBEeW4gTUFDIFRibC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjUsICAgICAgICAgIC8qKjwgU3RhdGljIE1BQyBUYmwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VUF9GSUxURVJfVEJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY2LCAgICAgICAgICAvKio8IFVwIEZpbHRlciBUYmwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY3LCAgICAgICAgICAvKio8IERuIEZpbHRlciBUYmwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY4LCAgICAgICAgICAvKio8IFJlcG9ydCBUaHJlc2hvbGRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQkNBU1RfUkFURV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2OSwgICAgICAgICAgLyoqPCBCY2FzdCBSYXRlIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9FVEhFUlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3MiwgICAgICAgICAgLyoqPCBWTEFOIEV0aGVydHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzQsICAgICAgICAgIC8qKjwgUG9ydCBDYXBhYmlsaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NSwgICAgICAgICAgLyoqPCBDdGwgVkxBTiBJIEQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NRElfQ1JPU1NPVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc2LCAgICAgICAgICAvKio8IE1ESSBDcm9zc292ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfRE5fRklMVEVSX1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc3LCAgICAgICAgICAvKio8IE5ldyBEbiBGaWx0ZXIgVGJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX1VQX0ZJTFRFUl9UQkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OCwgICAgICAgICAgLyoqPCBOZXcgVXAgRmlsdGVyIFRibC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0pFREVDX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzksICAgICAgICAgIC8qKjwgSkVERUMgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgwLCAgICAgICAgICAvKio8IENoaXAgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgxLCAgICAgICAgICAvKio8IENoaXAgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODIsICAgICAgICAgIC8qKjwgTVBDUCBDbG9jay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0tfQ09NUEVOU0FURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODMsICAgICAgICAgIC8qKjwgTVBDUCBDbG9jayBDb21wZW5zYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NCwgICAgICAgICAgLyoqPCBFZ3Jlc3MgU2hhcGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODUsICAgICAgICAgIC8qKjwgSW5ncmVzcyBQb2xpY2luZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPU19UUkFOU0xBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODYsICAgICAgICAgIC8qKjwgQ29TIFRyYW5zbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFJJX0VOUVVFVUlORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NywgICAgICAgICAgLyoqPCBQcmkgRW5xdWV1aW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4OCwgICAgICAgICAgLyoqPCBQb3J0IFZMQU4gUG9saWN5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX01FTUJFUlNISVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4OSwgICAgICAgICAgLyoqPCBQb3J0IFZMQU4gTWVtYmVyc2hpcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FSUF9SRVBMSUNBVEVfREVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTAsICAgICAgICAgIC8qKjwgQVJQIFJlcGxpY2F0ZSBEZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEFDUF9ERVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MSwgICAgICAgICAgLyoqPCBMQUNQIERlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSUdNUF9WTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk2LCAgICAgICAgICAvKio8IE9OVSBJR01QIFZMQU4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5JTkdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA4LCAgICAgICAgICAvKio8IER5biBMZWFybmluZyBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwOSwgICAgICAgICAgLyoqPCBNaW4gTUFDIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0FHR1JFR0FURV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxMCwgICAgICAgICAgLyoqPCBPTlUgQWdncmVnYXRlIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NDUkFUQ0hQQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxMSwgICAgICAgICAgLyoqPCBOVlMgU2NyYXRjaHBhZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTIsICAgICAgICAgIC8qKjwgRmxvb2QgVW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTMsICAgICAgICAgIC8qKjwgTG9jYWwgU3dpdGNoaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE9XTl9CVVJTVF9UT0xMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNCwgICAgICAgICAgLyoqPCBEb3duIEJ1cnN0IFRvbGwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE1LCAgICAgICAgICAvKio8IEZFQyBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fTU9ERV9SVUxFX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxOCwgICAgICAgICAgLyoqPCBMZWFybiBNb2RlIFJ1bGUgVXBkYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxOSwgICAgICAgICAgLyoqPCBQb3dlciBNb24gVGVtcGVyYXR1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVkNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIwLCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBWY2MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfQklBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIxLCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBUeCBCaWFzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyMiwgICAgICAgICAgLyoqPCBQb3dlciBNb24gVHggUG93ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fUlhfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIzLCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBSeCBQb3dlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0RPTUFJTl9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjQsICAgICAgICAgIC8qKjwgTWNhc3QgRG9tYWluIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dMT0JBTF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjUsICAgICAgICAgIC8qKjwgTWNhc3QgR2xvYmFsIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjYsICAgICAgICAgIC8qKjwgTWNhc3QgR3JvdXAgSW5mby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjcsICAgICAgICAgIC8qKjwgTGluayBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lHTVBfRlJBTUVfUkFURV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjgsICAgICAgICAgIC8qKjwgSUdNUCBGcmFtZSBSYXRlIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0hPTERPVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMCwgICAgICAgICAgLyoqPCBPTlUgSG9sZG92ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMxLCAgICAgICAgICAvKio8IElQTUMgVW5rbm93biBMZWF2ZSBGd2QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVRXT1JLX1BPTl9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM0LCAgICAgICAgICAvKio8IE5ldHdvcmsgUE9OIE1hcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BTU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzUsICAgICAgICAgIC8qKjwgUFMgU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TTEVfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM2LCAgICAgICAgICAvKio8IFNMRSBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzNywgICAgICAgICAgLyoqPCBMZWFybiBUYWJsZSBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9ERVNUSU5BVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0MCwgICAgICAgICAgLyoqPCBWTEFOIERlc3RpbmF0aW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX1NJR05BTF9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDIsICAgICAgICAgIC8qKjwgVHJhbnNjZWl2ZXIgU2lnbmFsIERldGVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NST1NTQkFSX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDMsICAgICAgICAgIC8qKjwgQ3Jvc3NiYXIgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfQlVSU1RfQUNUSVZJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0NCwgICAgICAgICAgLyoqPCBUcmFuc2NlaXZlciBCdXJzdCBBY3Rpdml0eS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPTlRST0xfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDUsICAgICAgICAgIC8qKjwgQ29udHJvbCBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0OCwgICAgICAgICAgLyoqPCBFbmNyeXB0aW9uIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VTklfU0hBUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjQsICAgICAgICAvKio8IFVOSSBTaGFwZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NDcsICAgICAgICAvKio8IFBvcnQgRHluYW1pYyBFbnRyaWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9MSUNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzY1LCAgICAgICAgLyoqPCBQb2xpY2VyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzY2LCAgICAgICAgLyoqPCBPTlUgUnVsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOVEVSTkFMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTEsICAgICAgICAgIC8qKjwgSW50ZXJuYWwgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1RJTUVTVEFNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTIsICAgICAgICAgIC8qKjwgRmlybXdhcmUgVGltZXN0YW1wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQllQQVNTX1NPRlRfTEVBUk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNSwgICAgICAgICAgLyoqPCBCeXBhc3MgU29mdCBMZWFybi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc2MSwgICAgICAgIC8qKjwgRXh0IEZpcm13YXJlIFZlcnNpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjAsICAgICAgICAvKio8IEVuY3J5cHRpb24gS2V5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklMRV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzU5LCAgICAgICAgLyoqPCBGaWxlIEluZm8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TWVNURU1fUlVMRV9PUFRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM4LCAgICAgICAgICAvKio8IFN5c3RlbSBSdWxlIE9wdGlvbnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NVFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NTgsICAgICAgICAvKio8IE1UVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc1NywgICAgICAgIC8qKjwgTlZTIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVQUklNQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzU2LCAgICAgICAgLyoqPCBRdWV1ZXByaW1hcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX0FNUExJVFVERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTAsICAgICAgICAgIC8qKjwgRVBvQyBTRE0gQW1wbGl0dWRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19ET1dOX0JJVF9MT0FESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1MywgICAgICAgICAgLyoqPCBFUG9DIERvd24gQml0IExvYWRpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VQX0JJVF9MT0FESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU0LCAgICAgICAgICAvKio8IEVQb0MgVXAgQml0IExvYWRpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9QSEFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU1LCAgICAgICAgICAvKio8IEVQb0MgU0RNIFBoYXNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUVVBTlRJWkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzOSwgICAgICAgICAgLyoqPCBFUG9DIFNETSBRdWFudGl6ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI5LCAgICAgICAgICAvKio8IEVQb0MgVW51c2VkIDAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0LCAgICAgICAgICAvKio8IEVQb0MgVW51c2VkIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1LCAgICAgICAgICAvKio8IEVQb0MgVW51c2VkIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA2LCAgICAgICAgICAvKio8IEVQb0MgVW51c2VkIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA3LCAgICAgICAgICAvKio8IEVQb0MgVW51c2VkIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUFUVVJFX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjIsICAgICAgICAvKio8IEZlYXR1cmUgU2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVF9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzQ1LCAgICAgICAgLyoqPCBMVUUgRmllbGQgU2VsZWN0IExpc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRUFSQ0hfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NTIsICAgICAgICAvKio8IFNlYXJjaCBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE2LCAgICAgICAgICAvKio8IFNlcXVlbmNlIE51bWJlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTkZJR19WMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc1MywgICAgICAgIC8qKjwgUXVldWUgQ29uZmlnIFYyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzQxLCAgICAgICAgLyoqPCBBbGFybSBUaHJlc2hvbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GQUlMU0FGRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQ2LCAgICAgICAgICAvKio8IEZhaWxzYWZlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUU19USFJFU0hPTERfSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICAgICA9IDQxNiwgICAgICAgICAgLyoqPCBQb3J0IFN0YXRzIFRocmVzaG9sZCBJbnRlcnZhbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTcgICAgICAgICAgIC8qKjwgTGluayBTdGF0cyBUaHJlc2hvbGQgSW50ZXJ2YWwuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGU7CisKKy8qKiBUZWsgTGVhZiBBY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIEluaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0FERF9HUk9VUF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFN0ZCBNQUMgQWRkIEdyb3VwIEFkZHIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0RFTF9HUk9VUF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFN0ZCBNQUMgRGVsIEdyb3VwIEFkZHIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX1NFTEZfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFN0ZCBNQUMgU2VsZiBUZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBTdGQgUEhZIEFkbWluIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFN0ZCBSZXBvcnQgUmVzZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX0lOX1NFUlZJQ0VfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFN0ZCBSZXBvcnQgSW4gU2VydmljZSBUZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BPUlRfQURNSU5fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBTdGQgUG9ydCBBZG1pbiBDdHJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBTdGQgTUFVIFJlc2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9BRE1JTl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBTdGQgTUFVIEFkbWluIEN0cmwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IFN0ZCBBdXRvIFJlbmVnb3RpYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fQURNSU5fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBBZG1pbiBDdHJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgICAgICAgICAgLyoqPCBDbGVhciBEeW4gTGVhcm4gVGJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1NUQVRJQ19FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOSwgICAgICAgICAgLyoqPCBBZGQgU3RhdGljIEVudHJ5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAgICAgLyoqPCBEZWwgU3RhdGljIEVudHJ5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgICAgICAgICAgLyoqPCBDbGVhciBVcCBGaWx0ZXIgVGJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fRklMVEVSX1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMiwgICAgICAgICAgLyoqPCBDbGVhciBEbiBGaWx0ZXIgVGJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMywgICAgICAgICAgLyoqPCBBZGQgUnVsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9SVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzQsICAgICAgICAgIC8qKjwgRGVsZXRlIFJ1bGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9SRVNFVF9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM1LCAgICAgICAgICAvKio8IFJlc2V0IE9OVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzYsICAgICAgICAgIC8qKjwgQ2xlYXIgU3RhdHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM3LCAgICAgICAgICAvKio8IEdldCBHUElPIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzgsICAgICAgICAgIC8qKjwgU2V0IEdQSU8gQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzOSwgICAgICAgICAgLyoqPCBHZXQgR1BJTyBWYWx1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDAsICAgICAgICAgIC8qKjwgU2V0IEdQSU8gVmFsdWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTURJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQxLCAgICAgICAgICAvKio8IEdldCBNRElPLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX01ESU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MiwgICAgICAgICAgLyoqPCBTZXQgTURJTy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDMsICAgICAgICAgIC8qKjwgTG9vcGJhY2sgRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NCwgICAgICAgICAgLyoqPCBMb29wYmFjayBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX1VQX0NMQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NSwgICAgICAgICAgLyoqPCBDbHIgVXAgQ2xhc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ2LCAgICAgICAgICAvKio8IENsciBEbiBDbGFzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDcsICAgICAgICAgIC8qKjwgU2V0IFF1ZXVlIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDgsICAgICAgICAgIC8qKjwgR2V0IFF1ZXVlIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDksICAgICAgICAgIC8qKjwgRXJhc2UgTlZTLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0lHTVBfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MCwgICAgICAgICAgLyoqPCBTZXQgSUdNUCBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUxLCAgICAgICAgICAvKio8IEdldCBJR01QIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0dST1VQX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTIsICAgICAgICAgIC8qKjwgR2V0IElHTVAgR3JvdXAgSW5mby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9JR01QX0dST1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTMsICAgICAgICAgIC8qKjwgRGVsIElHTVAgR3JvdXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU0LCAgICAgICAgICAvKio8IEFkZCBJR01QIEdyb3VwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NSwgICAgICAgICAgLyoqPCBTZXQgUXVldWUgUmF0ZSBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX1JBVEVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NiwgICAgICAgICAgLyoqPCBHZXQgUXVldWUgUmF0ZSBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NywgICAgICAgICAgLyoqPCBTZXQgUG9ydCBSYXRlIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU4LCAgICAgICAgICAvKio8IEdldCBQb3J0IFJhdGUgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QSFlfQUREUl9NRElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTksICAgICAgICAgIC8qKjwgU2V0IFBIWSBBZGRyIE1ESU8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUEhZX0FERFJfTURJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgICAgICAgICAvKio8IEdldCBQSFkgQWRkciBNRElPLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0FERF9SVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MSwgICAgICAgICAgLyoqPCBOZXcgQWRkIFJ1bGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRU5BQkxFX1VTRVJfVFJBRkZJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYyLCAgICAgICAgICAvKio8IE9OVSBFbmFibGUgVXNlciBUcmFmZmljLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0RJU0FCTEVfVVNFUl9UUkFGRklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MywgICAgICAgICAgLyoqPCBPTlUgRGlzYWJsZSBVc2VyIFRyYWZmaWMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfRE5fQkNBU1RfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY0LCAgICAgICAgICAvKio8IFNldCBEbiBCY2FzdCBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjUsICAgICAgICAgIC8qKjwgR2V0IERuIEJjYXN0IFF1ZXVlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX09BTV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2NiwgICAgICAgICAgLyoqPCBTZXQgT0FNIFJhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfT0FNX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY3LCAgICAgICAgICAvKio8IEdldCBPQU0gUmF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjgsICAgICAgICAgIC8qKjwgU2V0IExVRSBGaWVsZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MVUVfRklFTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjksICAgICAgICAgIC8qKjwgR2V0IExVRSBGaWVsZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MT0FEX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzAsICAgICAgICAgIC8qKjwgR2V0IExvYWQgSW5mby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19ERUxfUlVMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzEsICAgICAgICAgIC8qKjwgTmV3IERlbCBSdWxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfVVNFUl9SVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3MiwgICAgICAgICAgLyoqPCBDbGVhciBVcCBVc2VyIFJ1bGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fVVNFUl9SVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3MywgICAgICAgICAgLyoqPCBDbGVhciBEbiBVc2VyIFJ1bGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0RPTUFJTl9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NCwgICAgICAgICAgLyoqPCBEZWxldGUgTWNhc3QgRG9tYWluIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9HUk9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzUsICAgICAgICAgIC8qKjwgRGVsZXRlIE1jYXN0IEdyb3VwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NiwgICAgICAgICAgLyoqPCBMYXNlciBUeCBQb3dlciBPZmYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc3LCAgICAgICAgICAvKio8IEJjIExhc2VyIFBvd2VyIE9mZi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzgsICAgICAgICAgIC8qKjwgU2xlZXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9QUk9URUNUSU9OX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5LCAgICAgICAgICAvKio8IFByb3RlY3Rpb24gU3dpdGNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0xVRV9SVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4MSwgICAgICAgICAgLyoqPCBBZGQgTFVFIFJ1bGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfTFVFX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgyLCAgICAgICAgICAvKio8IERlbCBMVUUgUnVsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VOQUJMRV9QT0xJQ0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODMsICAgICAgICAgIC8qKjwgRW5hYmxlIFBvbGljZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTg0LCAgICAgICAgICAvKio8IERpc2FibGUgUG9saWNlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDIsICAgICAgICAgIC8qKjwgRXBvYyBVbnVzZWQgMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDMsICAgICAgICAgIC8qKjwgRXBvYyBVbnVzZWQgMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0ZJTkRfTFVFX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDcsICAgICAgICAgIC8qKjwgRmluZCBMVUUgUnVsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDgsICAgICAgICAgIC8qKjwgQ2xlYXIgTFVFIFJ1bGUgVGFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA5LCAgICAgICAgICAvKio8IEdldCBFUG9DIFNETSBTdGF0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTAsICAgICAgICAgIC8qKjwgR2V0IEVQb0MgQ01DIFN0YXRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ05VX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxMSAgICAgICAgICAgLyoqPCBHZXQgRVBvQyBDTlUgU3RhdHMuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb247CisKKy8qKiBUZWsgT05VIFJ1bGUgRmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9GTEFHU19WT0xBVElMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxICAgICAgICAvKio8IFZvbGF0aWxlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzOworCisvKiogVGVrIE9OVSBSdWxlIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0ZPUldBUkRfVU5BRkZFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBGb3J3YXJkIFVuYWZmZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fUkVTRVJWRUQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFJlc2VydmVkMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9TRVRfREVTVElOQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU2V0IERlc3RpbmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0FERF9WTEFOX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBBZGQgVkxBTiBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fREVMRVRFX1ZMQU5fVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IERlbGV0ZSBWTEFOIFRhZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9TRVRfVklEX0FERF9WTEFOX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgU2V0IFZJRCBBZGQgVkxBTiBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fU0VUX0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFNldCBDb1MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fREVMRVRFX1RBR19BRERfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IERlbGV0ZSBUYWcgQWRkIFRhZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9ERUxFVEVfVEFHX0FERF9UQUdfU0VUX1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgRGVsZXRlIFRhZyBBZGQgVGFnIFNldCBWSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ0xFQVJfQUREX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IENsZWFyIEFkZCBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ0xFQVJfREVMX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IENsZWFyIERlbCBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ0xFQVJfREVMX1RBR19BTkRfQUREX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IENsZWFyIERlbCBUYWcgQW5kIEFkZCBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ09QWV9GSUVMRF9UT19DT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IENvcHkgRmllbGQgVG8gQ29TLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0NPUFlfRklFTERfVE9fVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBDb3B5IEZpZWxkIFRvIFZJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9SRVNFUlZFRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0ZPUldBUkRfQ0xFQVJfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBGb3J3YXJkIENsZWFyIERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fUkVTRVJWRUQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFJlc2VydmVkMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9TRVRfREVTVElOQVRJT05fRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAgICAgICAgIC8qKjwgU2V0IERlc3RpbmF0aW9uIEZvcndhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQUREX1RBR19GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IEFkZCBUYWcgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9ERUxFVEVfVEFHX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgRGVsZXRlIFRhZyBGb3J3YXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX1NFVF9WSURfQUREX1RBR19GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCBTZXQgVklEIEFkZCBUYWcgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9TRVRfQ09TX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgU2V0IENvUyBGb3J3YXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0RFTEVURV9UQUdfQUREX1RBR19SRVBMQUNFX1RBR19GT1JXQVJEICAgICAgICAgICAgICA9IDIzLCAgICAgICAgICAgLyoqPCBEZWxldGUgVGFnIEFkZCBUYWcgUmVwbGFjZSBUYWcgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9ERUxFVEVfVEFHX0FERF9UQUdfU0VUX1ZJRF9GT1JXQVJEICAgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgICAgIC8qKjwgRGVsZXRlIFRhZyBBZGQgVGFnIFNldCBWSUQgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9DTEVBUl9BRERfVEFHX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgIC8qKjwgQ2xlYXIgQWRkIFRhZyBGb3J3YXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0NMRUFSX0RFTF9UQUdfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBDbGVhciBEZWwgVGFnIEZvcndhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ0xFQVJfREVMX1RBR19BTkRfQUREX1RBR19GT1JXQVJEICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IENsZWFyIERlbCBUYWcgQW5kIEFkZCBUYWcgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9DT1BZX0ZJRUxEX1RPX0NPU19GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAgICAgICAgIC8qKjwgQ29weSBGaWVsZCBUbyBDb1MgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9DT1BZX0ZJRUxEX1RPX1ZJRF9GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgQ29weSBGaWVsZCBUbyBWSUQgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9SRVNFUlZFRDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQ0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX1JFU0VSVkVENSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxICAgICAgICAgICAgLyoqPCBSZXNlcnZlZDUuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfYWN0aW9uOworCisvKiogVGVrIE9OVSBGaWVsZCBTZWxlY3QuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfZmllbGRfc2VsZWN0Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfRklFTERfU0VMRUNUX0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX0ZJRUxEX1NFTEVDVF9TQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9GSUVMRF9TRUxFQ1RfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTExJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9GSUVMRF9TRUxFQ1RfRVRIRVJfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgRXRoZXJUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX0ZJRUxEX1NFTEVDVF9WTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBWTEFOLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX0ZJRUxEX1NFTEVDVF9VU0VSX0ZTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBVc2VyIEZTLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX0ZJRUxEX1NFTEVDVF9JUFBST1RPQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBJUCBQcm90b2NvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9GSUVMRF9TRUxFQ1RfQ1RDX0VUSF9DT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgICAgIC8qKjwgQ1RDIEV0aCBDb1MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfRklFTERfU0VMRUNUX0wzUFJPVE9DT0xfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEgICAgICAgICAgICAvKio8IEwzIFByb3RvY29sIFR5cGUuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdDsKKworLyoqIFRlayBPTlUgUnVsZSBPcGVyYXRvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9PUEVSQVRPUl9ORVZFUl9NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5ldmVyIE1hdGNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfT1BFUkFUT1JfRVFVQUxfVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBFcXVhbCBUby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX09QRVJBVE9SX05PVF9FUVVBTF9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTm90IEVxdWFsIFRvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfT1BFUkFUT1JfTEVTU19USEFOX09SX0VRVUFMX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBMZXNzIFRoYW4gT3IgRXF1YWwgVG8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9PUEVSQVRPUl9HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE8gICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEdyZWF0ZXIgVGhhbiBPciBFcXVhbCBUby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX09QRVJBVE9SX0VYSVNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgRXhpc3RzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfT1BFUkFUT1JfTk9UX0VYSVNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBOb3QgRXhpc3RzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfT1BFUkFUT1JfQUxXQVlTX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcgICAgICAgICAgICAgLyoqPCBBbHdheXMgTWF0Y2guICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3I7CisKKy8qKiBPTlUgUFMgU3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9QU1NUQVRFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX1BTU1RBVEVfU1dJVENIRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgU3dpdGNoZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9QU1NUQVRFX1NJR05BTF9ERVRFQ1RfQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgICAgICAvKio8IFNpZ25hbCBEZXRlY3QgQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX1BTU1RBVEVfU0lHTkFMX0RFVEVDVF9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQgICAgICAgIC8qKjwgU2lnbmFsIERldGVjdCBCLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGU7CisKKy8qKiBUZWsgTGVhcm4gVGFibGUgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQVJOX1RBQkxFX01PREVfT1ZFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT3ZlcmZsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFSTl9UQUJMRV9NT0RFX09WRVJXUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IE92ZXJ3cml0ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlOworCisvKiogVGVrIFZMQU4gRGVzdGluYXRpb24gTWF0Y2ggTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWF0Y2hfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfVkxBTl9ERVNUSU5BVElPTl9NQVRDSF9NT0RFX0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1ZMQU5fREVTVElOQVRJT05fTUFUQ0hfTU9ERV9WSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVklELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfVkxBTl9ERVNUSU5BVElPTl9NQVRDSF9NT0RFX0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBDb1MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19WTEFOX0RFU1RJTkFUSU9OX01BVENIX01PREVfVklEX0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IFZJRC9Db1MuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlOworCisvKiogVGVrIFZMQU4gRGVzdGluYXRpb24gRmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19WTEFOX0RFU1RJTkFUSU9OX0ZMQUdTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1ZMQU5fREVTVElOQVRJT05fRkxBR1NfRFJPUF9VTlRBR0dFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgRHJvcCBVbnRhZ2dlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1ZMQU5fREVTVElOQVRJT05fRkxBR1NfU1RSSVBfVkxBTl9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIgICAgICAgIC8qKjwgU3RyaXAgVkxBTiBUYWcuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFnczsKKworLyoqIFRlayBFbmNyeXB0aW9uIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0VOQ1JZUFRJT05fTU9ERV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19FTkNSWVBUSU9OX01PREVfQUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFFUy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0VOQ1JZUFRJT05fTU9ERV9aT0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgWk9ILiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRU5DUllQVElPTl9NT0RFX0NUQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBDVEMuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlOworCisvKiogVGVrIEVuY3J5cHRpb24gT3B0aW9ucy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9ucworeworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRU5DUllQVElPTl9PUFRJT05TX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19FTkNSWVBUSU9OX09QVElPTlNfQklfRElSRUNUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxICAgICAgICAvKio8IEJpLURpcmVjdGlvbmFsLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9uczsKKworLyoqIFJ1bGUgRmllbGQgU2VsZWN0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdAoreworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9MMkRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBMMiBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfTDJTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTDIgU0EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0wyVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEwyIFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0wyU1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEwyIFNWbGFuLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9MMkNWTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBMMiBDVmxhbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVURQX1RDUF9TT1VSQ0VfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgVWRwIFRjcCBTb3VyY2UgUG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVURQX1RDUF9ERVNUSU5BVElPTl9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgVWRwIFRjcCBEZXN0aW5hdGlvbiBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9JUF9QUk9UT0NPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBJcCBQcm90b2NvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfSVBWNFRUTF9JUFY2SE9QX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgSVBWNCBUdGwgSVBWNiBIb3AgTGltaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0lQVjRUT1NfSVBWNkNMQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IElQVjQgVG9zIElQVjYgQ2xhc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0lQVjRJUFY2REEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IElQVjQgSVBWNiBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfSVBWNkRBSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgSVBWNiBEQSBIaS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfSVBWNElQVjZTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgSVBWNCBJUFY2IFNBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9JUFY2U0FISSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBJUFY2IFNBIEhpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9JUFY2TkVYVF9IRUFERVJfQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCBJUFY2IE5leHQgSGVhZGVyIEJpdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfTExJRF9NQUNfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgTExJRCBNYWMgSWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIxNkJJVF9GSUVMRDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAvKio8IFVzZXIgMTYgQml0IEZpZWxkIDAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIxNkJJVF9GSUVMRDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFVzZXIgMTYgQml0IEZpZWxkIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIxNkJJVF9GSUVMRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IFVzZXIgMTYgQml0IEZpZWxkIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIxNkJJVF9GSUVMRDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IFVzZXIgMTYgQml0IEZpZWxkIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIxNkJJVF9GSUVMRDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IFVzZXIgMTYgQml0IEZpZWxkIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIzMkJJVF9GSUVMRDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IFVzZXIgMzIgQml0IEZpZWxkIDUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIzMkJJVF9GSUVMRDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgICAgICAvKio8IFVzZXIgMzIgQml0IEZpZWxkIDYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1BUUF9USU1FX1NUQU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgICAgICAgICAvKio8IFBUUCBUaW1lIFN0YW1wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9QT0xJQ0VSX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCBQb2xpY2VyIEVsZW1lbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgICAgICAvKio8IFZhciBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX0xFQVJOSU5HX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAgICAgICAgIC8qKjwgVmFyIExlYXJuaW5nIERvbWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1BPUlRfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAgICAgICAgIC8qKjwgVmFyIFBvcnQgRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1NUQVRJU1RJQ19QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAgICAgICAgIC8qKjwgVmFyIFN0YXRpc3RpYyBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9WQVJfU1dJVENISU5HX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5LCAgICAgICAgICAgLyoqPCBWYXIgU3dpdGNoaW5nIERvbWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1BPTElDRVIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAgICAgICAgIC8qKjwgVmFyIFBvbGljZXIgMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1BPTElDRVIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAgICAgICAgIC8qKjwgVmFyIFBvbGljZXIgMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1BPTElDRVIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgIC8qKjwgVmFyIFBvbGljZXIgMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1BPTElDRVI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAgICAgICAgIC8qKjwgVmFyIFBvbGljZXIgNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1NTTV9TT1VSQ0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNCwgICAgICAgICAgIC8qKjwgVmFyIFNzbSBTb3VyY2UgSWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9JTkRFWF9UQUJMRV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgICAvKio8IFZhciBJbmRleCBUYWJsZSBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9GUkFNRV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAgICAgLyoqPCBGcmFtZSBMZW5ndGguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0ZSQU1FX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzcgICAgICAgICAgICAvKio8IEZyYW1lIERpc2NhcmQuICovCit9IGJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdDsKKworLyoqIFJ1bGUgQWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBTdG9wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9OT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBOb3AuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1ZMQU5fQUREX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFZsYW4gQWRkIFNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fVkxBTl9BRERfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgVmxhbiBBZGQgQ2xlYXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1ZMQU5fREVMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFZsYW4gRGVsIFNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fVkxBTl9ERUxfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgVmxhbiBEZWwgQ2xlYXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0RJU0NBUkRfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IERpc2NhcmQgU2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9ESVNDQVJEX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBEaXNjYXJkIENsZWFyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBTZXQgUXVldWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9MRUFSTklOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFNldCBMZWFybmluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9QT1JUX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IFNldCBQb3J0IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9TVEFUSVNUSUNfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IFNldCBTdGF0aXN0aWMgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0VUX1NXSVRDSElOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgU2V0IFN3aXRjaGluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9QT0xJQ0VSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IFNldCBQb2xpY2VyIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9QT0xJQ0VSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IFNldCBQb2xpY2VyIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9QT0xJQ0VSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IFNldCBQb2xpY2VyIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9QT0xJQ0VSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAvKio8IFNldCBQb2xpY2VyIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9TU01fU09VUkNFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFNldCBTc20gU291cmNlIElkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfSU5ERVhfVEFCTEVfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBTZXQgSW5kZXggVGFibGUgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0VUX1ZJRF9DRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgU2V0IFZpZCBDZmkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9DT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IFNldCBDb3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9UUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IFNldCBUcGlkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAgICAgLyoqPCBPciBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fT1JfTEVBUk5JTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgT3IgTGVhcm5pbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9QT1JUX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCBPciBQb3J0IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX1NUQVRJU1RJQ19QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgICAgICAvKio8IE9yIFN0YXRpc3RpYyBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9TV0lUQ0hJTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBPciBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9QT0xJQ0VSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAgICAgLyoqPCBPciBQb2xpY2VyIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX1BPTElDRVIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgICAgICAgICAvKio8IE9yIFBvbGljZXIgMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fT1JfUE9MSUNFUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgT3IgUG9saWNlciAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9QT0xJQ0VSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAgICAgLyoqPCBPciBQb2xpY2VyIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX1NTTV9TT1VSQ0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgICAgICAgICAvKio8IE9yIFNzbSBTb3VyY2UgSWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX0lOREVYX1RBQkxFX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IE9yIEluZGV4IFRhYmxlIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX1ZJRF9DRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgICAgICAgICAvKio8IE9yIFZpZCBDZmkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgICAgICAgICAvKio8IE9yIENvcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fT1JfVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAgICAgICAgIC8qKjwgT3IgVHBpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAgICAgICAgIC8qKjwgQW5kIFF1ZXVlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfTEVBUk5JTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3LCAgICAgICAgICAgLyoqPCBBbmQgTGVhcm5pbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfUE9SVF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4LCAgICAgICAgICAgLyoqPCBBbmQgUG9ydCBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfU1RBVElTVElDX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5LCAgICAgICAgICAgLyoqPCBBbmQgU3RhdGlzdGljIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FORF9TV0lUQ0hJTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAsICAgICAgICAgICAvKio8IEFuZCBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfUE9MSUNFUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxLCAgICAgICAgICAgLyoqPCBBbmQgUG9saWNlciAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfUE9MSUNFUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyLCAgICAgICAgICAgLyoqPCBBbmQgUG9saWNlciAyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfUE9MSUNFUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzLCAgICAgICAgICAgLyoqPCBBbmQgUG9saWNlciAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfUE9MSUNFUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ0LCAgICAgICAgICAgLyoqPCBBbmQgUG9saWNlciA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfU1NNX1NPVVJDRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1LCAgICAgICAgICAgLyoqPCBBbmQgU3NtIFNvdXJjZSBJZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX0lOREVYX1RBQkxFX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NiwgICAgICAgICAgIC8qKjwgQW5kIEluZGV4IFRhYmxlIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FORF9WSURfQ0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDcsICAgICAgICAgICAvKio8IEFuZCBWaWQgQ2ZpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ4LCAgICAgICAgICAgLyoqPCBBbmQgQ29zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ5LCAgICAgICAgICAgLyoqPCBBbmQgVHBpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQUREUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MCwgICAgICAgICAgIC8qKjwgQWRkUXVldWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9MRUFSTklOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTEsICAgICAgICAgICAvKio8IEFkZCBMZWFybmluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9QT1JUX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTIsICAgICAgICAgICAvKio8IEFkZCBQb3J0IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9TVEFUSVNUSUNfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTMsICAgICAgICAgICAvKio8IEFkZCBTdGF0aXN0aWMgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQUREX1NXSVRDSElOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NCwgICAgICAgICAgIC8qKjwgQWRkIFN3aXRjaGluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9QT0xJQ0VSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUsICAgICAgICAgICAvKio8IEFkZCBQb2xpY2VyIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9QT0xJQ0VSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTYsICAgICAgICAgICAvKio8IEFkZCBQb2xpY2VyIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9QT0xJQ0VSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTcsICAgICAgICAgICAvKio8IEFkZCBQb2xpY2VyIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9QT0xJQ0VSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgsICAgICAgICAgICAvKio8IEFkZCBQb2xpY2VyIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9TU01fU09VUkNFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTksICAgICAgICAgICAvKio8IEFkZCBTc20gU291cmNlIElkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfSU5ERVhfVEFCTEVfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYwLCAgICAgICAgICAgLyoqPCBBZGQgSW5kZXggVGFibGUgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQUREX1ZJRF9DRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MSwgICAgICAgICAgIC8qKjwgQWRkIFZpZCBDZmkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9DT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjIsICAgICAgICAgICAvKio8IEFkZCBDb2QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9UUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjMsICAgICAgICAgICAvKio8IEFkZCBUcGlkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY0LCAgICAgICAgICAgLyoqPCBTaGlmdCBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0hJRlRfTEVBUk5JTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NSwgICAgICAgICAgIC8qKjwgU2hpZnQgTGVhcm5pbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9QT1JUX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY2LCAgICAgICAgICAgLyoqPCBTaGlmdCBQb3J0IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX1NUQVRJU1RJQ19QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjcsICAgICAgICAgICAvKio8IFNoaWZ0IFN0YXRpc3RpYyBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9TV0lUQ0hJTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY4LCAgICAgICAgICAgLyoqPCBTaGlmdCBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9QT0xJQ0VSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY5LCAgICAgICAgICAgLyoqPCBTaGlmdCBQb2xpY2VyIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX1BPTElDRVIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAsICAgICAgICAgICAvKio8IFNoaWZ0IFBvbGljZXIgMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0hJRlRfUE9MSUNFUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MSwgICAgICAgICAgIC8qKjwgU2hpZnQgUG9saWNlciAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9QT0xJQ0VSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyLCAgICAgICAgICAgLyoqPCBTaGlmdCBQb2xpY2VyIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX1NTTV9TT1VSQ0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzMsICAgICAgICAgICAvKio8IFNoaWZ0IFNzbSBTb3VyY2UgSWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX0lOREVYX1RBQkxFX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQsICAgICAgICAgICAvKio8IFNoaWZ0IEluZGV4IFRhYmxlIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX1ZJRF9DRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzUsICAgICAgICAgICAvKio8IFNoaWZ0IFZpZCBDZmkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX0NPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzYsICAgICAgICAgICAvKio8IFNoaWZ0IENvZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0hJRlRfVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NywgICAgICAgICAgIC8qKjwgU2hpZnQgVHBpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OCwgICAgICAgICAgIC8qKjwgQ29weSBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9MRUFSTklOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OSwgICAgICAgICAgIC8qKjwgQ29weSBMZWFybmluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfUE9SVF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODAsICAgICAgICAgICAvKio8IENvcHkgUG9ydCBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX1NUQVRJU1RJQ19QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgxLCAgICAgICAgICAgLyoqPCBDb3B5IFN0YXRpc3RpYyBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX1NXSVRDSElOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgyLCAgICAgICAgICAgLyoqPCBDb3B5IFN3aXRjaGluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfUE9MSUNFUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODMsICAgICAgICAgICAvKio8IENvcHkgUG9saWNlciAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX1BPTElDRVIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg0LCAgICAgICAgICAgLyoqPCBDb3B5IFBvbGljZXIgMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9QT0xJQ0VSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NSwgICAgICAgICAgIC8qKjwgQ29weSBQb2xpY2VyIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfUE9MSUNFUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODYsICAgICAgICAgICAvKio8IENvcHkgUG9saWNlciA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX1NTTV9TT1VSQ0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg3LCAgICAgICAgICAgLyoqPCBDb3B5IFNzbSBTb3VyY2UgSWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfSU5ERVhfVEFCTEVfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODgsICAgICAgICAgICAvKio8IENvcHkgSW5kZXggVGFibGUgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9WSURfQ0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4OSwgICAgICAgICAgIC8qKjwgQ29weSBWaWQgQ2ZpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX0NPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkwLCAgICAgICAgICAgLyoqPCBDb3B5IENvZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9UUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MSAgICAgICAgICAgIC8qKjwgQ29weSBUcGlkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb247CisKKy8qKiBWZXJzaW9uIG1hdHVyaXR5IAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTUFUVVJJVFlfUkVMRUFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgyLCAgICAgICAgICAgLyoqPCBSZWxlYXNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTUFUVVJJVFlfQ1VTVE9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY3LCAgICAgICAgICAgLyoqPCBDdXN0b20uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19NQVRVUklUWV9CRVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYsICAgICAgICAgICAvKio8IEJldGEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19NQVRVUklUWV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjUsICAgICAgICAgICAvKio8IEFscGhhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTUFUVVJJVFlfRU5HSU5FRVJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY5LCAgICAgICAgICAgLyoqPCBFbmdpbmVlcmluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX01BVFVSSVRZX0RFVkVMT1BNRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OCAgICAgICAgICAgIC8qKjwgRGV2ZWxvcG1lbnQuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHk7CisKKy8qKiBGaWxlIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQk9PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBCb290LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQVBQX01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBBcHAgTWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9CQUNLVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgQXBwIEJhY2t1cC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZTsKKworLyoqIE5WUyBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX05WU19TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEVuYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX05WU19TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IERpc2FibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlOworCisvKiogVGVrIFF1ZXVlIENvbmZpZyBWMiBTdWJ0eXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9URVJNSU5BVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBVc2VkIHRvIGVuZCBhIHF1ZXVlIGNvbmZpZyBjb250YWluZXIgY2hhaW4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVXNlZCB0byBzdGFydCBhIHF1ZXVlIGNvbmZpZyBjb250YWluZXIgY2hhaW4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVXNlZCB0byBkZWZpbmUgYSBsaW5rIHF1ZXVlIGNvbmZpZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBVc2VkIHRvIGRlZmluZSBhIHBvcnQgcXVldWUgY29uZmlnICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZTsKKworLyoqIFRlayBSZXBvcnQgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERV9GUkFNRV9BTElHTkVEX1NJTkdMRV9QUklPUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEZyYW1lIEFsaWduZWQgKFNpbmdsZSBQcmlvcml0eSkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERV9NVUxUSV9QUklPUklUWTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IE11bHRpLXByaW9yaXR5IDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERV9NVUxUSV9QUklPUklUWTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IE11bHRpLXByaW9yaXR5IDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERV9NVUxUSV9QUklPUklUWTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQgICAgICAgICAgICAvKio8IE11bHRpLXByaW9yaXR5IDguICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGU7CisKKy8qKiBUZWsgRmVhdHVyZSBTZXQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldAoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRkVBVFVSRV9TRVRfU1RBTkRBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBTdGFuZGFyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZFQVRVUkVfU0VUX0RQT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRFBvRS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZFQVRVUkVfU0VUX1NESyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU0RLLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRkVBVFVSRV9TRVRfWlRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBaVEUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GRUFUVVJFX1NFVF9LT1JFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAvKio8IEtvcmVhLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0OworCisvKiogTWNhc3QgU25vb3AgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9NQ0FTVF9TTk9PUF9NT0RFX0lHTVBfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBJR01QIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01DQVNUX1NOT09QX01PREVfSUdNUF9WM01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IElHTVAgVjMgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUNBU1RfU05PT1BfTU9ERV9JR01QX0NPTVBBVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgSUdNUCBDb21wYXQgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUNBU1RfU05PT1BfTU9ERV9JR01QX01MRF9DT01QQVRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgSUdNUCBNbGQgQ29tcGF0IE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01DQVNUX1NOT09QX01PREVfTUxEX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IE1sZCBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQ0FTVF9TTk9PUF9NT0RFX01MRF9WMk1PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBNbGQgVjIgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUNBU1RfU05PT1BfTU9ERV9NTERfQ09NUEFUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgTWxkIENvbXBhdCBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQ0FTVF9TTk9PUF9NT0RFX1NOT09QX01PREVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBTbm9vcCBNb2RlIERpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQ0FTVF9TTk9PUF9NT0RFX1NOT09QX01PREVfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAgICAgLyoqPCBTbm9vcCBNb2RlIEludmFsaWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlOworCisvKiogSVBNQyBHbG9iYWwgT3B0aW9ucy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9ucworeworICAgIEJDTU9MVF9FUE9OX09BTV9JUE1DX0dMT0JBTF9PUFRJT05TX0lQTUNfT1BUSU9OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJcG1jIE9wdGlvbiBOb25lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9JUE1DX0dMT0JBTF9PUFRJT05TX0lQTUNfT1BUSU9OX0RJU0NBUkRfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBJcG1jIE9wdGlvbiBEaXNjYXJkIFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0lQTUNfR0xPQkFMX09QVElPTlNfSVBNQ19PUFRJT05fQUxMT1dfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IElwbWMgT3B0aW9uIEFsbG93IE51bGwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0lQTUNfR0xPQkFMX09QVElPTlNfSVBNQ19PUFRJT05fQUxMT1dfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IElwbWMgT3B0aW9uIEFsbG93IEFsbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnM7CisKKy8qKiBGb3J3YXJkIFF1YWxpZmllci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRk9SV0FSRF9RVUFMSUZJRVJfUVVBTF9CWV9MMkRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUXVhbCBCeSBMMiBEYS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRk9SV0FSRF9RVUFMSUZJRVJfUVVBTF9CWV9WSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgUXVhbCBCeSBWaWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZPUldBUkRfUVVBTElGSUVSX1FVQUxfQllfSVBfREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFF1YWwgQnkgSVAgRGEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZPUldBUkRfUVVBTElGSUVSX1FVQUxfQllfSVBfU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFF1YWwgQnkgSVAgU2EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZPUldBUkRfUVVBTElGSUVSX1FVQUxfQllfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYgICAgICAgICAgICAvKio8IFF1YWwgQnkgTExJRC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyOworCisvKiogVGVrIEhvbGRvdmVyIEZsYWdzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3MKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0hPTERPVkVSX0ZMQUdTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSE9MRE9WRVJfRkxBR1NfUkVfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSAgICAgICAgLyoqPCBTZW5kIHJlZ2lzdGVyIHJlcXVlc3QgdG8gcmUtcmFuZ2UgT05VLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzOworCisvKiogTURJIE1vZGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbWRpX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTURJX01PREVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTm9uZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NRElfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBBdXRvICovCisgICAgQkNNT0xUX0VQT05fT0FNX01ESV9NT0RFX01BTlVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IE1hbnVhbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NRElfTU9ERV9DUk9TU09WRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBDcm9zc292ZXIgKi8KK30gYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlOworCisvKiogVGVrIElHTVAgRm9yd2FyZGluZyBRdWFsaWZlci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSUdNUF9GT1JXQVJESU5HX1FVQUxJRkVSX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19JR01QX0ZPUldBUkRJTkdfUVVBTElGRVJfTDJEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IEwyIERBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSUdNUF9GT1JXQVJESU5HX1FVQUxJRkVSX1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBWaWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19JR01QX0ZPUldBUkRJTkdfUVVBTElGRVJfSVBfREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgICAgICAvKio8IElQIERBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSUdNUF9GT1JXQVJESU5HX1FVQUxJRkVSX0lQX1NBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwOCwgICAgICAgLyoqPCBJUCBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0lHTVBfRk9SV0FSRElOR19RVUFMSUZFUl9MT0dJQ0FMX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMTAgICAgICAgIC8qKjwgTG9naWNhbCBMaW5rLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcjsKKworLyoqIFRlayBJR01QIFNub29waW5nIE9wdGlvbnMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0lHTVBfU05PT1BJTkdfT1BUSU9OU19ESVNBQkxFX0RPV05TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBEb3duc3RyZWFtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSUdNUF9TTk9PUElOR19PUFRJT05TX0RJU0FCTEVfVVBTVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBEaXNhYmxlIFVwc3RyZWFtLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9uczsKKworLyoqIFNsZWVwIE9wdGlvbnMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xFRVBfT1BUSU9OU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9TTEVFUF9PUFRJT05TX1RYX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAgICAgLyoqPCBUeCBPbmx5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TTEVFUF9PUFRJT05TX1JYX0xBU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBSeCBMYXNlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xFRVBfT1BUSU9OU19TRVJERVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQgICAgICAgIC8qKjwgU2VyRGVzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9uczsKKworLyoqIEllZWUgUmVnaXN0ZXIgRmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3MKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fSUVFRV9SRUdJU1RFUl9GTEFHU19SRVJFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUmVyZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fSUVFRV9SRUdJU1RFUl9GTEFHU19ERVJFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRGVyZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fSUVFRV9SRUdJU1RFUl9GTEFHU19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgQWNrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9JRUVFX1JFR0lTVEVSX0ZMQUdTX05BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgLyoqPCBOYWNrLiAqLworfSBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFnczsKKworLyoqIEllZWUgUmVnaXN0ZXIgQWNrIEZsYWdzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9JRUVFX1JFR0lTVEVSX0FDS19GTEFHU19OQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOYWNrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9JRUVFX1JFR0lTVEVSX0FDS19GTEFHU19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBBY2suICovCit9IGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnczsKKworLyoqIFRlayBGaWxlIFRyYW5zZmVyIEVycm9yLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90cmFuc2Zlcl9lcnJvcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UUkFOU0ZFUl9FUlJPUl9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVW5kZWZpbmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UUkFOU0ZFUl9FUlJPUl9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBOb3QgRm91bmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RSQU5TRkVSX0VSUk9SX05PX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IE5vIEFjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgRnVsbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfSUxMRUdBTF9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgSWxsZWdhbCBPcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfVU5LTk9XTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgVW5rbm93biBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfQkFEX0JMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgQmFkIEJsb2NrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UUkFOU0ZFUl9FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UUkFOU0ZFUl9FUlJPUl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkgICAgICAgICAgICAgLyoqPCBCdXN5LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3I7CisKKy8qKiBUZWsgRmlsZSBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RZUEVfQk9PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEJvb3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RZUEVfQVBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFwcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFlQRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UWVBFX0RJQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBEaWFnLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZTsKKworLyoqIFBNQyBPcCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9TRVRfQUxBUk1fVEhSRVNIT0xEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMiwgICAgICAgICAgLyoqPCBTZXQgQWxhcm0gVGhyZXNob2xkcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUkVfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTMsICAgICAgICAgIC8qKjwgUmUgUmVnaXN0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0ZJUk1XQVJFX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE0LCAgICAgICAgICAvKio8IEZpcm13YXJlIFVwZGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTUsICAgICAgICAgIC8qKjwgR2V0IE9OVSBWZXJzaW9ucyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9HRVRfT05VX1ZFUlNJT05TX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNiwgICAgICAgICAgLyoqPCBHZXQgT05VIFZlcnNpb25zIFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9SRU1PVEVfQUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNywgICAgICAgICAgLyoqPCBSZW1vdGUgQWNjZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9BQ0tOT1dMRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgICAgICAgICAgLyoqPCBBY2tub3dsZWRnZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfQVVUSEVOVElDQVRFX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAgICAgICAgIC8qKjwgQXV0aGVudGljYXRlIE9OVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVFVSTl9PTlVfSU5fVE9fT0ZGX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzAsICAgICAgICAgIC8qKjwgVHVybiBPTlUgSW4gVG8gT2ZmIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0lHTVBfU05PT1BJTkdfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMxLCAgICAgICAgICAvKio8IElHTVAgU25vb3BpbmcgUGFja2V0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfU1RBVFVTX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzIsICAgICAgICAgIC8qKjwgVU5JIFBvcnQgU3RhdHVzIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX1NUQVRVU19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMzLCAgICAgICAgICAvKio8IFVOSSBQb3J0IFN0YXR1cyBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfQ09ORklHVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzQsICAgICAgICAgIC8qKjwgVU5JIFBvcnQgQ29uZmlndXJlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0VOQUJMRV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNSwgICAgICAgICAgLyoqPCBFbmNyeXB0aW9uIEVuYWJsZSBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNiwgICAgICAgICAgLyoqPCBFbmNyeXB0aW9uIEtleS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVEhSRVNIT0xEX1JFUE9SVF9WQUxVRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzcsICAgICAgICAgIC8qKjwgVGhyZXNob2xkIFJlcG9ydCBWYWx1ZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BIWV9MT09QX0JBQ0tfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM4LCAgICAgICAgICAvKio8IFBIWSBMb29wIEJhY2sgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUElOR19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzksICAgICAgICAgIC8qKjwgUGluZyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSU5HX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MCwgICAgICAgICAgLyoqPCBQaW5nIFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9NQUdJQ19OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAgICAgLyoqPCBNYWdpYyBOdW1iZXIuICovCit9IGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZTsKKworLyoqIFBNQyBGaWxlIE9wLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcAoreworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9IRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBIZWFkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NiwgICAgICAgICAgLyoqPCBEYXRhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxMiwgICAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0lEWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzY4LCAgICAgICAgICAvKio8IEluZGV4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MTg0ICAgICAgICAgLyoqPCBBY2suICovCit9IGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcDsKKworLyoqIFBNQyBFcnJvciBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRVJST1JfQ09ERV9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPSy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0VSUk9SX0NPREVfQkFEX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTM2LCAgICAgICAgIC8qKjwgQmFkIFNpemUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19FUlJPUl9DT0RFX0JBRF9CTE9DS19JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0OCwgICAgICAgICAvKio8IEJhZCBCbG9jayBJbmRleC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0VSUk9SX0NPREVfQkFEX0NSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzA0LCAgICAgICAgIC8qKjwgQmFkIENSQy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0VSUk9SX0NPREVfVU5LTk9XTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNTg0LCAgICAgICAgIC8qKjwgVW5rbm93biBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRVJST1JfQ09ERV9OT19IRUFERVJfUkVDRUlWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzNTIsICAgICAgICAgLyoqPCBObyBIZWFkZXIgUmVjZWl2ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0VSUk9SX0NPREVfTk9UX1NUQVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjA4ICAgICAgICAgIC8qKjwgTm90IFN0YXJ0ZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZTsKKworLyoqIE9OVSBNYXN0ZXIgUHJvdG9jb2wuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2wKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9QSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9FTkNBUFNVTEFURURfRlJBTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRW5jYXBzdWxhdGVkIEZyYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX09BTV9DT05URU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBPQU0gQ29udGVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9CUk9BRENPTV9TREsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgQnJvYWRjb20gU0RLLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX1JFR0lTVEVSRURfT0FNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBSZWdpc3RlcmVkIE9BTS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9NQVNURVJfQ09NTVVOSUNBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgTWFzdGVyIENvbW11bmljYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX1BST1RPQ09MX1RFS19VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjYgICAgICAgICAvKio8IE1hc3RlciBQcm90b2NvbCBUZWsgVW5rbm93bi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2w7CisKKy8qKiBPTlUgTWFzdGVyIFBpbmcgRmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BJTkdfRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUElOR19GTEFHU19TQVRJU0ZJRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IFNhdGlzZmllZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QSU5HX0ZMQUdTX1BBVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDBVICAgICAgIC8qKjwgUGF1c2UuICovCit9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3M7CisKKy8qKiBNYXN0ZXIgRW5kIFBvaW50IFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfRU5EX1BPSU5UX1RZUEVfT05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9FTkRfUE9JTlRfVFlQRV9PTlVfTUFTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9OVSBNYXN0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9FTkRfUE9JTlRfVFlQRV9PTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IE9MVC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZTsKKworLyoqIE9OVSBNYXN0ZXIgQ29tbXVuaWNhdGlvbiBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1VTklDQVRJT05fVFlQRV9DT01NQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBDb21tYW5kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1VTklDQVRJT05fVFlQRV9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCAgICAgICAgICAgLyoqPCBSZXNwb25zZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlOworCisvKiogT05VIE1hc3RlciBDb21tYW5kIElELiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1RFUk1JTkFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVGVybWluYXRvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0VOQUJMRV9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRW5hYmxlIE9OVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0RJU0FCTEVfT05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT05VX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEdldCBPTlUgU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT0FNX1JFR0lTVFJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU3LCAgICAgICAgICAvKio8IEdldCBPQU0gUmVnaXN0cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX09BTV9SRUdJU1RSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1OCwgICAgICAgICAgLyoqPCBTZXQgT0FNIFJlZ2lzdHJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9ORUdPVElBVEVEX09BTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTksICAgICAgICAgIC8qKjwgR2V0IE5lZ290aWF0ZWQgT0FNLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX05FR09USUFURURfT0FNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MCAgICAgICAgICAgLyoqPCBTZXQgTmVnb3RpYXRlZCBPQU0uICovCit9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWQ7CisKKy8qKiBPQU0gUmVnaXN0cmF0aW9uIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRG8gbm90IG1vZGlmeSB0aGUgcmVnaXN0cmF0aW9uIHN0YXRlOyBwcm92aWRlIG1vcmUgcXVhbGlmaWVycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgU2V0IHRoZSByZWdpc3RyYXRpb24gc3RhdGUgdG8gcmVnaXN0ZXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU2V0IHRoZSByZWdpc3RyYXRpb24gc3RhdGUgdG8gbm90IHJlZ2lzdGVyZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgICAgICAvKio8IFNldCB0aGUgcmVnaXN0cmF0aW9uIHN0YXRlIHRvIHJlZ2lzdGVyZWQsIGJ1dCBhbGxvdyBmb3IgZnVydGhlciBxdWFsaWZpZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCAgICAgICAgICAgLyoqPCBTZXQgdGhlIHJlZ2lzdHJhdGlvbiBzdGF0ZSB0byBub3QgcmVnaXN0ZXJlZCwgYnV0IGFsbG93IGZvciBmdXJ0aGVyIHF1YWxpZmllcnMuICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbjsKKworLyoqIE9BTSBSZWcgSW5mbyBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHX0lORk9fVFlQRV9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NCAgICAgICAgICAgLyoqPCBWZW5kb3IuICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZTsKKworLyoqIE1hc3RlciBDb250ZXh0IFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT05VLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX05FVFdPUktfUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBOZXR3b3JrIFBvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTGluay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9VU0VSX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgVXNlciBQb3J0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZTsKKworLyoqIENUQyBWZXJzaW9uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WRVJTSU9OX0xBVEVTVF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IExhdGVzdCBTdXBwb3J0ZWQgVmVyc2lvbiwgY3VycmVudGx5LCAgSXQncyBDVEMgMi4xLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkVSU0lPTl9DVEMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBDVEMgMS4wICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WRVJTSU9OX0NUQzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IENUQyAxLjMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZFUlNJT05fQ1RDMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgIC8qKjwgQ1RDIDIuMCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkVSU0lPTl9DVEMyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAgICAgLyoqPCBDVEMgMi4xICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WRVJTSU9OX0NUQzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDgsICAgICAgICAgICAvKio8IENUQyAzLjAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZFUlNJT05fQ1VDMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTMsICAgICAgICAgIC8qKjwgQ1VDIDEuMCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkVSU0lPTl9DVUMyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5NCwgICAgICAgICAgLyoqPCBDVUMgMi4wICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WRVJTSU9OX0NVQzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk1ICAgICAgICAgICAvKio8IENVQyAzLjAgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uOworCisvKiogT05VIE1hc3RlciBSZXNwb25zZSBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9SRVNQT05TRV9DT0RFX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9SRVNQT05TRV9DT0RFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTm90IFN1cHBvcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9SRVNQT05TRV9DT0RFX0JBRF9QQVJBTUVURVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQmFkIFBhcmFtZXRlcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUkVTUE9OU0VfQ09ERV9OT19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IE5vIFJlc291cmNlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9SRVNQT05TRV9DT0RFX0hBUkRXQVJFX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgSGFyZHdhcmUgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9SRVNQT05TRV9DT0RFX0JBRF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgQmFkIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1JFU1BPTlNFX0NPREVfU1lTVEVNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYgICAgICAgICAgICAgLyoqPCBTeXN0ZW0gQnVzeS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZTsKKworLyoqIE9OVSBzdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfU1RBVEVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBFbmFibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlOworCisvKiogTWRpIENyb3Nzb3Zlci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3ZlcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9NRElfQ1JPU1NPVkVSX09BTV9NRElfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPQU0gTWRpIEF1dG8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX01ESV9DUk9TU09WRVJfT0FNX01ESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9BTSBNZGkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01ESV9DUk9TU09WRVJfT0FNX01ESV9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IE9BTSBNZGkgWC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX21kaV9jcm9zc292ZXI7CisKKy8qKiBTZG0gU3RhdC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fc2RtX3N0YXQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fU0RNX1NUQVRfUVVBTlRJWkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUXVhbnRpemVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TRE1fU1RBVF9BTVBMSVRVREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBBbXBsaXR1ZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NETV9TVEFUX1BIQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IFBoYXNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fc2RtX3N0YXQ7CisKKy8qKiBUTFMgSGFzaCBBbGdvcml0aG0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobQoreworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFTSF9BTEdPUklUSE1fTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOb25lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFTSF9BTEdPUklUSE1fTUQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBNRDUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQVNIX0FMR09SSVRITV9TSEExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFNIQTEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQVNIX0FMR09SSVRITV9TSEEyMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFNIQTIyNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBU0hfQUxHT1JJVEhNX1NIQTI1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgU0hBMjU2LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFTSF9BTEdPUklUSE1fU0hBMzg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBTSEEzODQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQVNIX0FMR09SSVRITV9TSEE1MTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiAgICAgICAgICAgICAvKio8IFNIQTUxMi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobTsKKworLyoqIFRMUyBTaWduYXR1cmUgQWxnb3JpdGhtLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobQoreworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfU0lHTkFUVVJFX0FMR09SSVRITV9BTk9OWU1PVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBBbm9ueW1vdXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19TSUdOQVRVUkVfQUxHT1JJVEhNX1JTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFJTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX1NJR05BVFVSRV9BTEdPUklUSE1fRFNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRFNBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfU0lHTkFUVVJFX0FMR09SSVRITV9FQ0RTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBFQ0RTQS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtOworCisvKiogQmluYXJ5IEVudHJ5IENWSUQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWQKK3sKKyAgICB1aW50MTZfdCBjdmlkOyAgLyoqPCBDVklELiAqLworfSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWQ7CisKKy8qKiBCaW5hcnkgRW50cnkgTUFDLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMKK3sKKyAgICB1aW50MTZfdCBzd2l0Y2hpbmdfZG9tYWluOyAgLyoqPCBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYzsgICAgICAvKio8IE1BQy4gKi8KKyAgICB1aW50OF90IGxpbmtfaWQ7ICAgICAgICAgICAgLyoqPCBMaW5rIElkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYzsKKworLyoqIEJpbmFyeSBFbnRyeSBQcm9ncmFtbWFibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZQoreworICAgIHVpbnQzMl90IHByb2dyYW1tYWJsZV9maWVsZDA7ICAgLyoqPCBQcm9ncmFtbWFibGUgRmllbGQgMC4gKi8KKyAgICB1aW50MzJfdCBwcm9ncmFtbWFibGVfZmllbGQxOyAgIC8qKjwgUHJvZ3JhbW1hYmxlIEZpZWxkIDEuICovCit9IGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlOworCisvKiogQmluYXJ5IEVudHJ5IFNTTSBJUC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwCit7CisgICAgdWludDE2X3Qgc3dpdGNoaW5nX2RvbWFpbjsgICAgICAvKio8IFN3aXRjaGluZyBEb21haW4uICovCisgICAgdWludDE2X3Qgc3NtX3NvdXJjZV9pZDsgICAgICAgICAvKio8IFNTTSBTb3VyY2UgSUQuICovCisgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGlwYWRkcmVzczsgICAvKio8IElQIEFkZHJlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwOworCisvKiogQmluYXJ5IEVudHJ5IFNWTEFOICsgQ1ZMQU4uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4KK3sKKyAgICB1aW50MTZfdCBzdmlkOyAgLyoqPCBTVklELiAqLworICAgIHVpbnQxNl90IGN2aWQ7ICAvKio8IENWSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbjsKKworLyoqIFBlci1jaGFubmVsIGNvbW1hbmQgb3B0aW9uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbgoreworICAgIHVpbnQ4X3QgY2hhbm5lbF9pZDsgLyoqPCBDaGFubmVsIGluZGV4ICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uIG9wdGlvbl9jb2RlOyAgICAvKio8IE9wZXJhdGlvbiBjb2RlICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uOworCisvKiogUGVyLWNoYW5uZWwgcmVzdWx0cyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQKK3sKKyAgICB1aW50OF90IGNoYW5uZWxfaWQ7IC8qKjwgQ2hhbm5lbCBpbmRleCAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZSByZXN1bHRfY29kZTsgICAvKio8IE9wZXJhdGlvbiByZXN1bHQgY29kZSAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdDsKKworLyoqIENNQyBDbGFzc2lmaWVyIGNvbmZpZ3VyYXRpb24gZGF0YSBmb3JtYXQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhCit7CisgICAgdWludDMyX3Qgc3ZjX2Zsb3dfaWQ7ICAgICAgICAgICAvKio8IFNlcnZpY2UgRmxvdyBJRCAqLworICAgIHVpbnQzMl90IGNsYXNzaWZpZXJfaWQ7ICAgICAgICAgLyoqPCBDbGFzc2lmaWVyIElEICovCisgICAgdWludDhfdCBkaXJlY3Rpb247ICAgICAgICAgICAgICAvKio8IENsYXNzaWZpZXIgRGlyZWN0aW9uICgxID0gRG93bnN0cmVhbSwgMiA9IFVwc3RyZWFtKSAqLworICAgIHVpbnQ4X3Qgc3RhdGU7ICAgICAgICAgICAgICAgICAgLyoqPCBDbGFzc2lmaWVyIFN0YXRlICgxID0gQWN0aXZlLCAyID0gSW5hY3RpdmUpICovCisgICAgdWludDMyX3QgcHJpb3JpdHk7ICAgICAgICAgICAgICAvKio8IFJ1bGUgUHJpb3JpdHkgKDEuLjI1NSkgKi8KKyAgICB1aW50OF90IGlwdG9zX2xvdzsgICAgICAgICAgICAgIC8qKjwgTG93IHZhbHVlIG9mIElQIFRvUyByYW5nZSAqLworICAgIHVpbnQ4X3QgaXB0b3NfaGlnaDsgICAgICAgICAgICAgLyoqPCBIaWdoIHZhbHVlIG9mIElQIFRvUyByYW5nZSAqLworICAgIHVpbnQ4X3QgaXB0b3NfbWFzazsgICAgICAgICAgICAgLyoqPCBJUCBUb1MgTWFzayB2YWx1ZSAqLworICAgIHVpbnQzMl90IGlwcHJvdG87ICAgICAgICAgICAgICAgLyoqPCBJUCBQcm90b2NvbCB2YWx1ZSAqLworICAgIHVpbnQ4X3QgaXBhZGRyX3R5cGU7ICAgICAgICAgICAgLyoqPCBJUCBBZGRyZXNzIFR5cGUgKDAgPSBVbmtub3duLCAxID0gSVB2NCwgMiA9IElQdjYsIDMgPSBJUHY0eiwgNCA9IElQdjZ6LCAxNiA9IEROUykgKi8KKyAgICB1aW50OF90IGlwc3JjX2FkZHJfbGVuZ3RoOyAgICAgIC8qKjwgTGVuZ3RoIG9mIElQIFNvdXJjZSBBZGRyZXNzIGZpZWxkICovCisgICAgdWludDhfdCAqaXBzcmNfYWRkcjsgICAgICAgICAgICAvKio8IElQIFNvdXJjZSBBZGRyZXNzICovCisgICAgdWludDhfdCBpcHNyY19tYXNrX2xlbmd0aDsgICAgICAvKio8IExlbmd0aCBvZiBJUCBTb3VyY2UgTWFzayBmaWVsZCAqLworICAgIHVpbnQ4X3QgKmlwc3JjX21hc2s7ICAgICAgICAgICAgLyoqPCBJUCBTb3VyY2UgTWFzayAqLworICAgIHVpbnQ4X3QgaXBkc3RfYWRkcl9sZW5ndGg7ICAgICAgLyoqPCBMZW5ndGggb2YgSVAgRGVzdGluYXRpb24gQWRkcmVzcyBmaWVsZCAqLworICAgIHVpbnQ4X3QgKmlwZHN0X2FkZHI7ICAgICAgICAgICAgLyoqPCBJUCBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisgICAgdWludDhfdCBpcGRzdF9tYXNrX2xlbmd0aDsgICAgICAvKio8IExlbmd0aCBvZiBJUCBEZXN0aW5hdGlvbiBNYXNrIGZpZWxkICovCisgICAgdWludDhfdCAqaXBkc3RfbWFzazsgICAgICAgICAgICAvKio8IElQIERlc3RpbmF0aW9uIE1hc2sgKi8KKyAgICB1aW50MzJfdCBzcmNfcG9ydF9zdGFydDsgICAgICAgIC8qKjwgVENQL1VEUCBTb3VyY2UgUG9ydCByYW5nZSBzdGFydCAqLworICAgIHVpbnQzMl90IHNyY19wb3J0X2VuZDsgICAgICAgICAgLyoqPCBUQ1AvVURQIFNvdXJjZSBQb3J0IHJhbmdlIGVuZCAqLworICAgIHVpbnQzMl90IGRzdF9wb3J0X3N0YXJ0OyAgICAgICAgLyoqPCBUQ1AvVURQIERlc3RpbmF0aW9uIFBvcnQgcmFuZ2Ugc3RhcnQgKi8KKyAgICB1aW50MzJfdCBkc3RfcG9ydF9lbmQ7ICAgICAgICAgIC8qKjwgVENQL1VEUCBEZXN0aW5hdGlvbiBQb3J0IHJhbmdlIGVuZCAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGRzdF9tYWNfYWRkcjsgLyoqPCBEZXN0aW5hdGlvbiBNQUMgQWRkcmVzcyAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGRzdF9tYWNfbWFzazsgLyoqPCBEZXN0aW5hdGlvbiBNQUMgTWFzayAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIHNyY19tYWNfYWRkcjsgLyoqPCBTb3VyY2UgTUFDIEFkZHJlc3MgKi8KKyAgICB1aW50OF90IGwycHJvdG9fdHlwZTsgICAgICAgICAgIC8qKjwgVHlwZSBvZiBMMiBQcm90b2NvbCB0byBjbGFzc2lmeSBvbiAoMCA9IE5vbmUsIDEgPSBFdGhlcnR5cGUsIDIgPSBEU0FQLCAzID0gTUFDLCA0ID0gQWxsKSAqLworICAgIHVpbnQzMl90IGwycHJvdG9fdmFsdWU7ICAgICAgICAgLyoqPCBMMiBQcm90b2NvbCBWYWx1ZSAqLworICAgIHVpbnQzMl90IHVzZXJfcHJpb3JpdHlfbG93OyAgICAgLyoqPCA4MDIuMXEgQ09TIHJhbmdlLCBsb3cgdmFsdWUgKi8KKyAgICB1aW50MzJfdCB1c2VyX3ByaW9yaXR5X2hpZ2g7ICAgIC8qKjwgODAyLjFxIENPUyByYW5nZSwgaGlnaCB2YWx1ZSAqLworICAgIHVpbnQzMl90IHZsYW5faWQ7ICAgICAgICAgICAgICAgLyoqPCA4MDIuMXEgVkxBTiBJRCAqLworICAgIHVpbnQyNF90IGJpdG1hcDsgICAgICAgICAgICAgICAgLyoqPCBCaXRtYXAgaW5kaWNhdGluZyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgZmllbGRzICovCisgICAgdWludDMyX3QgZmxvd19sYWJlbDsgICAgICAgICAgICAvKio8IElQdjYgRmxvdyBMYWJlbCAgKi8KKyAgICB1aW50MzJfdCBjbWltOyAgICAgICAgICAgICAgICAgIC8qKjwgQ2FibGUgTW9kZW0gSW50ZXJmYWNlIE1hc2sgKi8KKyAgICB1aW50NjRfdCBwa3RfbWF0Y2hlczsgICAgICAgICAgIC8qKjwgQ291bnQgb2YgcGFja2V0cyBtYXRjaGluZyB0aGlzIGNsYXNzaWZpZXIgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGE7CisKKy8qKiBDTUMgSW50ZXJmYWNlIFJlc3BvbnNlIGZvcm1hdCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhCit7CisgICAgdWludDE2X3QgaW50Zl9pbmRleDsgICAgICAgICAgICAgICAgLyoqPCBVbmlxdWUgaW50ZXJmYWNlIGluZGV4IHdpdGhpbiBDTUMgKi8KKyAgICB1aW50OF90IGludGZfZGVzY3JpcHRpb25fbGVuZ3RoOyAgICAvKio8IExlbmd0aCBvZiBJbnRlcmZhY2UgRGVzY3JpcHRpb24gZmllbGQgKi8KKyAgICB1aW50OF90ICppbnRmX2Rlc2NyaXB0aW9uOyAgICAgICAgICAvKio8IEludGVyZmFjZSBEZXNjcmlwdGlvbiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGUgaW50Zl90eXBlOyAgIC8qKjwgSW50ZXJmYWNlIFR5cGUgKi8KKyAgICB1aW50OF90IGludGZfcGh5X2FkZHJfbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBvZiBJbnRlcmZhY2UgUGh5c2ljYWwgQWRkcmVzcyBmaWVsZCAqLworICAgIHVpbnQ4X3QgKmludGZfcGh5X2FkZHI7ICAgICAgICAgLyoqPCBJbnRlcmZhY2UgUGh5c2ljYWwgQWRkcmVzcyBmaWVsZCAqLworICAgIHVpbnQ4X3QgaW50Zl9hbGlhc19uYW1lX2xlbmd0aDsgLyoqPCBMZW5ndGggb2YgSW50ZXJmYWNlIEFsaWFzIE5hbWUgKi8KKyAgICB1aW50OF90ICppbnRmX2FsaWFzX25hbWU7ICAgICAgIC8qKjwgSW50ZXJmYWNlIEFsaWFzIE5hbWUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhOworCisvKiogQ01DIGludGVyZmFjZSBzdGF0aXN0aWNzIGRhdGEgZm9ybWF0IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhCit7CisgICAgdWludDE2X3QgaWZfaW5kZXg7ICAvKio8IGlmSW5kZXggb2YgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICB1aW50MTZfdCBpZl9tdHU7ICAgIC8qKjwgaWZNdHUgb2YgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICB1aW50MzJfdCBpZl9zcGVlZDsgIC8qKjwgaWZTcGVlZCBvZiBuZXR3b3JrIGludGVyZmFjZSAoaW4gTWJwcykgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1cyBpZl9hZG1pbl9zdGF0dXM7ICAvKio8IGlmQWRtaW5TdGF0dXMgb2YgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1cyBpZl9vcGVyX3N0YXR1czsgICAvKio8IGlmT3BlclN0YXR1cyBvZiBuZXR3b3JrIGludGVyZmFjZSAqLworICAgIHVpbnQzMl90IGlmX2xhc3RfY2hhbmdlOyAgICAgICAgICAgICAgICAvKio8IGlmTGFzdENoYW5nZSBvZiBuZXR3b3JrIGludGVyZmFjZSAqLworICAgIHVpbnQ2NF90IGlmX2hjaW5fb2N0ZXRzOyAgICAgICAgICAgICAgICAvKio8IENvdW50IG9mIFVTIEJ5dGVzIFJlY2VpdmVkICovCisgICAgdWludDY0X3QgaWZfaGNpbl91Y2FzdF9wa3RzOyAgICAgICAgICAgIC8qKjwgQ291bnQgb2YgVVMgVW5pY2FzdCBQa3RzIFJlY2VpdmVkICovCisgICAgdWludDY0X3QgaWZfaGNpbl9tdWx0aWNhc3RfcGt0czsgICAgICAgIC8qKjwgQ291bnQgb2YgVVMgTXVsdGljYXN0IFBrdHMgUmVjZWl2ZWQgKi8KKyAgICB1aW50NjRfdCBpZl9oY2luX2Jyb2FkY2FzdF9wa3RzOyAgICAgICAgLyoqPCBDb3VudCBvZiBVUyBCcm9hZGNhc3QgUGt0cyBSZWNlaXZlZCAqLworICAgIHVpbnQzMl90IGlmX2luX2Rpc2NhcmRzOyAgICAgICAgICAgICAgICAvKio8IENvdW50IG9mIFVTIFBrdHMgRGlzY2FyZGVkICovCisgICAgdWludDMyX3QgaWZfaW5fZXJyb3JzOyAgICAgICAgICAgICAgICAgIC8qKjwgQ291bnQgb2YgVVMgUGt0cyBSZWNlaXZlZCB3aXRoIEVycm9ycyAqLworICAgIHVpbnQzMl90IGlmX2luX3Vua25vd25fcHJvdG9zOyAgICAgICAgICAvKio8IENvdW50IG9mIFVTIFBrdHMgUmVjZWl2ZWQgb2YgVW5rbm93biBQcm90b2NvbCBUeXBlICovCisgICAgdWludDY0X3QgaWZfaGNvdXRfb2N0ZXRzOyAgICAgICAgICAgICAgIC8qKjwgQ291bnQgb2YgRFMgQnl0ZXMgVHJhbnNtaXR0ZWQgKi8KKyAgICB1aW50NjRfdCBpZl9oY291dF91Y2FzdF9wa3RzOyAgICAgICAgICAgLyoqPCBDb3VudCBvZiBEUyBVbmljYXN0IFBrdHMgVHJhbnNtaXR0ZWQgKi8KKyAgICB1aW50NjRfdCBpZl9oY291dF9tdWx0aWNhc3RfcGt0czsgICAgICAgLyoqPCBDb3VudCBvZiBEUyBNdWx0aWNhc3QgUGt0cyBUcmFuc21pdHRlZCAqLworICAgIHVpbnQ2NF90IGlmX2hjb3V0X2Jyb2FkY2FzdF9wa3RzOyAgICAgICAvKio8IENvdW50IG9mIERTIEJyb2FkY2FzdCBQa3RzIFRyYW5zbWl0dGVkICovCisgICAgdWludDMyX3QgaWZfb3V0X2Rpc2NhcmRzOyAgICAgICAgICAgICAgIC8qKjwgQ291bnQgb2YgRFMgUGt0cyBEaXNjYXJkZWQgKi8KKyAgICB1aW50MzJfdCBpZl9vdXRfZXJyb3JzOyAgICAgICAgICAgICAgICAgLyoqPCBDb3VudCBvZiBEUyBQa3RzIG5vdCB0cmFuc21pdHRlZCBkdWUgdG8gRXJyb3JzICovCisgICAgdWludDhfdCBpZl9saW5rX3VwX2Rvd25fdHJhcF9lbmFibGU7ICAgIC8qKjwgV2hldGhlciBsaW5rIHVwL2Rvd24gdHJhcHMgc2hvdWxkIGJlIGdlbmVyYXRlZCAqLworICAgIHVpbnQ4X3QgaWZfcHJvbWlzY3VvdXNfbW9kZTsgICAgICAgICAgICAvKio8IFdoZXRoZXIgaW50ZXJmYWNlIGlzIGluIHByb21pc2N1b3VzIG1vZGUgb3Igbm90ICovCisgICAgdWludDhfdCBpZl9jb25uZWN0b3JfcHJlc2VudDsgICAgICAgICAgIC8qKjwgV2hldGhlciBwaHlzaWNhbCBjb25uZWN0b3IgZXhpc3RzIG9uIGludGVyZmFjZSAqLworICAgIHVpbnQzMl90IGlmX2NvdW50ZXJfZGlzY29udGludWl0eV90aW1lOyAvKio8IFRpbWUgd2hlbiBhbnkgY291bnRlciBzdWZmZXJlZCBhIGRpc2NvbnRpbnVpdHkgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YTsKKworLyoqIENNQyBTZXJ2aWNlIEZsb3cgY29uZmlndXJhdGlvbiBkYXRhIGZvcm1hdCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhCit7CisgICAgdWludDMyX3Qgc3ZjX2Zsb3dfaWQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgU2VydmljZSBGbG93IElEICovCisgICAgdWludDE2X3Qgc2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2VydmljZSBJZGVudGlmaWVyIChTSUQpICovCisgICAgdWludDhfdCBkaXJlY3Rpb247ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmxvdyBEaXJlY3Rpb24gKDEgPSBEb3duc3RyZWFtLCAyID0gVXBzdHJlYW0pICovCisgICAgdWludDhfdCBmbG93X3R5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmxvdyBUeXBlICgxID0gUHJpbWFyeSwgMiA9IFNlY29uZGFyeSkgKi8KKyAgICB1aW50OF90IHFvc190eXBlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBRb3MgU2V0IFR5cGUgKDAgPSBBY3RpdmUsIDEgPSBBZG1pdHRlZCwgMiA9IFByb3Zpc2lvbmVkKSAqLworICAgIHVpbnQzMl90IGNoYW5uZWxfc2V0X2lkOyAgICAgICAgICAgICAgICAvKio8IENoYW5uZWwgc2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VydmljZSBGbG93ICovCisgICAgdWludDI0X3QgZHNpZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRFNJRCBhc3NvY2lhdGVkIHdpdGggdGhlIFNlcnZpY2UgRmxvdyAqLworICAgIHVpbnQ4X3QgbWF4X3JlcXVlc3RzX3Blcl9zaWRfY2x1c3RlcjsgICAvKio8IE1heCByZXF1ZXN0cyBiZWZvcmUgU0lEIGNsdXN0ZXIgbXVzdCBzd2l0Y2ggKi8KKyAgICB1aW50MzJfdCBtYXhfYnl0ZXNfcGVyX3NpZF9jbHVzdGVyOyAgICAgLyoqPCBNYXggYnl0ZXMgdGhhdCBjYW4gYmUgb3V0c3RhbmRpbmcgZm9yIFNJRCBjbHVzdGVyICovCisgICAgdWludDMyX3QgdG90YWxfYnl0ZXNfcGVyX3NpZF9jbHVzdGVyOyAgIC8qKjwgVG90YWwgYnl0ZXMgdGhhdCBjYW4gYmUgcmVxdWVzdGVkIGZvciBTSUQgY2x1c3RlciAqLworICAgIHVpbnQxNl90IG1heF90aW1lX3Blcl9zaWRfY2x1c3RlcjsgICAgICAvKio8IE1heCB0aW1lIChpbiBtc2VjKSB0aGF0IGNhbiBiZSB1c2VkIGZvciBTSUQgY2x1c3RlciAqLworICAgIHVpbnQ4X3Qgc2VydmljZV9jbGFzc19sZW5ndGg7ICAgICAgICAgICAvKio8IExlbmd0aCBvZiBTZXJ2aWNlIENsYXNzIE5hbWUgKi8KKyAgICB1aW50OF90ICpzZXJ2aWNlX2NsYXNzOyAgICAgICAgICAgICAgICAgLyoqPCBTZXJ2aWNlIENsYXNzIE5hbWUgKi8KKyAgICB1aW50OF90IHByaW9yaXR5OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFmZmljIFByaW9yaXR5ICgwLi43KSAqLworICAgIHVpbnQ4X3QgcmVzZXFfZHNpZF9zdXBwb3J0OyAgICAgICAgICAgICAvKio8IERTSUQgU3VwcG9ydCAoMSA9IFRydWUsIDIgPSBGYWxzZSwgMyA9IE4vQSkgKi8KKyAgICB1aW50MzJfdCBtYXhfcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIFN1c3RhaW5lZCBUcmFmZmljIFJhdGUgaW4gYnBzICovCisgICAgdWludDMyX3QgbWF4X2J1cnN0OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBUcmFmZmljIEJ1cnN0IGluIGJ5dGVzICovCisgICAgdWludDMyX3QgbWluX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWluaW11bSBHdWFyYW50ZWVkIFJhdGUgaW4gYnBzICovCisgICAgdWludDE2X3QgbWluX3BrdF9zaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgQXNzdW1lZCBNaW5pbXVtIFBhY2tldCBzaXplIGluIGJ5dGVzICovCisgICAgdWludDE2X3QgYWN0aXZlX3RpbWVvdXQ7ICAgICAgICAgICAgICAgIC8qKjwgQWN0aXZlIFBhcmFtZXRlciBTZXQgdGltZW91dCBpbiBzZWNvbmRzICovCisgICAgdWludDE2X3QgYWRtaXR0ZWRfdGltZW91dDsgICAgICAgICAgICAgIC8qKjwgQWRtaXR0ZWQgUGFyYW1ldGVyIFNldCB0aW1lb3V0IGluIHNlY29uZHMgKi8KKyAgICB1aW50MTZfdCBtYXhfY29uY2F0X2J1cnN0OyAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIENvbmNhdGVuYXRlZCBCdXJzdCBpbiBieXRlcyAqLworICAgIHVpbnQ4X3Qgc2NoZWR1bGluZ190eXBlOyAgICAgICAgICAgICAgICAvKio8IFVwc3RyZWFtIFNjaGVkdWxpbmcgVHlwZSAqLworICAgIHVpbnQzMl90IG5vbV9wb2xsX2ludHZsOyAgICAgICAgICAgICAgICAvKio8IE5vbWluYWwgUG9sbGluZyBJbnRlcnZhbCBpbiB1c2VjICovCisgICAgdWludDMyX3QgdG9sX3BvbGxfaml0dGVyOyAgICAgICAgICAgICAgIC8qKjwgVG9sZXJhdGVkIFBvbGwgSml0dGVyIGluIHVzZWMgKi8KKyAgICB1aW50MTZfdCB1bnNvbF9ncmFudF9zaXplOyAgICAgICAgICAgICAgLyoqPCBVbnNvbGljaXRlZCBHcmFudCBTaXplIGluIGJ5dGVzICovCisgICAgdWludDMyX3Qgbm9tX2dyYW50X2ludHZsOyAgICAgICAgICAgICAgIC8qKjwgTm9taW5hbCBHcmFudCBJbnRlcnZhbCBpbiB1c2VjICovCisgICAgdWludDMyX3QgdG9sX2dyYW50X2ppdHRlcjsgICAgICAgICAgICAgIC8qKjwgVG9sZXJhdGVkIEdyYW50IEppdHRlciBpbiB1c2VjICovCisgICAgdWludDhfdCB0b3NfYW5kX21hc2tfbGVuZ3RoOyAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIFRvUyBBTkQgTWFzayAqLworICAgIHVpbnQ4X3QgKnRvc19hbmRfbWFzazsgICAgICAgICAgICAgICAgICAvKio8IFRvUyBBTkQgTWFzayAqLworICAgIHVpbnQ4X3QgdG9zX29yX21hc2tfbGVuZ3RoOyAgICAgICAgICAgICAvKio8IExlbmd0aCBvZiBUb1MgT1IgTWFzayAqLworICAgIHVpbnQ4X3QgKnRvc19vcl9tYXNrOyAgICAgICAgICAgICAgICAgICAvKio8IFRvUyBPUiBNYXNrICovCisgICAgdWludDMyX3QgbWF4X2xhdGVuY3k7ICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBMYXRlbmN5IGluIHVzZWMgKi8KKyAgICB1aW50OF90IHJlcV90cmFuc19wb2xpY3lfbGVuZ3RoOyAgICAgICAgLyoqPCBMZW5ndGggb2YgUmVxdWVzdC9UcmFuc21pc3Npb24gUG9saWN5ICovCisgICAgdWludDhfdCAqcmVxX3RyYW5zX3BvbGljeTsgICAgICAgICAgICAgIC8qKjwgUmVxdWVzdC9UcmFuc21pc3Npb24gUG9saWN5ICovCisgICAgdWludDMyX3QgYml0bWFwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQml0bWFwIGluZGljYXRpbmcgZXhwbGljaXRseSBjb25maWd1cmVkIGZpZWxkcyAqLworICAgIHVpbnQzMl90IHJlcWRfYXR0cmliX21hc2s7ICAgICAgICAgICAgICAvKio8IFJlcXVpcmVkIGF0dHJpYnV0ZSBtYXNrICovCisgICAgdWludDMyX3QgZm9yYmlkX2F0dHJpYl9tYXNrOyAgICAgICAgICAgIC8qKjwgRm9yYmlkZGVuIGF0dHJpYnV0ZSBtYXNrICovCisgICAgdWludDMyX3QgYXR0cmliX2FnZ3JfbWFzazsgICAgICAgICAgICAgIC8qKjwgQXR0cmlidXRlIGFnZ3JlZ2F0aW9uIG1hc2sgKi8KKyAgICB1aW50OF90IGF0dHJpYl9tYXNrX3N1Y2Nlc3M7ICAgICAgICAgICAgLyoqPCBJbmRpY2F0ZXMgaWYgY2hhbm5lbCBhZGhlcmVzIHRvIG1hc2tzICgxID0gVHJ1ZSwgMiA9IEZhbHNlKSAqLworICAgIHVpbnQ4X3QgYXBwbGljYXRpb25faWRsZW5ndGg7ICAgICAgICAgICAvKio8IExlbmd0aCBvZiBBcHBsaWNhdGlvbiBJZGVudGlmaWVyICovCisgICAgdWludDhfdCAqYXBwbGljYXRpb25faWQ7ICAgICAgICAgICAgICAgIC8qKjwgQXBwbGljYXRpb24gSWRlbnRpZmllciAqLworICAgIHVpbnQ4X3QgY29udF9yZXFfd2luZG93X211bHRpOyAgICAgICAgICAvKio8IE11bHRpcGxpZXIgZm9yIGRhdGEgY29udGVudGlvbiByZXF1ZXN0IGJhY2tvZmYgKi8KKyAgICB1aW50OF90IGJ3X3JlcV9tdWx0aTsgICAgICAgICAgICAgICAgICAgLyoqPCBNdWx0aXBsaWVyIGZvciBiYW5kd2lkdGggcmVxdWVzdCAqLworICAgIHVpbnQzMl90IHBlYWtfcmF0ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFBlYWsgVHJhZmZpYyBSYXRlIGluIGJwcyAqLworICAgIHVpbnQzMl90IGNyZWF0ZV90aW1lOyAgICAgICAgICAgICAgICAgICAvKio8IFRpbWVzdGFtcCBpbiB0aWNrcyB3aGVuIFNlcnZpY2UgRmxvdyB3YXMgY3JlYXRlZCAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGE7CisKKy8qKiBDTlUgU2VydmljZSBGbG93IHN0YXRpc3RpY3MgZGF0YSBmb3JtYXQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhCit7CisgICAgdWludDMyX3Qgc3ZjX2Zsb3dfaWQ7ICAgICAgIC8qKjwgU2VydmljZSBGbG93IElEICovCisgICAgdWludDY0X3QgdG90YWxfcGt0X2NvdW50OyAgIC8qKjwgVG90YWwgRGF0YSBQa3RzIFJ4L1R4ICovCisgICAgdWludDY0X3QgdG90YWxfYnl0ZV9jb3VudDsgIC8qKjwgQ291bnQgb2YgYWxsIHBvc3QtSENTIGJ5dGVzIFJ4L1R4ICovCisgICAgdWludDMyX3QgYWN0aXZlX3RpbWU7ICAgICAgIC8qKjwgVGltZSB0aGF0IGZsb3cncyBiZWVuIGFjdGl2ZSwgaW4gc2Vjb25kcyAqLworICAgIHVpbnQzMl90IGludmFsaWRfcGhzX2NvdW50OyAvKio8IFBrdHMgUnggd2l0aCBpbnZhbGlkIFBIU0kgKHVwc3RyZWFtIG9ubHkpICovCisgICAgdWludDMyX3QgcGt0c19kcm9wcGVkOyAgICAgIC8qKjwgQ291bnQgb2YgRFMgUGt0cyBkcm9wcGVkICovCisgICAgdWludDMyX3QgcGt0c19kZWxheWVkOyAgICAgIC8qKjwgQ291bnQgb2YgRFMgUGt0cyBkZWxheWVkIGR1ZSB0byBSYXRlIExpbWl0aW5nICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhOworCisvKiogQ05VIE1BQyBBZGRyZXNzIFJhbmdlIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBjbnVfbWFjX2FkZHJlc3Nfc3RhcnQ7ICAgIC8qKjwgU3RhcnQgb2YgQ05VIE1hYyBBZGRyZXNzIFJhbmdlICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgY251X21hY19hZGRyZXNzX2VuZDsgICAgICAvKio8IEVuZCBvZiBDTlUgTWFjIEFkZHJlc3MgUmFuZ2UgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlOworCisvKiogQ05VIFVTIENoYW4gZGF0YSBmb3JtYXQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEKK3sKKyAgICB1aW50OF90IGNoYW5uZWxfaWQ7ICAgICAgICAgICAgICAgICAvKio8IENOVSdzIDFzdCBVcHN0cmVhbSBDaGFubmVsIElEICovCisgICAgdWludDE2X3QgcG93ZXJfbGV2ZWw7ICAgICAgICAgICAgICAgLyoqPCBQb3dlciBMZXZlbCBpbiAxLzEwdGggZEJtViAqLworICAgIHVpbnQzMl90IGhpZ2hfcmVzX3RpbWluZ19vZmZzZXQ7ICAgIC8qKjwgQ05VIHRpbWluZyBvZmZzZXQgaW4gKDYuMjUgdXNlYyAvICg2NCAqIDI1NikpICovCisgICAgdWludDhfdCBlcXVhbGl6YXRpb25fZGF0YV9sZW5ndGg7ICAgLyoqPCBMZW5ndGggb2YgRXF1YWxpemF0aW9uIERhdGEgRmllbGQgKi8KKyAgICB1aW50OF90ICplcXVhbGl6YXRpb25fZGF0YTsgICAgICAgICAvKio8IEVxdWFsaXphdGlvbiBEYXRhICovCisgICAgdWludDY0X3QgdW5lcnJvcmVkczsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgdW5lcnJvcmVkIGNvZGV3b3JkcyAqLworICAgIHVpbnQ2NF90IGNvcnJlY3RlZHM7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNvcnJlY3RlZCBjb2Rld29yZHMgKi8KKyAgICB1aW50NjRfdCB1bmNvcnJlY3RhYmxlczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiB1bmNvcnJlY3RhYmxlIGNvZGV3b3JkcyAqLworICAgIHVpbnQzMl90IHNucjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2lnbmFsIHRvIE5vaXNlIFJhdGlvIGluIHVuaXRzIG9mIDEvMTAgZEIgKi8KKyAgICB1aW50OF90IG1pY3JvX3JlZmxlY3Rpb25zOyAgICAgICAgICAvKio8IE1lYXN1cmVkIG1pY3JvcmVmbGVjdGlvbnMgaW4gdW5pdHMgb2YgZEJjICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGE7CisKKy8qKiBDTlUgU3RhdHVzIFJlc3BvbnNlIGZvcm1hdCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhCit7CisgICAgdWludDMyX3QgaWR4OyAgICAgICAgICAgICAgICAgICAvKio8IFVuaXF1ZSBDTlUgaW5kZXggd2l0aGluIENNQyAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOyAgLyoqPCBNQUMgQWRkcmVzcyBvZiBDTlUgKi8KKyAgICB1aW50OF90IHVzY2hhbl9jb3VudDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIENOVXMgYWN0aXZlIFVTIENoYW5zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSAqdXNjaGFuX2RhdGE7ICAgICAgICAgICAgIC8qKjwgQ05VIFBlci1VUyBjaGFubmVsIGRhdGEgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlIGNvbm5lY3Rpdml0eV9zdGF0ZTsgLyoqPCBDb25uZWN0aXZpdHkgU3RhdGUgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb24gZG9jc2lzX3ZlcnNpb247ICAgICAgICAgLyoqPCBWZXJzaW9uIG9mIERPQ1NJUyB0aGF0IENOVSBpcyBvcGVyYXRpbmcgaW4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGUgaXBhZGRyX3R5cGU7ICAgICAgICAgICAgICAgLyoqPCBUeXBlIG9mIElQIEFkZHIgKi8KKyAgICB1aW50OF90IGlwYWRkcl9sZW5ndGg7ICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIElQIEFkZHIgdmFsdWUgZmllbGQgKi8KKyAgICB1aW50OF90ICppcGFkZHJfdmFsdWU7ICAgICAgICAgIC8qKjwgSVB2NCBvciBJUHY2IEFkZHJlc3MgKi8KKyAgICB1aW50MzJfdCB0aW1lc3RhbXA7ICAgICAgICAgICAgIC8qKjwgVmFsdWUgb2Ygc3lzVXB0aW1lIHdoZW4gbGFzdCB1cGRhdGVkICovCisgICAgdWludDhfdCBzZmxvd19jb3VudDsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBTZXJ2aWNlIEZsb3dzIG9uIENOVSAqLworICAgIHVpbnQzMl90ICpzZmxvd19pZDsgICAgICAgICAgICAgLyoqPCBMaXN0IG9mIFNlcnZpY2UgRmxvdyBJRHMgKi8KKyAgICB1aW50OF90IGxpbmtfbG9jYWxfYWRkcl9sZW5ndGg7IC8qKjwgTGVuZ3RoIG9mIExpbmsgTG9jYWwgQWRkcmVzcyAqLworICAgIHVpbnQ4X3QgKmxpbmtfbG9jYWxfYWRkcjsgICAgICAgLyoqPCBMaW5rIExvY2FsIEFkZHJlc3MgKi8KKyAgICB1aW50MTZfdCBtYWNfZG9tYWluX2luZGV4OyAgICAgIC8qKjwgQ01DIE1BQyBpbmRleCB3aGVyZSBDTlUgaXMgcmVnaXN0ZXJlZCAqLworICAgIHVpbnQzMl90IHNlcnZpY2VfZ3JvdXBfaWQ7ICAgICAgLyoqPCBDTUMgTUFDIERvbWFpbiBTZXJ2aWNlIEdyb3VwIElkICovCisgICAgdWludDhfdCByY3BfaWRsZW5ndGg7ICAgICAgICAgICAvKio8IExlbmd0aCBvZiBSQ1AtSUQgKi8KKyAgICB1aW50OF90ICpyY3BfaWQ7ICAgICAgICAgICAgICAgIC8qKjwgUkNQLUlEIFZhbHVlICovCisgICAgdWludDMyX3QgcmNjX2lkOyAgICAgICAgICAgICAgICAvKio8IFJDQy1JRCAqLworICAgIHVpbnQzMl90IHJjc19pZDsgICAgICAgICAgICAgICAgLyoqPCBSQ1MtSUQgKi8KKyAgICB1aW50MzJfdCB0Y3NfaWQ7ICAgICAgICAgICAgICAgIC8qKjwgVENTLUlEICovCisgICAgdWludDMyX3QgbGFzdF9yZWdpc3Rlcl90aW1lOyAgICAvKio8IFRpbWVzdGFtcCB3aGVuIENOVSBsYXN0IHJlZ2lzdGVyZWQgKi8KKyAgICB1aW50MzJfdCBhZGRyX3Jlc29sdmVfcmVxdWVzdHM7IC8qKjwgTnVtYmVyIG9mIHJlcXVlc3RzIHJlY2VpdmVkIHJlbGF0aW5nIHRvIElQIHJlc29sdXRpb24gZm9yIENOVSAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGE7CisKKy8qKiBQZXItZG93bnN0cmVhbSBjaGFubmVsIHByb3BlcnRpZXMgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzCit7CisgICAgdWludDhfdCBjaGFubmVsX2lkOyAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBjaGFubmVsIGluZGV4ICovCisgICAgYmNtb3NfYm9vbCBpc19lbmFibGVkOyAgICAgIC8qKjwgV2hldGhlciBvciBub3QgdGhlIGNoYW5uZWwgaXMgZW5hYmxlZCAqLworICAgIHVpbnQzMl90IGNlbnRlcl9mcmVxdWVuY3k7ICAvKio8IENlbnRlciBmcmVxdWVuY3kgaW4gSHogKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbiBtb2R1bGF0aW9uOyAgICAgLyoqPCBDaGFubmVsIG1vZHVsYXRpb24gdHlwZSAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leCBhbm5leDsgICAgICAgICAgICAgICAvKio8IENoYW5uZWwgYW5uZXggdHlwZSAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlciBpbnRlcmxlYXZlcjsgICAvKio8IENoYW5uZWwgaW50ZXJsZWF2ZXIgZGVwdGggdmFsdWUgKi8KKyAgICB1aW50MTZfdCBwb3dlcl9sZXZlbDsgICAgICAgLyoqPCBQb3dlciBsZXZlbCBmb3IgY2hhbm5lbCBpbiB0ZW50aHMgZEJtViAqLworICAgIHVpbnQxNl90IGludGVyZmFjZV9pbmRleDsgICAvKio8IEludGVyZmFjZSBpbmRleCBvbiBhIGdldCAvIHJlc2VydmVkIG9uIGEgc2V0ICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzOworCisvKiogUGVyLXVwc3RyZWFtIGNoYW5uZWwgcHJvcGVydGllcyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzCit7CisgICAgdWludDhfdCBjaGFubmVsX2lkOyAgICAgICAgIC8qKjwgVXBzdHJlYW0gY2hhbm5lbCBpbmRleCAqLworICAgIGJjbW9zX2Jvb2wgaXNfZW5hYmxlZDsgICAgICAvKio8IFdoZXRoZXIgb3Igbm90IHRoZSBjaGFubmVsIGlzIGVuYWJsZWQgKi8KKyAgICB1aW50MzJfdCBjZW50ZXJfZnJlcXVlbmN5OyAgLyoqPCBDZW50ZXIgZnJlcXVlbmN5IGluIEh6ICovCisgICAgdWludDMyX3QgY2hhbm5lbF93aWR0aDsgICAgIC8qKjwgV2lkdGggb2YgY2hhbm5lbCBpbiBIeiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGUgY2hhbm5lbF9wcm9maWxlX3R5cGU7ICAvKio8IENoYW5uZWwgcHJvZmlsZSB0eXBlICovCisgICAgYmNtb3NfYm9vbCBpc19zYWMyc2luYzJlbmFibGVkOyAgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCBTYWMyU2luYzIgbW9kZSBpcyBlbmFibGVkICovCisgICAgdWludDMyX3QgbWluaXNsb3Rfc2l6ZTsgICAgICAgICAgICAgLyoqPCBDaGFubmVsIE1pbmlzbG90IFNpemUgaW4gNi4yNSB1c2VjIHRpY2sgdW5pdHMgKi8KKyAgICB1aW50MzJfdCB0cmFuc21pdF90aW1pbmdfb2Zmc2V0OyAgICAvKio8IFRpbWluZyBvZmZzZXQgaW4gMS82NHRoIG9mIDYuMjUgdXNlYyB0aWNrIHVuaXRzICovCisgICAgdWludDhfdCBpbml0aWFsX3JhbmdpbmdfYmFja29mZjsgICAgLyoqPCBSYW5naW5nIEJhY2tvZmYgV2luZG93IFN0YXJ0ICovCisgICAgdWludDhfdCBmaW5hbF9yYW5naW5nX2JhY2tvZmY7ICAgICAgLyoqPCBSYW5naW5nIEJhY2tvZmYgV2luZG93IEVuZCAqLworICAgIHVpbnQ4X3QgaW5pdGlhbF9kYXRhX2JhY2tvZmY7ICAgICAgIC8qKjwgRGF0YSBCYWNrb2ZmIFdpbmRvdyBTdGFydCAqLworICAgIHVpbnQ4X3QgZmluYWxfZGF0YV9iYWNrb2ZmOyAgICAgICAgIC8qKjwgRGF0YSBCYWNrb2ZmIFdpbmRvdyBFbmQgKi8KKyAgICB1aW50OF90IGFjdGl2ZV9zY2RtYV9jb2RlczsgICAgICAgICAvKio8IEFjdGl2ZSBTQ0RNQSBDb2RlcyAqLworICAgIHVpbnQ4X3QgY29kZXNfcGVyX3Nsb3Q7ICAgICAgICAgICAgIC8qKjwgU0NETUEgQ29kZXMgcGVyIE1pbmlzbG90ICovCisgICAgdWludDhfdCBzY2RtYV9mcmFtZV9zaXplOyAgICAgICAgICAgLyoqPCBTQ0RNQSBGcmFtZSBTaXplIGluIHVuaXRzIG9mIHNwcmVhZGluZyBpbnRlcnZhbHMgKi8KKyAgICB1aW50MTZfdCBob3BwaW5nX3NlZWQ7ICAgICAgICAgICAgICAvKio8IFNDRE1BIENvZGUgSG9wcGluZyBTZWVkICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZSBtb2R1bGF0aW9uX3R5cGU7ICAgIC8qKjwgQ2hhbm5lbCBtb2R1bGF0aW9uIHR5cGUgKi8KKyAgICB1aW50OF90IHByZV9lcXVhbGl6YXRpb25fc2V0dGluZzsgICAvKio8IFByZS1FcXVhbGl6YXRpb24gU2V0dGluZyAoMS1vbiwgMi1vZmYpICovCisgICAgdWludDE2X3QgaW50ZXJmYWNlX2luZGV4OyAgICAgICAgICAgLyoqPCBJbnRlcmZhY2UgaW5kZXggb24gYSBnZXQgLyByZXNlcnZlZCBvbiBhIHNldCAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXM7CisKKy8qKiBQZXItdXBzdHJlYW0gY2hhbm5lbCBzaWduYWwgcXVhbGl0eSBpbmZvIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eQoreworICAgIHVpbnQxNl90IGludGVyZmFjZV9pbmRleDsgICAgICAgLyoqPCBVcHN0cmVhbSBjaGFubmVsIGlmSW5kZXggKi8KKyAgICB1aW50OF90IGNvbnRlbnRpb25faW50ZXJ2YWxzOyAgIC8qKjwgQXJlIGNvbnRlbnRpb24gaW50ZXJ2YWxzIGluY2x1ZGVkIGluIGNvdW50cyAoMT15ZXMsIDI9bm8pICovCisgICAgdWludDY0X3QgdW5lcnJvcmVkczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiB1bmVycm9yZWQgY29kZXdvcmRzICovCisgICAgdWludDY0X3QgY29ycmVjdGVkczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjb3JyZWN0ZWQgY29kZXdvcmRzICovCisgICAgdWludDY0X3QgdW5jb3JyZWN0YWJsZXM7ICAgICAgICAvKio8IE51bWJlciBvZiB1bmNvcnJlY3RhYmxlIGNvZGV3b3JkcyAqLworICAgIHVpbnQzMl90IHNucjsgICAgICAgICAgICAgICAgICAgLyoqPCBTaWduYWwgdG8gTm9pc2UgUmF0aW8gaW4gdW5pdHMgb2YgMS8xMCBkQiAqLworICAgIHVpbnQ4X3QgbWljcm9fcmVmbGVjdGlvbnM7ICAgICAgLyoqPCBNZWFzdXJlZCBtaWNyb3JlZmxlY3Rpb25zIGluIHVuaXRzIG9mIGRCYyAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eTsKKworLyoqIFBlci11cHN0cmVhbSBjaGFubmVsIHBvd2VyIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyCit7CisgICAgdWludDhfdCBjaGFubmVsX2lkOyAgICAgICAgIC8qKjwgVXBzdHJlYW0gY2hhbm5lbCBpbmRleCAqLworICAgIHVpbnQxNl90IGlucHV0X3Bvd2VyX2xldmVsOyAvKio8IElucHV0IFBvd2VyIExldmVsIChpbiB0ZW50aHMgZEIpICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXI7CisKKy8qKiBDTUMgT0FNIFBEVSBiYXNlIHN0cnVjdHVyZSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlCit7CisgICAgdWludDhfdCB2ZXJzaW9uOyAgICAvKio8IFZlcnNpb24gbnVtYmVyICovCisgICAgdWludDE2X3QgcGFja2V0X2lkOyAvKio8IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzcGVjaWZpYyBCUkNNIE9BTSB0cmFuc2FjdGlvbi4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZSBvcGNvZGU7IC8qKjwgVGhlIGFjdHVhbCBjb21tYW5kXGZ1bmN0aW9uIGJlaW5nIHJlZmVyZW5jZWQgYnkgdGhlIE9BTSBtZXNzYWdlICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBEb3duc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqZG93bnN0cmVhbV9jaGFubmVsczsgICAgLyoqPCBQZXIgZG93bnN0cmVhbSBjaGFubmVsIHByb3BlcnRpZXMgKi8KKyAgICAgICAgfSBzZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gRG93bnN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKmRvd25zdHJlYW1fY2hhbm5lbHM7ICAgLyoqPCBQZXIgZG93bnN0cmVhbSBjaGFubmVsIHJlc3VsdHMgKi8KKyAgICAgICAgfSBzZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIERvd25zdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmRvd25zdHJlYW1fY2hhbm5lbHM7ICAgICAgIC8qKjwgUGVyIGRvd25zdHJlYW0gY2hhbm5lbCBJRHMgdG8gZ2V0ICovCisgICAgICAgIH0gZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIERvd25zdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICpkb3duc3RyZWFtX2NoYW5uZWxzOyAgICAvKio8IFBlciBkb3duc3RyZWFtIGNoYW5uZWwgcmVzdWx0cyAqLworICAgICAgICB9IGdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqdXBzdHJlYW1fY2hhbm5lbHM7ICAgIC8qKjwgUGVyIHVwc3RyZWFtIGNoYW5uZWwgcHJvcGVydGllcyAqLworICAgICAgICB9IHNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBVcHN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKnVwc3RyZWFtX2NoYW5uZWxzOyAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIHJlc3VsdHMgKi8KKyAgICAgICAgfSBzZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICB1aW50OF90ICp1cHN0cmVhbV9jaGFubmVsczsgICAgICAgICAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIElEcyB0byBnZXQgKi8KKyAgICAgICAgfSBnZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnVwc3RyZWFtX2NoYW5uZWxzOyAgICAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIHJlc3VsdHMgKi8KKyAgICAgICAgfSBnZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgIC8qKjwgR3JvdXAgSWRlbnRpZmllciAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2QgbWV0aG9kOyAgICAvKio8IExvYWQgQmFsYW5jaW5nIE1ldGhvZCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uIHJlcXVlc3Rfb3B0aW9uOyAvKio8IFJlcXVlc3QgT3B0aW9uICovCisgICAgICAgIH0gc2V0X2NyZWF0ZV9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgIC8qKjwgR3JvdXAgSWRlbnRpZmllciAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlIHJlc3VsdF9jb2RlOyAgIC8qKjwgUmVzdWx0IENvZGUgKi8KKyAgICAgICAgfSBzZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgICAgICAgICAgICAgICAgICAvKio8IEdyb3VwIElELiAqLworICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gRG93bnN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24gKmRvd25zdHJlYW1fY2hhbm5lbHM7ICAgLyoqPCBQZXIgZG93bnN0cmVhbSBjaGFubmVsIG9wdGlvbnMgKi8KKyAgICAgICAgfSBzZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBfaWQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgR3JvdXAgSUQuICovCisgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBEb3duc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqZG93bnN0cmVhbV9jaGFubmVsczsgICAvKio8IFBlciBkb3duc3RyZWFtIGNoYW5uZWwgcmVzdWx0cyAqLworICAgICAgICB9IHNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBfaWQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgR3JvdXAgSUQuICovCisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBVcHN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24gKnVwc3RyZWFtX2NoYW5uZWxzOyAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIG9wdGlvbnMgKi8KKyAgICAgICAgfSBzZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgICAgICAgICAgICAgICAgICAvKio8IEdyb3VwIElELiAqLworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0ICp1cHN0cmVhbV9jaGFubmVsczsgLyoqPCBQZXIgdXBzdHJlYW0gY2hhbm5lbCByZXN1bHRzICovCisgICAgICAgIH0gc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1faW50ZXJmYWNlc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gSW50ZXJmYWNlcyAqLworICAgICAgICAgICAgdWludDE2X3QgKnVwc3RyZWFtX2ludGVyZmFjZXM7ICAgICAgLyoqPCBQZXIgdXBzdHJlYW0gaWZJbmRpY2VzIHRvIGdldCAqLworICAgICAgICB9IGdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQ7ICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBVcHN0cmVhbSBJbnRlcmZhY2VzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSAqdXBzdHJlYW1faW50ZXJmYWNlczsgIC8qKjwgUGVyIHVwc3RyZWFtIGlmSW5kaWNlcyB0byBnZXQgKi8KKyAgICAgICAgfSBnZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGNudV9jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIENOVXMgdG8gcmV0cmlldmUgc3RhdHVzIGZyb20gKi8KKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICpjbnVfbWFjX2FkZHJlc3M7IC8qKjwgTGlzdCBvZiBDTlUgTUFDIEFkZHJlc3NlcyAqLworICAgICAgICB9IGdldF9jbnVfc3RhdHVzX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGNudV9jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIENOVXMgd2l0aCBpbmZvIGluIHRoZSByZXNwb25zZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhICpjbnVfc3RhdHVzX2RhdGE7ICAvKio8IExpc3Qgb2YgQ05VIFN0YXR1cyBEYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgfSBnZXRfY251X3N0YXR1c19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19pZGNvdW50OyAgIC8qKjwgTnVtYmVyIG9mIFNlcnZpY2UgRmxvdyBJRHMgaW4gcmVxdWVzdCAqLworICAgICAgICAgICAgdWludDE2X3QgKnN2Y19mbG93X2lkczsgICAgIC8qKjwgU2VydmljZSBGbG93IElEIExpc3QgKi8KKyAgICAgICAgfSBnZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3ZjX2Zsb3dfaWRjb3VudDsgICAvKio8IE51bWJlciBvZiBTZXJ2aWNlIEZsb3dzIGluIHJlc3BvbnNlICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YSAqc3ZjX2Zsb3dfZGF0YTsgIC8qKjwgU2VydmljZSBGbG93IGRhdGEgbGlzdCAqLworICAgICAgICB9IGdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGludGZfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIENNQyBJbnRlcmZhY2VzIHdpdGggaW5mbyBpbiB0aGUgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcDsgICAgIC8qKjwgVGltZXN0YW1wIHdoZW4gaW50ZXJmYWNlcyB0YWJsZSB3YXMgbGFzdCBtb2RpZmllZCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhICpjbWNfaW50ZXJmYWNlX2RhdGE7ICAgIC8qKjwgTGlzdCBvZiBDTUMgSW50ZXJmYWNlIERhdGEgc3RydWN0dXJlcyAqLworICAgICAgICB9IGdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgaW50ZXJmYWNlX2luZGV4OyAgIC8qKjwgTUFDIERvbWFpbiBpZkluZGV4ICovCisgICAgICAgICAgICB1aW50MzJfdCBpbnZhbGlkX3JuZ19yZXFzOyAgLyoqPCBDb3VudCBvZiBpbnZhbGlkIHJhbmdlIHJlcXVlc3RzIHJlY2VpdmVkICovCisgICAgICAgICAgICB1aW50MzJfdCBybmdfYWJvcnRzOyAgICAgICAgLyoqPCBDb3VudCBvZiByYW5naW5nIGF0dGVtcHRzIGFib3J0ZWQgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGludmFsaWRfcmVnX3JlcXM7ICAvKio8IENvdW50IG9mIGludmFsaWQgUkVHLVJFUSBtZXNzYWdlcyByZWNlaXZlZCAqLworICAgICAgICAgICAgdWludDMyX3QgZmFpbGVkX3JlZ19yZXFzOyAgIC8qKjwgQ291bnQgb2YgZmFpbGVkIHJlZ2lzdHJhdGlvbiBhdHRlbXB0cyAqLworICAgICAgICAgICAgdWludDMyX3QgaW52YWxpZF9kYXRhX3JlcXM7IC8qKjwgQ291bnQgb2YgaW52YWxpZCBkYXRhIHJlcXVlc3QgbWVzc2FnZXMgcmVjZWl2ZWQgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHQ1dGltZW91dHM7ICAgICAgICAvKio8IENvdW50IG9mIFQ1IFRpbWVyIGV4cGlyYXRpb25zICovCisgICAgICAgIH0gZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBpbnRmX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIENNQyBpbnRlcmZhY2VzIHRvIHJldHJpZXZlIHN0YXR1cyBmcm9tICovCisgICAgICAgICAgICB1aW50MTZfdCAqaW50Zl9pbmRleDsgICAgICAgLyoqPCBMaXN0IG9mIENNQyBpbnRlcmZhY2UgaWZJbmRpY2VzICovCisgICAgICAgIH0gZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBpbnRlcmZhY2VzX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIE5ldHdvcmsgSW50ZXJmYWNlcyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSAqbmV0d29ya19pbnRlcmZhY2VzOyAgIC8qKjwgUGVyIG5ldHdvcmsgaW50ZXJmYWNlIHN0YXRzIGRhdGEgKi8KKyAgICAgICAgfSBnZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19pZGNvdW50OyAgIC8qKjwgTnVtYmVyIG9mIFNlcnZpY2UgRmxvdyBJRHMgaW4gcmVxdWVzdCAqLworICAgICAgICAgICAgdWludDE2X3QgKnN2Y19mbG93X2lkczsgICAgIC8qKjwgU2VydmljZSBGbG93IElEIExpc3QgKi8KKyAgICAgICAgfSBnZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIFNlcnZpY2UgRmxvd3MgaW4gcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSAqc3ZjX2Zsb3dfZGF0YTsgLyoqPCBTZXJ2aWNlIEZsb3cgY29uZmlpZ3VyYXRpb24gZGF0YSBsaXN0ICovCisgICAgICAgIH0gZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHN2Y19mbG93X2lkY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgU2VydmljZSBGbG93IElEcyBpbiByZXF1ZXN0ICovCisgICAgICAgICAgICB1aW50MTZfdCAqc3ZjX2Zsb3dfaWRzOyAgICAgLyoqPCBTZXJ2aWNlIEZsb3cgSUQgTGlzdCAqLworICAgICAgICB9IGdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgY2xhc3NpZmllcl9jb3VudDsgICAvKio8IE51bWJlciBvZiBTZXJ2aWNlIEZsb3cvQ2xhc3NpZmllciBwYWlycyBpbiByZXNwb25zZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgKmNsYXNzaWZpZXJfZGF0YTsgICAvKio8IFNlcnZpY2UgRmxvdy9DbGFzc2lmaWVyIHBhaXIgZGF0YSBsaXN0ICovCisgICAgICAgIH0gZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICB1aW50OF90ICp1cHN0cmVhbV9jaGFubmVsczsgICAgICAgICAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIElEcyB0byBnZXQgKi8KKyAgICAgICAgfSBnZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgKnVwc3RyZWFtX2NoYW5uZWxzOyAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIHJlc3VsdHMgKi8KKyAgICAgICAgfSBnZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyICp1cHN0cmVhbV9jaGFubmVsczsgLyoqPCBQZXIgdXBzdHJlYW0gY2hhbm5lbCByZXN1bHRzICovCisgICAgICAgIH0gc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZSByZXN1bHRfY29kZTsgICAgICAgICAgICAgICAvKio8IFJlc3VsdCBvZiBvcGVyYXRpb24gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGNoYW5uZWxfb25lX3Bvd2VyOyAgICAgLyoqPCBJbnB1dCBwb3dlciBsZXZlbCBmb3IgVVMgQ2hhbm5lbCAxICovCisgICAgICAgICAgICB1aW50MTZfdCBjaGFubmVsX3R3b19wb3dlcjsgICAgIC8qKjwgSW5wdXQgcG93ZXIgbGV2ZWwgZm9yIFVTIENoYW5uZWwgMiAqLworICAgICAgICAgICAgdWludDE2X3QgY2hhbm5lbF90aHJlZV9wb3dlcjsgICAvKio8IElucHV0IHBvd2VyIGxldmVsIGZvciBVUyBDaGFubmVsIDMgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGNoYW5uZWxfZm91cl9wb3dlcjsgICAgLyoqPCBJbnB1dCBwb3dlciBsZXZlbCBmb3IgVVMgQ2hhbm5lbCA0ICovCisgICAgICAgIH0gc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgICAgICAgICAgICAgIC8qKjwgR3JvdXAgSWRlbnRpZmllciAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uIHJlcXVlc3Rfb3B0aW9uOyAvKio8IFJlcXVlc3QgT3B0aW9uICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UgY251X21hY19yYW5nZTsgIC8qKjwgQ05VIE1hYyBBZGRyZXNzIFJhbmdlICovCisgICAgICAgIH0gc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBfaWQ7ICAgLyoqPCBHcm91cCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUgcmVzdWx0X2NvZGU7ICAgICAgIC8qKjwgUmVzdWx0IENvZGUgKi8KKyAgICAgICAgfSBzZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiByZXF1ZXN0X29wdGlvbjsgLyoqPCBSZXF1ZXN0IE9wdGlvbiAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgY251X21hY19hZGRyZXNzX3N0YXJ0OyAgICAgICAgICAgICAgICAvKio8IFN0YXJ0IG9mIENOVSBNYWMgQWRkcmVzcyBSYW5nZSAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgY251X21hY19hZGRyZXNzX2VuZDsgICAgICAgICAgICAgICAgICAvKio8IEVuZCBvZiBDTlUgTWFjIEFkZHJlc3MgUmFuZ2UgKi8KKyAgICAgICAgfSBzZXRfZXhjbHVkZV9jbnVzX2Zyb21fbG9hZF9iYWxhbmNpbmdfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlIHJlc3VsdF9jb2RlOyAgICAgICAvKio8IFJlc3VsdCBDb2RlICovCisgICAgICAgIH0gc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgIC8qKjwgR3JvdXAgSWRlbnRpZmllciAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2QgbWV0aG9kOyAgICAvKio8IExvYWQgQmFsYW5jaW5nIE1ldGhvZCAqLworICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBEb3duc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICB1aW50OF90ICpkb3duc3RyZWFtX2NoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlzdCBvZiBEb3duc3RyZWFtIENoYW5uZWwgSURzICovCisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICB1aW50OF90ICp1cHN0cmVhbV9jaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlzdCBvZiBVcHN0cmVhbSBDaGFubmVsIElEcyAqLworICAgICAgICAgICAgdWludDhfdCByZXN0cmljdGlvbnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBSZXN0cmljdGlvbnMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZSAqcmVzdHJpY3Rpb25zOyAgLyoqPCBMaXN0IG9mIFJlc3RyaWN0aW9uIHJhbmdlcyAqLworICAgICAgICB9IHNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBfaWQ7ICAgLyoqPCBHcm91cCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUgcmVzdWx0X2NvZGU7ICAgLyoqPCBSZXN1bHQgQ29kZSAqLworICAgICAgICB9IHNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlOworCisvKiogQ2VydGlmaWNhdGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUKK3sKKyAgICB1aW50MjRfdCBzaXplOyAgICAgICAgICAgICAgLyoqPCBTaXplLiAqLworICAgIHVpbnQ4X3QgKmNlcnRpZmljYXRlX2RhdGE7ICAvKio8IENlcnRpZmljYXRlIERhdGEuICovCit9IGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZTsKKworLyoqIENUQyBBY3Rpb24gVmFsdWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZQoreworICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgc3RhdGU7ICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gcGh5X2FkbWluX2NvbnRyb2w7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIHN0YXRlOyAgICAvKio8IFN0YXRlLiAqLworICAgICAgICB9IGF1dG9fYWRtaW5fY29udHJvbDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlOworCisvKiogQ3RjIEFsYXJtIEVudHJ5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCBvYmplY3RfdHlwZTsgLyoqPCBPYmplY3QgVHlwZS4gKi8KKyAgICB1aW50MzJfdCBvYmplY3RfaW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE9iamVjdCBJbnN0YW5jZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCBhbGFybV9pZDsgICAgICAgICAgICAgICAgICAvKio8IEFsYXJtIElELiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGltZV9zdGFtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZSBTdGFtcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDB4MDAgOiBSZXBvcnRpbmcgQWxhcm0gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpbWVfc3RhbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRpbWUgU3RhbXAuICovCisgICAgICAgICAgICB1aW50OF90IHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAweDAwIDogUmVwb3J0aW5nIEFsYXJtICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGUgYWxhcm1fY29kZTsgICAgLyoqPCBBbGFybSBDb2RlLiAqLworICAgICAgICB9IG9udV9wb3dlcl9hbGFybTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGltZV9zdGFtcDsgICAgLyoqPCBUaW1lIFN0YW1wLiAqLworICAgICAgICAgICAgdWludDhfdCBzdGF0ZTsgICAgICAgICAgLyoqPCAweDAwIDogUmVwb3J0aW5nIEFsYXJtICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZSBhbGFybV9jb2RlOyAgLyoqPCBBbGFybSBDb2RlLiAqLworICAgICAgICB9IG9udV9wb25faWZfc3dpdGNoOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeTsKKworLyoqIENUQyBBdHRyaWJ1dGUgVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSBzdGF0ZTsgICAgLyoqPCBTdGF0ZS4gKi8KKyAgICAgICAgfSBwaHlfYWRtaW5fc3RhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSBzdGF0ZTsgICAgLyoqPCBTdGF0ZS4gKi8KKyAgICAgICAgfSBhdXRvX25lZ19hZG1pbl9zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdGVjaG5vbG9naWVzX2NvdW50OyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBUZWNobm9sb2dpZXMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90ICp0ZWNobm9sb2dpZXM7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBBdXRvLW5lZ290aWF0aW9uIHRlY2hub2xvZ3kgYml0bWFwcyAoSUVFRSA4MDIuMy0yMDA1IGNsYXVzZSA0MCkgKi8KKyAgICAgICAgfSBhdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRlY2hub2xvZ2llc19jb3VudDsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVGVjaG5vbG9naWVzICovCisgICAgICAgICAgICB1aW50MzJfdCAqdGVjaG5vbG9naWVzOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXV0by1uZWdvdGlhdGlvbiB0ZWNobm9sb2d5IGJpdG1hcHMgKElFRUUgODAyLjMtMjAwNSBjbGF1c2UgNDApICovCisgICAgICAgIH0gYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQgc3VwcG9ydDsgICAgLyoqPCBTdXBwb3J0LiAqLworICAgICAgICB9IGZlY19hYmlsaXR5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZSBzdGF0ZTsgICAgICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gZmVjX21vZGU7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlOworCisvKiogQ1RDIENodXJuaW5nIFByb3YgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlIGNvZGU7ICAvKio8IENvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGluX3VzZV9rZXlfaW5kZXg7ICAgICAgICAgICAvKio8IEluLVVzZSBLZXkgSW5kZXguICovCisgICAgICAgIH0gbmV3X2tleV9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IG5ld19rZXlfaW5kZXg7ICAgICAgICAgICAgICAvKio8IE5ldyBLZXkgSW5kZXguICovCisgICAgICAgICAgICB1aW50OF90IGNodXJuaW5nX2tleTBbM107ICAgICAgICAgICAvKio8IDMtYnl0ZSBjaHVybmluZyBrZXkgMC4gIEZvciAxRywgdGhpcyBpcyB0aGUgb25seSBrZXkuICBGb3IgMTBHLCB0aGlzIGlzIHRoZSBmaXJzdCBvZiAzIDMtYnl0ZSBrZXlzLiAqLworICAgICAgICAgICAgdWludDhfdCBjaHVybmluZ19rZXkxWzNdOyAgICAgICAgICAgLyoqPCAzLWJ5dGUgY2h1cm5pbmcga2V5IDEuICBPbmx5IHByZXNlbnQgaW4gMTBHLiAqLworICAgICAgICAgICAgdWludDhfdCBjaHVybmluZ19rZXkyWzNdOyAgICAgICAgICAgLyoqPCAzLWJ5dGUgY2h1cm5pbmcga2V5IDIuICBPbmx5IHByZXNlbnQgaW4gMTBHLiAqLworICAgICAgICB9IG5ld19jaHVybmluZ19rZXk7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZTsKKworLyoqIENUQyBDb21taXQgSW1hZ2UgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUgb3Bjb2RlOyAgICAgLyoqPCBPcGNvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnIGZsYWc7IC8qKjwgRmxhZy4gKi8KKyAgICAgICAgfSBjb21taXRfaW1hZ2VfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrIGFjazsgICAvKio8IEFjay4gKi8KKyAgICAgICAgfSBjb21taXRfaW1hZ2VfcmVzcG9uc2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlOworCisvKiogQ1RDIERCQSByZXBvcnRpbmcgcXVldWUgc2V0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0Cit7CisgICAgdWludDhfdCByZXBvcnRfYml0bWFwOyAgLyoqPCBCaXRtYXAgb2Ygd2hpY2ggcXVldWVzIGFyZSBwcmVzZW50IGluIHRoZSBxdWV1ZSBzZXQuICovCisgICAgdWludDE2X3QgcXVldWUwOyAgICAgICAgLyoqPCBRdWV1ZSAwLiAqLworICAgIHVpbnQxNl90IHF1ZXVlMTsgICAgICAgIC8qKjwgUXVldWUgMS4gKi8KKyAgICB1aW50MTZfdCBxdWV1ZTI7ICAgICAgICAvKio8IFF1ZXVlIDIuICovCisgICAgdWludDE2X3QgcXVldWUzOyAgICAgICAgLyoqPCBRdWV1ZSAzLiAqLworICAgIHVpbnQxNl90IHF1ZXVlNDsgICAgICAgIC8qKjwgUXVldWUgNC4gKi8KKyAgICB1aW50MTZfdCBxdWV1ZTU7ICAgICAgICAvKio8IFF1ZXVlIDUuICovCisgICAgdWludDE2X3QgcXVldWU2OyAgICAgICAgLyoqPCBRdWV1ZSA2LiAqLworICAgIHVpbnQxNl90IHF1ZXVlNzsgICAgICAgIC8qKjwgUXVldWUgNy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0OworCisvKiogQ1RDIERiYSBQcm92IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlIGRiYV9jb2RlOyAgIC8qKjwgREJBIENvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHF1ZXVlX3NldHNfY291bnQ7ICAgICAgICAgICAvKio8IFF1ZXVlIFNldHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKnF1ZXVlX3NldHM7ICAvKio8IFF1ZXVlIFNldHMuICovCisgICAgICAgIH0gZ2V0X3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHF1ZXVlX3NldHNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFF1ZXVlIFNldHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKnF1ZXVlX3NldHM7ICAvKio8IFF1ZXVlIFNldHMuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcXVldWVfc2V0c19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUXVldWUgU2V0cyBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldCAqcXVldWVfc2V0czsgIC8qKjwgUXVldWUgU2V0cy4gKi8KKyAgICAgICAgfSBzZXRfcmVzcG9uc2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2U7CisKKy8qKiBDVEMgT2xkIE1hbmFnZW1lbnQgT2JqZWN0IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdCBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgdWludDhfdCBsZW5ndGg7ICAgICAgICAgLyoqPCBMZW5ndGguICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHBvcnQ7ICAgLyoqPCBQb3J0LiAqLworICAgICAgICB9IHBvcnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlOworCisvKiogQ1RDIE1hbmFnZW1lbnQgT2JqZWN0IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3QgbGVhZjsgICAgLyoqPCBMZWFmLiAqLworICAgIHVpbnQ4X3QgbGVuZ3RoOyAvKio8IExlbmd0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlIHBvcnRfdHlwZTsgICAgLyoqPCBQb3J0IFR5cGUuICovCisgICAgICAgICAgICB1aW50OF90IGNhc2NhZGVfc2xvdF9udW1iZXI7ICAgICAgICAgICAgICAgIC8qKjwgQ2FzY2FkZSAvIFNsb3QgTnVtYmVyLiAqLworICAgICAgICAgICAgdWludDE2X3QgcG9ydF9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBvcnQgTnVtYmVyLiAqLworICAgICAgICB9IHBvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcmQ7ICAgICAgLyoqPCBDYXJkLiAqLworICAgICAgICB9IGNhcmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGxsaWQ7ICAgICAgLyoqPCBMTElELiAqLworICAgICAgICB9IGxsaWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvbl9pZjsgICAgLyoqPCBQT04gSS9GLiAqLworICAgICAgICB9IHBvbl9pZjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZTsKKworLyoqIENUQyBFbXB0eSBWYXIgQ29udGFpbmVyIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIGJyYW5jaDsgIC8qKjwgQnJhbmNoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGVhZjsgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBlcnJvcjsgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBlcnJvcjsgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBhY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugb2JqZWN0OyAgLyoqPCBPYmplY3QuICovCisgICAgICAgIH0gb2xkX21hbmFnZW1lbnRfb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugb2JqZWN0OyAgICAgIC8qKjwgT2JqZWN0LiAqLworICAgICAgICB9IG1hbmFnZW1lbnRfb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBlcnJvcjsgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBleHRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbiBsZWFmOyAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBlcnJvcjsgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBleHRfYWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBlcnJvcjsgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBrdGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IuICovCisgICAgICAgIH0ga3RhY3Rpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZTsKKworLyoqIENUQyBFdGggUG9ydCBQb2xpY2luZyBDb25maWcgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2VuYWJsZSBzdGF0ZTsgLyoqPCBTdGF0ZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQyNF90IGNpcjsgICAgICAgICAgIC8qKjwgQ0lSLiAqLworICAgICAgICAgICAgdWludDI0X3QgYnVja2V0OyAgICAgICAgLyoqPCBCdWNrZXQuICovCisgICAgICAgICAgICB1aW50MjRfdCBleHRyYV9idXJzdDsgICAvKio8IEV4dHJhIEJ1cnN0LiAqLworICAgICAgICB9IGVuYWJsZWQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlOworCisvKiogQ1RDIEV2ZW50IEVudHJ5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCBvYmplY3RfdHlwZTsgLyoqPCBPYmplY3QgVHlwZS4gKi8KKyAgICB1aW50MzJfdCBvYmplY3RfaW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IEluc3RhbmNlLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkIGFsYXJtX2lkOyAgLyoqPCBBbGFybSBJRC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeTsKKworLyoqIENUQyBFdmVudCBTdGF0dXMgRW50cnkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgZXZlbnRfZW50cnk7ICAgIC8qKjwgRXZlbnQgRW50cnkuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXMgZXZlbnRfc3RhdHVzOyAgLyoqPCBFdmVudCBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5OworCisvKiogQ1RDIEV2ZW50IFRocmVzaG9sZCBFbnRyeS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5Cit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSBldmVudF9lbnRyeTsgICAgLyoqPCBFdmVudCBFbnRyeS4gKi8KKyAgICB1aW50MzJfdCBzZXRfdGhyZXNob2xkOyAgICAgLyoqPCBTZXQgVGhyZXNob2xkLiAqLworICAgIHVpbnQzMl90IGNsZWFyX3RocmVzaG9sZDsgICAvKio8IENsZWFyIFRocmVzaG9sZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnk7CisKKy8qKiBDVEMgRXZlbnQgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGUgc3ViX3R5cGU7ICAgICAgICAgICAgICAgIC8qKjwgU3ViIFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFbnRyeSBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgKmVudHJpZXM7ICAgICAgICAgICAvKio8IEVudHJpZXMuICovCisgICAgICAgIH0gc3RhdHVzX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEVudHJ5IENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKmVudHJpZXM7ICAgIC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSBzdGF0dXNfc2V0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsgICAvKio8IEVudHJ5IENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKmVudHJpZXM7ICAgIC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSBzdGF0dXNfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFbnRyeSBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgKmVudHJpZXM7ICAgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IHRocmVzaG9sZF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRW50cnkgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSAqZW50cmllczsgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IHRocmVzaG9sZF9zZXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X2NvdW50OyAgIC8qKjwgRW50cnkgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSAqZW50cmllczsgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IHRocmVzaG9sZF9yZXNwb25zZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZTsKKworLyoqIENUQyBFeHQgQWN0aW9uIFZhbHVlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uIGxlYWY7ICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb24gYWN0aXZhdGVfZmFzdF9sZWF2ZTsgLyoqPCBBY3RpdmF0ZSBGYXN0IExlYXZlLiAqLworICAgICAgICB9IGZhc3RfbGVhdmVfYWRtaW5fY29udHJvbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCBudW1fbGxpZHM7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgTExJRHMgdG8gQWN0aXZhdGUgKi8KKyAgICAgICAgfSBtdWx0aV9sbGlkX2FkbWluX2NvbnRyb2w7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDMyX3Qgc2xlZXBfZHVyYXRpb247ICAgIC8qKjwgU2xlZXAgRHVyYXRpb24gKFVuaXQ6IFRRKSAqLworICAgICAgICAgICAgdWludDMyX3Qgd2FrZV9kdXJhdGlvbjsgICAgIC8qKjwgV2FrZSBEdXJhdGlvbiAoVW5pdDogVFEpICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnIHNsZWVwX2ZsYWc7ICAvKio8IFNsZWVwIEZsYWcuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlIHNsZWVwX21vZGU7ICAvKio8IFNsZWVwIE1vZGUuICovCisgICAgICAgIH0gc2xlZXBfY29udHJvbDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlOworCisvKiogQ1RDIDIuMSBPTlUgU2VydmljZSBTTEEgVGFibGUgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlCit7CisgICAgdWludDhfdCBxdWV1ZV9udW1iZXI7ICAgICAgICAgICAvKio8IFF1ZXVlIG51bWJlciBvZiBzZXJ2aWNlICovCisgICAgdWludDE2X3QgZml4ZWRfcGFja2V0X3NpemU7ICAgICAvKio8IEZpeGVkIFBhY2tldCBzaXplIG9mIHNlcnZpY2UgKi8KKyAgICB1aW50MTZfdCBmaXhlZF9iYW5kd2lkdGg7ICAgICAgIC8qKjwgRml4ZWQgYmFuZHdpZHRoIG9mIHNlcnZpY2UgKi8KKyAgICB1aW50MTZfdCBndWFyYW50ZWVkX2JhbmR3aWR0aDsgIC8qKjwgR3VhcmFudGVlZCBiYW5kd2lkdGggb2Ygc2VydmljZSAqLworICAgIHVpbnQxNl90IGJlc3RfZWZmb3J0X2JhbmR3aWR0aDsgLyoqPCBCZXN0IGVmZm9ydCBiYW5kd2lkdGggb2Ygc2VydmljZSAqLworICAgIHVpbnQ4X3Qgd3JyX3dlaWdodDsgICAgICAgICAgICAgLyoqPCBXUlIgd2VpZ2h0IG9mIHNlcnZpY2UgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGU7CisKKy8qKiBDVEMgT05VIFNlcnZpY2UgU0xBIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb24gb3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhOyAvKio8IE9wZXJhdGlvbiBvZiBTZXJ2aWNlIERCQSAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3Qgc2VydmljZXNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHNlcnZpY2VzLiAqLworICAgICAgICAgICAgdWludDhfdCAqc2VydmljZXM7ICAgICAgICAgIC8qKjwgU2VydmljZXMuICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWUgc2NoZW1lOyAgIC8qKjwgQmVzdCBlZmZvcnQgc2NoZWR1bGluZyBzY2hlbWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcHJpb3JpdHk7ICAgICAgIC8qKjwgSGlnaCBwcmlvcml0eSBib3VuZGFyeSAqLworICAgICAgICAgICAgdWludDMyX3QgY3ljbGVfbGVuZ3RoOyAgLyoqPCBDeWNsZSBMZW5ndGggKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc2VydmljZXNfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFNlcnZpY2VzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSAqc2VydmljZXM7ICAgIC8qKjwgQ3RjIE9udSBTTEEgVGFibGUgKi8KKyAgICAgICAgfSBhY3RpdmF0ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2U7CisKKy8qKiBDVEMgMi4xIE9OVSBJbnRlcmZhY2UgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlIHR5cGU7ICAgIC8qKjwgQ1RDIE9OVSBJbnRlcmZhY2UgVHlwZSAqLworICAgIHVpbnQxNl90IG51bV9wb3J0czsgLyoqPCBOdW1iZXIgb2YgUG9ydHMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlOworCisvKiogQ1RDIE14VSBHbG9iYWwgUGFyYW1zIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoIHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBvbnVfaXBhZGRyZXNzOyAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IE9OVSBJUCBBZGRyZXNzICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3Mgb251X25ldHdvcmtfbWFzazsgICAgICAgIC8qKjwgTWFuYWdlbWVudCBPTlUgTWFzayBBZGRyZXNzICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3Mgb251X2RlZmF1bHRfZ3c7ICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBPTlUgZGVmYXVsdCBHYXRld2F5ICovCisgICAgICAgICAgICB1aW50MTZfdCBkYXRhX2N2bGFuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBEYXRhIEN1c3RvbWVyIFZMQU4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfc3ZsYW47ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IERhdGEgU2VydmljZSBWTEFOICovCisgICAgICAgICAgICB1aW50OF90IGRhdGFfcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBEYXRhIFByaW9yaXR5ICovCisgICAgICAgIH0gaXB2NDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfaXB2Nl9hZGRyZXNzIG9udV9pcGFkZHJlc3M7ICAgICAgICAgICAvKio8IE1hbmFnZW1lbnQgT05VIElQIEFkZHJlc3MgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGlwdjZwcmVmaXhfbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IE9OVSBJUHY2IHByZWZpeCBsZW5ndGggKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjZfYWRkcmVzcyBvbnVfZGVmYXVsdF9ndzsgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IE9OVSBkZWZhdWx0IEdhdGV3YXkgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfY3ZsYW47ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IERhdGEgQ3VzdG9tZXIgVkxBTiAqLworICAgICAgICAgICAgdWludDE2X3QgZGF0YV9zdmxhbjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1hbmFnZW1lbnQgRGF0YSBTZXJ2aWNlIFZMQU4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZGF0YV9wcmlvcml0eTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IERhdGEgUHJpb3JpdHkgKi8KKyAgICAgICAgfSBpcHY2OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlOworCisvKiogQ1RDIE14VSBTTk1QIFBhcmFtcyBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoIHdpZHRoOyAgICAvKio8IFdpZHRoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBzbm1wX3ZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNOTVAgVmVyc2lvbiAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIHRyYXBfaG9zdF9pcDsgICAgICAgICAgICAvKio8IFRyYXAgSG9zdCBJUCBBZGRyZXNzICovCisgICAgICAgICAgICB1aW50MTZfdCB0cmFwX3BvcnQ7ICAgICAgICAgICAgICAgICAvKio8IFRyYXAgUG9ydCAqLworICAgICAgICAgICAgdWludDE2X3Qgc25tcF9wb3J0OyAgICAgICAgICAgICAgICAgLyoqPCBTTk1QIFBvcnQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc2VjdXJpdHlfbmFtZVszMl07ICAgICAgICAgIC8qKjwgU2VjdXJpdHkgTmFtZSAqLworICAgICAgICAgICAgdWludDhfdCBjb21tdW5pdHlfZm9yX3JlYWRbMzJdOyAgICAgLyoqPCBDb21tdW5pdHkgRm9yIFJlYWQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY29tbXVuaXR5X2Zvcl93cml0ZVszMl07ICAgIC8qKjwgQ29tbXVuaXR5IEZvciBXcml0ZSAqLworICAgICAgICB9IGlwdjQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc25tcF92ZXJzaW9uOyAgICAgICAgICAgICAgIC8qKjwgU05NUCBWZXJzaW9uICovCisgICAgICAgICAgICBiY21vc19pcHY2X2FkZHJlc3MgdHJhcF9ob3N0X2lwOyAgICAvKio8IFRyYXAgSG9zdCBJUCBBZGRyZXNzICovCisgICAgICAgICAgICB1aW50MTZfdCB0cmFwX3BvcnQ7ICAgICAgICAgICAgICAgICAvKio8IFRyYXAgUG9ydCAqLworICAgICAgICAgICAgdWludDE2X3Qgc25tcF9wb3J0OyAgICAgICAgICAgICAgICAgLyoqPCBTTk1QIFBvcnQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc2VjdXJpdHlfbmFtZVszMl07ICAgICAgICAgIC8qKjwgU2VjdXJpdHkgTmFtZSAqLworICAgICAgICAgICAgdWludDhfdCBjb21tdW5pdHlfZm9yX3JlYWRbMzJdOyAgICAgLyoqPCBDb21tdW5pdHkgRm9yIFJlYWQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY29tbXVuaXR5X2Zvcl93cml0ZVszMl07ICAgIC8qKjwgQ29tbXVuaXR5IEZvciBXcml0ZSAqLworICAgICAgICB9IGlwdjY7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlOworCisvKiogQ1RDIFZMQU4gRWxlbWVudC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50Cit7CisgICAgdWludDE2X3QgZXRoZXJfdHlwZTsgICAgICAgIC8qKjwgRXRoZXJUeXBlLiAqLworICAgIGJjbW9zX3ZsYW5fdGFnIHZsYW5fdGFnOyAgICAvKio8IFZMQU4gVGFnLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudDsKKworLyoqIENUQyBWTEFOIFRyYW5zbGF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgb2xkX3ZsYW47ICAvKio8IE9sZCBWTEFOLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IG5ld192bGFuOyAgLyoqPCBOZXcgVkxBTi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uOworCisvKiogQ1RDIFZMQU4gQWdncmVnYXRlIFRhYmxlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZQoreworICAgIHVpbnQxNl90IHZsYW5zX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWTEFOcyBDb3VudC4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCBzdmxhbjsgICAgIC8qKjwgUy1WTEFOLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICp2bGFuczsgICAgLyoqPCBWTEFOcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZTsKKworLyoqIENUQyBWbGFuIFByb3YgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZSBtb2RlOyAvKio8IE1vZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCB2bGFuOyAgICAgICAgICAgICAgLyoqPCBWTEFOLiAqLworICAgICAgICB9IHRhZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgZGVmYXVsdF92bGFuOyAgICAgIC8qKjwgRGVmYXVsdCBWTEFOLiAqLworICAgICAgICAgICAgdWludDMyX3QgdHJhbnNsYXRpb25zX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRyYW5zbGF0aW9ucy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiAqdHJhbnNsYXRpb25zOyAvKio8IFRyYW5zbGF0aW9ucy4gKi8KKyAgICAgICAgfSB0cmFuc2xhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgZGVmYXVsdF92bGFuOyAgICAgIC8qKjwgRGVmYXVsdCBWTEFOLiAqLworICAgICAgICAgICAgdWludDMyX3QgcGVybWl0dGVkX3ZsYW5zX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBlcm1pdHRlZF92bGFucy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICpwZXJtaXR0ZWRfdmxhbnM7ICAvKio8IFBlcm1pdHRlZCBWTEFOcy4gKi8KKyAgICAgICAgfSB0cnVuazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgZGVmYXVsdF92bGFuOyAgICAgIC8qKjwgRGVmYXVsdCBWTEFOLiAqLworICAgICAgICAgICAgdWludDE2X3QgdGFibGVzX2NvdW50OyAgLyoqPCBUYWJsZXMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlICp0YWJsZXM7ICAgLyoqPCBUYWJsZXMuICovCisgICAgICAgIH0gYWdncmVnYXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwZXJtaXR0ZWRfdmxhbnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcGVybWl0dGVkX3ZsYW5zLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgKnBlcm1pdHRlZF92bGFuczsgIC8qKjwgUGVybWl0dGVkIFZMQU5zLiAqLworICAgICAgICB9IHRydW5rX21kdTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgZGVmYXVsdF92bGFuOyAgICAgIC8qKjwgRGVmYXVsdCBWTEFOLiAqLworICAgICAgICAgICAgdWludDMyX3QgcGVybWl0dGVkX3ZsYW5zX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBlcm1pdHRlZF92bGFucy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICpwZXJtaXR0ZWRfdmxhbnM7ICAvKio8IFBlcm1pdHRlZCBWTEFOcy4gKi8KKyAgICAgICAgfSBoeWJyaWQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlOworCisvKiogQ3RjIE9OVSBjbGFzc2lmaWNhdGlvbiBGaWVsZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQgZmllbGQ7ICAgICAgICAgICAgLyoqPCBDVEMgT05VIENsYXNzaWZpY2F0aW9uIEZpZWxkICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHZhbFsxNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOyAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBkYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOyAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBzYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFs1XTsgICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICB1aW50OF90IHZhbDsgICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IHZsYW5fcHJpOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzRdOyAgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZhbDsgICAgICAgICAgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gdmxhbl9pZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFs0XTsgICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICB1aW50MTZfdCB2YWw7ICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IGV0aF90eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzJdOyAgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyB2YWw7IC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gZGVzdF9pcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFsyXTsgICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgdmFsOyAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IHNvdXJjZV9pcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFs1XTsgICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICB1aW50OF90IHZhbDsgICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IGlwX3R5cGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07ICAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDhfdCB2YWw7ICAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBpcF90b3M7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07ICAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDhfdCB2YWw7ICAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBpcF9wcmVjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzRdOyAgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZhbDsgICAgICAgICAgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gc291cmNlX3BvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNF07ICAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDE2X3QgdmFsOyAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBkZXN0X3BvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbMTVdOyAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDhfdCB2YWw7ICAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBpcF92ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbMTJdOyAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDMyX3QgdmFsOyAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBpcF9mbG93X2xhYmVsOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19pcHY2X2FkZHJlc3MgdmFsOyAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IGRzdF9pcHY2OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19pcHY2X2FkZHJlc3MgdmFsOyAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IHNyY19pcHY2OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19pcHY2X2FkZHJlc3MgdmFsOyAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAodGhlIHByZWZpeCBsZW5ndGggbXVzdCBiZSBwYWNrZWQgaW50byB0aGUgTFNCKSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IGRzdF9pcHY2cHJlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19pcHY2X2FkZHJlc3MgdmFsOyAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAodGhlIHByZWZpeCBsZW5ndGggbXVzdCBiZSBwYWNrZWQgaW50byB0aGUgTFNCKSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IHNyY19pcHY2cHJlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzE1XTsgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmFsOyAgICAgICAgICAgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gbnh0X2hkcjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2U7CisKKy8qKiBDVEMgUnVsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZQoreworICAgIHVpbnQ4X3QgcHJlY2VkZW5jZTsgICAgIC8qKjwgUHJlY2VkZW5jZS4gKi8KKyAgICB1aW50OF90IHF1ZXVlOyAgICAgICAgICAvKio8IFF1ZXVlLiAqLworICAgIHVpbnQ4X3QgcHJpX21hcmtpbmc7ICAgIC8qKjwgUHJpIE1hcmtpbmcuICovCisgICAgdWludDhfdCBjbGF1c2VzX2NvdW50OyAgLyoqPCBDbGF1c2VzIENvdW50LiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgKmNsYXVzZXM7ICAgLyoqPCBDbGF1c2VzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGU7CisKKy8qKiBDVEMgTXVsdGljYXN0IFZMQU4gUHJvdi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdgoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uIG9wZXJhdGlvbjsgLyoqPCBPcGVyYXRpb24uICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBtdWx0aWNhc3RfdmxhbnNfY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtdWx0aWNhc3RfdmxhbnMuICovCisgICAgICAgICAgICBiY21vc192bGFuX3RhZyAqbXVsdGljYXN0X3ZsYW5zOyAgICAgICAgICAgICAgICAvKio8IE11bHRpY2FzdCBWTEFOcy4gKi8KKyAgICAgICAgfQorICAgICAgICBkZWxldGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG11bHRpY2FzdF92bGFuc19jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG11bHRpY2FzdF92bGFucy4gKi8KKyAgICAgICAgICAgIGJjbW9zX3ZsYW5fdGFnICptdWx0aWNhc3RfdmxhbnM7ICAgICAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IFZMQU5zLiAqLworICAgICAgICB9IGFkZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbXVsdGljYXN0X3ZsYW5zX2NvdW50OyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbXVsdGljYXN0X3ZsYW5zLiAqLworICAgICAgICAgICAgYmNtb3Nfdmxhbl90YWcgKm11bHRpY2FzdF92bGFuczsgICAgICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgVkxBTnMuICovCisgICAgICAgIH0gbGlzdDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdjsKKworLyoqIENUQyBJUFRWIFZMQU4gRW50cnkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeQoreworICAgIGJjbW9zX3ZsYW5fdGFnIG11bHRpY2FzdF92bGFuOyAgLyoqPCBNdWx0aWNhc3QgVkxBTi4gKi8KKyAgICBiY21vc192bGFuX3RhZyBpcHR2X3VzZXJfdmxhbjsgIC8qKjwgSVBUViBVc2VyIFZMQU4uICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5OworCisvKiogQ1RDIE11bHRpY2FzdCBUYWcgT3BlcmF0aW9uIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZSB0YWdfbW9kZTsgICAgLyoqPCBUYWcgTW9kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbXVsdGljYXN0X3ZsYW5zX2NvdW50OyAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gTXVsdGljYXN0IFZMQU5zICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeSAqbXVsdGljYXN0X3ZsYW5zOyAgIC8qKjwgTXVsdGljYXN0IFZMQU5zLiAqLworICAgICAgICB9IHN0cmlwX2RhdGFfcXVlcnlfaXB0djsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZTsKKworLyoqIENUQyBNdWx0aWNhc3QgQ29udHJvbCBFbnRyeSBHREEgTUFDIE9ubHkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seQoreworICAgIHVpbnQxNl90IHVzZXJfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVzZXIgSUQuICovCisgICAgdWludDE2X3QgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZ3JvdXBfbWFjX2FkZHJlc3M7ICAgIC8qKjwgR3JvdXAgTUFDIEFkZHJlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5OworCisvKiogQ1RDIE11bHRpY2FzdCBDb250cm9sIEVudHJ5IEdEQSBNQUMgKyBWTEFOIElELiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZAoreworICAgIHVpbnQxNl90IHVzZXJfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVzZXIgSUQuICovCisgICAgdWludDE2X3QgbXVsdGljYXN0X3ZsYW47ICAgICAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IFZMQU4uICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZ3JvdXBfbWFjX2FkZHJlc3M7ICAgIC8qKjwgR3JvdXAgTUFDIEFkZHJlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQ7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgRW50cnkgR0RBIE1BQyArIElQdjQgU0EuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EKK3sKKyAgICB1aW50MTZfdCB1c2VyX2lkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVc2VyIElELiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGdyb3VwX21hY19hZGRyZXNzOyAgICAvKio8IEdyb3VwIE1BQyBBZGRyZXNzLiAqLworICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBpcHNvdXJjZV9hZGRyZXNzOyAgICAvKio8IElQIFNvdXJjZSBBZGRyZXNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2E7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgRW50cnkgR0RBIElQICsgTWNhc3QgVkxBTiBJRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkCit7CisgICAgdWludDE2X3QgdXNlcl9pZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNlciBJRC4gKi8KKyAgICB1aW50MTZfdCBtdWx0aWNhc3RfdmxhbjsgICAgICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgVkxBTi4gKi8KKyAgICB1aW50MTZfdCByZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICBiY21vc19pcHY0X2FkZHJlc3MgaXBtdWx0aWNhc3RfYWRkcmVzczsgLyoqPCBJUCBNdWx0aWNhc3QgQWRkcmVzcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQ7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgRW50cnkgR0RBIElQdjYgKyBNY2FzdCBWTEFOIElELiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZAoreworICAgIHVpbnQxNl90IHVzZXJfaWQ7ICAgICAgICAgICAvKio8IFVzZXIgSUQuICovCisgICAgdWludDE2X3QgbXVsdGljYXN0X3ZsYW47ICAgIC8qKjwgTXVsdGljYXN0IFZMQU4uICovCisgICAgYmNtb3NfaXB2Nl9hZGRyZXNzIGlwdjZtdWx0aWNhc3RfYWRkcmVzczsgICAvKio8IElQdjYgTXVsdGljYXN0IEFkZHJlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQ7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgRW50cnkgR0RBIE1BQyArIElQdjYgU0EuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EKK3sKKyAgICB1aW50MTZfdCB1c2VyX2lkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVc2VyIElELiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGdyb3VwX21hY19hZGRyZXNzOyAgICAvKio8IEdyb3VwIE1BQyBBZGRyZXNzLiAqLworICAgIGJjbW9zX2lwdjZfYWRkcmVzcyBpcHNvdXJjZV9hZGRyZXNzOyAgICAvKio8IElQIFNvdXJjZSBBZGRyZXNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2E7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb24gYWN0aW9uOyAgICAvKio8IEFjdGlvbi4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGUgdHlwZTsgICAgICAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG90YWxfZW50cmllc19jb3VudDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHJlbWFpbmluZyBsaXN0IGVsZW1lbnRzIGluIGFsbCByZW1haW5pbmcgdmFyaWFibGUgY29udGFpbmVycyAqLworICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19jb3VudDsgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZW50cmllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5ICplbnRyaWVzOyAgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IGdkYV9tYWNfb25seTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB0b3RhbF9lbnRyaWVzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiByZW1haW5pbmcgbGlzdCBlbGVtZW50cyBpbiBhbGwgcmVtYWluaW5nIHZhcmlhYmxlIGNvbnRhaW5lcnMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGVudHJpZXNfY291bnQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZW50cmllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQgKmVudHJpZXM7ICAvKio8IEVudHJpZXMuICovCisgICAgICAgIH0gZ2RhX21hY19wbHVzX3ZsYW5faWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG90YWxfZW50cmllc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgcmVtYWluaW5nIGxpc3QgZWxlbWVudHMgaW4gYWxsIHJlbWFpbmluZyB2YXJpYWJsZSBjb250YWluZXJzICovCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyaWVzX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EgKmVudHJpZXM7ICAgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IGdkYV9tYWNfcGx1c19pcHY0c2E7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG90YWxfZW50cmllc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgcmVtYWluaW5nIGxpc3QgZWxlbWVudHMgaW4gYWxsIHJlbWFpbmluZyB2YXJpYWJsZSBjb250YWluZXJzICovCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyaWVzX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZCAqZW50cmllczsgIC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSBnZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG90YWxfZW50cmllc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgcmVtYWluaW5nIGxpc3QgZWxlbWVudHMgaW4gYWxsIHJlbWFpbmluZyB2YXJpYWJsZSBjb250YWluZXJzICovCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyaWVzX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkICplbnRyaWVzOyAgICAvKio8IEVudHJpZXMuICovCisgICAgICAgIH0gZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG90YWxfZW50cmllc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgcmVtYWluaW5nIGxpc3QgZWxlbWVudHMgaW4gYWxsIHJlbWFpbmluZyB2YXJpYWJsZSBjb250YWluZXJzICovCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyaWVzX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EgKmVudHJpZXM7ICAgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IGdkYV9tYWNfcGx1c19pcHY2c2E7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sOworCisvKiogQ1RDIDIuMSBPTlUgTExJRC9RdWV1ZSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZQoreworICAgIHVpbnQxNl90IHF1ZXVlX2lkOyAgICAgIC8qKjwgSUQgb2YgcXVldWUgbnVtYmVyIGZvciB0aGUgTExJRCAqLworICAgIHVpbnQxNl90IHdycl93ZWlnaHQ7ICAgIC8qKjwgV1JSIFdlaWdodCBvZiBxdWV1ZSBudW1iZXIgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZTsKKworLyoqIFp0ZSBWbGFuIE1hYy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMKK3sKKyAgICBiY21vc192bGFuX3RhZyB2bGFuX2lkOyAgICAgICAgIC8qKjwgVmxhbiBJRC4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfZmlsdGVyOyAgIC8qKjwgTWFjIEZpbHRlci4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYzsKKworLyoqIENUQyBFeHQgQXR0cmlidXRlIFZhbHVlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzIHN0YXR1czsgICAgICAgLyoqPCBTdGF0dXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbiByZWFzb247ICAvKio8IFJlYXNvbi4gKi8KKyAgICAgICAgfSBwcHBvX2V0ZXN0X3Jlc3VsdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uIHN0YXJ0X29yX3N0b3A7IC8qKjwgU3RhcnRPclN0b3AuICovCisgICAgICAgICAgICB1aW50OF90IHVzZXJfbmFtZVs2NF07ICAgICAgICAgICAgICAgICAgLyoqPCBVc2VyTmFtZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcGFzc3dvcmRbMzJdOyAgICAgICAgICAgICAgICAgICAvKio8IFBhc3N3b3JkLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZSBtb2RlOyAgIC8qKjwgTW9kZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZsYW47ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmxhbi4gKi8KKyAgICAgICAgfSBwcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDhfdCB2ZW5kb3JfaWRbNF07ICAgICAgICAgICAgICAgLyoqPCBWZW5kb3IgSUQuICovCisgICAgICAgICAgICB1aW50MzJfdCBvbnVfbW9kZWw7ICAgICAgICAgICAgICAgICAvKio8IE9OVSBNb2RlbC4gKi8KKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIG9udV9tYWM7ICAgICAgICAgIC8qKjwgT05VIE1BQy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaHd2ZXJzaW9uWzhdOyAgICAgICAgICAgICAgIC8qKjwgSFcgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc3d2ZXJzaW9uWzE2XTsgICAgICAgICAgICAgIC8qKjwgU1cgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZXh0X29udV9tb2RlbFsxNl07ICAgICAgICAgIC8qKjwgRXh0IE9OVSBNb2RlbC4gKi8KKyAgICAgICAgfSBvbnVfc2VyaWFsX251bWJlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGZpcm13YXJlX3ZlcnNpb25fY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGZpcm13YXJlX3ZlcnNpb24uICovCisgICAgICAgICAgICB1aW50OF90ICpmaXJtd2FyZV92ZXJzaW9uOyAgICAgICAgICAvKio8IEZpcm13YXJlIFZlcnNpb24uICovCisgICAgICAgIH0gZmlybXdhcmVfdmVyc2lvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZlbmRvcl9pZDsgICAgICAgICAgICAgICAgIC8qKjwgVmVuZG9yIElELiAqLworICAgICAgICAgICAgdWludDE2X3QgY2hpcF9tb2RlbDsgICAgICAgICAgICAgICAgLyoqPCBDaGlwIE1vZGVsLiAqLworICAgICAgICAgICAgdWludDhfdCByZXZpc2lvbjsgICAgICAgICAgICAgICAgICAgLyoqPCBSZXZpc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZGVzaWduX2RhdGVbM107ICAgICAgICAgICAgIC8qKjwgRGVzaWduIERhdGUuICovCisgICAgICAgIH0gY2hpcHNldF9pZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzIHNlcnZpY2VzOyAgICAvKio8IFNlcnZpY2VzLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1fZ2Vwb3J0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bSBHRSBQb3J0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGdlYml0bWFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBHRSBCaXRtYXAuICovCisgICAgICAgICAgICB1aW50OF90IG51bV9mZXBvcnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtIEZFIFBvcnRzLiAqLworICAgICAgICAgICAgdWludDY0X3QgZmViaXRtYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZFIEJpdG1hcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3BvdHNfcG9ydHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW0gUE9UUyBQb3J0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2UxcG9ydHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW0gRTEgUG9ydHMuICovCisgICAgICAgICAgICB1aW50OF90IG51bV91cHN0cmVhbV9xdWV1ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtIFVwc3RyZWFtIFF1ZXVlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3F1ZXVlc19wZXJfcG9ydF91cDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggUXVldWVzIFBlciBQb3J0IFVwLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1fZG93bnN0cmVhbV9xdWV1ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bSBEb3duc3RyZWFtIFF1ZXVlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3F1ZXVlc19wZXJfcG9ydF9kb3duOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggUXVldWVzIFBlciBQb3J0IERvd24uICovCisgICAgICAgICAgICB1aW50OF90IGJhdHRlcnlfYmFja3VwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQmF0dGVyeSBCYWNrdXAuICovCisgICAgICAgIH0gb251X2NhcGFiaWxpdGllczE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHRyYW5zY2VpdmVyX3RlbXBlcmF0dXJlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc2NlaXZlciBUZW1wZXJhdHVyZSAqLworICAgICAgICAgICAgdWludDE2X3Qgc3VwcGx5X3ZjYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN1cHBseSBWb2x0YWdlIChWY2MpICovCisgICAgICAgICAgICB1aW50MTZfdCB0eF9iaWFzX2N1cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHggQmlhcyBDdXJyZW50ICovCisgICAgICAgICAgICB1aW50MTZfdCB0eF9wb3dlcl9vdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHggUG93ZXIgT3V0cHV0ICovCisgICAgICAgICAgICB1aW50MTZfdCByeF9wb3dlcl9pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUnggUG93ZXIgSW5wdXQgKi8KKyAgICAgICAgfSBvcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3NpczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZSBzZXJ2aWNlX3NsYTsgICAvKio8IFNlcnZpY2UgU0xBICovCisgICAgICAgIH0gc2VydmljZV9zbGE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZSBvbnVfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDVEMgT05VIFR5cGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2xpbmtzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGxpbmtzIHRoZSBPTlUgc3VwcG9ydHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZSBwcm90ZWN0aW9uX3R5cGU7ICAgIC8qKjwgQ1RDIE9OVSBQcm90ZWN0aW9uIFR5cGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3Bvbl9pZnM7ICAgICAgICAvKio8IE51bWJlciBvZiBQT04gSW50ZXJmYWNlcyAqLworICAgICAgICAgICAgdWludDhfdCBudW1fc2xvdHM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFNsb3QgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaW50ZXJmYWNlc19jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBJbnRlcmZhY2VzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgKmludGVyZmFjZXM7ICAvKio8IExpc3Qgb2YgaW50ZXJmYWNlcyAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBiYXR0ZXJ5X2JhY2t1cDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCYXR0ZXJ5IEJhY2t1cCAqLworICAgICAgICB9IG9udV9jYXBhYmlsaXRpZXMyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSBob2xkb3Zlcl9zdGF0ZTsgICAvKio8IEN1cnJlbnQgc3RhdGUgb2YgT05VIGhvbGRvdmVyICovCisgICAgICAgICAgICB1aW50MzJfdCBob2xkb3Zlcl90aW1lOyAvKio8IE9OVSBzdGF0ZSBob2xkb3ZlciB0aW1lLCBpbiBtcyAqLworICAgICAgICB9IGhvbGRvdmVyX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlIHBhcmFtczsgIC8qKjwgUGFyYW1ldGVycyAqLworICAgICAgICB9IG14dV9tYW5hZ2VfZ2xvYmFsX3BhcmFtZXRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZSBwYXJhbXM7ICAgIC8qKjwgUGFyYW1ldGVycyAqLworICAgICAgICB9IG14dV9tYW5hZ2Vfc25tcF9wYXJhbWV0ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDhfdCBwb25fbnVtYmVyOyAgICAgICAgIC8qKjwgQWN0aXZlIFBPTiBQb3J0IE51bWJlciAqLworICAgICAgICB9IGFjdGl2ZV9wb25faWZhZG1pbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vc19ib29sIGlzX2lwdjZhd2FyZTsgICAgLyoqPCBJZiB0aGlzIGlzIHNldCwgSVB2NiBhd2FyZSBpcyBzdXBwb3J0ZWQgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGUgcG93ZXJfY29udHJvbF90eXBlOyAgIC8qKjwgT05VIFBvd2VyIFN1cHBseSBDb250cm9sICovCisgICAgICAgICAgICB1aW50OF90IHNlcnZpY2Vfc2xhOyAgICAvKio8IDB4MDE6IE5vdCBzdXBwb3J0IFNlcnZpY2UgU0xBLiAweDAyLTB4MDg6IFRoZSBudW1iZXIgb2Ygc2VydmljZSBzdXBwb3J0ZWQgKi8KKyAgICAgICAgfSBvbnVfY2FwYWJpbGl0aWVzMzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgbGlua19zdGF0ZTsgIC8qKjwgTGluayBTdGF0ZS4gKi8KKyAgICAgICAgfSBldGhfbGlua19zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgZW5hYmxlZDsgICAgIC8qKjwgRW5hYmxlZC4gKi8KKyAgICAgICAgfSBldGhfcG9ydF9wYXVzZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgY29uZmlnOyAgIC8qKjwgQ29uZmlnLiAqLworICAgICAgICB9IGV0aF9wb3J0X3BvbGljaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBwb3J0X3N0YXRlOyAgICAgICAgICAgICAgLyoqPCBQb3J0IFN0YXRlLiAqLworICAgICAgICB9IHZvaXBfcG9ydDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgcG9ydF9zdGF0ZTsgICAgICAgICAgICAgIC8qKjwgUG9ydCBTdGF0ZS4gKi8KKyAgICAgICAgfSBlMXBvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vc19ib29sIHJhdGVfbGltaXRpbmdfZW5hYmxlZDsgICAvKio8IFJhdGUgTGltaXRpbmcgRW5hYmxlZC4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IGNpcjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBDb21taXR0ZWQgSW5mb3JtYXRpb24gUmF0ZSBpbiBLYnBzICovCisgICAgICAgICAgICB1aW50MjRfdCBwaXI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gUGVhayBJbmZvcm1hdGlvbiBSYXRlIGluIEticHMgKi8KKyAgICAgICAgfSBldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgc3RhdGU7ICAgIC8qKjwgU3RhdGUgb2YgdGhlIGxvb3BiYWNrIGRldGVjdGlvbiBmZWF0dXJlICovCisgICAgICAgIH0gcG9ydF9sb29wX2RldGVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlIHZsYW5faW5mbzsgICAvKio8IFZMQU4gSW5mby4gKi8KKyAgICAgICAgfSB2bGFuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uIG9wOyAgICAvKio8IE9wLiAqLworICAgICAgICAgICAgdWludDhfdCBydWxlc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUnVsZXMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKnJ1bGVzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBSdWxlcy4gKi8KKyAgICAgICAgfSBjbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3Ygdmxhbl9pbmZvOyAgLyoqPCBWTEFOIEluZm8uICovCisgICAgICAgIH0gbXVsdGljYXN0X3ZsYW47CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlIHRhZ19vcGVyYXRpb247IC8qKjwgVGFnIE9wZXJhdGlvbi4gKi8KKyAgICAgICAgfSBtdWx0aWNhc3RfdGFnX29wZXJhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZSBtb2RlOyAvKio8IE1vZGUuICovCisgICAgICAgIH0gbXVsdGljYXN0X3N3aXRjaDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG11bHRpY2FzdF9jb250cm9sOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDhfdCBtYXhfZ3JvdXBzOyAgICAgICAgICAgICAgICAgLyoqPCBNYXggR3JvdXBzLiAqLworICAgICAgICB9IGdyb3VwX21heDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGZhc3RfbGVhdmVfbW9kZXNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIEZhc3QgTGVhdmUgTW9kZXMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90ICpmYXN0X2xlYXZlX21vZGVzOyAgICAgICAgIC8qKjwgQml0bWFwcyBmb3IgZWFjaCBlbnVtZXJhdGVkIGZhc3QgbGVhdmUgbW9kZSAqLworICAgICAgICB9IGZhc3RfbGVhdmVfYWJpbGl0eTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSBzdGF0ZTsgICAgLyoqPCBTdGF0ZS4gKi8KKyAgICAgICAgfSBmYXN0X2xlYXZlX2FkbWluX3N0YXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50OF90IGxsaWRfcXVldWVfdGFibGVfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIExMSUQvUXVldWUgVGFibGUgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUgKmxsaWRfcXVldWVfdGFibGU7ICAgLyoqPCBDVEMgMi4xIE9OVSBMTElEIFF1ZXVlIENvbmZpZ3VyYXRpb24gVGFibGUgKi8KKyAgICAgICAgfSBsbGlkX3F1ZXVlX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBpYWRfbWFjOyAgLyoqPCBJQUQgTUFDIEFkZHJlc3MgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbCBwcm90b2NvbF9zdXBwb3J0OyAvKio8IFByb3RvY29sIFN1cHBvcnQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaWFkX3NvZnR3YXJlX3ZlclszMl07ICAgICAgICAgICAgICAgICAgICAgICAvKio8IElBRCBTb2Z0d2FyZSB2ZXJzaW9uICovCisgICAgICAgICAgICB1aW50OF90IGlhZF9zb2Z0d2FyZV90aW1lWzMyXTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJQUQgc29mdHdhcmUgdGltZSwgdmVyc2lvbiB0aW1lIGZvcm1hdCB1c2VzOllZWVlNTURESEhNTVNTICovCisgICAgICAgICAgICB1aW50OF90IHZvaXBfdXNlcl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGljYXRlIFBPVFMgbnVtYmVyIG9mIElBRCBtb2R1bGUgKi8KKyAgICAgICAgfSBpYWRfaW5mb3JtYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2lwbW9kZSB2b2ljZV9pcG1vZGU7ICAvKio8IENUQyBWb2ljZSBJUCBNb2RlICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgaWFkX2lwYWRkcjsgICAgICAgICAgICAgICAgICAvKio8IElBRCBJUCBBZGRyZXNzICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgaWFkX25ldF9tYXNrOyAgICAgICAgICAgICAgICAvKio8IElBRCBOZXQgTWFzayBBZGRyZXNzICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgaWFkX2RlZmF1bHRfZ3c7ICAgICAgICAgICAgICAvKio8IElBRCBEZWZhdWx0IEdhdGV3YXkgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZSBwcHBvZV9tb2RlOyAgICAgIC8qKjwgUFBQb0UgTW9kZSAqLworICAgICAgICAgICAgdWludDhfdCBwcHBvZV91c2VybmFtZVszMl07ICAgICAgICAgICAgICAgICAgICAgLyoqPCBQUFBvRSBVc2VybmFtZSAqLworICAgICAgICAgICAgdWludDhfdCBwcHBvZV9wYXNzd29yZFszMl07ICAgICAgICAgICAgICAgICAgICAgLyoqPCBQUFBvRSBQYXNzd29yZCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGUgdGFnZ2luZ19tb2RlOyAgICAvKio8IFRhZ2dpbmcgTW9kZSAqLworICAgICAgICAgICAgdWludDE2X3Qgdm9pY2VfY3ZsYW47ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZvaWNlIENWTEFOICovCisgICAgICAgICAgICB1aW50MTZfdCB2b2ljZV9zdmxhbjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVm9pY2UgU1ZMQU4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgdm9pY2VfcHJpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWb2ljZSBQcmlvcml0eSAqLworICAgICAgICB9IHZvaXBfZ2xvYmFsX3BhcmFtZXRlcnM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG1ncG9ydF9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBNRyBQb3J0IE51bWJlciAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIG1nY19pcDsgICAgICAgICAgICAgICAgICAvKio8IEFjdGl2YXRlIHNvZnRzd2l0Y2ggcGxhdGZvcm0gSVAgYWRkcmVzcyAqLworICAgICAgICAgICAgdWludDE2X3QgbWdjX2NvbV9wb3J0OyAgICAgICAgICAgICAgICAgICAgICAvKio8IEFjdGl2YXRlIHNvZnRzd2l0Y2ggcGxhdGZvcm0gQ09NIHBvcnQgbnVtYmVyICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgYmFja3VwX21nY19pcDsgICAgICAgICAgIC8qKjwgQmFja3VwIHNvZnRzd2l0Y2ggcGxhdGZvcm0gSVAgYWRkcmVzcy4gSWYgaXQgaXMgMHgwMDAwMDAwMCwgZHVhbCBob21pbmcgaXMgbm90IGVuYWJsZSAqLworICAgICAgICAgICAgdWludDE2X3QgYmFja3VwX21nY19jb21fcG9ydDsgICAgICAgICAgICAgICAvKio8IEJhY2t1cCBzb2Z0c3dpdGNoIHBsYXRmb3JtIENPTSBwb3J0IG51bWJlciwgaWYgaXQgaXMgMCwgZHVhbCBob21pbmcgaXMgbm90IGVuYWJsZWQgKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgdXNlX2FjdGl2ZV9tZ2M7ICAgICAgICAgICAgICAgICAgLyoqPCBTaG91bGQgd2UgdXNlIHRoZSBhY3RpdmUgc29mdHN3aXRjaCBwbGF0Zm9ybSBpbnN0ZWFkIG9mIHRoZSBiYWNrdXA/ICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZSByZWdfbW9kZTsgIC8qKjwgSDI0OCBSZWcgTW9kZSAqLworICAgICAgICAgICAgdWludDhfdCBtaWRbNjRdOyAgICAvKio8IE1JRCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGUgaGVhcnRiZWF0X21vZGU7ICAvKio8IEhlYXJ0YmVhdCBNb2RlICovCisgICAgICAgICAgICB1aW50MTZfdCBoZWFydGJlYXRfY3ljbGU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEhlYXJ0YmVhdCBDeWNsZSAqLworICAgICAgICAgICAgdWludDhfdCBoZWFydGJlYXRfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBIZWFydGJlYXQgQ291bnQgKi8KKyAgICAgICAgfSBoMjQ4cGFyYW1ldGVyczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbmFtZVszMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNlciBUSUQgTmFtZSAqLworICAgICAgICB9IGgyNDh1c2VyX3RpZF9pbmZvcm1hdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3J0cF90aWRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFJUUCBUSURzICovCisgICAgICAgICAgICB1aW50OF90IHByZWZpeFsxNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFByZWZpeCBpbiBBU0NJSSAqLworICAgICAgICAgICAgdWludDY0X3QgZGlnaXRfYmVnaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSVFAgVElEIGRpZ2l0YWwgcG9ydGlvbiBzdGFydCB2YWx1ZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGUgcnRwX3RpZF9tb2RlOyAgLyoqPCBSVFAgVElEIE1vZGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcnRwX3RpZF9sZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBSVFAgVElEIERpZ2l0IExlbmd0aCAqLworICAgICAgICB9IGgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3J0cF90aWRzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgUlRQIFRJRHMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZmlyc3RfcnRwX3RpZF9uYW1lWzMyXTsgICAgICAgICAgICAgLyoqPCBGcmlzdCBSVFAgVElEIE5hbWUgKi8KKyAgICAgICAgfSBoMjQ4cnRwX3RpZF9pbmZvcm1hdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDE2X3QgbWdwb3J0X251bWJlcjsgICAgICAgICAgICAgICAgICAgICAvKio8IE1HIFBvcnQgTnVtYmVyICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgYWN0aXZlX3NpcF9pcDsgICAgICAgICAgIC8qKjwgQWN0aXZlIFNJUCBhZ2VudCBzZXJ2ZXIgSVAgYWRkcmVzcyAqLworICAgICAgICAgICAgdWludDE2X3QgYWN0aXZlX3NpcF9jb21fcG9ydDsgICAgICAgICAgICAgICAvKio8IEFjdGl2ZSBTSVAgYWdlbnQgc2VydmVyIHBvcnQgbnVtYmVyICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgYmFja3VwX3NpcF9pcDsgICAgICAgICAgIC8qKjwgQmFja3VwIFNJUCBhZ2VudCBzZXJ2ZXIgSVAgYWRkcmVzcyAqLworICAgICAgICAgICAgdWludDE2X3QgYmFja3VwX3NpcF9jb21fcG9ydDsgICAgICAgICAgICAgICAvKio8IEJhY2t1cCBTSVAgUHJveHkgU2VydmVyIENvbSBQb3J0IE51bWJlciAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGFjdGl2ZV9zaXBfcHJveHlfc2VydmVyOyAvKio8IEFjdGl2ZSBTSVAgUHJveHkgU2VydmVyICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgYWN0aXZlX3NpcF9yZWdpc3RyYXRpb25fc2VydmVyX2lwOyAgIC8qKjwgU0lQIFJlZ2lzdGVyIFNlcnZlciBJUCAqLworICAgICAgICAgICAgdWludDE2X3QgYWN0aXZlX3NpcF9yZWdpc3RyYXRpb25fc2VydmVyX2NvbV9wb3J0OyAgICAgICAvKio8IEFjdGl2ZSBTSVAgcmVnaXN0cmF0aW9uIHNlcnZlciBwb3J0IG51bWJlciAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGJhY2t1cF9zaXBfcmVnX2lwOyAgICAgICAgICAgICAgICAgICAvKio8IEJhY2t1cCBTSVAgUmVnaXN0cmF0aW9uIFNlcnZlciBJUCAqLworICAgICAgICAgICAgdWludDE2X3QgYmFja3VwX3NpcF9yZWdfY29tX3BvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJhY2t1cCBTSVAgUmVnaXN0cmF0aW9uIFNlcnZlciBDb20gUG9ydCBOdW1iZXIgKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBvdXRib3VuZF9zZXJ2ZXJfaXA7ICAgICAgICAgICAgICAgICAgLyoqPCBPdXQgQm91bmQgU2VydmVyIElQICovCisgICAgICAgICAgICB1aW50MTZfdCBvdXRib3VuZF9zZXJ2ZXJfcG9ydDsgICAgICAgICAgLyoqPCBPdXQgQm91bmQgU2VydmVyIFBvcnQgTnVtYmVyICovCisgICAgICAgICAgICB1aW50MzJfdCBzaXBfcmVnaXN0cmF0aW9uX2ludGVydmFsOyAgICAgLyoqPCBSZWdpc3RyYXRpb24gcmVmcmVzaCBjeWNsZSwgdW5pdCBpcyBzZWNvbmQsIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAzNjAwcyAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBkaXNhYmxlX2hlYXJ0YmVhdF9zd2l0Y2g7ICAgIC8qKjwgRGlzYWJsZSBIZWFydGJlYXQgU3dpdGNoIEZlYXR1cmUgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGhlYXJ0YmVhdF9jeWNsZTsgICAgICAgICAgICAgICAvKio8IEhlYXJ0YmVhdCBDeWNsZSAqLworICAgICAgICAgICAgdWludDE2X3QgaGVhcnRiZWF0X2NvdW50OyAgICAgICAgICAgICAgIC8qKjwgSGVhcnRiZWF0IENvdW50ICovCisgICAgICAgIH0gc2lwX3BhcmFtZXRlcnM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50OF90IGFjY291bnRbMTZdOyAgICAvKio8IFVzZXIgYWNjb3VudCwgVXNlciBwaG9uZSBudW1iZXIsIGFuZCBzaG91bGQgdXNlIEFTQ0lJIGNvZGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbmFtZVszMl07ICAgICAgIC8qKjwgVXNlciBuYW1lLCBTSVAgcG9ydCB1c2VybmFtZSwgYW5kIHNob3VsZCB1c2UgQVNDSUkgY29kZSAqLworICAgICAgICAgICAgdWludDhfdCBwYXNzd29yZFsxNl07ICAgLyoqPCBVc2VyIHBhc3N3b3JkLCBTSVAgcG9ydCBwYXNzd29yZCwgYW5kIHNob3VsZCB1c2UgQVNDSUkgY29kZS4gKi8KKyAgICAgICAgfSBzaXBfdXNlcl9wYXJhbWV0ZXJzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlIHZvaWNlX3QzOGVuYWJsZTsgIC8qKjwgQ3RjIFZvaWNlIFQzOCBFbmFibGUgTW9kZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlIHZvaWNlX2ZheF9tb2RlbV9jb250cm9sOyAgIC8qKjwgQ1RDIFZvaWNlIEZheCBNb2RlbSBDb250cm9sIE1vZGUgKi8KKyAgICAgICAgfSBmYXhfbW9kZW1fY29uZmlndXJhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzIGlhZF9vcGVyYXRpb25fc3RhdHVzOyAgLyoqPCBDVEMgSUFEIE9wZXJhdGlvbiBTdGF0dXMgKi8KKyAgICAgICAgfSBoMjQ4aWFkX29wZXJhdGlvbl9zdGF0dXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXMgaWFkX3BvcnRfc3RhdHVzOyAgICAgICAgICAgICAgICAvKio8IENUQyBJQUQgUG9ydCBTdGF0dXMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZSBpYWRfcG9ydF9zZXJ2aWNlX3N0YXRlOyAgLyoqPCBDVEMgSUFEIFBvcnQgU2VydmljZSBTdGF0ZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlIGlhZF9wb3J0X2NvZGVjX21vZGU7ICAgICAgICAvKio8IENUQyBJQUQgUG9ydCBDb2RlYyBNb2RlICovCisgICAgICAgIH0gcG90c19zdGF0dXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uIGlhZF9vcGVyYXRpb247ICAgIC8qKjwgQ1RDIElBRCBPcGVyYXRpb24gKi8KKyAgICAgICAgfSBpYWRfb3BlcmF0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MTZfdCBzaXBfZGlnaXRhbF9tYXBfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFNJUCBEaWdpdGFsIE1hcCAqLworICAgICAgICAgICAgdWludDhfdCAqc2lwX2RpZ2l0YWxfbWFwOyAgICAgICAvKio8IFNJUCBQcm90b2NvbCBEaWdpdGFsIE1hcCwgQVNDSUkgY29kZSB0eXBlICovCisgICAgICAgIH0gc2lwX2RpZ2l0X21hcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQgaWQ7ICAgICAgICAvKio8IEFsYXJtIElEICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgY29uZmlnOyAgIC8qKjwgQWxhcm0gY29uZmlndXJhdGlvbiBzdGF0ZSAqLworICAgICAgICB9IGFsYXJtX2FkbWluX3N0YXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkIGlkOyAgICAvKio8IEFsYXJtIElEICovCisgICAgICAgICAgICB1aW50MzJfdCB0aHJlc2hvbGQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBBbGFybSBUaHJlc2hvbGQgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGNsZWFyaW5nX3RocmVzaG9sZDsgICAgICAgICAgICAvKio8IENsZWFyaW5nIEFsYXJtIFRocmVzaG9sZCAqLworICAgICAgICB9IGFsYXJtX3RocmVzaG9sZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGlwYWRkcmVzczsgICAvKio8IElQIEFkZHJlc3MuICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgaXBtYXNrOyAgICAgIC8qKjwgSVAgTWFzay4gKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBnYXRld2F5OyAgICAgLyoqPCBHYXRlV2F5LiAqLworICAgICAgICAgICAgYmNtb3Nfdmxhbl90YWcgdmxhbl9pZDsgICAgICAgICAvKio8IFZsYW4gSUQuICovCisgICAgICAgICAgICB1aW50OF90IHVzZXJfbmFtZVs4XTsgICAgICAgICAgIC8qKjwgVXNlciBOYW1lLiAqLworICAgICAgICAgICAgdWludDhfdCBwYXNzd29yZFs4XTsgICAgICAgICAgICAvKio8IFBhc3N3b3JkLiAqLworICAgICAgICAgICAgdWludDhfdCBhY3Rpb247ICAgICAgICAgICAgICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmVyc2lvbl9udW1iZXI7ICAgICAgICAgLyoqPCBWZXJzaW9uIE51bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmVyMW5hbWVbMTZdOyAgICAgICAgICAgLyoqPCBWZXIxIE5hbWUuICovCisgICAgICAgICAgICB1aW50OF90IHZlcjJuYW1lWzE2XTsgICAgICAgICAgIC8qKjwgVmVyMiBOYW1lLiAqLworICAgICAgICAgICAgdWludDhfdCB2ZXIzbmFtZVsxNl07ICAgICAgICAgICAvKio8IFZlcjMgTmFtZS4gKi8KKyAgICAgICAgfSB2ZXJzaW9uX3NlcnZlcl9wYXJhOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MTZfdCBtYWNfbGltaXRfbnVtYmVyOyAgICAgIC8qKjwgTWFjIExpbWl0IE51bWJlci4gKi8KKyAgICAgICAgfSBvbnVfbWFjX2xpbWl0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCBtYWNfYWdpbmdfdGltZTsgICAgICAgIC8qKjwgTWFjIEFnaW5nIFRpbWUuICovCisgICAgICAgIH0gb251X21hY19hZ2luZ190aW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb24gb3A7ICAvKio8IE9wLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfZW50cmllczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgT2YgRW50cmllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgKmNsYXVzZTsgICAgICAgICAgIC8qKjwgQ2xhdXNlLiAqLworICAgICAgICB9IG9udV9wb3J0X21hY19maWx0ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uIG9wOyAgLyoqPCBPcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX2VudHJpZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIE9mIEVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjICpjbGF1c2U7ICAgICAgICAgICAvKio8IENsYXVzZS4gKi8KKyAgICAgICAgfSBvbnVfcG9ydF9tYWNfYmluZGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb24gb3A7ICAvKio8IE9wLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfZW50cmllczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgT2YgRW50cmllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgKmNsYXVzZTsgICAgICAgICAgIC8qKjwgQ2xhdXNlLiAqLworICAgICAgICB9IG9udV9wb3J0X21hY19zdGF0aWM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZpbm9jdGV0czsgICAgICAgIC8qKjwgSWZJbk9jdGV0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmaW51Y2FzdHBrdHM7ICAgICAvKio8IElmSW5VY2FzdFBrdHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmlubnVjYXN0cGt0czsgICAgLyoqPCBJZkluTlVjYXN0UGt0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmaW5kaXNjYXJkczsgICAgICAvKio8IElmSW5EaXNjYXJkcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmaW5lcnJvcnM7ICAgICAgICAvKio8IElmSW5FcnJvcnMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZm91dG9jdGV0czsgICAgICAgLyoqPCBJZk91dE9jdGV0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmb3V0dWNhc3Rwa3RzOyAgICAvKio8IElmT3V0VWNhc3RQa3RzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZvdXRudWNhc3Rwa3RzOyAgIC8qKjwgSWZPdXROVWNhc3RQa3RzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZvdXRkaXNjYXJkczsgICAgIC8qKjwgSWZPdXREaXNjYXJkcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmb3V0ZXJyb3JzOyAgICAgICAvKio8IElmT3V0RXJyb3JzLiAqLworICAgICAgICAgICAgdWludDY0X3QgcmVzZXJ2ZWQxOyAgICAgICAgIC8qKjwgUmVzZXJ2ZWQxLiAqLworICAgICAgICAgICAgdWludDY0X3QgcmVzZXJ2ZWQyOyAgICAgICAgIC8qKjwgUmVzZXJ2ZWQyLiAqLworICAgICAgICAgICAgdWludDY0X3QgcmVzZXJ2ZWQzOyAgICAgICAgIC8qKjwgUmVzZXJ2ZWQzLiAqLworICAgICAgICAgICAgdWludDY0X3QgcmVzZXJ2ZWQ0OyAgICAgICAgIC8qKjwgUmVzZXJ2ZWQ0LiAqLworICAgICAgICB9IG9udV9wZXJmb3JtYW5jZV9zdGF0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlIHBvcnRfaXNvbGF0ZTsgIC8qKjwgUG9ydCBJc29sYXRlLiAqLworICAgICAgICB9IG9udV9wb3J0X2lzb2xhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICB9IG9udV9tYWNfYWRkcmVzc190YWJsZV9xdWVyeTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vc19ib29sIHBvbm1hY2RzcmF0ZWxpbWl0aW5nZW5hYmxlOyAgLyoqPCBQb25NYWNEU3JhdGVMaW1pdGluZ0VuYWJsZS4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IGNpcjsgICAvKio8IENJUi4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IGNiczsgICAvKio8IENCUy4gKi8KKyAgICAgICAgfSBvbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGUgYnVmZmVyX21hbmFnZW1lbnRfY2FwYWJpbGl0eTsgICAgLyoqPCBCdWZmZXIgTWFuYWdlbWVudCBDYXBhYmlsaXR5LiAqLworICAgICAgICAgICAgdWludDI0X3QgZHNidWZmZXJfc2l6ZV9taW5pbXVtX3ZhbHVlOyAgIC8qKjwgRFMgQnVmZmVyIFNpemUgTWluaW11bSBWYWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IGRzYnVmZmVyX3NpemVfbWF4aW11bV92YWx1ZTsgICAvKio8IERTIEJ1ZmZlciBTaXplIE1heGltdW0gVmFsdWUuICovCisgICAgICAgICAgICB1aW50MjRfdCB1c2J1ZmZlcl9zaXplX21pbmltdW1fdmFsdWU7ICAgLyoqPCBVUyBCdWZmZXIgU2l6ZSBNaW5pbXVtIFZhbHVlLiAqLworICAgICAgICAgICAgdWludDI0X3QgdXNidWZmZXJfc2l6ZV9tYXhpbXVtX3ZhbHVlOyAgIC8qKjwgVVMgQnVmZmVyIFNpemUgTWF4aW11bSBWYWx1ZS4gKi8KKyAgICAgICAgfSBvbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBidWZmZXJfbWFuYWdlbWVudF9pbmRpY2F0aW9uOyAgICAgICAgLyoqPCBCdWZmZXIgTWFuYWdlbWVudCBJbmRpY2F0aW9uLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb24gZGlyZWN0aW9uOyAgLyoqPCBEaXJlY3Rpb24uICovCisgICAgICAgICAgICB1aW50MjRfdCBidWZmZXJfc2l6ZTsgICAvKio8IEJ1ZmZlciBTaXplLiAqLworICAgICAgICB9IG9udV9wb25fbWFjX3VzZHNidWZmZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGUgc3RhdGlzdGljc19hY3Rpb247ICAgLyoqPCBTdGF0aXN0aWNzIEFjdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IHN0YXRpc3RpY3NfaW50ZXJ2YWw7ICAgICAgIC8qKjwgU3RhdGlzdGljcyBJbnRlcnZhbC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXRpc3RpY3NfZHVyYXRpb25fdGltZTsgIC8qKjwgU3RhdGlzdGljcyBEdXJhdGlvbiBUaW1lLiAqLworICAgICAgICB9IG9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGUgc3RhdGlzdGljc19yZXNldDsgLyoqPCBTdGF0aXN0aWNzIFJlc2V0LiAqLworICAgICAgICB9IG9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZSB1bmlmbG93c3RhdGlzdGljc2NvbGxlY3Rjb250cm9saW5kaWNhdGlvbjsgLyoqPCBVbmlGbG93U3RhdGlzdGljc0NvbGxlY3RDb250cm9sSW5kaWNhdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmaW5vY3RldHM7ICAgICAgICAvKio8IElmSW5PY3RldHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmludWNhc3Rwa3RzOyAgICAgLyoqPCBJZkluVWNhc3RQa3RzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZpbm51Y2FzdHBrdHM7ICAgIC8qKjwgSWZJbk5VY2FzdFBrdHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmluZGlzY2FyZHM7ICAgICAgLyoqPCBJZkluRGlzY2FyZHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmluZXJyb3JzOyAgICAgICAgLyoqPCBJZkluRXJyb3JzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZvdXRvY3RldHM7ICAgICAgIC8qKjwgSWZPdXRPY3RldHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZm91dHVjYXN0cGt0czsgICAgLyoqPCBJZk91dFVjYXN0UGt0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmb3V0bnVjYXN0cGt0czsgICAvKio8IElmT3V0TlVjYXN0UGt0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmb3V0ZGlzY2FyZHM7ICAgICAvKio8IElmT3V0RGlzY2FyZHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZm91dGVycm9yczsgICAgICAgLyoqPCBJZk91dEVycm9ycy4gKi8KKyAgICAgICAgfSBvbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50OF90IHBvbnBvcnRudW1iZXI7ICAgICAgLyoqPCBQb25Qb3J0TnVtYmVyLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSBtYWluX2xpZ2h0X2luZGljYXRpb247ICAgIC8qKjwgTWFpbiBMaWdodCBJbmRpY2F0aW9uLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSByZXNlcnZlX2xpZ2h0X2luZGljYXRpb247IC8qKjwgUmVzZXJ2ZSBMaWdodCBJbmRpY2F0aW9uLiAqLworICAgICAgICB9IG9udV9saWdodF9leGNlcHRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUgbWF0Y2hfbWFjX2FkZHJlc3M7ICAgLyoqPCBNYXRjaCBNQUMgQWRkcmVzcy4gKi8KKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHBvbl9tYWNfYWRkcmVzczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQb24gTUFDIEFkZHJlc3MuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUgYWN0aW9uOyAgIC8qKjwgQWN0aW9uLiAqLworICAgICAgICAgICAgdWludDE2X3QgZHVyYXRpb25fdGltZTsgICAgICAgICAgICAgICAgIC8qKjwgRHVyYXRpb24gVGltZS4gKi8KKyAgICAgICAgfSBvbnVfbGlnaHRfY29udHJvbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZXNfdHJhbnNtaXR0ZWRvazsgICAgICAgICAgLyoqPCBGcmFtZXMgVHJhbnNtaXR0ZWRPSy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG9jdGV0c190cmFuc21pdHRlZG9rOyAgICAgICAgICAvKio8IE9jdGV0cyBUcmFuc21pdHRlZE9LLiAqLworICAgICAgICAgICAgdWludDY0X3QgbXVsdGljYXN0X2ZyYW1lc3htaXR0ZWRfb2s7ICAgIC8qKjwgTXVsdGljYXN0IEZyYW1lc1htaXR0ZWQgT0suICovCisgICAgICAgICAgICB1aW50NjRfdCBicm9hZGNhc3RfZnJhbWVzeG1pdHRlZF9vazsgICAgLyoqPCBCcm9hZGNhc3QgRnJhbWVzWG1pdHRlZCBPSy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lc19yZWNlaXZlZF9vazsgICAgICAgICAgICAvKio8IEZyYW1lcyBSZWNlaXZlZCBPSy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG9jdGV0c19yZWNlaXZlZF9vazsgICAgICAgICAgICAvKio8IE9jdGV0cyBSZWNlaXZlZCBPSy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG11bHRpY2FzdF9mcmFtZXNfcmVjZWl2ZWRfb2s7ICAvKio8IE11bHRpY2FzdCBGcmFtZXMgUmVjZWl2ZWQgT0suICovCisgICAgICAgICAgICB1aW50NjRfdCBicm9hZGNhc3RfZnJhbWVzX3JlY2VpdmVkX29rOyAgLyoqPCBCcm9hZGNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LLiAqLworICAgICAgICB9IG9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50NjRfdCBjcmM4ZXJyb3JzOyAgICAgICAgICAgICAgICAvKio8IENSQzggRXJyb3JzLiAqLworICAgICAgICAgICAgdWludDY0X3QgZmVjX2NvcnJlY3RlZF9ibG9ja3M7ICAgICAgLyoqPCBGRUMgQ29ycmVjdGVkIEJsb2Nrcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGZlY191bmNvcnJlY3RhYmxlX2Jsb2NrczsgIC8qKjwgRkVDIFVuY29ycmVjdGFibGUgQmxvY2tzLiAqLworICAgICAgICAgICAgdWludDY0X3QgbXBjcF9tYWNfY3RybF9mcmFtZXNfdHJhbnNtaXR0ZWQ7ICAvKio8IE1wY3AgTWFjIEN0cmwgRnJhbWVzIFRyYW5zbWl0dGVkLiAqLworICAgICAgICAgICAgdWludDY0X3QgbXBjcF9tYWNfY3RybF9mcmFtZXNfcmVjZWl2ZWQ7ICAgICAvKio8IE1wY3AgTWFjIEN0cmwgRnJhbWVzIFJlY2VpdmVkLiAqLworICAgICAgICAgICAgdWludDY0X3QgbXBjcF90eF9yZWdpc3RlcjsgICAgICAgICAgICAgICAgICAvKio8IE1wY3AgVHggUmVnaXN0ZXIuICovCisgICAgICAgICAgICB1aW50NjRfdCBtcGNwX3R4X3JlZ3JlcXVlc3Q7ICAgICAgICAgICAgICAgIC8qKjwgTXBjcCBUeCBSZWdSZXF1ZXN0LiAqLworICAgICAgICAgICAgdWludDY0X3QgbXBjcF90eF9yZXBvcnQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE1wY3AgVHggUmVwb3J0LiAqLworICAgICAgICAgICAgdWludDY0X3QgbXBjcF9yeF9nYXRlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE1wY3AgUnggR2F0ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG1wY3BfcnhfcmVnaXN0ZTsgICAgICAgICAgICAgICAgICAgLyoqPCBNcGNwIFJ4IFJlZ2lzdGUuICovCisgICAgICAgIH0gb251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGUgYWxhcm1fY29uZmlnOyAvKio8IEFsYXJtIENvbmZpZy4gKi8KKyAgICAgICAgfSBhbGFybV9jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHkgYWJpbGl0eTsgICAvKio8IEFiaWxpdHkuICovCisgICAgICAgIH0gcm91Z3VlX29udV9leGNsX2FiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZSBzbGVlcF9tb2RlX2NhcGFiaWxpdHk7ICAgICAgICAgICAgICAgLyoqPCBPTlUgU2xlZXAgTW9kZSBDYXBhYmlsaXR5ICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHkgZWFybHlfd2FrZV91cF9jYXBhYmlsaXR5OyAvKio8IE9OVSBFYXJseSBXYWtlLVVwIENhcGFiaWxpdHkgKi8KKyAgICAgICAgfSBvbnVfcG93ZXJfc2F2aW5nX2NhcGFiaWxpdGllczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZSBlYXJseV93YWtlX3VwOyAgIC8qKjwgMHgwMDogRW5hYmxlOyAweDAxOiBEaXNhYmxlOyAweEZGOiBOb3QgU3VwcG9ydGVkOyBPdGhlcnM6IFJlc2VydmVkICovCisgICAgICAgICAgICB1aW50OF90IHNsZWVwX2R1cmF0aW9uX21heFs2XTsgIC8qKjwgTWF4aW11bSByZWZyZXNoIHRpbWUgaW4gcG93ZXIgc2F2aW5nIChVbml0OiBUUSkgKi8KKyAgICAgICAgfSBvbnVfcG93ZXJfc2F2aW5nX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDE2X3Qgb3B0aWNhbF9sb3NfdGltZTsgICAgICAvKio8IFRpbWUgb2YgT3B0aWNhbCBMb1MgaW4gUHJvdGVjdGlvbiBTd2l0Y2hpbmcgKFVuaXQ6IG1zKSAqLworICAgICAgICAgICAgdWludDE2X3QgbWFjX2xvc190aW1lOyAgICAgICAgICAvKio8IFRpbWUgb2YgTUFDIExvUyBpbiBQcm90ZWN0aW9uIFN3aXRjaGluZyAoVW5pdDogbXMpICovCisgICAgICAgIH0gb251X3Byb3RlY3Rpb25fcGFyYW1ldGVyczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZSBzdGF0ZTsgIC8qKjwgSW5kaWNhdGVzIHdoZXRoZXIgZGlzYWJsZSBwb3J0IGF1dG9tYXRpY2FsbHkgd2hlbiBkZXRlY3RpbmcgdGhlIHBvcnQgbG9vcGJhY2sgKi8KKyAgICAgICAgfSBwb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGFnaW5nX3RpbWU7ICAgIC8qKjwgTUFDIEFnaW5nIFRpbWUgKFVuaXQ6IHMpICovCisgICAgICAgIH0gbWFjX2FnaW5nX3RpbWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzIG1vbml0b3Jpbmdfc3RhdHVzOyAgICAvKio8IE1vbml0b3JpbmcgU3RhdHVzLiAqLworICAgICAgICAgICAgdWludDMyX3QgbW9uaXRvcmluZ19wZXJpb2Q7IC8qKjwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBQZXJpb2QgKFVuaXQ6IHMpICovCisgICAgICAgIH0gcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxOyAgICAgIC8qKjwgRG93bnN0cmVhbSBEcm9wRXZlbnRzLCBEb3duc3RyZWFtIEZyYWdtZW50cywgRG93bnN0cmVhbSBEaXNjYXJkcyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQyOyAgICAgIC8qKjwgVXBzdHJlYW0gRHJvcEV2ZW50cywgVXBzdHJlYW0gRnJhZ21lbnRzLCBVcHN0cmVhbSBEaXNjYXJkcyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQzOyAgICAgIC8qKjwgRG93bnN0cmVhbSBPY3RldHMsIERvd25zdHJlYW0gSmFiYmVycywgRG93bnN0cmVhbSBFcnJvcyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ0OyAgICAgIC8qKjwgVXBzdHJlYW0gT2N0ZXRzLCBVcHN0cmVhbSBKYWJiZXJzLCBVcHN0cmVhbSBFcnJvcnMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkNTsgICAgICAvKio8IERvd25zdHJlYW0gRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyA2NCBPY3RldHMsIFN0YXR1cyBDaGFuZ2UgVGltZXMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkNjsgICAgICAvKio8IFVwc3RyZWFtIEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgNjUgdG8gMTI3IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ3OyAgICAgIC8qKjwgRG93bnN0cmVhbSBCcm9hZGNhc3QgRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyAxMjggdG8gMjU1IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ4OyAgICAgIC8qKjwgVXBzdHJlYW0gQnJvYWRjYXN0IEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgMjU2IHRvIDUxMSBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkOTsgICAgICAvKio8IERvd25zdHJlYW0gTXVsdGljYXN0IEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgNTEyIHRvIDEwMjMgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDEwOyAgICAgLyoqPCBVcHN0cmVhbSBNdWx0aWNhc3QgRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyAxMDI0IHRvIDE1MTggT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDExOyAgICAgLyoqPCBEb3duc3RyZWFtIENSQyBFcnJvcmVkIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDY0IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxMjsgICAgIC8qKjwgVXBzdHJlYW0gQ1JDIEVycm9yZWQgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgNjUgdG8gMTI3IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxMzsgICAgIC8qKjwgRG93bnN0cmVhbSBVbmRlcnNpemUgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgMTI4IHRvIDI1NSBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTQ7ICAgICAvKio8IFVwc3RyZWFtIFVuZGVyc2l6ZSBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyAyNTYgdG8gNTExIE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxNTsgICAgIC8qKjwgRG93bnN0cmVhbSBPdmVyc2l6ZSBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyA1MTIgdG8gMTAyMyBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTY7ICAgICAvKio8IFVwc3RyZWFtIE92ZXJzaXplIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDEwMjQgdG8gMTUxOCBPY3RldHMgKi8KKyAgICAgICAgfSBwZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDE7ICAgICAgLyoqPCBEb3duc3RyZWFtIERyb3BFdmVudHMsIERvd25zdHJlYW0gRnJhZ21lbnRzLCBEb3duc3RyZWFtIERpc2NhcmRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDI7ICAgICAgLyoqPCBVcHN0cmVhbSBEcm9wRXZlbnRzLCBVcHN0cmVhbSBGcmFnbWVudHMsIFVwc3RyZWFtIERpc2NhcmRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDM7ICAgICAgLyoqPCBEb3duc3RyZWFtIE9jdGV0cywgRG93bnN0cmVhbSBKYWJiZXJzLCBEb3duc3RyZWFtIEVycm9zICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDQ7ICAgICAgLyoqPCBVcHN0cmVhbSBPY3RldHMsIFVwc3RyZWFtIEphYmJlcnMsIFVwc3RyZWFtIEVycm9ycyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ1OyAgICAgIC8qKjwgRG93bnN0cmVhbSBGcmFtZXMsIERvd25zdHJlYW0gRnJhbWVzIDY0IE9jdGV0cywgU3RhdHVzIENoYW5nZSBUaW1lcyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ2OyAgICAgIC8qKjwgVXBzdHJlYW0gRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyA2NSB0byAxMjcgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDc7ICAgICAgLyoqPCBEb3duc3RyZWFtIEJyb2FkY2FzdCBGcmFtZXMsIERvd25zdHJlYW0gRnJhbWVzIDEyOCB0byAyNTUgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDg7ICAgICAgLyoqPCBVcHN0cmVhbSBCcm9hZGNhc3QgRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyAyNTYgdG8gNTExIE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ5OyAgICAgIC8qKjwgRG93bnN0cmVhbSBNdWx0aWNhc3QgRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyA1MTIgdG8gMTAyMyBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTA7ICAgICAvKio8IFVwc3RyZWFtIE11bHRpY2FzdCBGcmFtZXMsIERvd25zdHJlYW0gRnJhbWVzIDEwMjQgdG8gMTUxOCBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTE7ICAgICAvKio8IERvd25zdHJlYW0gQ1JDIEVycm9yZWQgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgNjQgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDEyOyAgICAgLyoqPCBVcHN0cmVhbSBDUkMgRXJyb3JlZCBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyA2NSB0byAxMjcgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDEzOyAgICAgLyoqPCBEb3duc3RyZWFtIFVuZGVyc2l6ZSBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyAxMjggdG8gMjU1IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxNDsgICAgIC8qKjwgVXBzdHJlYW0gVW5kZXJzaXplIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDI1NiB0byA1MTEgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDE1OyAgICAgLyoqPCBEb3duc3RyZWFtIE92ZXJzaXplIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDUxMiB0byAxMDIzIE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxNjsgICAgIC8qKjwgVXBzdHJlYW0gT3ZlcnNpemUgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgMTAyNCB0byAxNTE4IE9jdGV0cyAqLworICAgICAgICB9IHBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBhY3Rpb247ICAgICAgICAgICAgLyoqPCBBY3Rpb24uICovCisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBvbnVfaWQ7ICAgLyoqPCBPbnUgSWQuICovCisgICAgICAgICAgICB1aW50MzJfdCBvcHRfaWQ7ICAgICAgICAgICAgLyoqPCBPcHRpY2FsIFRyYW5zbWl0dGVyIElkLiAqLworICAgICAgICB9IG9udV90eF9wb3dlcl9zdXBwbHlfY29udHJvbDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlOworCisvKiogQ1RDIEZpbGUgQ2hlY2sgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZSBvcGNvZGU7ICAgLyoqPCBPcGNvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmaWxlX3NpemU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBGaWxlIFNpemUuICovCisgICAgICAgIH0gZW5kX2Rvd25sb2FkX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGUgcnBzX2NvZGU7ICAvKio8IFJQUyBDb2RlLiAqLworICAgICAgICB9IGVuZF9kb3dubG9hZF9yZXNwb25zZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlOworCisvKiogQ1RDIE9VSSBWZXJzaW9uIFBhaXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOyAvKio8IE9VSS4gKi8KKyAgICB1aW50OF90IHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAvKio8IFZlcnNpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpcjsKKworLyoqIENUQyBQZXJmb3JtYW5jZSBNb25pdG9yaW5nIERhdGEuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YQoreworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZHJvcF9ldmVudHM7ICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtIERyb3AgRXZlbnRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2Ryb3BfZXZlbnRzOyAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBEcm9wIEV2ZW50cy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX29jdGV0czsgICAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBPY3RldHMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fb2N0ZXRzOyAgICAgICAgICAgICAgICAgICAvKio8IFVwc3RyZWFtIE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2ZyYW1lczsgICAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBGcmFtZXMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fZnJhbWVzOyAgICAgICAgICAgICAgICAgICAvKio8IFVwc3RyZWFtIEZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2Jyb2FkY2FzdF9mcmFtZXM7ICAgICAgIC8qKjwgRG93bnN0cmVhbSBCcm9hZGNhc3QgRnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2Jyb2FkY2FzdF9mcmFtZXM7ICAgICAgICAgLyoqPCBVcHN0cmVhbSBCcm9hZGNhc3QgRnJhbWVzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fbXVsdGljYXN0X2ZyYW1lczsgICAgICAgLyoqPCBEb3duc3RyZWFtIE11bHRpY2FzdCBGcmFtZXMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fbXVsdGljYXN0X2ZyYW1lczsgICAgICAgICAvKio8IFVwc3RyZWFtIE11bHRpY2FzdCBGcmFtZXMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9jcmNfZXJyb3JlZF9mcmFtZXM7ICAgICAvKio8IERvd25zdHJlYW0gQ1JDIEVycm9yZWQgRnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2NyY19lcnJvcmVkX2ZyYW1lczsgICAgICAgLyoqPCBVcHN0cmVhbSBDUkMgRXJyb3JlZCBGcmFtZXMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV91bmRlcnNpemVfZnJhbWVzOyAgICAgICAvKio8IERvd25zdHJlYW0gVW5kZXJzaXplIEZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV91bmRlcnNpemVfZnJhbWVzOyAgICAgICAgIC8qKjwgVXBzdHJlYW0gVW5kZXJzaXplIEZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX292ZXJzaXplX2ZyYW1lczsgICAgICAgIC8qKjwgRG93bnN0cmVhbSBPdmVyc2l6ZSBGcmFtZXMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fb3ZlcnNpemVfZnJhbWVzOyAgICAgICAgICAvKio8IFVwc3RyZWFtIE92ZXJzaXplIEZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2ZyYWdtZW50czsgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBGcmFnbWVudHMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fZnJhZ21lbnRzOyAgICAgICAgICAgICAgICAvKio8IFVwc3RyZWFtIEZyYWdtZW50cy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2phYmJlcnM7ICAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBKYWJiZXJzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2phYmJlcnM7ICAgICAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBKYWJiZXJzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZnJhbWVzNjRvY3RldHM7ICAgICAgICAgLyoqPCBEb3duc3RyZWFtIEZyYW1lcyA2NCBPY3RldHMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9mcmFtZXM2NXRvMTI3b2N0ZXRzOyAgICAvKio8IERvd25zdHJlYW0gRnJhbWVzIDY1IHRvIDEyNyBPY3RldHMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9mcmFtZXMxMjh0bzI1NW9jdGV0czsgICAvKio8IERvd25zdHJlYW0gRnJhbWVzIDEyOCB0byAyNTUgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZnJhbWVzMjU2dG81MTFvY3RldHM7ICAgLyoqPCBEb3duc3RyZWFtIEZyYW1lcyAyNTYgdG8gNTExIE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2ZyYW1lczUxMnRvMTAyM29jdGV0czsgIC8qKjwgRG93bnN0cmVhbSBGcmFtZXMgNTEyIHRvIDEwMjMgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZnJhbWVzMTAyNHRvMTUxOG9jdGV0czsgLyoqPCBEb3duc3RyZWFtIEZyYW1lcyAxMDI0IHRvIDE1MTggT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2ZyYW1lczY0b2N0ZXRzOyAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBGcmFtZXMgNjQgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2ZyYW1lczY1dG8xMjdvY3RldHM7ICAgICAgLyoqPCBVcHN0cmVhbSBGcmFtZXMgNjUgdG8gMTI3IE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV9mcmFtZXMxMjh0bzI1NW9jdGV0czsgICAgIC8qKjwgVXBzdHJlYW0gRnJhbWVzIDEyOCB0byAyNTUgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2ZyYW1lczI1NnRvNTExb2N0ZXRzOyAgICAgLyoqPCBVcHN0cmVhbSBGcmFtZXMgMjU2IHRvIDUxMSBPY3RldHMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fZnJhbWVzNTEydG8xMDIzb2N0ZXRzOyAgICAvKio8IFVwc3RyZWFtIEZyYW1lcyA1MTIgdG8gMTAyMyBPY3RldHMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fZnJhbWVzMTAyNHRvMTUxOG9jdGV0czsgICAvKio8IFVwc3RyZWFtIEZyYW1lcyAxMDI0IHRvIDE1MTggT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZGlzY2FyZHM7ICAgICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtIERpc2NhcmRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2Rpc2NhcmRzOyAgICAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBEaXNjYXJkcy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2Vycm9yczsgICAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBFcnJvcnMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fZXJyb3JzOyAgICAgICAgICAgICAgICAgICAvKio8IFVwc3RyZWFtIEVycm9ycy4gKi8KKyAgICB1aW50NjRfdCBzdGF0dXNfY2hhbmdlX3RpbWVzOyAgICAgICAgICAgICAgIC8qKjwgU3RhdHVzIENoYW5nZSBUaW1lcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGE7CisKKy8qKiBDVEMgVEZUUCBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZSBvcGNvZGU7ICAgIC8qKjwgT3Bjb2RlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZmlsZW5hbWVfY291bnQ7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZmlsZW5hbWUuICovCisgICAgICAgICAgICB1aW50OF90ICpmaWxlbmFtZTsgICAgICAgICAgICAgICAgICAvKio8IEZpbGVuYW1lLiAqLworICAgICAgICAgICAgdWludDMyX3QgbW9kZV9jb3VudDsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbW9kZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKm1vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTW9kZS4gKi8KKyAgICAgICAgfSB3cml0ZV9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBibG9ja19udW1iZXI7ICAgICAgICAgICAgICAvKio8IEJsb2NrIE51bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfY291bnQ7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGRhdGEuICovCisgICAgICAgICAgICB1aW50OF90ICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEuICovCisgICAgICAgIH0gZGF0YTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYmxvY2tfbnVtYmVyOyAgICAgICAgICAgICAgLyoqPCBCbG9jayBOdW1iZXIuICovCisgICAgICAgIH0gYWNrOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBjb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IENvZGUuICovCisgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlX2NvdW50OyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtZXNzYWdlLiAqLworICAgICAgICAgICAgdWludDhfdCAqbWVzc2FnZTsgICAgICAgICAgICAgICAgICAgLyoqPCBNZXNzYWdlLiAqLworICAgICAgICB9IGVycm9yOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2U7CisKKy8qKiBDVEMgUy9XIE1pcnJvciBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUgb3Bjb2RlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3Bjb2RlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnIGZsYWc7ICAvKio8IEZsYWcuICovCisgICAgICAgIH0gYWN0aXZhdGVfaW1hZ2VfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2sgYWNrOyAgICAgICAgICAgICAgICAgICAvKio8IEFjay4gKi8KKyAgICAgICAgfSBhY3RpdmF0ZV9pbWFnZV9yZXNwb25zZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZTsKKworLyoqIENUQyBTb2Z0d2FyZSBEb3dubG9hZCBQcm92IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlIGRhdGFfdHlwZTsgIC8qKjwgRGF0YSBUeXBlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGlkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUSUQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSB0ZnRwOyAvKio8IFRGVFAuICovCisgICAgICAgIH0gdGZ0cDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGlkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUSUQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZSBmaWxlX2NoZWNrOyAvKio8IEZpbGUgQ2hlY2suICovCisgICAgICAgIH0gZGF0YV9jaGVja2luZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGlkOyAgIC8qKjwgVElELiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlIHN3bWlycm9yOyAvKio8IFMvVyBNaXJyb3IuICovCisgICAgICAgIH0gc3dtaXJyb3Jpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpZDsgICAvKio8IFRJRC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2UgY29tbWl0X2ltYWdlOyAvKio8IENvbW1pdCBJbWFnZS4gKi8KKyAgICAgICAgfSBjb21taXRfaW1hZ2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZTsKKworLyoqIEtUIFF1ZXVlIERyb3AgQ291bnRlci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlcgoreworICAgIHVpbnQzMl90IHR4Ynl0ZXM7ICAgICAgICAgICAvKio8IFRYIEJ5dGVzLiAqLworICAgIHVpbnQzMl90IGRyb3BwZWRfZnJhbWVzOyAgICAvKio8IERyb3BwZWQgRnJhbWVzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXI7CisKKy8qKiBLVCBBdHRyaWJ1dGUgVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgbGVhZjsgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBpc19hY3RpdmF0ZWQ7ICAgIC8qKjwgV2hldGhlciBvciBub3Qgc2hhcGluZyBpcyBlbmFibGVkICovCisgICAgICAgICAgICB1aW50MjRfdCByYXRlOyAgICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtIHNoYXBpbmcgcmF0ZSBvZiB0aGUgcG9ydCBpbiBLYnBzICovCisgICAgICAgIH0gcG9ydF9kb3duc3RyZWFtX3JhdGVfc2hhcGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBpc19hY3RpdmF0ZWQ7ICAgIC8qKjwgV2hldGhlciBvciBub3QgdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbGltaXQ7ICAgICAgICAgICAgICAvKio8IE1heCBudW1iZXIgb2YgbGVhcm5lZCBNQUNzICovCisgICAgICAgIH0gb251X21hY19saW1pdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBibG9jazsgICAgICAgICAgIC8qKjwgV2hldGhlciBvciBub3QgdG8gYmxvY2sgdXNlciB0cmFmZmljICovCisgICAgICAgIH0gYmxvY2tfdW5ibG9ja19vbnVfdHJhZmZpYzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgb3B0aWNzX21vZHVsZV90ZW1wZXJhdHVyZTsgICAgICAgICAgICAgICAgICAgICAvKio8IE9wdGljcyBNb2R1bGUgVGVtcGVyYXR1cmUuICovCisgICAgICAgICAgICB1aW50MTZfdCB0eG9wdGljc19wb3dlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVFggT3B0aWNzIFBvd2VyLiAqLworICAgICAgICAgICAgdWludDE2X3QgcnhvcHRpY3NfcG93ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJYIE9wdGljcyBQb3dlci4gKi8KKyAgICAgICAgfSBvbnVfZGlhZ25vc3RpY3M7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fcXVldWVzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gUXVldWVzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXIgKnVwc3RyZWFtX3F1ZXVlczsgIC8qKjwgVXBzdHJlYW0gUXVldWVzLiAqLworICAgICAgICB9IG9udV9xdWV1ZV9kcm9wX2NvdW50ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGNvdW50ZXJfYml0X21hc2s7ICAvKio8IENvdW50ZXIgQml0IE1hc2suICovCisgICAgICAgICAgICB1aW50NjRfdCB0eGZyYW1lczsgICAgICAgICAgLyoqPCBUWCBGcmFtZXMuICovCisgICAgICAgICAgICB1aW50NjRfdCB0eGJ5dGVzOyAgICAgICAgICAgLyoqPCBUWCBCeXRlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHR4bXVsdGljYXN0OyAgICAgICAvKio8IFRYIE11bHRpY2FzdC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHR4YnJvYWRjYXN0OyAgICAgICAvKio8IFRYIEJyb2FkY2FzdC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHR4ZHJvcHBlZDsgICAgICAgICAvKio8IFRYIERyb3BwZWQuICovCisgICAgICAgICAgICB1aW50NjRfdCByeGZyYW1lczsgICAgICAgICAgLyoqPCBSWCBGcmFtZXMuICovCisgICAgICAgICAgICB1aW50NjRfdCByeGJ5dGVzOyAgICAgICAgICAgLyoqPCBSWCBCeXRlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4bXVsdGljYXN0OyAgICAgICAvKio8IFJYIE11bHRpY2FzdC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4YnJvYWRjYXN0OyAgICAgICAvKio8IFJYIEJyb2FkY2FzdC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4b3ZlcnNpemVkOyAgICAgICAvKio8IFJYIE92ZXJzaXplZC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4dW5kZXJzaXplZDsgICAgICAvKio8IFJYIFVuZGVyc2l6ZWQuICovCisgICAgICAgICAgICB1aW50NjRfdCByeGNyY19lcnJvcnM7ICAgICAgLyoqPCBSWCBDUkMgRXJyb3JzLiAqLworICAgICAgICB9IGV0aGVybmV0X3BvcnRfY291bnRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGVkOyAgICAgICAgIC8qKjwgV2hldGhlciBvciBub3QgUlNUUCBpcyBlbmFibGVkICovCisgICAgICAgIH0gZXRoZXJuZXRfcG9ydF9yc3RwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZWQ7ICAgICAgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCBsb29wIGRldGVjdCBpcyBlbmFibGVkICovCisgICAgICAgICAgICB1aW50OF90IGludGVydmFsOyAgICAgICAgICAgLyoqPCBUaGUgc2VuZGluZyBpbnRlcnZhbCBvZiBoZWxsbyBwYWNrZXQgaW4gc2Vjb25kcyAqLworICAgICAgICAgICAgdWludDhfdCBibG9ja190aW1lOyAgICAgICAgIC8qKjwgVGhlIGJsb2NrIHRpbWUgb2YgdGhlIGxvb3BlZCBwb3J0IGluIHNlY29uZHMgKDAgZm9yIHBlcm1hbmVudCkgKi8KKyAgICAgICAgfSBsb29wX2RldGVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgY291bnRlcl9iaXRfbWFzazsgIC8qKjwgQ291bnRlciBCaXQgTWFzay4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4aGVjX2Vycm9yczsgICAgICAvKio8IFJYIEhFQyBFcnJvcnMuICovCisgICAgICAgICAgICB1aW50NjRfdCByeHJlZ2lzdGVyOyAgICAgICAgLyoqPCBSWCBSZWdpc3Rlci4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHR4cmVnaXN0ZXJfYWNrOyAgICAvKio8IFRYIFJlZ2lzdGVyIEFDSy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4Z2F0ZV9mcmFtZXM7ICAgICAvKio8IFJYIEdhdGUgRnJhbWVzLiAqLworICAgICAgICAgICAgdWludDY0X3QgdHhyZXBvcnRfZnJhbWVzOyAgIC8qKjwgVFggUmVwb3J0IEZyYW1lcy4gKi8KKyAgICAgICAgfSBvbnVfbXBjcF9jb3VudGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZWQ7ICAgICAgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCBvcHRpY2FsIHBvd2VyIGFsYXJtIGlzIGVuYWJsZWQgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzIGFsYXJtX3N0YXR1czsgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgICAgICB9IG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IG1hY3NfY291bnQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gTWFjcyAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hY3M7ICAgIC8qKjwgTWFjcy4gKi8KKyAgICAgICAgfSBzdGF0aWNfbWFjOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2U7CisKKy8qKiBLVCBBY3Rpb24gVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gbGVhZjsgLyoqPCBMZWFmLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IHJlc3RvcmVfb251OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsgICAgICAgICAgICAgLyoqPCBUaGUgbGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCisgICAgICAgICAgICBiY21vc19ib29sIGlzX3Bvd2VyX29mZjsgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCB0aGUgcG93ZXIgc2hvdWxkIGJlIG9mZiAqLworICAgICAgICAgICAgdWludDhfdCBkdXJhdGlvbjsgICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aW1lIHRvIHBvd2VyIG9mZiBmb3IgaW4gc2Vjb25kcyAoMHhGRiBmb3IgcGVybWFuZW50KSAqLworICAgICAgICB9IHR4cG93ZXJfb2ZmOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2U7CisKKy8qKiBDVEMgVmFyIENvbnRhaW5lciBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCBicmFuY2g7ICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsgICAgICAgICAgICAgLyoqPCBMZW5ndGguICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIGF0dHJpYnV0ZTsgICAgIC8qKjwgQXR0cmlidXRlLiAqLworICAgICAgICB9IGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWUgYWN0aW9uOyAgICAgICAgICAgICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgfSBhY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugb2JqZWN0OyAgLyoqPCBPYmplY3QuICovCisgICAgICAgIH0gb2xkX21hbmFnZW1lbnRfb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugb2JqZWN0OyAgICAgIC8qKjwgT2JqZWN0LiAqLworICAgICAgICB9IG1hbmFnZW1lbnRfb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSBhdHRyaWJ1dGU7IC8qKjwgQXR0cmlidXRlLiAqLworICAgICAgICB9IGV4dF9hdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlIGF0dHJpYnV0ZTsgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgICAgIH0gZXh0X2FjdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2UgYXR0cmlidXRlOyAgICAgICAvKio8IEF0dHJpYnV0ZS4gKi8KKyAgICAgICAgfSBrdGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2UgYXR0cmlidXRlOyAgICAgICAgICAvKio8IEF0dHJpYnV0ZS4gKi8KKyAgICAgICAgfSBrdGFjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlOworCisvKiogQ1RDIFZhciBEZXNjcmlwdG9yLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcgoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIGJyYW5jaDsgICAgICAgICAgICAgICAgICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGFjdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZSB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9sZF9tYW5hZ2VtZW50X29iamVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlIHZhbHVlOyAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hbmFnZW1lbnRfb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBleHRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbiBsZWFmOyAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBleHRfYWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBrdGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gbGVhZjsgICAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0ga3RhY3Rpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yOworCisvKiogS1QgT05VIEV2ZW50IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlIHR5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50IGV2ZW50OyAgICAgICAgICAvKio8IEV2ZW50LiAqLworICAgICAgICB9IGxvb3BfZGV0ZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50IGV2ZW50OyAgLyoqPCBFdmVudC4gKi8KKyAgICAgICAgfSBvcHRpY2FsX3Bvd2VyX2FsYXJtOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2U7CisKKy8qKiBDVEMgVmVuZG9yIEV4dGVuZGVkIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGUgb3A7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3AuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yICp2YXJzOyAgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBnZXRfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgKnZhcnM7ICAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IGdldF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzOyAgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBzZXRfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzOyAvKio8IFZhcnMuICovCisgICAgICAgIH0gc2V0X3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbWVzc2FnZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSAqbWVzc2FnZXM7ICAvKio8IE1lc3NhZ2VzLiAqLworICAgICAgICB9IHNvZnR3YXJlX2Rvd25sb2FkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGUgY29kZTsgICAgICAgICAgICAgICAgICAgICAvKio8IENvZGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBhdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50OyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBBdXRoZW50aWNhdGlvbiBEYXRhICovCisgICAgICAgICAgICB1aW50OF90ICphdXRoZW50aWNhdGlvbl9kYXRhOyAgICAgICAgICAgICAgICAgICAvKio8IEF1dGhlbnRpY2F0aW9uIERhdGEuICovCisgICAgICAgIH0gb251X2F1dGhlbnRpY2F0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZSB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGNodXJuaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgdmFsdWU7ICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGRiYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZXZlbnRzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBldmVudHMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSAqZXZlbnRzOyAgIC8qKjwgRXZlbnRzLiAqLworICAgICAgICB9IGt0b251X2V2ZW50OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgZXZlbnRzOyAgICAgIC8qKjwgRXZlbnRzLiAqLworICAgICAgICB9IGV2ZW50OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZTsKKworLyoqIERhc2FuIENsYXNzaWZpZXIgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kIGNvbW1hbmQ7ICAgLyoqPCBDb21tYW5kLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb24gZGlyZWN0aW9uOyAgICAgICAgICAvKio8IERpcmVjdGlvbi4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGQgZmllbGQ7ICAgLyoqPCBGaWVsZC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb24gYWN0aW9uOyAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgfSBhZGRfZmlsdGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkIGZpZWxkOyAgIC8qKjwgRmllbGQuICovCisgICAgICAgICAgICB1aW50MTZfdCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uIGFjdGlvbjsgLyoqPCBBY3Rpb24uICovCisgICAgICAgIH0gcmVtb3ZlX2ZpbHRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlIHByaV90eXBlOyAgICAvKio8IFByaSBUeXBlLiAqLworICAgICAgICAgICAgdWludDhfdCBpbl9wcmlvcml0eTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluIFByaW9yaXR5LiAqLworICAgICAgICAgICAgdWludDhfdCBvdXRfcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE91dCBQcmlvcml0eS4gKi8KKyAgICAgICAgfSBxdWV1ZV9tYXA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGQgZmllbGQ7ICAgLyoqPCBGaWVsZC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcHJpX3ZsYW47ICAgLyoqPCBQcmkgVkxBTi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcHJpX3F1ZXVlOyAgLyoqPCBUaGUgcXVldWUgaWQgdGhlIGZyYW1lIHdpbGwgYmUgdG8gKi8KKyAgICAgICAgfSBhZGRfcHJpb3JpdHlfZm9yX3ZsYW47CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlOworCisvKiogRGFzYW4gUG9ydC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0Cit7CisgICAgdWludDE2X3QgcG9ydF9udW1iZXI7ICAgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBOdW1iZXIuICovCisgICAgYmNtb3NfYm9vbCBlbmFibGVkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlZC4gKi8KKyAgICBiY21vc19ib29sIGF1dG9fbmVnb3RpYXRpb25fZW5hYmxlZDsgICAgLyoqPCBBdXRvLU5lZ290aWF0aW9uIEVuYWJsZWQuICovCisgICAgdWludDE2X3Qgc3BlZWQ7ICAgICAgICAgICAgICAgICAvKio8IFNwZWVkLiAqLworICAgIHVpbnQ4X3QgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICBiY21vc19ib29sIGlzX2Z1bGxfZHVwbGV4OyAgICAgIC8qKjwgSXMgRnVsbCBEdXBsZXguICovCisgICAgdWludDE2X3QgbGVhcm5pbmdfdGFibGVfc2l6ZTsgICAvKio8IExlYXJuaW5nIFRhYmxlIFNpemUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0OworCisvKiogRGFzYW4gVkxBTi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuCit7CisgICAgdWludDhfdCByZXNlcnZlZDsgICAgICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICBiY21vc19ib29sIGlzX3RhZ2dlZDsgICAvKio8IElzIFRhZ2dlZC4gKi8KKyAgICB1aW50MTZfdCB2bGFuX2lkOyAgICAgICAvKio8IFZMQU4gSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuOworCisvKiogRGFzYW4gVkxBTiBQb3J0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydAoreworICAgIHVpbnQxNl90IHBvcnRfbnVtYmVyOyAgICAgICAgICAgICAgIC8qKjwgUG9ydCBOdW1iZXIuICovCisgICAgdWludDE2X3QgdmxhbnNfY291bnQ7ICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVkxBTnMgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbiAqdmxhbnM7ICAvKio8IFZMQU5zLiAqLworICAgIHVpbnQxNl90IHB2aWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUFZJRC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydDsKKworLyoqIERhc2FuIFBvcnQgQ29uZmlnLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnCit7CisgICAgdWludDhfdCBwb3J0X251bWJlcjsgICAgICAgIC8qKjwgUG9ydCBOdW1iZXIuICovCisgICAgYmNtb3NfYm9vbCBpc19saW5rZWQ7ICAgICAgIC8qKjwgSXMgTGlua2VkLiAqLworICAgIHVpbnQ4X3Qgc3BlZWQ7ICAgICAgICAgICAgICAvKio8IFNwZWVkIGluIE1icHMgKi8KKyAgICBiY21vc19ib29sIGlzX2Z1bGxfZHVwbGV4OyAgLyoqPCBJcyBGdWxsIER1cGxleC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnOworCisvKiogRGFzYW4gUG9ydCBTdGF0cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzCit7CisgICAgdWludDY0X3QgaW5fZ29vZF9vY3RldHM7ICAgIC8qKjwgSW4gR29vZCBPY3RldHMuICovCisgICAgdWludDMyX3QgaW5fZ29vZF9mcmFtZXM7ICAgIC8qKjwgSW4gR29vZCBGcmFtZXMuICovCisgICAgdWludDMyX3QgaW5fYnJvYWRjYXN0OyAgICAgIC8qKjwgSW4gQnJvYWRjYXN0LiAqLworICAgIHVpbnQzMl90IGluX211bHRpY2FzdDsgICAgICAvKio8IEluIE11bHRpY2FzdC4gKi8KKyAgICB1aW50NjRfdCBvdXRfZ29vZF9vY3RldHM7ICAgLyoqPCBPdXQgR29vZCBPY3RldHMuICovCisgICAgdWludDMyX3Qgb3V0X2dvb2RfZnJhbWVzOyAgIC8qKjwgT3V0IEdvb2QgRnJhbWVzLiAqLworICAgIHVpbnQzMl90IG91dF9icm9hZGNhc3Q7ICAgICAvKio8IE91dCBCcm9hZGNhc3QuICovCisgICAgdWludDMyX3Qgb3V0X211bHRpY2FzdDsgICAgIC8qKjwgT3V0IE11bHRpY2FzdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHM7CisKKy8qKiBEYXNhbiBQb3J0IEVycm9yIFN0YXRzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMKK3sKKyAgICB1aW50MzJfdCB1bmRlcnNpemVkOyAgICAgICAgICAgIC8qKjwgVW5kZXJzaXplZC4gKi8KKyAgICB1aW50MzJfdCBvdmVyc2l6ZWQ7ICAgICAgICAgICAgIC8qKjwgT3ZlcnNpemVkLiAqLworICAgIHVpbnQzMl90IGphYmJlcjsgICAgICAgICAgICAgICAgLyoqPCBKYWJiZXIuICovCisgICAgdWludDMyX3QgaW5fbWFjX3JlY2VpdmVfZXJyb3I7ICAvKio8IEluIE1BQyBSZWNlaXZlIEVycm9yLiAqLworICAgIHVpbnQzMl90IGluX2Zjc19lcnJvcjsgICAgICAgICAgLyoqPCBJbiBGQ1MgRXJyb3IuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzOworCisvKiogRGFzYW4gU3RhdHMgU2VxIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUgdHlwZTsgICAgICAgICAgICAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzIHBvcnQwOyAgICAgICAgIC8qKjwgUG9ydCAwLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHMgcG9ydDE7ICAgICAgICAgLyoqPCBQb3J0IDEuICovCisgICAgICAgIH0gcG9ydDBhbmQxOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0cyBwb3J0MjsgICAgICAgICAvKio8IFBvcnQgMi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzIHBvcnQzOyAgICAgICAgIC8qKjwgUG9ydCAzLiAqLworICAgICAgICB9IHBvcnQyYW5kMzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgcG9ydDA7ICAgLyoqPCBQb3J0IDAuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0cyBwb3J0MTsgICAvKio8IFBvcnQgMS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzIHBvcnQyOyAgIC8qKjwgUG9ydCAyLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgcG9ydDM7ICAgLyoqPCBQb3J0IDMuICovCisgICAgICAgIH0gZXJyb3JzOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlOworCisvKiogRGFzYW4gU3RhdCBWYWx1ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWQgaWQ7ICAgLyoqPCBJRC4gKi8KKyAgICB1aW50MzJfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZTsKKworLyoqIERhc2FuIENvbmZpZyBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZSBvcGNvZGU7ICAgICAgICAgICAgLyoqPCBPcGNvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBwb3J0c19jb3VudDsgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUG9ydHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0ICpwb3J0czsgICAgICAvKio8IFBvcnRzLiAqLworICAgICAgICB9IHBvcnRfY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBwb3J0c19jb3VudDsgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUG9ydHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgKnBvcnRzOyAvKio8IFBvcnRzLiAqLworICAgICAgICB9IHNldF92bGFuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsbGlkOyAgICAgICAgICAvKio8IExMSUQuICovCisgICAgICAgICAgICB1aW50NjRfdCBvcDsgICAgICAgICAgICAvKio8IE9wLiAqLworICAgICAgICAgICAgdWludDE2X3QgcHJvZmlsZV9vcDsgICAgLyoqPCBQcm9maWxlIE9wLiAqLworICAgICAgICAgICAgdWludDE2X3QgdmFsdWVfc2l6ZTsgICAgLyoqPCBWYWx1ZSBTaXplLiAqLworICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUG9ydHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyAqcG9ydHM7ICAgLyoqPCBQb3J0cy4gKi8KKyAgICAgICAgfSBnZXRfb251X2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZDsgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBtYXhfYWdlOyAgICAgICAgICAgLyoqPCBUaGUgYW1vdW50IG9mIHRpbWUgaW4gc2Vjb25kcyB0aGF0IHRoZSBicmlkZ2Ugc3BlbmRzIGluIHRoZSBCbG9ja2luZyBzdGF0ZSB3aXRob3V0IHJlY2VpdmluZyBhIEJQRFUgYmVmb3JlIGl0IHRyYW5zaXRpb25zIHRvIHRoZSBMaXN0ZW5pbmcgc3RhdGUgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGZvcndhcmRfZGVsYXk7ICAgICAvKio8IFRoZSBhbW91bnQgb2YgdGltZSBpbiBzZWNvbmRzIHRoZSBicmlkZ2Ugc3BlbmRzIGluIHRoZSBMaXN0ZW5pbmcgYW5kIExlYXJuaW5nIHN0YXRlcyBiZWZvcmUgZm9yd2FyZGluZyBwYWNrZXRzICovCisgICAgICAgICAgICB1aW50MTZfdCBoZWxsb190aW1lOyAgICAgICAgLyoqPCBUaGUgYW1vdW50IG9mIHRpbWUgaW4gc2Vjb25kcyB0aGUgUm9vdCBCcmlkZ2Ugd2FpdHMgYmV0d2VlbiBzZW5kaW5nIEJQRFVzICovCisgICAgICAgIH0gc2V0X3N0cDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZW5hYmxlX3RpbWU7ICAgICAgIC8qKjwgVGltZSBpbiBzZWNvbmRzIHRvIHJlLWVuYWJsZSB0aGUgVFggKi8KKyAgICAgICAgfSBzZXRfdHhwb3dlcl9vZmY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGxsaWRfYml0bWFwOyAgICAgICAvKio8IExMSUQgQml0bWFwLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlLiAqLworICAgICAgICAgICAgdWludDhfdCBibG9ja19jYXA7ICAgICAgICAgIC8qKjwgQmxvY2sgQ2FwLiAqLworICAgICAgICAgICAgdWludDhfdCBzZW5kX2NhcDsgICAgICAgICAgIC8qKjwgU2VuZCBDYXAuICovCisgICAgICAgICAgICB1aW50OF90IG9sdF9tYWNfY2FwOyAgICAgICAgLyoqPCBPTFQgTUFDIENhcC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHNlbmRfcGVyaW9kOyAgICAgICAvKio8IEhlbGxvIHRpbWUgaW4gUlNUUCB0ZXJtcyAqLworICAgICAgICAgICAgdWludDMyX3QgYmxvY2tfdGltZTsgICAgICAgIC8qKjwgVGltZSB0byBkaXNhYmxlIHBvcnQgaWYgbG9vcGVkICovCisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBvbHRfbWFjOyAgLyoqPCBPTFQgTUFDLiAqLworICAgICAgICB9IHNldF9sb29wX2RldGVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgbGxpZF9iaXRtYXA7ICAgICAgIC8qKjwgTExJRCBCaXRtYXAuICovCisgICAgICAgIH0gc2V0X2xvb3BfZGV0ZWN0X3VuYmxvY2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2UgY2xhc3NpZmllcjsgICAvKio8IENsYXNzaWZpZXIuICovCisgICAgICAgIH0gY2xhc3NpZmllcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGxpZDsgICAgICAgICAgICAgIC8qKjwgTExJRC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IG9wOyAgICAgICAgICAgICAgICAvKio8IE9wLiAqLworICAgICAgICAgICAgdWludDE2X3QgaW5mb19jb3VudDsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIEluZm8gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmluZm87ICAgICAgICAgICAgICAvKio8IEluZm8uICovCisgICAgICAgIH0gb251X3ZlcnNpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxsaWQ7ICAgICAgICAgICAgICAvKio8IExMSUQuICovCisgICAgICAgICAgICB1aW50OF90IGJvb3RfbW9kZTsgICAgICAgICAgLyoqPCBCb290IE1vZGUuICovCisgICAgICAgICAgICB1aW50OF90IGFjdGl2ZTsgICAgICAgICAgICAgLyoqPCBBY3RpdmUuICovCisgICAgICAgICAgICB1aW50OF90IGltYWdlMXN0cmluZ1sxNl07ICAgLyoqPCBJbWFnZSAxIFN0cmluZy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaW1hZ2Uyc3RyaW5nWzE2XTsgICAvKio8IEltYWdlIDIgU3RyaW5nLiAqLworICAgICAgICB9IG9udV9mbGFzaF9maXJtd2FyZV92ZXJzaW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsbGlkOyAgICAgICAgICAgICAgLyoqPCBMTElELiAqLworICAgICAgICAgICAgdWludDhfdCBhY3RpdmU7ICAgICAgICAgICAgIC8qKjwgQWN0aXZlLiAqLworICAgICAgICAgICAgdWludDY0X3QgYnVpbGRfdGltZTsgICAgICAgIC8qKjwgQnVpbGQgVGltZS4gKi8KKyAgICAgICAgfSBvbnVfYWN0aXZlX2ltYWdlX3RpbWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxsaWQ7ICAgICAgICAgICAgICAvKio8IExMSUQuICovCisgICAgICAgICAgICB1aW50NjRfdCBvcDsgICAgICAgICAgICAgICAgLyoqPCBPcC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHNlcXVlbmNlc19jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBzZXF1ZW5jZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UgKnNlcXVlbmNlczsgICAgLyoqPCBTZXF1ZW5jZXMuICovCisgICAgICAgIH0gb251X3N0YXRpc3RpYzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGxpZF9iaXRtYXA7ICAgICAgIC8qKjwgTExJRCBCaXRtYXAuICovCisgICAgICAgICAgICB1aW50OF90IHN0YXRpc3RpY3NfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gU3RhdGlzdGljcyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUgKnN0YXRpc3RpY3M7ICAgLyoqPCBTdGF0aXN0aWNzLiAqLworICAgICAgICB9IG9udV9zdGF0aXN0aWNfZ2V0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZTsgIC8qKjwgRW5hYmxlLiAqLworICAgICAgICAgICAgdWludDhfdCBtYXhfZ3JvdXBzOyAvKio8IE1heCBHcm91cHMuICovCisgICAgICAgIH0gb251X2lnbXBfc2V0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZTsgIC8qKjwgRW5hYmxlLiAqLworICAgICAgICB9IG9udV9wb3J0X2lnbXBfZmlsdGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkOyAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZTsgIC8qKjwgRW5hYmxlLiAqLworICAgICAgICAgICAgdWludDMyX3QgcmF0ZTsgICAgICAvKio8IERhdGEgcmF0ZSBpbiBrYnBzICovCisgICAgICAgIH0gb251X3NoYXBpbmc7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2U7CisKKy8qKiBEaXN0aW5ndWlzaGVkIE5hbWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lCit7CisgICAgdWludDhfdCBsZW5ndGg7IC8qKjwgTGVuZ3RoLiAqLworICAgIHVpbnQ4X3QgKm5hbWU7ICAvKio8IE5hbWUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWU7CisKKy8qKiBEaXN0aW5ndWlzaGVkIE5hbWUgTGlzdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdAoreworICAgIHVpbnQzMl90IG5hbWVzX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG5hbWVzLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgKm5hbWVzOyAgLyoqPCBOYW1lcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0OworCisvKiogQSBsaXN0IG9mIE1BQyBhZGRyZXNzZXMgaW4gRFBvRSBPQU0gZm9ybWF0IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUKK3sKKyAgICB1aW50MzJfdCBtYWNfYWRkcmVzc19jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG1hY19hZGRyZXNzLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzICptYWNfYWRkcmVzczsgLyoqPCBMaXN0IG9mIE1BQyBhZGRyZXNzZXMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlOworCisvKiogRFBvRSBBY3Rpb24gVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24gbGVhZjsgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSBtYWNfYWRkZXNzOyAgICAgICAgICAvKio8IE1BQyBBZGRlc3MuICovCisgICAgICAgIH0gYWRkX2R5bl9tYWNfYWRkcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIG1hY19hZGRyZXNzOyAgICAgICAgIC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgICAgIH0gZGVsX2R5bl9tYWNfYWRkcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIG1hY19hZGRyZXNzOyAgICAgICAgIC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgICAgIH0gYWRkX3N0YXRpY19tYWNfYWRkcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIG1hY19hZGRyZXNzOyAgICAgICAgIC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgICAgIH0gZGVsX3N0YXRpY19tYWNfYWRkcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb24gbG9jYXRpb247ICAgIC8qKjwgTG9jYXRpb24uICovCisgICAgICAgIH0gbG9vcGJhY2tfZW5hYmxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbiBsb2NhdGlvbjsgICAgLyoqPCBMb2NhdGlvbi4gKi8KKyAgICAgICAgfSBsb29wYmFja19kaXNhYmxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBkaXNhYmxlX3RpbWU7ICAvKio8IFVuaXRzOiBzZWNvbmRzICovCisgICAgICAgIH0gbGFzZXJfdHhfcG93ZXJfb2ZmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbiBsbGlkX2FjdGlvbjsgICAvKio8IExMSUQgQWN0aW9uLiAqLworICAgICAgICAgICAgdWludDE2X3QgbGxpZF92YWx1ZTsgICAgLyoqPCBMTElEIFZhbHVlLiAqLworICAgICAgICB9IGNvbmZpZ3VyZV9tY2FzdF9sbGlkOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2U7CisKKy8qKiBEUG9FIFF1ZXVlIFNldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldAoreworICAgIHVpbnQ4X3QgcXVldWVfY291bnQ7ICAgIC8qKjwgUXVldWUgQ291bnQuICovCisgICAgdWludDhfdCAqcXVldWVfc2l6ZXM7ICAgLyoqPCBRdWV1ZSBTaXplcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0OworCisvKiogRFBvRSBRdWV1ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgdHlwZTsgIC8qKjwgVHlwZS4gKi8KKyAgICB1aW50OF90IGluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbnN0YW5jZS4gKi8KKyAgICB1aW50OF90IHF1ZXVlOyAgLyoqPCBRdWV1ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWU7CisKKy8qKiBEUG9FIE9iamVjdCBDb250ZXh0IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGU7ICAgLyoqPCBPYmplY3QgVHlwZS4gKi8KKyAgICB1aW50OF90IGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBpbnN0YW5jZTsgICAgICAgLyoqPCBJbnN0YW5jZS4gKi8KKyAgICAgICAgfSBvbnU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvbl9jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnBvbjsgICAgICAgICAgIC8qKjwgUE9OLiAqLworICAgICAgICB9IG5ldHdvcmtfcG9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBsaW5rX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBsaW5rLiAqLworICAgICAgICAgICAgdWludDhfdCAqbGluazsgICAgICAgICAgLyoqPCBMaW5rLiAqLworICAgICAgICB9IGxpbms7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBvcnQuICovCisgICAgICAgICAgICB1aW50OF90ICpwb3J0OyAgICAgICAgICAvKio8IFBvcnQuICovCisgICAgICAgIH0gdXNlcl9wb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZSBxdWV1ZTsgICAvKio8IFF1ZXVlLiAqLworICAgICAgICB9IHF1ZXVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBtY2FzdF9sbGlkOyAgICAgICAgICAgICAgICAvKio8IE1jYXN0IExMSUQuICovCisgICAgICAgIH0gbWNhc3RfbGluazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgYnJpZGdlX2NvdW50OyAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYnJpZGdlLiAqLworICAgICAgICAgICAgdWludDhfdCAqYnJpZGdlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBCcmlkZ2UuICovCisgICAgICAgIH0gYnJpZGdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwb3J0X2NvdW50OyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwb3J0LiAqLworICAgICAgICAgICAgdWludDhfdCAqcG9ydDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQb3J0LiAqLworICAgICAgICB9IGJyaWRnZV9wb3J0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZTsKKworLyoqIERQb0UgVmFyIERlc2NyaXB0b3IuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcgoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaCBicmFuY2g7ICAgICAgICAgICAgICAgICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBzdGFuZGFyZF9hdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IHN0YW5kYXJkX2FjdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZSBvYmplY3RfY29udGV4dDsgICAgLyoqPCBPYmplY3QgQ29udGV4dC4gKi8KKyAgICAgICAgfSBvYmplY3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBleHRlbmRlZF9hdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBleHRlbmRlZF9hY3Rpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcjsKKworLyoqIERQb0UgU3RhdGlzdGljIFRocmVzaG9sZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciBzdGF0aXN0aWM7ICAvKio8IFN0YXRpc3RpYy4gKi8KKyAgICB1aW50MzJfdCByaXNpbmdfdGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFRocmVzaG9sZCBhdCB3aGljaCB0byBzZXQgYWxhcm0gKDAgdG8gZGlzYWJsZSkgKi8KKyAgICB1aW50MzJfdCBmYWxsaW5nX3RocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgICAvKio8IFRocmVzaG9sZCBhdCB3aGljaCB0byBjbGVhciBhbGFybSAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkOworCisvKiogRFBvRSBGaWVsZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZSBjb2RlOyAgIC8qKjwgQ29kZS4gKi8KKyAgICB1aW50OF90IGluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbnN0YW5jZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQ7CisKKy8qKiBEUG9FIFJ1bGUgUmVzdWx0IEZpZWxkIFYyLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjIKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCBmaWVsZDsgICAvKio8IEZpZWxkLiAqLworICAgIHVpbnQ4X3QgbXNiX21hc2s7ICAgICAgICAgICAgICAgICAgIC8qKjwgTVNCIE1hc2suICovCisgICAgdWludDhfdCBsc2JfbWFzazsgICAgICAgICAgICAgICAgICAgLyoqPCBMU0IgTWFzay4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjI7CisKKy8qKiBEUG9FIFJ1bGUgUmVzdWx0IEZpZWxkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCBmaWVsZDsgICAvKio8IEZpZWxkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZDsKKworLyoqIEEgc2luZ2xlIHJlc3VsdCBvZiB0aGUgcnVsZSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQgcmVzdWx0OyAgICAgICAgIC8qKjwgUmVzdWx0IG9mIHRoZSBydWxlICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZSBxdWV1ZTsgICAvKio8IFRhcmdldCBxdWV1ZSAqLworICAgICAgICB9IHF1ZXVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92MiBmaWVsZDsgICAgLyoqPCBGaWVsZCB0byBzZXQgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhbHVlLiAqLworICAgICAgICAgICAgdWludDhfdCAqdmFsdWU7ICAgICAgICAgLyoqPCBWYWx1ZSB0byBzZXQgKi8KKyAgICAgICAgfSBzZXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyIGZpZWxkOyAgICAvKio8IEZpZWxkLiAqLworICAgICAgICB9IGNvcHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkIGZpZWxkOyAgICAgICAvKio8IEZpZWxkLiAqLworICAgICAgICB9CisgICAgICAgIGRlbGV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQgZmllbGQ7ICAgICAgIC8qKjwgRmllbGQuICovCisgICAgICAgIH0gaW5zZXJ0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCBmaWVsZDsgICAgICAgLyoqPCBGaWVsZC4gKi8KKyAgICAgICAgfSByZXBsYWNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCBmaWVsZDsgICAgICAgLyoqPCBGaWVsZC4gKi8KKyAgICAgICAgfSBjbGVhcl9kZWxldGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkIGZpZWxkOyAgICAgICAvKio8IEZpZWxkLiAqLworICAgICAgICB9IGNsZWFyX2luc2VydDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0OworCisvKiogUGFydCBvZiBhIERQb0UgT0FNIHJ1bGUgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlIHN1YnR5cGU7ICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgU3VidHlwZSBvZiB0aGlzIHBpZWNlIG9mIHRoZSBydWxlICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHByZWNlZGVuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUHJlY2VkZW5jZSBvZiB0aGUgcnVsZSAqLworICAgICAgICB9IGhlYWRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQgZmllbGRfY29kZTsgICAgICAvKio8IFRoZSBmaWVsZCB0byBtYXRjaCAqLworICAgICAgICAgICAgdWludDhfdCBtc2JfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExlZnQgbWFzayAqLworICAgICAgICAgICAgdWludDhfdCBsc2JfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJpZ2h0IG1hc2sgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yIG9wZXJhdG9yOyAgICAgLyoqPCBNYXRjaCBvcGVyYXRpb24gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWF0Y2hfdmFsdWVfbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBCeXRlcyBpbiBtYXRjaCB2YWx1ZSAqLworICAgICAgICAgICAgdWludDhfdCAqbWF0Y2hfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlIHRvIG1hdGNoICovCisgICAgICAgIH0gY2xhdXNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCByZXN1bHQ7ICAgIC8qKjwgUmVzdWx0LiAqLworICAgICAgICB9IHJlc3VsdDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGU7CisKKy8qKiBEUG9FIFNoYXBlci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcgoreworICAgIHVpbnQ4X3QgcXVldWVfYml0bWFwOyAgIC8qKjwgUXVldWUgQml0bWFwLiAqLworICAgIHVpbnQzMl90IG1heGltdW1fcmF0ZTsgIC8qKjwgTWF4aW11bSBSYXRlLiAqLworICAgIHVpbnQxNl90IGJ1cnN0X3NpemU7ICAgIC8qKjwgQnVyc3QgU2l6ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyOworCisvKiogRFBvRSBSYXRlIExldmVsLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbAoreworICAgIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCB0cmFmZmljX3R5cGU7ICAgIC8qKjwgVHJhZmZpYyBUeXBlLiAqLworICAgIHVpbnQzMl90IG1heGltdW1fcmF0ZTsgIC8qKjwgTWF4aW11bSBSYXRlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsOworCisvKiogRFBvRSBFdmVudCBPcHRpb25zLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucworeworICAgIHVpbnQ4X3QgZXZlbnRfY29kZTsgICAgICAgICAvKio8IEV2ZW50IENvZGUuICovCisgICAgdWludDhfdCBlbmFibGVkX2Rpc2FibGVkOyAgIC8qKjwgRW5hYmxlZCAvIERpc2FibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTE2LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4Cit7CisgICAgdWludDhfdCBsZW47ICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgdWludDE2X3QgKnZhbDsgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4OworCisvKiogRFBvRSBBdHRyaWJ1dGUgVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAvKio8IExlYWYuICovCisgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHNlcXVuY2VfbnVtYmVyOyAgICAvKio8IEJpdCAxNSwgd2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHRoaXMgaXMgdGhlIGxhc3QgbWVzc2FnZSBvZiBpdHMgc2VxdWVuY2UuICAqLworICAgICAgICB9IHNlcXVlbmNlX251bWJlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgaWQ7ICAgICAgIC8qKjwgVGhlIGxvd2VzdCAobnVtZXJpY2FsbHkgc21hbGxlc3QpIE1BQyBhZGRyZXNzIGFtb25nIGFsbCBNQUMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgVFUgaW50ZXJmYWNlIHBvcnQgb2YgYSBEUG9FIE9OVSAqLworICAgICAgICB9IG9udV9pZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYm9vdF92ZXJzaW9uOyAgICAgIC8qKjwgVmVyc2lvbiBvZiBib290c3RyYXAgbG9hZGVyIChpZiBhbnkpICovCisgICAgICAgICAgICB1aW50MzJfdCBib290X2NyYzMyOyAgICAgICAgLyoqPCBDUkMtMzIgb2YgYm9vdCBsb2FkZXIgc2VydmVzIGFzIGFkZGl0aW9uYWwgdW5pcXVlIGlkZW50aWZpZXIgYW5kIHZlcmlmaWNhdGlvbiAqLworICAgICAgICAgICAgdWludDE2X3QgYXBwbGljYXRpb25fdmVyc2lvbjsgICAgICAgICAgICAgICAvKio8IFZlcnNpb24gb2YgbWFpbiBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBydW5uaW5nIG9uIHRoZSBEUG9FIE9OVSAqLworICAgICAgICAgICAgdWludDMyX3QgYXBwbGljYXRpb25fY3JjMzI7ICAgICAgICAgICAgICAgICAvKio8IENSQy0zMiBvZiBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzZXJ2ZXMgYXMgdW5pcXVlIElEIGFuZCB2ZXJpZmljYXRpb24gKi8KKyAgICAgICAgfSBmaXJtd2FyZV9pbmZvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBqZWRlY19pZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMTYtYml0IGNoaXAgbWFudWZhY3R1cmVyIElEIGNvZGUgYXMgYXNzaWduZWQgYnkgSkVERUMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGNoaXBfbW9kZWw7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJZGVudGlmaWVzIHRoZSBwYXJ0aWN1bGFyIGtpbmQgb2YgRVBOIGNoaXAuIEZvcm1hdCBkZWZpbmVkIGJ5IGNoaXBzZXQgdmVuZG9yICovCisgICAgICAgICAgICB1aW50MzJfdCBjaGlwX3ZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSWRlbnRpZmllcyB0aGUgdmVyc2lvbiBvciBzdGVwcGluZyBvZiB0aGUgY2hpcCBtb2RlbC4gRm9ybWF0IGRlZmluZWQgYnkgY2hpcHNldCB2ZW5kb3IgKi8KKyAgICAgICAgfSBjaGlwX2luZm87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHllYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCQ0QgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbW9udGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCQ0QgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZGF5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCQ0QgKi8KKyAgICAgICAgfSBkYXRlX29mX21hbnVmYWN0dXJlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBkZWZfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGRlZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmRlZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgT05VIHZlbmRvci4gKi8KKyAgICAgICAgfSBtYW51ZmFjdHVyZXJfaW5mbzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYmlkaXJlY3Rpb25hbDsgICAgICAgICAgICAgICAgICAgICAvKio8IE1heGltdW0gbnVtYmVyIG9mIGxpbmtzIHdoaWNoIGNhbiBib3RoIHRyYW5zbWl0IGFuZCByZWNlaXZlLiAqLworICAgICAgICAgICAgdWludDE2X3QgZG93bnN0cmVhbV9vbmx5OyAgICAgICAgICAgICAgICAgICAvKio8IEluIGFkZGl0aW9uIHRvIHRoZSBiaWRpcmVjdGlvbmFsIGxpbmtzLCB0aGUgbWF4aW11bSBudW1iZXIgb2YgTExJRHMgd2hpY2ggY2FuIHJlY2VpdmUgZGF0YSwgYnV0IG5vdCB0cmFuc21pdCAodW5pZGlyZWN0aW9uYWwsIGRvd25zdHJlYW0gb25seSkgKi8KKyAgICAgICAgfSBtYXhfbG9naWNhbF9saW5rczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgcG9ydF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSB0b3RhbCBudW1iZXIgb2YgVFUgaW50ZXJmYWNlIHBvcnRzIG9uIHRoZSBPTlUuICovCisgICAgICAgIH0gbnVtX2Vwb25fcG9ydHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHBvcnRfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIFMxIGludGVyZmFjZXMgb24gdGhlIERQb0UgT05VLiAqLworICAgICAgICB9IG51bV91bmlfcG9ydHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fcXVldWVzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUb3RhbCBudW1iZXIgb2YgcXVldWVzIGF2YWlsYWJsZSB0byBiZSBhc3NpZ25lZCB0byBsb2dpY2FsIGxpbmtzIGluIHRoZSB1cHN0cmVhbSBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdXBfcXVldWVzX21heF9wZXJfbGluazsgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBxdWV1ZXMgd2hpY2ggY2FuIGJlIGFzc2lnbmVkIHRvIGEgc2luZ2xlIGxvZ2ljYWwgbGluayBpbiB0aGUgdXBzdHJlYW0gZGlyZWN0aW9uICovCisgICAgICAgICAgICB1aW50OF90IHVwX3F1ZXVlX2luY3JlbWVudDsgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHNtYWxsZXN0IGFsbG9jYXRhYmxlIGluY3JlbWVudCBvZiBwYWNrZXQgYnVmZmVyIG1lbW9yeSBpbiB0aGUgdXBzdHJlYW0gZGlyZWN0aW9uLCBpbiBraWxvYnl0ZXMuICovCisgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fcXVldWVzOyAgICAgICAgICAgICAgICAgIC8qKjwgVG90YWwgbnVtYmVyIG9mIHF1ZXVlcyBhdmFpbGFibGUgdG8gYmUgYXNzaWduZWQgdG8gbG9naWNhbCBsaW5rcyBpbiB0aGUgZG93bnN0cmVhbSBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZG5fcXVldWVzX21heF9wZXJfcG9ydDsgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBxdWV1ZXMgd2hpY2ggY2FuIGJlIGFzc2lnbmVkIHRvIGEgc2luZ2xlIFVOSSBwb3J0IGluIHRoZSBkb3duc3RyZWFtIGRpcmVjdGlvbiAqLworICAgICAgICAgICAgdWludDhfdCBkbl9xdWV1ZV9pbmNyZW1lbnQ7ICAgICAgICAgICAgICAgICAvKio8IFRoZSBzbWFsbGVzdCBhbGxvY2F0YWJsZSBpbmNyZW1lbnQgb2YgcGFja2V0IGJ1ZmZlciBtZW1vcnkgaW4gdGhlIGRvd25zdHJlYW0gZGlyZWN0aW9uLCBpbiBraWxvYnl0ZXMuICovCisgICAgICAgICAgICB1aW50MTZfdCB0b3RhbF9wYWNrZXRfYnVmZmVyOyAgICAgICAgICAgICAgIC8qKjwgVG90YWwgcGFja2V0IGJ1ZmZlciBtZW1vcnkgb24gdGhlIE9OVSAoS0IpICovCisgICAgICAgICAgICB1aW50MTZfdCB1cHN0cmVhbV9wYWNrZXRfYnVmZmVyOyAgICAgICAgICAgIC8qKjwgTWF4aW11bSBhbW91bnQgb2YgcGFja2V0IGJ1ZmZlciBtZW1vcnkgd2hpY2ggY2FuIGJlIGFsbG9jYXRlZCB0byB1cHN0cmVhbSBxdWV1ZXMgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRvd25zcmVhbV9wYWNrZXRfYnVmZmVyOyAgICAgICAgICAgLyoqPCBNYXhpbXVtIGFtb3VudCBvZiBwYWNrZXQgYnVmZmVyIG1lbW9yeSB3aGljaCBjYW4gYmUgYWxsb2NhdGVkIHRvIGRvd25zdHJlYW0gcXVldWVzICovCisgICAgICAgIH0gcGFja2V0X2J1ZmZlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfcXVldWVfc2V0czsgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBRdWV1ZSBTZXRzICovCisgICAgICAgICAgICB1aW50OF90IHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldDsgICAgICAgIC8qKjwgUmVwb3J0IFZhbHVlcyBQZXIgUXVldWUgU2V0ICovCisgICAgICAgICAgICB1aW50MTZfdCAqcXVldWVfc2V0MDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVwb3J0IFRocmVzaG9sZHMgZm9yIFF1ZXVlIFNldCAwICovCisgICAgICAgICAgICB1aW50MTZfdCAqcXVldWVfc2V0MTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVwb3J0IFRocmVzaG9sZHMgZm9yIFF1ZXVlIFNldCAxICovCisgICAgICAgICAgICB1aW50MTZfdCAqcXVldWVfc2V0MjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVwb3J0IFRocmVzaG9sZHMgZm9yIFF1ZXVlIFNldCAyICovCisgICAgICAgICAgICB1aW50MTZfdCAqcXVldWVfc2V0MzsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVwb3J0IFRocmVzaG9sZHMgZm9yIFF1ZXVlIFNldCAzICovCisgICAgICAgIH0gcmVwb3J0X3RocmVzaG9sZHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGUgbGlua19zdGF0ZTsgLyoqPCBMaW5rIFN0YXRlLiAqLworICAgICAgICB9IGxpbmtfc3RhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4aW11bV9vYW1fcmF0ZTsgICAgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIE9BTSBSYXRlLiAqLworICAgICAgICAgICAgdWludDhfdCBtaW5pbXVtX29hbV9yYXRlOyAgICAgICAgICAgICAgICAgICAvKio8IE1pbmltdW0gT0FNIFJhdGUuICovCisgICAgICAgIH0gb2FtX3JhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG1heF9tYWNfYWxsb3dlZDsgICAgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIGFsbG93ZWQgbGltaXQgKi8KKyAgICAgICAgfSBkeW5fbGVhcm5fdGFibGVfc2l6ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZHluYW1pY19hZGRyZXNzX2FnZV9saW1pdDsgICAgICAgICAvKio8IFVuaXRzIDguNzUgbXMgKi8KKyAgICAgICAgfSBkeW5fbGVhcm5fYWdlX2xpbWl0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgbWFjX2FkZHJlc3M7IC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgICAgIH0gZHluX21hY190YWJsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIG1hY19hZGRyZXNzOyAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgICAgICB9IHN0YXRpY19tYWNfdGFibGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgbWF4aW11bV9jYXBhYmlsaXRpZXM7ICAgLyoqPCBNYXhpbXVtIENhcGFiaWxpdGllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgY3VycmVudF9jYXBhYmlsaXRpZXM7ICAgLyoqPCBDdXJyZW50IENhcGFiaWxpdGllcy4gKi8KKyAgICAgICAgfSBwb3J0X2NhcGFiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGUgbGVhcm5pbmdfbW9kZTsgICAgICAgICAgICAgICAgICAgLyoqPCA4MDIuMSBsZWFybmluZyBtb2RlIGFsd2F5cyBmb3J3YXJkcyBmcmFtZXMuIE1BQyBhY2Nlc3MgY29udHJvbCBtb2RlIGZvcndhcmRzIGZyYW1lcyBvbmx5IGlmIHRoZSBTQSBvZiB0aGUgZnJhbWUgaXMgaW4gdGhlIE1BQyBhZGRyZXNzIHRhYmxlIGZvciB0aGF0IHBvcnQ7IHRoYXQgaXMsIHRoZSBhZGRyZXNzIGhhcyBiZWVuIGxlYXJuZWQgb24gdGhhdCBwb3J0LCBvciBwcm92aXNpb25lZCBvbiB0aGF0IHBvcnQgYnkgbWFuYWdlbWVudC4gQSBmcmFtZSB3aXRoIHRoZSBzYW1lIFNBIGF0dGVtcHRpbmcgdG8gaW5ncmVzcyBzb21lIG90aGVyIHBvcnQgd291bGQgYmUgZGlzY2FyZGVkLiAqLworICAgICAgICB9IGR5bl9sZWFybl9tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX2d1YXJhbnRlZWRfbGltaXQ7ICAgICAgICAgICAgICAgICAgLyoqPCBNaW5pbXVtIEd1YXJhbnRlZWQgTGltaXQuICovCisgICAgICAgIH0gbWluX21hY19saW1pdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbWF4X2FsbG93ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IEFsbG93ZWQuICovCisgICAgICAgIH0gbWF4X21hY19hbGxvd2VkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBhZ2dyZWdhdGVfbWFjX2xpbWl0OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgT05VIGFnZ3JlZ2F0ZSBkeW5hbWljIE1BQyBhZGRyZXNzIGxpbWl0ICovCisgICAgICAgIH0gYWdnX21hY19saW1pdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBsZW5fZXJyb3JfZGlzY2FyZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSWYgTGVuZ3RoIEVycm9yIERpc2NhcmQgRW5hYmxlICovCisgICAgICAgIH0gbGVuX2Vycl9kaXNjYXJkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGZsb29kX3Vua25vd247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGbG9vZCBVbmtub3duIERBIG9wdGlvbiAqLworICAgICAgICB9IGZsb29kX3Vua25vd247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgbG9jYWxfc3dpdGNoaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvY2FsIFN3aXRjaGluZyBvcHRpb24gKi8KKyAgICAgICAgfSBsb2NhbF9zd2l0Y2hpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX2xpbmtzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgbGlua3MgdG8gY29uZmlndXJlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0ICpsaW5rX2NvbmZpZ3VyYXRpb247IC8qKjwgTGluayBDb25maWd1cmF0aW9uLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfcG9ydHM7ICAgIC8qKjwgVGhlIG51bWJlciBvZiBQb3J0cyB0byBjb25maWd1cmUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgKnBvcnRfY29uZmlndXJhdGlvbjsgLyoqPCBQb3J0IENvbmZpZ3VyYXRpb24uICovCisgICAgICAgIH0gcXVldWVfY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmaXJtd2FyZV9maWxlbmFtZV9jb3VudDsgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZmlybXdhcmVfZmlsZW5hbWUuICovCisgICAgICAgICAgICB1aW50OF90ICpmaXJtd2FyZV9maWxlbmFtZTsgLyoqPCBUaGUgZmlsZW5hbWUgaXMgYSBudWxsLXRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBhcyByZWNlaXZlZCBmcm9tIHRoZSBPU1MgYnkgdGhlIHZDTS4gKi8KKyAgICAgICAgfSBmaXJtd2FyZV9maWxlbmFtZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCBzdGF0X3RocmVzaG9sZDsgICAgLyoqPCBTdGF0IFRocmVzaG9sZC4gKi8KKyAgICAgICAgfSBwb3J0X3N0YXRfdGhyZXNoOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkIHN0YXRfdGhyZXNob2xkOyAgICAvKio8IFN0YXQgVGhyZXNob2xkLiAqLworICAgICAgICB9IGxpbmtfc3RhdF90aHJlc2g7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpbWU7ICAvKio8IFRpbWVvdXQgdmFsdWUgaW4gc2VjICovCisgICAgICAgIH0ga2V5X2V4cGlyeV90aW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGUgZW5jcnlwdGlvbl9tZXRob2Q7IC8qKjwgRW5jcnlwdGlvbiBNZXRob2QuICovCisgICAgICAgIH0gZW5jcnlwdF9tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlIHJ1bGU7ICAgICAgICAgICAgICAgICAvKio8IFJ1bGUuICovCisgICAgICAgIH0gcG9ydF9pbmdyZXNzX3J1bGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGUgZmllbGRfY29kZTsgICAgIC8qKjwgRmllbGQgQ29kZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdCBsYXllcl9zZWxlY3Q7IC8qKjwgTGF5ZXIgU2VsZWN0LiAqLworICAgICAgICAgICAgdWludDhfdCBiaXRfd29yZF9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAzMi1iaXQgV29yZCBPZmZzZXQuICovCisgICAgICAgICAgICB1aW50OF90IGJpdF9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJpdCBPZmZzZXQuICovCisgICAgICAgICAgICB1aW50OF90IGJpdF93aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJpdCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcmVmZXJlbmNlX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIENvdW50LiAqLworICAgICAgICB9IGx1ZV9maWVsZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdHBpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBbHRlcm5hdGUgQy1WTEFOIFRQSUQgKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgaW5zZXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNlIHRoaXMgVFBJRCB3aGVuIGluc2VydGluZyBDLVZMQU4gdGFncyAqLworICAgICAgICB9IGFsdF9jdmxhbl9ldGhlcnR5cGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRwaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWx0ZXJuYXRlIFMtVkxBTiBUUElEICovCisgICAgICAgICAgICBiY21vc19ib29sIGluc2VydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVzZSB0aGlzIFRQSUQgd2hlbiBpbnNlcnRpbmcgUy1WTEFOIHRhZ3MgKi8KKyAgICAgICAgfSBhbHRfc3ZsYW5fZXRoZXJ0eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBtYXhpbXVtIG51bWJlciBvZiBicm9hZGNhc3QgcGFja2V0cyBhbGxvd2VkIGZyb20gRXRoZXJuZXQgcG9ydCAxIGluIDEgc2Vjb25kLiAqLworICAgICAgICB9IGJjX3JhdGVfbGltaXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCB0cmFmZmljX3R5cGVzOyAgIC8qKjwgVHJhZmZpYyBUeXBlcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzIHJhdGVfdW5pdHM7ICAgICAgICAgIC8qKjwgUmF0ZSBVbml0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX3NoYXBlcnM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFNoYXBlcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXIgKnNoYXBlcnM7ICAgICAgICAgICAvKio8IFNoYXBlcnMuICovCisgICAgICAgIH0gZWdyZXNzX3NoYXBpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzIHJhdGVfdW5pdHM7ICAgICAgICAgIC8qKjwgUmF0ZSBVbml0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX3JhdGVfbGV2ZWxzOyAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFJhdGUgTGV2ZWxzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCAqcmF0ZV9sZXZlbHM7ICAgLyoqPCBSYXRlIExldmVscy4gKi8KKyAgICAgICAgfSBpbmdyZXNzX3BvbGljaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZSByeF9kb3duOyAgICAgICAgICAvKio8IFJ4L0Rvd24uICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZSB0eF91cDsgICAgICAgICAgICAvKio8IFR4L1VwLiAqLworICAgICAgICB9IGZlY19tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBtYW5fbmFtZV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtYW5fbmFtZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKm1hbl9uYW1lOyAgICAgICAgICAgICAgICAgIC8qKjwgTWFuIE5hbWUuICovCisgICAgICAgIH0gbWZyX25hbWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgY29kZV9hY2Nlc3Nfc3RhcnRbMTNdOyAgICAgIC8qKjwgQ29kZSBBY2Nlc3MgU3RhcnQuICovCisgICAgICAgICAgICB1aW50OF90IGN2Y19hY2Nlc3Nfc3RhcnRbMTNdOyAgICAgICAvKio8IENWQyBBY2Nlc3MgU3RhcnQuICovCisgICAgICAgIH0gZndhcmVfbWZnX3RpbWVfdmFyX2N0cmw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZlbmRvcl9uYW1lX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZlbmRvcl9uYW1lLiAqLworICAgICAgICAgICAgdWludDhfdCAqdmVuZG9yX25hbWU7ICAgICAgICAgICAgICAgLyoqPCBPTlUgVmVuZG9yIE5hbWUgKi8KKyAgICAgICAgfSB2ZW5kb3JfbmFtZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbW9kZWxfbnVtYmVyX2NvdW50OyAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbW9kZWxfbnVtYmVyLiAqLworICAgICAgICAgICAgdWludDhfdCAqbW9kZWxfbnVtYmVyOyAgICAgICAgICAgICAgLyoqPCBPTlUgTW9kZWwgTnVtYmVyICovCisgICAgICAgIH0gbW9kZWxfbnVtYmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBod192ZXJzaW9uX2NvdW50OyAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBod192ZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDhfdCAqaHdfdmVyc2lvbjsgICAgICAgICAgICAgICAgLyoqPCBPTlUgSGFyZHdhcmUgVmVyc2lvbiAqLworICAgICAgICB9IGh3X3ZlcnNpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGN1cnJlbnRfdGVtcGVyYXR1cmUuICovCisgICAgICAgICAgICB1aW50MTZfdCAqY3VycmVudF90ZW1wZXJhdHVyZTsgICAgICAvKio8IEN1cnJlbnQgVGVtcGVyYXR1cmUuICovCisgICAgICAgIH0gb3B0X21vbl90ZW1wZXJhdHVyZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgY3VycmVudF92Y2NfY291bnQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gY3VycmVudF92Y2MuICovCisgICAgICAgICAgICB1aW50MTZfdCAqY3VycmVudF92Y2M7ICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgVmNjLiAqLworICAgICAgICB9IG9wdF9tb25fdmNjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50X3R4X2JpYXNfY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBjdXJyZW50X3R4X2JpYXMuICovCisgICAgICAgICAgICB1aW50MTZfdCAqY3VycmVudF90eF9iaWFzOyAgICAgICAgICAvKio8IEN1cnJlbnQgVHggQmlhcy4gKi8KKyAgICAgICAgfSBvcHRfbW9uX3R4X2JpYXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfdHhfcG93ZXJfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGN1cnJlbnRfdHhfcG93ZXIuICovCisgICAgICAgICAgICB1aW50MTZfdCAqY3VycmVudF90eF9wb3dlcjsgICAgICAgICAvKio8IEN1cnJlbnQgVHggUG93ZXIuICovCisgICAgICAgIH0gb3B0X21vbl90eF9wb3dlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgY3VycmVudF9yeF9wb3dlcl9jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gY3VycmVudF9yeF9wb3dlci4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90ICpjdXJyZW50X3J4X3Bvd2VyOyAgICAgICAgIC8qKjwgQ3VycmVudCBSeCBQb3dlci4gKi8KKyAgICAgICAgfSBvcHRfbW9uX3J4X3Bvd2VyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF91bmljYXN0X2ZyYW1lczsgICAgICAgICAvKio8IFJ4IFVuaWNhc3QgRnJhbWVzLiAqLworICAgICAgICB9IHJ4X3VuaWNhc3RfZnJhbWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF91bmljYXN0X2ZyYW1lczsgICAgICAgICAvKio8IFR4IFVuaWNhc3QgRnJhbWVzLiAqLworICAgICAgICB9IHR4X3VuaWNhc3RfZnJhbWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF9mcmFtZXNfdG9vX3Nob3J0OyAgICAgICAvKio8IFJ4IEZyYW1lcyBUb28gU2hvcnQuICovCisgICAgICAgIH0gcnhfZnJhbWVfdG9vX3Nob3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF9mcmFtZXM2NDsgICAgICAgICAgICAgICAvKio8IFJ4IEZyYW1lcyA2NC4gKi8KKyAgICAgICAgfSByeF9mcmFtZTY0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF9mcmFtZXM2NTEyNzsgICAgICAgICAgICAvKio8IFJ4IEZyYW1lcyA2NV8xMjcuICovCisgICAgICAgIH0gcnhfZnJhbWU2NTEyNzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzMTI4MjU1OyAgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgMTI4XzI1NS4gKi8KKyAgICAgICAgfSByeF9mcmFtZTEyODI1NTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzMjU2NTExOyAgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgMjU2XzUxMS4gKi8KKyAgICAgICAgfSByeF9mcmFtZTI1NjUxMTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzNTEyMTAyMzsgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgNTEyXzEwMjMuICovCisgICAgICAgIH0gcnhfZnJhbWU1MTIxMDIzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF9mcmFtZXMxMDI0MTUxODsgICAgICAgICAvKio8IFJ4IEZyYW1lcyAxMDI0XzE1MTguICovCisgICAgICAgIH0gcnhfZnJhbWUxMDI0MTUxODsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzMTUxOXBsdXM7ICAgICAgICAgLyoqPCBSeCBGcmFtZXMgMTUxOSBQbHVzLiAqLworICAgICAgICB9IHJ4X2ZyYW1lMTUxOXBsdXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X2ZyYW1lczY0OyAgICAgICAgICAgICAgIC8qKjwgVHggRnJhbWVzIDY0LiAqLworICAgICAgICB9IHR4X2ZyYW1lNjQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X2ZyYW1lczY1MTI3OyAgICAgICAgICAgIC8qKjwgVHggRnJhbWVzIDY1XzEyNy4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTY1MTI3OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9mcmFtZXMxMjgyNTU7ICAgICAgICAgICAvKio8IFR4IEZyYW1lcyAxMjhfMjU1LiAqLworICAgICAgICB9IHR4X2ZyYW1lMTI4MjU1OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9mcmFtZXMyNTY1MTE7ICAgICAgICAgICAvKio8IFR4IEZyYW1lcyAyNTZfNTExLiAqLworICAgICAgICB9IHR4X2ZyYW1lMjU2NTExOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9mcmFtZXM1MTIxMDIzOyAgICAgICAgICAvKio8IFR4IEZyYW1lcyA1MTJfMTAyMy4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTUxMjEwMjM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X2ZyYW1lczEwMjQxNTE4OyAgICAgICAgIC8qKjwgVHggRnJhbWVzIDEwMjRfMTUxOC4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTEwMjQxNTE4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9mcmFtZXMxNTE5cGx1czsgICAgICAgICAvKio8IFR4IEZyYW1lcyAxNTE5IFBsdXMuICovCisgICAgICAgIH0gdHhfZnJhbWUxNTE5cGx1czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBxdWV1ZV9kZWxheV90aHJlc2hvbGQ7ICAgICAgLyoqPCBRdWV1ZSBEZWxheSBUaHJlc2hvbGQuICovCisgICAgICAgIH0gcXVldWVfZGVsYXlfdGhyZXNoOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBxdWV1ZV9kZWxheTsgICAgICAgICAgICAgICAvKio8IFF1ZXVlIERlbGF5IC4gKi8KKyAgICAgICAgfSBxdWV1ZV9kZWxheTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgZnJhbWVzX2Ryb3BwZWQ7ICAgICAgICAgICAgLyoqPCBGcmFtZXMgRHJvcHBlZC4gKi8KKyAgICAgICAgfSBmcmFtZXNfZHJvcHBlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgYnl0ZXNfZHJvcHBlZDsgICAgICAgICAgICAgLyoqPCBCeXRlcyBEcm9wcGVkLiAqLworICAgICAgICB9IGJ5dGVzX2Ryb3BwZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ5dGVzX2RlbGF5ZWQ7ICAgICAgICAgICAgIC8qKjwgQnl0ZXMgRGVsYXllZC4gKi8KKyAgICAgICAgfSBieXRlc19kZWxheWVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9ieXRlc191bnVzZWQ7ICAgICAgICAgICAvKio8IFR4IEJ5dGVzIFVudXNlZC4gKi8KKyAgICAgICAgfSB0eF9ieXRlc191bnVzZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfdHlwZV9jb3VudDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBvcnRfdHlwZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZSAqcG9ydF90eXBlOyAgLyoqPCBQb3J0IFR5cGUuICovCisgICAgICAgIH0gZG9udV9wb3J0X3R5cGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGRlZl9jb3VudDsgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZGVmLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucyAqZGVmOyAgICAgICAgICAgICAgICAgICAgLyoqPCBEZWZhdWx0LiAqLworICAgICAgICB9IHN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzIGZpZWxkX2JpdG1hcDsgICAgLyoqPCBGaWVsZCBCaXRtYXAuICovCisgICAgICAgIH0gaXBtY19mb3J3YXJkaW5nX3J1bGVfY29uZmlndXJhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYWx0ZXJuYXRlX2l0cGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFsdGVybmF0ZSBJLVRQSUQuICovCisgICAgICAgICAgICBiY21vc19ib29sIGluc2VydF90aGlzX3RwaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5zZXJ0IFRoaXMgVFBJRC4gKi8KKyAgICAgICAgfSBpdHBpZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYWx0ZXJuYXRlX2J0cGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFsdGVybmF0ZSBCLVRQSUQuICovCisgICAgICAgICAgICBiY21vc19ib29sIGluc2VydF90aGlzX3RwaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5zZXJ0IFRoaXMgVFBJRC4gKi8KKyAgICAgICAgfSBidHBpZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgY29tbWl0ZWRfYnVyc3Rfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDI1NiBCeXRlcyAqLworICAgICAgICAgICAgdWludDMyX3QgY29tbWl0ZWRfaW5mb3JtYXRpb25fcmF0ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IDEgS2JwcyAqLworICAgICAgICB9IHF1ZXVlX2NpcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZXhjZXNzX2J1cnN0X3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDI1NiBCeXRlcyAqLworICAgICAgICAgICAgdWludDMyX3QgcXVldWVfZWlyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDEgS2JwcyAqLworICAgICAgICB9IHF1ZXVlX2VpcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGVfY29sb3JfbWFya2luZzsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBDb2xvciBNYXJraW5nLiAqLworICAgICAgICAgICAgdWludDhfdCBmaWVsZF9jb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZpZWxkIENvZGUuICovCisgICAgICAgICAgICB1aW50OF90IGZpZWxkX2luc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmllbGQgSW5zdGFuY2UuICovCisgICAgICAgICAgICB1aW50OF90IG1zYl9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTVNCIE1hc2suICovCisgICAgICAgICAgICB1aW50OF90IGxzYl9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTFNCIE1hc2suICovCisgICAgICAgICAgICB1aW50OF90IGdyZWVuX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR3JlZW4gVmFsdWUuICovCisgICAgICAgICAgICB1aW50OF90IHllbGxvd192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgWWVsbG93IFZhbHVlLiAqLworICAgICAgICB9IHF1ZXVlX2NvbG9yX21hcmtpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG51bWJlcl9vZl9yYXRlX2xpbWl0ZXJzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgT2YgUmF0ZSBMaW1pdGVycy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGNic19taW5faW5jcmVtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDQlMgTWluIEluY3JlbWVudC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGNpcl9taW5faW5jcmVtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDSVIgTWluIEluY3JlbWVudC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGVic19taW5faW5jcmVtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFQlMgTWluIEluY3JlbWVudC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGVpcl9taW5faW5jcmVtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFSVIgTWluIEluY3JlbWVudC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY29sb3JfYXdhcmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb2xvciBBd2FyZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY291cGxpbmdfY29uZmlndXJhYmxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb3VwbGluZyBDb25maWd1cmFibGUuICovCisgICAgICAgICAgICB1aW50OF90IGNvdXBsaW5nX2JlaGF2aXJvX2RlZmF1bHQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ291cGxpbmcgQmVoYXZpcm8gRGVmYXVsdC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY29sb3JfbWFya2luZ19zdXBwb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb2xvciBNYXJraW5nIFN1cHBvcnQuICovCisgICAgICAgICAgICB1aW50OF90IHNtYXJ0X2NvbG9yX2Ryb3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU21hcnQgQ29sb3IgRHJvcC4gKi8KKyAgICAgICAgfSBxdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGNvdXBsaW5nX2ZsYWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ291cGxpbmcgRmxhZy4gKi8KKyAgICAgICAgfSBjb3VwbGluZ19mbGFnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIHBwc19wdWxzZV9zdXBwb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMVBQUyBQdWxzZSBTdXBwb3J0LiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCB0b2Rfc3RyaW5nX3N1cHBvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRPRCBTdHJpbmcgU3VwcG9ydC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgdjJmcmFtZV9zdXBwb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBbMTU4OHYyXSBGcmFtZSBTdXBwb3J0LiAqLworICAgICAgICB9IGNsb2NrX3RyYW5zcG9ydF9jYXBhYmlsaXRpZXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgcHBzX3B1bHNlX291dHB1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAxIFBQUyBQdWxzZSBPdXRwdXQuICovCisgICAgICAgICAgICBiY21vc19ib29sIHRvZF9zdHJpbmdfb3V0cHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVE9EIFN0cmluZyBPdXRwdXQuICovCisgICAgICAgICAgICBiY21vc19ib29sIHYyZnJhbWVfb3V0cHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgWzE1ODh2Ml0gRnJhbWUgT3V0cHV0LiAqLworICAgICAgICB9IGVuYWJsZV9jbG9ja190cmFuc3BvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1wY3BfcmVmZXJlbmNlX3BvaW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNUENQIFJlZmVyZW5jZSBQb2ludC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHRvZF9zdHJpbmdfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdG9kX3N0cmluZy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnRvZF9zdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUT0QgU3RyaW5nLiAqLworICAgICAgICB9IHRpbWVfdHJhbnNmZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG5kb3duOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOZG93bi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IG51cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdXAuICovCisgICAgICAgIH0gcHJvcGFnYXRpb25fcGFyYW1ldGVyczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcnR0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJUVC4gKi8KKyAgICAgICAgfSBydHQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTLVRBRy4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGN0YWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDLVRBRy4gKi8KKyAgICAgICAgfSBkYWNfY29uZmlndXJhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBsbGRwX2luc3RhbmNlX3N0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExMRFAgSW5zdGFuY2UgU3RhdHVzLiAqLworICAgICAgICB9IGRhY19jb25maWd1cmF0aW9uX2VuYWJsZV9kaXNhYmxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF9icm9hZGNhc3RfZnJhbWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUnggQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICAgICAgfSByeF9mcmFtZV9icm9hZGNhc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X2Jyb2FkY2FzdF9mcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUeCBCcm9hZGNhc3QgRnJhbWVzLiAqLworICAgICAgICB9IHR4X2ZyYW1lc19icm9hZGNhc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X211bHRpY2FzdF9mcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUeCBNdWx0aWNhc3QgRnJhbWVzLiAqLworICAgICAgICB9IHR4X2ZyYW1lc19tdWx0aWNhc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4X211bHRpY2FzdF9mcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSeCBNdWx0aWNhc3QgRnJhbWVzLiAqLworICAgICAgICB9IHJ4X2ZyYW1lc19tdWx0aWNhc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X2J5dGVzX2dyZWVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUeCBCeXRlcyBHcmVlbi4gKi8KKyAgICAgICAgfSB0eF9ieXRlc19ncmVlbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfYnl0ZXNfZ3JlZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJ4IEJ5dGVzIEdyZWVuLiAqLworICAgICAgICB9IHJ4X2J5dGVzX2dyZWVuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggbGxpZF92YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgTExJRCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvbnVfbWNhc3RfbGxpZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjX2FkZHJlc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1hYyBBZGRyZXNzLiAqLworICAgICAgICAgICAgdWludDhfdCB1bmlfcG9ydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVuaSBQb3J0LiAqLworICAgICAgICB9IHVuaV9tYWNfbGVhcm5lZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBvdmVyX3dyaXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDA6IERpc2NhcmQ7IDE6IE92ZXJ3cml0ZSAqLworICAgICAgICB9IHVuaV9tYWNfdGFibGVfZnVsbF9iZWhhdmlvcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGUgcHdyX3NhdmluZ19tb2RlOyAvKio8IFB3ciBTYXZpbmcgTW9kZS4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgZWFybHlfd2FrZV91cF9zdXBwb3J0OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFYXJseSBXYWtlIFVwIFN1cHBvcnQuICovCisgICAgICAgICAgICB1aW50OF90IHZlbl9zcGVjX2ZpZWxkX3NpemU7ICAgIC8qKjwgVmVuIFNwZWMgRmllbGQgU2l6ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZlbl9zcGVjX2ZpZWxkOyAgICAgICAgLyoqPCBWZW4gU3BlYyBGaWVsZCAuICovCisgICAgICAgIH0gb251X3B3cl9zYXZpbmdfY2FwOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2U7CisKKy8qKiBEUG9FIEF0dHJpYnV0ZSBWYWx1ZSBNQUMgVGFibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlCit7CisgICAgdWludDMyX3QgbWFjX2FkZHJlc3NfY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtYWNfYWRkcmVzcy4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjX2FkZHJlc3M7IC8qKjwgTUFDIEFkZHJlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGU7CisKKy8qKiBEUG9FIEV2ZW50IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSBldmVudF9jb2RlOyAvKio8IEV2ZW50IENvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIHJhaXNlZDsgICAgICAgICAgICAgICAgICAvKio8IFJhaXNlZC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlIG9iamVjdF90eXBlOyAgIC8qKjwgT2JqZWN0IFR5cGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBvYmplY3RfaW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE9iamVjdCBJbnN0YW5jZS4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgcmFpc2VkOyAgLyoqPCBSYWlzZWQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsgICAvKio8IE9iamVjdCBUeXBlLiAqLworICAgICAgICAgICAgdWludDE2X3Qgb2JqZWN0X2luc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPYmplY3QgSW5zdGFuY2UuICovCisgICAgICAgICAgICB1aW50OF90IHN0YXRfYnJhbmNoOyAgICAvKio8IFN0YXQgQnJhbmNoLiAqLworICAgICAgICAgICAgdWludDE2X3Qgc3RhdF9sZWFmOyAgICAgLyoqPCBTdGF0IExlYWYuICovCisgICAgICAgIH0gc3RhdGlzdGljc19hbGFybTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2U7CisKKy8qKiBEUG9FIEZpbGUgVHJhbnNmZXIgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlIG9wY29kZTsgICAvKio8IE9wY29kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZSBmaWxlX3R5cGU7ICAgLyoqPCBGaWxlIFR5cGUuICovCisgICAgICAgIH0gZmlsZV9yZWFkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmaWxlbmFtZV9jb3VudDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGZpbGVuYW1lLiAqLworICAgICAgICAgICAgdWludDhfdCAqZmlsZW5hbWU7ICAvKio8IEZpbGVuYW1lLiAqLworICAgICAgICB9IGZpbGVfd3JpdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrOyAgICAgLyoqPCBCbG9jay4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsgICAgLyoqPCBMZW5ndGguICovCisgICAgICAgICAgICB1aW50OF90ICpkYXRhOyAgICAgIC8qKjwgRGF0YS4gKi8KKyAgICAgICAgfSBmaWxlX2RhdGE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrOyAgICAgLyoqPCBCbG9jay4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfZXJyb3IgZXJyb3I7IC8qKjwgRXJyb3IuICovCisgICAgICAgIH0gZmlsZV9hY2s7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2U7CisKKy8qKiBEUG9FIEluZm8gVExWLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlIHR5cGU7ICAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZHBvZV9vYW1fdmVyc2lvbjsgICAgICAgICAgIC8qKjwgRFBvRSBPQU0gVmVyc2lvbi4gKi8KKyAgICAgICAgfSBkcG9lX29hbV9zdXBwb3J0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHY7CisKKy8qKiBBIHN0cnVjdHVyZSBjb250YWluaW5nIGEgbnVtZXJpYyA4LWJpdCB2YWx1ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV91OHZhbHVlCit7CisgICAgdWludDhfdCB2YWx1ZTsgIC8qKjwgQW4gOC1iaXQgbnVtZXJpYyB2YWx1ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWU7CisKKy8qKiBBIHN0cnVjdHVyZSBjb250YWluaW5nIGEgbnVtZXJpYyA2NC1iaXQgdmFsdWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUKK3sKKyAgICB1aW50NjRfdCB2YWx1ZTsgLyoqPCBBIDY0LWJpdCBudW1lcmljIHZhbHVlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWU7CisKKy8qKiBTdGQgQXR0cmlidXRlIFZhbHVlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19pZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2ZyYW1lc190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX3NpbmdsZV9jb2xsX2ZyYW1lczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX211bHRpcGxlX2NvbGxfZnJhbWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfZnJhbWVzX3J4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfZmNzX2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2FsaWduX2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX29jdGV0c190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2ZyYW1lc19kZWZlcnJlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2xhdGVfY29sbGlzaW9uczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2V4Y2Vzc2l2ZV9jb2xsaXNpb25zOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfZnJhbWVzX2xvc3RfbWFjX3R4X2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2NhcnJpZXJfc2Vuc2VfZXJyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfb2N0ZXRzX3J4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfZnJhbWVzX2xvc3RfbWFjX3J4X2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX21jYXN0X2ZyYW1lc190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2JjYXN0X2ZyYW1lc190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2ZyX2V4Y2Vzc2l2ZV9kZWZlcnJhbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX21jYXN0X2ZyYW1lc19yeF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2JjYXN0X2ZyYW1lc19yeF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2luX3JhbmdlX2xlbl9lcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19vdXRfb2ZfcmFuZ2VfbGVuX2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2ZyYW1lX3Rvb19sb25nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdGF0dXMuICovCisgICAgICAgIH0gbWFjX2VuYWJsZV9zdGF0dXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgICAgICB9IG1hY19hZGRyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlIHR5cGU7ICAgICAgICAgICAgICAgICAgLyoqPCBUeXBlLiAqLworICAgICAgICB9IHBoeV90eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBwaHlfc3ltYm9sX2Vycl9kdXJpbmdfY2FycmllcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZSBzdGF0ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gcGh5X2FkbWluX3N0YXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZSB2YWx1ZTsgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYXVfbWVkaWFfYXZhaWw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGF1dG9fbmVnX2lkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZSB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBhdXRvX25lZ19hZG1pbl9zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZyB2YWx1ZTsgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYXV0b19uZWdfcmVtb3RlX3NpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWcgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYXV0b19uZWdfYXV0b19jZmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFiaWxpdGllc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBjYXBhYmlsaXRpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSAqY2FwYWJpbGl0aWVzOyAgLyoqPCBDYXBhYmlsaXRpZXMuICovCisgICAgICAgIH0gYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBjYXBhYmlsaXRpZXNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGNhcGFiaWxpdGllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5ICpjYXBhYmlsaXRpZXM7ICAvKio8IENhcGFiaWxpdGllcy4gKi8KKyAgICAgICAgfSBhdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgY2FwYWJpbGl0aWVzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBjYXBhYmlsaXRpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSAqY2FwYWJpbGl0aWVzOyAgLyoqPCBDYXBhYmlsaXRpZXMuICovCisgICAgICAgIH0gYXV0b19uZWdfcnhfdGVjaDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgdmFsdWU7ICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGF1dG9fbmVnX2xvY2FsX3NlbGVjdF9hYmxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3RvciB2YWx1ZTsgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYXV0b19uZWdfYWRfc2VsZWN0X2FibGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yIHZhbHVlOyAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBhdXRvX25lZ19yeF9zZWxlY3RfYWJsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19kdXBsZXhfc3RhdHVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmdW5jdGlvbnNfY291bnQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGZ1bmN0aW9ucy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90ICpmdW5jdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGdW5jdGlvbnMuICovCisgICAgICAgIH0gbWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2N0cmxfZnJhbWVzX3R4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2N0cmxfZnJhbWVzX3J4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2N0cmxfdW5zdXBwb3J0ZWRfb3Bfcng7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfY3RybF9wYXVzZV9kZWxheTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19jdHJsX3BhdXNlX3R4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2N0cmxfcGF1c2Vfcng7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvYW1fbG9jYWxfZXJyX2ZyYW1lX3NlY3NfZXZlbnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvYW1fbG9jYWxfZXJyX2ZyYW1lX3BlcmlvZF9ldmVudDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9hbV9sb2NhbF9lcnJfZnJfc2VjX3N1bV9ldmVudDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9hbV9lbXVsX2NyYzhlcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX21hY19jdHJsX2ZyYW1lc190eDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfbWFjX2N0cmxfZnJhbWVzX3J4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF9kaXNjb3Zlcnlfd2luZG93X3R4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF9kaXNjb3ZlcnlfdGltZW91dDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBmZWNfY29ycmVjdGVkX2Jsb2NrczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBmZWNfdW5jb3JyZWN0YWJsZV9ibG9ja3M7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydCB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZmVjX2FiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGUgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZmVjX21vZGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF90eF9nYXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfdHhfcmVnX2FjazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX3R4X3JlZ2lzdGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfdHhfcmVnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF90eF9yZXBvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF9yeF9nYXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfcnhfcmVnX2FjazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX3J4X3JlZ2lzdGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfcnhfcmVnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF9yeF9yZXBvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2NvbGxpc2lvbl9mcmFtZXM7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZTsKKworLyoqIFN0ZCBBY3Rpb24gVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgLyoqPCBMZWFmLiAqLworICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworfSBiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlOworCisvKiogRFBvRSBWYXIgQ29udGFpbmVyIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2ggYnJhbmNoOyAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2Ugb2JqZWN0X2NvbnRleHQ7ICAgIC8qKjwgT2JqZWN0IENvbnRleHQuICovCisgICAgICAgIH0gb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZSBhdHRyaWJ1dGU7ICAgICAgICAgICAgICAvKio8IEF0dHJpYnV0ZS4gKi8KKyAgICAgICAgfSBzdGFuZGFyZF9hdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2UgYWN0aW9uOyAgICAgICAgICAgICAgIC8qKjwgQWN0aW9uLiAqLworICAgICAgICB9IHN0YW5kYXJkX2FjdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgYXR0cmlidXRlOyAgICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgICAgIH0gZXh0ZW5kZWRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSBhY3Rpb247ICAgICAgICAgICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgfSBleHRlbmRlZF9hY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlOworCisvKiogRFBvRSBWZW5kb3IgRXh0ZW5kZWQgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3AuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciAqdmFyczsgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBnZXRfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzOyAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IGdldF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdmFyczsgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBzZXRfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdmFyczsgICAgICAvKio8IFZhcnMuICovCisgICAgICAgIH0gc2V0X3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZSBhY3Rpb25fY29kZTsgICAgLyoqPCBBY3Rpb24gQ29kZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG11bHRpY2FzdF9sbGlkOyAgICAvKio8IE11bHRpY2FzdCBMTElELiAqLworICAgICAgICB9IG1jYXN0X3JlZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUgc3RhdHVzOyAgIC8qKjwgU3RhdHVzLiAqLworICAgICAgICAgICAgdWludDE2X3QgbXVsdGljYXN0X2xsaWQ7ICAgIC8qKjwgTXVsdGljYXN0IExMSUQuICovCisgICAgICAgIH0gbWNhc3RfcmVnX3Jlc3A7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qga2V5X251bWJlcjsgICAgICAgICAvKio8IEtleSBOdW1iZXIuICovCisgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGg7ICAgICAgICAgLyoqPCBLZXkgTGVuZ3RoLiAqLworICAgICAgICAgICAgdWludDhfdCAqa2V5X2RhdGE7ICAgICAgICAgIC8qKjwgS2V5IERhdGEuICovCisgICAgICAgIH0ga2V5X2V4Y2hhbmdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgZmlsZV90cmFuc2ZlcjsgIC8qKjwgRmlsZSBUcmFuc2Zlci4gKi8KKyAgICAgICAgfSBmaWxlX3RyYW5zZmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiBhY3Rpb247ICAgICAgICAgIC8qKjwgQWN0aW9uLiAqLworICAgICAgICAgICAgdWludDE2X3QgbGxpZDsgICAgICAgICAgICAgICAgICAvKio8IExMSUQuICovCisgICAgICAgICAgICB1aW50OF90IGlwc2FbMTZdOyAgICAgICAgICAgICAgIC8qKjwgSVAgU0EuICovCisgICAgICAgICAgICB1aW50OF90IGlwZGFbMTZdOyAgICAgICAgICAgICAgIC8qKjwgSVAgREEuICovCisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBjbGllbnRfbWFjOyAgIC8qKjwgQ2xpZW50IE1hYy4gKi8KKyAgICAgICAgfSBkeW5hbWljX2lwbWNhc3RfY3RybDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUgcmVzdWx0X2NvZGU7ICAvKio8IFJlc3VsdCBDb2RlLiAqLworICAgICAgICB9IGR5bmFtaWNfaXBtY2FzdF9jdHJsX3Jlc3A7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uIGFjdGlvbjsgICAgICAgICAgLyoqPCBBY3Rpb24uICovCisgICAgICAgICAgICB1aW50MTZfdCBsbGlkOyAgICAgIC8qKjwgTExJRC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaXBzYVsxNl07ICAgLyoqPCBJUCBTQS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaXBkYVsxNl07ICAgLyoqPCBJUCBEQS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydDsgICAgICAgLyoqPCBQb3J0LiAqLworICAgICAgICB9IHN0YXRpY19pcG1jYXN0X2N0cmw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlIHJlc3VsdF9jb2RlOyAgLyoqPCBSZXN1bHQgQ29kZS4gKi8KKyAgICAgICAgfSBzdGF0aWNfaXBtY2FzdF9jdHJsX3Jlc3A7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZTsKKworLyoqIFRMUyBWZXJzaW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uCit7CisgICAgdWludDhfdCBtYWpvcjsgIC8qKjwgTWFqb3IuICovCisgICAgdWludDhfdCBtaW5vcjsgIC8qKjwgTWlub3IuICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbjsKKworLyoqIFRMUyBSYW5kb20uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbQoreworICAgIHVpbnQzMl90IHVuaXhfdGltZTsgLyoqPCBVbml4IFRpbWUuICovCisgICAgdWludDhfdCByYW5kb21bMjhdOyAvKio8IFJhbmRvbS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb207CisKKy8qKiBUTFMgU2Vzc2lvbiBJRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZAoreworICAgIHVpbnQ4X3QgbGVuZ3RoOyAgICAgICAgIC8qKjwgTGVuZ3RoLiAqLworICAgIHVpbnQ4X3QgKnNlc3Npb25faWQ7ICAgIC8qKjwgU2Vzc2lvbiBJRC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkOworCisvKiogVExTIENpcGhlcnN1aXRlIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QKK3sKKyAgICB1aW50MTZfdCBsZW5ndGg7ICAgIC8qKjwgTGVuZ3RoLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUgKmNpcGhlcnN1aXRlczsgIC8qKjwgQ2lwaGVyc3VpdGVzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3Q7CisKKy8qKiBUTFMgQ29tcHJlc3Npb24gTGlzdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdAoreworICAgIHVpbnQ4X3QgbGVuZ3RoOyAvKio8IExlbmd0aC4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCAqbWV0aG9kczsgICAgLyoqPCBNZXRob2RzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3Q7CisKKy8qKiBUTFMgQ2VydGlmaWNhdGUgTGlzdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdAoreworICAgIHVpbnQzMl90IGNlcnRpZmljYXRlX2xpc3RfY291bnQ7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGNlcnRpZmljYXRlX2xpc3QuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlICpjZXJ0aWZpY2F0ZV9saXN0OyAgLyoqPCBDZXJ0aWZpY2F0ZSBMaXN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3Q7CisKKy8qKiBUTFMgQ2VydGlmaWNhdGUgVHlwZSBMaXN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QKK3sKKyAgICB1aW50OF90IGxlbmd0aDsgLyoqPCBMZW5ndGguICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlICpjZXJ0aWZpY2F0ZV90eXBlczsgICAgLyoqPCBDZXJ0aWZpY2F0ZSBUeXBlcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3Q7CisKKy8qKiBUTFMgSGFuZHNoYWtlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlIGlkOyAgICAgICAgICAgICAgICAgICAgICAvKio8IElELiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uIHZlcnNpb247ICAgICAgICAgICAgICAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tIHJhbmRvbTsgICAgICAgICAgICAgICAgICAvKio8IFJhbmRvbS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZCBzZXNzaW9uX2lkOyAgICAgICAgICAvKio8IFNlc3Npb24gSUQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QgY2lwaGVyX3N1aXRlczsgLyoqPCBDaXBoZXIgU3VpdGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0IGNvbXByZXNzaW9uX21ldGhvZHM7ICAgLyoqPCBDb21wcmVzc2lvbiBNZXRob2RzLiAqLworICAgICAgICB9IGNsaWVudF9oZWxsbzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uIHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb20gcmFuZG9tOyAgICAgICAgICAgICAgLyoqPCBSYW5kb20uICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgc2Vzc2lvbl9pZDsgICAgICAvKio8IFNlc3Npb24gSUQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlIGNpcGhlcnN1aXRlOyAgICAvKio8IENpcGhlcnN1aXRlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QgY29tcHJlc3Npb25fbWV0aG9kOyAgICAgICAgICAvKio8IENvbXByZXNzaW9uIE1ldGhvZC4gKi8KKyAgICAgICAgfSBzZXJ2ZXJfaGVsbG87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjZXJ0aWZpY2F0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgY2VydGlmaWNhdGVfdHlwZXM7ICAgICAgICAvKio8IENlcnRpZmljYXRlIFR5cGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0IGNlcnRpZmljYXRlX2F1dGhvcml0aWVzOyAgICAvKio8IENlcnRpZmljYXRlIEF1dGhvcml0aWVzLiAqLworICAgICAgICB9IGNlcnRpZmljYXRlX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGhhc2hfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IEhhc2ggU2l6ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmVuY3J5cHRlZF9oYXNoOyAgICAgICAgICAgICAgICAvKio8IEVuY3J5cHRlZCBIYXNoLiAqLworICAgICAgICB9IGNlcnRpZmljYXRlX3ZlcmlmeTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmVuY3J5cHRlZF9wcmVfbWFzdGVyX3NlY3JldDsgICAvKio8IEVuY3J5cHRlZCBQcmUgTWFzdGVyIFNlY3JldC4gKi8KKyAgICAgICAgfSBjbGllbnRfa2V5X2V4Y2hhbmdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2ZXJpZnlfZGF0YV9jb3VudDsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmVyaWZ5X2RhdGEuICovCisgICAgICAgICAgICB1aW50OF90ICp2ZXJpZnlfZGF0YTsgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJpZnkgRGF0YS4gKi8KKyAgICAgICAgfSBmaW5pc2hlZDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlOworCisvKiogVExTIFJlY29yZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgY29udGVudF90eXBlOyAgICAgICAgICAgICAgLyoqPCBDb250ZW50IFR5cGUuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uIHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgaGFuZHNoYWtlX3JlY29yZHNfY291bnQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhbmRzaGFrZV9yZWNvcmRzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgKmhhbmRzaGFrZV9yZWNvcmRzOyAgIC8qKjwgSGFuZHNoYWtlIFJlY29yZHMuICovCisgICAgICAgIH0gaGFuZHNoYWtlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQ7CisKKy8qKiBFQVAgVExTIE1lc3NhZ2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFncyBmbGFnczsgICAgICAgICAgICAvKio8IEZsYWdzLiAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGguICovCisgICAgdWludDMyX3QgdGxzX3JlY29yZHNfY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB0bHNfcmVjb3Jkcy4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCAqdGxzX3JlY29yZHM7ICAgIC8qKjwgVExTIFJlY29yZHMuICovCit9IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2U7CisKKy8qKiBFQVAgVExTIEhlYWRlci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcgoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSBzdWJfdHlwZTsgICAgICAgICAgIC8qKjwgU3ViIFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlIHZhbHVlOyAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBhdXRoZW50aWNhdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcjsKKworLyoqIEVBUCBGcmFtZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGUgY29kZTsgICAgICAgICAgICAgICAgICAvKio8IENvZGUuICovCisgICAgdWludDhfdCBpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJRC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJlc3BvbnNlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZTsKKworLyoqIEVBUE9MIFBEVS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZSB0eXBlOyAgICAgICAgICAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcGFja2V0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdTsKKworLyoqIEVBUE9MIFByb3RvY29sLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb24gdmVyc2lvbjsgICAgICAvKio8IFZlcnNpb24uICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1IHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGRlZjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbDsKKworLyoqIFZMQU4gVmFsdWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZQoreworICAgIHVpbnQ4X3QgcGNwOyAgICAvKio8IFBDUC4gKi8KKyAgICB1aW50OF90IGNmaTsgICAgLyoqPCBDRkkuICovCisgICAgdWludDE2X3QgdmlkOyAgIC8qKjwgVklELiAqLworfSBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZTsKKworLyoqIEktVGFnIFZhbHVlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWUKK3sKKyAgICB1aW50OF90IHBjcDsgICAgLyoqPCBQQ1AuICovCisgICAgdWludDhfdCBkZWk7ICAgIC8qKjwgREVJLiAqLworICAgIHVpbnQ4X3QgdWNhOyAgICAvKio8IFVDQS4gKi8KKyAgICB1aW50OF90IHJlczsgICAgLyoqPCBSRVMuICovCisgICAgdWludDMyX3QgaXNpZDsgIC8qKjwgSS1TSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlOworCisvKiogVGVrIEluZm8gVExWLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdgoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZSB0eXBlOyAgICAgICAgICAgICAgICAgLyoqPCBUeXBlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXMgcmVwb3J0X21vZGU7ICAgLyoqPCBGb3IgdGhlIE9MVCB0aGVzZSBhcmUgdGhlIHN1cHBvcnRlZCBtb2RlcyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXMgcHJlZmVycmVkX3JlcG9ydF9tb2RlOyAvKio8IE9ubHkgc2VudCBieSBPTFQgKi8KKyAgICAgICAgfSBleHRlbnNpb25fc3VwcG9ydDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHY7CisKKy8qKiBPcmdhbml6YXRpb24gU3BlY2lmaWMgSW5mby4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbworeworICAgIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aSBvdWk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT1VJLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiB0bHZzOyAgICAgICAgICAgICAgICAgIC8qKjwgVExWcy4gKi8KKyAgICAgICAgfSB0ZWs7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZXh0ZW5zaW9uX3N1cHBvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEV4dGVuc2lvbiBTdXBwb3J0LiAqLworICAgICAgICAgICAgdWludDhfdCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHN1cHBfdmVyc2lvbl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBzdXBwX3ZlcnNpb24uICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIgKnN1cHBfdmVyc2lvbjsgLyoqPCBTdXBwIFZlcnNpb24uICovCisgICAgICAgIH0gY3RjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3RsdiBkcG9lX2luZm9fdGx2OyAgICAgICAgLyoqPCBEUG9FIEluZm8gVExWLiAqLworICAgICAgICB9IGRwb2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm87CisKKy8qKiBMb2NhbC9SZW1vdGUgSW5mb3JtYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8KK3sKKyAgICB1aW50OF90IG9hbV92ZXJzaW9uOyAgICAvKio8IE9BTSBWZXJzaW9uLiAqLworICAgIHVpbnQxNl90IHJldmlzaW9uOyAgICAgIC8qKjwgUmV2aXNpb24uICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3N0YXRlIHN0YXRlOyAgICAgICAgICAvKio8IFN0YXRlLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19jb25maWcgb2FtX2NvbmZpZzsgICAgLyoqPCBPQU0gQ29uZmlndXJhdGlvbi4gKi8KKyAgICB1aW50MTZfdCBtYXhfcGR1X3NpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBNYXggUERVIFNpemUuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsgICAgIC8qKjwgT1VJLiAqLworICAgIHVpbnQ4X3QgdmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uWzRdOyAvKio8IFZlbmRvciBTcGVjaWZpYyBJbmZvcm1hdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvOworCisvKiogSW5mbyBUTFYgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGUgdHlwZTsgLyoqPCBUeXBlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvIHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gb3JnYW5pemF0aW9uX3NwZWNpZmljOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8gaW5mbzsgLyoqPCBJbmZvLiAqLworICAgICAgICB9IHJlbW90ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvIGluZm87IC8qKjwgSW5mby4gKi8KKyAgICAgICAgfSBsb2NhbDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlOworCisvKiogT3JnYW5pemF0aW9uIFNwZWNpZmljIExpbmsgRXZlbnQgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsgICAgICAgICAgICAgICAgIC8qKjwgT1VJLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlIGFsYXJtX2NvZGU7ICAvKio8IEFsYXJtIENvZGUuICovCisgICAgICAgICAgICBiY21vc19ib29sIHJhaXNlZDsgIC8qKjwgUmFpc2VkLiAqLworICAgICAgICAgICAgdWludDE2X3QgcG9ydDsgICAgICAvKio8IFBvcnQuICovCisgICAgICAgICAgICB1aW50MTZfdCBsaW5rOyAgICAgIC8qKjwgTGluay4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHF1ZXVlOyAgICAgLyoqPCBRdWV1ZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCBhbGFybV9jb250ZXh0OyAgICAvKio8IEFsYXJtIENvbnRleHQuICovCisgICAgICAgIH0gdGVrOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlIHZhbHVlOyAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBkcG9lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5IHZhbHVlOyAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjdGM7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZTsKKworLyoqIExpbmsgRXZlbnQgVExWIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGUgdHlwZTsgICAvKio8IFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBlbmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9yZ2FuaXphdGlvbl9zcGVjaWZpYzsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlOworCisvKiogVmFyIERlc2NyaXB0b3IgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2ggYnJhbmNoOyAgICAgICAgICAgICAgICAgIC8qKjwgQnJhbmNoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGVhZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBlbmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3QgbGVhZjsgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IG9iamVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2UgbGVhZjsgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gcGFja2FnZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZyBsZWFmOyAvKio8IExlYWYuICovCisgICAgICAgIH0gbmFtZV9iaW5kaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGFjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlOworCisvKiogVmFyIENvbnRhaW5lciBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoIGJyYW5jaDsgICAgICAgICAgICAgIC8qKjwgQnJhbmNoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGVhZjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdCBsZWFmOyAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZhbHVlOyAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZSBsZWFmOyAgLyoqPCBMZWFmLiAqLworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhbHVlLiAqLworICAgICAgICAgICAgdWludDhfdCAqdmFsdWU7ICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBwYWNrYWdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nIGxlYWY7IC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZhbHVlOyAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbmFtZV9iaW5kaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZhbHVlOyAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgLyoqPCBMZWFmLiAqLworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhbHVlLiAqLworICAgICAgICAgICAgdWludDhfdCAqdmFsdWU7ICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBhY3Rpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlOworCisvKiogVGVrIE9iamVjdCBRdWV1ZSBOYW1lLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZQoreworICAgIHVpbnQxNl90IHBvcnRfbnVtYmVyOyAgIC8qKjwgUG9ydCBOdW1iZXIuICovCisgICAgdWludDE2X3QgbGlua19udW1iZXI7ICAgLyoqPCBMaW5rIE51bWJlci4gKi8KKyAgICB1aW50MTZfdCBxdWV1ZV9udW1iZXI7ICAvKio8IFF1ZXVlIE51bWJlci4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZTsKKworLyoqIFRlayBPYmplY3QgQ29udGV4dC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlIG9iamVjdF90eXBlOyAgICAvKio8IE9iamVjdCBUeXBlLiAqLworICAgIHVpbnQ4X3QgbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbGlua19udW1iZXJfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGxpbmtfbnVtYmVyLiAqLworICAgICAgICAgICAgdWludDhfdCAqbGlua19udW1iZXI7ICAgICAgIC8qKjwgTGluayBOdW1iZXIuICovCisgICAgICAgIH0gbG9naWNhbF9saW5rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHF1ZXVlX25hbWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfbnVtYmVyX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBvcnRfbnVtYmVyLiAqLworICAgICAgICAgICAgdWludDhfdCAqcG9ydF9udW1iZXI7ICAgLyoqPCBQb3J0IE51bWJlci4gKi8KKyAgICAgICAgfSBwb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGFsbF9xdWV1ZXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvbl9udW1iZXJfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBvbl9udW1iZXIuICovCisgICAgICAgICAgICB1aW50OF90ICpwb25fbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUE9OIE51bWJlci4gKi8KKyAgICAgICAgfSBuZXR3b3JrX3BvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcG9uX251bWJlcl9jb3VudDsgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwb25fbnVtYmVyLiAqLworICAgICAgICAgICAgdWludDhfdCAqcG9uX251bWJlcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBPTiBOdW1iZXIuICovCisgICAgICAgIH0gdXNlcl9wb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiBkaXJlY3Rpb247ICAgLyoqPCBEaXJlY3Rpb24uICovCisgICAgICAgIH0gZmxvd19kaXJlY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGJyaWRnZV9udW1iZXJfY291bnQ7ICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYnJpZGdlX251bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmJyaWRnZV9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBCcmlkZ2UgTnVtYmVyLiAqLworICAgICAgICB9IGJyaWRnZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcG9ydF9udW1iZXJfY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwb3J0X251bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnBvcnRfbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQb3J0IE51bWJlci4gKi8KKyAgICAgICAgfSBicmlkZ2VfcG9ydDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQ7CisKKy8qKiBUZWsgVmFyIERlc2NyaXB0b3IuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggYnJhbmNoOyAgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dCBvYmplY3RfY29udGV4dDsgIC8qKjwgT2JqZWN0IENvbnRleHQuICovCisgICAgICAgIH0gbmFtZV9iaW5kaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlIGFsYXJtX2NvZGU7ICAgICAgICAgIC8qKjwgQWxhcm0gQ29kZS4gKi8KKyAgICAgICAgfSBhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcjsKKworLyoqIExVRSBGaWVsZCBTZWxlY3QgRW50cnkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeQoreworICAgIHVpbnQ4X3QgbGF5ZXJfc2VsZWN0OyAgIC8qKjwgTGF5ZXIgU2VsZWN0LiAqLworICAgIHVpbnQ4X3QgZHdvcmRfb2Zmc2V0OyAgIC8qKjwgRHdvcmQgb2Zmc2V0LiAqLworICAgIHVpbnQ4X3QgZmllbGRfbGVuZ3RoOyAgIC8qKjwgRmllbGQgTGVuZ3RoLiAqLworICAgIHVpbnQ4X3QgYml0X29mZnNldDsgICAgIC8qKjwgQml0IG9mZnNldC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnk7CisKKy8qKiBUZWsgT05VIFJ1bGUgQ2xhdXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3QgZmllbGRfc2VsZWN0OyAgLyoqPCBGaWVsZCBTZWxlY3QuICovCisgICAgdWludDY0X3QgbG9va3VwX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb2t1cCBWYWx1ZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yIG9wOyAgIC8qKjwgT3AuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlOworCisvKiogVGVrIE9OVSBSdWxlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZQoreworICAgIHVpbnQ4X3QgZGlyZWN0aW9uOyAgLyoqPCBEaXJlY3Rpb24uICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFncyBmbGFnczsgICAvKio8IEZsYWdzLiAqLworICAgIHVpbnQ4X3QgcG9ydF9saW5rOyAgLyoqPCBQb3J0L0xpbmsuICovCisgICAgdWludDhfdCBxdWV1ZTsgICAgICAvKio8IFF1ZXVlLiAqLworICAgIHVpbnQxNl90IHZpZF9jb3M7ICAgLyoqPCBWSUQvQ29TLiAqLworICAgIHVpbnQ4X3QgcmVzZXJ2ZWQ7ICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICB1aW50OF90IHByZWNlZGVuY2U7IC8qKjwgUHJlY2VkZW5jZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbiBhY3Rpb247ICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICB1aW50OF90IGNsYXVzZXNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENsYXVzZXMgQ291bnQuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgKmNsYXVzZXM7ICAgLyoqPCBDbGF1c2VzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlOworCisvKiogVGVrIE9OVSBJR01QIFZMQU4uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW4KK3sKKyAgICBiY21vc192bGFuX3RhZyBlcG9uX3ZsYW47ICAgLyoqPCBFUE9OIFZMQU4uICovCisgICAgYmNtb3Nfdmxhbl90YWcgdXNlcl92bGFuOyAgIC8qKjwgVXNlciBWTEFOLiAqLworICAgIHVpbnQ4X3QgbWF4X2FsbG93ZWRfZ3JvdXBzOyAvKio8IE1heCBBbGxvd2VkIEdyb3Vwcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuOworCisvKiogVGVrIFZMQU4gRGVzdGluYXRpb24gTWFwcGluZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nCit7CisgICAgYmNtb3Nfdmxhbl90YWcgdmxhbl90YWc7ICAgIC8qKjwgVkxBTiBUYWcuICovCisgICAgdWludDhfdCBsaW5rX2luZGV4OyAgICAgICAgIC8qKjwgTGluayBJbmRleC4gKi8KKyAgICB1aW50OF90IHF1ZXVlX2luZGV4OyAgICAgICAgLyoqPCBRdWV1ZSBJbmRleC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmc7CisKKy8qKiBMb2FkIFRpbWVzdGFtcCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAKK3sKKyAgICB1aW50MTZfdCB5ZWFyOyAgLyoqPCBZZWFyLiAqLworICAgIHVpbnQ4X3QgbW9udGg7ICAvKio8IE1vbnRoLiAqLworICAgIHVpbnQ4X3QgZGF5OyAgICAvKio8IERheS4gKi8KKyAgICB1aW50OF90IGhvdXI7ICAgLyoqPCBIb3VyLiAqLworICAgIHVpbnQ4X3QgbWluOyAgICAvKio8IE1pbi4gKi8KKyAgICB1aW50OF90IHNlYzsgICAgLyoqPCBTZWMuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wOworCisvKiogUnVsZSBFbnRyeS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5Cit7CisgICAgdWludDE2X3QgbGVhcm5pbmdfZG9tYWluOyAgIC8qKjwgTGVhcm5pbmcgRG9tYWluLiAqLworICAgIHVpbnQ4X3Qgc3RhdDsgICAgICAgICAgICAgICAvKio8IFN0YXRpYy4gKi8KKyAgICB1aW50OF90IHJpZ2h0X21hc2s7ICAgICAgICAgLyoqPCBSaWdodCBNYXNrLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUgYmluc2VsZWN0OyAgICAgICAgICAgICAvKio8IEJpblNlbGVjdC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjIHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGRhOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcCB2YWx1ZTsgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3NtX3BsdXNfaXBkYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGUgdmFsdWU7ICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHByb2dfZmllbGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZCB2YWx1ZTsgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjdmxhbl92aWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbiB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdmxhbl92aWRfY3ZsYW5fdmlkOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnk7CisKKy8qKiBUZWsgQXR0cmlidXRlIFZhbHVlIFJ1bGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZSBsZWFmOyAvKio8IExlYWYuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHByaW9yaXR5OyAgICAgICAvKio8IFByaW9yaXR5LiAqLworICAgICAgICB9IGhlYWRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0IGZpZWxkX3NlbGVjdDsgLyoqPCBGaWVsZCBTZWxlY3QuICovCisgICAgICAgICAgICB1aW50OF90IGZpZWxkX2luc3RhbmNlOyAgICAgICAgICAgICAgICAgLyoqPCBGaWVsZCBJbnN0YW5jZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbXNiX21hc2s7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1TQiBNYXNrLiAqLworICAgICAgICAgICAgdWludDhfdCBsc2JfbWFzazsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTFNCIE1hc2suICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvciBvcGVyYXRvcjsgLyoqPCBPcGVyYXRvci4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IG1hdGNoX3ZhbHVlX2NvdW50OyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtYXRjaF92YWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKm1hdGNoX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAvKio8IE1hdGNoIFZhbHVlLiAqLworICAgICAgICB9IGNsYXVzZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3J1bGVfYWN0aW9uIHJlc3VsdDsgICAgIC8qKjwgUmVzdWx0LiAqLworICAgICAgICAgICAgdWludDMyX3QgcGFyYW1ldGVyX2NvdW50OyAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBhcmFtZXRlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnBhcmFtZXRlcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFBhcmFtZXRlci4gKi8KKyAgICAgICAgfSByZXN1bHQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5IHZhbHVlOyAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVudHJ5OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZTsKKworLyoqIFVuaSBTaGFwZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlcgoreworICAgIHVpbnQzMl90IHF1ZXVlX2JpdG1hcDsgIC8qKjwgUXVldWUgQml0bWFwLiAqLworICAgIHVpbnQzMl90IHNoYXBlX3JhdGU7ICAgIC8qKjwgVW5pdHMgMiBrYnBzICovCisgICAgdWludDE2X3QgYnVyc3Rfc2l6ZTsgICAgLyoqPCBVbml0IDI1NiBieXRlcyAqLworfSBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlcjsKKworLyoqIERldGFpbGVkIHZlcnNpb24gbnVtYmVyIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIKK3sKKyAgICB1aW50OF90IG1ham9yOyAgLyoqPCBNYWpvciB2ZXJzaW9uIG51bWJlciAqLworICAgIHVpbnQ4X3QgbWlub3I7ICAvKio8IE1pbm9yIHZlcnNpb24gbnVtYmVyICovCisgICAgdWludDE2X3QgcGF0Y2g7IC8qKjwgUGF0Y2ggcmV2aXNpb24gbnVtYmVyICovCit9IGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcjsKKworLyoqIEV4dGVuZGVkIExvYWQgTGFiZWwuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbAoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHkgbWF0dXJpdHk7ICAgICAgICAgICAgICAvKio8IE1hdHVyaXR5LiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlciB2ZXJzaW9uOyAgICAvKio8IFZlcnNpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsOworCisvKiogRmlsZSBJbmZvIEZpcm13YXJlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZQoreworICAgIHVpbnQxNl90IGxlZ2FjeV92ZXJzaW9uOyAgICAvKio8IExlZ2FjeSBWZXJzaW9uLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsIG5ld192ZXJzaW9uOyAgICAvKio8IE5ldyBWZXJzaW9uLiAqLworICAgIHVpbnQzMl90IHN0cmVhbTsgICAgLyoqPCBTdHJlYW0uICovCisgICAgdWludDMyX3QgcmV2aXNpb247ICAvKio8IFJldmlzaW9uLiAqLworICAgIHVpbnQzMl90IGNyYzsgICAgICAgLyoqPCBDUkMuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAgdGltZXN0YW1wOyAgIC8qKjwgVGltZXN0YW1wLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlOworCisvKiogRmlsZSBJbmZvIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlIGZpbGVfdHlwZTsgICAgICAgICAgICAgICAgLyoqPCBGaWxlIFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlIGluZm87ICAgIC8qKjwgSW5mby4gKi8KKyAgICAgICAgfSBib290OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlIGluZm87ICAgIC8qKjwgSW5mby4gKi8KKyAgICAgICAgfSBhcHBfbWFpbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZSBpbmZvOyAgICAvKio8IEluZm8uICovCisgICAgICAgIH0gYXBwX2JhY2t1cDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZTsKKworLyoqIE9BTSBFUG9DIEJpdCBMb2FkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkCit7CisgICAgdWludDhfdCBpZHg7ICAgIC8qKjwgQmFuZCBpbmRleCAqLworICAgIHVpbnQ4X3QgdmFsdWU7ICAvKio8IExvYWRpbmcgVmFsdWUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkOworCisvKiogT2FtIEVwb2MgQml0IExvYWRpbmcuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWQgbG9hZFszMl07IC8qKjwgTG9hZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nOworCisvKiogT2FtIEVwb2MgU3RhdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0Cit7CisgICAgdWludDE2X3QgaWR4OyAgICAgICAgICAgLyoqPCBTdGF0aXN0aWMgaW5kZXggKi8KKyAgICB1aW50MzJfdCB2YWx1ZV9jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YWx1ZS4gKi8KKyAgICB1aW50OF90ICp2YWx1ZTsgICAgICAgICAvKio8IFN0YXRpc3RpYyB2YWx1ZSAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdDsKKworLyoqIERlZmluZXMgYSBsaW5rL3BvcnQgcHJpb3JpdHkgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkKK3sKKyAgICB1aW50OF90IGxldmVsOyAgICAgICAgICAvKio8IFByaW9yaXR5IGxldmVsIG9mIHRoaXMgcHJpb3JpdHkgKi8KKyAgICB1aW50OF90IHdlaWdodDsgICAgICAgICAvKio8IFBlcmNlbnRhZ2Ugd2VpZ2h0IG9mIHRoaXMgcHJpb3JpdHkgKDAgZm9yIFNQKSAqLworICAgIHVpbnQ4X3QgcXVldWVfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIHF1ZXVlcyBhdCB0aGlzIHByaW9yaXR5ICovCisgICAgdWludDE2X3QgKnF1ZXVlX3NpemVzOyAgLyoqPCBRdWV1ZSBzaXplcyAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5OworCisvKiogVGVrIFF1ZXVlIENvbmZpZyBWMiBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlIHN1YnR5cGU7ICAgICAvKio8IFR5cGUgb2YgZGF0YSBpbiB0aGlzIHZhcmlhYmxlIGNvbnRhaW5lciAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZSByZXBvcnRfY29uZmlnOyAgLyoqPCBSZXBvcnRpbmcgbW9kZSBmb3IgT05VICovCisgICAgICAgIH0gaGVhZGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHByaW9yaXR5X2NvdW50OyAvKio8IE51bWJlciBvZiBwcmlvcml0aWVzIGZvciB0aGlzIGxpbmsgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkgKnByaW9yaXRpZXM7ICAgIC8qKjwgRGVmaW5pdGlvbiBvZiBwcmlvcml0aWVzICovCisgICAgICAgIH0gbGluazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBwcmlvcml0eV9jb3VudDsgLyoqPCBOdW1iZXIgb2YgcHJpb3JpdGllcyBmb3IgdGhpcyBwb3J0ICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICpwcmlvcml0aWVzOyAgICAvKio8IERlZmluaXRpb24gb2YgcHJpb3JpdGllcyAqLworICAgICAgICB9IHBvcnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2U7CisKKy8qKiBUZWsgU2VxdWVuY2UgTnVtYmVyLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXIKK3sKKyAgICBiY21vc19ib29sIGVuZF9vZl9zZXF1ZW5jZTsgLyoqPCBFbmQgb2Ygc2VxdWVuY2UuICovCisgICAgdWludDE2X3Qgc2VxdWVuY2VfbnVtYmVyOyAgIC8qKjwgU2VxdWVuY2UgTnVtYmVyLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcjsKKworLyoqIE9OVSBDbG9jayBUcmFuc3BvcnQgQ29uZmlnLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkga2V5OyAgICAvKio8IEtleS4gKi8KKyAgICBiY21vc19ib29sIHJlX2luaXQ7ICAgICAgICAgICAgIC8qKjwgUmUtIEluaXQuICovCisgICAgYmNtb3NfYm9vbCB0b2RfZW5hYmxlOyAgICAgICAgICAvKio8IFRPRCBFbmFibGUuICovCisgICAgYmNtb3NfYm9vbCBvbmVfcHBzX2VuYWJsZTsgICAgICAvKio8IDFQUFMgRW5hYmxlLiAqLworICAgIGludDMyX3Qgb25lX3Bwc19vZmZzZXQ7ICAgICAgICAgLyoqPCAxUFBTIE9mZnNldC4gKi8KKyAgICB1aW50MzJfdCByb3VuZF90cmlwX3RpbWU7ICAgICAgIC8qKjwgUm91bmQgVHJpcCBUaW1lLiAqLworICAgIHVpbnQzMl90IG9uZV9wcHNfaGFsZl9wZXJpb2Q7ICAgLyoqPCAxUFBTIEhhbGYgUGVyaW9kLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWc7CisKKy8qKiBPQU0gTWNhc3QgRG9tYWluIFBvcnQgSW5mby4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbworeworICAgIHVpbnQ4X3QgcG9ydDsgICAgICAgICAgIC8qKjwgUG9ydC4gKi8KKyAgICB1aW50OF90IGdyb3VwX2xpbWl0OyAgICAvKio8IEdyb3VwIExpbWl0LiAqLworICAgIHVpbnQ4X3QgZmNfbGltaXQ7ICAgICAgIC8qKjwgRm9yIGxhdGVyIHVzZSAqLworICAgIHVpbnQ4X3QgYWN0aW9uOyAgICAgICAgIC8qKjwgRm9yIGxhdGVyIHVzZSAqLworICAgIHVpbnQxNl90IHVwX2Vwb25fdmlkOyAgIC8qKjwgVXAgRVBPTiBWaWQuICovCisgICAgdWludDE2X3QgdXBfdW5pX3ZpZDsgICAgLyoqPCBVcCBVbmkgVmlkLiAqLworICAgIHVpbnQ4X3QgdXBfbGluazsgICAgICAgIC8qKjwgTm90IHBvcnQgcmVsYXRpdmUgKi8KKyAgICB1aW50OF90IGRucTsgICAgICAgICAgICAvKio8IERuUS4gKi8KKyAgICB1aW50OF90IHVwcTsgICAgICAgICAgICAvKio8IFVwUS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvOworCisvKiogT2FtIE1jYXN0IERvbWFpbiBJbmZvLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbworeworICAgIHVpbnQ4X3QgaWQ7ICAgICAgICAgLyoqPCBJRC4gKi8KKyAgICB1aW50OF90IGRuX2xpbms7ICAgIC8qKjwgRG4gTGluay4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbiBvcHRpb25zOyAgICAgIC8qKjwgT3B0aW9ucy4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIgZndkX3F1YWw7IC8qKjwgRndkIFF1YWwuICovCisgICAgdWludDhfdCByZXNlcnZlZDsgICAgICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICB1aW50OF90IGFjdGlvbjsgICAgICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICB1aW50MTZfdCBkbl9lcG9uX3ZpZDsgICAvKio8IERuIEVQT04gVmlkLiAqLworICAgIHVpbnQxNl90IGRuX3VuaV92aWQ7ICAgIC8qKjwgRG4gVW5pIFZpZC4gKi8KKyAgICB1aW50OF90IG51bV9wb3J0OyAgICAgICAvKio8IE51bSBQb3J0LiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyAqcG9ydF9pbmZvOyAgLyoqPCBQb3J0IEluZm8uICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm87CisKKy8qKiBPYW0gTWNhc3QgRG9tYWluIFJlY29yZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZAoreworICAgIHVpbnQ4X3QgbnVtX2RvbWFpbnM7ICAgIC8qKjwgTnVtIERvbWFpbnMuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyAqZG9tYWluOyAgLyoqPCBEb21haW4uICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZDsKKworLyoqIFRlayBBdHRyaWJ1dGUgVmFsdWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAgLyoqPCBMZWFmLiAqLworICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGlkeDsgICAgLyoqPCBJbmRleC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5IGRlZjsgLyoqPCBEZWZhdWx0LiAqLworICAgICAgICB9IGx1ZV9maWVsZF9zZWxlY3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2ZyYW1lc190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfc2luZ2xlX2NvbGxfZnJhbWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19tdWx0aXBsZV9jb2xsX2ZyYW1lczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfZnJhbWVzX3J4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19mY3NfZXJyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19hbGlnbl9lcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX29jdGV0c190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfbGF0ZV9jb2xsaXNpb25zOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19leGNlc3NpdmVfY29sbGlzaW9uczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfb2N0ZXRzX3J4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19tY2FzdF9mcmFtZXNfdHhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2JjYXN0X2ZyYW1lc190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfbWNhc3RfZnJhbWVzX3J4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19iY2FzdF9mcmFtZXNfcnhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2luX3JhbmdlX2xlbl9lcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2ZyYW1lX3Rvb19sb25nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGVuYWJsZWQ7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlZC4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2VuYWJsZV9zdGF0dXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfcGh5X3N5bWJvbF9lcnJfZHVyaW5nX2NhcnJpZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2N0cmxfcGF1c2VfdHg7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2N0cmxfcGF1c2Vfcng7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfb2FtX2xvY2FsX2Vycl9mcmFtZV9zZWNzX2V2ZW50OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX29hbV9lbXVsX2NyYzhlcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbXBjcF9tYWNfY3RybF9mcmFtZXNfdHg7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbXBjcF9tYWNfY3RybF9mcmFtZXNfcng7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbXBjcF90eF9yZWdfYWNrOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21wY3BfdHhfcmVnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbXBjcF90eF9yZXBvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbXBjcF9yeF9nYXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21wY3BfcnhfcmVnaXN0ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRhYmxlX3NpemU7ICAgICAgICAgICAgLyoqPCBUYWJsZSBTaXplLiAqLworICAgICAgICB9IGR5bl9sZWFybl90Ymxfc2l6ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYWdlX2xpbWl0OyAgICAgICAgICAgICAvKio8IEFnZSBMaW1pdC4gKi8KKyAgICAgICAgfSBkeW5fbGVhcm5fYWdlX2xpbWl0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfdW5pY2FzdF9mcmFtZXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF91bmljYXN0X2ZyYW1lczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X2ZyYW1lX3Rvb19zaG9ydDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X2ZyYW1lNjQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9mcmFtZTY1dG8xMjc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9mcmFtZTEyOHRvMjU1OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfZnJhbWUyNTZ0bzUxMTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X2ZyYW1lNTEydG8xMDIzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfZnJhbWUxMDI0dG8xNTE4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfZnJhbWUxNTE5cGx1czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2ZyYW1lNjQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTY1dG8xMjc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTEyOHRvMjU1OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfZnJhbWUyNTZ0bzUxMTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2ZyYW1lNTEydG8xMDIzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfZnJhbWUxMDI0dG8xNTE4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfZnJhbWUxNTE5cGx1czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBkZWxheV90aHJlc2hvbGQ7ICAgICAgICAvKio8IERlbGF5IFRocmVzaG9sZC4gKi8KKyAgICAgICAgfSB0eF9kZWxheV90aHJlc2hvbGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGRlbGF5OyAgICAgICAgICAgICAgICAgLyoqPCBEZWxheS4gKi8KKyAgICAgICAgfSB0eF9kZWxheTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2ZyYW1lc19kcm9wcGVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfYnl0ZXNfZHJvcHBlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2J5dGVzX2RlbGF5ZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF9ieXRlc191bnVzZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZGVsYXlfdGhyZXNob2xkOyAgICAgICAgLyoqPCBEZWxheSBUaHJlc2hvbGQuICovCisgICAgICAgIH0gcnhfZGVsYXlfdGhyZXNob2xkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBkZWxheTsgICAgICAgICAgICAgICAgIC8qKjwgRGVsYXkuICovCisgICAgICAgIH0gcnhfZGVsYXk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9mcmFtZXNfZHJvcHBlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X2J5dGVzX2Ryb3BwZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9ieXRlc19kZWxheWVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBzdGF0aXN0aWNfaWQ7ICAgICAgICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgICAgICAgICAgdWludDMyX3QgcmlzaW5nX3RocmVzaG9sZDsgICAgICAvKio8IFJpc2luZyBUaHJlc2hvbGQuICovCisgICAgICAgICAgICB1aW50MzJfdCBmYWxsaW5nX3RocmVzaG9sZDsgICAgIC8qKjwgRmFsbGluZyBUaHJlc2hvbGQuICovCisgICAgICAgIH0gcG9ydF9zdGF0X3RocmVzaG9sZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgc3RhdGlzdGljX2lkOyAgICAgICAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHJpc2luZ190aHJlc2hvbGQ7ICAgICAgLyoqPCBSaXNpbmcgVGhyZXNob2xkLiAqLworICAgICAgICAgICAgdWludDMyX3QgZmFsbGluZ190aHJlc2hvbGQ7ICAgICAvKio8IEZhbGxpbmcgVGhyZXNob2xkLiAqLworICAgICAgICB9IGxpbmtfc3RhdF90aHJlc2hvbGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpbWU7ICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lLiAqLworICAgICAgICB9IGVuY3J5cHRfa2V5X2V4cGlyeV90aW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGxlbl9lcnJvcl9kaXNjYXJkOyAgICAgIC8qKjwgTGVuIEVycm9yIERpc2NhcmQuICovCisgICAgICAgIH0gbGVuX2Vycm9yX2Rpc2NhcmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRocmVzaG9sZHNfY291bnQ7ICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhyZXNob2xkcy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90ICp0aHJlc2hvbGRzOyAgICAgICAgICAgLyoqPCBUaHJlc2hvbGRzLiAqLworICAgICAgICB9IHJlcG9ydF90aHJlc2hvbGRzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCB2bGFuX2V0aGVyX3R5cGU7ICAgICAgIC8qKjwgVmxhbiBFdGhlclR5cGUuICovCisgICAgICAgICAgICBiY21vc19ib29sIHVzZV9mb3JfdXBzdHJlYW07ICAgIC8qKjwgVXNlIEZvciBVcHN0cmVhbS4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgdXNlX2Zvcl9kb3duc3RyZWFtOyAgLyoqPCBVc2UgRm9yIERvd25zdHJlYW0uICovCisgICAgICAgIH0gdmxhbl9ldGhlcnR5cGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGN1cnJlbnRfY2FwczsgICAgICAgICAgLyoqPCBDdXJyZW50IENhcHMuICovCisgICAgICAgICAgICB1aW50MTZfdCBwaHlzaWNhbF9jYXBzOyAgICAgICAgIC8qKjwgUGh5c2ljYWwgQ2Fwcy4gKi8KKyAgICAgICAgfSBwb3J0X2NhcGFiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2NvdW50OyAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcnVsZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICpydWxlczsgICAgICAgIC8qKjwgUnVsZXMuICovCisgICAgICAgIH0gbmV3X2RuX2ZpbHRlcl90Ymw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcnVsZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICpydWxlczsgICAgICAgIC8qKjwgUnVsZXMuICovCisgICAgICAgIH0gbmV3X3VwX2ZpbHRlcl90Ymw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGRlc3RpbmF0aW9uX2JpdG1hcDsgICAgICAgICAgICAgICAgLyoqPCBEZXN0aW5hdGlvbiBCaXRtYXAuICovCisgICAgICAgIH0gYXJwX3JlcGxpY2F0ZV9kZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBkZXN0aW5hdGlvbl9iaXRtYXA7ICAgICAgICAgICAgICAgIC8qKjwgRGVzdGluYXRpb24gQml0bWFwLiAqLworICAgICAgICB9IGxhY3BfZGVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBhY3Rpb25fZm9yX3VubWFuX2dycDsgICAgICAgICAgICAgICAvKio8IEFjdGlvbiBGb3IgVW5tYW4gR3JwLiAqLworICAgICAgICAgICAgdWludDhfdCB2bGFuc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZsYW5zIENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuICp2bGFuczsgICAvKio8IFZsYW5zLiAqLworICAgICAgICB9IG9udV9pZ21wX3ZsYW47CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGVhcm5pbmdfbW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWFybmluZyBNb2RlLiAqLworICAgICAgICB9IGR5bl9sZWFybmluZ19tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAvKio8IExpbWl0LiAqLworICAgICAgICB9IG1pbl9tYWNfbGltaXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGltaXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGltaXQuICovCisgICAgICAgIH0gb251X2FnZ3JlZ2F0ZV9saW1pdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZGF0YV9jb3VudDsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZGF0YS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGF0YS4gKi8KKyAgICAgICAgfSBudnNfc2NyYXRjaHBhZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBmbG9vZF91bmtub3duX29wdDsgICAgICAgICAgLyoqPCBGbG9vZCBVbmtub3duIE9wdC4gKi8KKyAgICAgICAgfSBmbG9vZF91bmtub3duOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGxvY2FsX3N3aXRjaF9vcHQ7ICAgICAgICAgICAvKio8IExvY2FsIFN3aXRjaCBPcHQuICovCisgICAgICAgIH0gbG9jYWxfc3dpdGNoaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGRvd25fYnVyc3RfdG9sbF9vcHQ7ICAgICAgICAvKio8IERvd24gQnVyc3QgVG9sbCBPcHQuICovCisgICAgICAgIH0gZG93bl9idXJzdF90b2xsOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fZmVjOyAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gRkVDLiAqLworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9mZWM7ICAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBGRUMuICovCisgICAgICAgIH0gZmVjX21vZGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHRlbXBlcmF0dXJlOyAgICAgICAgICAgICAgIC8qKjwgVGVtcGVyYXR1cmUuICovCisgICAgICAgIH0gcG93ZXJfbW9uX3RlbXBlcmF0dXJlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2Y2M7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZDQy4gKi8KKyAgICAgICAgfSBwb3dlcl9tb25fdmNjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBiaWFzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IEJpYXMuICovCisgICAgICAgIH0gcG93ZXJfbW9uX3R4X2JpYXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHBvd2VyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgUG93ZXIuICovCisgICAgICAgIH0gcG93ZXJfbW9uX3R4X3Bvd2VyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBwb3dlcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFBvd2VyLiAqLworICAgICAgICB9IHBvd2VyX21vbl9yeF9wb3dlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBuZXR3b3JrX2Vwb25fcG9ydHNfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gTmV0d29yayBFUE9OIFBvcnRzICovCisgICAgICAgICAgICB1aW50OF90ICpuZXR3b3JrX2Vwb25fcG9ydHM7ICAgICAgICAvKio8IE5ldHdvcmsgRVBPTiBQb3J0cy4gKi8KKyAgICAgICAgfSBuZXR3b3JrX3Bvbl9tYXA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfcHNzdGF0ZSBzdGF0ZTsgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gcHNzdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBmaWVsZF9zZWxlY3Q7ICAgICAgICAgICAgICAgLyoqPCBUaGUgZmllbGQgc2VsZWN0IHRvIHVzZSBmb3IgU0xFICgwIG1lYW5zIGRpc2FibGUpICovCisgICAgICAgIH0gc2xlX21vZGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZSBsZWFybl90YWJsZV9tb2RlOyAgLyoqPCBMZWFybiBUYWJsZSBNb2RlLiAqLworICAgICAgICB9IGxlYXJuX3RhYmxlX21vZGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgc2lnbmFsX2RldGVjdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2hldGhlciBvciBub3Qgc2lnbmFsIGlzIGRldGVjdGVkICovCisgICAgICAgIH0gdHJhbnNjZWl2ZXJfc2lnbmFsX2RldGVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB1c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50OyAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXNlciBQb3J0IFRvIE5ldHdvcmsgUG9ydCAqLworICAgICAgICAgICAgdWludDhfdCAqdXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaGljaCBuZXR3b3JrIHBvcnQgZWFjaCB1c2VyIHBvcnQgaXMgY3VycmVudGx5IGNvbm5lY3RlZCB0byAoMHhGRiBmb3Igbm90IGNvbm5lY3RlZCkgKi8KKyAgICAgICAgfSBjcm9zc2Jhcl9jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgYnVyc3RfYWN0aXZpdHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2hldGhlciBvciBub3QgdGhlcmUgaXMgYW55IGJ1cnN0IGFjdGl2aXR5IChMb1MpICovCisgICAgICAgIH0gdHJhbnNjZWl2ZXJfYnVyc3RfYWN0aXZpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbmV0d29ya19wb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2hpY2ggbmV0d29yayBwb3J0IHRoZSBJUE4gc2hvdWxkIHVzZSBmb3IgbWFuYWdlbWVudCAqLworICAgICAgICB9IGNvbnRyb2xfcG9ydDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGUgbWF0Y2hfbW9kZTsgLyoqPCBNYXRjaCBNb2RlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzIGZsYWdzOyAgICAgICAgICAgLyoqPCBGbGFncy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZGVmYXVsdF9saW5rX2luZGV4OyAgICAgLyoqPCBEZWZhdWx0IExpbmsgSW5kZXguICovCisgICAgICAgICAgICB1aW50OF90IGRlZmF1bHRfcXVldWVfaW5kZXg7ICAgIC8qKjwgRGVmYXVsdCBRdWV1ZSBJbmRleC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWFwcGluZ3NfY291bnQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gTWFwcGluZ3MgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nICptYXBwaW5nczsgLyoqPCBNYXBwaW5ncy4gKi8KKyAgICAgICAgfSB2bGFuX2Rlc3RpbmF0aW9uczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGUgbW9kZTsgICAgICAgICAgICAgICAvKio8IE1vZGUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9ucyBvcHRpb25zOyAgICAgICAgIC8qKjwgT3B0aW9ucy4gKi8KKyAgICAgICAgfSBlbmNyeXB0aW9uX21vZGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbTsgICAgLyoqPCBTdHJlYW0uICovCisgICAgICAgICAgICB1aW50MzJfdCByZXZpc2lvbjsgIC8qKjwgUmV2aXNpb24uICovCisgICAgICAgIH0gaW50ZXJuYWxfdmVyc2lvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAgdGltZXN0YW1wOyAgIC8qKjwgVGltZXN0YW1wLiAqLworICAgICAgICB9IGZpcm13YXJlX3RpbWVzdGFtcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZSBydWxlOyAgICAgIC8qKjwgUnVsZS4gKi8KKyAgICAgICAgfSBvbnVfcnVsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uIGRpcmVjdGlvbjsgICAgICAgICAgIC8qKjwgRGlyZWN0aW9uLiAqLworICAgICAgICAgICAgdWludDhfdCBwb2xpY2VyX2lkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgUG9saWNlciBJZC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGJ1cnN0X3NpemU7ICAgICAgICAgICAgICAgICAgICAvKio8IEJ1cnN0IFNpemUuICovCisgICAgICAgICAgICB1aW50MzJfdCB0cmFmZmljX3JhdGU7ICAgICAgICAgICAgICAgICAgLyoqPCBUcmFmZmljIFJhdGUuICovCisgICAgICAgIH0gcG9saWNlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2Zfc2hhcGVyczsgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFNoYXBlcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciAqdW5pX3NoYXBlcjsgLyoqPCBVbmkgU2hhcGVyLiAqLworICAgICAgICB9IHVuaV9zaGFwZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsIHZlcnNpb247ICAgIC8qKjwgTWF0dXJpdHkgb2YgZnJpbXdhcmUgKi8KKyAgICAgICAgfSBleHRfZmlybXdhcmVfdmVyc2lvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbiBkaXJlY3Rpb247ICAgICAgICAgICAgLyoqPCBEaXJlY3Rpb24gb2Yga2V5ICovCisgICAgICAgICAgICB1aW50OF90IGtleV9pbmRleDsgIC8qKjwgSW5kZXggb2Yga2V5ICovCisgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGg7IC8qKjwgQnl0ZSBjb3VudCBvZiBrZXkgZGF0YSAqLworICAgICAgICAgICAgdWludDhfdCAqa2V5X2RhdGE7ICAvKio8IEtleSBkYXRhICovCisgICAgICAgIH0gZW5jcnlwdGlvbl9rZXk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZSBmaWxlX2luZm87ICAgLyoqPCBGaWxlIEluZm8uICovCisgICAgICAgIH0gZmlsZV9pbmZvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHN5c3RlbV9ydWxlX29wdGlvbnM7ICAgICAgICAgICAgICAgIC8qKjwgT3B0aW9ucyBmb3Igc3lzdGVtIHJ1bGVzICovCisgICAgICAgIH0gc3lzdGVtX3J1bGVfb3B0aW9uczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbXR1OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNVFUuICovCisgICAgICAgIH0gbXR1OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlIHN0YXRlOyAgICAvKio8IFN0YXRlLiAqLworICAgICAgICB9IG52c19zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBwcmlvcml0eV9jb3VudDsgICAgICAgICAgICAgLyoqPCBQcmlvcml0eSBDb3VudC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnByaW9yaXR5X21hcDsgICAgICAgICAgICAgIC8qKjwgUHJpb3JpdHkgTWFwLiAqLworICAgICAgICB9IHF1ZXVlcHJpbWFwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY19kb3duX2JpdF9sb2FkaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191cF9iaXRfbG9hZGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVwb2Nfc2RtX3BoYXNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY19zZG1fYW1wbGl0dWRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY19zZG1fcXVhbnRpemVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191bnVzZWQwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191bnVzZWQxOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191bnVzZWQyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191bnVzZWQzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191bnVzZWQ0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2UgcXVldWVfY29uZmlnOyAgIC8qKjwgUXVldWUgQ29uZmlnLiAqLworICAgICAgICB9IHF1ZXVlX2NvbmZpZ192MjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldCBmZWF0dXJlX3NldDsgICAgICAgICAgICAvKio8IEZlYXR1cmUgU2V0LiAqLworICAgICAgICB9IGZlYXR1cmVfc2V0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX3BoeV90eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciB2YWx1ZTsgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2VxdWVuY2VfbnVtYmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwdWxzZV90aW1lOyAgICAvKio8IE1QQ1AgdGltZSB0byBwdWxzZS4gKi8KKyAgICAgICAgfSBtcGNwX2Nsb2NrOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX2Nsb2NrX2NvbXBlbnNhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgcm9idXN0bmVzc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUm9idXN0bmVzcyBDb3VudC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbG1xX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTE1RIENvdW50LiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBmYXN0X2xlYXZlX2VuYWJsZTsgICAgICAgICAgICAgICAgICAgLyoqPCBGYXN0IExlYXZlIEVuYWJsZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlIG1vZGU7ICAgICAgICAgIC8qKjwgTW9kZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zIG9wdGlvbnM7ICAgIC8qKjwgT3B0aW9ucy4gKi8KKyAgICAgICAgfSBtY2FzdF9nbG9iYWxfY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1jYXN0X2RvbWFpbl9jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdGltZTsgICAvKio8IFRoZSBhbW91bnQgb2YgdGltZSB0aGUgT05VIHNob3VsZCB3YWl0IGFmdGVyIGxvc3Mgb2Ygc2lnbmFsIG9yIGxvc3Mgb2YgZ2F0ZSB0byByZXNldCB0aGUgbGlua3MgaW4gMTAgbXMgaW5jcmVtZW50cy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3MgZmxhZ3M7ICAgLyoqPCBPTlUgaG9sZG92ZXIgY29uZmlndXJhdGlvbiBmbGFncy4gKi8KKyAgICAgICAgfSBvbnVfaG9sZG92ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSBhbGFybV9jb2RlOyAgLyoqPCBBbGFybSBDb2RlLiAqLworICAgICAgICAgICAgdWludDMyX3QgcmFpc2VfdGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAvKio8IFJhaXNlIFRocmVzaG9sZC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGNsZWFyX3RocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgLyoqPCBDbGVhciBUaHJlc2hvbGQuICovCisgICAgICAgIH0gYWxhcm1fdGhyZXNob2xkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGNvdW50X29mX2ZhaWxzYWZlX21lY2g7ICAgICAgICAgICAgIC8qKjwgQ291bnQgT2YgRmFpbHNhZmUgTWVjaC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgZmFpbHNhZmVfc3RhdGU7ICAgICAgICAgICAgICAgICAgLyoqPCBGYWlsc2FmZSBTdGF0ZS4gKi8KKyAgICAgICAgfSBmYWlsc2FmZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgc3RhdGlzdGljX2lkOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGludGVydmFsOyAgICAgIC8qKjwgSW50ZXJ2YWwuICovCisgICAgICAgIH0gcG9ydF9zdGF0c190aHJlc2hvbGRfaW50ZXJ2YWw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHN0YXRpc3RpY19pZDsgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgICAgICAgICAgdWludDE2X3QgaW50ZXJ2YWw7ICAgICAgLyoqPCBJbnRlcnZhbC4gKi8KKyAgICAgICAgfSBsaW5rX3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzIHN0YXR1czsgICAgICAgICAgIC8qKjwgU3RhdHVzLiAqLworICAgICAgICB9IHN0ZF9tYWNfZHVwbGV4X3N0YXR1czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUgc3RhdGU7ICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gc3RkX2F1dG9fbmVnX2FkbWluX3N0YXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZSBzdGF0dXM7ICAgICAgICAgLyoqPCBTdGF0dXMuICovCisgICAgICAgIH0gc3RkX21hdV9tZWRpYV9hdmFpbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlIG1vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTW9kZS4gKi8KKyAgICAgICAgfSBtZGlfY3Jvc3NvdmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBhZGRyZXNzOyAgLyoqPCBBZGRyZXNzLiAqLworICAgICAgICB9IHN0ZF9tYWNfYWRkcjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlOworCisvKiogVGVrIE9OVSBRdWV1ZSBDb25maWcuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcKK3sKKyAgICB1aW50OF90IHF1ZXVlX3NpemVzX2NvdW50OyAgLyoqPCBRdWV1ZSBTaXplcyBDb3VudC4gKi8KKyAgICB1aW50OF90ICpxdWV1ZV9zaXplczsgICAgICAgLyoqPCBRdWV1ZSBTaXplcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnOworCisvKiogVGVrIElHTVAgU25vb3BpbmcgUG9ydCBDb25maWcuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcKK3sKKyAgICB1aW50OF90IG51bWJlcl9vZl9pZ21wX2dyb3VwczsgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIE9mIElHTVAgR3JvdXBzLiAqLworICAgIHVpbnQ4X3QgcmVsYXRpdmVfcXVldWVfZm9yX2NsYXNzaWZpY2F0aW9uOyAgLyoqPCBSZWxhdGl2ZSBRdWV1ZSBGb3IgQ2xhc3NpZmljYXRpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZzsKKworLyoqIFRlayBPTlUgSUdNUCBHcm91cCBObyBWSUQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZAoreworICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBncm91cDsgICAvKio8IEdyb3VwLiAqLworICAgIHVpbnQ4X3QgcG9ydHM7ICAgICAgICAgICAgICAvKio8IFBvcnRzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZDsKKworLyoqIFRlayBBY3Rpb24gVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uIGxlYWY7ICAgLyoqPCBMZWFmLiAqLworICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYzsgIC8qKjwgTUFDLiAqLworICAgICAgICB9IGFkZF9zdGF0aWNfZW50cnk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYzsgIC8qKjwgTUFDLiAqLworICAgICAgICB9IGRlbF9zdGF0aWNfZW50cnk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHJ1bGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqcnVsZXM7ICAgICAgICAgICAgLyoqPCBSdWxlcy4gKi8KKyAgICAgICAgfSBhZGRfcnVsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSBydWxlczsgICAgICAgICAgICAgLyoqPCBSdWxlcy4gKi8KKyAgICAgICAgfSBuZXdfYWRkX3J1bGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHJ1bGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqcnVsZXM7ICAgICAgICAgICAgLyoqPCBSdWxlcy4gKi8KKyAgICAgICAgfSBuZXdfZGVsX3J1bGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHJ1bGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqcnVsZXM7ICAgICAgICAgICAgLyoqPCBSdWxlcy4gKi8KKyAgICAgICAgfSBkZWxldGVfcnVsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZ3Bpb19jb25maWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBHUElPIENvbmZpZy4gKi8KKyAgICAgICAgfSBzZXRfZ3Bpb19jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGlua3NfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlua3MgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKmxpbmtzOyAgICAvKio8IExpbmtzLiAqLworICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsgICAgLyoqPCBQb3J0cyBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqcG9ydHM7ICAgIC8qKjwgUG9ydHMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgbXVsdGljYXN0OyAvKio8IE11bHRpY2FzdC4gKi8KKyAgICAgICAgfSBzZXRfcXVldWVfY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJvYnVzdG5lc3NfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJvYnVzdG5lc3MgQ291bnQuICovCisgICAgICAgICAgICB1aW50OF90IGxhc3RfbWVtYmVyX3F1ZXJ5X2NvdW50OyAgICAgICAgICAgICAgICAvKio8IExhc3QgTWVtYmVyIFF1ZXJ5IENvdW50LiAqLworICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsgICAgLyoqPCBQb3J0cyBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZyAqcG9ydHM7ICAgICAgIC8qKjwgUG9ydHMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlciBncnBfZm9yd2FyZDsgICAvKio8IEdycCBGb3J3YXJkLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnMgb3B0aW9uczsgICAgICAgICAgLyoqPCBPcHRpb25zLiAqLworICAgICAgICB9IHNldF9pZ21wX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBncm91cHNfY291bnQ7ICAgLyoqPCBHcm91cHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqZ3JvdXBzOyAgLyoqPCBHcm91cHMuICovCisgICAgICAgIH0gYWRkX2lnbXBfZ3JvdXA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X29hbV9yYXRlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggT0FNIFJhdGUuICovCisgICAgICAgICAgICB1aW50OF90IG1pbl9vYW1fcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWluIE9BTSBSYXRlLiAqLworICAgICAgICB9IHNldF9vYW1fcmF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgb2ZmX3RpbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE9mZiBUaW1lLiAqLworICAgICAgICB9IGJjX2xhc2VyX3Bvd2VyX29mZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGltZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRpbWUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9ucyBvcHRpb25zOyAgICAgIC8qKjwgT3B0aW9ucy4gKi8KKyAgICAgICAgfSBzbGVlcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uIGRpcmVjdGlvbjsgICAvKio8IERpcmVjdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9saWNlcl9pZDsgICAgIC8qKjwgUG9saWNlciBJZC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGJ1cnN0X3NpemU7ICAgIC8qKjwgQnVyc3QgU2l6ZS4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHRyYWZmaWNfcmF0ZTsgIC8qKjwgVHJhZmZpYyBSYXRlLiAqLworICAgICAgICB9IGVuYWJsZV9wb2xpY2VyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb24gZGlyZWN0aW9uOyAgIC8qKjwgRGlyZWN0aW9uLiAqLworICAgICAgICAgICAgdWludDhfdCBwb2xpY2VyX2lkOyAvKio8IFBvbGljZXIgSWQuICovCisgICAgICAgIH0gZGlzYWJsZV9wb2xpY2VyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2RlcyBtb2RlOyAgICAgICAgLyoqPCBNb2RlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleCBzdGF0X2luZGV4OyAgIC8qKjwgU3RhdCBJbmRleC4gKi8KKyAgICAgICAgfSBnZXRfZXBvY19zZG1fc3RhdHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzIG1vZGU7ICAgICAgICAvKio8IE1vZGUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleCBzdGF0X2luZGV4OyAgICAgLyoqPCBTdGF0IEluZGV4LiAqLworICAgICAgICB9IGdldF9lcG9jX2NtY19zdGF0czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXMgbW9kZTsgICAgICAgIC8qKjwgTW9kZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4IHN0YXRfaW5kZXg7ICAgICAvKio8IFN0YXQgSW5kZXguICovCisgICAgICAgIH0gZ2V0X2Vwb2NfY251X3N0YXRzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHBvcnRfY291bnQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgVU5JIHBvcnRzLiAqLworICAgICAgICAgICAgdWludDhfdCAqcXVldWVfcGVyX3BvcnQ7ICAgIC8qKjwgV2hpY2ggbG9naWNhbCBxdWV1ZSBudW1iZXIgdG8gdXNlLCBpbmRleGVkIGJ5IFVOSSBwb3J0LiAqLworICAgICAgICB9IHNldF9kbl9iY2FzdF9xdWV1ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2U7CisKKy8qKiBUZWsgVmFyIENvbnRhaW5lci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcgoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoIGJyYW5jaDsgIC8qKjwgQnJhbmNoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGVhZjsgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dCBvYmplY3RfY29udGV4dDsgIC8qKjwgT2JqZWN0IENvbnRleHQuICovCisgICAgICAgIH0gbmFtZV9iaW5kaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSBhdHRyaWJ1dGU7ICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlIGFjdGlvbjsgICAgICAgLyoqPCBBY3Rpb24uICovCisgICAgICAgIH0gYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyOworCisvKiogVGVrIFNldCBSZXNwIEFjdGlvbiBWYWx1ZSBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gbGVhZjsgICAvKio8IExlYWYuICovCisgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGlua3NfY291bnQ7ICAgIC8qKjwgTGlua3MgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKmxpbmtzOyAgICAvKio8IExpbmtzLiAqLworICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsgICAgLyoqPCBQb3J0cyBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqcG9ydHM7ICAgIC8qKjwgUG9ydHMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgbXVsdGljYXN0OyAvKio8IE11bHRpY2FzdC4gKi8KKyAgICAgICAgfSBnZXRfcXVldWVfY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJvYnVzdG5lc3NfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJvYnVzdG5lc3MgQ291bnQuICovCisgICAgICAgICAgICB1aW50OF90IGxhc3RfbWVtYmVyX3F1ZXJ5X2NvdW50OyAgICAgICAgICAgICAgICAvKio8IExhc3QgTWVtYmVyIFF1ZXJ5IENvdW50LiAqLworICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsgICAgLyoqPCBQb3J0cyBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZyAqcG9ydHM7ICAgICAgIC8qKjwgUG9ydHMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlciBncnBfZm9yd2FyZDsgICAvKio8IEdycCBGb3J3YXJkLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnMgb3B0aW9uczsgICAgICAgICAgLyoqPCBPcHRpb25zLiAqLworICAgICAgICB9IGdldF9pZ21wX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBncm91cHNfY291bnQ7ICAgLyoqPCBHcm91cHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqZ3JvdXBzOyAgLyoqPCBHcm91cHMuICovCisgICAgICAgIH0gZ2V0X2lnbXBfZ3JvdXBfaW5mbzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBtYXhfb2FtX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IE9BTSBSYXRlLiAqLworICAgICAgICAgICAgdWludDhfdCBtaW5fb2FtX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWluIE9BTSBSYXRlLiAqLworICAgICAgICB9IGdldF9vYW1fcmF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYm9vdF92ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQm9vdCBWZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDMyX3QgYm9vdF9jcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQm9vdCBDUkMuICovCisgICAgICAgICAgICB1aW50MTZfdCBwZXJzb25hbGl0eV92ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQZXJzb25hbGl0eSBWZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDMyX3QgcGVyc29uYWxpdHlfY3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUGVyc29uYWxpdHkgQ1JDLiAqLworICAgICAgICAgICAgdWludDE2X3QgYXBwMHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQVBQMCBWZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDMyX3QgYXBwMGNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQVBQMCBDUkMuICovCisgICAgICAgICAgICB1aW50MTZfdCBhcHAxdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBUFAxIFZlcnNpb24uICovCisgICAgICAgICAgICB1aW50MzJfdCBhcHAxY3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBUFAxIENSQy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRpYWdub3N0aWNfdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERpYWdub3N0aWMgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGRpYWdub3N0aWNfY3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERpYWdub3N0aWMgQ1JDLiAqLworICAgICAgICB9IGdldF9sb2FkX2luZm87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXggc3RhdF9pbmRleDsgICAvKio8IFN0YXQgSW5kZXguICovCisgICAgICAgICAgICB1aW50OF90IGNvdW50ZXJfdmFsdWVfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gQ291bnRlciBWYWx1ZSAqLworICAgICAgICAgICAgdWludDhfdCAqY291bnRlcl92YWx1ZTsgICAgICAgICAvKio8IExlbmd0aCBvZiB6ZXJvIGlmIG5vdCBhcHBsaWNhYmxlICovCisgICAgICAgICAgICB1aW50OF90IHJhdGVfdmFsdWVfY291bnQ7ICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFJhdGUgVmFsdWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnJhdGVfdmFsdWU7ICAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgemVybyBpZiBub3QgYXBwbGljYWJsZSAqLworICAgICAgICAgICAgdWludDhfdCByYXRlX2ludGVydmFsX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBSYXRlIEludGVydmFsICovCisgICAgICAgICAgICB1aW50OF90ICpyYXRlX2ludGVydmFsOyAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHplcm8gaWYgbm90IGFwcGxpY2FibGUgKi8KKyAgICAgICAgfSBnZXRfZXBvY19zZG1fc3RhdHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4IHN0YXRfaW5kZXg7IC8qKjwgU3RhdCBJbmRleC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY291bnRlcl92YWx1ZV9jb3VudDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIENvdW50ZXIgVmFsdWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmNvdW50ZXJfdmFsdWU7ICAgICAgICAgLyoqPCBMZW5ndGggb2YgemVybyBpZiBub3QgYXBwbGljYWJsZSAqLworICAgICAgICAgICAgdWludDhfdCByYXRlX3ZhbHVlX2NvdW50OyAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBSYXRlIFZhbHVlICovCisgICAgICAgICAgICB1aW50OF90ICpyYXRlX3ZhbHVlOyAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHplcm8gaWYgbm90IGFwcGxpY2FibGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV9pbnRlcnZhbF9jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUmF0ZSBJbnRlcnZhbCAqLworICAgICAgICAgICAgdWludDhfdCAqcmF0ZV9pbnRlcnZhbDsgICAgICAgICAvKio8IExlbmd0aCBvZiB6ZXJvIGlmIG5vdCBhcHBsaWNhYmxlICovCisgICAgICAgIH0gZ2V0X2Vwb2NfY21jX3N0YXRzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleCBzdGF0X2luZGV4OyAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBDb3VudGVyIFZhbHVlICovCisgICAgICAgICAgICB1aW50OF90IGNvdW50ZXJfdmFsdWVfY291bnQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBDb3VudGVyIFZhbHVlICovCisgICAgICAgICAgICB1aW50OF90ICpjb3VudGVyX3ZhbHVlOyAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHplcm8gaWYgbm90IGFwcGxpY2FibGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV92YWx1ZV9jb3VudDsgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUmF0ZSBWYWx1ZSAqLworICAgICAgICAgICAgdWludDhfdCAqcmF0ZV92YWx1ZTsgICAgICAgICAgICAvKio8IExlbmd0aCBvZiB6ZXJvIGlmIG5vdCBhcHBsaWNhYmxlICovCisgICAgICAgICAgICB1aW50OF90IHJhdGVfaW50ZXJ2YWxfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFJhdGUgSW50ZXJ2YWwgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnJhdGVfaW50ZXJ2YWw7ICAgICAgICAgLyoqPCBMZW5ndGggb2YgemVybyBpZiBub3QgYXBwbGljYWJsZSAqLworICAgICAgICB9IGdldF9lcG9jX2NudV9zdGF0czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBwb3J0X2NvdW50OyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBVTkkgcG9ydHMuICovCisgICAgICAgICAgICB1aW50OF90ICpxdWV1ZV9wZXJfcG9ydDsgICAgICAgIC8qKjwgV2hpY2ggbG9naWNhbCBxdWV1ZSBudW1iZXIgdG8gdXNlLCBpbmRleGVkIGJ5IFVOSSBwb3J0LiAqLworICAgICAgICB9IGdldF9kbl9iY2FzdF9xdWV1ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2U7CisKKy8qKiBUZWsgU2V0IFJlc3AgVmFyIENvbnRhaW5lciBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCBicmFuY2g7ICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBlbmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgb2JqZWN0X2NvbnRleHQ7ICAgICAgLyoqPCBPYmplY3QgQ29udGV4dC4gKi8KKyAgICAgICAgfSBuYW1lX2JpbmRpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlIGF0dHJpYnV0ZTsgICAgICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlIGFjdGlvbjsgIC8qKjwgQWN0aW9uLiAqLworICAgICAgICB9IGFjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlOworCisvKiogVGVrIFZlbmRvciBFeHRlbmRlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGUgb3A7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3AuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBmaXJtd2FyZV92ZXJzaW9uOyAgICAgICAgICAgICAgICAgIC8qKjwgRmlybXdhcmUgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgb3VpWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPVUkuICovCisgICAgICAgICAgICB1aW50MTZfdCBwcm9kdWN0X2lkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUHJvZHVjdCBJRC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDhfdCBleHRlbmRlZF9pZFs2NF07ICAgICAgICAgICAgICAgICAgICAvKio8IEV4dGVuZGVkIElELiAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgYmFzZV9tYWM7ICAgICAgICAgICAgICAgICAvKio8IEJhc2UgTUFDLiAqLworICAgICAgICAgICAgdWludDhfdCBtYXhfbGlua3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1heCBMaW5rcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3BvcnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW0gUG9ydHMuICovCisgICAgICAgICAgICB1aW50OF90IG51bV9hc3NpZ25hYmxlX3Vwc3RyZWFtX3F1ZXVlczsgICAgIC8qKjwgTnVtIEFzc2lnbmFibGUgVXBzdHJlYW0gUXVldWVzLiAqLworICAgICAgICAgICAgdWludDhfdCBtYXhfcXVldWVzX3Blcl9saW5rX3Vwc3RyZWFtOyAgICAgICAvKio8IE1heCBRdWV1ZXMgUGVyIExpbmsgVXBzdHJlYW0uICovCisgICAgICAgICAgICB1aW50OF90IHF1ZXVlX2luY3JlbWVudF91cHN0cmVhbTsgICAgICAgICAgIC8qKjwgUXVldWUgSW5jcmVtZW50IFVwc3RyZWFtLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1fYXNzaWduYWJsZV9kb3duc3RyZWFtX3F1ZXVlczsgICAvKio8IE51bSBBc3NpZ25hYmxlIERvd25zdHJlYW0gUXVldWVzLiAqLworICAgICAgICAgICAgdWludDhfdCBtYXhfcXVldWVzX3Blcl9saW5rX2Rvd25zdHJlYW07ICAgICAvKio8IE1heCBRdWV1ZXMgUGVyIExpbmsgRG93bnN0cmVhbS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcXVldWVfaW5jcmVtZW50X2Rvd25zdHJlYW07ICAgICAgICAgLyoqPCBRdWV1ZSBJbmNyZW1lbnQgRG93bnN0cmVhbS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHVwc3RyZWFtX2J1ZmZlcl9hdmFpbGFibGU7ICAgICAgICAgLyoqPCBVcHN0cmVhbSBCdWZmZXIgQXZhaWxhYmxlLiAqLworICAgICAgICAgICAgdWludDE2X3QgZG93bnN0cmVhbV9idWZmZXJfYXZhaWxhYmxlOyAgICAgICAvKio8IERvd25zdHJlYW0gQnVmZmVyIEF2YWlsYWJsZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGplZGVjX21hbnVmYWN0dXJlcl9pZDsgICAgICAgICAgICAgLyoqPCBKRURFQyBNYW51ZmFjdHVyZXIgSUQuICovCisgICAgICAgICAgICB1aW50MTZfdCBjaGlwX2lkOyAgICAgICAvKio8IENoaXAgSUQuICovCisgICAgICAgICAgICB1aW50MzJfdCBjaGlwX3ZlcnNpb247ICAvKio8IENoaXAgVmVyc2lvbi4gKi8KKyAgICAgICAgfSBpbmZvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciAqdmFyczsgICAgICAgICAgICAgICAvKio8IFZhcnMuICovCisgICAgICAgIH0gZ2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdmFyczsgICAgICAgICAgICAgICAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IGdldF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyICp2YXJzOyAgICAgICAgICAgICAgICAvKio8IFZhcnMuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzOyAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IHNldF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3MgZmxhZ3M7ICAgICAgICAgICAgICAvKio8IEZsYWdzLiAqLworICAgICAgICAgICAgdWludDE2X3QgbXVsdGljYXN0X2xsaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgTExJRC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHVuaWNhc3RfbGxpZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVW5pY2FzdCBMTElELiAqLworICAgICAgICB9IG11bHRpY2FzdF9yZWdpc3RlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzIGZsYWdzOyAgLyoqPCBGbGFncy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG11bHRpY2FzdF9sbGlkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IExMSUQuICovCisgICAgICAgICAgICB1aW50MTZfdCB1bmljYXN0X2xsaWQ7ICAvKio8IFVuaWNhc3QgTExJRC4gKi8KKyAgICAgICAgfSBtdWx0aWNhc3RfcmVnaXN0ZXJfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qga2V5X251bWJlcjsgICAgIC8qKjwgS2V5IE51bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qga2V5X2xlbmd0aDsgICAgIC8qKjwgS2V5IExlbmd0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmtleV9kYXRhOyAgICAgIC8qKjwgS2V5IERhdGEuICovCisgICAgICAgIH0ga2V5X2V4Y2hhbmdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBibG9jazsgICAgICAgICAvKio8IEJsb2NrLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yIGVycm9yOyAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBmaWxlX2FjazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYmxvY2s7ICAgICAvKio8IEJsb2NrLiAqLworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoOyAgICAvKio8IExlbmd0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGE7ICAgICAgLyoqPCBEYXRhLiAqLworICAgICAgICB9IGZpbGVfZGF0YTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGUgZmlsZV90eXBlOyAgICAgICAgICAgICAgICAvKio8IEZpbGUgVHlwZS4gKi8KKyAgICAgICAgfSBmaWxlX3JlYWRfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGUgZmlsZV90eXBlOyAgICAgICAgICAgICAgICAvKio8IEZpbGUgVHlwZS4gKi8KKyAgICAgICAgfSBmaWxlX3dyaXRlX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcmlhYmxlX2NvbnRhaW5lcnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFyaWFibGVfY29udGFpbmVycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdmFyaWFibGVfY29udGFpbmVyczsgLyoqPCBWYXJpYWJsZSBDb250YWluZXJzLiAqLworICAgICAgICB9IHVuYWNrZWRfYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQ7CisKKy8qKiBQTUMgRmlsZSBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgZmlsZV9vcDsgICAgICAgICAgICAgICAgLyoqPCBGaWxlIE9wLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZmlsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZpbGUuICovCisgICAgICAgICAgICB1aW50MzJfdCBub3RfZmlsZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTm90IEZpbGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBjcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ3JjLiAqLworICAgICAgICB9IGhlYWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGguICovCisgICAgICAgICAgICB1aW50MTZfdCBibG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQmxvY2suICovCisgICAgICAgICAgICB1aW50MzJfdCBkYXRhX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGRhdGEuICovCisgICAgICAgICAgICB1aW50OF90ICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGF0YS4gKi8KKyAgICAgICAgfSBkYXRhOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBpZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kZXguICovCisgICAgICAgIH0gaWR4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgZnJhbWVfdHlwZV9hY2s7IC8qKjwgRnJhbWUgVHlwZSBBY2suICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGUgZXJyb3JfY29kZTsgIC8qKjwgRXJyb3IgQ29kZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrX3J4OyAgLyoqPCBCbG9jayBSeC4gKi8KKyAgICAgICAgfSBhY2s7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZTsKKworLyoqIFBNQyBWZW5kb3IgRXh0ZW5kZWQgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGUgb3A7IC8qKjwgT3AuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZSBmaWxlX2luZm87ICAgIC8qKjwgRmlsZSBJbmZvLiAqLworICAgICAgICB9IGZpcm13YXJlX3VwZGF0ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2U7CisKKy8qKiBWZW5kb3IgRXh0ZW5kZWQgT0FNIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsgICAgICAgICAgICAgICAgICAgICAvKio8IE9VSS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGN0YzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQgdmFsdWU7ICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0ZWs7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcG1jOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBkcG9lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBrdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlIGNvbmZpZzsgICAgICAgICAgIC8qKjwgQ29uZmlnLiAqLworICAgICAgICB9IGRhc2FuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uIG51bWJlciAqLworICAgICAgICAgICAgdWludDE2X3Qgc2VxdWVuY2VfbnVtYmVyOyAgICAgICAgICAgICAgIC8qKjwgU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBmcmFtZSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIE9BTSBtZXNzYWdlICovCisgICAgICAgICAgICB1aW50MTZfdCBudW1fdG90YWxfZXhwZWN0ZWRfcGFja2V0czsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBhY2tldHMgcmVxdWlyZWQgZm9yIHRoZSBPQU0gbWVzc2FnZSB0byBiZSBjb21wbGV0ZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlIHBkdTsgIC8qKjwgVGhlIEJSQ00gT0FNIFBEVSBkYXRhICovCisgICAgICAgIH0gYnJjbTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2llcG9uX2E7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlOworCisvKiogUm9vdCBzdHJ1Y3R1cmUgZm9yIE9BTSBtZXNzYWdlcyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudAoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlIGNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRsdnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB0bHZzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKnRsdnM7ICAgICAgICAgICAgICAgIC8qKjwgVExWcy4gKi8KKyAgICAgICAgfSBpbmZvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBzZXF1ZW5jZV9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTZXF1ZW5jZSBOdW1iZXIuICovCisgICAgICAgICAgICB1aW50MzJfdCB0bHZzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGx2cy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlICp0bHZzOyAgICAgICAgICAvKio8IFRMVnMuICovCisgICAgICAgIH0gZXZlbnRfbm90aWZpY2F0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlICp2YXJzOyAgICAgICAgICAvKio8IFZhcnMuICovCisgICAgICAgIH0gdmFyX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZSAqdmFyczsgICAgICAgICAgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSB2YXJfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZCBjb21tYW5kOyAgICAvKio8IENvbW1hbmQuICovCisgICAgICAgIH0gbG9vcGJhY2tfY29udHJvbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gb3JnYW5pemF0aW9uX3NwZWNpZmljOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudDsKKworLyoqIE1hc3RlciBFbmQgUG9pbnQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludAoreworICAgIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGUgdHlwZTsgLyoqPCBUeXBlLiAqLworICAgIHVpbnQ4X3QgaWQ7IC8qKjwgSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50OworCisvKiogT05VIE1hc3RlciBPQU0gQ29udGVudC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50Cit7CisgICAgdWludDE2X3QgbGluazsgIC8qKjwgTGluay4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50IG9hbV9jb250ZW50OyAgICAvKio8IE9BTSBDb250ZW50LiAqLworfSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudDsKKworLyoqIE9BTSBSZWcgSW5mbyBWZW5kb3IgT1VJLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpCit7CisgICAgdWludDI0X3Qgb3VpOyAgIC8qKjwgVmVuZG9yIE9VSSB0byByZWdpc3RlciAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciB2ZW5kb3IgT1VJIChNVVNUIGJlIFJlZ2lzdGVyIG9yIFVucmVnaXN0ZXIpLiAqLworICAgIHVpbnQxNl90IGxlbmd0aF9yZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdyAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWk7CisKKy8qKiBPQU0gUmVnIEluZm8gVmVuZG9yLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciB2ZW5kb3Igc3BlY2lmaWMgSW5mbyBUTFZzLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB2ZW5kb3Jfb3VpX3JlZ19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgdmVuZG9yIE9VSSByZWdpc3RyYXRpb25zICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWkgKnZlbmRvcl9vdWlfcmVnOyAgICAvKio8IFZlbmRvciBPVUkgcmVnaXN0cmF0aW9ucyAqLworICAgICAgICB9IGNvbnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcjsKKworLyoqIE9BTSBSZWcgSW5mbyBUTFYuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdgoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSB0eXBlOyAgICAgICAgICAgICAgICAgLyoqPCBJbmZvIFRMViB0eXBlIHRvIHJlZ2lzdGVyICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgSW5mbyBUTFYgdHlwZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aF9yZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdyAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IgdmFsdWU7ICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB2ZW5kb3I7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdjsKKworLyoqIE9BTSBSZWcgSW5mbyBDb250LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250Cit7CisgICAgdWludDhfdCBpbmZvX3JlZ19jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBJbmZvIFRMViB0eXBlIHJlZ2lzdHJhdGlvbnMgKG1heGltdW0gb25lIHJlZ2lzdHJhdGlvbiBwZXIgdHlwZSkuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgKmluZm9fcmVnOyAvKio8IEluZm8gVExWIHR5cGUgcmVnaXN0cmF0aW9ucyAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQ7CisKKy8qKiBPQU0gUmVnIEluZm8uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBpbmZvIGZyYW1lcyAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250IHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGNvbnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB1bnJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm87CisKKy8qKiBPQU0gUmVnIENUQyBWYXIgRGVzYy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzYworeworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIGJyYW5jaDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gYWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZXh0X2F0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gbGVhZjsgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGV4dF9hY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlIGxlYWY7ICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBrdGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gbGVhZjsgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGt0YWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjOworCisvKiogT0FNIFJlZyBDVEMgVmFyaWFibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgZGVzY3JpcHRvcjsgICAgLyoqPCBDVEMgdmFyaWFibGUgZGVzY3JpcHRvciAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgdmFyaWFibGUgZGVzY3JpcHRvciAoTVVTVCBiZSBSZWdpc3RlciBvciBVbnJlZ2lzdGVyKS4gKi8KKyAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93ICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZTsKKworLyoqIE9BTSBSZWcgQ1RDIFZhcmlhYmxlIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdAoreworICAgIHVpbnQ4X3QgdmFyaWFibGVfY291bnQ7IC8qKjwgTnVtYmVyIG9mIENUQyB2YXJpYWJsZSByZWdpc3RyYXRpb25zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlICp2YXJpYWJsZXM7ICAgIC8qKjwgQ1RDIHZhcmlhYmxlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3Q7CisKKy8qKiBPQU0gUmVnIENUQyBPcCBWYXJpYWJsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBDVEMgdmFyaWFibGUgcmVxdWVzdHMuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb250OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0IHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlOworCisvKiogT0FNIFJlZyBDVEMgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlIG9wY29kZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPcGNvZGUgdG8gcmVnaXN0ZXIgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBDVEMgb3Bjb2RlICovCisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cgKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlOworCisvKiogT0FNIFJlZyBDVEMgQ29udC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250Cit7CisgICAgdWludDhfdCBvcGNvZGVfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgQ1RDIG9wY29kZSByZWdpc3RyYXRpb25zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSAqb3Bjb2RlczsgICAgLyoqPCBDVEMgb3Bjb2RlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQ7CisKKy8qKiBPQU0gUmVnIENUQy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YworeworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBDVEMgT1VJICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb250OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250IHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjOworCisvKiogT0FNIFJlZyBUZWsgVmFyIERlc2MuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2MKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCBicmFuY2g7ICAgICAgICAgICAgICAgICAgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbiBsZWFmOyAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjOworCisvKiogT0FNIFJlZyBUZWsgVmFyaWFibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2MgZGVzY3JpcHRvcjsgICAgLyoqPCBUZWsgdmFyaWFibGUgZGVzY3JpcHRvciAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgdmFyaWFibGUgZGVzY3JpcHRvciAoTVVTVCBiZSBSZWdpc3RlciBvciBVbnJlZ2lzdGVyKS4gKi8KKyAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93ICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZTsKKworLyoqIE9BTSBSZWcgVGVrIFZhcmlhYmxlIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdAoreworICAgIHVpbnQ4X3QgdmFyaWFibGVfY291bnQ7IC8qKjwgTnVtYmVyIG9mIFRlayB2YXJpYWJsZSByZWdpc3RyYXRpb25zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlICp2YXJpYWJsZXM7ICAgIC8qKjwgVGVrIHZhcmlhYmxlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3Q7CisKKy8qKiBPQU0gUmVnIFRlayBPcCBWYXJpYWJsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBUZWsgdmFyaWFibGUgcmVxdWVzdHMuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb250OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0IHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlOworCisvKiogT0FNIFJlZyBUZWsgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIG9wY29kZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPcGNvZGUgdG8gcmVnaXN0ZXIgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBUZWsgb3Bjb2RlICovCisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cgKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlOworCisvKiogT0FNIFJlZyBUZWsgQ29udC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250Cit7CisgICAgdWludDhfdCBvcGNvZGVfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgVGVrIG9wY29kZSByZWdpc3RyYXRpb25zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSAqb3Bjb2RlczsgICAgLyoqPCBUZWsgb3Bjb2RlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQ7CisKKy8qKiBPQU0gUmVnIFRlay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlaworeworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBUZWsgT1VJICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb250OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250IHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrOworCisvKiogT0FNIFJlZyBEUG9FIFZhciBEZXNjLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzYworeworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaCBicmFuY2g7ICAgICAgICAgICAgICAgICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gc3RhbmRhcmRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBzdGFuZGFyZF9hY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGV4dGVuZGVkX2F0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZXh0ZW5kZWRfYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzYzsKKworLyoqIE9BTSBSZWcgRFBvRSBWYXJpYWJsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjIGRlc2NyaXB0b3I7ICAgLyoqPCBEUG9FIHZhcmlhYmxlIGRlc2NyaXB0b3IgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgLyoqPCBSZWdpc3RyYXRpb24gYWN0aW9uIHRvIHBlcmZvcm0gZm9yIHZhcmlhYmxlIGRlc2NyaXB0b3IgKE1VU1QgYmUgUmVnaXN0ZXIgb3IgVW5yZWdpc3RlcikuICovCisgICAgdWludDE2X3QgbGVuZ3RoX3Jlc2VydmVkOyAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdyAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlOworCisvKiogT0FNIFJlZyBEUG9FIFZhcmlhYmxlIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QKK3sKKyAgICB1aW50OF90IHZhcmlhYmxlX2NvdW50OyAvKio8IE51bWJlciBvZiBEUG9FIHZhcmlhYmxlIHJlZ2lzdHJhdGlvbnMgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlICp2YXJpYWJsZXM7ICAgLyoqPCBEUG9FIHZhcmlhYmxlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0OworCisvKiogT0FNIFJlZyBEUG9FIE9wIFZhcmlhYmxlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBEUG9FIHZhcmlhYmxlIHJlcXVlc3RzLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0IHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY29udDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0IHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB1bnJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGU7CisKKy8qKiBPQU0gUmVnIERQb0UgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGUgb3Bjb2RlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3Bjb2RlIHRvIHJlZ2lzdGVyICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgRFBvRSBvcGNvZGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cgKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZTsKKworLyoqIE9BTSBSZWcgRFBvRSBDb250LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250Cit7CisgICAgdWludDhfdCBvcGNvZGVfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgRFBvRSBvcGNvZGUgcmVnaXN0cmF0aW9ucyAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlICpvcGNvZGVzOyAgIC8qKjwgRFBvRSBvcGNvZGUgcmVnaXN0cmF0aW9ucyAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQ7CisKKy8qKiBPQU0gUmVnIERQb0UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBEUG9FIE9VSSAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250IHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGNvbnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB1bnJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2U7CisKKy8qKiBPQU0gUmVnIFZlbmRvciBPVUkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZlbmRvciBPVUkgdG8gcmVnaXN0ZXIgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciB2ZW5kb3IgT1VJIChNVVNUIGJlIFJlZ2lzdGVyIG9yIFVucmVnaXN0ZXIpICovCisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cgKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YyB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY3RjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWsgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHRlazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBkcG9lOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aTsKKworLyoqIE9BTSBSZWcgVmVuZG9yIENvbnQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udAoreworICAgIHVpbnQ4X3QgdmVuZG9yX291aV9yZWdfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgVmVuZG9yIE9VSSByZWdpc3RyYXRpb25zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSAqdmVuZG9yX291aV9yZWc7IC8qKjwgVmVuZG9yIE9VSSByZWdpc3RyYXRpb25zICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250OworCisvKiogT0FNIFJlZyBWZW5kb3IuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgLyoqPCBSZWdpc3RyYXRpb24gYWN0aW9uIHRvIHBlcmZvcm0gZm9yIG9yZ2FuaXphdGlvbiBzcGVjaWZpYyBmcmFtZXMuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY29udDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yOworCisvKiogT0FNIFJlZyBPcGNvZGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSBvcGNvZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSUVFRSBPQU0gb3Bjb2RlIHRvIHJlZ2lzdGVyICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3Igb3Bjb2RlIChNVVNUIGJlIFJlZ2lzdGVyIG9yIFVucmVnaXN0ZXIpLiAqLworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoX3Jlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93ICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGluZm87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvciB2YWx1ZTsgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gb3JnYW5pemF0aW9uX3NwZWNpZmljOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlOworCisvKiogT0FNIFJlZ2lzdHJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uCit7CisgICAgdWludDhfdCBtYXN0ZXJfaWQ7ICAvKio8IFRoZSBJRCBvZiB0aGUgbWFzdGVyIHRoYXQgdGhpcyByZWdpc3RyYXRpb24gYXBwbGllcyB0by4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgICAgIC8qKjwgUmVzZXJ2ZWQgKG11c3QgYmUgQ29udGludWUpICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlZ2lzdHJhdGlvbl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBPQU0gb3Bjb2RlIHJlZ2lzdHJhdGlvbnMgZm9yIHRoaXMgbWFzdGVyIChtYXhpbXVtIG9uZSByZWdpc3RyYXRpb24gcGVyIG9wY29kZSkuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgKnJlZ2lzdHJhdGlvbjsgICAvKio8IE9BTSBvcGNvZGUgcmVnaXN0cmF0aW9ucyAqLworICAgICAgICB9IGNvbnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbjsKKworLyoqIFRoaXMgcmVjb3JkIGlzIHVzZWQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIE9OVSBNYXN0ZXIgZG9lcyBOT1QgaGF2ZSB0aGUgT0FNIAorICogTWFzdGVyIG9wdGlvbiBlbmFibGVkLiBJdCBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSBjZXJ0YWluIE9BTSBtZXNzYWdlcyB0aGF0IAorICogdGhlIG1hc3RlciB3aXNoZXMgdG8gcHJvY2VzcyBpdHNlbGYuIFJhdGhlciB0aGFuIHByb2Nlc3NpbmcgdGhlc2UgbWVzc2FnZXMsIAorICogdGhlIE9OVSB3aWxsIHNlbmQgdGhlc2UgbWVzc2FnZXMgdG8gdGhlIG1hc3Rlci4gIEJ5IGRlZmF1bHQgYWxsIE9BTSBmcmFtZXMgCisgKiBhcmUgY29uc2lkZXJlZCBVbnJlZ2lzdGVyZWQgYW5kIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBPTlUsIHVubGVzcyB0aGlzIAorICogcmVjb3JkIHNwZWNpZmljYWxseSBjb250YWlucyBhIFJlZ2lzdGVyIGFjdGlvbiBmb3IgdGhhdCB0eXBlIG9mIGZyYW1lLiBUaGlzIAorICogcmVjb3JkIGlzIGhpZXJhcmNoaWNhbCBhbGxvd2luZyBoaWdoIGxldmVsIGFjdGlvbnMgdG8gYmUgb3ZlcnJpZGRlbiBieSBsb3dlciAKKyAqIGxldmVsIGFjdGlvbnMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIHRocmVlIGNvbmRpdGlvbmFscyAKKyAqIChlYWNoIHN1Y2Nlc3NpdmVseSBuZXN0ZWQgdW5kZXIgdGhlIHByZXZpb3VzKTogICogSWYgWCBUaGVuIFJlZ2lzdGVyIEFuZCAKKyAqIENvbnRpbnVlICogSWYgWSBUaGVuIFVucmVnaXN0ZXIgQW5kIENvbnRpbnVlICogSWYgWiBUaGVuIFJlZ2lzdGVyICBUaGVuIAorICogZnJhbWVzIHdoaWNoIG1hdGNoIG9ubHkgWCBvciBYLCBZIGFuZCBaIHdvdWxkIGJlIGZvcndhcmRlZCwgd2hpbGUgZnJhbWVzIAorICogbWF0Y2hpbmcgWCBhbmQgWSwgYnV0IG5vdCBaIHdvdWxkIGJlIHByb2Nlc3NlZCBieSB0aGUgT05VLiBOb3RlIHRoYXQgZHVlIHRvIAorICogdGhlIGhpZXJhcmNoaWNhbCBvcmdhbml6YXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpdCBpcyBsb2dpY2FsbHkgaW1wb3NzaWJsZSAKKyAqIGZvciBhIGZyYW1lIHRvIG1hdGNoIFkgb3IgWiB3aXRob3V0IG1hdGNoaW5nIFguICBOb3RlIHRoYXQgdGhlcmUgYXJlIHNvbWUgCisgKiBsaW1pdGF0aW9ucyB3aGVuIHJlZ2lzdGVyaW5nIGJyYW5jaC9sZWFmIGNvZGVzIChWYXJpYWJsZXMpLiBGb3IgdmFyaWFibGVzIAorICogdGhhdCBhcmUgcmVhZC93cml0ZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlZ2lzdGVyIHRoZSB2YXJpYWJsZSB1bmRlciBib3RoIHRoZSAKKyAqIGdldCByZXF1ZXN0IGFuZCBzZXQgcmVxdWVzdCBvcGNvZGVzLiBBIHNpbmdsZSBnZXQgb3Igc2V0IHJlcXVlc3QgY2FuIGFsc28gCisgKiBjb250YWluIG11bHRpcGxlIHZhcmlhYmxlcyB3aGljaCBtYXkgaGF2ZSBjb25mbGljdGluZyByZWdpc3RyYXRpb24gc3RhdGVzLiBBIAorICogZnJhbWUgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIG1hc3RlciBpZiBpdCB3YXMgcmVnaXN0ZXJlZCBhdCBhIGhpZ2hlciBsZXZlbCAKKyAqIGFuZCBjb250YWlucyBubyB2YXJpYWJsZXMgd2hpY2ggd2VyZSBleHBsaWNpdGx5IHVucmVnaXN0ZXJlZCBvciBpZiBpdCAKKyAqIGNvbnRhaW5zIGFueSB2YXJpYWJsZXMgdGhhdCB3ZXJlIGV4cGxpY2l0bHkgcmVnaXN0ZXJlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QKK3sKKyAgICB1aW50OF90IHJlZ2lzdHJhdGlvbnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgT05VIE1hc3RlciBPQU0gcmVnaXN0cmF0aW9ucyAobWF4aW11bSAxIHBlciBtYXN0ZXIpLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uICpyZWdpc3RyYXRpb25zOyAgICAvKio8IE9OVSBNYXN0ZXIgT0FNIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdDsKKworLyoqIE1hc3RlciBDb250ZXh0IFRMVi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZSB0eXBlOyAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydF9pbmRleDsgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBJbmRleC4gKi8KKyAgICAgICAgfSBuZXR3b3JrX3BvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBsaW5rX2luZGV4OyAgICAgICAgICAgICAgICAgLyoqPCBMaW5rIEluZGV4LiAqLworICAgICAgICB9IGxpbms7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydF9pbmRleDsgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBJbmRleC4gKi8KKyAgICAgICAgfSB1c2VyX3BvcnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2OworCisvKiogTmVnb3RpYXRlZCBPQU0uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0KK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOyAgICAgICAgICAgICAvKio8IE9VSS4gKi8KKyAgICBiY21vc19ib29sIG5lZ290aWF0ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE5lZ290aWF0ZWQuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb24gdmVyc2lvbjsgICAgLyoqPCBWZXJzaW9uLiAqLworICAgICAgICB9IGN0YzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbiB2ZXJzaW9uOyAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICAgICAgfSBkcG9lOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtOworCisvKiogTmVnb3RpYXRlZCBPQU0gTGlzdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0Cit7CisgICAgdWludDhfdCBjb3VudDsgIC8qKjwgQ291bnQuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtICpuZWdvdGlhdGVkX29hbXM7ICAgIC8qKjwgTmVnb3RpYXRlZCBPQU1zLiAqLworfSBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdDsKKworLyoqIE9OVSBNYXN0ZXIgQ29tbWFuZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIGNvbW1hbmQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29tbWFuZC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3Qgb2FtX3JlZ2lzdHJhdGlvbnM7ICAgIC8qKjwgT0FNIFJlZ2lzdHJhdGlvbnMuICovCisgICAgICAgIH0gc2V0X29hbV9yZWdpc3RyYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgbGlua19jb250ZXh0OyAgICAgICAgICAgIC8qKjwgTGluayBDb250ZXh0LiAqLworICAgICAgICB9IGdldF9uZWdvdGlhdGVkX29hbTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiBsaW5rX2NvbnRleHQ7ICAgICAgICAgICAgLyoqPCBMaW5rIENvbnRleHQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCBuZWdvdGlhdGVkX29hbTsgICAgICAgICAvKio8IE5lZ290aWF0ZWQgT0FNLiAqLworICAgICAgICB9IHNldF9uZWdvdGlhdGVkX29hbTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQ7CisKKy8qKiBPTlUgTWFzdGVyIFJlc3BvbnNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIGNvbW1hbmQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29tbWFuZC4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlIHJlc3BvbnNlX2NvZGU7ICAgICAgICAgICAgIC8qKjwgUmVzcG9uc2UgQ29kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGUgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gZ2V0X29udV9zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCBvYW1fcmVnaXN0cmF0aW9uczsgICAgLyoqPCBPQU0gUmVnaXN0cmF0aW9ucy4gKi8KKyAgICAgICAgfSBnZXRfb2FtX3JlZ2lzdHJhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiBsaW5rX2NvbnRleHQ7ICAgICAgICAgICAgLyoqPCBMaW5rIENvbnRleHQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCBuZWdvdGlhdGVkX29hbTsgICAgICAgICAvKio8IE5lZ290aWF0ZWQgT0FNLiAqLworICAgICAgICB9IGdldF9uZWdvdGlhdGVkX29hbTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiBsaW5rX2NvbnRleHQ7ICAgICAgICAgICAgLyoqPCBMaW5rIENvbnRleHQuICovCisgICAgICAgIH0gc2V0X25lZ290aWF0ZWRfb2FtOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2U7CisKKy8qKiBPTlUgTWFzdGVyIENvbW11bmljYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlIHR5cGU7IC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb21tYW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcmVzcG9uc2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uOworCisvKiogTWFzdGVyIFBEVSBDb21tb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24KK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbCBwcm90b2NvbDsgICAgICAgICAgIC8qKjwgUHJvdG9jb2wuICovCisgICAgdWludDE2X3QgY29ycmVsYXRpb25fdGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENvcnJlbGF0aW9uIFRhZy4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3MgZmxhZ3M7ICAgIC8qKjwgRmxhZ3MuICovCisgICAgICAgIH0gcGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgZG1lcDsgICAgICAgICAgLyoqPCBETUVQLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgc21lcDsgICAgICAgICAgLyoqPCBTTUVQLiAqLworICAgICAgICAgICAgdWludDE2X3QgZnJhbWVfbGVuZ3RoOyAgLyoqPCBGcmFtZSBMZW5ndGguICovCisgICAgICAgICAgICB1aW50OF90ICpmcmFtZV9kYXRhOyAgICAvKio8IEZyYW1lIERhdGEuICovCisgICAgICAgIH0gZW5jYXBzdWxhdGVkX2ZyYW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9hbV9jb250ZW50OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJlZ2lzdGVyZWRfb2FtOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uIHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hc3Rlcl9jb21tdW5pY2F0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uOworCisvKiogT3JnYW5pemF0aW9uIFNwZWNpZmljIFNsb3cgUHJvdG9jb2wuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOyAgICAgICAgICAgICAgICAgLyoqPCBPVUkuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdGVrOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sOworCisvKiogU2xvdyBQcm90b2NvbC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZSBzdWJ0eXBlOyAgICAgIC8qKjwgU3VidHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3MgZmxhZ3M7ICAgICAgICAgICAgLyoqPCBGbGFncy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgY29udGVudDsgICAgLyoqPCBDb250ZW50LiAqLworICAgICAgICB9IG9hbTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sIHZhbHVlOyAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvcmdhbml6YXRpb25fc3BlY2lmaWM7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbDsKKworLyoqIEV0aGVybmV0IFByb3RvY29sLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgZXRoZXJ0eXBlOyAgICAgICAgLyoqPCBFdGhlcnR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwYWRkaW5nX2NvdW50OyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcGFkZGluZy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnBhZGRpbmc7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBhZGRpbmcuICovCisgICAgICAgIH0gemVybzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWUgdmFsdWU7ICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY3ZsYW47CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlIHZhbHVlOyAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN2bGFuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZSB2YWx1ZTsgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBpdGFnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzbG93X3Byb3RvY29sOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBlYXBvbDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbDsKKworLyoqIEV0aGVybmV0IEZyYW1lLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZGE7ICAgICAgIC8qKjwgRGVzdGluYXRpb24gQWRkcmVzcy4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBzYTsgICAgICAgLyoqPCBTb3VyY2UgQWRkcmVzcy4gKi8KKyAgICB1aW50MzJfdCBwcm90b2NvbHNfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcHJvdG9jb2xzLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqcHJvdG9jb2xzOyAgIC8qKjwgUHJvdG9jb2xzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWU7CisKKy8qKiBPQU0gUGR1IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZGE7ICAgLyoqPCBEZXN0aW5hdGlvbiBBZGRyZXNzLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIHNhOyAgIC8qKjwgU291cmNlIEFkZHJlc3MuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgcHJvdG9jb2xfdHlwZTsgICAgLyoqPCBQcm90b2NvbCBUeXBlLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGUgc3VidHlwZTsgIC8qKjwgU3VidHlwZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzIGZsYWdzOyAgICAgICAgICAgICAgICAvKio8IEZsYWdzLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgY29udGVudDsgICAgICAgIC8qKjwgQ29udGVudC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZTsKKworLyoqIE9BTSBUZWsgRXZlbnQgR1BJTy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW8KK3sKKyAgICB1aW50MzJfdCByZXNlcnZlZDsgICAgICAvKio8IFJlc2VydmVkLiAqLworICAgIHVpbnQzMl90IGdwaW9fc3RhdGUxZzsgIC8qKjwgR1BJTyBTdGF0ZSAoMUcpLiAqLworICAgIHVpbnQ2NF90IGdwaW9fc3RhdGUxMGc7IC8qKjwgR1BJTyBTdGF0ZSAoMTBHKS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbzsKKworLyoqIE9BTSBUZWsgRXZlbnQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudAoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSBhbGFybV9jb2RlOyAgLyoqPCBBbGFybSBDb2RlLiAqLworICAgIGJjbW9zX2Jvb2wgcmFpc2VkOyAgLyoqPCBSYWlzZWQuICovCisgICAgdWludDE2X3QgcG9ydDsgICAgICAvKio8IFBvcnQuICovCisgICAgdWludDE2X3QgbGluazsgICAgICAvKio8IExpbmsuICovCisgICAgdWludDE2X3QgcXVldWU7ICAgICAvKio8IFF1ZXVlLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCBhbGFybV9jb250ZXh0OyAgICAvKio8IEFsYXJtIENvbnRleHQuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHN0YXRfaWQ7IC8qKjwgU3RhdCBJRC4gKi8KKyAgICAgICAgfSBzdGF0X2FsYXJtOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvIHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ3Bpb19saW5rX2ZhdWx0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvIHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ3Bpb19keWluZ19nYXNwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvIHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ3Bpb19jcml0aWNhbF9ldmVudDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbyB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGdwaW9fb3RoZXI7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudDsKKworLyoqIFN0ZCBNQUMgQWRkcmVzcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9zdGRfbWFjX2FkZHJlc3MKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBhZGRyZXNzOyAgLyoqPCBBZGRyZXNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzOworCisvKiogVGVrIFZhciBEZXNjIEF0dHIgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSBhdHRyaWJ1dGU7ICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHN0YXQ7ICAgIC8qKjwgU3RhdC4gKi8KKyAgICAgICAgfSBwb3J0X3N0YXRfdGhyZXNob2xkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHN0YXQ7ICAgIC8qKjwgU3RhdC4gKi8KKyAgICAgICAgfSBsaW5rX3N0YXRfdGhyZXNob2xkOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2U7CisKKy8qKiBUTFMgUmVjb3JkIENvbnRpbnVlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZAoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlIGNvbnRlbnRfdHlwZTsgIC8qKjwgQ29udGVudCBUeXBlLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbiB2ZXJzaW9uOyAgICAgICAgICAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfY291bnQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBkYXRhLiAqLworICAgICAgICAgICAgdWludDhfdCAqZGF0YTsgIC8qKjwgRGF0YS4gKi8KKyAgICAgICAgfSBkZWY7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQ7CisKKy8qKiBUTFMgU2lnbmF0dXJlIEFuZCBIYXNoIEFsZ29yaXRobS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobQoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG0gaGFzaDsgICAgLyoqPCBIYXNoLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobSBzaWduYXR1cmU7ICAvKio8IFNpZ25hdHVyZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtOworCisvKiogVExTIFNpZ25hdHVyZSBBbmQgSGFzaCBBbGdvcml0aG0gTGlzdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0Cit7CisgICAgdWludDMyX3Qgc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50OyAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSAqc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zOyAgIC8qKjwgU3VwcG9ydGVkIFNpZ25hdHVyZSBBbGdvcml0aG1zLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdDsKKworLyoqIEB9ICovCisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19yZW1vdGVfc2lnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19yZW1vdGVfc2lnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b19yZW1vdGVfc2lnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3RvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXhfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXIgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2RfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9uX2lmX3N3aXRjaF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG9uX2lmX3N3aXRjaF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdXBwb3J0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Fja19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2FjayB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2FjayBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Fja191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWcgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZWFybHlfd2FrZV91cF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2ggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3RfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2VuYWJsZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX2ZsYWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcHBwb19lYXV0aF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlcyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2RiYV9zY2hlZHVsaW5nX3NjaGVtZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2RiYV9zY2hlZHVsaW5nX3NjaGVtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wcm90ZWN0aW9uX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wcm90ZWN0aW9uX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2xfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2wgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2wgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2lwbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BwcG9lX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BwcG9lX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3NlcnZpY2Vfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3NlcnZpY2Vfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19hY3Rpb25fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19hY3Rpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfcmVzZXRfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGUgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXRjaF9tYWNfYWRkcmVzc19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfbGlnaHRfY29udHJvbF9hY3Rpb25fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfbGlnaHRfY29udHJvbF9hY3Rpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHlfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X2V4Y2xfYWJpbGl0eSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYXV0aF9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYXV0aF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3BhY2soYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjayhiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9vcGVyYXRvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9vcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjayB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Fja19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2sgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Fja191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2sgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fZXZlbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fZXZlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fZXZlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2RpcmVjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2RpcmVjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2RvbWFpbl9vcHRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2ggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3RfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcF9wYWNrKGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0c19wYWNrKGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2Vycm9yX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfZXJyb3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXVfbWVkaWFfYXZhaWxhYmxlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9mZWNfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9mZWNfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9mZWNfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19zdWJ0eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zdWJ0eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBvbF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXhfcGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleF9wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleF9wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2RlcyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFncyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2ggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdF9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmdfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmRfcGFjayhiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFncyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZmxhZ3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWF0Y2hfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fZmxhZ3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9ucyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9ucyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9uc19wYWNrKGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9uc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9mb3J3YXJkX3F1YWxpZmllciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9mb3J3YXJkX3F1YWxpZmllciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19ob2xkb3Zlcl9mbGFncyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19ob2xkb3Zlcl9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWRpX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWRpX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXIgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9ucyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9ucyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9uc19wYWNrKGJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9uc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2wgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2xfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWRfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tZGlfY3Jvc3NvdmVyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tZGlfY3Jvc3NvdmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX21kaV9jcm9zc292ZXIgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3ZlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tZGlfY3Jvc3NvdmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3ZlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3NkbV9zdGF0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3NkbV9zdGF0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG1fcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG1fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG1fcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG0gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG0gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG1fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXBfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXAgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXBfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc19wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHkgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlciBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2Ugd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX2RlZl9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGUgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX2RlZl9jb3VudF9zZXJ2aWNlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RyYW5zbGF0aW9uX2NvdW50X3RyYW5zbGF0aW9ucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RydW5rX2NvdW50X3Blcm1pdHRlZF92bGFucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RydW5rX21kdV9jb3VudF9wZXJtaXR0ZWRfdmxhbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV9oeWJyaWRfY291bnRfcGVybWl0dGVkX3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3YgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3YgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2RlbGV0ZV9jb3VudF9tdWx0aWNhc3RfdmxhbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2FkZF9jb3VudF9tdWx0aWNhc3RfdmxhbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2xpc3RfY291bnRfbXVsdGljYXN0X3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5IAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkIHRvIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQgCisgKiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhIHRvIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjRzYV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjRzYSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EgCisgKiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2FfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjRzYSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2Egc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2Ffc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZCAKKyAqIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIAorICogYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIAorICogYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZCB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhIHRvIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjZzYV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjZzYSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EgCisgKiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2FfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjZzYSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2Egc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2Ffc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2wgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX29ubHlfY291bnRfZW50cmllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c192bGFuX2lkX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfaXB2NHNhX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfY291bnRfZW50cmllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfaXB2NnNhX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9maXJtd2FyZV92ZXJzaW9uX2NvdW50X2Zpcm13YXJlX3ZlcnNpb24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Ugd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0X2NvdW50X2ZpbGVuYW1lKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3dyaXRlX3JlcXVlc3RfY291bnRfbW9kZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9kYXRhX2NvdW50X2RhdGEoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZXJyb3JfY291bnRfbWVzc2FnZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2Ugc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfcmVzdG9yZV9vbnVfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvciB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3Igc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zb2Z0d2FyZV9kb3dubG9hZF9jb3VudF9tZXNzYWdlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2t0b251X2V2ZW50X2NvdW50X2V2ZW50cyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0cyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0cyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9vbnVfc3RhdGlzdGljX2NvdW50X3NlcXVlbmNlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3Qgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfY291bnRfbmFtZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfY291bnRfbWFjX2FkZHJlc3MoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9uZXR3b3JrX3Bvbl9jb3VudF9wb24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9saW5rX2NvdW50X2xpbmsoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV91c2VyX3BvcnRfY291bnRfcG9ydChiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2JyaWRnZV9jb3VudF9icmlkZ2UoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VfcG9ydF9jb3VudF9wb3J0KGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3Igc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92MiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92MiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92MiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9zZXRfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGUgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9uc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OF9wYWNrKGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4IHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2RlZl9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21hbnVmYWN0dXJlcl9pbmZvX2NvdW50X2RlZihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9maXJtd2FyZV9maWxlbmFtZV9jb3VudF9maXJtd2FyZV9maWxlbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tZnJfbmFtZV9jb3VudF9tYW5fbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV92ZW5kb3JfbmFtZV9jb3VudF92ZW5kb3JfbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tb2RlbF9udW1iZXJfY291bnRfbW9kZWxfbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2h3X3ZlcnNpb25fY291bnRfaHdfdmVyc2lvbihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3RlbXBlcmF0dXJlX2NvdW50X2N1cnJlbnRfdGVtcGVyYXR1cmUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl92Y2NfY291bnRfY3VycmVudF92Y2MoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9iaWFzX2NvdW50X2N1cnJlbnRfdHhfYmlhcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3R4X3Bvd2VyX2NvdW50X2N1cnJlbnRfdHhfcG93ZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl9yeF9wb3dlcl9jb3VudF9jdXJyZW50X3J4X3Bvd2VyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2RvbnVfcG9ydF90eXBlX2NvdW50X3BvcnRfdHlwZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmdfY291bnRfZGVmKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3RpbWVfdHJhbnNmZXJfY291bnRfdG9kX3N0cmluZyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGUgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV9jb3VudF9tYWNfYWRkcmVzcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfZmlsZV93cml0ZV9jb3VudF9maWxlbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3RsdiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3RsdiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eV9jb3VudF9jYXBhYmlsaXRpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHlfY291bnRfY2FwYWJpbGl0aWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX3J4X3RlY2hfY291bnRfY2FwYWJpbGl0aWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX21hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZF9jb3VudF9mdW5jdGlvbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVzcG9uc2VfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb20gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3Qgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3Qgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X2NvdW50X2NlcnRpZmljYXRlX2xpc3QoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0IAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfZmluaXNoZWRfY291bnRfdmVyaWZ5X2RhdGEoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfaGFuZHNoYWtlX2NvdW50X2hhbmRzaGFrZV9yZWNvcmRzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlX2NvdW50X3Rsc19yZWNvcmRzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1IHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWUgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWUgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2IHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19jdGNfY291bnRfc3VwcF92ZXJzaW9uKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2Ugd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX29iamVjdF9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2thZ2VfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9uYW1lX2JpbmRpbmdfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hdHRyaWJ1dGVfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hY3Rpb25fY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2xvZ2ljYWxfbGlua19jb3VudF9saW5rX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3BvcnRfY291bnRfcG9ydF9udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9uZXR3b3JrX3Bvbl9jb3VudF9wb25fbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdXNlcl9wb25fY291bnRfcG9uX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZV9jb3VudF9icmlkZ2VfbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfYnJpZGdlX3BvcnRfY291bnRfcG9ydF9udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3Igd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW5fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXBfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5IHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfY2xhdXNlX2NvdW50X21hdGNoX3ZhbHVlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfcmVzdWx0X2NvdW50X3BhcmFtZXRlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX3ZlcnNpb25fbnVtYmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlciBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWwgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfcGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcmVwb3J0X3RocmVzaG9sZHNfY291bnRfdGhyZXNob2xkcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9uZXdfZG5fZmlsdGVyX3RibF9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9uZXdfdXBfZmlsdGVyX3RibF9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9udnNfc2NyYXRjaHBhZF9jb3VudF9kYXRhKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9hZGRfcnVsZV9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX25ld19kZWxfcnVsZV9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2RlbGV0ZV9ydWxlX2NvdW50X3J1bGVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2Ugd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2RlZl9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2Ugc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2dldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9zZXRfcmVzcG9uc2VfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF91bmFja2VkX2FjdGlvbl9jb3VudF92YXJpYWJsZV9jb250YWluZXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2RhdGFfY291bnRfZGF0YShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfaW5mb19jb3VudF90bHZzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfZXZlbnRfbm90aWZpY2F0aW9uX2NvdW50X3RsdnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF92YXJfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdmFyX3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3BhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWkgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Igd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3Rsdl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm8gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm8gKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzYyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0IAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGUgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YyB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGMgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzYyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0IAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGUgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWsgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlayB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlayAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWsgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2Mgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Ugd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3Qgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9wYWNrKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3Qgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbiAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb24gc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbiB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbCAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2wgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2wgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX2RlZl9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF96ZXJvX2NvdW50X3BhZGRpbmcoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfcGFjayhiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfY291bnRfcHJvdG9jb2xzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW8gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50IHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzc19wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfbWFjX2FkZHJlc3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzc19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX2RlZl9jb3VudF9kYXRhKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3Qgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0IAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdF9jb3VudF9zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKyNlbmRpZiAvKiBCQ01PTFRfRVBPTl9PQU1fVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkMjQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKKyMgU3RhY2sKKyMKK01PRF9OQU1FID0gZGV2X2xvZworTU9EX1RZUEUgPSBsaWIKKworaWZlcSAoIiQoRU5BQkxFX0xPRykiLCAieSIpCisJTU9EX0RFUFMgPSBjbGkgdXRpbHMKKwlNT0RfREVGUyA9IC1ERU5BQkxFX0xPRworCVVTRV9MSU5UID0geWVzCisJc3JjcyA9IGJjbV9kZXZfbG9nLmMgYmNtX2Rldl9sb2dfdGFzay5jCisJaWZlcSAoIiQoRkVBVFVSRV9MT0cpIiwgInkiKQorCQlNT0RfREVGUyArPSAtRFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKwllbmRpZgorCisJaWZlcSAoIiQoREVWX0xPR19ERUJVRykiLCAieSIpCisJCU1PRF9ERUZTICs9IC1EREVWX0xPR19ERUJVRworCWVuZGlmCisJCisJaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisJCXNyY3MgKz0gYmNtX2Rldl9sb2dfY2xpLmMKKwllbmRpZgorCQorCWlmZXEgKCIkKFRPT0xDSEFJTikiLCAiZ2NjIikKKwkJRVhUUkFfQ0ZMQUdTICArPSAtV25vLWZvcm1hdC1zZWN1cml0eQorCWVuZGlmCisJCisJaWZlcSAoIiQoU1VCU1lTVEVNKSIsICJob3N0IikKKyAgICAgICBpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKyAgICAgICAgICAgaWZlcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCisgICAgICAgICAgICAgICBFWFRSQV9JTkNMVURFUyArPSAtSSQoVE9QX0RJUikvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eAorICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBFWFRSQV9JTkNMVURFUyArPSAtSSQoVE9QX0RJUikvaG9zdC9kZXZfbG9nX2xpbnV4CisgICAgICAgICAgIGVuZGlmCisgICAgICAgZW5kaWYKKwllbmRpZgorCQorICAgIGlmZXEgKCIkKE9TKSIsICJwb3NpeCIpCisgICAgICAgIEVOQUJMRV9MT0dfU1lTTE9HID89IHkKKyAgICAgICAgaWZlcSAoIiQoRU5BQkxFX0xPR19TWVNMT0cpIiwgInkiKQorICAgICAgICAgICAgTU9EX0RFRlMgKz0gLURERVZfTE9HX1NZU0xPRworICAgICAgICBlbmRpZiAgICAgICAgICAgICAgICAgICAgICAKKyAgICBlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOGNjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZy5jCkBAIC0wLDAgKzEsNDA5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZkZWYgRU5BQkxFX0xPRworCisjaW5jbHVkZSAiYmNtX2Rldl9sb2dfdGFzay5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nX3Rhc2tfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJiY21fZGV2X2xvZy5oIgorCitzdGF0aWMgYmNtb3NfdGltZXIgZGV2X2xvZ190aW1lcjsKKworLyogU3RvcmUgdGltZXN0YW1wIHBlciBldmVyeSByYXRlLWxpbWl0ZWQgbG9nIElELiAqLworc3RhdGljIHVpbnQ2NF90IHJhdGVfbGltaXRfaWQydGltZXN0YW1wW0RFVl9MT0dfUkFURV9MSU1JVF9JRF9fTlVNX09GXTsKKworY29uc3QgY2hhciAqZGV2X2xvZ19iYXNlbmFtZShjb25zdCBjaGFyICpzdHIpCit7CisgICAgY29uc3QgY2hhciAqc2xhc2g7CisgICAgaWYgKChzbGFzaCA9IHN0cmNocihzdHIsICcvJykpKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqc3RyMCA9IHN0cjsKKyAgICAgICAgc3RyID0gc3RyY2hyKHNsYXNoKzEsICcgJyk7CisgICAgICAgIC8qIElmIGxvZyBmb3JtYXQgc3RyaW5nIHdhcyBjcmVhdGVkIGJ5IEJDTV9MT0cgbWFjcm8gYW5kIHRoZXJlIGlzIG5vIGNvcnJ1cHRpb24gb2Ygc29tZSBraW5kCisgICAgICAgICAqIHN0ciBhYm92ZSBpcyBndWFyYW50ZWVkIHRvIGJlICE9IE5VTEwuIEhvd2V2ZXIsIG1ha2luZyBzdHIhPU5VTEwgYXNzdW1wdGlvbiBtYWtlcyBkZXZfbG9nCisgICAgICAgICAqIHZ1bG5lcmFibGUgdG8gYnVncyBpbiB0aGUgY2FsbGVyLiBJbiB0aGlzIGNhc2UgdGhlIGZvbGxvd2luZyBpbmV4cGVuc2l2ZSBjaGVjayBwcmV2ZW50cyBjcmFzaAorICAgICAgICAgKiBpbiBkZXZfTG9nIGFuZCBoZWxwcyBpbiBpZGVudGlmeWluZyB0aGUgcmVhbCBjdWxwcml0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFzdHIpCisgICAgICAgICAgICByZXR1cm4gc3RyMDsKKyAgICAgICAgd2hpbGUgKHN0clswXSAhPSAnLycpCisgICAgICAgICAgICBzdHItLTsKKyAgICAgICAgc3RyKys7CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCisKKy8qIGNoZWNrIGlmIHRoZSBtZXNzYWdlIGZpdHMgdGhlIGxldmVsIGFuZCB0aGUgb3RoZXIgY3JpdGVyaWEgZm9yIGEgdHJpZ2dlcgorICAgcmV0dXJuIDEgaWYgeWVzLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQKKyAgIGFuZCByZXR1cm5zIDAgaWYgdGhlIG1lc3NhZ2Ugd2lsbCBub3QgYmUgcHJpbnRlZAorKi8KK3N0YXRpYyBiY21vc19ib29sIGNoZWNrX3RyaWdnZXIoZGV2X2xvZ19pZF9wYXJtICp4aV9pZCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsKQoreworICAgIC8qIHRoZSBsZXZlbCBvZiB0aGUgbWVzc2FnZSBtdXN0IGJlIGV4YWN0bHkgdGhlIHRyaWdnZXIgbGV2ZWwgKi8KKyAgICBpZiAoeGlfaWQtPnRyaWdnZXJfbG9nX2xldmVsICE9IHhpX2xvZ19sZXZlbCkKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOyAvKiBkbyBub3QgcHJpbnQgdGhlIG1lc3NhZ2UgIC0gdGhlIGxldmVsIGRvZXMgbm90IGZpdCAqLworICAgIAorICAgIHhpX2lkLT50cmlnZ2VyLmNvdW50ZXIrKzsKKyAgICBpZiAoeGlfaWQtPnRyaWdnZXIuY291bnRlciA+PSB4aV9pZC0+dHJpZ2dlci5zdGFydF90aHJlc2hvbGQpCisgICAgeworICAgICAgICBpZiAoeGlfaWQtPnRyaWdnZXIuY291bnRlciA+PSB4aV9pZC0+dHJpZ2dlci5zdG9wX3RocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogdHJpZ2dlciBmaW5pc2hlZCwgY2hlY2sgcmVwZWF0ICovCisgICAgICAgICAgICBpZiAoeGlfaWQtPnRyaWdnZXIucmVwZWF0X3RocmVzaG9sZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4aV9pZC0+dHJpZ2dlci5yZXBlYXQrKzsKKyAgICAgICAgICAgICAgICBpZiAoeGlfaWQtPnRyaWdnZXIucmVwZWF0IDwgeGlfaWQtPnRyaWdnZXIucmVwZWF0X3RocmVzaG9sZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJld2luZCB0cmlnZ2VyIGNvbmRpdGlvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgeGlfaWQtPnRyaWdnZXIuY291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgLyogdHJpZ2dlciBpcyBhY3RpdmUgOiBjb3VudGVyIGdyZWF0ZXIgdGhhbiBzdGFydCBhbmQgbGVzcyB0aGFuIGVuZCAqLworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7IC8qIHByaW50IHRoZSBtZXNzYWdlICovCisgICAgfQorICAgIHJldHVybiBCQ01PU19GQUxTRTsvKiBkbyBub3QgcHJpbnQgdGhlIG1lc3NhZ2UgIC0gc3RpbGwgbGVzcyB0aGFuIHN0YXJ0IHRocmVzaG9sZCAqLworfQorCisvKiBjaGVjayBpZiB0aGUgbWVzc2FnZSBmaXRzIHRoZSBsZXZlbCBhbmQgdGhlIGNyaXRlcmlhIGZvciB0aHJvdHRsZQorICAgcmV0dXJuIDEgaWYgeWVzLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQKKyAgIGFuZCByZXR1cm5zIDAgaWYgdGhlIG1lc3NhZ2Ugd2lsbCBub3QgYmUgcHJpbnRlZAorKi8KK3N0YXRpYyBiY21vc19ib29sIGNoZWNrX3Rocm90dGxlKGRldl9sb2dfaWRfcGFybSAqeGlfaWQsIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCkKK3sKKyAgICAvKiBjaGVjayBpZiBhbnkgdGhyb3R0bGUgaXMgZGVmaW5lZCAqLworICAgIGlmICh4aV9pZC0+dGhyb3R0bGVfbG9nX2xldmVsICE9IERFVl9MT0dfTEVWRUxfTk9fTE9HKQorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsgLyogcHJpbnQgdGhlIG1lc3NhZ2UgIC0gbm8gdHJpZ2dlciBpcyBzZXQgKi8KKyAgICAKKyAgICAvKiB0aGUgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgbXVzdCBiZSBleGFjdGx5IHRoZSB0aHJvdHRsZSBsZXZlbCAqLworICAgIGlmICh4aV9pZC0+dGhyb3R0bGVfbG9nX2xldmVsICE9IHhpX2xvZ19sZXZlbCkKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOyAvKiBkbyBub3QgcHJpbnQgdGhlIG1lc3NhZ2UgIC0gdGhlIGxldmVsIGRvZXMgbm90IGZpdCAqLworICAgIAorICAgIHhpX2lkLT50aHJvdHRsZS5jb3VudGVyKys7CisgICAgaWYgKHhpX2lkLT50aHJvdHRsZS5jb3VudGVyID49IHhpX2lkLT50aHJvdHRsZS50aHJlc2hvbGQpCisgICAgeworICAgICAgICB4aV9pZC0+dGhyb3R0bGUuY291bnRlciA9IDA7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7LyogZG8gbm90IHByaW50IHRoZSBtZXNzYWdlICAtIHN0aWxsIGxlc3MgdGhhbiBzdGFydCB0aHJlc2hvbGQgKi8KK30KKworI2VuZGlmCisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBiY21fZGV2X2xvZ19tc2dfc2VuZF90aW1lcl9jYihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19tc2cgKm1zZyA9IChiY21vc19tc2cgKilkYXRhOworICAgIGJjbW9zX21zZ19zZW5kKCZkZXZfbG9nLnNhdmVfcXVldWUsIG1zZywgQkNNT1NfTVNHX1NFTkRfQVVUT19GUkVFKTsKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK3VpbnQ4X3QgYmNtX2Rldl9sb2dfcG9vbF9vY2N1cGFuY3lfcGVyY2VudF9nZXQodm9pZCkKK3sKKyAgICBiY21vc19tc2dfcG9vbF9pbmZvIG1zZ19wb29sX2luZm87CisgICAgYmNtb3NfZXJybm8gZXJyb3IgPSBiY21vc19tc2dfcG9vbF9xdWVyeSgmZGV2X2xvZy5wb29sLCAmbXNnX3Bvb2xfaW5mbyk7CisgICAgaWYgKGVycm9yICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiYmNtb3NfbXNnX3Bvb2xfcXVlcnkoKSByZXR1cm5lZCAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihlcnJvciksIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAodWludDhfdCkoKDEwMCAqIChtc2dfcG9vbF9pbmZvLnBhcm0uc2l6ZSAtIG1zZ19wb29sX2luZm8uc3RhdC5mcmVlKSkgLyBtc2dfcG9vbF9pbmZvLnBhcm0uc2l6ZSk7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIGJjbV9kZXZfbG9nX3Nob3VsZF9kcm9wKAorICAgIGRldl9sb2dfaWRfcGFybSAqaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHJhdGVfdXMsCisgICAgZGV2X2xvZ19yYXRlX2xpbWl0X2lkIHJhdGVfbGltaXRfaWQpCit7CisgICAgLyogSWYgdGhlIG1zZyBwb29sIGlzIHN1ZmZpY2llbnRseSBmdWxsLCBkcm9wIGFsbCBub24tZXJyb3IgbWVzc2FnZXMgKi8KKyAgICBpZiAoIWJjbV9kZXZfbG9nX2xldmVsX2lzX2Vycm9yKGxvZ19sZXZlbCkgJiYKKyAgICAgICAgYmNtX2Rldl9sb2dfcG9vbF9vY2N1cGFuY3lfcGVyY2VudF9nZXQoKSA+PSBERVZfTE9HX0VSUk9SX09OTFlfVEhSRVNIT0xEX1BFUkNFTlQpCisgICAgeworICAgICAgICBiY21fZGV2X2xvZ19kcm9wX3JlcG9ydCgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgCisjaWZkZWYgVFJJR0dFUl9MT0dHRVJfRkVBVFVSRQorICAgIC8qIGlmIHRyaWdnZXIgZGVmaW5lZCAtIGlnbm9yZSB0aHJvdHRsZSBhbmQgcHJpbnRpbmcgbGV2ZWwgKi8KKyAgICBpZiAoaWQtPnRyaWdnZXJfbG9nX2xldmVsICE9IERFVl9MT0dfTEVWRUxfTk9fTE9HKQorICAgICAgICByZXR1cm4gY2hlY2tfdHJpZ2dlcihpZCwgbG9nX2xldmVsKTsKKyNlbmRpZgorICAgIAorICAgIC8qIGlmIHRyaWdnZXIgaXMgbm90IGZ1bGxmaWxsZWQgLSBjaGVjayBvdGhlciBjb25kaXRpb25zICovCisgICAgaWYgKGxvZ19sZXZlbCA+IGlkLT5sb2dfbGV2ZWxfcHJpbnQgJiYgbG9nX2xldmVsID4gaWQtPmxvZ19sZXZlbF9zYXZlKQorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAKKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCisgICAgaWYgKCFjaGVja190aHJvdHRsZShpZCwgbG9nX2xldmVsKSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisjZW5kaWYKKworICAgIGlmIChyYXRlX3VzICYmIHJhdGVfbGltaXRfaWQgIT0gREVWX0xPR19SQVRFX0xJTUlUX0lEX05PTkUpCisgICAgeworICAgICAgICB1aW50NjRfdCBjdXJyX3RpbWVzdGFtcDsKKworICAgICAgICAvKiBEbyByYXRlIGxpbWl0LiAqLworICAgICAgICBjdXJyX3RpbWVzdGFtcCA9IGJjbW9zX3RpbWVzdGFtcDY0KCk7CisgICAgICAgIGlmIChjdXJyX3RpbWVzdGFtcCAtIHJhdGVfbGltaXRfaWQydGltZXN0YW1wW3JhdGVfbGltaXRfaWRdIDwgcmF0ZV91cykKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOyAvKiBGaWx0ZXIgb3V0IHRoaXMgbWVzc2FnZS4gKi8KKyAgICAgICAgcmF0ZV9saW1pdF9pZDJ0aW1lc3RhbXBbcmF0ZV9saW1pdF9pZF0gPSBjdXJyX3RpbWVzdGFtcDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkIF9iY21fZGV2X2xvZ192bG9nKGRldl9sb2dfaWQgeGlfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHhpX2ZsYWdzLAorICAgIHVpbnQzMl90IHJhdGVfdXMsCisgICAgZGV2X2xvZ19yYXRlX2xpbWl0X2lkIHJhdGVfbGltaXRfaWQsIAorICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICB2YV9saXN0IGFyZ3MpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKyAgICBkZXZfbG9nX3F1ZXVlX21zZyAqbG9nX3F1ZXVlX21zZzsKKyAgICBiY21vc19lcnJubyBlcnJvciA9IEJDTV9FUlJfT0s7CisgICAgYmNtb3NfbXNnICptc2c7CisKKyAgICBpZiAoZGV2X2xvZy5zdGF0ZSAhPSBCQ01fREVWX0xPR19TVEFURV9FTkFCTEVEKQorICAgIHsKKyAgICAgICAgaWYgKGRldl9sb2cuZmxhZ3MgJiBCQ01fREVWX0xPR19GTEFHX0RJU0FCTEVEX1dJVEhfUFJJTlRGKQorICAgICAgICAgICAgREVWX0xPR19WUFJJTlRGKGZtdCwgYXJncyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF4aV9pZCB8fCAoeGlfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKSkKKyAgICB7CisgICAgICAgIC8qIElmIHRoaXMgSUQgd2FzIG5vdCByZWdpc3RlcmVkIC0gb3IgcmVnaXN0ZXJlZCBpbmNvcnJlY3RseSAqLworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICBERVZfTE9HX1ZQUklOVEYoZm10LCBhcmdzKTsgLyogVGhpcyB3aWxsIGFsbG93IHVzIHRvIGRlYnVnIHdoYXQgbGluZSBjYXVzZWQgdGhlIGJ1Zy4gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKHhpX2xvZ19sZXZlbCA+PSBERVZfTE9HX0xFVkVMX05VTV9PRikgfHwgKHhpX2xvZ19sZXZlbCA9PSBERVZfTE9HX0xFVkVMX05PX0xPRykpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigieGlfbG9nX2xldmVsICgldSkgaXMgaW52YWxpZFxuIiwgeGlfbG9nX2xldmVsKTsKKyAgICAgICAgREVWX0xPR19WUFJJTlRGKGZtdCwgYXJncyk7IC8qIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBkZWJ1ZyB3aGF0IGxpbmUgY2F1c2VkIHRoZSBidWcuICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGlkLT5sb2dfdHlwZSA9PSBERVZfTE9HX0lEX1RZUEVfTk9ORSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWZkZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisgICAgLyogQWx3YXlzIHVzZSBDQUxMRVJfRk1UIG1vZGUgb24gdGhlIGhvc3QgdG8gYXZvaWQgcG9ydGFiaWxpdHkgaXNzdWVzIHdpdGgKKyAgICAgKiB0cmFuc2ZlcnJpbmcgdmFfbGlzdCBhcyBhbiBhcnJheSAqLworICAgIHhpX2ZsYWdzIHw9IEJDTV9MT0dfRkxBR19DQUxMRVJfRk1UOworI2VuZGlmCisKKyAgICAvKiBVcGRhdGUgbG9nIGlkIGNvdW50ZXJzICAqLworICAgIGlkLT5jb3VudGVyc1t4aV9sb2dfbGV2ZWxdKys7CisKKyAgICBpZiAoYmNtX2Rldl9sb2dfc2hvdWxkX2Ryb3AoaWQsIHhpX2xvZ19sZXZlbCwgcmF0ZV91cywgcmF0ZV9saW1pdF9pZCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1zZyA9IGJjbW9zX21zZ19wb29sX2FsbG9jKCZkZXZfbG9nLnBvb2wpOworICAgIGlmICghbXNnKQorICAgIHsKKyAgICAgICAgYmNtX2Rldl9sb2dfZHJvcF9yZXBvcnQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2dfcXVldWVfbXNnID0gbXNnLT5kYXRhOworICAgIC8qIENyZWF0ZSBsb2cgbWVzc2FnZSAqLworICAgIGxvZ19xdWV1ZV9tc2ctPmxvZ19pZCA9IGlkOworICAgIGxvZ19xdWV1ZV9tc2ctPnRpbWVfc3RhbXAgPSBkZXZfbG9nLmRldl9sb2dfcGFybS5nZXRfdGltZV9jYigpOworICAgIGxvZ19xdWV1ZV9tc2ctPm1zZ19sZXZlbCA9IHhpX2xvZ19sZXZlbDsKKyAgICBsb2dfcXVldWVfbXNnLT5mbGFncyA9IHhpX2ZsYWdzOworI2lmbmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QKKyAgICAvKiBJdCBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeSB0byBjb21waWxlIG91dCBub24gQ0FMTEVSX0ZNVCBjYXNlIG9uIHRoZSBob3N0LgorICAgICAqIEhvd2V2ZXIsIGtlZXBpbmcgdW51c2VkIGNvZGUgd2lsbCBtYWtlIENvdmVyaXR5IHVuaGFwcHkgKi8KKyAgICBpZiAodW5saWtlbHkoeGlfZmxhZ3MgJiBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCkpCisgICAgeworI2VuZGlmIC8qICNpZm5kZWYgQkNNX1NVQlNZU1RFTV9IT1NUICovCisgICAgICAgIHZzbnByaW50Zihsb2dfcXVldWVfbXNnLT51LnN0ciwgTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUsICh4aV9mbGFncyAmIEJDTV9MT0dfRkxBR19GSUxFTkFNRV9JTl9GTVQpID8gZGV2X2xvZ19iYXNlbmFtZShmbXQpIDogZm10LCBhcmdzKTsKKyNpZm5kZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICAgICAgbG9nX3F1ZXVlX21zZy0+dS5mbXRfYXJncy5mbXQgPSBmbXQ7CisKKyAgICAgICAgb2Zmc2V0ID0gKChsb25nKWxvZ19xdWV1ZV9tc2ctPnUuZm10X2FyZ3MuYXJncyAlIDggPT0gMCkgPyAwIDogMTsgLyogc3RhcnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBERVZfTE9HX01BWF9BUkdTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ19xdWV1ZV9tc2ctPnUuZm10X2FyZ3MuYXJnc1tpICsgb2Zmc2V0XSA9IHZhX2FyZyhhcmdzLCB2b2lkICopOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qICNpZm5kZWYgQkNNX1NVQlNZU1RFTV9IT1NUICovCisKKyAgICBpZiAoYmNtb3Nfc2VtX3Bvc3RfaXNfYWxsb3dlZCgpKQorICAgIHsKKyAgICAgICAgZXJyb3IgPSBiY21vc19tc2dfc2VuZCgmZGV2X2xvZy5zYXZlX3F1ZXVlLCBtc2csIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX3RpbWVyX3Bhcm0gdGltZXJfcGFyYW1zID0KKyAgICAgICAgeworICAgICAgICAgICAgLm5hbWUgPSAiZGV2X2xvZ190aW1lciIsCisgICAgICAgICAgICAuaGFuZGxlciA9IGJjbV9kZXZfbG9nX21zZ19zZW5kX3RpbWVyX2NiLAorICAgICAgICB9OworCisgICAgICAgIGlmICghKGRldl9sb2dfdGltZXIuZmxhZ3MgJiBCQ01PU19USU1FUl9GTEFHX1ZBTElEKSkKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX2NyZWF0ZSgmZGV2X2xvZ190aW1lciwgJnRpbWVyX3BhcmFtcyk7CisgICAgICAgIC8qIExpbWl0YXRpb246IFdlIGRvbid0IHNlbmQgbW9yZSB0aGFuIDEgbG9nZ2VyIG1lc3NhZ2UgZXZlbiBpZiBfYmNtX2Rldl9sb2dfdmxvZygpIHdhcyBjYWxsZWQgbXVsdGlwbGUgdGltZXJzIGluIElSUXMgZGlzYWJsZWQgbW9kZSBiZWNhdXNlIHdlIGhhdmUgYSBzaW5nbGUgdGltZXIuICovCisgICAgICAgIGlmICghYmNtb3NfdGltZXJfaXNfcnVubmluZygmZGV2X2xvZ190aW1lcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX2hhbmRsZXJfc2V0KCZkZXZfbG9nX3RpbWVyLCBiY21fZGV2X2xvZ19tc2dfc2VuZF90aW1lcl9jYiwgKGxvbmcpbXNnKTsKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfbG9nX3RpbWVyLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnJvciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgaWQtPmxvc3RfbXNnX2NudCsrOworICAgIH0KK30KKwordm9pZCBiY21fZGV2X2xvZ192bG9nKGRldl9sb2dfaWQgeGlfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHhpX2ZsYWdzLAorICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICB2YV9saXN0IGFyZ3MpCit7CisgICAgX2JjbV9kZXZfbG9nX3Zsb2coeGlfaWQsIHhpX2xvZ19sZXZlbCwgeGlfZmxhZ3MsIDAsIERFVl9MT0dfUkFURV9MSU1JVF9JRF9OT05FLCBmbXQsIGFyZ3MpOworfQorCisvKiBJTVBPUlRBTlQhISEKKyAqIFRoZSBmdW5jdGlvbiBiY21fZGV2X2xvZ19sb2coKSBtdXN0IGhhdmUgZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzIGJlZm9yZSB0aGUgJy4uLicgKHNlZSBjb21tZW50cyBvbiBoZWFkZXIgZmlsZSkuCisgKi8KK3ZvaWQgYmNtX2Rldl9sb2dfbG9nKGRldl9sb2dfaWQgeGlfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHhpX2ZsYWdzLAorICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICBiY21fZGV2X2xvZ192bG9nKHhpX2lkLCB4aV9sb2dfbGV2ZWwsIHhpX2ZsYWdzLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKK30KKwordm9pZCBiY21fZGV2X2xvZ19sb2dfcmF0ZWxpbWl0KGRldl9sb2dfaWQgeGlfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHhpX2ZsYWdzLAorICAgIHVpbnQzMl90IHJhdGVfdXMsCisgICAgZGV2X2xvZ19yYXRlX2xpbWl0X2lkIHJhdGVfbGltaXRfaWQsCisgICAgY29uc3QgY2hhciAqZm10LAorICAgIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgIF9iY21fZGV2X2xvZ192bG9nKHhpX2lkLCB4aV9sb2dfbGV2ZWwsIHhpX2ZsYWdzLCByYXRlX3VzLCByYXRlX2xpbWl0X2lkLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKK30KKworI2lmZGVmIEJDTU9TX1RSQUNFX0lOX0RFVl9MT0cKKworc3RhdGljIGRldl9sb2dfaWQgYmNtb3NfdHJhY2VfZGV2X2xvZ19pZFtdID0KK3sKKyAgICBbQkNNT1NfVFJBQ0VfTEVWRUxfTk9ORV0gPSBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgW0JDTU9TX1RSQUNFX0xFVkVMX0VSUk9SXSA9IERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICBbQkNNT1NfVFJBQ0VfTEVWRUxfSU5GT10gPSBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgW0JDTU9TX1RSQUNFX0xFVkVMX1ZFUkJPU0VdID0gREVWX0xPR19JTlZBTElEX0lELAorICAgIFtCQ01PU19UUkFDRV9MRVZFTF9ERUJVR10gPSBERVZfTE9HX0lOVkFMSURfSUQKK307CisKK3N0YXRpYyBiY21fZGV2X2xvZ19sZXZlbCBiY21vc190cmFjZV9kZXZfbG9nX2xldmVsW10gPQoreworICAgIFtCQ01PU19UUkFDRV9MRVZFTF9FUlJPUl0gPSBERVZfTE9HX0xFVkVMX0VSUk9SLAorICAgIFtCQ01PU19UUkFDRV9MRVZFTF9JTkZPXSA9IERFVl9MT0dfTEVWRUxfSU5GTywKKyAgICBbQkNNT1NfVFJBQ0VfTEVWRUxfVkVSQk9TRV0gPSBERVZfTE9HX0xFVkVMX0lORk8sCisgICAgW0JDTU9TX1RSQUNFX0xFVkVMX0RFQlVHXSA9IERFVl9MT0dfTEVWRUxfREVCVUcKK307CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19vc190cmFjZV9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogRGlyZWN0IGJjbW9zX3RyYWNlKCkgb3V0cHV0IHRvIGxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6IE5PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19vc190cmFjZV9pbml0KHZvaWQpCit7CisjaWZkZWYgQkNNT1NfVFJBQ0VfSU5fREVWX0xPRworICAgIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1JdID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoInRyYWNlX2Vycm9yIiwKKyAgICAgICAgREVWX0xPR19MRVZFTF9FUlJPUiwgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbQkNNT1NfVFJBQ0VfTEVWRUxfSU5GT10gPSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcigidHJhY2VfaW5mbyIsCisgICAgICAgIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbQkNNT1NfVFJBQ0VfTEVWRUxfVkVSQk9TRV0gPSBiY21vc190cmFjZV9kZXZfbG9nX2lkW0JDTU9TX1RSQUNFX0xFVkVMX0lORk9dOworICAgIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbQkNNT1NfVFJBQ0VfTEVWRUxfREVCVUddID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoInRyYWNlX2RlYnVnIiwKKyAgICAgICAgREVWX0xPR19MRVZFTF9ERUJVRywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIGlmIChiY21vc190cmFjZV9kZXZfbG9nX2lkW0JDTU9TX1RSQUNFX0xFVkVMX0VSUk9SXSA9PSBERVZfTE9HX0lOVkFMSURfSUQgfHwKKyAgICAgICAgYmNtb3NfdHJhY2VfZGV2X2xvZ19pZFtCQ01PU19UUkFDRV9MRVZFTF9JTkZPXSAgPT0gREVWX0xPR19JTlZBTElEX0lEIHx8CisgICAgICAgIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbQkNNT1NfVFJBQ0VfTEVWRUxfREVCVUddID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyNlbHNlIC8qICNpZmRlZiBCQ01PU19UUkFDRV9JTl9ERVZfTE9HICovCisgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyNlbmRpZgorfQorCisjaWZkZWYgQkNNT1NfVFJBQ0VfSU5fREVWX0xPRworCisvKiBEaXJlY3QgT1MgdHJhY2UgdG8gZGV2X2xvZyAqLwordm9pZCBiY21vc190cmFjZShiY21vc190cmFjZV9sZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBpZiAoYmNtb3NfdHJhY2VfZGV2X2xvZ19pZFtsZXZlbF0gIT0gREVWX0xPR19JTlZBTElEX0lEICYmIGRldl9sb2cuc3RhdGUgPT0gQkNNX0RFVl9MT0dfU1RBVEVfRU5BQkxFRCkKKyAgICB7CisgICAgICAgIGlmIChsZXZlbCA9PSBCQ01PU19UUkFDRV9MRVZFTF9FUlJPUikKKyAgICAgICAgICAgIGJjbV9kZXZfbG9nX3Zsb2coYmNtb3NfdHJhY2VfZGV2X2xvZ19pZFtsZXZlbF0sIGJjbW9zX3RyYWNlX2Rldl9sb2dfbGV2ZWxbbGV2ZWxdLCBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCwgZm9ybWF0LCBhcmdzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmNtX2Rldl9sb2dfdmxvZyhiY21vc190cmFjZV9kZXZfbG9nX2lkW2xldmVsXSwgYmNtb3NfdHJhY2VfZGV2X2xvZ19sZXZlbFtsZXZlbF0sIDAsIGZvcm1hdCwgYXJncyk7CisgICAgfQorCisgICAgdmFfZW5kKGFyZ3MpOworfQorCisjZW5kaWYKKworI2VuZGlmIC8qIEVOQUJMRV9MT0cgKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTE1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZy5oCkBAIC0wLDAgKzEsMjI0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9fQkNNX0RFVl9MT0dfSF8KKyNkZWZpbmUgX19CQ01fREVWX0xPR19IXworCisjaWZkZWYgRU5BQkxFX0xPRworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSAiYmNtX2Rldl9sb2dfdGFzay5oIgorI2lmZGVmIEVOQUJMRV9DTEkKKyNpbmNsdWRlICJiY21fZGV2X2xvZ19jbGkuaCIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBMb2cgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUFDUk9fQVJHX04oXzEsXzIsXzMsXzQsXzUsXzYsXzcsXzgsXzksXzEwLF8xMSxfMTIsXzEzLF8xNCxfMTUsXzE2LF8xNyxfMTgsXzE5LF8yMCxfMjEsXzIyLF8yMyxfMjQsXzI1LF8yNixfMjcsXzI4LF8yOSxfMzAsXzMxLF8zMixOLC4uLikgTgorI2RlZmluZSBNQUNST1NfQVJHU19TRVFVRU5DRSAzMiwgMzEsIDMwLCAyOSwgMjgsIDI3LCAyNiwgMjUsIDI0LCAyMywgMjIsIDIxLCAyMCwgMTksIDE4LCAxNywgMTYsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAKKyNkZWZpbmUgTUFDUk9fTlVNX0FSR1NfSEVMUEVSKC4uLikgICAgTUFDUk9fQVJHX04oX19WQV9BUkdTX18pCisjZGVmaW5lIE1BQ1JPX05VTV9BUkdTKC4uLikgICAgIE1BQ1JPX05VTV9BUkdTX0hFTFBFUihfX1ZBX0FSR1NfXywgTUFDUk9TX0FSR1NfU0VRVUVOQ0UpCisKKy8qIElNUE9SVEFOVCEgRE8gTk9UIFVTRSBUSEVTRSBNQUNST1MsIFVTRSBCQ01fTE9HIE9OTFkgISAqLworLyogVGhlc2UgbWFjcm9zIGZvcmNlIG51bWJlciBvZiBhcmd1bWVudHMgaW4gY29tcGlsZSB0aW1lLiBBIHNpbmdsZSBtYWNybyBmb3IgZWFjaCBudW1iZXIgb2YgYXJndW1lbnRzIChpbmNsdWRpbmcgdGhlIGZvcm1hdCkgKi8KKyNpZmRlZiBfX0JBU0VOQU1FX18KKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzEobGV2ZWwsIGlkLCBmbGFncywgLi4uKSBcCisgICAgYmNtX2Rldl9sb2dfbG9nKGlkLCBsZXZlbCwgZmxhZ3MsIFNUUklOR0lGWV9FWFBBTkQoX19CQVNFTkFNRV9fKSAiICIgU1RSSU5HSUZZX0VYUEFORChfX0xJTkVfXykgInwgIiBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxKGxldmVsLCBpZCwgZmxhZ3MsIC4uLikgXAorICAgIGJjbV9kZXZfbG9nX2xvZyhpZCwgbGV2ZWwsIGZsYWdzIHwgQkNNX0xPR19GTEFHX0ZJTEVOQU1FX0lOX0ZNVCwgX19GSUxFX18gIiAiIFNUUklOR0lGWV9FWFBBTkQoX19MSU5FX18pICJ8ICIgX19WQV9BUkdTX18pCisjZW5kaWYKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzIoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzMoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzQoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzUoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzYoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzcoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzgoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzkoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzEwKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxMSguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMTIoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzEzKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxNCguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMTUoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzE2KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxNyguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMTgoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzE5KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyMCguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMjEoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzIyKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyMyguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMjQoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzI1KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyNiguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMjcoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzI4KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyOSguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMzAoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzMxKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MzMiguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMzMoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzM0KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MzNSguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMzYoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUyhuKSBfQkNNX0xPR19BUkdTIyNuCisjZGVmaW5lIF9CQ01fTE9HX0VYUEFORChuLC4uLikgX0JDTV9MT0dfQVJHUyhuKSAoX19WQV9BUkdTX18pCisKKy8qCisgKiBJTVBPUlRBTlQhIHlvdSBzaG91bGQgdXNlIG9ubHkgdGhpcyBtYWNybyBmb3IgbG9nZ2luZworICoKKyAqIDEuIFN1cHBvcnQgcHJpbnRzIHVwIHRvIERFVl9MT0dfTUFYX0FSR1MgcGFyYW1ldGVycyBlYWNoIHdpdGggbWF4aW11bSBzaXplIG9mIDMyYml0cworICogMi4gU3VwcG9ydCBhbHNvIHByaW50cyBvZiBhcmd1bWVudHMgd2l0aCBzaXplIDY0Yml0cyBidXQgZWFjaCBvbmUgY291bnRlZCBhcyB0d28gYXJndW1lbnRzIG9mIDMyYml0cywKKyAqICAgIHNvIHlvdSBjYW4gb25seSBwcmludCB1cCB0byAoREVWX0xPR19NQVhfQVJHUy8yKSBhcmd1bWVudHMgb2YgNjRiaXRzLgorICogICAgTWl4IG9mIDY0IGFuZCAzMiBhcmUgYWxsb3dlZCBhcyBsb25nIHlvdSBkb24ndCBleGNlZWQgREVWX0xPR19NQVhfQVJHUy4KKyAqIDMuIEFueSBwb3NzaWJsZSBjb21iaW5hdGlvbiBvZiBtaXggMzIgYW5kIDY0IGFyZ3VtZW50cyBhcmUgYWxsb3dlZC4KKyAqLworI2RlZmluZSBCQ01fTE9HKGxldmVsLCBpZCwgLi4uKSBfQkNNX0xPR19FWFBBTkQoTUFDUk9fTlVNX0FSR1MoX19WQV9BUkdTX18pLCBERVZfTE9HX0xFVkVMXyMjbGV2ZWwsIGlkLCAwLCBfX1ZBX0FSR1NfXykKKy8qIFNhbWUgYXMgQkNNX0xPRygpLCBidXQgb3ZlcnJpZGVzIEJDTV9MT0coKSBkZWZhdWx0IGJlaGF2aW9yIGJ5IGxldHRpbmcgdGhlIGZvcm1hdCBiZSBkb25lIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsZXIgdGFzay4gVGhpcyBhbGxvd3MgdXNpbmcgc3RhY2svaGVhcCBzdHJpbmdzCisgKiBmb3IgZm10IGFuZCBhcmdzLiBTZWUgY29tbWVudCBmb3IgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQuICovCisjZGVmaW5lIEJDTV9MT0dfQ0FMTEVSX0ZNVChsZXZlbCwgaWQsIC4uLikgX0JDTV9MT0dfRVhQQU5EKE1BQ1JPX05VTV9BUkdTKF9fVkFfQVJHU19fKSwgREVWX0xPR19MRVZFTF8jI2xldmVsLCBpZCwgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQsIF9fVkFfQVJHU19fKQorCisvKiBTYW1lIGFzIEJDTV9MT0coKSwgYnV0IHRoZSBsZXZlbCBpcyBub3QgZ2l2ZW4gYXMgYSB0b2tlbiBmb3IgY29uY2F0ZW5hdGlvbiwgYnV0IGFzIGEgcmVndWxhciBlbnVtLiAqLworI2RlZmluZSBCQ01fTE9HX0xFVkVMKGxldmVsLCBpZCwgLi4uKSBfQkNNX0xPR19FWFBBTkQoTUFDUk9fTlVNX0FSR1MoX19WQV9BUkdTX18pLCBsZXZlbCwgaWQsIDAsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIEJDTV9MT0dfRkxBR19OT05FIDAKKyNkZWZpbmUgQkNNX0xPR19GTEFHX05PX0hFQURFUiAoMSA8PCAwKSAvKiBBdm9pZCBpbnNlcnRpbmcgaGVhZGVyIHRvIGVhY2ggbWVzc2FnZS4gKi8KKyNkZWZpbmUgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQgKDEgPDwgMSkgLyogVGhlIGxvZyBtZXNzYWdlIHdpbGwgYmUgZm9ybWF0dGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsZXIgdGFzaywgbm90IHRoZSBsb2dnZXIgdGFzayAob3ZlcnJpZGUgZGVmYXVsdCBiZWhhdmlvcikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgaGFzIGEgcGVuYWx0eSAtIGJjbV9kZXZfbG9nX2xvZygpIGJlY29tZXMgc2xvd2VyLiAqLworI2RlZmluZSBCQ01fTE9HX0ZMQUdfRklMRU5BTUVfSU5fRk1UICgxIDw8IDIpIC8qIEluZGljYXRlcyB0aGF0IF9fRklMRV9fIGlzIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UgZm9ybWF0LiAqLworI2RlZmluZSBCQ01fTE9HX0ZMQUdfRE9OVF9TS0lQX1BSSU5UICgxIDw8IDMpIC8qIFRoZSBtZXNzYWdlIHNob3VsZCBhbHdheXMgYmUgcHJpbnRlZCBldmVuIGlmIHRoZSBtc2cgcG9vbCBpcyBuZWFybHkgZnVsbC4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ2FsbGJhY2tzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGdW5jdGlvbnMgcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvbnN0IGNoYXIgKmRldl9sb2dfYmFzZW5hbWUoY29uc3QgY2hhciAqc3RyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX2xvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IExvZyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgSXQgaXMgYmV0dGVyIHVzaW5nIHRoZSBtYWNyb3MgYW5kIG5vdCB0aGUgZnVuY3Rpb24gZGlyZWN0bHkuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfaWQgICAgICAgICAgICAtIFRoZSBMb2cgSUQgdGhpcyBtZXNzYWdlIGlzIGNvbm5lY3RlZCB0by4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgKFRoZSBJRCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX2xvZ19sZXZlbCAgICAgLSBUaGUgTG9nIGxldmVsIG9mIHRoaXMgbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfZmxhZ3MgICAgICAgICAtIENhbiBiZSBvbmUgb2YgQkNNX0xPR19GTEFHX1hYWCBhYm92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSBmbXQgICAgICAgICAgICAgIC0gVGhlIHByaW50IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIE5vdGU6ICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBmb3JtYXQgdGhlIHN0cmluZyBpbiB0aGUgbG9nZ2VyICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgY29udGV4dCwgbm90IHRoZSBjYWxsZXIgdGFzayBjb250ZXh0LCB0byByZWR1Y2UgdGhlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgcGVuYWx0eSBvZiBjYWxsaW5nIGJjbV9kZXZfbG9nX2xvZygpLiBUaGlzIG1lYW5zICdmbXQnIGNhbiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICBwb2ludCBvbmx5IHRvIHN0cmluZ3MgaW4gZGF0YSBzZWdtZW50LCBidXQgbm90IHRvIGhlYWQvc3RhY2suICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciB3aXRoIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1ULiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHBhcmFtMSAgICAgICAgICAgLSBGb3JtYXQgcGFyYW1ldGVyIE5vLiAxLiBMaWtlICdmbXQnLCBjYW4gcmVzaWRlIG9ubHkgaW4gZGF0YSAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQsIHVubGVzcyBjaG9vc2luZyBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCAgICAgICAgICAgICAgKi8KKy8qICAgLSAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHBhcmFtTiAgICAgICAgICAgLSBGb3JtYXQgcGFyYW1ldGVyIE5vLiBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElNUE9SVEFOVCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogMS4gVGhlIGZ1bmN0aW9uIGJjbV9kZXZfbG9nX2xvZygpIG11c3QgaGF2ZSBldmVuIG51bWJlciBvZiBhcmd1bWVudHMgYmVmb3JlIHRoZSAnLi4uJyovCisvKiAgICBUaGlzIGNvbWVzIGZyb20gdGhlIDY0Yml0cyBsaW1pdGF0aW9uIHRoYXQgbXVzdCBiZSBhbGlnbiB0byA4Ynl0ZXMgaW4gc29tZSAgICAgICAgKi8KKy8qICAgIHBsYXRmb3JtcyB3aG8gZG9lc24ndCBzdXBwb3J0IHVuYWxpZ25lZCBhY2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgb24geHBvbnN3ICh4ODYpIGl0IGRvZXNuJ3QgbWF0dGVyIGJ1dCBvbiBkZXZpY2UgKGFybSkgeW91IG11c3QgaGF2ZSB0aGF0LiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21fZGV2X2xvZ19sb2coZGV2X2xvZ19pZCB4aV9pZCwKKyAgICBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWwsCisgICAgdWludDMyX3QgeGlfZmxhZ3MsCisgICAgY29uc3QgY2hhciAqZm10LAorICAgIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KF9fcHJpbnRmX18sIDQsIDUpKSk7IC8qIGNvbXBpbGVyIGF0dHJpYnV0ZSB0byBjaGVjayBhcyBwcmludGYgc3R5bGUgZm9yIGFyZ3VtZW50cyA0IChmbXQpIGFuZCA1IChhbGwgb3RoZXIpICovCisKK3ZvaWQgYmNtX2Rldl9sb2dfdmxvZyhkZXZfbG9nX2lkIHhpX2lkLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCwKKyAgICB1aW50MzJfdCB4aV9mbGFncywKKyAgICBjb25zdCBjaGFyICpmbXQsCisgICAgdmFfbGlzdCBhcmdzKTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX05PTkUsCisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX0JXU19EQkFfQkRfQUREX0FMTE9DX0ZBSUxFRCwKKyAgICBERVZfTE9HX1JBVEVfTElNSVRfSURfQldTX0NCUl9SVF9BRERfQUxMT0NfRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfQ0JSX1JUX0FERF9BQ0NFU1NfRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfUVdfQ0JSX1JUX0FERF9BQ0NFU1NfRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfQ0JSX05SVF9BRERfQUxMT0NfRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfQ0JSX0NPTVBFTlNBVElPTl9BRERfQUNDRVNTX0ZBSUxFRCwKKyAgICBERVZfTE9HX1JBVEVfTElNSVRfSURfQldTX0NCUl9OT19DT01QRU5TQVRJT05fQUREX0FDQ0VTU19GQUlMRUQsCisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX0JXU19DQlJfQ09QWV9DT01QRU5TQVRJT05fQUREX0FDQ0VTU19GQUlMRUQsCisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX0JXU19DQlJfUlRfU0FWRV9BQ0NFU1NfRk9SX0NPTVBFTlNBVElPTl9GQUlMRUQsCisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX0JXU19DQlJfTlJUX1NBVkVfQUNDRVNTX0ZPUl9DT01QRU5TQVRJT05fRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfQ0JSX0ZMVVNIX0ZBSUxFRCwKKyAgICBERVZfTE9HX1JBVEVfTElNSVRfSURfX05VTV9PRiwKK30gZGV2X2xvZ19yYXRlX2xpbWl0X2lkOworCit2b2lkIGJjbV9kZXZfbG9nX2xvZ19yYXRlbGltaXQoZGV2X2xvZ19pZCB4aV9pZCwKKyAgICBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWwsCisgICAgdWludDMyX3QgeGlfZmxhZ3MsCisgICAgdWludDMyX3QgcmF0ZV91cywKKyAgICBkZXZfbG9nX3JhdGVfbGltaXRfaWQgcmF0ZV9saW1pdF9pZCwKKyAgICBjb25zdCBjaGFyICpmbXQsCisgICAgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoX19wcmludGZfXywgNiwgNykpKTsgLyogY29tcGlsZXIgYXR0cmlidXRlIHRvIGNoZWNrIGFzIHByaW50ZiBzdHlsZSBmb3IgYXJndW1lbnRzIDYgKGZtdCkgYW5kIDcgKGFsbCBvdGhlcikgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfb3NfdHJhY2VfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IERpcmVjdCBiY21vc190cmFjZSgpIG91dHB1dCB0byBsb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiBOT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfb3NfdHJhY2VfaW5pdCh2b2lkKTsKKworI2Vsc2UgLyogI2lmbmRlZiBFTkFCTEVfTE9HICovCisKKyNkZWZpbmUgQkNNX0xPRyhsZXZlbCwgaWQsIC4uLikKKyNkZWZpbmUgQkNNX0xPR19DQUxMRVJfRk1UKGxldmVsLCBpZCwgLi4uKQorCisjZW5kaWYgLyogRU5BQkxFX0xPRyAqLworCisjZW5kaWYgLyogX19CQ01fREVWX0xPR19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ19jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGZmYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmMKQEAgLTAsMCArMSw2ODQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nX3Rhc2tfaW50ZXJuYWwuaD4KKworLyogV2UgZG9uJ3Qgc3VwcG9ydCBkZXZfbG9nIENMSSBpbiBsaW51eCBrZXJuZWwgc3BhY2UgKi8KKyNpZm5kZWYgX19LRVJORUxfXworCisvKiBEZXYgbG9nIENMSSBzZXNzaW9uIHN1cHBvcnRzIHJlY2VpdmluZyBsb25nIGxpbmVzIC0gd2Ugc2hhbGwgc2ltcGx5IHNwbGl0IHRoZW0gaW50byBzaG9ydGVyIGxvZyBtZXNzYWdlcy4gKi8KKyNkZWZpbmUgREVWX0xPR19DTElfU0VTU0lPTl9NQVhfTVNHX1NJWkUgKE1BWF9ERVZfTE9HX1NUUklOR19ORVRfU0laRSAqIDEwKQorCitlbnVtCit7CisgICAgSURfQllfSU5ERVgsCisgICAgSURfQllfTkFNRSwKK307CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19maWxlX3ByaW50KHVpbnQzMl90IGZpbGVfaW5kZXgsIGludDMyX3QgeGlfbXNnc19udW0sIGJjbV9kZXZfbG9nX3ByaW50X2NiIHhpX3ByaW50X2NhbGxiYWNrLCB2b2lkICphcmcsIGJjbW9zX2Jvb2wgY2xlYXIpCit7CisgICAgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZTsKKyAgICBjaGFyIGxvZ19zdHJpbmdbTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkVdOworICAgIGludCBsZW5ndGg7CisgICAgdWludDMyX3QgbnVtX21zZ3M7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBmaWxlID0gYmNtX2Rldl9sb2dfZmlsZV9nZXQoZmlsZV9pbmRleCk7CisgICAgaWYgKCFmaWxlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgbnVtX21zZ3MgPSBiY21fZGV2X2xvZ19nZXRfbnVtX29mX21lc3NhZ2VzKGZpbGUpOworICAgIGlmICh4aV9tc2dzX251bSAmJiB4aV9tc2dzX251bSA8IG51bV9tc2dzKQorICAgICAgICBudW1fbXNncyA9IHhpX21zZ3NfbnVtOworCisgICAgREVWX0xPR19JTkZPX1BSSU5URigiZmlsZT0lcCwgcHJpbnQgJWQgbXNncyBmcm9tIGZpbGUgKG9yaWc6ICVkKVxuIiwgKHZvaWQgKilmaWxlLCAoaW50KW51bV9tc2dzLCAoaW50KXhpX21zZ3NfbnVtKTsKKworICAgIC8qIFByaW50IGZpbGUgKi8KKyAgICBmb3IgKGkgPSAwOyAoaSA8IHhpX21zZ3NfbnVtKSB8fCAheGlfbXNnc19udW07IGkrKykKKyAgICB7CisgICAgICAgIC8qIFJlYWQgZnJvbSBmaWxlICovCisgICAgICAgIGxlbmd0aCA9IGJjbV9kZXZfbG9nX2ZpbGVfcmVhZChmaWxlLCAmb2Zmc2V0LCBsb2dfc3RyaW5nLCBzaXplb2YobG9nX3N0cmluZykpOworICAgICAgICBpZiAoIWxlbmd0aCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB4aV9wcmludF9jYWxsYmFjayhhcmcsIGxvZ19zdHJpbmcpOworICAgIH0KKworICAgIGlmIChjbGVhciA9PSBCQ01PU19UUlVFKQorICAgICAgICBlcnIgPSBiY21fZGV2X2xvZ19maWxlX2NsZWFyKGZpbGUpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRldl9sb2dfc3RyX3N0eWxlKGJjbV9kZXZfbG9nX3N0eWxlIHN0eWxlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdHJpbmdzW10gPQorICAgIHsKKyAgICAgICAgW0JDTV9ERVZfTE9HX1NUWUxFX05PUk1BTF0gPSAiTk9STUFMIiwKKyAgICAgICAgW0JDTV9ERVZfTE9HX1NUWUxFX0JPTERdID0gIkJPTEQiLAorICAgICAgICBbQkNNX0RFVl9MT0dfU1RZTEVfVU5ERVJMSU5FXSA9ICJVTkRFUkxJTkUiLAorICAgICAgICBbQkNNX0RFVl9MT0dfU1RZTEVfQkxJTktdID0gIkJMSU5LIiwKKyAgICAgICAgW0JDTV9ERVZfTE9HX1NUWUxFX1JFVkVSU0VfVklERU9dID0gIlJFVkVSU0VfVklERU8iLAorICAgIH07CisgICAgcmV0dXJuIHN0cmluZ3Nbc3R5bGUgPiBCQ01fREVWX0xPR19TVFlMRV9SRVZFUlNFX1ZJREVPID8gQkNNX0RFVl9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTyA6IHN0eWxlXTsKK30KKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCitzdGF0aWMgdm9pZCBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbl9wcmludF9mZWF0dXJlcyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqdGFicywgY29uc3QgZGV2X2xvZ19pZF9wYXJtICppZF9wYXJtKQoreworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICIlc3Rocm90dGxlIDogbGV2ZWwgPSAlYywgdGhyZXNob2xkID0gJS01dVxuIiwKKyAgICAgICAgdGFicywKKyAgICAgICAgbG9nX2xldmVsX3N0cltpZF9wYXJtLT50aHJvdHRsZV9sb2dfbGV2ZWxdLAorICAgICAgICBpZF9wYXJtLT50aHJvdHRsZS50aHJlc2hvbGQpOworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgIiVzdHJpZ2dlciA6IGxldmVsID0gJWMsIHN0YXJ0ID0gJS01dSwgc3RvcCA9ICUtNXUsIHJlcGVhdCA9ICUtNXVcbiIsCisgICAgICAgIHRhYnMsCisgICAgICAgIGxvZ19sZXZlbF9zdHJbaWRfcGFybS0+dHJpZ2dlcl9sb2dfbGV2ZWxdLAorICAgICAgICBpZF9wYXJtLT50cmlnZ2VyLnN0YXJ0X3RocmVzaG9sZCwKKyAgICAgICAgaWRfcGFybS0+dHJpZ2dlci5zdG9wX3RocmVzaG9sZCwKKyAgICAgICAgaWRfcGFybS0+dHJpZ2dlci5yZXBlYXRfdGhyZXNob2xkKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbl9wcmludF9pZF9wYXJtKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICp0YWJzLCBjb25zdCBkZXZfbG9nX2lkX3Bhcm0gKmlkX3Bhcm0pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgIm5hbWU9JTE2cywgbG9nX3R5cGU9JXUsIGRlZmF1bHRfbG9nX3R5cGU9JXUsIGxvZ19sZXZlbF9wcmludD0lYyAoJXUpLCBsb2dfbGV2ZWxfc2F2ZT0lYyAoJXUpLCBkZWZhdWx0X2xvZ19sZXZlbD0lYyAoJXUpLCBzdHlsZT0lcyAoJXUpLCBsb3N0X21zZ19jbnQ9JXUsIHByaW50X3NraXBwZWRfY291bnQ9JXVcbiIsCisgICAgICAgIGlkX3Bhcm0tPm5hbWUsCisgICAgICAgIGlkX3Bhcm0tPmxvZ190eXBlLAorICAgICAgICBpZF9wYXJtLT5kZWZhdWx0X2xvZ190eXBlLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW2lkX3Bhcm0tPmxvZ19sZXZlbF9wcmludF0sCisgICAgICAgIGlkX3Bhcm0tPmxvZ19sZXZlbF9wcmludCwKKyAgICAgICAgbG9nX2xldmVsX3N0cltpZF9wYXJtLT5sb2dfbGV2ZWxfc2F2ZV0sCisgICAgICAgIGlkX3Bhcm0tPmxvZ19sZXZlbF9zYXZlLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW2lkX3Bhcm0tPmRlZmF1bHRfbG9nX2xldmVsXSwKKyAgICAgICAgaWRfcGFybS0+ZGVmYXVsdF9sb2dfbGV2ZWwsCisgICAgICAgIGRldl9sb2dfc3RyX3N0eWxlKGlkX3Bhcm0tPnN0eWxlKSwKKyAgICAgICAgaWRfcGFybS0+c3R5bGUsCisgICAgICAgIGlkX3Bhcm0tPmxvc3RfbXNnX2NudCwKKyAgICAgICAgaWRfcGFybS0+cHJpbnRfc2tpcHBlZF9jb3VudCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgIiVzY291bnRlcnMgICAgICAgICAgPSB7JWMgJS01dSwlYyAlLTV1LCVjICUtNXUsJWMgJS01dSwlYyAlLTV1LCVjICUtNXV9XG4iLAorICAgICAgICB0YWJzLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW0RFVl9MT0dfTEVWRUxfTk9fTE9HXSwKKyAgICAgICAgaWRfcGFybS0+Y291bnRlcnNbREVWX0xPR19MRVZFTF9OT19MT0ddLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW0RFVl9MT0dfTEVWRUxfRkFUQUxdLAorICAgICAgICBpZF9wYXJtLT5jb3VudGVyc1tERVZfTE9HX0xFVkVMX0ZBVEFMXSwKKyAgICAgICAgbG9nX2xldmVsX3N0cltERVZfTE9HX0xFVkVMX0VSUk9SXSwKKyAgICAgICAgaWRfcGFybS0+Y291bnRlcnNbREVWX0xPR19MRVZFTF9FUlJPUl0sCisgICAgICAgIGxvZ19sZXZlbF9zdHJbREVWX0xPR19MRVZFTF9XQVJOSU5HXSwKKyAgICAgICAgaWRfcGFybS0+Y291bnRlcnNbREVWX0xPR19MRVZFTF9XQVJOSU5HXSwKKyAgICAgICAgbG9nX2xldmVsX3N0cltERVZfTE9HX0xFVkVMX0lORk9dLAorICAgICAgICBpZF9wYXJtLT5jb3VudGVyc1tERVZfTE9HX0xFVkVMX0lORk9dLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW0RFVl9MT0dfTEVWRUxfREVCVUddLAorICAgICAgICBpZF9wYXJtLT5jb3VudGVyc1tERVZfTE9HX0xFVkVMX0RFQlVHXSk7CisjaWZkZWYgVFJJR0dFUl9MT0dHRVJfRkVBVFVSRQorICAgIGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uX3ByaW50X2ZlYXR1cmVzKHNlc3Npb24sIHRhYnMsIGlkX3Bhcm0pOworI2VuZGlmCit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfcHJpbnRfZGV2X2xvZygKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgdWludDMyX3QgaTsKKyAgICBiY21fZGV2X2xvZ19maWxlICpmaWxlOworCisgICAgZm9yIChpID0gMDsgaSA8IERFVl9MT0dfTUFYX0ZJTEVTOyBpKyspCisgICAgeworICAgICAgICBmaWxlID0gYmNtX2Rldl9sb2dfZmlsZV9nZXQoaSk7CisgICAgICAgIGlmICghZmlsZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIgICJmaWxlWyV1XTpcbiIsIGkpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICJtYXhfbXNncyA9ICV1XG4iLCBiY21fZGV2X2xvZ19nZXRfbnVtX29mX21lc3NhZ2VzKGZpbGUpKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMiAiZmlsZV9wYXJtOlxuIik7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjMgInN0YXJ0X2FkZHIgPSAlcFxuIiwgZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0uc3RhcnRfYWRkcik7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjMgInNpemUgICAgICAgPSAldVxuIiwgZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0uc2l6ZSk7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjMgInJlYWRfY2IgICAgPSAlcFxuIiwgKHZvaWQgKilkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS5yZWFkX2NiKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMyAid3JpdGVfY2IgICA9ICVwXG4iLCAodm9pZCAqKWRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLndyaXRlX2NiKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMyAiZmxhZ3MgICAgICA9ICV4XG4iLCBkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS5mbGFncyk7CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQiAic3RhdGUgICAgID0gJXVcbiIsIGRldl9sb2cuc3RhdGUpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQiAibXNnX2NvdW50ID0gJXVcbiIsIGRldl9sb2cubXNnX2NvdW50KTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIgInNhdmVfcXVldWU6XG4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICJpc193YWl0aW5nICA9ICV1XG4iLCBkZXZfbG9nLnNhdmVfcXVldWUuaXNfd2FpdGluZyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCICJwcmludF9xdWV1ZTpcbiIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjIgImlzX3dhaXRpbmcgID0gJXVcbiIsIGRldl9sb2cucHJpbnRfcXVldWUuaXNfd2FpdGluZyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCICJzYXZlX3Rhc2s6XG4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICJhY3RpdmVfbW9kdWxlcyAgPSAldVxuIiwgZGV2X2xvZy5zYXZlX3Rhc2suYWN0aXZlX21vZHVsZXMpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjIgImN1cnJlbnRfbW9kdWxlICA9ICV1XG4iLCBkZXZfbG9nLnNhdmVfdGFzay5jdXJyZW50X21vZHVsZSk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCICJwcmludF90YXNrOlxuIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMiAiYWN0aXZlX21vZHVsZXMgID0gJXVcbiIsIGRldl9sb2cucHJpbnRfdGFzay5hY3RpdmVfbW9kdWxlcyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMiAiY3VycmVudF9tb2R1bGUgID0gJXVcbiIsIGRldl9sb2cucHJpbnRfdGFzay5jdXJyZW50X21vZHVsZSk7CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIgIm51bV9pZHMgPSAldVxuIiwgZGV2X2xvZy5udW1faWRzKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIgICJpZHNbXTpcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBkZXZfbG9nLm51bV9pZHM7IGkrKykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjIgICJpZHNbJTJ1XTogIiwgaSk7CisgICAgICAgIGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uX3ByaW50X2lkX3Bhcm0oc2Vzc2lvbiwgVEFCMywgJmRldl9sb2cuaWRzW2ldKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nX25hbWVfdGFibGVfaW5kZXg7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlID09IExPR19OQU1FX05PX0lOU1RBTkNFKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICAiJXNcbiIsIGxvZ3NfbmFtZXNbaV0ubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICAiJXMgJWQgLSAlZFxuIiwgbG9nc19uYW1lc1tpXS5uYW1lLCBsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlLCBsb2dzX25hbWVzW2ldLmxhc3RfaW5zdGFuY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfbG9nZ2VyX2NvbnRyb2woYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtX2Rldl9sb2dfc2V0X2NvbnRyb2wocGFybVswXS52YWx1ZS51bnVtYmVyICE9IDApOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2ZpbGVfcHJpbnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgcmV0dXJuIGJjbV9kZXZfbG9nX2ZpbGVfcHJpbnQoCisgICAgICAgIHBhcm1bMF0udmFsdWUudW51bWJlciwKKyAgICAgICAgMCwKKyAgICAgICAgKGJjbV9kZXZfbG9nX3ByaW50X2NiKWJjbWNsaV9zZXNzaW9uX3ByaW50LAorICAgICAgICBzZXNzaW9uLAorICAgICAgICAoYmNtb3NfYm9vbClwYXJtWzFdLnZhbHVlLnVudW1iZXIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2ZpbGVfY2xlYXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSA9IGJjbV9kZXZfbG9nX2ZpbGVfZ2V0KHBhcm1bMF0udmFsdWUudW51bWJlcik7CisgICAgaWYgKCFmaWxlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIHJldHVybiBiY21fZGV2X2xvZ19maWxlX2NsZWFyKGZpbGUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2ZpbGVfc2V0X2ZsYWdzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2cuZmlsZXNbcGFybVswXS52YWx1ZS51bnVtYmVyXS5maWxlX3Bhcm0uZmxhZ3MgfD0gKGJjbV9kZXZfbG9nX2ZpbGVfZmxhZ3MpcGFybVsxXS52YWx1ZS51bnVtYmVyOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2ZpbGVfcmVzZXRfZmxhZ3MoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZy5maWxlc1twYXJtWzBdLnZhbHVlLnVudW1iZXJdLmZpbGVfcGFybS5mbGFncyA9IDA7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfaWRfZ2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2dfaWQgaWQ7CisgICAgZGV2X2xvZ19pZF9wYXJtIGlkX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWQgPSBwYXJtWzBdLnZhbHVlLnVudW1iZXIgPT0gSURfQllfSU5ERVggPyBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgocGFybVsxXS52YWx1ZS51bnVtYmVyKSA6CisgICAgICAgIGJjbV9kZXZfbG9nX2lkX2dldF9ieV9uYW1lKHBhcm1bMV0udmFsdWUuc3RyaW5nKTsKKyAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKworICAgIGVyciA9IGJjbV9kZXZfbG9nX2lkX2dldChpZCwgJmlkX3Bhcm0pOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3I6IGNhbiBnZXQgaWQgKGVycjogJWQpXG4iLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uX3ByaW50X2lkX3Bhcm0oc2Vzc2lvbiwgVEFCLCAmaWRfcGFybSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9pZF9zZXRfdHlwZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBkZXZfbG9nX2lkIGlkOworCisgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgocGFybVswXS52YWx1ZS51bnVtYmVyKTsKKyAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKworICAgIHJldHVybiBiY21fZGV2X2xvZ19pZF9zZXRfdHlwZShpZCwgKGJjbV9kZXZfbG9nX2lkX3R5cGUpcGFybVsxXS52YWx1ZS51bnVtYmVyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9pZF9zZXRfbGV2ZWwoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHBhcm1bMF0udmFsdWUudW51bWJlcik7CisgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsKAorICAgICAgICBpZCwKKyAgICAgICAgKGJjbV9kZXZfbG9nX2xldmVsKXBhcm1bMV0udmFsdWUudW51bWJlciwKKyAgICAgICAgKGJjbV9kZXZfbG9nX2xldmVsKXBhcm1bMl0udmFsdWUudW51bWJlcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfbmFtZV9zZXRfbGV2ZWwoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X25hbWUocGFybVswXS52YWx1ZS5zdHJpbmcpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsKAorICAgICAgICBpZCwKKyAgICAgICAgKGJjbV9kZXZfbG9nX2xldmVsKXBhcm1bMV0udmFsdWUudW51bWJlciwKKyAgICAgICAgKGJjbV9kZXZfbG9nX2xldmVsKXBhcm1bMl0udmFsdWUudW51bWJlcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfaWRfc2V0X3RvX2RlZmF1bHQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHBhcm1bMF0udmFsdWUudW51bWJlcik7CisgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsc19hbmRfdHlwZV90b19kZWZhdWx0KGlkKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9pZF9zZXRfc3R5bGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKyAgICBiY21fZGV2X2xvZ19zdHlsZSBzdHlsZTsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluZGV4IiktPnZhbHVlLnVudW1iZXIpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIHN0eWxlID0gKGJjbV9kZXZfbG9nX3N0eWxlKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0eWxlIiktPnZhbHVlLnVudW1iZXI7CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaWRfc2V0X3N0eWxlKGlkLCBzdHlsZSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfaWRfY2xlYXJfY291bnRlcnMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHBhcm1bMF0udmFsdWUudW51bWJlcik7CisgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaWRfY2xlYXJfY291bnRlcnMoaWQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2xvZyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBkZXZfbG9nX2lkIGlkOworICAgIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbDsKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgY29uc3QgY2hhciAqc3RyaW5nOworICAgIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm07CisKKyAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChwYXJtWzBdLnZhbHVlLnVudW1iZXIpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgaWYgKChjbWRfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvdW50IikpKQorICAgIHsKKyAgICAgICAgY291bnQgPSBjbWRfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgaWYgKCFjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgY291bnQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgbG9nX2xldmVsID0gKGJjbV9kZXZfbG9nX2xldmVsKXBhcm1bMV0udmFsdWUudW51bWJlcjsKKyAgICBzdHJpbmcgPSBwYXJtWzJdLnZhbHVlLnN0cmluZzsKKworICAgIHdoaWxlIChjb3VudC0tKQorICAgIHsKKyAgICAgICAgYmNtX2Rldl9sb2dfbG9nKGlkLCBsb2dfbGV2ZWwsIEJDTV9MT0dfRkxBR19OT05FLCAiJTV1fCBNZXNzYWdlOiAlc1xuIiwgY291bnQsIHN0cmluZyk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfaW5zdGFuY2VfZW5hYmxlKAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIHN0YXRpYyBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgIGJjbW9zX2Jvb2wgZW5hYmxlID0gKGJjbW9zX2Jvb2wpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5hYmxlIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgaW5zdCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIiktPnZhbHVlLnVudW1iZXI7CisgICAgZGV2X2xvZ19pZCBsb2dfaWQ7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIHVpbnQzMl90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nX25hbWVfdGFibGVfaW5kZXg7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlICE9IExPR19OQU1FX05PX0lOU1RBTkNFICYmCisgICAgICAgICAgICBpbnN0ID49IGxvZ3NfbmFtZXNbaV0uZmlyc3RfaW5zdGFuY2UgJiYKKyAgICAgICAgICAgIGluc3QgPD0gbG9nc19uYW1lc1tpXS5sYXN0X2luc3RhbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zihsb2dfbmFtZSwgc2l6ZW9mKGxvZ19uYW1lKSwgIiVzJXUiLCBsb2dzX25hbWVzW2ldLm5hbWUsIGluc3QpOworICAgICAgICAgICAgbG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X25hbWUobG9nX25hbWUpOworICAgICAgICAgICAgaWYgKGxvZ19pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkVycm9yOiBsb2cgSUQgbm90IGZvdW5kOiAlc1xuIiwgbG9nX25hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gYmNtX2Rldl9sb2dfaWRfc2V0X3R5cGUobG9nX2lkLCBlbmFibGUgPyBERVZfTE9HX0lEX1RZUEVfQk9USCA6IERFVl9MT0dfSURfVFlQRV9OT05FKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3Igc2V0dGluZyBsb2cgdHlwZTogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiTG9nICclcycgJXNcbiIsIGxvZ19uYW1lLCBlbmFibGUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjaWZkZWYgVFJJR0dFUl9MT0dHRVJfRkVBVFVSRQorc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV90aHJvdHRsZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBkZXZfbG9nX2lkIGlkOworCisgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgocGFybVswXS52YWx1ZS51bnVtYmVyKTsKKyAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKworICAgIHJldHVybiBiY21fZGV2X2xvZ19zZXRfdGhyb3R0bGUoaWQsIHBhcm1bMV0udmFsdWUudW51bWJlciwgcGFybVsyXS52YWx1ZS51bnVtYmVyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV90cmlnZ2VyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2dfaWQgaWQ7CisgICAgaW50MzJfdCByZXBlYXQgPSAwOworICAgIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm07CisKKyAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChwYXJtWzBdLnZhbHVlLnVudW1iZXIpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgaWYgKChjbWRfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcGVhdCIpKSkKKyAgICAgICAgcmVwZWF0ID0gY21kX3Bhcm0tPnZhbHVlLm51bWJlcjsKKworICAgIHJldHVybiBiY21fZGV2X2xvZ19zZXRfdHJpZ2dlcihpZCwgcGFybVsxXS52YWx1ZS51bnVtYmVyLCBwYXJtWzJdLnZhbHVlLnVudW1iZXIsIHBhcm1bM10udmFsdWUudW51bWJlciwgcmVwZWF0KTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9nZXRfZmVhdHVyZXMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKyAgICBkZXZfbG9nX2lkX3Bhcm0gaWRfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChwYXJtWzBdLnZhbHVlLnVudW1iZXIpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgZXJyID0gYmNtX2Rldl9sb2dfaWRfZ2V0KGlkLCAmaWRfcGFybSk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJFcnJvcjogY2FuIGdldCBpZCAoZXJyOiAlZClcbiIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb25fcHJpbnRfZmVhdHVyZXMoc2Vzc2lvbiwgVEFCLCAmaWRfcGFybSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGRldl9sb2dfY2xpX3Nlc3Npb25fd3JpdGVfY2IoYmNtY2xpX3Nlc3Npb24gKmNsaV9zZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpCit7CisgICAgYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb24gKnNlc3Npb24gPSBiY21jbGlfc2Vzc2lvbl91c2VyX3ByaXYoY2xpX3Nlc3Npb24pOworICAgIGNoYXIgdG1wX3N0cltERVZfTE9HX0NMSV9TRVNTSU9OX01BWF9NU0dfU0laRV0gPSB7fTsKKyAgICBjaGFyICpwOworICAgIHVpbnQzMl90IHRtcF9zdHJfbGVuOworCisgICAgc3RybmNweSh0bXBfc3RyLCBidWYsIHNpemVvZih0bXBfc3RyKSAtIDEpOyAvKiBsZWF2ZSByb29tIGZvciB0aGUgdGVybWluYXRvciAqLworCisgICAgcCA9IHRtcF9zdHI7CisgICAgdG1wX3N0cl9sZW4gPSBzdHJsZW4odG1wX3N0cik7CisgICAgd2hpbGUgKHRtcF9zdHJfbGVuID4gc2Vzc2lvbi0+ZnJlZV9sZW4pCisgICAgeworICAgICAgICAvKiBOb3QgZW5vdWdoIHNwYWNlIGluICdzdHInIGZvciBjb25jYXRlbmF0aW5nIHdoYXQncyBpbiAncCcgLT4gc3BsaXQgaXQuICovCisgICAgICAgIHN0cm5jYXQoc2Vzc2lvbi0+c3RyLCBwLCBzZXNzaW9uLT5mcmVlX2xlbik7CisgICAgICAgIGJjbV9kZXZfbG9nX2xvZygKKyAgICAgICAgICAgIHNlc3Npb24tPmxvZ19pZCwgc2Vzc2lvbi0+bG9nX2xldmVsLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSIHwgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQsICIlcyIsIHNlc3Npb24tPnN0cik7CisgICAgICAgICpzZXNzaW9uLT5zdHIgPSAnXDAnOworICAgICAgICBwICs9IHNlc3Npb24tPmZyZWVfbGVuOworICAgICAgICB0bXBfc3RyX2xlbiAtPSBzZXNzaW9uLT5mcmVlX2xlbjsKKyAgICAgICAgc2Vzc2lvbi0+ZnJlZV9sZW4gPSBNQVhfREVWX0xPR19TVFJJTkdfTkVUX1NJWkUgLSAxOworICAgIH0KKworICAgIC8qIEVub3VnaCBzcGFjZSBpbiAnc3RyJyBmb3IgY29uY2F0ZW5hdGluZyB3aGF0J3MgaW4gJ3AnLiAqLworICAgIHN0cm5jYXQoc2Vzc2lvbi0+c3RyLCBwLCB0bXBfc3RyX2xlbik7CisgICAgc2Vzc2lvbi0+ZnJlZV9sZW4gLT0gdG1wX3N0cl9sZW47CisKKyAgICAvKiBJZiB0aGUgbWVzc2FnZSBpcyBub3QgdGVybWluYXRlZCBieSAnXG4nLCBkbyBub3Qgc3VibWl0IHRoZSBtZXNzYWdlIHRvIGxvZ2dlciB5ZXQKKyAgICAgKiAocmF0aGVyIHNhdmUgaXQsIHdhaXRpbmcgZm9yIGEgbGF0ZXIgbWVzc2FnZSB3aXRoICdcbicpLiAqLworICAgIGlmIChzZXNzaW9uLT5zdHJbc3RybGVuKHNlc3Npb24tPnN0cikgLSAxXSA9PSAnXG4nKQorICAgIHsKKyAgICAgICAgYmNtX2Rldl9sb2dfbG9nKAorICAgICAgICAgICAgc2Vzc2lvbi0+bG9nX2lkLCBzZXNzaW9uLT5sb2dfbGV2ZWwsIEJDTV9MT0dfRkxBR19OT19IRUFERVIgfCBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCwgIiVzIiwgc2Vzc2lvbi0+c3RyKTsKKyAgICAgICAgKnNlc3Npb24tPnN0ciA9ICdcMCc7CisgICAgICAgIHNlc3Npb24tPmZyZWVfbGVuID0gTUFYX0RFVl9MT0dfU1RSSU5HX05FVF9TSVpFIC0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb25fY3JlYXRlKAorICAgIGRldl9sb2dfaWQgbG9nX2lkLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbCwKKyAgICBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbiAqKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc2Vzc2lvbl9wYXJhbXMgPSB7IC53cml0ZSA9IGRldl9sb2dfY2xpX3Nlc3Npb25fd3JpdGVfY2IgfTsKKworICAgICpzZXNzaW9uID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbikpOworICAgIGlmICgqc2Vzc2lvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgc2Vzc2lvbl9wYXJhbXMudXNlcl9wcml2ID0gKnNlc3Npb247CisgICAgZXJyID0gYmNtY2xpX3Nlc3Npb25fb3Blbigmc2Vzc2lvbl9wYXJhbXMsICYoKCpzZXNzaW9uKS0+c2Vzc2lvbikpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoKnNlc3Npb24pOworICAgICAgICAqc2Vzc2lvbiA9IE5VTEw7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgKCpzZXNzaW9uKS0+bG9nX2lkID0gbG9nX2lkOworICAgICgqc2Vzc2lvbiktPmxvZ19sZXZlbCA9IGxvZ19sZXZlbDsKKyAgICAoKnNlc3Npb24pLT5mcmVlX2xlbiA9IE1BWF9ERVZfTE9HX1NUUklOR19ORVRfU0laRSAtIDE7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbWNsaV9lbnRyeSAqYmNtX2Rldl9sb2dfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICpyb290X2RpcikKK3sKKyAgICBiY21jbGlfZW50cnkgKmRpcjsKKyAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGVudW1fdGFibGVfbG9nX2xldmVsW10gPQorICAgIHsKKyAgICAgICAgeyAubmFtZSA9ICJOT19MT0ciLCAudmFsID0gKGxvbmcpREVWX0xPR19MRVZFTF9OT19MT0cgfSwKKyAgICAgICAgeyAubmFtZSA9ICJGQVRBTCIsIC52YWwgPSAobG9uZylERVZfTE9HX0xFVkVMX0ZBVEFMIH0sCisgICAgICAgIHsgLm5hbWUgPSAiRVJST1IiLCAudmFsID0gKGxvbmcpREVWX0xPR19MRVZFTF9FUlJPUiB9LAorICAgICAgICB7IC5uYW1lID0gIldBUk5JTkciLCAudmFsID0gKGxvbmcpREVWX0xPR19MRVZFTF9XQVJOSU5HfSwKKyAgICAgICAgeyAubmFtZSA9ICJJTkZPIiwgLnZhbCA9IChsb25nKURFVl9MT0dfTEVWRUxfSU5GTyB9LAorICAgICAgICB7IC5uYW1lID0gIkRFQlVHIiwgLnZhbCA9IChsb25nKURFVl9MT0dfTEVWRUxfREVCVUcgfSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBpZiAoKGRpciA9IGJjbWNsaV9kaXJfZmluZChOVUxMLCAibG9nZ2VyIikpICE9IE5VTEwpCisgICAgICAgIHJldHVybiBkaXI7CisKKyAgICBkaXIgPSBiY21jbGlfZGlyX2FkZChyb290X2RpciwgImxvZ2dlciIsICJEZXYgTG9nIiwgQkNNQ0xJX0FDQ0VTU19HVUVTVCwgTlVMTCk7CisKKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAicHJpbnRfZGV2X2xvZyIsICJQcmludCBEZXYgbG9nIiwgYmNtX2Rldl9sb2dfY2xpX3ByaW50X2Rldl9sb2cpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJsb2dnZXJfY29udHJvbCIsICJMb2dnZXIgQ29udHJvbCIsIGJjbV9kZXZfbG9nX2NsaV9sb2dnZXJfY29udHJvbCwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImVuYWJsZSIsICJlbmFibGUiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCwgMCwgMSkpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJmaWxlX3ByaW50IiwgIlByaW50IGxvZ2dlciBmaWxlIiwgYmNtX2Rldl9sb2dfY2xpX2ZpbGVfcHJpbnQsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImNsZWFyIiwgImNsZWFyIiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDAsIDAsIDEpKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAiZmlsZV9jbGVhciIsICJDbGVhciBmaWxlIiwgYmNtX2Rldl9sb2dfY2xpX2ZpbGVfY2xlYXIsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBlbnVtX3RhYmxlX2ZpbGVfZmxhZ3NbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgLm5hbWUgPSAiVkFMSUQiLCAudmFsID0gKGxvbmcpQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEIH0sCisgICAgICAgICAgICB7IC5uYW1lID0gIldSQVBfQVJPVU5EIiwgLnZhbCA9IChsb25nKUJDTV9ERVZfTE9HX0ZJTEVfRkxBR19XUkFQX0FST1VORCB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJTVE9QX1dIRU5fRlVMTCIsIC52YWwgPSAobG9uZylCQ01fREVWX0xPR19GSUxFX0ZMQUdfU1RPUF9XSEVOX0ZVTEwgfSwKKyAgICAgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICAgICAgfTsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImZpbGVfc2V0X2ZsYWdzIiwgIlNldCBmaWxlIGZsYWdzIiwgYmNtX2Rldl9sb2dfY2xpX2ZpbGVfc2V0X2ZsYWdzLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCwgMCwgREVWX0xPR19NQVhfRklMRVMtMSksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImZsYWdzIiwgImZsYWdzIiwgZW51bV90YWJsZV9maWxlX2ZsYWdzLCAwKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImZpbGVfcmVzZXRfZmxhZ3MiLCAiUmVzZXQgZmlsZSBmbGFncyIsIGJjbV9kZXZfbG9nX2NsaV9maWxlX3Jlc2V0X2ZsYWdzLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCwgMCwgREVWX0xPR19NQVhfRklMRVMtMSkpOworICAgIH0KKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfY21kX3Bhcm0gc2V0MVtdPQorICAgICAgICB7CisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0xJU1RfVEVSTUlOQVRPUgorICAgICAgICB9OworICAgICAgICBzdGF0aWMgYmNtY2xpX2NtZF9wYXJtIHNldDJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm5hbWUiLCAibmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgMCksCisgICAgICAgICAgICBCQ01DTElfUEFSTV9MSVNUX1RFUk1JTkFUT1IKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBzZWxlY3Rvcl90YWJsZVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgeyAubmFtZSA9ICJieV9pbmRleCIsIC52YWwgPSBJRF9CWV9JTkRFWCwgLnBhcm1zID0gc2V0MSB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJieV9uYW1lIiwgLnZhbCA9IElEX0JZX05BTUUsIC5wYXJtcyA9IHNldDIgfSwKKyAgICAgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICAgICAgfTsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX2dldCIsICJpZF9nZXQiLCBiY21fZGV2X2xvZ19jbGlfaWRfZ2V0LAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9TRUxFQ1RPUigiYnkiLCAiYnkiLCBzZWxlY3Rvcl90YWJsZSwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZW51bV90YWJsZVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IChsb25nKURFVl9MT0dfSURfVFlQRV9OT05FIH0sCisgICAgICAgICAgICB7IC5uYW1lID0gInByaW50IiwgLnZhbCA9IChsb25nKURFVl9MT0dfSURfVFlQRV9QUklOVCB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJzYXZlIiwgLnZhbCA9IChsb25nKURFVl9MT0dfSURfVFlQRV9TQVZFIH0sCisgICAgICAgICAgICB7IC5uYW1lID0gImJvdGgiLCAudmFsID0gKGxvbmcpREVWX0xPR19JRF9UWVBFX0JPVEggfSwKKyAgICAgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICAgICAgfTsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX3NldF90eXBlIiwgImlkX3NldF90eXBlIiwgYmNtX2Rldl9sb2dfY2xpX2lkX3NldF90eXBlLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImxvZ190eXBlIiwgImxvZ190eXBlIiwgZW51bV90YWJsZSwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJpZF9zZXRfbGV2ZWwiLCAiaWRfc2V0X2xldmVsIiwgYmNtX2Rldl9sb2dfY2xpX2lkX3NldF9sZXZlbCwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImluZGV4IiwgImluZGV4IiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJsb2dfbGV2ZWxfcHJpbnQiLCAibG9nX2xldmVsIiwgZW51bV90YWJsZV9sb2dfbGV2ZWwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJsb2dfbGV2ZWxfc2F2ZSIsICJsb2dfbGV2ZWwiLCBlbnVtX3RhYmxlX2xvZ19sZXZlbCwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJuYW1lX3NldF9sZXZlbCIsICJuYW1lX3NldF9sZXZlbCIsIGJjbV9kZXZfbG9nX2NsaV9uYW1lX3NldF9sZXZlbCwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm5hbWUiLCAibmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImxvZ19sZXZlbF9wcmludCIsICJsb2dfbGV2ZWwiLCBlbnVtX3RhYmxlX2xvZ19sZXZlbCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImxvZ19sZXZlbF9zYXZlIiwgImxvZ19sZXZlbCIsIGVudW1fdGFibGVfbG9nX2xldmVsLCAwKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX3NldF90b19kZWZhdWx0IiwgImlkX3NldF90b19kZWZhdWx0IiwgYmNtX2Rldl9sb2dfY2xpX2lkX3NldF90b19kZWZhdWx0LAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZW51bV90YWJsZV9sb2dfc3R5bGVbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgLm5hbWUgPSAibm9ybWFsIiwgLnZhbCA9IChsb25nKUJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJib2xkIiwgLnZhbCA9IChsb25nKUJDTV9ERVZfTE9HX1NUWUxFX0JPTEQgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAidW5kZXJsaW5lIiwgLnZhbCA9IChsb25nKUJDTV9ERVZfTE9HX1NUWUxFX1VOREVSTElORSB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJibGluayIsIC52YWwgPSAobG9uZylCQ01fREVWX0xPR19TVFlMRV9CTElOSyB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJyZXZlcnNlX3ZpZGVvIiwgLnZhbCA9IChsb25nKUJDTV9ERVZfTE9HX1NUWUxFX1JFVkVSU0VfVklERU8gfSwKKyAgICAgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICAgICAgfTsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX3NldF9zdHlsZSIsICJpZF9zZXRfc3R5bGUiLCBiY21fZGV2X2xvZ19jbGlfaWRfc2V0X3N0eWxlLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oInN0eWxlIiwgInN0eWxlIiwgZW51bV90YWJsZV9sb2dfc3R5bGUsIDApKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAiaWRfY2xlYXJfY291bnRlcnMiLCAiaWRfY2xlYXJfY291bnRlcnMiLCBiY21fZGV2X2xvZ19jbGlfaWRfY2xlYXJfY291bnRlcnMsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImxvZyIsICJsb2ciLCBiY21fZGV2X2xvZ19jbGlfbG9nLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImxvZ19sZXZlbF9wcmludCIsICJsb2dfbGV2ZWwiLCBlbnVtX3RhYmxlX2xvZ19sZXZlbCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJzdHJpbmciLCAic3RyaW5nIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImNvdW50IiwgIk51bWJlciBvZiBtZXNzYWdlcyB0byBzZW5kIiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAiaW5zdGFuY2VfZW5hYmxlIiwgImVuYWJsZS9kaXNhYmxlIGluc3RhbmNlIG51bWJlciIsIGJjbV9kZXZfbG9nX2NsaV9pbnN0YW5jZV9lbmFibGUsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImVuYWJsZSIsICJlbmFibGUiLCBiY21jbGlfZW51bV9ib29sX3RhYmxlLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImluc3RhbmNlIiwgImluc3RhbmNlIG51bWJlciIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisgICAgfQorI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJpZF9zZXRfdGhyb3R0bGUiLCAic2V0IHRocm90dGxlIiwgYmNtX2Rldl9sb2dfY2xpX3Rocm90dGxlLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImxvZ19sZXZlbF9wcmludCIsICJsb2dfbGV2ZWwiLCBlbnVtX3RhYmxlX2xvZ19sZXZlbCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ0aHJvdHRsZSIsICJ0aHJvdHRsZSIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX3NldF90cmlnZ2VyIiwgInNldCB0cmlnZ2VyIiwgYmNtX2Rldl9sb2dfY2xpX3RyaWdnZXIsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgibG9nX2xldmVsX3ByaW50IiwgImxvZ19sZXZlbCIsIGVudW1fdGFibGVfbG9nX2xldmVsLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInN0YXJ0IiwgInN0YXJ0IiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgic3RvcCIsICJzdG9wIiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicmVwZWF0IiwgInJlcGVhdCIsIEJDTUNMSV9QQVJNX0RFQ0lNQUwsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAiaWRfZ2V0X2ZlYXR1cmUiLCAiZ2V0IGZlYXR1cmUiLCBiY21fZGV2X2xvZ19jbGlfZ2V0X2ZlYXR1cmVzLAorICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIGRpcjsKK30KKworI2VuZGlmIC8qICNpZm5kZWYgX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ19jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTA5MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01fREVWX0xPR19DTElfSF8KKyNkZWZpbmUgQkNNX0RFVl9MT0dfQ0xJX0hfCisKKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21jbGlfc2Vzc2lvbi5oPgorI2luY2x1ZGUgImJjbV9kZXZfbG9nX3Rhc2suaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbjsKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKKyAgICBiY21fZGV2X2xvZ19sZXZlbCBsb2dfbGV2ZWw7CisgICAgY2hhciBzdHJbTUFYX0RFVl9MT0dfU1RSSU5HX05FVF9TSVpFXTsKKyAgICB1aW50MzJfdCBmcmVlX2xlbjsKK30gYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb247CisKKy8qIGNyZWF0ZSBhIENMSSBzZXNzaW9uIGFkYXB0YXRpb24gbGF5ZXIgdGhhdCBvdXRwdXRzIHRvIGEgZGV2IGxvZyBpbnN0ZWFkIG9mIHRvIGEgQ0xJIHNoZWxsICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbl9jcmVhdGUoCisgICAgZGV2X2xvZ19pZCBsb2dfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsLAorICAgIGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uICoqc2Vzc2lvbik7CisKKy8qIGluaXRpYWxpemUgdGhlIGRldiBsb2cgQ0xJIGZ1bmN0aW9ucyAqLworYmNtY2xpX2VudHJ5ICpiY21fZGV2X2xvZ19jbGlfaW5pdChiY21jbGlfZW50cnkgKnJvb3RfZGlyKTsKKworI2VuZGlmIC8qIEJDTV9ERVZfTE9HX0NMSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFzay5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjU1ODgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ190YXNrLmMKQEAgLTAsMCArMSwxNzUyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZkZWYgRU5BQkxFX0xPRworCisjaW5jbHVkZSAiYmNtX2Rldl9sb2dfdGFzay5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nX3Rhc2tfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJiY21fZGV2X2xvZy5oIgorI2lmIGRlZmluZWQoTElOVVhfS0VSTkVMX1NQQUNFKSAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQorI2luY2x1ZGUgImJjbW9sdF9kZXZfbG9nX2xpbnV4LmgiCisjZW5kaWYKKworI2lmZGVmIERFVl9MT0dfU1lTTE9HCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYKKworI2RlZmluZSBVU0VfQU5TSV9FU0NBUEVfQ09ERVMKKworI2lmZGVmIFVTRV9BTlNJX0VTQ0FQRV9DT0RFUworI2RlZmluZSBERVZfTE9HX1NUWUxFX05PUk1BTCAgICAgICAgIlwwMzNbMG1cMDMzIzUiCisjZGVmaW5lIERFVl9MT0dfU1RZTEVfQk9MRCAgICAgICAgICAiXDAzM1sxbSIKKyNkZWZpbmUgREVWX0xPR19TVFlMRV9VTkRFUkxJTkUgICAgICJcMDMzWzRtIgorI2RlZmluZSBERVZfTE9HX1NUWUxFX0JMSU5LICAgICAgICAgIlwwMzNbNW0iCisjZGVmaW5lIERFVl9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTyAiXDAzM1s3bSIKKyNlbHNlCisjZGVmaW5lIERFVl9MT0dfU1RZTEVfTk9STUFMICAgICAgICAiICAgICIKKyNkZWZpbmUgREVWX0xPR19TVFlMRV9CT0xEICAgICAgICAgICIqKiogIgorI2RlZmluZSBERVZfTE9HX1NUWUxFX1VOREVSTElORSAgICAgIl9fXyAiCisjZGVmaW5lIERFVl9MT0dfU1RZTEVfQkxJTksgICAgICAgICAib19vICIKKyNkZWZpbmUgREVWX0xPR19TVFlMRV9SRVZFUlNFX1ZJREVPICIhISEgIgorI2VuZGlmCisKKyNkZWZpbmUgREVWX0xPR19NU0dfU1RBUlRfQ0hBUiAgICAgIDB4MWUgICAgICAgIC8qIHJlY29yZCBzZXBhcmF0b3IgY2hhcmFjdGVyICovCisKKyNkZWZpbmUgTUVNX0ZJTEVfSERSX1NJWkUgICAgICAgc2l6ZW9mKGRldl9sb2dfbWVtX2ZpbGVfaGVhZGVyKQorCisjZGVmaW5lIExPR19NSU4oYSxiKSAgICAgICAgKCgoaW50KShhKSA8PSAoaW50KShiKSkgPyAoYSkgOiAoYikpCisKK2Rldl9sb2dfaWQgZGVmX2xvZ19pZDsKKworc3RhdGljIGJjbV9kZXZfbG9nX3N0eWxlIGRldl9sb2dfbGV2ZWwyc3R5bGVbREVWX0xPR19MRVZFTF9OVU1fT0ZdID0KK3sKKyAgICBbREVWX0xPR19MRVZFTF9GQVRBTF0gPSBCQ01fREVWX0xPR19TVFlMRV9OT1JNQUwsCisgICAgW0RFVl9MT0dfTEVWRUxfRVJST1JdID0gQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMLAorICAgIFtERVZfTE9HX0xFVkVMX1dBUk5JTkddID0gQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMLAorICAgIFtERVZfTE9HX0xFVkVMX0lORk9dID0gQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMLAorICAgIFtERVZfTE9HX0xFVkVMX0RFQlVHXSA9IEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZXZfbG9nX3N0eWxlX2FycmF5W10gPQoreworICAgIFtCQ01fREVWX0xPR19TVFlMRV9OT1JNQUxdID0gREVWX0xPR19TVFlMRV9OT1JNQUwsCisgICAgW0JDTV9ERVZfTE9HX1NUWUxFX0JPTERdID0gREVWX0xPR19TVFlMRV9CT0xELAorICAgIFtCQ01fREVWX0xPR19TVFlMRV9VTkRFUkxJTkVdID0gREVWX0xPR19TVFlMRV9VTkRFUkxJTkUsCisgICAgW0JDTV9ERVZfTE9HX1NUWUxFX0JMSU5LXSA9IERFVl9MT0dfU1RZTEVfQkxJTkssCisgICAgW0JDTV9ERVZfTE9HX1NUWUxFX1JFVkVSU0VfVklERU9dID0gREVWX0xPR19TVFlMRV9SRVZFUlNFX1ZJREVPLAorfTsKKworYmNtX2Rldl9sb2cgZGV2X2xvZyA9IHt7MH19OworY29uc3QgY2hhciAqbG9nX2xldmVsX3N0ciA9ICI/RkVXSUQiOworCitzdGF0aWMgdm9pZCBiY21fZGV2X2xvZ19zaHV0ZG93bl9tc2dfcmVsZWFzZShiY21vc19tc2cgKm0pCit7CisgICAgKHZvaWQpbTsgLyogZG8gbm90aGluZywgdGhlIG1lc3NhZ2UgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi8KK30KKworc3RhdGljIGJjbW9zX21zZyBzaHV0ZG93bl9tc2cgPSB7IC5yZWxlYXNlID0gYmNtX2Rldl9sb2dfc2h1dGRvd25fbXNnX3JlbGVhc2UgfTsKKworc3RhdGljIHZvaWQgYmNtX2Rldl9sb2dfZmlsZV9zYXZlX21zZyhiY21fZGV2X2xvZ19maWxlICpmaWxlcywgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgICB1aW50MzJfdCBpOworICAgIHVpbnQzMl90IGxlbiA9IHN0cmxlbihtZXNzYWdlKSArIDE7IC8qIGluY2x1ZGluZyAwIHRlcm1pbmF0b3IgKi8KKworICAgIGZvciAoaSA9IDA7IChpIDwgREVWX0xPR19NQVhfRklMRVMpICYmIChmaWxlc1tpXS5maWxlX3Bhcm0uZmxhZ3MgJiBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQpOyBpKyspCisgICAgeworICAgICAgICBmaWxlc1tpXS5maWxlX3Bhcm0ud3JpdGVfY2IoJmZpbGVzW2ldLCBtZXNzYWdlLCBsZW4pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGV2X2xvZ19zYXZlX3Rhc2tfaGFuZGxlX21lc3NhZ2UoYmNtb3NfbXNnICptc2cpCit7CisgICAgc3RhdGljIGNoYXIgbG9nX3N0cmluZ1tNQVhfREVWX0xPR19TVFJJTkdfU0laRV07CisgICAgdWludDMyX3QgbGVuZ3RoOworICAgIGNoYXIgdGltZV9zdHJbMTddOworICAgIGRldl9sb2dfcXVldWVfbXNnICpyZWNlaXZlX21zZyA9IG1zZy0+ZGF0YTsKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmxvZ19pZCA9IHJlY2VpdmVfbXNnLT5sb2dfaWQ7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbXNnX2xldmVsID0gcmVjZWl2ZV9tc2ctPm1zZ19sZXZlbDsKKworICAgIC8qIEJ1aWxkIG1lc3NhZ2UgaGVhZGVyICovCisgICAgKmxvZ19zdHJpbmcgPSAnXDAnOworICAgIGlmICghKHJlY2VpdmVfbXNnLT5mbGFncyAmIEJDTV9MT0dfRkxBR19OT19IRUFERVIpKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKHRpbWVfc3RyKTsKKyAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0udGltZV90b19zdHJfY2IocmVjZWl2ZV9tc2ctPnRpbWVfc3RhbXAsIHRpbWVfc3RyLCBsZW5ndGgpOworICAgICAgICBzbnByaW50ZigKKyAgICAgICAgICAgIGxvZ19zdHJpbmcsCisgICAgICAgICAgICBzaXplb2YobG9nX3N0cmluZyksCisgICAgICAgICAgICAiWyVzOiAlYyAlLTIwc10gIiwKKyAgICAgICAgICAgIHRpbWVfc3RyLAorICAgICAgICAgICAgbG9nX2xldmVsX3N0clttc2dfbGV2ZWxdLAorICAgICAgICAgICAgbG9nX2lkLT5uYW1lKTsKKyAgICB9CisKKyAgICAvKiBNb2RpZnkgdGhlIF9fRklMRV9fIGZvcm1hdCBzbyBpdCB3b3VsZCBwcmludCB0aGUgZmlsZW5hbWUgb25seSB3aXRob3V0IHRoZSBwYXRoLgorICAgICAqIElmIHVzaW5nIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1ULCBpdCBpcyBkb25lIGluIGNhbGxlciBjb250ZXh0LCBiZWNhdXNlIGZpbGVuYW1lIG1pZ2h0IGJlIGxvbmcsIHRha2luZyBhIGxvdCBvZgorICAgICAqIHRoZSBzcGFjZSBvZiB0aGUgbWVzc2FnZSBpdHNlbGYuICovCisgICAgaWYgKChyZWNlaXZlX21zZy0+ZmxhZ3MgJiBCQ01fTE9HX0ZMQUdfRklMRU5BTUVfSU5fRk1UKSAmJiAhKHJlY2VpdmVfbXNnLT5mbGFncyAmIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1UKSkKKyAgICAgICAgcmVjZWl2ZV9tc2ctPnUuZm10X2FyZ3MuZm10ID0gZGV2X2xvZ19iYXNlbmFtZShyZWNlaXZlX21zZy0+dS5mbXRfYXJncy5mbXQpOworCisgICAgaWYgKHJlY2VpdmVfbXNnLT5mbGFncyAmIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1UKQorICAgIHsKKyAgICAgICAgLyogQ29weSB1c2VyIHN0cmluZyB0byBidWZmZXIgKi8KKyAgICAgICAgc3RybmNhdChsb2dfc3RyaW5nLCByZWNlaXZlX21zZy0+dS5zdHIsIHNpemVvZihsb2dfc3RyaW5nKSAtIHN0cmxlbihsb2dfc3RyaW5nKSAtIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAoKGxvbmcpcmVjZWl2ZV9tc2ctPnUuZm10X2FyZ3MuYXJncyAlIDggPT0gMCkgPyAwIDogMTsgLyogc3RhcnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5ICovCisgICAgICAgIHZhX2xpc3QgYXA7CisgICAgICAgICoodm9pZCAqKikmYXAgPSAmcmVjZWl2ZV9tc2ctPnUuZm10X2FyZ3MuYXJnc1tvZmZzZXRdOworCisgICAgICAgIC8qIENvcHkgdXNlciBzdHJpbmcgdG8gYnVmZmVyICovCisgICAgICAgIHZzbnByaW50Zihsb2dfc3RyaW5nICsgc3RybGVuKGxvZ19zdHJpbmcpLAorICAgICAgICAgICAgc2l6ZW9mKGxvZ19zdHJpbmcpIC0gc3RybGVuKGxvZ19zdHJpbmcpLAorICAgICAgICAgICAgcmVjZWl2ZV9tc2ctPnUuZm10X2FyZ3MuZm10LAorICAgICAgICAgICAgYXApOworICAgIH0KKworICAgIC8qIEZvcmNlIGxhc3QgY2hhciB0byBiZSBlbmQgb2Ygc3RyaW5nICovCisgICAgbG9nX3N0cmluZ1tNQVhfREVWX0xPR19TVFJJTkdfU0laRSAtIDFdID0gJ1wwJzsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQsIGlmIHRoZSBtZXNzYWdlIGlzIGdvaW5nIHRvIGJlIHNlbnQgdG8gdGhlIHByaW50IHRhc2ssIHNhdmUgdGhlIGZvcm1hdHRlZCBzdHJpbmcgdGhlbiBmb3J3YXJkIGl0LgorICAgICAqIE90aGVyd2lzZSwgd2UgY2FuIHJlbGVhc2UgdGhlIG1lc3NhZ2UgYmVmb3JlIHdyaXRpbmcgaXQgdG8gUkFNLiAqLworICAgIGlmICgobG9nX2lkLT5sb2dfdHlwZSAmIERFVl9MT0dfSURfVFlQRV9QUklOVCkgJiYKKyAgICAgICAgKG1zZ19sZXZlbCA8PSBsb2dfaWQtPmxvZ19sZXZlbF9wcmludCkpCisgICAgeworICAgICAgICBpZiAoIWJjbV9kZXZfbG9nX2xldmVsX2lzX2Vycm9yKG1zZ19sZXZlbCkgJiYKKyAgICAgICAgICAgIChyZWNlaXZlX21zZy0+ZmxhZ3MgJiBCQ01fTE9HX0ZMQUdfRE9OVF9TS0lQX1BSSU5UKSAhPSAwICYmCisgICAgICAgICAgICBiY21fZGV2X2xvZ19wb29sX29jY3VwYW5jeV9wZXJjZW50X2dldCgpID49IERFVl9MT0dfU0tJUF9QUklOVF9USFJFU0hPTERfUEVSQ0VOVCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nX2lkLT5wcmludF9za2lwcGVkX2NvdW50Kys7CisgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RyY3B5KHJlY2VpdmVfbXNnLT51LnN0ciwgbG9nX3N0cmluZyk7IC8qIHNvIHRoZSBwcmludCB0YXNrIGRvZXNuJ3QgbmVlZCB0byByZS1mb3JtYXQgaXQgKi8KKyAgICAgICAgICAgIGJjbW9zX21zZ19zZW5kKCZkZXZfbG9nLnByaW50X3F1ZXVlLCBtc2csIDApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7CisgICAgfQorCisgICAgLyogU2F2ZSB0byBmaWxlICovCisgICAgaWYgKChsb2dfaWQtPmxvZ190eXBlICYgREVWX0xPR19JRF9UWVBFX1NBVkUpICYmCisgICAgICAgIChtc2dfbGV2ZWwgPD0gbG9nX2lkLT5sb2dfbGV2ZWxfc2F2ZSkpCisgICAgeworICAgICAgICBiY21fZGV2X2xvZ19maWxlX3NhdmVfbXNnKGRldl9sb2cuZmlsZXMsIGxvZ19zdHJpbmcpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGV2X2xvZ19wcmludF90YXNrX2hhbmRsZV9tZXNzYWdlKGJjbW9zX21zZyAqbXNnKQoreworICAgIHN0YXRpYyBjaGFyIGxvZ19zdHJpbmdbTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkVdOworICAgIGRldl9sb2dfcXVldWVfbXNnICpyZWNlaXZlX21zZyA9IG1zZy0+ZGF0YTsKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmxvZ19pZCA9IHJlY2VpdmVfbXNnLT5sb2dfaWQ7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbXNnX2xldmVsID0gcmVjZWl2ZV9tc2ctPm1zZ19sZXZlbDsKKworICAgIC8qIG1ha2UgYSBsb2NhbCBjb3B5IG9mIHRoZSBwcmUtZm9ybWF0dGVkIHN0cmluZyAoaXQgd2FzIGZvcm1hdHRlZCBpbiB0aGUgc2F2ZSB0YXNrKSAqLworICAgIHN0cmNweShsb2dfc3RyaW5nLCByZWNlaXZlX21zZy0+dS5zdHIpOworCisgICAgLyogZnJlZSB0aGUgbWVzc2FnZSBBU0FQIHNpbmNlIHByaW50aW5nIG1pZ2h0IHRha2Ugc29tZSB0aW1lICovCisgICAgYmNtb3NfbXNnX2ZyZWUobXNnKTsKKworICAgIGlmIChsb2dfaWQtPnN0eWxlID09IEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCAmJgorICAgICAgICBkZXZfbG9nX2xldmVsMnN0eWxlW21zZ19sZXZlbF0gPT0gQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMKQorICAgIHsKKyAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2IoZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2JfYXJnLCAiJXMiLCBsb2dfc3RyaW5nKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogSWYgc3R5bGUgd2FzIHNldCBwZXIgbG9nIGlkLCB0aGVuIHVzZSBpdC4gKi8KKyAgICAgICAgaWYgKGxvZ19pZC0+c3R5bGUgIT0gQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYigKKyAgICAgICAgICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYl9hcmcsCisgICAgICAgICAgICAgICAgIiVzJXMlcyIsCisgICAgICAgICAgICAgICAgZGV2X2xvZ19zdHlsZV9hcnJheVtsb2dfaWQtPnN0eWxlXSwKKyAgICAgICAgICAgICAgICBsb2dfc3RyaW5nLAorICAgICAgICAgICAgICAgIGRldl9sb2dfc3R5bGVfYXJyYXlbQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBPdGhlcndpc2UgLSBzdHlsZSB3YXMgc2V0IHBlciBsb2cgbGV2ZWwuICovCisgICAgICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYigKKyAgICAgICAgICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYl9hcmcsCisgICAgICAgICAgICAgICAgIiVzJXMlcyIsCisgICAgICAgICAgICAgICAgZGV2X2xvZ19zdHlsZV9hcnJheVtkZXZfbG9nX2xldmVsMnN0eWxlW21zZ19sZXZlbF1dLAorICAgICAgICAgICAgICAgIGxvZ19zdHJpbmcsCisgICAgICAgICAgICAgICAgZGV2X2xvZ19zdHlsZV9hcnJheVtCQ01fREVWX0xPR19TVFlMRV9OT1JNQUxdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBkZXZfbG9nX3ByaW50X3Rhc2sobG9uZyBkYXRhKQoreworICAgIGJjbW9zX21zZyAqbTsKKyAgICBiY21vc19lcnJubyBlcnJvcjsKKyAgICBjb25zdCBjaGFyIGVycm9yX3N0cltNQVhfREVWX0xPR19TVFJJTkdfU0laRV0gPSAiRXJyb3I6IENhbid0IHJlY2VpdmUgZnJvbSBxdWV1ZSAtIGRldl9sb2cgcHJpbnQgdGFzayBleGl0XG4iOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBlcnJvciA9IGJjbW9zX21zZ19yZWN2KCZkZXZfbG9nLnByaW50X3F1ZXVlLCBCQ01PU19XQUlUX0ZPUkVWRVIsICZtKTsKKyAgICAgICAgaWYgKGVycm9yICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCIlcyIsIGVycm9yX3N0cik7CisgICAgICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYihkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYl9hcmcsICIlcyIsIGVycm9yX3N0cik7CisgICAgICAgICAgICBiY21fZGV2X2xvZ19maWxlX3NhdmVfbXNnKGRldl9sb2cuZmlsZXMsIGVycm9yX3N0cik7CisgICAgICAgICAgICByZXR1cm4gKGludCllcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtID09ICZzaHV0ZG93bl9tc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21zZ19mcmVlKG0pOworICAgICAgICAgICAgYnJlYWs7IC8qIHNodXQgZG93biBncmFjZWZ1bGx5ICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfbG9nX3ByaW50X3Rhc2tfaGFuZGxlX21lc3NhZ2UobSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vc19zZW1fcG9zdCgmZGV2X2xvZy5wcmludF90YXNrX2lzX3Rlcm1pbmF0ZWQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGV2X2xvZ19zYXZlX3Rhc2sobG9uZyBkYXRhKQoreworICAgIGJjbW9zX21zZyAqbTsKKyAgICBiY21vc19lcnJubyBlcnJvcjsKKyAgICBjb25zdCBjaGFyIGVycm9yX3N0cltNQVhfREVWX0xPR19TVFJJTkdfU0laRV0gPSAiRXJyb3I6IENhbid0IHJlY2VpdmUgZnJvbSBxdWV1ZSAtIGRldl9sb2cgc2F2ZSB0YXNrIGV4aXRcbiI7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGVycm9yID0gYmNtb3NfbXNnX3JlY3YoJmRldl9sb2cuc2F2ZV9xdWV1ZSwgQkNNT1NfV0FJVF9GT1JFVkVSLCAmbSk7CisgICAgICAgIGlmIChlcnJvciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiJXMiLCBlcnJvcl9zdHIpOworICAgICAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2IoZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2JfYXJnLCAiJXMiLCBlcnJvcl9zdHIpOworICAgICAgICAgICAgYmNtX2Rldl9sb2dfZmlsZV9zYXZlX21zZyhkZXZfbG9nLmZpbGVzLCBlcnJvcl9zdHIpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAobSA9PSAmc2h1dGRvd25fbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtKTsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBzaHV0IGRvd24gZ3JhY2VmdWxseSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGV2X2xvZ19zYXZlX3Rhc2tfaGFuZGxlX21lc3NhZ2UobSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vc19zZW1fcG9zdCgmZGV2X2xvZy5zYXZlX3Rhc2tfaXNfdGVybWluYXRlZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWZhdWx0X3RpbWVfdG9fc3RyKHVpbnQzMl90IHRpbWVfc3RhbXAsIGNoYXIgKnRpbWVfc3RyLCBpbnQgdGltZV9zdHJfc2l6ZSkKK3sKKyAgICByZXR1cm4gc25wcmludGYodGltZV9zdHIsIHRpbWVfc3RyX3NpemUsICIldSIsIHRpbWVfc3RhbXApOworfQorCitzdGF0aWMgdWludDMyX3QgZGVmYXVsdF9nZXRfdGltZSh2b2lkKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlZmF1bHRfcHJpbnQodm9pZCAqYXJnLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIGJjbW9zX3ZwcmludGYoZm9ybWF0LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZWZhdWx0X29wZW5fY2FsbGJhY2tfY29uZF9yZXNldChjb25zdCBiY21fZGV2X2xvZ19maWxlX3Bhcm0gKmZpbGVfcGFybSwgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgYmNtb3NfYm9vbCBpc19yZXdpbmQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKCFmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciB8fCBmaWxlLT5maWxlX3Bhcm0uc2l6ZSA8PSBNRU1fRklMRV9IRFJfU0laRSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIC8qIENyZWF0ZSBmaWxlIG11dGV4ICovCisgICAgZXJyID0gYmNtb3NfbXV0ZXhfY3JlYXRlKCZmaWxlLT51Lm1lbV9maWxlLm11dGV4LCAwLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IENhbid0IGNyZWF0ZSBtdXRleCAoZXJyb3I6ICVkKVxuIiwgKGludCllcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIENoZWNrIGZpbGUgbWFnaWMgc3RyaW5nICovCisgICAgbWVtY3B5KCZmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLCAodWludDhfdCAqKWZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyLCBNRU1fRklMRV9IRFJfU0laRSk7CisgICAgaWYgKG1lbWNtcChGSUxFX01BR0lDX1NUUiwgZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5maWxlX21hZ2ljLCBGSUxFX01BR0lDX1NUUl9TSVpFKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfSU5GT19QUklOVEYoIk5vIGZpbGUgbWFnaWMgc3RyaW5nIC0gZmlsZSBpcyBlbXB0eS9jb3JydXB0XG4iKTsKKyAgICAgICAgaWYgKCFpc19yZXdpbmQgfHwgIWZpbGUtPmZpbGVfcGFybS5yZXdpbmRfY2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGUtPmZpbGVfcGFybS5yZXdpbmRfY2IoZmlsZSk7CisgICAgfQorCisgICAgREVWX0xPR19JTkZPX1BSSU5URigiQXR0YWNoZWQgdG8gZXhpc3RpbmcgZmlsZVxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRlZmF1bHRfb3Blbl9jYWxsYmFjayhjb25zdCBiY21fZGV2X2xvZ19maWxlX3Bhcm0gKmZpbGVfcGFybSwgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICByZXR1cm4gZGVmYXVsdF9vcGVuX2NhbGxiYWNrX2NvbmRfcmVzZXQoZmlsZV9wYXJtLCBmaWxlLCBCQ01PU19UUlVFKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRlZmF1bHRfY2xvc2VfY2FsbGJhY2soYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBiY21vc19tdXRleF9kZXN0cm95KCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogTG9vayBmb3Igc3RhcnQgb2YgbXNnIGNoYXJhY3RlciAqLworc3RhdGljIGludCBnZXRfbXNnX3N0YXJ0X29mZnNldChiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IG1heF9sZW4pCit7CisgICAgdWludDhfdCAqYnVmLCAqbXNnOworCisgICAgYnVmID0gKHVpbnQ4X3QgKilmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciArIG9mZnNldCArIE1FTV9GSUxFX0hEUl9TSVpFOworICAgIG1zZyA9IG1lbWNocihidWYsIERFVl9MT0dfTVNHX1NUQVJUX0NIQVIsIG1heF9sZW4pOworICAgIGlmICghbXNnKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIChtc2cgLSBidWYgKyAxKTsKK30KKworLyogTG9vayBmb3IgMC10ZXJtaW5hdG9yICovCitzdGF0aWMgaW50IGdldF9tc2dfZW5kX29mZnNldChiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IG1heF9sZW4pCit7CisgICAgdWludDhfdCAqYnVmLCAqZW5kOworCisgICAgYnVmID0gKHVpbnQ4X3QgKilmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciArIG9mZnNldCArIE1FTV9GSUxFX0hEUl9TSVpFOworICAgIGVuZCA9IG1lbWNocihidWYsIDAsIG1heF9sZW4pOworICAgIGlmICghZW5kKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIChlbmQgLSBidWYgKyAxKTsKK30KKworc3RhdGljIGludCBkZWZhdWx0X3JlYWRfY2FsbGJhY2soYmNtX2Rldl9sb2dfZmlsZSAqbG9nX2ZpbGUsIHVpbnQzMl90ICpwX29mZnNldCwgdm9pZCAqYnVmLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gKnBfb2Zmc2V0OworICAgIHVpbnQzMl90IHJlYWxfbGVuZ3RoID0gMDsKKyAgICBpbnQgc3RhcnQsIGVuZDsKKworICAgIC8qIElmIGZpbGUgd3JhcHBlZCBhcm91bmQsIG9mZnNldCBzdGFydHMgZnJvbSB3cml0ZV9vZmZzZXQsIG90aGVyd2lzZSwKKyAgICAgKiBpdCBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nCisgICAgICovCisgICAgaWYgKGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmZpbGVfd3JhcF9jbnQpCisgICAgeworICAgICAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID49IGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgbGVuZ3RoID0gbG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplIC0gb2Zmc2V0OworICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQgPj0gbG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplKQorICAgICAgICAgICAgb2Zmc2V0IC09IGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZTsKKyAgICAgICAgLyogRmluZCBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbWVzc2FnZSAqLworICAgICAgICBzdGFydCA9IGdldF9tc2dfc3RhcnRfb2Zmc2V0KGxvZ19maWxlLCBvZmZzZXQsIExPR19NSU4obG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplIC0gb2Zmc2V0LAorICAgICAgICAgICAgTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUpKTsKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRGlkbid0IGZpbmQgYW55IHVwIHRvIHRoZSBlbmQgb2YgYnVmZmVyLiBMb29rIGZyb20gdGhlIHN0YXJ0ICovCisgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgaWYgKCFsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBzdGFydCA9IGdldF9tc2dfc3RhcnRfb2Zmc2V0KGxvZ19maWxlLCAwLCBMT0dfTUlOKGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLndyaXRlX29mZnNldCAtIDEsCisgICAgICAgICAgICAgICAgTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUpKTsKKyAgICAgICAgICAgIGlmIChzdGFydCA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBzdGFydDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU3RhcnQgYmVnaW5uaW5nIG9mIG1lc3NhZ2UuIFdpdGhvdXQgd3JhcC1hcm91bmQgaXQgc2hvdWxkIGJlIHJpZ2h0IGF0IHRoZSBvZmZzZXQsCisgICAgICAgICAqIHNvLCBpdCBpcyBqdXN0IGEgcHJlY2F1dGlvbiAqLworICAgICAgICBzdGFydCA9IGdldF9tc2dfc3RhcnRfb2Zmc2V0KGxvZ19maWxlLCBvZmZzZXQsIExPR19NSU4obG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplIC0gb2Zmc2V0LAorICAgICAgICAgICAgTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUpKTsKKyAgICAgICAgaWYgKHN0YXJ0IDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgb2Zmc2V0ICs9IHN0YXJ0OworICAgICAgICAvKiBTdG9wIHJlYWRpbmcgd2hlbiByZWFjaGVkIHdyaXRlX29mZnNldCAqLworICAgICAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID49IGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLndyaXRlX29mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBsZW5ndGggPSBsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQgLSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBXZSBoYXZlIHRoZSBiZWdpbm5pbmcuIE5vdyBmaW5kIHRoZSBlbmQgb2YgbWVzc2FnZSBhbmQgY29weSB0byB0aGUgdXNlcgorICAgICAqIGJ1ZmZlciBpZiB0aGVyZSBpcyBlbm91Z2ggcm9vbSAqLworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5kYXRhX3NpemUpCisgICAgeworICAgICAgICB1aW50MzJfdCBsZW5ndGgxID0gb2Zmc2V0ICsgbGVuZ3RoIC0gbG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplOyAvKiB0YWlsIGxlbmd0aCAqLworICAgICAgICBsZW5ndGggLT0gbGVuZ3RoMTsKKyAgICAgICAgZW5kID0gZ2V0X21zZ19lbmRfb2Zmc2V0KGxvZ19maWxlLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIGlmIChlbmQgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KGJ1ZiwgKHVpbnQ4X3QgKilsb2dfZmlsZS0+ZmlsZV9wYXJtLnN0YXJ0X2FkZHIgKyBvZmZzZXQgKyBNRU1fRklMRV9IRFJfU0laRSwgZW5kKTsKKyAgICAgICAgICAgICpwX29mZnNldCArPSBlbmQgKyBzdGFydDsKKyAgICAgICAgICAgIHJldHVybiBlbmQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBEaWRuJ3QgZmluZCBlbmQgb2YgbWVzc2FnZSBpbiB0aGUgZW5kIG9mIGZpbGUgZGF0YSBidWZmZXIuIHdyYXAgYXJvdW5kICovCisgICAgICAgIG1lbWNweShidWYsICh1aW50OF90ICopbG9nX2ZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyICsgb2Zmc2V0ICsgTUVNX0ZJTEVfSERSX1NJWkUsIGxlbmd0aCk7CisgICAgICAgIHJlYWxfbGVuZ3RoID0gbGVuZ3RoOworICAgICAgICBidWYgPSAodWludDhfdCAqKWJ1ZiArIGxlbmd0aDsKKyAgICAgICAgbGVuZ3RoID0gbGVuZ3RoMTsKKyAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICB9CisgICAgZW5kID0gZ2V0X21zZ19lbmRfb2Zmc2V0KGxvZ19maWxlLCBvZmZzZXQsIE1BWF9ERVZfTE9HX1NUUklOR19TSVpFKTsKKyAgICBpZiAoZW5kIDw9IDApCisgICAgeworICAgICAgICAvKiBzb21ldGhpbmcgaXMgd3JvbmcuIG1zZyBpcyBub3QgdGVybWluYXRlZCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogSWYgdGhlcmUgaXMgbm8gcm9vbSBmb3IgdGhlIHdob2xlIG1lc3NhZ2UgLSByZXR1cm4gb3ZlcmZsb3cgKi8KKyAgICBpZiAoZW5kID4gbGVuZ3RoKQorICAgICAgICByZXR1cm4gKGludClCQ01fRVJSX09WRVJGTE9XOworCisgICAgbWVtY3B5KGJ1ZiwgKHVpbnQ4X3QgKilsb2dfZmlsZS0+ZmlsZV9wYXJtLnN0YXJ0X2FkZHIgKyBvZmZzZXQgKyBNRU1fRklMRV9IRFJfU0laRSwgZW5kKTsKKyAgICByZWFsX2xlbmd0aCArPSBlbmQ7CisKKyAgICAqcF9vZmZzZXQgKz0gcmVhbF9sZW5ndGggKyBzdGFydDsKKworICAgIHJldHVybiByZWFsX2xlbmd0aDsKK30KKworc3RhdGljIGludCBnZXRfbnVtX29mX292ZXJ3cml0dGVuX21lc3NhZ2VzKHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbGVuZ3RoKQoreworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IG4gPSAwOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHAgPSBtZW1jaHIoYnVmLCBERVZfTE9HX01TR19TVEFSVF9DSEFSLCBsZW5ndGgpOworICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrbjsKKyAgICAgICAgbGVuZ3RoIC09IChwICsgMSAtIGJ1Zik7CisgICAgICAgIGJ1ZiA9IHAgKyAxOworICAgIH0gd2hpbGUobGVuZ3RoKTsKKworICAgIHJldHVybiBuOworfQorCitzdGF0aWMgaW50IGRlZmF1bHRfd3JpdGVfY2FsbGJhY2soYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgY29uc3Qgdm9pZCAqYnVmLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgdWludDMyX3Qgb2Zmc2V0LCBuZXh0X29mZnNldDsKKyAgICB1aW50OF90ICpwOworICAgIGludCBuX292ZXJ3cml0dGVuID0gMDsKKworICAgIGlmICgoZmlsZS0+ZmlsZV9wYXJtLmZsYWdzICYgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1NUT1BfV0hFTl9GVUxMKSAmJiBmaWxlLT5pc19mdWxsKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghbGVuZ3RoKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGJjbW9zX211dGV4X2xvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworCisgICAgb2Zmc2V0ID0gZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQ7CisgICAgbmV4dF9vZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGggKyAxOyAvKiAxIGV4dHJhIGNoYXJhY3RlciBmb3IgcmVjb3JkIGRlbGltaXRlciAqLworCisgICAgLyogSGFuZGxlIG92ZXJmbG93ICovCisgICAgaWYgKG5leHRfb2Zmc2V0ID49IGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdGFpbF9sZW5ndGg7CisKKyAgICAgICAgLyogU3BsaXQgYnVmZmVyIGluIDIgKi8KKyAgICAgICAgdGFpbF9sZW5ndGggPSBuZXh0X29mZnNldCAtIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplOyAgIC8qIDJuZCBzZWdtZW50IGxlbmd0aCAqLworCisgICAgICAgIGlmICgoZmlsZS0+ZmlsZV9wYXJtLmZsYWdzICYgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1NUT1BfV0hFTl9GVUxMKSAmJiB0YWlsX2xlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsZS0+aXNfZnVsbCA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBsZW5ndGggLT0gdGFpbF9sZW5ndGg7CisgICAgICAgIC8qICJpZiAobmV4dF9vZmZzZXQgPj0gZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5kYXRhX3NpemUpIiBjb25kaXRpb24KKyAgICAgICAgICogZ3VhcmFudGVlcyB0aGF0IHRoZXJlIGlzIHJvb20gZm9yIGF0IGxlYXN0IDEgY2hhcmFjdGVyIGluIHRoZSBlbmQgb2YgZmlsZSAqLworICAgICAgICBwID0gKHVpbnQ4X3QgKilmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciArIG9mZnNldCArIE1FTV9GSUxFX0hEUl9TSVpFOworICAgICAgICBpZiAoZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5maWxlX3dyYXBfY250KQorICAgICAgICAgICAgbl9vdmVyd3JpdHRlbiArPSBnZXRfbnVtX29mX292ZXJ3cml0dGVuX21lc3NhZ2VzKHAsIGxlbmd0aCArIDEpOworICAgICAgICAqcCA9IERFVl9MT0dfTVNHX1NUQVJUX0NIQVI7CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweShwICsgMSwgYnVmLCBsZW5ndGgpOworICAgICAgICAgICAgYnVmID0gKGNvbnN0IHVpbnQ4X3QgKilidWYgKyBsZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhaWxfbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBwID0gKHVpbnQ4X3QgKilmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciArIE1FTV9GSUxFX0hEUl9TSVpFOworICAgICAgICAgICAgaWYgKGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZmlsZV93cmFwX2NudCkKKyAgICAgICAgICAgICAgICBuX292ZXJ3cml0dGVuICs9IGdldF9udW1fb2Zfb3ZlcndyaXR0ZW5fbWVzc2FnZXMocCwgdGFpbF9sZW5ndGgpOworICAgICAgICAgICAgbWVtY3B5KHAsIGJ1ZiwgdGFpbF9sZW5ndGgpOworICAgICAgICAgICAgKytmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmZpbGVfd3JhcF9jbnQ7CisgICAgICAgIH0KKyAgICAgICAgbmV4dF9vZmZzZXQgPSB0YWlsX2xlbmd0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcCA9ICh1aW50OF90ICopZmlsZS0+ZmlsZV9wYXJtLnN0YXJ0X2FkZHIgKyBNRU1fRklMRV9IRFJfU0laRSArIG9mZnNldDsKKyAgICAgICAgaWYgKGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZmlsZV93cmFwX2NudCkKKyAgICAgICAgICAgIG5fb3ZlcndyaXR0ZW4gKz0gZ2V0X251bV9vZl9vdmVyd3JpdHRlbl9tZXNzYWdlcyhwLCBsZW5ndGggKyAxKTsKKyAgICAgICAgKihwKyspID0gREVWX0xPR19NU0dfU1RBUlRfQ0hBUjsKKyAgICAgICAgbWVtY3B5KHAsIGJ1ZiwgbGVuZ3RoKTsKKyAgICB9CisgICAgZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQgPSBuZXh0X29mZnNldDsKKyAgICBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLm51bV9tc2dzICs9ICgxIC0gbl9vdmVyd3JpdHRlbik7CisKKyAgICAvKiB1cGRhdGUgdGhlIGhlYWRlciAqLworICAgIG1lbWNweSgodWludDhfdCAqKWZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyLCAmZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlciwgTUVNX0ZJTEVfSERSX1NJWkUpOworCisgICAgLyogc2VuZCBhbG1vc3QgZnVsbCBpbmRpY2F0aW9uIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChmaWxlLT5hbG1vc3RfZnVsbC5zZW5kX2luZF9jYiAmJgorICAgICAgICAhZmlsZS0+YWxtb3N0X2Z1bGwuaW5kX3NlbnQgJiYKKyAgICAgICAgZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQgPiBmaWxlLT5hbG1vc3RfZnVsbC50aHJlc2hvbGQpCisgICAgeworICAgICAgICBmaWxlLT5hbG1vc3RfZnVsbC5pbmRfc2VudCA9IChmaWxlLT5hbG1vc3RfZnVsbC5zZW5kX2luZF9jYihmaWxlLT5hbG1vc3RfZnVsbC5wcml2KSA9PSBCQ01fRVJSX09LKTsKKyAgICB9CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRlZmF1bHRfcmV3aW5kX2NhbGxiYWNrKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmZmlsZS0+dS5tZW1fZmlsZS5tdXRleCk7CisKKyAgICBERVZfTE9HX0lORk9fUFJJTlRGKCJDbGVhciBmaWxlXG4iKTsKKyAgICBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmZpbGVfd3JhcF9jbnQgPSAwOworICAgIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIud3JpdGVfb2Zmc2V0ID0gMDsKKyAgICBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZSA9IGZpbGUtPmZpbGVfcGFybS5zaXplIC0gTUVNX0ZJTEVfSERSX1NJWkU7CisgICAgZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5udW1fbXNncyA9IDA7CisgICAgc3RyY3B5KGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZmlsZV9tYWdpYywgRklMRV9NQUdJQ19TVFIpOworICAgIG1lbWNweSgodWludDhfdCAqKWZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyLCAmZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlciwgTUVNX0ZJTEVfSERSX1NJWkUpOworICAgIGZpbGUtPmFsbW9zdF9mdWxsLmluZF9zZW50ID0gQkNNT1NfRkFMU0U7CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfZmlsZV9jYWxsYmFja3MoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBmaWxlLT5maWxlX3Bhcm0ub3Blbl9jYiAgPSBkZWZhdWx0X29wZW5fY2FsbGJhY2s7CisgICAgZmlsZS0+ZmlsZV9wYXJtLmNsb3NlX2NiICA9IGRlZmF1bHRfY2xvc2VfY2FsbGJhY2s7CisgICAgZmlsZS0+ZmlsZV9wYXJtLnJlYWRfY2IgID0gZGVmYXVsdF9yZWFkX2NhbGxiYWNrOworICAgIGZpbGUtPmZpbGVfcGFybS53cml0ZV9jYiA9IGRlZmF1bHRfd3JpdGVfY2FsbGJhY2s7CisgICAgZmlsZS0+ZmlsZV9wYXJtLnJld2luZF9jYiA9IGRlZmF1bHRfcmV3aW5kX2NhbGxiYWNrOworfQorCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtX2Rldl9sb2dfaXNfbWVtb3J5X2ZpbGUoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICByZXR1cm4gKGZpbGUtPmZpbGVfcGFybS5vcGVuX2NiID09IGRlZmF1bHRfb3Blbl9jYWxsYmFjayk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2ZpbGVfY2xlYXIoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBpZiAoIWZpbGUgfHwgIShmaWxlLT5maWxlX3Bhcm0uZmxhZ3MgJiBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgaWYgKCFmaWxlLT5maWxlX3Bhcm0ucmV3aW5kX2NiKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworCisgICAgcmV0dXJuIGZpbGUtPmZpbGVfcGFybS5yZXdpbmRfY2IoZmlsZSk7Cit9CisKKy8qIEZpbGUgaW5kZXggdG8gZmlsZSBoYW5kbGUgKi8KK2JjbV9kZXZfbG9nX2ZpbGUgKmJjbV9kZXZfbG9nX2ZpbGVfZ2V0KHVpbnQzMl90IGZpbGVfaW5kZXgpCit7CisgICAgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSA9ICZkZXZfbG9nLmZpbGVzW2ZpbGVfaW5kZXhdOworCisgICAgaWYgKChmaWxlX2luZGV4ID49IERFVl9MT0dfTUFYX0ZJTEVTKSB8fCAhKGZpbGUtPmZpbGVfcGFybS5mbGFncyAmIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19WQUxJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBmaWxlOworfQorCisvKiBSZWFkIGZyb20gZmlsZSAqLworaW50IGJjbV9kZXZfbG9nX2ZpbGVfcmVhZChiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCAqb2Zmc2V0LCBjaGFyICpidWYsIHVpbnQzMl90IGJ1Zl9sZW4pCit7CisgICAgaW50IGxlbjsKKyAgICBpZiAoIWZpbGUgfHwgIWJ1ZiB8fCAhKGZpbGUtPmZpbGVfcGFybS5mbGFncyAmIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19WQUxJRCkpCisgICAgICAgIHJldHVybiAoaW50KUJDTV9FUlJfUEFSTTsKKworICAgIGxlbiA9IGZpbGUtPmZpbGVfcGFybS5yZWFkX2NiKGZpbGUsIG9mZnNldCwgYnVmLCBidWZfbGVuKTsKKyAgICAvKiBJZiBub3RoaW5nIG1vcmUgdG8gcmVhZCBhbmQgQ0xFQVJfQUZURVJfUkVBRCBtb2RlLCByZWFkIGFnYWluIHVuZGVyIGxvY2sgYW5kIGNsZWFyIGlmIG5vIG5ldyByZWNvcmRzICovCisgICAgaWYgKCFsZW4gJiYgYmNtX2Rldl9sb2dfaXNfbWVtb3J5X2ZpbGUoZmlsZSkgJiYgKGZpbGUtPmZpbGVfcGFybS5mbGFncyAmIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19DTEVBUl9BRlRFUl9SRUFEKSkKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X2xvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworICAgICAgICBsZW4gPSBmaWxlLT5maWxlX3Bhcm0ucmVhZF9jYihmaWxlLCBvZmZzZXQsIGJ1ZiwgYnVmX2xlbik7CisgICAgICAgIGlmICghbGVuKQorICAgICAgICAgICAgZmlsZS0+ZmlsZV9wYXJtLnJld2luZF9jYihmaWxlKTsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworLyogQXR0YWNoIGZpbGUgdG8gbWVtb3J5IGJ1ZmZlciAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfZmlsZV9hdHRhY2godm9pZCAqYnVmLCB1aW50MzJfdCBidWZfbGVuLCBiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGRldl9sb2dfbWVtX2ZpbGVfaGVhZGVyICpoZHIgPSAoZGV2X2xvZ19tZW1fZmlsZV9oZWFkZXIgKilidWY7CisKKyAgICBpZiAoIWJ1ZiB8fCAhZmlsZSB8fCBidWZfbGVuIDw9IE1FTV9GSUxFX0hEUl9TSVpFKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgaWYgKG1lbWNtcChGSUxFX01BR0lDX1NUUiwgaGRyLT5maWxlX21hZ2ljLCBGSUxFX01BR0lDX1NUUl9TSVpFKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisKKyNpZiBERVZfTE9HX0VORElBTiAhPSBCQ01fQ1BVX0VORElBTgorICAgIGhkci0+ZmlsZV93cmFwX2NudCA9IGJjbW9zX2VuZGlhbl9zd2FwX3UzMihoZHItPmZpbGVfd3JhcF9jbnQpOworICAgIGhkci0+d3JpdGVfb2Zmc2V0ID0gYmNtb3NfZW5kaWFuX3N3YXBfdTMyKGhkci0+d3JpdGVfb2Zmc2V0KTsKKyAgICBoZHItPmRhdGFfc2l6ZSA9IGJjbW9zX2VuZGlhbl9zd2FwX3UzMihoZHItPmRhdGFfc2l6ZSk7CisgICAgaGRyLT5udW1fbXNncyA9IGJjbW9zX2VuZGlhbl9zd2FwX3UzMihoZHItPm51bV9tc2dzKTsKKyNlbmRpZgorCisgICAgbWVtc2V0KGZpbGUsIDAsIHNpemVvZigqZmlsZSkpOworICAgIGZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyID0gYnVmOworICAgIGZpbGUtPmZpbGVfcGFybS5zaXplID0gYnVmX2xlbjsKKyAgICBmaWxlLT5maWxlX3Bhcm0uZmxhZ3MgPSBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQ7CisgICAgc2V0X2RlZmF1bHRfZmlsZV9jYWxsYmFja3MoZmlsZSk7CisgICAgcmMgPSBkZWZhdWx0X29wZW5fY2FsbGJhY2tfY29uZF9yZXNldCgmZmlsZS0+ZmlsZV9wYXJtLCBmaWxlLCBCQ01PU19GQUxTRSk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBpZiAoIWZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIubnVtX21zZ3MpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERldGFjaCBmaWxlIGhhbmRsZSBmcm9tIG1lbW9yeSBidWZmZXIgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2ZpbGVfZGV0YWNoKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgaWYgKCFmaWxlIHx8ICEoZmlsZS0+ZmlsZV9wYXJtLmZsYWdzICYgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICBmaWxlLT5maWxlX3Bhcm0uZmxhZ3MgPSBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQ7CisgICAgYmNtb3NfbXV0ZXhfZGVzdHJveSgmZmlsZS0+dS5tZW1fZmlsZS5tdXRleCk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworI2lmZGVmIEJDTV9PU19QT1NJWAorICAgIC8qIFJlZ3VsYXIgZmlsZSBjYWxsYmFja3MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBPUEVOIENBTExCQUNLOiBvcGVuIG1lbW9yeS9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZpbGVfcGFybSAtIGZpbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZSAgICAgIC0gZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBfZGV2X2xvZ19yZWdfZmlsZV9vcGVuKGNvbnN0IGJjbV9kZXZfbG9nX2ZpbGVfcGFybSAqZmlsZV9wYXJtLCBiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBmaWxlLT5maWxlX3Bhcm0gPSAqZmlsZV9wYXJtOworICAgIGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlID0gZm9wZW4oKGNoYXIgKilmaWxlX3Bhcm0tPnVkZWZfcGFybXMsICJ3KyIpOworICAgIGlmICghZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUpCisgICAgeworICAgICAgICBiY21vc19wcmludGYoIkRFVl9MT0c6IGNhbid0IG9wZW4gZmlsZSAlcyBmb3Igd3JpdGluZ1xuIiwgKGNoYXIgKilmaWxlX3Bhcm0tPnVkZWZfcGFybXMpOworICAgICAgICBlcnIgPSBCQ01fRVJSX0lPOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENMT1NFIENBTExCQUNLOiBjbG9zZSBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmaWxlICAgICAgLSBmaWxlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIF9kZXZfbG9nX3JlZ19maWxlX2Nsb3NlKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgaWYgKGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKQorICAgIHsKKyAgICAgICAgZmNsb3NlKGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKTsKKyAgICAgICAgZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSRVdJTkQgQ0FMTEJBQ0s6IGNsZWFycyBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZpbGUgICAgICAtIGZpbGUgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rldl9sb2dfcmVnX2ZpbGVfcmV3aW5kKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBGSUxFICpmOworCisgICAgaWYgKGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKQorICAgIHsKKyAgICAgICAgZiA9IGZyZW9wZW4oKGNvbnN0IGNoYXIgKilmaWxlLT5maWxlX3Bhcm0udWRlZl9wYXJtcywgIncrIiwgZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUpOworICAgICAgICBpZiAoTlVMTCAhPSBmKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlLT51LnJlZ19maWxlX2hhbmRsZSA9IGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX0lPOworICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJERVZfTE9HOiBjYW4ndCBvcGVuIGZpbGUgJXMgZm9yIHdyaXRpbmdcbiIsIChjaGFyICopZmlsZS0+ZmlsZV9wYXJtLnVkZWZfcGFybXMpOworICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSRUFEX0NBTExCQUNLOiByZWFkIGZvcm0gbWVtb3J5L2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIG9mZnNldCAtIHRoZSBvZmZzZXQgaW4gYnl0ZXMgdG8gcmVhZCBmcm9tLCBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogYnVmICAgIC0gV2hlcmUgdG8gcHV0IHRoZSByZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBsZW5ndGggLSBCdWZmZXIgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgZnJvbSBmaWxlIG9yIDAgaWYgRU9GICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9kZXZfbG9nX3JlZ19maWxlX3JlYWQoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3QgKm9mZnNldCwgdm9pZCAqYnVmLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgaW50IG4gPSAwOworICAgIGlmIChmaWxlLT51LnJlZ19maWxlX2hhbmRsZSkKKyAgICB7CisgICAgICAgIGlmICghZnNlZWsoZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUsIFNFRUtfU0VULCAqb2Zmc2V0KSkKKyAgICAgICAgICAgIG4gPSBmcmVhZChidWYsIDEsIGxlbmd0aCwgZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUpOworICAgICAgICAqb2Zmc2V0ID0gZnRlbGwoZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gKG4gPCAwKSA/IDAgOiBuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdSSVRFX0NBTExCQUNLOiB3cml0ZSBmb3JtIG1lbW9yeS9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogYnVmICAgIC0gVGhlIGJ1ZmZlciB0aGF0IHNob3VsZCBiZSB3cml0dGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBsZW5ndGggLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gdG8gZmlsZSBvciAwIGlmIEVPRiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9kZXZfbG9nX3JlZ19maWxlX3dyaXRlKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUsIGNvbnN0IHZvaWQgKmJ1ZiwgdWludDMyX3QgbGVuZ3RoKQoreworICAgIGNvbnN0IGNoYXIgKmNidWYgPSAoY29uc3QgY2hhciAqKWJ1ZjsKKyAgICBpbnQgbiA9IDA7CisgICAgaWYgKGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKQorICAgIHsKKyAgICAgICAgLyogUmVtb3ZlIDAgdGVybWluYXRvciAqLworICAgICAgICBpZiAobGVuZ3RoICYmICFjYnVmW2xlbmd0aC0xXSkKKyAgICAgICAgICAgIC0tbGVuZ3RoOworICAgICAgICBuID0gZndyaXRlKGJ1ZiwgMSwgbGVuZ3RoLCBmaWxlLT51LnJlZ19maWxlX2hhbmRsZSk7CisgICAgICAgIGZmbHVzaChmaWxlLT51LnJlZ19maWxlX2hhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBzZXRfcmVndWxhcl9maWxlX2NhbGxiYWNrcyhiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGZpbGUtPmZpbGVfcGFybS5vcGVuX2NiICA9IF9kZXZfbG9nX3JlZ19maWxlX29wZW47CisgICAgZmlsZS0+ZmlsZV9wYXJtLmNsb3NlX2NiICA9IF9kZXZfbG9nX3JlZ19maWxlX2Nsb3NlOworICAgIGZpbGUtPmZpbGVfcGFybS5yZWFkX2NiICA9IF9kZXZfbG9nX3JlZ19maWxlX3JlYWQ7CisgICAgZmlsZS0+ZmlsZV9wYXJtLndyaXRlX2NiID0gX2Rldl9sb2dfcmVnX2ZpbGVfd3JpdGU7CisgICAgZmlsZS0+ZmlsZV9wYXJtLnJld2luZF9jYiA9IF9kZXZfbG9nX3JlZ19maWxlX3Jld2luZDsKK30KKworI2VuZGlmIC8qICNpZmRlZiBCQ01fT1NfUE9TSVggKi8KKworI2lmZGVmIERFVl9MT0dfU1lTTE9HCisgICAgLyogbGludXggc3lzbG9nIGludGVncmF0aW9uICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE9QRU4gQ0FMTEJBQ0s6IG9wZW4gc3lzbG9nIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZV9wYXJtLT51ZGVmX3Bhcm0gY29udGFpbnMgb3B0aW9uYWwgbG9nIGlkZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBfZGV2X2xvZ19zeXNsb2dfZmlsZV9vcGVuKGNvbnN0IGJjbV9kZXZfbG9nX2ZpbGVfcGFybSAqZmlsZV9wYXJtLCBiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGZpbGUtPmZpbGVfcGFybSA9ICpmaWxlX3Bhcm07CisgICAgb3BlbmxvZygoY29uc3QgY2hhciAqKWZpbGVfcGFybS0+dWRlZl9wYXJtcywgMCwgTE9HX1VTRVIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENMT1NFIENBTExCQUNLOiBjbG9zZSBzeXNsb2cgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfY2xvc2UoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBjbG9zZWxvZygpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJFV0lORCBDQUxMQkFDSzogbm90IHN1cHBvcnRlZCBieSBzeXNsb2cuIFJldHVybiBPSyB0byBwcmV2ZW50IHJlcXVlc3QgZmFpbHVyZSAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfcmV3aW5kKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUkVBRF9DQUxMQkFDSzogcmVhZGluZyBmcm9tIHN5c2xvZyBpcyBub3Qgc3VwcG9ydGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgX2Rldl9sb2dfc3lzbG9nX2ZpbGVfcmVhZChiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCAqb2Zmc2V0LCB2b2lkICpidWYsIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXUklURV9DQUxMQkFDSzogd3JpdGUgdG8gc3lzbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGJ1ZiAgICAtIFRoZSBidWZmZXIgdGhhdCBzaG91bGQgYmUgd3JpdHRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogbGVuZ3RoIC0gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuIHRvIGZpbGUgb3IgMCBpZiBFT0YgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfZGV2X2xvZ19zeXNsb2dfZmlsZV93cml0ZShiY21fZGV2X2xvZ19maWxlICpmaWxlLCBjb25zdCB2b2lkICpidWYsIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICBjb25zdCBjaGFyICpjYnVmID0gKGNvbnN0IGNoYXIgKilidWY7CisgICAgc3RhdGljIGludCBsb2dfcHJpb3JpdHkgPSBMT0dfREVCVUc7CisKKyAgICAvKiBJZGVudGlmeSBsb2cgbG92ZWwgKi8KKyAgICBpZiAoY2J1ZiAmJiBjYnVmWzBdID09ICdbJykKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNsZXZlbCA9IHN0cmNocihjYnVmLCAnICcpOworICAgICAgICBpZiAoY2xldmVsKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKCooY2xldmVsICsgMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgICAgICBsb2dfcHJpb3JpdHkgPSBMT0dfQ1JJVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgICAgIGxvZ19wcmlvcml0eSA9IExPR19FUlI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdXJzoKKyAgICAgICAgICAgICAgICBsb2dfcHJpb3JpdHkgPSBMT0dfV0FSTklORzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgIGxvZ19wcmlvcml0eSA9IExPR19JTkZPOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgbG9nX3ByaW9yaXR5ID0gTE9HX0RFQlVHOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzeXNsb2cobG9nX3ByaW9yaXR5LCAiJXMiLCBjYnVmKTsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3lzbG9nX2ZpbGVfY2FsbGJhY2tzKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgZmlsZS0+ZmlsZV9wYXJtLm9wZW5fY2IgID0gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfb3BlbjsKKyAgICBmaWxlLT5maWxlX3Bhcm0uY2xvc2VfY2IgID0gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfY2xvc2U7CisgICAgZmlsZS0+ZmlsZV9wYXJtLnJlYWRfY2IgID0gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfcmVhZDsKKyAgICBmaWxlLT5maWxlX3Bhcm0ud3JpdGVfY2IgPSBfZGV2X2xvZ19zeXNsb2dfZmlsZV93cml0ZTsKKyAgICBmaWxlLT5maWxlX3Bhcm0ucmV3aW5kX2NiID0gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfcmV3aW5kOworfQorCisjZW5kaWYgLyogI2lmZGVmIERFVl9MT0dfU1lTTE9HICovCisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jcmVhdGUoCisgICAgY29uc3QgYmNtX2Rldl9sb2dfcGFybSAqZGV2X2xvZ19wYXJtLAorICAgIGNvbnN0IGJjbW9zX3Rhc2tfcGFybSAqc2F2ZV90YXNrX3Bhcm0sCisgICAgY29uc3QgYmNtb3NfdGFza19wYXJtICpwcmludF90YXNrX3Bhcm0sCisgICAgY29uc3QgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gKnNhdmVfcXVldWVfcGFybSwKKyAgICBjb25zdCBiY21vc19tc2dfcXVldWVfcGFybSAqcHJpbnRfcXVldWVfcGFybSwKKyAgICBjb25zdCBiY21vc19tc2dfcG9vbF9wYXJtICpwb29sX3Bhcm0pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGludCBpOworCisgICAgaWYgKCFkZXZfbG9nX3Bhcm0pCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoZGV2X2xvZy5zdGF0ZSAhPSBCQ01fREVWX0xPR19TVEFURV9VTklOSVRJQUxJWkVEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworCisgICAgLyogU2V0IHVzZXIgY2FsbGJhY2tzICovCisgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0gPSAqZGV2X2xvZ19wYXJtOworICAgIGlmICghZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2IpCisgICAgICAgIGRldl9sb2cuZGV2X2xvZ19wYXJtLnByaW50X2NiID0gZGVmYXVsdF9wcmludDsKKyAgICBpZiAoIWRldl9sb2cuZGV2X2xvZ19wYXJtLmdldF90aW1lX2NiKQorICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5nZXRfdGltZV9jYiA9IGRlZmF1bHRfZ2V0X3RpbWU7CisgICAgaWYgKCFkZXZfbG9nLmRldl9sb2dfcGFybS50aW1lX3RvX3N0cl9jYikKKyAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0udGltZV90b19zdHJfY2IgPSBkZWZhdWx0X3RpbWVfdG9fc3RyOworCisgICAgZm9yIChpID0gMDsgKGkgPCBERVZfTE9HX01BWF9GSUxFUykgJiYgKGRldl9sb2dfcGFybS0+bG9nX2ZpbGVbaV0uZmxhZ3MgJiBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQpOyBpKyspCisgICAgeworICAgICAgICAvKiBDb3B5IGxvZyBmaWxlcyAqLworICAgICAgICBkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybSA9IGRldl9sb2dfcGFybS0+bG9nX2ZpbGVbaV07CisgICAgICAgIGlmICghZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0ub3Blbl9jYikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLnR5cGUgPT0gQkNNX0RFVl9MT0dfRklMRV9NRU1PUlkpCisgICAgICAgICAgICAgICAgc2V0X2RlZmF1bHRfZmlsZV9jYWxsYmFja3MoJmRldl9sb2cuZmlsZXNbaV0pOworI2lmZGVmIEJDTV9PU19QT1NJWAorICAgICAgICAgICAgZWxzZSBpZiAoZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0udHlwZSA9PSBCQ01fREVWX0xPR19GSUxFX1JFR1VMQVIpCisgICAgICAgICAgICAgICAgc2V0X3JlZ3VsYXJfZmlsZV9jYWxsYmFja3MoJmRldl9sb2cuZmlsZXNbaV0pOworI2VuZGlmCisjaWZkZWYgREVWX0xPR19TWVNMT0cKKyAgICAgICAgICAgIGVsc2UgaWYgKGRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLnR5cGUgPT0gQkNNX0RFVl9MT0dfRklMRV9TWVNMT0cpCisgICAgICAgICAgICAgICAgc2V0X3N5c2xvZ19maWxlX2NhbGxiYWNrcygmZGV2X2xvZy5maWxlc1tpXSk7CisjZW5kaWYKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiZmlsZSVkOiBvcGVuX2NiIG11c3QgYmUgc2V0IGZvciB1c2VyLWRlZmluZWQgZmlsZVxuXG4iLCBpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlcnIgPSBkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS5vcGVuX2NiKCZkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybSwgJmRldl9sb2cuZmlsZXNbaV0pOworICAgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiZmlsZSVkOiBvcGVuIGZhaWxlZDogJXMgKCVkKVxuXG4iLCBpLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIERFVl9MT0dfSU5GT19QUklOVEYoImZpbGU6IHN0YXJ0X2FkZHI6IDB4JXAsIHNpemU6ICV1LCBtYXggbXNnIHNpemUgJXVcbiIsCisgICAgICAgICAgICBkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS5zdGFydF9hZGRyLCBkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS5zaXplLCBNQVhfREVWX0xPR19TVFJJTkdfU0laRSk7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHBvb2wgKi8KKyAgICBlcnIgPSBiY21vc19tc2dfcG9vbF9jcmVhdGUoJmRldl9sb2cucG9vbCwgcG9vbF9wYXJtKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IENhbid0IGNyZWF0ZSBwb29sIChlcnJvcjogJWQpXG4iLCAoaW50KWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogQ3JlYXRlIG1lc3NhZ2UgcXVldWVzICovCisgICAgZXJyID0gYmNtb3NfbXNnX3F1ZXVlX2NyZWF0ZSgmZGV2X2xvZy5zYXZlX3F1ZXVlLCBzYXZlX3F1ZXVlX3Bhcm0pOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCIoJXMpIEVycm9yOiBDYW4ndCBjcmVhdGUgc2F2ZSBxdWV1ZSAoZXJyb3I6ICVkKVxuIiwgX19GVU5DVElPTl9fLCAoaW50KWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVyciA9IGJjbW9zX21zZ19xdWV1ZV9jcmVhdGUoJmRldl9sb2cucHJpbnRfcXVldWUsIHByaW50X3F1ZXVlX3Bhcm0pOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCIoJXMpIEVycm9yOiBDYW4ndCBjcmVhdGUgcHJpbnQgcXVldWUgKGVycm9yOiAlZClcbiIsIF9fRlVOQ1RJT05fXywgKGludCllcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIENyZWF0ZSB0YXNrcyAqLworICAgIGVyciA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZkZXZfbG9nLnNhdmVfdGFzaywgc2F2ZV90YXNrX3Bhcm0pOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogQ2FuJ3Qgc3Bhd24gc2F2ZSB0YXNrIChlcnJvcjogJWQpXG4iLCAoaW50KWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVyciA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZkZXZfbG9nLnByaW50X3Rhc2ssIHByaW50X3Rhc2tfcGFybSk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBDYW4ndCBzcGF3biBwcmludCB0YXNrIChlcnJvcjogJWQpXG4iLCAoaW50KWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtb3Nfc2VtX2NyZWF0ZSgmZGV2X2xvZy5zYXZlX3Rhc2tfaXNfdGVybWluYXRlZCwgMCwgMCwgInNhdmVfdGFza19zZW0iKTsKKyAgICBiY21vc19zZW1fY3JlYXRlKCZkZXZfbG9nLnByaW50X3Rhc2tfaXNfdGVybWluYXRlZCwgMCwgMCwgInByaW50X3Rhc2tfc2VtIik7CisKKyAgICBkZXZfbG9nLnN0YXRlID0gQkNNX0RFVl9MT0dfU1RBVEVfRU5BQkxFRDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCit2b2lkIGJjbV9kZXZfbG9nX2Rlc3Ryb3kodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgdWludDMyX3QgaTsKKyAgICBiY21vc19tc2dfc2VuZF9mbGFncyBtc2dfZmxhZ3M7CisKKyAgICBpZiAoZGV2X2xvZy5zdGF0ZSA9PSBCQ01fREVWX0xPR19TVEFURV9VTklOSVRJQUxJWkVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFNlbmQgYSBzaHV0ZG93biBtZXNzYWdlIHRvIGVhY2ggdGFzay4gV2hlbiByZWNlaXZlZCBieSB0aGUgbWFpbiBsb29wcywgaXQgd2lsbCB0ZWFyIGRvd24gdGhlIHRhc2tzIGdyYWNlZnVsbHkuCisgICAgICogSWYgdGhlIGZsYWcgaXMgc2V0IHRvIHRlYXIgZG93biBpbW1lZGlhdGVseSwgd2UnbGwgc2VuZCBhbiBVUkdFTlQgdGVhcmRvd24gbWVzc2FnZSwgc28gaXQnbGwgYmUgaGFuZGxlZCBiZWZvcmUKKyAgICAgKiBhbGwgb3VzdGFuZGluZyBsb2cgbWVzc2FnZXMgKHRoZSBvdXN0YW5kaW5nIGxvZyBtZXNzYWdlcyB3aWxsIGJlIGZyZWVkIGR1cmluZyBiY21vc19tc2dfcXVldWVfZGVzdHJveSkuICovCisgICAgbXNnX2ZsYWdzID0gQkNNT1NfTVNHX1NFTkRfTk9MSU1JVDsKKyAgICBpZiAoKGRldl9sb2cuZmxhZ3MgJiBCQ01fREVWX0xPR19GTEFHX0RFU1RST1lfSU1NRURJQVRFTFkpICE9IDApCisgICAgICAgIG1zZ19mbGFncyB8PSBCQ01PU19NU0dfU0VORF9VUkdFTlQ7CisKKyAgICAvKiBUaGUgc2F2ZSB0YXNrIGRlcGVuZHMgb24gdGhlIHByaW50IHRhc2ssIHNvIHdlIHRlcm1pbmF0ZSB0aGUgc2F2ZSB0YXNrIGZpcnN0LiAqLworICAgIGJjbW9zX21zZ19zZW5kKCZkZXZfbG9nLnNhdmVfcXVldWUsICZzaHV0ZG93bl9tc2csIG1zZ19mbGFncyk7CisgICAgYmNtb3Nfc2VtX3dhaXQoJmRldl9sb2cuc2F2ZV90YXNrX2lzX3Rlcm1pbmF0ZWQsIEJDTU9TX1dBSVRfRk9SRVZFUik7CisKKyAgICBiY21vc19tc2dfc2VuZCgmZGV2X2xvZy5wcmludF9xdWV1ZSwgJnNodXRkb3duX21zZywgbXNnX2ZsYWdzKTsKKyAgICBiY21vc19zZW1fd2FpdCgmZGV2X2xvZy5wcmludF90YXNrX2lzX3Rlcm1pbmF0ZWQsIEJDTU9TX1dBSVRfRk9SRVZFUik7CisKKyAgICBiY21vc19zZW1fZGVzdHJveSgmZGV2X2xvZy5zYXZlX3Rhc2tfaXNfdGVybWluYXRlZCk7CisgICAgYmNtb3Nfc2VtX2Rlc3Ryb3koJmRldl9sb2cucHJpbnRfdGFza19pc190ZXJtaW5hdGVkKTsKKworICAgIGVyciA9IGJjbW9zX3Rhc2tfZGVzdHJveSgmZGV2X2xvZy5zYXZlX3Rhc2spOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogQ2FuJ3QgZGVzdHJveSBkZXZfbG9nIHNhdmUgdGFzayAoZXJyb3I6ICVkKVxuIiwgKGludCllcnIpOworICAgIH0KKworICAgIGVyciA9IGJjbW9zX3Rhc2tfZGVzdHJveSgmZGV2X2xvZy5wcmludF90YXNrKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IENhbid0IGRlc3Ryb3kgZGV2X2xvZyBwcmludCB0YXNrIChlcnJvcjogJWQpXG4iLCAoaW50KWVycik7CisgICAgfQorCisgICAgZXJyID0gYmNtb3NfbXNnX3F1ZXVlX2Rlc3Ryb3koJmRldl9sb2cuc2F2ZV9xdWV1ZSk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBDYW4ndCBkZXN0cm95IHNhdmUgcXVldWUgKGVycm9yOiAlZClcbiIsIChpbnQpZXJyKTsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vc19tc2dfcXVldWVfZGVzdHJveSgmZGV2X2xvZy5wcmludF9xdWV1ZSk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBDYW4ndCBkZXN0cm95IHByaW50IHF1ZXVlIChlcnJvcjogJWQpXG4iLCAoaW50KWVycik7CisgICAgfQorCisgICAgZXJyID0gYmNtb3NfbXNnX3Bvb2xfZGVzdHJveSgmZGV2X2xvZy5wb29sKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IENhbid0IGRlc3Ryb3kgcG9vbCAoZXJyb3I6ICVkKVxuIiwgKGludCllcnIpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IChpIDwgREVWX0xPR19NQVhfRklMRVMpICYmIChkZXZfbG9nLmRldl9sb2dfcGFybS5sb2dfZmlsZVtpXS5mbGFncyAmIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19WQUxJRCk7IGkrKykKKyAgICB7CisgICAgICAgIGRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLmNsb3NlX2NiKCZkZXZfbG9nLmZpbGVzW2ldKTsKKyAgICB9CisKKyAgICBkZXZfbG9nLnN0YXRlID0gQkNNX0RFVl9MT0dfU1RBVEVfVU5JTklUSUFMSVpFRDsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgbXNnOworICAgIGRldl9sb2dfcXVldWVfbXNnIGxvZ19xdWV1ZV9tc2c7CisgICAgYmNtb3NfYm9vbCBsb2NrOworICAgIGJjbW9zX2Zhc3Rsb2NrIGZhc3Rsb2NrOworfSBiY21fZGV2X2xvZ19kcm9wX21zZzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21fZGV2X2xvZ19kcm9wX21zZyBtc2c7CisgICAgdWludDMyX3QgZHJvcHM7CisgICAgdWludDMyX3QgcmVwb3J0ZWRfZHJvcHM7CisgICAgYmNtb3NfdGltZXIgdGltZXI7CisgICAgdWludDMyX3QgbGFzdF9yZXBvcnRfdGltZXN0YW1wOworfSBiY21fZGV2X2xvZ19kcm9wOworCitzdGF0aWMgYmNtX2Rldl9sb2dfZHJvcCBkZXZfbG9nX2Ryb3A7CisKK3N0YXRpYyB2b2lkIGJjbV9kZXZfbG9nX2xvZ19tZXNzYWdlX3JlbGVhc2VfZHJvcChiY21vc19tc2cgKm0pCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jayk7CisgICAgZGV2X2xvZ19kcm9wLm1zZy5sb2NrID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZkZXZfbG9nX2Ryb3AubXNnLmZhc3Rsb2NrLCBmbGFncyk7CisKKyAgICAvKiBTY2hlZHVsZSBhIHRpbWVyIHRvIHJlcG9ydCBleHRyYSBkcm9wcywgYmVjYXVzZSB3ZSBtYXkgbm90IG1lZXQgREVWX0xPR19EUk9QX1JFUE9SVF9EUk9QX1RIUkVTSE9MRCBzb29uLiAqLworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfbG9nX2Ryb3AudGltZXIsIERFVl9MT0dfRFJPUF9SRVBPUlRfUkFURV9VUyk7Cit9CisKK3N0YXRpYyB2b2lkIF9iY21fZGV2X2xvZ19kcm9wX3JlcG9ydCh2b2lkKQoreworICAgIGJjbW9zX21zZyAqbXNnOworICAgIGRldl9sb2dfcXVldWVfbXNnICpsb2dfcXVldWVfbXNnOworCisgICAgbXNnID0gJmRldl9sb2dfZHJvcC5tc2cubXNnOworICAgIG1zZy0+cmVsZWFzZSA9IGJjbV9kZXZfbG9nX2xvZ19tZXNzYWdlX3JlbGVhc2VfZHJvcDsKKyAgICBsb2dfcXVldWVfbXNnID0gJmRldl9sb2dfZHJvcC5tc2cubG9nX3F1ZXVlX21zZzsKKyAgICBsb2dfcXVldWVfbXNnLT5mbGFncyA9IEJDTV9MT0dfRkxBR19ET05UX1NLSVBfUFJJTlQ7CisgICAgbG9nX3F1ZXVlX21zZy0+dGltZV9zdGFtcCA9IGRldl9sb2cuZGV2X2xvZ19wYXJtLmdldF90aW1lX2NiKCk7CisgICAgbG9nX3F1ZXVlX21zZy0+bXNnX2xldmVsID0gREVWX0xPR19MRVZFTF9FUlJPUjsKKyAgICBsb2dfcXVldWVfbXNnLT51LmZtdF9hcmdzLmZtdCA9ICJMb2cgbWVzc2FnZSBwb29sIGV4aGF1c3RlZCwgZHJvcHBlZCBtZXNzYWdlIGNvdW50PSV1XG4iOworICAgIGxvZ19xdWV1ZV9tc2ctPnUuZm10X2FyZ3MuYXJnc1swXSA9IChjb25zdCB2b2lkICopKHVuc2lnbmVkIGxvbmcpKGRldl9sb2dfZHJvcC5kcm9wcyAtIGRldl9sb2dfZHJvcC5yZXBvcnRlZF9kcm9wcyk7CisgICAgbG9nX3F1ZXVlX21zZy0+dS5mbXRfYXJncy5hcmdzWzFdID0KKyAgICAgICAgbG9nX3F1ZXVlX21zZy0+dS5mbXRfYXJncy5hcmdzWzBdOyAvKiBhcmdzWzBdIG1heSBvciBtYXkgbm90IGJlIHNraXBwZWQgZGVwZW5kaW5nIG9uIGFsaWdubWVudCAqLworICAgIGxvZ19xdWV1ZV9tc2ctPmxvZ19pZCA9IChkZXZfbG9nX2lkX3Bhcm0gKilkZWZfbG9nX2lkOworICAgIGxvZ19xdWV1ZV9tc2ctPnRpbWVfc3RhbXAgPSBkZXZfbG9nLmRldl9sb2dfcGFybS5nZXRfdGltZV9jYigpOworICAgIGRldl9sb2dfZHJvcC5yZXBvcnRlZF9kcm9wcyA9IGRldl9sb2dfZHJvcC5kcm9wczsKKyAgICBkZXZfbG9nX2Ryb3AubGFzdF9yZXBvcnRfdGltZXN0YW1wID0gYmNtb3NfdGltZXN0YW1wKCk7CisKKyAgICBtc2ctPmRhdGEgPSBsb2dfcXVldWVfbXNnOworICAgIG1zZy0+c2l6ZSA9IHNpemVvZigqbG9nX3F1ZXVlX21zZyk7CisgICAgYmNtb3NfbXNnX3NlbmQoJmRldl9sb2cuc2F2ZV9xdWV1ZSwgbXNnLCAwKTsKK30KKwordm9pZCBiY21fZGV2X2xvZ19kcm9wX3JlcG9ydCh2b2lkKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBkZXZfbG9nX2Ryb3AuZHJvcHMrKzsKKworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jayk7CisgICAgLyogVGhlIDFzdCBkcm9wIHJlcG9ydCB3aWxsIGJlIGRvbmUgaW1tZWRpYXRlbHksIGJlY2F1c2UgYWx0aG91Z2ggREVWX0xPR19EUk9QX1JFUE9SVF9EUk9QX1RIUkVTSE9MRCBpc24ndCByZWFjaGVkLCB0aGUgdGltZSBkaWZmZXJlbmNlIGlzIGdyZWF0ZXIgdGhhbgorICAgICAqIERFVl9MT0dfRFJPUF9SRVBPUlRfUkFURV9VUy4gKi8KKyAgICBpZiAoZGV2X2xvZ19kcm9wLm1zZy5sb2NrIHx8CisgICAgICAgICgoZGV2X2xvZ19kcm9wLmRyb3BzIC0gZGV2X2xvZ19kcm9wLnJlcG9ydGVkX2Ryb3BzIDwgREVWX0xPR19EUk9QX1JFUE9SVF9EUk9QX1RIUkVTSE9MRCkgJiYKKyAgICAgICAgKGJjbW9zX3RpbWVzdGFtcCgpIC0gZGV2X2xvZ19kcm9wLmxhc3RfcmVwb3J0X3RpbWVzdGFtcCA8IERFVl9MT0dfRFJPUF9SRVBPUlRfUkFURV9VUykpKQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZkZXZfbG9nX2Ryb3AubXNnLmZhc3Rsb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZXZfbG9nX2Ryb3AubXNnLmxvY2sgPSBCQ01PU19UUlVFOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jaywgZmxhZ3MpOworCisgICAgLyogRG8gdGhlIGFjdHVhbCByZXBvcnQuICovCisgICAgX2JjbV9kZXZfbG9nX2Ryb3BfcmVwb3J0KCk7Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBiY21fZGV2X2xvZ19kcm9wX3RpbWVyX2NiKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmRldl9sb2dfZHJvcC5tc2cuZmFzdGxvY2spOworICAgIGlmIChkZXZfbG9nX2Ryb3AubXNnLmxvY2spCisgICAgeworICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmRldl9sb2dfZHJvcC5tc2cuZmFzdGxvY2ssIGZsYWdzKTsKKyAgICAgICAgLyogTG9nZ2VyIHRhc2sgaGFzbid0IHJlbGVhc2VkIHRoZSBsb2NrIHlldCAodGhlIGRyb3AgbWVzc2FnZSBoYXNuJ3QgYmVlbiByZXBvcnRlZCB5ZXQpIC0+IHJlc2NoZWR1bGUgdGhlIHRpbWVyLiAqLworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmZGV2X2xvZ19kcm9wLnRpbWVyLCBERVZfTE9HX0RST1BfUkVQT1JUX1JBVEVfVVMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZGV2X2xvZ19kcm9wLmRyb3BzID09IGRldl9sb2dfZHJvcC5yZXBvcnRlZF9kcm9wcykKKyAgICAgICAgeworICAgICAgICAgICAgLyogTm8gbmV3IGRyb3BzIHRvIHJlcG9ydC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworICAgICAgICB9CisgICAgICAgIGRldl9sb2dfZHJvcC5tc2cubG9jayA9IEJDTU9TX1RSVUU7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jaywgZmxhZ3MpOworCisgICAgICAgIC8qIERvIHRoZSBhY3R1YWwgcmVwb3J0LiAqLworICAgICAgICBfYmNtX2Rldl9sb2dfZHJvcF9yZXBvcnQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2luaXRfZGVmYXVsdF9sb2dnZXJfZXh0KAorICAgIGJjbV9kZXZfbG9nX3Bhcm0gKmRldl9sb2dfcGFybSwKKyAgICB1aW50MzJfdCBudW1fZmlsZXMsCisgICAgdWludDMyX3Qgc3RhY2tfc2l6ZSwKKyAgICBiY21vc190YXNrX3ByaW9yaXR5IHByaW9yaXR5LAorICAgIHVpbnQzMl90IHBvb2xfc2l6ZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb3NfdGFza19wYXJtIHNhdmVfdGFza19wYXJtID0gezB9OworICAgIGJjbW9zX3Rhc2tfcGFybSBwcmludF90YXNrX3Bhcm0gPSB7MH07CisgICAgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gcHJpbnRfcXVldWVfcGFybSA9IHswfTsKKyAgICBiY21vc19tc2dfcXVldWVfcGFybSBzYXZlX3F1ZXVlX3Bhcm0gPSB7MH07CisgICAgYmNtb3NfbXNnX3Bvb2xfcGFybSBwb29sX3Bhcm0gPSB7MH07CisgICAgYmNtb3NfdGltZXJfcGFybSB0aW1lcl9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGV2X2xvZ19kcm9wX3RpbWVyIiwKKyAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX05PTkUsIC8qIFdpbGwgYmUgY2FsbGVkIGluIElTUiBjb250ZXh0ICovCisgICAgICAgIC5oYW5kbGVyID0gYmNtX2Rldl9sb2dfZHJvcF90aW1lcl9jYiwKKyAgICB9OworCisgICAgaWYgKCFkZXZfbG9nX3Bhcm0pCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IGRldl9sb2dfcGFybSBtdXN0IGJlIHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgc2F2ZV90YXNrX3Bhcm0ucHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICBzYXZlX3Rhc2tfcGFybS5zdGFja19zaXplID0gc3RhY2tfc2l6ZTsKKyAgICBzYXZlX3Rhc2tfcGFybS5uYW1lID0gImRldl9sb2dfc2F2ZSI7CisgICAgc2F2ZV90YXNrX3Bhcm0uaGFuZGxlciA9IGRldl9sb2dfc2F2ZV90YXNrOworICAgIHNhdmVfdGFza19wYXJtLmRhdGEgPSAwOworCisgICAgcHJpbnRfdGFza19wYXJtLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcHJpbnRfdGFza19wYXJtLnN0YWNrX3NpemUgPSBzdGFja19zaXplOworICAgIHByaW50X3Rhc2tfcGFybS5uYW1lID0gImRldl9sb2dfcHJpbnQiOworICAgIHByaW50X3Rhc2tfcGFybS5oYW5kbGVyID0gZGV2X2xvZ19wcmludF90YXNrOworICAgIHByaW50X3Rhc2tfcGFybS5kYXRhID0gMDsKKworICAgIC8qIEl0IGlzIGltcG9ydGFudCB0byBhdm9pZCB0ZXJtaW5hdGluZyBsb2dnZXIgdGFzayBkdXJpbmcgYW4gZXhjZXB0aW9uLCBhcyBsb2dnZXIgdGFzayBpcyBsb3cgcHJpb3JpdHkgYW5kIG1pZ2h0IGhhdmUgYmFja2xvZyBvZiB1bmhhbmRsZWQgbWVzc2FnZXMuCisgICAgICogRXZlbiBpZiBhcyBhIHJlc3VsdCBvZiB0aGUgZXhjZXB0aW9uIHRoZSBsb2dnZXIgdGFzayB3aWxsIGJlIGluIGEgZGVhZGxvY2sgd2FpdGluZyBmb3IgYSByZXNvdXJjZSAoc2VtYXBob3JlL211dGV4L3RpbWVyKSwgaXQgaXMgaW4gbG93ZXIgcHJpb3JpdHkgdGhhbiBDTEkgYW5kIHRodXMgc2hvdWxkIG5vdCBibG9jaworICAgICAqIENMSS4gKi8KKyAgICBzYXZlX3Rhc2tfcGFybS5mbGFncyA9IEJDTU9TX1RBU0tfRkxBR19OT19TVVNQRU5EX09OX09PUFM7CisgICAgcHJpbnRfdGFza19wYXJtLmZsYWdzID0gQkNNT1NfVEFTS19GTEFHX05PX1NVU1BFTkRfT05fT09QUzsKKworICAgIHNhdmVfcXVldWVfcGFybS5uYW1lID0gImRldl9sb2dfc2F2ZSI7CisgICAgc2F2ZV9xdWV1ZV9wYXJtLnNpemUgPSAwOyAvKiB1bmxpbWl0ZWQgKi8KKyAgICBwcmludF9xdWV1ZV9wYXJtLm5hbWUgPSAiZGV2X2xvZ19wcmludCI7CisgICAgcHJpbnRfcXVldWVfcGFybS5zaXplID0gMDsgLyogdW5saW1pdGVkICovCisKKyAgICBwb29sX3Bhcm0ubmFtZSA9ICJkZXZfbG9nIjsKKyAgICBwb29sX3Bhcm0uc2l6ZSA9IHBvb2xfc2l6ZTsKKyAgICBwb29sX3Bhcm0uZGF0YV9zaXplID0gc2l6ZW9mKGRldl9sb2dfcXVldWVfbXNnKTsKKworICAgIGRlZl9sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcigiZGVmYXVsdCIsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIGVyciA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmZGV2X2xvZ19kcm9wLnRpbWVyLCAmdGltZXJfcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4oZXJyLCBlcnIsICJiY21vc190aW1lcl9jcmVhdGUiKTsKKyAgICBiY21vc19mYXN0bG9ja19pbml0KCZkZXZfbG9nX2Ryb3AubXNnLmZhc3Rsb2NrLCAwKTsKKworICAgIGlmICghZGV2X2xvZ19wYXJtLT5nZXRfdGltZV9jYikKKyAgICAgICAgZGV2X2xvZ19wYXJtLT5nZXRfdGltZV9jYiA9IGJjbW9zX3RpbWVzdGFtcDsKKworICAgIGVyciA9IGJjbV9kZXZfbG9nX2NyZWF0ZSgKKyAgICAgICAgZGV2X2xvZ19wYXJtLAorICAgICAgICAmc2F2ZV90YXNrX3Bhcm0sCisgICAgICAgICZwcmludF90YXNrX3Bhcm0sCisgICAgICAgICZzYXZlX3F1ZXVlX3Bhcm0sCisgICAgICAgICZwcmludF9xdWV1ZV9wYXJtLAorICAgICAgICAmcG9vbF9wYXJtKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4oZXJyLCBlcnIsICJiY21fZGV2X2xvZ19jcmVhdGUiKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcih2b2lkICoqc3RhcnRfYWRkcmVzc2VzLAorICAgIHVpbnQzMl90ICpzaXplcywKKyAgICBiY21fZGV2X2xvZ19maWxlX2ZsYWdzICpmbGFncywKKyAgICB1aW50MzJfdCBudW1fZmlsZXMsCisgICAgdWludDMyX3Qgc3RhY2tfc2l6ZSwKKyAgICBiY21vc190YXNrX3ByaW9yaXR5IHByaW9yaXR5LAorICAgIHVpbnQzMl90IHBvb2xfc2l6ZSkKK3sKKyAgICBiY21fZGV2X2xvZ19wYXJtIGRldl9sb2dfcGFybSA9IHswfTsKKyAgICB1aW50MzJfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9maWxlczsgaSsrKQorICAgIHsKKyAgICAgICAgZGV2X2xvZ19wYXJtLmxvZ19maWxlW2ldLnN0YXJ0X2FkZHIgPSBzdGFydF9hZGRyZXNzZXNbaV07CisgICAgICAgIGRldl9sb2dfcGFybS5sb2dfZmlsZVtpXS5zaXplID0gc2l6ZXNbaV07CisgICAgICAgIC8qIHNpemVbaV0gbWlnaHQgYmUgMCBpbiBzaW11bGF0aW9uIGJ1aWxkIGZvciBzcmFtIGJ1ZmZlci4gKi8KKyAgICAgICAgZGV2X2xvZ19wYXJtLmxvZ19maWxlW2ldLmZsYWdzID0gKHNpemVzW2ldID8gQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEIDogQkNNX0RFVl9MT0dfRklMRV9GTEFHX05PTkUpIHwKKyAgICAgICAgICAgIChmbGFncyA/IGZsYWdzW2ldIDogQkNNX0RFVl9MT0dfRklMRV9GTEFHX1dSQVBfQVJPVU5EKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcl9leHQoJmRldl9sb2dfcGFybSwgbnVtX2ZpbGVzLCBzdGFja19zaXplLCBwcmlvcml0eSwKKyAgICAgICAgcG9vbF9zaXplKTsKK30KKworbG9nX25hbWVfdGFibGUgbG9nc19uYW1lc1tERVZfTE9HX01BWF9JRFNdOwordWludDhfdCBsb2dfbmFtZV90YWJsZV9pbmRleCA9IDA7CisKK3N0YXRpYyB2b2lkIGRldl9sb2dfYWRkX2xvZ19uYW1lX3RvX3RhYmxlKGNvbnN0IGNoYXIgKnhpX25hbWUpCit7CisgICAgY2hhciBuYW1lW01BWF9ERVZfTE9HX0lEX05BTUUgKyAxXSA9IHt9OworICAgIGNoYXIgKnAgPSBuYW1lOworICAgIGNoYXIgKnBfZW5kOworICAgIGludCBpID0gMDsKKyAgICBsb25nIHZhbCA9IC0xOworCisgICAgc3RybmNweShuYW1lLCB4aV9uYW1lLCBNQVhfREVWX0xPR19JRF9OQU1FKTsKKyAgICB3aGlsZSAoKnApCisgICAgeworICAgICAgICAvKiBXaGlsZSB0aGVyZSBhcmUgbW9yZSBjaGFyYWN0ZXJzIHRvIHByb2Nlc3MuLi4gKi8KKyAgICAgICAgaWYgKGlzZGlnaXQoKnApKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBVcG9uIGZpbmRpbmcgYSBkaWdpdCwgLi4uICovCisgICAgICAgICAgICB2YWwgPSBzdHJ0b2wocCwgJnBfZW5kLCAxMCk7IC8qIFJlYWQgYSBudW1iZXIsIC4uLiAqLworICAgICAgICAgICAgaWYgKChuYW1lICsgc3RybGVuKG5hbWUpKSAhPSBwX2VuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IGRldl9sb2dfYWRkX2xvZ19uYW1lX3RvX3RhYmxlICVzKVxuIiwgeGlfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogT3RoZXJ3aXNlLCBtb3ZlIG9uIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4gKi8KKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nX25hbWVfdGFibGVfaW5kZXg7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgbG9nc19uYW1lc1tpXS5uYW1lKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsIDwgbG9nc19uYW1lc1tpXS5maXJzdF9pbnN0YW5jZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlID0gdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbCA+IGxvZ3NfbmFtZXNbaV0ubGFzdF9pbnN0YW5jZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dzX25hbWVzW2ldLmxhc3RfaW5zdGFuY2UgPSB2YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKGkgPT0gbG9nX25hbWVfdGFibGVfaW5kZXgpICYmIChpIDwgREVWX0xPR19NQVhfSURTKSkKKyAgICB7CisgICAgICAgIHN0cm5jcHkobG9nc19uYW1lc1tpXS5uYW1lLCBuYW1lLCBNQVhfREVWX0xPR19JRF9OQU1FKTsKKyAgICAgICAgaWYgKHZhbCA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsID0gTE9HX05BTUVfTk9fSU5TVEFOQ0U7CisgICAgICAgIH0KKyAgICAgICAgbG9nc19uYW1lc1tpXS5sYXN0X2luc3RhbmNlID0gdmFsOworICAgICAgICBsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlID0gdmFsOworICAgICAgICBsb2dfbmFtZV90YWJsZV9pbmRleCsrOworICAgIH0KK30KKwordm9pZCBkZXZfbG9nX2dldF9sb2dfbmFtZV90YWJsZShjaGFyICpidWZmZXIsIHVpbnQzMl90IGJ1Zl9sZW4pCit7CisgICAgdWludDMyX3QgaSA9IDA7CisgICAgdWludDMyX3QgYnVmX2xlbl9mcmVlICA9IGJ1Zl9sZW47CisKKyAgICBidWZmZXJbMF0gPSAnXDAnOworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dfbmFtZV90YWJsZV9pbmRleDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGxvZ3NfbmFtZXNbaV0uZmlyc3RfaW5zdGFuY2UgPT0gTE9HX05BTUVfTk9fSU5TVEFOQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKCZidWZmZXJbc3RybGVuKGJ1ZmZlcildLCBidWZfbGVuX2ZyZWUsICIlc1xuIiwgbG9nc19uYW1lc1tpXS5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKCZidWZmZXJbc3RybGVuKGJ1ZmZlcildLCBidWZfbGVuX2ZyZWUsICIlcyAlZCAtICVkXG4iLCBsb2dzX25hbWVzW2ldLm5hbWUsIGxvZ3NfbmFtZXNbaV0uZmlyc3RfaW5zdGFuY2UsIGxvZ3NfbmFtZXNbaV0ubGFzdF9pbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyW2J1Zl9sZW4gLSAxXSA9ICdcMCc7CisgICAgICAgIGJ1Zl9sZW5fZnJlZSA9IGJ1Zl9sZW4gLSBzdHJsZW4oYnVmZmVyKTsKKyAgICAgICAgaWYgKGJ1Zl9sZW5fZnJlZSA8PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IGRldl9sb2dfZ2V0X2xvZ19uYW1lX3RhYmxlIHRvbyBsb25nXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitkZXZfbG9nX2lkIGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKnhpX25hbWUsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfZGVmYXVsdF9sb2dfbGV2ZWwsCisgICAgYmNtX2Rldl9sb2dfaWRfdHlwZSB4aV9kZWZhdWx0X2xvZ190eXBlKQoreworICAgIGRldl9sb2dfaWRfcGFybSAqbmV3X2lkOworCisgICAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIHJvb20gZm9yIG9uZSBtb3JlIElEICovCisgICAgaWYgKGRldl9sb2cubnVtX2lkcyA9PSBCQ01fU0laRU9GQVJSQVkoZGV2X2xvZy5pZHMpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB3cm9uZyBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgcmV0dXJuIERFVl9MT0dfSU5WQUxJRF9JRDsKKyAgICB9CisKKyAgICAvKiBHZXQgbmV4dCBmcmVlIGxvZ19pZCBpbiBhcnJheSBhbmQgaW5jcmVtZW50IG5leHRfaWQuCisgICAgICogVGhlIG5ld19pZCBzdHJ1Y3R1cmUgaXMgY2xlYW4gYmVjYXVzZSB0aGUgd2hvbGUgZGV2X2xvZyBhcnJheSBpcyBpbiBCU1MKKyAgICAgKi8KKyAgICBuZXdfaWQgPSAmZGV2X2xvZy5pZHNbZGV2X2xvZy5udW1faWRzKytdOworCisgICAgLyogQWRkIHByZWZpeCBmb3Iga2VybmVsIGxvZ19pZHMgaW4gb3JkZXIgdG8gYXZvaWQgY2xhc2ggd2l0aCBzaW1pbGFybHktbmFtZXMgbG9ncyBpbiB0aGUgdXNlciBzcGFjZSAqLworI2lmZGVmIF9fS0VSTkVMX18KKyAgICBzdHJjcHkobmV3X2lkLT5uYW1lLCAia18iKTsKKyNlbmRpZgorCisgICAgLyogU2V0IGxvZ19pZCBwYXJhbWV0ZXJzICovCisgICAgc3RybmNhdChuZXdfaWQtPm5hbWUsIHhpX25hbWUsIHNpemVvZihuZXdfaWQtPm5hbWUpLXN0cmxlbihuZXdfaWQtPm5hbWUpKTsKKyAgICBuZXdfaWQtPm5hbWVbTUFYX0RFVl9MT0dfSURfTkFNRS0xXSA9ICdcMCc7CisKKyAgICBuZXdfaWQtPmRlZmF1bHRfbG9nX3R5cGUgID0geGlfZGVmYXVsdF9sb2dfdHlwZTsKKyAgICBuZXdfaWQtPmRlZmF1bHRfbG9nX2xldmVsID0geGlfZGVmYXVsdF9sb2dfbGV2ZWw7CisKKyAgICBkZXZfbG9nX2FkZF9sb2dfbmFtZV90b190YWJsZShuZXdfaWQtPm5hbWUpOworCisgICAgYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsc19hbmRfdHlwZV90b19kZWZhdWx0KChkZXZfbG9nX2lkKW5ld19pZCk7CisgICAgbmV3X2lkLT5zdHlsZSA9IEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTDsKKworICAgIHJldHVybiAoZGV2X2xvZ19pZCluZXdfaWQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX3NldF90eXBlKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX2lkX3R5cGUgeGlfbG9nX3R5cGUpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKworICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIEluIGxpbnV4IGtlcm5lbCB3ZSBvbmx5IHN1cHBvcnQgc2F2ZSAqLworI2lmZGVmIF9fS0VSTkVMX18KKyAgICBpZiAoeGlfbG9nX3R5cGUgJiBERVZfTE9HX0lEX1RZUEVfQk9USCkKKyAgICAgICAgeGlfbG9nX3R5cGUgPSBERVZfTE9HX0lEX1RZUEVfU0FWRTsKKyNlbmRpZgorCisgICAgREVWX0xPR19JTkZPX1BSSU5URigiSUQ6IDB4JWx4LCBOZXcgbG9nIHR5cGU6ICVkXG4iLCB4aV9pZCwgKGludCl4aV9sb2dfdHlwZSk7CisKKyAgICBpZC0+bG9nX3R5cGUgPSB4aV9sb2dfdHlwZTsKKworICAgIC8qIEluIGxpbnV4IHVzZXIgc3BhY2Ugd2UgbmVlZCB0byBub3RpZnkga2VybmVsIGludGVncmF0aW9uIGNvZGUgKi8KKyNpZiBkZWZpbmVkKExJTlVYX0tFUk5FTF9TUEFDRSkgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKyAgICBiY21fZGV2X2xvZ19saW51eF9pZF9zZXRfdHlwZSh4aV9pZCwgeGlfbG9nX3R5cGUpOworI2VuZGlmCisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbF9wcmludCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsX3NhdmUpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKworICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGlmICgoeGlfbG9nX2xldmVsX3ByaW50ID49IERFVl9MT0dfTEVWRUxfTlVNX09GKSB8fCAoeGlfbG9nX2xldmVsX3NhdmUgPj0gREVWX0xPR19MRVZFTF9OVU1fT0YpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB3cm9uZyBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBERVZfTE9HX0lORk9fUFJJTlRGKCJJRDogMHglcCwgTmV3OiB4aV9sb2dfbGV2ZWxfcHJpbnQ9JXUsIHhpX2xvZ19sZXZlbF9zYXZlPSV1XG4iLAorICAgICAgICAodm9pZCAqKWlkLAorICAgICAgICB4aV9sb2dfbGV2ZWxfcHJpbnQsCisgICAgICAgIHhpX2xvZ19sZXZlbF9zYXZlKTsKKworICAgIGlkLT5sb2dfbGV2ZWxfcHJpbnQgPSB4aV9sb2dfbGV2ZWxfcHJpbnQ7CisgICAgaWQtPmxvZ19sZXZlbF9zYXZlID0geGlfbG9nX2xldmVsX3NhdmU7CisKKyAgICAvKiBJbiBsaW51eCB1c2VyIHNwYWNlIHdlIG5lZWQgdG8gbm90aWZ5IGtlcm5lbCBpbnRlZ3JhdGlvbiBjb2RlICovCisjaWYgZGVmaW5lZChMSU5VWF9LRVJORUxfU1BBQ0UpICYmICFkZWZpbmVkKF9fS0VSTkVMX18pCisgICAgYmNtX2Rldl9sb2dfbGludXhfaWRfc2V0X2xldmVsKHhpX2lkLCB4aV9sb2dfbGV2ZWxfcHJpbnQsIHhpX2xvZ19sZXZlbF9zYXZlKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbHNfYW5kX3R5cGVfdG9fZGVmYXVsdChkZXZfbG9nX2lkIHhpX2lkKQoreworICAgIGRldl9sb2dfaWRfcGFybSAqaWQgPSAoZGV2X2xvZ19pZF9wYXJtICopeGlfaWQ7CisKKyAgICBpZiAoIXhpX2lkIHx8ICh4aV9pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB4aV9pZCBub3QgdmFsaWQgKDB4JXgpXG4iLCAodW5zaWduZWQgaW50KXhpX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBpZC0+bG9nX2xldmVsX3ByaW50ID0gaWQtPmRlZmF1bHRfbG9nX2xldmVsOworICAgIGlkLT5sb2dfbGV2ZWxfc2F2ZSA9IGlkLT5kZWZhdWx0X2xvZ19sZXZlbDsKKyAgICBpZC0+bG9nX3R5cGUgPSBpZC0+ZGVmYXVsdF9sb2dfdHlwZTsKKworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKyAgICBtZW1zZXQoJmlkLT50aHJvdHRsZSwwLCBzaXplb2YoZGV2X2xvZ19pZF90aHJvdHRsZSkpOworICAgIG1lbXNldCgmaWQtPnRyaWdnZXIsIDAsIHNpemVvZihkZXZfbG9nX2lkX3RyaWdnZXIpKTsKKyAgICBpZC0+dGhyb3R0bGVfbG9nX2xldmVsID0gREVWX0xPR19MRVZFTF9OT19MT0c7CisgICAgaWQtPnRyaWdnZXJfbG9nX2xldmVsID0gREVWX0xPR19MRVZFTF9OT19MT0c7CisjZW5kaWYKKworICAgIC8qIEluIGxpbnV4IGtlcm5lbCBzcGFjZSB3ZSBkb24ndCBzdXBwb3J0IFBSSU5ULCBvbmx5IFNBVkUgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisgICAgaWYgKGlkLT5sb2dfdHlwZSAmIERFVl9MT0dfSURfVFlQRV9CT1RIKQorICAgICAgICBpZC0+bG9nX3R5cGUgPSBERVZfTE9HX0lEX1RZUEVfU0FWRTsKKyNlbmRpZgorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfbGV2ZWxfc2V0X3N0eWxlKGJjbV9kZXZfbG9nX2xldmVsIGxldmVsLCBiY21fZGV2X2xvZ19zdHlsZSB4aV9zdHlsZSkKK3sKKyAgICBkZXZfbG9nX2xldmVsMnN0eWxlW2xldmVsXSA9IHhpX3N0eWxlOworfQorCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXRfc3R5bGUoZGV2X2xvZ19pZCB4aV9pZCwgYmNtX2Rldl9sb2dfc3R5bGUgeGlfc3R5bGUpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKworICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBpZC0+c3R5bGUgPSB4aV9zdHlsZTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfY2xlYXJfY291bnRlcnMoZGV2X2xvZ19pZCB4aV9pZCkKK3sKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmlkID0gKGRldl9sb2dfaWRfcGFybSAqKXhpX2lkOworCisgICAgaWYgKCF4aV9pZCB8fCAoeGlfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogeGlfaWQgbm90IHZhbGlkICgweCV4KVxuIiwgKHVuc2lnbmVkIGludCl4aV9pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIG1lbXNldChpZC0+Y291bnRlcnMsIDAsIHNpemVvZihpZC0+Y291bnRlcnMpKTsKKyAgICBpZC0+bG9zdF9tc2dfY250ID0gMDsKKyAgICBpZC0+cHJpbnRfc2tpcHBlZF9jb3VudCA9IDA7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfZ2V0KGRldl9sb2dfaWQgeGlfaWQsIGRldl9sb2dfaWRfcGFybSAqeG9faWQpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKworICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgICp4b19pZCA9ICppZDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXQoZGV2X2xvZ19pZCB4aV9pZCwgZGV2X2xvZ19pZF9wYXJtICpwYXJtcykKK3sKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmlkID0gKGRldl9sb2dfaWRfcGFybSAqKXhpX2lkOworCisgICAgaWYgKCF4aV9pZCB8fCAoeGlfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogeGlfaWQgbm90IHZhbGlkICgweCV4KVxuIiwgKHVuc2lnbmVkIGludCl4aV9pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgKmlkID0gKnBhcm1zOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2Rldl9sb2dfaWQgYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHVpbnQzMl90IHhpX2luZGV4KQoreworICAgIGlmICh4aV9pbmRleCA+PSBkZXZfbG9nLm51bV9pZHMpCisgICAgeworICAgICAgICByZXR1cm4gREVWX0xPR19JTlZBTElEX0lEOworICAgIH0KKyAgICByZXR1cm4gKGRldl9sb2dfaWQpJihkZXZfbG9nLmlkc1t4aV9pbmRleF0pOworfQorCit1aW50MzJfdCBiY21fZGV2X2xvZ19nZXRfaW5kZXhfYnlfaWQoZGV2X2xvZ19pZCB4aV9pZCkKK3sKKyAgICB1aW50MzJfdCBpZHggPSAoZGV2X2xvZ19pZF9wYXJtICopeGlfaWQgLSAmZGV2X2xvZy5pZHNbMF07CisgICAgaWYgKGlkeCA+PSBkZXZfbG9nLm51bV9pZHMpCisgICAgICAgIGlkeCA9IERFVl9MT0dfSU5WQUxJRF9JTkRFWDsKKyAgICByZXR1cm4gaWR4OworfQorCitkZXZfbG9nX2lkIGJjbV9kZXZfbG9nX2lkX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIgKnhpX25hbWUpCit7CisgICAgdWludDMyX3QgaTsKKworICAgIGlmICh4aV9uYW1lID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gREVWX0xPR19JTlZBTElEX0lEOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGk8ZGV2X2xvZy5udW1faWRzOyBpKyspCisgICAgeworICAgICAgICBpZiAoIXN0cmNtcChkZXZfbG9nLmlkc1tpXS5uYW1lLCB4aV9uYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChkZXZfbG9nX2lkKSYoZGV2X2xvZy5pZHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBjYW4ndCBmaW5kIG5hbWVcbiIpOworICAgIHJldHVybiBERVZfTE9HX0lOVkFMSURfSUQ7Cit9CisKK3VpbnQzMl90IGJjbV9kZXZfbG9nX2dldF9udW1fb2ZfZW50cmllcyh2b2lkKQoreworICAgIHJldHVybiBkZXZfbG9nLm51bV9pZHM7Cit9CisKK2JjbW9zX2Jvb2wgYmNtX2Rldl9sb2dfZ2V0X2NvbnRyb2wodm9pZCkKK3sKKyAgICByZXR1cm4gZGV2X2xvZy5zdGF0ZSA9PSBCQ01fREVWX0xPR19TVEFURV9FTkFCTEVEOworfQorCit1aW50MzJfdCBiY21fZGV2X2xvZ19nZXRfbnVtX29mX21lc3NhZ2VzKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgcmV0dXJuIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIubnVtX21zZ3M7Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X2NvbnRyb2woYmNtb3NfYm9vbCBjb250cm9sKQoreworICAgIGlmIChjb250cm9sICYmIGRldl9sb2cuc3RhdGUgPT0gQkNNX0RFVl9MT0dfU1RBVEVfRElTQUJMRUQpCisgICAgICAgIGRldl9sb2cuc3RhdGUgPSBCQ01fREVWX0xPR19TVEFURV9FTkFCTEVEOworICAgIGVsc2UgaWYgKCFjb250cm9sICYmIGRldl9sb2cuc3RhdGUgPT0gQkNNX0RFVl9MT0dfU1RBVEVfRU5BQkxFRCkKKyAgICAgICAgZGV2X2xvZy5zdGF0ZSA9IEJDTV9ERVZfTE9HX1NUQVRFX0RJU0FCTEVEOworfQorCitiY21fZGV2X2xvZ19maWxlX2ZsYWdzIGJjbV9kZXZfbG9nX2dldF9maWxlX2ZsYWdzKHVpbnQzMl90IGZpbGVfaWQpCit7CisgICAgcmV0dXJuIGRldl9sb2cuZmlsZXNbZmlsZV9pZF0uZmlsZV9wYXJtLmZsYWdzOworfQorCit2b2lkIGJjbV9kZXZfbG9nX3NldF9maWxlX2ZsYWdzKHVpbnQzMl90IGZpbGVfaWQsIGJjbV9kZXZfbG9nX2ZpbGVfZmxhZ3MgZmxhZ3MpCit7CisgICAgZGV2X2xvZy5maWxlc1tmaWxlX2lkXS5maWxlX3Bhcm0uZmxhZ3MgPSBmbGFnczsKK30KKworYmNtX2Rldl9sb2dfZmxhZ3MgYmNtX2Rldl9sb2dfZ2V0X2ZsYWdzKHZvaWQpCit7CisgICAgcmV0dXJuIGRldl9sb2cuZmxhZ3M7Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X2ZsYWdzKGJjbV9kZXZfbG9nX2ZsYWdzIGZsYWdzKQoreworICAgIGRldl9sb2cuZmxhZ3MgPSBmbGFnczsKK30KKwordm9pZCBiY21fZGV2X2xvZ19zZXRfcHJpbnRfY2IoYmNtX2Rldl9sb2dfcHJpbnRfY2IgY2IpCit7CisgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2IgPSBjYjsKK30KKwordm9pZCBiY21fZGV2X2xvZ19zZXRfZ2V0X3RpbWVfY2IoYmNtX2Rldl9sb2dfZ2V0X3RpbWVfY2IgY2IpCit7CisgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0uZ2V0X3RpbWVfY2IgPSBjYjsKK30KKwordm9pZCBiY21fZGV2X2xvZ19zZXRfdGltZV90b19zdHJfY2IoYmNtX2Rldl9sb2dfdGltZV90b19zdHJfY2IgY2IpCit7CisgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0udGltZV90b19zdHJfY2IgPSBjYjsKK30KKworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogTmFtZTogYmNtX2Rldl9sb2dfc2V0X3Rocm90dGxlCQkJCQkJCQkJCQkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogQWJzdHJhY3Q6IFNldCB0aHJvdHRsZSBsZXZlbCBmb3IgdGhlIHNwZWNpZmljIGxvZyBpcyBhbmQgaXRzIGxldmVsCQkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogQXJndW1lbnRzOgkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qICAgLSB4aV9pZAkJLSBUaGUgSUQgaW4gdGhlIERldiBsb2cgKHdoYXQgd2UgZ290IGZvcm0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIpCQkqLworLyogICAtIHhpX2xvZ19sZXZlbAktIGxvZyBsZXZlbAkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX3Rocm90dGxlCS0gdGhyb3R0bGUgbnVtYmVyLCAwIC0gbm8gdGhyb3R0bGUJCQkJCQkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogUmV0dXJuIFZhbHVlOgkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19zZXRfdGhyb3R0bGUoZGV2X2xvZ19pZCB4aV9pZCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLCB1aW50MzJfdCB4aV90aHJvdHRsZSkKK3sKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmlkID0gKGRldl9sb2dfaWRfcGFybSAqKXhpX2lkOworCisgICAgaWYgKCF4aV9pZCB8fCAoeGlfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogeGlfaWQgbm90IHZhbGlkICgweCV4KVxuIiwgKHVuc2lnbmVkIGludCl4aV9pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGlkLT50aHJvdHRsZV9sb2dfbGV2ZWwgPSB4aV9sb2dfbGV2ZWw7CisgICAgaWQtPnRocm90dGxlLnRocmVzaG9sZCA9IHhpX3Rocm90dGxlOworICAgIGlkLT50aHJvdHRsZS5jb3VudGVyID0gMDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX3NldF90cmlnZ2VyCQkJCQkJCQkJCQkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogQWJzdHJhY3Q6IFNldCB0cmlnZ2VyIGNvdW50ZXJzIGZvciB0aGUgc3BlY2lmaWMgbG9nIGlzIGFuZCBpdHMgbGV2ZWwJCQkJCQkqLworLyoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisvKiBBcmd1bWVudHM6CQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogICAtIHhpX2lkCQktIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikJCSovCisvKiAgIC0geGlfbG9nX2xldmVsCS0gbG9nIGxldmVsCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgCSovCisvKiAgIC0geGlfc3RhcnQgCS0gc3RhcnQgcHJpbnRpbmcgYWZ0ZXIgdGhpcyBudW1iZXIsIDAgLSBubyB0cmlnZ2VyCQkJCQkJKi8KKy8qICAgLSB4aV9zdG9wICAgCS0gc3RvcCBwcmludGluZyBhZnRlciB0aGlzIG51bWJlciwgIDAgLSBkbyBub3Qgc3RvcAkJCQkJCSovCisvKiAgIC0geGlfcmVwZWF0IAktIHN0YXJ0IHByaW50aW5nIGFmdGVyIHRoaXMgbnVtYmVyLCAwIC0gbm8gcmVwZWF0LCAtMSBhbHdheXMJCQkqLworLyoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisvKiBSZXR1cm4gVmFsdWU6CQkJCQkJCQkJCQkJCQkJCQkJCSovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX3NldF90cmlnZ2VyKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCwgdWludDMyX3QgeGlfc3RhcnQsIHVpbnQzMl90IHhpX3N0b3AsIGludDMyX3QgeGlfcmVwZWF0KQoreworICAgIGRldl9sb2dfaWRfcGFybSAqaWQgPSAoZGV2X2xvZ19pZF9wYXJtICopeGlfaWQ7CisKKyAgICBpZiAoIXhpX2lkIHx8ICh4aV9pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB4aV9pZCBub3QgdmFsaWQgKDB4JXgpXG4iLCAodW5zaWduZWQgaW50KXhpX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWQtPnRyaWdnZXJfbG9nX2xldmVsID0geGlfbG9nX2xldmVsOworICAgIGlkLT50cmlnZ2VyLnN0YXJ0X3RocmVzaG9sZCA9IHhpX3N0YXJ0OworICAgIGlkLT50cmlnZ2VyLnN0b3BfdGhyZXNob2xkID0geGlfc3RvcDsKKyAgICBpZC0+dHJpZ2dlci5yZXBlYXRfdGhyZXNob2xkID0geGlfcmVwZWF0OworICAgIGlkLT50cmlnZ2VyLmNvdW50ZXIgPSAwOworICAgIGlkLT50cmlnZ2VyLnJlcGVhdCA9IDA7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZiAvKiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFICovCisKKy8qIEdldCBmaWxlIGluZm86IG1heCBkYXRhIHNpemUsIHVzZWQgYnl0ZXMgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2dldF9maWxlX2luZm8oYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3QgKmZpbGVfc2l6ZSwgdWludDMyX3QgKnVzZWRfYnl0ZXMpCit7CisgICAgaWYgKCFmaWxlIHx8ICFmaWxlX3NpemUgfHwgIXVzZWRfYnl0ZXMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgLyogT25seSBzdXBwb3J0ZWQgZm9yIG1lbW9yeSBmaWxlcyAqLworICAgIGlmICghYmNtX2Rldl9sb2dfaXNfbWVtb3J5X2ZpbGUoZmlsZSkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgKmZpbGVfc2l6ZSA9IGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplOworICAgICp1c2VkX2J5dGVzID0gKGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZmlsZV93cmFwX2NudCB8fCBmaWxlLT5pc19mdWxsKSA/CisgICAgICAgIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplIDogZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQ7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFJlZ2lzdGVyIGluZGljYXRpb24gdG8gYmUgc2VudCB3aGVuIGZpbGUgdXRpbGl6YXRpb24gY3Jvc3NlcyB0aHJlc2hvbGQgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2FsbW9zdF9mdWxsX2luZF9yZWdpc3RlcihiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCB1c2VkX2J5dGVzX3RocmVzaG9sZCwKKyAgICBGX2Rldl9sb2dfZmlsZV9hbG1vc3RfZnVsbCBzZW5kX2luZF9jYiwgbG9uZyBpbmRfY2JfcHJpdikKK3sKKyAgICBpZiAoIWZpbGUgfHwgKHVzZWRfYnl0ZXNfdGhyZXNob2xkICYmICFzZW5kX2luZF9jYikpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgLyogT25seSBzdXBwb3J0ZWQgZm9yIG1lbW9yeSBmaWxlcyAqLworICAgIGlmICghYmNtX2Rldl9sb2dfaXNfbWVtb3J5X2ZpbGUoZmlsZSkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKyAgICBmaWxlLT5hbG1vc3RfZnVsbC50aHJlc2hvbGQgPSB1c2VkX2J5dGVzX3RocmVzaG9sZDsKKyAgICBmaWxlLT5hbG1vc3RfZnVsbC5zZW5kX2luZF9jYiA9IHNlbmRfaW5kX2NiOworICAgIGZpbGUtPmFsbW9zdF9mdWxsLnByaXYgPSBpbmRfY2JfcHJpdjsKKyAgICBmaWxlLT5hbG1vc3RfZnVsbC5pbmRfc2VudCA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX211dGV4X3VubG9jaygmZmlsZS0+dS5tZW1fZmlsZS5tdXRleCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2VuZGlmIC8qIEVOQUJMRV9MT0cgKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2suaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdiYjEyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFzay5oCkBAIC0wLDAgKzEsNjUxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9fQkNNX0RFVl9MT0dfVEFTS19IXworI2RlZmluZSBfX0JDTV9ERVZfTE9HX1RBU0tfSF8KKworLyogQmVjYXVzZSB3ZSBjYXN0IGZyb20gZGV2X2xvZ19pZCB0byBwb2ludGVyIHR5cGUgaW4gYmNtX2Rldl9sb2cuYywgd2Ugd2FudCBpdCB0byBiZSB0aGUgc2FtZSBzaXplIGFzIGEgcG9pbnRlciBzaXplIChlLmc6ICJ0eXBlZGVmIHVpbnQzMl90IGRldl9sb2dfaWQiIHdvbid0IHdvcmsKKyAqIG9uIDY0Yml0IHBsYXRmb3JtKS4gKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkZXZfbG9nX2lkOworCisjZGVmaW5lIERFVl9MT0dfSU5WQUxJRF9JRCAgICAgICAgICAgICAgKGRldl9sb2dfaWQpVUlOVF9NQVgKKworI2lmZGVmIEVOQUJMRV9MT0cKKworLyogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBlbmFibGUgaW5mbyBwcmludHMgZm9yIGRldl9sb2cgZGVidWdnaW5nICovCisvKiAjZGVmaW5lIERFVl9MT0dfREVCVUcgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBMb2cgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlZmluZXMvVHlwZWRlZnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTVFJJTkdJRlkoeCkgI3gKKyNkZWZpbmUgU1RSSU5HSUZZX0VYUEFORChzdHIpIFNUUklOR0lGWShzdHIpCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIERFVl9MT0dfUFJJTlRGIHByaW50aworI2RlZmluZSBERVZfTE9HX1ZQUklOVEYgdnByaW50aworI2Vsc2UKKyNkZWZpbmUgREVWX0xPR19QUklOVEYgYmNtb3NfcHJpbnRmCisjZGVmaW5lIERFVl9MT0dfVlBSSU5URiBiY21vc192cHJpbnRmCisjZW5kaWYKKworI2lmZGVmIERFVl9MT0dfREVCVUcKKyNkZWZpbmUgREVWX0xPR19JTkZPX1BSSU5URihmbXQsIGFyZ3MuLi4pIERFVl9MT0dfUFJJTlRGKCIoJXM6IiBTVFJJTkdJRllfRVhQQU5EKF9fTElORV9fKSAiKSAiIGZtdCwgX19GVU5DVElPTl9fLCAjI2FyZ3MpCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRldl9sb2dfaW5mb19wcmludGZfaWdub3JlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7IH0KKyNkZWZpbmUgREVWX0xPR19JTkZPX1BSSU5URihmbXQsIGFyZ3MuLi4pIGRldl9sb2dfaW5mb19wcmludGZfaWdub3JlKGZtdCwgIyNhcmdzKQorI2VuZGlmCisjZGVmaW5lIERFVl9MT0dfRVJST1JfUFJJTlRGKGZtdCwgYXJncy4uLikgREVWX0xPR19QUklOVEYoIiglczoiIFNUUklOR0lGWV9FWFBBTkQoX19MSU5FX18pICIpICIgZm10LCBfX0ZVTkNUSU9OX18sICMjYXJncykKKworLyogSU1QT1JUQU5UISB3aGVuIG1vZGlmeWluZyBERVZfTE9HX01BWF9BUkdTLAorICogZG9uJ3QgZm9yZ2V0IHRvIGFkZC9yZW1vdmUgX0JDTV9MT0dfQVJHUy4uLiBtYWNyb3MgaW4gb3JkZXIgdG8gZm9yY2UgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBjb21waWxlIHRpbWUKKyAqLworI2RlZmluZSBERVZfTE9HX01BWF9BUkdTICAgICAgICAgICAgICAgIDM2CisvKiBTdHJpbmcgYmlnZ2VyIHRoYW4gdGhpcyBzaXplIHdpbGwgYmUgY3V0ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYX0RFVl9MT0dfSURfTkFNRSAgICAgICAgICAgICAzMiAgLyogTWF4aW11bSBzaXplIG9mIGxvZ19pZCBuYW1lICovCisjZGVmaW5lIERFVl9MT0dfTUFYX0lEUyAgICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIERFVl9MT0dfTUFYX0ZJTEVTICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfREVWX0xPR19TVFJJTkdfU0laRSAgICAgICAgIDI1NiAvKiBOb3RlIHRoYXQgdGhpcyBzaXplIGluY2x1ZGVzIGhlYWRlci4gKi8KKyNkZWZpbmUgTUFYX0RFVl9MT0dfSEVBREVSX1NJWkUgICAgICAgICAoNyArIDE2ICsgMjApIC8qICh0aW1lPTE2LCBJRD0yMCwgZGVsaW1pdGVycz03KSAqLworI2RlZmluZSBNQVhfREVWX0xPR19TVFJJTkdfTkVUX1NJWkUgICAgIChNQVhfREVWX0xPR19TVFJJTkdfU0laRSAtIE1BWF9ERVZfTE9HX0hFQURFUl9TSVpFKQorI2RlZmluZSBERVZfTE9HX0lOVkFMSURfSU5ERVggICAgICAgICAgIFVJTlRfTUFYCisjZGVmaW5lIERFVl9MT0dfRFJPUF9SRVBPUlRfUkFURV9VUyAgICAgMTAwMDAwMCAvKiAxIHNlY29uZCAqLworI2RlZmluZSBERVZfTE9HX0RST1BfUkVQT1JUX0RST1BfVEhSRVNIT0xEIDEwMDAKKyNkZWZpbmUgREVWX0xPR19FTkRJQU4gICAgICAgICAgICAgICAgICBCQ01PU19FTkRJQU5fTElUVExFCisKKy8qIElmIHRoZSBsb2cgbWVzc2FnZSBwb29sIHV0aWxpemF0aW9uIGlzID49IHRoaXMgcGVyY2VudGFnZSwgZG8gbm90IHByaW50IG1lc3NhZ2VzIChvbmx5IHNhdmUgdGhlbSkuCisgKiAobm90ZSB0aGF0IGVycm9yL2ZhdGFsIG1lc3NhZ2VzIHdpbGwgbm90IG9iamV5IHRoaXMgcnVsZSkuICovCisjZGVmaW5lIERFVl9MT0dfU0tJUF9QUklOVF9USFJFU0hPTERfUEVSQ0VOVCA1MAorCisvKiBJZiB0aGUgbG9nIG1lc3NhZ2UgcG9vbCB1dGlsaXphdGlvbiBpcyA+PSB0aGlzIHBlcmNlbnRhZ2UsIGRyb3AgYWxsIG1lc3NhZ2VzIHRoYXQgYXJlbid0ICdlcnJvcicgb3IgJ2ZhdGFsJyBsZXZlbC4gKi8KKyNkZWZpbmUgREVWX0xPR19FUlJPUl9PTkxZX1RIUkVTSE9MRF9QRVJDRU5UIDc1CisKKy8qIExvZyBsZXZlbCBlbnVtICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBERVZfTE9HX0xFVkVMX05PX0xPRyA9IDAsCisgICAgREVWX0xPR19MRVZFTF9GQVRBTCwKKyAgICBERVZfTE9HX0xFVkVMX0VSUk9SLAorICAgIERFVl9MT0dfTEVWRUxfV0FSTklORywKKyAgICBERVZfTE9HX0xFVkVMX0lORk8sCisgICAgREVWX0xPR19MRVZFTF9ERUJVRywKKworICAgIERFVl9MT0dfTEVWRUxfTlVNX09GCit9IGJjbV9kZXZfbG9nX2xldmVsOworCisvKiBMb2cgdHlwZSBlbnVtICovCit0eXBlZGVmIGVudW0KK3sKKyAgICAvKiBCaXRbMF0gLSBQcmludCBFbmFibGUsIEJpdFsxXSAtIFNhdmUgRW5hYmxlICovCisgICAgREVWX0xPR19JRF9UWVBFX05PTkUgPSAwLCAgICAgICAvKiBOTyBTQVZFLCBOTyBQUklOVCovCisgICAgREVWX0xPR19JRF9UWVBFX1BSSU5UID0gMSwKKyAgICBERVZfTE9HX0lEX1RZUEVfU0FWRSA9IDEgPDwgMSwKKyAgICBERVZfTE9HX0lEX1RZUEVfQk9USCA9IERFVl9MT0dfSURfVFlQRV9QUklOVCB8IERFVl9MT0dfSURfVFlQRV9TQVZFLCAvKiBTQVZFICYgUFJJTlQgKi8KK30gYmNtX2Rldl9sb2dfaWRfdHlwZTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX0RFVl9MT0dfRkxBR19OT05FID0gMCwKKworICAgIC8qIEV2ZW4gaWYgbG9nZ2VyIGlzIGRpc2FibGVkLCBCQ01fTE9HKCkgY2FsbHMgYXJlIHJlZGlyZWN0ZWQgdG8gYmNtb3NfcHJpbnRmKCkuICovCisgICAgQkNNX0RFVl9MT0dfRkxBR19ESVNBQkxFRF9XSVRIX1BSSU5URiA9IDEgPDwgMCwKKworICAgIC8qIFdoZW4gYmNtX2Rldl9sb2dfZGVzdHJveSgpIGlzIGNhbGxlZCwgZG8gbm90IHdhaXQgZm9yIG91dHN0YW5kaW5nIGxvZyBtZXNzYWdlcyB0byBiZSBkcmFpbmVkLiBEaXNjYXJkIHRoZQorICAgICAqIG1lc3NhZ2VzIGFuZCBkZXN0cm95IHRoZSB0YXNrIGltbWVkaWF0ZWx5LiAqLworICAgIEJDTV9ERVZfTE9HX0ZMQUdfREVTVFJPWV9JTU1FRElBVEVMWSA9IDEgPDwgMSwKK30gYmNtX2Rldl9sb2dfZmxhZ3M7CisKK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19OT05FID0gMCwKKyAgICBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQgPSAxLCAvKio8IGZpbGUgaXMgdmFsaWQgKi8KKyAgICBCQ01fREVWX0xPR19GSUxFX0ZMQUdfV1JBUF9BUk9VTkQgPSAxIDw8IDEsIC8qKjwgbmV3IG1lc3NhZ2VzIHdpbGwgb3ZlcnJpZGUgb2xkICovCisgICAgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1NUT1BfV0hFTl9GVUxMID0gMSA8PCAyLCAvKio8IHN0b3AgbG9nZ2luZyBpZiB0aGUgZmlsZSBpcyBmdWxsICovCisgICAgQkNNX0RFVl9MT0dfRklMRV9GTEFHX0NMRUFSX0FGVEVSX1JFQUQgPSAxIDw8IDQsIC8qKjwgYXV0by1jbGVhciBsb2cgd2hlbiBpdCBpcyBmdWxseSByZWFkICovCit9IGJjbV9kZXZfbG9nX2ZpbGVfZmxhZ3M7CisKK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCwKKyAgICBCQ01fREVWX0xPR19TVFlMRV9CT0xELAorICAgIEJDTV9ERVZfTE9HX1NUWUxFX1VOREVSTElORSwKKyAgICBCQ01fREVWX0xPR19TVFlMRV9CTElOSywKKyAgICBCQ01fREVWX0xPR19TVFlMRV9SRVZFUlNFX1ZJREVPLAorfSBiY21fZGV2X2xvZ19zdHlsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ2FsbGJhY2tzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZhdWx0IGxvZ2dlciBJRCAqLworZXh0ZXJuIGRldl9sb2dfaWQgZGVmX2xvZ19pZDsKKworLyogTG9nIGZpbGUgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX0RFVl9MT0dfRklMRV9NRU1PUlksICAgIC8qKjwgTWVtb3J5IGZpbGUgKi8KKyNpZmRlZiBCQ01fT1NfUE9TSVgKKyAgICBCQ01fREVWX0xPR19GSUxFX1JFR1VMQVIsICAgLyoqPCBSZWd1bGFyIGZpbGUgKi8KKyNlbmRpZgorI2lmZGVmIERFVl9MT0dfU1lTTE9HCisgICAgQkNNX0RFVl9MT0dfRklMRV9TWVNMT0csICAgIC8qKjwgc3lzbG9nICJmaWxlIiAqLworI2VuZGlmCisgICAgQkNNX0RFVl9MT0dfRklMRV9VREVGICAgICAgIC8qKjwgVXNlci1kZWZpbmVkIGZpbGUgKi8KK30gYmNtX2Rldl9sb2dfZmlsZV90eXBlOworCit0eXBlZGVmIHN0cnVjdCBiY21fZGV2X2xvZ19maWxlX3Bhcm0gYmNtX2Rldl9sb2dfZmlsZV9wYXJtOwordHlwZWRlZiBzdHJ1Y3QgYmNtX2Rldl9sb2dfZmlsZSBiY21fZGV2X2xvZ19maWxlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE9QRU4gQ0FMTEJBQ0s6IG9wZW4gbWVtb3J5L2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZV9wYXJtIC0gZmlsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmaWxlICAgICAgLSBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbV9kZXZfbG9nX2ZpbGVfb3Blbl9jYikoY29uc3QgYmNtX2Rldl9sb2dfZmlsZV9wYXJtICpmaWxlX3Bhcm0sIGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENMT1NFIENBTExCQUNLOiBjbG9zZSBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmaWxlICAgICAgLSBmaWxlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbV9kZXZfbG9nX2ZpbGVfY2xvc2VfY2IpKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJFV0lORCBDQUxMQkFDSzogY2xlYXJzIG1lbW9yeS9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZSAgICAgIC0gZmlsZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgYmNtb3NfZXJybm8gKCpiY21fZGV2X2xvZ19maWxlX3Jld2luZF9jYikoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUkVBRF9DQUxMQkFDSzogcmVhZCBmb3JtIG1lbW9yeS9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBvZmZzZXQgLSB0aGUgb2Zmc2V0IGluIGJ5dGVzIHRvIHJlYWQgZnJvbSwgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGJ1ZiAgICAtIFdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogbGVuZ3RoIC0gQnVmZmVyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIGZyb20gZmlsZSBvciAwIGlmIEVPRiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBpbnQgKCpiY21fZGV2X2xvZ19maWxlX3JlYWRfY2IpKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUsIHVpbnQzMl90ICpvZmZzZXQsIHZvaWQgKmJ1ZiwgdWludDMyX3QgbGVuZ3RoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXUklURV9DQUxMQkFDSzogd3JpdGUgZm9ybSBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGJ1ZiAgICAtIFRoZSBidWZmZXIgdGhhdCBzaG91bGQgYmUgd3JpdHRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogbGVuZ3RoIC0gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuIHRvIGZpbGUgb3IgMCBpZiBFT0YgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBpbnQgKCpiY21fZGV2X2xvZ19maWxlX3dyaXRlX2NiKShiY21fZGV2X2xvZ19maWxlICpmaWxlLCBjb25zdCB2b2lkICpidWYsIHVpbnQzMl90IGxlbmd0aCk7CisKKy8qIEZpbGUgYWxtb3N0IGZ1bGwgaW5kaWNhdGlvbiBjYWxsYmFjayBwcm90b3R5cGUgKi8KK3R5cGVkZWYgYmNtb3NfZXJybm8gKCpGX2Rldl9sb2dfZmlsZV9hbG1vc3RfZnVsbCkobG9uZyBwcml2KTsKKworLyogRmlsZSBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgYmNtX2Rldl9sb2dfZmlsZV9wYXJtCit7CisgICAgYmNtX2Rldl9sb2dfZmlsZV90eXBlIHR5cGU7CisgICAgLyogRmlsZS1hY2Nlc3MgY2FsbGJhY2tzIGNhbiBiZSBOVUxMIGZvciBtZW1vcnkgZmlsZXMsIGluIHRoaXMgY2FzZSBzdGFydF9hZGRyICAgICovCisgICAgLyogc2hvdWxkIGJlIGEgdmFsaWQgbWVtb3J5IGFkZHJlc3MsIGFsbCByZWFkL3dyaXRlcyBvcHRpb25zIHdpbGwgYmUgICAgICAgICovCisgICAgLyogcGVyZm9ybWVkIGRpcmVjdGx5IHRvIHRoaXMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdm9pZCAqc3RhcnRfYWRkcjsKKyAgICB1aW50MzJfdCBzaXplOworICAgIGJjbV9kZXZfbG9nX2ZpbGVfb3Blbl9jYiBvcGVuX2NiOworICAgIGJjbV9kZXZfbG9nX2ZpbGVfY2xvc2VfY2IgY2xvc2VfY2I7CisgICAgYmNtX2Rldl9sb2dfZmlsZV93cml0ZV9jYiB3cml0ZV9jYjsKKyAgICBiY21fZGV2X2xvZ19maWxlX3JlYWRfY2IgcmVhZF9jYjsKKyAgICBiY21fZGV2X2xvZ19maWxlX3Jld2luZF9jYiByZXdpbmRfY2I7CisgICAgYmNtX2Rldl9sb2dfZmlsZV9mbGFncyBmbGFnczsKKyAgICB2b2lkICp1ZGVmX3Bhcm1zOworfTsKKworI2RlZmluZSBGSUxFX01BR0lDX1NUUl9TSVpFICAgICAgICAgICAgIDE2CisjZGVmaW5lIEZJTEVfTUFHSUNfU1RSICJATE9HRklMRSBNQUdJQ0AiIC8qIGxlbmd0aCBzaG91bGQgYmUgRklMRV9NQUdJQ19TVFJfU0laRSAoaW5jbHVkaW5nICdcMCcpICovCisKKy8qIEZpbGUgYWxtb3N0IGZ1bGwgaW5kaWNhdGlvbiBjb250cm9sIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0IGRldl9sb2dfYWxtb3N0X2Z1bGxfaW5mbworeworICAgIEZfZGV2X2xvZ19maWxlX2FsbW9zdF9mdWxsIHNlbmRfaW5kX2NiOworICAgIHVpbnQzMl90IHRocmVzaG9sZDsKKyAgICBiY21vc19ib29sIGluZF9zZW50OworICAgIGxvbmcgcHJpdjsKK30gZGV2X2xvZ19hbG1vc3RfZnVsbF9pbmZvOworCisvKiBNZW1vcnkgZmlsZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGRldl9sb2dfbWVtX2ZpbGVfaGVhZGVyCit7CisgICAgdWludDMyX3QgZmlsZV93cmFwX2NudDsKKyAgICB1aW50MzJfdCB3cml0ZV9vZmZzZXQ7CisgICAgdWludDMyX3QgZGF0YV9zaXplOworICAgIHVpbnQzMl90IG51bV9tc2dzOworICAgIGNoYXIgZmlsZV9tYWdpY1tGSUxFX01BR0lDX1NUUl9TSVpFXTsKKyAgICBjaGFyIG1zZ19idWZmZXJbMF07Cit9IGRldl9sb2dfbWVtX2ZpbGVfaGVhZGVyOworCitzdHJ1Y3QgYmNtX2Rldl9sb2dfZmlsZQoreworICAgIGJjbV9kZXZfbG9nX2ZpbGVfcGFybSBmaWxlX3Bhcm07CisgICAgZGV2X2xvZ19hbG1vc3RfZnVsbF9pbmZvIGFsbW9zdF9mdWxsOworICAgIGJjbW9zX2Jvb2wgaXNfZnVsbDsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgLyogTWVtb3J5IGZpbGUgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX211dGV4IG11dGV4OyAvKiBNdXRleCB0byBsb2NrIGZpbGUgYWNjZXNzIHdoaWxlIHByaW50aW5nIGl0ICovCisgICAgICAgICAgICBkZXZfbG9nX21lbV9maWxlX2hlYWRlciBmaWxlX2hlYWRlcjsKKyAgICAgICAgfSBtZW1fZmlsZTsKKworI2lmZGVmIEJDTV9PU19QT1NJWAorICAgICAgICBGSUxFICpyZWdfZmlsZV9oYW5kbGU7CisjZW5kaWYKKworICAgICAgICAvKiBVc2VyLWRlZmluZWQgZmlsZSBoYW5kbGUgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyB1ZGVmX2hhbmRsZTsKKyAgICB9IHU7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdldCB0aW1lIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGltZS4gSWYgTlVMTCB0aW1lIHByaW50cyB3aWxsIGJlIGRpc2FibGVkLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHVpbnQzMl90ICgqYmNtX2Rldl9sb2dfZ2V0X3RpbWVfY2IpKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaW1lIHRvIHN0cmluZyBjYWxsYmFjayByZWNlaXZlcyB0aW1lc3RhbXAgKHVzKSBhbmQgc2hvdWxkIGNvbnZlcnQgaW50byB0aW1lX3N0ciAgICAgICAgICAgICAgICAgICAgICovCisvKiB0aW1lX3N0cl9zaXplIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQuIEluIHRoZSBlbmQgZnVuY3Rpb24gc2hvdWxkIHVwZGF0ZSB0aGUgICAgICovCisvKiBudW1iZXIgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJZiBOVUxMIHRpbWUgd2lsbCBwcmludGVkIGFzIGFuIHVuc2lnbmVkIGludGVnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGludCAoKmJjbV9kZXZfbG9nX3RpbWVfdG9fc3RyX2NiKSh1aW50MzJfdCB0aW1lLCBjaGFyICp0aW1lX3N0ciwgaW50IHRpbWVfc3RyX3NpemUpOwordHlwZWRlZiBpbnQgKCpiY21fZGV2X2xvZ19wcmludF9jYikodm9pZCAqYXJnLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFN0cnVjdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21fZGV2X2xvZ19nZXRfdGltZV9jYiBnZXRfdGltZV9jYjsKKyAgICBiY21fZGV2X2xvZ190aW1lX3RvX3N0cl9jYiB0aW1lX3RvX3N0cl9jYjsKKyAgICBiY21fZGV2X2xvZ19wcmludF9jYiBwcmludF9jYjsKKyAgICB2b2lkICpwcmludF9jYl9hcmc7CisgICAgYmNtX2Rldl9sb2dfZmlsZV9wYXJtIGxvZ19maWxlW0RFVl9MT0dfTUFYX0ZJTEVTXTsKK30gYmNtX2Rldl9sb2dfcGFybTsKKworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKK3R5cGVkZWYgc3RydWN0Cit7CisgICB1aW50MzJfdCB0aHJlc2hvbGQ7ICAvKiBldmVyeSB0aHJlc2hvbGQgbWVzc2FnZXMsIHByaW50IG9uZSAqLworICAgdWludDMyX3QgY291bnRlcjsgICAgLyogY3VycmVudCBpbmRleCAtIHJ1bnMgZnJvbSAwIHRvIHRocmVzaG9sZCwgcGVyaW9kaWNhbGx5ICovCit9IGRldl9sb2dfaWRfdGhyb3R0bGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICB1aW50MzJfdCBzdGFydF90aHJlc2hvbGQ7IC8qIHN0YXJ0IHByaW50aW5nIHdoZW4gdGhyZXNob2xkIGlzIHJlYWNoZWQgKi8KKyAgIHVpbnQzMl90IHN0b3BfdGhyZXNob2xkOyAgLyogc3RvcCBwcmludGluZyB3aGVuIHRocmVzaG9sZCBpcyByZWFjaGVkLCBzdGFydGluZyBjb3VudGluZyBmcm9tIHN0YXJ0LCBpZiAwLCBkbyBubyBzdG9wICovCisgICB1aW50MzJfdCBjb3VudGVyOyAgICAgICAgIC8qIGN1cnJlbnQgaW5kZXggLSBydW5zIDogZmlyc3QgLSBmcm9tIDAgdG8gc3RhcnRfdGhyZXNob2xkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kIC0gZnJvbSBzdGFydF90aHJlc2hvbGQgdG8gc3RvcF90aHJlc2hvbGQgKi8KKyAgIGludDMyX3QgcmVwZWF0X3RocmVzaG9sZDsvKiB0aGUgdHJpZ2dlciBwZXJpb2QsIGhvdyBtYW55IHRpbWVzIHRoZSB0cmlnZ2VyIGlzIHNldCwgLTEgPSBhbHdheXMgKi8KKyAgIGludDMyX3QgcmVwZWF0OyAgICAgICAgICAvKiBjdXJyZW50IHJlcGVhdCBjb3VudGVyICovCit9IGRldl9sb2dfaWRfdHJpZ2dlcjsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyIG5hbWVbTUFYX0RFVl9MT0dfSURfTkFNRV07CisgICAgYmNtX2Rldl9sb2dfaWRfdHlwZSBsb2dfdHlwZTsKKyAgICBiY21fZGV2X2xvZ19pZF90eXBlIGRlZmF1bHRfbG9nX3R5cGU7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsX3ByaW50OworICAgIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbF9zYXZlOworICAgIGJjbV9kZXZfbG9nX2xldmVsIGRlZmF1bHRfbG9nX2xldmVsOworICAgIGJjbV9kZXZfbG9nX3N0eWxlIHN0eWxlOworICAgIHVpbnQzMl90IGxvc3RfbXNnX2NudDsKKyAgICB1aW50MzJfdCBwcmludF9za2lwcGVkX2NvdW50OyAvKiBzZWUgREVWX0xPR19TS0lQX1BSSU5UX1RIUkVTSE9MRF9QRVJDRU5UICovCisgICAgdWludDMyX3QgY291bnRlcnNbREVWX0xPR19MRVZFTF9OVU1fT0ZdOworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKyAgICBiY21fZGV2X2xvZ19sZXZlbCB0aHJvdHRsZV9sb2dfbGV2ZWw7CisgICAgZGV2X2xvZ19pZF90aHJvdHRsZSB0aHJvdHRsZTsKKyAgICBiY21fZGV2X2xvZ19sZXZlbCB0cmlnZ2VyX2xvZ19sZXZlbDsKKyAgICBkZXZfbG9nX2lkX3RyaWdnZXIgdHJpZ2dlcjsKKyNlbmRpZgorfSBkZXZfbG9nX2lkX3Bhcm07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZ1bmN0aW9ucyBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFRlYXIgZG93biB0aGUgZGV2X2xvZywgZnJlZWluZyBhbGwgT1MgcmVzb3VyY2VzLiAqLwordm9pZCBiY21fZGV2X2xvZ19kZXN0cm95KHZvaWQpOworCisvKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgZGVmYXVsdCBsb2dnZXIgdGhhdCBzdXBwb3J0cyBsb2dnaW5nIG9uIHRoZSBzY3JlZW4gYW5kCisgKiBpbnRvIDAgb3IgbW9yZSBtZW1vcnkgZmlsZXMuCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2luaXRfZGVmYXVsdF9sb2dnZXIodm9pZCAqKnN0YXJ0X2FkZHJlc3NlcywKKyAgICB1aW50MzJfdCAqc2l6ZXMsCisgICAgYmNtX2Rldl9sb2dfZmlsZV9mbGFncyAqZmxhZ3MsCisgICAgdWludDMyX3QgbnVtX2ZpbGVzLAorICAgIHVpbnQzMl90IHN0YWNrX3NpemUsCisgICAgYmNtb3NfdGFza19wcmlvcml0eSBwcmlvcml0eSwKKyAgICB1aW50MzJfdCBwb29sX3NpemUpOworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIG1vcmUgZmxleGlibGUgY29tcGFyaW5nIHdpdGggYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcigpLgorICogSXQgY3JlYXRlcyBsb2dnZXIgdGhhdCBzdXBwb3J0cyBsb2dnaW5nIG9uIHRoZSBzY3JlZW4gYW5kIGludG8gMCBvciBtb3JlCisgKiBtZW1vcnksIHJlZ3VsYXIgYW5kIHVzZXItZGVmaW5lZCBmaWxlcy4KKyAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcl9leHQoCisgICAgYmNtX2Rldl9sb2dfcGFybSAqZGV2X2xvZ19wYXJtLAorICAgIHVpbnQzMl90IG51bV9maWxlcywKKyAgICB1aW50MzJfdCBzdGFja19zaXplLAorICAgIGJjbW9zX3Rhc2tfcHJpb3JpdHkgcHJpb3JpdHksCisgICAgdWludDMyX3QgcG9vbF9zaXplKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9yZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBBZGQgbmV3IElEIHRvIGRldl9sb2cgYW5kIHJldHVybiBpdCB0byB1c2VyICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgeGlfbmFtZSAgICAgICAgICAgICAgICAtIElEIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHhpX2RlZmF1bHRfbG9nX2xldmVsICAgLSBJRCBkZWZhdWx0IGxvZyBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB4aV9kZWZhdWx0X2xvZ190eXBlICAgIC0gSUQgZGVmYXVsdCBsb2cgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBuZXcgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZGV2X2xvZ19pZCBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihjb25zdCBjaGFyICp4aV9uYW1lLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIHhpX2RlZmF1bHRfbG9nX2xldmVsLAorICAgIGJjbV9kZXZfbG9nX2lkX3R5cGUgeGlfZGVmYXVsdF9sb2dfdHlwZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX2lkX3NldF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBTZXQgY3VycmVudCBsb2cgdHlwZSBmb3IgYW4gSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB4aV9pZCAgICAgICAgLSBUaGUgSUQgaW4gdGhlIERldiBsb2cgKHdoYXQgd2UgZ290IGZvcm0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIpICAgICAgKi8KKy8qICAgLSB4aV9sb2dfdHlwZSAgLSBOZXcgbG9nIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgYmNtb3NfZXJybm8gLSBTdWNjZXNzIGNvZGUgKEJDTV9FUlJfT0spIG9yIEVycm9yIGNvZGUgKHNlZSBiY21vc19lcnJuby5oKSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX3NldF90eXBlKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX2lkX3R5cGUgeGlfbG9nX3R5cGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9zZXRfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogU2V0IGN1cnJlbnQgbG9nIGxldmVsIGZvciBhbiBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfaWQgICAgICAgIC0gVGhlIElEIGluIHRoZSBEZXYgbG9nICh3aGF0IHdlIGdvdCBmb3JtIGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKSAgICAgICovCisvKiAgIC0geGlfbG9nX2xldmVsIC0gTmV3IGxvZyBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXRfbGV2ZWwoZGV2X2xvZ19pZCB4aV9pZCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsX3ByaW50LCBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWxfc2F2ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX2lkX3NldF90b19kZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBTZXQgbG9nX3R5cGUgYW5kIGxvZ19sZXZlbCB0byBkZWZhdWx0IChjcmVhdGlvbikgdmFsdWVzIGZvciBhbiBJRCAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB4aV9pZCAgICAtIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgYmNtb3NfZXJybm8gLSBTdWNjZXNzIGNvZGUgKEJDTV9FUlJfT0spIG9yIEVycm9yIGNvZGUgKHNlZSBiY21vc19lcnJuby5oKSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbHNfYW5kX3R5cGVfdG9fZGVmYXVsdChkZXZfbG9nX2lkIHhpX2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfbGV2ZWxfc2V0X3N0eWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IFNldCBsb2cgc3R5bGUgcGVyIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX2xldmVsICAgIC0gTG9nIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX3N0eWxlICAgIC0gVGhlIHN0eWxlIG9mIHRoZSBsb2csIE5PUk1BTCwgQk9MRCwgVU5ERVJMSU5FLCBCTElOSywgUkVWRVJTRV9WSURFTyAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21fZGV2X2xvZ19sZXZlbF9zZXRfc3R5bGUoYmNtX2Rldl9sb2dfbGV2ZWwgbGV2ZWwsIGJjbV9kZXZfbG9nX3N0eWxlIHhpX3N0eWxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfaWRfc2V0X3N0eWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IFNldCBsb2cgc3R5bGUgcGVyIGxvZyBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX2lkICAgIC0gVGhlIElEIGluIHRoZSBEZXYgbG9nICh3aGF0IHdlIGdvdCBmb3JtIGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKSAgICAgICAgICAqLworLyogICAtIHhpX3N0eWxlICAgIC0gVGhlIHN0eWxlIG9mIHRoZSBsb2csIE5PUk1BTCwgQk9MRCwgVU5ERVJMSU5FLCBCTElOSywgUkVWRVJTRV9WSURFTyAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfc2V0X3N0eWxlKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX3N0eWxlIHhpX3N0eWxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9jbGVhcl9jb3VudGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBDbGVhciBjb3VudGVyIGZvciBhbiBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB4aV9pZCAgICAgICAgICAgICAgICAtIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgYmNtb3NfZXJybm8gLSBTdWNjZXNzIGNvZGUgKEJDTV9FUlJfT0spIG9yIEVycm9yIGNvZGUgKHNlZSBiY21vc19lcnJuby5oKSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX2NsZWFyX2NvdW50ZXJzKGRldl9sb2dfaWQgeGlfaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9nZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogR2V0IHRoZSBJRCBzdGF0dXMgKHR5cGUsIGxldmVsLCBjb3VudGVycyAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfaWQgICAgICAgICAgICAtIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICovCisvKiAgIC0geG9faWRfc3RhdHVzICAgICAtIFJldHVybmVkIHN0YXR1cyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9nZXQoZGV2X2xvZ19pZCB4aV9pZCwgZGV2X2xvZ19pZF9wYXJtICp4b19pZF9zdGF0dXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9zZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogc2V0IHRoZSBJRCBzdGF0dXMgKHR5cGUsIGxldmVsLCBzdHlsZSAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfaWQgICAgICAgICAgICAtIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICovCisvKiAgIC0geGlfcGFybXMgICAgICAgICAtIHN0cnVjdHVyZSB0byBzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXQoZGV2X2xvZ19pZCB4aV9pZCwgZGV2X2xvZ19pZF9wYXJtICp4aV9wYXJtcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBSZXR1cm4gSUQgZm9yIGluZGV4LCBpZiBubyBzdWNoIGluZGV4IHJldHVybiAoREVWX0xPR19JTlZBTElEX0lEKSAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHhpX2luZGV4ICAgICAgICAgLSBUaGUgaW5kZXggb2YgdGhlIElEIGluIHRoZSBnbG9iYWwgYXJyYXkuICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdWludDMyX3QgLSBUaGUgSUQgKERFVl9MT0dfSU5WQUxJRF9JRCBpZiBpbmRleCBpcyBub3QgdmFsaWQpICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Rldl9sb2dfaWQgYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHVpbnQzMl90IHhpX2luZGV4KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfZ2V0X2luZGV4X2J5X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IFJldHVybiBJRCBmb3IgaW5kZXgsIGlmIG5vIHN1Y2ggaW5kZXggcmV0dXJuIChERVZfTE9HX0lOVkFMSURfSUQpICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogeGlfaWQgICAgICAgICAgICAgICAgICAgICAgICAtIExvZyBpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB1aW50MzJfdCAtIFRoZSBpbmRleCBJRCAoREVWX0xPR19JTlZBTElEX0lOREVYIGlmIGlkIGlzIG5vdCB2YWxpZCkgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtX2Rldl9sb2dfZ2V0X2luZGV4X2J5X2lkKGRldl9sb2dfaWQgeGlfaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9nZXRfYnlfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogUmV0dXJuIElEIGluZGV4IGZvciBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB4aV9fbmFtZSAgICAgICAgIC0gVGhlIG5hbWUgb2YgdGhlIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGludDMyX3QgLSBUaGUgSUQgaW5kZXggKC0xIGlmIG5hbWUgaXMgbm90IHZhbGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitkZXZfbG9nX2lkIGJjbV9kZXZfbG9nX2lkX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIqIHhpX25hbWUpOworCit1aW50MzJfdCBiY21fZGV2X2xvZ19nZXRfbnVtX29mX2VudHJpZXModm9pZCk7CisKK2JjbW9zX2Jvb2wgYmNtX2Rldl9sb2dfZ2V0X2NvbnRyb2wodm9pZCk7Cit2b2lkIGJjbV9kZXZfbG9nX3NldF9jb250cm9sKGJjbW9zX2Jvb2wgY29udHJvbCk7CisKK2JjbV9kZXZfbG9nX2ZpbGVfZmxhZ3MgYmNtX2Rldl9sb2dfZ2V0X2ZpbGVfZmxhZ3ModWludDMyX3QgZmlsZV9pZCk7Cit2b2lkIGJjbV9kZXZfbG9nX3NldF9maWxlX2ZsYWdzKHVpbnQzMl90IGZpbGVfaWQsIGJjbV9kZXZfbG9nX2ZpbGVfZmxhZ3MgZmxhZ3MpOworCitiY21fZGV2X2xvZ19mbGFncyBiY21fZGV2X2xvZ19nZXRfZmxhZ3Modm9pZCk7Cit2b2lkIGJjbV9kZXZfbG9nX3NldF9mbGFncyhiY21fZGV2X2xvZ19mbGFncyBmbGFncyk7CisKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X3ByaW50X2NiKGJjbV9kZXZfbG9nX3ByaW50X2NiIGNiKTsKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X2dldF90aW1lX2NiKGJjbV9kZXZfbG9nX2dldF90aW1lX2NiIGNiKTsKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X3RpbWVfdG9fc3RyX2NiKGJjbV9kZXZfbG9nX3RpbWVfdG9fc3RyX2NiIGNiKTsKKworLyogRmlsZSBpbmRleCB0byBmaWxlIGhhbmRsZSAqLworYmNtX2Rldl9sb2dfZmlsZSAqYmNtX2Rldl9sb2dfZmlsZV9nZXQodWludDMyX3QgZmlsZV9pbmRleCk7CisKKy8qIEdldCBudW1iZXIgb2YgbWVzc2FnZXMgc3RvcmVkIGluIHRoZSBmaWxlICovCit1aW50MzJfdCBiY21fZGV2X2xvZ19nZXRfbnVtX29mX21lc3NhZ2VzKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpOworCisvKiBHZXQgZmlsZSBpbmZvOiBtYXggZGF0YSBzaXplLCB1c2VkIGJ5dGVzICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19nZXRfZmlsZV9pbmZvKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUsIHVpbnQzMl90ICpmaWxlX3NpemUsIHVpbnQzMl90ICp1c2VkX2J5dGVzKTsKKworLyogUmVhZCBmcm9tIGZpbGUuCisgKiBccGFyYW1baW5dICAgICAgICAgICBmaWxlICAgIEZpbGUgdG8gcmVhZCBmcm9tCisgKiBccGFyYW1baW4sb3V0XSAgICAgICBvZmZzZXQgIG9mZnNldCB0byByZWFkIGZyb20uIDA9cmVhZCBmcm9tIHRoZSBzdGFydAorICogXHBhcmFtW2luLG91dF0gICAgICAgYnVmICAgICBidWZmZXIgdG8gcmVhZCByZWNvcmRzIHRvCisgKiBccGFyYW1baW5dICAgICAgICAgICBidWZfbGVuIGJ1ZiBzaXplCisgKiBccmV0dXJucyAtIG51bWJlciBvZiBieXRlcyByZWFkID49IDAgb3IgYmNtb3NfZXJybm8gPCAwCisgKiAwID0gbm8gbW9yZSByZWNvcmRzIHRvIHJlYWQKKyAqIEJDTV9FUlJfT1ZFUkZMT1cgLSBidWZmZXIgaXMgdG9vIHNob3J0IGZvciBsb2cgcmVjb3JkCisgKi8KK2ludCBiY21fZGV2X2xvZ19maWxlX3JlYWQoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3QgKm9mZnNldCwgY2hhciAqYnVmLCB1aW50MzJfdCBidWZfbGVuKTsKKworLyogQ2xlYXIgZmlsZQorICogXHBhcmFtW2luXSAgICAgICAgICAgZmlsZSAgICBGaWxlIGhhbmRsZQorICogXHJldHVybnMgICAgIGJjbW9zX2Vycm5vIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfZmlsZV9jbGVhcihiY21fZGV2X2xvZ19maWxlICpmaWxlKTsKKworLyogQXR0YWNoIGZpbGUgdG8gbWVtb3J5IGJ1ZmZlci4KKyAqIFRoZSBmaWxlIGRhdGEgY2FuIGJlIHJlYWQgdXNpbmcgYmNtX2Rldl9sb2dfZmlsZV9yZWFkIG9yIGJjbV9kZXZfbG9nX2ZpbGVfcmVhZF9jdXQKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGJ1ZiAgICAgYnVmZmVyIHRvIGJlIGludGVycHJldGVkIGFzIG1lbW9yeSBmaWxlCisgKiBccGFyYW1baW5dICAgICAgICAgICBidWZfbGVuIGJ1ZiBzaXplCisgKiBccGFyYW1bb3V0XSAgICAgICAgICBmaWxlICAgIEZpbGUgaGFuZGxlLgorICogZmlsZV9oYW5kbGUgaGFzIHRvIGJlIGRlc3Ryb3llZCB1c2luZyBiY21fZGV2X2xvZ19maWxlX2RldGFjaCgpIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAqIFxyZXR1cm5zICAgICBiY21vc19lcnJubyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2ZpbGVfYXR0YWNoKHZvaWQgKmJ1ZiwgdWludDMyX3QgYnVmX2xlbiwgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSk7CisKKy8qIERldGFjaCBmaWxlIGhhbmRsZSBmcm9tIG1lbW9yeSBidWZmZXIuCisgKiBGb2xsb3dpbmcgdGhpcyBjYWxsLCB0aGUgZmlsZSBoYW5kbGUgYmVjb21lcyBpbnZhbGlkCisgKiBccGFyYW1baW5dICAgICAgICAgICBmaWxlICAgIEZpbGUgaGFuZGxlLgorICogXHJldHVybnMgICAgIGJjbW9zX2Vycm5vIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfZmlsZV9kZXRhY2goYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSk7CisKKy8qIFJlZ2lzdGVyIGluZGljYXRpb24gdG8gYmUgc2VudCB3aGVuIGZpbGUgdXRpbGl6YXRpb24gY3Jvc3NlcyB0aHJlc2hvbGQgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2FsbW9zdF9mdWxsX2luZF9yZWdpc3RlcihiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCB1c2VkX2J5dGVzX3RocmVzaG9sZCwKKyAgICBGX2Rldl9sb2dfZmlsZV9hbG1vc3RfZnVsbCBzZW5kX2luZF9jYiwgbG9uZyBpbmRfY2JfcHJpdik7CisKK3ZvaWQgZGV2X2xvZ19nZXRfbG9nX25hbWVfdGFibGUoY2hhciAqYnVmZmVyLCB1aW50MzJfdCBidWZfbGVuKTsKKwordm9pZCBiY21fZGV2X2xvZ19kcm9wX3JlcG9ydCh2b2lkKTsKKworLyoqIEhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBnaXZlbiBsb2cgbGV2ZWwgcXVhbGlmaWVzIGFzIGFuIGVycm9yLiAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbV9kZXZfbG9nX2xldmVsX2lzX2Vycm9yKGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbCkKK3sKKyAgICByZXR1cm4gbG9nX2xldmVsID09IERFVl9MT0dfTEVWRUxfRkFUQUwgfHwgbG9nX2xldmVsID09IERFVl9MT0dfTEVWRUxfRVJST1I7Cit9CisKKy8qKiBSZXR1cm5zIHRoZSBwZXJjZW50YWdlICgwIC0gMTAwKSBvZiB0aGUgbXNnIHBvb2wgdGhhdCBpcyBjdXJyZW50bHkgaW4gdXNlLiAqLwordWludDhfdCBiY21fZGV2X2xvZ19wb29sX29jY3VwYW5jeV9wZXJjZW50X2dldCh2b2lkKTsKKworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX3NldF90aHJvdHRsZShkZXZfbG9nX2lkIHhpX2lkLCBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWwsIHVpbnQzMl90IHhpX3Rocm90dGxlKTsKKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfc2V0X3RyaWdnZXIoZGV2X2xvZ19pZCB4aV9pZCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLCB1aW50MzJfdCB4aV9zdGFydCwgdWludDMyX3QgeGlfc3RvcCwgaW50MzJfdCB4aV9yZXBlYXQpOworI2VuZGlmIC8qIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUgKi8KKworI2VuZGlmIC8qIEVOQUJMRV9MT0cgKi8KKworI2VuZGlmIC8qIF9fQkNNX0RFVl9MT0dfVEFTS19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYTNlODEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ190YXNrX2ludGVybmFsLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX19CQ01fREVWX0xPR19UQVNLX0lOVEVSTkFMX0hfCisjZGVmaW5lIF9fQkNNX0RFVl9MT0dfVEFTS19JTlRFUk5BTF9IXworCisjaWZkZWYgRU5BQkxFX0xPRworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisKKyNkZWZpbmUgTE9HX05BTUVfTk9fSU5TVEFOQ0UgMHhmZgorI2RlZmluZSBMT0dfTkFNRV9MRU5HVEggICAgICAxMDAKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX0RFVl9MT0dfU1RBVEVfVU5JTklUSUFMSVpFRCwKKyAgICBCQ01fREVWX0xPR19TVEFURV9ESVNBQkxFRCwKKyAgICBCQ01fREVWX0xPR19TVEFURV9FTkFCTEVELAorfSBiY21fZGV2X2xvZ19zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21fZGV2X2xvZ19wYXJtIGRldl9sb2dfcGFybTsKKyAgICBiY21fZGV2X2xvZ19maWxlIGZpbGVzW0RFVl9MT0dfTUFYX0ZJTEVTXTsgLyogbG9nIGZpbGVzICovCisgICAgdWludDMyX3QgbXNnX2NvdW50OyAvKiBNZXNzYWdlIGNvdW50ZXIgKi8KKyAgICBkZXZfbG9nX2lkX3Bhcm0gaWRzW0RFVl9MT0dfTUFYX0lEU107IC8qIGRldl9sb2cgSURTIGFycmF5ICovCisgICAgdWludDMyX3QgbnVtX2lkczsgLyogTnVtYmVyIG9mIGFjdHVhbGx5IHJlZ2lzdGVyZWQgaWRzICovCisgICAgYmNtX2Rldl9sb2dfc3RhdGUgc3RhdGU7CisgICAgYmNtb3NfbXNnX3F1ZXVlIHNhdmVfcXVldWU7IC8qIExvZyBtZXNzYWdlcyB0byBiZSBzYXZlZCB0byBSQU0gKGZpcnN0IHN0YWdlIG9mIHBpcGVsaW5lKSAqLworICAgIGJjbW9zX21zZ19xdWV1ZSBwcmludF9xdWV1ZTsgLyogTG9nIG1lc3NhZ2VzIHRvIGJlIHByaW50ZWQgKHNlY29uZCBzdGFnZSBvZiBwaXBlbGluZSkgKi8KKyAgICBiY21vc190YXNrIHNhdmVfdGFzazsKKyAgICBiY21vc190YXNrIHByaW50X3Rhc2s7CisgICAgYmNtb3Nfc2VtIHNhdmVfdGFza19pc190ZXJtaW5hdGVkOworICAgIGJjbW9zX3NlbSBwcmludF90YXNrX2lzX3Rlcm1pbmF0ZWQ7CisgICAgYmNtb3NfbXNnX3Bvb2wgcG9vbDsKKyAgICBiY21fZGV2X2xvZ19mbGFncyBmbGFnczsgLyogR2VuZXJhbCBmbGFncyBhcHBsaWVkIG9uIHRoZSBlbnRpcmUgZmVhdHVyZSAodW5saWtlIGZpbGUgZmxhZ3Mgd2hpY2ggcmVzaWRlIGluICdmaWxlcycgc3ViLXN0cnVjdHVyZSkuICovCit9IGJjbV9kZXZfbG9nOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGRldl9sb2dfaWRfcGFybSAqbG9nX2lkOworICAgIHVpbnQzMl90IHRpbWVfc3RhbXA7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbXNnX2xldmVsOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZm10OworICAgICAgICAgICAgLyogUm9vbSBmb3IgTUFYICsgMSBhcmd1bWVudHMgc2luY2UgdGhlIGFyZ3VtZW50IGxpc3QgbmVlZHMgdG8gc3RhcnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IC0gdGhlIGZpcnN0CisgICAgICAgICAgICAgKiBlbnRyeSBtYXkgYmUgdW51c2VkIGlmIHRoZSBhcnJheSBkb2Vzbid0IG5hdHVyYWxseSBzdGFydCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuICovCisgICAgICAgICAgICBjb25zdCB2b2lkICphcmdzW0RFVl9MT0dfTUFYX0FSR1MgKyAxXTsKKyAgICAgICAgfSBmbXRfYXJnczsgLyogUmVsZXZhbnQgaW4gZGVmYXVsdCBtb2RlIC0gd2hlbiBub3QgdXNpbmcgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQgKi8KKyAgICAgICAgY2hhciBzdHJbTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkVdOyAvKiBSZWxldmFudCBvbmx5IGlmIHVzaW5nIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1UICovCisgICAgfSB1OworfSBkZXZfbG9nX3F1ZXVlX21zZzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyIG5hbWVbTE9HX05BTUVfTEVOR1RIXTsKKyAgICB1aW50OF90IGZpcnN0X2luc3RhbmNlOworICAgIHVpbnQ4X3QgbGFzdF9pbnN0YW5jZTsKK31sb2dfbmFtZV90YWJsZTsKKworZXh0ZXJuIGJjbV9kZXZfbG9nIGRldl9sb2c7CitleHRlcm4gY29uc3QgY2hhciAqbG9nX2xldmVsX3N0cjsKKworZXh0ZXJuIGxvZ19uYW1lX3RhYmxlIGxvZ3NfbmFtZXNbREVWX0xPR19NQVhfSURTXTsKK2V4dGVybiB1aW50OF90IGxvZ19uYW1lX3RhYmxlX2luZGV4OworCitiY21vc19lcnJubyBfYmNtX2Rldl9sb2dfZmlsZV9jbGVhcl9ub19sb2NrKHVpbnQzMl90IGZpbGVfaW5kZXgpOworCisjZW5kaWYgLyogRU5BQkxFX0xPRyAqLworCisjZW5kaWYgLyogX19CQ01fREVWX0xPR19UQVNLX0lOVEVSTkFMX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODJjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjIGRldl9sb2cgbGludXggc3VwcG9ydAorIyBsaW51eCB1c2VyIHNwYWNlCisjIAorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKworTU9EX05BTUUgPSBkZXZfbG9nX2xpbnV4CitNT0RfVFlQRSA9IGxpYgorCitpZmVxICgiJChFTkFCTEVfTE9HKSIsICJ5IikKKworTU9EX0RFUFMgPSBkZXZfbG9nCitzcmNzID0gYmNtb2x0X2Rldl9sb2dfbGludXguYworCitlbmRpZgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgvYmNtb2x0X2Rldl9sb2dfbGludXguYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2JjbW9sdF9kZXZfbG9nX2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhMmFkNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2JjbW9sdF9kZXZfbG9nX2xpbnV4LmMKQEAgLTAsMCArMSwyNzAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgKiBiY21fZGV2X2xvZ19saW51eC5jCisgKgorICogTGludXgtc3BlY2lmaWMgY29kZS4gVXNlciBzcGFjZQorICovCisKKyNpbmNsdWRlIDxiY21vbHRfZGV2X2xvZ19saW51eC5oPgorI2luY2x1ZGUgPGtlcm5lbC9iY21vbHRfZGV2X2xvZ19pb2N0bC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjZGVmaW5lIEJDTV9ERVZfTE9HX0ZJTEVfTkFNRSAgICAgICAgICAgIi9kZXYvYmNtX2xvZyIKKyNkZWZpbmUgQkNNX0RFVl9MT0dfUE9MTF9JTlRFUlZBTF9VUyAgICAxMDAwMAorCitzdGF0aWMgaW50IGRldl9sb2dfZmlsZTsKK3N0YXRpYyBiY21vc190YXNrIGRldl9sb2dfcmVhZF90YXNrOworc3RhdGljIGludCBtYXhfa2VybmVsX2lkX2luZGV4OworLyoKKyAqIEludGVybmFsIGhlbHBlcnMKKyAqLworCisvKiByZWFkIGtlcm5lbCBEQiAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9kZXZfbG9nX2tlcm5lbF9kYl9yZWFkKHZvaWQpCit7CisgICAgZGV2X2xvZ19pb19wYXJhbSBpb19wYXJhbTsKKyAgICBpbnQgaTsKKworICAgIGlmIChpb2N0bChkZXZfbG9nX2ZpbGUsIERFVl9MT0dfQ0hSREVWX0RCX1JFQUQsICZpb19wYXJhbSkgPT0gLTEpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTywgIkNhbid0IHJlYWQga2VybmVsIGRhdGEgYmFzZS4gRXJyb3IgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorCisgICAgLyogUmVnaXN0ZXIga2VybmVsIGxvZyBpZHMgKi8KKyAgICBmb3IgKGk9MDsgaTxpb19wYXJhbS5kYl9yZWFkLm51bV9pZHM7IGkrKykKKyAgICB7CisgICAgICAgIGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGlvX3BhcmFtLmRiX3JlYWQuaWRzW2ldLm5hbWUsCisgICAgICAgICAgICBpb19wYXJhbS5kYl9yZWFkLmlkc1tpXS5kZWZhdWx0X2xldmVsLAorICAgICAgICAgICAgaW9fcGFyYW0uZGJfcmVhZC5pZHNbaV0uZGVmYXVsdF90eXBlKTsKKyAgICB9CisgICAgbWF4X2tlcm5lbF9pZF9pbmRleCA9IGk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogaWRlbnRpZnkgbG9nIGxldmVsIGJ5IGxldmVsIGNoYXIgKi8KK3N0YXRpYyBiY21fZGV2X2xvZ19sZXZlbCBfZGV2X2xvZ19sZXZlbF9ieV9jaGFyKGNoYXIgY2xldmVsKQoreworICAgIGJjbV9kZXZfbG9nX2xldmVsIGxldmVsOworCisgICAgc3dpdGNoIChjbGV2ZWwpCisgICAgeworICAgIGNhc2UgJ0YnOiBsZXZlbCA9IERFVl9MT0dfTEVWRUxfRkFUQUw7IGJyZWFrOworICAgIGNhc2UgJ0UnOiBsZXZlbCA9IERFVl9MT0dfTEVWRUxfRVJST1I7IGJyZWFrOworICAgIGNhc2UgJ1cnOiBsZXZlbCA9IERFVl9MT0dfTEVWRUxfV0FSTklORzsgYnJlYWs7CisgICAgY2FzZSAnSSc6IGxldmVsID0gREVWX0xPR19MRVZFTF9JTkZPOyBicmVhazsKKyAgICBjYXNlICdEJzogbGV2ZWwgPSBERVZfTE9HX0xFVkVMX0RFQlVHOyBicmVhazsKKyAgICBkZWZhdWx0OiBsZXZlbCA9IERFVl9MT0dfTEVWRUxfTk9fTE9HOyBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gbGV2ZWw7Cit9CisKKy8qIHJlYWRfYnVmIHRhc2sgaGFuZGxlciAqLworc3RhdGljIGludCBfZGV2X2xvZ19yZWFkX2tlcm5lbF9idWZfaGFuZGxlcihsb25nIGRhdGEpCit7CisgICAgZGV2X2xvZ19pb19wYXJhbSBpb19wYXJhbSA9IHt9OworICAgIHVuc2lnbmVkIGxvbmcgbG9nX3RpbWU7CisgICAgY2hhciBsZXZlbF9jaGFyOworICAgIGNoYXIgbG9nX25hbWVbTUFYX0RFVl9MT0dfSURfTkFNRV07CisgICAgaW50IG47CisgICAgZGV2X2xvZ19pZCBpZDsKKyAgICBiY21fZGV2X2xvZ19sZXZlbCBsZXZlbDsKKworICAgIHdoaWxlIChkZXZfbG9nX2ZpbGUpCisgICAgeworICAgICAgICBpZiAoaW9jdGwoZGV2X2xvZ19maWxlLCBERVZfTE9HX0NIUkRFVl9NU0dfUkVBRCwgJmlvX3BhcmFtKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIG5vIGVudHJpZXMgLSBzbGVlcCBhbnQgcmV0cnkuIE90aGVyd2lzZSAtIHN0b3AgKi8KKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfdXNsZWVwKEJDTV9ERVZfTE9HX1BPTExfSU5URVJWQUxfVVMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJpb2N0bCgpLT4lZCAoJXMpXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogcGFyc2Uga2VybmVsIG1lc3NhZ2UgKi8KKyAgICAgICAgbiA9IHNzY2FuZihpb19wYXJhbS5tc2dfcmVhZC5tc2csICJbJWx1OiAlYyAlMjBzXSIsICZsb2dfdGltZSwgJmxldmVsX2NoYXIsIGxvZ19uYW1lKTsKKyAgICAgICAgaWYgKG4gPCAzKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IHBhcnNlIGtlcm5lbCBsb2c6ICVzXG4iLCBpb19wYXJhbS5tc2dfcmVhZC5tc2cpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZGVudGlmeSBsb2dfaWQgKi8KKyAgICAgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfbmFtZShsb2dfbmFtZSk7CisgICAgICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgaWRlbnRpZnkgbG9nIGlkOiAlc1xuIiwgaW9fcGFyYW0ubXNnX3JlYWQubXNnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogSWRlbnRpZnkgbG9nX2xldmVsICovCisgICAgICAgIGxldmVsID0gX2Rldl9sb2dfbGV2ZWxfYnlfY2hhcihsZXZlbF9jaGFyKTsKKyAgICAgICAgaWYgKGxldmVsID09IERFVl9MT0dfTEVWRUxfTk9fTE9HKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGlkZW50aWZ5IGxvZyBsZXZlbDogJXNcbiIsIGlvX3BhcmFtLm1zZ19yZWFkLm1zZyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGxvZyBrZXJuZWwgbWVzc2FnZSBpbiB1c2VyLXNwYWNlIGxvZ2dlci4KKyAgICAgICAgICogRG8gbm90IGdlbmVyYXRlIGhlYWRlci4gSXQgaXMgYWxyZWFkeSBpbiB0aGUgbWVzc2FnZQorICAgICAgICAgKi8KKyAgICAgICAgYmNtX2Rldl9sb2dfbG9nKGlkLCBsZXZlbCwgQkNNX0xPR19GTEFHX05PX0hFQURFUiB8IEJDTV9MT0dfRkxBR19DQUxMRVJfRk1ULCAiJXMiLCBpb19wYXJhbS5tc2dfcmVhZC5tc2cpOworICAgIH0KKyAgICBCQ01PU19UUkFDRV9JTkZPKCJLZXJuZWwgbG9nZ2VyIGRhZW1vbiB0ZXJtaW5hdGVkXG4iKTsKKworICAgIHJldHVybiAwOworfQorCisvKiogTGludXgtc3BlY2lmaWMgaW5pdCAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfbGludXhfaW5pdCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyICp0YXNrX25hbWUgPSAia2VybmVsX2xvZyI7CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2twID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gdGFza19uYW1lLAorICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX0RFVl9MT0dfS0VSTkVMLAorICAgICAgICAuaGFuZGxlciA9IF9kZXZfbG9nX3JlYWRfa2VybmVsX2J1Zl9oYW5kbGVyCisgICAgfTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmIChkZXZfbG9nX2ZpbGUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisKKyAgICAvKiBSZWFkIGtlcm5lbCByZWdpc3RyYXRpb25zICovCisgICAgZGV2X2xvZ19maWxlID0gb3BlbihCQ01fREVWX0xPR19GSUxFX05BTUUsIE9fUkRXUik7CisgICAgaWYgKGRldl9sb2dfZmlsZSA8IDApCisgICAgeworICAgICAgICBkZXZfbG9nX2ZpbGUgPSAwOworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT0VOVCwgIkNhbid0IG9wZW4gJXMgZm9yIHJlYWQvd3JpdGUuIEVycm9yICVzXG4iLAorICAgICAgICAgICAgQkNNX0RFVl9MT0dfRklMRV9OQU1FLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKworICAgIC8qIFJlYWQga2VybmVsIGRhdGEgYmFzZSAqLworICAgIHJjID0gX2Rldl9sb2dfa2VybmVsX2RiX3JlYWQoKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBjbG9zZShkZXZfbG9nX2ZpbGUpOworICAgICAgICBkZXZfbG9nX2ZpbGUgPSAwOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogQ3JlYXRlIGEgdGFzayB0aGF0IHdpbGwgcG9sbCBrZXJuZWwgYnVmZmVyICovCisgICAgcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmZGV2X2xvZ19yZWFkX3Rhc2ssICZ0YXNrcCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgY2xvc2UoZGV2X2xvZ19maWxlKTsKKyAgICAgICAgZGV2X2xvZ19maWxlID0gMDsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKHJjLCAiQ2FuJ3QgY3JlYXRlIHJlYWRfa2VybmVsX2J1ZiB0YXNrXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIExpbnV4LXNwZWNpZmljIGNsZWFudXAgKi8KK3ZvaWQgYmNtX2Rldl9sb2dfbGludXhfZXhpdCh2b2lkKQoreworICAgIGludCBmID0gZGV2X2xvZ19maWxlOworICAgIGlmICghZGV2X2xvZ19maWxlKQorICAgICAgICByZXR1cm47CisgICAgZGV2X2xvZ19maWxlID0gMDsKKyAgICBjbG9zZShmKTsgLyogd2lsbCBjYXVzZSBwZW5kaW5nIGlvY3RsIHRvIHVubG9jayAqLworICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmZGV2X2xvZ19yZWFkX3Rhc2spOworfQorCisvKiBub3RpZnkgZGV2X2xvZyBpbiBrZXJuZWwgc3BhY2UgYWJvdXQgbG9nX3R5cGUgY2hhbmdlICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19saW51eF9pZF9zZXRfdHlwZShkZXZfbG9nX2lkIGxvZ19pZCwgYmNtX2Rldl9sb2dfaWRfdHlwZSBsb2dfdHlwZSkKK3sKKyAgICBkZXZfbG9nX2lvX3BhcmFtIGlvX3BhcmFtOworICAgIHVpbnQzMl90IGlkeDsKKworICAgIGlmICghZGV2X2xvZ19maWxlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9TVEFURTsKKworICAgIC8qIG1hcCB0byBpbmRleC4gaWQgaW4ga2VybmVsIHNwYWNlIGlzIGRpZmZlcmVudCAqLworICAgIGlkeCA9IGJjbV9kZXZfbG9nX2dldF9pbmRleF9ieV9pZChsb2dfaWQpOworICAgIGlmIChpZHggPT0gREVWX0xPR19JTlZBTElEX0lOREVYKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgIkNhbid0IG1hcCBsb2dfaWQgdG8gaW5kZXhcbiIpOworICAgIH0KKworICAgIC8qIElnbm9yZSB0aGUgcmVxdWVzdCBpZiBsb2dfaWQgaXMgbm90IGluIHRoIGVrZXJuZWwgKi8KKyAgICBpZiAoaWR4ID4gbWF4X2tlcm5lbF9pZF9pbmRleCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICBpb19wYXJhbS50eXBlX3NldC5pbmRleCA9IGlkeDsKKyAgICBpb19wYXJhbS50eXBlX3NldC50eXBlID0gbG9nX3R5cGU7CisgICAgaWYgKGlvY3RsKGRldl9sb2dfZmlsZSwgREVWX0xPR19DSFJERVZfVFlQRV9TRVQsICZpb19wYXJhbSkgPT0gLTEpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTywgIkNhbid0IHNldCB0eXBlIGZvciBrZXJuZWwgbG9nIGlkICVsdS4gRXJyb3IgJXNcbiIsIGxvZ19pZCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogbm90aWZ5IGRldl9sb2cgaW4ga2VybmVsIHNwYWNlIGFib3V0IGxvZ19sZXZlbCBjaGFuZ2UgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2xpbnV4X2lkX3NldF9sZXZlbChkZXZfbG9nX2lkIGxvZ19pZCwgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsX3ByaW50LCBiY21fZGV2X2xvZ19sZXZlbCBsb2dfbGV2ZWxfc2F2ZSkKK3sKKyAgICB1aW50MzJfdCBpZHg7CisgICAgZGV2X2xvZ19pb19wYXJhbSBpb19wYXJhbTsKKworICAgIGlmICghZGV2X2xvZ19maWxlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9TVEFURTsKKworICAgIC8qIG1hcCB0byBpbmRleC4gaWQgaW4ga2VybmVsIHNwYWNlIGlzIGRpZmZlcmVudCAqLworICAgIGlkeCA9IGJjbV9kZXZfbG9nX2dldF9pbmRleF9ieV9pZChsb2dfaWQpOworICAgIGlmIChpZHggPT0gREVWX0xPR19JTlZBTElEX0lOREVYKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgIkNhbid0IG1hcCBsb2dfaWQgdG8gaW5kZXhcbiIpOworICAgIH0KKworICAgIC8qIElnbm9yZSB0aGUgcmVxdWVzdCBpZiBsb2dfaWQgaXMgbm90IGluIHRoZSBrZXJuZWwgKi8KKyAgICBpZiAoaWR4ID4gbWF4X2tlcm5lbF9pZF9pbmRleCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICBpb19wYXJhbS5sZXZlbF9zZXQuaW5kZXggPSBpZHg7CisgICAgaW9fcGFyYW0ubGV2ZWxfc2V0LmxldmVsX3ByaW50ID0gbG9nX2xldmVsX3ByaW50OworICAgIGlvX3BhcmFtLmxldmVsX3NldC5sZXZlbF9zYXZlID0gbG9nX2xldmVsX3NhdmU7CisKKyAgICBpZiAoaW9jdGwoZGV2X2xvZ19maWxlLCBERVZfTE9HX0NIUkRFVl9MRVZFTF9TRVQsICZpb19wYXJhbSkgPT0gLTEpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTywgIkNhbid0IHNldCBsZXZlbCBmb3Iga2VybmVsIGxvZyBpZCAlbHUuIEVycm9yICVzXG4iLCBsb2dfaWQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9iY21vbHRfZGV2X2xvZ19saW51eC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgvYmNtb2x0X2Rldl9sb2dfbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDM2ZTEzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgvYmNtb2x0X2Rldl9sb2dfbGludXguaApAQCAtMCwwICsxLDY5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtX2Rldl9sb2dfbGludXguaAorICoKKyAqIExpbnV4LXNwZWNpZmljIGNvZGUuIFVzZXIgc3BhY2UKKyAqLworCisjaWZuZGVmIEJDTU9MVF9ERVZfTE9HX0xJTlVYX0hfCisjZGVmaW5lIEJDTU9MVF9ERVZfTE9HX0xJTlVYX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorCisvKiogTGludXgtc3BlY2lmaWMgaW5pdCAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfbGludXhfaW5pdCh2b2lkKTsKKworLyoqIExpbnV4LXNwZWNpZmljIGNsZWFudXAgKi8KK3ZvaWQgYmNtX2Rldl9sb2dfbGludXhfZXhpdCh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFic3RyYWN0OiBTZXQgY3VycmVudCBsb2cgdHlwZSBmb3IgYW4gSUQKKyAqCisgKiBccGFyYW1baW5dICAgbG9nX2lkICAgICAgTG9nIGlkCisgKiBccGFyYW1baW5dICAgbG9nX3R5cGUgICAgTG9nIHR5cGUKKyAqCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19saW51eF9pZF9zZXRfdHlwZShkZXZfbG9nX2lkIGxvZ19pZCwgYmNtX2Rldl9sb2dfaWRfdHlwZSBsb2dfdHlwZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBYnN0cmFjdDogU2V0IGN1cnJlbnQgbG9nIGxldmVsIGZvciBhbiBJRAorICoKKyAqIFxwYXJhbVtpbl0gICBsb2dfaWQgICAgICAgICAgTG9nIGlkCisgKiBccGFyYW1baW5dICAgbG9nX2xldmVsX3ByaW50IFByaW50IGxldmVsCisgKiBccGFyYW1baW5dICAgbG9nX2xldmVsX3NhdmUgIFNhdmUgbGV2ZWwKKyAqCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19saW51eF9pZF9zZXRfbGV2ZWwoZGV2X2xvZ19pZCBsb2dfaWQsIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbF9wcmludCwgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsX3NhdmUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2U0MTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsMjQgQEAKKyMgZGV2X2xvZyAtIGtlcm5lbCBzdXBwb3J0CisjCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKworTU9EX05BTUUgPSBkZXZfbG9nX2tlcm5lbAorTU9EX1RZUEUgPSBsaW51eF9saWIKKworaWZlcSAoIiQoRU5BQkxFX0xPRykiLCAieSIpCisKK01PRF9ERUZTID0gLURFTkFCTEVfTE9HCisKK3NyY3MgPSBiY21fZGV2X2xvZy5jIGJjbV9kZXZfbG9nX3Rhc2suYyBiY21vbHRfZGV2X2xvZ19rZXJuZWwuYyAKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorICAgIC1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKKyMgaWZlcSAoIiQoRU5BQkxFX0xPRykiLCAieSIpCitlbmRpZgorCisjIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMDdiNzlhZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZy5jCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2cuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZWQzMDFiZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2cuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ19jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ19jbGkuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hYTMxNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX2NsaS5jCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYzQ0ODBlYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ19jbGkuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX2NsaS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX3Rhc2suYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ190YXNrLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYzRhOGIyYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ190YXNrLmMKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ190YXNrLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfdGFzay5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX3Rhc2suaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45OWFjZDZkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX3Rhc2suaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ190YXNrX2ludGVybmFsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU1NzM4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbW9sdF9kZXZfbG9nX2lvY3RsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtb2x0X2Rldl9sb2dfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM1MzZjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbW9sdF9kZXZfbG9nX2lvY3RsLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PTFRfREVWX0xPR19JT0NUTF9IXworI2RlZmluZSBCQ01PTFRfREVWX0xPR19JT0NUTF9IXworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisKKyNkZWZpbmUgREVWX0xPR19DSFJERVZfTUFYX0tFUk5FTF9JRFMgICAzMgorCisvKiBJRCBkZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCBkZXZfbG9nX2lkX2luZm8KK3sKKyAgICB1aW50MzJfdCBpbmRleDsKKyAgICBjaGFyIG5hbWVbTUFYX0RFVl9MT0dfSURfTkFNRSArIDFdOworICAgIGJjbV9kZXZfbG9nX2xldmVsIGRlZmF1bHRfbGV2ZWw7CisgICAgYmNtX2Rldl9sb2dfaWRfdHlwZSBkZWZhdWx0X3R5cGU7Cit9IGRldl9sb2dfaWRfaW5mbzsKKworLyogaW9jdGwgcGFyYW1ldGVycyAqLwordHlwZWRlZiB1bmlvbiBkZXZfbG9nX2lvX3BhcmFtCit7CisgICAgc3RydWN0CisgICAgeworICAgICAgICBpbnQgbnVtX2lkczsKKyAgICAgICAgZGV2X2xvZ19pZF9pbmZvIGlkc1tERVZfTE9HX0NIUkRFVl9NQVhfS0VSTkVMX0lEU107CisgICAgfSBkYl9yZWFkOworCisgICAgc3RydWN0CisgICAgeworICAgICAgICB1aW50MzJfdCBpbmRleDsKKyAgICAgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbGV2ZWxfcHJpbnQ7CisgICAgICAgIGJjbV9kZXZfbG9nX2xldmVsIGxldmVsX3NhdmU7CisgICAgfSBsZXZlbF9zZXQ7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGluZGV4OworICAgICAgICBiY21fZGV2X2xvZ19pZF90eXBlIHR5cGU7CisgICAgfSB0eXBlX3NldDsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0OworICAgICAgICBjaGFyIG1zZ1tNQVhfREVWX0xPR19TVFJJTkdfU0laRSArIDFdOworICAgIH0gbXNnX3JlYWQ7CisKK30gZGV2X2xvZ19pb19wYXJhbTsKKworLyogVXNlICdTJyBhcyBtYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgREVWX0xPR19DSFJERVZfSU9DX01BR0lDICAnUycKKworI2RlZmluZSBERVZfTE9HX0NIUkRFVl9EQl9SRUFEICAgICAgICAgIF9JT1IoREVWX0xPR19DSFJERVZfSU9DX01BR0lDLCAxLCBkZXZfbG9nX2lvX3BhcmFtKQorI2RlZmluZSBERVZfTE9HX0NIUkRFVl9MRVZFTF9TRVQgICAgICAgIF9JT1coREVWX0xPR19DSFJERVZfSU9DX01BR0lDLCAyLCBkZXZfbG9nX2lvX3BhcmFtKQorI2RlZmluZSBERVZfTE9HX0NIUkRFVl9UWVBFX1NFVCAgICAgICAgIF9JT1coREVWX0xPR19DSFJERVZfSU9DX01BR0lDLCAzLCBkZXZfbG9nX2lvX3BhcmFtKQorI2RlZmluZSBERVZfTE9HX0NIUkRFVl9NU0dfUkVBRCAgICAgICAgIF9JT1IoREVWX0xPR19DSFJERVZfSU9DX01BR0lDLCA0LCBkZXZfbG9nX2lvX3BhcmFtKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19rZXJuZWwuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19rZXJuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzMzNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbW9sdF9kZXZfbG9nX2tlcm5lbC5jCkBAIC0wLDAgKzEsMzI4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPiAgICAgICAvKiBldmVyeXRoaW5nLi4uICovCisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4gICAgLyogT19BQ0NNT0RFICovCisjaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSA8YmNtX2Rldl9sb2dfdGFzay5oPgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfbG9nX2tlcm5lbC5oPgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfbG9nX2lvY3RsLmg+CisKK2ludCBkZXZfbG9nX2NocmRldl9tYWpvciA9IDIxNTsgICAgICAgICAvKiBTaG91bGQgY29tcGx5IHRoZSB2YWx1ZSBpbiB0YXJnZXRzL21ha2VEZXYgKi8KK21vZHVsZV9wYXJhbShkZXZfbG9nX2NocmRldl9tYWpvciwgaW50LCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVdHUlApOworTU9EVUxFX1BBUk1fREVTQyhkZXZfbG9nX2NocmRldl9tYWpvciwgImRldmxvZ19tYWpvciIpOworCitpbnQgZGV2X2xvZ19idWZmZXJfc2l6ZV9rYiA9IDIwNDg7ICAgICAgLyogQnVmZmVyIHNpemUgaW4ga0IgKi8KK21vZHVsZV9wYXJhbShkZXZfbG9nX2J1ZmZlcl9zaXplX2tiLCBpbnQsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl9sb2dfYnVmZmVyX3NpemVfa2IsICJkZXZsb2dfYnVmc2l6ZV9rYiIpOworCitpbnQgZGV2X2xvZ19xdWV1ZV9zaXplID0gMjU2OyAgICAgICAgICAgLyogUXVldWUgc2l6ZSAqLworbW9kdWxlX3BhcmFtKGRldl9sb2dfcXVldWVfc2l6ZSwgaW50LCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVdHUlApOworTU9EVUxFX1BBUk1fREVTQyhkZXZfbG9nX3F1ZXVlX3NpemUsICJkZXZsb2dfcXNpemUiKTsKKworc3RhdGljIGJjbW9zX211dGV4IGRldl9sb2dfbG9jazsKK3N0YXRpYyBpbnQgZGV2X2xvZ19udW1fdXNlcnM7CitzdGF0aWMgY2hhciAqZGV2X2xvZ19idWZmZXI7CisKKy8qCisgKiBPcGVuIGFuZCBjbG9zZQorICovCitzdGF0aWMgaW50IGRldl9sb2dfY2hyZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisgICAgQkNNT1NfVFJBQ0VfREVCVUcoIlxuIik7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmZGV2X2xvZ19sb2NrKTsKKyAgICBpZiAoZGV2X2xvZ19udW1fdXNlcnMgPj0gMSkKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmZGV2X2xvZ19sb2NrKTsKKyAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisgICAgKytkZXZfbG9nX251bV91c2VyczsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmRldl9sb2dfbG9jayk7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkZXZfbG9nX2NocmRldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworICAgIEJDTU9TX1RSQUNFX0RFQlVHKCJcbiIpOworICAgIC0tZGV2X2xvZ19udW1fdXNlcnM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRldl9sb2dfY2hyZGV2X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpmX3BvcykKK3sKKyAgICByZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBsb25nIGRldl9sb2dfY2hyZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICBpbnQgbGludXhfcmMgPSAwOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGRldl9sb2dfaW9fcGFyYW0gaW9fcGFyYW07CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIC8qIGRvbid0IGV2ZW4gZGVjb2RlIHdyb25nIGNtZHM6IGJldHRlciByZXR1cm5pbmcgIEVOT1RUWSB0aGFuIEVGQVVMVCAqLworICAgIGlmIChfSU9DX1RZUEUoY21kKSAhPSBERVZfTE9HX0NIUkRFVl9JT0NfTUFHSUMpCisgICAgICAgIHJldHVybiAtRU5PVFRZOworCisgICAgLyoKKyAgICAgKiB0aGUgdHlwZSBpcyBhIGJpdG1hc2ssIGFuZCBWRVJJRllfV1JJVEUgY2F0Y2hlcyBSL1cKKyAgICAgKiB0cmFuc2ZlcnMuIE5vdGUgdGhhdCB0aGUgdHlwZSBpcyB1c2VyLW9yaWVudGVkLCB3aGlsZQorICAgICAqIHZlcmlmeV9hcmVhIGlzIGtlcm5lbC1vcmllbnRlZCwgc28gdGhlIGNvbmNlcHQgb2YgInJlYWQiIGFuZAorICAgICAqICJ3cml0ZSIgaXMgcmV2ZXJzZWQKKyAgICAgKi8KKyAgICBpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfUkVBRCkKKyAgICAgICAgbGludXhfcmMgPSAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSk7CisgICAgZWxzZSBpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfV1JJVEUpCisgICAgICAgIGxpbnV4X3JjID0gICFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKWFyZywgX0lPQ19TSVpFKGNtZCkpOworICAgIGlmIChsaW51eF9yYykKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICBzd2l0Y2ggKGNtZCkKKyAgICB7CisKKyAgICBjYXNlIERFVl9MT0dfQ0hSREVWX0RCX1JFQUQ6CisgICAgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmNtX2Rldl9sb2dfZ2V0X251bV9vZl9lbnRyaWVzKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGV2X2xvZ19pZF9wYXJtIGlkX3Bhcm0gPSB7fTsKKworICAgICAgICAgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgoaSk7CisgICAgICAgICAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmNtX2Rldl9sb2dfaWRfZ2V0KGlkLCAmaWRfcGFybSk7CisgICAgICAgICAgICBpb19wYXJhbS5kYl9yZWFkLmlkc1tpXS5pbmRleCA9IGk7CisgICAgICAgICAgICBzdHJuY3B5KGlvX3BhcmFtLmRiX3JlYWQuaWRzW2ldLm5hbWUsIGlkX3Bhcm0ubmFtZSwgc2l6ZW9mKGlvX3BhcmFtLmRiX3JlYWQuaWRzW2ldLm5hbWUpKTsKKyAgICAgICAgICAgIGlvX3BhcmFtLmRiX3JlYWQuaWRzW2ldLmRlZmF1bHRfdHlwZSA9IGlkX3Bhcm0uZGVmYXVsdF9sb2dfdHlwZTsKKyAgICAgICAgICAgIGlvX3BhcmFtLmRiX3JlYWQuaWRzW2ldLmRlZmF1bHRfbGV2ZWwgPSBpZF9wYXJtLmRlZmF1bHRfbG9nX2xldmVsOworICAgICAgICAgICAgLyogUmVzZXQgdG8gZGVmYXVsdHMgdG8ga2VlcCBpbiBzeW5jIHdpdGggdGhlIHVzZXIgc3BhY2UgKi8KKyAgICAgICAgICAgIGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbHNfYW5kX3R5cGVfdG9fZGVmYXVsdChpZCk7CisgICAgICAgIH0KKyAgICAgICAgaW9fcGFyYW0uZGJfcmVhZC5udW1faWRzID0gaTsKKyAgICAgICAgbGludXhfcmMgPSBjb3B5X3RvX3VzZXIoKGNoYXIgKilhcmcsIChjaGFyICopJmlvX3BhcmFtLmRiX3JlYWQsIHNpemVvZihpb19wYXJhbS5kYl9yZWFkKSk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBERVZfTE9HX0NIUkRFVl9MRVZFTF9TRVQ6CisgICAgeworICAgICAgICBsaW51eF9yYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyICopJmlvX3BhcmFtLmxldmVsX3NldCwgKGNoYXIgKilhcmcsIHNpemVvZihpb19wYXJhbS5sZXZlbF9zZXQpKTsKKyAgICAgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChpb19wYXJhbS5sZXZlbF9zZXQuaW5kZXgpOworICAgICAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoImxvZ19pZCBpbmRleCAldSBpcyBpbnZhbGlkXG4iLCBpb19wYXJhbS5sZXZlbF9zZXQuaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJjID0gYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsKGlkLCBpb19wYXJhbS5sZXZlbF9zZXQubGV2ZWxfcHJpbnQsIGlvX3BhcmFtLmxldmVsX3NldC5sZXZlbF9zYXZlKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoImJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbCglbGQsJWQsJWQpLT4lc1xuIiwKKyAgICAgICAgICAgICAgICAobG9uZylpZCwgKGludClpb19wYXJhbS5sZXZlbF9zZXQubGV2ZWxfcHJpbnQsIChpbnQpaW9fcGFyYW0ubGV2ZWxfc2V0LmxldmVsX3NhdmUsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICBsaW51eF9yYyA9IC1FSU5WQUw7CisgICAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIERFVl9MT0dfQ0hSREVWX1RZUEVfU0VUOgorICAgIHsKKyAgICAgICAgbGludXhfcmMgPSBjb3B5X2Zyb21fdXNlcigoY2hhciAqKSZpb19wYXJhbS50eXBlX3NldCwgKGNoYXIgKilhcmcsIHNpemVvZihpb19wYXJhbS50eXBlX3NldCkpOworICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIE1hcCBpbmRleCB0byBsb2cgaWQgKi8KKyAgICAgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgoaW9fcGFyYW0udHlwZV9zZXQuaW5kZXgpOworICAgICAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoImxvZ19pZCBpbmRleCAldSBpcyBpbnZhbGlkXG4iLCBpb19wYXJhbS50eXBlX3NldC5pbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBiY21fZGV2X2xvZ19pZF9zZXRfdHlwZShpZCwgaW9fcGFyYW0udHlwZV9zZXQudHlwZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJiY21fZGV2X2xvZ19pZF9zZXRfdHlwZSglbGQsJWQpLT4lc1xuIiwKKyAgICAgICAgICAgICAgICAobG9uZylpZCwgKGludClpb19wYXJhbS50eXBlX3NldC50eXBlLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAgICAgbGludXhfcmMgPSAtRUlOVkFMOworICAgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBERVZfTE9HX0NIUkRFVl9NU0dfUkVBRDoKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGJ1Zl9sZW4gPSBzaXplb2YoaW9fcGFyYW0ubXNnX3JlYWQubXNnKTsKKyAgICAgICAgYmNtX2Rldl9sb2dfZmlsZSAqbG9nX2ZpbGUgPSBiY21fZGV2X2xvZ19maWxlX2dldCgwKTsKKworICAgICAgICBpZiAoIWxvZ19maWxlKQorICAgICAgICB7CisgICAgICAgICAgICBsaW51eF9yYyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGxpbnV4X3JjID0gY29weV9mcm9tX3VzZXIoKGNoYXIgKikmaW9fcGFyYW0ubXNnX3JlYWQsIChjaGFyICopYXJnLCBzaXplb2YoaW9fcGFyYW0ubXNnX3JlYWQub2Zmc2V0KSk7CisgICAgICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICByYyA9IGJjbV9kZXZfbG9nX2ZpbGVfcmVhZChsb2dfZmlsZSwgJmlvX3BhcmFtLm1zZ19yZWFkLm9mZnNldCwgaW9fcGFyYW0ubXNnX3JlYWQubXNnLCBidWZfbGVuKTsKKyAgICAgICAgaWYgKHJjIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyYyA9PSAwKQorICAgICAgICAgICAgICAgIGxpbnV4X3JjID0gLUVBR0FJTjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsaW51eF9yYyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBsaW51eF9yYyA9IGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgKGNoYXIgKikmaW9fcGFyYW0ubXNnX3JlYWQsCisgICAgICAgICAgICBvZmZzZXRvZihkZXZfbG9nX2lvX3BhcmFtLCBtc2dfcmVhZC5tc2cpICsgcmMpOworICAgIH0KKyAgICBicmVhazsKKworICAgIGRlZmF1bHQ6ICAvKiByZWR1bmRhbnQsIGFzIGNtZCB3YXMgY2hlY2tlZCBhZ2FpbnN0IE1BWE5SICovCisgICAgICAgIHJjID0gLUVOT1RUWTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGxpbnV4X3JjOworfQorCisvKgorICogVGhlIGZvcHMKKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2X2xvZ19jaHJkZXZfZm9wcyA9Cit7CisgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisgICAgLm9wZW4gPSBkZXZfbG9nX2NocmRldl9vcGVuLAorICAgIC5yZWxlYXNlID0gZGV2X2xvZ19jaHJkZXZfcmVsZWFzZSwKKyAgICAud3JpdGUgPSBkZXZfbG9nX2NocmRldl93cml0ZSwKKyAgICAudW5sb2NrZWRfaW9jdGwgPSBkZXZfbG9nX2NocmRldl9pb2N0bAorfTsKKworc3RhdGljIHN0cnVjdCBjZGV2IGRldl9sb2dfY2hyZGV2X2NkZXY7CitzdGF0aWMgaW50IGlzX2NocmRldl9yZWcsIGlzX2NkZXZfYWRkOworCitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2xvZ19jaHJkZXZfaW5pdCh2b2lkKQoreworICAgIGRldl90IGRldiA9IE1LREVWKGRldl9sb2dfY2hyZGV2X21ham9yLCAwKTsKKyAgICBpbnQgbGludXhfcmM7CisKKyAgICBpc19jaHJkZXZfcmVnID0gMDsKKyAgICBpc19jZGV2X2FkZCA9IDA7CisgICAgLyoKKyAgICAgKiBSZWdpc3RlciB5b3VyIG1ham9yLCBhbmQgYWNjZXB0IGEgZHluYW1pYyBudW1iZXIuCisgICAgICovCisgICAgaWYgKCFkZXZfbG9nX2NocmRldl9tYWpvcikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGxpbnV4X3JjID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIDAsICJkZXZfbG9nIik7CisgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0lPLCAicmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbigpLT4lZFxuIiwgbGludXhfcmMpOworICAgIH0KKyAgICBpc19jaHJkZXZfcmVnID0gMTsKKworICAgIGNkZXZfaW5pdCgmZGV2X2xvZ19jaHJkZXZfY2RldiwgJmRldl9sb2dfY2hyZGV2X2ZvcHMpOworICAgIGxpbnV4X3JjID0gY2Rldl9hZGQoJmRldl9sb2dfY2hyZGV2X2NkZXYsIGRldiwgMSk7CisgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0lPLCAiY2Rldl9hZGQoKS0+JWRcbiIsIGxpbnV4X3JjKTsKKyAgICB9CisgICAgaXNfY2Rldl9hZGQgPSAxOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9sb2dfY2hyZGV2X2V4aXQodm9pZCkKK3sKKyAgICBpZiAoaXNfY2Rldl9hZGQpCisgICAgICAgIGNkZXZfZGVsKCZkZXZfbG9nX2NocmRldl9jZGV2KTsKKyAgICBpZiAoaXNfY2hyZGV2X3JlZykKKyAgICAgICAgdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKGRldl9sb2dfY2hyZGV2X21ham9yLCAwKSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZGV2X2xvZ190aW1lX3RvX3N0cl9jYih1aW50MzJfdCB0aW1lX3N0YW1wLCBjaGFyICp0aW1lX3N0ciwgaW50IHRpbWVfc3RyX3NpemUpCit7CisgICAgcmV0dXJuIHNucHJpbnRmKHRpbWVfc3RyLCB0aW1lX3N0cl9zaXplLCAiJXUiLCB0aW1lX3N0YW1wIC8gMTAwMCk7IC8qIENvbnZlcnQgZnJvbSB1c2VjIHRvIG1zZWMuICovCit9CisKKy8qKiBJbml0aWFsaXplIGRldl9sb2cgbGludXgga2VybmVsIHN1cHBvcnQgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2xpbnV4X2luaXQodm9pZCkKK3sKKyAgICB2b2lkICphZGRyZXNzZXNbMV07CisgICAgdWludDMyX3Qgc2l6ZXNbMV0gPSB7IGRldl9sb2dfYnVmZmVyX3NpemVfa2IgKiAxMDI0IH07CisgICAgdWludDMyX3QgZmxhZ3NbMV0gPSB7IEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19XUkFQX0FST1VORCB9OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKCFkZXZfbG9nX3F1ZXVlX3NpemUgfHwgIWRldl9sb2dfYnVmZmVyX3NpemVfa2IpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICByYyA9IGRldl9sb2dfY2hyZGV2X2luaXQoKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybiByYzsKKworICAgIC8qIEluaXRpYWxpemUgbG9nZ2VyICovCisgICAgZGV2X2xvZ19idWZmZXIgPSB2bWFsbG9jKGRldl9sb2dfYnVmZmVyX3NpemVfa2IgKiAxMDI0KTsKKyAgICBpZiAoIWRldl9sb2dfYnVmZmVyKQorICAgIHsKKyAgICAgICAgZGV2X2xvZ19jaHJkZXZfZXhpdCgpOworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGFsbG9jYXRlIGRldl9sb2cgYnVmZmVyICglZCBieXRlcylcbiIsIGRldl9sb2dfYnVmZmVyX3NpemVfa2IgKiAxMDI0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorICAgIGFkZHJlc3Nlc1swXSA9IGRldl9sb2dfYnVmZmVyOworICAgIHJjID0gYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcihhZGRyZXNzZXMsIHNpemVzLCBmbGFncywgQkNNX1NJWkVPRkFSUkFZKGFkZHJlc3NlcyksIDB4NDAwMCwgVEFTS19QUklPUklUWV9ERVZfTE9HLCBkZXZfbG9nX3F1ZXVlX3NpemUpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGRldl9sb2dfY2hyZGV2X2V4aXQoKTsKKyAgICAgICAgdmZyZWUoZGV2X2xvZ19idWZmZXIpOworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkZhaWxlZCB0byBjcmVhdGUgbG9nZ2VyLiBFcnJvciAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGJjbV9kZXZfbG9nX3NldF90aW1lX3RvX3N0cl9jYihkZXZfbG9nX3RpbWVfdG9fc3RyX2NiKTsKKworICAgIGJjbW9zX211dGV4X2NyZWF0ZSgmZGV2X2xvZ19sb2NrLCAwLCBOVUxMKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogQ2xlYW4tdXAgZGV2X2xvZyBsaW51eCBrZXJuZWwgc3VwcG9ydCAqLwordm9pZCBiY21fZGV2X2xvZ19saW51eF9leGl0KHZvaWQpCit7CisgICAgZGV2X2xvZ19jaHJkZXZfZXhpdCgpOworICAgIGlmIChkZXZfbG9nX2J1ZmZlcikKKyAgICB7CisgICAgICAgIHZmcmVlKGRldl9sb2dfYnVmZmVyKTsKKyAgICB9CisgICAgYmNtb3NfbXV0ZXhfZGVzdHJveSgmZGV2X2xvZ19sb2NrKTsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19rZXJuZWwuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19rZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWVlM2MxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbW9sdF9kZXZfbG9nX2tlcm5lbC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX0RFVl9MT0dfS0VSTkVMX0hfCisjZGVmaW5lIEJDTU9MVF9ERVZfTE9HX0tFUk5FTF9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisKKy8qKiBJbml0aWFsaXplIGRldl9sb2cgbGludXgga2VybmVsIHN1cHBvcnQgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2xpbnV4X2luaXQodm9pZCk7CisKKy8qKiBDbGVhbi11cCBkZXZfbG9nIGxpbnV4IGtlcm5lbCBzdXBwb3J0ICovCit2b2lkIGJjbV9kZXZfbG9nX2xpbnV4X2V4aXQodm9pZCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2aWNlX3NlbGVjdG9yL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2RldmljZV9zZWxlY3Rvci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI0ZjIyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2RldmljZV9zZWxlY3Rvci9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMgQ3VycmVudCBkZXZpb2NlIHNlbGVjdG9yCisjCitNT0RfTkFNRSA9IGRldmljZV9zZWxlY3RvcgorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gY29tbW9uX2FwaSBtb2RlbCBjbGkKK3NyY3MgPSBiY21vbHRfZGV2X3NlbGVjdG9yLmMKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZpY2Vfc2VsZWN0b3IvYmNtb2x0X2Rldl9zZWxlY3Rvci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2RldmljZV9zZWxlY3Rvci9iY21vbHRfZGV2X3NlbGVjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NTM4MwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZpY2Vfc2VsZWN0b3IvYmNtb2x0X2Rldl9zZWxlY3Rvci5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtb2x0X2Rldl9zZWxlY3Rvci5jCisgKiBTZXQgLyBnZXQgY3VycmVudCBkZXZpY2UgZm9yIGFsbCBDTEkgY29tbWFuZHMKKyAqLworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfc2VsZWN0b3IuaD4KKworLyogQ3VycmVudCBkZXZpY2UuIEV4dGVybmFsIHZhcmlhYmxlICovCisKKy8qIERldmljZSBjaGFuZ2UgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgZGV2X3NlbF9zdWJzY3JpYmVyIGRldl9zZWxfc3Vic2NyaWJlcjsKK3N0cnVjdCBkZXZfc2VsX3N1YnNjcmliZXIKK3sKKyAgICBGX2N1cnJlbnRfZGV2aWNlX2NoYW5nZV9pbmQgY2I7ICAgICAvKiBTdWJzY3JpYmVyJ3MgY2FsbGJhY2sgKi8KKyAgICBTVEFJTFFfRU5UUlkoZGV2X3NlbF9zdWJzY3JpYmVyKSBuZXh0OworfTsKKworc3RhdGljIFNUQUlMUV9IRUFEKGRldl9zZWxfc3Vic2NyaWJlcl9saXN0LCBkZXZfc2VsX3N1YnNjcmliZXIpIHN1YnNjcmliZXJfbGlzdDsKKworLyogR2V0L3NldCB0aGUgY3VycmVudCBkZXZpY2UgQ0xJIGhhbmRsZXIKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9kZXZfc2VsX2RldmljZV9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgLyogSWYgY3VycmVudCBkZXZpY2Ugd2FzIHNldCAtIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMuCisgICAgICogRG8gbm90IGNoZWNrIGlmIGl0IGNoYW5nZWQgaGVyZS4gU29tZXRpbWVzIGl0IGlzIGdvb2QgdG8gYmUgYWJsZQorICAgICAqIHRvIHJlZnJlc2guCisgICAgICovCisgICAgaWYgKG5wYXJtcykKKyAgICB7CisgICAgICAgIGRldl9zZWxfc3Vic2NyaWJlciAqc3ViczsKKworICAgICAgICBjdXJyZW50X2RldmljZSA9IHBhcm1bMF0udmFsdWUubnVtYmVyOworCisgICAgICAgIC8qIE5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgKi8KKyAgICAgICAgU1RBSUxRX0ZPUkVBQ0goc3VicywgJnN1YnNjcmliZXJfbGlzdCwgbmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3Vicy0+Y2Ioc2Vzc2lvbiwgY3VycmVudF9kZXZpY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkN1cnJlbnQgZGV2aWNlOiAlbGRcbiIsIChsb25nKWN1cnJlbnRfZGV2aWNlKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qIFJlZ2lzdGVyIGZvciBjdXJyZW50IGRldmljZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLgorICogTXVsdGlwbGUgY2xpZW50cyBjYW4gcmVnaXN0ZXIuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfc2VsX2luZF9yZWdpc3RlcihGX2N1cnJlbnRfZGV2aWNlX2NoYW5nZV9pbmQgY2IpCit7CisgICAgZGV2X3NlbF9zdWJzY3JpYmVyICpzdWJzID0gYmNtb3NfY2FsbG9jKHNpemVvZihkZXZfc2VsX3N1YnNjcmliZXIpKTsKKworICAgIGlmICghc3VicykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisKKyAgICBzdWJzLT5jYiA9IGNiOworICAgIFNUQUlMUV9JTlNFUlRfVEFJTCgmc3Vic2NyaWJlcl9saXN0LCBzdWJzLCBuZXh0KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBJbml0aWFsaXplIGRldmljZSBzZWxlY3RvciBtb2R1bGUgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfc2VsX2luaXQoYmNtY2xpX2VudHJ5ICpwYXJlbnRfZGlyKQoreworICAgIFNUQUlMUV9JTklUKCZzdWJzY3JpYmVyX2xpc3QpOworCisgICAgLyogR2V0L3NldCBjdXJyZW50IGRldmljZSAqLworICAgIEJDTUNMSV9NQUtFX0NNRChwYXJlbnRfZGlyLCAiZGV2aWNlIiwgIkdldC9TZXQgdGhlIGN1cnJlbnQgZGV2aWNlIiwgX2Rldl9zZWxfZGV2aWNlX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICAwLCBCQ01UUl9NQVhfT0xUUy0xKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2aWNlX3NlbGVjdG9yL2JjbW9sdF9kZXZfc2VsZWN0b3IuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZpY2Vfc2VsZWN0b3IvYmNtb2x0X2Rldl9zZWxlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZGZiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2aWNlX3NlbGVjdG9yL2JjbW9sdF9kZXZfc2VsZWN0b3IuaApAQCAtMCwwICsxLDUzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtb2x0X2Rldl9zZWxlY3Rvci5oCisgKiBTZXQgLyBnZXQgY3VycmVudCBkZXZpY2UgZm9yIGFsbCBDTEkgY29tbWFuZHMKKyAqLworCisjaWZuZGVmIF9CQ01PTFRfREVWX1NFTEVDVE9SX0hfCisjZGVmaW5lIF9CQ01PTFRfREVWX1NFTEVDVE9SX0hfCisKKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKworLyogQ3VycmVudCBkZXZpY2UgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjayAqLwordHlwZWRlZiB2b2lkICgqRl9jdXJyZW50X2RldmljZV9jaGFuZ2VfaW5kKShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X2RldmlkIGRldik7CisKKy8qIFJlZ2lzdGVyIGZvciBjdXJyZW50IGRldmljZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLgorICogTXVsdGlwbGUgY2xpZW50cyBjYW4gcmVnaXN0ZXIuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfc2VsX2luZF9yZWdpc3RlcihGX2N1cnJlbnRfZGV2aWNlX2NoYW5nZV9pbmQgY2IpOworCisvKiBJbml0aWFsaXplIGRldmljZSBzZWxlY3RvciBtb2R1bGUgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfc2VsX2luaXQoYmNtY2xpX2VudHJ5ICpwYXJlbnRfZGlyKTsKKworCisjZW5kaWYgLyogX0JDTU9MVF9ERVZfU0VMRUNUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9saW5lbm9pc2UvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTFmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjIgQEAKKyMgbGluZW5vaXNlIC0gc2ltcGxlIGxpbmUgZWRpdGluZyBsaWJyYXJ5CisjIHNob3VsZCB3b3JrIG9uIGFueSBWVC0xMDAtY29tcGF0aWJsZSB0ZXJtaW5hbAorTU9EX05BTUUgPSBsaW5lbm9pc2UKK01PRF9UWVBFID0gbGliCitNT0RfREVGUyA9IC1EQ09ORklHX0xJTkVOT0lTRSAtRENPTkZJR19FRElUTElORQorCitzcmNzID0gbGluZW5vaXNlLmMKKworIyBUaGUgZm9sbG93aW5nIGRlZmluZXMgc2hvdWxkIGJlIHNldCBmb3IgT1MgdGhhdCBkb2Vzbid0IGhhdmUgc3VwcG9ydCBmb3IgdHR5IGFuZC9vciBmaWxlIElPCitMSU5FTk9JU0VfRElTQUJMRV9JT0NUTCA/PSBuCitMSU5FTk9JU0VfRElTQUJMRV9URVJNSU9TID89IG4KK0xJTkVOT0lTRV9ESVNBQkxFX0hJU1RfU0FWRSA/PSBuCisKK2lmZXEgKCIkKExJTkVOT0lTRV9ESVNBQkxFX0lPQ1RMKSIsICJ5IikKKyAgICBFWFRSQV9ERUZJTkVTICs9IC1ETElORU5PSVNFX0RJU0FCTEVfSU9DVEwKK2VuZGlmCitpZmVxICgiJChMSU5FTk9JU0VfRElTQUJMRV9URVJNSU9TKSIsICJ5IikKKyAgICBFWFRSQV9ERUZJTkVTICs9IC1ETElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUworZW5kaWYKK2lmZXEgKCIkKExJTkVOT0lTRV9ESVNBQkxFX0hJU1RfU0FWRSkiLCAieSIpCisgICAgRVhUUkFfREVGSU5FUyArPSAtRExJTkVOT0lTRV9ESVNBQkxFX0hJU1RfU0FWRQorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9saW5lbm9pc2UvbGluZW5vaXNlLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL2xpbmVub2lzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTJhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL2xpbmVub2lzZS5jCkBAIC0wLDAgKzEsMTM1OCBAQAorLyogbGluZW5vaXNlLmMgLS0gZ3VlcnJpbGxhIGxpbmUgZWRpdGluZyBsaWJyYXJ5IGFnYWluc3QgdGhlIGlkZWEgdGhhdCBhCisgKiBsaW5lIGVkaXRpbmcgbGliIG5lZWRzIHRvIGJlIDIwLDAwMCBsaW5lcyBvZiBDIGNvZGUuCisgKgorICogWW91IGNhbiBmaW5kIHRoZSBsYXRlc3Qgc291cmNlIGNvZGUgYXQ6CisgKgorICogICBodHRwOi8vZ2l0aHViLmNvbS9hbnRpcmV6L2xpbmVub2lzZQorICoKKyAqIERvZXMgYSBudW1iZXIgb2YgY3JhenkgYXNzdW1wdGlvbnMgdGhhdCBoYXBwZW4gdG8gYmUgdHJ1ZSBpbiA5OS45OTk5JSBvZgorICogdGhlIDIwMTAgVU5JWCBjb21wdXRlcnMgYXJvdW5kLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEzLCBTYWx2YXRvcmUgU2FuZmlsaXBwbyA8YW50aXJleiBhdCBnbWFpbCBkb3QgY29tPgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTMsIFBpZXRlciBOb29yZGh1aXMgPHBjbm9vcmRodWlzIGF0IGdtYWlsIGRvdCBjb20+CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgKiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICogIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogUmVmZXJlbmNlczoKKyAqIC0gaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy5odG1sCisgKiAtIGh0dHA6Ly93d3cuM3dheWxhYnMuY29tL253L1dXVy9wcm9kdWN0cy93aXpjb24vdnQyMjAuaHRtbAorICoKKyAqIFRvZG8gbGlzdDoKKyAqIC0gRmlsdGVyIGJvZ3VzIEN0cmwrPGNoYXI+IGNvbWJpbmF0aW9ucy4KKyAqIC0gV2luMzIgc3VwcG9ydAorICoKKyAqIEJsb2F0OgorICogLSBIaXN0b3J5IHNlYXJjaCBsaWtlIEN0cmwrciBpbiByZWFkbGluZT8KKyAqCisgKiBMaXN0IG9mIGVzY2FwZSBzZXF1ZW5jZXMgdXNlZCBieSB0aGlzIHByb2dyYW0sIHdlIGRvIGV2ZXJ5dGhpbmcganVzdAorICogd2l0aCB0aHJlZSBzZXF1ZW5jZXMuIEluIG9yZGVyIHRvIGJlIHNvIGNoZWFwIHdlIG1heSBoYXZlIHNvbWUKKyAqIGZsaWNrZXJpbmcgZWZmZWN0IHdpdGggc29tZSBzbG93IHRlcm1pbmFsLCBidXQgdGhlIGxlc3NlciBzZXF1ZW5jZXMKKyAqIHRoZSBtb3JlIGNvbXBhdGlibGUuCisgKgorICogQ0hBIChDdXJzb3IgSG9yaXpvbnRhbCBBYnNvbHV0ZSkKKyAqICAgIFNlcXVlbmNlOiBFU0MgWyBuIEcKKyAqICAgIEVmZmVjdDogbW92ZXMgY3Vyc29yIHRvIGNvbHVtbiBuCisgKgorICogRUwgKEVyYXNlIExpbmUpCisgKiAgICBTZXF1ZW5jZTogRVNDIFsgbiBLCisgKiAgICBFZmZlY3Q6IGlmIG4gaXMgMCBvciBtaXNzaW5nLCBjbGVhciBmcm9tIGN1cnNvciB0byBlbmQgb2YgbGluZQorICogICAgRWZmZWN0OiBpZiBuIGlzIDEsIGNsZWFyIGZyb20gYmVnaW5uaW5nIG9mIGxpbmUgdG8gY3Vyc29yCisgKiAgICBFZmZlY3Q6IGlmIG4gaXMgMiwgY2xlYXIgZW50aXJlIGxpbmUKKyAqCisgKiBDVUYgKENVcnNvciBGb3J3YXJkKQorICogICAgU2VxdWVuY2U6IEVTQyBbIG4gQworICogICAgRWZmZWN0OiBtb3ZlcyBjdXJzb3IgZm9yd2FyZCBvZiBuIGNoYXJzCisgKgorICogV2hlbiBtdWx0aSBsaW5lIG1vZGUgaXMgZW5hYmxlZCwgd2UgYWxzbyB1c2UgYW4gYWRkaXRpb25hbCBlc2NhcGUKKyAqIHNlcXVlbmNlLiBIb3dldmVyIG11bHRpIGxpbmUgZWRpdGluZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorICoKKyAqIENVVSAoQ3Vyc29yIFVwKQorICogICAgU2VxdWVuY2U6IEVTQyBbIG4gQQorICogICAgRWZmZWN0OiBtb3ZlcyBjdXJzb3IgdXAgb2YgbiBjaGFycy4KKyAqCisgKiBDVUQgKEN1cnNvciBEb3duKQorICogICAgU2VxdWVuY2U6IEVTQyBbIG4gQgorICogICAgRWZmZWN0OiBtb3ZlcyBjdXJzb3IgZG93biBvZiBuIGNoYXJzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gY2xlYXIgdGhlIHNjcmVlbjogRVNDIFsgSCBFU0MgWyAyIEoKKyAqIFRoaXMgaXMgYWN0dWFsbHkgY29tcG9zZWQgb2YgdHdvIHNlcXVlbmNlczoKKyAqCisgKiBjdXJzb3Job21lCisgKiAgICBTZXF1ZW5jZTogRVNDIFsgSAorICogICAgRWZmZWN0OiBtb3ZlcyB0aGUgY3Vyc29yIHRvIHVwcGVyIGxlZnQgY29ybmVyCisgKgorICogRUQyIChDbGVhciBlbnRpcmUgc2NyZWVuKQorICogICAgU2VxdWVuY2U6IEVTQyBbIDIgSgorICogICAgRWZmZWN0OiBjbGVhciB0aGUgd2hvbGUgc2NyZWVuCisgKgorICovCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaWZuZGVmIExJTkVOT0lTRV9ESVNBQkxFX1RFUk1JT1MKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjZW5kaWYKKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfSU9DVEwKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorI2luY2x1ZGUgImxpbmVub2lzZS5oIgorCisjaWZuZGVmIFNURElOX0ZJTEVOTworI2RlZmluZSBTVERJTl9GSUxFTk8gIDAKKyNlbmRpZgorCisjaWZuZGVmIFNURE9VVF9GSUxFTk8KKyNkZWZpbmUgU1RET1VUX0ZJTEVOTyAxCisjZW5kaWYKKworI2RlZmluZSBMSU5FTk9JU0VfREVGQVVMVF9ISVNUT1JZX01BWF9MRU4gMTAwCisjZGVmaW5lIExJTkVOT0lTRV9NQVhfTElORSA0MDk2CisKKy8qIFRoZSBsaW5lbm9pc2VTdGF0ZSBzdHJ1Y3R1cmUgcmVwcmVzZW50cyB0aGUgc3RhdGUgZHVyaW5nIGxpbmUgZWRpdGluZy4KKyAqIFdlIHBhc3MgdGhpcyBzdGF0ZSB0byBmdW5jdGlvbnMgaW1wbGVtZW50aW5nIHNwZWNpZmljIGVkaXRpbmcKKyAqIGZ1bmN0aW9uYWxpdGllcy4gKi8KK3N0cnVjdCBsaW5lbm9pc2VTdGF0ZSB7CisgICAgbG9uZyBpZmQ7ICAgICAgICAgICAvKiBUZXJtaW5hbCBzdGRpbiBmaWxlIGRlc2NyaXB0b3IuICovCisgICAgY2hhciAqYnVmOyAgICAgICAgICAvKiBFZGl0ZWQgbGluZSBidWZmZXIuICovCisgICAgaW50IGJ1ZmxlbjsgICAgICAgICAvKiBFZGl0ZWQgbGluZSBidWZmZXIgc2l6ZS4gKi8KKyAgICBjb25zdCBjaGFyICpwcm9tcHQ7IC8qIFByb21wdCB0byBkaXNwbGF5LiAqLworICAgIGludCBwbGVuOyAgICAgICAgICAgLyogUHJvbXB0IGxlbmd0aC4gKi8KKyAgICBpbnQgcG9zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLiAqLworICAgIGludCBvbGRwb3M7ICAgICAgICAgLyogUHJldmlvdXMgcmVmcmVzaCBjdXJzb3IgcG9zaXRpb24uICovCisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBDdXJyZW50IGVkaXRlZCBsaW5lIGxlbmd0aC4gKi8KKyAgICBpbnQgY29sczsgICAgICAgICAgIC8qIE51bWJlciBvZiBjb2x1bW5zIGluIHRlcm1pbmFsLiAqLworICAgIGludCBtYXhyb3dzOyAgICAgICAgLyogTWF4aW11bSBudW0gb2Ygcm93cyB1c2VkIHNvIGZhciAobXVsdGlsaW5lIG1vZGUpICovCisgICAgaW50IGhpc3RvcnlfaW5kZXg7ICAvKiBUaGUgaGlzdG9yeSBpbmRleCB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmcuICovCit9OworCisvKiBTZXNzaW9uICovCitzdHJ1Y3QgbGluZW5vaXNlU2Vzc2lvbiB7CisgICAgc3RydWN0IGxpbmVub2lzZVNlc3Npb24gKm5leHQ7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlIHN0YXRlOworICAgIGxpbmVub2lzZVNlc3Npb25JTyBpbzsKKyAgICBsaW5lbm9pc2VDb21wbGV0aW9uQ2FsbGJhY2sgKmNvbXBsZXRpb25DYWxsYmFjazsKKyAgICBjaGFyICpyZWFkX2FoZWFkX2J1ZjsKKyAgICBpbnQgcmVhZF9haGVhZF9wb3M7CisgICAgaW50IGhpc3RvcnlfbWF4X2xlbjsKKyAgICBpbnQgaGlzdG9yeV9sZW47CisgICAgY2hhciAqKmhpc3Rvcnk7CisgICAgaW50IG1sbW9kZTsgICAgICAgICAvKiBNdWx0aSBsaW5lIG1vZGUuIERlZmF1bHQgaXMgc2luZ2xlIGxpbmUuICovCisgICAgaW50IHJhd21vZGU7ICAgICAgICAvKiBGb3IgYXRleGl0KCkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgcmVzdG9yZSBpcyBuZWVkZWQqLworI2lmbmRlZiBMSU5FTk9JU0VfRElTQUJMRV9URVJNSU9TCisgICAgc3RydWN0IHRlcm1pb3Mgb3JpZ190ZXJtaW9zOyAvKiBJbiBvcmRlciB0byByZXN0b3JlIGF0IGV4aXQuKi8KKyNlbmRpZgorICAgIGludCBkdW1iX3Rlcm1pbmFsOworICAgIGludCBmb3JjZWRfZHVtYjsKKyAgICBpbnQgbmNvbHJlcXM7ICAgICAgICAvKiBPdXRzdGFuZGlnZSBnZXQgY29sdW1ucyByZXF1ZXN0cyAqLworICAgIHZvaWQgKnNlc3Npb25fZGF0YTsKK307CisKK2VudW0gS0VZX0FDVElPTnsKKyAgICBLRVlfTlVMTCA9IDAsCS8qIE5VTEwgKi8KKyAgICBDVFJMX0EgPSAxLCAgICAgICAgIC8qIEN0cmwrYSAqLworICAgIENUUkxfQiA9IDIsICAgICAgICAgLyogQ3RybC1iICovCisgICAgQ1RSTF9DID0gMywgICAgICAgICAvKiBDdHJsLWMgKi8KKyAgICBDVFJMX0QgPSA0LCAgICAgICAgIC8qIEN0cmwtZCAqLworICAgIENUUkxfRSA9IDUsICAgICAgICAgLyogQ3RybC1lICovCisgICAgQ1RSTF9GID0gNiwgICAgICAgICAvKiBDdHJsLWYgKi8KKyAgICBDVFJMX0ggPSA4LCAgICAgICAgIC8qIEN0cmwtaCAqLworICAgIEtFWV9UQUIgPSA5LCAgICAgICAgLyogVGFiICovCisgICAgQ1RSTF9LID0gMTEsICAgICAgICAvKiBDdHJsK2sgKi8KKyAgICBDVFJMX0wgPSAxMiwgICAgICAgIC8qIEN0cmwrbCAqLworICAgIEtFWV9MRiA9IDEwLCAgICAgICAgLyogRW50ZXI6IFxuICovCisgICAgS0VZX0NSID0gMTMsICAgICAgICAvKiBFbnRlcjogXHIgKi8KKyAgICBDVFJMX04gPSAxNCwgICAgICAgIC8qIEN0cmwtbiAqLworICAgIENUUkxfUCA9IDE2LCAgICAgICAgLyogQ3RybC1wICovCisgICAgQ1RSTF9UID0gMjAsICAgICAgICAvKiBDdHJsLXQgKi8KKyAgICBDVFJMX1UgPSAyMSwgICAgICAgIC8qIEN0cmwrdSAqLworICAgIENUUkxfVyA9IDIzLCAgICAgICAgLyogQ3RybCt3ICovCisgICAgRVNDID0gMjcsICAgICAgICAgICAvKiBFc2NhcGUgKi8KKyAgICBCQUNLU1BBQ0UgPSAgMTI3ICAgIC8qIEJhY2tzcGFjZSAqLworfTsKKworc3RhdGljIHZvaWQgcmVmcmVzaExpbmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbik7CitzdGF0aWMgdm9pZCBmcmVlSGlzdG9yeShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKTsKK3N0YXRpYyBpbnQgbGluZW5vaXNlUmF3KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgY29uc3QgY2hhciAqcHJvbXB0KTsKKworLyogRGVidWdnaW5nIG1hY3JvLiAqLworLyogI2RlZmluZSBMSU5FTk9JU0VfREVCVUdfTU9ERSAqLworCisjaWZkZWYgTElORU5PSVNFX0RFQlVHX01PREUKKyNkZWZpbmUgbG5kZWJ1ZyhmbXQsIGFyZ3MuLi4pIFwKKyAgICBkbyB7XAorICAgICAgICBiY21vc19wcmludGYoIiVzOiVkICIgZm10LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjI2FyZ3MpO1wKKyAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBsbmRlYnVnKGZtdCwgLi4uKQorI2VuZGlmCisKKworLyogU2Vzc2lvbiBsaXN0LiBUb0RvOiBwcm90ZWN0IHVwZGF0ZSAqLworc3RhdGljIGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb25zOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PSBMb3cgbGV2ZWwgdGVybWluYWwgaGFuZGxpbmcgPT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBTZXQgaWYgdG8gdXNlIG9yIG5vdCB0aGUgbXVsdGkgbGluZSBtb2RlLiAqLwordm9pZCBsaW5lbm9pc2VTZXRNdWx0aUxpbmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgaW50IG1sKSB7CisgICAgc2Vzc2lvbi0+bWxtb2RlID0gbWw7Cit9CisKK2ludCBsaW5lbm9pc2VHZXRNdWx0aUxpbmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHJldHVybiBzZXNzaW9uLT5tbG1vZGU7Cit9CisKK2ludCBsaW5lbm9pc2VHZXREdW1iVGVybWluYWwobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHJldHVybiBzZXNzaW9uLT5kdW1iX3Rlcm1pbmFsOworfQorCisvKiBSYXcgbW9kZTogMTk2MCBtYWdpYyBzaGl0LiAqLworc3RhdGljIGludCBlbmFibGVSYXdNb2RlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUworICAgIHN0cnVjdCB0ZXJtaW9zIHJhdzsKKworICAgIGlmICh0Y2dldGF0dHIoc2Vzc2lvbi0+c3RhdGUuaWZkLCAmc2Vzc2lvbi0+b3JpZ190ZXJtaW9zKSA9PSAtMSkgZ290byBmYXRhbDsKKworICAgIHJhdyA9IHNlc3Npb24tPm9yaWdfdGVybWlvczsgIC8qIG1vZGlmeSB0aGUgb3JpZ2luYWwgbW9kZSAqLworICAgIC8qIGlucHV0IG1vZGVzOiBubyBicmVhaywgbm8gQ1IgdG8gTkwsIG5vIHBhcml0eSBjaGVjaywgbm8gc3RyaXAgY2hhciwKKyAgICAgKiBubyBzdGFydC9zdG9wIG91dHB1dCBjb250cm9sLiAqLworICAgIHJhdy5jX2lmbGFnICY9IH4oQlJLSU5UIHwgSUdOQlJLIHwgSUNSTkwgfCBJTlBDSyB8IElTVFJJUCB8IElYT04gfCBJWE9GRik7CisKKyAgICAvKiBvdXRwdXQgbW9kZXMgLSBkaXNhYmxlIHBvc3QgcHJvY2Vzc2luZyAqLworICAgIC8qIHJhdy5jX29mbGFnICY9IH4oT1BPU1QpOyAqLworCisgICAgLyogY29udHJvbCBtb2RlcyAtIHNldCA4IGJpdCBjaGFycyAqLworICAgIHJhdy5jX2NmbGFnIHw9IChDUzggLyogfCBJU0lHICovKTsKKworICAgIC8qIGxvY2FsIG1vZGVzIC0gZWNob2luZyBvZmYsIGNhbm9uaWNhbCBvZmYsIG5vIGV4dGVuZGVkIGZ1bmN0aW9ucywKKyAgICAgKiBubyBzaWduYWwgY2hhcnMgKF5aLF5DKSAqLworICAgIHJhdy5jX2xmbGFnICY9IH4oRUNITyB8IElDQU5PTiB8IElFWFRFTik7CisgICAgLyogY29udHJvbCBjaGFycyAtIHNldCByZXR1cm4gY29uZGl0aW9uOiBtaW4gbnVtYmVyIG9mIGJ5dGVzIGFuZCB0aW1lci4KKyAgICAgKiBXZSB3YW50IHJlYWQgdG8gcmV0dXJuIGV2ZXJ5IHNpbmdsZSBieXRlLCB3aXRob3V0IHRpbWVvdXQuICovCisgICAgcmF3LmNfY2NbVk1JTl0gPSAxOyByYXcuY19jY1tWVElNRV0gPSAwOyAvKiAxIGJ5dGUsIG5vIHRpbWVyICovCisKKyAgICAvKiBwdXQgdGVybWluYWwgaW4gcmF3IG1vZGUgYWZ0ZXIgZmx1c2hpbmcgKi8KKyAgICBpZiAodGNzZXRhdHRyKHNlc3Npb24tPnN0YXRlLmlmZCwgVENTQUZMVVNILCAmcmF3KSA8IDApIGdvdG8gZmF0YWw7CisgICAgc2Vzc2lvbi0+cmF3bW9kZSA9IDE7CisgICAgcmV0dXJuIDA7CisKK2ZhdGFsOgorICAgIGVycm5vID0gRU5PVFRZOworICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgc2Vzc2lvbi0+cmF3bW9kZSA9IDE7CisgICAgcmV0dXJuIDA7IC8qIGFzc3VtZSByYXcgbW9kZSAqLworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVSYXdNb2RlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICAvKiBEb24ndCBldmVuIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgYXMgaXQncyB0b28gbGF0ZS4gKi8KKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUworICAgIGlmIChzZXNzaW9uLT5yYXdtb2RlICYmIHRjc2V0YXR0cihzZXNzaW9uLT5zdGF0ZS5pZmQsVENTQUZMVVNILCZzZXNzaW9uLT5vcmlnX3Rlcm1pb3MpICE9IC0xKQorICAgICAgICBzZXNzaW9uLT5yYXdtb2RlID0gMDsKKyNlbmRpZgorfQorCisKKy8qIHdyaXRlIEVTQyBzZXF1ZW5jZSAqLworc3RhdGljIGludCB3cml0ZUVzY1NlcXVlbmNlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKnNlcSwgaW50IHNlcV9sZW4pCit7CisgICAgaW50IG47CisgICAgaWYgKCFzZXFfbGVuKQorICAgICAgICBzZXFfbGVuID0gc3RybGVuKHNlcSk7CisgICAgbiA9IHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgc2VxLCBzZXFfbGVuKTsKKyAgICByZXR1cm4gbjsKK30KKworCisvKiBUcnkgdG8gZ2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgY3VycmVudCB0ZXJtaW5hbCwgb3IgYXNzdW1lIDgwCisgKiBpZiBpdCBmYWlscy4gKi8KK3N0YXRpYyBpbnQgZ2V0Q29sdW1uc1JlcXVlc3QobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfSU9DVEwKKyAgICBzdHJ1Y3Qgd2luc2l6ZSB3czsKKyAgICBpZiAoaW9jdGwoMSwgVElPQ0dXSU5TWiwgJndzKSA9PSAwICYmIHdzLndzX2NvbCAhPSAwKQorICAgIHsKKyAgICAgICAgbC0+Y29scyA9IHdzLndzX2NvbDsKKyAgICB9CisjZW5kaWYKKyAgICB7CisgICAgICAgIC8qIDQgc2VxdWVuY2VzOiBzdG9yZSBwb3NpdGlvbiwgZ28gdG8gcmlnaHQgbWFyZ2luLCByZXF1ZXN0IHBvc2l0aW9uLCByZXN0b3JlIHBvc2l0aW9uLiAqLworICAgICAgICBpZiAod3JpdGVFc2NTZXF1ZW5jZShzZXNzaW9uLCAiXHgxYiIgIjciICJceDFiIiAiWzk5OUMiICJceDFiIiAiWzZuIiAiXHgxYiIgIjgiLCAxNCkgIT0gMTQpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgKytzZXNzaW9uLT5uY29scmVxczsKKyAgICB9CisgICAgcmV0dXJuIGwtPmNvbHM7CisKK2ZhaWxlZDoKKyAgICBsbmRlYnVnKCJnZXRDb2x1bW5zUmVxdWVzdCBmYWlsZWQ6IGNvbHM9ODBcbiIpOworICAgIHJldHVybiA4MDsKK30KKworLyogQ2xlYXIgdGhlIHNjcmVlbi4gVXNlZCB0byBoYW5kbGUgY3RybCtsICovCit2b2lkIGxpbmVub2lzZUNsZWFyU2NyZWVuKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyNpZm5kZWYgTElORU5PSVNFX0RFQlVHX01PREUKKyAgICBpZiAod3JpdGVFc2NTZXF1ZW5jZShzZXNzaW9uLCAiXHgxYltIXHgxYlsySiIsIDcpIDw9IDApIHsKKyAgICAgICAgLyogbm90aGluZyB0byBkbywganVzdCB0byBhdm9pZCB3YXJuaW5nLiAqLworICAgIH0KKyNlbmRpZgorfQorCisvKiBCZWVwLCB1c2VkIGZvciBjb21wbGV0aW9uIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBjb21wbGV0ZSBvciB3aGVuIGFsbAorICogdGhlIGNob2ljZXMgd2VyZSBhbHJlYWR5IHNob3duLiAqLworc3RhdGljIHZvaWQgbGluZW5vaXNlQmVlcCh2b2lkKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJceDciKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKK30KKworc3RhdGljIGludCBsaW5lbm9pc2VEZWZhdWx0UmVhZENoYXIobG9uZyBmZF9pbiwgY2hhciAqYykKK3sKKwlpbnQgbjsKKyAgICBkbyB7CisgICAgICAgIG4gPSByZWFkKGZkX2luLCBjLCAxKTsKKyAgICB9IHdoaWxlKCFuIHx8IChuPT0xICYmICEgKmMpKTsKKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIGludCBsaW5lbm9pc2VEZWZhdWx0V3JpdGUobG9uZyBmZF9vdXQsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgICByZXR1cm4gd3JpdGUoZmRfb3V0LCBidWYsIGxlbik7Cit9CisKK2ludCBsaW5lbm9pc2VTZXNzaW9uT3Blbihjb25zdCBsaW5lbm9pc2VTZXNzaW9uSU8gKmlvLCB2b2lkICpzZXNzaW9uX2RhdGEsIGxpbmVub2lzZVNlc3Npb24gKipzZXNzaW9uKQoreworICAgIGxpbmVub2lzZVNlc3Npb24gKnM7CisgICAgaWYgKCFpbyB8fCAhc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHMgPSBiY21vc19jYWxsb2Moc2l6ZW9mKCpzKSk7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcy0+aGlzdG9yeV9tYXhfbGVuID0gTElORU5PSVNFX0RFRkFVTFRfSElTVE9SWV9NQVhfTEVOOworICAgIHMtPmlvID0gKmlvOworICAgIHMtPmR1bWJfdGVybWluYWwgPSBpby0+ZHVtYl90ZXJtaW5hbDsKKyAgICBzLT5zZXNzaW9uX2RhdGEgPSBzZXNzaW9uX2RhdGE7CisgICAgKnNlc3Npb24gPSBzOworICAgIHMtPm5leHQgPSBzZXNzaW9uczsKKyAgICBzZXNzaW9ucyA9IHM7CisKKyAgICBpZiAoIXMtPmlvLnJlYWRfY2hhcikKKyAgICB7CisgICAgICAgIHMtPmlvLnJlYWRfY2hhciA9IGxpbmVub2lzZURlZmF1bHRSZWFkQ2hhcjsKKyAgICAgICAgaWYgKCFzLT5pby5mZF9pbikKKyAgICAgICAgICAgIHMtPmlvLmZkX2luID0gU1RESU5fRklMRU5POworICAgIH0KKyAgICBpZiAoIXMtPmlvLndyaXRlKQorICAgIHsKKyAgICAgICAgcy0+aW8ud3JpdGUgPSBsaW5lbm9pc2VEZWZhdWx0V3JpdGU7CisgICAgICAgIGlmICghcy0+aW8uZmRfb3V0KQorICAgICAgICAgICAgcy0+aW8uZmRfb3V0ID0gU1RET1VUX0ZJTEVOTzsKKyAgICB9CisKKyAgICAvKiBJVDogdGVtcCAqLworICAgIHMtPm1sbW9kZSA9IDE7CisgICAgcy0+c3RhdGUuaWZkID0gU1RESU5fRklMRU5POworCisgICAgcmV0dXJuIDA7Cit9CisKKwordm9pZCBsaW5lbm9pc2VTZXNzaW9uQ2xvc2UobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBsaW5lbm9pc2VTZXNzaW9uICpzID0gc2Vzc2lvbnMsICpwcmV2PU5VTEw7CisgICAgd2hpbGUgKHMgJiYgcyAhPSBzZXNzaW9uKQorICAgIHsKKyAgICAgICAgcHJldiA9IHM7CisgICAgICAgIHMgPSBzLT5uZXh0OworICAgIH0KKyAgICBpZiAocykKKyAgICB7CisgICAgICAgIGlmIChwcmV2KQorICAgICAgICAgICAgcHJldi0+bmV4dCA9IHMtPm5leHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlc3Npb25zID0gcy0+bmV4dDsKKyAgICAgICAgZGlzYWJsZVJhd01vZGUocyk7CisgICAgICAgIGZyZWVIaXN0b3J5KHMpOworICAgICAgICBpZiAocy0+cmVhZF9haGVhZF9idWYpCisgICAgICAgICAgICBiY21vc19mcmVlKHMtPnJlYWRfYWhlYWRfYnVmKTsKKyAgICAgICAgYmNtb3NfZnJlZShzKTsKKyAgICB9Cit9CisKK3ZvaWQgKmxpbmVub2lzZVNlc3Npb25EYXRhKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICByZXR1cm4gc2Vzc2lvbi0+c2Vzc2lvbl9kYXRhOworfQorCisKK3ZvaWQgbGluZW5vaXNlU2V0RHVtYlRlcm1pbmFsKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGludCBkdW1iKSB7CisgICAgaWYgKCFzZXNzaW9uLT5pby5kdW1iX3Rlcm1pbmFsKQorICAgIHsKKyAgICAgICAgc2Vzc2lvbi0+ZHVtYl90ZXJtaW5hbCA9IGR1bWI7CisgICAgICAgIHNlc3Npb24tPmZvcmNlZF9kdW1iID0gZHVtYjsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb21wbGV0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIFRoaXMgaXMgYW4gaGVscGVyIGZ1bmN0aW9uIGZvciBsaW5lbm9pc2VFZGl0KCkgYW5kIGlzIGNhbGxlZCB3aGVuIHRoZQorICogdXNlciB0eXBlcyB0aGUgPHRhYj4ga2V5IGluIG9yZGVyIHRvIGNvbXBsZXRlIHRoZSBzdHJpbmcgY3VycmVudGx5IGluIHRoZQorICogaW5wdXQuIEl0IGNhbiBjYWxsIGxpbmVub2lzZVNldEJ1ZmZlciBpbiBvcmRlciB0byByZXBsYWNlIHRoZSBjdXJyZW50IGVkaXQgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIGNvbXBsZXRlTGluZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpscyA9ICZzZXNzaW9uLT5zdGF0ZTsKKworICAgIGlmICghc2Vzc2lvbi0+Y29tcGxldGlvbkNhbGxiYWNrKHNlc3Npb24sIGxzLT5idWYsIGxzLT5wb3MpKQorICAgIHsKKyAgICAgICAgbGluZW5vaXNlQmVlcCgpOworICAgIH0KKyAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKK30KKworLyogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIHRhYi1jb21wbGV0aW9uLiAqLwordm9pZCBsaW5lbm9pc2VTZXRDb21wbGV0aW9uQ2FsbGJhY2sobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgbGluZW5vaXNlQ29tcGxldGlvbkNhbGxiYWNrICpmbikgeworICAgIHNlc3Npb24tPmNvbXBsZXRpb25DYWxsYmFjayA9IGZuOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgYnkgdGhlIHVzZXIKKyAqIGluIG9yZGVyIHRvIGFkZCBjb21wbGV0aW9uIG9wdGlvbnMgZ2l2ZW4gdGhlIGlucHV0IHN0cmluZyB3aGVuIHRoZQorICogdXNlciB0eXBlZCA8dGFiPi4gU2VlIHRoZSBleGFtcGxlLmMgc291cmNlIGNvZGUgZm9yIGEgdmVyeSBlYXN5IHRvCisgKiB1bmRlcnN0YW5kIGV4YW1wbGUuICovCit2b2lkIGxpbmVub2lzZVNldEJ1ZmZlcihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIGludCBwb3MpCit7CisgICAgaWYgKCFzZXNzaW9uLT5zdGF0ZS5idWYpCisgICAgICAgIHJldHVybjsKKyAgICBzdHJuY3B5KHNlc3Npb24tPnN0YXRlLmJ1ZiwgYnVmLCBzZXNzaW9uLT5zdGF0ZS5idWZsZW4gLSAxKTsKKyAgICBzZXNzaW9uLT5zdGF0ZS5idWZbc2Vzc2lvbi0+c3RhdGUuYnVmbGVuIC0gMV0gPSAwOworICAgIHNlc3Npb24tPnN0YXRlLmxlbiA9IHN0cmxlbihzZXNzaW9uLT5zdGF0ZS5idWYpOworICAgIHNlc3Npb24tPnN0YXRlLnBvcyA9IChwb3MgPj0gMCAmJiBwb3MgPCBzZXNzaW9uLT5zdGF0ZS5sZW4pID8gcG9zIDogc2Vzc2lvbi0+c3RhdGUubGVuOworICAgIHJlZnJlc2hMaW5lKHNlc3Npb24pOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gTGluZSBlZGl0aW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBXZSBkZWZpbmUgYSB2ZXJ5IHNpbXBsZSAiYXBwZW5kIGJ1ZmZlciIgc3RydWN0dXJlLCB0aGF0IGlzIGFuIGhlYXAKKyAqIGFsbG9jYXRlZCBzdHJpbmcgd2hlcmUgd2UgY2FuIGFwcGVuZCB0by4gVGhpcyBpcyB1c2VmdWwgaW4gb3JkZXIgdG8KKyAqIHdyaXRlIGFsbCB0aGUgZXNjYXBlIHNlcXVlbmNlcyBpbiBhIGJ1ZmZlciBhbmQgZmx1c2ggdGhlbSB0byB0aGUgc3RhbmRhcmQKKyAqIG91dHB1dCBpbiBhIHNpbmdsZSBjYWxsLCB0byBhdm9pZCBmbGlja2VyaW5nIGVmZmVjdHMuICovCitzdHJ1Y3QgYWJ1ZiB7CisgICAgY2hhciAqYjsKKyAgICBpbnQgbGVuOworfTsKKworc3RhdGljIHZvaWQgYWJJbml0KHN0cnVjdCBhYnVmICphYikgeworICAgIGFiLT5iID0gTlVMTDsKKyAgICBhYi0+bGVuID0gMDsKK30KKworc3RhdGljIHZvaWQgYWJBcHBlbmQoc3RydWN0IGFidWYgKmFiLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuKSB7CisgICAgY2hhciAqbmV3ID0gYmNtb3NfYWxsb2MoYWItPmxlbitsZW4pOworICAgIGlmIChuZXcgPT0gTlVMTCkgcmV0dXJuOworICAgIG1lbWNweShuZXcsYWItPmIsYWItPmxlbik7CisgICAgbWVtY3B5KG5ldythYi0+bGVuLHMsbGVuKTsKKyAgICBiY21vc19mcmVlKGFiLT5iKTsKKyAgICBhYi0+YiA9IG5ldzsKKyAgICBhYi0+bGVuICs9IGxlbjsKK30KKworc3RhdGljIHZvaWQgYWJGcmVlKHN0cnVjdCBhYnVmICphYikgeworICAgIGJjbW9zX2ZyZWUoYWItPmIpOworfQorCisvKiBTaW5nbGUgbGluZSBsb3cgbGV2ZWwgY3Vyc29yIHJlZnJlc2guCisgKi8KK3N0YXRpYyB2b2lkIHJlZnJlc2hDdXJzb3JTaW5nbGVMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgY2hhciBzZXFbNjRdOworICAgIHNpemVfdCBwbGVuID0gc3RybGVuKGwtPnByb21wdCk7CisgICAgY2hhciAqYnVmID0gbC0+YnVmOworICAgIHNpemVfdCBsZW4gPSBsLT5sZW47CisgICAgc2l6ZV90IHBvcyA9IGwtPnBvczsKKyAgICBzdHJ1Y3QgYWJ1ZiBhYjsKKworICAgIHdoaWxlKChwbGVuK3BvcykgPj0gbC0+Y29scykgeworICAgICAgICBidWYrKzsKKyAgICAgICAgbGVuLS07CisgICAgICAgIHBvcy0tOworICAgIH0KKyAgICB3aGlsZSAocGxlbitsZW4gPiBsLT5jb2xzKSB7CisgICAgICAgIGxlbi0tOworICAgIH0KKworICAgIGFiSW5pdCgmYWIpOworICAgIC8qIEN1cnNvciB0byBsZWZ0IGVkZ2UgKi8KKyAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbOTk5RCIpOworICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIGlmIChwb3MrcGxlbikKKyAgICB7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlslZEMiLCAoaW50KShwb3MrcGxlbikpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisgICAgaWYgKHdyaXRlRXNjU2VxdWVuY2Uoc2Vzc2lvbiwgYWIuYiwgYWIubGVuKSA9PSAtMSkge30gLyogQ2FuJ3QgcmVjb3ZlciBmcm9tIHdyaXRlIGVycm9yLiAqLworICAgIGFiRnJlZSgmYWIpOworfQorCisvKiBTaW5nbGUgbGluZSBsb3cgbGV2ZWwgbGluZSByZWZyZXNoLgorICoKKyAqIFJld3JpdGUgdGhlIGN1cnJlbnRseSBlZGl0ZWQgbGluZSBhY2NvcmRpbmdseSB0byB0aGUgYnVmZmVyIGNvbnRlbnQsCisgKiBjdXJzb3IgcG9zaXRpb24sIGFuZCBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgdGVybWluYWwuICovCitzdGF0aWMgdm9pZCByZWZyZXNoU2luZ2xlTGluZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGNoYXIgc2VxWzY0XTsKKyAgICBzaXplX3QgcGxlbiA9IHN0cmxlbihsLT5wcm9tcHQpOworICAgIGNoYXIgKmJ1ZiA9IGwtPmJ1ZjsKKyAgICBzaXplX3QgbGVuID0gbC0+bGVuOworICAgIHNpemVfdCBwb3MgPSBsLT5wb3M7CisgICAgc3RydWN0IGFidWYgYWI7CisKKyAgICB3aGlsZSgocGxlbitwb3MpID49IGwtPmNvbHMpIHsKKyAgICAgICAgYnVmKys7CisgICAgICAgIGxlbi0tOworICAgICAgICBwb3MtLTsKKyAgICB9CisgICAgd2hpbGUgKHBsZW4rbGVuID4gbC0+Y29scykgeworICAgICAgICBsZW4tLTsKKyAgICB9CisKKyAgICBhYkluaXQoJmFiKTsKKyAgICAvKiBDdXJzb3IgdG8gbGVmdCBlZGdlICovCisgICAgc25wcmludGYoc2VxLDY0LCJceDFiWzk5OUQiKTsKKyAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICAvKiBXcml0ZSB0aGUgcHJvbXB0IGFuZCB0aGUgY3VycmVudCBidWZmZXIgY29udGVudCAqLworICAgIGFiQXBwZW5kKCZhYixsLT5wcm9tcHQsc3RybGVuKGwtPnByb21wdCkpOworICAgIGFiQXBwZW5kKCZhYixidWYsbGVuKTsKKyAgICAvKiBFcmFzZSB0byByaWdodCAqLworICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlswSyIpOworICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIC8qIE1vdmUgY3Vyc29yIHRvIG9yaWdpbmFsIHBvc2l0aW9uLiAqLworICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYls5OTlEIik7CisgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgaWYgKHBvcytwbGVuKQorICAgIHsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWyVkQyIsIChpbnQpKHBvcytwbGVuKSk7CisgICAgICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIH0KKyAgICBpZiAod3JpdGVFc2NTZXF1ZW5jZShzZXNzaW9uLCBhYi5iLCBhYi5sZW4pID09IC0xKSB7fSAvKiBDYW4ndCByZWNvdmVyIGZyb20gd3JpdGUgZXJyb3IuICovCisgICAgYWJGcmVlKCZhYik7Cit9CisKKy8qIE11bHRpIGxpbmUgbG93IGxldmVsIGN1cnNvciBwb3NpdGlvbiByZWZyZXNoLgorICoKKyAqIFJld3JpdGUgdGhlIGN1cnJlbnRseSBlZGl0ZWQgbGluZSBhY2NvcmRpbmdseSB0byB0aGUgYnVmZmVyIGNvbnRlbnQsCisgKiBjdXJzb3IgcG9zaXRpb24sIGFuZCBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgdGVybWluYWwuICovCitzdGF0aWMgdm9pZCByZWZyZXNoQ3Vyc29yTXVsdGlMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgY2hhciBzZXFbNjRdOworICAgIGludCBwbGVuID0gc3RybGVuKGwtPnByb21wdCk7CisgICAgaW50IG9sZF9ycG9zID0gKHBsZW4rbC0+b2xkcG9zK2wtPmNvbHMpL2wtPmNvbHM7IC8qIGN1cnNvciByZWxhdGl2ZSByb3cuICovCisgICAgaW50IG5ld19ycG9zID0gKHBsZW4rbC0+cG9zK2wtPmNvbHMpL2wtPmNvbHM7IC8qIGN1cnNvciByZWxhdGl2ZSByb3cuICovCisgICAgaW50IG9sZF9jcG9zID0gKHBsZW4rbC0+b2xkcG9zKSVsLT5jb2xzOyAvKiBjdXJzb3IgcmVsYXRpdmUgcm93LiAqLworICAgIGludCBuZXdfY3BvcyA9IChwbGVuK2wtPnBvcyklbC0+Y29sczsgLyogY3Vyc29yIHJlbGF0aXZlIHJvdy4gKi8KKyAgICBzdHJ1Y3QgYWJ1ZiBhYjsKKworICAgIC8qIFVwZGF0ZSBtYXhyb3dzIGlmIG5lZWRlZC4gKi8KKyAgICBpZiAobmV3X3Jwb3MgPiAoaW50KWwtPm1heHJvd3MpIG5ld19ycG9zID0gbC0+bWF4cm93czsKKworICAgIGxuZGVidWcoIm9sZHA9JWQgbmV3cD0lZCBvcj0lZCBucj0lZCBvYz0lZCBuYz0lZFxuXG4iLCBsLT5vbGRwb3MsIGwtPnBvcywgb2xkX3Jwb3MsIG5ld19ycG9zLCBvbGRfY3BvcywgbmV3X2Nwb3MpOworCisgICAgYWJJbml0KCZhYik7CisKKyAgICAvKiBIYW5kbGUgcm93ICovCisgICAgaWYgKG5ld19ycG9zID4gb2xkX3Jwb3MpCisgICAgeworICAgICAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbJWRCIiwgbmV3X3Jwb3MgLSBvbGRfcnBvcyk7CisgICAgICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIH0KKyAgICBlbHNlIGlmIChuZXdfcnBvcyA8IG9sZF9ycG9zKQorICAgIHsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWyVkQSIsIG9sZF9ycG9zIC0gbmV3X3Jwb3MpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgY29sdW1uICovCisgICAgaWYgKG5ld19jcG9zID4gb2xkX2Nwb3MpCisgICAgeworICAgICAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbJWRDIiwgbmV3X2Nwb3MgLSBvbGRfY3Bvcyk7CisgICAgICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIH0KKyAgICBlbHNlIGlmIChuZXdfY3BvcyA8IG9sZF9jcG9zKQorICAgIHsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWyVkRCIsIG9sZF9jcG9zIC0gbmV3X2Nwb3MpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisKKyAgICBsLT5vbGRwb3MgPSBsLT5wb3M7CisKKyAgICBpZiAod3JpdGVFc2NTZXF1ZW5jZShzZXNzaW9uLCBhYi5iLCBhYi5sZW4pID09IC0xKSB7fSAvKiBDYW4ndCByZWNvdmVyIGZyb20gd3JpdGUgZXJyb3IuICovCisgICAgYWJGcmVlKCZhYik7Cit9CisKKy8qIE11bHRpIGxpbmUgbG93IGxldmVsIGxpbmUgcmVmcmVzaC4KKyAqCisgKiBSZXdyaXRlIHRoZSBjdXJyZW50bHkgZWRpdGVkIGxpbmUgYWNjb3JkaW5nbHkgdG8gdGhlIGJ1ZmZlciBjb250ZW50LAorICogY3Vyc29yIHBvc2l0aW9uLCBhbmQgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIHRlcm1pbmFsLiAqLworc3RhdGljIHZvaWQgcmVmcmVzaE11bHRpTGluZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGNoYXIgc2VxWzY0XTsKKyAgICBpbnQgcGxlbiA9IHN0cmxlbihsLT5wcm9tcHQpOworICAgIGludCByb3dzID0gKHBsZW4rbC0+bGVuK2wtPmNvbHMtMSkvbC0+Y29sczsgLyogcm93cyB1c2VkIGJ5IGN1cnJlbnQgYnVmLiAqLworICAgIGludCBycG9zID0gKHBsZW4rbC0+b2xkcG9zK2wtPmNvbHMpL2wtPmNvbHM7IC8qIGN1cnNvciByZWxhdGl2ZSByb3cuICovCisgICAgaW50IHJwb3MyOyAvKiBycG9zIGFmdGVyIHJlZnJlc2guICovCisgICAgaW50IG9sZF9yb3dzID0gbC0+bWF4cm93czsKKyAgICBpbnQgcG9zOworICAgIGludCBqOworICAgIHN0cnVjdCBhYnVmIGFiOworCisgICAgLyogVXBkYXRlIG1heHJvd3MgaWYgbmVlZGVkLiAqLworICAgIGlmIChyb3dzID4gKGludClsLT5tYXhyb3dzKSBsLT5tYXhyb3dzID0gcm93czsKKworICAgIC8qIEZpcnN0IHN0ZXA6IGNsZWFyIGFsbCB0aGUgbGluZXMgdXNlZCBiZWZvcmUuIFRvIGRvIHNvIHN0YXJ0IGJ5CisgICAgICogZ29pbmcgdG8gdGhlIGxhc3Qgcm93LiAqLworICAgIGFiSW5pdCgmYWIpOworICAgIGlmIChvbGRfcm93cy1ycG9zID4gMCkgeworICAgICAgICBsbmRlYnVnKCJnbyBkb3duICVkIiwgb2xkX3Jvd3MtcnBvcyk7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlslZEIiLCBvbGRfcm93cy1ycG9zKTsKKyAgICAgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgfQorCisgICAgLyogTm93IGZvciBldmVyeSByb3cgY2xlYXIgaXQsIGdvIHVwLiAqLworICAgIGZvciAoaiA9IDA7IGogPCBvbGRfcm93cy0xOyBqKyspIHsKKyAgICAgICAgbG5kZWJ1ZygiY2xlYXIrdXAiKTsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWzk5OURceDFiWzBLXHgxYlsxQSIpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisKKyAgICAvKiBDbGVhbiB0aGUgdG9wIGxpbmUuICovCisgICAgbG5kZWJ1ZygiY2xlYXIiKTsKKyAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbOTk5RFx4MWJbMEsiKTsKKyAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKworICAgIC8qIFdyaXRlIHRoZSBwcm9tcHQgYW5kIHRoZSBjdXJyZW50IGJ1ZmZlciBjb250ZW50ICovCisgICAgYWJBcHBlbmQoJmFiLGwtPnByb21wdCxzdHJsZW4obC0+cHJvbXB0KSk7CisgICAgYWJBcHBlbmQoJmFiLGwtPmJ1ZixsLT5sZW4pOworCisgICAgLyogSWYgd2UgYXJlIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgc2NyZWVuIHdpdGggb3VyIHByb21wdCwgd2UgbmVlZCB0bworICAgICAqIGVtaXQgYSBuZXdsaW5lIGFuZCBtb3ZlIHRoZSBwcm9tcHQgdG8gdGhlIGZpcnN0IGNvbHVtbi4gKi8KKyAgICBpZiAobC0+cG9zICYmCisgICAgICAgIGwtPnBvcyA9PSBsLT5sZW4gJiYKKyAgICAgICAgKGwtPnBvcytwbGVuKSAlIGwtPmNvbHMgPT0gMCkKKyAgICB7CisgICAgICAgIGxuZGVidWcoIjxuZXdsaW5lPiIpOworICAgICAgICBhYkFwcGVuZCgmYWIsIlxuIiwxKTsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWzk5OUQiKTsKKyAgICAgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgICAgIHJvd3MrKzsKKyAgICAgICAgaWYgKHJvd3MgPiAoaW50KWwtPm1heHJvd3MpIGwtPm1heHJvd3MgPSByb3dzOworICAgIH0KKworICAgIC8qIE1vdmUgY3Vyc29yIHRvIHJpZ2h0IHBvc2l0aW9uLiAqLworICAgIHJwb3MyID0gKHBsZW4rbC0+cG9zK2wtPmNvbHMpL2wtPmNvbHM7IC8qIGN1cnJlbnQgY3Vyc29yIHJlbGF0aXZlIHJvdy4gKi8KKyAgICBsbmRlYnVnKCJycG9zMiAlZCIsIHJwb3MyKTsKKworICAgIC8qIEdvIHVwIHRpbGwgd2UgcmVhY2ggdGhlIGV4cGVjdGVkIHBvc2l0b24uICovCisgICAgaWYgKHJvd3MtcnBvczIgPiAwKSB7CisgICAgICAgIGxuZGVidWcoImdvLXVwICVkIiwgcm93cy1ycG9zMik7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlslZEEiLCByb3dzLXJwb3MyKTsKKyAgICAgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgfQorCisgICAgLyogU2V0IGNvbHVtbi4gKi8KKyAgICBsbmRlYnVnKCJzZXQgY29sICVkIiwgMSsoKHBsZW4rKGludClsLT5wb3MpICUgKGludClsLT5jb2xzKSk7CisgICAgc25wcmludGYoc2VxLDY0LCJceDFiWzk5OUQiKTsKKyAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICBwb3MgPSAoKHBsZW4rKGludClsLT5wb3MpICUgKGludClsLT5jb2xzKTsKKyAgICBpZiAocG9zKQorICAgIHsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWyVkQyIsIHBvcyk7CisgICAgICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIH0KKyAgICBsbmRlYnVnKCJcbiIpOworICAgIGwtPm9sZHBvcyA9IGwtPnBvczsKKworICAgIGlmICh3cml0ZUVzY1NlcXVlbmNlKHNlc3Npb24sIGFiLmIsIGFiLmxlbikgPT0gLTEpIHt9IC8qIENhbid0IHJlY292ZXIgZnJvbSB3cml0ZSBlcnJvci4gKi8KKyAgICBhYkZyZWUoJmFiKTsKKworICAgIGxuZGVidWcoIiAtIG91dFxuIik7Cit9CisKKy8qIENhbGxzIHRoZSB0d28gbG93IGxldmVsIGZ1bmN0aW9ucyByZWZyZXNoQ3Vyc29yU2luZ2xlTGluZSgpIG9yCisgKiByZWZyZXNoQ3Vyc29yTXVsdGlMaW5lKCkgYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBtb2RlLiAqLworc3RhdGljIHZvaWQgcmVmcmVzaEN1cnNvcihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgaWYgKHNlc3Npb24tPm1sbW9kZSkKKyAgICAgICAgcmVmcmVzaEN1cnNvck11bHRpTGluZShzZXNzaW9uKTsKKyAgICBlbHNlCisgICAgICAgIHJlZnJlc2hDdXJzb3JTaW5nbGVMaW5lKHNlc3Npb24pOworfQorCisvKiBDYWxscyB0aGUgdHdvIGxvdyBsZXZlbCBmdW5jdGlvbnMgcmVmcmVzaFNpbmdsZUxpbmUoKSBvcgorICogcmVmcmVzaE11bHRpTGluZSgpIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIHJlZnJlc2hMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBpZiAoc2Vzc2lvbi0+bWxtb2RlKQorICAgICAgICByZWZyZXNoTXVsdGlMaW5lKHNlc3Npb24pOworICAgIGVsc2UKKyAgICAgICAgcmVmcmVzaFNpbmdsZUxpbmUoc2Vzc2lvbik7Cit9CisKKy8qIEluc2VydCB0aGUgY2hhcmFjdGVyICdjJyBhdCBjdXJzb3IgY3VycmVudCBwb3NpdGlvbi4KKyAqCisgKiBPbiBlcnJvciB3cml0aW5nIHRvIHRoZSB0ZXJtaW5hbCAtMSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIDAuICovCitzdGF0aWMgaW50IGxpbmVub2lzZUVkaXRJbnNlcnQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciBjKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGlmIChsLT5sZW4gPCBsLT5idWZsZW4pIHsKKyAgICAgICAgaWYgKGwtPmxlbiA9PSBsLT5wb3MpIHsKKyAgICAgICAgICAgIGludCBwbGVuID0gc3RybGVuKGwtPnByb21wdCk7CisgICAgICAgICAgICBpbnQgcm93cyA9IChwbGVuK2wtPmxlbitsLT5jb2xzKS9sLT5jb2xzOworCisgICAgICAgICAgICBsLT5idWZbbC0+cG9zXSA9IGM7CisgICAgICAgICAgICBsLT5wb3MrKzsKKyAgICAgICAgICAgIGwtPmxlbisrOworICAgICAgICAgICAgbC0+YnVmW2wtPmxlbl0gPSAnXDAnOworICAgICAgICAgICAgbG5kZWJ1ZygiIHBsZW49JWQgbGVuPSVkIHBvcz0lZCBjb2xzPSVkIGJ1Zj08JXM+XG4iLAorICAgICAgICAgICAgICAgIChpbnQpbC0+cGxlbiwgKGludClsLT5sZW4sIChpbnQpbC0+cG9zLCAoaW50KWwtPmNvbHMsIGwtPmJ1Zik7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW8ud3JpdGUoc2Vzc2lvbi0+aW8uZmRfb3V0LCAmYywgMSkgPT0gLTEpIHJldHVybiAtMTsKKyAgICAgICAgICAgIGwtPm9sZHBvcyA9IGwtPnBvczsKKyAgICAgICAgICAgIGwtPm1heHJvd3MgPSByb3dzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtbW92ZShsLT5idWYrbC0+cG9zKzEsbC0+YnVmK2wtPnBvcyxsLT5sZW4tbC0+cG9zKTsKKyAgICAgICAgICAgIGwtPmJ1ZltsLT5wb3NdID0gYzsKKyAgICAgICAgICAgIGwtPmxlbisrOworICAgICAgICAgICAgbC0+cG9zKys7CisgICAgICAgICAgICBsLT5idWZbbC0+bGVuXSA9ICdcMCc7CisgICAgICAgICAgICBsbmRlYnVnKCIgcGxlbj0lZCBsZW49JWQgcG9zPSVkIGNvbHM9JWQgYnVmPTwlcz5cbiIsCisgICAgICAgICAgICAgICAgbC0+cGxlbiwgbC0+bGVuLCBsLT5wb3MsIGwtPmNvbHMsIGwtPmJ1Zik7CisgICAgICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogTW92ZSBjdXJzb3Igb24gdGhlIGxlZnQuICovCitzdGF0aWMgdm9pZCBsaW5lbm9pc2VFZGl0TW92ZUxlZnQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAobC0+cG9zID4gMCkgeworICAgICAgICBsLT5wb3MtLTsKKyAgICAgICAgcmVmcmVzaEN1cnNvcihzZXNzaW9uKTsKKyAgICB9Cit9CisKKy8qIE1vdmUgY3Vyc29yIG9uIHRoZSByaWdodC4gKi8KK3N0YXRpYyB2b2lkIGxpbmVub2lzZUVkaXRNb3ZlUmlnaHQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAobC0+cG9zICE9IGwtPmxlbikgeworICAgICAgICBsLT5wb3MrKzsKKyAgICAgICAgcmVmcmVzaEN1cnNvcihzZXNzaW9uKTsKKyAgICB9Cit9CisKKy8qIE1vdmUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZS4gKi8KK3N0YXRpYyB2b2lkIGxpbmVub2lzZUVkaXRNb3ZlSG9tZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGlmIChsLT5wb3MgIT0gMCkgeworICAgICAgICBsLT5wb3MgPSAwOworICAgICAgICByZWZyZXNoQ3Vyc29yKHNlc3Npb24pOworICAgIH0KK30KKworLyogTW92ZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KK3N0YXRpYyB2b2lkIGxpbmVub2lzZUVkaXRNb3ZlRW5kKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgaWYgKGwtPnBvcyAhPSBsLT5sZW4pIHsKKyAgICAgICAgbC0+cG9zID0gbC0+bGVuOworICAgICAgICByZWZyZXNoQ3Vyc29yKHNlc3Npb24pOworICAgIH0KK30KKworLyogc3RyZHVwIGltcGxlbWVudGF0aW9uICovCitzdGF0aWMgaW5saW5lIGNoYXIgKmxpbmVub2lzZV9zdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IHN0cmxlbihzKSArIDE7CisgICAgY2hhciAqbmV3ID0gYmNtb3NfYWxsb2Moc2l6ZSk7CisgICAgaWYgKG5ldykKKyAgICAgICAgbWVtY3B5KG5ldywgcywgc2l6ZSk7CisgICAgcmV0dXJuIG5ldzsKK30KKworLyogU3Vic3RpdHV0ZSB0aGUgY3VycmVudGx5IGVkaXRlZCBsaW5lIHdpdGggdGhlIG5leHQgb3IgcHJldmlvdXMgaGlzdG9yeQorICogZW50cnkgYXMgc3BlY2lmaWVkIGJ5ICdkaXInLiAqLworI2RlZmluZSBMSU5FTk9JU0VfSElTVE9SWV9ORVhUIDAKKyNkZWZpbmUgTElORU5PSVNFX0hJU1RPUllfUFJFViAxCitzdGF0aWMgdm9pZCBsaW5lbm9pc2VFZGl0SGlzdG9yeU5leHQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgaW50IGRpcikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeV9sZW4gPiAxKSB7CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGJlZm9yZSB0bworICAgICAgICAgKiBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgbmV4dCBvbmUuICovCisgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbi0+aGlzdG9yeVtzZXNzaW9uLT5oaXN0b3J5X2xlbiAtIDEgLSBsLT5oaXN0b3J5X2luZGV4XSk7CisgICAgICAgIHNlc3Npb24tPmhpc3Rvcnlbc2Vzc2lvbi0+aGlzdG9yeV9sZW4gLSAxIC0gbC0+aGlzdG9yeV9pbmRleF0gPSBsaW5lbm9pc2Vfc3RyZHVwKGwtPmJ1Zik7CisgICAgICAgIC8qIFNob3cgdGhlIG5ldyBlbnRyeSAqLworICAgICAgICBsLT5oaXN0b3J5X2luZGV4ICs9IChkaXIgPT0gTElORU5PSVNFX0hJU1RPUllfUFJFVikgPyAxIDogLTE7CisgICAgICAgIGlmIChsLT5oaXN0b3J5X2luZGV4IDwgMCkgeworICAgICAgICAgICAgbC0+aGlzdG9yeV9pbmRleCA9IDA7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAobC0+aGlzdG9yeV9pbmRleCA+PSBzZXNzaW9uLT5oaXN0b3J5X2xlbikgeworICAgICAgICAgICAgbC0+aGlzdG9yeV9pbmRleCA9IHNlc3Npb24tPmhpc3RvcnlfbGVuLTE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RybmNweShsLT5idWYsc2Vzc2lvbi0+aGlzdG9yeVtzZXNzaW9uLT5oaXN0b3J5X2xlbiAtIDEgLSBsLT5oaXN0b3J5X2luZGV4XSxsLT5idWZsZW4pOworICAgICAgICBsLT5idWZbbC0+YnVmbGVuLTFdID0gJ1wwJzsKKyAgICAgICAgbC0+bGVuID0gbC0+cG9zID0gc3RybGVuKGwtPmJ1Zik7CisgICAgICAgIHJlZnJlc2hMaW5lKHNlc3Npb24pOworICAgIH0KK30KKworLyogRGVsZXRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3Igd2l0aG91dCBhbHRlcmluZyB0aGUgY3Vyc29yCisgKiBwb3NpdGlvbi4gQmFzaWNhbGx5IHRoaXMgaXMgd2hhdCBoYXBwZW5zIHdpdGggdGhlICJEZWxldGUiIGtleWJvYXJkIGtleS4gKi8KK3N0YXRpYyB2b2lkIGxpbmVub2lzZUVkaXREZWxldGUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAobC0+bGVuID4gMCAmJiBsLT5wb3MgPCBsLT5sZW4pIHsKKyAgICAgICAgbWVtbW92ZShsLT5idWYrbC0+cG9zLGwtPmJ1ZitsLT5wb3MrMSxsLT5sZW4tbC0+cG9zLTEpOworICAgICAgICBsLT5sZW4tLTsKKyAgICAgICAgbC0+YnVmW2wtPmxlbl0gPSAnXDAnOworICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICB9Cit9CisKKy8qIEJhY2tzcGFjZSBpbXBsZW1lbnRhdGlvbi4gKi8KK3N0YXRpYyB2b2lkIGxpbmVub2lzZUVkaXRCYWNrc3BhY2UobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAobC0+cG9zID4gMCAmJiBsLT5sZW4gPiAwKSB7CisgICAgICAgIG1lbW1vdmUobC0+YnVmK2wtPnBvcy0xLGwtPmJ1ZitsLT5wb3MsbC0+bGVuLWwtPnBvcyk7CisgICAgICAgIGwtPnBvcy0tOworICAgICAgICBsLT5sZW4tLTsKKyAgICAgICAgbC0+YnVmW2wtPmxlbl0gPSAnXDAnOworICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICB9Cit9CisKKy8qIERlbGV0ZSB0aGUgcHJldmlvc3Ugd29yZCwgbWFpbnRhaW5pbmcgdGhlIGN1cnNvciBhdCB0aGUgc3RhcnQgb2YgdGhlCisgKiBjdXJyZW50IHdvcmQuICovCitzdGF0aWMgdm9pZCBsaW5lbm9pc2VFZGl0RGVsZXRlUHJldldvcmQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBzaXplX3Qgb2xkX3BvcyA9IGwtPnBvczsKKyAgICBzaXplX3QgZGlmZjsKKworICAgIHdoaWxlIChsLT5wb3MgPiAwICYmIGwtPmJ1ZltsLT5wb3MtMV0gPT0gJyAnKQorICAgICAgICBsLT5wb3MtLTsKKyAgICB3aGlsZSAobC0+cG9zID4gMCAmJiBsLT5idWZbbC0+cG9zLTFdICE9ICcgJykKKyAgICAgICAgbC0+cG9zLS07CisgICAgZGlmZiA9IG9sZF9wb3MgLSBsLT5wb3M7CisgICAgbWVtbW92ZShsLT5idWYrbC0+cG9zLGwtPmJ1ZitvbGRfcG9zLGwtPmxlbi1vbGRfcG9zKzEpOworICAgIGwtPmxlbiAtPSBkaWZmOworICAgIHJlZnJlc2hMaW5lKHNlc3Npb24pOworfQorCitzdGF0aWMgaW50IGxpbmVub2lzZVJlYWRDaGFyKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNoYXIgKmMpCit7CisgICAgaW50IG47CisKKyAgICBkbyB7CisgICAgICAgIGlmIChzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZikKKyAgICAgICAgeworICAgICAgICAgICAgKmMgPSBzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZltzZXNzaW9uLT5yZWFkX2FoZWFkX3BvcysrXTsKKyAgICAgICAgICAgIGxuZGVidWcoInJlYWQgY2hhciBmcm9tIGJ1ZiAlZCglYylcbiIsICpjLCAqYyk7CisgICAgICAgICAgICBpZiAoKmMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBiY21vc19mcmVlKHNlc3Npb24tPnJlYWRfYWhlYWRfYnVmKTsKKyAgICAgICAgICAgIHNlc3Npb24tPnJlYWRfYWhlYWRfYnVmID0gTlVMTDsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLworICAgICAgICB9CisgICAgICAgIG4gPSBzZXNzaW9uLT5pby5yZWFkX2NoYXIoc2Vzc2lvbi0+aW8uZmRfaW4sIGMpOworICAgIH0gd2hpbGUgKCFuIHx8IChuID09IDEgJiYgISAqYykpOworICAgIGxuZGVidWcoInJlYWQgY2hhciBmcm9tIGlvICVkKCVjKSBuPSVkXG4iLCAqYywgKmMsIG4pOworICAgIHJldHVybiBuOworfQorCitzdGF0aWMgaW50IGxpbmVub2lzZUhhbmRsZUVzY1NlcXVlbmNlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pCit7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGNoYXIgc2VxWzMyXTsKKworICAgIC8qIFJlYWQgdGhlIG5leHQgdHdvIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZXNjYXBlIHNlcXVlbmNlLgorICAgICAqIFVzZSB0d28gY2FsbHMgdG8gaGFuZGxlIHNsb3cgdGVybWluYWxzIHJldHVybmluZyB0aGUgdHdvCisgICAgICogY2hhcnMgYXQgZGlmZmVyZW50IHRpbWVzLiAqLworICAgIGlmIChsaW5lbm9pc2VSZWFkQ2hhcihzZXNzaW9uLCBzZXEpID09IC0xKSByZXR1cm4gLTE7CisgICAgaWYgKGxpbmVub2lzZVJlYWRDaGFyKHNlc3Npb24sIHNlcSsxKSA9PSAtMSkgcmV0dXJuIC0xOworICAgIGxuZGVidWcoInNlcT0lMDJ4KCVjKSBzZXExPSUwMngoJWMpXG4iLCBzZXFbMF0sIHNlcVswXSwgc2VxWzFdLCBzZXFbMV0pOworCisgICAgLyogRVNDIFsgc2VxdWVuY2VzLiAqLworICAgIGlmIChzZXFbMF0gPT0gJ1snKSB7CisgICAgICAgIGlmIChzZXFbMV0gPj0gJzAnICYmIHNlcVsxXSA8PSAnOScpIHsKKyAgICAgICAgICAgIGludCBuID0gMjsKKyAgICAgICAgICAgIGNoYXIgdGVybWluYXRvciA9IDA7CisKKyAgICAgICAgICAgIC8qIEV4dGVuZGVkIGVzY2FwZSwgcmVhZCBhZGRpdGlvbmFsIGJ5dGUocykgKi8KKyAgICAgICAgICAgIHdoaWxlIChsaW5lbm9pc2VSZWFkQ2hhcihzZXNzaW9uLCBzZXErbikgIT0gLTEgJiYgbiA8IHNpemVvZihzZXEpIC0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdG9yID0gc2VxW24rK107CisgICAgICAgICAgICAgICAgaWYgKCAhKHRlcm1pbmF0b3IgPj0gJzAnICYmIHRlcm1pbmF0b3IgPD0gJzknKSAmJiB0ZXJtaW5hdG9yICE9ICc7JykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXFbbl0gPSAwOworICAgICAgICAgICAgc3dpdGNoICh0ZXJtaW5hdG9yICkgeworICAgICAgICAgICAgICAgIGNhc2UgJ34nOgorICAgICAgICAgICAgICAgICAgICBsaW5lbm9pc2VFZGl0RGVsZXRlKHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdSJzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCByb3csIGNvbDsKKyAgICAgICAgICAgICAgICAgICAgLyogUG9zaXRpb24gcmVwb3J0ICovCisgICAgICAgICAgICAgICAgICAgIHNlcVtuLTFdID0gMDsgLyogQ3V0IFIgKi8KKyAgICAgICAgICAgICAgICAgICAgc3NjYW5mKHNlcSsxLCAiJWQ7JWQiLCAmcm93LCAmY29sKTsKKyAgICAgICAgICAgICAgICAgICAgbC0+Y29scyA9IGNvbDsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+bmNvbHJlcXMgPSAwOworICAgICAgICAgICAgICAgICAgICBsbmRlYnVnKCJwb3NpdGlvbiByZXBvcnQgcm93PSVkIGNvbD0lZFxuIiwgcm93LCBjb2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaChzZXFbMV0pIHsKKyAgICAgICAgICAgIGNhc2UgJ0EnOiAvKiBVcCAqLworICAgICAgICAgICAgICAgIGxpbmVub2lzZUVkaXRIaXN0b3J5TmV4dChzZXNzaW9uLCBMSU5FTk9JU0VfSElTVE9SWV9QUkVWKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0InOiAvKiBEb3duICovCisgICAgICAgICAgICAgICAgbGluZW5vaXNlRWRpdEhpc3RvcnlOZXh0KHNlc3Npb24sIExJTkVOT0lTRV9ISVNUT1JZX05FWFQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnQyc6IC8qIFJpZ2h0ICovCisgICAgICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVSaWdodChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0QnOiAvKiBMZWZ0ICovCisgICAgICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVMZWZ0KHNlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnSCc6IC8qIEhvbWUgKi8KKyAgICAgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZUhvbWUoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdGJzogLyogRW5kKi8KKyAgICAgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZUVuZChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFU0MgTyBzZXF1ZW5jZXMuICovCisgICAgZWxzZSBpZiAoc2VxWzBdID09ICdPJykgeworICAgICAgICBzd2l0Y2goc2VxWzFdKSB7CisgICAgICAgIGNhc2UgJ0gnOiAvKiBIb21lICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZUhvbWUoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnRic6IC8qIEVuZCovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZUVuZChzZXNzaW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGNvcmUgb2YgdGhlIGxpbmUgZWRpdGluZyBjYXBhYmlsaXR5IG9mIGxpbmVub2lzZS4KKyAqIEl0IGV4cGVjdHMgJ2ZkJyB0byBiZSBhbHJlYWR5IGluICJyYXcgbW9kZSIgc28gdGhhdCBldmVyeSBrZXkgcHJlc3NlZAorICogd2lsbCBiZSByZXR1cm5lZCBBU0FQIHRvIHJlYWQoKS4KKyAqCisgKiBUaGUgcmVzdWx0aW5nIHN0cmluZyBpcyBwdXQgaW50byAnYnVmJyB3aGVuIHRoZSB1c2VyIHR5cGUgZW50ZXIsIG9yCisgKiB3aGVuIGN0cmwrZCBpcyB0eXBlZC4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGJ1ZmZlci4gKi8KK3N0YXRpYyBpbnQgbGluZW5vaXNlRWRpdChsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4sIGNvbnN0IGNoYXIgKnByb21wdCkKK3sKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgaW50IG5yZWFkID0gMDsKKworICAgIC8qIFBvcHVsYXRlIHRoZSBsaW5lbm9pc2Ugc3RhdGUgdGhhdCB3ZSBwYXNzIHRvIGZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcKKyAgICAgKiBzcGVjaWZpYyBlZGl0aW5nIGZ1bmN0aW9uYWxpdGllcy4gKi8KKyAgICBsLT5idWYgPSBidWY7CisgICAgbC0+YnVmbGVuID0gYnVmbGVuOworICAgIGwtPnByb21wdCA9IHByb21wdDsKKyAgICBsLT5wbGVuID0gc3RybGVuKHByb21wdCk7CisgICAgbC0+b2xkcG9zID0gbC0+cG9zID0gMDsKKyAgICBsLT5sZW4gPSAwOworICAgIGlmICghbC0+Y29scykKKyAgICAgICAgbC0+Y29scyA9IDgwOworICAgIGdldENvbHVtbnNSZXF1ZXN0KHNlc3Npb24pOworICAgIGwtPm1heHJvd3MgPSAwOworICAgIGwtPmhpc3RvcnlfaW5kZXggPSAwOworCisgICAgLyogQnVmZmVyIHN0YXJ0cyBlbXB0eS4gKi8KKyAgICBsLT5idWZbMF0gPSAnXDAnOworICAgIGwtPmJ1Zmxlbi0tOyAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYWx3YXlzIHNwYWNlIGZvciB0aGUgbnVsdGVybSAqLworCisgICAgLyogVGhlIGxhdGVzdCBoaXN0b3J5IGVudHJ5IGlzIGFsd2F5cyBvdXIgY3VycmVudCBidWZmZXIsIHRoYXQKKyAgICAgKiBpbml0aWFsbHkgaXMganVzdCBhbiBlbXB0eSBzdHJpbmcuICovCisgICAgbGluZW5vaXNlSGlzdG9yeUFkZChzZXNzaW9uLCAiIik7CisgICAgaWYgKGwtPnBsZW4gJiYgc2Vzc2lvbi0+aW8ud3JpdGUoc2Vzc2lvbi0+aW8uZmRfb3V0LCBwcm9tcHQsIGwtPnBsZW4pID09IC0xKSByZXR1cm4gLTE7CisgICAgd2hpbGUoMSkgeworICAgICAgICBjaGFyIGM7CisKKyAgICAgICAgbnJlYWQgPSBsaW5lbm9pc2VSZWFkQ2hhcihzZXNzaW9uLCAmYyk7CisgICAgICAgIGlmIChucmVhZCA8PSAwKSBnb3RvIGVkaXRfb3V0OworCisgICAgICAgIGxuZGVidWcoImM9JTAyeCglYylcbiIsIGMsIGMpOworICAgICAgICAvKiBPbmx5IGF1dG9jb21wbGV0ZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBzZXQuIEl0IHJldHVybnMgPCAwIHdoZW4KKyAgICAgICAgICogdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZnJvbSBmZC4gT3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIHRoZQorICAgICAgICAgKiBjaGFyYWN0ZXIgdGhhdCBzaG91bGQgYmUgaGFuZGxlZCBuZXh0LiAqLworICAgICAgICBpZiAoYyA9PSBLRVlfVEFCICYmIHNlc3Npb24tPmNvbXBsZXRpb25DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb21wbGV0ZUxpbmUoc2Vzc2lvbik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChjKSB7CisgICAgICAgIGNhc2UgS0VZX0NSOiAgICAvKiBlbnRlciAqLworICAgICAgICBjYXNlIEtFWV9MRjogICAgLyogZW50ZXIgKi8KKyAgICAgICAgICAgIHNlc3Npb24tPmhpc3RvcnlfbGVuLS07CisgICAgICAgICAgICBiY21vc19mcmVlKHNlc3Npb24tPmhpc3Rvcnlbc2Vzc2lvbi0+aGlzdG9yeV9sZW5dKTsKKyAgICAgICAgICAgIGdvdG8gZWRpdF9vdXQ7CisgICAgICAgIGNhc2UgQ1RSTF9DOiAgICAgLyogY3RybC1jICovCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgQkFDS1NQQUNFOiAgIC8qIGJhY2tzcGFjZSAqLworICAgICAgICBjYXNlIDg6ICAgICAvKiBjdHJsLWggKi8KKyAgICAgICAgICAgIGxpbmVub2lzZUVkaXRCYWNrc3BhY2Uoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX0Q6ICAgICAvKiBjdHJsLWQsIHJlbW92ZSBjaGFyIGF0IHJpZ2h0IG9mIGN1cnNvciwgb3Igb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgaXMgZW1wdHksIGFjdCBhcyBlbmQtb2YtZmlsZS4gKi8KKyAgICAgICAgICAgIGlmIChsLT5sZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgbGluZW5vaXNlRWRpdERlbGV0ZShzZXNzaW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aGlzdG9yeV9sZW4tLTsKKyAgICAgICAgICAgICAgICBiY21vc19mcmVlKHNlc3Npb24tPmhpc3Rvcnlbc2Vzc2lvbi0+aGlzdG9yeV9sZW5dKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX1Q6ICAgIC8qIGN0cmwtdCwgc3dhcHMgY3VycmVudCBjaGFyYWN0ZXIgd2l0aCBwcmV2aW91cy4gKi8KKyAgICAgICAgICAgIGlmIChsLT5wb3MgPiAwICYmIGwtPnBvcyA8IGwtPmxlbikgeworICAgICAgICAgICAgICAgIGludCBhdXggPSBidWZbbC0+cG9zLTFdOworICAgICAgICAgICAgICAgIGJ1ZltsLT5wb3MtMV0gPSBidWZbbC0+cG9zXTsKKyAgICAgICAgICAgICAgICBidWZbbC0+cG9zXSA9IGF1eDsKKyAgICAgICAgICAgICAgICBpZiAobC0+cG9zICE9IGwtPmxlbi0xKSBsLT5wb3MrKzsKKyAgICAgICAgICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENUUkxfQjogICAgIC8qIGN0cmwtYiAqLworICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVMZWZ0KHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9GOiAgICAgLyogY3RybC1mICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZVJpZ2h0KHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9QOiAgICAvKiBjdHJsLXAgKi8KKyAgICAgICAgICAgIGxpbmVub2lzZUVkaXRIaXN0b3J5TmV4dChzZXNzaW9uLCBMSU5FTk9JU0VfSElTVE9SWV9QUkVWKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENUUkxfTjogICAgLyogY3RybC1uICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0SGlzdG9yeU5leHQoc2Vzc2lvbiwgTElORU5PSVNFX0hJU1RPUllfTkVYVCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFU0M6ICAgIC8qIGVzY2FwZSBzZXF1ZW5jZSAqLworICAgICAgICAgICAgbGluZW5vaXNlSGFuZGxlRXNjU2VxdWVuY2Uoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChsaW5lbm9pc2VFZGl0SW5zZXJ0KHNlc3Npb24sYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG5kZWJ1ZygiZWRpdEluc2VydCBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX1U6IC8qIEN0cmwrdSwgZGVsZXRlIHRoZSB3aG9sZSBsaW5lLiAqLworICAgICAgICAgICAgYnVmWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIGwtPnBvcyA9IGwtPmxlbiA9IDA7CisgICAgICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENUUkxfSzogLyogQ3RybCtrLCBkZWxldGUgZnJvbSBjdXJyZW50IHRvIGVuZCBvZiBsaW5lLiAqLworICAgICAgICAgICAgYnVmW2wtPnBvc10gPSAnXDAnOworICAgICAgICAgICAgbC0+bGVuID0gbC0+cG9zOworICAgICAgICAgICAgcmVmcmVzaExpbmUoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX0E6IC8qIEN0cmwrYSwgZ28gdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZUhvbWUoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX0U6IC8qIGN0cmwrZSwgZ28gdG8gdGhlIGVuZCBvZiB0aGUgbGluZSAqLworICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVFbmQoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX0w6IC8qIGN0cmwrbCwgY2xlYXIgc2NyZWVuICovCisgICAgICAgICAgICBsaW5lbm9pc2VDbGVhclNjcmVlbihzZXNzaW9uKTsKKyAgICAgICAgICAgIHJlZnJlc2hMaW5lKHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9XOiAvKiBjdHJsK3csIGRlbGV0ZSBwcmV2aW91cyB3b3JkICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0RGVsZXRlUHJldldvcmQoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK2VkaXRfb3V0OgorICAgIGxuZGVidWcoIiAtIG91dC4gbGVuPSVkIGJ1Zj08JXM+XG4iLCBsLT5sZW4sIGJ1Zik7CisgICAgcmV0dXJuIChucmVhZCA+PSAwKSA/IGwtPmxlbiA6IC0xOworfQorCisvKiBHZXQgd2l0aG91dCBlZGl0aW5nICovCitzdGF0aWMgaW50IGxpbmVub2lzZU5vZWRpdChsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pIHsKKyAgICBjaGFyIGM7CisgICAgaW50IGxlbiA9IDA7CisgICAgaW50IHN3aXRjaF90b19zbWFydF9tb2RlID0gMDsKKyAgICBpbnQgbnJlYWQgPSAwOworI2lmbmRlZiBMSU5FTk9JU0VfRElTQUJMRV9URVJNSU9TCisgICAgaW50IGF0dHlfdGVybSA9IGlzYXR0eShTVERJTl9GSUxFTk8pOworI2Vsc2UKKyAgICBpbnQgYXR0eV90ZXJtID0gMTsKKyNlbmRpZgorCisgICAgd2hpbGUgKChucmVhZCA9IGxpbmVub2lzZVJlYWRDaGFyKHNlc3Npb24sICZjKSkgIT0gLTEgJiYgbGVuIDwgYnVmbGVuIC0gMSkKKyAgICB7CisgICAgICAgIGlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJ1ZltsZW4rK10gPSBjOworICAgICAgICAvKiBJZiBidWZmZXIgY29udGFpbnMgRVNDIHNlcXVlbmNlIC0gcGVyaGFwcyB0aGUgdGVybWluYWwgaXMgbm90IGR1bWIgYWZ0ZXIgYWxsICovCisgICAgICAgIGlmIChjID09IEVTQyAmJiAhc2Vzc2lvbi0+aW8uZHVtYl90ZXJtaW5hbCAmJiAhc2Vzc2lvbi0+Zm9yY2VkX2R1bWIgJiYgYXR0eV90ZXJtKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2hfdG9fc21hcnRfbW9kZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBFY2hvIGhlcmUgaXMgdGVybWluYWwgaXMgaW4gcmF3IG1vZGUgKi8KKyAgICAgICAgaWYgKHNlc3Npb24tPnJhd21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgJmMsIDEpOworICAgICAgICB9CisgICAgfQorICAgIGJ1ZltsZW5dID0gMDsKKyAgICBpZiAoc3dpdGNoX3RvX3NtYXJ0X21vZGUpCisgICAgeworICAgICAgICAvKiBDb3B5IGJ1ZmZlciBpbnRvIHJlYWQtYWhlYWQgYnVmZmVyIGFuZCByZS1wYXJzZSAqLworICAgICAgICBsbmRlYnVnKCJzd2l0Y2hpbmcgdG8gc21hcnQgbW9kZVxuIik7CisgICAgICAgIC8qIElmIHRoZXJlIGFscmVhZHkgaXMgcmVhZF9haGVhZCBidWYgLSByZWFsbG9jIGl0ICovCisgICAgICAgIGlmIChzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZikKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqbmV3X2J1ZjsKKyAgICAgICAgICAgIG5ld19idWYgPSBiY21vc19hbGxvYyhzdHJsZW4oc2Vzc2lvbi0+cmVhZF9haGVhZF9idWYpIC0gc2Vzc2lvbi0+cmVhZF9haGVhZF9wb3MgKyBsZW4gKyAxKTsKKyAgICAgICAgICAgIGlmICghbmV3X2J1ZikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBtZW1jcHkobmV3X2J1ZiwgYnVmLCBsZW4pOworICAgICAgICAgICAgc3RyY3B5KCZuZXdfYnVmW2xlbl0sICZzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZltzZXNzaW9uLT5yZWFkX2FoZWFkX3Bvc10pOworICAgICAgICAgICAgYmNtb3NfZnJlZShzZXNzaW9uLT5yZWFkX2FoZWFkX2J1Zik7CisgICAgICAgICAgICBzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZiA9IG5ld19idWY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZiA9IGJjbW9zX2FsbG9jKGxlbiArIDEpOworICAgICAgICAgICAgaWYgKCFzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzdHJjcHkoc2Vzc2lvbi0+cmVhZF9haGVhZF9idWYsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbi0+cmVhZF9haGVhZF9wb3MgPSAwOworICAgICAgICBzZXNzaW9uLT5kdW1iX3Rlcm1pbmFsID0gMDsKKyAgICAgICAgc2Vzc2lvbi0+bmNvbHJlcXMgPSAwOworICAgICAgICAqYnVmID0gMDsKKyAgICAgICAgbnJlYWQgPSBsaW5lbm9pc2VFZGl0KHNlc3Npb24sIGJ1ZiwgYnVmbGVuLCAiIik7CisgICAgfQorICAgIGxuZGVidWcoIiAtIG91dC4gbGVuPSVkIGJ1Zj08JXM+IG5yZWFkPSVkXG4iLCAoaW50KXN0cmxlbihidWYpLCBidWYsIG5yZWFkKTsKKyAgICByZXR1cm4gKG5yZWFkID49MCkgPyBzdHJsZW4oYnVmKSA6IC0xOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGxpbmUgZWRpdGluZyBmdW5jdGlvbiBsaW5lbm9pc2VFZGl0KCkgdXNpbmcKKyAqIHRoZSBTVERJTiBmaWxlIGRlc2NyaXB0b3Igc2V0IGluIHJhdyBtb2RlLiAqLworc3RhdGljIGludCBsaW5lbm9pc2VSYXcobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLCBjb25zdCBjaGFyICpwcm9tcHQpIHsKKyAgICBpbnQgcmMgPSAwOworCisgICAgbG5kZWJ1ZygiXG4iKTsKKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUworICAgIGlmICghaXNhdHR5KFNURElOX0ZJTEVOTykpIHsKKyAgICAgICAgLyogTm90IGEgdHR5OiByZWFkIGZyb20gZmlsZSAvIHBpcGUuICovCisJcmMgPSBsaW5lbm9pc2VOb2VkaXQoc2Vzc2lvbiwgYnVmLCBidWZsZW4pOworCWlmIChyYyA+PSAwKQorCSAgICBzZXNzaW9uLT5pby53cml0ZShzZXNzaW9uLT5pby5mZF9vdXQsICJcbiIsIDEpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIC8qIEludGVyYWN0aXZlIGVkaXRpbmcuICovCisgICAgICAgIGlmIChlbmFibGVSYXdNb2RlKHNlc3Npb24pID09IC0xKSByZXR1cm4gLTE7CisKKyAgICAgICAgaWYgKCFzZXNzaW9uLT5kdW1iX3Rlcm1pbmFsICYmIHNlc3Npb24tPm5jb2xyZXFzID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgc2Vzc2lvbi0+ZHVtYl90ZXJtaW5hbCA9IDE7CisgICAgICAgICAgICBsbmRlYnVnKCJkdW1iX3Rlcm1pbmFsPSVkXG4iLCBzZXNzaW9uLT5kdW1iX3Rlcm1pbmFsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vzc2lvbi0+ZHVtYl90ZXJtaW5hbCkgeworICAgICAgICAgICAgc2Vzc2lvbi0+aW8ud3JpdGUoc2Vzc2lvbi0+aW8uZmRfb3V0LCBwcm9tcHQsIHN0cmxlbihwcm9tcHQpKTsKKyAgICAgICAgICAgIHJjID0gbGluZW5vaXNlTm9lZGl0KHNlc3Npb24sIGJ1ZiwgYnVmbGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJjID0gbGluZW5vaXNlRWRpdChzZXNzaW9uLCBidWYsIGJ1ZmxlbiwgcHJvbXB0KTsKKyAgICAgICAgfQorCisgICAgICAgIGRpc2FibGVSYXdNb2RlKHNlc3Npb24pOworICAgICAgICBpZiAocmMgPj0gMCkKKyAgICAgICAgICAgIHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgIlxuIiwgMSk7CisgICAgfQorICAgIGxuZGVidWcoIiAtIG91dC4gbGVuPSVkIGJ1Zj08JXM+IHJjPSVkXG4iLCAoaW50KXN0cmxlbihidWYpLCBidWYsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFRoZSBoaWdoIGxldmVsIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIG1haW4gQVBJIG9mIHRoZSBsaW5lbm9pc2UgbGlicmFyeS4KKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSB0ZXJtaW5hbCBoYXMgYmFzaWMgY2FwYWJpbGl0aWVzLCBqdXN0IGNoZWNraW5nCisgKiBmb3IgYSBibGFja2xpc3Qgb2Ygc3R1cGlkIHRlcm1pbmFscywgYW5kIGxhdGVyIGVpdGhlciBjYWxscyB0aGUgbGluZQorICogZWRpdGluZyBmdW5jdGlvbiBvciB1c2VzIGR1bW15IGZnZXRzKCkgc28gdGhhdCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHR5cGUKKyAqIHNvbWV0aGluZyBldmVuIGluIHRoZSBtb3N0IGRlc3BlcmF0ZSBvZiB0aGUgY29uZGl0aW9ucy4gKi8KK2NoYXIgKmxpbmVub2lzZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwcm9tcHQsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpIHsKKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIENvbmZpZ3VyZSB0ZXJtaW5hbCBhcyBkdW1iIGlmIGl0IGRvZXNuJ3Qgc3VwcG9ydCBiYXNpYyBFU0Mgc2VxdWVuY2VzICovCisgICAgaWYgKHNlc3Npb24tPmlvLmR1bWJfdGVybWluYWwgfHwgc2Vzc2lvbi0+Zm9yY2VkX2R1bWIpIHsKKyAgICAgICAgaW50IHJjOworCisgICAgICAgIHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgcHJvbXB0LCBzdHJsZW4ocHJvbXB0KSk7CisgICAgICAgIHJjID0gbGluZW5vaXNlTm9lZGl0KHNlc3Npb24sIGJ1Ziwgc2l6ZSk7CisgICAgICAgIHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgIlxuIiwgMSk7CisgICAgICAgIGxuZGVidWcoIiAtIG91dC4gbGVuPSVkIGJ1Zj08JXM+XG4iLCAoaW50KXN0cmxlbihidWYpLCBidWYpOworICAgICAgICByZXR1cm4gKHJjID09IC0xKSA/IE5VTEwgOiBidWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGxpbmVub2lzZVJhdyhzZXNzaW9uLCBidWYsIHNpemUsIHByb21wdCkgPT0gLTEpIHJldHVybiBOVUxMOworICAgICAgICBsbmRlYnVnKCIgLSBvdXQuIGxlbj0lZCBidWY9PCVzPlxuIiwgKGludClzdHJsZW4oYnVmKSwgYnVmKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhpc3RvcnkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIEZyZWUgdGhlIGhpc3RvcnksIGJ1dCBkb2VzIG5vdCByZXNldCBpdC4gT25seSB1c2VkIHdoZW4gd2UgaGF2ZSB0bworICogZXhpdCgpIHRvIGF2b2lkIG1lbW9yeSBsZWFrcyBhcmUgcmVwb3J0ZWQgYnkgdmFsZ3JpbmQgJiBjby4gKi8KK3N0YXRpYyB2b2lkIGZyZWVIaXN0b3J5KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeSkgeworICAgICAgICBpbnQgajsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2Vzc2lvbi0+aGlzdG9yeV9sZW47IGorKykKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbi0+aGlzdG9yeVtqXSk7CisgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbi0+aGlzdG9yeSk7CisgICAgICAgIHNlc3Npb24tPmhpc3RvcnkgPSBOVUxMOworICAgIH0KK30KKworLyogVGhpcyBpcyB0aGUgQVBJIGNhbGwgdG8gYWRkIGEgbmV3IGVudHJ5IGluIHRoZSBsaW5lbm9pc2UgaGlzdG9yeS4KKyAqIEl0IHVzZXMgYSBmaXhlZCBhcnJheSBvZiBjaGFyIHBvaW50ZXJzIHRoYXQgYXJlIHNoaWZ0ZWQgKG1lbW1vdmVkKQorICogd2hlbiB0aGUgaGlzdG9yeSBtYXggbGVuZ3RoIGlzIHJlYWNoZWQgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoZSBvbGRlcgorICogZW50cnkgYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBvbmUsIHNvIGl0IGlzIG5vdCBleGFjdGx5IHN1aXRhYmxlIGZvciBodWdlCisgKiBoaXN0b3JpZXMsIGJ1dCB3aWxsIHdvcmsgd2VsbCBmb3IgYSBmZXcgaHVuZHJlZCBvZiBlbnRyaWVzLgorICoKKyAqIFVzaW5nIGEgY2lyY3VsYXIgYnVmZmVyIGlzIHNtYXJ0ZXIsIGJ1dCBhIGJpdCBtb3JlIGNvbXBsZXggdG8gaGFuZGxlLiAqLworaW50IGxpbmVub2lzZUhpc3RvcnlBZGQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqbGluZSkgeworICAgIGNoYXIgKmxpbmVjb3B5OworCisgICAgaWYgKHNlc3Npb24tPmhpc3RvcnlfbWF4X2xlbiA9PSAwKSByZXR1cm4gMDsKKworICAgIC8qIEluaXRpYWxpemF0aW9uIG9uIGZpcnN0IGNhbGwuICovCisgICAgaWYgKHNlc3Npb24tPmhpc3RvcnkgPT0gTlVMTCkgeworICAgICAgICBzZXNzaW9uLT5oaXN0b3J5ID0gYmNtb3NfYWxsb2Moc2l6ZW9mKGNoYXIqKSpzZXNzaW9uLT5oaXN0b3J5X21heF9sZW4pOworICAgICAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICAgICAgbWVtc2V0KHNlc3Npb24tPmhpc3RvcnksMCwoc2l6ZW9mKGNoYXIqKSpzZXNzaW9uLT5oaXN0b3J5X21heF9sZW4pKTsKKyAgICB9CisKKyAgICAvKiBEb24ndCBhZGQgZHVwbGljYXRlZCBsaW5lcy4gKi8KKyAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeV9sZW4gJiYgIXN0cmNtcChzZXNzaW9uLT5oaXN0b3J5W3Nlc3Npb24tPmhpc3RvcnlfbGVuLTFdLCBsaW5lKSkgcmV0dXJuIDA7CisKKyAgICAvKiBBZGQgYW4gaGVhcCBhbGxvY2F0ZWQgY29weSBvZiB0aGUgbGluZSBpbiB0aGUgaGlzdG9yeS4KKyAgICAgKiBJZiB3ZSByZWFjaGVkIHRoZSBtYXggbGVuZ3RoLCByZW1vdmUgdGhlIG9sZGVyIGxpbmUuICovCisgICAgbGluZWNvcHkgPSBsaW5lbm9pc2Vfc3RyZHVwKGxpbmUpOworICAgIGlmICghbGluZWNvcHkpIHJldHVybiAwOworICAgIGlmIChzZXNzaW9uLT5oaXN0b3J5X2xlbiA9PSBzZXNzaW9uLT5oaXN0b3J5X21heF9sZW4pIHsKKyAgICAgICAgYmNtb3NfZnJlZShzZXNzaW9uLT5oaXN0b3J5WzBdKTsKKyAgICAgICAgbWVtbW92ZShzZXNzaW9uLT5oaXN0b3J5LHNlc3Npb24tPmhpc3RvcnkrMSxzaXplb2YoY2hhciopKihzZXNzaW9uLT5oaXN0b3J5X21heF9sZW4tMSkpOworICAgICAgICBzZXNzaW9uLT5oaXN0b3J5X2xlbi0tOworICAgIH0KKyAgICBzZXNzaW9uLT5oaXN0b3J5W3Nlc3Npb24tPmhpc3RvcnlfbGVuXSA9IGxpbmVjb3B5OworICAgIHNlc3Npb24tPmhpc3RvcnlfbGVuKys7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIFNldCB0aGUgbWF4aW11bSBsZW5ndGggZm9yIHRoZSBoaXN0b3J5LiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZXZlbgorICogaWYgdGhlcmUgaXMgYWxyZWFkeSBzb21lIGhpc3RvcnksIHRoZSBmdW5jdGlvbiB3aWxsIG1ha2Ugc3VyZSB0byByZXRhaW4KKyAqIGp1c3QgdGhlIGxhdGVzdCAnbGVuJyBlbGVtZW50cyBpZiB0aGUgbmV3IGhpc3RvcnkgbGVuZ3RoIHZhbHVlIGlzIHNtYWxsZXIKKyAqIHRoYW4gdGhlIGFtb3VudCBvZiBpdGVtcyBhbHJlYWR5IGluc2lkZSB0aGUgaGlzdG9yeS4gKi8KK2ludCBsaW5lbm9pc2VIaXN0b3J5U2V0TWF4TGVuKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGludCBsZW4pIHsKKyAgICBjaGFyICoqbmV3OworCisgICAgaWYgKGxlbiA8IDEpIHJldHVybiAwOworICAgIGlmIChzZXNzaW9uLT5oaXN0b3J5KSB7CisgICAgICAgIGludCB0b2NvcHkgPSBzZXNzaW9uLT5oaXN0b3J5X2xlbjsKKworICAgICAgICBuZXcgPSBiY21vc19hbGxvYyhzaXplb2YoY2hhciopKmxlbik7CisgICAgICAgIGlmIChuZXcgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICAgICAgLyogSWYgd2UgY2FuJ3QgY29weSBldmVyeXRoaW5nLCBmcmVlIHRoZSBlbGVtZW50cyB3ZSdsbCBub3QgdXNlLiAqLworICAgICAgICBpZiAobGVuIDwgdG9jb3B5KSB7CisgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRvY29weS1sZW47IGorKykgYmNtb3NfZnJlZShzZXNzaW9uLT5oaXN0b3J5W2pdKTsKKyAgICAgICAgICAgIHRvY29weSA9IGxlbjsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQobmV3LDAsc2l6ZW9mKGNoYXIqKSpsZW4pOworICAgICAgICBtZW1jcHkobmV3LHNlc3Npb24tPmhpc3RvcnkrKHNlc3Npb24tPmhpc3RvcnlfbGVuLXRvY29weSksIHNpemVvZihjaGFyKikqdG9jb3B5KTsKKyAgICAgICAgYmNtb3NfZnJlZShzZXNzaW9uLT5oaXN0b3J5KTsKKyAgICAgICAgc2Vzc2lvbi0+aGlzdG9yeSA9IG5ldzsKKyAgICB9CisgICAgc2Vzc2lvbi0+aGlzdG9yeV9tYXhfbGVuID0gbGVuOworICAgIGlmIChzZXNzaW9uLT5oaXN0b3J5X2xlbiA+IHNlc3Npb24tPmhpc3RvcnlfbWF4X2xlbikKKyAgICAgICAgc2Vzc2lvbi0+aGlzdG9yeV9sZW4gPSBzZXNzaW9uLT5oaXN0b3J5X21heF9sZW47CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBsaW5lbm9pc2VTZXRSYXcobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgaW50IHJhdykKK3sKKyAgICBpbnQgcmMgPSAwOworICAgIGlmIChyYXcpCisgICAgICAgIHJjID0gZW5hYmxlUmF3TW9kZShzZXNzaW9uKTsKKyAgICBlbHNlCisgICAgICAgIGRpc2FibGVSYXdNb2RlKHNlc3Npb24pOworICAgIHJldHVybiByYzsKK30KKworaW50IGxpbmVub2lzZUdldFJhdyhsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKQoreworICAgIHJldHVybiBzZXNzaW9uLT5yYXdtb2RlOworfQorCisjaWZuZGVmIExJTkVOT0lTRV9ESVNBQkxFX0hJU1RfU0FWRQorCisvKiBTYXZlIHRoZSBoaXN0b3J5IGluIHRoZSBzcGVjaWZpZWQgZmlsZS4gT24gc3VjY2VzcyAwIGlzIHJldHVybmVkCisgKiBvdGhlcndpc2UgLTEgaXMgcmV0dXJuZWQuICovCitpbnQgbGluZW5vaXNlSGlzdG9yeVNhdmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCJ3Iik7CisgICAgaW50IGo7CisKKyAgICBpZiAoZnAgPT0gTlVMTCkgcmV0dXJuIC0xOworICAgIGZvciAoaiA9IDA7IGogPCBzZXNzaW9uLT5oaXN0b3J5X2xlbjsgaisrKQorICAgICAgICBmcHJpbnRmKGZwLCIlc1xuIixzZXNzaW9uLT5oaXN0b3J5W2pdKTsKKyAgICBmY2xvc2UoZnApOworICAgIHJldHVybiAwOworfQorCisvKiBMb2FkIHRoZSBoaXN0b3J5IGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdAorICogemVybyBpcyByZXR1cm5lZCBhbmQgbm8gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KKyAqCisgKiBJZiB0aGUgZmlsZSBleGlzdHMgYW5kIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIDAgaXMgcmV0dXJuZWQsIG90aGVyd2lzZQorICogb24gZXJyb3IgLTEgaXMgcmV0dXJuZWQuICovCitpbnQgbGluZW5vaXNlSGlzdG9yeUxvYWQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCJyIik7CisgICAgY2hhciAqYnVmOworCisgICAgaWYgKGZwID09IE5VTEwpIHJldHVybiAtMTsKKyAgICBidWYgPSBiY21vc19hbGxvYyhMSU5FTk9JU0VfTUFYX0xJTkUpOworICAgIGlmICghYnVmKQorICAgIHsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHdoaWxlIChmZ2V0cyhidWYsTElORU5PSVNFX01BWF9MSU5FLGZwKSAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKnA7CisKKyAgICAgICAgcCA9IHN0cmNocihidWYsJ1xyJyk7CisgICAgICAgIGlmICghcCkgcCA9IHN0cmNocihidWYsJ1xuJyk7CisgICAgICAgIGlmIChwKSAqcCA9ICdcMCc7CisgICAgICAgIGxpbmVub2lzZUhpc3RvcnlBZGQoc2Vzc2lvbiwgYnVmKTsKKyAgICB9CisgICAgZmNsb3NlKGZwKTsKKyAgICBiY21vc19mcmVlKGJ1Zik7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2xpbmVub2lzZS9saW5lbm9pc2UuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9saW5lbm9pc2UvbGluZW5vaXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4MDQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9saW5lbm9pc2UvbGluZW5vaXNlLmgKQEAgLTAsMCArMSw3OSBAQAorLyogbGluZW5vaXNlLmggLS0gZ3VlcnJpbGxhIGxpbmUgZWRpdGluZyBsaWJyYXJ5IGFnYWluc3QgdGhlIGlkZWEgdGhhdCBhCisgKiBsaW5lIGVkaXRpbmcgbGliIG5lZWRzIHRvIGJlIDIwLDAwMCBsaW5lcyBvZiBDIGNvZGUuCisgKgorICogU2VlIGxpbmVub2lzZS5jIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgU2FsdmF0b3JlIFNhbmZpbGlwcG8gPGFudGlyZXogYXQgZ21haWwgZG90IGNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgUGlldGVyIE5vb3JkaHVpcyA8cGNub29yZGh1aXMgYXQgZ21haWwgZG90IGNvbT4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICogIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAqICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fTElORU5PSVNFX0gKKyNkZWZpbmUgX19MSU5FTk9JU0VfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGxpbmVub2lzZVNlc3Npb25JTworeworICAgIGxvbmcgZmRfaW47CisgICAgbG9uZyBmZF9vdXQ7CisgICAgaW50ICgqcmVhZF9jaGFyKShsb25nIGZkX2luLCBjaGFyICpjKTsKKyAgICBpbnQgKCp3cml0ZSkobG9uZyBmZF9vdXQsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisgICAgaW50IGR1bWJfdGVybWluYWw7IC8qIDE9ZHVtYiB0ZXJtaW5hbC4gZG8gbm90IHVzZSBlc2NhcGUgc2VxdWVuY2VzICovCit9IGxpbmVub2lzZVNlc3Npb25JTzsKKwordHlwZWRlZiBzdHJ1Y3QgbGluZW5vaXNlU2Vzc2lvbiBsaW5lbm9pc2VTZXNzaW9uOworCit0eXBlZGVmIGludCAobGluZW5vaXNlQ29tcGxldGlvbkNhbGxiYWNrKShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICosIGludCBwb3MpOworaW50IGxpbmVub2lzZVNlc3Npb25PcGVuKGNvbnN0IGxpbmVub2lzZVNlc3Npb25JTyAqaW8sIHZvaWQgKnNlc3Npb25fZGF0YSwgbGluZW5vaXNlU2Vzc2lvbiAqKnNlc3Npb24pOwordm9pZCBsaW5lbm9pc2VTZXNzaW9uQ2xvc2UobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbik7Cit2b2lkICpsaW5lbm9pc2VTZXNzaW9uRGF0YShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKTsKK3ZvaWQgbGluZW5vaXNlU2V0Q29tcGxldGlvbkNhbGxiYWNrKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGxpbmVub2lzZUNvbXBsZXRpb25DYWxsYmFjayAqKTsKK3ZvaWQgbGluZW5vaXNlU2V0QnVmZmVyKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IHBvcyk7CisKK2NoYXIgKmxpbmVub2lzZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwcm9tcHQsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworaW50IGxpbmVub2lzZUhpc3RvcnlBZGQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqbGluZSk7CitpbnQgbGluZW5vaXNlSGlzdG9yeVNldE1heExlbihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBpbnQgbGVuKTsKK2ludCBsaW5lbm9pc2VIaXN0b3J5U2F2ZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CitpbnQgbGluZW5vaXNlSGlzdG9yeUxvYWQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZmlsZW5hbWUpOwordm9pZCBsaW5lbm9pc2VDbGVhclNjcmVlbihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKTsKK3ZvaWQgbGluZW5vaXNlU2V0TXVsdGlMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGludCBtbCk7Cit2b2lkIGxpbmVub2lzZVNldER1bWJUZXJtaW5hbChsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBpbnQgZHVtYik7CitpbnQgbGluZW5vaXNlR2V0TXVsdGlMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pOworaW50IGxpbmVub2lzZUdldER1bWJUZXJtaW5hbChsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKTsKK2ludCBsaW5lbm9pc2VTZXRSYXcobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgaW50IHJhdyk7CitpbnQgbGluZW5vaXNlR2V0UmF3KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19MSU5FTk9JU0VfSCAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3JlbW90ZV9jbGkvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvcmVtb3RlX2NsaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTJmZTZlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3JlbW90ZV9jbGkvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACitpZmVxICgiJChPUykiLCAicG9zaXgiKQ0KK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQ0KKyAgICBNT0RfTkFNRSA9IGJjbV9yZW1vdGVfY2xpDQorICAgIE1PRF9UWVBFID0gbGliDQorICAgIE1PRF9ERVBTID0gY2xpIGFwaV9jbGkNCisgICAgc3JjcyA9IGJjbW9sdF9yZW1vdGVfY2xpLmMNCisgICAgVVNFX0xJTlQgPSB5ZXMNCitlbmRpZg0KK2VuZGlmDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3JlbW90ZV9jbGkvYmNtb2x0X3JlbW90ZV9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL2JjbW9sdF9yZW1vdGVfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhOWQyZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL2JjbW9sdF9yZW1vdGVfY2xpLmMKQEAgLTAsMCArMSw1NDMgQEAKKy8qDQorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkDQorDQorICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQ0KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQNCisNCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlDQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZA0KK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMg0KKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLA0KK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6DQorDQorICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQ0KKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZA0KKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXINCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50DQorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuDQorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcw0KKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zDQorICAgb2YgdGhlIHNvZnR3YXJlLg0KKw0KK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQ0KK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZA0KK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yDQord3JpdHRlbiBjb25zZW50Lg0KKw0KKzo+DQorICovDQorDQorI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPg0KKyNpbmNsdWRlIDxiY210cl9pbnRlcmZhY2UuaD4NCisjaW5jbHVkZSA8YmNtdHJfaGVhZGVyLmg+DQorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4NCisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPg0KKyNpbmNsdWRlIDxiY210cl9kZWJ1Zy5oPg0KKyNpbmNsdWRlIDxiY21jbGlfc2Vzc2lvbi5oPg0KKyNpbmNsdWRlICJiY21vbHRfcmVtb3RlX2NsaS5oIg0KKyNpZmRlZiBFTkFCTEVfTE9HDQorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiDQorI2VuZGlmDQorDQorI2RlZmluZSBSRU1PVEVfQ0xJX0JVRkZFUl9NQVggNjU2MzUgLyogTWF4IHJlYXNzZW1ibGVkIHBhY2tldCBwbHVzIGhlYWRlciAqLw0KKyNkZWZpbmUgUkVNT1RFX0NMSV9NRVNTQUdFX1FVRVVFX0RFUFRIIEJDTU9TX01TR19QT09MX0RFRkFVTFRfU0laRQ0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgUkVNT1RFX0NMSV9PUENPREVfQ0xJX0NPTU1BTkQsDQorICAgIFJFTU9URV9DTElfT1BDT0RFX0lORElDQVRJT04sDQorICAgIFJFTU9URV9DTElfT1BDT0RFX1BST1hZX1JYDQorfSByZW1vdGVfY2xpX29wY29kZTsNCisNCisvKiBTdGF0aXN0aWNzICovDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIHVuc2lnbmVkIGxvbmcgcnhfcmVxdWVzdHM7DQorICAgIHVuc2lnbmVkIGxvbmcgdHhfcmVzcG9uc2VzOw0KKyAgICB1bnNpZ25lZCBsb25nIGluZGljYXRpb25zOw0KKyAgICB1bnNpZ25lZCBsb25nIHByb3h5X3J4czsNCisgICAgdW5zaWduZWQgbG9uZyB1bnBhY2tfZXJyb3JzOw0KKyAgICB1bnNpZ25lZCBsb25nIHBhY2tfZXJyb3JzOw0KKyAgICB1bnNpZ25lZCBsb25nIGNvcnJlbGF0aW9uX2Vycm9yczsNCisgICAgdW5zaWduZWQgbG9uZyB0eF9zb2NrZXRfZXJyb3JzOw0KKyAgICB1bnNpZ25lZCBsb25nIHJ4X3NvY2tldF9lcnJvcnM7DQorICAgIHVuc2lnbmVkIGxvbmcgbWVzc2FnZV9lcnJvcnM7DQorfSByZW1vdGVfY2xpX3N0YXRzOw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICBiY21vc190YXNrIG91dHB1dF90YXNrOw0KKyAgICBiY21vc190YXNrIHNvY2tldF90YXNrOw0KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpZW50Ow0KKyAgICB1aW50MTZfdCBwb3J0Ow0KKyAgICBpbnQgY2xpZW50X3NvY2tldDsNCisgICAgYmNtb3NfYm9vbCBpc19ydW5uaW5nOw0KKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsNCisgICAgYmNtb3NfYm9vbCBvdXRwdXRfcGVuZGluZzsNCisgICAgdWludDhfdCBpbnB1dF9idWZmZXJbUkVNT1RFX0NMSV9CVUZGRVJfTUFYXTsNCisgICAgY2hhciAqaW5wdXRfc3RyOw0KKyAgICB1aW50OF90IG91dHB1dF9idWZmZXJbUkVNT1RFX0NMSV9CVUZGRVJfTUFYXTsNCisgICAgdWludDE2X3Qgb3V0cHV0X2N1cnJlbnRfY2hhcjsNCisgICAgYmNtb3NfbXV0ZXggb3V0cHV0X2xvY2s7DQorICAgIGludCBjdXJyZW50X2NvcnJfdGFnOw0KKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbjsNCisgICAgcmVtb3RlX2NsaV9zdGF0cyBzdGF0czsNCit9IHJlbW90ZV9jbGlfY29udHJvbF9ibG9jazsNCisNCitzdGF0aWMgcmVtb3RlX2NsaV9jb250cm9sX2Jsb2NrIHJlbW90ZV9jbGlfZGF0YVtCQ01UUl9NQVhfT0xUU107DQorDQorc3RhdGljIGJjbW9zX2Vycm5vIHJlbW90ZV9jbGlfc3RhdHNfY21kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpDQorew0KKyAgICBpbnQgZGV2aWNlID0gKGludClwYXJtWzBdLnZhbHVlLm51bWJlcjsNCisNCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7DQorICAgIH0NCisNCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAicnhfcmVxdWVzdHMiLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy5yeF9yZXF1ZXN0cyk7DQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInR4X3Jlc3BvbnNlcyIsIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X3Jlc3BvbnNlcyk7DQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgImluZGljYXRpb25zIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMuaW5kaWNhdGlvbnMpOw0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJwcm94eV9yeHMiLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy5wcm94eV9yeHMpOw0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ1bnBhY2tfZXJyb3JzIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMudW5wYWNrX2Vycm9ycyk7DQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInBhY2tfZXJyb3JzIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMucGFja19lcnJvcnMpOw0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ0eF9zb2NrZXRfZXJyb3JzIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMudHhfc29ja2V0X2Vycm9ycyk7DQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInJ4X3NvY2tldF9lcnJvcnMiLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy5yeF9zb2NrZXRfZXJyb3JzKTsNCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAibWVzc2FnZV9lcnJvcnMiLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy5tZXNzYWdlX2Vycm9ycyk7DQorICAgIG1lbXNldCgmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMsIDAsIHNpemVvZihyZW1vdGVfY2xpX3N0YXRzKSk7DQorDQorICAgIHJldHVybiBCQ01fRVJSX09LOw0KK30NCisNCitzdGF0aWMgdm9pZCBzZW5kX291dHB1dF9wYWNrZXRzKGJjbW9sdF9kZXZpZCBkZXZpY2UsIHJlbW90ZV9jbGlfb3Bjb2RlIG9wY29kZSwgdWludDE2X3QgY29ycl90YWcpDQorew0KKyAgICBiY21vbHRfYnVmIGJ1ZiA9IHt9Ow0KKyAgICBzdGF0aWMgdWludDhfdCBzY3JhdGNoX2J1ZmZlcltSRU1PVEVfQ0xJX0JVRkZFUl9NQVhdOw0KKyAgICBzc2l6ZV90IGxlbjsNCisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7DQorDQorICAgIGlmIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfY3VycmVudF9jaGFyID09IDApDQorICAgIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgUkVNT1RFX0NMSV9CVUZGRVJfTUFYLCBzY3JhdGNoX2J1ZmZlciwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOw0KKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoJmJ1ZiwgKHVpbnQ4X3Qpb3Bjb2RlKTsNCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZSgmYnVmLCBjb3JyX3RhZyk7DQorICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZSgNCisgICAgICAgICZidWYsDQorICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfYnVmZmVyLA0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2N1cnJlbnRfY2hhcik7DQorDQorICAgIGlmICghb2spDQorICAgIHsNCisgICAgICAgICsrcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMucGFja19lcnJvcnM7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisNCisgICAgLyogU2VuZCB0byBjbGllbnQgKi8NCisgICAgbGVuID0gc2VuZHRvKA0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCwNCisgICAgICAgIGJ1Zi5zdGFydCwNCisgICAgICAgIGJjbW9sdF9idWZfZ2V0X3VzZWQoJmJ1ZiksDQorICAgICAgICAwLA0KKyAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnQsDQorICAgICAgICBzaXplb2YocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY2xpZW50KSk7DQorDQorICAgIGlmIChsZW4gPD0gMCkNCisgICAgew0KKyAgICAgICAgKytyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy50eF9zb2NrZXRfZXJyb3JzOw0KKyAgICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHByb2Nlc3NfY2xpX2lucHV0KGJjbW9sdF9kZXZpZCBkZXZpY2UpDQorew0KKyAgICBiY21vc19tdXRleF9sb2NrKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfbG9jayk7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9jdXJyZW50X2NoYXIgPSAwOw0KKyAgICBtZW1zZXQocmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2J1ZmZlciwgMCwgc2l6ZW9mKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9idWZmZXIpKTsNCisgICAgYmNtY2xpX3BhcnNlKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnNlc3Npb24sIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmlucHV0X3N0cik7DQorICAgIGJjbW9zX211dGV4X3VubG9jaygmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2xvY2spOw0KK30NCisNCitzdGF0aWMgaW50IHJlbW90ZV9jbGlfc2Vzc2lvbl93cml0ZV9jYihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQ0KK3sNCisgICAgaW50IGk7DQorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAqKChiY21vbHRfZGV2aWQgKiliY21jbGlfc2Vzc2lvbl91c2VyX3ByaXYoc2Vzc2lvbikpOw0KKw0KKyAgICBiY21vc19tdXRleF9sb2NrKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfbG9jayk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpDQorICAgIHsNCisgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9idWZmZXJbcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2N1cnJlbnRfY2hhcl0gPSBidWZbaV07DQorICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9jdXJyZW50X2NoYXI7DQorICAgIH0NCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfbG9jayk7DQorDQorICAgIHJldHVybiBzaXplOw0KK30NCisNCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2NsaV9vcGVuX3Nlc3Npb24oYmNtb2x0X2RldmlkIGRldmljZSkNCit7DQorICAgIGJjbW9zX2Vycm5vIHJjOw0KKyAgICBiY21jbGlfc2Vzc2lvbl9wYXJtIHNlc3NfcGFybSA9IHt9Ow0KKyAgICBzZXNzX3Bhcm0uYWNjZXNzX3JpZ2h0ID0gQkNNQ0xJX0FDQ0VTU19ERUJVRzsNCisgICAgc2Vzc19wYXJtLndyaXRlID0gcmVtb3RlX2NsaV9zZXNzaW9uX3dyaXRlX2NiOw0KKyAgICBzZXNzX3Bhcm0udXNlcl9wcml2ID0gYmNtb3NfY2FsbG9jKHNpemVvZihkZXZpY2UpKTsNCisgICAgc2Vzc19wYXJtLmxpbmVfZWRpdF9tb2RlID0gQkNNQ0xJX0xJTkVfRURJVF9ESVNBQkxFOw0KKyAgICBCVUdfT04oc2Vzc19wYXJtLnVzZXJfcHJpdiA9PSBOVUxMKTsNCisgICAgKigoYmNtb2x0X2RldmlkICopc2Vzc19wYXJtLnVzZXJfcHJpdikgPSBkZXZpY2U7DQorICAgIHJjID0gYmNtY2xpX3Nlc3Npb25fb3Blbigmc2Vzc19wYXJtLCAmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc2Vzc2lvbik7DQorDQorICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQ0KKyAgICB7DQorICAgICAgICBwZXJyb3IoIkNhbid0IG9wZW4gc2Vzc2lvbiIpOw0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgICAgICBCQ01fTE9HKA0KKyAgICAgICAgICAgIEVSUk9SLA0KKyAgICAgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCwNCisgICAgICAgICAgICAiQ2FuJ3Qgb3BlbiBzZXNzaW9uXG4iKTsNCisjZW5kaWYNCisgICAgICAgIHNodXRkb3duKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQsIFNIVVRfUkRXUik7DQorICAgIH0NCisgICAgcmV0dXJuIHJjOw0KK30NCisNCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2NsaV9vcGVuX3NvY2tldChiY21vbHRfZGV2aWQgZGV2aWNlKQ0KK3sNCisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhID0ge307DQorICAgIC8qIFN0YXJ0IGxpc3RlbmluZyBvbiBwb3J0ICovDQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7DQorICAgIGlmIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0IDwgMCkNCisgICAgew0KKyAgICAgICAgcGVycm9yKCJDYW4ndCBjcmVhdGUgc29ja2V0Iik7DQorI2lmZGVmIEVOQUJMRV9MT0cNCisgICAgICAgIEJDTV9MT0coDQorICAgICAgICAgICAgRVJST1IsDQorICAgICAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ubG9nX2lkLA0KKyAgICAgICAgICAgICJDYW4ndCBjcmVhdGUgc29ja2V0XG4iKTsNCisjZW5kaWYNCisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOw0KKyAgICB9DQorDQorICAgIC8qIEJpbmQgbG9jYWwgKi8NCisgICAgc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7DQorICAgIHNhLnNpbl9wb3J0ID0gKGluX3BvcnRfdClodG9ucyhyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5wb3J0KTsNCisgICAgc2Euc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsNCisgICAgaWYgKGJpbmQocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCwgKHN0cnVjdCBzb2NrYWRkciopJnNhLCBzaXplb2Yoc2EpKSA9PSAtMSkNCisgICAgew0KKyAgICAgICAgcGVycm9yKCJDYW4ndCBiaW5kIHRvIHNvY2tldCIpOw0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgICAgICBCQ01fTE9HKA0KKyAgICAgICAgICAgIEVSUk9SLA0KKyAgICAgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCwNCisgICAgICAgICAgICAiQ2FuJ3QgYmluZCBzb2NrZXQgdG8gcG9ydCAldVxuIiwNCisgICAgICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5wb3J0KTsNCisjZW5kaWYNCisgICAgICAgIHNodXRkb3duKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQsIFNIVVRfUkRXUik7DQorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsNCit9DQorDQorc3RhdGljIHZvaWQgcmVtb3RlX2NsaV9pbmRpY2F0aW9uX2NiKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqbXNnKQ0KK3sNCisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpKG1vZHVsZV9pZCAtIEJDTU9TX01PRFVMRV9JRF9SRU1PVEVfQ0xJX0RFVjApOw0KKyAgICBiY21vbHRfbXNnICppbmQgPSBtc2ctPmRhdGE7DQorDQorICAgIGJjbW9zX211dGV4X2xvY2soJnJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9sb2NrKTsNCisgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2N1cnJlbnRfY2hhciA9IDA7DQorICAgIG1lbXNldChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfYnVmZmVyLCAwLCBzaXplb2YocmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2J1ZmZlcikpOw0KKw0KKyAgICBhcGljbGlfbXNnX2R1bXAocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc2Vzc2lvbiwgaW5kKTsNCisgICAgaWYgKGluZC0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPKQ0KKyAgICB7DQorICAgICAgICBzZW5kX291dHB1dF9wYWNrZXRzKGRldmljZSwgUkVNT1RFX0NMSV9PUENPREVfSU5ESUNBVElPTiwgaW5kLT5jb3JyX3RhZyk7DQorICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLmluZGljYXRpb25zOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKGluZC0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCkNCisgICAgew0KKyAgICAgICAgc2VuZF9vdXRwdXRfcGFja2V0cyhkZXZpY2UsIFJFTU9URV9DTElfT1BDT0RFX1BST1hZX1JYLCBpbmQtPmNvcnJfdGFnKTsNCisgICAgICAgICsrcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMucHJveHlfcnhzOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgICAgICBCQ01fTE9HKA0KKyAgICAgICAgICAgIEVSUk9SLA0KKyAgICAgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCwNCisgICAgICAgICAgICAiVW5rbm93biBncm91cCB0eXBlICV1XG4iLA0KKyAgICAgICAgICAgIGluZC0+Z3JvdXApOw0KKyNlbmRpZg0KKyAgICB9DQorICAgIGJjbW9zX211dGV4X3VubG9jaygmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2xvY2spOw0KKw0KKyAgICBiY21vbHRfbXNnX2ZyZWUoaW5kKTsNCit9DQorDQorc3RhdGljIHZvaWQgcmVtb3RlX2NsaV9vdXRwdXRfY2IoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICptc2cpDQorew0KKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCkobW9kdWxlX2lkIC0gQkNNT1NfTU9EVUxFX0lEX1JFTU9URV9DTElfREVWMCk7DQorICAgIHByb2Nlc3NfY2xpX2lucHV0KGRldmljZSk7DQorICAgIHNlbmRfb3V0cHV0X3BhY2tldHMoZGV2aWNlLCBSRU1PVEVfQ0xJX09QQ09ERV9DTElfQ09NTUFORCwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY3VycmVudF9jb3JyX3RhZyk7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9wZW5kaW5nID0gQkNNT1NfRkFMU0U7DQorICAgICsrcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMudHhfcmVzcG9uc2VzOw0KK30NCisNCitzdGF0aWMgaW50IHJlbW90ZV9jbGlfc29ja2V0X3Rhc2sobG9uZyBkYXRhKQ0KK3sNCisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpZGF0YTsNCisgICAgc3RydWN0IHNvY2thZGRyX2luIHNlbmRlcjsNCisgICAgc29ja2xlbl90IHNlbmRzaXplID0gc2l6ZW9mKHNlbmRlcik7DQorICAgIGJjbW9sdF9idWYgYnVmOw0KKyAgICBzc2l6ZV90IGxlbjsNCisgICAgdWludDhfdCBvcGNvZGUgPSAwOw0KKyAgICB1aW50MTZfdCBjb3JyX3RhZyA9IDA7DQorICAgIGJjbW9zX2Jvb2wgb2sgPSBCQ01PU19UUlVFOw0KKyAgICBiY21vc19tc2cgb3V0cHV0X21zZyA9IHsgLmhhbmRsZXIgPSByZW1vdGVfY2xpX291dHB1dF9jYiB9Ow0KKyAgICBiY21vc19lcnJubyByYzsNCisNCisgICAgcmMgPSByZW1vdGVfY2xpX29wZW5fc29ja2V0KGRldmljZSk7DQorICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYyAhPSBCQ01fRVJSX09LLCByYywgLTEpOw0KKyAgICByYyA9IHJlbW90ZV9jbGlfb3Blbl9zZXNzaW9uKGRldmljZSk7DQorICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYyAhPSBCQ01fRVJSX09LLCByYywgLTEpOw0KKw0KKyAgICB3aGlsZSAocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaXNfcnVubmluZykNCisgICAgew0KKyAgICAgICAgaWYgKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9wZW5kaW5nKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJjbW9zX3VzbGVlcCgxMDAwKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmN1cnJlbnRfY29ycl90YWcgPSAtMTsNCisgICAgICAgIG1lbXNldChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5pbnB1dF9idWZmZXIsIDAsIHNpemVvZihyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5pbnB1dF9idWZmZXIpKTsNCisNCisgICAgICAgIG1lbXNldCgmc2VuZGVyLCAwLCBzaXplb2Yoc2VuZGVyKSk7DQorICAgICAgICBsZW4gPSByZWN2ZnJvbSgNCisgICAgICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0LA0KKyAgICAgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmlucHV0X2J1ZmZlciwNCisgICAgICAgICAgICBzaXplb2YocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaW5wdXRfYnVmZmVyKSwNCisgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2VuZGVyLA0KKyAgICAgICAgICAgICZzZW5kc2l6ZSk7DQorICAgICAgICBpZiAobGVuIDwgMCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBiY21vc191c2xlZXAoMTAwMDAwMCk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnJ4X3JlcXVlc3RzOw0KKw0KKyAgICAgICAgaWYgKChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnQuc2luX2FkZHIuc19hZGRyICE9IHNlbmRlci5zaW5fYWRkci5zX2FkZHIpIHx8DQorICAgICAgICAgICAgKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudC5zaW5fcG9ydCAhPSBzZW5kZXIuc2luX3BvcnQpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudCA9IHNlbmRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8qIFVucGFjayByZWNlaXZlZCBtZXNzYWdlICovDQorICAgICAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgKHVpbnQzMl90KWxlbiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaW5wdXRfYnVmZmVyLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7DQorICAgICAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91OCgmYnVmLCAmb3Bjb2RlKTsNCisgICAgICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZSgmYnVmLCAmY29ycl90YWcpOw0KKw0KKyAgICAgICAgaWYgKCFvaykNCisgICAgICAgIHsNCisgICAgICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnVucGFja19lcnJvcnM7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoKHJlbW90ZV9jbGlfb3Bjb2RlKW9wY29kZSAhPSBSRU1PVEVfQ0xJX09QQ09ERV9DTElfQ09NTUFORCkNCisgICAgICAgIHsNCisgICAgICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnVucGFja19lcnJvcnM7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmN1cnJlbnRfY29ycl90YWcgIT0gY29ycl90YWcpICYmIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jdXJyZW50X2NvcnJfdGFnID49IDApKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICsrcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMuY29ycmVsYXRpb25fZXJyb3JzOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaW5wdXRfc3RyID0gKGNoYXIgKiliY21vbHRfYnVmX3NuYXBfZ2V0KCZidWYpOw0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaW5wdXRfc3RyW2JjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKCZidWYpXSA9ICdcMCc7DQorICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jdXJyZW50X2NvcnJfdGFnID0gY29ycl90YWc7DQorICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfcGVuZGluZyA9IEJDTU9TX1RSVUU7DQorICAgICAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZSgNCisgICAgICAgICAgICBiY21vc19tb2R1bGVfaWRfZm9yX2RldmljZShCQ01PU19NT0RVTEVfSURfUkVNT1RFX0NMSV9ERVYwLCBkZXZpY2UpLA0KKyAgICAgICAgICAgICZvdXRwdXRfbXNnLA0KKyAgICAgICAgICAgIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7DQorICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykNCisgICAgICAgIHsNCisgICAgICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLm1lc3NhZ2VfZXJyb3JzOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIGJjbW9zX2ZyZWUoYmNtY2xpX3Nlc3Npb25fdXNlcl9wcml2KHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnNlc3Npb24pKTsNCisgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2UocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc2Vzc2lvbik7DQorICAgIHNodXRkb3duKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQsIFNIVVRfUkRXUik7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnNvY2tldF90YXNrLmRlc3Ryb3llZCA9IEJDTU9TX1RSVUU7DQorICAgIHJldHVybiAwOw0KK30NCisNCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2NsaV9zdGFydChiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCByZW1vdGVfY2xpX3BvcnQpDQorew0KKyAgICBiY21vc19lcnJubyByYzsNCisgICAgYmNtb3NfdGFza19wYXJtIG91dHB1dF90YXNrX3BhcmFtcyA9DQorICAgIHsNCisgICAgICAgIC5uYW1lID0gInJlbW90ZV9jbGlfaW5kaWNhdGlvbiIsDQorICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1RSQU5TUE9SVF9SRU1PVEVfQ0xJDQorICAgIH07DQorDQorICAgIGJjbW9zX3Rhc2tfcGFybSBzb2NrZXRfdGFza19wYXJhbXMgPQ0KKyAgICB7DQorICAgICAgICAubmFtZSA9ICJyZW1vdGVfY2xpX21haW4iLA0KKyAgICAgICAgLmhhbmRsZXIgPSByZW1vdGVfY2xpX3NvY2tldF90YXNrLA0KKyAgICAgICAgLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUkVNT1RFX0NMSSwNCisgICAgICAgIC5kYXRhID0gKGxvbmcpZGV2aWNlDQorICAgIH07DQorDQorICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQ0KKyAgICB7DQorICAgICAgICAucXBhcm0gPSB7IC5uYW1lID0gInJlbW90ZV9jbGkiLCAuc2l6ZSA9IFJFTU9URV9DTElfTUVTU0FHRV9RVUVVRV9ERVBUSCB9DQorICAgIH07DQorDQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnBvcnQgPSByZW1vdGVfY2xpX3BvcnQ7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmN1cnJlbnRfY29ycl90YWcgPSAtMTsNCisgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaXNfcnVubmluZyA9IEJDTU9TX1RSVUU7DQorDQorICAgIC8qIENyZWF0ZSB0aHJlYWQgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBBUElzICovDQorICAgIHJjID0gYmNtb3NfdGFza19jcmVhdGUoJnJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnNvY2tldF90YXNrLCAmc29ja2V0X3Rhc2tfcGFyYW1zKTsNCisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gcmMpOw0KKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfdGFzaywgJm91dHB1dF90YXNrX3BhcmFtcyk7DQorICAgIEJVR19PTihCQ01fRVJSX09LICE9IHJjKTsNCisgICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfbG9jaywgMCwgInJlbW90ZV9jbGkiKTsNCisNCisgICAgcmMgPSBiY21vc19tb2R1bGVfY3JlYXRlKA0KKyAgICAgICAgYmNtb3NfbW9kdWxlX2lkX2Zvcl9kZXZpY2UoQkNNT1NfTU9EVUxFX0lEX1JFTU9URV9DTElfREVWMCwgZGV2aWNlKSwNCisgICAgICAgICZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfdGFzaywNCisgICAgICAgICZtb2R1bGVfcGFyYW1zKTsNCisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gcmMpOw0KKw0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgIEJDTV9MT0coDQorICAgICAgICBJTkZPLA0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ubG9nX2lkLA0KKyAgICAgICAgIkJDTTY4NjIwIHJlbW90ZSBjbGkgZm9yIGRldmljZSAlZCBpcyBsaXN0ZW5pbmcgb24gcG9ydCAldVxuIiwNCisgICAgICAgIChpbnQpZGV2aWNlLA0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ucG9ydCk7DQorI2VuZGlmDQorDQorICAgIHJldHVybiBCQ01fRVJSX09LOw0KK30NCisNCisvKiBBdXRvIC8gcHJveHkgbWVzc2FnZSBoYW5kbGVyICovDQordm9pZCBiY21vbHRfcmVtb3RlX2NsaV9hdXRvX3J4X2NiKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykNCit7DQorICAgIGJjbW9zX2Vycm5vIGVycjsNCisgICAgYmNtb2x0X21zZyAqaW5kX2Nsb25lID0gTlVMTDsNCisNCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykNCisgICAgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorDQorICAgIGlmIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5pc19ydW5uaW5nKQ0KKyAgICB7DQorICAgICAgICBlcnIgPSBiY21vbHRfbXNnX2Nsb25lKCZpbmRfY2xvbmUsIG1zZyk7DQorICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spDQorICAgICAgICB7DQorI2lmZGVmIEVOQUJMRV9MT0cNCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5sb2dfaWQsICJJbmRpY2F0aW9uIGNsb25lIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisNCisgICAgICAgIGluZF9jbG9uZS0+b3NfbXNnLmhhbmRsZXIgPSByZW1vdGVfY2xpX2luZGljYXRpb25fY2I7DQorICAgICAgICBpbmRfY2xvbmUtPm9zX21zZy5kYXRhID0gaW5kX2Nsb25lOw0KKyAgICAgICAgZXJyID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKA0KKyAgICAgICAgICAgIGJjbW9zX21vZHVsZV9pZF9mb3JfZGV2aWNlKEJDTU9TX01PRFVMRV9JRF9SRU1PVEVfQ0xJX0RFVjAsIGRldmljZSksDQorICAgICAgICAgICAgJmluZF9jbG9uZS0+b3NfbXNnLA0KKyAgICAgICAgICAgIDApOw0KKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICsrcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMubWVzc2FnZV9lcnJvcnM7DQorICAgICAgICB9DQorICAgIH0NCit9DQorDQorYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9jbGlfaW5pdChiY21jbGlfZW50cnkgKnJvb3QsIGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90IHJlbW90ZV9jbGlfcG9ydCkNCit7DQorICAgIGJjbWNsaV9lbnRyeSAqZGlyOw0KKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOw0KKyAgICB9DQorDQorICAgIGlmIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5pc19ydW5uaW5nKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOw0KKyAgICB9DQorDQorICAgIEJDTV9NRU1aRVJPX1NUUlVDVCgmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0pOw0KKw0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgIHsNCisgICAgY2hhciBsb2dfaWRbMzJdOw0KKyAgICBzbnByaW50Zihsb2dfaWQsIHNpemVvZihsb2dfaWQpIC0gMSwgInJlbW90ZV9jbGlfJWQiLCAoaW50KWRldmljZSk7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCA9DQorICAgICAgICBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihsb2dfaWQsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOw0KKyAgICB9DQorI2Vsc2UNCisgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ubG9nX2lkID0gREVWX0xPR19JTlZBTElEX0lEOw0KKyNlbmRpZg0KKw0KKyAgICBkaXIgPSBiY21jbGlfZGlyX2FkZChyb290LCAicmVtb3RlX2NsaSIsICJSZW1vdGUgQ0xJIiwgQkNNQ0xJX0FDQ0VTU19HVUVTVCwgTlVMTCk7DQorICAgIGlmICghZGlyKQ0KKyAgICB7DQorI2lmZGVmIEVOQUJMRV9MT0cNCisgICAgICAgIEJDTV9MT0coRVJST1IsIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCwgIkNhbid0IGNyZWF0ZSByZW1vdGUgQ0xJIGRpcmVjdG9yeVxuIik7DQorI2VuZGlmDQorICAgICAgICBCVUcoKTsNCisgICAgfQ0KKw0KKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAic3RhdCIsICJSZW1vdGUgQ0xJIHN0YXRpc3RpY3MiLCByZW1vdGVfY2xpX3N0YXRzX2NtZCwNCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoDQorICAgICAgICAgICAgImRldmljZSIsDQorICAgICAgICAgICAgIkRldmljZSBpbmRleCIsDQorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fTlVNQkVSLA0KKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsDQorICAgICAgICAgICAgMCwNCisgICAgICAgICAgICBCQ01UUl9NQVhfT0xUUyAtIDEpKTsNCisNCisgICAgcmV0dXJuIHJlbW90ZV9jbGlfc3RhcnQoZGV2aWNlLCByZW1vdGVfY2xpX3BvcnQpOw0KK30NCisNCit2b2lkIGJjbW9sdF9yZW1vdGVfY2xpX3N0b3Aodm9pZCkNCit7DQorICAgIGludCBpOw0KKyAgICBiY21vc19ib29sIHdhc19ydW5uaW5nW0JDTVRSX01BWF9PTFRTXSA9IHt9Ow0KKw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgQkNNVFJfTUFYX09MVFM7IGkrKykNCisgICAgew0KKyAgICAgICAgd2FzX3J1bm5pbmdbaV0gPSByZW1vdGVfY2xpX2RhdGFbaV0uaXNfcnVubmluZzsNCisgICAgICAgIGlmICh3YXNfcnVubmluZ1tpXSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzaHV0ZG93bihyZW1vdGVfY2xpX2RhdGFbaV0uY2xpZW50X3NvY2tldCwgU0hVVF9SRFdSKTsNCisgICAgICAgICAgICByZW1vdGVfY2xpX2RhdGFbaV0uaXNfcnVubmluZyA9IEJDTU9TX0ZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQ0KKyAgICB7DQorICAgICAgICBpZiAoIXdhc19ydW5uaW5nW2ldKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKCFyZW1vdGVfY2xpX2RhdGFbaV0uc29ja2V0X3Rhc2suZGVzdHJveWVkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJjbW9zX3VzbGVlcCgxMDAwMCk7DQorICAgICAgICB9DQorICAgICAgICBiY21vc190YXNrX2Rlc3Ryb3koJnJlbW90ZV9jbGlfZGF0YVtpXS5zb2NrZXRfdGFzayk7DQorICAgICAgICBiY21vc19tb2R1bGVfZGVzdHJveShiY21vc19tb2R1bGVfaWRfZm9yX2RldmljZShCQ01PU19NT0RVTEVfSURfUkVNT1RFX0NMSV9ERVYwLCAoYmNtb2x0X2RldmlkKWkpKTsNCisgICAgICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmcmVtb3RlX2NsaV9kYXRhW2ldLm91dHB1dF90YXNrKTsNCisgICAgICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJnJlbW90ZV9jbGlfZGF0YVtpXS5vdXRwdXRfbG9jayk7DQorICAgIH0NCit9DQorDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3JlbW90ZV9jbGkvYmNtb2x0X3JlbW90ZV9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL2JjbW9sdF9yZW1vdGVfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwYTY0YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL2JjbW9sdF9yZW1vdGVfY2xpLmgKQEAgLTAsMCArMSw0NCBAQAorLyoNCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQNCisNCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tDQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZA0KKw0KK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UNCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkDQordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyDQorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsDQord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToNCisNCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlDQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kDQorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cg0KKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQNCisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4NCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzDQorICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMNCisgICBvZiB0aGUgc29mdHdhcmUuDQorDQorTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lDQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkDQordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3INCit3cml0dGVuIGNvbnNlbnQuDQorDQorOj4NCisgKi8NCisNCisjaWZuZGVmIF9CQ01PTFRfUkVNT1RFX0NMSV9IXw0KKyNkZWZpbmUgX0JDTU9MVF9SRU1PVEVfQ0xJX0hfDQorDQorI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPg0KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+DQorDQordm9pZCBiY21vbHRfcmVtb3RlX2NsaV9hdXRvX3J4X2NiKGJjbW9sdF9kZXZpZCBvbHQsIGJjbW9sdF9tc2cgKm1zZyk7DQorDQorYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9jbGlfaW5pdChiY21jbGlfZW50cnkgKnJvb3QsIGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90IHJlbW90ZV9jbGlfcG9ydCk7DQorDQordm9pZCBiY21vbHRfcmVtb3RlX2NsaV9zdG9wKHZvaWQpOw0KKw0KKyNlbmRpZg0KKw0KKw0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3RpbWVfbWVhc3VyZW1lbnQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjdiNTBkYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMgQ29tbW9uIEFQSQorIworTU9EX05BTUUgPSB0aW1lX21lYXN1cmVtZW50CitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSBkZXZfbG9nCisKK2lmZXEgKCIkKEVOQUJMRV9MT0cpIiwgInkiKQorICAgIHNyY3MgPSBiY21vbHRfdGltZV9tZWFzdXJlbWVudC5jCitlbmRpZgorCitVU0VfTElOVCA9IHllcwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3RpbWVfbWVhc3VyZW1lbnQvYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnQuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L2JjbW9sdF90aW1lX21lYXN1cmVtZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTY2NTA5NQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L2JjbW9sdF90aW1lX21lYXN1cmVtZW50LmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTQ6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKyAKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIAorVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisgCitFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIAorMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKyAKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorIAorMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorICAgIExJTUlURUQgUkVNRURZLgorOj4KKyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlICJiY21vbHRfdGltZV9tZWFzdXJlbWVudC5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGRldl9sb2dfaWQgbG9nX2lkOworICAgIHVpbnQzMl90IG51bV9jeWNsZXNfZm9yX2F2ZXJhZ2U7CisgICAgRl9iY21vbHRfdGltZV9tZWFzdXJlbWVudF90aWNrc190b19ucyB0aWNrc190b19uczsKKyAgICBGX2JjbW9sdF90aW1lX21lYXN1cmVtZW50X2F2Z19kb25lIGF2Z19kb25lOworICAgIHVpbnQzMl90IGN5Y2xlX251bTsKK30gYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfY29udGV4dDsKKworc3RhdGljIGJjbW9sdF90aW1lX21lYXN1cmVtZW50X2NvbnRleHQgdGltZV9tZWFzdXJlbWVudF9jb250ZXh0ID0geyBERVZfTE9HX0lOVkFMSURfSUQsIDAsIE5VTEwsIE5VTEwsIDAgfTsKKwordm9pZCBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9pbml0KAorICAgIGRldl9sb2dfaWQgbG9nX2lkLAorICAgIHVpbnQzMl90IG51bV9jeWNsZXNfZm9yX2F2ZXJhZ2UsCisgICAgRl9iY21vbHRfdGltZV9tZWFzdXJlbWVudF90aWNrc190b19ucyB0aWNrc190b19ucywKKyAgICBGX2JjbW9sdF90aW1lX21lYXN1cmVtZW50X2F2Z19kb25lIGF2Z19kb25lKQoreworICAgIHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dCA9IChiY21vbHRfdGltZV9tZWFzdXJlbWVudF9jb250ZXh0KQorICAgICAgICB7IGxvZ19pZCwgbnVtX2N5Y2xlc19mb3JfYXZlcmFnZSwgdGlja3NfdG9fbnMsIGF2Z19kb25lLCAwIH07Cit9CisKK3ZvaWQgYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfc2FtcGxlX2VuZCh1aW50NjRfdCAqdG90YWxfdGlja3MsIHVpbnQzMl90ICpudW1fb2Zfc2FtcGxlcywgY29uc3QgY2hhciAqbWVhc3VyZW1lbnRfbmFtZSkKK3sKKyAgICAvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSBoYXZlbid0IHJ1biBlbm91Z2ggY3ljbGVzIHRvIHByb2R1Y2UgYW4gYXZlcmFnZS4gKi8KKyAgICBpZiAodGltZV9tZWFzdXJlbWVudF9jb250ZXh0LmN5Y2xlX251bSA8ICh0aW1lX21lYXN1cmVtZW50X2NvbnRleHQubnVtX2N5Y2xlc19mb3JfYXZlcmFnZSAtIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgqbnVtX29mX3NhbXBsZXMgIT0gMCAmJiB0aW1lX21lYXN1cmVtZW50X2NvbnRleHQudGlja3NfdG9fbnMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIENvbnZlcnQgdGhlIHNhbXBsZSB0aW1lIGZyb20gdGlja3MgdG8gbnMuICovCisgICAgICAgIHVpbnQ2NF90IGR1cmF0aW9uX2F2ZXJhZ2VfbnMgPSB0aW1lX21lYXN1cmVtZW50X2NvbnRleHQudGlja3NfdG9fbnMoKnRvdGFsX3RpY2tzIC8gKm51bV9vZl9zYW1wbGVzKTsKKworICAgICAgICAvKiBUaGUgIjoiIGlzIHVzZWQgYXMgZGVsaW1pdGVyIHdoZW4gaW1wb3J0aW5nIHRvIGV4Y2VsLiAqLworICAgICAgICBCQ01fTE9HKAorICAgICAgICAgICAgREVCVUcsCisgICAgICAgICAgICB0aW1lX21lYXN1cmVtZW50X2NvbnRleHQubG9nX2lkLAorICAgICAgICAgICAgIjolczogJWxsdS4lMDNsbHUgdXMgKCV1IGhpdHMpXG4iLAorICAgICAgICAgICAgbWVhc3VyZW1lbnRfbmFtZSwKKyAgICAgICAgICAgIChsb25nIGxvbmcgdW5zaWduZWQgaW50KShkdXJhdGlvbl9hdmVyYWdlX25zIC8gMTAwMCksCisgICAgICAgICAgICAobG9uZyBsb25nIHVuc2lnbmVkIGludCkoZHVyYXRpb25fYXZlcmFnZV9ucyAlIDEwMDApLAorICAgICAgICAgICAgKm51bV9vZl9zYW1wbGVzKTsKKyAgICB9CisKKyAgICAqdG90YWxfdGlja3MgPSAwOworICAgICpudW1fb2Zfc2FtcGxlcyA9IDA7Cit9CisKK3ZvaWQgYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfY3ljbGVfZW5kKHZvaWQpCit7CisgICAgaWYgKHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dC5jeWNsZV9udW0gPT0gKHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dC5udW1fY3ljbGVzX2Zvcl9hdmVyYWdlIC0gMSkpCisgICAgeworICAgICAgICBpZiAodGltZV9tZWFzdXJlbWVudF9jb250ZXh0LmF2Z19kb25lICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dC5hdmdfZG9uZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyogUHJpbnQgYSBkZWxpbWl0aW5nIGxpbmUuICovCisgICAgICAgIEJDTV9MT0coREVCVUcsIHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dC5sb2dfaWQsICJcbiIpOworICAgICAgICB0aW1lX21lYXN1cmVtZW50X2NvbnRleHQuY3ljbGVfbnVtID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKyt0aW1lX21lYXN1cmVtZW50X2NvbnRleHQuY3ljbGVfbnVtOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L2JjbW9sdF90aW1lX21lYXN1cmVtZW50LmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdGltZV9tZWFzdXJlbWVudC9iY21vbHRfdGltZV9tZWFzdXJlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJiNDFiODQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdGltZV9tZWFzdXJlbWVudC9iY21vbHRfdGltZV9tZWFzdXJlbWVudC5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisgCisgICBDb3B5cmlnaHQgKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIAorRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyAKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisgCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyAKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2lmbmRlZiBfQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRfSF8KKyNkZWZpbmUgX0JDTU9MVF9USU1FX01FQVNVUkVNRU5UX0hfCisKKyNpbmNsdWRlIDxiY21vc19jb21tb24uaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorCisvKiBIb3cgdG8gdXNlIHRoZSB0aW1lIG1lYXN1cmVtZW50IGxpYnJhcnk6CisgKiAKKyAqIEJlZm9yZSBpbmNsdWRpbmcgYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnQuaCwgeW91IG11c3QgZGVmaW5lIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1RJTUVTVEFNUC4gIFRoaXMgbWFjcm8gbXVzdCBiZQorICogZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhpcyBpcyBsZWdhbDogInVpbnQzMl90IHRpbWVzdGFtcF9pbl90aWNrcyA9IEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1RJTUVTVEFNUCgpIi4gIFdlCisgKiB1c2UgYSBtYWNybyBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gdG8gb3B0aW1pemUgZm9yIHRpbWUgKHdlIHdhbnQgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIGEgZnVuY3Rpb24gY2FsbCkuCisgKgorICogWW91IGNhbiBoYXZlIGFzIG1hbnkgbmFtZWQgbWVhc3VyZW1lbnQgY2F0ZWdvcmllcyBhcyBkZXNpcmVkLiAgRm9yIGVhY2ggY2F0ZWdvcnksIHlvdSBuZWVkIHRvIGNhbGwgZWl0aGVyOgorICogLSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVF9TQU1QTEVfREVDTF9TVEFUSUMoKSAtIGlmIHRoZSBtZWFzdXJlbWVudHMgYXJlIGFsbCB0YWtlbiBpbiB0aGUgc2FtZSBmaWxlCisgKiBvcjoKKyAqIC0gQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRfU0FNUExFX0RFQ0woKSArIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1NBTVBMRV9ERUNMX0VYVEVSTigpCisgKgorICogQXQgaW5pdCB0aW1lLCB5b3UgbXVzdCBjYWxsIGJjbW9sdF90aW1lX21lYXN1cmVtZW50X2luaXQoKS4KKyAqCisgKiBGb3IgdGhlIGFjdHVhbCBtZWFzdXJlbWVudHMsIHlvdSBtdXN0IHN1cnJvdW5kIHRoZSBjb2RlIHlvdSdyZSB0cnlpbmcgdG8gbWVhc3VyZSB3aXRoIAorICogQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRTX1NBTVBMRV9CRUZPUkUoKSBhbmQgQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRTX1NBTVBMRV9BRlRFUigpLiAgQXQgdGhlIGVuZCBvZiBhIGZ1bGwKKyAqIG1lYXN1cmVtZW50IGN5Y2xlLCB5b3UgbXVzdCBjYWxsIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UU19TQU1QTEVfRU5EKCkgZm9yIGVhY2ggbmFtZWQgbWVhc3VyZW1lbnQgY2F0ZWdvcnksIHRoZW4KKyAqIGZpbmFsbHkgY2FsbCBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVFNfQ1lDTEVfRU5EKCkuCisgKi8KKwordHlwZWRlZiB1aW50NjRfdCAoKkZfYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfdGlja3NfdG9fbnMpKHVpbnQ2NF90IHRpY2tzKTsKK3R5cGVkZWYgdm9pZCAoKkZfYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfYXZnX2RvbmUpKHZvaWQpOworCisvKiogQ2FsbGVkIGZvciBlYWNoIG1lYXN1cmVtZW50IGNhdGVnb3J5IGF0IGNvbXBpbGUgdGltZSAoc2VlIGhvdy10byBhdCB0b3Agb2YgZmlsZSkuICovCisjZGVmaW5lIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1NBTVBMRV9ERUNMX1NUQVRJQyhtZWFzdXJlbWVudF9uYW1lKSBcCisgICAgc3RhdGljIHVpbnQzMl90IG1lYXN1cmVtZW50X25hbWUgIyMgX3N0YXJ0X3RpY2s7IFwKKyAgICBzdGF0aWMgdWludDY0X3QgbWVhc3VyZW1lbnRfbmFtZSAjIyBfdG90YWxfdGlja3M7IFwKKyAgICBzdGF0aWMgdWludDMyX3QgbWVhc3VyZW1lbnRfbmFtZSAjIyBfbnVtX29mX3NhbXBsZXM7CisKKy8qKiBDYWxsZWQgZm9yIGVhY2ggbWVhc3VyZW1lbnQgY2F0ZWdvcnkgYXQgY29tcGlsZSB0aW1lIChzZWUgaG93LXRvIGF0IHRvcCBvZiBmaWxlKS4gKi8KKyNkZWZpbmUgQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRfU0FNUExFX0RFQ0wobWVhc3VyZW1lbnRfbmFtZSkgXAorICAgIHVpbnQzMl90IG1lYXN1cmVtZW50X25hbWUgIyMgX3N0YXJ0X3RpY2s7IFwKKyAgICB1aW50NjRfdCBtZWFzdXJlbWVudF9uYW1lICMjIF90b3RhbF90aWNrczsgXAorICAgIHVpbnQzMl90IG1lYXN1cmVtZW50X25hbWUgIyMgX251bV9vZl9zYW1wbGVzOworCisvKiogQ2FsbGVkIGZvciBlYWNoIG1lYXN1cmVtZW50IGNhdGVnb3J5IGF0IGNvbXBpbGUgdGltZSAoc2VlIGhvdy10byBhdCB0b3Agb2YgZmlsZSkuICovCisjZGVmaW5lIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1NBTVBMRV9ERUNMX0VYVEVSTihtZWFzdXJlbWVudF9uYW1lKSBcCisgICAgZXh0ZXJuIHVpbnQzMl90IG1lYXN1cmVtZW50X25hbWUgIyMgX3N0YXJ0X3RpY2s7IFwKKyAgICBleHRlcm4gdWludDY0X3QgbWVhc3VyZW1lbnRfbmFtZSAjIyBfdG90YWxfdGlja3M7IFwKKyAgICBleHRlcm4gdWludDMyX3QgbWVhc3VyZW1lbnRfbmFtZSAjIyBfbnVtX29mX3NhbXBsZXM7CisKKy8qKiBDYWxsZWQgYmVmb3JlIGVhY2ggYmxvY2sgb2YgY29kZSB0aGF0IG5lZWRzIHRvIGJlIHRpbWVkIChzZWUgaG93LXRvIGF0IHRvcCBvZiBmaWxlKS4gKi8KKyNkZWZpbmUgQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRTX1NBTVBMRV9CRUZPUkUobWVhc3VyZW1lbnRfbmFtZSkgXAorICAgIGRvIFwKKyAgICB7IFwKKyAgICAgICAgbWVhc3VyZW1lbnRfbmFtZSAjIyBfc3RhcnRfdGljayA9IEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1RJTUVTVEFNUCgpOyBcCisgICAgfSBcCisgICAgd2hpbGUgKDApCisKKy8qKiBDYWxsZWQgYWZ0ZXIgZWFjaCBibG9jayBvZiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgdGltZWQgKHNlZSBob3ctdG8gYXQgdG9wIG9mIGZpbGUpLiAqLworI2RlZmluZSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVFNfU0FNUExFX0FGVEVSKG1lYXN1cmVtZW50X25hbWUpIFwKKyAgICBkbyBcCisgICAgeyBcCisgICAgICAgIC8qIEV2ZW4gaWYgdGltZXN0YW1wIG92ZXJmbG93cyB3ZSBhcmUgc3RpbGwgb2sgLSB1bnNpZ25lZCBhcml0aG1ldGljIHdpbGwgc3RpbGwgYmUgdmFsaWQuICovIFwKKyAgICAgICAgbWVhc3VyZW1lbnRfbmFtZSAjIyBfdG90YWxfdGlja3MgKz0gQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRfVElNRVNUQU1QKCkgLSBtZWFzdXJlbWVudF9uYW1lICMjIF9zdGFydF90aWNrOyBcCisgICAgICAgICsrbWVhc3VyZW1lbnRfbmFtZSAjIyBfbnVtX29mX3NhbXBsZXM7IFwKKyAgICB9IFwKKyAgICB3aGlsZSAoMCkKKworLyoqIENhbGxlZCBmb3IgZWFjaCBtZWFzdXJlbWVudCBjYXRlZ29yeSBhdCB0aGUgZW5kIG9mIGEgY3ljbGUgKHNlZSBob3ctdG8gYXQgdG9wIG9mIGZpbGUpLiAqLworI2RlZmluZSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVFNfU0FNUExFX0VORChtZWFzdXJlbWVudF9uYW1lKSBcCisgICAgZG8gXAorICAgIHsgXAorICAgICAgICBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9zYW1wbGVfZW5kKCBcCisgICAgICAgICAgICAmbWVhc3VyZW1lbnRfbmFtZSAjIyBfdG90YWxfdGlja3MsIFwKKyAgICAgICAgICAgICZtZWFzdXJlbWVudF9uYW1lICMjIF9udW1fb2Zfc2FtcGxlcywgXAorICAgICAgICAgICAgIyBtZWFzdXJlbWVudF9uYW1lKTsgXAorICAgIH0gXAorICAgIHdoaWxlICgwKQorCisvKiogQ2FsbGVkIHdoZW4gdGhlIGVudGlyZSBtZWFzdXJlbWVudCBjeWNsZSBpcyBjb21wbGV0ZSAoc2VlIGhvdy10byBhdCB0b3Agb2YgZmlsZSkuICovCisjZGVmaW5lIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UU19DWUNMRV9FTkQoKSBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9jeWNsZV9lbmQoKQorCisvKiogTXVzdCBiZSBjYWxsZWQgYXQgaW5pdCB0aW1lIHRvIGluaXRpYWxpemUgdGhlIHRpbWUgbWVhc3VyZW1lbnQgbGlicmFyeS4KKyAqIFxwYXJhbSBsb2dfaWQgICAgICAgICAgICAgICAgIExvZyBJRCB0byB1c2UgZm9yIGRpc3BsYXlpbmcgZGF0YSAod2lsbCB1c2UgJ0RFQlVHJyBsb2cgbGV2ZWwpLgorICogXHBhcmFtIG51bV9jeWNsZXNfZm9yX2F2ZXJhZ2UgTnVtYmVyIG9mIG1lYXN1cmVtZW50IGN5Y2xlcyB0byBydW4gYmVmb3JlIGNhbGN1bGF0aW5nIGFuZCBsb2dnaW5nIGF2ZXJhZ2VzLgorICogXHBhcmFtIHRpY2tzX3RvX25zICAgICAgICAgICAgRnVuY3Rpb24gdGhhdCB0cmFuc2xhdGVzIHRpbWVzdGFtcCByZXNvbHV0aW9uICh0aWNrcykgaW50byBuYW5vc2Vjb25kcy4KKyAqIFxwYXJhbSBhdmdfZG9uZSAgICAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgYXZlcmFnZXMgaGF2ZSBiZWVuIGNvbXB1dGVkIChlLmcuIHRvIGxvZyBhIGN1c3RvbSBoZWFkZXIpLgorICovCit2b2lkIGJjbW9sdF90aW1lX21lYXN1cmVtZW50X2luaXQoCisgICAgZGV2X2xvZ19pZCBsb2dfaWQsCisgICAgdWludDMyX3QgbnVtX2N5Y2xlc19mb3JfYXZlcmFnZSwKKyAgICBGX2JjbW9sdF90aW1lX21lYXN1cmVtZW50X3RpY2tzX3RvX25zIHRpY2tzX3RvX25zLAorICAgIEZfYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfYXZnX2RvbmUgYXZnX2RvbmUpOworCisvKiogRG8gbm90IGNhbGwgdGhpcyBkaXJlY3RseSAtIGNhbGwgQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRTX1NBTVBMRV9FTkQoKSBpbnN0ZWFkLiAqLwordm9pZCBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9zYW1wbGVfZW5kKHVpbnQ2NF90ICp0b3RhbF90aWNrcywgdWludDMyX3QgKm51bV9vZl9zYW1wbGVzLCBjb25zdCBjaGFyICptZWFzdXJlbWVudF9uYW1lKTsKKworLyoqIERvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHkgLSBjYWxsIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UU19DWUNMRV9FTkQoKSBpbnN0ZWFkLiAqLwordm9pZCBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9jeWNsZV9lbmQodm9pZCk7CisKKyNlbmRpZiAvKiBfQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGY3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL01ha2VmaWxlCkBAIC0wLDAgKzEsMjggQEAKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorCU1PRF9OQU1FID0gYmNtX3VzZXJfYXBwbAorCU1PRF9UWVBFID0gYXBwCisJTU9EX0RFUFMgPSBob3N0X2FwaSBhcGlfZGV2X2xvZyBiY21fYm9hcmQgYmNtX3VzZXJfYXBwbF9wcyBiY21fdXNlcl9hcHBsX2VvbiBiY21fdXNlcl9hcHBsX29tb24gXAorICAgICAgICAgICAgICAgIGJjbV91c2VyX2FwcGxfZXBvbl9vYW0gYmNtX3VzZXJfYXBwbF9lcG9uX29hbV9jbGkgcGNpZSBwY2llX21vZCBcCisgICAgICAgICAgICAgICAgYmNtX3VzZXJfYXBwbF9lcG9uX2hkZSBiY21fYXBpX3Byb3h5IGNvbW1vbl9lcG9uX29hbSBjb21tb25fZ3BvbiBiY21faW1hZ2VfdHJhbnNmZXIgYmNtX3N3X3VwZ3JhZGUgXAorICAgICAgICAgICAgICAgIGRldmljZV9zZWxlY3RvciBiY21fcmVtb3RlX2NsaSBiY21fdXNlcl9hcHBsX3BsYXliYWNrIGJjbV91c2VyX2FwcGxfZHBvZV9zZWMKKworaWZuZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorICAgIE1PRF9ERVBTICs9CWJjbV91c2VyX2FwcGxfZ3Bvbl9zdHJlc3MgYmNtX3VzZXJfYXBwbF9ncG9uX2RzX29tY2kgXAorICAgICAgICAgICAgICAgIGJjbV91c2VyX2FwcGxfZ3Bvbl9zbl9hY3F1aXNpdGlvbiBiY21fdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljcyBcCisgICAgICAgICAgICAgICAgYmNtX3VzZXJfYXBwbF9ncG9uX21hY19sZWFybmluZyBiY21fdXNlcl9hcHBsX2dwb25fcnNzaSBcCisJCWJjbV91c2VyX2FwcGxfb21jaV9zd2RsIGJjbV91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlciBiY21fdXNlcl9hcHBsX29udV90dW5pbmcKK2VuZGlmCisKKwlNT0RfSU5DX0RJUlMgPSAkKFRPUCkvaG9zdC9ib2FyZC93cnggJChUT1ApL2NvbW1vbi9kcml2ZXJzL21hcGxlL3BjaWUKKwlzcmNzID0gYmNtb2x0X3VzZXJfYXBwbC5jIGJjbW9sdF91c2VyX2FwcGxfY2xpLmMgYmNtb2x0X3VzZXJfYXBwbF9leF9jbGkuYyBiY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHMuYworCisJaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisJCU1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKwllbmRpZgorCWlmZXEgKCQoRU5BQkxFX0tUMiksIHkpCisJCU1PRF9ERUZTICs9IC1ERU5BQkxFX0tUMgorCQkjRVhUUkFfSU5DTFVERVMgKz0gLUkkKFRPUF9ESVIpL2NvbW1vbi9jbGkKKwllbmRpZgorCisJTU9EX0RFUFMgKz0gdHJhbnNwb3J0CitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzljMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsLmMKQEAgLTAsMCArMSw1MjAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfYm9hcmQuaD4KKyNpbmNsdWRlIDxiY21vbHRfYm9hcmRfY2xpLmg+CisjaW5jbHVkZSA8YmNtb2x0X3VzZXJfYXBwbF9jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfdXNlcl9hcHBsX2V4X2NsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaD4KKyNpZiBkZWZpbmVkKExJTlVYX0tFUk5FTF9TUEFDRSkKKyNpbmNsdWRlIDxiY21vbHRfZGV2X2xvZ19saW51eC5oPgorI2VuZGlmCisjaW5jbHVkZSA8YmNtb2x0X2Rldl9zZWxlY3Rvci5oPgorI2luY2x1ZGUgPGJjbV9hcGlfY2xpLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaV9wcm94eS5oPgorI2luY2x1ZGUgPGJjbW9sdF9yZW1vdGVfY2xpLmg+CisjaW5jbHVkZSA8YmNtb2x0X2ltYWdlX3RyYW5zZmVyLmg+CisKKyNpZmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgc3RhdGljIHZvaWQgdXNpbmdfaW5iYW5kX3NldChiY21vc19ib29sIHVzaW5nX2luYmFuZCl7fQorICAgIHN0YXRpYyBiY21vc19ib29sIHVzaW5nX2luYmFuZF9nZXQodm9pZCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisgICAgZXh0ZXJuIHVpbnQzMl90IGJjbXRyX2hvc3RfaXA7CisgICAgZXh0ZXJuIHVpbnQxNl90IGJjbXRyX2hvc3RfdWRwX3BvcnQ7CisgICAgZXh0ZXJuIHVpbnQzMl90IGJjbXRyX29sdF9pcFtCQ01UUl9NQVhfT0xUU107CisgICAgZXh0ZXJuIHVpbnQxNl90IGJjbXRyX29sdF91ZHBfcG9ydFtCQ01UUl9NQVhfT0xUU107CisjZWxzZQorICAgICNpbmNsdWRlIDxiY210cl9wbHVnaW4uaD4KKyNlbmRpZgorCisKKyNkZWZpbmUgQ0xJX0hPU1RfUFJPTVBUX0ZPUk1BVCAiQkNNLiV1PiAiCisKK3N0YXRpYyBiY21jbGlfc2Vzc2lvbiAqY3VycmVudF9zZXNzaW9uOworCisvLyNpZiBkZWZpbmVkKFNJTVVMQVRJT05fQlVJTEQpICYmIGRlZmluZWQoTElOVVhfVVNFUl9TUEFDRSkKKy8vZXh0ZXJuIHVpbnQzMl90IGJjbXRyX2hvc3RfaXA7CisvL2V4dGVybiB1aW50MTZfdCBiY210cl9ob3N0X3VkcF9wb3J0OworLy9leHRlcm4gdWludDMyX3QgYmNtdHJfb2x0X2lwW0JDTVRSX01BWF9PTFRTXTsKKy8vZXh0ZXJuIHVpbnQxNl90IGJjbXRyX29sdF91ZHBfcG9ydFtCQ01UUl9NQVhfT0xUU107CisvLyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGludCBub2xvZ2dlcj0wOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX2NtZF91c2luZ19pbmJhbmQoYmNtY2xpX3Nlc3Npb24gKnNlc3MsIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5QYXJtcykKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzLCAiTWFwbGUgbWFuYWdlbWVudCB1c2luZyAlc1xuIiwgKHVzaW5nX2luYmFuZF9nZXQoKSk/ICJJbi1CYW5kIiA6ICJQQ0llIik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2NsaV9oZWxwKGNvbnN0IGNoYXIgKmNtZCkKK3sKKyAgICBjb25zdCBjaGFyICpwOworCisgICAgd2hpbGUgKChwID0gc3RyY2hyKGNtZCwgJy8nKSkpCisgICAgeworICAgICAgICBjbWQgPSBwICsgMTsKKyAgICB9CisKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICIlcyBbLWwgPGxldmVsPl0iCisjaWYgZGVmaW5lZChTSU1VTEFUSU9OX0JVSUxEKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisgICAgICAgICAgICAiIFstcCB1ZHBfcG9ydF9kZXZpY2UxXSBbLXAgdWRwX3BvcnRfZGV2aWNlMl0gLi4uXG4iCisgICAgICAgICAgICAiT1JcbiIKKyAgICAgICAgICAgICIgWy1vbHQgaXBfZGV2aWNlMTpwb3J0X2RldmljZTFdIFstb2x0IGlwX2RldmljZTI6cG9ydF9kZXZpY2UyXSAuLi5cbiIKKyAgICAgICAgICAgICIgWy1saXN0ZW4gaXA6cG9ydF1cbiIKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgICAgICIgWy1ubF1cbiIKKyNlbmRpZgorICAgICAgICAgICAgIiBbLW5lXVxuIgorICAgICAgICAgICAgIiBbLWRldl1cbiIKKyAgICAgICAgICAgICIgWy1pZl9tYXNrIG1hc2tdXG4iCisgICAgICAgICAgICAiIFstcHJveHkgcHJveHlfcG9ydF9kZXZpY2UxXSBbLXByb3h5IHByb3h5X3BvcnRfZGV2aWNlMl0gLi4uXG4iCisgICAgICAgICAgICAiIFstdWRdXG4iCisgICAgICAgICAgICAiIFstb25fcmVhZHkgY21kXVxuIiwgY21kKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJcdFx0IGxldmVsID09IGd1ZXN0IHwgYWRtaW4gfCBkZWJ1Z1xuIgorI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgICAgICJcdFx0IC1ubCAtIGRpc2FibGUga2VybmVsIGxvZ2dlciBpbnRlZ3JhdGlvblxuIgorI2VuZGlmCisgICAgICAgICAgICAiXHRcdCAtbmUgLSBkaXNhYmxlIGxpbmUgZWRpdGluZ1xuIgorICAgICAgICAgICAgIlx0XHQgLWRldiAtIGRldmljZSBJRCB0byBhdXRvLXJlZ2lzdGVyIGZvciBpbmRpY2F0aW9ucyBhbmQgcnVuIHByb3h5IG9uIChkZWZhdWx0IDApXG4iCisgICAgICAgICAgICAiXHRcdCAtaWZfbWFzayAtIFBPTiBOSSBtYXNrIHRvIGFwcGx5IHRvIGF1dG8tcmVnaXN0cmF0aW9uIG9mIGluZGljYXRpb25zXG4iCisgICAgICAgICAgICAiXHRcdCAtcHJveHkgLSBydW4gdGhlIEFQSSBwcm94eSBsaXN0ZW5pbmcgb24gdGhpcyBVRFAgcG9ydFxuIgorICAgICAgICAgICAgIlx0XHQgLXVkIC0gdXNlIGEgdW5peCBkb21haW4gY29ubmVjdGlvbiB0byBhIHVzZXIgc3BhY2UgZGV2aWNlIGNvbnRyb2wiCisgICAgICAgICAgICAiXHRcdCAtb25fcmVhZHkgLSBjb21tYW5kIGZvciBBUEkgcHJveHkgdG8gZXhlY3V0ZSBhZnRlciByZWNlaXZpbmcgZGV2aWNlIHJlYWR5IGluZGljYXRpb25cbiIpOworICAgIHJldHVybiAtRUlOVkFMOworfQorCisvKiBxdWl0IGNvbW1hbmQgaGFuZGxlciAqLworc3RhdGljIGludCBfY21kX3F1aXQoYmNtY2xpX3Nlc3Npb24gKnNlc3MsIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5QYXJtcykKK3sKKyAgICBiY21jbGlfc3RvcChzZXNzKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzLCAiTWFwbGUgQ0xJIHRlcm1pbmF0ZWQgYnkgJ1F1aXQnIGNvbW1hbmRcbiIpOworICAgIHJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChTSU1VTEFUSU9OX0JVSUxEKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisvKiBwYXJzZSBpcDpwb3J0ICovCitzdGF0aWMgYmNtb3NfZXJybm8gX3BhcnNlX2lwX3BvcnQoY29uc3QgY2hhciAqcywgdWludDMyX3QgKmlwLCB1aW50MTZfdCAqcG9ydCkKK3sKKyAgICBpbnQgbjsKKyAgICB1aW50MzJfdCBpcDEsIGlwMiwgaXAzLCBpcDQsIHBwOworCisgICAgbiA9IHNzY2FuZihzLCAiJXUuJXUuJXUuJXU6JXUiLCAmaXAxLCAmaXAyLCAmaXAzLCAmaXA0LCAmcHApOworICAgIGlmIChuICE9IDUgfHwgaXAxID4gMHhmZiB8fCBpcDIgPiAweGZmIHx8IGlwMyA+IDB4ZmYgfHwgaXA0ID4gMHhmZiB8fCBwcCA+IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgcGFyc2UgJXMuIE11c3QgYmUgaXBfYWRkcmVzczpwb3J0XG4iLCBzKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgKmlwID0gKGlwMSA8PCAyNCkgfCAoaXAyIDw8IDE2KSB8IChpcDMgPDwgOCkgfCBpcDQ7CisgICAgKnBvcnQgPSBwcDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZgorCisvKiBUcnkgdG8gbGVhcm4gc3lzdGVtIG1vZGUgKi8KK3N0YXRpYyBiY21vbHRfc3lzdGVtX21vZGUgX2dldF9zeXN0ZW1fbW9kZShiY21vbHRfZGV2aWQgZGV2KQoreworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHt9OworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGRldl9jZmc7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmRldl9jZmcsIGRldmljZSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZkZXZfY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGRldiwgJmRldl9jZmcuaGRyKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX3ByaW50ZigiRGV2aWNlICV1OiBmYWlsZWQgdG8gcmVhZCBzeXN0ZW0gbW9kZSAoJXMpLiBXYWl0aW5nIGZvciBjb25maWd1cmF0aW9uXG4iLAorICAgICAgICAgICAgKHVuc2lnbmVkKWRldiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIEJDTU9MVF9TWVNURU1fTU9ERV9fTlVNX09GOworICAgIH0KKyAgICBiY21vc19wcmludGYoIkRldmljZSAldTogU3lzdGVtIG1vZGU6ICVzXG4iLAorICAgICAgICAodW5zaWduZWQpZGV2LCBiY21vbHRfc3lzdGVtX21vZGVfbmFtZShkZXZfY2ZnLmRhdGEuc3lzdGVtX21vZGUpKTsKKyAgICByZXR1cm4gZGV2X2NmZy5kYXRhLnN5c3RlbV9tb2RlOworfQorCisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGludCBkZXZfbG9nX3RpbWVfdG9fc3RyX2NiKHVpbnQzMl90IHRpbWVfc3RhbXAsIGNoYXIgKnRpbWVfc3RyLCBpbnQgdGltZV9zdHJfc2l6ZSkKK3sKKyAgICByZXR1cm4gc25wcmludGYodGltZV9zdHIsIHRpbWVfc3RyX3NpemUsICIldSIsIHRpbWVfc3RhbXAgLyAxMDAwKTsgLyogY29udmVydCBmcm9tIHVzZWMgdG8gbXNlYy4gKi8KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9pbml0X2xvZ2dlcih2b2lkKQoreworI2RlZmluZSBERVZfTE9HX1NJWkUxIDE8PDExCisjZGVmaW5lIERFVl9MT0dfU0laRTIgMTw8MTMKKyNkZWZpbmUgREVWX0xPR19RVUVVRV9TSVpFIDEwMDAKKworICAgIHN0YXRpYyB1aW50OF90IGxvZ2dlcl9idWYxW0RFVl9MT0dfU0laRTFdOworICAgIHN0YXRpYyB1aW50OF90IGxvZ2dlcl9idWYyW0RFVl9MT0dfU0laRTJdOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICB2b2lkICphZGRyZXNzZXNbREVWX0xPR19NQVhfRklMRVNdID0ge2xvZ2dlcl9idWYxLCBsb2dnZXJfYnVmMn07CisgICAgdWludDMyX3Qgc2l6ZXNbREVWX0xPR19NQVhfRklMRVNdID0ge3NpemVvZihsb2dnZXJfYnVmMSksIHNpemVvZihsb2dnZXJfYnVmMil9OworICAgIHVpbnQzMl90IGZsYWdzW0RFVl9MT0dfTUFYX0ZJTEVTXSA9IHtCQ01fREVWX0xPR19GSUxFX0ZMQUdfU1RPUF9XSEVOX0ZVTEwsIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19XUkFQX0FST1VORH07CisKKyAgICBlcnIgPSBiY21fZGV2X2xvZ19pbml0X2RlZmF1bHRfbG9nZ2VyKGFkZHJlc3Nlcywgc2l6ZXMsIGZsYWdzLCBCQ01fU0laRU9GQVJSQVkoYWRkcmVzc2VzKSwgMHg0MDAwLCBUQVNLX1BSSU9SSVRZX0RFVl9MT0csIERFVl9MT0dfUVVFVUVfU0laRSk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKGVyciwgZXJyLCAiYmNtX2Rldl9sb2dfaW5pdGlhbGl6ZV9kZXZfbG9nZ2VyX2RlZmF1bHQoKVxuIik7CisKKyAgICBiY21fZGV2X2xvZ19sZXZlbF9zZXRfc3R5bGUoREVWX0xPR19MRVZFTF9GQVRBTCwgQkNNX0RFVl9MT0dfU1RZTEVfQk9MRCk7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWxfc2V0X3N0eWxlKERFVl9MT0dfTEVWRUxfRVJST1IsIEJDTV9ERVZfTE9HX1NUWUxFX0JPTEQpOworCisgICAgYmNtX2Rldl9sb2dfc2V0X3RpbWVfdG9fc3RyX2NiKGRldl9sb2dfdGltZV90b19zdHJfY2IpOworCisjaWYgZGVmaW5lZChMSU5VWF9LRVJORUxfU1BBQ0UpCisgICAgaWYgKCFub2xvZ2dlcikKKyAgICB7CisgICAgICAgIGVyciA9IGJjbV9kZXZfbG9nX2xpbnV4X2luaXQoKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKGVyciwgZXJyLCAiYmNtX2Rldl9sb2dfbGludXhfaW5pdCgpXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAgIEJDTV9MT0coSU5GTywgZGVmX2xvZ19pZCwgIkhlbGxvIExvZ2dlclxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBoYW5kbGVfc3lzdGVtX21vZGVfY2hhbmdlKGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYmNtY2xpX2VudHJ5ICpjdXJfZGlyID0gYmNtY2xpX2Rpcl9nZXQoY3VycmVudF9zZXNzaW9uKTsKKyAgICBjaGFyIG9sZF9kaXJfbmFtZVszMl0gPSAiIjsKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisKKyAgICBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGRldiwgJnN5c3RlbV9tb2RlKTsKKyAgICBiY21fY29tbW9uX2dwb25faW5pdChzeXN0ZW1fbW9kZSk7CisKKyAgICBpZiAoZGV2ID09IGN1cnJlbnRfZGV2aWNlKQorICAgIHsKKyAgICAgICAgaWYgKGN1cl9kaXIpCisgICAgICAgICAgICBzdHJuY3B5KG9sZF9kaXJfbmFtZSwgYmNtY2xpX3Rva2VuX25hbWUoY3VyX2RpciksIHNpemVvZihvbGRfZGlyX25hbWUpIC0gMSk7CisKKyAgICAgICAgYXBpX2NsaV9zZXRfY29tbWFuZHMoY3VycmVudF9zZXNzaW9uKTsKKworICAgICAgICAvKiBSZXN0b3JlIGN1cnJlbnQgQ0xJIGRpcmVjdG9yeSAqLworICAgICAgICBjdXJfZGlyID0gYmNtY2xpX2Rpcl9maW5kKE5VTEwsIG9sZF9kaXJfbmFtZSk7CisgICAgICAgIGlmIChjdXJfZGlyKQorICAgICAgICAgICAgYmNtY2xpX2Rpcl9zZXQoY3VycmVudF9zZXNzaW9uLCBjdXJfZGlyKTsKKyAgICB9CisKKyAgICBiY21vbHRfdXNlcl9hcHBsX2NsaV9oYW5kbGVfc3lzdGVtX21vZGVfY2hhbmdlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGNsaV9nZXRfcHJvbXB0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjaGFyICpidWYsIHVpbnQzMl90IG1heF9sZW4pCit7CisgICAgc25wcmludGYoYnVmLCBtYXhfbGVuLCBDTElfSE9TVF9QUk9NUFRfRk9STUFULCBjdXJyZW50X2RldmljZSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcGFybSBtb25fc2Vzc2lvbl9wYXJtOworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgdWludDMyX3QgZnBnYV92ZXJzaW9uOworI2VuZGlmCisgICAgaW50IG5vZWRpdCA9IDA7CisgICAgaW50IHJjOworICAgIGludCBpOworICAgIGJjbW9sdF9ob3N0X2luaXRfcGFyYW1zIHBhcmFtcyA9CisgICAgeworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgLmxvZ2dlcl9pbml0X2NiID0gYmNtX2luaXRfbG9nZ2VyLAorI2VuZGlmCisgICAgICAgIC5ydW5fZGV2X2N0cmwgPSBCQ01PU19GQUxTRQorICAgIH07CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IDA7CisgICAgYmNtb3NfYm9vbCBzcGVjaWZpY19kZXZpY2UgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc19ib29sIHJ1bl9wcm94eSA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgcnVuX3JlbW90ZV9jbGkgPSBCQ01PU19GQUxTRTsKKyAgICB1aW50MzJfdCBwcm94eV9wb3J0W0JDTVRSX01BWF9PTFRTXSA9IHt9OworICAgIHVpbnQzMl90IHJlbW90ZV9jbGlfcG9ydCA9IDA7CisgICAgaW50IGN1cl9wcm94eV9kZXYgPSAwOworICAgIGNoYXIgKm9uX3JlYWR5X2NtZCA9IE5VTEw7CisgICAgc3RydWN0IGJjbW9sdF9yeF9jZmcgcnhfY2ZnID0KKyAgICB7CisgICAgICAgIC5vYmpfdHlwZSA9IEJDTU9MVF9PQkpFQ1RfQU5ZLAorICAgICAgICAuZmxhZ3MgPSBCQ01PTFRfQVVUT19GTEFHU19OT05FLAorICAgIH07CisjaWYgZGVmaW5lZChTSU1VTEFUSU9OX0JVSUxEKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisgICAgaW50IGN1cl9vbHQgPSAwOworI2VuZGlmCisKKyAgICAodm9pZClub2VkaXQ7IC8qIHByZXZlbnQgd2FybmluZyAqLworCisgICAgbWVtc2V0KCZtb25fc2Vzc2lvbl9wYXJtLCAwLCBzaXplb2YobW9uX3Nlc3Npb25fcGFybSkpOworICAgIG1vbl9zZXNzaW9uX3Bhcm0uZ2V0X3Byb21wdCA9IGNsaV9nZXRfcHJvbXB0OworICAgIG1vbl9zZXNzaW9uX3Bhcm0uYWNjZXNzX3JpZ2h0ID0gQkNNQ0xJX0FDQ0VTU19BRE1JTjsKKworICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWwiKSkKKyAgICAgICAgeworICAgICAgICAgICAgKytpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgImFkbWluIikpCisgICAgICAgICAgICAgICAgbW9uX3Nlc3Npb25fcGFybS5hY2Nlc3NfcmlnaHQgPSBCQ01DTElfQUNDRVNTX0FETUlOOworICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiZ3Vlc3QiKSkKKyAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbl9wYXJtLmFjY2Vzc19yaWdodCA9IEJDTUNMSV9BQ0NFU1NfR1VFU1Q7CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJkZWJ1ZyIpKQorICAgICAgICAgICAgICAgIG1vbl9zZXNzaW9uX3Bhcm0uYWNjZXNzX3JpZ2h0ID0gQkNNQ0xJX0FDQ0VTU19ERUJVRzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NsaV9oZWxwKGFyZ3ZbMF0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1uZSIpKQorICAgICAgICB7CisgICAgICAgICAgICBub2VkaXQgPSAxOworICAgICAgICB9CisjaWZkZWYgRU5BQkxFX0xPRworICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItbmwiKSkKKyAgICAgICAgeworICAgICAgICAgICAgbm9sb2dnZXIgPSAxOworICAgICAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJTVVMQVRJT05fQlVJTEQpICYmIGRlZmluZWQoTElOVVhfVVNFUl9TUEFDRSkKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXAiKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cl9vbHQgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJUb28gbWFueSAtcCBhbmQvb3IgLW9sdCBvcHRpb25zXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICBiY210cl9vbHRfdWRwX3BvcnRbY3VyX29sdF0gPSBzdHJ0b2woYXJndltpXSwgTlVMTCwgMCk7CisgICAgICAgICAgICArK2N1cl9vbHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW9sdCIpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VyX29sdCA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlRvbyBtYW55IC1wIGFuZC9vciAtb2x0IG9wdGlvbnNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIGlmIChfcGFyc2VfaXBfcG9ydChhcmd2W2ldLCAmYmNtdHJfb2x0X2lwW2N1cl9vbHRdLCAmYmNtdHJfb2x0X3VkcF9wb3J0W2N1cl9vbHRdKSAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICsrY3VyX29sdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItbGlzdGVuIikpCisgICAgICAgIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIGlmIChfcGFyc2VfaXBfcG9ydChhcmd2W2ldLCAmYmNtdHJfaG9zdF9pcCwgJmJjbXRyX2hvc3RfdWRwX3BvcnQpICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWRldiIpKQorICAgICAgICB7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKXN0cnRvdWwoYXJndltpXSwgTlVMTCwgMCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiSW52YWxpZCBkZXZpY2UgSURcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnRfZGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgc3BlY2lmaWNfZGV2aWNlID0gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItaWZfbWFzayIpKQorICAgICAgICB7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICByeF9jZmcucG9uX25pX21hc2sgPSAodWludDMyX3Qpc3RydG91bChhcmd2W2ldLCBOVUxMLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItcHJveHkiKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cl9wcm94eV9kZXYgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJUb28gbWFueSAtcHJveHkgb3B0aW9uc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpOworICAgICAgICAgICAgcnVuX3Byb3h5ID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIHByb3h5X3BvcnRbY3VyX3Byb3h5X2Rldl0gPSAodWludDMyX3Qpc3RydG91bChhcmd2W2ldLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmIChwcm94eV9wb3J0W2N1cl9wcm94eV9kZXZdID4gMHhmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiSW52YWxpZCBwcm94eSBwb3J0ICV1XG4iLCAodW5zaWduZWQpcHJveHlfcG9ydFtjdXJfcHJveHlfZGV2XSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytjdXJfcHJveHlfZGV2OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1yZW1vdGUiKSkKKyAgICAgICAgeworICAgICAgICAgICAgKytpOworICAgICAgICAgICAgcnVuX3JlbW90ZV9jbGkgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgcmVtb3RlX2NsaV9wb3J0ID0gKHVpbnQzMl90KXN0cnRvdWwoYXJndltpXSwgTlVMTCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXVkIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nX2luYmFuZF9zZXQoQkNNT1NfVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW9uX3JlYWR5IikpCisgICAgICAgIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIG9uX3JlYWR5X2NtZCA9IGFyZ3ZbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2NsaV9oZWxwKGFyZ3ZbMF0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmMgPSBiY21vbHRfaG9zdF9pbml0KCZwYXJhbXMpOworICAgIEJVR19PTihyYyk7CisKKyAgICBiY21vc190cmFjZV9sZXZlbF9zZXQoQkNNT1NfVFJBQ0VfTEVWRUxfREVCVUcpOworCisgICAgaWYgKG5vZWRpdCkKKyAgICB7CisgICAgICAgIG1vbl9zZXNzaW9uX3Bhcm0ubGluZV9lZGl0X21vZGUgPSBCQ01DTElfTElORV9FRElUX0RJU0FCTEU7CisgICAgfQorICAgIGlmIChiY21jbGlfc2Vzc2lvbl9vcGVuKCZtb25fc2Vzc2lvbl9wYXJtLCAmY3VycmVudF9zZXNzaW9uKSkKKyAgICB7CisgICAgICAgIHByaW50ZigiQ2FuJ3Qgb3BlbiBDTEkgc2Vzc2lvblxuIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8qIFRyeSB0byBsZWFybiBzeXN0ZW0gbW9kZSBmb3IgYWxsIGRldmljZXMgKi8KKyAgICBpZiAoc3BlY2lmaWNfZGV2aWNlKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N5c3RlbV9tb2RlX3NldChjdXJyZW50X2RldmljZSwgX2dldF9zeXN0ZW1fbW9kZShjdXJyZW50X2RldmljZSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQkNNVFJfTUFYX09MVFM7IGkrKykKKyAgICAgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9zZXQoaSwgX2dldF9zeXN0ZW1fbW9kZShpKSk7CisgICAgfQorCisgICAgLyogSW5pdCBkZXZpY2Ugc2VsZWN0b3IgKi8KKyAgICByYyA9IGJjbW9sdF9kZXZfc2VsX2luaXQoTlVMTCk7CisKKyAgICAvKiBBZGQgTWFwbGUgQVBJIGNvbW1hbmRzICovCisgICAgcmMgPSByYyA/IHJjIDogYXBpX2NsaV9pbml0KE5VTEwsIGN1cnJlbnRfc2Vzc2lvbik7CisKKyAgICAvKiAoeClHUE9OIGluaXQuIERvZXMgbm90aGluZyBpZiBzeXN0ZW0gbW9kZSBpcyBub3QgKHgpR1BPTiAqLworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlID0gQkNNT0xUX1NZU1RFTV9NT0RFX19OVU1fT0Y7CisgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoY3VycmVudF9kZXZpY2UsICZzeXN0ZW1fbW9kZSk7CisgICAgICAgIGJjbV9jb21tb25fZ3Bvbl9pbml0KHN5c3RlbV9tb2RlKTsKKyAgICB9CisKKyAgICAvKiBBZGQgdHJhbnNwb3J0IGNvbW1hbmRzICovCisgICAgcmMgPSByYyA/IHJjIDogYmNtdHJfY2xpX2luaXQoKTsKKworICAgIC8qIEFkZCBjYXB0dXJlLCBsb2csIGRlYnVnIGNvbW1hbmRzICovCisgICAgcmMgPSByYyA/IHJjIDogYmNtdHJfY2xkX2luaXQoY3VycmVudF9zZXNzaW9uKTsKKworICAgIC8qIEluaXRpYWxpemUgZW1iZWRkZWQgQ0xJIG1vZHVsZSAqLworICAgIHJjID0gcmMgPyByYyA6IGJjbV9lbWJlZGRlZF9jbGlfaW5pdCgpOworCisgICAgcmMgPSByYyA/IHJjIDogYmNtb3NfY2xpX2luaXQoTlVMTCk7CisKKyAgICByYyA9IHJjID8gcmMgOiBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbml0KE5VTEwpOworCisgICAgcmMgPSByYyA/IHJjIDogYmNtb2x0X3VzZXJfYXBwbF9leF9jbGlfaW5pdCgpOworCisKKyNpZiBkZWZpbmVkKExJTlVYX0tFUk5FTF9TUEFDRSkKKyAgICByYyA9IHJjID8gcmMgOiBiY21fYm9hcmRfaW5pdCgpOworICAgIHJjID0gcmMgPyByYyA6IGJjbV9ib2FyZF9jbGlfaW5pdChOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0xPRworICAgIC8qIGxvZ2dlciBDTEkgZGlyZWN0b3J5ICovCisgICAgYmNtX2Rldl9sb2dfY2xpX2luaXQoTlVMTCk7CisjZW5kaWYKKworICAgIGlmIChydW5fcHJveHkpCisgICAgeworICAgICAgICAvKiBJZiBleGVjdXRpbmcgZm9yIHNwZWNpZmljIGRldmljZSwgcnVuIG9ubHkgMSBwcm94eSBpbnN0YW5jZS4KKyAgICAgICAgICogT3RoZXJ3aXNlLCBjcmVhdGUgYXMgbWFueSBpbnN0YW5jZXMgYXMgcmVxdWVzdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoc3BlY2lmaWNfZGV2aWNlKQorICAgICAgICAgICAgcmMgPSByYyA/IHJjIDogYmNtb2x0X2FwaV9wcm94eV9pbml0KE5VTEwsIGRldmljZSwgcHJveHlfcG9ydFswXSwgb25fcmVhZHlfY21kKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3VyX3Byb3h5X2RldjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gcmMgPyByYyA6IGJjbW9sdF9hcGlfcHJveHlfaW5pdChOVUxMLCBpLCBwcm94eV9wb3J0W2ldLCBvbl9yZWFkeV9jbWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJ1bl9yZW1vdGVfY2xpKQorICAgIHsKKyAgICAgICAgcmMgPSByYyA/IHJjIDogYmNtb2x0X3JlbW90ZV9jbGlfaW5pdChOVUxMLCBkZXZpY2UsIHJlbW90ZV9jbGlfcG9ydCk7CisgICAgfQorCisgICAgLyogQWRkIG90aGVyIGNvbW1hbmRzLCBlLmcuLCBhY2Nlc3MgdG8gZW1iZWRkZWQgQ0xJICovCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICByeF9jZmcucnhfY2IgPSBiY21vbHRfdXNlcl9hcHBsX2luZGljYXRpb25fY2I7CisgICAgcmMgPSBiY21vbHRfYXV0b19yeF9jYl9zZXQoZGV2aWNlLCAmcnhfY2ZnKTsKKyAgICBCVUdfT04oQkNNX0VSUl9PSyAhPSByYyk7CisgICAgcnhfY2ZnLnJ4X2NiID0gYmNtb2x0X3VzZXJfYXBwbF9wcm94eV9yeF9jYjsKKyAgICByYyA9IGJjbW9sdF9wcm94eV9yeF9jYl9zZXQoZGV2aWNlLCAmcnhfY2ZnKTsKKyAgICBCVUdfT04oQkNNX0VSUl9PSyAhPSByYyk7CisKKyAgICBiY21vbHRfdXNlcl9tZnRwX2luaXQoKTsKKworICAgIHNtX2NoYW5nZV9jYiA9IGhhbmRsZV9zeXN0ZW1fbW9kZV9jaGFuZ2U7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKE5VTEwsICJxdWl0IiwgIlF1aXQiLCBfY21kX3F1aXQpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oTlVMTCwgInVzaW5nX2luYmFuZCIsICJVc2luZyBJbiBCYW5kIiwgX2NtZF91c2luZ19pbmJhbmQpOworCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICBiY21fYm9hcmRfZnBnYV92ZXJzaW9uX2dldCgmZnBnYV92ZXJzaW9uKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChjdXJyZW50X3Nlc3Npb24sICJGUEdBIHZlcnNpb246ICVkXG4iLCBmcGdhX3ZlcnNpb24pOworI2VuZGlmCisKKyAgICAvKiBQcm9jZXNzIHVzZXIgaW5wdXQgdW50aWwgRU9GIG9yIHF1aXQgY29tbWFuZCAqLworICAgIGJjbWNsaV9kcml2ZXIoY3VycmVudF9zZXNzaW9uKTsKKworI2lmIGRlZmluZWQoTElOVVhfS0VSTkVMX1NQQUNFKQorICAgIGJjbV9ib2FyZF91bmluaXQoKTsKKyNlbmRpZgorICAgIGJjbXRyX2V4aXQoKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9jbG9zZShjdXJyZW50X3Nlc3Npb24pOworICAgIGJjbWNsaV90b2tlbl9kZXN0cm95KE5VTEwpOworCisgICAgaWYgKHJ1bl9wcm94eSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcGlfcHJveHlfc3RvcCgpOworICAgIH0KKworICAgIGlmIChydW5fcmVtb3RlX2NsaSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZW1vdGVfY2xpX3N0b3AoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzYyMWRhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2NsaS5jCkBAIC0wLDAgKzEsNTY4IEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbV9hcGlfY2xpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnX3BhY2suaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHMuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzX2NsaS5oIgorI2lmbmRlZiBSRUxFQVNFX0JVSUxECisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9vbWNpX3N3ZGxfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9vbWNpX3N3ZGwuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fbWFjX2xlYXJuaW5nX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9tYWNfbGVhcm5pbmcuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RyZXNzX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zdHJlc3MuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fc25fYWNxdWlzaXRpb25fY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3NuX2FjcXVpc2l0aW9uLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX2RzX29tY2lfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX2RzX29tY2kuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljc19jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljcy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9yc3NpX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9yc3NpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmcuaCIKKyNlbmRpZiAvKiBOb3QgUkVMRUFTRV9CVUlMRCAqLworI2luY2x1ZGUgImJjbW9sdF9lb24uaCIKKyNpbmNsdWRlICJiY21vbHRfZXBvbl9oZGUuaCIKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorI2luY2x1ZGUgIm9tb24uaCIKKyNpbmNsdWRlIDxiY21vbHRfZGV2X2N0cmxfaW9jdGwuaD4KKyNpbmNsdWRlIDxiY210cl9wY2llLmg+CisjZW5kaWYgLyogI2VuZGlmIFNJTVVMQVRJT05fQlVJTEQgKi8KKyNpbmNsdWRlICJiY21vbHRfYm9hcmQuaCIKKyNpbmNsdWRlICJiY21vbHRfYXBpX3Byb3h5LmgiCisjaW5jbHVkZSAiYmNtb2x0X3JlbW90ZV9jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaCIKKyNpbmNsdWRlICJiY21vbHRfaW1hZ2VfdHJhbnNmZXJfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3N3X3VwZ3JhZGVfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFjay5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWMuaCIKKworI2lmZGVmIEVOQUJMRV9MT0cKK3N0YXRpYyB1aW50MzJfdCAqYmNtbGNsaV9wY2lfZHVtcHB0cjsKK3N0YXRpYyBkZXZfbG9nX2lkIHVzZXJfYXBwbF9sb2dfaWQ7CitzdGF0aWMgZGV2X2xvZ19pZCBpbmRfbG9nX2lkW0JDTVRSX01BWF9JTlNUQU5DRVNdOworc3RhdGljIGJjbWNsaV9lbnRyeSAqdXNlcl9kaXI7CitzdGF0aWMgYmNtb3NfYm9vbCBzeXNfbW9kZV9zZXRbQkNNVFJfTUFYX09MVFNdID0ge307CisKK3N0YXRpYyB2b2lkIHVzZXJfYXBwbF9hcGlfbXNnX2R1bXAoY29uc3QgY2hhciAqdGl0bGUsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICB1aW50OF90IGluc3QgPSBiY21vbHRfbXNnX2luc3RhbmNlKG1zZyk7CisgICAgaW5zdCA9IChpbnN0ID4gQkNNVFJfTUFYX0lOU1RBTkNFUykgPyAwIDogaW5zdDsKKyAgICBiY21vbHRfbXNnX2xvZyhpbmRfbG9nX2lkW2luc3RdLCBtc2cpOworfQorCisjaWZuZGVmIFJFTEVBU0VfQlVJTEQKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX3Byb2Nlc3NfZXhjZXB0aW9uX2luZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfYXV0byAqaW5kKQoreworICAgIHN3aXRjaCAoaW5kLT5oZHIub2JqX3R5cGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX09CSl9JRF9ERVZJQ0U6CisgICAgICAgIHN3aXRjaCAoaW5kLT5oZHIuc3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VYQ0VQVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SOgorICAgICAgICAgICAgLyogU3RvcCBhbGwgdXNlciBhcHBsaWNhdGlvbiB0YXNrcy4gKi8KKyAgICAgICAgICAgIGlmIChiY21vbHRfZ3Bvbl9tYWNfbGVhcm5pbmdfYXBwbF9pc19ydW5uaW5nKGRldmljZV9pZCkpCisgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fbWFjX2xlYXJuaW5nX2FwcGxfc3RvcChkZXZpY2VfaWQpOworICAgICAgICAgICAgaWYgKGJjbW9sdF9ncG9uX3N0cmVzc19hcHBsX2lzX3J1bm5pbmcoZGV2aWNlX2lkKSkKKyAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9zdHJlc3NfYXBwbF9zdG9wKGRldmljZV9pZCk7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fYXBwbF9pc19ydW5uaW5nKGRldmljZV9pZCkpCisgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fYXBwbF9zdG9wKGRldmljZV9pZCk7CisgICAgICAgICAgICBpZiAoYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3NfaXNfcnVubmluZyhkZXZpY2VfaWQpKQorICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zdGF0aXN0aWNzX3N0b3AoZGV2aWNlX2lkKTsKKyAgICAgICAgICAgIGlmIChiY21vbHRfZ3Bvbl9kc19vbWNpX2FwcGxfaXNfcnVubmluZyhkZXZpY2VfaWQpKQorICAgICAgICAgICAgICAgIGJjbW9sdF9ncG9uX2RzX29tY2lfYXBwbF9zdG9wKGRldmljZV9pZCk7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2dwb25fcnNzaV9hcHBsX2lzX3J1bm5pbmcoZGV2aWNlX2lkKSkKKyAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9yc3NpX2FwcGxfc3RvcChkZXZpY2VfaWQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2luZGljYXRpb25fY2IoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIHVpbnQ4X3QgaW5zdGFuY2UgID0gYmNtb2x0X21zZ19pbnN0YW5jZShtc2cpOworICAgIGJjbW9sdF9hdXRvICppbmQgPSAoYmNtb2x0X2F1dG8gKiltc2c7CisgICAgYmNtb2x0X3BzX3BvbiBwc19wb24gPSB7IGRldmljZV9pZCwgaW5zdGFuY2UgfTsKKworICAgIHVzZXJfYXBwbF9hcGlfbXNnX2R1bXAoIkluZGljYXRpb24iLCBtc2cpOworICAgIGJjbW9sdF9wc19wcm9jZXNzX2luZCgmcHNfcG9uLCBpbmQpOworCisjaWZuZGVmIFJFTEVBU0VfQlVJTEQKKyAgICBiY21vbHRfdXNlcl9hcHBsX3Byb2Nlc3NfZXhjZXB0aW9uX2luZChkZXZpY2VfaWQsIGluZCk7CisgICAgLyogRm9yd2FyZCB0aGUgaW5kaWNhdGlvbiB0byBlYWNoIHVzZXIgYXBwbGljYXRpb24uICBUaGVzZSBhcHBsaWNhdGlvbnMgd2lsbCBpZ25vcmUgaW5kaWNhdGlvbnMgdGhhdCBhcmVuJ3QKKyAgICAgKiByZWxldmFudCBhbmQgZXJyb3JzIHdpbGwgYmUgcHJpbnRlZCB0byBkZWRpY2F0ZWQgbG9nIElEcyBwZXIgYXBwbGljYXRpb24uICovCisgICAgYmNtb2x0X2dwb25fbWFjX2xlYXJuaW5nX3Byb2Nlc3NfaW5kKGRldmljZV9pZCwgaW5kKTsKKyAgICBiY21vbHRfZ3Bvbl9zdHJlc3NfcHJvY2Vzc19pbmQoZGV2aWNlX2lkLCBpbmQpOworICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX3Byb2Nlc3NfaW5kKGRldmljZV9pZCwgaW5kKTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljc19wcm9jZXNzX2luZChkZXZpY2VfaWQsIGluZCk7CisgICAgYmNtb2x0X2dwb25fZHNfb21jaV9wcm9jZXNzX2luZChkZXZpY2VfaWQsIGluZCk7CisgICAgYmNtb2x0X2dwb25fcnNzaV9wcm9jZXNzX2luZChkZXZpY2VfaWQsIGluZCk7CisgICAgYmNtb2x0X29udV90dW5pbmdfcHJvY2Vzc19pbmQoZGV2aWNlX2lkLCBpbmQpOworI2VuZGlmIC8qIE5vdCBSRUxFQVNFX0JVSUxEICovCisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIGJjbW9sdF91c2VyX2FwcGxfb21vbl9oYW5kbGVfaW5kKGRldmljZV9pZCwgaW5zdGFuY2UsIGluZCk7CisjZW5kaWYKKworICAgIGJjbW9sdF9hcGlfcHJveHlfYXV0b19yeF9jYihkZXZpY2VfaWQsIG1zZyk7CisgICAgYmNtb2x0X3JlbW90ZV9jbGlfYXV0b19yeF9jYihkZXZpY2VfaWQsIG1zZyk7CisKKyAgICAvKiBGcmVlIHRoZSBpbmRpY2F0aW9uIHNpbmNlIHdlJ3JlIGRvbmUgcHJvY2Vzc2luZyBpdCAqLworICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworfQorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfcHJveHlfcnhfY2IoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9wcm94eV9yeCAqcHJveHlfcnggPSAoYmNtb2x0X3Byb3h5X3J4ICopbXNnOworCisjaWZuZGVmIFJFTEVBU0VfQlVJTEQKKyAgICBiY21vbHRfb21jaV9zd2RsX3Byb2Nlc3NfcHJveHlfcngoZGV2aWNlX2lkLCBwcm94eV9yeCk7CisKKyAgICAvKiBEdW1wIFJYIHBhY2tldCBpZiBPTUNJIFNXREwgaXMgTm90IHJ1bm5pbmcqLworICAgIGlmICghYmNtb2x0X29tY2lfc3dkbF9hcHBsX2lzX3J1bm5pbmcoZGV2aWNlX2lkKSkKKyAgICB7CisgICAgICAgIHVzZXJfYXBwbF9hcGlfbXNnX2R1bXAoIlByb3h5IFJ4IiwgbXNnKTsKKyAgICB9CisjZWxzZQorICAgIHVzZXJfYXBwbF9hcGlfbXNnX2R1bXAoIlByb3h5IFJ4IiwgbXNnKTsKKyNlbmRpZiAvKiBOb3QgUkVMRUFTRV9CVUlMRCAqLworCisgICAgYmNtb2x0X2FwaV9wcm94eV9hdXRvX3J4X2NiKGRldmljZV9pZCwgbXNnKTsKKyAgICBiY21vbHRfcmVtb3RlX2NsaV9hdXRvX3J4X2NiKGRldmljZV9pZCwgbXNnKTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vvbl9wcm9jZXNzX3J4KGRldmljZV9pZCwgcHJveHlfcngpOworICAgIGJjbW9sdF9lcG9uX2hkZV9wcm9jZXNzX3J4KGRldmljZV9pZCwgYmNtb2x0X21zZ19pbnN0YW5jZShtc2cpLCBwcm94eV9yeCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcngoZGV2aWNlX2lkLCBwcm94eV9yeCwgTlVMTCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19wcm9jZXNzX3Byb3h5X3J4KGRldmljZV9pZCwgcHJveHlfcngpOworICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworfQorCisvKiBleGFtcGxlIG9uIGhvdyB0byByZWFkIHRoZSBlbWJlZGRlZCBsb2dnZXIgZnJvbSB0aGUgaG9zdCAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfcmVhZF9lbWJlZGRlZF9sb2dnZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfbG9nZ2VyX2NmZyAgY2ZnOworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsuZmlsZV9pZCA9IHBhcm1bMF0udmFsdWUudW51bWJlciwgLnJlc2VydmVkID0gMH07CisgICAgaW50IHJjOworCisgICAgYmNtX2Rldl9sb2dfbG9nKAorICAgICAgICB1c2VyX2FwcGxfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiJXMiLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIGJjbV9kZXZfbG9nX2xvZygKKyAgICAgICAgdXNlcl9hcHBsX2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgICAgICAgInwgZGV2aWNlICV1IGxvZ2dlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiIsIGN1cnJlbnRfZGV2aWNlKTsKKyAgICBiY21fZGV2X2xvZ19sb2codXNlcl9hcHBsX2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgIiVzIiwgInwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuIik7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBidWZmZXIpOworICAgICAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmY2ZnLmhkcik7CisgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiZ2V0IG9iaiBlcnJvciAlZFxuIiwgcmMpOworICAgICAgICB9CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXMiLCBjZmcuZGF0YS5idWZmZXIuYnVmZik7CisgICAgICAgIGlmIChjZmcuZGF0YS5idWZmZXIubXNnX3RvX3JlYWQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIGV4YW1wbGUgb24gaG93IHRvIHJlYWQgYWxsIHRoZSBlbWJlZGRlZCBsb2cgZW50cmllcyBmcm9tIHRoZSBob3N0ICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9nZXRfYWxsX2xvZ19lbnRyaWVzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9jZmcgIGNmZzsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7LmxvZ19pZCA9IDAsIC5yZXNlcnZlZD0wfTsKKyAgICBpbnQgcmM7CisKKyAgICBjaGFyICpfbG9nX2xldmVsW10gPQorICAgIHsKKyAgICAgICAgIk5PX0xPRyIsCisgICAgICAgICJGQVRBTCIsCisgICAgICAgICJFUlJPUiIsCisgICAgICAgICJXQVJOSU5HIiwKKyAgICAgICAgIklORk8iICwKKyAgICAgICAgIkRFQlVHIgorICAgIH07CisKKyAgICBjaGFyICpfbG9nX3R5cGVbXSA9CisgICAgeworICAgICAgICAiTk9ORSIsCisgICAgICAgICJQUklOVCIsCisgICAgICAgICJTQVZFIiwKKyAgICAgICAgIkJPVEgiCisgICAgfTsKKworICAgIGNoYXIgKl9sb2dfc3R5bGVbXSA9CisgICAgeworICAgICAgICAiTk9STUFMIiwKKyAgICAgICAgIkJPTEQiLAorICAgICAgICAiVU5ERVJMSU5FIiwKKyAgICAgICAgIkJMSUsiLAorICAgICAgICAiUkVWRVJTRV9WSURFTyIKKyAgICB9OworCisgICAgYmNtX2Rldl9sb2dfbG9nKAorICAgICAgICB1c2VyX2FwcGxfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiJXMiLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIGJjbV9kZXZfbG9nX2xvZygKKyAgICAgICAgdXNlcl9hcHBsX2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgIiVzIiwgInwgTE9HIElEIHwgICAgICAgIExPRyBOQU1FICAgICAgIHwgTE9HIGxldmVsIHByaW50IHwgTE9HIGxldmVsIHNhdmUgIHwgbG9nIHR5cGUgfCAgICBsb2cgc3R5bGUgICAgfFxuIik7CisgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICIlcyIsICJ8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiIpOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmY2ZnLmhkcik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIgfCBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCwKKyAgICAgICAgICAgICJ8JS04ZHwlLTIzc3wlLTE3c3wlLTE3c3wlLTEwc3wlLTE3c3xcbiIsCisgICAgICAgICAgICBrZXkubG9nX2lkLAorICAgICAgICAgICAgY2ZnLmRhdGEubG9nX25hbWUuc3RyLAorICAgICAgICAgICAgX2xvZ19sZXZlbFtjZmcuZGF0YS5sb2dfbGV2ZWxfcHJpbnRdLAorICAgICAgICAgICAgX2xvZ19sZXZlbFtjZmcuZGF0YS5sb2dfbGV2ZWxfc2F2ZV0sCisgICAgICAgICAgICBfbG9nX3R5cGVbY2ZnLmRhdGEubG9nX3R5cGVdLAorICAgICAgICAgICAgX2xvZ19zdHlsZVtjZmcuZGF0YS5sb2dfc3R5bGVdKTsKKyAgICAgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICAgICAiJXMiLCAifC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4iKTsKKyAgICAgICAga2V5LmxvZ19pZCsrOworCisgICAgfQorICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiJXMiLCAifC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4iKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfaW5kaWNhdGlvbl9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgc3RydWN0IGJjbW9sdF9yeF9jZmcgcnhfY2ZnID0KKyAgICB7CisgICAgICAgIC5vYmpfdHlwZSA9IEJDTU9MVF9PQkpFQ1RfQU5ZLAorICAgICAgICAucnhfY2IgPSBiY21vbHRfdXNlcl9hcHBsX2luZGljYXRpb25fY2IsCisgICAgICAgIC5mbGFncyA9IEJDTU9MVF9BVVRPX0ZMQUdTX05PTkUsCisgICAgICAgIC5wb25fbmlfbWFzayA9IHBhcm1bMF0udmFsdWUudW51bWJlcgorICAgIH07CisgICAgcmV0dXJuIGJjbW9sdF9hdXRvX3J4X2NiX3NldChjdXJyZW50X2RldmljZSwgJnJ4X2NmZyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3Byb3h5X3J4X2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBzdHJ1Y3QgYmNtb2x0X3J4X2NmZyByeF9jZmcgPQorICAgIHsKKyAgICAgICAgLm9ial90eXBlID0gQkNNT0xUX09CSkVDVF9BTlksCisgICAgICAgIC5yeF9jYiA9IGJjbW9sdF91c2VyX2FwcGxfcHJveHlfcnhfY2IsCisgICAgICAgIC5mbGFncyA9IEJDTU9MVF9BVVRPX0ZMQUdTX05PTkUsCisgICAgICAgIC5wb25fbmlfbWFzayA9IHBhcm1bMF0udmFsdWUudW51bWJlcgorICAgIH07CisgICAgcmV0dXJuIGJjbW9sdF9wcm94eV9yeF9jYl9zZXQoY3VycmVudF9kZXZpY2UsICZyeF9jZmcpOworfQorI2VuZGlmCisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfcGNpc3RhdChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50OF90IHN0YXJ0OworICAgIGJjbV9wY2llZF9zdGF0ICpzdGF0OworCisgICAgc3RhcnQgPSAwOworICAgIGlmIChuX3Bhcm1zID4gMCkKKyAgICB7CisgICAgICAgIGlmICghc3RybmNtcChwYXJtWzBdLnZhbHVlLnN0cmluZywgInllcyIsIHN0cmxlbigieWVzIikpKQorICAgICAgICAgICAgc3RhcnQgPSAxOworICAgIH0KKworICAgIHJjID0gYmNtX2JvYXJkX3BjaV9kZWJ1ZygwLCBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9QQ0lfU1RBVCwgc3RhcnQsIDAsIGJjbWxjbGlfcGNpX2R1bXBwdHIpOworICAgIHN0YXQgPSAoYmNtX3BjaWVkX3N0YXQgKiliY21sY2xpX3BjaV9kdW1wcHRyOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfcGNpX2RlYnVnKCkgZmFpbGVkXG4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVjZWl2ZWQgICAgIDogJWRcbiIsIHN0YXQtPnJ4X2NvdW50ZXIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJTZW5kICAgICAgICAgOiAlZFxuIiwgc3RhdC0+dHhfY291bnRlcik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJ4IERvbmUgSXNyICA6ICVkXG4iLCBzdGF0LT5yeF9kb25lX2lzcl9jb3VudGVyKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUnggRXJyIElzciAgIDogJWRcbiIsIHN0YXQtPnJ4X2Vycl9pc3JfY291bnRlcik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlR4IERvbmUgSXNyICA6ICVkXG4iLCBzdGF0LT50eF9kb25lX2lzcl9jb3VudGVyKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiVHggRXJyIElzciAgIDogJWRcbiIsIHN0YXQtPnR4X2Vycl9pc3JfY291bnRlcik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJ4IGVtcHR5ICAgICA6ICVkXG4iLCBzdGF0LT5yeF9wY2llX2VtcHR5X2NvdW50ZXIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJUeCBmdWxsICAgICAgOiAlZFxuXG4iLCBzdGF0LT50eF9wY2llX2Z1bGxfY291bnRlcik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3BjaWR1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgdWludDMyX3QgY29tbWFuZDsKKyAgICBpbnQzMl90IHN0YXJ0LCBob3dtYW55OworCisgICAgc3RhcnQgPSAtMTsKKyAgICBob3dtYW55ID0gMTsKKworICAgIGlmIChuX3Bhcm1zID4gMSkKKyAgICB7CisgICAgICAgIHN0YXJ0ID0gcGFybVsxXS52YWx1ZS5udW1iZXI7CisgICAgICAgIGhvd21hbnkgPSAxOworICAgICAgICBpZiAobl9wYXJtcyA+IDIpCisgICAgICAgICAgICBob3dtYW55ID0gcGFybVsyXS52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGlmICghc3RybmNtcChwYXJtWzBdLnZhbHVlLnN0cmluZywgInR4Iiwgc3RybGVuKCJ0eCIpKSkKKyAgICB7CisgICAgICAgIGNvbW1hbmQgPSBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9QQ0lfRFVNUF9UWDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cm5jbXAocGFybVswXS52YWx1ZS5zdHJpbmcsICJyeCIsIHN0cmxlbigicngiKSkpCisgICAgeworICAgICAgICBjb21tYW5kID0gTUFQTEVfREVWX0NUUkxfSU9DVExfT1BfUENJX0RVTVBfUlg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJFcnJvciAtIHdyb25nIGNvbW1hbmQ6ICVzXG4iLCBwYXJtWzBdLnZhbHVlLnN0cmluZyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgcmMgPSBiY21fYm9hcmRfcGNpX2RlYnVnKDAsIGNvbW1hbmQsIHN0YXJ0LCBob3dtYW55LCBiY21sY2xpX3BjaV9kdW1wcHRyKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2JvYXJkX3BjaV9kZWJ1ZygpIGZhaWxlZFxuIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiVzIiwgKGNoYXIgKiliY21sY2xpX3BjaV9kdW1wcHRyKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N0YXJ0X2Vwb24odm9pZCkKK3sKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2luaXQoKTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF91c2VyX2FwcGxfZW9uX2luaXQoKTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vvbl9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIGJjbW9sdF9lcG9uX29tb25fYXBwbF9pbml0KCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29tb25fY2xpX2luaXQodXNlcl9kaXIpOworCisgICAgYmNtb2x0X2Vwb25faGRlX2FwcGxfaW5pdCgpOworICAgIGJjbW9sdF9lcG9uX2hkZV9hcHBsX2NsaV9pbml0KHVzZXJfZGlyKTsKKyNlbmRpZgorCisgICAgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19pbml0KCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19jbGlfaW5pdCh1c2VyX2Rpcik7Cit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N0YXJ0X2dwb24oYmNtb2x0X2RldmlkIGRldikKK3sKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHNfaW5pdCh1c2VyX2Rpcik7CisKKyNpZm5kZWYgUkVMRUFTRV9CVUlMRAorICAgIGJjbW9sdF9ncG9uX21hY19sZWFybmluZ19hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fbWFjX2xlYXJuaW5nX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9ncG9uX3N0cmVzc19hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RyZXNzX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX2FwcGxfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljc19pbml0KGRldik7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3NfY2xpX2luaXQodXNlcl9kaXIpOworCisgICAgYmNtb2x0X2dwb25fZHNfb21jaV9hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fZHNfb21jaV9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfb21jaV9zd2RsX2FwcGxfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfb21jaV9zd2RsX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9ncG9uX3Jzc2lfYXBwbF9pbml0KGRldik7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3Jzc2lfY2xpX2luaXQodXNlcl9kaXIpOworI2VuZGlmIC8qIE5vdCBSRUxFQVNFX0JVSUxEICovCit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N0YXJ0X3hncG9uKGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2luaXQodXNlcl9kaXIpOworCisjaWZuZGVmIFJFTEVBU0VfQlVJTEQKKworICAgIGJjbW9sdF9ncG9uX3N0cmVzc19hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RyZXNzX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX2FwcGxfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljc19pbml0KGRldik7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3NfY2xpX2luaXQodXNlcl9kaXIpOworCisgICAgYmNtb2x0X2dwb25fZHNfb21jaV9hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fZHNfb21jaV9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfZ3Bvbl9yc3NpX2FwcGxfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9yc3NpX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGlfaW5pdCh1c2VyX2Rpcik7CisjZW5kaWYgLyogTm90IFJFTEVBU0VfQlVJTEQgKi8KK30KKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2NsaV9oYW5kbGVfc3lzdGVtX21vZGVfY2hhbmdlKGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c19tb2RlOworCisgICAgaWYgKHN5c19tb2RlX3NldFtkZXZdID09IEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICByZXR1cm47IC8qIG9ubHkgcnVuIG9uY2UgKi8KKyAgICB9CisKKyAgICBzeXNfbW9kZV9zZXRbZGV2XSA9IEJDTU9TX1RSVUU7CisgICAgKHZvaWQpYmNtb2x0X3N5c3RlbV9tb2RlX2dldChkZXYsICZzeXNfbW9kZSk7CisgICAgc3dpdGNoIChzeXNfbW9kZSkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMTZfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF9DT0VYSVNURU5DRV9URE1BOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF9DT0VYSVNURU5DRV9URE1BOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HOgorICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2NsaV9zdGFydF9lcG9uKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzRfWDoKKyAgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9jbGlfc3RhcnRfZ3BvbihkZXYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX184X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHU19fMl9YXzEwX0c6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX18yX1hfMTBfRzoKKyAgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9jbGlfc3RhcnRfeGdwb24oZGV2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfX05VTV9PRjogLyogdW5jb25maWd1cmVkICovCisgICAgICAgIHN5c19tb2RlX3NldFtkZXZdID0gQkNNT1NfRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtbGNsaV9wY2lfZHVtcHB0ciA9IGJjbW9zX2FsbG9jKDEwMjQqNSk7CisgICAgdWludDhfdCBpbnN0OworCisgICAgaWYgKCFiY21sY2xpX3BjaV9kdW1wcHRyKQorICAgIHsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKCFiY21sY2xpX3BjaV9kdW1wcHRyLCBCQ01fRVJSX05PTUVNKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTlVMTDsKKyAgICB9CisjaWZkZWYgRU5BQkxFX0xPRworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZW51bV90YWJsZV9maWxlX2lkW10gPQorICAgIHsKKyAgICAgICAgeyAubmFtZSA9ICJTUkFNIiwgLnZhbCA9IEJDTU9MVF9MT0dfRklMRV9JRF9TUkFNIH0sCisgICAgICAgIHsgLm5hbWUgPSAiRERSIiwgLnZhbCA9IEJDTU9MVF9MT0dfRklMRV9JRF9ERFIgfSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBiY21vbHRfbXNnX2xvZ19pbml0KCk7IC8qIGluaXRpYWxpemUgQVBJL2xvZ2dlciBpbnRlZ3JhdGlvbiAqLworICAgIHVzZXJfYXBwbF9sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcigidXNlcl9hcHBsIiwgREVWX0xPR19MRVZFTF9ERUJVRywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIGZvciAoaW5zdCA9IDA7IGluc3QgPCBCQ01UUl9NQVhfSU5TVEFOQ0VTOyBpbnN0KyspCisgICAgeworICAgICAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgICAgICBzcHJpbnRmKGxvZ19uYW1lLCAiaW5kX21zZyV1IiwgaW5zdCk7CisgICAgICAgIGluZF9sb2dfaWRbaW5zdF0gPSBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihsb2dfbmFtZSwgREVWX0xPR19MRVZFTF9ERUJVRywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIH0KKyNlbmRpZgorICAgIHVzZXJfZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgInVzZXIiLCAiVXNlciBhcHBsaWNhdGlvbiIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUighdXNlcl9kaXIsIEJDTV9FUlJfTk9NRU0pOworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBCQ01DTElfTUFLRV9DTUQodXNlcl9kaXIsICJyZWdpc3Rlcl9pbmRpY2F0aW9uX2hhbmRsZXIiLCAiUmVnaXN0ZXIgaW5kaWNhdGlvbiBoYW5kbGVyIiwgX2FwaWNsaV9pbmRpY2F0aW9uX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fREVGVkFMKCJwb25fbmlfbWFzayIsICJQT05fTkkgaW50ZXJmYWNlIGJpdG1hc2suIDA9YWxsIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCwgMCkpOworICAgIEJDTUNMSV9NQUtFX0NNRCh1c2VyX2RpciwgInJlZ2lzdGVyX3Byb3h5X3J4X2hhbmRsZXIiLCAiUmVnaXN0ZXIgUHJveHkgUnggaGFuZGxlciIsIF9hcGljbGlfcHJveHlfcnhfaGFuZGxlciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoInBvbl9uaV9tYXNrIiwgIlBPTl9OSSBpbnRlcmZhY2UgYml0bWFzay4gMD1hbGwiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwLCAwKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKHVzZXJfZGlyLCAicmVhZF9lbWJlZGRlZF9sb2dnZXIiLCAiUmVhZCBlbWJlZGRlZCBsb2dnZXIiLCBfYXBpY2xpX3JlYWRfZW1iZWRkZWRfbG9nZ2VyLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImZpbGVfaWQiLCAiZmlsZV9pZCIsIGVudW1fdGFibGVfZmlsZV9pZCwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTSh1c2VyX2RpciwgImdldF9hbGxfbG9nX2VudHJpZXMiLCAiR2V0IGFsbCBlbWJlZGRlZCBsb2cgZW50cmllcyIsIF9hcGljbGlfZ2V0X2FsbF9sb2dfZW50cmllcyk7CisjZW5kaWYKKworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgQkNNQ0xJX01BS0VfQ01EKHVzZXJfZGlyLCAicGNpc3RhdCIsICJQcmludCBQQ0llIHN0YXRpc3RpY3MiLCBfYXBpY2xpX3BjaXN0YXQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImNsZWFyIiwgImNsZWFyIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKHVzZXJfZGlyLCAicGNpZHVtcCIsICJQcmludCBQQ0llIHJpbmciLCBfYXBpY2xpX3BjaWR1bXAsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImRpciIsICJkaXJlY3Rpb246IHR4IG9yIHJ4IiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZnJvbSIsICJzdGFydCBpbmRleCIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImhvd21hbnkiLCAiaG93bWFueSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworI2VuZGlmCisKKyNpZm5kZWYgUkVMRUFTRV9CVUlMRAorICAgIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfaW5pdCgpOworICAgIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2xpX2luaXQodXNlcl9kaXIpOworI2VuZGlmCisKKyAgICBlcnIgPSBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbWFnZV90cmFuc2Zlcl9pbml0KHVzZXJfZGlyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoZXJyICE9IEJDTV9FUlJfT0ssIGVycik7CisKKyAgICBlcnIgPSBiY21vbHRfdXNlcl9hcHBsX2NsaV9zd191cGdyYWRlX2luaXQodXNlcl9kaXIpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihlcnIgIT0gQkNNX0VSUl9PSywgZXJyKTsKKworICAgIGJjbW9sdF9wc19hcHBsX2luaXQoKTsKKyAgICBlcnIgPSBiY21vbHRfdXNlcl9hcHBsX3BzX2NsaV9pbml0KHVzZXJfZGlyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoZXJyICE9IEJDTV9FUlJfT0ssIGVycik7CisKKyAgICBiY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrX2luaXQoKTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF91c2VyX2FwcGxfY2xpX2hhbmRsZV9zeXN0ZW1fbW9kZV9jaGFuZ2UoY3VycmVudF9kZXZpY2UpOworCisgICAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2ExMDVlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2NsaS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfaW5kaWNhdGlvbl9jYihiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfbXNnICptc2cpOworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfcHJveHlfcnhfY2IoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X21zZyAqbXNnKTsKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2NsaV9oYW5kbGVfc3lzdGVtX21vZGVfY2hhbmdlKGJjbW9sdF9kZXZpZCBkZXYpOworCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZXhfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZXhfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhYzAxNgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9leF9jbGkuYwpAQCAtMCwwICsxLDc3MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGkuaD4KKyNpbmNsdWRlIDxiY21fYXBpX2NsaV9oZWxwZXJzLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2V4X2NsaS5oIgorCisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGRldl9sb2dfaWQgdXNlcl9hcHBsX2V4X2xvZ19pZDsKKworc3RhdGljIHZvaWQgdXNlcl9hcHBsX2dlbmVyYWxfaW5kaWNhdGlvbl9jYihiY21vbHRfZGV2aWQgb2x0LCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9leF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICJbLS0gRGV2ICV1OiBJbmRpY2F0aW9uIFJlY2VpdmVkIC0tXVxuIiwgb2x0KTsKKyAgICBzd2l0Y2ggKG1zZy0+b2JqX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVCVUc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fTkk6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+c3ViZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0xPUzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkICppbmQgPSAoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCopbXNnOworICAgICAgICAgICAgICAgICAgICBiY21fZGV2X2xvZ19sb2codXNlcl9hcHBsX2V4X2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEZXYgJXU6IHBvbiBuaSBzdGF0ZSBjaGFuZ2VkIG5ld19zdGF0ZSAlZCwgcHJldiBzdGF0ZSAlZCwgcmVzdWx0ICVkIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sdCwgaW5kLT5kYXRhLm5ld19zdGF0ZSwgaW5kLT5kYXRhLnByZXZpb3VzX3N0YXRlLCBpbmQtPmRhdGEucmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIC4uLiAqLworICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fT05VOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogLi4uICovCisgICAgfQorICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworfQorCitzdGF0aWMgdm9pZCB1c2VyX2FwcGxfcG9uX25pX2luZGljYXRpb25fY2IoYmNtb2x0X2RldmlkIG9sdCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfZXhfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiWy0tIERldiAldTogUG9uIE5JIEluZGljYXRpb24gUmVjZWl2ZWQgLS1dXG4iLCBvbHQpOworICAgIHN3aXRjaCAobXNnLT5vYmpfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChtc2ctPnN1Ymdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqaW5kID0gKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQqKW1zZzsKKyAgICAgICAgICAgICAgICAgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9leF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRGV2ICV1OiBwb24gbmkgc3RhdGUgY2hhbmdlZCBuZXdfc3RhdGUgJWQsIHByZXYgc3RhdGUgJWQsIHJlc3VsdCAlZCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBvbHQsIGluZC0+ZGF0YS5uZXdfc3RhdGUsIGluZC0+ZGF0YS5wcmV2aW91c19zdGF0ZSwgaW5kLT5kYXRhLnJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfZXhfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAgICAgICAgICJbLS0gRGV2ICV1OiBzb21lIG90aGVyIGluZGljYXRpb24gIC0tXVxuIiwgb2x0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiAuLi4gKi8KKyAgICB9CisgICAgYmNtb2x0X21zZ19mcmVlKG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIHVzZXJfYXBwbF9kZXZpY2VfbG9nZ2VyX2luZGljYXRpb25fY2IoYmNtb2x0X2RldmlkIG9sdCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChtc2ctPnN1Ymdyb3VwID09IEJDTU9MVF9ERUJVR19BVVRPX0lEX0NMSV9PVVRQVVQpCisgICAgeworICAgICAgICBiY21vbHRfZGVidWdfY2xpX291dHB1dCAqaW5kID0gKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0ICopbXNnOworICAgICAgICBiY21fZGV2X2xvZ19sb2codXNlcl9hcHBsX2V4X2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgICAgICJEZXYgJXU6IFtkZXZpY2UgbG9nZ2VyXSAlc1xuIiwgb2x0LCBpbmQtPmRhdGEuZGF0YS52YWwpOworICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2luZGljYXRpb25faGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9yeF9jZmcgcnhfY2ZnOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcnhfY2ZnLm9ial90eXBlID0gQkNNT0xUX09CSl9JRF9ERUJVRzsKKyAgICByeF9jZmcucnhfY2IgPXVzZXJfYXBwbF9kZXZpY2VfbG9nZ2VyX2luZGljYXRpb25fY2I7CisgICAgcnhfY2ZnLmZsYWdzID0gQkNNT0xUX0FVVE9fRkxBR1NfTk9ORTsKKyAgICByYyA9IGJjbW9sdF9hdXRvX3J4X2NiX3NldChjdXJyZW50X2RldmljZSwgJnJ4X2NmZyk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcnhfY2ZnLm9ial90eXBlID0gQkNNT0xUX09CSl9JRF9HUE9OX05JOworICAgIHJ4X2NmZy5yeF9jYiA9IHVzZXJfYXBwbF9wb25fbmlfaW5kaWNhdGlvbl9jYjsKKyAgICByeF9jZmcuZmxhZ3MgPSBCQ01PTFRfQVVUT19GTEFHU19OT05FOworICAgIHJjID0gYmNtb2x0X2F1dG9fcnhfY2Jfc2V0KGN1cnJlbnRfZGV2aWNlLCAmcnhfY2ZnKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByeF9jZmcub2JqX3R5cGUgPSBCQ01PTFRfT0JKRUNUX0FOWTsKKyAgICByeF9jZmcucnhfY2IgPSB1c2VyX2FwcGxfZ2VuZXJhbF9pbmRpY2F0aW9uX2NiOworICAgIHJ4X2NmZy5mbGFncyA9IEJDTU9MVF9BVVRPX0ZMQUdTX05PTkU7CisgICAgcmV0dXJuIGJjbW9sdF9hdXRvX3J4X2NiX3NldChjdXJyZW50X2RldmljZSwgJnJ4X2NmZyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfbG9nX2VudHJ5X3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2NmZyBjZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7LmxvZ19pZD0gMH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpOworCisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9wcmludCwgQkNNT0xUX0xPR19MRVZFTF9JTkZPKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUsIEJDTU9MVF9MT0dfTEVWRUxfREVCVUcpOworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9uaV9kaXNhYmxlX2luZGljYXRpb24gKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnIGNmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7LnBvbl9uaT0gMH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpOworCisgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsIEJDTU9TX0ZBTFNFKTsKKyAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgc3RhdF9hbGFybV9jbGVhcmVkLCBCQ01PU19GQUxTRSk7CisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KDAsICZjZmcuaGRyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX3JlZGlyZWN0X2RldmljZV9sb2dnZXIgKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2RlYnVnX2NmZyBjZmc7CisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7fTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZWJ1Zywga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uLCBCQ01PTFRfQ09OU09MRV9SRURJUkVDVElPTl9DTE9ORSk7CisgICAgYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9kZXZpY2VfaW5pdChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGNmZzsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0gey5yZXNlcnZlZCA9IDB9OworICAgIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIG5uaV9zcGVlZCA9IHt9OyAvKio8IERldmljZSBuZXR3b3JrIGludGVyZmFjZSBzcGVlZCBjb25maWd1cmF0aW9uICovCisgICAgYmNtb2x0X2RldmljZV9jb25uZWN0IG9wZXI7CisKKyAgICBubmlfc3BlZWQuZmlyc3RfaGFsZiA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18xOworICAgIG5uaV9zcGVlZC5zZWNvbmRfaGFsZiA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18xOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgc3lzdGVtX21vZGUsIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsLCA1KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX3RvbGVyYW5jZSwgNSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIG5uaV9zcGVlZCwgbm5pX3NwZWVkKTsKKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnLmhkcik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGNvbm5lY3QsIGtleSk7CisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KDAsICZvcGVyLmhkcik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX3NldF90cngoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl90cnhfa2V5IGtleSA9IHsucG9uX25pID0gMH07CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl90cngsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgQkNNT0xUX1RSWF9UWVBFX1NPVVJDRV9QSE9UT05JQ1MpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9zZXRfaW50ZXJ3b3JraW5nX21vZGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsucG9uX25pID0gMH07CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2YsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgaXdmX21vZGUsIEJDTU9MVF9JV0ZfTU9ERV9QRVJfRkxPV19NT0RFKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworCit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9zZXRfbWFjX3RhYmxlX2NvbmZpZyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9ncG9uX2l3Zl9jZmcgY2ZnX2l3ZjsKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleV9pd2YgPSB7LnBvbl9uaSA9IDB9OworICAgIGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiBtYWNfdGFibGVfY29uZmlndXJhdGlvbjsKKyAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hZ2luZ190aW1lID0gMTAwMDA7CisgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19hZ2luZyA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19sZWFybmluZyA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19tb3ZlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfc3RhdGljX21vZGUgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIG1hY190YWJsZV9jb25maWd1cmF0aW9uLmRlZmF1bHRfZmxvd19pZCA9IDYwMDsKKyAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5sZWFybmluZ19tb2RlID0gQkNNT0xUX01BQ19UQUJMRV9MRUFSTklOR19NT0RFX05PUk1BTDsKKyAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5taXNzX2ZhbGxiYWNrID0gQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX0RFRkFVTFRfRkxPVzsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnX2l3ZiwgZ3Bvbl9pd2YsIGtleV9pd2YpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ19pd2YsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24pOworICAgIC8qIG11c3Qgc2V0IHRoZSBJV0YgdG8gcGVyIGZvdyBmb3IgbWFjIHRhYmxlIG1hcHBpbmcgdG8gd29yayAqLworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ19pd2YsIGdwb25faXdmLCBpd2ZfbW9kZSwgQkNNT0xUX0lXRl9NT0RFX1BFUl9GTE9XX01PREUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnX2l3Zi5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fYWN0aXZhdGVfcG9uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZSBvcGVyX25pOworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXlfbmkgPSB7LnBvbl9uaSA9IDB9OworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3Blcl9uaSwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwga2V5X25pKTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3Blcl9uaSwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwgcG9uX3N0YXRlLCBCQ01PTFRfUE9OX09QRVJBVElPTl9BQ1RJVkVfV09SS0lORyk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdCgwLCAmb3Blcl9uaS5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fc3RhcnRfc25fYWNxdWlzaXRpb24oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaV9jZmcgY2ZnX25pOworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXlfbmkgPSB7LnBvbl9uaSA9IDB9OworICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIHNuX2FjcXVpc2l0aW9uOworCisgICAgc25fYWNxdWlzaXRpb24uY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKKyAgICBzbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCA9IDc3MDAwOworICAgIHNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0RJU0FCTEU7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZ19uaSwgZ3Bvbl9uaSwga2V5X25pKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmdfbmksIGdwb25fbmksIHNuX2FjcXVpc2l0aW9uLCBzbl9hY3F1aXNpdGlvbik7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmdfbmkuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX25pX2dldF9zdGF0cyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9ncG9uX25pX3N0YXQgc3RhdDsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7fTsgLyoqPCBkZWNsYXJlIGtleSAqLworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fbmksIGtleSk7CisgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICByZXR1cm4gYmNtb2x0X3N0YXRfZ2V0KDAsICZzdGF0LmhkciwgQkNNT1NfVFJVRSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9vbnVfY29uZmlnKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7LnBvbl9uaSA9IDAsIC5vbnVfaWQgPSAyfTsKKyAgICBiY21vbHRfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyID0gey52ZW5kb3JfaWQgPSB7MHgwMCwweDAwLDB4MDAsIDB4MDB9LCAudmVuZG9yX3NwZWNpZmljID0gezB4MDAsMHgwMCwweDAwLCAweDAyfX07CisgICAgYmNtb2x0X2Fycl91OF8xMCBwYXNzd29yZCA9IHsuYXJyID0gezB4MDAsMHgwMCwweDAwLCAweDAwLCAweDAwLDB4MDAsMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH19OworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkLCBwYXNzd29yZCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZywgQkNNT1NfVFJVRSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgdXNfZmVjLCBCQ01PU19GQUxTRSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkLCAyKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCA1MDAwKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fYWN0aXZhdGVfb251KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsucG9uX25pID0gMCwgLm9udV9pZCA9IDJ9OworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdCgwLCAmb3Blci5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fYWxsb2NfaWRfY29uZmlnKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fYWxsb2NfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0gey5wb25fbmkgPSAwLCAuYWxsb2NfaWQgPSAzMjB9OworCisgICAgYmNtb2x0X3Bvbl9hbGxvY19zbGEgc2xhOyAvKio8IEFsbG9jIElEIFNMQS4gKi8KKworICAgIHNsYS5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ID0gQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfTk9OX0FTU1VSRUQ7CisgICAgc2xhLmNicl9ydF9idyA9IDA7CisgICAgc2xhLmNicl9ucnRfYncgPSAxNDAwMDAwMDA7CisgICAgc2xhLmd1YXJhbnRlZWRfYncgPSAxNDAwMDAwMDA7CisgICAgc2xhLm1heGltdW1fYncgPSAxNDAwMDAwMDA7CisgICAgc2xhLmFsbG9jX3R5cGUgPSBCQ01PTFRfQUxMT0NfVFlQRV9OU1I7CisgICAgc2xhLmNicl9ydF9jb21wZW5zYXRpb24gPSBCQ01PU19GQUxTRTsKKyAgICBzbGEuY2JyX25ydF9hcF9pbmRleCA9IDA7CisgICAgc2xhLmNicl9ydF9hcF9pbmRleCA9IDA7CisgICAgc2xhLndlaWdodCA9IDA7CisgICAgc2xhLnByaW9yaXR5ID0gMDsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9hbGxvYywgb251X2lkLCAyKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHNsYSwgc2xhKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworfQorCisvKiBDb25maWd1cmUgYSBHRU0gLSBmb3IgRFMgb3IgYmlkaXJlY3Rpb25hbCB0cmFmZmljICovCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fZ2VtX3BvcnRfY29uZmlnKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0gey5wb25fbmkgPSAwLCAuZ2VtX3BvcnRfaWQgPSAzMjB9OworCisgICAgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHsuZGlyZWN0aW9uID0gQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9CSURJUkVDVElPTkFMLCAudHlwZSA9IEJDTU9MVF9HRU1fUE9SVF9UWVBFX1VOSUNBU1R9OworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgb251X2lkLCAyKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24pOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsIEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9EQVRBKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wsIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX2RzX2dlbV9wb3J0X21vZGlmeShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIC8qIHRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIGluIFBFUiBmbG93IG1vZGUgKi8KKyAgICAvKiBzZXQgRFMgcG9ydCBtYXBwaW5nIGluaXRpYWwgR0VNIDMwMCwgZmluYWwgR0VNIDMyMCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkga2V5ID0gey5wb25fbmkgPSAwLCAuZmxvd19pZCA9IDMwMH07CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBjZmc7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQsIDMyMCk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX3NldF9kc19wZXJfdmxhbl9tYXBwaW5nX21ldGhvZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIC8qIFdoZW4gd29ya2luZyB3aXRoIHBlciBmbG93IG1vZGUgdGhlIHVzZXIgbXVzdCBhZGQgYW4gZW50cnkgZm9yIGVhY2ggVklEIChmbG93KSB0aGlzIHdheSAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleSA9IHsucG9uX25pID0gMCwgLnZsYW5faWQgPSAzMDB9OworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnIGNmZzsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kLCBCQ01PTFRfVkxBTl9UT19GTE9XX01BUFBJTkdfTUVUSE9EX1ZJRCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnLCBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX09VVEVSX1ZJRCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uLCBCQ01PTFRfRFNfVkxBTl9BQ1RJT05fVFJBTlNQQVJFTlQpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9zZW5kX29tY2lfcGFja2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzIHByb3h5OyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7LnBvbl9uaSA9IDAsIC5vbnVfaWQgPSAyfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBidWZmZXI7CisgICAgdWludDhfdCBjcHVfYnVmWzEwMF07CisgICAgYnVmZmVyLmxlbiA9IDQ4OworICAgIGJ1ZmZlci52YWwgPSBjcHVfYnVmOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBrZXkpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIEJDTU9MVF9QQUNLRVRfVFlQRV9PTUNJKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCBCQ01PU19UUlVFKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIG51bWJlcl9vZl9wYWNrZXRzLCAxKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF9zaXplLCA0OCk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBidWZmZXIsIGJ1ZmZlcik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIHJldHVybiBiY21vbHRfcHJveHlfc2VuZCgwLCAmcHJveHkuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX3NlbmRfY3B1X3BhY2tldHNfb3Zlcl9nZW1fcG9ydHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0cyBwcm94eTsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7LnBvbl9uaSA9IDB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX2lkIGdlbV9wb3J0X2lkX2FycmF5WzEwXTsKKyAgICBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgZ2VtX3BvcnRfbGlzdDsKKyAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggYnVmZmVyOworICAgIHVpbnQ4X3QgY3B1X2J1ZlsxMDBdOworICAgIGJ1ZmZlci5sZW4gPSA5NjsKKyAgICBidWZmZXIudmFsID0gY3B1X2J1ZjsKKworICAgIGdlbV9wb3J0X2xpc3QubGVuID0gMTA7CisgICAgZ2VtX3BvcnRfbGlzdC52YWwgPSBnZW1fcG9ydF9pZF9hcnJheTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBrZXkpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVSk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCBCQ01PU19UUlVFKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgZ2VtX3BvcnRfbGlzdCwgZ2VtX3BvcnRfbGlzdCk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgYnVmZmVyKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgcmV0dXJuIGJjbW9sdF9wcm94eV9zZW5kKDAsICZwcm94eS5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fYWRkX21hY19lbnRyeShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIC8qIHRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIGluIHBlciBmbG93IG1vZGUuICovCisgICAgLyogSW4gb3JkZXIgdG8gcGFzcyB0cmFmZmljIHlvdSBtdXN0IGFsc28gYWRkIGFuIGVudHJ5IHRvIElXRiBpbmdyZXNzIHBvcnQgYXMgZGVzY3JpYmVkIGluIF9ncG9uX3NldF9wZXJfdmxhbl9tYXBwaW5nX21ldGhvZCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7LnBvbl9uaSA9IDAsIC5tYWNfYWRkcmVzcy51OCA9IHsweDAwLDB4MDAsMHgwMCwgMHgwMCwgMHgwMCwweDAwfSwgLnZsYW4gPSAzMjB9OworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCwgMzIwKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fZHVtcF9tYWNfdGFibGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBjb25zdCB1aW50MTZfdCBtYXhfbXNnc19wZXJfY2FsbCA9IDEwOworICAgIGNvbnN0IGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAwOworICAgIGNvbnN0IHVpbnQxNl90IHBvbiA9IDA7CisKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQ7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgZmlsdGVyOworICAgIHVpbnQxNl90IGk7CisgICAgdWludDE2X3QgY291bnQgPSAwOworCisgICAgLyogYSBrZXkgb2YgYWxsIEZzIG1lYW5zICJzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmciICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgd2lsZGNhcmRfa2V5ID0KKyAgICAgICAgeyAucG9uX25pID0gcG9uLCAubWFjX2FkZHJlc3MudTggPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfSwgLnZsYW4gPSAweEZGRkYgfTsKKworICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmV0dXJuIHZhbHVlcyAqLworICAgIGVyciA9IGJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3NfcGVyX2NhbGwsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgdGhlIGZpbHRlciBzdHJ1Y3R1cmUgYW5kIGFzayB0byByZWFkIHRoZSBmbG93IElEIC8gc3RhdGljIGZsYWcgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmZpbHRlciwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCB3aWxkY2FyZF9rZXkpOworICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCk7CisgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0KTsKKworICAgIC8qIGZpbHRlciB0byBvbmx5IGluY2x1ZGUgbm9uLXN0YXRpYyBlbnRyaWVzICh5b3UgY291bGQgYWxzbyBmaWx0ZXIgb24gZmxvdyBJRCwgb3Igb21pdCB0aGlzIHRvIGluY2x1ZGUgYWxsKSAqLworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmZpbHRlciwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0LCBCQ01PU19GQUxTRSk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogY2FsbCBnZXQgbXVsdGlwbGUgb2JqZWN0cyBBUEkgZnVuY3Rpb24gKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlLCAmZmlsdGVyLmhkciwgQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkgcmV0dXJuZWQgZXJyb3I6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKGVyciksIGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHByaW50IGVhY2gga2V5L2NvbmZpZyBzdHJ1Y3R1cmUgdGhhdCB3YXMgcmVjZWl2ZWQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1zZ19zZXQtPm51bV9pbnN0YW5jZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgKmNmZyA9IChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyAqKW1zZ19zZXQtPm1zZ1tpXTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgImVudHJ5WyVkXSBNQUM6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorICAgICAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzBdLAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzFdLAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzJdLAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzNdLAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzRdLAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzVdKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJlbnRyeVslZF0gVklEOiAlZFxuIiwgY291bnQsIGNmZy0+a2V5LnZsYW4pOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgImVudHJ5WyVkXSBmbG93IElEOiAlZFxuIiwgY291bnQsIGNmZy0+ZGF0YS5mbG93X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJlbnRyeVslZF0gc3RhdGljOiAlc1xuIiwgY291bnQsIGNmZy0+ZGF0YS5zdGF0ID8gInllcyIgOiAibm8iKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICAvKiB1cGRhdGUgdGhlIGtleSBmb3IgbmV4dCBjYWxsICovCisgICAgICAgIGZpbHRlci5rZXkgPSAqKChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSAqKW1zZ19zZXQtPm5leHRfa2V5KTsKKworICAgIC8qIGtlZXAgY2FsbGluZyB0aGUgZnVuY3Rpb24gdW50aWwgd2UgaGF2ZSByZXRyaWV2ZWQgYWxsIGVudHJpZXMgKi8KKyAgICB9IHdoaWxlIChtc2dfc2V0LT5tb3JlKTsKKworICAgIGJjbW9sdF9tc2dfc2V0X2ZyZWUobXNnX3NldCk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9zZXRfdXNfZmxvd19jb25maWd1cmF0aW9uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkga2V5ID0gey5wb25fbmkgPSAwLCAuZ2VtX3BvcnRfaWQgPSAzMjB9OworICAgIGJjbW9sdF92bGFuX3RhZyB2bGFuX3RhZzsKKworICAgIC8qIHZsYWQgdGFnIHBhcmFtZXRlcnMgZm9yIHRoZSBhZGQgdmxhbiAqLworICAgIHZsYW5fdGFnLnBiaXQgPSA5OworICAgIHZsYW5fdGFnLnZsYW5faWQgPSAzMDA7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQsIDMyMCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBtYWNfbGVhcm5pbmcsIEJDTU9TX0ZBTFNFKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uLCBCQ01PTFRfVVNfVkxBTl9BQ1RJT05fQUREKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnLCB2bGFuX3RhZyk7CisgICAgLyogd2hhdCBpcyB0aGUgdHBpZCBpbmRleCAqLworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCwgMCk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX2NvbmZpZ3VyZV9hbmRfYWN0aXZhdGVfcG9uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgLyogVFJYIGFuZCBQT04gTGluayBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMgKyBQT04gY29udHJvbCBvcGVyYXRpb24gKi8KKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5X25pID0gey5wb25fbmkgPSAwfTsKKyAgICBiY21vbHRfZ3Bvbl9uaV9jZmcgY2ZnX25pOworICAgIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUgb3Blcl9uaTsKKworICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIHNuX2FjcXVpc2l0aW9uID0gey5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFLCAuaW50ZXJ2YWwgPSAxMDAwMCwgLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX05PTkV9OworICAgIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCBkcmlmdF9jb250cm9sID0gey5kcmlmdF9pbnRlcnZhbCA9IDEwMDAsIC5kcmlmdF9saW1pdCA9IDQsIC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCA9IDh9OworICAgIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgYmVyX21vbml0b3IgPSB7LnVzX2Jlcl9pbnRlcnZhbCA9IDEwMDAsIC5zZF90aHJlc2hvbGQgPSA1LCAuc2ZfdGhyZXNob2xkID0gM307CisgICAgYmNtb2x0X2dwb25fdHJ4X2tleSBrZXlfdHJ4ID0gey5wb25fbmkgPSAwfTsKKyAgICBiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZ190cng7CisgICAgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgZGVsaW1pdGVyID0ge307CisKKyAgICAvKiBvdmVyaWRlIG9ubHkgdGhlIHJlbGV2YW50IHBhcmFtZXRlcnMgKi8KKyAgICBkZWxpbWl0ZXIucGF0dGVyblswXSA9IDB4MEI7CisgICAgZGVsaW1pdGVyLnBhdHRlcm5bMV0gPSAweDU5OworICAgIGRlbGltaXRlci5wYXR0ZXJuWzJdID0gMHg4MzsKKyAgICBkZWxpbWl0ZXIuc2l6ZSA9IDM7CisgICAgZGVsaW1pdGVyLndpbmRvd19zaXplID0gMTI0OworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmdfdHJ4LCBncG9uX3RyeCwga2V5X3RyeCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnX3RyeCwgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsIEJDTU9MVF9UUlhfVFlQRV9TT1VSQ0VfUEhPVE9OSUNTKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmdfdHJ4LCBncG9uX3RyeCwgZGVsaW1pdGVyLCBkZWxpbWl0ZXIpOworICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZ190cnguaGRyKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfZXhfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiRXJyb3IgaW4gc2V0IHRyeCAlZCIsIHJjKTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgUE9OICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmdfbmksIGdwb25fbmksIGtleV9uaSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnX25pLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgc25fYWNxdWlzaXRpb24pOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ19uaSwgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgZHJpZnRfY29udHJvbCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnX25pLCBncG9uX25pLCBiZXJfbW9uaXRvciwgYmVyX21vbml0b3IpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ19uaSwgZ3Bvbl9uaSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgMTAwMCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnX25pLCBncG9uX25pLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXksIDApOworICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZ19uaS5oZHIpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXJfbmksIGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleV9uaSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXJfbmksIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1dPUktJTkcpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQoMCwgJm9wZXJfbmkuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGdwb25fYWRkX2FjdGl2YXRlX29udSAoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X2dwb25fbmkgcG9uX25pLCBiY21vbHRfZ3Bvbl9vbnVfaWQgb251X2lkLCBiY21vbHRfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyKQoreworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgb251X2NmZzsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IG9udV9rZXkgPSB7LnBvbl9uaSA9IHBvbl9uaSwgLm9udV9pZCA9IG9udV9pZH07CisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUgb251X29wZXI7CisgICAgYmNtb2x0X2Fycl91OF8xMCBwYXNzd29yZCA9IHsuYXJyID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDl9fTsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgZ2VtX2NmZzsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgZ2VtX2tleSA9IHsucG9uX25pID0gcG9uX25pLCAuZ2VtX3BvcnRfaWQgPSBvbnVfaWR9OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgQkNNT0xUX0NGR19JTklUKCZvbnVfY2ZnLCBncG9uX29udSwgb251X2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmb251X2NmZywgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJm9udV9jZmcsIGdwb25fb251LCBwYXNzd29yZCwgcGFzc3dvcmQpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJm9udV9jZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nLCBCQ01PU19UUlVFKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZvbnVfY2ZnLCBncG9uX29udSwgdXNfZmVjLCBCQ01PU19UUlVFKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZvbnVfY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkLCAyKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZvbnVfY2ZnLCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgNTAwMCk7CisgICAgcmMgPSBiY21vbHRfY2ZnX3NldChkZXYsICZvbnVfY2ZnLmhkcik7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIEJDTU9MVF9DRkdfSU5JVCgmZ2VtX2NmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmZ2VtX2NmZywgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUsIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRSk7CisgICAgcmMgPSBiY21vbHRfY2ZnX3NldChkZXYsICZnZW1fY2ZnLmhkcik7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9udV9vcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X2tleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9udV9vcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkUpOworICAgIHJjID0gYmNtb2x0X29wZXJfc3VibWl0KGRldiwgJm9udV9vcGVyLmhkcik7CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fY29uZmlnX2FuZF9hY3RpdmF0ZV9vbnUgKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlciA9IHsudmVuZG9yX2lkID0gezB4MDAsMHgwMCwweDAwLCAweDAwfSwgLnZlbmRvcl9zcGVjaWZpYyA9IHsweDAwLDB4MDAsMHgwMCwgMHgwMn19OworICAgIHJldHVybiBncG9uX2FkZF9hY3RpdmF0ZV9vbnUoMCwgMCwgMiwgc2VyaWFsX251bWJlcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZXBvbl9nZXRfYWxsX2xpbmtfYWxhcm1zKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBjb25zdCB1aW50MTZfdCBtYXhfbXNnc19wZXJfY2FsbCA9IDEwOworICAgIGNvbnN0IGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAwOworICAgIGNvbnN0IHVpbnQxNl90IHBvbiA9IDA7CisgICAgLyogY29uZmlndXJlIGZpbHRlciB0byBzZWxlY3Qgb25seSBsaW5rcyB3aGljaCBkbyBOT1QgaGF2ZSBhbGwgYWxhcm1zIG9mZiAqLworICAgIGNvbnN0IGJjbW9sdF9maWx0ZXJfZmxhZ3MgZmxhZ3MgPSBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT047CisgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZV9maWx0ZXIgPQorICAgICAgICB7CisgICAgICAgICAgICAuaW52YWxpZF9tcGNwX3JlcG9ydF9yZWNlaXZlZCA9IEJDTU9MVF9TVEFUVVNfT0ZGLAorICAgICAgICAgICAgLmtleV9leGNoYW5nZV9mYWlsdXJlID0gQkNNT0xUX1NUQVRVU19PRkYsCisgICAgICAgICAgICAubXBjcF9yZXBvcnRfdGltZW91dCA9IEJDTU9MVF9TVEFUVVNfT0ZGLAorICAgICAgICAgICAgLm9hbV9rZWVwYWxpdmVfdGltZW91dCA9IEJDTU9MVF9TVEFUVVNfT0ZGLAorICAgICAgICB9OworCisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldDsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBmaWx0ZXI7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgd2lsZGNhcmRfa2V5OworICAgIHVpbnQxNl90IGk7CisKKyAgICAvKiByZXRyaWV2ZSB0aGUgRVBPTiBOSSBNQUMgYWRkcmVzcyAqLworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBwb25fY2ZnOworICAgIGJjbW9sdF9lcG9uX25pX2tleSBwb25fa2V5ID0geyAuZXBvbl9uaSA9IHBvbiB9OworCisgICAgQkNNT0xUX0NGR19JTklUKCZwb25fY2ZnLCBlcG9uX25pLCBwb25fa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZwb25fY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcyk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmcG9uX2NmZy5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJGYWlsZWQgdG8gcmV0cmlldmUgRVBPTiBOSSBNQUMgYWRkcmVzcyFcbiIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIGEga2V5IHdpdGggdGhlIEVQT04gTkkgTUFDIGFkZHJlc3MgbWVhbnMgInN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyIgKi8KKyAgICB3aWxkY2FyZF9rZXkuZXBvbl9uaSA9IHBvbjsKKyAgICB3aWxkY2FyZF9rZXkubWFjX2FkZHJlc3MgPSBwb25fY2ZnLmRhdGEubWFjX2FkZHJlc3M7CisKKyAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZXMgKi8KKyAgICBlcnIgPSBiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzX3Blcl9jYWxsLCAmbXNnX3NldCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgcmV0dXJuIVxuIik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgZmlsdGVyIHN0cnVjdHVyZSBhbmQgYXNrIHRvIHJlYWQgdGhlIGFsYXJtIHN0YXRlICovCisgICAgQkNNT0xUX0NGR19JTklUKCZmaWx0ZXIsIGVwb25fbGluaywgd2lsZGNhcmRfa2V5KTsKKyAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGFsYXJtX3N0YXRlKTsKKworICAgIC8qIGFwcGx5IGZpbHRlciAqLworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmZpbHRlciwgZXBvbl9saW5rLCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGVfZmlsdGVyKTsKKworICAgIGRvCisgICAgeworICAgICAgICAvKiBjYWxsIGdldCBtdWx0aXBsZSBvYmplY3RzIEFQSSBmdW5jdGlvbiAqLworICAgICAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZmaWx0ZXIuaGRyLCBmbGFncywgbXNnX3NldCk7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIHJldHVybmVkIGVycm9yOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcmludCBlYWNoIGtleS9jb25maWcgdGhhdCB3YXMgcmVjZWl2ZWQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1zZ19zZXQtPm51bV9pbnN0YW5jZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgKmNmZyA9IChiY21vbHRfZXBvbl9saW5rX2NmZyopbXNnX3NldC0+bXNnW2ldOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkxpbms6IE5JICV1LCBNQUMgJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT5rZXkuZXBvbl9uaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT5rZXkubWFjX2FkZHJlc3MudThbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT5rZXkubWFjX2FkZHJlc3MudThbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFs1XSk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXHRJbnZhbGlkIE1QQ1AgUmVwb3J0IFJlY2VpdmVkOiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+ZGF0YS5hbGFybV9zdGF0ZS5pbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJcdEtleSBFeGNoYW5nZSBmYWlsdXJlOiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+ZGF0YS5hbGFybV9zdGF0ZS5rZXlfZXhjaGFuZ2VfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXHRNUENQIFJlcG9ydCBUaW1lb3V0OiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+ZGF0YS5hbGFybV9zdGF0ZS5tcGNwX3JlcG9ydF90aW1lb3V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJcdE9BTSBLZWVwYWxpdmUgVGltZW91dDogJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPmRhdGEuYWxhcm1fc3RhdGUub2FtX2tlZXBhbGl2ZV90aW1lb3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVwZGF0ZSB0aGUga2V5IGZvciBuZXh0IGNhbGwgKi8KKyAgICAgICAgZmlsdGVyLmtleSA9ICooKGJjbW9sdF9lcG9uX2xpbmtfa2V5Kiltc2dfc2V0LT5uZXh0X2tleSk7CisKKyAgICAgICAgLyoga2VlcCBjYWxsaW5nIHRoZSBmdW5jdGlvbiB1bnRpbCB3ZSBoYXZlIHJldHJpZXZlZCBhbGwgZW50cmllcyAqLworICAgIH0gd2hpbGUgKG1zZ19zZXQtPm1vcmUpOworCisgICAgYmNtb2x0X21zZ19zZXRfZnJlZShtc2dfc2V0KTsKKyAgICByZXR1cm4gZXJyOworfQorI2VuZGlmCisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfZXhfY2xpX2luaXQodm9pZCkKK3sKKyAgICBiY21jbGlfZW50cnkgKnBhcmVudCA9IGJjbWNsaV9kaXJfZmluZChOVUxMLCAidXNlciIpOworICAgIGJjbWNsaV9lbnRyeSAqZGlyOworCisjaWZkZWYgRU5BQkxFX0xPRworICAgIHVzZXJfYXBwbF9leF9sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcigidXNlcl9hcHBsX2V4IiwgREVWX0xPR19MRVZFTF9ERUJVRywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworI2VuZGlmCisKKyAgICBkaXIgPSBiY21jbGlfZGlyX2FkZChwYXJlbnQsICJleGFtcGxlIiwgIlVzZXIgYXBwbGljYXRpb24iLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisjaWZkZWYgRU5BQkxFX0xPRworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2RldmljZV9pbml0IiwgImdwb24gZGV2aWNlIGluaXQiLCB1c2VyX2FwcGxfZ3Bvbl9kZXZpY2VfaW5pdCk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJpbmRpY2F0aW9uX2hhbmRsZXIiLCAiaW5kaWNhdGlvbiBoYW5kbGVyIiwgdXNlcl9hcHBsX2luZGljYXRpb25faGFuZGxlcik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJsb2dfZW50cnlfc2V0IiwgImxvZyBlbnJ0eSBzZXQiLCB1c2VyX2FwcGxfbG9nX2VudHJ5X3NldCk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJyZWRpcmVjdF9kZXZpY2VfbG9nZ2VyIiwgInJlZGlyZWN0IGRldmljZSBsb2dnZXIiLCB1c2VyX2FwcGxfcmVkaXJlY3RfZGV2aWNlX2xvZ2dlcik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX25pX2Rpc2FibGVfaW5kaWNhdGlvbiIsICJncG9uX25pX2Rpc2FibGVfaW5kaWNhdGlvbiIsIHVzZXJfYXBwbF9ncG9uX25pX2Rpc2FibGVfaW5kaWNhdGlvbik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX25pX2dldF9zdGF0cyIsICJncG9uX25pX2dldF9zdGF0cyIsIHVzZXJfYXBwbF9ncG9uX25pX2dldF9zdGF0cyk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3N0YXJ0X3NuX2FjcXVpc2l0aW9uIiwgImdwb24gc3RhcnQgc24gYWNxdWlzaXRpb24iLCB1c2VyX2FwcGxfZ3Bvbl9zdGFydF9zbl9hY3F1aXNpdGlvbik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NldF9tYWNfdGFibGVfY29uZmlnIiwgImdwb24gc2V0IG1hYyB0YWJsZSBjb25maWciLCB1c2VyX2FwcGxfZ3Bvbl9zZXRfbWFjX3RhYmxlX2NvbmZpZyk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NldF9pbnRlcndvcmtpbmdfbW9kZSIsICJncG9uIHNldCBpbnRlcndvcmtpbmcgbW9kZSIsIHVzZXJfYXBwbF9ncG9uX3NldF9pbnRlcndvcmtpbmdfbW9kZSk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NldF90cngiLCAiZ3BvbiBzZXQgdHJ4IiwgdXNlcl9hcHBsX2dwb25fc2V0X3RyeCk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2FjdGl2YXRlX3BvbiIsICJncG9uIGFjdGl2YXRlIHBvbiIsIHVzZXJfYXBwbF9ncG9uX2FjdGl2YXRlX3Bvbik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX29udV9jb25maWciLCAiZ3BvbiBvbnUgY29uZmlnIiwgdXNlcl9hcHBsX2dwb25fb251X2NvbmZpZyk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2FjdGl2YXRlX29udSIsICJncG9uIGFjdGl2YXRlIG9udSIsIHVzZXJfYXBwbF9ncG9uX2FjdGl2YXRlX29udSk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2FsbG9jX2lkX2NvbmZpZyIsICJncG9uIGFsbG9jIGNvbmZpZyIsIHVzZXJfYXBwbF9ncG9uX2FsbG9jX2lkX2NvbmZpZyk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2dlbV9wb3J0X2NvbmZpZyIsICJncG9uIGdlbSBwb3J0IGNvbmZpZyIsIHVzZXJfYXBwbF9ncG9uX2dlbV9wb3J0X2NvbmZpZyk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2FkZF9tYWNfZW50cnkiLCAiZ3BvbiBhZGQgbWFjIGVudHJ5IiwgdXNlcl9hcHBsX2dwb25fYWRkX21hY19lbnRyeSk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2R1bXBfbWFjX3RhYmxlIiwgInByaW50IGVudGlyZSBHUE9OIE1BQyB0YWJsZSIsIHVzZXJfYXBwbF9ncG9uX2R1bXBfbWFjX3RhYmxlKTsKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgImdwb25fZHNfZ2VtX3BvcnRfbW9kaWZ5IiwgIiBncG9uIGRzIGdlbSBwb3J0IG1vZGlmeSIsIHVzZXJfYXBwbF9ncG9uX2RzX2dlbV9wb3J0X21vZGlmeSk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NldF9wZXJfdmxhbl9tYXBwaW5nX21ldGhvZCIsICJncG9uIHNldCBwZXIgdmxhbiBtYXBwaW5nIG1ldGhvZCIsIHVzZXJfYXBwbF9ncG9uX3NldF9kc19wZXJfdmxhbl9tYXBwaW5nX21ldGhvZCk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NldF91c19mbG93X2NvbmZpZ3VyYXRpb24iLCAiZ3BvbiBzZXQgdXMgZmxvdyBjb25maWd1cmF0aW9uIiwgdXNlcl9hcHBsX2dwb25fc2V0X3VzX2Zsb3dfY29uZmlndXJhdGlvbik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NlbmRfb21jaV9wYWNrZXQiLCAiYXBwbCBncG9uIHNlbmQgb21jaSBwYWNrZXQiLCB1c2VyX2FwcGxfZ3Bvbl9zZW5kX29tY2lfcGFja2V0KTsKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgImdwb25fc2VuZF9jcHVfcGFja2V0c19vdmVyX2dlbV9wb3J0cyIsICJncG9uIHNlbmQgY3B1IHBhY2tldHMgb3ZlciBnZW0gcG9ydHMiLCB1c2VyX2FwcGxfZ3Bvbl9zZW5kX2NwdV9wYWNrZXRzX292ZXJfZ2VtX3BvcnRzKTsKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgImdwb25fY29uZmlndXJlX2FuZF9hY3RpdmF0ZV9wb24iLCAiY29uZmlndXJlIGFuZCBhY3RpdmF0ZSBwb24iLCB1c2VyX2FwcGxfZ3Bvbl9jb25maWd1cmVfYW5kX2FjdGl2YXRlX3Bvbik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2NvbmZpZ19hbmRfYWN0aXZhdGVfb251IiwgImNvbmZpZyBhbmQgYWN0aXZhdGUgb251IiwgdXNlcl9hcHBsX2dwb25fY29uZmlnX2FuZF9hY3RpdmF0ZV9vbnUpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZXBvbl9nZXRfYWxsX2xpbmtfYWxhcm1zIiwgInJldHJpZXZlIGFsbCBsaW5rIGFsYXJtcyIsIHVzZXJfYXBwbF9lcG9uX2dldF9hbGxfbGlua19hbGFybXMpOworI2VuZGlmCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9leF9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9leF9jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjVlNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2V4X2NsaS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfRVhfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX0VYX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2V4X2NsaV9pbml0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOGQ0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5jCkBAIC0wLDAgKzEsNzY4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzLmgiCisjaW5jbHVkZSA8YmNtb2x0X2Rldl9zZWxlY3Rvci5oPgorCitzdGF0aWMgYmNtY2xpX2VudHJ5ICpncG9uX3V0aWxzX2NsaV9kaXI7CitzdGF0aWMgYmNtY2xpX2VudHJ5ICpncG9uX3V0aWxzX2NsaV90b3BfZGlyOworc3RhdGljIGJjbW9zX2Jvb2wgZ3Bvbl91dGlsc19pc19yZWdpc3RlcmVkOworCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2NyZWF0ZShiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCisjZGVmaW5lIE1BWF9HRU1fUE9SVFNfRk9SX1NFTkQgICAgIDY0CisjZGVmaW5lIE1BWF9PTlVTX0ZPUl9TRU5EICAgICAgICAgIDY0CisjZGVmaW5lIE1BWF9QQUNLRVRfU0laRSAgICAgICAgICAgIDIwNDgKKwordHlwZWRlZiBlbnVtCit7CisgICAgR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX0JZVEVfQ1lDTEUsCisgICAgR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX1dPUkRfQ1lDTEUsCisgICAgR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX0NPTlNUCit9IGdlbmVyYXRlZF9wYWNrZXRfcGF0dGVybjsKKwordHlwZWRlZiBlbnVtCit7CisgICAgUE9OX01PREVfR1BPTiwKKyAgICBQT05fTU9ERV9YR1BPTiwKKyAgICBQT05fTU9ERV9JTlZBTElECit9IHBvbl9tb2RlOworCitzdGF0aWMgdWludDhfdCBzYXZlZF9wYWNrZXRbTUFYX1BBQ0tFVF9TSVpFXTsKK3N0YXRpYyBiY21vbHRfcGFja2V0X3R5cGUgc2F2ZWRfcGFja2V0X3R5cGU7CitzdGF0aWMgYmNtb3NfYm9vbCBzYXZlZF9wYWNrZXRfY2FsY19jcmM7CitzdGF0aWMgdWludDE2X3Qgc2F2ZWRfcGFja2V0X2xlbiA9IDA7CisKK3N0YXRpYyB2b2lkIGdwb25fdXRpbHNfY2xpX2Rpcl9jbGlfZGVzdHJveSh2b2lkKQoreworICAgIGlmIChncG9uX3V0aWxzX2NsaV9kaXIpCisgICAgeworICAgICAgICBiY21jbGlfdG9rZW5fZGVzdHJveShncG9uX3V0aWxzX2NsaV9kaXIpOworICAgICAgICBncG9uX3V0aWxzX2NsaV9kaXIgPSBOVUxMOworICAgIH0KK30KKworLyogQ3VycmVudCBkZXZpY2UgY2hhbmdlIGluZGljYXRpb24gKi8KK3N0YXRpYyB2b2lkIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlsc19kZXZpY2VfY2hhbmdlX2luZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X2RldmlkIGRldikKK3sKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisgICAgYmNtb3NfZXJybm8gZXJyID0gYmNtb2x0X3N5c3RlbV9tb2RlX2dldChkZXYsICZzeXN0ZW1fbW9kZSk7CisKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3IgZGV2aWNlIElkXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fMTZfWCB8fAorICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YIHx8CisgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1ggfHwKKyAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWCB8fAorICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YIHx8CisgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HIHx8CisgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzJfWF8xMF9HKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkJ1aWxkaW5nIGdwb25fdXRpbHMgQ0xJIGZvciBkZXZpY2UgJWRcbiIsIGRldik7CisKKyAgICAgICAgZXJyID0gYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2NyZWF0ZShncG9uX3V0aWxzX2NsaV90b3BfZGlyKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkVycm9yIGJ1aWxkaW5nIGdwb25fdXRpbHMgQ0xJXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBncG9uX3V0aWxzX2NsaV9kaXJfY2xpX2Rlc3Ryb3koKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgcG9uX21vZGUgcG9uX21vZGVfZ2V0KGJjbW9sdF9wb25fbmkgcG9uX2lkKQoreworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZTsKKyAgICBiY21vc19lcnJubyBlcnIgPSBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmc3lzdGVtX21vZGUpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBQT05fTU9ERV9JTlZBTElEOworICAgIH0KKworICAgIGlmIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl84X1hHUE9OXzRfWF9DT0VYSVNURU5DRSkKKyAgICB7CisgICAgICAgIC8qIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSA4eCBHUE9OIC8gNHggWEdQT04gY28tZXhpc3RlbmNlIG1vZGUgKi8KKyAgICAgICAgcmV0dXJuIHBvbl9pZCA8IDggPyBQT05fTU9ERV9YR1BPTiA6IFBPTl9NT0RFX0dQT047CisgICAgfQorICAgIGVsc2UgaWYgKGJjbW9sdF9vYmpfdGFnX3ZhbGlkX2Zvcl9zeXN0ZW1fbW9kZShzeXN0ZW1fbW9kZSwgQkNNT0xUX09CSl9UQUdfR1BPTikpCisgICAgeworICAgICAgICByZXR1cm4gUE9OX01PREVfR1BPTjsKKyAgICB9CisgICAgZWxzZSBpZiAoYmNtb2x0X29ial90YWdfdmFsaWRfZm9yX3N5c3RlbV9tb2RlKHN5c3RlbV9tb2RlLCBCQ01PTFRfT0JKX1RBR19YR1BPTikpCisgICAgeworICAgICAgICByZXR1cm4gUE9OX01PREVfWEdQT047CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBQT05fTU9ERV9JTlZBTElEOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJ1aWxkX3BhY2tldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X3BhY2tldF90eXBlIHR5cGUpCit7CisgICAgdWludDE2X3QgaTsKKyAgICBiY21vc19ib29sIGNhbGNfY3JjID0gKGJjbW9zX2Jvb2wpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2FsY19jcmMiKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50MTZfdCBwYWNrZXRfc2l6ZSA9ICh1aW50MTZfdCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYWNrZXRfc2l6ZSIpLT52YWx1ZS51bnVtYmVyOworICAgIGdlbmVyYXRlZF9wYWNrZXRfcGF0dGVybiBwYXR0ZXJuID0gCisgICAgICAgIChnZW5lcmF0ZWRfcGFja2V0X3BhdHRlcm4pYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGF0dGVybiIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQ4X3QgY29uc3RfdmFsdWUgPSAodWludDhfdCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25zdF92YWx1ZSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQxNl90IGRhdGFfb2Zmc2V0OworICAgIAorICAgIC8qIHNhdmUgcGFja2V0IHR5cGUgLyBzaXplIC8gQ1JDIGZsYWcgKi8KKyAgICBzYXZlZF9wYWNrZXRfdHlwZSA9IHR5cGU7CisgICAgc2F2ZWRfcGFja2V0X2xlbiA9IHBhY2tldF9zaXplOworICAgIHNhdmVkX3BhY2tldF9jYWxjX2NyYyA9IGNhbGNfY3JjOworCisgICAgaWYgKHR5cGUgPT0gQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVSkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIGV0aF9kYSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV0aF9kYSIpLT52YWx1ZS5tYWM7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIGV0aF9zYSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV0aF9zYSIpLT52YWx1ZS5tYWM7CisKKyAgICAgICAgLyogY29weSBkZXN0aW5hdGlvbiBNQUMgKi8KKyAgICAgICAgbWVtY3B5KHNhdmVkX3BhY2tldCwgJmV0aF9kYSwgNik7CisKKyAgICAgICAgLyogY29weSBzb3VyY2UgTUFDICovCisgICAgICAgIG1lbWNweSgmc2F2ZWRfcGFja2V0WzZdLCAmZXRoX3NhLCA2KTsKKworICAgICAgICAvKiB3cml0ZSBFdGhlclR5cGUgb2YgMDAwMCAqLworICAgICAgICBtZW1zZXQoJnNhdmVkX3BhY2tldFsxMl0sIDAsIDIpOworCisgICAgICAgIC8qIGRhdGEgc3RhcnRzIGFmdGVyIEV0aGVyVHlwZSAqLworICAgICAgICBkYXRhX29mZnNldCA9IDE0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBmaWxsIHRoZSBlbnRpcmUgcGFja2V0ICovCisgICAgICAgIGRhdGFfb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgICAvKiBmaWxsIHRoZSByZXN0IG9mIHRoZSBidWZmZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBkYXRhIHBhdHRlcm4gKi8KKyAgICBzd2l0Y2ggKHBhdHRlcm4pCisgICAgeworICAgIGNhc2UgR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX0JZVEVfQ1lDTEU6CisgICAgICAgIGNvbnN0X3ZhbHVlID0gMDsKKyAgICAgICAgZm9yIChpID0gZGF0YV9vZmZzZXQ7IGkgPCBwYWNrZXRfc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzYXZlZF9wYWNrZXRbaV0gPSBjb25zdF92YWx1ZSsrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX1dPUkRfQ1lDTEU6CisgICAgICAgIC8qIGZpcnN0IDQgYnl0ZXMgPSAwMDAwMDAwMCwgbmV4dCA0ID0gMTExMTExMTEsIG5leHQgNCA9IDIyMjIyMjIyLCBldGMgKi8KKyAgICAgICAgY29uc3RfdmFsdWUgPSAwOworICAgICAgICBmb3IgKGkgPSBkYXRhX29mZnNldDsgaSA8IHBhY2tldF9zaXplOyBpICs9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGo7CisgICAgICAgICAgICBmb3IgKGogPSBpOyBqIDwgaSArIDQgJiYgaiA8IHBhY2tldF9zaXplOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2F2ZWRfcGFja2V0W2pdID0gY29uc3RfdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdF92YWx1ZSA9IChjb25zdF92YWx1ZSA9PSAweEZGKSA/IDAgOiBjb25zdF92YWx1ZSArIDB4MTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHRU5FUkFURURfUEFDS0VUX1BBVFRFUk5fQ09OU1Q6CisgICAgICAgIGZvciAoaSA9IGRhdGFfb2Zmc2V0OyBpIDwgcGFja2V0X3NpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc2F2ZWRfcGFja2V0W2ldID0gY29uc3RfdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIltFcnJvcl0gSW52YWxpZCBwYXR0ZXJuOiAldVxuIiwgcGF0dGVybik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYnVpbGRfY3B1X3BhY2tldF9jYihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBidWlsZF9wYWNrZXQoc2Vzc2lvbiwgQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVSk7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkNQVSBwYWNrZXQgYnVmZmVyIHNhdmVkIHN1Y2Nlc3NmdWxseVxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJbRXJyb3JdIHNhdmluZyBDUFUgcGFja2V0IGJ1ZmZlcjogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYnVpbGRfb21jaV9wYWNrZXRfY2IoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gYnVpbGRfcGFja2V0KHNlc3Npb24sIEJDTU9MVF9QQUNLRVRfVFlQRV9PTUNJKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiT01DSSBwYWNrZXQgYnVmZmVyIHNhdmVkIHN1Y2Nlc3NmdWxseVxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJbRXJyb3JdIHNhdmluZyBPTUNJIHBhY2tldCBidWZmZXI6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHNlbmRfcGFja2V0X3RvX2dwb25fZ2VtX2xpc3QoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIHVpbnQxNl90IGdlbV9jb3VudCwgYmNtb2x0X2dwb25fZ2VtX2lkICpnZW1zKQoreworICAgIHVpbnQxNl90IGNvdW50ID0gMTsKKyAgICB1aW50MTZfdCBpOworICAgIHVpbnQxNl90IGdlbV9pZHg7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2UiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vbHRfcG9uX25pIHBvbl9uaSA9IChiY21vbHRfcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9sdF9ncG9uX25pX2tleSBwb25fbmlfa2V5ID0geyAucG9uX25pID0gcG9uX25pIH07CisgICAgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IGdlbV9wb3J0X2xpc3Q7CisgICAgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHMgcHJveHk7CisgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlciA9IHsgLmxlbiA9IHNhdmVkX3BhY2tldF9sZW4sIC52YWwgPSBzYXZlZF9wYWNrZXQgfTsKKworICAgIGlmIChzYXZlZF9wYWNrZXRfbGVuID09IDApCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiW0Vycm9yXSB5b3UgbXVzdCBidWlsZC9zYXZlIGEgcGFja2V0IGJlZm9yZSB5b3UgY2FuIHNlbmQgaXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb3VudCIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjb3VudCA9ICh1aW50MTZfdClwYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICBzZXNzaW9uLAorICAgICAgICAiU2VuZGluZyAldSBwcm94eSBwYWNrZXQlcyB0byAldSBHRU0gcG9ydCVzLi4uXG4iLAorICAgICAgICBjb3VudCwKKyAgICAgICAgY291bnQgPT0gMSA/ICIiIDogInMiLAorICAgICAgICBnZW1fY291bnQsCisgICAgICAgIGdlbV9jb3VudCA9PSAxID8gIiIgOiAicyIpOworCisgICAgLyogYnVpbGQgdGhlIHByb3h5IEFQSSBtZXNzYWdlLCBleGNlcHQgdGhlIEdFTSBwb3J0IGxpc3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBwb25fbmlfa2V5KTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIHNhdmVkX3BhY2tldF90eXBlKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgY2FsY19jcmMsIHNhdmVkX3BhY2tldF9jYWxjX2NyYyk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgYnVmZmVyKTsKKworICAgIC8qIGNhbGwgdGhlIHByb3h5IEFQSSA8Y291bnQ+IHRpbWVzICovCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgICAvKiB3ZSBtYXkgbmVlZCB0byBzcGxpdCB0aGlzIHVwIGludG8gbXVsdGlwbGUgQVBJIGNhbGxzIChvbmx5IDE2IEdFTSBwb3J0cyBhcmUgYWxsb3dlZCBwZXIgcHJveHkgQVBJKSAqLworICAgICAgICBmb3IgKGdlbV9pZHggPSAwOyBnZW1faWR4IDwgZ2VtX2NvdW50OyBnZW1faWR4ICs9IDE2KQorICAgICAgICB7CisgICAgICAgICAgICBnZW1fcG9ydF9saXN0LmxlbiA9IE1JTigxNiwgZ2VtX2NvdW50IC0gZ2VtX2lkeCk7CisgICAgICAgICAgICBnZW1fcG9ydF9saXN0LnZhbCA9ICZnZW1zW2dlbV9pZHhdOworICAgICAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGdlbV9wb3J0X2xpc3QsIGdlbV9wb3J0X2xpc3QpOworCisgICAgICAgICAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2UsICZwcm94eS5oZHIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAiW0Vycm9yXSBwcm94eSBzZW5kOiBwYWNrZXQgaW5kZXggJXUgR0VNIGluZGV4ICV1OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgZ2VtX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIldSBwcm94eSBwYWNrZXQlcyBzZW50IHN1Y2Nlc3NmdWxseSFcbiIsIGNvdW50LCBjb3VudCA9PSAxID8gIiIgOiAicyIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gc2VuZF9wYWNrZXRfdG9feGdwb25fZ2VtX2xpc3QoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIHVpbnQxNl90IGdlbV9jb3VudCwgYmNtb2x0X3hncG9uX2dlbV9pZCAqZ2VtcykKK3sKKyAgICB1aW50MTZfdCBjb3VudCA9IDE7CisgICAgdWludDE2X3QgaTsKKyAgICB1aW50MTZfdCBnZW1faWR4OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm07CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb2x0X3Bvbl9uaSBwb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IHBvbl9uaV9rZXkgPSB7IC5wb25fbmkgPSBwb25fbmkgfTsKKyAgICBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IGdlbV9wb3J0X2xpc3Q7CisgICAgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzIHByb3h5OworICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBidWZmZXIgPSB7IC5sZW4gPSBzYXZlZF9wYWNrZXRfbGVuLCAudmFsID0gc2F2ZWRfcGFja2V0IH07CisKKyAgICBpZiAoc2F2ZWRfcGFja2V0X2xlbiA9PSAwKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIltFcnJvcl0geW91IG11c3QgYnVpbGQvc2F2ZSBhIHBhY2tldCBiZWZvcmUgeW91IGNhbiBzZW5kIGl0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY291bnQiKTsKKyAgICBpZiAocGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY291bnQgPSAodWludDE2X3QpcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgIlNlbmRpbmcgJXUgcHJveHkgcGFja2V0JXMgdG8gJXUgR0VNIHBvcnQlcy4uLlxuIiwKKyAgICAgICAgY291bnQsCisgICAgICAgIGNvdW50ID09IDEgPyAiIiA6ICJzIiwKKyAgICAgICAgZ2VtX2NvdW50LAorICAgICAgICBnZW1fY291bnQgPT0gMSA/ICIiIDogInMiKTsKKworICAgIC8qIGJ1aWxkIHRoZSBwcm94eSBBUEkgbWVzc2FnZSwgZXhjZXB0IHRoZSBHRU0gcG9ydCBsaXN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIHBvbl9uaV9rZXkpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIHNhdmVkX3BhY2tldF90eXBlKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCBzYXZlZF9wYWNrZXRfY2FsY19jcmMpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgYnVmZmVyLCBidWZmZXIpOworCisgICAgLyogY2FsbCB0aGUgcHJveHkgQVBJIDxjb3VudD4gdGltZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIC8qIHdlIG1heSBuZWVkIHRvIHNwbGl0IHRoaXMgdXAgaW50byBtdWx0aXBsZSBBUEkgY2FsbHMgKG9ubHkgMTYgR0VNIHBvcnRzIGFyZSBhbGxvd2VkIHBlciBwcm94eSBBUEkpICovCisgICAgICAgIGZvciAoZ2VtX2lkeCA9IDA7IGdlbV9pZHggPCBnZW1fY291bnQ7IGdlbV9pZHggKz0gMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdlbV9wb3J0X2xpc3QubGVuID0gTUlOKDE2LCBnZW1fY291bnQgLSBnZW1faWR4KTsKKyAgICAgICAgICAgIGdlbV9wb3J0X2xpc3QudmFsID0gJmdlbXNbZ2VtX2lkeF07CisgICAgICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGdlbV9wb3J0X2xpc3QsIGdlbV9wb3J0X2xpc3QpOworCisgICAgICAgICAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2UsICZwcm94eS5oZHIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAiW0Vycm9yXSBwcm94eSBzZW5kOiBwYWNrZXQgaW5kZXggJXUgR0VNIGluZGV4ICV1OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgZ2VtX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIldSBwcm94eSBwYWNrZXQlcyBzZW50IHN1Y2Nlc3NmdWxseSFcbiIsIGNvdW50LCBjb3VudCA9PSAxID8gIiIgOiAicyIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gc2VuZF90b19nZW1fY2IoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpnZW1fcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbSIpOworICAgIGJjbW9sdF9wb25fbmkgcG9uX2lkID0gKGJjbW9sdF9wb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDE2X3QgaTsKKyAgICBwb25fbW9kZSBtb2RlID0gcG9uX21vZGVfZ2V0KHBvbl9pZCk7CisKKyAgICBpZiAobW9kZSA9PSBQT05fTU9ERV9HUE9OKQorICAgIHsKKyAgICAgICAgc3RhdGljIGJjbW9sdF9ncG9uX2dlbV9pZCBnZW1faWRfYnVmW01BWF9HRU1fUE9SVFNfRk9SX1NFTkRdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VtX3Bhcm0tPmFycmF5X3NpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZ2VtX2lkX2J1ZltpXSA9IChiY21vbHRfZ3Bvbl9nZW1faWQpZ2VtX3Bhcm0tPnZhbHVlc1tpXS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZW5kX3BhY2tldF90b19ncG9uX2dlbV9saXN0KHNlc3Npb24sICh1aW50MTZfdClnZW1fcGFybS0+YXJyYXlfc2l6ZSwgZ2VtX2lkX2J1Zik7CisgICAgfSAKKyAgICBlbHNlIGlmIChtb2RlID09IFBPTl9NT0RFX1hHUE9OKQorICAgIHsKKyAgICAgICAgc3RhdGljIGJjbW9sdF94Z3Bvbl9nZW1faWQgZ2VtX2lkX2J1ZltNQVhfR0VNX1BPUlRTX0ZPUl9TRU5EXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlbV9wYXJtLT5hcnJheV9zaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGdlbV9pZF9idWZbaV0gPSAoYmNtb2x0X3hncG9uX2dlbV9pZClnZW1fcGFybS0+dmFsdWVzW2ldLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbmRfcGFja2V0X3RvX3hncG9uX2dlbV9saXN0KHNlc3Npb24sICh1aW50MTZfdClnZW1fcGFybS0+YXJyYXlfc2l6ZSwgZ2VtX2lkX2J1Zik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJbRXJyb3JdIEludmFsaWQgc3lzdGVtIG1vZGVcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBzZW5kX3BhY2tldF90b19ncG9uX29udV9saXN0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCB1aW50MTZfdCBvbnVfY291bnQsIGJjbW9sdF9ncG9uX29udV9pZCAqb251cykKK3sKKyAgICB1aW50MTZfdCBjb3VudCA9IDE7CisgICAgdWludDE2X3QgaTsKKyAgICB1aW50MTZfdCBvbnVfaWR4OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm07CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb2x0X3Bvbl9uaSBwb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKworICAgIGlmIChzYXZlZF9wYWNrZXRfbGVuID09IDApCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiW0Vycm9yXSB5b3UgbXVzdCBidWlsZC9zYXZlIGEgcGFja2V0IGJlZm9yZSB5b3UgY2FuIHNlbmQgaXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb3VudCIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjb3VudCA9ICh1aW50MTZfdClwYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICBzZXNzaW9uLAorICAgICAgICAiU2VuZGluZyAldSBwcm94eSBwYWNrZXQlcyB0byAldSBPTlUlcy4uLlxuIiwKKyAgICAgICAgY291bnQsCisgICAgICAgIGNvdW50ID09IDEgPyAiIiA6ICJzIiwKKyAgICAgICAgb251X2NvdW50LAorICAgICAgICBvbnVfY291bnQgPT0gMSA/ICIiIDogInMiKTsKKworICAgIC8qIGNhbGwgdGhlIHByb3h5IEFQSSAocG90ZW50aWFsbHkgc2V2ZXJhbCB0aW1lcykgZm9yIGVhY2ggT05VICovCisgICAgZm9yIChvbnVfaWR4ID0gMDsgb251X2lkeCA8IG9udV9jb3VudDsgb251X2lkeCsrKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2tleSBvbnVfa2V5ID0geyAucG9uX25pID0gcG9uX25pLCAub251X2lkID0gb251c1tvbnVfaWR4XSB9OworICAgICAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggYnVmZmVyID0geyAudmFsID0gc2F2ZWRfcGFja2V0IH07CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cyBwcm94eTsKKyAgICAgICAgdWludDE2X3QgcGFja2V0c19wZXJfcHJveHk7CisKKyAgICAgICAgLyogYnVpbGQgdGhlIHByb3h5IEFQSSBtZXNzYWdlLCBleGNlcHQgdGhlIGJ1ZmZlci9udW1iZXIgb2YgcGFja2V0cyAqLworICAgICAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgb251X2tleSk7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIHNhdmVkX3BhY2tldF90eXBlKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgc2F2ZWRfcGFja2V0X2NhbGNfY3JjKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfc2l6ZSwgc2F2ZWRfcGFja2V0X2xlbik7CisKKyAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3ZSBjYW4gZml0IHBlciBpbnZvY2F0aW9uIG9mIHRoZSBwcm94eSBBUEkgKi8KKyAgICAgICAgcGFja2V0c19wZXJfcHJveHkgPSBNSU4oY291bnQsIDIwNDggLyBzYXZlZF9wYWNrZXRfbGVuKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBudW1iZXJfb2ZfcGFja2V0cywgcGFja2V0c19wZXJfcHJveHkpOworCisgICAgICAgIC8qIHByZXBhcmUgdGhlIGJ1ZmZlciBkYXRhIHdpdGggc2V2ZXJhbCBjb3BpZXMgb2YgdGhlIHNhbWUgcGFja2V0IGluIGEgcm93ICovCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBwYWNrZXRzX3Blcl9wcm94eTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkoJnNhdmVkX3BhY2tldFtpICogc2F2ZWRfcGFja2V0X2xlbl0sIHNhdmVkX3BhY2tldCwgc2F2ZWRfcGFja2V0X2xlbik7IAorICAgICAgICB9CisKKyAgICAgICAgLyogY2FsbCB0aGUgcHJveHkgQVBJIGVub3VnaCB0aW1lcyB0byBzZW5kIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHBhY2tldHMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IHBhY2tldHNfcGVyX3Byb3h5KQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBudW1iZXJfb2ZfcGFja2V0cyA9IE1JTihwYWNrZXRzX3Blcl9wcm94eSwgY291bnQgLSBpKTsKKyAgICAgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsIG51bWJlcl9vZl9wYWNrZXRzKTsKKworICAgICAgICAgICAgYnVmZmVyLmxlbiA9IG51bWJlcl9vZl9wYWNrZXRzICogc2F2ZWRfcGFja2V0X2xlbjsKKyAgICAgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgYnVmZmVyLCBidWZmZXIpOworCisgICAgICAgICAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2UsICZwcm94eS5oZHIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAiW0Vycm9yXSBwcm94eSBzZW5kOiBPTlUgJXUgcGFja2V0IGluZGV4ICV1OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgb251c1tvbnVfaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIldSBwcm94eSBwYWNrZXQlcyBzZW50IHN1Y2Nlc3NmdWxseSFcbiIsIGNvdW50LCBjb3VudCA9PSAxID8gIiIgOiAicyIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gc2VuZF9wYWNrZXRfdG9feGdwb25fb251X2xpc3QoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIHVpbnQxNl90IG9udV9jb3VudCwgYmNtb2x0X3hncG9uX29udV9pZCAqb251cykKK3sKKyAgICB1aW50MTZfdCBjb3VudCA9IDE7CisgICAgdWludDE2X3QgaTsKKyAgICB1aW50MTZfdCBvbnVfaWR4OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm07CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb2x0X3Bvbl9uaSBwb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKworICAgIGlmIChzYXZlZF9wYWNrZXRfbGVuID09IDApCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiW0Vycm9yXSB5b3UgbXVzdCBidWlsZC9zYXZlIGEgcGFja2V0IGJlZm9yZSB5b3UgY2FuIHNlbmQgaXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb3VudCIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjb3VudCA9ICh1aW50MTZfdClwYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICBzZXNzaW9uLAorICAgICAgICAiU2VuZGluZyAldSBwcm94eSBwYWNrZXQlcyB0byAldSBPTlUlcy4uLlxuIiwKKyAgICAgICAgY291bnQsCisgICAgICAgIGNvdW50ID09IDEgPyAiIiA6ICJzIiwKKyAgICAgICAgb251X2NvdW50LAorICAgICAgICBvbnVfY291bnQgPT0gMSA/ICIiIDogInMiKTsKKworICAgIC8qIGNhbGwgdGhlIHByb3h5IEFQSSAocG90ZW50aWFsbHkgc2V2ZXJhbCB0aW1lcykgZm9yIGVhY2ggT05VICovCisgICAgZm9yIChvbnVfaWR4ID0gMDsgb251X2lkeCA8IG9udV9jb3VudDsgb251X2lkeCsrKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9rZXkgb251X2tleSA9IHsgLnBvbl9uaSA9IHBvbl9uaSwgLm9udV9pZCA9IG9udXNbb251X2lkeF0gfTsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlciA9IHsgLnZhbCA9IHNhdmVkX3BhY2tldCB9OworICAgICAgICBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzIHByb3h5OworICAgICAgICB1aW50MTZfdCBwYWNrZXRzX3Blcl9wcm94eTsKKworICAgICAgICAvKiBidWlsZCB0aGUgcHJveHkgQVBJIG1lc3NhZ2UsIGV4Y2VwdCB0aGUgYnVmZmVyL251bWJlciBvZiBwYWNrZXRzICovCisgICAgICAgIEJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgb251X2tleSk7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF90eXBlLCBzYXZlZF9wYWNrZXRfdHlwZSk7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCBzYXZlZF9wYWNrZXRfY2FsY19jcmMpOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfc2l6ZSwgc2F2ZWRfcGFja2V0X2xlbik7CisKKyAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3ZSBjYW4gZml0IHBlciBpbnZvY2F0aW9uIG9mIHRoZSBwcm94eSBBUEkgKi8KKyAgICAgICAgcGFja2V0c19wZXJfcHJveHkgPSBNSU4oY291bnQsIDIwNDggLyBzYXZlZF9wYWNrZXRfbGVuKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsIHBhY2tldHNfcGVyX3Byb3h5KTsKKworICAgICAgICAvKiBwcmVwYXJlIHRoZSBidWZmZXIgZGF0YSB3aXRoIHNldmVyYWwgY29waWVzIG9mIHRoZSBzYW1lIHBhY2tldCBpbiBhIHJvdyAqLworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcGFja2V0c19wZXJfcHJveHk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCZzYXZlZF9wYWNrZXRbaSAqIHNhdmVkX3BhY2tldF9sZW5dLCBzYXZlZF9wYWNrZXQsIHNhdmVkX3BhY2tldF9sZW4pOyAKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNhbGwgdGhlIHByb3h5IEFQSSBlbm91Z2ggdGltZXMgdG8gc2VuZCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBwYWNrZXRzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSBwYWNrZXRzX3Blcl9wcm94eSkKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbnVtYmVyX29mX3BhY2tldHMgPSBNSU4ocGFja2V0c19wZXJfcHJveHksIGNvdW50IC0gaSk7CisgICAgICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBudW1iZXJfb2ZfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMpOworCisgICAgICAgICAgICBidWZmZXIubGVuID0gbnVtYmVyX29mX3BhY2tldHMgKiBzYXZlZF9wYWNrZXRfbGVuOworICAgICAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgYnVmZmVyLCBidWZmZXIpOworCisgICAgICAgICAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2UsICZwcm94eS5oZHIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAiW0Vycm9yXSBwcm94eSBzZW5kOiBPTlUgJXUgcGFja2V0IGluZGV4ICV1OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgb251c1tvbnVfaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIldSBwcm94eSBwYWNrZXQlcyBzZW50IHN1Y2Nlc3NmdWxseSFcbiIsIGNvdW50LCBjb3VudCA9PSAxID8gIiIgOiAicyIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gc2VuZF90b19vbnVfY2IoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpvbnVfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udSIpOworICAgIGJjbW9sdF9wb25fbmkgcG9uX2lkID0gKGJjbW9sdF9wb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDE2X3QgaTsKKyAgICBwb25fbW9kZSBtb2RlID0gcG9uX21vZGVfZ2V0KHBvbl9pZCk7CisKKyAgICBpZiAobW9kZSA9PSBQT05fTU9ERV9HUE9OKQorICAgIHsKKyAgICAgICAgc3RhdGljIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWRfYnVmW01BWF9PTlVTX0ZPUl9TRU5EXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9udV9wYXJtLT5hcnJheV9zaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG9udV9pZF9idWZbaV0gPSAoYmNtb2x0X2dwb25fb251X2lkKW9udV9wYXJtLT52YWx1ZXNbaV0udW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VuZF9wYWNrZXRfdG9fZ3Bvbl9vbnVfbGlzdChzZXNzaW9uLCAodWludDE2X3Qpb251X3Bhcm0tPmFycmF5X3NpemUsIG9udV9pZF9idWYpOworICAgIH0gCisgICAgZWxzZSBpZiAobW9kZSA9PSBQT05fTU9ERV9YR1BPTikKKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21vbHRfeGdwb25fb251X2lkIG9udV9pZF9idWZbTUFYX09OVVNfRk9SX1NFTkRdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb251X3Bhcm0tPmFycmF5X3NpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgb251X2lkX2J1ZltpXSA9IChiY21vbHRfeGdwb25fb251X2lkKW9udV9wYXJtLT52YWx1ZXNbaV0udW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VuZF9wYWNrZXRfdG9feGdwb25fb251X2xpc3Qoc2Vzc2lvbiwgKHVpbnQxNl90KW9udV9wYXJtLT5hcnJheV9zaXplLCBvbnVfaWRfYnVmKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIltFcnJvcl0gSW52YWxpZCBzeXN0ZW0gbW9kZVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1NUQVRFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZHVtcF9zYXZlZF9tYWMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIHVpbnQxNl90IG9mZnNldCkKK3sKKyAgICB1aW50MTZfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiOiIpOworICAgICAgICB9CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlMDJYIiwgc2F2ZWRfcGFja2V0W29mZnNldCArIGldKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkdW1wX3BhY2tldF9jYihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MTZfdCBpOworICAgIHVpbnQxNl90IGRhdGFfb2Zmc2V0OworCisgICAgaWYgKHNhdmVkX3BhY2tldF9sZW4gPT0gMCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJObyBwYWNrZXQgaGFzIGJlZW4gYnVpbHQgeWV0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlNhdmVkIHBhY2tldCBwYXJhbWV0ZXJzOlxuIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiAgICBUeXBlOiAlc1xuIiwgc2F2ZWRfcGFja2V0X3R5cGUgPT0gQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVSA/ICJDUFUiIDogIk9NQ0kiKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiICAgIExlbmd0aDogJXVcbiIsIHNhdmVkX3BhY2tldF9sZW4pOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIgICAgQXV0by1jYWxjdWxhdGUgQ1JDOiAlc1xuIiwgc2F2ZWRfcGFja2V0X2NhbGNfY3JjID8gInllcyIgOiAibm8iKTsKKworICAgIGlmIChzYXZlZF9wYWNrZXRfdHlwZSA9PSBCQ01PTFRfUEFDS0VUX1RZUEVfQ1BVKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiAgICBFdGhlcm5ldCBEQTogIik7CisgICAgICAgIGR1bXBfc2F2ZWRfbWFjKHNlc3Npb24sIDApOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXG4iKTsKKworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiICAgIEV0aGVybmV0IFNBOiAiKTsKKyAgICAgICAgZHVtcF9zYXZlZF9tYWMoc2Vzc2lvbiwgNik7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJcbiIpOworCisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIgICAgRXRoZXJUeXBlOiAweCUwMlglMDJYXG4iLCBzYXZlZF9wYWNrZXRbMTJdLCBzYXZlZF9wYWNrZXRbMTNdKTsKKyAgICAgICAgZGF0YV9vZmZzZXQgPSAxNDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZGF0YV9vZmZzZXQgPSAwOworICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJEYXRhIGJ5dGVzIChzdGFydGluZyBhdCBvZmZzZXQgJXUpOiIsIGRhdGFfb2Zmc2V0KTsKKyAgICBmb3IgKGkgPSBkYXRhX29mZnNldDsgaSA8IHNhdmVkX3BhY2tldF9sZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmICgoaSAtIGRhdGFfb2Zmc2V0KSAlIDE2ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJcbiAgICAiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIgIik7CisgICAgICAgIH0KKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUwMlgiLCBzYXZlZF9wYWNrZXRbaV0pOworICAgIH0KKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXG4iKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHNfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIGlmICghZ3Bvbl91dGlsc19pc19yZWdpc3RlcmVkKQorICAgIHsKKyAgICAgICAgZ3Bvbl91dGlsc19pc19yZWdpc3RlcmVkID0gQkNNT1NfVFJVRTsKKworICAgICAgICAvKiBTdWJzY3JpYmUgZm9yIGRldmljZSBjaGFuZ2UgaW5kaWNhdGlvbiAqLworICAgICAgICBlcnIgPSBiY21vbHRfZGV2X3NlbF9pbmRfcmVnaXN0ZXIoYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2RldmljZV9jaGFuZ2VfaW5kKTsKKyAgICB9CisgICAgcmV0dXJuIGVyciA/IGVyciA6IGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlsc19jcmVhdGUodG9wX2Rpcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHNfY3JlYXRlKGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGdlbmVyYXRlZF9wYWNrZXRfcGF0dGVybl90YWJsZVtdID0KKyAgICB7CisgICAgICAgIHsgLm5hbWUgPSAiYnl0ZV9jeWNsZSIsIC52YWwgPSBHRU5FUkFURURfUEFDS0VUX1BBVFRFUk5fQllURV9DWUNMRSB9LAorICAgICAgICB7IC5uYW1lID0gIndvcmRfY3ljbGUiLCAudmFsID0gR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX1dPUkRfQ1lDTEUgfSwKKyAgICAgICAgeyAubmFtZSA9ICJjb25zdCIsICAgICAgLnZhbCA9IEdFTkVSQVRFRF9QQUNLRVRfUEFUVEVSTl9DT05TVCB9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKworICAgIHN0YXRpYyBiY21jbGlfcGFybV92YWx1ZSBnZW1fcG9ydF9pZHNbTUFYX0dFTV9QT1JUU19GT1JfU0VORF07CisgICAgc3RhdGljIGJjbWNsaV9wYXJtX3ZhbHVlIG9udV9pZHNbTUFYX09OVVNfRk9SX1NFTkRdOworCisgICAgYmNtY2xpX2VudHJ5ICpkaXI7CisKKyAgICBpZiAoYmNtY2xpX2Rpcl9maW5kKHRvcF9kaXIsICJncG9uIikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBncG9uX3V0aWxzX2NsaV9kaXJfY2xpX2Rlc3Ryb3koKTsKKworICAgIGRpciA9IGJjbWNsaV9kaXJfYWRkKHRvcF9kaXIsICJncG9uIiwgIkNvbW1vbiBHUE9OL1hHUE9OIGZ1bmN0aW9ucyIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUighZGlyLCBCQ01fRVJSX05PTUVNKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRCgKKyAgICAgICAgZGlyLAorICAgICAgICAiYnVpbGRfY3B1X3BhY2tldCIsCisgICAgICAgICJCdWlsZCBhbmQgc2F2ZSBDUFUgcGFja2V0IiwKKyAgICAgICAgYnVpbGRfY3B1X3BhY2tldF9jYiwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJjYWxjX2NyYyIsICJBdXRvLWNhbGN1bGF0ZSBDUkMiLCBiY21jbGlfZW51bV9ib29sX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKAorICAgICAgICAgICAgInBhY2tldF9zaXplIiwgIkZ1bGwgcGFja2V0IHNpemUiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUsIDAsIE1BWF9QQUNLRVRfU0laRSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgicGF0dGVybiIsICJCYWNrZ3JvdW5kIHBhdHRlcm4iLCBnZW5lcmF0ZWRfcGFja2V0X3BhdHRlcm5fdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImNvbnN0X3ZhbHVlIiwgIkNvbnN0IHZhbHVlIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FLCAwLCAweEZGKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXRoX2RhIiwgIkV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHJlc3MiLCBCQ01DTElfUEFSTV9NQUMsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImV0aF9zYSIsICJFdGhlcm5ldCBzb3VyY2UgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX01BQywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoCisgICAgICAgIGRpciwKKyAgICAgICAgImJ1aWxkX29tY2lfcGFja2V0IiwKKyAgICAgICAgIkJ1aWxkIGFuZCBzYXZlIE9NQ0kgcGFja2V0IiwKKyAgICAgICAgYnVpbGRfb21jaV9wYWNrZXRfY2IsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiY2FsY19jcmMiLCAiQXV0by1jYWxjdWxhdGUgQ1JDIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgKKyAgICAgICAgICAgICJwYWNrZXRfc2l6ZSIsICJGdWxsIHBhY2tldCBzaXplIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FLCAwLCBNQVhfUEFDS0VUX1NJWkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oInBhdHRlcm4iLCAiQmFja2dyb3VuZCBwYXR0ZXJuIiwgZ2VuZXJhdGVkX3BhY2tldF9wYXR0ZXJuX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJjb25zdF92YWx1ZSIsICJDb25zdCB2YWx1ZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSwgMCwgMHhGRikpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKAorICAgICAgICBkaXIsCisgICAgICAgICJzZW5kX3RvX2dlbSIsCisgICAgICAgICJTZW5kIHNhdmVkIENQVS9PTUNJIHBhY2tldCB0byBHRU0gcG9ydChzKSIsCisgICAgICAgIHNlbmRfdG9fZ2VtX2NiLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJkZXZpY2UiLCAiRGV2aWNlIElEIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9uX25pIiwgIlBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fQVJSQVkoCisgICAgICAgICAgICAiZ2VtIiwKKyAgICAgICAgICAgICJHRU0gcG9ydCBJRHMsIGNvbW1hIHNlcGFyYXRlZCIsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9VTlVNQkVSLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19OT05FLAorICAgICAgICAgICAgTUFYX0dFTV9QT1JUU19GT1JfU0VORCwKKyAgICAgICAgICAgIGdlbV9wb3J0X2lkcyksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImNvdW50IiwgIk51bWJlciBvZiBwYWNrZXRzIChkZWZhdWx0IDEpIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKAorICAgICAgICBkaXIsCisgICAgICAgICJzZW5kX3RvX29udSIsCisgICAgICAgICJTZW5kIHNhdmVkIENQVS9PTUNJIHBhY2tldCB0byBPTlUocykgKE9NQ0kgR0VNIHBvcnQpIiwKKyAgICAgICAgc2VuZF90b19vbnVfY2IsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImRldmljZSIsICJEZXZpY2UgSUQiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJwb25fbmkiLCAiUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9BUlJBWSgKKyAgICAgICAgICAgICJvbnUiLAorICAgICAgICAgICAgIk9OVSBJRHMsIGNvbW1hIHNlcGFyYXRlZCIsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9VTlVNQkVSLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19OT05FLAorICAgICAgICAgICAgTUFYX09OVVNfRk9SX1NFTkQsCisgICAgICAgICAgICBvbnVfaWRzKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiY291bnQiLCAiTnVtYmVyIG9mIHBhY2tldHMgKGRlZmF1bHQgMSkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKAorICAgICAgICBkaXIsCisgICAgICAgICJkdW1wX3BhY2tldCIsCisgICAgICAgICJQcmludCBzYXZlZCBDUFUvT01DSSBwYWNrZXQgZGF0YSIsCisgICAgICAgIGR1bXBfcGFja2V0X2NiKTsKKworICAgIGdwb25fdXRpbHNfY2xpX2RpciA9IGRpcjsKKyAgICBncG9uX3V0aWxzX2NsaV90b3BfZGlyID0gdG9wX2RpcjsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzgwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfR1BPTl9VVElMU19IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9HUE9OX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTY3ZTIzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjIERQb0UgU2VjdXJpdHkKKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisKKwlNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfZHBvZV9zZWMKKwlNT0RfVFlQRSA9IGxpYgorCU1PRF9ERVBTID0gb3MgaG9zdF9hcGkgYmNtX3VzZXJfYXBwbF9lcG9uX29hbQorCisJc3JjcyA9IGJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWMuYyBkcG9lX2VhcF90bHMuYyBkcG9lX3NlY19mc20uYyBkcG9lX3NlY19ta2FfZnNtLmMgZHBvZV9zZWNfdXRpbC5jIG1rYS5jCisKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlYy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9iY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiY2IxMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlYy5jCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfZXBvbl9vYW1fdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjLmgiCisjaW5jbHVkZSAiZHBvZV9zZWNfZnNtLmgiCisKK3N0YXRpYyBiY21vc19ib29sIGlzX3J1bm5pbmcgPSBCQ01PU19GQUxTRTsKKworc3RhdGljIGJjbW9zX2Jvb2wgY2VydF9hdXRob3JpdHlfdHJ1c3RfcGxhY2Vob2xkZXIoZHBvZV9zZWNfbGlua19yZWMqIGxpbmtfcmVjKQoreworICAgIEJDTV9MT0coSU5GTywgZHBvZV9zZWNfbG9nX2lkW2xpbmtfcmVjLT5kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgdmFsaWRhdGUgdGhlIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgbGluayByZWNvcmQgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIGFjY2VwdCB0aGlzIGF1dGhlbnRpY2F0aW9uLlxuIik7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK3N0YXRpYyB2b2lkIGZzbV9jb21wbGV0ZV9wbGFjZWhvbGRlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSwgYmNtb3NfZXJybm8gc3RhdHVzKQoreworICAgIGlmIChzdGF0dXMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgZHBvZV9zZWNfbG9nX2lkW2RldmljZV0sICJUaGUgRFBvRSBTZWN1cml0eSBGU00gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gVGhpcyBsaW5rIGNhbiBub3cgYmUgY29uZmlndXJlZCBmb3Igc2VydmljZS5cbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRwb2Vfc2VjX2xvZ19pZFtkZXZpY2VdLCAiVGhlIERQb0UgU2VjdXJpdHkgRlNNIGZhaWxlZCBkdWUgdG8gJXMgKCVkKS4gQXBwcm9wcmlhdGUgYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB0byBjb3JyZWN0IHRoaXMgZXJyb3IuXG4iLCBiY21vc19zdHJlcnJvcihzdGF0dXMpLCBzdGF0dXMpOworICAgIH0KK30KKworI2lmZGVmIEVOQUJMRV9DTEkKK3N0YXRpYyBiY21vc19lcnJubyBkcG9lX3NlY19jbGlfYXV0aChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleTsKKyAgICBkcG9lX3NlY19mc21fc3RhcnRfZGF0YSBjZmc7CisKKyAgICBsaW5rX2tleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbiIpLT52YWx1ZS51bnVtYmVyOworICAgIGxpbmtfa2V5Lm1hY19hZGRyZXNzID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251IiktPnZhbHVlLm1hYzsKKyAgICBjZmcuZW5jX21vZGUgPSAoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1vZGUiKS0+dmFsdWUuZW51bV92YWw7CisgICAgY2ZnLmF1dGggPSBCQ01PU19UUlVFOworCisgICAgcmV0dXJuIGRwb2Vfc2VjX2ZzbV9saW5rX3N0YXJ0KGN1cnJlbnRfZGV2aWNlLCBsaW5rX2tleSwgJmNmZyk7Cit9CisjZW5kaWYKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyNpZmRlZiBFTkFCTEVfQ0xJCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmRpcl9uYW1lID0gImRwb2Vfc2VjIjsKKworICAgIGlmIChiY21jbGlfZGlyX2ZpbmQodG9wX2RpciwgZGlyX25hbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJjbWNsaV9lbnRyeSAqZHBvZV9zZWNfZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgZGlyX25hbWUsICJEUG9FIFNlY3VyaXR5IiwgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCk7CisgICAgQlVHX09OKE5VTEwgPT0gZHBvZV9zZWNfZGlyKTsKKworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZW5jX21vZGVfdGFibGVbXSA9CisgICAgeworICAgICAgICB7Im5vbmUiLCAobG9uZylCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfTk9ORX0sCisgICAgICAgIHsiMWRvd24iLCAobG9uZylCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfT05FX0RPV059LAorICAgICAgICB7IjEwZG93biIsIChsb25nKUJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fRE9XTn0sCisgICAgICAgIHsiMTBiaSIsIChsb25nKUJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fQkl9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkcG9lX3NlY19kaXIsICJhdXRoIiwgIkF1dGhlbnRpY2F0ZSBPTlUiLCBkcG9lX3NlY19jbGlfYXV0aCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9uIiwgIlBPTiBOSSIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJvbnUiLCAiT05VIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJtb2RlIiwgIkVuY3J5cHRpb24gbW9kZSIsIGVuY19tb2RlX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpKTsKKyNlbmRpZgorfQorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWNfcHJvY2Vzc19wcm94eV9yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfcHJveHlfcnggKnByb3h5X3J4KQoreworICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQgKmNhcCA9IChiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkKilwcm94eV9yeDsKKworICAgIGlmICgoQkNNT0xUX09CSl9JRF9FUE9OX0xJTksgPT0gcHJveHlfcngtPmhkci5vYmpfdHlwZSkgJiYKKyAgICAgICAgKEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfRlJBTUVfQ0FQVFVSRUQgPT0gcHJveHlfcngtPmhkci5zdWJncm91cCkpCisgICAgeworICAgICAgICBpZiAoKGNhcC0+ZGF0YS5mcmFtZS52YWxbMTJdID09IDB4ODgpICYmCisgICAgICAgICAgICAoY2FwLT5kYXRhLmZyYW1lLnZhbFsxM10gPT0gMHgwOSkgJiYKKyAgICAgICAgICAgIChjYXAtPmRhdGEuZnJhbWUudmFsWzE0XSA9PSAweDAzKSkKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCAqZnJhbWVfY29weTsKKworICAgICAgICAgICAgZnJhbWVfY29weSA9IGJjbW9zX2FsbG9jKGNhcC0+ZGF0YS5mcmFtZS5sZW4pOworICAgICAgICAgICAgbWVtY3B5KGZyYW1lX2NvcHksIGNhcC0+ZGF0YS5mcmFtZS52YWwsIGNhcC0+ZGF0YS5mcmFtZS5sZW4pOworCisgICAgICAgICAgICBkcG9lX3NlY19mc21fbGlua19yeF9vYW0oZGV2aWNlX2lkLCBjYXAtPmtleSwgZnJhbWVfY29weSwgY2FwLT5kYXRhLmZyYW1lLmxlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuOyAvKiBub3QgYSBmcmFtZSBjYXB0dXJlZCBvbiBhIGxpbmsgLSBpZ25vcmUgKi8KKyAgICB9Cit9CisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19pbml0KHZvaWQpCit7CisgICAgaWYgKGlzX3J1bm5pbmcpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZHBvZV9zZWNfZnNtX2luaXQoY2VydF9hdXRob3JpdHlfdHJ1c3RfcGxhY2Vob2xkZXIsIGZzbV9jb21wbGV0ZV9wbGFjZWhvbGRlcik7CisKKyAgICBpc19ydW5uaW5nID0gQkNNT1NfVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9iY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2JjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODcyZjhjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9iY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9EUE9FX1NFQ19IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9EUE9FX1NFQ19IXworCisjaW5jbHVkZSAiYmNtY2xpLmgiCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19wcm9jZXNzX3Byb3h5X3J4KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9wcm94eV9yeCAqcHJveHlfcngpOworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWNfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjX2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBfQkNNT0xUX1VTRVJfQVBQTF9EUE9FX1NFQ19IXyAqLworCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9lYXBfdGxzLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2VfZWFwX3Rscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWE4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2VfZWFwX3Rscy5jCkBAIC0wLDAgKzEsMTQ4MyBAQAorLyoKKyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgb2YgdGhlIHNvZnR3YXJlLgorCisgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAgd3JpdHRlbiBjb25zZW50LgorCisgIDo+CisqLworCisjaW5jbHVkZSAiZHBvZV9lYXBfdGxzLmgiCisjaW5jbHVkZSAiYmNtb2x0X2J1Zi5oIgorI2luY2x1ZGUgImRwb2Vfc2VjX2ZzbS5oIgorCisvKiBUaGUgZGVzdGluYXRpb24gbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZvciBFQVBPTCBwYWNrZXRzLiAqLworc3RhdGljIGNvbnN0IGJjbW9zX21hY19hZGRyZXNzIGVhcG9sX2RzdF9tYWMgPSB7IHsgMHgwMSwgMHg4MCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMyB9IH07CisKKy8qIFRoZSBsZW5ndGggb2YgdGhlIFJTQSBrZXkgdXNlZCBpbiB0aGUgc2VydmVyX2tleV9leGNoYW5nZSBUTFMgbWVzc2FnZSBzZW50IHRvIHRoZSBPTlUgZHVyaW5nIERQb0UgYmktZGlyZWN0aW9uYWwKKyAgIGF1dGhlbnRpY2F0aW9uLiAqLworI2RlZmluZSBEUE9FX0JJX1JTQV9LRVlfU0laRSAyMDQ4CisKKy8qIDIgMTIwMCBieXRlIGNlcnRzICsgc29tZSBvdmVyaGVhZC4uLi4gKi8KKyNkZWZpbmUgRUFQT0xfUEtUX1NJWkUgNTAwMAorCit0eXBlZGVmIGVudW0KK3sKKyAgICBFQVBfQ09ERV9SRVFVRVNUID0gMSwKKyAgICBFQVBfQ09ERV9SRVNQT05TRSwKKyAgICBFQVBfQ09ERV9TVUNDRVNTLAorICAgIEVBUF9DT0RFX0ZBSUxVUkUKK30gZWFwX2NvZGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCBlYXBfY29kZTsKKyAgICB1aW50OF90IGlkOworICAgIHVpbnQxNl90IGxlbmd0aDsKK30gZWFwX2ZyYW1lOworCisjZGVmaW5lIEVBUF9GUkFNRV9TSVpFIDQKKwordHlwZWRlZiBlbnVtCit7CisgICAgRUFQX1RZUEVfSURFTlRJVFkgPSAxLAorICAgIEVBUF9UWVBFX05PVElGSUNBVElPTiwKKyAgICBFQVBfVFlQRV9OQUssCisgICAgRUFQX1RZUEVfTUQ1LAorICAgIEVBUF9UWVBFX09UUCwKKyAgICBFQVBfVFlQRV9HRU5FUklDX1RPS0VOX0NBUkQsCisgICAgRUFQX1RZUEVfVExTID0gMTMKK30gZWFwX3R5cGU7CisKKyNkZWZpbmUgVExTX01BSk9SX1ZFUlNJT04gMworI2RlZmluZSBUTFNfTUlOT1JfVkVSU0lPTiAyCisKKy8qIEZpcnN0IHRoZSBFQVAgc3RydWN0dXJlcy4uLi4gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCBhdXRoX3N1Yl90eXBlOworICAgIHVpbnQ4X3QgZWFwX3Rsc19mbGFnczsKK30gZWFwX3Rsc19oZHI7CisKKyNkZWZpbmUgRUFQX1RMU19IRFJfU0laRSAyCisKKyNkZWZpbmUgRUFQX0hEUl9TSVpFIChFQVBfRlJBTUVfU0laRSArIEVBUF9UTFNfSERSX1NJWkUpCisKK3R5cGVkZWYgZW51bQoreworICAgIFRMU19DSEFOR0VfQ0lQSEVSX1NQRUNfSUQgPSAyMCwKKyAgICBUTFNfQUxFUlRfSUQgPSAyMSwKKyAgICBUTFNfSEFORFNIQUtFX0lEID0gMjIsCisgICAgVExTX0FQUExJQ0FUSU9OX0RBVEFfSUQgPSAyMywKK30gdGxzX2NvbnRlbnRfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IGNvbnRlbnRfdHlwZTsKKyAgICB0bHNfcHJvdG9jb2xfdmVyc2lvbiB0bHNfdmVyc2lvbjsKKyAgICB1aW50MTZfdCB0bHNfcmVjb3JkX2xlbmd0aDsKK30gdGxzX3JlY29yZF9oZHI7CisKKyNkZWZpbmUgVExTX1JFQ09SRF9IRFJfU0laRSAoMyArIFBST1RPQ09MX1ZFUlNJT05fU0laRSkKKworI2RlZmluZSBFQVBfVExTX0ZMQUdfTEVOR1RIX09GRlNFVCA3CisjZGVmaW5lIEVBUF9UTFNfRkxBR19NT1JFX09GRlNFVCA2CisjZGVmaW5lIEVBUF9UTFNfRkxBR19TVEFSVF9PRkZTRVQgNQorI2RlZmluZSBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCAoMVUgPDwgRUFQX1RMU19GTEFHX0xFTkdUSF9PRkZTRVQpCisjZGVmaW5lIEVBUF9UTFNfRkxBR19NT1JFX0JJVCAoMVUgPDwgRUFQX1RMU19GTEFHX01PUkVfT0ZGU0VUKQorI2RlZmluZSBFQVBfVExTX0ZMQUdfU1RBUlRfQklUICgxVSA8PCBFQVBfVExTX0ZMQUdfU1RBUlRfT0ZGU0VUKQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGVhcF9mcmFtZSBoZHI7CisgICAgZWFwX3Rsc19oZHIgdGxzOworfSBlYXBfbXNnX2J1ZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBlYXBvbF9tc2dfaGRyIGhkcjsKKyAgICBlYXBfbXNnX2J1ZiBlYXBfbXNnOworfSBlYXBvbF9tc2c7CisKKy8qIE5vdyB0aGUgVExTIHJlY29yZHMuICovCit0eXBlZGVmIHN0cnVjdCB0bHNfc2Vzc2lvbl9pZAoreworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQ4X3Qgc2Vzc2lvbl9pZFtTSVpFX09GX1RMU19TRVNTSU9OX0lEXTsKK30gdGxzX3Nlc3Npb25faWQ7CisKK3R5cGVkZWYgZW51bQoreworICAgIGNtX251bGwgPSAwCit9IGNvbXByZXNzaW9uX21ldGhvZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IGNvbXByZXNzaW9uX21ldGhvZDsKK30gY29tcHJlc3Npb25fbWV0aG9kczsKKwordHlwZWRlZiBlbnVtCit7CisgICAgUlNBX1NJR04gICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKyAgICBEU1NfU0lHTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLAorICAgIFJTQV9GSVhFRF9ESCAgICAgICAgICAgICAgICAgICAgICA9IDMsCisgICAgRFNTX0ZJWEVEX0RIICAgICAgICAgICAgICAgICAgICAgID0gNCwKKyAgICBSU0FfRVBIRU1FUkFMX0RIX1JFU0VSVkVEICAgICAgICAgPSA1LAorICAgIERTU19FUEhFTUVSQUxfREhfUkVTRVJWRUQgICAgICAgICA9IDYsCisgICAgRk9SVEVaWkFfRE1TX1JFU0VSVkVEICAgICAgICAgICAgID0gMjAsCit9IGNsaWVudF9jZXJ0aWZpY2F0ZV90eXBlOworCisvKiBGb3IgMjA0OCBiaXQgUlNBIGtleSAqLworI2RlZmluZSBTSVpFX09GX1JTQV9NT0RVTFVTIDI1NgorI2RlZmluZSBTSVpFX09GX1JTQV9FWFBPTkVOVCAzCisKK3R5cGVkZWYgZW51bQoreworICAgIEhTX0hFTExPX1JFUVVFU1QgPSAwLAorICAgIEhTX0NMSUVOVF9IRUxMTyA9IDEsCisgICAgSFNfU0VSVkVSX0hFTExPID0gMiwKKyAgICBIU19DRVJUSUZJQ0FURSA9IDExLAorICAgIEhTX1NFUlZFUl9LRVlfRVhDSEFOR0UgPSAxMiwKKyAgICBIU19DRVJUSUZJQ0FURV9SRVFVRVNUID0gMTMsCisgICAgSFNfU0VSVkVSX0hFTExPX0RPTkUgPSAxNCwKKyAgICBIU19DRVJUSUZJQ0FURV9WRVJJRlkgPSAxNSwKKyAgICBIU19DTElFTlRfS0VZX0VYQ0hBTkdFID0gMTYsCisgICAgSFNfRklOSVNIRUQgPSAyMCwKK30gaGFuZHNoYWtlX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCBtc2dfaWQ7CisgICAgdWludDMyX3QgbXNnX2xlbmd0aDsgLyogYWN0dWFsbHkgVTI0ICovCit9IHRsc19oYW5kc2hha2U7CisKKyNkZWZpbmUgVExTX0hBTkRTSEFLRV9TSVpFIDQKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICplYXBvbDsKKyAgICB1aW50OF90ICplYXA7CisgICAgdWludDhfdCAqZWFwX3RsczsKKyAgICB1aW50OF90ICp0bHNfcmVjOworfSBlYXBfbGVuZ3RoX2ZpZWxkczsKKworc3RhdGljIGZfZHBvZV9zZWNfY2VydF90cnVzdF9jYiBfY2VydF90cnVzdDsKK3N0YXRpYyBmX2Rwb2Vfc2VjX2F1dGhfY2IgX2F1dGhfY29tcGxldGU7CisKK3N0YXRpYyB2b2lkIF9idWZmZXJfaGFzaF9kYXRhKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgY29uc3QgdWludDhfdCAqYnVmLCB1aW50MzJfdCBsZW4pCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIGRwb2Vfc2VjX3NoYTFfdXBkYXRlKCZsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2hhMV9oYXNoLCBidWYsIGxlbik7CisgICAgZHBvZV9zZWNfbWQ1X3VwZGF0ZSgmbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1kNV9oYXNoLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX2VhcF90bHNfY29tcHV0ZV9tYXN0ZXJfc2Vzc2lvbl9rZXkoYXV0aF90cmFuc19kYXRhICp0cmFuc19kYXRhKQoreworICAgIHVpbnQ4X3Qgc2VlZFsoMiogQ09VTlRfT0ZfUkFORE9NX0JZVEVTKV07CisgICAgdWludDMyX3Qgc2VlZF9sZW4gPSAwOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04odHJhbnNfZGF0YSA9PSBOVUxMKTsKKworICAgIC8qIFRoZSBzZWVkIHRvIHRoZSBQUkYgaXMgdGhlIGNsaWVudCByYW5kb20gdmFsdWUgY29uY2F0ZW5hdGVkIHdpdGggdGhlIHNlcnZlciByYW5kb20gdmFsdWUuICovCisgICAgbWVtY3B5KCZzZWVkW3NlZWRfbGVuXSwgdHJhbnNfZGF0YS0+Y2xpZW50X3JhbmRvbSwgQ09VTlRfT0ZfUkFORE9NX0JZVEVTKTsKKyAgICBzZWVkX2xlbiArPSBDT1VOVF9PRl9SQU5ET01fQllURVM7CisgICAgbWVtY3B5KCZzZWVkW3NlZWRfbGVuXSwgdHJhbnNfZGF0YS0+c2VydmVyX3JhbmRvbSwgQ09VTlRfT0ZfUkFORE9NX0JZVEVTKTsKKyAgICBzZWVkX2xlbiArPSBDT1VOVF9PRl9SQU5ET01fQllURVM7CisKKyAgICBkcG9lX3NlY19wcmZfZXhwYW5kXzQzNDYoCisgICAgICAgIHRyYW5zX2RhdGEtPnByZV9tYXN0ZXJfc2VjcmV0LAorICAgICAgICBzaXplb2YodHJhbnNfZGF0YS0+cHJlX21hc3Rlcl9zZWNyZXQpLAorICAgICAgICAoY29uc3QgdWludDhfdCAqKSJtYXN0ZXIgc2VjcmV0IiwKKyAgICAgICAgc3RybGVuKCJtYXN0ZXIgc2VjcmV0IiksCisgICAgICAgIHNlZWQsCisgICAgICAgIHNlZWRfbGVuLAorICAgICAgICB0cmFuc19kYXRhLT5tYXN0ZXJfc2VjcmV0LAorICAgICAgICBzaXplb2YodHJhbnNfZGF0YS0+bWFzdGVyX3NlY3JldCkpOworICAgIGRwb2Vfc2VjX3ByZl9leHBhbmRfNDM0NigKKyAgICAgICAgdHJhbnNfZGF0YS0+bWFzdGVyX3NlY3JldCwKKyAgICAgICAgc2l6ZW9mKHRyYW5zX2RhdGEtPm1hc3Rlcl9zZWNyZXQpLAorICAgICAgICAoY29uc3QgdWludDhfdCAqKSJjbGllbnQgRUFQIGVuY3J5cHRpb24iLAorICAgICAgICBzdHJsZW4oImNsaWVudCBFQVAgZW5jcnlwdGlvbiIpLAorICAgICAgICBzZWVkLAorICAgICAgICBzZWVkX2xlbiwKKyAgICAgICAgdHJhbnNfZGF0YS0+a2V5X21hdGVyaWFsLAorICAgICAgICBzaXplb2YodHJhbnNfZGF0YS0+a2V5X21hdGVyaWFsKSk7CisKKyAgICBtZW1jcHkodHJhbnNfZGF0YS0+bWFzdGVyX3Nlc3Npb25fa2V5LCB0cmFuc19kYXRhLT5rZXlfbWF0ZXJpYWwsIHNpemVvZih0cmFuc19kYXRhLT5tYXN0ZXJfc2Vzc2lvbl9rZXkpKTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19wcmVwYXJlX3NlY3VyaXR5X2RhdGEoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgLyogSWYgYmlkaXJlY3Rpb25hbCwgY29tcHV0ZSB0aGUgbWFzdGVyIHNlc3Npb24ga2V5IGFuZCBnZW5lcmF0ZSB0aGUgUlNBIHB1YmxpYy9wcml2YXRlIGtleSBwYWlyICovCisgICAgaWYgKGxpbmtfcmVjLT5jZmcuZW5jX21vZGUgPT0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX1RFTl9CSSkKKyAgICB7CisgICAgICAgIF9kcG9lX2VhcF90bHNfY29tcHV0ZV9tYXN0ZXJfc2Vzc2lvbl9rZXkoJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfc2tpcF9sZW5ndGgoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MzJfdCBza2lwLCB1aW50OF90KiogbGVuKQoreworICAgICpsZW4gPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChidWYsIHNraXApOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX2luaXRfZWFwX2hkcigKKyAgICBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsCisgICAgYmNtb2x0X2J1ZiAqYnVmLAorICAgIGVhcF9jb2RlIGNvZGUsCisgICAgZWFwX2xlbmd0aF9maWVsZHMgKmxmKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICByZXR1cm4KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIGVhcG9sX2RzdF9tYWMpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCBsaW5rX3JlYy0+bmlfbWFjKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShidWYsIEVUSEVSVFlQRV9FQVBPTCkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIEVBUE9MX1BST1RPQ09MX1ZFUlNJT05fRFBPRSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIEVBUE9MX1RZUEVfUEFDS0VUKSAmJgorICAgICAgICAvKiBFYXBvbCBMZW5ndGggLSB3ZSByZS1jb21wdXRlIHRoaXMgYWZ0ZXIgYnVpbGRpbmcgdGhlIHBhY2tldCAqLworICAgICAgICBfZHBvZV9lYXBfdGxzX3NraXBfbGVuZ3RoKGJ1Ziwgc2l6ZW9mKHVpbnQxNl90KSwgJmxmLT5lYXBvbCkgJiYKKyAgICAgICAgLyogRUFQIGxheWVyIGhlYWRlcnMgKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIGNvZGUpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLmN1cnJlbnRfcGFja2V0X2lkKyspICYmCisgICAgICAgIC8qIEVBUCBsZW5ndGggLSBhZ2FpbiwgY29tcHV0ZWQgd2hlbiB0aGUgcGFja2V0IGlzIHBhY2tlZCEgKi8KKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19za2lwX2xlbmd0aChidWYsIHNpemVvZih1aW50MTZfdCksICZsZi0+ZWFwKTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19pbml0X3Rsc19oZHIoYmNtb2x0X2J1ZiAqYnVmLCB1aW50OF90IGVhcFRsc0ZsYWdzLCBlYXBfbGVuZ3RoX2ZpZWxkcyAqbGYpCit7CisgICAgYmNtb3NfYm9vbCByYyA9IEJDTU9TX0ZBTFNFOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgaWYgKGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBFQVBfVFlQRV9UTFMpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBlYXBUbHNGbGFncykpCisgICAgeworICAgICAgICBpZiAoKGVhcFRsc0ZsYWdzICYgRUFQX1RMU19GTEFHX0xFTkdUSF9CSVQpID09IEVBUF9UTFNfRkxBR19MRU5HVEhfQklUKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFQVAtVExTIGxlbmd0aCAtIGNvbXB1dGVkIGF0IHBhY2sgY29tcGxldGlvbiBvbmx5IGFsbG9jYXRlIHJvb20gZm9yIHRoaXMgaWYgRWFwVGxzRmxhZ0xlbmd0aEJpdCBpcyBzZXQKKyAgICAgICAgICAgICAgIEJ1dCBpZiB0aGUgRWFwVGxzRmxhZ0xlbmd0aEJpdCBpcyBzZXQsIHdlIGFsc28gd3JpdGUgdGhlIFRMUyBSZWNvcmQgaGVhZGVyLiAqLworICAgICAgICAgICAgaWYgKF9kcG9lX2VhcF90bHNfc2tpcF9sZW5ndGgoYnVmLCBzaXplb2YodWludDMyX3QpLCAmbGYtPmVhcF90bHMpICYmCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIFRMU19IQU5EU0hBS0VfSUQpICYmCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIFRMU19NQUpPUl9WRVJTSU9OKSAmJgorICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBUTFNfTUlOT1JfVkVSU0lPTikgJiYKKyAgICAgICAgICAgICAgICAvKiBBbm90aGVyIGxlbmd0aCBmaWVsZCwgdGhlIFRMUyByZWNvcmQgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19za2lwX2xlbmd0aChidWYsIHNpemVvZih1aW50MTZfdCksICZsZi0+dGxzX3JlYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBCQ01PU19UUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9lYXBfdGxzX3BhY2tfaGFuZHNoYWtlX2xlbmd0aCgKKyAgICBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsCisgICAgYmNtb2x0X2J1ZiAqYnVmLAorICAgIHVpbnQ4X3QgKnN0YXJ0LAorICAgIHVpbnQ4X3QgKmxlbikKK3sKKyAgICB1aW50MzJfdCByZWNfbGVuOworICAgIHVpbnQ4X3QgKmVuZDsKKworICAgIC8qIE5vdyBnbyBiYWNrIGFuZCBmaWxsIGluIHRoZSBsZW5ndGggZmllbGQuICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgdGhlIFRsc0hhbmRzaGFrZSByZWNvcmQgKi8KKyAgICBlbmQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgcmVjX2xlbiA9IGVuZCAtIHN0YXJ0OworICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1ZiwgbGVuKTsKKyAgICBiY21vbHRfYnVmX3dyaXRlX3UyNChidWYsIHVpbnQzMl90b18yNChyZWNfbGVuIC0gVExTX0hBTkRTSEFLRV9TSVpFKSk7CisgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBlbmQpOworICAgIF9idWZmZXJfaGFzaF9kYXRhKGxpbmtfcmVjLCBzdGFydCwgcmVjX2xlbik7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFja19zZXJ2ZXJfaGVsbG9faHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDhfdCAqbGVuOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIHN0YXJ0ID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpOworICAgIGlmIChiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgSFNfU0VSVkVSX0hFTExPKSAmJgorICAgICAgICAobGVuID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpLCBiY21vbHRfYnVmX3NraXAoYnVmLCBzaXplb2YodWludDI0X3QpKSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5tYWpvcikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vcikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZShidWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXJ2ZXJfcmFuZG9tLCBDT1VOVF9PRl9SQU5ET01fQllURVMpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBDT1VOVF9PRl9SQU5ET01fQllURVMpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGUoYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2VydmVyX3JhbmRvbSwgQ09VTlRfT0ZfUkFORE9NX0JZVEVTKSAmJgorCisgICAgICAgIC8qIENpcGhlciBTdWl0ZXMgLSB3ZSB3cml0ZSAwIGFzIHRoZSBsZW5ndGggb2YgdGhlIENpcGhlciBTdWl0ZXMKKyAgICAgICAgICAgU2hvcnQgY2lyY3VpdCBpZiB1c2luZyBwcmUtcmVsZWFzZSBhdXRoZW50aWNhdGlvbiAqLworICAgICAgICAoKGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vciA9PSAzKSB8fCBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShidWYsIDApKSAmJgorCisgICAgICAgIC8qIENvbXByZXNzaW9uTWV0aG9kcyBhbHNvIHdyaXRlIDAgYXMgdGhlIGxlbmd0aCAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgMCkpCisgICAgeworICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfaGFuZHNoYWtlX2xlbmd0aChsaW5rX3JlYywgYnVmLCBzdGFydCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19wYWNrX3NlcnZlcl9rZXlfZXhjaGFuZ2VfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDhfdCAqbGVuOworICAgIHVpbnQ4X3QgcnNhX21vZHVsdXNbU0laRV9PRl9SU0FfTU9EVUxVU10gPSB7fTsKKyAgICB1aW50OF90IHJzYV9leHBvbmVudFtTSVpFX09GX1JTQV9FWFBPTkVOVF0gPSB7fTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICAvKiBJZiBub3QgYmlkaXJlY3Rpb25hbCwganVzdCByZXR1cm4gQkNNT1NfVFJVRSAqLworICAgIGlmIChsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlICE9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fQkkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICAvKiBWZXJpZnkgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBwdWJsaWMga2V5IChtb2R1bHVzKSBvZiB0aGUgcHJpdmF0ZSBrZXkgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgbGVuZ3RoLiBBbHNvLCB2ZXJpZnkKKyAgICAgICB0aGF0IHRoZSBtb2R1bHVzIGlzIHN1Y2Nlc3NmdWxseSByZWFkIGZyb20gdGhlIFJTQSBrZXkuICovCisgICAgc3RhcnQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgaWYgKChkcG9lX3NlY19yc2FfcHVibGljX2dldChsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEucnNhLCByc2FfbW9kdWx1cywgcnNhX2V4cG9uZW50KSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIEhTX1NFUlZFUl9LRVlfRVhDSEFOR0UpICYmCisgICAgICAgIChsZW4gPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1ZiksIGJjbW9sdF9idWZfc2tpcChidWYsIHNpemVvZih1aW50MjRfdCkpKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgcnNhX21vZHVsdXMsIHNpemVvZihyc2FfbW9kdWx1cykpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGUoYnVmLCByc2FfZXhwb25lbnQsIHNpemVvZihyc2FfZXhwb25lbnQpKSkKKyAgICB7CisgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19oYW5kc2hha2VfbGVuZ3RoKGxpbmtfcmVjLCBidWYsIHN0YXJ0LCBsZW4pOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhY2tfY2VydF9yZXFfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDhfdCAqbGVuOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIHN0YXJ0ID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpOworICAgIGlmIChiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgSFNfQ0VSVElGSUNBVEVfUkVRVUVTVCkgJiYKKyAgICAgICAgKGxlbiA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKSwgYmNtb2x0X2J1Zl9za2lwKGJ1Ziwgc2l6ZW9mKHVpbnQyNF90KSkpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAxKSAmJiAvKiBsZW5ndGggb2YgJ0NlcnRpZmljYXRlIFR5cGUnICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBSU0FfU0lHTikgJiYgLyogQ2VydGlmaWNhdGUgVHlwZSAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShidWYsIDApKSAvKiB6ZXJvIGxlbmd0aCBmb3IgY2VydCBhdXRob3JpdGllcyAqLworICAgIHsKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX2hhbmRzaGFrZV9sZW5ndGgobGlua19yZWMsIGJ1Ziwgc3RhcnQsIGxlbik7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFja19zZXJ2ZXJfaGVsbG9fZG9uZV9ocyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90ICpzdGFydDsKKyAgICB1aW50OF90ICpsZW47CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgc3RhcnQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgaWYgKGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBIU19TRVJWRVJfSEVMTE9fRE9ORSkgJiYKKyAgICAgICAgKGxlbiA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKSwgYmNtb2x0X2J1Zl9za2lwKGJ1Ziwgc2l6ZW9mKHVpbnQyNF90KSkpKQorICAgIHsKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX2hhbmRzaGFrZV9sZW5ndGgobGlua19yZWMsIGJ1Ziwgc3RhcnQsIGxlbik7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFja19maW5pc2hlZF9ocyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90ICpzdGFydDsKKyAgICB1aW50OF90ICpsZW47CisKKyAgICBzdGFydCA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKTsKKyAgICBpZiAoYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIEhTX0ZJTklTSEVEKSAmJgorICAgICAgICAobGVuID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpLCBiY21vbHRfYnVmX3NraXAoYnVmLCBzaXplb2YodWludDI0X3QpKSkpCisgICAgeworICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfaGFuZHNoYWtlX2xlbmd0aChsaW5rX3JlYywgYnVmLCBzdGFydCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19wYWNrX21zZ19sZW5ndGhzKGJjbW9sdF9idWYgKmJ1ZiwgdWludDhfdCBlYXBfdGxzX2ZsYWdzLCBlYXBfbGVuZ3RoX2ZpZWxkcyAqbGYpCit7CisgICAgdWludDE2X3QgZWFwb2xfbGVuZ3RoOworICAgIHVpbnQzMl90IGVhcF90bHNfbGVuZ3RoOworICAgIHVpbnQ4X3QgKnNuYXAgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisgICAgQlVHX09OKGxmID09IE5VTEwpOworCisgICAgZWFwb2xfbGVuZ3RoID0gYmNtb2x0X2J1Zl9nZXRfdXNlZChidWYpIC0gRUFQT0xfTVNHX0hEUl9TSVpFOworCisgICAgLyogU2VlbXMgb2RkIHRoYXQgdGhlc2UgdHdvIHdvdWxkIGJlIHRoZSBzYW1lLiBCdXQgZWFwb2xMZW5ndGggaXMgZGVmaW5lZCBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBib2R5IGZpZWxkcyBvZiB0aGUKKyAgICAgICBFYXBvbCBidWZmZXIsIHdoaWNoIGRvZXMgbm90IGluY2x1ZGUgdGhlIEVhcG9sIGhlYWRlci4gRUFQIGlzIGRpZmZlcmVudCwgdGhlIEVBUCBsZW5ndGggaXMgZGVmaW5lIHRvIGluY2x1ZGUgdGhlCisgICAgICAgZW50aXJlIEVBUCBwYWNrZXQsIGluY2x1ZGluZyB0aGUgaGVhZGVyLiAqLworICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1ZiwgbGYtPmVhcG9sKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKGJ1ZiwgZWFwb2xfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1Ziwgc25hcCk7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfYnVmX3NuYXBfcmVzdG9yZShidWYsIGxmLT5lYXApOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoYnVmLCBlYXBvbF9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBzbmFwKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZWFwX3Rsc19mbGFncyAmIEVBUF9UTFNfRkxBR19MRU5HVEhfQklUKSA9PSBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCkKKyAgICB7CisgICAgICAgIC8qIFRoZSBUTFMgbWVzc2FnZSBsZW5ndGggLSB0YWtlIGF3YXkgdGhlIEVhcFRsc0hkciwgQU5EIHRoZSBFYXBNc2dIZHIgd2hpY2gsIHN1cnByaXNpbmdseSB3YXMgbm90IHJlbW92ZWQgaW4KKyAgICAgICAgICAgdGhlIHByZXZpb3VzIHN0ZXAuICovCisgICAgICAgIGVhcF90bHNfbGVuZ3RoID0gZWFwb2xfbGVuZ3RoIC0gKEVBUF9GUkFNRV9TSVpFICsgRUFQX1RMU19IRFJfU0laRSArIHNpemVvZih1aW50MzJfdCkpOworCisgICAgICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1ZiwgbGYtPmVhcF90bHMpOworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKGJ1ZiwgZWFwX3Rsc19sZW5ndGgpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfYnVmX3NuYXBfcmVzdG9yZShidWYsIHNuYXApOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBsZi0+dGxzX3JlYyk7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoYnVmLCAodWludDE2X3QpZWFwX3Rsc19sZW5ndGggLSBUTFNfUkVDT1JEX0hEUl9TSVpFKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBzbmFwKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1Ziwgc25hcCk7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9lYXBfdGxzX3BhY2tfc3RhcnQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX05PTUVNOworICAgIHVpbnQ4X3QgZmxhZ3MgPSBFQVBfVExTX0ZMQUdfU1RBUlRfQklUOworICAgIGVhcF9sZW5ndGhfZmllbGRzIGxmOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIGlmIChfZHBvZV9lYXBfdGxzX2luaXRfZWFwX2hkcihsaW5rX3JlYywgYnVmLCBFQVBfQ09ERV9SRVFVRVNULCAmbGYpICYmCisgICAgICAgIF9kcG9lX2VhcF90bHNfaW5pdF90bHNfaGRyKGJ1ZiwgZmxhZ3MsICZsZikgJiYKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX21zZ19sZW5ndGhzKGJ1ZiwgZmxhZ3MsICZsZikpCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3NlbmRfY2VydF9yZXF1ZXN0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19ib29sIHJjID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIHVpbnQ4X3QgKm1zZyA9IE5VTEw7CisgICAgZWFwX2xlbmd0aF9maWVsZHMgbGY7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIG1zZyA9IGJjbW9zX2NhbGxvYyhFQVBPTF9QS1RfU0laRSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIG1heGltdW0gc3VwcG9ydGVkIGxlbmd0aCBFQVAtVExTIG1lc3NhZ2UgYnVmZmVyLiBUaGUgdmFyaW91cyBUTFMgcmVjb3JkcyBjb250YWluZWQgaW4gYW4gRUFQLVRMUworICAgICAgIG1lc3NhZ2UgYXJlIHZhcmlhYmxlIHNpemUuIEhvd2V2ZXIsIHRoaXMgY2FuIG9ubHkgYmUgYSBjb21iaW5lZCBtYXhpbXVtIGxlbmd0aC4gKi8KKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgRUFQT0xfUEtUX1NJWkUsIG1zZywgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmIChfZHBvZV9lYXBfdGxzX2luaXRfZWFwX2hkcihsaW5rX3JlYywgJmJ1ZiwgRUFQX0NPREVfUkVRVUVTVCwgJmxmKSAmJgorICAgICAgICBfZHBvZV9lYXBfdGxzX2luaXRfdGxzX2hkcigmYnVmLCBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCwgJmxmKSkKKyAgICB7CisgICAgICAgIC8qIFRoZSBDZXJ0IHJlcXVlc3QgY29udGFpbnMgMyBvciA0IFRMUyByZWNvcmRzICgzIGZvciBEUy1vbmx5IGFuZCA0IGZvciBiaS1kaXJlY3Rpb25hbCkuIFRoZSBUTFMgcmVjb3JkcyBhcmUKKyAgICAgICAgICAgb3JkZXJlZCBhczoKKyAgICAgICAgICAgLSBTZXJ2ZXIgSGVsbG8KKyAgICAgICAgICAgLSBTZXJ2ZXIgS2V5IEV4Y2hhbmdlIChpZiBiaS1kaXJlY3Rpb25hbCkKKyAgICAgICAgICAgLSBDZXJ0aWZpY2F0ZSBSZXF1ZXN0CisgICAgICAgICAgIC0gU2VydmVyIEhlbGxvIERvbmUgKi8KKyAgICAgICAgaWYgKF9kcG9lX2VhcF90bHNfcGFja19zZXJ2ZXJfaGVsbG9faHMobGlua19yZWMsICZidWYpICYmCisgICAgICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfc2VydmVyX2tleV9leGNoYW5nZV9ocyhsaW5rX3JlYywgJmJ1ZikgJiYKKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19jZXJ0X3JlcV9ocyhsaW5rX3JlYywgJmJ1ZikgJiYKKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19zZXJ2ZXJfaGVsbG9fZG9uZV9ocyhsaW5rX3JlYywgJmJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19tc2dfbGVuZ3RocygmYnVmLCBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCwgJmxmKTsKKworICAgICAgICAgICAgLyogU2VuZCB0aGUgbWVzc2FnZSAqLworICAgICAgICAgICAgZXJyID0gZHBvZV9zZWNfc2VuZF9lYXBvbChsaW5rX3JlYy0+ZGV2aWNlLCAmbGlua19yZWMtPmtleSwgbXNnLCBiY21vbHRfYnVmX2dldF91c2VkKCZidWYpKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vc19mcmVlKG1zZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBoYXMgYmVndW4uICovCisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID0gRFBPRV9PTlVfQVVUSF9TVEFURV9FQVBfU1RBUlQ7CisgICAgICAgICAgICByYyA9IEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGcmVlIHRoZSBtZXNzYWdlLiAqLworICAgIGJjbW9zX2ZyZWUobXNnKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX2VhcF90bHNfc2VuZF9maW5pc2hlZF9ocyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09WRVJGTE9XOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIHVpbnQ4X3QgKm1zZyA9IE5VTEw7CisgICAgZWFwX2xlbmd0aF9maWVsZHMgbGY7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIG1zZyA9IGJjbW9zX2NhbGxvYyhFQVBPTF9QS1RfU0laRSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgRUFQLVRMUyBtZXNzYWdlIGJ1ZmZlci4gKi8KKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgRUFQT0xfUEtUX1NJWkUsIG1zZywgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmIChfZHBvZV9lYXBfdGxzX2luaXRfZWFwX2hkcihsaW5rX3JlYywgJmJ1ZiwgRUFQX0NPREVfUkVRVUVTVCwgJmxmKSAmJgorICAgICAgICBfZHBvZV9lYXBfdGxzX2luaXRfdGxzX2hkcigmYnVmLCBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCwgJmxmKSAmJgorICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfZmluaXNoZWRfaHMobGlua19yZWMsICZidWYpKQorICAgIHsKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX21zZ19sZW5ndGhzKCZidWYsIEVBUF9UTFNfRkxBR19MRU5HVEhfQklULCAmbGYpOworICAgICAgICAvKiBObyBlcnJvciBkZXRlY3Rpb24gaGVyZS4gV2UgaGF2ZSBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQuIHRoaXMgbWVzc2FnZSBpcyBqdXN0IGZvciBzdGFuZGFyZHMgY29tcGxpYW5jZSAqLworICAgICAgICByYyA9IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIG1zZywgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmYnVmKSk7CisgICAgfQorCisgICAgLyogRnJlZSB0aGUgbWVzc2FnZS4gKi8KKyAgICBiY21vc19mcmVlKG1zZyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9lYXBfdGxzX3NlbmRfcmVzdWx0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZWFwX2NvZGUgcmVzdWx0KQoreworICAgIHVpbnQ4X3QgKm1zZzsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgZWFwX2xlbmd0aF9maWVsZHMgbGY7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgbXNnID0gYmNtb3NfY2FsbG9jKEVBUE9MX1BLVF9TSVpFKTsKKyAgICBpZiAobXNnID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBFQVAtVExTIG1lc3NhZ2UgYnVmZmVyLiAqLworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBFQVBPTF9QS1RfU0laRSwgbXNnLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgLyogRW5jb2RlIHRoZSBFQVAtU3VjY2VzcyBtZXNzYWdlIHRvIHRoZSBidWZmZXIuICovCisgICAgaWYgKF9kcG9lX2VhcF90bHNfaW5pdF9lYXBfaGRyKGxpbmtfcmVjLCAmYnVmLCByZXN1bHQsICZsZikgJiYKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX21zZ19sZW5ndGhzKCZidWYsIDAsICZsZikpCisgICAgeworICAgICAgICByYyA9IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIG1zZywgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmYnVmKSk7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShtc2cpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhcnNlX2NlcnRpZmljYXRlKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGJjbW9zX2Jvb2wgICAgICAgICAgICByYyA9IEJDTU9TX0ZBTFNFOworICAgIHVpbnQyNF90IGxlbmd0aDsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLmNlcnRpZmljYXRlID0gYmNtb3NfY2FsbG9jKEVBUE9MX1BLVF9TSVpFKTsKKyAgICBpZiAobGlua19yZWMtPmF1dGhfY3RybC5jZXJ0aWZpY2F0ZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChiY21vbHRfYnVmX3JlYWRfdTI0KGJ1ZiwgJmxlbmd0aCkgJiYKKyAgICAgICAgKChsaW5rX3JlYy0+YXV0aF9jdHJsLmNlcnRMZW4gPSAodWludDE2X3QpdWludDI0X3RvXzMyKGxlbmd0aCkpLCAobGlua19yZWMtPmF1dGhfY3RybC5jZXJ0TGVuIDw9IEVBUE9MX1BLVF9TSVpFKSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgbGlua19yZWMtPmF1dGhfY3RybC5jZXJ0aWZpY2F0ZSwgbGlua19yZWMtPmF1dGhfY3RybC5jZXJ0TGVuKSkKKyAgICB7CisgICAgICAgIHJjID0gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFyc2VfY2xpZW50X2tleV9leGNoYW5nZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBiY21vc19ib29sIHJjID0gQkNNT1NfRkFMU0U7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgZW5jcnlwdGVkX2J1ZltTSVpFX09GX1JTQV9FTkNSWVBURURfQkxPQ0tdID0ge307CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgaWYgKGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYnVmLCAmbGVuZ3RoKSAmJgorICAgICAgICAobGVuZ3RoID09IChTSVpFX09GX1JTQV9FTkNSWVBURURfQkxPQ0spKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWQoYnVmLCBlbmNyeXB0ZWRfYnVmLCBzaXplb2YoZW5jcnlwdGVkX2J1ZikpKQorICAgIHsKKyAgICAgICAgaW50IHZhbDsKKworICAgICAgICB2YWwgPSBkcG9lX3NlY19yc2FfcHJpdmF0ZV9kZWNyeXB0KAorICAgICAgICAgICAgc2l6ZW9mKGVuY3J5cHRlZF9idWYpLAorICAgICAgICAgICAgZW5jcnlwdGVkX2J1ZiwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5wcmVfbWFzdGVyX3NlY3JldCwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5yc2EpOworCisgICAgICAgIGlmICh2YWwgPT0gU0laRV9PRl9QUkVfTUFTVEVSX1NFQ1JFVCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2Ugbm93IG5lZWQgdGhlIHNlY3VyaXR5IGRhdGEgLSB3ZSBoYXZlIHRoZSAiY2xpZW50IHJhbmRvbSIsICJzZXJ2ZXIgcmFuZG9tIiwgYW5kICJwcmUgbWFzdGVyIHNlY3JldCIuICovCisgICAgICAgICAgICBfZHBvZV9lYXBfdGxzX3ByZXBhcmVfc2VjdXJpdHlfZGF0YShsaW5rX3JlYyk7CisgICAgICAgICAgICByYyA9IEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJSU0EgZGVjcnlwdCBwcmUtbWFzdGVyIHNlY3JldCBmYWlsZWQ6ICVkXG4iLCB2YWwpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIkZhaWxlZCB0byBwYXJzZSBjbGllbnQga2V5IGV4Y2hhbmdlOiAldVxuIiwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFyc2VfY2VydF92ZXJpZnkoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGJjbW9zX2Jvb2wgcmV0ID0gQkNNT1NfRkFMU0U7CisKKyAgICBpZiAoYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICZsZW5ndGgpICYmCisgICAgICAgIChsZW5ndGggPD0gKDIgKiBTSVpFX09GX1JTQV9FTkNSWVBURURfQkxPQ0spKSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWYgY2VydF9idWY7CisgICAgICAgIHVpbnQyNF90IHRlbXA7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNlcnQ7CisgICAgICAgIHVpbnQzMl90IGNlcnRfbGVuID0gMDsKKyAgICAgICAgdWludDhfdCBjZXJ0X3ZlcmlmeVtzaXplb2YoZHBvZV9zZWNfc2hhMV9kaWdlc3QpICsgc2l6ZW9mKGRwb2Vfc2VjX21kNV9kaWdlc3QpXTsKKyAgICAgICAgdWludDhfdCAqZW5jX2J1ZjsKKyAgICAgICAgZHBvZV9zZWNfcnNhX2tleSAqcnNhOworCisgICAgICAgIGJjbW9sdF9idWZfaW5pdCgmY2VydF9idWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydExlbiwgbGlua19yZWMtPmF1dGhfY3RybC5jZXJ0aWZpY2F0ZSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworCisgICAgICAgIC8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgT05VIGNlcnQgYW5kIGl0cyBsZW5ndGggKi8KKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UyNCgmY2VydF9idWYsICZ0ZW1wKTsKKyAgICAgICAgY2VydF9sZW4gPSB1aW50MjRfdG9fMzIodGVtcCk7CisgICAgICAgIGNlcnQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KCZjZXJ0X2J1Zik7CisKKyAgICAgICAgZW5jX2J1ZiA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKTsKKworICAgICAgICAvKiBHZXQgdGhlIHB1YmxpYyBrZXkgZnJvbSB0aGUgT05VIGNlcnQuICovCisgICAgICAgIHJzYSA9IGRwb2Vfc2VjX3g1MDlfcHViX2tleV9nZXQoY2VydCwgY2VydF9sZW4pOworCisgICAgICAgIC8qIGRlY3J5cHQgdGhlIHJlbWFpbmRlciBvZiB0aGUgYnVmIHdpdGggdGhlIE9OVSBjZXJ0LiAqLworICAgICAgICBpZiAocnNhICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkcG9lX3NlY19yc2FfcHVibGljX2RlY3J5cHQobGVuZ3RoLCBlbmNfYnVmLCBjZXJ0X3ZlcmlmeSwgcnNhKSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJTQV9zaXplKCkgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbW9kdWx1cyBpbiBieXRlcy4gQ29udmVydCB0byBiaXRzLiAqLworICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2NlcnRfa2V5X3NpemUgPSBkcG9lX3NlY19yc2Ffc2l6ZShyc2EpICogODsKKworICAgICAgICAgICAgICAgIC8qIENvbXBhcmUgdGhlIG91dHB1dCAoc2hvdWxkIGJlIDM2IGJ5dGVzKSB0byBzaGExL21kNSBtZXNzYWdlcyBkaWdlc3RzIElmIHRoZXkgbWF0Y2gsIHdlIGFyZSBnb29kICovCisgICAgICAgICAgICAgICAgaWYgKChtZW1jbXAoJmNlcnRfdmVyaWZ5WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5tZDVfZGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkcG9lX3NlY19tZDVfZGlnZXN0KSkgPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1lbWNtcCgmY2VydF92ZXJpZnlbc2l6ZW9mKGRwb2Vfc2VjX21kNV9kaWdlc3QpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2hhMV9kaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRwb2Vfc2VjX3NoYTFfZGlnZXN0KSkgPT0gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX2luaXQoJmNlcnRfYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLmNlcnRMZW4sIGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydGlmaWNhdGUsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIE9OVSBjZXJ0aWZpY2F0ZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UyNCgmY2VydF9idWYsICZ0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfY2VydF9sZW4gPSB1aW50MjRfdG9fMzIodGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2NlcnQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KCZjZXJ0X2J1Zik7CisKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9za2lwKCZjZXJ0X2J1ZiwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfY2VydF9sZW4pOworCisgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgTWFudWZhY3R1cmVyIENBIGNlcnRpZmljYXRlLiAqLworICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTI0KCZjZXJ0X2J1ZiwgJnRlbXApOworICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm1mZ19jZXJ0X2xlbiA9IHVpbnQyNF90b18zMih0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5tZmdfY2VydCA9IGJjbW9sdF9idWZfc25hcF9nZXQoJmNlcnRfYnVmKTsKKworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJDZXJ0IFZlcmlmeSBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJSU0EgcHVibGljIGRlY3J5cHQvdmVyaWZ5IGZhaWxlZFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJGYWlsZWQgdG8gcmV0cmlldmUgUlNBIGtleVxuIik7CisgICAgICAgIH0KKworICAgICAgICBkcG9lX3NlY19yc2Ffa2V5X2ZyZWUocnNhKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhcnNlX3ZlcmlmeV9kYXRhKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19ib29sIHJjID0gQkNNT1NfRkFMU0U7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIGlmIChsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IgPT0gVExTX01JTk9SX1ZFUlNJT04pCisgICAgeworICAgICAgICAvKiBUaGlzIHZlcnNpb24gb2YgYXV0aGVudGljYXRpb24gZG9lcyBub3QgcGFyc2UgdmVyaWZ5IGRhdGEgKi8KKyAgICAgICAgcmMgPSBCQ01PU19UUlVFOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFyc2VfY2xpZW50X2hlbGxvKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHRsc19wcm90b2NvbF92ZXJzaW9uIHZlcnNpb247CisgICAgdGxzX3Nlc3Npb25faWQgc2Vzc2lvbl9pZDsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICBpZiAoYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnZlcnNpb24ubWFqb3IpICYmCisgICAgICAgICh2ZXJzaW9uLm1ham9yID09IFRMU19NQUpPUl9WRVJTSU9OKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdmVyc2lvbi5taW5vcikgJiYKKyAgICAgICAgKHZlcnNpb24ubWlub3IgPj0gVExTX01JTk9SX1ZFUlNJT04pICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZChidWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5jbGllbnRfcmFuZG9tLCBDT1VOVF9PRl9SQU5ET01fQllURVMpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZzZXNzaW9uX2lkLmxlbmd0aCkgJiYKKyAgICAgICAgKHNlc3Npb25faWQubGVuZ3RoIDw9IHNpemVvZihzZXNzaW9uX2lkLnNlc3Npb25faWQpKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWQoYnVmLCBzZXNzaW9uX2lkLnNlc3Npb25faWQsIHNlc3Npb25faWQubGVuZ3RoKSkKKyAgICB7CisgICAgICAgIGNvbXByZXNzaW9uX21ldGhvZHMgY29tcF9tZXRob2RzOworICAgICAgICB1aW50MTZfdCB0bHZMZW47CisgICAgICAgIHVpbnQ4X3QgY2lwaGVyX3N1aXRlc1syXTsKKyAgICAgICAgdWludDhfdCAqY21fc25hcCA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKTsKKworICAgICAgICBtZW1zZXQoJmNvbXBfbWV0aG9kcywgMCwgc2l6ZW9mKGNvbXBfbWV0aG9kcykpOworCisgICAgICAgIC8qIENpcGhlciBTdWl0ZXMgbWF5IGJlIHByZXNlbnQgLWlmIHNvIHBhcnNlIG92ZXIgaXQgYW5kIGl0IHdpbGwgYmUgaWdub3JlZC4gU3RpbGwgY2hlY2sgdGhhdCBjb21wIG1ldGhvZHMgaXMKKyAgICAgICAgICAgTlVMTCAqLworICAgICAgICBpZiAoYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICZ0bHZMZW4pICYmIC8qIENpcGhlciBTdWl0ZXMgKi8KKyAgICAgICAgICAgICh0bHZMZW4gPD0gc2l6ZW9mKHVpbnQxNl90KSkgJiYKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZChidWYsIGNpcGhlcl9zdWl0ZXMsIHRsdkxlbikgJiYKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZjb21wX21ldGhvZHMubGVuZ3RoKSAmJiAvKiBDb21wcmVzc2lvbiBNZXRob2RzICovCisgICAgICAgICAgICAoY29tcF9tZXRob2RzLmxlbmd0aCA9PSBzaXplb2YoY29tcF9tZXRob2RzLmNvbXByZXNzaW9uX21ldGhvZCkpICYmCisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoYnVmLCAmY29tcF9tZXRob2RzLmNvbXByZXNzaW9uX21ldGhvZCwgY29tcF9tZXRob2RzLmxlbmd0aCkgJiYKKyAgICAgICAgICAgIChjb21wX21ldGhvZHMuY29tcHJlc3Npb25fbWV0aG9kID09IGNtX251bGwpICkKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC52ZXJzaW9uLm1ham9yID0gdmVyc2lvbi5tYWpvcjsKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vciA9IHZlcnNpb24ubWlub3I7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vIGNpcGhlciBzdWl0ZXMsIGNoZWNrIHRoYXQgY29tcCBtZXRob2QgaXMgbnVsbCAqLworICAgICAgICBtZW1zZXQoJmNvbXBfbWV0aG9kcywgMCwgc2l6ZW9mKGNvbXBfbWV0aG9kcykpOworICAgICAgICBiY21vbHRfYnVmX3NuYXBfcmVzdG9yZShidWYsIGNtX3NuYXApOworICAgICAgICBpZiAoYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJmNvbXBfbWV0aG9kcy5sZW5ndGgpICYmICAvKiBDb21wcmVzc2lvbiBNZXRob2RzICovCisgICAgICAgICAgIChjb21wX21ldGhvZHMubGVuZ3RoID09IHNpemVvZihjb21wX21ldGhvZHMuY29tcHJlc3Npb25fbWV0aG9kKSkgJiYKKyAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgJmNvbXBfbWV0aG9kcy5jb21wcmVzc2lvbl9tZXRob2QsIGNvbXBfbWV0aG9kcy5sZW5ndGgpICYmCisgICAgICAgICAgIChjb21wX21ldGhvZHMuY29tcHJlc3Npb25fbWV0aG9kID09IGNtX251bGwpICkKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC52ZXJzaW9uLm1ham9yID0gdmVyc2lvbi5tYWpvcjsKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vciA9IHZlcnNpb24ubWlub3I7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE9rIHdlIGZhaWxlZCB0byBkZWNvZGUgd2hhdCB3YXMgc2VudCBhcyBjaXBoZXIgc3VpdGVzIGFuZCBjb21wIG1ldGhvZHMuIERvIHdlIGNhcmU/IEFic29sdXRlbHkgTm90ISAqLworICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWFqb3IgPSB2ZXJzaW9uLm1ham9yOworICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IgPSB2ZXJzaW9uLm1pbm9yOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfaGFuZGxlX2NsaWVudF9oZWxsb19ocyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgaWYgKF9kcG9lX2VhcF90bHNfcGFyc2VfY2xpZW50X2hlbGxvKGxpbmtfcmVjLCBidWYpKQorICAgIHsKKyAgICAgICAgLyogV2Ugbm93IGhhdmUgdGhlIGRhdGEsIGJ1aWxkIHRoZSBFQVAgc2Vzc2lvbiBJRCAoc2VlIFJGQyA1MjE2KSAqLworICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2Vzc2lvbl9pZFswXSA9IDB4ZDsKKyAgICAgICAgbWVtY3B5KAorICAgICAgICAgICAgJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXNzaW9uX2lkWzFdLAorICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLmNsaWVudF9yYW5kb20sCisgICAgICAgICAgICBDT1VOVF9PRl9SQU5ET01fQllURVMpOworICAgICAgICBtZW1jcHkoCisgICAgICAgICAgICAmbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNlc3Npb25faWRbQ09VTlRfT0ZfUkFORE9NX0JZVEVTICsgMV0sCisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2VydmVyX3JhbmRvbSwKKyAgICAgICAgICAgIENPVU5UX09GX1JBTkRPTV9CWVRFUyk7CisKKyAgICAgICAgaWYgKF9kcG9lX2VhcF90bHNfc2VuZF9jZXJ0X3JlcXVlc3QobGlua19yZWMpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID0gRFBPRV9PTlVfQVVUSF9TVEFURV9DRVJUX1JFUVVFU1Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19oYW5kbGVfY2VydGlmaWNhdGVfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIGlmIChfZHBvZV9lYXBfdGxzX3BhcnNlX2NlcnRpZmljYXRlKGxpbmtfcmVjLCBidWYpKQorICAgIHsKKyAgICAgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vciA9PSBUTFNfTUlOT1JfVkVSU0lPTikKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfQ0VSVF9SRUNFSVZFRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfaGFuZGxlX2NsaWVudF9rZXlfZXhjaGFuZ2VfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIGlmIChfZHBvZV9lYXBfdGxzX3BhcnNlX2NsaWVudF9rZXlfZXhjaGFuZ2UobGlua19yZWMsIGJ1ZikpCisgICAgeworICAgICAgICBpZiAobGlua19yZWMtPmF1dGhfY3RybC52ZXJzaW9uLm1pbm9yID09IFRMU19NSU5PUl9WRVJTSU9OKQorICAgICAgICB7CisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID0gRFBPRV9PTlVfQVVUSF9TVEFURV9DTElFTlRfS0VZX1JFQ0VJVkVEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJXcm9uZyBUTFMgdmVyc2lvbiBpbiBjbGllbnQga2V5IGV4Y2hhbmdlOiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vcik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiRmFpbGVkIHRvIHBhcnNlIGNsaWVudCBrZXkgZXhjaGFuZ2VcbiIpOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19oYW5kbGVfY2VydF92ZXJpZnlfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgYmNtb3NfYm9vbCBzdWNjZXNzOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIHN1Y2Nlc3MgPSBfZHBvZV9lYXBfdGxzX3BhcnNlX2NlcnRfdmVyaWZ5KGxpbmtfcmVjLCBidWYpOworCisgICAgaWYgKHN1Y2Nlc3MpCisgICAgeworICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID0gRFBPRV9PTlVfQVVUSF9TVEFURV9DRVJUX1ZBTElEQVRFRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfRkFJTEVEOworICAgICAgICBpZiAoX2F1dGhfY29tcGxldGUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgX2F1dGhfY29tcGxldGUobGlua19yZWMsIEJDTV9FUlJfT05VX0VSUl9SRVNQKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdWNjZXNzOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX2hhbmRsZV9maW5pc2hlZF9ocyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfYm9vbCBzdWNjZXNzOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICBzdWNjZXNzID0gX2Rwb2VfZWFwX3Rsc19wYXJzZV92ZXJpZnlfZGF0YShsaW5rX3JlYyk7CisKKyAgICAvKiBBbmQgc2VuZCB0aGUgZmluYWwgRmluaXNoZWQgSHMgdG8gdGhlIE9OVSAqLworICAgIGlmIChsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IgPT0gVExTX01JTk9SX1ZFUlNJT04pCisgICAgeworICAgICAgICBfZHBvZV9lYXBfdGxzX3NlbmRfZmluaXNoZWRfaHMobGlua19yZWMpOworICAgIH0KKworICAgIGlmIChzdWNjZXNzKQorICAgIHsKKyAgICAgICAgaWYgKChfY2VydF90cnVzdCA9PSBOVUxMKSB8fCAoX2NlcnRfdHJ1c3QobGlua19yZWMpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDsKKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfc2VuZF9yZXN1bHQobGlua19yZWMsIEVBUF9DT0RFX1NVQ0NFU1MpOworICAgICAgICAgICAgaWYgKF9hdXRoX2NvbXBsZXRlICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2F1dGhfY29tcGxldGUobGlua19yZWMsIEJDTV9FUlJfT0spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfRkFJTEVEOworICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19zZW5kX3Jlc3VsdChsaW5rX3JlYywgRUFQX0NPREVfRkFJTFVSRSk7CisgICAgICAgICAgICBzdWNjZXNzID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICBpZiAoX2F1dGhfY29tcGxldGUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYXV0aF9jb21wbGV0ZShsaW5rX3JlYywgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVzZXQgQUxMIHRoZSBzdGF0ZSB2YXJpYWJsZXMhICovCisgICAgICAgIG1lbXNldCgmbGlua19yZWMtPmF1dGhfY3RybCwgMCwgc2l6ZW9mKGxpbmtfcmVjLT5hdXRoX2N0cmwpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19hbGxvY190bHNfZnJhZ19idWZmZXIob251X2F1dGhfY29udHJvbCAqYXV0aF9jdHJsKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGF1dGhfY3RybCA9PSBOVUxMKTsKKworICAgIGlmIChhdXRoX2N0cmwtPnRsc19mcmFnX2J1ZmZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXV0aF9jdHJsLT50bHNfZnJhZ19idWZmZXIgPSBiY21vc19jYWxsb2MoRUFQT0xfUEtUX1NJWkUpOworICAgICAgICBhdXRoX2N0cmwtPnRsc19mcmFnX2xlbmd0aCA9IDA7CisgICAgICAgIGF1dGhfY3RybC0+dGxzX3RvdGFsX2xlbmd0aCA9IDA7CisgICAgfQorCisgICAgaWYgKGF1dGhfY3RybC0+dGxzX2ZyYWdfYnVmZmVyID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX2VhcF90bHNfZnJlZV90bHNfZnJhZ19idWZmZXIob251X2F1dGhfY29udHJvbCAqYXV0aF9jdHJsKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGF1dGhfY3RybCA9PSBOVUxMKTsKKworICAgIGlmIChhdXRoX2N0cmwtPnRsc19mcmFnX2J1ZmZlciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShhdXRoX2N0cmwtPnRsc19mcmFnX2J1ZmZlcik7CisgICAgICAgIGF1dGhfY3RybC0+dGxzX2ZyYWdfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgYXV0aF9jdHJsLT50bHNfZnJhZ19sZW5ndGggPSAwOworICAgICAgICBhdXRoX2N0cmwtPnRsc190b3RhbF9sZW5ndGggPSAwOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX2VhcF90bHNfc2VuZF90bHNfZnJhZ19hY2tfdG9fb251KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICB1aW50OF90ICptc2c7CisgICAgZWFwX2xlbmd0aF9maWVsZHMgbGY7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIC8qIEFsbG9jYXRlIGEgbWVzc2FnZSBidWZmZXIgKi8KKyAgICBtc2cgPSBiY21vc19jYWxsb2MoRUFQT0xfUEtUX1NJWkUpOworICAgIGlmIChOVUxMID09IG1zZykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIEVBUC1UTFMgYnVmZmVyLiAqLworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBFQVBPTF9QS1RfU0laRSwgbXNnLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgaWYgKF9kcG9lX2VhcF90bHNfaW5pdF9lYXBfaGRyKGxpbmtfcmVjLCAmYnVmLCBFQVBfQ09ERV9SRVFVRVNULCAmbGYpICYmCisgICAgICAgIF9kcG9lX2VhcF90bHNfaW5pdF90bHNfaGRyKCZidWYsIDAsICZsZikgJiYKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX21zZ19sZW5ndGhzKCZidWYsIDAsICZsZikpCisgICAgeworICAgICAgICAvKiBTZW5kIHRoZSBtZXNzYWdlICovCisgICAgICAgIHJjID0gZHBvZV9zZWNfc2VuZF9lYXBvbChsaW5rX3JlYy0+ZGV2aWNlLCAmbGlua19yZWMtPmtleSwgbXNnLCBiY21vbHRfYnVmX2dldF91c2VkKCZidWYpKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUobXNnKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShtc2cpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3VucGFja190bHNfaGFuZHNoYWtlKGJjbW9sdF9idWYgKmJ1ZiwgdGxzX2hhbmRzaGFrZSogaHMpCit7CisgICAgdWludDI0X3QgdGVtcDsKKyAgICBiY21vc19ib29sIHJjID0gQkNNT1NfRkFMU0U7CisKKyAgICBpZiAoYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJmhzLT5tc2dfaWQpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MjQoYnVmLCAmdGVtcCkpCisgICAgeworICAgICAgICBocy0+bXNnX2xlbmd0aCA9IHVpbnQyNF90b18zMih0ZW1wKTsKKyAgICAgICAgcmMgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX2VhcF90bHNfcnVuX2F1dGhfc3RhdGVfbWFjaGluZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDhfdCAqaHNfc25hcDsKKyAgICB0bHNfaGFuZHNoYWtlIGhhbmRzaGFrZTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgd2hpbGUgKGhzX3NuYXAgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1ZiksIF9kcG9lX2VhcF90bHNfdW5wYWNrX3Rsc19oYW5kc2hha2UoYnVmLCAmaGFuZHNoYWtlKSkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgc3VjY2VzcyA9IEJDTU9TX1RSVUU7CisKKyAgICAgICAgaWYgKGhhbmRzaGFrZS5tc2dfbGVuZ3RoID4gRUFQT0xfUEtUX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkhhbmRzaGFrZSBsZW5ndGggaXMgaW5zYW5lOiBtc2cgJXUsIGxlbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZS5tc2dfaWQsIGhhbmRzaGFrZS5tc2dfbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChoYW5kc2hha2UubXNnX2lkID09IEhTX0NMSUVOVF9IRUxMTykgJiYKKyAgICAgICAgICAgIChsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID09IERQT0VfT05VX0FVVEhfU1RBVEVfRUFQX1NUQVJUKSkKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiRUFQIFRMUyBSWCBtc2cgJXUgaW4gc3RhdGUgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UubXNnX2lkLCBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlKTsKKyAgICAgICAgICAgIF9idWZmZXJfaGFzaF9kYXRhKGxpbmtfcmVjLCBoc19zbmFwLCBoYW5kc2hha2UubXNnX2xlbmd0aCArIFRMU19IQU5EU0hBS0VfU0laRSk7CisgICAgICAgICAgICBzdWNjZXNzID0gX2Rwb2VfZWFwX3Rsc19oYW5kbGVfY2xpZW50X2hlbGxvX2hzKGxpbmtfcmVjLCBidWYpOworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiTmV3IGF1dGggc3RhdGUgJXVcbiIsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChoYW5kc2hha2UubXNnX2lkID09IEhTX0NFUlRJRklDQVRFKSAmJgorICAgICAgICAgICAgICAgICAobGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9PSBEUE9FX09OVV9BVVRIX1NUQVRFX0NFUlRfUkVRVUVTVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkVBUCBUTFMgUlggbXNnICV1IGluIHN0YXRlICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlLm1zZ19pZCwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSk7CisgICAgICAgICAgICBfYnVmZmVyX2hhc2hfZGF0YShsaW5rX3JlYywgaHNfc25hcCwgaGFuZHNoYWtlLm1zZ19sZW5ndGggKyBUTFNfSEFORFNIQUtFX1NJWkUpOworICAgICAgICAgICAgc3VjY2VzcyA9IF9kcG9lX2VhcF90bHNfaGFuZGxlX2NlcnRpZmljYXRlX2hzKGxpbmtfcmVjLCBidWYpOworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiTmV3IGF1dGggc3RhdGUgJXVcbiIsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChoYW5kc2hha2UubXNnX2lkID09IEhTX0NMSUVOVF9LRVlfRVhDSEFOR0UpICYmCisgICAgICAgICAgICAgICAgIChsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID09IERQT0VfT05VX0FVVEhfU1RBVEVfQ0VSVF9SRUNFSVZFRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkVBUCBUTFMgUlggbXNnICV1IGluIHN0YXRlICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlLm1zZ19pZCwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSk7CisgICAgICAgICAgICBfYnVmZmVyX2hhc2hfZGF0YShsaW5rX3JlYywgaHNfc25hcCwgaGFuZHNoYWtlLm1zZ19sZW5ndGggKyBUTFNfSEFORFNIQUtFX1NJWkUpOworICAgICAgICAgICAgc3VjY2VzcyA9IF9kcG9lX2VhcF90bHNfaGFuZGxlX2NsaWVudF9rZXlfZXhjaGFuZ2VfaHMobGlua19yZWMsIGJ1Zik7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJOZXcgYXV0aCBzdGF0ZSAldVxuIiwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGhhbmRzaGFrZS5tc2dfaWQgPT0gSFNfQ0VSVElGSUNBVEVfVkVSSUZZKSAmJgorICAgICAgICAgICAgICAgICAoKGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPT0gRFBPRV9PTlVfQVVUSF9TVEFURV9DRVJUX1JFQ0VJVkVEKSB8fAorICAgICAgICAgICAgICAgICAgKGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPT0gRFBPRV9PTlVfQVVUSF9TVEFURV9DTElFTlRfS0VZX1JFQ0VJVkVEKSkpCisKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiRUFQIFRMUyBSWCBtc2cgJXUgaW4gc3RhdGUgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UubXNnX2lkLCBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlKTsKKyAgICAgICAgICAgIGRwb2Vfc2VjX3NoYTFfZmluYWwobGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNoYTFfZGlnZXN0LCAmbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNoYTFfaGFzaCk7CisgICAgICAgICAgICBkcG9lX3NlY19tZDVfZmluYWwobGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1kNV9kaWdlc3QsICZsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEubWQ1X2hhc2gpOworICAgICAgICAgICAgc3VjY2VzcyA9IF9kcG9lX2VhcF90bHNfaGFuZGxlX2NlcnRfdmVyaWZ5X2hzKGxpbmtfcmVjLCBidWYpOworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiTmV3IGF1dGggc3RhdGUgJXVcbiIsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChoYW5kc2hha2UubXNnX2lkID09IEhTX0ZJTklTSEVEKSAmJgorICAgICAgICAgICAgICAgICAobGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9PSBEUE9FX09OVV9BVVRIX1NUQVRFX0NFUlRfVkFMSURBVEVEKSkKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiRUFQIFRMUyBSWCBtc2cgJXUgaW4gc3RhdGUgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UubXNnX2lkLCBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBfZHBvZV9lYXBfdGxzX2hhbmRsZV9maW5pc2hlZF9ocyhsaW5rX3JlYyk7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJOZXcgYXV0aCBzdGF0ZSAldVxuIiwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJFQVAgVExTIFJYIG1zZyAldSBpbiBzdGF0ZSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZS5tc2dfaWQsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICAgICAgc3VjY2VzcyA9IEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZywganVzdCBhYm9ydC4uLiAqLworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiRUFQIFRMUyBoYW5kc2hha2UgcHJvY2Vzc2luZyBmYWlsZWQ6ICV1XG4iLCBoYW5kc2hha2UubXNnX2lkKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc191bnBhY2tfdGxzX3JlY29yZF9oZHIoYmNtb2x0X2J1ZiAqYnVmLCB0bHNfcmVjb3JkX2hkciAqbXNnKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbXNnLT5jb250ZW50X3R5cGUpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZtc2ctPnRsc192ZXJzaW9uLm1ham9yKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbXNnLT50bHNfdmVyc2lvbi5taW5vcikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICZtc2ctPnRsc19yZWNvcmRfbGVuZ3RoKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX2VhcF90bHNfcHJvY2Vzc190bHNfcmVjb3JkcyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIHRsc19yZWNvcmRfaGRyIHRsc19oZHI7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc19mcmFnX2xlbmd0aCwgbGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19idWZmZXIsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICB3aGlsZSAoKHJjID09IEJDTV9FUlJfT0spICYmIF9kcG9lX2VhcF90bHNfdW5wYWNrX3Rsc19yZWNvcmRfaGRyKCZidWYsICZ0bHNfaGRyKSkKKyAgICB7CisgICAgICAgIHJjID0gX2Rwb2VfZWFwX3Rsc19ydW5fYXV0aF9zdGF0ZV9tYWNoaW5lKGxpbmtfcmVjLCAmYnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfY2hlY2tfdGxzX3ZlcnNpb24oY29uc3QgdGxzX3JlY29yZF9oZHIgKnRsc19yZWNfaGRyKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKHRsc19yZWNfaGRyID09IE5VTEwpOworCisgICAgaWYgKCh0bHNfcmVjX2hkci0+Y29udGVudF90eXBlICE9IFRMU19IQU5EU0hBS0VfSUQpIHx8CisgICAgICAgICh0bHNfcmVjX2hkci0+dGxzX3ZlcnNpb24ubWFqb3IgIT0gVExTX01BSk9SX1ZFUlNJT04pIHx8CisgICAgICAgICh0bHNfcmVjX2hkci0+dGxzX3ZlcnNpb24ubWlub3IgPCBUTFNfTUlOT1JfVkVSU0lPTikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9lYXBfdGxzX2J1ZmZlcl90bHNfZGF0YShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZGF0YSA9PSBOVUxMKTsKKworICAgIC8qIGRvIG5vdCBvdmVycnVuIHRoZSBidWZmZXIsIG5vIG1hdHRlciBob3cgbXVjaCBkYXRhIHJlY2VpdmVkICovCisgICAgaWYgKChsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc19mcmFnX2xlbmd0aCArIGxlbmd0aCkgPiBFQVBPTF9QS1RfU0laRSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IEVBUE9MX1BLVF9TSVpFIC0gbGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19sZW5ndGg7CisgICAgfQorCisgICAgbWVtY3B5KCZsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc19mcmFnX2J1ZmZlcltsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc19mcmFnX2xlbmd0aF0sIGRhdGEsIGxlbmd0aCk7CisgICAgbGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19sZW5ndGggKz0gbGVuZ3RoOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3VucGFja19tc2coYmNtb2x0X2J1ZiAqYnVmLCBlYXBvbF9tc2cgKm1zZykKK3sKKyAgICByZXR1cm4gZHBvZV9zZWNfZWFwb2xfdW5wYWNrKGJ1ZiwgJm1zZy0+aGRyKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbXNnLT5lYXBfbXNnLmhkci5lYXBfY29kZSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm1zZy0+ZWFwX21zZy5oZHIuaWQpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYnVmLCAmbXNnLT5lYXBfbXNnLmhkci5sZW5ndGgpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZtc2ctPmVhcF9tc2cudGxzLmF1dGhfc3ViX3R5cGUpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZtc2ctPmVhcF9tc2cudGxzLmVhcF90bHNfZmxhZ3MpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2VfZWFwX3Rsc19nZW5fa2V5KGF1dGhfdHJhbnNfZGF0YSAqdHJhbnNfZGF0YSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgZHBvZV9zZWNfcnNhX2tleSAqcnNhID0gTlVMTDsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04odHJhbnNfZGF0YSA9PSBOVUxMKTsKKworICAgIC8qIEdlbmVyYXRlIHRoZSBSU0Ega2V5IHRvIGJlIHVzZWQgaW4gdGhlIFNlcnZlcktleUV4Y2hhbmdlIGFuZCBDbGllbnRLZXlFeGNoYW5nZSAqLworICAgIHJzYSA9IGRwb2Vfc2VjX3JzYV9nZW5lcmF0ZV9rZXkoRFBPRV9CSV9SU0FfS0VZX1NJWkUpOworICAgIGlmIChyc2EgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU3RvcmUgdGhlIHBvaW50ZXIgdG8gdGhlIGtleS4gKi8KKyAgICAgICAgdHJhbnNfZGF0YS0+cnNhID0gcnNhOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gZHBvZV9lYXBfdGxzX3NlbmRfc3RhcnQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICB1aW50OF90ICptc2c7CisgICAgdGltZV90IHVuaXhfdGltZTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBhdXRoZW50aWNhdGlvbiBjb250cm9sIGRhdGEuICovCisgICAgbWVtc2V0KCZsaW5rX3JlYy0+YXV0aF9jdHJsLCAwLCBzaXplb2YobGlua19yZWMtPmF1dGhfY3RybCkpOworICAgIGRwb2Vfc2VjX3NoYTFfaW5pdCgmbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNoYTFfaGFzaCk7CisgICAgZHBvZV9zZWNfbWQ1X2luaXQoJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5tZDVfaGFzaCk7CisKKyAgICAvKiBQZXIgc3RhbmRhcmQsIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBzZXJ2ZXIgcmFuZG9tIHZhbHVlIHNob3VsZCBiZSAidW5peCB0aW1lIiAqLworICAgIHVuaXhfdGltZSA9IHRpbWUoTlVMTCk7CisgICAgbWVtY3B5KGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXJ2ZXJfcmFuZG9tLCAmdW5peF90aW1lLCBzaXplb2YodW5peF90aW1lKSk7CisgICAgZHBvZV9zZWNfZ2VuZXJhdGVfbl9ieXRlX3JhbmRvbV9udW1iZXIoJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXJ2ZXJfcmFuZG9tW3NpemVvZih1bml4X3RpbWUpXSwgQ09VTlRfT0ZfUkFORE9NX0JZVEVTIC0gc2l6ZW9mKHVuaXhfdGltZSkpOworCisgICAgLyogSWYgYmlkaXJlY3Rpb25hbCwgZ2VuZXJhdGUgdGhlIFJTQSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpciBmb3IgdGhlIFNlcnZlcktleUV4Y2hhbmdlIGFuZCBDbGllbnRLZXlFeGNoYW5nZS4gKi8KKyAgICBpZiAobGlua19yZWMtPmNmZy5lbmNfbW9kZSA9PSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0JJKQorICAgIHsKKyAgICAgICAgcmMgPSBfZHBvZV9lYXBfdGxzX2dlbl9rZXkoJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YSk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IHJjLCByYyk7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYSBtZXNzYWdlIGJ1ZmZlciAqLworICAgIG1zZyA9IGJjbW9zX2NhbGxvYyhFQVBPTF9QS1RfU0laRSk7CisgICAgaWYgKE5VTEwgPT0gbXNnKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgRUFQLVRMUyBidWZmZXIuICovCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIEVBUE9MX1BLVF9TSVpFLCBtc2csIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKworICAgIC8qIEVuY29kZSB0aGUgRUFQLVRMUyBTdGFydCBtZXNzYWdlIHRvIHRoZSBidWZmZXIuICovCisgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX3N0YXJ0KGxpbmtfcmVjLCAmYnVmKTsKKworICAgIC8qIFNlbmQgdGhlIG1lc3NhZ2UgKi8KKyAgICByYyA9IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIG1zZywgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmYnVmKSk7CisgICAgYmNtb3NfZnJlZShtc2cpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IHJjLCByYyk7CisKKyAgICAvKiBBdXRoZW50aWNhdGlvbiBoYXMgYmVndW4uICovCisgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfRUFQX1NUQVJUOworCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyBkcG9lX2VhcF90bHNfcHJvY2Vzc19lYXBvbF9wa3QoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCB1aW50OF90ICptc2csIHVpbnQzMl90IG1zZ19sZW4pCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgIHVpbnQzMl90IGVhcF90bHNfbGVuZ3RoOworICAgIHRsc19yZWNvcmRfaGRyIHRsc19yZWNfaGRyOworICAgIGVhcG9sX21zZyB1bnBhY2tlZF9tc2c7CisgICAgYmNtb2x0X2J1ZiBidWY7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgbXNnX2xlbiwgbXNnLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgX2Rwb2VfZWFwX3Rsc191bnBhY2tfbXNnKCZidWYsICZ1bnBhY2tlZF9tc2cpOworCisgICAgaWYgKHVucGFja2VkX21zZy5lYXBfbXNnLnRscy5hdXRoX3N1Yl90eXBlID09IEVBUF9UWVBFX05BSykKKyAgICB7CisgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPSBEUE9FX09OVV9BVVRIX1NUQVRFX0ZBSUxFRDsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgIH0KKworICAgIGlmICh1bnBhY2tlZF9tc2cuaGRyLmVhcG9sX2xlbmd0aCAhPSB1bnBhY2tlZF9tc2cuZWFwX21zZy5oZHIubGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgLyogV2Ugc2hvdWxkIG9ubHkgcmVhZCB0aGUgbGVuZ3RoIGlmIHRoZSBsZW5ndGggYml0IGlzIHNldC4gKi8KKyAgICBpZiAoKHVucGFja2VkX21zZy5lYXBfbXNnLnRscy5lYXBfdGxzX2ZsYWdzICYgRUFQX1RMU19GTEFHX0xFTkdUSF9CSVQpICE9IDApCisgICAgeworICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTMyX2JlKCZidWYsICZlYXBfdGxzX2xlbmd0aCk7CisgICAgICAgIHVpbnQ4X3QgKnRsc19kYXRhID0gYmNtb2x0X2J1Zl9zbmFwX2dldCgmYnVmKTsKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc191bnBhY2tfdGxzX3JlY29yZF9oZHIoJmJ1ZiwgJnRsc19yZWNfaGRyKTsKKyAgICAgICAgaWYgKF9kcG9lX2VhcF90bHNfY2hlY2tfdGxzX3ZlcnNpb24oJnRsc19yZWNfaGRyKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogSW52YWxpZCBUTFMgcmVjb3JkLCBkaXNjYXJkLi4uICovCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFsbG9jYXRlIHRoZSBmcmFnbWVudGF0aW9uIGJ1ZmZlci4gTXVsdGlwbGUgY2FsbHMgdG8gdGhlIGZyYWcgYWxsb2MgZnVuY3Rpb24gaXMgYWxsb3dlZCBzaW5jZSBpdCBhbGxvY2F0ZXMgYQorICAgICAgICAgICBuZXcgYnVmZmVyIG9ubHkgaWYgdGhlcmUgaXMgbm8gZnJhZyBidWZmZXIgY3VycmVudGx5IGFsbG9jYXRlZC4gVGhlIGZyYWcgYnVmZmVyIGlzIGFsc28gZnJlZWQgaWYgdGhlIEVBUC1UTFMKKyAgICAgICAgICAgc2Vzc2lvbiBnb2VzIGRvd24gZm9yIHNvbWUgcmVhc29uLiAqLworICAgICAgICBpZiAoIV9kcG9lX2VhcF90bHNfYWxsb2NfdGxzX2ZyYWdfYnVmZmVyKCZsaW5rX3JlYy0+YXV0aF9jdHJsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB0aGUgbGVuZ3RoIGJpdCBpcyBzZXQsIGFuZCB0aGUgbW9yZSBiaXQgaXMgbm90LCB0aGlzIGlzIGxpa2VseSBhIHNpbmdsZSBmcmFnbWVudCBwYWNrZXQuICBJbiB0aGF0IGNhc2UKKyAgICAgICAgICAgdGhlIFRsc01zZyBsZW5ndGggbXVzdCBiZSBwcmVzZW50LCBhbmQgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0IHRoaXMgaXMgYQorICAgICAgICAgICBzdWJzZXF1ZW50IGZyYWdtZW50IGFuZCB0aGUgY2xpZW50IGFsd2F5cyBhZGRzIHRoZSBsZW5ndGggKHdoaWNoIHBlciBzdGFuZGFyZCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgb2YKKyAgICAgICAgICAgZnJhZ21lbnRzKSwgaW4gd2hpY2ggY2FzZSB3ZSBjYW5ub3QgdmFsaWRhdGUgdGhpcyBub3cuIFRoZSBiZXN0IHdlIGNhbiBkbyBpcyBzYXZlIHRoaXMgc2l6ZSwgYW5kIHZhbGlkYXRlCisgICAgICAgICAgIHdoZW4gYWxsIGZyYWdtZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQuICovCisgICAgICAgIGlmIChsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc190b3RhbF9sZW5ndGggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC50bHNfdG90YWxfbGVuZ3RoID0gZWFwX3Rsc19sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGlua19yZWMtPmF1dGhfY3RybC50bHNfdG90YWxfbGVuZ3RoICE9IGVhcF90bHNfbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgfQorCisgICAgICAgIF9kcG9lX2VhcF90bHNfYnVmZmVyX3Rsc19kYXRhKAorICAgICAgICAgICAgbGlua19yZWMsCisgICAgICAgICAgICB0bHNfZGF0YSwKKyAgICAgICAgICAgIHVucGFja2VkX21zZy5oZHIuZWFwb2xfbGVuZ3RoIC0gKEVBUF9GUkFNRV9TSVpFICsgRUFQX1RMU19IRFJfU0laRSArIHNpemVvZih1aW50MzJfdCkpKTsKKworICAgICAgICBpZiAoKHVucGFja2VkX21zZy5lYXBfbXNnLnRscy5lYXBfdGxzX2ZsYWdzICYgRUFQX1RMU19GTEFHX01PUkVfQklUKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOZWVkIHRvIGFja25vd2xlZGdlIHRoZSBmcmFnbWVudCAqLworICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19zZW5kX3Rsc19mcmFnX2Fja190b19vbnUobGlua19yZWMpOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOX1BST0dSRVNTOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogRWl0aGVyIGEgc2luZ2xlIGZyYWdtZW50IHBhY2tldCwgb3IgdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBtdWx0aS1mcmFnbWVudCBwYWNrZXQuIElmIGl0IGlzIHRoZSBsYXN0CisgICAgICAgICAgICAgICBmcmFnbWVudCBvZiBhIG11bHRpLWZyYWdtZW50LCB0aGVuIGFsbCB3ZSBjYW4gY2hlY2sgaXMgdGhhdCBlYXBUbHNMZW5ndGggaXMgb25lIFRsc1JlY29yZEhkciBiaWdnZXIgdGhhbgorICAgICAgICAgICAgICAgdGhlIGJ1ZmZlcmVkIChhdXRoQ3RybC0+dGxzRnJhZ0xlbikgZGF0YSBzdHJlYW0uIFRoZSBzYW1lIGxvZ2ljIHdvcmtzIG9uIGEgc2luZ2xlIGZyYWcgcGFja2V0LiAqLworICAgICAgICAgICAgaWYgKChlYXBfdGxzX2xlbmd0aCAhPSBsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc190b3RhbF9sZW5ndGgpIHx8CisgICAgICAgICAgICAgICAgKGVhcF90bHNfbGVuZ3RoICE9IGxpbmtfcmVjLT5hdXRoX2N0cmwudGxzX2ZyYWdfbGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBfZHBvZV9lYXBfdGxzX3Byb2Nlc3NfdGxzX3JlY29yZHMobGlua19yZWMpOworICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19mcmVlX3Rsc19mcmFnX2J1ZmZlcigmbGlua19yZWMtPmF1dGhfY3RybCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDhfdCAqdGxzX2RhdGEgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KCZidWYpOworCisgICAgICAgIC8qIE5vIGxlbmd0aCBmaWVsZCAtIG11c3QgYmUgZnJhZ21lbnRlZCwgYW5kIG5vdCBmaXJzdCAqLworICAgICAgICBpZiAobGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19idWZmZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1VUX09GX1NZTkM7CisgICAgICAgIH0KKworICAgICAgICBfZHBvZV9lYXBfdGxzX2J1ZmZlcl90bHNfZGF0YSgKKyAgICAgICAgICAgIGxpbmtfcmVjLAorICAgICAgICAgICAgdGxzX2RhdGEsCisgICAgICAgICAgICB1bnBhY2tlZF9tc2cuaGRyLmVhcG9sX2xlbmd0aCAtIChFQVBfRlJBTUVfU0laRSArIEVBUF9UTFNfSERSX1NJWkUpKTsKKworICAgICAgICAvKiBJZiB0aGUgbW9yZSBiaXQgaXMgc2V0LCB3YWl0IGZvciB0aGUgbmV4dCBmcmFnbWVudC4gT3RoZXJ3aXNlIGR1bXAgd2hhdCB3ZSBoYXZlIGludG8gdGhlIHN0YXRlIG1hY2hpbmUuICovCisgICAgICAgIGlmICgodW5wYWNrZWRfbXNnLmVhcF9tc2cudGxzLmVhcF90bHNfZmxhZ3MgJiBFQVBfVExTX0ZMQUdfTU9SRV9CSVQpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5lZWQgdG8gYWNrbm93bGVkZ2UgdGhlIGZyYWdtZW50PyBUaGUgc3RhbmRhcmQgZG9lcyBub3QgZGVmaW5lIGEgbWVzc2FnZSBzZXQgdGhhdCB3aWxsIGdldCB1cyBoZXJlLiAqLworICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19zZW5kX3Rsc19mcmFnX2Fja190b19vbnUobGlua19yZWMpOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOX1BST0dSRVNTOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwudGxzX3RvdGFsX2xlbmd0aCAhPSBsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc19mcmFnX2xlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBfZHBvZV9lYXBfdGxzX3Byb2Nlc3NfdGxzX3JlY29yZHMobGlua19yZWMpOworICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19mcmVlX3Rsc19mcmFnX2J1ZmZlcigmbGlua19yZWMtPmF1dGhfY3RybCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3ZvaWQgZHBvZV9lYXBfdGxzX2NsZWFudXAoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICAvLyBXZSBhcmUgZG9uZSB3aXRoIHRoaXMuCisgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydGlmaWNhdGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUobGlua19yZWMtPmF1dGhfY3RybC5jZXJ0aWZpY2F0ZSk7CisgICAgfQorCisgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5yc2EgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGRwb2Vfc2VjX3JzYV9rZXlfZnJlZShsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEucnNhKTsKKyAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnJzYSA9IE5VTEw7CisgICAgfQorCisgICAgbGlua19yZWMtPmF1dGhfY3RybC5jZXJ0TGVuID0gMDsKKworICAgIF9kcG9lX2VhcF90bHNfZnJlZV90bHNfZnJhZ19idWZmZXIoJmxpbmtfcmVjLT5hdXRoX2N0cmwpOworCisgICAgbWVtc2V0KCZsaW5rX3JlYy0+YXV0aF9jdHJsLCAwLCBzaXplb2YobGlua19yZWMtPmF1dGhfY3RybCkpOworfQorCitiY21vc19lcnJubyBkcG9lX2VhcF90bHNfaW5pdChmX2Rwb2Vfc2VjX2F1dGhfY2IgYXV0aF9jYiwgZl9kcG9lX3NlY19jZXJ0X3RydXN0X2NiIGNlcnRfdHJ1c3RfY2IpCit7CisgICAgX2F1dGhfY29tcGxldGUgPSBhdXRoX2NiOworICAgIF9jZXJ0X3RydXN0ID0gY2VydF90cnVzdF9jYjsKKworICAgIHJldHVybiBkcG9lX3NlY19ybmdfc2VlZCgpOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2VfZWFwX3Rscy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX2VhcF90bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODRkNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX2VhcF90bHMuaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmICFkZWZpbmVkKF9EUE9FX0VBUF9UTFNfSF8pCisjZGVmaW5lIF9EUE9FX0VBUF9UTFNfSF8KKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgImRwb2Vfc2VjX3V0aWwuaCIKKworI2RlZmluZSBDT1VOVF9PRl9SQU5ET01fQllURVMgMzIKKyNkZWZpbmUgU0laRV9PRl9NQVNURVJfU0VDUkVUIDQ4CisjZGVmaW5lIFNJWkVfT0ZfTUFTVEVSX1NFU1NJT05fS0VZIDY0CisjZGVmaW5lIFNJWkVfT0ZfS0VZX01BVEVSSUFMIDEyOAorI2RlZmluZSBTSVpFX09GX1JTQV9FTkNSWVBURURfQkxPQ0sgMjU2CisjZGVmaW5lIFNJWkVfT0ZfRUFQX1NFU1NJT05fSUQgNjUKKyNkZWZpbmUgU0laRV9PRl9UTFNfU0VTU0lPTl9JRCAzMgorCisvKiBUb3RhbCBsZW5ndGggb2YgdGhlIFByZU1hc3RlclNlY3JldCAqLworI2RlZmluZSBTSVpFX09GX1BSRV9NQVNURVJfU0VDUkVUIDQ4CisKK3R5cGVkZWYgZW51bQoreworICAgIERQT0VfT05VX0FVVEhfU1RBVEVfVU5BVVRIRU5USUNBVEVELAorICAgIERQT0VfT05VX0FVVEhfU1RBVEVfRUFQX1NUQVJULAorICAgIERQT0VfT05VX0FVVEhfU1RBVEVfQ0VSVF9SRVFVRVNULAorICAgIERQT0VfT05VX0FVVEhfU1RBVEVfQ0xJRU5UX0tFWV9SRUNFSVZFRCwKKyAgICBEUE9FX09OVV9BVVRIX1NUQVRFX0NFUlRfUkVDRUlWRUQsCisgICAgRFBPRV9PTlVfQVVUSF9TVEFURV9DRVJUX1ZBTElEQVRFRCwKKyAgICBEUE9FX09OVV9BVVRIX1NUQVRFX0FVVEhFTlRJQ0FURUQsCisgICAgRFBPRV9PTlVfQVVUSF9TVEFURV9GQUlMRUQKK30gZHBvZV9vbnVfYXV0aF9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IG1ham9yOworICAgIHVpbnQ4X3QgbWlub3I7Cit9IHRsc19wcm90b2NvbF92ZXJzaW9uOworCisjZGVmaW5lIFBST1RPQ09MX1ZFUlNJT05fU0laRSAyCisKKy8qIERQb0UgQXV0aGVudGljYXRpb24gdHJhbnNpZW50IGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCBjbGllbnRfcmFuZG9tW0NPVU5UX09GX1JBTkRPTV9CWVRFU107CisgICAgdWludDhfdCBzZXJ2ZXJfcmFuZG9tW0NPVU5UX09GX1JBTkRPTV9CWVRFU107CisgICAgdWludDhfdCBzZXNzaW9uX2lkW1NJWkVfT0ZfRUFQX1NFU1NJT05fSURdOworICAgIHVpbnQ4X3QgbWFzdGVyX3NlY3JldFtTSVpFX09GX01BU1RFUl9TRUNSRVRdOworICAgIHVpbnQ4X3Qga2V5X21hdGVyaWFsW1NJWkVfT0ZfS0VZX01BVEVSSUFMXTsKKyAgICB1aW50OF90IHByZV9tYXN0ZXJfc2VjcmV0W1NJWkVfT0ZfUFJFX01BU1RFUl9TRUNSRVRdOworICAgIGRwb2Vfc2VjX3NoYTFfaGFzaCBzaGExX2hhc2g7CisgICAgZHBvZV9zZWNfc2hhMV9kaWdlc3Qgc2hhMV9kaWdlc3Q7CisgICAgZHBvZV9zZWNfbWQ1X2hhc2ggbWQ1X2hhc2g7CisgICAgZHBvZV9zZWNfbWQ1X2RpZ2VzdCBtZDVfZGlnZXN0OworICAgIC8qICBBbGxvdyB0aGUga2V5IHRvIGRvdWJsZSBpbiBzaXplIGJlZm9yZSB3ZSBicmVhay4gKi8KKyAgICB1aW50OF90IGVuY3J5cHRlZF9jYWtbMiAqIFNJWkVfT0ZfUlNBX0VOQ1JZUFRFRF9CTE9DS107CisgICAgdWludDhfdCBtYXN0ZXJfc2Vzc2lvbl9rZXlbU0laRV9PRl9NQVNURVJfU0VTU0lPTl9LRVldOworICAgIGRwb2Vfc2VjX3JzYV9rZXkgKnJzYTsKK30gYXV0aF90cmFuc19kYXRhOworCit0eXBlZGVmIHN0cnVjdCBvbnVfYXV0aF9jb250cm9sCit7CisgICAgZHBvZV9vbnVfYXV0aF9zdGF0ZSBvbnVfYXV0aF9zdGF0ZTsKKyAgICB0bHNfcHJvdG9jb2xfdmVyc2lvbiB2ZXJzaW9uOworICAgIHVpbnQzMl90IGN1cnJlbnRfcGFja2V0X2lkOworICAgIHVpbnQ4X3QgKmNlcnRpZmljYXRlOworICAgIHVpbnQxNl90IGNlcnRMZW47CisgICAgdWludDhfdCAqb251X2NlcnQ7CisgICAgdWludDE2X3Qgb251X2NlcnRfbGVuOworICAgIHVpbnQzMl90IG9udV9jZXJ0X2tleV9zaXplOworICAgIHVpbnQ4X3QgKm1mZ19jZXJ0OworICAgIHVpbnQxNl90IG1mZ19jZXJ0X2xlbjsKKyAgICB1aW50OF90ICp0bHNfZnJhZ19idWZmZXI7CisgICAgdWludDMyX3QgdGxzX2ZyYWdfbGVuZ3RoOworICAgIHVpbnQzMl90IHRsc190b3RhbF9sZW5ndGg7CisgICAgYXV0aF90cmFuc19kYXRhIHRyYW5zX2RhdGE7Cit9IG9udV9hdXRoX2NvbnRyb2w7CisKK3N0cnVjdCBkcG9lX3NlY19saW5rX3JlYzsKKworLyogY2FsbGJhY2tzICovCisKK3R5cGVkZWYgdm9pZCAoKmZfZHBvZV9zZWNfYXV0aF9jYikoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjKiwgYmNtb3NfZXJybm8gc3RhdHVzKTsKKwordHlwZWRlZiBiY21vc19ib29sICgqZl9kcG9lX3NlY19jZXJ0X3RydXN0X2NiKShzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMqKTsKKworLyogZnVuY3Rpb25zICovCisKK2JjbW9zX2Vycm5vIGRwb2VfZWFwX3Rsc19zZW5kX3N0YXJ0KHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluayk7CisKK2JjbW9zX2Vycm5vIGRwb2VfZWFwX3Rsc19wcm9jZXNzX2VhcG9sX3BrdChzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmssIHVpbnQ4X3QgKm1zZywgdWludDMyX3QgbXNnX2xlbik7CisKK3ZvaWQgZHBvZV9lYXBfdGxzX2NsZWFudXAoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rKTsKKworYmNtb3NfZXJybm8gZHBvZV9lYXBfdGxzX2luaXQoZl9kcG9lX3NlY19hdXRoX2NiIGF1dGhfY2IsIGZfZHBvZV9zZWNfY2VydF90cnVzdF9jYiBjZXJ0X3RydXN0X2NiKTsKKworI2VuZGlmIC8qIF9EUE9FX0VBUF9UTFNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfZnNtLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX2ZzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Yzk2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX2ZzbS5jCkBAIC0wLDAgKzEsODI2IEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKyNpbmNsdWRlICJkcG9lX3NlY19mc20uaCIKKyNpbmNsdWRlICJkcG9lX3NlY191dGlsLmgiCisjaW5jbHVkZSAiYmNtb3NfaGFzaF90YWJsZS5oIgorI2luY2x1ZGUgImJjbW9sdF9lcG9uX29hbV90eXBlcy5oIgorI2luY2x1ZGUgImJjbW9sdF91dGlscy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaCIKKyNpbmNsdWRlICJiY21vbHRfYXBpLmgiCisKKyNkZWZpbmUgRFBPRV9TRUNfRlNNX01BWF9MSU5LUyA2NAorI2RlZmluZSBEUE9FX1NFQ19GU01fVEFTS19NU0dfUV9TSVpFIDY0CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBEUE9FX1NFQ19GU01fREVGQVVMVF9PQU1fS0VZX0VYQ0hBTkdFX1BFUklPRCA9IDYwMDsgLyogMTAgbWludXRlcyAqLworLyoqCisgKiBAYnJpZWYgIE1heGltdW0gT05VIEF1dGhlbnRpY2F0aW9uIHRpbWVvdXQgdmFsdWUKKyAqIERQb0Ugc3BlY2lmaWNhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGlzIHZhbHVlIGlzIDUgbWludXRlcy4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQzMl90IERQT0VfU0VDX0FVVEhfVElNRU9VVCA9IDUgKiA2MCAqIDEwMDAgKiAxMDAwOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX3Rhc2sgdGFzazsKKyAgICBjaGFyIHRhc2tfbmFtZVtNQVhfVEFTS19OQU1FX1NJWkVdOworICAgIGNoYXIgbXNnX3F1ZXVlX25hbWVbTUFYX01TR19RVUVVRV9OQU1FX1NJWkVdOworICAgIGhhc2hfdGFibGUgKmxpbmtfbWFwOworfSBkcG9lX3NlY19mc21fY3R4dDsKKworZHBvZV9zZWNfZnNtX2N0eHQgY3R4dFtCQ01UUl9NQVhfT0xUU107CisKK3R5cGVkZWYgdm9pZCAoKmZfZHBvZV9zZWNfZnNtKShkcG9lX3NlY19saW5rX3JlYyosIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhKik7CisKKy8qIERQb0UgU2VjdXJpdHkgRlNNIEV2ZW50IHR5cGUgdG8gc3RyaW5nIGRlZmluaXRpb25zIHVzZWQgZm9yIGRlYnVnIG91dHB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmRwb2Vfc2VjX2ZzbV9ldmVudF9uYW1lW0RQT0VfU0VDX0ZTTV9FVkVOVF9fQ09VTlRdID0KK3sKKyAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX0VOQ1JZUFRfU1RBUlRdID0gIlN0YXJ0IEVuY3J5cHRpb24iLAorICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfQVVUSF9TVEFSVF0gPSAiU3RhcnQgQXV0aGVudGljYXRpb24iLAorICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfUlhfT0FNXSA9ICJSZWNlaXZlIE9BTSIsCisgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSAiUmVjZWl2ZSBFQVBPTCIsCisgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9BVVRIX0NPTVBMRVRFXSA9ICJBdXRoZW50aWNhdGlvbiBDb21wbGV0ZSIsCisgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9NS0FfQ09NUExFVEVdID0gIk1LQSBDb21wbGV0ZSIsCisgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9USU1FT1VUXSA9ICJUaW1lb3V0IgorfTsKKworCisvKiBEUG9FIFNlY3VyaXR5IEZTTSBTdGF0ZSB0byBzdHJpbmcgZGVmaW5pdGlvbnMgdXNlZCBmb3IgZGVidWcgb3V0cHV0ICovCitzdGF0aWMgY29uc3QgY2hhciAqZHBvZV9zZWNfZnNtX3N0YXRlX25hbWVbRFBPRV9TRUNfRlNNX1NUQVRFX19DT1VOVF0gPQoreworICAgIFtEUE9FX1NFQ19GU01fU1RBVEVfSURMRV0gPSAiSWRsZSIsCisgICAgW0RQT0VfU0VDX0ZTTV9TVEFURV9BVVRIX1dBSVRdID0gIkF1dGhlbnRpY2F0aW9uIGluIHByb2dyZXNzIiwKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0VOQ1JZUFRfRE9XTl9XQUlUXSA9ICJPQU0gS2V5IEV4Y2hhbmdlIGluIHByb2dyZXNzIiwKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0VOQ1JZUFRfQklfV0FJVF0gPSAiTUtBIGluIHByb2dyZXNzIiwKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0NPTVBMRVRFXSA9ICJBdXRoZW50aWNhdGlvbi9FbmNyeXB0aW9uIENvbXBsZXRlIgorfTsKKworc3RhdGljIGZfZHBvZV9zZWNfZnNtX2NiIF9mc21fY29tcGxldGU7CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX3NlY19mc21fZXZlbnRfdHlwZV9pc192YWxpZChkcG9lX3NlY19mc21fZXZlbnQgdHlwZSkKK3sKKyAgICByZXR1cm4gdHlwZSA8IERQT0VfU0VDX0ZTTV9FVkVOVF9fQ09VTlQ7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX3NlY19mc21fc3RhdGVfaXNfdmFsaWQoZHBvZV9zZWNfZnNtX3N0YXRlIHN0YXRlKQoreworICAgIHJldHVybiBzdGF0ZSA8IERQT0VfU0VDX0ZTTV9TVEFURV9fQ09VTlQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfZHBvZV9zZWNfZnNtX2V2ZW50X25hbWUoZHBvZV9zZWNfZnNtX2V2ZW50IHR5cGUpCit7CisgICAgaWYgKF9kcG9lX3NlY19mc21fZXZlbnRfdHlwZV9pc192YWxpZCh0eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBkcG9lX3NlY19mc21fZXZlbnRfbmFtZVt0eXBlXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuICJVbmtub3duIEV2ZW50IjsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfZHBvZV9zZWNfZnNtX3N0YXRlX25hbWUoZHBvZV9zZWNfZnNtX3N0YXRlIHN0YXRlKQoreworICAgIGlmIChfZHBvZV9zZWNfZnNtX3N0YXRlX2lzX3ZhbGlkKHN0YXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBkcG9lX3NlY19mc21fc3RhdGVfbmFtZVtzdGF0ZV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAiVW5rbm93biBTdGF0ZSI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2NvbXBsZXRlKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgaWYgKF9mc21fY29tcGxldGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIF9mc21fY29tcGxldGUobGlua19yZWMtPmRldmljZSwgbGlua19yZWMtPmtleSwgbGlua19yZWMtPnN0YXR1cyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX3N1Y2Nlc3MoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICBsaW5rX3JlYy0+ZnNtX3N0YXRlID0gRFBPRV9TRUNfRlNNX1NUQVRFX0NPTVBMRVRFOworICAgIGxpbmtfcmVjLT5zdGF0dXMgPSBCQ01fRVJSX09LOworCisgICAgc3dpdGNoIChsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfTk9ORToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0JJOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX09ORV9ET1dOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fRE9XTjoKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KAorICAgICAgICAgICAgICAgICZsaW5rX3JlYy0+dGltZW91dCwKKyAgICAgICAgICAgICAgICAoRFBPRV9TRUNfRlNNX0RFRkFVTFRfT0FNX0tFWV9FWENIQU5HRV9QRVJJT0QgKiAxMDAwICogMTAwMCkgKyBEUE9FX1NFQ19PQU1fVElNRU9VVCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEJVRygpOworICAgIH0KKworICAgIF9kcG9lX3NlY19mc21fY29tcGxldGUobGlua19yZWMpOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX3N0b3AoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vc19lcnJubyByZWFzb24pCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIGxpbmtfcmVjLT5mc21fc3RhdGUgPSBEUE9FX1NFQ19GU01fU1RBVEVfSURMRTsKKyAgICBsaW5rX3JlYy0+c3RhdHVzID0gcmVhc29uOworCisgICAgYmNtb3NfdGltZXJfc3RvcCgmbGlua19yZWMtPnRpbWVvdXQpOworCisgICAgLyogQ2xlYW51cCBhbnkgRUFQLVRMUyBzdGF0ZS4gKi8KKyAgICBkcG9lX2VhcF90bHNfY2xlYW51cChsaW5rX3JlYyk7CisKKyAgICBfZHBvZV9zZWNfZnNtX2NvbXBsZXRlKGxpbmtfcmVjKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9hdXRoX3N0YXJ0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIC8qIFN0YXJ0IE9OVSBBdXRoZW50aWNhdGlvbiAqLworICAgIHJjID0gZHBvZV9lYXBfdGxzX3NlbmRfc3RhcnQobGlua19yZWMpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiRmFpbGVkIHRvIHN0YXJ0IGF1dGhlbnRpY2F0aW9uOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdG9wKGxpbmtfcmVjLCByYyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxpbmtfcmVjLT5mc21fc3RhdGUgPSBEUE9FX1NFQ19GU01fU1RBVEVfQVVUSF9XQUlUOworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPnRpbWVvdXQsIERQT0VfU0VDX0FVVEhfVElNRU9VVCk7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIlN0YXJ0aW5nIGF1dGhlbnRpY2F0aW9uXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fbWthX3N0YXJ0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IGRwb2Vfc2VjX21rYV9mc21fc3RhcnQobGlua19yZWMpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiRmFpbGVkIHRvIHN0YXJ0IE1LQTogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgIF9kcG9lX3NlY19mc21fc3RvcChsaW5rX3JlYywgcmMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW5rX3JlYy0+ZnNtX3N0YXRlID0gRFBPRV9TRUNfRlNNX1NUQVRFX0VOQ1JZUFRfQklfV0FJVDsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiU3RhcnRpbmcgTUtBXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fZW5jcnlwdF9zdGFydChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICBpZiAobGlua19yZWMtPmNmZy5lbmNfbW9kZSA9PSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0JJKQorICAgIHsKKyAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9ta2Ffc3RhcnQobGlua19yZWMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IGVwb25fb2FtX2Rwb2Vfc2V0X2VuY3J5cHRpb24oCisgICAgICAgICAgICBsaW5rX3JlYy0+ZGV2aWNlLAorICAgICAgICAgICAgbGlua19yZWMtPmtleS5lcG9uX25pLAorICAgICAgICAgICAgJmxpbmtfcmVjLT5rZXkubWFjX2FkZHJlc3MsCisgICAgICAgICAgICBsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlLAorICAgICAgICAgICAgRFBPRV9TRUNfRlNNX0RFRkFVTFRfT0FNX0tFWV9FWENIQU5HRV9QRVJJT0QpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiRmFpbGVkIHRvIHNldCBlbmNyeXB0aW9uOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fc3RvcChsaW5rX3JlYywgcmMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmZzbV9zdGF0ZSA9IERQT0VfU0VDX0ZTTV9TVEFURV9FTkNSWVBUX0RPV05fV0FJVDsKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+dGltZW91dCwgRFBPRV9TRUNfT0FNX1RJTUVPVVQpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2F1dGhfcnhfZWFwb2woZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgcmMgPSBkcG9lX2VhcF90bHNfcHJvY2Vzc19lYXBvbF9wa3QobGlua19yZWMsIGV2dC0+ZGF0YS5yeF9mcmFtZS52YWwsIGV2dC0+ZGF0YS5yeF9mcmFtZS5sZW4pOworICAgIGlmICgoQkNNX0VSUl9PSyAhPSByYykgJiYgKEJDTV9FUlJfSU5fUFJPR1JFU1MgIT0gcmMpKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiRXJyb3IgcHJvY2Vzc2luZyBFQVBPTCBwYWNrZXQ6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICBfZHBvZV9zZWNfZnNtX3N0b3AobGlua19yZWMsIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fYXV0aF9jb21wbGV0ZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgYmNtb3NfdGltZXJfc3RvcCgmbGlua19yZWMtPnRpbWVvdXQpOworICAgIGlmIChCQ01fRVJSX09LID09IGV2dC0+ZGF0YS5zdWJfc3RhdHVzKQorICAgIHsKKyAgICAgICAgaWYgKGxpbmtfcmVjLT5jZmcuZW5jX21vZGUgPT0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX1RFTl9CSSkKKyAgICAgICAgeworICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9ta2Ffc3RhcnQobGlua19yZWMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdWNjZXNzKGxpbmtfcmVjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfZHBvZV9zZWNfZnNtX3N0b3AobGlua19yZWMsIGV2dC0+ZGF0YS5zdWJfc3RhdHVzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfZnNtX2luc3RhbGxfZG5fa2V5KAorICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZSkKK3sKKyAgICBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIga2V5X2luZm87CisKKyAgICBpZiAoQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX09ORV9ET1dOID09IGxpbmtfcmVjLT5jZmcuZW5jX21vZGUpCisgICAgeworICAgICAgICBrZXlfaW5mby5mb3JtYXQgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI7CisgICAgICAgIG1lbWNweShrZXlfaW5mby51LmNmYi5rZXksIGRwb2UtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhLCBzaXplb2Yoa2V5X2luZm8udS5jZmIua2V5KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGtleV9pbmZvLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjsKKyAgICAgICAgbWVtY3B5KGtleV9pbmZvLnUuY3RyLmtleSwgZHBvZS0+dS5rZXlfZXhjaGFuZ2Uua2V5X2RhdGEsIHNpemVvZihrZXlfaW5mby51LmN0ci5rZXkpKTsKKyAgICAgICAgbWVtY3B5KGtleV9pbmZvLnUuY3RyLnNjaSwgbGlua19yZWMtPm5pX21hYy51OCwgQkNNT1NfRVRIX0FMRU4pOworICAgICAgICBrZXlfaW5mby51LmN0ci5zY2lbNl0gPSAobGlua19yZWMtPmxsaWQgPj4gOCkgJiAweGZmOworICAgICAgICBrZXlfaW5mby51LmN0ci5zY2lbN10gPSAobGlua19yZWMtPmxsaWQgPj4gMCkgJiAweGZmOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fa2V5X3NldCgKKyAgICAgICAgbGlua19yZWMtPmRldmljZSwKKyAgICAgICAgJmxpbmtfcmVjLT5rZXksCisgICAgICAgIEJDTU9TX0ZBTFNFLAorICAgICAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUywKKyAgICAgICAgKGJjbW9sdF9lcG9uX2tleV9jaG9pY2UpZHBvZS0+dS5rZXlfZXhjaGFuZ2Uua2V5X251bWJlciwKKyAgICAgICAgJmtleV9pbmZvKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9lbmNfZG5fcnhfb2FtKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIG9hbV9mcmFtZSA9IGVwb25fb2FtX3VucGFjayhsaW5rX3JlYy0+ZGV2aWNlLCBldnQtPmRhdGEucnhfZnJhbWUubGVuLCBldnQtPmRhdGEucnhfZnJhbWUudmFsKTsKKyAgICBpZiAoTlVMTCA9PSBvYW1fZnJhbWUpCisgICAgeworICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhXQVJOSU5HLCBsaW5rX3JlYywgIkZhaWxlZCB0byBwYXJzZSBPQU0gZnJhbWVcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFlcG9uX29hbV9pc19kcG9lKG9hbV9mcmFtZSkpCisgICAgeworICAgICAgICBiY21vc19mcmVlKG9hbV9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkcG9lID0gJm9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZTsKKworICAgIGlmIChlcG9uX29hbV9pc19kcG9lX2VuY3J5cHRfcmVzcG9uc2UoZHBvZSkpCisgICAgeworICAgICAgICBpZiAoKGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoID09IDB4ODApICYmCisgICAgICAgICAgICAoZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGggPT0gMHg4MCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+dGltZW91dCwgRFBPRV9TRUNfT0FNX1RJTUVPVVQpOyAvKiByZXN0YXJ0IHRpbWVyIHRvIHdhaXQgZm9yIGtleSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiT05VIHJlamVjdGVkIGVuY3J5cHRpb246IFswXSA9IDB4JXgsIFsxXSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoKTsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fc3RvcChsaW5rX3JlYywgQkNNX0VSUl9PTlVfRVJSX1JFU1ApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0UgPT0gZHBvZS0+b3ApCisgICAgeworICAgICAgICBfZHBvZV9zZWNfZnNtX2luc3RhbGxfZG5fa2V5KGxpbmtfcmVjLCBkcG9lKTsKKyAgICAgICAgaWYgKGxpbmtfcmVjLT5jZmcuYXV0aCkKKyAgICAgICAgeworICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9hdXRoX3N0YXJ0KGxpbmtfcmVjLCBldnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdWNjZXNzKGxpbmtfcmVjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBpZ25vcmUgb3RoZXIgT0FNICovCisgICAgfQorCisgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2VuY19iaV9yeF9vYW0oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGRwb2Vfc2VjX21rYV9mc21fcnhfb2FtKGxpbmtfcmVjLCBldnQtPmRhdGEucnhfZnJhbWUudmFsLCBldnQtPmRhdGEucnhfZnJhbWUubGVuKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9lbmNfYmlfcnhfZWFwb2woZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGRwb2Vfc2VjX21rYV9mc21fcnhfZWFwb2wobGlua19yZWMsIGV2dC0+ZGF0YS5yeF9mcmFtZS52YWwsIGV2dC0+ZGF0YS5yeF9mcmFtZS5sZW4pOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX21rYV9jb21wbGV0ZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgaWYgKEJDTV9FUlJfT0sgPT0gZXZ0LT5kYXRhLnN1Yl9zdGF0dXMpCisgICAgeworICAgICAgICBfZHBvZV9zZWNfZnNtX3N1Y2Nlc3MobGlua19yZWMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfZHBvZV9zZWNfZnNtX3N0b3AobGlua19yZWMsIGV2dC0+ZGF0YS5zdWJfc3RhdHVzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fY29tcF9yeF9vYW0oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGlmICgobGlua19yZWMtPmNmZy5lbmNfbW9kZSA9PSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfT05FX0RPV04pIHx8CisgICAgICAgIChsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlID09IEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fRE9XTikpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZTsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2U7CisKKyAgICAgICAgb2FtX2ZyYW1lID0gZXBvbl9vYW1fdW5wYWNrKGxpbmtfcmVjLT5kZXZpY2UsIGV2dC0+ZGF0YS5yeF9mcmFtZS5sZW4sIGV2dC0+ZGF0YS5yeF9mcmFtZS52YWwpOworICAgICAgICBpZiAoTlVMTCA9PSBvYW1fZnJhbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKFdBUk5JTkcsIGxpbmtfcmVjLCAiRmFpbGVkIHRvIHBhcnNlIE9BTSBmcmFtZVxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWVwb25fb2FtX2lzX2Rwb2Uob2FtX2ZyYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZHBvZSA9ICZvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWU7CisKKyAgICAgICAgaWYgKEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0UgPT0gZHBvZS0+b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21faW5zdGFsbF9kbl9rZXkobGlua19yZWMsIGRwb2UpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2NvbXBfcnhfZWFwb2woZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGlmIChsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlID09IEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fQkkpCisgICAgeworICAgICAgICBkcG9lX3NlY19ta2FfZnNtX3J4X2VhcG9sKGxpbmtfcmVjLCBldnQtPmRhdGEucnhfZnJhbWUudmFsLCBldnQtPmRhdGEucnhfZnJhbWUubGVuKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fdGltZW91dChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgX2Rwb2Vfc2VjX2ZzbV9zdG9wKGxpbmtfcmVjLCBCQ01fRVJSX1RJTUVPVVQpOworfQorCitzdGF0aWMgZl9kcG9lX3NlY19mc20gZHBvZV9zZWNfZnNtW0RQT0VfU0VDX0ZTTV9TVEFURV9fQ09VTlRdW0RQT0VfU0VDX0ZTTV9FVkVOVF9fQ09VTlRdID0KK3sKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0lETEVdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfQVVUSF9TVEFSVF0gPSBfZHBvZV9zZWNfZnNtX2F1dGhfc3RhcnQsCisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfRU5DUllQVF9TVEFSVF0gPSBfZHBvZV9zZWNfZnNtX2VuY3J5cHRfc3RhcnQKKyAgICB9LAorICAgIFtEUE9FX1NFQ19GU01fU1RBVEVfQVVUSF9XQUlUXSA9CisgICAgeworICAgICAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX1JYX0VBUE9MXSA9IF9kcG9lX3NlY19mc21fYXV0aF9yeF9lYXBvbCwKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9BVVRIX0NPTVBMRVRFXSA9IF9kcG9lX3NlY19mc21fYXV0aF9jb21wbGV0ZSwKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9USU1FT1VUXSA9IF9kcG9lX3NlY19mc21fdGltZW91dAorICAgIH0sCisgICAgW0RQT0VfU0VDX0ZTTV9TVEFURV9FTkNSWVBUX0RPV05fV0FJVF0gPQorICAgIHsKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9PQU1dID0gX2Rwb2Vfc2VjX2ZzbV9lbmNfZG5fcnhfb2FtLAorICAgICAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX1RJTUVPVVRdID0gX2Rwb2Vfc2VjX2ZzbV90aW1lb3V0CisgICAgfSwKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0VOQ1JZUFRfQklfV0FJVF0gPQorICAgIHsKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9PQU1dID0gX2Rwb2Vfc2VjX2ZzbV9lbmNfYmlfcnhfb2FtLAorICAgICAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX1JYX0VBUE9MXSA9IF9kcG9lX3NlY19mc21fZW5jX2JpX3J4X2VhcG9sLAorICAgICAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX01LQV9DT01QTEVURV0gPSBfZHBvZV9zZWNfZnNtX21rYV9jb21wbGV0ZSwKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9USU1FT1VUXSA9IF9kcG9lX3NlY19mc21fdGltZW91dAorICAgIH0sCisgICAgW0RQT0VfU0VDX0ZTTV9TVEFURV9DT01QTEVURV0gPQorICAgIHsKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9PQU1dID0gX2Rwb2Vfc2VjX2ZzbV9jb21wX3J4X29hbSwKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSBfZHBvZV9zZWNfZnNtX2NvbXBfcnhfZWFwb2wsCisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfVElNRU9VVF0gPSBfZHBvZV9zZWNfZnNtX3RpbWVvdXQKKyAgICB9Cit9OworCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX3VuZXhwZWN0ZWQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIERQT0VfU0VDX0xJTktfTE9HKFdBUk5JTkcsIGxpbmtfcmVjLCAiVW5leHBlY3RlZCBldmVudCAlcyAoJXUpIGluIHN0YXRlICVzICgldSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9ldmVudF9uYW1lKGV2dC0+dHlwZSksIGV2dC0+dHlwZSwgX2Rwb2Vfc2VjX2ZzbV9zdGF0ZV9uYW1lKGxpbmtfcmVjLT5mc21fc3RhdGUpLCBsaW5rX3JlYy0+ZnNtX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9leGVjKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICBpZiAoZXZ0LT50eXBlIDwgRFBPRV9TRUNfRlNNX0VWRU5UX19DT1VOVCkKKyAgICB7CisgICAgICAgIGRwb2Vfc2VjX2ZzbV9zdGF0ZSBwcmVfc3RhdGUgPSBsaW5rX3JlYy0+ZnNtX3N0YXRlOworCisgICAgICAgIGlmIChkcG9lX3NlY19mc21bbGlua19yZWMtPmZzbV9zdGF0ZV1bZXZ0LT50eXBlXSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJwcm9jZXNzaW5nIGV2ZW50ICVzIGluIHN0YXRlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9ldmVudF9uYW1lKGV2dC0+dHlwZSksIF9kcG9lX3NlY19mc21fc3RhdGVfbmFtZShsaW5rX3JlYy0+ZnNtX3N0YXRlKSk7CisgICAgICAgICAgICBkcG9lX3NlY19mc21bbGlua19yZWMtPmZzbV9zdGF0ZV1bZXZ0LT50eXBlXShsaW5rX3JlYywgZXZ0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fdW5leHBlY3RlZChsaW5rX3JlYywgZXZ0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsaW5rX3JlYy0+ZnNtX3N0YXRlICE9IHByZV9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAidHJhbnNpdGlvbiBmcm9tICVzIHRvICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdGF0ZV9uYW1lKHByZV9zdGF0ZSksIF9kcG9lX3NlY19mc21fc3RhdGVfbmFtZShsaW5rX3JlYy0+ZnNtX3N0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiVW5rbm93biBldmVudDogJXUiLCBldnQtPnR5cGUpOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIF9kcG9lX3NlY19mc21fbGlua190aW1lcl9leHBpcmVkKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYyA9IChkcG9lX3NlY19saW5rX3JlYyopZGF0YTsKKyAgICBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSBldnQ7CisKKyAgICBldnQudHlwZSA9IERQT0VfU0VDX0ZTTV9FVkVOVF9USU1FT1VUOworCisgICAgX2Rwb2Vfc2VjX2ZzbV9leGVjKGxpbmtfcmVjLCAmZXZ0KTsKKworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9saW5rX3N0YXJ0X2hhbmRsZShiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBkcG9lX3NlY19mc21fbXNnICptc2cgPSAoZHBvZV9zZWNfZnNtX21zZyopb3NfbXNnOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSBvc19tc2ctPmluc3RhbmNlOworICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYzsKKyAgICBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSBldnQ7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgbGlua19yZWMgPSBoYXNoX3RhYmxlX2dldChjdHh0W2RldmljZV0ubGlua19tYXAsIChjb25zdCB1aW50OF90KikmbXNnLT5saW5rKTsKKyAgICBpZiAobGlua19yZWMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGRwb2Vfc2VjX2xpbmtfcmVjIG5ld19saW5rOworICAgICAgICBiY21vbHRfZXBvbl9uaV9jZmcgcG9uX2NmZzsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgbGlua19jZmc7CisgICAgICAgIGJjbW9sdF9lcG9uX25pX2tleSBwb25fa2V5ID0geyAuZXBvbl9uaSA9IG1zZy0+bGluay5lcG9uX25pIH07CisgICAgICAgIGJjbW9zX3RpbWVyX3Bhcm0gdHAgPQorICAgICAgICB7CisgICAgICAgICAgICAubmFtZSA9ICJkcG9lX3NlY19mc21fdGltZXIiLAorICAgICAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9EUE9FX1NFQyArIGRldmljZSwKKyAgICAgICAgICAgIC5wZXJpb2RpYyA9IEJDTU9TX0ZBTFNFLAorICAgICAgICAgICAgLmhhbmRsZXIgPSBfZHBvZV9zZWNfZnNtX2xpbmtfdGltZXJfZXhwaXJlZCwKKyAgICAgICAgICAgIC5mbGFncyA9IEJDTU9TX1RJTUVSX1BBUk1fRkxBR1NfTk9OX1VSR0VOVAorICAgICAgICB9OworCisgICAgICAgIC8qIHJldHJpZXZlIHRoZSBFUE9OIE5JIE1BQyBhZGRyZXNzICovCisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmcG9uX2NmZywgZXBvbl9uaSwgcG9uX2tleSk7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJnBvbl9jZmcsIGVwb25fbmksIG1hY19hZGRyZXNzKTsKKyAgICAgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmcG9uX2NmZy5oZHIpOworICAgICAgICBCVUdfT04oQkNNX0VSUl9PSyAhPSBlcnIpOworCisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmbGlua19jZmcsIGVwb25fbGluaywgbXNnLT5saW5rKTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmbGlua19jZmcsIGVwb25fbGluaywgbGxpZCk7CisgICAgICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZSwgJmxpbmtfY2ZnLmhkcik7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2RldmljZV0sICJGYWlsZWQgdG8gZ2V0IExMSURcbiIpOworICAgICAgICB9CisKKyAgICAgICAgbmV3X2xpbmsuZGV2aWNlID0gZGV2aWNlOworICAgICAgICBuZXdfbGluay5rZXkgPSBtc2ctPmxpbms7CisgICAgICAgIG5ld19saW5rLm5pX21hYyA9IHBvbl9jZmcuZGF0YS5tYWNfYWRkcmVzczsKKyAgICAgICAgbmV3X2xpbmsubGxpZCA9IGxpbmtfY2ZnLmRhdGEubGxpZDsKKyAgICAgICAgbmV3X2xpbmsuZnNtX3N0YXRlID0gRFBPRV9TRUNfRlNNX1NUQVRFX0lETEU7CisgICAgICAgIG5ld19saW5rLnN0YXR1cyA9IEJDTV9FUlJfSU5fUFJPR1JFU1M7CisKKyAgICAgICAgLyogYWRkIG5ldyByZWMgdG8gaGFzaCB0YWJsZSAqLworICAgICAgICBsaW5rX3JlYyA9IGhhc2hfdGFibGVfcHV0KGN0eHRbZGV2aWNlXS5saW5rX21hcCwgKHVpbnQ4X3QqKSZtc2ctPmxpbmssICZuZXdfbGluayk7CisgICAgICAgIGlmIChsaW5rX3JlYyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgJm5ld19saW5rLCAiRmFpbGVkIHRvIHN0b3JlIGxpbmsgcmVjb3JkXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRwLmRhdGEgPSAobG9uZylsaW5rX3JlYzsKKyAgICAgICAgZXJyID0gYmNtb3NfdGltZXJfY3JlYXRlKCZsaW5rX3JlYy0+dGltZW91dCwgJnRwKTsKKyAgICAgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gZXJyKTsKKyAgICB9CisKKyAgICBsaW5rX3JlYy0+Y2ZnID0gbXNnLT5kYXRhLnN0YXJ0OworCisgICAgaWYgKCFsaW5rX3JlYy0+Y2ZnLmF1dGggfHwgKGxpbmtfcmVjLT5jZmcuZW5jX21vZGUgIT0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX1RFTl9CSSkpCisgICAgeworICAgICAgICBldnQudHlwZSA9IERQT0VfU0VDX0ZTTV9FVkVOVF9FTkNSWVBUX1NUQVJUOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBldnQudHlwZSA9IERQT0VfU0VDX0ZTTV9FVkVOVF9BVVRIX1NUQVJUOworICAgIH0KKworICAgIF9kcG9lX3NlY19mc21fZXhlYyhsaW5rX3JlYywgJmV2dCk7CisKKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fbGlua19yeF9vYW1faGFuZGxlKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqb3NfbXNnKQoreworICAgIGRwb2Vfc2VjX2ZzbV9tc2cgKm1zZyA9IChkcG9lX3NlY19mc21fbXNnKilvc19tc2c7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IG9zX21zZy0+aW5zdGFuY2U7CisgICAgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjOworICAgIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhIGV2dDsKKworICAgIGxpbmtfcmVjID0gaGFzaF90YWJsZV9nZXQoY3R4dFtkZXZpY2VdLmxpbmtfbWFwLCAodWludDhfdCopJm1zZy0+bGluayk7CisgICAgaWYgKGxpbmtfcmVjID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBkcG9lX3NlY19sb2dfaWRbZGV2aWNlXSwgIkZhaWxlZCB0byBmaW5kIGxpbms6IFBPTiAldSwgIkJDTU9TX01BQ0FERFJfRk1UX1NUUiJcbiIsCisgICAgICAgICAgICAgICAgbXNnLT5saW5rLmVwb25fbmksIEJDTU9TX01BQ0FERFJfUEFSQU1TKCZtc2ctPmxpbmsubWFjX2FkZHJlc3MpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXZ0LnR5cGUgPSBEUE9FX1NFQ19GU01fRVZFTlRfUlhfT0FNOworICAgICAgICBldnQuZGF0YS5yeF9mcmFtZS52YWwgPSBtc2ctPmRhdGEucnhfZnJhbWUuZnJhbWU7CisgICAgICAgIGV2dC5kYXRhLnJ4X2ZyYW1lLmxlbiA9IG1zZy0+ZGF0YS5yeF9mcmFtZS5sZW5ndGg7CisgICAgICAgIF9kcG9lX3NlY19mc21fZXhlYyhsaW5rX3JlYywgJmV2dCk7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShtc2ctPmRhdGEucnhfZnJhbWUuZnJhbWUpOworICAgIGJjbW9zX2ZyZWUob3NfbXNnKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9saW5rX3J4X2VhcG9sX2hhbmRsZShiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBkcG9lX3NlY19mc21fbXNnICptc2cgPSAoZHBvZV9zZWNfZnNtX21zZyopb3NfbXNnOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSBvc19tc2ctPmluc3RhbmNlOworICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYzsKKyAgICBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSBldnQ7CisKKyAgICBsaW5rX3JlYyA9IGhhc2hfdGFibGVfZ2V0KGN0eHRbZGV2aWNlXS5saW5rX21hcCwgKHVpbnQ4X3QqKSZtc2ctPmxpbmspOworICAgIGlmIChsaW5rX3JlYyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBkcG9lX3NlY19sb2dfaWRbZGV2aWNlXSwgIkZhaWxlZCB0byBmaW5kIGxpbms6IFBPTiAldSwgIkJDTU9TX01BQ0FERFJfRk1UX1NUUiJcbiIsCisgICAgICAgICAgICAgICAgbXNnLT5saW5rLmVwb25fbmksIEJDTU9TX01BQ0FERFJfUEFSQU1TKCZtc2ctPmxpbmsubWFjX2FkZHJlc3MpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXZ0LnR5cGUgPSBEUE9FX1NFQ19GU01fRVZFTlRfUlhfRUFQT0w7CisgICAgICAgIGV2dC5kYXRhLnJ4X2ZyYW1lLnZhbCA9IG1zZy0+ZGF0YS5yeF9mcmFtZS5mcmFtZTsKKyAgICAgICAgZXZ0LmRhdGEucnhfZnJhbWUubGVuID0gbXNnLT5kYXRhLnJ4X2ZyYW1lLmxlbmd0aDsKKyAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9leGVjKGxpbmtfcmVjLCAmZXZ0KTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fbGlua19hdXRoX2NvbXBsZXRlKGRwb2Vfc2VjX2xpbmtfcmVjKiBsaW5rX3JlYywgYmNtb3NfZXJybm8gc3RhdHVzKQoreworICAgIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhIGV2dDsKKworICAgIGV2dC50eXBlID0gRFBPRV9TRUNfRlNNX0VWRU5UX0FVVEhfQ09NUExFVEU7CisgICAgZXZ0LmRhdGEuc3ViX3N0YXR1cyA9IHN0YXR1czsKKworICAgIF9kcG9lX3NlY19mc21fZXhlYyhsaW5rX3JlYywgJmV2dCk7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fbGlua19ta2FfY29tcGxldGUoZHBvZV9zZWNfbGlua19yZWMqIGxpbmtfcmVjLCBiY21vc19lcnJubyBzdGF0dXMpCit7CisgICAgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgZXZ0OworCisgICAgZXZ0LnR5cGUgPSBEUE9FX1NFQ19GU01fRVZFTlRfTUtBX0NPTVBMRVRFOworICAgIGV2dC5kYXRhLnN1Yl9zdGF0dXMgPSBzdGF0dXM7CisKKyAgICBfZHBvZV9zZWNfZnNtX2V4ZWMobGlua19yZWMsICZldnQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX2ZzbV9pbml0X3Rhc2soYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc190YXNrX3Bhcm0gdGFza19wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9IGN0eHRbZGV2aWNlXS50YXNrX25hbWUsCisgICAgICAgIC5wcmlvcml0eSAgICAgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9EUE9FX1NFQywKKyAgICAgICAgLmNvcmUgICAgICAgICA9IEJDTU9TX0NQVV9DT1JFX0FOWSwgLyogTm8gQ1BVIGFmZmluaXR5ICovCisgICAgICAgIC5pbml0X2hhbmRsZXIgPSBOVUxMCisgICAgfTsKKyAgICBzbnByaW50ZihjdHh0W2RldmljZV0udGFza19uYW1lLCBzaXplb2YoY3R4dFtkZXZpY2VdLnRhc2tfbmFtZSksICJ1c2VyX2FwcGxfZHBvZV9zZWMldSIsIGRldmljZSk7CisgICAgYmNtb3NfZXJybm8gcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmY3R4dFtkZXZpY2VdLnRhc2ssICZ0YXNrX3BhcmFtcyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19mc21faW5pdF9tb2R1bGUoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5xcGFybSA9IHsgLm5hbWUgPSBjdHh0W2RldmljZV0ubXNnX3F1ZXVlX25hbWUsIC5zaXplID0gRFBPRV9TRUNfRlNNX1RBU0tfTVNHX1FfU0laRSB9LAorICAgICAgICAuaW5pdCA9IE5VTEwKKyAgICB9OworICAgIHNucHJpbnRmKGN0eHRbZGV2aWNlXS5tc2dfcXVldWVfbmFtZSwgc2l6ZW9mKGN0eHRbZGV2aWNlXS5tc2dfcXVldWVfbmFtZSksICJkcG9lX3NlY19tc2dfcSV1IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gYmNtb3NfbW9kdWxlX2NyZWF0ZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0RQT0VfU0VDICsgZGV2aWNlLCAmY3R4dFtkZXZpY2VdLnRhc2ssICZtb2R1bGVfcGFyYW1zKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19mc21fc2VuZF9vc19tc2coCisgICAgYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSwKKyAgICBiY21vc19tc2dfaWQgdHlwZSwKKyAgICBkcG9lX3NlY19mc21fbXNnX2RhdGEgKmRhdGEpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgZHBvZV9zZWNfZnNtX21zZyAqbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2RldmljZV0sICJPUyBNZXNzYWdlIGNhbGxvYyBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBtc2ctPm9zX21zZy5pbnN0YW5jZSA9IGRldmljZTsKKyAgICBtc2ctPm9zX21zZy50eXBlID0gdHlwZTsKKyAgICBtc2ctPmxpbmsgPSBsaW5rX2tleTsKKyAgICBtc2ctPmRhdGEgPSAqZGF0YTsKKyAgICByYyA9IGJjbW9zX21zZ19kaXNwYXRjaCgmbXNnLT5vc19tc2csIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbZGV2aWNlXSwgIk9TIE1lc3NhZ2Ugc2VuZCBmYWlsZWQgKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9saW5rX3N0YXJ0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5LCBkcG9lX3NlY19mc21fc3RhcnRfZGF0YSAqY2ZnKQoreworICAgIGRwb2Vfc2VjX2ZzbV9tc2dfZGF0YSBkYXRhOworCisgICAgZGF0YS5zdGFydCA9ICpjZmc7CisKKyAgICByZXR1cm4gX2Rwb2Vfc2VjX2ZzbV9zZW5kX29zX21zZyhkZXZpY2UsIGxpbmtfa2V5LCBCQ01PU19NU0dfSURfRFBPRV9TRUNfU1RBUlQsICZkYXRhKTsKK30KKworYmNtb3NfZXJybm8gZHBvZV9zZWNfZnNtX2xpbmtfcnhfb2FtKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5LCB1aW50OF90ICpvYW0sIHVpbnQxNl90IGxlbmd0aCkKK3sKKyAgICBkcG9lX3NlY19mc21fbXNnX2RhdGEgZGF0YTsKKworICAgIGRhdGEucnhfZnJhbWUuZnJhbWUgPSBvYW07CisgICAgZGF0YS5yeF9mcmFtZS5sZW5ndGggPSBsZW5ndGg7CisKKyAgICByZXR1cm4gX2Rwb2Vfc2VjX2ZzbV9zZW5kX29zX21zZyhkZXZpY2UsIGxpbmtfa2V5LCBCQ01PU19NU0dfSURfRFBPRV9TRUNfUlhfT0FNLCAmZGF0YSk7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9saW5rX3J4X2VhcG9sKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgbGlua19rZXksCisgICAgdWludDhfdCAqZWFwb2wsCisgICAgdWludDE2X3QgbGVuZ3RoKQoreworICAgIGRwb2Vfc2VjX2ZzbV9tc2dfZGF0YSBkYXRhOworCisgICAgZGF0YS5yeF9mcmFtZS5mcmFtZSA9IGVhcG9sOworICAgIGRhdGEucnhfZnJhbWUubGVuZ3RoID0gbGVuZ3RoOworCisgICAgcmV0dXJuIF9kcG9lX3NlY19mc21fc2VuZF9vc19tc2coZGV2aWNlLCBsaW5rX2tleSwgQkNNT1NfTVNHX0lEX0RQT0VfU0VDX1JYX0VBUE9MLCAmZGF0YSk7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9pbml0KAorICAgIGZfZHBvZV9zZWNfY2VydF90cnVzdF9jYiBjZXJ0X3RydXN0X2NiLAorICAgIGZfZHBvZV9zZWNfZnNtX2NiIGZzbV9jb21wbGV0ZV9jYikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGZvciAodWludDMyX3QgZGV2aWNlID0gMDsgZGV2aWNlIDwgQkNNVFJfTUFYX09MVFM7IGRldmljZSsrKQorICAgIHsKKyAgICAgICAgcmMgPSBfZHBvZV9zZWNfZnNtX2luaXRfdGFzayhkZXZpY2UpOworICAgICAgICBCVUdfT04ocmMgIT0gQkNNX0VSUl9PSyk7CisKKyAgICAgICAgcmMgPSBfZHBvZV9zZWNfZnNtX2luaXRfbW9kdWxlKGRldmljZSk7CisgICAgICAgIEJVR19PTihyYyAhPSBCQ01fRVJSX09LKTsKKworICAgICAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgICAgICBzbnByaW50Zihsb2dfbmFtZSwgc2l6ZW9mKGxvZ19uYW1lKSwgInVzZXJfYXBwbF9kcG9lX3NlYyV1IiwgZGV2aWNlKTsKKyAgICAgICAgZHBvZV9zZWNfbG9nX2lkW2RldmljZV0gPSBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihsb2dfbmFtZSwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisKKyAgICAgICAgYmNtb3NfbXNnX3JlZ2lzdGVyKAorICAgICAgICAgICAgQkNNT1NfTVNHX0lEX0RQT0VfU0VDX1NUQVJULAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9EUE9FX1NFQyArIGRldmljZSwKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fbGlua19zdGFydF9oYW5kbGUpOworICAgICAgICBiY21vc19tc2dfcmVnaXN0ZXIoCisgICAgICAgICAgICBCQ01PU19NU0dfSURfRFBPRV9TRUNfUlhfT0FNLAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9EUE9FX1NFQyArIGRldmljZSwKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fbGlua19yeF9vYW1faGFuZGxlKTsKKyAgICAgICAgYmNtb3NfbXNnX3JlZ2lzdGVyKAorICAgICAgICAgICAgQkNNT1NfTVNHX0lEX0RQT0VfU0VDX1JYX0VBUE9MLAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9EUE9FX1NFQyArIGRldmljZSwKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fbGlua19yeF9lYXBvbF9oYW5kbGUpOworCisgICAgICAgIGN0eHRbZGV2aWNlXS5saW5rX21hcCA9IGhhc2hfdGFibGVfY3JlYXRlKAorICAgICAgICAgICAgRFBPRV9TRUNfRlNNX01BWF9MSU5LUywKKyAgICAgICAgICAgIHNpemVvZihkcG9lX3NlY19saW5rX3JlYyksCisgICAgICAgICAgICBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpLAorICAgICAgICAgICAgImRwb2Vfc2VjX2xpbmtfc3RhdGUiKTsKKyAgICAgICAgQlVHX09OKGN0eHRbZGV2aWNlXS5saW5rX21hcCA9PSBOVUxMKTsKKyAgICB9CisKKyAgICBfZnNtX2NvbXBsZXRlID0gZnNtX2NvbXBsZXRlX2NiOworCisgICAgZHBvZV9lYXBfdGxzX2luaXQoX2Rwb2Vfc2VjX2ZzbV9saW5rX2F1dGhfY29tcGxldGUsIGNlcnRfdHJ1c3RfY2IpOworICAgIGRwb2Vfc2VjX21rYV9mc21faW5pdChfZHBvZV9zZWNfZnNtX2xpbmtfbWthX2NvbXBsZXRlKTsKKworICAgIHJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY19mc20uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfZnNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4YjNhZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfZnNtLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0RQT0VfU0VDX0ZTTV9IXworI2RlZmluZSBfRFBPRV9TRUNfRlNNX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfZXBvbl9vYW1fdHlwZXMuaCIKKyNpbmNsdWRlICJkcG9lX2VhcF90bHMuaCIKKyNpbmNsdWRlICJkcG9lX3NlY19ta2FfZnNtLmgiCisKKy8qIERQb0UgU2VjdXJpdHkgRlNNIEV2ZW50IFR5cGUgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgZW51bSBkcG9lX3NlY19mc21fZXZlbnQKK3sKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfX0ZJUlNULAorICAgIERQT0VfU0VDX0ZTTV9FVkVOVF9FTkNSWVBUX1NUQVJUID0gRFBPRV9TRUNfRlNNX0VWRU5UX19GSVJTVCwKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfQVVUSF9TVEFSVCwKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfUlhfT0FNLAorICAgIERQT0VfU0VDX0ZTTV9FVkVOVF9SWF9FQVBPTCwKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfQVVUSF9DT01QTEVURSwKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfTUtBX0NPTVBMRVRFLAorICAgIERQT0VfU0VDX0ZTTV9FVkVOVF9USU1FT1VULAorCisgICAgRFBPRV9TRUNfRlNNX0VWRU5UX19DT1VOVAorfSBkcG9lX3NlY19mc21fZXZlbnQ7CisKKy8qIERQb0UgU2VjdXJpdHkgRlNNIFN0YXRlIGRlZmluaXRpb25zICovCit0eXBlZGVmIGVudW0gZHBvZV9zZWNfZnNtX3N0YXRlCit7CisgICAgRFBPRV9TRUNfRlNNX1NUQVRFX19GSVJTVCwKKyAgICBEUE9FX1NFQ19GU01fU1RBVEVfSURMRSA9IERQT0VfU0VDX0ZTTV9TVEFURV9fRklSU1QsCisgICAgRFBPRV9TRUNfRlNNX1NUQVRFX0FVVEhfV0FJVCwKKyAgICBEUE9FX1NFQ19GU01fU1RBVEVfRU5DUllQVF9ET1dOX1dBSVQsCisgICAgRFBPRV9TRUNfRlNNX1NUQVRFX0VOQ1JZUFRfQklfV0FJVCwKKyAgICBEUE9FX1NFQ19GU01fU1RBVEVfQ09NUExFVEUsCisKKyAgICBEUE9FX1NFQ19GU01fU1RBVEVfX0NPVU5UCit9IGRwb2Vfc2VjX2ZzbV9zdGF0ZTsKKworLyogRFBvRSBTZWN1cml0eSBGU00gRXZlbnQgY29udGVudHMuIFRoaXMgaXMgYSB1bmlvbiBvZiBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgRFBvRSBTZWN1cml0eSBGU00uIFRoaXMgZGF0YSB0eXBlCisgKiBwZXJtaXRzIGEgY29tbW9uIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgdGhlIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24gdGFibGUuICovCit0eXBlZGVmIHN0cnVjdCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YQoreworICAgIGRwb2Vfc2VjX2ZzbV9ldmVudCB0eXBlOworICAgIHVuaW9uCisgICAgeworICAgICAgICBiY21vbHRfdThfbGlzdF91MTYgcnhfZnJhbWU7CisgICAgICAgIGJjbW9zX2Vycm5vIHN1Yl9zdGF0dXM7CisgICAgfSBkYXRhOworfSBkcG9lX3NlY19mc21fZXZlbnRfZGF0YTsKKworc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSBlbmNfbW9kZTsKKyAgICBiY21vc19ib29sIGF1dGg7Cit9IGRwb2Vfc2VjX2ZzbV9zdGFydF9kYXRhOworCit0eXBlZGVmIHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYworeworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2U7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OworICAgIGRwb2Vfc2VjX2ZzbV9zdGFydF9kYXRhIGNmZzsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBuaV9tYWM7CisgICAgYmNtb2x0X2Vwb25fbGxpZCBsbGlkOworICAgIGRwb2Vfc2VjX2ZzbV9zdGF0ZSBmc21fc3RhdGU7CisgICAgYmNtb3NfZXJybm8gc3RhdHVzOworICAgIGJjbW9zX3RpbWVyIHRpbWVvdXQ7CisgICAgb251X2F1dGhfY29udHJvbCBhdXRoX2N0cmw7CisgICAgZHBvZV9zZWNfbWthX2ZzbV9jdHJsIG1rYV9jdHJsOworfSBkcG9lX3NlY19saW5rX3JlYzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICpmcmFtZTsKKyAgICB1aW50MTZfdCBsZW5ndGg7Cit9IGRwb2Vfc2VjX2ZzbV9yeF9mcmFtZV9kYXRhOworCit0eXBlZGVmIHVuaW9uCit7CisgICAgZHBvZV9zZWNfZnNtX3N0YXJ0X2RhdGEgc3RhcnQ7CisgICAgZHBvZV9zZWNfZnNtX3J4X2ZyYW1lX2RhdGEgcnhfZnJhbWU7Cit9IGRwb2Vfc2VjX2ZzbV9tc2dfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgb3NfbXNnOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbms7CisgICAgZHBvZV9zZWNfZnNtX21zZ19kYXRhIGRhdGE7Cit9IGRwb2Vfc2VjX2ZzbV9tc2c7CisKK3R5cGVkZWYgdm9pZCAoKmZfZHBvZV9zZWNfZnNtX2NiKShiY21vbHRfZGV2aWQsIGJjbW9sdF9lcG9uX2xpbmtfa2V5LCBiY21vc19lcnJubyk7CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9saW5rX3N0YXJ0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5LCBkcG9lX3NlY19mc21fc3RhcnRfZGF0YSAqY2ZnKTsKKworYmNtb3NfZXJybm8gZHBvZV9zZWNfZnNtX2xpbmtfcnhfb2FtKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmssIHVpbnQ4X3QgKm9hbSwgdWludDE2X3QgbGVuZ3RoKTsKKworYmNtb3NfZXJybm8gZHBvZV9zZWNfZnNtX2xpbmtfcnhfZWFwb2woYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2Vwb25fbGlua19rZXkgbGluaywgdWludDhfdCAqZWFwb2wsIHVpbnQxNl90IGxlbmd0aCk7CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9pbml0KGZfZHBvZV9zZWNfY2VydF90cnVzdF9jYiBjZXJ0X3RydXN0X2NiLCBmX2Rwb2Vfc2VjX2ZzbV9jYiBmc21fY29tcGxldGVfY2IpOworCisjZW5kaWYgLyogX0RQT0VfU0VDX0ZTTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY19ta2FfZnNtLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX21rYV9mc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTc0ZDYzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY19ta2FfZnNtLmMKQEAgLTAsMCArMSw4MzAgQEAKKy8qCisgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgIG9mIHRoZSBzb2Z0d2FyZS4KKworICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgIHdyaXR0ZW4gY29uc2VudC4KKworICA6PgorKi8KKworI2luY2x1ZGUgImRwb2Vfc2VjX2ZzbS5oIgorI2luY2x1ZGUgImRwb2Vfc2VjX21rYV9mc20uaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmgiCisjaW5jbHVkZSAiZHBvZV9zZWNfdXRpbC5oIgorCit0eXBlZGVmIGVudW0gZHBvZV9zZWNfbWthX2ZzbV9ldmVudF90eXBlCit7CisgICAgRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9fSU5WQUxJRCAgICAgPSAtMSwgLyoqPCBwZXJtaXRzIGV2ZW50IHZhbGlkYXRpb24gKi8KKworICAgIERQT0VfU0VDX01LQV9GU01fRVZFTlRfSU5JVCAgICAgICAgID0gIDAsCisgICAgRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9PQU0gICAgICAgLAorICAgIERQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfRUFQT0wgICAgICwKKyAgICBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVQgICwKKyAgICBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1RYX1RJTUVPVVQgICwKKyAgICBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1AgICAgICAgICAsCisKKyAgICBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX19DT1VOVAorfSBkcG9lX3NlY19ta2FfZnNtX2V2ZW50X3R5cGU7CisKKy8qIE1LQSBGU00gRXZlbnQgY29udGVudHMuIFRoaXMgaXMgYSB1bmlvbiBvZiBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgTUtBIEZTTS4gVGhpcyBkYXRhIHR5cGUgcGVybWl0cyBhIGNvbW1vbgorICogZnVuY3Rpb24gcHJvdG90eXBlIGZvciB0aGUgc3RhdGUgbWFjaGluZSBmdW5jdGlvbiB0YWJsZS4gKi8KK3R5cGVkZWYgc3RydWN0IGRwb2Vfc2VjX21rYV9mc21fZXZlbnQKK3sKKyAgICBkcG9lX3NlY19ta2FfZnNtX2V2ZW50X3R5cGUgdHlwZTsgLyoqPCBUeXBlIG9mIGV2ZW50Ki8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTE2IHJ4X2ZyYW1lOworICAgIH0gZGF0YTsKK30gZHBvZV9zZWNfbWthX2ZzbV9ldmVudDsKKwordHlwZWRlZiBiY21vc19lcnJubyAoKmZfZHBvZV9zZWNfbWthX2ZzbSkoZHBvZV9zZWNfbGlua19yZWMgKm1rYV9jdHJsLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpOworCitzdGF0aWMgY29uc3QgY2hhciAqZHBvZV9zZWNfbWthX2ZzbV9ldmVudF9uYW1lW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfX0NPVU5UXSA9Cit7CisgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfSU5JVF0gPSAiSW5pdGlhbGl6YXRpb24iLAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX09BTV0gPSAiT0FNIFJlc3BvbnNlIiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSAiUlggRUFQT0wiLAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVRdID0gIkZTTSBUaW1lb3V0IiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9UWF9USU1FT1VUXSA9ICJNS0EgVGltZW91dCIsCisgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfU1RPUF0gPSAiU3RvcCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpkcG9lX3NlY19ta2FfZnNtX3N0YXRlX25hbWVbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9fQ09VTlRdID0KK3sKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9OVUxMXSA9ICJOdWxsIiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TRVRfRU5DUllQVElPTl0gPSAiU2V0IEVuY3J5cHRpb24iLAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NUQVJUX01LQSBdID0gIlN0YXJ0IE1LQSIsCisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VORF9TQUtdID0gIlNlbmQgU0FLIiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9PUEVSQVRJT05BTF0gPSAiT3BlcmF0aW9uYWwiLAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NFTkRfTkVXX1NBS10gPSAiU2VuZCBOZXcgU0FLIgorfTsKKworc3RhdGljIGZfZHBvZV9zZWNfbWthX2NiIF9ta2FfZG9uZV9jYjsKKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX2V4ZWMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmssIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgKmV2dCk7CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX3NlY19ta2FfZnNtX2V2ZW50X3R5cGVfaXNfdmFsaWQoZHBvZV9zZWNfbWthX2ZzbV9ldmVudF90eXBlIHR5cGUpCit7CisgICAgcmV0dXJuICh0eXBlID4gRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9fSU5WQUxJRCkgJiYgKHR5cGUgPCBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX19DT1VOVCk7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX3NlY19ta2FfZnNtX3N0YXRlX2lzX3ZhbGlkKGRwb2Vfc2VjX21rYV9mc21fc3RhdGUgc3RhdGUpCit7CisgICAgcmV0dXJuIChzdGF0ZSA+IERQT0VfU0VDX01LQV9GU01fU1RBVEVfX0lOVkFMSUQpICYmIChzdGF0ZSA8IERQT0VfU0VDX01LQV9GU01fU1RBVEVfX0NPVU5UKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9kcG9lX3NlY19ta2FfZnNtX2V2ZW50X25hbWUoZHBvZV9zZWNfbWthX2ZzbV9ldmVudF90eXBlIHR5cGUpCit7CisgICAgaWYgKF9kcG9lX3NlY19ta2FfZnNtX2V2ZW50X3R5cGVfaXNfdmFsaWQodHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gZHBvZV9zZWNfbWthX2ZzbV9ldmVudF9uYW1lW3R5cGVdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gIlVua25vd24gRXZlbnQiOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9kcG9lX3NlY19ta2FfZnNtX3N0YXRlX25hbWUoZHBvZV9zZWNfbWthX2ZzbV9zdGF0ZSBzdGF0ZSkKK3sKKyAgICBpZiAoX2Rwb2Vfc2VjX21rYV9mc21fc3RhdGVfaXNfdmFsaWQoc3RhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRwb2Vfc2VjX21rYV9mc21fc3RhdGVfbmFtZVtzdGF0ZV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAiVW5rbm93biBTdGF0ZSI7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fZXJyb3IoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgLyogVE9ETzogbG9nIHVuZXhwZWN0ZWQgZXZlbnQgKi8KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfbWthX2ZzbV9jbGVhbnVwKGRwb2Vfc2VjX21rYV9mc21fY3RybCAqbWthX2N0cmwpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obWthX2N0cmwgPT0gTlVMTCk7CisKKyAgICBpZiAobWthX2N0cmwtPm1rYV9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBDbGVhciBhbGwgTUtBIGluZm9ybWF0aW9uIGJlZm9yZSBmcmVlaW5nLiAqLworICAgICAgICBtZW1zZXQobWthX2N0cmwtPm1rYV9pbmZvLCAwLCBzaXplb2YoKm1rYV9jdHJsLT5ta2FfaW5mbykpOworICAgICAgICBiY21vc19mcmVlKG1rYV9jdHJsLT5ta2FfaW5mbyk7CisgICAgICAgIG1rYV9jdHJsLT5ta2FfaW5mbyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1rYV9jdHJsLT5ta2FfZnNtX2luZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIENsZWFyIGFsbCBNS0EgRlNNIGluZm9ybWF0aW9uIGJlZm9yZSBmcmVlaW5nLiAqLworICAgICAgICBtZW1zZXQobWthX2N0cmwtPm1rYV9mc21faW5mbywgMCwgc2l6ZW9mKCpta2FfY3RybC0+bWthX2ZzbV9pbmZvKSk7CisgICAgICAgIGJjbW9zX2ZyZWUobWthX2N0cmwtPm1rYV9mc21faW5mbyk7CisgICAgICAgIG1rYV9jdHJsLT5ta2FfZnNtX2luZm8gPSBOVUxMOworICAgIH0KKworICAgIG1rYV9jdHJsLT5ta2FfZnNtX3N0YXRlID0gRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9OVUxMOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc3RvcChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICAvKiBUaGUgc3RvcCBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaCB0aW1lIHRoZSBMaW5rIGRlcmVnaXN0ZXJzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgTUtBIEZTTSBpcyBydW5uaW5nIG9yIG5vdC4KKyAgICAgICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgaXQgaXMgbm90IHJ1bm5pbmcuICovCisgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8qIFN0b3AgYW55IHRpbWVycyB0aGF0IG1heSBiZSBydW5uaW5nLiAqLworICAgIGJjbW9zX3RpbWVyX3N0b3AoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyKTsKKyAgICBiY21vc190aW1lcl9zdG9wKCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT50eF90aW1lcik7CisKKyAgICAvKiBDaGFuZ2UgdG8gdGhlIE5VTEwgc3RhdGUgKi8KKyAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfTlVMTDsKKworICAgIC8qIEZyZWUgZHluYW1pYyBNS0EgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay4gKi8KKyAgICBfZHBvZV9zZWNfbWthX2ZzbV9jbGVhbnVwKCZsaW5rX3JlYy0+bWthX2N0cmwpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBfZHBvZV9zZWNfbWthX2ZzbV9yeF90aW1lcl9leHBpcmUoYmNtb3NfdGltZXIgKnRpbWVyLCBsb25nIGRhdGEpCit7CisgICAgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjID0gKGRwb2Vfc2VjX2xpbmtfcmVjKilkYXRhOworICAgIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgZXZudCA9IHt9OworCisgICAgLyogUGFyYW1ldGVyIENoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKworICAgIC8qIFNldCB1cCB0aGUgZXZlbnQgKi8KKyAgICBldm50LnR5cGUgPSBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVQ7CisKKyAgICAvKiBFeGVjdXRlIHRoZSBzdGF0ZSBtYWNoaW5lICovCisgICAgX2Rwb2Vfc2VjX21rYV9mc21fZXhlYyhsaW5rX3JlYywgJmV2bnQpOworCisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgX2Rwb2Vfc2VjX21rYV9mc21fdHhfdGltZXJfZXhwaXJlKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYyA9IChkcG9lX3NlY19saW5rX3JlYyopZGF0YTsKKyAgICBkcG9lX3NlY19ta2FfZnNtX2V2ZW50IGV2bnQgPSB7fTsKKworICAgIC8qIFBhcmFtZXRlciBDaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisKKyAgICAvKiBTZXQgdXAgdGhlIGV2ZW50ICovCisgICAgZXZudC50eXBlID0gRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9UWF9USU1FT1VUOworCisgICAgLyogRXhlY3V0ZSB0aGUgc3RhdGUgbWFjaGluZSAqLworICAgIF9kcG9lX3NlY19ta2FfZnNtX2V4ZWMobGlua19yZWMsICZldm50KTsKKworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX2luaXRpYWxpemUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9zX3RpbWVyX3Bhcm0gcnhfdHAgPQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZHBvZV9zZWNfbWthX2ZzbV90aW1lciIsCisgICAgICAgIC5vd25lciA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRFBPRV9TRUMgKyBsaW5rX3JlYy0+ZGV2aWNlLAorICAgICAgICAucGVyaW9kaWMgPSBCQ01PU19GQUxTRSwKKyAgICAgICAgLmhhbmRsZXIgPSBfZHBvZV9zZWNfbWthX2ZzbV9yeF90aW1lcl9leHBpcmUsCisgICAgICAgIC5kYXRhID0gKGxvbmcpbGlua19yZWMsCisgICAgICAgIC5mbGFncyA9IEJDTU9TX1RJTUVSX1BBUk1fRkxBR1NfTk9OX1VSR0VOVAorICAgIH07CisgICAgYmNtb3NfdGltZXJfcGFybSB0eF90cCA9CisgICAgeworICAgICAgICAubmFtZSA9ICJkcG9lX3NlY19ta2FfbWthX3RpbWVyIiwKKyAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9EUE9FX1NFQyArIGxpbmtfcmVjLT5kZXZpY2UsCisgICAgICAgIC5wZXJpb2RpYyA9IEJDTU9TX1RSVUUsCisgICAgICAgIC5oYW5kbGVyID0gX2Rwb2Vfc2VjX21rYV9mc21fdHhfdGltZXJfZXhwaXJlLAorICAgICAgICAuZGF0YSA9IChsb25nKWxpbmtfcmVjLAorICAgICAgICAuZmxhZ3MgPSBCQ01PU19USU1FUl9QQVJNX0ZMQUdTX05PTl9VUkdFTlQKKyAgICB9OworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgLyogQWxsb2NhdGUgdGhlIE1LQSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICovCisgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvKSk7CisgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgdGhlIE1LQSBGU00gaW5mb3JtYXRpb24gc3RydWN0dXJlLiAqLworICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPSBiY21vc19jYWxsb2Moc2l6ZW9mKCpsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvKSk7CisgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX2NsZWFudXAoJmxpbmtfcmVjLT5ta2FfY3RybCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGVyciA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+cnhfdGltZXIsICZyeF90cCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgX2Rwb2Vfc2VjX21rYV9mc21fY2xlYW51cCgmbGlua19yZWMtPm1rYV9jdHJsKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vc190aW1lcl9jcmVhdGUoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnR4X3RpbWVyLCAmdHhfdHApOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX2NsZWFudXAoJmxpbmtfcmVjLT5ta2FfY3RybCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogQ2hhbmdlIHRvIHRoZSBTRVRfTElOS19FTkNSWVBUSU9OX01PREUgc3RhdGUgKi8KKyAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VUX0VOQ1JZUFRJT047CisgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyLCBEUE9FX1NFQ19PQU1fVElNRU9VVCk7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9zZXRfZW5jcnlwdGlvbigKKyAgICAgICAgbGlua19yZWMtPmRldmljZSwKKyAgICAgICAgbGlua19yZWMtPmtleS5lcG9uX25pLAorICAgICAgICAmbGlua19yZWMtPmtleS5tYWNfYWRkcmVzcywKKyAgICAgICAgbGlua19yZWMtPmNmZy5lbmNfbW9kZSwKKyAgICAgICAgMCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX3N1Y2Nlc3MoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihfbWthX2RvbmVfY2IgPT0gTlVMTCk7CisKKyAgICBfbWthX2RvbmVfY2IobGlua19yZWMsIEJDTV9FUlJfT0spOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vc19lcnJubyByZWFzb24pCit7CisgICAgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCBldmVudCA9IHsgLnR5cGUgPSBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1AgfTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihfbWthX2RvbmVfY2IgPT0gTlVMTCk7CisKKyAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJNS0Egc3RvcHBpbmchXG4iKTsKKworICAgIC8qIE5vdGlmeSB0aGUgRFBvRSBTZWN1cml0eSBGU00gb2YgdGhlIE1LQSBlcnJvci4gKi8KKyAgICBfbWthX2RvbmVfY2IobGlua19yZWMsIHJlYXNvbik7CisKKyAgICAvKiBTdG9wIHRoZSBGU00gZHVlIHRvIHRoZSBlcnJvci4gKi8KKyAgICByZXR1cm4gX2Rwb2Vfc2VjX21rYV9mc21fc3RvcChsaW5rX3JlYywgJmV2ZW50KTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX3J4X3RpbWVvdXQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiVElNRU9VVCBlcnJvciFcbiIpOworCisgICAgLyogTm90aWZ5IHRoZSBEUG9FIFNlY3VyaXR5IEZTTSBvZiB0aGUgTUtBIGVycm9yLiAqLworICAgIHJldHVybiBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUobGlua19yZWMsIEJDTV9FUlJfVElNRU9VVCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9yeF9vYW0oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlICpkcG9lOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworICAgIEJVR19PTihldnQtPmRhdGEucnhfZnJhbWUudmFsID09IE5VTEwpOworCisgICAgb2FtX2ZyYW1lID0gZXBvbl9vYW1fdW5wYWNrKGxpbmtfcmVjLT5kZXZpY2UsIGV2dC0+ZGF0YS5yeF9mcmFtZS5sZW4sIGV2dC0+ZGF0YS5yeF9mcmFtZS52YWwpOworICAgIGlmIChOVUxMID09IG9hbV9mcmFtZSkKKyAgICB7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIk9BTSB1bnBhY2sgZmFpbGVkIVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIGlmICghZXBvbl9vYW1faXNfZHBvZShvYW1fZnJhbWUpKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBkcG9lID0gJm9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZTsKKworICAgIGlmIChlcG9uX29hbV9pc19kcG9lX2VuY3J5cHRfcmVzcG9uc2UoZHBvZSkpCisgICAgeworICAgICAgICBpZiAoKGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoID09IDB4ODApICYmCisgICAgICAgICAgICAoZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGggPT0gMHg4MCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX3N0b3AoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHRvIHRoZSBTVEFSVF9NS0Egc3RhdGUgKi8KKyAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX3N0YXRlID0gRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TVEFSVF9NS0E7CisKKyAgICAgICAgICAgIC8qIFNlbmQgdGhlIGluaXRpYWwgTUtBIHBhY2tldCB0byB0aGUgT05VIGZvciB0aGUgc3BlY2lmaWVkIGxpbmsuICovCisgICAgICAgICAgICByYyA9IG1rYV9zdGFydChsaW5rX3JlYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJPTlUgcmVqZWN0ZWQgZW5jcnlwdGlvbjogWzBdID0gMHgleCwgWzFdID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGgpOworICAgICAgICAgICAgLyogTm90aWZ5IHRoZSBEUG9FIFNlY3VyaXR5IEZTTSBvZiB0aGUgTUtBIGVycm9yLiAqLworICAgICAgICAgICAgcmMgPSBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUobGlua19yZWMsIEJDTV9FUlJfT05VX0VSUl9SRVNQKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBpZ25vcmUgb3RoZXIgT0FNICovCisgICAgfQorCisgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc3RhcnRfdGltZW91dChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICByZXR1cm4gbWthX3Byb2Nlc3NfdGltZW91dChsaW5rX3JlYywgTUtBX09QX1NUQVJUX1RJTUVPVVQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc3RhcnRfcnhfZWFwb2woZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgcmMgPSBta2FfcHJvY2Vzc19wYWNrZXQobGlua19yZWMsIGV2dC0+ZGF0YS5yeF9mcmFtZSwgTUtBX09QX1NUQVJUX1JTUCk7CisgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIga2V5X2luZm87CisKKyAgICAgICAgLyogUmUtc3RhcnQgdGhlIHJ4IHRpbWVyICovCisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT5yeF90aW1lciwgTUtBX0xJRkVfVElNRSAqIDEwMDApOworCisgICAgICAgIC8qIEdlbmVyYXRlIHRoZSBpbml0aWFsIFNBSy4gKi8KKyAgICAgICAgbWthX2dlbmVyYXRlX3NhayhsaW5rX3JlYywgQkNNT1NfVFJVRSk7CisKKyAgICAgICAga2V5X2luZm8uZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOworICAgICAgICBtZW1jcHkoa2V5X2luZm8udS5jdHIua2V5LCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNhaywgc2l6ZW9mKGtleV9pbmZvLnUuY3RyLmtleSkpOworICAgICAgICBtZW1jcHkoa2V5X2luZm8udS5jdHIuc2NpLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9udV9zY2ksIHNpemVvZihrZXlfaW5mby51LmN0ci5zY2kpKTsKKworICAgICAgICAvKiBJbnN0YWxsIHRoZSBTQUsgYXMgdGhlIFVTIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIGxpbmsuICovCisgICAgICAgIHJjID0gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2tleV9zZXQoCisgICAgICAgICAgICBsaW5rX3JlYy0+ZGV2aWNlLAorICAgICAgICAgICAgJmxpbmtfcmVjLT5rZXksCisgICAgICAgICAgICBCQ01PU19UUlVFLAorICAgICAgICAgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX0VQT05fWkVST19PVkVSSEVBRF9BRVMsCisgICAgICAgICAgICAoYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSkoKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlciArIDEpICUgMiksCisgICAgICAgICAgICAma2V5X2luZm8pOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBta2Ffc2VuZF9zYWsobGlua19yZWMsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIENoYW5nZSB0byB0aGUgU0VORF9TQUsgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VORF9TQUs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAic2VuZCBTQUsgZmFpbGVkIVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJrZXkgc2V0IGZhaWxlZCAlZCFcbiIsIHJjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJNS0EgcHJvY2VzcyBwYWNrZXQgZmFpbGVkIVxuIik7CisgICAgfQorCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBOb3RpZnkgdGhlIERQb0UgU2VjdXJpdHkgRlNNIG9mIHRoZSBNS0EgZXJyb3IuICovCisgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX3NlbmRfZmFpbHVyZShsaW5rX3JlYywgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX3Nha190aW1lb3V0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIHJldHVybiBta2FfcHJvY2Vzc190aW1lb3V0KGxpbmtfcmVjLCBNS0FfT1BfU0FLX1RJTUVPVVQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc2FrX3J4X2VhcG9sKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgcmMgPSBta2FfcHJvY2Vzc19wYWNrZXQobGlua19yZWMsIGV2dC0+ZGF0YS5yeF9mcmFtZSwgTUtBX09QX1NBS19SU1ApOworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGtleV9pbmZvOworCisgICAgICAgIC8qIFJlLXN0YXJ0IHRoZSByeCB0aW1lciAqLworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+cnhfdGltZXIsIE1LQV9MSUZFX1RJTUUgKiAxMDAwKTsKKworICAgICAgICBrZXlfaW5mby5mb3JtYXQgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFI7CisgICAgICAgIG1lbWNweShrZXlfaW5mby51LmN0ci5rZXksIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrLCBzaXplb2Yoa2V5X2luZm8udS5jdHIua2V5KSk7CisgICAgICAgIG1lbWNweShrZXlfaW5mby51LmN0ci5zY2ksIGxpbmtfcmVjLT5uaV9tYWMudTgsIEJDTU9TX0VUSF9BTEVOKTsKKyAgICAgICAga2V5X2luZm8udS5jdHIuc2NpWzZdID0gKGxpbmtfcmVjLT5sbGlkID4+IDgpICYgMHhmZjsKKyAgICAgICAga2V5X2luZm8udS5jdHIuc2NpWzddID0gKGxpbmtfcmVjLT5sbGlkID4+IDApICYgMHhmZjsKKworICAgICAgICAvKiBJbnN0YWxsIHRoZSBTQUsgYXMgdGhlIFVTIGFuZCBEUyBlbmNyeXB0aW9uIGtleSBmb3IgdGhpcyBsaW5rLiAqLworICAgICAgICByYyA9IGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9rZXlfc2V0KAorICAgICAgICAgICAgbGlua19yZWMtPmRldmljZSwKKyAgICAgICAgICAgICZsaW5rX3JlYy0+a2V5LAorICAgICAgICAgICAgQkNNT1NfRkFMU0UsCisgICAgICAgICAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUywKKyAgICAgICAgICAgIChiY21vbHRfZXBvbl9rZXlfY2hvaWNlKSgobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZXlfbnVtYmVyICsgMSkgJSAyKSwKKyAgICAgICAgICAgICZrZXlfaW5mbyk7CisgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1rYV9zZW5kX3Nha19jb25maXJtKGxpbmtfcmVjKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE5vdGlmeSB0aGUgRFBvRSBTZWN1cml0eSBGU00gb2YgdGhlIE1LQSByZXN1bHQuICovCisgICAgICAgICAgICAgICAgcmMgPSBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX3N1Y2Nlc3MobGlua19yZWMpOworCisgICAgICAgICAgICAgICAgLyogQ2hhbmdlIHRvIHRoZSBPUEVSQVRJT05BTCBzdGF0ZSAqLworICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX3N0YXRlID0gRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9PUEVSQVRJT05BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogTm90aWZ5IHRoZSBEUG9FIFNlY3VyaXR5IEZTTSBvZiB0aGUgTUtBIGVycm9yLiAqLworICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUobGlua19yZWMsIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2tlZXBfYWxpdmUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgcmV0dXJuIG1rYV9wcm9jZXNzX3RpbWVvdXQobGlua19yZWMsIE1LQV9PUF9TRU5EX0tFRVBfQUxJVkUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc2FrX3JlZnJlc2goZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGtleV9pbmZvOworCisgICAgLyogR2VuZXJhdGUgdGhlIG5ldyBTQUsuICovCisgICAgbWthX2dlbmVyYXRlX3NhayhsaW5rX3JlYywgQkNNT1NfRkFMU0UpOworCisgICAga2V5X2luZm8uZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOworICAgIG1lbWNweShrZXlfaW5mby51LmN0ci5rZXksIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrLCBzaXplb2Yoa2V5X2luZm8udS5jdHIua2V5KSk7CisgICAgbWVtY3B5KGtleV9pbmZvLnUuY3RyLnNjaSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbnVfc2NpLCBzaXplb2Yoa2V5X2luZm8udS5jdHIuc2NpKSk7CisKKyAgICAvKiBJbnN0YWxsIHRoZSBuZXcgU0FLIGFzIHRoZSBVUyBlbmNyeXB0aW9uIGtleSBmb3IgdGhpcyBsaW5rLiAqLworICAgIHJjID0gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2tleV9zZXQoCisgICAgICAgIGxpbmtfcmVjLT5kZXZpY2UsCisgICAgICAgICZsaW5rX3JlYy0+a2V5LAorICAgICAgICBCQ01PU19UUlVFLAorICAgICAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUywKKyAgICAgICAgKGJjbW9sdF9lcG9uX2tleV9jaG9pY2UpKChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIgKyAxKSAlIDIpLAorICAgICAgICAma2V5X2luZm8pOworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmMgPSBta2Ffc2VuZF9zYWsobGlua19yZWMsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bmV3X3Nhayk7CisgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDaGFuZ2UgdG8gdGhlIFNFTkRfU0FLIHN0YXRlICovCisgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VORF9ORVdfU0FLOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICAvKiBOb3RpZnkgdGhlIERQb0UgU2VjdXJpdHkgRlNNIG9mIHRoZSBNS0EgZXJyb3IuICovCisgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX3NlbmRfZmFpbHVyZShsaW5rX3JlYywgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX2hhbmRsZV9rZWVwX2FsaXZlKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgLyogUGFzcyB0aGUga2VlcCBhbGl2ZSBtZXNzYWdlIHRvIHRoZSBNS0EgcHJvcGVyIGNvZGUuIEl0J3Mgb2theSB0byBpZ25vcmUgdGhlIHJldHVybiBzdGF0dXMuIEZhaWx1cmUgdG8gbWFpbnRhaW4KKyAgICAgICB0aGUgTUtBIGNvbm5lY3Rpb24gdGhyb3VnaCBNS0Ega2VlcCBhbGl2ZSBtZXNzYWdlcyB3aWxsIHRlYXIgZG93biB0aGUgTUtBIGNvbm5lY3Rpb24uICovCisgICAgcmMgPSBta2FfcHJvY2Vzc19wYWNrZXQobGlua19yZWMsIGV2dC0+ZGF0YS5yeF9mcmFtZSwgTUtBX09QX0tFRVBfQUxJVkUpOworCisgICAgLyogQ2hlY2sgaWYgYSBTQUsgcmVmcmVzaCBpcyBuZWVkZWQuICovCisgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBSZS1zdGFydCB0aGUgcnggdGltZXIgKi8KKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyLCBNS0FfTElGRV9USU1FICogMTAwMCk7CisKKyAgICAgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrX3JlZnJlc2hfbmVlZGVkKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdGFydCB0aGUgU0FLIHJlZnJlc2ggcHJvY2Vzcy4gKi8KKyAgICAgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX3Nha19yZWZyZXNoKGxpbmtfcmVjLCBldnQpOworCisgICAgICAgICAgICAvKiBDbGVhciB0aGUgU0FLIHJlZnJlc2ggZmxhZyBzaW5jZSB0aGUgU0FLIHJlZnJlc2ggcHJvY2VzcyBoYXMgYmVlbiBzdGFydGVkLiAqLworICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5zYWtfcmVmcmVzaF9uZWVkZWQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX25ld19zYWtfcnhfZWFwb2woZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIHJjID0gbWthX3Byb2Nlc3NfcGFja2V0KGxpbmtfcmVjLCBldnQtPmRhdGEucnhfZnJhbWUsIE1LQV9PUF9TQUtfUlNQKTsKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIFJlLXN0YXJ0IHRoZSByeCB0aW1lciAqLworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+cnhfdGltZXIsIE1LQV9MSUZFX1RJTUUgKiAxMDAwKTsKKworICAgICAgICBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIga2V5X2luZm87CisKKyAgICAgICAga2V5X2luZm8uZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOworICAgICAgICBtZW1jcHkoa2V5X2luZm8udS5jdHIua2V5LCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNhaywgc2l6ZW9mKGtleV9pbmZvLnUuY3RyLmtleSkpOworICAgICAgICBtZW1jcHkoa2V5X2luZm8udS5jdHIuc2NpLCBsaW5rX3JlYy0+bmlfbWFjLnU4LCBCQ01PU19FVEhfQUxFTik7CisgICAgICAgIGtleV9pbmZvLnUuY3RyLnNjaVs2XSA9IChsaW5rX3JlYy0+bGxpZCA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGtleV9pbmZvLnUuY3RyLnNjaVs3XSA9IChsaW5rX3JlYy0+bGxpZCA+PiAwKSAmIDB4ZmY7CisKKyAgICAgICAgLyogSW5zdGFsbCB0aGUgbmV3IFNBSyBhcyB0aGUgVVMgYW5kIERTIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIGxpbmsuICovCisgICAgICAgIHJjID0gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2tleV9zZXQoCisgICAgICAgICAgICBsaW5rX3JlYy0+ZGV2aWNlLAorICAgICAgICAgICAgJmxpbmtfcmVjLT5rZXksCisgICAgICAgICAgICBCQ01PU19GQUxTRSwKKyAgICAgICAgICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTLAorICAgICAgICAgICAgKGJjbW9sdF9lcG9uX2tleV9jaG9pY2UpKChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIgKyAxKSAlIDIpLAorICAgICAgICAgICAgJmtleV9pbmZvKTsKKyAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbWthX3NlbmRfc2FrX2NvbmZpcm0obGlua19yZWMpOworICAgICAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBjdXJyZW50IFNBSyB3aXRoIHRoZSBuZXcgU0FLICovCisgICAgICAgICAgICAgICAgbWVtY3B5KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm5ld19zYWssCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNhaykpOworCisgICAgICAgICAgICAgICAgLyogQ2hhbmdlIHRvIHRoZSBPUEVSQVRJT05BTCBzdGF0ZSAqLworICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX3N0YXRlID0gRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9PUEVSQVRJT05BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogTm90aWZ5IHRoZSBEUG9FIFNlY3VyaXR5IEZTTSBvZiB0aGUgTUtBIGVycm9yLiAqLworICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUobGlua19yZWMsIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBPTlUgRlNNIEp1bXAgVGFibGUsIGluZGV4ZWQgYnkgU1RBVEUgYW5kIEVWRU5ULiAqLworc3RhdGljIGZfZHBvZV9zZWNfbWthX2ZzbSBkcG9lX3NlY19ta2FfZnNtW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfX0NPVU5UXVtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX19DT1VOVF0gPQoreworICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX05VTExdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX0lOSVRdID0gX2Rwb2Vfc2VjX21rYV9mc21faW5pdGlhbGl6ZQorICAgIH0sCisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VUX0VOQ1JZUFRJT05dID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX09BTV0gPSBfZHBvZV9zZWNfbWthX2ZzbV9yeF9vYW0sCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVRdID0gX2Rwb2Vfc2VjX21rYV9mc21fcnhfdGltZW91dCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfU1RPUF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zdG9wLAorICAgIH0sCisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfU1RBUlRfTUtBXSA9CisgICAgeworICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zdGFydF9yeF9lYXBvbCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfVElNRU9VVF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9yeF90aW1lb3V0LAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9UWF9USU1FT1VUXSA9IF9kcG9lX3NlY19ta2FfZnNtX3N0YXJ0X3RpbWVvdXQsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1BdID0gX2Rwb2Vfc2VjX21rYV9mc21fc3RvcAorICAgIH0sCisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VORF9TQUtdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX0VBUE9MXSA9IF9kcG9lX3NlY19ta2FfZnNtX3Nha19yeF9lYXBvbCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfVElNRU9VVF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9yeF90aW1lb3V0LAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9UWF9USU1FT1VUXSA9IF9kcG9lX3NlY19ta2FfZnNtX3Nha190aW1lb3V0LAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9TVE9QXSA9IF9kcG9lX3NlY19ta2FfZnNtX3N0b3AKKyAgICB9LAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX09QRVJBVElPTkFMXSA9CisgICAgeworICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9oYW5kbGVfa2VlcF9hbGl2ZSwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfVElNRU9VVF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9yeF90aW1lb3V0LAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9UWF9USU1FT1VUXSA9IF9kcG9lX3NlY19ta2FfZnNtX3NlbmRfa2VlcF9hbGl2ZSwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfU1RPUF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zdG9wCisgICAgfSwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TRU5EX05FV19TQUtdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX0VBUE9MXSA9IF9kcG9lX3NlY19ta2FfZnNtX25ld19zYWtfcnhfZWFwb2wsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVRdID0gX2Rwb2Vfc2VjX21rYV9mc21fcnhfdGltZW91dCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfVFhfVElNRU9VVF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2tlZXBfYWxpdmUsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1BdID0gX2Rwb2Vfc2VjX21rYV9mc21fc3RvcAorICAgIH0KK307CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9leGVjKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9QQVJNOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgaWYgKF9kcG9lX3NlY19ta2FfZnNtX2V2ZW50X3R5cGVfaXNfdmFsaWQoZXZ0LT50eXBlKSkKKyAgICB7CisgICAgICAgIGRwb2Vfc2VjX21rYV9mc21fc3RhdGUgcHJlX3N0YXRlID0gbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGU7CisKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiTUtBOiBwcm9jZXNzaW5nIGV2ZW50ICVzIGluIHN0YXRlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9ldmVudF9uYW1lKGV2dC0+dHlwZSksIF9kcG9lX3NlY19ta2FfZnNtX3N0YXRlX25hbWUocHJlX3N0YXRlKSk7CisKKyAgICAgICAgLyogY2FsbCB0aGUgRlNNICovCisgICAgICAgIGlmIChOVUxMICE9IGRwb2Vfc2VjX21rYV9mc21bbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGVdW2V2dC0+dHlwZV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gZHBvZV9zZWNfbWthX2ZzbVtsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZV1bZXZ0LT50eXBlXShsaW5rX3JlYywgZXZ0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gX2Rwb2Vfc2VjX21rYV9mc21fZXJyb3IobGlua19yZWMsIGV2dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlX3N0YXRlICE9IGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJNS0E6IHRyYW5zaXRpb25pbmcgZnJvbSAlcyB0byAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX3N0YXRlX25hbWUocHJlX3N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX3N0YXRlX25hbWUobGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKwordm9pZCBkcG9lX3NlY19ta2FfZnNtX3J4X29hbShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIHVpbnQ4X3QgKmZyYW1lLCB1aW50MTZfdCBsZW5ndGgpCit7CisgICAgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCBldm50ID0ge307CisKKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICAvKiBTZW5kIHRoZSBPQU0gUERVIHRvIHRoZSBzdGF0ZSBtYWNoaW5lLiAqLworICAgIGV2bnQudHlwZSA9IERQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfT0FNOworICAgIGV2bnQuZGF0YS5yeF9mcmFtZS52YWwgPSBmcmFtZTsKKyAgICBldm50LmRhdGEucnhfZnJhbWUubGVuID0gbGVuZ3RoOworCisgICAgLyogRXhlY3V0ZSB0aGUgc3RhdGUgbWFjaGluZSAqLworICAgIF9kcG9lX3NlY19ta2FfZnNtX2V4ZWMobGlua19yZWMsICZldm50KTsKK30KKwordm9pZCBkcG9lX3NlY19ta2FfZnNtX3J4X2VhcG9sKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgdWludDhfdCAqZnJhbWUsIHVpbnQxNl90IGxlbmd0aCkKK3sKKyAgICBkcG9lX3NlY19ta2FfZnNtX2V2ZW50IGV2bnQgPSB7fTsKKworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIC8qIFNlbmQgdGhlIE9BTSBQRFUgdG8gdGhlIHN0YXRlIG1hY2hpbmUuICovCisgICAgZXZudC50eXBlID0gRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9FQVBPTDsKKyAgICBldm50LmRhdGEucnhfZnJhbWUudmFsID0gZnJhbWU7CisgICAgZXZudC5kYXRhLnJ4X2ZyYW1lLmxlbiA9IGxlbmd0aDsKKworICAgIC8qIEV4ZWN1dGUgdGhlIHN0YXRlIG1hY2hpbmUgKi8KKyAgICBfZHBvZV9zZWNfbWthX2ZzbV9leGVjKGxpbmtfcmVjLCAmZXZudCk7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX21rYV9mc21fc3RhcnQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgZXZlbnQgPSB7fTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgLyogSW5qZWN0IGFuIElOSVRfRVZFTlQgaW50byB0aGUgRlNNLiAqLworICAgIGV2ZW50LnR5cGUgPSBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX0lOSVQ7CisKKyAgICByZXR1cm4gX2Rwb2Vfc2VjX21rYV9mc21fZXhlYyhsaW5rX3JlYywgJmV2ZW50KTsKK30KKworYmNtb3NfYm9vbCBkcG9lX3NlY19ta2FfZnNtX3J1bm5pbmcoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Jvb2wgcmMgPSBCQ01PU19GQUxTRTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgaWYgKChsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvICE9IE5VTEwpICYmCisgICAgICAgIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA+IERQT0VfU0VDX01LQV9GU01fU1RBVEVfTlVMTCkpCisgICAgeworICAgICAgICByYyA9IEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyBkcG9lX3NlY19ta2FfZnNtX2RlcmVnaXN0ZXIoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBkcG9lX3NlY19ta2FfZnNtX2V2ZW50IGV2bnQgPSB7fTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgLyogVGhlIGRlcmVnaXN0ZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgTGluayBkZXJlZ2lzdGVycyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIE1LQSBGU00gaXMgcnVubmluZyBvcgorICAgICAgIG5vdC4gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGl0IGlzIG5vdCBydW5uaW5nLiAqLworICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBJbmplY3QgYSBzdG9wIGludG8gdGhlIE1LQSBGU00uICovCisgICAgICAgIGV2bnQudHlwZSA9IERQT0VfU0VDX01LQV9GU01fRVZFTlRfU1RPUDsKKyAgICAgICAgcmMgPSBfZHBvZV9zZWNfbWthX2ZzbV9leGVjKGxpbmtfcmVjLCAmZXZudCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIGRwb2Vfc2VjX21rYV9mc21faW5pdChmX2Rwb2Vfc2VjX21rYV9jYiBta2FfY2IpCit7CisgICAgX21rYV9kb25lX2NiID0gbWthX2NiOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX21rYV9mc20uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfbWthX2ZzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MjA5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX21rYV9mc20uaApAQCAtMCwwICsxLDkwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9EUE9FX1NFQ19NS0FfRlNNX0hfCisjZGVmaW5lIF9EUE9FX1NFQ19NS0FfRlNNX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJkcG9lX3NlY191dGlsLmgiCisjaW5jbHVkZSAibWthLmgiCisKKy8qIC0tLSBUeXBlcyAtLS0gKi8KKwordHlwZWRlZiBlbnVtIGRwb2Vfc2VjX21rYV9mc21fc3RhdGUKK3sKKyAgICBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX19JTlZBTElEICAgICAgICAgPSAtMSwgLyoqPCBwZXJtaXRzIGV2ZW50IHZhbGlkYXRpb24gKi8KKworICAgIERQT0VfU0VDX01LQV9GU01fU1RBVEVfTlVMTCAgICAgICAgICAgICA9ICAwLAorICAgIERQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VUX0VOQ1JZUFRJT04gICAsCisgICAgRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TVEFSVF9NS0EgICAgICAgICwKKyAgICBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NFTkRfU0FLICAgICAgICAgLAorICAgIERQT0VfU0VDX01LQV9GU01fU1RBVEVfT1BFUkFUSU9OQUwgICAgICAsCisgICAgRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TRU5EX05FV19TQUsgICAgICwKKworICAgIERQT0VfU0VDX01LQV9GU01fU1RBVEVfX0NPVU5UCit9IGRwb2Vfc2VjX21rYV9mc21fc3RhdGU7CisKKy8qIERQb0UgU2VjdXJpdHkgTUtBIGluZm9ybWF0aW9uIHN0b3JlZCB3aXRoIGVhY2ggbGluay4gKi8KK3R5cGVkZWYgc3RydWN0IGRwb2Vfc2VjX21rYV9mc21faW5mbworeworICAgIGJjbW9zX3RpbWVyIHJ4X3RpbWVyOyAvKio8IFRpbWVyIGVudHJ5IGZvciBNS0EgRlNNICovCisgICAgYmNtb3NfdGltZXIgdHhfdGltZXI7IC8qKjwgVGltZXIgZW50cnkgZm9yIE1LQSBtZXNzYWdlcyAqLworfSBkcG9lX3NlY19ta2FfZnNtX2luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgbWthX2xpbmtfaW5mbyAqbWthX2luZm87IC8qKjwgTUtBIGluZm9ybWF0aW9uICovCisgICAgZHBvZV9zZWNfbWthX2ZzbV9pbmZvICpta2FfZnNtX2luZm87IC8qKjwgTUtBIEZTTSBpbmZvcm1hdGlvbiAqLworICAgIGRwb2Vfc2VjX21rYV9mc21fc3RhdGUgbWthX2ZzbV9zdGF0ZTsgLyoqPCBTdGF0ZSBvZiB0aGUgRFBvRSBTZWN1cml0eSBNS0EgRlNNICovCit9IGRwb2Vfc2VjX21rYV9mc21fY3RybDsKKworc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjOworCit0eXBlZGVmIHZvaWQgKCpmX2Rwb2Vfc2VjX21rYV9jYikoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjKiwgYmNtb3NfZXJybm8gc3RhdHVzKTsKKworLyogLS0tIEZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tICovCisKKy8qIFN0YXJ0IE1LQSBvbiBhIGxpbmsgKi8KK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX21rYV9mc21fc3RhcnQoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rKTsKKworLyogSGFuZGxlIHJlY2VwdGlvbiBvZiBhbiBPQU0gZnJhbWUgKi8KK3ZvaWQgZHBvZV9zZWNfbWthX2ZzbV9yeF9vYW0oc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rLCB1aW50OF90ICpmcmFtZSwgdWludDE2X3QgbGVuZ3RoKTsKKworLyogSGFuZGxlIHJlY2VwdGlvbiBvZiBhbiBFQVBPTCBmcmFtZSAqLwordm9pZCBkcG9lX3NlY19ta2FfZnNtX3J4X2VhcG9sKHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluaywgdWludDhfdCAqZnJhbWUsIHVpbnQxNl90IGxlbmd0aCk7CisKKy8qIElzIHRoZSBNS0EgRlNNIHJ1bm5pbmcgb24gYSBsaW5rPyAqLworYmNtb3NfYm9vbCBkcG9lX3NlY19ta2FfZnNtX3J1bm5pbmcoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rKTsKKworLyogSGFuZGxlIGxpbmsgZGUtcmVnaXN0cmF0aW9uIChzdG9wIHRoZSBNS0EgRlNNKSAqLworYmNtb3NfZXJybm8gZHBvZV9zZWNfbWthX2ZzbV9kZXJlZ2lzdGVyKHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluayk7CisKK3ZvaWQgZHBvZV9zZWNfbWthX2ZzbV9pbml0KGZfZHBvZV9zZWNfbWthX2NiIG1rYV9jYik7CisKKyNlbmRpZiAvKiBfRFBPRV9TRUNfTUtBX0ZTTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191c2VyX2NmZy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191c2VyX2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNmQzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX3VzZXJfY2ZnLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0RQT0VfU0VDX1VTRVJfQ0ZHX0hfCisjZGVmaW5lIF9EUE9FX1NFQ19VU0VSX0NGR19IXworCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKworZXh0ZXJuIGRldl9sb2dfaWQgZHBvZV9zZWNfbG9nX2lkW107CisKK3R5cGVkZWYgdm9pZCogZHBvZV9zZWNfc2hhMV9oYXNoOyAvKiBBIGRhdGEgdHlwZSBmb3IgaG9sZGluZyBhbiBTSEExIGhhc2ggY29udGV4dCAqLwordHlwZWRlZiB1aW50OF90IGRwb2Vfc2VjX3NoYTFfZGlnZXN0WzIwXTsgLyogQSBkYXRhIHR5cGUgZm9yIGhvbGRpbmcgYW4gU0hBMSBoYXNoICovCit0eXBlZGVmIHZvaWQqIGRwb2Vfc2VjX21kNV9oYXNoOyAvKiBBIGRhdGEgdHlwZSBmb3IgaG9sZGluZyBhbiBNRDUgaGFzaCBjb250ZXh0ICovCit0eXBlZGVmIHVpbnQ4X3QgZHBvZV9zZWNfbWQ1X2RpZ2VzdFsxNl07IC8qIEEgZGF0YSB0eXBlIGZvciBob2xkaW5nIGFuIE1ENSBoYXNoICovCit0eXBlZGVmIHZvaWQqIGRwb2Vfc2VjX3JzYV9rZXk7IC8qIEEgZGF0YSB0eXBlIGZvciBob2xkaW5nIGFuIFJTQSBrZXkgKi8KK3R5cGVkZWYgdm9pZCogZHBvZV9zZWNfYWVzX2tleTsgLyogQSBkYXRhIHR5cGUgZm9yIGhvbGRpbmcgYW4gQUVTIGtleSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZHBvZV9zZWNfc2hhMV9pbml0KGRwb2Vfc2VjX3NoYTFfaGFzaCAqc2hhMSkKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgaW5pdGlhbGl6ZS9yZXNldCBhbiBTSEExIGhhc2ggY29udGV4dFxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19zaGExX3VwZGF0ZShkcG9lX3NlY19zaGExX2hhc2ggKnNoYTEsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHVwZGF0ZSBhbiBTSEExIGhhc2ggY29udGV4dFxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19zaGExX2ZpbmFsKGRwb2Vfc2VjX3NoYTFfZGlnZXN0IG1kLCBkcG9lX3NlY19zaGExX2hhc2ggKnNoYTEpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmFsaXplIGFuIFNIQTEgaGFzaCBjb250ZXh0XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX21kNV9pbml0KGRwb2Vfc2VjX21kNV9oYXNoICptZDUpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIGluaXRpYWxpemUvcmVzZXQgYW4gTUQ1IGhhc2ggY29udGV4dFxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19tZDVfdXBkYXRlKGRwb2Vfc2VjX21kNV9oYXNoICptZDUsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHVwZGF0ZSBhbiBNRDUgaGFzaCBjb250ZXh0XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX21kNV9maW5hbChkcG9lX3NlY19tZDVfZGlnZXN0IG1kLCBkcG9lX3NlY19tZDVfaGFzaCAqbWQ1KQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5hbGl6ZSBhbiBNRDUgaGFzaCBjb250ZXh0XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX3ByZl9leHBhbmRfNDM0NigKKyAgICB1aW50OF90ICpzZWNyZXQsCisgICAgdWludDMyX3Qgc2VjcmV0X2xlbiwKKyAgICBjb25zdCB1aW50OF90ICpsYWJlbCwKKyAgICB1aW50MzJfdCBsYWJlbF9sZW4sCisgICAgY29uc3QgdWludDhfdCAqc2VlZCwKKyAgICB1aW50MzJfdCBzZWVkX2xlbiwKKyAgICB1aW50OF90ICpvdXRwdXQsCisgICAgdWludDMyX3Qgb3V0cHV0X2xlbikKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgcGVyZm9ybSB0aGUgcHNldWRvLXJhbmRvbSBmdW5jdGlvbiBmb3IgZXhwYW5zaW9uIG9mIHNlY3JldHMgYXMgZGVmaW5lZCBpbiBSRkMgNDM0Niwgc2VjdGlvbiA1XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSBkcG9lX3NlY19yc2Ffa2V5ICpkcG9lX3NlY19yc2FfZ2VuZXJhdGVfa2V5KGludCBiaXRzKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBnZW5lcmF0ZSBhbiBSU0Ega2V5XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX3JzYV9rZXlfZnJlZShkcG9lX3NlY19yc2Ffa2V5ICpyc2EpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHJlbGVhc2UgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGFuIFJTQSBrZXkgYnkgZWl0aGVyIGRwb2Vfc2VjX3JzYV9nZW5lcmF0ZV9rZXkgb3IgZHBvZV9zZWNfeDUwOV9wdWJfa2V5X2dldFxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBkcG9lX3NlY19yc2FfcHVibGljX2dldChkcG9lX3NlY19yc2Ffa2V5ICpyc2EsIHVpbnQ4X3QgKnJzYV9tb2R1bHVzLCB1aW50OF90ICpyc2FfZXhwKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXRyaWV2ZSB0aGUgcHVibGljIG1vZHVsdXMgYW5kIGV4cG9uZW50IG9mIGFuIFJTQSBrZXlcbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkcG9lX3NlY19yc2Ffc2l6ZShkcG9lX3NlY19yc2Ffa2V5ICpyc2EpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgc2l6ZSBvZiBhbiBSU0Ega2V5IGluIGJ5dGVzXG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHBvZV9zZWNfcnNhX3ByaXZhdGVfZGVjcnlwdCgKKyAgICBpbnQgZmxlbiwKKyAgICBjb25zdCB1aW50OF90ICpmcm9tLAorICAgIHVpbnQ4X3QgKnRvLAorICAgIGRwb2Vfc2VjX3JzYV9rZXkgKnJzYSkKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgcGVyZm9ybSBSU0EgZGVjcnlwdGlvbiB1c2luZyBhIHByaXZhdGUga2V5XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHBvZV9zZWNfcnNhX3B1YmxpY19kZWNyeXB0KAorICAgIGludCBmbGVuLAorICAgIGNvbnN0IHVpbnQ4X3QgKmZyb20sCisgICAgdWludDhfdCAqdG8sCisgICAgZHBvZV9zZWNfcnNhX2tleSAqcnNhKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBwZXJmb3JtIFJTQSBkZWNyeXB0aW9uIHVzaW5nIGEgcHVibGljIGtleSAoYWxzbyBrbm93biBhcyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uKVxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZHBvZV9zZWNfcnNhX2tleSAqZHBvZV9zZWNfeDUwOV9wdWJfa2V5X2dldChjb25zdCB1aW50OF90ICpjZXJ0LCB1aW50MzJfdCBjZXJ0X2xlbikKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0cmlldmUgYW4gUlNBIHB1YmxpYyBrZXkgZnJvbSBhbiBYLjUwOSBjZXRpZmljYXRlXG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX2Flc19zZXRfZW5jcnlwdF9rZXkoY29uc3QgdWludDhfdCAqdXNlcl9rZXksIGNvbnN0IGludCBiaXRzLCBkcG9lX3NlY19hZXNfa2V5ICprZXkpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIGluaXRpYWxpemUgdGhlIEFFUyBrZXkgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YVxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19hZXNfd3JhcF9rZXkoCisgICAgZHBvZV9zZWNfYWVzX2tleSAqa2V5LAorICAgIHVpbnQ4X3QgKm91dCwKKyAgICBjb25zdCB1aW50OF90ICppbiwKKyAgICB1aW50MzJfdCBsZW4pCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHBlcmZvcm0gYW4gQUVTIGtleSB3cmFwIG9uIGluXG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX2Flc19jbWFjKHVpbnQ4X3QgKmtleSwgdWludDhfdCAqbXNnLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QgKmNvZGUpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHBlcmZvcm0gQUVTIENNQUNcbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHBvZV9zZWNfYWVzX2NtYWNfa2RmKAorICAgIHVpbnQ4X3QgKmtleSwKKyAgICBjb25zdCBjaGFyICpsYWJlbCwKKyAgICB1aW50OF90ICpjdHgsCisgICAgdWludDMyX3QgY3R4X2xlbiwKKyAgICB1aW50OF90ICpvdXRfYnVmKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBwZXJmb3JtIHRoZSBBRVMgQ01BQyBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvblxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXJybm8gZHBvZV9zZWNfc2VuZF9lYXBvbCgKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5ICpsaW5rX2tleSwKKyAgICB1aW50OF90ICplYXBvbCwKKyAgICB1aW50MTZfdCBsZW5ndGgpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHRyYW5zbWl0IGFuIEVBUE9MIGZyYW1lIHRvIHRoZSBzcGVjaWZpZWQgbGlua1xuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXJybm8gZHBvZV9zZWNfcm5nX3NlZWQodm9pZCkKK3sKKyAgICBCQ01fTE9HKElORk8sIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBzZWVkIGEgY3J5cHRvZ3JhcGhpY2FsbHkgdmFsaWQgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yXG4iKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX2dlbmVyYXRlX25fYnl0ZV9yYW5kb21fbnVtYmVyKHVpbnQ4X3QgKm91dHB1dCwgaW50IGxlbmd0aCkKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2VuZXJhdGUgYSBwc2V1ZG8tcmFuZG9tIG51bWJlciBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aFxuIik7CisgICAgQlVHKCk7Cit9CisKKyNlbmRpZiAvKiBfRFBPRV9TRUNfVVNFUl9DRkdfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191dGlsLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTMwNDdhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191dGlsLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgb2YgdGhlIHNvZnR3YXJlLgorCisgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAgd3JpdHRlbiBjb25zZW50LgorCisgIDo+CisqLworCisjaW5jbHVkZSAiZHBvZV9zZWNfdXRpbC5oIgorI2luY2x1ZGUgImJjbW9sdF9hcGkuaCIKKworZGV2X2xvZ19pZCBkcG9lX3NlY19sb2dfaWRbQkNNVFJfTUFYX09MVFNdOworCitiY21vc19ib29sIGRwb2Vfc2VjX2VhcG9sX3VucGFjayhiY21vbHRfYnVmICpidWYsIGVhcG9sX21zZ19oZHIgKmVhcG9sKQoreworICAgIHJldHVybgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmZWFwb2wtPmRhKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmZWFwb2wtPnNhKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTE2X2JlKGJ1ZiwgJmVhcG9sLT5ldGhlcl90eXBlKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmZWFwb2wtPmVhcG9sX3ZlcnNpb24pICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZlYXBvbC0+ZWFwb2xfcGFja2V0X3R5cGUpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYnVmLCAmZWFwb2wtPmVhcG9sX2xlbmd0aCk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9rZXlfc2V0KAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgKmxpbmtfa2V5LAorICAgIGJjbW9zX2Jvb2wgdXAsIC8qIFRPRE86IGNyZWF0ZSBleHBsaWNpdCB1cC9kb3duIHR5cGUgZm9yIGNsYXJpdHkgKi8KKyAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgbW9kZSwKKyAgICBiY21vbHRfZXBvbl9rZXlfY2hvaWNlIGtleV9jaG9pY2UsCisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICprZXlfaW5mbykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBjZmc7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCAqbGlua19rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBlcG9uX2VuY3J5cHRpb24pOworICAgIHJjID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmY2ZnLmhkcik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gcmMsIHJjKTsKKworICAgIGlmICh1cCkKKyAgICB7CisgICAgICAgIGNmZy5kYXRhLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9tb2RlID0gbW9kZTsKKyAgICAgICAgY2ZnLmRhdGEuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2tleV9jaG9pY2UgPSBrZXlfY2hvaWNlOworICAgICAgICBjZmcuZGF0YS5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiA9ICprZXlfaW5mbzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2ZnLmRhdGEuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fbW9kZSA9IG1vZGU7CisgICAgICAgIGNmZy5kYXRhLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2tleV9jaG9pY2UgPSBrZXlfY2hvaWNlOworICAgICAgICBjZmcuZGF0YS5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uID0gKmtleV9pbmZvOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChkZXZpY2UsICZjZmcuaGRyKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191dGlsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDJmZGRjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191dGlsLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfRFBPRV9TRUNfVVRJTF9IXworI2RlZmluZSBfRFBPRV9TRUNfVVRJTF9IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNpbmNsdWRlICJiY21vbHRfYnVmLmgiCisjaW5jbHVkZSAiYmNtb2x0X3V0aWxzLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisjaW5jbHVkZSAiZHBvZV9zZWNfdXNlcl9jZmcuaCIKKworLyogdGhlIEVBUE9MIEV0aGVybmV0IHR5cGUgKi8KKyNkZWZpbmUgRVRIRVJUWVBFX0VBUE9MIDB4ODg4ZQorCisjZGVmaW5lIEVBUE9MX1BST1RPQ09MX1ZFUlNJT05fRFBPRSAzCisKK3R5cGVkZWYgZW51bQoreworICAgIEVBUE9MX1RZUEVfUEFDS0VULAorICAgIEVBUE9MX1RZUEVfU1RBUlQsCisgICAgRUFQT0xfVFlQRV9MT0dfT0ZGLAorICAgIEVBUE9MX1RZUEVfS0VZLAorICAgIEVBUE9MX1RZUEVfQVNGX0FMRVJULAorICAgIEVBUE9MX1RZUEVfTUtBCit9IGVhcG9sX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZGE7CisgICAgYmNtb3NfbWFjX2FkZHJlc3Mgc2E7CisgICAgdWludDE2X3QgZXRoZXJfdHlwZTsKKyAgICB1aW50OF90IGVhcG9sX3ZlcnNpb247CisgICAgdWludDhfdCBlYXBvbF9wYWNrZXRfdHlwZTsKKyAgICB1aW50MTZfdCBlYXBvbF9sZW5ndGg7Cit9IGVhcG9sX21zZ19oZHI7CisKKyNkZWZpbmUgRUFQT0xfTVNHX0hEUl9TSVpFIDE4CisKKyNkZWZpbmUgTElOS19LRVlfRk1UX1NUUiAiUE9OICV1LCAiQkNNT1NfTUFDQUREUl9GTVRfU1RSCisjZGVmaW5lIExJTktfS0VZX0RBVEEobHIpIChsciktPmtleS5lcG9uX25pLCBCQ01PU19NQUNBRERSX1BBUkFNUygmKGxyKS0+a2V5Lm1hY19hZGRyZXNzKQorCisjZGVmaW5lIERQT0VfU0VDX0xJTktfTE9HKGxldmVsLCBsciwgZm10LCBhcmdzLi4uKSBcCisgICAgQkNNX0xPRyhsZXZlbCwgZHBvZV9zZWNfbG9nX2lkWyhsciktPmRldmljZV0sIExJTktfS0VZX0ZNVF9TVFIiOiAiZm10LCBMSU5LX0tFWV9EQVRBKGxyKSwgIyNhcmdzKQorCitzdGF0aWMgY29uc3QgdWludDMyX3QgRFBPRV9TRUNfT0FNX1RJTUVPVVQgPSAyICogMTAwMCAqIDEwMDA7IC8qIDIgc2Vjb25kcyAqLworCitiY21vc19ib29sIGRwb2Vfc2VjX2VhcG9sX3VucGFjayhiY21vbHRfYnVmICpidWYsIGVhcG9sX21zZ19oZHIgKmVhcG9sKTsKKworYmNtb3NfZXJybm8gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2tleV9zZXQoCisgICAgYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSAqbGlua19rZXksCisgICAgYmNtb3NfYm9vbCB1cCwKKyAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgbW9kZSwKKyAgICBiY21vbHRfZXBvbl9rZXlfY2hvaWNlIGtleV9jaG9pY2UsCisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICprZXlfaW5mbyk7CisKKyNlbmRpZiAvKiBfRFBPRV9TRUNfVVRJTF9IXyAqLworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL21rYS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9ta2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTllYjIzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9ta2EuYwpAQCAtMCwwICsxLDE0MzQgQEAKKy8qCisgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgIG9mIHRoZSBzb2Z0d2FyZS4KKworICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgIHdyaXR0ZW4gY29uc2VudC4KKworICA6PgorKi8KKworLyoqIEBmaWxlIG1rYS5jCisgKiAgQGJyaWVmIFB1YmxpY2x5IGFjY2Vzc2libGUgQVBJcyBwcm92aWRlZCB0byBwcm9jZXNzIE1LQSByZXF1ZXN0L3Jlc3BvbnNlcy4KKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBvZiB0aGUgcHVibGljL3ByaXZhdGUgQVBJcyB1c2VkIHRvIHByb2Nlc3MgTUtBIGZyYW1lcy4KKyAqCisgKiBNS0EgRXhjaGFuZ2UgU2VxdWVuY2UgOgorICoKKyAqIDEuICBJZiBiaWRpcmVjdGlvbmFsIGVuY3J5cHRpb24gaXMgZW5hYmxlZCwgdGhlIE9MVCB3aWxsIGdlbmVyYXRlIGFuIE1LUERVCisgKiAgICAgY29udGFpbmluZyB0aGUgYmFzaWMgcGFyYW1ldGVyIHNldCBhbmQgZW1wdHkgbGl2ZSBhbmQgcG90ZW50aWFsIHBlZXIKKyAqICAgICBsaXN0cy4KKyAqIDIuICBXaGVuIHRoZSBPTlUgcmVjZWl2ZXMgdGhpcywgaXQgd2lsbCBhZGQgdGhlIE9MVCB0byBpdHMgcG90ZW50aWFsIHBlZXJzCisgKiAgICAgbGlzdC4KKyAqIDMuICBIYXZpbmcgZGlzY292ZXJlZCBhIG5ldyBwb3RlbnRpYWwgcGVlciwgdGhlIE9OVSB3aWxsIHRyYW5zbWl0IGFuIE1LUERVCisgKiAgICAgY29udGFpbmluZyB0aGUgYmFzaWMgcGFyYW1ldGVyIHNldCwgYW5kIGVtcHR5IGxpdmUgcGVlcnMgbGlzdCwgYW5kIGEKKyAqICAgICBwb3RlbnRpYWwgcGVlciBsaXN0IGNvbnRhaW5pbmcgdGhlIE9MVC4KKyAqIDQuICBXaGVuIHRoZSBPTFQgcmVjZWl2ZXMgdGhpcywgaXQgd2lsbCBhZGQgdGhlIE9OVSB0byBpdHMgbGl2ZSBwZWVycyBsaXN0LgorICogNS4gIEhhdmluZyBhZGRlZCBhIG5ldyBsaXZlIHBlZXIsIHRoZSBPTFQgd2lsbCBnZW5lcmF0ZSBhIG5ldyBTQUsgYW5kIGluc3RhbGwKKyAqICAgICBpdCBmb3IgcmVjZWl2ZSAodXNpbmcgdGhlIE9OVXMgU0NJKS4KKyAqIDYuICBUaGUgT0xUIHRoZW4gdHJhbnNtaXRzIGFuIE1LUERVIGNvbnRhaW5pbmcgdGhlIGJhc2ljIHBhcmFtZXRlciBzZXQsIGEKKyAqICAgICBsaXZlIHBlZXIgbGlzdCBjb250YWluaW5nIHRoZSBPTlUsIGFuIGVtcHR5IHBvdGVudGlhbCBwZWVyIGxpc3QsIGEKKyAqICAgICBkaXN0cmlidXRlZCBTQUssIGFuZCBhIFNBSyB1c2FnZSBwYXJhbWV0ZXIgc2V0IGluZGljYXRpbmcgdGhhdCB0aGUgbmV3CisgKiAgICAgU0FLIGhhcyBiZWVuIGluc3RhbGxlZCBmb3IgcmVjZWl2ZS4KKyAqIDcuICBXaGVuIHRoZSBPTlUgcmVjZWl2ZXMgdGhpcywgaXQgd2lsbDoKKyAqICAgICBhLiBBZGQgdGhlIE9MVCB0byBpdHMgbGl2ZSBwZWVycyBsaXN0CisgKiAgICAgYi4gSW5zdGFsbCB0aGUgbmV3IFNBSyBmb3IgcmVjZWl2ZSAodXNpbmcgdGhlIE9MVHMgU0NJKQorICogICAgIGMuIEJlY2F1c2UgdGhlIE9MVCByZXBvcnRlZCB0aGUgU0FLIGluIHVzZSBmb3IgcmVjZWl2ZSwgdGhlIE9OVSB3aWxsCisgKiAgICAgICAgaW5zdGFsbCB0aGUgU0FLIGZvciB0cmFuc21pdCAodXNpbmcgdGhlIE9OVXMgU0NJKS4KKyAqIDguICBUaGUgT05VIHdpbGwgdGhlbiB0cmFuc21pdCBhbiBNS1BEVSBjb250YWluaW5nIHRoZSBiYXNpYyBwYXJhbWV0ZXIgc2V0LAorICogICAgIGEgbGl2ZSBwZWVycyBsaXN0IGNvbnRhaW5pbmcgdGhlIE9MVCwgYW4gZW1wdHkgcG90ZW50aWFsIHBlZXIgbGlzdCwKKyAqICAgICBhbmQgYSBTQUsgdXNhZ2UgcGFyYW1ldGVyIHNldCBpbmRpY2F0aW5nIHRoYXQgdGhlIFNBSyBoYXMgYmVlbiBpbnN0YWxsZWQKKyAqICAgICBmb3IgcmVjZWl2ZSBhbmQgdHJhbnNtaXQuCisgKiA5LiAgV2hlbiB0aGUgT0xUIHJlY2VpdmVzIHRoaXMsIGl0IHdpbGwgc2VlIHRoYXQgdGhlIE9OVSBoYXMgaW5zdGFsbGVkIHRoZQorICogICAgIFNBSyBmb3IgcmVjZWl2ZSBhbmQgd2lsbCBpbnN0YWxsIHRoZSBTQUsgZm9yIHRyYW5zbWl0CisgKiAgICAgKHVzaW5nIHRoZSBPTFRzIFNDSSkuCisgKiAxMC4gVGhlIE9MVCB3aWxsIHRoZW4gdHJhbnNtaXQgYW4gTUtQRFUgY29udGFpbmluZyB0aGUgYmFzaWMgcGFyYW1ldGVyIHNldCwKKyAqICAgICBhIGxpdmUgcGVlciBsaXN0IGNvbnRhaW5pbmcgdGhlIE9OVSwgYW4gZW1wdHkgcG90ZW50aWFsIHBlZXIgbGlzdCBhbmQKKyAqICAgICBhIFNBSyB1c2FnZSBwYXJhbWV0ZXIgc2V0IGluZGljYXRpbmcgdGhlIFNBSyBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yCisgKiAgICAgcmVjZWl2ZSBhbmQgdHJhbnNtaXQuICAoSaGubSBub3Qgc3VyZSBpZiB0aGlzIHN0ZXAgaXMgbmVjZXNzYXJ5KQorICogMTEuIFRoaXMgbWVzc2FnZSB3aWxsIHByb2R1Y2Ugbm8gc3RhdGUgY2hhbmdlIGF0IHRoZSBPTlUsIHNvIGl0IHdpbGwgbm90CisgKiAgICAgcmVzcG9uZCBpbW1lZGlhdGVseS4gKGJvdGggdGhlIE9OVSBhbmQgT0xUIHdpbGwgbmVlZCB0byBzdGFydCBhIDIgc2Vjb25kCisgKiAgICAgdGltZXIgZXZlcnkgdGltZSBhbiBNS1BEVSBpcyB0cmFuc21pdHRlZCA/IGlmIHRoZXkgaGF2ZSBub3QgdHJhbnNtaXR0ZWQKKyAqICAgICBhbiBNS1BEVSBkdWUgdG8gYSBzdGF0ZSBjaGFuZ2Ugd2hlbiB0aGUgdGltZXIgZXhwaXJlcywgdGhleSB3aWxsCisgKiAgICAgdHJhbnNtaXQgYW4gTUtQRFUgY29udGFpbmluZyB0aGUgYmFzaWMgcGFyYW1ldGVyIHNldCBhbmQgbGl2ZSBhbmQKKyAqICAgICBwb3RlbnRpYWwgcGVlciBsaXN0cy4gIElmIGVpdGhlciBzaWRlIGRvZXMgbm90IHJlY2VpdmUgYW4gTUtQRFUgZnJvbQorICogICAgIHRoZSBvdGhlciBmb3IgNiBzZWNvbmRzIHRoZXkgbXVzdCByZW1vdmUgdGhlbSBmcm9tIHRoZWlyIHBlZXIgbGlzdHMuKQorICogMTIuIFdoZW4gdGhlIE9MVCBkZXRlcm1pbmVzIHRoYXQgYSBuZXcgU0FLIGlzIG5lZWRlZCB0aGlzIHByb3RvY29sIHdpbGwKKyAqICAgICByZXBlYXQgc3RlcHMgNS0xMS4gKG1vZGlmaWNhdGlvbnMgdG8gdGhlIHBlZXIgbGlzdHMsIHN1Y2ggYXMgN2EsIHNob3VsZAorICogICAgIG5vdCBiZSByZXF1aXJlZCkKKyAqCisgKiAgQGRlZmdyb3VwIG1rYSBNS0EKKyAqICBAaW5ncm91cCBjbUN0cmwKKyAqCisgKi8KKworI2luY2x1ZGUgIm1rYS5oIgorI2luY2x1ZGUgImRwb2Vfc2VjX3V0aWwuaCIKKyNpbmNsdWRlICJkcG9lX3NlY19mc20uaCIKKworLyogVGhlIGRlc3RpbmF0aW9uIG11bHRpY2FzdCBNQUMgYWRkcmVzcyBmb3IgTUtBIHBhY2tldHMuICovCitzdGF0aWMgY29uc3QgYmNtb3NfbWFjX2FkZHJlc3MgbWthX2RzdF9tYWNfYWRkciA9IHsgLnU4ID0geyAweDAxLCAweDgwLCAweGMyLCAweDAwLCAweDAwLCAweDAzIH0gfTsKKworI2lmIDAKK3N0YXRpYyBjb25zdCBjaGFyICpta2Ffc3RhdGVfbmFtZXNbTUtBX1NUQVRFX19DT1VOVF0gPQoreworICAgICJJbml0aWFsIiwKKyAgICAiV2FpdGluZ0luaXRpYWxQZWVyUmVzcCIsCisgICAgIlNha1NlbnQiLAorICAgICJNa2FEb25lIgorfTsKKyNlbmRpZgorCisjZGVmaW5lIE1LQV9WRVJTSU9OICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1LQV9TRVJWRVJfUFJJT1JJVFkgICAgICAgICAweDMwCisjZGVmaW5lIE1LQV9JTklUX1JFVFJZX0NOVCAgICAgICAgICAzCisjZGVmaW5lIE1LQV9CQVNJQ19QQVJBTV9TRVRfTEVOICAgICA0NCAvKiA0OCAtIGhlYWRlciBsZW4gKDQgYnl0ZSkgKi8KKyNkZWZpbmUgTUtBX0JBU0lDX1BBUkFNX1NFVF9PUFQgICAgIDB4NjAgLyogS2V5U2VydmVyOjAsIE1BQ3NlY0Rlc2lyZWQ6MSwgTUFDc2VjIENhcGFiaWxpdHk6MiAmIGhpZ2ggNCBiaXRzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBzZXQgYm9keSBsZW5ndGggKDApICovCisKKyNkZWZpbmUgTUtBX0FMR09SSVRITV9BR0lMSVRZICAgICAgIDB4MDA4MGMyMDEKKyNkZWZpbmUgTUtBX01OX0xFTiAgICAgICAgICAgICAgICAgIDQgLyogTWVzc2FnZSBOdW1iZXIgKi8KKyNkZWZpbmUgTUtBX0tOX0xFTiAgICAgICAgICAgICAgICAgIDQgLyogS2V5IE51bWJlciAqLworI2RlZmluZSBNS0FfUERVX01BWF9GUkFNRV9MRU4gICAgICAgMzAwCisjZGVmaW5lIE1LQV9IRUxMT19USU1FICAgICAgICAgICAgICAyMDAwIC8qIE1zLCAyIHNlY29uZHMgKi8KKyNkZWZpbmUgTUtBX01BWF9IRUxMT19SRVRSSUVTICAgICAgIDMgLyogTWF4IEhlbGxvIHJldHJpZXMgKi8KKyNkZWZpbmUgTUtBX09MVF9JTklUX0ZSQU1FX0xFTiAgICAgIDc2IC8qIGJhc2ljIHBhcmFtIHNldCg0OCkgKyBudWxsIGxpdmUgcGVlciBsaXN0ICg0KSArIG51bGwgcG90ZW50aWFsIHBlZXIgbGlzdCAoNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWN2IEluZGljYXRvciAoNCkgKyBJQ1YoMTYpICovCisjZGVmaW5lIE1LQV9PTkVfUEVFUl9MRU4gICAgICAgICAgICAxNiAvKiBvbmUgbGl2ZSBwZWVyIGxlbiAqLworI2RlZmluZSBNS0FfRElTVFJJQlVURURfU0FLX0xFTiAgICAgMzIKKyNkZWZpbmUgTUtBX0lDVl9MRU4gICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1LQV9QRFVfTUlOX0xFTkdUSCAgICAgICAgICAzMgorI2RlZmluZSBNS0FfS0VZX1dSQVBQRURfU0FLX0xFTiAgICAgMjQKKyNkZWZpbmUgTUtBX1NBS19VU0VfUEFSQU1fQk9EWV9MRU4gIDQwCisjZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX0xFTSAgICAgICA0NAorI2RlZmluZSBNS0FfTUFYX0FDQ0VQVEFCTEVfUE4gICAgICAgMHhDMDAwMDAwMAorCisjZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX0FOX1NISUZUICAgICAgICAgIDYKKyNkZWZpbmUgTUtBX1NBS19VU0VfUEFSQU1fTEtfVFhfU0hJRlQgICAgICAgNQorI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9MS19SWF9TSElGVCAgICAgICA0CisjZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX09MRF9LRVlfQU5fTUFTSyAgIDMKKyNkZWZpbmUgTUtBX1NBS19VU0VfUEFSQU1fT0xEX0tFWV9BTl9TRlQgICAgMgorI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9PTERfS0VZX1RYX1JYICAgICAzCisjZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX1NFQ09ORF9PUFRfQllURSAgIDB4QzAKKworI2RlZmluZSBNS0FfS0VZX0xFTiAgICAgICAgICAgICAgICAgMTYgLyogY29tbW9uIGtleSBzaXplICovCisKKyNkZWZpbmUgTUtBX0tFS19MQUJFTF9MRU4gICAgICAgICAgIDEyIC8qIGxhYmVsIGxlbmd0aCAqLworI2RlZmluZSBNS0FfS0VLX0NPTlRFWFRfTEVOICAgICAgICAgMTYKKworI2RlZmluZSBNS0FfU0FLX0tFWV9XUkFQUEVEX0xFTiAgICAgMjQKKworI2RlZmluZSBNS0FfSUNLX0xBQkVMX0xFTiAgICAgICAgICAgMTIgLyogbGFiZWwgbGVuZ3RoICovCisjZGVmaW5lIE1LQV9JQ0tfQ09OVEVYVF9MRU4gICAgICAgICAxNgorCisjZGVmaW5lIE1LQV9DS05fTEFCRUxfTEVOICAgICAgICAgICAxNiAvKiBsYWJlbCBsZW5ndGggKi8KKyNkZWZpbmUgTUtBX0NLTl9DT05URVhUX0xFTiAgICAgICAgIChTSVpFX09GX0VBUF9TRVNTSU9OX0lEICsgKEJDTU9TX0VUSF9BTEVOICogMikpIC8qIDc3ICovCisKKyNkZWZpbmUgTUtBX0NBS19MQUJFTF9MRU4gICAgICAgICAgIDE2IC8qIGxhYmVsIGxlbmd0aCAqLworI2RlZmluZSBNS0FfQ0FLX0NPTlRFWFRfTEVOICAgICAgICAgMTIgLyogY29udGV4dCBsZW5ndGggKi8KKworLyogTUtQRFUgUGFyYW1ldGVyIHNldCB0eXBlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QgICAgICA9IDEsCisgICAgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QgPSAyLAorICAgIE1LUERVX1BBUkFNX1NFVF9NQUNTRUNfU0FLX1VTRSAgICAgID0gMywKKyAgICBNS1BEVV9QQVJBTV9TRVRfRElTVF9TQUsgICAgICAgICAgICA9IDQsCisgICAgTUtQRFVfUEFSQU1fU0VUX0RJU1RfQ0FLICAgICAgICAgICAgPSA1LAorICAgIE1LUERVX1BBUkFNX1NFVF9LTUQgICAgICAgICAgICAgICAgID0gNiwKKyAgICBNS1BEVV9QQVJBTV9TRVRfQU5OT1VOQ0VNRU5UICAgICAgICA9IDcsCisgICAgTUtQRFVfUEFSQU1fU0VUX0lDVl9JTkRJQ0FUT1IgICAgICAgPSAyNTUsCit9IG1rcGR1X3BhcmFtX3NldF90eXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBNS0FfTVNHX1RJTUVPVVQsCisgICAgTUtBX01TR19EQVRBX0lORAorfSBta2FfbXNnX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgbWthX21zZ190eXBlIHR5cGU7CisgICAgZWFwb2xfbXNnX2hkciAqbXNnOworICAgIGJjbW9sdF9idWYgKmJ1ZjsKK30gbWthX2V2ZW50OworCisvKiBDYWxjdWxhdGUgS2V5IEVuY3J5cHRpb24gS2V5ICovCitzdGF0aWMgdm9pZCBfbWthX2NhbGNfa2VrKHVpbnQ4X3QgKmtlaywgdWludDhfdCAqY2FrLCB1aW50OF90ICpja24pCit7CisgICAgY2hhciBrZWtfbGFiZWxbTUtBX0tFS19MQUJFTF9MRU4gKyAxXSA9ICJJRUVFODAyMSBLRUsiOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04oa2VrID09IE5VTEwpOworICAgIEJVR19PTihjYWsgPT0gTlVMTCk7CisgICAgQlVHX09OKGNrbiA9PSBOVUxMKTsKKworICAgIGRwb2Vfc2VjX2Flc19jbWFjX2tkZihjYWssIGtla19sYWJlbCwgY2tuLCBNS0FfS0VLX0NPTlRFWFRfTEVOLCBrZWspOworfQorCisvKiBDYWxjdWxhdGUgSW50ZWdyaXR5IENoZWNrIHZhbHVlIEtleSAqLworc3RhdGljIHZvaWQgX21rYV9jYWxjX2ljayh1aW50OF90ICppY2ssIHVpbnQ4X3QgKmNhaywgdWludDhfdCAqY2tuKQoreworICAgIGNoYXIgaWNrX2xhYmVsW01LQV9JQ0tfTEFCRUxfTEVOICsgMV0gPSAiSUVFRTgwMjEgSUNLIjsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGljayA9PSBOVUxMKTsKKyAgICBCVUdfT04oY2FrID09IE5VTEwpOworICAgIEJVR19PTihja24gPT0gTlVMTCk7CisKKyAgICBkcG9lX3NlY19hZXNfY21hY19rZGYoY2FrLCBpY2tfbGFiZWwsIGNrbiwgTUtBX0lDS19DT05URVhUX0xFTiwgaWNrKTsKK30KKworLyogY2FsY3VsYXRlIEludGVncml0eSBDaGVjayBWYWx1ZSAqLworc3RhdGljIHZvaWQgX21rYV9jYWxjX2ljdih1aW50OF90ICppY3YsIHVpbnQ4X3QgKmljaywgdWludDhfdCAqbXNkdSwgdWludDE2X3QgbXNkdV9sZW4pCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04oaWN2ID09IE5VTEwpOworICAgIEJVR19PTihpY2sgPT0gTlVMTCk7CisgICAgQlVHX09OKG1zZHUgPT0gTlVMTCk7CisKKyAgICBkcG9lX3NlY19hZXNfY21hYyhpY2ssIG1zZHUsIG1zZHVfbGVuLCBpY3YpOworfQorCisvKiBDYWxjdWxhdGUgU2VjdXJlIENvbm5lY3Rpdml0eSBBc3NvY2lhdGlvbiBLZXkgTmFtZSAqLworc3RhdGljIHZvaWQgX21rYV9jYWxjX2NrbihkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIHVpbnQ4X3QgZWFwX3Nlc3NfaWRfbGVuKQoreworICAgIGNoYXIgY2tuX2xhYmVsW01LQV9DS05fTEFCRUxfTEVOICsgMV0gPSAiSUVFRTgwMjEgRUFQIENLTiI7CisgICAgdWludDhfdCBja25fY29udGV4dFtNS0FfQ0tOX0NPTlRFWFRfTEVOXTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2tuID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEubWFzdGVyX3Nlc3Npb25fa2V5ID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2Vzc2lvbl9pZCA9PSBOVUxMKTsKKworICAgIG1lbWNweSgmY2tuX2NvbnRleHRbMF0sIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXNzaW9uX2lkLCBlYXBfc2Vzc19pZF9sZW4pOworICAgIG1lbWNweSgmY2tuX2NvbnRleHRbZWFwX3Nlc3NfaWRfbGVuXSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5sZXNzZXJfbWFjLnU4LCBCQ01PU19FVEhfQUxFTik7CisgICAgbWVtY3B5KCZja25fY29udGV4dFtlYXBfc2Vzc19pZF9sZW4gKyBCQ01PU19FVEhfQUxFTl0sIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Z3JlYXRlcl9tYWMudTgsIEJDTU9TX0VUSF9BTEVOKTsKKyAgICBkcG9lX3NlY19hZXNfY21hY19rZGYobGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1hc3Rlcl9zZXNzaW9uX2tleSwgY2tuX2xhYmVsLCBja25fY29udGV4dCwgTUtBX0NLTl9DT05URVhUX0xFTiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5ja24pOworfQorCisvKiBDYWxjdWxhdGUgU2VjdXJlIENvbm5lY3Rpdml0eSBBc3NvY2lhdGlvbiBLZXkgKi8KK3N0YXRpYyB2b2lkIF9ta2FfY2FsY19jYWsoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGNoYXIgY2FrX2xhYmVsW01LQV9DQUtfTEFCRUxfTEVOICsgMV0gPSAiSUVFRTgwMjEgRUFQIENBSyI7CisgICAgdWludDhfdCBjYWtfY29udGV4dFtNS0FfQ0FLX0NPTlRFWFRfTEVOXTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEubWFzdGVyX3Nlc3Npb25fa2V5ID09IE5VTEwpOworCisgICAgbWVtY3B5KCZjYWtfY29udGV4dFswXSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5sZXNzZXJfbWFjLnU4LCBCQ01PU19FVEhfQUxFTik7CisgICAgbWVtY3B5KCZjYWtfY29udGV4dFtCQ01PU19FVEhfQUxFTl0sIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Z3JlYXRlcl9tYWMudTgsIEJDTU9TX0VUSF9BTEVOKTsKKyAgICBkcG9lX3NlY19hZXNfY21hY19rZGYobGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1hc3Rlcl9zZXNzaW9uX2tleSwgY2FrX2xhYmVsLCBjYWtfY29udGV4dCwgTUtBX0NBS19DT05URVhUX0xFTiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5jYWspOworfQorCisvKiBHZXQgT0xUIHBvcnQgTWFjIGFuZCBsaW5rIE1hYyAmIGNvbXBhcmUuIFRoaXMgaXMgbmVlZGVkIGZvciBjYWxjdWxhdGluZyBDQUsgKi8KK3N0YXRpYyB2b2lkIF9ta2FfZ2V0X29sdF9hbmRfbGlua19tYWMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICAvKiBjb21wYXJlIE9MVCBhbmQgTGluayBNQUMgYWRkcmVzc2VzICovCisgICAgaWYgKG1lbWNtcChsaW5rX3JlYy0+bmlfbWFjLnU4LCBsaW5rX3JlYy0+a2V5Lm1hY19hZGRyZXNzLnU4LCBzaXplb2YoQkNNT1NfRVRIX0FMRU4pKSA+PSAwKQorICAgIHsKKyAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5sZXNzZXJfbWFjID0gbGlua19yZWMtPmtleS5tYWNfYWRkcmVzczsKKyAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5ncmVhdGVyX21hYyA9IGxpbmtfcmVjLT5uaV9tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGVzc2VyX21hYyA9IGxpbmtfcmVjLT5uaV9tYWM7CisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Z3JlYXRlcl9tYWMgPSBsaW5rX3JlYy0+a2V5Lm1hY19hZGRyZXNzOworICAgIH0KK30KKworLyogSW5pdGlhbGl6ZSBsaW5rIE1LQSBpbmZvIHN0cnVjdHVyZSAqLworc3RhdGljIHZvaWQgX21rYV9pbml0X2xpbmtfaW5mbyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIC8qIGluaXRpYWxpemUgYWxsIGxvY2FsIHZhbHVlcyAqLworICAgIG1lbXNldChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sIDAsIHNpemVvZigqbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvKSk7CisgICAgZHBvZV9zZWNfZ2VuZXJhdGVfbl9ieXRlX3JhbmRvbV9udW1iZXIobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbHRfbWVtYmVyX2lkLCBNS0FfTUlfTEVOKTsKKyAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmN1cnJfbXNnX251bSA9IDE7IC8qIHN0YXJ0IGZyb20gMSAqLworICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlciA9IDE7IC8qIHN0YXJ0IGZyb20gMSAqLworICAgIF9ta2FfZ2V0X29sdF9hbmRfbGlua19tYWMobGlua19yZWMpOworICAgIF9ta2FfY2FsY19jYWsobGlua19yZWMpOworICAgIF9ta2FfY2FsY19ja24obGlua19yZWMsIFNJWkVfT0ZfRUFQX1NFU1NJT05fSUQpOworICAgIF9ta2FfY2FsY19pY2sobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5pY2ssIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNrbik7CisgICAgX21rYV9jYWxjX2tlayhsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtlaywgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5jYWssIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2tuKTsKK30KKworc3RhdGljIHZvaWQgX21rYV9jbGVhcl9saW5rX2luZm8oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIG1lbXNldChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sIDAsIHNpemVvZigqbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvKSk7Cit9CisKKy8qIEJ1aWxkIEVBUE9MIGhlYWRlciBmb3IgTUtQRFUgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfZWFwb2xfaGVhZGVyKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqb3V0X2J1ZiwgdWludDE2X3QgbGVuZ3RoKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOworCisgICAgcmV0dXJuCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3Mob3V0X2J1ZiwgbWthX2RzdF9tYWNfYWRkcikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhvdXRfYnVmLCBsaW5rX3JlYy0+bmlfbWFjKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShvdXRfYnVmLCBFVEhFUlRZUEVfRUFQT0wpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgRUFQT0xfUFJPVE9DT0xfVkVSU0lPTl9EUE9FKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIEVBUE9MX1RZUEVfTUtBKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShvdXRfYnVmLCBsZW5ndGgpOworfQorCisvKiBCdWlsZCBCYXNpYyBwYXJhbWV0ZXIgc2V0LiBUaGlzIHBhcmFtZXRlciBzZXQgaXMgcmVxdWlyZWQgZm9yIGV2ZXJ5IE1LUERVICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2J1aWxkX2Jhc2ljX3BhcmFtZXRlcl9zZXQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpvdXRfYnVmKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICByZXR1cm4KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfVkVSU0lPTikgJiYgLyogVmVyc2lvbiBOdW1iZXIsIDgwMi4xWCBQZy45OCAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIE1LQV9TRVJWRVJfUFJJT1JJVFkpICYmIC8qIEtleSBTZXJ2ZXIgUHJpb3JpdHkgKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfQkFTSUNfUEFSQU1fU0VUX09QVCkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfQkFTSUNfUEFSQU1fU0VUX0xFTikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhvdXRfYnVmLCBsaW5rX3JlYy0+bmlfbWFjKSAmJiAvKiA2IGJ5dGUgb2YgU0NJICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKG91dF9idWYsIGxpbmtfcmVjLT5sbGlkKSAmJiAvKiBsb3dlciAyIGJ5dGUgU0NJICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGUob3V0X2J1ZiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbHRfbWVtYmVyX2lkLCBNS0FfTUlfTEVOKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UzMl9iZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmN1cnJfbXNnX251bSsrKSAmJiAvKiBJbXBvcnRhbnQgISEgKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUob3V0X2J1ZiwgTUtBX0FMR09SSVRITV9BR0lMSVRZKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2tuLCBNS0FfQ0tOX0xFTiAvIDgpOyAvKiBDQUsgTmFtZShDS04pICovCit9CisKKy8qIEJ1aWxkIGFuIGVtcHR5IExpdmUgUGVlciBvciBQb3RlbnRpYWwgUGVlciBsaXN0IHBhcmFtZXRlciBzZXQgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfZW1wdHlfcGVlcl9saXN0KGJjbW9sdF9idWYgKm91dF9idWYsIHVpbnQ4X3QgdHlwZSkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOworCisgICAgcmV0dXJuCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgdHlwZSkgJiYgLyogUGFyYW1ldGVyIHNldCB0eXBlICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCAwKSAmJiAvKiBvcHRpb25zICYgNCBiaXQgbGVuZ3RoICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCk7IC8qIFBhcmFtZXRlciBzZXQgYm9keSBsZW5ndGguICovCit9CisKKy8qIEJ1aWxkIExpdmUgUGVlciBMaXN0IG9yIFBvdGVudGlhbCBQZWVyIExpc3QgcGFyYW1ldGVyIHNldCAqLworc3RhdGljIGJjbW9zX2Jvb2wgX21rYV9idWlsZF9wZWVyX2xpc3QoCisgICAgYmNtb2x0X2J1ZiAqb3V0X2J1ZiwKKyAgICB1aW50OF90IHR5cGUsCisgICAgY29uc3QgdWludDhfdCAqbWVtYmVyX2lkLAorICAgIHVpbnQzMl90IG1lc3NhZ2VfbnVtKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKG91dF9idWYgPT0gTlVMTCk7CisgICAgQlVHX09OKG1lbWJlcl9pZCA9PSBOVUxMKTsKKworICAgIHJldHVybgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIHR5cGUpICYmIC8qIFBhcmFtZXRlciBzZXQgdHlwZSAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIDApICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCkgJiYgLyogb3B0aW9ucyAmIDQgYml0IGxlbmd0aCAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIE1LQV9NSV9MRU4gKyBzaXplb2YodWludDMyX3QpKSAmJiAvKiBQYXJhbWV0ZXIgc2V0IGJvZHkgbGVuZ3RoLiAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIG1lbWJlcl9pZCwgTUtBX01JX0xFTikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUob3V0X2J1ZiwgbWVzc2FnZV9udW0pOworfQorCisvKiBCdWlsZCBJQ1YgSW5kaWNhdG9yIHBhcmFtZXRlciBzZXQgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfaWN2X2luZGljYXRvcihiY21vbHRfYnVmICpvdXRfYnVmKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKG91dF9idWYgPT0gTlVMTCk7CisKKyAgICByZXR1cm4KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS1BEVV9QQVJBTV9TRVRfSUNWX0lORElDQVRPUikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCAwKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIDApICYmIC8qIG9wdGlvbnMgJiA0IGJpdCBsZW5ndGggKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfSUNWX0xFTik7IC8qIFBhcmFtZXRlciBzZXQgYm9keSBsZW5ndGguICovCit9CisKKy8qIEJ1aWxkIERpc3RyaWJ1dGVkIFNBSyBwYXJhbWV0ZXIgc2V0IChHQ00tQUVTLTEyOCkgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfZGlzdHJpYnV0ZWRfc2FrKAorICAgIGNvbnN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywKKyAgICBiY21vbHRfYnVmICpvdXRfYnVmLAorICAgIGNvbnN0IHVpbnQ4X3QgKmtleV93cmFwcGVkX3NhaykKK3sKKyAgICB1aW50OF90IG9wdGlvbjsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKG91dF9idWYgPT0gTlVMTCk7CisgICAgQlVHX09OKGtleV93cmFwcGVkX3NhayA9PSBOVUxMKTsKKworICAgIC8qIG5lZWQgRGlzdHJpYnV0ZWQgQU4gJiBDb25maWRlbnRpYWxpdHkgT2Zmc2V0IChiaXQgNSw0LiB1c2UgMCkgKi8KKyAgICBvcHRpb24gPSBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlcjsKKworICAgIG9wdGlvbiA8PD0gTUtBX1NBS19VU0VfUEFSQU1fQU5fU0hJRlQ7IC8qIG1vdmUgdG8gYml0IDcsNiAqLworCisgICAgLyoga2V5IG51bWJlciAmIEFOIHdpbGwgYmUgaW5jcmVhc2VkIGZyb20gdGhlIGNhbGxlciAqLworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS1BEVV9QQVJBTV9TRVRfRElTVF9TQUspIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIG9wdGlvbikgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCkgfHwgLyogb3B0aW9ucyAmIDQgYml0IGxlbmd0aCAqLworICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfS0VZX1dSQVBQRURfU0FLX0xFTiArIE1LQV9LTl9MRU4pIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3UzMl9iZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIpIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIGtleV93cmFwcGVkX3NhaywgTUtBX0tFWV9XUkFQUEVEX1NBS19MRU4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyogQnVpbGQgTUFDc2VjIFNBSyBVc2UgcGFyYW1hdGVyIHNldCAqLworc3RhdGljIGJjbW9zX2Jvb2wgX21rYV9idWlsZF9zYWtfdXNlX3BhcmFtKAorICAgIGNvbnN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywKKyAgICBiY21vbHRfYnVmICpvdXRfYnVmLAorICAgIGJjbW9zX2Jvb2wgc2V0X3R4LAorICAgIGJjbW9zX2Jvb2wgc2V0X3J4KQoreworICAgIHVpbnQ4X3Qgb3B0aW9uMSA9IDA7CisgICAgdWludDhfdCBvcHRpb24yID0gMDsKKyAgICB1aW50OF90IHRtcCA9IDA7CisgICAgdWludDMyX3Qgb2xkX2tuOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04ob3V0X2J1ZiA9PSBOVUxMKTsKKworICAgIC8qIG9wdGlvbiAxOiBMYXRlc3QgS2V5IEFOKDc6NiksIExhdGVzdCBLZXkgVHgoNSksIExhdGVzdCBLZXkgUngoNCkgT2xkIEtleSBBTigzOjIpLCBPbGQgS2V5IFR4KDEpLCBPbGQgS2V5IFJ4KDApICovCisgICAgb3B0aW9uMSA9IGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+YXNzb2NpYXRpb25fbnVtYmVyOworICAgIG9wdGlvbjEgPDw9IE1LQV9TQUtfVVNFX1BBUkFNX0FOX1NISUZUOyAvKiBtb3ZlIHRvIGJpdCA3LDYgKEFOKSAqLworCisgICAgaWYgKHNldF90eCkKKyAgICB7CisgICAgICAgIHRtcCA9IDEgPDwgTUtBX1NBS19VU0VfUEFSQU1fTEtfVFhfU0hJRlQ7IC8qIExhdGVzdCBLZXkgVFggKi8KKyAgICB9CisgICAgaWYgKHNldF9yeCkKKyAgICB7CisgICAgICAgIHRtcCA9IHRtcCB8ICgxIDw8IE1LQV9TQUtfVVNFX1BBUkFNX0xLX1JYX1NISUZUKTsgLyogTGF0ZXN0IEtleSBSeCAqLworICAgIH0KKworICAgIC8qIGZvciBmaXJzdCBmcmFtZSwgYWxsIDAgaXMgdXNlZCBmb3Igb2xkIGtleSBpbmZvICovCisgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmVmcmVzaF9jbnQgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIGZvciBPTEQgQU4sIHR4LCByeCBiaXRzICovCisgICAgICAgIHRtcCA9IHRtcCB8ICgobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5hc3NvY2lhdGlvbl9udW1iZXIgJiBNS0FfU0FLX1VTRV9QQVJBTV9PTERfS0VZX0FOX01BU0spIDw8IE1LQV9TQUtfVVNFX1BBUkFNX09MRF9LRVlfQU5fU0ZUKTsKKyAgICAgICAgdG1wID0gdG1wIHwgTUtBX1NBS19VU0VfUEFSQU1fT0xEX0tFWV9UWF9SWDsgLyogc2hvdWxkIGhhdmUgYmVlbiB0eCAmIHJ4ICovCisgICAgfQorICAgIG9wdGlvbjEgfD0gdG1wOworCisgICAgLyogb3B0aW9uIDI6IG9ubHkgc2V0IGJpdCA3LDYocGxhaW4gdHggJiBwbGFpbiByeCkuIGFsbCBvdGhlciBiaXRzIGluY2x1ZGluZyA0IGJpdHMgbGVuZ3RoIGZpZWxkIHNob3VsZCBiZSAwICovCisgICAgb3B0aW9uMiA9IE1LQV9TQUtfVVNFX1BBUkFNX1NFQ09ORF9PUFRfQllURTsKKworICAgIC8qIG5lZWQgdG8gZGVjcmVtZW50IGtleSBudW1iZXIgZm9yIG9sZCBrZXkgKGJlY2F1c2Uga2V5IG51bWVyIG1heSBiZSBhbHJlYWR5IGluY3JlbWVudGVkKSAqLworICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIgPT0gMSkgLyogaW5pdGlhbCBudW1iZXIgKi8KKyAgICB7CisgICAgICAgIG9sZF9rbiA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG9sZF9rbiA9IGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlciAtIDE7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9NQUNTRUNfU0FLX1VTRSkgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1Ziwgb3B0aW9uMSkgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1Ziwgb3B0aW9uMikgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtBX1NBS19VU0VfUEFSQU1fQk9EWV9MRU4pIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b2x0X21lbWJlcl9pZCwgTUtBX01JX0xFTikgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKG91dF9idWYsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlcikgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKG91dF9idWYsIDEpIHx8IC8qIExvd2VzdCBhY2NlcHRhYmxlIFBOLCBzdGFydCBmcm9tIDEgKi8KKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGUob3V0X2J1ZiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbHRfbWVtYmVyX2lkLCBNS0FfTUlfTEVOKSB8fAorICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUob3V0X2J1Ziwgb2xkX2tuKSB8fAorICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUob3V0X2J1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qIENhbGN1bGF0ZSBJQ1YgYW5kIGF0dGFjaCBpdCBhdCB0aGUgZW5kIG9mIE1LUERVICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2NhbGNfYW5kX2F0dGFjaF9pY3YobWthX2xpbmtfaW5mbyAqbWthX2luZm8sIGJjbW9sdF9idWYgKm91dF9idWYpCit7CisgICAgdWludDhfdCBpY2tbTUtBX0tFWV9MRU5dOworICAgIHVpbnQ4X3QgaWN2W01LQV9LRVlfTEVOXTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKG1rYV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOworCisgICAgX21rYV9jYWxjX2ljayhpY2ssIG1rYV9pbmZvLT5jYWssIG1rYV9pbmZvLT5ja24pOworCisgICAgLyogSUNWIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIERBIHRvIGVuZCBvZiBJQ1YgaW5kaWNhdG9yICovCisgICAgX21rYV9jYWxjX2ljdihpY3YsIGljaywgb3V0X2J1Zi0+c3RhcnQsICh1aW50MTZfdCliY21vbHRfYnVmX2dldF91c2VkKG91dF9idWYpKTsKKworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIGljdiwgTUtBX0tFWV9MRU4pOworfQorCisvKiBTZW5kIHRoZSBmaXJzdCBNS0EgZnJhbWUgdG8gT05VICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX3NlbmRfaW5pdF9mcmFtZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb2x0X2J1ZiBvdXRfYnVmOworICAgIHVpbnQ4X3QgZnJhbWVbTUtBX1BEVV9NQVhfRlJBTUVfTEVOXTsKKyAgICBiY21vc19ib29sIHJldCA9IEJDTU9TX0ZBTFNFOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIGJjbW9sdF9idWZfaW5pdCgmb3V0X2J1ZiwgTUtBX1BEVV9NQVhfRlJBTUVfTEVOLCBmcmFtZSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIC8qIGNvbnN0cnVjdCBmcmFtZSAqLworICAgIGlmICghX21rYV9idWlsZF9lYXBvbF9oZWFkZXIobGlua19yZWMsICZvdXRfYnVmLCBNS0FfT0xUX0lOSVRfRlJBTUVfTEVOKSB8fAorICAgICAgICAhX21rYV9idWlsZF9iYXNpY19wYXJhbWV0ZXJfc2V0KGxpbmtfcmVjLCAmb3V0X2J1ZikgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfZW1wdHlfcGVlcl9saXN0KCZvdXRfYnVmLCBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QpIHx8CisgICAgICAgICFfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdCgmb3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpIHx8CisgICAgICAgICFfbWthX2J1aWxkX2ljdl9pbmRpY2F0b3IoJm91dF9idWYpIHx8CisgICAgICAgICFfbWthX2NhbGNfYW5kX2F0dGFjaF9pY3YobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLCAmb3V0X2J1ZikpIC8qIGxhc3QgaW1wb3J0YW50IHN0ZXAuIENhbGMgJiBhdHRhY2ggSUNWICovCisgICAgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChCQ01fRVJSX09LID09IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIGZyYW1lLCBiY21vbHRfYnVmX2dldF91c2VkKCZvdXRfYnVmKSkpCisgICAgeworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+cnhfdGltZXIsIE1LQV9MSUZFX1RJTUUgKiAxMDAwKTsKKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnR4X3RpbWVyLCBNS0FfSEVMTE9fVElNRSAqIDEwMDApOworICAgICAgICByZXQgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIEdlbmVyYXRlIGEgU0FLIHVzaW5nIFJORyAqLwordm9pZCBta2FfZ2VuZXJhdGVfc2FrKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb3NfYm9vbCBpbml0aWFsKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICAvKiBHZW5lcmF0ZSBTQUsgKi8KKyAgICBpZiAoaW5pdGlhbCkKKyAgICB7CisgICAgICAgIF9ta2FfY2FsY19rZWsobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZWssIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNrbik7CisgICAgICAgIGRwb2Vfc2VjX2dlbmVyYXRlX25fYnl0ZV9yYW5kb21fbnVtYmVyKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrLCBNS0FfS0VZX0xFTik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRwb2Vfc2VjX2dlbmVyYXRlX25fYnl0ZV9yYW5kb21fbnVtYmVyKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bmV3X3NhaywgTUtBX0tFWV9MRU4pOworICAgIH0KK30KKworLyogU2VuZCB0aGUgU0FLIHRvIHRoZSBPTlUgKi8KK2JjbW9zX2Vycm5vIG1rYV9zZW5kX3NhayhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIHVpbnQ4X3QgKnNhaykKK3sKKyAgICBiY21vbHRfYnVmIG91dF9idWY7CisgICAgdWludDhfdCBmcmFtZVtNS0FfUERVX01BWF9GUkFNRV9MRU5dOworICAgIHVpbnQ4X3Qga2V5X3dyYXBwZWRfc2FrW01LQV9LRVlfTEVOICogMl0gPSB7fTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfQ09NTV9GQUlMOworICAgIGRwb2Vfc2VjX2Flc19rZXkgYWVzX2tleTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJm91dF9idWYsIE1LQV9QRFVfTUFYX0ZSQU1FX0xFTiwgZnJhbWUsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICAvKiBrZXkgd3JhcCBzYWsgdXNpbmcga2VrICovCisgICAgZHBvZV9zZWNfYWVzX3NldF9lbmNyeXB0X2tleShsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtlaywgTUtBX0tFS19MRU4sICZhZXNfa2V5KTsKKyAgICBkcG9lX3NlY19hZXNfd3JhcF9rZXkoJmFlc19rZXksIGtleV93cmFwcGVkX3Nhaywgc2FrLCBNS0FfU0FLX0xFTik7CisKKyAgICAvKiBjb25zdHJ1Y3QgZnJhbWUgKi8KKyAgICBpZiAoIV9ta2FfYnVpbGRfZWFwb2xfaGVhZGVyKAorICAgICAgICAgICAgbGlua19yZWMsCisgICAgICAgICAgICAmb3V0X2J1ZiwKKyAgICAgICAgICAgIE1LQV9PTFRfSU5JVF9GUkFNRV9MRU4gKyBNS0FfT05FX1BFRVJfTEVOICsgTUtBX0RJU1RSSUJVVEVEX1NBS19MRU4gKyBNS0FfU0FLX1VTRV9QQVJBTV9MRU0pIHx8CisgICAgICAgICFfbWthX2J1aWxkX2Jhc2ljX3BhcmFtZXRlcl9zZXQobGlua19yZWMsICZvdXRfYnVmKSB8fAorICAgICAgICAhX21rYV9idWlsZF9wZWVyX2xpc3QoCisgICAgICAgICAgICAmb3V0X2J1ZiwKKyAgICAgICAgICAgIE1LUERVX1BBUkFNX1NFVF9MSVZFX1BFRVJfTElTVCwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tZW1lYmVyX2lkLAorICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0pIHx8CisgICAgICAgICFfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdCgmb3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpIHx8CisgICAgICAgICFfbWthX2J1aWxkX2Rpc3RyaWJ1dGVkX3NhayhsaW5rX3JlYywgJm91dF9idWYsIGtleV93cmFwcGVkX3NhaykgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfc2FrX3VzZV9wYXJhbShsaW5rX3JlYywgJm91dF9idWYsIEJDTU9TX0ZBTFNFLCBCQ01PU19UUlVFKSB8fCAvKiBzZXQgUlggb25seSAqLworICAgICAgICAhX21rYV9idWlsZF9pY3ZfaW5kaWNhdG9yKCZvdXRfYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKworICAgIC8qIGxhc3QgaW1wb3J0YW50IHN0ZXAuIENhbGMgJiBhdHRhY2ggSUNWICovCisgICAgX21rYV9jYWxjX2FuZF9hdHRhY2hfaWN2KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgJm91dF9idWYpOworCisgICAgaWYgKEJDTV9FUlJfT0sgPT0gZHBvZV9zZWNfc2VuZF9lYXBvbChsaW5rX3JlYy0+ZGV2aWNlLCAmbGlua19yZWMtPmtleSwgZnJhbWUsIGJjbW9sdF9idWZfZ2V0X3VzZWQoJm91dF9idWYpKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT50eF90aW1lciwgTUtBX0hFTExPX1RJTUUgKiAxMDAwKTsKKyAgICAgICAgcmMgPSBCQ01fRVJSX09LOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyogUmVjZWl2ZWQgU0FLIHJlc3BvbnNlLiBTZW5kIGNvbmZpcm0gZnJhbWUgdG8gT05VICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX3NlbmRfc2FrX2NvbmZpcm1fZnJhbWUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9sdF9idWYgb3V0X2J1ZjsKKyAgICB1aW50OF90IGZyYW1lW01LQV9QRFVfTUFYX0ZSQU1FX0xFTl07CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworCisgICAgYmNtb2x0X2J1Zl9pbml0KCZvdXRfYnVmLCBNS0FfUERVX01BWF9GUkFNRV9MRU4sIGZyYW1lLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgaWYgKCFfbWthX2J1aWxkX2VhcG9sX2hlYWRlcihsaW5rX3JlYywgJm91dF9idWYsIE1LQV9PTFRfSU5JVF9GUkFNRV9MRU4gKyBNS0FfT05FX1BFRVJfTEVOICsgTUtBX1NBS19VU0VfUEFSQU1fTEVNKSB8fAorICAgICAgICAhX21rYV9idWlsZF9iYXNpY19wYXJhbWV0ZXJfc2V0KGxpbmtfcmVjLCAmb3V0X2J1ZikgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfcGVlcl9saXN0KAorICAgICAgICAgICAgJm91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9MSVZFX1BFRVJfTElTVCwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tZW1lYmVyX2lkLAorICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0pIHx8CisgICAgICAgICFfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdCgmb3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpIHx8CisgICAgICAgICFfbWthX2J1aWxkX3Nha191c2VfcGFyYW0obGlua19yZWMsICZvdXRfYnVmLCBCQ01PU19UUlVFLCBCQ01PU19UUlVFKSB8fAorICAgICAgICAhX21rYV9idWlsZF9pY3ZfaW5kaWNhdG9yKCZvdXRfYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBsYXN0IGltcG9ydGFudCBzdGVwLiBDYWxjICYgYXR0YWNoIElDViAqLworICAgIF9ta2FfY2FsY19hbmRfYXR0YWNoX2ljdihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sICZvdXRfYnVmKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LID09IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIGZyYW1lLCBiY21vbHRfYnVmX2dldF91c2VkKCZvdXRfYnVmKSk7Cit9CisKKy8qIHNlbmQga2VlcC1hbGl2ZSBmcmFtZSBldmVyeSAyIHNlY29uZHMgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2Ffc2VuZF9rZWVwYWxpdmVfZnJhbWUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9sdF9idWYgb3V0X2J1ZjsKKyAgICB1aW50OF90IGZyYW1lW01LQV9QRFVfTUFYX0ZSQU1FX0xFTl07CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworCisgICAgYmNtb2x0X2J1Zl9pbml0KCZvdXRfYnVmLCBNS0FfUERVX01BWF9GUkFNRV9MRU4sIGZyYW1lLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgaWYgKCFfbWthX2J1aWxkX2VhcG9sX2hlYWRlcihsaW5rX3JlYywgJm91dF9idWYsIE1LQV9PTFRfSU5JVF9GUkFNRV9MRU4gKyBNS0FfT05FX1BFRVJfTEVOKSB8fAorICAgICAgICAhX21rYV9idWlsZF9iYXNpY19wYXJhbWV0ZXJfc2V0KGxpbmtfcmVjLCAmb3V0X2J1ZikgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfcGVlcl9saXN0KAorICAgICAgICAgICAgJm91dF9idWYsCisgICAgICAgICAgICBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QsCisgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbWVtZWJlcl9pZCwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tc2dfbnVtKSB8fAorICAgICAgICAhX21rYV9idWlsZF9lbXB0eV9wZWVyX2xpc3QoJm91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9QT1RFTlRJQUxfUEVFUl9MSVNUKSB8fAorICAgICAgICAhX21rYV9idWlsZF9pY3ZfaW5kaWNhdG9yKCZvdXRfYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBsYXN0IGltcG9ydGFudCBzdGVwLiBDYWxjICYgYXR0YWNoIElDViAqLworICAgIF9ta2FfY2FsY19hbmRfYXR0YWNoX2ljdihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sICZvdXRfYnVmKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LID09IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIGZyYW1lLCBiY21vbHRfYnVmX2dldF91c2VkKCZvdXRfYnVmKSk7Cit9CisKKy8qIEVudHJ5IHBvaW50IGZvciBNS0EgcHJvY2Vzcy4gSXQgaXMgY2FsbGVkIHRvIHN0YXJ0IHRoZSBNS0EgZXhjaGFuZ2Ugd2l0aCB0aGUgT05VIHRoYXQgb3ducyB0aGUgc3BlY2lmaWVkIGxpbmsuICovCitiY21vc19lcnJubyBta2Ffc3RhcnQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIC8qIGluaXRpYWxpemUgbGluayBNS0EgaW5mbyAqLworICAgIF9ta2FfaW5pdF9saW5rX2luZm8obGlua19yZWMpOworCisgICAgLyogc2VuZCBpbml0aWFsIGZyYW1lIChiYXNpYyBwYXJhbSArIGVtcHR5IGxpdmUgJiBwb3RlbnRpYWwgcGVlciBsaXN0ICovCisgICAgaWYgKF9ta2Ffc2VuZF9pbml0X2ZyYW1lKGxpbmtfcmVjKSkKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIENhbGN1bGF0ZSB0aGUgSUNWIG92ZXIgdGhlIG1lc3NhZ2UgYW5kIGNvbXBhcmUgd2l0aCB0aGUgSUNWIGluIHRoZSBtZXNzYWdlLiAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9ta2FfY29tcGFyZV9pY3YobWthX2xpbmtfaW5mbyAqaW5mbywgY29uc3QgbWthX2V2ZW50ICptc2csIHVpbnQ4X3QgKnJ4X2ljdikKK3sKKyAgICB1aW50MTZfdCBsZW4gPSAwOworICAgIHVpbnQ4X3QgaWN2W01LQV9JQ1ZfTEVOXTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGluZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKworICAgIC8qIElmIHRoZSBJQ1YgcG9pbnRlciBpcyBOVUxMLCB0aGVuIHRoZXJlIHdhcyBubyBJQ1YgaW4gdGhlIHJlY2VpdmVkIE1LQSBwYWNrZXQuIEp1c3QgcmV0dXJuIGFuIGVycm9yLiAqLworICAgIGlmIChyeF9pY3YgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBvdmVyIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgSUNWLiAqLworICAgIGxlbiA9IChFQVBPTF9NU0dfSERSX1NJWkUgKyBtc2ctPm1zZy0+ZWFwb2xfbGVuZ3RoKSAtIE1LQV9JQ1ZfTEVOOworCisgICAgX21rYV9jYWxjX2ljdihpY3YsIGluZm8tPmljaywgbXNnLT5idWYtPnN0YXJ0LCBsZW4pOworCisgICAgaWYgKG1lbWNtcChpY3YsIHJ4X2ljdiwgc2l6ZW9mKGljdikpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFBhcnNlIHRoZSBCYXNpYyBQYXJhbWV0ZXIgU2V0IGluIE1LQSBQRFVzICovCitzdGF0aWMgYmNtb3NfZXJybm8gX21rYV9wYXJzZV9iYXNpY19wYXJhbV9zZXQoCisgICAgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLAorICAgIGJjbW9sdF9idWYgKmJ1ZiwKKyAgICB1aW50MTZfdCAqYnl0ZXNfcmVhZCwKKyAgICB1aW50MTZfdCBib2R5X2xlbiwKKyAgICB1aW50OF90ICpzY2ksCisgICAgdWludDhfdCAqbWVtYmVyX2lkLAorICAgIHVpbnQzMl90ICptc2dfbnVtKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ5dGVzX3JlYWQgPT0gTlVMTCk7CisKKyAgICAvKiBSZWFkIHRoZSBPTlUgU0NJICovCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCBzY2ksIE1LQV9TQ0lfTEVOKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8qIFJlYWQgdGhlIE1lbWJlciBJRCAqLworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgbWVtYmVyX2lkLCBNS0FfTUlfTEVOKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8qIFJlYWQgdGhlIE9OVSBtZXNzYWdlIG51bWJlci4gKi8KKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzJfYmUoYnVmLCBtc2dfbnVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8qIFRoZSBTQ0ksIE1JLCBhbmQgTU4gd2VyZSByZWFkIGZyb20gdGhlIHBhY2tldC4gKi8KKyAgICAqYnl0ZXNfcmVhZCA9IE1LQV9TQ0lfTEVOICsgTUtBX01JX0xFTiArIE1LQV9NTl9MRU47CisKKyAgICAvKiBTa2lwIHRoZSByZXN0ICovCisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAoYnVmLCBib2R5X2xlbiAtICpieXRlc19yZWFkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX21rYV93YWl0aW5nX2luaXRpYWxfcmVzcG9uc2VfZGF0YV9pbmQobWthX2V2ZW50ICptc2csIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgdWludDhfdCAqaWN2X3B0cjsKKyAgICB1aW50OF90IHBhcmFtX3NldF90eXBlOworICAgIHVpbnQxNl90IGJvZHlfbGVuOworICAgIGJjbW9zX2Jvb2wgYmFzaWNfcGFyYW1fc2V0X2V4aXN0ID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfYm9vbCBsaXZlX3BlZXJfbGlzdF9leGlzdCA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgcG90ZW50aWFsX3BlZXJfbGlzdF9leGlzdCA9IEJDTU9TX0ZBTFNFOworICAgIHVpbnQxNl90IGJ5dGVzX3JlYWQ7CisKKyAgICAvKiBWYWxpZGF0ZSB0aGUgbXNnIHBvaW50ZXIuICovCisgICAgQlVHX09OKG1zZy0+YnVmID09IE5VTEwpOworICAgIEJVR19PTihtc2ctPm1zZyA9PSBOVUxMKTsKKworICAgIC8qIG1hcmsgSUNWIGZpZWxkIG9mZnNldCAqLworICAgIGljdl9wdHIgPSBtc2ctPmJ1Zi0+Y3VyciArIChtc2ctPm1zZy0+ZWFwb2xfbGVuZ3RoIC0gTUtBX0lDVl9MRU4pOworCisgICAgLyogVmFsaWRhdGUgdGhlIEludGVncml0eSBDaGVjayBWYWx1ZSBiZWZvcmUgY29udGludWluZyB0byBwcm9jZXNzIHRoZSBwYWNrZXQuICovCisgICAgcmMgPSBfbWthX2NvbXBhcmVfaWN2KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgbXNnLCBpY3ZfcHRyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSByYywgcmMpOworCisgICAgd2hpbGUgKGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKG1zZy0+YnVmKSA+IDApCisgICAgeworICAgICAgICAvKiBEb24ndCBwYXJzZSBwYXN0IHRoZSBJQ1YgUGFyYW1ldGVyIFNldCAqLworICAgICAgICBpZiAoYmNtb2x0X2J1Zl9zbmFwX2dldChtc2ctPmJ1ZikgPj0gaWN2X3B0cikKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWFkIHdoYXQgc2hvdWxkIGJlIHRoZSBCYXNpYyBQYXJhbWV0ZXIgU2V0IGhlYWRlci4gKi8KKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZwYXJhbV9zZXRfdHlwZSkgfHwKKyAgICAgICAgICAgICFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIDEpIHx8CisgICAgICAgICAgICAhYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShtc2ctPmJ1ZiwgJmJvZHlfbGVuKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgYm9keSBsZW5ndGggaXMgcmVhbGx5IDEyLWJpdHMuICovCisgICAgICAgIGJvZHlfbGVuICY9IDB4MGZmZjsKKworICAgICAgICBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX0xJVkVfUEVFUl9MSVNUKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBuZWVkIHRvIGZpbmQgb3V0IHdoZXRoZXIgaXQgaXMgQmFzaWMgcGFyYW1ldGVyIHNldCBPUiBMaXZlIFBlZXIgTGlzdCAqLworICAgICAgICAgICAgaWYgKGJvZHlfbGVuID49IE1LQV9CQVNJQ19QQVJBTV9TRVRfTEVOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX21rYV9wYXJzZV9iYXNpY19wYXJhbV9zZXQoCisgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLAorICAgICAgICAgICAgICAgICAgICBtc2ctPmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX3JlYWQsCisgICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9udV9zY2ksCisgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tZW1lYmVyX2lkLAorICAgICAgICAgICAgICAgICAgICAmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0pOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAicGFyc2UgYmFzaWMgcGFyYW0gc2V0IGZhaWxlZCFcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBNYXJrIHRoYXQgdGhlIEJhc2ljIFBhcmFtZXRlciBTZXQgd2FzIGZvdW5kLiAqLworICAgICAgICAgICAgICAgIGJhc2ljX3BhcmFtX3NldF9leGlzdCA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTGl2ZSBQZWVyIExpc3QuIHNraXAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAicGFyc2UgbGl2ZSBwZWVyIGxpc3QgZmFpbGVkIVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTWFyayB0aGF0IHRoZSBMaXZlIFBlZXIgTGlzdCBQYXJhbWV0ZXIgU2V0IHdhcyBmb3VuZC4gKi8KKyAgICAgICAgICAgICAgICBsaXZlX3BlZXJfbGlzdF9leGlzdCA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbWlbTUtBX01JX0xFTl07CisKKyAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKG1zZy0+YnVmLCBtaSwgc2l6ZW9mKG1pKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAicGFyc2UgcG90ZW50aWFsIHBlZXIgbGlzdCBmYWlsZWQhXG4iKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFZlcmlmeSB0aGF0IHRoZSBPTFQgbWVtYmVyIElEIGluIHRoZSBQb3RlbnRpYWwgUGVlciBMaXN0IFBhcmFtZXRlciBTZXQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgT0xUIG1lbWJlcgorICAgICAgICAgICAgICAgSUQuICovCisgICAgICAgICAgICBpZiAobWVtY21wKG1pLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9sdF9tZW1iZXJfaWQsIE1LQV9NSV9MRU4pICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAid3JvbmcgbWVtYmVyIElEIVxuIik7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2tpcCB0aGUgcmVtYWluaW5nIGJ5dGVzLiAqLworICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuIC0gTUtBX01JX0xFTikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiYnVmZmVyIG92ZXJmbG93IVxuIik7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBNYXJrIHRoYXQgdGhlIFBvdGVudGlhbCBQZWVyIExpc3QgUGFyYW1ldGVyIFNldCB3YXMgZm91bmQuICovCisgICAgICAgICAgICBwb3RlbnRpYWxfcGVlcl9saXN0X2V4aXN0ID0gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNraXAgb3RoZXIgUGFyYW1ldGVyIFNldCBkYXRhLiAqLworICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJidWZmZXIgb3ZlcmZsb3chXG4iKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHJjID09IEJDTV9FUlJfT0spICYmCisgICAgICAgIGJhc2ljX3BhcmFtX3NldF9leGlzdCAmJgorICAgICAgICBsaXZlX3BlZXJfbGlzdF9leGlzdCAmJgorICAgICAgICBwb3RlbnRpYWxfcGVlcl9saXN0X2V4aXN0ICYmCisgICAgICAgIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnBlZXJfc3RhdGUgIT0gTUtBX1BFRVJfU1RBVEVfTElWRSkpCisgICAgeworICAgICAgICAvKiBwcm9jZWVkIHRvIG5leHQgc3RhdGUgKi8KKyAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5wZWVyX3N0YXRlID0gTUtBX1BFRVJfU1RBVEVfTElWRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIEhhbmRsZXIgZm9yIGluaXRpYWwgcmVzcG9uc2UgZnJvbSB0aGUgT05VICovCitzdGF0aWMgYmNtb3NfZXJybm8gX21rYV93YWl0aW5nX2luaXRpYWxfcmVzcG9uc2UobWthX2V2ZW50ICptc2csIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgTUtBX01TR19USU1FT1VUOgorICAgICAgICAgICAgLyogcmV0cnkgMyB0aW1lcyAqLworICAgICAgICAgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmV0cnlfY250IDwgTUtBX0lOSVRfUkVUUllfQ05UKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmV0cnlfY250Kys7CisgICAgICAgICAgICAgICAgKHZvaWQpX21rYV9zZW5kX2luaXRfZnJhbWUobGlua19yZWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9ta2FfY2xlYXJfbGlua19pbmZvKGxpbmtfcmVjKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUtBX01TR19EQVRBX0lORDoKKyAgICAgICAgICAgIHJjID0gX21rYV93YWl0aW5nX2luaXRpYWxfcmVzcG9uc2VfZGF0YV9pbmQobXNnLCBsaW5rX3JlYyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9ta2FfaW5pdGlhbF9zYWtfc2VudF9kYXRhX2luZChta2FfZXZlbnQgKm1zZywgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICB1aW50OF90ICppY3ZfcHRyOworICAgIHVpbnQ4X3QgcGFyYW1fc2V0X3R5cGU7CisgICAgdWludDhfdCBrc19wcmlvcml0eTsKKyAgICB1aW50MTZfdCBib2R5X2xlbjsKKyAgICBiY21vc19ib29sIGJhc2ljX3BhcmFtX29rID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfYm9vbCBsaXZlX3BlZXJfbGlzdF9vayA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgcG90ZW50aWFsX3BlZXJfbGlzdF9vayA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgc2FrX3VzZV9wYXJhbV9vayA9IEJDTU9TX0ZBTFNFOworICAgIHVpbnQxNl90IGJ5dGVzX3JlYWQ7CisKKyAgICAvKiBWYWxpZGF0ZSB0aGUgbXNnIHBvaW50ZXIuICovCisgICAgQlVHX09OKG1zZy0+bXNnID09IE5VTEwpOworICAgIEJVR19PTihtc2ctPmJ1ZiA9PSBOVUxMKTsKKworICAgIC8qIG1hcmsgSUNWIGZpZWxkIG9mZnNldCAqLworICAgIGljdl9wdHIgPSBtc2ctPmJ1Zi0+Y3VyciArIChtc2ctPm1zZy0+ZWFwb2xfbGVuZ3RoIC0gTUtBX0lDVl9MRU4pOworCisgICAgLyogVmFsaWRhdGUgdGhlIEludGVncml0eSBDaGVjayBWYWx1ZSBiZWZvcmUgY29udGludWluZyB0byBwcm9jZXNzIHRoZSBwYWNrZXQuICovCisgICAgcmMgPSBfbWthX2NvbXBhcmVfaWN2KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgbXNnLCBpY3ZfcHRyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSByYywgcmMpOworCisgICAgd2hpbGUgKGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKG1zZy0+YnVmKSA+IDApCisgICAgeworICAgICAgICAvKiBEb24ndCBwYXJzZSBwYXN0IHRoZSBJQ1YgUGFyYW1ldGVyIFNldCAqLworICAgICAgICBpZiAoYmNtb2x0X2J1Zl9zbmFwX2dldChtc2ctPmJ1ZikgPj0gaWN2X3B0cikKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWFkIHdoYXQgc2hvdWxkIGJlIHRoZSBCYXNpYyBQYXJhbWV0ZXIgU2V0IGhlYWRlci4gKi8KKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZwYXJhbV9zZXRfdHlwZSkgfHwKKyAgICAgICAgICAgICFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZrc19wcmlvcml0eSkgfHwKKyAgICAgICAgICAgICFiY21vbHRfYnVmX3JlYWRfdTE2X2JlKG1zZy0+YnVmLCAmYm9keV9sZW4pKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSBib2R5IGxlbmd0aCBpcyByZWFsbHkgMTItYml0cy4gKi8KKyAgICAgICAgYm9keV9sZW4gJj0gMHgwZmZmOworCisgICAgICAgIGlmIChwYXJhbV9zZXRfdHlwZSA9PSBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5lZWQgdG8gZmluZCBvdXQgd2hldGhlciBpdCBpcyBCYXNpYyBwYXJhbWV0ZXIgc2V0IE9SIExpdmUgUGVlciBMaXN0ICovCisgICAgICAgICAgICBpZiAoYm9keV9sZW4gPj0gTUtBX0JBU0lDX1BBUkFNX1NFVF9MRU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaW4gb3VyIGVudmlyb25tZW50LCBPTlUgY2FuIG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgbGl2ZSBwZWVyLiBTbywganVzdCBzZWVpbmcgcGFyYW0gc2V0IGJvZHkgbGVuCisgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiAqLworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmtfbW47CisgICAgICAgICAgICAgICAgdWludDhfdCBzY2lbTUtBX1NDSV9MRU5dOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWlbTUtBX01JX0xFTl07CisKKyAgICAgICAgICAgICAgICByYyA9IF9ta2FfcGFyc2VfYmFzaWNfcGFyYW1fc2V0KGxpbmtfcmVjLCBtc2ctPmJ1ZiwgJmJ5dGVzX3JlYWQsIGJvZHlfbGVuLCBzY2ksIG1pLCAmbGlua19tbik7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCBPTlUgU0NJIGlzIHdoYXQncyBleHBlY3RlZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAobWVtY21wKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b251X3NjaSwgc2NpLCBNS0FfU0NJX0xFTikgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFZlcmlmeSB0aGF0IE9OVSBNSSBpcyB3aGF0J3MgZXhwZWN0ZWQuICovCisgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbWVtZWJlcl9pZCwgbWksIE1LQV9NSV9MRU4pICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCB0aGUgTU4gaXMgd2hhdCdzIGV4cGVjdGVkLiAqLworICAgICAgICAgICAgICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbXNnX251bSA8IGxpbmtfbW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBjb3JyZWN0IE1OISAqLworICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbXNnX251bSA9IGxpbmtfbW47CisgICAgICAgICAgICAgICAgICAgIGJhc2ljX3BhcmFtX29rID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTGl2ZSBQZWVyIExpc3QuIHNraXAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBNYXJrIHRoYXQgdGhlIExpdmUgUGVlciBMaXN0IFBhcmFtZXRlciBTZXQgd2FzIGZvdW5kLiAqLworICAgICAgICAgICAgICAgIGxpdmVfcGVlcl9saXN0X29rID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwYXJhbV9zZXRfdHlwZSA9PSBNS1BEVV9QQVJBTV9TRVRfUE9URU5USUFMX1BFRVJfTElTVCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2tpcCBQb3RlbnRpYWwgUGVlciBMaXN0IFBhcmFtZXRlciBTZXQuICovCisgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTWFyayB0aGF0IHRoZSBQb3RlbnRpYWwgUGVlciBMaXN0IFBhcmFtZXRlciBTZXQgd2FzIGZvdW5kLiAqLworICAgICAgICAgICAgcG90ZW50aWFsX3BlZXJfbGlzdF9vayA9IEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX01BQ1NFQ19TQUtfVVNFKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjaGVjayBvbmx5IExhdGVzdCBrZXkgdHggJiByeCBiaXRzIChiaXQgNCAmIDUpICovCisgICAgICAgICAgICBpZiAoKGtzX3ByaW9yaXR5ICYgMHgzMCkgPT0gMHgzMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYWtfdXNlX3BhcmFtX29rID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2tpcCB0aGUgTUtBIFNBSyBVc2UgUGFyYW1ldGVyIFNldC4gKi8KKyAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBib2R5X2xlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2tpcCBhbGwgb3RoZXIgUGFyYW1ldGVyIFNldCBkYXRhLiAqLworICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIGdvb2Qgc28gZmFyPyAqLworICAgIGlmICgocmMgPT0gQkNNX0VSUl9PSykgJiYKKyAgICAgICAgYmFzaWNfcGFyYW1fb2sgJiYKKyAgICAgICAgbGl2ZV9wZWVyX2xpc3Rfb2sgJiYKKyAgICAgICAgcG90ZW50aWFsX3BlZXJfbGlzdF9vayAmJgorICAgICAgICBzYWtfdXNlX3BhcmFtX29rKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiR290IGdvb2QgTUtBIFNBSyByZXNwb25zZVxuIik7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBSZXNwb25zZSBmcmFtZSBoYW5kbGVyIGZvciB0aGUgZmlyc3QgU0FLIGZyb20gdGhlIE9MVCAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9ta2FfaW5pdGlhbF9zYWtfc2VudChta2FfZXZlbnQgKm1zZywgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIHN3aXRjaCAobXNnLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBNS0FfTVNHX1RJTUVPVVQ6CisgICAgICAgICAgICBfbWthX2NsZWFyX2xpbmtfaW5mbyhsaW5rX3JlYyk7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUtBX01TR19EQVRBX0lORDoKKyAgICAgICAgICAgIHJjID0gX21rYV9pbml0aWFsX3Nha19zZW50X2RhdGFfaW5kKG1zZywgbGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfbWthX3Nha19kb25lX2RhdGFfaW5kKG1rYV9ldmVudCAqbXNnLCBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX1BBUlNFOworICAgIHVpbnQ4X3QgKmljdl9wdHI7CisgICAgdWludDhfdCBwYXJhbV9zZXRfdHlwZTsKKyAgICB1aW50MTZfdCBib2R5X2xlbjsKKyAgICB1aW50OF90IGtzX3ByaW9yaXR5OworICAgIHVpbnQxNl90IGJ5dGVzX3JlYWQ7CisKKyAgICAvKiBWYWxpZGF0ZSB0aGUgbXNnIHBvaW50ZXIuICovCisgICAgQlVHX09OKG1zZy0+bXNnID09IE5VTEwpOworICAgIEJVR19PTihtc2ctPmJ1ZiA9PSBOVUxMKTsKKworICAgIC8qIG1hcmsgSUNWIGZpZWxkIG9mZnNldCAqLworICAgIGljdl9wdHIgPSBtc2ctPmJ1Zi0+Y3VyciArIChtc2ctPm1zZy0+ZWFwb2xfbGVuZ3RoIC0gTUtBX0lDVl9MRU4pOworCisgICAgLyogVmFsaWRhdGUgdGhlIEludGVncml0eSBDaGVjayBWYWx1ZSBiZWZvcmUgY29udGludWluZyB0byBwcm9jZXNzIHRoZSBwYWNrZXQuICovCisgICAgcmMgPSBfbWthX2NvbXBhcmVfaWN2KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgbXNnLCBpY3ZfcHRyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSByYywgcmMpOworCisgICAgd2hpbGUgKGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKG1zZy0+YnVmKSA+IDApCisgICAgeworICAgICAgICAvKiBEb24ndCBwYXJzZSBwYXN0IHRoZSBJQ1YgUGFyYW1ldGVyIFNldCAqLworICAgICAgICBpZiAoYmNtb2x0X2J1Zl9zbmFwX2dldChtc2ctPmJ1ZikgPj0gaWN2X3B0cikKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWFkIHdoYXQgc2hvdWxkIGJlIHRoZSBCYXNpYyBQYXJhbWV0ZXIgU2V0IGhlYWRlci4gKi8KKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZwYXJhbV9zZXRfdHlwZSkgfHwKKyAgICAgICAgICAgICFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZrc19wcmlvcml0eSkgfHwKKyAgICAgICAgICAgICFiY21vbHRfYnVmX3JlYWRfdTE2X2JlKG1zZy0+YnVmLCAmYm9keV9sZW4pKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSBib2R5IGxlbmd0aCBpcyByZWFsbHkgMTItYml0cy4gKi8KKyAgICAgICAgYm9keV9sZW4gJj0gMHgwZmZmOworCisgICAgICAgIGlmIChwYXJhbV9zZXRfdHlwZSA9PSBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5lZWQgdG8gZmluZCBvdXQgd2hldGhlciBpdCBpcyBCYXNpYyBwYXJhbWV0ZXIgc2V0IE9SIExpdmUgUGVlciBMaXN0ICovCisgICAgICAgICAgICBpZiAoYm9keV9sZW4gPj0gTUtBX0JBU0lDX1BBUkFNX1NFVF9MRU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaW4gb3VyIGVudmlyb25tZW50LCBPTlUgY2FuIG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgbGl2ZSBwZWVyLiBTbywganVzdCBzZWVpbmcgcGFyYW0gc2V0IGJvZHkgbGVuCisgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiAqLworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmtfbW47CisgICAgICAgICAgICAgICAgdWludDhfdCBzY2lbTUtBX1NDSV9MRU5dOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWlbTUtBX01JX0xFTl07CisKKyAgICAgICAgICAgICAgICByYyA9IF9ta2FfcGFyc2VfYmFzaWNfcGFyYW1fc2V0KGxpbmtfcmVjLCBtc2ctPmJ1ZiwgJmJ5dGVzX3JlYWQsIGJvZHlfbGVuLCBzY2ksIG1pLCAmbGlua19tbik7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCBPTlUgU0NJIGlzIHdoYXQncyBleHBlY3RlZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAobWVtY21wKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b251X3NjaSwgc2NpLCBNS0FfU0NJX0xFTikgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFZlcmlmeSB0aGF0IE9OVSBNSSBpcyB3aGF0J3MgZXhwZWN0ZWQuICovCisgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbWVtZWJlcl9pZCwgbWksIE1LQV9NSV9MRU4pICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0gPCBsaW5rX21uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY29ycmVjdCBNTiEgKi8KKyAgICAgICAgICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0gPSBsaW5rX21uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBMaXZlIFBlZXIgTGlzdC4gc2tpcCAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBib2R5X2xlbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwYXJhbV9zZXRfdHlwZSA9PSBNS1BEVV9QQVJBTV9TRVRfTUFDU0VDX1NBS19VU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGxscG47CisKKyAgICAgICAgICAgIC8qIFNraXAgdG8gdGhlIExMUE4uICovCisgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgTUtBX01JX0xFTiArIE1LQV9LTl9MRU4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcmVhZCBMYXRlc3QgTG93ZXN0IEFjY2VwdGFibGUgUE4gKi8KKyAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMl9iZShtc2ctPmJ1ZiwgJmxscG4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxscG4gPiBNS0FfTUFYX0FDQ0VQVEFCTEVfUE4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU2V0IGZsYWcgdG8gaW5kaWNhdGUgU0FLIHJlZnJlc2ggaXMgbmVlZGVkLiAqLworICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrX3JlZnJlc2hfbmVlZGVkID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2hlY2sgb25seSBMYXRlc3Qga2V5IHR4ICYgcnggYml0cyAoYml0IDQgJiA1KSAqLworICAgICAgICAgICAgaWYgKChrc19wcmlvcml0eSAmIDB4MzApICE9IDB4MzApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogV3JvbmcgTEsgRmxhZyAqLyAvKiBUT0RPOiB3aHkgaXNuJ3QgdGhpcyBhbiBlcnJvcj8gKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogVGhlIE1JLCBLTiwgYW5kIExMUE4gd2VyZSByZWFkLiAqLworICAgICAgICAgICAgYnl0ZXNfcmVhZCA9IGJvZHlfbGVuIC0gKE1LQV9NSV9MRU4gKyBNS0FfS05fTEVOICsgc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgICAgICAgICAgIC8qIFNraXAgdGhlIHJlc3QgKi8KKyAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBieXRlc19yZWFkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTa2lwIGFsbCBvdGhlciBQYXJhbWV0ZXIgU2V0IGRhdGEuICovCisgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlZnJlc2ggcmV0cnkgY291bnQuIFRoaXMgaXMgYSBDcml0aWNhbCBjb3VudGVyICovCisgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5yZXRyeV9jbnQgPSAwOworCisgICAgcmV0dXJuIHJjOworfQorCisvKiBNS0EgZnJhbWUgaGFuZGxlciBmb3Igc3RhYmxlIHN0YXRlICovCitzdGF0aWMgYmNtb3NfZXJybm8gX21rYV9zYWtfZG9uZShta2FfZXZlbnQgKm1zZywgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIHN3aXRjaCAobXNnLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBNS0FfTVNHX1RJTUVPVVQ6CisgICAgICAgICAgICAvKiBzZW5kIGtlZXBhbGl2ZSBmcmFtZSBhdCBldmVyeSAyIHNlY29uZHMgKi8KKyAgICAgICAgICAgICh2b2lkKV9ta2Ffc2VuZF9rZWVwYWxpdmVfZnJhbWUobGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNS0FfTVNHX0RBVEFfSU5EOgorICAgICAgICAgICAgcmMgPSBfbWthX3Nha19kb25lX2RhdGFfaW5kKG1zZywgbGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFZhbGlkYXRlIHRoZSBNS0EgcGFja2V0LiAqLworc3RhdGljIGJjbW9zX2Jvb2wgX21rYV92YWxpZGF0ZV9wa3QoYmNtb2x0X3U4X2xpc3RfdTE2IG1rYV9tc2csIGVhcG9sX21zZ19oZHIgKmVhcG9sKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGVhcG9sID09IE5VTEwpOworCisgICAgLyogVGhpcyBoYWQgYmV0dGVyIGJlIGFuIE1LQSBwYWNrZXQuICovCisgICAgaWYgKGVhcG9sLT5lYXBvbF9wYWNrZXRfdHlwZSAhPSBFQVBPTF9UWVBFX01LQSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBUaGUgRUFQT0wgbGVuZ3RoIHBsdXMgdGhlIHNpemUgb2YgdGhlIEVhcG9sTXNnSGRyIG11c3QgZXF1YWwgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0LiAqLworICAgIGlmIChta2FfbXNnLmxlbiAhPSAoZWFwb2wtPmVhcG9sX2xlbmd0aCArIEVBUE9MX01TR19IRFJfU0laRSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgLyogVGhlIEVBUE9MIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bSBzdXBwb3J0ZWQgbGVuZ3RoLCBFdGhlcm5ldCArIEVBUE9MIGhlYWRlciBsZW5ndGguICovCisgICAgaWYgKGVhcG9sLT5lYXBvbF9sZW5ndGggPCBNS0FfUERVX01JTl9MRU5HVEgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgLyogVGhlIEVBUE9MIGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZm91ci4gKi8KKyAgICBpZiAoKGVhcG9sLT5lYXBvbF9sZW5ndGggJSA0KSAhPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKiBXcmFwcGVyIGludG8gdGhlIE1LQSBjb2RlIHRoYXQgc2VuZHMgYW4gU0FLIENvbmZpcm0gcmVzcG9uc2UgdG8gdGhlIE9OVS4gKi8KK2JjbW9zX2Vycm5vIG1rYV9zZW5kX3Nha19jb25maXJtKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworCisgICAgLyogcHJvY2VlZCB0byBuZXh0IHN0YXRlICovCisgICAgaWYgKF9ta2Ffc2VuZF9zYWtfY29uZmlybV9mcmFtZShsaW5rX3JlYykpCisgICAgeworICAgICAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIGdvb2Qgc28gZmFyLiBVcGRhdGUgQU4gYW5kIEtleSBOdW1iZXIgKi8KKyAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZXlfbnVtYmVyICs9IDE7CisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+YXNzb2NpYXRpb25fbnVtYmVyICs9IDE7CisgICAgICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlciA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgYXNzb2NpYXRpb24gbnVtYmVyIGlzIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBPTFQgU0NJIHRvIGlkZW50aWZ5IGEgc2VjdXJlIGFzc29jaWF0aW9uIGJldHdlZW4gT0xUIGFuZAorICAgICAgICAgICAgICAgT05VLiBUaGUgQU4gdmFsdWUgc3RhcnRzIGF0IHplcm8gYW5kIGN5Y2xlcyB0aHJvdWdoIHZhbHVlcyAwIC0gMyBhcyBhIG5ldyBTQUsgaXMgZGlzdHJpYnV0ZWQgdG8gdGhlIE9OVS4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlciA9IDA7IC8qIEFOID0gMCB+IDMgKi8KKyAgICAgICAgfQorCisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c3RhdGUgPSBNS0FfU1RBVEVfTUtBX0RPTkU7CisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmVmcmVzaF9jbnQgKz0gMTsKKyAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5yZXRyeV9jbnQgPSAwOworCisgICAgICAgIC8qIHN0YXJ0IGtlZXBhbGl2ZSB0aW1lciAoMiBzZWNvbmQpICovCisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT50eF90aW1lciwgTUtBX0hFTExPX1RJTUUgKiAxMDAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFdyYXBwZXIgaW50byB0aGUgTUtBIGNvZGUgdGhhdCBoYW5kbGVzIE1LQSBQRFVzIGZyb20gdGhlIE9OVS4gKi8KK2JjbW9zX2Vycm5vIG1rYV9wcm9jZXNzX3BhY2tldChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF91OF9saXN0X3UxNiByeF9mcmFtZSwgbWthX29wX3R5cGUgb3BfdHlwZSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICBta2FfZXZlbnQgbWthX21zZzsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICBlYXBvbF9tc2dfaGRyIGVhcG9sOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKHJ4X2ZyYW1lLnZhbCA9PSBOVUxMKTsKKyAgICBCVUdfT04oKG9wX3R5cGUgPD0gTUtBX09QX19JTlZBTElEKSB8fCAob3BfdHlwZSA+IE1LQV9PUF9LRUVQX0FMSVZFKSk7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgcnhfZnJhbWUubGVuLCByeF9mcmFtZS52YWwsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICBpZiAoIWRwb2Vfc2VjX2VhcG9sX3VucGFjaygmYnVmLCAmZWFwb2wpKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiZmFpbGVkIHRvIHVucGFjayBFQVBPTCBoZWFkZXIhXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgdGhlIE1LQSBwYWNrZXQgbGVuZ3RoIGJlZm9yZSBwcm9jZXNzaW5nLiAqLworICAgIGlmICghX21rYV92YWxpZGF0ZV9wa3QocnhfZnJhbWUsICZlYXBvbCkpCisgICAgeworICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJJbnZhbGlkIE1LQSBwYWNrZXQhXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgLyogUGFzcyB0aGUgcGFja2V0IHRvIHRoZSBoYW5kbGVyLiAqLworICAgIG1rYV9tc2cudHlwZSA9IE1LQV9NU0dfREFUQV9JTkQ7CisgICAgbWthX21zZy5tc2cgPSAmZWFwb2w7CisgICAgbWthX21zZy5idWYgPSAmYnVmOworCisgICAgLyogUHJvY2VzcyB0aGUgTUtBIHBhY2tldC4gKi8KKyAgICBzd2l0Y2ggKG9wX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIE1LQV9PUF9TVEFSVF9SU1A6CisgICAgICAgICAgICByYyA9IF9ta2Ffd2FpdGluZ19pbml0aWFsX3Jlc3BvbnNlKCZta2FfbXNnLCBsaW5rX3JlYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS0FfT1BfU0FLX1JTUDoKKyAgICAgICAgICAgIHJjID0gX21rYV9pbml0aWFsX3Nha19zZW50KCZta2FfbXNnLCBsaW5rX3JlYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS0FfT1BfS0VFUF9BTElWRToKKyAgICAgICAgICAgIHJjID0gX21rYV9zYWtfZG9uZSgmbWthX21zZywgbGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFdyYXBwZXIgaW50byB0aGUgTUtBIGNvZGUgdGhhdCBoYW5kbGVzIE1LQSB0aW1lb3V0cy4gKi8KK2JjbW9zX2Vycm5vIG1rYV9wcm9jZXNzX3RpbWVvdXQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBta2Ffb3BfdHlwZSBvcF90eXBlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9USU1FT1VUOworICAgIG1rYV9ldmVudCBta2FfbXNnOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKChvcF90eXBlIDwgTUtBX09QX1NUQVJUX1RJTUVPVVQpIHx8IChvcF90eXBlID49IE1LQV9PUF9fQ09VTlQpKTsKKworICAgIC8qIFBhc3MgdGhlIHBhY2tldCB0byB0aGUgaGFuZGxlci4gKi8KKyAgICBta2FfbXNnLnR5cGUgPSBNS0FfTVNHX1RJTUVPVVQ7CisKKyAgICAvKiBQcm9jZXNzIHRoZSBNS0EgcGFja2V0LiAqLworICAgIHN3aXRjaCAob3BfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgTUtBX09QX1NUQVJUX1RJTUVPVVQ6CisgICAgICAgICAgICByYyA9IF9ta2Ffd2FpdGluZ19pbml0aWFsX3Jlc3BvbnNlKCZta2FfbXNnLCBsaW5rX3JlYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS0FfT1BfU0FLX1RJTUVPVVQ6CisgICAgICAgICAgICByYyAgPSBfbWthX2luaXRpYWxfc2FrX3NlbnQoJm1rYV9tc2csIGxpbmtfcmVjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LQV9PUF9TRU5EX0tFRVBfQUxJVkU6CisgICAgICAgICAgICByYyA9IF9ta2Ffc2FrX2RvbmUoJm1rYV9tc2csIGxpbmtfcmVjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL21rYS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9ta2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTk1ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9ta2EuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmICFkZWZpbmVkKE1LQV9IKQorI2RlZmluZSBNS0FfSAorCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisKKyNkZWZpbmUgTUtBX0xJRkVfVElNRSAgICAgICAgICAgICAgIDYwMDAgLyogTXMsIDYgc2Vjb25kcyAqLworCisjZGVmaW5lIE1LQV9TQ0lfTEVOICAgICAgICAgICAgICAgICA4IC8qIGNvbW1vbiBTQ0kgc2l6ZSAqLworI2RlZmluZSBNS0FfTUlfTEVOICAgICAgICAgICAgICAgICAgMTIgLyogTWVtYmVyIElkZW50aWZpZXIgKi8KKworLyogS0VLICovCisjZGVmaW5lIE1LQV9LRUtfTEVOICAgICAgICAgICAgICAgICAxMjggLyogYml0IGxlbmd0aC4gMTYgYnl0ZXMgKi8KKworLyogU0FLICovCisjZGVmaW5lIE1LQV9TQUtfTEVOICAgICAgICAgICAgICAgICAxNgorCisvKiBJQ0sgKi8KKyNkZWZpbmUgTUtBX0lDS19MRU4gICAgICAgICAgICAgICAgIDEyOCAvKiBiaXQgbGVuZ3RoLiAxNiBieXRlcyAqLworCisvKiBDS04gKi8KKyNkZWZpbmUgTUtBX0NLTl9MRU4gICAgICAgICAgICAgICAgIDEyOCAvKiBiaXQgbGVuZ3RoLiAxNiBieXRlcyAqLworCisvKiBDQUsgKi8KKyNkZWZpbmUgTUtBX0NBS19MRU4gICAgICAgICAgICAgICAgIDEyOCAvKiBiaXQgbGVuZ3RoLiAxNiBieXRlcyAqLworCisvKiBmb3IgTUFDU2VjIEtleSBBZ3JlZW1lbnQgKi8KK3R5cGVkZWYgZW51bQoreworICAgIE1LQV9TVEFURV9JTklUSUFMICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBNS0FfU1RBVEVfV0FJVElOR19JTklUSUFMX1BFRVJfUkVTUCA9IDEsCisgICAgTUtBX1NUQVRFX1NBS19TRU5UICAgICAgICAgICAgICAgICAgPSAyLAorICAgIE1LQV9TVEFURV9NS0FfRE9ORSAgICAgICAgICAgICAgICAgID0gMywKKworICAgIE1LQV9TVEFURV9fQ09VTlQKK30gbWthX3N0YXRlOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBNS0FfUEVFUl9TVEFURV9OT05FID0gMCwKKyAgICBNS0FfUEVFUl9TVEFURV9MSVZFID0gMSwKKyAgICBNS0FfUEVFUl9TVEFURV9QT1RFTlRJQUwgPSAyLAorfSBta2FfcGVlcl9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICBvbnVfc2NpW01LQV9TQ0lfTEVOXTsgLyoqPCBPTlUncyBTQ0kgKi8KKyAgICB1aW50OF90ICBvbHRfbWVtYmVyX2lkW01LQV9NSV9MRU5dOyAvKio8IE9MVCBNSSAqLworICAgIHVpbnQzMl90IGN1cnJfbXNnX251bTsgLyoqPCBDdXJyZW50IE9MVCBNTiAqLworICAgIHVpbnQ4X3QgIGxpbmtfbWVtZWJlcl9pZFtNS0FfTUlfTEVOXTsgLyoqPCBMaW5rIE1JICovCisgICAgdWludDMyX3QgbGlua19tc2dfbnVtOyAvKio8IEN1cnJlbnQgTGluayBNTiAqLworICAgIHVpbnQ4X3QgIGNha1tNS0FfQ0FLX0xFTi84XTsgLyoqPCBEZXJpdmVkIENBSyAqLworICAgIHVpbnQ4X3QgIGNrbltNS0FfQ0tOX0xFTi84XTsgLyoqPCBEZXJpdmVkIENLTiAqLworICAgIHVpbnQ4X3QgIHNha1tNS0FfU0FLX0xFTl07IC8qKjwgRGVyaXZlZCBTQUsgKGEuay5hIFRFSykgKi8KKyAgICB1aW50OF90ICBuZXdfc2FrW01LQV9TQUtfTEVOXTsgLyoqPCBOZXcgZGVyaXZlZCBTQUsgZm9yIGtleSByZWZyZXNoICovCisgICAgdWludDhfdCAga2VrW01LQV9LRUtfTEVOLzhdOyAvKio8IERlcml2ZWQgS0VLICovCisgICAgdWludDhfdCAgaWNrW01LQV9JQ0tfTEVOLzhdOyAvKio8IERlcml2ZWQgSUNLICovCisgICAgdWludDMyX3Qga2V5X251bWJlcjsgLyoqPCBDdXJyZW50IEtOICovCisgICAgdWludDhfdCAgYXNzb2NpYXRpb25fbnVtYmVyOyAvKio8IEFOICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbGVzc2VyX21hYzsgLyoqPCBMb3dlc3QgTUFDIGFkZHJlc3Mgb2YgTUtBIHBlZXJzICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZ3JlYXRlcl9tYWM7IC8qKjwgR3JlYXRlc3QgTUFDIGFkZHJlc3Mgb2YgTUtBIHBlZXJzICovCisgICAgbWthX3N0YXRlIHN0YXRlOyAvKio8IFN0YXRlIG9mIE1LQSBwcm9wZXIgU00gKi8KKyAgICBta2FfcGVlcl9zdGF0ZSBwZWVyX3N0YXRlOyAvKio8IFN0YXRlIG9mIE1LQSBwZWVyICovCisgICAgdWludDhfdCAgcmV0cnlfY250OyAvKio8IE1LQSBtZXNzYWdlIHJldHJ5IGNvdW50ICovCisgICAgdWludDhfdCAgcmVmcmVzaF9jbnQ7IC8qKjwgSW1wb3J0YW50IGZvciBidWlsZGluZyBTQUsgVXNlIFBhcmFtIHNldCAqLworICAgIGJjbW9zX2Jvb2wgc2FrX3JlZnJlc2hfbmVlZGVkOyAvKio8IFNBSyByZWZyZXNoIG5lZWRlZCBmbGFnICovCit9IG1rYV9saW5rX2luZm87CisKKy8qIFRoZSB0eXBlIG9mIE1LQSBvcGVyYXRpb24gdG8gcHJvY2Vzcy4gKi8KK3R5cGVkZWYgZW51bSBta2Ffb3BfdHlwZQoreworICAgIE1LQV9PUF9fSU5WQUxJRCA9IC0xLAorCisgICAgLyogUGFja2V0IG9wZXJhdGlvbnMuICovCisgICAgTUtBX09QX1NUQVJUX1JTUCwKKyAgICBNS0FfT1BfU0FLX1JTUCwKKyAgICBNS0FfT1BfS0VFUF9BTElWRSwKKworICAgIC8qIFRpbWVvdXQgb3BlcmF0aW9ucy4gKi8KKyAgICBNS0FfT1BfU1RBUlRfVElNRU9VVCwKKyAgICBNS0FfT1BfU0FLX1RJTUVPVVQsCisgICAgTUtBX09QX1NFTkRfS0VFUF9BTElWRSwKKworICAgIE1LQV9PUF9fQ09VTlQKK30gbWthX29wX3R5cGU7CisKK3N0cnVjdCBkcG9lX3NlY19saW5rX3JlYzsKKworYmNtb3NfZXJybm8gbWthX3N0YXJ0KHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluayk7CisKK3ZvaWQgbWthX2dlbmVyYXRlX3NhayhzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmssIGJjbW9zX2Jvb2wgaW5pdGlhbCk7CisKK2JjbW9zX2Vycm5vIG1rYV9zZW5kX3NhayhzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmssIHVpbnQ4X3QgKnNhayk7CisKK2JjbW9zX2Vycm5vIG1rYV9zZW5kX3Nha19jb25maXJtKHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluayk7CisKK2JjbW9zX2Vycm5vIG1rYV9wcm9jZXNzX3BhY2tldChzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmssIGJjbW9sdF91OF9saXN0X3UxNiByeF9mcmFtZSwgbWthX29wX3R5cGUgb3BfdHlwZSk7CisKK2JjbW9zX2Vycm5vIG1rYV9wcm9jZXNzX3RpbWVvdXQoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rLCBta2Ffb3BfdHlwZSBvcF90eXBlKTsKKworI2VuZGlmIC8qIE1LQV9IICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNGMzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9NYWtlZmlsZQpAQCAtMCwwICsxLDMzIEBACisjIEVQT04gT0FNIE5lZ290aWF0aW9uIHVzZXIgYXBwbGljYXRpb24KKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisKKwlNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfZW9uCisJTU9EX1RZUEUgPSBsaWIKKwlNT0RfREVQUyA9IGhvc3RfYXBpIGJjbV91c2VyX2FwcGxfZXBvbl9vYW0gY29tbW9uX2Vwb25fb2FtCisKKwlpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKwkJTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorCWVuZGlmCisKKwlzcmNzID0gYmNtb2x0X2Vvbi5jIG9hbV9zZXRzL29hbV9jb21tb24uYworCisJRU5BQkxFX0RQT0VfT0FNID89IHkKKwlpZmVxICgiJChFTkFCTEVfRFBPRV9PQU0pIiwgInkiKQorCQlFWFRSQV9ERUZJTkVTICs9IC1ERU9OX09BTV9TRVRfRFBPRV9TVVBQT1JURUQKKwkJc3JjcyArPSBvYW1fc2V0cy9kcG9lL2Rwb2UuYworCWVuZGlmICMgRU5BQkxFX0RQT0VfT0FNCisKKwlFTkFCTEVfQlJDTV9PQU0gPz0geQorCWlmZXEgKCIkKEVOQUJMRV9CUkNNX09BTSkiLCAieSIpCisJCUVYVFJBX0RFRklORVMgKz0gLURFT05fT0FNX1NFVF9CUkNNX1NVUFBPUlRFRAorCQlzcmNzICs9IG9hbV9zZXRzL2JyY20vYnJjbS5jCisJZW5kaWYgIyBFTkFCTEVfQlJDTV9PQU0KKworCUVOQUJMRV9DVENfT0FNID89IHkKKwlpZmVxICgiJChFTkFCTEVfQ1RDX09BTSkiLCAieSIpCisJCUVYVFJBX0RFRklORVMgKz0gLURFT05fT0FNX1NFVF9DVENfU1VQUE9SVEVECisJCXNyY3MgKz0gb2FtX3NldHMvY3RjL2N0Yy5jCisJZW5kaWYgIyBFTkFCTEVfQ1RDX09BTQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTMxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uLmMKQEAgLTAsMCArMSw3ODMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworLyogIFRoaXMgZmlsZSBpcyB0aGUgbWFzdGVyIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBFUE9OIE9BTSBuZWdvdGlhdGlvbiB0YXNrIC0KKyAgICBJdCBhY2NlcHRzIGV2ZW50cyBmcm9tIHRoZSBlbWJlZGRlZCBzb2Z0d2FyZSBhbmQgdGhlIGhvc3QgaW50ZXJmYWNlLCBzdXBwb3J0ZWQgZXZlbnRzIGFyZQorICAgIDEuICBTdGFydCBPQU0gbmVnb3RpYXRvbiAoZnJvbSBob3N0IGludGVyZmFjZSkKKyAgICAyLiAgU3RvcCBPQU0gbmVnb3RpYXRpb24gKGZyb20gaG9zdCBpbnRlcmZhY2UpCisgICAgMy4gIFJYIEZyYW1lIChmcm9tIE9OVSB2aWEgZW1iZWRkZWQgZmlybXdhcmUpCisgICAgNC4gIFRpbWVvdXQKKworICAgIEl0IGRpc3BhdGNoZXMgdGhlc2UgZXZlbnRzIHRvIHRoZSBPQU0gc3BlY2lmaWMgc3RhdGUgbWFjaGluZS4gQ3VycmVudGx5IHdlIHN1cHBvcnQKKyAgICBPQU0gbmVnb3RpYXRpb24gZm9yIEJSQ00sIERQb0UsIGFuZCBDVEMgT0FNIHN0YW5kYXJkcy4KKyovCisKKyNpbmNsdWRlICJiY21vbHRfZW9uX3ByaXZhdGUuaCIKKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZ19wYWNrLmg+CisjaW5jbHVkZSAib2FtX3NldHMvb2FtX2NvbW1vbi5oIgorCisjZGVmaW5lIEVPTl9UQVNLX01TR19RX1NJWkUgNjQKKwordHlwZWRlZiBlbnVtCit7CisgICAgRU9OX0VWRU5UX1RZUEVfRlJBTUVfUlgsCisgICAgRU9OX0VWRU5UX1RZUEVfT0FNX05FR19TVEFSVCwKKyAgICBFT05fRVZFTlRfVFlQRV9PQU1fTkVHX1NUT1AsCisgICAgRU9OX0VWRU5UX1RZUEVfT0FNX1RJTUVSX0VYUElSRSwKKworICAgIEVPTl9FVkVOVF9UWVBFX0NPVU5UCit9IGVvbl9ldmVudF90eXBlOworCit0eXBlZGVmIHVuaW9uCit7CisgICAgZW9uX2ZyYW1lX2RhdGEgZnJhbWVfcng7Cit9IGVvbl9ldmVudF9kYXRhOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGVvbl9ldmVudF90eXBlIHR5cGU7CisgICAgZW9uX2xpbmtfc3RhdGUgKmxpbms7CisgICAgZW9uX2V2ZW50X2RhdGEgZGF0YTsKK30gZW9uX2V2ZW50OworCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqZW9uX2V2ZW50X2hhbmRsZXIpKGNvbnN0IGVvbl9ldmVudCogaW5fZXZlbnQpOworCitzdGF0aWMgY29uc3QgY2hhciogX2V2bmFtZVtFT05fRVZFTlRfVFlQRV9DT1VOVF0gPQoreworICAgIFtFT05fRVZFTlRfVFlQRV9GUkFNRV9SWF0gPSAiZW9uX2V2ZW50X3R5cGVfZnJhbWVfcngiLAorICAgIFtFT05fRVZFTlRfVFlQRV9PQU1fTkVHX1NUQVJUXSA9ICJlb25fZXZlbnRfdHlwZV9vYW1fbmVnX3N0YXJ0IiwKKyAgICBbRU9OX0VWRU5UX1RZUEVfT0FNX05FR19TVE9QXSA9ICJlb25fZXZlbnRfdHlwZV9vYW1fbmVnX3N0b3AiLAorICAgIFtFT05fRVZFTlRfVFlQRV9PQU1fVElNRVJfRVhQSVJFXSA9ICJlb25fZXZlbnRfdHlwZV9vYW1fdGltZXJfZXhwaXJlIgorfTsKKworc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBlb25fb2FtX3NldF9pZF90YWJsZVtFT05fT0FNX1NFVF9JRF9DT1VOVCsxXSA9Cit7CisgICAgeyAubmFtZSA9ICJkcG9lIiwgLnZhbCA9IEVPTl9PQU1fU0VUX0lEX0RQT0UgfSwKKyAgICB7IC5uYW1lID0gImJyY20iLCAudmFsID0gRU9OX09BTV9TRVRfSURfQlJDTSB9LAorICAgIHsgLm5hbWUgPSAiY3RjIiwgLnZhbCA9IEVPTl9PQU1fU0VUX0lEX0NUQyB9LAorICAgIEJDTUNMSV9FTlVNX0xBU1QKK307CisKK2Vvbl9nbG9iYWxfc3RhdGUgZW9uX3N0YXRlW0JDTVRSX01BWF9PTFRTXSA9IHt9OworCisjZGVmaW5lIEhFQVJUQkVBVF9TRU5EX1BFUklPRCAxCisjZGVmaW5lIEhFQVJUQkVBVF9TRU5EX09GRlNFVCAxNQorI2RlZmluZSBIRUFSVEJFQVRfUkVDRUlWRV9USU1FT1VUIDUKKyNkZWZpbmUgT0FNX1RJTUVPVVRfVVMgKEhFQVJUQkVBVF9SRUNFSVZFX1RJTUVPVVQgKiAxMDAwICogMTAwMCkKKworc3RhdGljIGJjbW9zX2Jvb2wgIGVwb25fb2FtX25lZ19ydW5uaW5nID0gQkNNT1NfRkFMU0U7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9saW5rX2tleV9jbXAoY29uc3QgZW9uX2xpbmtfc3RhdGUqIGEsIGNvbnN0IGVvbl9saW5rX3N0YXRlKiBiKQoreworICAgIHJldHVybiBtZW1jbXAoJmEtPmxpbmtfa2V5LmxpbmssICZiLT5saW5rX2tleS5saW5rLCBzaXplb2YoYS0+bGlua19rZXkubGluaykpOworfQorCitSQl9HRU5FUkFURV9JTkxJTkUobGlua19zdGF0ZV9tYXAsIGVvbl9saW5rX3N0YXRlLCByYl9lbnRyeSwgX2xpbmtfa2V5X2NtcCk7CisKKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25faW5pdF90YXNrKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2tfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSBlb25fc3RhdGVbZGV2aWNlXS50YXNrX25hbWUsCisgICAgICAgIC5wcmlvcml0eSAgICAgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9FT04sCisgICAgICAgIC5jb3JlICAgICAgICAgPSBCQ01PU19DUFVfQ09SRV9BTlksIC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgICAgICAuaW5pdF9oYW5kbGVyID0gTlVMTAorICAgIH07CisgICAgc25wcmludGYoZW9uX3N0YXRlW2RldmljZV0udGFza19uYW1lLCBzaXplb2YoZW9uX3N0YXRlW2RldmljZV0udGFza19uYW1lKSwgInVzZXJfYXBwbF9lb24ldSIsIGRldmljZSk7CisgICAgYmNtb3NfZXJybm8gcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmZW9uX3N0YXRlW2RldmljZV0udGFzaywgJnRhc2tfcGFyYW1zKTsKKworICAgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9pbml0X21vZHVsZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnFwYXJtID0geyAubmFtZSA9IGVvbl9zdGF0ZVtkZXZpY2VdLm1zZ19xdWV1ZV9uYW1lLCAuc2l6ZSA9IEVPTl9UQVNLX01TR19RX1NJWkUgfSwKKyAgICAgICAgLmluaXQgPSBOVUxMCisgICAgfTsKKyAgICBzbnByaW50Zihlb25fc3RhdGVbZGV2aWNlXS5tc2dfcXVldWVfbmFtZSwgc2l6ZW9mKGVvbl9zdGF0ZVtkZXZpY2VdLm1zZ19xdWV1ZV9uYW1lKSwgImVvbl9tc2dfcSV1IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gYmNtb3NfbW9kdWxlX2NyZWF0ZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VPTiArIGRldmljZSwgJmVvbl9zdGF0ZVtkZXZpY2VdLnRhc2ssICZtb2R1bGVfcGFyYW1zKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fc2VuZF9vc19tc2coYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfbXNnX2lkIHR5cGUsIGVvbl90YXNrX21zZ19kYXRhICpkYXRhKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGVvbl90YXNrX21zZyAqbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgRU9OX0xPRyhFUlJPUiwgZGV2aWNlLCAiT1MgTWVzc2FnZSBjYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgbXNnLT5vc19tc2cuaW5zdGFuY2UgPSBkZXZpY2U7CisgICAgbXNnLT5vc19tc2cudHlwZSA9IHR5cGU7CisgICAgbXNnLT5kYXRhID0gKmRhdGE7CisgICAgcmMgPSBiY21vc19tc2dfZGlzcGF0Y2goJm1zZy0+b3NfbXNnLCBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgRU9OX0xPRyhFUlJPUiwgZGV2aWNlLCAiT1MgTWVzc2FnZSBzZW5kIGZhaWxlZCAoJXMpXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX2Vvbl9kZXN0cm95X2xpbmtfc3RhdGUoZW9uX2xpbmtfc3RhdGUqIGxpbmtfc3RhdGUpCit7CisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJEZXN0cm95aW5nIGxpbmtcbiIpOworICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJmxpbmtfc3RhdGUtPm9hbV90aW1lcik7CisgICAgUkJfUkVNT1ZFKGxpbmtfc3RhdGVfbWFwLCAmZW9uX3N0YXRlW2xpbmtfc3RhdGUtPmxpbmtfa2V5LmRldmljZV9pZF0ubGlua19zdGF0ZV9tYXAsIGxpbmtfc3RhdGUpOworICAgIGlmIChOVUxMICE9IGxpbmtfc3RhdGUtPnR4LnBheWxvYWQpCisgICAgeworICAgICAgICBiY21vc19mcmVlKGxpbmtfc3RhdGUtPnR4LnBheWxvYWQpOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBsaW5rX3N0YXRlLT5yeC5wYXlsb2FkKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShsaW5rX3N0YXRlLT5yeC5wYXlsb2FkKTsKKyAgICB9CisgICAgaWYgKE5VTEwgIT0gbGlua19zdGF0ZS0+b3JnX3NwZWNfc3RhdGUpCisgICAgeworICAgICAgICBiY21vc19mcmVlKGxpbmtfc3RhdGUtPm9yZ19zcGVjX3N0YXRlKTsKKyAgICB9CisgICAgYmNtb3NfZnJlZShsaW5rX3N0YXRlKTsKK30KKworc3RhdGljIGVvbl9saW5rX3N0YXRlKiBfZW9uX2ZpbmRfbGlua19zdGF0ZShjb25zdCBlb25fbGlua19rZXkqIGxpbmtfa2V5KQoreworICAgIGVvbl9saW5rX3N0YXRlIHF1ZXJ5X2tleSA9IHsgLmxpbmtfa2V5LmxpbmsgPSBsaW5rX2tleS0+bGluayB9OworCisgICAgcmV0dXJuIFJCX0ZJTkQobGlua19zdGF0ZV9tYXAsICZlb25fc3RhdGVbbGlua19rZXktPmRldmljZV9pZF0ubGlua19zdGF0ZV9tYXAsICZxdWVyeV9rZXkpOworfQorCitzdGF0aWMgdm9pZCBfZW9uX2RlZmF1bHRfY2FsbGJhY2tfZm4odm9pZCAqY29udGV4dCwgY29uc3QgZW9uX2xpbmtfa2V5KiBsaW5rX2tleSwgYmNtb3NfZXJybm8gcmVzdWx0KQoreworICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlID0gX2Vvbl9maW5kX2xpbmtfc3RhdGUobGlua19rZXkpOworCisgICAgRU9OX0xJTktfTE9HKAorICAgICAgICBJTkZPLCBsaW5rX2tleSwgIk9BTSBuZWdvdGlhdGlvbiBjb21wbGV0ZWQgKCVzKSwgZmxhZ3MgJTA0eFxuIiwgYmNtb3Nfc3RyZXJyb3IocmVzdWx0KSwgbGlua19zdGF0ZS0+b2FtX3N0YXRlKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25faW5qZWN0X2ZyYW1lKGVvbl9saW5rX2tleSogbGlua19rZXksIHVpbnQxNl90IHBheWxvYWRfbGVuZ3RoLCB1aW50OF90ICpwYXlsb2FkX2FkZHIpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWUgaW5qZWN0X2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGVwb25fbGlua19rZXkgPSBsaW5rX2tleS0+bGluazsKKyAgICBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgZnJhbWUgPQorICAgICAgICB7CisgICAgICAgICAgICAuZnJhbWVfb2N0ZXRzID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubGVuID0gcGF5bG9hZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgLnZhbCA9IHBheWxvYWRfYWRkcgorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJmluamVjdF9mcmFtZSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGVwb25fbGlua19rZXkpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmaW5qZWN0X2ZyYW1lLCBlcG9uX2xpbmssIGluamVjdF9mcmFtZSwgZnJhbWUsIGZyYW1lKTsKKyAgICByYyA9IGJjbW9sdF9wcm94eV9zZW5kKGxpbmtfa2V5LT5kZXZpY2VfaWQsICZpbmplY3RfZnJhbWUuaGRyKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEVPTl9MSU5LX0xPRyhFUlJPUiwgbGlua19rZXksICJpbmplY3Qgb3BlcmF0aW9uIGZhaWxlZCAoJXMpXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fY2xlYXJfcHJvdihlb25fbGlua19rZXkgKmxpbmtfa2V5KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSBsaW5rX2tleS0+bGluazsKKyAgICBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCBzdG9wX29wZXI7CisgICAgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIGhiX2NmZyA9IHt9OworICAgIGJjbW9sdF9lcG9uX2xpbmtfY2ZnIGxpbmtfY2ZnOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmc3RvcF9vcGVyLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCwga2V5KTsKKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQobGlua19rZXktPmRldmljZV9pZCwgJnN0b3Bfb3Blci5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaGJfY2ZnLnRyYW5zbWl0X2ZyYW1lLmxlbiA9IDA7CisgICAgaGJfY2ZnLnRyYW5zbWl0X2ZyYW1lLnZhbCA9IE5VTEw7CisgICAgaGJfY2ZnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMubGVuID0gMDsKKyAgICBoYl9jZmcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy52YWwgPSBOVUxMOworICAgIGhiX2NmZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuID0gMDsKKyAgICBoYl9jZmcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgaGJfY2ZnLnJlY2VpdmVfdGltZW91dCA9IDU7CisgICAgaGJfY2ZnLm1heGltdW1fcmVjZWl2ZV9zaXplID0gMDsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmbGlua19jZmcsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcsIGhiX2NmZyk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQobGlua19rZXktPmRldmljZV9pZCwgJmxpbmtfY2ZnLmhkcik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9zZXRfb2FtX2hlYXJ0YmVhdF9jb25maWcoY29uc3QgZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIG9hbV9oZWFydGJlYXRfY29uZmlnID0ge307CisKKyAgICBvYW1faGVhcnRiZWF0X2NvbmZpZy5yZWNlaXZlX3RpbWVvdXQgPSBIRUFSVEJFQVRfUkVDRUlWRV9USU1FT1VUOworICAgIG9hbV9oZWFydGJlYXRfY29uZmlnLm1heGltdW1fcmVjZWl2ZV9zaXplID0gbGlua19zdGF0ZS0+bWF4X3BkdV9zaXplOworCisgICAgLyogVGhlIEJDTTY4NjIwIFRYIGhlYXJ0YmVhdCBwcm92aXNpb25pbmcgZG9lcyBub3QgaW5jbHVkZSB0aGUgZmlyc3QgMTUgYnl0ZXMgLSBTQSwgREEsIEV0aGVyVHlwZSBvciBTdWJ0eXBlICovCisgICAgb2FtX2hlYXJ0YmVhdF9jb25maWcudHJhbnNtaXRfZnJhbWUudmFsID0gJmxpbmtfc3RhdGUtPnR4LnBheWxvYWRbSEVBUlRCRUFUX1NFTkRfT0ZGU0VUXTsKKyAgICBvYW1faGVhcnRiZWF0X2NvbmZpZy50cmFuc21pdF9mcmFtZS5sZW4gPSBsaW5rX3N0YXRlLT50eC5sZW5ndGggLSBIRUFSVEJFQVRfU0VORF9PRkZTRVQ7CisKKyAgICBvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLnZhbCA9IGxpbmtfc3RhdGUtPnJ4LnBheWxvYWQ7CisgICAgb2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy5sZW4gPSBsaW5rX3N0YXRlLT5yeC5sZW5ndGg7CisKKyAgICAvKiBmb3J3YXJkIE9BTSBmcmFtZXMgd2l0aCBhbnkgZGlmZmVyZW5jZXMgdG8gdGhlIGhvc3QgKi8KKyAgICBvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMudmFsID0gYmNtb3NfY2FsbG9jKGxpbmtfc3RhdGUtPnJ4Lmxlbmd0aCk7CisgICAgaWYgKE5VTEwgIT0gb2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCkKKyAgICB7CisgICAgICAgIG1lbXNldChvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMudmFsLCAweEZGLCBsaW5rX3N0YXRlLT5yeC5sZW5ndGgpOworICAgICAgICBvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuID0gbGlua19zdGF0ZS0+cngubGVuZ3RoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBsaW5rX2NmZzsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIGxpbmtfc3RhdGUtPmxpbmtfa2V5LmxpbmspOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIG9hbV9oZWFydGJlYXRfY29uZmlnLCBvYW1faGVhcnRiZWF0X2NvbmZpZyk7CisgICAgcmMgPSBiY21vbHRfY2ZnX3NldChsaW5rX3N0YXRlLT5saW5rX2tleS5kZXZpY2VfaWQsICZsaW5rX2NmZy5oZHIpOyAvKiBjYWxsIEFQSSAqLworCisgICAgYmNtb3NfZnJlZShvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMudmFsKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fc3RhcnRfb2FtX2hlYXJ0YmVhdChlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gX2Vvbl9zZXRfb2FtX2hlYXJ0YmVhdF9jb25maWcobGlua19zdGF0ZSk7CisgICAgaWYgKEJDTV9FUlJfT0sgPT0gcmMpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX2tleSBlbWJfbGlua19rZXkgPSBsaW5rX3N0YXRlLT5saW5rX2tleS5saW5rOworICAgICAgICBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQgc3RhcnRfaGVhcnRiZWF0X29wOworICAgICAgICBCQ01PTFRfT1BFUl9JTklUKCZzdGFydF9oZWFydGJlYXRfb3AsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwgZW1iX2xpbmtfa2V5KTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoCisgICAgICAgICAgICAmc3RhcnRfaGVhcnRiZWF0X29wLAorICAgICAgICAgICAgZXBvbl9saW5rLAorICAgICAgICAgICAgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwKKyAgICAgICAgICAgIHNlbmRfcGVyaW9kLAorICAgICAgICAgICAgSEVBUlRCRUFUX1NFTkRfUEVSSU9EKTsKKyAgICAgICAgcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQobGlua19zdGF0ZS0+bGlua19rZXkuZGV2aWNlX2lkLCAmc3RhcnRfaGVhcnRiZWF0X29wLmhkcik7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBFT05fTElOS19MT0coRVJST1IsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgImtlZXBhbGl2ZSBzdGFydCBvcGVyYXRpb24gc3VibWl0IGZhaWxlZCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJmYWlsZWQgdG8gc2V0IGhlYXJ0YmVhdCBjb25maWd1cmF0aW9uKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX3NlbmRfaW5mb19mcmFtZShlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSkKK3sKKyAgICBlb25fZnJhbWVfZGF0YSBmcmFtZV90eF9yZXE7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IGJ1aWxkX3R4X2luZm9fZnJhbWUobGlua19zdGF0ZSwgJmZyYW1lX3R4X3JlcSk7CisgICAgaWYgKEJDTV9FUlJfT0sgPT0gcmMpCisgICAgeworICAgICAgICByYyA9IF9lb25faW5qZWN0X2ZyYW1lKCZsaW5rX3N0YXRlLT5saW5rX2tleSwgZnJhbWVfdHhfcmVxLmxlbmd0aCwgZnJhbWVfdHhfcmVxLnBheWxvYWQpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyA9PSByYykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfc3RhdGUtPm9hbV90aW1lciwgT0FNX1RJTUVPVVRfVVMpOyAvKiBzdGFydCB0aW1lciBmb3IgcnggZnJhbWUgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhXQVJOSU5HLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJmYWlsZWQgdG8gaW5qZWN0IGZyYW1lICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIH0KKyAgICAgICAgYmNtb3NfZnJlZShmcmFtZV90eF9yZXEucGF5bG9hZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9jb21wbGV0ZV9uZWdvdGlhdGlvbihlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgdWludDhfdCAqcnhfcGF5bG9hZCwgdWludDE2X3QgcnhfbGVuZ3RoKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGVvbl9mcmFtZV9kYXRhIGZyYW1lX3R4X3JlcTsKKworICAgIHJjID0gYnVpbGRfdHhfaW5mb19mcmFtZShsaW5rX3N0YXRlLCAmZnJhbWVfdHhfcmVxKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgbGlua19zdGF0ZS0+dHgucGF5bG9hZCA9IGZyYW1lX3R4X3JlcS5wYXlsb2FkOworICAgIGxpbmtfc3RhdGUtPnR4Lmxlbmd0aCA9IGZyYW1lX3R4X3JlcS5sZW5ndGg7CisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJTZXR0aW5nIFRYIHBheWxvYWRcbiIpOworCisgICAgbGlua19zdGF0ZS0+cngucGF5bG9hZCA9IGJjbW9zX2NhbGxvYyhyeF9sZW5ndGgpOworICAgIGlmIChOVUxMID09IGxpbmtfc3RhdGUtPnJ4LnBheWxvYWQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgbWVtY3B5KGxpbmtfc3RhdGUtPnJ4LnBheWxvYWQsIHJ4X3BheWxvYWQsIHJ4X2xlbmd0aCk7CisgICAgbGlua19zdGF0ZS0+cngubGVuZ3RoID0gcnhfbGVuZ3RoOworICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiU2V0dGluZyBSWCBtYXNrXG4iKTsKKworICAgIGlmIChsaW5rX3N0YXRlLT5pc19oZWFydGJlYXRfYXV0b3N0YXJ0KQorICAgIHsKKyAgICAgICAgcmMgPSBfZW9uX3N0YXJ0X29hbV9oZWFydGJlYXQobGlua19zdGF0ZSk7CisgICAgICAgIEVPTl9MSU5LX0xPRyhJTkZPLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJzdGFydCBPQU0gaGVhcnRiZWF0OiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisgICAgbGlua19zdGF0ZS0+Y2FsbGJhY2sobGlua19zdGF0ZS0+Y29udGV4dCwgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCByYyk7CisgICAgX2Vvbl9kZXN0cm95X2xpbmtfc3RhdGUobGlua19zdGF0ZSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fZXZlbnRfaGFuZGxlcl9mcmFtZV9yeChjb25zdCBlb25fZXZlbnQqIGV2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmZXZlbnQtPmxpbmstPmxpbmtfa2V5LCAicmVjZWl2ZWQgJXUtYnl0ZSBmcmFtZSBiZWdpbm5pbmcgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgIGV2ZW50LT5kYXRhLmZyYW1lX3J4Lmxlbmd0aCwgZXZlbnQtPmRhdGEuZnJhbWVfcngucGF5bG9hZCk7CisKKyAgICAvKiB2YWxpZGF0ZXMgZnJhbWUsIHVwZGF0ZXMgZmxhZ3MgKi8KKyAgICByYyA9IGhhbmRsZV9yeF9pbmZvX2ZyYW1lKGV2ZW50LT5saW5rLCBldmVudC0+ZGF0YS5mcmFtZV9yeC5sZW5ndGgsIGV2ZW50LT5kYXRhLmZyYW1lX3J4LnBheWxvYWQpOworICAgIHN3aXRjaCAocmMpCisgICAgeworICAgICAgICBjYXNlIEJDTV9FUlJfT0s6IC8qIENvbXBsZXRlZCBOZWdvdGlhdGlvbiAqLworICAgICAgICAgICAgcmMgPSBfZW9uX2NvbXBsZXRlX25lZ290aWF0aW9uKGV2ZW50LT5saW5rLCBldmVudC0+ZGF0YS5mcmFtZV9yeC5wYXlsb2FkLCBldmVudC0+ZGF0YS5mcmFtZV9yeC5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNX0VSUl9JTl9QUk9HUkVTUzoKKyAgICAgICAgICAgIHJjID0gX2Vvbl9zZW5kX2luZm9fZnJhbWUoZXZlbnQtPmxpbmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNX0VSUl9QQVJTRToKKyAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhJTkZPLCAmZXZlbnQtPmxpbmstPmxpbmtfa2V5LCAicmVjZWl2ZWQgbm9uIGluZm8gZnJhbWU7IGlnbm9yaW5nXG4iKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PSzsgLyogLi4uYW5kIGtlZXAgcnVubmluZyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2V2ZW50X2hhbmRsZXJfc3RhcnQoY29uc3QgZW9uX2V2ZW50KiBldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gX2Vvbl9jbGVhcl9wcm92KCZldmVudC0+bGluay0+bGlua19rZXkpOworICAgIGlmIChCQ01fRVJSX09LID09IHJjKQorICAgIHsKKyAgICAgICAgZXZlbnQtPmxpbmstPm9hbV9zdGF0ZSA9IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfRVZBTFVBVElORzsKKyAgICAgICAgcmMgPSBfZW9uX3NlbmRfaW5mb19mcmFtZShldmVudC0+bGluayk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fZXZlbnRfaGFuZGxlcl9zdG9wKGNvbnN0IGVvbl9ldmVudCogZXZlbnQpCit7CisgICAgRU9OX0xJTktfTE9HKElORk8sICZldmVudC0+bGluay0+bGlua19rZXksICJPQU0gc3RvcCBjb21tYW5kIHJlY2VpdmVkXG4iKTsKKyAgICBfZW9uX2Rlc3Ryb3lfbGlua19zdGF0ZShldmVudC0+bGluayk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2V2ZW50X2hhbmRsZXJfb2FtX3RpbWVyX2V4cGlyZShjb25zdCBlb25fZXZlbnQqIGV2ZW50KQoreworICAgIEVPTl9MSU5LX0xPRyhXQVJOSU5HLCAmZXZlbnQtPmxpbmstPmxpbmtfa2V5LCAiT0FNIHRpbWVyIGV4cGlyZWRcbiIpOworICAgIHJldHVybiBCQ01fRVJSX1RJTUVPVVQ7Cit9CisKK3N0YXRpYyBjb25zdCBlb25fZXZlbnRfaGFuZGxlciBldmVudF9zbVtFT05fRVZFTlRfVFlQRV9DT1VOVF0gPQoreworICAgIFtFT05fRVZFTlRfVFlQRV9GUkFNRV9SWF0gPSBfZW9uX2V2ZW50X2hhbmRsZXJfZnJhbWVfcngsCisgICAgW0VPTl9FVkVOVF9UWVBFX09BTV9ORUdfU1RBUlRdID0gX2Vvbl9ldmVudF9oYW5kbGVyX3N0YXJ0LAorICAgIFtFT05fRVZFTlRfVFlQRV9PQU1fTkVHX1NUT1BdID0gX2Vvbl9ldmVudF9oYW5kbGVyX3N0b3AsCisgICAgW0VPTl9FVkVOVF9UWVBFX09BTV9USU1FUl9FWFBJUkVdID0gX2Vvbl9ldmVudF9oYW5kbGVyX29hbV90aW1lcl9leHBpcmUKK307CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2V2ZW50X2hhbmRsZXIoY29uc3QgZW9uX2V2ZW50KiBldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBpZiAoZXZlbnQtPnR5cGUgPCBFT05fRVZFTlRfVFlQRV9DT1VOVCkKKyAgICB7CisgICAgICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmV2ZW50LT5saW5rLT5saW5rX2tleSwgImV2ZW50ICVzXG4iLCBfZXZuYW1lW2V2ZW50LT50eXBlXSk7CisgICAgICAgIHJjID0gZXZlbnRfc21bZXZlbnQtPnR5cGVdKGV2ZW50KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCAmZXZlbnQtPmxpbmstPmxpbmtfa2V5LCAidW5rbm93biBldmVudCAlZFxuIiwgZXZlbnQtPnR5cGUpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX2Vvbl9ldmVudF9kaXNwYXRjaChjb25zdCBlb25fZXZlbnQqIGV2ZW50X2luKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBfZW9uX2V2ZW50X2hhbmRsZXIoZXZlbnRfaW4pOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgZXZlbnRfaW4tPmxpbmstPmNhbGxiYWNrKGV2ZW50X2luLT5saW5rLT5jb250ZXh0LCAmZXZlbnRfaW4tPmxpbmstPmxpbmtfa2V5LCByYyk7CisgICAgICAgIF9lb25fZGVzdHJveV9saW5rX3N0YXRlKGV2ZW50X2luLT5saW5rKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBfZW9uX29hbV90aW1lcl9leHBpcmUoYmNtb3NfdGltZXIqIHRpbWVyLCBsb25nIHBVc2VyKQoreworICAgIGVvbl9ldmVudCBldmVudCA9IHsgLnR5cGUgPSBFT05fRVZFTlRfVFlQRV9PQU1fVElNRVJfRVhQSVJFLCAubGluayA9IChlb25fbGlua19zdGF0ZSAqKXBVc2VyIH07CisKKyAgICBfZW9uX2V2ZW50X2Rpc3BhdGNoKCZldmVudCk7CisKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2NyZWF0ZV9saW5rX3N0YXRlKAorICAgIGVvbl9saW5rX3N0YXRlICoqc3RhdGUsCisgICAgZW9uX2xpbmtfa2V5KiBsaW5rX2tleSwKKyAgICBlb25fb2FtX3NldF9pZCBvYW1fc2V0LAorICAgIGJjbW9sdF9lb25fcmVzdWx0X2NiIGNiLAorICAgIHZvaWQgKmNvbnRleHQsCisgICAgYmNtb3NfYm9vbCBpc19oZWFydGJlYXRfYXV0b3N0YXJ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlOworCisgICAgbGlua19zdGF0ZSA9IF9lb25fZmluZF9saW5rX3N0YXRlKGxpbmtfa2V5KTsKKyAgICBpZiAobGlua19zdGF0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCBsaW5rX2tleSwgIk9BTSBuZWdvdGlhdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICBsaW5rX3N0YXRlID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbGlua19zdGF0ZSkpOworICAgIGlmIChsaW5rX3N0YXRlID09IE5VTEwpCisgICAgeworICAgICAgICBFT05fTElOS19MT0coRVJST1IsIGxpbmtfa2V5LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHN0YXRlIHJlY29yZFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX25pX2tleSBuaV9rZXkgPSB7IC5lcG9uX25pID0gbGlua19rZXktPmxpbmsuZXBvbl9uaSB9OworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBuaV9jZmc7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJm5pX2NmZywgZXBvbl9uaSwgbmlfa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZuaV9jZmcsIGVwb25fbmksIG1hY19hZGRyZXNzKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGxpbmtfa2V5LT5kZXZpY2VfaWQsICZuaV9jZmcuaGRyKTsKKyAgICBpZiAoQkNNX0VSUl9PSyA9PSByYykKKyAgICB7CisgICAgICAgIGxpbmtfc3RhdGUtPmVwb25fbmlfbWFjX2FkZHIgPSBuaV9jZmcuZGF0YS5tYWNfYWRkcmVzczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCBsaW5rX2tleSwgIkZhaWxlZCB0byByZXRyaWV2ZSBFUE9OIE5JIE1BQyBhZGRyZXNzOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgYmNtb3NfZnJlZShsaW5rX3N0YXRlKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGJjbW9zX3RpbWVyX3Bhcm0gdGltZXJfc3BlYyA9CisgICAgeworICAgICAgICAub3duZXIgICA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRU9OICsgbGlua19rZXktPmRldmljZV9pZCwKKyAgICAgICAgLmhhbmRsZXIgPSBfZW9uX29hbV90aW1lcl9leHBpcmUsCisgICAgICAgIC5kYXRhICAgID0gKGxvbmcpbGlua19zdGF0ZQorICAgIH07CisgICAgcmMgPSBiY21vc190aW1lcl9jcmVhdGUoJmxpbmtfc3RhdGUtPm9hbV90aW1lciwgJnRpbWVyX3NwZWMpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCBsaW5rX2tleSwgIkZhaWxlZCB0byBjcmVhdGUgdGltZXI6ICVzXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICBiY21vc19mcmVlKGxpbmtfc3RhdGUpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgbGlua19zdGF0ZS0+bGlua19rZXkgPSAqbGlua19rZXk7CisgICAgbGlua19zdGF0ZS0+Y2FsbGJhY2sgPSBjYiA/IGNiIDogX2Vvbl9kZWZhdWx0X2NhbGxiYWNrX2ZuOworICAgIGxpbmtfc3RhdGUtPmNvbnRleHQgPSBjb250ZXh0OworICAgIGxpbmtfc3RhdGUtPmlzX2hlYXJ0YmVhdF9hdXRvc3RhcnQgPSBpc19oZWFydGJlYXRfYXV0b3N0YXJ0OworICAgIGxpbmtfc3RhdGUtPm9hbV9zZXQgPSBvYW1fc2V0OworICAgIGxpbmtfc3RhdGUtPm1heF9wZHVfc2l6ZSA9IDE1MzY7CisKKyAgICBSQl9JTlNFUlQobGlua19zdGF0ZV9tYXAsICZlb25fc3RhdGVbbGlua19rZXktPmRldmljZV9pZF0ubGlua19zdGF0ZV9tYXAsIGxpbmtfc3RhdGUpOworCisgICAgKnN0YXRlID0gbGlua19zdGF0ZTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfZW9uX3Rhc2tfcHJvY2Vzc19yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBjb25zdCBiY21vbHRfcHJveHlfcnggKnJ4KQoreworICAgIGVvbl9ldmVudCBldmVudCAgPSB7IC50eXBlID0gRU9OX0VWRU5UX1RZUEVfRlJBTUVfUlggfTsKKworICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5KiBlcG9uX2xpbmtfa2V5ID0gKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5KikocnggKyAxKTsKKyAgICBlb25fbGlua19rZXkgbGlua19rZXkgPSB7IC5kZXZpY2VfaWQgPSBkZXZpY2VfaWQsIC5saW5rID0gKmVwb25fbGlua19rZXkgfTsKKyAgICBlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSA9IF9lb25fZmluZF9saW5rX3N0YXRlKCZsaW5rX2tleSk7CisKKyAgICBpZiAobGlua19zdGF0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19rZXksICJmb3VuZCBleGlzdGluZyBsaW5rXG4iKTsKKyAgICAgICAgY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyIGZyYW1lID0gKChjb25zdCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkKilyeCktPmRhdGEuZnJhbWU7CisgICAgICAgIGV2ZW50LmxpbmsgPSBsaW5rX3N0YXRlOworICAgICAgICBldmVudC5kYXRhLmZyYW1lX3J4LnBheWxvYWQgPSBmcmFtZS52YWw7CisgICAgICAgIGV2ZW50LmRhdGEuZnJhbWVfcngubGVuZ3RoICA9IGZyYW1lLmxlbjsKKyAgICAgICAgX2Vvbl9ldmVudF9kaXNwYXRjaCgmZXZlbnQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBFT05fTElOS19MT0coREVCVUcsICZsaW5rX2tleSwgInJ4IG9uIHVua25vd24gbGlua1xuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZW9uX2hhbmRsZV9wcm94eV9yeChiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBlb25fdGFza19tc2cgKm1zZyA9IChlb25fdGFza19tc2cqKW9zX21zZzsKKworICAgIF9lb25fdGFza19wcm9jZXNzX3J4KG9zX21zZy0+aW5zdGFuY2UsIG1zZy0+ZGF0YS5wcm94eV9yeC5yeCk7CisKKyAgICBiY21vbHRfbXNnX2ZyZWUoJm1zZy0+ZGF0YS5wcm94eV9yeC5yeC0+aGRyKTsgLyogZnJlZSBjbG9uZWQgaW5kaWNhdGlvbiAqLworICAgIGJjbW9zX2ZyZWUob3NfbXNnKTsKK30KKworc3RhdGljIHZvaWQgX2Vvbl9oYW5kbGVfc3RhcnQoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgZW9uX3Rhc2tfbXNnICptc2cgPSAoZW9uX3Rhc2tfbXNnKilvc19tc2c7CisgICAgZW9uX2xpbmtfa2V5IGxpbmtfa2V5ID0geyAuZGV2aWNlX2lkID0gb3NfbXNnLT5pbnN0YW5jZSwgLmxpbmsgPSBtc2ctPmRhdGEuc3RhcnQubGlua19rZXkgfTsKKyAgICBlb25fZXZlbnQgZXZlbnQgPSB7IC50eXBlID0gRU9OX0VWRU5UX1RZUEVfT0FNX05FR19TVEFSVCB9OworCisgICAgaWYgKEJDTV9FUlJfT0sgPT0gX2Vvbl9jcmVhdGVfbGlua19zdGF0ZSgKKyAgICAgICAgJmV2ZW50LmxpbmssCisgICAgICAgICZsaW5rX2tleSwKKyAgICAgICAgbXNnLT5kYXRhLnN0YXJ0Lm9hbV9zZXQsCisgICAgICAgIG1zZy0+ZGF0YS5zdGFydC5jYiwKKyAgICAgICAgbXNnLT5kYXRhLnN0YXJ0LmNvbnRleHQsCisgICAgICAgIG1zZy0+ZGF0YS5zdGFydC5pc19oZWFydGJlYXRfYXV0b3N0YXJ0KSkKKyAgICB7CisgICAgICAgIF9lb25fZXZlbnRfZGlzcGF0Y2goJmV2ZW50KTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9lb25faGFuZGxlX3N0b3AoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgZW9uX3Rhc2tfbXNnICptc2cgPSAoZW9uX3Rhc2tfbXNnKilvc19tc2c7CisgICAgZW9uX2xpbmtfa2V5IGxpbmtfa2V5ID0geyAuZGV2aWNlX2lkID0gb3NfbXNnLT5pbnN0YW5jZSwgLmxpbmsgPSBtc2ctPmRhdGEuc3RvcC5saW5rX2tleSB9OworICAgIGVvbl9ldmVudCBldmVudCA9IHsgLnR5cGUgPSBFT05fRVZFTlRfVFlQRV9PQU1fTkVHX1NUT1AsIC5saW5rID0gX2Vvbl9maW5kX2xpbmtfc3RhdGUoJmxpbmtfa2V5KSB9OworCisgICAgaWYgKE5VTEwgIT0gZXZlbnQubGluaykKKyAgICB7CisgICAgICAgIF9lb25fZXZlbnRfZGlzcGF0Y2goJmV2ZW50KTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2NtZF9zdGFydChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBlb25fdGFza19tc2dfZGF0YSBtc2dfZGF0YTsKKworICAgIG1zZ19kYXRhLnN0YXJ0Lmxpbmtfa2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIG1zZ19kYXRhLnN0YXJ0Lmxpbmtfa2V5Lm1hY19hZGRyZXNzID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworICAgIG1zZ19kYXRhLnN0YXJ0Lm9hbV9zZXQgPSAoZW9uX29hbV9zZXRfaWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX3NldCIpLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICBtc2dfZGF0YS5zdGFydC5jYiA9IE5VTEw7CisgICAgbXNnX2RhdGEuc3RhcnQuY29udGV4dCA9IE5VTEw7CisgICAgbXNnX2RhdGEuc3RhcnQuaXNfaGVhcnRiZWF0X2F1dG9zdGFydCA9IEJDTU9TX1RSVUU7CisKKyAgICByYyA9IF9lb25fc2VuZF9vc19tc2coY3VycmVudF9kZXZpY2UsIEJDTU9TX01TR19JRF9FT05fU1RBUlQsICZtc2dfZGF0YSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2NtZF9zdG9wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgZW9uX3Rhc2tfbXNnX2RhdGEgbXNnX2RhdGE7CisKKyAgICBtc2dfZGF0YS5zdG9wLmxpbmtfa2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIG1zZ19kYXRhLnN0b3AubGlua19rZXkubWFjX2FkZHJlc3MgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisKKyAgICByYyA9IF9lb25fc2VuZF9vc19tc2coY3VycmVudF9kZXZpY2UsIEJDTU9TX01TR19JRF9FT05fU1RPUCwgJm1zZ19kYXRhKTsKKworICAgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9jbWRfc2hvdygKKyAgICBiY21jbGlfc2Vzc2lvbiAgICAgICAgKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtICBwYXJtW10sCisgICAgdWludDE2X3QgICAgICAgICAgICAgICBuX3Bhcm1zKQoreworICAgIGVvbl9saW5rX3N0YXRlKiAgIGxpbmtfc3RhdGU7CisgICAgYmNtb3NfYm9vbCAgICAgICAgICBub19saW5rcyA9IEJDTU9TX1RSVUU7CisKKyAgICBSQl9GT1JFQUNIKGxpbmtfc3RhdGUsIGxpbmtfc3RhdGVfbWFwLCAmZW9uX3N0YXRlW2N1cnJlbnRfZGV2aWNlXS5saW5rX3N0YXRlX21hcCkKKyAgICB7CisgICAgICAgIG5vX2xpbmtzID0gQkNNT1NfRkFMU0U7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLT4gICJMSU5LX0tFWV9GTVRfU1RSIiAgT0FNIHNldCAldSAgIHN0YXRlICUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTktfS0VZX0RBVEEoJmxpbmtfc3RhdGUtPmxpbmtfa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19zdGF0ZS0+b2FtX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19zdGF0ZS0+b2FtX3N0YXRlKTsKKyAgICB9CisgICAgaWYgKG5vX2xpbmtzKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIm5vIGxpbmtzXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZW9uX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZGlyX25hbWUgPSAiZW9uIjsKKworICAgIGlmIChiY21jbGlfZGlyX2ZpbmQodG9wX2RpciwgZGlyX25hbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJjbWNsaV9lbnRyeSAqZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVQT04gT0FNIG5lZ290aWF0aW9uIGNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJVR19PTihkaXIgPT0gTlVMTCk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaG93IGN1cnJlbnQgRU9OIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lb25fY21kX3Nob3cpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwKKyAgICAgICAgICAgICAgICAgICAgInN0YXJ0X29hbV9uZWdvdGlhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICJTdGFydCBPQU0gbmVnb3RpYXRpb24gZm9yIGFuIEVQT04gbGluayIsCisgICAgICAgICAgICAgICAgICAgIF9lb25fY21kX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJNQUMgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX01BQywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJvYW1fc2V0IiwgIk9BTSBzZXQiLCBlb25fb2FtX3NldF9pZF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSk7CisKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsCisgICAgICAgICAgICAgICAgICAgICJzdG9wX29hbV9uZWdvdGlhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICJTdG9wIGluIHByb2dyZXNzIE9BTSBuZWdvdGlhdGlvbiBmb3IgYW4gRVBPTiBsaW5rIiwKKyAgICAgICAgICAgICAgICAgICAgX2Vvbl9jbWRfc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJNQUMgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX01BQywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSApOworfQorCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lb25faW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKGVwb25fb2FtX25lZ19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoYmNtb2x0X2RldmlkIGRldmljZSA9IDA7IGRldmljZSA8IEJDTVRSX01BWF9PTFRTOyBkZXZpY2UrKykKKyAgICB7CisgICAgICAgIHJjID0gX2Vvbl9pbml0X3Rhc2soZGV2aWNlKTsKKyAgICAgICAgQlVHX09OKHJjICE9IEJDTV9FUlJfT0spOworCisgICAgICAgIHJjID0gX2Vvbl9pbml0X21vZHVsZShkZXZpY2UpOworICAgICAgICBCVUdfT04ocmMgIT0gQkNNX0VSUl9PSyk7CisKKyAgICAgICAgY2hhciBsb2dfbmFtZVtNQVhfREVWX0xPR19JRF9OQU1FXTsKKyAgICAgICAgc25wcmludGYobG9nX25hbWUsIHNpemVvZihsb2dfbmFtZSksICJ1c2VyX2FwcGxfZW9uJXUiLCBkZXZpY2UpOworICAgICAgICBlb25fc3RhdGVbZGV2aWNlXS5sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihsb2dfbmFtZSwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisKKyAgICAgICAgYmNtb3NfbXNnX3JlZ2lzdGVyKAorICAgICAgICAgICAgQkNNT1NfTVNHX0lEX0VPTl9TVEFSVCwKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRU9OICsgZGV2aWNlLAorICAgICAgICAgICAgX2Vvbl9oYW5kbGVfc3RhcnQpOworICAgICAgICBiY21vc19tc2dfcmVnaXN0ZXIoCisgICAgICAgICAgICBCQ01PU19NU0dfSURfRU9OX1NUT1AsCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VPTiArIGRldmljZSwKKyAgICAgICAgICAgIF9lb25faGFuZGxlX3N0b3ApOworICAgICAgICBiY21vc19tc2dfcmVnaXN0ZXIoCisgICAgICAgICAgICBCQ01PU19NU0dfSURfRU9OX1BST1hZX1JYLAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9FT04gKyBkZXZpY2UsCisgICAgICAgICAgICBfZW9uX2hhbmRsZV9wcm94eV9yeCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgbWFwCisgICAgICAgIFJCX0lOSVQoJmVvbl9zdGF0ZVtkZXZpY2VdLmxpbmtfc3RhdGVfbWFwKTsKKyAgICB9CisKKyAgICBlcG9uX29hbV9uZWdfcnVubmluZyA9IEJDTU9TX1RSVUU7Cit9CisKKy8vIHB1YmxpYyBpbmRpY2F0aW9uIGhhbmRsZXIgaW50ZXJmYWNlIC0tIGNhbGxlZCBpbiB0cmFuc3BvcnQgbGF5ZXIgY29udGV4dAorYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9lb25fcHJvY2Vzc19yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfcHJveHlfcnggKnJ4KQoreworICAgICBiY21vc19lcnJubyByYzsKKyAgICAgZW9uX3Rhc2tfbXNnX2RhdGEgbXNnX2RhdGEgPSB7fTsKKworICAgICAvKiBOb3QgcnVubmluZyAtLT4gc2lsZW50bHkgaWdub3JlICAqLworICAgICBpZiAoIWVwb25fb2FtX25lZ19ydW5uaW5nKQorICAgICB7CisgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgfQorCisgICAgIC8qIE5vdCBvdXIgbWVzc2FnZSAtLT4gc2lsZW50eSBpZ25vcmUgKi8KKyAgICAgaWYgKCAoQkNNT0xUX09CSl9JRF9FUE9OX0xJTksgIT0gcngtPmhkci5vYmpfdHlwZSkgfHwKKyAgICAgICAgICAoQkNNT0xUX0VQT05fTElOS19QUk9YWV9SWF9JRF9GUkFNRV9DQVBUVVJFRCAhPSByeC0+aGRyLnN1Ymdyb3VwKSApCisgICAgIHsKKyAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICB9CisKKyAgICAgLyogVGhpcyBpcyBzb21ldGhpbmcgdGhpcyBhcHBsaWNhdGlvbiBkb2VzIGNhcmUgYWJvdXQgLSBzbyBjbG9uZSB0aGUgbWVzc2FnZSBpbnRvCisgICAgICAgIG5ld2x5LWFsbG9jYXRlZCBtZW1vcnkgc28gd2UgY2FuIGhhbmRsZSBpdCBhZnRlciB0aGUgb3JpZ2luYWwgbWVzc2FnZSBoYXMgYmVlbiBmcmVlZCAqLworICAgICByYyA9IGJjbW9sdF9tc2dfY2xvbmUoKGJjbW9sdF9tc2cqKikmbXNnX2RhdGEucHJveHlfcngucngsICZyeC0+aGRyKTsKKyAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgIHsKKyAgICAgICAgIEVPTl9MT0coRVJST1IsIGRldmljZV9pZCwgIk1lc3NhZ2UgY2xvbmUgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgIHJldHVybiByYzsKKyAgICAgfQorCisgICAgIHJjID0gX2Vvbl9zZW5kX29zX21zZyhkZXZpY2VfaWQsIEJDTU9TX01TR19JRF9FT05fUFJPWFlfUlgsICZtc2dfZGF0YSk7CisgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICB7CisgICAgICAgICBiY21vbHRfbXNnX2ZyZWUoJm1zZ19kYXRhLnByb3h5X3J4LnJ4LT5oZHIpOworICAgICB9CisgICAgIHJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5M2ZjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfRU9OX0hfCisjZGVmaW5lIF9CQ01PTFRfRU9OX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKKy8qIHVuaXF1ZWx5IGlkZW50aWZpZXMgc3BlY2lmaWMgRVBPTiBsaW5rcyB1bmRlciBtYW5hZ2VtZW50IGJ5IHRoaXMgYXBwbGljYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgIGJjbW9sdF9kZXZpZCAgICAgICAgICBkZXZpY2VfaWQ7CisgICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5ICBsaW5rOworfSBlb25fbGlua19rZXk7CisKK3R5cGVkZWYgZW51bQoreworICAgICBFT05fT0FNX1NFVF9JRF9EUE9FLAorICAgICBFT05fT0FNX1NFVF9JRF9CUkNNLAorICAgICBFT05fT0FNX1NFVF9JRF9DVEMsCisKKyAgICAgRU9OX09BTV9TRVRfSURfQ09VTlQKK30gZW9uX29hbV9zZXRfaWQ7CisKKy8qIHNpZ25hdHVyZSBvZiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIHRvIHJlcG9ydCBvdXRjb21lcyBvZiBPQU0gbmVnb3RpYXRpb25zICovCit0eXBlZGVmIHZvaWQgKCpiY21vbHRfZW9uX3Jlc3VsdF9jYikodm9pZCAqY29udGV4dCwgY29uc3QgZW9uX2xpbmtfa2V5ICpsaW5rX2tleSwgYmNtb3NfZXJybm8gcmVzdWx0KTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleTsKKyAgICBlb25fb2FtX3NldF9pZCBvYW1fc2V0OworICAgIGJjbW9sdF9lb25fcmVzdWx0X2NiIGNiOworICAgIHZvaWQgKmNvbnRleHQ7CisgICAgYmNtb3NfYm9vbCBpc19oZWFydGJlYXRfYXV0b3N0YXJ0OworfSBlb25fdGFza19zdGFydF9kYXRhOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5OworfSBlb25fdGFza19zdG9wX2RhdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X3Byb3h5X3J4ICpyeDsKK30gZW9uX3Rhc2tfcHJveHlfcnhfZGF0YTsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGVvbl90YXNrX3N0YXJ0X2RhdGEgc3RhcnQ7CisgICAgZW9uX3Rhc2tfc3RvcF9kYXRhIHN0b3A7CisgICAgZW9uX3Rhc2tfcHJveHlfcnhfZGF0YSBwcm94eV9yeDsKK30gZW9uX3Rhc2tfbXNnX2RhdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbXNnIG9zX21zZzsKKyAgICBlb25fdGFza19tc2dfZGF0YSBkYXRhOworfSBlb25fdGFza19tc2c7CisKKy8vIGluaXRpYWxpemUgdGhlIEVQT04gT0FNIG5lZ290aWF0aW9uIGFwcGxpY2F0aW9uIChzaG91bGQgYmUgY2FsbGVkIGFzIHBhcnQgb2YgdXNlciBhcHBsaWNhdGlvbiBzdGFydHVwKQorZXh0ZXJuIHZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lb25faW5pdCh2b2lkKTsKKworLy8gcHJvY2VzcyBhIHByb3h5IHJ4CitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2Vvbl9wcm9jZXNzX3J4KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9wcm94eV9yeCAqcHJveHlfcngpOworCisvLyBpbml0aWFsaXplIEVPTiBDTEkKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lb25fY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uX3ByaXZhdGUuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL2JjbW9sdF9lb25fcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MGI0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uX3ByaXZhdGUuaApAQCAtMCwwICsxLDkyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpZm5kZWYgX0JDTU9MVF9FT05fUFJJVkFURV9IXworI2RlZmluZSBfQkNNT0xUX0VPTl9QUklWQVRFX0hfCisKKy8qIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorICAgeCBUaGlzIGZpbGUgaXMgZm9yIGludGVybmFsIHVzZSB3aXRoaW4gdGhlIEVQT04gT0FNIG5lZ290aWF0aW9uIGFwcGxpY2F0aW9uLiB4CisgICB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgKKyAgIHggT3V0c2lkZSBjb2RlIHNob3VsZCBub3QgcmVmZXIgdG8gYW55dGhpbmcgZGVmaW5lZCBvciBkZWNsYXJlZCBoZXJlaW4hICAgICAgeAorICAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4ICovCisKKyNpbmNsdWRlICJiY21vbHRfZW9uLmgiIC8qIHRoZSBwcml2YXRlIGludGVyZmFjZSBleHRlbmRzIHRoZSBwdWJsaWMgaW50ZXJmYWNlICovCisjaW5jbHVkZSAiYmNtb2x0X2Vwb25fb2FtX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNpbmNsdWRlICJiY21vbHRfdXRpbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90KiBwYXlsb2FkOyAvKiBwYXlsb2FkIGJ5dGVzIGluIFtEQSxGQ1MpICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKiBmcmFtZSBsZW5ndGggZnJvbSBEQSB0byBqdXN0IGJlZm9yZSBGQ1MgKi8KK30gZW9uX2ZyYW1lX2RhdGE7CisKKy8qIG1hcCBjb250YWluaW5nIHN0YXRlIG9mIGFsbCBFUE9OIGxpbmtzIHdpdGggT0FNIG5lZ290aWF0aW9uIHVuZGVyd2F5IG9yIGNvbXBsZXRlZCAqLwordHlwZWRlZiBzdHJ1Y3QgZW9uX2xpbmtfc3RhdGUgZW9uX2xpbmtfc3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBsaW5rX3N0YXRlX21hcCBsaW5rX3N0YXRlX21hcDsKK1JCX0hFQUQobGlua19zdGF0ZV9tYXAsIGVvbl9saW5rX3N0YXRlKTsKKworc3RydWN0IGVvbl9saW5rX3N0YXRlCit7CisgICAgZW9uX2xpbmtfa2V5ICAgICAgICAgICAgICAgICBsaW5rX2tleTsgICAgICAgICAgICAgICAgICAvKiBnbG9iYWxseSB1bmlxdWUgb3BhcXVlIGVudGl0eSBpZCAqLworICAgIGJjbW9zX3RpbWVyICAgICAgICAgICAgICAgICAgb2FtX3RpbWVyOyAgICAgICAgICAgICAgICAgLyogdGltZXIgdXNlZCB3aGVuIGF3YWl0aW5nIG9hbSByZXNwb25zZXMgKi8KKyAgICBlb25fb2FtX3NldF9pZCAgICAgICAgICAgICAgIG9hbV9zZXQ7ICAgICAgICAgICAgICAgICAgIC8qIE9BTSBzZXQgYXBwbGljYWJsZSB0byB0aGUgbGluayAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3MgICAgb2FtX3N0YXRlOyAgICAgICAgICAgICAgICAgLyogT0FNIGxpbmsgbmVnb3RpYXRpb24gc3RhdGUgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uOyAgICAgICAgICAgICAgICAgIC8qIExvY2FsIHJldmlzaW9uICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBtYXhfcGR1X3NpemU7ICAgICAgICAgICAgICAvKiBtYXggUERVIHNpemUgKi8KKyAgICBiY21vbHRfZW9uX3Jlc3VsdF9jYiAgICAgICAgIGNhbGxiYWNrOyAgICAgICAgICAgICAgICAgIC8qIGNhbGxiYWNrIHdoZW4gbmVnb3RpYXRpb24gaXMgY29tcGxldGUgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0OyAgICAgICAgICAgICAgICAgIC8qIGNvbnRleHQgZm9yIHRoZSBhYm92ZSBjYWxsYmFjayBmdW5jdGlvbiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyByZW1vdGVfaW5mbzsgICAgICAgICAgLyogcHJldmlvdXMgVExWIHJlY2VpdmVkIGZyb20gdGhlIHJlbW90ZSAqLworICAgIGJjbW9zX21hY19hZGRyZXNzICAgICAgICAgICAgZXBvbl9uaV9tYWNfYWRkcjsgICAgICAgICAgLyogTUFDIGFkZHJlc3MgdG8gdXNlIGZvciBTQSBvZiBlZ3Jlc3MgT0FNIGZyYW1lcyAqLworICAgIGVvbl9mcmFtZV9kYXRhICAgICAgICAgICAgICAgcng7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRmluYWwgcmVjZWl2ZWQgT0FNICovCisgICAgZW9uX2ZyYW1lX2RhdGEgICAgICAgICAgICAgICB0eDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaW5hbCBzZW50IE9BTSAqLworICAgIGJjbW9zX2Jvb2wgICAgICAgICAgICAgICAgICAgaXNfaGVhcnRiZWF0X2F1dG9zdGFydDsgICAgLyogc3RhcnQgaGVhcnRiZWF0IHVwb24gc3VjY2Vzc2Z1bCBuZWdvdGlhdGlvbiBjb21wbGV0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpvcmdfc3BlY19zdGF0ZTsgICAgICAgICAgICAvKiBTdGF0ZSBzcGVjaWZpYyB0byB0aGUgc2VsZWN0ZWQgT0FNIHNldCAqLworICAgIFJCX0VOVFJZKGVvbl9saW5rX3N0YXRlKSAgICAgcmJfZW50cnk7Cit9OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX3Rhc2sgdGFzazsKKyAgICBjaGFyIHRhc2tfbmFtZVtNQVhfVEFTS19OQU1FX1NJWkVdOworICAgIGNoYXIgbXNnX3F1ZXVlX25hbWVbTUFYX01TR19RVUVVRV9OQU1FX1NJWkVdOworICAgIGRldl9sb2dfaWQgbG9nX2lkOworICAgIGxpbmtfc3RhdGVfbWFwIGxpbmtfc3RhdGVfbWFwOworfSBlb25fZ2xvYmFsX3N0YXRlOworCisjZGVmaW5lIExJTktfS0VZX0ZNVF9TVFIgIlBPTiAldSwgIkJDTU9TX01BQ0FERFJfRk1UX1NUUgorI2RlZmluZSBMSU5LX0tFWV9EQVRBKGxrZXkpIChsa2V5KS0+bGluay5lcG9uX25pLCBCQ01PU19NQUNBRERSX1BBUkFNUygmKGxrZXkpLT5saW5rLm1hY19hZGRyZXNzKQorCisjZGVmaW5lIEVPTl9MT0cobGV2ZWwsIGRldmljZSwgZm9ybWF0LCBhcmdzLi4uKSBCQ01fTE9HKGxldmVsLCBlb25fc3RhdGVbZGV2aWNlXS5sb2dfaWQsIGZvcm1hdCwgIyNhcmdzKQorI2RlZmluZSBFT05fTElOS19MT0cobGV2ZWwsIGxpbmtfa2V5LCBmbXQsIGFyZ3MuLi4pIFwKKyAgICBCQ01fTE9HKGxldmVsLCBlb25fc3RhdGVbKGxpbmtfa2V5KS0+ZGV2aWNlX2lkXS5sb2dfaWQsIExJTktfS0VZX0ZNVF9TVFIiOiAiZm10LCBMSU5LX0tFWV9EQVRBKGxpbmtfa2V5KSwgIyNhcmdzKQorCitleHRlcm4gZW9uX2dsb2JhbF9zdGF0ZSBlb25fc3RhdGVbQkNNVFJfTUFYX09MVFNdOworCisjZW5kaWYgLy8gX0JDTU9MVF9FT05fUFJJVkFURV9IXwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvYnJjbS9icmNtLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9icmNtL2JyY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE3MGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvYnJjbS9icmNtLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBwaWVjZXMgb2YgdGhlIE9BTSBuZWdvdGlhdGlvbiBzdGF0ZSBtYWNoaW5lIHRoYXQgYXJlIHNwZWNpZmljIHRvIEJSQ00gT0FNLiAqLworCisjaW5jbHVkZSAiYmNtb2x0X2Vvbl9wcml2YXRlLmgiCisjaW5jbHVkZSAiLi4vb2FtX2NvbW1vbi5oIgorI2luY2x1ZGUgImJyY20uaCIKKworLyogT3JnIHNwZWNpZmljIFRMViB0byBzZW5kIHRvIHRoZSBPTlUgKi8KK3N0YXRpYyBjb25zdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gYnJjbV90eF90bHYgPQoreworICAgIC5vdWkgPSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLLAorICAgIC51ID0KKyAgICB7CisgICAgICAgIC50ZWsgPQorICAgICAgICB7CisgICAgICAgICAgICAudGx2cyA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfRVhURU5TSU9OX1NVUFBPUlQsCisgICAgICAgICAgICAgICAgLnUgPQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLmV4dGVuc2lvbl9zdXBwb3J0ID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLnZlcnNpb24gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcG9ydF9tb2RlID0gQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfVEVLTk9WVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAucHJlZmVycmVkX3JlcG9ydF9tb2RlID0gQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfVEVLTk9WVVMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK307CisKK3ZvaWQgYnJjbV90eF9hZGRfdGx2KGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICpvYW0pCit7CisgICAgaWYgKExPQ0FMX1NUQUJMRV9SRU1PVEVfU1RBQkxFID09IGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSkKKyAgICB7CisgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNbb2FtLT51LmluZm8udGx2c19jb3VudF0udHlwZSA9IEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzsKKyAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSA9IGJyY21fdHhfdGx2OworICAgICAgICBvYW0tPnUuaW5mby50bHZzX2NvdW50Kys7CisgICAgfQorfQorCit2b2lkIGJyY21fcnhfdGx2KAorICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLAorICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqb3JnX3NwZWMsCisgICAgYmNtb3NfZXJybm8gKnJjKQoreworICAgIGlmIChsaW5rX3N0YXRlLT5vYW1fc3RhdGUgPT0gTE9DQUxfU1RBQkxFX1JFTU9URV9TVEFCTEUpCisgICAgeworICAgICAgICBpZiAoKE5VTEwgPT0gb3JnX3NwZWMpIHx8CisgICAgICAgICAgICAoQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSyAhPSBvcmdfc3BlYy0+b3VpKSB8fAorICAgICAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9FWFRFTlNJT05fU1VQUE9SVCAhPSBvcmdfc3BlYy0+dS50ZWsudGx2cy50eXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgRU9OX0xJTktfTE9HKElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkRpZG4ndCBnZXQgQlJDTSBUTFZcbiIpOworICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKDAgIT0gb3JnX3NwZWMtPnUudGVrLnRsdnMudS5leHRlbnNpb25fc3VwcG9ydC52ZXJzaW9uKSB8fAorICAgICAgICAgICAgICAgICgwID09CisgICAgICAgICAgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fVEVLX1JFUE9SVF9NT0RFU19URUtOT1ZVUyAmIG9yZ19zcGVjLT51LnRlay50bHZzLnUuZXh0ZW5zaW9uX3N1cHBvcnQucmVwb3J0X21vZGUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFT05fTElOS19MT0coCisgICAgICAgICAgICAgICAgICAgIElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkJSQ00gVExWIGNvbnRhaW5lZCBiYWQgaW5mbzogdmVyc2lvbiAldSBycHQgbW9kZXMgJTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUudGVrLnRsdnMudS5leHRlbnNpb25fc3VwcG9ydC52ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS50ZWsudGx2cy51LmV4dGVuc2lvbl9zdXBwb3J0LnJlcG9ydF9tb2RlKTsKKyAgICAgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKE5VTEwgIT0gb3JnX3NwZWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhJTkZPLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJHb3QgdW5leHBlY3RlZCBvcmdhbml6YXRpb24gc3BlY2lmaWMgVExWXG4iKTsKKyAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9icmNtL2JyY20uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2JyY20vYnJjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Yzg4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9icmNtL2JyY20uaApAQCAtMCwwICsxLDQxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpZm5kZWYgX0JDTU9MVF9FT05fQlJDTV9IXworI2RlZmluZSBfQkNNT0xUX0VPTl9CUkNNX0hfCisKK3ZvaWQgYnJjbV90eF9hZGRfdGx2KGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICpvYW0pOworCit2b2lkIGJyY21fcnhfdGx2KAorICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLAorICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqb3JnX3NwZWMsCisgICAgYmNtb3NfZXJybm8gKnJjKTsKKworI2VuZGlmIC8vIF9CQ01PTFRfRU9OX0JSQ01fSF8KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvY3RjL2N0Yy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvY3RjL2N0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OGM4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9jdGMvY3RjLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBwaWVjZXMgb2YgdGhlIE9BTSBuZWdvdGlhdGlvbiBzdGF0ZSBtYWNoaW5lIHRoYXQgYXJlIHNwZWNpZmljIHRvIENUQyBPQU0uICovCisKKyNpbmNsdWRlICJiY21vbHRfZW9uX3ByaXZhdGUuaCIKKyNpbmNsdWRlICIuLi9vYW1fY29tbW9uLmgiCisjaW5jbHVkZSAiY3RjLmgiCisKKyNkZWZpbmUgQ1RDX0VYVEVOU0lPTl9TVVBQT1JUIDB4MQorI2RlZmluZSBDVENfUFJFRkVSUkVEX1ZFUlNJT04gMHgzMAorCit0eXBlZGVmIGVudW0KK3sKKyAgICBDVENfTkVHX0FEVkVSVElTSU5HLAorICAgIENUQ19ORUdfQ09ORklSTUlORywKKyAgICBDVENfTkVHX0RPTkUKK30gY3RjX25lZ19zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjdGNfbmVnX3N0YXRlIHN0YXRlOworICAgIHVpbnQ4X3Qgc2VsZWN0ZWRfdmVyc2lvbjsKK30gY3RjX3N0YXRlOworCitzdGF0aWMgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyIGN0Y19hZHZlcnRpc2VkX3ZlcnNpb25zW10gPQoreworICAgIHsgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsIC52ZXJzaW9uID0gMHgzMCB9LAorICAgIHsgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsIC52ZXJzaW9uID0gMHgyMSB9LAorICAgIHsgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsIC52ZXJzaW9uID0gMHgyMCB9LAorICAgIHsgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsIC52ZXJzaW9uID0gMHgxMyB9LAorICAgIHsgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsIC52ZXJzaW9uID0gMHgwMSB9Cit9OworCisvKiBPcmcgc3BlY2lmaWMgVExWIHRvIHNlbmQgdG8gdGhlIE9OVSAqLworc3RhdGljIGNvbnN0IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyBjdGNfdHhfYWR2ZXJ0aXNlX3RsdiA9Cit7CisgICAgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsCisgICAgLnUgPQorICAgIHsKKyAgICAgICAgLmN0YyA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC5leHRlbnNpb25fc3VwcG9ydCA9IENUQ19FWFRFTlNJT05fU1VQUE9SVCwKKyAgICAgICAgICAgIC52ZXJzaW9uID0gQ1RDX1BSRUZFUlJFRF9WRVJTSU9OLAorICAgICAgICAgICAgLnN1cHBfdmVyc2lvbl9jb3VudCA9IE5VTV9FTEVNKGN0Y19hZHZlcnRpc2VkX3ZlcnNpb25zKSwKKyAgICAgICAgICAgIC5zdXBwX3ZlcnNpb24gPSBjdGNfYWR2ZXJ0aXNlZF92ZXJzaW9ucworICAgICAgICB9CisgICAgfQorfTsKKwordm9pZCBjdGNfdHhfYWRkX3Rsdihlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqb2FtKQoreworICAgIGN0Y19zdGF0ZSAqY3RjID0gbGlua19zdGF0ZS0+b3JnX3NwZWNfc3RhdGU7CisKKyAgICBpZiAoY3RjICE9IE5VTEwpCisgICAgeworICAgICAgICBzd2l0Y2ggKGN0Yy0+c3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQ1RDX05FR19BRFZFUlRJU0lORzoKKyAgICAgICAgICAgICAgICBvYW0tPnUuaW5mby50bHZzW29hbS0+dS5pbmZvLnRsdnNfY291bnRdLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUM7CisgICAgICAgICAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSA9IGN0Y190eF9hZHZlcnRpc2VfdGx2OworICAgICAgICAgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNfY291bnQrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1RDX05FR19DT05GSVJNSU5HOgorICAgICAgICAgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNbb2FtLT51LmluZm8udGx2c19jb3VudF0udHlwZSA9IEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzsKKyAgICAgICAgICAgICAgICBvYW0tPnUuaW5mby50bHZzW29hbS0+dS5pbmZvLnRsdnNfY291bnRdLnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLm91aSA9CisgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM7CisgICAgICAgICAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmN0Yy5leHRlbnNpb25fc3VwcG9ydCA9CisgICAgICAgICAgICAgICAgICAgIENUQ19FWFRFTlNJT05fU1VQUE9SVDsKKyAgICAgICAgICAgICAgICBvYW0tPnUuaW5mby50bHZzW29hbS0+dS5pbmZvLnRsdnNfY291bnRdLnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuY3RjLnZlcnNpb24gPQorICAgICAgICAgICAgICAgICAgICBjdGMtPnNlbGVjdGVkX3ZlcnNpb247CisgICAgICAgICAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmN0Yy5zdXBwX3ZlcnNpb25fY291bnQgPSAwOworICAgICAgICAgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNbb2FtLT51LmluZm8udGx2c19jb3VudF0udS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5jdGMuc3VwcF92ZXJzaW9uID0gTlVMTDsKKyAgICAgICAgICAgICAgICBvYW0tPnUuaW5mby50bHZzX2NvdW50Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENUQ19ORUdfRE9ORToKKyAgICAgICAgICAgICAgICBicmVhazsgLyogZG9uJ3QgYWRkIGEgVExWICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhFUlJPUiwgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiVW5rbm93biBDVEMgc3RhdGUgJWRcbiIsIGN0Yy0+c3RhdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGN0Y19yeF90bHYoCisgICAgZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsCisgICAgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICpvcmdfc3BlYywKKyAgICBiY21vc19lcnJubyAqcmMpCit7CisgICAgKnJjID0gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKworICAgIGlmIChsaW5rX3N0YXRlLT5vcmdfc3BlY19zdGF0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY3RjX3N0YXRlICpjdGMgPSBsaW5rX3N0YXRlLT5vcmdfc3BlY19zdGF0ZTsKKworICAgICAgICBzd2l0Y2ggKGN0Yy0+c3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQ1RDX05FR19BRFZFUlRJU0lORzoKKyAgICAgICAgICAgICAgICBpZiAoKE5VTEwgPT0gb3JnX3NwZWMpIHx8IChCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDICE9IG9yZ19zcGVjLT5vdWkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkRpZG4ndCBnZXQgQ1RDIGFkdmVydGlzZSBUTFZcbiIpOworICAgICAgICAgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZmluZCBoaWdoZXN0IGNvbW1vbiB2ZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgIGN0Yy0+c2VsZWN0ZWRfdmVyc2lvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8IG9yZ19zcGVjLT51LmN0Yy5zdXBwX3ZlcnNpb25fY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50OF90IGogPSAwOyBqIDwgTlVNX0VMRU0oY3RjX2FkdmVydGlzZWRfdmVyc2lvbnMpOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvcmdfc3BlYy0+dS5jdGMuc3VwcF92ZXJzaW9uW2ldLm91aSA9PSBjdGNfYWR2ZXJ0aXNlZF92ZXJzaW9uc1tqXS5vdWkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmdfc3BlYy0+dS5jdGMuc3VwcF92ZXJzaW9uW2ldLnZlcnNpb24gPT0gY3RjX2FkdmVydGlzZWRfdmVyc2lvbnNbal0udmVyc2lvbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3RjX2FkdmVydGlzZWRfdmVyc2lvbnNbal0udmVyc2lvbiA+IGN0Yy0+c2VsZWN0ZWRfdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RjLT5zZWxlY3RlZF92ZXJzaW9uID0gY3RjX2FkdmVydGlzZWRfdmVyc2lvbnNbal0udmVyc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY3RjLT5zZWxlY3RlZF92ZXJzaW9uID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsgLyogbm8gY29tbW9uIHZlcnNpb24gZm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0Yy0+c3RhdGUgPSBDVENfTkVHX0NPTkZJUk1JTkc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENUQ19ORUdfQ09ORklSTUlORzoKKyAgICAgICAgICAgICAgICBpZiAoKE5VTEwgPT0gb3JnX3NwZWMpIHx8IChCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDICE9IG9yZ19zcGVjLT5vdWkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkRpZG4ndCBnZXQgQ1RDIGNvbmZpcm0gVExWXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcmdfc3BlYy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmdfc3BlYy0+dS5jdGMudmVyc2lvbiAhPSBjdGMtPnNlbGVjdGVkX3ZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0Yy0+c3RhdGUgPSBDVENfTkVHX0RPTkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENUQ19ORUdfRE9ORToKKyAgICAgICAgICAgICAgICBpZiAoKE5VTEwgIT0gb3JnX3NwZWMpICYmIChvcmdfc3BlYy0+b3VpID09IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKAorICAgICAgICAgICAgICAgICAgICAgICAgSU5GTywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiR290IHVuZXhwZWN0ZWQgQ1RDIFRMViBhZnRlciBuZWdvdGlhdGlvblxuIik7CisgICAgICAgICAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChOVUxMICE9IG9yZ19zcGVjKSAmJiAob3JnX3NwZWMtPm91aSA9PSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDKSkKKyAgICAgICAgeworICAgICAgICAgICAgRU9OX0xJTktfTE9HKAorICAgICAgICAgICAgICAgIElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkdvdCB1bmV4cGVjdGVkIENUQyBUTFYgYmVmb3JlIG5lZ290aWF0aW9uXG4iKTsKKyAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICB9CisKKyAgICAgICAgaWYgKExPQ0FMX1NUQUJMRV9SRU1PVEVfU1RBQkxFID09IGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY3RjX3N0YXRlICpjdGMgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGN0Y19zdGF0ZSkpOworICAgICAgICAgICAgY3RjLT5zdGF0ZSA9IENUQ19ORUdfQURWRVJUSVNJTkc7CisgICAgICAgICAgICBsaW5rX3N0YXRlLT5vcmdfc3BlY19zdGF0ZSA9IGN0YzsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvY3RjL2N0Yy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvY3RjL2N0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMTA3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9jdGMvY3RjLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfRU9OX0NUQ19IXworI2RlZmluZSBfQkNNT0xUX0VPTl9DVENfSF8KKwordm9pZCBjdGNfdHhfYWRkX3Rsdihlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqb2FtKTsKKwordm9pZCBjdGNfcnhfdGx2KAorICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLAorICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqb3JnX3NwZWMsCisgICAgYmNtb3NfZXJybm8gKnJjKTsKKworI2VuZGlmIC8vIF9CQ01PTFRfRU9OX0NUQ19IXworCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2Rwb2UvZHBvZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvZHBvZS9kcG9lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwYWNmMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2Rwb2UvZHBvZS5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGllY2VzIG9mIHRoZSBPQU0gbmVnb3RpYXRpb24gc3RhdGUgbWFjaGluZSB0aGF0IGFyZSBzcGVjaWZpYyB0byBEUG9FIE9BTS4gKi8KKworI2luY2x1ZGUgImJjbW9sdF9lb25fcHJpdmF0ZS5oIgorI2luY2x1ZGUgIi4uL29hbV9jb21tb24uaCIKKyNpbmNsdWRlICJkcG9lLmgiCisKKy8qIE9yZyBzcGVjaWZpYyBUTFYgdG8gc2VuZCB0byB0aGUgT05VICovCitzdGF0aWMgY29uc3QgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvIGRwb2VfdHhfdGx2ID0KK3sKKyAgICAub3VpID0gQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0UsCisgICAgLnUgPQorICAgIHsKKyAgICAgICAgLmRwb2UgPQorICAgICAgICB7CisgICAgICAgICAgICAuZHBvZV9pbmZvX3RsdiA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9JTkZPX1RMVl9UWVBFX0RQT0VfT0FNX1NVUFBPUlQsCisgICAgICAgICAgICAgICAgLnUgPQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLmRwb2Vfb2FtX3N1cHBvcnQgPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAuZHBvZV9vYW1fdmVyc2lvbiA9IDB4MTEKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK307CisKK3ZvaWQgZHBvZV90eF9hZGRfdGx2KGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICpvYW0pCit7CisgICAgaWYgKChMT0NBTF9FVkFMX1JFTU9URV9FVkFMID09IGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSkgfHwKKyAgICAgICAgKExPQ0FMX1NUQUJMRV9SRU1PVEVfRVZBTCA9PSBsaW5rX3N0YXRlLT5vYW1fc3RhdGUpKQorICAgIHsKKyAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS50eXBlID0gQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOworICAgICAgICBvYW0tPnUuaW5mby50bHZzW29hbS0+dS5pbmZvLnRsdnNfY291bnRdLnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlID0gZHBvZV90eF90bHY7CisgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNfY291bnQrKzsKKyAgICB9Cit9CisKK3ZvaWQgZHBvZV9yeF90bHYoCisgICAgZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsCisgICAgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICpvcmdfc3BlYywKKyAgICBiY21vc19lcnJubyAqcmMpCit7CisgICAgaWYgKGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSA9PSBMT0NBTF9TVEFCTEVfUkVNT1RFX1NUQUJMRSkKKyAgICB7CisgICAgICAgIGlmIChOVUxMICE9IG9yZ19zcGVjKQorICAgICAgICB7CisgICAgICAgICAgICBFT05fTElOS19MT0coSU5GTywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiR290IHVuZXhwZWN0ZWQgb3JnYW5pemF0aW9uIHNwZWNpZmljIFRMVlxuIik7CisgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoKE5VTEwgPT0gb3JnX3NwZWMpIHx8CisgICAgICAgICAgICAoQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0UgIT0gb3JnX3NwZWMtPm91aSkgfHwKKyAgICAgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9JTkZPX1RMVl9UWVBFX0RQT0VfT0FNX1NVUFBPUlQgIT0gb3JnX3NwZWMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LnR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBFT05fTElOS19MT0coSU5GTywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiRGlkbid0IGdldCBEUG9FIFRMVlxuIik7CisgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3JnX3NwZWMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LnUuZHBvZV9vYW1fc3VwcG9ydC5kcG9lX29hbV92ZXJzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMHgyMjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjE6CisgICAgICAgICAgICAgICAgY2FzZSAweDIwOgorICAgICAgICAgICAgICAgIGNhc2UgMHgxMTogLyogRFBvRSB2MS4wIEkwNSBhbmQgaGlnaGVyICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgwMTogLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHNhbWUgYXMgMHgxMCAqLworICAgICAgICAgICAgICAgIGNhc2UgMHgwMjogLyogcHJlLURQb0UgT0FNLCBubyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgc3VwcG9ydCAqLworICAgICAgICAgICAgICAgIGNhc2UgMHgwMzogLyogcHJlLURQb0UgT0FNLCB3aXRoIENlcnRpZmljYXRlIEF1dGhvcml0eSBzdXBwb3J0ICovCisgICAgICAgICAgICAgICAgY2FzZSAweDEwOiAvKiBEUG9FIHYxLjAgSTA0IGFuZCBsb3dlciAqLworICAgICAgICAgICAgICAgICAgICBFT05fTElOS19MT0coCisgICAgICAgICAgICAgICAgICAgICAgICBXQVJOSU5HLCAmbGlua19zdGF0ZS0+bGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAiRFBvRSBUTFYgY29udGFpbmVkIG9sZCB2ZXJzaW9uOiAldSAoc29tZSBmZWF0dXJlcyBtYXkgbm90IHdvcmspXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LnUuZHBvZV9vYW1fc3VwcG9ydC5kcG9lX29hbV92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDAwOiAvKiB3b3JrYXJvdW5kIGZvciBFQVNXLTE3ODM5ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUk9SLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJEUG9FIFRMViBjb250YWluZWQgYmFkIHZlcnNpb246ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LnUuZHBvZV9vYW1fc3VwcG9ydC5kcG9lX29hbV92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvZHBvZS9kcG9lLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9kcG9lL2Rwb2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZkNmYyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvZHBvZS9kcG9lLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfRU9OX0RQT0VfSF8KKyNkZWZpbmUgX0JDTU9MVF9FT05fRFBPRV9IXworCit2b2lkIGRwb2VfdHhfYWRkX3Rsdihlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqb2FtKTsKKwordm9pZCBkcG9lX3J4X3RsdigKKyAgICBlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwKKyAgICBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKm9yZ19zcGVjLAorICAgIGJjbW9zX2Vycm5vICpyYyk7CisKKyNlbmRpZiAvLyBfQkNNT0xUX0VPTl9EUE9FX0hfCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL29hbV9jb21tb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL29hbV9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDkyYzkyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvb2FtX2NvbW1vbi5jCkBAIC0wLDAgKzEsMzYxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGllY2VzIG9mIHRoZSBPQU0gbmVnb3RpYXRpb24gc3RhdGUgbWFjaGluZSB0aGF0IGFyZSBjb21tb24gdG8gYWxsIE9BTS4gKi8KKworI2luY2x1ZGUgIm9hbV9jb21tb24uaCIKKyNpbmNsdWRlICJiY21vbHRfdXRpbHMuaCIKKyNpbmNsdWRlICJiY21vbHRfbWF0aC5oIgorI2luY2x1ZGUgImJjbW9sdF9lb25fcHJpdmF0ZS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaCIKKyNpbmNsdWRlICJkcG9lL2Rwb2UuaCIKKyNpbmNsdWRlICJicmNtL2JyY20uaCIKKyNpbmNsdWRlICJjdGMvY3RjLmgiCisKK3N0YXRpYyBjb25zdCBvYW1faW5mb19hZGRfdGx2IGFkZF9vcmdfc3BlY190bHZbRU9OX09BTV9TRVRfSURfQ09VTlRdID0KK3sKKyAgICBbRU9OX09BTV9TRVRfSURfRFBPRV0gPSBkcG9lX3R4X2FkZF90bHYsCisgICAgW0VPTl9PQU1fU0VUX0lEX0JSQ01dID0gYnJjbV90eF9hZGRfdGx2LAorICAgIFtFT05fT0FNX1NFVF9JRF9DVENdID0gY3RjX3R4X2FkZF90bHYKK307CisKK3N0YXRpYyBjb25zdCBvYW1fcnhfb3JnX3NwZWNfdGx2IHJ4X29yZ19zcGVjX3RsdltFT05fT0FNX1NFVF9JRF9DT1VOVF0gPQoreworICAgIFtFT05fT0FNX1NFVF9JRF9EUE9FXSA9IGRwb2VfcnhfdGx2LAorICAgIFtFT05fT0FNX1NFVF9JRF9CUkNNXSA9IGJyY21fcnhfdGx2LAorICAgIFtFT05fT0FNX1NFVF9JRF9DVENdID0gY3RjX3J4X3RsdgorfTsKKworc3RhdGljIHVpbnQ4X3QgZ2V0X29hbV92ZXJzaW9uKHZvaWQpCit7CisgICAgcmV0dXJuIDB4MDE7IC8qIG9ubHkgdmVyc2lvbiBjdXJyZW50bHkgc3VwcG9ydGVkICovCit9CisKK3N0YXRpYyB2b2lkIGZpbGxfbG9jYWxfdGx2KGNvbnN0IGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8gKnRsdikKK3sKKyAgICB0bHYtPm9hbV92ZXJzaW9uID0gZ2V0X29hbV92ZXJzaW9uKCk7CisgICAgdGx2LT5yZXZpc2lvbiA9IGxpbmtfc3RhdGUtPnJldmlzaW9uOworICAgIHRsdi0+c3RhdGUgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fU1RBVEVfUEFSU0VSX0FDVElPTjEgfAorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fU1RBVEVfTVVMVElQTEVYRVJfQUNUSU9OOworICAgIHRsdi0+b2FtX2NvbmZpZyA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9MT0NBTF9SRU1PVEVfSU5GT19DT05GSUdfT0FNX01PREUgfAorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fQ09ORklHX1VOSURJUkVDVElPTkFMX1NVUFBPUlQgfAorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fQ09ORklHX0xJTktfRVZFTlRTOworICAgIHRsdi0+bWF4X3BkdV9zaXplID0gbGlua19zdGF0ZS0+bWF4X3BkdV9zaXplOworICAgIHRsdi0+b3VpID0gQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzsKKyAgICB0bHYtPnZlbmRvcl9zcGVjaWZpY19pbmZvcm1hdGlvblswXSA9IDB4MDY7CisgICAgdGx2LT52ZW5kb3Jfc3BlY2lmaWNfaW5mb3JtYXRpb25bMV0gPSAweDg2OworICAgIHRsdi0+dmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uWzJdID0gMHgyMDsKKyAgICB0bHYtPnZlbmRvcl9zcGVjaWZpY19pbmZvcm1hdGlvblszXSA9IDB4QTA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfc3RkX2luZm9fdGx2KGNvbnN0IGVvbl9saW5rX2tleSAqbGlua19rZXksIGNvbnN0IGNoYXIgKnR5cGUsIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyAqaW5mbykKK3sKKyAgICBFT05fTElOS19MT0coCisgICAgICAgIERFQlVHLAorICAgICAgICBsaW5rX2tleSwKKyAgICAgICAgIiVzOiB2ZXIgJTAyeCByZXYgJTA0eCBzdGF0ZSAlMDJ4IGNmZyAlMDJ4IHBkdSAlNXUgb3VpICUwNnggdmVuZG9yICUwMnglMDJ4JTAyeCUwMnhcbiIsCisgICAgICAgIHR5cGUsCisgICAgICAgIGluZm8tPm9hbV92ZXJzaW9uLAorICAgICAgICBpbmZvLT5yZXZpc2lvbiwKKyAgICAgICAgaW5mby0+c3RhdGUsCisgICAgICAgIGluZm8tPm9hbV9jb25maWcsCisgICAgICAgIGluZm8tPm1heF9wZHVfc2l6ZSwKKyAgICAgICAgaW5mby0+b3VpLAorICAgICAgICBpbmZvLT52ZW5kb3Jfc3BlY2lmaWNfaW5mb3JtYXRpb25bMF0sCisgICAgICAgIGluZm8tPnZlbmRvcl9zcGVjaWZpY19pbmZvcm1hdGlvblsxXSwKKyAgICAgICAgaW5mby0+dmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uWzJdLAorICAgICAgICBpbmZvLT52ZW5kb3Jfc3BlY2lmaWNfaW5mb3JtYXRpb25bM10pOworfQorCitzdGF0aWMgdm9pZCBkdW1wX29yZ19zcGVjX3Rsdihjb25zdCBlb25fbGlua19rZXkgKmxpbmtfa2V5LCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKm9yZ19zcGVjKQoreworICAgIHN3aXRjaCAob3JnX3NwZWMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIGlmIChCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfRVhURU5TSU9OX1NVUFBPUlQgPT0gb3JnX3NwZWMtPnUudGVrLnRsdnMudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFT05fTElOS19MT0coCisgICAgICAgICAgICAgICAgICAgIERFQlVHLCBsaW5rX2tleSwgIkJSQ00gRXh0IFN1cHBvcnQ6IHZlciAlMDJ4IHJwdCAlMDJ4IHByZWYgJTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUudGVrLnRsdnMudS5leHRlbnNpb25fc3VwcG9ydC52ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS50ZWsudGx2cy51LmV4dGVuc2lvbl9zdXBwb3J0LnJlcG9ydF9tb2RlLAorICAgICAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS50ZWsudGx2cy51LmV4dGVuc2lvbl9zdXBwb3J0LnByZWZlcnJlZF9yZXBvcnRfbW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIGlmIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9JTkZPX1RMVl9UWVBFX0RQT0VfT0FNX1NVUFBPUlQgPT0gb3JnX3NwZWMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKAorICAgICAgICAgICAgICAgICAgICBERUJVRywgbGlua19rZXksICJEUG9FIFN1cHBvcnQ6IHZlciAlMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS5kcG9lLmRwb2VfaW5mb190bHYudS5kcG9lX29hbV9zdXBwb3J0LmRwb2Vfb2FtX3ZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgICAgICAgICBERUJVRywgbGlua19rZXksICJDVEMgRXh0ZW5zaW9uIFN1cHBvcnQgJXUsIFByZWZlcnJlZCBWZXJzaW9uIDB4JTAyeCwgU3VwcG9ydHMgKCV1KTpcbiIsCisgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUuY3RjLmV4dGVuc2lvbl9zdXBwb3J0LAorICAgICAgICAgICAgICAgIG9yZ19zcGVjLT51LmN0Yy52ZXJzaW9uLAorICAgICAgICAgICAgICAgIG9yZ19zcGVjLT51LmN0Yy5zdXBwX3ZlcnNpb25fY291bnQpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG9yZ19zcGVjLT51LmN0Yy5zdXBwX3ZlcnNpb25fY291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFT05fTElOS19MT0coCisgICAgICAgICAgICAgICAgICAgIERFQlVHLCBsaW5rX2tleSwgIlx0T1VJICUwNngsIFZlcnNpb24gMHglMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS5jdGMuc3VwcF92ZXJzaW9uW2ldLm91aSwgb3JnX3NwZWMtPnUuY3RjLnN1cHBfdmVyc2lvbltpXS52ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRU9OX0xJTktfTE9HKFdBUk5JTkcsIGxpbmtfa2V5LCAiTm8gc3VwcG9ydCBmb3IgJTA2eFxuIiwgb3JnX3NwZWMtPm91aSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfaW5mb19mcmFtZShjb25zdCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbSwgY29uc3QgZW9uX2xpbmtfc3RhdGUqIGxpbmtfc3RhdGUpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGVudG5hbWVbXSA9IHsiT05VIiwiT0xUIn07CisgICAgY2hhciBkYV9idWZbTUFDX1NUUl9MRU5dOworICAgIGNoYXIgc2FfYnVmW01BQ19TVFJfTEVOXTsKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzIGZsYWdzID0gb2FtLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmZsYWdzOworICAgIHVpbnQ4X3QgaXNfb2x0ID0gKDAgPT0gbWVtY21wKGxpbmtfc3RhdGUtPmVwb25fbmlfbWFjX2FkZHIudTgsIG9hbS0+c2EudTgsIEJDTU9TX0VUSF9BTEVOKSk7CisgICAgdWludDhfdCBvbHRfc3RhYiA9IDAgIT0KKyAgICAgICAgKGZsYWdzICYgKGlzX29sdCA/IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfU1RBQkxFIDogQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfU1RBQkxFKSk7CisgICAgdWludDhfdCBvbnVfc3RhYiA9IDAgIT0KKyAgICAgICAgKGZsYWdzICYgKGlzX29sdCA/IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX1NUQUJMRSA6IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfU1RBQkxFKSk7CisgICAgdWludDhfdCBvbHRfZXZhbCA9IDAgIT0KKyAgICAgICAgKGZsYWdzICYgKGlzX29sdCA/IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfRVZBTFVBVElORyA6IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX0VWQUxVQVRJTkcpKTsKKyAgICB1aW50OF90IG9udV9ldmFsID0gMCAhPQorICAgICAgICAoZmxhZ3MgJiAoaXNfb2x0ID8gQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfRVZBTFVBVElORyA6IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfRVZBTFVBVElORykpOworCisgICAgRU9OX0xJTktfTE9HKAorICAgICAgICBERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiZnJvbSAlczogT0xUICVzICBPTlUgJXNcbiIsIGVudG5hbWVbaXNfb2x0XSwKKyAgICAgICAgb2x0X3N0YWIgPyAic3RhYiIgOiAob2x0X2V2YWwgPyAiZXZhbCIgOiAiTk9ORSIpLAorICAgICAgICBvbnVfc3RhYiA/ICJzdGFiIiA6IChvbnVfZXZhbCA/ICJldmFsIiA6ICJOT05FIikpOworCisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICIgICAgICAgICAgICAgICBkYSAgICAgICAgICAgICAgICBzYSAgZXRoIHN1IGZsZ3MgY2RcbiIpOworICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgREVCVUcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIiVzICVzICUwNHggJTAyeCAlMDR4ICUwMnhcbiIsCisgICAgICAgIGJjbW9zX21hY18yX3N0cigmb2FtLT5kYSwgZGFfYnVmKSwgYmNtb3NfbWFjXzJfc3RyKCZvYW0tPnNhLCBzYV9idWYpLAorICAgICAgICBvYW0tPnByb3RvY29sc1swXS5ldGhlcnR5cGUsIG9hbS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS5zdWJ0eXBlLAorICAgICAgICBvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uZmxhZ3MsCisgICAgICAgIG9hbS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LmNvZGUpOworICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgREVCVUcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIlRMVlM6ICgldSlcbiIsCisgICAgICAgIG9hbS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzX2NvdW50KTsKKyAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2c19jb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2c1tpXS50eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX0xPQ0FMOgorICAgICAgICAgICAgICAgIGR1bXBfc3RkX2luZm9fdGx2KAorICAgICAgICAgICAgICAgICAgICAmbGlua19zdGF0ZS0+bGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICJMT0NBTCIsCisgICAgICAgICAgICAgICAgICAgICZvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2c1tpXS51LmxvY2FsLmluZm8pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9SRU1PVEU6CisgICAgICAgICAgICAgICAgZHVtcF9zdGRfaW5mb190bHYoCisgICAgICAgICAgICAgICAgICAgICZsaW5rX3N0YXRlLT5saW5rX2tleSwKKyAgICAgICAgICAgICAgICAgICAgIlJFTU9URSIsCisgICAgICAgICAgICAgICAgICAgICZvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2c1tpXS51LnJlbW90ZS5pbmZvKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgICAgIGR1bXBfb3JnX3NwZWNfdGx2KAorICAgICAgICAgICAgICAgICAgICAmbGlua19zdGF0ZS0+bGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICZvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2c1tpXS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitiY21vc19lcnJubyBidWlsZF90eF9pbmZvX2ZyYW1lKGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCBlb25fZnJhbWVfZGF0YSAqZnJhbWVfZGF0YSkKK3sKKyAgICBiY21vc19ib29sIGhhdmVfcmVtb3RlX2luZm8gPSBsaW5rX3N0YXRlLT5yZW1vdGVfaW5mby5vYW1fdmVyc2lvbiA9PSBnZXRfb2FtX3ZlcnNpb24oKTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lID0ge307CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sID0ge307CisgICAgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgdGx2c1s0XSA9IHt9OworCisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJCVUlMRElORyBJTkZPIEZSQU1FLCBjdXJyZW50IHN0YXRlICUwNHhcbiIsIGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSk7CisKKyAgICBvYW1fZnJhbWUuZGEgPSBzbG93X3Byb3RvY29sX211bHRpY2FzdF9tYWM7CisgICAgb2FtX2ZyYW1lLnNhID0gbGlua19zdGF0ZS0+ZXBvbl9uaV9tYWNfYWRkcjsKKyAgICBvYW1fZnJhbWUucHJvdG9jb2xzX2NvdW50ID0gMTsKKyAgICBvYW1fZnJhbWUucHJvdG9jb2xzID0gJnByb3RvY29sOworICAgIHByb3RvY29sLmV0aGVydHlwZSA9IEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NMT1dfUFJPVE9DT0w7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnN1YnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uZmxhZ3MgPSBsaW5rX3N0YXRlLT5vYW1fc3RhdGU7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQuY29kZSA9IEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk87CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnQgPSAxOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzID0gdGx2czsKKyAgICB0bHZzWzBdLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTDsKKyAgICBmaWxsX2xvY2FsX3RsdihsaW5rX3N0YXRlLCAmdGx2c1swXS51LmxvY2FsLmluZm8pOworICAgIGlmIChoYXZlX3JlbW90ZV9pbmZvKQorICAgIHsKKyAgICAgICAgdGx2c1sxXS50eXBlID0gQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfUkVNT1RFOworICAgICAgICB0bHZzWzFdLnUucmVtb3RlLmluZm8gPSBsaW5rX3N0YXRlLT5yZW1vdGVfaW5mbzsKKyAgICAgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnQrKzsKKyAgICB9CisgICAgYWRkX29yZ19zcGVjX3RsdltsaW5rX3N0YXRlLT5vYW1fc2V0XShsaW5rX3N0YXRlLCAmcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQpOworICAgIHRsdnNbcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnRdLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9FTkQ7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnQrKzsKKworICAgIGR1bXBfaW5mb19mcmFtZSgmb2FtX2ZyYW1lLCBsaW5rX3N0YXRlKTsKKworICAgIHJldHVybiBlcG9uX29hbV9wYWNrX2ZyYW1lKCZvYW1fZnJhbWUsICZmcmFtZV9kYXRhLT5wYXlsb2FkLCAmZnJhbWVfZGF0YS0+bGVuZ3RoKTsKK30KKworLyogT0sgPSBkb25lCisgICBpbl9wcm9ncmVzcyA9IHNlbmQgbmV4dCBmcmFtZQorICAgcGFyc2UgPSBpZ25vcmUKKyAgIG90aGVyID0gc3RvcAorICAgKi8KK2JjbW9zX2Vycm5vIGhhbmRsZV9yeF9pbmZvX2ZyYW1lKGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCB1aW50MTZfdCByeF9sZW5ndGgsIHVpbnQ4X3QgKnJ4X3BheWxvYWQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX0lOX1BST0dSRVNTOworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3Mgc3RhcnRfc3RhdGU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpmcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCAqc3A7CisgICAgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICpvcmdfc3BlYyA9IE5VTEw7CisKKyAgICBzdGFydF9zdGF0ZSA9IGxpbmtfc3RhdGUtPm9hbV9zdGF0ZTsKKyAgICBFT05fTElOS19MT0coREVCVUcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIlJFQ0VJVkVEIElORk8gRlJBTUUsIGN1cnJlbnQgc3RhdGUgJTA0eFxuIiwgc3RhcnRfc3RhdGUpOworCisgICAgZnJhbWUgPSBlcG9uX29hbV91bnBhY2sobGlua19zdGF0ZS0+bGlua19rZXkuZGV2aWNlX2lkLCByeF9sZW5ndGgsIHJ4X3BheWxvYWQpOworCisgICAgaWYgKChmcmFtZS0+cHJvdG9jb2xzX2NvdW50ID09IDApIHx8CisgICAgICAgIChmcmFtZS0+cHJvdG9jb2xzWzBdLmV0aGVydHlwZSAhPSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MKSB8fAorICAgICAgICAoZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUuc3VidHlwZSAhPSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTSkgfHwKKyAgICAgICAgKGZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQuY29kZSAhPSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPKSkKKyAgICB7CisgICAgICAgIC8qIG5vdCBhbiBpbmZvIGZyYW1lLCBpZ25vcmUgKi8KKyAgICAgICAgYmNtb3NfZnJlZShmcmFtZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIGR1bXBfaW5mb19mcmFtZShmcmFtZSwgbGlua19zdGF0ZSk7CisgICAgc3AgPSAmZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWU7CisKKyAgICAvKiBjYXB0dXJlIGxpbmsncyBUTFYgZm9yIHN1YnNlcXVlbnQgcmV0cmFuc21pc3Npb24gKi8KKyAgICBpZiAoKHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzX2NvdW50ID4gMCkgJiYKKyAgICAgICAgKHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzWzBdLnR5cGUgPT0gQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfTE9DQUwpKQorICAgIHsKKyAgICAgICAgbGlua19zdGF0ZS0+cmVtb3RlX2luZm8gPSBzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1swXS51LmxvY2FsLmluZm87CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoZnJhbWUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PTlVfRVJSX1JFU1A7IC8qIG5vIGxvY2FsIGluZm8gKi8KKyAgICB9CisKKyAgICBpZiAoMCAhPSBtZW1jbXAoZnJhbWUtPmRhLnU4LCBzbG93X3Byb3RvY29sX211bHRpY2FzdF9tYWMudTgsIHNpemVvZihzbG93X3Byb3RvY29sX211bHRpY2FzdF9tYWMpKSkKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgIEVPTl9MSU5LX0xPRyhXQVJOSU5HLCAmbGlua19zdGF0ZS0+bGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICAiREEgbWlzbWF0Y2ggIkJDTU9TX01BQ0FERFJfRk1UX1NUUiIgZXhwZWN0ZWQgdnMuICJCQ01PU19NQUNBRERSX0ZNVF9TVFIiIGFjdHVhbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIEJDTU9TX01BQ0FERFJfUEFSQU1TKCZzbG93X3Byb3RvY29sX211bHRpY2FzdF9tYWMpLCBCQ01PU19NQUNBRERSX1BBUkFNUygmZnJhbWUtPmRhKSk7CisgICAgfQorCisgICAgaWYgKDAgIT0gbWVtY21wKGZyYW1lLT5zYS51OCwgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LmxpbmsubWFjX2FkZHJlc3MsIHNpemVvZihmcmFtZS0+c2EpKSkKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgIEVPTl9MSU5LX0xPRyhXQVJOSU5HLCAmbGlua19zdGF0ZS0+bGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICAiU0EgbWlzbWF0Y2ggIkJDTU9TX01BQ0FERFJfRk1UX1NUUiIgIGV4cGVjdGVkIHZzLiAiQkNNT1NfTUFDQUREUl9GTVRfU1RSIiBhY3R1YWxcbiIsCisgICAgICAgICAgICAgICAgICAgICBCQ01PU19NQUNBRERSX1BBUkFNUygmbGlua19zdGF0ZS0+bGlua19rZXkubGluay5tYWNfYWRkcmVzcyksIEJDTU9TX01BQ0FERFJfUEFSQU1TKCZmcmFtZS0+c2EpKTsKKyAgICB9CisKKyAgICBpZiAoc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbMF0udS5sb2NhbC5pbmZvLm9hbV92ZXJzaW9uICE9IGdldF9vYW1fdmVyc2lvbigpKQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgRU9OX0xJTktfTE9HKFdBUk5JTkcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIm9hbSB2ZXJzaW9uIG1pc21hdGNoIDB4JTAyeCBleHBlY3RlZCB2cy4gMHglMDJ4IGFjdHVhbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGdldF9vYW1fdmVyc2lvbigpLCBzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1swXS51LmxvY2FsLmluZm8ub2FtX3ZlcnNpb24pOworICAgIH0KKworICAgIC8qIElzIHRoZSBmYXIgZW5kIGVjaG9pbmcgdGhlIFRMViB3ZSBzZW50PyAqLworICAgIGlmICgoc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnQgPiAxKSAmJgorICAgICAgICAoc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbMV0udHlwZSA9PSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9SRU1PVEUpKQorICAgIHsKKyAgICAgICAgaWYgKHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzWzBdLnUubG9jYWwuaW5mby5tYXhfcGR1X3NpemUgIT0KKyAgICAgICAgICAgIHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzWzFdLnUucmVtb3RlLmluZm8ubWF4X3BkdV9zaXplKQorICAgICAgICB7CisgICAgICAgICAgICBsaW5rX3N0YXRlLT5tYXhfcGR1X3NpemUgPSBNSU4oCisgICAgICAgICAgICAgICAgc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbMF0udS5sb2NhbC5pbmZvLm1heF9wZHVfc2l6ZSwKKyAgICAgICAgICAgICAgICBzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1sxXS51LnJlbW90ZS5pbmZvLm1heF9wZHVfc2l6ZSk7CisgICAgICAgICAgICBsaW5rX3N0YXRlLT5yZXZpc2lvbisrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvIGxvY190bHYgPSB7fTsKKyAgICAgICAgICAgIGZpbGxfbG9jYWxfdGx2KGxpbmtfc3RhdGUsICZsb2NfdGx2KTsKKyAgICAgICAgICAgIGlmICgwID09IG1lbWNtcCgmbG9jX3RsdiwgJnNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzWzFdLnUucmVtb3RlLmluZm8sIHNpemVvZihsb2NfdGx2KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlua19zdGF0ZS0+b2FtX3N0YXRlID0gKGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSB8IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfU1RBQkxFKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKH5CQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX0VWQUxVQVRJTkcpOworICAgICAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAic2V0dGluZyBMT0NBTCBTVEFCTEUgZmxhZ1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKFdBUk5JTkcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIlJlbW90ZSBUTFYgZnJvbSBPTlUgZG9lcyBOT1QgbWF0Y2ggd2hhdCB3ZSBzZW50XG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzcC0+dS5vYW0uZmxhZ3MgJiBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX0VWQUxVQVRJTkcpCisgICAgeworICAgICAgICBsaW5rX3N0YXRlLT5vYW1fc3RhdGUgPSAobGlua19zdGF0ZS0+b2FtX3N0YXRlIHwgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfRVZBTFVBVElORykgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAofkJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX1NUQUJMRSk7CisgICAgICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAic2V0dGluZyBSRU1PVEUgRVZBTCBmbGFnXG4iKTsKKyAgICB9CisKKyAgICBpZiAoc3AtPnUub2FtLmZsYWdzICYgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MT0NBTF9TVEFCTEUpCisgICAgeworICAgICAgICBsaW5rX3N0YXRlLT5vYW1fc3RhdGUgPSAobGlua19zdGF0ZS0+b2FtX3N0YXRlIHwgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfU1RBQkxFKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh+QkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfRVZBTFVBVElORyk7CisgICAgICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAic2V0dGluZyBSRU1PVEUgU1RBQkxFIGZsYWdcbiIpOworICAgIH0KKworICAgIGlmIChMT0NBTF9TVEFCTEVfUkVNT1RFX1NUQUJMRSA9PSBsaW5rX3N0YXRlLT5vYW1fc3RhdGUpCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfT0s7IC8qIGJhc2ljIG5lZ290aWF0aW9uIGNvbXBsZXRlICovCisgICAgfQorCisgICAgaWYgKChzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c19jb3VudCA+IDIpICYmCisgICAgICAgIChzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1syXS50eXBlID09IEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQykpCisgICAgeworICAgICAgICBvcmdfc3BlYyA9ICZzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1syXS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZTsKKyAgICB9CisgICAgcnhfb3JnX3NwZWNfdGx2W2xpbmtfc3RhdGUtPm9hbV9zZXRdKGxpbmtfc3RhdGUsIG9yZ19zcGVjLCAmcmMpOworCisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJzdGF0ZSAlMDR4IC0+ICUwNHggKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgc3RhcnRfc3RhdGUsIGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKworICAgIGJjbW9zX2ZyZWUoZnJhbWUpOworCisgICAgcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9vYW1fY29tbW9uLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9vYW1fY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmMDhiMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL29hbV9jb21tb24uaApAQCAtMCwwICsxLDU2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGllY2VzIG9mIHRoZSBPQU0gbmVnb3RpYXRpb24gc3RhdGUgbWFjaGluZSB0aGF0IGFyZSBjb21tb24gdG8gYWxsIE9BTS4gKi8KKworI2lmbmRlZiBfT0FNX0NPTU1PTl9IXworI2RlZmluZSBfT0FNX0NPTU1PTl9IXworCisjaW5jbHVkZSAiYmNtb2x0X2Vvbl9wcml2YXRlLmgiCisKKyNkZWZpbmUgTE9DQUxfRVZBTF9SRU1PVEVfRVZBTFwKKyAgICAoQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MT0NBTF9FVkFMVUFUSU5HIHwgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfRVZBTFVBVElORykKKyNkZWZpbmUgTE9DQUxfU1RBQkxFX1JFTU9URV9FVkFMXAorICAgIChCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX1NUQUJMRSB8IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX0VWQUxVQVRJTkcpCisjZGVmaW5lIExPQ0FMX1NUQUJMRV9SRU1PVEVfU1RBQkxFXAorICAgIChCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX1NUQUJMRSB8IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX1NUQUJMRSkKKwordHlwZWRlZiB2b2lkICgqb2FtX2luZm9fYWRkX3RsdikoZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgKm9hbSk7CisKK3R5cGVkZWYgdm9pZCAoKm9hbV9yeF9vcmdfc3BlY190bHYpKAorICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLAorICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqb3JnX3NwZWMsCisgICAgYmNtb3NfZXJybm8gKnJjKTsKKworYmNtb3NfZXJybm8gYnVpbGRfdHhfaW5mb19mcmFtZShlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgZW9uX2ZyYW1lX2RhdGEgKmZyYW1lX2RhdGEpOworCitiY21vc19lcnJubyBoYW5kbGVfcnhfaW5mb19mcmFtZShlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgdWludDE2X3QgcnhfbGVuZ3RoLCB1aW50OF90ICpyeF9wYXlsb2FkKTsKKworI2VuZGlmIC8vIF9PQU1fQ09NTU9OX0gKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmMTBmMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIyBFUE9OIEhvc3QgRHJpdmVuIEVuY3J5cHRpb24NCisNCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikNCisNCisJTU9EX05BTUUgPSBiY21fdXNlcl9hcHBsX2Vwb25faGRlDQorCU1PRF9UWVBFID0gbGliDQorCU1PRF9ERVBTID0gaG9zdF9hcGkNCisNCisJc3JjcyA9IGJjbW9sdF9lcG9uX2hkZS5jIGVuY3J5cHRfb2FtLmMNCisNCitlbmRpZg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvYmNtb2x0X2Vwb25faGRlLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2JjbW9sdF9lcG9uX2hkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwY2IwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2JjbW9sdF9lcG9uX2hkZS5jCkBAIC0wLDAgKzEsNjkzIEBACisvKgorIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworIG9mIHRoZSBzb2Z0d2FyZS4KKworIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgd3JpdHRlbiBjb25zZW50LgorCisgOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbWNsaV9zZXNzaW9uLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZ19wYWNrLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxlbmNyeXB0X29hbS5oPgorI2luY2x1ZGUgPG9hbV9kZWZzLmg+CisjaW5jbHVkZSAiYmNtb2x0X2Vwb25faGRlLmgiCisKKyNkZWZpbmUgSERFX1RBU0tfTVNHX1FfU0laRSA2NAorI2RlZmluZSBFTkNfS0VZX0xFTkdUSF9LRVkgMTYKKyNkZWZpbmUgSERFX01BWF9OVU1fTElOS1MgNTEyCisjZGVmaW5lIEtFWV9FWENIQU5HRV9QRVJJT0QgMTUKKwordHlwZWRlZiBlbnVtCit7CisgICAgSERFX0VWRU5UX0VOQUJMRV9FTkNSWVBUSU9OLAorICAgIEhERV9FVkVOVF9ESVNBQkxFX0VOQ1JZUFRJT04sCisgICAgSERFX0VWRU5UX0ZSQU1FX1JYLAorICAgIEhERV9FVkVOVF9PQU1fVElNRU9VVCwKKyAgICBIREVfRVZFTlRfX05VTV9PRgorfSBoZGVfZXZlbnQ7CisKK3R5cGVkZWYgZW51bQoreworICAgIEhERV9TVEFURV9OT1RfRU5DUllQVEVELAorICAgIEhERV9TVEFURV9FTkNSWVBURUQsCisgICAgSERFX1NUQVRFX1dBSVRJTkdfRk9SX09BTV9BQ0ssCisgICAgSERFX1NUQVRFX19OVU1fT0YKK30gaGRlX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX21zZyBvc19tc2c7CisgICAgYmNtb2x0X21zZyAqcng7CisgICAgaGRlX2tleSBrZXk7CisgICAgaGRlX2V2ZW50IGV2ZW50OworfSBoZGVfdGFza19tc2c7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaGRlX2tleSBoZGVfbGluazsKKyAgICBoZGVfc3RhdGUgc3RhdGU7CisgICAgYmNtb3NfdGltZXIgb2FtX3RpbWVvdXRfdGltZXI7CisgICAgYmNtb2x0X2Vwb25fbGlua19yYXRlIGxpbmtfcmF0ZTsKKyAgICBiY21vbHRfZXBvbl9sbGlkIGxsaWQ7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgY29ycmVzcG9uZGluZ19wb25fcG9ydF9tYWM7Cit9IGhkZV9saW5rX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgICBiY21vc190YXNrIHRhc2s7CisgICAgZGV2X2xvZ19pZCBsb2dfaWRbQkNNVFJfTUFYX09MVFNdOworICAgIGhkZV9saW5rX2RhdGEgKmxpbmtzOworICAgIHVpbnQxNl90IG51bV9saW5rczsKK30gaGRlX2RhdGE7CisKK3N0YXRpYyBiY21vc19ib29sIGlzX3J1bm5pbmcgPSBCQ01PU19GQUxTRTsKKwordHlwZWRlZiB2b2lkICgqbGlua19zdGF0ZV9oYW5kbGVyKShoZGVfbGlua19kYXRhICpoZGVfbGluaywgY29uc3QgYmNtb2x0X21zZyAqaW5kKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9zdGF0ZV9zdHJpbmcoaGRlX3N0YXRlIHN0YXRlKQoreworICAgIHN3aXRjaCAoc3RhdGUpCisgICAgeworICAgIGNhc2UgSERFX1NUQVRFX05PVF9FTkNSWVBURUQ6CisgICAgICAgIHJldHVybiAibm90IGVuY3J5cHRlZCI7CisgICAgY2FzZSBIREVfU1RBVEVfRU5DUllQVEVEOgorICAgICAgICByZXR1cm4gImVuY3J5cHRlZCI7CisgICAgY2FzZSBIREVfU1RBVEVfV0FJVElOR19GT1JfT0FNX0FDSzoKKyAgICAgICAgcmV0dXJuICJ3YWl0aW5nIGZvciBvYW0gYWNrIjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlVOS05PV04gU1RBVEUhISEiOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHNldF9uZXdfa2V5KGNvbnN0IGhkZV9rZXkgKmhkZV9saW5rLCBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgKm5ld19rZXksIGJjbW9sdF9lcG9uX2tleV9jaG9pY2Uga2V5X2Nob2ljZSwgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIG1vZGUpCit7CisgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgbGlua19jZmc7CisgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgZW5jcnlwdGlvbl9jb25maWcgPSB7IH07CisKKyAgICAvLyBVcC9kb3duIGZvcm1hdCBtdXN0IG1hdGNoIGV2ZW4gd2hlbiBkb2luZyBEUyBvbmx5CisgICAgZW5jcnlwdGlvbl9jb25maWcudXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgPSBuZXdfa2V5LT5mb3JtYXQ7CisKKyAgICBlbmNyeXB0aW9uX2NvbmZpZy5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24gPSAqbmV3X2tleTsKKyAgICBlbmNyeXB0aW9uX2NvbmZpZy5kb3duc3RyZWFtX2tleV9jaG9pY2UgPSBrZXlfY2hvaWNlOworICAgIGVuY3J5cHRpb25fY29uZmlnLmRvd25zdHJlYW1fbW9kZSA9IG1vZGU7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgbGlua19rZXkgPQorICAgIHsKKyAgICAgICAgLmVwb25fbmkgPSBoZGVfbGluay0+ZXBvbl9uaSwKKyAgICAgICAgLm1hY19hZGRyZXNzID0gaGRlX2xpbmstPm1hY19hZGRyCisgICAgfTsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIGxpbmtfa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZsaW5rX2NmZywgZXBvbl9saW5rLCBlcG9uX2VuY3J5cHRpb24sIGVuY3J5cHRpb25fY29uZmlnKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoaGRlX2xpbmstPmRldmljZV9pZCwgJmxpbmtfY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBzZXRfcG9uX2VuY3J5cHRpb25faWZfbmVlZGVkKGNvbnN0IGhkZV9rZXkgKmhkZV9saW5rKQoreworICAgIC8vIEZpcnN0IGNoZWNrIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBQT04ncyBlbmNyeXB0aW9uIG1vZGUuCisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2Vwb25fbmlfY2ZnIHBvbl9jZmc7CisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IHBvbl9rZXkgPSB7IC5lcG9uX25pID0gaGRlX2xpbmstPmVwb25fbmkgfTsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJnBvbl9jZmcsIGVwb25fbmksIHBvbl9rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJnBvbl9jZmcsIGVwb25fbmksIGVuY3J5cHRpb25fY2ZnKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGhkZV9saW5rLT5kZXZpY2VfaWQsICZwb25fY2ZnLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmRldmljZV9pZF0sICJGYWlsdXJlIC0gQ2Fubm90IHF1ZXJ5IFBPTiBlbmNyeXB0aW9uIG1vZGUhLlxuIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAocG9uX2NmZy5kYXRhLmVuY3J5cHRpb25fY2ZnLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlICE9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTKQorICAgIHsKKyAgICAgICAgLy8gRW5jcnlwdGlvbiBtb2RlIGlzIG5vdCBjb3JyZWN0bHkgc2V0IG9uIHRoZSBQT04sIHNvIHNldCBpdCBub3cuCisgICAgICAgIHBvbl9jZmcuZGF0YS5lbmNyeXB0aW9uX2NmZy5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTOworICAgICAgICBwb25fY2ZnLmRhdGEuZW5jcnlwdGlvbl9jZmcudXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047CisgICAgICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoaGRlX2xpbmstPmRldmljZV9pZCwgJnBvbl9jZmcuaGRyKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFtoZGVfbGluay0+ZGV2aWNlX2lkXSwgIkZhaWx1cmUgLSBDYW5ub3Qgc2V0IFBPTiBlbmNyeXB0aW9uIG1vZGUhLlxuIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSBnZXRfbGlua19yYXRlKGNvbnN0IGhkZV9rZXkgKmhkZV9saW5rKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9sdF9lcG9uX2xpbmtfY2ZnIGxpbmtfY2ZnOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5ID0KKyAgICB7CisgICAgICAgIC5lcG9uX25pID0gaGRlX2xpbmstPmVwb25fbmksCisgICAgICAgIC5tYWNfYWRkcmVzcyA9IGhkZV9saW5rLT5tYWNfYWRkcgorICAgIH07CisgICAgQkNNT0xUX0NGR19JTklUKCZsaW5rX2NmZywgZXBvbl9saW5rLCBsaW5rX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmbGlua19jZmcsIGVwb25fbGluaywgbGlua19yYXRlKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGhkZV9saW5rLT5kZXZpY2VfaWQsICZsaW5rX2NmZy5oZHIpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRygKKyAgICAgICAgICAgIEVSUk9SLAorICAgICAgICAgICAgaGRlX2RhdGEubG9nX2lkW2hkZV9saW5rLT5kZXZpY2VfaWRdLAorICAgICAgICAgICAgIkZhaWx1cmUgLSBjYW5ub3QgcXVlcnkgbGluayByYXRlIGZvciBsaW5rICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IS5cbiIsCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMF0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMV0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMl0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbM10sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbNF0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbNV0pOworICAgIH0KKyAgICByZXR1cm4gbGlua19jZmcuZGF0YS5saW5rX3JhdGU7Cit9CisKK3N0YXRpYyBiY21vc19tYWNfYWRkcmVzcyBnZXRfcG9uX21hYyhjb25zdCBoZGVfa2V5ICpoZGVfbGluaykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZXBvbl9uaV9jZmcgcG9uX2NmZzsKKyAgICBiY21vbHRfZXBvbl9uaV9rZXkgcG9uX2tleSA9IHsgLmVwb25fbmkgPSBoZGVfbGluay0+ZXBvbl9uaSB9OworICAgIEJDTU9MVF9DRkdfSU5JVCgmcG9uX2NmZywgZXBvbl9uaSwgcG9uX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmcG9uX2NmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MpOworICAgIHJjID0gYmNtb2x0X2NmZ19nZXQoaGRlX2xpbmstPmRldmljZV9pZCwgJnBvbl9jZmcuaGRyKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFtoZGVfbGluay0+ZGV2aWNlX2lkXSwgIkZhaWx1cmUgLSBDYW5ub3QgcXVlcnkgUE9OIG1hYyBhZGRyZXNzIS5cbiIpOworICAgIH0KKyAgICByZXR1cm4gcG9uX2NmZy5kYXRhLm1hY19hZGRyZXNzOworfQorCitzdGF0aWMgYmNtb2x0X2Vwb25fbGxpZCBnZXRfbGxpZChjb25zdCBoZGVfa2V5ICpoZGVfbGluaykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBsaW5rX2NmZzsKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSA9CisgICAgeworICAgICAgICAuZXBvbl9uaSA9IGhkZV9saW5rLT5lcG9uX25pLAorICAgICAgICAubWFjX2FkZHJlc3MgPSBoZGVfbGluay0+bWFjX2FkZHIKKyAgICB9OworICAgIEJDTU9MVF9DRkdfSU5JVCgmbGlua19jZmcsIGVwb25fbGluaywgbGlua19rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIGxsaWQpOworICAgIHJjID0gYmNtb2x0X2NmZ19nZXQoaGRlX2xpbmstPmRldmljZV9pZCwgJmxpbmtfY2ZnLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKAorICAgICAgICAgICAgRVJST1IsCisgICAgICAgICAgICBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmRldmljZV9pZF0sCisgICAgICAgICAgICAiRmFpbHVyZSAtIGNhbm5vdCBxdWVyeSBMTElEIGZvciBsaW5rICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IS5cbiIsCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMF0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMV0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMl0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbM10sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbNF0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbNV0pOworICAgIH0KKyAgICByZXR1cm4gbGlua19jZmcuZGF0YS5sbGlkOworfQorCisvKiBCeSBzcGVjIHRoZSBTQ0kgaXMgdGhlIExMSUQgb2YgdGhlIGxpbmsgYXBwZW5kZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZXBvbiBwb3J0IG1hYyBhZGRyZXNzICovCitzdGF0aWMgdm9pZCBjcmVhdGVfc2NpKGNvbnN0IGJjbW9zX21hY19hZGRyZXNzICplcG9uX3BvcnRfbWFjLCBiY21vbHRfZXBvbl9sbGlkIGxsaWQsIHVpbnQ4X3QgKnNjaSkKK3sKKyAgICBzY2lbN10gPSAodWludDhfdCkgbGxpZDsKKyAgICBzY2lbNl0gPSAodWludDhfdCkgKGxsaWQgPj4gOCk7CisgICAgc2NpWzVdID0gZXBvbl9wb3J0X21hYy0+dThbNV07CisgICAgc2NpWzRdID0gZXBvbl9wb3J0X21hYy0+dThbNF07CisgICAgc2NpWzNdID0gZXBvbl9wb3J0X21hYy0+dThbM107CisgICAgc2NpWzJdID0gZXBvbl9wb3J0X21hYy0+dThbMl07CisgICAgc2NpWzFdID0gZXBvbl9wb3J0X21hYy0+dThbMV07CisgICAgc2NpWzBdID0gZXBvbl9wb3J0X21hYy0+dThbMF07Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9ub3RfZW5jcnlwdGVkX2VuYWJsZV9lbmNyeXB0aW9uKGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgZHBvZV9lbmNyeXB0X21vZGUgbW9kZSA9IERQT0VfRU5DUllQVF9NT0RFX05PTkU7CisgICAgLy8gUmV0cmVpdmUgdXNlZnVsIGxpbmsgaW5mbyBhbmQgc3RvcmUgaXQgdG8gc2F2ZSBtZXNzYWdlcyBsYXRlci4KKyAgICBoZGVfbGluay0+bGlua19yYXRlID0gZ2V0X2xpbmtfcmF0ZSgmaGRlX2xpbmstPmhkZV9saW5rKTsKKyAgICBoZGVfbGluay0+Y29ycmVzcG9uZGluZ19wb25fcG9ydF9tYWMgPSBnZXRfcG9uX21hYygmaGRlX2xpbmstPmhkZV9saW5rKTsKKyAgICBoZGVfbGluay0+bGxpZCA9IGdldF9sbGlkKCZoZGVfbGluay0+aGRlX2xpbmspOworCisgICAgaWYgKGhkZV9saW5rLT5saW5rX3JhdGUgPT0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU4gfHwgaGRlX2xpbmstPmxpbmtfcmF0ZSA9PSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORSkKKyAgICB7CisgICAgICAgIG1vZGUgPSBEUE9FX0VOQ1JZUFRfTU9ERV8xMERPV047CisgICAgfQorICAgIGVsc2UgaWYgKGhkZV9saW5rLT5saW5rX3JhdGUgPT0gQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkUpCisgICAgeworICAgICAgICBtb2RlID0gRFBPRV9FTkNSWVBUX01PREVfMURPV047CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFtoZGVfbGluay0+aGRlX2xpbmsuZGV2aWNlX2lkXSwgIkZhaWx1cmUgLSBVTktOT1dOIExJTksgUkFURSEhIS5cbiIpOworICAgIH0KKworICAgIGRwb2VfZW5jcnlwdF9vYW1fc2V0X3JlcXVlc3Rfc2VuZCgKKyAgICAgICAgJmhkZV9saW5rLT5oZGVfbGluaywKKyAgICAgICAgS0VZX0VYQ0hBTkdFX1BFUklPRCwKKyAgICAgICAgbW9kZSwKKyAgICAgICAgaGRlX2xpbmstPmNvcnJlc3BvbmRpbmdfcG9uX3BvcnRfbWFjKTsKKworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZoZGVfbGluay0+b2FtX3RpbWVvdXRfdGltZXIsIEhERV9FTkFCTEVfT0FNX1dBSVRfVVMgKyBPQU1fVElNRU9VVF9HUkFDRV9QRVJJT0RfVVMpOworCisgICAgaGRlX2xpbmstPnN0YXRlID0gSERFX1NUQVRFX1dBSVRJTkdfRk9SX09BTV9BQ0s7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9lbmNyeXB0ZWRfZGlzYWJsZV9lbmNyeXB0aW9uKGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGVtcHR5X2tleSA9IHsgfTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8vIFR1cm4gb2ZmIGVuY3J5cHRpb24gb24gdGhlIGVtYmVkZGVkIHNpZGUuCisgICAgcmMgPSBzZXRfbmV3X2tleSgmaGRlX2xpbmstPmhkZV9saW5rLCAmZW1wdHlfa2V5LCBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8wLCBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmhkZV9saW5rLmRldmljZV9pZF0sCisgICAgICAgICAgICAiRmFpbHVyZSAtIENhbm5vdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBlbWJlZGRlZCEuXG4iKTsKKyAgICB9CisKKyAgICAvLyBTZW5kIHRoZSBkaXNhYmxlIE9BTSB0byB0aGUgbGluay4gRG9uJ3QgYm90aGVyIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UuCisgICAgZHBvZV9lbmNyeXB0X29hbV9zZXRfcmVxdWVzdF9zZW5kKCZoZGVfbGluay0+aGRlX2xpbmssIDAsIERQT0VfRU5DUllQVF9NT0RFX05PTkUsIGdldF9wb25fbWFjKCZoZGVfbGluay0+aGRlX2xpbmspKTsKKworICAgIGhkZV9saW5rLT5zdGF0ZSA9IEhERV9TVEFURV9OT1RfRU5DUllQVEVEOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfZW5jcnlwdGVkX2ZyYW1lX3J4KGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCAqZnJhbWVfY2FwdHVyZWQgPSAoY29uc3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopIGluZDsKKyAgICB1aW50OF90IG5ld19rZXlbMTZdOworICAgIGJjbW9sdF9lcG9uX2tleV9jaG9pY2Uga2V5X2Nob2ljZTsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIga2V5X2Zvcl9lbWJlZGRlZDsKKyAgICByYyA9IGRwb2VfZW5jcnlwdF9vYW1fcGFyc2VfbmV3X2tleSgmZnJhbWVfY2FwdHVyZWQtPmRhdGEuZnJhbWUsIG5ld19rZXksICZrZXlfY2hvaWNlKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8vIE5vdCBhIERQb0UgbmV3IGtleSwgaWdub3JlIGl0CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaGRlX2xpbmstPmxpbmtfcmF0ZSA9PSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTiB8fCBoZGVfbGluay0+bGlua19yYXRlID09IEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fT05FKQorICAgIHsKKyAgICAgICAgdWludDhfdCBzY2lbOF07CisgICAgICAgIGNyZWF0ZV9zY2koJmhkZV9saW5rLT5jb3JyZXNwb25kaW5nX3Bvbl9wb3J0X21hYywgaGRlX2xpbmstPmxsaWQsIHNjaSk7CisgICAgICAgIGtleV9mb3JfZW1iZWRkZWQuZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOworICAgICAgICBtZW1jcHkoa2V5X2Zvcl9lbWJlZGRlZC51LmN0ci5rZXksIG5ld19rZXksIHNpemVvZihuZXdfa2V5KSk7CisgICAgICAgIG1lbWNweShrZXlfZm9yX2VtYmVkZGVkLnUuY3RyLnNjaSwgc2NpLCBzaXplb2Yoc2NpKSk7CisgICAgfQorICAgIGVsc2UgaWYgKGhkZV9saW5rLT5saW5rX3JhdGUgPT0gQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkUpCisgICAgeworICAgICAgICBrZXlfZm9yX2VtYmVkZGVkLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjsKKyAgICAgICAgbWVtY3B5KGtleV9mb3JfZW1iZWRkZWQudS5jZmIua2V5LCBuZXdfa2V5LCBzaXplb2YobmV3X2tleSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmhkZV9saW5rLmRldmljZV9pZF0sICJGYWlsdXJlIC0gVU5LTk9XTiBMSU5LIFJBVEUhISEuXG4iKTsKKyAgICB9CisKKyAgICByYyA9IHNldF9uZXdfa2V5KCZoZGVfbGluay0+aGRlX2xpbmssICZrZXlfZm9yX2VtYmVkZGVkLCBrZXlfY2hvaWNlLCBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUyk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmhkZV9saW5rLmRldmljZV9pZF0sCisgICAgICAgICAgICAiRmFpbHVyZSAtIENhbm5vdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBlbWJlZGRlZCEuXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV93YWl0aW5nX2Zvcl9vYW1fYWNrX29hbV90aW1lb3V0KGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgaGRlX2RhdGEubG9nX2lkW2hkZV9saW5rLT5oZGVfbGluay5kZXZpY2VfaWRdLCAiRmFpbHVyZSAtIE5vIHJlc3BvbnNlIHRvIGluaXRpYWwgT0FNLlxuIik7CisgICAgaGRlX2xpbmstPnN0YXRlID0gSERFX1NUQVRFX05PVF9FTkNSWVBURUQ7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV93YWl0aW5nX2Zvcl9vYW1fYWNrX2ZyYW1lX3J4KGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCAqZnJhbWVfY2FwdHVyZWQgPSAoY29uc3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopIGluZDsKKyAgICB1aW50OF90IGVuY3J5cHRfbW9kZV9yZXNwb25zZTsKKyAgICB1aW50OF90IGtleV9leHBpcnlfcmVzcG9uc2U7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IGRwb2VfZW5jcnlwdF9vYW1fcGFyc2Vfc2V0X3Jlc3BvbnNlKCZmcmFtZV9jYXB0dXJlZC0+ZGF0YS5mcmFtZSwgJmVuY3J5cHRfbW9kZV9yZXNwb25zZSwgJmtleV9leHBpcnlfcmVzcG9uc2UpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLy8gTm90IGEgZW5jcnlwdGlvbiBzZXQgcmVwb25zZSwgaWdub3JlIGl0CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiAwIHJlcHJlc2VudHMgJ25vIGVycm9yJy4gKi8KKyAgICBpZiAoKGVuY3J5cHRfbW9kZV9yZXNwb25zZSAhPSAwKSB8fCAoa2V5X2V4cGlyeV9yZXNwb25zZSAhPSAwKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFtoZGVfbGluay0+aGRlX2xpbmsuZGV2aWNlX2lkXSwKKyAgICAgICAgICAgICJGYWlsdXJlIC0gVGhlIGxpbmsgcmVmdXNlZCBvbmUgb2YgdGhlIHJlcXVlc3RlZCBUTFZzLlxuIik7CisgICAgICAgIGhkZV9saW5rLT5zdGF0ZSA9IEhERV9TVEFURV9OT1RfRU5DUllQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSBhbiBhcHByb3ByaWF0ZSByZXNwb25zZSwgc28gbW92ZSBvbiBub3JtYWxseS4KKyAgICBiY21vc190aW1lcl9zdG9wKCZoZGVfbGluay0+b2FtX3RpbWVvdXRfdGltZXIpOworICAgIGhkZV9saW5rLT5zdGF0ZSA9IEhERV9TVEFURV9FTkNSWVBURUQ7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV93YWl0aW5nX2Zvcl9vYW1fYWNrX2Rpc2FibGVfZW5jcnlwdGlvbihoZGVfbGlua19kYXRhICpoZGVfbGluaywgY29uc3QgYmNtb2x0X21zZyAqaW5kKQoreworICAgIGhkZV9saW5rLT5zdGF0ZSA9IEhERV9TVEFURV9OT1RfRU5DUllQVEVEOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfaWdub3JlKGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgLy8gTGl0ZXJhbGx5IGRvIG5vdGhpbmcKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2Vycm9yKGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgaGRlX2RhdGEubG9nX2lkW2hkZV9saW5rLT5oZGVfbGluay5kZXZpY2VfaWRdLCAiVW5leHBlY3RlZCBldmVudCBpbiBzdGF0ZSAlc1xuIiwKKyAgICAgICAgZ2V0X3N0YXRlX3N0cmluZyhoZGVfbGluay0+c3RhdGUpKTsKK30KKworc3RhdGljIGxpbmtfc3RhdGVfaGFuZGxlciBsaW5rX3N0YXRlX21hY2hpbmVbSERFX1NUQVRFX19OVU1fT0ZdW0hERV9FVkVOVF9fTlVNX09GXSA9Cit7CisgICAgW0hERV9TVEFURV9OT1RfRU5DUllQVEVEXSA9CisgICAgeworICAgICAgICBbSERFX0VWRU5UX0VOQUJMRV9FTkNSWVBUSU9OXSA9IGhhbmRsZV9ub3RfZW5jcnlwdGVkX2VuYWJsZV9lbmNyeXB0aW9uLAorICAgICAgICBbSERFX0VWRU5UX0RJU0FCTEVfRU5DUllQVElPTl0gPSBoYW5kbGVfZXJyb3IsCisgICAgICAgIFtIREVfRVZFTlRfRlJBTUVfUlhdID0gaGFuZGxlX2lnbm9yZSwKKyAgICAgICAgW0hERV9FVkVOVF9PQU1fVElNRU9VVF0gPSBoYW5kbGVfaWdub3JlLAorICAgIH0sCisgICAgW0hERV9TVEFURV9FTkNSWVBURURdID0KKyAgICB7CisgICAgICAgIFtIREVfRVZFTlRfRU5BQkxFX0VOQ1JZUFRJT05dID0gaGFuZGxlX2Vycm9yLAorICAgICAgICBbSERFX0VWRU5UX0RJU0FCTEVfRU5DUllQVElPTl0gPSBoYW5kbGVfZW5jcnlwdGVkX2Rpc2FibGVfZW5jcnlwdGlvbiwKKyAgICAgICAgW0hERV9FVkVOVF9GUkFNRV9SWF0gPSBoYW5kbGVfZW5jcnlwdGVkX2ZyYW1lX3J4LAorICAgICAgICBbSERFX0VWRU5UX09BTV9USU1FT1VUXSA9IGhhbmRsZV9pZ25vcmUsCisgICAgfSwKKyAgICBbSERFX1NUQVRFX1dBSVRJTkdfRk9SX09BTV9BQ0tdID0KKyAgICB7CisgICAgICAgIFtIREVfRVZFTlRfRU5BQkxFX0VOQ1JZUFRJT05dID0gaGFuZGxlX2Vycm9yLAorICAgICAgICBbSERFX0VWRU5UX0RJU0FCTEVfRU5DUllQVElPTl0gPSBoYW5kbGVfd2FpdGluZ19mb3Jfb2FtX2Fja19kaXNhYmxlX2VuY3J5cHRpb24sCisgICAgICAgIFtIREVfRVZFTlRfRlJBTUVfUlhdID0gaGFuZGxlX3dhaXRpbmdfZm9yX29hbV9hY2tfZnJhbWVfcngsCisgICAgICAgIFtIREVfRVZFTlRfT0FNX1RJTUVPVVRdID0gaGFuZGxlX3dhaXRpbmdfZm9yX29hbV9hY2tfb2FtX3RpbWVvdXQsCisgICAgfQorfTsKKworc3RhdGljIGludDMyX3QgZmluZF90YWJsZV9pbmRleChjb25zdCBoZGVfa2V5ICpoZGVfbGluaykKK3sKKyAgICB1aW50MTZfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBoZGVfZGF0YS5udW1fbGlua3M7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChtZW1jbXAoaGRlX2xpbmssICZoZGVfZGF0YS5saW5rc1tpXSwgc2l6ZW9mKCpoZGVfbGluaykpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2xpbmtfZnJvbV90YWJsZShpbnQzMl90IGxpbmtfaW5kZXgpCit7CisgICAgaW50MzJfdCBpOworICAgIGZvciAoaSA9IGxpbmtfaW5kZXg7IGkgPCBoZGVfZGF0YS5udW1fbGlua3MgLSAxOyArK2kpCisgICAgeworICAgICAgICAvKiBCYWNrd2FyZHMgY29weSBhbGwgZGF0YSBleHBlY3QgZm9yIHRoZSB0aW1lciBoYW5kbGUgKi8KKyAgICAgICAgaGRlX2RhdGEubGlua3NbaV0uaGRlX2xpbmsgPSBoZGVfZGF0YS5saW5rc1tpICsgMV0uaGRlX2xpbms7CisgICAgICAgIGhkZV9kYXRhLmxpbmtzW2ldLmxpbmtfcmF0ZSA9IGhkZV9kYXRhLmxpbmtzW2kgKyAxXS5saW5rX3JhdGU7CisgICAgICAgIGhkZV9kYXRhLmxpbmtzW2ldLmxsaWQgPSBoZGVfZGF0YS5saW5rc1tpICsgMV0ubGxpZDsKKyAgICAgICAgaGRlX2RhdGEubGlua3NbaV0uc3RhdGUgPSBoZGVfZGF0YS5saW5rc1tpICsgMV0uc3RhdGU7CisgICAgfQorICAgIC8qIGFsc28gY2xlYXIgdGhlIHN0YXRlIG9mIHRoZSBub3cgZW1wdHkgbGluayAqLworICAgIGhkZV9kYXRhLmxpbmtzW2hkZV9kYXRhLm51bV9saW5rcyAtIDFdLnN0YXRlID0gSERFX1NUQVRFX05PVF9FTkNSWVBURUQ7CisgICAgaGRlX2RhdGEubnVtX2xpbmtzLS07Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9zdGF0ZV9tYWNoaW5lKGludDMyX3QgbGlua19pbmRleCwgY29uc3QgaGRlX3Rhc2tfbXNnICp0YXNrX21zZykKK3sKKyAgICBpZiAobGlua19pbmRleCA8IDApIC8vIFdlIGRvbid0IGtub3cgb2YgdGhpcyBsaW5rIHlldC4KKyAgICB7CisgICAgICAgIGlmIChoZGVfZGF0YS5udW1fbGlua3MgPT0gSERFX01BWF9OVU1fTElOS1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFt0YXNrX21zZy0+a2V5LmRldmljZV9pZF0sICJGYWlsdXJlIC0gQ2Fubm90IGFkZCBhbnkgbW9yZSBsaW5rcyEuXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmtfaW5kZXggPSBoZGVfZGF0YS5udW1fbGlua3M7CisgICAgICAgIGhkZV9kYXRhLmxpbmtzW2xpbmtfaW5kZXhdLmhkZV9saW5rID0gdGFza19tc2ctPmtleTsKKyAgICAgICAgbGlua19zdGF0ZV9tYWNoaW5lW2hkZV9kYXRhLmxpbmtzW2xpbmtfaW5kZXhdLnN0YXRlXVt0YXNrX21zZy0+ZXZlbnRdKCZoZGVfZGF0YS5saW5rc1tsaW5rX2luZGV4XSwgdGFza19tc2ctPnJ4KTsKKworICAgICAgICBpZiAoaGRlX2RhdGEubGlua3NbbGlua19pbmRleF0uc3RhdGUgIT0gSERFX1NUQVRFX05PVF9FTkNSWVBURUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbGluayBkaWQgbm90IGVuZCBpbiB0aGUgc3RhdGUgJ25vdCBlbmNyeXB0ZWQnLCBzbyB3ZSBuZWVkIHRvIHN0YXJ0IHRyYWNraW5nIGhpbS4KKyAgICAgICAgICAgICsraGRlX2RhdGEubnVtX2xpbmtzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLy8gV2UgYWxyZWFkeSBrbm93IG9mIHRoaXMgbGluay4KKyAgICB7CisgICAgICAgIGxpbmtfc3RhdGVfbWFjaGluZVtoZGVfZGF0YS5saW5rc1tsaW5rX2luZGV4XS5zdGF0ZV1bdGFza19tc2ctPmV2ZW50XSgmaGRlX2RhdGEubGlua3NbbGlua19pbmRleF0sIHRhc2tfbXNnLT5yeCk7CisKKyAgICAgICAgaWYgKGhkZV9kYXRhLmxpbmtzW2xpbmtfaW5kZXhdLnN0YXRlID09IEhERV9TVEFURV9OT1RfRU5DUllQVEVEKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgbGluayBoYXMgaXMgbm8gbG9uZ2VyIGVuY3J5cHRlZCBzbyBsZXRzIGZvcmdldCBhYm91dCBoaW0uCisgICAgICAgICAgICByZW1vdmVfbGlua19mcm9tX3RhYmxlKGxpbmtfaW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoZGVfaGFuZGxlX2V2ZW50KGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqb3NfbXNnKQoreworICAgIGhkZV90YXNrX21zZyAqdGFza19tc2cgPSAoaGRlX3Rhc2tfbXNnICopIG9zX21zZzsKKworICAgIGludDMyX3QgbGlua19pbmRleDsKKworICAgIGxpbmtfaW5kZXggPSBmaW5kX3RhYmxlX2luZGV4KCZ0YXNrX21zZy0+a2V5KTsKKyAgICBydW5fc3RhdGVfbWFjaGluZShsaW5rX2luZGV4LCB0YXNrX21zZyk7CisKKyAgICBpZiAodGFza19tc2ctPnJ4ICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbXNnX2ZyZWUodGFza19tc2ctPnJ4KTsKKyAgICB9CisgICAgYmNtb3NfZnJlZSh0YXNrX21zZyk7Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBvYW1fcmVzcG9uc2VfdGltZW91dChiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBoZGVfdGFza19tc2cgKnRhc2tfbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqdGFza19tc2cpKTsKKworICAgIEJVR19VTkxFU1ModGFza19tc2cpOworCisgICAgdGFza19tc2ctPmtleSA9IGhkZV9kYXRhLmxpbmtzW2RhdGFdLmhkZV9saW5rOworICAgIHRhc2tfbXNnLT5ldmVudCA9IEhERV9FVkVOVF9PQU1fVElNRU9VVDsKKyAgICB0YXNrX21zZy0+b3NfbXNnLmhhbmRsZXIgPSBoZGVfaGFuZGxlX2V2ZW50OworCisgICAgYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9IREUsICZ0YXNrX21zZy0+b3NfbXNnLCBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGhkZV9zZXRfZW5jcnlwdGlvbihoZGVfa2V5KiBrZXksIGJjbW9zX2Jvb2wgZW5hYmxlZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBoZGVfdGFza19tc2cgKnRhc2tfbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqdGFza19tc2cpKTsKKworICAgIEJVR19VTkxFU1ModGFza19tc2cpOworCisgICAgdGFza19tc2ctPmtleSA9ICprZXk7CisgICAgdGFza19tc2ctPmV2ZW50ID0gZW5hYmxlZCA/IEhERV9FVkVOVF9FTkFCTEVfRU5DUllQVElPTiA6IEhERV9FVkVOVF9ESVNBQkxFX0VOQ1JZUFRJT047CisgICAgdGFza19tc2ctPm9zX21zZy5oYW5kbGVyID0gaGRlX2hhbmRsZV9ldmVudDsKKworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9IREUsICZ0YXNrX21zZy0+b3NfbXNnLCBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOworICAgIEJVR19PTihyYyAhPSBCQ01fRVJSX09LKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBoZGVfY2xpX2VuYWJsZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgaGRlX2tleSBrZXkgPQorICAgIHsKKyAgICAgICAgLmRldmljZV9pZCA9IGN1cnJlbnRfZGV2aWNlLAorICAgICAgICAuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkoYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS5udW1iZXIpLAorICAgICAgICAubWFjX2FkZHIgPSAoYmNtb3NfbWFjX2FkZHJlc3MpKGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYykKKyAgICB9OworCisgICAgcmMgPSBzZXRfcG9uX2VuY3J5cHRpb25faWZfbmVlZGVkKCZrZXkpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICByZXR1cm4gaGRlX3NldF9lbmNyeXB0aW9uKCZrZXksIEJDTU9TX1RSVUUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gaGRlX2NsaV9kaXNhYmxlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGhkZV9rZXkga2V5ID0KKyAgICB7CisgICAgICAgIC5kZXZpY2VfaWQgPSBjdXJyZW50X2RldmljZSwKKyAgICAgICAgLmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpKGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUubnVtYmVyKSwKKyAgICAgICAgLm1hY19hZGRyID0gKGJjbW9zX21hY19hZGRyZXNzKShiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWMpCisgICAgfTsKKworICAgIHJldHVybiBoZGVfc2V0X2VuY3J5cHRpb24oJmtleSwgQkNNT1NfRkFMU0UpOworfQorCisvLyBwdWJsaWMgaW5kaWNhdGlvbiBoYW5kbGVyIGludGVyZmFjZSAtLSBjYWxsZWQgaW4gdHJhbnNwb3J0IGxheWVyIGNvbnRleHQKK2JjbW9zX2Vycm5vIGJjbW9sdF9lcG9uX2hkZV9wcm9jZXNzX3J4KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIHVpbnQ4X3QgaW5zdGFuY2UsIGJjbW9sdF9wcm94eV9yeCAqcngpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQqIGFjdHVhbF9yeDsKKyAgICBoZGVfdGFza19tc2cgKnRhc2tfbXNnOworICAgIGhkZV9rZXkga2V5OworCisgICAgaWYgKCFpc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgLy8gV2Ugb25seSBsb29rIGF0IG1lc3NhZ2UgdGFyZ2V0dGluZyBlcG9uIGxpbmtzLgorICAgIGlmIChyeC0+aGRyLm9ial90eXBlICE9IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LKQorICAgIHsKKyAgICAgICAgLy8gTm90IGFuIGVycm9yLCB3ZSBqdXN0IGRvbid0IGNhcmUgYWJvdXQgdGhpcyBvYmplY3QuCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkga2luZCBvZiBwcm94eSBSWCBjdXJyZW50bHkgc3VwcG9ydGVkLgorICAgIGlmIChyeC0+aGRyLnN1Ymdyb3VwICE9IEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfRlJBTUVfQ0FQVFVSRUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHNhZmUgZHVlIHRvIHRoZSBhYm92ZSBzdWJncm91cCBjaGVjay4KKyAgICBhY3R1YWxfcnggPSAoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopIHJ4OworICAgIGtleS5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisgICAga2V5LmVwb25fbmkgPSBpbnN0YW5jZTsKKyAgICBrZXkubWFjX2FkZHIgPSBhY3R1YWxfcngtPmtleS5tYWNfYWRkcmVzczsKKworICAgIHRhc2tfbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqdGFza19tc2cpKTsKKyAgICBpZiAodGFza19tc2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZyAqcnhfY2xvbmUgPSBOVUxMOworICAgICAgICByYyA9IGJjbW9sdF9tc2dfY2xvbmUoJnJ4X2Nsb25lLCAmcngtPmhkcik7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19mcmVlKHRhc2tfbXNnKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgICAgICBhY3R1YWxfcnggPSAoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopIHJ4X2Nsb25lOworCisgICAgICAgIHRhc2tfbXNnLT5yeCA9IHJ4X2Nsb25lOworICAgICAgICB0YXNrX21zZy0+a2V5ID0ga2V5OworICAgICAgICB0YXNrX21zZy0+ZXZlbnQgPSBIREVfRVZFTlRfRlJBTUVfUlg7CisgICAgICAgIHRhc2tfbXNnLT5vc19tc2cuaGFuZGxlciA9IGhkZV9oYW5kbGVfZXZlbnQ7CisgICAgICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9IREUsICZ0YXNrX21zZy0+b3NfbXNnLCBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgaGRlX2RhdGEubG9nX2lkW2RldmljZV9pZF0sICJNZXNzYWdlIHNlbmQgZmFpbGVkIVxuIik7CisgICAgICAgICAgICBiY21vbHRfbXNnX2ZyZWUocnhfY2xvbmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIGJjbW9sdF9lcG9uX2hkZV9hcHBsX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZGlyX25hbWUgPSAiaGRlIjsKKworICAgIGlmIChiY21jbGlfZGlyX2ZpbmQodG9wX2RpciwgZGlyX25hbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJjbWNsaV9lbnRyeSAqZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgZGlyX25hbWUsICJFUE9OIE9BTSBuZWdvdGlhdGlvbiBjb21tYW5kcyIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJVR19PTihkaXIgPT0gTlVMTCk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoCisgICAgICAgIGRpciwKKyAgICAgICAgImVuYWJsZSIsCisgICAgICAgICJFbmFibGUgZW5jcnlwdGlvbiBmb3IgYW4gRVBPTiBsaW5rIiwKKyAgICAgICAgaGRlX2NsaV9lbmFibGUsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgIk1BQyBhZGRyZXNzIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoCisgICAgICAgIGRpciwKKyAgICAgICAgImRpc2FibGUiLAorICAgICAgICAiRGlzYWJsZSBlbmNyeXB0aW9uIGZvciBhbiBFUE9OIGxpbmsiLAorICAgICAgICBoZGVfY2xpX2Rpc2FibGUsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgIk1BQyBhZGRyZXNzIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7Cit9CisKK3ZvaWQgYmNtb2x0X2Vwb25faGRlX2FwcGxfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICB1aW50MzJfdCBpOworCisgICAgYmNtb3NfdGFza19wYXJtIHRhc2tfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gInVzZXJfYXBwbF9oZGUiLAorICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9FUE9OX0hERSwKKyAgICAgICAgLmNvcmUgPSBCQ01PU19DUFVfQ09SRV9BTlksIC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgICAgICAuaW5pdF9oYW5kbGVyID0gTlVMTAorICAgIH07CisKKyAgICBiY21vc190aW1lcl9wYXJtIHRpbWVyX3Bhcm0gPQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAib2FtX3RpbWVvdXRfdGltZXIiLAorICAgICAgICAub3duZXIgPSBCQ01PU19NT0RVTEVfSURfTk9ORSwKKyAgICAgICAgLnBlcmlvZGljID0gQkNNT1NfRkFMU0UsCisgICAgICAgIC5oYW5kbGVyID0gb2FtX3Jlc3BvbnNlX3RpbWVvdXQKKyAgICB9OworCisgICAgaWYgKGlzX3J1bm5pbmcpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaXNfcnVubmluZyA9IEJDTU9TX1RSVUU7CisKKyAgICBmb3IgKGk9MDsgaTxCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgIHsKKyAgICAgICAgY2hhciBsb2dfbmFtZVtNQVhfREVWX0xPR19JRF9OQU1FXTsKKyAgICAgICAgc25wcmludGYobG9nX25hbWUsIHNpemVvZihsb2dfbmFtZSktMSwgInVzZXJfYXBwbF9oZGVfJWQiLCBpKTsKKyAgICAgICAgaGRlX2RhdGEubG9nX2lkW2ldID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX25hbWUsIERFVl9MT0dfTEVWRUxfRVJST1IsIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICB9CisKKyAgICBoZGVfZGF0YS5saW5rcyA9IGJjbW9zX2NhbGxvYyhIREVfTUFYX05VTV9MSU5LUyAqIHNpemVvZihoZGVfZGF0YS5saW5rc1swXSkpOworICAgIEJVR19PTihoZGVfZGF0YS5saW5rcyA9PSBOVUxMKTsKKworICAgIHJjID0gYmNtb3NfdGFza19jcmVhdGUoJmhkZV9kYXRhLnRhc2ssICZ0YXNrX3BhcmFtcyk7CisgICAgQlVHX09OKHJjICE9IEJDTV9FUlJfT0spOworCisgICAgYmNtb3NfbW9kdWxlX3Bhcm0gbW9kdWxlX3BhcmFtcyA9CisgICAgeworICAgICAgICAucXBhcm0gPSB7IC5uYW1lID0gInVzZXJfYXBwbF9oZGUiLCAuc2l6ZSA9IEhERV9UQVNLX01TR19RX1NJWkUgfQorICAgIH07CisgICAgcmMgPSBiY21vc19tb2R1bGVfY3JlYXRlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9IREUsICZoZGVfZGF0YS50YXNrLCAmbW9kdWxlX3BhcmFtcyk7CisgICAgQlVHX09OKHJjICE9IEJDTV9FUlJfT0spOworCisgICAgZm9yIChpID0gMDsgaSA8IEhERV9NQVhfTlVNX0xJTktTOyArK2kpCisgICAgeworICAgICAgICB0aW1lcl9wYXJtLmRhdGEgPSBpOworICAgICAgICByYyA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmaGRlX2RhdGEubGlua3NbaV0ub2FtX3RpbWVvdXRfdGltZXIsICZ0aW1lcl9wYXJtKTsKKyAgICAgICAgQlVHX09OKHJjICE9IEJDTV9FUlJfT0spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvYmNtb2x0X2Vwb25faGRlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2JjbW9sdF9lcG9uX2hkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlN2Y5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2JjbW9sdF9lcG9uX2hkZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgb2YgdGhlIHNvZnR3YXJlLgorCisgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyB3cml0dGVuIGNvbnNlbnQuCisKKyA6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX0VQT05fSERFX0hfCisjZGVmaW5lIEJDTU9MVF9FUE9OX0hERV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9sdF91dGlscy5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcjsKK30gaGRlX2tleTsKKworLy8gaW5pdGlhbGl6ZSB0aGUgRVBPTiBPQU0gbmVnb3RpYXRpb24gYXBwbGljYXRpb24gKHNob3VsZCBiZSBjYWxsZWQgYXMgcGFydCBvZiB1c2VyIGFwcGxpY2F0aW9uIHN0YXJ0dXApCit2b2lkIGJjbW9sdF9lcG9uX2hkZV9hcHBsX2luaXQodm9pZCk7CisKKy8vIHByb2Nlc3MgYW4gaW5kaWNhdGlvbi4KK2JjbW9zX2Vycm5vIGJjbW9sdF9lcG9uX2hkZV9wcm9jZXNzX3J4KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIHVpbnQ4X3QgaW5zdGFuY2UsIGJjbW9sdF9wcm94eV9yeCAqcngpOworCisvLyBpbml0aWFsaXplIEhERSBDTEkKK3ZvaWQgYmNtb2x0X2Vwb25faGRlX2FwcGxfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmIC8qIEJDTU9MVF9FUE9OX0hERV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9lbmNyeXB0X29hbS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9lbmNyeXB0X29hbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWY2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2VuY3J5cHRfb2FtLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgb2YgdGhlIHNvZnR3YXJlLgorCisgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyB3cml0dGVuIGNvbnNlbnQuCisKKyA6PgorICovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfYXBpLmgiCisjaW5jbHVkZSAib2FtX2RlZnMuaCIKKyNpbmNsdWRlICJiY21vbHRfbWF0aC5oIgorI2luY2x1ZGUgPGVuY3J5cHRfb2FtLmg+CisKK3N0YXRpYyBjb25zdCBiY21vc19tYWNfYWRkcmVzcyBzbG93X3Byb3RfbWNhc3RfbWFjID0KK3sKKyAgICAudTggPSB7IDB4MDEsIDB4ODAsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDIgfQorfTsKKworc3RhdGljIHVpbnQ4X3Qgb2FtX2J1ZmZlcltPQU1fTUFYX1BBQ0tFVF9TSVpFXTsKKworc3RhdGljIGJjbW9zX2Jvb2wgb2FtX3Zhcl9hZGRfdGx2X2hlYWRlcihiY21vbHRfYnVmICpidWYsIG9hbV92YXJfYnJhbmNoIGJyYW5jaCwgdWludDE2X3QgbGVhZiwgdWludDhfdCBsZW4pCit7CisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7CisgICAgdWludDhfdCAqc25hcCA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKTsKKworICAgIG9rID0gb2sgJiYgKGxlbiA8PSBPQU1fTUFYX1RMVl9MRU5HVEgpOworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSBicmFuY2gpOworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoYnVmLCBsZWFmKTsKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBvYW1fdmFyX3Rsdl9sZW5ndGhfZW5jb2RlKGxlbikpOworICAgIG9rID0gb2sgJiYgKGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgPj0gbGVuKTsKKyAgICBpZiAoIW9rKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBzbmFwKTsKKyAgICB9CisgICAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBkcG9lX2VuY3J5cHRfdGx2X2FkZChiY21vbHRfYnVmICpvYW1idWYsIHVpbnQxNl90IHBlcmlvZCwgZHBvZV9lbmNyeXB0X21vZGUgbW9kZSkKK3sKKyAgICBiY21vc19ib29sIG9rID0gQkNNT1NfVFJVRTsKKworICAgIC8vIGVuY3J5cHRpb24gbW9kZSBUTFYKKyAgICBvayA9IG9rICYmIG9hbV92YXJfYWRkX3Rsdl9oZWFkZXIob2FtYnVmLCBPQU1fVkFSX0JSQU5DSF9EUE9FX0FUVFJJQlVURSwgKHVpbnQxNl90KSBPQU1fRFBPRV9BVFRSX0VOQ1JZUFRfTU9ERSwgMSk7CisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3U4KG9hbWJ1ZiwgKHVpbnQ4X3QpIG1vZGUpOworCisgICAgLyogS2V5IEV4cGlyeSBUaW1lIFRMViAqLworICAgIG9rID0gb2sgJiYgb2FtX3Zhcl9hZGRfdGx2X2hlYWRlcihvYW1idWYsIE9BTV9WQVJfQlJBTkNIX0RQT0VfQVRUUklCVVRFLCAodWludDE2X3QpIE9BTV9EUE9FX0FUVFJfS0VZX0VYUElSWV9USU1FLCAyKTsKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKG9hbWJ1ZiwgcGVyaW9kKTsKKworICAgIHJldHVybiBvazsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgb2FtX3BkdV9idWlsZF9jb21tb24oYmNtb3NfbWFjX2FkZHJlc3MgcG9uX21hYywgYmNtb2x0X2J1ZiAqb3V0YnVmKQoreworICAgIGJjbW9zX2Jvb2wgb2sgPSBCQ01PU19UUlVFOworCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKG91dGJ1Ziwgc2xvd19wcm90X21jYXN0X21hYyk7ICAgICAgICAvLyBEQQorICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhvdXRidWYsIHBvbl9tYWMpOyAgICAgICAgICAgICAgICAgICAgLy8gU0EKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKG91dGJ1ZiwgRVRIRVJUWVBFX1NMT1dQUk9UT0NPTFMpOyAgICAgICAgIC8vIFR5cGUKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0YnVmLCAodWludDhfdCkgU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTSk7IC8vIFN1YnR5cGUKKworICAgIHJldHVybiBvazsKK30KKworLyogU2VuZHMgT0FNIGZyYW1lICdmcmFtZScgdG8gYSBsaW5rIHZpYSB0aGUgaW5qZWN0IGZyYW1lIG9wZXJhdGlvbiAqLworc3RhdGljIGJjbW9zX2Jvb2wgb2FtX3BkdV90cmFuc21pdChjb25zdCBoZGVfa2V5KiBoZGVfbGluaywgdWludDhfdCAqZnJhbWUsIHVpbnQxNl90IGxlbikKK3sKKyAgICBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lICBpbmplY3RfZnJhbWU7CisKKyAgICBvYW1fZnJhbWUuZnJhbWVfb2N0ZXRzLmxlbiA9IGxlbjsKKyAgICBvYW1fZnJhbWUuZnJhbWVfb2N0ZXRzLnZhbCA9IGZyYW1lOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5ID0KKyAgICB7CisgICAgICAgIC5lcG9uX25pID0gaGRlX2xpbmstPmVwb25fbmksCisgICAgICAgIC5tYWNfYWRkcmVzcyA9IGhkZV9saW5rLT5tYWNfYWRkcgorICAgIH07CisKKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmaW5qZWN0X2ZyYW1lLCBlcG9uX2xpbmssIGluamVjdF9mcmFtZSwgbGlua19rZXkpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmaW5qZWN0X2ZyYW1lLCBlcG9uX2xpbmssIGluamVjdF9mcmFtZSwgZnJhbWUsIG9hbV9mcmFtZSk7CisgICAgaWYgKGJjbW9sdF9wcm94eV9zZW5kKGhkZV9saW5rLT5kZXZpY2VfaWQsICZpbmplY3RfZnJhbWUuaGRyKSAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBvYW1fdmFyX2dldF9uZXh0KGJjbW9sdF9idWYgKmJ1Ziwgb2FtX3Zhcl9nZW5lcmljICpvYW12YXIpCit7CisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7CisgICAgdWludDhfdCBicmFuY2ggPSBPQU1fVkFSX0JSQU5DSF9URVJNSU5BVElPTjsKKworICAgIG1lbXNldChvYW12YXIsIDAsIHNpemVvZigqb2FtdmFyKSk7CisgICAgb2sgPSBvayAmJiAoYmNtb2x0X2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAhPSAwKTsKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZicmFuY2gpOyAvLyBSZWFkIHRoZSBicmFuY2guCisgICAgaWYgKG9rKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChicmFuY2gpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBPQU1fVkFSX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgIGNhc2UgT0FNX1ZBUl9CUkFOQ0hfQUNUSU9OOgorICAgICAgICBjYXNlIE9BTV9WQVJfQlJBTkNIX0RQT0VfQUNUOgorICAgICAgICBjYXNlIE9BTV9WQVJfQlJBTkNIX0RQT0VfQVRUUklCVVRFOgorICAgICAgICBjYXNlIE9BTV9WQVJfQlJBTkNIX0RQT0VfT0JKRUNUOgorICAgICAgICAgICAgb2FtdmFyLT5icmFuY2ggPSAob2FtX3Zhcl9icmFuY2gpIGJyYW5jaDsKKyAgICAgICAgICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICZvYW12YXItPmxlYWYpOyAvLyBSZWFkIGxlYWYKKyAgICAgICAgICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm9hbXZhci0+d2lkdGgpOyAvLyBSZWFkIFdpZHRoCisgICAgICAgICAgICBvYW12YXItPnZhbHVlID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpOyAvLyBLZWVwIHRoZSBwb3NpdGlvbiBvZiB2YWx1ZQorICAgICAgICAgICAgb2FtdmFyLT53aWR0aCA9IG9hbV92YXJfdGx2X2xlbmd0aF9lbmNvZGUob2FtdmFyLT53aWR0aCk7IC8vIFJlLWVuY29kZSB3aWR0aCB2aWEgT0FNIHNwZWMKKyAgICAgICAgICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9za2lwKGJ1Ziwgb2FtdmFyLT53aWR0aCk7IC8vIFNraXAgYSAnd2lkdGgnIGFtb3VudAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPQU1fVkFSX0JSQU5DSF9URVJNSU5BVElPTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG9rID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9za2lwKGJ1Ziwgb2FtdmFyLT53aWR0aCk7CisgICAgcmV0dXJuIG9rOworfQorCisvKiBMb29wcyB0aHJvdWdoICdvYW1fcmVzcCcgbG9va2luZyBmb3IgdGhlIHByb3ZpZGVkIGJyYW5jaC9sZWFmLiBJZiBmb3VuZCBpdCB3aWxsIHJldHVybiBpdC4gKi8KK3N0YXRpYyBiY21vc19ib29sIG9hbV92YXJfZ2V0X2JyYW5jaF9sZWFmKHVpbnQ4X3QgKm9hbV9yZXNwLCB1aW50MzJfdCBvYW1fcmVzcF9sZW4sIG9hbV92YXJfYnJhbmNoIGJyYW5jaCwgdWludDE2X3QgbGVhZiwgb2FtX3Zhcl9nZW5lcmljICpvYW1fdmFyKQoreworICAgIGJjbW9sdF9idWYgYnVmOworICAgIG9hbV92YXJfZ2VuZXJpYyB2YXI7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1Ziwgb2FtX3Jlc3BfbGVuLCBvYW1fcmVzcCwgKGJjbW9zX2VuZGlhbikgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworCisgICAgd2hpbGUgKG9hbV92YXJfZ2V0X25leHQoJmJ1ZiwgJnZhcikpIC8vIEtlZXAgZ29pbmcgdGhyb3VnaCBhbGwgT0FNIHZhcnMuCisgICAgeworICAgICAgICBpZiAoKHZhci5icmFuY2ggPT0gYnJhbmNoKSAmJiAodmFyLmxlYWYgPT0gbGVhZikpIC8vIENoZWNrIHRvIHNlZSBpdCBpcyB0aGUgb25lIHdlIGFyZSBsb29raW5nIGZvci4KKyAgICAgICAgeworICAgICAgICAgICAgKm9hbV92YXIgPSB2YXI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIG9hbV9wYXJzZV90b19kcG9lX29wY29kZShiY21vbHRfYnVmICpidWYsIG9hbV9kcG9lX29wY29kZSBvcGNvZGUpCit7CisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7CisgICAgdWludDI0X3QgZHBvZV9vdWkgPSB7IC5sb3dfaGkgPSB7IC5oaSA9IDB4MDAsIC5taWQgPSAweDEwLCAubG93ID0gMHgwMCB9IH07CisgICAgdWludDE2X3QgdTE2OworICAgIHVpbnQ4X3QgdTg7CisgICAgdWludDI0X3QgdTI0OworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9za2lwKGJ1ZiwgMTIpOyAvLyBTa2lwIGJvdGggbWFjIGFkZHJlc3NlcworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICZ1MTYpOyAvLyBSZWFkIGV0aGVydHlwZQorICAgIG9rID0gb2sgJiYgdTE2ID09IEVUSEVSVFlQRV9TTE9XUFJPVE9DT0xTOyAvLyBNYWtlIHN1cmUgaXQgaXMgc2xvdyBwcm90b2NvbAorICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnU4KTsgLy8gUmVhZCB0aGUgc3VidHlwZQorICAgIG9rID0gb2sgJiYgdTggPT0gU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTTsgLy8gTWFrZSBzdXJlIGl0IGlzIE9BTQorICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9za2lwKGJ1ZiwgMik7IC8vIFNraXAgZmxhZ3MKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZ1OCk7IC8vIFJlYWQgdGhlIGNvZGUKKyAgICBvayA9IG9rICYmIHU4ID09IE9BTV9QRFVfQ09ERV9PUkdfRVhUOyAvLyBNYWtlIHN1cmUgaXQgaXMgb3JnYW5pemF0aW9uIHNwZWNpZmljCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3JlYWRfdTI0KGJ1ZiwgJnUyNCk7IC8vIFJlYWQgdGhlIE9VSQorICAgIG9rID0gb2sgJiYgbWVtY21wKCZkcG9lX291aSwgJnUyNCwgc2l6ZW9mKHVpbnQyNF90KSkgPT0gMDsgLy8gTWFrZSBzdXJlIGl0IGlzIHRoZSBEUG9FIE9VSQorICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnU4KTsgLy8gUmVhZCB0aGUgb3Bjb2RlCisgICAgb2sgPSBvayAmJiBvcGNvZGUgPT0gdTg7IC8vIE1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSBwcm92aWRlZCBvcGNvZGUKKyAgICByZXR1cm4gb2s7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2VfZW5jcnlwdF9vYW1fc2V0X3JlcXVlc3Rfc2VuZChjb25zdCBoZGVfa2V5ICpoZGVfbGluaywgdWludDE2X3QgcGVyaW9kLCBkcG9lX2VuY3J5cHRfbW9kZSBlbmNyeXB0X21vZGUsIGJjbW9zX21hY19hZGRyZXNzIHBvbl9tYWMpCit7CisgICAgLy8gc2VuZCB0aGUgZW5jcnlwdCBtb2RlIGFuZCBrZXkgZXhwaXJ5IHRpbWUgVExWcyB0byBPTlUuCisgICAgYmNtb2x0X2J1ZiBidWY7CisgICAgaWVlZV9vdWkgZHBvZV9vdWkgPSB7IHsgMHgwMCwgMHgxMCwgMHgwMCB9IH07CisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7CisKKyAgICBtZW1zZXQob2FtX2J1ZmZlciwgMCwgc2l6ZW9mKG9hbV9idWZmZXIpKTsKKworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBPQU1fTUFYX1BBQ0tFVF9TSVpFLCBvYW1fYnVmZmVyLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgb2sgPSBvayAmJiBvYW1fcGR1X2J1aWxkX2NvbW1vbihwb25fbWFjLCAmYnVmKTsKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKCZidWYsICh1aW50MTZfdCkgT0FNX1BEVV9GTEFHX1NFTkRfQU5ZKTsgLyogd3JpdGUgZmxhZ3MgKi8KKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoJmJ1ZiwgKHVpbnQ4X3QpIE9BTV9QRFVfQ09ERV9PUkdfRVhUKTsgLyogd3JpdGUgIGNvZGUgKi8KKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGUoJmJ1ZiwgZHBvZV9vdWkuYnl0ZSwgMyk7IC8qIHdyaXRlIG91aSAqLworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV91OCgmYnVmLCBPQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1QpOyAvKiB3cml0ZSBvcGNvZGUgKi8KKyAgICBvayA9IG9rICYmIGRwb2VfZW5jcnlwdF90bHZfYWRkKCZidWYsIHBlcmlvZCwgZW5jcnlwdF9tb2RlKTsgLyogd3JpdGUgZW5jcnlwdGlvbiBUTFZzICovCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZSgmYnVmLCAwKTsgLyogd3JpdGUgRU5EICovCisgICAgb2sgPSBvayAmJiBvYW1fcGR1X3RyYW5zbWl0KGhkZV9saW5rLCBvYW1fYnVmZmVyLCBNQVgoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmYnVmKSwgNjApKTsgLyogU2VuZCBpdCAqLworCisgICAgaWYgKCFvaykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgcmV0dXJuIG9rOworfQorCitiY21vc19lcnJubyBkcG9lX2VuY3J5cHRfb2FtX3BhcnNlX3NldF9yZXNwb25zZShjb25zdCBiY21vbHRfdThfbGlzdF91MzIgKmZyYW1lLCB1aW50OF90ICplbmNyeXB0X21vZGVfcmVzcG9uc2UsIHVpbnQ4X3QgKmtleV9leHBpcnlfcmVzcG9uc2UpCit7CisgICAgb2FtX3Zhcl9nZW5lcmljIGVuY3J5cHRfbW9kZTsKKyAgICBvYW1fdmFyX2dlbmVyaWMga2V5X2V4cGlyeV90aW1lOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBmcmFtZS0+bGVuLCBmcmFtZS0+dmFsLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisKKyAgICAvLyBNb3ZlIHRoZSBPQU0gYnVmZmVyIGZvcndhcmQgdG8gdGhlIG9wY29kZQorICAgIGlmICghb2FtX3BhcnNlX3RvX2Rwb2Vfb3Bjb2RlKCZidWYsIE9BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIGVuY3J5cHQgbW9kZSBUTFYKKyAgICBpZiAoIW9hbV92YXJfZ2V0X2JyYW5jaF9sZWFmKAorICAgICAgICBiY21vbHRfYnVmX3NuYXBfZ2V0KCZidWYpLAorICAgICAgICBiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZSgmYnVmKSwKKyAgICAgICAgT0FNX1ZBUl9CUkFOQ0hfRFBPRV9BVFRSSUJVVEUsCisgICAgICAgIE9BTV9EUE9FX0FUVFJfRU5DUllQVF9NT0RFLAorICAgICAgICAmZW5jcnlwdF9tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBrZXkgZXhwaXJ5IHRpbWUgVExWCisgICAgaWYgKCFvYW1fdmFyX2dldF9icmFuY2hfbGVhZigKKyAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX2dldCgmYnVmKSwKKyAgICAgICAgYmNtb2x0X2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoJmJ1ZiksCisgICAgICAgIE9BTV9WQVJfQlJBTkNIX0RQT0VfQVRUUklCVVRFLAorICAgICAgICBPQU1fRFBPRV9BVFRSX0tFWV9FWFBJUllfVElNRSwKKyAgICAgICAgJmtleV9leHBpcnlfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICB9CisKKyAgICAqZW5jcnlwdF9tb2RlX3Jlc3BvbnNlID0gZW5jcnlwdF9tb2RlLndpZHRoOworICAgICprZXlfZXhwaXJ5X3Jlc3BvbnNlID0ga2V5X2V4cGlyeV90aW1lLndpZHRoOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBkcG9lX2VuY3J5cHRfb2FtX3BhcnNlX25ld19rZXkoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICpmcmFtZSwgdWludDhfdCAqbmV3X2tleSwgYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSAqa2V5X2Nob2ljZSkKK3sKKyAgICBiY21vc19ib29sIG9rID0gQkNNT1NfVFJVRTsKKyAgICB1aW50OF90IGtleV9udW1iZXI7CisgICAgdWludDhfdCBrZXlfbGVuZ3RoOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBmcmFtZS0+bGVuLCBmcmFtZS0+dmFsLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgb2sgPSBvYW1fcGFyc2VfdG9fZHBvZV9vcGNvZGUoJmJ1ZiwgT0FNX0RQT0VfT1BDT0RFX0tFWV9FWENIQU5HRSk7CisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3JlYWRfdTgoJmJ1ZiwgJmtleV9udW1iZXIpOyAvLyBSZWFkIGtleSBudW1iZXIKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91OCgmYnVmLCAma2V5X2xlbmd0aCk7IC8vIFJlYWQga2V5IGxlbmd0aAorICAgIG9rID0gb2sgJiYga2V5X2xlbmd0aCA9PSAxNjsgLy8gTWFrZSBzdXJlIHRoZSBrZXkgaXMgMTYgYnl0ZSBsZW5ndGgKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZCgmYnVmLCBuZXdfa2V5LCAxNik7IC8vIFJlYWQgdGhlIGtleQorCisgICAgaWYgKCFvaykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIGlmIChrZXlfbnVtYmVyID09IDApCisgICAgeworICAgICAgICAqa2V5X2Nob2ljZSA9IEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzA7CisgICAgfQorICAgIGVsc2UgaWYgKGtleV9udW1iZXIgPT0gMSkKKyAgICB7CisgICAgICAgICprZXlfY2hvaWNlID0gQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9LRVlfMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2VuY3J5cHRfb2FtLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2VuY3J5cHRfb2FtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjZDJlYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvZW5jcnlwdF9vYW0uaApAQCAtMCwwICsxLDU5IEBACisvKg0KKyA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQNCisNCisgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQ0KKyBBbGwgUmlnaHRzIFJlc2VydmVkDQorDQorIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UNCisgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZA0KKyB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDINCisgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsDQorIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6DQorDQorIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUNCisgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kDQorIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXINCisgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudA0KKyBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4NCisgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcw0KKyBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucw0KKyBvZiB0aGUgc29mdHdhcmUuDQorDQorIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQ0KKyB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQNCisgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3INCisgd3JpdHRlbiBjb25zZW50Lg0KKw0KKyA6Pg0KKyAqLw0KKw0KKyNpZm5kZWYgRU5DUllQVF9PQU1fSF8NCisjZGVmaW5lIEVOQ1JZUFRfT0FNX0hfDQorDQorI2luY2x1ZGUgIm9hbV9kZWZzLmgiDQorI2luY2x1ZGUgImJjbW9sdF9lcG9uX2hkZS5oIg0KKw0KKy8qIFNlbmQgYSBFbmNyeXB0aW9uIFJlcXVlc3QgT0FNIHRvIE9OVS4gKi8NCitiY21vc19lcnJubyBkcG9lX2VuY3J5cHRfb2FtX3NldF9yZXF1ZXN0X3NlbmQoDQorICAgIGNvbnN0IGhkZV9rZXkgKmhkZV9saW5rLA0KKyAgICB1aW50MTZfdCBwZXJpb2QsDQorICAgIGRwb2VfZW5jcnlwdF9tb2RlIGVuY3J5cHRfbW9kZSwNCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgcG9uX21hYyk7DQorDQorLyogQXR0ZW1wdCB0byBwYXJzZSBhIERQb0Ugc2V0IHJlc3BvbnNlIGFuZCBmaWxsIGluIHRoZSB2YWx1ZXMgb2YgdGhlIHR3byBUTFZzIHdlIGluaXRpYWxseSBzZW50IGRvd24uDQorICogVGhpcyB3aWxsIHJldHVybiBCQ01fRVJSX1BBUlNFIGlmIGl0IGZhaWxzIHRvIGZpbGwgaW4gZWl0aGVyIG9mIHRoZSBUTFZzLg0KKyAqLw0KK2JjbW9zX2Vycm5vIGRwb2VfZW5jcnlwdF9vYW1fcGFyc2Vfc2V0X3Jlc3BvbnNlKA0KKyAgICBjb25zdCBiY21vbHRfdThfbGlzdF91MzIgKmZyYW1lLA0KKyAgICB1aW50OF90ICplbmNyeXB0X21vZGVfcmVzcG9uc2UsDQorICAgIHVpbnQ4X3QgKmtleV9leHBpcnlfcmVzcG9uc2UpOw0KKw0KKy8qIEF0dGVtcHRzIHRvIHBhcnNlIGFuIE9BTSBmcmFtZSBhbmQgZmlsbCBpbiB0aGUgdmFsdWVzIG9mIG5ld19rZXkgYW5kIGtleV9jaG9pY2UgZnJvbSB0aGF0IGZyYW1lLg0KKyAqIFRoaXMgd2lsbCByZXR1cm4gQkNNX0VSUl9QQVJTRSBpZiBpdCBmYWlscyB0byBmaWxsIGluIGVpdGhlciBuZXdfa2V5IG9yIGtleV9jaG9pY2UuDQorICovDQorYmNtb3NfZXJybm8gZHBvZV9lbmNyeXB0X29hbV9wYXJzZV9uZXdfa2V5KA0KKyAgICBjb25zdCBiY21vbHRfdThfbGlzdF91MzIgKmZyYW1lLA0KKyAgICB1aW50OF90ICpuZXdfa2V5LA0KKyAgICBiY21vbHRfZXBvbl9rZXlfY2hvaWNlICprZXlfY2hvaWNlKTsNCisNCisjZW5kaWYgLyogRU5DUllQVF9PQU1fSF8gKi8NCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL29hbV9kZWZzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL29hbV9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2ZDVlYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvb2FtX2RlZnMuaApAQCAtMCwwICsxLDE1MyBAQAorLyoNCisgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkDQorDQorIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20NCisgQWxsIFJpZ2h0cyBSZXNlcnZlZA0KKw0KKyBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlDQorIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQNCisgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyDQorICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLA0KKyB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOg0KKw0KKyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlDQorIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZA0KKyB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyDQorIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQNCisgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuDQorIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMNCisgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMNCisgb2YgdGhlIHNvZnR3YXJlLg0KKw0KKyBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUNCisgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkDQorIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yDQorIHdyaXR0ZW4gY29uc2VudC4NCisNCisgOj4NCisgKi8NCisNCisjaWZuZGVmIE9BTV9ERUZTX0hfDQorI2RlZmluZSBPQU1fREVGU19IXw0KKw0KKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfdHlwZXMuaCINCisNCisjZGVmaW5lIEVUSEVSVFlQRV9TTE9XUFJPVE9DT0xTIDB4ODgwOQ0KKyNkZWZpbmUgT0FNX1RJTUVPVVRfR1JBQ0VfUEVSSU9EX1VTIDEwMDAwMA0KKyNkZWZpbmUgSERFX0VOQUJMRV9PQU1fV0FJVF9VUyAzZTYgLy8gMyBzZWNvbmRzDSNkZWZpbmUgT0FNX01BWF9QQUNLRVRfU0laRSAxNTE4DQorI2RlZmluZSBPQU1fTUFYX1RMVl9MRU5HVEggMTI4DQorDQorLyogQ29tbW9uIE9BTVBEVSBTdHJ1Y3R1cmUgKi8NCit0eXBlZGVmIGVudW0NCit7DQorICAgIFNMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQUNQICAgICA9IDB4MDEsIC8qIExpbmsgQWdyZWdhdGlvbiBDb250cm9sIFByb3RvY29sICovDQorICAgIFNMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQU1QICAgICA9IDB4MDIsIC8qIExpbmsgQWdyZWdhdGlvbiBNYXJrZXIgUHJvdG9jb2wgKi8NCisgICAgU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTSAgICAgID0gMHgwMywgLyogT0FNICovDQorICAgIFNMT1dfUFJPVE9DT0xfU1VCVFlQRV9PUkdfU1BFQyA9IDB4MEEgIC8qIE9yZ2FuaXphdGlvbiBTcGVjaWZpYyBTdWJ0eXBlICovDQorfSBzbG93X3Byb3RvY29sX3N1YnR5cGU7DQorDQorLyogU3RhbmRhcmQgT0FNIEZsYWdzIGZpZWxkLiAgSUVFRTgwMi4zLTIwMDhfc2VjdGlvbjUsIGNoLjU3LjQuMi4xICovDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBPQU1fUERVX0ZMQUdfTElOS19GQVVMVCAgICAgPSAoMSA8PCAwKSwgLyogMHgwMDAxICovDQorICAgIE9BTV9QRFVfRkxBR19EWUlOR19HQVNQICAgICA9ICgxIDw8IDEpLCAvKiAweDAwMDIgKi8NCisgICAgT0FNX1BEVV9GTEFHX0NSSVRJQ0FMX0VWRU5UID0gKDEgPDwgMiksIC8qIDB4MDAwNCAqLw0KKyAgICBPQU1fUERVX0ZMQUdfTE9DQUxfRVZBTCAgICAgPSAoMSA8PCAzKSwgLyogMHgwMDA4ICovDQorICAgIE9BTV9QRFVfRkxBR19MT0NBTF9TVEFCTEUgICA9ICgxIDw8IDQpLCAvKiAweDAwMTAgKi8NCisgICAgT0FNX1BEVV9GTEFHX1JFTU9URV9FVkFMICAgID0gKDEgPDwgNSksIC8qIDB4MDAyMCAqLw0KKyAgICBPQU1fUERVX0ZMQUdfUkVNT1RFX1NUQUJMRSAgPSAoMSA8PCA2KSwgLyogMHgwMDQwICovDQorICAgIE9BTV9QRFVfRkxBR19TRU5EX0FOWSAgICAgICA9IChPQU1fUERVX0ZMQUdfTE9DQUxfU1RBQkxFIHwgT0FNX1BEVV9GTEFHX1JFTU9URV9TVEFCTEUpDQorfSBvYW1fcGR1X2ZsYWc7DQorDQorLyogU3RhbmRhcmQgT0FNIENvZGUgZmllbGQuICBJRUVFODAyLjMtMjAwOF9zZWN0aW9uNSwgY2guNTcuNC4yLjIgKi8NCit0eXBlZGVmIGVudW0NCit7DQorICAgIE9BTV9QRFVfQ09ERV9JTkZPICAgICAgICAgICAgICA9IDB4MCwNCisgICAgT0FNX1BEVV9DT0RFX0VWRU5UTk9USUZJQ0FUSU9OID0gMHgwMSwNCisgICAgT0FNX1BEVV9DT0RFX1ZBUlJFUVVFU1QgICAgICAgID0gMHgwMiwNCisgICAgT0FNX1BEVV9DT0RFX1ZBUlJFU1BPTlNFICAgICAgID0gMHgwMywNCisgICAgT0FNX1BEVV9DT0RFX0xPT1BCQUNLICAgICAgICAgID0gMHgwNCwNCisgICAgT0FNX1BEVV9DT0RFX09SR19FWFQgICAgICAgICAgID0gMHhmZQ0KK30gb2FtX3BkdV9jb2RlOw0KKw0KKy8qIElFRUUgT3JnYW5pemF0aW9uIFVuaXF1ZSBJZGVudGlmaWVyICovDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIHVpbnQ4X3QgYnl0ZVszXTsNCit9IGllZWVfb3VpOw0KKw0KKy8qIEJyYW5jaCB0eXBlcyAqLw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgT0FNX1ZBUl9CUkFOQ0hfVEVSTUlOQVRJT04gICAgPSAweDAwLA0KKyAgICBPQU1fVkFSX0JSQU5DSF9BVFRSSUJVVEUgICAgICA9IDB4MDcsDQorICAgIE9BTV9WQVJfQlJBTkNIX0FDVElPTiAgICAgICAgID0gMHgwOSwNCisgICAgT0FNX1ZBUl9CUkFOQ0hfRFBPRV9PQkpFQ1QgICAgPSAweEQ2LA0KKyAgICBPQU1fVkFSX0JSQU5DSF9EUE9FX0FUVFJJQlVURSA9IDB4RDcsDQorICAgIE9BTV9WQVJfQlJBTkNIX0RQT0VfUFJPR19DVFIgID0gMHhEOCwNCisgICAgT0FNX1ZBUl9CUkFOQ0hfRFBPRV9BQ1QgICAgICAgPSAweEQ5DQorfSBvYW1fdmFyX2JyYW5jaDsNCisNCit0eXBlZGVmIGVudW0NCit7DQorICAgIE9BTV9EUE9FX09QQ09ERV9SRVNFUlZFRCAgICAgICA9IDAsDQorICAgIE9BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVCAgICA9IDEsDQorICAgIE9BTV9EUE9FX09QQ09ERV9HRVRfUkVTUE9OU0UgICA9IDIsDQorICAgIE9BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVCAgICA9IDMsDQorICAgIE9BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0UgICA9IDQsDQorICAgIE9BTV9EUE9FX09QQ09ERV9JUE1DX0NUUkwgICAgICA9IDUsDQorICAgIE9BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUcgICAgICA9IDYsDQorICAgIE9BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUdfUkVTUCA9IDcsDQorICAgIE9BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0UgICA9IDgsDQorICAgIE9BTV9EUE9FX09QQ09ERV9GSUxFX1RSQU5TRkVSICA9IDksDQorICAgIE9BTV9EUE9FX09QQ09ERV9JUE1DX0NUUkxfUkVTUCA9IDB4MGEgLyogRFBvRSAyLjAgKi8NCit9IG9hbV9kcG9lX29wY29kZTsNCisNCit0eXBlZGVmIGVudW0NCit7DQorICAgIE9BTV9EUE9FX0FUVFJfS0VZX0VYUElSWV9USU1FID0gMHgwNDAxLA0KKyAgICBPQU1fRFBPRV9BVFRSX0VOQ1JZUFRfTU9ERSA9IDB4MDQwMg0KK30gb2FtX2Rwb2VfYXR0cjsNCisNCisvKiBEUG9FIEtleSBFeGNoYW5nZSBPQU0gVExWIGVuY3J5cHRpb24gbW9kZSAqLw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgRFBPRV9FTkNSWVBUX01PREVfTk9ORSwNCisgICAgRFBPRV9FTkNSWVBUX01PREVfMURPV04sDQorICAgIERQT0VfRU5DUllQVF9NT0RFXzEwRE9XTiwNCisgICAgRFBPRV9FTkNSWVBUX01PREVfMTBCSQ0KK30gZHBvZV9lbmNyeXB0X21vZGU7DQorDQorLyogZ2VuZXJpYyBPQU0gVmFyaWFibGUgZm9ybWF0ICovDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIG9hbV92YXJfYnJhbmNoIGJyYW5jaDsNCisgICAgdWludDE2X3QgbGVhZjsNCisgICAgdWludDhfdCB3aWR0aDsNCisgICAgdWludDhfdCAqdmFsdWU7DQorfSBvYW1fdmFyX2dlbmVyaWM7DQorDQorLyoqIEluIHRoZSBPQU0gcHJvdG9jb2wgbGVuZ3RoIDAgdGx2IGlzIGVuY29kZWQgYXMgMHg4MCAobm8gZXJyb3IpLg0KKyAqICBMZW5ndGggKDEtMTI3KSBhcmUgZW5jb2RlZCB3aXRoIG5vIGNoYW5nZSBhbmQgMTI4IGlzIGVuY29kZWQgYXMgMC4NCisgKg0KKyAqIFxwYXJhbSAgIHdpZHRoICAgVExWIHdpZHRoIGZpZWxkIHZhbHVlDQorICogXHJldHVybiAgZW5jb2RlZCB2YWx1ZSBmb3IgdGhlIHdpZHRoIGZpZWxkDQorICogXHJlZiAgICAgSUVFRTgwMi4zLTIwMDhfc2VjdGlvbjUsIENoLiA1Ny42LjIuMQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBvYW1fdmFyX3Rsdl9sZW5ndGhfZW5jb2RlKHVpbnQ4X3Qgd2lkdGgpDQorew0KKyAgICBpZiAod2lkdGggPT0gMCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIE9BTV9NQVhfVExWX0xFTkdUSDsgLyogMHgwMCBlcXVhbHMgMTI4IG9jdGV0cy4gKi8NCisgICAgfQ0KKyAgICBlbHNlIGlmICh3aWR0aCA9PSBPQU1fTUFYX1RMVl9MRU5HVEgpDQorICAgIHsNCisgICAgICAgIHJldHVybiAwOyAvKiAweDgwIHJlcHJlc2VudHMgJ25vIGVycm9yJy4gTm8gJ1ZhbHVlJyBmaWVsZC4gKi8NCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIHJldHVybiB3aWR0aDsgLyogcmVwcmVzZW50cyB0aGUgbGVuZ3RoIG9mICdWYWx1ZScuICovDQorICAgIH0NCit9DQorDQorI2VuZGlmIC8qIE9BTV9ERUZTX0hfICovDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1NmI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0vTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAoraWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBiY21fdXNlcl9hcHBsX2Vwb25fb2FtCisgICAgTU9EX1RZUEUgPSBsaWIKKwlNT0RfREVQUyA9IHV0aWxzIGRldl9sb2cgY29tbW9uX2Vwb25fb2FtIGNvbW1vbl9hcGkKKyAgICBzcmNzID0gYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5jCisgICAgaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisJTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorICAgIGVuZGlmCitlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0vYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODU5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uYwpAQCAtMCwwICsxLDE0MzYgQEAKKy8qCisgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgIG9mIHRoZSBzb2Z0d2FyZS4KKworICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgIHdyaXR0ZW4gY29uc2VudC4KKworICA6PgorKi8KKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgImJjbW9sdF9tYXRoLmgiCisjaW5jbHVkZSAiYmNtb2x0X3V0aWxzLmgiCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNpbmNsdWRlICJiY21vbHRfbXNnLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZ19wYWNrLmgiCisjaW5jbHVkZSAiYmNtb2x0X2FwaS5oIgorI2luY2x1ZGUgImJjbW9sdF9tb2RlbF90eXBlcy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaCIKKyNpbmNsdWRlICJiY21vc19oYXNoX3RhYmxlLmgiCisKKyNkZWZpbmUgTUFYX0NPTkNVUlJFTlRfTElOS1MgICAgMjA0OAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OworICAgIEZJTEUgKmZpbGU7CisgICAgdm9pZCAqYnVmOworICAgIHVpbnQxNl90IGJsb2NrX3NpemU7CisgICAgdWludDE2X3QgbGFzdF9ibG9jazsKKyAgICB1aW50MTZfdCBsYXN0X2Jsb2NrX3NpemU7CisgICAgdWludDhfdCByZXRyaWVzOworICAgIGJjbW9zX2Jvb2wgZG9uZTsKKyAgICBiY21vc190aW1lciB0aW1lcjsKKyAgICB1aW50MzJfdCB0aW1lb3V0X3VzOworICAgIHVpbnQzMl90IGxhc3RfdGltZTsKK30gZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgYmNtb2x0X3Byb3h5X3J4ICpyeDsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeF9jYiBjYjsKK30gZXBvbl9vYW1fcHJveHlfcnhfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUgKnN0YXRlOworfSBlcG9uX29hbV90aW1lb3V0X2RhdGE7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBlcG9uX29hbV9wcm94eV9yeF9kYXRhIHByb3h5X3J4OworICAgIGVwb25fb2FtX3RpbWVvdXRfZGF0YSB0aW1lb3V0OworfSBlcG9uX29hbV9tc2dfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgb3NfbXNnOworICAgIGVwb25fb2FtX21zZ19kYXRhIGRhdGE7Cit9IGVwb25fb2FtX21zZzsKKworc3RhdGljIGJjbW9zX2Jvb2wgaXNfcnVubmluZyA9IEJDTU9TX0ZBTFNFOworc3RhdGljIGRldl9sb2dfaWQgZXBvbl9vYW1fbG9nW0JDTVRSX01BWF9PTFRTXTsKK3N0YXRpYyBjaGFyIG1hY19idWZbTUFDX1NUUl9MRU5dOworc3RhdGljIGJjbW9zX3Rhc2sgZXBvbl9vYW1fdGFzazsKK3N0YXRpYyBoYXNoX3RhYmxlICpkcG9lX2Z3X3VwZ3JhZGVfc3RhdGU7CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2hhbmRsZV9vc19tc2coYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpOworCisjZGVmaW5lIEVQT05fT0FNX0xPRyhsZXZlbCwgZGV2aWNlLCBsaW5rLCBmbXQsIGFyZ3MuLi4pICAgICBcCisgICAgQkNNX0xPR19DQUxMRVJfRk1UKGxldmVsLCBlcG9uX29hbV9sb2dbZGV2aWNlXSwgIiV1LSVzOiAiZm10LCAobGluayktPmVwb25fbmksIGJjbW9zX21hY18yX3N0cigmKGxpbmspLT5tYWNfYWRkcmVzcywgbWFjX2J1ZiksICMjYXJncykKKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2dldF9tYWNfZGEoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X2Vwb25fbmkgZXBvbiwgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfY2ZnIHBvbl9jZmc7CisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IHBvbl9rZXkgPSB7IC5lcG9uX25pID0gZXBvbiB9OworCisgICAgLyogcmV0cmlldmUgdGhlIEVQT04gTkkgTUFDIGFkZHJlc3MgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJnBvbl9jZmcsIGVwb25fbmksIHBvbl9rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJnBvbl9jZmcsIGVwb25fbmksIG1hY19hZGRyZXNzKTsKKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZwb25fY2ZnLmhkcik7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZXBvbl9vYW1fbG9nW2RldmljZV9pZF0sICJGYWlsZWQgdG8gcmV0cmlldmUgRVBPTiBOSSBNQUMgYWRkcmVzcyFcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqbWFjID0gcG9uX2NmZy5kYXRhLm1hY19hZGRyZXNzOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9wYWNrX2ZyYW1lKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lLCB1aW50OF90ICoqYnVmZmVyLCB1aW50MTZfdCAqbGVuZ3RoKQoreworICAgIGJjbW9sdF9idWYgYnVmOworCisgICAgKmxlbmd0aCA9IE1BWChiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfZ2V0X3BhY2tlZF9sZW5ndGgob2FtX2ZyYW1lKSwgNjApOworICAgICpidWZmZXIgPSBiY21vc19jYWxsb2MoKmxlbmd0aCk7CisgICAgaWYgKE5VTEwgPT0gKmJ1ZmZlcikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgKmxlbmd0aCwgKmJ1ZmZlciwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX3BhY2sob2FtX2ZyYW1lLCAmYnVmKSkKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoKmJ1ZmZlcik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZSBpbmplY3RfZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgbGlua19rZXkgPSB7IC5lcG9uX25pID0gZXBvbiwgLm1hY19hZGRyZXNzID0gKm1hYyB9OworICAgIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCBmcmFtZTsKKworICAgIGVyciA9IGVwb25fb2FtX3BhY2tfZnJhbWUob2FtX2ZyYW1lLCAmZnJhbWUuZnJhbWVfb2N0ZXRzLnZhbCwgJmZyYW1lLmZyYW1lX29jdGV0cy5sZW4pOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGV2aWNlX2lkLCAmbGlua19rZXksICJGYWlsZWQgdG8gcGFjayBPQU0gZnJhbWU6ICVzIVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJmluamVjdF9mcmFtZSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGxpbmtfa2V5KTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJmluamVjdF9mcmFtZSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGZyYW1lLCBmcmFtZSk7CisgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmaW5qZWN0X2ZyYW1lLmhkcik7CisKKyAgICBiY21vc19mcmVlKGZyYW1lLmZyYW1lX29jdGV0cy52YWwpOworCisgICAgcmV0dXJuIGVycjsKK30KKworYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICplcG9uX29hbV91bnBhY2soYmNtb2x0X2RldmlkIGRldmljZV9pZCwgdWludDMyX3QgbGVuLCB1aW50OF90ICpieXRlcykKK3sKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICB1aW50MzJfdCB1bnBhY2tfYnl0ZXMgPSBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lKTsKKyAgICB2b2lkICp1bnBhY2tfbWVtOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqZnJhbWU7CisgICAgdm9pZCAqZXh0cmFfbWVtOworCisgICAgLyogV2UgZG9uJ3Qga25vdyBob3cgbXVjaCBzcGFjZSB3ZSdsbCBuZWVkIHRvIHVucGFjayB0aGUgT0FNIGZyYW1lLiBTdGFydGluZyB3aXRoIHRoZSBrbm93biBmaXhlZCBzaXplLCB3ZSBzY2FuIHRoZQorICAgICAgIGZyYW1lIHRvIGRldGVybWluZSB0aGUgZXhhY3Qgc3BhY2UgbmVlZGVkICovCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIGxlbiwgYnl0ZXMsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV9zY2FuKCZidWYsICZ1bnBhY2tfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZXBvbl9vYW1fbG9nW2RldmljZV9pZF0sICJGYWlsZWQgdG8gc2NhbiBPQU0gZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdW5wYWNrX21lbSA9IGJjbW9zX2NhbGxvYyh1bnBhY2tfYnl0ZXMpOworICAgIGlmIChOVUxMID09IHVucGFja19tZW0pCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbZGV2aWNlX2lkXSwgIkZhaWxlZCB0byBhbGxvY2F0ZSAldSBieXRlcyByZXF1aXJlZCB0byB1bnBhY2tcbiIsIHVucGFja19ieXRlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBlcG9uX29hbV9sb2dbZGV2aWNlX2lkXSwgIlN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgJXUgYnl0ZXMgcmVxdWlyZWQgdG8gdW5wYWNrXG4iLCB1bnBhY2tfYnl0ZXMpOworICAgIH0KKyAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGFuIGFwcHJvcHJpYXRlbHkgc2l6ZWQgYnVmZmVyIHRvIHVucGFjayBpbnRvLCBwb2ludCB0aGUgZml4ZWQgc3RydWN0dXJlIHRvIHRoZSBzdGFydCBvZiB0aGUKKyAgICAgICBidWZmZXIgYW5kIGRpcmVjdCB0aGUgdW5wYWNrZXIgdG8gc3RvcmUgYW55IGFkZGl0aW9uYWwgZGF0YSBpbW1lZGlhdGVseSBhZnRlciB0aGF0ICovCisgICAgZnJhbWUgPSAoYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lKil1bnBhY2tfbWVtOworICAgIGV4dHJhX21lbSA9ICh2b2lkKikoZnJhbWUgKyAxKTsKKworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBsZW4sIGJ5dGVzLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfdW5wYWNrKGZyYW1lLCAmYnVmLCAmZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGVwb25fb2FtX2xvZ1tkZXZpY2VfaWRdLCAiRmFpbGVkIHRvIHVucGFjayBPQU0gZnJhbWVcbiIpOworICAgICAgICBiY21vc19mcmVlKHVucGFja19tZW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWU7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpvYW1fZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqcHJvdG9jb2wpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgb2FtX2ZyYW1lLT5kYSA9IHNsb3dfcHJvdG9jb2xfbXVsdGljYXN0X21hYzsKKyAgICBlcnIgPSBlcG9uX29hbV9nZXRfbWFjX2RhKGRldmljZV9pZCwgZXBvbiwgJm9hbV9mcmFtZS0+c2EpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBvYW1fZnJhbWUtPnByb3RvY29sc19jb3VudCA9IDE7CisgICAgb2FtX2ZyYW1lLT5wcm90b2NvbHMgPSBwcm90b2NvbDsKKyAgICBwcm90b2NvbC0+ZXRoZXJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfU0xPV19QUk9UT0NPTDsKKyAgICBwcm90b2NvbC0+dS5zbG93X3Byb3RvY29sLnZhbHVlLnN1YnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTTsKKyAgICBwcm90b2NvbC0+dS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmZsYWdzID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MT0NBTF9TVEFCTEUgfCBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX1JFTU9URV9TVEFCTEU7CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LmNvZGUgPSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM7CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLm91aSA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX3NlbmRfb3NfbXNnKGJjbW9zX21zZ19pZCB0eXBlLCBlcG9uX29hbV9tc2dfZGF0YSAqbXNnX2RhdGEpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgZXBvbl9vYW1fbXNnICptc2cgPSBiY21vc19jYWxsb2Moc2l6ZW9mKCptc2cpKTsKKworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGVwb25fb2FtX2xvZ1ttc2dfZGF0YS0+cHJveHlfcnguZGV2aWNlX2lkXSwgIk9TIG1zZyBjYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgbXNnLT5vc19tc2cudHlwZSA9IHR5cGU7CisgICAgbXNnLT5vc19tc2cuaGFuZGxlciA9IGVwb25fb2FtX2hhbmRsZV9vc19tc2c7CisgICAgbXNnLT5kYXRhID0gKm1zZ19kYXRhOworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9PQU0sICZtc2ctPm9zX21zZywgMCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbbXNnX2RhdGEtPnByb3h5X3J4LmRldmljZV9pZF0sICJPUyBtc2cgc2VuZCBmYWlsZWRcbiIpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZ2V0X2NyaXRpY2FsX2luZm8oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IgdmFyc1szXSA9IHt9OworCisgICAgZXJyID0gZXBvbl9vYW1fbWFrZV9kcG9lX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgJm9hbV9mcmFtZSwgJnByb3RvY29sKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPQorICAgICAgICAzOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmdldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfSUQ7CisgICAgdmFyc1sxXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9MT0dJQ0FMX0xJTktTOworICAgIHZhcnNbMl0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDsKKyAgICB2YXJzWzJdLnUuZW5kLnVua25vd25fY291bnQgPSAwOworICAgIHZhcnNbMl0udS5lbmQudW5rbm93biA9IE5VTEw7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSk7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X29hbV9yYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXgpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzJdID0ge307CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIDI7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFycyA9IHZhcnM7CisgICAgdmFyc1swXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PQU1fUkFURTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm9hbV9yYXRlLm1pbmltdW1fb2FtX3JhdGUgPSBtaW47CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5vYW1fcmF0ZS5tYXhpbXVtX29hbV9yYXRlID0gbWF4OworICAgIHZhcnNbMV0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDsKKyAgICB2YXJzWzFdLnUuZW5kLnVua25vd25fY291bnQgPSAwOworICAgIHZhcnNbMV0udS5lbmQudW5rbm93biA9IE5VTEw7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSk7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X3JlcG9ydF90aHJlc2hvbGRzKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3F1ZXVlX3NldHMgcXVldWVfc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3F1ZXVlX3NldHMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzJdID0ge307CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIDI7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFycyA9IHZhcnM7CisgICAgdmFyc1swXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnJlcG9ydF90aHJlc2hvbGRzLm51bWJlcl9vZl9xdWV1ZV9zZXRzID0gbnVtX3F1ZXVlX3NldHM7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgPQorICAgICAgICByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQwID0gcXVldWVfc2V0c1swXTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDEgPSBxdWV1ZV9zZXRzWzFdOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MiA9IHF1ZXVlX3NldHNbMl07CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQzID0gcXVldWVfc2V0c1szXTsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ7CisgICAgdmFyc1sxXS51LmVuZC51bmtub3duX2NvdW50ID0gMDsKKyAgICB2YXJzWzFdLnUuZW5kLnVua25vd24gPSBOVUxMOworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9lbmNyeXB0aW9uKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSBlbmNfbW9kZSwKKyAgICB1aW50MTZfdCBwZXJpb2QpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzNdID0ge307CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIDM7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFycyA9IHZhcnM7CisgICAgdmFyc1swXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkNSWVBUX01PREU7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5lbmNyeXB0X21vZGUuZW5jcnlwdGlvbl9tZXRob2QgPSBlbmNfbW9kZTsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0tFWV9FWFBJUllfVElNRTsKKyAgICB2YXJzWzFdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LmtleV9leHBpcnlfdGltZS50aW1lID0gcGVyaW9kOworICAgIHZhcnNbMl0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDsKKyAgICB2YXJzWzJdLnUuZW5kLnVua25vd25fY291bnQgPSAwOworICAgIHZhcnNbMl0udS5lbmQudW5rbm93biA9IE5VTEw7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSk7Cit9CisKK2JjbW9zX2Jvb2wgZXBvbl9vYW1faXNfZHBvZShiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbSkKK3sKKyAgICByZXR1cm4gKChvYW0tPnByb3RvY29sc19jb3VudCA+IDApICYmCisgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MID09IG9hbS0+cHJvdG9jb2xzWzBdLmV0aGVydHlwZSkgJiYKKyAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNID09IG9hbS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS5zdWJ0eXBlKSAmJgorICAgICAgICAoQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfT1JHQU5JWkFUSU9OX1NQRUNJRklDID09CisgICAgICAgICBvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC5jb2RlKSAmJgorICAgICAgICAoQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0UgPT0KKyAgICAgICAgIG9hbS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLm91aSkpOworfQorCitiY21vc19ib29sIGVwb25fb2FtX2lzX2Rwb2VfZW5jcnlwdF9yZXNwb25zZShiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZSkKK3sKKyAgICByZXR1cm4gKEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0UgPT0gZHBvZS0+b3ApICYmCisgICAgICAgIChkcG9lLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMikgJiYKKyAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEUgPT0gZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1swXS5icmFuY2gpICYmCisgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkNSWVBUX01PREUgPT0KKyAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYpICYmCisgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFID09IGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMV0uYnJhbmNoKSAmJgorICAgICAgICAoQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfS0VZX0VYUElSWV9USU1FID09CisgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzWzFdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19tYWtlX2ZyYW1lKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCBvYW1fZnJhbWUsIHByb3RvY29sKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS5vcCA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDsKKyAgICBwcm90b2NvbC0+dS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIDM7CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT047CisgICAgdmFyc1sxXS51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24ubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX0lOR1JFU1NfUlVMRVM7CisgICAgdmFyc1syXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOworICAgIHZhcnNbMl0udS5lbmQudW5rbm93bl9jb3VudCA9IDA7CisgICAgdmFyc1syXS51LmVuZC51bmtub3duID0gTlVMTDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzNdID0ge307CisgICAgdWludDhfdCBwb3J0ID0gMDsKKworICAgIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19tYWtlX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgbWFjLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wsIHZhcnMpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKworICAgIHZhcnNbMF0udS5vYmplY3Qub2JqZWN0X2NvbnRleHQub2JqZWN0X3R5cGUgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUubmV0d29ya19wb24ucG9uX2NvdW50ID0gMTsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUubmV0d29ya19wb24ucG9uID0gJnBvcnQ7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSk7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc191c2VyX3BvcnQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlIHZhcnNbM10gPSB7fTsKKyAgICB1aW50OF90IHBvcnQgPSAwOworCisgICAgZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX21ha2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUsICZwcm90b2NvbCwgdmFycyk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworCisgICAgdmFyc1swXS51Lm9iamVjdC5vYmplY3RfY29udGV4dC5vYmplY3RfdHlwZSA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1VTRVJfUE9SVDsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUudXNlcl9wb3J0LnBvcnRfY291bnQgPSAxOworICAgIHZhcnNbMF0udS5vYmplY3Qub2JqZWN0X2NvbnRleHQudS51c2VyX3BvcnQucG9ydCA9ICZwb3J0OworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXMoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIGVyciA9IGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19uZXR3b3JrX3BvbihkZXZpY2VfaWQsIGVwb24sIG1hYyk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc191c2VyX3BvcnQoZGV2aWNlX2lkLCBlcG9uLCBtYWMpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9iYXNpY19xdWV1ZV9jb25maWcoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1cF9xdWV1ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZG5fcXVldWVfc2l6ZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlIHZhcnNbMl0gPSB7fTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgdXBfcXVldWVfc2V0OworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCBkbl9xdWV1ZV9zZXQ7CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIDI7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFycyA9IHZhcnM7CisgICAgdmFyc1swXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUc7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzID0gMTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnF1ZXVlX2NvbmZpZy5saW5rX2NvbmZpZ3VyYXRpb24gPSAmdXBfcXVldWVfc2V0OworICAgIHVwX3F1ZXVlX3NldC5xdWV1ZV9jb3VudCA9IDE7CisgICAgdXBfcXVldWVfc2V0LnF1ZXVlX3NpemVzID0gJnVwX3F1ZXVlX3NpemU7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5xdWV1ZV9jb25maWcubnVtYmVyX29mX3BvcnRzID0gMTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnF1ZXVlX2NvbmZpZy5wb3J0X2NvbmZpZ3VyYXRpb24gPSAmZG5fcXVldWVfc2V0OworICAgIGRuX3F1ZXVlX3NldC5xdWV1ZV9jb3VudCA9IDE7CisgICAgZG5fcXVldWVfc2V0LnF1ZXVlX3NpemVzID0gJmRuX3F1ZXVlX3NpemU7CisgICAgdmFyc1sxXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOworICAgIHZhcnNbMV0udS5lbmQudW5rbm93bl9jb3VudCA9IDA7CisgICAgdmFyc1sxXS51LmVuZC51bmtub3duID0gTlVMTDsKKworICAgIHJldHVybiBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGRldmljZV9pZCwgZXBvbiwgbWFjLCAmb2FtX2ZyYW1lKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfbWFrZV9mcmFtZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lX3J1bGVfdmxhbl9tb2RlIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2bGFuX3RhZ1s0XSkKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgdmFyX2NvdW50W0RQT0VfUlVMRV9WTEFOX01PREVfQ09VTlRdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1JVTEVfVkxBTl9NT0RFX05PTkVdID0gOCwKKyAgICAgICAgW0RQT0VfUlVMRV9WTEFOX01PREVfQUREXSA9IDEwLAorICAgICAgICBbRFBPRV9SVUxFX1ZMQU5fTU9ERV9SRU1PVkVdID0gOQorICAgIH07CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGVyciA9IGVwb25fb2FtX21ha2VfZHBvZV9mcmFtZShkZXZpY2VfaWQsIGVwb24sIG9hbV9mcmFtZSwgcHJvdG9jb2wpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBwcm90b2NvbC0+dS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOworICAgIHByb3RvY29sLT51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID0KKyAgICAgICAgdmFyX2NvdW50W3ZsYW5fbW9kZV07CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgIHZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9IRUFERVI7CisgICAgdmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUuaGVhZGVyLnByZWNlZGVuY2UgPSAxMDsKKyAgICB2YXJzWzJdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1syXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgIHZhcnNbMl0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9DTEFVU0U7CisgICAgdmFyc1syXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUuY2xhdXNlLmZpZWxkX2NvZGUuY29kZSA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfTDJEQTsKKyAgICB2YXJzWzJdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5jbGF1c2UuZmllbGRfY29kZS5pbnN0YW5jZSA9IDA7CisgICAgdmFyc1syXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUuY2xhdXNlLm1zYl9tYXNrID0gMDsKKyAgICB2YXJzWzJdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5jbGF1c2UubHNiX21hc2sgPSAwOworICAgIHZhcnNbMl0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LmNsYXVzZS5vcGVyYXRvciA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX0FMV0FZU19NQVRDSDsKKyAgICB2YXJzWzJdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5jbGF1c2UubWF0Y2hfdmFsdWVfbGVuZ3RoID0gMDsKKyAgICB2YXJzWzJdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5jbGF1c2UubWF0Y2hfdmFsdWUgPSBOVUxMOworICAgIHZhcnNbM10uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURTsKKyAgICB2YXJzWzNdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEU7CisgICAgdmFyc1szXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnN1YnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDsKKyAgICB2YXJzWzNdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnJlc3VsdCA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9RVUVVRTsKKyAgICB2YXJzWzRdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1s0XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgIHZhcnNbNF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ7CisgICAgdmFyc1s0XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC5yZXN1bHQgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRk9SV0FSRDsKKworICAgIHN3aXRjaCAodmxhbl9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBEUE9FX1JVTEVfVkxBTl9NT0RFX05PTkU6CisgICAgICAgICAgICBicmVhazsgLyogbm90aGluZyB0byBkbyAqLworICAgICAgICBjYXNlIERQT0VfUlVMRV9WTEFOX01PREVfQUREOgorICAgICAgICAgICAgdmFyc1s1XS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnN1YnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDsKKyAgICAgICAgICAgIHZhcnNbNV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQucmVzdWx0ID0KKyAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfSU5TRVJUOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51Lmluc2VydC5maWVsZC5maWVsZC5jb2RlID0KKyAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NWTEFOOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51Lmluc2VydC5maWVsZC5maWVsZC5pbnN0YW5jZSA9IDA7CisgICAgICAgICAgICB2YXJzWzZdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgICAgICAgICB2YXJzWzZdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEU7CisgICAgICAgICAgICB2YXJzWzZdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUuc3VidHlwZSA9IEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUOworICAgICAgICAgICAgdmFyc1s2XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC5yZXN1bHQgPQorICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9TRVQ7CisgICAgICAgICAgICB2YXJzWzZdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUuc2V0LmZpZWxkLmZpZWxkLmNvZGUgPQorICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1ZMQU47CisgICAgICAgICAgICB2YXJzWzZdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUuc2V0LmZpZWxkLmZpZWxkLmluc3RhbmNlID0gMDsKKyAgICAgICAgICAgIHZhcnNbNl0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQudS5zZXQudmFsdWVfY291bnQgPSA0OworICAgICAgICAgICAgdmFyc1s2XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LnNldC52YWx1ZSA9IHZsYW5fdGFnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFBPRV9SVUxFX1ZMQU5fTU9ERV9SRU1PVkU6CisgICAgICAgICAgICB2YXJzWzVdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgICAgICAgICB2YXJzWzVdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEU7CisgICAgICAgICAgICB2YXJzWzVdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUuc3VidHlwZSA9IEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC5yZXN1bHQgPQorICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9ERUxFVEU7CisgICAgICAgICAgICB2YXJzWzVdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUuZGVsZXRlLmZpZWxkLmZpZWxkLmNvZGUgPQorICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1ZMQU47CisgICAgICAgICAgICB2YXJzWzVdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUuZGVsZXRlLmZpZWxkLmZpZWxkLmluc3RhbmNlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICB2YXJzW3Zhcl9jb3VudFt2bGFuX21vZGVdLTNdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1t2YXJfY291bnRbdmxhbl9tb2RlXS0zXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgIHZhcnNbdmFyX2NvdW50W3ZsYW5fbW9kZV0tM10udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9URVJNSU5BVE9SOworICAgIHZhcnNbdmFyX2NvdW50W3ZsYW5fbW9kZV0tMl0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjsKKyAgICB2YXJzW3Zhcl9jb3VudFt2bGFuX21vZGVdLTJdLnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbi5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0lOR1JFU1NfUlVMRVM7CisgICAgdmFyc1t2YXJfY291bnRbdmxhbl9tb2RlXS0xXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOworICAgIHZhcnNbdmFyX2NvdW50W3ZsYW5fbW9kZV0tMV0udS5lbmQudW5rbm93bl9jb3VudCA9IDA7CisgICAgdmFyc1t2YXJfY291bnRbdmxhbl9tb2RlXS0xXS51LmVuZC51bmtub3duID0gTlVMTDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2VfcnVsZV92bGFuX21vZGUgdmxhbl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZsYW5fdGFnWzRdKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgdmFyc1sxMF0gPSB7fTsKKyAgICB1aW50OF90IHBvcnQgPSAwOworCisgICAgZXJyID0gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19tYWtlX2ZyYW1lKGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2FtX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxhbl90YWcpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKworICAgIHZhcnNbMF0udS5vYmplY3Qub2JqZWN0X2NvbnRleHQub2JqZWN0X3R5cGUgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUubmV0d29ya19wb24ucG9uX2NvdW50ID0gMTsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUubmV0d29ya19wb24ucG9uID0gJnBvcnQ7CisgICAgdmFyc1szXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LnF1ZXVlLnF1ZXVlLnR5cGUgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9VU0VSX1BPUlQ7CisgICAgdmFyc1szXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LnF1ZXVlLnF1ZXVlLmluc3RhbmNlID0gMDsKKyAgICB2YXJzWzNdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUucXVldWUucXVldWUucXVldWUgPSAwOworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lX3J1bGVfdmxhbl9tb2RlIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgdmxhbl90YWdbNF0pCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzEwXSA9IHt9OworICAgIHVpbnQ4X3QgcG9ydCA9IDA7CisKKyAgICBlcnIgPSBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX21ha2VfZnJhbWUoZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYW1fZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxhbl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bGFuX3RhZyk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworCisgICAgdmFyc1swXS51Lm9iamVjdC5vYmplY3RfY29udGV4dC5vYmplY3RfdHlwZSA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1VTRVJfUE9SVDsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUudXNlcl9wb3J0LnBvcnRfY291bnQgPSAxOworICAgIHZhcnNbMF0udS5vYmplY3Qub2JqZWN0X2NvbnRleHQudS51c2VyX3BvcnQucG9ydCA9ICZwb3J0OworICAgIHZhcnNbM10udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQudS5xdWV1ZS5xdWV1ZS50eXBlID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTElOSzsKKyAgICB2YXJzWzNdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUucXVldWUucXVldWUuaW5zdGFuY2UgPSAwOworICAgIHZhcnNbM10udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQudS5xdWV1ZS5xdWV1ZS5xdWV1ZSA9IDA7CisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIGVyciA9IGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24oZGV2aWNlX2lkLCBlcG9uLCBtYWMsIERQT0VfUlVMRV9WTEFOX01PREVfTk9ORSwgTlVMTCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0KGRldmljZV9pZCwgZXBvbiwgbWFjLCBEUE9FX1JVTEVfVkxBTl9NT0RFX05PTkUsIE5VTEwpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3dpdGhfdmxhbihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZsYW5fdGFnWzRdKQoreworICAgIHN0YXRpYyB1aW50OF90IGV4YW1wbGVfdmxhbls0XSA9IHsgMHg4MSwgMHgwMCwgMHgxMiwgMHgzNCB9OworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBlcnIgPSBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uKGRldmljZV9pZCwgZXBvbiwgbWFjLCBEUE9FX1JVTEVfVkxBTl9NT0RFX1JFTU9WRSwgTlVMTCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworCisgICAgaWYgKE5VTEwgPT0gdmxhbl90YWcpCisgICAgeworICAgICAgICB2bGFuX3RhZyA9IGV4YW1wbGVfdmxhbjsKKyAgICB9CisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0KGRldmljZV9pZCwgZXBvbiwgbWFjLCBEUE9FX1JVTEVfVkxBTl9NT0RFX0FERCwgdmxhbl90YWcpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vwb25fb2FtX2Rwb2VfdXNlcl90cmFmZmljX3NldF9hY3Rpb24oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24gYWN0aW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgdmFyc1syXSA9IHt9OworCisgICAgZXJyID0gZXBvbl9vYW1fbWFrZV9kcG9lX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgJm9hbV9mcmFtZSwgJnByb3RvY29sKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPQorICAgICAgICAyOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbi5sZWFmID0gYWN0aW9uOworICAgIHZhcnNbMV0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDsKKyAgICB2YXJzWzFdLnUuZW5kLnVua25vd25fY291bnQgPSAwOworICAgIHZhcnNbMV0udS5lbmQudW5rbm93biA9IE5VTEw7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSk7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZGlzYWJsZV91c2VyX3RyYWZmaWMoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICByZXR1cm4gX2Vwb25fb2FtX2Rwb2VfdXNlcl90cmFmZmljX3NldF9hY3Rpb24oZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RJU0FCTEVfVVNFUl9UUkFGRklDKTsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9lbmFibGVfdXNlcl90cmFmZmljKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjKQoreworICAgIHJldHVybiBfZXBvbl9vYW1fZHBvZV91c2VyX3RyYWZmaWNfc2V0X2FjdGlvbihkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fRU5BQkxFX1VTRVJfVFJBRkZJQyk7Cit9CisKK3N0YXRpYyBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUgKmVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9hZGQoY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKmtleSkKK3sKKyAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUgc3RhdGUgPSB7fTsKKyAgICByZXR1cm4gaGFzaF90YWJsZV9wdXQoZHBvZV9md191cGdyYWRlX3N0YXRlLCAoY29uc3QgdWludDhfdCopa2V5LCAmc3RhdGUpOworfQorCitzdGF0aWMgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlKiBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfZ2V0KGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5ICprZXkpCit7CisgICAgcmV0dXJuIGhhc2hfdGFibGVfZ2V0KGRwb2VfZndfdXBncmFkZV9zdGF0ZSwgKGNvbnN0IHVpbnQ4X3QqKWtleSk7Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZSAqc3RhdGUpCit7CisgICAgaWYgKE5VTEwgPT0gc3RhdGUpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbMF0sICJUcmllZCB0byByZWxlYXNlIE5VTEwgc3RhdGVcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKE5VTEwgIT0gc3RhdGUtPmZpbGUpCisgICAgeworICAgICAgICBmY2xvc2Uoc3RhdGUtPmZpbGUpOworICAgIH0KKyAgICBiY21vc19mcmVlKHN0YXRlLT5idWYpOworICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJnN0YXRlLT50aW1lcik7CisgICAgaWYgKCFoYXNoX3RhYmxlX3JlbW92ZShkcG9lX2Z3X3VwZ3JhZGVfc3RhdGUsIChjb25zdCB1aW50OF90Kikmc3RhdGUtPmtleSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbc3RhdGUtPmRldmljZV9pZF0sICJVbmFibGUgdG8gcmVtb3ZlIGZyb20gaGFzaCB0YWJsZVxuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9kcG9lX3NlbmRfYmxvY2soYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbDsKKworICAgIGVyciA9IGVwb25fb2FtX21ha2VfZHBvZV9mcmFtZShkZXZpY2VfaWQsIGtleS0+ZXBvbl9uaSwgJm9hbV9mcmFtZSwgJnByb3RvY29sKTsKKyAgICBCQ01PU19SRVRVUk5fT05fRVJST1IoZXJyKTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIub3Bjb2RlID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9EQVRBOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfZGF0YS5ibG9jayA9IGJsb2NrOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfZGF0YS5sZW5ndGggPSBsZW5ndGg7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV9kYXRhLmRhdGEgPSBkYXRhOworCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGtleS0+ZXBvbl9uaSwgJmtleS0+bWFjX2FkZHJlc3MsICZvYW1fZnJhbWUpKQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkZhaWxlZCB0byBzZW5kIGZ3IHVwZ3JhZGUgYmxvY2sgJXVcbiIsIGJsb2NrKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIlNlbnQgYmxvY2sgJXVcbiIsIGJsb2NrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2Rwb2Vfc2VuZF9hY2soYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvciBlcnJvcikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBrZXktPmVwb25fbmksICZvYW1fZnJhbWUsICZwcm90b2NvbCk7CisgICAgQkNNT1NfUkVUVVJOX09OX0VSUk9SKGVycik7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLm9wY29kZSA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfQUNLOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfYWNrLmJsb2NrID0gMDsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX2Fjay5lcnJvciA9IGVycm9yOworCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGtleS0+ZXBvbl9uaSwgJmtleS0+bWFjX2FkZHJlc3MsICZvYW1fZnJhbWUpKQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkZhaWxlZCB0byBzZW5kIGZ3IHVwZ3JhZGUgYWNrXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIlNlbnQgYWNrOiBlcnJvciAldVxuIiwgZXJyb3IpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1fZHBvZV9yZXNldF90aW1lb3V0KGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZSAqc3RhdGUpCit7CisgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBzdGF0ZS0+ZGV2aWNlX2lkLCAmc3RhdGUtPmtleSwgIk9OVSB0b29rICV1IHVzIHRvIHJlc3BvbmRcbiIsIGJjbW9zX3RpbWVzdGFtcCgpIC0gc3RhdGUtPmxhc3RfdGltZSk7CisgICAgc3RhdGUtPmxhc3RfdGltZSA9IGJjbW9zX3RpbWVzdGFtcCgpOworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZzdGF0ZS0+dGltZXIsIHN0YXRlLT50aW1lb3V0X3VzKTsKK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1fZHBvZV9oYW5kbGVfYWNrKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgKmZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiIGNiKQoreworICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZSAqc3RhdGU7CisgICAgaW50IGJsb2NrX3NpemU7CisKKyAgICBzdGF0ZSA9IGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9nZXQoa2V5KTsKKworICAgIGlmIChOVUxMID09IHN0YXRlKQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIlJ4IHVuZXhwZWN0ZWQgYWNrXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzdGF0ZS0+ZG9uZSkKKyAgICB7CisgICAgICAgIGlmIChmdC0+dS5maWxlX2Fjay5ibG9jayAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwga2V5LCAiRmluYWwgYWNrIGNvbnRhaW5lZCBub24temVybyBibG9jazogJXVcbiIsIGZ0LT51LmZpbGVfYWNrLmJsb2NrKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGZ0LT51LmZpbGVfYWNrLmVycm9yKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfT0s6CisgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKElORk8sIGRldmljZV9pZCwga2V5LCAiVXBncmFkZSBzdWNjZXNzZnVsXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIlVwZ3JhZGUgZmFpbGVkIHdpdGggZXJyb3IgJXVcbiIsIGZ0LT51LmZpbGVfYWNrLmVycm9yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfcmVsZWFzZShzdGF0ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0ZS0+bGFzdF9ibG9jaysrOworICAgIGlmICgoc3RhdGUtPmxhc3RfYmxvY2sgLSAxKSA9PSBmdC0+dS5maWxlX2Fjay5ibG9jaykKKyAgICB7IC8qIHJldHJ5IGxhc3QgYmxvY2sgKi8KKyAgICAgICAgc3RhdGUtPmxhc3RfYmxvY2stLTsKKyAgICAgICAgc3RhdGUtPnJldHJpZXMrKzsKKyAgICAgICAgaWYgKHN0YXRlLT5yZXRyaWVzID4gMykKKyAgICAgICAgeworICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkV4Y2VlZGVkIHJldHJ5IGxpbWl0IG9uIGJsb2NrICV1XG4iLCBmdC0+dS5maWxlX2Fjay5ibG9jayk7CisgICAgICAgICAgICBlcG9uX29hbV9kcG9lX3NlbmRfYWNrKGRldmljZV9pZCwga2V5LCBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX1RJTUVPVVQpOworICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX3JlbGVhc2Uoc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zZW5kX2Jsb2NrKGRldmljZV9pZCwga2V5LCBmdC0+dS5maWxlX2Fjay5ibG9jaywgc3RhdGUtPmJ1Ziwgc3RhdGUtPmxhc3RfYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICBlcG9uX29hbV9kcG9lX3Jlc2V0X3RpbWVvdXQoc3RhdGUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHN0YXRlLT5sYXN0X2Jsb2NrID09IGZ0LT51LmZpbGVfYWNrLmJsb2NrKQorICAgIHsgLyogc2VuZCBuZXh0IGJsb2NrICovCisgICAgICAgIHN0YXRlLT5yZXRyaWVzID0gMDsKKyAgICAgICAgYmxvY2tfc2l6ZSA9IGZyZWFkKHN0YXRlLT5idWYsIDEsIHN0YXRlLT5ibG9ja19zaXplLCBzdGF0ZS0+ZmlsZSk7CisgICAgICAgIGlmIChibG9ja19zaXplID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zZW5kX2Jsb2NrKGRldmljZV9pZCwga2V5LCBmdC0+dS5maWxlX2Fjay5ibG9jaywgc3RhdGUtPmJ1ZiwgYmxvY2tfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS0+ZG9uZSA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICBlcG9uX29hbV9kcG9lX3NlbmRfYWNrKGRldmljZV9pZCwga2V5LCBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX09LKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+bGFzdF9ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKKyAgICAgICAgZXBvbl9vYW1fZHBvZV9yZXNldF90aW1lb3V0KHN0YXRlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogdW5leHBlY3RlZCBibG9jayAqLworICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwga2V5LCAiVW5leHBlY3RlZCBibG9jayByZXF1ZXN0ZWQ6ICV1IChleHBlY3RpbmcgJXUpXG4iLAorICAgICAgICAgICAgICAgICAgICAgZnQtPnUuZmlsZV9hY2suYmxvY2ssIHN0YXRlLT5sYXN0X2Jsb2NrICsgMSk7CisgICAgICAgIGVwb25fb2FtX2Rwb2Vfc2VuZF9hY2soZGV2aWNlX2lkLCBrZXksIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfQkFEX0JMT0NLKTsKKyAgICAgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX3JlbGVhc2Uoc3RhdGUpOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV90aW1lb3V0KGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGVwb25fb2FtX21zZ19kYXRhIG1zZ19kYXRhOworCisgICAgbXNnX2RhdGEudGltZW91dC5zdGF0ZSA9IChlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUqKWRhdGE7CisgICAgZXBvbl9vYW1fc2VuZF9vc19tc2coQkNNT1NfTVNHX0lEX0VQT05fT0FNX1RJTUVPVVQsICZtc2dfZGF0YSk7CisKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc3RhcnRfdXBncmFkZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmd19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0aW1lb3V0X3NlYykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5ID0geyAuZXBvbl9uaSA9IGVwb24sIC5tYWNfYWRkcmVzcyA9ICptYWMgfTsKKyAgICBiY21vc190aW1lcl9wYXJtIHRwID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gImZ3X3VwZ3JhZGVfdGltZXIiLAorICAgICAgICAub3duZXIgPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VQT05fT0FNLAorICAgICAgICAucGVyaW9kaWMgPSBCQ01PU19GQUxTRSwKKyAgICAgICAgLmhhbmRsZXIgPSBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfdGltZW91dAorICAgIH07CisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlICpzdGF0ZTsKKworICAgIGlmIChOVUxMICE9IGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9nZXQoJmxpbmtfa2V5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgfQorICAgIHN0YXRlID0gZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX2FkZCgmbGlua19rZXkpOworICAgIGlmIChOVUxMID09IHN0YXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgc3RhdGUtPmRldmljZV9pZCA9IGRldmljZV9pZDsKKyAgICBzdGF0ZS0+a2V5ID0gbGlua19rZXk7CisgICAgc3RhdGUtPmZpbGUgPSBmb3Blbihmd19maWxlLCAicmIiKTsKKyAgICBpZiAoTlVMTCA9PSBzdGF0ZS0+ZmlsZSkKKyAgICB7CisgICAgICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisgICAgfQorICAgIHN0YXRlLT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKKyAgICBzdGF0ZS0+YnVmID0gYmNtb3NfY2FsbG9jKGJsb2NrX3NpemUpOworICAgIGlmIChOVUxMID09IHN0YXRlLT5idWYpCisgICAgeworICAgICAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfcmVsZWFzZShzdGF0ZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBzdGF0ZS0+bGFzdF9ibG9jayA9IDB4ZmZmZjsvKi0xKi8KKyAgICBzdGF0ZS0+cmV0cmllcyA9IDA7CisgICAgc3RhdGUtPmRvbmUgPSBCQ01PU19GQUxTRTsKKyAgICB0cC5kYXRhID0gKGxvbmcpc3RhdGU7CisgICAgZXJyID0gYmNtb3NfdGltZXJfY3JlYXRlKCZzdGF0ZS0+dGltZXIsICZ0cCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX3JlbGVhc2Uoc3RhdGUpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBzdGF0ZS0+dGltZW91dF91cyA9IHRpbWVvdXRfc2VjICogMTAwMCAqIDEwMDA7CisgICAgc3RhdGUtPmxhc3RfdGltZSA9IGJjbW9zX3RpbWVzdGFtcCgpOworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZzdGF0ZS0+dGltZXIsIHN0YXRlLT50aW1lb3V0X3VzKTsKKworICAgIGVyciA9IGVwb25fb2FtX21ha2VfZHBvZV9mcmFtZShkZXZpY2VfaWQsIGVwb24sICZvYW1fZnJhbWUsICZwcm90b2NvbCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX3JlbGVhc2Uoc3RhdGUpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIub3Bjb2RlID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9XUklURTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50ID0gMDsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX3dyaXRlLmZpbGVuYW1lID0gTlVMTDsKKworICAgIGVyciA9IGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKHN0YXRlKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9yZXNldF9vbnUoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X2Vwb25fbmkgZXBvbiwgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlIHZhcnNbMl0gPSB7fTsKKworICAgIGVyciA9IGVwb25fb2FtX21ha2VfZHBvZV9mcmFtZShkZXZpY2VfaWQsIGVwb24sICZvYW1fZnJhbWUsICZwcm90b2NvbCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS5vcCA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID0KKyAgICAgICAgMjsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5zZXRfcmVxdWVzdC52YXJzID0gdmFyczsKKyAgICB2YXJzWzBdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT047CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24ubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFU0VUX09OVTsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ7CisgICAgdmFyc1sxXS51LmVuZC51bmtub3duX2NvdW50ID0gMDsKKyAgICB2YXJzWzFdLnUuZW5kLnVua25vd24gPSBOVUxMOworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9oYW5kbGVfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICpjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcnhfY2IgY2IpCit7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnQtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQyA9PSBjb250ZW50LT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzW2ldLnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY29udGVudC0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c1tpXS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS5vdWkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gY2IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNiKGRldmljZV9pZCwga2V5LT5lcG9uX25pLCAma2V5LT5tYWNfYWRkcmVzcywgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EUE9FX0VWRU5ULCBCQ01fRVJSX09LKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coSU5GTywgZGV2aWNlX2lkLCBrZXksICJSZWNlaXZlZCBEUG9FIGV2ZW50ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c1tpXS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUuZXZlbnRfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9oYW5kbGVfZHBvZV9nZXRfcmVzcG9uc2UoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiIGNiKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGV2aWNlX2lkLCBrZXksICJSeCAldSB2YXJzXG4iLCBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIiAldTogYnJhbmNoICV1XG4iLCBpLCBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLmJyYW5jaCk7CisgICAgICAgIGlmIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFID09IGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaV0uYnJhbmNoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGggPgorICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VSUk9SX0NPREVfTk9fRVJST1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkVycm9yIDB4JXggZ2V0dGluZyBEUG9FIGV4dGVuZGVkIGF0dHJpYnV0ZSAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX0lEOgorICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coSU5GTywgZGV2aWNlX2lkLCBrZXksICJHb3QgRFBvRSBPTlVJRCAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm9udV9pZC5pZC51OFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUub251X2lkLmlkLnU4WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5vbnVfaWQuaWQudThbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm9udV9pZC5pZC51OFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUub251X2lkLmlkLnU4WzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5vbnVfaWQuaWQudThbNV0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9MT0dJQ0FMX0xJTktTOgorICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coSU5GTywgZGV2aWNlX2lkLCBrZXksICJHb3QgRFBvRSBNYXggTG9naWNhbCBMaW5rcyBCaURpciAldSwgRG93bk9ubHkgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm1heF9sb2dpY2FsX2xpbmtzLmJpZGlyZWN0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm1heF9sb2dpY2FsX2xpbmtzLmRvd25zdHJlYW1fb25seSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMICE9IGNiKQorICAgIHsKKyAgICAgICAgY2IoZGV2aWNlX2lkLCBrZXktPmVwb25fbmksICZrZXktPm1hY19hZGRyZXNzLCBCQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX1JYX0lEX0RQT0VfR0VUX1JFU1BPTlNFLCByYyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9oYW5kbGVfZHBvZV9zZXRfcmVzcG9uc2UoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiIGNiKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGV2aWNlX2lkLCBrZXksICJSeCAldSB2YXJzXG4iLCBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIiAldTogYnJhbmNoICV1XG4iLCBpLCBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzW2ldLmJyYW5jaCk7CisgICAgICAgIHN3aXRjaCAoZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1tpXS5icmFuY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgICAgICBpZiAoZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGggPgorICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX05PX0VSUk9SKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkVycm9yIDB4JXggc2V0dGluZyBEUG9FIGV4dGVuZGVkIGF0dHJpYnV0ZSAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYpOworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coSU5GTywgZGV2aWNlX2lkLCBrZXksICJTdWNjZXNzZnVsbHkgc2V0IERQb0UgZXh0ZW5kZWQgYXR0cmlidXRlIDB4JTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjoKKyAgICAgICAgICAgICAgICBpZiAoZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24ud2lkdGggPgorICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX05PX0VSUk9SKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkVycm9yIDB4JXggcGVyZm9ybWluZyBEUG9FIGV4dGVuZGVkIGFjdGlvbiAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbi53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hY3Rpb24uYWN0aW9uLmxlYWYpOworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coSU5GTywgZGV2aWNlX2lkLCBrZXksICJTdWNjZXNzZnVsbHkgcGVyZm9ybWVkIERQb0UgZXh0ZW5kZWQgYWN0aW9uIDB4JTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hY3Rpb24uYWN0aW9uLmxlYWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKE5VTEwgIT0gY2IpCisgICAgeworICAgICAgICBjYihkZXZpY2VfaWQsIGtleS0+ZXBvbl9uaSwgJmtleS0+bWFjX2FkZHJlc3MsIEJDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fUlhfSURfRFBPRV9TRVRfUkVTUE9OU0UsIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2hhbmRsZV9kcG9lX2ZpbGVfdHJhbnNmZXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiIGNiKQoreworICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGV2aWNlX2lkLCBrZXksICJHb3QgRFBvRSBGaWxlIFRyYW5zZmVyOiAldVxuIiwgZHBvZS0+dS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIub3Bjb2RlKTsKKyAgICBzd2l0Y2ggKGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9BQ0s6CisgICAgICAgICAgICBFUE9OX09BTV9MT0coREVCVUcsIGRldmljZV9pZCwga2V5LCAiUnggYWNrIGJsb2NrICV1IGVycm9yICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV9hY2suYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX2Fjay5lcnJvcik7CisgICAgICAgICAgICBzd2l0Y2ggKGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV9hY2suZXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX09LOgorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2hhbmRsZV9hY2soZGV2aWNlX2lkLCBrZXksICZkcG9lLT51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2ZlciwgY2IpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwga2V5LCAiRmlsZSB0cmFuc2ZlciBmYWlsZWQgb24gYmxvY2sgJXUgd2l0aCBlcnJvciAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV9hY2suYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfYWNrLmVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgICAgICBFUE9OX09BTV9MT0coREVCVUcsIGRldmljZV9pZCwga2V5LCAiUnggZGF0YVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1JFQUQ6CisgICAgICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwga2V5LCAiUnggcmVhZCByZXF1ZXN0XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfV1JJVEU6CisgICAgICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwga2V5LCAiUnggd3JpdGUgcmVxdWVzdFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGV2aWNlX2lkLCBrZXksICJVbmtub3duIERQb0UgRmlsZSBUcmFuc2ZlciBvcGNvZGU6ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLm9wY29kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2hhbmRsZV9kcG9lKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeF9jYiBjYikKK3sKKyAgICBFUE9OX09BTV9MT0coREVCVUcsIGRldmljZV9pZCwga2V5LCAiUnggRFBvRSBvcGNvZGUgJXVcbiIsIGRwb2UtPm9wKTsKKyAgICBzd2l0Y2ggKGRwb2UtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgZXBvbl9vYW1faGFuZGxlX2Rwb2VfZ2V0X3Jlc3BvbnNlKGRldmljZV9pZCwgZHBvZSwga2V5LCBjYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgZXBvbl9vYW1faGFuZGxlX2Rwb2Vfc2V0X3Jlc3BvbnNlKGRldmljZV9pZCwgZHBvZSwga2V5LCBjYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIGVwb25fb2FtX2hhbmRsZV9kcG9lX2ZpbGVfdHJhbnNmZXIoZGV2aWNlX2lkLCBkcG9lLCBrZXksIGNiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9wcm94eV9yeChlcG9uX29hbV9wcm94eV9yeF9kYXRhICpkYXRhKQoreworICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQgKmNhcCA9IChiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkKilkYXRhLT5yeDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZTsKKworICAgIG9hbV9mcmFtZSA9IGVwb25fb2FtX3VucGFjayhkYXRhLT5kZXZpY2VfaWQsIGNhcC0+ZGF0YS5mcmFtZS5sZW4sIGNhcC0+ZGF0YS5mcmFtZS52YWwpOworICAgIGlmIChOVUxMID09IG9hbV9mcmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAob2FtX2ZyYW1lLT5wcm90b2NvbHNfY291bnQgPT0gMCkKKyAgICB7CisgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGF0YS0+ZGV2aWNlX2lkLCAmY2FwLT5rZXksICJObyBwcm90b2NvbHMgaW4gT0FNIGZyYW1lXG4iKTsKKyAgICAgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkYXRhLT5kZXZpY2VfaWQsICZjYXAtPmtleSwgIlJ4IGV0aGVydHlwZSAlMDR4IHN1YnR5cGUgJTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgb2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0uZXRoZXJ0eXBlLCBvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUuc3VidHlwZSk7CisgICAgaWYgKChCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MID09IG9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLmV0aGVydHlwZSkgJiYKKyAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNID09IG9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS5zdWJ0eXBlKSkKKyAgICB7CisgICAgICAgIGlmIChvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uZmxhZ3MgJiBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xJTktfRkFVTFQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGRhdGEtPmNiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGEtPmNiKGRhdGEtPmRldmljZV9pZCwgY2FwLT5rZXkuZXBvbl9uaSwgJmNhcC0+a2V5Lm1hY19hZGRyZXNzLCBCQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX1JYX0lEX0xJTktfRkFVTFQsIEJDTV9FUlJfT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkYXRhLT5kZXZpY2VfaWQsICZjYXAtPmtleSwgIlJlY2VpdmVkIE9BTSBsaW5rIGZhdWx0XG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmZsYWdzICYgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19EWUlOR19HQVNQKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBkYXRhLT5jYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhLT5jYihkYXRhLT5kZXZpY2VfaWQsIGNhcC0+a2V5LmVwb25fbmksICZjYXAtPmtleS5tYWNfYWRkcmVzcywgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EWUlOR19HQVNQLCBCQ01fRVJSX09LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGF0YS0+ZGV2aWNlX2lkLCAmY2FwLT5rZXksICJSZWNlaXZlZCBPQU0gZHlpbmcgZ2FzcFxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5mbGFncyAmIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfQ1JJVElDQUxfRVZFTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGRhdGEtPmNiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGEtPmNiKGRhdGEtPmRldmljZV9pZCwgY2FwLT5rZXkuZXBvbl9uaSwgJmNhcC0+a2V5Lm1hY19hZGRyZXNzLCBCQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX1JYX0lEX0NSSVRJQ0FMX0VWRU5ULCBCQ01fRVJSX09LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGF0YS0+ZGV2aWNlX2lkLCAmY2FwLT5rZXksICJSZWNlaXZlZCBPQU0gY3JpdGljYWwgZXZlbnRcbiIpOworICAgICAgICB9CisgICAgICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGF0YS0+ZGV2aWNlX2lkLCAmY2FwLT5rZXksICJSeCBvcGNvZGUgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICBvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC5jb2RlKTsKKyAgICAgICAgc3dpdGNoIChvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC5jb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk86CisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIGlnbm9yZSBpbmZvIC0gdGhpcyBzaG91bGQgYmUgaGFuZGxlZCBieSBlb24gKi8KKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgICAgIGVwb25fb2FtX2hhbmRsZV9ldmVudChkYXRhLT5kZXZpY2VfaWQsICZvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudCwgJmNhcC0+a2V5LCBkYXRhLT5jYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coREVCVUcsIGRhdGEtPmRldmljZV9pZCwgJmNhcC0+a2V5LCAiUnggT1VJICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS5vdWkpOworICAgICAgICAgICAgICAgIHN3aXRjaCAob2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUub3VpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwb25fb2FtX2hhbmRsZV9kcG9lKGRhdGEtPmRldmljZV9pZCwgJm9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZSwgJmNhcC0+a2V5LCBkYXRhLT5jYik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vc19mcmVlKG9hbV9mcmFtZSk7CisgICAgYmNtb2x0X21zZ19mcmVlKCZkYXRhLT5yeC0+aGRyKTsKK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1fZHBvZV9oYW5kbGVfZndfdXBncmFkZV90aW1lb3V0KGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZSAqc3RhdGUpCit7CisgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBzdGF0ZS0+ZGV2aWNlX2lkLCAmc3RhdGUtPmtleSwgIkZpcm13YXJlIHVwZ3JhZGUgdGltZWQgb3V0XG4iKTsKKyAgICBlcG9uX29hbV9kcG9lX3NlbmRfYWNrKHN0YXRlLT5kZXZpY2VfaWQsICZzdGF0ZS0+a2V5LCBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX1RJTUVPVVQpOworICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKHN0YXRlKTsKK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1faGFuZGxlX29zX21zZyhiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBlcG9uX29hbV9tc2cgKm1zZyA9IChlcG9uX29hbV9tc2cqKW9zX21zZzsKKworICAgIHN3aXRjaCAobXNnLT5vc19tc2cudHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT1NfTVNHX0lEX0VQT05fT0FNX1BST1hZX1JYOgorICAgICAgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcHJveHlfcngoJm1zZy0+ZGF0YS5wcm94eV9yeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PU19NU0dfSURfRVBPTl9PQU1fVElNRU9VVDoKKyAgICAgICAgICAgIGVwb25fb2FtX2Rwb2VfaGFuZGxlX2Z3X3VwZ3JhZGVfdGltZW91dChtc2ctPmRhdGEudGltZW91dC5zdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGVwb25fb2FtX2xvZ1swXSwgIlVua25vd24gT1MgbWVzc2FnZSAldVxuIiwgbXNnLT5vc19tc2cudHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgYmNtb3NfZnJlZShvc19tc2cpOworfQorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9wcm94eV9yeCAqcngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiIGNiKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQgKmNhcCA9IChiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkKilyeDsKKyAgICBlcG9uX29hbV9tc2dfZGF0YSBtc2dfZGF0YSA9IHt9OworCisgICAgaWYgKCFpc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgoQkNNT0xUX09CSl9JRF9FUE9OX0xJTksgIT0gcngtPmhkci5vYmpfdHlwZSkgfHwKKyAgICAgICAgKEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfRlJBTUVfQ0FQVFVSRUQgIT0gcngtPmhkci5zdWJncm91cCkgfHwKKyAgICAgICAgKGNhcC0+ZGF0YS5mcmFtZS52YWxbMTJdICE9IDB4ODgpIHx8CisgICAgICAgIChjYXAtPmRhdGEuZnJhbWUudmFsWzEzXSAhPSAweDA5KSB8fAorICAgICAgICAoY2FwLT5kYXRhLmZyYW1lLnZhbFsxNF0gIT0gMHgwMykpCisgICAgeworICAgICAgICByZXR1cm47IC8qIG5vdCBPQU0gZnJhbWUgY2FwdHVyZWQgb24gYSBsaW5rIC0gaWdub3JlICovCisgICAgfQorCisgICAgbXNnX2RhdGEucHJveHlfcnguZGV2aWNlX2lkID0gZGV2aWNlX2lkOworICAgIG1zZ19kYXRhLnByb3h5X3J4LmNiID0gY2I7CisgICAgcmMgPSBiY21vbHRfbXNnX2Nsb25lKChiY21vbHRfbXNnKiopJm1zZ19kYXRhLnByb3h5X3J4LnJ4LCAmcngtPmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbZGV2aWNlX2lkXSwgIlByb3h5IFJ4IGNsb25lIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcG9uX29hbV9zZW5kX29zX21zZyhCQ01PU19NU0dfSURfRVBPTl9PQU1fUFJPWFlfUlgsICZtc2dfZGF0YSkpCisgICAgeworICAgICAgICBiY21vbHRfbXNnX2ZyZWUoJm1zZ19kYXRhLnByb3h5X3J4LnJ4LT5oZHIpOworICAgIH0KK30KKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5xcGFybSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC5uYW1lID0gInVzZXJfYXBwbF9lcG9uX29hbV9tb2R1bGUiLAorICAgICAgICAgICAgLnNpemUgPSBNQVhfQ09OQ1VSUkVOVF9MSU5LUworICAgICAgICB9CisgICAgfTsKKyAgICBiY21vc190YXNrX3Bhcm0gdGFza19wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJ1c2VyX2FwcGxfZXBvbl9vYW1fdGFzayIsCisgICAgICAgIC5wcmlvcml0eSAgICAgPSBCQ01PU19UQVNLX1BSSU9SSVRZXzEyLAorICAgICAgICAuY29yZSAgICAgICAgID0gQkNNT1NfQ1BVX0NPUkVfQU5ZLCAvKiBObyBDUFUgYWZmaW5pdHkgKi8KKyAgICAgICAgLmluaXRfaGFuZGxlciA9IE5VTEwKKyAgICB9OworCisgICAgaWYgKGlzX3J1bm5pbmcpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgRU5BQkxFX0xPRworICAgIGludCBpOworICAgIGNoYXIgbG9nX25hbWVbTUFYX0RFVl9MT0dfSURfTkFNRV0gPSB7fTsKKyAgICBmb3IgKGk9MDsgaTxCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgIHsKKyAgICAgICAgc25wcmludGYobG9nX25hbWUsIHNpemVvZihsb2dfbmFtZSktMSwgImVwb25fb2FtJWQiLCBpKTsKKyAgICAgICAgZXBvbl9vYW1fbG9nW2ldID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX25hbWUsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIH0KKyNlbmRpZgorICAgIGRwb2VfZndfdXBncmFkZV9zdGF0ZSA9IGhhc2hfdGFibGVfY3JlYXRlKE1BWF9DT05DVVJSRU5UX0xJTktTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRwb2VfZndfdXBncmFkZV9zdGF0ZSIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGJjbW9zX3Rhc2tfY3JlYXRlKCZlcG9uX29hbV90YXNrLCAmdGFza19wYXJhbXMpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhGQVRBTCwgZXBvbl9vYW1fbG9nWzBdLCAiRmFpbGVkIHRvIGNyZWF0ZSBFUE9OIE9BTSB0YXNrIVxuIik7CisgICAgfQorICAgIGlmIChCQ01fRVJSX09LICE9IGJjbW9zX21vZHVsZV9jcmVhdGUoQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9FUE9OX09BTSwgJmVwb25fb2FtX3Rhc2ssICZtb2R1bGVfcGFyYW1zKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRkFUQUwsIGVwb25fb2FtX2xvZ1swXSwgIkZhaWxlZCB0byBjcmVhdGUgRVBPTiBPQU0gbW9kdWxlIVxuIik7CisgICAgfQorICAgIGlzX3J1bm5pbmcgPSBCQ01PU19UUlVFOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0vYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZGM5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9IXworCisjaW5jbHVkZSAiYmNtY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZy5oIgorI2luY2x1ZGUgImJjbW9sdF9lcG9uX29hbV90eXBlcy5oIgorCisjZGVmaW5lIE1BWF9RVUVVRV9TRVRTICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX1JFUE9SVF9USFJFU0hPTERTICAgOAorCitzdGF0aWMgY29uc3QgYmNtb3NfbWFjX2FkZHJlc3Mgc2xvd19wcm90b2NvbF9tdWx0aWNhc3RfbWFjID0ge3sweDAxLDB4ODAsMHhjMiwweDAwLDB4MDAsMHgwMn19OworCisvKiBUeXBlZGVmIHJlcXVpcmVkIGZvciBjb252ZXlpbmcgYSAyLWRpbWVuc2lvbmFsIGFycmF5IHRvIGVwb25fb2FtX2Rwb2Vfc2V0X3JlcG9ydF90aHJlc2hvbGRzKCkuICovCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9lcG9uX29hbV9xdWV1ZV9zZXRzW01BWF9RVUVVRV9TRVRTXVtNQVhfUkVQT1JUX1RIUkVTSE9MRFNdOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX1JYX0lEX0xJTktfRkFVTFQsCisgICAgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EWUlOR19HQVNQLAorICAgIEJDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fUlhfSURfQ1JJVElDQUxfRVZFTlQsCisgICAgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EUE9FX0VWRU5ULAorICAgIEJDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fUlhfSURfRFBPRV9HRVRfUkVTUE9OU0UsCisgICAgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EUE9FX1NFVF9SRVNQT05TRSwKK30gYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9yeF9pZDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgRFBPRV9SVUxFX1ZMQU5fTU9ERV9OT05FLAorICAgIERQT0VfUlVMRV9WTEFOX01PREVfQURELAorICAgIERQT0VfUlVMRV9WTEFOX01PREVfUkVNT1ZFLAorCisgICAgRFBPRV9SVUxFX1ZMQU5fTU9ERV9DT1VOVAorfSBkcG9lX3J1bGVfdmxhbl9tb2RlOworCisvKiBEdXJpbmcgcGFyc2luZyBvZiBPQU0gaW5kaWNhdGlvbiwgdGhpcyBvcHRpb25hbCBjYWxsYmFjayBtYXkgYmUgY2FsbGVkLiAqLwordHlwZWRlZiB2b2lkICgqYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcnhfY2IpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fcnhfaWQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfZXJybm8gcmMpOworCisvKiBDYWxsYmFjayAnY2InIGlzIG9wdGlvbmFsLiAqLwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfcHJveHlfcnggKnJ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeF9jYiBjYik7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX3BhY2tfZnJhbWUoYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpvYW1fZnJhbWUsIHVpbnQ4X3QgKipidWZmZXIsIHVpbnQxNl90ICpsZW5ndGgpOworCitiY21vc19lcnJubyBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lKTsKKworYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICplcG9uX29hbV91bnBhY2soYmNtb2x0X2RldmlkIGRldmljZV9pZCwgdWludDMyX3QgbGVuLCB1aW50OF90ICpieXRlcyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZ2V0X2NyaXRpY2FsX2luZm8oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X29hbV9yYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXgpOworCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9yZXBvcnRfdGhyZXNob2xkcyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9xdWV1ZV9zZXRzIHF1ZXVlX3NldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9xdWV1ZV9zZXRzKTsKKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9zZXRfZW5jcnlwdGlvbigKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGUgZW5jX21vZGUsCisgICAgdWludDE2X3QgcGVyaW9kKTsKKworYmNtb3NfYm9vbCBlcG9uX29hbV9pc19kcG9lKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtKTsKKworYmNtb3NfYm9vbCBlcG9uX29hbV9pc19kcG9lX2VuY3J5cHRfcmVzcG9uc2UoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2UpOworCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpOworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjKTsKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlcyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X2Jhc2ljX3F1ZXVlX2NvbmZpZyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHVwX3F1ZXVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkbl9xdWV1ZV9zaXplKTsKKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19uZXR3b3JrX3BvbihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lX3J1bGVfdmxhbl9tb2RlIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2bGFuX3RhZ1s0XSk7CitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lX3J1bGVfdmxhbl9tb2RlIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgdmxhbl90YWdbNF0pOworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlcyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjKTsKKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc193aXRoX3ZsYW4oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2bGFuX3RhZ1s0XSk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZW5hYmxlX3VzZXJfdHJhZmZpYyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZGlzYWJsZV91c2VyX3RyYWZmaWMoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc3RhcnRfdXBncmFkZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmd19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0aW1lb3V0X3NlYyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfcmVzZXRfb251KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9lcG9uX25pIGVwb24sIGJjbW9zX21hY19hZGRyZXNzICptYWMpOworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faW5pdCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtX2NsaS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYzA4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtX2NsaS9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKyAgICBNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfZXBvbl9vYW1fY2xpCisgICAgTU9EX1RZUEUgPSBsaWIKKwlNT0RfREVQUyA9IHV0aWxzIGRldl9sb2cgY29tbW9uX2Vwb25fb2FtIGJjbV91c2VyX2FwcGxfZXBvbl9vYW0KKyAgICBzcmNzID0gYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9jbGkuYworICAgIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCU1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKyAgICBlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbV9jbGkvYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4ZWFhNgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgIG9mIHRoZSBzb2Z0d2FyZS4KKworICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgIHdyaXR0ZW4gY29uc2VudC4KKworICA6PgorKi8KKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgImJjbW9sdF9tYXRoLmgiCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNpbmNsdWRlICJiY21vbHRfYXBpLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X2Vwb25fb2FtX3R5cGVzLmgiCisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2dldF9jcml0aWNhbF9pbmZvX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiA9IChiY21vbHRfZXBvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfZ2V0X2NyaXRpY2FsX2luZm8oY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9zZXRfb2FtX3JhdGVfY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKyAgICB1aW50OF90IG1pbiA9ICh1aW50OF90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbiIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQ4X3QgbWF4ID0gKHVpbnQ4X3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4IiktPnZhbHVlLnVudW1iZXI7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9zZXRfb2FtX3JhdGUoY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMsIG1pbiwgbWF4KTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X3JlcG9ydF90aHJlc2hvbGRzX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisgICAgYmNtY2xpX2NtZF9wYXJtICpxdWV1ZV9zZXRfcGFybXNbTUFYX1FVRVVFX1NFVFNdOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3F1ZXVlX3NldHMgcXVldWVfc2V0czsKKyAgICB1aW50OF90IGksIGosIG51bV9xdWV1ZV9zZXRzID0gMDsKKworICAgIC8qIHByb2Nlc3MgaW5wdXQgKi8KKyAgICBxdWV1ZV9zZXRfcGFybXNbMF0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJxdWV1ZV8wIik7CisgICAgcXVldWVfc2V0X3Bhcm1zWzFdID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicXVldWVfMSIpOworICAgIHF1ZXVlX3NldF9wYXJtc1syXSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInF1ZXVlXzIiKTsKKyAgICBxdWV1ZV9zZXRfcGFybXNbM10gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJxdWV1ZV8zIik7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9RVUVVRV9TRVRTOyBpKyspCisgICAgeworICAgICAgICBpZiAoTlVMTCAhPSBxdWV1ZV9zZXRfcGFybXNbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG51bV9xdWV1ZV9zZXRzKys7CisgICAgICAgICAgICBpZiAocXVldWVfc2V0X3Bhcm1zW2ldLT5hcnJheV9zaXplICE9IHF1ZXVlX3NldF9wYXJtc1swXS0+YXJyYXlfc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiQWxsIHF1ZXVlIHNldHMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByZXBvcnQgdGhyZXNob2xkcyFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcXVldWVfc2V0X3Bhcm1zW2ldLT5hcnJheV9zaXplOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlX3NldF9wYXJtc1tpXS0+dmFsdWVzW2pdLnVudW1iZXIgPiA2NTUzNSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJRdWV1ZSBTZXQgJXUsIFRocmVzaG9sZCAldTogJWx1IGlzIG5vdCBhIHZhbGlkIHJlcG9ydCB0aHJlc2hvbGQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBqLCBxdWV1ZV9zZXRfcGFybXNbaV0tPnZhbHVlc1tqXS51bnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcXVldWVfc2V0c1tpXVtqXSA9ICh1aW50MTZfdClxdWV1ZV9zZXRfcGFybXNbaV0tPnZhbHVlc1tqXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBNQVhfUVVFVUVfU0VUUzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHF1ZXVlX3NldF9wYXJtc1tqXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJJbmNsdWRlZCBxdWV1ZSBzZXRzIG11c3QgYmUgc2VxdWVudGlhbCBmcm9tIDAhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9zZXRfcmVwb3J0X3RocmVzaG9sZHMoY3VycmVudF9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlX3NldF9wYXJtc1swXS0+YXJyYXlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3F1ZXVlX3NldHMpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24oY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydF9jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0KGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzKGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X2Jhc2ljX3F1ZXVlX2NvbmZpZ19jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisgICAgdWludDhfdCB1cF9xdWV1ZV9zaXplID0gKHVpbnQ4X3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBfc2l6ZSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQ4X3QgZG5fcXVldWVfc2l6ZSA9ICh1aW50OF90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRuX3NpemUiKS0+dmFsdWUudW51bWJlcjsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX3NldF9iYXNpY19xdWV1ZV9jb25maWcoY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMsIHVwX3F1ZXVlX3NpemUsIGRuX3F1ZXVlX3NpemUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19uZXR3b3JrX3Bvbl9jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uKGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjLCBEUE9FX1JVTEVfVkxBTl9NT0RFX05PTkUsIE5VTEwpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc191c2VyX3BvcnRfY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydChjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYywgRFBPRV9SVUxFX1ZMQU5fTU9ERV9OT05FLCBOVUxMKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlcyhjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3dpdGhfdmxhbl9jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiA9IChiY21vbHRfZXBvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworICAgIHVpbnQzMl90IHZsYW4gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDhfdCB2bGFuX3RhZ1s0XTsKKworICAgIHZsYW4gPSBCQ01PU19FTkRJQU5fQ1BVX1RPX0JJR19VMzIodmxhbik7CisgICAgdmxhbl90YWdbMF0gPSAodmxhbiA+PiAyNCkgJiAweGZmOworICAgIHZsYW5fdGFnWzFdID0gKHZsYW4gPj4gMTYpICYgMHhmZjsKKyAgICB2bGFuX3RhZ1syXSA9ICh2bGFuID4+IDgpICYgMHhmZjsKKyAgICB2bGFuX3RhZ1szXSA9ICh2bGFuID4+IDApICYgMHhmZjsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3dpdGhfdmxhbihjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYywgdmxhbl90YWcpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9lbmFibGVfdXNlcl90cmFmZmljX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2VuYWJsZV91c2VyX3RyYWZmaWMoY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9zdGFydF91cGdyYWRlX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKyAgICBjb25zdCBjaGFyICpmd19maWxlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZndfZmlsZSIpLT52YWx1ZS5zdHJpbmc7CisgICAgLyogVGhpcyBzaG91bGQgYmUgYmFzZWQgb24gdGhlIG5lZ290aWF0ZWQgUERVIHNpemUhICovCisgICAgdWludDE2X3QgYmxvY2tfc2l6ZSA9ICh1aW50MTZfdCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJibG9ja19zaXplIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDhfdCB0aW1lb3V0ID0gKHVpbnQ4X3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGltZW91dCIpLT52YWx1ZS51bnVtYmVyOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2Vfc3RhcnRfdXBncmFkZShjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYywgZndfZmlsZSwgYmxvY2tfc2l6ZSwgdGltZW91dCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3Jlc2V0X29udV9jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiA9IChiY21vbHRfZXBvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfcmVzZXRfb251KGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjKTsKK30KKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyNpZmRlZiBFTkFCTEVfQ0xJCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmRpcl9uYW1lID0gImVwb25fb2FtIjsKKworICAgIGlmIChiY21jbGlfZGlyX2ZpbmQodG9wX2RpciwgZGlyX25hbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJjbWNsaV9lbnRyeSAqb2FtX2RpciA9IGJjbWNsaV9kaXJfYWRkKHRvcF9kaXIsIGRpcl9uYW1lLCAiRVBPTiBPQU0iLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCVUdfT04oTlVMTCA9PSBvYW1fZGlyKTsKKworICAgIHN0YXRpYyBiY21jbGlfcGFybV92YWx1ZSBxdWV1ZV8wW01BWF9SRVBPUlRfVEhSRVNIT0xEU107CisgICAgc3RhdGljIGJjbWNsaV9wYXJtX3ZhbHVlIHF1ZXVlXzFbTUFYX1JFUE9SVF9USFJFU0hPTERTXTsKKyAgICBzdGF0aWMgYmNtY2xpX3Bhcm1fdmFsdWUgcXVldWVfMltNQVhfUkVQT1JUX1RIUkVTSE9MRFNdOworICAgIHN0YXRpYyBiY21jbGlfcGFybV92YWx1ZSBxdWV1ZV8zW01BWF9SRVBPUlRfVEhSRVNIT0xEU107CisKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2VfZ2V0X2NyaXRpY2FsX2luZm8iLCAiRFBvRSBnZXQgT05VIElEIGFuZCBtYXggbGlua3MiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2dldF9jcml0aWNhbF9pbmZvX2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2Vfc2V0X29hbV9yYXRlIiwgIkRQb0Ugc2V0IE9BTSByYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zZXRfb2FtX3JhdGVfY2xpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAibGluayBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtaW4iLCAiTWluaW11bSBPQU0gcmF0ZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYXgiLCAiTWF4aW11bSBPQU0gcmF0ZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9zZXRfcmVwb3J0X3RocmVzaG9sZHMiLCAiRFBvRSBzZXQgcmVwb3J0IHRocmVoc29sZHMiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX3NldF9yZXBvcnRfdGhyZXNob2xkc19jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fQVJSQVkoInF1ZXVlXzAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBvcnQgdGhyZWhzb2xkIGZvciBxdWV1ZSBzZXQgMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1JFUE9SVF9USFJFU0hPTERTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlXzApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0FSUkFZKCJxdWV1ZV8xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVwb3J0IHRocmVoc29sZCBmb3IgcXVldWUgc2V0IDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJNX1VOVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUkVQT1JUX1RIUkVTSE9MRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfMSksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fQVJSQVkoInF1ZXVlXzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBvcnQgdGhyZWhzb2xkIGZvciBxdWV1ZSBzZXQgMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9SRVBPUlRfVEhSRVNIT0xEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZV8yKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9BUlJBWSgicXVldWVfMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcG9ydCB0aHJlaHNvbGQgZm9yIHF1ZXVlIHNldCAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9VTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1JFUE9SVF9USFJFU0hPTERTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlXzMpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uIiwgIkRQb0UgY2xlYXIgaW5ncmVzcyBydWxlcyBmb3IgbmV0d29yayBQT04iLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb25fY2xpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAibGluayBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIDApKTsKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2VfY2xlYXJfaW5ncmVzc19ydWxlc191c2VyX3BvcnQiLCAiRFBvRSBjbGVhciBpbmdyZXNzIHJ1bGVzIGZvciB1c2VyIHBvcnQiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0X2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXMiLCAiRFBvRSBjbGVhciBpbmdyZXNzIHJ1bGVzIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2Vfc2V0X2Jhc2ljX3F1ZXVlX2NvbmZpZyIsICJEUG9FIHNldCBiYXNpYyBxdWV1ZSBjb25maWcgZm9yIDEgbGluay8xIHBvcnQiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX3NldF9iYXNpY19xdWV1ZV9jb25maWdfY2xpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAibGluayBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ1cF9zaXplIiwgInVwc3RyZWFtIHF1ZXVlIHNpemUiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZG5fc2l6ZSIsICJkb3duc3RyZWFtIHF1ZXVlIHNpemUiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24iLCAiRFBvRSBhZGQgaW5ncmVzcyBydWxlcyBmb3IgbmV0d29yayBQT04iLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uX2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydCIsICJEUG9FIGFkZCBpbmdyZXNzIHJ1bGVzIGZvciB1c2VyIHBvcnQiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydF9jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9hZGRfaW5ncmVzc19ydWxlcyIsICJEUG9FIGFkZCBpbmdyZXNzIHJ1bGVzIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9hZGRfaW5ncmVzc19ydWxlc193aXRoX3ZsYW4iLCAiRFBvRSBhZGQgaW5ncmVzcyBydWxlcyB3aXRoIFZMQU4iLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3dpdGhfdmxhbl9jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInZsYW4iLCAiVkxBTiIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9lbmFibGVfdXNlcl90cmFmZmljIiwgIkRQb0UgZW5hYmxlIHVzZXIgdHJhZmZpYyIsCisgICAgICAgICAgICAgICAgICAgIGVwb25fb2FtX2Rwb2VfZW5hYmxlX3VzZXJfdHJhZmZpY19jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX2Z3X3VwZ3JhZGUiLCAiRFBvRSBmaXJ3bWFyZSB1cGdyYWRlIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zdGFydF91cGdyYWRlX2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZndfZmlsZSIsICJGaXJtd2FyZSBmaWxlIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiYmxvY2tfc2l6ZSIsICJCbG9jayBzaXplIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInRpbWVvdXQiLCAiVGltZW91dCBpbiBzZWNvbmRzIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX3Jlc2V0X29udSIsICJEUG9FIHJlc2V0IE9OVSIsCisgICAgICAgICAgICAgICAgICAgIGVwb25fb2FtX2Rwb2VfcmVzZXRfb251X2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbV9jbGkvYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliNGFlOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9DTElfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fQ0xJX0hfCisKKyNpbmNsdWRlICJiY21jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfbXNnLmgiCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzkyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMgRmlsZSB0cmFuc2ZlciBhcHBsaWNhdGlvbgorCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKyAgICBNT0RfTkFNRSA9IGJjbV9pbWFnZV90cmFuc2ZlcgorICAgIE1PRF9UWVBFID0gbGliCisgICAgTU9EX0RFUFMgPSBob3N0X2FwaQorICAgIHNyY3MgPSBiY21vbHRfaW1hZ2VfdHJhbnNmZXIuYyBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfdXNlci5jIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuYworICAgIAorICAgIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgICAgICBNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisgICAgZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg1ZWFhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXIuYwpAQCAtMCwwICsxLDUwNyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNDpEVUFML0dQTDpzdGFuZGFyZAorCisgICBDb3B5cmlnaHQgKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtdHJfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSAiYmNtb2x0X2FwaS5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtb2x0X2ltYWdlX3RyYW5zZmVyLmgiCisjaW5jbHVkZSAiYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3VzZXIuaCIKKworc3RhdGljIGJjbXVzZXJfbWZ0cF9ibG9ja19zaXplX2dldCBtZnRwX2Jsb2NrX3NpemVfZ2V0Oworc3RhdGljIGJjbXVzZXJfbWZ0cF9jcmNfZ2V0IG1mdHBfY3JjX2dldF9jYjsKK3N0YXRpYyBiY211c2VyX21mdHBfaW1hZ2VfcmVhZCBtZnRwX3JlYWRfZGF0YV9jYjsKK3N0YXRpYyBiY211c2VyX21mdHBfbm90aWZpY2F0aW9uX3J4IG1mdHBfbm90aWZ5X3VzZXJfY2I7CitzdGF0aWMgbWZ0cF9jb250ZXh0IG1mdHBfY29udGV4dF9kYltCQ01UUl9NQVhfT0xUU107CisKK3N0YXRpYyBiY21vc19lcnJubyBtZnRwX2luZF9yeF9jYl9yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlKTsKK3N0YXRpYyBiY21vc19lcnJubyBtZnRwX2luZF9yeF9jYl91bnJlZ2lzdGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgbWZ0cF9lcnJfdG9fc3RhdHVzKGJjbW9zX2Vycm5vIGVycikKK3sKKyAgICBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1czsKKyAgICBzd2l0Y2ggKGVycikKKyAgICB7CisgICAgY2FzZSBCQ01fRVJSX09LOgorICAgICAgICBzdGF0dXMgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNX0VSUl9OT01FTToKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19NRU1PUllfQUxMT0NBVElPTl9GQUlMVVJFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTV9FUlJfSU5DT01QTEVURV9URVJNSU5BVElPTjoKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19QUkVNQVRVUkVfVEVSTUlOQVRJT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNX0VSUl9DSEVDS1NVTToKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19DUkNfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNX0VSUl9PVkVSRkxPVzoKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01fRVJSX09VVF9PRl9TWU5DOgorICAgICAgICBzdGF0dXMgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0JMT0NLX09VVF9PRl9TWU5DOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTV9FUlJfU1RBVEU6CisgICAgICAgIHN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01fRVJSX0lNQUdFX1RZUEU6CisgICAgICAgIHN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfVU5TVVBQT1JURURfRklMRV9UWVBFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0lOVEVSTkFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2NvbnN0IGNoYXIgKmJjbW9sdF91c2VyX21mdHBfc3RhdHVzX3RvX3N0cihiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1cykKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqbWZ0cF9zdGF0dXNfdG9fc3RyX3RhYmxlW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfX05VTV9PRl0gPQorICAgIHsKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTU10gPSAiU3VjY2VlZGVkIiwKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfTUVNT1JZX0FMTE9DQVRJT05fRkFJTFVSRV0gPSAiRVJST1I6IE1lbW9yeSBhbGxvY2F0aW9uIiwKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfVU5TVVBQT1JURURfRklMRV9UWVBFXSA9ICJFUlJPUjogSW52YWxpZCBpbWFnZSB0eXBlIiwKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQ1JDX0VSUk9SXSA9ICJFUlJPUjogQ2hlY2tzdW0iLAorICAgICAgICBbQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19CTE9DS19PVVRfT0ZfU1lOQ10gPSAiRVJST1I6IEJsb2NrIG91dC1vZi1zeW5jIiwKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5URVJOQUxfRVJST1JdID0gIkVSUk9SOiBCdWZmZXIgb3ZlcmZsb3ciLAorICAgICAgICBbQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19JTlZBTElEX1NUQVRFXSA9ICJFUlJPUjogSW52YWxpZCBzdGF0ZSIsCisgICAgICAgIFtCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1BSRU1BVFVSRV9URVJNSU5BVElPTl0gPSAiRVJST1I6IFByZW1hdHVyZSB0ZXJtaW5hdGlvbiIsCisgICAgICAgIFtCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0FDS19USU1FT1VUXSA9ICJFUlJPUjogQUNLIHRpbWVvdXQiCisgICAgfTsKKyAgICByZXR1cm4gKHN0YXR1cyA+PSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX19OVU1fT0YpID8gIjx1bmtub3duPiIgOiBtZnRwX3N0YXR1c190b19zdHJfdGFibGVbc3RhdHVzXTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyBpbmxpbmUgbWZ0cF9jb250ZXh0ICptZnRwX2NvbnRleHRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgcmV0dXJuICZtZnRwX2NvbnRleHRfZGJbZGV2aWNlXTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qKiBjb252ZXJ0IGRldmljZSBJRCB0byBtb2R1bGUgSUQgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfbW9kdWxlX2lkIG1mdHBfZGV2aWNlX2lkX3RvX21vZHVsZV9pZChiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIHJldHVybiAoQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9JTUFHRV9UUkFOU0ZFUjAgKyBkZXZpY2UpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoqIGV4YW1pbmVzIHRoZSBBQ0sgcmVzcG9uc2UuICovCitzdGF0aWMgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyBtZnRwX2NoZWNrX3BhcmFtcyhtZnRwX2NvbnRleHQgKmNvbnRleHQsCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhICphY2tfZGF0YSkKK3sKKyAgICBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUzsKKworICAgIGlmIChjb250ZXh0LT5ibG9ja19udW0gIT0gYWNrX2RhdGEtPmJsb2NrX251bWJlcikKKyAgICB7CisgICAgICAgIEJDTV9MT0coREVCVUcsIGNvbnRleHQtPmxvZ19pZCwgIkFDSyBibG9jayAjIG1pc21hdGNoOiBleHA9JXUgYWNrPSV1XG4iLCBjb250ZXh0LT5ibG9ja19udW0sIGFja19kYXRhLT5ibG9ja19udW1iZXIpOworICAgICAgICBzdGF0dXMgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0JMT0NLX09VVF9PRl9TWU5DOworICAgIH0KKyAgICBlbHNlIGlmIChjb250ZXh0LT5pbWFnZV90eXBlICE9IGFja19kYXRhLT5pbWFnZV90eXBlKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgY29udGV4dC0+bG9nX2lkLCAiQUNLIGltYWdlIHR5cGUgbWlzbWF0Y2g6IGV4cD0ldSBhY2s9JXVcbiIsIGNvbnRleHQtPmltYWdlX3R5cGUsIGFja19kYXRhLT5pbWFnZV90eXBlKTsKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19VTlNVUFBPUlRFRF9GSUxFX1RZUEU7CisgICAgfQorICAgIGVsc2UgaWYgKGFja19kYXRhLT5zdGF0dXMgIT0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgY29udGV4dC0+bG9nX2lkLCAiT0xUIHJldHVybmVkIGFuIGVycm9yOiAlc1xuIiwgYmNtb2x0X3VzZXJfbWZ0cF9zdGF0dXNfdG9fc3RyKGFja19kYXRhLT5zdGF0dXMpKTsKKyAgICAgICAgc3RhdHVzID0gYWNrX2RhdGEtPnN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyB2b2lkIG1mdHBfdGVybWluYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlLAorICAgIHVpbnQzMl90IGJsb2NrX251bSwgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyBzdGF0dXMpCit7CisgICAgbWZ0cF9jb250ZXh0ICpjb250ZXh0ID0gbWZ0cF9jb250ZXh0X2dldChkZXZpY2UpOworICAgIGJjbW9zX2Vycm5vIHJjID0gbWZ0cF9pbmRfcnhfY2JfdW5yZWdpc3RlcihkZXZpY2UpOworCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBjb250ZXh0LT5sb2dfaWQsICJGYWlsZWQgdG8gdW4tcmVnaXN0ZXIgSU5EIGNhbGxiYWNrXG4iKTsKKyAgICB9CisgICAgbWZ0cF9ub3RpZnlfdXNlcl9jYihkZXZpY2UsIGltYWdlX3R5cGUsIGJsb2NrX251bSwgc3RhdHVzKTsKKyAgICBjb250ZXh0LT5zdGF0dXMgPSBNRlRQX1NUQVRVU19ESVNBQkxFRDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qKiBTZW5kcyB0aGUgaW1hZ2UgdHJhbnNmZXIgc3RhcnQgb3BlcmF0aW9uIHRvIHRoZSBPTFQuICovCitzdGF0aWMgYmNtb3NfZXJybm8gbWZ0cF9zZW5kX3dycShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwKKyAgICB1aW50MzJfdCBpbWFnZV9zaXplLCB1aW50MzJfdCBjcmMzMiwgYmNtb2x0X3N0cl82NCAqaW1hZ2VfbmFtZSkKK3sKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0IG9wZXI7CisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgaW1hZ2VfdHlwZSwgaW1hZ2VfdHlwZSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGltYWdlX3NpemUsIGltYWdlX3NpemUpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBjcmMzMiwgY3JjMzIpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBpbWFnZV9uYW1lLCAqaW1hZ2VfbmFtZSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2UsICZvcGVyLmhkcik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiogU2VuZHMgYSBkYXRhIGJsb2NrIHRvIHRoZSBPTFQuICovCitzdGF0aWMgYmNtb3NfZXJybm8gbWZ0cF9zZW5kX2RhdGEoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDhfdCAqYnVmLCB1aW50MzJfdCBidWZfc2l6ZSwKKyAgICB1aW50MzJfdCBibG9ja19udW1iZXIsIGJjbW9zX2Jvb2wgbW9yZV9kYXRhKQoreworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsucmVzZXJ2ZWQgPSAwfTsKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGEgb3BlciA9IHt9OworICAgIGJjbW9sdF91OF9saXN0X3UxNl9oZXggZGF0YTsKKyAgICBkYXRhLmxlbiA9IGJ1Zl9zaXplOworICAgIGRhdGEudmFsID0gYnVmOworCisgICAgLyogQnVpbGRzIGEgdHJhbnNwb3J0IG1lc3NhZ2UgZm9yIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBrZXkpOworICAgIG9wZXIuaGRyLmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBibG9ja19udW1iZXIsIGJsb2NrX251bWJlcik7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwgbW9yZV9kYXRhLCBtb3JlX2RhdGEpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2RhdGEsIGRhdGEsIGRhdGEpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlLCAmb3Blci5oZHIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogaGFuZGxlciBmb3IgdGhlIE9QRVJBVElPTiBkZXZpY2UuaW1hZ2VfdHJhbnNmZXJfc3RhcnQuICovCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9tZnRwX3N0YXJ0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlKQoreworICAgIG1mdHBfY29udGV4dCAqY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKyAgICB1aW50MzJfdCBpbWFnZV9zaXplOworICAgIHVpbnQzMl90IGNyYzMyOworICAgIGNvbnN0IGNoYXIgKnBhdGhfbmFtZTsKKyAgICBjaGFyIGZpbGVfbmFtZVtNRlRQX01BWF9QQVRIX05BTUVfTEVOXTsKKyAgICBjaGFyICpiYXNlX25hbWU7CisgICAgYmNtb2x0X3N0cl82NCBpbWFnZV9uYW1lOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmIChjb250ZXh0LT5zdGF0dXMgIT0gTUZUUF9TVEFUVVNfRElTQUJMRUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKyAgICB9CisKKyAgICByYyA9IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfZmlsZV9zaXplX2dldChkZXZpY2UsIGltYWdlX3R5cGUsICZpbWFnZV9zaXplKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGNvbnRleHQtPmxvZ19pZCwgIkZhaWxlZCB0byBnZXQgdGhlIGltYWdlIHNpemVcbiIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcGF0aF9uYW1lID0gYmNtdXNlcl9kZXZpY2VfaW1hZ2VfbmFtZV9nZXQoaW1hZ2VfdHlwZSk7CisgICAgaWYgKHBhdGhfbmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiRmlsZSBub3QgZm91bmRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBpZiAoc3RybGVuKHBhdGhfbmFtZSkgPj0gc2l6ZW9mKGZpbGVfbmFtZSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBjb250ZXh0LT5sb2dfaWQsICJQYXRoIG5hbWUgdG9vIGxvbmdcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICAodm9pZClzdHJjcHkoZmlsZV9uYW1lLCBwYXRoX25hbWUpOyAgICAgICAvKiB0byBtYWtlIGxpbnQgaGFwcHkuICovCisKKyAgICBiYXNlX25hbWUgPSBiYXNlbmFtZShmaWxlX25hbWUpOworICAgIGlmIChzdHJsZW4oYmFzZV9uYW1lKSA+PSBzaXplb2YoaW1hZ2VfbmFtZSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBjb250ZXh0LT5sb2dfaWQsICJGaWxlIG5hbWUgdG9vIGxvbmdcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICAodm9pZClzdHJjcHkoaW1hZ2VfbmFtZS5zdHIsIGJhc2VfbmFtZSk7CisKKyAgICBjb250ZXh0LT5zdGF0dXMgPSBNRlRQX1NUQVRVU19XQUlUSU5HX0FDSzsKKyAgICBjb250ZXh0LT5ibG9ja19udW0gPSAwOworICAgIGNvbnRleHQtPmltYWdlX3R5cGUgPSBpbWFnZV90eXBlOworICAgIGNyYzMyID0gbWZ0cF9jcmNfZ2V0X2NiKGRldmljZSwgaW1hZ2VfdHlwZSk7CisgICAgQkNNX0xPRyhERUJVRywgY29udGV4dC0+bG9nX2lkLCAiSW1hZ2Ugc2l6ZT0ldSBjcmM9MHgleFxuIiwgaW1hZ2Vfc2l6ZSwgY3JjMzIpOworCisgICAgcmMgPSBtZnRwX2luZF9yeF9jYl9yZWdpc3RlcihkZXZpY2UpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIElORCBjYWxsYmFja1xuIik7CisgICAgICAgIEJVRygpOworICAgIH0KKworICAgIHJjID0gbWZ0cF9zZW5kX3dycShkZXZpY2UsIGltYWdlX3R5cGUsIGltYWdlX3NpemUsIGNyYzMyLCAmaW1hZ2VfbmFtZSk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBjb250ZXh0LT5sb2dfaWQsICJXUlEgT1BFUiBmYWlsZWQuICVzXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAodm9pZCltZnRwX2luZF9yeF9jYl91bnJlZ2lzdGVyKGRldmljZSk7CisgICAgICAgIGNvbnRleHQtPnN0YXR1cyA9IE1GVFBfU1RBVFVTX0RJU0FCTEVEOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmY29udGV4dC0+dGltZXIsIE1GVFBfQUNLX1RJTUVPVVRfVVMpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMgdm9pZCBtZnRwX3Byb2Nlc3NfbGFzdF9hY2soYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhICphY2tfZGF0YSkKK3sKKyAgICBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1czsKKyAgICBtZnRwX2NvbnRleHQgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KGRldmljZSk7CisKKyAgICBzdGF0dXMgPSBtZnRwX2NoZWNrX3BhcmFtcyhjb250ZXh0LCBhY2tfZGF0YSk7CisgICAgbWZ0cF90ZXJtaW5hdGUoZGV2aWNlLCBhY2tfZGF0YS0+aW1hZ2VfdHlwZSwgYWNrX2RhdGEtPmJsb2NrX251bWJlciwgc3RhdHVzKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIHJlYWRzIGEgZGF0YSBibG9jayB1c2luZyBjdXN0b21lci1wcm92aWRlZCBjYWxsYmFjayBhbmQgc2VuZHMgaXQgdG8gdGhlIGVtYmVkZGVkLiAqLworc3RhdGljIHZvaWQgbWZ0cF9wcm9jZXNzX2FjayhiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEgKmFja19kYXRhKQoreworICAgIHVpbnQzMl90IG9mZnNldCA9IDA7ICAgIC8qIGZpbGUtcG9zaXRpb24qLworICAgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSAwOworICAgIGJjbW9zX2Jvb2wgbW9yZV9kYXRhOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1czsKKyAgICBtZnRwX2NvbnRleHQgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KGRldmljZSk7CisKKyAgICBzdGF0dXMgPSBtZnRwX2NoZWNrX3BhcmFtcyhjb250ZXh0LCBhY2tfZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBtZnRwX3Rlcm1pbmF0ZShkZXZpY2UsIGNvbnRleHQtPmltYWdlX3R5cGUsIGFja19kYXRhLT5ibG9ja19udW1iZXIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvZmZzZXQgPSAoY29udGV4dC0+YmxvY2tfbnVtICogY29udGV4dC0+YmxvY2tfc2l6ZSk7CisgICAgY29udGV4dC0+YmxvY2tfbnVtKys7CisKKyAgICAvKiBDQUxMIENVU1RPTUVSLVBST1ZJREVEIENBTExCQUNLICovCisgICAgYnl0ZXNfcmVhZCA9IG1mdHBfcmVhZF9kYXRhX2NiKGRldmljZSwgY29udGV4dC0+aW1hZ2VfdHlwZSwgb2Zmc2V0LAorICAgICAgICBjb250ZXh0LT5idWYsIGNvbnRleHQtPmJsb2NrX3NpemUpOyAgLyogYmNtdXNlcl9tZnRwX3JlYWRfZGF0YSgpICovCisKKyAgICBtb3JlX2RhdGEgPSAhKGJ5dGVzX3JlYWQgPCBjb250ZXh0LT5ibG9ja19zaXplKTsKKworICAgIHJjID0gbWZ0cF9zZW5kX2RhdGEoZGV2aWNlLCBjb250ZXh0LT5idWYsIGJ5dGVzX3JlYWQsIGNvbnRleHQtPmJsb2NrX251bSwgbW9yZV9kYXRhKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coREVCVUcsIGNvbnRleHQtPmxvZ19pZCwgIkRBVEEgT1BFUiBmYWlsZWQuIEJsb2NrICV1LiAlc1xuIiwgY29udGV4dC0+YmxvY2tfbnVtLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICBtZnRwX3Rlcm1pbmF0ZShkZXZpY2UsIGFja19kYXRhLT5pbWFnZV90eXBlLCBhY2tfZGF0YS0+YmxvY2tfbnVtYmVyLCBtZnRwX2Vycl90b19zdGF0dXMocmMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJDTV9MT0coREVCVUcsIGNvbnRleHQtPmxvZ19pZCwgIlNlbnQgYmxvY2sjPSV1IGJ1Zl9zaXplPSV1IG1vcmU9JXVcbiIsIGNvbnRleHQtPmJsb2NrX251bSwgYnl0ZXNfcmVhZCwgbW9yZV9kYXRhKTsKKworICAgIGNvbnRleHQtPnN0YXR1cyA9IChtb3JlX2RhdGEpID8gTUZUUF9TVEFUVVNfV0FJVElOR19BQ0sgOiBNRlRQX1NUQVRVU19XQUlUSU5HX0xBU1RfQUNLOworCisgICAgYmNtb3NfdGltZXJfc3RhcnQoJmNvbnRleHQtPnRpbWVyLCBNRlRQX0FDS19USU1FT1VUX1VTKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIEFDSyBpbmRpY2F0aW9uIGNhbGxiYWNrICovCitzdGF0aWMgdm9pZCBtZnRwX3Byb2Nlc3NfaW5kKGJjbW9sdF9kZXZpZCBvbHQsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBtZnRwX2NvbnRleHQgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KG9sdCk7CisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSAqYWNrOworICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqYWNrX2RhdGE7CisKKyAgICBhY2sgPSAoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSAqKW1zZzsKKyAgICBhY2tfZGF0YSA9ICZhY2stPmRhdGE7CisKKyAgICBCQ01fTE9HKERFQlVHLCBjb250ZXh0LT5sb2dfaWQsICIjIyBBQ0s6IG9iaj0ldSwgZ3JvdXA9JXUsIGltYWdlPSV1LCBibG9jaz0ldSwgc3RhdHVzPSV1XG4iLAorICAgICAgICBtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBhY2tfZGF0YS0+aW1hZ2VfdHlwZSwgYWNrX2RhdGEtPmJsb2NrX251bWJlciwgYWNrX2RhdGEtPnN0YXR1cyk7CisKKyAgICBzd2l0Y2ggKGNvbnRleHQtPnN0YXR1cykKKyAgICB7CisgICAgY2FzZSBNRlRQX1NUQVRVU19XQUlUSU5HX0FDSzoKKyAgICAgICAgYmNtb3NfdGltZXJfc3RvcCgmY29udGV4dC0+dGltZXIpOworICAgICAgICBtZnRwX3Byb2Nlc3NfYWNrKG9sdCwgYWNrX2RhdGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1GVFBfU1RBVFVTX1dBSVRJTkdfTEFTVF9BQ0s6CisgICAgICAgIGJjbW9zX3RpbWVyX3N0b3AoJmNvbnRleHQtPnRpbWVyKTsKKyAgICAgICAgbWZ0cF9wcm9jZXNzX2xhc3RfYWNrKG9sdCwgYWNrX2RhdGEpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBUaGlzIGNvdWxkIGhhcHBlbiB3aGVuIHRoZSBTVEFSVCBvcGVyYXRpb24gZmFpbHMuICovCisgICAgICAgIEJDTV9MT0coREVCVUcsIGNvbnRleHQtPmxvZ19pZCwgIlVuZXhwZWN0ZWQgQUNLXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYmNtb2x0X21zZ19mcmVlKG1zZyk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMgYmNtb3NfZXJybm8gbWZ0cF9pbmRfcnhfY2JfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY210cl9oYW5kbGVyX3Bhcm0gdHBhcm0gPSB7CisgICAgICAgIC5ncm91cCA9IEJDTU9MVF9NR1RfR1JPVVBfQVVUTywKKyAgICAgICAgLm9iamVjdCA9IEJDTU9MVF9PQkpfSURfREVWSUNFLAorICAgICAgICAuc3ViZ3JvdXAgPSBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsCisgICAgICAgIC5hcHBfY2IgPSBtZnRwX3Byb2Nlc3NfaW5kLAorICAgICAgICAuZmxhZ3MgPSBCQ01PTFRfQVVUT19GTEFHU19ESVNQQVRDSCwKKyAgICB9OworICAgIG1mdHBfY29udGV4dCAqY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKyAgICB1aW50OF90IGluc3Q7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgdHBhcm0ubW9kdWxlID0gY29udGV4dC0+bW9kdWxlX2lkOworCisgICAgZm9yIChpbnN0ID0gMDsgKGluc3QgPCBCQ01UUl9NQVhfSU5TVEFOQ0VTKSAmJiAocmMgPT0gQkNNX0VSUl9PSyk7IGluc3QrKykKKyAgICB7CisgICAgICAgIHRwYXJtLmluc3RhbmNlID0gaW5zdDsKKyAgICAgICAgcmMgPSBiY210cl9tc2dfaGFuZGxlcl91bnJlZ2lzdGVyKGRldmljZSwgJnRwYXJtKTsKKyAgICAgICAgcmMgPSAocmMgPT0gQkNNX0VSUl9PSykgPyBiY210cl9tc2dfaGFuZGxlcl9yZWdpc3RlcihkZXZpY2UsICZ0cGFybSkgOiByYzsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1mdHBfaW5kX3J4X2NiX3VucmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY210cl9oYW5kbGVyX3Bhcm0gdHBhcm0gPSB7CisgICAgICAgIC5ncm91cCA9IEJDTU9MVF9NR1RfR1JPVVBfQVVUTywKKyAgICAgICAgLm9iamVjdCA9IEJDTU9MVF9PQkpfSURfREVWSUNFLAorICAgICAgICAuc3ViZ3JvdXAgPSBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsCisgICAgfTsKKyAgICB1aW50OF90IGluc3Q7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgZm9yIChpbnN0ID0gMDsgKGluc3QgPCBCQ01UUl9NQVhfSU5TVEFOQ0VTKSAmJiAocmMgPT0gQkNNX0VSUl9PSyk7IGluc3QrKykKKyAgICB7CisgICAgICAgIHRwYXJtLmluc3RhbmNlID0gaW5zdDsKKyAgICAgICAgcmMgPSBiY210cl9tc2dfaGFuZGxlcl91bnJlZ2lzdGVyKGRldmljZSwgJnRwYXJtKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogQUNLIHJlc3BvbnNlIHRpbWVvdXQgaGFuZGxlciAqLworc3RhdGljIGJjbW9zX3RpbWVyX3JjIG1mdHBfYWNrX3RpbWVvdXRfaGFuZGxlcihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClkYXRhOworICAgIG1mdHBfY29udGV4dCAqY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKworICAgIGlmICgoY29udGV4dC0+c3RhdHVzID09IE1GVFBfU1RBVFVTX1dBSVRJTkdfQUNLKSB8fCAoY29udGV4dC0+c3RhdHVzID09IE1GVFBfU1RBVFVTX1dBSVRJTkdfTEFTVF9BQ0spKQorICAgIHsKKyAgICAgICAgbWZ0cF90ZXJtaW5hdGUoZGV2aWNlLCBjb250ZXh0LT5pbWFnZV90eXBlLCBjb250ZXh0LT5ibG9ja19udW0sIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQUNLX1RJTUVPVVQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGNvbnRleHQtPmxvZ19pZCwgInRpbWVyIGluIGlycmVsZXZhbnQgc3RhdGVcbiIpOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfVElNRVJfU1RPUDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyBiY21vc19lcnJubyBtZnRwX2luaXRfdGltZXJzKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgbWZ0cF9jb250ZXh0ICpjb250ZXh0ID0gbWZ0cF9jb250ZXh0X2dldChkZXZpY2UpOworICAgIGJjbW9zX3RpbWVyX3Bhcm0gdGltZXJfcGFyYW1zID0ge307CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogSWYgdGltZXIgd2FzIGFscmVhZHkgY3JlYXRlZCwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIHJlLWNyZWF0ZSBpdCAqLworICAgIGlmICgoY29udGV4dC0+dGltZXIuZmxhZ3MgJiBCQ01PU19USU1FUl9GTEFHX1ZBTElEKSAhPSAwKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworICAgIHRpbWVyX3BhcmFtcy5uYW1lICAgICA9IGNvbnRleHQtPm5hbWU7CisgICAgdGltZXJfcGFyYW1zLm93bmVyICAgID0gY29udGV4dC0+bW9kdWxlX2lkOworICAgIHRpbWVyX3BhcmFtcy5wZXJpb2RpYyA9IEJDTU9TX0ZBTFNFOworICAgIHRpbWVyX3BhcmFtcy5oYW5kbGVyICA9IG1mdHBfYWNrX3RpbWVvdXRfaGFuZGxlcjsKKyAgICB0aW1lcl9wYXJhbXMuZGF0YSAgICAgPSAobG9uZylkZXZpY2U7CisKKyAgICByYyA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmY29udGV4dC0+dGltZXIsICZ0aW1lcl9wYXJhbXMpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiVGltZXIgY3JlYXRpb24gZmFpbGVkLiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1mdHBfaW5pdF90YXNrcyhiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIG1mdHBfY29udGV4dCAgICAqY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKyAgICBiY21vc190YXNrX3Bhcm0gIHRhc2tfcGFyYW1zID0ge307CisgICAgYmNtb3NfZXJybm8gICAgICByYyA9IEJDTV9FUlJfT0s7CisKKyAgICB0YXNrX3BhcmFtcy5uYW1lICAgICAgICAgPSBjb250ZXh0LT5uYW1lOworICAgIHRhc2tfcGFyYW1zLnByaW9yaXR5ICAgICA9IFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX0lNQUdFX1RSQU5TRkVSOworICAgIHRhc2tfcGFyYW1zLmNvcmUgICAgICAgICA9IEJDTU9TX0NQVV9DT1JFX0FOWTsgLyogTm8gQ1BVIGFmZmluaXR5ICovCisgICAgdGFza19wYXJhbXMuaW5pdF9oYW5kbGVyID0gTlVMTDsKKyAgICB0YXNrX3BhcmFtcy5kYXRhICAgICAgICAgPSAobG9uZylkZXZpY2U7CisKKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZjb250ZXh0LT50YXNrLCAmdGFza19wYXJhbXMpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiVGFzayBjcmVhdGlvbiBmYWlsZWQuICVzIFxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1mdHBfaW5pdF9tb2R1bGVzKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgbWZ0cF9jb250ZXh0ICAgICAgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KGRldmljZSk7CisgICAgYmNtb3NfbW9kdWxlX3Bhcm0gIG1vZHVsZV9wYXJhbXMgPSB7fTsKKyAgICBiY21vc19lcnJubyAgICAgICAgcmMgPSBCQ01fRVJSX09LOworCisgICAgY29udGV4dC0+bW9kdWxlX2lkID0gbWZ0cF9kZXZpY2VfaWRfdG9fbW9kdWxlX2lkKGRldmljZSk7CisgICAgbW9kdWxlX3BhcmFtcy5xcGFybS5uYW1lID0gY29udGV4dC0+bmFtZTsKKyAgICBtb2R1bGVfcGFyYW1zLnFwYXJtLnNpemUgPSBCQ01PU19NU0dfUE9PTF9ERUZBVUxUX1NJWkU7CisgICAgbW9kdWxlX3BhcmFtcy5pbml0ICAgICAgID0gTlVMTDsKKworICAgIHJjID0gYmNtb3NfbW9kdWxlX2NyZWF0ZShjb250ZXh0LT5tb2R1bGVfaWQsICZjb250ZXh0LT50YXNrLCAmbW9kdWxlX3BhcmFtcyk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBjb250ZXh0LT5sb2dfaWQsICJNb2R1bGUgY3JlYXRpb24gZmFpbGVkLiAlcyBcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIEluaXRpYWxpemVzIHRoZSBNRlRQIHBhcmFtZXRlcnMuICovCit2b2lkIGJjbW9sdF91c2VyX21mdHBfaW5pdCh2b2lkKQoreworICAgIG1mdHBfY29udGV4dCAqY29udGV4dDsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFRoZSBjdXN0b21lciBzaG91bGQgcHJvdmlkZSB0aGVzZSBjYWxsYmFjayBmdW5jdGlvbnMuICovCisgICAgbWZ0cF9yZWFkX2RhdGFfY2IgPSBiY211c2VyX2ltYWdlX3RyYW5zZmVyX3JlYWRfZGF0YTsKKyAgICBtZnRwX25vdGlmeV91c2VyX2NiID0gYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9ub3RpZmljYXRpb25fcng7CisgICAgbWZ0cF9ibG9ja19zaXplX2dldCA9IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfYmxvY2tfc2l6ZV9nZXQ7CisgICAgbWZ0cF9jcmNfZ2V0X2NiID0gYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9jcmNfZ2V0OworCisgICAgLyogaW5pdGlhbGl6ZSBzb21lIHBhcmFtZXRlcnMsIGkuZS4gdGhlIC5zdGF0dXMgYW5kIC50aW1lci4KKyAgICAgICBvdGhlciBwYXJhbWV0ZXJzIGFyZSAocmUpYnVpbHQgdXBvbiBTVEFSVCwgc28gbm8gbmVlZCB0byBpbml0LiAqLworICAgIGZvciAoZGV2aWNlID0gMDsgKGRldmljZSA8IEJDTVRSX01BWF9PTFRTKSAmJiAocmMgPT0gQkNNX0VSUl9PSyk7IGRldmljZSsrKQorICAgIHsKKyAgICAgICAgY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKyAgICAgICAgY29udGV4dC0+c3RhdHVzID0gTUZUUF9TVEFUVVNfRElTQUJMRUQ7CisgICAgICAgIGNvbnRleHQtPmJsb2NrX3NpemUgPSBtZnRwX2Jsb2NrX3NpemVfZ2V0KCk7CisgICAgICAgIGNvbnRleHQtPmJ1ZiA9IGJjbW9zX2NhbGxvYyhjb250ZXh0LT5ibG9ja19zaXplKTsKKyAgICAgICAgcmMgPSAoY29udGV4dC0+YnVmID09IE5VTEwpID8gQkNNX0VSUl9OT01FTSA6IHJjOworICAgICAgICBzbnByaW50Zihjb250ZXh0LT5uYW1lLCBzaXplb2YoY29udGV4dC0+bmFtZSksICJtZnRwJXUiLCBkZXZpY2UpOworICAgICAgICByYyA9IChyYyA9PSBCQ01fRVJSX09LKSA/IG1mdHBfaW5pdF90YXNrcyhkZXZpY2UpIDogcmM7CisgICAgICAgIHJjID0gKHJjID09IEJDTV9FUlJfT0spID8gbWZ0cF9pbml0X21vZHVsZXMoZGV2aWNlKSA6IHJjOworICAgICAgICByYyA9IChyYyA9PSBCQ01fRVJSX09LKSA/IG1mdHBfaW5pdF90aW1lcnMoZGV2aWNlKSA6IHJjOworICAgICAgICBjb250ZXh0LT5sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihjb250ZXh0LT5uYW1lLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmVhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlci5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTQ6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQ29weXJpZ2h0IChjKSAyMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0lNQUdFX1RSQU5TRkVSX0hfCisjZGVmaW5lIF9CQ01PTFRfSU1BR0VfVFJBTlNGRVJfSF8KKworI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisvKiBSZXR1cm5zIGEgZGF0YSBibG9jayBvZiBnaXZlbiBzaXplIG9mIGdpdmVuIGltYWdlIHR5cGUgYXQgZ2l2ZW4gb2Zmc2V0LiAqLwordHlwZWRlZiBpbnQgKCpiY211c2VyX21mdHBfaW1hZ2VfcmVhZCkoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsCisgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9zaXplKTsKKworLyogUmV0dXJucyB0aGUgc2l6ZSBvZiBkYXRhIGJsb2NrIHdoaWNoIGlzIHVzZWQgZm9yIHRoZSBkYXRhIHRyYW5zZmVyLiAqLwordHlwZWRlZiB1aW50MzJfdCAoKmJjbXVzZXJfbWZ0cF9ibG9ja19zaXplX2dldCkodm9pZCk7CisKKy8qIFJldHVybnMgdGhlIENSQzMyIGNoZWNrc3VtIG9mIGVudGlyZSBpbWFnZS4gKi8KK3R5cGVkZWYgdWludDMyX3QgKCpiY211c2VyX21mdHBfY3JjX2dldCkoYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSk7CisKKy8qIENhbGxiYWNrIHRvIG5vdGlmeSB0aGUgdXNlciBvZiB0aGUgY29tcGxldGlvbiBvZiB0aGUgaW1hZ2UgdHJhbnNmZXIuICovCit0eXBlZGVmIHZvaWQgKCpiY211c2VyX21mdHBfbm90aWZpY2F0aW9uX3J4KShiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlLCB1aW50MzJfdCBibG9ja19udW0sIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgc3RhdHVzKTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgTUZUUF9TVEFUVVNfRElTQUJMRUQsCisgICAgTUZUUF9TVEFUVVNfV0FJVElOR19BQ0ssCisgICAgTUZUUF9TVEFUVVNfV0FJVElOR19MQVNUX0FDSworfSBtZnRwX3N0YXR1czsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBydW50aW1lIHBhcmFtZXRlcnMgKi8KKyAgICBtZnRwX3N0YXR1cyBzdGF0dXM7CisgICAgdWludDMyX3QgYmxvY2tfbnVtOyAgICAgLyogYmxvY2sgbnVtYmVyIHNlbnQuICovCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGU7CisKKyAgICAvKiBpbml0LXRpbWUgcGFyYW1ldGVycyAqLworICAgIHVpbnQzMl90IGJsb2NrX3NpemU7CisgICAgdWludDhfdCAqYnVmOworICAgIGNoYXIgbmFtZVtNQVhfVElNRVJfTkFNRV9TSVpFXTsKKyAgICBiY21vc190YXNrIHRhc2s7CisgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZDsKKyAgICBiY21vc190aW1lciB0aW1lcjsKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKK30gbWZ0cF9jb250ZXh0OworCisKK2NvbnN0IGNoYXIgKmJjbW9sdF91c2VyX21mdHBfc3RhdHVzX3RvX3N0cihiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1cyk7CisKKy8qKiBoYW5kbGVyIGZvciB0aGUgT1BFUkFUSU9OIGRldmljZS5pbWFnZV90cmFuc2Zlcl9zdGFydC4gKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX21mdHBfc3RhcnQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpOworCisvKiogSW5pdGlhbGl6ZXMgdGhlIE1GVFAgcGFyYW1ldGVycy4gKi8KK3ZvaWQgYmNtb2x0X3VzZXJfbWZ0cF9pbml0KHZvaWQpOworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOTI0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuYwpAQCAtMCwwICsxLDg3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2luY2x1ZGUgImJjbW9sdF9pbWFnZV90cmFuc2Zlci5oIgorI2luY2x1ZGUgImJjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuaCIKKworc3RhdGljIGJjbW9zX2Jvb2wgYmNtb2x0X3VzZXJfYXBwbF9kZXZpY2Vfc3RhdGVfaXNfcmVhZHkoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9jZmcgY2ZnID0ge307CisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0ge307CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGV2aWNlLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBzdGF0ZSk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmY2ZnLmhkcik7CisgICAgcmV0dXJuIChlcnIgPT0gQkNNX0VSUl9PSykgJiYgKGNmZy5kYXRhLnN0YXRlID09IEJDTU9MVF9ERVZJQ0VfU1RBVEVfUkVBRFkpOworfQorCisvKiogc3RhcnQgdGhlIGltYWdlIHRyYW5zZmVyLgorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9jbGlfaW1hZ2VfdHJhbnNmZXJfc3RhcnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGU7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IDA7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKCFiY21vbHRfdXNlcl9hcHBsX2RldmljZV9zdGF0ZV9pc19yZWFkeShkZXZpY2UpKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgImRldmljZSBub3QgY29ubmVjdGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX0NPTk5FQ1RFRDsKKyAgICB9CisKKyAgICBpbWFnZV90eXBlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW1hZ2VfdHlwZSIpLT52YWx1ZS51bnVtYmVyOworCisgICAgZXJyID0gYmNtb2x0X3VzZXJfbWZ0cF9zdGFydChkZXZpY2UsIGltYWdlX3R5cGUpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfY2xpX2ltYWdlX3RyYW5zZmVyX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworICAgIGJjbWNsaV9lbnRyeSAqZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgImltYWdlX3RyYW5zZmVyIiwKKyAgICAgICAgIkltYWdlIFRyYW5zZmVyIHVzZXIgYXBwbGljYXRpb24iLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAic3RhcnQiLCAiU3RhcnQgSW1hZ2UgVHJhbnNmZXIgYXBwbGljYXRpb24iLCBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbWFnZV90cmFuc2Zlcl9zdGFydCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJpbWFnZV90eXBlIiwgIkltYWdlIHR5cGUiLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGVfc3RyaW5nX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyX2NsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWY2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuaApAQCAtMCwwICsxLDM4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX0lNQUdFX1RSQU5TRkVSX0NMSV9IXworI2RlZmluZSBfQkNNT0xUX0lNQUdFX1RSQU5TRkVSX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfY2xpX2ltYWdlX3RyYW5zZmVyX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl91c2VyLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwZmM4MwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3VzZXIuYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNDpEVUFML0dQTDpzdGFuZGFyZAorCisgICBDb3B5cmlnaHQgKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGNvbnRhaW5zIHRoZSBjdXN0b21lci1wcm92aWRlZCBjb2RlLgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIGFzIGFuIGV4YW1wbGUuCisgKiBUaGUgY3VzdG9tZXIgbWF5IGNoYW5nZSB0aGUgZmlsZSBwYXRoL25hbWVzLgorICogVGhlIGN1c3RvbWVyIG1heSBjaGFuZ2UgdGhlIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucy4KKyAqIFRoZSBjdXN0b21lciBtYXkgYWRqdXN0IHRoZSBkYXRhIGJsb2NrIHNpemUuCisgKiBBZGRpbmcgYSBuZXcgaW1hZ2UgdHlwZSByZXF1aXJlcyB0aGUgb2JqZWN0IG1vZGVsIGNoYW5nZSBhbmQgc3luYyB1cCB3aXRoCisgKiB0aGUgZW1iZWRkZWQgc2l6ZSwgd2hpY2ggc2hvdWxkIGJlIGRvbmUgYnkgdGhlIEJyb2FkY29tIGVuZ2luZWVyaW5nLgorICovCisKKyNpbmNsdWRlIDxiY21vbHRfY29udi5oPgorI2luY2x1ZGUgImJjbW9sdF9pbWFnZV90cmFuc2Zlci5oIgorI2luY2x1ZGUgImJjbW9sdF9pbWFnZV90cmFuc2Zlcl91c2VyLmgiCisjaW5jbHVkZSAiYmNtb2x0X3V0aWxzLmgiCisKKy8qIGV4YW1wbGUgbmFtZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlIG9ubHkgKi8KKyNkZWZpbmUgQk9PVF9GSUxFICIvb3B0L2JjbTY4NjIwL2JjbTY4NjIwX2Jvb3QuYmluIgorI2RlZmluZSBBUFBMX0ZJTEUgIi9vcHQvYmNtNjg2MjAvYmNtNjg2MjBfYXBwbC5iaW4iCisjZGVmaW5lIElUVV9QT05fT05VX0ZXX0ZJTEUgIi9vcHQvYmNtNjg2MjAvZ3Bvbl9vbnVfZncudyIKKyNkZWZpbmUgRVBPTl9PTlVfRldfRklMRSAiL29wdC9iY202ODYyMC9lcG9uX29udV9mdy50a2YiCisKK3N0YXRpYyBpbnQyc3RyX3QgaW1hZ2VfdHlwZTJzdHJbXSA9Cit7CisgICAge0JDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9CT09UTE9BREVSLCBCT09UX0ZJTEV9LAorICAgIHtCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04sIEFQUExfRklMRX0sCisgICAge0JDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9JVFVfUE9OX09OVV9GSVJNV0FSRSwgSVRVX1BPTl9PTlVfRldfRklMRX0sCisgICAge0JDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9FUE9OX09OVV9GSVJNV0FSRSwgRVBPTl9PTlVfRldfRklMRX0sCisgICAgey0xfQorfTsKKworLyoqIEdldCB0aGUgZGV2aWNlIGZpbGUgbmFtZS4KKyAqIAorICogXHBhcmFtW2luXSAgIGltYWdlX3R5cGUgICAgICBJbWFnZSB0eXBlLiBkZWZpbmVkIGluIHRoZSBvYmplY3QgbW9kZWwuCisgKiAKKyAqIFxyZXR1cm4gICAgICBzdHJpbmcgICAgICAgICAgUG9pbnRlciB0byBkZXZpY2UgaW1hZ2UgbmFtZSwgaW5jbHVkaW5nIHRoZSBwYXRoLgorICovCitjb25zdCBjaGFyICpiY211c2VyX2RldmljZV9pbWFnZV9uYW1lX2dldChiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSkKK3sKKyAgICBpZiAoaW1hZ2VfdHlwZSA8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9fTlVNX09GKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGludDJzdHIoaW1hZ2VfdHlwZTJzdHIsIGltYWdlX3R5cGUpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqIE9wZW4gYSBmaWxlIHdpdGggZ2l2ZW4gaW1hZ2UgdHlwZS4KKyAqCisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4KKyAqIFxwYXJhbVtvdXRdICBmcHAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgKgorICogXHJldHVybiAgICAgIGJjbW9zX2Vycm5vICAgICBFcnJvciBjb2RlCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2ZpbGVfb3BlbihiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwgRklMRSAqKmZwcCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfUEFSTTsKKworICAgIGlmIChpbWFnZV90eXBlIDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX19OVU1fT0YpCisgICAgeworICAgICAgICBGSUxFICpmcDsKKyAgICAgICAgY29uc3QgY2hhciAqZm5hbWUgPSBiY211c2VyX2RldmljZV9pbWFnZV9uYW1lX2dldChpbWFnZV90eXBlKTsKKyAgICAgICAgZnAgPSBmb3BlbihmbmFtZSwgInJiIik7CisgICAgICAgIGlmIChmcCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAqZnBwID0gZnA7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiogR2V0IHRoZSBzaXplIG9mIHRoZSBmaWxlLiAKKyAqIAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBEZXZpY2UgSUQKKyAqIFxwYXJhbVtpbl0gICBpbWFnZV90eXBlICAgICAgSW1hZ2UgdHlwZS4gZGVmaW5lZCBpbiB0aGUgb2JqZWN0IG1vZGVsLgorICogXHBhcmFtW291dF0gIGZzaXplICAgICAgICAgICBGaWxlIHNpemUKKyAqIAorICogXHJldHVybiAgICAgIGJjbW9zX2Vycm5vIAorICovCitiY21vc19lcnJubyBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2ZpbGVfc2l6ZV9nZXQoYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwgdWludDMyX3QgKmZzaXplKQoreworICAgIEZJTEUgKmZwOworICAgIGxvbmcgZnBfcHJldjsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgKHZvaWQpZGV2aWNlOworCisgICAgcmMgPSBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2ZpbGVfb3BlbihpbWFnZV90eXBlLCAmZnApOworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgZnBfcHJldiA9IGZ0ZWxsKGZwKTsKKyAgICAgICAgQlVHX09OKGZwX3ByZXYgPCAwKTsKKyAgICAgICAgQlVHX09OKGZzZWVrKGZwLCAwLCBTRUVLX0VORCkgIT0gMCk7CisgICAgICAgICpmc2l6ZSA9IGZ0ZWxsKGZwKTsKKyAgICAgICAgQlVHX09OKGZzZWVrKGZwLCBmcF9wcmV2LCBTRUVLX1NFVCkgIT0gMCk7IC8qIGdvIGJhY2sgdG8gd2hlcmUgd2Ugd2VyZS4gKi8KKyAgICAgICAgQlVHX09OKGZjbG9zZShmcCkgIT0gMCk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyoqIFJlYWQgZGF0YSBmcm9tIGdpdmVuIG9mZnNldC4KKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIERldmljZSBJRAorICogXHBhcmFtW2luXSAgIGltYWdlX3R5cGUgICAgICBJbWFnZSB0eXBlLiBkZWZpbmVkIGluIHRoZSBvYmplY3QgbW9kZWwuCisgKiBccGFyYW1baW5dICAgb2Zmc2V0ICAgICAgICAgIEZpbGUgcG9zaXRpb24gaW5kaWNhdG9yCisgKiBccGFyYW1bb3V0XSAgYnVmICAgICAgICAgICAgIEJ1ZmZlciB0byBzdG9yZSB0aGUgZGF0YQorICogXHBhcmFtW2luXSAgIGJ1Zl9zaXplICAgICAgICBCdWZmZXIgc2l6ZQorICoKKyAqIFxyZXR1cm4gICAgICBCeXRlcyByZWFkCisgKi8KK2ludCBiY211c2VyX2ltYWdlX3RyYW5zZmVyX3JlYWRfZGF0YShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgYnVmX3NpemUpCit7CisgICAgRklMRSAqZnA7CisgICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IDA7CisgICAgKHZvaWQpZGV2aWNlOworCisgICAgaWYgKGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfZmlsZV9vcGVuKGltYWdlX3R5cGUsICZmcCkgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJVR19PTihmc2VlayhmcCwgMCwgU0VFS19FTkQpICE9IDApOworICAgICAgICBpZiAob2Zmc2V0IDwgZnRlbGwoZnApKQorICAgICAgICB7CisgICAgICAgICAgICBCVUdfT04oZnNlZWsoZnAsIG9mZnNldCwgU0VFS19TRVQpICE9IDApOworICAgICAgICAgICAgYnl0ZXNfcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgYnVmX3NpemUsIGZwKTsKKyAgICAgICAgfQorICAgICAgICBCVUdfT04oZmNsb3NlKGZwKSAhPSAwKTsKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKKy8qKiBHZXQgdGhlIHVuaXQgc2l6ZSBvZiB0aGUgdHJhbnNmZXIgZGF0YSBibG9jay4KKyAqCisgKiBccmV0dXJuICAgICAgU2l6ZSBvZiB0aGUgYmxvY2sgaW4gYnl0ZXMuCisgKi8KK3VpbnQzMl90IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfYmxvY2tfc2l6ZV9nZXQodm9pZCkKK3sKKyAgICByZXR1cm4gTUZUUF9EQVRBX0JMT0NLX1NJWkU7Cit9CisKKy8qKiBSZXR1cm5zIHRoZSBDUkMzMiBjaGVja3N1bSBvZiBlbnRpcmUgaW1hZ2UuCisgKiAKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIElECisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4KKyAqIAorICogXHJldHVybiAgICAgIENSQzMyIGNoZWNrc3VtIAorICovCit1aW50MzJfdCBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2NyY19nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpCit7CisgICAgRklMRSAqZnA7CisgICAgdWludDMyX3QgY3JjID0gMDsKKyAgICAodm9pZClkZXZpY2U7CisKKyAgICBpZiAoYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9maWxlX29wZW4oaW1hZ2VfdHlwZSwgJmZwKSA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgd2hpbGUgKDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzUxMl07IC8qIGFueSBzaXplIGlzIE9LLiAqLworICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNfcmVhZDsKKworICAgICAgICAgICAgYnl0ZXNfcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIGZwKTsKKyAgICAgICAgICAgIGlmIChieXRlc19yZWFkID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjcmMgPSBldGhfY2FsY19jcmMzMihjcmMsIGJ1ZiwgYnl0ZXNfcmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgQlVHX09OKGZjbG9zZShmcCkgIT0gMCk7CisgICAgfQorICAgIHJldHVybiBjcmM7Cit9CisKKy8qKiBQcm9jZXNzIHRoZSBub3RpZmljYXRpb24gZnJvbSB0aGUgaW1hZ2UgdHJhbnNmZXIgbW9kdWxlLgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIElECisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4gCisgKiBccGFyYW1baW5dICAgYmxvY2tfbnVtICAgICAgIGxhc3QgYmxvY2sgbnVtYmVyIAorICogXHBhcmFtW2luXSAgIHN0YXR1cyAgICAgICAgICBJbWFnZSB0cmFuc2ZlciBzdGF0dXMgCisgKi8KK3ZvaWQgYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9ub3RpZmljYXRpb25fcngoYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwgdWludDMyX3QgYmxvY2tfbnVtLAorICAgIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgc3RhdHVzKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IGJjbW9sdF91c2VyX21mdHBfc3RhdHVzX3RvX3N0cihzdGF0dXMpOworICAgIGJjbW9zX3ByaW50ZigiSW1hZ2UgdHJhbnNmZXI6ICVzOiB0eXBlPSV1IGJsb2NrPSV1XG4iLCBzdHIsIGltYWdlX3R5cGUsIGJsb2NrX251bSk7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3VzZXIuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3VzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTAzNjZiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXJfdXNlci5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9VU0VSX0hfCisjZGVmaW5lIF9CQ01PTFRfSU1BR0VfVFJBTlNGRVJfVVNFUl9IXworCisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisKKyNkZWZpbmUgTUZUUF9EQVRBX0JMT0NLX1NJWkUgIDUxMgorCisjZGVmaW5lIE1GVFBfQUNLX1RJTUVPVVRfVVMgICAoMiAqIDEwMDAwMDApCisKKyNkZWZpbmUgTUZUUF9NQVhfUEFUSF9OQU1FX0xFTiAgMjU2CisKKy8qKiBHZXQgdGhlIGRldmljZSBmaWxlIG5hbWUuCisgKiAKKyAqIFxwYXJhbVtpbl0gICBpbWFnZV90eXBlICAgICAgSW1hZ2UgdHlwZS4gZGVmaW5lZCBpbiB0aGUgb2JqZWN0IG1vZGVsLgorICogCisgKiBccmV0dXJuICAgICAgc3RyaW5nICAgICAgICAgIERldmljZSBpbWFnZSBuYW1lLCBpbmNsdWRpbmcgdGhlIHBhdGguCisgKi8KK2NvbnN0IGNoYXIgKmJjbXVzZXJfZGV2aWNlX2ltYWdlX25hbWVfZ2V0KGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlKTsKKworLyoqIEdldCB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gCisgKiAKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIElECisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4KKyAqIFxwYXJhbVtvdXRdICBmc2l6ZSAgICAgICAgICAgRmlsZSBzaXplCisgKiAKKyAqIFxyZXR1cm4gICAgICBiY21vc19lcnJubyAKKyAqLworYmNtb3NfZXJybm8gYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9maWxlX3NpemVfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsIHVpbnQzMl90ICpmc2l6ZSk7CisKKy8qKiBSZWFkIGRhdGEgZnJvbSBnaXZlbiBvZmZzZXQuCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBEZXZpY2UgSUQKKyAqIFxwYXJhbVtpbl0gICBpbWFnZV90eXBlICAgICAgSW1hZ2UgdHlwZS4gZGVmaW5lZCBpbiB0aGUgb2JqZWN0IG1vZGVsLgorICogXHBhcmFtW2luXSAgIG9mZnNldCAgICAgICAgICBGaWxlIHBvc2l0aW9uIGluZGljYXRvcgorICogXHBhcmFtW291dF0gIGJ1ZiAgICAgICAgICAgICBCdWZmZXIgdG8gc3RvcmUgdGhlIGRhdGEKKyAqIFxwYXJhbVtpbl0gICBidWZfc2l6ZSAgICAgICAgQnVmZmVyIHNpemUKKyAqCisgKiBccmV0dXJuICAgICAgQnl0ZXMgcmVhZAorICovCitpbnQgYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9yZWFkX2RhdGEoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsCisgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9zaXplKTsKKworLyoqIEdldCB0aGUgdW5pdCBzaXplIG9mIHRoZSB0cmFuc2ZlciBkYXRhIGJsb2NrLgorICoKKyAqIFxyZXR1cm4gICAgICBTaXplIG9mIHRoZSBibG9jayBpbiBieXRlcy4KKyAqLwordWludDMyX3QgYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9ibG9ja19zaXplX2dldCh2b2lkKTsKKworLyoqIFJldHVybnMgdGhlIENSQzMyIGNoZWNrc3VtIG9mIGVudGlyZSBpbWFnZS4KKyAqIAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBEZXZpY2UgSUQKKyAqIFxwYXJhbVtpbl0gICBpbWFnZV90eXBlICAgICAgSW1hZ2UgdHlwZS4gZGVmaW5lZCBpbiB0aGUgb2JqZWN0IG1vZGVsLgorICogCisgKiBccmV0dXJuICAgICAgQ1JDMzIgY2hlY2tzdW0gCisgKi8KK3VpbnQzMl90IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfY3JjX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSk7CisKKy8qKiBQcm9jZXNzIHRoZSBub3RpZmljYXRpb24gZnJvbSB0aGUgaW1hZ2UgdHJhbnNmZXIgbW9kdWxlLgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIElECisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4gCisgKiBccGFyYW1baW5dICAgYmxvY2tfbnVtICAgICAgIGxhc3QgYmxvY2sgbnVtYmVyIAorICogXHBhcmFtW2luXSAgIHN0YXR1cyAgICAgICAgICBJbWFnZSB0cmFuc2ZlciBzdGF0dXMgCisgKi8KK3ZvaWQgYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9ub3RpZmljYXRpb25fcngoYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwgdWludDMyX3QgYmxvY2tfbnVtLCBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1cyk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL25ncG9uMl9vbnVfdHVuaW5nL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NzU2ZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjIE9OVSB0dW5pbmcgYXBwbGljYXRpb24KKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBiY21fdXNlcl9hcHBsX29udV90dW5pbmcKKyAgICBNT0RfVFlQRSA9IGxpYgorICAgIE1PRF9ERVBTID0gaG9zdF9hcGkgY29tbW9uX2dwb24gYmNtX2JvYXJkCisgICAgc3JjcyA9IGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZy5jIGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGkuYworICAgIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCU1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKyAgICBlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmcuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGQzYjk3YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nLmMKQEAgLTAsMCArMSwzMTIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9sdF9ob3N0X2FwaS5oPgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZy5oIgorCisjZGVmaW5lIE9OVV9UVU5JTkdfVEFTS19NU0dfUV9TSVpFIDI1NgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX21zZyBvc19tc2c7CisgICAgYmNtb2x0X2F1dG8gKmluZDsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworfSBvdF90YXNrX21zZzsKKworc3RhdGljIGJjbW9sdF9vbnVfdHVuaW5nX2NvbnRleHQgb3RfY29udGV4dFtCQ01UUl9NQVhfT0xUU107CisKKworc3RhdGljIGJjbW9zX2Vycm5vIG9udV90dW5pbmdfaW5pdF90YXNrKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2tfcGFyYW1zID0ge307CisgICAgc25wcmludGYob3RfY29udGV4dFtkZXZpY2VfaWRdLnRhc2submFtZSwgc2l6ZW9mKG90X2NvbnRleHRbZGV2aWNlX2lkXS50YXNrLm5hbWUpLCAidXNlcl9hcHBsX29udV90dW5pbmcldSIsIGRldmljZV9pZCk7CisgICAgdGFza19wYXJhbXMubmFtZSA9IG90X2NvbnRleHRbZGV2aWNlX2lkXS50YXNrLm5hbWU7CisgICAgdGFza19wYXJhbXMucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9PTlVfVFVOSU5HOworICAgIHRhc2tfcGFyYW1zLmNvcmUgPSBCQ01PU19DUFVfQ09SRV9BTlk7IC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgIHRhc2tfcGFyYW1zLmluaXRfaGFuZGxlciA9IE5VTEw7CisgICAgdGFza19wYXJhbXMuZGF0YSA9IChsb25nKWRldmljZV9pZDsKKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZvdF9jb250ZXh0W2RldmljZV9pZF0udGFzaywgJnRhc2tfcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtb3NfdGFza19jcmVhdGUoKVxuIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBvbnVfdHVuaW5nX2luaXRfbW9kdWxlKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgLyogVGhpcyB2YWx1ZSBpcyB1c2VkIGluc2lkZSBiY21vbHRfb251X3R1bmluZ19tb2R1bGVfaW5pdCBmb3IgdGltZXIgb3duZXIgKi8KKyAgICBvdF9jb250ZXh0W2RldmljZV9pZF0uZGV2aWNlID0gZGV2aWNlX2lkOworICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnFwYXJtID0geyAubmFtZSA9ICJ1c2VyX2FwcGxfb251X3R1bmluZyIsCisJCS5zaXplID0gT05VX1RVTklOR19UQVNLX01TR19RX1NJWkUgfSwKKyAgICB9OworCisgICAgcmV0dXJuIGJjbW9zX21vZHVsZV9jcmVhdGUoQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9PTlVfVFVOSU5HX0RFVjAgKyBkZXZpY2VfaWQsICZvdF9jb250ZXh0W2RldmljZV9pZF0udGFzaywgJm1vZHVsZV9wYXJhbXMpOworfQorCit2b2lkIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfaW5pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdID0ge307CisgICAgc25wcmludGYobG9nX25hbWUsIHNpemVvZihsb2dfbmFtZSkgLSAxLCAidXNlcl9hcHBsX29udV90dW5pbmcldSIsIGRldmljZV9pZCk7CisgICAgb3RfY29udGV4dFtkZXZpY2VfaWRdLmxvZ19pZCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGxvZ19uYW1lLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisjZW5kaWYKKworICAgIGVyciA9IGJjbW9zX211dGV4X2NyZWF0ZSgmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4LCAwLCBOVUxMKTsKKyAgICBCVUdfT04oZXJyICE9IEJDTV9FUlJfT0spOworCisgICAgZXJyID0gb251X3R1bmluZ19pbml0X3Rhc2soZGV2aWNlX2lkKTsKKyAgICBCVUdfT04oZXJyICE9IEJDTV9FUlJfT0spOworCisgICAgZXJyID0gb251X3R1bmluZ19pbml0X21vZHVsZShkZXZpY2VfaWQpOworICAgIEJVR19PTihlcnIgIT0gQkNNX0VSUl9PSyk7CisKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X29udV90dW5pbmdfYXBwbF9zdGFydChiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZvdF9jb250ZXh0W2RldmljZV9pZF0ubXV0ZXgpOworCisgICAgaWYgKG90X2NvbnRleHRbZGV2aWNlX2lkXS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb3RfY29udGV4dFtkZXZpY2VfaWRdLmxvZ19pZCwgIk9OVSB0dW5pbmcgYXBwbGljYXRpb24gYWxyZWFkeSBydW5uaW5nIG9uIGRldmljZT0ldVxuIiwgZGV2aWNlX2lkKTsKKyAgICAgICAgcmV0ID0gQkNNX0VSUl9TVEFURTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIG90X2NvbnRleHRbZGV2aWNlX2lkXS5pc19ydW5uaW5nID0gQkNNT1NfVFJVRTsKKyAgICBvdF9jb250ZXh0W2RldmljZV9pZF0uZGV2aWNlID0gZGV2aWNlX2lkOworCisgICAgQkNNX0xPRyhJTkZPLCBvdF9jb250ZXh0W2RldmljZV9pZF0ubG9nX2lkLCAiT05VIHR1bmluZyBhcHBsaWNhdGlvbiBzdGFydGVkIG9uIGRldmljZT0ldVxuIiwgZGV2aWNlX2lkKTsKKyAgICByZXQgPSBCQ01fRVJSX09LOworCitleGl0OgorICAgIGJjbW9zX211dGV4X3VubG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitiY21vc19lcnJubyBiY21vbHRfb251X3R1bmluZ19hcHBsX3N0b3AoYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQ7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZvdF9jb250ZXh0W2RldmljZV9pZF0ubXV0ZXgpOworCisgICAgaWYgKCFvdF9jb250ZXh0W2RldmljZV9pZF0uaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIHJldCA9IEJDTV9FUlJfU1RBVEU7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBvdF9jb250ZXh0W2RldmljZV9pZF0uaXNfcnVubmluZyA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX3RpbWVyX3N0b3AoJm90X2NvbnRleHRbZGV2aWNlX2lkXS50aW1lcik7CisgICAgQkNNX0xPRyhJTkZPLCBvdF9jb250ZXh0W2RldmljZV9pZF0ubG9nX2lkLCAiT05VIHR1bmluZyBhcHBsaWNhdGlvbiBzdG9wcGVkIG9uIGRldmljZT0ldVxuIiwgZGV2aWNlX2lkKTsKKyAgICByZXQgPSBCQ01fRVJSX09LOworCitleGl0OgorICAgIGJjbW9zX211dGV4X3VubG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitiY21vc19ib29sIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfaXNfcnVubmluZyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Jvb2wgcmV0OworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKyAgICByZXQgPSBvdF9jb250ZXh0W2RldmljZV9pZF0uaXNfcnVubmluZzsKKyAgICBiY21vc19tdXRleF91bmxvY2soJm90X2NvbnRleHRbZGV2aWNlX2lkXS5tdXRleCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBiY21vbHRfb251X3R1bmluZ19pc19pbnRlcmVzdGVkKGJjbW9sdF9hdXRvICppbmQpCit7CisgICAgc3dpdGNoIChpbmQtPmhkci5vYmpfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVToKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9UVU5JTkdfUkVTUE9OU0U6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQ6CisJCSAgIHJldHVybiBCQ01PU19UUlVFOworCSAgICBkZWZhdWx0OgorCQkgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF9vbnVfdHVuaW5nX2luZF9jYihiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKwlvdF90YXNrX21zZyAqbXNnID0gKG90X3Rhc2tfbXNnICopb3NfbXNnOworCWJjbW9sdF9wb25fbmkgcG9uX25pOworCWJjbW9sdF9wb25fb251X2lkIG9udV9pZDsKKwliY21vbHRfYXV0byAqaW5kID0gbXNnLT5pbmQ7CisJYmNtb3NfZXJybm8gcmM7CisKKwlzd2l0Y2ggKG1zZy0+aW5kLT5oZHIub2JqX3R5cGUpCisJeworCWNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisJCXN3aXRjaCAobXNnLT5pbmQtPmhkci5zdWJncm91cCkKKwkJeworCQkJY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVFVOSU5HX1JFU1BPTlNFOgorCQkJeworCQkJCWJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlICpvbnVfdHVuaW5nX3Jlc3BvbnNlID0gKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlICopaW5kOworCQkJCW9udV9pZCA9IG9udV90dW5pbmdfcmVzcG9uc2UtPmtleS5vbnVfaWQ7CisJCQkJcG9uX25pID0gb251X3R1bmluZ19yZXNwb25zZS0+a2V5LnBvbl9uaTsKKworCQkJCWlmIChvbnVfdHVuaW5nX3Jlc3BvbnNlLT5kYXRhLmFjayA9PSBCQ01PU19UUlVFICYmIG9udV90dW5pbmdfcmVzcG9uc2UtPmRhdGEucmVzdWx0ID09IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKwkJCQl7CisJCQkJCUJDTV9MT0coSU5GTywgb3RfY29udGV4dFttc2ctPmRldmljZV9pZF0ubG9nX2lkLCAiSW5kaWNhdGlvbiBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVFVOSU5HX1JFU1BPTlNFIGhhbmRsZWQ6IFBPTjoldSBPTlU6JXUgdGFyZ2V0X3Bvbl9uaT0ldVxuIiwgcG9uX25pLCBvbnVfaWQsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnRhcmdldF9wb25fbmkpOworCisJCQkJCS8qIHN0YXJ0IHR1bmluZyBpbiBvbnUgb24gdGFyZ2V0IHBvbiBpZCAqLworCQkJCQliY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IC5wb25fbmkgPSBvdF9jb250ZXh0W21zZy0+ZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS50YXJnZXRfcG9uX25pLCAub251X2lkID0gb251X2lkIH07CisJCQkJCWJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbiBvbnVfdHVuaW5nX2luOworCisJCQkJCUJDTU9MVF9PUEVSX0lOSVQoJm9udV90dW5pbmdfaW4sIHhncG9uX29udSwgb251X3R1bmluZ19pbiwga2V5KTsKKwkJCQkJcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQobXNnLT5kZXZpY2VfaWQsICZvbnVfdHVuaW5nX2luLmhkcik7CisJCQkJCWlmIChyYyAhPSBCQ01fRVJSX09LKQorCQkJCQkJQkNNX0xPRyhFUlJPUiwgb3RfY29udGV4dFttc2ctPmRldmljZV9pZF0ubG9nX2lkLCAiT05VPSV1IHR1bmluZyBpbiB0byBQT049JXUgZmFpbGVkXG4iLCBvbnVfaWQsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnRhcmdldF9wb25fbmkpOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQ6CisJCQl7CisJCQkJYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCAqb251X3R1bmluZ19pbl9jb21wbGV0ZWQgPSAoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCAqKWluZDsKKwkJCQlvbnVfaWQgPSBvbnVfdHVuaW5nX2luX2NvbXBsZXRlZC0+a2V5Lm9udV9pZDsKKwkJCQlwb25fbmkgPSBvbnVfdHVuaW5nX2luX2NvbXBsZXRlZC0+a2V5LnBvbl9uaTsKKwkJCQlpZiAob251X3R1bmluZ19pbl9jb21wbGV0ZWQtPmRhdGEucmVzdWx0ID09IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKwkJCQl7CisJCQkJCUJDTV9MT0coSU5GTywgb3RfY29udGV4dFttc2ctPmRldmljZV9pZF0ubG9nX2lkLCAiSW5kaWNhdGlvbiBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQgaGFuZGxlZDogUE9OOiV1IE9OVToldVxuIiwgcG9uX25pLCBvbnVfaWQpOworCisJCQkJCS8qIHN0YXJ0IHR1bmluZyBvdXQgb251IG9uIHNvdXJjZSBwb24gaWQgKi8KKwkJCQkJYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAucG9uX25pID0gb3RfY29udGV4dFttc2ctPmRldmljZV9pZF0ub251X2RiW29udV9pZF0uc291cmNlX3Bvbl9uaSwgLm9udV9pZCA9IG9udV9pZCB9OworCQkJCQliY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0IG9udV90dW5pbmdfb3V0OworCisJCQkJCUJDTU9MVF9PUEVSX0lOSVQoJm9udV90dW5pbmdfb3V0LCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCBrZXkpOworCQkJCQlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRhcmdldF9kc19wb25faWQsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnRhcmdldF9wb25faWQpOworCQkJCQlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRhcmdldF91c19wb25faWQsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnRhcmdldF9wb25faWQpOworCQkJCQlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRpbWVfdG9fc3dpdGNoLCAxMDAwKTsKKwkJCQkJQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9udV90dW5pbmdfb3V0LCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCByb2xsYmFjaywgQkNNT1NfRkFMU0UpOworCQkJCQlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHN0YXR1cywgQkNNT0xUX1NUQVRVU19PRkYpOworCQkJCQlyYyA9IGJjbW9sdF9vcGVyX3N1Ym1pdChtc2ctPmRldmljZV9pZCwgJm9udV90dW5pbmdfb3V0Lmhkcik7CisJCQkJCWlmIChyYyAhPSBCQ01fRVJSX09LKQorCQkJCQkJQkNNX0xPRyhFUlJPUiwgb3RfY29udGV4dFttc2ctPmRldmljZV9pZF0ubG9nX2lkLCAiT05VPSV1IHR1bmluZyBvdXQgZnJvbSBQT049JXUgZmFpbGVkXG4iLCBvbnVfaWQsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnNvdXJjZV9wb25fbmkpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBmcmVlIHRoZSBjbG9uZWQgaW5kaWNhdGlvbiBzaW5jZSB3ZSdyZSBkb25lIHByb2Nlc3NpbmcgaXQgKi8KKwliY21vbHRfbXNnX2ZyZWUoJm1zZy0+aW5kLT5oZHIpOworCS8qIGZyZWUgdGhlIGludGVybmFsIE9TIG1lc3NhZ2UgaGFuZGxlICovCisJYmNtb3NfZnJlZShvc19tc2cpOworfQorCitiY21vc19lcnJubyBiY21vbHRfb251X3R1bmluZ19wcm9jZXNzX2luZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfYXV0byAqaW5kKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbXNnICppbmRfY2xvbmUgPSBOVUxMOworCisgICAgLyogaWYgdGhlIGFwcGxpY2F0aW9uIGlzbid0IHJ1bm5pbmcsIGRvbid0IGxpc3RlbiB0byBhbnkgaW5kaWNhdGlvbnMgKi8KKyAgICBpZiAoIWJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfaXNfcnVubmluZyhkZXZpY2VfaWQpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworICAgIC8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgaGFuZGxlciBmb3IgdGhpcyB0eXBlIG9mIGluZGljYXRpb24gKi8KKyAgICBpZiAoIWJjbW9sdF9vbnVfdHVuaW5nX2lzX2ludGVyZXN0ZWQoaW5kKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICAvKiBjbG9uZSB0aGUgaW5kaWNhdGlvbiBpbnRvIG5ld2x5LWFsbG9jYXRlZCBtZW1vcnkgc28gd2UgY2FuIGhhbmRsZSBpdCBhZnRlciB0aGUgb3JpZ2luYWwgbWVzc2FnZSBoYXMgYmVlbiBmcmVlZCAqLworICAgIGVyciA9IGJjbW9sdF9tc2dfY2xvbmUoJmluZF9jbG9uZSwgJmluZC0+aGRyKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvdF9jb250ZXh0W2RldmljZV9pZF0ubG9nX2lkLCAiSW5kaWNhdGlvbiBjbG9uZSBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBzZW5kIHRoZSBjbG9uZSB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgKi8KKyAgICBvdF90YXNrX21zZyAqbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb3RfY29udGV4dFtkZXZpY2VfaWRdLmxvZ19pZCwgIk1lc3NhZ2UgY2FsbG9jIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICBiY21vbHRfbXNnX2ZyZWUoaW5kX2Nsb25lKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorICAgIG1zZy0+b3NfbXNnLmhhbmRsZXIgPSBiY21vbHRfb251X3R1bmluZ19pbmRfY2I7CisgICAgbXNnLT5vc19tc2cucmVsZWFzZSA9IGJjbW9sdF9vc19tc2dfcmVsZWFzZV9jYjsKKyAgICBtc2ctPmRldmljZV9pZCA9IGRldmljZV9pZDsKKyAgICBtc2ctPmluZCA9IChiY21vbHRfYXV0byAqKWluZF9jbG9uZTsKKworICAgIGVyciA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9PTlVfVFVOSU5HICsgZGV2aWNlX2lkLCAmbXNnLT5vc19tc2csIDApOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG90X2NvbnRleHRbZGV2aWNlX2lkXS5sb2dfaWQsICJNZXNzYWdlIHNlbmQgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIGJjbW9sdF9tc2dfZnJlZShpbmRfY2xvbmUpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBvbnVfdHVuaW5nX3VwZGF0ZV9vbnVfZGIgKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF94Z3Bvbl9vbnVfaWQgb251X2lkLCBiY21vbHRfcG9uX25pIHNvdXJjZV9wb25fbmksIGJjbW9sdF9wb25fbmkgdGFyZ2V0X3Bvbl9uaSwgYmNtb2x0X3Bvbl9pZCB0YXJnZXRfcG9uX2lkLCBiY21vc19ib29sIHJvbGxiYWNrKQoreworCWJjbW9zX2Vycm5vIHJldDsKKwkgYmNtb3NfbXV0ZXhfbG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKworCSAgICBpZiAoIW90X2NvbnRleHRbZGV2aWNlX2lkXS5pc19ydW5uaW5nKQorCSAgICB7CisJICAgICAgICByZXQgPSBCQ01fRVJSX1NUQVRFOworCSAgICAgICAgZ290byBleGl0OworCSAgICB9CisJICAgIG90X2NvbnRleHRbZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS50YXJnZXRfcG9uX25pID0gdGFyZ2V0X3Bvbl9uaTsKKwkgICAgb3RfY29udGV4dFtkZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnNvdXJjZV9wb25fbmkgPSBzb3VyY2VfcG9uX25pOworCSAgICBvdF9jb250ZXh0W2RldmljZV9pZF0ub251X2RiW29udV9pZF0udGFyZ2V0X3Bvbl9pZCA9IHRhcmdldF9wb25faWQ7CisJICAgIG90X2NvbnRleHRbZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS5yb2xsYmFjayA9IHJvbGxiYWNrOworCSAgICByZXQgPSBCQ01fRVJSX09LOworCitleGl0OgorCWJjbW9zX211dGV4X3VubG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmcuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjgxZmNjMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX09OVV9UVU5JTkdfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfT05VX1RVTklOR19IXworCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisJYmNtb2x0X3Bvbl9uaSB0YXJnZXRfcG9uX25pOworCWJjbW9sdF9wb25fbmkgc291cmNlX3Bvbl9uaTsKKwliY21vbHRfcG9uX2lkIHRhcmdldF9wb25faWQ7CisJdWludDMyX3QgdGltZV90b19zd2l0Y2g7CisJYmNtb3NfYm9vbCByb2xsYmFjazsKK31iY21vbHRfb251X3R1bmluZ19vbnVfZGI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfdGFzayB0YXNrOworICAgIGJjbW9zX21zZ19wb29sIG1zZ19wb29sOworICAgIGJjbW9zX211dGV4IG11dGV4OworICAgIGJjbW9zX3RpbWVyIHRpbWVyOworICAgIGRldl9sb2dfaWQgbG9nX2lkOworICAgIGJjbW9zX2Jvb2wgaXNfcnVubmluZzsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlOworICAgIHVpbnQzMl90ICp0aW1lb3V0czsKKyAgICBiY21vbHRfb251X3R1bmluZ19vbnVfZGIgb251X2RiW1hHUE9OX01BWF9OVU1fT0ZfT05VU107Cit9IGJjbW9sdF9vbnVfdHVuaW5nX2NvbnRleHQ7CisKK3R5cGVkZWYgZW51bQoreworCisJT05VX1RVTklOR19NT0RFLAorfSBiY21vbHRfb251X3R1bmluZ19tb2RlOworCisvKiogSW5pdGlhbGl6ZSB0aGUgT05VIFR1bmluZyBhcHBsaWNhdGlvbiAodGhpcyBzaG91bGQgYmUgY2FsbGVkIGFzIHBhcnQgb2YgYXBwbGljYXRpb24gc3RhcnR1cCkuICovCit2b2lkIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfaW5pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKKworLyoqIFN0YXJ0IHRoZSBPTlUgVHVuaW5nIGFwcGxpY2F0aW9uLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2aWNlICAgICAgICAgICAgVGhlIGRldmljZSBJRCBvbiB3aGljaCB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBzdGFydGVkLgorICogXHJldHVybiAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgYXBwbGljYXRpb24gd2FzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfc3RhcnQoYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CisKKy8qKiBTdG9wIHRoZSBPTlUgVHVuaW5nIGFwcGxpY2F0aW9uLgorICoKKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGFwcGxpY2F0aW9uIHdhcyBzdG9wcGVkIHN1Y2Nlc3NmdWxseSwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfb251X3R1bmluZ19hcHBsX3N0b3AoYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CisKKy8qKiBRdWVyeSB3aGV0aGVyIHRoZSBPTlUgVHVuaW5nIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBydW5uaW5nLgorICoKKyAqIFxyZXR1cm4gICAgICAgIEJDTU9TX1RSVUUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcsIEJDTU9TX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3R1bmluZ19hcHBsX2lzX3J1bm5pbmcoYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CisKKy8qKiBQcm9jZXNzIGFuIGluZGljYXRpb24gcmVjZWl2ZWQuICBJZiB0aGUgT05VIFR1bmluZyBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHRoZSBpbmRpY2F0aW9uLCB0aGUKKyAqIGFwcHJvcHJpYXRlIGFjdGlvbiB3aWxsIGJlIHRha2VuLiAgSWYgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBpbnRlcmVzdGVkLCB0aGUgaW5kaWNhdGlvbiB3aWxsIGJlIGlnbm9yZWQuCisgKgorICoKKyAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZnJlZSB0aGUgaW5kaWNhdGlvbi4KKyAqIFRoZSBjYWxsZXIgbXVzdCBmcmVlIGl0IHVzaW5nIGJjbW9zX21zZ19mcmVlKCkgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFxwYXJhbVtpbl0gaW5kIFRoZSBpbmRpY2F0aW9uIHRoYXQgd2FzIHJlY2VpdmVkLgorICogXHJldHVybiAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgaW5kaWNhdGlvbiB3YXMgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseSBvciBpZ25vcmVkLCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9vbnVfdHVuaW5nX3Byb2Nlc3NfaW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9hdXRvICppbmQpOworYmNtb3NfZXJybm8gb251X3R1bmluZ191cGRhdGVfb251X2RiIChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfeGdwb25fb251X2lkIG9udV9pZCwgYmNtb2x0X3Bvbl9uaSBzb3VyY2VfcG9uX25pLCBiY21vbHRfcG9uX25pIHRhcmdldF9wb25fbmksIGJjbW9sdF9wb25faWQgdGFyZ2V0X3Bvbl9pZCwgYmNtb3NfYm9vbCByb2xsYmFjayk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL25ncG9uMl9vbnVfdHVuaW5nL2JjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZDUyOWUzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9sdF9ob3N0X2FwaS5oPgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGkuaCIKKyNpbmNsdWRlIDxiY21vbHRfZGV2X3NlbGVjdG9yLmg+CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpX2NyZWF0ZShiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCitzdGF0aWMgYmNtY2xpX2VudHJ5ICpvbnVfdHVuaW5nX2NsaV9kaXI7CitzdGF0aWMgYmNtY2xpX2VudHJ5ICpvbnVfdHVuaW5nX2NsaV90b3BfZGlyOworc3RhdGljIGJjbW9zX2Jvb2wgb251X3R1bmluZ19pc19yZWdpc3RlcmVkOworCisvKiBEZXN0cm95IENMSSBjb21tYW5kcyAqLworc3RhdGljIHZvaWQgb251X3R1bmluZ19jbGlfZGVzdHJveSh2b2lkKQoreworICAgIGlmIChvbnVfdHVuaW5nX2NsaV9kaXIpCisgICAgeworICAgICAgICBiY21jbGlfdG9rZW5fZGVzdHJveShvbnVfdHVuaW5nX2NsaV9kaXIpOworICAgICAgICBvbnVfdHVuaW5nX2NsaV9kaXIgPSBOVUxMOworICAgIH0KK30KKworLyogQ3VycmVudCBkZXZpY2UgY2hhbmdlIGluZGljYXRpb24gKi8KK3N0YXRpYyB2b2lkIGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19kZXZpY2VfY2hhbmdlX2luZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X2RldmlkIGRldikKK3sKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisgICAgYmNtb3NfZXJybm8gZXJyID0gYmNtb2x0X3N5c3RlbV9tb2RlX2dldChkZXYsICZzeXN0ZW1fbW9kZSk7CisKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3IgZGV2aWNlIElkXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX18yX1hfMTBfRykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJCdWlsZGluZyBvbnVfdHVuaW5nIENMSSBmb3IgZGV2aWNlICVkXG4iLCBkZXYpOworCisgICAgICAgIGVyciA9IGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGlfY3JlYXRlKG9udV90dW5pbmdfY2xpX3RvcF9kaXIpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3IgYnVpbGRpbmcgb251X3R1bmluZyBDTElcbiIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgCW9udV90dW5pbmdfY2xpX2Rlc3Ryb3koKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBvbnVfdHVuaW5nX2NtZF9zdGFydChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfc3RhcnQoY3VycmVudF9kZXZpY2UpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gb251X3R1bmluZ19jbWRfc3RvcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfc3RvcChjdXJyZW50X2RldmljZSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBvbnVfaGFuZG92ZXJfY21kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKwliY21vbHRfeGdwb25fb251X2lkIG9udV9pZDsKKwliY21vbHRfcG9uX25pIHRhcmdldF9wb25fbmk7CisJYmNtb2x0X3Bvbl9uaSBzb3VyY2VfcG9uX25pOworCXVpbnQzMl90IHRhcmdldF9wb25fYWRtaW5pc3RyYXRpdmVfbGFiZWw7CisJdWludDhfdCB0YXJnZXRfcG9uX2R3bGNoX2lkOworCXVpbnQzMl90IHRpbWVfdG9fc3dpdGNoOyAgICAgICAgLyogVGltZSB0byBzd2l0Y2ggaW4gbXMgKi8KKwliY21jbGlfY21kX3Bhcm0gKnJvbGxiYWNrX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2xsYmFjayIpOworCWJjbW9zX2Jvb2wgcm9sbGJhY2s7CisJYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCWJjbW9sdF9wb25faWQgdGFyZ2V0X3Bvbl9pZDsKKworCisJc291cmNlX3Bvbl9uaSA9IChiY21vbHRfcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNvdXJjZV9wb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKwl0YXJnZXRfcG9uX25pID0gKGJjbW9sdF9wb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGFyZ2V0X3Bvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworCW9udV9pZCA9IChiY21vbHRfcG9uX29udV9pZCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnUiKS0+dmFsdWUudW51bWJlcjsKKwl0YXJnZXRfcG9uX2FkbWluaXN0cmF0aXZlX2xhYmVsID0gKHVpbnQzMl90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRhcmdldF9wb25faWRfYWRtaW5pc3RyYXRpdmVfbGFiZWwiKS0+dmFsdWUudW51bWJlcjsKKwl0YXJnZXRfcG9uX2R3bGNoX2lkID0gKHVpbnQ4X3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGFyZ2V0X3Bvbl9pZF9kd2xjaF9pZCIpLT52YWx1ZS51bnVtYmVyOworCXRhcmdldF9wb25faWQuYWRtaW5pc3RyYXRpdmVfbGFiZWwgPSB0YXJnZXRfcG9uX2FkbWluaXN0cmF0aXZlX2xhYmVsOworCXRhcmdldF9wb25faWQuZHdsY2hfaWQgPSB0YXJnZXRfcG9uX2R3bGNoX2lkOworCXRpbWVfdG9fc3dpdGNoID0gKHVpbnQzMl90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpbWVfdG9fc3dpdGNoIiktPnZhbHVlLnVudW1iZXI7CisKKwlpZiAocm9sbGJhY2tfcGFybS0+dmFsdWUudW51bWJlciA9PSAwKQorCQlyb2xsYmFjayA9IEJDTU9TX0ZBTFNFOworCWVsc2UKKwkJcm9sbGJhY2sgPSBCQ01PU19UUlVFOworCS8qIHVwZGF0ZSB0dW5pbmcgaW4gcGFyYW1ldGVycyBpbiBkYXRhIGJhc2UgKi8KKwlvbnVfdHVuaW5nX3VwZGF0ZV9vbnVfZGIoY3VycmVudF9kZXZpY2UsIG9udV9pZCwgc291cmNlX3Bvbl9uaSwgdGFyZ2V0X3Bvbl9uaSwgdGFyZ2V0X3Bvbl9pZCwgcm9sbGJhY2spOworCisJYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlR1bmluZyBvdXQgT05VPSV1IHNvdXJjZV9wb25fbmk9JXUgdGFyZ2V0X3Bvbl9uaT0ldSBcbiIsIG9udV9pZCwgc291cmNlX3Bvbl9uaSwgdGFyZ2V0X3Bvbl9uaSk7CisKKwkvKiBzdGFydCB0dW5pbmcgb3V0IG9udSBvbiBzb3VyY2UgcG9uIGlkICovCisJYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAucG9uX25pID0gc291cmNlX3Bvbl9uaSwgLm9udV9pZCA9IG9udV9pZCB9OworCWJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXQgb251X3R1bmluZ19vdXQ7CisKKwlCQ01PTFRfT1BFUl9JTklUKCZvbnVfdHVuaW5nX291dCwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwga2V5KTsKKwlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRhcmdldF9kc19wb25faWQsIHRhcmdldF9wb25faWQpOworCUJDTU9MVF9PUEVSX1BST1BfU0VUKCZvbnVfdHVuaW5nX291dCwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgdGFyZ2V0X3VzX3Bvbl9pZCwgdGFyZ2V0X3Bvbl9pZCk7CisJQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9udV90dW5pbmdfb3V0LCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0aW1lX3RvX3N3aXRjaCwgdGltZV90b19zd2l0Y2gpOworCUJDTU9MVF9PUEVSX1BST1BfU0VUKCZvbnVfdHVuaW5nX291dCwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgcm9sbGJhY2ssIEJDTU9TX1RSVUUpOworCUJDTU9MVF9PUEVSX1BST1BfU0VUKCZvbnVfdHVuaW5nX291dCwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgc3RhdHVzLCBCQ01PTFRfU1RBVFVTX09OKTsKKwlyYyA9IGJjbW9sdF9vcGVyX3N1Ym1pdChjdXJyZW50X2RldmljZSwgJm9udV90dW5pbmdfb3V0Lmhkcik7CisJaWYgKHJjICE9IEJDTV9FUlJfT0spCisJCWJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJPTlU9JXUgdHVuaW5nIG91dCBmcm9tIFBPTj0ldSBmYWlsZWRcbiIsIG9udV9pZCwgc291cmNlX3Bvbl9uaSk7CisKKwlyZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogU3Vic2NyaWJlIGZvciBkZXZpY2UgY2hhbmdlIGluZGljYXRpb24gKi8KKyAgICBpZiAoIW9udV90dW5pbmdfaXNfcmVnaXN0ZXJlZCkKKyAgICB7CisgICAgCW9udV90dW5pbmdfaXNfcmVnaXN0ZXJlZCA9IEJDTU9TX1RSVUU7CisKKyAgICAgICAgZXJyID0gYmNtb2x0X2Rldl9zZWxfaW5kX3JlZ2lzdGVyKGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19kZXZpY2VfY2hhbmdlX2luZCk7CisgICAgfQorICAgIHJldHVybiBlcnIgPyBlcnIgOiBiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpX2NyZWF0ZSh0b3BfZGlyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGlfY3JlYXRlKGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBiY21jbGlfZW50cnkgKmRpcjsKKworICAgIGlmIChiY21jbGlfZGlyX2ZpbmQodG9wX2RpciwgIm9udV90dW5pbmciKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIGRpciA9IGJjbWNsaV9kaXJfYWRkKAorICAgICAgICB0b3BfZGlyLAorICAgICAgICAib251X3R1bmluZyIsCisgICAgICAgICJOR1BPTjIgT05VIHR1bmluZyB1c2VyIGFwcGxpY2F0aW9uIiwKKyAgICAgICAgQkNNQ0xJX0FDQ0VTU19BRE1JTiwKKyAgICAgICAgTlVMTCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKCFkaXIsIEJDTV9FUlJfTk9NRU0pOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJzdGFydCIsICJTdGFydCBPTlUgdHVuaW5nIGFwcGxpY2F0aW9uIiwgb251X3R1bmluZ19jbWRfc3RhcnQpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJzdG9wIiwgIlN0b3AgT05VIHR1bmluZyBhcHBsaWNhdGlvbiIsIG9udV90dW5pbmdfY21kX3N0b3ApOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgIm9udV9oYW5kb3ZlciIsICJPTlUgaGFuZG92ZXIiLCBvbnVfaGFuZG92ZXJfY21kLAorCQlCQ01DTElfTUFLRV9QQVJNKCJvbnUiLCAiT05VIElEIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorCQlCQ01DTElfTUFLRV9QQVJNKCJzb3VyY2VfcG9uX25pIiwgIlNvdXJjZSBQT05fTkkiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisJCUJDTUNMSV9NQUtFX1BBUk0oInRhcmdldF9wb25fbmkiLCAiVGFyZ2V0IFBPTl9OSSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKwkJQkNNQ0xJX01BS0VfUEFSTSgidGFyZ2V0X3Bvbl9pZF9hZG1pbmlzdHJhdGl2ZV9sYWJlbCIsICJUYXJnZXQgUE9OIElEIEFkbWluaXN0cmF0aXZlIGxhYmVsIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorCQlCQ01DTElfTUFLRV9QQVJNKCJ0YXJnZXRfcG9uX2lkX2R3bGNoX2lkIiwgIlRhcmdldCBQT04gSUQgQ2hhbm5lbCBpZCIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKwkJQkNNQ0xJX01BS0VfUEFSTSgidGltZV90b19zd2l0Y2giLCAiVGltZV9Ub19Td2l0Y2giLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisJCUJDTUNMSV9NQUtFX1BBUk1fRU5VTSgicm9sbGJhY2siLCAiUm9sbGJhY2siLCBiY21jbGlfZW51bV9ib29sX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisKKworICAgIG9udV90dW5pbmdfY2xpX2RpciA9IGRpcjsKKyAgICBvbnVfdHVuaW5nX2NsaV90b3BfZGlyID0gdG9wX2RpcjsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL25ncG9uMl9vbnVfdHVuaW5nL2JjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTlkNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX09OVV9UVU5JTkdfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX09OVV9UVU5JTkdfQ0xJX0hfCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDA1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL29tb24vTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorIyBFUE9OIG9wdGljYWwgbW9uaXRvcmluZyBhcHBsaWNhdGlvbgorCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKworCU1PRF9OQU1FID0gYmNtX3VzZXJfYXBwbF9vbW9uCisJTU9EX1RZUEUgPSBsaWIKKwlNT0RfREVQUyA9IGhvc3RfYXBpCisJaWZuZXEgKCIkKFNJTVVMQVRJT05fQlVJTEQpIiwgInkiKQorCQlNT0RfREVQUyArPSAgYmNtX2JvYXJkIGkyY19kZXZzCisJZW5kaWYKKworCWlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCQlNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisJZW5kaWYKKworCWlmbmVxICgiJChTSU1VTEFUSU9OX0JVSUxEKSIsICJ5IikKKwkJc3JjcyA9IG9tb24uYworCWVuZGlmCisKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL29tb24vb21vbi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL29tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzJmZjdlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL29tb24uYwpAQCAtMCwwICsxLDEzODMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9ib2FyZC5oPgorI2luY2x1ZGUgIm9tb24uaCIKKyNpbmNsdWRlICJiY21vbHRfdXRpbHMuaCIKKy8qIFRoZXNlIG1hY3JvcyBuZWVkIHRvIGJlIGRlZmluZWQgYmVmb3JlIHRoZSBmb2xsb3dpbmcgaW5jbHVkZS4gKi8KKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUl9TVEFSVCB0eXBlZGVmIGVudW0geworI2RlZmluZSBCQ01fSTJDX0RFVl9BRERSKG5hbWUsIGRlc2MsIHZhbCkgbmFtZSA9IHZhbCwKKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUl9FTkQgfSBiY21faTJjX2Rldl9hZGRyOworI2luY2x1ZGUgImJjbW9sdF9pMmNfZGV2c19hZGRyLmgiCisKKworLyogRml4ZWQgc2FtcGxlIGRlbGF5IGV4Y2VlZHMgdGhlIHN1bSBvZiB0aGUgbWF4aW11bSBncmFudCBzaXplIGFuZCBhIHdvcnN0IGNhc2UKKyAgIHJldHJpZXZhbCB0aW1lIGJhc2VkIG9uIHZhcmlvdXMgb3B0aWNzIG1vZHVsZXMnIGRhdGEgc2hlZXRzICovCisjZGVmaW5lIE9NT05fRklYRURfU0FNUExFX0RFTEFZX1VTICAgICAgMTIwMDAKKyNkZWZpbmUgU0ZGXzg0NzJfSURFTlRJRklFUl9BRERSICAgICAgICAweDAwICAgIC8qIFNGUCBhbmQgWEZQIElkZW50aWZpZXIgYnl0ZSovCisjZGVmaW5lIFNGRl84MDc3aV9JREVOVElGSUVSX0FERFIgICAgICAgMTI4ICAgICAvKiBYRlAgSWRlbnRpZmllciBieXRlICovCisjZGVmaW5lIFNGRl84NDcyX1JYX1BPV0VSX0FERFIgICAgICAgICAgMTA0ICAgICAvKiBTRlAgb2ZmZXNldCBpbnRvIEEyICovCisjZGVmaW5lIFNGRl84MDc3aV9SWF9QT1dFUl9BRERSICAgICAgICAgMTA0ICAgICAvKiBYRlAgYnl0ZSAxMDQvMTA1IGludG8gQTAgICh5ZXMgQTApICovCisjZGVmaW5lIFNGRl84MDc3aV9WRU5ET1JfTkFNRV9BRERSICAgICAgMTQ4ICAgICAvKiBYRlAgYnl0ZXMgMTYzLTE0OCBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzgwNzdpX1ZFTkRPUl9OQU1FX0xFTiAgICAgICAxNiAgICAgIC8qIFhGUCBuYW1lIGxlbmd0aCAgKi8KKyNkZWZpbmUgU0ZGXzgwNzdpX1ZFTkRPUl9QTl9BRERSICAgICAgICAxNjggICAgIC8qIFhGUCBieXRlcyAxODMtMTY4IGludG8gQTAgICAqLworI2RlZmluZSBTRkZfODA3N2lfVkVORE9SX1BOX0xFTiAgICAgICAgIDE2ICAgICAgLyogWEZQIHBhcnQgbnVtYmVyIGxlbmd0aCAgICovCisjZGVmaW5lIFNGRl84MDc3aV9WRU5ET1JfUkVWX0FERFIgICAgICAgMTg0ICAgICAvKiBYRlAgYnl0ZXMgMTg1LTE4NCBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzgwNzdpX1ZFTkRPUl9SRVZfTEVOICAgICAgICAyICAgICAgIC8qIFhGUCByZXZpc2lvbiBsZW4gICAqLworI2RlZmluZSBTRkZfODA3N2lfVkVORE9SX1NOX0FERFIgICAgICAgIDE5NiAgICAgLyogWEZQIGJ5dGVzIDIxMS0xOTYgaW50byBBMCAgICovCisjZGVmaW5lIFNGRl84MDc3aV9WRU5ET1JfU05fTEVOICAgICAgICAgMTYgICAgICAvKiBYRlAgc2VyaWFsIG51bWJlciBsZW4gICAqLworI2RlZmluZSBPTU9OX1RBU0tfTVNHX1FfU0laRSAgICAgICAgICAgIDE2ICAgICAgLyogYWxsb3cgb25lIG1lc3NhZ2UgcGVyIHBvcnQgKi8KKyNkZWZpbmUgU0ZGX1BBR0VfQUREUjEgICAgICAgICAgICAgICAgICAwICAgICAgIC8qIHVzZSBTRlBfSTJDX0FERFIxIGZvciBJMkMgcmVhZCBBMCAqLworI2RlZmluZSBTRkZfUEFHRV9BRERSMiAgICAgICAgICAgICAgICAgIDEgICAgICAgLyogdXNlIFNGUF9JMkNfQUREUjIgZm9yIDEyQyByZWFkIEEyICovCisKKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX05BTUVfQUREUiAgICAgIDIwICAgICAgLyogU0ZQIGJ5dGVzIDIwLTM1IGludG8gQTAgICAqLworI2RlZmluZSBTRkZfODQ3Ml9WRU5ET1JfTkFNRV9MRU4gICAgICAgMTYgICAgICAvKiBTRlAgbmFtZSBsZW5ndGggICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9PVUlfQUREUiAgICAgICAzNyAgICAgIC8qIFNGUCBieXRlcyAzNy0zOSBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX09VSV9MRU4gICAgICAgIDMgICAgICAgLyogU0ZQIG91aSBsZW5ndGggICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9QTl9BRERSICAgICAgICA0MCAgICAgIC8qIFNGUCBieXRlcyA0MC01NSBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX1BOX0xFTiAgICAgICAgIDE2ICAgICAgLyogU0ZQIHBhcnQgbnVtYmVyIGxlbmd0aCAgICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9SRVZfQUREUiAgICAgICA1NiAgICAgIC8qIFNGUCBieXRlcyA1Ni01OSBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX1JFVl9MRU4gICAgICAgIDQgICAgICAgLyogU0ZQIHJldmlzaW9uIGxlbiAgICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9TTl9BRERSICAgICAgICA2OCAgICAgIC8qIFNGUCBieXRlcyA2OC04MyBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX1NOX0xFTiAgICAgICAgIDE2ICAgICAgLyogU0ZQIHNlcmlhbCBudW1iZXIgbGVuICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX1NGRl9BRERSICAgICAgIDk0ICAgICAgLyogU0ZQIGJ5dGVzIDk0IGludG8gQTAgICAqLworI2RlZmluZSBTRkZfODQ3Ml9WRU5ET1JfU0ZGX0xFTiAgICAgICAgMSAgICAgICAvKiBTRlAgU0ZGLTg0NzIgQ29tcGxpYW5jZSByZXZpc2lvbiBsZW4gICAqLworCisjZGVmaW5lIFNGRl84NDcyX0RJQUdfTU9OX0FERFIgICAgICAgICA5MiAgICAgIC8qIFNGUCBieXRlcyA5MiBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfRU5IQU5DRURfT1BUX0FERFIgICAgIDkzICAgICAgLyogU0ZQIGJ5dGVzIDkzIGludG8gQTAgICAqLworI2RlZmluZSBTRkZfODQ3Ml9URU1QRVJBVFVSRV9BRERSICAgICAgOTYgICAgICAvKiBTRlAgYnl0ZXMgOTYgaW50byBBMCAgICovCisjZGVmaW5lIFNGRl84NDcyX0RJQUdfTU9OX0xFTiAgICAgICAgICAxICAgICAgIC8qIFNGUCBTRkYtODQ3MiBEaWFnbm9zdGljIE1vbml0b3JpbmcgVHlwZSBsZW4gICAqLworCisvKiBUYWJsZSAzMiA1LjIgSWRlbnRpZmllciB2YWx1ZXMgU0ZGODA3N2kqLworI2RlZmluZSBTRkZfSURFTlRJRklFUl9TRlAgIDB4MDMKKyNkZWZpbmUgU0ZGX0lERU5USUZJRVJfWEZQICAweDA2CisKK3R5cGVkZWYgdWludDMyX3Qgb21vbl9yc3NpX3ZhbHVlOworCisKKy8qIFVuaXF1ZWx5IGlkZW50aWZpZXMgc3BlY2lmaWMgRVBPTiBsaW5rcyB1bmRlciBtYW5hZ2VtZW50IGJ5IHRoaXMKKyAgIGFwcGxpY2F0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsKK30gb21vbl9saW5rX2tleTsKKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90ICBjYWRkcjsgICAgLyogSTJDIHN3aXRjaCBjb250cm9sIGFkZHJlc3MgKi8KKyAgICB1aW50MzJfdCAgc2N0cmw7ICAgIC8qIEkyQyBzd2l0Y2ggY29udHJvbCBjb21tYW5kIHZhbHVlICovCit9IGkyY19jb29yZHM7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgb3NfbXNnOworICAgIG9tb25fbGlua19rZXkgbGlua19rZXk7CisgICAgdWludDE2X3QgdHJpZ2dlcl93aWR0aF9uczsKKyAgICB1aW50MTZfdCB0cmlnZ2VyX2RlbGF5X25zOworICAgIHVpbnQxNl90IHNhbXBsZV9wZXJpb2RfdXM7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgYmNtb2x0X2Vwb25fbGxpZCBsbGlkOworICAgIHVpbnQ4X3Qgc2Nhbl9tb2RlOworfSBvbW9uX3Rhc2tfbXNnOworCisKK3N0YXRpYyBkZXZfbG9nX2lkIG9tb25fbG9nX2lkID0gREVWX0xPR19JTlZBTElEX0lEOworc3RhdGljIGJjbW9zX3Rhc2sgb21vbl90YXNrOworc3RhdGljIGJjbW9zX2Jvb2wgaXNfcnVubmluZyA9IEJDTU9TX0ZBTFNFOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCQ005Njg2MjAgcGxhdGZvcm0gZGVwZW5kZW50IEkyQyBhY2Nlc3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwordWludDhfdCBiY205Njg2MjBfY2xpZW50X3N3aXRjaGN0cmxfc2ZwWzE2XVsyXSA9Cit7CisgICAgeyAgIDB4NzIsICAgICAweDgwLCB9LAorICAgIHsgICAweDcyLCAgICAgMHg0MCwgfSwKKyAgICB7ICAgMHg3MiwgICAgIDB4MjAsIH0sCisgICAgeyAgIDB4NzIsICAgICAweDEwLCB9LAorICAgIHsgICAweDcyLCAgICAgIDB4OCwgfSwKKyAgICB7ICAgMHg3MiwgICAgICAweDQsIH0sCisgICAgeyAgIDB4NzIsICAgICAgMHgyLCB9LAorICAgIHsgICAweDcyLCAgICAgIDB4MSwgfSwKKyAgICB7ICAgMHg3MywgICAgIDB4MTAsIH0sCisgICAgeyAgIDB4NzMsICAgICAweDIwLCB9LAorICAgIHsgICAweDczLCAgICAgMHg0MCwgfSwKKyAgICB7ICAgMHg3MywgICAgIDB4ODAsIH0sCisgICAgeyAgIDB4NzMsICAgICAgMHgxLCB9LAorICAgIHsgICAweDczLCAgICAgIDB4MiwgfSwKKyAgICB7ICAgMHg3MywgICAgICAweDQsIH0sCisgICAgeyAgIDB4NzMsICAgICAgMHg4LCB9LAorfTsKKworCit1aW50OF90IGJjbTk2ODYyMF9jbGllbnRfc3dpdGNoY3RybF94ZnBbOF1bMl0gPQoreworICAgIC8qIGNhZGRyLCAgICBzY3RybCAqLworICAgIHsgICAweDcyLCAgICAgIDB4OCwgfSwKKyAgICB7ICAgMHg3MiwgICAgICAweDQsIH0sCisgICAgeyAgIDB4NzIsICAgICAgMHgyLCB9LAorICAgIHsgICAweDcyLCAgICAgIDB4MSwgfSwKKyAgICB7ICAgMHg3MywgICAgIDB4MTAsIH0sCisgICAgeyAgIDB4NzMsICAgICAweDIwLCB9LAorICAgIHsgICAweDczLCAgICAgMHg0MCwgfSwKKyAgICB7ICAgMHg3MywgICAgIDB4ODAsIH0sCit9OworCitzdGF0aWMgYmNtb3NfYm9vbCBvbW9uX2lzX2Vwb25fbmlfdmFsaWQoYmNtb2x0X2Vwb25fbmkgZXBvbikKK3sKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisKKyAgICBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmc3lzdGVtX21vZGUpOworCisgICAgc3dpdGNoIChzeXN0ZW1fbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1g6CisgICAgICAgICAgICByZXR1cm4gZXBvbiA8IDE2OworICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YXzEwX0c6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWDoKKyAgICAgICAgICAgIHJldHVybiBlcG9uIDwgODsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUE6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1g6CisgICAgICAgICAgICByZXR1cm4gZXBvbiA8IDQ7CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HOgorICAgICAgICAgICAgcmV0dXJuIGVwb24gPCAyOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Jvb2wgdHJ4X2lkX2Zyb21fZXBvbl9uaShiY21vbHRfZXBvbl9uaSBlcG9uLCB1aW50OF90ICp0cnhfaWQpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXBvbl80eFs0XSA9IHsgMiwgMywgNiwgNyB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGVwb25fMnhfMTBnWzJdID0geyAzLCA0IH07CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworCisgICAgYmNtb2x0X3N5c3RlbV9tb2RlX2dldChjdXJyZW50X2RldmljZSwgJnN5c3RlbV9tb2RlKTsKKworICAgIHN3aXRjaCAoc3lzdGVtX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF9DT0VYSVNURU5DRV9URE1BOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YXzEwX0c6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgICAgICAgICAgKnRyeF9pZCA9ICh1aW50OF90KWVwb247CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YOgorICAgICAgICAgICAgKnRyeF9pZCA9IGVwb25fNHhbZXBvbl07CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0c6CisgICAgICAgICAgICAqdHJ4X2lkID0gZXBvbl8yeF8xMGdbZXBvbl07CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICp0cnhfaWQgPSAodWludDhfdCktMTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICogYmNtb2x0X2dldF9zY2FuX3Jlc3VsdChiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXMgc3RhdHVzKQoreworICAgIHN3aXRjaCAoc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfQ09NUExFVEU6CisgICAgICAgICAgICByZXR1cm4gIk9LOiBFUE9OIFJPR1VFIFNDQU4gSVMgQ09NUExFVEUiOworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9TQ0FOX1NUQVRVU19MTElEX1NUQVRFX0lTX0JBRDoKKyAgICAgICAgICAgIHJldHVybiAiRkFJTDogUkVRVUVTVEVEIExMSUQgSVMgSU4gVVNFIjsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfSU5URVJOQUw6CisgICAgICAgICAgICByZXR1cm4gIkZBSUw6IFNDQU4gSEFEIEFOIElOVEVSTkFMIFNXIEVSUk9SIjsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfTk9SRVM6CisgICAgICAgICAgICByZXR1cm4gIkZBSUw6IE5PIFJFU09VUkNFUyBBVkFJTEFCTEUiOworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9TQ0FOX1NUQVRVU19MTElEX0lTX09PUjoKKyAgICAgICAgICAgIHJldHVybiAiRkFJTDogUkVRVUVTVEVEIExMSUQgSVMgT1VUIE9GIFJBTkdFIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiT0s6IEJDTU9MVF9ST0dVRV9TQ0FOX1NUQVRVU19DT01QTEVURSI7CisgICAgfQorfQorCisvKioKKyAqIFxicmllZiBHZXQgSTJDIGFkZHJlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIEkyQyBtdXggdGFyZ2V0IGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBsaW5rX2tleQorICogb2JqZWN0LgorICoKKyAqIFxwYXJhbSBlcG9uX25pIEVQT04gcG9ydCBpbmRleAorICogXHBhcmFtIGNvb3JkcyBJMkMgbXV4IHRhcmdldCBjb250YWluZXIKKyAqCisgKiBccmV0dXJuCisgKiBOb25lCisgKi8KK3N0YXRpYwordm9pZCBvbW9uX2dldF9pMmNfY29vcmRzKHVpbnQ4X3QgdHJ4X2lkLCBpMmNfY29vcmRzKiBjb29yZHMpCit7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworCisgICAgYmNtb2x0X3N5c3RlbV9tb2RlX2dldCgwLCAmc3lzdGVtX21vZGUpOworCisgICAgaWYgKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQSkKKyAgICB7CisgICAgICAgIGNvb3Jkcy0+Y2FkZHIgID0gYmNtOTY4NjIwX2NsaWVudF9zd2l0Y2hjdHJsX3hmcFt0cnhfaWRdWzBdOworICAgICAgICBjb29yZHMtPnNjdHJsICA9IGJjbTk2ODYyMF9jbGllbnRfc3dpdGNoY3RybF94ZnBbdHJ4X2lkXVsxXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29vcmRzLT5jYWRkciAgPSBiY205Njg2MjBfY2xpZW50X3N3aXRjaGN0cmxfc2ZwW3RyeF9pZF1bMF07CisgICAgICAgIGNvb3Jkcy0+c2N0cmwgID0gYmNtOTY4NjIwX2NsaWVudF9zd2l0Y2hjdHJsX3NmcFt0cnhfaWRdWzFdOworICAgIH0KK30gLyogb21vbl9nZXRfaTJjX2Nvb3JkcyAqLworCisKKy8qKgorICogXGJyaWVmIENvbmZpZ3VyZSBJMkMgbXV4CisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBJMkMgbXV4IHRvIHRhcmdldCB0aGUgY29ycmVjdCBvcHRpY3MgbW9kdWxlIGZvcgorICogdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgUlNTSSBtZWFzdXJlbWVudC4KKyAqCisgKiBccGFyYW0gZXBvbl9uaSBFUE9OIHBvcnQgaW5kZXgKKyAqCisgKiBccmV0dXJuCisgKiBCQ01fRVJSX09LIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgaWYgbm90CisgKi8KK3N0YXRpYworYmNtb3NfZXJybm8gb21vbl9wbGF0Zm9ybV9jb25maWd1cmVfaTJjKHVpbnQ4X3QgdHJ4X2lkLCB1aW50OF90IHBhZ2UpCit7CisKKyAgICAgaTJjX2Nvb3JkcyBjb29yZHM7CisgICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgIG9tb25fZ2V0X2kyY19jb29yZHModHJ4X2lkLCAmY29vcmRzKTsKKworICAgICByYyA9IGJjbV9ib2FyZF9kZXZfY2hhbmdlKGNvb3Jkcy5jYWRkcik7CisgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICB7CisgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAgICJiY21fYm9hcmRfZGV2X2NoYW5nZSgldSkgZmFpbGVkXG4iLCBjb29yZHMuY2FkZHIpOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICAgcmMgPSBiY21fYm9hcmRfc3dpdGNoX3dyaXRlKGNvb3Jkcy5zY3RybCk7CisgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAiYmNtX2JvYXJkX3N3aXRjaF93cml0ZSgldSkgZmFpbGVkXG4iLCBjb29yZHMuc2N0cmwpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgIGlmIChwYWdlID09IFNGRl9QQUdFX0FERFIxKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgcmMgPSBiY21fYm9hcmRfZGV2X2NoYW5nZShTRlBfSTJDX0FERFIxKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHsgICAvLyBTRkZfUEFHRV9BRERSMgorICAgICAgICAgICAgICAgICByYyA9IGJjbV9ib2FyZF9kZXZfY2hhbmdlKFNGUF9JMkNfQUREUjIpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIEJDTV9MT0coV0FSTklORywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmNtX2JvYXJkX2Rldl9jaGFuZ2UoJXUpIGZhaWxlZFxuIiwgKFNGUF9JMkNfQUREUjErcGFnZSkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgfQorICAgICByZXR1cm4gcmM7CisKK30gLyogb21vbl9wbGF0Zm9ybV9jb25maWd1cmVfaTJjICovCisKKworLyoqCisgKiBcYnJpZWYgUmVhZCBNYW51ZmFjdHVyaW5nIGRhdGEgZnJvbSBPcHRpYyBNb2R1bGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBYRlAgVHJhbmNlaXZlciBEYXRhIChhY2NvcmRpbmcgdG8KKyAqIFNGRjgwNzdpIGZvciBhbiBYRlApIGZyb20gYW4gb3B0aWNzIG1vZHVsZS4gVGhlIHJlc3VsdCBpcworICogZGlzcGxheWVkIGZvciB0aGlzIHNhbXBsZSBjb2RlLgorICoKKyAqIFxwYXJhbSBlcG9uX25pIEVQT04gTkkgdG8gdGFrZSBtZWFzdXJlbWVudAorICoKKyAqIFxyZXR1cm4KKyAqIEJDTV9FUlJfT0sgaWYgc3VjY2Vzc2Z1bCwgZXJyb3IgY29kZSBpZiBub3QKKyAqLworc3RhdGljCitiY21vc19lcnJubyBvbW9uX3RyeF9zdGF0dXNfcmVhZChiY21vbHRfZXBvbl9uaSBlcG9uX25pLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICB1aW50MzJfdCBzZmZfaWRlbnRpZmllciA9IDE7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIHVpbnQ4X3QgaTsKKworICAgIC8vIDgwNzcxIFhGUCBTcGVjaWZpYyBzdHVmZgorICAgIHVpbnQzMl90IHJhd192ZW5kb3JJZF84MDc3aTsKKyAgICB1aW50OF90IHZlbmRvcklkXzgwNzdpW1NGRl84MDc3aV9WRU5ET1JfTkFNRV9MRU4rMV07CisgICAgdWludDMyX3QgcmF3X3ZlbmRvclBuXzgwNzdpOworICAgIHVpbnQ4X3QgdmVuZG9yUG5fODA3N2lbU0ZGXzgwNzdpX1ZFTkRPUl9QTl9MRU4rMV07CisgICAgdWludDMyX3QgcmF3X3ZlbmRvclNuXzgwNzdpOworICAgIHVpbnQ4X3QgdmVuZG9yU25fODA3N2lbU0ZGXzgwNzdpX1ZFTkRPUl9TTl9MRU4rMV07CisgICAgdWludDMyX3QgcmF3X3ZlbmRvclJldl84MDc3aTsKKyAgICB1aW50OF90IHZlbmRvclJldl84MDc3aVtTRkZfODA3N2lfVkVORE9SX1JFVl9MRU4rMV07CisKKyAgICBtZW1zZXQoJnZlbmRvcklkXzgwNzdpLCAwLCBzaXplb2YodmVuZG9ySWRfODA3N2kpKTsKKyAgICBtZW1zZXQoJnZlbmRvclBuXzgwNzdpLCAwLCBzaXplb2YodmVuZG9yUG5fODA3N2kpKTsKKyAgICBtZW1zZXQoJnZlbmRvclNuXzgwNzdpLCAwLCBzaXplb2YodmVuZG9yU25fODA3N2kpKTsKKyAgICBtZW1zZXQoJnZlbmRvclJldl84MDc3aSwgMCwgc2l6ZW9mKHZlbmRvclJldl84MDc3aSkpOworCisgICAgLy8gODQ3MiBTRlAgU3BlY2lmaWMgc3R1ZmYKKyAgICB1aW50MzJfdCByYXdfdmVuZG9ySWRfODQ3MjsKKyAgICB1aW50OF90IHZlbmRvcklkXzg0NzJbU0ZGXzg0NzJfVkVORE9SX05BTUVfTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JQbl84NDcyOworICAgIHVpbnQ4X3QgdmVuZG9yUG5fODQ3MltTRkZfODQ3Ml9WRU5ET1JfUE5fTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JTbl84NDcyOworICAgIHVpbnQ4X3QgdmVuZG9yU25fODQ3MltTRkZfODQ3Ml9WRU5ET1JfU05fTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JSZXZfODQ3MjsKKyAgICB1aW50OF90IHZlbmRvclJldl84NDcyW1NGRl84NDcyX1ZFTkRPUl9SRVZfTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JTZmZfODQ3MjsKKyAgICB1aW50OF90IHZlbmRvclNmZl84NDcyW1NGRl84NDcyX1ZFTkRPUl9TRkZfTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JPdWlfODQ3MjsKKyAgICB1aW50OF90IHZlbmRvck91aV84NDcyW1NGRl84NDcyX1ZFTkRPUl9PVUlfTEVOKzFdOworICAgIHVpbnQzMl90IHJhd19kaWFnTW9uXzg0NzI7CisgICAgdWludDhfdCBkaWFnTW9uXzg0NzIgPSAwOworICAgIHVpbnQzMl90IHJhd19lbmhhbmNlZE9wdF84NDcyOworICAgIHVpbnQ4X3QgZW5oYW5jZWRPcHRfODQ3MiA9IDA7CisKKyAgICBtZW1zZXQoJnZlbmRvcklkXzg0NzIsIDAsIHNpemVvZih2ZW5kb3JJZF84NDcyKSk7CisgICAgbWVtc2V0KCZ2ZW5kb3JQbl84NDcyLCAwLCBzaXplb2YodmVuZG9yUG5fODQ3MikpOworICAgIG1lbXNldCgmdmVuZG9yU25fODQ3MiwgMCwgc2l6ZW9mKHZlbmRvclNuXzg0NzIpKTsKKyAgICBtZW1zZXQoJnZlbmRvclJldl84NDcyLCAwLCBzaXplb2YodmVuZG9yUmV2Xzg0NzIpKTsKKyAgICBtZW1zZXQoJnZlbmRvclNmZl84NDcyLCAwLCBzaXplb2YodmVuZG9yU2ZmXzg0NzIpKTsKKyAgICBtZW1zZXQoJnZlbmRvck91aV84NDcyLCAwLCBzaXplb2YodmVuZG9yT3VpXzg0NzIpKTsKKworICAgIHVpbnQ4X3QqIHRtcHJlc3VsdDsKKyAgICBpbnQxNl90IHRlbXBfcmVzdWx0ID0gMDsKKyAgICB1aW50MzJfdCByYXdfdGVtcF9yZXN1bHQgPSAwOworCisgICAgdWludDhfdCB0cnhfaWQ7CisKKyAgICBpZiAoICEgdHJ4X2lkX2Zyb21fZXBvbl9uaShlcG9uX25pLCAmdHJ4X2lkKSApCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiVFJYIElkIGlzIGludmFsaWQgZm9yIEVQT04gTkkgJWQgXG4iLCBlcG9uX25pKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgY2hhciAqcFNmcFR5cGU7CisKKyAgICBwU2ZwVHlwZSA9ICJVTktOIjsKKworCisgICAgLy8gQ2hlY2sgZm9yIHRyYW5zZXZpZXIgcHJlc2VuY2UKKyAgICBpZiAoIChyYyA9IG9tb25fcGxhdGZvcm1fY29uZmlndXJlX2kyYyh0cnhfaWQsIFNGRl9QQUdFX0FERFIxKSkgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIFJlYWQgbW9kdWxlIGlkZW50aWZpZXIgKi8KKyAgICAgICAgaWYgKCAocmMgPSBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzg0NzJfSURFTlRJRklFUl9BRERSLCAmc2ZmX2lkZW50aWZpZXIpKSA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHNmZl9pZGVudGlmaWVyICYgMHgwMDBGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU0ZGX0lERU5USUZJRVJfU0ZQOgorICAgICAgICAgICAgICAgICAgICBwU2ZwVHlwZSA9ICJTRlBcMCI7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIHZlbmRvciBJZAorICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODQ3Ml9WRU5ET1JfTkFNRV9MRU47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSByYyB8IGJjbV9ib2FyZF9kZXZfcmVhZCg4LCBTRkZfODQ3Ml9WRU5ET1JfTkFNRV9BRERSK2ksICZyYXdfdmVuZG9ySWRfODQ3Mik7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JJZF84NDcyW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvcklkXzg0NzI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBwYXJ0IE51bWJlciwgc2VyaWFsIG51bWJlciwgU0ZGIHJldmlzaW9uLCBhbmQgUmV2aXNpb24KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8U0ZGXzg0NzJfVkVORE9SX1BOX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX1ZFTkRPUl9QTl9BRERSK2ksICZyYXdfdmVuZG9yUG5fODQ3Mik7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JQbl84NDcyW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvclBuXzg0NzI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODQ3Ml9WRU5ET1JfU05fTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzg0NzJfVkVORE9SX1NOX0FERFIraSwgJnJhd192ZW5kb3JTbl84NDcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclNuXzg0NzJbaV0gPSAodWludDhfdClyYXdfdmVuZG9yU25fODQ3MjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPFNGRl84NDcyX1ZFTkRPUl9SRVZfTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzg0NzJfVkVORE9SX1JFVl9BRERSK2ksICZyYXdfdmVuZG9yUmV2Xzg0NzIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yUmV2Xzg0NzJbaV0gPSAodWludDhfdClyYXdfdmVuZG9yUmV2Xzg0NzI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODQ3Ml9WRU5ET1JfU0ZGX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX1ZFTkRPUl9TRkZfQUREUitpLCAmcmF3X3ZlbmRvclNmZl84NDcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclNmZl84NDcyW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvclNmZl84NDcyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPFNGRl84NDcyX1ZFTkRPUl9PVUlfTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzg0NzJfVkVORE9SX09VSV9BRERSK2ksICZyYXdfdmVuZG9yT3VpXzg0NzIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yT3VpXzg0NzJbaV0gPSAodWludDhfdClyYXdfdmVuZG9yT3VpXzg0NzI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX0RJQUdfTU9OX0FERFIsICZyYXdfZGlhZ01vbl84NDcyKTsKKyAgICAgICAgICAgICAgICAgICAgZGlhZ01vbl84NDcyID0gKHVpbnQ4X3QpcmF3X2RpYWdNb25fODQ3MjsKKworICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX0VOSEFOQ0VEX09QVF9BRERSLCAmcmF3X2VuaGFuY2VkT3B0Xzg0NzIpOworICAgICAgICAgICAgICAgICAgICBlbmhhbmNlZE9wdF84NDcyID0gKHVpbnQ4X3QpcmF3X2VuaGFuY2VkT3B0Xzg0NzI7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2hpZnQgdG8gQTIKKyAgICAgICAgICAgICAgICAgICAgcmMgPSByYyB8IG9tb25fcGxhdGZvcm1fY29uZmlndXJlX2kyYyh0cnhfaWQsIFNGRl9QQUdFX0FERFIyKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSByYyB8IGJjbV9ib2FyZF9kZXZfcmVhZCgxNiwgU0ZGXzg0NzJfVEVNUEVSQVRVUkVfQUREUiwgJnJhd190ZW1wX3Jlc3VsdCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wcmVzdWx0ID0gKHVpbnQ4X3QqKSgmcmF3X3RlbXBfcmVzdWx0KTsKKworICAgICAgICAgICAgICAgICAgICB0ZW1wX3Jlc3VsdCA9IHRtcHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9yZXN1bHQgPSAodGVtcF9yZXN1bHQgPDwgOCkgfCB0bXByZXN1bHRbMl07CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNGRl9JREVOVElGSUVSX1hGUDoKKworICAgICAgICAgICAgICAgICAgICBwU2ZwVHlwZSA9ICJYRlBcMCI7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIHZlbmRvciBJZAorICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODA3N2lfVkVORE9SX05BTUVfTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzgwNzdpX1ZFTkRPUl9OQU1FX0FERFIraSwgJnJhd192ZW5kb3JJZF84MDc3aSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JJZF84MDc3aVtpXSA9ICh1aW50OF90KXJhd192ZW5kb3JJZF84MDc3aTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIHBhcnQgTnVtYmVyLCBTTiwgYW5kIFJldmlzaW9uCisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPFNGRl84MDc3aV9WRU5ET1JfUE5fTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzgwNzdpX1ZFTkRPUl9QTl9BRERSK2ksICZyYXdfdmVuZG9yUG5fODA3N2kpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yUG5fODA3N2lbaV0gPSAodWludDhfdClyYXdfdmVuZG9yUG5fODA3N2k7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODA3N2lfVkVORE9SX1NOX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84MDc3aV9WRU5ET1JfU05fQUREUitpLCAmcmF3X3ZlbmRvclNuXzgwNzdpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclNuXzgwNzdpW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvclNuXzgwNzdpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8U0ZGXzgwNzdpX1ZFTkRPUl9SRVZfTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzgwNzdpX1ZFTkRPUl9SRVZfQUREUitpLCAmcmF3X3ZlbmRvclJldl84MDc3aSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JSZXZfODA3N2lbaV0gPSAodWludDhfdClyYXdfdmVuZG9yUmV2XzgwNzdpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX05PREVWOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICAgICAiVFJYIENvdWxkIG5vdCByZWFkIGRldmljZSA6IFNGRl84NDcyX0lERU5USUZJRVJfQUREUiBmb3IgUE9OICVkIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgIGVwb25fbmksIHJjLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICJUUlggQ291bGQgbm90IGNvbmZpZ3VyZSBwbGF0Zm9ybSA6IFNGRl9QQUdFX0FERFIxIGZvciBQT04gJWQgcmMgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICBlcG9uX25pLCByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmMgPSBCQ01fRVJSX05PREVWOworICAgIH0KKworCisgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBpZiAoIChzZmZfaWRlbnRpZmllciAmIDB4MDAwRikgPT0gU0ZGX0lERU5USUZJRVJfWEZQKQorICAgICAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbltPTU9OXSAlcyBUcmFuY2VpdmVyIGlzIHByZXNlbnQgb24gUE9OICVkXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgW09NT05dIFRyeCBWZW5kb3IgSWQgaXM6ICVzXHJcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFZlbmRvciBQYXJ0IE51bWJlcjogJXNcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBbT01PTl0gVmVuZG9yIFNlcmlhbCBOdW1iZXI6ICVzXHJcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFZlbmRvciBSZXZpc2lvbjogJXNcclxuICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZwVHlwZSwgZXBvbl9uaSwgdmVuZG9ySWRfODA3N2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JQbl84MDc3aSwgdmVuZG9yU25fODA3N2ksIHZlbmRvclJldl84MDc3aSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTRlAgc3R1ZmYKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5bT01PTl0gJXMgVHJhbmNlaXZlciBpcyBwcmVzZW50IG9uIFBPTiAlZFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBbT01PTl0gVHJ4IFZlbmRvciBJZCBpczogJXNcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFZlbmRvciBQYXJ0IE51bWJlcjogJXNcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFZlbmRvciBTZXJpYWwgTnVtYmVyOiAlc1xyXG4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBbT01PTl0gVmVuZG9yIFJldmlzaW9uOiAlc1xyXG4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBbT01PTl0gVmVuZG9yIE9VSTogJXNcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFRyYW5zY2VpdmVyIFRlbXBlcmF0dXJlOiAlZENcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIEVuaGFuY2VkIE9wdGlvbnMgU0ZGLTg0NzIgQnl0ZSA5MzogJXhcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIERpYWdub3N0aWMgTW9uaXRvciBUeXBlIFNGRi04NDcyIEJ5dGUgOTI6ICV4XHJcbiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmcFR5cGUsIGVwb25fbmksIHZlbmRvcklkXzg0NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JQbl84NDcyLCB2ZW5kb3JTbl84NDcyLCB2ZW5kb3JSZXZfODQ3MiwgdmVuZG9yT3VpXzg0NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX3Jlc3VsdC8yNTYsIGVuaGFuY2VkT3B0Xzg0NzIsIGRpYWdNb25fODQ3MiApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfSAvKiBvbW9uX3Jzc2lfcmVhZCAqLworCisvKioKKyAqIFxicmllZiBSZWFkIFJTU0kgcmVzdWx0cyBmcm9tIEkyQworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIFJYIFBvd2VyIE1lYXN1cmVtZW50IChTRkY4NDcyIGZvciBhbgorICogU0ZQIGFuZCBTRkY4MDc3aSBmb3IgYW4gWEZQKSBmcm9tIGFuIG9wdGljcyBtb2R1bGUuIFRoZQorICogcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgZ2xvYmFsIG9tb25fc3RhdGUuCisgKgorICogXHBhcmFtIGVwb25fbmkgRVBPTiBOSSB0byB0YWtlIG1lYXN1cmVtZW50CisgKiBccGFyYW0gcnNzaV92YWx1ZSBSZXR1cm5lZCBSU1NJIHZhbHVlIGlmIHN1Y2Nlc3NmdWwKKyAqCisgKiBccmV0dXJuCisgKiBCQ01fRVJSX09LIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgaWYgbm90CisgKi8KK3N0YXRpYworYmNtb3NfZXJybm8gb21vbl9yc3NpX3JlYWQoYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwgdWludDMyX3QgKnJzc2lfdmFsdWUpCit7CisgICAgdWludDMyX3QgcmF3X3Jzc2lfcmVzdWx0ID0gMDsKKyAgICB1aW50MzJfdCBzZmZfaWRlbnRpZmllciA9IDE7CisgICAgdWludDhfdCB0cnhfaWQ7CisgICAgdWludDMyX3QgcnNzaV9yZXN1bHQgPSAwOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICB1aW50OF90KiByZXN1bHQ7CisKKyAgICBpZiAoICEgdHJ4X2lkX2Zyb21fZXBvbl9uaShlcG9uX25pLCAmdHJ4X2lkKSApCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiVFJYIElkIGlzIGludmFsaWQgZm9yIEVQT04gTkkgJWQgXG4iLCBlcG9uX25pKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHRyYW5zZXZpZXIgcHJlc2VuY2UKKyAgICBpZiAoYmNtX2JvYXJkX3RyeF9wcmVzZW50KHRyeF9pZCkgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJjID0gb21vbl9wbGF0Zm9ybV9jb25maWd1cmVfaTJjKHRyeF9pZCwgU0ZGX1BBR0VfQUREUjEpOworICAgICAgICAvKiBSZWFkIG1vZHVsZSBpZGVudGlmaWVyICovCisKKyAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlYWQgbW9kdWxlIGlkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIHJjID0gYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX0lERU5USUZJRVJfQUREUiwgJnNmZl9pZGVudGlmaWVyKTsKKworICAgICAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHVpbnQ4X3QqKSgmcmF3X3Jzc2lfcmVzdWx0KTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2ZmX2lkZW50aWZpZXIgJiAweDAwMEYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNGRl9JREVOVElGSUVSX1NGUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gb21vbl9wbGF0Zm9ybV9jb25maWd1cmVfaTJjKHRyeF9pZCwgU0ZGX1BBR0VfQUREUjIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBiY21fYm9hcmRfZGV2X3JlYWQoMTYsIFNGRl84NDcyX1JYX1BPV0VSX0FERFIsICZyYXdfcnNzaV9yZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0ZGX0lERU5USUZJRVJfWEZQOgorCisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IGJjbV9ib2FyZF9kZXZfcmVhZCgxNiwgU0ZGXzgwNzdpX1JYX1BPV0VSX0FERFIsICZyYXdfcnNzaV9yZXN1bHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT0RFVjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcnNzaV9yZXN1bHQgPSByZXN1bHRbM107CisgICAgICAgICAgICAgICAgICAgIHJzc2lfcmVzdWx0ID0gKHJzc2lfcmVzdWx0IDw8IDgpIHwgcmVzdWx0WzJdOworCisgICAgICAgICAgICAgICAgICAgICpyc3NpX3ZhbHVlID0gcnNzaV9yZXN1bHQ7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiVFJYIENvdWxkIG5vdCByZWFkIGRldmljZSA6IFNGRl84NDcyX0lERU5USUZJRVJfQUREUiBmb3IgUE9OICVkIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBlcG9uX25pLCByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAgICAgIlRSWCBDb3VsZCBub3QgcmVhZCBwbGF0Zm9ybSA6IFNGRl9QQUdFX0FERFIxIGZvciBQT04gJWQgcmMgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9uaSwgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU87CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX05PREVWOworICAgIH0KKworICAgIHJldHVybiByYzsKK30gLyogb21vbl9yc3NpX3JlYWQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGxhdGZvcm0gaW5kZXBlbmRlbnQgUlNTSSBtZWFzdXJlbWVudAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBcYnJpZWYgUmVhZCBYRlAvU0ZQIERhdGEgZnJvbSBUcmFuc2NlaXZlciBNb2R1bGUxCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbWFudWZhY3R1cmluZyBkYXRhIGZyb20gdGhlIFNGUAorICogbW9kdWxlIHZpYSBJMkMuCisgKgorICogXHBhcmFtIGxpbmtfa2V5IEVQT04gTkkKKyAqCisgKiBccmV0dXJuCisgKiBOb25lCisgKi8KK3N0YXRpYwordm9pZCBvbW9uX3RyeF9zdGF0dXNfaW5pdGlhdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21vbl9saW5rX2tleSAqbGlua19rZXkpCit7CisKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIFBlcmZvcm0gdGhlIEkyQyBvcGVyYXRpb25zIHNwZWNpZmllZCBpbiBTRkYtODQ3MiAoU0ZQKS9TRkYtODA3N2kgKFhGUCkgdG8KKyAgICAgICByZXRyaWV2ZSB0aGUgcG1hbnVmYWN0dXJlciBkYXRhIGZyb20gdGhlIG9wdGljcyBtb2R1bGUuICovCisKKyAgICBpZiAoISBvbW9uX2lzX2Vwb25fbmlfdmFsaWQobGlua19rZXktPmVwb25fbmkpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgIltPTU9OXSBUUlggU3RhdHVzOiBlcG9uX25pIG9mICglZCkgaXMgb3V0IG9mIHJhbmdlIGZvciBwbGF0Zm9ybVxuIiwgbGlua19rZXktPmVwb25fbmkpOworICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyBDaGVjayBmb3IgdHJhbnNjZWl2ZXIgcHJlc2VuY2UKKworICAgIHVpbnQ4X3QgdHJ4X2lkOworCisgICAgaWYgKCAhIHRyeF9pZF9mcm9tX2Vwb25fbmkobGlua19rZXktPmVwb25fbmksICZ0cnhfaWQpICkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICJbT01PTl0gVFJYIElkIGlzIGludmFsaWQgZm9yIEVQT04gTkkgJWQgXG4iLCBsaW5rX2tleS0+ZXBvbl9uaSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByYyA9IGJjbV9ib2FyZF90cnhfcHJlc2VudCh0cnhfaWQpOworCisgICAgaWYgKHJjID09IEJDTV9FUlJfTk9ERVYpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgICAgICJbT01PTl0gVFJYIFN0YXR1czogVHJ4X2lkICVkIE5vdCBQcmVzZW50IG9uIFBPTiAlZFxyXG4gIiwgdHJ4X2lkLCBsaW5rX2tleS0+ZXBvbl9uaSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByYyA9IG9tb25fdHJ4X3N0YXR1c19yZWFkKHRyeF9pZCwgc2Vzc2lvbik7CisKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICJbT01PTl0gSXNzdWUgVFJYIFN0YXR1czogUmVhZCBvcGVyYXRpb24gZmFpbGVkIHdpdGggcmMgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIE5vdGlmeSBleHRlcm5hbCBob3N0IGNvZGUgb2YgdGhlIG91dGNvbWUgdGhyb3VnaCBhbiBvcHRpb25hbCBjYWxsYmFjaywKKyAgICAgICBkZWZhdWx0aW5nIHRvIG91dHB1dCBpbiB0aGUgQ0xJIHNlc3Npb24gd2hlcmUgdGhlIGNvbW1hbmQgd2FzIGluaXRpYXRlZAorICAgICAgIGlmIG5vIGNhbGxiYWNrIGlzIHN1cHBsaWVkLiAqLworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiXG5bT01PTl0gVFJYIFN0YXR1czogRGF0YSBvbiBQT04gJWQgQ29tcGxldGVcclxuIiwgbGlua19rZXktPmVwb25fbmkpOworfQorLyoqCisgKiBcYnJpZWYgUmVhZCBSU1NJIE1lYXN1cmVtZW50IFJlc3VsdCBmcm9tIFRyYW5zY2VpdmVyIE1vZHVsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHN0b3JlZCBSU1NJIG1lYXN1cmVtZW50IGZyb20gdGhlCisgKiBYRlAvU0ZQIG1vZHVsZSB2aWEgSTJDLgorICoKKyAqIFxwYXJhbSBsaW5rX2tleSBFUE9OIE5JCisgKgorICogXHJldHVybgorICogTm9uZQorICovCitzdGF0aWMKK3ZvaWQgb21vbl9yc3NpX3JlYWRfaW5pdGlhdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21vbl9saW5rX2tleSAqbGlua19rZXkpCit7CisgICAgdWludDMyX3QgcnNzaV92YWx1ZSA9IDA7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoISBvbW9uX2lzX2Vwb25fbmlfdmFsaWQobGlua19rZXktPmVwb25fbmkpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgIltPTU9OXSBSc3NpIFJlYWQ6IGVwb25fbmkgb2YgKCVkKSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHBsYXRmb3JtXG4iLCBsaW5rX2tleS0+ZXBvbl9uaSk7CisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgLyogUGVyZm9ybSB0aGUgSTJDIG9wZXJhdGlvbnMgc3BlY2lmaWVkIGluIFNGRi04NDcyIChTRlApL1NGRi04MDc3aSAoWEZQKSB0bworICAgICAgIHJldHJpZXZlIHRoZSBwb3dlciBtZWFzdXJlbWVudHMgZnJvbSB0aGUgb3B0aWNzIG1vZHVsZS4gKi8KKyAgICByYyA9IG9tb25fcnNzaV9yZWFkKGxpbmtfa2V5LT5lcG9uX25pLCAmcnNzaV92YWx1ZSk7CisKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9OT0RFVikKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAgICAgIltPTU9OXSBSc3NpIFJlYWQ6IFRSWCBOb3QgUHJlc2VudCBvbiBQT04gJWRcclxuICIsIGxpbmtfa2V5LT5lcG9uX25pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyYyA9PSBCQ01fRVJSX0lPKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgICAgICJbT01PTl0gUnNzaSBSZWFkOiBDb3VsZCBub3QgcmVhZCBkZXZpY2UgZm9yIFBPTiAlZCBcbiIsbGlua19rZXktPmVwb25fbmkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgICAgICJJc3N1ZSBSU1NJIFJlYWQgb3BlcmF0aW9uIGZhaWxlZCB3aXRoIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogTm90aWZ5IGV4dGVybmFsIGhvc3QgY29kZSBvZiB0aGUgb3V0Y29tZSB0aHJvdWdoIGFuIG9wdGlvbmFsIGNhbGxiYWNrLAorICAgICAgIGRlZmF1bHRpbmcgdG8gb3V0cHV0IGluIHRoZSBDTEkgc2Vzc2lvbiB3aGVyZSB0aGUgY29tbWFuZCB3YXMgaW5pdGlhdGVkCisgICAgICAgaWYgbm8gY2FsbGJhY2sgaXMgc3VwcGxpZWQuICovCisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgIltPTU9OXSBSU1NJIFJlYWQgUlggUG93ZXI6IFBvbl9uaT0lZCByeCBwb3dlciAlZC4lZHVXXHJcbiIsCisgICAgICAgICAgICBsaW5rX2tleS0+ZXBvbl9uaSwKKyAgICAgICAgICAgIHJzc2lfdmFsdWUvMTAsCisgICAgICAgICAgICByc3NpX3ZhbHVlJTEwKTsKKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIlxuW09NT05dIFJTU0kgUmVhZCBvbiBQT04gJWQgQ29tcGxldGVcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX2tleS0+ZXBvbl9uaSk7Cit9CisvKm9tb25fcnNzaV9yZWFkX2luaXRpYXRlKi8KKworCisvKioKKyAqIFxicmllZiBSZXF1ZXN0IE1hcGxlIEZpcm13YXJlIHRvIHJ1biB0aGUgUm9ndWUgT05VIExMSUQgc2Nhbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGFuIEFQSSBtZXNzYWdlIHRvIHRoZSBPTFQgdG8gcnVuIGEgc2NhbgorICogb24gYSBzcGVjaWZpYyBFUE9OIExMSUQgb3IgYWNyb3NzIGFsbCBMTElEcyBpbiB0aGUgUE9OLgorICogUmVzdWx0cyBhcmUgcmV0dXJuZWQgdXBvbiBjb21wbGV0aW9uLiBSb2d1ZSBMTElEcyBhcmUgbWFya2VkCisgKiBhbmQgcXVhcmVudGluZWQgZm9yIHRoZSBob3N0IHRvIGV4YW1pbmUuCisgKgorICogXHBhcmFtIGxpbmtfa2V5IEVQT04gbGluayBpbmZvcm1hdGlvbgorICogXHBhcmFtIGVwb3BuX2xsaWQgIFNwZWNpZmljIExMSUQgdG8gc2NhbgorICogXHBhcmFtIHNjYW5fbW9kZSAgIFNwZWNpZmllcyBhIHNpbmdsZSBMTElEIG9yIEFsbC4KKyAqCisgKiBccmV0dXJuCisgKiBOb25lCisgKi8KKworc3RhdGljCit2b2lkIG9tb25fcnVuX3JvZ3VlX2xsaWRfc2NhbihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbW9uX2xpbmtfa2V5ICpsaW5rX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9sbGlkIGxsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX21vZGUpCit7CisgICAgY29uc3QgYmNtb2x0X2Vwb25fbmlfa2V5IG5pX2tleSA9IHsgLmVwb25fbmkgPSBsaW5rX2tleS0+ZXBvbl9uaSB9OworICAgIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2NhbiBpc3N1ZV9sbGlkX3NjYW5fb3A7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogUGVyZm9ybSBhbiBBUEkgb3BlcmF0aW9uIGRpcmVjdGluZyB0aGUgTWFwbGUgZmlybXdhcmUgdG8gaXNzdWUgYW4gYmNtb2x0X2Vwb25fbmlfaXNzdWVfcm9ndWVfcnhfcG93ZXIKKyAgICAgICBSU1NJIGdyYW50IHRvIHRoZSBzcGVjaWZpZWQgRVBPTiBsaW5rLiBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0lTU1VFX1JPR1VFX1JYX1BPV0VSKi8KKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJmlzc3VlX2xsaWRfc2Nhbl9vcCwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuICwgbmlfa2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmaXNzdWVfbGxpZF9zY2FuX29wLCBlcG9uX25pLCByb2d1ZV9sbGlkX3NjYW4sIG1vZGUsIHNjYW5fbW9kZSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmlzc3VlX2xsaWRfc2Nhbl9vcCwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuLCBsbGlkLCBsbGlkKTsKKworICAgIEJDTV9MT0dfQ0FMTEVSX0ZNVChJTkZPLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICJJc3N1ZSBSb2d1ZSBTY2FuIE9wZXJhdGlvbiBmb3IgTExJRCAweCV4LCBQb25fbmk9JWRcclxuIiwgbGxpZCwgbGlua19rZXktPmVwb25fbmkpOworCisgICAgcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQobGlua19rZXktPmRldmljZV9pZCwgJmlzc3VlX2xsaWRfc2Nhbl9vcC5oZHIpOworCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiUm9ndWUgU2NhbiBPcGVyYXRpb24gRmFpbGVkIHdpdGggcmMgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorfS8qb21vbl9ydW5fcm9ndWVfbGxpZF9zY2FuKi8KKworLyoqCisgKiBcYnJpZWYgRXhlY3V0ZSBSU1NJIG1lYXN1cmVtZW50CisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhbiBBUEkgbWVzc2FnZSB0byB0aGUgT0xUIHRvIGlzc3VlIGFuIFJTU0kgZ3JhbnQuICBJdAorICogdGhlbiByZWFkcyBiYWNrIHRoZSByZXN1bHRzIHZpYSBJMkMuIFNldCBncmFudF9sZW5ndGhfdHEgdG8gMCB0byByZXRyZWl2ZSB0aGUKKyAqIFJTU0kgdmFsdWUgd2l0aG91dCBpc3N1aW5nIHRoZSBzdHJvYmUgY29tbWFuZCB0byB0aGUgT0xULgorICoKKyAqIFxwYXJhbSBsaW5rX2tleSBFUE9OIFJTU0kgbGluayBpbmZvcm1hdGlvbgorICogXHBhcmFtIGdyYW50X2xlbmd0aF90cSBTaXplIG9mIHRoZSBSU1NJIGdyYW50CisgKiBccGFyYW0gc3RhcnRfb2Zmc2V0IFN0cm9iZSBvZmZzZXQgZnJvbSBzdGFydCBvZiB0aGUgUlNTSSBncmFudAorICogXHBhcmFtIGVuZF9vZmZzZXQgU3Ryb2JlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgdGhlIFJTU0kgZ3JhbnQKKyAqCisgKiBccmV0dXJuCisgKiBOb25lCisgKi8KK3N0YXRpYwordm9pZCBvbW9uX3Jzc2lfbWVhc3VyZW1lbnRfaW5pdGlhdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbW9uX2xpbmtfa2V5ICpsaW5rX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRyaWdnZXJfd2lkdGhfdHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0cmlnZ2VyX2RlbGF5X3RxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2FtcGxlX3BlcmlvZCkKK3sKKyAgICBjb25zdCBiY21vbHRfZXBvbl9uaV9rZXkgbmlfa2V5ID0geyAuZXBvbl9uaSA9IGxpbmtfa2V5LT5lcG9uX25pIH07CisgICAgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudCBpc3N1ZV9yc3NpX2dyYW50X29wOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmICghIG9tb25faXNfZXBvbl9uaV92YWxpZChsaW5rX2tleS0+ZXBvbl9uaSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiW09NT05dIFJ4IFBvd2VyOiBlcG9uX25pIG9mICglZCkgaXMgb3V0IG9mIHJhbmdlIGZvciBwbGF0Zm9ybVxuIiwgbGlua19rZXktPmVwb25fbmkpOworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHVpbnQ4X3QgdHJ4X2lkOworCisgICAgaWYgKCAhIHRyeF9pZF9mcm9tX2Vwb25fbmkobGlua19rZXktPmVwb25fbmksICZ0cnhfaWQpICkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICJbT01PTl0gUnggUG93ZXI6IFRSWCBJZCBpcyBpbnZhbGlkIGZvciBFUE9OIE5JICVkIFxuIiwgbGlua19rZXktPmVwb25fbmkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHRyYW5zZXZpZXIgcHJlc2VuY2UKKyAgICByYyA9IGJjbV9ib2FyZF90cnhfcHJlc2VudCh0cnhfaWQpOworCisgICAgaWYgKHJjID09IEJDTV9FUlJfTk9ERVYpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgICAgICJbT01PTl0gUnggUG93ZXI6IFRSWCBOb3QgUHJlc2VudCBvbiBQT04gJWRcclxuICIsIGxpbmtfa2V5LT5lcG9uX25pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFBlcmZvcm0gYW4gQVBJIG9wZXJhdGlvbiBkaXJlY3RpbmcgdGhlIE1hcGxlIGZpcm13YXJlIHRvIGlzc3VlIGFuIGJjbW9sdF9lcG9uX25pX2lzc3VlX3JvZ3VlX3J4X3Bvd2VyCisgICAgICAgUlNTSSBncmFudCB0byB0aGUgc3BlY2lmaWVkIEVQT04gbGluay4gQkNNT0xUX0VQT05fTklfT1BFUl9JRF9JU1NVRV9ST0dVRV9SWF9QT1dFUiovCisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZpc3N1ZV9yc3NpX2dyYW50X29wLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50ICwgbmlfa2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmaXNzdWVfcnNzaV9ncmFudF9vcCwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncmFudGVkX2xpbmssIGxpbmtfa2V5LT5tYWNfYWRkcmVzcyk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmlzc3VlX3Jzc2lfZ3JhbnRfb3AsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcl93aWR0aCwgdHJpZ2dlcl93aWR0aF90cSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmlzc3VlX3Jzc2lfZ3JhbnRfb3AsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcl9kZWxheSwgdHJpZ2dlcl9kZWxheV90cSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmlzc3VlX3Jzc2lfZ3JhbnRfb3AsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3BlcmlvZCwgc2FtcGxlX3BlcmlvZCk7CisKKyAgICByYyA9IGJjbW9sdF9vcGVyX3N1Ym1pdChsaW5rX2tleS0+ZGV2aWNlX2lkLCAmaXNzdWVfcnNzaV9ncmFudF9vcC5oZHIpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgImlzc3VlIFJTU0kgZ3JhbnQgb3BlcmF0aW9uIGZhaWxlZCB3aXRoIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKy8qb21vbl9yc3NpX21lYXN1cmVtZW50X2luaXRpYXRlKi8KKworLy8gcnNzaSBzcGVjaWZpYyBpbmRpY2F0aW9uIGhhbmRsZXIgaW50ZXJmYWNlIC0tCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9yc3NpX2hhbmRsZV9pbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9hdXRvICppbmQpCit7CisKKyAgICBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCogb21vbl9pbmQ7CisgICAgdWludDMyX3QgcnNzaV92YWx1ZSA9IDA7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgY2hhciB0QnVmWzQwXTsKKworICAgIG9tb25faW5kID0gKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICopIGluZDsKKyAgICBlcG9uX25pID0gb21vbl9pbmQtPmtleS5lcG9uX25pOworCisgICAgaWYgKG9tb25faW5kLT5kYXRhLnN0YXR1cyA9PSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKiBQZXJmb3JtIHRoZSBJMkMgb3BlcmF0aW9ucyBzcGVjaWZpZWQgaW4gU0ZGLTg0NzIgKFNGUCkvU0ZGLTgwNzdpIChYRlApIHRvCisgICAgICAgICAgIHJldHJpZXZlIHRoZSBwb3dlciBtZWFzdXJlbWVudHMgZnJvbSB0aGUgb3B0aWNzIG1vZHVsZS4gKi8KKyAgICAgICAgcmMgPSBvbW9uX3Jzc2lfcmVhZChlcG9uX25pLCAmcnNzaV92YWx1ZSk7CisKKyAgICB9CisgICAgLyogTm90aWZ5IGV4dGVybmFsIGhvc3QgY29kZSBvZiB0aGUgb3V0Y29tZSB0aHJvdWdoIGFuIG9wdGlvbmFsIGNhbGxiYWNrLAorICAgICAgIGRlZmF1bHRpbmcgdG8gb3V0cHV0IGluIHRoZSBDTEkgc2Vzc2lvbiB3aGVyZSB0aGUgY29tbWFuZCB3YXMgaW5pdGlhdGVkCisgICAgICAgaWYgbm8gY2FsbGJhY2sgaXMgc3VwcGxpZWQuICovCisKKyAgICBCQ01fTE9HX0NBTExFUl9GTVQoSU5GTywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAiIFJTU0kgSW5kaWNhdGlvbiBSY3Y6IGZvciBMaW5rIE1hYyAlcywgTExJRCAweCV4LCBEZXY9JTAxZCwgUG9uX25pPSVkXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY18yX3N0cigmb21vbl9pbmQtPmRhdGEubGlua19tYWMsIHRCdWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9tb25faW5kLT5kYXRhLmxsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9tb25faW5kLT5rZXkuZXBvbl9uaSk7CisKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgICIgJXMgbWVhc3VyZWQgcnggcG93ZXIgJWQuJWR1VyByYXdfZGF0YSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAob21vbl9pbmQtPmRhdGEuc3RhdHVzID09IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUyA/ICJTdWNjZWVkZWQiIDogIkZhaWxlZCIpLAorICAgICAgICAgICAgICAgICAgIHJzc2lfdmFsdWUvMTAsIHJzc2lfdmFsdWUlMTAsIHJzc2lfdmFsdWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgInBvbiAlZCwgZmFpbGVkIHdpdGggZXJybm8gJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgIGVwb25fbmksIHJjLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8vIGVwb24gcm9ndWUgb251IHNwZWNpZmljIGluZGljYXRpb24gaGFuZGxlciBpbnRlcmZhY2UgLS0KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX3JvZ3VlX2hhbmRsZV9pbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2F1dG8gKmluZCkKK3sKKyAgICAodm9pZClpbnN0YW5jZTsKKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb24qIHJvZ3VlX2luZDsKKyAgICBjaGFyIHRCdWZbNDBdOworCisgICAgcm9ndWVfaW5kID0gKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbiAqKSBpbmQ7CisKKyAgICAvKiBOb3RpZnkgZXh0ZXJuYWwgaG9zdCBjb2RlIG9mIHRoZSBvdXRjb21lIHRocm91Z2ggYW4gb3B0aW9uYWwgY2FsbGJhY2ssCisgICAgICAgZGVmYXVsdGluZyB0byBvdXRwdXQgaW4gdGhlIENMSSBzZXNzaW9uIHdoZXJlIHRoZSBjb21tYW5kIHdhcyBpbml0aWF0ZWQKKyAgICAgICBpZiBubyBjYWxsYmFjayBpcyBzdXBwbGllZC4gKi8KKworICAgIEJDTV9MT0dfQ0FMTEVSX0ZNVChJTkZPLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICJSb2d1ZSBPTlUgU2NhbiBWaW9sYXRpb246IEFsbVN0YXRlID0gJXMsIExpbmsgTWFjICVzLCBMTElEIDB4JXgsIFJhbmdlPSUwZCwgUG9uX25pPSUyZFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAocm9ndWVfaW5kLT5kYXRhLmFsYXJtX3N0YXR1cy5hbGFybV9zdGF0dXMgPT0gQkNNT0xUX1NUQVRVU19PTiA/ICJPTiIgOiAiT0ZGIiksCisgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY18yX3N0cigmcm9ndWVfaW5kLT5rZXkubWFjX2FkZHJlc3MsIHRCdWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvZ3VlX2luZC0+ZGF0YS5hbGFybV9zdGF0dXMuZGVuaWVkX2xsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcm9ndWVfaW5kLT5kYXRhLmFsYXJtX3N0YXR1cy5kZW5pZWRfcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgcm9ndWVfaW5kLT5rZXkuZXBvbl9uaSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLy8gZXBvbiByb2d1ZSBzY2FuIGNvbXBsZXRlIHNwZWNpZmljIGluZGljYXRpb24gaGFuZGxlciBpbnRlcmZhY2UgLS0KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX3JvZ3VlX2NvbXBsZXRlX2hhbmRsZV9pbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2F1dG8gKmluZCkKK3sKKyAgICAodm9pZClpbnN0YW5jZTsKKyAgICBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlKiByb2d1ZV9pbmQ7CisKKyAgICByb2d1ZV9pbmQgPSAoYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSAqKSBpbmQ7CisKKyAgICAvKiBOb3RpZnkgZXh0ZXJuYWwgaG9zdCBjb2RlIG9mIHRoZSBvdXRjb21lIHRocm91Z2ggYW4gb3B0aW9uYWwgY2FsbGJhY2ssCisgICAgICAgZGVmYXVsdGluZyB0byBvdXRwdXQgaW4gdGhlIENMSSBzZXNzaW9uIHdoZXJlIHRoZSBjb21tYW5kIHdhcyBpbml0aWF0ZWQKKyAgICAgICBpZiBubyBjYWxsYmFjayBpcyBzdXBwbGllZC4gKi8KKworICAgIEJDTV9MT0dfQ0FMTEVSX0ZNVChJTkZPLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICJSb2d1ZSBPTlUgc2NhbiBjb21wbGV0ZSBmb3IgUG9uICVkLCBTdGF0dXMgPSAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICByb2d1ZV9pbmQtPmtleS5lcG9uX25pLAorICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ2V0X3NjYW5fcmVzdWx0KHJvZ3VlX2luZC0+ZGF0YS5yZXR1cm5faW5kX3N0YXR1cykpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvLyBwdWJsaWMgaW5kaWNhdGlvbiBoYW5kbGVyIGludGVyZmFjZSAtLSBjYWxsZWQgaW4gdHJhbnNwb3J0IGxheWVyIGNvbnRleHQKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfb21vbl9oYW5kbGVfaW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIHVpbnQ4X3QgaW5zdGFuY2UsIGJjbW9sdF9hdXRvICppbmQpCit7CisKKyAgICAvLyBOb3QgYW4gZXJyb3IsIHdlIGp1c3QgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGluZGljYXRpb24uCisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLy8gV2UgbG9vayBhdCBtZXNzYWdlIHRhcmdldHRpbmcgZXBvbiBuaS4KKyAgICBpZiAoaW5kLT5oZHIub2JqX3R5cGUgPT0gQkNNT0xUX09CSl9JRF9FUE9OX05JKQorICAgIHsKKyAgICAgICAgLy8gV2UgbG9vayBhdCBSU1NJIENvbXBsZXRpb24gZXZlbnQgaW5kaWNhdGlvbnMuCisgICAgICAgIGlmIChpbmQtPmhkci5zdWJncm91cCA9PSAodWludDE2X3QpQkNNT0xUX0VQT05fTklfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBiY21vbHRfdXNlcl9hcHBsX3Jzc2lfaGFuZGxlX2luZChkZXZpY2VfaWQsaW5zdGFuY2UsaW5kKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIGxvb2sgZm9yIFJvZ3VlIFNjYW4gQ29tcGxldGUgZXZlbnQgaW5kaWNhdGlvbnMuCisgICAgICAgICAgICBpZiAoaW5kLT5oZHIuc3ViZ3JvdXAgPT0gKHVpbnQxNl90KUJDTU9MVF9FUE9OX05JX0FVVE9fSURfUk9HVUVfU0NBTl9DT01QTEVURSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IGJjbW9sdF91c2VyX2FwcGxfcm9ndWVfY29tcGxldGVfaGFuZGxlX2luZChkZXZpY2VfaWQsIGluc3RhbmNlLCBpbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0sgKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HX0NBTExFUl9GTVQoSU5GTywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgICAgICJPTU9OIEhhbmRsZSBJbmRpY2F0aW9uIEVycm9yOiBQb24gJWQsIFR5cGUgJWQsIFJjICVkXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIGluZC0+aGRyLnN1Ymdyb3VwLCByYyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3QgYW4gZXJyb3IsIHdlIGp1c3QgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGluZGljYXRpb24uCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8vIFdlIGxvb2sgYXQgbWVzc2FnZSB0YXJnZXR0aW5nIGVwb24gZGVuaWVkIGxpbmtzLgorICAgIGlmIChpbmQtPmhkci5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkspCisgICAgeworICAgICAgICAvLyBXZSBsb29rIGF0IERlbmllZCBMaW5rIEV2ZW50cyBvZiB0aGlzIHR5cGUuCisgICAgICAgIGlmIChpbmQtPmhkci5zdWJncm91cCA9PSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1JPR1VFX1ZJT0xBVElPTikKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBiY21vbHRfdXNlcl9hcHBsX3JvZ3VlX2hhbmRsZV9pbmQoZGV2aWNlX2lkLCBpbnN0YW5jZSwgaW5kKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdCBhbiBlcnJvciwgd2UganVzdCBkb24ndCBjYXJlIGFib3V0IHRoaXMgb2JqZWN0LgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworCit9IC8qIGJjbW9sdF91c2VyX2FwcGxfb21vbl9oYW5kbGVfaW5kICovCisKKy8qKgorICogXGJyaWVmIE9wdGljYWwgbW9uaXRvcmluZyB0YXNrIG1lc3NhZ2UgaGFuZGxlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9wdGljYWwgbW9uaXRvcmluZyB0YXNrIGhhbmRsZXIuICBBdCB0aGlzIHRpbWUgdGhlIG9ubHkKKyAqIG1lc3NhZ2UgaXMgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JTU0lfU0FNUExFIHdoaWNoIHN0YXJ0cyB0aGUgUlNTSQorICogbWVhc3VyZW1lbnQgb24gdGhlIE9MVC4KKyAqCisgKiBccGFyYW0gbW9kdWxlX2lkIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfT01PTgorICogXHBhcmFtIG9zX21zZyBNZXNzYWdlIGNvbnRlbnRzCisgKi8KK3N0YXRpYwordm9pZCBvbW9uX29zX21zZ19oYW5kbGUoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgb21vbl90YXNrX21zZyAqbXNnID0gKG9tb25fdGFza19tc2cgKilvc19tc2c7CisKKyAgICBzd2l0Y2ggKG1zZy0+b3NfbXNnLnR5cGUpCisgICAgeworICAgIGNhc2UgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JYX1BPV0VSOgorICAgICAgICAgICAgb21vbl9yc3NpX21lYXN1cmVtZW50X2luaXRpYXRlKG1zZy0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2ctPmxpbmtfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT50cmlnZ2VyX3dpZHRoX25zICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+dHJpZ2dlcl9kZWxheV9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2FtcGxlX3BlcmlvZF91cyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1RSWF9TVEFUVVM6CisKKyAgICAgICAgICAgIG9tb25fdHJ4X3N0YXR1c19pbml0aWF0ZShtc2ctPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZy0+bGlua19rZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JPR1VFX1NDQU46CisgICAgICAgICAgICBvbW9uX3J1bl9yb2d1ZV9sbGlkX3NjYW4obXNnLT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2ctPmxpbmtfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+bGxpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnNjYW5fbW9kZSk7CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PU19NU0dfSURfSU5JVElBVEVfUlNTSV9SRUFEOgorICAgICAgICAgICAgb21vbl9yc3NpX3JlYWRfaW5pdGlhdGUobXNnLT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2ctPmxpbmtfa2V5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9IC8qIG9tb25fb3NfbXNnX2hhbmRsZSAqLworCisKKy8qKgorICogXGJyaWVmIFN0YXJ0IHRoZSBvcHRpY2FsIG1vbml0b3JpbmcgdGFzaworICoKKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSB1c2VyIGxldmVsIG9wdGljYWwgbW9uaXRvcmluZyB0YXNrIGFuZCBjcmVhdGVzIHRoZQorICogb3B0aWNhbCBtb25pdG9yaW5nIG1vZHVsZS4gIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIGF0IHN0YXJ0IHVwLgorICoKKyAqIFxyZXR1cm4KKyAqIE5vbmUKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbW9uX2FwcGxfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9zX3Rhc2tfcGFybSB0YXNrX3BhcmFtcyA9CisgICAgeworICAgICAgICAubmFtZSA9ICJ1c2VyX2FwcGxfb21vbiIsCisgICAgICAgIC5wcmlvcml0eSA9IFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX09NT04sCisgICAgICAgIC5jb3JlID0gQkNNT1NfQ1BVX0NPUkVfQU5ZLCAvKiBObyBDUFUgYWZmaW5pdHkgKi8KKyAgICAgICAgLmluaXRfaGFuZGxlciA9IE5VTEwKKyAgICB9OworICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnFwYXJtID0KKyAgICAgICAgeworICAgICAgICAgICAgLm5hbWUgPSAidXNlcl9hcHBsX29tb24iLAorICAgICAgICAgICAgLnNpemUgPSBPTU9OX1RBU0tfTVNHX1FfU0laRQorICAgICAgICB9CisgICAgfTsKKworICAgIGlmIChpc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG9tb25fbG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoInVzZXJfYXBwbF9vbW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZfTE9HX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIEJVR19PTihERVZfTE9HX0lOVkFMSURfSUQgPT0gb21vbl9sb2dfaWQpOworCisgICAgcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmb21vbl90YXNrLCAmdGFza19wYXJhbXMpOworICAgIEJVR19PTihyYyAhPSBCQ01fRVJSX09LKTsKKworICAgIHJjID0gYmNtb3NfbW9kdWxlX2NyZWF0ZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NT04sICZvbW9uX3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2R1bGVfcGFyYW1zKTsKKyAgICBCVUdfT04ocmMgIT0gQkNNX0VSUl9PSyk7CisKKyAgICBpc19ydW5uaW5nID0gQkNNT1NfVFJVRTsKK30gLyogYmNtb2x0X2Vwb25fb21vbl9hcHBsX2luaXQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ0xJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICogXGJyaWVmIFJYIHBvd2VyIHNhbXBsZSBDTEkgY29tbWFuZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgInNhbXBsZSIgQ0xJIGNvbW1hbmQuICBJdCBwcm9jZXNzZXMgdGhlIENMSQorICogcGFyYW1ldGVycyBhbmQgZGlzcGF0Y2hlcyBhIHN0YXJ0IHNhbXBsZSBtZXNzYWdlIHRvIHRoZSBvcHRpY2FsIG1vbml0b3JpbmcKKyAqIHRhc2suCisgKgorICogXHBhcmFtIHNlc3Npb24gQ0xJIHNlc3Npb24gSUQKKyAqIFxwYXJhbSBwYXJtIENvbW1hbmQgcGFyYW1ldGVycworICogXHBhcmFtIG5fcGFybXMgTnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAqCisgKiBccmV0dXJuCisgKiBCQ01fRVJSX09LIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgaWYgbm90CisgKi8KK3N0YXRpYworYmNtb3NfZXJybm8gb21vbl9jbWRfcnhfcG93ZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIG9tb25fbGlua19rZXkgbGlua19rZXk7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtY2xpX2NtZF9wYXJtICplcG9uX25pOworICAgIGJjbWNsaV9jbWRfcGFybSAqbWFjX2FkZHI7CisgICAgYmNtY2xpX2NtZF9wYXJtICpUd2lkdGhfbnM7CisgICAgYmNtY2xpX2NtZF9wYXJtICpUZGVsYXlfbnM7CisgICAgYmNtY2xpX2NtZF9wYXJtICpUc2FtcGxlX3VzOworICAgIG9tb25fdGFza19tc2cgKm1zZzsKKworICAgIC8qIEdldCB0aGUgQ0xJIHBhcmFtZXRlcnMuICovCisgICAgZXBvbl9uaSAgICA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBtYWNfYWRkciAgID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3JhbnRlZF9saW5rIik7CisgICAgVHdpZHRoX25zICA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyaWdnZXJfd2lkdGgiKTsgIC8vIFJTU0kgVHdpZHRoIGluIG5zCisgICAgVGRlbGF5X25zICA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyaWdnZXJfZGVsYXkiKTsgIC8vIFJTU0kgVGRlbGF5IGluIG5zCisgICAgVHNhbXBsZV91cyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNhbXBsZV9wZXJpb2QiKTsgIC8vIFJTU0kgVHNhbXBsZSBpbiB1cworCisgICAgbGlua19rZXkuZGV2aWNlX2lkID0gY3VycmVudF9kZXZpY2U7CisgICAgbGlua19rZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSllcG9uX25pLT52YWx1ZS5udW1iZXI7CisgICAgbGlua19rZXkubWFjX2FkZHJlc3MgPSAoYmNtb3NfbWFjX2FkZHJlc3MpbWFjX2FkZHItPnZhbHVlLm1hYzsKKworICAgIC8qIFNlbmQgYW4gaW5kaWNhdGlvbiB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgdG8gYmUKKyAgICAgICBwcm9jZXNzZWQuICovCisgICAgbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBtc2ctPm9zX21zZy50eXBlID0gQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JYX1BPV0VSOworICAgIG1zZy0+b3NfbXNnLmhhbmRsZXIgPSBvbW9uX29zX21zZ19oYW5kbGU7CisgICAgbXNnLT5saW5rX2tleSA9IGxpbmtfa2V5OworICAgIG1zZy0+dHJpZ2dlcl93aWR0aF9ucyA9IFR3aWR0aF9ucy0+dmFsdWUubnVtYmVyOworICAgIG1zZy0+dHJpZ2dlcl9kZWxheV9ucyA9IFRkZWxheV9ucy0+dmFsdWUubnVtYmVyOworICAgIG1zZy0+c2FtcGxlX3BlcmlvZF91cyA9IFRzYW1wbGVfdXMtPnZhbHVlLm51bWJlcjsKKyAgICBtc2ctPnNlc3Npb24gPSBzZXNzaW9uOworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfT01PTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnLT5vc19tc2csIDApOworICAgIEJVR19PTihyYyk7CisKKworICAgIHJldHVybiByYzsKK30gLyogb21vbl9jbWRfc2FtcGxlICovCisKK3N0YXRpYworYmNtb3NfZXJybm8gb21vbl9jbWRfdHJ4X2RhdGEoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBvbW9uX2xpbmtfa2V5IGxpbmtfa2V5OworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbWNsaV9jbWRfcGFybSAqZXBvbl9uaTsKKyAgICBvbW9uX3Rhc2tfbXNnICptc2c7CisKKyAgICAvKiBHZXQgdGhlIENMSSBwYXJhbWV0ZXJzLiAqLworICAgIGVwb25fbmkgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisKKyAgICBsaW5rX2tleS5kZXZpY2VfaWQgPSBjdXJyZW50X2RldmljZTsKKyAgICBsaW5rX2tleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKWVwb25fbmktPnZhbHVlLm51bWJlcjsKKworICAgIC8qIFNlbmQgYW4gaW5kaWNhdGlvbiB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgdG8gYmUKKyAgICAgICBwcm9jZXNzZWQuICovCisgICAgbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBtc2ctPm9zX21zZy50eXBlID0gQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1RSWF9TVEFUVVM7CisgICAgbXNnLT5vc19tc2cuaGFuZGxlciA9IG9tb25fb3NfbXNnX2hhbmRsZTsKKyAgICBtc2ctPmxpbmtfa2V5ID0gbGlua19rZXk7CisgICAgbXNnLT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZy0+b3NfbXNnLCAwKTsKKyAgICBCVUdfT04ocmMpOworCisKKyAgICByZXR1cm4gcmM7Cit9CisvKiBvbW9uX2NtZF90cnhfZGF0YSAqLworCitzdGF0aWMKK2JjbW9zX2Vycm5vIG9tb25fY21kX3JlYWRfcnNzaV9yZXN1bHQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBvbW9uX2xpbmtfa2V5IGxpbmtfa2V5OworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbWNsaV9jbWRfcGFybSAqZXBvbl9uaTsKKyAgICBvbW9uX3Rhc2tfbXNnICptc2c7CisKKyAgICAvKiBHZXQgdGhlIENMSSBwYXJhbWV0ZXJzLiAqLworICAgIGVwb25fbmkgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisKKyAgICBsaW5rX2tleS5kZXZpY2VfaWQgPSBjdXJyZW50X2RldmljZTsKKyAgICBsaW5rX2tleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKWVwb25fbmktPnZhbHVlLm51bWJlcjsKKworICAgIC8qIFNlbmQgYW4gaW5kaWNhdGlvbiB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgdG8gYmUKKyAgICAgICBwcm9jZXNzZWQuICovCisgICAgbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBtc2ctPm9zX21zZy50eXBlID0gQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JTU0lfUkVBRDsKKyAgICBtc2ctPm9zX21zZy5oYW5kbGVyID0gb21vbl9vc19tc2dfaGFuZGxlOworICAgIG1zZy0+bGlua19rZXkgPSBsaW5rX2tleTsKKyAgICBtc2ctPnNlc3Npb24gPSBzZXNzaW9uOworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfT01PTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnLT5vc19tc2csIDApOworICAgIEJVR19PTihyYyk7CisKKworICAgIHJldHVybiByYzsKK30KKy8qIG9tb25fY21kX3JlYWRfcnNzaV9yZXN1bHQgKi8KKworc3RhdGljCitiY21vc19lcnJubyBvbW9uX2NtZF9sbGlkX3NjYW4oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBvbW9uX2xpbmtfa2V5IGxpbmtfa2V5OworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbWNsaV9jbWRfcGFybSAqZXBvbl9uaTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmVwb25fbGxpZDsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmVwb25fbW9kZTsKKyAgICBvbW9uX3Rhc2tfbXNnICptc2c7CisKKyAgICAvKiBHZXQgdGhlIENMSSBwYXJhbWV0ZXJzLiAqLworICAgIGVwb25fbmkgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgZXBvbl9tb2RlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2Nhbl9tb2RlIik7CisgICAgZXBvbl9sbGlkID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9sbGlkIik7CisKKyAgICBsaW5rX2tleS5kZXZpY2VfaWQgPSBjdXJyZW50X2RldmljZTsKKyAgICBsaW5rX2tleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKWVwb25fbmktPnZhbHVlLm51bWJlcjsKKworICAgIC8qIFNlbmQgYW4gaW5kaWNhdGlvbiB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgdG8gYmUKKyAgICAgICBwcm9jZXNzZWQuICovCisgICAgbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBtc2ctPm9zX21zZy50eXBlID0gQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JPR1VFX1NDQU47CisgICAgbXNnLT5vc19tc2cuaGFuZGxlciA9IG9tb25fb3NfbXNnX2hhbmRsZTsKKyAgICBtc2ctPmxpbmtfa2V5ID0gbGlua19rZXk7CisgICAgbXNnLT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBtc2ctPmxsaWQgPSBlcG9uX2xsaWQtPnZhbHVlLm51bWJlcjsKKyAgICBtc2ctPnNjYW5fbW9kZSA9IGVwb25fbW9kZS0+dmFsdWUubnVtYmVyOworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfT01PTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnLT5vc19tc2csIDApOworICAgIEJVR19PTihyYyk7CisKKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIFxicmllZiBJbnN0YWxsIENMSSBjb21tYW5kcworICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbmQgb3B0aWNhbCBtb25pdG9yaW5nIGNvbW1hbmQgZGlyZWN0b3kgIm9tb24iIGFuZAorICogaW5zdGFsbHMgb3B0aWNhbCBtb25pdG9yaW5nIENMSSBjb21tYW5kcyB0byB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiBccGFyYW0gdG9wX2RpciBQYXJlbnQgb2YgIm9tb24iIGRpcmVjdG9yeQorICoKKyAqIFxyZXR1cm4KKyAqIEJDTV9FUlJfT0sgaWYgc3VjY2Vzc2Z1bCwgZXJyb3IgY29kZSBpZiBub3QKKyAqLwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb21vbl9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmRpcl9uYW1lID0gIm9tb24iOworCisgICAgaWYgKGJjbWNsaV9kaXJfZmluZCh0b3BfZGlyLCBkaXJfbmFtZSkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYmNtY2xpX2VudHJ5ICpkaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVBPTiBvcHRpY2FsIG1vbml0b3JpbmcgY29tbWFuZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCk7CisgICAgQlVHX09OKGRpciA9PSBOVUxMKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJyeF9wb3dlciIsICJJc3N1ZSBSWCBQb3dlciBNZWFzdXJlbWVudCIsIG9tb25fY21kX3J4X3Bvd2VyLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImdyYW50ZWRfbGluayIsICJMaW5rIG1hYyBhZGRyZXNzLCAwMDAwMDAwMDAwMDAgZm9yIElkbGUgUG93ZXIiLCBCQ01DTElfUEFSTV9NQUMsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgidHJpZ2dlcl93aWR0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSU1NJIFRyaWdnZXIgV2lkdGggKFR3KSBpbiBucywgRGVzaXJlZCB3aWR0aCBvZiBSU1NJIFRyaWdnZXIgYmFzZWQgb24gdGhlIE9wdGljYWwgTW9kdWxlIFNwZWNpZmljYXRpb25zLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIHVzZWQgZm9yIGFsbCBSWCBQb3dlciBtZWFzdXJlbWVudHMgKCBpbmNsdWRpbmcgSWRsZSBwb3dlcikgYW5kIG11c3Qgbm90IGJlIDAuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90ZTogVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBkZXZpY2UgaXMgMSBUUSAoMTZucykgdGhlIGlucHV0IHdpbGwgYmUgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBUUS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInRyaWdnZXJfZGVsYXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUlNTSSBUcmlnZ2VyIERlbGF5IChUZCkgaW4gbnMsIERlc2lyZWQgZGVsYXkgdG8gbWVldCB0aGUgdHJpZ2dlciBkZWxheSB0aW1pbmcgcmVxdWlyZW1lbnQgb2YgdGhlIE9wdGljYWwgTW9kdWxlIFNwZWNpZmljYXRpb25zLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByc3NpIHRyaWdnZXIgZGVsYXkgaXMgbWVhc3VyZWQgZnJvbSB0aGUgc3RhcnQgb2Ygc3luY190aW1lIGFuZCBpcyBhZGp1c3RlZCBhcyBuZWVkZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB0cmlnZ2VyIGRlbGF5IG1vdmVzIHRoZSBhc3NlcnRpb24gb2YgdGhlIFJTU0kgVHJpZ2dlciBzdHJvYmUgaW50byB0aGUgZ3JhbnQgd2luZG93LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdGU6IFRoZSBncmFudWxhcml0eSBvZiB0aGUgZGV2aWNlIGlzIDEgVFEgKDE2bnMpIHRoZSBpbnB1dCB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgVFEuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJzYW1wbGVfcGVyaW9kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUaTJjKSBTYW1wbGUgcGVyaW9kIGluIHVTLCBpbnRlcm5hbCBJMkMgaG9sZC9wcm9oaWJpdCB0aW1lIHdoZXJlIGFjY2VzcyB0byBkZXZpY2UgaXMgbm90IGFsbG93ZWQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVyaW5nIHRoaXMgcGVyaW9kIHRoZSBpbnRlcm5hbCBSU1NJIGRhdGEgaXMgaW52YWxpZCBhbmQgSTJDIG9wZXJ0aW9ucyBvbiB0aGlzIGRldmljZSBtdXN0IG5vdCBiZSBleGVjdXRlZC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIHZhbHVlIG9mIDUwMHVTIGlzIHJlY29tbWVuZGVkIGZvciBtb3N0IGFwcGxpY2F0aW9ucy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgInRyeF9kYXRhIiwgIlJlYWQgVHJhbmNlaXZlciBEYXRhIiwgb21vbl9jbWRfdHJ4X2RhdGEsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJyZWFkX3Jzc2kiLCAiUmVhZCBSU1NJIFJlc3VsdCBmcm9tIFRyYW5jZWl2ZXIiLCBvbW9uX2NtZF9yZWFkX3Jzc2lfcmVzdWx0LAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAibGxpZF9zY2FuIiwgIlJ1biBSb2d1ZSBPTlUgTExJRCBTY2FuIiwgb21vbl9jbWRfbGxpZF9zY2FuLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInNjYW5fbW9kZSIsICJMTElEIHNjYW4gbW9kZSAxIGZvciBmdWxsIHBvbiBzY2FuLCAwIGZvciB0YXJnZXRlZCAobGxpZCByZXF1aXJlZCBmb3IgdGFyZ2V0ZWQpIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbGxpZCIsICJFUE9OIGxsaWQgdG8gc2NhbiB3aGVuIG1vZGU9MCIsIEJDTUNMSV9QQVJNX0hFWCwgMCkpOworfQorLyogYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29tb25fY2xpX2luaXQgKi8KKworCisvKiBFbmQgb2YgZmlsZSBvbW9uLmMgKi8KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL29tb24uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvb21vbi9vbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzMWI3YQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvb21vbi9vbW9uLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9PTU9OX0hfCisjZGVmaW5lIF9PTU9OX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb2x0X3V0aWxzLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKworCisKKy8qKgorICogXGJyaWVmIFN0YXJ0IHRoZSBvcHRpY2FsIG1vbml0b3JpbmcgdGFzaworICoKKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSB1c2VyIGxldmVsIG9wdGljYWwgbW9uaXRvcmluZyB0YXNrIGFuZCBjcmVhdGVzIHRoZQorICogb3B0aWNhbCBtb25pdG9yaW5nIG1vZHVsZS4gIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIGF0IHN0YXJ0IHVwLgorICoKKyAqIFxyZXR1cm4KKyAqIE5vbmUKKyAqLworZXh0ZXJuCit2b2lkIGJjbW9sdF9lcG9uX29tb25fYXBwbF9pbml0ICh2b2lkKTsKKworCisvKioKKyAqIFxicmllZiBJbnN0YWxsIENMSSBjb21tYW5kcworICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbmQgb3B0aWNhbCBtb25pdG9yaW5nIGNvbW1hbmQgZGlyZWN0b3kgIm9tb24iIGFuZAorICogaW5zdGFsbHMgb3B0aWNhbCBtb25pdG9yaW5nIENMSSBjb21tYW5kcyB0byB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiBccGFyYW0gdG9wX2RpciBQYXJlbnQgb2YgIm9tb24iIGRpcmVjdG9yeQorICovCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29tb25fY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX29tb25faGFuZGxlX2luZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCB1aW50OF90IGluc3RhbmNlLCBiY21vbHRfYXV0byAqaW5kKTsKKworCisjZW5kaWYgLyogRW5kIG9mIGZpbGUgb21vbi5oICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3BsYXliYWNrL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc0MDI4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKyAgICBNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfcGxheWJhY2sKKyAgICBNT0RfVFlQRSA9IGxpYgorICAgIE1PRF9ERVBTID0gdXRpbHMgZGV2X2xvZyBjb21tb25fYXBpIHRyYW5zcG9ydAorICAgIHNyY3MgPSBiY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmMKKyAgICBpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKwlNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisgICAgZW5kaWYKKworICAgIFVTRV9MSU5UPXllcworZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9iY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3BsYXliYWNrL2JjbW9sdF91c2VyX2FwcGxfcGxheWJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2I0NjNiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9iY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmMKQEAgLTAsMCArMSwxNTczIEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21fZGV2X2xvZy5oIgorI2luY2x1ZGUgImJjbW9sdF9hcGkuaCIKKyNpbmNsdWRlICJiY21fYXBpX2NsaV9oZWxwZXJzLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtdHJfZGVidWcuaCIKKyNpbmNsdWRlICJiY210cl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmgiCisjaW5jbHVkZSAiYmNtb2x0X2JpdF91dGlscy5oIgorCisvKiAnTVBCeCcgaW4gQVNDSUkgKE0pYXBsZSAoUClsYXkoYilhY2sgdmVyc2lvbiB4ICovCisjZGVmaW5lIFZFUlNJT04wICAgIDB4NGQ1MDQyMzAKKyNkZWZpbmUgVkVSU0lPTjEgICAgMHg0ZDUwNDIzMQorCitzdGF0aWMgY29uc3QgdWludDMyX3QgQ0hVTktfU0laRSA9IDIwMDA7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjYXBfbG9jX3N0cltCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fX05VTV9PRl0gPQoreworICAgICJkZXZpY2UiLAorICAgICJob3N0IgorfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKK30gcGxheWJhY2tfY29udGV4dDsKKworc3RhdGljIHBsYXliYWNrX2NvbnRleHQgcGJfY3R4dFtCQ01UUl9NQVhfT0xUU107CisKK3R5cGVkZWYgZW51bQoreworICAgIFBCX0ZPUk1BVF9BUElfQ0xJLAorICAgIFBCX0ZPUk1BVF9DX0FQSSwKKworICAgIFBCX0ZPUk1BVF9fQ09VTlQKK30gcGJfZm9ybWF0OworCit0eXBlZGVmIGVudW0KK3sKKyAgICBQQl9DTElfRVhUUkFfTk9ORSwKKyAgICBQQl9DTElfRVhUUkFfTVVMVEksCisgICAgUEJfQ0xJX0VYVFJBX1NUQVQsCisgICAgUEJfQ0xJX0VYVFJBX1NVQkdST1VQCit9IHBiX2NsaV9leHRyYTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgUEJfRklFTERTX05PTkUsCisgICAgUEJfRklFTERTX0dFVCwKKyAgICBQQl9GSUVMRFNfTVVMVEksCisgICAgUEJfRklFTERTX1NFVAorfSBwYl9maWVsZHM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgdmVyc2lvbjsKKyAgICBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gbG9jYXRpb247CisgICAgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gZndfdmVyOworICAgIGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gaG9zdF92ZXI7CisgICAgdWludDMyX3QgYnVmX3NpemU7CisgICAgdm9pZCAqY2FwdHVyZV9idWZmZXI7Cit9IGJjbW9sdF9wbGF5YmFjazsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICBiY210cl9jYXB0dXJlX2VudHJ5IGhkcjsKKyAgICB1aW50OF90ICptc2dfc3RhcnQ7Cit9IHBsYXliYWNrX2l0ZXJhdG9yX3JhdzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBwbGF5YmFja19pdGVyYXRvcl9yYXcgcmF3OworICAgIGJjbW9sdF9idWYgbXNnX2J1ZjsKKyAgICBiY21vbHRfbXNnICptc2c7CisgICAgYmNtb3NfZXJybm8gZXJyOworfSBwbGF5YmFja19pdGVyYXRvcjsKKworI2RlZmluZSBGT1JfRUFDSF9DQVBUVVJFX0VOVFJZKGl0LCBidWZmZXIsIHNpemUpIFwKKyAgICBiY21vbHRfYnVmX2luaXQoJihpdCkuYnVmLCBzaXplLCBidWZmZXIsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsgXAorICAgIHdoaWxlIChiY210cl9jYXB0dXJlX2VudHJ5X2dldF9uZXh0KCYoaXQpLmJ1ZiwgJihpdCkuaGRyLCAmKGl0KS5tc2dfc3RhcnQpKQorCisjZGVmaW5lIEZPUl9FQUNIX1BMQVlCQUNLX01TRyhpdCwgYnVmZmVyLCBzaXplKSBcCisgICAgYmNtb2x0X2J1Zl9pbml0KCYoaXQpLnJhdy5idWYsIHNpemUsIGJ1ZmZlciwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOyBcCisgICAgKGl0KS5tc2cgPSBOVUxMOyBcCisgICAgd2hpbGUgKHBsYXliYWNrX25leHRfZW50cnlfdW5wYWNrZWQoJihpdCkpKQorCisjZGVmaW5lIERFVklDRV9SRUYgImRldmljZV9pZCIKKyNkZWZpbmUgUkNfUkVGICJyYyIKKyNkZWZpbmUgVkFMX1JFRiAidmFsIgorI2RlZmluZSBNU0dfUkVGICJtc2ciCisjZGVmaW5lIEtFWV9SRUYgImtleSIKKyNkZWZpbmUgTElTVF9NRU1fUkVGICJsaXN0X21lbSIKKyNkZWZpbmUgTVNHX1NFVF9SRUYgIm1zZ19zZXQiCisjZGVmaW5lIE1BWF9NU0dTX1JFRiAibWF4X21zZ3MiCisjZGVmaW5lIElOVkVSVF9GSUxURVJfUkVGICJpbnZlcnRfZmlsdGVyIgorI2RlZmluZSBTVEFUX0ZMQUdTX1JFRiAic3RhdF9mbGFncyIKKyNkZWZpbmUgRFlOX0xJU1RfU0laRSAiQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSIKKworc3RhdGljIHZvaWQgcGxheWJhY2tfaXRlcmF0b3JfY2xlYW51cChwbGF5YmFja19pdGVyYXRvciAqaXQpCit7CisgICAgaWYgKChpdC0+ZXJyID09IEJDTV9FUlJfT0spICYmIChpdC0+bXNnICE9IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKGl0LT5tc2cpOworICAgICAgICBpdC0+bXNnID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19ib29sIHBsYXliYWNrX25leHRfZW50cnlfdW5wYWNrZWQocGxheWJhY2tfaXRlcmF0b3IgKml0KQoreworICAgIHBsYXliYWNrX2l0ZXJhdG9yX2NsZWFudXAoaXQpOworICAgIGJjbW9zX2Jvb2wgcmV0ID0gYmNtdHJfY2FwdHVyZV9lbnRyeV9nZXRfbmV4dCgmaXQtPnJhdy5idWYsICZpdC0+cmF3LmhkciwgJml0LT5yYXcubXNnX3N0YXJ0KTsKKyAgICBpZiAocmV0KQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1Zl9pbml0KCZpdC0+bXNnX2J1ZiwgaXQtPnJhdy5oZHIubXNnX3NpemUsIGl0LT5yYXcubXNnX3N0YXJ0LCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgICAgIGl0LT5lcnIgPSBiY21vbHRfbXNnX3VucGFjaygmaXQtPm1zZ19idWYsICZpdC0+bXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX3JlYWRfYmxvY2sodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplLCB1aW50OF90ICpidWYpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZWJ1Z19jZmcgZGVidWdfY2ZnOworICAgIGJjbW9sdF9kZWJ1Z19rZXkgZGVidWdfa2V5ID0geyB9OworICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyIHJlYWRlciA9IHsgLm9mZnNldCA9IG9mZnNldCwgLnNpemUgPSBzaXplIH07CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmRlYnVnX2NmZywgZGVidWcsIGRlYnVnX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmZGVidWdfY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQsIHJlYWRlcik7CisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoY3VycmVudF9kZXZpY2UsICZkZWJ1Z19jZmcuaGRyKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJGYWlsZWQgdG8gdXBkYXRlIHJlYWRlciAoJXUsICV1KSFcbiIsIG9mZnNldCwgc2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmZGVidWdfY2ZnLCBkZWJ1ZywgZGVidWdfa2V5KTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZGVidWdfY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyKTsKKyAgICAgICAgZGVidWdfY2ZnLmRhdGEuYXBpX2NhcHR1cmVfYnVmZmVyLnZhbCA9IGJ1ZjsKKyAgICAgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoY3VycmVudF9kZXZpY2UsICZkZWJ1Z19jZmcuaGRyKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJGYWlsZWQgdG8gcmV0cmlldmUgY2FwdHVyZSBidWZmZXIgY2h1bmsgKCV1LCAldSkhXG4iLAorICAgICAgICAgICAgICAgIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfcmVhZCh2b2lkICoqYnVmZmVyLCB1aW50MzJfdCAqbGVuZ3RoLCBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gKmNhcHR1cmVfbG9jYXRpb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZWJ1Z19jZmcgZGVidWdfY2ZnOworICAgIGJjbW9sdF9kZWJ1Z19rZXkgZGVidWdfa2V5ID0geyB9OworCisgICAgaWYgKChidWZmZXIgPT0gTlVMTCkgfHwgKGxlbmd0aCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgImJ1ZmZlciAoJXApIGFuZCBsZW5ndGggKCVwKSBjYW5ub3QgYmUgTlVMTFxuIiwgYnVmZmVyLCBsZW5ndGgpOworICAgIH0KKworICAgIEJDTU9MVF9DRkdfSU5JVCgmZGVidWdfY2ZnLCBkZWJ1ZywgZGVidWdfa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZkZWJ1Z19jZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9zdGF0cyk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZGVidWdfY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnKTsKKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChjdXJyZW50X2RldmljZSwgJmRlYnVnX2NmZy5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIkZhaWxlZCB0byByZXRyaWV2ZSBjYXB0dXJlIHN0YXRzIVxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZvaWQgKmNhcHR1cmVfYnVmZmVyOworICAgICAgICB1aW50MzJfdCBidWZfc2l6ZSA9IGRlYnVnX2NmZy5kYXRhLmFwaV9jYXB0dXJlX3N0YXRzLnJlYWRhYmxlX2J5dGVzOworICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworCisgICAgICAgICpjYXB0dXJlX2xvY2F0aW9uID0gZGVidWdfY2ZnLmRhdGEuYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uOworCisgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlJldHJpZXZpbmcgJXUgYnl0ZSBidWZmZXJcbiIsIGJ1Zl9zaXplKTsKKyAgICAgICAgY2FwdHVyZV9idWZmZXIgPSBiY21vc19hbGxvYyhidWZfc2l6ZSk7CisgICAgICAgIGlmIChOVUxMICE9IGNhcHR1cmVfYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoKG9mZnNldCArIENIVU5LX1NJWkUpIDwgYnVmX3NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLCAiUmVhZGluZyBieXRlcyAldSAtICV1XG4iLCBvZmZzZXQsIG9mZnNldCArIENIVU5LX1NJWkUpOworICAgICAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX3JlYWRfYmxvY2sob2Zmc2V0LCBDSFVOS19TSVpFLCAodWludDhfdCopY2FwdHVyZV9idWZmZXIgKyBvZmZzZXQpOworICAgICAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gQ0hVTktfU0laRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgPT0gZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlJlYWRpbmcgYnl0ZXMgJXUgLSAldVxuIiwgb2Zmc2V0LCBidWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfcmVhZF9ibG9jayhvZmZzZXQsIGJ1Zl9zaXplIC0gb2Zmc2V0LCAodWludDhfdCopY2FwdHVyZV9idWZmZXIgKyBvZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKmJ1ZmZlciA9IGNhcHR1cmVfYnVmZmVyOworICAgICAgICAqbGVuZ3RoID0gYnVmX3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2R1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIHZvaWQgKmNhcHR1cmVfYnVmLCB1aW50MzJfdCBidWZfc2l6ZSkKK3sKKyAgICBwbGF5YmFja19pdGVyYXRvciBpdDsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgRk9SX0VBQ0hfUExBWUJBQ0tfTVNHKGl0LCBjYXB0dXJlX2J1ZiwgYnVmX3NpemUpCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJEdW1waW5nIG1lc3NhZ2UgYXQgJXUgb2YgJXUgKCV1KVxuIiwKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX2dldF91c2VkKCZpdC5yYXcuYnVmKSwgYnVmX3NpemUsIGl0LnJhdy5oZHIubXNnX3NpemUpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXG4lMDh4ICV1OlxuIiwgaXQucmF3Lmhkci50aW1lc3RhbXAsIGl0LnJhdy5oZHIuZXZlbnQpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyA9PSBpdC5lcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCBpdC5tc2cpOworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLCAiRHVtcCBzdGF0dXM6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlVucGFja2luZyBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgIGlmICgoaXQucmF3Lm1zZ19zdGFydCArIGl0LnJhdy5oZHIubXNnX3NpemUpID4gKGl0LnJhdy5idWYuc3RhcnQgKyBpdC5yYXcuYnVmLmxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIk1lc3NhZ2UgbGVuZ3RoIGlzIGluc2FuZSFcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX2hleGR1bXAoc2Vzc2lvbiwgaXQucmF3Lm1zZ19zdGFydCwgMCwgaXQucmF3Lmhkci5tc2dfc2l6ZSwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBwbGF5YmFja19zaG91bGRfc2VuZChiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gY2FwdHVyZV9sb2NhdGlvbiwgYmNtdHJfY2xkX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSkKK3sKKyAgICBzd2l0Y2ggKGNhcHR1cmVfbG9jYXRpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9ERVZJQ0U6CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50X3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01UUl9DTERfRVZfUkVDVjoKKyAgICAgICAgICAgICAgICBjYXNlIEJDTVRSX0NMRF9FVl9SRUNWX0RJU0NBUkQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fSE9TVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnRfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTVRSX0NMRF9FVl9TRU5EOgorICAgICAgICAgICAgICAgIGNhc2UgQkNNVFJfQ0xEX0VWX1JFU0VORDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLypsaW50IC1lezQyOX0gKi8KK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19yZXBsYXkoCisgICAgYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICB2b2lkICpjYXB0dXJlX2J1ZiwKKyAgICB1aW50MzJfdCBidWZfc2l6ZSwKKyAgICBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gbG9jYXRpb24sCisgICAgYmNtb3NfYm9vbCBrZWVwX3RpbWUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBwbGF5YmFja19pdGVyYXRvcl9yYXcgaXQ7CisgICAgdWludDMyX3QgbGFzdF90aW1lX3VzID0gMDsKKyAgICBiY21vc19ib29sIGZpcnN0ID0gQkNNT1NfVFJVRTsKKworICAgIEZPUl9FQUNIX0NBUFRVUkVfRU5UUlkoaXQsIGNhcHR1cmVfYnVmLCBidWZfc2l6ZSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWYgbXNnX2J1ZjsKKyAgICAgICAgYmNtb2x0X21zZyAqbXNnID0gTlVMTDsKKworICAgICAgICBCQ01fTE9HKERFQlVHLCBwYl9jdHh0W2RldmljZV0ubG9nX2lkLCAiUHJvY2Vzc2luZyBtZXNzYWdlICgldSwldSwldSlcbiIsCisgICAgICAgICAgICAgICAgaXQuaGRyLmV2ZW50LCBpdC5oZHIudGltZXN0YW1wLCBpdC5oZHIubXNnX3NpemUpOworICAgICAgICBpZiAocGxheWJhY2tfc2hvdWxkX3NlbmQobG9jYXRpb24sIChiY210cl9jbGRfZXZlbnRfdHlwZSlpdC5oZHIuZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoa2VlcF90aW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBhcHByb3hpbWF0ZSBvcmlnaW5hbCB0aW1pbmc7IGRvZXNuJ3QgYWNjb3VudCBmb3IgcHJvY2Vzc2luZyB0aW1lIGluIHRoaXMgY29kZSAtIHRoaXMgY291bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgcGJfY3R4dFtkZXZpY2VdLmxvZ19pZCwgIlNsZWVwaW5nIGZvciAldSB1c1xuIiwgaXQuaGRyLnRpbWVzdGFtcCAtIGxhc3RfdGltZV91cyk7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3VzbGVlcChpdC5oZHIudGltZXN0YW1wIC0gbGFzdF90aW1lX3VzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdF90aW1lX3VzID0gaXQuaGRyLnRpbWVzdGFtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbZGV2aWNlXS5sb2dfaWQsICJVbnBhY2tpbmcgbWVzc2FnZVxuIik7CisgICAgICAgICAgICBiY21vbHRfYnVmX2luaXQoJm1zZ19idWYsIGl0Lmhkci5tc2dfc2l6ZSwgaXQubXNnX3N0YXJ0LCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgICAgICAgICBlcnIgPSBiY21vbHRfbXNnX3VucGFjaygmbXNnX2J1ZiwgJm1zZyk7CisgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyA9PSBlcnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgcGJfY3R4dFtkZXZpY2VdLmxvZ19pZCwgIlNlbmRpbmcgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgICAgZXJyID0gYmNtdHJfc2VuZChkZXZpY2UsIG1zZywgQkNNVFJfU0VORF9GTEFHU19OT05FKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKKyAgICAgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIHBiX2N0eHRbZGV2aWNlXS5sb2dfaWQsICJTZW5kaW5nIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIHBiX2N0eHRbZGV2aWNlXS5sb2dfaWQsICJVbnBhY2tpbmcgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jbGlfZHVtcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgdm9pZCAqY2FwdHVyZV9idWZmZXI7CisgICAgdWludDMyX3QgYnVmX3NpemU7CisgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIGxvY2F0aW9uOworCisgICAgZXJyID0gcGxheWJhY2tfcmVhZCgmY2FwdHVyZV9idWZmZXIsICZidWZfc2l6ZSwgJmxvY2F0aW9uKTsKKworICAgIGlmIChCQ01fRVJSX09LID09IGVycikKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiQ2FwdHVyZSBmcm9tICVzOlxuIiwgY2FwX2xvY19zdHJbbG9jYXRpb25dKTsKKyAgICAgICAgcGxheWJhY2tfZHVtcChzZXNzaW9uLCBjYXB0dXJlX2J1ZmZlciwgYnVmX3NpemUpOworICAgIH0KKworICAgIGJjbW9zX2ZyZWUoY2FwdHVyZV9idWZmZXIpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcGxheWJhY2tfZndfdmVyc2lvbl9nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKmZ3KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX2NmZyBkZXZfY2ZnOworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGRldl9rZXkgPSB7IH07CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmRldl9jZmcsIGRldmljZSwgZGV2X2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZGV2X2NmZywgZGV2aWNlLCBmaXJtd2FyZV9zd192ZXJzaW9uKTsKKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2UsICZkZXZfY2ZnLmhkcik7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBwYl9jdHh0W2RldmljZV0ubG9nX2lkLCAiRmFpbGVkIHRvIHJldHJpZXZlIGZ3IHZlcnNpb24hXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmZ3ID0gZGV2X2NmZy5kYXRhLmZpcm13YXJlX3N3X3ZlcnNpb247CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwbGF5YmFja19ob3N0X3ZlcnNpb25fZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gKmhvc3QpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGRldl9jZmc7CisgICAgYmNtb2x0X2RldmljZV9rZXkgZGV2X2tleSA9IHsgfTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmZGV2X2NmZywgZGV2aWNlLCBkZXZfa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZkZXZfY2ZnLCBkZXZpY2UsIGhvc3Rfc3dfdmVyc2lvbik7CisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmZGV2X2NmZy5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIEJDTV9MT0coV0FSTklORywgcGJfY3R4dFtkZXZpY2VdLmxvZ19pZCwgIkZhaWxlZCB0byByZXRyaWV2ZSBob3N0IHZlcnNpb24hXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmhvc3QgPSBkZXZfY2ZnLmRhdGEuaG9zdF9zd192ZXJzaW9uOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2NsaV9zYXZlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZSIpLT52YWx1ZS5zdHJpbmc7CisgICAgYmNtb2x0X3BsYXliYWNrIG1wYiA9IHt9OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBGSUxFICpmaWxlOworICAgIHVpbnQzMl90IHRlbXA7CisKKyAgICBlcnIgPSBwbGF5YmFja19yZWFkKCZtcGIuY2FwdHVyZV9idWZmZXIsICZtcGIuYnVmX3NpemUsICZtcGIubG9jYXRpb24pOworCisgICAgaWYgKEJDTV9FUlJfT0sgPT0gZXJyKQorICAgIHsKKyAgICAgICAgcGxheWJhY2tfZndfdmVyc2lvbl9nZXQoY3VycmVudF9kZXZpY2UsICZtcGIuZndfdmVyKTsKKyAgICAgICAgcGxheWJhY2tfaG9zdF92ZXJzaW9uX2dldChjdXJyZW50X2RldmljZSwgJm1wYi5ob3N0X3Zlcik7CisKKyAgICAgICAgZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKKyAgICAgICAgLyogd3JpdGUgZmlsZSB2ZXJzaW9uICovCisgICAgICAgIHRlbXAgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgVkVSU0lPTjEpOworICAgICAgICBmd3JpdGUoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAvKiB3cml0ZSBjYXB0dXJlIGxvY2F0aW9uICovCisgICAgICAgIHRlbXAgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgKHVpbnQzMl90KW1wYi5sb2NhdGlvbik7CisgICAgICAgIGZ3cml0ZSgmdGVtcCwgc2l6ZW9mKHVpbnQzMl90KSwgMSwgZmlsZSk7CisgICAgICAgIC8qIHdyaXRlIGZpcm13YXJlIHZlcnNpb24gKi8KKyAgICAgICAgZndyaXRlKCZtcGIuZndfdmVyLm1ham9yLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUoJm1wYi5md192ZXIubWlub3IsIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZSgmbXBiLmZ3X3Zlci5yZXZpc2lvbiwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgdGVtcCA9IEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoVTMyLCBtcGIuZndfdmVyLm1vZGVsKTsKKyAgICAgICAgZndyaXRlKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICAgICAgZndyaXRlKG1wYi5md192ZXIuYnVpbGRfdGltZSwgc2l6ZW9mKG1wYi5md192ZXIuYnVpbGRfdGltZSksIDEsIGZpbGUpOworICAgICAgICAvKiB3cml0ZSBob3N0IHZlcnNpb24gKi8KKyAgICAgICAgZndyaXRlKCZtcGIuaG9zdF92ZXIubWFqb3IsIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZSgmbXBiLmhvc3RfdmVyLm1pbm9yLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUoJm1wYi5ob3N0X3Zlci5yZXZpc2lvbiwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgdGVtcCA9IEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoVTMyLCBtcGIuaG9zdF92ZXIubW9kZWwpOworICAgICAgICBmd3JpdGUoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUobXBiLmhvc3RfdmVyLmJ1aWxkX3RpbWUsIHNpemVvZihtcGIuaG9zdF92ZXIuYnVpbGRfdGltZSksIDEsIGZpbGUpOworICAgICAgICAvKiB3cml0ZSBjYXB0dXJlIGJ1ZmZlciAqLworICAgICAgICB0ZW1wID0gQkNNT0xUX0JVRl9FTkRJQU5fQ1BVX1RPX0JVRihVMzIsIG1wYi5idWZfc2l6ZSk7CisgICAgICAgIGZ3cml0ZSgmdGVtcCwgc2l6ZW9mKHVpbnQzMl90KSwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZShtcGIuY2FwdHVyZV9idWZmZXIsIG1wYi5idWZfc2l6ZSwgMSwgZmlsZSk7CisgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKG1wYi5jYXB0dXJlX2J1ZmZlcik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBwbGF5YmFja192ZXJzaW9uX21hdGNoKGNvbnN0IGJjbW9sdF9wbGF5YmFjayAqbXBiKQoreworICAgIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIGZ3X2N1cnIgPSB7fTsKKyAgICBiY21vbHRfaG9zdF9zd192ZXJzaW9uIGhvc3RfY3VyciA9IHt9OworCisgICAgcGxheWJhY2tfZndfdmVyc2lvbl9nZXQoY3VycmVudF9kZXZpY2UsICZmd19jdXJyKTsKKyAgICBwbGF5YmFja19ob3N0X3ZlcnNpb25fZ2V0KGN1cnJlbnRfZGV2aWNlLCAmaG9zdF9jdXJyKTsKKworICAgIGlmICgobXBiLT5md192ZXIubW9kZWwgIT0gZndfY3Vyci5tb2RlbCkgfHwgKG1wYi0+aG9zdF92ZXIubW9kZWwgIT0gaG9zdF9jdXJyLm1vZGVsKSB8fAorICAgICAgICAoZndfY3Vyci5tb2RlbCA9PSAwKSB8fCAoaG9zdF9jdXJyLm1vZGVsID09IDApKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsCisgICAgICAgICAgICAgICAgIlBvc3NpYmxlIHZlcnNpb24gbWlzbWF0Y2g6IENhcHR1cmUgRlcgJXUsIEhPU1QgJXU7IEN1cnJlbnQgRlcgJXUsIEhPU1QgJXVcbiIsCisgICAgICAgICAgICAgICAgbXBiLT5md192ZXIubW9kZWwsIG1wYi0+aG9zdF92ZXIubW9kZWwsIGZ3X2N1cnIubW9kZWwsIGhvc3RfY3Vyci5tb2RlbCk7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2ZpbGVfb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgYmNtb2x0X3BsYXliYWNrICptcGIpCit7CisgICAgRklMRSAqZmlsZTsKKyAgICB1aW50MzJfdCB0ZW1wOworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgaXRlbXNfcmVhZDsKKworICAgIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7CisgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKworICAgIG1wYi0+dmVyc2lvbiA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCB0ZW1wKTsKKyAgICBzd2l0Y2ggKG1wYi0+dmVyc2lvbikKKyAgICB7CisgICAgICAgIGNhc2UgVkVSU0lPTjA6CisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHRlbXAgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgdGVtcCk7CisgICAgICAgICAgICBtcGItPmxvY2F0aW9uID0gKGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbil0ZW1wOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtcGItPmJ1Zl9zaXplID0gQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShVMzIsIHRlbXApOworICAgICAgICAgICAgbXBiLT5jYXB0dXJlX2J1ZmZlciA9IGJjbW9zX2FsbG9jKG1wYi0+YnVmX3NpemUpOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKG1wYi0+Y2FwdHVyZV9idWZmZXIsIG1wYi0+YnVmX3NpemUsIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZFUlNJT04xOgorICAgICAgICAgICAgLyogcmVhZCBjYXB0dXJlIGxvY2F0aW9uICovCisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHRlbXAgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgdGVtcCk7CisgICAgICAgICAgICBtcGItPmxvY2F0aW9uID0gKGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbil0ZW1wOworICAgICAgICAgICAgLyogcmVhZCBmaXJtd2FyZSB2ZXJzaW9uICovCisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJm1wYi0+ZndfdmVyLm1ham9yLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZCgmbXBiLT5md192ZXIubWlub3IsIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZtcGItPmZ3X3Zlci5yZXZpc2lvbiwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG1wYi0+ZndfdmVyLm1vZGVsID0gQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShVMzIsIHRlbXApOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKG1wYi0+ZndfdmVyLmJ1aWxkX3RpbWUsIHNpemVvZihtcGItPmZ3X3Zlci5idWlsZF90aW1lKSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyogcmVhZCBob3N0IHZlcnNpb24gKi8KKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZCgmbXBiLT5ob3N0X3Zlci5tYWpvciwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJm1wYi0+aG9zdF92ZXIubWlub3IsIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZtcGItPmhvc3RfdmVyLnJldmlzaW9uLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZCgmdGVtcCwgc2l6ZW9mKHVpbnQzMl90KSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbXBiLT5ob3N0X3Zlci5tb2RlbCA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCB0ZW1wKTsKKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZChtcGItPmhvc3RfdmVyLmJ1aWxkX3RpbWUsIHNpemVvZihtcGItPmhvc3RfdmVyLmJ1aWxkX3RpbWUpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiByZWFkIGNhcHR1cmUgYnVmZmVyICovCisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG1wYi0+YnVmX3NpemUgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgdGVtcCk7CisgICAgICAgICAgICBtcGItPmNhcHR1cmVfYnVmZmVyID0gYmNtb3NfYWxsb2MobXBiLT5idWZfc2l6ZSk7CisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQobXBiLT5jYXB0dXJlX2J1ZmZlciwgbXBiLT5idWZfc2l6ZSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJVbmtub3duIHZlcnNpb246ICV1XG4iLCBtcGItPnZlcnNpb24pOworICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZjbG9zZShmaWxlKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jbGlfcmVwbGF5KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZSIpLT52YWx1ZS5zdHJpbmc7CisgICAgYmNtb3NfYm9vbCBpZ25vcmVfdmVyID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wbGF5YmFjayBtcGIgPSB7fTsKKworICAgIGJjbWNsaV9jbWRfcGFybSAqaXZfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImlnbm9yZV92ZXJzaW9uIik7CisgICAgaWYgKGl2X3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlnbm9yZV92ZXIgPSBpdl9wYXJtLT52YWx1ZS5lbnVtX3ZhbCA9PSAobG9uZylCQ01PU19UUlVFOworICAgIH0KKworICAgIGVyciA9IHBsYXliYWNrX2ZpbGVfb3BlbihmaWxlbmFtZSwgJm1wYik7CisKKyAgICBpZiAoQkNNX0VSUl9PSyA9PSBlcnIpCisgICAgeworICAgICAgICBpZiAocGxheWJhY2tfdmVyc2lvbl9tYXRjaCgmbXBiKSB8fCBpZ25vcmVfdmVyKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19yZXBsYXkoY3VycmVudF9kZXZpY2UsIG1wYi5jYXB0dXJlX2J1ZmZlciwgbXBiLmJ1Zl9zaXplLCBtcGIubG9jYXRpb24sIEJDTU9TX1RSVUUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJQb3NzaWJsZSB2ZXJzaW9uIG1pc21hdGNoOyB1c2UgaWdub3JlX3ZlcnNpb249eWVzIHRvIGZvcmNlIHBsYXliYWNrXG4iKTsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfSU1BR0VfVFlQRTsKKyAgICAgICAgfQorICAgICAgICBiY21vc19mcmVlKG1wYi5jYXB0dXJlX2J1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2FwaV9jbGlfYXBwZW5kX3Byb3AoCisgICAgYmNtb2x0X3N0cmluZyAqYXBpX2NsaSwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIHZvaWQgKmRhdGEsCisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkLAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtY2xpX3Nlc3Npb24gKnN0cjsKKyAgICB2b2lkICpwcm9wX2RhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgcGQtPm9mZnNldCk7CisKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IocGQtPm9mZnNldCA+PSBzaXplLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICBlcnIgPSBiY21jbGlfc2Vzc2lvbl9vcGVuX3N0cmluZygmc3RyLCBhcGlfY2xpKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICBlcnIgPSBhcGljbGlfZHVtcF9wcm9wX3BhcmFtKHN0ciwgcGQsIHByb3BfZGF0YSwgcHJlZml4KTsKKyAgICBiY21jbGlfc2Vzc2lvbl9jbG9zZShzdHIpOworICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19hcGlfY2xpX2tleV93cml0ZSgKKyAgICBiY21vbHRfc3RyaW5nKiBhcGlfY2xpLAorICAgIGNvbnN0IGJjbW9sdF9tc2cqIG1zZywKKyAgICB1aW50MzJfdCBrZXlfc2l6ZSwKKyAgICB1aW50MzJfdCBrZXlfb2Zmc2V0KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisgICAgdm9pZCAqZGF0YSA9ICh2b2lkICopKChsb25nKW1zZyArIGtleV9vZmZzZXQpOworCisgICAgZm9yICh1aW50MTZfdCBwcm9wID0gMDsKKyAgICAgICAgIGFwaV9jbGlfb2JqZWN0X3Byb3BlcnR5KG1zZy0+b2JqX3R5cGUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBlcnIgPSBwbGF5YmFja19hcGlfY2xpX2FwcGVuZF9wcm9wKGFwaV9jbGksIGtleV9zaXplLCBkYXRhLCBwZCwgIiAiKTsKKyAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19hcGlfY2xpX3BtX3dyaXRlKGJjbW9sdF9zdHJpbmcgKmFwaV9jbGksIGNvbnN0IGJjbW9sdF9tc2cqIG1zZywgYmNtb2x0X3ByZXNlbmNlX21hc2sgcG0pCit7CisgICAgaW50IG47CisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkOworCisgICAgZm9yICh1aW50MTZfdCBwcm9wID0gMDsKKyAgICAgICAgIGFwaV9jbGlfb2JqZWN0X3Byb3BlcnR5KG1zZy0+b2JqX3R5cGUsIG1zZy0+Z3JvdXAsIG1zZy0+c3ViZ3JvdXAsIHByb3AsICZwZCkgPT0gQkNNX0VSUl9PSzsKKyAgICAgICAgICsrcHJvcCkKKyAgICB7CisgICAgICAgIGlmICghKHBtICYgKDFVTEwgPDwgcHJvcCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoYXBpX2NsaSwgIiAlcz15ZXMiLCBwZC0+bmFtZSk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfYXBpX2NsaV9wcm9wc193cml0ZSgKKyAgICBiY21vbHRfc3RyaW5nICphcGlfY2xpLAorICAgIGNvbnN0IGJjbW9sdF9tc2cqIG1zZywKKyAgICBjb25zdCBjaGFyICpwcmVmaXgsCisgICAgdWludDMyX3Qgc2l6ZSwKKyAgICB1aW50MzJfdCBvZmZzZXQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKyAgICB2b2lkICpkYXRhID0gKHZvaWQgKikoKGxvbmcpbXNnICsgb2Zmc2V0KTsKKworICAgIGZvciAodWludDE2X3QgcHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBpZiAoIShtc2ctPnByZXNlbmNlX21hc2sgJiAoMVVMTCA8PCBwcm9wKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVyciA9IHBsYXliYWNrX2FwaV9jbGlfYXBwZW5kX3Byb3AoYXBpX2NsaSwgc2l6ZSwgZGF0YSwgcGQsIHByZWZpeCk7CisgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KAorICAgIGJjbW9sdF9zdHJpbmcgKmFwaV9jbGksCisgICAgY29uc3QgYmNtb2x0X21zZyogbXNnLAorICAgIGNvbnN0IGNoYXIgKmNtZCwKKyAgICBwYl9jbGlfZXh0cmEgZXh0cmFfcGFybXMsCisgICAgcGJfZmllbGRzIGZpZWxkX3Bhcm1zKQoreworICAgIGludCBuOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKmRlc2M7CisgICAgdWludDMyX3Qga2V5X3NpemU7CisgICAgdWludDMyX3Qga2V5X29mZnNldDsKKyAgICB1aW50MzJfdCBkYXRhX3NpemU7CisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQ7CisKKyAgICBCQ01fTE9HKERFQlVHLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJTdGFydCAlc1xuIiwgY21kKTsKKworICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X25hbWUobXNnLT5vYmpfdHlwZSwgJm5hbWUsICZkZXNjKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChhcGlfY2xpLCAiL2FwaS8lcyBvYmplY3Q9JXMiLCBjbWQsIG5hbWUpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworCisgICAgc3dpdGNoIChleHRyYV9wYXJtcykKKyAgICB7CisgICAgICAgIGNhc2UgUEJfQ0xJX0VYVFJBX01VTFRJOgorICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKAorICAgICAgICAgICAgICAgIGFwaV9jbGksCisgICAgICAgICAgICAgICAgIiBtYXhfbXNncz0ldSBmaWx0ZXJfaW52ZXJ0PSVzIiwKKyAgICAgICAgICAgICAgICBtc2ctPm1zZ19zZXQtPm1heF9pbnN0YW5jZXMsCisgICAgICAgICAgICAgICAgQklUU19TRVQobXNnLT5tc2dfc2V0LT5maWx0ZXJfZmxhZ3MsIEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTikgPyAieWVzIiA6ICJubyIpOworICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQl9DTElfRVhUUkFfU1RBVDoKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChhcGlfY2xpLCAiIGNsZWFyPSVzIiwgQklUU19TRVQobXNnLT50eXBlLCBCQ01PTFRfTVNHX1RZUEVfQ0xFQVIpID8gInllcyIgOiAibm8iKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEJfQ0xJX0VYVFJBX1NVQkdST1VQOgorICAgICAgICAgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAmbmFtZSwgJmRlc2MpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoYXBpX2NsaSwgIiBzdWI9JXMiLCBuYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBnZXQgbWVzc2FnZSBpbmZvICovCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3RydWN0X3NpemUoCisgICAgICAgIG1zZy0+b2JqX3R5cGUsCisgICAgICAgIG1zZy0+Z3JvdXAsCisgICAgICAgIG1zZy0+c3ViZ3JvdXAsCisgICAgICAgICZrZXlfc2l6ZSwKKyAgICAgICAgJmtleV9vZmZzZXQsCisgICAgICAgICZkYXRhX3NpemUsCisgICAgICAgICZkYXRhX29mZnNldCk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisKKyAgICBpZiAoQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRyAhPSBtc2ctPmdyb3VwKQorICAgIHsKKyAgICAgICAgLyogd3JpdGUga2V5ICovCisgICAgICAgIGVyciA9IHBsYXliYWNrX2FwaV9jbGlfa2V5X3dyaXRlKGFwaV9jbGksIG1zZywga2V5X3NpemUsIGtleV9vZmZzZXQpOworICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZpZWxkX3Bhcm1zKQorICAgIHsKKyAgICAgICAgY2FzZSBQQl9GSUVMRFNfR0VUOgorICAgICAgICAgICAgLyogd3JpdGUgcHJlc2VuY2UgbWFzayAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfYXBpX2NsaV9wbV93cml0ZShhcGlfY2xpLCBtc2csIG1zZy0+cHJlc2VuY2VfbWFzayk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBCX0ZJRUxEU19NVUxUSToKKyAgICAgICAgICAgIC8qIHdyaXRlIGZpbHRlciAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfYXBpX2NsaV9wcm9wc193cml0ZShhcGlfY2xpLCBtc2csICIgZmlsdGVyLiIsIGRhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICAvKiB3cml0ZSBwcmVzZW5jZSBtYXNrICovCisgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19hcGlfY2xpX3BtX3dyaXRlKGFwaV9jbGksIG1zZywgbXNnLT5tc2dfc2V0LT5wcmVzZW5jZV9tYXNrKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEJfRklFTERTX1NFVDoKKyAgICAgICAgICAgIC8qIHdyaXRlIHByb3BlcnRpZXMgKi8KKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2FwaV9jbGlfcHJvcHNfd3JpdGUoYXBpX2NsaSwgbXNnLCAiICIsIGRhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChhcGlfY2xpLCAiXG4iKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKworICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIkVuZCAlc1xuIiwgY21kKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19hcGlfY2xpX2dldChiY21vbHRfc3RyaW5nKiBhcGlfY2xpLCBjb25zdCBiY21vbHRfbXNnKiBtc2cpCit7CisgICAgc3dpdGNoIChtc2ctPmdyb3VwKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldChhcGlfY2xpLCBtc2csICJnZXQiLCBQQl9DTElfRVhUUkFfTk9ORSwgUEJfRklFTERTX0dFVCk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KGFwaV9jbGksIG1zZywgIm11bHRpZ2V0IiwgUEJfQ0xJX0VYVFJBX01VTFRJLCBQQl9GSUVMRFNfTVVMVEkpOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldChhcGlfY2xpLCBtc2csICJzZXQiLCBQQl9DTElfRVhUUkFfTk9ORSwgUEJfRklFTERTX1NFVCk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAiY2xlYXIiLCBQQl9DTElfRVhUUkFfTk9ORSwgUEJfRklFTERTX05PTkUpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldChhcGlfY2xpLCBtc2csICJzdGF0IiwgUEJfQ0xJX0VYVFJBX1NUQVQsIFBCX0ZJRUxEU19HRVQpOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAic2FnZXQiLCBQQl9DTElfRVhUUkFfU1VCR1JPVVAsIFBCX0ZJRUxEU19OT05FKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAic2FzZXQiLCBQQl9DTElfRVhUUkFfU1VCR1JPVVAsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldChhcGlfY2xpLCBtc2csICJhY2dldCIsIFBCX0NMSV9FWFRSQV9OT05FLCBQQl9GSUVMRFNfR0VUKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAiYWNzZXQiLCBQQl9DTElfRVhUUkFfTk9ORSwgUEJfRklFTERTX1NFVCk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KGFwaV9jbGksIG1zZywgIm9wZXIiLCBQQl9DTElfRVhUUkFfU1VCR1JPVVAsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KGFwaV9jbGksIG1zZywgInNlbmQiLCBQQl9DTElfRVhUUkFfU1VCR1JPVVAsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY29udmVydF9hcGlfY2xpKGJjbW9sdF9wbGF5YmFjayAqbXBiLCBGSUxFICpvdXRfZmlsZSkKK3sKKyAgICBwbGF5YmFja19pdGVyYXRvciBpdDsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3N0cmluZyAqc3RyOworCisgICAgZXJyID0gYmNtb2x0X3N0cmluZ19jcmVhdGUoJnN0ciwgMjA0OCk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgRk9SX0VBQ0hfUExBWUJBQ0tfTVNHKGl0LCBtcGItPmNhcHR1cmVfYnVmZmVyLCBtcGItPmJ1Zl9zaXplKQorICAgIHsKKyAgICAgICAgaWYgKHBsYXliYWNrX3Nob3VsZF9zZW5kKG1wYi0+bG9jYXRpb24sIChiY210cl9jbGRfZXZlbnRfdHlwZSlpdC5yYXcuaGRyLmV2ZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgPT0gaXQuZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9zdHJpbmdfcmVzZXQoc3RyKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19hcGlfY2xpX2dldChzdHIsIGl0Lm1zZyk7CisgICAgICAgICAgICAgICAgZndyaXRlKGJjbW9sdF9zdHJpbmdfZ2V0KHN0ciksIHNpemVvZihjaGFyKSwgc3RybGVuKGJjbW9sdF9zdHJpbmdfZ2V0KHN0cikpLCBvdXRfZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gaXQuZXJyOworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlVucGFja2luZyBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBiY21vbHRfc3RyaW5nX2Rlc3Ryb3koc3RyKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIHBsYXliYWNrX2ZpZWxkX2NvbnRhaW5zX3Zhcl9saXN0KGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0eXBlKQoreworICAgIGlmICh0eXBlID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4pCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBsYXliYWNrX2ZpZWxkX2NvbnRhaW5zX3Zhcl9saXN0KHR5cGUtPnguYXJyX2ZpeGVkLmVsZW1fdHlwZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCkKKyAgICB7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCB0eXBlLT54LnMubnVtX2ZpZWxkczsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGxheWJhY2tfZmllbGRfY29udGFpbnNfdmFyX2xpc3QodHlwZS0+eC5zLmZpZWxkc1tpXS50eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTikKKyAgICB7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCB0eXBlLT54LnUubnVtX2NvbW1vbl9maWVsZHM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBsYXliYWNrX2ZpZWxkX2NvbnRhaW5zX3Zhcl9saXN0KHR5cGUtPngudS5jb21tb25fZmllbGRzW2ldLnR5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IHR5cGUtPngudS5jb21tb25fZmllbGRzW3R5cGUtPngudS5jbGFzc2lmaWVyX2lkeF0udHlwZS0+eC5lW2ldLm5hbWUgIT0gTlVMTDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGxheWJhY2tfZmllbGRfY29udGFpbnNfdmFyX2xpc3QodHlwZS0+eC51LnVuaW9uX2ZpZWxkc1tpXS50eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBub3QgYSB2YXJpYWJsZSBzaXplZCBsaXN0ICovCisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBwbGF5YmFja19tc2dfY29udGFpbnNfdmFyX2xpc3QoY29uc3QgYmNtb2x0X21zZyogbXNnKQoreworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKworICAgIGZvciAodWludDE2X3QgcHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBpZiAocGxheWJhY2tfZmllbGRfY29udGFpbnNfdmFyX2xpc3QocGQtPnR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX3N0cmluZ193cml0ZV91cHBlcihiY21vbHRfc3RyaW5nICpkZXN0LCBjb25zdCBjaGFyKiBzcmMpCit7CisgICAgaW50IG47CisKKyAgICB3aGlsZSAoKnNyYyAhPSAnXDAnKQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGRlc3QsICIlYyIsIChjaGFyKXRvdXBwZXIoKGludCkqc3JjKSk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICArK3NyYzsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2NfYXBpX3BtX3dyaXRlKAorICAgIGJjbW9sdF9zdHJpbmcgKmNfYXBpLAorICAgIGNvbnN0IGJjbW9sdF9tc2cqIG1zZywKKyAgICBiY21vbHRfcHJlc2VuY2VfbWFzayBwbSwKKyAgICBjb25zdCBjaGFyICpleHRyYSwKKyAgICBjb25zdCBjaGFyICpmaWVsZCwKKyAgICBjb25zdCBjaGFyICpvYmopCit7CisgICAgaW50IG47CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKworICAgIGZvciAodWludDE2X3QgcHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBpZiAoIShwbSAmICgxVUxMIDw8IHByb3ApKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRCQ01PTFRfJXMiLCBleHRyYSk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICBlcnIgPSBwbGF5YmFja19zdHJpbmdfd3JpdGVfdXBwZXIoY19hcGksIGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKG1zZy0+Z3JvdXApKTsKKyAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIl9QUk9QX0dFVCglcywgJXMsICVzKTtcbiIsIGZpZWxkLCBvYmosIHBkLT5uYW1lKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jX2FwaV9hcHBlbmRfaW5pdCgKKyAgICBiY21vbHRfc3RyaW5nICpjX2FwaSwKKyAgICB2b2lkICpkYXRhLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICBjb25zdCBjaGFyKiBuYW1lKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbWNsaV9zZXNzaW9uICpzdHI7CisKKyAgICByYyA9IGJjbWNsaV9zZXNzaW9uX29wZW5fc3RyaW5nKCZzdHIsIGNfYXBpKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IocmMpOworICAgIHJjID0gYXBpY2xpX2R1bXBfZHluX2FycmF5KHN0ciwgdGQsIGRhdGEsIG5hbWUpOworICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKHN0cik7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKHJjKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jX2FwaV9hcHBlbmRfcHJvcCgKKyAgICBiY21vbHRfc3RyaW5nICpjX2FwaSwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIHZvaWQgKmRhdGEsCisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21jbGlfc2Vzc2lvbiAqc3RyOworICAgIHZvaWQgKnByb3BfZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBwZC0+b2Zmc2V0KTsKKworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihwZC0+b2Zmc2V0ID49IHNpemUsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIGVyciA9IGJjbWNsaV9zZXNzaW9uX29wZW5fc3RyaW5nKCZzdHIsIGNfYXBpKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICBlcnIgPSBhcGljbGlfZHVtcF9wcm9wX2luaXRpYWxpemVyKHN0ciwgcGQsIHByb3BfZGF0YSk7CisgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2Uoc3RyKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY19hcGlfbWFrZV92YXJfbGlzdHMoCisgICAgYmNtb2x0X3N0cmluZyAqY19hcGksCisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnR5cGUsCisgICAgdm9pZCAqZGF0YSwKKyAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBuOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIGlmICh0eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOKQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHQlcyAlc1tdID0gIiwgdHlwZS0+eC5hcnJfZHluLmVsZW1fdHlwZS0+bmFtZSwgbmFtZSk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICByYyA9IHBsYXliYWNrX2NfYXBpX2FwcGVuZF9pbml0KGNfYXBpLCBkYXRhLCB0eXBlLCBuYW1lKTsKKyAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKHJjKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiO1xuIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQpCisgICAgeworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgdHlwZS0+eC5hcnJfZml4ZWQuc2l6ZTsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGluZGV4X25hbWVbNjRdOworCisgICAgICAgICAgICBzcHJpbnRmKGluZGV4X25hbWUsICIlcyV1IiwgbmFtZSwgaSk7CisgICAgICAgICAgICByYyA9IHBsYXliYWNrX2NfYXBpX21ha2VfdmFyX2xpc3RzKGNfYXBpLCB0eXBlLT54LmFycl9maXhlZC5lbGVtX3R5cGUsIGRhdGEsIGluZGV4X25hbWUpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKHJjKTsKKyAgICAgICAgICAgIGRhdGEgPSAodm9pZCopKChsb25nKWRhdGEgKyB0eXBlLT54LmFycl9maXhlZC5lbGVtX3R5cGUtPnNpemUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCkKKyAgICB7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCB0eXBlLT54LnMubnVtX2ZpZWxkczsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmZpZWxkID0gJnR5cGUtPngucy5maWVsZHNbaV07CisgICAgICAgICAgICByYyA9IHBsYXliYWNrX2NfYXBpX21ha2VfdmFyX2xpc3RzKGNfYXBpLCBmaWVsZC0+dHlwZSwgKHZvaWQqKSgobG9uZylkYXRhICsgZmllbGQtPm9mZnNldCksIGZpZWxkLT5uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihyYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04pCisgICAgeworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgdHlwZS0+eC51Lm51bV9jb21tb25fZmllbGRzOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmllbGQgPSAmdHlwZS0+eC51LmNvbW1vbl9maWVsZHNbaV07CisgICAgICAgICAgICByYyA9IHBsYXliYWNrX2NfYXBpX21ha2VfdmFyX2xpc3RzKGNfYXBpLCBmaWVsZC0+dHlwZSwgKHZvaWQqKSgobG9uZylkYXRhICsgZmllbGQtPm9mZnNldCksIGZpZWxkLT5uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihyYyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgdHlwZS0+eC51LmNvbW1vbl9maWVsZHNbdHlwZS0+eC51LmNsYXNzaWZpZXJfaWR4XS50eXBlLT54LmVbaV0ubmFtZSAhPSBOVUxMOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmllbGQgPSAmdHlwZS0+eC51LnVuaW9uX2ZpZWxkc1tpXTsKKyAgICAgICAgICAgIHJjID0gcGxheWJhY2tfY19hcGlfbWFrZV92YXJfbGlzdHMoY19hcGksIGZpZWxkLT50eXBlLCAodm9pZCopKChsb25nKWRhdGEgKyBmaWVsZC0+b2Zmc2V0KSwgZmllbGQtPm5hbWUpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKHJjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBub3QgYSB2YXJpYWJsZSBzaXplZCBsaXN0ICovCisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jX2FwaV9wcm9wc193cml0ZSgKKyAgICBiY21vbHRfc3RyaW5nICpjX2FwaSwKKyAgICBjb25zdCBiY21vbHRfbXNnKiBtc2csCisgICAgY29uc3QgY2hhciogb2JqZWN0LAorICAgIHVpbnQzMl90IHNpemUsCisgICAgdWludDMyX3Qgb2Zmc2V0KQoreworICAgIGludCBuOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBjaGFyICpzdWJncm91cDsKKyAgICBjb25zdCBjaGFyICpkZXNjOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKyAgICB2b2lkICpkYXRhID0gKHZvaWQgKikoKGxvbmcpbXNnICsgb2Zmc2V0KTsKKworICAgIGZvciAodWludDE2X3QgcHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBpZiAoIShtc2ctPnByZXNlbmNlX21hc2sgJiAoMVVMTCA8PCBwcm9wKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBsYXliYWNrX2NfYXBpX21ha2VfdmFyX2xpc3RzKGNfYXBpLCBwZC0+dHlwZSwgKHZvaWQqKSgobG9uZylkYXRhICsgcGQtPm9mZnNldCksIHBkLT5uYW1lKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQxNl90IHByb3AgPSAwOworICAgICAgICAgYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgbXNnLT5zdWJncm91cCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgaWYgKCEobXNnLT5wcmVzZW5jZV9tYXNrICYgKDFVTEwgPDwgcHJvcCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBkLT50eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QpIHx8CisgICAgICAgICAgICAocGQtPnR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OKSB8fAorICAgICAgICAgICAgKHBkLT50eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOKSB8fAorICAgICAgICAgICAgKHBkLT50eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQpKQorICAgICAgICB7CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdCVzICJWQUxfUkVGIiA9ICIsIHBkLT50eXBlLT5uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY19hcGlfYXBwZW5kX3Byb3AoY19hcGksIHNpemUsIGRhdGEsIHBkKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiO1xuIik7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0QkNNT0xUXyIpOworICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19zdHJpbmdfd3JpdGVfdXBwZXIoY19hcGksIGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKG1zZy0+Z3JvdXApKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiX1BST1BfU0VUKCZtc2csICVzIiwgb2JqZWN0KTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgaWYgKChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfT1BFUikgfHwgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAmc3ViZ3JvdXAsICZkZXNjKTsKKyAgICAgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIsICVzIiwgc3ViZ3JvdXApOworICAgICAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiLCAlcywgIlZBTF9SRUYiKTtcbiIsIHBkLT5uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRCQ01PTFRfIik7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX3N0cmluZ193cml0ZV91cHBlcihjX2FwaSwgYXBpY2xpX21ndF9ncm91cF90b19zdHIobXNnLT5ncm91cCkpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJfUFJPUF9TRVQoJm1zZywgJXMiLCBvYmplY3QpOworICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICBpZiAoKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9PUEVSKSB8fCAobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX1BST1hZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKG1zZy0+b2JqX3R5cGUsIG1zZy0+Z3JvdXAsIG1zZy0+c3ViZ3JvdXAsICZzdWJncm91cCwgJmRlc2MpOworICAgICAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIiwgJXMiLCBzdWJncm91cCk7CisgICAgICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIsICVzLCAiLCBwZC0+bmFtZSk7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2NfYXBpX2FwcGVuZF9wcm9wKGNfYXBpLCBzaXplLCBkYXRhLCBwZCk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIik7XG4iKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jX2FwaV9jb2RlX2dldCgKKyAgICBiY21vbHRfc3RyaW5nKiBjX2FwaSwKKyAgICBjb25zdCBiY21vbHRfbXNnKiBtc2csCisgICAgY29uc3QgY2hhciAqY2FsbCwKKyAgICBwYl9maWVsZHMgZmllbGRfcGFybXMpCit7CisgICAgaW50IG47CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGNvbnN0IGNoYXIgKm9iamVjdDsKKyAgICBjb25zdCBjaGFyICpncm91cDsKKyAgICBjb25zdCBjaGFyICpzdWJncm91cDsKKyAgICBjb25zdCBjaGFyICpkZXNjOworICAgIHVpbnQzMl90IGtleV9zaXplOworICAgIHVpbnQzMl90IGtleV9vZmZzZXQ7CisgICAgdWludDMyX3QgZGF0YV9zaXplOworICAgIHVpbnQzMl90IGRhdGFfb2Zmc2V0OworICAgIHZvaWQgKmRhdGE7CisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkOworICAgIGJjbW9zX2Jvb2wgdmFyX2xpc3QgPSAoQkNNT0xUX01TR19UWVBFX0dFVCA9PSBtc2ctPnR5cGUpICYmIHBsYXliYWNrX21zZ19jb250YWluc192YXJfbGlzdChtc2cpOworCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3RfbmFtZShtc2ctPm9ial90eXBlLCAmb2JqZWN0LCAmZGVzYyk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAmc3ViZ3JvdXAsICZkZXNjKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKworICAgIGdyb3VwID0gYXBpY2xpX21ndF9ncm91cF90b19zdHIobXNnLT5ncm91cCk7CisKKyAgICAvKiBnZXQgbWVzc2FnZSBpbmZvICovCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3RydWN0X3NpemUoCisgICAgICAgIG1zZy0+b2JqX3R5cGUsCisgICAgICAgIG1zZy0+Z3JvdXAsCisgICAgICAgIG1zZy0+c3ViZ3JvdXAsCisgICAgICAgICZrZXlfc2l6ZSwKKyAgICAgICAgJmtleV9vZmZzZXQsCisgICAgICAgICZkYXRhX3NpemUsCisgICAgICAgICZkYXRhX29mZnNldCk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisKKyAgICAvKiBpbml0IHZhcmlhYmxlcyAqLworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0e1xuIik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgaWYgKChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfT1BFUikgfHwgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWSkpCisgICAgeworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdGJjbW9sdF8lc18lcyAiTVNHX1JFRiI7XG4iLCBvYmplY3QsIHN1Ymdyb3VwKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0YmNtb2x0XyVzXyVzICJNU0dfUkVGIjtcbiIsIG9iamVjdCwgZ3JvdXApOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRiY21vbHRfJXNfa2V5ICJLRVlfUkVGIiA9IHsgfTtcbiIsIG9iamVjdCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisKKyAgICBpZiAodmFyX2xpc3QpCisgICAgeworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdHVpbnQ4X3QqICJMSVNUX01FTV9SRUYiO1xuIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKworICAgIGlmIChtc2ctPnR5cGUgPT0gQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSSkKKyAgICB7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0YmNtb2x0X21zZ19zZXQqICJNU0dfU0VUX1JFRiIgPSBOVUxMO1xuIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdHVpbnQzMl90ICJNQVhfTVNHU19SRUYiO1xuIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdGJjbW9zX2Jvb2wgIklOVkVSVF9GSUxURVJfUkVGIjtcblxuIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdCJNQVhfTVNHU19SRUYiID0gJWQ7XG4iLCBtc2ctPm1zZ19zZXQtPm1heF9pbnN0YW5jZXMpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHQiSU5WRVJUX0ZJTFRFUl9SRUYiID0gJXM7XG4iLCBCSVRTX1NFVChtc2ctPm1zZ19zZXQtPmZpbHRlcl9mbGFncywgQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEXyIpOworICAgICAgICBlcnIgPSBwbGF5YmFja19zdHJpbmdfd3JpdGVfdXBwZXIoY19hcGksIG9iamVjdCk7CisgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIsIEJDTU9MVF9NR1RfR1JPVVBfIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICBlcnIgPSBwbGF5YmFja19zdHJpbmdfd3JpdGVfdXBwZXIoY19hcGksIGdyb3VwKTsKKyAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIiwgIk1BWF9NU0dTX1JFRiIsICYiTVNHX1NFVF9SRUYiKTtcbiIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisgICAgZWxzZSBpZiAobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX1NUQVQpCisgICAgeworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdGJjbW9sdF9zdGF0X2ZsYWdzICJTVEFUX0ZMQUdTX1JFRiI7XG5cbiIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHQiU1RBVF9GTEFHU19SRUYiID0gJXM7XG4iLCBCSVRTX1NFVChtc2ctPnR5cGUsIEJDTU9MVF9NU0dfVFlQRV9DTEVBUikgPyAiQkNNT0xUX1NUQVRfRkxBR1NfQ0xFQVJfT05fUkVBRCIgOiAiQkNNT0xUX1NUQVRfRkxBR1NfTk9ORSIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXG4iKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorCisgICAgLyogc2V0IGtleSAqLworICAgIGlmIChCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHICE9IG1zZy0+Z3JvdXApCisgICAgeworICAgICAgICAvKiB3cml0ZSBrZXkgKi8KKyAgICAgICAgZGF0YSA9ICh2b2lkICopKChsb25nKW1zZyArIGtleV9vZmZzZXQpOworICAgICAgICBmb3IgKHVpbnQxNl90IHByb3AgPSAwOworICAgICAgICAgICAgIGFwaV9jbGlfb2JqZWN0X3Byb3BlcnR5KG1zZy0+b2JqX3R5cGUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgKytwcm9wKQorICAgICAgICB7CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdCJLRVlfUkVGIi4lcyA9ICIsIHBkLT5uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgaWYgKChCQ01PTFRfQkFTRV9UWVBFX0lEX01BQyA9PSBwZC0+dHlwZS0+YmFzZV90eXBlKSB8fAorICAgICAgICAgICAgICAgIChCQ01PTFRfQkFTRV9UWVBFX0lEX0lQVjQgPT0gcGQtPnR5cGUtPmJhc2VfdHlwZSkgfHwKKyAgICAgICAgICAgICAgICAoQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QgPT0gcGQtPnR5cGUtPmJhc2VfdHlwZSkgfHwKKyAgICAgICAgICAgICAgICAoQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTiA9PSBwZC0+dHlwZS0+YmFzZV90eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIoJXMpIiwgcGQtPnR5cGUtPm5hbWUpOworICAgICAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY19hcGlfYXBwZW5kX3Byb3AoY19hcGksIGtleV9zaXplLCBkYXRhLCBwZCk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIjtcbiIpOworICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzZXQgcHJvcGVydGllcyAqLworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0QkNNT0xUXyIpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIGVyciA9IHBsYXliYWNrX3N0cmluZ193cml0ZV91cHBlcihjX2FwaSwgZ3JvdXApOworICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIl9JTklUKCYiTVNHX1JFRiIsICVzIiwgb2JqZWN0KTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICBpZiAoKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRykgfHwKKyAgICAgICAgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9PUEVSKSB8fAorICAgICAgICAobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX1BST1hZKSkKKyAgICB7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIiwgJXMiLCBzdWJncm91cCk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKyAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIsICJLRVlfUkVGIik7XG4iKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKworICAgIHN3aXRjaCAoZmllbGRfcGFybXMpCisgICAgeworICAgICAgICBjYXNlIFBCX0ZJRUxEU19HRVQ6CisgICAgICAgICAgICAvKiB3cml0ZSBwcmVzZW5jZSBtYXNrICovCisgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19jX2FwaV9wbV93cml0ZShjX2FwaSwgbXNnLCBtc2ctPnByZXNlbmNlX21hc2ssICIiLCAiJiJNU0dfUkVGLCBvYmplY3QpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBpZiAodmFyX2xpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHQiTElTVF9NRU1fUkVGIiA9IGJjbW9zX2NhbGxvYygiRFlOX0xJU1RfU0laRSIpO1xuIik7CisgICAgICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICBjX2FwaSwKKyAgICAgICAgICAgICAgICAgICAgIlx0QkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJiJNU0dfUkVGIiwgJXMsICJMSVNUX01FTV9SRUYiLCAiRFlOX0xJU1RfU0laRSIpO1xuIiwgb2JqZWN0KTsKKyAgICAgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBCX0ZJRUxEU19NVUxUSToKKyAgICAgICAgICAgIC8qIHdyaXRlIGZpbHRlciAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY19hcGlfcHJvcHNfd3JpdGUoY19hcGksIG1zZywgb2JqZWN0LCBkYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgLyogd3JpdGUgcHJlc2VuY2UgbWFzayAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY19hcGlfcG1fd3JpdGUoY19hcGksIG1zZywgbXNnLT5wcmVzZW5jZV9tYXNrLCAiTVNHU0VUXyIsIE1TR19TRVRfUkVGLCBvYmplY3QpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQl9GSUVMRFNfU0VUOgorICAgICAgICAgICAgLyogd3JpdGUgcHJvcGVydGllcyAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY19hcGlfcHJvcHNfd3JpdGUoY19hcGksIG1zZywgb2JqZWN0LCBkYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0IlJDX1JFRiIgPSBiY21vbHRfJXNfJXMoIkRFVklDRV9SRUYiLCAmIk1TR19SRUYiLmhkciIsIGdyb3VwLCBjYWxsKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICBpZiAobXNnLT50eXBlID09IEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEkpCisgICAgeworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoCisgICAgICAgICAgICBjX2FwaSwKKyAgICAgICAgICAgICIsICgiSU5WRVJUX0ZJTFRFUl9SRUYiKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgIk1TR19TRVRfUkVGKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorICAgIGVsc2UgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUKQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiLCAiU1RBVF9GTEFHU19SRUYpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgIH0KKyAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIpO1xuIik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRiY21vc19wcmludGYoXCJiY21vbHRfJXNfJXMgcmV0dXJuZWQgJSVzICglJWQpXFxuXCIsIGJjbW9zX3N0cmVycm9yKCJSQ19SRUYiKSwgIlJDX1JFRiIpO1xuIiwgZ3JvdXAsIGNhbGwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0fVxuXG4iKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY19hcGlfZ2V0KGJjbW9sdF9zdHJpbmcqIGNfYXBpLCBjb25zdCBiY21vbHRfbXNnKiBtc2cpCit7CisgICAgc3dpdGNoIChtc2ctPmdyb3VwKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2NfYXBpX2NvZGVfZ2V0KGNfYXBpLCBtc2csICJnZXQiLCBQQl9GSUVMRFNfR0VUKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAiZ2V0X211bHRpIiwgUEJfRklFTERTX01VTFRJKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAic2V0IiwgUEJfRklFTERTX1NFVCk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAiY2xlYXIiLCBQQl9GSUVMRFNfTk9ORSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfY19hcGlfY29kZV9nZXQoY19hcGksIG1zZywgImdldCIsIFBCX0ZJRUxEU19HRVQpOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAiZ2V0IiwgUEJfRklFTERTX05PTkUpOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2NfYXBpX2NvZGVfZ2V0KGNfYXBpLCBtc2csICJzZXQiLCBQQl9GSUVMRFNfU0VUKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAiZ2V0IiwgUEJfRklFTERTX0dFVCk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfY19hcGlfY29kZV9nZXQoY19hcGksIG1zZywgInNldCIsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2NfYXBpX2NvZGVfZ2V0KGNfYXBpLCBtc2csICJzdWJtaXQiLCBQQl9GSUVMRFNfU0VUKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2NfYXBpX2NvZGVfZ2V0KGNfYXBpLCBtc2csICJzZW5kIiwgUEJfRklFTERTX1NFVCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jb252ZXJ0X2NfYXBpKGJjbW9sdF9wbGF5YmFjayAqbXBiLCBGSUxFICpvdXRfZmlsZSkKK3sKKyAgICBwbGF5YmFja19pdGVyYXRvciBpdDsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3N0cmluZyAqc3RyOworICAgIHVpbnQzMl90IGxhc3RfdGltZV91cyA9IDA7CisgICAgYmNtb3NfYm9vbCBmaXJzdCA9IEJDTU9TX1RSVUU7CisKKyAgICBlcnIgPSBiY21vbHRfc3RyaW5nX2NyZWF0ZSgmc3RyLCAxNjM4NCk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgZnByaW50ZihvdXRfZmlsZSwgInZvaWQgcnVuX3BsYXliYWNrKHZvaWQpXG57XG4iKTsKKyAgICBmcHJpbnRmKG91dF9maWxlLCAiXHRiY21vbHRfZGV2aWQgIkRFVklDRV9SRUYiID0gJWQ7XG4iLCBjdXJyZW50X2RldmljZSk7CisgICAgZnByaW50ZihvdXRfZmlsZSwgIlx0YmNtb3NfZXJybm8gIlJDX1JFRiIgPSBCQ01fRVJSX09LO1xuXG4iKTsKKyAgICBGT1JfRUFDSF9QTEFZQkFDS19NU0coaXQsIG1wYi0+Y2FwdHVyZV9idWZmZXIsIG1wYi0+YnVmX3NpemUpCisgICAgeworICAgICAgICBpZiAocGxheWJhY2tfc2hvdWxkX3NlbmQobXBiLT5sb2NhdGlvbiwgKGJjbXRyX2NsZF9ldmVudF90eXBlKWl0LnJhdy5oZHIuZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyA9PSBpdC5lcnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGFwcHJveGltYXRlIG9yaWdpbmFsIHRpbWluZzsgZG9lc24ndCBhY2NvdW50IGZvciBwcm9jZXNzaW5nIHRpbWUgaW4gdGhpcyBjb2RlIC0gdGhpcyBjb3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlZCAqLworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9maWxlLCAiXG5cdGJjbW9zX3VzbGVlcCgldSk7XG5cbiIsIGl0LnJhdy5oZHIudGltZXN0YW1wIC0gbGFzdF90aW1lX3VzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdF90aW1lX3VzID0gaXQucmF3Lmhkci50aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgYmNtb2x0X3N0cmluZ19yZXNldChzdHIpOworICAgICAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2NfYXBpX2dldChzdHIsIGl0Lm1zZyk7CisgICAgICAgICAgICAgICAgZndyaXRlKGJjbW9sdF9zdHJpbmdfZ2V0KHN0ciksIHNpemVvZihjaGFyKSwgc3RybGVuKGJjbW9sdF9zdHJpbmdfZ2V0KHN0cikpLCBvdXRfZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gaXQuZXJyOworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlVucGFja2luZyBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmcHJpbnRmKG91dF9maWxlLCAifVxuIik7CisgICAgYmNtb2x0X3N0cmluZ19kZXN0cm95KHN0cik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY29udmVydChiY21vbHRfcGxheWJhY2sgKm1wYiwgcGJfZm9ybWF0IGZvcm1hdCwgRklMRSAqb3V0X2ZpbGUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgc3dpdGNoIChmb3JtYXQpCisgICAgeworICAgICAgICBjYXNlIFBCX0ZPUk1BVF9BUElfQ0xJOgorICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY29udmVydF9hcGlfY2xpKG1wYiwgb3V0X2ZpbGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEJfRk9STUFUX0NfQVBJOgorICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY29udmVydF9jX2FwaShtcGIsIG91dF9maWxlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLCAiVW5rbm93biBmb3JtYXQ6ICVkXG4iLCBmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2NsaV9jb252KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGNvbnN0IGNoYXIgKmluZmlsZW5hbWUgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmZpbGUiKS0+dmFsdWUuc3RyaW5nOworICAgIGNvbnN0IGNoYXIgKm91dGZpbGVuYW1lID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3V0ZmlsZSIpLT52YWx1ZS5zdHJpbmc7CisgICAgcGJfZm9ybWF0IGZvcm1hdCA9IChwYl9mb3JtYXQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZm9ybWF0IiktPnZhbHVlLmVudW1fdmFsOworICAgIGJjbW9zX2Jvb2wgaWdub3JlX3ZlciA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcGxheWJhY2sgbXBiID0ge307CisgICAgRklMRSAqb3V0X2ZpbGU7CisKKyAgICBiY21jbGlfY21kX3Bhcm0gKml2X3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpZ25vcmVfdmVyc2lvbiIpOworICAgIGlmIChpdl9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZ25vcmVfdmVyID0gaXZfcGFybS0+dmFsdWUuZW51bV92YWwgPT0gKGxvbmcpQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBlcnIgPSBwbGF5YmFja19maWxlX29wZW4oaW5maWxlbmFtZSwgJm1wYik7CisKKyAgICBpZiAoQkNNX0VSUl9PSyA9PSBlcnIpCisgICAgeworICAgICAgICBpZiAocGxheWJhY2tfdmVyc2lvbl9tYXRjaCgmbXBiKSB8fCBpZ25vcmVfdmVyKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRfZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCAid2IiKTsKKyAgICAgICAgICAgIHBsYXliYWNrX2NvbnZlcnQoJm1wYiwgZm9ybWF0LCBvdXRfZmlsZSk7CisgICAgICAgICAgICBmY2xvc2Uob3V0X2ZpbGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJQb3NzaWJsZSB2ZXJzaW9uIG1pc21hdGNoOyB1c2UgaWdub3JlX3ZlcnNpb249eWVzIHRvIGZvcmNlIGNvbnZlcnNpb25cbiIpOworICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9JTUFHRV9UWVBFOworICAgICAgICB9CisgICAgICAgIGJjbW9zX2ZyZWUobXBiLmNhcHR1cmVfYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfcGxheWJhY2tfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworI2lmZGVmIEVOQUJMRV9DTEkKKyAgICBiY21jbGlfZW50cnkgKnBsYl9kaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCAicGxheWJhY2siLCAicGxheWJhY2siLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCVUdfT04oTlVMTCA9PSBwbGJfZGlyKTsKKworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZm9ybWF0X2VudW1fdGFibGVbUEJfRk9STUFUX19DT1VOVCsxXSA9CisgICAgeworICAgICAgICB7Lm5hbWUgPSAiYXBpX2NsaSIsIC52YWwgPSAobG9uZylQQl9GT1JNQVRfQVBJX0NMSX0sCisgICAgICAgIHsubmFtZSA9ICJjX2FwaSIsIC52YWwgPSAobG9uZylQQl9GT1JNQVRfQ19BUEl9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0ocGxiX2RpciwgImR1bXAiLCAiZHVtcCBjYXB0dXJlIiwgcGxheWJhY2tfY2xpX2R1bXApOworICAgIEJDTUNMSV9NQUtFX0NNRChwbGJfZGlyLCAic2F2ZSIsICJzYXZlIGNhcHR1cmUiLCBwbGF5YmFja19jbGlfc2F2ZSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZmlsZSIsICJmaWxlbmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKHBsYl9kaXIsICJyZXBsYXkiLCAicmVwbGF5IGNhcHR1cmUiLCBwbGF5YmFja19jbGlfcmVwbGF5LAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJmaWxlIiwgImZpbGVuYW1lIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImlnbm9yZV92ZXJzaW9uIiwgIklnbm9yZSB2ZXJzaW9uIG1pc21hdGNoIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworICAgIEJDTUNMSV9NQUtFX0NNRChwbGJfZGlyLCAiY29udiIsICJDb252ZXJ0IGNhcHR1cmUiLCBwbGF5YmFja19jbGlfY29udiwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5maWxlIiwgIklucHV0IGZpbGVuYW1lIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJvdXRmaWxlIiwgIk91dHB1dCBmaWxlbmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJmb3JtYXQiLCAiT3V0cHV0IGZvcm1hdCIsIGZvcm1hdF9lbnVtX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImlnbm9yZV92ZXJzaW9uIiwgIklnbm9yZSB2ZXJzaW9uIG1pc21hdGNoIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworI2VuZGlmCit9CisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFja19pbml0KHZvaWQpCit7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IEJDTVRSX01BWF9PTFRTOyBpKyspCisgICAgeworICAgICAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgICAgICBzbnByaW50Zihsb2dfbmFtZSwgc2l6ZW9mKGxvZ19uYW1lKS0xLCAidXNlcl9hcHBsX3BsYXliYWNrXyV1IiwgaSk7CisgICAgICAgIHBiX2N0eHRbaV0ubG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX25hbWUsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9iY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3BsYXliYWNrL2JjbW9sdF91c2VyX2FwcGxfcGxheWJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM3YzYxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9iY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9QTEFZQkFDS19IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9QTEFZQkFDS19IXworCisjaW5jbHVkZSAiYmNtY2xpLmgiCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFja19jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfcGxheWJhY2tfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qIF9CQ01PTFRfVVNFUl9BUFBMX1BMQVlCQUNLX0hfICovCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjJlNTUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgdXNlciBhcHBsaWNhdGlvbgorCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKyAgICBNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfcHMKKyAgICBNT0RfVFlQRSA9IGxpYgorICAgIE1PRF9ERVBTID0gaG9zdF9hcGkgYmNtX2JvYXJkCisgICAgc3JjcyA9IGJjbW9sdF91c2VyX2FwcGxfcHMuYyBcCisJICAgYmNtb2x0X3VzZXJfYXBwbF9wc19jbGkuYyBcCisJICAgYmNtb2x0X3VzZXJfYXBwbF9wc19ncG9uLmMgXAorCSAgIGJjbW9sdF91c2VyX2FwcGxfcHNfZXBvbi5jIFwKKwkgICBiY21vbHRfdXNlcl9hcHBsX3BzX3hncG9uLmMKKworICAgIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCU1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKyAgICBlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmM4ZDMxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzLmMKQEAgLTAsMCArMSw3NTYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnX3BhY2suaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHMuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzX2ludGVybmFsLmgiCisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorI2luY2x1ZGUgPGJjbW9sdF9ib2FyZC5oPgorI2VuZGlmCisKKyNkZWZpbmUgUFNfREVGQVVMVF9NQVhfUEFJUlMgMTYKKyNkZWZpbmUgUFNfVEFTS19NU0dfUV9TSVpFIDY0CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X3BzX3BhaXIgcGFpcjsKKyAgICBiY21vc19ib29sIGlzX3ZhbGlkOworfSBwc19wYWlyX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX2Jvb2wgaXNfcnVubmluZzsKKyAgICBiY21vbHRfcHNfZ2xvYmFsX2NmZyBjZmc7CisgICAgcHNfcGFpcl9zdGF0ZSAqcGFpcnM7CisgICAgdWludDMyX3Qgc3dpdGNoX3N0YXJ0X3RpbWVfdXM7Cit9IHBzX2dsb2JhbF9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgb3NfbXNnOworICAgIGJjbW9sdF9wc19wb24gcG9uOworICAgIGJjbW9sdF9hdXRvICppbmQ7Cit9IHBzX3Rhc2tfbXNnOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBQU19QT05fTU9ERV9JTlZBTElELAorICAgIFBTX1BPTl9NT0RFX0dQT04sCisgICAgUFNfUE9OX01PREVfRVBPTiwKKyAgICBQU19QT05fTU9ERV9YR1BPTiwKK30gcHNfcG9uX21vZGU7CisKK3N0YXRpYyBwc19nbG9iYWxfc3RhdGUgcHNfc3RhdGUgPSB7fTsKK3N0YXRpYyBiY21vc19tdXRleCBwc19tdXRleDsKK3N0YXRpYyBiY21vc190YXNrIHBzX3Rhc2s7CisKKyNpZmRlZiBFTkFCTEVfTE9HCitzdGF0aWMgZGV2X2xvZ19pZCBwc19sb2dfaWQ7CitkZXZfbG9nX2lkIHBzX2dldF9sb2dfaWQodm9pZCkKK3sKKyAgICByZXR1cm4gcHNfbG9nX2lkOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBwc19wb25fZXF1YWwoY29uc3QgYmNtb2x0X3BzX3BvbiAqYSwgY29uc3QgYmNtb2x0X3BzX3BvbiAqYikKK3sKKyAgICByZXR1cm4gYS0+ZGV2aWNlX2lkID09IGItPmRldmljZV9pZCAmJiBhLT5wb25faWQgPT0gYi0+cG9uX2lkOworfQorCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgcHNfcGFpcl9lcXVhbChjb25zdCBiY21vbHRfcHNfcGFpciAqYSwgY29uc3QgYmNtb2x0X3BzX3BhaXIgKmIpCit7CisgICAgcmV0dXJuIHBzX3Bvbl9lcXVhbCgmYS0+c3RhbmRieSwgJmItPnN0YW5kYnkpICYmIHBzX3Bvbl9lcXVhbCgmYS0+d29ya2luZywgJmItPndvcmtpbmcpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3BzX3Bvbl9wYWlyX2dldChjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGJjbW9sdF9wc19wYWlyICoqcGFpcikKK3sKKyAgICB1aW50MTZfdCBpOworCisgICAgaWYgKCFwc19zdGF0ZS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgKnBhaXIgPSBOVUxMOworICAgICAgICBQU19FUlIoIlBTIGFwcGxpY2F0aW9uIG5vdCBydW5uaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfU1RBVEU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzOyBpKyspCisgICAgeworICAgICAgICBpZiAocHNfc3RhdGUucGFpcnNbaV0uaXNfdmFsaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwc19wb25fZXF1YWwocG9uLCAmcHNfc3RhdGUucGFpcnNbaV0ucGFpci5zdGFuZGJ5KSB8fAorICAgICAgICAgICAgICAgIHBzX3Bvbl9lcXVhbChwb24sICZwc19zdGF0ZS5wYWlyc1tpXS5wYWlyLndvcmtpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYWlyID0gJnBzX3N0YXRlLnBhaXJzW2ldLnBhaXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2luaXRfdGFzayh2b2lkKQoreworICAgIGJjbW9zX3Rhc2tfcGFybSB0YXNrX3BhcmFtcyA9CisgICAgeworICAgICAgICAubmFtZSA9ICJ1c2VyX2FwcGxfcHMiLAorICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9QUywKKyAgICAgICAgLmNvcmUgPSBCQ01PU19DUFVfQ09SRV9BTlksIC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgICAgICAuaW5pdF9oYW5kbGVyID0gTlVMTAorICAgIH07CisKKyAgICByZXR1cm4gYmNtb3NfdGFza19jcmVhdGUoJnBzX3Rhc2ssICZ0YXNrX3BhcmFtcyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19pbml0X21vZHVsZSh2b2lkKQoreworICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnFwYXJtID0geyAubmFtZSA9ICJ1c2VyX2FwcGxfcHMiLCAuc2l6ZSA9IFBTX1RBU0tfTVNHX1FfU0laRSB9CisgICAgfTsKKworICAgIHJldHVybiBiY21vc19tb2R1bGVfY3JlYXRlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfUFMsICZwc190YXNrLCAmbW9kdWxlX3BhcmFtcyk7Cit9CisKK3N0YXRpYyBwc19wb25fbW9kZSBwc19wb25fbW9kZV9nZXQoYmNtb2x0X2RldmlkIGRldikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworCisgICAgZXJyID0gYmNtb2x0X3N5c3RlbV9tb2RlX2dldChkZXYsICZzeXN0ZW1fbW9kZSk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBTX1BPTl9NT0RFX0lOVkFMSUQ7CisgICAgfQorICAgIHN3aXRjaCAoc3lzdGVtX21vZGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzRfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fMTZfWDoKKyAgICAgICAgcmV0dXJuIFBTX1BPTl9NT0RFX0dQT047CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMTZfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF9DT0VYSVNURU5DRV9URE1BOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF9DT0VYSVNURU5DRV9URE1BOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HOgorICAgICAgICByZXR1cm4gUFNfUE9OX01PREVfRVBPTjsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX180X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fOF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHU19fMl9YXzEwX0c6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX18yX1hfMTBfRzoKKyAgICAgICAgcmV0dXJuIFBTX1BPTl9NT0RFX1hHUE9OOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBQU19QT05fTU9ERV9JTlZBTElEOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHNfaGFuZGxlX21zZyhiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBwc190YXNrX21zZyAqbXNnID0gKHBzX3Rhc2tfbXNnICopb3NfbXNnOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIC8qIHByb2Nlc3MgdGhlIGluZGljYXRpb24gKi8KKyAgICBpZiAobXNnLT5pbmQtPmhkci5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0RFVklDRSB8fCBtc2ctPmluZC0+aGRyLm9ial90eXBlID09IEJDTU9MVF9PQkpfSURfREVCVUcpCisgICAgeworICAgICAgICAvKiB0aGVyZSdzIG5vIG5lZWQgdG8gbWlycm9yIGRldmljZS1sZXZlbCBpbmRpY2F0aW9ucyAqLworICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzd2l0Y2ggKHBzX3Bvbl9tb2RlX2dldChtc2ctPnBvbi5kZXZpY2VfaWQpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgUFNfUE9OX01PREVfR1BPTjoKKyAgICAgICAgICAgIGVyciA9IHBzX3Byb2Nlc3NfaW5kX2dwb24oJm1zZy0+cG9uLCBtc2ctPmluZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQU19QT05fTU9ERV9FUE9OOgorICAgICAgICAgICAgZXJyID0gcHNfcHJvY2Vzc19pbmRfZXBvbigmbXNnLT5wb24sIG1zZy0+aW5kKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBTX1BPTl9NT0RFX1hHUE9OOgorICAgICAgICAgICAgZXJyID0gcHNfcHJvY2Vzc19pbmRfeGdwb24oJm1zZy0+cG9uLCBtc2ctPmluZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfU1RBVEU7IC8qIG5vdCBhIHN1cHBvcnRlZCBzeXN0ZW0gbW9kZSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vbHRfYXV0byAqaW5kID0gbXNnLT5pbmQ7CisKKyAgICAgICAgUFNfRVJSKCJFcnJvciBwcm9jZXNzaW5nIGluZGljYXRpb24gKG9ial90eXBlPSV1LCBzdWJncm91cD0ldSk6ICVzXG4iLCBpbmQtPmhkci5vYmpfdHlwZSwgaW5kLT5oZHIuc3ViZ3JvdXAsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgIH0KKworICAgIC8qIGZyZWUgdGhlIGNsb25lZCBpbmRpY2F0aW9uIHNpbmNlIHdlJ3JlIGRvbmUgcHJvY2Vzc2luZyBpdCAqLworICAgIGJjbW9sdF9tc2dfZnJlZSgmbXNnLT5pbmQtPmhkcik7CisKKyAgICAvKiBmcmVlIHRoZSBpbnRlcm5hbCBPUyBtZXNzYWdlIGhhbmRsZSAqLworICAgIGJjbW9zX2ZyZWUob3NfbXNnKTsKK30KKwordm9pZCBiY21vbHRfcHNfYXBwbF9pbml0KHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisjaWZkZWYgRU5BQkxFX0xPRworICAgIHBzX2xvZ19pZCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJ1c2VyX2FwcGxfcHMiLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyNlbmRpZgorCisgICAgZXJyID0gYmNtb3NfbXV0ZXhfY3JlYXRlKCZwc19tdXRleCwgMCwgTlVMTCk7CisgICAgQlVHX09OKGVyciAhPSBCQ01fRVJSX09LKTsKKworICAgIGVyciA9IHBzX2luaXRfdGFzaygpOworICAgIEJVR19PTihlcnIgIT0gQkNNX0VSUl9PSyk7CisKKyAgICBlcnIgPSBwc19pbml0X21vZHVsZSgpOworICAgIEJVR19PTihlcnIgIT0gQkNNX0VSUl9PSyk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19hcHBsX3N0YXJ0KGNvbnN0IGJjbW9sdF9wc19nbG9iYWxfY2ZnICpjZmcpCit7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKHBzX3N0YXRlLmlzX3J1bm5pbmcpCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICAgICAgUFNfRVJSKCJQUyBhcHBsaWNhdGlvbiBhbHJlYWR5IHJ1bm5pbmdcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9TVEFURTsKKyAgICB9CisKKyAgICBwc19zdGF0ZS5jZmcgPSAqY2ZnOworICAgIHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzID0gKHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzID09IDApID8gUFNfREVGQVVMVF9NQVhfUEFJUlMgOiBwc19zdGF0ZS5jZmcubWF4X251bV9wYWlyczsKKyAgICBwc19zdGF0ZS5wYWlycyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKnBzX3N0YXRlLnBhaXJzKSAqIHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzKTsKKyAgICBpZiAocHNfc3RhdGUucGFpcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9NRU1aRVJPX1NUUlVDVCgmcHNfc3RhdGUpOworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICAgICAgUFNfRVJSKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBwc19zdGF0ZS5pc19ydW5uaW5nID0gQkNNT1NfVFJVRTsKKworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworICAgIFBTX0lORk8oIlBTIGFwcGxpY2F0aW9uIHN0YXJ0ZWRcbiIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21vbHRfcHNfYXBwbF9zdG9wKHZvaWQpCit7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKCFwc19zdGF0ZS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgICAgIFBTX0VSUigiUFMgYXBwbGljYXRpb24gbm90IHJ1bm5pbmdcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9TVEFURTsKKyAgICB9CisKKyAgICBwc19zdGF0ZS5pc19ydW5uaW5nID0gQkNNT1NfRkFMU0U7CisKKyAgICBiY21vc19mcmVlKHBzX3N0YXRlLnBhaXJzKTsKKyAgICBCQ01fTUVNWkVST19TVFJVQ1QoJnBzX3N0YXRlKTsKKworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworICAgIFBTX0lORk8oIlBTIGFwcGxpY2F0aW9uIHN0b3BwZWRcbiIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19ib29sIGJjbW9sdF9wc19hcHBsX2lzX3J1bm5pbmcodm9pZCkKK3sKKyAgICBiY21vc19ib29sIHJldDsKKyAgICBiY21vc19tdXRleF9sb2NrKCZwc19tdXRleCk7CisgICAgcmV0ID0gcHNfc3RhdGUuaXNfcnVubmluZzsKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitiY21vc19lcnJubyBiY21vbHRfcHNfZ2xvYmFsX2NmZ19nZXQoYmNtb2x0X3BzX2dsb2JhbF9jZmcgKmNmZykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKCFwc19zdGF0ZS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCJQUyBhcHBsaWNhdGlvbiBub3QgcnVubmluZ1xuIik7CisgICAgICAgIGVyciA9IEJDTV9FUlJfU1RBVEU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpjZmcgPSBwc19zdGF0ZS5jZmc7CisgICAgICAgIGVyciA9IEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgcmV0dXJuIGVycjsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3BzX2dsb2JhbF9jZmdfdXBkYXRlKGNvbnN0IGJjbW9sdF9wc19nbG9iYWxfY2ZnICpjZmcpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9zX211dGV4X2xvY2soJnBzX211dGV4KTsKKworICAgIGlmICghcHNfc3RhdGUuaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIFBTX0VSUigiUFMgYXBwbGljYXRpb24gbm90IHJ1bm5pbmdcbiIpOworICAgICAgICBlcnIgPSBCQ01fRVJSX1NUQVRFOworICAgIH0KKyAgICBlbHNlIGlmIChjZmctPm1heF9udW1fcGFpcnMgIT0gcHNfc3RhdGUuY2ZnLm1heF9udW1fcGFpcnMpCisgICAgeworICAgICAgICBQU19FUlIoImNhbm5vdCBjaGFuZ2UgbWF4IG51bWJlciBvZiBwcm90ZWN0ZWQgcGFpcnMgd2hpbGUgcnVubmluZ1xuIik7CisgICAgICAgIGVyciA9IEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHNfc3RhdGUuY2ZnID0gKmNmZzsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICByZXR1cm4gZXJyOworfQorCitiY21vc19lcnJubyBiY21vbHRfcHNfcGFpcnNfZ2V0KHVpbnQxNl90IGFycmF5X2xlbiwgYmNtb2x0X3BzX3BhaXIgKnBhaXJzLCB1aW50MTZfdCAqbnVtX3dyaXR0ZW4pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIHVpbnQxNl90IGk7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZwc19tdXRleCk7CisKKyAgICBpZiAoIXBzX3N0YXRlLmlzX3J1bm5pbmcpCisgICAgeworICAgICAgICBQU19FUlIoIlBTIGFwcGxpY2F0aW9uIG5vdCBydW5uaW5nXG4iKTsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9TVEFURTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKm51bV93cml0dGVuID0gMDsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9PSzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwc19zdGF0ZS5wYWlyc1tpXS5pc192YWxpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKm51bV93cml0dGVuID09IGFycmF5X2xlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBTX0VSUigiYXJyYXkgc2l6ZSB0b28gc21hbGwgdG8gY29sbGVjdCBhbGwgcGFpcnNcbiIpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYWlyc1sqbnVtX3dyaXR0ZW5dID0gcHNfc3RhdGUucGFpcnNbaV0ucGFpcjsKKyAgICAgICAgICAgICAgICAoKm51bV93cml0dGVuKSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgcmV0dXJuIGVycjsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3BhaXJfYWRkKGNvbnN0IGJjbW9sdF9wc19wYWlyICpwYWlyKQoreworICAgIHVpbnQxNl90IGk7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKCFwc19zdGF0ZS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCJQUyBhcHBsaWNhdGlvbiBub3QgcnVubmluZ1xuIik7CisgICAgICAgIGVyciA9IEJDTV9FUlJfU1RBVEU7CisgICAgfQorICAgIGVsc2UgaWYgKHBzX3Bvbl9lcXVhbCgmcGFpci0+d29ya2luZywgJnBhaXItPnN0YW5kYnkpKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCJBIFBPTiBjYW5ub3QgcHJvdGVjdCBpdHNlbGZcbiIpOworICAgICAgICBlcnIgPSBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVyciA9IEJDTV9FUlJfT0s7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwc19zdGF0ZS5jZmcubWF4X251bV9wYWlyczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHNfc3RhdGUucGFpcnNbaV0uaXNfdmFsaWQgJiYKKyAgICAgICAgICAgICAgICAocHNfcG9uX2VxdWFsKCZwYWlyLT53b3JraW5nLCAmcHNfc3RhdGUucGFpcnNbaV0ucGFpci53b3JraW5nKSB8fAorICAgICAgICAgICAgICAgIHBzX3Bvbl9lcXVhbCgmcGFpci0+d29ya2luZywgJnBzX3N0YXRlLnBhaXJzW2ldLnBhaXIuc3RhbmRieSkgfHwKKyAgICAgICAgICAgICAgICBwc19wb25fZXF1YWwoJnBhaXItPnN0YW5kYnksICZwc19zdGF0ZS5wYWlyc1tpXS5wYWlyLndvcmtpbmcpIHx8CisgICAgICAgICAgICAgICAgcHNfcG9uX2VxdWFsKCZwYWlyLT5zdGFuZGJ5LCAmcHNfc3RhdGUucGFpcnNbaV0ucGFpci5zdGFuZGJ5KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFNfRVJSKCJPbmUgb2YgdGhlIFBPTnMgd2FzIGFscmVhZHkgcHJlc2VudCBpbiBhbiBleGlzdGluZyBwYWlyXG4iKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX0FMUkVBRFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfTk9SRVM7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHNfc3RhdGUuY2ZnLm1heF9udW1fcGFpcnM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBzX3N0YXRlLnBhaXJzW2ldLmlzX3ZhbGlkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHNfc3RhdGUucGFpcnNbaV0ucGFpciA9ICpwYWlyOworICAgICAgICAgICAgICAgICAgICBwc19zdGF0ZS5wYWlyc1tpXS5pc192YWxpZCA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgPT0gQkNNX0VSUl9OT1JFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQU19FUlIoIk5vdCBlbm91Z2ggbWVtb3J5IGF2YWlsYWJsZSB0byBhZGQgcGFpclxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICByZXR1cm4gZXJyOworfQorCitiY21vc19lcnJubyBiY21vbHRfcHNfcG9uX3JlbW92ZShjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgdWludDE2X3QgaTsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZwc19tdXRleCk7CisKKyAgICBpZiAoIXBzX3N0YXRlLmlzX3J1bm5pbmcpCisgICAgeworICAgICAgICBQU19FUlIoIlBTIGFwcGxpY2F0aW9uIG5vdCBydW5uaW5nXG4iKTsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9TVEFURTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwc19zdGF0ZS5wYWlyc1tpXS5pc192YWxpZCAmJgorICAgICAgICAgICAgICAgIChwc19wb25fZXF1YWwocG9uLCAmcHNfc3RhdGUucGFpcnNbaV0ucGFpci53b3JraW5nKSB8fAorICAgICAgICAgICAgICAgIHBzX3Bvbl9lcXVhbChwb24sICZwc19zdGF0ZS5wYWlyc1tpXS5wYWlyLnN0YW5kYnkpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwc19zdGF0ZS5wYWlyc1tpXS5pc192YWxpZCA9IEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSBCQ01fRVJSX05PRU5UKQorICAgICAgICB7CisgICAgICAgICAgICBQU19FUlIoIlNwZWNpZmllZCBQT04gbm90IGZvdW5kXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworICAgIHJldHVybiBlcnI7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19wb25fc3RhdGVfZ2V0KGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgYmNtb2x0X3BzX3Bvbl9zdGF0ZSAqc3RhdGUsIGJjbW9sdF9wc19wb24gKnBhcnRuZXIpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wc19wYWlyICpwYWlyOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworICAgIGVyciA9IGJjbW9sdF9wc19wb25fcGFpcl9nZXQocG9uLCAmcGFpcik7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBpZiAocHNfcG9uX2VxdWFsKHBvbiwgJnBhaXItPnN0YW5kYnkpKQorICAgICAgICB7CisgICAgICAgICAgICAqc3RhdGUgPSBCQ01PTFRfUFNfUE9OX1NUQVRFX1NUQU5EQlk7CisgICAgICAgICAgICAqcGFydG5lciA9IHBhaXItPndvcmtpbmc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqc3RhdGUgPSBCQ01PTFRfUFNfUE9OX1NUQVRFX1dPUktJTkc7CisgICAgICAgICAgICAqcGFydG5lciA9IHBhaXItPnN0YW5kYnk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIGVsc2UgaWYgKGVyciA9PSBCQ01fRVJSX05PRU5UKQorICAgIHsKKyAgICAgICAgKnN0YXRlID0gQkNNT0xUX1BTX1BPTl9TVEFURV9VTkFTU09DSUFURUQ7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3Byb2Nlc3NfaW5kKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgYmNtb2x0X2F1dG8gKmluZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X21zZyAqaW5kX2Nsb25lID0gTlVMTDsKKworICAgIGlmICghYmNtb2x0X3BzX2FwcGxfaXNfcnVubmluZygpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgLyogTWFrZSBhIGNvcHkgb2YgYWxsIGluZGljYXRpb25zIHJlY2VpdmVkIHNvIHRoZXkgY2FuIGJlIGhhbmRsZWQgbGF0ZXIgYXN5bmNocm9ub3VzbHkuIFdlIGRvbid0IHZhbGlkYXRlIFBPTiBzdGF0ZQorICAgICAqIGhlcmUgc2luY2UgaXQgbWlnaHQgY2hhbmdlIGJlZm9yZSB3ZSBnZXQgYXJvdW5kIHRvIGhhbmRsaW5nIGl0LgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgY291bGQgYmUgb3B0aW1pemVkIHRvIGZpbHRlciBvdXQgaW5kaWNhdGlvbnMgdGhhdCBhcmVuJ3QgcmVsZXZhbnQgZm9yIHByb3RlY3Rpb24gc3dpdGNoaW5nIGJlZm9yZQorICAgICAqIGNvcHlpbmcgdGhlbSwgYnV0IHRoaXMgaXMgbGVmdCBvdXQgZm9yIHNpbXBsaWNpdHkuICovCisgICAgZXJyID0gYmNtb2x0X21zZ19jbG9uZSgmaW5kX2Nsb25lLCAmaW5kLT5oZHIpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIFBTX0VSUigiSW5kaWNhdGlvbiBjbG9uZSBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBzZW5kIHRoaXMgaW5kaWNhdGlvbiB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgcHNfdGFza19tc2cgKm1zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKm1zZykpOworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBTX0VSUigiTWVzc2FnZSBjYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKGluZF9jbG9uZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIG1zZy0+b3NfbXNnLmhhbmRsZXIgPSBwc19oYW5kbGVfbXNnOworICAgIG1zZy0+b3NfbXNnLnJlbGVhc2UgPSBiY21vbHRfb3NfbXNnX3JlbGVhc2VfY2I7CisgICAgbXNnLT5wb24gPSAqcG9uOworICAgIG1zZy0+aW5kID0gKGJjbW9sdF9hdXRvICopaW5kX2Nsb25lOworCisgICAgZXJyID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfUFMsICZtc2ctPm9zX21zZywgMCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCJNZXNzYWdlIHNlbmQgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfcHNfY2hhbmdlX3Bvbl90b19zdGFuZGJ5KGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBQU19JTkZPKCJTd2l0Y2hpbmcgUE9OIDwlZDolZD4gd29ya2luZy0+c3RhbmRieVxuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkKTsKKyAgICBzd2l0Y2ggKHBzX3Bvbl9tb2RlX2dldChwb24tPmRldmljZV9pZCkpCisgICAgeworICAgIGNhc2UgUFNfUE9OX01PREVfR1BPTjoKKyAgICAgICAgZXJyID0gcHNfbW92ZV90b19zdGFuZGJ5X2dwb24ocG9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQU19QT05fTU9ERV9FUE9OOgorICAgICAgICBlcnIgPSBwc19tb3ZlX3RvX3N0YW5kYnlfZXBvbihwb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBTX1BPTl9NT0RFX1hHUE9OOgorICAgICAgICBlcnIgPSBwc19tb3ZlX3RvX3N0YW5kYnlfeGdwb24ocG9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyID0gQkNNX0VSUl9TVEFURTsgLyogbm90IGEgc3VwcG9ydGVkIHN5c3RlbSBtb2RlICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBQU19FUlIoIjwlZDolZD4gd29ya2luZy0+c3RhbmRieSBBUEkgZmFpbGVkOiAlc1xuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9wc19jaGFuZ2VfcG9uX3RvX3dvcmtpbmcoY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIFBTX0lORk8oIlN3aXRjaGluZyBQT04gPCVkOiVkPiBzdGFuZGJ5LT53b3JraW5nXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQpOworICAgIHN3aXRjaCAocHNfcG9uX21vZGVfZ2V0KHBvbi0+ZGV2aWNlX2lkKSkKKyAgICB7CisgICAgY2FzZSBQU19QT05fTU9ERV9HUE9OOgorICAgICAgICBlcnIgPSBwc19tb3ZlX3RvX3dvcmtpbmdfZ3Bvbihwb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBTX1BPTl9NT0RFX0VQT046CisgICAgICAgIGVyciA9IHBzX21vdmVfdG9fd29ya2luZ19lcG9uKHBvbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUFNfUE9OX01PREVfWEdQT046CisgICAgICAgIGVyciA9IHBzX21vdmVfdG9fd29ya2luZ194Z3Bvbihwb24pOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBlcnIgPSBCQ01fRVJSX1NUQVRFOyAvKiBub3QgYSBzdXBwb3J0ZWQgc3lzdGVtIG1vZGUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIFBTX0VSUigiPCVkOiVkPiBzdGFuZGJ5LT53b3JraW5nIEFQSSBmYWlsZWQ6ICVzXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3BzX2Rpc2FibGVfdHhfb3B0aWNzKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbikKK3sKKyAgICBQU19JTkZPKCJEaXNhYmxpbmcgVFJYIGZvciBQT04gPCVkOiVkOiVkPlxuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkLCBwb24tPnRyYW5zY2VpdmVyX2lkKTsKKworICAgIC8qIFRoaXMgZGlzYWJsZXMgdGhlIFRYIG9wdGljYWwgY2hhbm5lbCBvbiBhIGdpdmVuIFBPTiBwb3J0IG9uIHRoZSBCQ002ODYyMCBTVksgYm9hcmQuCisgICAgICAgRm9yIG90aGVyIGJvYXJkcywgdGhpcyBtdXN0IGJlIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIGJvYXJkIGRlc2lnbi4gKi8KKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIHJldHVybiBiY21fYm9hcmRfdHJ4X2VuYWJsZShwb24tPnRyYW5zY2VpdmVyX2lkLCBCQ01PU19GQUxTRSk7CisjZWxzZQorICAgIHJldHVybiBCQ01fRVJSX09LOworI2VuZGlmCit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfcHNfZW5hYmxlX3R4X29wdGljcyhjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICBiY21vc19lcnJubyByZXQ7CisjZW5kaWYKKworICAgIFBTX0lORk8oIkVuYWJsaW5nIFRSWCBmb3IgUE9OIDwlZDolZDolZD5cbiIsIHBvbi0+ZGV2aWNlX2lkLCBwb24tPnBvbl9pZCwgcG9uLT50cmFuc2NlaXZlcl9pZCk7CisKKyAgICAvKiBUaGlzIGVuYWJsZXMgdGhlIFRYIG9wdGljYWwgY2hhbm5lbCBvbiBhIGdpdmVuIFBPTiBwb3J0IG9uIHRoZSBCQ002ODYyMCBTVksgYm9hcmQuCisgICAgICAgRm9yIG90aGVyIGJvYXJkcywgdGhpcyBtdXN0IGJlIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIGJvYXJkIGRlc2lnbi4gKi8KKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIHJldCA9IGJjbV9ib2FyZF90cnhfZW5hYmxlKHBvbi0+dHJhbnNjZWl2ZXJfaWQsIEJDTU9TX1RSVUUpOworICAgIGJjbW9zX3VzbGVlcChwc19zdGF0ZS5jZmcudHJ4X3dhcm1pbmdfZGVsYXkpOworICAgIHJldHVybiByZXQ7CisjZWxzZQorICAgIHJldHVybiBCQ01fRVJSX09LOworI2VuZGlmCit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19zd2l0Y2hfcGVyZm9ybShjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wc19wYWlyICpwYWlyOworICAgIGJjbW9sdF9wc19wb24gdGVtcF9wb247CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZwc19tdXRleCk7CisgICAgcHNfc3RhdGUuc3dpdGNoX3N0YXJ0X3RpbWVfdXMgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICBlcnIgPSBiY21vbHRfcHNfcG9uX3BhaXJfZ2V0KHBvbiwgJnBhaXIpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChwc19zdGF0ZS5jZmcuc3dpdGNoX3NlcXVlbmNlID09IEJDTU9MVF9QU19TV0lUQ0hfU0VRVUVOQ0VfVFJYX0ZJUlNUKQorICAgIHsKKyAgICAgICAgLyogc3RlcCAxOiBkaXNhYmxlIG9wdGljYWwgVFggY2hhbm5lbCBvZiB0aGUgd29ya2luZyBQT04gKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X3BzX2Rpc2FibGVfdHhfb3B0aWNzKCZwYWlyLT53b3JraW5nKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdGVwIDI6IGVuYWJsZSBvcHRpY2FsIFRYIGNoYW5uZWwgb2YgdGhlIHN0YW5kYnkgUE9OICovCisgICAgICAgIGVyciA9IGJjbW9sdF9wc19lbmFibGVfdHhfb3B0aWNzKCZwYWlyLT5zdGFuZGJ5KTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdGVwIDM6IGNoYW5nZSB0aGUgc3RhbmRieSBQT04gc3RhdGUgdG8gd29ya2luZyAqLworICAgICAgICBlcnIgPSBiY21vbHRfcHNfY2hhbmdlX3Bvbl90b193b3JraW5nKCZwYWlyLT5zdGFuZGJ5KTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdGVwIDQ6IGNoYW5nZSB0aGUgd29ya2luZyBQT04gc3RhdGUgdG8gc3RhbmRieSAqLworICAgICAgICBlcnIgPSBiY21vbHRfcHNfY2hhbmdlX3Bvbl90b19zdGFuZGJ5KCZwYWlyLT53b3JraW5nKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBwc19zdGF0ZS5jZmcuc3dpdGNoX3NlcXVlbmNlID09IEJDTU9MVF9QU19TV0lUQ0hfU0VRVUVOQ0VfU1RBTkRBUkQgKi8KKyAgICB7CisgICAgICAgIC8qIHN0ZXAgMTogY2hhbmdlIHRoZSB3b3JraW5nIFBPTiBzdGF0ZSB0byBzdGFuZGJ5ICovCisgICAgICAgIGVyciA9IGJjbW9sdF9wc19jaGFuZ2VfcG9uX3RvX3N0YW5kYnkoJnBhaXItPndvcmtpbmcpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0ZXAgMjogZGlzYWJsZSBvcHRpY2FsIFRYIGNoYW5uZWwgb2YgdGhlIHdvcmtpbmcgUE9OICovCisgICAgICAgIGVyciA9IGJjbW9sdF9wc19kaXNhYmxlX3R4X29wdGljcygmcGFpci0+d29ya2luZyk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgLyogc3RlcCAzOiBlbmFibGUgb3B0aWNhbCBUWCBjaGFubmVsIG9mIHRoZSBzdGFuZGJ5IFBPTiAqLworICAgICAgICBlcnIgPSBiY21vbHRfcHNfZW5hYmxlX3R4X29wdGljcygmcGFpci0+c3RhbmRieSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgLyogc3RlcCA0OiBjaGFuZ2UgdGhlIHN0YW5kYnkgUE9OIHN0YXRlIHRvIHdvcmtpbmcgKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X3BzX2NoYW5nZV9wb25fdG9fd29ya2luZygmcGFpci0+c3RhbmRieSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgfQorCisgICAgLyogc3RlcCA1OiB1cGRhdGUgaW50ZXJuYWwgZGF0YWJhc2UgZm9yIG5ldyBQT04gc3RhdGVzICovCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworICAgIHRlbXBfcG9uID0gcGFpci0+d29ya2luZzsKKyAgICBwYWlyLT53b3JraW5nID0gcGFpci0+c3RhbmRieTsKKyAgICBwYWlyLT5zdGFuZGJ5ID0gdGVtcF9wb247CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisKK2V4aXQ6CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygKKyAgICAgICAgICAgICI8JWQ6JWQ+IHN3aXRjaG92ZXIgc3RhcnRlZCBzdWNjZXNzZnVsbHkgKDwlZDolZD4gaXMgbm93IHN0YW5kYnkpXG4iLAorICAgICAgICAgICAgcGFpci0+d29ya2luZy5kZXZpY2VfaWQsCisgICAgICAgICAgICBwYWlyLT53b3JraW5nLnBvbl9pZCwKKyAgICAgICAgICAgIHBhaXItPnN0YW5kYnkuZGV2aWNlX2lkLAorICAgICAgICAgICAgcGFpci0+c3RhbmRieS5wb25faWQpOworICAgIH0KKyAgICBlbHNlIGlmIChwYWlyKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygKKyAgICAgICAgICAgICI8JWQ6JWQ+IHN3aXRjaG92ZXIgZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzXG4iLAorICAgICAgICAgICAgcGFpci0+d29ya2luZy5kZXZpY2VfaWQsCisgICAgICAgICAgICBwYWlyLT53b3JraW5nLnBvbl9pZCwKKyAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3VpbnQzMl90IHBzX2dldF9sYXN0X3N3aXRjaF9zdGFydF90aW1lX3VzKHZvaWQpCit7CisgICAgdWludDMyX3QgcmV0OworICAgIGJjbW9zX211dGV4X2xvY2soJnBzX211dGV4KTsKKyAgICByZXQgPSBwc19zdGF0ZS5zd2l0Y2hfc3RhcnRfdGltZV91czsKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDIyNGJlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9QU19IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9QU19IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCisvKiogQ29uZGl0aW9ucyB0aGF0IGNhbiBjYXVzZSBhIHByb3RlY3Rpb24gc3dpdGNoIHRvIGJlIHBlcmZvcm1lZC4gKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9QU19TV0lUQ0hfQ09ORElUSU9OX0xPUywgICAgLyoqPCBTd2l0Y2ggd2hlbiBMb1MgYWxhcm0gaXMgcmVjZWl2ZWQgZm9yIGEgd29ya2luZyBQT04uICovCisgICAgQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTUFOVUFMLCAvKio8IERvIG5vdCBzd2l0Y2ggYXV0b21hdGljYWxseS4gKi8KK30gYmNtb2x0X3BzX3N3aXRjaF9jb25kaXRpb247CisKKy8qKiBIb3cgcHJvdmlzaW9uaW5nIHNob3VsZCBiZSBtaXJyb3JlZCBmcm9tIHdvcmtpbmcgdG8gc3RhbmRieS4gKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9QU19NSVJST1JfTU9ERV9BVVRPLCAvKio8IFdoZW5ldmVyIGFuIGluZGljYXRpb24gaXMgcmVjZWl2ZWQgb24gdGhlIHdvcmtpbmcgUE9OLCBtaXJyb3IgYWxsIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdG8gc3RhbmRieSBQT04uICovCisgICAgQkNNT0xUX1BTX01JUlJPUl9NT0RFX05PTkUsIC8qKjwgRG8gbm90IGF1dG9tYXRpY2FsbHkgbWlycm9yIGFueSBwcm92aXNpb25pbmcgZnJvbSB3b3JraW5nIHRvIHN0YW5kYnkuICovCit9IGJjbW9sdF9wc19taXJyb3JfbW9kZTsKKworLyoqIFdoYXQgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgc2hvdWxkIGJlIHdoZW4gcGVyZm9ybWluZyBhIHN3aXRjaG92ZXIuICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfUFNfU1dJVENIX1NFUVVFTkNFX1NUQU5EQVJELCAgLyoqPCAic3RhbmRhcmQiIG9yZGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IENoYW5nZSB0aGUgd29ya2luZyBQT04gc3RhdGUgdG8gc3RhbmRieS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBEaXNhYmxlIG9wdGljYWwgVFggY2hhbm5lbCBvZiB3b3JraW5nIFBPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOiBFbmFibGUgb3B0aWNhbCBUWCBjaGFubmVsIG9mIHN0YW5kYnkgUE9OLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6IENoYW5nZSB0aGUgc3RhbmRieSBQT04gc3RhdGUgdG8gd29ya2luZy4gKi8KKyAgICBCQ01PTFRfUFNfU1dJVENIX1NFUVVFTkNFX1RSWF9GSVJTVCwgLyoqPCBQZXJmb3JtIHRyYW5zY2VpdmVyIGVuYWJsZS9kaXNhYmxlIGZpcnN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IERpc2FibGUgb3B0aWNhbCBUWCBjaGFubmVsIG9mIHdvcmtpbmcgUE9OLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6IEVuYWJsZSBvcHRpY2FsIFRYIGNoYW5uZWwgb2Ygc3RhbmRieSBQT04uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogQ2hhbmdlIHRoZSBzdGFuZGJ5IFBPTiBzdGF0ZSB0byB3b3JraW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6IENoYW5nZSB0aGUgd29ya2luZyBQT04gc3RhdGUgdG8gc3RhbmRieS4gKi8KK30gYmNtb2x0X3BzX3N3aXRjaF9zZXF1ZW5jZTsKKworLyoqIEdsb2JhbCBjb25maWd1cmF0aW9uIGZvciB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgYXBwbGljYXRpb24uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQxNl90IG1heF9udW1fcGFpcnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBwcm90ZWN0ZWQgcGFpcnMgc3VwcG9ydGVkLiAqLworICAgIGJjbW9sdF9wc19zd2l0Y2hfY29uZGl0aW9uIHN3aXRjaF9jb25kaXRpb247ICAgLyoqPCBDb25kaXRpb24gdGhhdCBzaG91bGQgY2F1c2UgYSBzd2l0Y2hvdmVyLiAqLworICAgIGJjbW9sdF9wc19zd2l0Y2hfc2VxdWVuY2Ugc3dpdGNoX3NlcXVlbmNlOyAgICAgLyoqPCBPcmRlciBvZiBvcGVyYXRpb25zIHdoZW4gcGVyZm9ybWluZyBhIHN3aXRjaG92ZXIuICovCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIG9ubHkgdXNlZCBpbiBHUE9OIG1vZGUuICovCisgICAgYmNtb2x0X3BzX21pcnJvcl9tb2RlIG1pcnJvcl9tb2RlOyAgICAgICAgICAgICAvKio8IEhvdyBwcm92aXNpb25pbmcgc2hvdWxkIGJlIG1pcnJvcmVkIGZyb20gd29ya2luZyB0byBzdGFuZGJ5LiAqLworICAgIGJjbW9zX2Jvb2wgbWlycm9yX21hY19lbnRyaWVzOyAgICAgICAgICAgICAgICAgLyoqPCBJZiBUUlVFLCBtaXJyb3IgYWxsIE1BQyBsZWFybmluZyBlbnRyaWVzIHRvIHRoZSBzdGFuZGJ5IFBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGxlYXJuaW5nIGluZGljYXRpb25zIGFyZSByZWNlaXZlZCBmcm9tIHRoZSB3b3JraW5nIFBPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIGFsc28gY2F1c2UgZW50cmllcyB0byBiZSBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2luZyBpbmRpY2F0aW9ucyBhcmUgcmVjZWl2ZWQgYW5kIG1vdmVkIHdoZW4gTUFDIG1vdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGlvbnMgYXJlIHJlY2VpdmVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdGljX21hY19lbnRyaWVzOyAgICAgICAgICAgICAgICAgLyoqPCBJZiBUUlVFLCB3aGVuIGVudHJpZXMgYXJlIG1pcnJvcmVkIHRvIHRoZSBzdGFuZGJ5IFBPTiwgdHJlYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbSBhcyAic3RhdGljIiAobm90IGFnZWQpLiAqLworICAgIHVpbnQzMl90IHRyeF93YXJtaW5nX2RlbGF5OyAgICAgICAgICAgICAgICAgICAgLyoqPCBEZWxheSAoaW4gdXNlYykgdG8gd2FpdCBhZnRlciBUUlggZW5hYmxlLCBpbiBvcmRlciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyYW50ZWUgdGhhdCBQT1BVUCBQTE9BTXMgYXJlIGNvcnJlY3RseSBzZWVuIGJ5IE9OVXMuICovCit9IGJjbW9sdF9wc19nbG9iYWxfY2ZnOworCisvKiogQSBzaW5nbGUgUE9OIG9uIGFuIE9MVCBkZXZpY2UgLSBoYWxmIG9mIGEgcHJvdGVjdGVkIHBhaXIuICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgYmNtb2x0X3Bvbl9uaSBwb25faWQ7CisgICAgYmNtb2x0X3Bvbl9uaSB0cmFuc2NlaXZlcl9pZDsKK30gYmNtb2x0X3BzX3BvbjsKKworLyoqIEEgcHJvdGVjdGVkIHBhaXIgb2YgUE9Ocywgb24gdGhlIHNhbWUgT0xUIGRldmljZSBvciBkaWZmZXJlbnQgZGV2aWNlcy4gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X3BzX3BvbiB3b3JraW5nOworICAgIGJjbW9sdF9wc19wb24gc3RhbmRieTsKK30gYmNtb2x0X3BzX3BhaXI7CisKKy8qKiBQb3NzaWJsZSBzdGF0ZXMgZm9yIGEgc2luZ2xlIFBPTiBmcm9tIGEgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgcG9pbnQtb2Ytdmlldy4gKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9QU19QT05fU1RBVEVfVU5BU1NPQ0lBVEVELCAvKio8IFRoZSBQT04gaXMgbm90IHBhcnQgb2YgYSBwcm90ZWN0ZWQgcGFpci4gKi8KKyAgICBCQ01PTFRfUFNfUE9OX1NUQVRFX1dPUktJTkcsICAgICAgLyoqPCBUaGUgUE9OIGlzIGRlc2lnbmF0ZWQgYXMgd29ya2luZyB3aXRoIHRoZSBUUlggZW5hYmxlZCB3aGlsZSBhY3RpdmUuICovCisgICAgQkNNT0xUX1BTX1BPTl9TVEFURV9TVEFOREJZLCAgICAgIC8qKjwgVGhlIFBPTiBpcyBkZXNpZ25hdGVkIGFzIHN0YW5kYnkgd2l0aCB0aGUgVFJYIGRpc2FibGVkIHdoaWxlIGFjdGl2ZS4gKi8KK30gYmNtb2x0X3BzX3Bvbl9zdGF0ZTsKKworLyoqIEluaXRpYWxpemUgdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uICh0aGlzIHNob3VsZCBiZSBjYWxsZWQgYXMgcGFydCBvZiBhcHBsaWNhdGlvbiBzdGFydHVwKS4gKi8KK3ZvaWQgYmNtb2x0X3BzX2FwcGxfaW5pdCh2b2lkKTsKKworLyoqIFN0YXJ0IHRoZSBwcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBsaWNhdGlvbiAodGhpcyBpcyBnbG9iYWwgZm9yIHRoZSBlbnRpcmUgc3lzdGVtKS4KKyAqCisgKiBccGFyYW1baW5dIGNmZyBHbG9iYWwgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbi4KKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGFwcGxpY2F0aW9uIHdhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfcHNfYXBwbF9zdGFydChjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqY2ZnKTsKKworLyoqIFN0b3AgdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uICh0aGlzIGlzIGdsb2JhbCBmb3IgdGhlIGVudGlyZSBzeXN0ZW0pLgorICoKKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGFwcGxpY2F0aW9uIHdhcyBzdG9wcGVkIHN1Y2Nlc3NmdWxseSwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfcHNfYXBwbF9zdG9wKHZvaWQpOworCisvKiogUXVlcnkgd2hldGhlciB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgYXBwbGljYXRpb24gaXMgY3VycmVudGx5IHJ1bm5pbmcuCisgKgorICogXHJldHVybiAgICAgICAgQkNNT1NfVFJVRSBpZiB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZywgQkNNT1NfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitiY21vc19ib29sIGJjbW9sdF9wc19hcHBsX2lzX3J1bm5pbmcodm9pZCk7CisKKy8qKiBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJ1bm5pbmcgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgYXBwbGljYXRpb24gKHRoaXMgaXMgZ2xvYmFsIGZvciB0aGUgZW50aXJlIHN5c3RlbSkuCisgKgorICogXHBhcmFtW291dF0gY2ZnIEdsb2JhbCBwcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uLgorICogXHJldHVybiAgICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX2dsb2JhbF9jZmdfZ2V0KGJjbW9sdF9wc19nbG9iYWxfY2ZnICpjZmcpOworCisvKiogQ2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBydW5uaW5nIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uICh0aGlzIGlzIGdsb2JhbCBmb3IgdGhlIGVudGlyZSBzeXN0ZW0pLgorICoKKyAqIFxwYXJhbVtpbl0gY2ZnIEdsb2JhbCBwcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uLgorICogXHJldHVybiAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgY29uZmlndXJhdGlvbiB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX2dsb2JhbF9jZmdfdXBkYXRlKGNvbnN0IGJjbW9sdF9wc19nbG9iYWxfY2ZnICpjZmcpOworCisvKiogR2V0IHRoZSBsaXN0IG9mIGFsbCBwcm90ZWN0ZWQgcGFpcnMgY3VycmVudGx5IHRyYWNrZWQgYnkgdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uLgorICoKKyAqIFxwYXJhbVtpbl0gIGFycmF5X2xlbiAgIFRoZSBsZW5ndGggb2YgdGhlIHBhaXJzIGFycmF5LgorICogXHBhcmFtW291dF0gcGFpcnMgICAgICAgQW4gYXJyYXkgb2YgcHJvdGVjdGVkIHBhaXJzIHRvIGZpbGwuCisgKiBccGFyYW1bb3V0XSBudW1fd3JpdHRlbiBUaGUgbnVtYmVyIG9mIHBhaXJzIHdyaXR0ZW4gdG8gdGhlIGFycmF5LgorICogXHJldHVybiAgICAgICAgICAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgYXJyYXkgd2FzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19wYWlyc19nZXQodWludDE2X3QgYXJyYXlfbGVuLCBiY21vbHRfcHNfcGFpciAqcGFpcnMsIHVpbnQxNl90ICpudW1fd3JpdHRlbik7CisKKy8qKiBBZGQgYSBwcm90ZWN0ZWQgcGFpciB0byB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgZGF0YWJhc2UuCisgKgorICogQWZ0ZXIgdGhpcyBoYXMgYmVlbiBjYWxsZWQsIHByb3Zpc2lvbmluZyB3aWxsIGJlIG1pcnJvcmVkIGZyb20gdGhlIHdvcmtpbmcgUE9OIHRvIHRoZSBzdGFuZGJ5IFBPTiBhY2NvcmRpbmcgdG8gdGhlCisgKiBtaXJyb3JfbW9kZSBnbG9iYWwgcGFyYW1ldGVyLCBhbmQgYSBzd2l0Y2ggd2lsbCBiZSBwZXJmb3JtZWQgcGVyIHRoZSBzd2l0Y2hfY29uZGl0aW9uIGdsb2JhbCBwYXJhbWV0ZXIuCisgKgorICogXHBhcmFtW2luXSBwYWlyIEEgcGFpciBvZiBQT05zIHRvIGFkZCAtIHRoZXkgY2FuIGJlIG9uIHRoZSBzYW1lIE9MVCBkZXZpY2Ugb3IgZGlmZmVyZW50IGRldmljZXMuCisgKiBccmV0dXJuICAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgcGFpciB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19wYWlyX2FkZChjb25zdCBiY21vbHRfcHNfcGFpciAqcGFpcik7CisKKy8qKiBSZW1vdmUgdGhlIHByb3RlY3RlZCBwYWlyIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBQT04gZnJvbSB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgZGF0YWJhc2UuCisqCisqIFxwYXJhbVtpbl0gcG9uIEEgUE9OIHRoYXQgaXMgYSBtZW1iZXIgb2YgYSBwcm90ZWN0aW9uIHBhaXIuCisqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIFBPTiB3YXMgcmVtb3ZlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyovCitiY21vc19lcnJubyBiY21vbHRfcHNfcG9uX3JlbW92ZShjb25zdCBiY21vbHRfcHNfcG9uICpwb24pOworCisvKiogUXVlcnkgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgcHJvdGVjdGVkIFBPTi4KKyoKKyogXHBhcmFtW2luXSAgcG9uICAgICBUaGUgUE9OIHRvIHF1ZXJ5LgorKiBccGFyYW1bb3V0XSBzdGF0ZSAgIFRoZSBwcm90ZWN0aW9uIHN0YXRlIG9mIHRoZSBQT04gKGUuZy4gd29ya2luZy9zdGFuZGJ5KS4KKyogXHBhcmFtW291dF0gcGFydG5lciBJZiB0aGlzIFBPTiBpcyBwcm90ZWN0ZWQsIHRoZSBvdGhlciBoYWxmIG9mIHRoZSBwcm90ZWN0ZWQgcGFpci4KKyogXHJldHVybiAgICAgICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBQT04gd2FzIHF1ZXJpZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3Bvbl9zdGF0ZV9nZXQoY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBiY21vbHRfcHNfcG9uX3N0YXRlICpzdGF0ZSwgYmNtb2x0X3BzX3BvbiAqcGFydG5lcik7CisKKy8qKiBQcm9jZXNzIGFuIGluZGljYXRpb24gcmVjZWl2ZWQgYnkgdGhlIHdvcmtpbmcgUE9OLgorICoKKyAqIFRoZSBhY3Rpb24gdGFrZW4gd2lsbCBkZXBlbmQgb24gdGhlIG9iamVjdC9pbmRpY2F0aW9uIHR5cGUgYW5kIHRoZSBtaXJyb3JfbW9kZSBnbG9iYWwgcGFyYW1ldGVyLgorICogSWYgdGhlIGFwcGxpY2F0aW9uIGlzbid0IHJ1bm5pbmcsIHRoZSBzdXBwbGllZCBQT04gaXNuJ3QgaW4gYSBwcm90ZWN0ZWQgd29ya2luZyBzdGF0ZSBvciB0aGUgaW5kaWNhdGlvbiBpc24ndAorICogcmVsZXZhbnQgZm9yIHByb3RlY3Rpb24gc3dpdGNoaW5nLCB0aGUgaW5kaWNhdGlvbiB3aWxsIGJlIGlnbm9yZWQuCisgKgorICogTm90ZTogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBmcmVlIHRoZSBpbmRpY2F0aW9uLgorICogVGhlIGNhbGxlciBtdXN0IGZyZWUgaXQgdXNpbmcgYmNtb3NfbXNnX2ZyZWUoKSBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogXHBhcmFtW2luXSBwb24gVGhlIFBPTiBvbiB3aGljaCB0aGUgaW5kaWNhdGlvbiB3YXMgcmVjZWl2ZWQuCisgKiBccGFyYW1baW5dIGluZCBUaGUgaW5kaWNhdGlvbiB0aGF0IHdhcyByZWNlaXZlZC4KKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGluZGljYXRpb24gd2FzIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkgb3IgaWdub3JlZCwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfcHNfcHJvY2Vzc19pbmQoY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBiY21vbHRfYXV0byAqaW5kKTsKKworLyoqIEltbWVkaWF0ZWx5IHBlcmZvcm0gYSBwcm90ZWN0aW9uIHN3aXRjaCBvbiB0aGUgZ2l2ZW4gUE9OLCB3aGljaCBtdXN0IGJlbG9uZyB0byBhIHByb3RlY3RlZCBwYWlyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IGludGVuZGVkIGZvciB1c2Ugd2l0aCB0aGUgQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTUFOVUFMIHN3aXRjaCBjb25kaXRpb24sIG9yIGZvcgorICogZGVidWdnaW5nIHB1cnBvc2VzLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3Qgd2FpdCBmb3IgdGhlIHN3aXRjaCB0byBjb21wbGV0ZSAtIGl0IG1lcmVseSBqdXN0IGNvbmZpZ3VyZXMgdGhlIHRyYW5zY2VpdmVycyBhbmQgaW5pdGlhdGVzCisgKiB0aGUgUE9OIHN0YXRlIHRyYW5zaXRpb25zLiAgVG8gd2FpdCBmb3IgY29tcGxldGlvbiwgdGhlIGhvc3QgbXVzdCB3YWl0IGZvciB0aGUgUE9OIE5JIHN0YXRlIGNoYW5nZSBjb21wbGV0ZSBvcgorICogInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIiBpbmRpY2F0aW9ucyB0byBiZSByZWNlaXZlZC4KKyAqCisgKiBccGFyYW1baW5dIHBhaXIgVGhlIFBPTiBvbiB3aGljaCB0byBwZXJmb3JtIHRoZSBzd2l0Y2ggKGVpdGhlciB0aGUgd29ya2luZyBvciBzdGFuZGJ5IFBPTiBvZiBhIHByb3RlY3RlZCBwYWlyKS4KKyAqIFxyZXR1cm4gICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBzd2l0Y2ggd2FzIHN1Y2Nlc3NmdWwsIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3N3aXRjaF9wZXJmb3JtKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2NsaS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NWJkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfY2xpLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHNfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wcy5oIgorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfY21kX3N0YXJ0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm07CisgICAgYmNtb2x0X3BzX2dsb2JhbF9jZmcgY2ZnID0ge307CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X3BhaXJzIik7CisgICAgaWYgKHBhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNmZy5tYXhfbnVtX3BhaXJzID0gKHVpbnQxNl90KXBhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3dpdGNoX2NvbmRpdGlvbiIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcuc3dpdGNoX2NvbmRpdGlvbiA9IChiY21vbHRfcHNfc3dpdGNoX2NvbmRpdGlvbilwYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorCisgICAgcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN3aXRjaF9zZXF1ZW5jZSIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcuc3dpdGNoX3NlcXVlbmNlID0gKGJjbW9sdF9wc19zd2l0Y2hfc2VxdWVuY2UpcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaXJyb3JfbW9kZSIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcubWlycm9yX21vZGUgPSAoYmNtb2x0X3BzX21pcnJvcl9tb2RlKXBhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWlycm9yX21hY19lbnRyaWVzIik7CisgICAgaWYgKHBhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNmZy5taXJyb3JfbWFjX2VudHJpZXMgPSAoYmNtb3NfYm9vbClwYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorCisgICAgcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRpY19tYWNfZW50cmllcyIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcuc3RhdGljX21hY19lbnRyaWVzID0gKGJjbW9zX2Jvb2wpcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cnhfd2FybWluZ19kZWxheSIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcudHJ4X3dhcm1pbmdfZGVsYXkgPSBwYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9wc19hcHBsX3N0YXJ0KCZjZmcpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfY21kX3N0b3AoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfcHNfYXBwbF9zdG9wKCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19jbWRfZ2V0X2NmZyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wc19nbG9iYWxfY2ZnIGNmZzsKKyAgICAKKyAgICBlcnIgPSBiY21vbHRfcHNfZ2xvYmFsX2NmZ19nZXQoJmNmZyk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAibWF4X3BhaXJzPSVkXG4iLCBjZmcubWF4X251bV9wYWlycyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgIHNlc3Npb24sCisgICAgICAgICJzd2l0Y2hfY29uZGl0aW9uPSVzXG4iLAorICAgICAgICBjZmcuc3dpdGNoX2NvbmRpdGlvbiA9PSBCQ01PTFRfUFNfU1dJVENIX0NPTkRJVElPTl9MT1MgPyAibG9zIiA6ICJtYW51YWwiKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgInN3aXRjaF9zZXF1ZW5jZT0lc1xuIiwKKyAgICAgICAgY2ZnLnN3aXRjaF9zZXF1ZW5jZSA9PSBCQ01PTFRfUFNfU1dJVENIX1NFUVVFTkNFX1NUQU5EQVJEID8gInN0ZCIgOiAidHJ4X2ZpcnN0Iik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgIHNlc3Npb24sCisgICAgICAgICJtaXJyb3JfbW9kZT0lc1xuIiwKKyAgICAgICAgY2ZnLm1pcnJvcl9tb2RlID09IEJDTU9MVF9QU19NSVJST1JfTU9ERV9BVVRPID8gImF1dG8iIDogIm5vbmUiKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAibWlycm9yX21hY19lbnRyaWVzPSVzXG4iLCBjZmcubWlycm9yX21hY19lbnRyaWVzID8gInllcyIgOiAibm8iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAic3RhdGljX21hY19lbnRyaWVzPSVzXG4iLCBjZmcuc3RhdGljX21hY19lbnRyaWVzID8gInllcyIgOiAibm8iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAidHJ4X3dhcm1pbmdfZGVsYXk9JXVcbiIsIGNmZy50cnhfd2FybWluZ19kZWxheSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2NtZF9zaG93X3BhaXJzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3BzX2dsb2JhbF9jZmcgY2ZnOworICAgIGJjbW9sdF9wc19wYWlyICpwYWlyczsKKyAgICB1aW50MTZfdCBudW1fd3JpdHRlbjsKKworICAgIGVyciA9IGJjbW9sdF9wc19nbG9iYWxfY2ZnX2dldCgmY2ZnKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHBhaXJzID0gYmNtb3NfY2FsbG9jKHNpemVvZigqcGFpcnMpICogY2ZnLm1heF9udW1fcGFpcnMpOworCisgICAgZXJyID0gYmNtb2x0X3BzX3BhaXJzX2dldChjZmcubWF4X251bV9wYWlycywgcGFpcnMsICZudW1fd3JpdHRlbik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgaTsKKworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiICAgICAgd29ya2luZyAgfCBzdGFuZGJ5XG4iKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiAgICAgID09PT09PT09PSs9PT09PT09PT1cbiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3dyaXR0ZW47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAiWyUyZF06ICUyZC4lMmQuJTJkIHwgJTJkLiUyZC4lMmRcbiIsCisgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICBwYWlyc1tpXS53b3JraW5nLmRldmljZV9pZCwKKyAgICAgICAgICAgICAgICBwYWlyc1tpXS53b3JraW5nLnBvbl9pZCwKKyAgICAgICAgICAgICAgICBwYWlyc1tpXS53b3JraW5nLnRyYW5zY2VpdmVyX2lkLAorICAgICAgICAgICAgICAgIHBhaXJzW2ldLnN0YW5kYnkuZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgIHBhaXJzW2ldLnN0YW5kYnkucG9uX2lkLAorICAgICAgICAgICAgICAgIHBhaXJzW2ldLnN0YW5kYnkudHJhbnNjZWl2ZXJfaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgYmNtb3NfZnJlZShwYWlycyk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2NtZF9hZGRfcGFpcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICp3b3JraW5nX2RldmljZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmcuZGV2aWNlIik7CisgICAgYmNtY2xpX2NtZF9wYXJtICp3b3JraW5nX3BvbiA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmcucG9uIik7CisgICAgYmNtY2xpX2NtZF9wYXJtICp3b3JraW5nX3RyYW5zY2VpdmVyID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZy50cmFuc2NlaXZlciIpOworICAgIGJjbWNsaV9jbWRfcGFybSAqc3RhbmRieV9kZXZpY2UgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGFuZGJ5LmRldmljZSIpOworICAgIGJjbWNsaV9jbWRfcGFybSAqc3RhbmRieV9wb24gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGFuZGJ5LnBvbiIpOworICAgIGJjbWNsaV9jbWRfcGFybSAqc3RhbmRieV90cmFuc2NlaXZlciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YW5kYnkudHJhbnNjZWl2ZXIiKTsKKworICAgIGJjbW9sdF9wc19wYWlyIHBhaXIgPQorICAgIHsKKyAgICAgICAgLndvcmtpbmcgPQorICAgICAgICB7CisgICAgICAgICAgICAuZGV2aWNlX2lkID0gKGJjbW9sdF9kZXZpZCl3b3JraW5nX2RldmljZS0+dmFsdWUubnVtYmVyLAorICAgICAgICAgICAgLnBvbl9pZCA9IChiY21vbHRfcG9uX25pKXdvcmtpbmdfcG9uLT52YWx1ZS5udW1iZXIsCisgICAgICAgICAgICAudHJhbnNjZWl2ZXJfaWQgPSAoYmNtb2x0X3Bvbl9uaSl3b3JraW5nX3RyYW5zY2VpdmVyLT52YWx1ZS5udW1iZXIKKyAgICAgICAgfSwKKyAgICAgICAgLnN0YW5kYnkgPQorICAgICAgICB7CisgICAgICAgICAgICAuZGV2aWNlX2lkID0gKGJjbW9sdF9kZXZpZClzdGFuZGJ5X2RldmljZS0+dmFsdWUubnVtYmVyLAorICAgICAgICAgICAgLnBvbl9pZCA9IChiY21vbHRfcG9uX25pKXN0YW5kYnlfcG9uLT52YWx1ZS5udW1iZXIsCisgICAgICAgICAgICAudHJhbnNjZWl2ZXJfaWQgPSAoYmNtb2x0X3Bvbl9uaSlzdGFuZGJ5X3RyYW5zY2VpdmVyLT52YWx1ZS5udW1iZXIKKyAgICAgICAgfSwKKyAgICB9OworCisgICAgLy8gU2V0IHRyYW5zY2VpdmVyX2lkIHRvIHBvbl9pZCBpZiBkZWZhdWx0CisgICAgaWYgKHBhaXIud29ya2luZy50cmFuc2NlaXZlcl9pZCA9PSAoYmNtb2x0X3Bvbl9uaSktMSkKKyAgICB7CisgICAgICAgIHBhaXIud29ya2luZy50cmFuc2NlaXZlcl9pZCA9IHBhaXIud29ya2luZy5wb25faWQ7CisgICAgfQorICAgIGlmIChwYWlyLnN0YW5kYnkudHJhbnNjZWl2ZXJfaWQgPT0gKGJjbW9sdF9wb25fbmkpLTEpCisgICAgeworICAgICAgICBwYWlyLnN0YW5kYnkudHJhbnNjZWl2ZXJfaWQgPSBwYWlyLnN0YW5kYnkucG9uX2lkOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfcHNfcGFpcl9hZGQoJnBhaXIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfY21kX3JlbW92ZV9wb24oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqZGV2aWNlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlIik7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwb24gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb24iKTsKKworICAgIGJjbW9sdF9wc19wb24gcHNfcG9uID0KKyAgICB7CisgICAgICAgIC5kZXZpY2VfaWQgPSAoYmNtb2x0X2RldmlkKWRldmljZS0+dmFsdWUubnVtYmVyLAorICAgICAgICAucG9uX2lkID0gKGJjbW9sdF9wb25fbmkpcG9uLT52YWx1ZS5udW1iZXIKKyAgICB9OworCisgICAgcmV0dXJuIGJjbW9sdF9wc19wb25fcmVtb3ZlKCZwc19wb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfY21kX3BlcmZvcm1fc3dpdGNoKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmRldmljZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZSIpOworICAgIGJjbWNsaV9jbWRfcGFybSAqcG9uID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uIik7CisKKyAgICBiY21vbHRfcHNfcG9uIHBzX3BvbiA9CisgICAgeworICAgICAgICAuZGV2aWNlX2lkID0gKGJjbW9sdF9kZXZpZClkZXZpY2UtPnZhbHVlLm51bWJlciwKKyAgICAgICAgLnBvbl9pZCA9IChiY21vbHRfcG9uX25pKXBvbi0+dmFsdWUubnVtYmVyCisgICAgfTsKKworICAgIHJldHVybiBiY21vbHRfcHNfc3dpdGNoX3BlcmZvcm0oJnBzX3Bvbik7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfcHNfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgc3dpdGNoX2NvbmRfdGFibGVbXSA9CisgICAgeworICAgICAgICB7IC5uYW1lID0gImxvcyIsICAgIC52YWwgPSBCQ01PTFRfUFNfU1dJVENIX0NPTkRJVElPTl9MT1MgfSwKKyAgICAgICAgeyAubmFtZSA9ICJtYW51YWwiLCAudmFsID0gQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTUFOVUFMIH0sCisgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICB9OworCisgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBzd2l0Y2hfc2VxX3RhYmxlW10gPQorICAgIHsKKyAgICAgICAgeyAubmFtZSA9ICJzdGQiLCAgICAgICAudmFsID0gQkNNT0xUX1BTX1NXSVRDSF9TRVFVRU5DRV9TVEFOREFSRCB9LAorICAgICAgICB7IC5uYW1lID0gInRyeF9maXJzdCIsIC52YWwgPSBCQ01PTFRfUFNfU1dJVENIX1NFUVVFTkNFX1RSWF9GSVJTVCB9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgbWlycm9yX21vZGVfdGFibGVbXSA9CisgICAgeworICAgICAgICB7IC5uYW1lID0gImF1dG8iLCAudmFsID0gQkNNT0xUX1BTX01JUlJPUl9NT0RFX0FVVE8gfSwKKyAgICAgICAgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9QU19NSVJST1JfTU9ERV9OT05FIH0sCisgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICB9OworCisgICAgYmNtY2xpX2VudHJ5ICpkaXIgPQorICAgICAgICBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCAicHMiLCAiUHJvdGVjdGlvbiBzd2l0Y2hpbmcgdXNlciBhcHBsaWNhdGlvbiIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUighZGlyLCBCQ01fRVJSX05PTUVNKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJzdGFydCIsICJTdGFydCBwcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBsaWNhdGlvbiIsIHBzX2NtZF9zdGFydCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWF4X3BhaXJzIiwgIk1heCBudW1iZXIgb2YgcHJvdGVjdGVkIHBhaXJzIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJzd2l0Y2hfY29uZGl0aW9uIiwgIlN3aXRjaCBjb25kaXRpb24iLCBzd2l0Y2hfY29uZF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgic3dpdGNoX3NlcXVlbmNlIiwgIlN3aXRjaCBzZXF1ZW5jZSIsIHN3aXRjaF9zZXFfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oIm1pcnJvcl9tb2RlIiwgIk1pcnJvciBtb2RlIiwgbWlycm9yX21vZGVfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oCisgICAgICAgICAgICAibWlycm9yX21hY19lbnRyaWVzIiwgIk1pcnJvciBNQUMgZW50cmllcyIsIGJjbWNsaV9lbnVtX2Jvb2xfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oCisgICAgICAgICAgICAic3RhdGljX21hY19lbnRyaWVzIiwgIlN0YXRpYyBNQUMgZW50cmllcyIsIGJjbWNsaV9lbnVtX2Jvb2xfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ0cnhfd2FybWluZ19kZWxheSIsICJUUlggd2FybWluZyBkZWxheSAoaW4gdXNlYykiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJzdG9wIiwgIlN0b3AgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgYXBwbGljYXRpb24iLCBwc19jbWRfc3RvcCk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgImdldF9jZmciLCAiU2hvdyBydW5uaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyIsIHBzX2NtZF9nZXRfY2ZnKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAic2hvd19wYWlycyIsICJTaG93IGN1cnJlbnQgcHJvdGVjdGVkIHBhaXJzIiwgcHNfY21kX3Nob3dfcGFpcnMpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImFkZF9wYWlyIiwgIkFkZCBwcm90ZWN0ZWQgcGFpciIsIHBzX2NtZF9hZGRfcGFpciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgid29ya2luZy5kZXZpY2UiLCAiRGV2aWNlIElEIG9mIHRoZSB3b3JraW5nIFBPTiIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIndvcmtpbmcucG9uIiwgIlBPTiBOSSBvZiB0aGUgd29ya2luZyBQT04iLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgid29ya2luZy50cmFuc2NlaXZlciIsICJUcmFuc2NlaXZlciBJZCBvZiB0aGUgd29ya2luZyBQT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsIC0xKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgic3RhbmRieS5kZXZpY2UiLCAiRGV2aWNlIElEIG9mIHRoZSBzdGFuZGJ5IFBPTiIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInN0YW5kYnkucG9uIiwgIlBPTiBOSSBvZiB0aGUgc3RhbmRieSBQT04iLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgic3RhbmRieS50cmFuc2NlaXZlciIsICJUcmFuc2NlaXZlciBJZCBvZiB0aGUgc3RhbmRieSBQT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsIC0xKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAicmVtb3ZlX3BvbiIsICJSZW1vdmUgcHJvdGVjdGVkIHBhaXIgZm9yIChlaXRoZXIpIFBPTiIsIHBzX2NtZF9yZW1vdmVfcG9uLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJkZXZpY2UiLCAiRGV2aWNlIElEIG9mIHRoZSBlaXRoZXIgd29ya2luZy9zdGFuZGJ5IFBPTiIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInBvbiIsICJQT04gTkkgb2YgdGhlIGVpdGhlciB3b3JraW5nL3N0YW5kYnkgUE9OIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAicGVyZm9ybV9zd2l0Y2giLCAiUGVyZm9ybSBwcm90ZWN0aW9uIHN3aXRjaCBtYW51YWxseSIsIHBzX2NtZF9wZXJmb3JtX3N3aXRjaCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZGV2aWNlIiwgIkRldmljZSBJRCBvZiB0aGUgZWl0aGVyIHdvcmtpbmcvc3RhbmRieSBQT04iLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJwb24iLCAiUE9OIE5JIG9mIHRoZSBlaXRoZXIgd29ya2luZy9zdGFuZGJ5IFBPTiIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCkpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3N2MwOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc19jbGkuaApAQCAtMCwwICsxLDM4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfUFNfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX1BTX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfcHNfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfZXBvbi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2Vwb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWI5M2NiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2Vwb24uYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmNtb3NfY29tbW9uLmg+CisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wcy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHNfaW50ZXJuYWwuaCIKKworCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX25pX25vX3JlcG9ydHMoYmNtb2x0X3BzX2dsb2JhbF9jZmcgKiBnbG9iYWxfY2ZnLCBjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHMgKiBpbmQpCit7CisgICAgaWYgKGluZC0+ZGF0YS5hbGFybV9zdGF0dXMgPT0gQkNNT0xUX1NUQVRVU19PRkYpCisgICAgeworICAgICAgICBQU19JTkZPKCI8JWQ6JWQ+IExvUyBhbGFybSBjbGVhcmVkXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKCI8JWQ6JWQ+IExvUyBhbGFybSByYWlzZWRcbiIsIHBvbi0+ZGV2aWNlX2lkLCBwb24tPnBvbl9pZCk7CisKKyAgICBpZiAoZ2xvYmFsX2NmZy0+c3dpdGNoX2NvbmRpdGlvbiA9PSBCQ01PTFRfUFNfU1dJVENIX0NPTkRJVElPTl9NQU5VQUwpCisgICAgeworICAgICAgICAvKiBkb24ndCByZWFjdCB0byB0aGUgc3dpdGNoIGlmIHdlJ3JlIGluIG1hbnVhbCBzd2l0Y2ggbW9kZSAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9wc19zd2l0Y2hfcGVyZm9ybShwb24pOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9sb2dpY2FsX2xpbmtfZGlzY292ZXJlZChiY21vbHRfcHNfZ2xvYmFsX2NmZyAqIGdsb2JhbF9jZmcsIGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWQgKiBpbmQpCit7CisgICAgYmNtb2x0X3BzX3Bvbl9zdGF0ZSBzdGF0ZTsKKyAgICBiY21vbHRfcHNfcG9uIHBhcnRuZXI7CisgICAgYmNtb3NfZXJybm8gcmVzdWx0OworCisgICAgaWYgKGdsb2JhbF9jZmctPm1pcnJvcl9tb2RlICE9IEJDTU9MVF9QU19NSVJST1JfTU9ERV9BVVRPKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIAorICAgIC8vQXQgdGhpcyBwb2ludCB3ZSBrbm93IHdlIGhhdmUgYSBsaW5rIGRpc2NvdmVyZWQgb24gYSBQT04gdGhhdCBpcyBpbiB0aGUgUFJPVEVDVEVEIFdPUktJTkcgc3RhdGUuCisgICAgLy9UaGlzIG1lYW5zIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaXMgaXMgc2V0dXAgb24gdGhlIFBST0NURUNURUQgU1RBTkRCWSBQT04uICBJdCBpcyBwb3NzaWJsZQorICAgIC8vVGhhdCB0aGlzIGxpbmsgaGFzIGJlZW4gcHJldmlvdXNseSBjb25maWd1cmVkIG9uIHRoZSBTVEFOREJZIFBPTiBzbyB3ZSBoYXZlIHRvIGhhbmRsZSB0aGF0IGNhc2UKKyAgICAvL2dyYWNlZnVsbHkgYXMgd2VsbC4KKyAgICByZXN1bHQgPSBiY21vbHRfcHNfcG9uX3N0YXRlX2dldChwb24sICZzdGF0ZSwgJnBhcnRuZXIpOworICAgIFBTX0lORk8oInBvbiAlZCwgYmNtb2x0X3BzX3Bvbl9zdGF0ZV9nZXQgcmVzdWx0ID09ICVkLCBzdGF0ZSA9PSAlZCwgcGFydG5lci5wb25faWQgPT0gJWRcbiIsIHBvbi0+cG9uX2lkLCByZXN1bHQsIHN0YXRlLCBwYXJ0bmVyLnBvbl9pZCk7CisgICAgaWYgKChCQ01fRVJSX09LID09IHJlc3VsdCkgJiYgKHN0YXRlID09IEJDTU9MVF9QU19QT05fU1RBVEVfV09SS0lORykpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluayBhZGRfc3RhbmRieSA9IHt9OworICAgICAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0ge307CisgICAgICAgIFBTX0lORk8oIk1pcnJvcmluZyByZWNlaXZlZCBsaW5rIGRpc2NvdmVyZWQgb24gd29ya2luZyBQT05cbiIpOworCisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKXBhcnRuZXIucG9uX2lkOyAgLy9TZXR1cCB0aGUgc3RhbmRieSBQT04gYXMgdGhlIGxvY2F0aW9uIHRvIGFkZCB0aGUgbGluay4KKyAgICAgICAgCisgICAgICAgIC8vU2V0dXAgb3BlcmF0aW9uIGtleSBmb3IgYXBpIGNhbGwuCisgICAgICAgIEJDTU9MVF9PUEVSX0lOSVQoJmFkZF9zdGFuZGJ5LCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywga2V5KTsKKworICAgICAgICAvL0NvcHkgb3ZlciB0aGUgZGF0YSBmcm9tIHRoZSByZWNlaXZlZCBtZXNzYWdlczoKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmFkZF9zdGFuZGJ5LCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywgbWFjX2FkZHJlc3MsIGluZC0+a2V5Lm1hY19hZGRyZXNzKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmFkZF9zdGFuZGJ5LCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywgd29ya2luZ19saW5rX2luZm8sIGluZC0+ZGF0YS5saW5rX2luZm8pOworCisgICAgICAgIHJlc3VsdCA9IGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLmRldmljZV9pZCwgJmFkZF9zdGFuZGJ5Lmhkcik7CisKKyAgICAgICAgLy9XZSBoYXZlIG11bHRpcGxlIGFjY2VwdGFibGUgcmV0dXJuIGNvZGVzIGhlcmU6ICAKKyAgICAgICAgLy8gIEJDTV9FUlJfT0sgICAgICAtIEluZGljYXRlcyBuZXcgZW50cnkgY3JlYXRlZC4KKyAgICAgICAgLy8gIEJDTV9FUlJfQUxSRUFEWSAtIEluZGljYXRlcyB0aGUgZW50cnkgYWxyZWFkeSBleGlzdHMgKHBvc3NpYmxlIGFmdGVyIGRlcmVnaXN0cmF0aW9uL3JlcmVnaXN0cmF0aW9uKS4KKyAgICAgICAgUFNfSU5GTygiTWlycm9yaW5nIGFkZCBwcm90ZWN0ZWQgc3RhbmRieSBsaW5rIHJlc3VsdCAlZFxuIiwgcmVzdWx0KTsKKworICAgICAgICBpZiAoIChyZXN1bHQgPT0gQkNNX0VSUl9PSykgfHwgKHJlc3VsdCA9PSBCQ01fRVJSX0FMUkVBRFkpICkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uIHN0YXRpY19yZWcgPSB7fTsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5ID0ge307CisKKyAgICAgICAgICAgIGxpbmtfa2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpcGFydG5lci5wb25faWQ7CisgICAgICAgICAgICBsaW5rX2tleS5tYWNfYWRkcmVzcyA9IGluZC0+a2V5Lm1hY19hZGRyZXNzOworCisgICAgICAgICAgICAvL1NldHVwIG9wZXJhdGlvbiBrZXkgZm9yIGFwaSBjYWxsLgorICAgICAgICAgICAgQkNNT0xUX09QRVJfSU5JVCgmc3RhdGljX3JlZywgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uLCBsaW5rX2tleSk7CisgICAgICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmc3RhdGljX3JlZywgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uLCBsYXNlcm9uX3RpbWVfdHEsIGluZC0+ZGF0YS5saW5rX2luZm8ub251X2xhc2VyX29uX3RpbWVfdHEpOworICAgICAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnN0YXRpY19yZWcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgbGFzZXJvZmZfdGltZV90cSwgaW5kLT5kYXRhLmxpbmtfaW5mby5vbnVfbGFzZXJfb2ZmX3RpbWVfdHEpOworICAgICAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnN0YXRpY19yZWcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgcmFuZ2VfdmFsdWVfdHEsIGluZC0+ZGF0YS5saW5rX2luZm8ucmFuZ2VfdmFsdWVfdHEpOworICAgICAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnN0YXRpY19yZWcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgcGVuZGluZ19ncmFudHMsIGluZC0+ZGF0YS5saW5rX2luZm8ucGVuZGluZ19ncmFudHMpOworICAgICAgICAgICAgcmVzdWx0ID0gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXIuZGV2aWNlX2lkLCAmc3RhdGljX3JlZy5oZHIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBTX0VSUigiU3RhdGljIHJlZ2lzdHJhdGlvbiBmYWlsZWQgJWRcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFNfSU5GTygiU3RhdGljIHJlZ2lzdHJhdGlvbiBzdWNjZXNzXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBTX0VSUigiQWRkIHByb3RlY3RlZCBzdGFuZGJ5IGZhaWxlZCAlZFxuIiwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gcHNfcHJvY2Vzc19pbmRfZXBvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGNvbnN0IGJjbW9sdF9hdXRvICppbmQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wc19nbG9iYWxfY2ZnIGdsb2JhbF9jZmc7CisKKyAgICBlcnIgPSBiY21vbHRfcHNfZ2xvYmFsX2NmZ19nZXQoJmdsb2JhbF9jZmcpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgUFNfSU5GTygicHNfcHJvY2Vzc19pbmRfZXBvbiBUeXBlOiAlZCBDRkdfSUQ6ICVkXG4iLCBpbmQtPmhkci5vYmpfdHlwZSwgaW5kLT5oZHIuc3ViZ3JvdXApOworICAgIHN3aXRjaCAoaW5kLT5oZHIub2JqX3R5cGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX05JOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTk9fUkVQT1JUUzoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfbmlfbm9fcmVwb3J0cygmZ2xvYmFsX2NmZywgcG9uLCAoKGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHMgKilpbmQpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICB9CisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fTElOSzoKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ESVNDT1ZFUkVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9sb2dpY2FsX2xpbmtfZGlzY292ZXJlZCgmZ2xvYmFsX2NmZywgcG9uLCAoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkICopaW5kKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBwc19tb3ZlX3RvX3N0YW5kYnlfZXBvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUgc2V0X3Bvbl9zdGF0ZTsgCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHt9OworICAgIGtleS5lcG9uX25pID0gcG9uLT5wb25faWQ7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZzZXRfcG9uX3N0YXRlLCBlcG9uX25pLCBzZXRfZXBvbl9uaV9lbl9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmc2V0X3Bvbl9zdGF0ZSwgZXBvbl9uaSwgc2V0X2Vwb25fbmlfZW5fc3RhdGUsIG5ld19zdGF0ZSwgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPVEVDVEVEX1NUQU5EQlkpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocG9uLT5kZXZpY2VfaWQsICZzZXRfcG9uX3N0YXRlLmhkcik7Cit9CisKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fd29ya2luZ19lcG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbikKK3sKKyAgICBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZSBzZXRfcG9uX3N0YXRlOworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7fTsKKyAgICBrZXkuZXBvbl9uaSA9IHBvbi0+cG9uX2lkOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmc2V0X3Bvbl9zdGF0ZSwgZXBvbl9uaSwgc2V0X2Vwb25fbmlfZW5fc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnNldF9wb25fc3RhdGUsIGVwb25fbmksIHNldF9lcG9uX25pX2VuX3N0YXRlLCBuZXdfc3RhdGUsIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBvbi0+ZGV2aWNlX2lkLCAmc2V0X3Bvbl9zdGF0ZS5oZHIpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc19ncG9uLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfZ3Bvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0M2U3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfZ3Bvbi5jCkBAIC0wLDAgKzEsODc4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wc19pbnRlcm5hbC5oIgorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX25pX2xvcygKKyAgICBjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqZ2xvYmFsX2NmZywKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwb24sCisgICAgY29uc3QgYmNtb2x0X2dwb25fbmlfbG9zICppbmQpCit7CisgICAgaWYgKGluZC0+ZGF0YS5zdGF0dXMgPT0gQkNNT0xUX1NUQVRVU19PRkYpCisgICAgeworICAgICAgICBQU19JTkZPKCI8JWQ6JWQ+IExvUyBhbGFybSBjbGVhcmVkXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKCI8JWQ6JWQ+IExvUyBhbGFybSByYWlzZWRcbiIsIHBvbi0+ZGV2aWNlX2lkLCBwb24tPnBvbl9pZCk7CisKKyAgICBpZiAoZ2xvYmFsX2NmZy0+c3dpdGNoX2NvbmRpdGlvbiA9PSBCQ01PTFRfUFNfU1dJVENIX0NPTkRJVElPTl9NQU5VQUwpCisgICAgeworICAgICAgICAvKiBkb24ndCByZWFjdCB0byB0aGUgc3dpdGNoIGlmIHdlJ3JlIGluIG1hbnVhbCBzd2l0Y2ggbW9kZSAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9wc19zd2l0Y2hfcGVyZm9ybShwb24pOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9uaV9zdGF0ZV9jaGFuZ2VkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCB9OworICAgIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUgb3BlcjsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLnByZXZpb3VzX3N0YXRlID09IEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkUgJiYKKyAgICAgICAgaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfUE9OX1NUQVRFX0FDVElWRV9XT1JLSU5HKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygiJXM6IGFjdGl2YXRpbmcgUE9OIDwlZDolZD5cbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlkpOworICAgIH0KKyAgICBlbHNlIGlmIChpbmQtPmRhdGEucHJldmlvdXNfc3RhdGUgPT0gQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfV09SS0lORyAmJgorICAgICAgICBpbmQtPmRhdGEubmV3X3N0YXRlID09IEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkUpCisgICAgeworICAgICAgICBQU19JTkZPKCIlczogZGVhY3RpdmF0aW5nIFBPTiA8JWQ6JWQ+XG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsIEJDTU9MVF9QT05fT1BFUkFUSU9OX0lOQUNUSVZFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogb25seSBjaGFuZ2UgdGhlIHN0YW5kYnkgUE9OJ3Mgc3RhdGUgaWYgd2UncmUgcHJlLXByb3Zpc2lvbmluZyB0aGUgd29ya2luZyBQT04KKyAgICAgICAgICAodGhlIHN3aXRjaG92ZXIgaXMgaGFuZGxlZCBzZXBhcmF0ZWx5KSAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9uaV90cmFmZmljX3Jlc3VtZSgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwb24sCisgICAgY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgKmluZCkKK3sKKyAgICB1aW50MzJfdCBhZnRlcl91cyAgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICB1aW50MzJfdCBiZWZvcmVfdXMgPSBwc19nZXRfbGFzdF9zd2l0Y2hfc3RhcnRfdGltZV91cygpOworICAgIHVpbnQzMl90IHRpbWVfdGFrZW5fdXMgPSAoYWZ0ZXJfdXMgPiBiZWZvcmVfdXMpID8gYWZ0ZXJfdXMgLSBiZWZvcmVfdXMgOiBiZWZvcmVfdXMgLSBhZnRlcl91czsKKyAgICBjb25zdCBjaGFyICp0cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyID0gTlVMTDsKKworICAgIHN3aXRjaCAoaW5kLT5kYXRhLnJlc3VsdCkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgIHRyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHIgPSAic3VjY2VzcyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9GQUlMVVJFOgorICAgICAgICB0cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyID0gImZhaWx1cmUiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfU1VTUEVDVEVEX0xPUzoKKyAgICAgICAgdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0ciA9ICJzdXNwZWN0ZWRfbG9zIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgUFNfSU5GTygKKyAgICAgICAgIjwlZDolZD4gVHJhZmZpYyByZXN1bWUgJXMuIFRpbWUgc2luY2Ugc3RhcnQgb2Ygc3dpdGNoOiAlZCBtcy5cbiIsCisgICAgICAgIHBvbi0+ZGV2aWNlX2lkLAorICAgICAgICBwb24tPnBvbl9pZCwKKyAgICAgICAgdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0ciwKKyAgICAgICAgdGltZV90YWtlbl91cyAvIDEwMDApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfbmlfb251c19yYW5nZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAqaW5kKQoreworICAgIHVpbnQzMl90IGk7CisgICAgYmNtb3NfZXJybm8gbGFzdF9lcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogYXBwbHkgYWxsIG9mIHRoZSBuZXcgT05VIEVRRHMgdG8gdGhlIHN0YW5kYnkgUE9OICovCisgICAgZm9yIChpID0gMDsgaSA8IGluZC0+ZGF0YS5vbnVzLmxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5kYXRhLm9udXMudmFsW2ldLm9udV9pZCB9OworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICAgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgICAgIFBTX0lORk8oCisgICAgICAgICAgICAiJXM6IHVwZGF0aW5nIEVRRCA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAgICAgIGtleS5wb25fbmksCisgICAgICAgICAgICBrZXkub251X2lkLAorICAgICAgICAgICAgaW5kLT5kYXRhLm9udXMudmFsW2ldLmVxZCk7CisKKyAgICAgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCByYW5naW5nX3RpbWUsIGluZC0+ZGF0YS5vbnVzLnZhbFtpXS5lcWQpOworICAgICAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBQU19FUlIoIkVRRCB1cGRhdGUgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICBsYXN0X2VyciA9IGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsYXN0X2VycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfcmFuZ2luZ19jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKworICAgIC8qIG9ubHkgcmVhY3QgdG8gc3VjY2VzcyBpbmRpY2F0aW9ucyAqLworICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzICE9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgRVFEIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmVxZCk7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lLCBpbmQtPmRhdGEuZXFkKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworCisgICAgUFNfSU5GTygiJXM6IHVwZGF0aW5nIEFFUyBrZXkgPCVkOiVkPiBPTlUgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkub251X2lkKTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhZXNfZW5jcnlwdGlvbl9rZXksIGluZC0+ZGF0YS5uZXdfa2V5KTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKworICAgIC8qIG9ubHkgcmVhY3QgdG8gc3VjY2VzcyBpbmRpY2F0aW9ucyAqLworICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzICE9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIFBTX0lORk8oIiVzOiB1cGRhdGluZyBwYXNzd29yZCA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkLCBpbmQtPmRhdGEucGFzc3dvcmQpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsKKworICAgIC8qIG9ubHkgcmVhY3QgdG8gc3VjY2VzcyBpbmRpY2F0aW9ucyAqLworICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzICE9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIFBTX0lORk8oIiVzOiBhY3RpdmF0aW5nIDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7CisKKyAgICAvKiBOb3RlOiB3ZSByZWFjdCB0byB0aGlzIGluZGljYXRpb24gd2hldGhlciBvciBub3QgdGhlIGRlYWN0aXZhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIEZhaWx1cmUgaW5kaWNhdGVzIHRoYXQgdGhlCisgICAgICogT05VIGRpZG4ndCByZXNwb25kIHRvIHRoZSBkZWFjdGl2YXRpb24sIGJ1dCB3ZSBzdGlsbCByZW1vdmUgdGhlIE9OVSBmcm9tIE9MVCBoYXJkd2FyZSBzbyBpdCBtdXN0IGJlIG1pcnJvcmVkLiAqLworCisgICAgUFNfSU5GTygiJXM6IGRlYWN0aXZhdGluZyA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0lOQUNUSVZFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZW5hYmxlX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7CisKKyAgICAvKiBkb24ndCB0cnkgdG8gbWlycm9yIGJyb2FkY2FzdCBlbmFibGUvZGlzYWJsZSAqLworICAgIGlmIChrZXkub251X2lkID09IEJDTU9MVF9HUE9OX09OVV9JRF9JTlZBTElEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygiJXM6IGVuYWJsaW5nIDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsKKworICAgIC8qIGRvbid0IHRyeSB0byBtaXJyb3IgYnJvYWRjYXN0IGVuYWJsZS9kaXNhYmxlICovCisgICAgaWYgKGtleS5vbnVfaWQgPT0gQkNNT0xUX0dQT05fT05VX0lEX0lOVkFMSUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKCIlczogZGlzYWJsaW5nIDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fRElTQUJMRSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyB2b2lkIHBzX2FsYXJtX3N0YXRlX2luaXQoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlICphbGFybV9zdGF0ZSkKK3sKKyAgICBhbGFybV9zdGF0ZS0+bG9zaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb2ZpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmxvYW1pID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmRnaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT50aXdpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmRvd2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+c3VmaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5zZmkgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+c2RpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmRmaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb2FpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmxva2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfYWxhcm0oY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hbGFybSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5sb3NpID0gaW5kLT5kYXRhLm9udV9hbGFybS5sb3NpOworICAgIGFsYXJtX3N0YXRlLmxvZmkgPSBpbmQtPmRhdGEub251X2FsYXJtLmxvZmk7CisgICAgYWxhcm1fc3RhdGUubG9hbWkgPSBpbmQtPmRhdGEub251X2FsYXJtLmxvYW1pOworICAgIAorICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgT05VIGFsYXJtcyA8JWQ6JWQ+IE9OVSAlZCAtPiAlZC8lZC8lZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGFsYXJtX3N0YXRlLmxvc2ksCisgICAgICAgIGFsYXJtX3N0YXRlLmxvZmksCisgICAgICAgIGFsYXJtX3N0YXRlLmxvYW1pKTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZG93aShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZG93aSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgRE9XaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZCAoRVFEICVkKVxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMsCisgICAgICAgIGluZC0+ZGF0YS5uZXdfZXFkKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5kb3dpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworCisgICAgaWYgKGluZC0+ZGF0YS5hbGFybV9zdGF0dXMgPT0gQkNNT0xUX1NUQVRVU19PTikKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSwgaW5kLT5kYXRhLm5ld19lcWQpOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfc2ZpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF9ncG9uX29udV9zZmkgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIFNGSSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLnNmaSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3NkaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBTRGkgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5zZGkgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9kZmkoY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X2dwb25fb251X2RmaSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgREZpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUuZGZpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfc3VmaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgU1VGaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLnN1ZmkgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9sb2FpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2FpICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBMT0FpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUubG9haSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2RnaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGdpICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBER2kgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5kZ2kgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV90aXdpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBUSVdpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUudGl3aSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2xva2koY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X2dwb25fb251X2xva2kgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIExPS2kgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5sb2tpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfb21jaV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5kYXRhLmdlbV9wb3J0IH07CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlIG9wZXI7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIGtleSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLm9wZXJhdGlvbiA9PSBCQ01PTFRfT01DSV9QT1JUX0lEX09QRVJBVElPTl9DT05GSUdVUkUpCisgICAgeworICAgICAgICAvKiBkb24ndCByZWFjdCB0byB1bnN1Y2Nlc3NmdWwgYWN0aXZhdGlvbnMgKi8KKyAgICAgICAgaWYgKGluZC0+ZGF0YS5zdGF0dXMgIT0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorCisgICAgICAgIFBTX0lORk8oIiVzOiBhY3RpdmF0aW5nIDwlZDolZD4gR0VNIHBvcnQgSUQgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkuZ2VtX3BvcnRfaWQpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9nZW1fcG9ydCwgc2V0X3N0YXRlLCBzdGF0ZSwgQkNNT0xUX0dFTV9QT1JUX09QRVJBVElPTl9BQ1RJVkFURSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBTX0lORk8oCisgICAgICAgICAgICAiJXM6IGRlYWN0aXZhdGluZyA8JWQ6JWQ+IEdFTSBwb3J0IElEICVkXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAgICAgIGtleS5nZW1fcG9ydF9pZCk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0RFQUNUSVZBVEUpOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocGFydG5lci0+ZGV2aWNlX2lkLCAmb3Blci5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX21hY190YWJsZV9uZXdfbWFjKAorICAgIGNvbnN0IGJjbW9sdF9wc19nbG9iYWxfY2ZnICpnbG9iYWxfY2ZnLAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjICppbmQpCit7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm1hY19hZGRyZXNzLCBpbmQtPmtleS52bGFuIH07CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnOworCisgICAgaWYgKCFnbG9iYWxfY2ZnLT5taXJyb3JfbWFjX2VudHJpZXMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogd2UgYXJlIG5vdCBjb25maWd1cmVkIHRvIG1pcnJvciBNQUMgZW50cmllcyAqLworICAgIH0KKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQsIGluZC0+ZGF0YS5mbG93X2lkKTsKKworICAgIGlmIChnbG9iYWxfY2ZnLT5zdGF0aWNfbWFjX2VudHJpZXMpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCwgQkNNT1NfVFJVRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0LCBCQ01PU19GQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX21hY190YWJsZV9tYWNfYWdlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqZ2xvYmFsX2NmZywKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkubWFjX2FkZHJlc3MsIGluZC0+a2V5LnZsYW4gfTsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7CisKKyAgICBpZiAoIWdsb2JhbF9jZmctPm1pcnJvcl9tYWNfZW50cmllcykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOyAvKiB3ZSBhcmUgbm90IGNvbmZpZ3VyZWQgdG8gbWlycm9yIE1BQyBlbnRyaWVzICovCisgICAgfQorCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19jbGVhcihwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9tYWNfdGFibGVfbWFjX21vdmUoCisgICAgY29uc3QgYmNtb2x0X3BzX2dsb2JhbF9jZmcgKmdsb2JhbF9jZmcsCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlICppbmQpCit7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm1hY19hZGRyZXNzLCBpbmQtPmtleS52bGFuIH07CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnOworCisgICAgaWYgKCFnbG9iYWxfY2ZnLT5taXJyb3JfbWFjX2VudHJpZXMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogd2UgYXJlIG5vdCBjb25maWd1cmVkIHRvIG1pcnJvciBNQUMgZW50cmllcyAqLworICAgIH0KKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQsIGluZC0+ZGF0YS5uZXdfZmxvd19pZCk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX2FsbG9jX2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5LmFsbG9jX2lkIH07CisgICAgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlIG9wZXI7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2FsbG9jLCBzZXRfc3RhdGUsIGtleSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfQUxMT0NfU1RBVEVfQUNUSVZFKQorICAgIHsKKyAgICAgICAgLyogZG9uJ3QgcmVhY3QgdG8gdW5zdWNjZXNzZnVsIGFjdGl2YXRpb25zICovCisgICAgICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzICE9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKworICAgICAgICBQU19JTkZPKCIlczogYWN0aXZhdGluZyA8JWQ6JWQ+IGFsbG9jICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5LmFsbG9jX2lkKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fYWxsb2MsIHNldF9zdGF0ZSwgc3RhdGUsIEJDTU9MVF9BTExPQ19PUEVSQVRJT05fQUNUSVZBVEUpOworICAgIH0KKyAgICBlbHNlIGlmIChpbmQtPmRhdGEubmV3X3N0YXRlID09IEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRSkKKyAgICB7CisgICAgICAgIFBTX0lORk8oIiVzOiBkZWFjdGl2YXRpbmcgPCVkOiVkPiBhbGxvYyAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5hbGxvY19pZCk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2FsbG9jLCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfQUxMT0NfT1BFUkFUSU9OX0RFQUNUSVZBVEUpOworICAgIH0KKyAgICBlbHNlIC8qIGluZC0+ZGF0YS5uZXdfc3RhdGUgaXMgc29tZXRoaW5nIGVsc2UgKGUuZy4gdW5wcm92aXNpb25lZCwgaWYgdGhlIGFsbG9jIHdhcyBjbGVhcmVkKSAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkuZ2VtX3BvcnRfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGUgb3BlcjsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fZ2VtX3BvcnQsIHNldF9zdGF0ZSwga2V5KTsKKworICAgIGlmIChpbmQtPmRhdGEubmV3X3N0YXRlID09IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0FDVElWRSkKKyAgICB7CisgICAgICAgIC8qIGRvbid0IHJlYWN0IHRvIHVuc3VjY2Vzc2Z1bCBhY3RpdmF0aW9ucyAqLworICAgICAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyAhPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICB9CisKKyAgICAgICAgUFNfSU5GTygiJXM6IGFjdGl2YXRpbmcgPCVkOiVkPiBHRU0gcG9ydCBJRCAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5nZW1fcG9ydF9pZCk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0FDVElWQVRFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9JTkFDVElWRSkKKyAgICB7CisgICAgICAgIFBTX0lORk8oCisgICAgICAgICAgICAiJXM6IGRlYWN0aXZhdGluZyA8JWQ6JWQ+IEdFTSBwb3J0IElEICVkXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAgICAgIGtleS5nZW1fcG9ydF9pZCk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0RFQUNUSVZBVEUpOworICAgIH0KKyAgICBlbHNlIC8qIGluZC0+ZGF0YS5uZXdfc3RhdGUgaXMgc29tZXRoaW5nIGVsc2UgKGUuZy4gdW5wcm92aXNpb25lZCwgaWYgdGhlIEdFTSBwb3J0IHdhcyBjbGVhcmVkKSAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK2JjbW9zX2Vycm5vIHBzX3Byb2Nlc3NfaW5kX2dwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBjb25zdCBiY21vbHRfYXV0byAqaW5kKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcHNfcG9uX3N0YXRlIHN0YXRlOworICAgIGJjbW9sdF9wc19wb24gcGFydG5lcjsKKyAgICBiY21vbHRfcHNfZ2xvYmFsX2NmZyBnbG9iYWxfY2ZnOworCisgICAgZXJyID0gYmNtb2x0X3BzX2dsb2JhbF9jZmdfZ2V0KCZnbG9iYWxfY2ZnKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChnbG9iYWxfY2ZnLm1pcnJvcl9tb2RlICE9IEJDTU9MVF9QU19NSVJST1JfTU9ERV9BVVRPICYmCisgICAgICAgIGluZC0+aGRyLnN1Ymdyb3VwICE9IEJDTU9MVF9HUE9OX05JX0FVVE9fSURfTE9TKQorICAgIHsKKyAgICAgICAgLyogb25seSBoYW5kbGUgbW9zdCBpbmRpY2F0aW9ucyB3aGlsZSBpbiBtaXJyb3IgbW9kZSAnYXV0bycsIGJ1dCBwZXJmb3JtIGEgc3dpdGNob3ZlciBvbiBMb1MgaW4gYW55IGNhc2UgICovCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIGVyciA9IGJjbW9sdF9wc19wb25fc3RhdGVfZ2V0KHBvbiwgJnN0YXRlLCAmcGFydG5lcik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUgIT0gQkNNT0xUX1BTX1BPTl9TVEFURV9XT1JLSU5HKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIGlnbm9yZSBpbmRpY2F0aW9ucyBmcm9tIFBPTnMgdGhhdCBhcmVuJ3QgcHJvdGVjdGVkIHdvcmtpbmcgKi8KKyAgICB9CisKKyAgICBzd2l0Y2ggKGluZC0+aGRyLm9ial90eXBlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9OSToKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfTE9TOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9uaV9sb3MoJmdsb2JhbF9jZmcsIHBvbiwgKChjb25zdCBiY21vbHRfZ3Bvbl9uaV9sb3MgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX25pX3N0YXRlX2NoYW5nZWQoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUU6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX25pX3RyYWZmaWNfcmVzdW1lKHBvbiwgKChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX25pX29udXNfcmFuZ2VkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkICopaW5kKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogc2lsZW50bHkgaWdub3JlIGFsbCBvdGhlciBOSSBpbmRpY2F0aW9ucyAqLworICAgICAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9PTlU6CisgICAgICAgIHN3aXRjaCAoaW5kLT5oZHIuc3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X3JhbmdpbmdfY29tcGxldGVkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkKAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQoCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQoCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9lbmFibGVfY29tcGxldGVkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2Rpc2FibGVfY29tcGxldGVkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUxBUk06CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9hbGFybSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2Rvd2koJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X2dwb25fb251X2Rvd2kgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TRkk6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9zZmkoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X2dwb25fb251X3NmaSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NESToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X3NkaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREZJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZGZpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kZmkgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TVUZJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfc3VmaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0xPQUk6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9sb2FpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2FpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREdJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZGdpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kZ2kgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfdGl3aSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfdGl3aSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0xPS0k6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9sb2tpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2tpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfb21jaV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgT05VIGluZGljYXRpb25zICovCisgICAgICAgIH0KKworICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfYWxsb2NfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQoCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgYWxsb2MgaW5kaWNhdGlvbnMgKi8KKyAgICAgICAgfQorCisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQ6CisgICAgICAgIHN3aXRjaCAoaW5kLT5oZHIuc3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCgKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogc2lsZW50bHkgaWdub3JlIGFsbCBvdGhlciBHRU0gcG9ydCBpbmRpY2F0aW9ucyAqLworICAgICAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9ORVdfTUFDOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9tYWNfdGFibGVfbmV3X21hYygKKyAgICAgICAgICAgICAgICAmZ2xvYmFsX2NmZywKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjICopaW5kKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19BR0VEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9tYWNfdGFibGVfbWFjX2FnZWQoCisgICAgICAgICAgICAgICAgJmdsb2JhbF9jZmcsCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQgKilpbmQpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX01PVkU6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX21hY190YWJsZV9tYWNfbW92ZSgKKyAgICAgICAgICAgICAgICAmZ2xvYmFsX2NmZywgCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmUgKilpbmQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgbWFjIHRhYmxlIGluZGljYXRpb25zICovCisgICAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7IC8qIHNvbWVvbmUgZWxzZSBuZWVkcyB0byBoYW5kbGUgdGhpcyBpbmRpY2F0aW9uICovCisgICAgfQorfQorCitiY21vc19lcnJubyBwc19tb3ZlX3RvX3N0YW5kYnlfZ3Bvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZSBzZXRfcG9uX3N0YXRlOworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IChiY21vbHRfZ3Bvbl9uaSlwb24tPnBvbl9pZCB9OworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmc2V0X3Bvbl9zdGF0ZSwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmc2V0X3Bvbl9zdGF0ZSwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwgcG9uX3N0YXRlLCBCQ01PTFRfUE9OX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwb24tPmRldmljZV9pZCwgJnNldF9wb25fc3RhdGUuaGRyKTsKK30KKworYmNtb3NfZXJybm8gcHNfbW92ZV90b193b3JraW5nX2dwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKQoreworICAgIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUgc2V0X3Bvbl9zdGF0ZTsKKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAoYmNtb2x0X2dwb25fbmkpcG9uLT5wb25faWQgfTsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJnNldF9wb25fc3RhdGUsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnNldF9wb25fc3RhdGUsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1dPUktJTkcpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocG9uLT5kZXZpY2VfaWQsICZzZXRfcG9uX3N0YXRlLmhkcik7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfaW50ZXJuYWwuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjM2Y3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfaW50ZXJuYWwuaApAQCAtMCwwICsxLDY2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKy8qIFRoaXMgZmlsZSBpcyBmb3IgaW50ZXJuYWwgdXNlIHdpdGhpbiB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgdXNlciBhcHBsaWNhdGlvbiAtCisgICBubyBmdW5jdGlvbnMgaGVyZSBzaG91bGQgYmUgY2FsbGVkIGZyb20gYW55d2hlcmUgZWxzZSEgKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9QU19JTlRFUk5BTF9IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9QU19JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzLmgiCisKKyNpZmRlZiBFTkFCTEVfTE9HCitkZXZfbG9nX2lkIHBzX2dldF9sb2dfaWQodm9pZCk7CisjZGVmaW5lIFBTX0VSUiguLi4pIEJDTV9MT0coRVJST1IsIHBzX2dldF9sb2dfaWQoKSwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBTX0lORk8oLi4uKSBCQ01fTE9HKElORk8sIHBzX2dldF9sb2dfaWQoKSwgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBQU19FUlIoLi4uKSBiY21vc19wcmludGYoIltQUyBFUlJPUl0gIiBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUFNfSU5GTyguLi4pIGJjbW9zX3ByaW50ZigiW1BTIElORk9dICIgX19WQV9BUkdTX18pCisjZW5kaWYKKworLyogSGVscGVyIGZ1bmN0aW9ucyAqLwordWludDMyX3QgcHNfZ2V0X2xhc3Rfc3dpdGNoX3N0YXJ0X3RpbWVfdXModm9pZCk7CisKKy8qIEdQT04tc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSAqLworYmNtb3NfZXJybm8gcHNfcHJvY2Vzc19pbmRfZ3Bvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGNvbnN0IGJjbW9sdF9hdXRvICppbmQpOworYmNtb3NfZXJybm8gcHNfbW92ZV90b19zdGFuZGJ5X2dwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKTsKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fd29ya2luZ19ncG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbik7CisKKy8qIEVQT04tc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSAqLworYmNtb3NfZXJybm8gcHNfcHJvY2Vzc19pbmRfZXBvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGNvbnN0IGJjbW9sdF9hdXRvICppbmQpOworYmNtb3NfZXJybm8gcHNfbW92ZV90b19zdGFuZGJ5X2Vwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKTsKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fd29ya2luZ19lcG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbik7CisKKy8qIFhHUE9OLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgKi8KK2JjbW9zX2Vycm5vIHBzX3Byb2Nlc3NfaW5kX3hncG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgY29uc3QgYmNtb2x0X2F1dG8gKmluZCk7CitiY21vc19lcnJubyBwc19tb3ZlX3RvX3N0YW5kYnlfeGdwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKTsKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fd29ya2luZ194Z3Bvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc194Z3Bvbi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX3hncG9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhMTY3YQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc194Z3Bvbi5jCkBAIC0wLDAgKzEsNjU1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wc19pbnRlcm5hbC5oIgorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX25pX2xvcygKKyAgICBjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqZ2xvYmFsX2NmZywKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwb24sCisgICAgY29uc3QgYmNtb2x0X3hncG9uX25pX2xvcyAqaW5kKQoreworICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzID09IEJDTU9MVF9TVEFUVVNfT0ZGKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygiPCVkOiVkPiBMb1MgYWxhcm0gY2xlYXJlZFxuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygiPCVkOiVkPiBMb1MgYWxhcm0gcmFpc2VkXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQpOworCisgICAgaWYgKGdsb2JhbF9jZmctPnN3aXRjaF9jb25kaXRpb24gPT0gQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTUFOVUFMKQorICAgIHsKKyAgICAgICAgLyogZG9uJ3QgcmVhY3QgdG8gdGhlIHN3aXRjaCBpZiB3ZSdyZSBpbiBtYW51YWwgc3dpdGNoIG1vZGUgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfcHNfc3dpdGNoX3BlcmZvcm0ocG9uKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfbmlfc3RhdGVfY2hhbmdlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlIG9wZXI7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwga2V5KTsKKworICAgIGlmIChpbmQtPmRhdGEucHJldmlvdXNfc3RhdGUgPT0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRSAmJgorICAgICAgICBpbmQtPmRhdGEubmV3X3N0YXRlID09IEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkcpCisgICAgeworICAgICAgICBQU19JTkZPKCIlczogYWN0aXZhdGluZyBQT04gPCVkOiVkPlxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmkpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlkpOworICAgIH0KKyAgICBlbHNlIGlmIChpbmQtPmRhdGEucHJldmlvdXNfc3RhdGUgPT0gQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfV09SS0lORyAmJgorICAgICAgICBpbmQtPmRhdGEubmV3X3N0YXRlID09IEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkUpCisgICAgeworICAgICAgICBQU19JTkZPKCIlczogZGVhY3RpdmF0aW5nIFBPTiA8JWQ6JWQ+XG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwgcG9uX3N0YXRlLCBCQ01PTFRfUE9OX09QRVJBVElPTl9JTkFDVElWRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIG9ubHkgY2hhbmdlIHRoZSBzdGFuZGJ5IFBPTidzIHN0YXRlIGlmIHdlJ3JlIHByZS1wcm92aXNpb25pbmcgdGhlIHdvcmtpbmcgUE9OCisgICAgICAgICAgKHRoZSBzd2l0Y2hvdmVyIGlzIGhhbmRsZWQgc2VwYXJhdGVseSkgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfbmlfdHJhZmZpY19yZXN1bWUoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAqaW5kKQoreworICAgIHVpbnQzMl90IGFmdGVyX3VzICA9IGJjbW9zX3RpbWVzdGFtcCgpOworICAgIHVpbnQzMl90IGJlZm9yZV91cyA9IHBzX2dldF9sYXN0X3N3aXRjaF9zdGFydF90aW1lX3VzKCk7CisgICAgdWludDMyX3QgdGltZV90YWtlbl91cyA9IChhZnRlcl91cyA+IGJlZm9yZV91cykgPyBhZnRlcl91cyAtIGJlZm9yZV91cyA6IGJlZm9yZV91cyAtIGFmdGVyX3VzOworICAgIGNvbnN0IGNoYXIgKnRyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHIgPSBOVUxMOworCisgICAgc3dpdGNoIChpbmQtPmRhdGEucmVzdWx0KQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0ciA9ICJzdWNjZXNzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX0ZBSUxVUkU6CisgICAgICAgIHRyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHIgPSAiZmFpbHVyZSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVVNQRUNURURfTE9TOgorICAgICAgICB0cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyID0gInN1c3BlY3RlZF9sb3MiOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBQU19JTkZPKAorICAgICAgICAiPCVkOiVkPiBUcmFmZmljIHJlc3VtZSAlcy4gVGltZSBzaW5jZSBzdGFydCBvZiBzd2l0Y2g6ICVkIG1zLlxuIiwKKyAgICAgICAgcG9uLT5kZXZpY2VfaWQsCisgICAgICAgIHBvbi0+cG9uX2lkLAorICAgICAgICB0cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyLAorICAgICAgICB0aW1lX3Rha2VuX3VzIC8gMTAwMCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9uaV9vbnVzX3JhbmdlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAqaW5kKQoreworICAgIHVpbnQzMl90IGk7CisgICAgYmNtb3NfZXJybm8gbGFzdF9lcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogYXBwbHkgYWxsIG9mIHRoZSBuZXcgT05VIEVRRHMgdG8gdGhlIHN0YW5kYnkgUE9OICovCisgICAgZm9yIChpID0gMDsgaSA8IGluZC0+ZGF0YS5vbnVzLmxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+ZGF0YS5vbnVzLnZhbFtpXS5vbnVfaWQgfTsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgICAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICAgICAgUFNfSU5GTygKKyAgICAgICAgICAgICIlczogdXBkYXRpbmcgRVFEIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgICAgICBpbmQtPmRhdGEub251cy52YWxbaV0uZXFkKTsKKworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lLCBpbmQtPmRhdGEub251cy52YWxbaV0uZXFkKTsKKyAgICAgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgUFNfRVJSKCJFUUQgdXBkYXRlIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgbGFzdF9lcnIgPSBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbGFzdF9lcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3JhbmdpbmdfY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisKKyAgICAvKiBvbmx5IHJlYWN0IHRvIHN1Y2Nlc3MgaW5kaWNhdGlvbnMgKi8KKyAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyAhPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIEVRRCA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5lcWQpOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lLCBpbmQtPmRhdGEuZXFkKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsKKworICAgIFBTX0lORk8oIiVzOiB1cGRhdGluZyBBRVMga2V5IDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5LCBpbmQtPmRhdGEubmV3X2tleSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBvbi0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2FjdGl2YXRpb25fY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICAvKiBvbmx5IHJlYWN0IHRvIHN1Y2Nlc3MgaW5kaWNhdGlvbnMgKi8KKyAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyAhPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHByb3Zpc2lvbmluZyByZWdpc3RyYXRpb24gSUQgLyBrZXlzIGZvciBuZXdseS1hY3RpdmF0ZWQgT05VIDwlZDolZD4gT05VICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQsIGluZC0+ZGF0YS5yZWdpc3RyYXRpb25faWQpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLCBpbmQtPmRhdGEucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBQU19JTkZPKCIlczogYWN0aXZhdGluZyA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7CisKKyAgICAvKiBOb3RlOiB3ZSByZWFjdCB0byB0aGlzIGluZGljYXRpb24gd2hldGhlciBvciBub3QgdGhlIGRlYWN0aXZhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIEZhaWx1cmUgaW5kaWNhdGVzIHRoYXQgdGhlCisgICAgICogT05VIGRpZG4ndCByZXNwb25kIHRvIHRoZSBkZWFjdGl2YXRpb24sIGJ1dCB3ZSBzdGlsbCByZW1vdmUgdGhlIE9OVSBmcm9tIE9MVCBoYXJkd2FyZSBzbyBpdCBtdXN0IGJlIG1pcnJvcmVkLiAqLworCisgICAgUFNfSU5GTygiJXM6IGRlYWN0aXZhdGluZyA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkUpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocGFydG5lci0+ZGV2aWNlX2lkLCAmb3Blci5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9lbmFibGVfY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsKKworICAgIC8qIGRvbid0IHRyeSB0byBtaXJyb3IgYnJvYWRjYXN0IGVuYWJsZS9kaXNhYmxlICovCisgICAgaWYgKGtleS5vbnVfaWQgPT0gQkNNT0xUX1hHUE9OX09OVV9JRF9JTlZBTElEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygiJXM6IGVuYWJsaW5nIDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCBCQ01PTFRfT05VX09QRVJBVElPTl9FTkFCTEUpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocGFydG5lci0+ZGV2aWNlX2lkLCAmb3Blci5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9kaXNhYmxlX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZSBvcGVyOworCisgICAgLyogZG9uJ3QgdHJ5IHRvIG1pcnJvciBicm9hZGNhc3QgZW5hYmxlL2Rpc2FibGUgKi8KKyAgICBpZiAoa2V5Lm9udV9pZCA9PSBCQ01PTFRfWEdQT05fT05VX0lEX0lOVkFMSUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKCIlczogZGlzYWJsaW5nIDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCBCQ01PTFRfT05VX09QRVJBVElPTl9ESVNBQkxFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIHZvaWQgcHNfYWxhcm1fc3RhdGVfaW5pdChiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlICphbGFybV9zdGF0ZSkKK3sKKyAgICBhbGFybV9zdGF0ZS0+bG9zaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb2JpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmxvcGNpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmxvcGNpX21pY19lcnJvciA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb29jaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT50aXdpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmRvd2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+c3VmaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5zZmkgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+c2RpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmRmaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5kZ2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+cHFzaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9hbGFybShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybSAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5sb3NpID0gaW5kLT5kYXRhLm9udV9hbGFybS5sb3NpOworICAgIGFsYXJtX3N0YXRlLmxvYmkgPSBpbmQtPmRhdGEub251X2FsYXJtLmxvYmk7CisgICAgYWxhcm1fc3RhdGUubG9wY2kgPSBpbmQtPmRhdGEub251X2FsYXJtLmxvcGNpX21pc3M7CisgICAgYWxhcm1fc3RhdGUubG9wY2lfbWljX2Vycm9yID0gaW5kLT5kYXRhLm9udV9hbGFybS5sb3BjaV9taWNfZXJyb3I7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIE9OVSBhbGFybXMgPCVkOiVkPiBPTlUgJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkKTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9kb3dpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZG93aSAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgRE9XaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZCAoRVFEICVkKVxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMsCisgICAgICAgIGluZC0+ZGF0YS5uZXdfZXFkKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5kb3dpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyA9PSBCQ01PTFRfU1RBVFVTX09OKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfdGltZSwgaW5kLT5kYXRhLm5ld19lcWQpOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfc2ZpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBTRkkgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5zZmkgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3NkaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfeGdwb25fb251X3NkaSAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgU0RpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUuc2RpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9kZmkoY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X3hncG9uX29udV9kZmkgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIERGaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLmRmaSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfc3VmaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfeGdwb25fb251X3N1ZmkgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIFNVRmkgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5zdWZpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV90aXdpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aSAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgVElXaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLnRpd2kgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2xvb2NpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2kgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIExPT0NpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUubG9vY2kgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfYWxsb2NfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5hbGxvY19pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGUgb3BlcjsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX2FsbG9jLCBzZXRfc3RhdGUsIGtleSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfQUxMT0NfU1RBVEVfQUNUSVZFKQorICAgIHsKKyAgICAgICAgLyogb25seSByZWFjdCB0byBzdWNjZXNzIGluZGljYXRpb25zICovCisgICAgICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzICE9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKworICAgICAgICBQU19JTkZPKCIlczogYWN0aXZhdGluZyA8JWQ6JWQ+IGFsbG9jICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5LmFsbG9jX2lkKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX2FsbG9jLCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfQUxMT0NfT1BFUkFUSU9OX0FDVElWQVRFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfQUxMT0NfU1RBVEVfSU5BQ1RJVkUpCisgICAgeworICAgICAgICBQU19JTkZPKCIlczogZGVhY3RpdmF0aW5nIDwlZDolZD4gYWxsb2MgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkuYWxsb2NfaWQpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fYWxsb2MsIHNldF9zdGF0ZSwgc3RhdGUsIEJDTU9MVF9BTExPQ19PUEVSQVRJT05fREVBQ1RJVkFURSk7CisgICAgfQorICAgIGVsc2UgLyogaW5kLT5kYXRhLm5ld19zdGF0ZSBpcyBzb21ldGhpbmcgZWxzZSAoZS5nLiB1bnByb3Zpc2lvbmVkLCBpZiB0aGUgYWxsb2Mgd2FzIGNsZWFyZWQpICovCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworYmNtb3NfZXJybm8gcHNfcHJvY2Vzc19pbmRfeGdwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBjb25zdCBiY21vbHRfYXV0byAqaW5kKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcHNfcG9uX3N0YXRlIHN0YXRlOworICAgIGJjbW9sdF9wc19wb24gcGFydG5lcjsKKyAgICBiY21vbHRfcHNfZ2xvYmFsX2NmZyBnbG9iYWxfY2ZnOworCisgICAgZXJyID0gYmNtb2x0X3BzX2dsb2JhbF9jZmdfZ2V0KCZnbG9iYWxfY2ZnKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChnbG9iYWxfY2ZnLm1pcnJvcl9tb2RlICE9IEJDTU9MVF9QU19NSVJST1JfTU9ERV9BVVRPICYmCisgICAgICAgIGluZC0+aGRyLnN1Ymdyb3VwICE9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0xPUykKKyAgICB7CisgICAgICAgIC8qIG9ubHkgaGFuZGxlIG1vc3QgaW5kaWNhdGlvbnMgd2hpbGUgaW4gbWlycm9yIG1vZGUgJ2F1dG8nLCBidXQgcGVyZm9ybSBhIHN3aXRjaG92ZXIgb24gTG9TIGluIGFueSBjYXNlICAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vbHRfcHNfcG9uX3N0YXRlX2dldChwb24sICZzdGF0ZSwgJnBhcnRuZXIpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHN0YXRlICE9IEJDTU9MVF9QU19QT05fU1RBVEVfV09SS0lORykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOyAvKiBpZ25vcmUgaW5kaWNhdGlvbnMgZnJvbSBQT05zIHRoYXQgYXJlbid0IHByb3RlY3RlZCB3b3JraW5nICovCisgICAgfQorCisgICAgc3dpdGNoIChpbmQtPmhkci5vYmpfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX05JOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfTE9TOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9uaV9sb3MoJmdsb2JhbF9jZmcsIHBvbiwgKChjb25zdCBiY21vbHRfeGdwb25fbmlfbG9zICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfbmlfc3RhdGVfY2hhbmdlZCgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9uaV90cmFmZmljX3Jlc3VtZShwb24sICgoY29uc3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX25pX29udXNfcmFuZ2VkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAqKWluZCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgTkkgaW5kaWNhdGlvbnMgKi8KKyAgICAgICAgfQorCisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVToKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X3JhbmdpbmdfY29tcGxldGVkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQoCisgICAgICAgICAgICAgICAgcG9uLAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2FjdGl2YXRpb25fY29tcGxldGVkKAorICAgICAgICAgICAgICAgIHBvbiwKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCgKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9lbmFibGVfY29tcGxldGVkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0FMQVJNOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfYWxhcm0oJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm0gKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2Rvd2koJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9kb3dpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NGSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X3NmaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fb251X3NmaSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TREk6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9zZGkoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9zZGkgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREZJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZGZpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZGZpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NVRkk6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9zdWZpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfdGl3aSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fb251X3Rpd2kgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfTE9PQ0k6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9sb29jaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fb251X2xvb2NpICopaW5kKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogc2lsZW50bHkgaWdub3JlIGFsbCBvdGhlciBPTlUgaW5kaWNhdGlvbnMgKi8KKyAgICAgICAgfQorCisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX2FsbG9jX2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogc2lsZW50bHkgaWdub3JlIGFsbCBvdGhlciBhbGxvYyBpbmRpY2F0aW9ucyAqLworICAgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOyAvKiBzb21lb25lIGVsc2UgbmVlZHMgdG8gaGFuZGxlIHRoaXMgaW5kaWNhdGlvbiAqLworICAgIH0KK30KKworYmNtb3NfZXJybm8gcHNfbW92ZV90b19zdGFuZGJ5X3hncG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbikKK3sKKyAgICBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSBzZXRfcG9uX3N0YXRlOworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAoYmNtb2x0X3hncG9uX25pKXBvbi0+cG9uX2lkIH07CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZzZXRfcG9uX3N0YXRlLCB4Z3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmc2V0X3Bvbl9zdGF0ZSwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlkpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocG9uLT5kZXZpY2VfaWQsICZzZXRfcG9uX3N0YXRlLmhkcik7Cit9CisKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fd29ya2luZ194Z3Bvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGUgc2V0X3Bvbl9zdGF0ZTsKKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgKGJjbW9sdF94Z3Bvbl9uaSlwb24tPnBvbl9pZCB9OworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmc2V0X3Bvbl9zdGF0ZSwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnNldF9wb25fc3RhdGUsIHhncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9XT1JLSU5HKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBvbi0+ZGV2aWNlX2lkLCAmc2V0X3Bvbl9zdGF0ZS5oZHIpOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTdkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3JlbW90ZV9sb2dnZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyBVc2VyIGFwcGxpY2F0aW9uIHRvIGNvcHkgbG9nIHByaW50cyBmcm9tIHRoZSBkZXZpY2UgdG8gYSBsb2NhbCBmaWxlIG9uIHRoZSBob3N0CisKK2lmZXEgKCIkKEVOQUJMRV9MT0cpIiwgInkiKQorICAgIGlmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorCU1PRF9OQU1FID0gYmNtX3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyCisJTU9EX1RZUEUgPSBsaWIKKwlNT0RfREVQUyA9IGhvc3RfYXBpIGRldl9sb2cKKwlpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKwkgICAgTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorCWVuZGlmCisJc3JjcyA9IGJjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5jIFwKKwkgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyX2NsaS5jCisgICAgZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2JlZGRmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL2JjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5jCkBAIC0wLDAgKzEsMjMyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIuaCIKKworc3RhdGljIHN0cnVjdAoreworICAgIEZJTEUgKmZpbGVfaGFuZGxlOworICAgIHVpbnQ2NF90IGZpbGVfc2l6ZTsKKyAgICBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgY2ZnOworICAgIGJjbW9zX3Rhc2sgdGFzazsKKyAgICBiY21vc190aW1lciB0aW1lcjsKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKK30gcmVtb3RlX2xvZ2dlcltCQ01UUl9NQVhfT0xUU10gPSB7fTsKKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIHJlbW90ZV9sb2dnZXJfdGltZXJfaGFuZGxlcihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClkYXRhOworICAgIGludCB3cml0dGVuOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX2NmZyBjZmc7CisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyAuZmlsZV9pZCA9IEJDTU9MVF9MT0dfRklMRV9JRF9ERFIgfTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dnZXIsIGJ1ZmZlcik7CisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmY2ZnLmhkcik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmxvZ19pZCwgIkxvZ2dlciBnZXQgQVBJIHJldHVybmVkICclcycgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSwgZXJyKTsKKyAgICAgICAgYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdG9wKGRldmljZSk7CisgICAgICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKKyAgICB9CisKKyAgICB3cml0dGVuID0gZnByaW50ZigKKyAgICAgICAgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmZpbGVfaGFuZGxlLAorICAgICAgICAiJS4qcyIsCisgICAgICAgIChpbnQpc2l6ZW9mKGNmZy5kYXRhLmJ1ZmZlci5idWZmKSwKKyAgICAgICAgY2ZnLmRhdGEuYnVmZmVyLmJ1ZmYpOworICAgIGlmICh3cml0dGVuIDwgMCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5sb2dfaWQsICJGaWxlIHdyaXRlIHJldHVybmVkICVkXG4iLCB3cml0dGVuKTsKKyAgICAgICAgYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdG9wKGRldmljZSk7CisgICAgICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKKyAgICB9CisKKyAgICBmZmx1c2gocmVtb3RlX2xvZ2dlcltkZXZpY2VdLmZpbGVfaGFuZGxlKTsKKworICAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSB3aWxsIGV4Y2VlZCB0aGUgbWF4IGZpbGUgc2l6ZSBuZXh0IHRpbWUgd2Ugd3JpdGUgYSBjaHVuay4gKi8KKyAgICByZW1vdGVfbG9nZ2VyW2RldmljZV0uZmlsZV9zaXplICs9IHdyaXR0ZW47CisgICAgaWYgKHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX3NpemUgKyBzaXplb2YoY2ZnLmRhdGEuYnVmZmVyLmJ1ZmYpID4gcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZy5tYXhfZmlsZV9zaXplKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChyZW1vdGVfbG9nZ2VyW2RldmljZV0uY2ZnLm1heF9maWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvcikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVNT1RFX0xPR0dFUl9GSUxFX1NJWkVfUkVBQ0hFRF9CRUhBVklPUl9TVE9QOgorICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmxvZ19pZCwgIk1heCBmaWxlIHNpemUgcmVhY2hlZCAtIHJlbW90ZSBsb2dnZXIgc3RvcHBlZFxuIik7CisgICAgICAgICAgICAgICAgYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdG9wKGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVNT1RFX0xPR0dFUl9GSUxFX1NJWkVfUkVBQ0hFRF9CRUhBVklPUl9DTEVBUjoKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5sb2dfaWQsICJNYXggZmlsZSBzaXplIHJlYWNoZWQgLSBsb2cgZmlsZSBjbGVhcmVkXG4iKTsKKyAgICAgICAgICAgICAgICAvKiB0aGUgZWFzaWVzdCB3YXkgdG8gY2xlYXIgdGhlIGZpbGUgaXMgdG8gY2xvc2UvcmUtb3BlbiBpdCAqLworICAgICAgICAgICAgICAgIGZjbG9zZShyZW1vdGVfbG9nZ2VyW2RldmljZV0uZmlsZV9oYW5kbGUpOworICAgICAgICAgICAgICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX2hhbmRsZSA9IGZvcGVuKHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5jZmcuZmlsZW5hbWUsICJ3Iik7CisgICAgICAgICAgICAgICAgQlVHX09OKHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX2hhbmRsZSA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2ZnLmRhdGEuYnVmZmVyLm1zZ190b19yZWFkID09IDApCisgICAgeworICAgICAgICAvKiBUaGVyZSBhcmUgbm8gbW9yZSBtZXNzYWdlcyB0byByZWFkIHJpZ2h0IG5vdywgd2FpdCBmb3IgdGhlIGVudGlyZSBwb2xsaW5nIGludGVydmFsLiAqLworICAgICAgICBiY21vc190aW1lcl9zdGFydCgKKyAgICAgICAgICAgICZyZW1vdGVfbG9nZ2VyW2RldmljZV0udGltZXIsCisgICAgICAgICAgICByZW1vdGVfbG9nZ2VyW2RldmljZV0uY2ZnLnBvbGxpbmdfcGVyaW9kX21zICogMTAwMCk7IC8qIG1zIHRvIHVzICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFRoZXJlIGFyZSBtb3JlIG1lc3NhZ2VzIHRvIHJlYWQgLSB3YWl0IGZvciBvbmx5IHRoZSAnc3Vic2VxdWVudCBkZWxheScgdGltZS4gKi8KKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoCisgICAgICAgICAgICAmcmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRpbWVyLAorICAgICAgICAgICAgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZy5zdWJzZXF1ZW50X2RlbGF5X21zICogMTAwMCk7IC8qIG1zIHRvIHVzICovCisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworfQorCit2b2lkIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfaW5pdCgpCit7CisgICAgc3RhdGljIGJjbW9zX3Rhc2tfcGFybSB0YXNrX3BhcmFtcyA9CisgICAgeworICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9SRU1PVEVfTE9HR0VSLAorICAgICAgICAuY29yZSA9IEJDTU9TX0NQVV9DT1JFX0FOWSwgLyogTm8gQ1BVIGFmZmluaXR5ICovCisgICAgICAgIC5pbml0X2hhbmRsZXIgPSBOVUxMCisgICAgfTsKKyAgICBzdGF0aWMgYmNtb3NfbW9kdWxlX3Bhcm0gbW9kdWxlX3BhcmFtcyA9CisgICAgeworICAgICAgICAucXBhcm0gPSB7IC5zaXplID0gMSB9IC8qIGp1c3QgdGhlIHRpbWVyIG1lc3NhZ2UgKi8KKyAgICB9OworICAgIHN0YXRpYyBiY21vc190aW1lcl9wYXJtIHRpbWVyX3BhcmFtcyA9CisgICAgeworICAgICAgICAucGVyaW9kaWMgPSBCQ01PU19GQUxTRSwgLyogd2Ugd2lsbCByZS1lbmFibGUgdGhlIHRpbWVyIGFmdGVyIGVhY2ggdGljayAqLworICAgICAgICAuaGFuZGxlciA9IHJlbW90ZV9sb2dnZXJfdGltZXJfaGFuZGxlcgorICAgIH07CisKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmlkIGRldmljZTsKKworICAgIGZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgQkNNVFJfTUFYX09MVFM7IGRldmljZSsrKQorICAgIHsKKyAgICAgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfUkVNT1RFX0xPR0dFUl9ERVYwICsgZGV2aWNlOworICAgICAgICBzbnByaW50ZigKKyAgICAgICAgICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS50YXNrLm5hbWUsCisgICAgICAgICAgICBzaXplb2YocmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRhc2submFtZSksCisgICAgICAgICAgICAidXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIldSIsCisgICAgICAgICAgICBkZXZpY2UpOworCisgICAgICAgIHRhc2tfcGFyYW1zLm5hbWUgPSByZW1vdGVfbG9nZ2VyW2RldmljZV0udGFzay5uYW1lOworICAgICAgICBtb2R1bGVfcGFyYW1zLnFwYXJtLm5hbWUgPSByZW1vdGVfbG9nZ2VyW2RldmljZV0udGFzay5uYW1lOworICAgICAgICB0aW1lcl9wYXJhbXMub3duZXIgPSBtb2R1bGVfaWQ7CisgICAgICAgIHRpbWVyX3BhcmFtcy5uYW1lID0gcmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRhc2submFtZTsKKyAgICAgICAgdGltZXJfcGFyYW1zLmRhdGEgPSAobG9uZylkZXZpY2U7CisKKyAgICAgICAgZXJyID0gYmNtb3NfdGFza19jcmVhdGUoJnJlbW90ZV9sb2dnZXJbZGV2aWNlXS50YXNrLCAmdGFza19wYXJhbXMpOworICAgICAgICBCVUdfT04oZXJyICE9IEJDTV9FUlJfT0spOworCisgICAgICAgIGVyciA9IGJjbW9zX21vZHVsZV9jcmVhdGUobW9kdWxlX2lkLCAmcmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRhc2ssICZtb2R1bGVfcGFyYW1zKTsKKyAgICAgICAgQlVHX09OKGVyciAhPSBCQ01fRVJSX09LKTsKKworICAgICAgICBlcnIgPSBiY21vc190aW1lcl9jcmVhdGUoJnJlbW90ZV9sb2dnZXJbZGV2aWNlXS50aW1lciwgJnRpbWVyX3BhcmFtcyk7CisgICAgICAgIEJVR19PTihlcnIgIT0gQkNNX0VSUl9PSyk7CisKKyAgICAgICAgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmxvZ19pZCA9CisgICAgICAgICAgICBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcihyZW1vdGVfbG9nZ2VyW2RldmljZV0udGFzay5uYW1lLCBERVZfTE9HX0xFVkVMX1dBUk5JTkcsIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICB9Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfc3RhcnQoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnOworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgLmZpbGVfaWQgPSBCQ01PTFRfTE9HX0ZJTEVfSURfRERSIH07CisKKyAgICBpZiAoYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9pc19ydW5uaW5nKGRldmljZSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCByZW1vdGVfbG9nZ2VyW2RldmljZV0ubG9nX2lkLCAiUmVtb3RlIGxvZ2dlciBhcHBsaWNhdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICAvKiBjb25maWd1cmUgRERSIGxvZyBmaWxlIHRvIGNsZWFyIG9uIHJlYWQgc28gd2UgY2FuIGFsd2F5cyBzdGF5IHVwLXRvLWRhdGUgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nZ2VyLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBlbmFibGVfbG9nLCBCQ01PU19UUlVFKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCwgQkNNT1NfVFJVRSk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5sb2dfaWQsICJMb2dnZXIgc2V0IEFQSSByZXR1cm5lZCAnJXMnICglZClcbiIsIGJjbW9zX3N0cmVycm9yKGVyciksIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmZpbGVfaGFuZGxlID0gZm9wZW4ocmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZy5maWxlbmFtZSwgInciKTsKKyAgICBpZiAocmVtb3RlX2xvZ2dlcltkZXZpY2VdLmZpbGVfaGFuZGxlID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCByZW1vdGVfbG9nZ2VyW2RldmljZV0ubG9nX2lkLCAiQ291bGQgbm90IG9wZW4gZmlsZSAnJXMnXG4iLCByZW1vdGVfbG9nZ2VyW2RldmljZV0uY2ZnLmZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisgICAgfQorICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX3NpemUgPSAwOworCisgICAgYmNtb3NfdGltZXJfc3RhcnQoJnJlbW90ZV9sb2dnZXJbZGV2aWNlXS50aW1lciwgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZy5wb2xsaW5nX3BlcmlvZF9tcyAqIDEwMDApOyAvKiBtcyB0byB1cyAqLworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX3N0b3AoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBpZiAoIWJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfaXNfcnVubmluZyhkZXZpY2UpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmxvZ19pZCwgIlJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24gaXMgbm90IHJ1bm5pbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICBiY21vc190aW1lcl9zdG9wKCZyZW1vdGVfbG9nZ2VyW2RldmljZV0udGltZXIpOworICAgIGZjbG9zZShyZW1vdGVfbG9nZ2VyW2RldmljZV0uZmlsZV9oYW5kbGUpOworICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX2hhbmRsZSA9IE5VTEw7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Jvb2wgYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9pc19ydW5uaW5nKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgcmV0dXJuIGJjbW9zX3RpbWVyX2lzX3J1bm5pbmcoJnJlbW90ZV9sb2dnZXJbZGV2aWNlXS50aW1lcik7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgKmNmZykKK3sKKyAgICAqY2ZnID0gcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZzsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9jZmdfdXBkYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2NmZyAqY2ZnKQoreworICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5jZmcgPSAqY2ZnOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL2JjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL2JjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YTIyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3JlbW90ZV9sb2dnZXIvYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX1JFTU9URV9MT0dHRVJfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfUkVNT1RFX0xPR0dFUl9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorCisjZGVmaW5lIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0ZJTEVOQU1FX01BWF9MRU4gMTI4CisKKy8qKiBQb3NzaWJsZSBhY3Rpb25zIHRvIHRha2Ugd2hlbiB0aGUgbWF4IGxvZyBmaWxlIHNpemUgaXMgcmVhY2hlZC4gKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0ZJTEVfU0laRV9SRUFDSEVEX0JFSEFWSU9SX1NUT1AsICAvKio8IFN0b3AgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24uICovCisgICAgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRV9TSVpFX1JFQUNIRURfQkVIQVZJT1JfQ0xFQVIsIC8qKjwgQ2xlYXIgYWxsIGNvbnRlbnQgZnJvbSB0aGUgZmlsZSBhbmQgY29udGludWUuICovCit9IGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2ZpbGVfc2l6ZV9yZWFjaGVkX2JlaGF2aW9yOworCisvKiogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90IHBvbGxpbmdfcGVyaW9kX21zOyAgIC8qKjwgVGltZSB0byB3YWl0IGluIGJldHdlZW4gcG9sbGluZyBBUEkgY2FsbHMuICovCisgICAgdWludDMyX3Qgc3Vic2VxdWVudF9kZWxheV9tczsgLyoqPCBNaW51bXVtIHJlcXVpcmVkIHRpbWUgdG8gd2FpdCBpbiBiZXR3ZWVuIHN1c2VxdWVudCBBUEkgY2FsbHMuICovCisgICAgdWludDMyX3QgbWF4X2ZpbGVfc2l6ZTsgICAgICAgLyoqPCBNYXhpbXVtIHNpemUgZm9yIHRoZSBvdXRwdXQgZmlsZSBpbiBieXRlcy4gKi8KKworICAgIC8qKiBPdXRwdXQgZmlsZSBmdWxsIHBhdGguICovCisgICAgY2hhciBmaWxlbmFtZVtCQ01PTFRfUkVNT1RFX0xPR0dFUl9GSUxFTkFNRV9NQVhfTEVOXTsKKworICAgIC8qKiBCZWhhdmlvciB3aGVuIHRoZSBtYXggZmlsZSBzaXplIGlzIHJlYWNoZWQuICovCisgICAgYmNtb2x0X3JlbW90ZV9sb2dnZXJfZmlsZV9zaXplX3JlYWNoZWRfYmVoYXZpb3IgbWF4X2ZpbGVfc2l6ZV9yZWFjaGVkX2JlaGF2aW9yOworfSBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmc7CisKKy8qKiBJbml0aWFsaXplIHRoZSByZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uICh0aGlzIHNob3VsZCBiZSBjYWxsZWQgYXMgcGFydCBvZiBhcHBsaWNhdGlvbiBzdGFydHVwKS4gKi8KK3ZvaWQgYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9pbml0KHZvaWQpOworCisvKiogU3RhcnQgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24uCisgKiBccmV0dXJuICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBhcHBsaWNhdGlvbiB3YXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdGFydChiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyoqIFN0b3AgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24uCisgKiBccmV0dXJuICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBhcHBsaWNhdGlvbiB3YXMgc3RvcHBlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdG9wKGJjbW9sdF9kZXZpZCBkZXZpY2UpOworCisvKiogUXVlcnkgd2hldGhlciB0aGUgcmVtb3RlIGxvZ2dlciBhcHBsaWNhdGlvbiBpcyBjdXJyZW50bHkgcnVubmluZy4KKyAqIFxyZXR1cm4gICAgICAgIEJDTU9TX1RSVUUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcsIEJDTU9TX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2lzX3J1bm5pbmcoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qKiBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24uCisgKiBccGFyYW1bb3V0XSBjZmcgUmVtb3RlIGxvZ2dlciBjb25maWd1cmF0aW9uLgorICogXHJldHVybiAgICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2NmZyAqY2ZnKTsKKworLyoqIENoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcmVtb3RlIGxvZ2dlciBhcHBsaWNhdGlvbi4KKyAqIFxwYXJhbVtpbl0gY2ZnIFJlbW90ZSBsb2dnZXIgY29uZmlndXJhdGlvbi4KKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2ZnX3VwZGF0ZShiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgKmNmZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL2JjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlcl9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNGZkNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyLmgiCisjaW5jbHVkZSAiYmNtb2x0X2NvbnYuaCIKKworI2RlZmluZSBCQ01PTFRfUkVNT1RFX0xPR0dFUl9ERUZBVUxUX1BPTExJTkdfUEVSSU9EX01TICAgICA1MDAwCisjZGVmaW5lIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0RFRkFVTFRfU1VCU0VRVUVOVF9ERUxBWV9NUyAgIDUKKyNkZWZpbmUgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9NQVhfRklMRV9TSVpFICAgICAgICAgKDIwMCAqIDEwMDAwMDApIAorI2RlZmluZSBCQ01PTFRfUkVNT1RFX0xPR0dFUl9ERUZBVUxUX0ZJTEVfUkVBQ0hFRF9CRUhBVklPUiAic3RvcCIKKyNkZWZpbmUgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9GSUxFTkFNRSAgICAgICAgICAgICAgInJlbW90ZV9sb2cudHh0IgorCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2xvZ2dlcl9jb25maWd1cmVfbG9nKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9rZXkgKmtleSwKKyAgICBiY21vbHRfbG9nX2xldmVsIGxvZ19sZXZlbF9zYXZlKQoreworICAgIGJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZzsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCAqa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUsIGxvZ19sZXZlbF9zYXZlKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50LCBCQ01PTFRfTE9HX0xFVkVMX1dBUk5JTkcpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChkZXZpY2UsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHJlbW90ZV9sb2dnZXJfY29uZmlndXJlX2xvZ3MoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQ7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9jZmcgbXVsdGlfY2ZnOworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IG11bHRpX2tleSA9IHsgLmxvZ19pZCA9IDAgfTsgLyogc3RhcnQgZnJvbSB0aGUgZmlyc3QgbG9nIElEICovCisgICAgdWludDE2X3QgaTsKKworICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBtdWx0aS1nZXQgcmV0dXJuICovCisgICAgZXJyID0gYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCA1MCwgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgbXVsdGktZ2V0IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJm11bHRpX2NmZywgbG9nX2VudHJ5LCBtdWx0aV9rZXkpOworICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGNhbGwgbXVsdGktZ2V0IEFQSSAqLworICAgICAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2UsICZtdWx0aV9jZmcuaGRyLCBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogZm9yIGVhY2ggbG9nIGVudHJ5LCByZWNvbmZpZ3VyZSBpdCB0byBwcmludCBvbmx5IHdhcm5pbmcgbGV2ZWwgYW5kIGFib3ZlIHRvIHRoZSBzY3JlZW4gKGtlZXBpbmcgY3VycmVudAorICAgICAgICAgKiBiZWhhdmlvciBmb3IgcHJpbnRpbmcgdG8gUkFNIGZpbGVzKSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnX3NldC0+bnVtX2luc3RhbmNlczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfbG9nX2VudHJ5X2NmZyAqY2ZnID0gKGJjbW9sdF9sb2dfZW50cnlfY2ZnICopbXNnX3NldC0+bXNnW2ldOworICAgICAgICAgICAgZXJyID0gcmVtb3RlX2xvZ2dlcl9jb25maWd1cmVfbG9nKGRldmljZSwgJmNmZy0+a2V5LCBjZmctPmRhdGEubG9nX2xldmVsX3NhdmUpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogdXBkYXRlIHRoZSBrZXkgZm9yIG5leHQgY2FsbCAqLworICAgICAgICBtdWx0aV9jZmcua2V5ID0gKigoYmNtb2x0X2xvZ19lbnRyeV9rZXkgKiltc2dfc2V0LT5uZXh0X2tleSk7CisKKyAgICAvKiBrZWVwIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIHVudGlsIHdlIGhhdmUgcmV0cmlldmVkIGFsbCBlbnRyaWVzICovCisgICAgfSB3aGlsZSAobXNnX3NldC0+bW9yZSk7CisKKyAgICBiY21vbHRfbXNnX3NldF9mcmVlKG1zZ19zZXQpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyByZW1vdGVfbG9nZ2VyX2NtZF9zdGFydChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgLyogdGhlc2UgcGFyYW1ldGVycyB3aWxsIGFsd2F5cyBiZSBub24tTlVMTCBzaW5jZSB0aGV5IGhhdmUgZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgY2ZnID0gCisgICAgeworICAgICAgICAubWF4X2ZpbGVfc2l6ZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9maWxlX3NpemUiKS0+dmFsdWUudW51bWJlciwKKyAgICAgICAgLm1heF9maWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvciA9IChiY21vbHRfcmVtb3RlX2xvZ2dlcl9maWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvcikKKyAgICAgICAgICAgIGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfc2l6ZV9yZWFjaGVkIiktPnZhbHVlLm51bWJlciwKKyAgICAgICAgLnBvbGxpbmdfcGVyaW9kX21zID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9sbGluZ19wZXJpb2QiKS0+dmFsdWUudW51bWJlciwKKyAgICAgICAgLnN1YnNlcXVlbnRfZGVsYXlfbXMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWJzZXF1ZW50X2RlbGF5IiktPnZhbHVlLnVudW1iZXIsCisgICAgfTsKKyAgICBzdHJuY3B5KAorICAgICAgICBjZmcuZmlsZW5hbWUsCisgICAgICAgIGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVuYW1lIiktPnZhbHVlLnN0cmluZywKKyAgICAgICAgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRU5BTUVfTUFYX0xFTiAtIDEpOyAvKiBsZWF2ZSByb29tIGZvciB0ZXJtaW5hdG9yICovCisKKyAgICAvKiBpZiB0aGUgdXNlciByZXF1ZXN0ZWQsIHNldCBhbGwgbG9ncyBvbiB0aGUgZGV2aWNlIHRvIHByaW50IHdhcm5pbmdzL2Vycm9ycyBvbmx5ICovCisgICAgaWYgKChiY21vc19ib29sKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyZV9sb2dzIiktPnZhbHVlLm51bWJlcikKKyAgICB7CisgICAgICAgIGVyciA9IHJlbW90ZV9sb2dnZXJfY29uZmlndXJlX2xvZ3MoY3VycmVudF9kZXZpY2UpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJlY29uZmlndXJlZCBhbGwgbG9nIGVudHJpZXMgdG8gcHJpbnQgd2FybmluZy9lcnJvciBtZXNzYWdlcyBvbmx5XG4iKTsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2NmZ191cGRhdGUoY3VycmVudF9kZXZpY2UsICZjZmcpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdGFydChjdXJyZW50X2RldmljZSk7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24gc3RhcnRlZFxuIik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyByZW1vdGVfbG9nZ2VyX2NtZF9zdG9wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX3N0b3AoY3VycmVudF9kZXZpY2UpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJSZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uIHN0b3BwZWRcbiIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2xvZ2dlcl9jbWRfc3RhdHVzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBzdGF0aWMgaW50MnN0cl90IGZpbGVfc2l6ZV9yZWFjaGVkMnN0cltdID0KKyAgICB7CisgICAgICAgIHsgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRV9TSVpFX1JFQUNIRURfQkVIQVZJT1JfU1RPUCwgInN0b3AiIH0sCisgICAgICAgIHsgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRV9TSVpFX1JFQUNIRURfQkVIQVZJT1JfQ0xFQVIsICJjbGVhciIgfSwKKyAgICAgICAgeyAtMSB9CisgICAgfTsKKworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgY2ZnOworCisgICAgaWYgKGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfaXNfcnVubmluZyhjdXJyZW50X2RldmljZSkpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVtb3RlIGxvZ2dlciBhcHBsaWNhdGlvbiBpcyBydW5uaW5nXG4iKTsKKyAgICAgICAgZXJyID0gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9jZmdfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmY2ZnKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgImZpbGVuYW1lPSVzXG4iLCBjZmcuZmlsZW5hbWUpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAibWF4X2ZpbGVfc2l6ZT0ldVxuIiwgY2ZnLm1heF9maWxlX3NpemUpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAiZmlsZV9zaXplX3JlYWNoZWQ9JXNcbiIsCisgICAgICAgICAgICBpbnQyc3RyKGZpbGVfc2l6ZV9yZWFjaGVkMnN0ciwgY2ZnLm1heF9maWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvcikpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAicG9sbGluZ19wZXJpb2Q9JXVcbiIsIGNmZy5wb2xsaW5nX3BlcmlvZF9tcyk7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJzdWJzZXF1ZW50X2RlbGF5PSV1XG4iLCBjZmcuc3Vic2VxdWVudF9kZWxheV9tcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJSZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uIGlzIG5vdCBydW5uaW5nXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBmaWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvcl90YWJsZVtdID0KKyAgICB7CisgICAgICAgIHsgInN0b3AiLCBCQ01PTFRfUkVNT1RFX0xPR0dFUl9GSUxFX1NJWkVfUkVBQ0hFRF9CRUhBVklPUl9TVE9QIH0sCisgICAgICAgIHsgImNsZWFyIiwgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRV9TSVpFX1JFQUNIRURfQkVIQVZJT1JfQ0xFQVIgfSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBiY21jbGlfZW50cnkgKmRpciA9IGJjbWNsaV9kaXJfYWRkKAorICAgICAgICB0b3BfZGlyLAorICAgICAgICAicmVtb3RlX2xvZ2dlciIsCisgICAgICAgICJQZXJpb2RpY2FsbHkgY29weSBkZXZpY2UgbG9nIHRvIGxvY2FsIGZpbGUiLAorICAgICAgICBCQ01DTElfQUNDRVNTX0FETUlOLAorICAgICAgICBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAic3RhcnQiLCAiU3RhcnQgcGVyaW9kaWNhbGx5IGNvcHlpbmcgZGV2aWNlIGxvZyB0byBob3N0IiwgcmVtb3RlX2xvZ2dlcl9jbWRfc3RhcnQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fREVGVkFMKAorICAgICAgICAgICAgImZpbGVuYW1lIiwKKyAgICAgICAgICAgICJPdXRwdXQgZmlsZSBwYXRoIiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX1NUUklORywKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICAobG9uZylCQ01PTFRfUkVNT1RFX0xPR0dFUl9ERUZBVUxUX0ZJTEVOQU1FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoCisgICAgICAgICAgICAibWF4X2ZpbGVfc2l6ZSIsCisgICAgICAgICAgICAiTWF4aW11bSBvdXRwdXQgZmlsZSBzaXplIGluIGJ5dGVzIiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX1VOVU1CRVIsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9NQVhfRklMRV9TSVpFKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNX0RFRlZBTCgKKyAgICAgICAgICAgICJmaWxlX3NpemVfcmVhY2hlZCIsCisgICAgICAgICAgICAiQmVoYXZpb3Igd2hlbiBtYXggZmlsZSBzaXplIGlzIHJlYWNoZWQiLAorICAgICAgICAgICAgZmlsZV9zaXplX3JlYWNoZWRfYmVoYXZpb3JfdGFibGUsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9GSUxFX1JFQUNIRURfQkVIQVZJT1IpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgKKyAgICAgICAgICAgICJwb2xsaW5nX3BlcmlvZCIsCisgICAgICAgICAgICAiUG9sbGluZyBwZXJpb2QgaW4gbXMiLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICBCQ01PTFRfUkVNT1RFX0xPR0dFUl9ERUZBVUxUX1BPTExJTkdfUEVSSU9EX01TKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoCisgICAgICAgICAgICAic3Vic2VxdWVudF9kZWxheSIsCisgICAgICAgICAgICAiRGVsYXkgYmV0d2VlbiByZXBlYXRlZCBBUEkgY2FsbHMgaW4gbXMiLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICBCQ01PTFRfUkVNT1RFX0xPR0dFUl9ERUZBVUxUX1NVQlNFUVVFTlRfREVMQVlfTVMpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU1fREVGVkFMKAorICAgICAgICAgICAgImNvbmZpZ3VyZV9sb2dzIiwKKyAgICAgICAgICAgICJDb25maWd1cmUgYWxsIGRldmljZSBsb2dzIHRvIHByaW50IGVycm9yL3dhcm5pbmcgb25seSIsCisgICAgICAgICAgICBiY21jbGlfZW51bV9ib29sX3RhYmxlLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCwKKyAgICAgICAgICAgICJ5ZXMiKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgInN0b3AiLCAiU3RvcCBwZXJpb2RpY2FsbHkgY29weWluZyBkZXZpY2UgbG9nIHRvIGhvc3QiLCByZW1vdGVfbG9nZ2VyX2NtZF9zdG9wKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAic3RhdHVzIiwgIlNob3cgc3RhdHVzIC8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIiwgcmVtb3RlX2xvZ2dlcl9jbWRfc3RhdHVzKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL2JjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlcl9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxZWY4YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX1JFTU9URV9MRUFSTklOR19DTElfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfUkVNT1RFX0xFQVJOSU5HX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0MWE2YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvc3dfdXBncmFkZS9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjIFNXIHVwZ3JhZGUgYXBwbGljYXRpb24KKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBiY21fc3dfdXBncmFkZQorICAgIE1PRF9UWVBFID0gbGliCisgICAgTU9EX0RFUFMgPSBob3N0X2FwaQorICAgIHNyY3MgPSBiY21vbHRfc3dfdXBncmFkZV9jbGkuYworICAgIAorICAgIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgICAgICBNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisgICAgZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvYmNtb2x0X3N3X3VwZ3JhZGVfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvYmNtb2x0X3N3X3VwZ3JhZGVfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliMDNiNAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvc3dfdXBncmFkZS9iY21vbHRfc3dfdXBncmFkZV9jbGkuYwpAQCAtMCwwICsxLDcwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2luY2x1ZGUgImJjbW9sdF9zd191cGdyYWRlX2NsaS5oIgorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9jbGlfc3dfdXBncmFkZV9hY3RpdmF0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0ge307CisgICAgYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlIG9wZXJfc3dfdXBncmFkZV9hY3RpdmF0ZTsKKyAgICBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Qgb3Blcl9kaXNjb25uZWN0OworICAgIGJjbW9sdF9kZXZpY2VfY29ubmVjdCBvcGVyX2Nvbm5lY3Q7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3Blcl9zd191cGdyYWRlX2FjdGl2YXRlLCBkZXZpY2UsIHN3X3VwZ3JhZGVfYWN0aXZhdGUsIGtleSk7CisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KDAsICZvcGVyX3N3X3VwZ3JhZGVfYWN0aXZhdGUuaGRyKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3Blcl9kaXNjb25uZWN0LCBkZXZpY2UsIGRpc2Nvbm5lY3QsIGtleSk7CisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KDAsICZvcGVyX2Rpc2Nvbm5lY3QuaGRyKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3Blcl9jb25uZWN0LCBkZXZpY2UsIGNvbm5lY3QsIGtleSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdCgwLCAmb3Blcl9jb25uZWN0Lmhkcik7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N3X3VwZ3JhZGVfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgYmNtY2xpX2VudHJ5ICpkaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCAic3dfdXBncmFkZSIsCisgICAgICAgICJTb2Z0d2FyZSB1cGdyYWRlIHVzZXIgYXBwbGljYXRpb24iLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgImFjdGl2YXRlIiwgIlNXIHVwZ3JhZGUgaW1hZ2UgYWN0aXZhdGlvbiIsIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N3X3VwZ3JhZGVfYWN0aXZhdGUpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvc3dfdXBncmFkZS9iY21vbHRfc3dfdXBncmFkZV9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvc3dfdXBncmFkZS9iY21vbHRfc3dfdXBncmFkZV9jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTE1YTk1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9zd191cGdyYWRlL2JjbW9sdF9zd191cGdyYWRlX2NsaS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTQ6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQ29weXJpZ2h0IChjKSAyMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfU1dfVVBHUkFERV9DTElfSF8KKyNkZWZpbmUgX0JDTU9MVF9TV19VUEdSQURFX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N3X3VwZ3JhZGVfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLmNvbmZpZyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDgyMzlhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvTWFrZWZpbGUuY29uZmlnCkBAIC0wLDAgKzEsMzkxIEBACisjIENvbW1vbiBNYWtlZmlsZSBjb25maWd1cmF0aW9uCisjCisKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBzZXQKKyMgTU9EX05BTUUgLSBtb2R1bGUgbmFtZS4gRGVwZW5kaW5nIG9uIE1PRF9UWVBFIGNhbiBiZSBlbmNhcHN1bGF0ZWQgKGUuZy4sIE1PRF9OQU1FPW9zIC0tPiBsaWJvcy5hKQorIyBNT0RfVFlQRSAtIG1vZHVsZSB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgY3VycmVudGx5IGFyZSAibGliIiwgImFwcCIsICJsaW51eF9tb2R1bGUiIGFuZCAibGludXhfbGliIgorIyAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBsaWJyYXJ5IG1vZHVsZSBpdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5ICJ1bml0ZXN0IiB0YXJnZXQgaW4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChNQUtFX0RFVklDRV9ESVIpL21vZHVsZXMuaG9zdCAvIGVtYmVkZGVkLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdW5pdGVzdC5jIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgd2l0aCBpdHMgbW9kdWxlIGxpYnJhcnkuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIE1PRF9UWVBFIHJlbWFpbnMgYSAibGliIi4KKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG9wdGlvbmFsCisjIHNyY3MgICAgIC0gbGlzdCBvZiAuYyBzb3VyY2UgZmlsZXMgcmVsYXRpdmUgdG8gU1JDX0RJUgorIyBhc19zcmNzICAtIGxpc3Qgb2YgLnMgKGxvd2VyIGNhc2UgcykgICBzb3VyY2UgZmlsZXMgcmVsYXRpdmUgdG8gU1JDX0RJUgorIyBBU19zcmNzICAtIGxpc3Qgb2YgLlMgKHVwcGVyIGNhc2UgLlMpIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB0byBTUkNfRElSCisjIGdlbl9zcmNzIC0gbGlzdCBvZiAuYyB0aGF0IGhhdmUgdG8gYmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhlIGJ1aWxkCisjIE1PRF9ERVBTIC0gbGlzdCBvZiBtb2R1bGVzIHRoZSAiY3VycmVudCIgbW9kdWxlIGRlcGVuZHMgb24uIE9TIGFic3RyYWN0aW9uIGxheWVyIGRlcGVuZGVuY3kKKyMgICAgICAgICAgICAgICAgICAgICAgICAobW9kdWxlICJvcyIpIGlzIGFsd2F5cyBwcmVzZW50IGltcGxpY2l0bHkuIEZvciBleGFtcGxlLCBhcGlfY2xpIG1vZHVsZSdzIE1ha2VmaWxlCisjICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBsaW5lOgorIyAgICAgICAgICAgICAgICAgICAgICAgIE1PRF9ERVBTID0gY2xpIGFwaSB1dGlscyBtb2RlbAorIyBNT0RfSU5DX0RJUlMgLSB1c2VkIHdoZW4gbW9kdWxlIGV4cG9ydHMgaW5jbHVkZXMgaW4gZGlyZWN0b3J5KHMpIG90aGVyIHRoYW4gdGhlIG1vZHVsZSBkaXJlY3RvcnkKKyMgTU9EX0RFRlMgLSBhZGRpdGlvbmFsIGRlZmluZXMsIGluY2x1ZGluZyAtRC4gdGhlIGRlZmluZXMgYXJlIGFkZGVkIHdoZW4gY29tcGlsaW5nICJ0aGlzIiBtb2R1bGUKKyMgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxsIG1vZHVsZXMgZGVwZW5kaW5nIG9uIGl0CisjIE1PRF9MSUJTIC0gYWRkaXRpb25hbCBsaWJyYXJpZXMgcmVxdWlyZWQgYnkgdGhlIG1vZHVsZSwgaW5jbHVkaW5nIC1sIGFuZCAtTAorIyBNT0RfQ1VTVE9NIC0gaWYgc2V0ICJ5IiwgZGVmYXVsdCBydWxlIGZvciBidWlsZGluZyB0aGUgbW9kdWxlIGlzIE5PVCBwcm92aWRlZC4KKyMgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIHJ1bGUgZm9yIGJ1aWxkaW5nICQoTU9EX1RBUkdFVCkgbXVzdCBiZSBwcm92aWRlZCBpbiBtb2R1bGUncyBNYWtlZmlsZQorIworIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgbm90IHJlcXVpcmVkIGluIG1vc3QgY2FzZXMsIGJ1dCBzdXBwb3J0ZWQgbm9uZXRoZWxlc3MKKyMgRVhUUkFfQ0ZMQUdTIC0gZXh0cmEgQ0ZMQUdTIHRoZSBtb2R1bGUgcmVxdWlyZXMgZm9yIGNvbXBpbGF0aW9uCisjIEVYVFJBX0lOQ0xVREVTIC0gZXh0cmEgaW5jbHVkZSBkaXJlY3RvcmllcyB0aGUgbW9kdWxlIHJlcXVpcmVzIGZvciBjb21waWxhdGlvbiAod2l0aCAtSSkKKyMgRVhUUkFfTElCU19QQVRIIC0gYWRkaXRpb25hbCBsaWJyYXJ5IHNlYXJjaCBwYXRocworIyBFWFRSQV9MSUJTIGFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIGxpbmsgd2l0aAorIworIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgcHJlLXNldCBhbmQgY2FuIGJlIHVzZWQgaW4gbW9kdWxlLXNwZWNpZmljIE1ha2VmaWxlCisjIFRPUF9ESVIgLSBmdWxseSBxdWFsaWZpZWQgdG9wIGRpcmVjdG9yeQorIyBNT0RfRElSIC0gbW9kdWxlIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgdG9wIGRpcmVjdG9yeQorIyBPVVRfRElSX0JBU0UgLSBvdXRwdXQgZGlyZWN0b3J5IGJhc2UKKyMgQUxMX01PRFVMRVMgLSBsaXN0IG9mIGFsbCBtb2R1bGVzIGluIHRoZSBjdXJyZW50IHN1YnN5c3RlbSAoaG9zdC9lbWJlZGRlZCkKKyMgQUxMX0xJQl9NT0RVTEVTIC0gbGlzdCBvZiBhbGwgbGliIG1vZHVsZXMgaW4gdGhlIGN1cnJlbnQgc3Vic3lzdGVtIChob3N0L2VtYmVkZGVkKQorIyBBTExfQVBQX01PRFVMRVMgLSBsaXN0IG9mIGFsbCBhcHAgbW9kdWxlcyBpbiB0aGUgY3VycmVudCBzdWJzeXN0ZW0gKGhvc3QvZW1iZWRkZWQpCisjIFNJTVVMQVRJT05fQlVJTEQgLSBzZXQgInkiIGZvciBzaW11bGF0aW9uIGJ1aWxkIChDUk9TU19DT01QSUxFIGlzIGVtcHR5KQorIyBPUyAtIE9TCisjIEVOQUJMRV9FUE9OIC0gc2V0ICJ5IiBpZiBFUE9OIG1vZGUgaXMgaW5jbHVkZWQKKyMgRU5BQkxFX0dQT04gLSBzZXQgInkiIGlmIEdQT04gbW9kZSBpcyBpbmNsdWRlZAorIyBFTkFCTEVfWEdQT04gLSBzZXQgInkiIGlmIFhHUE9OIG1vZGUgaXMgaW5jbHVkZWQKKyMgRU5BQkxFX0dQT05fT1JfWEdQT04gLSBzZXQgInkiIGlmIEdQT04gb3IgWEdQT04gbW9kZSBpcyBpbmNsdWRlZAorIyBFTkFCTEVfQ0xJIC0gc2V0ICJuIiBpZiBob3N0IENMSSBzdXBwb3J0IGlzIG5vdCByZXF1aXJlZAorIyBFTkFCTEVfTE9HIC0gc2V0ICJuIiBpZiBob3N0IGxvZ2dlciBzdXBwb3J0IGlzIG5vdCByZXF1aXJlZAorIworIyBVU0VfQ0xBTkcgLSBzZXQgInkiIHRvIGVuYWJsZSBDTEFORyBjb2RlIHBhc3MgZm9yIGltcHJvdmVkIGRpYWdub3N0aWMKKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHByZS1zZXQgYW5kIGNhbiBiZSB1c2VkIGFuZC9vciBvdmVyd3JpdHRlbiBpbiBtb2R1bGUtc3BlY2lmaWMgTWFrZWZpbGUKKyMgU1JDX0RJUiAtIGZ1bGx5LXF1YWxpZmllZCBzb3VyY2UgZGlyZWN0b3J5CisjIE9VVF9ESVIgLSBtb2R1bGUgb3V0cHV0IGRpcmVjdG9yeQorIyBUQVJHRVRfTElCIC0gbGlicmFyeSBuYW1lIGZvciAibGliIiBtb2R1bGUuIEJ5IGRlZmF1bHQgaXQgaXMgJChNT0RfTkFNRSkKKyMgVEFSR0VUX0xJQl9GTkFNRSAtIG1vZHVsZSBsaWJyYXJ5IGZpbGUgbmFtZSBpbmNsdWRpbmcgcGF0aC4gQnkgZGVmYXVsdCBpdCBpcyAkKE9VVF9ESVIpL2xpYiQoVEFSR0VUX0xJQikuYQorIyBNT0RfVEFSR0VUIC0gbW9kdWxlIHRhcmdldCBuYW1lLCBpbmNsdWRpbmcgcGF0aC4gQnkgZGVmYXVsdCBpdCBpcworIyAgICAgICAkKE9VVF9ESVIpLyQoTU9EX05BTUUpIGZvciAiYXBwIiBtb2R1bGVzCisjICAgICAgICQoVEFSR0VUX0xJQl9GTkFNRSkgZm9yICJsaWIiIG1vZHVsZXMKKyMgQ09ERUdFTl9PVVRQVVRfRElSIC0gb3V0cHV0IGRpcmVjdG9yeSBjb250YWluaW5nIGdlbmVyYXRlZCBmaWxlcworCitUT09MQ0hBSU4gICAgPz0gZ2NjCitPUyAgICAgICAgICAgPz0gcG9zaXgKK0RFQlVHICAgICAgICA/PSB5CitCTERfREVQICAgICAgPz0gZ2NjCitVU0VfQ0xBTkcgCSA/PSBuCisKK2V4cG9ydCBCT0FSRAorZXhwb3J0IFRPT0xDSEFJTgorZXhwb3J0IE9TCitleHBvcnQgREVCVUcKK2V4cG9ydCBCTERfREVQCitleHBvcnQgT1NfS0VSTkVMCisKK1YgPz0gMAoraWZlcSAoeCIkKFYpIiwgeCIwIikKKyAgICBTSUxFTlRfQlVJTEQgPSBACitlbmRpZgorCisjCisjIENvbXBpbGVyIHdhcm5pbmcgY29uZmlndXJhdGlvbgorIyBTb21lIGV4dHJhIHdhcm5pbmdzIGFyZSBhbHdheXMgZW5hYmxlZC4gT3RoZXJzIG11c3QgYmUgb3B0ZWQgaW4gb24gdGhlIG1vZHVsZSBsZXZlbAorIworRU5BQkxFX0VYVFJBX1dBUk5JTkdTID89IHkKK2V4cG9ydCBFTkFCTEVfRVhUUkFfV0FSTklOR1MKKworIyBJbmNsdWRlIG9wdGlvbmFsIHBsYXRmb3JtLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKy1pbmNsdWRlICQoTUFLRV9ERVZJQ0VfRElSKS9NYWtlZmlsZS4kKFNVQlNZU1RFTSkuY29uZmlnCisKK0VOQUJMRV9FUE9OICAgICAgPz0geQorRU5BQkxFX0dQT04gICAgICA/PSB5CitFTkFCTEVfWEdQT04gPz0geQorCitFTkFCTEVfR1BPTl9PUl9YR1BPTiA9IG4KK2lmZXEgKCIkKEVOQUJMRV9HUE9OKSIsICJ5IikKKyAgICBFTkFCTEVfR1BPTl9PUl9YR1BPTiA9IHkKK2VuZGlmCitpZmVxICgiJChFTkFCTEVfWEdQT04pIiwgInkiKQorICAgIEVOQUJMRV9HUE9OX09SX1hHUE9OID0geQorZW5kaWYKK2V4cG9ydCBFTkFCTEVfRVBPTgorZXhwb3J0IEVOQUJMRV9HUE9OCitleHBvcnQgRU5BQkxFX1hHUE9OCitleHBvcnQgRU5BQkxFX0dQT05fT1JfWEdQT04KKworU1JDX0RJUiAgICAgICAgICA9ICQoVE9QX0RJUikvJChNT0RfRElSKQorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBPVVRfRElSX0JBU0UgPz0gJChUT1BfRElSKS9idWlsZAorICAgIE9VVF9ESVIgICAgICA9ICQoT1VUX0RJUl9CQVNFKS8kKE1PRF9ESVIpCisgICAgTU9ERUxfT1VUX0RJUj0gJChUT1BfRElSKS9ob3N0X2RyaXZlci9tb2RlbAorICAgIENPTkZJR19ESVIgICAgICA9IGhvc3RfZHJpdmVyL2NvbmZpZworZWxzZQorICAgIE9VVF9ESVJfQkFTRSA/PSAkKFRPUF9ESVIpL2J1aWxkLyQoUExBVEZPUk0pLyQoU1VCU1lTVEVNKQorICAgIE9VVF9ESVIgICAgICA9ICQoT1VUX0RJUl9CQVNFKS8kKE1PRF9ESVIpCisgICAgTU9ERUxfT1VUX0RJUj0gJChPVVRfRElSX0JBU0UpL2NvbW1vbi9tb2RlbC8kKFBMQVRGT1JNKQorICAgIENPTkZJR19ESVIgICAgICA9ICQoU1VCU1lTVEVNKS9jb25maWcKKyAgICBPU19QTEFURk9STV9ESVIgPSAkKFNVQlNZU1RFTSkvb3NfYWJzdHJhY3Rpb24vJChQTEFURk9STSkKK2VuZGlmCisKKyMgSG9zdCBDTEkgYW5kIGxvZ2dlciBzdXBwb3J0CitFTkFCTEVfQ0xJID89IHkKK0VOQUJMRV9MT0cgPz0geQorRU5BQkxFX0tUMiA/PSBuCisKK01PRF9ERUZTICs9IC1EVVNFX0RSSVZFUl9DTEk9MSAtREZVTExfRFJJVkVSPTEgLURDRkVfRFJJVkVSPTAKKworZXhwb3J0IEVOQUJMRV9DTEkKK2V4cG9ydCBFTkFCTEVfTE9HCitleHBvcnQgRU5BQkxFX0tUMgorCitpZmVxICgiJChTVUJTWVNURU0pIiwgImVtYmVkZGVkIikKKyAgICBvdmVycmlkZSBFTkFCTEVfQ0xJID0geQorICAgIG92ZXJyaWRlIEVOQUJMRV9MT0cgPSB5CitlbmRpZgorCisjCisjIyMgSW5jbHVkZSBtb2R1bGUgTWFrZWZpbGUKKyMgRm9yIE1PRF9DVVNUT00gb25seSB3aWxsIGJlIGluY2x1ZGVkIGluIE1ha2VmaWxlLnJ1bGVzIHNlY29uZCB0aW1lIGZvciBwcm9wYWdhdGUgY3VzdG9tIHJ1bGVzCisjCitpbmNsdWRlICQoU1JDX0RJUikvTWFrZWZpbGUKKworIyBDb2RlLWdlbmVyYXRvciAtIHJlbGF0ZWQgcGFyYW1ldGVycworQ09ERUdFTl9JTlBVVF9ESVIgICAgICAgID0gJChTUkNfRElSKS9jb2RlZ2VuX3RlbXBsYXRlcworQ09ERUdFTl9PVVRQVVRfRElSICAgICAgID0gJChPVVRfRElSKQorQ09ERUdFTl9ESVIgICAgICAgICAgICAgICAgICAgICAgPSAkKFRPUF9ESVIpL2Jpbi9jb2RlZ2VuCitNT0RFTF9GSUxFICAgICAgICAgICAgICAgICAgICAgICA9ICQoVE9QX0RJUikvY29tbW9uL21vZGVsLyQoUExBVEZPUk0pLyQoUExBVEZPUk0pLm9ianNldAorQ09ERUdFTl9FWEUgICAgICAgICAgICAgICAgICAgICAgPSAkKENPREVHRU5fRElSKS9UZWtub3Z1cy5NZXRhU3RydWN0dXJlLkNvZGVHZW5lcmF0b3IuZXhlCitNT05PX1ZFUiAgICAgICAgICAgID89IDQuMy4yLjQ2NworTU9OT19QQVRIICAgICAgICAgICA/PSAvb3B0L21vbm8tJChNT05PX1ZFUikvYmluL21vbm8KKworZXhwb3J0IFNSQ19ESVIKK2V4cG9ydCBPVVRfRElSX0JBU0UKK2V4cG9ydCBPVVRfRElSCitleHBvcnQgTU9ERUxfT1VUX0RJUgorCitpZmVxICgiJCh3aWxkY2FyZCAkKE1PTk9fUEFUSCkpIiwgIiIpCisgICAgIyBJZiB3ZSBjYW4ndCBmaW5kIE1vbm8gaW5zdGFsbGVkIGluIHRoZSBjb3JyZWN0IHBhdGgsIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgUEFUSCB2ZXJzaW9uLgorICAgICMgSW4gdGhlIGZ1dHVyZSwgd2Ugc2hvdWxkIGFsd2F5cyB1c2UgTW9ubyBmcm9tIGEgY29tbW9uIHRvb2xzIGRpcmVjdG9yeS4KKyAgICAjIFRPRE86IGNoYW5nZSB0aGlzIG9uY2UgdGhlIGNvbXBpbGVyL3Rvb2xjaGFpbiBwYXRocyBhcmUgYmV0dGVyIGRlZmluZWQuCisgICAgTU9OT19QQVRIICAgICAgICA9IG1vbm8KK2VuZGlmCisKKyMgVHJlYXQgInllcyIgYW5kICJ5IiB0aGUgc2FtZQoraWZlcSAoIiQoVVNFX0NMQU5HKSIsICJ5ZXMiKQorICAgIFVTRV9DTEFORyA6PSB5CitlbmRpZgoraWZlcSAoIiQoVVNFX0NMQU5HKSIsICJ5IikKKyAgICBpbmNsdWRlICQoTUFLRV9ESVIpL2NsYW5nLm9wdHMKK2VuZGlmCisKKyMgRGlzYWJsZSBjb2RlIGdlbmVyYXRpb24gaW4gcmVsZWFzZSBidWlsZAoraWZlcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCisgICAgc3JjcyA6PSAkKHNyY3MpICQoZ2VuX3NyY3MpCisgICAgZ2VuX3NyY3MgOj0KKyAgICAjIERpc2FibGUgTElOVCBhbmQgQ0xBTkcKKyAgICBVU0VfTElOVCA9IG4KKyAgICBVU0VfQ0xBTkcgPSBuCisJRVhUUkFfREVGSU5FUyArPSAtRFJFTEVBU0VfQlVJTEQKK2VuZGlmCisKK1NSQ1MgPSAkKHN0cmlwICQoc3JjczolPSQoU1JDX0RJUikvJSkpCisKKyMgSW4gQ09NUElMRV9BTExfSU5fT05FX0dPIG1vZGUgYWxsIC5jIGZpbGVzIG9mIGEgbW9kdWxlIGFyZSBjb21waWxlZCBpbgorIyBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIEJMRF9DQyBjb21waWxlci4gSW4gcmVzdWx0LCBvYmplY3RzIGZpbGVzIGFyZSBjcmVhdGVkCisjIGluIE9VVF9ESVIgZXZlbiBpZiBtb2R1bGUncyAuYyBmaWxlcyBhcmUgc3ByZWFkIGluIHN1Yi1kaXJlY3RvcmllcworaWZlcSAoIiQoQ09NUElMRV9BTExfSU5fT05FX0dPKSIsICJ5IikKKyAgICBzcmNzX25vX2RpciA9ICQobm90ZGlyICQoc3JjcykpCisgICAgX09CSlMgPSAkKHNyY3Nfbm9fZGlyOiUuYz0kKE9VVF9ESVIpLyUubykKK2Vsc2UKKyAgICBfT0JKUyA9ICQoc3JjczolLmM9JChPVVRfRElSKS8lLm8pCitlbmRpZgorCithc19TUkNTID0gJChzdHJpcCAkKGFzX3NyY3M6JT0kKFNSQ19ESVIpLyUpKQorYXNfT0JKUyA9ICQoYXNfc3JjczolLnM9JChPVVRfRElSKS8lLm8pCitfT0JKUyAgKz0gJChhc19PQkpTKQorCitBU19TUkNTID0gJChzdHJpcCAkKEFTX3NyY3M6JT0kKFNSQ19ESVIpLyUpKQorQVNfT0JKUyA9ICQoQVNfc3JjczolLlM9JChPVVRfRElSKS8lLm8pCitfT0JKUyAgKz0gJChBU19PQkpTKQorCitpZm5lcSAoIiQoZ2VuX3NyY3MpIiwgIiIpCisgICAgR0VOX1NSQ1MgPSAkKHN0cmlwICQoZ2VuX3NyY3M6JT0kKENPREVHRU5fT1VUUFVUX0RJUikvJSkpCisgICAgX09CSlMgKz0gJChHRU5fU1JDUzolLmM9JS5vKQorZW5kaWYKK09CSlMgPSAkKHN0cmlwICQoX09CSlMpKQorCisjIEFkZCBkZWZhdWx0IGRlcGVuZGVuY3kgb24gT1MgYWJzdHJhY3Rpb24KK2lmZXEgKCIkKE1PRF9OQU1FKSIsICIiKQorICAgIGlmbmVxICh4IiQoVikiLCB4IjAiKQorICAgICAgICAkKGluZm8gTU9EX05BTUUgaXMgbm90IHNldCBmb3IgJChTUkNfRElSKS9NYWtlZmlsZS4gU2tpcHBpbmcuLikKKyAgICBlbmRpZgorICAgIE1PRF9UWVBFID0gX3NraXBfCitlbmRpZgorCisjIEFkZCBkZWZhdWx0IGRlcGVuZGVuY3kgb24gT1MgYWJzdHJhY3Rpb24KK2lmbmVxICgiJChNT0RfU1VQUFJFU1NfT1NfREVQKSwgInkpCisgICAgaWZlcSAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCisgICAgICAgIF9rZXJuZWwgPSB5CisgICAgZW5kaWYKKyAgICBpZmVxICgiJChNT0RfVFlQRSkiLCAibGludXhfbGliIikKKyAgICAgICAgX2tlcm5lbCA9IHkKKyAgICBlbmRpZgorICAgIGlmZXEgKCIkKF9rZXJuZWwpIiwgInkiKQorICAgICAgICAgTU9EX0RFUFMgOj0gb3NfbGludXggJChNT0RfREVQUykKKyAgICBlbHNlCisgICAgICAgICBNT0RfREVQUyA6PSBvcyAkKE1PRF9ERVBTKQorICAgIGVuZGlmCitlbmRpZgorCisjIEdFTl9PQkpUQUdTIGRlZmluZSB3aGljaCBvYmplY3RzIGFyZSBnZW5lcmF0ZWQuIElmIG5vdCBzZXQgZXhwbGljaXRseSwKKyMgZGVyaXZlIGl0IGZyb20gRU5BQkxFX0VQT04sIEVOQUJMRV9HUE9OLCBFTkFCTEVfWEdQT04gZmxhZ3MKK2lmZXEgKCIkKEdFTl9PQkpUQUdTKSIsICIiKQorICAgIGlmZXEgKCIkKEVOQUJMRV9FUE9OKSIsICJ5IikKKyAgICAgICAgR0VOX09CSlRBR1MgOj0gJChHRU5fT0JKVEFHUyksRVBPTixBRQorICAgIGVuZGlmCisgICAgaWZlcSAoIiQoRU5BQkxFX0dQT04pIiwgInkiKQorICAgICAgICBHRU5fT0JKVEFHUyA6PSAkKEdFTl9PQkpUQUdTKSxHUE9OCisgICAgZW5kaWYKKyAgICBpZmVxICgiJChFTkFCTEVfWEdQT04pIiwgInkiKQorICAgICAgICBHRU5fT0JKVEFHUyA6PSAkKEdFTl9PQkpUQUdTKSxYR1BPTgorICAgIGVuZGlmCisgICAgaWZlcSAoIiQoR0VOX09CSlRBR1MpIiwgIiIpCisgICAgICAgICQoZXJyb3IgQXQgbGVhc3Qgb25lIG9mIEVOQUJMRV9FUE9OLCBFTkFCTEVfR1BPTiwgRU5BQkxFX1hHUE9OIG11c3QgYmUgc2V0ID15KQorICAgIGVuZGlmCitlbmRpZgorCisjIEV4dHJhIHR5cGVzIGZpbHRlcgoraWZuZXEgKCIkKEVYVFJBX1RZUEVTKSIsICIiKQorICAgIEVYVFJBX1RZUEVTIDo9ICQoc2hlbGwgZWNobyAtbiAkKEVYVFJBX1RZUEVTKSB8IHNlZCAtZSAncy8gL1xcfC9nJykKKyAgICBHRU5fRVhUUkFfVFlQRVMgOj0gLXR5cGVOYW1lRmlsdGVyPVxeXCgkKEVYVFJBX1RZUEVTKVwpXCQkCitlbmRpZgorCitPU19LRVJORUwgPz0gJChPUykKK1VDX1BMQVRGT1JNID0gJChzaGVsbCBlY2hvICQoUExBVEZPUk0pIHwgdHIgYS16IEEtWikKK1VDX1NVQlNZU1RFTSA9ICQoc2hlbGwgZWNobyAkKFNVQlNZU1RFTSkgfCB0ciBhLXogQS1aKQorVUNfT1MgPSAkKHNoZWxsIGVjaG8gJChPUykgfCB0ciBhLXogQS1aKQorVUNfT1NfS0VSTkVMID0gJChzaGVsbCBlY2hvICQoT1NfS0VSTkVMKSB8IHRyIGEteiBBLVopCisKK0JVSUxEX1RJTUUgPSAkKHNoZWxsIGRhdGUgKyVzKQorQlVJTERfVElNRV9aT05FID0gJChzaGVsbCBkYXRlICslOnopCitFWFRSQV9DRkxBR1MgKz0gLURCVUlMRF9USU1FPSQoQlVJTERfVElNRSkgLURCVUlMRF9USU1FX1pPTkU9JyIkKEJVSUxEX1RJTUVfWk9ORSkiJworCitFWFRSQV9ERUZJTkVTICAgKz0gLURCQ01fU1VCU1lTVEVNXyQoVUNfU1VCU1lTVEVNKSAtREJDTV9QTEFURk9STV8kKFVDX1BMQVRGT1JNKSAtREJDTV9PU18kKFVDX09TKQorRVhUUkFfREVGSU5FUyAgICs9IC1EJChVQ19PU19LRVJORUwpX0tFUk5FTF9TUEFDRQoraWZlcSAoIiQoRU5BQkxFX0VQT04pIiwgInkiKQorICAgIEVYVFJBX0RFRklORVMgICAgICAgKz0gLURCQ01fRVBPTgorZW5kaWYKK2lmZXEgKCIkKEVOQUJMRV9HUE9OKSIsICJ5IikKKyAgICBFWFRSQV9ERUZJTkVTICAgICAgICs9IC1EQkNNX0dQT04KK2VuZGlmCitpZmVxICgiJChFTkFCTEVfWEdQT04pIiwgInkiKQorICAgIEVYVFJBX0RFRklORVMgICAgICAgKz0gLURCQ01fWEdQT04KK2VuZGlmCisKKyMgQnVpbGQgdW5pdGVzdHMgZm9yIHNpbXVsYXRpb24gYW5kIGZyb20gSmVua2lucyBqb2JzCitVTklURVNUID89IG4KKworaWZlcSAoIiQoU0lNVUxBVElPTl9CVUlMRCkiLCAieSIpCisgICAgRVhUUkFfREVGSU5FUyArPSAtRFNJTVVMQVRJT05fQlVJTEQKKyAgICBVTklURVNUID0geQorZW5kaWYKKworaWZlcSAoIiQoSkVOS0lOU19CVUlMRCkiLCAieSIpCisgICAgVU5JVEVTVCA9IHkKK2VuZGlmCisKK0VYVFJBX0lOQ0xVREVTICArPSAtSSQoU1JDX0RJUikKKworT1BUX0RJU0FCTEVfRU1CRURERUQgPz0gbgorT1BUX0RJU0FCTEVfSE9TVCA/PW4KKworaWZlcSAoIk9QVF9ESVNBQkxFXyQoVUNfU1VCU1lTVEVNKSIsICJPUFRfRElTQUJMRV9FTUJFRERFRCIpCisgICAgT1BUX0RJU0FCTEUgOj0gJChPUFRfRElTQUJMRV9FTUJFRERFRCkKK2Vsc2UKKyAgICBPUFRfRElTQUJMRSA6PSAkKE9QVF9ESVNBQkxFX0hPU1QpCitlbmRpZgorCitBUkNIX0NGTEFHUyA9ICQoQVJDSF9GTEFHUykKK2lmZXEgKCIkKE9QVF9ESVNBQkxFKSIsICJ5IikKKyAgICBBUkNIX0NGTEFHUwkJKz0gJChERUJVR19PX0NGTEFHUykKKyAgICBFWFRSQV9MRkxBR1MgICAgKz0gJChERUJVR19PX0xGTEFHUykKKyAgICBFWFRSQV9BU0ZMQUdTICAgKz0gJChERUJVR19PX0FTRkxBR1MpCisgICAgRVhUUkFfYXNGTEFHUyAgICs9ICQoREVCVUdfT19hc0xBR1MpCitlbHNlCisgICAgQVJDSF9DRkxBR1MgICAgICs9ICQoUkVMRUFTRV9PX0NGTEFHUykKKyAgICBFWFRSQV9MRkxBR1MgICAgKz0gJChSRUxFQVNFX09fTEZMQUdTKQorICAgIEVYVFJBX0FTRkxBR1MgICArPSAkKFJFTEVBU0VfT19BU0ZMQUdTKQorICAgIEVYVFJBX2FzRkxBR1MgICArPSAkKFJFTEVBU0VfT19hc0ZMQUdTKQorZW5kaWYKKworIyBUcmVhdCBsaWIgYXMgc2hhcmVkIGxpYiBpZiBCVUlMRF9TSEFSRURfTElCUyBpcyB5CitpZmVxICAoIiQoQlVJTERfU0hBUkVEX0xJQlMpIiwgInkiKQorICAgaWZlcSAgKCIkKE1PRF9UWVBFKSIsICJsaWIiKQorICAgICAgTU9EX1RZUEUgPSBzaGFyZWRfbGliCisgICBlbmRpZgorICAgU0hBUkVEX0xJQl9QQVRIID89ICQoT1VUX0RJUl9CQVNFKS9zaGFyZWRfbGlicworZW5kaWYKKworIyBDYWxjdWxhdGUgTU9EX1RBUkdFVCBiYXNlZCBvbiBNT0RfVFlQRQoraWZlcSAgKCIkKE1PRF9UWVBFKSIsICJsaWIiKQorICAgIGlmbmVxICgiJChPQkpTKSIsICIiKQorICAgICAgICBUQVJHRVRfTElCID89ICQoTU9EX05BTUUpCisgICAgICAgIFRBUkdFVF9MSUJfRk5BTUUgPz0gJChPVVRfRElSKS9saWIkKFRBUkdFVF9MSUIpLmEKKyAgICBlbmRpZgorICAgIE1PRF9UQVJHRVQgPz0gJChUQVJHRVRfTElCX0ZOQU1FKQorZWxzZSBpZmVxICAoIiQoTU9EX1RZUEUpIiwgInNoYXJlZF9saWIiKQorCWlmbmVxICgiJChPQkpTKSIsICIiKQorCQlUQVJHRVRfTElCID89ICQoTU9EX05BTUUpCisJCVRBUkdFVF9MSUJfRk5BTUUgPz0gJChPVVRfRElSKS9saWIkKFRBUkdFVF9MSUIpLnNvCisJZW5kaWYKKwlNT0RfVEFSR0VUID89ICQoVEFSR0VUX0xJQl9GTkFNRSkKK2Vsc2UgaWZlcSAgKCIkKE1PRF9UWVBFKSIsICJhcHAiKQorICAgIE1PRF9UQVJHRVQgPz0gJChPVVRfRElSKS8kKE1PRF9OQU1FKQorZWxzZSBpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCisgICAgaWZlcSAoIiQoS0VSTkVMRElSKSIsICIiKQorICAgICAgICAkKGVycm9yIEtFUk5FTERJUiBtdXN0IGJlIHNldCBpbiBib2FyZCBwcm9maWxlKQorICAgIGVuZGlmCisgICAgaWZlcSAoIiQoS0VSTkVMX0FSQ0gpIiwgIiIpCisgICAgICAgICQoZXJyb3IgS0VSTkVMX0FSQ0ggbXVzdCBiZSBzZXQgaW4gYm9hcmQgcHJvZmlsZSkKKyAgICBlbmRpZgorICAgIGlmZXEgKCIkKEtFUk5FTF9PVVRESVIpIiwgIiIpCisgICAgICAgIEtFUk5FTF9PVVRESVIgOj0gJChLRVJORUxESVIpCisgICAgZW5kaWYKKyAgICBNT0RfVEFSR0VUID89ICQoU1JDX0RJUikvJChNT0RfTkFNRSkua28KK2Vsc2UgaWZlcSAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X2xpYiIpCisgICAgTU9EX1RBUkdFVCA/PSAkKE9VVF9ESVJfQkFTRSkvJChNT0RfTkFNRSkubGludXhsaWIKK2Vsc2UgaWZlcSAoIiQoTU9EX1RZUEUpIiwgIl9za2lwXyIpCisgICAgTU9EX1RBUkdFVCA9IC5kdW1teQorZWxzZQorICAgICQoZXJyb3IgTU9EX1RZUEUgJChNT0RfVFlQRSkgaXMgaW5jb3JyZWN0IGZvciBtb2R1bGUgJChNT0RfTkFNRSkuIE11c3QgYmUgbGliIG9yIGFwcCkKK2VuZGlmCisKK2lmZXEgKCIkKE1PRF9UQVJHRVQpIiwgIiIpCisgICBNT0RfVEFSR0VUID0gJChNT0RfTkFNRSkKK2VuZGlmCisKK2lmZXEgKCIkKE9TKSIsICJwb3NpeCIpCisgICAgRVhUUkFfREVGSU5FUyArPSAtRF9YT1BFTl9TT1VSQ0U9NjAwCisgICAgTElCUyAgID0gLWxydCAtbHB0aHJlYWQgLWxtCitlbmRpZgorCisjIE1ha2Ugc3VyZSB0aGF0IHBhdGhzIGluIEVYVFJBX0lOQ0xVREVTIGFyZSBhYnNvbHV0ZQoraWZuZXEgKCIkKEVYVFJBX0lOQ0xVREVTKSIsICIiKQorICAgICMgTWFrZSBzdXJlIHRoYXQgZWFjaCBkaXJlY3RvcnkgaXMgYW4gYWJzb2x1dGUgcGF0aAorICAgIEVYVFJBX0lOQ1MgPSAkKGFkZHByZWZpeCAtSSQoVE9QX0RJUikvLCAkKHN1YnN0IC1JLCwkKHN1YnN0ICQoVE9QX0RJUikvLCwkKEVYVFJBX0lOQ0xVREVTKSkpKQorZW5kaWYKK2lmbmVxICgiJChFWFRSQV9BU0lOQ0xVREVTKSIsICIiKQorICAgICMgTWFrZSBzdXJlIHRoYXQgZWFjaCBkaXJlY3RvcnkgaXMgYW4gYWJzb2x1dGUgcGF0aAorICAgIEVYVFJBX0FTSU5DUyA9ICQoYWRkcHJlZml4IC1JJChUT1BfRElSKS8sICQoc3Vic3QgLUksLCQoc3Vic3QgJChUT1BfRElSKS8sLCQoRVhUUkFfQVNJTkNMVURFUykpKSkKK2VuZGlmCitpZm5lcSAoIiQoRVhUUkFfYXNJTkNMVURFUykiLCAiIikKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IGVhY2ggZGlyZWN0b3J5IGlzIGFuIGFic29sdXRlIHBhdGgKKyAgICBFWFRSQV9hc0lOQ1MgPSAkKGFkZHByZWZpeCAtSSQoVE9QX0RJUikvLCAkKHN1YnN0IC1JLCwkKHN1YnN0ICQoVE9QX0RJUikvLCwkKEVYVFJBX2FzSU5DTFVERVMpKSkpCitlbmRpZgoraWZlcSAoIiQoVVNFX0xJTlQpIiwgInkiKQorICAgIFVTRV9MSU5UIDo9IHllcworZW5kaWYgICAgCitpZmVxICgiJChVU0VfTElOVCkiLCAieWVzIikKKyAgICBFWFRSQV9ERUZJTkVTICs9IC1EVVNFX0xJTlQKK2VuZGlmICAgIAorCitFWFRSQV9ERUZJTkVTICs9ICQoVVNFUl9FWFRSQV9ERUZJTkVTKSAkKFVTRVJfRVhUUkFfJChVQ19TVUJTWVNURU0pX0RFRklORVMpCitFWFRSQV9DRkxBR1MgKz0gJChVU0VSX0VYVFJBX0NGTEFHUykgJChVU0VSX0VYVFJBXyQoVUNfU1VCU1lTVEVNKV9DRkxBR1MpCitDRkxBR1MgICs9ICQoQVJDSF9DRkxBR1MpICQoRVhUUkFfQ0ZMQUdTKSAgJChFWFRSQV9JTkNTKSAkKEVYVFJBX0RFRklORVMpCitBU0ZMQUdTICs9ICQoQVJDSF9GTEFHUykgJChFWFRSQV9BU0ZMQUdTKSAkKEVYVFJBX0FTSU5DUykgJChFWFRSQV9BU0RFRklORVMpCithc0ZMQUdTICs9ICQoQVJDSF9GTEFHUykgJChFWFRSQV9hc0ZMQUdTKSAkKEVYVFJBX2FzSU5DUykgJChFWFRSQV9hc0RFRklORVMpCitMRkxBR1MgICs9ICQoQVJDSF9GTEFHUykgJChFWFRSQV9MRkxBR1MpCitERVBfRkxBR1MgKz0gJChFWFRSQV9DRkxBR1MpICQoRVhUUkFfSU5DUykgJChFWFRSQV9ERUZJTkVTKQorQ0xBTkdfRkxBR1MgKz0gJChFWFRSQV9DRkxBR1MpICQoRVhUUkFfSU5DUykgJChFWFRSQV9ERUZJTkVTKSAkKENMQU5HX09QVFMpCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9NYWtlZmlsZS5pbml0aWFsX2NvbmZpZyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLmluaXRpYWxfY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MWVjODQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9NYWtlZmlsZS5pbml0aWFsX2NvbmZpZwpAQCAtMCwwICsxLDYgQEAKK2lmZXEgKCIkKFRFUk0pIiwgImR1bWIiKQorICAgICAgICBCT0xEX1BSSU5UIDo9IHByaW50ZiAiXG4tLS0tICVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCitlbHNlCisgICAgICAgIEJPTERfUFJJTlQ/PXByaW50ZiAiG1swMW0lcxtbMG1cbiIKK2VuZGlmCitleHBvcnQgQk9MRF9QUklOVApkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvTWFrZWZpbGUubWFpbiBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLm1haW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkZWYxZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLm1haW4KQEAgLTAsMCArMSwxNTMgQEAKKyMgTWFpbiBNYWtlZmlsZSBib2R5CisjIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBjZW50cmFsIE1ha2VmaWxlIHR3aWNlIC0gZm9yIGhvc3QgYW5kIGVtYmVkZGVkIHN1YnN5c3RlbXMKKyMgUEFSQU1BVEVSOiBTVUJTWVNURU0KKworVUNfU1VCU1lTVEVNID0gJChzaGVsbCBlY2hvICQoU1VCU1lTVEVNKSB8IHRyIGEteiBBLVopCisKKyQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XyQoQk9BUkQpOiAkKE1BS0VfREVWSUNFX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSkgXAorICAgICAgICAkKE1BS0VfRElSKS9NYWtlZmlsZS5jb25maWcgJChNQUtFX0RJUikvTWFrZWZpbGUucnVsZXMgJChNQUtFX0RJUikvTWFrZWZpbGUudGVtcGxhdGUgJChNQUtFX0RJUikvTWFrZWZpbGUubWFpbgorCUBpZiAhIHRlc3QgLWYgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pX2xpc3RfJChCT0FSRCk7IHRoZW5cCisJICAgIGlmIGxzICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XyogMj4vZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlblwKKwkgICAgCW9sZGRlcHM9YGxzICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XypgIDsgXAorCSAgICAJb2xkX2JvYXJkPWBlY2hvICQkb2xkZGVwcyB8IHNlZCAnc0AkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfbGlzdF9AQCdgIDsgXAorCQkJJChCT0xEX1BSSU5UKSAiUHJldmlvdXMgYnVpbGQgd2FzIGZvciBkaWZmZXJlbnQgYm9hcmQgJCRvbGRfYm9hcmQuIGNsZWFuaW5nIHVwLi4iO1wKKwkJCSQoTUFLRSkgLXMgQk9BUkQ9JCRvbGRfYm9hcmQgVj0wIGNsZWFuXyQoU1VCU1lTVEVNKTsgXAorCQlmaTtcCisJZmkKKwlAJChCT0xEX1BSSU5UKSAiR2VuZXJhdGluZyBsaXN0IG9mICQoU1VCU1lTVEVNKSBtb2R1bGVzIGZvciAkKFBMQVRGT1JNKSIKKwlAcm0gLWZyICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XyoKKwlAcm0gLWZyICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUBybSAtZnIgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUBybSAtZnIgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2FwcF9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUBta2RpciAtcCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKQorCUB0b3VjaCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbW9kdWxlcy4kKFNVQlNZU1RFTSkKKwlAdG91Y2ggJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUB0b3VjaCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfYXBwX21vZHVsZXMuJChTVUJTWVNURU0pCisJQGZvciBtb2RfZGlyIGluIGBhd2sgJ3twcmludCAkJDF9JyAkKE1BS0VfREVWSUNFX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSlgOyBkb1wKKwkJaWYgdGVzdCAiJCRtb2RfZGlyIiA9ICIiIDsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJbW9kX25hbWU9YCQoTUFLRSkgLXMgVj0wIFNVQlNZU1RFTT0kKFNVQlNZU1RFTSkgTU9EX0RJUj0kJG1vZF9kaXIgU0tJUF9ERVBTPXllcyAtZiAkKE1BS0VfRElSKS9NYWtlZmlsZS50ZW1wbGF0ZSBtb2R1bGVfbmFtZWA7XAorCQlpZiB0ZXN0ICIkJG1vZF9uYW1lIiA9ICIiIDsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJbW9kX25hbWU9JCR7bW9kX25hbWV9XyQoU1VCU1lTVEVNKTtcCisJCW1vZF90eXBlPWBncmVwIC1lICdeW1s6c3BhY2U6XV0qTU9EX1RZUEVbWzpzcGFjZTpdXSo9JyAkJG1vZF9kaXIvTWFrZWZpbGUgfCBhd2sgLUY9ICd7c3ViKC9cci8sIiIpOyBwcmludCAkJDJ9JyB8IHNlZCAtZSAncy9eWyBcdF0qLy8nYDsgXAorCQllY2hvIC1uICIkJG1vZF9uYW1lICIgPj4gJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX21vZHVsZXMuJChTVUJTWVNURU0pOyBcCisJCWlmIHRlc3QgImBlY2hvIC1uICQkbW9kX3R5cGUgfCBzZWQgLWUgJ3MvbGludXhfbGliIGxpYi9saWIvJyB8IHNlZCAtZSAncy9saWIgbGludXhfbGliL2xpYi8nYCIgPSAibGliIiA7IHRoZW5cCisJCQllY2hvIC1uICIkJG1vZF9uYW1lICIgPj4gJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKTsgXAorCQlmaTtcCisJCWlmIHRlc3QgIiQkbW9kX3R5cGUiID0gImFwcCIgOyB0aGVuXAorCQkJZWNobyAtbiAiJCRtb2RfbmFtZSAiID4+ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9hcHBfbW9kdWxlcy4kKFNVQlNZU1RFTSk7IFwKKwkJZmk7XAorCWRvbmUKKwlAdG91Y2ggJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pX2xpc3RfJChCT0FSRCkKKworJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pXyQoQk9BUkQpOiAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfbGlzdF8kKEJPQVJEKQorCUAkKEJPTERfUFJJTlQpICJCdWlsZGluZyAkKEJPQVJEKSBib2FyZCBlbnZpcm9ubWVudCBmb3IgJChQTEFURk9STSkiCisJJChNQUtFKSBTVUJTWVNURU09JChTVUJTWVNURU0pIE1PRF9ESVI9JCRtb2RfZGlyIE9VVF9ESVJfQkFTRT0kKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKSBTS0lQX0RFUFM9eWVzIFwKKyAgICAgICAgICAgIEFMTF9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKyAgICAgICAgICAgIEFMTF9MSUJfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbGliX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorICAgICAgICAgICAgQUxMX0FQUF9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9hcHBfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisgICAgICAgICAgICAtZiAkKE1BS0VfRElSKS9NYWtlZmlsZS50ZW1wbGF0ZSBib2FyZF9lbnYKKwlAJChCT0xEX1BSSU5UKSAiR2VuZXJhdGluZyAkKFNVQlNZU1RFTSkgZGVwZW5kZW5jaWVzIGZvciAkKFBMQVRGT1JNKSIKKwlAZm9yIG1vZF9kaXIgaW4gYGF3ayAne3ByaW50ICQkMX0nICQoTUFLRV9ERVZJQ0VfRElSKS9tb2R1bGVzLiQoU1VCU1lTVEVNKWA7IGRvXAorCQlpZiB0ZXN0ICIkJG1vZF9kaXIiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQltb2RfbmFtZT1gJChNQUtFKSAtcyBWPTAgU1VCU1lTVEVNPSQoU1VCU1lTVEVNKSBNT0RfRElSPSQkbW9kX2RpciBTS0lQX0RFUFM9eWVzIC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlIG1vZHVsZV9uYW1lYDtcCisJCWlmIHRlc3QgIiQkbW9kX25hbWUiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQlpZiAhICQoTUFLRSkgJChTSUxFTlQpIFNVQlNZU1RFTT0kKFNVQlNZU1RFTSkgTU9EX0RJUj0kJG1vZF9kaXIgT1VUX0RJUl9CQVNFPSQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpIFNLSVBfREVQUz15ZXMgXAorCQkJQUxMX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorCQkJQUxMX0xJQl9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9saWJfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisJCQlBTExfQVBQX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2FwcF9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKwkJCS1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlIG1vZGRlcDsgdGhlbiBleGl0IDE7XAorCQlmaTtcCisJZG9uZQorCUB0b3VjaCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfJChCT0FSRCkKKworLlBIT05ZOgorCisjIE1ha2Ugc3VyZSB0aGF0IG5vbmUgb2YgbW9kdWxlIE1ha2VmaWxlcyBjaGFuZ2VkLgorIyBJZiB0aGVyZSBpcyBhIGNoYW5nZSAtIHdlIG5lZWQgdG8gcmVnZW5lcmF0ZSBkZXBlbmRlbmNpZXMKK19kZXBzXyQoU1VCU1lTVEVNKV86ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV8kKEJPQVJEKSAuUEhPTlkKKwlAY2F0ICQoTUFLRV9ERVZJQ0VfRElSKS9tb2R1bGVzLiQoU1VCU1lTVEVNKSB8IHdoaWxlIHJlYWQgLXIgbW9kX2Rpcl90YXJnOyBkb1wKKwkJCW1vZF9kaXI9YGVjaG8gJCRtb2RfZGlyX3RhcmcgfCBhd2sgJ3twcmludCAkJDF9J2A7XAorCQkJaWYgdGVzdCAiJCRtb2RfZGlyIiA9ICIiIDsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJCWlmIHRlc3QgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pX2xpc3RfJChCT0FSRCkgLW90ICQkbW9kX2Rpci9NYWtlZmlsZTsgdGhlblwKKwkJCQllY2hvICQkbW9kX2Rpci9NYWtlZmlsZSBjaGFuZ2VkLCBtdXN0IHJlZ2VuZXJhdGUgZGVwZW5kZW5jaWVzLjtcCisJCQkJZWNobyBQTEVBU0UgUkUtUlVOIG1ha2U7XAorCQkJCXJtIC1mICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XyQoQk9BUkQpO1wKKwkJCQlleGl0IC0xO1wKKwkJCWZpO1wKKwkJZG9uZQorCitidWlsZF8kKFNVQlNZU1RFTSk6IF9kZXBzXyQoU1VCU1lTVEVNKV8KKwlAJChCT0xEX1BSSU5UKSAiQnVpbGRpbmcgJChTVUJTWVNURU0pIGltYWdlIGZvciAkKFBMQVRGT1JNKSIKKwlAY2F0ICQoTUFLRV9ERVZJQ0VfRElSKS9tb2R1bGVzLiQoU1VCU1lTVEVNKSB8IHdoaWxlIHJlYWQgLXIgbW9kX2Rpcl90YXJnOyBkb1wKKwkJbW9kX2Rpcj1gZWNobyAkJG1vZF9kaXJfdGFyZyB8IGF3ayAne3ByaW50ICQkMX0nYDtcCisJCWlmIHRlc3QgIiQkbW9kX2RpciIgPSAiIiA7IHRoZW4gY29udGludWU7IGZpOyBcCisJCW1vZF90YXJnZXRzPWBlY2hvICQkbW9kX2Rpcl90YXJnIHwgYXdrICd7cHJpbnQgJCQyICQkMyAkJDQgJCQ1fSdgO1wKKwkJaWYgISAkKE1BS0UpICQoU0lMRU5UKSBTVUJTWVNURU09JChTVUJTWVNURU0pIE1PRF9ESVI9JCRtb2RfZGlyIE9VVF9ESVJfQkFTRT0kKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKSBcCisJCQlBTExfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisJCQlBTExfTElCX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKwkJCUFMTF9BUFBfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfYXBwX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorCQkJLWYgJChNQUtFX0RJUikvTWFrZWZpbGUudGVtcGxhdGUgJCRtb2RfdGFyZ2V0czsgdGhlbiBleGl0IDE7XAorCQlmaTtcCisJZG9uZQorCUAkKEJPTERfUFJJTlQpICJGaW5pc2hlZCBidWlsZGluZyAkKFNVQlNZU1RFTSkgaW1hZ2UgZm9yICQoUExBVEZPUk0pIgorCitjbGVhbl8kKFNVQlNZU1RFTSk6IEJPQVJEPSQoc2hlbGwgbHMgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pX2xpc3RfKiAyPi9kZXYvbnVsbCB8IHNlZCAnc0AkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfbGlzdF9AQCcpCisKK2NsZWFuXyQoU1VCU1lTVEVNKToKKwlAJChCT0xEX1BSSU5UKSAiQ2xlYW4gJChQTEFURk9STSkgJChTVUJTWVNURU0pIEJPQVJEPSQoQk9BUkQpIgorCUBmb3IgbW9kX2RpciBpbiBgYXdrICd7cHJpbnQgJCQxfScgJChNQUtFX0RFVklDRV9ESVIpL21vZHVsZXMuJChTVUJTWVNURU0pYDsgZG9cCisJCWlmIHRlc3QgIiQkbW9kX2RpciIgPSAiIiA7IHRoZW4gY29udGludWU7IGZpOyBcCisJCWlmICEgJChNQUtFKSAkKFNJTEVOVCkgU1VCU1lTVEVNPSQoU1VCU1lTVEVNKSBNT0RfRElSPSQkbW9kX2RpciBPVVRfRElSX0JBU0U9JChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikgU0tJUF9ERVBTPXllcyBcCisJCQktZiAkKE1BS0VfRElSKS9NYWtlZmlsZS50ZW1wbGF0ZSBjbGVhbl9tb2R1bGU7IHRoZW4gZXhpdCAxOyBmaTtcCisJZG9uZQorCSQoU0lMRU5UX0JVSUxEKXJtIC1mICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL01ha2VmaWxlLmNvbmZpZy4qCisJJChTSUxFTlRfQlVJTEQpcm0gLWYgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pKgorCSQoU0lMRU5UX0JVSUxEKXJtIC1mICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF8qbW9kdWxlcy4kKFNVQlNZU1RFTSkKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSAnKn4nIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSAnKi5rbycgLXByaW50MCAyPi9kZXYvbnVsbCB8IHhhcmdzIC0wIHJtIC1yZgorCSQoU0lMRU5UX0JVSUxEKWZpbmQgJChTVUJTWVNURU0pIC1uYW1lICcuKi5jbWQnIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSAnKi5vJyAtcHJpbnQwIDI+L2Rldi9udWxsIHwgeGFyZ3MgLTAgcm0gLXJmCisJJChTSUxFTlRfQlVJTEQpZmluZCAkKFNVQlNZU1RFTSkgLW5hbWUgJyoubW9kLmMnIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSBtb2R1bGVzLm9yZGVyIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSBNb2R1bGUuc3ltdmVycyAtcHJpbnQwIDI+L2Rldi9udWxsIHwgeGFyZ3MgLTAgcm0gLXJmCisJJChTSUxFTlRfQlVJTEQpZmluZCAkKFNVQlNZU1RFTSkgLW5hbWUgLnRtcF92ZXJzaW9ucyAtcHJpbnQwIDI+L2Rldi9udWxsIHwgeGFyZ3MgLTAgcm0gLXJmCisgCitoZWxwXyQoU1VCU1lTVEVNKToKKwlAZWNobyAiJCRQTEFURk9STSAkKFNVQlNZU1RFTSkgbW9kdWxlczoiCisJQGNhdCAkKE1BS0VfREVWSUNFX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSkgfCB3aGlsZSByZWFkIC1yIG1vZF9kaXJfdGFyZzsgZG9cCisJCW1vZF9kaXI9YGVjaG8gJCRtb2RfZGlyX3RhcmcgfCBhd2sgJ3twcmludCAkJDF9J2A7XAorCQlpZiB0ZXN0ICIkJG1vZF9kaXIiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQltb2RfbmFtZT1gJChNQUtFKSAtcyBWPTAgU1VCU1lTVEVNPSQoU1VCU1lTVEVNKSBNT0RfRElSPSQkbW9kX2RpciBTS0lQX0RFUFM9eWVzIC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlIG1vZHVsZV9uYW1lYDtcCisJCWlmIHRlc3QgIiQkbW9kX25hbWUiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQllY2hvICIgICIgJCR7bW9kX25hbWV9XyQoU1VCU1lTVEVNKTtcCisJZG9uZQorCisjIFRhcmdldHMgZm9yIGJ1aWxkaW5nIGluZGl2aWR1YWwgJChTVUJTWVNURU0pIG1vZHVsZQorJV8kKFNVQlNZU1RFTSk6OiBfZGVwc18kKFNVQlNZU1RFTSlfCisJQHdoaWxlIHJlYWQgLXIgbW9kX2Rpcl90YXJnOyBkb1wKKwkJbW9kX2Rpcj1gZWNobyAkJG1vZF9kaXJfdGFyZyB8IGF3ayAne3ByaW50ICQkMX0nYDtcCisJCWlmIHRlc3QgIiQkbW9kX2RpciIgPSAiIiA7IHRoZW4gY29udGludWU7IGZpOyBcCisJCW1vZF9uYW1lPWAkKE1BS0UpIC1zIFY9MCBTVUJTWVNURU09JChTVUJTWVNURU0pIE1PRF9ESVI9JCRtb2RfZGlyIFNLSVBfREVQUz15ZXMgLWYgJChNQUtFX0RJUikvTWFrZWZpbGUudGVtcGxhdGUgbW9kdWxlX25hbWVgO1wKKwkJaWYgdGVzdCAiJCRtb2RfbmFtZSIgPSAiIiA7IHRoZW4gY29udGludWU7IGZpOyBcCisJCW1vZF9uYW1lPSQke21vZF9uYW1lfV8kKFNVQlNZU1RFTSk7XAorCQltb2RfdGFyZ2V0cz1gZWNobyAkJG1vZF9kaXJfdGFyZyB8IGF3ayAne3ByaW50ICQkMiAkJDMgJCQ0ICQkNX0nYDtcCisJCWlmIHRlc3QgIiQkbW9kX25hbWUiID0gIiRAIiA7IHRoZW5cCisJCQl0YXJnZXRfZm91bmQ9eTtcCisJCQkkKE1BS0UpICQoU0lMRU5UKSBTVUJTWVNURU09JChTVUJTWVNURU0pIE1PRF9ESVI9JCRtb2RfZGlyIE9VVF9ESVJfQkFTRT0kKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKSBcCisJCQlBTExfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisJCQlBTExfTElCX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKwkJCUFMTF9BUFBfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfYXBwX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorCQkJCS1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlICQkbW9kX3RhcmdldHMgfHwgZXhpdCAxO1wKKwkJZmk7XAorCWRvbmUgPCAkKE1BS0VfREVWSUNFX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSk7XAorCWlmIHRlc3QgIiQkdGFyZ2V0X2ZvdW5kIiAhPSAieSIgOyB0aGVuXAorCQllY2hvIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgJEA7XAorCQlleGl0IDE7XAorCWZpCisKK2RvY3NfJChTVUJTWVNURU0pOiBfZGVwc18kKFNVQlNZU1RFTSlfCisJbWtkaXIgLXAgJChPVVRfRE9DU19ESVIpCisJc2VkIC1lICdzQCVPVVRfRE9DU19ESVJAJChPVVRfRE9DU19ESVIpQGcnIC1lICdzQCVNT0RFTF9ESVJAJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvY29tbW9uL21vZGVsLyQoUExBVEZPUk0pQGcnIFwKKwkJLWUgJ3NAJUFQSV9ESVJAJChUT1BfRElSKS8kKFNVQlNZU1RFTSkvYXBpLyQoUExBVEZPUk0pQGcnIGRvY19jb25maWcvRG94eWZpbGUgPiAkKE9VVF9ET0NTX0RJUikvRG94eWZpbGUKKwlkb3h5Z2VuICQoT1VUX0RPQ1NfRElSKS9Eb3h5ZmlsZQorIApkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvTWFrZWZpbGUucnVsZXMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9NYWtlZmlsZS5ydWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWY0YzBjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvTWFrZWZpbGUucnVsZXMKQEAgLTAsMCArMSw0OTUgQEAKKyMgQ29tbW9uIE1ha2VmaWxlIHJ1bGVzCisjCisKKyMgRm9yIGxpbnV4X2xpYiB3ZSBkb24ndCBidWlsZCBhbnl0aGluZy4gT2JqZWN0IGZpbGVzIGFyZSBqdXN0IGFkZGVkCisjIHdoZW4gY29tcGlsaW5nIG1vZHVsZXMgZGVwZW5kaW5nIG9uIHRoZSBsaWJzCisKK2lmZXEgICgiJChNT0RfVFlQRSkiLCAibGludXhfbGliIikKKwkjIFNraXAgbGlicmFyaWVzIHRoYXQgbWlnaHQgaGF2ZSBjcmVwdCBpbiBkZXBlbmRlbmNpZXMKKyAgICBTS0lQX0xJQl9NT0RVTEVTID0geQorICAgIGV4cG9ydCBTS0lQX0xJQl9NT0RVTEVTCitlbmRpZiAgICAKKworaWZlcSAgKCIkKE1PRF9UWVBFKSIsICJsaW51eF9tb2R1bGUiKQorCSMgU2tpcCBsaWJyYXJpZXMgdGhhdCBtaWdodCBoYXZlIGNyZXB0IGluIGRlcGVuZGVuY2llcworICAgIFNLSVBfTElCX01PRFVMRVMgPSB5CisgICAgZXhwb3J0IFNLSVBfTElCX01PRFVMRVMKK2VuZGlmICAgIAorCitpZmVxICgiJChNT0RfVFlQRSkiLCAibGliIikKKyAgICBNT0RVTEVfSVNfQV9MSUJSQVJZID0geQorZWxzZSBpZmVxICgiJChNT0RfVFlQRSkiLCAic2hhcmVkX2xpYiIpCisgICAgTU9EVUxFX0lTX0FfTElCUkFSWSA9IHkKK2Vsc2UKKyAgICBNT0RVTEVfSVNfQV9MSUJSQVJZID0gbgorZW5kaWYKKworIyBJbmNsdWRlIG1vZHVsZSdzIG93biBhdXRvLWdlbmVyYXRlZCBNYWtlZmlsZS5jb25maWcuJChNT0RVTEUpIGZpbGUgaWYgYW55CisjIEl0IGluIHR1cm4gaW5jbHVkZXMgYWxsIGRlcGVuZGVuY2llcworaWZlcSAoeCIkKFYpIiwgeCIyIikKKyAgICAkKGluZm8gISEhTU9EX05BTUU9JChNT0RfTkFNRSkgTU9EX1RZUEU9JChNT0RfVFlQRSkgTU9EX1RBUkdFVD0kKE1PRF9UQVJHRVQpKQorICAgICQoaW5mbyAhISFJbmNsdWRpbmcgb3duIGRlcGVuZGVuY3kgZmlsZTogJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKSkKK2VuZGlmCistaW5jbHVkZSAkKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpCitpZmVxICh4IiQoVikiLCB4IjIiKQorICAgICQoaW5mbyAhISFBZnRlciBpbmNsdWRlIG9mICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkpCitlbmRpZgorCitpZmVxICh4IiQoVikiLCB4IjIiKQorICAgICQoaW5mbyAhISEgQnVpbGRpbmcgJChNT0RfVFlQRSkgbW9kdWxlICQoTU9EX05BTUUpOiBkZXBlbmRzIG9uICQoTU9EX0RFUFNfRklMRVMpIFNLSVBfTElCUz0kKFNLSVBfTElCX01PRFVMRVMpKQorZW5kaWYKKworIyBTa2lwIGRlZmF1bHQgcnVsZXMgZm9yIGN1c3RvbSBtb2R1bGUKK2lmbmVxICAoIiQoTU9EX0NVU1RPTSkiLCAieSIpCisgCisjIERlZmF1bHQgbGliIHJ1bGUKK2lmZXEgICgiJChNT0RfVFlQRSkiLCAibGliIikKKworaWZlcSAoIiQoU0tJUF9MSUJfTU9EVUxFUykiLCAieSIpCisKKyQoTU9EX1RBUkdFVCk6IAorCitlbHNlCisKKyMgUnVsZSB0byBjb21waWxlIGFsbCBtb2R1bGUncyBDIGZpbGVzIGluIG9uZSBnbworaWZlcSAoIiQoQ09NUElMRV9BTExfSU5fT05FX0dPKSIsICJ5IikgCisKKyQoTU9EX1RBUkdFVCk6ICQoU1JDUykgJChBU19PQkpTKSAkKGFzX09CSlMpCisKKyMgQ3JlYXRlIGxpYnJhcnkgaWYgdGhlcmUgYXJlIGFueSBvYmplY3RzIAoraWZuZXEgKCIkKFNSQ1MpJChBU19TUkNTKSQoYXNfU1JDUykkKEdFTl9TUkNTKSIsICIiKQorCitpZm5lcSAgKCIkKFNSQ1MpJChHRU5fU1JDUykiLCAiIikKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJQGVjaG8gIkNDICQoc3JjcykgJChnZW5fc3JjcykiCitlbmRpZgkKKwkkKFNJTEVOVF9CVUlMRClta2RpciAtcCAkKGRpciAkQCkKKwkkKFNJTEVOVF9CVUlMRCljZCAkKGRpciAkQCkgJiYgJChCTERfQ0MpICQoQ0ZMQUdTKSAtYyAkKFNSQ1MpICQoR0VOX1NSQ1MpCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKWNkICQoZGlyICRAKSAmJiAkKEJMRF9BUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisJJChTSUxFTlRfQlVJTEQpdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKQorCUAkKEJPTERfUFJJTlQpICJkb25lOiAkQCIKKyMgaWZuZXEgKCIkKFNSQ1MpJChBU19TUkNTKSQoYXNfU1JDUykkKEdFTl9TUkNTKSIsICIiKQorZW5kaWYKKworIyBpZmVxICgiJChDT01QSUxFX0FMTF9JTl9PTkVfR08pIiwgInkiKQorZWxzZQorCisjIENyZWF0ZSBsaWJyYXJ5IGlmIHRoZXJlIGFyZSBhbnkgb2JqZWN0cyAKKyQoTU9EX1RBUkdFVCk6ICQoT0JKUykKK2lmbmVxICgiJChPQkpTKSIsICIiKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0FSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKwkkKFNJTEVOVF9CVUlMRCl0b3VjaCAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpCisJQCQoQk9MRF9QUklOVCkgImRvbmU6ICRAIgorZW5kaWYKKworIyBlbmQgb2YgaWZlcSAoJChDT01QSUxFX0FMTF9JTl9PTkVfR08pLCAieSIpCitlbmRpZgorCisjIGVuZCBvZiBpZmVxICgiJChTS0lQX0xJQl9NT0RVTEVTKSIsICJ5IikKK2VuZGlmCisKKyMgZW5kIG9mIGlmZXEgICgiJChNT0RfVFlQRSkiLCAibGliIikKK2VuZGlmCisgCisjIERlZmF1bHQgc2hhcmVkX2xpYiBydWxlCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgInNoYXJlZF9saWIiKQorCitFWFRSQV9DRkxBR1MgKz0gLWZQSUMKKworIyBDcmVhdGUgbGlicmFyeSBpZiB0aGVyZSBhcmUgYW55IG9iamVjdHMgCiskKE1PRF9UQVJHRVQpOiAkKE9CSlMpCitpZm5lcSAoIiQoT0JKUykiLCAiIikKKwkkKFNJTEVOVF9CVUlMRCkkKEJMRF9DQykgLXNoYXJlZCAtcmR5bmFtaWMgLW8gJEAgJChPQkpTKSAkKExGTEFHUykKKwkkKFNJTEVOVF9CVUlMRClta2RpciAtcCAkKFNIQVJFRF9MSUJfUEFUSCkvCisJJChTSUxFTlRfQlVJTEQpY3AgJEAgJChTSEFSRURfTElCX1BBVEgpLworCUAkKEJPTERfUFJJTlQpICJkb25lOiAkQCIKK2VuZGlmCisJJChTSUxFTlRfQlVJTEQpdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKQorCisjIGVuZCBvZiBpZmVxICAoIiQoTU9EX1RZUEUpIiwgInNoYXJlZF9saWIiKQorZW5kaWYKKworIyBEZWZhdWx0IGFwcCBydWxlCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImFwcCIpCisKKyMgQ3VycmVudGx5LCBUaHJlYWRYIGltYWdlIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgYXBwbGljYXRpb25zLCBhcGFydCBmcm9tIHRoZQorIyBpbWFnZSBpdHNlbGYuIERpc2FibGUgYnVpbGRpbmcgYXBwbGljYXRpb25zIGZvciBUaHJlYWRYCitpZm5lcSAoIiQoT1MpIiwgInRocmVhZHgiKQorCiskKE1PRF9UQVJHRVQpOiAkKE9CSlMpICQoTU9EX0RFUFNfRklMRVMpCisJJChTSUxFTlRfQlVJTEQpJChCTERfQ0MpIC1vICRAICQoT0JKUykgJChMRkxBR1MpICQoRVhUUkFfTElCU19QQVRIKSAkKExJQlNfU1RBUlRfTUFSS0VSKSAkKEVYVFJBX0xJQlMpICQoTElCU19FTkRfTUFSS0VSKSAkKExJQlMpCisJJChTSUxFTlRfQlVJTEQpdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKQorCUAkKEJPTERfUFJJTlQpICJkb25lOiAkKE9VVF9ESVIpLyQoTU9EX05BTUUpIgorCisjIGVsc2Ugb2YgaWZuZXEgKCIkKE9TKSIsICJ0aHJlYWR4IikKK2Vsc2UKKworJChNT0RfVEFSR0VUKToKKworCisjIGVuZGlmIG9mIGlmbmVxICgiJChPUykiLCAidGhyZWFkeCIpCitlbmRpZgorCisjIGVuZGlmIG9mIGlmZXEgICgiJChNT0RfVFlQRSkiLCAiYXBwIikKK2VuZGlmCisKKyMgRm9yIGxpbnV4X2xpYiB3ZSBkb24ndCBidWlsZCBhbnl0aGluZy4gT2JqZWN0IGZpbGVzIGFyZSBqdXN0IGFkZGVkCisjIHdoZW4gY29tcGlsaW5nIG1vZHVsZXMgZGVwZW5kaW5nIG9uIHRoZSBsaWJzCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X2xpYiIpCisgICAgTElOVVhfTElCX09CSkVDVFMgOj0gJChzcmNzOiUuYz0kKFNSQ19ESVIpLyUubykKKworJChNT0RfVEFSR0VUKTogJChTUkNTKSAkKEdFTl9TUkNTKSAkKE1PRF9ERVBTX0ZJTEVTKQorCSQoU0lMRU5UX0JVSUxEKXRvdWNoICQoTU9EX1RBUkdFVCkKKwkkKFNJTEVOVF9CVUlMRCl0b3VjaCAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpCisKK2VuZGlmCisKKyMgRGVmYXVsdCBsaW51eF9tb2R1bGUkKHNyY3M6JT0kKFNSQ19ESVIpLyUpCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCisgICAgb2JqLW0gICAgKz0gJChNT0RfTkFNRSkubworICAgICQoTU9EX05BTUUpLW9ianMgOj0gJChzcmNzOiUuYz0lLm8pCisgICAgTElCX09CSlNfUkVMX1BBVEggPSAkKGZvcmVhY2ggb28sJChBTExfTElCX09CSlMpLCQoc2hlbGwgcHl0aG9uIC1jICJpbXBvcnQgb3MucGF0aDsgcHJpbnQgb3MucGF0aC5yZWxwYXRoKCckKG9vKScsICckKFNSQ19ESVIpJykiKSkKKworICAgIF9LRVJORUxfTUFLRVBBUk1TID0gLUMgJChLRVJORUxESVIpIE09JChTUkNfRElSKSBLQlVJTERfRVhUUkFfU1lNQk9MUz0iJChLQlVJTERfRVhUUkFfU1lNQk9MUykiIFwKKyAgICAJTz0kKEtFUk5FTF9PVVRESVIpIEFSQ0g9JChLRVJORUxfQVJDSCkgQ1JPU1NfQ09NUElMRT0kKENST1NTX0NPTVBJTEUpIFY9JChWKSBFWFRSQV9DRkxBR1M9IiQoRVhUUkFfQ0ZMQUdTKSIgXAorICAgIAlvYmotbT0kKG9iai1tKSAkKE1PRF9OQU1FKS1vYmpzPSIkKCQoTU9EX05BTUUpLW9ianMpICQoTElCX09CSlNfUkVMX1BBVEgpIgorICAgIEtFUk5FTF9NQUtFUEFSTVMgPSAkKF9LRVJORUxfTUFLRVBBUk1TOiVvc19hYnN0cmFjdGlvbi9wb3NpeD0lb3NfYWJzdHJhY3Rpb24vbGludXgpCisKKwkjIFByZXZlbnQgcGFyYWxsZWwgYnVpbGQgICAgCisuTk9UUEFSQUxMRUw6CisKKyAgICAjIE9ubHkgYnVpbGQgbGludXggbW9kdWxlIGlmIG5vdCBhbHJlYWR5IGJlaW5nIGJ1aWx0IGJ5IGFub3RoZXIgbWFrZSB0aHJlYWQuCisgICAgIyBPdGhlcndpc2UsIGxpbnV4IGJ1aWxkIHN5c3RlbSBnZXQgY29uZnVzZWQKKyAgICAjIEFsc28sIHJlbW92ZSAtcyBmbGFnIHVzaW5nIE1BS0VGTEFHUy4gT3RoZXJ3aXNlLCBsaW51eCBidWlsZCBzeXN0ZW0gd2lsbCBub3QgcHJpbnQgbmFtZXMgb2YgdGhlIGZpbGVzCisgICAgIyBiZWluZyBjb21waWxlZAorJChNT0RfVEFSR0VUKTogJChTUkNTKSAkKE1PRF9ERVBTX0ZJTEVTKQoraWZuZXEgICgiJChTUkNfRElSKSIsICIkKFRPUF9ESVIpLyQoTU9EX0RJUikiKQorCUBjcCAtZiAkKFRPUF9ESVIpLyQoTU9EX0RJUikvTWFrZWZpbGUgJChTUkNfRElSKQorZW5kaWYKKwkkKFNJTEVOVF9CVUlMRClpZiBbICEgLWYgJChTUkNfRElSKS8uJChNT0RfTkFNRSlfaW5fcHJvZ3Jlc3MgXTsgdGhlbiBcCisJCXRvdWNoICQoU1JDX0RJUikvLiQoTU9EX05BTUUpX2luX3Byb2dyZXNzOyBcCisJCU1BS0VGTEFHUz0gJChNQUtFKSAkKEtFUk5FTF9NQUtFUEFSTVMpIDtcCisJCWlmIFtbICIkJD8iICE9ICIwIiBdXTsgdGhlbiBcCisJCQlybSAtZiAkKFNSQ19ESVIpLy4kKE1PRF9OQU1FKV9pbl9wcm9ncmVzcztcCisJCQlleGl0IC0yO1wKKwkJZmk7IFwKKwkJbWtkaXIgLXAgJChPVVRfRElSX0JBU0UpL2xpbnV4X21vZHVsZXMgO1wKKwkJdG91Y2ggLWMgJChNT0RfVEFSR0VUKSA7XAorCQljcCAkKFNSQ19ESVIpLyQoTU9EX05BTUUpLmtvICQoT1VUX0RJUl9CQVNFKS9saW51eF9tb2R1bGVzLyA7XAorCQl0b3VjaCAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpIDtcCisJCSQoQk9MRF9QUklOVCkgImRvbmU6ICQoTU9EX1RBUkdFVCkiIDtcCisJCXJtIC1mICQoU1JDX0RJUikvLiQoTU9EX05BTUUpX2luX3Byb2dyZXNzIDtcCisJZmkKKworIyBUYWtlIGNhcmUgb2YgY29tcGlsaW5nIGdlbmVyYXRlZCBjb2RlIGZvciBsaW51eCBrZXJuZWwKK2lmbmVxICAoIiQoU1JDX0RJUikiLCAiJChUT1BfRElSKS8kKE1PRF9ESVIpIikKKworJChTUkNfRElSKS8lLmMgOiAkKENPREVHRU5fT1VUUFVUX0RJUikvLi4vJS5jCisJJChTSUxFTlRfQlVJTEQpY3AgLWYgJChDT0RFR0VOX09VVFBVVF9ESVIpLy4uLyouW2MsaF0gJChTUkNfRElSKS8KKworJChTUkNfRElSKS8lLmggOiAkKENPREVHRU5fT1VUUFVUX0RJUikvLi4vJS5oCisJJChTSUxFTlRfQlVJTEQpY3AgLWYgJChDT0RFR0VOX09VVFBVVF9ESVIpLy4uLyouW2MsaF0gJChTUkNfRElSKS8KKworZW5kaWYKKworIyBFbmQgb2YgTU9EX1RZUEU9PWxpbnV4X21vZHVsZQorZW5kaWYKKworZWxzZQorIyBvbmx5IGZvciBNT0RfQ1VTVE9NIGluY2x1ZGUgTW9kdWxlIE1ha2VmaWxlIHNlY29uZCB0aW1lIGZvciBwcm9wYWdhdGUgIAorIyBjdXN0b20gcnVsZXMsIGZpcnN0IHRpbWUgaW5jbHVkZWQgaW4gTWFrZWZpbGUuY29uZmlnIGZvciBhbGwgbW9kdWxlcyAKK2luY2x1ZGUgJChTUkNfRElSKS9NYWtlZmlsZQorIyBFbmQgb2YgaWZuZXEgKCQoTU9EX0NVU1RPTSksIHkpCitlbmRpZgorCiskKE9VVF9ESVIpLyUubzogJChTUkNfRElSKS8lLmMgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQoraWZlcSAoeCIkKFYpIiwgeCIwIikKKwlAZWNobyAiQ0MgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoZGlyICRAKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0NDKSAkKENGTEFHUykgLURfX0JBU0VOQU1FX189YGJhc2VuYW1lICQ8YCAtYyAtbyAkQCAkPAoraWZlcSAoeCIkKFVTRV9MSU5UKSIsIHgieWVzIikKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJQGVjaG8gIkxJTlQgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKUZPUkNFX0xJTlQ9JChGT1JDRV9MSU5UKSAkKE1BS0VfREVWSUNFX0RJUikvbGludC5zaCAkKExJTlRfRkxBR1MpICQoZmlsdGVyIC1JJSAtRCUsICQoQ0ZMQUdTKSkgJDwgfHwgeyBybSAkQDsgZmFsc2U7IH0KK2VuZGlmCitpZmVxICh4IiQoVVNFX0NMQU5HKSIsIHgieSIpCitpZmVxICh4IiQoVikiLCB4IjAiKQorCV9mbj1gYmFzZW5hbWUgIiQ8IiAuY2AgO1wKKwlldmFsICJfZGlzYWJsZV9mbl9zZXQ9XCQke0RJU0FCTEVfQ0xBTkdfJCRfZm59IjsgXAorCWlmIHRlc3QgIiQkX2Rpc2FibGVfZm5fc2V0IiAhPSAieSIgOyB0aGVuIGVjaG8gIkNMQU5HICQ8IjsgZWxzZSBlY2hvICJDTEFORyAkPCAuLi4gc2tpcHBlZCI7IGZpCitlbmRpZgorCV9mbj1gYmFzZW5hbWUgIiQ8IiAuY2AgO1wKKwlldmFsICJfZGlzYWJsZV9mbl9zZXQ9XCQke0RJU0FCTEVfQ0xBTkdfJCRfZm59IjsgXAorCWlmIHRlc3QgIiQkX2Rpc2FibGVfZm5fc2V0IiAhPSAieSIgOyB0aGVuICAkKENMQU5HKSAkKENMQU5HX0ZMQUdTKSAtYyAkPCAtbyAkQC5jbGFuZyAmJiBybSAtZiAkQC5jbGFuZzsgZmkKKyMgaWZlcSAoeCIkKFVTRV9DTEFORykiLCB4InkiKQkKK2VuZGlmCQorCiskKE9VVF9ESVIpLyUubzogJChTUkNfRElSKS8lLnMgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQoraWZlcSAoeCIkKFYpIiwgeCIwIikKKwlAZWNobyAiQVMgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoZGlyICRAKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0FTKSAkKGFzRkxBR1MpIC1vICRAICQ8CisKKyQoT1VUX0RJUikvJS5vOiAkKFNSQ19ESVIpLyUuUyAkKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpCitpZmVxICh4IiQoVikiLCB4IjAiKQorCUBlY2hvICJBUyAkPCIKK2VuZGlmCisJJChTSUxFTlRfQlVJTEQpbWtkaXIgLXAgJChkaXIgJEApCisJJChTSUxFTlRfQlVJTEQpJChCTERfQ0MpICQoQVNGTEFHUykgLW8gJEAgJDwKKworCiskKE9VVF9ESVIpLyUuZDogJChTUkNfRElSKS8lLmMgJChTUkNfRElSKS9NYWtlZmlsZQoraWZuZXEgKCIkKEJVSUxEX0RFUFNfSU5fQ0MpIiwgInkiKQoraWZlcSAoeCIkKFYpIiwgeCIwIikKKwlAZWNobyAiRFAgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoZGlyICRAKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0RFUCkgLU1NIC1NVCAkKEA6LmQ9Lm8pICQoREVQX0ZMQUdTKSAkPCAgPiAkQCAmJiBzZWQgJ3MsXCgkKlwub1wpWyA6XSosXDEgJEAgOiAsZycgLWkgJEAKK2VuZGlmCisKKyQoQ09ERUdFTl9PVVRQVVRfRElSKS8lLm86ICQoQ09ERUdFTl9PVVRQVVRfRElSKS8lLmMgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQoraWZlcSAoeCIkKFYpIiwgeCIwIikKKwlAZWNobyAiQ0MgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoZGlyICRAKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0NDKSAkKENGTEFHUykgLURfX0JBU0VOQU1FX189YGJhc2VuYW1lICQ8YCAtYyAtbyAkQCAkPAorCiskKENPREVHRU5fT1VUUFVUX0RJUikvJS5kOiAkKENPREVHRU5fT1VUUFVUX0RJUikvJS5jICQoU1JDX0RJUikvTWFrZWZpbGUKK2lmbmVxICgiJChCVUlMRF9ERVBTX0lOX0NDKSIsICJ5IikKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJQGVjaG8gIkRQICQ8IgorZW5kaWYKKwkkKFNJTEVOVF9CVUlMRClta2RpciAtcCAkKGRpciAkQCkKKwkkKFNJTEVOVF9CVUlMRCkkKEJMRF9ERVApIC1NTSAtTVQgJChAOi5kPS5vKSAkKERFUF9GTEFHUykgJDwgID4gJEAgJiYgc2VkICdzLFwoJCpcLm9cKVsgOl0qLFwxICRAIDogLGcnIC1pICRACitlbmRpZgorCitpZm5lcSAoIiQoU0tJUF9ERVBTKSIsICJ5ZXMiKQoraWZuZXEgICgiJChNT0RfVFlQRSkiLCAibGludXhfbW9kdWxlIikKK2lmbmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X2xpYiIpCistaW5jbHVkZSAkKE9CSlM6Lm89LmQpCitlbmRpZgorZW5kaWYKK2VuZGlmCisKK0JVSUxEX1VOSVRFU1QgPSAkKFVOSVRFU1QpCitpZmVxICAoIiQoT0JKUykiLCAiIikKKyAgICBCVUlMRF9VTklURVNUID0gbgorZW5kaWYgICAgCitpZmVxICgiJChPUykiLCAidGhyZWFkeCIpCisgICAgQlVJTERfVU5JVEVTVCA9IG4KK2VuZGlmICAgIAorCisjIE9ubHkgYnVpbGQgdW5pdGVzdCBpZiBsaWJyYXJ5IG9iamVjdHMgYXJlIGluY2x1ZGVkCitpZmVxICAoIiQoQlVJTERfVU5JVEVTVCkiLCAieSIpCisKK3VuaXRlc3Q6ICQoT1VUX0RJUikvdW5pdGVzdAorCiskKE9VVF9ESVIpL3VuaXRlc3Q6ICQoT1VUX0RJUikvdW5pdGVzdC5vICQoVEFSR0VUX0xJQl9GTkFNRSkgJChNT0RfREVQU19GSUxFUykKKwkkKFNJTEVOVF9CVUlMRCkkKEJMRF9DQykgLW8gJEAgJChPVVRfRElSKS91bml0ZXN0Lm8gJChMRkxBR1MpICQoRVhUUkFfTElCU19QQVRIKSAkKExJQlNfU1RBUlRfTUFSS0VSKSAkKEVYVFJBX0xJQlMpICQoTElCU19FTkRfTUFSS0VSKSAkKExJQlMpCisJJChTSUxFTlRfQlVJTEQpdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKQorCUAkKEJPTERfUFJJTlQpICJkb25lOiAkQCIKKworIyBlbHNlIG9mIGlmbmVxICAoIiQoQlVJTERfVU5JVEVTVCkiLCAieSIpCitlbHNlIAorCit1bml0ZXN0OiAkKFRBUkdFVF9MSUJfRk5BTUUpICQoTU9EX0RFUFNfRklMRVMpCisJCisjIGVuZGlmIG9mIGlmbmVxICAoIiQoQlVJTERfVU5JVEVTVCkiLCAieSIpCitlbmRpZgorCisjIEdlbmVyYXRlIHZlcnNpb24gaGVhZGVyCitNT0RFTF9SRVZJU0lPTl9GSUxFID0gJChNT0RFTF9PVVRfRElSKS9iY21vbHRfbW9kZWxfcmV2aXNpb24uaCAKKworaWZuZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorJChNT0RFTF9SRVZJU0lPTl9GSUxFKTogJChNT0RFTF9GSUxFKQorCW1rZGlyIC1wICQoTU9ERUxfT1VUX0RJUikKKwlAJChUT1BfRElSKS9zY3JpcHRzL3VwZGF0ZV9tb2RlbF9yZXZpc2lvbi5zaCAkPCAkQAorCisjIEdlbmVyYXRlIHNvdXJjZXMgaWYgbmVjZXNzYXJ5CitpZm5lcSAoIiQoR0VOX1NSQ1MpIiwgIiIpCitpZm5lcSAoIiQoQ1VTVE9NX0NPREVHRU4pIiwgInkiKQorCiskKENPREVHRU5fT1VUUFVUX0RJUikvLmdlbmVyYXRlZDogJChNT0RFTF9GSUxFKSAkKHdpbGRjYXJkICQoQ09ERUdFTl9ESVIpLyopICQod2lsZGNhcmQgJChDT0RFR0VOX0lOUFVUX0RJUikvKikgJChNT0RFTF9SRVZJU0lPTl9GSUxFKQorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkQAorCUBlY2hvICJHZW5lcmF0aW5nIGNvZGUgaW4gJChDT0RFR0VOX09VVFBVVF9ESVIpIGZyb20gbW9kZWwuLi4iCisJQG1rZGlyIC1wICQoQ09ERUdFTl9PVVRQVVRfRElSKQorCSQoU0lMRU5UX0JVSUxEKSQoTU9OT19QQVRIKSAkKENPREVHRU5fRVhFKSAtLWdlbm9iam1vZGVsIC1vYmp0YWdzPSQoR0VOX09CSlRBR1MpIC1vYmpzZXQ9JChNT0RFTF9GSUxFKSBcCisJICAgICAgJChHRU5fRVhUUkFfVFlQRVMpIC10ZW1wbGF0ZWRpcj0kKENPREVHRU5fSU5QVVRfRElSKSAtb3V0ZGlyPSQoQ09ERUdFTl9PVVRQVVRfRElSKQorCSQoU0lMRU5UX0JVSUxEKXRvdWNoICRACisJQGVjaG8gIkNvZGUgZ2VuZXJhdGlvbiBpbiAkKENPREVHRU5fT1VUUFVUX0RJUikgY29tcGxldGUhIgorCiskKEdFTl9TUkNTKTogJChDT0RFR0VOX09VVFBVVF9ESVIpLy5nZW5lcmF0ZWQKKworIyBpZm5lcSAoIiQoQ1VTVE9NX0NPREVHRU4pIiwgInkiKQorZW5kaWYKKworIyBpZm5lcSAgKCIkKEdFTl9TUkNTKSIsICIiKSAKK2VuZGlmCisKKyMgaWZuZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorZW5kaWYKKworIworIyBEZXBlbmRlbmN5IHJ1bGVzIGdlbmVyYXRpb246IC0tPiBNYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKKyMgCisKK01PRF9DT05GSUdfRklMRSA9ICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK01PRF9DT05GSUdfREVGICA9ICQoTU9EX05BTUUpX0RFUF9ERUZJTkVECitpZm5lcSAoIiQoTU9EX0lOQ19ESVJTKSIsICIiKQorICAgICMgTWFrZSBzdXJlIHRoYXQgZWFjaCBkaXJlY3RvcnkgaXMgYW4gYWJzb2x1dGUgcGF0aAorICAgIE1PRF9JTkNTID0gJChhZGRwcmVmaXggLUkkKFRPUF9ESVIpLywgJChzdWJzdCAkKFRPUF9ESVIpLywsJChNT0RfSU5DX0RJUlMpKSkKK2Vsc2UKKwlNT0RfSU5DUyA9IC1JJChTUkNfRElSKQorZW5kaWYKKworIyAKKyMgR2VuZXJhdGUgTWFrZWZpbGUuY29uZmlnLiQoTU9EVUxFKSBjYXBhYmxlIG9mIHJlLWNyZWF0aW5nIHRoZSBtb2R1bGUKKyMKK21vZGRlcDogJChHRU5fU1JDUykKK2lmZXEgKHgiJChWKSIsIHgiMyIpCisJQGVjaG8gIiEhISEhICBtb2RkZXAgZm9yICBNT0RfTkFNRT0kKE1PRF9OQU1FKSBNT0RfVFlQRT0kKE1PRF9UWVBFKSBNT0RfQ1VTVE9NPSQoTU9EX0NVU1RPTSkhISEiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoT1VUX0RJUl9CQVNFKQorCUBybSAtZnIgJChNT0RfQ09ORklHX0ZJTEUpCisJQHJtIC1mciAkKE9CSlM6Lm89LmQpCisKKwlAZWNobyAiaWZlcSAoeFwiJCQiIihWKVwiLCB4XCIyXCIpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIiAgICAkJCIiKGluZm8gISEhIE1PRFVMRT0kJCIiKE1PRF9OQU1FKSAtLT4gJChNT0RfQ09ORklHX0ZJTEUpOiAkKE1PRF9DT05GSUdfREVGKT0kJCIiKCQoTU9EX0NPTkZJR19ERUYpKSwgREVQUz0kKE1PRF9ERVBTKSkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCUBlY2hvICJlbmRpZiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCisgICAgIyBQcmV2ZW50IGRvdWJsZSBpbmNsdXNpb24gCisJQGVjaG8gImlmbmVxIChcIiQkIiIoJChNT0RfQ09ORklHX0RFRikpXCIsIFwieVwiKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIiIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIiQoTU9EX0NPTkZJR19ERUYpIDo9IHkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCisgICAgaWZlcSAgKCIkKE1PRFVMRV9JU19BX0xJQlJBUlkpIiwgInkiKQorCQlAZWNobyAiX3NraXBfaXQgOj0geSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZWxzZQorCQlAZWNobyAiX3NraXBfaXQgOj0gbiIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZW5kaWYKKwlAZWNobyAiaWZuZXEgKFwiJCQiIihTS0lQX0xJQl9NT0RVTEVTKVwiLCBcInlcIikiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCUBlY2hvICIgICAgX3NraXBfaXQgOj0gbiIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gImVuZGlmIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKworCUBlY2hvICJpZm5lcSAoXCIkJCIiKF9za2lwX2l0KVwiLCBcInlcIikiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKworICAgIGlmZXEgICgiJChNT0RVTEVfSVNfQV9MSUJSQVJZKSIsICJ5IikKKyAgICAgICAgaWZuZXEgKCIkKE9CSlMpIiwgIiIpCisJCQlAZWNobyAiRVhUUkFfTElCUyArPSAkKExJQlNfTUFSS0VSKSQoVEFSR0VUX0xJQikiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQkJQGVjaG8gIkVYVFJBX0xJQlNfUEFUSCArPSAkKExJQlNfUEFUSF9NQVJLRVIpJChPVVRfRElSKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmbmVxICgiJChNT0RfTElCUykiLCAiIikKKwkJCUBlY2hvICJFWFRSQV9MSUJTICs9ICQoTU9EX0xJQlMpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICAgICAgZW5kaWYKKwkJQGVjaG8gImlmbmVxICh4XCIkJCIiKE1PRF9OQU1FKVwiLCB4XCIkKE1PRF9OQU1FKVwiKSIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQlAZWNobyAiICAgTU9EX0RFUFNfRklMRVMgKz0gJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKSIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQlAZWNobyAiZW5kaWYiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICAgICAgaWZuZXEgKCIkKHN0YXJ0dXBfc3JjKSIsICIiKQorCQkJQGVjaG8gIiIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCQlAZWNobyAiRU5UUllfUE9JTlRfU1JDID0gJChTUkNfRElSKS8kKHN0YXJ0dXBfc3JjKSIgICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJCUBlY2hvICIiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisKKyAgICBpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X2xpYiIpCisgICAgICAgIGlmbmVxICgiJChPQkpTKSIsICIiKQorCQkJQGVjaG8gIkFMTF9MSUJfT0JKUyArPSAkKExJTlVYX0xJQl9PQkpFQ1RTKSIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgICAgICBlbmRpZgorCQlAZWNobyAiaWZuZXEgKHhcIiQkIiIoTU9EX05BTUUpXCIsIHhcIiQoTU9EX05BTUUpXCIpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICIgICBNT0RfREVQU19GSUxFUyArPSAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICJlbmRpZiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVuZGlmCisKKyAgICBpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCisJCUBlY2hvICJpZm5lcSAoeFwiJCQiIihNT0RfTkFNRSlcIiwgeFwiJChNT0RfTkFNRSlcIikiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJCUBlY2hvICIgICBLQlVJTERfRVhUUkFfU1lNQk9MUyArPSAkKFNSQ19ESVIpL01vZHVsZS5zeW12ZXJzIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJCUBlY2hvICIgICBNT0RfREVQU19GSUxFUyArPSAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICJlbmRpZiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVuZGlmCisKKyAgICAjIE1vZHVsZSBjcmVhdGlvbiBydWxlcworCUBlY2hvICIkKE1PRF9OQU1FKV8kKFNVQlNZU1RFTSk6ICQoT1VUX0RJUl9CQVNFKS8uJChNT0RfTkFNRSkiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIiQoT1VUX0RJUl9CQVNFKS8uJChNT0RfTkFNRSk6IC5GT1JDRSIgICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICBpZmVxICAoIiQoTU9EX0NVU1RPTSkiLCAieSIpCisJCUBlY2hvICIJCSQkIiIoTUFLRSkgTU9EX0RJUj0kKE1PRF9ESVIpIC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlICQoTU9EX1RBUkdFVCkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVsc2UKKyAgICBpZm5lcSAgKCIkKE9CSlMpIiwgIiIpCisJCUBlY2hvICIJCSQkIiIoTUFLRSkgTU9EX0RJUj0kKE1PRF9ESVIpIC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlICQoTU9EX1RBUkdFVCkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVuZGlmCisgICAgaWZlcSAgKCIkKE9CSlMpIiwgIiIpCisJCUBlY2hvICIJCWlmIFsgISAtZiAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpIF07IHRoZW4gdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKTsgZmkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVuZGlmCisgICAgZW5kaWYKKwlAZWNobyAiIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIi5GT1JDRToiICAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCisgICAgaWZuZXEgKCIkKE1PRF9ERUZTKSIsICIiKQorCQlAZWNobyAiRVhUUkFfQ0ZMQUdTICs9ICQoTU9EX0RFRlMpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICBlbmRpZgorCQorCUBlY2hvICJlbmRpZiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCisgICAgIyBJZiBpdCBpcyBhIGxpYnJhcnkgYW5kIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCBhcyBzb21lb25lJ3MgZGVwZW5kZW5jeSAtIGV4dGVuZCBNT0RfREVQX0ZVTExfTkFNRVMKKyAgICAjIGFuZCBnZW5lcmF0ZSBhIHJ1bGUgdG8gcmVidWlsdCB0aGUgbGlicmFyeQorICAgIGlmbmVxICgiJChNT0RfREVQUykiLCAiIikKKwkJQGVjaG8gImlmZXEgKHhcIiQkIiIoVilcIiwgeFwiMlwiKSIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQlAZWNobyAiICAgJCQiIihpbmZvICEhISBOb3cgaW5jbHVkZSBkZXBlbmRlbmNpZXMgJChNT0RfREVQUykpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gImVuZGlmIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICIkKE1PRF9OQU1FKV9NT0RfREVQUyA9ICQoTU9EX0RFUFMpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gImlmbmVxICh4XCIkJCIiKFNLSVBfREVQUylcIiwgeFwieWVzXCIpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICJpbmNsdWRlICQkIiIoJChNT0RfTkFNRSlfTU9EX0RFUFM6JT0kKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiUpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gImVuZGlmIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICJpZmVxICh4XCIkJCIiKFYpXCIsIHhcIjJcIikiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gIiAgICQkIiIoaW5mbyAhISEgJChNT0RfTkFNRSkgZmluaXNoZWQgaW5jbHVkaW5nIGRlcGVuZGVuY2llcykiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQlAZWNobyAiZW5kaWYiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICBlbmRpZgorCisJQGVjaG8gIkVYVFJBX0NGTEFHUyArPSAkKE1PRF9JTkNTKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisKKwlAZWNobyAiIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiZW5kaWYiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorIyAKKyMgZW5kIG9mIG1vZGRlcDogdGFyZ2V0CisjCisKK2NsZWFuX21vZHVsZToKK2lmZXEgICgiJChNT0RfVFlQRSkiLCAibGludXhfbW9kdWxlIikKKwkkKFNJTEVOVF9CVUlMRCktdGVzdCAtZiAkKFNSQ19ESVIpL01ha2VmaWxlICYmICQoTUFLRSkgJChLRVJORUxfTUFLRVBBUk1TKSBjbGVhbgorCSQoU0lMRU5UX0JVSUxEKWNkICQoU1JDX0RJUikgJiYgcm0gLWZyICQoJChNT0RfTkFNRSktb2JqcykgJCgkKE1PRF9OQU1FKS1vYmpzOi4uLyU9Li4vLiUuY21kKQorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkKE9VVF9ESVJfQkFTRSkvbGludXhfbW9kdWxlcy8kKE1PRF9OQU1FKS5rbworZW5kaWYKK2lmZXEgICgiJChNT0RfVFlQRSkiLCAibGludXhfbGliIikKKwkkKFNJTEVOVF9CVUlMRClybSAtZnIgJChMSU5VWF9MSUJfT0JKRUNUUykKK2VuZGlmCQorCSQoU0lMRU5UX0JVSUxEKWNkICQoU1JDX0RJUikgJiYgcm0gLWZyICQocGF0c3Vic3QgJS5jLC4lLm8uY21kLCQoc3JjcykpCisJJChTSUxFTlRfQlVJTEQpWyAhIC1kICQoT1VUX0RJUikgXSB8fCBmaW5kICQoT1VUX0RJUikgLW5hbWUgJyouW28sZCxhXScgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgorCSQoU0lMRU5UX0JVSUxEKVsgISAtZCAkKE9VVF9ESVIpIF0gfHwgZmluZCAkKE9VVF9ESVIpIC1uYW1lICcqficgICAgICAgIC1wcmludDAgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClbICEgLWQgJChPVVRfRElSKSBdIHx8IGZpbmQgJChPVVRfRElSKSAtbmFtZSAnKi5rbycgICAgICAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLXJmCisJJChTSUxFTlRfQlVJTEQpWyAhIC1kICQoT1VUX0RJUikgXSB8fCBmaW5kICQoT1VUX0RJUikgLW5hbWUgJy4qLmNtZCcgICAgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkKFNSQ19ESVIpLyoubW9kLmMgJChTUkNfRElSKS9tb2R1bGVzLm9yZGVyICQoU1JDX0RJUikvTW9kdWxlLnN5bXZlcnMgJChTUkNfRElSKS8udG1wX3ZlcnNpb25zCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoTU9EX1RBUkdFVCkgJChPVVRfRElSKS8kKFRBUkdFVCkgJChPVVRfRElSKS91bml0ZXN0ICQoVEFSR0VUX0xJQl9GTkFNRSkKKwkkKFNJTEVOVF9CVUlMRClybSAtZnIgJChBTExfTElCX09CSlMpCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoR0VOX1NSQ1MpICQoQ09ERUdFTl9PVVRQVVRfRElSKS8uZ2VuZXJhdGVkCitpZm5lcSAoIiQoTU9EX05BTUUpIiwgIiIpCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoT1VUX0RJUl9CQVNFKS8uJChNT0RfTkFNRSkKKwkkKFNJTEVOVF9CVUlMRClybSAtZnIgJChTUkNfRElSKS8uJChNT0RfTkFNRSlfaW5fcHJvZ3Jlc3MKK2VuZGlmCQorICAgIAorY2xvYmJlcjogY2xlYW5fbW9kdWxlCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoT1VUX0RJUikKKworIyBPcHRpb25hbCBwbGF0Zm9ybS1zcGVjaWZpYyBydWxlcworLWluY2x1ZGUgJChNQUtFX0RFVklDRV9ESVIpL01ha2VmaWxlLiQoU1VCU1lTVEVNKS5ydWxlcworCisjIEdlbmVyYXRlIGJvYXJkLXNwZWNpZmljIGVudmlyb25tZW50IGlmIGFueQorYm9hcmRfZW52OiAkKEJPQVJEX0VOVl9SVUxFKQorCQorCittb2R1bGVfbmFtZToKKwkkKGluZm8gJChNT0RfTkFNRSkpCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9NYWtlZmlsZS50ZW1wbGF0ZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzM2U5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9NYWtlZmlsZS50ZW1wbGF0ZQpAQCAtMCwwICsxLDEyIEBACisjIENlbnRyYWwgTWFrZWZpbGUgdGVtcGxhdGUKKyMgQnVpbGRzIHNwZWNpZmljIG1vZHVsZQorIyBJbnB1dCBwYXJhbWV0ZXJzOgorIyBNT0RfRElSCisjIFRPUF9ESVIKKworaWZlcSAoeCIkKFYpIiwgeCIxIikKKyAgICAkKGluZm8gQnVpbGRpbmcgbW9kdWxlICQoTU9EX0RJUikpCitlbmRpZgorCitpbmNsdWRlICQoTUFLRV9ESVIpL01ha2VmaWxlLmNvbmZpZworaW5jbHVkZSAkKE1BS0VfRElSKS9NYWtlZmlsZS5ydWxlcwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvTWFrZWZpbGUuaG9zdC5jb25maWcgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9NYWtlZmlsZS5ob3N0LmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQyYjExCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvTWFrZWZpbGUuaG9zdC5jb25maWcKQEAgLTAsMCArMSwyMyBAQAorIyBNYXBsZSBob3N0IGNvbmZpZ3VyYXRpb24KKyMKKyMgU2V0IGVudmlyb25tZW50LCBleHRyYSBmbGFncywgZXRjLgorIyBJbiBwYXJ0aWN1bGFyLCBzZXQgQ1JPU1NfQ09NUElMRQorIyBGb3IgbGludXggZW52aXJvbm1lbnQgbWFrZSBzdXJlIHRvIHNldCBhbHNvIE9TX0tFUk5FTD1saW51eCwgS0VSTkVMRElSLCBLRVJORUxfT1VURElSIGFuZCBLRVJORUxfQVJDSAoraWZuZXEgKCIkKEJPQVJEKSIsICIiKQorICAgIGluY2x1ZGUgJChNQUtFX0RFVklDRV9ESVIpL2JvYXJkLiQoQk9BUkQpLmNvbmZpZworZW5kaWYKKworaW5jbHVkZSAkKE1BS0VfREVWSUNFX0RJUikvJChUT09MQ0hBSU4pLm9wdHMKKworZXhwb3J0IEtFUk5FTERJUgorZXhwb3J0IEtFUk5FTF9PVVRESVIKK2V4cG9ydCBLRVJORUxfQVJDSAorZXhwb3J0IE9TX0tFUk5FTAorCitpZmVxICgiJChVU0VfT05VX1NJTSkiLCAieSIpCisgICAgQ0ZMQUdTICs9IC1EQ09ORklHX09OVV9TSU0KKyAgICBleHBvcnQgQ09ORklHX09OVV9TSU0gOj0geQorZW5kaWYKKworTElOVF9GTEFHUyA9IC1lNjg2ICQoTUFLRV9ERVZJQ0VfRElSKS9nY2MubG50ICQoTUFLRV9ERVZJQ0VfRElSKS9jb25maWcubG50CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL01ha2VmaWxlLmhvc3QucnVsZXMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9NYWtlZmlsZS5ob3N0LnJ1bGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzRjNDQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9NYWtlZmlsZS5ob3N0LnJ1bGVzCkBAIC0wLDAgKzEsNyBAQAorIyBNYXBsZSBob3N0IHJ1bGVzCisjCisjIFBsYXRmb3JtL2JvYXJkLXNwZWNpZmljIHJ1bGVzCisjIEluIHBhcnRpY3VsYXIsIHNldCBCT0FSRF9FTlZfUlVMRSBpZiB0aGVyZSBpcyBhbnl0aGluZyBib2FyZC1zcGVjaWZpYyB0byBiZSBkb25lCitpZm5lcSAoIiQoQk9BUkQpIiwgIiIpCisgICAgLWluY2x1ZGUgJChNQUtFX0RFVklDRV9ESVIpL2JvYXJkLiQoQk9BUkQpLnJ1bGVzCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvYXJtY2MubG50IGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvYXJtY2MubG50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWE3NjYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9hcm1jYy5sbnQKQEAgLTAsMCArMSw1IEBACistaS9wcm9qZWN0cy94cG9uX2NvX2xpbnQvc291cmNlcy9zdXBwL2xudAorY28tQVJNQ0MtNS5sbnQKKy1pL3Rvb2xzL2FybS9EUy01XzUuMTguMC9MaW51eC02NC9pbmNsdWRlCistZCJfX2ludDY0PWxvbmcgbG9uZyIKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvYm9hcmQucmVtb3RlX3dyeC5jb25maWcgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9ib2FyZC5yZW1vdGVfd3J4LmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2NmYjMyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvYm9hcmQucmVtb3RlX3dyeC5jb25maWcKQEAgLTAsMCArMSwyNSBAQAorIyBSZW1vdGUgV1JYIGJvYXJkCisjCitleHBvcnQgQ09ORklHX1RSQU5TUE9SVF9SQVcgPSBuCisKK2lmZXEgKCIkKFNVQlNZU1RFTSkiLCAiZW1iZWRkZWQiKQorICAgICQoZXJyb3IgQ2FuJ3QgYnVpbGQgZW1iZWRkZWQgc3Vic3lzdGVtIGZvciB0aGlzIGJvYXJkKQorZWxzZQorICAgIEFSQ0hfRkxBR1MgICAgICArPSAtRUIgLW1hYmk9NjQKKyAgICBUT09MQ0hBSU5fUEFUSCAgPz0gL29wdC90b29sY2hhaW5zL21hcGxlL3Rvb2xjaGFpbnNfYmluL21pcHNjcm9zcy9saW51eC9iaW4KKyAgICBDUk9TU19DT01QSUxFICAgPSAkKFRPT0xDSEFJTl9QQVRIKS9taXBzNjQtbmxtLWxpbnV4LQorCisgICAgIyBhIGtsdWRnZSBoZXJlLiBJZiBDT05GSUdfVFJBTlNQT1JUX1JBVyBpcyBub3Qgc2V0LCB0aGF0IG1lYW5zIHRoYXQgd2UgYXJlIGJ1aWxkaW5nIGZvciAKKyAgICAjIHdyeCwgYnV0IG5vdCB0aGUgc2FtZSB3cnggd2hlcmUgTWFwbGUgaXMuIEZvciBleGFtcGxlLCBidWlsZGluZyBmb3IgV1JYIHRoYXQgY29udHJvbHMgCisgICAgIyBzd2l0Y2ggZGlyZWN0bHkgYW5kIG1hcGxlIHJlbW90ZWx5LiBJbiB0aGlzIGNhc2UsIHdlIGRvbid0IHdhbnQgYW55IGJvYXJkLXNwZWNpZmljIHN0dWZmCisgICAgIyB0byBiZSBjb21waWxlZCBpbiAoZS5nLiwgRlBHQSwgSTJDLCBldGMuKS4KKyAgICBvdmVycmlkZSBCT0FSRCA9CisgICAgCisgICAgIyBPUyBmb3IgdXNlciBzcGFjZSAKKyAgICBPUyAgICAgICAgICAgICAgPSBwb3NpeAorICAgIAorICAgIFNJTVVMQVRJT05fQlVJTEQgPSB5CisgICAKK2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvYm9hcmQud3J4LmNvbmZpZyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2JvYXJkLndyeC5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliZGYxMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2JvYXJkLndyeC5jb25maWcKQEAgLTAsMCArMSwxMTIgQEAKKyMgV1JYIGJvYXJkCisjCisKKyMgVXNlIHJhdyB0cmFuc3BvcnQKK2V4cG9ydCBDT05GSUdfVFJBTlNQT1JUX1JBVyA9IHkKKworRU5BQkxFX1BNQyAgID89IHkKKworaWZlcSAoIiQoRU5BQkxFX1BNQykiLCAieSIpCisgICAgRVhUUkFfQ0ZMQUdTICAgKz0gLURCQ01fUE1DX0VYSVNUCitlbmRpZgorCitpZmVxICgiJChTVUJTWVNURU0pIiwgImVtYmVkZGVkIikKKyAgICBUT09MQ0hBSU4gPSBhcm1jYworICAgIE9TPXRocmVhZHgKKwkgICAgCisgICAgIyBXZSB1c2UgZ2NjIGZvciBkZXBlbmRlbmN5IGdlbmVyYXRpb24gaW4gb3JkZXIgdG8gc3BlZWQgdXAgdGhlIGJ1aWxkIHByb2Nlc3MKKyAgICBHQ0NWRVIgPz0gNC44LjEKKyAgICAKKyAgICAjIFVzZSByYXcgdHJhbnNwb3J0CisgICAgIyBTaG91bGQgYmUgbW92ZWQgZ28gY29tbW9uIGhvc3QvZW1iZWRkZWQgc2VjdGlvbiB3aGVuIHRoZSBob3N0IGVudmlyb25tZW50IGlzIHJlYWR5CisgICAgQ09NUElMRV9BTExfSU5fT05FX0dPID89IG4KKyAgICBleHBvcnQgQ09NUElMRV9BTExfSU5fT05FX0dPCisKKyAgICAjIERlZmluaXRpb24gZm9yIGVuYWJsZSBQZXJpb2RpYyAgQVJNIERTLTUgbGljZW5zZSBtb2RlbCwgdXAgdG8gNFggaW1wcm92ZW1lbnQgZm9yIGNvbXBpbGF0aW9uIHRpbWUgCisgICAgIyB0aGUgb3V0cHV0IGZyb20gdGhlIC90b29scy9iaW4vZ2V0X2xpY19zZXJ2ZXJzIGFybTUtcGVyaW9kaWMgaXMgb3B0aW1pemVkIGZvciBlYWNoIHNpdGUsIHRoZSAKKyAgICAjICIzODIyNEBsaWMtdGx2YS0wMDE6MzgyMjRAbGljLWJsci0wMDE6MzgyMjRAbGljLWlydmEtMzUwOjM4MjI0QGxpYy1pcnZhLTAwMCIgc3RyaW5nIGlzIHZhbGlkZSBmb3IgSFogc2l0ZQorICAgIGV4cG9ydCBBUk1MTURfTElDRU5TRV9GSUxFIDo9JChzaGVsbCBpZiBbIC1mIC90b29scy9iaW4vZ2V0X2xpY19zZXJ2ZXJzIF0gOyB0aGVuIC90b29scy9iaW4vZ2V0X2xpY19zZXJ2ZXJzIGFybTUtcGVyaW9kaWMgOyBcCitlbHNlIGVjaG8gIjM4MjI0QGxpYy10bHZhLTAwMS5icm9hZGNvbS5uZXQ6MzgyMjRAbGljLWJsci0wMDEuYnJvYWRjb20ubmV0OjM4MjI0QGxpYy1pcnZhLTM1MC5icm9hZGNvbS5uZXQ6MzgyMjRAbGljLWlydmEtMDAwLmJyb2FkY29tLm5ldCI7IGZpKQorICAgIGV4cG9ydCBBUk1DQzVfQ0NPUFQgICAgICAgIDo9LS1zaXRlbGljZW5zZSAtLWxpY3JldHJ5CisgICAgZXhwb3J0IEFSTUNDNV9BU01PUFQgICAgICAgOj0tLXNpdGVsaWNlbnNlIC0tbGljcmV0cnkKKyAgICBleHBvcnQgQVJNQ0M1X0xJTktPUFQgICAgICA6PS0tc2l0ZWxpY2Vuc2UgLS1saWNyZXRyeQorICAgIGV4cG9ydCBBUk1DQzVfRlJPTUVMRk9QVCAgIDo9LS1zaXRlbGljZW5zZSAtLWxpY3JldHJ5CisgICAgZXhwb3J0IEFSTUNDNV9BUk9QVCAgICAgICAgOj0tLXNpdGVsaWNlbnNlIC0tbGljcmV0cnkKKyAgIAorICAgIFVTRV9VTkNBQ0hFX0JXX01BUCA/PSBuCisgICAgZXhwb3J0IFVTRV9VTkNBQ0hFX0JXX01BUCAKKyAgICBVU0VfVU5DQUNIRV9TUl9OU1JfQ09VTlRFUlMgPz0gbgorICAgIGV4cG9ydCBVU0VfVU5DQUNIRV9TUl9OU1JfQ09VTlRFUlMKKworICAgIGlmZXEgKCIkKFNJTVVMQVRJT04pIiwgInkiKQorICAgICAgICBFWFRSQV9ERUZJTkVTICs9IC1EU0lNVUxBVElPTgorICAgIGVuZGlmCisJCisJVVNFX1NZTV9UQUIgPz0geQorCWV4cG9ydCBVU0VfU1lNX1RBQgorCQorCWlmZXEgKCIkKFVTRV9TWU1fVEFCKSIsICJ5IikKKwkJCisJCWV4cG9ydCBTWU1UQUJfR0VOX1RPT0xTID0gJChUT1BfRElSKS9zY3JpcHRzL2JjbVN5bVRsYkdlbi5zaCAKKwkJCisJCWlmZXEgKCIkKFNZTVRBQl9OT19EQVRBKSIsICJ5IikKKwkJICAgIGV4cG9ydCBTWU1UQUJfTkQ9LW5kCisJICAgIGVuZGlmCisJCisJICAgIGlmZXEgKCIkKFNZTVRBQl9OT19MREFUQSkiLCAieSIpCisJCSAgIGV4cG9ydCBTWU1UQUJfTkxEPS1ubGQKKwkgICAgZW5kaWYKKwkKKwkgICAgaWZlcSAoIiQoU1lNVEFCX05PX0xGQU5DKSIsICJ5IikKKwkJICAgIGV4cG9ydCBTWU1UQUJfTkxGPS1ubGYKKwkgICAgZW5kaWYKKwkJCisJCUVYVFJBX0RFRklORVMgKz0gLURVU0VfU1lNX1RBQgkKKwkJCisJCWV4cG9ydCBEVU1NWV9TWU1UQUIgPSAkKFRPUF9ESVIpL2VtYmVkZGVkL3N5cy9ic3Avc3ltdGFiLmMKKwllbmRpZgorICAgIAorICAgIGlmZXEgKCIkKEVOQUJMRV9UUkFDRSkiLCAieSIpCisgICAgICAgIEVYVFJBX0RFRklORVMgKz0gLURUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKyAgICAgICAgaWZlcSAoIiQoREVCVUdfVFJBQ0VfSU5JVCkiLCAieSIpCisgICAgICAgICAgICBFWFRSQV9ERUZJTkVTICs9IC1EREVCVUdfVFJBQ0VfSU5JVAorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgCQorICAgIElOVF9DSEVDSyAgICA/PSB5CisgICAgaWZlcSAoIiQoSU5UX0NIRUNLKSIsICJ5IikKKyAgICAgICAgRVhUUkFfREVGSU5FUyArPSAtRElOVEVSUlVQVF9WQUxJREFUSU9OCisgICAgZW5kaWYKK2Vsc2UKKyAgICBCT0FSRF9ESVIgICAgICAgPz0gJChUT1BfRElSKS8uLi9ib2FyZHMvY3VyLyQoQk9BUkQpCisgICAgS0VSTkVMX0JSQ01fVkVSID0gMy4wLjItbTEuMDEKKyAgICBUT09MQ0hBSU5fUEFUSCAgPz0gL29wdC90b29sY2hhaW5zL21hcGxlL3Rvb2xjaGFpbnNfYmluL21pcHNjcm9zcy9saW51eC9iaW4KKyAgICBDUk9TU19DT01QSUxFICAgPSAkKFRPT0xDSEFJTl9QQVRIKS9taXBzNjQtbmxtLWxpbnV4LQorICAgIAorICAgIEtFUk5FTERJUiAgICAgICA9ICQoQk9BUkRfRElSKS9saW51eC8kKEtFUk5FTF9CUkNNX1ZFUikvbGludXgKKyAgICBLRVJORUxfT1VURElSICA/PSAkKEtFUk5FTERJUikKKyAgICBleHBvcnQgS0VSTkVMRElSCisgICAgZXhwb3J0IEtFUk5FTF9PVVRESVIKKworCisgICAgIyB1c2UgTGludXgga2VybmVsCisgICAgZXhwb3J0IE9TX0tFUk5FTD0gbGludXgKKyAgICAjIE9TIGZvciB1c2VyIHNwYWNlIAorICAgIE9TICAgICAgICAgICAgICA9IHBvc2l4CisgICAgCisgICAgIyBBcmNoaXRlY3R1cmUgZGVmaW5pdGlvbiAgIAorICAgIEtFUk5FTF9BUkNIICAgICA9IG1pcHMKKyAgICBBUkNIX0ZMQUdTICAgICAgKz0gLUVCIC1tYWJpPTY0CisgICAgCisgICAgZXhwb3J0IEtFUk5FTF9BUkNICisgICAgZXhwb3J0IEFSQ0hfRkxBR1MKKyAgICAKKyAgICBleHBvcnQgS0VSTkVMX1RBUl9OQU1FICA9IHdyeF9saW51eC1zZGsudGFyLmJ6MgorICAgIGV4cG9ydCBMSUJTX1RBUl9OQU1FICAgID0gbGlicmFyaWVzLnRhci5iejIKKyAgICAKKyAgICAjIFJ1bGUgdHUgYnVpbGQgd3J4IGtlcm5lbC4gVGhlIHJ1bGUgaXRzZWxmIGlzIGRlZmluZWQgaW4gYm9hcmQud3J4LnJ1bGVzCisgICAgZXhwb3J0IEJPQVJEX0VOVl9SVUxFICAgPSB3cnhfbGludXhfa2VybmVsIAorICAgIAorZW5kaWYKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9ib2FyZC53cngucnVsZXMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9ib2FyZC53cngucnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0NmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2JvYXJkLndyeC5ydWxlcwpAQCAtMCwwICsxLDI2IEBACisjIFdSWC1zcGVjaWZpYyBydWxlcworCitpZmVxICgiJChTVUJTWVNURU0pIiwgImhvc3QiKQorICAgICMgQnVpbGQgbGludXgga2VybmVsIGlmIG5vdCBkb25lIHlldAorCit3cnhfbGludXhfa2VybmVsOgorCWlmIFsgISAtZCAkKEJPQVJEX0RJUikgXTsgdGhlblwKKwkJJChCT0xEX1BSSU5UKSAiRVJST1I6ICQoQk9BUkRfRElSKSBkaXJlY3RvcnkgZG9lc24ndCBub3QgZXhpc3QiIDsgXAorCQlleGl0IC0xOyBcCisJZmk7XAorICAgIGlmIFsgLWYgICQoS0VSTkVMX09VVERJUikvdm1saW51eCBdIDsgdGhlbiBcCisgICAgICAgICQoQk9MRF9QUklOVCkgImZvdW5kIGNvbXBpbGVkICQoQk9BUkQpIGtlcm5lbCBpbiAkKEtFUk5FTF9PVVRESVIpIiA7XAorICAgICAgICBleGl0IDA7XAorICAgIGZpO1wKKwlpZiBbICEgLWYgJChCT0FSRF9ESVIpL2xpbnV4LyQoS0VSTkVMX0JSQ01fVkVSKS8kKEtFUk5FTF9UQVJfTkFNRSkgXTsgdGhlblwKKwkJJChCT0xEX1BSSU5UKSAiRVJST1I6IEtlcm5lbCB0YXIgZmlsZSBkb2Vzbid0IGV4aXN0LiBQbGVhc2UgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiAkKEJPQVJEX0RJUikvbGludXgvJChLRVJORUxfQlJDTV9WRVIpLyQoS0VSTkVMX1RBUl9OQU1FKSAiO1wKKwkJZXhpdCAtMTtcCisJZmk7XAorCWlmIFsgISAtZiAkKEJPQVJEX0RJUikvbGludXgvJChLRVJORUxfQlJDTV9WRVIpLyQoTElCU19UQVJfTkFNRSkgXTsgdGhlbiBcCisJCSQoQk9MRF9QUklOVCkgIkVSUk9SOiBLZXJuZWwgTGlicmFyaWVzIHRhciBmaWxlIG5vdCBleGlzdHMuIFBsZWFzZSBnZXQgbGF0ZXN0IHZlcnNpb24gb2YgJChCT0FSRF9ESVIpL2xpbnV4LyQoS0VSTkVMX0JSQ01fVkVSKS8kKExJQlNfVEFSX05BTUUpICI7XAorCQlleGl0IC0xO1wKKwlmaTtcCisJJChCT0xEX1BSSU5UKSAiQnVpbGRpbmcgd3J4IGtlcm5lbCI7XAorCWNkICQoQk9BUkRfRElSKTsgICQoTUFLRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2djYy5sbnQgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9nY2MubG50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2MxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9nY2MubG50CkBAIC0wLDAgKzEsNSBAQAorLWkvcHJvamVjdHMveHBvbl9jb19saW50L3NvdXJjZXMvc3VwcC9sbnQKK2NvLWdjYy5sbnQKKy1lbWFjcm8oNjMzLCBCVUdfT04pCistcGFyZW50KHZhX2xpc3QsIF9fZ251Y192YV9saXN0KQorLXBhcmVudCh2YV9saXN0LCBfX2J1aWx0aW5fdmFfbGlzdCkKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2djYy5vcHRzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvZ2NjLm9wdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4YjQwMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2djYy5vcHRzCkBAIC0wLDAgKzEsNTMgQEAKKyMgTWFwbGUgU0RLIHJlcXVpcmVzIEM5OQorRVhUUkFfQ0ZMQUdTICAgICs9IC1XYWxsIC1XZXJyb3IKK0FSRkxBR1MgPSByCisKK0JMRF9DQyA9ICQoQ0NBQ0hFKSAkKENST1NTX0NPTVBJTEUpZ2NjCitCTERfQVMgPSAkKENDQUNIRSkgJChDUk9TU19DT01QSUxFKWdjYworQkxEX0FSID0gJChDUk9TU19DT01QSUxFKWFyCitCTERfREVQID0gJChCTERfQ0MpCisKK0NGTEFHUyAgICArPSAtc3RkPWM5OQoraWZlcSAoIiQoRU5BQkxFX0VYVFJBX1dBUk5JTkdTKSIsICJ5IikKKyAgICBDRkxBR1MgICAgKz0gLVdleHRyYSAtV2JhZC1mdW5jdGlvbi1jYXN0IC1XY2FzdC1hbGlnbiAtV2Nhc3QtcXVhbCAtV2NoYXItc3Vic2NyaXB0cworICAgIENGTEFHUyAgICArPSAtV21pc3NpbmctcHJvdG90eXBlcyAtV25lc3RlZC1leHRlcm5zIC1XcG9pbnRlci1hcml0aCAtV3JlZHVuZGFudC1kZWNscworICAgIENGTEFHUyAgICArPSAtV3N0cmljdC1wcm90b3R5cGVzIC1XcGFyZW50aGVzZXMgLVdzd2l0Y2ggLVdzd2l0Y2gtZGVmYXVsdCAtV3VudXNlZCAtV3VuaW5pdGlhbGl6ZWQgLVd1bnVzZWQtYnV0LXNldC12YXJpYWJsZQorICAgIENGTEFHUyAgICArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLXNpZ24tY29tcGFyZQorICAgIENGTEFHUyAgICArPSAtV3NoYWRvdyAtV25vLWlubGluZQorZW5kaWYKKworQlVJTERfREVQU19JTl9DQyAgICA/PSB5CitleHBvcnQgQlVJTERfREVQU19JTl9DQworCitpZmVxICgiJChCVUlMRF9ERVBTX0lOX0NDKSIsICJ5IikKKyAgICBDRkxBR1MgKz0gLU1NRCAtTVAKK2VuZGlmCisKK2lmZXEgKCIkKENST1NTX0NPTVBJTEUpIiwgIiIpCisgICAgQVJDSF9GTEFHUyArPSAtbTMyIC1tYXJjaD1pMzg2CisgICAgU0lNVUxBVElPTl9CVUlMRCA/PSB5CisgICAgZXhwb3J0IFNJTVVMQVRJT05fQlVJTEQKKyAgICBHQ0NWRVIgPz0gNC44LjEKKyAgICBleHBvcnQgR0NDVkVSCisgICAgIyBUZW1wb3JhcnksIHVudGlsIGJhZCBjYXN0IGluIGJjbV9kZXZfbG9nX3Rhc2suYyBpcyBmaXhlZCAoU1dNQVBMRS0yMTIzKQorICAgIENGTEFHUyArPSAtV25vLXN0cmljdC1hbGlhc2luZworZW5kaWYKKworaWZlcSAoIiQoRVhQT1JUX0RZTkFNSUNfU1lNQk9MUykiLCAieSIpCisgICAgQVJDSF9GTEFHUyArPSAtV2wsLWV4cG9ydC1keW5hbWljIAorZW5kaWYKKworaWZuZXEgKCIkKFNJTVVMQVRJT05fQlVJTEQpIiwgInkiKQorICAgIEVYVFJBX0NGTEFHUyAgICArPSAtV2ZyYW1lLWxhcmdlci10aGFuPTE2Mzg0CitlbmRpZgorCitMSUJTX01BUktFUiA9LWwKK0xJQlNfUEFUSF9NQVJLRVIgPS1MCitMSUJTX1NUQVJUX01BUktFUiA9IC1XbCwtLXN0YXJ0LWdyb3VwCitMSUJTX0VORF9NQVJLRVIgPSAtV2wsLS1lbmQtZ3JvdXAKKworIyBEZWJ1ZyBhbmQgcmVsZWFzZSBvcHRpbWl6YXRpb24gb3B0aW9ucy4gQ2FuIGJlIG92ZXJ3cml0dGVuIGluIE1ha2VmaWxlLmNvbmZpZy4kKFBMQVRGT1JNKQorREVCVUdfT19DRkxBR1MgICAgICA/PSAtZyAtZ2dkYiAtTzAKK0RFQlVHX09fTEZMQUdTICAgICAgPz0gLWcKK1JFTEVBU0VfT19DRkxBR1MgICAgPz0gLWcgLU8yCitSRUxFQVNFX09fTEZMQUdTICAgID89IC1nCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9tb2R1bGVzLmhvc3QgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9tb2R1bGVzLmhvc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhMGY1OQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL21vZHVsZXMuaG9zdApAQCAtMCwwICsxLDY3IEBACitob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgKK2hvc3RfY3VzdG9taXplZC9jb29wX2RiYV9saW51eAoraG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaQoraG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9tYWluCitob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24KK2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9saW51eAoraG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL29zX2NsaQoraG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9ubF9zb2NrZXQKK2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvdW5peF9zb2NrZXQKK2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luCitob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9tdXgKK2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubAoraG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X3VkCitob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi91ZHAKK2hvc3RfY3VzdG9taXplZC91c2VyX2NvbmZpZworaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkX3NlbGVjdG9yCitob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZQoraG9zdF9jdXN0b21pemVkL3BjaWUKK2hvc3RfY3VzdG9taXplZC9pMmMKK2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngKK2hvc3RfY3VzdG9taXplZC9tb2RlbF9saW51eAoraG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4Citob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4Citob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgKK2hvc3RfZHJpdmVyL2FwaQoraG9zdF9kcml2ZXIvdXRpbHMKK2hvc3RfZHJpdmVyL2RlYnVnCitob3N0X2RyaXZlci9kZXZfY3RybAoraG9zdF9kcml2ZXIvY29vcF9kYmEKK2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbgoraG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL3VzZXIKK2hvc3RfZHJpdmVyL2hvc3RfYXBpCitob3N0X2RyaXZlci9rZWVwX2FsaXZlCitob3N0X2RyaXZlci9rZWVwX2FsaXZlL2RhZW1vbgoraG9zdF9kcml2ZXIvbW9kZWwKK2hvc3RfZHJpdmVyL3BjaWUKK2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQKK2hvc3RfZHJpdmVyL3RyYW5zcG9ydAoraG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eAoraG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9kYWVtb24KK2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9wY2llX3N3X3F1ZXVlCitob3N0X2RyaXZlci9mbGQKK2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uCitob3N0X3JlZmVyZW5jZS9hcGlfY2xpCitob3N0X3JlZmVyZW5jZS9kZXZpY2Vfc2VsZWN0b3IKK2hvc3RfcmVmZXJlbmNlL2NsaQoraG9zdF9yZWZlcmVuY2UvZGV2X2xvZworaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eAoraG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwKK2hvc3RfcmVmZXJlbmNlL2FwaV9kZXZfbG9nCitob3N0X3JlZmVyZW5jZS9saW5lbm9pc2UKK2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbAoraG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2VvbgoraG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL29tb24KK2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZQoraG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nCitob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0KK2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbV9jbGkKK2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2ZlcgoraG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUKK2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjaworaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjCitob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcKK2hvc3RfcmVmZXJlbmNlL2FwaV9wcm94eQoraG9zdF9yZWZlcmVuY2UvcmVtb3RlX2NsaQoraG9zdF9yZWZlcmVuY2UvY29tbW9uX2Vwb25fb2FtCitob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9jbGFuZy5vcHRzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvY2xhbmcub3B0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjM4M2VmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvY2xhbmcub3B0cwpAQCAtMCwwICsxLDYgQEAKKyMgQ0xBTkcgb3B0aW9ucworCisjIENMQU5HIHRvb2wKK2V4cG9ydCBDTEFORyA/PSBjbGFuZworZXhwb3J0IENMQU5HX09QVFMgPSAtV25vLXVudXNlZC1mdW5jdGlvbgorZXhwb3J0IExMVk1WRVIgPz0gMy42CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9jb3B5X2hvc3RfZnMuc2ggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9jb3B5X2hvc3RfZnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2NmZmJmMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2NvcHlfaG9zdF9mcy5zaApAQCAtMCwwICsxLDMxIEBACisjISAvYmluL2Jhc2gKKworI3NldCAteAorCitIT1NUX0ZTX1RBUkdFVD0ke09VVF9IT1NUX0RJUn0vZnMKK0hPU1RfT1VUUFVUX1RBUkdFVD0ke09VVF9IT1NUX0RJUn0vb3V0cHV0CisKK2VjaG8gLW4gIkNvcHlpbmcgaG9zdCBmcyB0byAke0hPU1RfRlNfVEFSR0VUfS4uLiIKK21rZGlyIC1wICR7SE9TVF9GU19UQVJHRVR9CitybSAtZnIgJHtIT1NUX0ZTX1RBUkdFVH0vKgorcHVzaGQgJHtIT1NUX0ZTX1RBUkdFVH0KK2xuIC1zICR7T1VUX0hPU1RfRElSfS9saW51eF9tb2R1bGVzLyogLgorbG4gLXMgJHtUT1BfRElSfS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2ZzLyogLgorbG4gLXMgJHtUT1BfRElSfS9lbWJlZGRlZF9iaW5hcmllcy8qIC4KK2xuIC1zICR7T1VUX0hPU1RfRElSfS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtX3VzZXJfYXBwbCAuCitwb3BkCisKK2VjaG8gLW4gIkNvcHlpbmcgYWxsIG1vZHVsZXMgYW5kIGxpYnJhcmllcyB0byAke0hPU1RfT1VUUFVUX1RBUkdFVH0uLi4iCitta2RpciAtcCAke0hPU1RfT1VUUFVUX1RBUkdFVH0KK3JtIC1mciAke0hPU1RfT1VUUFVUX1RBUkdFVH0vKgorcHVzaGQgJHtIT1NUX09VVFBVVF9UQVJHRVR9CitsbiAtcyAke09VVF9IT1NUX0RJUn0vbGludXhfbW9kdWxlcy8qIC4KK2xuIC1zIGBmaW5kICR7T1VUX0hPU1RfRElSfSAtbmFtZSAnbGliKi5hJ2AgLgorbG4gLXMgJHtPVVRfSE9TVF9ESVJ9L2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21fdXNlcl9hcHBsIC4KK3BvcGQKKworIyBFeHRyYWN0IGkyYyBhZGRyZXNzZXMgZnJvbSBiY21vbHRfaTJjX2RldnNfYWRkci5oIGludG8gdGhlIHRhaWwgb2YgYSB0YXJnZXQgZmlsZSBjYWxsZWQgaTJjX2FkZHJzLnNoLiBzdmtfaW5pdC5zaCB3aWxsIGluY2x1ZGUgaTJjX2FkZHJzLnNoIHRvIGFjY2VzcyBpMmMgYWRkcmVzc2VzLgorZ3JlcCAtdyAiQkNNX0kyQ19ERVZfQUREUiIgJHtUT1BfRElSfS9ob3N0X2N1c3RvbWl6ZWQvaTJjL2JjbW9sdF9pMmNfZGV2c19hZGRyLmggfCBzZWQgLXMgInMvQkNNX0kyQ19ERVZfQUREUihcKC4qXCksIFwoLipcKSwgMHhcKC4qXCkpL1wxPVwzLyIgPj4gJHtIT1NUX0ZTX1RBUkdFVH0vaTJjX2FkZHJzLnNoCisKK2VjaG8gIkRvbmUiCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9hY3RpdmF0ZV9vbnUudmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX2FjdGl2YXRlX29udS52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjAyYTU1NgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9hY3RpdmF0ZV9vbnUudmJzCkBAIC0wLDAgKzEsMTcgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMTAwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJb251ID0gaW5wdXRib3goIk9OVSBJRDogWzAtMTI3XSIgKQ0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL29wZXIgb2JqZWN0PWdwb25fb251IHN1Yj1zZXRfb251X3N0YXRlIHBvbl9uaT0iICYgcG9uX25pICYgIiBvbnVfaWQ9IiAmIG9udSAmICIgb251X3N0YXRlPWFjdGl2ZSIgIA0KKwljcnQuc2xlZXAgNQ0KKw0KK0VuZCBTdWINCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fY2xlYXJfb251LnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9jbGVhcl9vbnUudmJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4ZTBkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fY2xlYXJfb251LnZicwpAQCAtMCwwICsxLDE3IEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCINCisjICRpbnRlcmZhY2UgPSAiMS4wIg0KKw0KK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpDQorICAgIGNydC5TY3JlZW4uU2VuZCBzaGVsbF9jb21tYW5kICYgVmJDciAmIFZiQ3INCisJY3J0LnNsZWVwIDEwMDANCitFbmQgU3ViDQorDQorU3ViIG1haW4NCisNCisJCXBvbl9uaSA9IGlucHV0Ym94KCJQT04gTkk6IFswLTE1XSIgKQ0KKwkJb251ID0gaW5wdXRib3goIk9OVSBJRDogWzAtMTI3XSIgKQ0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL2NsZWFyIG9iamVjdD1ncG9uX29udSBwb25fbmk9IiAmIHBvbl9uaSAmICIgb251X2lkPSIgJiBvbnUgJiAiICIgIA0KKwljcnQuc2xlZXAgMTANCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX2NvbmZpZ19hbGxvYy52YnMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fY29uZmlnX2FsbG9jLnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YjQxNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX2NvbmZpZ19hbGxvYy52YnMKQEAgLTAsMCArMSwyMiBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAxMDAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCXBvbl9uaSA9IGlucHV0Ym94KCJQT04gTkk6IFswLTE1XSIgKQ0KKwlvbnUgPSBpbnB1dGJveCgiT05VIElEOiBbMC0xMjddIiApDQorCWFsbG9jID0gaW5wdXRib3goIkFsbG9jIElEPyIgKQ0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvZmYgIg0KKwljcnQuc2xlZXAgMTAwDQorCQ0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL3NldCBvYmplY3Q9Z3Bvbl9hbGxvYyBwb25fbmk9IiAmIHBvbl9uaSAmICIgYWxsb2NfaWQ9IiAmIGFsbG9jICYgIiBvbnVfaWQ9IiAmIG9udSAmICIgc2xhLmNicl9ydF9idz01MTIwMDAwIHNsYS5jYnJfbnJ0X2J3PTAgc2xhLmd1YXJhbnRlZWRfYnc9NTEyMDAwMCBzbGEubWF4aW11bV9idz01MTIwMDAwIHNsYS5hbGxvY190eXBlPW5vbmUgc2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHk9bm9uZSBzbGEuY2JyX3J0X2NvbXBlbnNhdGlvbj1ubyBzbGEuY2JyX3J0X2FwX2luZGV4PTAgc2xhLmNicl9ucnRfYXBfaW5kZXg9MCBzbGEud2VpZ2h0PTAgc2xhLnByaW9yaXR5PTAiDQorCWNydC5zbGVlcCAxMDANCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL34gb24iDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9jb25maWdfZ2VtLnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9jb25maWdfZ2VtLnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZDhmYTEyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX2NvbmZpZ19nZW0udmJzCkBAIC0wLDAgKzEsMjIgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMTAwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJb251ID0gaW5wdXRib3goIk9OVSBJRDogWzAtMTI3XSIgKQ0KKwlnZW0gPSBpbnB1dGJveCgiR0VNIFBPUlQgSUQ/IiApDQorCQ0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvZmYgIg0KKwljcnQuc2xlZXAgMTAwDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9hcGkvc2V0IG9iamVjdD1ncG9uX2dlbV9wb3J0IHBvbl9uaT0iICYgcG9uX25pICYgIiBnZW1fcG9ydF9pZD0iICYgZ2VtICYgIiBjb25maWd1cmF0aW9uLmRpcmVjdGlvbj1iaWRpcmVjdGlvbmFsIGNvbmZpZ3VyYXRpb24udHlwZT11bmljYXN0IG9udV9pZD0iICYgb251ICYgIiBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZT1kaXNhYmxlIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlPWRhdGEgY29udHJvbD1lbmFibGUiDQorCWNydC5zbGVlcCAxMDANCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL34gb24gIg0KKwljcnQuc2xlZXAgMTAwDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9jb25maWdfb251LnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9jb25maWdfb251LnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjJiNzkyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX2NvbmZpZ19vbnUudmJzCkBAIC0wLDAgKzEsMjEgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMTAwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJb251ID0gaW5wdXRib3goIk9OVSBJRDogWzAtMTI3XSIgKQ0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvZmYgIg0KKwljcnQuc2xlZXAgMTANCisJc2VyaWFsID0gc3RyaW5nKDggLSBMZW4ob251KSwgIjAiKSAmIG9udSANCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9zZXQgb2JqZWN0PWdwb25fb251IHBvbl9uaT0iICYgcG9uX25pICYgIiBvbnVfaWQ9IiAmIG9udSAmICIgc2VyaWFsX251bWJlci52ZW5kb3JfaWQ9MDAwMDAwMDAgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbD0xMDAwMDAwIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljPSIgJiBzZXJpYWwgJiAiIG9tY2lfcG9ydF9pZD0iICYgb251DQorCWNydC5zbGVlcCAxMA0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvbiAiDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9tYXBsZV9pbml0LnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9tYXBsZV9pbml0LnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YjdhMWRlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX21hcGxlX2luaXQudmJzCkBAIC0wLDAgKzEsNjggQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorDQorU3ViIFNsZWVwKHRpbWV3YWl0KQ0KKyANCisgIElmIGNydC5zY3JlZW4ud2FpdGZvcnN0cmluZygicGF1c2UiLCB0aW1ld2FpdCkgPSB0cnVlIHRoZW4gbXNnYm94ICJzdXJwcmlzZSINCisgIA0KK0VuZCBTdWINCisNCitTdWIgU2VuZFNoZWxsQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKwljcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3INCitFbmQgU3ViDQorDQorc3ViIG1haW4NCisNCitTZW5kU2hlbGxDb21tYW5kKCJyb290IikNCitjcnQuU2xlZXAgMTAwDQorU2VuZFNoZWxsQ29tbWFuZCgicm9vdCIpDQorY3J0LlNsZWVwIDEwMA0KK1NlbmRTaGVsbENvbW1hbmQoImNkIC9vcHQvYmNtNjg2MjAvIikNCitjcnQuc2NyZWVuLldhaXRGb3JTdHJpbmcgIiMiDQorY3J0LlNsZWVwIDEwMA0KK1NlbmRTaGVsbENvbW1hbmQoIi4vc3ZrX2luaXQuc2giKQ0KK2NydC5zY3JlZW4uV2FpdEZvclN0cmluZyAiPiINCitjcnQuU2xlZXAgMTAwMA0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorDQorJ21hbmRhdG9yeQ0KK1NlbmRTaGVsbENvbW1hbmQoIi9hcGkvc2V0IG9iamVjdD1kZXZpY2Ugc3lzdGVtX21vZGU9Z3Bvbl9fMTZfeCIpDQorY3J0LlNsZWVwIDUwDQorDQorJ09wdGlvbmFsIC0gY29uZmlndXJlIHRoZSBOTkkgc3BlZWQgaW4gb3JkZXIgdG8gd29yayB3aXRoIGEgMWcgdHJhZmZpYyBnZW5lcmF0b3INCitTZW5kU2hlbGxDb21tYW5kKCIvYXBpL3NldCBvYmplY3Q9ZGV2aWNlIG5uaV9zcGVlZC5maXJzdF9oYWxmPWdicHNfMSBubmlfc3BlZWQuc2Vjb25kX2hhbGY9Z2Jwc18xICIpDQorY3J0LlNsZWVwIDUwDQorDQorJ09wdGlvbmFsIC0gY29uZmlndXJlIHRoZSBQQ0llIGRtYSBxdWV1ZXMgc2l6ZXMgb3IgY29uZmlndXJlIHRoZSBzeXN0ZW0gbm90IHRvIGZhaWwgb24gYmFkIEFWUyBjaGVjay4gIA0KK1NlbmRTaGVsbENvbW1hbmQoIi9hcGkvc2V0IG9iamVjdD1kZXZpY2UgZGVidWcuaG9zdF9kbWFfcnhfcXVldWVfc2l6ZT0xMjggZGVidWcuaG9zdF9kbWFfdHhfcXVldWVfc2l6ZT0xMjggZGVidWcuYXZzX2NvbnRyb2w9eWVzIikNCitjcnQuU2xlZXAgNTANCisNCisnT3B0aW9uYWwgLSBjb25maWd1cmUgdGhlIGtlZXAgYWxpdmUgcGFyYW1ldGVycyAgDQorU2VuZFNoZWxsQ29tbWFuZCgiL2FwaS9zZXQgb2JqZWN0PWRldmljZSBrZWVwYWxpdmVfaW50ZXJ2YWw9NSBrZWVwYWxpdmVfdG9sZXJhbmNlPTMiKQ0KKw0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorY3J0LnNjcmVlbi5XYWl0Rm9yU3RyaW5nICI+Ig0KK2NydC5TbGVlcCA1MA0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorDQorDQorU2VuZFNoZWxsQ29tbWFuZCgiL3VzZXIvcmVnaXN0ZXJfaW5kaWNhdGlvbl9oYW5kbGVyIikNCitjcnQuU2NyZWVuLlNlbmQgVmJDcg0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorY3J0LnNjcmVlbi5XYWl0Rm9yU3RyaW5nICI+Ig0KKw0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorY3J0LlNsZWVwIDUwDQorU2VuZFNoZWxsQ29tbWFuZCgiL3VzZXIvcmVnaXN0ZXJfcHJveHlfcnhfaGFuZGxlciAiKQ0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorY3J0LlNsZWVwIDUwDQorY3J0LlNjcmVlbi5TZW5kIFZiQ3INCitTZW5kU2hlbGxDb21tYW5kKCIvYXBpL29wZXIgb2JqZWN0PWRldmljZSBzdWI9Y29ubmVjdCAiKQ0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorY3J0LnNjcmVlbi5XYWl0Rm9yU3RyaW5nICI+Ig0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorDQorY3J0LlNsZWVwIDUwDQorCQkNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX29udV9zdGF0aXN0aWNzLnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9vbnVfc3RhdGlzdGljcy52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDdjODdmOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9vbnVfc3RhdGlzdGljcy52YnMKQEAgLTAsMCArMSwxOCBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAxMDAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJCW9udSA9IGlucHV0Ym94KCJPTlUgSUQ6IFswLTEyN10iICkNCisNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9zdGF0IG9iamVjdD1ncG9uX29udSBwb25fbmk9IiAmIHBvbl9uaSAmICIgb251X2lkPSIgJiBvbnUgJiAiIGNsZWFyPW5vIiAgDQorCWNydC5zbGVlcCAxMA0KKw0KKw0KK0VuZCBTdWINCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fcG9uX2FjdGl2YXRpb24udmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3Bvbl9hY3RpdmF0aW9uLnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYTIxOTNmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3Bvbl9hY3RpdmF0aW9uLnZicwpAQCAtMCwwICsxLDE4IEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCINCisjICRpbnRlcmZhY2UgPSAiMS4wIg0KKw0KK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpDQorICAgIGNydC5TY3JlZW4uU2VuZCBzaGVsbF9jb21tYW5kICYgVmJDciAmIFZiQ3INCisJY3J0LnNsZWVwIDEwMDANCitFbmQgU3ViDQorDQorU3ViIG1haW4NCisNCisJcG9uX25pID0gaW5wdXRib3goIlBPTiBOSTogWzAtMTVdIiApDQorDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC90cnhfZW5hYmxlIHBvbl9pZD0iICYgcG9uX25pICYgIiAiICAgDQorCWNydC5zbGVlcCAxMDANCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9vcGVyIG9iamVjdD1ncG9uX25pIHN1Yj1zZXRfcG9uX3N0YXRlIHBvbl9uaT0iICYgcG9uX25pICYgIiBwb25fc3RhdGU9YWN0aXZlX3dvcmtpbmciICANCisJY3J0LnNsZWVwIDEwMA0KKw0KK0VuZCBTdWINCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fcnNzaV9pMmNfcmVhZF9yZXN1bHQudmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3Jzc2lfaTJjX3JlYWRfcmVzdWx0LnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDljYTgwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3Jzc2lfaTJjX3JlYWRfcmVzdWx0LnZicwpAQCAtMCwwICsxLDQyIEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCINCisjICRpbnRlcmZhY2UgPSAiMS4wIg0KKw0KK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpDQorICAgIGNydC5TY3JlZW4uU2VuZCBzaGVsbF9jb21tYW5kICYgVmJDciAmIFZiQ3INCisJY3J0LnNsZWVwIDEwMDANCitFbmQgU3ViDQorDQorU3ViIG1haW4NCisNCisJcG9uX25pID0gaW5wdXRib3goIlBPTiBOSTogWzAtMTVdIiApDQorDQorCQ0KK2lmIHBvbl9uaSA8IDggdGhlbg0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl9jaGFuZ2UgZGV2PXN3MiIgIA0KKwljcnQuc2xlZXAgMTAwIA0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl93cml0ZSB3aWR0aD04IGFkZHI9MCB2YWw9MHgiICYgaGV4KDIgXiAoNyAtIHBvbl9uaSkpICYiICINCisJY3J0LnNsZWVwIDEwDQorZWxzZQ0KK1NlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9pMmMvZGV2X2NoYW5nZSBkZXY9c3czIiAgDQorCWNydC5zbGVlcCAxMDANCitpZiBwb25fbmkgPCAxMiB0aGVuDQorCQ0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl93cml0ZSB3aWR0aD04IGFkZHI9MCB2YWw9MHgiICYgaGV4KDIgXiAoIHBvbl9uaSAtIDQpKSAmIiAiDQorCWNydC5zbGVlcCAxMA0KK2Vsc2UNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2JvYXJkL2kyYy9kZXZfd3JpdGUgd2lkdGg9OCBhZGRyPTAgdmFsPTB4IiAmIGhleCgyIF4gKCBwb25fbmkgLSAxMikpICYiICINCisJY3J0LnNsZWVwIDEwDQorDQorDQorZW5kIGlmDQorDQorZW5kIGlmDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9pMmMvZGV2X2NoYW5nZSBzZnAyICINCisJY3J0LnNsZWVwIDEwDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9pMmMvZGV2X3JlYWQgd2lkdGg9OCBhZGRyPTB4NjgiDQorCWNydC5zbGVlcCAxMA0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl9yZWFkIHdpZHRoPTggYWRkcj0weDY5Ig0KKwljcnQuc2xlZXAgMTANCisNCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3N0YXJ0X3NuX2FjcXVpc2l0aW9uLnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9zdGFydF9zbl9hY3F1aXNpdGlvbi52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWQxMjA4OQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9zdGFydF9zbl9hY3F1aXNpdGlvbi52YnMKQEAgLTAsMCArMSwxOCBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAxMDAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJCWludGVydmFsID0gaW5wdXRib3goImludGVydmFsIGluIE1TIiApDQorCQlvcGVyID0gaW5wdXRib3goInBvc3RfZGlzY292ZXJ5X21vZGU6bm9uZS9kaXNhYmxlL2FjdGl2YXRlIiApDQorDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9hcGkvc2V0IG9iamVjdD1ncG9uX25pIHBvbl9uaT0iICYgcG9uX25pICYgIiBzbl9hY3F1aXNpdGlvbi5pbnRlcnZhbD0iICYgaW50ZXJ2YWwgJiAiIHNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlPSIgJiBvcGVyICYgIiBzbl9hY3F1aXNpdGlvbi5jb250cm9sPWVuYWJsZSAiDQorCWNydC5zbGVlcCAxMDANCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3N0b3Bfc25fYWNxdWlzaXRpb24udmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3N0b3Bfc25fYWNxdWlzaXRpb24udmJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjZjJjODMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fc3RvcF9zbl9hY3F1aXNpdGlvbi52YnMKQEAgLTAsMCArMSwxOCBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAxMDAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJCWludGVydmFsID0gMTAwMA0KKwkJb3BlciA9ICJub25lIg0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL3NldCBvYmplY3Q9Z3Bvbl9uaSBwb25fbmk9IiAmIHBvbl9uaSAmICIgc25fYWNxdWlzaXRpb24uaW50ZXJ2YWw9IiAmIGludGVydmFsICYgIiBzbl9hY3F1aXNpdGlvbi5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZT0iICYgb3BlciAmICIgc25fYWNxdWlzaXRpb24uY29udHJvbD1kaXNhYmxlIg0KKwljcnQuc2xlZXAgMTAwDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl9tYXBsZV9pbml0LnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl9tYXBsZV9pbml0LnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MTk3MDAzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX21hcGxlX2luaXQudmJzCkBAIC0wLDAgKzEsNjQgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0IgorIyAkaW50ZXJmYWNlID0gIjEuMCIKKworCitTdWIgU2xlZXAodGltZXdhaXQpCisgCisgIElmIGNydC5zY3JlZW4ud2FpdGZvcnN0cmluZygicGF1c2UiLCB0aW1ld2FpdCkgPSB0cnVlIHRoZW4gbXNnYm94ICJzdXJwcmlzZSIKKyAgCitFbmQgU3ViCisKK1N1YiBTZW5kU2hlbGxDb21tYW5kKHNoZWxsX2NvbW1hbmQpCisJY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyCitFbmQgU3ViCisKK3N1YiBtYWluCisKK1NlbmRTaGVsbENvbW1hbmQoInJvb3QiKQorY3J0LlNsZWVwIDEwMAorU2VuZFNoZWxsQ29tbWFuZCgicm9vdCIpCitjcnQuU2xlZXAgMTAwCitTZW5kU2hlbGxDb21tYW5kKCJjZCAvb3B0L2JjbTY4NjIwLyIpCitjcnQuc2NyZWVuLldhaXRGb3JTdHJpbmcgIiMiCitjcnQuU2xlZXAgMTAwCitTZW5kU2hlbGxDb21tYW5kKCIuL3N2a19pbml0LnNoIikKK2NydC5zY3JlZW4uV2FpdEZvclN0cmluZyAiPiIKK2NydC5TbGVlcCAxMDAwCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorCisKK1NlbmRTaGVsbENvbW1hbmQoIi9hcGkvc2V0IG9iamVjdD1kZXZpY2Ugc3lzdGVtX21vZGU9eGdwb25fMV9fOF94IikKK2NydC5TY3JlZW4uU2VuZCBWYkNyCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LlNsZWVwIDUwCisnIHRoZSBmb2xsb3dpbmcgbGluZSBpcyBvbmx5IGlmIHlvdSB3b3VsZCBsaWtlIHRvIHNldCB0aGUga2VlcCBhbGl2ZSB2YWx1ZXMgCisnU2VuZFNoZWxsQ29tbWFuZCgiL2FwaS9zZXQgb2JqZWN0PWRldmljZSBzeXN0ZW1fbW9kZT14Z3Bvbl8xX184X3gga2VlcGFsaXZlX2ludGVydmFsPTUga2VlcGFsaXZlX3RvbGVyYW5jZT0zIikKKydjcnQuU2xlZXAgNTAKKydjcnQuU2NyZWVuLlNlbmQgVmJDcgorJ2NydC5TY3JlZW4uU2VuZCBWYkNyCisKKworU2VuZFNoZWxsQ29tbWFuZCgiL3VzZXIvcmVnaXN0ZXJfaW5kaWNhdGlvbl9oYW5kbGVyIikKK2NydC5TY3JlZW4uU2VuZCBWYkNyCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LlNsZWVwIDUwCitTZW5kU2hlbGxDb21tYW5kKCIvdXNlci9yZWdpc3Rlcl9wcm94eV9yeF9oYW5kbGVyICIpCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKK2NydC5TbGVlcCA1MAorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKK1NlbmRTaGVsbENvbW1hbmQoIi9hcGkvb3BlciBvYmplY3Q9ZGV2aWNlIHN1Yj1jb25uZWN0ICIpCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LnNjcmVlbi5XYWl0Rm9yU3RyaW5nICI+IgorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKKworY3J0LlNsZWVwIDUwCisKKworCisKKworCisKKwkJCitFbmQgU3ViCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX2NvbmZpZ19hbGxvYy52YnMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX2NvbmZpZ19hbGxvYy52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTBjMGVmMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfY29uZmlnX2FsbG9jLnZicwpAQCAtMCwwICsxLDQ0IEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCINCisjICRpbnRlcmZhY2UgPSAiMS4wIg0KKw0KK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpDQorICAgIGNydC5TY3JlZW4uU2VuZCBzaGVsbF9jb21tYW5kICYgVmJDciAmIFZiQ3INCisJY3J0LnNsZWVwIDIwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50PjAgVGhlbg0KKwkJcG9uX25pID0gY3J0LkFyZ3VtZW50cygwKQ0KKwlFbHNlDQorCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBYR1BPTjpbMC03XSBYR1M6WzAtMV0iKQ0KKwlFbmQgSWYNCisJDQorCUlmIGNydC5Bcmd1bWVudHMuQ291bnQ+MSBUaGVuDQorCQlvbnVfaWQgPSBjcnQuQXJndW1lbnRzKDEpDQorCUVsc2UNCisJCW9udV9pZCA9IGlucHV0Ym94KCJPTlUgaWQ6IFswLTI1NV0iKQ0KKwlFbmQgSUYNCisJDQorCUlmIGNydC5Bcmd1bWVudHMuQ291bnQ+MiBUaGVuDQorCQlhbGxvY19pZCA9IGNydC5Bcmd1bWVudHMoMikNCisJRWxzZQ0KKwkJYWxsb2NfaWQgPSBpbnB1dGJveCgiQWxsb2MgaWQiKQ0KKwlFbmQgSUYNCisJDQorCScgeW91IGNhbiBhbHNvIGNvbW1lbnQgYWxsIHRoZSBpbnB1dCB2YWx1ZXMgb3V0IGFuZCBzZXQgdGhlc2UgdmFsdWVzIG1hbnVhbGx5IAkNCisJY2JyX3J0X2J3ID0gaW5wdXRib3goImNicl9ydF9idyBbYnl0ZXMvc2VjXSIpDQorCWNicl9ucnRfYncgPSBpbnB1dGJveCgiY2JyX25ydF9idyBbYnl0ZXMvc2VjXSIpDQorCWd1YXJhbnRlZWRfYncgPSBpbnB1dGJveCgiZ3VhcmFudGVlZF9idyBbYnl0ZXMvc2VjXSIpDQorCW1heGltdW1fYncgPSBpbnB1dGJveCgibWF4aW11bV9idyBbYnl0ZXMvc2VjXSIpDQorCWNicl9ydF9jb21wZW5zYXRpb24gPSBpbnB1dGJveCgiY2JyX3J0X2NvbXBlbnNhdGlvbiBbeWVzLG5vXSIpDQorCQ0KKwkNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL34gb2ZmIg0KKw0KKwknY29uZmlnIGFsbG9jDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9hcGkvc2V0IG9iamVjdD14Z3Bvbl9hbGxvYyBwb25fbmk9IiAmIHBvbl9uaSAmICIgYWxsb2NfaWQ9IiAmIGFsbG9jX2lkICYgIiBvbnVfaWQ9IiAmIG9udV9pZCAmICIgc2xhLmNicl9ydF9idz0iICYgY2JyX3J0X2J3ICYgIiBzbGEuY2JyX25ydF9idz0iICYgY2JyX25ydF9idyAmICIgc2xhLmd1YXJhbnRlZWRfYnc9IiAmIGd1YXJhbnRlZWRfYncgJiAiIHNsYS5tYXhpbXVtX2J3PSIgJiBtYXhpbXVtX2J3ICYgIiBzbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eT1ub25fYXNzdXJlZCBzbGEuY2JyX3J0X2NvbXBlbnNhdGlvbj0iICYgY2JyX3J0X2NvbXBlbnNhdGlvbiAmICIgc2xhLmNicl9ydF9hcF9pbmRleD0wIHNsYS5jYnJfbnJ0X2FwX2luZGV4PTAgc2xhLmFsbG9jX3R5cGU9bnNyIHNsYS53ZWlnaHQ9MCBzbGEucHJpb3JpdHk9MCINCisJDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9+IG9uIg0KKw0KK0VuZCBTdWINCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX2NvbmZpZ19hbmRfYWN0aXZlX29udS52YnMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX2NvbmZpZ19hbmRfYWN0aXZlX29udS52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTEzN2NkOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfY29uZmlnX2FuZF9hY3RpdmVfb251LnZicwpAQCAtMCwwICsxLDQwIEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCINCisjICRpbnRlcmZhY2UgPSAiMS4wIg0KKw0KK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpDQorICAgIGNydC5TY3JlZW4uU2VuZCBzaGVsbF9jb21tYW5kICYgVmJDciAmIFZiQ3INCisJY3J0LnNsZWVwIDIwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50ID4gMCBUaGVuDQorCQlwb25fbmkgPSBjcnQuQXJndW1lbnRzKDApDQorCUVsc2UNCisJCXBvbl9uaSA9IGlucHV0Ym94KCJQT04gTkk6IFhHUE9OOlswLTddIFhHUzpbMC0xXSIpDQorCUVuZCBJZg0KKwkNCisJSWYgY3J0LkFyZ3VtZW50cy5Db3VudCA+IDEgVGhlbg0KKwkJb251X2lkID0gY3J0LkFyZ3VtZW50cygxKQ0KKwlFbHNlDQorCQlvbnVfaWQgPSBpbnB1dGJveCgiT05VIGlkOiBbMC0yNTVdIikNCisJRW5kIElGDQorCQ0KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50ID4gMiBUaGVuDQorCQlkYXRhX2J1cnN0X3Byb2ZpbGUgPSBjcnQuQXJndW1lbnRzKDIpDQorCUVsc2UNCisJCWRhdGFfYnVyc3RfcHJvZmlsZSA9IGlucHV0Ym94KCJEYXRhIGJ1cnN0IHByb2ZpbGU6IFswLTNdIiAmIFZiQ3IgJiAiMCAtIHJhbmdpbmciICYgVmJDciAmICIxIC0gZGF0YSIgJiBWYkNyICYgIjIgLSByYW5naW5nIEZFQyIgJiBWYkNyICYgIjMgLSBkYXRhIEZFQyIpDQorCUVuZCBJRg0KKwkNCisJJ1NlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9+IG9mZiINCisJDQorCSdjb25maWcgb251DQorCXNlcmlhbCA9IHN0cmluZyg4IC0gTGVuKG9udV9pZCksICIwIikgJiBvbnVfaWQNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9zZXQgb2JqZWN0PXhncG9uX29udSBwb25fbmk9IiAmIHBvbl9uaSAmICIgb251X2lkPSIgJiBvbnVfaWQgJiAiIHNlcmlhbF9udW1iZXIudmVuZG9yX2lkPTAwMDAwMDAwIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljPSIgJiBzZXJpYWwgJiAiIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nPXllcyByYW5naW5nX2J1cnN0X3Byb2ZpbGU9MCBkYXRhX2J1cnN0X3Byb2ZpbGU9IiAmIGRhdGFfYnVyc3RfcHJvZmlsZQ0KKyAgIA0KKyAgICAnYWN0aXZhdGUgb251DQorICAgIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9hcGkvb3BlciBvYmplY3Q9eGdwb25fb251IHN1Yj1zZXRfb251X3N0YXRlIHBvbl9uaT0iICYgcG9uX25pICYgIiBvbnVfaWQ9IiAmIG9udV9pZCAmICIgb251X3N0YXRlPWFjdGl2ZSINCisgICAgDQorICAgICdTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvbiINCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19jb25maWdfZ2VtX3BvcnQudmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19jb25maWdfZ2VtX3BvcnQudmJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI4Y2ZlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX2NvbmZpZ19nZW1fcG9ydC52YnMKQEAgLTAsMCArMSwzNiBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAyMDANCitFbmQgU3ViDQorDQorU3ViIG1haW4NCisNCisJSWYgY3J0LkFyZ3VtZW50cy5Db3VudD4wIFRoZW4NCisJCXBvbl9uaSA9IGNydC5Bcmd1bWVudHMoMCkNCisJRWxzZQ0KKwkJcG9uX25pID0gaW5wdXRib3goIlBPTiBOSTogWEdQT046WzAtN10gWEdTOlswLTFdIikNCisJRW5kIElmDQorCQ0KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50PjEgVGhlbg0KKwkJb251X2lkID0gY3J0LkFyZ3VtZW50cygxKQ0KKwlFbHNlDQorCQlvbnVfaWQgPSBpbnB1dGJveCgiT05VIGlkOiBbMC0yNTVdIikNCisJRW5kIElGDQorDQorCUlmIGNydC5Bcmd1bWVudHMuQ291bnQ+MiBUaGVuDQorCQlwb3J0X2lkID0gY3J0LkFyZ3VtZW50cygyKQ0KKwlFbHNlDQorCQlwb3J0X2lkID0gaW5wdXRib3goInBvcnRfaWQiKQ0KKwlFbmQgSUYNCisJDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9+IG9mZiINCisJDQorCSdjb25maWcgcG9ydA0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL3NldCBvYmplY3Q9eGdwb25fZ2VtX3BvcnQgcG9uX25pPSIgJiBwb25fbmkgJiAiIGdlbV9wb3J0X2lkPSIgJiBwb3J0X2lkICYgIiBvbnVfaWQ9IiAmIG9udV9pZCAmICIgY29uZmlndXJhdGlvbi5kaXJlY3Rpb249YmlkaXJlY3Rpb25hbCBjb25maWd1cmF0aW9uLnR5cGU9dW5pY2FzdCBlbmNyeXB0aW9uX21vZGU9ZGlzYWJsZSB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZT1kYXRhIGNvbnRyb2w9ZW5hYmxlIg0KKwkNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL34gb24iDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfY29uZmlnX211bHRpZ2VtX3BvcnQudmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19jb25maWdfbXVsdGlnZW1fcG9ydC52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDc4Y2QyYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfY29uZmlnX211bHRpZ2VtX3BvcnQudmJzCkBAIC0wLDAgKzEsMzYgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMjAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCUlmIGNydC5Bcmd1bWVudHMuQ291bnQ+MCBUaGVuDQorCQlwb25fbmkgPSBjcnQuQXJndW1lbnRzKDApDQorCUVsc2UNCisJCXBvbl9uaSA9IGlucHV0Ym94KCJQT04gTkk6IFhHUE9OOlswLTddIFhHUzpbMC0xXSIpDQorCUVuZCBJZg0KKwkNCisJSWYgY3J0LkFyZ3VtZW50cy5Db3VudD4xIFRoZW4NCisJCW9udV9pZCA9IGNydC5Bcmd1bWVudHMoMSkNCisJRWxzZQ0KKwkJb251X2lkID0gaW5wdXRib3goIk9OVSBpZDogWzAtMjU1XSIpDQorCUVuZCBJRg0KKw0KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50PjIgVGhlbg0KKwkJcG9ydF9pZCA9IGNydC5Bcmd1bWVudHMoMikNCisJRWxzZQ0KKwkJcG9ydF9pZCA9IGlucHV0Ym94KCJwb3J0X2lkIikNCisJRW5kIElGDQorCQ0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvZmYiDQorCQ0KKwknY29uZmlnIHBvcnQNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9zZXQgb2JqZWN0PXhncG9uX2dlbV9wb3J0IHBvbl9uaT0iICYgcG9uX25pICYgIiBnZW1fcG9ydF9pZD0iICYgcG9ydF9pZCAmICIgY29uZmlndXJhdGlvbi5kaXJlY3Rpb249YmlkaXJlY3Rpb25hbCBjb25maWd1cmF0aW9uLnR5cGU9bXVsdGljYXN0IGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlPWRpc2FibGUgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWU9ZGF0YSBjb250cm9sPWVuYWJsZSINCisJDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9+IG9uIg0KKw0KK0VuZCBTdWINCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX3Bvbl9hY3RpdmF0aW9uLnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfcG9uX2FjdGl2YXRpb24udmJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkMTMyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX3Bvbl9hY3RpdmF0aW9uLnZicwpAQCAtMCwwICsxLDUwIEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCIKKyMgJGludGVyZmFjZSA9ICIxLjAiCisKK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcgorCWNydC5zbGVlcCAyMDAKK0VuZCBTdWIKKworU3ViIG1haW4KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50PjAgVGhlbgorCQlzeXNfbW9kZSA9IGNydC5Bcmd1bWVudHMoMCkKKwlFbHNlCisJCXN5c19tb2RlID0gaW5wdXRib3goInN5c3RlbSBtb2RlOiBbMDpYR1BPTiAgMTpYR1MgIDI6TkdQT04yXSIpCisJRW5kIElmCisJCisJSWYgY3J0LkFyZ3VtZW50cy5Db3VudD4wIFRoZW4KKwkJcG9uX25pID0gY3J0LkFyZ3VtZW50cygwKQorCUVsc2UKKwkJSWYgc3lzX21vZGU9MCBUaGVuCisJCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC03XSIpCisJCUVsc2UKKwkJCXBvbl9uaSA9IGlucHV0Ym94KCJQT04gTkk6IFswLTFdIikgJyB1c2VkIGZvciBYR1MvTkdQT04yCisJCUVuZCBJZgorCUVuZCBJZgorCQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9+IG9mZiIKKwknZW5hYmxlIHRoZSB0cmFuc2NlaXZlciB0aGlzIGNvbW1hbmQgaXMgYm9hcmQgZGVwZW5kZW50CisJSWYgc3lzX21vZGU9MCBUaGVuCisJCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9UcnhfZW5hYmxlIHBvbl9pZD0iICYgcG9uX25pICYgIiAiCisJRWxzZQorCQlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvVHJ4X2VuYWJsZSBwb25faWQ9IiAmIHBvbl9uaSArIDMgJiAiICIKKwlFbmQgSWYKKwljcnQuc2xlZXAgMTAwCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICcgb3B0aW5hbCBTZXQgUG9uCisgICAgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9zZXQgb2JqZWN0PXhncG9uX25pIHBvbl9uaT0iICYgcG9uX25pICYgIiBod19wb25faWQucG9uX2lkXzE9MCBod19wb25faWQucG9uX2lkXzI9MCBvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaT00IG9udV9hbGFybXNfdGhyZXNob2xkcy5sb2JpPTQgb251X2FsYXJtc190aHJlc2hvbGRzLmxvb2NpPTMgb251X2FsYXJtc190aHJlc2hvbGRzLmxvcGNpPTMgcGxvYW1faGFuZGxpbmcuYWNrX3RpbWVvdXQ9MjAwMCBwbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JhbmdpbmdfdGltZT0xIHBsb2FtX2hhbmRsaW5nLnJldHJhbnNfYXNzaWduX2FsbG9jX2lkPTEgcGxvYW1faGFuZGxpbmcucmV0cmFuc19rZXlfY29udHJvbD0xIHBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb249MSBwb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZT0yMCBwb25fZGlzdGFuY2UubWF4X2RpZmZfcmVhY2g9MjAiCSAgICAgICAgICAgICAgICAgICAgICAgIAorCQorICAgIElmIHN5c19tb2RlPTEgVGhlbgorCQlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYS9zIG9iamVjdD14Z3Bvbl90cnggcG9uX25pPSIgJiBwb25fbmkgJiAiIHRyYW5zY2VpdmVyX3R5cGU9bHRoXzUzMDJfcGMiCisJRW5kIElmCisgICAgSWYgc3lzX21vZGU9MiBUaGVuCisgICAgICAgIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9hL3Mgb2JqZWN0PXhncG9uX3RyeCBwb25fbmk9IiAmIHBvbl9uaSAmICIgdHJhbnNjZWl2ZXJfdHlwZT1sdHdfNjI3eF9wYyIgCisJRW5kIElmCisgICAgCisJJyBBY3RpdmF0ZSBQT04KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL29wZXIgb2JqZWN0PXhncG9uX25pIHN1Yj1zZXRfcG9uX3N0YXRlIHBvbl9uaT0iICYgcG9uX25pICYgIiBwb25fc3RhdGU9YWN0aXZlX3dvcmtpbmciCisJCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL34gb24iCisKK0VuZCBTdWIKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfcnNzaV9pMmNfcmVhZF9yZXN1bHQudmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19yc3NpX2kyY19yZWFkX3Jlc3VsdC52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDlkZjg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfcnNzaV9pMmNfcmVhZF9yZXN1bHQudmJzCkBAIC0wLDAgKzEsMzcgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMTAwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBYR1BPTjpbMC03XSBYR1M6WzAtMV0iICkNCisNCisJDQoraWYgcG9uX25pIDwgNCB0aGVuDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9pMmMvZGV2X2NoYW5nZSBkZXY9c3cyIiAgDQorCWNydC5zbGVlcCAxMDAgDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9pMmMvZGV2X3dyaXRlIHdpZHRoPTggYWRkcj0wIHZhbD0weCIgJiBoZXgoMiBeICgzIC0gcG9uX25pKSkgJiIgIg0KKwljcnQuc2xlZXAgMTANCitlbHNlDQorU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2JvYXJkL2kyYy9kZXZfY2hhbmdlIGRldj1zdzMiICANCisJY3J0LnNsZWVwIDEwMA0KKw0KKwkNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2JvYXJkL2kyYy9kZXZfd3JpdGUgd2lkdGg9OCBhZGRyPTAgdmFsPTB4IiAmIGhleCgyIF4gcG9uX25pKSAmIiAiDQorCWNydC5zbGVlcCAxMA0KKw0KKw0KK2VuZCBpZg0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl9jaGFuZ2Ugc2ZwMSAiDQorCWNydC5zbGVlcCAxMA0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl9yZWFkIHdpZHRoPTggYWRkcj0weDY4Ig0KKwljcnQuc2xlZXAgMTANCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2JvYXJkL2kyYy9kZXZfcmVhZCB3aWR0aD04IGFkZHI9MHg2OSINCisJY3J0LnNsZWVwIDEwDQorDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3Nfc3RhcnRfc25fYWNxdWlzaXRpb24udmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19zdGFydF9zbl9hY3F1aXNpdGlvbi52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGI2ZmIyZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3Nfc3RhcnRfc25fYWNxdWlzaXRpb24udmJzCkBAIC0wLDAgKzEsMTggQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMTAwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwkJcG9uX25pID0gaW5wdXRib3goIlBPTiBOSTogWEdQT046WzAtN10gWEdTOlswLTFdIiApDQorCQlpbnRlcnZhbCA9IGlucHV0Ym94KCJpbnRlcnZhbCBpbiBNUyIgKQ0KKwkJb3BlciA9IGlucHV0Ym94KCJwb3N0X2Rpc2NvdmVyeV9tb2RlOm5vbmUvZGlzYWJsZS9hY3RpdmF0ZSIgKQ0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL3NldCBvYmplY3Q9eGdwb25fbmkgcG9uX25pPSIgJiBwb25fbmkgJiAiIHNuX2FjcXVpc2l0aW9uLmludGVydmFsPSIgJiBpbnRlcnZhbCAmICIgc25fYWNxdWlzaXRpb24ub251X3Bvc3RfZGlzY292ZXJ5X21vZGU9IiAmIG9wZXIgJiAiIHNuX2FjcXVpc2l0aW9uLmJ1cnN0X3Byb2ZpbGU9MCBzbl9hY3F1aXNpdGlvbi5jb250cm9sPWVuYWJsZSAiDQorCWNydC5zbGVlcCAxMDANCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19zdG9wX3NuX2FjcXVpc2l0aW9uLnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3Nfc3RvcF9zbl9hY3F1aXNpdGlvbi52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmIzMjZhMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3Nfc3RvcF9zbl9hY3F1aXNpdGlvbi52YnMKQEAgLTAsMCArMSwxOCBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAxMDAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBYR1BPTjpbMC03XSBYR1M6WzAtMV0iICkNCisJCWludGVydmFsID0gMTAwMA0KKwkJb3BlciA9ICJub25lIg0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL3NldCBvYmplY3Q9eGdwb25fbmkgcG9uX25pPSIgJiBwb25fbmkgJiAiIHNuX2FjcXVpc2l0aW9uLmludGVydmFsPSIgJiBpbnRlcnZhbCAmICIgc25fYWNxdWlzaXRpb24ub251X3Bvc3RfZGlzY292ZXJ5X21vZGU9IiAmIG9wZXIgJiAiIHNuX2FjcXVpc2l0aW9uLmJ1cnN0X3Byb2ZpbGU9MCBzbl9hY3F1aXNpdGlvbi5jb250cm9sPWRpc2FibGUiDQorCWNydC5zbGVlcCAxMDANCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hnc19tYXBsZV9pbml0LnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3NfbWFwbGVfaW5pdC52YnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjYzFjMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3NfbWFwbGVfaW5pdC52YnMKQEAgLTAsMCArMSw2NCBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiCisjICRpbnRlcmZhY2UgPSAiMS4wIgorCisKK1N1YiBTbGVlcCh0aW1ld2FpdCkKKyAKKyAgSWYgY3J0LnNjcmVlbi53YWl0Zm9yc3RyaW5nKCJwYXVzZSIsIHRpbWV3YWl0KSA9IHRydWUgdGhlbiBtc2dib3ggInN1cnByaXNlIgorICAKK0VuZCBTdWIKKworU3ViIFNlbmRTaGVsbENvbW1hbmQoc2hlbGxfY29tbWFuZCkKKwljcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IKK0VuZCBTdWIKKworc3ViIG1haW4KKworU2VuZFNoZWxsQ29tbWFuZCgicm9vdCIpCitjcnQuU2xlZXAgMTAwCitTZW5kU2hlbGxDb21tYW5kKCJyb290IikKK2NydC5TbGVlcCAxMDAKK1NlbmRTaGVsbENvbW1hbmQoImNkIC9vcHQvYmNtNjg2MjAvIikKK2NydC5zY3JlZW4uV2FpdEZvclN0cmluZyAiIyIKK2NydC5TbGVlcCAxMDAKK1NlbmRTaGVsbENvbW1hbmQoIi4vc3ZrX2luaXQuc2giKQorY3J0LnNjcmVlbi5XYWl0Rm9yU3RyaW5nICI+IgorY3J0LlNsZWVwIDEwMDAKK2NydC5TY3JlZW4uU2VuZCBWYkNyCisKKworU2VuZFNoZWxsQ29tbWFuZCgiL2FwaS9zZXQgb2JqZWN0PWRldmljZSBzeXN0ZW1fbW9kZT14Z3NfXzJfeF8xMF9nIikKK2NydC5TY3JlZW4uU2VuZCBWYkNyCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LlNsZWVwIDUwCisnIHRoZSBmb2xsb3dpbmcgbGluZSBpcyBvbmx5IGlmIHlvdSB3b3VsZCBsaWtlIHRvIHNldCB0aGUga2VlcCBhbGl2ZSB2YWx1ZXMgCisnU2VuZFNoZWxsQ29tbWFuZCgiL2FwaS9zZXQgb2JqZWN0PWRldmljZSBzeXN0ZW1fbW9kZT14Z3NfXzJfeF8xMF9nIGtlZXBhbGl2ZV9pbnRlcnZhbD01IGtlZXBhbGl2ZV90b2xlcmFuY2U9MyIpCisnY3J0LlNsZWVwIDUwCisnY3J0LlNjcmVlbi5TZW5kIFZiQ3IKKydjcnQuU2NyZWVuLlNlbmQgVmJDcgorCisKK1NlbmRTaGVsbENvbW1hbmQoIi91c2VyL3JlZ2lzdGVyX2luZGljYXRpb25faGFuZGxlciIpCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKK2NydC5TbGVlcCA1MAorU2VuZFNoZWxsQ29tbWFuZCgiL3VzZXIvcmVnaXN0ZXJfcHJveHlfcnhfaGFuZGxlciAiKQorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKK2NydC5TY3JlZW4uU2VuZCBWYkNyCitjcnQuU2xlZXAgNTAKK2NydC5TY3JlZW4uU2VuZCBWYkNyCitTZW5kU2hlbGxDb21tYW5kKCIvYXBpL29wZXIgb2JqZWN0PWRldmljZSBzdWI9Y29ubmVjdCAiKQorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKK2NydC5zY3JlZW4uV2FpdEZvclN0cmluZyAiPiIKK2NydC5TY3JlZW4uU2VuZCBWYkNyCisKK2NydC5TbGVlcCA1MAorCisKKworCisKKworCisJCQorRW5kIFN1YgpkaWZmIC0tZ2l0IGEvZG9jcyBiL2RvY3MKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZmJjMDlhMAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MKQEAgLTAsMCArMSBAQAorYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2RvY3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==